summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authortpearson <tpearson@283d02a7-25f6-0310-bc7c-ecb5cbfe19da>2010-03-01 18:37:05 +0000
committertpearson <tpearson@283d02a7-25f6-0310-bc7c-ecb5cbfe19da>2010-03-01 18:37:05 +0000
commit145364a8af6a1fec06556221e66d4b724a62fc9a (patch)
tree53bd71a544008c518034f208d64c932dc2883f50
downloadrosegarden-145364a8af6a1fec06556221e66d4b724a62fc9a.tar.gz
rosegarden-145364a8af6a1fec06556221e66d4b724a62fc9a.zip
Added old abandoned KDE3 version of the RoseGarden MIDI tool
git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/applications/rosegarden@1097595 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
-rw-r--r--AUTHORS136
-rw-r--r--CMakeLists.txt396
-rw-r--r--COPYING280
-rw-r--r--Doxyfile1232
-rw-r--r--INSTALL189
-rw-r--r--README142
-rw-r--r--TRANSLATORS4
-rw-r--r--cmake_admin/FindKDECONFIG.cmake114
-rw-r--r--cmake_admin/FindLADSPA.cmake56
-rw-r--r--cmake_admin/FindLIRC.cmake64
-rw-r--r--cmake_admin/FindMEINPROC.cmake74
-rw-r--r--cmake_admin/FindMSGFMT.cmake68
-rw-r--r--cmake_admin/FindPCHSupport.cmake73
-rw-r--r--cmake_admin/FindPkgConfig.cmake383
-rw-r--r--cmake_admin/UserWarnings.cmake110
-rw-r--r--data/CMakeLists.txt125
-rw-r--r--data/chords/chords.xml1733
-rw-r--r--data/desktop/rosegarden.desktop13
-rw-r--r--data/desktop/x-rosegarden-device.desktop8
-rw-r--r--data/desktop/x-rosegarden.desktop9
-rw-r--r--data/desktop/x-rosegarden21.desktop8
-rw-r--r--data/desktop/x-soundfont.desktop8
-rw-r--r--data/examples/Djer-Fire.rgbin0 -> 28536 bytes
-rw-r--r--data/examples/autoload.rgbin0 -> 9691 bytes
-rw-r--r--data/examples/aveverum.rgbin0 -> 24457 bytes
-rw-r--r--data/examples/aylindaamiga.rgbin0 -> 11398 bytes
-rw-r--r--data/examples/bogus-surf-jam.rgbin0 -> 45661 bytes
-rw-r--r--data/examples/bwv-1060-trumpet-duet-excerpt.rgbin0 -> 27338 bytes
-rw-r--r--data/examples/children.rgbin0 -> 41045 bytes
-rw-r--r--data/examples/colourmap-fragment.xml420
-rw-r--r--data/examples/doodle-q.rgbin0 -> 6290 bytes
-rw-r--r--data/examples/exercise_notation.rgbin0 -> 4919 bytes
-rw-r--r--data/examples/glazunov-for-solo-and-piano-with-cue.rgbin0 -> 30214 bytes
-rw-r--r--data/examples/glazunov.rgbin0 -> 24282 bytes
-rw-r--r--data/examples/headers-and-unicode-lyrics.rgbin0 -> 10041 bytes
-rw-r--r--data/examples/himno_de_riego.rgbin0 -> 15447 bytes
-rw-r--r--data/examples/interpretation-example.rgbin0 -> 5612 bytes
-rw-r--r--data/examples/let-all-mortal-flesh.rgbin0 -> 15454 bytes
-rw-r--r--data/examples/lilypond-alternative-endings.rgbin0 -> 12832 bytes
-rw-r--r--data/examples/lilypond-directives.rgbin0 -> 10202 bytes
-rw-r--r--data/examples/lilypond-staff-groupings.rgbin0 -> 11548 bytes
-rw-r--r--data/examples/mandolin-sonatina.rgbin0 -> 17825 bytes
-rw-r--r--data/examples/mozart-quartet.rgbin0 -> 20459 bytes
-rw-r--r--data/examples/notation-for-string-orchestra-in-D-minor.rgbin0 -> 8310 bytes
-rw-r--r--data/examples/perfect-moment.rgbin0 -> 17439 bytes
-rw-r--r--data/examples/ravel-pc-gmaj-adagio.rgbin0 -> 32451 bytes
-rw-r--r--data/examples/rg-stats.xsl143
-rw-r--r--data/examples/sonataC.rose2606
-rw-r--r--data/examples/stormy-riders.rgbin0 -> 31205 bytes
-rw-r--r--data/examples/test_tuplets.rgbin0 -> 3220 bytes
-rw-r--r--data/examples/the-rose-garden.rgbin0 -> 42628 bytes
-rw-r--r--data/examples/vivaldi-cs3mv2.rgbin0 -> 14413 bytes
-rw-r--r--data/examples/vivaldi_op44_11_1.rgbin0 -> 35851 bytes
-rw-r--r--data/fonts/LilyPond-feta-design20.pfa1277
-rw-r--r--data/fonts/LilyPond-feta-nummer-design10.pfa299
-rw-r--r--data/fonts/LilyPond-parmesan-design20.pfa1322
-rw-r--r--data/fonts/README48
-rw-r--r--data/fonts/mappings/README15
-rw-r--r--data/fonts/mappings/feta.xml189
-rw-r--r--data/fonts/mappings/feta_pixmaps.xml226
-rw-r--r--data/fonts/mappings/fughetta.xml155
-rw-r--r--data/fonts/mappings/inkpen.xml154
-rw-r--r--data/fonts/mappings/maestro.xml154
-rw-r--r--data/fonts/mappings/opus.xml153
-rw-r--r--data/fonts/mappings/petrucci.xml158
-rw-r--r--data/fonts/mappings/rg21.xml102
-rw-r--r--data/fonts/mappings/sonata.xml147
-rw-r--r--data/fonts/mappings/steinberg.xml142
-rw-r--r--data/fonts/mappings/xinfonia.xml160
-rw-r--r--data/library/AccessVirus.rgdbin0 -> 1898 bytes
-rw-r--r--data/library/Alesis-QS6.rgdbin0 -> 5839 bytes
-rw-r--r--data/library/Alesis-QS7.rgdbin0 -> 8835 bytes
-rw-r--r--data/library/Alesis-QS7_QS8.rgdbin0 -> 6384 bytes
-rw-r--r--data/library/Alesis-S4Plus.rgdbin0 -> 6361 bytes
-rw-r--r--data/library/Alesis-SR16.rgdbin0 -> 1292 bytes
-rw-r--r--data/library/Behringer-V-Amp-Pro.rgdbin0 -> 2351 bytes
-rw-r--r--data/library/Boss-DR-660.rgdbin0 -> 4528 bytes
-rw-r--r--data/library/Casio-MT-540.rgdbin0 -> 1034 bytes
-rw-r--r--data/library/Casio-WK-3000.rgdbin0 -> 5768 bytes
-rw-r--r--data/library/Chaos12m.rgdbin0 -> 2150 bytes
-rw-r--r--data/library/Creative-SBLive8MB.rgdbin0 -> 1811 bytes
-rw-r--r--data/library/Emu-Proteus-2000.rgdbin0 -> 9903 bytes
-rw-r--r--data/library/Emu-Proteus-FX.rgdbin0 -> 4385 bytes
-rw-r--r--data/library/Ensoniq-MR76.rgdbin0 -> 6787 bytes
-rw-r--r--data/library/GM.rgdbin0 -> 2252 bytes
-rw-r--r--data/library/GM2.rgdbin0 -> 5532 bytes
-rw-r--r--data/library/GS.rgdbin0 -> 2489 bytes
-rw-r--r--data/library/Hammond-XM1.rgdbin0 -> 1637 bytes
-rw-r--r--data/library/Juno-G.rgdbin0 -> 8658 bytes
-rw-r--r--data/library/Kawai-ES-3.rgdbin0 -> 909 bytes
-rw-r--r--data/library/Korg-03rw.rgdbin0 -> 3470 bytes
-rw-r--r--data/library/Korg-KARMA.rgdbin0 -> 6288 bytes
-rw-r--r--data/library/Korg-NS5R.rgdbin0 -> 5341 bytes
-rw-r--r--data/library/Korg-Radias-Factory.rgdbin0 -> 3950 bytes
-rw-r--r--data/library/Korg-Trinity-DRS.rgdbin0 -> 2939 bytes
-rw-r--r--data/library/Korg-Triton-Extreme-Combi.rgdbin0 -> 32097 bytes
-rw-r--r--data/library/Korg-Triton-Extreme-Prog.rgdbin0 -> 30942 bytes
-rw-r--r--data/library/Korg-Wavestation.rgdbin0 -> 3449 bytes
-rw-r--r--data/library/Korg-X3.rgdbin0 -> 3756 bytes
-rw-r--r--data/library/Korg-X50_GM.rgdbin0 -> 6972 bytes
-rw-r--r--data/library/Korg-X50_Korg.rgdbin0 -> 6329 bytes
-rw-r--r--data/library/Korg-microKORG.rgdbin0 -> 3822 bytes
-rw-r--r--data/library/Korg-microX.rgdbin0 -> 7772 bytes
-rw-r--r--data/library/Korg-x5dr.rgdbin0 -> 2961 bytes
-rw-r--r--data/library/Kurzweil-ME1.rgdbin0 -> 3350 bytes
-rw-r--r--data/library/Lexicon-PCM-91-internal-presets.rgdbin0 -> 4775 bytes
-rw-r--r--data/library/Line6-PodXTLive.rgdbin0 -> 2209 bytes
-rw-r--r--data/library/Native-Instruments-B4.rgdbin0 -> 2054 bytes
-rw-r--r--data/library/Novation-A-Station.rgdbin0 -> 2595 bytes
-rw-r--r--data/library/Novation-D-Station.rgdbin0 -> 1185 bytes
-rw-r--r--data/library/Novation-KS-4-5-Rack.rgdbin0 -> 7877 bytes
-rw-r--r--data/library/Novation-XioSynth.rgdbin0 -> 2845 bytes
-rw-r--r--data/library/Oberheim-Matrix-1000.rgdbin0 -> 8012 bytes
-rw-r--r--data/library/PC51f_sf2.rgdbin0 -> 2227 bytes
-rw-r--r--data/library/Peavey-Spectrum-Bass.rgdbin0 -> 2200 bytes
-rw-r--r--data/library/PodXTLive.rgdbin0 -> 2209 bytes
-rw-r--r--data/library/Roland-D-50-v2.rgdbin0 -> 1960 bytes
-rw-r--r--data/library/Roland-D-50.rgdbin0 -> 1857 bytes
-rw-r--r--data/library/Roland-E-09.rgdbin0 -> 3848 bytes
-rw-r--r--data/library/Roland-E-09_addons.rgdbin0 -> 3717 bytes
-rw-r--r--data/library/Roland-EM-20.rgdbin0 -> 5979 bytes
-rw-r--r--data/library/Roland-Fantom-S.rgdbin0 -> 8370 bytes
-rw-r--r--data/library/Roland-Fantom-S88.rgdbin0 -> 8471 bytes
-rw-r--r--data/library/Roland-Fantom-X.rgdbin0 -> 14615 bytes
-rw-r--r--data/library/Roland-Fantom-XA.rgdbin0 -> 14514 bytes
-rw-r--r--data/library/Roland-Fantom-XR-addon-SRX-02.rgdbin0 -> 732 bytes
-rw-r--r--data/library/Roland-Fantom-XR-addon-SRX-06.rgdbin0 -> 4349 bytes
-rw-r--r--data/library/Roland-Fantom-XR-addon-SRX-09.rgdbin0 -> 4332 bytes
-rw-r--r--data/library/Roland-Fantom-XR.rgdbin0 -> 11987 bytes
-rw-r--r--data/library/Roland-GR-30.rgdbin0 -> 3278 bytes
-rw-r--r--data/library/Roland-GR-33.rgdbin0 -> 2287 bytes
-rw-r--r--data/library/Roland-JD-800.rgdbin0 -> 7306 bytes
-rw-r--r--data/library/Roland-JV-1010.rgdbin0 -> 9352 bytes
-rw-r--r--data/library/Roland-JV-1080.rgdbin0 -> 5962 bytes
-rw-r--r--data/library/Roland-JV-2080.rgdbin0 -> 7642 bytes
-rw-r--r--data/library/Roland-JV-80.rgdbin0 -> 4435 bytes
-rw-r--r--data/library/Roland-JX-305.rgdbin0 -> 11780 bytes
-rw-r--r--data/library/Roland-Juno106.rgdbin0 -> 2278 bytes
-rw-r--r--data/library/Roland-KR-570.rgdbin0 -> 2006 bytes
-rw-r--r--data/library/Roland-MC-303.rgdbin0 -> 3873 bytes
-rw-r--r--data/library/Roland-MVS-1.rgdbin0 -> 2642 bytes
-rw-r--r--data/library/Roland-RD-600.rgdbin0 -> 1818 bytes
-rw-r--r--data/library/Roland-RD-700SX.rgdbin0 -> 3506 bytes
-rw-r--r--data/library/Roland-RS-9.rgdbin0 -> 6151 bytes
-rw-r--r--data/library/Roland-SC-33.rgdbin0 -> 2847 bytes
-rw-r--r--data/library/Roland-SC-88.rgdbin0 -> 11530 bytes
-rw-r--r--data/library/Roland-SC-8820.rgdbin0 -> 12889 bytes
-rw-r--r--data/library/Roland-SR-JV80-01.rgdbin0 -> 1681 bytes
-rw-r--r--data/library/Roland-SR-JV80-02.rgdbin0 -> 2244 bytes
-rw-r--r--data/library/Roland-SR-JV80-03.rgdbin0 -> 1129 bytes
-rw-r--r--data/library/Roland-SR-JV80-04.rgdbin0 -> 2739 bytes
-rw-r--r--data/library/Roland-SR-JV80-05.rgdbin0 -> 2690 bytes
-rw-r--r--data/library/Roland-SR-JV80-08.rgdbin0 -> 2625 bytes
-rw-r--r--data/library/Roland-SR-JV80-09.rgdbin0 -> 2751 bytes
-rw-r--r--data/library/Roland-SR-JV80-11.rgdbin0 -> 3263 bytes
-rw-r--r--data/library/Roland-SR-JV80-14.rgdbin0 -> 2573 bytes
-rw-r--r--data/library/Roland-SR-JV80-15.rgdbin0 -> 2838 bytes
-rw-r--r--data/library/Roland-SR-JV80-17.rgdbin0 -> 2479 bytes
-rw-r--r--data/library/Roland-TD-8.rgdbin0 -> 2303 bytes
-rw-r--r--data/library/Roland-XP30.rgdbin0 -> 13407 bytes
-rw-r--r--data/library/Roland-XV-2020.rgdbin0 -> 9408 bytes
-rw-r--r--data/library/Roland-XV-88.rgdbin0 -> 11812 bytes
-rw-r--r--data/library/Sirius.rgdbin0 -> 4156 bytes
-rw-r--r--data/library/Technics-KN901.rgdbin0 -> 2621 bytes
-rw-r--r--data/library/XG-Rhythmn-Kits-and-Mappings.rgdbin0 -> 3334 bytes
-rw-r--r--data/library/XG.rgdbin0 -> 5334 bytes
-rw-r--r--data/library/Yamaha-CS1x.rgdbin0 -> 12264 bytes
-rw-r--r--data/library/Yamaha-CS2x.rgdbin0 -> 6429 bytes
-rw-r--r--data/library/Yamaha-DGX200.rgdbin0 -> 5584 bytes
-rw-r--r--data/library/Yamaha-DGX500-300.rgdbin0 -> 7450 bytes
-rw-r--r--data/library/Yamaha-DGX505-305.rgdbin0 -> 6509 bytes
-rw-r--r--data/library/Yamaha-DX200.rgdbin0 -> 4943 bytes
-rw-r--r--data/library/Yamaha-MU90R.rgdbin0 -> 7000 bytes
-rw-r--r--data/library/Yamaha-Motif-6-7-8.rgdbin0 -> 7744 bytes
-rw-r--r--data/library/Yamaha-Motif-ES.rgdbin0 -> 14975 bytes
-rw-r--r--data/library/Yamaha-Motif-Rack.rgdbin0 -> 7116 bytes
-rw-r--r--data/library/Yamaha-P60.rgdbin0 -> 1405 bytes
-rw-r--r--data/library/Yamaha-P90.rgdbin0 -> 1068 bytes
-rw-r--r--data/library/Yamaha-PSR-E403.rgdbin0 -> 4900 bytes
-rw-r--r--data/library/Yamaha-PSR270.rgdbin0 -> 2228 bytes
-rw-r--r--data/library/Yamaha-PSR280.rgdbin0 -> 2450 bytes
-rw-r--r--data/library/Yamaha-PSR290.rgdbin0 -> 1873 bytes
-rw-r--r--data/library/Yamaha-PSR403.rgdbin0 -> 5982 bytes
-rw-r--r--data/library/Yamaha-PSR550.rgdbin0 -> 6049 bytes
-rw-r--r--data/library/Yamaha-QY70.rgdbin0 -> 4383 bytes
-rw-r--r--data/library/Yamaha-RM1X.rgdbin0 -> 6483 bytes
-rw-r--r--data/library/Yamaha-S08.rgdbin0 -> 7928 bytes
-rw-r--r--data/library/Yamaha-S80.rgdbin0 -> 2505 bytes
-rw-r--r--data/library/Yamaha-S90.rgdbin0 -> 5446 bytes
-rw-r--r--data/library/Yamaha-TG500-mlt.rgdbin0 -> 2907 bytes
-rw-r--r--data/library/Yamaha-VL70-m.rgdbin0 -> 2953 bytes
-rw-r--r--data/library/Zoom-RT-323.rgdbin0 -> 1625 bytes
-rw-r--r--data/library/all-numbers.rgdbin0 -> 7127 bytes
-rw-r--r--data/library/raw-numbers.rgdbin0 -> 1196 bytes
-rw-r--r--data/pixmaps/feta/10/accidentals-(.xpm35
-rw-r--r--data/pixmaps/feta/10/accidentals-).xpm35
-rw-r--r--data/pixmaps/feta/10/accidentals--1.xpm41
-rw-r--r--data/pixmaps/feta/10/accidentals--2.xpm41
-rw-r--r--data/pixmaps/feta/10/accidentals-0.xpm45
-rw-r--r--data/pixmaps/feta/10/accidentals-1.xpm45
-rw-r--r--data/pixmaps/feta/10/accidentals-2.xpm25
-rw-r--r--data/pixmaps/feta/10/accordion-accBB.xpm0
-rw-r--r--data/pixmaps/feta/10/accordion-accBayanbase.xpm0
-rw-r--r--data/pixmaps/feta/10/accordion-accDiscant.xpm0
-rw-r--r--data/pixmaps/feta/10/accordion-accDot.xpm0
-rw-r--r--data/pixmaps/feta/10/accordion-accFreebase.xpm0
-rw-r--r--data/pixmaps/feta/10/accordion-accOldEE.xpm0
-rw-r--r--data/pixmaps/feta/10/accordion-accOldEES.xpm0
-rw-r--r--data/pixmaps/feta/10/accordion-accSB.xpm0
-rw-r--r--data/pixmaps/feta/10/accordion-accStdbase.xpm0
-rw-r--r--data/pixmaps/feta/10/clefs-C.xpm54
-rw-r--r--data/pixmaps/feta/10/clefs-C_change.xpm46
-rw-r--r--data/pixmaps/feta/10/clefs-F.xpm47
-rw-r--r--data/pixmaps/feta/10/clefs-F_change.xpm41
-rw-r--r--data/pixmaps/feta/10/clefs-G.xpm89
-rw-r--r--data/pixmaps/feta/10/clefs-G_change.xpm75
-rw-r--r--data/pixmaps/feta/10/clefs-hufnagel_do.xpm29
-rw-r--r--data/pixmaps/feta/10/clefs-hufnagel_do_change.xpm27
-rw-r--r--data/pixmaps/feta/10/clefs-hufnagel_do_fa.xpm54
-rw-r--r--data/pixmaps/feta/10/clefs-hufnagel_do_fa_change.xpm51
-rw-r--r--data/pixmaps/feta/10/clefs-hufnagel_fa.xpm38
-rw-r--r--data/pixmaps/feta/10/clefs-hufnagel_fa_change.xpm34
-rw-r--r--data/pixmaps/feta/10/clefs-medicaea_do.xpm45
-rw-r--r--data/pixmaps/feta/10/clefs-medicaea_do_change.xpm39
-rw-r--r--data/pixmaps/feta/10/clefs-medicaea_fa.xpm45
-rw-r--r--data/pixmaps/feta/10/clefs-medicaea_fa_change.xpm39
-rw-r--r--data/pixmaps/feta/10/clefs-mensural1_c.xpm52
-rw-r--r--data/pixmaps/feta/10/clefs-mensural1_c_change.xpm46
-rw-r--r--data/pixmaps/feta/10/clefs-mensural1_f.xpm70
-rw-r--r--data/pixmaps/feta/10/clefs-mensural1_f_change.xpm60
-rw-r--r--data/pixmaps/feta/10/clefs-mensural2_c.xpm51
-rw-r--r--data/pixmaps/feta/10/clefs-mensural2_c_change.xpm47
-rw-r--r--data/pixmaps/feta/10/clefs-mensural2_f.xpm30
-rw-r--r--data/pixmaps/feta/10/clefs-mensural2_f_change.xpm29
-rw-r--r--data/pixmaps/feta/10/clefs-mensural3_c.xpm62
-rw-r--r--data/pixmaps/feta/10/clefs-mensural3_c_change.xpm57
-rw-r--r--data/pixmaps/feta/10/clefs-mensural_g.xpm38
-rw-r--r--data/pixmaps/feta/10/clefs-mensural_g_change.xpm34
-rw-r--r--data/pixmaps/feta/10/clefs-percussion.xpm34
-rw-r--r--data/pixmaps/feta/10/clefs-percussion_change.xpm28
-rw-r--r--data/pixmaps/feta/10/clefs-tab.xpm61
-rw-r--r--data/pixmaps/feta/10/clefs-tab_change.xpm52
-rw-r--r--data/pixmaps/feta/10/clefs-vaticana_do.xpm29
-rw-r--r--data/pixmaps/feta/10/clefs-vaticana_do_change.xpm29
-rw-r--r--data/pixmaps/feta/10/clefs-vaticana_fa.xpm38
-rw-r--r--data/pixmaps/feta/10/clefs-vaticana_fa_change.xpm38
-rw-r--r--data/pixmaps/feta/10/custodes-hufnagel.xpm0
-rw-r--r--data/pixmaps/feta/10/custodes-medicaea.xpm0
-rw-r--r--data/pixmaps/feta/10/custodes-mensural.xpm0
-rw-r--r--data/pixmaps/feta/10/custodes-rhufnagel.xpm0
-rw-r--r--data/pixmaps/feta/10/custodes-rmedicaea.xpm0
-rw-r--r--data/pixmaps/feta/10/custodes-rmensural.xpm0
-rw-r--r--data/pixmaps/feta/10/custodes-rvaticana.xpm0
-rw-r--r--data/pixmaps/feta/10/custodes-vaticana.xpm0
-rw-r--r--data/pixmaps/feta/10/dots-dot.xpm18
-rw-r--r--data/pixmaps/feta/10/dots-evenrepeatcolon.xpm37
-rw-r--r--data/pixmaps/feta/10/dots-repeatcolon.xpm29
-rw-r--r--data/pixmaps/feta/10/flags-d3.xpm44
-rw-r--r--data/pixmaps/feta/10/flags-d4.xpm45
-rw-r--r--data/pixmaps/feta/10/flags-d5.xpm53
-rw-r--r--data/pixmaps/feta/10/flags-d6.xpm58
-rw-r--r--data/pixmaps/feta/10/flags-dgrace.xpm27
-rw-r--r--data/pixmaps/feta/10/flags-dstem.xpm43
-rw-r--r--data/pixmaps/feta/10/flags-stem.xpm43
-rw-r--r--data/pixmaps/feta/10/flags-u3.xpm45
-rw-r--r--data/pixmaps/feta/10/flags-u4.xpm50
-rw-r--r--data/pixmaps/feta/10/flags-u5.xpm57
-rw-r--r--data/pixmaps/feta/10/flags-u6.xpm67
-rw-r--r--data/pixmaps/feta/10/flags-ugrace.xpm28
-rw-r--r--data/pixmaps/feta/10/noteheads--1.xpm26
-rw-r--r--data/pixmaps/feta/10/noteheads--1mensural.xpm31
-rw-r--r--data/pixmaps/feta/10/noteheads--2mensural.xpm40
-rw-r--r--data/pixmaps/feta/10/noteheads--3mensural.xpm40
-rw-r--r--data/pixmaps/feta/10/noteheads-0.xpm26
-rw-r--r--data/pixmaps/feta/10/noteheads-0cross.xpm27
-rw-r--r--data/pixmaps/feta/10/noteheads-0diamond.xpm26
-rw-r--r--data/pixmaps/feta/10/noteheads-0mensural.xpm24
-rw-r--r--data/pixmaps/feta/10/noteheads-0slash.xpm34
-rw-r--r--data/pixmaps/feta/10/noteheads-0triangle.xpm25
-rw-r--r--data/pixmaps/feta/10/noteheads-1.xpm27
-rw-r--r--data/pixmaps/feta/10/noteheads-1cross.xpm27
-rw-r--r--data/pixmaps/feta/10/noteheads-1diamond.xpm27
-rw-r--r--data/pixmaps/feta/10/noteheads-1mensural.xpm24
-rw-r--r--data/pixmaps/feta/10/noteheads-1slash.xpm34
-rw-r--r--data/pixmaps/feta/10/noteheads-1triangle.xpm25
-rw-r--r--data/pixmaps/feta/10/noteheads-2.xpm25
-rw-r--r--data/pixmaps/feta/10/noteheads-2cross.xpm25
-rw-r--r--data/pixmaps/feta/10/noteheads-2diamond.xpm27
-rw-r--r--data/pixmaps/feta/10/noteheads-2mensural.xpm23
-rw-r--r--data/pixmaps/feta/10/noteheads-2slash.xpm35
-rw-r--r--data/pixmaps/feta/10/noteheads-2triangle.xpm25
-rw-r--r--data/pixmaps/feta/10/noteheads-2xcircle.xpm25
-rw-r--r--data/pixmaps/feta/10/noteheads-ledgerending.xpm14
-rw-r--r--data/pixmaps/feta/10/rests--1.xpm22
-rw-r--r--data/pixmaps/feta/10/rests--1o.xpm22
-rw-r--r--data/pixmaps/feta/10/rests--2.xpm32
-rw-r--r--data/pixmaps/feta/10/rests--4.xpm33
-rw-r--r--data/pixmaps/feta/10/rests-0.xpm19
-rw-r--r--data/pixmaps/feta/10/rests-0o.xpm22
-rw-r--r--data/pixmaps/feta/10/rests-1.xpm19
-rw-r--r--data/pixmaps/feta/10/rests-1o.xpm22
-rw-r--r--data/pixmaps/feta/10/rests-2.xpm43
-rw-r--r--data/pixmaps/feta/10/rests-2mensural.xpm22
-rw-r--r--data/pixmaps/feta/10/rests-3.xpm33
-rw-r--r--data/pixmaps/feta/10/rests-3mensural.xpm22
-rw-r--r--data/pixmaps/feta/10/rests-4.xpm43
-rw-r--r--data/pixmaps/feta/10/rests-4mensural.xpm25
-rw-r--r--data/pixmaps/feta/10/rests-5.xpm52
-rw-r--r--data/pixmaps/feta/10/rests-6.xpm62
-rw-r--r--data/pixmaps/feta/10/rests-7.xpm71
-rw-r--r--data/pixmaps/feta/10/scripts-arpeggio.xpm29
-rw-r--r--data/pixmaps/feta/10/scripts-coda.xpm42
-rw-r--r--data/pixmaps/feta/10/scripts-dfermata.xpm29
-rw-r--r--data/pixmaps/feta/10/scripts-dmarcato.xpm25
-rw-r--r--data/pixmaps/feta/10/scripts-downbow.xpm27
-rw-r--r--data/pixmaps/feta/10/scripts-downmordent.xpm31
-rw-r--r--data/pixmaps/feta/10/scripts-downprall.xpm29
-rw-r--r--data/pixmaps/feta/10/scripts-dpedalheel.xpm25
-rw-r--r--data/pixmaps/feta/10/scripts-dpedaltoe.xpm30
-rw-r--r--data/pixmaps/feta/10/scripts-dstaccatissimo.xpm24
-rw-r--r--data/pixmaps/feta/10/scripts-flageolet.xpm22
-rw-r--r--data/pixmaps/feta/10/scripts-lcomma.xpm27
-rw-r--r--data/pixmaps/feta/10/scripts-lineprall.xpm41
-rw-r--r--data/pixmaps/feta/10/scripts-mordent.xpm29
-rw-r--r--data/pixmaps/feta/10/scripts-open.xpm25
-rw-r--r--data/pixmaps/feta/10/scripts-prall.xpm26
-rw-r--r--data/pixmaps/feta/10/scripts-pralldown.xpm31
-rw-r--r--data/pixmaps/feta/10/scripts-prallmordent.xpm29
-rw-r--r--data/pixmaps/feta/10/scripts-prallprall.xpm26
-rw-r--r--data/pixmaps/feta/10/scripts-prallup.xpm29
-rw-r--r--data/pixmaps/feta/10/scripts-rcomma.xpm27
-rw-r--r--data/pixmaps/feta/10/scripts-reverseturn.xpm26
-rw-r--r--data/pixmaps/feta/10/scripts-segno.xpm45
-rw-r--r--data/pixmaps/feta/10/scripts-sforzato.xpm26
-rw-r--r--data/pixmaps/feta/10/scripts-staccato.xpm17
-rw-r--r--data/pixmaps/feta/10/scripts-stopped.xpm22
-rw-r--r--data/pixmaps/feta/10/scripts-tenuto.xpm13
-rw-r--r--data/pixmaps/feta/10/scripts-thumb.xpm29
-rw-r--r--data/pixmaps/feta/10/scripts-trilelement.xpm26
-rw-r--r--data/pixmaps/feta/10/scripts-trill-element.xpm24
-rw-r--r--data/pixmaps/feta/10/scripts-trill.xpm38
-rw-r--r--data/pixmaps/feta/10/scripts-turn.xpm26
-rw-r--r--data/pixmaps/feta/10/scripts-ufermata.xpm29
-rw-r--r--data/pixmaps/feta/10/scripts-umarcato.xpm25
-rw-r--r--data/pixmaps/feta/10/scripts-upbow.xpm34
-rw-r--r--data/pixmaps/feta/10/scripts-upedalheel.xpm25
-rw-r--r--data/pixmaps/feta/10/scripts-upedaltoe.xpm30
-rw-r--r--data/pixmaps/feta/10/scripts-upmordent.xpm33
-rw-r--r--data/pixmaps/feta/10/scripts-upprall.xpm31
-rw-r--r--data/pixmaps/feta/10/scripts-ustaccatissimo.xpm24
-rw-r--r--data/pixmaps/feta/10/unknown.xpm16
-rw-r--r--data/pixmaps/feta/12/accidentals-(.xpm40
-rw-r--r--data/pixmaps/feta/12/accidentals-).xpm40
-rw-r--r--data/pixmaps/feta/12/accidentals--1.xpm46
-rw-r--r--data/pixmaps/feta/12/accidentals--2.xpm46
-rw-r--r--data/pixmaps/feta/12/accidentals-0.xpm49
-rw-r--r--data/pixmaps/feta/12/accidentals-1.xpm51
-rw-r--r--data/pixmaps/feta/12/accidentals-2.xpm25
-rw-r--r--data/pixmaps/feta/12/accordion-accBB.xpm0
-rw-r--r--data/pixmaps/feta/12/accordion-accBayanbase.xpm0
-rw-r--r--data/pixmaps/feta/12/accordion-accDiscant.xpm0
-rw-r--r--data/pixmaps/feta/12/accordion-accDot.xpm0
-rw-r--r--data/pixmaps/feta/12/accordion-accFreebase.xpm0
-rw-r--r--data/pixmaps/feta/12/accordion-accOldEE.xpm0
-rw-r--r--data/pixmaps/feta/12/accordion-accOldEES.xpm0
-rw-r--r--data/pixmaps/feta/12/accordion-accSB.xpm0
-rw-r--r--data/pixmaps/feta/12/accordion-accStdbase.xpm0
-rw-r--r--data/pixmaps/feta/12/clefs-C.xpm62
-rw-r--r--data/pixmaps/feta/12/clefs-C_change.xpm53
-rw-r--r--data/pixmaps/feta/12/clefs-F.xpm53
-rw-r--r--data/pixmaps/feta/12/clefs-F_change.xpm46
-rw-r--r--data/pixmaps/feta/12/clefs-G.xpm104
-rw-r--r--data/pixmaps/feta/12/clefs-G_change.xpm86
-rw-r--r--data/pixmaps/feta/12/clefs-hufnagel_do.xpm33
-rw-r--r--data/pixmaps/feta/12/clefs-hufnagel_do_change.xpm29
-rw-r--r--data/pixmaps/feta/12/clefs-hufnagel_do_fa.xpm62
-rw-r--r--data/pixmaps/feta/12/clefs-hufnagel_do_fa_change.xpm57
-rw-r--r--data/pixmaps/feta/12/clefs-hufnagel_fa.xpm43
-rw-r--r--data/pixmaps/feta/12/clefs-hufnagel_fa_change.xpm37
-rw-r--r--data/pixmaps/feta/12/clefs-medicaea_do.xpm51
-rw-r--r--data/pixmaps/feta/12/clefs-medicaea_do_change.xpm44
-rw-r--r--data/pixmaps/feta/12/clefs-medicaea_fa.xpm51
-rw-r--r--data/pixmaps/feta/12/clefs-medicaea_fa_change.xpm44
-rw-r--r--data/pixmaps/feta/12/clefs-mensural1_c.xpm60
-rw-r--r--data/pixmaps/feta/12/clefs-mensural1_c_change.xpm51
-rw-r--r--data/pixmaps/feta/12/clefs-mensural1_f.xpm81
-rw-r--r--data/pixmaps/feta/12/clefs-mensural1_f_change.xpm69
-rw-r--r--data/pixmaps/feta/12/clefs-mensural2_c.xpm61
-rw-r--r--data/pixmaps/feta/12/clefs-mensural2_c_change.xpm54
-rw-r--r--data/pixmaps/feta/12/clefs-mensural2_f.xpm33
-rw-r--r--data/pixmaps/feta/12/clefs-mensural2_f_change.xpm32
-rw-r--r--data/pixmaps/feta/12/clefs-mensural3_c.xpm73
-rw-r--r--data/pixmaps/feta/12/clefs-mensural3_c_change.xpm66
-rw-r--r--data/pixmaps/feta/12/clefs-mensural_g.xpm42
-rw-r--r--data/pixmaps/feta/12/clefs-mensural_g_change.xpm37
-rw-r--r--data/pixmaps/feta/12/clefs-percussion.xpm37
-rw-r--r--data/pixmaps/feta/12/clefs-percussion_change.xpm32
-rw-r--r--data/pixmaps/feta/12/clefs-tab.xpm70
-rw-r--r--data/pixmaps/feta/12/clefs-tab_change.xpm59
-rw-r--r--data/pixmaps/feta/12/clefs-vaticana_do.xpm35
-rw-r--r--data/pixmaps/feta/12/clefs-vaticana_do_change.xpm35
-rw-r--r--data/pixmaps/feta/12/clefs-vaticana_fa.xpm43
-rw-r--r--data/pixmaps/feta/12/clefs-vaticana_fa_change.xpm43
-rw-r--r--data/pixmaps/feta/12/custodes-hufnagel.xpm0
-rw-r--r--data/pixmaps/feta/12/custodes-medicaea.xpm0
-rw-r--r--data/pixmaps/feta/12/custodes-mensural.xpm0
-rw-r--r--data/pixmaps/feta/12/custodes-rhufnagel.xpm0
-rw-r--r--data/pixmaps/feta/12/custodes-rmedicaea.xpm0
-rw-r--r--data/pixmaps/feta/12/custodes-rmensural.xpm0
-rw-r--r--data/pixmaps/feta/12/custodes-rvaticana.xpm0
-rw-r--r--data/pixmaps/feta/12/custodes-vaticana.xpm0
-rw-r--r--data/pixmaps/feta/12/dots-dot.xpm18
-rw-r--r--data/pixmaps/feta/12/dots-evenrepeatcolon.xpm43
-rw-r--r--data/pixmaps/feta/12/dots-repeatcolon.xpm31
-rw-r--r--data/pixmaps/feta/12/flags-d3.xpm49
-rw-r--r--data/pixmaps/feta/12/flags-d4.xpm51
-rw-r--r--data/pixmaps/feta/12/flags-d5.xpm61
-rw-r--r--data/pixmaps/feta/12/flags-d6.xpm67
-rw-r--r--data/pixmaps/feta/12/flags-dgrace.xpm29
-rw-r--r--data/pixmaps/feta/12/flags-dstem.xpm49
-rw-r--r--data/pixmaps/feta/12/flags-stem.xpm49
-rw-r--r--data/pixmaps/feta/12/flags-u3.xpm51
-rw-r--r--data/pixmaps/feta/12/flags-u4.xpm57
-rw-r--r--data/pixmaps/feta/12/flags-u5.xpm65
-rw-r--r--data/pixmaps/feta/12/flags-u6.xpm77
-rw-r--r--data/pixmaps/feta/12/flags-ugrace.xpm30
-rw-r--r--data/pixmaps/feta/12/noteheads--1.xpm29
-rw-r--r--data/pixmaps/feta/12/noteheads--1mensural.xpm31
-rw-r--r--data/pixmaps/feta/12/noteheads--2mensural.xpm45
-rw-r--r--data/pixmaps/feta/12/noteheads--3mensural.xpm45
-rw-r--r--data/pixmaps/feta/12/noteheads-0.xpm29
-rw-r--r--data/pixmaps/feta/12/noteheads-0cross.xpm30
-rw-r--r--data/pixmaps/feta/12/noteheads-0diamond.xpm29
-rw-r--r--data/pixmaps/feta/12/noteheads-0mensural.xpm28
-rw-r--r--data/pixmaps/feta/12/noteheads-0slash.xpm39
-rw-r--r--data/pixmaps/feta/12/noteheads-0triangle.xpm27
-rw-r--r--data/pixmaps/feta/12/noteheads-1.xpm28
-rw-r--r--data/pixmaps/feta/12/noteheads-1cross.xpm29
-rw-r--r--data/pixmaps/feta/12/noteheads-1diamond.xpm29
-rw-r--r--data/pixmaps/feta/12/noteheads-1mensural.xpm28
-rw-r--r--data/pixmaps/feta/12/noteheads-1slash.xpm38
-rw-r--r--data/pixmaps/feta/12/noteheads-1triangle.xpm27
-rw-r--r--data/pixmaps/feta/12/noteheads-2.xpm26
-rw-r--r--data/pixmaps/feta/12/noteheads-2cross.xpm28
-rw-r--r--data/pixmaps/feta/12/noteheads-2diamond.xpm28
-rw-r--r--data/pixmaps/feta/12/noteheads-2mensural.xpm27
-rw-r--r--data/pixmaps/feta/12/noteheads-2slash.xpm38
-rw-r--r--data/pixmaps/feta/12/noteheads-2triangle.xpm27
-rw-r--r--data/pixmaps/feta/12/noteheads-2xcircle.xpm29
-rw-r--r--data/pixmaps/feta/12/noteheads-ledgerending.xpm14
-rw-r--r--data/pixmaps/feta/12/rests--1.xpm24
-rw-r--r--data/pixmaps/feta/12/rests--1o.xpm26
-rw-r--r--data/pixmaps/feta/12/rests--2.xpm36
-rw-r--r--data/pixmaps/feta/12/rests--4.xpm35
-rw-r--r--data/pixmaps/feta/12/rests-0.xpm20
-rw-r--r--data/pixmaps/feta/12/rests-0o.xpm23
-rw-r--r--data/pixmaps/feta/12/rests-1.xpm20
-rw-r--r--data/pixmaps/feta/12/rests-1o.xpm22
-rw-r--r--data/pixmaps/feta/12/rests-2.xpm49
-rw-r--r--data/pixmaps/feta/12/rests-2mensural.xpm23
-rw-r--r--data/pixmaps/feta/12/rests-3.xpm37
-rw-r--r--data/pixmaps/feta/12/rests-3mensural.xpm25
-rw-r--r--data/pixmaps/feta/12/rests-4.xpm48
-rw-r--r--data/pixmaps/feta/12/rests-4mensural.xpm27
-rw-r--r--data/pixmaps/feta/12/rests-5.xpm60
-rw-r--r--data/pixmaps/feta/12/rests-6.xpm71
-rw-r--r--data/pixmaps/feta/12/rests-7.xpm82
-rw-r--r--data/pixmaps/feta/12/scripts-arpeggio.xpm32
-rw-r--r--data/pixmaps/feta/12/scripts-coda.xpm48
-rw-r--r--data/pixmaps/feta/12/scripts-dfermata.xpm33
-rw-r--r--data/pixmaps/feta/12/scripts-dmarcato.xpm28
-rw-r--r--data/pixmaps/feta/12/scripts-downbow.xpm29
-rw-r--r--data/pixmaps/feta/12/scripts-downmordent.xpm33
-rw-r--r--data/pixmaps/feta/12/scripts-downprall.xpm31
-rw-r--r--data/pixmaps/feta/12/scripts-dpedalheel.xpm26
-rw-r--r--data/pixmaps/feta/12/scripts-dpedaltoe.xpm32
-rw-r--r--data/pixmaps/feta/12/scripts-dstaccatissimo.xpm27
-rw-r--r--data/pixmaps/feta/12/scripts-flageolet.xpm23
-rw-r--r--data/pixmaps/feta/12/scripts-lcomma.xpm30
-rw-r--r--data/pixmaps/feta/12/scripts-lineprall.xpm45
-rw-r--r--data/pixmaps/feta/12/scripts-mordent.xpm31
-rw-r--r--data/pixmaps/feta/12/scripts-open.xpm25
-rw-r--r--data/pixmaps/feta/12/scripts-prall.xpm27
-rw-r--r--data/pixmaps/feta/12/scripts-pralldown.xpm34
-rw-r--r--data/pixmaps/feta/12/scripts-prallmordent.xpm31
-rw-r--r--data/pixmaps/feta/12/scripts-prallprall.xpm26
-rw-r--r--data/pixmaps/feta/12/scripts-prallup.xpm31
-rw-r--r--data/pixmaps/feta/12/scripts-rcomma.xpm30
-rw-r--r--data/pixmaps/feta/12/scripts-reverseturn.xpm28
-rw-r--r--data/pixmaps/feta/12/scripts-segno.xpm50
-rw-r--r--data/pixmaps/feta/12/scripts-sforzato.xpm26
-rw-r--r--data/pixmaps/feta/12/scripts-staccato.xpm14
-rw-r--r--data/pixmaps/feta/12/scripts-stopped.xpm28
-rw-r--r--data/pixmaps/feta/12/scripts-tenuto.xpm12
-rw-r--r--data/pixmaps/feta/12/scripts-thumb.xpm28
-rw-r--r--data/pixmaps/feta/12/scripts-trilelement.xpm26
-rw-r--r--data/pixmaps/feta/12/scripts-trill-element.xpm25
-rw-r--r--data/pixmaps/feta/12/scripts-trill.xpm43
-rw-r--r--data/pixmaps/feta/12/scripts-turn.xpm28
-rw-r--r--data/pixmaps/feta/12/scripts-ufermata.xpm33
-rw-r--r--data/pixmaps/feta/12/scripts-umarcato.xpm28
-rw-r--r--data/pixmaps/feta/12/scripts-upbow.xpm39
-rw-r--r--data/pixmaps/feta/12/scripts-upedalheel.xpm26
-rw-r--r--data/pixmaps/feta/12/scripts-upedaltoe.xpm32
-rw-r--r--data/pixmaps/feta/12/scripts-upmordent.xpm36
-rw-r--r--data/pixmaps/feta/12/scripts-upprall.xpm34
-rw-r--r--data/pixmaps/feta/12/scripts-ustaccatissimo.xpm27
-rw-r--r--data/pixmaps/feta/12/unknown.xpm16
-rw-r--r--data/pixmaps/feta/4/accidentals-(.xpm20
-rw-r--r--data/pixmaps/feta/4/accidentals-).xpm20
-rw-r--r--data/pixmaps/feta/4/accidentals--1.xpm26
-rw-r--r--data/pixmaps/feta/4/accidentals--2.xpm25
-rw-r--r--data/pixmaps/feta/4/accidentals-0.xpm25
-rw-r--r--data/pixmaps/feta/4/accidentals-1.xpm26
-rw-r--r--data/pixmaps/feta/4/accidentals-2.xpm16
-rw-r--r--data/pixmaps/feta/4/accordion-accBB.xpm0
-rw-r--r--data/pixmaps/feta/4/accordion-accBayanbase.xpm0
-rw-r--r--data/pixmaps/feta/4/accordion-accDiscant.xpm0
-rw-r--r--data/pixmaps/feta/4/accordion-accDot.xpm0
-rw-r--r--data/pixmaps/feta/4/accordion-accFreebase.xpm0
-rw-r--r--data/pixmaps/feta/4/accordion-accOldEE.xpm0
-rw-r--r--data/pixmaps/feta/4/accordion-accOldEES.xpm0
-rw-r--r--data/pixmaps/feta/4/accordion-accSB.xpm0
-rw-r--r--data/pixmaps/feta/4/accordion-accStdbase.xpm0
-rw-r--r--data/pixmaps/feta/4/clefs-C.xpm31
-rw-r--r--data/pixmaps/feta/4/clefs-C_change.xpm28
-rw-r--r--data/pixmaps/feta/4/clefs-F.xpm28
-rw-r--r--data/pixmaps/feta/4/clefs-F_change.xpm26
-rw-r--r--data/pixmaps/feta/4/clefs-G.xpm45
-rw-r--r--data/pixmaps/feta/4/clefs-G_change.xpm39
-rw-r--r--data/pixmaps/feta/4/clefs-hufnagel_do.xpm21
-rw-r--r--data/pixmaps/feta/4/clefs-hufnagel_do_change.xpm19
-rw-r--r--data/pixmaps/feta/4/clefs-hufnagel_do_fa.xpm30
-rw-r--r--data/pixmaps/feta/4/clefs-hufnagel_do_fa_change.xpm29
-rw-r--r--data/pixmaps/feta/4/clefs-hufnagel_fa.xpm24
-rw-r--r--data/pixmaps/feta/4/clefs-hufnagel_fa_change.xpm21
-rw-r--r--data/pixmaps/feta/4/clefs-medicaea_do.xpm25
-rw-r--r--data/pixmaps/feta/4/clefs-medicaea_do_change.xpm24
-rw-r--r--data/pixmaps/feta/4/clefs-medicaea_fa.xpm28
-rw-r--r--data/pixmaps/feta/4/clefs-medicaea_fa_change.xpm26
-rw-r--r--data/pixmaps/feta/4/clefs-mensural1_c.xpm30
-rw-r--r--data/pixmaps/feta/4/clefs-mensural1_c_change.xpm27
-rw-r--r--data/pixmaps/feta/4/clefs-mensural1_f.xpm37
-rw-r--r--data/pixmaps/feta/4/clefs-mensural1_f_change.xpm33
-rw-r--r--data/pixmaps/feta/4/clefs-mensural2_c.xpm28
-rw-r--r--data/pixmaps/feta/4/clefs-mensural2_c_change.xpm20
-rw-r--r--data/pixmaps/feta/4/clefs-mensural2_f.xpm21
-rw-r--r--data/pixmaps/feta/4/clefs-mensural2_f_change.xpm21
-rw-r--r--data/pixmaps/feta/4/clefs-mensural3_c.xpm32
-rw-r--r--data/pixmaps/feta/4/clefs-mensural3_c_change.xpm29
-rw-r--r--data/pixmaps/feta/4/clefs-mensural_g.xpm24
-rw-r--r--data/pixmaps/feta/4/clefs-mensural_g_change.xpm23
-rw-r--r--data/pixmaps/feta/4/clefs-percussion.xpm20
-rw-r--r--data/pixmaps/feta/4/clefs-percussion_change.xpm18
-rw-r--r--data/pixmaps/feta/4/clefs-tab.xpm34
-rw-r--r--data/pixmaps/feta/4/clefs-tab_change.xpm31
-rw-r--r--data/pixmaps/feta/4/clefs-vaticana_do.xpm20
-rw-r--r--data/pixmaps/feta/4/clefs-vaticana_do_change.xpm20
-rw-r--r--data/pixmaps/feta/4/clefs-vaticana_fa.xpm24
-rw-r--r--data/pixmaps/feta/4/clefs-vaticana_fa_change.xpm24
-rw-r--r--data/pixmaps/feta/4/custodes-hufnagel.xpm0
-rw-r--r--data/pixmaps/feta/4/custodes-medicaea.xpm0
-rw-r--r--data/pixmaps/feta/4/custodes-mensural.xpm0
-rw-r--r--data/pixmaps/feta/4/custodes-rhufnagel.xpm0
-rw-r--r--data/pixmaps/feta/4/custodes-rmedicaea.xpm0
-rw-r--r--data/pixmaps/feta/4/custodes-rmensural.xpm0
-rw-r--r--data/pixmaps/feta/4/custodes-rvaticana.xpm0
-rw-r--r--data/pixmaps/feta/4/custodes-vaticana.xpm0
-rw-r--r--data/pixmaps/feta/4/dots-dot.xpm12
-rw-r--r--data/pixmaps/feta/4/dots-evenrepeatcolon.xpm20
-rw-r--r--data/pixmaps/feta/4/dots-repeatcolon.xpm17
-rw-r--r--data/pixmaps/feta/4/flags-d3.xpm26
-rw-r--r--data/pixmaps/feta/4/flags-d4.xpm26
-rw-r--r--data/pixmaps/feta/4/flags-d5.xpm31
-rw-r--r--data/pixmaps/feta/4/flags-d6.xpm33
-rw-r--r--data/pixmaps/feta/4/flags-dgrace.xpm18
-rw-r--r--data/pixmaps/feta/4/flags-dstem.xpm24
-rw-r--r--data/pixmaps/feta/4/flags-stem.xpm24
-rw-r--r--data/pixmaps/feta/4/flags-u3.xpm25
-rw-r--r--data/pixmaps/feta/4/flags-u4.xpm29
-rw-r--r--data/pixmaps/feta/4/flags-u5.xpm32
-rw-r--r--data/pixmaps/feta/4/flags-u6.xpm36
-rw-r--r--data/pixmaps/feta/4/flags-ugrace.xpm18
-rw-r--r--data/pixmaps/feta/4/noteheads--1.xpm18
-rw-r--r--data/pixmaps/feta/4/noteheads--1mensural.xpm20
-rw-r--r--data/pixmaps/feta/4/noteheads--2mensural.xpm25
-rw-r--r--data/pixmaps/feta/4/noteheads--3mensural.xpm24
-rw-r--r--data/pixmaps/feta/4/noteheads-0.xpm17
-rw-r--r--data/pixmaps/feta/4/noteheads-0cross.xpm17
-rw-r--r--data/pixmaps/feta/4/noteheads-0diamond.xpm19
-rw-r--r--data/pixmaps/feta/4/noteheads-0mensural.xpm18
-rw-r--r--data/pixmaps/feta/4/noteheads-0slash.xpm23
-rw-r--r--data/pixmaps/feta/4/noteheads-0triangle.xpm18
-rw-r--r--data/pixmaps/feta/4/noteheads-1.xpm19
-rw-r--r--data/pixmaps/feta/4/noteheads-1cross.xpm17
-rw-r--r--data/pixmaps/feta/4/noteheads-1diamond.xpm19
-rw-r--r--data/pixmaps/feta/4/noteheads-1mensural.xpm18
-rw-r--r--data/pixmaps/feta/4/noteheads-1slash.xpm23
-rw-r--r--data/pixmaps/feta/4/noteheads-1triangle.xpm15
-rw-r--r--data/pixmaps/feta/4/noteheads-2.xpm18
-rw-r--r--data/pixmaps/feta/4/noteheads-2cross.xpm16
-rw-r--r--data/pixmaps/feta/4/noteheads-2diamond.xpm18
-rw-r--r--data/pixmaps/feta/4/noteheads-2mensural.xpm16
-rw-r--r--data/pixmaps/feta/4/noteheads-2slash.xpm22
-rw-r--r--data/pixmaps/feta/4/noteheads-2triangle.xpm17
-rw-r--r--data/pixmaps/feta/4/noteheads-2xcircle.xpm17
-rw-r--r--data/pixmaps/feta/4/noteheads-ledgerending.xpm12
-rw-r--r--data/pixmaps/feta/4/rests--1.xpm16
-rw-r--r--data/pixmaps/feta/4/rests--1o.xpm18
-rw-r--r--data/pixmaps/feta/4/rests--2.xpm20
-rw-r--r--data/pixmaps/feta/4/rests--4.xpm20
-rw-r--r--data/pixmaps/feta/4/rests-0.xpm14
-rw-r--r--data/pixmaps/feta/4/rests-0o.xpm18
-rw-r--r--data/pixmaps/feta/4/rests-1.xpm14
-rw-r--r--data/pixmaps/feta/4/rests-1o.xpm18
-rw-r--r--data/pixmaps/feta/4/rests-2.xpm27
-rw-r--r--data/pixmaps/feta/4/rests-2mensural.xpm16
-rw-r--r--data/pixmaps/feta/4/rests-3.xpm21
-rw-r--r--data/pixmaps/feta/4/rests-3mensural.xpm17
-rw-r--r--data/pixmaps/feta/4/rests-4.xpm26
-rw-r--r--data/pixmaps/feta/4/rests-4mensural.xpm19
-rw-r--r--data/pixmaps/feta/4/rests-5.xpm30
-rw-r--r--data/pixmaps/feta/4/rests-6.xpm34
-rw-r--r--data/pixmaps/feta/4/rests-7.xpm38
-rw-r--r--data/pixmaps/feta/4/scripts-arpeggio.xpm18
-rw-r--r--data/pixmaps/feta/4/scripts-coda.xpm26
-rw-r--r--data/pixmaps/feta/4/scripts-dfermata.xpm21
-rw-r--r--data/pixmaps/feta/4/scripts-dmarcato.xpm18
-rw-r--r--data/pixmaps/feta/4/scripts-downbow.xpm18
-rw-r--r--data/pixmaps/feta/4/scripts-downmordent.xpm22
-rw-r--r--data/pixmaps/feta/4/scripts-downprall.xpm21
-rw-r--r--data/pixmaps/feta/4/scripts-dpedalheel.xpm18
-rw-r--r--data/pixmaps/feta/4/scripts-dpedaltoe.xpm20
-rw-r--r--data/pixmaps/feta/4/scripts-dstaccatissimo.xpm17
-rw-r--r--data/pixmaps/feta/4/scripts-flageolet.xpm16
-rw-r--r--data/pixmaps/feta/4/scripts-lcomma.xpm20
-rw-r--r--data/pixmaps/feta/4/scripts-lineprall.xpm25
-rw-r--r--data/pixmaps/feta/4/scripts-mordent.xpm20
-rw-r--r--data/pixmaps/feta/4/scripts-open.xpm14
-rw-r--r--data/pixmaps/feta/4/scripts-prall.xpm19
-rw-r--r--data/pixmaps/feta/4/scripts-pralldown.xpm22
-rw-r--r--data/pixmaps/feta/4/scripts-prallmordent.xpm21
-rw-r--r--data/pixmaps/feta/4/scripts-prallprall.xpm18
-rw-r--r--data/pixmaps/feta/4/scripts-prallup.xpm21
-rw-r--r--data/pixmaps/feta/4/scripts-rcomma.xpm20
-rw-r--r--data/pixmaps/feta/4/scripts-reverseturn.xpm19
-rw-r--r--data/pixmaps/feta/4/scripts-segno.xpm27
-rw-r--r--data/pixmaps/feta/4/scripts-sforzato.xpm19
-rw-r--r--data/pixmaps/feta/4/scripts-staccato.xpm11
-rw-r--r--data/pixmaps/feta/4/scripts-stopped.xpm18
-rw-r--r--data/pixmaps/feta/4/scripts-tenuto.xpm12
-rw-r--r--data/pixmaps/feta/4/scripts-thumb.xpm18
-rw-r--r--data/pixmaps/feta/4/scripts-trilelement.xpm17
-rw-r--r--data/pixmaps/feta/4/scripts-trill-element.xpm16
-rw-r--r--data/pixmaps/feta/4/scripts-trill.xpm25
-rw-r--r--data/pixmaps/feta/4/scripts-turn.xpm19
-rw-r--r--data/pixmaps/feta/4/scripts-ufermata.xpm21
-rw-r--r--data/pixmaps/feta/4/scripts-umarcato.xpm18
-rw-r--r--data/pixmaps/feta/4/scripts-upbow.xpm22
-rw-r--r--data/pixmaps/feta/4/scripts-upedalheel.xpm18
-rw-r--r--data/pixmaps/feta/4/scripts-upedaltoe.xpm20
-rw-r--r--data/pixmaps/feta/4/scripts-upmordent.xpm23
-rw-r--r--data/pixmaps/feta/4/scripts-upprall.xpm22
-rw-r--r--data/pixmaps/feta/4/scripts-ustaccatissimo.xpm17
-rw-r--r--data/pixmaps/feta/4/unknown.xpm16
-rw-r--r--data/pixmaps/feta/6/accidentals-(.xpm26
-rw-r--r--data/pixmaps/feta/6/accidentals-).xpm26
-rw-r--r--data/pixmaps/feta/6/accidentals--1.xpm30
-rw-r--r--data/pixmaps/feta/6/accidentals--2.xpm31
-rw-r--r--data/pixmaps/feta/6/accidentals-0.xpm31
-rw-r--r--data/pixmaps/feta/6/accidentals-1.xpm34
-rw-r--r--data/pixmaps/feta/6/accidentals-2.xpm20
-rw-r--r--data/pixmaps/feta/6/accordion-accBB.xpm0
-rw-r--r--data/pixmaps/feta/6/accordion-accBayanbase.xpm0
-rw-r--r--data/pixmaps/feta/6/accordion-accDiscant.xpm0
-rw-r--r--data/pixmaps/feta/6/accordion-accDot.xpm0
-rw-r--r--data/pixmaps/feta/6/accordion-accFreebase.xpm0
-rw-r--r--data/pixmaps/feta/6/accordion-accOldEE.xpm0
-rw-r--r--data/pixmaps/feta/6/accordion-accOldEES.xpm0
-rw-r--r--data/pixmaps/feta/6/accordion-accSB.xpm0
-rw-r--r--data/pixmaps/feta/6/accordion-accStdbase.xpm0
-rw-r--r--data/pixmaps/feta/6/clefs-C.xpm39
-rw-r--r--data/pixmaps/feta/6/clefs-C_change.xpm34
-rw-r--r--data/pixmaps/feta/6/clefs-F.xpm35
-rw-r--r--data/pixmaps/feta/6/clefs-F_change.xpm31
-rw-r--r--data/pixmaps/feta/6/clefs-G.xpm60
-rw-r--r--data/pixmaps/feta/6/clefs-G_change.xpm51
-rw-r--r--data/pixmaps/feta/6/clefs-hufnagel_do.xpm24
-rw-r--r--data/pixmaps/feta/6/clefs-hufnagel_do_change.xpm22
-rw-r--r--data/pixmaps/feta/6/clefs-hufnagel_do_fa.xpm39
-rw-r--r--data/pixmaps/feta/6/clefs-hufnagel_do_fa_change.xpm37
-rw-r--r--data/pixmaps/feta/6/clefs-hufnagel_fa.xpm29
-rw-r--r--data/pixmaps/feta/6/clefs-hufnagel_fa_change.xpm27
-rw-r--r--data/pixmaps/feta/6/clefs-medicaea_do.xpm33
-rw-r--r--data/pixmaps/feta/6/clefs-medicaea_do_change.xpm29
-rw-r--r--data/pixmaps/feta/6/clefs-medicaea_fa.xpm34
-rw-r--r--data/pixmaps/feta/6/clefs-medicaea_fa_change.xpm30
-rw-r--r--data/pixmaps/feta/6/clefs-mensural1_c.xpm38
-rw-r--r--data/pixmaps/feta/6/clefs-mensural1_c_change.xpm31
-rw-r--r--data/pixmaps/feta/6/clefs-mensural1_f.xpm48
-rw-r--r--data/pixmaps/feta/6/clefs-mensural1_f_change.xpm42
-rw-r--r--data/pixmaps/feta/6/clefs-mensural2_c.xpm39
-rw-r--r--data/pixmaps/feta/6/clefs-mensural2_c_change.xpm32
-rw-r--r--data/pixmaps/feta/6/clefs-mensural2_f.xpm24
-rw-r--r--data/pixmaps/feta/6/clefs-mensural2_f_change.xpm24
-rw-r--r--data/pixmaps/feta/6/clefs-mensural3_c.xpm44
-rw-r--r--data/pixmaps/feta/6/clefs-mensural3_c_change.xpm40
-rw-r--r--data/pixmaps/feta/6/clefs-mensural_g.xpm29
-rw-r--r--data/pixmaps/feta/6/clefs-mensural_g_change.xpm27
-rw-r--r--data/pixmaps/feta/6/clefs-percussion.xpm26
-rw-r--r--data/pixmaps/feta/6/clefs-percussion_change.xpm22
-rw-r--r--data/pixmaps/feta/6/clefs-tab.xpm43
-rw-r--r--data/pixmaps/feta/6/clefs-tab_change.xpm38
-rw-r--r--data/pixmaps/feta/6/clefs-vaticana_do.xpm21
-rw-r--r--data/pixmaps/feta/6/clefs-vaticana_do_change.xpm21
-rw-r--r--data/pixmaps/feta/6/clefs-vaticana_fa.xpm29
-rw-r--r--data/pixmaps/feta/6/clefs-vaticana_fa_change.xpm29
-rw-r--r--data/pixmaps/feta/6/custodes-hufnagel.xpm0
-rw-r--r--data/pixmaps/feta/6/custodes-medicaea.xpm0
-rw-r--r--data/pixmaps/feta/6/custodes-mensural.xpm0
-rw-r--r--data/pixmaps/feta/6/custodes-rhufnagel.xpm0
-rw-r--r--data/pixmaps/feta/6/custodes-rmedicaea.xpm0
-rw-r--r--data/pixmaps/feta/6/custodes-rmensural.xpm0
-rw-r--r--data/pixmaps/feta/6/custodes-rvaticana.xpm0
-rw-r--r--data/pixmaps/feta/6/custodes-vaticana.xpm0
-rw-r--r--data/pixmaps/feta/6/dots-dot.xpm17
-rw-r--r--data/pixmaps/feta/6/dots-evenrepeatcolon.xpm26
-rw-r--r--data/pixmaps/feta/6/dots-repeatcolon.xpm20
-rw-r--r--data/pixmaps/feta/6/flags-d3.xpm33
-rw-r--r--data/pixmaps/feta/6/flags-d4.xpm34
-rw-r--r--data/pixmaps/feta/6/flags-d5.xpm39
-rw-r--r--data/pixmaps/feta/6/flags-d6.xpm41
-rw-r--r--data/pixmaps/feta/6/flags-dgrace.xpm22
-rw-r--r--data/pixmaps/feta/6/flags-dstem.xpm30
-rw-r--r--data/pixmaps/feta/6/flags-stem.xpm30
-rw-r--r--data/pixmaps/feta/6/flags-u3.xpm34
-rw-r--r--data/pixmaps/feta/6/flags-u4.xpm37
-rw-r--r--data/pixmaps/feta/6/flags-u5.xpm41
-rw-r--r--data/pixmaps/feta/6/flags-u6.xpm47
-rw-r--r--data/pixmaps/feta/6/flags-ugrace.xpm24
-rw-r--r--data/pixmaps/feta/6/noteheads--1.xpm22
-rw-r--r--data/pixmaps/feta/6/noteheads--1mensural.xpm23
-rw-r--r--data/pixmaps/feta/6/noteheads--2mensural.xpm30
-rw-r--r--data/pixmaps/feta/6/noteheads--3mensural.xpm30
-rw-r--r--data/pixmaps/feta/6/noteheads-0.xpm21
-rw-r--r--data/pixmaps/feta/6/noteheads-0cross.xpm22
-rw-r--r--data/pixmaps/feta/6/noteheads-0diamond.xpm20
-rw-r--r--data/pixmaps/feta/6/noteheads-0mensural.xpm21
-rw-r--r--data/pixmaps/feta/6/noteheads-0slash.xpm27
-rw-r--r--data/pixmaps/feta/6/noteheads-0triangle.xpm21
-rw-r--r--data/pixmaps/feta/6/noteheads-1.xpm22
-rw-r--r--data/pixmaps/feta/6/noteheads-1cross.xpm22
-rw-r--r--data/pixmaps/feta/6/noteheads-1diamond.xpm21
-rw-r--r--data/pixmaps/feta/6/noteheads-1mensural.xpm21
-rw-r--r--data/pixmaps/feta/6/noteheads-1slash.xpm26
-rw-r--r--data/pixmaps/feta/6/noteheads-1triangle.xpm19
-rw-r--r--data/pixmaps/feta/6/noteheads-2.xpm21
-rw-r--r--data/pixmaps/feta/6/noteheads-2cross.xpm19
-rw-r--r--data/pixmaps/feta/6/noteheads-2diamond.xpm22
-rw-r--r--data/pixmaps/feta/6/noteheads-2mensural.xpm19
-rw-r--r--data/pixmaps/feta/6/noteheads-2slash.xpm27
-rw-r--r--data/pixmaps/feta/6/noteheads-2triangle.xpm20
-rw-r--r--data/pixmaps/feta/6/noteheads-2xcircle.xpm22
-rw-r--r--data/pixmaps/feta/6/noteheads-ledgerending.xpm12
-rw-r--r--data/pixmaps/feta/6/rests--1.xpm17
-rw-r--r--data/pixmaps/feta/6/rests--1o.xpm17
-rw-r--r--data/pixmaps/feta/6/rests--2.xpm24
-rw-r--r--data/pixmaps/feta/6/rests--4.xpm23
-rw-r--r--data/pixmaps/feta/6/rests-0.xpm15
-rw-r--r--data/pixmaps/feta/6/rests-0o.xpm19
-rw-r--r--data/pixmaps/feta/6/rests-1.xpm15
-rw-r--r--data/pixmaps/feta/6/rests-1o.xpm19
-rw-r--r--data/pixmaps/feta/6/rests-2.xpm32
-rw-r--r--data/pixmaps/feta/6/rests-2mensural.xpm19
-rw-r--r--data/pixmaps/feta/6/rests-3.xpm26
-rw-r--r--data/pixmaps/feta/6/rests-3mensural.xpm19
-rw-r--r--data/pixmaps/feta/6/rests-4.xpm32
-rw-r--r--data/pixmaps/feta/6/rests-4mensural.xpm21
-rw-r--r--data/pixmaps/feta/6/rests-5.xpm38
-rw-r--r--data/pixmaps/feta/6/rests-6.xpm43
-rw-r--r--data/pixmaps/feta/6/rests-7.xpm49
-rw-r--r--data/pixmaps/feta/6/scripts-arpeggio.xpm22
-rw-r--r--data/pixmaps/feta/6/scripts-coda.xpm31
-rw-r--r--data/pixmaps/feta/6/scripts-dfermata.xpm25
-rw-r--r--data/pixmaps/feta/6/scripts-dmarcato.xpm22
-rw-r--r--data/pixmaps/feta/6/scripts-downbow.xpm21
-rw-r--r--data/pixmaps/feta/6/scripts-downmordent.xpm24
-rw-r--r--data/pixmaps/feta/6/scripts-downprall.xpm24
-rw-r--r--data/pixmaps/feta/6/scripts-dpedalheel.xpm19
-rw-r--r--data/pixmaps/feta/6/scripts-dpedaltoe.xpm24
-rw-r--r--data/pixmaps/feta/6/scripts-dstaccatissimo.xpm18
-rw-r--r--data/pixmaps/feta/6/scripts-flageolet.xpm17
-rw-r--r--data/pixmaps/feta/6/scripts-lcomma.xpm22
-rw-r--r--data/pixmaps/feta/6/scripts-lineprall.xpm31
-rw-r--r--data/pixmaps/feta/6/scripts-mordent.xpm23
-rw-r--r--data/pixmaps/feta/6/scripts-open.xpm19
-rw-r--r--data/pixmaps/feta/6/scripts-prall.xpm22
-rw-r--r--data/pixmaps/feta/6/scripts-pralldown.xpm25
-rw-r--r--data/pixmaps/feta/6/scripts-prallmordent.xpm23
-rw-r--r--data/pixmaps/feta/6/scripts-prallprall.xpm22
-rw-r--r--data/pixmaps/feta/6/scripts-prallup.xpm24
-rw-r--r--data/pixmaps/feta/6/scripts-rcomma.xpm22
-rw-r--r--data/pixmaps/feta/6/scripts-reverseturn.xpm22
-rw-r--r--data/pixmaps/feta/6/scripts-segno.xpm33
-rw-r--r--data/pixmaps/feta/6/scripts-sforzato.xpm21
-rw-r--r--data/pixmaps/feta/6/scripts-staccato.xpm12
-rw-r--r--data/pixmaps/feta/6/scripts-stopped.xpm18
-rw-r--r--data/pixmaps/feta/6/scripts-tenuto.xpm12
-rw-r--r--data/pixmaps/feta/6/scripts-thumb.xpm23
-rw-r--r--data/pixmaps/feta/6/scripts-trilelement.xpm22
-rw-r--r--data/pixmaps/feta/6/scripts-trill-element.xpm18
-rw-r--r--data/pixmaps/feta/6/scripts-trill.xpm29
-rw-r--r--data/pixmaps/feta/6/scripts-turn.xpm22
-rw-r--r--data/pixmaps/feta/6/scripts-ufermata.xpm25
-rw-r--r--data/pixmaps/feta/6/scripts-umarcato.xpm22
-rw-r--r--data/pixmaps/feta/6/scripts-upbow.xpm28
-rw-r--r--data/pixmaps/feta/6/scripts-upedalheel.xpm19
-rw-r--r--data/pixmaps/feta/6/scripts-upedaltoe.xpm24
-rw-r--r--data/pixmaps/feta/6/scripts-upmordent.xpm26
-rw-r--r--data/pixmaps/feta/6/scripts-upprall.xpm25
-rw-r--r--data/pixmaps/feta/6/scripts-ustaccatissimo.xpm18
-rw-r--r--data/pixmaps/feta/6/unknown.xpm16
-rw-r--r--data/pixmaps/feta/8/accidentals-(.xpm31
-rw-r--r--data/pixmaps/feta/8/accidentals-).xpm31
-rw-r--r--data/pixmaps/feta/8/accidentals--1.xpm36
-rw-r--r--data/pixmaps/feta/8/accidentals--2.xpm36
-rw-r--r--data/pixmaps/feta/8/accidentals-0.xpm38
-rw-r--r--data/pixmaps/feta/8/accidentals-1.xpm40
-rw-r--r--data/pixmaps/feta/8/accidentals-2.xpm22
-rw-r--r--data/pixmaps/feta/8/accordion-accBB.xpm0
-rw-r--r--data/pixmaps/feta/8/accordion-accBayanbase.xpm0
-rw-r--r--data/pixmaps/feta/8/accordion-accDiscant.xpm0
-rw-r--r--data/pixmaps/feta/8/accordion-accDot.xpm0
-rw-r--r--data/pixmaps/feta/8/accordion-accFreebase.xpm0
-rw-r--r--data/pixmaps/feta/8/accordion-accOldEE.xpm0
-rw-r--r--data/pixmaps/feta/8/accordion-accOldEES.xpm0
-rw-r--r--data/pixmaps/feta/8/accordion-accSB.xpm0
-rw-r--r--data/pixmaps/feta/8/accordion-accStdbase.xpm0
-rw-r--r--data/pixmaps/feta/8/clefs-C.xpm46
-rw-r--r--data/pixmaps/feta/8/clefs-C_change.xpm40
-rw-r--r--data/pixmaps/feta/8/clefs-F.xpm41
-rw-r--r--data/pixmaps/feta/8/clefs-F_change.xpm36
-rw-r--r--data/pixmaps/feta/8/clefs-G.xpm74
-rw-r--r--data/pixmaps/feta/8/clefs-G_change.xpm63
-rw-r--r--data/pixmaps/feta/8/clefs-hufnagel_do.xpm27
-rw-r--r--data/pixmaps/feta/8/clefs-hufnagel_do_change.xpm25
-rw-r--r--data/pixmaps/feta/8/clefs-hufnagel_do_fa.xpm47
-rw-r--r--data/pixmaps/feta/8/clefs-hufnagel_do_fa_change.xpm44
-rw-r--r--data/pixmaps/feta/8/clefs-hufnagel_fa.xpm34
-rw-r--r--data/pixmaps/feta/8/clefs-hufnagel_fa_change.xpm30
-rw-r--r--data/pixmaps/feta/8/clefs-medicaea_do.xpm39
-rw-r--r--data/pixmaps/feta/8/clefs-medicaea_do_change.xpm34
-rw-r--r--data/pixmaps/feta/8/clefs-medicaea_fa.xpm39
-rw-r--r--data/pixmaps/feta/8/clefs-medicaea_fa_change.xpm35
-rw-r--r--data/pixmaps/feta/8/clefs-mensural1_c.xpm45
-rw-r--r--data/pixmaps/feta/8/clefs-mensural1_c_change.xpm40
-rw-r--r--data/pixmaps/feta/8/clefs-mensural1_f.xpm59
-rw-r--r--data/pixmaps/feta/8/clefs-mensural1_f_change.xpm51
-rw-r--r--data/pixmaps/feta/8/clefs-mensural2_c.xpm45
-rw-r--r--data/pixmaps/feta/8/clefs-mensural2_c_change.xpm42
-rw-r--r--data/pixmaps/feta/8/clefs-mensural2_f.xpm27
-rw-r--r--data/pixmaps/feta/8/clefs-mensural2_f_change.xpm27
-rw-r--r--data/pixmaps/feta/8/clefs-mensural3_c.xpm53
-rw-r--r--data/pixmaps/feta/8/clefs-mensural3_c_change.xpm49
-rw-r--r--data/pixmaps/feta/8/clefs-mensural_g.xpm33
-rw-r--r--data/pixmaps/feta/8/clefs-mensural_g_change.xpm30
-rw-r--r--data/pixmaps/feta/8/clefs-percussion.xpm28
-rw-r--r--data/pixmaps/feta/8/clefs-percussion_change.xpm25
-rw-r--r--data/pixmaps/feta/8/clefs-tab.xpm52
-rw-r--r--data/pixmaps/feta/8/clefs-tab_change.xpm44
-rw-r--r--data/pixmaps/feta/8/clefs-vaticana_do.xpm27
-rw-r--r--data/pixmaps/feta/8/clefs-vaticana_do_change.xpm27
-rw-r--r--data/pixmaps/feta/8/clefs-vaticana_fa.xpm33
-rw-r--r--data/pixmaps/feta/8/clefs-vaticana_fa_change.xpm33
-rw-r--r--data/pixmaps/feta/8/custodes-hufnagel.xpm0
-rw-r--r--data/pixmaps/feta/8/custodes-medicaea.xpm0
-rw-r--r--data/pixmaps/feta/8/custodes-mensural.xpm0
-rw-r--r--data/pixmaps/feta/8/custodes-rhufnagel.xpm0
-rw-r--r--data/pixmaps/feta/8/custodes-rmedicaea.xpm0
-rw-r--r--data/pixmaps/feta/8/custodes-rmensural.xpm0
-rw-r--r--data/pixmaps/feta/8/custodes-rvaticana.xpm0
-rw-r--r--data/pixmaps/feta/8/custodes-vaticana.xpm0
-rw-r--r--data/pixmaps/feta/8/dots-dot.xpm17
-rw-r--r--data/pixmaps/feta/8/dots-evenrepeatcolon.xpm33
-rw-r--r--data/pixmaps/feta/8/dots-repeatcolon.xpm24
-rw-r--r--data/pixmaps/feta/8/flags-d3.xpm38
-rw-r--r--data/pixmaps/feta/8/flags-d4.xpm39
-rw-r--r--data/pixmaps/feta/8/flags-d5.xpm46
-rw-r--r--data/pixmaps/feta/8/flags-d6.xpm50
-rw-r--r--data/pixmaps/feta/8/flags-dgrace.xpm23
-rw-r--r--data/pixmaps/feta/8/flags-dstem.xpm36
-rw-r--r--data/pixmaps/feta/8/flags-stem.xpm36
-rw-r--r--data/pixmaps/feta/8/flags-u3.xpm39
-rw-r--r--data/pixmaps/feta/8/flags-u4.xpm43
-rw-r--r--data/pixmaps/feta/8/flags-u5.xpm49
-rw-r--r--data/pixmaps/feta/8/flags-u6.xpm57
-rw-r--r--data/pixmaps/feta/8/flags-ugrace.xpm24
-rw-r--r--data/pixmaps/feta/8/noteheads--1.xpm24
-rw-r--r--data/pixmaps/feta/8/noteheads--1mensural.xpm27
-rw-r--r--data/pixmaps/feta/8/noteheads--2mensural.xpm35
-rw-r--r--data/pixmaps/feta/8/noteheads--3mensural.xpm35
-rw-r--r--data/pixmaps/feta/8/noteheads-0.xpm24
-rw-r--r--data/pixmaps/feta/8/noteheads-0cross.xpm24
-rw-r--r--data/pixmaps/feta/8/noteheads-0diamond.xpm23
-rw-r--r--data/pixmaps/feta/8/noteheads-0mensural.xpm22
-rw-r--r--data/pixmaps/feta/8/noteheads-0slash.xpm30
-rw-r--r--data/pixmaps/feta/8/noteheads-0triangle.xpm23
-rw-r--r--data/pixmaps/feta/8/noteheads-1.xpm24
-rw-r--r--data/pixmaps/feta/8/noteheads-1cross.xpm23
-rw-r--r--data/pixmaps/feta/8/noteheads-1diamond.xpm24
-rw-r--r--data/pixmaps/feta/8/noteheads-1mensural.xpm22
-rw-r--r--data/pixmaps/feta/8/noteheads-1slash.xpm30
-rw-r--r--data/pixmaps/feta/8/noteheads-1triangle.xpm22
-rw-r--r--data/pixmaps/feta/8/noteheads-2.xpm21
-rw-r--r--data/pixmaps/feta/8/noteheads-2cross.xpm23
-rw-r--r--data/pixmaps/feta/8/noteheads-2diamond.xpm23
-rw-r--r--data/pixmaps/feta/8/noteheads-2mensural.xpm21
-rw-r--r--data/pixmaps/feta/8/noteheads-2slash.xpm29
-rw-r--r--data/pixmaps/feta/8/noteheads-2triangle.xpm23
-rw-r--r--data/pixmaps/feta/8/noteheads-2xcircle.xpm23
-rw-r--r--data/pixmaps/feta/8/noteheads-ledgerending.xpm14
-rw-r--r--data/pixmaps/feta/8/rests--1.xpm20
-rw-r--r--data/pixmaps/feta/8/rests--1o.xpm23
-rw-r--r--data/pixmaps/feta/8/rests--2.xpm28
-rw-r--r--data/pixmaps/feta/8/rests--4.xpm30
-rw-r--r--data/pixmaps/feta/8/rests-0.xpm18
-rw-r--r--data/pixmaps/feta/8/rests-0o.xpm20
-rw-r--r--data/pixmaps/feta/8/rests-1.xpm18
-rw-r--r--data/pixmaps/feta/8/rests-1o.xpm19
-rw-r--r--data/pixmaps/feta/8/rests-2.xpm37
-rw-r--r--data/pixmaps/feta/8/rests-2mensural.xpm21
-rw-r--r--data/pixmaps/feta/8/rests-3.xpm30
-rw-r--r--data/pixmaps/feta/8/rests-3mensural.xpm21
-rw-r--r--data/pixmaps/feta/8/rests-4.xpm37
-rw-r--r--data/pixmaps/feta/8/rests-4mensural.xpm22
-rw-r--r--data/pixmaps/feta/8/rests-5.xpm45
-rw-r--r--data/pixmaps/feta/8/rests-6.xpm53
-rw-r--r--data/pixmaps/feta/8/rests-7.xpm60
-rw-r--r--data/pixmaps/feta/8/scripts-arpeggio.xpm27
-rw-r--r--data/pixmaps/feta/8/scripts-coda.xpm37
-rw-r--r--data/pixmaps/feta/8/scripts-dfermata.xpm27
-rw-r--r--data/pixmaps/feta/8/scripts-dmarcato.xpm24
-rw-r--r--data/pixmaps/feta/8/scripts-downbow.xpm25
-rw-r--r--data/pixmaps/feta/8/scripts-downmordent.xpm27
-rw-r--r--data/pixmaps/feta/8/scripts-downprall.xpm26
-rw-r--r--data/pixmaps/feta/8/scripts-dpedalheel.xpm24
-rw-r--r--data/pixmaps/feta/8/scripts-dpedaltoe.xpm27
-rw-r--r--data/pixmaps/feta/8/scripts-dstaccatissimo.xpm22
-rw-r--r--data/pixmaps/feta/8/scripts-flageolet.xpm20
-rw-r--r--data/pixmaps/feta/8/scripts-lcomma.xpm25
-rw-r--r--data/pixmaps/feta/8/scripts-lineprall.xpm35
-rw-r--r--data/pixmaps/feta/8/scripts-mordent.xpm26
-rw-r--r--data/pixmaps/feta/8/scripts-open.xpm22
-rw-r--r--data/pixmaps/feta/8/scripts-prall.xpm24
-rw-r--r--data/pixmaps/feta/8/scripts-pralldown.xpm28
-rw-r--r--data/pixmaps/feta/8/scripts-prallmordent.xpm26
-rw-r--r--data/pixmaps/feta/8/scripts-prallprall.xpm24
-rw-r--r--data/pixmaps/feta/8/scripts-prallup.xpm26
-rw-r--r--data/pixmaps/feta/8/scripts-rcomma.xpm25
-rw-r--r--data/pixmaps/feta/8/scripts-reverseturn.xpm23
-rw-r--r--data/pixmaps/feta/8/scripts-segno.xpm38
-rw-r--r--data/pixmaps/feta/8/scripts-sforzato.xpm24
-rw-r--r--data/pixmaps/feta/8/scripts-staccato.xpm14
-rw-r--r--data/pixmaps/feta/8/scripts-stopped.xpm23
-rw-r--r--data/pixmaps/feta/8/scripts-tenuto.xpm12
-rw-r--r--data/pixmaps/feta/8/scripts-thumb.xpm25
-rw-r--r--data/pixmaps/feta/8/scripts-trilelement.xpm24
-rw-r--r--data/pixmaps/feta/8/scripts-trill-element.xpm22
-rw-r--r--data/pixmaps/feta/8/scripts-trill.xpm34
-rw-r--r--data/pixmaps/feta/8/scripts-turn.xpm23
-rw-r--r--data/pixmaps/feta/8/scripts-ufermata.xpm27
-rw-r--r--data/pixmaps/feta/8/scripts-umarcato.xpm24
-rw-r--r--data/pixmaps/feta/8/scripts-upbow.xpm32
-rw-r--r--data/pixmaps/feta/8/scripts-upedalheel.xpm24
-rw-r--r--data/pixmaps/feta/8/scripts-upedaltoe.xpm27
-rw-r--r--data/pixmaps/feta/8/scripts-upmordent.xpm29
-rw-r--r--data/pixmaps/feta/8/scripts-upprall.xpm28
-rw-r--r--data/pixmaps/feta/8/scripts-ustaccatissimo.xpm22
-rw-r--r--data/pixmaps/feta/8/unknown.xpm16
-rw-r--r--data/pixmaps/feta/README10
-rw-r--r--data/pixmaps/icons/cc-hi16-rosegarden.xpm39
-rw-r--r--data/pixmaps/icons/cc-hi32-rosegarden.xpm54
-rw-r--r--data/pixmaps/icons/cc-hi48-rosegarden.xpm307
-rw-r--r--data/pixmaps/icons/cc-hi64-rosegarden.xpm100
-rw-r--r--data/pixmaps/icons/mm-mime-hi16-rosegarden.pngbin0 -> 1206 bytes
-rw-r--r--data/pixmaps/icons/mm-mime-hi16-rosegarden.xpm176
-rw-r--r--data/pixmaps/icons/mm-mime-hi32-rosegarden.pngbin0 -> 4293 bytes
-rw-r--r--data/pixmaps/icons/mm-mime-hi32-rosegarden.xpm3727
-rw-r--r--data/pixmaps/icons/mm-mime-hi64-rosegarden.pngbin0 -> 16638 bytes
-rw-r--r--data/pixmaps/icons/rg-rwb-rose3-128x128.pngbin0 -> 19674 bytes
-rw-r--r--data/pixmaps/icons/rg-rwb-rose3-16x16.pngbin0 -> 925 bytes
-rw-r--r--data/pixmaps/icons/rg-rwb-rose3-32x32.pngbin0 -> 2417 bytes
-rw-r--r--data/pixmaps/icons/rg-rwb-rose3-48x48.pngbin0 -> 4161 bytes
-rw-r--r--data/pixmaps/icons/rg-rwb-rose3-64x64.pngbin0 -> 6833 bytes
-rw-r--r--data/pixmaps/icons/rg-tux-small.pngbin0 -> 6618 bytes
-rw-r--r--data/pixmaps/icons/sa-hi16-rosegarden.pngbin0 -> 1112 bytes
-rw-r--r--data/pixmaps/icons/sa-hi32-rosegarden.pngbin0 -> 1641 bytes
-rw-r--r--data/pixmaps/icons/sa-hi48-rosegarden.pngbin0 -> 2440 bytes
-rw-r--r--data/pixmaps/icons/sa-hi64-rosegarden.pngbin0 -> 3489 bytes
-rw-r--r--data/pixmaps/icons/sa-lo16-rosegarden.pngbin0 -> 320 bytes
-rw-r--r--data/pixmaps/icons/sa-lo32-rosegarden.pngbin0 -> 552 bytes
-rw-r--r--data/pixmaps/misc/arrow-contracted.pngbin0 -> 114 bytes
-rw-r--r--data/pixmaps/misc/arrow-expanded.pngbin0 -> 105 bytes
-rw-r--r--data/pixmaps/misc/bg-desktop.xpm1635
-rw-r--r--data/pixmaps/misc/bg-matrix-lines.xpm155
-rw-r--r--data/pixmaps/misc/bg-paper-black.xpm135
-rw-r--r--data/pixmaps/misc/bg-paper-cream.xpm129
-rw-r--r--data/pixmaps/misc/bg-paper-grey.xpm118
-rw-r--r--data/pixmaps/misc/bg-paper-white.xpm135
-rw-r--r--data/pixmaps/misc/bg-segmentcanvas.xpm171
-rw-r--r--data/pixmaps/misc/close.xpm19
-rw-r--r--data/pixmaps/misc/configure-audio.pngbin0 -> 1670 bytes
-rw-r--r--data/pixmaps/misc/configure-general.pngbin0 -> 2417 bytes
-rw-r--r--data/pixmaps/misc/configure-midi.pngbin0 -> 2699 bytes
-rw-r--r--data/pixmaps/misc/configure-notation.pngbin0 -> 569 bytes
-rw-r--r--data/pixmaps/misc/connected-selected.xpm20
-rw-r--r--data/pixmaps/misc/connected-used.xpm20
-rw-r--r--data/pixmaps/misc/connected.xpm20
-rw-r--r--data/pixmaps/misc/mono.xpm29
-rw-r--r--data/pixmaps/misc/stereo.xpm26
-rw-r--r--data/pixmaps/misc/unconnected-selected.xpm20
-rw-r--r--data/pixmaps/misc/unconnected-used.xpm20
-rw-r--r--data/pixmaps/misc/unconnected.xpm20
-rw-r--r--data/pixmaps/misc/welcome-icon.pngbin0 -> 6746 bytes
-rw-r--r--data/pixmaps/rg21/4/blank.xpm15
-rw-r--r--data/pixmaps/rg21/4/chordmod-accent.xpm8
-rw-r--r--data/pixmaps/rg21/4/chordmod-dash.xpm8
-rw-r--r--data/pixmaps/rg21/4/chordmod-dot.xpm8
-rw-r--r--data/pixmaps/rg21/4/chordmod-legato.xpm8
-rw-r--r--data/pixmaps/rg21/4/chordmod-pause.xpm10
-rw-r--r--data/pixmaps/rg21/4/chordmod-sfz.xpm8
-rw-r--r--data/pixmaps/rg21/4/chordmod-trill.xpm8
-rw-r--r--data/pixmaps/rg21/4/chordmod-turn.xpm8
-rw-r--r--data/pixmaps/rg21/4/clef-alto.xpm34
-rw-r--r--data/pixmaps/rg21/4/clef-bass.xpm34
-rw-r--r--data/pixmaps/rg21/4/clef-tenor.xpm34
-rw-r--r--data/pixmaps/rg21/4/clef-treble.xpm34
-rw-r--r--data/pixmaps/rg21/4/dot.xpm9
-rw-r--r--data/pixmaps/rg21/4/note-bodyempty.xpm9
-rw-r--r--data/pixmaps/rg21/4/note-bodyfilled.xpm9
-rw-r--r--data/pixmaps/rg21/4/note-breve.xpm9
-rw-r--r--data/pixmaps/rg21/4/notemod-doubleflat.xpm13
-rw-r--r--data/pixmaps/rg21/4/notemod-doublesharp.xpm14
-rw-r--r--data/pixmaps/rg21/4/notemod-flat.xpm13
-rw-r--r--data/pixmaps/rg21/4/notemod-natural.xpm13
-rw-r--r--data/pixmaps/rg21/4/notemod-sharp.xpm13
-rw-r--r--data/pixmaps/rg21/4/rest-breve.xpm26
-rw-r--r--data/pixmaps/rg21/4/rest-crotchet.xpm26
-rw-r--r--data/pixmaps/rg21/4/rest-demisemi.xpm26
-rw-r--r--data/pixmaps/rg21/4/rest-demisemiquaver.xpm26
-rw-r--r--data/pixmaps/rg21/4/rest-hemidemisemi.xpm26
-rw-r--r--data/pixmaps/rg21/4/rest-hemidemisemiquaver.xpm26
-rw-r--r--data/pixmaps/rg21/4/rest-minim.xpm26
-rw-r--r--data/pixmaps/rg21/4/rest-quaver.xpm26
-rw-r--r--data/pixmaps/rg21/4/rest-semibreve.xpm26
-rw-r--r--data/pixmaps/rg21/4/rest-semiquaver.xpm26
-rw-r--r--data/pixmaps/rg21/4/tail-down-1.xpm11
-rw-r--r--data/pixmaps/rg21/4/tail-down-2.xpm15
-rw-r--r--data/pixmaps/rg21/4/tail-down-3.xpm18
-rw-r--r--data/pixmaps/rg21/4/tail-down-4.xpm22
-rw-r--r--data/pixmaps/rg21/4/tail-up-1.xpm11
-rw-r--r--data/pixmaps/rg21/4/tail-up-2.xpm15
-rw-r--r--data/pixmaps/rg21/4/tail-up-3.xpm18
-rw-r--r--data/pixmaps/rg21/4/tail-up-4.xpm22
-rw-r--r--data/pixmaps/rg21/4/unknown.xpm16
-rw-r--r--data/pixmaps/rg21/8/blank.xpm15
-rw-r--r--data/pixmaps/rg21/8/chordmod-accent.xpm15
-rw-r--r--data/pixmaps/rg21/8/chordmod-dash.xpm15
-rw-r--r--data/pixmaps/rg21/8/chordmod-dot.xpm15
-rw-r--r--data/pixmaps/rg21/8/chordmod-legato.xpm15
-rw-r--r--data/pixmaps/rg21/8/chordmod-pause.xpm17
-rw-r--r--data/pixmaps/rg21/8/chordmod-rfz.xpm15
-rw-r--r--data/pixmaps/rg21/8/chordmod-sfz.xpm15
-rw-r--r--data/pixmaps/rg21/8/chordmod-trill.xpm15
-rw-r--r--data/pixmaps/rg21/8/chordmod-turn.xpm15
-rw-r--r--data/pixmaps/rg21/8/clef-alto.xpm61
-rw-r--r--data/pixmaps/rg21/8/clef-bass.xpm61
-rw-r--r--data/pixmaps/rg21/8/clef-tenor.xpm61
-rw-r--r--data/pixmaps/rg21/8/clef-treble.xpm61
-rw-r--r--data/pixmaps/rg21/8/dot.xpm16
-rw-r--r--data/pixmaps/rg21/8/dual-arrow.xpm18
-rw-r--r--data/pixmaps/rg21/8/note-bodyempty.xpm16
-rw-r--r--data/pixmaps/rg21/8/note-bodyfilled.xpm16
-rw-r--r--data/pixmaps/rg21/8/note-breve.xpm16
-rw-r--r--data/pixmaps/rg21/8/notemod-doubleflat.xpm22
-rw-r--r--data/pixmaps/rg21/8/notemod-doublesharp.xpm22
-rw-r--r--data/pixmaps/rg21/8/notemod-flat.xpm22
-rw-r--r--data/pixmaps/rg21/8/notemod-natural.xpm22
-rw-r--r--data/pixmaps/rg21/8/notemod-sharp.xpm22
-rw-r--r--data/pixmaps/rg21/8/rest-breve.xpm45
-rw-r--r--data/pixmaps/rg21/8/rest-crotchet.xpm45
-rw-r--r--data/pixmaps/rg21/8/rest-demisemi.xpm45
-rw-r--r--data/pixmaps/rg21/8/rest-demisemiquaver.xpm45
-rw-r--r--data/pixmaps/rg21/8/rest-hemidemisemi.xpm45
-rw-r--r--data/pixmaps/rg21/8/rest-hemidemisemiquaver.xpm45
-rw-r--r--data/pixmaps/rg21/8/rest-minim.xpm45
-rw-r--r--data/pixmaps/rg21/8/rest-quaver.xpm45
-rw-r--r--data/pixmaps/rg21/8/rest-semibreve.xpm45
-rw-r--r--data/pixmaps/rg21/8/rest-semiquaver.xpm45
-rw-r--r--data/pixmaps/rg21/8/tail-down-1.xpm22
-rw-r--r--data/pixmaps/rg21/8/tail-down-2.xpm28
-rw-r--r--data/pixmaps/rg21/8/tail-down-3.xpm34
-rw-r--r--data/pixmaps/rg21/8/tail-down-4.xpm40
-rw-r--r--data/pixmaps/rg21/8/tail-up-1.xpm22
-rw-r--r--data/pixmaps/rg21/8/tail-up-2.xpm28
-rw-r--r--data/pixmaps/rg21/8/tail-up-3.xpm34
-rw-r--r--data/pixmaps/rg21/8/tail-up-4.xpm40
-rw-r--r--data/pixmaps/rg21/8/unknown.xpm16
-rw-r--r--data/pixmaps/splash-1.0.pngbin0 -> 152641 bytes
-rw-r--r--data/pixmaps/splash-1.2.3.pngbin0 -> 315832 bytes
-rw-r--r--data/pixmaps/splash-1.4-1.5.pngbin0 -> 268688 bytes
-rw-r--r--data/pixmaps/splash.pngbin0 -> 329209 bytes
-rw-r--r--data/pixmaps/toolbar/accent.xpm21
-rw-r--r--data/pixmaps/toolbar/accidental-doubleflat.xpm33
-rw-r--r--data/pixmaps/toolbar/accidental-doublesharp.xpm33
-rw-r--r--data/pixmaps/toolbar/accidental-flat.xpm33
-rw-r--r--data/pixmaps/toolbar/accidental-follow.xpm33
-rw-r--r--data/pixmaps/toolbar/accidental-natural.xpm33
-rw-r--r--data/pixmaps/toolbar/accidental-none.xpm33
-rw-r--r--data/pixmaps/toolbar/accidental-sharp.xpm33
-rw-r--r--data/pixmaps/toolbar/accmenu-doubleflat.xpm31
-rw-r--r--data/pixmaps/toolbar/accmenu-doublesharp.xpm20
-rw-r--r--data/pixmaps/toolbar/accmenu-flat.xpm30
-rw-r--r--data/pixmaps/toolbar/accmenu-natural.xpm31
-rw-r--r--data/pixmaps/toolbar/accmenu-sharp.xpm34
-rw-r--r--data/pixmaps/toolbar/add_tracks.pngbin0 -> 1268 bytes
-rw-r--r--data/pixmaps/toolbar/add_tracks.xpm70
-rw-r--r--data/pixmaps/toolbar/breve.xpm33
-rw-r--r--data/pixmaps/toolbar/button-metronome.pngbin0 -> 966 bytes
-rw-r--r--data/pixmaps/toolbar/chord.xpm33
-rw-r--r--data/pixmaps/toolbar/clef-alto.xpm57
-rw-r--r--data/pixmaps/toolbar/clef-alto.xpm_rg2135
-rw-r--r--data/pixmaps/toolbar/clef-bass.xpm54
-rw-r--r--data/pixmaps/toolbar/clef-bass.xpm_rg2135
-rw-r--r--data/pixmaps/toolbar/clef-tenor.xpm56
-rw-r--r--data/pixmaps/toolbar/clef-tenor.xpm_rg2135
-rw-r--r--data/pixmaps/toolbar/clef-treble.xpm61
-rw-r--r--data/pixmaps/toolbar/clef-treble.xpm_rg2135
-rw-r--r--data/pixmaps/toolbar/continuous-page-mode.xpm98
-rw-r--r--data/pixmaps/toolbar/crotchet.xpm33
-rw-r--r--data/pixmaps/toolbar/delete-track.pngbin0 -> 464 bytes
-rw-r--r--data/pixmaps/toolbar/delete_track.pngbin0 -> 1124 bytes
-rw-r--r--data/pixmaps/toolbar/delete_track.xpm40
-rw-r--r--data/pixmaps/toolbar/demisemi.xpm33
-rw-r--r--data/pixmaps/toolbar/dotted-breve.xpm31
-rw-r--r--data/pixmaps/toolbar/dotted-crotchet.xpm33
-rw-r--r--data/pixmaps/toolbar/dotted-demisemi.xpm33
-rw-r--r--data/pixmaps/toolbar/dotted-hemidemisemi.xpm31
-rw-r--r--data/pixmaps/toolbar/dotted-minim.xpm33
-rw-r--r--data/pixmaps/toolbar/dotted-quaver.xpm33
-rw-r--r--data/pixmaps/toolbar/dotted-rest-breve.xpm26
-rw-r--r--data/pixmaps/toolbar/dotted-rest-crotchet.xpm33
-rw-r--r--data/pixmaps/toolbar/dotted-rest-demisemi.xpm33
-rw-r--r--data/pixmaps/toolbar/dotted-rest-hemidemisemi.xpm26
-rw-r--r--data/pixmaps/toolbar/dotted-rest-minim.xpm33
-rw-r--r--data/pixmaps/toolbar/dotted-rest-quaver.xpm33
-rw-r--r--data/pixmaps/toolbar/dotted-rest-semibreve.xpm34
-rw-r--r--data/pixmaps/toolbar/dotted-rest-semiquaver.xpm33
-rw-r--r--data/pixmaps/toolbar/dotted-semibreve.xpm33
-rw-r--r--data/pixmaps/toolbar/dotted-semiquaver.xpm33
-rw-r--r--data/pixmaps/toolbar/down-bow.xpm21
-rw-r--r--data/pixmaps/toolbar/event-delete.pngbin0 -> 877 bytes
-rw-r--r--data/pixmaps/toolbar/event-delete.xpm92
-rw-r--r--data/pixmaps/toolbar/event-edit-advanced.pngbin0 -> 960 bytes
-rw-r--r--data/pixmaps/toolbar/event-edit-advanced.xpm409
-rw-r--r--data/pixmaps/toolbar/event-edit.pngbin0 -> 1029 bytes
-rw-r--r--data/pixmaps/toolbar/event-edit.xpmbin0 -> 1809 bytes
-rw-r--r--data/pixmaps/toolbar/event-insert-tempo.pngbin0 -> 1240 bytes
-rw-r--r--data/pixmaps/toolbar/event-insert-timesig.pngbin0 -> 946 bytes
-rw-r--r--data/pixmaps/toolbar/event-insert.pngbin0 -> 857 bytes
-rw-r--r--data/pixmaps/toolbar/eventfilter.xpm124
-rw-r--r--data/pixmaps/toolbar/eventlist.pngbin0 -> 736 bytes
-rw-r--r--data/pixmaps/toolbar/eventlist.xpm30
-rw-r--r--data/pixmaps/toolbar/group-beam.xpm33
-rw-r--r--data/pixmaps/toolbar/group-chord.xpm33
-rw-r--r--data/pixmaps/toolbar/group-crescendo.xpm27
-rw-r--r--data/pixmaps/toolbar/group-decrescendo.xpm27
-rw-r--r--data/pixmaps/toolbar/group-grace.xpm33
-rw-r--r--data/pixmaps/toolbar/group-ottava.xpm27
-rw-r--r--data/pixmaps/toolbar/group-simple-tuplet.xpm33
-rw-r--r--data/pixmaps/toolbar/group-slur.xpm33
-rw-r--r--data/pixmaps/toolbar/group-tuplet.xpm33
-rw-r--r--data/pixmaps/toolbar/group-unbeam.xpm33
-rw-r--r--data/pixmaps/toolbar/guitarchord.pngbin0 -> 719 bytes
-rw-r--r--data/pixmaps/toolbar/hemidemisemi.xpm33
-rw-r--r--data/pixmaps/toolbar/insert_audio_into_track.xpm60
-rw-r--r--data/pixmaps/toolbar/join.xpm36
-rw-r--r--data/pixmaps/toolbar/key-green.pngbin0 -> 143 bytes
-rw-r--r--data/pixmaps/toolbar/key-white.pngbin0 -> 142 bytes
-rw-r--r--data/pixmaps/toolbar/linear-layout.xpm41
-rw-r--r--data/pixmaps/toolbar/manage-audio-segments.pngbin0 -> 481 bytes
-rw-r--r--data/pixmaps/toolbar/manage-audio-segments.xpm33
-rw-r--r--data/pixmaps/toolbar/manage-midi-devices.xpm248
-rw-r--r--data/pixmaps/toolbar/manage-synth-plugins.pngbin0 -> 1580 bytes
-rw-r--r--data/pixmaps/toolbar/manage-synth-plugins.xpm112
-rw-r--r--data/pixmaps/toolbar/marcato.xpm22
-rw-r--r--data/pixmaps/toolbar/matrix-percussion.pngbin0 -> 1331 bytes
-rw-r--r--data/pixmaps/toolbar/matrix-percussion.xpm36
-rw-r--r--data/pixmaps/toolbar/matrix.pngbin0 -> 522 bytes
-rw-r--r--data/pixmaps/toolbar/matrix.xpm30
-rw-r--r--data/pixmaps/toolbar/menu-3-3-hemidemisemi.xpm19
-rw-r--r--data/pixmaps/toolbar/menu-3-breve.xpm19
-rw-r--r--data/pixmaps/toolbar/menu-3-crotchet.xpm19
-rw-r--r--data/pixmaps/toolbar/menu-3-demisemi.xpm19
-rw-r--r--data/pixmaps/toolbar/menu-3-dotted-breve.xpm19
-rw-r--r--data/pixmaps/toolbar/menu-3-dotted-crotchet.xpm19
-rw-r--r--data/pixmaps/toolbar/menu-3-dotted-demisemi.xpm19
-rw-r--r--data/pixmaps/toolbar/menu-3-dotted-hemidemisemi.xpm19
-rw-r--r--data/pixmaps/toolbar/menu-3-dotted-minim.xpm19
-rw-r--r--data/pixmaps/toolbar/menu-3-dotted-quaver.xpm19
-rw-r--r--data/pixmaps/toolbar/menu-3-dotted-semibreve.xpm19
-rw-r--r--data/pixmaps/toolbar/menu-3-dotted-semiquaver.xpm19
-rw-r--r--data/pixmaps/toolbar/menu-3-hemidemisemi.xpm19
-rw-r--r--data/pixmaps/toolbar/menu-3-minim.xpm19
-rw-r--r--data/pixmaps/toolbar/menu-3-quaver.xpm19
-rw-r--r--data/pixmaps/toolbar/menu-3-semibreve.xpm19
-rw-r--r--data/pixmaps/toolbar/menu-3-semiquaver.xpm19
-rw-r--r--data/pixmaps/toolbar/menu-breve.xpm19
-rw-r--r--data/pixmaps/toolbar/menu-crotchet.xpm19
-rw-r--r--data/pixmaps/toolbar/menu-demisemi.xpm19
-rw-r--r--data/pixmaps/toolbar/menu-dotted-breve.xpm19
-rw-r--r--data/pixmaps/toolbar/menu-dotted-crotchet.xpm19
-rw-r--r--data/pixmaps/toolbar/menu-dotted-demisemi.xpm19
-rw-r--r--data/pixmaps/toolbar/menu-dotted-hemidemisemi.xpm19
-rw-r--r--data/pixmaps/toolbar/menu-dotted-minim.xpm19
-rw-r--r--data/pixmaps/toolbar/menu-dotted-quaver.xpm19
-rw-r--r--data/pixmaps/toolbar/menu-dotted-semibreve.xpm19
-rw-r--r--data/pixmaps/toolbar/menu-dotted-semiquaver.xpm19
-rw-r--r--data/pixmaps/toolbar/menu-hemidemisemi.xpm19
-rw-r--r--data/pixmaps/toolbar/menu-minim.xpm19
-rw-r--r--data/pixmaps/toolbar/menu-no-note.xpm19
-rw-r--r--data/pixmaps/toolbar/menu-quaver.xpm19
-rw-r--r--data/pixmaps/toolbar/menu-semibreve.xpm19
-rw-r--r--data/pixmaps/toolbar/menu-semiquaver.xpm19
-rw-r--r--data/pixmaps/toolbar/midimixer.pngbin0 -> 851 bytes
-rw-r--r--data/pixmaps/toolbar/midimixer.xpm151
-rw-r--r--data/pixmaps/toolbar/minim.xpm33
-rw-r--r--data/pixmaps/toolbar/mixer.pngbin0 -> 418 bytes
-rw-r--r--data/pixmaps/toolbar/mixer.xpm89
-rw-r--r--data/pixmaps/toolbar/move_track_down.pngbin0 -> 1013 bytes
-rw-r--r--data/pixmaps/toolbar/move_track_down.xpm35
-rw-r--r--data/pixmaps/toolbar/move_track_up.pngbin0 -> 1163 bytes
-rw-r--r--data/pixmaps/toolbar/move_track_up.xpm35
-rw-r--r--data/pixmaps/toolbar/multi-page-mode.xpm32
-rw-r--r--data/pixmaps/toolbar/mute-all.pngbin0 -> 531 bytes
-rw-r--r--data/pixmaps/toolbar/mute-all.xpm86
-rw-r--r--data/pixmaps/toolbar/no-note.xpm30
-rw-r--r--data/pixmaps/toolbar/notation.pngbin0 -> 387 bytes
-rw-r--r--data/pixmaps/toolbar/notation.xpm31
-rw-r--r--data/pixmaps/toolbar/palette-accidentals.xpm21
-rw-r--r--data/pixmaps/toolbar/palette-clefs.xpm21
-rw-r--r--data/pixmaps/toolbar/palette-group.xpm35
-rw-r--r--data/pixmaps/toolbar/palette-marks.xpm38
-rw-r--r--data/pixmaps/toolbar/palette-notes.xpm21
-rw-r--r--data/pixmaps/toolbar/palette-rests.xpm21
-rw-r--r--data/pixmaps/toolbar/pause.xpm21
-rw-r--r--data/pixmaps/toolbar/quantize.pngbin0 -> 460 bytes
-rw-r--r--data/pixmaps/toolbar/quantize.xpm31
-rw-r--r--data/pixmaps/toolbar/quaver.xpm33
-rw-r--r--data/pixmaps/toolbar/resize.xpm36
-rw-r--r--data/pixmaps/toolbar/rest-breve.xpm34
-rw-r--r--data/pixmaps/toolbar/rest-crotchet.xpm33
-rw-r--r--data/pixmaps/toolbar/rest-demisemi.xpm33
-rw-r--r--data/pixmaps/toolbar/rest-hemidemisemi.xpm33
-rw-r--r--data/pixmaps/toolbar/rest-minim.xpm33
-rw-r--r--data/pixmaps/toolbar/rest-quaver.xpm33
-rw-r--r--data/pixmaps/toolbar/rest-semibreve.xpm34
-rw-r--r--data/pixmaps/toolbar/rest-semiquaver.xpm33
-rw-r--r--data/pixmaps/toolbar/select.xpm32
-rw-r--r--data/pixmaps/toolbar/semibreve.xpm33
-rw-r--r--data/pixmaps/toolbar/semiquaver.xpm33
-rw-r--r--data/pixmaps/toolbar/split.xpm36
-rw-r--r--data/pixmaps/toolbar/staccatissimo.xpm18
-rw-r--r--data/pixmaps/toolbar/staccato.xpm14
-rw-r--r--data/pixmaps/toolbar/step_by_step.xpm26
-rw-r--r--data/pixmaps/toolbar/tenuto.xpm12
-rw-r--r--data/pixmaps/toolbar/text-mark.xpm40
-rw-r--r--data/pixmaps/toolbar/text.xpm40
-rw-r--r--data/pixmaps/toolbar/text_rf.xpm15
-rw-r--r--data/pixmaps/toolbar/text_sf.xpm15
-rw-r--r--data/pixmaps/toolbar/time-musical.pngbin0 -> 991 bytes
-rw-r--r--data/pixmaps/toolbar/time-musical.xpm51
-rw-r--r--data/pixmaps/toolbar/time-raw.pngbin0 -> 520 bytes
-rw-r--r--data/pixmaps/toolbar/time-raw.xpm26
-rw-r--r--data/pixmaps/toolbar/time-real.pngbin0 -> 676 bytes
-rw-r--r--data/pixmaps/toolbar/time-real.xpm29
-rw-r--r--data/pixmaps/toolbar/transforms-decounterpoint.xpm33
-rw-r--r--data/pixmaps/toolbar/transforms-tie.xpm33
-rw-r--r--data/pixmaps/toolbar/transport-cursor-to-pointer.pngbin0 -> 403 bytes
-rw-r--r--data/pixmaps/toolbar/transport-cursor-to-pointer.xpm18
-rw-r--r--data/pixmaps/toolbar/transport-ffwd-end.pngbin0 -> 281 bytes
-rw-r--r--data/pixmaps/toolbar/transport-ffwd-end.xpm45
-rw-r--r--data/pixmaps/toolbar/transport-ffwd.pngbin0 -> 361 bytes
-rw-r--r--data/pixmaps/toolbar/transport-ffwd.xpm59
-rw-r--r--data/pixmaps/toolbar/transport-panic.pngbin0 -> 339 bytes
-rw-r--r--data/pixmaps/toolbar/transport-play.pngbin0 -> 223 bytes
-rw-r--r--data/pixmaps/toolbar/transport-play.xpm57
-rw-r--r--data/pixmaps/toolbar/transport-pointer-to-cursor.pngbin0 -> 401 bytes
-rw-r--r--data/pixmaps/toolbar/transport-pointer-to-cursor.xpm28
-rw-r--r--data/pixmaps/toolbar/transport-record.pngbin0 -> 442 bytes
-rw-r--r--data/pixmaps/toolbar/transport-record.xpm72
-rw-r--r--data/pixmaps/toolbar/transport-rewind-end.pngbin0 -> 285 bytes
-rw-r--r--data/pixmaps/toolbar/transport-rewind-end.xpm44
-rw-r--r--data/pixmaps/toolbar/transport-rewind.pngbin0 -> 360 bytes
-rw-r--r--data/pixmaps/toolbar/transport-rewind.xpm58
-rw-r--r--data/pixmaps/toolbar/transport-solo.pngbin0 -> 523 bytes
-rw-r--r--data/pixmaps/toolbar/transport-solo.xpm26
-rw-r--r--data/pixmaps/toolbar/transport-stop.pngbin0 -> 197 bytes
-rw-r--r--data/pixmaps/toolbar/transport-stop.xpm17
-rw-r--r--data/pixmaps/toolbar/transport-tracking.pngbin0 -> 466 bytes
-rw-r--r--data/pixmaps/toolbar/transport-tracking.xpm27
-rw-r--r--data/pixmaps/toolbar/trill.xpm25
-rw-r--r--data/pixmaps/toolbar/triplet.xpm33
-rw-r--r--data/pixmaps/toolbar/turn.xpm22
-rw-r--r--data/pixmaps/toolbar/un-mute-all.pngbin0 -> 465 bytes
-rw-r--r--data/pixmaps/toolbar/un-mute-all.xpm87
-rw-r--r--data/pixmaps/toolbar/up-bow.xpm28
-rw-r--r--data/pixmaps/transport/button-bar-time.pngbin0 -> 140 bytes
-rw-r--r--data/pixmaps/transport/button-bar-time.xpm21
-rw-r--r--data/pixmaps/transport/button-clock.xpm21
-rw-r--r--data/pixmaps/transport/button-ffwd-end.pngbin0 -> 334 bytes
-rw-r--r--data/pixmaps/transport/button-ffwd-end.xpm102
-rw-r--r--data/pixmaps/transport/button-ffwd.pngbin0 -> 343 bytes
-rw-r--r--data/pixmaps/transport/button-ffwd.xpm99
-rw-r--r--data/pixmaps/transport/button-flip-closed.pngbin0 -> 169 bytes
-rw-r--r--data/pixmaps/transport/button-flip-closed.xpm21
-rw-r--r--data/pixmaps/transport/button-flip-open.pngbin0 -> 169 bytes
-rw-r--r--data/pixmaps/transport/button-flip-open.xpm21
-rw-r--r--data/pixmaps/transport/button-from-end.pngbin0 -> 208 bytes
-rw-r--r--data/pixmaps/transport/button-from-end.xpm21
-rw-r--r--data/pixmaps/transport/button-loop-2.pngbin0 -> 1673 bytes
-rw-r--r--data/pixmaps/transport/button-loop-2.xpm56
-rw-r--r--data/pixmaps/transport/button-loop-3.pngbin0 -> 1380 bytes
-rw-r--r--data/pixmaps/transport/button-loop.xpm35
-rw-r--r--data/pixmaps/transport/button-loopend.pngbin0 -> 129 bytes
-rw-r--r--data/pixmaps/transport/button-loopstart.pngbin0 -> 129 bytes
-rw-r--r--data/pixmaps/transport/button-metronome.pngbin0 -> 820 bytes
-rw-r--r--data/pixmaps/transport/button-metronome.xpm52
-rw-r--r--data/pixmaps/transport/button-panic.pngbin0 -> 253 bytes
-rw-r--r--data/pixmaps/transport/button-panic.xpm46
-rw-r--r--data/pixmaps/transport/button-pause.xpm150
-rw-r--r--data/pixmaps/transport/button-play.xpm150
-rw-r--r--data/pixmaps/transport/button-playpause.pngbin0 -> 260 bytes
-rw-r--r--data/pixmaps/transport/button-playpause.xpm58
-rw-r--r--data/pixmaps/transport/button-record.pngbin0 -> 474 bytes
-rw-r--r--data/pixmaps/transport/button-record.xpm58
-rw-r--r--data/pixmaps/transport/button-rewind-end.pngbin0 -> 321 bytes
-rw-r--r--data/pixmaps/transport/button-rewind-end.xpm102
-rw-r--r--data/pixmaps/transport/button-rewind.pngbin0 -> 334 bytes
-rw-r--r--data/pixmaps/transport/button-rewind.xpm99
-rw-r--r--data/pixmaps/transport/button-solo-2.xpm31
-rw-r--r--data/pixmaps/transport/button-solo.pngbin0 -> 422 bytes
-rw-r--r--data/pixmaps/transport/button-solo.xpm45
-rw-r--r--data/pixmaps/transport/button-stop.pngbin0 -> 125 bytes
-rw-r--r--data/pixmaps/transport/button-stop.xpm148
-rw-r--r--data/pixmaps/transport/button-to-end.xpm21
-rw-r--r--data/pixmaps/transport/led--.xpm41
-rw-r--r--data/pixmaps/transport/led-0.xpm41
-rw-r--r--data/pixmaps/transport/led-1.xpm41
-rw-r--r--data/pixmaps/transport/led-2.xpm41
-rw-r--r--data/pixmaps/transport/led-3.xpm41
-rw-r--r--data/pixmaps/transport/led-4.xpm41
-rw-r--r--data/pixmaps/transport/led-5.xpm41
-rw-r--r--data/pixmaps/transport/led-6.xpm41
-rw-r--r--data/pixmaps/transport/led-7.xpm41
-rw-r--r--data/pixmaps/transport/led-8.xpm50
-rw-r--r--data/pixmaps/transport/led-9.xpm41
-rw-r--r--data/pixmaps/transport/led-colon.xpm41
-rw-r--r--data/presets/README26
-rw-r--r--data/presets/presets-editable.conf2754
-rw-r--r--data/presets/presets.xml2010
-rwxr-xr-xdata/presets/regenerate-presets26
-rw-r--r--data/profile/rosegarden.profile.xml55
-rw-r--r--data/styles/Classical.xml17
-rw-r--r--data/styles/Cross.xml8
-rw-r--r--data/styles/Mensural.xml28
-rw-r--r--data/styles/Triangle.xml8
-rw-r--r--docs/CMakeLists.txt4
-rw-r--r--docs/en/headers-and-unicode-lyrics.pngbin0 -> 17799 bytes
-rw-r--r--docs/en/index.docbook6885
-rw-r--r--docs/en/rg-audiofilemanager.pngbin0 -> 24938 bytes
-rw-r--r--docs/en/rg-audiomixer.pngbin0 -> 19107 bytes
-rw-r--r--docs/en/rg-bankeditor.pngbin0 -> 45638 bytes
-rw-r--r--docs/en/rg-button-bar-time.pngbin0 -> 140 bytes
-rw-r--r--docs/en/rg-button-from-end.pngbin0 -> 208 bytes
-rw-r--r--docs/en/rg-clefdialog.pngbin0 -> 8509 bytes
-rw-r--r--docs/en/rg-coda.pngbin0 -> 494 bytes
-rw-r--r--docs/en/rg-colours.pngbin0 -> 18180 bytes
-rw-r--r--docs/en/rg-cursors.pngbin0 -> 64749 bytes
-rw-r--r--docs/en/rg-devicemanager.pngbin0 -> 21215 bytes
-rw-r--r--docs/en/rg-eraser.pngbin0 -> 338 bytes
-rw-r--r--docs/en/rg-eventfilter.pngbin0 -> 18876 bytes
-rw-r--r--docs/en/rg-eventlisteditor.pngbin0 -> 27308 bytes
-rw-r--r--docs/en/rg-gridquantizer.pngbin0 -> 21057 bytes
-rw-r--r--docs/en/rg-guitarchorddialog.pngbin0 -> 24358 bytes
-rw-r--r--docs/en/rg-guitarchordeditordialog.pngbin0 -> 12375 bytes
-rw-r--r--docs/en/rg-ipb-audio.pngbin0 -> 7231 bytes
-rw-r--r--docs/en/rg-ipb-midi.pngbin0 -> 16273 bytes
-rw-r--r--docs/en/rg-ipb-synth.pngbin0 -> 7319 bytes
-rw-r--r--docs/en/rg-keysigdialog.pngbin0 -> 45790 bytes
-rw-r--r--docs/en/rg-loadpreset.pngbin0 -> 31465 bytes
-rw-r--r--docs/en/rg-mainwindow.pngbin0 -> 70699 bytes
-rw-r--r--docs/en/rg-markerloop.pngbin0 -> 1317 bytes
-rw-r--r--docs/en/rg-matrixview.pngbin0 -> 116000 bytes
-rw-r--r--docs/en/rg-metronome.pngbin0 -> 12309 bytes
-rw-r--r--docs/en/rg-midifilter.pngbin0 -> 15348 bytes
-rw-r--r--docs/en/rg-midimixer.pngbin0 -> 38205 bytes
-rw-r--r--docs/en/rg-move.pngbin0 -> 234 bytes
-rw-r--r--docs/en/rg-notation-toolbars.pngbin0 -> 5416 bytes
-rw-r--r--docs/en/rg-notationquantizer.pngbin0 -> 27525 bytes
-rw-r--r--docs/en/rg-notationtools.pngbin0 -> 2359 bytes
-rw-r--r--docs/en/rg-notationview-multipage.pngbin0 -> 109118 bytes
-rw-r--r--docs/en/rg-notationview.pngbin0 -> 58930 bytes
-rw-r--r--docs/en/rg-pastedialog.pngbin0 -> 10593 bytes
-rw-r--r--docs/en/rg-pencil.pngbin0 -> 360 bytes
-rw-r--r--docs/en/rg-percussionmatrix.pngbin0 -> 158607 bytes
-rw-r--r--docs/en/rg-plugin-dialog.pngbin0 -> 14475 bytes
-rw-r--r--docs/en/rg-pluginbuttons.pngbin0 -> 5379 bytes
-rw-r--r--docs/en/rg-plugineditorbutton.pngbin0 -> 7683 bytes
-rwxr-xr-xdocs/en/rg-quickmarker.pngbin0 -> 642 bytes
-rw-r--r--docs/en/rg-rawnoteruler.pngbin0 -> 15997 bytes
-rw-r--r--docs/en/rg-resize.pngbin0 -> 197 bytes
-rw-r--r--docs/en/rg-segmentparameterbox.pngbin0 -> 7418 bytes
-rw-r--r--docs/en/rg-segno.pngbin0 -> 542 bytes
-rw-r--r--docs/en/rg-select.pngbin0 -> 257 bytes
-rw-r--r--docs/en/rg-split.pngbin0 -> 212 bytes
-rw-r--r--docs/en/rg-synthpluginbuttons.pngbin0 -> 5330 bytes
-rw-r--r--docs/en/rg-tempodialog.pngbin0 -> 35749 bytes
-rw-r--r--docs/en/rg-temporuler.pngbin0 -> 1735 bytes
-rw-r--r--docs/en/rg-text-cursor.pngbin0 -> 514 bytes
-rw-r--r--docs/en/rg-textdialog.pngbin0 -> 13507 bytes
-rw-r--r--docs/en/rg-timesigdialog.pngbin0 -> 16188 bytes
-rw-r--r--docs/en/rg-trackbutton-instrumentmenu.pngbin0 -> 19045 bytes
-rw-r--r--docs/en/rg-trackbutton-instruments.pngbin0 -> 13485 bytes
-rw-r--r--docs/en/rg-trackbutton-labels.pngbin0 -> 10850 bytes
-rw-r--r--docs/en/rg-trackbuttons.pngbin0 -> 3985 bytes
-rw-r--r--docs/en/rg-trackeditor.pngbin0 -> 26456 bytes
-rw-r--r--docs/en/rg-trackparameterbox.pngbin0 -> 44311 bytes
-rw-r--r--docs/en/rg-transport.pngbin0 -> 16049 bytes
-rw-r--r--docs/en/rg-triggersegment.pngbin0 -> 8786 bytes
-rw-r--r--docs/en/rg-tupletdialog.pngbin0 -> 11567 bytes
-rw-r--r--docs/en/rg-useornament.pngbin0 -> 12897 bytes
-rw-r--r--docs/en/tips316
-rw-r--r--docs/en/transpose-by-interval.pngbin0 -> 14435 bytes
-rw-r--r--docs/es/index.docbook6416
-rw-r--r--docs/ja/index.docbook5376
-rw-r--r--docs/sv/index.docbook6485
-rw-r--r--docs/sv/rg-audiofilemanager.pngbin0 -> 21743 bytes
-rw-r--r--docs/sv/rg-audiomixer.pngbin0 -> 34305 bytes
-rw-r--r--docs/sv/rg-bankeditor.pngbin0 -> 23849 bytes
-rw-r--r--docs/sv/rg-clefdialog.pngbin0 -> 6633 bytes
-rw-r--r--docs/sv/rg-colours.pngbin0 -> 24156 bytes
-rw-r--r--docs/sv/rg-devicemanager.pngbin0 -> 57985 bytes
-rw-r--r--docs/sv/rg-eventlisteditor.pngbin0 -> 20684 bytes
-rw-r--r--docs/sv/rg-gridquantizer.pngbin0 -> 15464 bytes
-rw-r--r--docs/sv/rg-ipb-audio.pngbin0 -> 2929 bytes
-rw-r--r--docs/sv/rg-ipb-midi.pngbin0 -> 22192 bytes
-rw-r--r--docs/sv/rg-ipb-synth.pngbin0 -> 2779 bytes
-rw-r--r--docs/sv/rg-keysigdialog.pngbin0 -> 13591 bytes
-rw-r--r--docs/sv/rg-mainwindow.pngbin0 -> 44923 bytes
-rw-r--r--docs/sv/rg-matrixview.pngbin0 -> 71223 bytes
-rw-r--r--docs/sv/rg-metronome.pngbin0 -> 6976 bytes
-rw-r--r--docs/sv/rg-midifilter.pngbin0 -> 11975 bytes
-rw-r--r--docs/sv/rg-midimixer.pngbin0 -> 24239 bytes
-rw-r--r--docs/sv/rg-notationquantizer.pngbin0 -> 23467 bytes
-rw-r--r--docs/sv/rg-notationview-multipage.pngbin0 -> 41202 bytes
-rw-r--r--docs/sv/rg-notationview.pngbin0 -> 35393 bytes
-rw-r--r--docs/sv/rg-pastedialog.pngbin0 -> 4808 bytes
-rw-r--r--docs/sv/rg-plugin-dialog.pngbin0 -> 7219 bytes
-rw-r--r--docs/sv/rg-pluginbuttons.pngbin0 -> 2352 bytes
-rw-r--r--docs/sv/rg-plugineditorbutton.pngbin0 -> 13499 bytes
-rw-r--r--docs/sv/rg-segmentparameterbox.pngbin0 -> 4134 bytes
-rw-r--r--docs/sv/rg-synthpluginbuttons.pngbin0 -> 2108 bytes
-rw-r--r--docs/sv/rg-tempodialog.pngbin0 -> 17554 bytes
-rw-r--r--docs/sv/rg-timesigdialog.pngbin0 -> 10169 bytes
-rw-r--r--docs/sv/rg-trackbutton-instruments.pngbin0 -> 2476 bytes
-rw-r--r--docs/sv/rg-trackbutton-labels.pngbin0 -> 2409 bytes
-rw-r--r--docs/sv/rg-trackeditor.pngbin0 -> 45815 bytes
-rw-r--r--docs/sv/rg-transport.pngbin0 -> 15430 bytes
-rw-r--r--docs/sv/rg-tupletdialog.pngbin0 -> 9131 bytes
-rw-r--r--docs/sv/rosegarden.po7454
-rw-r--r--po/CMakeLists.txt25
-rw-r--r--po/ca.po12380
-rw-r--r--po/cs.po11518
-rw-r--r--po/cy.po13229
-rw-r--r--po/de.po12067
-rw-r--r--po/en.po10792
-rw-r--r--po/en_GB.po10812
-rw-r--r--po/es.po11539
-rw-r--r--po/et.po11992
-rw-r--r--po/eu.po12021
-rw-r--r--po/fi.po11490
-rw-r--r--po/fr.po11600
-rw-r--r--po/it.po11473
-rw-r--r--po/ja.po11185
-rwxr-xr-xpo/messages.sh101
-rw-r--r--po/nl.po11475
-rw-r--r--po/pl.po12061
-rw-r--r--po/rosegarden.pot10794
-rw-r--r--po/ru.po11895
-rw-r--r--po/sv.po12124
-rwxr-xr-xpo/xgettextbin0 -> 203776 bytes
-rw-r--r--po/zh_CN.po12572
-rw-r--r--rosegarden.lsm14
-rw-r--r--rosegarden.spec209
-rw-r--r--rosegarden.spec.in209
-rw-r--r--src/BaseFileList.txt102
-rw-r--r--src/CMakeLists.txt208
-rw-r--r--src/GUIFileList.txt975
-rw-r--r--src/MiscFileList.txt6
-rw-r--r--src/SequencerFileList.txt17
-rw-r--r--src/SoundFileList.txt98
-rw-r--r--src/TestFileList.txt6
-rw-r--r--src/base/AnalysisTypes.cpp1118
-rw-r--r--src/base/AnalysisTypes.h227
-rw-r--r--src/base/AudioDevice.cpp107
-rw-r--r--src/base/AudioDevice.h70
-rw-r--r--src/base/AudioLevel.cpp272
-rw-r--r--src/base/AudioLevel.h67
-rw-r--r--src/base/AudioPluginInstance.cpp256
-rw-r--r--src/base/AudioPluginInstance.h172
-rw-r--r--src/base/BaseProperties.cpp133
-rw-r--r--src/base/BaseProperties.h82
-rw-r--r--src/base/BasicQuantizer.cpp253
-rw-r--r--src/base/BasicQuantizer.h95
-rw-r--r--src/base/Clipboard.cpp387
-rw-r--r--src/base/Clipboard.h203
-rw-r--r--src/base/Colour.cpp175
-rw-r--r--src/base/Colour.h125
-rw-r--r--src/base/ColourMap.cpp266
-rw-r--r--src/base/ColourMap.h138
-rw-r--r--src/base/Composition.cpp2225
-rw-r--r--src/base/Composition.h1134
-rw-r--r--src/base/CompositionTimeSliceAdapter.cpp283
-rw-r--r--src/base/CompositionTimeSliceAdapter.h149
-rw-r--r--src/base/Configuration.cpp232
-rw-r--r--src/base/Configuration.h211
-rw-r--r--src/base/ControlParameter.cpp144
-rw-r--r--src/base/ControlParameter.h124
-rw-r--r--src/base/Controllable.h48
-rw-r--r--src/base/Device.cpp31
-rw-r--r--src/base/Device.h102
-rw-r--r--src/base/Equation.cpp69
-rw-r--r--src/base/Equation.h51
-rw-r--r--src/base/Event.cpp445
-rw-r--r--src/base/Event.h584
-rw-r--r--src/base/Exception.cpp46
-rw-r--r--src/base/Exception.h47
-rw-r--r--src/base/FastVector.h596
-rw-r--r--src/base/Instrument.cpp645
-rw-r--r--src/base/Instrument.h349
-rw-r--r--src/base/LayoutEngine.cpp63
-rw-r--r--src/base/LayoutEngine.h161
-rw-r--r--src/base/LegatoQuantizer.cpp141
-rw-r--r--src/base/LegatoQuantizer.h64
-rw-r--r--src/base/Marker.cpp55
-rw-r--r--src/base/Marker.h78
-rw-r--r--src/base/MidiDevice.cpp839
-rw-r--r--src/base/MidiDevice.h213
-rw-r--r--src/base/MidiProgram.cpp224
-rw-r--r--src/base/MidiProgram.h180
-rw-r--r--src/base/MidiTypes.cpp320
-rw-r--r--src/base/MidiTypes.h224
-rw-r--r--src/base/NotationQuantizer.cpp1205
-rw-r--r--src/base/NotationQuantizer.h93
-rw-r--r--src/base/NotationRules.h133
-rw-r--r--src/base/NotationTypes.cpp2436
-rw-r--r--src/base/NotationTypes.h1342
-rw-r--r--src/base/Profiler.cpp187
-rw-r--r--src/base/Profiler.h84
-rw-r--r--src/base/Property.cpp169
-rw-r--r--src/base/Property.h225
-rw-r--r--src/base/PropertyMap.cpp101
-rw-r--r--src/base/PropertyMap.h50
-rw-r--r--src/base/PropertyName.cpp86
-rw-r--r--src/base/PropertyName.h158
-rw-r--r--src/base/Quantizer.cpp496
-rw-r--r--src/base/Quantizer.h249
-rw-r--r--src/base/RealTime.cpp236
-rw-r--r--src/base/RealTime.h124
-rw-r--r--src/base/RefreshStatus.h76
-rw-r--r--src/base/RulerScale.cpp243
-rw-r--r--src/base/RulerScale.h166
-rw-r--r--src/base/ScriptAPI.cpp85
-rw-r--r--src/base/ScriptAPI.h128
-rw-r--r--src/base/Segment.cpp1294
-rw-r--r--src/base/Segment.h783
-rw-r--r--src/base/SegmentMatrixHelper.cpp56
-rw-r--r--src/base/SegmentMatrixHelper.h53
-rw-r--r--src/base/SegmentNotationHelper.cpp2129
-rw-r--r--src/base/SegmentNotationHelper.h591
-rw-r--r--src/base/SegmentPerformanceHelper.cpp472
-rw-r--r--src/base/SegmentPerformanceHelper.h126
-rw-r--r--src/base/Selection.cpp318
-rw-r--r--src/base/Selection.h263
-rw-r--r--src/base/Sets.cpp108
-rw-r--r--src/base/Sets.h698
-rw-r--r--src/base/SnapGrid.cpp192
-rw-r--r--src/base/SnapGrid.h183
-rw-r--r--src/base/SoftSynthDevice.cpp174
-rw-r--r--src/base/SoftSynthDevice.h70
-rw-r--r--src/base/Staff.cpp213
-rw-r--r--src/base/Staff.h149
-rw-r--r--src/base/StaffExportTypes.h75
-rw-r--r--src/base/Studio.cpp674
-rw-r--r--src/base/Studio.h208
-rw-r--r--src/base/Track.cpp201
-rw-r--r--src/base/Track.h162
-rw-r--r--src/base/TriggerSegment.cpp130
-rw-r--r--src/base/TriggerSegment.h100
-rw-r--r--src/base/ViewElement.cpp172
-rw-r--r--src/base/ViewElement.h164
-rw-r--r--src/base/XmlExportable.cpp197
-rw-r--r--src/base/XmlExportable.h55
-rw-r--r--src/base/test/Makefile57
-rw-r--r--src/base/test/accidentals.cpp60
-rw-r--r--src/base/test/colour.cpp222
-rw-r--r--src/base/test/colour.output76
-rw-r--r--src/base/test/pitch.cpp474
-rw-r--r--src/base/test/seq/Makefile6
-rw-r--r--src/base/test/seq/complainer.c74
-rw-r--r--src/base/test/seq/generator.c96
-rw-r--r--src/base/test/seq/queue-timer-jack.c166
-rw-r--r--src/base/test/seq/queue-timer.c123
-rw-r--r--src/base/test/test.cpp535
-rw-r--r--src/base/test/thread.cpp126
-rw-r--r--src/base/test/transpose.cpp83
-rw-r--r--src/base/test/utf8.cpp96
-rw-r--r--src/commands/edit/AddDotCommand.cpp98
-rw-r--r--src/commands/edit/AddDotCommand.h68
-rw-r--r--src/commands/edit/AddMarkerCommand.cpp67
-rw-r--r--src/commands/edit/AddMarkerCommand.h71
-rw-r--r--src/commands/edit/ChangeVelocityCommand.cpp68
-rw-r--r--src/commands/edit/ChangeVelocityCommand.h68
-rw-r--r--src/commands/edit/ClearTriggersCommand.cpp53
-rw-r--r--src/commands/edit/ClearTriggersCommand.h66
-rw-r--r--src/commands/edit/CollapseNotesCommand.cpp79
-rw-r--r--src/commands/edit/CollapseNotesCommand.h65
-rw-r--r--src/commands/edit/CopyCommand.cpp120
-rw-r--r--src/commands/edit/CopyCommand.h82
-rw-r--r--src/commands/edit/CutAndCloseCommand.cpp163
-rw-r--r--src/commands/edit/CutAndCloseCommand.h82
-rw-r--r--src/commands/edit/CutCommand.cpp59
-rw-r--r--src/commands/edit/CutCommand.h62
-rw-r--r--src/commands/edit/EraseCommand.cpp86
-rw-r--r--src/commands/edit/EraseCommand.h66
-rw-r--r--src/commands/edit/EventEditCommand.cpp64
-rw-r--r--src/commands/edit/EventEditCommand.h69
-rw-r--r--src/commands/edit/EventInsertionCommand.cpp58
-rw-r--r--src/commands/edit/EventInsertionCommand.h62
-rw-r--r--src/commands/edit/EventQuantizeCommand.cpp273
-rw-r--r--src/commands/edit/EventQuantizeCommand.h98
-rw-r--r--src/commands/edit/EventUnquantizeCommand.cpp106
-rw-r--r--src/commands/edit/EventUnquantizeCommand.h73
-rw-r--r--src/commands/edit/InsertTriggerNoteCommand.cpp132
-rw-r--r--src/commands/edit/InsertTriggerNoteCommand.h78
-rw-r--r--src/commands/edit/InvertCommand.cpp85
-rw-r--r--src/commands/edit/InvertCommand.h67
-rw-r--r--src/commands/edit/ModifyMarkerCommand.cpp95
-rw-r--r--src/commands/edit/ModifyMarkerCommand.h78
-rw-r--r--src/commands/edit/MoveAcrossSegmentsCommand.cpp76
-rw-r--r--src/commands/edit/MoveAcrossSegmentsCommand.h63
-rw-r--r--src/commands/edit/MoveCommand.cpp159
-rw-r--r--src/commands/edit/MoveCommand.h69
-rw-r--r--src/commands/edit/PasteEventsCommand.cpp321
-rw-r--r--src/commands/edit/PasteEventsCommand.h112
-rw-r--r--src/commands/edit/PasteSegmentsCommand.cpp153
-rw-r--r--src/commands/edit/PasteSegmentsCommand.h79
-rw-r--r--src/commands/edit/RemoveMarkerCommand.cpp83
-rw-r--r--src/commands/edit/RemoveMarkerCommand.h75
-rw-r--r--src/commands/edit/RescaleCommand.cpp138
-rw-r--r--src/commands/edit/RescaleCommand.h71
-rw-r--r--src/commands/edit/RetrogradeCommand.cpp121
-rw-r--r--src/commands/edit/RetrogradeCommand.h67
-rw-r--r--src/commands/edit/RetrogradeInvertCommand.cpp163
-rw-r--r--src/commands/edit/RetrogradeInvertCommand.h67
-rw-r--r--src/commands/edit/SelectionPropertyCommand.cpp128
-rw-r--r--src/commands/edit/SelectionPropertyCommand.h82
-rw-r--r--src/commands/edit/SetLyricsCommand.cpp192
-rw-r--r--src/commands/edit/SetLyricsCommand.h66
-rw-r--r--src/commands/edit/SetNoteTypeCommand.cpp87
-rw-r--r--src/commands/edit/SetNoteTypeCommand.h72
-rw-r--r--src/commands/edit/SetTriggerCommand.cpp74
-rw-r--r--src/commands/edit/SetTriggerCommand.h83
-rw-r--r--src/commands/edit/TransposeCommand.cpp83
-rw-r--r--src/commands/edit/TransposeCommand.h83
-rw-r--r--src/commands/matrix/MatrixEraseCommand.cpp70
-rw-r--r--src/commands/matrix/MatrixEraseCommand.h62
-rw-r--r--src/commands/matrix/MatrixInsertionCommand.cpp74
-rw-r--r--src/commands/matrix/MatrixInsertionCommand.h64
-rw-r--r--src/commands/matrix/MatrixModifyCommand.cpp81
-rw-r--r--src/commands/matrix/MatrixModifyCommand.h63
-rw-r--r--src/commands/matrix/MatrixPercussionInsertionCommand.cpp192
-rw-r--r--src/commands/matrix/MatrixPercussionInsertionCommand.h73
-rw-r--r--src/commands/notation/AddFingeringMarkCommand.cpp119
-rw-r--r--src/commands/notation/AddFingeringMarkCommand.h64
-rw-r--r--src/commands/notation/AddIndicationCommand.cpp171
-rw-r--r--src/commands/notation/AddIndicationCommand.h76
-rw-r--r--src/commands/notation/AddMarkCommand.cpp112
-rw-r--r--src/commands/notation/AddMarkCommand.h63
-rw-r--r--src/commands/notation/AddSlashesCommand.cpp53
-rw-r--r--src/commands/notation/AddSlashesCommand.h60
-rw-r--r--src/commands/notation/AddTextMarkCommand.cpp58
-rw-r--r--src/commands/notation/AddTextMarkCommand.h65
-rw-r--r--src/commands/notation/AutoBeamCommand.cpp48
-rw-r--r--src/commands/notation/AutoBeamCommand.h62
-rw-r--r--src/commands/notation/BeamCommand.cpp58
-rw-r--r--src/commands/notation/BeamCommand.h60
-rw-r--r--src/commands/notation/BreakCommand.cpp54
-rw-r--r--src/commands/notation/BreakCommand.h60
-rw-r--r--src/commands/notation/ChangeSlurPositionCommand.cpp58
-rw-r--r--src/commands/notation/ChangeSlurPositionCommand.h66
-rw-r--r--src/commands/notation/ChangeStemsCommand.cpp53
-rw-r--r--src/commands/notation/ChangeStemsCommand.h66
-rw-r--r--src/commands/notation/ChangeStyleCommand.cpp66
-rw-r--r--src/commands/notation/ChangeStyleCommand.h70
-rw-r--r--src/commands/notation/ChangeTiePositionCommand.cpp54
-rw-r--r--src/commands/notation/ChangeTiePositionCommand.h62
-rw-r--r--src/commands/notation/ClefInsertionCommand.cpp137
-rw-r--r--src/commands/notation/ClefInsertionCommand.h72
-rw-r--r--src/commands/notation/CollapseRestsCommand.cpp54
-rw-r--r--src/commands/notation/CollapseRestsCommand.h63
-rw-r--r--src/commands/notation/DeCounterpointCommand.cpp57
-rw-r--r--src/commands/notation/DeCounterpointCommand.h68
-rw-r--r--src/commands/notation/EraseEventCommand.cpp105
-rw-r--r--src/commands/notation/EraseEventCommand.h71
-rw-r--r--src/commands/notation/FixNotationQuantizeCommand.cpp87
-rw-r--r--src/commands/notation/FixNotationQuantizeCommand.h61
-rw-r--r--src/commands/notation/GraceCommand.cpp115
-rw-r--r--src/commands/notation/GraceCommand.h60
-rw-r--r--src/commands/notation/GuitarChordInsertionCommand.cpp59
-rw-r--r--src/commands/notation/GuitarChordInsertionCommand.h61
-rw-r--r--src/commands/notation/IncrementDisplacementsCommand.cpp57
-rw-r--r--src/commands/notation/IncrementDisplacementsCommand.h66
-rw-r--r--src/commands/notation/InterpretCommand.cpp602
-rw-r--r--src/commands/notation/InterpretCommand.h100
-rw-r--r--src/commands/notation/KeyInsertionCommand.cpp264
-rw-r--r--src/commands/notation/KeyInsertionCommand.h91
-rw-r--r--src/commands/notation/MakeAccidentalsCautionaryCommand.cpp68
-rw-r--r--src/commands/notation/MakeAccidentalsCautionaryCommand.h63
-rw-r--r--src/commands/notation/MakeChordCommand.cpp75
-rw-r--r--src/commands/notation/MakeChordCommand.h66
-rw-r--r--src/commands/notation/MakeNotesViableCommand.cpp57
-rw-r--r--src/commands/notation/MakeNotesViableCommand.h67
-rw-r--r--src/commands/notation/MakeRegionViableCommand.cpp48
-rw-r--r--src/commands/notation/MakeRegionViableCommand.h62
-rw-r--r--src/commands/notation/MultiKeyInsertionCommand.cpp80
-rw-r--r--src/commands/notation/MultiKeyInsertionCommand.h73
-rw-r--r--src/commands/notation/NormalizeRestsCommand.cpp52
-rw-r--r--src/commands/notation/NormalizeRestsCommand.h64
-rw-r--r--src/commands/notation/NoteInsertionCommand.cpp296
-rw-r--r--src/commands/notation/NoteInsertionCommand.h98
-rw-r--r--src/commands/notation/RemoveFingeringMarksCommand.cpp54
-rw-r--r--src/commands/notation/RemoveFingeringMarksCommand.h61
-rw-r--r--src/commands/notation/RemoveMarksCommand.cpp58
-rw-r--r--src/commands/notation/RemoveMarksCommand.h61
-rw-r--r--src/commands/notation/RemoveNotationQuantizeCommand.cpp69
-rw-r--r--src/commands/notation/RemoveNotationQuantizeCommand.h61
-rw-r--r--src/commands/notation/ResetDisplacementsCommand.cpp52
-rw-r--r--src/commands/notation/ResetDisplacementsCommand.h61
-rw-r--r--src/commands/notation/RespellCommand.cpp141
-rw-r--r--src/commands/notation/RespellCommand.h72
-rw-r--r--src/commands/notation/RestInsertionCommand.cpp65
-rw-r--r--src/commands/notation/RestInsertionCommand.h58
-rw-r--r--src/commands/notation/RestoreSlursCommand.cpp58
-rw-r--r--src/commands/notation/RestoreSlursCommand.h62
-rw-r--r--src/commands/notation/RestoreStemsCommand.cpp52
-rw-r--r--src/commands/notation/RestoreStemsCommand.h62
-rw-r--r--src/commands/notation/RestoreTiesCommand.cpp51
-rw-r--r--src/commands/notation/RestoreTiesCommand.h62
-rw-r--r--src/commands/notation/SetVisibilityCommand.cpp57
-rw-r--r--src/commands/notation/SetVisibilityCommand.h63
-rw-r--r--src/commands/notation/SustainInsertionCommand.cpp66
-rw-r--r--src/commands/notation/SustainInsertionCommand.h76
-rw-r--r--src/commands/notation/TextChangeCommand.cpp62
-rw-r--r--src/commands/notation/TextChangeCommand.h63
-rw-r--r--src/commands/notation/TextInsertionCommand.cpp63
-rw-r--r--src/commands/notation/TextInsertionCommand.h63
-rw-r--r--src/commands/notation/TieNotesCommand.cpp72
-rw-r--r--src/commands/notation/TieNotesCommand.h62
-rw-r--r--src/commands/notation/TupletCommand.cpp91
-rw-r--r--src/commands/notation/TupletCommand.h71
-rw-r--r--src/commands/notation/UnGraceCommand.cpp42
-rw-r--r--src/commands/notation/UnGraceCommand.h58
-rw-r--r--src/commands/notation/UnTupletCommand.cpp54
-rw-r--r--src/commands/notation/UnTupletCommand.h62
-rw-r--r--src/commands/notation/UntieNotesCommand.cpp52
-rw-r--r--src/commands/notation/UntieNotesCommand.h62
-rw-r--r--src/commands/segment/AddTempoChangeCommand.cpp66
-rw-r--r--src/commands/segment/AddTempoChangeCommand.h76
-rw-r--r--src/commands/segment/AddTimeSignatureAndNormalizeCommand.cpp78
-rw-r--r--src/commands/segment/AddTimeSignatureAndNormalizeCommand.h53
-rw-r--r--src/commands/segment/AddTimeSignatureCommand.cpp78
-rw-r--r--src/commands/segment/AddTimeSignatureCommand.h71
-rw-r--r--src/commands/segment/AddTracksCommand.cpp137
-rw-r--r--src/commands/segment/AddTracksCommand.h77
-rw-r--r--src/commands/segment/AddTriggerSegmentCommand.cpp90
-rw-r--r--src/commands/segment/AddTriggerSegmentCommand.h72
-rw-r--r--src/commands/segment/AudioSegmentAutoSplitCommand.cpp191
-rw-r--r--src/commands/segment/AudioSegmentAutoSplitCommand.h71
-rw-r--r--src/commands/segment/AudioSegmentDistributeCommand.cpp156
-rw-r--r--src/commands/segment/AudioSegmentDistributeCommand.h86
-rw-r--r--src/commands/segment/AudioSegmentInsertCommand.cpp136
-rw-r--r--src/commands/segment/AudioSegmentInsertCommand.h77
-rw-r--r--src/commands/segment/AudioSegmentRescaleCommand.cpp210
-rw-r--r--src/commands/segment/AudioSegmentRescaleCommand.h81
-rw-r--r--src/commands/segment/AudioSegmentResizeFromStartCommand.cpp87
-rw-r--r--src/commands/segment/AudioSegmentResizeFromStartCommand.h66
-rw-r--r--src/commands/segment/AudioSegmentSplitCommand.cpp155
-rw-r--r--src/commands/segment/AudioSegmentSplitCommand.h65
-rw-r--r--src/commands/segment/ChangeCompositionLengthCommand.cpp64
-rw-r--r--src/commands/segment/ChangeCompositionLengthCommand.h70
-rw-r--r--src/commands/segment/CreateTempoMapFromSegmentCommand.cpp166
-rw-r--r--src/commands/segment/CreateTempoMapFromSegmentCommand.h69
-rw-r--r--src/commands/segment/CutRangeCommand.cpp47
-rw-r--r--src/commands/segment/CutRangeCommand.h53
-rw-r--r--src/commands/segment/DeleteRangeCommand.cpp127
-rw-r--r--src/commands/segment/DeleteRangeCommand.h84
-rw-r--r--src/commands/segment/DeleteTracksCommand.cpp161
-rw-r--r--src/commands/segment/DeleteTracksCommand.h68
-rw-r--r--src/commands/segment/DeleteTriggerSegmentCommand.cpp78
-rw-r--r--src/commands/segment/DeleteTriggerSegmentCommand.h66
-rw-r--r--src/commands/segment/EraseSegmentsStartingInRangeCommand.cpp99
-rw-r--r--src/commands/segment/EraseSegmentsStartingInRangeCommand.h67
-rw-r--r--src/commands/segment/InsertRangeCommand.cpp63
-rw-r--r--src/commands/segment/InsertRangeCommand.h47
-rw-r--r--src/commands/segment/ModifyDefaultTempoCommand.cpp48
-rw-r--r--src/commands/segment/ModifyDefaultTempoCommand.h66
-rw-r--r--src/commands/segment/MoveTracksCommand.cpp76
-rw-r--r--src/commands/segment/MoveTracksCommand.h66
-rw-r--r--src/commands/segment/OpenOrCloseRangeCommand.cpp181
-rw-r--r--src/commands/segment/OpenOrCloseRangeCommand.h84
-rw-r--r--src/commands/segment/PasteConductorDataCommand.cpp128
-rw-r--r--src/commands/segment/PasteConductorDataCommand.h67
-rw-r--r--src/commands/segment/PasteRangeCommand.cpp97
-rw-r--r--src/commands/segment/PasteRangeCommand.h52
-rw-r--r--src/commands/segment/PasteToTriggerSegmentCommand.cpp129
-rw-r--r--src/commands/segment/PasteToTriggerSegmentCommand.h73
-rw-r--r--src/commands/segment/RemoveTempoChangeCommand.cpp59
-rw-r--r--src/commands/segment/RemoveTempoChangeCommand.h75
-rw-r--r--src/commands/segment/RemoveTimeSignatureCommand.cpp60
-rw-r--r--src/commands/segment/RemoveTimeSignatureCommand.h74
-rw-r--r--src/commands/segment/RenameTrackCommand.cpp75
-rw-r--r--src/commands/segment/RenameTrackCommand.h67
-rw-r--r--src/commands/segment/SegmentAutoSplitCommand.cpp205
-rw-r--r--src/commands/segment/SegmentAutoSplitCommand.h66
-rw-r--r--src/commands/segment/SegmentChangePlayableRangeCommand.cpp77
-rw-r--r--src/commands/segment/SegmentChangePlayableRangeCommand.h67
-rw-r--r--src/commands/segment/SegmentChangeQuantizationCommand.cpp115
-rw-r--r--src/commands/segment/SegmentChangeQuantizationCommand.h73
-rw-r--r--src/commands/segment/SegmentChangeTransposeCommand.cpp72
-rw-r--r--src/commands/segment/SegmentChangeTransposeCommand.h65
-rw-r--r--src/commands/segment/SegmentColourCommand.cpp65
-rw-r--r--src/commands/segment/SegmentColourCommand.h66
-rw-r--r--src/commands/segment/SegmentColourMapCommand.cpp64
-rw-r--r--src/commands/segment/SegmentColourMapCommand.h71
-rw-r--r--src/commands/segment/SegmentCommand.cpp42
-rw-r--r--src/commands/segment/SegmentCommand.h59
-rw-r--r--src/commands/segment/SegmentCommandRepeat.cpp59
-rw-r--r--src/commands/segment/SegmentCommandRepeat.h81
-rw-r--r--src/commands/segment/SegmentEraseCommand.cpp108
-rw-r--r--src/commands/segment/SegmentEraseCommand.h70
-rw-r--r--src/commands/segment/SegmentInsertCommand.cpp124
-rw-r--r--src/commands/segment/SegmentInsertCommand.h76
-rw-r--r--src/commands/segment/SegmentJoinCommand.cpp175
-rw-r--r--src/commands/segment/SegmentJoinCommand.h65
-rw-r--r--src/commands/segment/SegmentLabelCommand.cpp73
-rw-r--r--src/commands/segment/SegmentLabelCommand.h67
-rw-r--r--src/commands/segment/SegmentQuickCopyCommand.cpp71
-rw-r--r--src/commands/segment/SegmentQuickCopyCommand.h68
-rw-r--r--src/commands/segment/SegmentReconfigureCommand.cpp114
-rw-r--r--src/commands/segment/SegmentReconfigureCommand.h81
-rw-r--r--src/commands/segment/SegmentRecordCommand.cpp67
-rw-r--r--src/commands/segment/SegmentRecordCommand.h67
-rw-r--r--src/commands/segment/SegmentRepeatToCopyCommand.cpp106
-rw-r--r--src/commands/segment/SegmentRepeatToCopyCommand.h62
-rw-r--r--src/commands/segment/SegmentRescaleCommand.cpp148
-rw-r--r--src/commands/segment/SegmentRescaleCommand.h76
-rw-r--r--src/commands/segment/SegmentResizeFromStartCommand.cpp85
-rw-r--r--src/commands/segment/SegmentResizeFromStartCommand.h69
-rw-r--r--src/commands/segment/SegmentSingleRepeatToCopyCommand.cpp73
-rw-r--r--src/commands/segment/SegmentSingleRepeatToCopyCommand.h65
-rw-r--r--src/commands/segment/SegmentSplitByPitchCommand.cpp280
-rw-r--r--src/commands/segment/SegmentSplitByPitchCommand.h83
-rw-r--r--src/commands/segment/SegmentSplitByRecordingSrcCommand.cpp153
-rw-r--r--src/commands/segment/SegmentSplitByRecordingSrcCommand.h70
-rw-r--r--src/commands/segment/SegmentSplitCommand.cpp185
-rw-r--r--src/commands/segment/SegmentSplitCommand.h65
-rw-r--r--src/commands/segment/SegmentSyncClefCommand.cpp67
-rw-r--r--src/commands/segment/SegmentSyncClefCommand.h55
-rw-r--r--src/commands/segment/SegmentSyncCommand.cpp103
-rw-r--r--src/commands/segment/SegmentSyncCommand.h66
-rw-r--r--src/commands/segment/SegmentTransposeCommand.cpp123
-rw-r--r--src/commands/segment/SegmentTransposeCommand.h64
-rw-r--r--src/commands/segment/SetTriggerSegmentBasePitchCommand.cpp74
-rw-r--r--src/commands/segment/SetTriggerSegmentBasePitchCommand.h63
-rw-r--r--src/commands/segment/SetTriggerSegmentBaseVelocityCommand.cpp74
-rw-r--r--src/commands/segment/SetTriggerSegmentBaseVelocityCommand.h63
-rw-r--r--src/commands/segment/SetTriggerSegmentDefaultRetuneCommand.cpp75
-rw-r--r--src/commands/segment/SetTriggerSegmentDefaultRetuneCommand.h64
-rw-r--r--src/commands/segment/SetTriggerSegmentDefaultTimeAdjustCommand.cpp74
-rw-r--r--src/commands/segment/SetTriggerSegmentDefaultTimeAdjustCommand.h64
-rw-r--r--src/commands/studio/AddControlParameterCommand.cpp75
-rw-r--r--src/commands/studio/AddControlParameterCommand.h75
-rw-r--r--src/commands/studio/CreateOrDeleteDeviceCommand.cpp161
-rw-r--r--src/commands/studio/CreateOrDeleteDeviceCommand.h88
-rw-r--r--src/commands/studio/ModifyControlParameterCommand.cpp75
-rw-r--r--src/commands/studio/ModifyControlParameterCommand.h74
-rw-r--r--src/commands/studio/ModifyDeviceCommand.cpp198
-rw-r--r--src/commands/studio/ModifyDeviceCommand.h109
-rw-r--r--src/commands/studio/ModifyDeviceMappingCommand.cpp147
-rw-r--r--src/commands/studio/ModifyDeviceMappingCommand.h71
-rw-r--r--src/commands/studio/ModifyInstrumentMappingCommand.cpp78
-rw-r--r--src/commands/studio/ModifyInstrumentMappingCommand.h76
-rw-r--r--src/commands/studio/ReconnectDeviceCommand.cpp98
-rw-r--r--src/commands/studio/ReconnectDeviceCommand.h70
-rw-r--r--src/commands/studio/RemoveControlParameterCommand.cpp75
-rw-r--r--src/commands/studio/RemoveControlParameterCommand.h73
-rw-r--r--src/commands/studio/RenameDeviceCommand.cpp52
-rw-r--r--src/commands/studio/RenameDeviceCommand.h71
-rw-r--r--src/document/BasicCommand.cpp171
-rw-r--r--src/document/BasicCommand.h112
-rw-r--r--src/document/BasicSelectionCommand.cpp66
-rw-r--r--src/document/BasicSelectionCommand.h67
-rw-r--r--src/document/ConfigGroups.cpp53
-rw-r--r--src/document/ConfigGroups.h56
-rw-r--r--src/document/MultiViewCommandHistory.cpp386
-rw-r--r--src/document/MultiViewCommandHistory.h152
-rw-r--r--src/document/RoseXmlHandler.cpp2368
-rw-r--r--src/document/RoseXmlHandler.h192
-rw-r--r--src/document/RosegardenGUIDoc.cpp3117
-rw-r--r--src/document/RosegardenGUIDoc.h733
-rw-r--r--src/document/XmlStorableEvent.cpp188
-rw-r--r--src/document/XmlStorableEvent.h75
-rw-r--r--src/document/XmlSubHandler.cpp37
-rw-r--r--src/document/XmlSubHandler.h58
-rw-r--r--src/document/io/CsoundExporter.cpp154
-rw-r--r--src/document/io/CsoundExporter.h63
-rw-r--r--src/document/io/HydrogenLoader.cpp74
-rw-r--r--src/document/io/HydrogenLoader.h83
-rw-r--r--src/document/io/HydrogenXMLHandler.cpp403
-rw-r--r--src/document/io/HydrogenXMLHandler.h132
-rw-r--r--src/document/io/LilyPondExporter.cpp2419
-rw-r--r--src/document/io/LilyPondExporter.h262
-rw-r--r--src/document/io/MupExporter.cpp453
-rw-r--r--src/document/io/MupExporter.h89
-rw-r--r--src/document/io/MusicXmlExporter.cpp555
-rw-r--r--src/document/io/MusicXmlExporter.h87
-rw-r--r--src/document/io/RG21Loader.cpp797
-rw-r--r--src/document/io/RG21Loader.h162
-rw-r--r--src/gui/application/LircClient.cpp100
-rw-r--r--src/gui/application/LircClient.h71
-rw-r--r--src/gui/application/LircCommander.cpp170
-rw-r--r--src/gui/application/LircCommander.h112
-rw-r--r--src/gui/application/RosegardenApplication.cpp145
-rw-r--r--src/gui/application/RosegardenApplication.h97
-rw-r--r--src/gui/application/RosegardenDCOP.h50
-rw-r--r--src/gui/application/RosegardenGUIApp.cpp8073
-rw-r--r--src/gui/application/RosegardenGUIApp.cpp.orig8043
-rw-r--r--src/gui/application/RosegardenGUIApp.h1691
-rw-r--r--src/gui/application/RosegardenGUIView.cpp2041
-rw-r--r--src/gui/application/RosegardenGUIView.h347
-rw-r--r--src/gui/application/RosegardenIface.cpp82
-rw-r--r--src/gui/application/RosegardenIface.h130
-rw-r--r--src/gui/application/SetWaitCursor.cpp95
-rw-r--r--src/gui/application/SetWaitCursor.h58
-rw-r--r--src/gui/application/StartupTester.cpp248
-rw-r--r--src/gui/application/StartupTester.h88
-rw-r--r--src/gui/application/main.cpp741
-rw-r--r--src/gui/configuration/AudioConfigurationPage.cpp323
-rw-r--r--src/gui/configuration/AudioConfigurationPage.h107
-rw-r--r--src/gui/configuration/AudioPropertiesPage.cpp184
-rw-r--r--src/gui/configuration/AudioPropertiesPage.h89
-rw-r--r--src/gui/configuration/ColourConfigurationPage.cpp165
-rw-r--r--src/gui/configuration/ColourConfigurationPage.h87
-rw-r--r--src/gui/configuration/ConfigurationPage.cpp37
-rw-r--r--src/gui/configuration/ConfigurationPage.h104
-rw-r--r--src/gui/configuration/DocumentMetaConfigurationPage.cpp366
-rw-r--r--src/gui/configuration/DocumentMetaConfigurationPage.h76
-rw-r--r--src/gui/configuration/GeneralConfigurationPage.cpp429
-rw-r--r--src/gui/configuration/GeneralConfigurationPage.h116
-rw-r--r--src/gui/configuration/HeadersConfigurationPage.cpp294
-rw-r--r--src/gui/configuration/HeadersConfigurationPage.h80
-rw-r--r--src/gui/configuration/LatencyConfigurationPage.cpp157
-rw-r--r--src/gui/configuration/LatencyConfigurationPage.h87
-rw-r--r--src/gui/configuration/MIDIConfigurationPage.cpp400
-rw-r--r--src/gui/configuration/MIDIConfigurationPage.h104
-rw-r--r--src/gui/configuration/MatrixConfigurationPage.cpp68
-rw-r--r--src/gui/configuration/MatrixConfigurationPage.h69
-rw-r--r--src/gui/configuration/NotationConfigurationPage.cpp741
-rw-r--r--src/gui/configuration/NotationConfigurationPage.h117
-rw-r--r--src/gui/configuration/TabbedConfigurationPage.cpp79
-rw-r--r--src/gui/configuration/TabbedConfigurationPage.h78
-rw-r--r--src/gui/dialogs/AddTracksDialog.cpp110
-rw-r--r--src/gui/dialogs/AddTracksDialog.h57
-rw-r--r--src/gui/dialogs/AudioManagerDialog.cpp1257
-rw-r--r--src/gui/dialogs/AudioManagerDialog.h206
-rw-r--r--src/gui/dialogs/AudioPlayingDialog.cpp55
-rw-r--r--src/gui/dialogs/AudioPlayingDialog.h56
-rw-r--r--src/gui/dialogs/AudioPluginDialog.cpp916
-rw-r--r--src/gui/dialogs/AudioPluginDialog.h167
-rw-r--r--src/gui/dialogs/AudioSplitDialog.cpp339
-rw-r--r--src/gui/dialogs/AudioSplitDialog.h88
-rw-r--r--src/gui/dialogs/BeatsBarsDialog.cpp66
-rw-r--r--src/gui/dialogs/BeatsBarsDialog.h63
-rw-r--r--src/gui/dialogs/ClefDialog.cpp273
-rw-r--r--src/gui/dialogs/ClefDialog.h93
-rw-r--r--src/gui/dialogs/CompositionLengthDialog.cpp84
-rw-r--r--src/gui/dialogs/CompositionLengthDialog.h64
-rw-r--r--src/gui/dialogs/ConfigureDialog.cpp118
-rw-r--r--src/gui/dialogs/ConfigureDialog.h58
-rw-r--r--src/gui/dialogs/ConfigureDialogBase.cpp76
-rw-r--r--src/gui/dialogs/ConfigureDialogBase.h69
-rw-r--r--src/gui/dialogs/CountdownBar.cpp68
-rw-r--r--src/gui/dialogs/CountdownBar.h59
-rw-r--r--src/gui/dialogs/CountdownDialog.cpp159
-rw-r--r--src/gui/dialogs/CountdownDialog.h87
-rw-r--r--src/gui/dialogs/DocumentConfigureDialog.cpp151
-rw-r--r--src/gui/dialogs/DocumentConfigureDialog.h60
-rw-r--r--src/gui/dialogs/EventEditDialog.cpp528
-rw-r--r--src/gui/dialogs/EventEditDialog.h113
-rw-r--r--src/gui/dialogs/EventFilterDialog.cpp476
-rw-r--r--src/gui/dialogs/EventFilterDialog.h170
-rw-r--r--src/gui/dialogs/EventParameterDialog.cpp185
-rw-r--r--src/gui/dialogs/EventParameterDialog.h80
-rw-r--r--src/gui/dialogs/ExportDeviceDialog.cpp66
-rw-r--r--src/gui/dialogs/ExportDeviceDialog.h60
-rw-r--r--src/gui/dialogs/FileLocateDialog.cpp104
-rw-r--r--src/gui/dialogs/FileLocateDialog.h66
-rw-r--r--src/gui/dialogs/FileMergeDialog.cpp84
-rw-r--r--src/gui/dialogs/FileMergeDialog.h63
-rw-r--r--src/gui/dialogs/FloatEdit.cpp72
-rw-r--r--src/gui/dialogs/FloatEdit.h68
-rw-r--r--src/gui/dialogs/IdentifyTextCodecDialog.cpp173
-rw-r--r--src/gui/dialogs/IdentifyTextCodecDialog.h71
-rw-r--r--src/gui/dialogs/ImportDeviceDialog.cpp389
-rw-r--r--src/gui/dialogs/ImportDeviceDialog.h110
-rw-r--r--src/gui/dialogs/InterpretDialog.cpp123
-rw-r--r--src/gui/dialogs/InterpretDialog.h65
-rw-r--r--src/gui/dialogs/IntervalDialog.cpp367
-rw-r--r--src/gui/dialogs/IntervalDialog.h94
-rw-r--r--src/gui/dialogs/KeySignatureDialog.cpp402
-rw-r--r--src/gui/dialogs/KeySignatureDialog.h118
-rw-r--r--src/gui/dialogs/LilyPondOptionsDialog.cpp363
-rw-r--r--src/gui/dialogs/LilyPondOptionsDialog.h86
-rw-r--r--src/gui/dialogs/LyricEditDialog.cpp253
-rw-r--r--src/gui/dialogs/LyricEditDialog.h78
-rw-r--r--src/gui/dialogs/MakeOrnamentDialog.cpp73
-rw-r--r--src/gui/dialogs/MakeOrnamentDialog.h62
-rw-r--r--src/gui/dialogs/ManageMetronomeDialog.cpp508
-rw-r--r--src/gui/dialogs/ManageMetronomeDialog.h94
-rw-r--r--src/gui/dialogs/MarkerModifyDialog.cpp113
-rw-r--r--src/gui/dialogs/MarkerModifyDialog.h84
-rw-r--r--src/gui/dialogs/PasteNotationDialog.cpp101
-rw-r--r--src/gui/dialogs/PasteNotationDialog.h72
-rw-r--r--src/gui/dialogs/PitchDialog.cpp57
-rw-r--r--src/gui/dialogs/PitchDialog.h58
-rw-r--r--src/gui/dialogs/PitchPickerDialog.cpp58
-rw-r--r--src/gui/dialogs/PitchPickerDialog.h57
-rw-r--r--src/gui/dialogs/QuantizeDialog.cpp68
-rw-r--r--src/gui/dialogs/QuantizeDialog.h60
-rw-r--r--src/gui/dialogs/RescaleDialog.cpp131
-rw-r--r--src/gui/dialogs/RescaleDialog.h68
-rw-r--r--src/gui/dialogs/ShowSequencerStatusDialog.cpp79
-rw-r--r--src/gui/dialogs/ShowSequencerStatusDialog.h54
-rw-r--r--src/gui/dialogs/SimpleEventEditDialog.cpp1061
-rw-r--r--src/gui/dialogs/SimpleEventEditDialog.h134
-rw-r--r--src/gui/dialogs/SplitByPitchDialog.cpp111
-rw-r--r--src/gui/dialogs/SplitByPitchDialog.h67
-rw-r--r--src/gui/dialogs/SplitByRecordingSrcDialog.cpp114
-rw-r--r--src/gui/dialogs/SplitByRecordingSrcDialog.h62
-rw-r--r--src/gui/dialogs/TempoDialog.cpp475
-rw-r--r--src/gui/dialogs/TempoDialog.h128
-rw-r--r--src/gui/dialogs/TextEventDialog.cpp593
-rw-r--r--src/gui/dialogs/TextEventDialog.h129
-rw-r--r--src/gui/dialogs/TimeDialog.cpp80
-rw-r--r--src/gui/dialogs/TimeDialog.h67
-rw-r--r--src/gui/dialogs/TimeSignatureDialog.cpp316
-rw-r--r--src/gui/dialogs/TimeSignatureDialog.h99
-rw-r--r--src/gui/dialogs/TransportDialog.cpp1164
-rw-r--r--src/gui/dialogs/TransportDialog.h231
-rw-r--r--src/gui/dialogs/TriggerSegmentDialog.cpp181
-rw-r--r--src/gui/dialogs/TriggerSegmentDialog.h71
-rw-r--r--src/gui/dialogs/TupletDialog.cpp365
-rw-r--r--src/gui/dialogs/TupletDialog.h99
-rw-r--r--src/gui/dialogs/UnusedAudioSelectionDialog.cpp92
-rw-r--r--src/gui/dialogs/UnusedAudioSelectionDialog.h62
-rw-r--r--src/gui/dialogs/UseOrnamentDialog.cpp264
-rw-r--r--src/gui/dialogs/UseOrnamentDialog.h82
-rw-r--r--src/gui/editors/eventlist/EventView.cpp1606
-rw-r--r--src/gui/editors/eventlist/EventView.h205
-rw-r--r--src/gui/editors/eventlist/EventViewItem.cpp68
-rw-r--r--src/gui/editors/eventlist/EventViewItem.h101
-rw-r--r--src/gui/editors/eventlist/TrivialVelocityDialog.cpp48
-rw-r--r--src/gui/editors/eventlist/TrivialVelocityDialog.h48
-rw-r--r--src/gui/editors/guitar/Chord.cpp113
-rw-r--r--src/gui/editors/guitar/Chord.h106
-rw-r--r--src/gui/editors/guitar/ChordMap.cpp223
-rw-r--r--src/gui/editors/guitar/ChordMap.h87
-rw-r--r--src/gui/editors/guitar/ChordXmlHandler.cpp154
-rw-r--r--src/gui/editors/guitar/ChordXmlHandler.h78
-rw-r--r--src/gui/editors/guitar/Fingering.cpp152
-rw-r--r--src/gui/editors/guitar/Fingering.h95
-rw-r--r--src/gui/editors/guitar/FingeringBox.cpp293
-rw-r--r--src/gui/editors/guitar/FingeringBox.h106
-rw-r--r--src/gui/editors/guitar/FingeringListBoxItem.cpp36
-rw-r--r--src/gui/editors/guitar/FingeringListBoxItem.h46
-rw-r--r--src/gui/editors/guitar/GuitarChordEditorDialog.cpp109
-rw-r--r--src/gui/editors/guitar/GuitarChordEditorDialog.h67
-rw-r--r--src/gui/editors/guitar/GuitarChordSelectorDialog.cpp475
-rw-r--r--src/gui/editors/guitar/GuitarChordSelectorDialog.h120
-rw-r--r--src/gui/editors/guitar/NoteSymbols.cpp486
-rw-r--r--src/gui/editors/guitar/NoteSymbols.h192
-rw-r--r--src/gui/editors/matrix/MatrixCanvasView.cpp302
-rw-r--r--src/gui/editors/matrix/MatrixCanvasView.h162
-rw-r--r--src/gui/editors/matrix/MatrixElement.cpp160
-rw-r--r--src/gui/editors/matrix/MatrixElement.h138
-rw-r--r--src/gui/editors/matrix/MatrixEraser.cpp110
-rw-r--r--src/gui/editors/matrix/MatrixEraser.h69
-rw-r--r--src/gui/editors/matrix/MatrixHLayout.cpp220
-rw-r--r--src/gui/editors/matrix/MatrixHLayout.h150
-rw-r--r--src/gui/editors/matrix/MatrixMover.cpp481
-rw-r--r--src/gui/editors/matrix/MatrixMover.h112
-rw-r--r--src/gui/editors/matrix/MatrixPainter.cpp370
-rw-r--r--src/gui/editors/matrix/MatrixPainter.h105
-rw-r--r--src/gui/editors/matrix/MatrixParameterBox.cpp99
-rw-r--r--src/gui/editors/matrix/MatrixParameterBox.h76
-rw-r--r--src/gui/editors/matrix/MatrixResizer.cpp333
-rw-r--r--src/gui/editors/matrix/MatrixResizer.h102
-rw-r--r--src/gui/editors/matrix/MatrixSelector.cpp629
-rw-r--r--src/gui/editors/matrix/MatrixSelector.h177
-rw-r--r--src/gui/editors/matrix/MatrixStaff.cpp232
-rw-r--r--src/gui/editors/matrix/MatrixStaff.h111
-rw-r--r--src/gui/editors/matrix/MatrixTool.cpp79
-rw-r--r--src/gui/editors/matrix/MatrixTool.h74
-rw-r--r--src/gui/editors/matrix/MatrixToolBox.cpp87
-rw-r--r--src/gui/editors/matrix/MatrixToolBox.h60
-rw-r--r--src/gui/editors/matrix/MatrixVLayout.cpp100
-rw-r--r--src/gui/editors/matrix/MatrixVLayout.h91
-rw-r--r--src/gui/editors/matrix/MatrixView.cpp3076
-rw-r--r--src/gui/editors/matrix/MatrixView.h692
-rw-r--r--src/gui/editors/matrix/PianoKeyboard.cpp299
-rw-r--r--src/gui/editors/matrix/PianoKeyboard.h133
-rw-r--r--src/gui/editors/matrix/QCanvasMatrixDiamond.cpp82
-rw-r--r--src/gui/editors/matrix/QCanvasMatrixDiamond.h61
-rw-r--r--src/gui/editors/matrix/QCanvasMatrixRectangle.cpp44
-rw-r--r--src/gui/editors/matrix/QCanvasMatrixRectangle.h60
-rw-r--r--src/gui/editors/notation/ClefInserter.cpp132
-rw-r--r--src/gui/editors/notation/ClefInserter.h83
-rw-r--r--src/gui/editors/notation/FontViewFrame.cpp252
-rw-r--r--src/gui/editors/notation/FontViewFrame.h77
-rw-r--r--src/gui/editors/notation/GuitarChordInserter.cpp185
-rw-r--r--src/gui/editors/notation/GuitarChordInserter.h96
-rw-r--r--src/gui/editors/notation/HeadersGroup.cpp160
-rw-r--r--src/gui/editors/notation/HeadersGroup.h144
-rw-r--r--src/gui/editors/notation/NotationCanvasView.cpp485
-rw-r--r--src/gui/editors/notation/NotationCanvasView.h218
-rw-r--r--src/gui/editors/notation/NotationChord.cpp335
-rw-r--r--src/gui/editors/notation/NotationChord.h90
-rw-r--r--src/gui/editors/notation/NotationElement.cpp198
-rw-r--r--src/gui/editors/notation/NotationElement.h176
-rw-r--r--src/gui/editors/notation/NotationEraser.cpp115
-rw-r--r--src/gui/editors/notation/NotationEraser.h81
-rw-r--r--src/gui/editors/notation/NotationGroup.cpp979
-rw-r--r--src/gui/editors/notation/NotationGroup.h133
-rw-r--r--src/gui/editors/notation/NotationHLayout.cpp2110
-rw-r--r--src/gui/editors/notation/NotationHLayout.h446
-rw-r--r--src/gui/editors/notation/NotationProperties.cpp85
-rw-r--r--src/gui/editors/notation/NotationProperties.h108
-rw-r--r--src/gui/editors/notation/NotationSelectionPaster.cpp89
-rw-r--r--src/gui/editors/notation/NotationSelectionPaster.h72
-rw-r--r--src/gui/editors/notation/NotationSelector.cpp957
-rw-r--r--src/gui/editors/notation/NotationSelector.h197
-rw-r--r--src/gui/editors/notation/NotationStaff.cpp2300
-rw-r--r--src/gui/editors/notation/NotationStaff.h488
-rw-r--r--src/gui/editors/notation/NotationStrings.cpp301
-rw-r--r--src/gui/editors/notation/NotationStrings.h121
-rw-r--r--src/gui/editors/notation/NotationTool.cpp57
-rw-r--r--src/gui/editors/notation/NotationTool.h93
-rw-r--r--src/gui/editors/notation/NotationToolBox.cpp102
-rw-r--r--src/gui/editors/notation/NotationToolBox.h65
-rw-r--r--src/gui/editors/notation/NotationVLayout.cpp731
-rw-r--r--src/gui/editors/notation/NotationVLayout.h122
-rw-r--r--src/gui/editors/notation/NotationView.cpp7552
-rw-r--r--src/gui/editors/notation/NotationView.h1131
-rw-r--r--src/gui/editors/notation/NoteCharacter.cpp133
-rw-r--r--src/gui/editors/notation/NoteCharacter.h93
-rw-r--r--src/gui/editors/notation/NoteCharacterNames.cpp123
-rw-r--r--src/gui/editors/notation/NoteCharacterNames.h120
-rw-r--r--src/gui/editors/notation/NoteFont.cpp650
-rw-r--r--src/gui/editors/notation/NoteFont.h184
-rw-r--r--src/gui/editors/notation/NoteFontFactory.cpp236
-rw-r--r--src/gui/editors/notation/NoteFontFactory.h71
-rw-r--r--src/gui/editors/notation/NoteFontMap.cpp1088
-rw-r--r--src/gui/editors/notation/NoteFontMap.h333
-rw-r--r--src/gui/editors/notation/NoteFontViewer.cpp125
-rw-r--r--src/gui/editors/notation/NoteFontViewer.h68
-rw-r--r--src/gui/editors/notation/NoteInserter.cpp722
-rw-r--r--src/gui/editors/notation/NoteInserter.h166
-rw-r--r--src/gui/editors/notation/NotePixmapFactory.cpp3689
-rw-r--r--src/gui/editors/notation/NotePixmapFactory.h358
-rw-r--r--src/gui/editors/notation/NotePixmapPainter.h148
-rw-r--r--src/gui/editors/notation/NotePixmapParameters.cpp151
-rw-r--r--src/gui/editors/notation/NotePixmapParameters.h161
-rw-r--r--src/gui/editors/notation/NoteStyle.cpp485
-rw-r--r--src/gui/editors/notation/NoteStyle.h142
-rw-r--r--src/gui/editors/notation/NoteStyleFactory.cpp124
-rw-r--r--src/gui/editors/notation/NoteStyleFactory.h61
-rw-r--r--src/gui/editors/notation/NoteStyleFileReader.cpp193
-rw-r--r--src/gui/editors/notation/NoteStyleFileReader.h59
-rw-r--r--src/gui/editors/notation/RestInserter.cpp150
-rw-r--r--src/gui/editors/notation/RestInserter.h76
-rw-r--r--src/gui/editors/notation/SystemFont.cpp165
-rw-r--r--src/gui/editors/notation/SystemFont.h63
-rw-r--r--src/gui/editors/notation/SystemFontQt.cpp78
-rw-r--r--src/gui/editors/notation/SystemFontQt.h49
-rw-r--r--src/gui/editors/notation/SystemFontXft.cpp193
-rw-r--r--src/gui/editors/notation/SystemFontXft.h58
-rw-r--r--src/gui/editors/notation/TextInserter.cpp169
-rw-r--r--src/gui/editors/notation/TextInserter.h78
-rw-r--r--src/gui/editors/notation/TrackHeader.cpp450
-rw-r--r--src/gui/editors/notation/TrackHeader.h219
-rw-r--r--src/gui/editors/parameters/AudioInstrumentParameterPanel.cpp437
-rw-r--r--src/gui/editors/parameters/AudioInstrumentParameterPanel.h107
-rw-r--r--src/gui/editors/parameters/InstrumentParameterBox.cpp265
-rw-r--r--src/gui/editors/parameters/InstrumentParameterBox.h126
-rw-r--r--src/gui/editors/parameters/InstrumentParameterPanel.cpp61
-rw-r--r--src/gui/editors/parameters/InstrumentParameterPanel.h78
-rw-r--r--src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp1175
-rw-r--r--src/gui/editors/parameters/MIDIInstrumentParameterPanel.h137
-rw-r--r--src/gui/editors/parameters/RosegardenParameterArea.cpp227
-rw-r--r--src/gui/editors/parameters/RosegardenParameterArea.h108
-rw-r--r--src/gui/editors/parameters/RosegardenParameterBox.cpp89
-rw-r--r--src/gui/editors/parameters/RosegardenParameterBox.h92
-rw-r--r--src/gui/editors/parameters/SegmentParameterBox.cpp1214
-rw-r--r--src/gui/editors/parameters/SegmentParameterBox.h174
-rw-r--r--src/gui/editors/parameters/TrackParameterBox.cpp1022
-rw-r--r--src/gui/editors/parameters/TrackParameterBox.h161
-rw-r--r--src/gui/editors/segment/ControlEditorDialog.cpp446
-rw-r--r--src/gui/editors/segment/ControlEditorDialog.h122
-rw-r--r--src/gui/editors/segment/ControlParameterEditDialog.cpp325
-rw-r--r--src/gui/editors/segment/ControlParameterEditDialog.h92
-rw-r--r--src/gui/editors/segment/ControlParameterItem.cpp34
-rw-r--r--src/gui/editors/segment/ControlParameterItem.h65
-rw-r--r--src/gui/editors/segment/MarkerEditor.cpp594
-rw-r--r--src/gui/editors/segment/MarkerEditor.h124
-rw-r--r--src/gui/editors/segment/MarkerEditorViewItem.cpp51
-rw-r--r--src/gui/editors/segment/MarkerEditorViewItem.h70
-rw-r--r--src/gui/editors/segment/PlayList.cpp254
-rw-r--r--src/gui/editors/segment/PlayList.h93
-rw-r--r--src/gui/editors/segment/PlayListDialog.cpp76
-rw-r--r--src/gui/editors/segment/PlayListDialog.h71
-rw-r--r--src/gui/editors/segment/PlayListView.cpp66
-rw-r--r--src/gui/editors/segment/PlayListView.h52
-rw-r--r--src/gui/editors/segment/PlayListViewItem.cpp42
-rw-r--r--src/gui/editors/segment/PlayListViewItem.h47
-rw-r--r--src/gui/editors/segment/TrackButtons.cpp1149
-rw-r--r--src/gui/editors/segment/TrackButtons.h228
-rw-r--r--src/gui/editors/segment/TrackEditor.cpp827
-rw-r--r--src/gui/editors/segment/TrackEditor.h248
-rw-r--r--src/gui/editors/segment/TrackEditorIface.cpp33
-rw-r--r--src/gui/editors/segment/TrackEditorIface.h55
-rw-r--r--src/gui/editors/segment/TrackHeader.cpp64
-rw-r--r--src/gui/editors/segment/TrackHeader.h65
-rw-r--r--src/gui/editors/segment/TrackLabel.cpp203
-rw-r--r--src/gui/editors/segment/TrackLabel.h122
-rw-r--r--src/gui/editors/segment/TrackVUMeter.cpp77
-rw-r--r--src/gui/editors/segment/TrackVUMeter.h65
-rw-r--r--src/gui/editors/segment/TriggerManagerItem.cpp60
-rw-r--r--src/gui/editors/segment/TriggerManagerItem.h72
-rw-r--r--src/gui/editors/segment/TriggerSegmentManager.cpp576
-rw-r--r--src/gui/editors/segment/TriggerSegmentManager.h116
-rw-r--r--src/gui/editors/segment/segmentcanvas/AudioPreviewPainter.cpp316
-rw-r--r--src/gui/editors/segment/segmentcanvas/AudioPreviewPainter.h79
-rw-r--r--src/gui/editors/segment/segmentcanvas/AudioPreviewThread.cpp267
-rw-r--r--src/gui/editors/segment/segmentcanvas/AudioPreviewThread.h99
-rw-r--r--src/gui/editors/segment/segmentcanvas/AudioPreviewUpdater.cpp149
-rw-r--r--src/gui/editors/segment/segmentcanvas/AudioPreviewUpdater.h90
-rw-r--r--src/gui/editors/segment/segmentcanvas/CompositionColourCache.cpp62
-rw-r--r--src/gui/editors/segment/segmentcanvas/CompositionColourCache.h69
-rw-r--r--src/gui/editors/segment/segmentcanvas/CompositionItem.cpp34
-rw-r--r--src/gui/editors/segment/segmentcanvas/CompositionItem.h67
-rw-r--r--src/gui/editors/segment/segmentcanvas/CompositionItemHelper.cpp150
-rw-r--r--src/gui/editors/segment/segmentcanvas/CompositionItemHelper.h61
-rw-r--r--src/gui/editors/segment/segmentcanvas/CompositionItemImpl.cpp67
-rw-r--r--src/gui/editors/segment/segmentcanvas/CompositionItemImpl.h74
-rw-r--r--src/gui/editors/segment/segmentcanvas/CompositionModel.cpp43
-rw-r--r--src/gui/editors/segment/segmentcanvas/CompositionModel.h179
-rw-r--r--src/gui/editors/segment/segmentcanvas/CompositionModelImpl.cpp1328
-rw-r--r--src/gui/editors/segment/segmentcanvas/CompositionModelImpl.h239
-rw-r--r--src/gui/editors/segment/segmentcanvas/CompositionRect.cpp42
-rw-r--r--src/gui/editors/segment/segmentcanvas/CompositionRect.h108
-rw-r--r--src/gui/editors/segment/segmentcanvas/CompositionView.cpp1591
-rw-r--r--src/gui/editors/segment/segmentcanvas/CompositionView.h366
-rw-r--r--src/gui/editors/segment/segmentcanvas/PreviewRect.cpp34
-rw-r--r--src/gui/editors/segment/segmentcanvas/PreviewRect.h62
-rw-r--r--src/gui/editors/segment/segmentcanvas/SegmentEraser.cpp88
-rw-r--r--src/gui/editors/segment/segmentcanvas/SegmentEraser.h67
-rw-r--r--src/gui/editors/segment/segmentcanvas/SegmentItemPreview.cpp37
-rw-r--r--src/gui/editors/segment/segmentcanvas/SegmentItemPreview.h91
-rw-r--r--src/gui/editors/segment/segmentcanvas/SegmentJoiner.cpp73
-rw-r--r--src/gui/editors/segment/segmentcanvas/SegmentJoiner.h70
-rw-r--r--src/gui/editors/segment/segmentcanvas/SegmentMover.cpp348
-rw-r--r--src/gui/editors/segment/segmentcanvas/SegmentMover.h78
-rw-r--r--src/gui/editors/segment/segmentcanvas/SegmentOrderer.cpp48
-rw-r--r--src/gui/editors/segment/segmentcanvas/SegmentOrderer.h59
-rw-r--r--src/gui/editors/segment/segmentcanvas/SegmentPencil.cpp295
-rw-r--r--src/gui/editors/segment/segmentcanvas/SegmentPencil.h83
-rw-r--r--src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp393
-rw-r--r--src/gui/editors/segment/segmentcanvas/SegmentResizer.h87
-rw-r--r--src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp532
-rw-r--r--src/gui/editors/segment/segmentcanvas/SegmentSelector.h109
-rw-r--r--src/gui/editors/segment/segmentcanvas/SegmentSplitter.cpp175
-rw-r--r--src/gui/editors/segment/segmentcanvas/SegmentSplitter.h83
-rw-r--r--src/gui/editors/segment/segmentcanvas/SegmentTool.cpp115
-rw-r--r--src/gui/editors/segment/segmentcanvas/SegmentTool.h105
-rw-r--r--src/gui/editors/segment/segmentcanvas/SegmentToolBox.cpp102
-rw-r--r--src/gui/editors/segment/segmentcanvas/SegmentToolBox.h63
-rw-r--r--src/gui/editors/tempo/TempoListItem.cpp52
-rw-r--r--src/gui/editors/tempo/TempoListItem.h72
-rw-r--r--src/gui/editors/tempo/TempoView.cpp839
-rw-r--r--src/gui/editors/tempo/TempoView.h172
-rw-r--r--src/gui/general/ActiveItem.cpp32
-rw-r--r--src/gui/general/ActiveItem.h55
-rw-r--r--src/gui/general/BarLine.cpp165
-rw-r--r--src/gui/general/BarLine.h64
-rw-r--r--src/gui/general/BaseTool.cpp89
-rw-r--r--src/gui/general/BaseTool.h112
-rw-r--r--src/gui/general/BaseToolBox.cpp58
-rw-r--r--src/gui/general/BaseToolBox.h69
-rw-r--r--src/gui/general/CanvasCursor.cpp52
-rw-r--r--src/gui/general/CanvasCursor.h55
-rw-r--r--src/gui/general/CanvasItemGC.cpp64
-rw-r--r--src/gui/general/CanvasItemGC.h85
-rw-r--r--src/gui/general/CategoryElement.cpp61
-rw-r--r--src/gui/general/CategoryElement.h71
-rw-r--r--src/gui/general/ClefIndex.cpp100
-rw-r--r--src/gui/general/ClefIndex.h59
-rw-r--r--src/gui/general/EditTool.cpp143
-rw-r--r--src/gui/general/EditTool.h166
-rw-r--r--src/gui/general/EditToolBox.cpp56
-rw-r--r--src/gui/general/EditToolBox.h65
-rw-r--r--src/gui/general/EditView.cpp1717
-rw-r--r--src/gui/general/EditView.h405
-rw-r--r--src/gui/general/EditViewBase.cpp711
-rw-r--r--src/gui/general/EditViewBase.h396
-rw-r--r--src/gui/general/EditViewTimeSigNotifier.h56
-rw-r--r--src/gui/general/GUIPalette.cpp311
-rw-r--r--src/gui/general/GUIPalette.h185
-rw-r--r--src/gui/general/HZoomable.cpp32
-rw-r--r--src/gui/general/HZoomable.h53
-rw-r--r--src/gui/general/LinedStaff.cpp1217
-rw-r--r--src/gui/general/LinedStaff.h759
-rw-r--r--src/gui/general/LinedStaffManager.cpp33
-rw-r--r--src/gui/general/LinedStaffManager.h61
-rw-r--r--src/gui/general/MidiPitchLabel.cpp74
-rw-r--r--src/gui/general/MidiPitchLabel.h57
-rw-r--r--src/gui/general/PixmapFunctions.cpp271
-rw-r--r--src/gui/general/PixmapFunctions.h107
-rw-r--r--src/gui/general/PresetElement.cpp68
-rw-r--r--src/gui/general/PresetElement.h82
-rw-r--r--src/gui/general/PresetGroup.cpp269
-rw-r--r--src/gui/general/PresetGroup.h105
-rw-r--r--src/gui/general/PresetHandlerDialog.cpp281
-rw-r--r--src/gui/general/PresetHandlerDialog.h107
-rw-r--r--src/gui/general/ProgressReporter.cpp53
-rw-r--r--src/gui/general/ProgressReporter.h80
-rw-r--r--src/gui/general/RosegardenCanvasView.cpp485
-rw-r--r--src/gui/general/RosegardenCanvasView.h197
-rw-r--r--src/gui/general/RosegardenScrollView.cpp416
-rw-r--r--src/gui/general/RosegardenScrollView.h183
-rw-r--r--src/gui/general/Spline.cpp130
-rw-r--r--src/gui/general/Spline.h71
-rw-r--r--src/gui/general/StaffLine.cpp64
-rw-r--r--src/gui/general/StaffLine.h78
-rw-r--r--src/gui/kdeext/KLedButton.cpp60
-rw-r--r--src/gui/kdeext/KLedButton.h76
-rw-r--r--src/gui/kdeext/KStartupLogo.cpp159
-rw-r--r--src/gui/kdeext/KStartupLogo.h70
-rw-r--r--src/gui/kdeext/KTmpStatusMsg.cpp70
-rw-r--r--src/gui/kdeext/KTmpStatusMsg.h88
-rw-r--r--src/gui/kdeext/QCanvasGroupableItem.cpp279
-rw-r--r--src/gui/kdeext/QCanvasGroupableItem.h201
-rw-r--r--src/gui/kdeext/QCanvasSimpleSprite.cpp217
-rw-r--r--src/gui/kdeext/QCanvasSimpleSprite.h133
-rw-r--r--src/gui/kdeext/RGLed.cpp729
-rw-r--r--src/gui/kdeext/klearlook.cpp4095
-rw-r--r--src/gui/kdeext/klearlook.h344
-rw-r--r--src/gui/rulers/ChordNameRuler.cpp523
-rw-r--r--src/gui/rulers/ChordNameRuler.h146
-rw-r--r--src/gui/rulers/ControlChangeCommand.cpp50
-rw-r--r--src/gui/rulers/ControlChangeCommand.h55
-rw-r--r--src/gui/rulers/ControlItem.cpp195
-rw-r--r--src/gui/rulers/ControlItem.h79
-rw-r--r--src/gui/rulers/ControlRuler.cpp539
-rw-r--r--src/gui/rulers/ControlRuler.h182
-rw-r--r--src/gui/rulers/ControlRulerEventEraseCommand.cpp58
-rw-r--r--src/gui/rulers/ControlRulerEventEraseCommand.h54
-rw-r--r--src/gui/rulers/ControlRulerEventInsertCommand.cpp67
-rw-r--r--src/gui/rulers/ControlRulerEventInsertCommand.h56
-rw-r--r--src/gui/rulers/ControlSelector.cpp72
-rw-r--r--src/gui/rulers/ControlSelector.h60
-rw-r--r--src/gui/rulers/ControlTool.h39
-rw-r--r--src/gui/rulers/ControllerEventAdapter.cpp83
-rw-r--r--src/gui/rulers/ControllerEventAdapter.h53
-rw-r--r--src/gui/rulers/ControllerEventsRuler.cpp499
-rw-r--r--src/gui/rulers/ControllerEventsRuler.h118
-rw-r--r--src/gui/rulers/DefaultVelocityColour.cpp55
-rw-r--r--src/gui/rulers/DefaultVelocityColour.h54
-rw-r--r--src/gui/rulers/ElementAdapter.h46
-rw-r--r--src/gui/rulers/LoopRuler.cpp363
-rw-r--r--src/gui/rulers/LoopRuler.h148
-rw-r--r--src/gui/rulers/MarkerRuler.cpp490
-rw-r--r--src/gui/rulers/MarkerRuler.h121
-rw-r--r--src/gui/rulers/PercussionPitchRuler.cpp204
-rw-r--r--src/gui/rulers/PercussionPitchRuler.h91
-rw-r--r--src/gui/rulers/PitchRuler.cpp55
-rw-r--r--src/gui/rulers/PitchRuler.h78
-rw-r--r--src/gui/rulers/PropertyBox.cpp77
-rw-r--r--src/gui/rulers/PropertyBox.h74
-rw-r--r--src/gui/rulers/PropertyControlRuler.cpp441
-rw-r--r--src/gui/rulers/PropertyControlRuler.h120
-rw-r--r--src/gui/rulers/PropertyViewRuler.cpp175
-rw-r--r--src/gui/rulers/PropertyViewRuler.h102
-rw-r--r--src/gui/rulers/RawNoteRuler.cpp573
-rw-r--r--src/gui/rulers/RawNoteRuler.h128
-rw-r--r--src/gui/rulers/StandardRuler.cpp172
-rw-r--r--src/gui/rulers/StandardRuler.h108
-rw-r--r--src/gui/rulers/TempoColour.cpp55
-rw-r--r--src/gui/rulers/TempoColour.h60
-rw-r--r--src/gui/rulers/TempoRuler.cpp1091
-rw-r--r--src/gui/rulers/TempoRuler.h180
-rw-r--r--src/gui/rulers/TextRuler.cpp157
-rw-r--r--src/gui/rulers/TextRuler.h112
-rw-r--r--src/gui/rulers/VelocityColour.cpp120
-rw-r--r--src/gui/rulers/VelocityColour.h106
-rw-r--r--src/gui/rulers/ViewElementAdapter.cpp56
-rw-r--r--src/gui/rulers/ViewElementAdapter.h59
-rw-r--r--src/gui/seqmanager/AudioSegmentMmapper.cpp133
-rw-r--r--src/gui/seqmanager/AudioSegmentMmapper.h61
-rw-r--r--src/gui/seqmanager/CompositionMmapper.cpp174
-rw-r--r--src/gui/seqmanager/CompositionMmapper.h75
-rw-r--r--src/gui/seqmanager/ControlBlockMmapper.cpp226
-rw-r--r--src/gui/seqmanager/ControlBlockMmapper.h83
-rw-r--r--src/gui/seqmanager/MetronomeMmapper.cpp268
-rw-r--r--src/gui/seqmanager/MetronomeMmapper.h87
-rw-r--r--src/gui/seqmanager/MidiFilterDialog.cpp229
-rw-r--r--src/gui/seqmanager/MidiFilterDialog.h71
-rw-r--r--src/gui/seqmanager/SegmentMmapper.cpp562
-rw-r--r--src/gui/seqmanager/SegmentMmapper.h112
-rw-r--r--src/gui/seqmanager/SegmentMmapperFactory.cpp96
-rw-r--r--src/gui/seqmanager/SegmentMmapperFactory.h63
-rw-r--r--src/gui/seqmanager/SequenceManager.cpp2141
-rw-r--r--src/gui/seqmanager/SequenceManager.h322
-rw-r--r--src/gui/seqmanager/SequencerMapper.cpp105
-rw-r--r--src/gui/seqmanager/SequencerMapper.h113
-rw-r--r--src/gui/seqmanager/SpecialSegmentMmapper.cpp56
-rw-r--r--src/gui/seqmanager/SpecialSegmentMmapper.h59
-rw-r--r--src/gui/seqmanager/TempoSegmentMmapper.cpp77
-rw-r--r--src/gui/seqmanager/TempoSegmentMmapper.h60
-rw-r--r--src/gui/seqmanager/TimeSigSegmentMmapper.cpp72
-rw-r--r--src/gui/seqmanager/TimeSigSegmentMmapper.h62
-rw-r--r--src/gui/studio/AudioMixerWindow.cpp1734
-rw-r--r--src/gui/studio/AudioMixerWindow.h191
-rw-r--r--src/gui/studio/AudioPlugin.cpp78
-rw-r--r--src/gui/studio/AudioPlugin.h117
-rw-r--r--src/gui/studio/AudioPluginClipboard.cpp32
-rw-r--r--src/gui/studio/AudioPluginClipboard.h52
-rw-r--r--src/gui/studio/AudioPluginManager.cpp307
-rw-r--r--src/gui/studio/AudioPluginManager.h118
-rw-r--r--src/gui/studio/AudioPluginOSCGUI.cpp234
-rw-r--r--src/gui/studio/AudioPluginOSCGUI.h77
-rw-r--r--src/gui/studio/AudioPluginOSCGUIManager.cpp711
-rw-r--r--src/gui/studio/AudioPluginOSCGUIManager.h104
-rw-r--r--src/gui/studio/BankEditorDialog.cpp1713
-rw-r--r--src/gui/studio/BankEditorDialog.h211
-rw-r--r--src/gui/studio/ChangeRecordDeviceCommand.cpp66
-rw-r--r--src/gui/studio/ChangeRecordDeviceCommand.h54
-rw-r--r--src/gui/studio/DeviceEditorDialog.cpp406
-rw-r--r--src/gui/studio/DeviceEditorDialog.h87
-rw-r--r--src/gui/studio/DeviceManagerDialog.cpp833
-rw-r--r--src/gui/studio/DeviceManagerDialog.h121
-rw-r--r--src/gui/studio/MidiBankListViewItem.cpp98
-rw-r--r--src/gui/studio/MidiBankListViewItem.h70
-rw-r--r--src/gui/studio/MidiDeviceListViewItem.cpp88
-rw-r--r--src/gui/studio/MidiDeviceListViewItem.h69
-rw-r--r--src/gui/studio/MidiKeyMapListViewItem.cpp56
-rw-r--r--src/gui/studio/MidiKeyMapListViewItem.h59
-rw-r--r--src/gui/studio/MidiKeyMappingEditor.cpp197
-rw-r--r--src/gui/studio/MidiKeyMappingEditor.h78
-rw-r--r--src/gui/studio/MidiMixerVUMeter.cpp53
-rw-r--r--src/gui/studio/MidiMixerVUMeter.h61
-rw-r--r--src/gui/studio/MidiMixerWindow.cpp742
-rw-r--r--src/gui/studio/MidiMixerWindow.h125
-rw-r--r--src/gui/studio/MidiProgramsEditor.cpp631
-rw-r--r--src/gui/studio/MidiProgramsEditor.h119
-rw-r--r--src/gui/studio/MixerWindow.cpp75
-rw-r--r--src/gui/studio/MixerWindow.h77
-rw-r--r--src/gui/studio/NameSetEditor.cpp190
-rw-r--r--src/gui/studio/NameSetEditor.h90
-rw-r--r--src/gui/studio/OSCMessage.cpp87
-rw-r--r--src/gui/studio/OSCMessage.h75
-rw-r--r--src/gui/studio/RemapInstrumentDialog.cpp184
-rw-r--r--src/gui/studio/RemapInstrumentDialog.h84
-rw-r--r--src/gui/studio/StudioControl.cpp582
-rw-r--r--src/gui/studio/StudioControl.h152
-rw-r--r--src/gui/studio/SynthPluginManagerDialog.cpp360
-rw-r--r--src/gui/studio/SynthPluginManagerDialog.h98
-rw-r--r--src/gui/studio/TimerCallbackAssistant.cpp57
-rw-r--r--src/gui/studio/TimerCallbackAssistant.h61
-rw-r--r--src/gui/ui/RosegardenTransport.ui4361
-rw-r--r--src/gui/ui/audiomanager.rc67
-rw-r--r--src/gui/ui/bankeditor.rc22
-rw-r--r--src/gui/ui/clefinserter.rc11
-rw-r--r--src/gui/ui/controleditor.rc5
-rw-r--r--src/gui/ui/devicemanager.rc5
-rw-r--r--src/gui/ui/eventlist.rc105
-rw-r--r--src/gui/ui/markereditor.rc37
-rw-r--r--src/gui/ui/markerruler.rc14
-rw-r--r--src/gui/ui/matrix.rc301
-rw-r--r--src/gui/ui/matrixeraser.rc15
-rw-r--r--src/gui/ui/matrixmover.rc15
-rw-r--r--src/gui/ui/matrixpainter.rc22
-rw-r--r--src/gui/ui/matrixresizer.rc15
-rw-r--r--src/gui/ui/matrixselector.rc15
-rw-r--r--src/gui/ui/midimixer.rc34
-rw-r--r--src/gui/ui/mixer.rc65
-rw-r--r--src/gui/ui/notation.rc853
-rw-r--r--src/gui/ui/notationeraser.rc12
-rw-r--r--src/gui/ui/notationselector.rc26
-rw-r--r--src/gui/ui/noteinserter.rc23
-rw-r--r--src/gui/ui/restinserter.rc13
-rw-r--r--src/gui/ui/rosegardenui.rc440
-rw-r--r--src/gui/ui/temporuler.rc19
-rw-r--r--src/gui/ui/tempoview.rc96
-rw-r--r--src/gui/ui/textinserter.rc11
-rw-r--r--src/gui/ui/triggermanager.rc40
-rw-r--r--src/gui/widgets/AudioFaderBox.cpp294
-rw-r--r--src/gui/widgets/AudioFaderBox.h114
-rw-r--r--src/gui/widgets/AudioListItem.h97
-rw-r--r--src/gui/widgets/AudioListView.cpp67
-rw-r--r--src/gui/widgets/AudioListView.h44
-rw-r--r--src/gui/widgets/AudioRouteMenu.cpp381
-rw-r--r--src/gui/widgets/AudioRouteMenu.h94
-rw-r--r--src/gui/widgets/AudioVUMeter.cpp103
-rw-r--r--src/gui/widgets/AudioVUMeter.h96
-rw-r--r--src/gui/widgets/BigArrowButton.h47
-rw-r--r--src/gui/widgets/CollapsingFrame.cpp148
-rw-r--r--src/gui/widgets/CollapsingFrame.h75
-rw-r--r--src/gui/widgets/ColourTable.cpp131
-rw-r--r--src/gui/widgets/ColourTable.h72
-rw-r--r--src/gui/widgets/ColourTableItem.cpp52
-rw-r--r--src/gui/widgets/ColourTableItem.h60
-rw-r--r--src/gui/widgets/CurrentProgressDialog.cpp84
-rw-r--r--src/gui/widgets/CurrentProgressDialog.h81
-rw-r--r--src/gui/widgets/DiatonicPitchChooser.cpp244
-rw-r--r--src/gui/widgets/DiatonicPitchChooser.h103
-rw-r--r--src/gui/widgets/Fader.cpp567
-rw-r--r--src/gui/widgets/Fader.h137
-rw-r--r--src/gui/widgets/HSpinBox.cpp81
-rw-r--r--src/gui/widgets/HSpinBox.h67
-rw-r--r--src/gui/widgets/Label.cpp2
-rw-r--r--src/gui/widgets/Label.h63
-rw-r--r--src/gui/widgets/MidiFaderWidget.cpp41
-rw-r--r--src/gui/widgets/MidiFaderWidget.h72
-rw-r--r--src/gui/widgets/PitchChooser.cpp113
-rw-r--r--src/gui/widgets/PitchChooser.h73
-rw-r--r--src/gui/widgets/PitchDragLabel.cpp269
-rw-r--r--src/gui/widgets/PitchDragLabel.h99
-rw-r--r--src/gui/widgets/PluginControl.cpp228
-rw-r--r--src/gui/widgets/PluginControl.h104
-rw-r--r--src/gui/widgets/ProgressBar.cpp44
-rw-r--r--src/gui/widgets/ProgressBar.h56
-rw-r--r--src/gui/widgets/ProgressDialog.cpp209
-rw-r--r--src/gui/widgets/ProgressDialog.h98
-rw-r--r--src/gui/widgets/QDeferScrollView.cpp52
-rw-r--r--src/gui/widgets/QDeferScrollView.h75
-rw-r--r--src/gui/widgets/QuantizeParameters.cpp497
-rw-r--r--src/gui/widgets/QuantizeParameters.h117
-rw-r--r--src/gui/widgets/RosegardenPopupMenu.h43
-rw-r--r--src/gui/widgets/Rotary.cpp560
-rw-r--r--src/gui/widgets/Rotary.h167
-rw-r--r--src/gui/widgets/ScrollBox.cpp159
-rw-r--r--src/gui/widgets/ScrollBox.h89
-rw-r--r--src/gui/widgets/ScrollBoxDialog.cpp68
-rw-r--r--src/gui/widgets/ScrollBoxDialog.h71
-rw-r--r--src/gui/widgets/SpinBox.cpp73
-rw-r--r--src/gui/widgets/SpinBox.h65
-rw-r--r--src/gui/widgets/TextFloat.cpp112
-rw-r--r--src/gui/widgets/TextFloat.h64
-rw-r--r--src/gui/widgets/TimeWidget.cpp668
-rw-r--r--src/gui/widgets/TimeWidget.h125
-rw-r--r--src/gui/widgets/TristateCheckBox.cpp43
-rw-r--r--src/gui/widgets/TristateCheckBox.h69
-rw-r--r--src/gui/widgets/VUMeter.cpp694
-rw-r--r--src/gui/widgets/VUMeter.h154
-rw-r--r--src/gui/widgets/WheelyButton.cpp35
-rw-r--r--src/gui/widgets/WheelyButton.h68
-rw-r--r--src/gui/widgets/ZoomSlider.cpp34
-rw-r--r--src/gui/widgets/ZoomSlider.h175
-rwxr-xr-xsrc/helpers/rosegarden-audiofile-importer270
-rwxr-xr-xsrc/helpers/rosegarden-lilypondview395
-rwxr-xr-xsrc/helpers/rosegarden-project-package839
-rw-r--r--src/misc/Debug.cpp396
-rw-r--r--src/misc/Debug.h166
-rw-r--r--src/misc/Strings.cpp110
-rw-r--r--src/misc/Strings.h38
-rw-r--r--src/misc/stableheaders.h208
-rw-r--r--src/sequencer/ControlBlockMmapper.cpp81
-rw-r--r--src/sequencer/ControlBlockMmapper.h94
-rw-r--r--src/sequencer/MmappedSegment.cpp702
-rw-r--r--src/sequencer/MmappedSegment.h185
-rw-r--r--src/sequencer/RosegardenSequencerApp.cpp1850
-rw-r--r--src/sequencer/RosegardenSequencerApp.h531
-rw-r--r--src/sequencer/RosegardenSequencerIface.h364
-rw-r--r--src/sequencer/SequencerMmapper.cpp146
-rw-r--r--src/sequencer/SequencerMmapper.h103
-rw-r--r--src/sequencer/main.cpp246
-rw-r--r--src/sound/AlsaDriver.cpp5476
-rw-r--r--src/sound/AlsaDriver.h561
-rw-r--r--src/sound/AlsaPort.cpp192
-rw-r--r--src/sound/AlsaPort.h86
-rw-r--r--src/sound/AudioCache.cpp139
-rw-r--r--src/sound/AudioCache.h98
-rw-r--r--src/sound/AudioFile.cpp75
-rw-r--r--src/sound/AudioFile.h216
-rw-r--r--src/sound/AudioFileManager.cpp1257
-rw-r--r--src/sound/AudioFileManager.h327
-rw-r--r--src/sound/AudioFileTimeStretcher.cpp268
-rw-r--r--src/sound/AudioFileTimeStretcher.h76
-rw-r--r--src/sound/AudioPlayQueue.cpp501
-rw-r--r--src/sound/AudioPlayQueue.h168
-rw-r--r--src/sound/AudioProcess.cpp2463
-rw-r--r--src/sound/AudioProcess.h390
-rw-r--r--src/sound/AudioTimeStretcher.cpp667
-rw-r--r--src/sound/AudioTimeStretcher.h221
-rw-r--r--src/sound/Audit.cpp30
-rw-r--r--src/sound/Audit.h60
-rw-r--r--src/sound/BWFAudioFile.cpp171
-rw-r--r--src/sound/BWFAudioFile.h94
-rw-r--r--src/sound/ControlBlock.cpp181
-rw-r--r--src/sound/ControlBlock.h128
-rw-r--r--src/sound/DSSIPluginFactory.cpp396
-rw-r--r--src/sound/DSSIPluginFactory.h72
-rw-r--r--src/sound/DSSIPluginInstance.cpp1208
-rw-r--r--src/sound/DSSIPluginInstance.h193
-rw-r--r--src/sound/DummyDriver.h166
-rw-r--r--src/sound/ExternalTransport.h67
-rw-r--r--src/sound/JackDriver.cpp2480
-rw-r--r--src/sound/JackDriver.h297
-rw-r--r--src/sound/LADSPAPluginFactory.cpp841
-rw-r--r--src/sound/LADSPAPluginFactory.h104
-rw-r--r--src/sound/LADSPAPluginInstance.cpp435
-rw-r--r--src/sound/LADSPAPluginInstance.h137
-rw-r--r--src/sound/MP3AudioFile.cpp329
-rw-r--r--src/sound/MP3AudioFile.h128
-rw-r--r--src/sound/MappedCommon.h68
-rw-r--r--src/sound/MappedComposition.cpp216
-rw-r--r--src/sound/MappedComposition.h93
-rw-r--r--src/sound/MappedDevice.cpp250
-rw-r--r--src/sound/MappedDevice.h103
-rw-r--r--src/sound/MappedEvent.cpp593
-rw-r--r--src/sound/MappedEvent.h546
-rw-r--r--src/sound/MappedInstrument.cpp153
-rw-r--r--src/sound/MappedInstrument.h106
-rw-r--r--src/sound/MappedRealTime.cpp62
-rw-r--r--src/sound/MappedRealTime.h56
-rw-r--r--src/sound/MappedStudio.cpp1719
-rw-r--r--src/sound/MappedStudio.h552
-rw-r--r--src/sound/Midi.h184
-rw-r--r--src/sound/MidiEvent.cpp289
-rw-r--r--src/sound/MidiEvent.h141
-rw-r--r--src/sound/MidiFile.cpp2261
-rw-r--r--src/sound/MidiFile.h173
-rw-r--r--src/sound/MidiMapping.xml133
-rw-r--r--src/sound/PeakFile.cpp1033
-rw-r--r--src/sound/PeakFile.h196
-rw-r--r--src/sound/PeakFileManager.cpp327
-rw-r--r--src/sound/PeakFileManager.h162
-rw-r--r--src/sound/PlayableAudioFile.cpp1086
-rw-r--r--src/sound/PlayableAudioFile.h219
-rw-r--r--src/sound/PluginFactory.cpp120
-rw-r--r--src/sound/PluginFactory.h97
-rw-r--r--src/sound/PluginIdentifier.cpp72
-rw-r--r--src/sound/PluginIdentifier.h50
-rw-r--r--src/sound/RIFFAudioFile.cpp686
-rw-r--r--src/sound/RIFFAudioFile.h168
-rw-r--r--src/sound/RecordableAudioFile.cpp164
-rw-r--r--src/sound/RecordableAudioFile.h68
-rw-r--r--src/sound/RingBuffer.h572
-rw-r--r--src/sound/RosegardenMidiRecord.mcopclass5
-rw-r--r--src/sound/RunnablePluginInstance.cpp42
-rw-r--r--src/sound/RunnablePluginInstance.h114
-rw-r--r--src/sound/SF2PatchExtractor.cpp217
-rw-r--r--src/sound/SF2PatchExtractor.h58
-rw-r--r--src/sound/SampleWindow.h192
-rw-r--r--src/sound/Scavenger.h211
-rw-r--r--src/sound/SequencerDataBlock.cpp361
-rw-r--r--src/sound/SequencerDataBlock.h140
-rw-r--r--src/sound/SoundDriver.cpp391
-rw-r--r--src/sound/SoundDriver.h529
-rw-r--r--src/sound/SoundDriverFactory.cpp66
-rw-r--r--src/sound/SoundDriverFactory.h37
-rw-r--r--src/sound/SoundFile.cpp295
-rw-r--r--src/sound/SoundFile.h155
-rw-r--r--src/sound/WAVAudioFile.cpp255
-rw-r--r--src/sound/WAVAudioFile.h93
-rw-r--r--src/test/accidentals.cpp88
-rw-r--r--src/test/dummy.cpp6
-rw-r--r--src/test/segmenttransposecommand.cpp161
-rw-r--r--src/test/transpose.cpp154
2711 files changed, 602971 insertions, 0 deletions
diff --git a/AUTHORS b/AUTHORS
new file mode 100644
index 0000000..c94b810
--- /dev/null
+++ b/AUTHORS
@@ -0,0 +1,136 @@
+Lead developers:
+
+Chris Cannam <[email protected]>
+Richard Bown <[email protected]>
+Guillaume Laurent <[email protected]>
+
+Developers:
+
+D. Michael McIntyre <[email protected]>
+Pedro Lopez-Cabanillas <[email protected]>
+Heikki Johannes Junes <[email protected]>
+
+
+Contributors:
+
+Ron Kuris <[email protected]>
+ * cleanups
+
+Randall Farmer <[email protected]>
+ * chord labelling code
+
+Hans Kieserman <[email protected]>
+ * Lilypond output
+ * assorted other patches
+ * i18n-ization
+
+Levi Burton <[email protected]>
+ * UI improvements
+ * other bug fixes
+
+Mark Hymers <[email protected]>
+ * Segment colours
+ * Other UI and bug fixes
+
+Alexandre Prokoudine <[email protected]>
+ * Russian translation
+ * i18n-ization
+
+Jörg Schumann <[email protected]>
+Eckhard Jokisch <[email protected]>
+ * German translation
+
+Kevin Donnelly
+ * Welsh translation
+
+Didier Burli
+Yves Guillemot
+ * French translation
+ * Bug fixes
+
+Daniele Medri
+Alessandro Musesti
+ * Italian translation
+
+Stefan Asserh�l
+Erik Magnus Johansson
+ * Swedish translation
+
+Hasso Tepper
+ * Estonian translation
+
+Jelmer Vernooij
+Jasper Stein
+ * Dutch translation
+
+Oota Toshiya
+ * Japanese translation
+
+Kevin Liang
+ * HSpinBox class
+
+Arnout Engelen
+ * Transposition by interval
+
+Thorsten Wilms
+ * Original designs on which the Rosegarden rotary controllers are based
+
+William <rosegarden4c AT orthoset.com>
+ * auto-scroll deceleration
+ * glyphs for rests outside staves and other bug fixes
+
+Liu Songhe <jackliu9999 AT msn.com>
+ * Simplified Chinese translation
+
+Thomas Nagy <[email protected]>
+ * SCons/bksys building system
+
+Vince Negri <[email protected]>
+ * Initial MTC slave implementation (the bits without the bugs)
+
+Toni Arnold <[email protected]>
+ * LIRC infrared remote-controller support
+
+Stephen Torri <[email protected]>
+ * Initial guitar chord editing code
+
+Jan B�a <[email protected]>
+ * Czech translation
+
+Vladimir Savic <[email protected]>
+ * icons, icons, icons
+
+Lisandro Damián Nicanor Pérez Meyer <[email protected]>
+Javier Castrillo <[email protected]>
+Lucas Godoy <[email protected]>
+Marcos Guglielmetti <[email protected]>
+ * Spanish translation
+
+Feliu Ferrer <[email protected]>
+Quim Perez i Noguer <[email protected]>
+ * Catalan translation
+
+Carolyn McIntyre (deceased)
+ * 1.2.3 splash screen photo
+ * Gave birth to D. Michael McIntyre, bought him a good flute once upon a
+ time, and always humored him when he came over to play her some new
+ instrument, even though she really hated his playing.
+ Born October 19, 1951, died September 21, 2007, R. I. P.
+
+Piotr Sawicki <[email protected]>
+ * Polish translation
+
+David García-Abad <[email protected]>
+ * Basque translation
+
+Mikhail Yakshin <[email protected]>
+ * Author of KGuitar, source of inspiration and bits of code for fretboards
+
+Joerg C. Koenig <[email protected]>
+Craig Drummond, Bernhard Rosenkränzer, Preston Brown, Than Ngo
+ * Klearlook theme
+
+
+##
+## Names in here should also be credited in gui/application/main.cpp, with aboutData.addCredit()
+##
diff --git a/CMakeLists.txt b/CMakeLists.txt
new file mode 100644
index 0000000..9a01977
--- /dev/null
+++ b/CMakeLists.txt
@@ -0,0 +1,396 @@
+# Rosegarden
+# A MIDI and audio sequencer and musical notation editor.
+#
+# This program is Copyright 2000-2008
+# Guillaume Laurent <[email protected]>,
+# Chris Cannam <[email protected]>,
+# Richard Bown <[email protected]>
+#
+# The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+# Bown to claim authorship of this work have been asserted.
+#
+# This file is Copyright 2006-2008
+# Pedro Lopez-Cabanillas <[email protected]>
+#
+# Other copyrights also apply to some parts of this work. Please
+# see the AUTHORS file and individual file headers for details.
+#
+# 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. See the file
+# COPYING included with this distribution for more information.
+
+# The name of our project is "ROSEGARDEN". CMakeLists files in this project can
+# refer to the root source directory of the project as ${ROSEGARDEN_SOURCE_DIR}
+# and to the root binary directory of the project as ${ROSEGARDEN_BINARY_DIR}
+PROJECT(ROSEGARDEN)
+
+# CMake supports KDE checks since this version number
+CMAKE_MINIMUM_REQUIRED(VERSION 2.4.2)
+
+# Show full commands and messages. It generates a lot of console output.
+# It is necessary for Eclipse warning/error parser,
+# but it can be enabled anyway with "make VERBOSE=1"
+SET(CMAKE_VERBOSE_MAKEFILE OFF)
+
+# Seems that relative paths break some scripts. Don't set it ON
+SET(CMAKE_USE_RELATIVE_PATHS OFF)
+
+# Rebuild the object files if the rules have changed, but not the actual source
+# files or headers (e.g. if you changed the some compiler switches)
+SET(CMAKE_SKIP_RULE_DEPENDENCY OFF)
+
+# Misc settings
+SET(CMAKE_COLOR_MAKEFILE ON)
+SET(CMAKE_INCLUDE_CURRENT_DIR ON)
+SET(CMAKE_BUILD_WITH_INSTALL_RPATH ON)
+
+# Additional CMake modules for 3rd party library checks reside here
+SET(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake_admin")
+
+# Mark as advanced
+MARK_AS_ADVANCED(EXECUTABLE_OUTPUT_PATH
+ LIBRARY_OUTPUT_PATH
+ CMAKE_BACKWARDS_COMPATIBILITY)
+
+# Rosegarden version string
+SET (VERSION_MAJOR "1")
+SET (VERSION_MINOR "7")
+SET (VERSION_PATCH "0")
+# comment out the next line for a public release
+#SET (VERSION_SUFFIX "svn")
+SET (VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH})
+IF(VERSION_SUFFIX)
+ SET (VERSION "${VERSION}-${VERSION_SUFFIX}")
+ENDIF(VERSION_SUFFIX)
+ADD_DEFINITIONS(-D'VERSION="${VERSION}"')
+
+# User options
+OPTION(WANT_DEBUG "Include debug support" OFF)
+OPTION(WANT_FULLDBG "Full debug support (BIG executables!)" OFF)
+OPTION(WANT_SOUND "Include Sound support" ON)
+OPTION(WANT_JACK "Include Jack (Jack Audio Connection Kit) support" ON)
+OPTION(WANT_DSSI "Include DSSI support" ON)
+OPTION(WANT_LIRC "Include LIRC (Linux Infrared Remote Control) support" OFF)
+OPTION(WANT_PCH "Use precompiled headers" OFF)
+OPTION(WANT_TEST "Perform unit tests" OFF)
+
+IF(WANT_TEST)
+ ENABLE_TESTING()
+ENDIF(WANT_TEST)
+
+IF(NOT WANT_SOUND)
+ SET(WANT_JACK OFF)
+ SET(WANT_DSSI OFF)
+ ADD_DEFINITIONS(-DNO_SOUND)
+ENDIF(NOT WANT_SOUND)
+
+# Check for KDE3
+FIND_PACKAGE(KDE3 REQUIRED QUIET)
+IF(QT_FOUND)
+ ADD_DEFINITIONS(${QT_DEFINITIONS})
+ MESSAGE(STATUS "Found Qt3 (version ${qt_version_str})")
+ #MESSAGE("QT_LIBRARIES: ${QT_LIBRARIES}")
+ELSE(QT_FOUND)
+ MESSAGE(FATAL_ERROR "Qt3 package not found")
+ENDIF(QT_FOUND)
+IF(KDE3_FOUND)
+ ADD_DEFINITIONS(${KDE3_DEFINITIONS})
+ #MESSAGE("KDE3PREFIX: ${KDE3PREFIX}")
+ KDE3_PRINT_RESULTS()
+ #MESSAGE("QT_AND_KDECORE_LIBS: ${QT_AND_KDECORE_LIBS}")
+ELSE(KDE3_FOUND)
+ MESSAGE(FATAL_ERROR "KDE3 Not found")
+ENDIF(KDE3_FOUND)
+
+# Clear the flags set by FindKDE3
+SET(CMAKE_CXX_FLAGS "")
+MARK_AS_ADVANCED(KDE3_BUILD_TESTS
+ KDE3_ENABLE_FINAL
+ KDE3_DCOPIDL_EXECUTABLE
+ KDE3_DCOPIDL2CPP_EXECUTABLE
+ KDE3_INCLUDE_DIR
+ KDE3_KCFGC_EXECUTABLE
+ KDE3_KDECORE_LIBRARY
+ KDECONFIG_EXECUTABLE )
+
+# Provide the KDE3 prefix as a default prefix (if the user has CMake 2.4.4)
+IF(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
+ SET(CMAKE_INSTALL_PREFIX ${KDE3PREFIX} CACHE PATH
+ "Install path prefix, prepended onto install directories." FORCE)
+ENDIF(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
+
+# Check for PKG-CONFIG
+FIND_PACKAGE(PkgConfig REQUIRED)
+IF(PKG_CONFIG_FOUND)
+ MESSAGE(STATUS "Program pkg-config found (${PKG_CONFIG_EXECUTABLE})")
+ELSE(PKG_CONFIG_FOUND)
+ MESSAGE(FATAL_ERROR "Program pkg-config not found")
+ENDIF(PKG_CONFIG_FOUND)
+
+# Initialize some variables
+SET(HAVE_XFT FALSE)
+SET(HAVE_ALSA FALSE)
+SET(HAVE_JACK FALSE)
+SET(HAVE_DSSI FALSE)
+SET(HAVE_LIBLO FALSE)
+SET(HAVE_LIBLRDF FALSE)
+SET(HAVE_LADSPA FALSE)
+SET(HAVE_LIRC FALSE)
+SET(HAVE_FFTW3F FALSE)
+
+# Check for Xft
+PKG_CHECK_MODULES(XFT xft>=2.1.0)
+IF(XFT_FOUND)
+ ADD_DEFINITIONS(-DHAVE_XFT)
+ SET(HAVE_XFT TRUE)
+ SET(XFT_LIBS ${XFT_LIBRARIES})
+ #MESSAGE("XFT_LIBS: ${XFT_LIBS}")
+ LIST(APPEND XFT_LIB_DIR ${XFT_LIBRARY_DIRS} ${XFT_LIBDIR})
+ #MESSAGE("XFT_LIB_DIR: ${XFT_LIB_DIR}")
+ LIST(APPEND XFT_INC_DIR ${XFT_INCLUDE_DIRS} ${XFT_INCLUDEDIR})
+ #MESSAGE("XFT_INC_DIR: ${XFT_INC_DIR}")
+ENDIF(XFT_FOUND)
+
+IF(WANT_SOUND)
+
+ # Check for ALSA 1.0
+ PKG_CHECK_MODULES(ALSA REQUIRED alsa>=1.0)
+ IF(ALSA_FOUND)
+ SET(HAVE_ALSA TRUE)
+ ADD_DEFINITIONS(-DHAVE_ALSA)
+ SET(ALSA_LIBS ${ALSA_LIBRARIES})
+ #MESSAGE("ALSA_LIBS: ${ALSA_LIBS}")
+ LIST(APPEND ALSA_LIB_DIR ${ALSA_LIBRARY_DIRS} ${ALSA_LIBDIR} )
+ #MESSAGE("ALSA_LIB_DIR: ${ALSA_LIB_DIR}")
+ LIST(APPEND ALSA_INC_DIR ${ALSA_INCLUDE_DIRS} ${ALSA_INCLUDEDIR})
+ #MESSAGE("ALSA_INC_DIR: ${ALSA_INC_DIR}")
+ ELSE(ALSA_FOUND)
+ MESSAGE(FATAL_ERROR "Please install the required package. Aborting")
+ ENDIF(ALSA_FOUND)
+
+ IF(WANT_JACK)
+ PKG_CHECK_MODULES(JACK jack>=0.77)
+ IF(JACK_FOUND)
+ ADD_DEFINITIONS(-DHAVE_LIBJACK)
+ SET(HAVE_JACK TRUE)
+ SET(JACK_LIBS ${JACK_LIBRARIES})
+ #MESSAGE("JACK_LIBS: ${JACK_LIBS}")
+ LIST(APPEND JACK_LIB_DIR ${JACK_LIBDIR} ${JACK_LIBRARY_DIRS})
+ #MESSAGE("JACK_LIB_DIR: ${JACK_LIB_DIR}")
+ LIST(APPEND JACK_INC_DIR ${JACK_INCLUDEDIR} ${JACK_INCLUDE_DIRS})
+ #MESSAGE("JACK_INC_DIR: ${JACK_INC_DIR}")
+ ENDIF(JACK_FOUND)
+ ENDIF(WANT_JACK)
+
+ IF(WANT_DSSI)
+ PKG_CHECK_MODULES(DSSI dssi>=0.4)
+ IF(DSSI_FOUND)
+ ADD_DEFINITIONS(-DHAVE_DSSI)
+ SET(HAVE_DSSI TRUE)
+ LIST(APPEND DSSI_INC_DIR ${DSSI_INCLUDE_DIRS} ${DSSI_INCLUDEDIR})
+ #MESSAGE("DSSI_INC_DIR: ${DSSI_INC_DIR}")
+ ENDIF(DSSI_FOUND)
+ ENDIF(WANT_DSSI)
+
+ PKG_CHECK_MODULES(LIBLO liblo>=0.7)
+ IF(LIBLO_FOUND)
+ ADD_DEFINITIONS(-DHAVE_LIBLO)
+ SET(HAVE_LIBLO TRUE)
+ SET(LIBLO_LIBS ${LIBLO_LIBRARIES})
+ #MESSAGE("LIBLO_LIBS: ${LIBLO_LIBS}")
+ LIST(APPEND LIBLO_LIB_DIR ${LIBLO_LIBDIR} ${LIBLO_LIBRARY_DIRS})
+ #MESSAGE("LIBLO_LIB_DIR: ${LIBLO_LIB_DIR}")
+ LIST(APPEND LIBLO_INC_DIR ${LIBLO_INCLUDEDIR} ${LIBLO_INCLUDE_DIRS})
+ #MESSAGE("LIBLO_INC_DIR: ${LIBLO_INC_DIR}")
+ ENDIF(LIBLO_FOUND)
+
+ PKG_CHECK_MODULES(LRDF lrdf>=0.3)
+ IF(LRDF_FOUND)
+ SET(HAVE_LIBLRDF TRUE)
+ ADD_DEFINITIONS(-DHAVE_LIBLRDF)
+ SET(LRDF_LIBS ${LRDF_LIBRARIES})
+ #MESSAGE("LRDF_LIBS: ${LRDF_LIBS}")
+ LIST(APPEND LRDF_LIB_DIR ${LRDF_LIBDIR} ${LRDF_LIBRARY_DIRS})
+ #MESSAGE("LRDF_LIB_DIR: ${LRDF_LIB_DIR}")
+ LIST(APPEND LRDF_INC_DIR ${LRDF_INCLUDEDIR} ${LRDF_INCLUDE_DIRS})
+ #MESSAGE("LRDF_INC_DIR: ${LRDF_INC_DIR}")
+ ENDIF(LRDF_FOUND)
+
+ FIND_PACKAGE(LADSPA QUIET)
+ IF(LADSPA_FOUND)
+ SET(HAVE_LADSPA TRUE)
+ ADD_DEFINITIONS(-DHAVE_LADSPA)
+ SET(LADSPA_INC_DIR ${LADSPA_INCLUDE_DIR})
+ MESSAGE(STATUS "Found LADSPA (${LADSPA_INC_DIR})")
+ ENDIF(LADSPA_FOUND)
+
+ENDIF(WANT_SOUND)
+
+PKG_CHECK_MODULES(FFTW3F REQUIRED fftw3f>=3.0.0)
+IF(FFTW3F_FOUND)
+ ADD_DEFINITIONS(-DHAVE_FFTW3F)
+ SET(HAVE_FFTW3F TRUE)
+ SET(FFTW3F_LIBS ${FFTW3F_LIBRARIES})
+ #MESSAGE("FFTW3F_LIBS: ${FFTW3F_LIBS}")
+ LIST(APPEND FFTW3F_LIB_DIR ${FFTW3F_LIBDIR} ${FFTW3F_LIBRARY_DIRS})
+ #MESSAGE("FFTW3F_LIB_DIR: ${FFTW3F_LIB_DIR}")
+ LIST(APPEND FFTW3F_INC_DIR ${FFTW3F_INCLUDEDIR} ${FFTW3F_INCLUDE_DIRS})
+ #MESSAGE("FFTW3F_INC_DIR: ${FFTW3F_INC_DIR}")
+ELSE(FFTW3F_FOUND)
+ MESSAGE(FATAL_ERROR "Please install the required package. Aborting")
+ENDIF(FFTW3F_FOUND)
+
+IF(WANT_LIRC)
+ FIND_PACKAGE(LIRC QUIET)
+ IF(LIRC_FOUND)
+ SET(HAVE_LIRC TRUE)
+ ADD_DEFINITIONS(-DHAVE_LIRC)
+ MESSAGE(STATUS "Found LIRC (${LIRC_LIBRARY})")
+ SET(LIRC_LIBS ${LIRC_LIBRARY})
+ SET(LIRC_INC_DIR ${LIRC_INCLUDE_DIR})
+ SET(LIRC_LIB_DIR ${LIRC_LIBRARY_DIR})
+ #MESSAGE("LIRC_LIBS: ${LIRC_LIBS}")
+ #MESSAGE("LIRC_LIB_DIR: ${LIRC_LIB_DIR}")
+ #MESSAGE("LIRC_INC_DIR: ${LIRC_INC_DIR}")
+ ENDIF(LIRC_FOUND)
+ENDIF(WANT_LIRC)
+
+FIND_PACKAGE(MSGFMT REQUIRED)
+IF(MSGFMT_FOUND)
+ MESSAGE(STATUS "Program msgfmt found (${MSGFMT_EXECUTABLE})")
+ENDIF(MSGFMT_FOUND)
+
+FIND_PACKAGE(KDECONFIG)
+IF(KDECONFIG_EXECUTABLE)
+ MESSAGE(STATUS "Program kde-config found (${KDECONFIG_EXECUTABLE})")
+ #MESSAGE("KDE3PREFIX: ${KDE3PREFIX}")
+ENDIF(KDECONFIG_EXECUTABLE)
+
+FIND_PACKAGE(MEINPROC REQUIRED)
+IF(MEINPROC_FOUND)
+ MESSAGE(STATUS "Program meinproc found (${MEINPROC_EXECUTABLE})")
+ENDIF(MEINPROC_FOUND)
+
+# Check GCC for PCH support
+SET(USE_PCH FALSE)
+IF(WANT_PCH)
+ FIND_PACKAGE(PCHSupport)
+ IF(PCHSupport_FOUND)
+ SET(USE_PCH TRUE)
+ ADD_DEFINITIONS(-DUSE_PCH)
+ MESSAGE(STATUS "Enabling precompiled headers for GCC ${gcc_compiler_version}")
+ ENDIF(PCHSupport_FOUND)
+ENDIF(WANT_PCH)
+
+# Check PTHREAD_MUTEX_RECURSIVE
+INCLUDE(CheckCSourceCompiles)
+CHECK_C_SOURCE_COMPILES(
+ "#include <pthread.h>
+ int main(int argc, char **argv) {
+ pthread_mutexattr_t attr;
+ pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
+ return 0;
+ }" PTHREAD_HAS_MUTEX_RECURSIVE)
+IF(PTHREAD_HAS_MUTEX_RECURSIVE)
+ ADD_DEFINITIONS(-DHAVE_PTHREAD_MUTEX_RECURSIVE)
+ENDIF(PTHREAD_HAS_MUTEX_RECURSIVE)
+# End of PTHREAD_MUTEX_RECURSIVE Test
+
+SET(CMAKE_CXX_FLAGS_RELEASE "-O2 -w -fexceptions -DNDEBUG")
+SET(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2 -g -Wall -fexceptions -DDEBUG")
+SET(CMAKE_CXX_FLAGS_DEBUG "-O0 -g3 -Wall -fexceptions -DDEBUG")
+
+MESSAGE(STATUS "Rosegarden ${VERSION} will be built for install into ${CMAKE_INSTALL_PREFIX}")
+
+IF(WANT_DEBUG)
+ IF(WANT_FULLDBG)
+ MESSAGE(STATUS "Configured to compile including full debug information in the executables")
+ SET(CMAKE_BUILD_TYPE Debug CACHE STRING
+ "Choose the type of build, options are: Debug Release RelWithDebInfo" FORCE)
+ ELSE(WANT_FULLDBG)
+ MESSAGE(STATUS "Configured to compile including debug information in the executables")
+ SET(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING
+ "Choose the type of build, options are: Debug Release RelWithDebInfo" FORCE)
+ ENDIF(WANT_FULLDBG)
+ELSE(WANT_DEBUG)
+ MESSAGE(STATUS "Configured to compile for release without debug information")
+ SET(CMAKE_BUILD_TYPE Release CACHE STRING
+ "Choose the type of build, options are: Debug Release RelWithDebInfo" FORCE)
+ENDIF(WANT_DEBUG)
+MARK_AS_ADVANCED(CMAKE_BUILD_TYPE)
+
+# Warn the user if important libraries are missing
+INCLUDE(UserWarnings)
+
+# Recurse into the "src" subdirectory. This does not actually
+# cause another cmake executable to run. The same process will walk through
+# the project's entire directory structure.
+# Output directory will be "RGbuild/"
+ADD_SUBDIRECTORY(src RGbuild)
+
+# Build and install the translations directory
+ADD_SUBDIRECTORY(po RGbuild/po)
+
+# Build and install the documentation directory
+ADD_SUBDIRECTORY(docs RGbuild/docs)
+
+# Install data files
+ADD_SUBDIRECTORY(data RGbuild/data)
+
+# install some documents...
+# INSTALL( FILES AUTHORS COPYING README TRANSLATORS INSTALL rosegarden.lsm
+# DESTINATION share/doc/rosegarden-${VERSION} )
+
+# create and install the version file
+FILE(WRITE version.txt "${VERSION}\n")
+INSTALL( FILES version.txt
+ DESTINATION ${KDE3DATADIR}/rosegarden )
+
+# uninstall custom target
+CONFIGURE_FILE(
+ "${CMAKE_SOURCE_DIR}/cmake_admin/cmake_uninstall.cmake.in"
+ "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake"
+ IMMEDIATE @ONLY)
+
+ADD_CUSTOM_TARGET(uninstall
+ "${CMAKE_COMMAND}" -P "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake")
+
+# Custom target trying to clean the CMake generated files
+ADD_CUSTOM_TARGET ( distclean
+ COMMAND rm -f {,src/,po/,docs/,data/}CMakeCache.txt
+ COMMAND rm -f {,src/,po/,docs/,data/}cmake_install.cmake
+ COMMAND rm -f {,src/,po/,docs/,data/}cmake_uninstall.cmake
+ COMMAND rm -f {,src/,po/,docs/,data/}CPackConfig.cmake
+ COMMAND rm -f {,src/,po/,docs/,data/}CPackSourceConfig.cmake
+ COMMAND rm -f {,src/,po/,docs/,data/}install_manifest.txt
+ COMMAND rm -f {,src/,po/,docs/,data/}progress.make
+ COMMAND rm -f {,src/,po/,docs/,data/}rosegarden.spec
+ COMMAND rm -f {,src/,po/,docs/,data/}Makefile
+ COMMAND rm -rf {,src/,po/,docs/,data/}CMakeFiles
+ COMMAND rm -rf {,src/,po/,docs/,data/}_CPack_Packages
+ COMMAND rm -rf RGbuild/*
+ WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
+)
+ADD_DEPENDENCIES(distclean clean)
+
+# configure the RPM spec
+CONFIGURE_FILE(
+ "${CMAKE_SOURCE_DIR}/rosegarden.spec.in"
+ "${CMAKE_SOURCE_DIR}/rosegarden.spec"
+ IMMEDIATE @ONLY)
+
+# tarball target
+ADD_CUSTOM_TARGET ( tarball
+ COMMAND mkdir -p rosegarden-${VERSION}
+ COMMAND cp -r cmake_admin rosegarden-${VERSION}
+ COMMAND cp -r data rosegarden-${VERSION}
+ COMMAND cp -r docs rosegarden-${VERSION}
+ COMMAND cp -r po rosegarden-${VERSION}
+ COMMAND cp -r src rosegarden-${VERSION}
+ COMMAND cp CMakeLists.txt AUTHORS COPYING Doxyfile INSTALL README rosegarden.* TRANSLATORS rosegarden-${VERSION}
+ COMMAND tar -cj --exclude .svn --exclude gettext-0.10.35-kde -f rosegarden-${VERSION}.tar.bz2 rosegarden-${VERSION}
+ COMMAND rm -rf rosegarden-${VERSION}
+ WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
+)
diff --git a/COPYING b/COPYING
new file mode 100644
index 0000000..c7aea18
--- /dev/null
+++ b/COPYING
@@ -0,0 +1,280 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 675 Mass Ave, Cambridge, MA 02139, USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
diff --git a/Doxyfile b/Doxyfile
new file mode 100644
index 0000000..1f2f6f0
--- /dev/null
+++ b/Doxyfile
@@ -0,0 +1,1232 @@
+# Doxyfile 1.4.4
+
+# This file describes the settings to be used by the documentation system
+# doxygen (www.doxygen.org) for a project
+#
+# All text after a hash (#) is considered a comment and will be ignored
+# The format is:
+# TAG = value [value, ...]
+# For lists items can also be appended using:
+# TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (" ")
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+
+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded
+# by quotes) that should identify the project.
+
+PROJECT_NAME = Rosegarden
+
+# The PROJECT_NUMBER tag can be used to enter a project or revision number.
+# This could be handy for archiving the generated documentation or
+# if some version control system is used.
+
+PROJECT_NUMBER = 1.7.0
+
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
+# base path where the generated documentation will be put.
+# If a relative path is entered, it will be relative to the location
+# where doxygen was started. If left blank the current directory will be used.
+
+OUTPUT_DIRECTORY = /tmp
+
+# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create
+# 4096 sub-directories (in 2 levels) under the output directory of each output
+# format and will distribute the generated files over these directories.
+# Enabling this option can be useful when feeding doxygen a huge amount of
+# source files, where putting all generated files in the same directory would
+# otherwise cause performance problems for the file system.
+
+CREATE_SUBDIRS = NO
+
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all
+# documentation generated by doxygen is written. Doxygen will use this
+# information to generate all constant output in the proper language.
+# The default language is English, other supported languages are:
+# Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish,
+# Dutch, Finnish, French, German, Greek, Hungarian, Italian, Japanese,
+# Japanese-en (Japanese with English messages), Korean, Korean-en, Norwegian,
+# Polish, Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish,
+# Swedish, and Ukrainian.
+
+OUTPUT_LANGUAGE = English
+
+# This tag can be used to specify the encoding used in the generated output.
+# The encoding is not always determined by the language that is chosen,
+# but also whether or not the output is meant for Windows or non-Windows users.
+# In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES
+# forces the Windows encoding (this is the default for the Windows binary),
+# whereas setting the tag to NO uses a Unix-style encoding (the default for
+# all platforms other than Windows).
+
+USE_WINDOWS_ENCODING = NO
+
+# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will
+# include brief member descriptions after the members that are listed in
+# the file and class documentation (similar to JavaDoc).
+# Set to NO to disable this.
+
+BRIEF_MEMBER_DESC = YES
+
+# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend
+# the brief description of a member or function before the detailed description.
+# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
+# brief descriptions will be completely suppressed.
+
+REPEAT_BRIEF = YES
+
+# This tag implements a quasi-intelligent brief description abbreviator
+# that is used to form the text in various listings. Each string
+# in this list, if found as the leading text of the brief description, will be
+# stripped from the text and the result after processing the whole list, is
+# used as the annotated text. Otherwise, the brief description is used as-is.
+# If left blank, the following values are used ("$name" is automatically
+# replaced with the name of the entity): "The $name class" "The $name widget"
+# "The $name file" "is" "provides" "specifies" "contains"
+# "represents" "a" "an" "the"
+
+ABBREVIATE_BRIEF =
+
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
+# Doxygen will generate a detailed section even if there is only a brief
+# description.
+
+ALWAYS_DETAILED_SEC = NO
+
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
+# inherited members of a class in the documentation of that class as if those
+# members were ordinary class members. Constructors, destructors and assignment
+# operators of the base classes will not be shown.
+
+INLINE_INHERITED_MEMB = YES
+
+# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full
+# path before files name in the file list and in the header files. If set
+# to NO the shortest path that makes the file name unique will be used
+
+FULL_PATH_NAMES = YES
+
+# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag
+# can be used to strip a user-defined part of the path. Stripping is
+# only done if one of the specified strings matches the left-hand part of
+# the path. The tag can be used to show relative paths in the file list.
+# If left blank the directory from which doxygen is run is used as the
+# path to strip.
+
+STRIP_FROM_PATH =
+
+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of
+# the path mentioned in the documentation of a class, which tells
+# the reader which header file to include in order to use a class.
+# If left blank only the name of the header file containing the class
+# definition is used. Otherwise one should specify the include paths that
+# are normally passed to the compiler using the -I flag.
+
+STRIP_FROM_INC_PATH =
+
+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter
+# (but less readable) file names. This can be useful is your file systems
+# doesn't support long names like on DOS, Mac, or CD-ROM.
+
+SHORT_NAMES = NO
+
+# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen
+# will interpret the first line (until the first dot) of a JavaDoc-style
+# comment as the brief description. If set to NO, the JavaDoc
+# comments will behave just like the Qt-style comments (thus requiring an
+# explicit @brief command for a brief description.
+
+JAVADOC_AUTOBRIEF = NO
+
+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen
+# treat a multi-line C++ special comment block (i.e. a block of //! or ///
+# comments) as a brief description. This used to be the default behaviour.
+# The new default is to treat a multi-line C++ comment block as a detailed
+# description. Set this tag to YES if you prefer the old behaviour instead.
+
+MULTILINE_CPP_IS_BRIEF = NO
+
+# If the DETAILS_AT_TOP tag is set to YES then Doxygen
+# will output the detailed description near the top, like JavaDoc.
+# If set to NO, the detailed description appears after the member
+# documentation.
+
+DETAILS_AT_TOP = NO
+
+# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented
+# member inherits the documentation from any documented member that it
+# re-implements.
+
+INHERIT_DOCS = YES
+
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
+# tag is set to YES, then doxygen will reuse the documentation of the first
+# member in the group (if any) for the other members of the group. By default
+# all members of a group must be documented explicitly.
+
+DISTRIBUTE_GROUP_DOC = NO
+
+# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce
+# a new page for each member. If set to NO, the documentation of a member will
+# be part of the file/class/namespace that contains it.
+
+SEPARATE_MEMBER_PAGES = NO
+
+# The TAB_SIZE tag can be used to set the number of spaces in a tab.
+# Doxygen uses this value to replace tabs by spaces in code fragments.
+
+TAB_SIZE = 8
+
+# This tag can be used to specify a number of aliases that acts
+# as commands in the documentation. An alias has the form "name=value".
+# For example adding "sideeffect=\par Side Effects:\n" will allow you to
+# put the command \sideeffect (or @sideeffect) in the documentation, which
+# will result in a user-defined paragraph with heading "Side Effects:".
+# You can put \n's in the value part of an alias to insert newlines.
+
+ALIASES =
+
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C
+# sources only. Doxygen will then generate output that is more tailored for C.
+# For instance, some of the names that are used will be different. The list
+# of all members will be omitted, etc.
+
+OPTIMIZE_OUTPUT_FOR_C = NO
+
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java sources
+# only. Doxygen will then generate output that is more tailored for Java.
+# For instance, namespaces will be presented as packages, qualified scopes
+# will look different, etc.
+
+OPTIMIZE_OUTPUT_JAVA = NO
+
+# Set the SUBGROUPING tag to YES (the default) to allow class member groups of
+# the same type (for instance a group of public functions) to be put as a
+# subgroup of that type (e.g. under the Public Functions section). Set it to
+# NO to prevent subgrouping. Alternatively, this can be done per class using
+# the \nosubgrouping command.
+
+SUBGROUPING = YES
+
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+
+# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in
+# documentation are documented, even if no documentation was available.
+# Private class members and static file members will be hidden unless
+# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
+
+EXTRACT_ALL = YES
+
+# If the EXTRACT_PRIVATE tag is set to YES all private members of a class
+# will be included in the documentation.
+
+EXTRACT_PRIVATE = YES
+
+# If the EXTRACT_STATIC tag is set to YES all static members of a file
+# will be included in the documentation.
+
+EXTRACT_STATIC = YES
+
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs)
+# defined locally in source files will be included in the documentation.
+# If set to NO only classes defined in header files are included.
+
+EXTRACT_LOCAL_CLASSES = YES
+
+# This flag is only useful for Objective-C code. When set to YES local
+# methods, which are defined in the implementation section but not in
+# the interface are included in the documentation.
+# If set to NO (the default) only methods in the interface are included.
+
+EXTRACT_LOCAL_METHODS = NO
+
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all
+# undocumented members of documented classes, files or namespaces.
+# If set to NO (the default) these members will be included in the
+# various overviews, but no documentation section is generated.
+# This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_MEMBERS = NO
+
+# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all
+# undocumented classes that are normally visible in the class hierarchy.
+# If set to NO (the default) these classes will be included in the various
+# overviews. This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_CLASSES = NO
+
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all
+# friend (class|struct|union) declarations.
+# If set to NO (the default) these declarations will be included in the
+# documentation.
+
+HIDE_FRIEND_COMPOUNDS = NO
+
+# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any
+# documentation blocks found inside the body of a function.
+# If set to NO (the default) these blocks will be appended to the
+# function's detailed documentation block.
+
+HIDE_IN_BODY_DOCS = NO
+
+# The INTERNAL_DOCS tag determines if documentation
+# that is typed after a \internal command is included. If the tag is set
+# to NO (the default) then the documentation will be excluded.
+# Set it to YES to include the internal documentation.
+
+INTERNAL_DOCS = NO
+
+# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate
+# file names in lower-case letters. If set to YES upper-case letters are also
+# allowed. This is useful if you have classes or files whose names only differ
+# in case and if your file system supports case sensitive file names. Windows
+# and Mac users are advised to set this option to NO.
+
+CASE_SENSE_NAMES = YES
+
+# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen
+# will show members with their full class and namespace scopes in the
+# documentation. If set to YES the scope will be hidden.
+
+HIDE_SCOPE_NAMES = NO
+
+# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen
+# will put a list of the files that are included by a file in the documentation
+# of that file.
+
+SHOW_INCLUDE_FILES = YES
+
+# If the INLINE_INFO tag is set to YES (the default) then a tag [inline]
+# is inserted in the documentation for inline members.
+
+INLINE_INFO = YES
+
+# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen
+# will sort the (detailed) documentation of file and class members
+# alphabetically by member name. If set to NO the members will appear in
+# declaration order.
+
+SORT_MEMBER_DOCS = YES
+
+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the
+# brief documentation of file, namespace and class members alphabetically
+# by member name. If set to NO (the default) the members will appear in
+# declaration order.
+
+SORT_BRIEF_DOCS = NO
+
+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be
+# sorted by fully-qualified names, including namespaces. If set to
+# NO (the default), the class list will be sorted only by class name,
+# not including the namespace part.
+# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
+# Note: This option applies only to the class list, not to the
+# alphabetical list.
+
+SORT_BY_SCOPE_NAME = NO
+
+# The GENERATE_TODOLIST tag can be used to enable (YES) or
+# disable (NO) the todo list. This list is created by putting \todo
+# commands in the documentation.
+
+GENERATE_TODOLIST = YES
+
+# The GENERATE_TESTLIST tag can be used to enable (YES) or
+# disable (NO) the test list. This list is created by putting \test
+# commands in the documentation.
+
+GENERATE_TESTLIST = YES
+
+# The GENERATE_BUGLIST tag can be used to enable (YES) or
+# disable (NO) the bug list. This list is created by putting \bug
+# commands in the documentation.
+
+GENERATE_BUGLIST = YES
+
+# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or
+# disable (NO) the deprecated list. This list is created by putting
+# \deprecated commands in the documentation.
+
+GENERATE_DEPRECATEDLIST= YES
+
+# The ENABLED_SECTIONS tag can be used to enable conditional
+# documentation sections, marked by \if sectionname ... \endif.
+
+ENABLED_SECTIONS =
+
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines
+# the initial value of a variable or define consists of for it to appear in
+# the documentation. If the initializer consists of more lines than specified
+# here it will be hidden. Use a value of 0 to hide initializers completely.
+# The appearance of the initializer of individual variables and defines in the
+# documentation can be controlled using \showinitializer or \hideinitializer
+# command in the documentation regardless of this setting.
+
+MAX_INITIALIZER_LINES = 30
+
+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated
+# at the bottom of the documentation of classes and structs. If set to YES the
+# list will mention the files that were used to generate the documentation.
+
+SHOW_USED_FILES = YES
+
+# If the sources in your project are distributed over multiple directories
+# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy
+# in the documentation. The default is YES.
+
+SHOW_DIRECTORIES = YES
+
+# The FILE_VERSION_FILTER tag can be used to specify a program or script that
+# doxygen should invoke to get the current version for each file (typically from the
+# version control system). Doxygen will invoke the program by executing (via
+# popen()) the command <command> <input-file>, where <command> is the value of
+# the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file
+# provided by doxygen. Whatever the progam writes to standard output
+# is used as the file version. See the manual for examples.
+
+FILE_VERSION_FILTER =
+
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+
+# The QUIET tag can be used to turn on/off the messages that are generated
+# by doxygen. Possible values are YES and NO. If left blank NO is used.
+
+QUIET = NO
+
+# The WARNINGS tag can be used to turn on/off the warning messages that are
+# generated by doxygen. Possible values are YES and NO. If left blank
+# NO is used.
+
+WARNINGS = YES
+
+# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings
+# for undocumented members. If EXTRACT_ALL is set to YES then this flag will
+# automatically be disabled.
+
+WARN_IF_UNDOCUMENTED = YES
+
+# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for
+# potential errors in the documentation, such as not documenting some
+# parameters in a documented function, or documenting parameters that
+# don't exist or using markup commands wrongly.
+
+WARN_IF_DOC_ERROR = YES
+
+# This WARN_NO_PARAMDOC option can be abled to get warnings for
+# functions that are documented, but have no documentation for their parameters
+# or return value. If set to NO (the default) doxygen will only warn about
+# wrong or incomplete parameter documentation, but not about the absence of
+# documentation.
+
+WARN_NO_PARAMDOC = YES
+
+# The WARN_FORMAT tag determines the format of the warning messages that
+# doxygen can produce. The string should contain the $file, $line, and $text
+# tags, which will be replaced by the file and line number from which the
+# warning originated and the warning text. Optionally the format may contain
+# $version, which will be replaced by the version of the file (if it could
+# be obtained via FILE_VERSION_FILTER)
+
+WARN_FORMAT = "$file:$line: $text"
+
+# The WARN_LOGFILE tag can be used to specify a file to which warning
+# and error messages should be written. If left blank the output is written
+# to stderr.
+
+WARN_LOGFILE = docs/doxygen/warning.log
+
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+
+# The INPUT tag can be used to specify the files and/or directories that contain
+# documented source files. You may enter file names like "myfile.cpp" or
+# directories like "/usr/src/myproject". Separate the files or directories
+# with spaces.
+
+INPUT = src/base/ src/commands/ src/document/ src/gui/ src/helpers/ src/misc/ src/sequencer/ src/sound/
+
+# If the value of the INPUT tag contains directories, you can use the
+# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
+# and *.h) to filter out the source-files in the directories. If left
+# blank the following patterns are tested:
+# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx
+# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm
+
+FILE_PATTERNS = *.h \
+ *.C \
+ *.cpp \
+ *.cc
+
+# The RECURSIVE tag can be used to turn specify whether or not subdirectories
+# should be searched for input files as well. Possible values are YES and NO.
+# If left blank NO is used.
+
+RECURSIVE = YES
+
+# The EXCLUDE tag can be used to specify files and/or directories that should
+# excluded from the INPUT source files. This way you can easily exclude a
+# subdirectory from a directory tree whose root is specified with the INPUT tag.
+
+EXCLUDE =
+
+# The EXCLUDE_SYMLINKS tag can be used select whether or not files or
+# directories that are symbolic links (a Unix filesystem feature) are excluded
+# from the input.
+
+EXCLUDE_SYMLINKS = NO
+
+# If the value of the INPUT tag contains directories, you can use the
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
+# certain files from those directories. Note that the wildcards are matched
+# against the file with absolute path, so to exclude all test directories
+# for example use the pattern */test/*
+
+EXCLUDE_PATTERNS = *.moc.cpp \
+ *_skel.cpp
+
+# The EXAMPLE_PATH tag can be used to specify one or more files or
+# directories that contain example code fragments that are included (see
+# the \include command).
+
+EXAMPLE_PATH =
+
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
+# and *.h) to filter out the source-files in the directories. If left
+# blank all files are included.
+
+EXAMPLE_PATTERNS =
+
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
+# searched for input files to be used with the \include or \dontinclude
+# commands irrespective of the value of the RECURSIVE tag.
+# Possible values are YES and NO. If left blank NO is used.
+
+EXAMPLE_RECURSIVE = NO
+
+# The IMAGE_PATH tag can be used to specify one or more files or
+# directories that contain image that are included in the documentation (see
+# the \image command).
+
+IMAGE_PATH =
+
+# The INPUT_FILTER tag can be used to specify a program that doxygen should
+# invoke to filter for each input file. Doxygen will invoke the filter program
+# by executing (via popen()) the command <filter> <input-file>, where <filter>
+# is the value of the INPUT_FILTER tag, and <input-file> is the name of an
+# input file. Doxygen will then use the output that the filter program writes
+# to standard output. If FILTER_PATTERNS is specified, this tag will be
+# ignored.
+
+INPUT_FILTER =
+
+# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
+# basis. Doxygen will compare the file name with each pattern and apply the
+# filter if there is a match. The filters are a list of the form:
+# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further
+# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER
+# is applied to all files.
+
+FILTER_PATTERNS =
+
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
+# INPUT_FILTER) will be used to filter the input files when producing source
+# files to browse (i.e. when SOURCE_BROWSER is set to YES).
+
+FILTER_SOURCE_FILES = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will
+# be generated. Documented entities will be cross-referenced with these sources.
+# Note: To get rid of all source code in the generated output, make sure also
+# VERBATIM_HEADERS is set to NO.
+
+SOURCE_BROWSER = YES
+
+# Setting the INLINE_SOURCES tag to YES will include the body
+# of functions and classes directly in the documentation.
+
+INLINE_SOURCES = NO
+
+# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct
+# doxygen to hide any special comment blocks from generated source code
+# fragments. Normal C and C++ comments will always remain visible.
+
+STRIP_CODE_COMMENTS = YES
+
+# If the REFERENCED_BY_RELATION tag is set to YES (the default)
+# then for each documented function all documented
+# functions referencing it will be listed.
+
+REFERENCED_BY_RELATION = YES
+
+# If the REFERENCES_RELATION tag is set to YES (the default)
+# then for each documented function all documented entities
+# called/used by that function will be listed.
+
+REFERENCES_RELATION = YES
+
+# If the USE_HTAGS tag is set to YES then the references to source code
+# will point to the HTML generated by the htags(1) tool instead of doxygen
+# built-in source browser. The htags tool is part of GNU's global source
+# tagging system (see http://www.gnu.org/software/global/global.html). You
+# will need version 4.8.6 or higher.
+
+USE_HTAGS = NO
+
+# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen
+# will generate a verbatim copy of the header file for each class for
+# which an include is specified. Set to NO to disable this.
+
+VERBATIM_HEADERS = YES
+
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index
+# of all compounds will be generated. Enable this if the project
+# contains a lot of classes, structs, unions or interfaces.
+
+ALPHABETICAL_INDEX = NO
+
+# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then
+# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns
+# in which this list will be split (can be a number in the range [1..20])
+
+COLS_IN_ALPHA_INDEX = 5
+
+# In case all classes in a project start with a common prefix, all
+# classes will be put under the same header in the alphabetical index.
+# The IGNORE_PREFIX tag can be used to specify one or more prefixes that
+# should be ignored while generating the index headers.
+
+IGNORE_PREFIX =
+
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_HTML tag is set to YES (the default) Doxygen will
+# generate HTML output.
+
+GENERATE_HTML = YES
+
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `html' will be used as the default path.
+
+HTML_OUTPUT = html
+
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for
+# each generated HTML page (for example: .htm,.php,.asp). If it is left blank
+# doxygen will generate files with .html extension.
+
+HTML_FILE_EXTENSION = .html
+
+# The HTML_HEADER tag can be used to specify a personal HTML header for
+# each generated HTML page. If it is left blank doxygen will generate a
+# standard header.
+
+HTML_HEADER =
+
+# The HTML_FOOTER tag can be used to specify a personal HTML footer for
+# each generated HTML page. If it is left blank doxygen will generate a
+# standard footer.
+
+HTML_FOOTER =
+
+# The HTML_STYLESHEET tag can be used to specify a user-defined cascading
+# style sheet that is used by each HTML page. It can be used to
+# fine-tune the look of the HTML output. If the tag is left blank doxygen
+# will generate a default style sheet. Note that doxygen will try to copy
+# the style sheet file to the HTML output directory, so don't put your own
+# stylesheet in the HTML output directory as well, or it will be erased!
+
+HTML_STYLESHEET =
+
+# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes,
+# files or namespaces will be aligned in HTML using tables. If set to
+# NO a bullet list will be used.
+
+HTML_ALIGN_MEMBERS = YES
+
+# If the GENERATE_HTMLHELP tag is set to YES, additional index files
+# will be generated that can be used as input for tools like the
+# Microsoft HTML help workshop to generate a compressed HTML help file (.chm)
+# of the generated HTML documentation.
+
+GENERATE_HTMLHELP = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can
+# be used to specify the file name of the resulting .chm file. You
+# can add a path in front of the file if the result should not be
+# written to the html output directory.
+
+CHM_FILE =
+
+# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can
+# be used to specify the location (absolute path including file name) of
+# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run
+# the HTML help compiler on the generated index.hhp.
+
+HHC_LOCATION =
+
+# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag
+# controls if a separate .chi index file is generated (YES) or that
+# it should be included in the master .chm file (NO).
+
+GENERATE_CHI = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag
+# controls whether a binary table of contents is generated (YES) or a
+# normal table of contents (NO) in the .chm file.
+
+BINARY_TOC = NO
+
+# The TOC_EXPAND flag can be set to YES to add extra items for group members
+# to the contents of the HTML help documentation and to the tree view.
+
+TOC_EXPAND = NO
+
+# The DISABLE_INDEX tag can be used to turn on/off the condensed index at
+# top of each HTML page. The value NO (the default) enables the index and
+# the value YES disables it.
+
+DISABLE_INDEX = NO
+
+# This tag can be used to set the number of enum values (range [1..20])
+# that doxygen will group on one line in the generated HTML documentation.
+
+ENUM_VALUES_PER_LINE = 4
+
+# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be
+# generated containing a tree-like index structure (just like the one that
+# is generated for HTML Help). For this to work a browser that supports
+# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+,
+# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are
+# probably better off using the HTML help feature.
+
+GENERATE_TREEVIEW = NO
+
+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be
+# used to set the initial width (in pixels) of the frame in which the tree
+# is shown.
+
+TREEVIEW_WIDTH = 250
+
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will
+# generate Latex output.
+
+GENERATE_LATEX = NO
+
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `latex' will be used as the default path.
+
+LATEX_OUTPUT = latex
+
+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
+# invoked. If left blank `latex' will be used as the default command name.
+
+LATEX_CMD_NAME = latex
+
+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to
+# generate index for LaTeX. If left blank `makeindex' will be used as the
+# default command name.
+
+MAKEINDEX_CMD_NAME = makeindex
+
+# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact
+# LaTeX documents. This may be useful for small projects and may help to
+# save some trees in general.
+
+COMPACT_LATEX = NO
+
+# The PAPER_TYPE tag can be used to set the paper type that is used
+# by the printer. Possible values are: a4, a4wide, letter, legal and
+# executive. If left blank a4wide will be used.
+
+PAPER_TYPE = a4wide
+
+# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX
+# packages that should be included in the LaTeX output.
+
+EXTRA_PACKAGES =
+
+# The LATEX_HEADER tag can be used to specify a personal LaTeX header for
+# the generated latex document. The header should contain everything until
+# the first chapter. If it is left blank doxygen will generate a
+# standard header. Notice: only use this tag if you know what you are doing!
+
+LATEX_HEADER =
+
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated
+# is prepared for conversion to pdf (using ps2pdf). The pdf file will
+# contain links (just like the HTML output) instead of page references
+# This makes the output suitable for online browsing using a pdf viewer.
+
+PDF_HYPERLINKS = NO
+
+# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of
+# plain latex in the generated Makefile. Set this option to YES to get a
+# higher quality PDF documentation.
+
+USE_PDFLATEX = NO
+
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode.
+# command to the generated LaTeX files. This will instruct LaTeX to keep
+# running if errors occur, instead of asking the user for help.
+# This option is also used when generating formulas in HTML.
+
+LATEX_BATCHMODE = NO
+
+# If LATEX_HIDE_INDICES is set to YES then doxygen will not
+# include the index chapters (such as File Index, Compound Index, etc.)
+# in the output.
+
+LATEX_HIDE_INDICES = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output
+# The RTF output is optimized for Word 97 and may not look very pretty with
+# other RTF readers or editors.
+
+GENERATE_RTF = NO
+
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `rtf' will be used as the default path.
+
+RTF_OUTPUT = rtf
+
+# If the COMPACT_RTF tag is set to YES Doxygen generates more compact
+# RTF documents. This may be useful for small projects and may help to
+# save some trees in general.
+
+COMPACT_RTF = NO
+
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated
+# will contain hyperlink fields. The RTF file will
+# contain links (just like the HTML output) instead of page references.
+# This makes the output suitable for online browsing using WORD or other
+# programs which support those fields.
+# Note: wordpad (write) and others do not support links.
+
+RTF_HYPERLINKS = NO
+
+# Load stylesheet definitions from file. Syntax is similar to doxygen's
+# config file, i.e. a series of assignments. You only have to provide
+# replacements, missing definitions are set to their default value.
+
+RTF_STYLESHEET_FILE =
+
+# Set optional variables used in the generation of an rtf document.
+# Syntax is similar to doxygen's config file.
+
+RTF_EXTENSIONS_FILE =
+
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_MAN tag is set to YES (the default) Doxygen will
+# generate man pages
+
+GENERATE_MAN = NO
+
+# The MAN_OUTPUT tag is used to specify where the man pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `man' will be used as the default path.
+
+MAN_OUTPUT = man
+
+# The MAN_EXTENSION tag determines the extension that is added to
+# the generated man pages (default is the subroutine's section .3)
+
+MAN_EXTENSION = .3
+
+# If the MAN_LINKS tag is set to YES and Doxygen generates man output,
+# then it will generate one additional man file for each entity
+# documented in the real man page(s). These additional files
+# only source the real man page, but without them the man command
+# would be unable to find the correct page. The default is NO.
+
+MAN_LINKS = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_XML tag is set to YES Doxygen will
+# generate an XML file that captures the structure of
+# the code including all documentation.
+
+GENERATE_XML = NO
+
+# The XML_OUTPUT tag is used to specify where the XML pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `xml' will be used as the default path.
+
+XML_OUTPUT = xml
+
+# The XML_SCHEMA tag can be used to specify an XML schema,
+# which can be used by a validating XML parser to check the
+# syntax of the XML files.
+
+XML_SCHEMA =
+
+# The XML_DTD tag can be used to specify an XML DTD,
+# which can be used by a validating XML parser to check the
+# syntax of the XML files.
+
+XML_DTD =
+
+# If the XML_PROGRAMLISTING tag is set to YES Doxygen will
+# dump the program listings (including syntax highlighting
+# and cross-referencing information) to the XML output. Note that
+# enabling this will significantly increase the size of the XML output.
+
+XML_PROGRAMLISTING = YES
+
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will
+# generate an AutoGen Definitions (see autogen.sf.net) file
+# that captures the structure of the code including all
+# documentation. Note that this feature is still experimental
+# and incomplete at the moment.
+
+GENERATE_AUTOGEN_DEF = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_PERLMOD tag is set to YES Doxygen will
+# generate a Perl module file that captures the structure of
+# the code including all documentation. Note that this
+# feature is still experimental and incomplete at the
+# moment.
+
+GENERATE_PERLMOD = NO
+
+# If the PERLMOD_LATEX tag is set to YES Doxygen will generate
+# the necessary Makefile rules, Perl scripts and LaTeX code to be able
+# to generate PDF and DVI output from the Perl module output.
+
+PERLMOD_LATEX = NO
+
+# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be
+# nicely formatted so it can be parsed by a human reader. This is useful
+# if you want to understand what is going on. On the other hand, if this
+# tag is set to NO the size of the Perl module output will be much smaller
+# and Perl will parse it just the same.
+
+PERLMOD_PRETTY = YES
+
+# The names of the make variables in the generated doxyrules.make file
+# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX.
+# This is useful so different doxyrules.make files included by the same
+# Makefile don't overwrite each other's variables.
+
+PERLMOD_MAKEVAR_PREFIX =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+
+# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will
+# evaluate all C-preprocessor directives found in the sources and include
+# files.
+
+ENABLE_PREPROCESSING = YES
+
+# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro
+# names in the source code. If set to NO (the default) only conditional
+# compilation will be performed. Macro expansion can be done in a controlled
+# way by setting EXPAND_ONLY_PREDEF to YES.
+
+MACRO_EXPANSION = NO
+
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES
+# then the macro expansion is limited to the macros specified with the
+# PREDEFINED and EXPAND_AS_PREDEFINED tags.
+
+EXPAND_ONLY_PREDEF = NO
+
+# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files
+# in the INCLUDE_PATH (see below) will be search if a #include is found.
+
+SEARCH_INCLUDES = YES
+
+# The INCLUDE_PATH tag can be used to specify one or more directories that
+# contain include files that are not input files but should be processed by
+# the preprocessor.
+
+INCLUDE_PATH =
+
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
+# patterns (like *.h and *.hpp) to filter out the header-files in the
+# directories. If left blank, the patterns specified with FILE_PATTERNS will
+# be used.
+
+INCLUDE_FILE_PATTERNS =
+
+# The PREDEFINED tag can be used to specify one or more macro names that
+# are defined before the preprocessor is started (similar to the -D option of
+# gcc). The argument of the tag is a list of macros of the form: name
+# or name=definition (no spaces). If the definition and the = are
+# omitted =1 is assumed. To prevent a macro definition from being
+# undefined via #undef or recursively expanded use the := operator
+# instead of the = operator.
+
+PREDEFINED = HAVE_ALSA HAVE_LIBJACK HAVE_DSSI HAVE_LADSPA HAVE_LIBLO HAVE_LIBLRDF HAVE_XFT HAVE_LIRC
+
+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then
+# this tag can be used to specify a list of macro names that should be expanded.
+# The macro definition that is found in the sources will be used.
+# Use the PREDEFINED tag if you want to use a different macro definition.
+
+EXPAND_AS_DEFINED =
+
+# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then
+# doxygen's preprocessor will remove all function-like macros that are alone
+# on a line, have an all uppercase name, and do not end with a semicolon. Such
+# function macros are typically used for boiler-plate code, and will confuse
+# the parser if not removed.
+
+SKIP_FUNCTION_MACROS = YES
+
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references
+#---------------------------------------------------------------------------
+
+# The TAGFILES option can be used to specify one or more tagfiles.
+# Optionally an initial location of the external documentation
+# can be added for each tagfile. The format of a tag file without
+# this location is as follows:
+# TAGFILES = file1 file2 ...
+# Adding location for the tag files is done as follows:
+# TAGFILES = file1=loc1 "file2 = loc2" ...
+# where "loc1" and "loc2" can be relative or absolute paths or
+# URLs. If a location is present for each tag, the installdox tool
+# does not have to be run to correct the links.
+# Note that each tag file must have a unique name
+# (where the name does NOT include the path)
+# If a tag file is not located in the directory in which doxygen
+# is run, you must also specify the path to the tagfile here.
+
+TAGFILES =
+
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create
+# a tag file that is based on the input files it reads.
+
+GENERATE_TAGFILE =
+
+# If the ALLEXTERNALS tag is set to YES all external classes will be listed
+# in the class index. If set to NO only the inherited external classes
+# will be listed.
+
+ALLEXTERNALS = NO
+
+# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed
+# in the modules index. If set to NO, only the current project's groups will
+# be listed.
+
+EXTERNAL_GROUPS = YES
+
+# The PERL_PATH should be the absolute path and name of the perl script
+# interpreter (i.e. the result of `which perl').
+
+PERL_PATH = /usr/bin/perl
+
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+
+# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will
+# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base
+# or super classes. Setting the tag to NO turns the diagrams off. Note that
+# this option is superseded by the HAVE_DOT option below. This is only a
+# fallback. It is recommended to install and use dot, since it yields more
+# powerful graphs.
+
+CLASS_DIAGRAMS = YES
+
+# If set to YES, the inheritance and collaboration graphs will hide
+# inheritance and usage relations if the target is undocumented
+# or is not a class.
+
+HIDE_UNDOC_RELATIONS = YES
+
+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
+# available from the path. This tool is part of Graphviz, a graph visualization
+# toolkit from AT&T and Lucent Bell Labs. The other options in this section
+# have no effect if this option is set to NO (the default)
+
+HAVE_DOT = NO
+
+# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for each documented class showing the direct and
+# indirect inheritance relations. Setting this tag to YES will force the
+# the CLASS_DIAGRAMS tag to NO.
+
+CLASS_GRAPH = YES
+
+# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for each documented class showing the direct and
+# indirect implementation dependencies (inheritance, containment, and
+# class references variables) of the class with other documented classes.
+
+COLLABORATION_GRAPH = YES
+
+# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for groups, showing the direct groups dependencies
+
+GROUP_GRAPHS = YES
+
+# If the UML_LOOK tag is set to YES doxygen will generate inheritance and
+# collaboration diagrams in a style similar to the OMG's Unified Modeling
+# Language.
+
+UML_LOOK = NO
+
+# If set to YES, the inheritance and collaboration graphs will show the
+# relations between templates and their instances.
+
+TEMPLATE_RELATIONS = NO
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT
+# tags are set to YES then doxygen will generate a graph for each documented
+# file showing the direct and indirect include dependencies of the file with
+# other documented files.
+
+INCLUDE_GRAPH = YES
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and
+# HAVE_DOT tags are set to YES then doxygen will generate a graph for each
+# documented header file showing the documented files that directly or
+# indirectly include this file.
+
+INCLUDED_BY_GRAPH = YES
+
+# If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will
+# generate a call dependency graph for every global function or class method.
+# Note that enabling this option will significantly increase the time of a run.
+# So in most cases it will be better to enable call graphs for selected
+# functions only using the \callgraph command.
+
+CALL_GRAPH = NO
+
+# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen
+# will graphical hierarchy of all classes instead of a textual one.
+
+GRAPHICAL_HIERARCHY = YES
+
+# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES
+# then doxygen will show the dependencies a directory has on other directories
+# in a graphical way. The dependency relations are determined by the #include
+# relations between the files in the directories.
+
+DIRECTORY_GRAPH = YES
+
+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
+# generated by dot. Possible values are png, jpg, or gif
+# If left blank png will be used.
+
+DOT_IMAGE_FORMAT = png
+
+# The tag DOT_PATH can be used to specify the path where the dot tool can be
+# found. If left blank, it is assumed the dot tool can be found in the path.
+
+DOT_PATH =
+
+# The DOTFILE_DIRS tag can be used to specify one or more directories that
+# contain dot files that are included in the documentation (see the
+# \dotfile command).
+
+DOTFILE_DIRS =
+
+# The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width
+# (in pixels) of the graphs generated by dot. If a graph becomes larger than
+# this value, doxygen will try to truncate the graph, so that it fits within
+# the specified constraint. Beware that most browsers cannot cope with very
+# large images.
+
+MAX_DOT_GRAPH_WIDTH = 1024
+
+# The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height
+# (in pixels) of the graphs generated by dot. If a graph becomes larger than
+# this value, doxygen will try to truncate the graph, so that it fits within
+# the specified constraint. Beware that most browsers cannot cope with very
+# large images.
+
+MAX_DOT_GRAPH_HEIGHT = 1024
+
+# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the
+# graphs generated by dot. A depth value of 3 means that only nodes reachable
+# from the root by following a path via at most 3 edges will be shown. Nodes
+# that lay further from the root node will be omitted. Note that setting this
+# option to 1 or 2 may greatly reduce the computation time needed for large
+# code bases. Also note that a graph may be further truncated if the graph's
+# image dimensions are not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH
+# and MAX_DOT_GRAPH_HEIGHT). If 0 is used for the depth value (the default),
+# the graph is not depth-constrained.
+
+MAX_DOT_GRAPH_DEPTH = 0
+
+# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
+# background. This is disabled by default, which results in a white background.
+# Warning: Depending on the platform used, enabling this option may lead to
+# badly anti-aliased labels on the edges of a graph (i.e. they become hard to
+# read).
+
+DOT_TRANSPARENT = NO
+
+# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output
+# files in one run (i.e. multiple -o and -T options on the command line). This
+# makes dot run faster, but since only newer versions of dot (>1.8.10)
+# support this, this feature is disabled by default.
+
+DOT_MULTI_TARGETS = NO
+
+# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will
+# generate a legend page explaining the meaning of the various boxes and
+# arrows in the dot generated graphs.
+
+GENERATE_LEGEND = YES
+
+# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will
+# remove the intermediate dot files that are used to generate
+# the various graphs.
+
+DOT_CLEANUP = YES
+
+#---------------------------------------------------------------------------
+# Configuration::additions related to the search engine
+#---------------------------------------------------------------------------
+
+# The SEARCHENGINE tag specifies whether or not a search engine should be
+# used. If set to NO the values of all tags below this one will be ignored.
+
+SEARCHENGINE = NO
diff --git a/INSTALL b/INSTALL
new file mode 100644
index 0000000..49f7823
--- /dev/null
+++ b/INSTALL
@@ -0,0 +1,189 @@
+
+How to compile Rosegarden
+=========================
+
+Rosegarden has switched its build system to CMake. We hope this will
+be the last time we change build systems.
+
+You will need CMake 2.4.2 or later. If your Linux distribution
+doesn't provide CMake, or if it provides an older version, you can get
+it here:
+
+ http://cmake.org/HTML/Download.html
+
+There are ready to use binary packages available for Linux-i386 from
+that page. They seem to work well -- use them! We advise you avoid
+building CMake from source if possible. (If you must build it from
+source, please read the instructions supplied with the CMake tarball,
+and remember that it will install to /usr/local by default.)
+
+
+A Typical Build with CMake
+---------------------------
+
+If you are a typical end user wanting to play with the latest
+Rosegarden, and to install it in the same place the distro package you
+are replacing came from, then the the following instructions are
+probably all you need to do in order to get up and running:
+
+First, unpack the tarball or check out SVN. We'll assume you have the
+source in ~/src/rosegarden and need to change to that directory:
+
+$ cd ~/src/rosegarden
+
+Now run CMake to generate the build files, and specify the location
+where your system's KDE libraries are installed. A nice general way
+to do this is:
+
+$ cmake . -DCMAKE_INSTALL_PREFIX=`kde-config --prefix`
+
+If you omit the install prefix and just run
+
+$ cmake .
+
+instead, cmake will prepare to install Rosegarden and its data files
+beneath /usr/local. That may be fine if you have no existing
+Rosegarden installation you want to replace (see also Advanced Build
+Options below).
+
+Finally, run make, and then (sudo) make install, and you're all set:
+
+$ make
+# make install
+
+To uninstall, use:
+
+# make uninstall
+
+
+Advanced Build Options
+----------------------
+
+By default, make will output brief details of each build step. If you
+prefer to see full command lines, use:
+
+$ make VERBOSE=1
+
+By default, the install prefix will be /usr/local. If your KDE is
+installed at some other prefix, you probably want to override this
+setting, as suggested in "A Typical Build with CMake." You may
+install to /usr/local or anywhere else, but if you do so, you must add
+that location to your KDEDIRS environment variable before running
+Rosegarden. For example:
+
+$ export KDEDIRS=/usr/local:$KDEDIRS
+$ rosegarden
+
+Another option, useful for packagers, is setting DESTDIR at install
+time. The DESTDIR directory will be prepended to the prefix when
+copying the files:
+
+$ make install DESTDIR=~/rpmroot
+
+Some variables you may want to set:
+
+ * CMAKE_INSTALL_PREFIX:
+ cmake . -DCMAKE_INSTALL_PREFIX=/opt/kde is the equivalent to
+ ./configure --prefix=/opt/kde for programs that use autotools
+
+ * WANT_XXXX: there are several options, e.g. WANT_JACK or WANT_DSSI.
+ If you disable them, cmake will not even try to find the packages.
+
+ WANT_DEBUG Include debug support (default OFF)
+ WANT_FULLDBG Full debug support (BIG executables!) (default OFF)
+ WANT_SOUND Include MIDI support using ALSA (default ON)
+ WANT_JACK Include audio support using JACK (default ON)
+ WANT_DSSI Include DSSI plugin support (default ON)
+ WANT_LIRC Include LIRC (Linux Infrared Remote Control) support (def. ON)
+ WANT_PCH Use precompiled headers (default OFF)
+
+The above options can take any of the following values: 0, 1, OFF, ON,
+TRUE, FALSE, YES, NO (case insensitive). For example:
+
+$ cmake . -DWANT_DEBUG=YES -DWANT_LIRC=NO -DCMAKE_INSTALL_PREFIX=/opt/kde
+
+Disabling SOUND (eg. WANT_SOUND=OFF) also disables JACK and DSSI. To
+enable FULLDBG you also need to enable DEBUG.
+
+If you would prefer to avoid all this typing, you can use ccmake to
+view and change these options using a friendly curses-based interface:
+
+$ ccmake .
+
+
+Dealing with Configuration Problems
+-----------------------------------
+
+To locate Qt, CMake searches for qmake in your execute path
+($PATH). CMake does not use the QTDIR environment variable. So make
+sure that the first qmake found in the execution path is the one you
+like to use.
+
+When CMake has finished, it will have created a file called
+"CMakeCache.txt". This file contains all the settings CMake has
+detected on your system. If you want to run CMake with another
+generator or you want CMake to detect everything again, delete this
+file.
+
+If CMake didn't find something, but you know it is somewhere on your
+box, you can tell CMake where to find it manually. CMake uses
+variables to store this information. These variables are cached in the
+aforementioned file CMakeCache.txt. You have three options to adjust
+these variables manually:
+
+ * tell CMake the correct value via the command line:
+ $ cmake . -DNAME_OF_THE_VARIABLE=value
+
+ * use ccmake, which provides a curses based GUI to adjust the
+ CMake variables (run: ccmake .)
+
+ * edit the file CMakeCache.txt directly (not recommended)
+
+You should run "ccmake ." at least once so that you get an idea which
+variables CMake uses. Press "T" to see also the "advanced"
+variables. So, if CMake didn't find something, start ccmake and adjust
+it manually.
+
+
+Some other environment variables you may want to set
+----------------------------------------------------
+
+If you have headers and libraries installed in non-standard locations
+that cmake cannot find (e.g., on /sw), then set the following as
+environment variables. Despite the similar naming convention, these
+will not work as arguments on the cmake command line:
+
+ * CMAKE_INCLUDE_PATH: directory where headers reside
+ * CMAKE_LIBRARY_PATH: directory where shared libraries reside
+
+Example:
+$ export CMAKE_INCLUDE_PATH=/sw/include
+$ export CMAKE_LIBRARY_PATH=/sw/lib
+
+For more information on variables, see this cmake.org wiki page:
+
+ http://www.cmake.org/Wiki/CMake_Useful_Variables
+
+
+
+How to proceed if something fails?
+----------------------------------
+
+If cmake finishes with "Generating done" then there was no errors, but
+if it finishes with "Configuring done" then there was errors that you
+have to fix. If you got a failure that says something like
+
+CMake Error: This project requires some variables to be set,
+and cmake can not find them.
+Please set the following variables:
+X11_XTest_LIB (ADVANCED)
+
+So the missing library is Xtst. Perhaps you need to install a
+libXtst-devel library.
+
+If you can't solve the problem, please subscribe and ask your question
+on the rosegarden-user mailing list:
+
+http://lists.sourceforge.net/lists/listinfo/rosegarden-user
+http://www.rosegardenmusic.com/support/
+
diff --git a/README b/README
new file mode 100644
index 0000000..630288a
--- /dev/null
+++ b/README
@@ -0,0 +1,142 @@
+
+Rosegarden v1.7.0
+=================
+
+Rosegarden is a MIDI and audio sequencer and musical notation editor.
+
+ http://www.rosegardenmusic.com/
+
+Please keep an eye on the FAQ for known problems and workarounds:
+
+ http://rosegarden.wiki.sourceforge.net/Frequently+Asked+Questions
+
+When you find bugs, first check whether a newer version of Rosegarden
+has been released yet; if not, please continue on to:
+
+ http://rosegarden.sourceforge.net/tutorial/bug-guidelines.html
+
+
+Build requirements
+------------------
+
+The big requirement is KDE 3.3, or later, or more specifically the KDE
+3.3+ development libraries (you don't need the whole KDE environment).
+
+Our code compiles with gcc-3.x and gcc-4.x.
+
+For MIDI support on Linux, you need ALSA 0.9.x or 1.0; for audio you
+need JACK 0.77 or newer; for synth plugins you need DSSI 0.9.x or
+newer; for synth plugin GUI support you need liblo 0.7 or newer.
+
+We have recently switched to CMake for building (having previously
+started out with autotools and then switched to scons -- sorry!).
+Please read the INSTALL file for details of how to build and install
+Rosegarden using CMake.
+
+
+Running Rosegarden
+------------------
+
+Just run the "rosegarden" application (found in the KDE bin directory
+after installation). The sequencer process is started automatically
+when the gui is started, provided it has been correctly installed (by
+"make install") in the global KDE directories.
+
+If you have any problems running the application, review the
+instructions in the INSTALL file and consult the FAQ:
+
+ http://rosegarden.wiki.sourceforge.net/Frequently+Asked+Questions
+
+If that doesn't answer your question, use the rosegarden-user mailing
+list on SourceForge.
+
+
+User documentation
+------------------
+
+There is a lot of documentation for Rosegarden available through the
+Help menu. Go to Help -> Rosegarden Handbook for the reference
+manual, and Help -> Online Tutorial for a tutorial.
+
+
+SPECIAL NOTES FOR PACKAGE MAINTAINERS
+-------------------------------------
+
+DSSI
+
+Many distros released their packages of Rosegarden v1.0 compiled
+without the optional DSSI/synth plugin support. We received a lot of
+complaints on our lists from your users and ours about your packages
+being built without this feature.
+
+We would like to request that you please take whatever steps are
+necessary within the framework of your particular distro to ensure
+that Rosegarden is built with DSSI support, and ideally that some of
+the currently available DSSI plugins are also packaged for your
+distro. Thank you. For details on DSSI, see:
+
+ http://dssi.sourceforge.net/
+
+
+Notes for developers
+--------------------
+
+We are actively seeking developers who are interested in coding new
+parts of the application, adding features, and fixing bugs. See the
+bug and feature request trackers at SourceForge for inspiration. If
+you intend to do anything, please discuss it on the rosegarden-devel
+mailing list (of course, providing working code will make your
+argument extra persuasive).
+
+Be warned that we tend to be fairly strict about code quality... as
+far as that's possible, given the not always superb standards of our
+own code.
+
+
+Developer documentation
+-----------------------
+
+All the documentation we have (not enough) is in the docs/
+subdirectory, including:
+
+ docs/code/global_design.txt -- which classes do what, more or less
+ docs/data_struct/units.txt -- how we store pitch and time
+ docs/data_struct/sets.txt -- some terminology explained
+
+ docs/howtos/alsa-notes -- brief notes about getting and installing the
+ ALSA sound drivers (we recommend ALSA for use with Rosegarden)
+ docs/howtos/artsd-mcop-notes.txt -- notes on how to get sound with aRts
+ (not recommended!)
+
+
+Authors and copyright
+---------------------
+
+* Rosegarden is Copyright 2000-2008 Guillaume Laurent, Chris Cannam
+ and Richard Bown.
+
+* The moral right of Guillaume Laurent, Chris Cannam and Richard Bown
+ to be identified as the authors of this work has been asserted.
+
+* Parts of Rosegarden are derived from X11 Rosegarden 2.1, which is
+ Copyright 1994 - 2001 Chris Cannam, Andrew Green, Richard Bown and
+ Guillaume Laurent.
+
+* For musical notation display Rosegarden uses pixmaps derived from
+ the Feta font, part of the Lilypond software (http://lilypond.org/)
+ which is Copyright 1997 - 2004 Jan Nieuwenhuizen and Han-Wen Nienhuys.
+
+* Other major contributors include Randall Farmer, Ron Kuris, Hans
+ Kieserman, Michael McIntyre, Pedro Lopez-Cabanillas, Heikki Junes,
+ Stephen Torri, Magnus Johansson, Vince Negri and Martin Shepherd.
+ See AUTHORS for more details, and the individual source files for
+ copyright attributions.
+
+* The Rosegarden splash-screen image is Copyright 2007 D Michael McIntyre.
+
+Rosegarden 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. See the file COPYING included with
+this distribution for more information.
+
diff --git a/TRANSLATORS b/TRANSLATORS
new file mode 100644
index 0000000..d716733
--- /dev/null
+++ b/TRANSLATORS
@@ -0,0 +1,4 @@
+Please see the AUTHORS file for a list of translators.
+
+If you'd like to translate Rosegarden into your language, contact us at
diff --git a/cmake_admin/FindKDECONFIG.cmake b/cmake_admin/FindKDECONFIG.cmake
new file mode 100644
index 0000000..d610682
--- /dev/null
+++ b/cmake_admin/FindKDECONFIG.cmake
@@ -0,0 +1,114 @@
+# Rosegarden
+# A MIDI and audio sequencer and musical notation editor.
+#
+# This program is Copyright 2000-2008
+# Guillaume Laurent <[email protected]>,
+# Chris Cannam <[email protected]>,
+# Richard Bown <[email protected]>
+#
+# The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+# Bown to claim authorship of this work have been asserted.
+#
+# This file is Copyright 2006-2008
+# Pedro Lopez-Cabanillas <[email protected]>
+#
+# Other copyrights also apply to some parts of this work. Please
+# see the AUTHORS file and individual file headers for details.
+#
+# 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. See the file
+# COPYING included with this distribution for more information.
+# Find the kde-config program and retrieve the install dirs
+
+# Variables:
+# HAVE_KDECONFIG
+# KDECONFIG_EXECUTABLE
+# KDE3PREFIX
+# KDE3HTMLDIR
+# KDE3DATADIR
+# KDE3ICONDIR
+# KDE3MIMEDIR
+# KDE3MENUDIR
+# KDE3EXECDIR
+# KDE3L18NDIR
+
+IF(KDECONFIG_EXECUTABLE)
+ SET(HAVE_KDECONFIG TRUE)
+ELSE(KDECONFIG_EXECUTABLE)
+ FIND_PROGRAM(KDECONFIG_EXECUTABLE NAMES kde-config PATHS
+ $ENV{KDEDIR}/bin
+ /opt/kde3/bin
+ /opt/kde/bin
+ NO_DEFAULT_PATH
+ )
+ FIND_PROGRAM(KDECONFIG_EXECUTABLE kde-config)
+ENDIF(KDECONFIG_EXECUTABLE)
+
+IF(NOT KDE3PREFIX)
+ EXECUTE_PROCESS(COMMAND ${KDECONFIG_EXECUTABLE} --version
+ OUTPUT_VARIABLE kde_config_version )
+ STRING(REGEX MATCH "KDE: .\\." kde_version ${kde_config_version})
+ IF (${kde_version} MATCHES "KDE: 3\\.")
+ EXECUTE_PROCESS(COMMAND ${KDECONFIG_EXECUTABLE} --prefix
+ OUTPUT_VARIABLE kdedir )
+ STRING(REGEX REPLACE "\n" "" KDE3PREFIX "${kdedir}")
+ ENDIF (${kde_version} MATCHES "KDE: 3\\.")
+ENDIF(NOT KDE3PREFIX)
+
+IF(NOT KDE3HTMLDIR)
+ EXECUTE_PROCESS(COMMAND ${KDECONFIG_EXECUTABLE} --expandvars --install html
+ OUTPUT_VARIABLE _htmlinstalldir)
+ STRING(REGEX REPLACE "\n" "" _htmlinstalldir "${_htmlinstalldir}")
+ STRING(REPLACE "${KDE3PREFIX}/" "" KDE3HTMLDIR "${_htmlinstalldir}")
+ MESSAGE(STATUS "KDE3HTMLDIR : ${KDE3HTMLDIR}")
+ENDIF(NOT KDE3HTMLDIR)
+
+IF(NOT KDE3DATADIR)
+ EXECUTE_PROCESS(COMMAND ${KDECONFIG_EXECUTABLE} --expandvars --install data
+ OUTPUT_VARIABLE _datainstalldir)
+ STRING(REGEX REPLACE "\n" "" _datainstalldir "${_datainstalldir}")
+ STRING(REPLACE "${KDE3PREFIX}/" "" KDE3DATADIR "${_datainstalldir}")
+ MESSAGE(STATUS "KDE3DATADIR : ${KDE3DATADIR}")
+ENDIF(NOT KDE3DATADIR)
+
+IF(NOT KDE3ICONDIR)
+ EXECUTE_PROCESS(COMMAND ${KDECONFIG_EXECUTABLE} --expandvars --install icon
+ OUTPUT_VARIABLE _iconinstalldir)
+ STRING(REGEX REPLACE "\n" "" _iconinstalldir "${_iconinstalldir}")
+ STRING(REPLACE "${KDE3PREFIX}/" "" KDE3ICONDIR "${_iconinstalldir}")
+ MESSAGE(STATUS "KDE3ICONDIR : ${KDE3ICONDIR}")
+ENDIF(NOT KDE3ICONDIR)
+
+IF(NOT KDE3MIMEDIR)
+ EXECUTE_PROCESS(COMMAND ${KDECONFIG_EXECUTABLE} --expandvars --install mime
+ OUTPUT_VARIABLE _mimeinstalldir)
+ STRING(REGEX REPLACE "\n" "" _mimeinstalldir "${_mimeinstalldir}")
+ STRING(REPLACE "${KDE3PREFIX}/" "" KDE3MIMEDIR "${_mimeinstalldir}")
+ MESSAGE(STATUS "KDE3MIMEDIR : ${KDE3MIMEDIR}")
+ENDIF(NOT KDE3MIMEDIR)
+
+IF(NOT KDE3MENUDIR)
+ EXECUTE_PROCESS(COMMAND ${KDECONFIG_EXECUTABLE} --expandvars --install xdgdata-apps
+ OUTPUT_VARIABLE _menuinstalldir)
+ STRING(REGEX REPLACE "\n" "" _menuinstalldir "${_menuinstalldir}")
+ STRING(REPLACE "${KDE3PREFIX}/" "" KDE3MENUDIR "${_menuinstalldir}")
+ MESSAGE(STATUS "KDE3MENUDIR : ${KDE3MENUDIR}")
+ENDIF(NOT KDE3MENUDIR)
+
+IF(NOT KDE3L18NDIR)
+ EXECUTE_PROCESS(COMMAND ${KDECONFIG_EXECUTABLE} --expandvars --install locale
+ OUTPUT_VARIABLE _l18ninstalldir)
+ STRING(REGEX REPLACE "\n" "" _l18ninstalldir "${_l18ninstalldir}")
+ STRING(REPLACE "${KDE3PREFIX}/" "" KDE3L18NDIR "${_l18ninstalldir}")
+ MESSAGE(STATUS "KDE3L18NDIR : ${KDE3L18NDIR}")
+ENDIF(NOT KDE3L18NDIR)
+
+IF(NOT KDE3EXECDIR)
+ EXECUTE_PROCESS(COMMAND ${KDECONFIG_EXECUTABLE} --expandvars --install exe
+ OUTPUT_VARIABLE _execinstalldir)
+ STRING(REGEX REPLACE "\n" "" _execinstalldir "${_execinstalldir}")
+ STRING(REPLACE "${KDE3PREFIX}/" "" KDE3EXECDIR "${_execinstalldir}")
+ MESSAGE(STATUS "KDE3EXECDIR : ${KDE3EXECDIR}")
+ENDIF(NOT KDE3EXECDIR)
diff --git a/cmake_admin/FindLADSPA.cmake b/cmake_admin/FindLADSPA.cmake
new file mode 100644
index 0000000..d050f8f
--- /dev/null
+++ b/cmake_admin/FindLADSPA.cmake
@@ -0,0 +1,56 @@
+# Rosegarden
+# A MIDI and audio sequencer and musical notation editor.
+#
+# This program is Copyright 2000-2008
+# Guillaume Laurent <[email protected]>,
+# Chris Cannam <[email protected]>,
+# Richard Bown <[email protected]>
+#
+# The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+# Bown to claim authorship of this work have been asserted.
+#
+# This file is Copyright 2006-2008
+# Pedro Lopez-Cabanillas <[email protected]>
+#
+# Other copyrights also apply to some parts of this work. Please
+# see the AUTHORS file and individual file headers for details.
+#
+# 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. See the file
+# COPYING included with this distribution for more information.
+
+# - Try to find LADSPA header
+# Once done this will define:
+#
+# LADSPA_FOUND - system has LADSPA
+# LADSPA_INCLUDE_DIR - LADSPA header path
+
+IF(LADSPA_INCLUDE_DIR)
+ SET(LADSPA_FIND_QUIETLY TRUE)
+ENDIF(LADSPA_INCLUDE_DIR)
+
+FIND_PATH(LADSPA_INCLUDE_DIR "ladspa.h"
+ /usr/include
+ /usr/local/include
+)
+
+IF(LADSPA_INCLUDE_DIR)
+ SET(LADSPA_FOUND TRUE)
+ELSE(LADSPA_INCLUDE_DIR)
+ SET(LADSPA_FOUND FALSE)
+ SET(LADSPA_INCLUDE_DIR "")
+ENDIF(LADSPA_INCLUDE_DIR)
+
+IF(LADSPA_FOUND)
+ IF(NOT LADSPA_FIND_QUIETLY)
+ MESSAGE(STATUS "Found LADSPA: ${LADSPA_INCLUDE_DIR}")
+ ENDIF(NOT LADSPA_FIND_QUIETLY)
+ELSE(LADSPA_FOUND)
+ IF(LADSPA_FIND_REQUIRED)
+ MESSAGE(FATAL_ERROR "Could not find LADSPA")
+ ENDIF(LADSPA_FIND_REQUIRED)
+ENDIF(LADSPA_FOUND)
+
+MARK_AS_ADVANCED(LADSPA_INCLUDE_DIR)
diff --git a/cmake_admin/FindLIRC.cmake b/cmake_admin/FindLIRC.cmake
new file mode 100644
index 0000000..386ad38
--- /dev/null
+++ b/cmake_admin/FindLIRC.cmake
@@ -0,0 +1,64 @@
+# Rosegarden
+# A MIDI and audio sequencer and musical notation editor.
+#
+# This program is Copyright 2000-2008
+# Guillaume Laurent <[email protected]>,
+# Chris Cannam <[email protected]>,
+# Richard Bown <[email protected]>
+#
+# The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+# Bown to claim authorship of this work have been asserted.
+#
+# This file is Copyright 2006-2008
+# Pedro Lopez-Cabanillas <[email protected]>
+#
+# Other copyrights also apply to some parts of this work. Please
+# see the AUTHORS file and individual file headers for details.
+#
+# 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. See the file
+# COPYING included with this distribution for more information.
+
+# - Try to find LIRC
+# Once done this will define:
+#
+# LIRC_FOUND - system has LIRC
+# LIRC_LIBRARY - LIRC library
+# LIRC_INCLUDE_DIR - LIRC include path
+# LIRC_LIBRARY_DIR - LIRC library path
+
+IF(LIRC_INCLUDE_DIR)
+ SET(LIRC_FIND_QUIETLY TRUE)
+ENDIF(LIRC_INCLUDE_DIR)
+
+FIND_PATH(LIRC_INCLUDE_DIR "lirc/lirc_client.h"
+ /usr/include
+ /usr/local/include
+)
+
+FIND_LIBRARY(LIRC_LIBRARY
+ NAMES lirc_client
+ PATHS /usr/lib /usr/local/lib
+)
+
+IF(LIRC_INCLUDE_DIR AND LIRC_LIBRARY)
+ SET(LIRC_FOUND TRUE)
+ GET_FILENAME_COMPONENT(LIRC_LIBRARY_DIR ${LIRC_LIBRARY} PATH)
+ELSE(LIRC_INCLUDE_DIR AND LIRC_LIBRARY)
+ SET(LIRC_FOUND FALSE)
+ SET(LIRC_LIBRARY_DIR)
+ENDIF(LIRC_INCLUDE_DIR AND LIRC_LIBRARY)
+
+IF(LIRC_FOUND)
+ IF(NOT LIRC_FIND_QUIETLY)
+ MESSAGE(STATUS "Found LIRC: ${LIRC_LIBRARY}")
+ ENDIF(NOT LIRC_FIND_QUIETLY)
+ELSE(LIRC_FOUND)
+ IF(LIRC_FIND_REQUIRED)
+ MESSAGE(FATAL_ERROR "Could not find LIRC library")
+ ENDIF(LIRC_FIND_REQUIRED)
+ENDIF(LIRC_FOUND)
+
+MARK_AS_ADVANCED(LIRC_LIBRARY LIRC_INCLUDE_DIR)
diff --git a/cmake_admin/FindMEINPROC.cmake b/cmake_admin/FindMEINPROC.cmake
new file mode 100644
index 0000000..26c0f0b
--- /dev/null
+++ b/cmake_admin/FindMEINPROC.cmake
@@ -0,0 +1,74 @@
+# Rosegarden
+# A MIDI and audio sequencer and musical notation editor.
+#
+# This program is Copyright 2000-2008
+# Guillaume Laurent <[email protected]>,
+# Chris Cannam <[email protected]>,
+# Richard Bown <[email protected]>
+#
+# The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+# Bown to claim authorship of this work have been asserted.
+#
+# This file is Copyright 2006-2008
+# Pedro Lopez-Cabanillas <[email protected]>
+#
+# Other copyrights also apply to some parts of this work. Please
+# see the AUTHORS file and individual file headers for details.
+#
+# 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. See the file
+# COPYING included with this distribution for more information.
+
+# Find the MEINPROC program
+#
+# Defined variables:
+# MEINPROC_FOUND
+# MEINPROC_EXECUTABLE
+#
+# Macro:
+# ADD_DOCS
+
+IF(MEINPROC_EXECUTABLE)
+ SET(MEINPROC_FOUND TRUE)
+ELSE(MEINPROC_EXECUTABLE)
+ FIND_PROGRAM(MEINPROC_EXECUTABLE
+ NAME meinproc
+ PATHS ${KDE3_BIN_INSTALL_DIR}
+ $ENV{KDEDIR}/bin
+ /usr/bin
+ /usr/local/bin
+ /opt/kde/bin
+ /opt/kde3/bin )
+ IF(MEINPROC_EXECUTABLE)
+ SET(MEINPROC_FOUND TRUE)
+ ELSE(MEINPROC_EXECUTABLE)
+ IF(NOT MEINPROC_FIND_QUIETLY)
+ IF(MEINPROC_FIND_REQUIRED)
+ MESSAGE(FATAL_ERROR "Program meinproc couldn't be found")
+ ENDIF(MEINPROC_FIND_REQUIRED)
+ ENDIF(NOT MEINPROC_FIND_QUIETLY)
+ ENDIF(MEINPROC_EXECUTABLE)
+ MARK_AS_ADVANCED(MEINPROC_EXECUTABLE)
+ENDIF (MEINPROC_EXECUTABLE)
+
+MACRO(ADD_DOCS _baseName)
+ SET(_outputs)
+ FOREACH(_dir ${ARGN})
+ SET(_out "${CMAKE_CURRENT_BINARY_DIR}/${_dir}_index.cache.bz2")
+ SET(_in "${CMAKE_CURRENT_SOURCE_DIR}/${_dir}/index.docbook")
+ FILE(GLOB _images ${_dir}/*.png)
+ ADD_CUSTOM_COMMAND(OUTPUT ${_out}
+ COMMAND ${MEINPROC_EXECUTABLE}
+ ARGS --check --cache ${_out} ${_in}
+ DEPENDS ${_in} )
+ INSTALL(FILES ${_out}
+ DESTINATION ${KDE3HTMLDIR}/${_dir}/${_baseName}
+ RENAME index.cache.bz2)
+ INSTALL(FILES ${_in} ${_images}
+ DESTINATION ${KDE3HTMLDIR}/${_dir}/${_baseName})
+ SET(_outputs ${_outputs} ${_out})
+ ENDFOREACH(_dir)
+ ADD_CUSTOM_TARGET(documentation ALL DEPENDS ${_outputs})
+ENDMACRO(ADD_DOCS)
diff --git a/cmake_admin/FindMSGFMT.cmake b/cmake_admin/FindMSGFMT.cmake
new file mode 100644
index 0000000..b8419f8
--- /dev/null
+++ b/cmake_admin/FindMSGFMT.cmake
@@ -0,0 +1,68 @@
+# Rosegarden
+# A MIDI and audio sequencer and musical notation editor.
+#
+# This program is Copyright 2000-2008
+# Guillaume Laurent <[email protected]>,
+# Chris Cannam <[email protected]>,
+# Richard Bown <[email protected]>
+#
+# The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+# Bown to claim authorship of this work have been asserted.
+#
+# This file is Copyright 2006-2008
+# Pedro Lopez-Cabanillas <[email protected]>
+#
+# Other copyrights also apply to some parts of this work. Please
+# see the AUTHORS file and individual file headers for details.
+#
+# 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. See the file
+# COPYING included with this distribution for more information.
+
+# Find the msgfmt program
+#
+# Defined variables:
+# MSGFMT_FOUND
+# MSGFMT_EXECUTABLE
+#
+# Macro:
+# ADD_TRANSLATIONS
+#
+
+IF(MSGFMT_EXECUTABLE)
+ SET(MSGFMT_FOUND TRUE)
+ELSE(MSGFMT_EXECUTABLE)
+ FIND_PROGRAM(MSGFMT_EXECUTABLE
+ NAMES msgfmt gmsgfmt
+ PATHS /bin /usr/bin /usr/local/bin )
+ IF(MSGFMT_EXECUTABLE)
+ SET(MSGFMT_FOUND TRUE)
+ ELSE(MSGFMT_EXECUTABLE)
+ IF(NOT MSGFMT_FIND_QUIETLY)
+ IF(MSGFMT_FIND_REQUIRED)
+ MESSAGE(FATAL_ERROR "msgfmt program couldn't be found")
+ ENDIF(MSGFMT_FIND_REQUIRED)
+ ENDIF(NOT MSGFMT_FIND_QUIETLY)
+ ENDIF(MSGFMT_EXECUTABLE)
+ MARK_AS_ADVANCED(MSGFMT_EXECUTABLE)
+ENDIF (MSGFMT_EXECUTABLE)
+
+MACRO(ADD_TRANSLATIONS _baseName)
+ SET(_outputs)
+ FOREACH(_file ${ARGN})
+ GET_FILENAME_COMPONENT(_file_we ${_file} NAME_WE)
+ SET(_out "${CMAKE_CURRENT_BINARY_DIR}/${_file_we}.gmo")
+ SET(_in "${CMAKE_CURRENT_SOURCE_DIR}/${_file_we}.po")
+ ADD_CUSTOM_COMMAND(
+ OUTPUT ${_out}
+ COMMAND ${MSGFMT_EXECUTABLE} -o ${_out} ${_in}
+ DEPENDS ${_in} )
+ INSTALL(FILES ${_out}
+ DESTINATION ${KDE3L18NDIR}/${_file_we}/LC_MESSAGES/
+ RENAME ${_baseName}.mo )
+ SET(_outputs ${_outputs} ${_out})
+ ENDFOREACH(_file)
+ ADD_CUSTOM_TARGET(translations ALL DEPENDS ${_outputs})
+ENDMACRO(ADD_TRANSLATIONS)
diff --git a/cmake_admin/FindPCHSupport.cmake b/cmake_admin/FindPCHSupport.cmake
new file mode 100644
index 0000000..d31a00d
--- /dev/null
+++ b/cmake_admin/FindPCHSupport.cmake
@@ -0,0 +1,73 @@
+# Rosegarden
+# A MIDI and audio sequencer and musical notation editor.
+#
+# This program is Copyright 2000-2008
+# Guillaume Laurent <[email protected]>,
+# Chris Cannam <[email protected]>,
+# Richard Bown <[email protected]>
+#
+# The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+# Bown to claim authorship of this work have been asserted.
+#
+# This file is Copyright 2006-2008
+# Pedro Lopez-Cabanillas <[email protected]>
+#
+# Other copyrights also apply to some parts of this work. Please
+# see the AUTHORS file and individual file headers for details.
+#
+# 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. See the file
+# COPYING included with this distribution for more information.
+
+# - Try to find precompiled headers support for GCC 3.4 and 4.x
+# Once done this will define:
+#
+# Variable:
+# PCHSupport_FOUND
+#
+# Macro:
+# ADD_PRECOMPILED_HEADER
+
+IF(CMAKE_COMPILER_IS_GNUCXX)
+ EXEC_PROGRAM(${CMAKE_CXX_COMPILER}
+ ARGS -dumpversion
+ OUTPUT_VARIABLE gcc_compiler_version)
+# STRING(REGEX REPLACE ".* ([0-9]\\.[0-9]\\.[0-9]) .*" "\\1"
+# gcc_compiler_version ${_compiler_output})
+# MESSAGE("GCC Version: ${gcc_compiler_version}")
+ IF(gcc_compiler_version MATCHES "4\\.[0-9]\\.[0-9]")
+ SET(PCHSupport_FOUND TRUE)
+ ELSE(gcc_compiler_version MATCHES "4\\.[0-9]\\.[0-9]")
+ IF(gcc_compiler_version MATCHES "3\\.4\\.[0-9]")
+ SET(PCHSupport_FOUND TRUE)
+ ENDIF(gcc_compiler_version MATCHES "3\\.4\\.[0-9]")
+ ENDIF(gcc_compiler_version MATCHES "4\\.[0-9]\\.[0-9]")
+ENDIF(CMAKE_COMPILER_IS_GNUCXX)
+
+MACRO(ADD_PRECOMPILED_HEADER _targetName _input)
+ GET_FILENAME_COMPONENT(_name ${_input} NAME)
+ SET(_source "${CMAKE_CURRENT_SOURCE_DIR}/${_input}")
+ SET(_outdir "${CMAKE_CURRENT_BINARY_DIR}/${_name}.gch")
+ MAKE_DIRECTORY(${_outdir})
+ SET(_output "${_outdir}/${CMAKE_BUILD_TYPE}.c++")
+ STRING(TOUPPER "CMAKE_CXX_FLAGS_${CMAKE_BUILD_TYPE}" _flags_var_name)
+ SET(_compiler_FLAGS ${${_flags_var_name}})
+ SEPARATE_ARGUMENTS(_compiler_FLAGS)
+ #MESSAGE("_compiler_FLAGS: ${_compiler_FLAGS}")
+ ADD_CUSTOM_COMMAND(
+ OUTPUT ${_output}
+ COMMAND ${CMAKE_CXX_COMPILER}
+ ${_compiler_FLAGS}
+ -I${QT_INCLUDE_DIR}
+ -I${KDE3_INCLUDE_DIR}
+ ${QT_DEFINITIONS}
+ ${KDE3_DEFINITIONS}
+ -x c++-header
+ -o ${_output} ${_source}
+ DEPENDS ${_source} )
+ ADD_CUSTOM_TARGET(${_targetName} DEPENDS ${_output})
+ #SET(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} "-include ${_name} -Winvalid-pch -H")
+ SET(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} "-include ${_name} -Winvalid-pch")
+ENDMACRO(ADD_PRECOMPILED_HEADER)
diff --git a/cmake_admin/FindPkgConfig.cmake b/cmake_admin/FindPkgConfig.cmake
new file mode 100644
index 0000000..228ffcd
--- /dev/null
+++ b/cmake_admin/FindPkgConfig.cmake
@@ -0,0 +1,383 @@
+# - a pkg-config module for CMake
+#
+# Usage:
+# pkg_check_modules(<PREFIX> [REQUIRED] <MODULE> [<MODULE>]*)
+# checks for all the given modules
+#
+# pkg_search_module(<PREFIX> [REQUIRED] <MODULE> [<MODULE>]*)
+# checks for given modules and uses the first working one
+#
+# When the 'REQUIRED' argument was set, macros will fail with an error
+# when module(s) could not be found
+#
+# It sets the following variables:
+# PKG_CONFIG_FOUND ... true iff pkg-config works on the system
+# PKG_CONFIG_EXECUTABLE ... pathname of the pkg-config program
+# <PREFIX>_FOUND ... set to 1 iff module(s) exist
+#
+# For the following variables two sets of values exist; first one is the
+# common one and has the given PREFIX. The second set contains flags
+# which are given out when pkgconfig was called with the '--static'
+# option.
+# <XPREFIX>_LIBRARIES ... only the libraries (w/o the '-l')
+# <XPREFIX>_LIBRARY_DIRS ... the paths of the libraries (w/o the '-L')
+# <XPREFIX>_LDFLAGS ... all required linker flags
+# <XPREFIX>_LDFLAGS_OTHERS ... all other linker flags
+# <XPREFIX>_INCLUDE_DIRS ... the '-I' preprocessor flags (w/o the '-I')
+# <XPREFIX>_CFLAGS ... all required cflags
+# <XPREFIX>_CFLAGS_OTHERS ... the other compiler flags
+#
+# <XPREFIX> = <PREFIX> for common case
+# <XPREFIX> = <PREFIX>_STATIC for static linking
+#
+# There are some special variables whose prefix depends on the count
+# of given modules. When there is only one module, <PREFIX> stays
+# unchanged. When there are multiple modules, the prefix will be
+# changed to <PREFIX>_<MODNAME>:
+# <XPREFIX>_VERSION ... version of the module
+# <XPREFIX>_PREFIX ... prefix-directory of the module
+# <XPREFIX>_INCLUDEDIR ... include-dir of the module
+# <XPREFIX>_LIBDIR ... lib-dir of the module
+#
+# <XPREFIX> = <PREFIX> when |MODULES| == 1, else
+# <XPREFIX> = <PREFIX>_<MODNAME>
+#
+# A <MODULE> parameter can have the following formats:
+# {MODNAME} ... matches any version
+# {MODNAME}>={VERSION} ... at least version <VERSION> is required
+# {MODNAME}={VERSION} ... exactly version <VERSION> is required
+# {MODNAME}<={VERSION} ... modules must not be newer than <VERSION>
+#
+# Examples
+# pkg_check_modules (GLIB2 glib-2.0)
+#
+# pkg_check_modules (GLIB2 glib-2.0>=2.10)
+# requires at least version 2.10 of glib2 and defines e.g.
+# GLIB2_VERSION=2.10.3
+#
+# pkg_check_modules (FOO glib-2.0>=2.10 gtk+-2.0)
+# requires both glib2 and gtk2, and defines e.g.
+# FOO_glib-2.0_VERSION=2.10.3
+# FOO_gtk+-2.0_VERSION=2.8.20
+#
+# pkg_check_modules (XRENDER REQUIRED xrender)
+# defines e.g.:
+# XRENDER_LIBRARIES=Xrender;X11
+# XRENDER_STATIC_LIBRARIES=Xrender;X11;pthread;Xau;Xdmcp
+#
+# pkg_search_module (BAR libxml-2.0 libxml2 libxml>=2)
+
+
+# Copyright (C) 2006 Enrico Scholz <[email protected]>
+#
+# Redistribution and use, with or without modification, are permitted
+# provided that the following conditions are met:
+#
+# 1. Redistributions must retain the above copyright notice, this
+# list of conditions and the following disclaimer.
+# 2. The name of the author may not be used to endorse or promote
+# products derived from this software without specific prior
+# written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+### Common stuff ####
+set(PKG_CONFIG_VERSION 1)
+set(PKG_CONFIG_FOUND 0)
+
+find_program(PKG_CONFIG_EXECUTABLE NAMES pkg-config DOC "pkg-config executable")
+mark_as_advanced(PKG_CONFIG_EXECUTABLE)
+
+if(PKG_CONFIG_EXECUTABLE)
+ set(PKG_CONFIG_FOUND 1)
+endif(PKG_CONFIG_EXECUTABLE)
+
+
+# Unsets the given variables
+macro(_pkgconfig_unset var)
+ set(${var} "" CACHE INTERNAL "")
+endmacro(_pkgconfig_unset)
+
+macro(_pkgconfig_set var value)
+ set(${var} ${value} CACHE INTERNAL "")
+endmacro(_pkgconfig_set)
+
+# Invokes pkgconfig, cleans up the result and sets variables
+macro(_pkgconfig_invoke _pkglist _prefix _varname _regexp)
+ set(_pkgconfig_invoke_result)
+
+ execute_process(
+ COMMAND ${PKG_CONFIG_EXECUTABLE} ${ARGN} ${_pkglist}
+ OUTPUT_VARIABLE _pkgconfig_invoke_result
+ RESULT_VARIABLE _pkgconfig_failed)
+
+ if (_pkgconfig_failed)
+ set(_pkgconfig_${_varname} "")
+ _pkgconfig_unset(${_prefix}_${_varname})
+ else(_pkgconfig_failed)
+ string(REGEX REPLACE "[\r\n]" " " _pkgconfig_invoke_result "${_pkgconfig_invoke_result}")
+ string(REGEX REPLACE " +$" "" _pkgconfig_invoke_result "${_pkgconfig_invoke_result}")
+
+ if (NOT ${_regexp} STREQUAL "")
+ string(REGEX REPLACE "${_regexp}" " " _pkgconfig_invoke_result "${_pkgconfig_invoke_result}")
+ endif(NOT ${_regexp} STREQUAL "")
+
+ separate_arguments(_pkgconfig_invoke_result)
+
+ #message(STATUS " ${_varname} ... ${_pkgconfig_invoke_result}")
+ set(_pkgconfig_${_varname} ${_pkgconfig_invoke_result})
+ _pkgconfig_set(${_prefix}_${_varname} "${_pkgconfig_invoke_result}")
+ endif(_pkgconfig_failed)
+endmacro(_pkgconfig_invoke)
+
+# Invokes pkgconfig two times; once without '--static' and once with
+# '--static'
+macro(_pkgconfig_invoke_dyn _pkglist _prefix _varname cleanup_regexp)
+ _pkgconfig_invoke("${_pkglist}" ${_prefix} ${_varname} "${cleanup_regexp}" ${ARGN})
+ _pkgconfig_invoke("${_pkglist}" ${_prefix} STATIC_${_varname} "${cleanup_regexp}" --static ${ARGN})
+endmacro(_pkgconfig_invoke_dyn)
+
+# Splits given arguments into options and a package list
+macro(_pkgconfig_parse_options _result _is_req)
+ set(${_is_req} 0)
+
+ foreach(_pkg ${ARGN})
+ if (_pkg STREQUAL "REQUIRED")
+ set(${_is_req} 1)
+ endif (_pkg STREQUAL "REQUIRED")
+ endforeach(_pkg ${ARGN})
+
+ set(${_result} ${ARGN})
+ list(REMOVE_ITEM ${_result} "REQUIRED")
+endmacro(_pkgconfig_parse_options)
+
+###
+macro(_pkg_check_modules_internal _is_required _is_silent _prefix)
+ _pkgconfig_unset(${_prefix}_FOUND)
+ _pkgconfig_unset(${_prefix}_VERSION)
+ _pkgconfig_unset(${_prefix}_PREFIX)
+ _pkgconfig_unset(${_prefix}_INCLUDEDIR)
+ _pkgconfig_unset(${_prefix}_LIBDIR)
+ _pkgconfig_unset(${_prefix}_LIBS)
+ _pkgconfig_unset(${_prefix}_LIBS_L)
+ _pkgconfig_unset(${_prefix}_LIBS_PATHS)
+ _pkgconfig_unset(${_prefix}_LIBS_OTHER)
+ _pkgconfig_unset(${_prefix}_CFLAGS)
+ _pkgconfig_unset(${_prefix}_CFLAGS_I)
+ _pkgconfig_unset(${_prefix}_CFLAGS_OTHER)
+ _pkgconfig_unset(${_prefix}_STATIC_LIBDIR)
+ _pkgconfig_unset(${_prefix}_STATIC_LIBS)
+ _pkgconfig_unset(${_prefix}_STATIC_LIBS_L)
+ _pkgconfig_unset(${_prefix}_STATIC_LIBS_PATHS)
+ _pkgconfig_unset(${_prefix}_STATIC_LIBS_OTHER)
+ _pkgconfig_unset(${_prefix}_STATIC_CFLAGS)
+ _pkgconfig_unset(${_prefix}_STATIC_CFLAGS_I)
+ _pkgconfig_unset(${_prefix}_STATIC_CFLAGS_OTHER)
+
+ # create a better addressable variable of the modules and calculate its size
+ set(_pkg_check_modules_list ${ARGN})
+ list(LENGTH _pkg_check_modules_list _pkg_check_modules_cnt)
+
+ if(PKG_CONFIG_EXECUTABLE)
+ # give out status message telling checked module
+ if (NOT ${_is_silent})
+ if (_pkg_check_modules_cnt EQUAL 1)
+ message(STATUS "checking for module '${_pkg_check_modules_list}'")
+ else(_pkg_check_modules_cnt EQUAL 1)
+ message(STATUS "checking for modules '${_pkg_check_modules_list}'")
+ endif(_pkg_check_modules_cnt EQUAL 1)
+ endif(NOT ${_is_silent})
+
+ set(_pkg_check_modules_packages)
+ set(_pkg_check_modules_failed)
+
+ # iterate through module list and check whether they exist and match the required version
+ foreach (_pkg_check_modules_pkg ${_pkg_check_modules_list})
+ set(_pkg_check_modules_exist_query)
+
+ # check whether version is given
+ if (_pkg_check_modules_pkg MATCHES ".*(>=|=|<=).*")
+ string(REGEX REPLACE "(.*[^><])(>=|=|<=)(.*)" "\\1" _pkg_check_modules_pkg_name "${_pkg_check_modules_pkg}")
+ string(REGEX REPLACE "(.*[^><])(>=|=|<=)(.*)" "\\2" _pkg_check_modules_pkg_op "${_pkg_check_modules_pkg}")
+ string(REGEX REPLACE "(.*[^><])(>=|=|<=)(.*)" "\\3" _pkg_check_modules_pkg_ver "${_pkg_check_modules_pkg}")
+ else(_pkg_check_modules_pkg MATCHES ".*(>=|=|<=).*")
+ set(_pkg_check_modules_pkg_name "${_pkg_check_modules_pkg}")
+ set(_pkg_check_modules_pkg_op)
+ set(_pkg_check_modules_pkg_ver)
+ endif(_pkg_check_modules_pkg MATCHES ".*(>=|=|<=).*")
+
+ # handle the operands
+ if (_pkg_check_modules_pkg_op STREQUAL ">=")
+ list(APPEND _pkg_check_modules_exist_query --atleast-version)
+ endif(_pkg_check_modules_pkg_op STREQUAL ">=")
+
+ if (_pkg_check_modules_pkg_op STREQUAL "=")
+ list(APPEND _pkg_check_modules_exist_query --exact-version)
+ endif(_pkg_check_modules_pkg_op STREQUAL "=")
+
+ if (_pkg_check_modules_pkg_op STREQUAL "<=")
+ list(APPEND _pkg_check_modules_exist_query --max-version)
+ endif(_pkg_check_modules_pkg_op STREQUAL "<=")
+
+ # create the final query which is of the format:
+ # * --atleast-version <version> <pkg-name>
+ # * --exact-version <version> <pkg-name>
+ # * --max-version <version> <pkg-name>
+ # * --exists <pkg-name>
+ if (_pkg_check_modules_pkg_op)
+ list(APPEND _pkg_check_modules_exist_query "${_pkg_check_modules_pkg_ver}")
+ else(_pkg_check_modules_pkg_op)
+ list(APPEND _pkg_check_modules_exist_query --exists)
+ endif(_pkg_check_modules_pkg_op)
+
+ _pkgconfig_unset(${_prefix}_${_pkg_check_modules_pkg_name}_VERSION)
+ _pkgconfig_unset(${_prefix}_${_pkg_check_modules_pkg_name}_PREFIX)
+ _pkgconfig_unset(${_prefix}_${_pkg_check_modules_pkg_name}_INCLUDEDIR)
+ _pkgconfig_unset(${_prefix}_${_pkg_check_modules_pkg_name}_LIBDIR)
+
+ list(APPEND _pkg_check_modules_exist_query "${_pkg_check_modules_pkg_name}")
+ list(APPEND _pkg_check_modules_packages "${_pkg_check_modules_pkg_name}")
+
+ # execute the query
+ execute_process(
+ COMMAND ${PKG_CONFIG_EXECUTABLE} ${_pkg_check_modules_exist_query}
+ RESULT_VARIABLE _pkgconfig_retval)
+
+ # evaluate result and tell failures
+ if (_pkgconfig_retval)
+ if(NOT ${_is_silent})
+ message(STATUS " package '${_pkg_check_modules_pkg}' not found")
+ endif(NOT ${_is_silent})
+
+ set(_pkg_check_modules_failed 1)
+ endif(_pkgconfig_retval)
+ endforeach(_pkg_check_modules_pkg)
+
+ if(_pkg_check_modules_failed)
+ # fail when requested
+ if (${_is_required})
+ message(SEND_ERROR "A required package was not found")
+ endif (${_is_required})
+ else(_pkg_check_modules_failed)
+ # when we are here, we checked whether requested modules
+ # exist. Now, go through them and set variables
+
+ _pkgconfig_set(${_prefix}_FOUND 1)
+ list(LENGTH _pkg_check_modules_packages pkg_count)
+
+ # iterate through all modules again and set individual variables
+ foreach (_pkg_check_modules_pkg ${_pkg_check_modules_packages})
+ # handle case when there is only one package required
+ if (pkg_count EQUAL 1)
+ set(_pkg_check_prefix "${_prefix}")
+ else(pkg_count EQUAL 1)
+ set(_pkg_check_prefix "${_prefix}_${_pkg_check_modules_pkg}")
+ endif(pkg_count EQUAL 1)
+
+ _pkgconfig_invoke(${_pkg_check_modules_pkg} "${_pkg_check_prefix}" VERSION "" --modversion )
+ _pkgconfig_invoke(${_pkg_check_modules_pkg} "${_pkg_check_prefix}" PREFIX "" --variable=prefix )
+ _pkgconfig_invoke(${_pkg_check_modules_pkg} "${_pkg_check_prefix}" INCLUDEDIR "" --variable=includedir )
+ _pkgconfig_invoke(${_pkg_check_modules_pkg} "${_pkg_check_prefix}" LIBDIR "" --variable=libdir )
+
+ message(STATUS " found ${_pkg_check_modules_pkg}, version ${_pkgconfig_VERSION}")
+ endforeach(_pkg_check_modules_pkg)
+
+ # set variables which are combined for multiple modules
+ _pkgconfig_invoke_dyn("${_pkg_check_modules_packages}" "${_prefix}" LIBRARIES "(^| )-l" --libs-only-l )
+ _pkgconfig_invoke_dyn("${_pkg_check_modules_packages}" "${_prefix}" LIBRARY_DIRS "(^| )-L" --libs-only-L )
+ _pkgconfig_invoke_dyn("${_pkg_check_modules_packages}" "${_prefix}" LDFLAGS "" --libs )
+ _pkgconfig_invoke_dyn("${_pkg_check_modules_packages}" "${_prefix}" LDFLAGS_OTHER "" --libs-only-other )
+
+ _pkgconfig_invoke_dyn("${_pkg_check_modules_packages}" "${_prefix}" INCLUDE_DIRS "(^| )-I" --cflags-only-I )
+ _pkgconfig_invoke_dyn("${_pkg_check_modules_packages}" "${_prefix}" CFLAGS "" --cflags )
+ _pkgconfig_invoke_dyn("${_pkg_check_modules_packages}" "${_prefix}" CFLAGS_OTHER "" --cflags-only-other )
+ endif(_pkg_check_modules_failed)
+ else(PKG_CONFIG_EXECUTABLE)
+ if (${_is_required})
+ message(SEND_ERROR "pkg-config tool not found")
+ endif (${_is_required})
+ endif(PKG_CONFIG_EXECUTABLE)
+endmacro(_pkg_check_modules_internal)
+
+###
+### User visible macros start here
+###
+
+###
+macro(pkg_check_modules _prefix _module0)
+ # check cached value
+ if (NOT DEFINED __pkg_config_checked_${_prefix} OR __pkg_config_checked_${_prefix} LESS ${PKG_CONFIG_VERSION})
+ _pkgconfig_parse_options (_pkg_modules _pkg_is_required "${_module0}" ${ARGN})
+ _pkg_check_modules_internal("${_pkg_is_required}" 0 "${_prefix}" ${_pkg_modules})
+
+ if(${_prefix}_FOUND)
+ _pkgconfig_set(__pkg_config_checked_${_prefix} ${PKG_CONFIG_VERSION})
+ endif(${_prefix}_FOUND)
+ endif(NOT DEFINED __pkg_config_checked_${_prefix} OR __pkg_config_checked_${_prefix} LESS ${PKG_CONFIG_VERSION})
+endmacro(pkg_check_modules)
+
+###
+macro(pkg_search_module _prefix _module0)
+ # check cached value
+ if (NOT DEFINED __pkg_config_checked_${_prefix} OR __pkg_config_checked_${_prefix} LESS ${PKG_CONFIG_VERSION})
+ set(_pkg_modules_found 0)
+ _pkgconfig_parse_options(_pkg_modules_alt _pkg_is_required "${_module0}" ${ARGN})
+
+ message(STATUS "checking for one of the modules '${_pkg_modules_alt}'")
+
+ # iterate through all modules and stop at the first working one.
+ foreach(_pkg_alt ${_pkg_modules_alt})
+ if(NOT _pkg_modules_found)
+ _pkg_check_modules_internal(0 1 "${_prefix}" "${_pkg_alt}")
+ endif(NOT _pkg_modules_found)
+
+ if (${_prefix}_FOUND)
+ set(_pkg_modules_found 1)
+ endif(${_prefix}_FOUND)
+ endforeach(_pkg_alt)
+
+ if (NOT ${_prefix}_FOUND)
+ if(${_pkg_is_required})
+ message(SEND_ERROR "None of the required '${_pkg_modules_alt}' found")
+ endif(${_pkg_is_required})
+ else (NOT ${_prefix}_FOUND)
+ _pkgconfig_set(__pkg_config_checked_${_prefix} ${PKG_CONFIG_VERSION})
+ endif(NOT ${_prefix}_FOUND)
+
+ endif(NOT DEFINED __pkg_config_checked_${_prefix} OR __pkg_config_checked_${_prefix} LESS ${PKG_CONFIG_VERSION})
+endmacro(pkg_search_module)
+
+###
+macro(PKGCONFIG _package _include_DIR _link_DIR _link_FLAGS _cflags)
+ message(STATUS "WARNING: you are using the obsolete 'PKGCONFIG' macro")
+ _pkg_check_modules_internal(0 0 _PKGCONFIG_TMP "${_package}")
+ if (_PKGCONFIG_TMP_FOUND)
+ set(${_include_DIR} ${_PKGCONFIG_TMP_INCLUDEDIR})
+ set(${_link_DIR} ${_PKGCONFIG_TMP_LIBDIR})
+ set(${_link_FLAGS} ${_PKGCONFIG_TMP_LDFLAGS})
+ set(${_cflags} ${_PKGCONFIG_TMP_CFLAGS})
+ set(_return_VALUE 0)
+ else(_PKGCONFIG_TMP_FOUND)
+ set(${_include_DIR})
+ set(${_link_DIR})
+ set(${_link_FLAGS})
+ set(${_cflags})
+ set(_return_VALUE 1)
+ endif(_PKGCONFIG_TMP_FOUND)
+endmacro(PKGCONFIG)
+
+
+### Local Variables:
+### mode: cmake
+### End:
diff --git a/cmake_admin/UserWarnings.cmake b/cmake_admin/UserWarnings.cmake
new file mode 100644
index 0000000..0e5312e
--- /dev/null
+++ b/cmake_admin/UserWarnings.cmake
@@ -0,0 +1,110 @@
+# Rosegarden
+# A MIDI and audio sequencer and musical notation editor.
+#
+# This program is Copyright 2000-2008
+# Guillaume Laurent <[email protected]>,
+# Chris Cannam <[email protected]>,
+# Richard Bown <[email protected]>
+#
+# The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+# Bown to claim authorship of this work have been asserted.
+#
+# This file is Copyright 2006-2008
+# Pedro Lopez-Cabanillas <[email protected]>
+#
+# Other copyrights also apply to some parts of this work. Please
+# see the AUTHORS file and individual file headers for details.
+#
+# 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. See the file
+# COPYING included with this distribution for more information.
+
+MESSAGE("\n"
+"Installation Summary\n"
+"--------------------\n"
+"\n"
+"Install Directory : ${CMAKE_INSTALL_PREFIX}\n"
+"Build type : ${CMAKE_BUILD_TYPE}\n"
+"Use Qt/KDE precompiled headers: ${USE_PCH}\n"
+"\n"
+"Xft notation font support : ${HAVE_XFT}")
+
+IF(WANT_LIRC)
+MESSAGE(
+"LIRC infrared remote support : ${HAVE_LIRC}")
+ELSE(WANT_LIRC)
+MESSAGE("No LIRC support configured.")
+ENDIF(WANT_LIRC)
+
+MESSAGE("")
+
+IF(WANT_SOUND)
+MESSAGE(
+"ALSA MIDI support : ${HAVE_ALSA}\n"
+"JACK audio support : ${HAVE_JACK}\n"
+"LADSPA plugin support : ${HAVE_LADSPA}\n"
+"DSSI synth plugin support : ${HAVE_DSSI}\n"
+"Custom OSC plugin GUI support : ${HAVE_LIBLO}\n"
+"Audio timestretching : ${HAVE_FFTW3F}\n"
+"LRDF plugin metadata support : ${HAVE_LIBLRDF}")
+ELSE(WANT_SOUND)
+MESSAGE("No sound support configured.")
+ENDIF(WANT_SOUND)
+
+IF(NOT HAVE_XFT)
+MESSAGE("\n* Score rendering quality and performance may be\n"
+"improved if Xft 2.1.0 and Freetype 2 are available, to permit\n"
+"Rosegarden to override the Qt font selection mechanism. It\n"
+"may not be worth trying to install them if they aren't already\n"
+"present in your distribution though.")
+ENDIF(NOT HAVE_XFT)
+
+IF(WANT_SOUND)
+
+IF(NOT HAVE_ALSA)
+MESSAGE("\n* Rosegarden requires the ALSA (Advanced Linux Sound Architecture) drivers\n"
+"for MIDI, and the JACK audio framework for audio sequencing.\n"
+"Please see the documentation at http://www.rosegardenmusic.com/getting/\n"
+"for more information about these dependencies.")
+ENDIF(NOT HAVE_ALSA)
+
+IF(NOT HAVE_JACK)
+MESSAGE("\n* Rosegarden uses the JACK audio server for audio recording and\n"
+"sequencing. See http://jackit.sf.net/ for more information about\n"
+"getting and installing JACK. If you want to use Rosegarden only\n"
+"for MIDI, then you do not need JACK.")
+ENDIF(NOT HAVE_JACK)
+
+IF(NOT HAVE_LADSPA)
+MESSAGE("\n* Rosegarden supports LADSPA audio plugins if available. See\n"
+"http://www.ladspa.org/ for more information about LADSPA. To\n"
+"build LADSPA support into Rosegarden, you need to make sure\n"
+"you have ladspa.h available on your system.")
+ENDIF(NOT HAVE_LADSPA)
+
+IF(NOT HAVE_DSSI)
+MESSAGE("\n* Rosegarden supports DSSI audio plugins if available. See\n"
+"http://dssi.sf.net/ for more information about DSSI. To\n"
+"build DSSI support into Rosegarden, you need to make sure\n"
+"you have dssi.h available on your system.")
+ENDIF(NOT HAVE_DSSI)
+
+IF(NOT HAVE_LIBLO)
+MESSAGE("\n* Rosegarden supports custom GUIs for DSSI (and LADSPA) plugins using\n"
+"the Open Sound Control protocol, if the Lite OSC library liblo is\n"
+"available. Go to http://www.plugin.org.uk/liblo/ to obtain liblo\n"
+"and http://dssi.sf.net/ for more information about DSSI GUIs.")
+ENDIF(NOT HAVE_LIBLO)
+
+IF(NOT HAVE_LIBLRDF)
+MESSAGE("\n* Rosegarden supports the LRDF metadata format for classification\n"
+"of LADSPA and DSSI plugins. This will improve the usability of\n"
+"plugin selection dialogs. You can obtain LRDF from\n"
+"http://www.plugin.org.uk/lrdf/.")
+ENDIF(NOT HAVE_LIBLRDF)
+
+ENDIF(WANT_SOUND)
+
+MESSAGE("")
diff --git a/data/CMakeLists.txt b/data/CMakeLists.txt
new file mode 100644
index 0000000..1dfc834
--- /dev/null
+++ b/data/CMakeLists.txt
@@ -0,0 +1,125 @@
+# Data directory
+
+SET(DATADIR ${KDE3DATADIR}/rosegarden)
+SET(ICONDIR ${KDE3ICONDIR})
+SET(MIMEDIR ${KDE3MIMEDIR}/audio)
+SET(MENUDIR ${KDE3MENUDIR})
+
+# Guitar chord files
+FILE(GLOB CHORD_FILES chords/*.xml)
+INSTALL(FILES ${CHORD_FILES} DESTINATION ${DATADIR}/chords)
+
+# Desktop file
+INSTALL(FILES desktop/rosegarden.desktop DESTINATION ${MENUDIR})
+
+# MIME files
+SET(MIME_FILES
+ desktop/x-rosegarden21.desktop
+ desktop/x-rosegarden.desktop
+ desktop/x-rosegarden-device.desktop
+ desktop/x-soundfont.desktop)
+INSTALL(FILES ${MIME_FILES} DESTINATION ${MIMEDIR})
+
+# Icons
+INSTALL(FILES pixmaps/icons/cc-hi16-rosegarden.xpm DESTINATION ${ICONDIR}/locolor/16x16/apps RENAME rosegarden.xpm)
+INSTALL(FILES pixmaps/icons/rg-rwb-rose3-16x16.png DESTINATION ${ICONDIR}/hicolor/16x16/apps RENAME rosegarden.png)
+INSTALL(FILES pixmaps/icons/cc-hi32-rosegarden.xpm DESTINATION ${ICONDIR}/locolor/32x32/apps RENAME rosegarden.xpm)
+INSTALL(FILES pixmaps/icons/rg-rwb-rose3-32x32.png DESTINATION ${ICONDIR}/hicolor/32x32/apps RENAME rosegarden.png)
+INSTALL(FILES pixmaps/icons/rg-rwb-rose3-48x48.png DESTINATION ${ICONDIR}/hicolor/48x48/apps RENAME rosegarden.png)
+INSTALL(FILES pixmaps/icons/rg-rwb-rose3-64x64.png DESTINATION ${ICONDIR}/hicolor/64x64/apps RENAME rosegarden.png)
+INSTALL(FILES pixmaps/icons/rg-rwb-rose3-128x128.png DESTINATION ${ICONDIR}/hicolor/128x128/apps RENAME rosegarden.png)
+
+INSTALL(FILES pixmaps/icons/mm-mime-hi16-rosegarden.png DESTINATION ${ICONDIR}/hicolor/16x16/mimetypes RENAME x-rosegarden.png)
+INSTALL(FILES pixmaps/icons/mm-mime-hi16-rosegarden.png DESTINATION ${ICONDIR}/locolor/16x16/mimetypes RENAME x-rosegarden.png)
+INSTALL(FILES pixmaps/icons/mm-mime-hi32-rosegarden.png DESTINATION ${ICONDIR}/hicolor/32x32/mimetypes RENAME x-rosegarden.png)
+INSTALL(FILES pixmaps/icons/mm-mime-hi32-rosegarden.png DESTINATION ${ICONDIR}/locolor/32x32/mimetypes RENAME x-rosegarden.png)
+
+# styles
+FILE(GLOB STYLES_FILES styles/*.xml)
+INSTALL(FILES ${STYLES_FILES} DESTINATION ${DATADIR}/styles)
+
+# presets
+FILE(GLOB PRESETS_FILES presets/*.xml)
+INSTALL(FILES ${PRESETS_FILES} DESTINATION ${DATADIR}/presets)
+
+# fonts
+FILE(GLOB PFA_FILES fonts/*.pfa)
+INSTALL(FILES ${PFA_FILES} DESTINATION ${DATADIR}/fonts)
+
+FILE(GLOB XML_FILES fonts/mappings/*.xml)
+INSTALL(FILES ${XML_FILES} DESTINATION ${DATADIR}/fonts/mappings)
+
+FILE(GLOB XPM_FILES pixmaps/rg21/4/*.xpm)
+INSTALL(FILES ${XPM_FILES} DESTINATION ${DATADIR}/fonts/rg21/4)
+
+FILE(GLOB XPM_FILES pixmaps/rg21/8/*.xpm)
+INSTALL(FILES ${XPM_FILES} DESTINATION ${DATADIR}/fonts/rg21/8)
+
+FILE(GLOB XPM_FILES pixmaps/feta/4/*.xpm)
+INSTALL(FILES ${XPM_FILES} DESTINATION ${DATADIR}/fonts/feta/4)
+
+FILE(GLOB XPM_FILES pixmaps/feta/6/*.xpm)
+INSTALL(FILES ${XPM_FILES} DESTINATION ${DATADIR}/fonts/feta/6)
+
+FILE(GLOB XPM_FILES pixmaps/feta/8/*.xpm)
+INSTALL(FILES ${XPM_FILES} DESTINATION ${DATADIR}/fonts/feta/8)
+
+FILE(GLOB XPM_FILES pixmaps/feta/10/*.xpm)
+INSTALL(FILES ${XPM_FILES} DESTINATION ${DATADIR}/fonts/feta/10)
+
+FILE(GLOB XPM_FILES pixmaps/feta/12/*.xpm)
+INSTALL(FILES ${XPM_FILES} DESTINATION ${DATADIR}/fonts/feta/12)
+
+# pixmaps
+FILE(GLOB PIXMAP_FILES pixmaps/misc/*.xpm pixmaps/misc/*.png)
+INSTALL(FILES ${PIXMAP_FILES} DESTINATION ${DATADIR}/pixmaps/misc)
+
+FILE(GLOB PIXMAP_FILES pixmaps/toolbar/*.xpm pixmaps/toolbar/*.png)
+INSTALL(FILES ${PIXMAP_FILES} DESTINATION ${DATADIR}/pixmaps/toolbar)
+
+FILE(GLOB PIXMAP_FILES pixmaps/transport/*.xpm pixmaps/transport/*.png)
+INSTALL(FILES ${PIXMAP_FILES} DESTINATION ${DATADIR}/pixmaps/transport)
+
+# Splash
+INSTALL(FILES pixmaps/splash.png DESTINATION ${DATADIR}/pixmaps)
+
+# Examples
+SET(EXAMPLE_FILES
+ examples/aveverum.rg
+ examples/aylindaamiga.rg
+ examples/bogus-surf-jam.rg
+ examples/bwv-1060-trumpet-duet-excerpt.rg
+ examples/children.rg
+ examples/Djer-Fire.rg
+ examples/doodle-q.rg
+ examples/exercise_notation.rg
+ examples/glazunov.rg
+ examples/glazunov-for-solo-and-piano-with-cue.rg
+ examples/headers-and-unicode-lyrics.rg
+ examples/himno_de_riego.rg
+ examples/interpretation-example.rg
+ examples/let-all-mortal-flesh.rg
+ examples/lilypond-alternative-endings.rg
+ examples/lilypond-directives.rg
+ examples/lilypond-staff-groupings.rg
+ examples/mandolin-sonatina.rg
+ examples/mozart-quartet.rg
+ examples/notation-for-string-orchestra-in-D-minor.rg
+ examples/perfect-moment.rg
+ examples/ravel-pc-gmaj-adagio.rg
+ examples/sonataC.rose
+ examples/stormy-riders.rg
+ examples/test_tuplets.rg
+ examples/the-rose-garden.rg
+ examples/vivaldi-cs3mv2.rg
+ examples/vivaldi_op44_11_1.rg )
+
+INSTALL(FILES ${EXAMPLE_FILES} DESTINATION ${DATADIR}/examples)
+INSTALL(FILES examples/autoload.rg DESTINATION ${DATADIR})
+
+# Library
+FILE(GLOB RGD_FILES library/*.rgd)
+INSTALL(FILES ${RGD_FILES} DESTINATION ${DATADIR}/library)
+
+# KDE LIRC Profile
+INSTALL(FILES profile/rosegarden.profile.xml DESTINATION ${KDE3DATADIR}/profiles)
diff --git a/data/chords/chords.xml b/data/chords/chords.xml
new file mode 100644
index 0000000..06dbe81
--- /dev/null
+++ b/data/chords/chords.xml
@@ -0,0 +1,1733 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE rosegarden-chord-data>
+<rosegarden-chord-data version="1.0" format-version-major="1"
+ format-version-minor="0" format-version-point="0">
+ <chords>
+ <chordset root="C">
+ <chord>
+ <fingering>x 3 2 0 1 0</fingering>
+ <fingering>x 3 5 5 5 0</fingering>
+ <fingering>x 3 5 5 5 3</fingering>
+ <fingering>8 10 10 9 8 8</fingering>
+ </chord>
+ <chord ext="/G">
+ <fingering>3 3 2 0 1 0</fingering>
+ <fingering>3 3 5 5 5 0</fingering>
+ <fingering>3 3 5 5 5 3</fingering>
+ </chord>
+ <chord ext="/E">
+ <fingering>0 3 2 0 1 0</fingering>
+ <fingering>0 3 5 5 5 0</fingering>
+ <fingering>0 3 5 5 5 3</fingering>
+ </chord>
+ <chord ext="m">
+ <fingering>x 3 1 0 1 x</fingering>
+ <fingering>x 3 5 5 4 3</fingering>
+ <fingering>8 10 10 8 8 8</fingering>
+ </chord>
+ <chord ext="m/G">
+ <fingering>3 3 1 0 1 x</fingering>
+ <fingering>3 3 5 5 4 3</fingering>
+ </chord>
+ <chord ext="m/E">
+ <fingering>0 3 1 0 1 x</fingering>
+ <fingering>0 3 5 5 4 3</fingering>
+ </chord>
+ <chord ext="7">
+ <fingering>x 3 2 3 1 0</fingering>
+ <fingering>x 3 5 3 5 3</fingering>
+ <fingering>8 10 8 9 11 8</fingering>
+ <fingering>8 10 10 9 11 8</fingering>
+ </chord>
+ <chord ext="7/G">
+ <fingering>3 3 2 3 1 0</fingering>
+ <fingering>3 3 5 3 5 3</fingering>
+ </chord>
+ <chord ext="7/E">
+ <fingering>0 3 2 3 1 0</fingering>
+ <fingering>0 3 5 3 5 3</fingering>
+ </chord>
+ <chord ext="m7">
+ <fingering>x 3 1 3 1 x</fingering>
+ <fingering>3 3 1 3 1 x</fingering>
+ <fingering>x 3 5 3 4 3</fingering>
+ <fingering>3 3 5 3 4 6</fingering>
+ <fingering>8 10 8 8 11 8</fingering>
+ <fingering>8 10 10 8 11 8</fingering>
+ <fingering>8 x 8 8 8 8</fingering>
+ </chord>
+ <chord ext="m7/G">
+ <fingering>3 3 1 3 1 x</fingering>
+ <fingering>3 3 5 3 4 3</fingering>
+ <fingering>3 3 5 3 4 6</fingering>
+ </chord>
+ <chord ext="m7/E">
+ <fingering>0 3 1 3 1 x</fingering>
+ <fingering>0 3 5 3 4 3</fingering>
+ <fingering>0 3 5 3 4 6</fingering>
+ </chord>
+ <chord ext="maj7">
+ <fingering>x 3 2 0 0 0</fingering>
+ <fingering>x 3 5 4 5 3</fingering>
+ <fingering>x x 10 9 8 7</fingering>
+ <fingering>8 x 9 9 8 x</fingering>
+ </chord>
+ <chord ext="maj7/G">
+ <fingering>3 3 2 0 0 0</fingering>
+ <fingering>3 1 5 4 5 1</fingering>
+ </chord>
+ <chord ext="maj7/E">
+ <fingering>0 3 2 0 0 0</fingering>
+ <fingering>0 3 5 4 5 1</fingering>
+ </chord>
+ <chord ext="m7-5">
+ <fingering>8 x 8 8 7 x</fingering>
+ </chord>
+ <chord ext="sus4">
+ <fingering>x 3 3 0 1 x</fingering>
+ <fingering>3 3 3 0 1 1</fingering>
+ <fingering>0 3 5 5 6 1</fingering>
+ <fingering>3 3 5 5 6 3</fingering>
+ <fingering>8 8 10 10 8 8</fingering>
+ </chord>
+ <chord ext="7sus4">
+ <fingering>x 3 3 3 1 x</fingering>
+ <fingering>3 3 3 3 1 x</fingering>
+ <fingering>x 3 5 3 6 1</fingering>
+ <fingering>3 3 5 3 6 1</fingering>
+ <fingering>8 10 8 10 8 8</fingering>
+ </chord>
+ <chord ext="6">
+ <fingering>0 3 2 2 1 0</fingering>
+ <fingering>3 3 2 2 1 0</fingering>
+ <fingering>x 3 5 5 5 5</fingering>
+ <fingering>3 3 5 5 5 5</fingering>
+ <fingering>8 x 10 9 10 8</fingering>
+ </chord>
+ <chord ext="m6">
+ <fingering>x 3 1 2 1 x</fingering>
+ <fingering>3 3 1 2 1 x</fingering>
+ <fingering>x 3 x 5 4 5</fingering>
+ <fingering>3 3 x 5 4 5</fingering>
+ <fingering>x 3 5 5 4 5</fingering>
+ <fingering>3 3 5 5 4 5</fingering>
+ <fingering>8 x 10 8 10 8</fingering>
+ <fingering>8 10 10 8 10 8</fingering>
+ </chord>
+ <chord ext="9">
+ <fingering>x 3 2 3 3 x</fingering>
+ <fingering>3 3 2 3 3 3</fingering>
+ <fingering>x 7 8 7 8 x</fingering>
+ <fingering>x x 8 7 8 8</fingering>
+ </chord>
+ <chord ext="m9">
+ <fingering>x 3 1 3 3 x</fingering>
+ <fingering>3 3 1 3 3 3</fingering>
+ <fingering>8 6 8 7 x x</fingering>
+ <fingering>8 10 8 8 8 10</fingering>
+ </chord>
+ <chord ext="maj9">
+ <fingering>x 3 2 4 3 x</fingering>
+ <fingering>8 7 9 7 x x</fingering>
+ <fingering>x x 10 7 8 7</fingering>
+ </chord>
+ <chord ext="6/9">
+ <fingering>0 3 2 2 3 3</fingering>
+ <fingering>3 3 2 2 3 3</fingering>
+ <fingering>8 7 7 7 8 8</fingering>
+ <fingering>x x 10 9 10 10</fingering>
+ </chord>
+ <chord ext="7+9">
+ <fingering>x 3 2 3 4 x</fingering>
+ <fingering>8 7 8 8 8 x</fingering>
+ <fingering>8 10 8 9 8 11</fingering>
+ </chord>
+ <chord ext="7-9">
+ <fingering>x 3 2 3 2 x</fingering>
+ <fingering>8 7 8 6 x x</fingering>
+ <fingering>8 x 8 9 8 9</fingering>
+ </chord>
+ <chord ext="aug">
+ <fingering>x 3 2 1 1 x</fingering>
+ <fingering>4 3 2 1 x x</fingering>
+ <fingering>x x 6 5 5 4</fingering>
+ </chord>
+ <chord ext="7+5">
+ <fingering>x 1 2 1 1 x</fingering>
+ <fingering>x 3 6 3 5 4</fingering>
+ <fingering>8 x 8 9 9 8</fingering>
+ </chord>
+ <chord ext="dim">
+ <fingering>2 3 1 2 x x</fingering>
+ <fingering>x 3 4 2 4 x</fingering>
+ <fingering>x x 1 2 1 2</fingering>
+ </chord>
+ <chord ext="-5">
+ <fingering>x 3 4 5 5 x</fingering>
+ <fingering>x x 10 9 7 8</fingering>
+ <fingering>8 9 10 9 x x</fingering>
+ </chord>
+ <chord ext="7-5">
+ <fingering>x 3 4 3 5 x</fingering>
+ <fingering>x x 8 9 7 8</fingering>
+ <fingering>8 9 8 9 x x</fingering>
+ </chord>
+ <chord ext="9-5">
+ <fingering>2 3 2 3 3 2</fingering>
+ <fingering>8 7 8 7 7 8</fingering>
+ <fingering>x x 10 11 11 10</fingering>
+ </chord>
+ <chord ext="11">
+ <fingering>0 3 3 3 3 3</fingering>
+ <fingering>3 3 3 3 3 3</fingering>
+ <fingering>8 x 8 7 6 6</fingering>
+ <fingering>x 0 10 10 11 10</fingering>
+ <fingering>x 10 10 10 11 10</fingering>
+ </chord>
+ <chord ext="13">
+ <fingering>x 3 2 3 3 5</fingering>
+ <fingering>3 3 2 3 3 5</fingering>
+ <fingering>8 x 8 7 5 5</fingering>
+ <fingering>8 x 8 9 10 10</fingering>
+ </chord>
+ </chordset>
+ <chordset root="A">
+ <chord>
+ <fingering>x 0 2 2 2 0</fingering>
+ <fingering>5 7 7 6 5 5</fingering>
+ <fingering>12 12 11 9 10 9</fingering>
+ <fingering>x 12 11 9 10 9</fingering>
+ </chord>
+ <chord ext="7">
+ <fingering>x 0 2 0 2 0</fingering>
+ <fingering>5 7 5 6 8 5</fingering>
+ <fingering>5 7 7 6 8 5</fingering>
+ <fingering>x 12 11 12 10 0</fingering>
+ <fingering>12 12 11 12 10 0</fingering>
+ <fingering>5 x 5 6 5 x</fingering>
+ </chord>
+ <chord ext="m">
+ <fingering>x 0 2 2 1 0</fingering>
+ <fingering>5 7 7 5 5 5</fingering>
+ <fingering>x 0 7 9 10 8</fingering>
+ </chord>
+ <chord ext="m7">
+ <fingering>x 0 2 0 1 3</fingering>
+ <fingering>x 0 2 0 1 0</fingering>
+ <fingering>5 7 7 5 8 5</fingering>
+ <fingering>5 7 5 5 8 5</fingering>
+ <fingering>x 0 7 9 8 8</fingering>
+ <fingering>5 x 5 5 5 x</fingering>
+ </chord>
+ <chord ext="maj7">
+ <fingering>x 0 2 1 2 0</fingering>
+ <fingering>x 0 7 6 5 4</fingering>
+ <fingering>x 12 11 9 9 9</fingering>
+ <fingering>12 12 11 9 9 9</fingering>
+ <fingering>5 x 6 6 5 x</fingering>
+ </chord>
+ <chord ext="sus4">
+ <fingering>x 0 2 2 3 0</fingering>
+ <fingering>x 0 7 7 5 5</fingering>
+ <fingering>x 0 7 9 10 10</fingering>
+ </chord>
+ <chord ext="7sus4">
+ <fingering>x 0 2 0 3 0</fingering>
+ <fingering>x 0 2 0 3 3</fingering>
+ <fingering>5 7 5 7 5 5</fingering>
+ <fingering>x 0 7 7 8 10</fingering>
+ </chord>
+ <chord ext="6">
+ <fingering>x 0 2 2 2 2</fingering>
+ <fingering>5 x 7 6 7 5</fingering>
+ <fingering>x 0 11 11 10 0</fingering>
+ </chord>
+ <chord ext="m6">
+ <fingering>x 0 2 2 1 2</fingering>
+ <fingering>5 7 7 5 7 5</fingering>
+ <fingering>x 0 10 11 10 0</fingering>
+ </chord>
+ <chord ext="9">
+ <fingering>x 0 2 4 2 3</fingering>
+ <fingering>x 0 5 4 5 5</fingering>
+ <fingering>x 0 5 6 5 7</fingering>
+ </chord>
+ <chord ext="m9">
+ <fingering>x 0 2 4 1 3</fingering>
+ <fingering>x 0 5 5 5 7</fingering>
+ <fingering>x 12 10 12 12 0</fingering>
+ </chord>
+ <chord ext="maj9">
+ <fingering>x 0 2 1 0 0</fingering>
+ <fingering>5 4 6 4 5 x</fingering>
+ <fingering>x 12 11 13 12 0</fingering>
+ </chord>
+ <chord ext="6/9">
+ <fingering>x 0 4 2 0 0</fingering>
+ <fingering>x 0 4 4 5 5</fingering>
+ <fingering>x 0 7 6 7 7</fingering>
+ </chord>
+ <chord ext="7+9">
+ <fingering>x 0 2 5 2 3</fingering>
+ <fingering>x 0 5 6 5 8</fingering>
+ <fingering>x 12 11 12 13 0</fingering>
+ </chord>
+ <chord ext="7-9">
+ <fingering>5 4 5 3 x x</fingering>
+ <fingering>5 x 5 6 5 6</fingering>
+ <fingering>x 0 11 12 11 0</fingering>
+ </chord>
+ <chord ext="aug">
+ <fingering>x 4 3 2 2 x</fingering>
+ <fingering>5 4 3 2 x x</fingering>
+ <fingering>x x 3 2 2 1</fingering>
+ </chord>
+ <chord ext="7+5">
+ <fingering>x 0 3 0 2 1</fingering>
+ <fingering>5 x 5 6 6 5</fingering>
+ <fingering>x 10 11 10 10 x</fingering>
+ </chord>
+ <chord ext="dim">
+ <fingering>2 3 1 2 x x</fingering>
+ <fingering>x 3 4 2 4 x</fingering>
+ <fingering>x x 1 2 1 2</fingering>
+ </chord>
+ <chord ext="-5">
+ <fingering>x 0 1 2 2 x</fingering>
+ <fingering>x 0 7 6 4 5</fingering>
+ <fingering>x 0 7 8 10 9</fingering>
+ </chord>
+ <chord ext="7-5">
+ <fingering>x 0 1 0 2 x</fingering>
+ <fingering>x 0 5 6 4 5</fingering>
+ <fingering>x 0 7 8 8 9</fingering>
+ </chord>
+ <chord ext="9-5">
+ <fingering>x 0 1 0 0 x</fingering>
+ <fingering>5 4 5 4 4 5</fingering>
+ <fingering>x 0 7 8 8 7</fingering>
+ </chord>
+ <chord ext="11">
+ <fingering>x 0 0 0 0 0</fingering>
+ <fingering>x 0 5 4 3 3</fingering>
+ <fingering>x 0 7 7 8 7</fingering>
+ </chord>
+ <chord ext="13">
+ <fingering>x 0 5 4 2 2</fingering>
+ <fingering>5 x 5 6 7 7</fingering>
+ <fingering>x 0 11 12 12 14</fingering>
+ </chord>
+ </chordset>
+ <chordset root="A#/Bb">
+ <chord>
+ <fingering>x 1 3 3 3 x</fingering>
+ <fingering>1 1 3 3 3 1</fingering>
+ <fingering>6 8 8 7 6 6</fingering>
+ <fingering>x 13 12 10 11 10</fingering>
+ <fingering>13 13 12 10 11 10</fingering>
+ </chord>
+ <chord ext="7">
+ <fingering>x 1 3 1 3 1</fingering>
+ <fingering>1 1 3 1 3 1</fingering>
+ <fingering>6 8 8 7 9 6</fingering>
+ <fingering>6 8 6 7 9 6</fingering>
+ <fingering>x x 8 10 9 10</fingering>
+ <fingering>6 x 6 7 6 x</fingering>
+ </chord>
+ <chord ext="m">
+ <fingering>1 1 3 3 2 1</fingering>
+ <fingering>x 1 3 3 2 1</fingering>
+ <fingering>6 8 8 6 6 6</fingering>
+ <fingering>x x 8 10 11 9</fingering>
+ </chord>
+ <chord ext="m7">
+ <fingering>1 1 3 1 2 4</fingering>
+ <fingering>x 1 3 1 2 1</fingering>
+ <fingering>6 8 8 6 9 6</fingering>
+ <fingering>6 8 6 6 9 6</fingering>
+ <fingering>x x 8 10 9 9</fingering>
+ <fingering>6 x 6 6 6 x</fingering>
+ </chord>
+ <chord ext="maj7">
+ <fingering>1 1 3 2 3 1</fingering>
+ <fingering>x 1 3 2 3 1</fingering>
+ <fingering>6 8 7 7 6 x</fingering>
+ <fingering>13 13 12 10 10 10</fingering>
+ <fingering>x 13 12 10 10 10</fingering>
+ <fingering>6 x 7 7 6 x</fingering>
+ </chord>
+ <chord ext="sus4">
+ <fingering>1 1 3 3 4 1</fingering>
+ <fingering>x 1 3 3 4 1</fingering>
+ <fingering>x x 3 3 4 6</fingering>
+ <fingering>6 6 8 8 6 6</fingering>
+ <fingering>6 6 8 8 6 6</fingering>
+ </chord>
+ <chord ext="7sus4">
+ <fingering>1 1 3 1 4 1</fingering>
+ <fingering>x 1 3 1 4 1</fingering>
+ <fingering>6 8 6 8 6 6</fingering>
+ <fingering>x x 8 10 9 11</fingering>
+ </chord>
+ <chord ext="6">
+ <fingering>1 1 3 3 3 3</fingering>
+ <fingering>x 1 3 3 3 3</fingering>
+ <fingering>6 x 8 7 8 6</fingering>
+ <fingering>x x 8 10 8 10</fingering>
+ </chord>
+ <chord ext="m6">
+ <fingering>1 1 3 0 2 3</fingering>
+ <fingering>x 1 3 0 2 3</fingering>
+ <fingering>6 8 8 6 8 6</fingering>
+ <fingering>6 x 8 6 8 6</fingering>
+ <fingering>x x 8 10 8 9</fingering>
+ </chord>
+ <chord ext="9">
+ <fingering>1 1 0 1 1 1</fingering>
+ <fingering>x 1 0 1 1 x</fingering>
+ <fingering>x 5 6 5 6 x</fingering>
+ <fingering>6 x 6 7 6 8</fingering>
+ </chord>
+ <chord ext="m9">
+ <fingering>6 4 6 5 x x</fingering>
+ <fingering>6 8 6 6 6 8</fingering>
+ <fingering>13 13 11 13 13 13</fingering>
+ <fingering>x 13 11 13 13 x</fingering>
+ </chord>
+ <chord ext="maj9">
+ <fingering>1 1 0 2 1 1</fingering>
+ <fingering>x 1 0 2 1 1</fingering>
+ <fingering>6 5 7 5 x x</fingering>
+ <fingering>x x 8 5 6 5</fingering>
+ </chord>
+ <chord ext="6/9">
+ <fingering>1 1 0 0 1 1</fingering>
+ <fingering>x 1 0 0 1 1</fingering>
+ <fingering>6 5 5 5 6 6</fingering>
+ <fingering>x x 8 7 8 8</fingering>
+ </chord>
+ <chord ext="7+9">
+ <fingering>1 1 0 1 2 1</fingering>
+ <fingering>x 1 0 1 2 1</fingering>
+ <fingering>6 5 6 6 6 x</fingering>
+ <fingering>6 8 6 7 6 9</fingering>
+ </chord>
+ <chord ext="7-9">
+ <fingering>1 1 0 1 0 1</fingering>
+ <fingering>x 1 0 1 0 1</fingering>
+ <fingering>6 5 6 4 x x</fingering>
+ <fingering>6 x 6 7 6 7</fingering>
+ </chord>
+ <chord ext="aug">
+ <fingering>x 5 4 3 3 x</fingering>
+ <fingering>6 5 4 3 x x</fingering>
+ <fingering>x x 4 3 3 2</fingering>
+ </chord>
+ <chord ext="7+5">
+ <fingering>x 1 4 1 3 2</fingering>
+ <fingering>6 x 6 7 7 6</fingering>
+ <fingering>x 11 12 11 11 x</fingering>
+ </chord>
+ <chord ext="dim">
+ <fingering>3 4 2 3 x x</fingering>
+ <fingering>x 1 2 0 2 x</fingering>
+ <fingering>x x 2 3 2 3</fingering>
+ </chord>
+ <chord ext="-5">
+ <fingering>x 1 2 3 3 x</fingering>
+ <fingering>x x 8 7 5 6</fingering>
+ <fingering>6 7 8 7 x x</fingering>
+ </chord>
+ <chord ext="7-5">
+ <fingering>x 1 2 1 3 x</fingering>
+ <fingering>x x 6 7 5 6</fingering>
+ <fingering>x x 8 9 9 10</fingering>
+ </chord>
+ <chord ext="9-5">
+ <fingering>0 1 0 1 1 0</fingering>
+ <fingering>6 5 6 5 5 4</fingering>
+ <fingering>x x 8 9 9 8</fingering>
+ </chord>
+ <chord ext="11">
+ <fingering>1 1 1 1 1 1</fingering>
+ <fingering>x 1 1 1 1 1</fingering>
+ <fingering>6 x 6 5 1 1</fingering>
+ <fingering>x 8 8 8 9 8</fingering>
+ <fingering>x x 8 8 9 8</fingering>
+ </chord>
+ <chord ext="13">
+ <fingering>1 1 0 1 1 3</fingering>
+ <fingering>x 1 0 1 1 3</fingering>
+ <fingering>6 x 6 5 3 3</fingering>
+ <fingering>6 x 6 7 8 8</fingering>
+ </chord>
+ </chordset>
+ <chordset root="B">
+ <chord>
+ <fingering>2 2 4 4 4 2</fingering>
+ <fingering>x 2 4 4 4 x</fingering>
+ <fingering>7 9 9 8 7 7</fingering>
+ <fingering>x x 9 11 12 11</fingering>
+ </chord>
+ <chord ext="7">
+ <fingering>2 2 1 2 0 2</fingering>
+ <fingering>x 2 1 2 0 2</fingering>
+ <fingering>2 2 4 2 4 2</fingering>
+ <fingering>x 2 4 2 4 2</fingering>
+ <fingering>7 9 9 8 10 7</fingering>
+ <fingering>7 9 7 8 10 7</fingering>
+ <fingering>7 x 7 8 7 x</fingering>
+ </chord>
+ <chord ext="m">
+ <fingering>2 2 4 4 3 2</fingering>
+ <fingering>x 2 4 4 3 2</fingering>
+ <fingering>7 9 9 7 7 7</fingering>
+ <fingering>x x 9 11 12 10</fingering>
+ </chord>
+ <chord ext="m7">
+ <fingering>2 2 0 2 0 2</fingering>
+ <fingering>x 2 0 2 0 2</fingering>
+ <fingering>2 2 4 2 3 5</fingering>
+ <fingering>x 2 4 2 3 2</fingering>
+ <fingering>7 9 9 7 10 7</fingering>
+ <fingering>7 9 7 7 10 7</fingering>
+ <fingering>7 x 7 7 7 x</fingering>
+ </chord>
+ <chord ext="maj7">
+ <fingering>2 2 4 3 4 2</fingering>
+ <fingering>x 2 4 3 4 2</fingering>
+ <fingering>7 9 8 8 7 x</fingering>
+ <fingering>x x 9 8 7 6</fingering>
+ <fingering>7 x 8 8 7 x</fingering>
+ </chord>
+ <chord ext="sus4">
+ <fingering>2 2 4 4 5 2</fingering>
+ <fingering>x 2 4 4 5 2</fingering>
+ <fingering>x x 4 4 5 7</fingering>
+ <fingering>7 7 9 9 7 7</fingering>
+ </chord>
+ <chord ext="7sus4">
+ <fingering>2 2 2 2 0 0</fingering>
+ <fingering>x 2 2 2 0 0</fingering>
+ <fingering>2 2 4 2 5 2</fingering>
+ <fingering>x 2 4 2 5 2</fingering>
+ <fingering>7 9 7 9 7 7</fingering>
+ </chord>
+ <chord ext="6">
+ <fingering>2 2 1 1 0 x</fingering>
+ <fingering>x 2 1 1 0 x</fingering>
+ <fingering>2 2 4 4 4 4</fingering>
+ <fingering>x 2 4 4 4 4</fingering>
+ <fingering>7 x 9 8 9 7</fingering>
+ </chord>
+ <chord ext="m6">
+ <fingering>2 2 0 1 0 2</fingering>
+ <fingering>x 2 0 1 0 2</fingering>
+ <fingering>2 2 4 4 3 4</fingering>
+ <fingering>x 2 x 4 3 4</fingering>
+ <fingering>7 9 9 7 9 7</fingering>
+ <fingering>7 x 9 7 9 7</fingering>
+ </chord>
+ <chord ext="9">
+ <fingering>2 2 1 2 2 2</fingering>
+ <fingering>x 2 1 2 2 x</fingering>
+ <fingering>x 6 7 6 7 x</fingering>
+ <fingering>x x 7 6 7 7</fingering>
+ </chord>
+ <chord ext="m9">
+ <fingering>2 2 0 2 2 2</fingering>
+ <fingering>x 2 0 2 2 x</fingering>
+ <fingering>7 5 7 6 x x</fingering>
+ <fingering>7 9 7 7 7 9</fingering>
+ </chord>
+ <chord ext="maj9">
+ <fingering>x 2 1 3 2 x</fingering>
+ <fingering>7 6 8 6 x x</fingering>
+ <fingering>x x 9 6 7 6</fingering>
+ </chord>
+ <chord ext="6/9">
+ <fingering>2 2 1 1 2 2</fingering>
+ <fingering>x 2 1 1 2 2</fingering>
+ <fingering>7 6 6 6 7 7</fingering>
+ <fingering>x x 9 8 9 9</fingering>
+ </chord>
+ <chord ext="7+9">
+ <fingering>x 2 1 2 3 x</fingering>
+ <fingering>7 6 7 7 7 x</fingering>
+ <fingering>7 9 7 8 7 10</fingering>
+ </chord>
+ <chord ext="7-9">
+ <fingering>x 2 1 2 1 x</fingering>
+ <fingering>7 6 7 5 x x</fingering>
+ <fingering>7 x 7 8 7 8</fingering>
+ </chord>
+ <chord ext="aug">
+ <fingering>x 2 1 0 0 x</fingering>
+ <fingering>3 2 1 0 x x</fingering>
+ <fingering>x x 5 4 4 3</fingering>
+ </chord>
+ <chord ext="7+5">
+ <fingering>x 0 1 0 0 3</fingering>
+ <fingering>x 2 5 2 4 3</fingering>
+ <fingering>7 x 7 8 8 7</fingering>
+ </chord>
+ <chord ext="dim">
+ <fingering>1 2 0 1 x x</fingering>
+ <fingering>x 2 3 1 3 x</fingering>
+ <fingering>x x 0 1 0 1</fingering>
+ </chord>
+ <chord ext="-5">
+ <fingering>x 2 3 4 4 x</fingering>
+ <fingering>x x 9 8 6 7</fingering>
+ <fingering>x x 9 10 12 11</fingering>
+ </chord>
+ <chord ext="7-5">
+ <fingering>x 2 3 2 4 x</fingering>
+ <fingering>x x 7 8 6 7</fingering>
+ <fingering>x x 9 10 10 11</fingering>
+ </chord>
+ <chord ext="9-5">
+ <fingering>1 2 1 2 2 1</fingering>
+ <fingering>7 6 7 6 6 7</fingering>
+ <fingering>x x 9 10 10 9</fingering>
+ </chord>
+ <chord ext="11">
+ <fingering>2 2 2 2 2 2</fingering>
+ <fingering>x 2 2 2 2 2</fingering>
+ <fingering>7 x 7 6 5 5</fingering>
+ <fingering>x 9 9 9 10 9</fingering>
+ <fingering>x x 9 9 10 9</fingering>
+ </chord>
+ <chord ext="13">
+ <fingering>2 2 1 2 2 4</fingering>
+ <fingering>x 2 1 2 2 4</fingering>
+ <fingering>7 X 7 6 4 4</fingering>
+ <fingering>7 X 7 8 9 9</fingering>
+ </chord>
+ </chordset>
+ <chordset root="C#/Db">
+ <chord>
+ <fingering>4 4 3 1 2 1</fingering>
+ <fingering>x 4 3 1 2 1</fingering>
+ <fingering>4 4 6 6 6 4</fingering>
+ <fingering>x 4 6 6 6 x</fingering>
+ <fingering>9 11 11 10 9 9</fingering>
+ </chord>
+ <chord ext="7">
+ <fingering>4 4 3 4 2 x</fingering>
+ <fingering>x 4 3 4 2 x</fingering>
+ <fingering>4 4 6 4 6 4</fingering>
+ <fingering>x 4 6 4 6 4</fingering>
+ <fingering>9 11 11 10 12 9</fingering>
+ <fingering>9 11 9 10 12 9</fingering>
+ <fingering>9 x 9 10 9 x</fingering>
+ </chord>
+ <chord ext="m">
+ <fingering>4 4 6 6 5 4</fingering>
+ <fingering>x 4 6 6 5 4</fingering>
+ <fingering>9 11 11 9 9 9</fingering>
+ <fingering>x 11 11 13 14 12</fingering>
+ <fingering>x x 11 13 14 12</fingering>
+ </chord>
+ <chord ext="m7">
+ <fingering>4 4 2 4 2 x</fingering>
+ <fingering>x 4 2 4 2 x</fingering>
+ <fingering>4 4 6 4 5 7</fingering>
+ <fingering>x 4 6 4 5 4</fingering>
+ <fingering>9 11 11 9 12 9</fingering>
+ <fingering>9 11 9 9 12 9</fingering>
+ <fingering>9 x 9 9 9 x</fingering>
+ </chord>
+ <chord ext="maj7">
+ <fingering>4 4 3 1 1 1</fingering>
+ <fingering>x 4 3 1 1 1</fingering>
+ <fingering>4 4 6 5 6 4</fingering>
+ <fingering>x 4 6 5 6 4</fingering>
+ <fingering>x x 11 10 9 8</fingering>
+ <fingering>9 x 10 10 9 x</fingering>
+ </chord>
+ <chord ext="sus4">
+ <fingering>4 4 6 6 7 4</fingering>
+ <fingering>x 4 6 6 7 4</fingering>
+ <fingering>x x 6 6 7 9</fingering>
+ <fingering>9 9 11 11 9 9</fingering>
+ </chord>
+ <chord ext="7sus4">
+ <fingering>4 4 4 4 2 x</fingering>
+ <fingering>x 4 4 4 2 x</fingering>
+ <fingering>4 4 6 4 7 4</fingering>
+ <fingering>x 4 6 4 7 4</fingering>
+ <fingering>9 11 9 11 9 9</fingering>
+ </chord>
+ <chord ext="6">
+ <fingering>x 4 3 3 2 x</fingering>
+ <fingering>4 4 6 6 6 6</fingering>
+ <fingering>x 4 6 6 6 6</fingering>
+ <fingering>9 x 11 10 11 9</fingering>
+ </chord>
+ <chord ext="m6">
+ <fingering>4 4 2 3 2 x</fingering>
+ <fingering>x 4 2 3 2 x</fingering>
+ <fingering>4 4 6 6 5 6</fingering>
+ <fingering>x 4 x 6 5 6</fingering>
+ <fingering>9 11 11 9 11 9</fingering>
+ <fingering>9 x 11 9 11 9</fingering>
+ </chord>
+ <chord ext="9">
+ <fingering>4 4 3 4 4 4</fingering>
+ <fingering>x 4 3 4 4 x</fingering>
+ <fingering>x 8 9 8 9 x</fingering>
+ <fingering>x x 9 8 9 9</fingering>
+ </chord>
+ <chord ext="m9">
+ <fingering>4 4 2 4 4 4</fingering>
+ <fingering>x 4 2 4 4 x</fingering>
+ <fingering>9 7 9 8 x x</fingering>
+ <fingering>9 11 9 9 9 11</fingering>
+ </chord>
+ <chord ext="maj9">
+ <fingering>x 4 3 5 4 x</fingering>
+ <fingering>9 8 10 8 x x</fingering>
+ <fingering>x x 11 8 9 8</fingering>
+ </chord>
+ <chord ext="6/9">
+ <fingering>4 4 3 3 4 4</fingering>
+ <fingering>x 4 3 3 4 4</fingering>
+ <fingering>9 8 8 8 9 9</fingering>
+ <fingering>x x 11 10 11 11</fingering>
+ </chord>
+ <chord ext="7+9">
+ <fingering>x 4 3 4 5 x</fingering>
+ <fingering>9 8 9 9 9 x</fingering>
+ <fingering>9 11 9 10 9 12</fingering>
+ </chord>
+ <chord ext="7-9">
+ <fingering>x 4 3 4 3 x</fingering>
+ <fingering>9 8 9 7 x x</fingering>
+ <fingering>9 x 9 10 9 10</fingering>
+ </chord>
+ <chord ext="aug">
+ <fingering>x 4 3 2 2 x</fingering>
+ <fingering>5 4 3 2 x x</fingering>
+ <fingering>x x 3 2 2 1</fingering>
+ </chord>
+ <chord ext="7+5">
+ <fingering>x 2 3 2 2 x</fingering>
+ <fingering>x 4 7 4 6 5</fingering>
+ <fingering>9 x 9 10 10 9</fingering>
+ </chord>
+ <chord ext="dim">
+ <fingering>3 4 2 3 x x</fingering>
+ <fingering>x 1 2 0 2 x</fingering>
+ <fingering>x x 2 3 2 3</fingering>
+ </chord>
+ <chord ext="-5">
+ <fingering>x 4 5 6 6 x</fingering>
+ <fingering>x x 11 10 8 9</fingering>
+ <fingering>9 10 11 10 x x</fingering>
+ </chord>
+ <chord ext="7-5">
+ <fingering>x 4 5 4 6 x</fingering>
+ <fingering>x x 9 10 8 9</fingering>
+ <fingering>9 10 9 10 x x</fingering>
+ </chord>
+ <chord ext="9-5">
+ <fingering>3 4 3 4 4 3</fingering>
+ <fingering>9 8 9 8 8 9</fingering>
+ <fingering>x x 11 12 12 11</fingering>
+ </chord>
+ <chord ext="11">
+ <fingering>4 4 4 4 4 4</fingering>
+ <fingering>x 4 4 4 4 4</fingering>
+ <fingering>9 x 9 8 7 7</fingering>
+ <fingering>x 11 11 11 12 11</fingering>
+ <fingering>x x 11 11 12 11</fingering>
+ </chord>
+ <chord ext="13">
+ <fingering>4 4 3 4 4 6</fingering>
+ <fingering>x 4 3 4 4 6</fingering>
+ <fingering>9 x 9 8 7 7</fingering>
+ <fingering>9 x 9 10 11 11</fingering>
+ </chord>
+ </chordset>
+ <chordset root="D">
+ <chord>
+ <fingering>x 0 0 2 3 2</fingering>
+ <fingering>5 5 7 7 7 5</fingering>
+ <fingering>x 5 7 7 7 x</fingering>
+ <fingering>10 12 12 11 10 10</fingering>
+ </chord>
+ <chord ext="7">
+ <fingering>x 0 0 2 1 2</fingering>
+ <fingering>5 5 7 5 7 5</fingering>
+ <fingering>x 5 7 5 7 5</fingering>
+ <fingering>10 12 12 11 13 10</fingering>
+ <fingering>10 12 10 11 13 10</fingering>
+ <fingering>10 x 10 11 10 x</fingering>
+ </chord>
+ <chord ext="m">
+ <fingering>x 0 0 2 3 1</fingering>
+ <fingering>5 5 7 7 6 5</fingering>
+ <fingering>x 5 7 7 6 5</fingering>
+ <fingering>10 12 12 10 10 10</fingering>
+ </chord>
+ <chord ext="m7">
+ <fingering>x 0 0 2 1 1</fingering>
+ <fingering>5 5 7 5 6 8</fingering>
+ <fingering>x 5 7 5 6 5</fingering>
+ <fingering>10 12 12 10 13 10</fingering>
+ <fingering>10 12 10 10 13 10</fingering>
+ <fingering>10 x 10 10 10 x</fingering>
+ </chord>
+ <chord ext="maj7">
+ <fingering>x 0 0 2 2 2</fingering>
+ <fingering>5 5 7 6 7 5</fingering>
+ <fingering>x 5 7 6 7 5</fingering>
+ <fingering>x x 12 11 10 9</fingering>
+ <fingering>10 x 11 11 10 x</fingering>
+ </chord>
+ <chord ext="sus4">
+ <fingering>x 0 0 2 3 3</fingering>
+ <fingering>5 5 7 7 8 5</fingering>
+ <fingering>x 5 7 7 8 5</fingering>
+ <fingering>10 10 12 12 10 10</fingering>
+ </chord>
+ <chord ext="7sus4">
+ <fingering>x 0 0 2 1 3</fingering>
+ <fingering>5 5 7 5 8 5</fingering>
+ <fingering>x 5 7 5 8 5</fingering>
+ <fingering>10 12 10 12 10 10</fingering>
+ </chord>
+ <chord ext="6">
+ <fingering>x 0 0 2 0 2</fingering>
+ <fingering>5 5 7 7 7 7</fingering>
+ <fingering>x 5 7 7 7 7</fingering>
+ <fingering>10 x 12 11 12 10</fingering>
+ </chord>
+ <chord ext="m6">
+ <fingering>x 0 0 2 0 1</fingering>
+ <fingering>5 5 7 7 6 7</fingering>
+ <fingering>x 5 x 7 6 7</fingering>
+ <fingering>10 12 12 10 12 10</fingering>
+ <fingering>10 x 12 10 12 10</fingering>
+ </chord>
+ <chord ext="9">
+ <fingering>x 0 4 2 1 0</fingering>
+ <fingering>x 0 0 2 1 0</fingering>
+ <fingering>5 5 4 5 5 5</fingering>
+ <fingering>x 5 4 5 5 x</fingering>
+ <fingering>x 9 10 9 10 0</fingering>
+ </chord>
+ <chord ext="m9">
+ <fingering>x 0 3 2 1 0</fingering>
+ <fingering>5 5 3 5 5 5</fingering>
+ <fingering>x 5 3 5 5 x</fingering>
+ <fingering>10 12 10 10 10 12</fingering>
+ </chord>
+ <chord ext="maj9">
+ <fingering>x 0 4 2 2 0</fingering>
+ <fingering>x 5 4 6 5 x</fingering>
+ <fingering>x 0 12 9 10 9</fingering>
+ </chord>
+ <chord ext="6/9">
+ <fingering>5 5 4 4 5 5</fingering>
+ <fingering>x 5 4 4 5 5</fingering>
+ <fingering>10 9 9 9 10 10</fingering>
+ <fingering>x x 12 11 12 12</fingering>
+ </chord>
+ <chord ext="7+9">
+ <fingering>x 5 4 5 6 x</fingering>
+ <fingering>10 9 10 10 10 x</fingering>
+ <fingering>10 12 10 11 10 13</fingering>
+ </chord>
+ <chord ext="7-9">
+ <fingering>x 5 4 5 4 x</fingering>
+ <fingering>10 9 10 8 x x</fingering>
+ <fingering>10 x 10 11 10 11</fingering>
+ </chord>
+ <chord ext="aug">
+ <fingering>x 5 4 3 3 x</fingering>
+ <fingering>6 5 4 3 x x</fingering>
+ <fingering>x x 4 3 3 2</fingering>
+ </chord>
+ <chord ext="7+5">
+ <fingering>x 3 4 3 3 x</fingering>
+ <fingering>x 5 8 5 7 6</fingering>
+ <fingering>10 x 10 11 11 10</fingering>
+ </chord>
+ <chord ext="dim">
+ <fingering>10 11 9 10 x x</fingering>
+ <fingering>x 2 3 1 3 x</fingering>
+ <fingering>x x 0 1 0 1</fingering>
+ </chord>
+ <chord ext="-5">
+ <fingering>x 5 6 7 7 x</fingering>
+ <fingering>x x 12 11 9 10</fingering>
+ <fingering>10 11 12 11 x x</fingering>
+ </chord>
+ <chord ext="7-5">
+ <fingering>x 5 6 5 7 x</fingering>
+ <fingering>x x 10 11 9 10</fingering>
+ <fingering>10 11 10 11 x x</fingering>
+ </chord>
+ <chord ext="9-5">
+ <fingering>x x 0 1 1 0</fingering>
+ <fingering>4 5 4 5 5 4</fingering>
+ <fingering>10 9 10 9 9 10</fingering>
+ </chord>
+ <chord ext="11">
+ <fingering>x 0 0 0 1 0</fingering>
+ <fingering>5 5 5 5 5 5</fingering>
+ <fingering>x 5 5 5 5 5</fingering>
+ <fingering>10 x 10 9 8 8</fingering>
+ </chord>
+ <chord ext="13">
+ <fingering>5 5 4 5 5 7</fingering>
+ <fingering>x 5 4 5 5 7</fingering>
+ <fingering>10 x 10 9 7 7</fingering>
+ <fingering>10 x 10 11 12 12</fingering>
+ </chord>
+ </chordset>
+ <chordset root="D#/Eb">
+ <chord>
+ <fingering>6 6 5 3 4 3</fingering>
+ <fingering>x 6 5 3 4 3</fingering>
+ <fingering>6 6 8 8 8 6</fingering>
+ <fingering>x 6 8 8 8 x</fingering>
+ <fingering>11 13 13 12 11 11</fingering>
+ </chord>
+ <chord ext="7">
+ <fingering>6 6 5 6 4 x</fingering>
+ <fingering>x 6 5 6 4 x</fingering>
+ <fingering>6 6 8 6 8 6</fingering>
+ <fingering>x 6 8 6 8 6</fingering>
+ <fingering>11 13 13 12 14 11</fingering>
+ <fingering>11 13 11 12 14 11</fingering>
+ <fingering>11 x 11 12 11 x</fingering>
+ </chord>
+ <chord ext="m">
+ <fingering>x x 4 3 4 2</fingering>
+ <fingering>6 6 8 8 7 6</fingering>
+ <fingering>x 6 8 8 7 6</fingering>
+ <fingering>11 13 13 11 11 11</fingering>
+ </chord>
+ <chord ext="m7">
+ <fingering>6 6 4 6 4 x</fingering>
+ <fingering>x 6 4 6 4 x</fingering>
+ <fingering>6 6 8 6 7 9</fingering>
+ <fingering>x 6 8 6 7 6</fingering>
+ <fingering>11 13 13 11 14 11</fingering>
+ <fingering>11 13 11 11 14 11</fingering>
+ <fingering>11 x 11 11 11 x</fingering>
+ </chord>
+ <chord ext="maj7">
+ <fingering>6 6 5 3 3 3</fingering>
+ <fingering>x 6 5 3 3 3</fingering>
+ <fingering>6 6 8 7 8 6</fingering>
+ <fingering>x 6 8 7 8 6</fingering>
+ <fingering>x x 13 12 11 10</fingering>
+ <fingering>11 x 11 12 11 x</fingering>
+ </chord>
+ <chord ext="sus4">
+ <fingering>x 6 6 3 4 x</fingering>
+ <fingering>6 6 8 8 9 6</fingering>
+ <fingering>x 6 8 8 9 6</fingering>
+ <fingering>11 11 13 13 11 11</fingering>
+ </chord>
+ <chord ext="7sus4">
+ <fingering>6 6 6 6 4 x</fingering>
+ <fingering>x 6 6 6 4 x</fingering>
+ <fingering>6 6 8 6 9 6</fingering>
+ <fingering>x 6 8 6 9 6</fingering>
+ <fingering>11 13 11 13 11 11</fingering>
+ </chord>
+ <chord ext="6">
+ <fingering>x 6 5 5 4 x</fingering>
+ <fingering>6 6 8 8 8 8</fingering>
+ <fingering>x 6 8 8 8 8</fingering>
+ <fingering>11 x 13 12 13 11</fingering>
+ </chord>
+ <chord ext="m6">
+ <fingering>6 6 4 5 4 x</fingering>
+ <fingering>x 6 4 5 4 x</fingering>
+ <fingering>6 6 8 8 7 8</fingering>
+ <fingering>x 6 x 8 7 8</fingering>
+ <fingering>11 13 13 11 13 11</fingering>
+ <fingering>11 x 13 11 13 11</fingering>
+ </chord>
+ <chord ext="9">
+ <fingering>6 6 5 6 6 6</fingering>
+ <fingering>x 6 5 6 6 x</fingering>
+ <fingering>x 10 11 10 11 x</fingering>
+ <fingering>x x 11 10 11 11</fingering>
+ </chord>
+ <chord ext="m9">
+ <fingering>6 6 4 6 6 6</fingering>
+ <fingering>x 6 4 6 6 x</fingering>
+ <fingering>11 9 11 10 x x</fingering>
+ <fingering>11 13 11 11 11 13</fingering>
+ </chord>
+ <chord ext="maj9">
+ <fingering>x x 1 0 3 1</fingering>
+ <fingering>x 6 5 7 6 x</fingering>
+ <fingering>x x 13 10 11 10</fingering>
+ </chord>
+ <chord ext="6/9">
+ <fingering>x x 1 0 1 1</fingering>
+ <fingering>6 6 5 5 6 6</fingering>
+ <fingering>x 6 5 5 6 6</fingering>
+ <fingering>11 10 10 10 11 11</fingering>
+ </chord>
+ <chord ext="7+9">
+ <fingering>x x 1 0 2 2</fingering>
+ <fingering>x 6 5 6 7 x</fingering>
+ <fingering>11 13 11 12 11 14</fingering>
+ </chord>
+ <chord ext="7-9">
+ <fingering>x x 1 0 2 0</fingering>
+ <fingering>x 6 5 6 5 x</fingering>
+ <fingering>11 x 11 12 11 12</fingering>
+ </chord>
+ <chord ext="aug">
+ <fingering>x 2 1 0 0 x</fingering>
+ <fingering>3 2 1 0 x x</fingering>
+ <fingering>x x 3 2 2 1</fingering>
+ </chord>
+ <chord ext="7+5">
+ <fingering>x 4 5 4 4 x</fingering>
+ <fingering>x 6 9 6 8 7</fingering>
+ <fingering>11 x 11 12 12 11</fingering>
+ </chord>
+ <chord ext="dim">
+ <fingering>2 3 1 2 x x</fingering>
+ <fingering>x 3 4 2 4 x</fingering>
+ <fingering>x x 2 3 2 3</fingering>
+ </chord>
+ <chord ext="-5">
+ <fingering>x x 1 2 4 3</fingering>
+ <fingering>x 6 7 8 8 x</fingering>
+ <fingering>x x 13 12 10 11</fingering>
+ </chord>
+ <chord ext="7-5">
+ <fingering>x x 1 2 2 3</fingering>
+ <fingering>x 6 7 6 8 x</fingering>
+ <fingering>x x 11 12 10 11</fingering>
+ </chord>
+ <chord ext="9-5">
+ <fingering>x x 1 2 2 1</fingering>
+ <fingering>5 6 5 6 6 5</fingering>
+ <fingering>11 10 11 10 10 11</fingering>
+ </chord>
+ <chord ext="11">
+ <fingering>x 1 1 1 2 1</fingering>
+ <fingering>x x 1 1 2 1</fingering>
+ <fingering>6 6 6 6 6 6</fingering>
+ <fingering>x 6 6 6 6 6</fingering>
+ <fingering>11 x 11 10 9 9</fingering>
+ </chord>
+ <chord ext="13">
+ <fingering>6 6 5 6 6 8</fingering>
+ <fingering>x 6 5 6 6 8</fingering>
+ <fingering>11 x 11 10 8 8</fingering>
+ <fingering>11 x 11 12 13 13</fingering>
+ </chord>
+ </chordset>
+ <chordset root="E">
+ <chord>
+ <fingering>2 2 1 0 0 0</fingering>
+ <fingering>0 7 6 4 5 4</fingering>
+ <fingering>0 7 9 9 9 7</fingering>
+ <fingering>0 7 9 9 9 0</fingering>
+ </chord>
+ <chord ext="7">
+ <fingering>0 2 2 1 3 0</fingering>
+ <fingering>0 2 x 1 3 0</fingering>
+ <fingering>0 7 6 7 5 0</fingering>
+ <fingering>0 7 9 7 9 7</fingering>
+ <fingering>12 x 12 13 12 0</fingering>
+ </chord>
+ <chord ext="m">
+ <fingering>0 2 2 0 0 0</fingering>
+ <fingering>0 x 5 4 5 3</fingering>
+ <fingering>0 7 9 9 8 7</fingering>
+ </chord>
+ <chord ext="m7">
+ <fingering>0 2 2 0 3 0</fingering>
+ <fingering>0 2 0 0 3 0</fingering>
+ <fingering>0 x 5 4 3 0</fingering>
+ <fingering>0 7 9 7 8 10</fingering>
+ <fingering>0 7 9 7 8 7</fingering>
+ <fingering>12 x 12 12 12 x</fingering>
+ </chord>
+ <chord ext="maj7">
+ <fingering>0 2 1 1 0 0</fingering>
+ <fingering>0 7 6 4 4 4</fingering>
+ <fingering>0 7 9 8 9 7</fingering>
+ <fingering>12 x 13 13 12 x</fingering>
+ </chord>
+ <chord ext="sus4">
+ <fingering>0 2 2 2 0 0</fingering>
+ <fingering>0 7 7 4 5 0</fingering>
+ <fingering>0 x 9 9 10 12</fingering>
+ </chord>
+ <chord ext="7sus4">
+ <fingering>0 2 0 2 0 0</fingering>
+ <fingering>0 x 2 4 3 5</fingering>
+ <fingering>0 7 9 7 10 7</fingering>
+ </chord>
+ <chord ext="6">
+ <fingering>0 2 2 1 2 0</fingering>
+ <fingering>0 7 6 6 5 0</fingering>
+ <fingering>0 7 9 9 9 9</fingering>
+ </chord>
+ <chord ext="m6">
+ <fingering>0 2 2 0 2 0</fingering>
+ <fingering>0 7 5 6 5 x</fingering>
+ <fingering>0 7 9 9 8 9</fingering>
+ <fingering>0 7 x 9 8 9</fingering>
+ </chord>
+ <chord ext="9">
+ <fingering>0 2 0 1 3 2</fingering>
+ <fingering>0 7 6 7 7 0</fingering>
+ <fingering>0 11 12 11 12 0</fingering>
+ </chord>
+ <chord ext="m9">
+ <fingering>0 2 2 0 3 2</fingering>
+ <fingering>0 7 5 7 7 0</fingering>
+ <fingering>0 10 12 11 12 0</fingering>
+ </chord>
+ <chord ext="maj9">
+ <fingering>0 2 1 1 0 2</fingering>
+ <fingering>0 7 4 4 4 4</fingering>
+ <fingering>0 7 6 8 7 0</fingering>
+ </chord>
+ <chord ext="6/9">
+ <fingering>0 2 2 1 2 2</fingering>
+ <fingering>0 x 2 1 2 2</fingering>
+ <fingering>0 7 6 6 7 7</fingering>
+ <fingering>0 11 11 11 12 12</fingering>
+ </chord>
+ <chord ext="7+9">
+ <fingering>0 2 2 1 3 3</fingering>
+ <fingering>0 x 2 1 3 3</fingering>
+ <fingering>0 7 6 7 8 0</fingering>
+ <fingering>0 11 12 12 12 x</fingering>
+ </chord>
+ <chord ext="7-9">
+ <fingering>0 x 0 1 0 1</fingering>
+ <fingering>0 7 6 7 6 x</fingering>
+ <fingering>0 11 12 10 0 0</fingering>
+ </chord>
+ <chord ext="aug">
+ <fingering>0 3 2 1 1 x</fingering>
+ <fingering>4 3 2 1 x x</fingering>
+ <fingering>0 x 6 5 5 4</fingering>
+ </chord>
+ <chord ext="7+5">
+ <fingering>0 x 0 1 1 0</fingering>
+ <fingering>0 5 6 5 5 x</fingering>
+ <fingering>0 7 10 7 9 8</fingering>
+ </chord>
+ <chord ext="dim">
+ <fingering>3 4 2 3 x x</fingering>
+ <fingering>x 1 2 0 2 x</fingering>
+ <fingering>0 x 2 3 2 3</fingering>
+ </chord>
+ <chord ext="-5">
+ <fingering>0 1 2 1 x 0</fingering>
+ <fingering>2 x 2 3 5 4</fingering>
+ <fingering>0 7 8 9 9 0</fingering>
+ </chord>
+ <chord ext="7-5">
+ <fingering>0 1 0 1 x 0</fingering>
+ <fingering>0 7 8 7 9 x</fingering>
+ <fingering>11 x 12 13 11 12</fingering>
+ </chord>
+ <chord ext="9-5">
+ <fingering>0 x 2 3 3 2</fingering>
+ <fingering>6 7 6 7 7 6</fingering>
+ <fingering>0 11 12 11 11 12</fingering>
+ </chord>
+ <chord ext="11">
+ <fingering>0 2 2 2 3 2</fingering>
+ <fingering>0 7 7 7 7 7</fingering>
+ <fingering>0 x 12 11 10 0</fingering>
+ </chord>
+ <chord ext="13">
+ <fingering>0 x 0 1 2 2</fingering>
+ <fingering>0 x 6 7 7 9</fingering>
+ <fingering>0 x 12 11 9 9</fingering>
+ </chord>
+ </chordset>
+ <chordset root="F">
+ <chord>
+ <fingering>1 3 3 2 1 1</fingering>
+ <fingering>8 8 7 5 6 5</fingering>
+ <fingering>x 8 7 5 6 5</fingering>
+ <fingering>8 8 10 10 10 8</fingering>
+ <fingering>x 8 10 10 10 x</fingering>
+ </chord>
+ <chord ext="7">
+ <fingering>1 3 3 2 4 1</fingering>
+ <fingering>1 3 1 2 4 1</fingering>
+ <fingering>8 8 7 8 6 x</fingering>
+ <fingering>x 8 7 8 6 x</fingering>
+ <fingering>8 8 10 8 10 8</fingering>
+ <fingering>x 8 10 8 10 8</fingering>
+ <fingering>1 x 1 2 1 x</fingering>
+ </chord>
+ <chord ext="m">
+ <fingering>1 3 3 1 1 1</fingering>
+ <fingering>x 3 3 5 6 4</fingering>
+ <fingering>x x 3 5 6 4</fingering>
+ <fingering>8 8 10 10 9 8</fingering>
+ <fingering>x 8 10 10 9 8</fingering>
+ </chord>
+ <chord ext="m7">
+ <fingering>1 3 3 1 4 1</fingering>
+ <fingering>1 3 1 1 4 1</fingering>
+ <fingering>x 3 3 5 4 4</fingering>
+ <fingering>x x 3 5 4 4</fingering>
+ <fingering>8 8 10 8 9 11</fingering>
+ <fingering>x 8 10 8 9 8</fingering>
+ <fingering>1 x 1 1 1 x</fingering>
+ </chord>
+ <chord ext="maj7">
+ <fingering>1 3 3 2 1 0</fingering>
+ <fingering>1 x 3 2 1 0</fingering>
+ <fingering>0 8 7 5 5 5</fingering>
+ <fingering>0 8 10 9 10 8</fingering>
+ <fingering>1 x 2 2 1 x</fingering>
+ </chord>
+ <chord ext="sus4">
+ <fingering>1 1 3 3 1 1</fingering>
+ <fingering>x 8 8 5 6 x</fingering>
+ <fingering>8 8 10 10 11 8</fingering>
+ <fingering>x 8 10 10 11 8</fingering>
+ </chord>
+ <chord ext="7sus4">
+ <fingering>1 3 1 3 1 1</fingering>
+ <fingering>8 8 8 8 6 x</fingering>
+ <fingering>x 8 8 8 6 x</fingering>
+ <fingering>8 x 10 8 11 8</fingering>
+ <fingering>x x 10 8 11 8</fingering>
+ </chord>
+ <chord ext="6">
+ <fingering>1 x 3 2 3 1</fingering>
+ <fingering>x 8 7 7 6 x</fingering>
+ <fingering>8 8 10 10 10 10</fingering>
+ <fingering>x 8 10 10 10 10</fingering>
+ </chord>
+ <chord ext="m6">
+ <fingering>1 3 3 1 3 1</fingering>
+ <fingering>1 x 3 1 3 1</fingering>
+ <fingering>8 8 6 7 6 x</fingering>
+ <fingering>x 8 6 7 6 x</fingering>
+ <fingering>8 8 10 10 9 10</fingering>
+ <fingering>x 8 x 10 9 10</fingering>
+ </chord>
+ <chord ext="9">
+ <fingering>1 0 1 0 1 1</fingering>
+ <fingering>x x 3 5 4 3</fingering>
+ <fingering>8 8 7 8 8 8</fingering>
+ <fingering>x 8 7 8 8 x</fingering>
+ </chord>
+ <chord ext="m9">
+ <fingering>1 3 1 1 1 3</fingering>
+ <fingering>x x 6 5 4 3</fingering>
+ <fingering>x x 3 5 4 3</fingering>
+ <fingering>8 8 6 8 8 8</fingering>
+ <fingering>x 8 6 8 8 x</fingering>
+ </chord>
+ <chord ext="maj9">
+ <fingering>1 0 3 0 1 0</fingering>
+ <fingering>x 8 5 5 5 5</fingering>
+ <fingering>x 8 7 9 8 x</fingering>
+ </chord>
+ <chord ext="6/9">
+ <fingering>1 0 0 0 1 1</fingering>
+ <fingering>x x 3 2 3 3</fingering>
+ <fingering>8 8 7 7 8 8</fingering>
+ <fingering>x 8 7 7 8 8</fingering>
+ </chord>
+ <chord ext="7+9">
+ <fingering>1 3 1 2 1 4</fingering>
+ <fingering>x x 3 2 4 4</fingering>
+ <fingering>x 8 7 8 9 x</fingering>
+ </chord>
+ <chord ext="7-9">
+ <fingering>1 x 1 2 1 2</fingering>
+ <fingering>x x 3 2 4 2</fingering>
+ <fingering>x 8 7 8 7 x</fingering>
+ </chord>
+ <chord ext="aug">
+ <fingering>x 4 3 2 2 x</fingering>
+ <fingering>5 4 3 2 x x</fingering>
+ <fingering>x x 3 2 2 1</fingering>
+ </chord>
+ <chord ext="7+5">
+ <fingering>1 x 1 2 2 1</fingering>
+ <fingering>x 6 7 6 6 x</fingering>
+ <fingering>x 8 11 8 10 9</fingering>
+ </chord>
+ <chord ext="dim">
+ <fingering>1 2 0 1 x x</fingering>
+ <fingering>x 2 3 1 3 x</fingering>
+ <fingering>x x 0 1 0 1</fingering>
+ </chord>
+ <chord ext="-5">
+ <fingering>1 2 3 2 0 x</fingering>
+ <fingering>x x 3 4 6 5</fingering>
+ <fingering>x 8 9 10 10 x</fingering>
+ </chord>
+ <chord ext="7-5">
+ <fingering>1 2 1 2 0 x</fingering>
+ <fingering>x x 3 4 4 5</fingering>
+ <fingering>x 8 9 8 10 x</fingering>
+ </chord>
+ <chord ext="9-5">
+ <fingering>1 0 1 0 0 1</fingering>
+ <fingering>x x 3 4 4 3</fingering>
+ <fingering>7 8 7 8 8 7</fingering>
+ </chord>
+ <chord ext="11">
+ <fingering>x 3 3 3 4 3</fingering>
+ <fingering>x x 3 3 4 3</fingering>
+ <fingering>8 8 8 8 8 8</fingering>
+ <fingering>x 8 8 8 8 8</fingering>
+ <fingering>13 11 13 12 11 11</fingering>
+ </chord>
+ <chord ext="13">
+ <fingering>1 x 1 2 3 3</fingering>
+ <fingering>8 8 7 8 8 10</fingering>
+ <fingering>x 8 7 8 8 10</fingering>
+ <fingering>13 x 13 12 10 10</fingering>
+ </chord>
+ </chordset>
+ <chordset root="F#/Gb">
+ <chord>
+ <fingering>2 4 4 3 2 2</fingering>
+ <fingering>9 9 8 6 7 6</fingering>
+ <fingering>x 9 8 6 7 6</fingering>
+ <fingering>9 9 11 11 11 9</fingering>
+ <fingering>x 9 11 11 11 x</fingering>
+ </chord>
+ <chord ext="7">
+ <fingering>2 4 4 3 5 2</fingering>
+ <fingering>2 4 2 3 5 2</fingering>
+ <fingering>9 9 8 9 7 x</fingering>
+ <fingering>x 9 8 9 7 x</fingering>
+ <fingering>9 9 11 9 11 9</fingering>
+ <fingering>x 9 11 9 11 9</fingering>
+ <fingering>2 x 2 3 2 x</fingering>
+ </chord>
+ <chord ext="m">
+ <fingering>2 4 4 2 2 2</fingering>
+ <fingering>x 4 4 6 7 5</fingering>
+ <fingering>x x 4 6 7 5</fingering>
+ <fingering>9 9 11 11 10 9</fingering>
+ <fingering>x 9 11 11 10 9</fingering>
+ </chord>
+ <chord ext="m7">
+ <fingering>2 4 4 2 5 1</fingering>
+ <fingering>2 4 2 2 5 1</fingering>
+ <fingering>x 4 4 6 5 5</fingering>
+ <fingering>x x 4 6 5 5</fingering>
+ <fingering>9 9 11 9 10 12</fingering>
+ <fingering>x 9 11 9 10 9</fingering>
+ <fingering>2 x 2 2 2 x</fingering>
+ </chord>
+ <chord ext="maj7">
+ <fingering>2 4 3 3 2 x</fingering>
+ <fingering>9 9 8 6 6 6</fingering>
+ <fingering>x 9 8 6 6 6</fingering>
+ <fingering>9 9 11 10 11 9</fingering>
+ <fingering>x 9 11 10 11 9</fingering>
+ <fingering>2 x 3 3 2 x</fingering>
+ </chord>
+ <chord ext="sus4">
+ <fingering>2 2 4 4 2 2</fingering>
+ <fingering>x 9 9 6 7 x</fingering>
+ <fingering>9 9 11 11 12 9</fingering>
+ <fingering>x 9 11 11 12 9</fingering>
+ </chord>
+ <chord ext="7sus4">
+ <fingering>2 4 2 4 2 2</fingering>
+ <fingering>9 9 9 9 7 x</fingering>
+ <fingering>x 9 9 9 7 x</fingering>
+ <fingering>9 9 11 9 12 9</fingering>
+ <fingering>x 9 11 9 12 9</fingering>
+ </chord>
+ <chord ext="6">
+ <fingering>2 x 4 3 4 2</fingering>
+ <fingering>x 9 8 8 7 x</fingering>
+ <fingering>9 9 11 11 11 11</fingering>
+ <fingering>x 9 11 11 11 11</fingering>
+ </chord>
+ <chord ext="m6">
+ <fingering>2 4 4 2 4 2</fingering>
+ <fingering>2 x 4 2 4 2</fingering>
+ <fingering>9 9 7 8 7 x</fingering>
+ <fingering>x 9 7 8 7 x</fingering>
+ <fingering>9 9 11 11 10 11</fingering>
+ <fingering>x 9 x 11 10 11</fingering>
+ </chord>
+ <chord ext="9">
+ <fingering>x x 2 1 2 2</fingering>
+ <fingering>x x 4 6 5 4</fingering>
+ <fingering>9 9 8 9 9 9</fingering>
+ <fingering>x 9 8 9 9 x</fingering>
+ </chord>
+ <chord ext="m9">
+ <fingering>2 4 2 2 2 4</fingering>
+ <fingering>x x 4 2 5 4</fingering>
+ <fingering>9 9 7 9 9 9</fingering>
+ <fingering>x 9 7 9 9 x</fingering>
+ </chord>
+ <chord ext="maj9">
+ <fingering>x x 4 1 2 1</fingering>
+ <fingering>x 9 6 6 6 6</fingering>
+ <fingering>x 9 8 10 9 x</fingering>
+ </chord>
+ <chord ext="6/9">
+ <fingering>2 1 1 1 2 2</fingering>
+ <fingering>x x 4 3 4 4</fingering>
+ <fingering>9 9 8 8 9 9</fingering>
+ <fingering>x 9 8 8 9 9</fingering>
+ </chord>
+ <chord ext="7+9">
+ <fingering>2 1 2 2 2 x</fingering>
+ <fingering>2 4 2 3 2 5</fingering>
+ <fingering>x 9 8 9 10 x</fingering>
+ </chord>
+ <chord ext="7-9">
+ <fingering>2 x 2 3 2 3</fingering>
+ <fingering>x x 4 3 5 3</fingering>
+ <fingering>x 9 8 9 8 x</fingering>
+ </chord>
+ <chord ext="aug">
+ <fingering>x 5 4 3 3 x</fingering>
+ <fingering>6 5 4 3 x x</fingering>
+ <fingering>x x 4 3 3 2</fingering>
+ </chord>
+ <chord ext="7+5">
+ <fingering>2 x 2 3 3 2</fingering>
+ <fingering>x 7 8 7 7 x</fingering>
+ <fingering>x 9 12 9 11 10</fingering>
+ </chord>
+ <chord ext="dim">
+ <fingering>2 3 1 2 x x</fingering>
+ <fingering>x 3 4 2 4 x</fingering>
+ <fingering>x x 1 2 1 2</fingering>
+ </chord>
+ <chord ext="-5">
+ <fingering>2 3 4 3 x x</fingering>
+ <fingering>x x 4 5 7 6</fingering>
+ <fingering>x 9 10 11 11 x</fingering>
+ </chord>
+ <chord ext="7-5">
+ <fingering>2 3 2 3 x x</fingering>
+ <fingering>x x 4 5 5 6</fingering>
+ <fingering>x 9 10 9 11 x</fingering>
+ </chord>
+ <chord ext="9-5">
+ <fingering>2 1 2 1 1 2</fingering>
+ <fingering>x x 4 5 5 4</fingering>
+ <fingering>8 9 8 9 9 8</fingering>
+ </chord>
+ <chord ext="11">
+ <fingering>2 x 2 1 0 0</fingering>
+ <fingering>x 4 4 4 5 4</fingering>
+ <fingering>x x 4 4 5 4</fingering>
+ <fingering>9 9 9 9 9 9</fingering>
+ <fingering>x 9 9 9 9 9</fingering>
+ </chord>
+ <chord ext="13">
+ <fingering>2 x 2 3 4 4</fingering>
+ <fingering>9 9 8 9 9 11</fingering>
+ <fingering>x 9 8 9 9 11</fingering>
+ <fingering>9 9 11 9 9 11</fingering>
+ <fingering>x 9 11 9 9 11</fingering>
+ </chord>
+ </chordset>
+ <chordset root="G">
+ <chord>
+ <fingering>3 2 0 0 0 2</fingering>
+ <fingering>3 5 5 4 3 3</fingering>
+ <fingering>10 10 9 7 8 7</fingering>
+ <fingering>x 10 9 7 8 7</fingering>
+ </chord>
+ <chord ext="7">
+ <fingering>3 2 0 0 0 1</fingering>
+ <fingering>3 5 5 4 6 3</fingering>
+ <fingering>3 5 3 4 6 3</fingering>
+ <fingering>10 10 9 10 8 x</fingering>
+ <fingering>x 10 9 10 8 x</fingering>
+ <fingering>3 x 3 4 3 x</fingering>
+ </chord>
+ <chord ext="m">
+ <fingering>3 5 5 3 3 3</fingering>
+ <fingering>x 5 5 7 8 6</fingering>
+ <fingering>x x 5 7 8 6</fingering>
+ <fingering>10 10 12 12 11 10</fingering>
+ <fingering>x 10 12 12 11 10</fingering>
+ </chord>
+ <chord ext="m7">
+ <fingering>3 5 5 3 6 3</fingering>
+ <fingering>3 5 3 3 6 3</fingering>
+ <fingering>x 5 5 7 6 6</fingering>
+ <fingering>x x 5 7 6 6</fingering>
+ <fingering>10 10 12 10 11 13</fingering>
+ <fingering>x 10 12 10 11 10</fingering>
+ <fingering>3 x 3 3 3 x</fingering>
+ </chord>
+ <chord ext="maj7">
+ <fingering>x x 5 4 3 2</fingering>
+ <fingering>3 5 4 4 3 x</fingering>
+ <fingering>10 10 9 7 7 7</fingering>
+ <fingering>x 10 9 7 7 7</fingering>
+ <fingering>3 x 4 4 3 x</fingering>
+ </chord>
+ <chord ext="sus4">
+ <fingering>3 x 0 0 1 3</fingering>
+ <fingering>3 3 5 5 3 3</fingering>
+ <fingering>10 10 12 12 13 10</fingering>
+ <fingering>x 10 12 12 13 10</fingering>
+ </chord>
+ <chord ext="7sus4">
+ <fingering>3 x 3 0 1 x</fingering>
+ <fingering>3 5 3 5 3 3</fingering>
+ <fingering>10 10 10 10 8 x</fingering>
+ <fingering>x 10 10 10 8 x</fingering>
+ </chord>
+ <chord ext="6">
+ <fingering>3 2 0 0 0 0</fingering>
+ <fingering>3 x 5 4 5 3</fingering>
+ <fingering>x 10 9 9 8 x</fingering>
+ </chord>
+ <chord ext="m6">
+ <fingering>3 5 5 3 5 3</fingering>
+ <fingering>3 x 5 3 5 3</fingering>
+ <fingering>10 10 8 9 8 x</fingering>
+ <fingering>x 10 8 9 8 x</fingering>
+ <fingering>10 10 12 12 11 12</fingering>
+ <fingering>x 10 x 12 11 12</fingering>
+ </chord>
+ <chord ext="9">
+ <fingering>x 2 3 2 3 x</fingering>
+ <fingering>x x 3 2 3 3</fingering>
+ <fingering>10 10 9 10 10 10</fingering>
+ <fingering>x 10 9 10 10 x</fingering>
+ </chord>
+ <chord ext="m9">
+ <fingering>3 1 3 2 x x</fingering>
+ <fingering>3 5 3 3 3 5</fingering>
+ <fingering>10 10 8 10 10 10</fingering>
+ <fingering>x 10 8 10 10 x</fingering>
+ </chord>
+ <chord ext="maj9">
+ <fingering>3 2 4 2 3 x</fingering>
+ <fingering>x x 5 2 3 2</fingering>
+ <fingering>x 10 9 11 10 x</fingering>
+ </chord>
+ <chord ext="6/9">
+ <fingering>3 2 2 2 3 3</fingering>
+ <fingering>x x 5 4 5 5</fingering>
+ <fingering>10 10 9 9 10 10</fingering>
+ <fingering>x 10 9 9 10 10</fingering>
+ </chord>
+ <chord ext="7+9">
+ <fingering>3 2 3 3 3 x</fingering>
+ <fingering>3 5 3 4 3 6</fingering>
+ <fingering>x 10 9 10 11 x</fingering>
+ </chord>
+ <chord ext="7-9">
+ <fingering>3 2 3 1 0 x</fingering>
+ <fingering>3 x 3 4 3 4</fingering>
+ <fingering>x 10 9 10 9 x</fingering>
+ </chord>
+ <chord ext="aug">
+ <fingering>x 2 1 0 0 x</fingering>
+ <fingering>3 2 1 0 x x</fingering>
+ <fingering>x x 5 4 4 3</fingering>
+ </chord>
+ <chord ext="7+5">
+ <fingering>3 x 3 4 4 3</fingering>
+ <fingering>x 8 9 8 8 x</fingering>
+ <fingering>x 10 13 10 12 11</fingering>
+ </chord>
+ <chord ext="dim">
+ <fingering>3 4 2 3 x x</fingering>
+ <fingering>x 1 2 0 2 x</fingering>
+ <fingering>x x 2 3 2 3</fingering>
+ </chord>
+ <chord ext="-5">
+ <fingering>x x 5 4 2 3</fingering>
+ <fingering>x x 5 6 8 7</fingering>
+ <fingering>x 10 11 12 12 x</fingering>
+ </chord>
+ <chord ext="7-5">
+ <fingering>3 4 3 4 0 x</fingering>
+ <fingering>x x 5 6 6 7</fingering>
+ <fingering>x 10 11 10 12 x</fingering>
+ </chord>
+ <chord ext="9-5">
+ <fingering>3 2 3 2 2 3</fingering>
+ <fingering>x x 5 6 6 5</fingering>
+ <fingering>9 10 9 10 10 9</fingering>
+ </chord>
+ <chord ext="11">
+ <fingering>3 x 3 2 1 1</fingering>
+ <fingering>x 5 5 5 6 5</fingering>
+ <fingering>x x 5 5 6 5</fingering>
+ <fingering>10 10 10 10 10 10</fingering>
+ <fingering>x 10 10 10 10 10</fingering>
+ </chord>
+ <chord ext="13">
+ <fingering>3 x 3 2 0 0</fingering>
+ <fingering>3 x 3 4 5 5</fingering>
+ <fingering>10 10 9 10 10 12</fingering>
+ <fingering>x 10 9 10 10 12</fingering>
+ </chord>
+ </chordset>
+ <chordset root="G#/Ab">
+ <chord>
+ <fingering>x x 1 1 1 4</fingering>
+ <fingering>4 6 6 5 4 4</fingering>
+ <fingering>11 11 10 8 9 8</fingering>
+ <fingering>x 11 10 8 9 8</fingering>
+ </chord>
+ <chord ext="7">
+ <fingering>x x 1 1 1 2</fingering>
+ <fingering>4 6 6 5 7 4</fingering>
+ <fingering>4 6 4 5 7 4</fingering>
+ <fingering>11 11 13 11 13 11</fingering>
+ <fingering>x 11 13 11 13 11</fingering>
+ <fingering>4 x 4 5 4 x</fingering>
+ </chord>
+ <chord ext="m">
+ <fingering>4 6 6 4 4 4</fingering>
+ <fingering>x 6 6 8 9 7</fingering>
+ <fingering>x x 6 8 9 7</fingering>
+ <fingering>11 11 13 13 12 11</fingering>
+ <fingering>x 11 13 13 12 11</fingering>
+ </chord>
+ <chord ext="m7">
+ <fingering>4 6 6 4 7 4</fingering>
+ <fingering>4 6 4 4 7 4</fingering>
+ <fingering>x 6 6 8 7 7</fingering>
+ <fingering>x x 6 8 7 7</fingering>
+ <fingering>11 11 13 11 12 14</fingering>
+ <fingering>x 11 13 11 12 11</fingering>
+ <fingering>4 x 4 4 4 x</fingering>
+ </chord>
+ <chord ext="maj7">
+ <fingering>x x 6 5 4 3</fingering>
+ <fingering>4 6 5 5 4 x</fingering>
+ <fingering>11 11 10 8 8 8</fingering>
+ <fingering>x 11 10 8 8 8</fingering>
+ <fingering>4 x 4 5 4 x</fingering>
+ </chord>
+ <chord ext="sus4">
+ <fingering>x x 1 1 2 4</fingering>
+ <fingering>4 4 6 6 4 4</fingering>
+ <fingering>x x 6 8 9 9</fingering>
+ </chord>
+ <chord ext="7sus4">
+ <fingering>x x 1 1 2 2</fingering>
+ <fingering>4 6 4 6 4 4</fingering>
+ <fingering>x x 6 8 7 9</fingering>
+ </chord>
+ <chord ext="6">
+ <fingering>x x 1 1 1 1</fingering>
+ <fingering>4 x 6 5 6 4</fingering>
+ <fingering>x 11 10 10 9 x</fingering>
+ </chord>
+ <chord ext="m6">
+ <fingering>x x 1 1 0 1</fingering>
+ <fingering>4 6 6 4 6 4</fingering>
+ <fingering>4 x 6 4 6 4</fingering>
+ <fingering>11 11 9 10 9 x</fingering>
+ <fingering>x 11 9 10 9 x</fingering>
+ </chord>
+ <chord ext="9">
+ <fingering>x 3 4 3 4 x</fingering>
+ <fingering>x x 4 3 4 4</fingering>
+ <fingering>11 11 10 11 11 11</fingering>
+ <fingering>x 11 10 11 11 x</fingering>
+ </chord>
+ <chord ext="m9">
+ <fingering>4 6 4 4 4 6</fingering>
+ <fingering>x x 6 4 7 6</fingering>
+ <fingering>11 11 9 11 11 11</fingering>
+ <fingering>x 11 9 11 11 x</fingering>
+ </chord>
+ <chord ext="maj9">
+ <fingering>4 3 5 3 4 x</fingering>
+ <fingering>x x 6 3 4 3</fingering>
+ <fingering>x 11 10 12 11 x</fingering>
+ </chord>
+ <chord ext="6/9">
+ <fingering>4 3 3 3 4 4</fingering>
+ <fingering>x x 6 5 6 6</fingering>
+ <fingering>11 11 10 10 11 11</fingering>
+ <fingering>x 11 10 10 11 11</fingering>
+ </chord>
+ <chord ext="7+9">
+ <fingering>4 3 4 4 4 x</fingering>
+ <fingering>4 6 4 5 4 7</fingering>
+ <fingering>x 11 10 11 12 x</fingering>
+ </chord>
+ <chord ext="7-9">
+ <fingering>4 3 4 2 x x</fingering>
+ <fingering>4 x 4 5 4 5</fingering>
+ <fingering>x 11 10 11 10 x</fingering>
+ </chord>
+ <chord ext="aug">
+ <fingering>x 3 2 1 1 x</fingering>
+ <fingering>4 3 2 1 x x</fingering>
+ <fingering>x x 6 5 5 4</fingering>
+ </chord>
+ <chord ext="7+5">
+ <fingering>4 x 4 5 5 4</fingering>
+ <fingering>x 9 10 9 9 x</fingering>
+ <fingering>x 11 14 11 13 12</fingering>
+ </chord>
+ <chord ext="dim">
+ <fingering>1 2 0 1 x x</fingering>
+ <fingering>x 2 3 1 3 x</fingering>
+ <fingering>x x 0 1 0 1</fingering>
+ </chord>
+ <chord ext="-5">
+ <fingering>x x 6 5 3 4</fingering>
+ <fingering>4 5 6 5 x x</fingering>
+ <fingering>x 11 12 13 13 x</fingering>
+ </chord>
+ <chord ext="7-5">
+ <fingering>x x 4 5 3 4</fingering>
+ <fingering>4 5 4 5 x x</fingering>
+ <fingering>x x 6 7 7 8</fingering>
+ </chord>
+ <chord ext="9-5">
+ <fingering>4 3 4 3 3 4</fingering>
+ <fingering>x x 6 7 7 6</fingering>
+ <fingering>10 11 10 11 11 10</fingering>
+ </chord>
+ <chord ext="11">
+ <fingering>4 x 4 3 2 2</fingering>
+ <fingering>x 6 6 6 7 6</fingering>
+ <fingering>x x 6 6 7 6</fingering>
+ <fingering>11 11 11 11 11 11</fingering>
+ <fingering>x 11 11 11 11 11</fingering>
+ </chord>
+ <chord ext="13">
+ <fingering>4 x 4 3 1 1</fingering>
+ <fingering>4 x 4 5 6 6</fingering>
+ <fingering>11 11 10 11 11 13</fingering>
+ <fingering>x 11 10 11 11 13</fingering>
+ </chord>
+ </chordset>
+
+
+ </chords>
+</rosegarden-chord-data>
diff --git a/data/desktop/rosegarden.desktop b/data/desktop/rosegarden.desktop
new file mode 100644
index 0000000..a8141a9
--- /dev/null
+++ b/data/desktop/rosegarden.desktop
@@ -0,0 +1,13 @@
+[Desktop Entry]
+Encoding=UTF-8
+Type=Application
+Categories=AudioVideo;Audio;Midi;Sequencer;X-SuSE-Sequencer;X-Red-Hat-Base;
+Exec=rosegarden
+MimeType=audio/x-rosegarden;audio/x-rosegarden-device;audio/midi
+X-KDE-NativeMimeType=audio/x-rosegarden
+Icon=rosegarden.png
+DocPath=rosegarden/index.html
+Comment=MIDI and Audio Sequencer and Editor
+Terminal=false
+Name=Rosegarden
+Name[de]=Rosegarden
diff --git a/data/desktop/x-rosegarden-device.desktop b/data/desktop/x-rosegarden-device.desktop
new file mode 100644
index 0000000..4814b0d
--- /dev/null
+++ b/data/desktop/x-rosegarden-device.desktop
@@ -0,0 +1,8 @@
+[Desktop Entry]
+Comment=Rosegarden device file
+Comment[fr]=Fichier de description de peripherique Rosegarden
+Hidden=false
+Icon=midi
+MimeType=audio/x-rosegarden-device
+Patterns=*.rgd;*.RGD
+Type=MimeType
diff --git a/data/desktop/x-rosegarden.desktop b/data/desktop/x-rosegarden.desktop
new file mode 100644
index 0000000..b6b7669
--- /dev/null
+++ b/data/desktop/x-rosegarden.desktop
@@ -0,0 +1,9 @@
+[Desktop Entry]
+Comment=Rosegarden file
+Comment[fr]=Fichier Rosegarden
+Hidden=false
+Icon=x-rosegarden.png
+MimeType=audio/x-rosegarden
+Patterns=*.rg;*.RG
+Type=MimeType
+X-KDE-AutoEmbed=false
diff --git a/data/desktop/x-rosegarden21.desktop b/data/desktop/x-rosegarden21.desktop
new file mode 100644
index 0000000..89266b8
--- /dev/null
+++ b/data/desktop/x-rosegarden21.desktop
@@ -0,0 +1,8 @@
+[Desktop Entry]
+Comment=Rosegarden 2.1 file
+Comment[fr]=Fichier Rosegarden 2.1
+Hidden=false
+Icon=midi
+MimeType=audio/x-rosegarden21
+Patterns=*.rose
+Type=MimeType
diff --git a/data/desktop/x-soundfont.desktop b/data/desktop/x-soundfont.desktop
new file mode 100644
index 0000000..03821ad
--- /dev/null
+++ b/data/desktop/x-soundfont.desktop
@@ -0,0 +1,8 @@
+[Desktop Entry]
+Comment=Soundfont
+Comment[fr]=Echantillons
+Hidden=false
+Icon=sound
+MimeType=audio/x-soundfont
+Patterns=*.sf2;*.SF2
+Type=MimeType
diff --git a/data/examples/Djer-Fire.rg b/data/examples/Djer-Fire.rg
new file mode 100644
index 0000000..5ebe1b1
--- /dev/null
+++ b/data/examples/Djer-Fire.rg
Binary files differ
diff --git a/data/examples/autoload.rg b/data/examples/autoload.rg
new file mode 100644
index 0000000..e052172
--- /dev/null
+++ b/data/examples/autoload.rg
Binary files differ
diff --git a/data/examples/aveverum.rg b/data/examples/aveverum.rg
new file mode 100644
index 0000000..3e24175
--- /dev/null
+++ b/data/examples/aveverum.rg
Binary files differ
diff --git a/data/examples/aylindaamiga.rg b/data/examples/aylindaamiga.rg
new file mode 100644
index 0000000..911d84a
--- /dev/null
+++ b/data/examples/aylindaamiga.rg
Binary files differ
diff --git a/data/examples/bogus-surf-jam.rg b/data/examples/bogus-surf-jam.rg
new file mode 100644
index 0000000..bf3c52a
--- /dev/null
+++ b/data/examples/bogus-surf-jam.rg
Binary files differ
diff --git a/data/examples/bwv-1060-trumpet-duet-excerpt.rg b/data/examples/bwv-1060-trumpet-duet-excerpt.rg
new file mode 100644
index 0000000..0854609
--- /dev/null
+++ b/data/examples/bwv-1060-trumpet-duet-excerpt.rg
Binary files differ
diff --git a/data/examples/children.rg b/data/examples/children.rg
new file mode 100644
index 0000000..75e09c4
--- /dev/null
+++ b/data/examples/children.rg
Binary files differ
diff --git a/data/examples/colourmap-fragment.xml b/data/examples/colourmap-fragment.xml
new file mode 100644
index 0000000..ee5f72e
--- /dev/null
+++ b/data/examples/colourmap-fragment.xml
@@ -0,0 +1,420 @@
+ <colourmap name="segmentmap">
+ <colourpair id="0" name="" red="197" green="211" blue="125"/>
+ <colourpair id="1" name="AudioDefault" red="151" green="211" blue="125"/>
+ <colourpair id="2" name="MidnightBlue" red="25" green="25" blue="112"/>
+ <colourpair id="3" name="NavyBlue" red="0" green="0" blue="128"/>
+ <colourpair id="4" name="CornflowerBlue" red="100" green="149" blue="237"/>
+ <colourpair id="5" name="DarkSlateBlue" red="72" green="61" blue="139"/>
+ <colourpair id="6" name="SlateBlue" red="106" green="90" blue="205"/>
+ <colourpair id="7" name="MediumSlateBlue" red="123" green="104" blue="238"/>
+ <colourpair id="8" name="LightSlateBlue" red="132" green="112" blue="255"/>
+ <colourpair id="9" name="MediumBlue" red="0" green="0" blue="205"/>
+ <colourpair id="10" name="RoyalBlue" red="65" green="105" blue="225"/>
+ <colourpair id="11" name="blue" red="0" green="0" blue="255"/>
+ <colourpair id="12" name="DodgerBlue" red="30" green="144" blue="255"/>
+ <colourpair id="13" name="DeepSkyBlue" red="0" green="191" blue="255"/>
+ <colourpair id="14" name="SkyBlue" red="135" green="206" blue="235"/>
+ <colourpair id="15" name="LightSkyBlue" red="135" green="206" blue="250"/>
+ <colourpair id="16" name="SteelBlue" red="70" green="130" blue="180"/>
+ <colourpair id="17" name="LightSteelBlue" red="176" green="196" blue="222"/>
+ <colourpair id="18" name="LightBlue" red="173" green="216" blue="230"/>
+ <colourpair id="19" name="PowderBlue" red="176" green="224" blue="230"/>
+ <colourpair id="20" name="PaleTurquoise" red="175" green="238" blue="238"/>
+ <colourpair id="21" name="DarkTurquoise" red="0" green="206" blue="209"/>
+ <colourpair id="22" name="MediumTurquoise" red="72" green="209" blue="204"/>
+ <colourpair id="23" name="turquoise" red="64" green="224" blue="208"/>
+ <colourpair id="24" name="cyan" red="0" green="255" blue="255"/>
+ <colourpair id="25" name="LightCyan" red="224" green="255" blue="255"/>
+ <colourpair id="26" name="CadetBlue" red="95" green="158" blue="160"/>
+ <colourpair id="27" name="MediumAquamarine" red="102" green="205" blue="170"/>
+ <colourpair id="28" name="aquamarine" red="127" green="255" blue="212"/>
+ <colourpair id="29" name="DarkGreen" red="0" green="100" blue="0"/>
+ <colourpair id="30" name="DarkOliveGreen" red="85" green="107" blue="47"/>
+ <colourpair id="31" name="DarkSeaGreen" red="143" green="188" blue="143"/>
+ <colourpair id="32" name="SeaGreen" red="46" green="139" blue="87"/>
+ <colourpair id="33" name="MediumSeaGreen" red="60" green="179" blue="113"/>
+ <colourpair id="34" name="LightSeaGreen" red="32" green="178" blue="170"/>
+ <colourpair id="35" name="PaleGreen" red="152" green="251" blue="152"/>
+ <colourpair id="36" name="SpringGreen" red="0" green="255" blue="127"/>
+ <colourpair id="37" name="LawnGreen" red="124" green="252" blue="0"/>
+ <colourpair id="38" name="green" red="0" green="255" blue="0"/>
+ <colourpair id="39" name="chartreuse" red="127" green="255" blue="0"/>
+ <colourpair id="40" name="MediumSpringGreen" red="0" green="250" blue="154"/>
+ <colourpair id="41" name="GreenYellow" red="173" green="255" blue="47"/>
+ <colourpair id="42" name="LimeGreen" red="50" green="205" blue="50"/>
+ <colourpair id="43" name="YellowGreen" red="154" green="205" blue="50"/>
+ <colourpair id="44" name="ForestGreen" red="34" green="139" blue="34"/>
+ <colourpair id="45" name="OliveDrab" red="107" green="142" blue="35"/>
+ <colourpair id="46" name="DarkKhaki" red="189" green="183" blue="107"/>
+ <colourpair id="47" name="khaki" red="240" green="230" blue="140"/>
+ <colourpair id="48" name="PaleGoldenrod" red="238" green="232" blue="170"/>
+ <colourpair id="49" name="LightGoldenrodYellow" red="250" green="250" blue="210"/>
+ <colourpair id="50" name="LightYellow" red="255" green="255" blue="224"/>
+ <colourpair id="51" name="yellow" red="255" green="255" blue="0"/>
+ <colourpair id="52" name="gold" red="255" green="215" blue="0"/>
+ <colourpair id="53" name="LightGoldenrod" red="238" green="221" blue="130"/>
+ <colourpair id="54" name="goldenrod" red="218" green="165" blue="32"/>
+ <colourpair id="55" name="DarkGoldenrod" red="184" green="134" blue="11"/>
+ <colourpair id="56" name="RosyBrown" red="188" green="143" blue="143"/>
+ <colourpair id="57" name="IndianRed" red="205" green="92" blue="92"/>
+ <colourpair id="58" name="SaddleBrown" red="139" green="69" blue="19"/>
+ <colourpair id="59" name="sienna" red="160" green="82" blue="45"/>
+ <colourpair id="60" name="peru" red="205" green="133" blue="63"/>
+ <colourpair id="61" name="burlywood" red="222" green="184" blue="135"/>
+ <colourpair id="62" name="beige" red="245" green="245" blue="220"/>
+ <colourpair id="63" name="wheat" red="245" green="222" blue="179"/>
+ <colourpair id="64" name="SandyBrown" red="244" green="164" blue="96"/>
+ <colourpair id="65" name="tan" red="210" green="180" blue="140"/>
+ <colourpair id="66" name="chocolate" red="210" green="105" blue="30"/>
+ <colourpair id="67" name="firebrick" red="178" green="34" blue="34"/>
+ <colourpair id="68" name="brown" red="165" green="42" blue="42"/>
+ <colourpair id="69" name="DarkSalmon" red="233" green="150" blue="122"/>
+ <colourpair id="70" name="salmon" red="250" green="128" blue="114"/>
+ <colourpair id="71" name="LightSalmon" red="255" green="160" blue="122"/>
+ <colourpair id="72" name="orange" red="255" green="165" blue="0"/>
+ <colourpair id="73" name="DarkOrange" red="255" green="140" blue="0"/>
+ <colourpair id="74" name="coral" red="255" green="127" blue="80"/>
+ <colourpair id="75" name="LightCoral" red="240" green="128" blue="128"/>
+ <colourpair id="76" name="tomato" red="255" green="99" blue="71"/>
+ <colourpair id="77" name="OrangeRed" red="255" green="69" blue="0"/>
+ <colourpair id="78" name="red" red="255" green="0" blue="0"/>
+ <colourpair id="79" name="HotPink" red="255" green="105" blue="180"/>
+ <colourpair id="80" name="DeepPink" red="255" green="20" blue="147"/>
+ <colourpair id="81" name="pink" red="255" green="192" blue="203"/>
+ <colourpair id="82" name="LightPink" red="255" green="182" blue="193"/>
+ <colourpair id="83" name="PaleVioletRed" red="219" green="112" blue="147"/>
+ <colourpair id="84" name="maroon" red="176" green="48" blue="96"/>
+ <colourpair id="85" name="MediumVioletRed" red="199" green="21" blue="133"/>
+ <colourpair id="86" name="VioletRed" red="208" green="32" blue="144"/>
+ <colourpair id="87" name="magenta" red="255" green="0" blue="255"/>
+ <colourpair id="88" name="violet" red="238" green="130" blue="238"/>
+ <colourpair id="89" name="plum" red="221" green="160" blue="221"/>
+ <colourpair id="90" name="orchid" red="218" green="112" blue="214"/>
+ <colourpair id="91" name="MediumOrchid" red="186" green="85" blue="211"/>
+ <colourpair id="92" name="DarkOrchid" red="153" green="50" blue="204"/>
+ <colourpair id="93" name="DarkViolet" red="148" green="0" blue="211"/>
+ <colourpair id="94" name="BlueViolet" red="138" green="43" blue="226"/>
+ <colourpair id="95" name="purple" red="160" green="32" blue="240"/>
+ <colourpair id="96" name="MediumPurple" red="147" green="112" blue="219"/>
+ <colourpair id="97" name="thistle" red="216" green="191" blue="216"/>
+ <colourpair id="98" name="snow1" red="255" green="250" blue="250"/>
+ <colourpair id="99" name="snow2" red="238" green="233" blue="233"/>
+ <colourpair id="100" name="snow3" red="205" green="201" blue="201"/>
+ <colourpair id="101" name="snow4" red="139" green="137" blue="137"/>
+ <colourpair id="102" name="seashell1" red="255" green="245" blue="238"/>
+ <colourpair id="103" name="seashell2" red="238" green="229" blue="222"/>
+ <colourpair id="104" name="seashell3" red="205" green="197" blue="191"/>
+ <colourpair id="105" name="seashell4" red="139" green="134" blue="130"/>
+ <colourpair id="106" name="AntiqueWhite1" red="255" green="239" blue="219"/>
+ <colourpair id="107" name="AntiqueWhite2" red="238" green="223" blue="204"/>
+ <colourpair id="108" name="AntiqueWhite3" red="205" green="192" blue="176"/>
+ <colourpair id="109" name="AntiqueWhite4" red="139" green="131" blue="120"/>
+ <colourpair id="110" name="bisque1" red="255" green="228" blue="196"/>
+ <colourpair id="111" name="bisque2" red="238" green="213" blue="183"/>
+ <colourpair id="112" name="bisque3" red="205" green="183" blue="158"/>
+ <colourpair id="113" name="bisque4" red="139" green="125" blue="107"/>
+ <colourpair id="114" name="PeachPuff1" red="255" green="218" blue="185"/>
+ <colourpair id="115" name="PeachPuff2" red="238" green="203" blue="173"/>
+ <colourpair id="116" name="PeachPuff3" red="205" green="175" blue="149"/>
+ <colourpair id="117" name="PeachPuff4" red="139" green="119" blue="101"/>
+ <colourpair id="118" name="NavajoWhite1" red="255" green="222" blue="173"/>
+ <colourpair id="119" name="NavajoWhite2" red="238" green="207" blue="161"/>
+ <colourpair id="120" name="NavajoWhite3" red="205" green="179" blue="139"/>
+ <colourpair id="121" name="NavajoWhite4" red="139" green="121" blue="94"/>
+ <colourpair id="122" name="LemonChiffon1" red="255" green="250" blue="205"/>
+ <colourpair id="123" name="LemonChiffon2" red="238" green="233" blue="191"/>
+ <colourpair id="124" name="LemonChiffon3" red="205" green="201" blue="165"/>
+ <colourpair id="125" name="LemonChiffon4" red="139" green="137" blue="112"/>
+ <colourpair id="126" name="cornsilk1" red="255" green="248" blue="220"/>
+ <colourpair id="127" name="cornsilk2" red="238" green="232" blue="205"/>
+ <colourpair id="128" name="cornsilk3" red="205" green="200" blue="177"/>
+ <colourpair id="129" name="cornsilk4" red="139" green="136" blue="120"/>
+ <colourpair id="130" name="ivory1" red="255" green="255" blue="240"/>
+ <colourpair id="131" name="ivory2" red="238" green="238" blue="224"/>
+ <colourpair id="132" name="ivory3" red="205" green="205" blue="193"/>
+ <colourpair id="133" name="ivory4" red="139" green="139" blue="131"/>
+ <colourpair id="134" name="honeydew1" red="240" green="255" blue="240"/>
+ <colourpair id="135" name="honeydew2" red="224" green="238" blue="224"/>
+ <colourpair id="136" name="honeydew3" red="193" green="205" blue="193"/>
+ <colourpair id="137" name="honeydew4" red="131" green="139" blue="131"/>
+ <colourpair id="138" name="LavenderBlush1" red="255" green="240" blue="245"/>
+ <colourpair id="139" name="LavenderBlush2" red="238" green="224" blue="229"/>
+ <colourpair id="140" name="LavenderBlush3" red="205" green="193" blue="197"/>
+ <colourpair id="141" name="LavenderBlush4" red="139" green="131" blue="134"/>
+ <colourpair id="142" name="MistyRose1" red="255" green="228" blue="225"/>
+ <colourpair id="143" name="MistyRose2" red="238" green="213" blue="210"/>
+ <colourpair id="144" name="MistyRose3" red="205" green="183" blue="181"/>
+ <colourpair id="145" name="MistyRose4" red="139" green="125" blue="123"/>
+ <colourpair id="146" name="azure1" red="240" green="255" blue="255"/>
+ <colourpair id="147" name="azure2" red="224" green="238" blue="238"/>
+ <colourpair id="148" name="azure3" red="193" green="205" blue="205"/>
+ <colourpair id="149" name="azure4" red="131" green="139" blue="139"/>
+ <colourpair id="150" name="SlateBlue1" red="131" green="111" blue="255"/>
+ <colourpair id="151" name="SlateBlue2" red="122" green="103" blue="238"/>
+ <colourpair id="152" name="SlateBlue3" red="105" green="89" blue="205"/>
+ <colourpair id="153" name="SlateBlue4" red="71" green="60" blue="139"/>
+ <colourpair id="154" name="RoyalBlue1" red="72" green="118" blue="255"/>
+ <colourpair id="155" name="RoyalBlue2" red="67" green="110" blue="238"/>
+ <colourpair id="156" name="RoyalBlue3" red="58" green="95" blue="205"/>
+ <colourpair id="157" name="RoyalBlue4" red="39" green="64" blue="139"/>
+ <colourpair id="158" name="blue1" red="0" green="0" blue="255"/>
+ <colourpair id="159" name="blue2" red="0" green="0" blue="238"/>
+ <colourpair id="160" name="blue3" red="0" green="0" blue="205"/>
+ <colourpair id="161" name="blue4" red="0" green="0" blue="139"/>
+ <colourpair id="162" name="DodgerBlue1" red="30" green="144" blue="255"/>
+ <colourpair id="163" name="DodgerBlue2" red="28" green="134" blue="238"/>
+ <colourpair id="164" name="DodgerBlue3" red="24" green="116" blue="205"/>
+ <colourpair id="165" name="DodgerBlue4" red="16" green="78" blue="139"/>
+ <colourpair id="166" name="SteelBlue1" red="99" green="184" blue="255"/>
+ <colourpair id="167" name="SteelBlue2" red="92" green="172" blue="238"/>
+ <colourpair id="168" name="SteelBlue3" red="79" green="148" blue="205"/>
+ <colourpair id="169" name="SteelBlue4" red="54" green="100" blue="139"/>
+ <colourpair id="170" name="DeepSkyBlue1" red="0" green="191" blue="255"/>
+ <colourpair id="171" name="DeepSkyBlue2" red="0" green="178" blue="238"/>
+ <colourpair id="172" name="DeepSkyBlue3" red="0" green="154" blue="205"/>
+ <colourpair id="173" name="DeepSkyBlue4" red="0" green="104" blue="139"/>
+ <colourpair id="174" name="SkyBlue1" red="135" green="206" blue="255"/>
+ <colourpair id="175" name="SkyBlue2" red="126" green="192" blue="238"/>
+ <colourpair id="176" name="SkyBlue3" red="108" green="166" blue="205"/>
+ <colourpair id="177" name="SkyBlue4" red="74" green="112" blue="139"/>
+ <colourpair id="178" name="LightSkyBlue1" red="176" green="226" blue="255"/>
+ <colourpair id="179" name="LightSkyBlue2" red="164" green="211" blue="238"/>
+ <colourpair id="180" name="LightSkyBlue3" red="141" green="182" blue="205"/>
+ <colourpair id="181" name="LightSkyBlue4" red="96" green="123" blue="139"/>
+ <colourpair id="182" name="SlateGray1" red="198" green="226" blue="255"/>
+ <colourpair id="183" name="SlateGray2" red="185" green="211" blue="238"/>
+ <colourpair id="184" name="SlateGray3" red="159" green="182" blue="205"/>
+ <colourpair id="185" name="SlateGray4" red="108" green="123" blue="139"/>
+ <colourpair id="186" name="LightSteelBlue1" red="202" green="225" blue="255"/>
+ <colourpair id="187" name="LightSteelBlue2" red="188" green="210" blue="238"/>
+ <colourpair id="188" name="LightSteelBlue3" red="162" green="181" blue="205"/>
+ <colourpair id="189" name="LightSteelBlue4" red="110" green="123" blue="139"/>
+ <colourpair id="190" name="LightBlue1" red="191" green="239" blue="255"/>
+ <colourpair id="191" name="LightBlue2" red="178" green="223" blue="238"/>
+ <colourpair id="192" name="LightBlue3" red="154" green="192" blue="205"/>
+ <colourpair id="193" name="LightBlue4" red="104" green="131" blue="139"/>
+ <colourpair id="194" name="LightCyan1" red="224" green="255" blue="255"/>
+ <colourpair id="195" name="LightCyan2" red="209" green="238" blue="238"/>
+ <colourpair id="196" name="LightCyan3" red="180" green="205" blue="205"/>
+ <colourpair id="197" name="LightCyan4" red="122" green="139" blue="139"/>
+ <colourpair id="198" name="PaleTurquoise1" red="187" green="255" blue="255"/>
+ <colourpair id="199" name="PaleTurquoise2" red="174" green="238" blue="238"/>
+ <colourpair id="200" name="PaleTurquoise3" red="150" green="205" blue="205"/>
+ <colourpair id="201" name="PaleTurquoise4" red="102" green="139" blue="139"/>
+ <colourpair id="202" name="CadetBlue1" red="152" green="245" blue="255"/>
+ <colourpair id="203" name="CadetBlue2" red="142" green="229" blue="238"/>
+ <colourpair id="204" name="CadetBlue3" red="122" green="197" blue="205"/>
+ <colourpair id="205" name="CadetBlue4" red="83" green="134" blue="139"/>
+ <colourpair id="206" name="turquoise1" red="0" green="245" blue="255"/>
+ <colourpair id="207" name="turquoise2" red="0" green="229" blue="238"/>
+ <colourpair id="208" name="turquoise3" red="0" green="197" blue="205"/>
+ <colourpair id="209" name="turquoise4" red="0" green="134" blue="139"/>
+ <colourpair id="210" name="cyan1" red="0" green="255" blue="255"/>
+ <colourpair id="211" name="cyan2" red="0" green="238" blue="238"/>
+ <colourpair id="212" name="cyan3" red="0" green="205" blue="205"/>
+ <colourpair id="213" name="cyan4" red="0" green="139" blue="139"/>
+ <colourpair id="214" name="DarkSlateGray1" red="151" green="255" blue="255"/>
+ <colourpair id="215" name="DarkSlateGray2" red="141" green="238" blue="238"/>
+ <colourpair id="216" name="DarkSlateGray3" red="121" green="205" blue="205"/>
+ <colourpair id="217" name="DarkSlateGray4" red="82" green="139" blue="139"/>
+ <colourpair id="218" name="aquamarine1" red="127" green="255" blue="212"/>
+ <colourpair id="219" name="aquamarine2" red="118" green="238" blue="198"/>
+ <colourpair id="220" name="aquamarine3" red="102" green="205" blue="170"/>
+ <colourpair id="221" name="aquamarine4" red="69" green="139" blue="116"/>
+ <colourpair id="222" name="DarkSeaGreen1" red="193" green="255" blue="193"/>
+ <colourpair id="223" name="DarkSeaGreen2" red="180" green="238" blue="180"/>
+ <colourpair id="224" name="DarkSeaGreen3" red="155" green="205" blue="155"/>
+ <colourpair id="225" name="DarkSeaGreen4" red="105" green="139" blue="105"/>
+ <colourpair id="226" name="SeaGreen1" red="84" green="255" blue="159"/>
+ <colourpair id="227" name="SeaGreen2" red="78" green="238" blue="148"/>
+ <colourpair id="228" name="SeaGreen3" red="67" green="205" blue="128"/>
+ <colourpair id="229" name="SeaGreen4" red="46" green="139" blue="87"/>
+ <colourpair id="230" name="PaleGreen1" red="154" green="255" blue="154"/>
+ <colourpair id="231" name="PaleGreen2" red="144" green="238" blue="144"/>
+ <colourpair id="232" name="PaleGreen3" red="124" green="205" blue="124"/>
+ <colourpair id="233" name="PaleGreen4" red="84" green="139" blue="84"/>
+ <colourpair id="234" name="SpringGreen1" red="0" green="255" blue="127"/>
+ <colourpair id="235" name="SpringGreen2" red="0" green="238" blue="118"/>
+ <colourpair id="236" name="SpringGreen3" red="0" green="205" blue="102"/>
+ <colourpair id="237" name="SpringGreen4" red="0" green="139" blue="69"/>
+ <colourpair id="238" name="green1" red="0" green="255" blue="0"/>
+ <colourpair id="239" name="green2" red="0" green="238" blue="0"/>
+ <colourpair id="240" name="green3" red="0" green="205" blue="0"/>
+ <colourpair id="241" name="green4" red="0" green="139" blue="0"/>
+ <colourpair id="242" name="chartreuse1" red="127" green="255" blue="0"/>
+ <colourpair id="243" name="chartreuse2" red="118" green="238" blue="0"/>
+ <colourpair id="244" name="chartreuse3" red="102" green="205" blue="0"/>
+ <colourpair id="245" name="chartreuse4" red="69" green="139" blue="0"/>
+ <colourpair id="246" name="OliveDrab1" red="192" green="255" blue="62"/>
+ <colourpair id="247" name="OliveDrab2" red="179" green="238" blue="58"/>
+ <colourpair id="248" name="OliveDrab3" red="154" green="205" blue="50"/>
+ <colourpair id="249" name="OliveDrab4" red="105" green="139" blue="34"/>
+ <colourpair id="250" name="DarkOliveGreen1" red="202" green="255" blue="112"/>
+ <colourpair id="251" name="DarkOliveGreen2" red="188" green="238" blue="104"/>
+ <colourpair id="252" name="DarkOliveGreen3" red="162" green="205" blue="90"/>
+ <colourpair id="253" name="DarkOliveGreen4" red="110" green="139" blue="61"/>
+ <colourpair id="254" name="khaki1" red="255" green="246" blue="143"/>
+ <colourpair id="255" name="khaki2" red="238" green="230" blue="133"/>
+ <colourpair id="256" name="khaki3" red="205" green="198" blue="115"/>
+ <colourpair id="257" name="khaki4" red="139" green="134" blue="78"/>
+ <colourpair id="258" name="LightGoldenrod1" red="255" green="236" blue="139"/>
+ <colourpair id="259" name="LightGoldenrod2" red="238" green="220" blue="130"/>
+ <colourpair id="260" name="LightGoldenrod3" red="205" green="190" blue="112"/>
+ <colourpair id="261" name="LightGoldenrod4" red="139" green="129" blue="76"/>
+ <colourpair id="262" name="LightYellow1" red="255" green="255" blue="224"/>
+ <colourpair id="263" name="LightYellow2" red="238" green="238" blue="209"/>
+ <colourpair id="264" name="LightYellow3" red="205" green="205" blue="180"/>
+ <colourpair id="265" name="LightYellow4" red="139" green="139" blue="122"/>
+ <colourpair id="266" name="yellow1" red="255" green="255" blue="0"/>
+ <colourpair id="267" name="yellow2" red="238" green="238" blue="0"/>
+ <colourpair id="268" name="yellow3" red="205" green="205" blue="0"/>
+ <colourpair id="269" name="yellow4" red="139" green="139" blue="0"/>
+ <colourpair id="270" name="gold1" red="255" green="215" blue="0"/>
+ <colourpair id="271" name="gold2" red="238" green="201" blue="0"/>
+ <colourpair id="272" name="gold3" red="205" green="173" blue="0"/>
+ <colourpair id="273" name="gold4" red="139" green="117" blue="0"/>
+ <colourpair id="274" name="goldenrod1" red="255" green="193" blue="37"/>
+ <colourpair id="275" name="goldenrod2" red="238" green="180" blue="34"/>
+ <colourpair id="276" name="goldenrod3" red="205" green="155" blue="29"/>
+ <colourpair id="277" name="goldenrod4" red="139" green="105" blue="20"/>
+ <colourpair id="278" name="DarkGoldenrod1" red="255" green="185" blue="15"/>
+ <colourpair id="279" name="DarkGoldenrod2" red="238" green="173" blue="14"/>
+ <colourpair id="280" name="DarkGoldenrod3" red="205" green="149" blue="12"/>
+ <colourpair id="281" name="DarkGoldenrod4" red="139" green="101" blue="8"/>
+ <colourpair id="282" name="RosyBrown1" red="255" green="193" blue="193"/>
+ <colourpair id="283" name="RosyBrown2" red="238" green="180" blue="180"/>
+ <colourpair id="284" name="RosyBrown3" red="205" green="155" blue="155"/>
+ <colourpair id="285" name="RosyBrown4" red="139" green="105" blue="105"/>
+ <colourpair id="286" name="IndianRed1" red="255" green="106" blue="106"/>
+ <colourpair id="287" name="IndianRed2" red="238" green="99" blue="99"/>
+ <colourpair id="288" name="IndianRed3" red="205" green="85" blue="85"/>
+ <colourpair id="289" name="IndianRed4" red="139" green="58" blue="58"/>
+ <colourpair id="290" name="sienna1" red="255" green="130" blue="71"/>
+ <colourpair id="291" name="sienna2" red="238" green="121" blue="66"/>
+ <colourpair id="292" name="sienna3" red="205" green="104" blue="57"/>
+ <colourpair id="293" name="sienna4" red="139" green="71" blue="38"/>
+ <colourpair id="294" name="burlywood1" red="255" green="211" blue="155"/>
+ <colourpair id="295" name="burlywood2" red="238" green="197" blue="145"/>
+ <colourpair id="296" name="burlywood3" red="205" green="170" blue="125"/>
+ <colourpair id="297" name="burlywood4" red="139" green="115" blue="85"/>
+ <colourpair id="298" name="wheat1" red="255" green="231" blue="186"/>
+ <colourpair id="299" name="wheat2" red="238" green="216" blue="174"/>
+ <colourpair id="300" name="wheat3" red="205" green="186" blue="150"/>
+ <colourpair id="301" name="wheat4" red="139" green="126" blue="102"/>
+ <colourpair id="302" name="tan1" red="255" green="165" blue="79"/>
+ <colourpair id="303" name="tan2" red="238" green="154" blue="73"/>
+ <colourpair id="304" name="tan3" red="205" green="133" blue="63"/>
+ <colourpair id="305" name="tan4" red="139" green="90" blue="43"/>
+ <colourpair id="306" name="chocolate1" red="255" green="127" blue="36"/>
+ <colourpair id="307" name="chocolate2" red="238" green="118" blue="33"/>
+ <colourpair id="308" name="chocolate3" red="205" green="102" blue="29"/>
+ <colourpair id="309" name="chocolate4" red="139" green="69" blue="19"/>
+ <colourpair id="310" name="firebrick1" red="255" green="48" blue="48"/>
+ <colourpair id="311" name="firebrick2" red="238" green="44" blue="44"/>
+ <colourpair id="312" name="firebrick3" red="205" green="38" blue="38"/>
+ <colourpair id="313" name="firebrick4" red="139" green="26" blue="26"/>
+ <colourpair id="314" name="brown1" red="255" green="64" blue="64"/>
+ <colourpair id="315" name="brown2" red="238" green="59" blue="59"/>
+ <colourpair id="316" name="brown3" red="205" green="51" blue="51"/>
+ <colourpair id="317" name="brown4" red="139" green="35" blue="35"/>
+ <colourpair id="318" name="salmon1" red="255" green="140" blue="105"/>
+ <colourpair id="319" name="salmon2" red="238" green="130" blue="98"/>
+ <colourpair id="320" name="salmon3" red="205" green="112" blue="84"/>
+ <colourpair id="321" name="salmon4" red="139" green="76" blue="57"/>
+ <colourpair id="322" name="LightSalmon1" red="255" green="160" blue="122"/>
+ <colourpair id="323" name="LightSalmon2" red="238" green="149" blue="114"/>
+ <colourpair id="324" name="LightSalmon3" red="205" green="129" blue="98"/>
+ <colourpair id="325" name="LightSalmon4" red="139" green="87" blue="66"/>
+ <colourpair id="326" name="orange1" red="255" green="165" blue="0"/>
+ <colourpair id="327" name="orange2" red="238" green="154" blue="0"/>
+ <colourpair id="328" name="orange3" red="205" green="133" blue="0"/>
+ <colourpair id="329" name="orange4" red="139" green="90" blue="0"/>
+ <colourpair id="330" name="DarkOrange1" red="255" green="127" blue="0"/>
+ <colourpair id="331" name="DarkOrange2" red="238" green="118" blue="0"/>
+ <colourpair id="332" name="DarkOrange3" red="205" green="102" blue="0"/>
+ <colourpair id="333" name="DarkOrange4" red="139" green="69" blue="0"/>
+ <colourpair id="334" name="coral1" red="255" green="114" blue="86"/>
+ <colourpair id="335" name="coral2" red="238" green="106" blue="80"/>
+ <colourpair id="336" name="coral3" red="205" green="91" blue="69"/>
+ <colourpair id="337" name="coral4" red="139" green="62" blue="47"/>
+ <colourpair id="338" name="tomato1" red="255" green="99" blue="71"/>
+ <colourpair id="339" name="tomato2" red="238" green="92" blue="66"/>
+ <colourpair id="340" name="tomato3" red="205" green="79" blue="57"/>
+ <colourpair id="341" name="tomato4" red="139" green="54" blue="38"/>
+ <colourpair id="342" name="OrangeRed1" red="255" green="69" blue="0"/>
+ <colourpair id="343" name="OrangeRed2" red="238" green="64" blue="0"/>
+ <colourpair id="344" name="OrangeRed3" red="205" green="55" blue="0"/>
+ <colourpair id="345" name="OrangeRed4" red="139" green="37" blue="0"/>
+ <colourpair id="346" name="red1" red="255" green="0" blue="0"/>
+ <colourpair id="347" name="red2" red="238" green="0" blue="0"/>
+ <colourpair id="348" name="red3" red="205" green="0" blue="0"/>
+ <colourpair id="349" name="red4" red="139" green="0" blue="0"/>
+ <colourpair id="350" name="DeepPink1" red="255" green="20" blue="147"/>
+ <colourpair id="351" name="DeepPink2" red="238" green="18" blue="137"/>
+ <colourpair id="352" name="DeepPink3" red="205" green="16" blue="118"/>
+ <colourpair id="353" name="DeepPink4" red="139" green="10" blue="80"/>
+ <colourpair id="354" name="HotPink1" red="255" green="110" blue="180"/>
+ <colourpair id="355" name="HotPink2" red="238" green="106" blue="167"/>
+ <colourpair id="356" name="HotPink3" red="205" green="96" blue="144"/>
+ <colourpair id="357" name="HotPink4" red="139" green="58" blue="98"/>
+ <colourpair id="358" name="pink1" red="255" green="181" blue="197"/>
+ <colourpair id="359" name="pink2" red="238" green="169" blue="184"/>
+ <colourpair id="360" name="pink3" red="205" green="145" blue="158"/>
+ <colourpair id="361" name="pink4" red="139" green="99" blue="108"/>
+ <colourpair id="362" name="LightPink1" red="255" green="174" blue="185"/>
+ <colourpair id="363" name="LightPink2" red="238" green="162" blue="173"/>
+ <colourpair id="364" name="LightPink3" red="205" green="140" blue="149"/>
+ <colourpair id="365" name="LightPink4" red="139" green="95" blue="101"/>
+ <colourpair id="366" name="PaleVioletRed1" red="255" green="130" blue="171"/>
+ <colourpair id="367" name="PaleVioletRed2" red="238" green="121" blue="159"/>
+ <colourpair id="368" name="PaleVioletRed3" red="205" green="104" blue="137"/>
+ <colourpair id="369" name="PaleVioletRed4" red="139" green="71" blue="93"/>
+ <colourpair id="370" name="maroon1" red="255" green="52" blue="179"/>
+ <colourpair id="371" name="maroon2" red="238" green="48" blue="167"/>
+ <colourpair id="372" name="maroon3" red="205" green="41" blue="144"/>
+ <colourpair id="373" name="maroon4" red="139" green="28" blue="98"/>
+ <colourpair id="374" name="VioletRed1" red="255" green="62" blue="150"/>
+ <colourpair id="375" name="VioletRed2" red="238" green="58" blue="140"/>
+ <colourpair id="376" name="VioletRed3" red="205" green="50" blue="120"/>
+ <colourpair id="377" name="VioletRed4" red="139" green="34" blue="82"/>
+ <colourpair id="378" name="magenta1" red="255" green="0" blue="255"/>
+ <colourpair id="379" name="magenta2" red="238" green="0" blue="238"/>
+ <colourpair id="380" name="magenta3" red="205" green="0" blue="205"/>
+ <colourpair id="381" name="magenta4" red="139" green="0" blue="139"/>
+ <colourpair id="382" name="orchid1" red="255" green="131" blue="250"/>
+ <colourpair id="383" name="orchid2" red="238" green="122" blue="233"/>
+ <colourpair id="384" name="orchid3" red="205" green="105" blue="201"/>
+ <colourpair id="385" name="orchid4" red="139" green="71" blue="137"/>
+ <colourpair id="386" name="plum1" red="255" green="187" blue="255"/>
+ <colourpair id="387" name="plum2" red="238" green="174" blue="238"/>
+ <colourpair id="388" name="plum3" red="205" green="150" blue="205"/>
+ <colourpair id="389" name="plum4" red="139" green="102" blue="139"/>
+ <colourpair id="390" name="MediumOrchid1" red="224" green="102" blue="255"/>
+ <colourpair id="391" name="MediumOrchid2" red="209" green="95" blue="238"/>
+ <colourpair id="392" name="MediumOrchid3" red="180" green="82" blue="205"/>
+ <colourpair id="393" name="MediumOrchid4" red="122" green="55" blue="139"/>
+ <colourpair id="394" name="DarkOrchid1" red="191" green="62" blue="255"/>
+ <colourpair id="395" name="DarkOrchid2" red="178" green="58" blue="238"/>
+ <colourpair id="396" name="DarkOrchid3" red="154" green="50" blue="205"/>
+ <colourpair id="397" name="DarkOrchid4" red="104" green="34" blue="139"/>
+ <colourpair id="398" name="purple1" red="155" green="48" blue="255"/>
+ <colourpair id="399" name="purple2" red="145" green="44" blue="238"/>
+ <colourpair id="400" name="purple3" red="125" green="38" blue="205"/>
+ <colourpair id="401" name="purple4" red="85" green="26" blue="139"/>
+ <colourpair id="402" name="MediumPurple1" red="171" green="130" blue="255"/>
+ <colourpair id="403" name="MediumPurple2" red="159" green="121" blue="238"/>
+ <colourpair id="404" name="MediumPurple3" red="137" green="104" blue="205"/>
+ <colourpair id="405" name="MediumPurple4" red="93" green="71" blue="139"/>
+ <colourpair id="406" name="thistle1" red="255" green="225" blue="255"/>
+ <colourpair id="407" name="thistle2" red="238" green="210" blue="238"/>
+ <colourpair id="408" name="thistle3" red="205" green="181" blue="205"/>
+ <colourpair id="409" name="thistle4" red="139" green="123" blue="139"/>
+ <colourpair id="410" name="black" red="0" green="0" blue="0"/>
+ <colourpair id="411" name="DarkSlateGray" red="47" green="79" blue="79"/>
+ <colourpair id="412" name="DimGray" red="105" green="105" blue="105"/>
+ <colourpair id="413" name="SlateGray" red="112" green="128" blue="144"/>
+ <colourpair id="414" name="LightSlateGray" red="119" green="136" blue="153"/>
+ <colourpair id="415" name="grey" red="190" green="190" blue="190"/>
+ <colourpair id="416" name="LightGray" red="211" green="211" blue="211"/>
+ <colourpair id="417" name="white" red="255" green="255" blue="255"/>
+ </colourmap>
diff --git a/data/examples/doodle-q.rg b/data/examples/doodle-q.rg
new file mode 100644
index 0000000..c976057
--- /dev/null
+++ b/data/examples/doodle-q.rg
Binary files differ
diff --git a/data/examples/exercise_notation.rg b/data/examples/exercise_notation.rg
new file mode 100644
index 0000000..57a98da
--- /dev/null
+++ b/data/examples/exercise_notation.rg
Binary files differ
diff --git a/data/examples/glazunov-for-solo-and-piano-with-cue.rg b/data/examples/glazunov-for-solo-and-piano-with-cue.rg
new file mode 100644
index 0000000..ef4f272
--- /dev/null
+++ b/data/examples/glazunov-for-solo-and-piano-with-cue.rg
Binary files differ
diff --git a/data/examples/glazunov.rg b/data/examples/glazunov.rg
new file mode 100644
index 0000000..76ca41d
--- /dev/null
+++ b/data/examples/glazunov.rg
Binary files differ
diff --git a/data/examples/headers-and-unicode-lyrics.rg b/data/examples/headers-and-unicode-lyrics.rg
new file mode 100644
index 0000000..bfd5268
--- /dev/null
+++ b/data/examples/headers-and-unicode-lyrics.rg
Binary files differ
diff --git a/data/examples/himno_de_riego.rg b/data/examples/himno_de_riego.rg
new file mode 100644
index 0000000..923c5e0
--- /dev/null
+++ b/data/examples/himno_de_riego.rg
Binary files differ
diff --git a/data/examples/interpretation-example.rg b/data/examples/interpretation-example.rg
new file mode 100644
index 0000000..e25bb85
--- /dev/null
+++ b/data/examples/interpretation-example.rg
Binary files differ
diff --git a/data/examples/let-all-mortal-flesh.rg b/data/examples/let-all-mortal-flesh.rg
new file mode 100644
index 0000000..4fa9119
--- /dev/null
+++ b/data/examples/let-all-mortal-flesh.rg
Binary files differ
diff --git a/data/examples/lilypond-alternative-endings.rg b/data/examples/lilypond-alternative-endings.rg
new file mode 100644
index 0000000..05efbd0
--- /dev/null
+++ b/data/examples/lilypond-alternative-endings.rg
Binary files differ
diff --git a/data/examples/lilypond-directives.rg b/data/examples/lilypond-directives.rg
new file mode 100644
index 0000000..588c444
--- /dev/null
+++ b/data/examples/lilypond-directives.rg
Binary files differ
diff --git a/data/examples/lilypond-staff-groupings.rg b/data/examples/lilypond-staff-groupings.rg
new file mode 100644
index 0000000..3bcdc2a
--- /dev/null
+++ b/data/examples/lilypond-staff-groupings.rg
Binary files differ
diff --git a/data/examples/mandolin-sonatina.rg b/data/examples/mandolin-sonatina.rg
new file mode 100644
index 0000000..7683a9a
--- /dev/null
+++ b/data/examples/mandolin-sonatina.rg
Binary files differ
diff --git a/data/examples/mozart-quartet.rg b/data/examples/mozart-quartet.rg
new file mode 100644
index 0000000..193cdb8
--- /dev/null
+++ b/data/examples/mozart-quartet.rg
Binary files differ
diff --git a/data/examples/notation-for-string-orchestra-in-D-minor.rg b/data/examples/notation-for-string-orchestra-in-D-minor.rg
new file mode 100644
index 0000000..c289278
--- /dev/null
+++ b/data/examples/notation-for-string-orchestra-in-D-minor.rg
Binary files differ
diff --git a/data/examples/perfect-moment.rg b/data/examples/perfect-moment.rg
new file mode 100644
index 0000000..86ce26f
--- /dev/null
+++ b/data/examples/perfect-moment.rg
Binary files differ
diff --git a/data/examples/ravel-pc-gmaj-adagio.rg b/data/examples/ravel-pc-gmaj-adagio.rg
new file mode 100644
index 0000000..57063dd
--- /dev/null
+++ b/data/examples/ravel-pc-gmaj-adagio.rg
Binary files differ
diff --git a/data/examples/rg-stats.xsl b/data/examples/rg-stats.xsl
new file mode 100644
index 0000000..546e2c9
--- /dev/null
+++ b/data/examples/rg-stats.xsl
@@ -0,0 +1,143 @@
+<?xml version="1.0"?>
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+<xsl:output method="html"/>
+
+<!-- eek, can't get this working yet
+<xsl:param name="name" select="no composition name"/>
+-->
+
+<!-- XSLT for extracting some stats from an RG4 file
+ See rosegarden/scripts/produceRGStats.sh to turn your RG file
+ into XML that can be parsed with this stylesheet -->
+
+<xsl:template match="/">
+<html>
+ <head>
+ <title>Rosegarden File Summary</title>
+ </head>
+ <body>
+
+ <xsl:apply-templates select="rosegarden-data/composition"/>
+
+ <br/>
+
+ <xsl:apply-templates select="rosegarden-data/segment"/>
+
+ <br/>
+
+ <xsl:apply-templates select="rosegarden-data/studio"/>
+
+ </body>
+</html>
+</xsl:template>
+
+<!-- Composition -->
+
+<xsl:template match="composition">
+
+ <!-- get the filename from the parameter list -->
+
+ <h1>
+ Rosegarden Composition <!-- ("<xsl:attribute select="$name"/>") -->
+ </h1>
+
+ <p>
+ Copyright: <xsl:value-of select="@copyright"/>
+ </p>
+
+ <h2>
+ Tracks
+ </h2>
+
+ <ul>
+ <xsl:apply-templates select="track"/>
+ </ul>
+</xsl:template>
+
+<xsl:template match="track">
+ <li>
+ Track
+ <xsl:value-of select="@id"/>
+ <xsl:text> (</xsl:text>
+ <xsl:value-of select="@label"/>
+ <xsl:text>)</xsl:text>
+ </li>
+</xsl:template>
+
+
+<!-- Segment -->
+
+<xsl:template match="segment">
+ <h3>
+ Segment ("
+ <xsl:value-of select="@label"/>")
+ [Track
+ <xsl:value-of select="@track"/>]
+ <xsl:text> - </xsl:text>
+ starts at
+ <xsl:value-of select="@start"/>
+ </h3>
+
+ <p>
+
+ <!-- <xsl:apply-templates select="event"/> -->
+
+ Contains <xsl:value-of select="count(event)"/> events.
+
+ </p>
+
+</xsl:template>
+
+<xsl:template match="event">
+ Event
+</xsl:template>
+
+
+<!-- Studio -->
+
+<xsl:template match="studio">
+ <h1>
+ Studio
+ </h1>
+
+ <xsl:apply-templates select="device"/>
+
+</xsl:template>
+
+<xsl:template match="device">
+ <h2>
+ Device (id = <xsl:value-of select="@id"/>,
+ type = <xsl:value-of select="@type"/>)
+ </h2>
+
+ <ul>
+ <xsl:apply-templates select="instrument"/>
+ </ul>
+
+ <ul>
+ <xsl:apply-templates select="bank"/>
+ </ul>
+
+</xsl:template>
+
+<xsl:template match="instrument">
+
+ <li>
+ Instrument (id = <xsl:value-of select="@id"/>,
+ channel = <xsl:value-of select="@channel"/>,
+ type = <xsl:value-of select="@type"/>)
+ </li>
+
+</xsl:template>
+
+<xsl:template match="bank">
+
+ <li>
+ Bank (name = <xsl:value-of select="@name"/>,
+ msb = <xsl:value-of select="@msb"/>,
+ lsb = <xsl:value-of select="@lsb"/>)
+ </li>
+
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/data/examples/sonataC.rose b/data/examples/sonataC.rose
new file mode 100644
index 0000000..f74bb7d
--- /dev/null
+++ b/data/examples/sonataC.rose
@@ -0,0 +1,2606 @@
+#!Rosegarden
+#
+# Musical Notation File
+#
+
+RV21
+
+
+Staves 2
+
+
+Name Right Hand
+Clef
+ Clef Name Treble
+Metronome
+ Crotchet 135
+: Minim 0 1 5 0
+: Crotchet 0 1 7 0
+: Crotchet 0 1 9 0
+: Dotted crotchet 0 1 4 0
+Group
+ Beamed
+ : Semiquaver 0 1 5 0
+ : Semiquaver 0 1 6 0
+ End
+: Dotted quaver 0 1 5 0
+Rest
+ Semiquaver rest
+Rest
+ Crotchet rest
+: Minim 0 1 10 0
+: Crotchet 0 1 9 0
+: Dotted quaver 0 1 12 0
+Rest
+ Semiquaver rest
+: Crotchet 0 1 9 0
+Group
+ Beamed
+ : Quaver 0 1 8 0
+ : Semiquaver 0 1 7 0
+ : Semiquaver 0 1 8 0
+ End
+: Dotted quaver 0 1 7 0
+Rest
+ Semiquaver rest
+Rest
+ Crotchet rest
+Group
+ Beamed
+ : Quaver 0 1 10 0
+ : Semiquaver 0 1 11 0
+ : Semiquaver 0 1 12 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 13 0
+ : Semiquaver 0 1 14 0
+ : Semiquaver 0 1 15 0
+ : Semiquaver 0 1 16 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 17 0
+ : Semiquaver 0 1 16 0
+ : Semiquaver 0 1 15 0
+ : Semiquaver 0 1 14 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 13 0
+ : Semiquaver 0 1 12 0
+ : Semiquaver 0 1 11 0
+ : Semiquaver 0 1 10 0
+ End
+Group
+ Beamed
+ : Quaver 0 1 9 0
+ : Semiquaver 0 1 10 0
+ : Semiquaver 0 1 11 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 12 0
+ : Semiquaver 0 1 13 0
+ : Semiquaver 0 1 14 0
+ : Semiquaver 0 1 15 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 16 0
+ : Semiquaver 0 1 15 0
+ : Semiquaver 0 1 14 0
+ : Semiquaver 0 1 13 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 12 0
+ : Semiquaver 0 1 11 0
+ : Semiquaver 0 1 10 0
+ : Semiquaver 0 1 9 0
+ End
+Group
+ Beamed
+ : Quaver 0 1 8 0
+ : Semiquaver 0 1 9 0
+ : Semiquaver 0 1 10 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 11 0
+ : Semiquaver 0 1 12 0
+ : Semiquaver 0 1 13 0
+ : Semiquaver 0 1 14 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 15 0
+ : Semiquaver 0 1 14 0
+ : Semiquaver 0 1 13 0
+ : Semiquaver 0 1 12 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 11 0
+ : Semiquaver 0 1 10 0
+ : Semiquaver 0 1 9 0
+ : Semiquaver 0 1 8 0
+ End
+Group
+ Beamed
+ : Quaver 0 1 7 0
+ : Semiquaver 0 1 8 0
+ : Semiquaver 0 1 9 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 10 0
+ : Semiquaver 0 1 11 0
+ : Semiquaver 0 1 12 0
+ : Semiquaver 0 1 13 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 14 0
+ : Semiquaver 0 1 13 0
+ : Semiquaver 0 1 12 0
+ : Semiquaver 0 1 11 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 10 0
+ : Semiquaver 0 1 9 0
+ : Semiquaver 0 1 8 0
+ : Semiquaver 0 1 7 0
+ End
+Group
+ Beamed
+ : Quaver 0 1 6 0
+ : Semiquaver 0 1 7 0
+ : Semiquaver 0 1 8 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 9 0
+ : Semiquaver 0 1 10 0
+ : Semiquaver 0 1 11 0
+ : Semiquaver 0 1 12 1
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 13 0
+ : Semiquaver 0 1 10 0
+ : Semiquaver 0 1 11 0
+ : Semiquaver 0 1 12 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 13 0
+ : Semiquaver 0 1 14 0
+ : Semiquaver 0 1 15 0
+ : Semiquaver 0 1 16 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 17 0
+ : Semiquaver 0 1 18 0
+ : Semiquaver 0 1 19 0
+ : Semiquaver 0 1 18 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 17 0
+ : Semiquaver 0 1 16 0
+ : Semiquaver 0 1 15 0
+ : Semiquaver 0 1 14 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 15 0
+ : Semiquaver 0 1 16 0
+ : Semiquaver 0 1 17 0
+ : Semiquaver 0 1 16 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 15 0
+ : Semiquaver 0 1 14 0
+ : Semiquaver 0 1 13 0
+ : Semiquaver 0 1 12 0
+ End
+Group
+ Beamed
+ : Quaver 0 1 11 0
+ : Quaver 0 1 16 0
+ : Quaver 0 1 14 0
+ : Quaver 0 1 12 0
+ End
+Group
+ Beamed
+ : Quaver 0 1 13 0
+ : Quaver 0 1 16 0
+ : Quaver 0 1 14 0
+ : Quaver 0 1 12 0
+ End
+: Dotted quaver 0 1 13 0
+Rest
+ Semiquaver rest
+: Dotted quaver 0 3 11 0 13 0 16 0
+Rest
+ Semiquaver rest
+: Dotted quaver 0 1 9 0
+Rest
+ Semiquaver rest
+Rest
+ Crotchet rest
+Group
+ Beamed
+ : Semiquaver 0 1 -2 1
+ : Semiquaver 0 1 -1 0
+ : Semiquaver 0 1 -2 1
+ : Semiquaver 0 1 -1 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 -2 1
+ : Semiquaver 0 1 -1 0
+ : Semiquaver 0 1 -2 1
+ : Semiquaver 0 1 -1 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 -2 0
+ : Semiquaver 0 1 -1 0
+ : Semiquaver 0 1 -2 0
+ : Semiquaver 0 1 -1 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 -2 0
+ : Semiquaver 0 1 -1 0
+ : Semiquaver 0 1 -2 0
+ : Semiquaver 0 1 -1 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 -3 0
+ : Semiquaver 0 1 -1 0
+ : Semiquaver 0 1 -3 0
+ : Semiquaver 0 1 -1 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 -3 0
+ : Semiquaver 0 1 -1 0
+ : Semiquaver 0 1 -3 0
+ : Semiquaver 0 1 -1 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 -3 0
+ : Semiquaver 0 1 -1 0
+ : Semiquaver 0 1 -3 0
+ : Semiquaver 0 1 -1 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 -3 0
+ : Semiquaver 0 1 -1 0
+ : Semiquaver 0 1 -3 0
+ : Semiquaver 0 1 -1 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 -2 0
+ : Semiquaver 0 1 -1 0
+ : Semiquaver 0 1 -3 0
+ : Semiquaver 0 1 -1 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 -4 0
+ : Semiquaver 0 1 -1 0
+ : Semiquaver 0 1 -3 0
+ : Semiquaver 0 1 -1 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 -2 0
+ : Semiquaver 0 1 -1 0
+ : Semiquaver 0 1 -3 0
+ : Semiquaver 0 1 -1 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 -2 0
+ : Semiquaver 0 1 -1 0
+ : Semiquaver 0 1 -4 0
+ : Semiquaver 0 1 -1 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 -3 0
+ : Semiquaver 0 1 -1 0
+ : Semiquaver 0 1 -3 0
+ : Semiquaver 0 1 -1 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 -3 0
+ : Semiquaver 0 1 -1 0
+ : Semiquaver 0 1 -3 0
+ : Semiquaver 0 1 -1 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 -3 0
+ : Semiquaver 0 1 -1 0
+ : Semiquaver 0 1 -3 0
+ : Semiquaver 0 1 -1 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 -3 0
+ : Semiquaver 0 1 -1 0
+ : Semiquaver 0 1 -3 0
+ : Semiquaver 0 1 -1 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 -2 0
+ : Semiquaver 0 1 -1 0
+ : Semiquaver 0 1 -3 0
+ : Semiquaver 0 1 -1 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 -4 0
+ : Semiquaver 0 1 -1 0
+ : Semiquaver 0 1 -3 0
+ : Semiquaver 0 1 -1 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 -2 0
+ : Semiquaver 0 1 -1 0
+ : Semiquaver 0 1 -3 0
+ : Semiquaver 0 1 -1 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 -2 0
+ : Semiquaver 0 1 -1 0
+ : Semiquaver 0 1 -4 0
+ : Semiquaver 0 1 -1 0
+ End
+: Dotted quaver 0 1 13 0
+Rest
+ Semiquaver rest
+Group
+ Beamed
+ Rest
+ Semiquaver rest
+ : Semiquaver 0 1 13 0
+ : Semiquaver 0 1 11 0
+ : Semiquaver 0 1 9 0
+ End
+: Dotted quaver 0 1 7 0
+Rest
+ Semiquaver rest
+Group
+ Beamed
+ Rest
+ Semiquaver rest
+ : Semiquaver 0 1 7 0
+ : Semiquaver 0 1 9 0
+ : Semiquaver 0 1 7 0
+ End
+: Dotted quaver 0 1 12 0
+Rest
+ Semiquaver rest
+Group
+ Beamed
+ Rest
+ Semiquaver rest
+ : Semiquaver 0 1 12 0
+ : Semiquaver 0 1 10 0
+ : Semiquaver 0 1 8 1
+ End
+: Dotted quaver 0 1 6 0
+Rest
+ Semiquaver rest
+Group
+ Beamed
+ Rest
+ Semiquaver rest
+ : Semiquaver 0 1 6 0
+ : Semiquaver 0 1 8 1
+ : Semiquaver 0 1 6 0
+ End
+: Dotted quaver 0 1 11 0
+Rest
+ Semiquaver rest
+Group
+ Beamed
+ Rest
+ Semiquaver rest
+ : Semiquaver 0 1 11 0
+ : Semiquaver 0 1 9 0
+ : Semiquaver 0 1 7 0
+ End
+: Dotted quaver 0 1 5 0
+Rest
+ Semiquaver rest
+Group
+ Beamed
+ Rest
+ Semiquaver rest
+ : Semiquaver 0 1 5 0
+ : Semiquaver 0 1 7 0
+ : Semiquaver 0 1 5 0
+ End
+: Dotted quaver 0 1 10 0
+Rest
+ Semiquaver rest
+Group
+ Beamed
+ Rest
+ Semiquaver rest
+ : Semiquaver 0 1 10 0
+ : Semiquaver 0 1 8 1
+ : Semiquaver 0 1 6 0
+ End
+: Dotted quaver 0 1 4 0
+Rest
+ Semiquaver rest
+Group
+ Beamed
+ Rest
+ Semiquaver rest
+ : Semiquaver 0 1 9 0
+ : Semiquaver 0 1 6 0
+ : Semiquaver 0 1 4 0
+ End
+: Dotted crotchet 0 1 3 0
+Rest
+ Quaver rest
+: Dotted quaver 0 1 5 0
+Rest
+ Semiquaver rest
+: Dotted quaver 0 1 7 0
+Rest
+ Semiquaver rest
+: Crotchet 0 1 10 0
+Group
+ Beamed
+ Rest
+ Quaver rest
+ : Semiquaver 0 1 11 0
+ : Semiquaver 0 2 9 1 10 0
+ End
+: Semiquaver 0 2 10 0 12 0
+Rest
+ Semiquaver rest
+Group
+ Beamed
+ : Quaver 0 1 10 0
+ : Quaver 0 1 12 0
+ : Quaver 0 1 10 0
+ : Quaver 0 1 11 0
+ End
+: Quaver 0 1 9 0
+: Dotted crotchet 0 1 13 0
+Group
+ Beamed
+ Rest
+ Quaver rest
+ : Semiquaver 0 1 12 0
+ : Semiquaver 0 1 11 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 10 0
+ : Semiquaver 0 1 9 0
+ End
+: Dotted minim 0 1 10 0
+Rest
+ Crotchet rest
+: Dotted quaver 0 1 9 0
+Rest
+ Semiquaver rest
+Group
+ Beamed
+ : Semiquaver 0 1 9 0
+ : Semiquaver 0 1 6 0
+ : Semiquaver 0 1 9 0
+ : Semiquaver 0 1 11 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 13 0
+ : Semiquaver 0 1 11 0
+ : Semiquaver 0 1 9 0
+ : Semiquaver 0 1 11 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 12 0
+ : Semiquaver 0 1 10 0
+ : Semiquaver 0 1 8 1
+ : Semiquaver 0 1 10 0
+ End
+: Dotted quaver 0 1 9 0
+Rest
+ Semiquaver rest
+Group
+ Beamed
+ : Semiquaver 0 1 2 0
+ : Semiquaver 0 1 -1 0
+ : Semiquaver 0 1 2 0
+ : Semiquaver 0 1 4 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 6 0
+ : Semiquaver 0 1 4 0
+ : Semiquaver 0 1 2 0
+ : Semiquaver 0 1 4 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 5 0
+ : Semiquaver 0 1 3 0
+ : Semiquaver 0 1 1 1
+ : Semiquaver 0 1 3 0
+ End
+: Dotted quaver 0 1 2 0
+Rest
+ Semiquaver rest
+: Dotted quaver 0 2 6 0 11 0
+Rest
+ Semiquaver rest
+: Dotted quaver 0 2 4 0 9 0
+Rest
+ Semiquaver rest
+Rest
+ Crotchet rest
+: Dotted quaver 0 1 2 0
+Rest
+ Semiquaver rest
+Group
+ Beamed
+ : Semiquaver 0 1 9 0
+ : Semiquaver 0 1 6 0
+ : Semiquaver 0 1 9 0
+ : Semiquaver 0 1 10 1
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 13 0
+ : Semiquaver 0 1 10 1
+ : Semiquaver 0 1 9 0
+ : Semiquaver 0 1 10 1
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 12 0
+ : Semiquaver 0 1 10 0
+ : Semiquaver 0 1 8 1
+ : Semiquaver 0 1 10 0
+ End
+: Dotted quaver 0 1 9 0
+Rest
+ Semiquaver rest
+Group
+ Beamed
+ : Semiquaver 0 1 2 0
+ : Semiquaver 0 1 -1 0
+ : Semiquaver 0 1 2 0
+ : Semiquaver 0 1 3 1
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 6 0
+ : Semiquaver 0 1 3 1
+ : Semiquaver 0 1 2 0
+ : Semiquaver 0 1 3 1
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 5 0
+ : Semiquaver 0 1 3 0
+ : Semiquaver 0 1 1 1
+ : Semiquaver 0 1 3 0
+ End
+: Dotted quaver 0 1 2 0
+Rest
+ Semiquaver rest
+Rest
+ Crotchet rest
+Group
+ Beamed
+ Rest
+ Semiquaver rest
+ : Semiquaver 0 1 9 0
+ : Semiquaver 0 1 10 1
+ : Semiquaver 0 1 10 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 9 0
+ : Semiquaver 0 1 8 0
+ : Semiquaver 0 1 7 0
+ : Semiquaver 0 1 6 0
+ End
+: Dotted quaver 0 1 5 1
+Rest
+ Semiquaver rest
+Rest
+ Crotchet rest
+Group
+ Beamed
+ Rest
+ Semiquaver rest
+ : Semiquaver 0 1 12 1
+ : Semiquaver 0 1 14 0
+ : Semiquaver 0 1 13 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 12 0
+ : Semiquaver 0 1 11 0
+ : Semiquaver 0 1 10 0
+ : Semiquaver 0 1 9 0
+ End
+: Dotted quaver 0 1 8 0
+Rest
+ Semiquaver rest
+Group
+ Beamed
+ : Semiquaver 0 1 6 0
+ : Semiquaver 0 1 3 0
+ : Semiquaver 0 1 6 0
+ : Semiquaver 0 1 8 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 10 0
+ : Semiquaver 0 1 8 0
+ : Semiquaver 0 1 6 0
+ : Semiquaver 0 1 8 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 9 0
+ : Semiquaver 0 1 7 0
+ : Semiquaver 0 1 5 1
+ : Semiquaver 0 1 7 0
+ End
+: Dotted quaver 0 1 6 0
+Rest
+ Semiquaver rest
+Group
+ Beamed
+ : Semiquaver 0 1 1 0
+ : Semiquaver 0 1 -4 0
+ : Semiquaver 0 1 -1 0
+ : Semiquaver 0 1 1 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 3 0
+ : Semiquaver 0 1 1 0
+ : Semiquaver 0 1 -1 0
+ : Semiquaver 0 1 1 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 2 0
+ : Semiquaver 0 1 0 0
+ : Semiquaver 0 1 -2 1
+ : Semiquaver 0 1 0 0
+ End
+Group
+ Beamed
+ Rest
+ Semiquaver rest
+ : Semiquaver 0 1 -1 0
+ : Semiquaver 0 1 0 0
+ : Semiquaver 0 1 1 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 2 0
+ : Semiquaver 0 1 3 0
+ : Semiquaver 0 1 4 0
+ : Semiquaver 0 1 5 1
+ End
+: Dotted quaver 0 1 6 0
+Rest
+ Semiquaver rest
+Rest
+ Crotchet rest
+Group
+ Beamed
+ Rest
+ Semiquaver rest
+ : Semiquaver 0 1 4 0
+ : Semiquaver 0 1 5 0
+ : Semiquaver 0 1 6 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 7 0
+ : Semiquaver 0 1 8 1
+ : Semiquaver 0 1 9 1
+ : Semiquaver 0 1 10 0
+ End
+: Dotted quaver 0 1 11 0
+Rest
+ Semiquaver rest
+Rest
+ Crotchet rest
+Group
+ Beamed
+ Rest
+ Semiquaver rest
+ : Semiquaver 0 1 10 0
+ : Semiquaver 0 1 14 0
+ : Semiquaver 0 1 13 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 12 0
+ : Semiquaver 0 1 11 0
+ : Semiquaver 0 1 10 0
+ : Semiquaver 0 1 9 0
+ End
+: Dotted quaver 0 1 8 0
+Rest
+ Semiquaver rest
+Rest
+ Crotchet rest
+Group
+ Beamed
+ Rest
+ Semiquaver rest
+ : Semiquaver 0 1 9 0
+ : Semiquaver 0 1 13 0
+ : Semiquaver 0 1 12 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 11 0
+ : Semiquaver 0 1 10 0
+ : Semiquaver 0 1 9 0
+ : Semiquaver 0 1 8 0
+ End
+: Dotted quaver 0 1 7 0
+Rest
+ Semiquaver rest
+Rest
+ Crotchet rest
+Group
+ Beamed
+ Rest
+ Semiquaver rest
+ : Semiquaver 0 1 8 0
+ : Semiquaver 0 1 12 0
+ : Semiquaver 0 1 11 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 10 0
+ : Semiquaver 0 1 9 0
+ : Semiquaver 0 1 8 0
+ : Semiquaver 0 1 7 0
+ End
+: Dotted quaver 0 1 6 0
+Rest
+ Semiquaver rest
+Rest
+ Crotchet rest
+Group
+ Beamed
+ Rest
+ Semiquaver rest
+ : Semiquaver 0 1 7 0
+ : Semiquaver 0 1 11 0
+ : Semiquaver 0 1 10 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 9 1
+ : Semiquaver 0 1 8 0
+ : Semiquaver 0 1 7 0
+ : Semiquaver 0 1 6 0
+ End
+: Dotted quaver 0 1 5 0
+Rest
+ Semiquaver rest
+Rest
+ Crotchet rest
+Group
+ Beamed
+ Rest
+ Semiquaver rest
+ : Semiquaver 0 1 3 1
+ : Semiquaver 0 1 6 0
+ : Semiquaver 0 1 5 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 3 1
+ : Semiquaver 0 1 3 0
+ : Semiquaver 0 1 2 0
+ : Semiquaver 0 1 1 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 0 0
+ : Semiquaver 0 1 1 0
+ : Semiquaver 0 1 2 0
+ : Semiquaver 0 1 3 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 3 1
+ : Semiquaver 0 1 5 0
+ : Semiquaver 0 1 6 0
+ : Semiquaver 0 1 7 0
+ End
+: Dotted crotchet 0 1 8 0
+Rest
+ Quaver rest
+: Dotted quaver 0 1 10 0
+Rest
+ Semiquaver rest
+: Dotted quaver 0 1 12 0
+Rest
+ Semiquaver rest
+: Crotchet 0 1 7 0
+Group
+ Beamed
+ Rest
+ Quaver rest
+ : Semiquaver 0 1 8 0
+ : Semiquaver 0 1 9 0
+ End
+: Dotted quaver 0 1 8 0
+Rest
+ Semiquaver rest
+Rest
+ Crotchet rest
+: Dotted crotchet 0 1 13 0
+Rest
+ Quaver rest
+: Dotted quaver 0 1 12 0
+Rest
+ Semiquaver rest
+: Dotted quaver 0 1 15 0
+Rest
+ Semiquaver rest
+: Dotted quaver 0 1 12 0
+Rest
+ Semiquaver rest
+Group
+ Beamed
+ : Quaver 0 1 10 1
+ : Semiquaver 0 1 10 0
+ : Semiquaver 0 1 10 1
+ End
+: Crotchet 0 1 10 0
+Rest
+ Crotchet rest
+Group
+ Beamed
+ : Quaver 0 1 6 0
+ : Semiquaver 0 1 7 0
+ : Semiquaver 0 1 8 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 9 0
+ : Semiquaver 0 1 10 0
+ : Semiquaver 0 1 10 1
+ : Semiquaver 0 1 12 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 13 0
+ : Semiquaver 0 1 12 0
+ : Semiquaver 0 1 10 1
+ : Semiquaver 0 1 10 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 9 0
+ : Semiquaver 0 1 8 0
+ : Semiquaver 0 1 7 0
+ : Semiquaver 0 1 6 0
+ End
+Group
+ Beamed
+ : Quaver 0 1 5 0
+ : Semiquaver 0 1 6 0
+ : Semiquaver 0 1 7 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 8 0
+ : Semiquaver 0 1 9 0
+ : Semiquaver 0 1 10 0
+ : Semiquaver 0 1 10 1
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 12 0
+ : Semiquaver 0 1 10 1
+ : Semiquaver 0 1 10 0
+ : Semiquaver 0 1 9 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 8 0
+ : Semiquaver 0 1 7 0
+ : Semiquaver 0 1 6 0
+ : Semiquaver 0 1 5 0
+ End
+Group
+ Beamed
+ : Quaver 0 1 3 1
+ : Semiquaver 0 1 5 0
+ : Semiquaver 0 1 6 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 7 0
+ : Semiquaver 0 1 8 0
+ : Semiquaver 0 1 9 0
+ : Semiquaver 0 1 10 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 10 1
+ : Semiquaver 0 1 10 0
+ : Semiquaver 0 1 9 0
+ : Semiquaver 0 1 8 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 7 0
+ : Semiquaver 0 1 6 0
+ : Semiquaver 0 1 5 0
+ : Semiquaver 0 1 3 1
+ End
+Group
+ Beamed
+ : Quaver 0 1 3 0
+ : Semiquaver 0 1 3 1
+ : Semiquaver 0 1 5 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 6 0
+ : Semiquaver 0 1 7 0
+ : Semiquaver 0 1 8 0
+ : Semiquaver 0 1 9 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 10 0
+ : Semiquaver 0 1 9 0
+ : Semiquaver 0 1 8 0
+ : Semiquaver 0 1 7 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 6 0
+ : Semiquaver 0 1 5 0
+ : Semiquaver 0 1 4 0
+ : Semiquaver 0 1 3 0
+ End
+: Dotted quaver 0 1 10 0
+Rest
+ Semiquaver rest
+Rest
+ Crotchet rest
+Rest
+ Crotchet rest
+: Dotted quaver 0 2 5 0 10 0
+Rest
+ Semiquaver rest
+: Dotted quaver 0 2 5 0 9 0
+Rest
+ Semiquaver rest
+Rest
+ Crotchet rest
+Rest
+ Crotchet rest
+: Dotted quaver 0 2 5 0 9 0
+Rest
+ Semiquaver rest
+: Dotted quaver 0 2 5 0 8 0
+Rest
+ Semiquaver rest
+Rest
+ Crotchet rest
+Rest
+ Crotchet rest
+: Dotted quaver 0 2 4 0 8 0
+Rest
+ Semiquaver rest
+: Dotted quaver 0 2 5 0 7 0
+Rest
+ Semiquaver rest
+Rest
+ Crotchet rest
+Rest
+ Crotchet rest
+: Dotted quaver 0 2 5 0 7 0
+Rest
+ Semiquaver rest
+Group
+ Beamed
+ : Semiquaver 0 1 7 0
+ : Semiquaver 0 1 -1 0
+ : Semiquaver 0 1 0 0
+ : Semiquaver 0 1 1 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 2 0
+ : Semiquaver 0 1 3 0
+ : Semiquaver 0 1 4 0
+ : Semiquaver 0 1 5 1
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 6 0
+ : Semiquaver 0 1 3 0
+ : Semiquaver 0 1 4 0
+ : Semiquaver 0 1 5 1
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 6 0
+ : Semiquaver 0 1 7 0
+ : Semiquaver 0 1 8 0
+ : Semiquaver 0 1 9 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 10 0
+ : Semiquaver 0 1 11 0
+ : Semiquaver 0 1 12 0
+ : Semiquaver 0 1 11 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 10 0
+ : Semiquaver 0 1 9 0
+ : Semiquaver 0 1 8 0
+ : Semiquaver 0 1 7 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 8 0
+ : Semiquaver 0 1 9 0
+ : Semiquaver 0 1 10 0
+ : Semiquaver 0 1 9 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 8 0
+ : Semiquaver 0 1 7 0
+ : Semiquaver 0 1 6 0
+ : Semiquaver 0 1 5 0
+ End
+Group
+ Beamed
+ : Quaver 0 1 4 0
+ : Quaver 0 1 9 0
+ : Quaver 0 1 7 0
+ : Quaver 0 1 5 0
+ End
+Group
+ Beamed
+ : Quaver 0 1 6 0
+ : Quaver 0 1 9 0
+ : Quaver 0 1 7 0
+ : Quaver 0 1 5 0
+ End
+: Dotted quaver 0 1 6 0
+Rest
+ Semiquaver rest
+: Dotted quaver 0 3 4 0 6 0 9 0
+Rest
+ Semiquaver rest
+: Dotted quaver 0 1 2 0
+Rest
+ Semiquaver rest
+Rest
+ Crotchet rest
+Rest
+ Crotchet rest
+Rest
+ Crotchet rest
+Rest
+ Crotchet rest
+Rest
+ Crotchet rest
+Group
+ Beamed
+ : Quaver 0 1 9 0
+ : Quaver 0 1 7 0
+ End
+: Dotted quaver 0 1 5 0
+Rest
+ Semiquaver rest
+Group
+ Beamed
+ : Quaver 0 1 5 0
+ : Semiquaver 0 1 6 0
+ : Semiquaver 0 1 7 0
+ End
+Group
+ Beamed
+ : Quaver 0 1 6 0
+ : Quaver 0 1 5 0
+ End
+: Quaver 0 1 5 0
+Rest
+ Semiquaver rest
+: Semiquaver 0 1 4 0
+: Dotted quaver 0 1 4 0
+Rest
+ Semiquaver rest
+Rest
+ Crotchet rest
+Rest
+ Crotchet rest
+Group
+ Beamed
+ : Quaver 0 1 9 0
+ : Quaver 0 1 7 0
+ End
+: Crotchet 0 1 5 0
+Group
+ Beamed
+ : Quaver 0 1 5 0
+ : Semiquaver 0 1 6 0
+ : Semiquaver 0 1 7 0
+ End
+Group
+ Beamed
+ : Quaver 0 1 6 0
+ : Quaver 0 1 5 0
+ End
+: Quaver 0 1 5 0
+Rest
+ Semiquaver rest
+: Semiquaver 0 1 4 0
+: Dotted quaver 0 1 4 0
+Rest
+ Semiquaver rest
+Rest
+ Crotchet rest
+Rest
+ Crotchet rest
+: Dotted quaver 0 1 9 0
+Rest
+ Semiquaver rest
+Group
+ Beamed
+ Rest
+ Semiquaver rest
+ : Semiquaver 0 1 9 0
+ : Semiquaver 0 1 7 0
+ : Semiquaver 0 1 5 0
+ End
+: Crotchet 0 1 3 0
+Group
+ Beamed
+ Rest
+ Semiquaver rest
+ : Semiquaver 0 1 3 0
+ : Semiquaver 0 1 5 0
+ : Semiquaver 0 1 3 0
+ End
+: Dotted quaver 0 1 8 0
+Rest
+ Semiquaver rest
+Group
+ Beamed
+ Rest
+ Semiquaver rest
+ : Semiquaver 0 1 8 0
+ : Semiquaver 0 1 6 0
+ : Semiquaver 0 1 4 0
+ End
+: Dotted quaver 0 1 2 0
+Rest
+ Semiquaver rest
+Group
+ Beamed
+ Rest
+ Semiquaver rest
+ : Semiquaver 0 1 9 0
+ : Semiquaver 0 1 11 0
+ : Semiquaver 0 1 9 0
+ End
+: Dotted quaver 0 1 14 0
+Rest
+ Semiquaver rest
+Group
+ Beamed
+ Rest
+ Semiquaver rest
+ : Semiquaver 0 1 14 0
+ : Semiquaver 0 1 12 0
+ : Semiquaver 0 1 10 0
+ End
+: Dotted quaver 0 1 8 0
+Rest
+ Semiquaver rest
+Group
+ Beamed
+ Rest
+ Semiquaver rest
+ : Semiquaver 0 1 8 0
+ : Semiquaver 0 1 10 0
+ : Semiquaver 0 1 8 0
+ End
+: Dotted quaver 0 1 13 0
+Rest
+ Semiquaver rest
+Group
+ Beamed
+ Rest
+ Semiquaver rest
+ : Semiquaver 0 1 13 0
+ : Semiquaver 0 1 11 0
+ : Semiquaver 0 1 9 0
+ End
+: Crotchet 0 1 7 0
+Group
+ Beamed
+ Rest
+ Semiquaver rest
+ : Semiquaver 0 1 12 0
+ : Semiquaver 0 1 9 0
+ : Semiquaver 0 1 7 0
+ End
+: Dotted crotchet 0 1 6 0
+Rest
+ Quaver rest
+: Dotted quaver 0 1 6 0
+Rest
+ Semiquaver rest
+: Dotted quaver 0 1 6 0
+Rest
+ Semiquaver rest
+: Dotted crotchet 0 1 10 0
+Rest
+ Quaver rest
+: Semiquaver 0 2 9 1 10 0
+Rest
+ Quaver rest
+Rest
+ Semiquaver rest
+: Semiquaver 0 2 9 1 10 0
+Rest
+ Quaver rest
+Rest
+ Semiquaver rest
+Group
+ Beamed
+ : Quaver 0 1 9 0
+ : Semiquaver 0 1 10 0
+ : Semiquaver 0 1 11 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 12 0
+ : Semiquaver 0 1 13 0
+ : Semiquaver 0 1 14 0
+ : Semiquaver 0 1 13 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 12 0
+ : Semiquaver 0 1 11 0
+ : Semiquaver 0 1 10 0
+ : Semiquaver 0 1 9 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 8 0
+ : Semiquaver 0 1 7 0
+ : Semiquaver 0 1 6 0
+ : Semiquaver 0 1 5 0
+ End
+: Dotted minim 0 1 6 0
+Rest
+ Quaver rest
+Rest
+ Semiquaver rest
+: Semiquaver 0 2 5 0 6 0
+: Dotted quaver 0 1 5 0
+Rest
+ Semiquaver rest
+Group
+ Beamed
+ : Semiquaver 0 1 5 0
+ : Semiquaver 0 1 2 0
+ : Semiquaver 0 1 5 0
+ : Semiquaver 0 1 7 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 9 0
+ : Semiquaver 0 1 7 0
+ : Semiquaver 0 1 5 0
+ : Semiquaver 0 1 7 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 8 0
+ : Semiquaver 0 1 6 0
+ : Semiquaver 0 1 4 0
+ : Semiquaver 0 1 6 0
+ End
+: Dotted quaver 0 1 5 0
+Rest
+ Semiquaver rest
+Group
+ Beamed
+ : Semiquaver 0 1 -2 0
+ : Semiquaver 0 1 -5 0
+ : Semiquaver 0 1 -2 0
+ : Semiquaver 0 1 0 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 2 0
+ : Semiquaver 0 1 0 0
+ : Semiquaver 0 1 -2 0
+ : Semiquaver 0 1 0 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 1 0
+ : Semiquaver 0 1 -1 0
+ : Semiquaver 0 1 -3 0
+ : Semiquaver 0 1 -1 0
+ End
+: Dotted quaver 0 1 -2 0
+Rest
+ Semiquaver rest
+: Dotted quaver 0 3 7 0 9 0 12 0
+Rest
+ Semiquaver rest
+: Dotted quaver 0 1 5 0
+End
+
+Name Left Hand
+Clef
+ Clef Name Treble
+Group
+ Beamed
+ : Quaver 0 1 -2 0
+ : Quaver 0 1 2 0
+ : Quaver 0 1 0 0
+ : Quaver 0 1 2 0
+ End
+Group
+ Beamed
+ : Quaver 0 1 -2 0
+ : Quaver 0 1 2 0
+ : Quaver 0 1 0 0
+ : Quaver 0 1 2 0
+ End
+Group
+ Beamed
+ : Quaver 0 1 -1 0
+ : Quaver 0 1 2 0
+ : Quaver 0 1 1 0
+ : Quaver 0 1 2 0
+ End
+Group
+ Beamed
+ : Quaver 0 1 -2 0
+ : Quaver 0 1 2 0
+ : Quaver 0 1 0 0
+ : Quaver 0 1 2 0
+ End
+Group
+ Beamed
+ : Quaver 0 1 -2 0
+ : Quaver 0 1 3 0
+ : Quaver 0 1 1 0
+ : Quaver 0 1 3 0
+ End
+Group
+ Beamed
+ : Quaver 0 1 -2 0
+ : Quaver 0 1 2 0
+ : Quaver 0 1 0 0
+ : Quaver 0 1 2 0
+ End
+Group
+ Beamed
+ : Quaver 0 1 -3 0
+ : Quaver 0 1 2 0
+ : Quaver 0 1 -1 0
+ : Quaver 0 1 2 0
+ End
+Group
+ Beamed
+ : Quaver 0 1 -2 0
+ : Quaver 0 1 2 0
+ : Quaver 0 1 0 0
+ : Quaver 0 1 2 0
+ End
+: Dotted quaver 0 1 1 0
+Rest
+ Semiquaver rest
+Rest
+ Crotchet rest
+Rest
+ Crotchet rest
+: Dotted quaver 0 2 1 0 5 0
+Rest
+ Semiquaver rest
+: Dotted quaver 0 2 0 0 5 0
+Rest
+ Semiquaver rest
+Rest
+ Crotchet rest
+Rest
+ Crotchet rest
+: Dotted quaver 0 2 0 0 5 0
+Rest
+ Semiquaver rest
+: Dotted quaver 0 2 -1 0 5 0
+Rest
+ Semiquaver rest
+Rest
+ Crotchet rest
+Rest
+ Crotchet rest
+: Dotted quaver 0 2 -1 0 4 0
+Rest
+ Semiquaver rest
+: Dotted quaver 0 2 -2 0 5 0
+Rest
+ Semiquaver rest
+Rest
+ Crotchet rest
+Rest
+ Crotchet rest
+: Dotted quaver 0 2 -2 0 0 0
+Rest
+ Semiquaver rest
+: Dotted minim 0 2 1 0 3 0
+Rest
+ Crotchet rest
+: Crotchet 0 1 1 0
+Rest
+ Quaver rest
+: Quaver 0 1 2 0
+: Crotchet 0 1 3 0
+Rest
+ Quaver rest
+: Quaver 0 1 1 1
+Group
+ Beamed
+ : Semiquaver 0 1 -5 0
+ : Semiquaver 0 1 -3 0
+ : Semiquaver 0 1 -1 0
+ : Semiquaver 0 1 2 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 -5 0
+ : Semiquaver 0 1 -2 0
+ : Semiquaver 0 1 0 0
+ : Semiquaver 0 1 2 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 -5 0
+ : Semiquaver 0 1 -3 0
+ : Semiquaver 0 1 -1 0
+ : Semiquaver 0 1 2 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 -5 0
+ : Semiquaver 0 1 -2 0
+ : Semiquaver 0 1 0 0
+ : Semiquaver 0 1 2 0
+ End
+: Dotted quaver 0 1 -5 0
+Rest
+ Semiquaver rest
+: Dotted quaver 0 1 2 0
+Rest
+ Semiquaver rest
+: Dotted quaver 0 1 -5 0
+Rest
+ Semiquaver rest
+Rest
+ Crotchet rest
+Rest
+ Crotchet rest
+Rest
+ Crotchet rest
+Rest
+ Crotchet rest
+Rest
+ Crotchet rest
+Group
+ Beamed
+ : Quaver 0 1 13 0
+ : Quaver 0 1 11 0
+ End
+: Dotted quaver 0 1 9 0
+Rest
+ Semiquaver rest
+Group
+ Beamed
+ : Quaver 0 1 9 0
+ : Semiquaver 0 1 10 0
+ : Semiquaver 0 1 11 0
+ End
+Group
+ Beamed
+ : Quaver 0 1 10 0
+ : Quaver 0 1 9 0
+ End
+: Quaver 0 1 9 0
+Rest
+ Semiquaver rest
+: Semiquaver 0 1 8 1
+: Dotted quaver 0 1 8 1
+Rest
+ Semiquaver rest
+Rest
+ Crotchet rest
+Rest
+ Crotchet rest
+Group
+ Beamed
+ : Quaver 0 1 13 0
+ : Quaver 0 1 11 0
+ End
+: Dotted quaver 0 1 9 0
+Rest
+ Semiquaver rest
+Group
+ Beamed
+ : Quaver 0 1 9 0
+ : Semiquaver 0 1 10 0
+ : Semiquaver 0 1 11 0
+ End
+Group
+ Beamed
+ : Quaver 0 1 10 0
+ : Quaver 0 1 9 0
+ End
+: Quaver 0 1 9 0
+Rest
+ Semiquaver rest
+: Semiquaver 0 1 8 1
+: Dotted quaver 0 1 8 1
+Rest
+ Semiquaver rest
+Rest
+ Crotchet rest
+Rest
+ Crotchet rest
+Group
+ Beamed
+ : Semiquaver 0 1 -3 0
+ : Semiquaver 0 1 -3 0
+ : Semiquaver 0 1 -1 0
+ : Semiquaver 0 1 2 0
+ End
+: Dotted quaver 0 1 4 0
+Rest
+ Semiquaver rest
+Group
+ Beamed
+ Rest
+ Semiquaver rest
+ : Semiquaver 0 1 -2 0
+ : Semiquaver 0 1 0 0
+ : Semiquaver 0 1 2 0
+ End
+: Dotted quaver 0 1 5 0
+Rest
+ Semiquaver rest
+Group
+ Beamed
+ Rest
+ Semiquaver rest
+ : Semiquaver 0 1 -4 0
+ : Semiquaver 0 1 -2 0
+ : Semiquaver 0 1 1 1
+ End
+: Dotted quaver 0 1 3 0
+Rest
+ Semiquaver rest
+Group
+ Beamed
+ Rest
+ Semiquaver rest
+ : Semiquaver 0 1 -3 0
+ : Semiquaver 0 1 -1 0
+ : Semiquaver 0 1 1 1
+ End
+: Dotted quaver 0 1 4 0
+Rest
+ Semiquaver rest
+Group
+ Beamed
+ Rest
+ Semiquaver rest
+ : Semiquaver 0 1 -5 0
+ : Semiquaver 0 1 -3 0
+ : Semiquaver 0 1 0 0
+ End
+: Dotted quaver 0 1 2 0
+Rest
+ Semiquaver rest
+Group
+ Beamed
+ Rest
+ Semiquaver rest
+ : Semiquaver 0 1 -4 0
+ : Semiquaver 0 1 -2 0
+ : Semiquaver 0 1 0 0
+ End
+: Dotted quaver 0 1 3 0
+Rest
+ Semiquaver rest
+Group
+ Beamed
+ Rest
+ Semiquaver rest
+ : Semiquaver 0 1 -6 1
+ : Semiquaver 0 1 -4 0
+ : Semiquaver 0 1 -1 0
+ End
+: Dotted quaver 0 1 1 1
+Rest
+ Semiquaver rest
+Group
+ Beamed
+ Rest
+ Semiquaver rest
+ : Semiquaver 0 1 -5 0
+ : Semiquaver 0 1 -3 0
+ : Semiquaver 0 1 -1 0
+ End
+: Dotted quaver 0 1 2 0
+Rest
+ Semiquaver rest
+Group
+ Beamed
+ : Quaver 0 2 -2 0 0 0
+ : Quaver 0 2 -2 0 0 0
+ : Quaver 0 2 -2 0 0 0
+ : Quaver 0 2 -2 0 0 0
+ End
+Group
+ Beamed
+ : Quaver 0 2 -2 0 0 0
+ : Quaver 0 2 -2 0 0 0
+ : Quaver 0 2 -2 0 0 0
+ : Quaver 0 2 -2 0 0 0
+ End
+Group
+ Beamed
+ : Quaver 0 2 -2 0 0 0
+ : Quaver 0 2 -2 0 0 0
+ : Quaver 0 2 -2 0 0 0
+ : Quaver 0 2 -2 0 0 0
+ End
+Group
+ Beamed
+ : Quaver 0 2 -2 0 0 0
+ : Quaver 0 2 -2 0 0 0
+ : Quaver 0 2 -2 0 0 0
+ : Quaver 0 2 -2 0 0 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 -1 0
+ : Semiquaver 0 1 4 0
+ : Semiquaver 0 1 2 0
+ : Semiquaver 0 1 4 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 -1 0
+ : Semiquaver 0 1 4 0
+ : Semiquaver 0 1 2 0
+ : Semiquaver 0 1 4 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 -1 0
+ : Semiquaver 0 1 4 0
+ : Semiquaver 0 1 2 0
+ : Semiquaver 0 1 4 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 -1 0
+ : Semiquaver 0 1 4 0
+ : Semiquaver 0 1 2 0
+ : Semiquaver 0 1 4 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 -1 0
+ : Semiquaver 0 1 5 0
+ : Semiquaver 0 1 1 1
+ : Semiquaver 0 1 5 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 -1 0
+ : Semiquaver 0 1 5 0
+ : Semiquaver 0 1 1 1
+ : Semiquaver 0 1 5 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 -1 0
+ : Semiquaver 0 1 5 0
+ : Semiquaver 0 1 1 1
+ : Semiquaver 0 1 5 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 -1 0
+ : Semiquaver 0 1 5 0
+ : Semiquaver 0 1 1 1
+ : Semiquaver 0 1 5 0
+ End
+: Dotted quaver 0 2 2 0 4 0
+Rest
+ Semiquaver rest
+Rest
+ Crotchet rest
+Rest
+ Crotchet rest
+: Dotted quaver 0 3 -1 0 3 0 5 0
+Rest
+ Semiquaver rest
+: Dotted quaver 0 2 2 0 4 0
+Rest
+ Semiquaver rest
+Rest
+ Crotchet rest
+Rest
+ Crotchet rest
+: Dotted quaver 0 3 -1 0 3 0 5 0
+Rest
+ Semiquaver rest
+: Dotted quaver 0 2 2 0 4 0
+Rest
+ Semiquaver rest
+: Dotted quaver 0 2 -5 0 4 0
+Rest
+ Semiquaver rest
+: Dotted quaver 0 2 -5 0 4 0
+Rest
+ Semiquaver rest
+Rest
+ Crotchet rest
+: Dotted quaver 0 2 -5 0 2 0
+Rest
+ Semiquaver rest
+Rest
+ Crotchet rest
+Rest
+ Crotchet rest
+: Dotted quaver 0 3 -1 0 3 0 5 0
+Rest
+ Semiquaver rest
+: Dotted quaver 0 2 2 0 3 1
+Rest
+ Semiquaver rest
+Rest
+ Crotchet rest
+Rest
+ Crotchet rest
+: Dotted quaver 0 3 -8 0 -4 0 -2 0
+Rest
+ Semiquaver rest
+Group
+ Beamed
+ Rest
+ Semiquaver rest
+ : Semiquaver 0 1 -5 0
+ : Semiquaver 0 1 -4 0
+ : Semiquaver 0 1 -3 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 -2 0
+ : Semiquaver 0 1 -1 0
+ : Semiquaver 0 1 0 0
+ : Semiquaver 0 1 1 1
+ End
+: Crotchet 0 1 2 0
+Rest
+ Crotchet rest
+Group
+ Beamed
+ Rest
+ Semiquaver rest
+ : Semiquaver 0 1 -4 0
+ : Semiquaver 0 1 -3 0
+ : Semiquaver 0 1 -2 1
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 -1 0
+ : Semiquaver 0 1 0 0
+ : Semiquaver 0 1 1 1
+ : Semiquaver 0 1 2 1
+ End
+: Crotchet 0 1 3 0
+Rest
+ Crotchet rest
+: Dotted quaver 0 2 -8 0 -1 0
+Rest
+ Semiquaver rest
+Rest
+ Crotchet rest
+Rest
+ Crotchet rest
+: Dotted quaver 0 3 3 0 7 0 9 0
+Rest
+ Semiquaver rest
+: Dotted quaver 0 2 6 0 8 0
+Rest
+ Semiquaver rest
+Rest
+ Crotchet rest
+Rest
+ Crotchet rest
+: Dotted quaver 0 3 -4 0 0 0 2 0
+Rest
+ Semiquaver rest
+: Dotted quaver 0 2 -1 0 1 0
+Rest
+ Semiquaver rest
+Rest
+ Crotchet rest
+Group
+ Beamed
+ Rest
+ Semiquaver rest
+ : Semiquaver 0 1 -1 0
+ : Semiquaver 0 1 1 0
+ : Semiquaver 0 1 0 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 -1 0
+ : Semiquaver 0 1 -2 0
+ : Semiquaver 0 1 -3 0
+ : Semiquaver 0 1 -4 0
+ End
+: Dotted quaver 0 1 -5 1
+Rest
+ Semiquaver rest
+Rest
+ Crotchet rest
+Group
+ Beamed
+ Rest
+ Semiquaver rest
+ : Semiquaver 0 1 -5 0
+ : Semiquaver 0 1 -3 0
+ : Semiquaver 0 1 -4 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 -5 0
+ : Semiquaver 0 1 -6 0
+ : Semiquaver 0 1 -7 0
+ : Semiquaver 0 1 -8 0
+ End
+: Dotted quaver 0 1 -9 0
+Rest
+ Semiquaver rest
+Rest
+ Crotchet rest
+Group
+ Beamed
+ Rest
+ Semiquaver rest
+ : Semiquaver 0 1 -1 0
+ : Semiquaver 0 1 3 0
+ : Semiquaver 0 1 2 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 1 0
+ : Semiquaver 0 1 0 0
+ : Semiquaver 0 1 -1 0
+ : Semiquaver 0 1 -2 0
+ End
+: Dotted quaver 0 1 -3 0
+Rest
+ Semiquaver rest
+Rest
+ Crotchet rest
+Group
+ Beamed
+ Rest
+ Semiquaver rest
+ : Semiquaver 0 1 5 0
+ : Semiquaver 0 1 9 0
+ : Semiquaver 0 1 8 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 7 0
+ : Semiquaver 0 1 6 0
+ : Semiquaver 0 1 5 0
+ : Semiquaver 0 1 4 0
+ End
+: Dotted quaver 0 1 3 0
+Rest
+ Semiquaver rest
+Rest
+ Crotchet rest
+Group
+ Beamed
+ Rest
+ Semiquaver rest
+ : Semiquaver 0 1 4 0
+ : Semiquaver 0 1 8 0
+ : Semiquaver 0 1 7 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 6 0
+ : Semiquaver 0 1 5 0
+ : Semiquaver 0 1 4 0
+ : Semiquaver 0 1 3 0
+ End
+: Dotted quaver 0 1 2 1
+Rest
+ Semiquaver rest
+Rest
+ Crotchet rest
+Group
+ Beamed
+ Rest
+ Semiquaver rest
+ : Semiquaver 0 1 3 0
+ : Semiquaver 0 1 5 0
+ : Semiquaver 0 1 4 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 3 0
+ : Semiquaver 0 1 2 0
+ : Semiquaver 0 1 1 0
+ : Semiquaver 0 1 0 0
+ End
+: Dotted crotchet 0 1 -1 0
+Rest
+ Quaver rest
+: Dotted crotchet 0 3 -2 0 2 0 3 1
+Rest
+ Quaver rest
+Group
+ Beamed
+ : Quaver 0 1 1 0
+ : Quaver 0 1 5 0
+ : Quaver 0 1 3 0
+ : Quaver 0 1 5 0
+ End
+Group
+ Beamed
+ : Quaver 0 1 1 0
+ : Quaver 0 1 5 0
+ : Quaver 0 1 3 0
+ : Quaver 0 1 5 0
+ End
+Group
+ Beamed
+ : Quaver 0 1 2 0
+ : Quaver 0 1 5 0
+ : Quaver 0 1 3 1
+ : Quaver 0 1 5 0
+ End
+Group
+ Beamed
+ : Quaver 0 1 1 0
+ : Quaver 0 1 5 0
+ : Quaver 0 1 3 0
+ : Quaver 0 1 5 0
+ End
+Group
+ Beamed
+ : Quaver 0 1 1 0
+ : Quaver 0 1 6 0
+ : Quaver 0 1 3 1
+ : Quaver 0 1 6 0
+ End
+Group
+ Beamed
+ : Quaver 0 1 1 0
+ : Quaver 0 1 5 0
+ : Quaver 0 1 3 0
+ : Quaver 0 1 5 0
+ End
+Group
+ Beamed
+ : Quaver 0 1 0 0
+ : Quaver 0 1 5 0
+ : Quaver 0 1 2 0
+ : Quaver 0 1 5 0
+ End
+Group
+ Beamed
+ : Quaver 0 1 1 0
+ : Quaver 0 1 5 0
+ : Quaver 0 1 3 0
+ : Quaver 0 1 5 0
+ End
+: Dotted quaver 0 1 3 1
+Rest
+ Semiquaver rest
+Rest
+ Crotchet rest
+Rest
+ Crotchet rest
+: Dotted quaver 0 2 1 0 3 1
+Rest
+ Semiquaver rest
+: Dotted quaver 0 2 3 0 8 0
+Rest
+ Semiquaver rest
+Rest
+ Crotchet rest
+Rest
+ Crotchet rest
+: Dotted quaver 0 2 3 0 8 0
+Rest
+ Semiquaver rest
+: Dotted quaver 0 2 2 0 8 0
+Rest
+ Semiquaver rest
+Rest
+ Crotchet rest
+Rest
+ Crotchet rest
+: Dotted quaver 0 2 2 0 7 0
+Rest
+ Semiquaver rest
+: Dotted quaver 0 2 1 0 8 0
+Rest
+ Semiquaver rest
+Rest
+ Crotchet rest
+Rest
+ Crotchet rest
+Rest
+ Crotchet rest
+Group
+ Beamed
+ : Quaver 0 1 1 0
+ : Semiquaver 0 1 2 0
+ : Semiquaver 0 1 3 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 4 0
+ : Semiquaver 0 1 5 0
+ : Semiquaver 0 1 6 0
+ : Semiquaver 0 1 7 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 8 0
+ : Semiquaver 0 1 7 0
+ : Semiquaver 0 1 6 0
+ : Semiquaver 0 1 5 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 4 0
+ : Semiquaver 0 1 3 0
+ : Semiquaver 0 1 2 0
+ : Semiquaver 0 1 1 0
+ End
+Group
+ Beamed
+ : Quaver 0 1 0 0
+ : Semiquaver 0 1 1 0
+ : Semiquaver 0 1 2 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 3 0
+ : Semiquaver 0 1 4 0
+ : Semiquaver 0 1 5 0
+ : Semiquaver 0 1 6 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 7 0
+ : Semiquaver 0 1 6 0
+ : Semiquaver 0 1 5 0
+ : Semiquaver 0 1 4 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 3 0
+ : Semiquaver 0 1 2 0
+ : Semiquaver 0 1 1 0
+ : Semiquaver 0 1 0 0
+ End
+Group
+ Beamed
+ : Quaver 0 1 -1 0
+ : Semiquaver 0 1 0 0
+ : Semiquaver 0 1 1 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 2 0
+ : Semiquaver 0 1 3 0
+ : Semiquaver 0 1 4 0
+ : Semiquaver 0 1 5 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 6 0
+ : Semiquaver 0 1 5 0
+ : Semiquaver 0 1 4 0
+ : Semiquaver 0 1 3 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 2 0
+ : Semiquaver 0 1 1 0
+ : Semiquaver 0 1 0 0
+ : Semiquaver 0 1 -1 0
+ End
+Group
+ Beamed
+ : Quaver 0 1 -2 0
+ : Semiquaver 0 1 -1 0
+ : Semiquaver 0 1 0 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 1 0
+ : Semiquaver 0 1 2 0
+ : Semiquaver 0 1 3 0
+ : Semiquaver 0 1 4 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 5 0
+ : Semiquaver 0 1 4 0
+ : Semiquaver 0 1 3 0
+ : Semiquaver 0 1 2 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 1 0
+ : Semiquaver 0 1 0 0
+ : Semiquaver 0 1 -1 0
+ : Semiquaver 0 1 -2 0
+ End
+: Semibreve 0 2 1 0 3 0
+: Crotchet 0 1 1 0
+Rest
+ Quaver rest
+: Quaver 0 1 2 0
+: Crotchet 0 1 3 0
+Rest
+ Quaver rest
+: Quaver 0 1 1 1
+Group
+ Beamed
+ : Semiquaver 0 1 -5 0
+ : Semiquaver 0 1 -3 0
+ : Semiquaver 0 1 -1 0
+ : Semiquaver 0 1 2 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 -5 0
+ : Semiquaver 0 1 -2 0
+ : Semiquaver 0 1 0 0
+ : Semiquaver 0 1 2 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 -5 0
+ : Semiquaver 0 1 -3 0
+ : Semiquaver 0 1 -1 0
+ : Semiquaver 0 1 2 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 -5 0
+ : Semiquaver 0 1 -2 0
+ : Semiquaver 0 1 0 0
+ : Semiquaver 0 1 2 0
+ End
+: Dotted quaver 0 1 -5 0
+Rest
+ Semiquaver rest
+: Dotted quaver 0 1 2 0
+Rest
+ Semiquaver rest
+: Dotted quaver 0 1 -5 0
+Rest
+ Semiquaver rest
+Rest
+ Crotchet rest
+Group
+ Beamed
+ : Semiquaver 0 1 1 1
+ : Semiquaver 0 1 2 0
+ : Semiquaver 0 1 1 1
+ : Semiquaver 0 1 2 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 1 1
+ : Semiquaver 0 1 2 0
+ : Semiquaver 0 1 1 1
+ : Semiquaver 0 1 2 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 1 0
+ : Semiquaver 0 1 2 0
+ : Semiquaver 0 1 1 0
+ : Semiquaver 0 1 2 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 1 0
+ : Semiquaver 0 1 2 0
+ : Semiquaver 0 1 1 0
+ : Semiquaver 0 1 2 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 0 0
+ : Semiquaver 0 1 2 0
+ : Semiquaver 0 1 0 0
+ : Semiquaver 0 1 2 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 0 0
+ : Semiquaver 0 1 2 0
+ : Semiquaver 0 1 0 0
+ : Semiquaver 0 1 2 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 0 0
+ : Semiquaver 0 1 2 0
+ : Semiquaver 0 1 0 0
+ : Semiquaver 0 1 2 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 0 0
+ : Semiquaver 0 1 2 0
+ : Semiquaver 0 1 0 0
+ : Semiquaver 0 1 2 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 1 0
+ : Semiquaver 0 1 2 0
+ : Semiquaver 0 1 0 0
+ : Semiquaver 0 1 2 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 -1 0
+ : Semiquaver 0 1 2 0
+ : Semiquaver 0 1 0 0
+ : Semiquaver 0 1 2 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 1 0
+ : Semiquaver 0 1 2 0
+ : Semiquaver 0 1 0 0
+ : Semiquaver 0 1 2 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 1 0
+ : Semiquaver 0 1 2 0
+ : Semiquaver 0 1 -1 0
+ : Semiquaver 0 1 2 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 0 0
+ : Semiquaver 0 1 2 0
+ : Semiquaver 0 1 0 0
+ : Semiquaver 0 1 2 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 0 0
+ : Semiquaver 0 1 2 0
+ : Semiquaver 0 1 0 0
+ : Semiquaver 0 1 2 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 0 0
+ : Semiquaver 0 1 2 0
+ : Semiquaver 0 1 0 0
+ : Semiquaver 0 1 2 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 0 0
+ : Semiquaver 0 1 2 0
+ : Semiquaver 0 1 0 0
+ : Semiquaver 0 1 2 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 0 0
+ : Semiquaver 0 1 2 0
+ : Semiquaver 0 1 0 0
+ : Semiquaver 0 1 2 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 -1 0
+ : Semiquaver 0 1 2 0
+ : Semiquaver 0 1 0 0
+ : Semiquaver 0 1 2 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 1 0
+ : Semiquaver 0 1 2 0
+ : Semiquaver 0 1 0 0
+ : Semiquaver 0 1 2 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 1 0
+ : Semiquaver 0 1 2 0
+ : Semiquaver 0 1 -1 0
+ : Semiquaver 0 1 2 0
+ End
+Group
+ Beamed
+ Rest
+ Semiquaver rest
+ : Semiquaver 0 1 -7 0
+ : Semiquaver 0 1 -5 0
+ : Semiquaver 0 1 -2 0
+ End
+: Dotted quaver 0 1 0 0
+Rest
+ Semiquaver rest
+Group
+ Beamed
+ Rest
+ Semiquaver rest
+ : Semiquaver 0 1 -6 0
+ : Semiquaver 0 1 -4 0
+ : Semiquaver 0 1 -2 0
+ End
+: Dotted quaver 0 1 1 0
+Rest
+ Semiquaver rest
+Group
+ Beamed
+ Rest
+ Semiquaver rest
+ : Semiquaver 0 1 -8 0
+ : Semiquaver 0 1 -6 0
+ : Semiquaver 0 1 -3 0
+ End
+: Dotted quaver 0 1 -1 0
+Rest
+ Semiquaver rest
+Group
+ Beamed
+ Rest
+ Semiquaver rest
+ : Semiquaver 0 1 -7 0
+ : Semiquaver 0 1 -5 0
+ : Semiquaver 0 1 -3 0
+ End
+: Dotted quaver 0 1 0 0
+Rest
+ Semiquaver rest
+Group
+ Beamed
+ Rest
+ Semiquaver rest
+ : Semiquaver 0 1 5 0
+ : Semiquaver 0 1 7 0
+ : Semiquaver 0 1 10 0
+ End
+: Dotted quaver 0 1 12 0
+Rest
+ Semiquaver rest
+Group
+ Beamed
+ Rest
+ Semiquaver rest
+ : Semiquaver 0 1 6 0
+ : Semiquaver 0 1 8 0
+ : Semiquaver 0 1 10 0
+ End
+: Dotted quaver 0 1 13 0
+Rest
+ Semiquaver rest
+Group
+ Beamed
+ Rest
+ Semiquaver rest
+ : Semiquaver 0 1 4 0
+ : Semiquaver 0 1 6 0
+ : Semiquaver 0 1 9 0
+ End
+: Dotted quaver 0 1 11 0
+Rest
+ Semiquaver rest
+Group
+ Beamed
+ Rest
+ Semiquaver rest
+ : Semiquaver 0 1 5 0
+ : Semiquaver 0 1 7 0
+ : Semiquaver 0 1 9 0
+ End
+: Dotted quaver 0 1 14 0
+Rest
+ Semiquaver rest
+Group
+ Beamed
+ Rest
+ Quaver rest
+ : Quaver 0 2 1 0 3 0
+ : Quaver 0 2 1 0 3 0
+ : Quaver 0 2 1 0 3 0
+ End
+Group
+ Beamed
+ : Quaver 0 2 1 0 3 0
+ : Quaver 0 2 1 0 3 0
+ : Quaver 0 2 1 0 3 0
+ : Quaver 0 2 1 0 3 0
+ End
+Group
+ Beamed
+ Rest
+ Quaver rest
+ : Quaver 0 3 1 0 5 0 6 1
+ : Quaver 0 3 1 0 5 0 6 1
+ : Quaver 0 3 1 0 5 0 6 1
+ End
+Group
+ Beamed
+ : Quaver 0 3 1 0 5 0 6 1
+ : Quaver 0 3 1 0 5 0 6 1
+ : Quaver 0 3 1 0 5 0 6 1
+ : Quaver 0 3 1 0 5 0 6 1
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 2 0
+ : Semiquaver 0 1 7 0
+ : Semiquaver 0 1 5 0
+ : Semiquaver 0 1 7 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 2 0
+ : Semiquaver 0 1 7 0
+ : Semiquaver 0 1 5 0
+ : Semiquaver 0 1 7 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 2 0
+ : Semiquaver 0 1 7 0
+ : Semiquaver 0 1 5 0
+ : Semiquaver 0 1 7 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 2 0
+ : Semiquaver 0 1 7 0
+ : Semiquaver 0 1 5 0
+ : Semiquaver 0 1 7 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 2 0
+ : Semiquaver 0 1 8 0
+ : Semiquaver 0 1 4 0
+ : Semiquaver 0 1 8 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 2 0
+ : Semiquaver 0 1 8 0
+ : Semiquaver 0 1 4 0
+ : Semiquaver 0 1 8 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 2 0
+ : Semiquaver 0 1 8 0
+ : Semiquaver 0 1 4 0
+ : Semiquaver 0 1 8 0
+ End
+Group
+ Beamed
+ : Semiquaver 0 1 2 0
+ : Semiquaver 0 1 8 0
+ : Semiquaver 0 1 4 0
+ : Semiquaver 0 1 8 0
+ End
+: Dotted quaver 0 2 -2 0 0 0
+Rest
+ Semiquaver rest
+Rest
+ Crotchet rest
+Rest
+ Crotchet rest
+: Dotted quaver 0 3 2 0 6 0 8 0
+Rest
+ Semiquaver rest
+: Dotted quaver 0 2 5 0 7 0
+Rest
+ Semiquaver rest
+Rest
+ Crotchet rest
+Rest
+ Crotchet rest
+: Dotted quaver 0 3 2 0 6 0 8 0
+Rest
+ Semiquaver rest
+: Dotted quaver 0 2 -2 0 0 0
+Rest
+ Semiquaver rest
+: Dotted quaver 0 1 5 0
+Rest
+ Semiquaver rest
+: Dotted quaver 0 2 -9 0 -2 0
+End
+
+Bar 0 0 time 4 4
+Bar 1 0 time 4 4
+Stave 0 tags 1 1 connected 0 program 0
+Stave 1 tags 1 1 connected 0 program 0
+
+End
diff --git a/data/examples/stormy-riders.rg b/data/examples/stormy-riders.rg
new file mode 100644
index 0000000..5bde590
--- /dev/null
+++ b/data/examples/stormy-riders.rg
Binary files differ
diff --git a/data/examples/test_tuplets.rg b/data/examples/test_tuplets.rg
new file mode 100644
index 0000000..e4ddc17
--- /dev/null
+++ b/data/examples/test_tuplets.rg
Binary files differ
diff --git a/data/examples/the-rose-garden.rg b/data/examples/the-rose-garden.rg
new file mode 100644
index 0000000..d9b5359
--- /dev/null
+++ b/data/examples/the-rose-garden.rg
Binary files differ
diff --git a/data/examples/vivaldi-cs3mv2.rg b/data/examples/vivaldi-cs3mv2.rg
new file mode 100644
index 0000000..a5c14c2
--- /dev/null
+++ b/data/examples/vivaldi-cs3mv2.rg
Binary files differ
diff --git a/data/examples/vivaldi_op44_11_1.rg b/data/examples/vivaldi_op44_11_1.rg
new file mode 100644
index 0000000..1186b2c
--- /dev/null
+++ b/data/examples/vivaldi_op44_11_1.rg
Binary files differ
diff --git a/data/fonts/LilyPond-feta-design20.pfa b/data/fonts/LilyPond-feta-design20.pfa
new file mode 100644
index 0000000..b50a74e
--- /dev/null
+++ b/data/fonts/LilyPond-feta-design20.pfa
@@ -0,0 +1,1277 @@
+%!PS-AdobeFont-1.0: GNU-LilyPond-feta-20 001.001
+%%Title: GNU-LilyPond-feta-20
+%%CreationDate: Tue Nov 25 18:38:53 2003
+%%Creator: Chris Cannam
+%%DocumentSuppliedResources: font GNU-LilyPond-feta-20
+% Generated from MetaFont bitmap by mftrace 1.0.19, http://www.cs.uu.nl/
+% Generated by PfaEdit 1.0 (http://pfaedit.sf.net/)
+%%EndComments
+FontDirectory/GNU-LilyPond-feta-20 known{/GNU-LilyPond-feta-20 findfont dup/UniqueID known{dup
+/UniqueID get 4208404 eq exch/FontType get 1 eq and}{pop false}ifelse
+{save true}{false}ifelse}{false}ifelse
+11 dict begin
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0 ]readonly def
+/FontName /GNU-LilyPond-feta-20 def
+/FontBBox [-518 -1323 800 1250 ]readonly def
+/UniqueID 4208404 def
+/PaintType 0 def
+/FontInfo 9 dict dup begin
+ /version (001.001) readonly def
+ /Notice (Generated from MetaFont bitmap by mftrace 1.0.19, http://www.cs.uu.nl/~hanwen/mftrace/ ) readonly def
+ /FullName (GNU LilyPond feta 20) readonly def
+ /FamilyName (LilyPond-feta-rosegarden) readonly def
+ /Weight (20) readonly def
+ /ItalicAngle 0 def
+ /isFixedPitch false def
+ /UnderlinePosition -100 def
+ /UnderlineThickness 50 def
+end readonly def
+/Encoding 256 array
+ 0 1 255 { 1 index exch /.notdef put} for
+dup 33/wholerest put
+dup 34/halfrest put
+dup 35/outsidewholerest put
+dup 36/outsidehalfrest put
+dup 37/maximarest put
+dup 38/longarest put
+dup 39/breverest put
+dup 40/quartrest put
+dup 41/clasquartrest put
+dup 42/eighthrest put
+dup 43/sixteenthrest put
+dup 44/thirtysecondrest put
+dup 45/sixtyfourthrest put
+dup 46/hundredtwentyeighthrest put
+dup 47/sharp put
+dup 48/semisharp put
+dup 49/threequartersharp put
+dup 50/natural put
+dup 51/flat put
+dup 52/semiflat put
+dup 53/flatflat put
+dup 54/threeqflat put
+dup 55/sharpsharp put
+dup 56/rightparen put
+dup 57/leftparen put
+dup 58/dot put
+dup 59/brevishead put
+dup 60/wholehead put
+dup 61/halfhead put
+dup 62/quarthead put
+dup 63/wholediamondhead put
+dup 64/halfdiamondhead put
+dup 65/diamondhead put
+dup 66/wholetrianglehead put
+dup 67/halftrianglehead put
+dup 68/trianglehead put
+dup 69/wholeslashhead put
+dup 70/halfslashhead put
+dup 71/quartslashhead put
+dup 72/wholecrossedhead put
+dup 73/halfcrossedhead put
+dup 74/crossedhead put
+dup 75/xcircledhead put
+dup 76/ufermata put
+dup 77/dfermata put
+dup 78/ushortfermata put
+dup 79/dshortfermata put
+dup 80/ulongfermata put
+dup 81/dlongfermata put
+dup 82/uverylongfermata put
+dup 83/dverylongfermata put
+dup 84/thumb put
+dup 85/sforzatoaccent put
+dup 86/staccato put
+dup 87/ustaccatissimo put
+dup 88/dstaccatissimo put
+dup 89/tenuto put
+dup 90/uportato put
+dup 91/dportato put
+dup 92/umarcato put
+dup 93/dmarcato put
+dup 94/ouvert put
+dup 95/plusstop put
+dup 96/upbow put
+dup 97/downbow put
+dup 98/reverseturn put
+dup 99/turn put
+dup 100/trill put
+dup 101/upedalheel put
+dup 102/dpedalheel put
+dup 103/upedaltoe put
+dup 104/dpedaltoe put
+dup 105/flageolet put
+dup 106/segno put
+dup 107/coda put
+dup 108/varcoda put
+dup 109/rcomma put
+dup 110/lcomma put
+dup 111/rvarcomma put
+dup 112/lvarcomma put
+dup 113/arpeggio put
+dup 114/trillelement put
+dup 115/arpeggioarrowdown put
+dup 116/arpeggioarrowup put
+dup 117/trilelement put
+dup 118/prall put
+dup 119/mordent put
+dup 120/prallprall put
+dup 121/prallmordent put
+dup 122/upprall put
+dup 123/downprall put
+dup 124/upmordent put
+dup 125/downmordent put
+dup 126/lineprall put
+dup 127/pralldown put
+dup 128/prallup put
+dup 129/caesura put
+dup 130/eighthflag put
+dup 131/sixteenthflag put
+dup 132/thirtysecondflag put
+dup 133/sixtyfourthflag put
+dup 134/deighthflag put
+dup 135/gracedash put
+dup 136/dgracedash put
+dup 137/dsixteenthflag put
+dup 138/dthirtysecondflag put
+dup 139/dsixtyfourthflag put
+dup 140/altoclef put
+dup 141/caltoclef put
+dup 142/bassclef put
+dup 143/cbassclef put
+dup 144/trebleclef put
+dup 145/ctrebleclef put
+dup 146/percussionclef put
+dup 147/cpercussionclef put
+dup 148/tabclef put
+dup 149/ctabclef put
+dup 150/fourfourmeter put
+dup 151/allabreve put
+dup 152/pedalasterisk put
+dup 153/pedaldash put
+dup 154/pedaldot put
+dup 155/pedalP put
+dup 156/pedald put
+dup 157/pedale put
+dup 158/pedalPed put
+dup 159/accDiscant put
+dup 160/accDot put
+dup 161/accFreebase put
+dup 162/accStdbase put
+dup 163/accBayanbase put
+dup 164/accSB put
+dup 165/accBB put
+dup 166/accOldEE put
+dup 167/accOldEES put
+dup 168/wholedohead put
+dup 169/halfdohead put
+dup 170/dohead put
+dup 171/wholerehead put
+dup 172/halfrehead put
+dup 173/rehead put
+dup 174/wholemehead put
+dup 175/halfmehead put
+dup 176/mehead put
+dup 177/wholefahead put
+dup 178/halffauhead put
+dup 179/fauhead put
+dup 180/halffadhead put
+dup 181/fadhead put
+dup 182/wholelahead put
+dup 183/halflahead put
+dup 184/lahead put
+dup 185/wholetehead put
+dup 186/halftehead put
+dup 187/tehead put
+readonly def
+currentdict end
+currentfile eexec
+743F8413F3636CA85A9FFEFB50B4BB27302A5955DC23E0F3397300C8FCA519E56C902CB3
+B617F2A7538B6DC265A7CF20D53EB36E373340044ED3C3212B846132E1960981D2006CCD
+E888FD9671CDD7ED1352864A4B63C0967DB2112FA1C9858565C8FBD0DDD08B57B7FCEB3D
+24B86E4B8F343E1D177E9F46BDF43B991761555A2BD0087D171A8D4E0704D7976EC07F01
+20F5004A55851E3D7F1B101CCDDC3F8F02070217787E5D3D718929D6E6B9F17D30A17EB6
+ACE1F85BE11BA385884D9D001BF3FF9CCE9EA1F0B0ADC25AED55D150604DCDEA73C8DE1E
+7B336426F05E0481E3D7D3246143080CC574335B1A6E9734CC1CEAB3BF4272CE8C244325
+EB6CBD67E20D98D3951F2271CD1D19EAE9FF0C04B2C5F87F85C9AD7FE0E65360DA30957F
+51A372DFD5C14FA4DD33780582DAE96BE3AC2C9075F6F0393EF540A1EB9E8D2D64FD9579
+06D9B96330464549A2153358ABED94E16E5C6C7C4E192C5F2E874C4ACEB6C162FB7AA0E6
+4FC0AA67F04DEE195D7A40A70619CE5A788D7302218D659BB3FC2B77AAD4FB24CCB6EE82
+FD17A5C5097B5483E1D72198411D032A57105D3593E8ECB2603EF455C22ED52C5992D999
+7F585E086E8D056D7AF59ABED2C1AE94131151E3283BD34DDCDF28BE734AE139246E2ACC
+9DB6B193E75C7FB9C0BF7D966C3F83AF0F5FC35C2906F5248AEE0514034447C21813C37F
+42CA0E5962025FACC0E6CC1A1CE528DAE7925E7677EF603ABF76A4B0F46708CC5A416107
+F3575562D2355C36CB9472A53B776CE1448A661BF1544B921DA9BA5B70C0396CAFD4B67C
+B6E46F14003B3DAAD576755278701490C33A65E052E559ACBFC4871C03367E9CBA629947
+B9E6DFCF4CA060DE84E31E4FF691B32F5FD94CBF960E3D591B69B6B94E5DA00DD463076C
+4B3B0D67CBFAF34AE5BB86547A065267706A137B8A2CD45F505957EF791B5026452FF158
+517C252D44FC57335890CDE78A0FBCE08B50C2F1D873D5E6F388AFA7298E64E51C98A75A
+AB8E9C588A71E35C9B816EB7182886AE51823D58D3E48F4932996D9EC0CEDC1E159C2228
+DD52F4FF0FC3FB6D8DB28133E1D502B722EAE4FFC23E64903462267E94E1CB962C4EA638
+33ED390A0A2F12716F77F80F28C69E292233A41796D2615EF28E004C05A5883A13DEEA92
+EE656C3A245F4CB3ADCE74CFEC7D427C4C3A8073D4739552F6ACD7105626C6CF26B9FD61
+1963AD2AC7E323845BE488787AEEB8C12699F46B34FDD9FC2EB0E94C9785E07652E16B5D
+53478F33931870A8E45DA6F10C5426ED0CE1AF2817C059D9245102E1DE7A0CF1100C9E03
+8B30CBAA3B55869F3A7294D69CEB202AF53BAFAD24CB2154FD8551577E4C15F556B2F3E1
+891FCEB8DC5BB2FB0657DF849AB056FF6DE28C010471644418E9A9C0D5D3B7B662934D8E
+708791A5C6B88B2566F8F8CF48AFEE7A11028C60ADEE383D97814299BF6D5FC66D58834B
+F7827DDDEB29C1F26CFDB671A1722BA40C25306725E366EA7DD50A4600D1D2604BD79A04
+1D9ED90C8468FAB3A79A75D527A71E0BFAFB6CD10F77CFEE168757E9F19EF6539F295217
+7D2B005EB0C862620F653704D661ED76D47FD371E6183C68A2F31ABCEC04076DFFE68F52
+C49FC46CEB4289CB093A8BDB713ABD6313967A56A66F39E89F59EE2B16C04DC36E8B8CEA
+218C59D4BFB565F808EFFD2CBFDE6220D5286954CDB4F223A6D6293290991441EDE7F3D8
+BCC03B6346A51C1FA9CE2EFFE557287C98EC1C30F785BCFB5F020F2FAFF10B6A424E66CF
+ED5DBCA95F0C1EF34D9599F20AE3D07C03B7A56A925F45BC0336EF35702C45E3FABF60AF
+B2DE5D2AFB5D15CF4057934BE4C532FCFFC7B70093356A9BD6EF3C55D06E908D334ED541
+55B785D3168E2BB0DA9311C0A72173E5EC58C11795C412FFC08E42C22637B29AF2B3AD5F
+0397CF7390C3FCB2C2A0B7DCDDD34E068B0D20A590AD43C1C8DE7B76F06038E4094304AD
+4CBDC4C50B9F307823D4AA25BBE701CB8F7FD49D4F6EFA343AA9BBFDA9D5061CE9CB23C2
+1C6D852585426F6F3E44FDDE3489D4857290DC0EB91E8E76C6EEA6EBF1C47867446D8499
+6894A22A3305B6E6D756F110A594B3348FE26FC7E7470531EED12FF71C862AA9136B0CDC
+B92F7CA5C235D99567E7B67690C6C6AB77CA70A6C6769F93090BA94013209857C6CE20CA
+4C36FB122F46A262341B5F70DE633461186C9E9AAEC0CB94B2BA21D68DC94B7B0DF4FAE3
+11D4EBD60D95A3BC9167A8744AE7CECC24C37BA75B92B5490181CB7F5CC1A0CBB02BD01C
+DA6E151C14B512DCE9F202B62BC9B30E47EA60146E418D9F663C61DF5AD66B8A2CE7F537
+44637067A702CA64A80D0F763C87AAA80E99CFACCDDC1C47E24C411F90EB38CA0B54B21A
+8DEC3B2A784716C01D9A744BC17514BF1C2D77F81D2C31294E57F2F80FA5BC75899F8174
+1CDC736388614FCE7285EBCEA4B558E19CE1D7BC9C3713301B3F502FD337107428A32721
+98EB716CAB438A309F177CA3908C48B33D4D03DF950A27AE0EB4B62353BEA91E8A072833
+AEF570BBA1DA3502C3A88D1E41C7F7B6A4518FAAFE129D8D080FE00A375ED738D5A0A8C1
+5D91091006DF628B730C6DC4B94535036683167C91D1C0552A501FC395B2E91A2E53A55B
+6A6130978099AFBB88AF17213BA7AC9F84AD43BD0C1F04858426CDF3E4C2986377B282B7
+8DA2B76EC4A17F8832B9217BC409AB447336F4C1B541CA02E2795F18F54EC9EAB2F3B7B0
+D4C68C4BE449BF5C08466C060AAFD6B4E6B54B3098D48A2C39F136578DEC87091ECB1A37
+05EA7CCFFEB1F47E6F80D31F5F59D175928A7E18D70342968965147E5EFCB361657F35AB
+DEADF126DBD625F3770A95977FE340ABB525DE439658745CBF9BF4C6F4C1D8B2D94A3B2D
+17D938403BC40804BE59B5ECB30423521478694078E5EFE4D72A9B780E090DA5FC015E69
+412AFF63126A17163C43BBA2FB26FBA0925C0ED30B0974767575C63B033FD7B71CE9504D
+5B632394D32DE86BF22171F18B032A5769FB5176F2F8760289283DE716C4C0332D3A1C8F
+DCE18667DA015399A8DC7A4B3EACD4E92EE3B6C018860343D8FDD54477E82D44B73EF971
+BA07718635B5E5E8FA7080AB0149C707865F8DE458EC3F57E7F432884D3E89D01F67BB81
+5379A38C31968B8458B7D49CD120C04B7A9E008CD3F7EF7B8ADE471EB131D88DB5D3A673
+600F4E5F5D1FEA8B480292563C72651D9EADF037C7FEEA5181C80288BA10F421BAF765F0
+8F8537DAC1A9B8671013C4E8283BA83C057CB136B9DE60615AFF79A9268F17B2898A76EB
+66BFFA9889FFEE6387E87AD87A0A1811AA2B708001FC8791D9948317D60F77BE5BEA1F3B
+BF4FADCDD15543F976D6B8D3A406EFD950889283F83982863CF52A1A92B20DC678F910F3
+5FA2A8875B91D1C3A45ADB3157F99DE7ECD63012E73A52DE379EC2271803F2BBAF8F3AB0
+DFCE8011634D93A3C66BA23216D241D91AEFD11670604A8A32FAA3EC00BB365B90FA1C1E
+F1F80B0377B255ED7247F28B0B823FC5768DDD47D1DD7758F4A61653F9B3F75E88B6C74C
+5180CC03B54014464F0D7BA295AFF37B69715923BBB7795C5CD7DFC03823D1A6AC834F38
+EB3A5A3A61F7478A49F9B12624073762BEA35AA909088E3F89524949ED2282CF05F40AB6
+181C359083985AC4BE78C91E3486742DE5854752CEFAF69675E0D203A60A816B23337E94
+D98A66164A2EC73417B67D37617DADC7EA7A11BECF9F7F326138E13F8145B8FF58707033
+3CC29AF0FF7CAA8C21B7882BE770F9F6848E8F85CB238A1D8DE8A8CC650852266020804D
+9D06F6D17AC8A04811E487CF11899F7CAE6CF5B82292348D6DC8AD5C1F8F3500CA401F2A
+B48D080C3D01FB8EF23B80D5BFD9D963434890D760BB4194485A712FC8E80D8609C64AC4
+A9E5067CE0E5FCAC022E552CF323F476EDDA0A848C18229D48A7ECC12A6D7CDE5F310728
+2D1F427B6829EC3284D0CC51AD2B71D8B166605730FB441DB5C273CCF8A529B7FF181AE6
+91CC030765A44BC38605A6F393540B83B45D684359A42951CF9CC92F325422216E246E90
+67CDC824AD8FBDD8AB2DC88D12BD3DFD096D42D4064933284BC3191182B3E0E4245890FF
+790C21FCA80029556889CB96CBABF4AF2741747FC3C70C1904AA06452D7357B774AA1F50
+FEFF85BF1290DECF9D9FB632F3093A8DD05BF98081D186CCEB6E0C427A88887E7EA653B0
+05DA96D4AE05B864998EE427260A64DFF6D510BD7ABEC2AF2FBF4A0E8019BB2114D3928E
+5AB84E1E5AAAA6A16E5053E1122A329E9D8AA9D7F6890472EAD0311779AB25CDC3856190
+29603653B3BCCB283711DDFAFD3D95C5360CE263C082C0945BB5E6D252CCF547765BD32D
+C2944943E8D1300688AE43BE73F5A6C6774517733DD2ECA406E492370265B3EDBF891505
+ABFABC35CD0EC252ABB617AB2CA0AB19FEB611193BCA97C63EF50E347978E07CD9CF1383
+4CD0308FA72AA585401109D6C502638F392398469DDF538B401FDC739457482B83B879D1
+97C578E568D00C58A1CB26CB5DDB5E21872773CD3EDF1AE14F68821821DF84E6505C6C40
+6AC08EBC985ED7008328071BC7426F64C3CF0E35F712906D6CAB524A38EFF1D65B991280
+F15E9E2F0180288556D584B54F26486C49A10113267660EE507C0B85294CD04B55B6F4EA
+4D8763ED0DEDB4CC400F52BC1696F7B5FDB605388A7AFCD7D73790CB15A13FC498EAE4A3
+2DC1712C3F03795FFBF9E6925F569C05DF071B86B2ADB9F8727665A61DC4A212D53A9756
+3979F09AD79148A5BF6A41740A07BCB4A1A774A84868721241BC7628A28587A5A9F02FE7
+A067B75C618477B76EDB63B91B91E78BFACDE3237833DAFAF9C92E42AD8D1F8858C29232
+4C8E4E8FF5992E07D69634BAB5E9415AB0BCD60A8DF3C1B70868B9E0EB7DEFAB3AB5D6C8
+238B438432A63193C4AEC6F469EC8F439C4D54738FCD7E1FAC753EDABCCA12DA3403147B
+F8E409AB5902D805B284BB643F9FB5C6E9E26D22CF3BE651A48D2518D6291B6BEF7060AE
+3A843DB9279C8FD90C629ABDA7B3D3C0280994F88C631D2BB7DC7070BA10FE0FA06E9426
+421C24884E51F2A33D7A67C588ACC0630044C8BF2BD78F4DA42A98693D3E5AFFF031A1C1
+0510DE90D8D7BACDC8BC1AC2B9264B93796F03BA542F16C30BA766E5BD5D6D74A6C656EB
+5BA491AE77705BF990431A7FDC62D8D5D75FF20967B2E09C63A19F45BA6C7F37E4E05CE0
+C774D40EDEAAE757067EEE6A9EB66D8457427D5F2B0EF8EA0A214CF59FA66135A7D2558E
+F2DCAEC83DE962522E1416EE6BF5AAF32D6F0DE9251979D8EB525016C7AC98D774F38BE2
+51757BC0832C20ACB3BA67F711FA150FE60D86770CC85294F833012F74FC88C918FA369F
+3793E7AAB3FEA504DD10E41D913978B51ABE170F898B670DA3C242B5947059D3B9CE810B
+57FD7E316873262B745E8C34DE322C839E267C15EB139063C68EA00B0DA5C7F5AA8AA784
+42BDD3C20506E7D831868B10974B50F11BD6626ED860E18C3027A27E162B41E237E3A27A
+DF9A5213220A605B65B45F9998F57C3CB7CF4764163313B9DD581B19FB8BBB23E6C1BD6D
+013A0D4A8FFC3503CDFB5717C5E3CAA2411B2136AF7CD9DBCF34D95192C11D3452EB1722
+EFDEA7F752E5FE899E6D9CA05623545608A211CA8CD5195B2E27E2C4ED77F02124A92299
+49227F714B2A9BA808140C019B74AD6652D9C24EBC858FB5A0BF1C40D2EF2AFD32BCEFA0
+A88BCF080701E101700B72D840D8295B843AC806B8DA53051CDE128D06C7FAC0C270BD94
+DD0A9C1AC43826780A2604FFEB513B253E6F3EC4332D315A41526375D06F6C678568471B
+3CE40AFD5A6C7BFDA0E491D1080A1F98883814C2068DA4E8A9CAB9798A8ACDAA8122C1D6
+EF21F21202DEABE47BF3002724A338D04DE2FACE2B3EAADD1F17EE1B23398CAE647C2CE2
+EF95FD521F1D17772A146BAAE659AB4277D4098724A79E7B7DE4A1E1B81C1468760E13C2
+313102391A088B1DABFA6B64A07466ABF4F051802F7C7DCA7DD255943F58E97D3446CE72
+5BD55C68E4663215F008C9CD8E354821DCA276B957BD61553149B9681736522BEBFBD7B9
+1E21397A51E1747503B1B0059FE63ABEFBDFFE4BE5AB446BB8599CB82AF0BF68649F93C4
+7B7F9CA63621AEE9AA7BC2E137103922D53CA8E7AC52A7A11A3AFC0D1BF96B8F2DEC1265
+A7D75F0C251CB0D917A81ED15B45963555C4D7536C4726322DFA412567ED954AC995828D
+3D906484BE26809B1A22FBCC4903A85FEFEB46CF12FAFEDCD64024E008363DAC39A1B19C
+6010004DF4D07C5D61BAE15FC0D18A86759F9147045B4562F5966C330EA3A4B7B5FCC3F0
+838645A39F3C693B6F26C323D87BC2C9455801ACD90579F234180CE3CB47ABF53E267E2B
+88BCD7E001C8B34FED4BEBC895F7EF20C10F9EFC12A6C60EC5ADE8B36066C9DCB0CB046A
+75F58B484BDD34332C3AC44F2151E147213FD4D5AB0D6FF404F2DBA43F2E6B8E9B33AB73
+0076F15A01964B74BE967AFEEFF15C7D0548B99820BBCC1AFE404DD183A933321FC8F506
+8743FFD57A6068C64A042E8D3673345562B7326981EDCB74DAB5C77AAC0C911FDE1F497A
+5393BAB8AA71A10A5A6FA7A8C60E3E4DCA7068536F1D821E20888E3CF74CDFA20C2B5633
+8DCC1269F0B491A8206A9053CCADF1CEA836EC1F99AC130249BCCA92FACBB531BB96AA15
+95363B46A0EC7A89E7CD63B439B26DE70B2ED2C8D63AAE03009E39867DF9CDB39130BF18
+E59DD79DE81B6B08D8A3D2923D9771E7F0C495209BC7B44516FF66DC91FB021D016508B9
+B274BB63F4790E401EFA89449BC2458DF1C7F16BFFB6FDA12F9BF9AB722C941E9134022A
+47DD6612CF60C70C0C112564F2B2017AFBB8520E6593891A1D8CAB39515AAB5DF6D5B21F
+75A28C47A564FD91DBE51E78D900E016AEF72FB0E41F517A4C9799067E41DD2ECE4112EC
+258FF19ED8041953A69173003EF29F653F2837003EA552A605E6627541AC752151E9F02C
+D63EF3CA1DFD2E86C5A746308A17C13D345C4D2360BAE156CA1D2FB5336FB48E4D2A3DB9
+2C78C00162B164648CA123B1FFA8C2BCDF125864CCC81C7D5434791C0EFA898B959BBD3F
+2BE8A7B9714DB32802A8770F520C9F38F74DB7DFEC1C9FAC2541EA7873389E8A5F838F4B
+E837748B84692E6240EAB2E312C7BB15B9CC43B6D0BE65C19E5A6E02D906C96F947312B9
+AEFC64F7C7371A7ADAFF2909663DE491A992A75985A3A7FF484577F9AFC27D7C9AE03E9C
+554CC57F0F2EF5FACFB03651E3CDED1D12E6C5025484C5360824B4E118DBF836AA79EBF2
+74BC0EDD493DC301D44445987F97D5B2F66994AD3AAA034D6B456F87D139FBCBD9600AD2
+DB39F15ED3936A692AD96138E5356DED79A03602FEB441FAD8FF7B8FB74D39657965BEEC
+826AAFA2316AE89F190AF454A587F78C550C70D366ED322B2CE28EE1CE13A3C7228BE677
+78F94F1D6090644B417BFA6DF3741146EB985733328BA246962C896DAFA77EF17C6DCDF7
+1B5B6EA80B3D4D527911DD80A4B60F3B6D2B1EF47A976BE7295C62B2B54AA87274C72D4B
+3B54DEE0D5351E4DA4BD39ACE18DEA08DDA3FDA197BACDCCF437A234D7085C531F2F86FE
+EE11B07FCB4F1E27290405A1DE25D03A80F3B0B6B6D69EA31F9A20AEB0B0CB008D72D325
+4743827E01D09FE06471BC9A96C780E70E476B3714AB8AF8B064DFB31CC7081F8C2052D6
+DB2093FE3F4FDD61479B330AA42817C2FF538DBC6B33F018EED5C32984CFA9B25ED64E51
+99053D3A3BF58AFBE9BA8CC8509C97CE1CC39377179FF5251ECE2029F5D869799FB7B6A3
+F3A6F366B10A8B41A1C53C5A147F0A78D947BE4F966ABEE3434550864E1137DD4BDB1061
+3A860B13731E44C10E0F10C6D3FF35BC3BEAC9E5E5D0846017DDF49651335CA6351E7B4C
+2CD49365D7E9F1CB695D7C31EE4C4D0256532E19C102BCB78E7802D944561F1DEB1CA290
+F5220B6834B8CF024BB48713A5397C411250784282CC412D0F131CCF5EFEE5D36223AB40
+B16496DC424E037D6C317F1DE4A75AACA81933F3C9923BF5CA709606D0E42EFCD73D1D51
+DC139966AFAC9A449D48BEC493967961FD58DFA0317FA1227B70E5D3B21F233407C8DBE8
+34A4D286150AC0C4B74383FD094BBB2DD4890536E383902AC98F4B40CD20C80578FCF8FE
+DEE27084854A1EB6393B4A02F33283C9CC2112853D1FEBAC0D04B60491CCBAE55F421B68
+4766851E1E953F569C1866825E5938992B54E22F157E37A6EB7BB451424C0AE3EF8DC018
+C69006D6066D6804629081199D09DB7759277B70E376FC313D58B5B29C31FBD694D6D24A
+FE99D04461993AA7285727B30A66D0A72284F02BEE5A05A8B214EDEC9F70D12168957998
+1CD3E48827F421F5E272B82585FF95CE9A83220DA0E419F7AC071DD4B2CB846E609078D1
+180EB3DD55B27711571CAD976B36316018FA8A5FE77F21C89A647943E6B1F15FF1AAA3E1
+83C1E6E2CB2E65D5F1AFF74DCFF2A9B97BE008C71976DA706C2C4248C626E647492AA97F
+B7E604C961B6F85BFDB0A23DB554500BC98F3A42403FD4606197CDC1434F69BE41015FC7
+812392E4ED757DA9296B08A6833B4C2C142FB204718A932DCB45339F3220844F734224D2
+9FF407C8A7E5FE9FBEAC31928BB4BE244438E9D28C61DED76866C5988D92918280056BE2
+8193E92CCCB1E9DE7E33DD43E06719BBC0C2707BEB48F8E47D384E541A79AB801D57E736
+EC931602BECE65352C8F68F9F71892AA22E179F8CED4C79889D828870F54FBC49809F529
+E3B69B892EE5D3D37190CDD284517212A292BA9486F8A4B6A2C9F7FADB52D2289EFC524F
+E9494316E1E97EE442A157CACE30F00817AF347858124A1D3764BD4611FD2E2F016C472A
+ED3418EE94D79ADEE0F9084696AFB898793EDF5E3CAC7E211447F23AADAB3A85AB0E1145
+A8A0A531AF69E7F9A5D9B3502C95E81745AC6E76BF38F3F1E9FD4BB9BB7B0846FB549130
+B37D3A06886009C33C6EDCF0B9EC16F375720C43E70C8FA33C63BCB286B497BF17A9F8C7
+036F12FA49E23D51FC50B36743940EE2C83D4CD6B0EB01C6EB7589AF4DAC28D0DFFC7715
+47EDC33BC15846B35F3D5994041D0FC1CE2A3640309766BE097C90F28A40543CE012782C
+0E3541D5804FAEC3E214AF017346078F366311FB5B597B2ED6AAFEDD38A1DFB620EF95B6
+1F8870B38D8496D69F669CCAB2588D2056A586455A7E98EAB80C0E636DB4819904C6CC06
+9BC78828F431158DC2B974B7F9591A22532670AEF239BAA4DE11E11AA48697F03D016623
+47703471A7A97D224EF79E6DF2BD574013C63CF0A12256D2FFBA02EF77EFE408230B58A2
+AD26376E168782499A387B7D637CEF997A9F3B6CDEA49E3B7883C8A89917E575F44DDE1D
+CE4A967690CD1343977F5D21DA4D2959BBAE03D41F223FE48F2CD821A8A2DC78F381B5AE
+D8D1563695C57177E7BE7838616A88CD32F923571982F6EF9C837CDADBFA6D94BA3D7580
+BF13B1FD25F99B0F24445F68B2B681132FE24F135052DAAD4AB37DAFEAB3ADCF593589E9
+66BA88E8D7C2FD660D820762B313136B5CFEDF898B63DAA630EA65B2339528AB5D016C2E
+48A396FD55295A15621868986EBFE1A2ED6EAC75F2AB34D7042FE8F6DA72DB1066325DDB
+45B1932DBF353140C98C713BA1FC2AD1CB51C933ED863E62ED85A6D49CB46F654FB93C29
+9A8CF0A559D00D3221EFDC604590C605D7AF408144CB7F1EECB6500D48F556047EF733D9
+45DB7738BC8F183A5B0141428B3E71389C3BB47EACA9C10DD630AF07C2BAF56FE56A4940
+FDAF030345E253F2B3F0802FF08C5D6951763A8BF6C6A9A4FD6FEDCF684A008D4AD3AB95
+1D0AB7F092329B4EEE272392D594F5838EB6E978DC243EF03A1D6E030C24760912BCA205
+B6D79BE9A17C7989A32E84F0F7A0A624D5F125CD43473F8B4768F29628A06E35BF319CD2
+4CA623220F0584F5967960ACE20352D90F2C98158604AF1701FA94BD06C98596895E4182
+0E0D04D19FFAEFD83031A44E8FC5ED7004B899AC09F3FACBD4C4671712C7A079F3D5B2BD
+5E56CE0D61CE2FCA3D57DD0209496888C4F876403F482FCE43DBBB5C6596BD52FA4E8EE1
+5C9BB499CEBC3598BD10B1BF3DC4BBD0469A9828D40A7704BCB747B4430EB528B0CEAE4E
+F9B50AC157FDD2E096BD3E687C94B9FFF47FFA72E0CB52F68186A1DE0B17CB10AA5CD3E4
+83BF8ED99C39B439BAFB1059519F651771A4809F5D804FBA996E4E192E2863D645229AA3
+9BB83B2AE883D1F2D8068E20CA9A7AC9B7E251F805C070083358B08ECF2EAB38125DF0D8
+5BC4FAF6D60F4747A517F590338662A71AA46EDF2FCA04DE57EA500EF37DD945597E9BC9
+6DB2F41857E7789A1AEBF07EA63223FDB3E9E37817E0B8B7A1AB74DC675F0D1F10AA3CC8
+D83DAFBA3795FA9BF031A678D9E66987E0ACDEA9F87F32390F8781DF652D3EE48B991153
+54CC9F13D0D0E964286EEF0132ADCF79EB08E959C115BCDF62C6D4CE26DFD8AA801ADA1A
+12DABA7A7254F3ADE560571E90808C5668461865340FCA9912B6048B7A3F4F71BA0E8006
+089CD5A2A6902CCE1CABE07F2ACB4F2B288A9E927B7BC0003235562FA3F05FA645537878
+A68F85CB303A8E1440AA87DBC3ED6EB714DCBA11B4378D8FE03B8B9F43B40591175A0E7F
+E61D525D505BCA0D961A21DE745EC042FCF9D2CF078AAF242F4B5E0DC84EEA48DB4BC93B
+0CCFF28A43E9045A0DC941FC92A94E65606809B84309A3047013F3A7E913F876E7CB1A59
+5858298B1FD31EF5967BB21E2A3E210599D1E27DE00EBE95B231606849B6991E30E07C19
+C2335D535BF6E96E0E0829ACBEF50C473AF4EE0686281E3BD0CDFA478C914539C500552C
+D50C202FE487A21E58ED810EC8B47E7288EEF55E4FAA06FBE8B9A47F5FDAE6523F7C6AB0
+E56CF21E0BD77DCA6C9F15DB3D3C57D1EA8333F7939CC5CFF77833A38BA88AE9F7B43208
+638D44E94AD2C8CFAC31BD7B9BBD0EF41E77620B69B5DC6CB27546F2E845DC7B0EAA7A8E
+95E68C5EE90B517EB9B855F4A84233FB60E314A0F5ADF20CB104E2171BD9A986C7FECF90
+5A3000D89CB46CBAB658FD9B093D82FD85CA6E55ADCCCD1EF929699F75BD0B6A12F9D10C
+199808909E346FA5AF46A0E7D6CA5C098B013E32A3D44E986DDE3B0B3B00C401C68E7979
+21D7290C9A9992369D0EECBFBBEAD2C1982EAC11AE9A63DE8480917896905D50D4040564
+63EA142EF18B6E10F30D3873A1079C0BFD3518FC1896809D086FF2799E508FFC9B2EF307
+A64B42164BAA832B4A33859D04DDA3BDA10235EA770565136198E4C32FE46EF93EC43E4E
+6F405F52F204DC5CDD4D6C2BD86BE651DB6F00B1646F1D8EB6B23312E4F81CAA248932A5
+DA8EB11FAE449F0577C0946946402EAE55D9F87AE84B5C6B36AC6FB2AD176BEB7A945E79
+9EC3466DE97BF704785A7970BBEC543F618CD460ECC022134B891389EE46690800EEEEA0
+2F1E3CEE56D90CDFDCBA9B50CBB2CD1BA1E59AE27B1A7D72092759C113F3101FFB47882D
+47A4DA143EBFD7B12026BDD9AE8B29FBE983A8AB7804CCFF6B0B5C00BD0E01674F2E788E
+CF79905DFB7A8158BC9D580A9E41D52EC4F65819584F695A1A52239D7BA8102CAF070936
+2ACC6702FFB98E2A737023E5C9933EC292477FF7FEF248D7AFBBA24ED11B20D8F53F46FE
+A6D2813A88463B3558D9C6D35A76BCA98AE1F0C2F98828095C46B246D93466B005E71C12
+7047989017811358DBB9DC486E8E2DCA038868B577605EE9FA02EC7806534CEA2615DFAC
+1FDB36578B44995D8452E051B3B870F14B6A5F64A2BD638D57E8AF9204DDF163774BC6D4
+7E78F0F073DAC89984A0327FCC68669CC0B0742646FE3BAC3A51FB95CE4BD201555008BC
+0B1CA181272EE0138E18C3D9BFF03DB8E41567D6515F2CAAC44C6A70BCB8208E3EF5CA85
+B25772406AA66BEE9F41E6F59B242E8EA8F9A1C7E6292103E9CDB7A33F17C93B7D63FB73
+8476D00ABC05BB0F44C2AC1BB6F018460746A79475483212E25F224E0D35B914FF0C7C91
+86E8949146C78A6AFC78638186C97BD992A14C0778C00D2436EFCC764723193CFD44BB16
+100FB391B0E453222F7DB4295AAB63B8B7CEF089BF25FEDFBD24AAF4B1BE5B9F54A5F05C
+F656B06C3DDBB3CA240E997497AB05526F55D4F190F356BF5FA49A2AA1D1BF15348B7189
+5EC4EDA6EFF7FFDB6B56D72F7073F3A0656F0816ADC376E23083E4DDA751744830E7F570
+50A277E3D077D4BC40579F69E560E7FBC318DA6EF0D52FE8AC58DCE26BF92D9B28E1A7E9
+19CDDAEE2FC6E9B0FA79765B7E80BFA95F0099F99641310B1D2D6A41953E5C18CA53819F
+ADA31A219CD4FE0BCAFFA0E9C1A2ECBF1F4A56182BBC03ABA9C7770F4296BB221F92276A
+468ED543BBB30DC43A601E3C2AB25EBCAB4D50576973120670A4582F5BC9F46F24498448
+CF7DC9533AD817B2C83DE68433610C800895375683A98B460EB458AF0AA796F230C48098
+EB03687C31AC9248C7F9A6DB45E46C40879F4D1D687CC80C7DFB1E7EDCE56589876D8BAF
+1DBA950A34C61C1EC54BD4F9B2F784FA0D4C4F2F20D355C8682276B5469F8E70901B8F66
+90E65DA08572BAFBB0C25D7F1DFD6CFD77F33F2CE628A0AF672D058F60A9EF77A1A01386
+2828907C795DC2019EC5BB54EA59C3D5CEAC356B679E539B14893F72FEB11513BE098F16
+E49B841D38241CCD38DF88E6BFD2ECAB681965F5ED6AF5EE6C4DAB0D63494C1100E85B58
+A22ACC7D705FA4CD3D988EC6EE1CE5C343F656CB5E900E886B1190EDC652F69255926C51
+7E3946838E01C890359754F67330598EEADC13E243BC861DDE1638855138F79CF5A4D287
+6C1AC5DD64949564C3848D5F9F07CC178673F091DA139EDFD7DD51DC05B9B10A645030D0
+E44B020B16219F76637AEC4437FC31EDA724A372770407EED6F0BCC753346632A7A972D1
+37AA74E187BCF32B6D24BA51E79881979F0B1355C3481037D1A80513E253DF67E9E53D41
+A6D109712CD492E6D6B96EEE517ED8CC666F1637B7251DC7659A10E97D34026EDA7071F0
+2B668E2C35BE0606611F7DBF5F9A2E65215460E2C8AAD9AC8D5C5B6B3F3A30A6F8F173D4
+066D87CBD0182C37D1E6F3F274F08B35C33953D2E5F209F7B72D7E02FE871A586BBCA45B
+F130BB4B307BD44BDCD206EC6E0B2CCA8B0D50AAFA93103DE6E297B916F0A0032B3AB722
+513F032B951257F00BDC06DD22842B6BAFEBB7E65B7F1A066A275398218AB9B7905CD641
+14D06661D28949F926251FC3803E09A31161519C4F6E31ADD17027C02FDAE40775546678
+FEF2BD8C4E939EBA95C477A54DBB0753A069982046887E433BC230428F88C62298303130
+52570659EA5479BC05F91D4F93D4E3384845ED76D662DD61FDF9C8D2BA465F5C2E25A152
+69D3D0CF2AA455E0279A55A09D9054D8A3028840560398C4782544A81EF027BCE3E10E09
+A74533A3FFB75F6B043152D567A3ACBC5D6DD8DB4AFB688AD2DAA4532AD33F3AC0B13E99
+2E90CDB556A3C03C676AE01D746ADDDB2A28B5B09D793B921716DBB65CF3842F659A458A
+4C2D64D5E14E7CF4ED65BA384C051FD0F055675023A480B05971E981E54B9944CBEF4C5D
+7B218CBF1BED120F6510075B984626A61BA05AD4E330EBE1AD2D3A3EA510CA04B792AFD9
+9BC049A0AB23E379BAC557DC8EE63B6E1429C59136CE67F7AD3488741D66D5C414B7B0BB
+4031109228B9967C6F3626856B3861EF6CF6CB1055AF7C89C57608DF2E2318AE5F4C86FA
+19BD45ED6A259EEEA7A40C6C59E20F54A532830968CE6591150F42E7A1578D0DD7481C14
+64FA63659CC5983AE496E00155F113AF128148ED6C95055E1AC8049B29DBC03C1ABA59AC
+82F39EA6F219467853A6FA03CBF2EF3C20C99D54D1B8040FCEB9700301A083F979A4AB5A
+5D73F80C79357928F76D4B31382636781A0A10B01AB2F0D6DC65B9D4AD89FA1D4B77BD49
+018389286FEB19B25AA56B231B0A4443BDB65FF304CCABF75F758E16087D601E45871A75
+50E413B5DAD683D76B504380300FDCF919859C248D0328EC9C754F4362E6BD51489289A0
+E65DEA7EAC020B4932C610B0F61D293E6EFA4B04B29D00E1339695D13CA4C5746185EA87
+B8A10F3810E47A7D9A0467E7A87252F65A06CFDCF4932B2B6797050DF159B543DC0BDCAA
+00298E3299664968155404F6F12BEF77996B8B1617CCE03A49756180C25CF0AE882694A4
+5BF4FEA1B25C6F1A3E5A38A1FDF9BC26D3DA42643F1A3974C071EA311454DFAAD2310102
+9EBC93B9AC2759B6C5B7AA38B577CF9ABC8AD9F0B8B2EE7E2666290B6DAD1645684235E5
+000390D4ED1DB28806E023569425B616FFBADC52567A9D7F2E0698FC0CEF5F32F5A5B300
+C4C791D860CC4F44EB2DD198BEF1F1AFE8DD1AEE5F730F34A4A90D1F934352B98409054C
+97DE8AC9B55DAA064BBB0C7B3DB73E59F0B348FB6FDA640A61C1B0728F7EB999DFA15D51
+B3291171ED3DCD434D7A891E6E9CB56B83741622B2C8B0A46011E0081315B027BEA6A2DC
+334818AED142A03FBE4369ACA41B51C299C27AE7A0CA7A90CC30D313F39871AA154EBDA2
+1F829D0CFD3B61CDD5E6E005F9A68B378423D35D0ACC142E05D32B2D79EC3A65FFAEDD5E
+08B74741557588BE0CEAB0559DC350DB781AFF51E5B47B481BA0D6AAED483CA7CDE1A191
+63597C4CA33E2833CF5E497B8256636DA9E351AD5BA527F7163782603A3399D246B6F889
+A9669C65011F3EDA6C8DAF6483D1058413391CDD6C8C933787829417C2953C13B4C19D3B
+934B65BC4F3F35113255EA6EBFC9D68742940E22B0A7FB030235AC3764CDDCF3BE44F332
+6439BB8CEEF586B05F75197E8BA439606A05863058B946824D669171F6540E96E50F7118
+72490CF038DE0FFCF77F8B4CD62BE3C0D261EDD0C055A7711453336F2F10B33CB033C718
+0C83B325BFCCB009B9B868055ECE8EFCA245BD11DDA46925F6D23D74F25A1C3045988089
+2743B8A8BBA390FE3A8AB7589B93012987A4DCBF355846E3D6CA3F6A1F4DA3A222A1468C
+414DEB6FD64F8B6EBDF77956ACAF0BF18A5942A58A8210A5ED38A5C1863FEA43D727B839
+5B693453D3C74F046AAF4265E8403D8DE156B97EECD7EF5926EFD994C0A4E0208049EB10
+1E93D72FA81DE381E4DB3AF68B1C160DAB992ED536E9D66239C6DB6CF02CF631D69C028A
+E49BF1F9007A583437D5D23EF0B0A4FAE932239144B13040A127A5C1E85E2E9D8D872B12
+A475F0F9DE5D43B8CB84C7B53508414423467F57A2FBA7A6ED11333038A9160A2B2870BE
+C94C2AE22F8081CB442C3E81D0A898F2126646A87FF22F724959309470047E5D857F0164
+951A4BB081E9919861FE857F44B1152BE830D12B1A7166A79AC248BB5E9FF0B02475A296
+EFF483110FB267F8D57B41E566BF6C2BFAD87CDFFB23767FE7358B7160571D84F9AD3421
+1EA4745A985FDA62BFA5187B5EFDF96B95684C4EB757751530ADD08AAA7A2C1FD614E0C7
+17C662FC121F479B24E782B9CDC6EB99AF6A5173CC479D97886C2DB84C0581DB7C55365F
+B22AAAC55B72324AF06FE6C2EAE2732AF590C66559BCB90BD45A05E88ADB13A302405D06
+7015A8DB536D33CDA9BC4D88DDA04FFF81DBCF32C504DC6EAD7B7A60FC3EB4B1F1111AB4
+84DA7B61149AA37B3427A888465112B632F04444C0BEBE761F0C7288FE166A775E5F0F95
+A8753CD4D9B5FB00C85443D244A31C0789E8301861BE71E85661BB2319FA433CC2F93D6C
+357C6DE7405932455ABB431A0B97852B49CA4EB8F7416D930B7578AF03C687BAB8867E6C
+B8CEA05AF4FD47888E6BD8D9FDE94057843CD89F06BB6F98B047B1B666773ABA3F81A0C9
+612928C44AFE7A7A06E03C32ECDD462380C29C8D55E4A745E3FC492B94EE785C7B6F666C
+60E9115F78455403289B72C837DCE410CEF6A54EEAD538D16E51C3EED61C6585A0D799B8
+DF20E2E213B8239CFA5815B1549C042D224FD725CBBD336125362429C74121889C7F6B1B
+78E5250911DEA0A03AF547AF4474003A3C8800F8C0A7F031B62794117389F11F22C18380
+EA1477DE03451CEF9C2A59014A3781D6666132F9BC783DDA9C64FD713F9102BE76A7F4D3
+6623F3E1A158BB2B8BD8DF66DD67B8272571833C1BCA0671AF2E6B132A47EA54E68BD0D8
+417292F00B3334E2F10FC2B7E19A7A6C29B69E792C440925AAD9732174A9FE20B54DF6C3
+CA8A69AF0A5D7E22BC83242B1AEB4FE9761162C3D017614818523CA8C552927D1EA4BA24
+E1AB985B0D7FAABB2C62C855AE39D4941E3ABD9C6B3308AFD3FCDD5C95770EFC6622E278
+1FFDFA4F77DCD91470C5C3580F5C87AEFEAB96669ED1CB156D4E27BC412798B0A7841222
+746E72ECECA85221C0F9942EECB633EFC1FD80A4A9CF5F202851CF5449E51E0393FA8D8A
+140DC33E179E1940954DD67CE868285F0D41B8F4806F5B8AC15F9B7137C9152B3B1127CD
+E36A4E093B7B0D4229452E2B3AD172744F5D2C94AD6F3308CA771591A3BD8C6E8512C6CA
+673639397151906D91F16193EE6B83C117A59A73D00C0DBB450BC9390C8D85DB12A76723
+E28F6FD6BA3CA4A3DED88D312FED2D6FEA585BCCDAF3A9F80C1E0A72EEADA085BAC7A157
+4ACA255F3A25C12B549C9BE70183B37E0181D381C0016CEDA2AAB5FBA57D889A511D7643
+B8A75A751419BCE389B2BB417F46DB83CC7C463C5E980065D79DEAC406ED8151DF7173D1
+A6F2AD7F4AE6216B31DEBBFBC4A792FD969C1D502F6E2D28AF99A43C6B701F7A60795CD5
+8356BBF4AA9B287F823BE513B7C9AED04EA698902AF195920ED07F8E6E03C3D374833A01
+23BF7171B220A1A4EE325A9AD2CE0CB1A551513182E9F7ACA7A1BC055D94FF1B6B7EF3A2
+E7BFB1F2B6753993C8BB2F75CE554AE388DD8A31A02971957DDD221DE666B00BF62E5770
+6A61B138CA0732F1C22F92BA76BB1328DAE09FBBA4C72158D8CF57BEDEE27ECF9047511A
+508232E11AF0E5188A8BC760F2DACE687AAF025F257BED126FA907D53AB770810B2FBB0C
+D3C13B1AA50490CFC64F9950C028E67471E75484462AAF420380D36F11C43BC5BC6333CD
+5E578ADDEAD3E0960D8AD3BD8A50C601D97355A8BD9E108036D128425A4537109E36E99B
+EB7DCD7E000C0B38269B1E720AF06D38472F36A068A673D7BDD021CAD68464783B1C1B10
+0144536BBEE4491FCA00C10803EEBB917EA2891D76A8147E167274E54EE7ECC5CB907A8B
+10DE7C39BE8C0F5830E322AEE3372837ADAE006ECA2322E31D244CDF25BB0433936F0DBA
+DA9291307894C233E75AEDBFACCFA56FDA2BC113E3EC07EBB78AED6105787F659171130E
+1737277A2EE16F611B672F0E14C3DABEA6B0CAE236880AD18CF4693508BC3F341888DC58
+6CFA1537D42CBC59933B43C15E6E49EBC52DB2039CC6B20C435E60C6C9E79A7E5DCC1C60
+D6BD296168B086171495CB9121E3612F6776EF0D0489ABF64F1074E674EDD9C442E85E77
+281CDFF526D81A33A2A871CF59A563B4F917DC5CE132EBEA5631D70E286C43B33425C8C2
+EFE376ED8D7EFEFF28129E8FF4B21401BD49D234ABA3822C1DA107E98F9BBA5EAF62D872
+A73A221033872B09191F9BD206BCD750A40A86EC34B51C430BFB3E5C58FCA417C287372B
+B7589278B64CFFBE8BFAF5DA2634E39BFA0A2F70827295AA295D100B273D358F6B23B897
+1509E394FDDFF4B3A9639F31BBBA924CF3B8BB38272FAA67F3D879C4D2B3F5594BD7889F
+FBFB5F3BA71A4C6DCFEA8F89E4E72A6363910135FA20209A4FB821395360FDA3C3D5F4BC
+9EB8A05AAD50C9A2F93979445417314054A9BEE26ACC6FC8E9347A8A08592752FBF34701
+1D39CC64F0E5DE7F095CC430473ED35756DFE3BD8FB538B3C4293278B0D9D0EBFEAEB463
+F8B452819CDB7F02E2B25D3195EC23ECD1AE512FF0A3F6420B7D0093F8FDB1E5E449ED31
+63EB906A0E2B1DA234936391E5BE6969326A6FFAC1F121FC02F147CF3595CD44219E7F1B
+3AE4654D2B20606532F720D3053FC095701BFC88FB86C5651E6C122F91FA6B639CB20691
+3973EFF63FFEBF9F11E96DC2E17936DE26804D1657C7B49A0CC1F6A3FE083BCA69D8DE2E
+CD049C0DA7A4F01E39B87D71147B0DBC87D43A33843DA1A0124701807B55B1C42C2DBAE6
+DD5F3B7CD30C6B73280A7E10BA888373604D9AB9EB37E44F3BC27829B034727A026F460E
+95575E3DA95ADE99CD927CC098864CFAC42158F28D1216EB84B9E907E0CCDF510E3A68D9
+75E015799D4E88EA475AD5BF3951B6BCE49E221EC8E9F19DCD87ECD4B4AE2DB1AC7651B3
+2AC67F7C07D952F1288AE4B2771CDF99A4AC3C20302874C1FE9803EA56FF3E9B9923C2E2
+BCDBC27C8AA95A0BF81E3AE12841D203C1D162E657E1F58FD8B29490E27C6B093032A037
+70E4F00532E725B68A131A82F39EADCFE3C8C8DF2F8F167B87CA52D75930433606BBC7E2
+CDC5C3F4EF0B864278E81EBA342571E34A9839D18E151DBEF57650D730FE0C88EDBCD6AF
+E59887C36B815F8C8873F031A37C130652F08AA643FE5224F7D10E4572077625FF1AE834
+91DDC4844258642C74E50AB3D145CDF5D97E7D6BC3191DA7792323E6E740BA304D891904
+6609C1859BA56250A09E8361F24E4269178F9D9C412FAC499E553D8F1E8C720825EF20FB
+F2980E3F54758A46F17FD68B943E8D7B0539D377F4E9F9852D52B8F07F0B3DE9F077DAF7
+61F247EFFDEFE9E44B4453991126F5CF597CF80FD1E7E423A4E902E37378E697285D2E1F
+3A49B4002CBC0D068FB6B83A2B01E28FB9E9109FFC1A2E269F9E65BD97A54D4D40278E25
+D790298DEB697EA62B3DDEDE067EBCAB98EA9561D6DB09FA653401DFBA288D45B4BFC07E
+E45F473D683045A9E0BFF012ECC8035855EC71BA5E69FF4A1674529EFE9F6873F05581E9
+72FBAE6729DEC43361AAD7709B0BCEF40B7FB9127D8B0ADCF20E5E0AFD3C23846CB100A7
+015CC5A0102A61AA0C7170ADDD28D31EE741CF0224F4CB1FB77A909ED3146FB0EA014CAD
+2460427CC8043A63E533343D899E7BB79515BE015B4F0A0A84FF532AB32A17ED69992342
+433A2AF722462BCE63D5CB8DD6BAFFCE222004D316A19F8FAA85E1A3A8D49A6C0E31A43C
+12DB14C4E009CFC704122871368775DBADFB1DC28E101B77BBEB4B2EC89AAAAF192779FE
+BA4258C131140CBC2D308AA0E4DC70B21581E32530A72A37BA5B449FBCE35FA12473B514
+FBD39EF48BA980EAE768BD9DD038674CFD2945EB1B7C26DF5861FEFA144F35EF9066A2A8
+B021696DDEE4C51C0D1EE51C034A80F44FAE98997482ADF798D5DAD3236CB971868C0555
+4C34C08AA81585AF2E52561E08CE921531F57ED0A5B7998A800F45437BB30D0B97801C11
+1D1219BD805EA3CD20A673C633046C11A1BF620C15B2FDAAB1188E248030FA86961FE4EE
+4D46BA5C6E416F4ADD279409296CF68ECFC864962A865A6B5FDF871C372266EA2E45EEFE
+866809B9A372E8BE491EDD77CEA7D04C976CFE8BDA8E7DFD7D6D8319B8D129AF731530D1
+2F1D7AF23C65F5C979DBF2C4CBB3EEBBEAFC0300B9991F4042DF183622F332EF400474C6
+48F81372A4A2FFCE91E9465CF30361BCB17BA3A43F4C0E3F473886947B12C7DC3440B9BF
+033BDA2A7C0BCBDE497B2D2F4E620B0FAE78A4557BA351C50A92FAB0BC9C913B3FCDA854
+5A57435ED3E13CAE93160A71A97B62E4C1C541CAE40478FD7492237B4DC3A21D7B4377AE
+60B99325598A77741337BCDCCF82D4405AB60E4AC5B5B1678FFEDB8230C2F5C98B8CDC10
+06A08413BC892374660153D85C5672AA8E807031EE817E75803989770E3B246FB50B8989
+F7C0E7B3BC3F2343EB1F3E1861D86429A431CD31FD29BC92366EB9C095B252F3EBA263C8
+36ED21A6758406172FC87FB6DC0BF89DD5D86015B1834F299A33F7303EEA1719F995F68F
+BEBA02CE3CEEEA903B4C3118835091755B17EDC4CED3EBD0815FF54CCBAE600779E92AEC
+4617A8F3F06661FC9D3CD4FBFC6BA6F298DB2AD977F8531812D794C276F5D8253F42FA26
+E134E2B152ADB82956F8B7108E17B3F05557802892717FE5D760B91C9EC3F8BA661D304B
+DF912BF1B6FD0D0CE311C60F587D449A5CF96FDBA9518D00ACB61C03E33FCBC17BB69102
+8AC4ECF781363517A33708D7B418F897F06BE5052A711F03A3EFD1F632A790A8A9213400
+EAFF3B788465F58372200FC5AAFDFA4F086162BCB70482DC8E5B4ADE0A726AEF0B731688
+88A768C31E0ED47E6A5F09BDFA279639BF833443041EB6CC1FF2C99AE6C28D7D2F99ED72
+5D07964D1B28391E72615B4259668A5E14B463684B2C3D01627693404E316E29DB5D843C
+E4014167D8A5E4BC1A6A021D2655F4A9B8F9EE81F2B38D526E74B4D4F8D924430C6BE929
+63A81D92837A0D8DF695A5F9A4F2E07F1710F43E7AE74957038A318362B7C4F0BC7DCD52
+0F12C4C67C4C2E1FC0843CB12BE638E409A463739F94872640063214A6DCA97F6C68DB19
+5BE088684363A1A0D2C78041922BD5AB8CFC5ED5578CDAEDFA883F8024B5EAA07307A2D8
+884C840AA5FF675ABB045125361419F45E28832CFC595972DC85FA0D009E3296EC144905
+E48E68F3D5F8B2B742D29EA98401F3020B8EA06217E469F9A5B9F90D5833CDC5DE353BD5
+8107E8E08BAB34367762A93F7170EA4C93E655C986691A424462D1A669CA9D71191FE2D8
+822C62D12E4DA8075158A7E06A67E21F444127D525F0CADAE3536EC107EAC0333B2E9CBF
+AA76FBB102EAA3471C26A80A4379B163DA2F0DC4F896882CB46480B5ECAC48FD7CFB5A4A
+88A26CC9D0457B6C19F91C13E5CEA4FDED152F65764489FF84BACAD3B6B736631CB518DC
+CA40AFF8A293DFCB48F40D501E020950F8AECB7EAF64B1D2BF5E9AFFD3A1395097501AC9
+FD17A9EC2210584E20DF4B078600C60158B27829FC6ABA4327D46031138C26DC165098B7
+53B24A27E75AFF7D9A3E9C1BC44F13224874D8EDB5761FF80D230C10EFE409FFE4AB1C38
+7617D386EC9A9AC112DBEFE5119C99671B69633CC0C352610D902CA2823279FCDE7ACF40
+330171DED7DA74DCDBFE81E6ECADBE5D22AC3E4EE9583EC422AC8C70DF14803C32F2AA69
+5EE9C2A854F2AF2A0C57BB4B56C9714D9780024724A787F4E8ACF0FAED49C9A4E9D7B13C
+E537C6EB610A88826007071B98E06F130DC41CAD869EB0A577F7696952E9E88F5BC1D0CA
+A33EB03906471930BAC75D29F66A6CFB0FF77A72B80476561217E9C731BAFB0FADF9B5F6
+A7ECA4532FA9A09F827415CA4238C4038FDEC4E4E67484DBF77A1E1C56405C469C5EB228
+41049910021A315C79DBA0488CD3FECF51ED5FEB4BB08C3A6C9CACAABA91C00817922C11
+0B5C59B3EA10B7D3CFC79635BB06E12A34DA6E3A73736FF61A89AD54BFBC59B66AB4ED86
+97277DC7FE339839A8904766303A34A1E1E5D0DF572A136C478A966C8889A62AAD9C4BBF
+5721C4D53074E9B20F2E9CCAE6C9A9B84642D380CFF40296C5BE0759B0E2B6C9A2BBDAA0
+4E01B247E88EED58842CA0B5AEDF04ABFF076706B3AB1EA055D3AB2C02B852B7F788D808
+579E53C3892B5EA3364E4FB010643F8A8E018A1A7BF897230DBFD9CD2C91FADD0E2AE429
+E984127DAAA78E407D04435A54BF31C8253D77AA15DEC409B494F9F83E6FE69AC63E3FD0
+6C5465CEFA7965B9645F3CBF767950BC1633811D3AAAB6913157F51FF41735E875D4FB72
+2F57430C35292D08874E520E0CBDE32175A6926DD91A2141E5066B2655B47A840932DA3D
+149C7769E21C09938CDA95CCD0DC457E9CDAAFE616419632C2DAC34CC2C12910421CFC33
+987A7F7B7F23A5A398BEA34079869355F5F8BBE7CAB708BCE295CAFE9B105F9E4EB64F03
+14AB463CA7A4D22DE477A957DF6E8F3FB155EBA8E05DEB37E24B36E12B802A739E0EA4C5
+0C46CCC707364BD0B0EA19536DB8DAC6DBD0C132720266A661415AA0C0F6725ADFEA21D5
+9BC89D08BDAEB0E3E6057B0FD050E25DB512ED5C50B5F21F2D26AA0FC23491790A833F9A
+3EE60F7CD2A0D704B42DBA423AAEADE54B1737BB6146855AE1465D4428F06A5FB376B2C4
+62D6ABFF17CEFB1C3745214500CDDF7F875BE0BA0C42092F047FD1A0A0394F84FFA21656
+104306797696B65A79ABC35D73913E5996109FC6C195FBA18919CE0AD8F40FB5C1429AFE
+7265EDA830245C2621D3FF063643AA64075B8FF8D09F8EFFC53D9C0AE0F4FA62F064BAD5
+48672F409EEF263081EA86BF4AE5E776F33E5E8C5AEF92BE13DAC7C5FE952B0AC4484011
+3E45638132FFA8A2A37CD5F6B8F4FA540E373923126E670AF3C20BDA69C97D3C57763990
+8A42E312C0D9AC259044856D1467761E2555702C3A62197864E0D271F3310F8216A8DF1E
+6ADDCC4377641CE43EA295A45ADA91510FC22E751972AC3BC5657253A73814099B0DCD19
+E31A304CC23E562AB244DF2C84A5939CE21E158ED8EBC0FB77B31B1F3D131231E4AD7008
+705BCB683BB808702FE3C76CB2448DDAB360ED852268046366400A45E0C9903253713B0F
+912961EC2F227EA3643BC1354C1434F48DF4A77B5AB88E84CE314A3CAFFD29CFD6804D02
+A496D5C6ACA9B60CBF0F5036073700C8BE7CD0AA49509803384333E27B539B66490A6159
+8D39F00E045413FFA485CA1519F2643A90760367EEB3F93313130B5F2CDF1A3C5A4FB1EB
+AF15485C332299955D327AAC0E72E9B8C986AD2B63C2ADBE8B9D24A45C9937DB0ED5F4F7
+A325AC8E0997BF00F1BAD06B547BDFEFDB57F0783CF92711741C09FFD2DF6076C5823AB0
+40AEA040760D45893EFEB6FFD825E072D46F666DEDF86BDA7071B388F5979EC0040DD527
+BB4EBEA0FDF7C15F07DA8E9704828B2E08118EA73354ABCE6952ECCC2AB2083C7AF43332
+53BCD45632C3EF54EDBBB9FB77AEAC262000BC3C2144EE39ADBC3258AC384A431ACECA1E
+DCA2ED2C467ACC5744D9B9FFDEF8E318F88F23A6E515823CB8CEF5D0440ECEEB11964427
+7D8DCADA2CDA943DB7C3621881EFA1C9787E6234ADF70397EF27AE8493DBB3C57882B402
+3BFB2E0E6F87265C132EF92650F232A99A4CEA57230880A096A21AE24EEF3F5D3878EA20
+8C6D466AEBEF5268B6C3F4B0EEF38F8A7E8FE9B0945C6F8F12669F8D7D867DC16FDF6F6F
+98C026A204D90FA6DC68C32D29ACC5EDA26B8BCDE33AEF7B36176AD80F066991D6A93462
+E6F19AC3313E62A51867C0C63418F149C6EC0BBE1FA97A04C9A83D140B006420C007677F
+921E960CA1B99B789F5884F9465F2B17544BD6225F6ECE24CD8CD341EC3CCB1365DED6DD
+7BE1567A3EA659285BE8723EDAF38ADA224EB26345A8177C6D37A850B3E3808C0E06444E
+85A6B5FDF8CBB71419DDC46FF1D804836A246D1BAF6CF64FCB65EE2FE98658AF6512F1F0
+29AEE5BD69014F7401C2235EC77CCC7AA32BDAD0AB527837CC20E804189EA54BAA92AAF5
+F5C720222D97E8BAA761E10B2F38593FED26B4B90EE78B943B1CD797BD6B4505CB7042C7
+167DA279C7C5921610874BC7A4A89644B5ECB8EB1C60F5B4FDC94C31BEBFAA09BFA98F59
+65D748AC946CEC09A80BD65D8E26E4036313C59E9A6887BC9B101B0EA2710B5D6876E933
+5F976159BA8F7CD991CB986FB8C46AD84F83D94ECE47EA1E4AABB26914A1C68069D5AA3B
+22FD5CCCFA6F01BE2741A022BB4424F111F3298D32D5FB6C8361D26AD52917C1D5922E6B
+ADA1B460A4AFE2047DC59FEB797004ED2E3FAA438B6C3ED8F95EBA8DDFFE912DF23DCB82
+83E53D98962865B85C6F9E510C61A02CB1DCF235F2D127283AA797F3E448544AC4115994
+7D147F085C1989142973BEC2CB22F50ECBC075B5E6C28FE80BD774B6032A38EDA0FB171F
+9ED9D1B7F02E236F115EEFFC2BAD22A92E867C25FD44E3685AA4E40621B5887AC894C27D
+4F59C1A6273C073AE15714AC88469DB7644599210D70B67FF2B34D1F439D2A9FFAA40DF2
+3EBDF3CE41BCBF323811F35C697BD63D3837F1E418B68DAE87603C6C13ED142F1DF5B14F
+7EB40971D1D4179461D5C8E133B085D943FEEA3F4D0A2EE7FE3EC5C2BB89A558EF8D718A
+4B849A0CCA8F04A59DF3584678956E0E6CE221F35422BC1835A85F28A99EAF115467F8CB
+3D2F4BA8DA5255AC04B3AE2DDD6C0B2D2C4C96A945A83C7B29CE7860D1B13AE4EDC89D70
+15912DCDDE5BEABE67ECFA4AAC3B392FFCD7847E44B237D508A6BA8A63AA05610A6BE4C4
+68EF8BD97636A05F1FC0FA11FAC06989B0DD2AC64B643070486B3835ECD8E825DC5EC7C3
+4640EB2C74CC04ED4C112B02AE52E0FB412228A7DE23450E28E55AEB3AE5333D49CB9B67
+674A946D64B715F4FECBE7B42D69C8A6A8DE369F2D74DDBFB6326A19586F672D86FC920E
+A54DA73A38C6DE95544D8B99B887A8787C57E8785B0D8F8D6CBAD99ED09C17B4D5EC6A9D
+13D12F56386F43431B7ABD2792B3EBA9A6626FA51F11CC8818831F9F6E933B28E7E10157
+A05B4A670386E3DD612BFB521775DEF90E71E39E923C8BBA6547E22C4D3C9A8F6B246A74
+420726947F93AB095F8368280314AA669692F3593F6AC46298EB74A2E3F48ABB6A912CF9
+D63537B7C2DA53D6AF26C4881F9A9DE4F0E36CA948B649530490CA630DD9D4A50D5073CE
+2AE06EA6CEDB2EC3EBA3D214A6DCBEC29024A35B297BC766D92CDC4FAD6B92F06385973D
+BD3F4133542730861DA609EB8CE75C5C585CC86117CC5281CB37C56158214D0FBE72FB4E
+0B08AC6D1DF7B9B625E2197151EF3BD045CA06657052521F06CA3BC6DD36CC8D74760A68
+60FAF2BF523BC8BEB1DF926AE62CC477AC33B3E5FFA7145C945838CA3EE71B7CC7A2D7F0
+EEE3DF5FD98F75A7B0C68DA2C9A36A2D0EE2794FD4A4C0F735883AA10CAAF1E9AC4AF521
+8352BE96A1053BAF1AB8457CE982B510D03D5FE61C77F0913A9AA11A73F1E84D22B8B2CF
+11DF6DCBD098458836FCAC60DE50264F7CB1E22D14D91FDB2BD2FA86206CA536C4EB09FE
+ED2FB4E2BEDE41BBF0F3979502DD878650A4A526FF25EFB696FEE4763EE47AD1468F70B2
+9D8C4CA6779FF7604C5A9310AAC0C808D8716687F08C488174EF54D6D90325BF35C71F12
+E2D6B95DB9F7EA75E94499DA82767547BAA31A19985389544C440D20B1C333D80F8856D6
+211B1E8140EDC207AF725D355D3D545D9907275ACB15AC2AD5DD61D4A6C7821BEE3181D9
+04720A1EE2F23AF165CB03D53724399C78A2C7C3441183A62976CE884673349075CC87FF
+2FEAAD89EEC64B110252A14705516837D79715213F31A5D672D8EF33E8095F8CD005C885
+06E25C7A0F3011356D27BA36381C513BA7E626665392F4FA1C9D390ADC83277DD6761208
+053FAC2B0FEBAADF35BDB1CFF2BFB7E5781FC1AD6D1D97F7C9BBA1273CACD4C9D6EB6EDF
+01286A851DE05E05426D2F7A2B3BE6F6F464AA5C65BBDEF3FD588EBDA0241CD74209A229
+BE1CC00D1C3CF3539B003FF32CFF8D633408FF7DB334633D78FAF8C6FC3399EBD2B23F6B
+B449E26CAEE9A1C375CEEF3E7C32EF8108F74E90B42D57C923243A72ABA97A24605792F1
+3ADE5511C3BD03EA08F8D9B0CC8DBAB4B82CFD4CA598E8E2B419BEF9F87668420A73995B
+759B54D232865FEEC983ADB4D1BC7CC63B429DEB9A1C25A1059023ADF1DBBE8E90181D93
+05BBB8D97B81100F92D7D2B432793BF4272A48792E94C86A18B7B0AAC48B4470EC2D9848
+BEE7C36A931EFBD04A1795613953A23746F01B7134D27D477F9FE5746980A28C0AA12A7C
+7EC6F604C77E0BCF332C73018D307D8684E328E0347F9B4377A412E2166F5DD3D870DD41
+649C5D823934CD5110CF9A2C362BF60710F16A8576A2271B2C07575D9135943FBB2F2E77
+CD77FB3B3AB1E36868165484DA7C7835D3E7875CA1E0752DFE8F41EAEA8B089D14B70E47
+BAF4146C1E17D4E62B0CAC5EE135470C9A789FA064B89B1505817EADDAA9D2B95385D7D9
+26CF03A88DFEF1AD1497417D41EF3A4F0D992CB2A443E8BA9262F36B6506E4DB82C3EE7F
+86F50EFBFB267FA7BAE727DF51F280A1A23D83B2F38B6BD8DDFF8C9CDAC9A4E6EEB049F7
+FC63527A90F3DF9F7B8E4BEEDD3441E93A9EB160FA87C1CE6A58E1B56E789E1D7CC09808
+9A525B5E251B8CB18C502ED0950D15D40B84DD734990CB69D0DCC2AE393AF9E70DFFC131
+A8DF0317590A4424421E8040B03437C7AEA31AAE1CEA92C463E0364C42459F89E53E68ED
+C9B8FC5E40C65841B481C7ACFD804F8E21C28DA99D209B7A67C4BBF200C431D9ACF61F42
+00A2053F4C949A54172423C95B37402C2373E9674C1A8FDE5EF379971D712D40D59E3D75
+1DFF3E14F46272D5DCD91C53341F552DC96753562A5D1ADE914AB1CC8E3FFD917E4EC7C7
+7659077BF1FB197B1C38CE4360C2BF9F7608404D3DCF42844BF986A44629A11A233C49DF
+ECD6500C79784633A44E3DAEF69CB191D7875EB8C33CE1CC229ABFDBD6315F3AFAC95C33
+70CD89543C31B14CE88035143C774040DEB3CB7053DFEB8FB88C81B199F67BBEFC4D22C1
+9017D61180F5DBE8A7B4948D5086DFF53C1DDCAACACA1D419B59B2ABC948B60299D31ABA
+70AB5D55CFE44453973A6D3B9C9C5E1F13AD54206F98112114D0709D9A108816DEB7113A
+75B38DF8A514DFD33BE8BF2225FFF4D37C94F6C026B48AB3124757C985E9FA2007F8B4C0
+7D95201E466729C0E13822DA5FF5A11136CFF59CF5EEB7BEDFF616E067F3C52D3651FDFD
+5FFC29E92B59CE7A90AFC01EEF4464735ED5B95B5A4DF4FAAFD93916B47B2B77029A8D34
+9641071C4140BA4BE39E6807E7A54A092C981F89C8B6736878C15C6803272B21E4FB3A29
+0312FB9B5B9E10CACA4AACAD45B2EB5D8135209991AF00B1F241C36F8FE44C4EA6A9853C
+F0EEFC31A00E6359F7DAB1114700FB169B9D47AACC284903C3B6E77A110CF8E81E109C73
+924E9B0D6171782E6E8EE5496F77EE53F9A1E43802DACE71D32D3CA8B62DB6FAD11533DF
+8517937214E5C611722B4C72A4362B5B16FE6A5B305A668CD6074CDCBA59F84334E37AC8
+894C7DD979CAE35C1389EF455966B016635866DF2C512255F929C0916A88E1392C69CC7E
+435598E3C4851BCCDA2492B33E76669E1E6D2C4CFF3D2CC8C7BCA239838F2F643F0AD4D2
+FFA5ECB649CD3C2CDCDFD89004F39CBB04A4031C1E247BB17481495950DD445EECA74271
+1371A1BF2BC794B76FB5B8CB025C936580916257BC3458A1A608EE326D1795A2C2C80F25
+DE3DD2EAB2577FD41251F194AD90B00A2BC1837ECE2BE200E84B2F41AABA6B9C703A1075
+EFF8A5C8253DD0795164C558BDBF752CB5503C91D773DADEC48412329675330ED2B42A82
+D8DFD62E376768CE9E4A3A2B1FD219848E57C45F5BBB9F9B1C2F0EF5E50BB04A0BA8502D
+605D98D580A39903FDE3CA5B9416166764B7ED5C6F02AC1D13E28B2DA209D6FAC2C1FF7D
+6584A910F3B2D34CCBFB255F8B57E1C4AC0ABFFC43DB68570B02A8301339597CB190032A
+58C6EB0257E3F0A670215FC8191B379602A6D4150F86D76A447F75C9A3A1D6816FCC610A
+480B94D51318CF6F9FFE2F2A443E5829C1BFA54E417064613C4D498E8882C45064F2EE81
+6579060BA87E897A3B6CA82C195C26BD2FCD8283E8DF70DBFB4670EF0392B5F15AD78DDE
+8C94A50F84B441C2905830DD6956D0EA2F2CA38F2F426A6BC315FD383923FF7A5B24A466
+09BB06641CA4E2E8E3FC9B6709EF7272C3B0E3A714693DE2D0846401163A91DB6D9EEC26
+8E2367C5772EB77D01B83255997F33893420E572FB8F3F26643E3DF3D623A1DC25376439
+86EE57B8FD3CFE8AB3FFE03B0FFD15A0ADBE32DE82E1DF8FCC5F34FC7990DF7ABE054365
+2EE093862D1122ABF7A4C472F0DC09FEBD4956F1E90DB4702BB5EF6BE0B4B9F4C6F9C8E3
+EF8E1DF7C7A23BAD63CD4E4DF3E06405B76E4072636296F9B414487110515D0B5A95ADF1
+5B420D3EEFC3FF2C9461818A54536A2856E2EB2408FB37E9D369DA0BF409A592AE3066B6
+DE135A073400FFBB77FE81A9216DC4F22F1DB3BA5CA1C737BFD57D65DE03C3D22E43F969
+0E2613929DC2A48C829444BA1E7E94C0200369A69B8D058616C530A4AF5CE8648933B689
+92774DAA75630F63B4982F878F1655E47EF9C72CE4329D3170EC68D9ADFB1396CF812817
+94073E38E6B3D99D8862FF07395ACBBADD02BFE801C46B9F32ADC6CC3C53993316AF2122
+B1F73E99A808CCE2025C72B3D6C9B60E15FA6009DEC7879013C1B997FA025E2B8302A75F
+BC45265E8CFE498D8435AB9CE5FB6D8CEC6D1D4742BF1E1904D41C9BD3213A8D6726FE71
+870AEDC4FF45A607227A88636F79EF1AC1955A7B3AAA001DF421D692E1AAF13E94195687
+508A57DB4A64259B2B673CC64406D1CD6E2CABC9D4210F837C2CF516564572E6A52A7DB6
+2DE5E694CC75E1C7DB9AF1713947E5E6A2955C5C86E3653F9668702D693F460FC816C309
+10729FADF7FD1C3398D07C8250DB5DB79C01029BA48B689EB2CB2D2EAC73422F4B2FF270
+F3A2DCBA33F3DE701218514B3EA70CD046102DF56EF261357D868079793C4AEE3F0C41AE
+CCC333B876FD40A68C0D23916F4ED5DE6A1E869A6EE63BB1D0B7CE3DD261F0324033D621
+F91CD9BF4FBC7D016F5550A325BF6738E4F04D969BFA2729EE61C60B5FED67687C0C3315
+C3768AD60A4085857543AA2D39391265AE595862A91D33175BADF61E81C17278C3F22E4F
+EA80E52DE331D5B93C9B745AD207B89249512E98C646F9E6ABF599E589739A952C5B3809
+5C1D09FE75BC467565617B8331911E2C014AEDAC1D858441055CA8735A50ADB73FCE2AEB
+422F5C7655994E12C496E16B818A349B27737BA5E55A3FB49E71F76F427FE863C44FBCF8
+AF51D4821DD6E9DC69987100BA5BB620AE0454371C58B4D807F0E3966F1C449D2A729117
+70DB12E3C427586B7962779C4F2FEFD4E656FFF9ED968DB12BB3951DD06F00370EBF789B
+3AA54BC8BF8040A31C8D892B348E4316DA82306AC10A1E835922B42CF391E8264F0A593E
+3997DADE4310E5BF48B605DD422C808D78839516A306BC520C431482C7DA1FBA5B41E73A
+154B7453C441CA3B1BA314CA2DA7269D35D61D16F30807B6379D23CAA456F0C56DAB9037
+AF79FDCA5AE7466246F28335CF4B1C91C02F6EE6EF1F2D2EB52A0B4C65708D6A27DBB5D7
+0483CE6F2B3389C85AC658D96F3E7CE73C89EB5B4125812FB00FE2EAA7972BA80B3B7C32
+A78F376EF51858109116981532FF5BCF18DFED69D2CB63DD24BDAFE5922B84CCC1867CB3
+9283524C6F68149F7C3392898BDB4B45FB5DB9A3D6CACA0AC64B602A48EBAA550E5187EF
+CE86D703E9AC4F1CE514245760FD77BFCC129006172FAD38AE4874DA589C8311D600A4E0
+D6AF691CCAEBE86DBAC58054C6F5BE4EE3C4C7C4EE4EDF04A913526E04EDC4EA5B56C1AE
+FF044F211295918C1FBA1E6E2D3C52E40030F41647D79E91CF67853E263D6ECF81E4F293
+7DA998AF7352B066631A650D3D87082EDA667011E86ECE0351CA51A366709534EE55F393
+780597D1AAC11F0A2D46A92696D86DE420B34F8FDC3CE91391058BC0B90732387FA62D71
+6F27777D71B6419611B7ED9C125F9E8E9336FB96EB582FB5D180783DFF58BD91259315EB
+FEA75B55D41E9EA1338749B2DAFCAE6068DAE6EA83B3416947C000D80C3E8DB71E3B29AF
+52C3BD67A2BFDE055584C8029D32A3D1F61EA58F9184D4EF6D0245B545465273129F4598
+7B10AF2D331C9ACB8F765850E394A98501F2D4B93C2CA742F69A7A26C6981D7B2968D841
+5756DACD3004E61AA6A486D9E084FE3A0BB7A2FFB0FF3ED7D624AF52D9735089813952BC
+8DDB1F24CD2D7CB0444BB4AF88DA9C4C2250E166AEEC2DB20BB29D5C9AB1E7048AE5F151
+77C97D67F251E4DDD6AA1C8CB52245C8866FE9119EF0B93EBF80E5B8F9F1E7B94E686B2E
+AFC75AD477E23C380E8ACFA7C24478B41CD079B5D5C48FF093D47FC770F7BE27BB8AA358
+2E93825D29837E9CBF688F21AE3CDA6C9AE9E76C0245D7AFE336B2A8637E51F8F284007C
+48B036E062F206F3C26FD4717C4F0EC3C1579AE53D53F9F9AD23B1D151F3F681A03FC775
+E68A5E0BE472D256AD79844F923FABD03062A71269DD1BBD086205494E4AF4F72BF1B29D
+2046ED7BDCA395625B0F019A84F300A23B505F06EC47AA948BB78350009005F42B1B2E0C
+95381F35EC058E7047A97AC047D3802B54E2154BE1C7B02102B747C9EE3392EEE19C7E67
+EBD22DD93E953D7628536D199E881BB7C848F4672F47E93241B8D681F3B31CEEE631F6F1
+BE8802C9AF4F535396A423AE038914D4FFCFABBA7DDFC476C38C59DFFC0D740C1976C81A
+EF499FA42C7360BFDCCDF373DFD907F045F8FB8E50C75B5CD26451D4C5086CB44BE7BF40
+BE5B8729A67D81B9A42FA7E3468C7B1797C8B289E48CACAA28FEDBC73AB9932BB49A5B07
+4301FF00CC88144BD148129D7BE0C255593E0B3E92A487F2099E3802DC84B27E4653F5CA
+CF8C4431CEE7E88C0C252ED5543B116A34E57EA2703C100745FFB2F16C4C3A1C94929763
+EF3DF12FA76069A4F72E2E7B5FEF2C284E544F6DFD9447CA408F23E966B417A5D64740DF
+14F0A41031B5FED6E7BC607BE09AC8FA94032A6C4D5E0CB89096735D9E74C2AAF06661D7
+04F66910CD50F3EE7B7AA12009D846FC9498D427C0455CB76CE80115B0F230EF8E26F51E
+2E9718D01342A43A5E52A5C3E484F099BFFA61E1921BD263517F71BB2270AD6FD06942BF
+69745A2A17D83EDA93C1D6EBD6F732CCDF5377B2650EB02FA62360D94E2E9E868B7942CB
+5AF6D5FE488D73C12B5DAF468C453725A528E862534AC0C66CA22C6263CB6426AE90FC9F
+23568692682B994F687FDD93EB60F19316A7D800297CA2C1674B58566B30AA87E1C7F560
+8F3099BE3E5D40433031048943E85014CEAB47C6EC2A579FB61BF76C245592003F2C415C
+0001B1A06452FD72E8EC3D251DE4084239B95779392C4C85B48197BE58E865E68A188A99
+6B8B0075A1185C1BE3117FDFECAFE6D0996AFDD3A89C24C0B755BAA89B2C5B3694C26B5B
+B79A566B962AF924A786EF7DB1648228B68A7E5B25E0DF47448642D5645688427A054E41
+FCE25D804AB997248813AFBD4D0A5360417AE0DE4A581F0805AD889E8133613271C3EBFB
+B6163E5EE9A92171B469B41ABBF91022E2B689B48777DDDA4BBC8122B3FD1C1F31AEADBF
+CC2E2AA3028DB547D5EB4CFDD7C2CB2AA6DAA4AC48AC5D07841A7B5E38B2CAB611944C24
+8A6451AB570954DAD5E41CA6A072AFC68D1BA360FB1C76A289CFFAFE44704858E089C02B
+C3A003C75FF8B12AEB9BC13A9AAFB6C8C0B0824F0CAC147F31052A7DE2151FE8D61DEC37
+FD27896AFF448333C57E4D24D258AF75303108E1E1498C80375A413E970941B5E1BF3ACB
+63ED215FCA6D697A10B03077097809C4EE4BFB40DE358063E1E40A8BA2D99E8FE1BBAF4C
+329D255B4C72E7328C2CFE71F5549AAA8F240306193B5BB52CEBFE2516B12C691D94B913
+309507A0B6345BDACF55E1B9690484159F63C603817F218836A1C7BD0AE766D1A5B12C63
+445C98C941999F7006FB9BB8E6C0BCEC81F5F11124B15D9C1207E017927429F7D1D915FB
+374570E41799B120821417FFB8DB4C90C4EC1FF2DFB4831B1E9F3DC7D8625D2AD8A03E67
+3F5EFAA985BA514D2A05432AC1462F8F0D9EAC061A6102E22788DE556A7914981A869636
+8EA7E4BCAD29037B084CBD2131DADF0DDC3216F1F80FDF01AF9D8B5C03805A11F23F17F1
+81279C0AF7235DF4EA196FEE44CB6FBE663DE87A00B4B542517C771F13BB77AB8EC9B26D
+7D181AB9F8BDF729196B4579B821BEBA666B7D314923F5828869D5DCDCDD701D9472E307
+8B804378530A5BA7C5D83C9B374B9359033E8276181716FB3104D393D32B522328785408
+A66A5C8476F1854F4EFB401E8F04767BD953C238EF3EAFC8451891A456B6FCF728262A1E
+FBC3DCEAA913C529543855E3730782BA800506F9297DD905F0F05CA020AF54E52294E021
+1B6B1A7E5F0851485BAA5FC7AEF4D5EB8846582EFF9CCA536FFA01D2172C1041BD1D4ADA
+75ACD19C57D55BAE2B4FC9DB55774E6103D63F660C404EB055DE277C80BFF173198F0FE3
+D653E11E876977AF3176BBBBB76AFD5EF5D56231E994AC3E088EA0635990F789F00D1055
+27F894ADBF3E04D4D67AF14ACC683FD78F6C46D667FCB536392375F0E673FAF9E2D5DB61
+44753E42AB7A43EEF201F87D79A871710154EBB3C60718F424946F0E8F5F6C4E151369EB
+60142278F96DC2467ACD0A70BC230842A98B765012CADBCF54928B8498FC7FE7E21732C2
+7984CC982FA087183702BF610FEB1873DD5820FAEBA838AF642BA0D4605A8E377311340D
+5B89237AB0431CB37EAC1A4AF80698D50C55DBF2F104015BB7586413AEE4ACD966CA9F49
+FDCCAC954E177A340954034E229B2F85E3B081E94F244120F9C754CDA85305BB17F6275E
+54A34B3C07C91FF4007B81958746632FFA84EFAB574061A8897D8DB80DA7BCDF57F68DFA
+12D3CA9D555056CBAD78FAEB316A0EDDE6C18181510C470BB27FDDD02B3362B0A8A684BE
+00D20C433E0E09F455E6F7D0567FCEEAC815321F700FE9D1941CB441905097CB0EEB3406
+A7BF6A56D0B429C01069F3C8A147FA0379FFA974643A42114D5CFC65399769C2ADA8C721
+883B4047718B560239FFC6C6F72AC283A562E0BF435A2FD28D4797A6FE18A5C4BF58356C
+AEAD84D2BBFCEC256097716D5AEBC8E2DB001108302785630CA2117E475F6C96037ED02A
+86779BF9E8E19678398690B82EF54174C454755352A3BE0AAC2E9110A49BCC26F1CA3447
+42B88D4C7242524DC8E22271A31D8E42AB6B818427E5A0B921A45ECBACADDEA91D6B3F5F
+80BA636CCFD7A00F52B251EEAAAD8D14991D0EFFE1B9D875136B619FEE2D98AA19705EF0
+97A7BCC5B1F3EB069361708C5B9CD719746A370E8E7DAE57B8E87FBC0A92DE1712324B9B
+A6A13341969B45579510E6646920F9DCECCC28D20BA30166C032031A206CCE88C7B769A0
+5EC680893348BED6982AA268145016DF9B6FEB1CBA0DA4EB0C50FC22D144BBD53F67AF2A
+B5F10CE54FF5373EC0D3B35BB23F4C56A31D729311C67734D80E481CA6E3E58DAC0C7C08
+6E87BF965A2D651FE42ACA77F4C060FDC8DED1F6CF242A0BEF60C95F6D4954D7F919A04F
+3A3BE98B671123C3F6D582A5E5DCE2BCE7067878BB242144DAACE596A7E7D8AD4801FB08
+E56B3B89A83CF499480BAEEA575EA14BBC4158046B9938CC62C3B6D21390FA4E09D0A282
+70EB913510BCBCD8807AC42619DE4697CD6086B64CD5A78C9EB7BA5D0A37B588AD6ECAE4
+A51D867E550DCD4C599ADF1484C1066A3401956776C40B1296188D49CEB7F428ACECC5B1
+6958A5E385EB56DDC28ECB492DD6D81094A37253B0E46279C2CFF39399B61F5AB8E9E6A6
+15083969A681F43947B23D86892E5DE4D5E34749A7E8E896DC47224D5F256B60E84E9F3E
+067922D11861A4A573BAAFF6586FC8EC2B9FB76F829E1788A7C95D8FE014B96A8569C733
+AEBE73544A658763B02EBD7AFB35D6E5839BC943CFFA5A655296F9205B67404B741F3ACD
+C70C08E39F89DE3EF84D4D905985FECE0833F5FCFED3240A1CFFE42D72518D4FB1AD6733
+A0C8CBB6AE7E90D8F6F1CAF51843B39CC204691AA280E60FBFE48EC4006B23FEE7E65C85
+D8F3546DC4E69D24BA71EC73C6FBF0731F1D6B9D14B666C33EA8221A7B25B5CAF867ACAE
+1454A8D68963FDFC296F584402273EAE5A428DC6A135B15939B3820DCEB16A63C5C6307F
+401AEA8CDE84642CEB39E61CC0EAE48D28CDEF7DD4AC1F1272E66A83F973557C1FC7ACA2
+AE57A95E10BA0337EC6E84D50F847AAFE9FF84F4CC936685CCED380B79A4C42F045F89A5
+F04A3BCE12B1848C50EA53F2DF1106E08E432EB20FD36FFAF9BBF73191E3CAB2FF7C886B
+6BDECC13610B00996B19DC2F49CC9CCAF81B3FC6EC9799D61477A2C6C2DA26BC6615B0E9
+E74286BF504E013DDB18AD6D5711D74B3706818AE8C48949EE364DF5479532ED159F4E41
+D35BD9FDE566446914043DCDE885F6E192B28543B44B59BBAA3CED78ABABCCA0D63FBF88
+96C269A72C590A9D0EC08145D63617B788FCBE82855D933C0D510D6D67FB1C4490AA0946
+E42D124FC99CB5EB96088D34EBB34A57F47454472FB74F89429E7A8770CE10ED297A1730
+C3DE8DFEDA3977AF69B741CD8E0930BBFB890FEC47439681EFBF5AE8AEBC3A8CF1233FEB
+958C7A66A30F825DA3AF6932EF4879FBA6DF9BE9232C624D1F30CBC8CB67E5B853E40E24
+8671CBD5521609E03D326873613CC9AB1FC49D622D500E5FD15067E2D9DFAE964131B9EB
+D6401B9BAA50C0AEF5B869408C6F136D6DCF6A98AE09908077F77830239A6F1169E74818
+B47D00B672C921D101303EBE3BE7183A562DDB8E60A05FD72D4FDCBC74730A704DC98331
+2F2A9173C4A97AF340F09846291E81DFBC8A95D7B669C6AF73744EA1D603E1D9BE138EE1
+7DAB5ED270EF42283DCB1BD20622EF2CFBE33E364F08A458AC049D0BD62D66A980BE10D5
+629C47C616AD268445D63BA125E0C768FAE66D9C7D8C9FF78D00870817F8A57635E6A894
+447C712C320D1CDD4BDEBCF9D7DA3F6FE5CEE0211CB842AF1B2476C1F55428558E80D4E7
+75732B89295CCE29A81EC435DBACFDF8059C8600F0EFA28339A3555E1B4205757E2CE63C
+BBC53D9536FBAC9E8707114DAE2E36296A90D19EA835122FBAAF5BCB49859396E85C8A22
+4CBF44FF9C748F12D87A60A665802015105960E73D33FD211420074A00FE36074F73B5D4
+A0B3944203723DE9D1E0D61AD27246FBBC71BF9FE9FBB3DB9C419695C5B7E41A7C8F3677
+C55EB4DE39C0ED5DF49BC0B3A066B977DA45B4FE265D8F96F28148CFFB73C437EF129854
+FC6E25F287794AD1E8173A6A13662920FA3F9ADF7961118654F6EF9C187B5C4957C25723
+72A04DF8D05ACD188BC7013711DA681B1F91C9F59E6C518D39990E4BAE2E954B07DF3F22
+3E8A79A1A90721075AD3A36C379CA6807B1051CD2386C09ABFBAA4077F95FDF3BDDF0668
+188A208C8AFFE7DD899E515F3045AFB6950B3B78BB73894ABAA58E0E0E72D2283E77FC75
+F74EE02F560EE10204F5D68F929BEB7E2CFF088CC6A74EC69A0FDDAF1269DAC390EC141E
+24416547EF1FA37BDF3A61ADFEE6E98DB5BDE65F823A1669BA3DD1B8723B8A1B9284E83F
+4425FD8DB56B0CDD6D93A8E531931FA5C239F01D776FA380D3F94FC58C0C403585ED1C9D
+9A17D6ACC70C29E36FF5D960DFD7AFC735A5A11C91F82CF8F4E329DCFE9937DE491074E8
+730F10F748A5CE5457C1BEF4FAA6076ACB47D09F1540B007F6955461FE0B5BB139B056F9
+E875645F534829F45272F455139793E9B981BB3A341AFF3FB86F1D8742E21BEE157FF6F1
+95F49388DB1962D02C6123BCDBFA074C79ED7D25DE52561FFAB3F2C66596192C8E7AB64F
+36DD8C71791E4100ABCD3673E030C4569D71B01AE2273528A9CE65585808493979D6A50A
+F7DB9DD63FAB942FC3DE27F489E293AD6F1320B3B543D783196CF1B0104F395CCC9EC9E0
+1958AA52841E26337473082045F412C00966157D7E9D2030CE567F26B28FB9F17657C66A
+6445C08C11D10F9489AB180CACBC438ADCA2294FE66768A91CE8973923E1AB9391B21077
+9BC49C284556AA43AE211FFDEB51717439B2EA3A3D40D90973E59D7317D441CB33E53DB7
+C3D6633830EEE93C247C12529B42781C063CE30E569DAEB7B1DF0D084805933332014327
+BE4210E496E0296CE29031739A9C36953D7D22406D0BF34DF927185AF6B12ED5B1F924B2
+C5FE617A01ED42B80063A811FAB8715521A9720A3E17FC9ADD2E7D05ACE07704C60A57A9
+0E0E92D114BE40225295D6CB16343F65FC32F1B94E87768C9A2FE1488DC722FFC12BBE3D
+43DF192948643B9C34F5C64AE7B45B91608400210276B0940CE89C706438C23DDF3DE9C4
+49B5DDF1B91B12F06D0005A034AAEF7BF1FA001AE74AA6193ADBD5BFF08C322A88A7401B
+EBFEAFB62F2CCE0C42F49C805AD12A9079762555BDFB8EA7B16451971B7D9D603B8D51B2
+CDFF603C21E14560DE7B58E5339F43852C16FE58AFD4992A3C4B317416B3C05BCE4DC6C5
+4AA4E323372EB65A376960D65315D9CEA4DEFFC57C77978CB17B23EA51474491A47E7B13
+DB75974F687DBAB38E00C2B7C2D0F940257E06904D1D306E839C279B04138D9A82634027
+C32E1F2DBD64F4CD1F85C16584ED7EDB378AB3176A1B89567B3C869E06D856D136B894ED
+81C97455B512BC8524E6BB4F73FE6A2C5AB5D0A826462CEBCA5ECDA0A536F4172A6E2DA2
+F40AD2EB15A8C259370B5491608363FF8CD2E483EB109EA99A2926CCF2B69A441BACC8E0
+E29BD93077B845130AB7CA801D7E2835305A35ACD17849DCD63EC0CCD8D7EF150AA57F10
+E22385D5C7081E3B3706C55565506276842BC8FCF9D5E0DA7A31D4FEA42DBB02DA6DC9DB
+306DBAD66BFB8BD873B29511C80795DA8925A39B9F545F312066B2ECB4971CB7DE33A523
+D2D515F0F53F7CA516F90B32E7AB152957637A57828EEF75438DB8B0FAA624E189E9BDA8
+4F2F2548FE361C5187BC8BAD76B4CB516117A868D23D8C1A718B0AD334A52876DB25EC12
+CC4390D2ECFA5AF25529C5398EB27A6ABFE464E8AD856FB6F4667EB469CAC615217D61F1
+DC9285464D69BC6AB75916452FDC50EAB4E16329113051FB4616CC5F32C75B6BF038A689
+F8176ECFC8F9A0AD38840811C2FC61D97548B49C193277A69BAB5A2B9FD01AC5EE282DB8
+47589B25D5834900AA8764931C0E478D49426CA1D37C77B2837FDF26B95B3CA302E24194
+BA91C0B745FC4F4C8F50178B1647CD1ED91B7352AEE76134ECDFB7126C64F6009C4A5472
+BB4B82D065DE67FA1B147E2D12C6D6101246F0F8856754281A9CC0E38A5865030A4E43EF
+C7DF8F2E3DC57CD1E98F8E675908BB77406E5F1F356881259254E4878437915657E29ECE
+BF8FDDCF48A3F2F2340C8590A23F1FA920CBD4ED5A0A1D5671B995202D22199F5EAA6AEC
+417703ABE38184F58E2A54D9A466C3FB0D8C173E116FCBA8B3EC46A124123582DBD7B819
+9AC4CC67A8BB1539703AE1AAD22B533FE2F166D00AFFE21DDB14E17242F5BB1DCCE076E3
+4FD61A3D9F828A8C48EA9CD3B2B86DD665E0495FCEEA0BB8C552789442BF24585D936658
+310B09F6E6FADE2DAAF60D2F92687EAB1384A1E4736288746E8A6B926AC373B5B86F491A
+284B98B078CAD7E9E83CE6683DE90D1EAF982C25E10854A9902BDC73EBB9E3DDBFA75DD0
+882392FEC80F18EC2239815845CC8B6F7E5CBA5024C5871E3E3B5DD5824BD0ED16BECCA8
+11241DFC1EA5F9FF07B0CF484154517C63BB149BDB1612F92607E69319BB7024CE655C00
+77A912B29F1CAE2A1E09315E1779F4D02FA7726DD53F35E34DFD70A8E87F784BDADF2B82
+08D29E97037F01424D2C6B39E4036CDAAFB15BE16B91E3F5F5389045A0E35BA378B0EE18
+1BF4DD9D1CABED505B7FE843DFF79F350D1EB159FBD0C44D70E29FB6FB71DC050EC75C48
+8CDE09AB600CFFBE16F192120AC87EC760F81A7CB732C87313A9E61CAC3F586FCD086136
+A25161709F85304DB2A82B370FF0E352DDC793C3C1CCDC5350F1A716909A481CC72338FC
+83E438D69861899BF9557DE2F26CF6273CC7B5B6BEACFFF9214448705D19863C3900A85E
+22FDAB1FF3D76DEB35C7DD9F3D8F7860A5A498A7CA6A9EE94A05E723FCF1A96E1C9F6EDE
+E05A580A4BBE79AB6D33F37300F97DE77F5DB7F1E2603ABBD065746947F798C1BD84AA01
+7D6DFE9319B24618E510D8D7D353715B3FC915FFC6293B7227EDD3AD041AEF1D02C831E9
+EEB9BF762E38A274700D5B0EB6F5ACA6160E958E275B420783E1384015A37BEBA1B7D88E
+68B57FB104CD2BFB8F63DE976B3152E559DDB0C98452BA6E38C7E98DFBBC791E73B0AE24
+0DF659BE573AFDEC02C18B18013B7A7BC5CAAA78B59B03B4DCF3FD9BA0C4BD019629408F
+466E45BC3B4E22AAB4F7A1F4069971784A11F97996E1E1488943DBDC34774F68DE34C32C
+6654CC2D1A3F8F11519FDA94B35AF93165D550AC4524191A9FCC9F8EFF112CEF9A1050BA
+9A76EFD7668C99BB98928AA3C1E536F429DE7049D2B378F9F8888FEF13B0C1BDB0E3CDD5
+FCE35AA9E8D89C5649A15DD97C753B4D37729CC00F28314A38FAD611F574C4C2CDB19436
+7215F7ECD06F6853F7A987E4C4F71D5C1284A4A18E4E51A2A00AE566FDD13075CEC497B2
+D9ABD79BA8C3ED1CD588831C6A22EF420A96B916427D2FDD9346C95F6D1A03D019646DCB
+CE7F2B0A32FBD6B230474E1EDB71266ABF6C3BC537CC1B120F3B224615A115773B03BF31
+E15B55F6A1D95015855C43CCBC674DEE0754E37E6F4578D51E6B214617C20AA74328EC23
+3529F3A27C30985608763772848E805F3B3D6F483454D90DD3345B376FBC9A9FFA404EF8
+80C3E6C143DD0753D60D688576D26E52F964891F107C31CDAE6BCF5F17EB17E20874657B
+45C7F3B45EB0EF69B6D2530332265F705B5507BA3F03BDF7A5E77242E05A3F68227CB56C
+DD83E304D95D27F1A20E9682805A132F962696A7847C36CAD820B8F23C8E328006A77430
+A5451CABA4ECF3169844BF6ED6080923461070C19DE53427920B382A70ACD5F7E97C924C
+207E4C7137AD01015F419254ACFC3EE2E6CE7C64218509815ABE5F3779DF85CCF3112572
+4746B4041C5CF34D49BEB532C9E044ABC69CE7164810E630CCDD4190F1BB44CA120CFB07
+114047E21A6E4FF55691630874012F0B610BB6813065FF950ECD45A1B2E5E87CD1F6F425
+9B2152B441ABB56772638FA07C92F85C6A21225F8E731F10C93B18AB280C1324401CF1A2
+F03A8A899BC59D9E5F50ADAC733F19A0F28E83D471F412CC4F4DCB0D92DEE1A9062C4204
+A3C3FF291ACD5349853C6E8C315AEADE790C6AA98F7C4F26AB8481DA3F72BE8F946BCF70
+83741FC4310B239A2C87C87AC399FD014E05326B9CC563507F52EF9A17B7E62B50BAA3B1
+6E8F22CB732E751C7F98CFA67B78DE287F94A2AE3477296002C87CE3040846C8B5B56EFA
+DC9D09626A448D984F074459805B8814BBEA470A0997C876BAB5DBD0953EBAB86AB245DB
+622797AFAFEDA9635276AD83EFCA4DEDD850F04B7F7E7849C6507F5CF0F4EBDBB01229B3
+AB5518D3430F9CFE62F7ABA27E4D8F637AAEA34BDA8034111B0A27FAA877E109EBDE5A0A
+FF0F3B1913D8FEECE04F228D2824638F634C8CB5AB62305CF37F8CD61D8AEAED6EBE5945
+F9057D3A1D5FE6AC1B79A794D2A252544193131F8C765F270DFE7D83FD059932408910B4
+DBA20709534857E518A3C269A23C0A205A64F7F66F5F59DCAF10CE8088E5B2E04AF9728D
+BDDF60B69E6529E04075A97B01487F809C8AEE075638042C239AECDE8BD4E10A9D691723
+30EAB97F699B1AAF1C709E9AD04A71DAF1D7B6C57D05792970612BBA0523E1DBEE336375
+7488A06584BE4A12588DA07D46CE95D04377DCED2A92F60FEC694EDE31C5330B63BA0C56
+F2A9D91DC81B8A4EFB0B8C5E72967BC23F28B6F5D0A4CE4567557DF6605B80F478D22D21
+05162676E5FA606F454D749EC4FCA12941CE88A07944119B2038B33C5893137C7A17C960
+CC77397BD5FE74422425F9B6455E357EAA78CCA0E8358FEFB3B49E1D372FAEA6F6B29F86
+031B3E15B6A8DDF2C740A47B354CC4926070D7477ABB8281800F867240550141B5CF4E11
+8BDA122B047F8EF6F56707545F82214BEBABE9F0F7D47CBC22A6376BBD9A3BE995B56660
+AA8BC92E6CCC9ABCCDD424873C8718C4FC9FCF8D0F589D891BB10CDE9F88052CE452AE9B
+7337EC5263125358C2C4367745E43F11583C978627B01A8412AFECBA154EFA3222615570
+3F0A7DB5C014A044B0AF4E8C7B031C962B189B4010E5A224A93EA314F58A56FCA2CAF1A3
+D5D7AE10E0DFAD4180883116D6D4E53D4960C0F659A14C6306B3109045212125939AC176
+F6C047B695E0286982DE4CB8AE41D9565822218F1BF1D83C89DBCAFE51DD9F2508044051
+6AD1748A6061E3F404B834641EF8B057B0A61B979BC7E6CF722133230408E4CBE07BBB89
+80E886F0AC252D7F73538BC685074FE13680AF9319D4B3A8004BD772EE16063318523F87
+0A49B31B0F2D9EFCADBC90AECD1F741B52AEC01F4E9BFFF2C92E2D01AB3ECD265BCAF686
+216E4A35EA622FFE6723FCBCE5E9045D782F3CB876BB23C705914A31F301F8A04AA2E920
+0912AB82E5EFC7279483C9059928D43F70A4C78C79B2B63D1340DE2B0E1DCD9F62ABFE08
+4FB0A04321DD7A4A7849995FC02080C04CD40E80669E3B39373F4E8135642118E3903FB0
+BB20EB0A90F509A21625BAD284B35434083EEB5875E9D8AC1F3F89A50FB10820677DAA41
+1E39A161481B39E87DDEE97D687202BA96B73CA52DCB6DE2AB20901BE947BA3706AB1FFA
+A703A1B75A5412CEBBC944112C3C02E54AC94779BA08DDEBC2F288C906BF19B9BFB5FEF7
+3EE5A95C47F5B93082381049BF206238B6DD14AE1FDDE9E26E44B999344D986BF820B627
+51872737F0F47CDA3A03C0C72019327FCC85735F5B13A3341E43AF2767B22AD906E2C021
+C8282FAD84D551386F84A09F6E8F0AA5284EF8C04933A65001DF809E5A0364C0A8A1088C
+9D47C1E915638AD1CF799034E23B8681B7B37ABB767938D8A90D6112C33A2704752CCB0E
+43C86D0083CE84C6BC174B484211EBAC5AE7E3AAC919DA3D042C9EBF10EEE2EC4A5F6FD0
+89BDA7E45BACE0E72F8AF1C26F280D4887DF53341B37223D36A1E3640FBAB7055F5B2AD4
+E054A99C9F77B24E0B585B6A1C1A31987BD694BAB47840FF4715C7952D646F0739933475
+789501313FCF6BEED84A299054E25324519B574EC7392F49F52B0AD9652F5FC3A03A95EB
+0C86C0DE56AEB99F1A0B6AD75F39802BBC1C148A1FC5517FB892C3F5CB074F0CD73DE1EB
+F01BDBAFC7BBC813663E8F7E906BA3DF0ACF1C7DD5EF315E8770EA78E0EDF489D3893FFA
+2C763DA3D765B05D429C70A027D1B239DCF0C0B250A3A9993E670844A89AEEAD69F7060E
+3ED50362C4672F8F0A2A00B961A1B30D3BCCBA91D99479AEE1B018585BD9BBE59E2CBAB8
+C9084BB94F1C0210FEFF15F4D00511EAE59B160E3494A59910A5FA083AFD14D237E0DD11
+8E79F35475C6505E07E2DAC40873EE34C93C35E1DCE1362C3C0D985054343234EF90D922
+20C5B2AB09D49C9A32AC72F87FEBA787951AD73F35B89F5692D75A538516E56A3D50AC2E
+032C112A2483D912F42D6ACDB6D59CF7E10F93120092A6D792345CD77537F58EFB3069DE
+2C40B60D07DD46F6964B29253CBBA52B7BA58BF99C527C11D0E34D6B1B6235BA561B3907
+7A3131110B532CBBC7CA230EFFA3DEFBAF35CA06D8DE4A65BEFEE4F8672DE8901A88F11B
+1DC66FAD9E9E75E945E3F5DF39A79A4C32F142F1707C38FC7BAAC1607D612232A2B92CE0
+8A1C4892CBE5D5F0C438018D3972F7A2D9FE9C8FF174098E8179BE266A85D8066BDEFC25
+B2F5F961505205DE4E07154A8B766FC85EF3DDB9059F6AB362B35CEF420199B97192AB34
+99C5E587479DD5596D17578137D6D4AFA461E2077554D011D0CAA330927B3D5D1BDF6EFA
+97356CB3CD7196FA45AB9CEC436030C70373BB1456CCF1A77F9575B1C956FFD6B3D28565
+9D81E79F4DC6702C133912C4E0CFC6D29DAEDA0D5EABED6CA81521544EC0F1F380551971
+8CBE74842B7E7E4266EAB0D9A32AF80E671C5FEA05DE046077E7AD2E92FF560F87539941
+F713324F052E727114632AD220377B3A04AF0A4AA6508C00DB054D8AE3D80FB7199813C5
+B99FD75ADFCBE08DDAD26CFF7DDC7114D2255E3E7A1E936EE352F4BC8ED78057E8BDF3DA
+3845DBC9F507D99FE489921976EBF717644BA09604E60DEC3DC64D67220EB16D84728DBD
+72A7AFA1EFE9A08A449BBA3C306C272C1E9A02EC3DEBEF42F11F14DD560E1F5C1AE4C383
+27A0D8D226BB45E87EA9779E5DF135EDAB9DA8C872634E796CC98B3E78CA2F9C7677AE64
+D111F3CBA6F8DBCB11EFB9F763DC4C35DF4B28A3B1B36933DABED5F43FF4C0F8CE85FF4A
+3A33781A7CFAC82D1D3FE4FB8786D3808A7EDF2D917BEA2D871D94E78930E6942A8EC98C
+51055037C0F366B9B613B47122CE5DEAE6DD906EFE24E3850EF1FA39C61C9CBC01440EFF
+F78061F69971E1BE4466295C0460ABF7EDEE44F52FDF868CB5E02232E615D2C02D044185
+FB55F3AC6019BA5A5DB686FF25BC2988C41C9AC30C99EB016CACC5B73FCB68EF98BD5786
+C6794F13E6CD93D5B115C379831890C1E29ADBFEDC356090CD35064F73D427AC6C06965E
+B41C8499D15793D4C92C949D56722E8F671CE37247E9C8BDEE2300893BE559A9DC404A2A
+531CCEE5774E81E871D3B6EBF22E5A89788084735341923351F548C1C1BFD80CE5E16A6C
+69D899D7E70A1C264CA201630F767DCA04C1F2E86CB2EE341899F1A0F7B194FF24C3D1B7
+D1ED114505814121E75BD3BCE369EED5D7814CA8E0E65ABB2671DD4D5432CD2F3EA57ADD
+B1569AA5C83924E9CB6ED278501B6AC4FC3942F84AC9367A4846BFE2C181EA417240A831
+D15245D4DD207A21FE96AC02944DE5826C6A951A15739CB072EB317A7FF5B9B9B94A2070
+3C319C946D614F4C2CB826DA9C396BC25FB4FB82C8A240E6014FB95DD149E374D1E1BEE2
+8472B65B376071DB0BD31E1200518B191FFE0ED6DA779B783A29EE54D02787F70E9C10F4
+99448EC160D722554586CC7F4F738B8C967352A7E608E379124715DA96A51C3FA3655BCD
+BC06F6E98DACB08B25FEF7DA3370D282A778AC9856AC31682FCE0512B7D9BE1750AF7A17
+9612928F1FC9C302BC22ED67A63C1574BF1D216DB66745ABAC0905A06270D3EA99D547EF
+29CC455238F45220D2451C6E43D32F668C91C33F89DF6A067A4D3944CE792DF0EF290577
+1A4BAE8E4A62F97C63394E85388DBE00F9C42E4EB681BF996FB4BBD5893C60B4F11AB5FF
+40BD4703DCEEDF55F763D1AC859F33BD43CB810336A0989768EF72DA5571DFEA868053E8
+B8FD1C09C592DDDA4834F7CFFB3A10AEC6691B813B5E0602BEFD253ECE46AAF8A8970E46
+BDFB4B34952BACFACF9868613361D0FE2E2711E34F18C5BFC9159B806A989B2C8D35CE05
+4C60713538CC5A56D110A28312EA1CCEE42DDC418AD616FCFE1EBAB59DABC30B53739DAE
+8C53A9A085590EBDB98D8F7B9967639A9D5CF09C91D45DB5E0BF2687BD15762726047C2A
+AFCF3B1BFA51B9E0FAF09D3DB7E23F5FDD0EB7A0BB45CC7A3A8A1B6399BB455637034C5D
+E0C1C2533CAACC493AA4E06835EF808B656F698DABFE35FD446969D8F077BD9DE7B97E57
+301AFFDDC544267137560EA5E95ECD28F417688C9437022409523DBD101C22F107818541
+BBD1BCF2DA1EAF428C8C349519A113EAA64D8F4532230D70106C309BA8204D2CCED64F74
+3CB7FFBF73BAD66FC9AE3ED873D12A7FCE64B8B6AACE0AD00E0E095F3A204F04AD466F3F
+C77F03C85B49FCCFD4EE7BF66E6688460B6C572DEE77EB3D41BB5AE4A7A6644397A68660
+72D4D3CC2D03A1E190B63785820E8EEBB575F6164B29C1CF02BC9951B10E26830539B081
+FDA50ABDE4AA94FAD6545D61F908A89331A8F43EA42C7BDA182E9E6E94D8919886381B6B
+BD5D96ADBE39CA2FF7533B32F00173FB60D064331C2E72D8A7C8220FF128D79199958673
+0A82754F1B09407F29FE0ADE2A0F2BFF8266C1ECE453D934012D17E4475771868F6902D5
+C8B99C8E4F1B335AC15CBBBB22B0E8670FDA527DB0A485CC24E3F9E77E10DEEAAF6731FF
+C2F2AC36362969887B1ABAB0D9FDC52A2FF449A0848EBD66EADA3799C61D8CECF878F921
+147CE7E7CE33A74411748044B6CE7EBA064C254F76A61DBB7CE2F657FF6722AC493DE136
+E33D2271F2B5E24F16A5482A82ED40F42BAC70A862CD9A68DC031588CE2CCA21564420C4
+F90FBA1500BD4F1AF792745801332D23C5EF02645BB90B3738DC15CABC31C9A9B51EF9F7
+4EF8DF65809BB1FBAACBB16448147308888E710C979A6E7F9EDBBB6EC73A061A23878892
+0A304F1DCA0F08DDEA7C45D5106CC4AF23CD83E51BF14E4FDA722A5A6EDCA9DDCBBE20B8
+C64AE798B3DCDCAD1D6C6146EA238257340FC719DFED7B0DCE95DC66C65A578BF8FB8A19
+816CF4EDCFF7F26DB3690E6BAAC1BF51AEFAAD20D876B0AB3E3B99210CD40E55B7056C3E
+4A1ECEE2191DC40711451CA9CB97ADB7AFD02FDDE7C66BDEF012E9445BC6A3A4FAD1A127
+0B5F29602CEC605ACEFB7E5F816A4B380098FEC6DBE1EF20C7AC2341387A83037D5C777C
+5239ACB3CFF86BEAA3F174766191BFB8B9D96FD6AE992A3223840AA663A868CCD3B0E3D1
+478DE133B4D7805273D12172A47B3FAB9EC788C31FBAEA4B1B694307FB28B3BF6D9CE353
+CD8185F2155B4C37624B5FBA367BC63B4F108BE7CF5DF9C4036A460E42C7CC41AF628494
+6109C42D166BBA31537B2B72FE22F81E7445CAF0EB1E086FDE01DCB5315C4739B1756291
+0C38232BDA477000E34227BF85A819B63D49564628F9712094FE231644FB34D9B4E78B8D
+1C73FD9E1CBE00C77DC12B7B371E6E5FEE9427EF0D89B11F2168EC3DFD26CAA318F0C0CF
+BD760BD68C47653AC9393A2C1AEBF2CFEDD31ADBF76A41C88D8B894A90B341DFB260500A
+72892F2FA90195DD01F9A0B7417FF606F9B7A06647A296E1CB57AF0897315CC6A939FC7E
+76C106FFF75A4DB527146FF8774769BD3E1C7A8A5E1073EEB94124FE1FD13EC4806B7634
+9DDB3B6567501D98C603874980B71D203F0F1E95D92688DF2410D94B6B8A0A168577CB91
+6108C251697497D992D46AF08F9E8DE53D9AB752AEA16D1B8CF4C224B031597C6157C039
+C18E86F3490E00036DC080E9A669D9B262831BD68C00C585AC8A327307EB98BB0EEDC898
+2B8E72E64B7A0AFFDEE4166907FF278ED0356DF19AE80B6FDA1E6D196E161FE54EE1E79E
+60F7262E70C24F7A5EE2DB3AACFAF8C19FA43309F497822383E7EDF8E061C48A34BAD2A7
+721FC37BD24EAC618BBD7B20F88ED106C5BABB4515C533C5D5CD8896C842996E79756AF0
+656159CBF9332A377646C2FDDBEDA486D2EFD429DDF19193AB59E24BA1878731DB4D1242
+3607C7FABCB9A8D6F023F7767148928E092FEB5267D7B618CC0D52BA4FAC1F3A2D002240
+1AECC4B04E6D40BA3631FD7D9A4A3299E8FE132AF22B181D72B1A4DC9308F3E9DF4AE93E
+59F69D3B68C015E4D6100982F38EC5C9E1A46A92B86631D475B9D8065FBC3B89E6A29122
+82FA60FB673990010479A140F1911EC1590B8A73A51A424775CA9111DAF5796D7FE7B0DB
+EA1A111BA7CC9E6EC8F5179ADB102917F088B8ECFF4149E38E524685370EC2E05C55B7BE
+B66EFBE28642000065B8CD5F4DF48499E3F161A06E4F8138C28A743FA81FF552AFE1448D
+1417F86C748B538FC617EA64CCFC396889D98BD91317308DA9720247E9F7E170E1DD33E0
+BE939416CFBD58A03AC9651F3132D1572C7757B5101F66F98B947BE5A4F0A6C1C50CBFAC
+FF1285B8F649BAD9A17CD758867647B3E9DDD8E12CC6A0AA3D545F5C7678EA814E35A675
+53566FB43A846764D17DEBDF31CEF6196171F682FF51D674CF1D3C4C94A43AA8E8A04468
+5FFA2FC930CE2E2422224E69FBA608FCD1DC30546650EB058AFA5EE83CDEF1DADCFD45A7
+F986FCD3063F4878A2B092E0F443CDDE6197638B673576D9D2519EF8EAD2CC79E212C612
+FA55553F2DC0B0D2D0D3BF212A4355B96DC5EEB4B1ED29B60A51A3C6EAB355AB5636BF00
+31B695B3DBB1DFF99BD5198611D0AC6B2E256FCCAA7BAB3DF080675C9395AEDD5C0D6231
+8C16426E5A46B73347182EC1B1EDC035E6595DABC1749F551A8EC7A7ED3D83197C2EBA55
+AE71F7C5D2FCF85D9ACB8393343F7E8A148CF4750542DFDF2551969640FE3D1EB0C9E046
+A1D31C3E8F4344180E5E18A4D4DD81C27C3D5044ECC29A3F4858B83390EF9653B685EFE7
+C294849FAE72CAEE7A22A20299A925F8D647DFCBEF0C89D85ECFAAB5D979183C0B8A056B
+77A6DA8D9F43530B400C4639FBCA966BCC99567BE42F6B9C727C2BF5DDB74A6833F16A52
+D4B8AB50257ED9531764E833A936D106733A2DF9C4BD65837C520ACA9FA6FCB524CB3FDB
+6D17746E503EFEF92F92E5F5DA924236E635D9F222E2A8504248EEDB16328D2248A9C82C
+BC90407D908B1AFA56CE2F170B0C51BA1E142D4B477E8D572456A3125320F0B8E3DC55E1
+74BE5F1A01784925C9F1732DCC01E60E87B15958B4E6160F1048E7E74B3C7D6131120BC0
+9539446F7B96CFE85DACE0CFE0FB1A1BCD1D72030D31E6FC548F7C790B2E30F4B45490D0
+EC5883BCE20065B4286676CDFBD1000094EDBBA2D4158BFACF4CA05E5E0CC0A98D4ED845
+FD5058994169F60CF8B89D9C0632E5902E8E46498170CE3B04848D870EAF4812E88931E5
+890459C7BE1988C10CCEE2DBC769C356B9E9FC609FF05277CEE6A13D95B907E2A1396F7D
+D08498CFC89A22E639BE4228BD40F524832E649A06604EFE5CB849E79EE3BCBF9A8B1179
+A491428B5F10C49D985D56315356EDCE92F697D06621B659BC46625263A7293A4875E40D
+FA5987E834D25036C71D06776C55F9F58ABE200832E4C812FB31014CFD8C6504F4EE8FEF
+1FA4D35D9826BCD8076EB51DBBBEA48327DE5169FBDD93E68E6AD270FDB62A49B8901A5C
+0A98C1A417D08E090F400F632DE7AAF2CCD7C6E24479C8B6DB5FE50B9EA31B1E6D21D567
+858603F4F70FC29195E31E5C4FDF06FF250B4EE77220787D8A0708094FE27A360DC36A17
+4FA111084290FF64CED4C5BC7B557E51EAB9B33F5C261F77325401D06E7C22BDF4E1998F
+C7FB0EF1A61DB458F0CF1104BB7C33E14FF8D280EAE1B0C5A97BE98C94B29921F6AC7FB4
+85AFCBBD8DFB6BD11E939CA0797E59B7927F70A66AEAD290A12D0C1567DADA00D526B507
+9E274C26D591329B8A308F0910751E9256EBEA3570B4E3360128E7738B4E1E738186CCD6
+992274AEB86B3F4AEAC2DB4897F452565E43F09DD6B562961D96CF90E69F8BC3EE5CC264
+5BEF29DD2D42A85C7072EE95F8108B088EBED159CA603394266FCD52C301D20F1CB94DBE
+3A5F9DB3939AE6B26AE88D5DA3302B2EB1A0E3EE48CCF96D49F5CB077D7DFCFDBE4CFCE2
+BBA2C75591876526DF26F6B6D9E25E07696D1ADD9E20530F7A4B80FF2677011928E621AF
+5243C85893AB9A0E39E6459FEA333A9E6F83C9B6637D332CA02B5CFAF378FFE20EAD913F
+9C40507A8865646C56025EE002D922EDC72EB1F58DE45154725399FBC466EAE6365C185A
+8FFF5EC8E240FC047ECF885F84DB9B74CEBFEE8257C1AC4A6AE6A2A05B731B4CD8BBA4BC
+8FC667C151DC168D250C11A1A4BDA07B4206B34506B60BCD5098B2B9B9CB2194D95EDC8A
+0E8D5702B0FDDF6328820B4C40BDE23CE0C9C7922464C87D830462AF27578A0E8D8211CC
+A871C9234675480B3535B67828BA4EB860B176B33744FD60BE5EBE3F7ADEEE13EFC60399
+54B9754A0C58ED6F8FEA43891002DFB001DD8E43C99B8F4509DE4784136B3A5279BC6BAE
+CF4AC462B4BEAD76B93087CDE7FA48EF595E19969E3300233E859FA92359464A9A04F956
+5722B977D1D956FE1ABEF953C6645DAC88E6D3A3CBD944D5076D2E2C0498104A5241EB4E
+1C8E59958E6055F7EC9C577D2427488B8F6F8FFDB12EA78121B0748DBAB9A663C130A169
+5F9661F63FDB86B27DC3AD0B2592E7E34EC7E171712DD12E4E1A3FA04CB3369DC4B86440
+D8A9275700EEAB0CA72924A4855D24827A98C9FA2DA724300E37696581F40C2698E2BB9E
+08B7CFC6BA04004D78688292214C191B0D6764595119620B9360FC8222366C1ECF4AC351
+081F4EE4B2F3271F8E5E2020E866D487B492F579C748182DA5BD5C2B6D3384BD820584FA
+1D7DEC794BCB2E75808618DEA60D1361A0470D66E6610BF0D55C20AF2BC9ED0F53A73B26
+9E92678E75BB469AF63CAEC36EFC70BA9A2BE90DB1F92E4087D68D0DE9E881F0FA88C988
+81A4D1EB7E52BFDE0D6B8C07B225373BB2364E277D225B61A158ED063D7B2A3042FB41A4
+ED23C97F79321D87D8A94A5A2C0417A2621FFCB5F04427904CFAADD1986D4BB8169E87CA
+B3AC1E6A68F9EF1353517C552F5D9B94177902FC0D603918F459923402BFBD201E230953
+627F0DB812D648560C52BACAD7DD1B32E3095D34BB120139CA49847CC864F007E04ECEF1
+C11DE6540ED4357454DCDE00150DE168A244A66C43478899B3F544F52CC65C41271A2934
+388DBA38881CC8B4384CB197A33E863D17189853B3E9531D8FA250F976F6447593EA4847
+E1F4880EFBE82CBE5E841A2606A57D7F831A18805C3ABD1D3D26CB382F3EF16DB8697F1B
+0759FBA5B781A5F2453506F311A3689E6725AE3AF6FBC186BDEA6420D4CAAF1BCC214D7C
+CE50A1B4E021AB15D78A8D0646D6C745EAA2D0D2DA3642C1C644ED4C28F3BCDECD33A2C5
+06F1FA69820F18EFA84A47A9B177B42D3FA2AA82A2293683E55FFEDD0A764ABC1826012A
+185535467DE9F9008D7763AB58BBE0BA7802C32CD69971BE8E4AE33F6227200CF1CA22EE
+3E4EAF6AC6A8CE15E6B42A84F16F142400A1621433FF10A5DBC0021FC698C465F5CD5040
+E302B3D59FDE7EC0A5856E1FE08C7FDE15D863F3691ABF4FB13DE2296CA5D65D2230BE6B
+6AFF08DA3B2775B3AD19E9D7CA7337A1F7BE70B59879A1BEF24399D1C1FD52BB32FF734C
+89381409E66EAFBA40307C282D4B2266F9C42BB042258B761802F5D03926E33E5CBB72B0
+9B45407807E4C7A5A8295814D78FBA7230F0F3F5E16FA649EE240FBDB1B2A7C669FC18A4
+1E5F9C1A2B61755D764B6E0F58ECEA1866DAB57B8DCD0C7F47B8F4C88AFD10186386EE62
+787E721A6DC1CC5AADED1738FDA818C408EDCAA89283E26AC1B7B833C6F37CCD6732BBE9
+2BAB5212772ABEFE8453001FFA3106F00B47E98E6383E0FAC908CF39A797EC684C207345
+B18641D0DED9452CE51CEC330BBC007E79D471556979656B1A1B5B7873E411A3CC2D1B02
+E1684AC1752CF9D6C642B76F07052E658E91087BEAABB45E54FBCC9BCD4B07F12CB9F4AC
+3A27D4CA499A55EC923CB7D1B1580B7F6FB294693C84C61660F02F8696C1E66C74A40431
+41B8E28DB9A50357E80B138EE105725DD5FE7B5165156A8EE540C427F9A2D408C4ED72CE
+57A1DC29F937E9D1EEC621421111A1E4F9FC0365C57471A8275852B4F45BA6A00761ECF4
+3D08A75538DBFD67CCEFBB6A1CA0F5333D3FC7C65771C19E1E8B92573A5AE90C385AF784
+CA365BD8808F4D389DC7F6A606F098BF3DDB1F92E99BC64667F24648A7D821B1FF4B6B4E
+6DAC7538CA2A9F02798BFAE0876263026A0C6FFC9BC9B6DFDF77604AE25AC4D19BABCA45
+8D6F4611FBA37A7CC9793E28739134CB42FAB8736F74F1632BA8249A9220C3332A16DAA7
+1E938D6C19C43F8F606D024CBF72976346A648F6D63E456FAC5F408B7A35AD2A7C3A0938
+22E795C6DDD09E95EEDB5FABE5C4D0060656A8D7111D2FBC95B86CD2574247671F143BCA
+A8CD277178F4BA7541A3CE6052186A6D0040C1B25C222B5CB77D81A102777BE6E998FADC
+759AB869C9320998AE60259DD4FD90E8090743BDFD487B6985837FD3AD619C3681607B5F
+515C35BB9945D5C44C3A2061410DC169E5C9473F093E41929AE2DA81ED037A9D3FAAD308
+35759ACB73ACD4AB9A618E38B5E77D87A304385AB35C01B43BC4F343716D84E50B83CB7C
+885571C08262ABE0024984645EB57CB5EE80AF756CF5A743FDF3BB11C93FB070D6167F66
+05E91C98B114A1C578F0E432571743ED01D66F1FFED6A955E8C9FA9A8CAF6BEAD2F1B57D
+52CA5CD175A73A0EBF2FDA49B50014E3C2B144EC3DED7B776E604C3709281D53FB4B12A7
+4FA4D90A9A71AF398CD16B9708B357B46555A2003DAF1A26650C0626AF7A2CEEAAA4C845
+F5A854C982AFF1AF183D73DB969B3FB7FD361C3EFA00E565FF18AE7176F8D48E4C6295B0
+E16AC1EE7921E5D5E868FCBCEF8671FE34F5E4DDFF20D12169BBC56E869AB8E65320BFFB
+C32C32334CDADE31BFDF2D2C9C2BF48FC788C01CF0AC1E454302F827C9C0134B47577D17
+76C2A4068E272D1EE5E98D2BB4D144174324FD95C3BD0111B8BC5B3F38A282607B487B0B
+ECDCD90AF2246A937EAD10A3A00E389B86B19D76D2B14307CDEB5C2645D8A00DE5122FB6
+2E0E9ED63C45B6E5BACB800D27AEF0DCC7395CE4FBB7408EBAFAF763A5010999BEB85204
+56AC59FD5C26A0DCA5AAFA8DF09F512E1989AA450729B7CC53DA75695BF60C575B5B47DA
+0AE1901E8102D6CBCCB0D652BAB7B36A09B3874D28B1386B1315D7096DB20CEF1A931D89
+FA98A3CCC11256F254E38265BE5387E67CE6045FEE7172BF42AE5E56A7611B89F82601B0
+73B6A590E119C3AC0E1ABEE8FD00CC4BE442FCEA8DFA3C7B8320312F31E6CA992CDB0BE3
+33470D14BD729A998326EBA2A1A7E9BA1CDF109B0D99E372CA9E0247BB39B87460337247
+77CB4882AD3D7294A4243FF82044DFD3D8A95061C1CE4999195182A672F5EE6D4F6F4385
+2962B03CB573A5312F7ABD08D960489C67F5A0BAD393792B1CE9F48DC5350D6994E03D38
+213536EFEE813D6E80AE77C005FE13887F4C1F77C42C49209A84DC4446CA1105CF2DE873
+12648D57AC6E69182E6A1CD6E0D0446CE8BE125EA7CB9B7F948C14FBEDBB96F4AA678C5A
+9B26219A2D6207228B56124CA574576DD2EB74C858414941A9AB5CCCEF089B2C805E5C18
+41DEAA6AAB18F9B1441665C471DDC1262C45B615A6D56F2B041EA997822C0F7A8D920316
+20204172E8485087082E0D4A82C05628EE7D4E5D06FABE541BA61E1059262F1F72E73EBD
+E6B4240B4765D3DF176F34067AAD06B96E3472599AE0B788B4210C8A8774DA9D3B363661
+376054BC96A1AAB5526AE05AA83D678B36F7669FCA2664B67C6AC8325353451D953DA3F1
+EFA0BCB7A40C4A74E846594A9E3030BFB51F6AFDEFC845647F07E7CDB03C8E1D0C635234
+1D72BF74913FF72EB6974449A1A2F57EF536115CAE3F0DE6F2F02132F85B77EBC2D502DB
+F29D1097E8CC5753FB621B30805B0DF2BAEF9669DAFD537B797E6D0DCE130D304D98D7EA
+DB28132660552174A2C9E71F7AA8C578E03D488A7FB5B4A62EA85E012D1A65CED729A30E
+7B6BA9CE4178F3290FA27D86F0A79F05CD04420A0A4C3D4DBA308FD2601C3B53BADC044E
+7DFAA6487B610C3BCB2383E956D6CFD152E40486A70C1FA187EC13F54771351545AF670D
+5D0E1E8D0FF1095285EC0D814CB425151836F5590726D765F41674418FCCE1AB4DFE3188
+58D018323FD46EBFAB59536657B4A983A43D77A382F11E5DFE7799DF4E56B96B1AFBC0E4
+15ABF51A6E71AD7195DB0B3A4615C18A96359C8A4A629316177535AD11C5B08ED8B9255C
+D96FA63A075DC2202B580462A3A0B95050333B0A790DF2F85EB2495054E9C01C29D37922
+4EB6E11AC9BF7D4291D099DBF5A90B0D9C55BA3941F7B55360251142DA6A70C4F96D2428
+E03B42616B5581EB3DD5D27083DD15DA06EF8554574BD1FAF622EE02BF94F2483F25E442
+E754D33DFAEC10324C14767C2F090CBD8EA8945116549D2F2F26CA3F2853C61242B94ECE
+EF2C696DAE5AF7E1FFEB5C014020F30ED16E38333766D73D1DAF5D94A52276BFB167F477
+1F5129A535C70DBB30FE25F5821F12CD6869DAFD32C465E148502518975ED2E62E38A430
+5A9FA1BB0965595C5D7FC980CA18D31497EC472783BDAB85F87047436861E0EF19E89F76
+2A2E1CD3FA0946864EF443DC5CAF41A97B39710A1D2C7ACB6DBE520C8BF6039B0396E38C
+FF9C1163A535CB56DA5349C97480C1D69A64070F68D6E018CB5C3D431284F2625E736685
+B1A8A038451F9FBB59364266C835BE806C59C29B75E003C8CCC8E6312C96B2AABE0C21DF
+3BD57B8189E69014ECF7D1A46C019247ACA81F4E79BA145BF11DAE4A54DBAD7B5E01FB3A
+8E5A98C68A66623770B35B6D6E243189370A48668BCC2A86B7B00504E4FE192580ABF598
+4D772BAD00496C0B09E07B73B1DA5D7AB974014B96A97B9A576B40353AA52C5A620B03C8
+E077B327848E717BCC6BBFB9A8EE85BDADED84FCA482F93DDA8B459640344FCC4BCCCC36
+B36D47FB7EEE95DADF5DC838C2BD7BC8EACCC754F5ED3B8725750B44D509B3E58F54E2F2
+3796771A630649392E2A4805F1E0DCE49F851929CB7A0D9535F0E5A2777F6EFC0A44582D
+BD7D9C245B77334AD67C841FF061BDE021CBBA6660C641629B84F099051FC7AF83B82E63
+10C7A73FADC8DA3B81263887AE843DCA21F60FFD984735A52F0AA7FCFC59C3FE16CA19A0
+0E12710CB6974730043C289F97F1371CC1F3245AA4DB2DA3C34A76C63F75848EF5FE7303
+27C1DA6A8F8F6EF3B88A5449197400BE590DF1B3A85CCF4D24287459FD87A87C2F363D2C
+5D12954C699E82D3F63A0133ADDF0902145CFAB667BC41083CE188183F90DD69C5D2829B
+51F3D0A23D9D526689474301C968591CF65F1F2A5981CF6886EF794917F1C9FC6961C7F8
+D53A959F7F94B2D6AB1CD5BC34A806E8E601B49B425C0CCA72E57DC12C71005D721B8BD3
+2E2600DD049034F3CAF2554950853BF808A18B865C9E383DE785E2E83A2428E609589636
+676397303CC7E6BFAC34DCBC109002AD522731DA632A4E41DBE20262328712FF9346A6D9
+EC3EAD0AB32323E5B430A648C387E263902C64214FDCD8E3FBE94C92AD3D621279BD9E26
+C376A9DDA4C3D401348636F43CBCC10F8466F38FB77AE0F56DBD8A0E09FEC26692E7F36E
+59D36C38F982958D824A54E80164BF8090B465A69AA6E5DA991EC14371AE15A6BEDABC7C
+6C328F52FAC384A1236369A6B1BE13657B779AFFC42DD016360C6963AD615B8400867B53
+50F26A3D4AE9CFAEE4CEE13F281F5BAFA3C7B4A174B9FDF809B1244B26E5D74C26B805DD
+8B4C7F0B60632923C82BBDE980720E1EF108145C7596CE6895FD5BB2CEB24A5DEDCBC6D5
+29B234DBD8E3F67194C7A7939B980A9B3666D827FE48DEB0FCACA6BE0319244D5FEB8992
+FBC3A1986467D1D6B5EC3E44816CF5538264EBBC4E2B057FF8FE1A557A762B9856444B16
+E738DF814C924F67449B8DA3EC768B9C6DD2B484DBBCD2B9EDE2AC064B00964582C979C0
+9C90EE17B9C9ABD2233EA165869D9328468DB2C5C9A036EE72A4F6B9E8A26D1A2EDC8E2F
+D357C902E2B8F255275EC483722B6DC27295B5008F5802511BAC5011B388BE9C85B1512B
+2F6316F3B824C3984068A665BAAE62189D0707BF8D0F5A8622E42E37497D2041FDEF6783
+B923BFD47358F6A7F9D0EAA970B25454A341ED197EB96EFA16EEB9B8A59EA8FE3C284E21
+437B509922F9959AC3FC9A0608F6149D2433E75794B23FC9957CC5E3F28057888EDA3D4E
+3040EA5BB3E01441237ED288189B6C572BB237D77BFF68E554464C3170635D064817CC62
+6554BB6872555DF438A26A93C4192618CEF8BDA62A27D034549DB4DF5324FA2922647469
+B04024EE4140616B8D25C7B75E30576AC8BF7F6038DF17F5D523D7679E98DD5F778C5A79
+498A642353365B0D9B4F0C8C229EF6FC591A066CB4D05007527273CB9C143F0A19B6E6F1
+E5E3BFCFECA6C2E78C5A292FEF4791BBA76D68511EE01585A4F9C80DB535D4B08611B701
+1C3BA1C4B044D26E6D92E9CD2EBB14F1CB36B38D916C4D0B6F15041C87C2197E924AC416
+AE1E0FB91EB02596C785B7E4E874CF14265F1C129668E282EDEC9A8E2004DBCBD4C1FE70
+C988F4434269630CDCF57E984ADFBD4F4FA83DE7CA922E4D05E82931A29117D5CF8F0849
+18E751536A4CAC19A9487FCB05327404AABD8A25125EDF9003DC07D3E1256F62BCA87DA8
+D501DCC0B20D6FDBF4CE4D3058E5B3570897256B99470BA08632B1C6752422E724CB7DBD
+BD4C528150EA909C4F85FB0B55AE7F42F1936B8FB2B76C190CDA26583620FBF92CE75F12
+3E7B8416C09AD2E2343A20F2A87E67E58E6B8A3C4D2DB421CD13D049FB5D4374C9B8E364
+58D96CE8ACDC4695800908B7527704262546DAA1A4BBFF0809138E7519C708FE3402691C
+F7032BD3397F63F1CD20D887D0003341276534E936DA0089099BF8FE24BE7BF5DE26A2D2
+21F6B0A389AE63D0616D650499D40F555BC2BCE3D252B3A357EAAEE3A0D04CECC00D1A21
+0087D59BDCC2BFDC85CCC0B91D6995F833F5BF643CF918CFC42B3AC50EA874AE5923E84A
+74C91B5EFCA4F114EDBC153AD97B4F46DC23DFE0476ED5F56C1D30B221812A08F0E438FF
+C319E84097132FE0E81A425AF771752F00270681F9BFEC2B750B57697CC0804AD7F5165F
+9FF7782AE65449808E010DA07C7BBF941C5B3A7902256A64C70E66E98A41731BD48168F0
+24C0E586C2EC18AEC6E08818F2CAB70BA721EF53A7BAF26F58961BAC555017D2B9DFC158
+AB875CAF6E28BC4E7786C214FE92E7C490D6DA34CC750AE5B5C145128C5DA7275ADBCB4E
+50983EAED02DB9E265790C747963CB33763584C38A9AFCDCCBBFC4B67E1055E555333785
+6FD9B7DB0E036ACD6F55622D85ECF7C3056481BBF39A1E6E116C152D57C6E51177D3B7D5
+9C6F42FC1CEE8331DF17D97436FCB5EB84CBF99496E8B2B1E1E3AF77DB160CF5C06B42B7
+38D2E8D8987EE38BC111416C2054F6F308637C8EA7CB3EBC6797FAEBA1B89F52D056E74C
+E08E1A205C7DBF60376280098D6E955946519E89E4204E170BA4A90C4FB50B3AE3B16360
+404499E1AB1C37EBDDD97443B53E2DB9CC73AA0000609CAB5ED34A972A790570FA8CC7FC
+0CD3C6AC2230475B
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+{restore}if
diff --git a/data/fonts/LilyPond-feta-nummer-design10.pfa b/data/fonts/LilyPond-feta-nummer-design10.pfa
new file mode 100644
index 0000000..ab9710d
--- /dev/null
+++ b/data/fonts/LilyPond-feta-nummer-design10.pfa
@@ -0,0 +1,299 @@
+%!PS-AdobeFont-1.0: GNU-LilyPond-feta-nummer-10 001.001
+%%Title: GNU-LilyPond-feta-nummer-10
+%%CreationDate: Tue Nov 25 18:41:30 2003
+%%Creator: Chris Cannam
+%%DocumentSuppliedResources: font GNU-LilyPond-feta-nummer-10
+% Generated from MetaFont bitmap by mftrace 1.0.19, http://www.cs.uu.nl/
+% Generated by PfaEdit 1.0 (http://pfaedit.sf.net/)
+%%EndComments
+FontDirectory/GNU-LilyPond-feta-nummer-10 known{/GNU-LilyPond-feta-nummer-10 findfont dup/UniqueID known{dup
+/UniqueID get 4107162 eq exch/FontType get 1 eq and}{pop false}ifelse
+{save true}{false}ifelse}{false}ifelse
+11 dict begin
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0 ]readonly def
+/FontName /GNU-LilyPond-feta-nummer-10 def
+/FontBBox [-6 -322 801 1006 ]readonly def
+/UniqueID 4107162 def
+/PaintType 0 def
+/FontInfo 9 dict dup begin
+ /version (001.001) readonly def
+ /Notice (Generated from MetaFont bitmap by mftrace 1.0.19, http://www.cs.uu.nl/~hanwen/mftrace/ ) readonly def
+ /FullName (GNU LilyPond feta-nummer 10) readonly def
+ /FamilyName (LilyPond-feta-nummer-rosegarden) readonly def
+ /Weight (10) readonly def
+ /ItalicAngle 0 def
+ /isFixedPitch false def
+ /UnderlinePosition -100 def
+ /UnderlineThickness 50 def
+end readonly def
+/Encoding 256 array
+ 0 1 255 { 1 index exch /.notdef put} for
+dup 32/space put
+dup 44/comma put
+dup 45/dash put
+dup 46/dot put
+dup 48/zero put
+dup 49/one put
+dup 50/two put
+dup 51/three put
+dup 52/four put
+dup 53/five put
+dup 54/six put
+dup 55/seven put
+dup 56/eight put
+dup 57/nine put
+readonly def
+currentdict end
+currentfile eexec
+743F8413F3636CA85A9FFEFB50B4BB27302A5955DC23E0F3397300C8FCA519E56C902CB3
+B617F2A7538B6DC265A7CF20D53EB36E373340044ED3C3212B846132E1960981D2006CCD
+E888FD9671CDD7ED1352864A4B63C0967DB2112FA1C9858565C8FBD0DDD08B57B7FCEB3D
+24B86E4B8F343E1D177E9F46BDF43B991761555A2BD0087D171A8D4E0704D7976EC07F01
+20F5004A55851E3D7F1B101CCDDC3F8F02070217787E5D3D718929D6E6B9F17D30A17EB6
+ACE1F85BE11BA385884D9D001BF3FF9CCE9EA1F0B0ADC25AED55D150671B2AFC400DFAC6
+9D690CE3C6F32A1F1530783E74EC69C8D0A02324B4079ADD20CC981D4E409ABC3C24BD03
+2F19E249684EB7BA2C88C81B6342B0EE4C590FBEA1D68C5E2408559B15785642521C2A78
+AA10F0D33C3025EE207ECEEBD7EBEA9961B064A92AFE9018ACAB694C2704A8B7F7B05F81
+4A65B7ADF0157321E7A698E678624184F411E72B3048EE8FD6B8D13F25F8485D5E5AFF28
+03E8D80DE6CCC2434FDB7ED80035C8962A82D761B0921706386257F19027846A5D2B63F3
+FBC6A3DA938D4FCCD635EDD2F3B3631ED52441310E77B08BA4959FF24DC2B705BD3C8773
+0BF78EA2F4E00421F18C7F3EC53C53B2A9F876FE7A33BC0845CE1923D40AAD18810404F1
+6B0CDB14EE807FFD3471E56C81CF20C6D3FE86DCB0222761600E17F7B95A5B2132CC4E30
+841510529663B3B808CCB5C2EE9D05AA8541F33FC3A26C95F1E76FC71D03E5012985AEBD
+7C831AA4FF482AB4870F9ED58C64EEC0B9E6E280D9463795B0D1CA26590B5BB02CCDE8F8
+B3A73485C63C2DB4D03DC35E027B1F5AF7EB5E953247C8BD27CD95F16C821FCF3176B729
+8BDD368BF25EDA1CB0C2B806429D1D1213616015EBA75E3A1E37ED8EAA149601A1351170
+D849DD4C1FE655BBF49264596A3DA4F87FEF982F62D549F08F7146124A5DEA6ACA0076B6
+F4D3E8922524420D2DD44257DA9942D208AF7E3751B85B25D0EC56F7919C09A34536E41D
+6C5772873C063A14F7DB758E22716E86F4C4E638826EE16F5514481D298528EB2994BF38
+222F6EEFBF2FC1DA18159F64E5CD187B3BAF198FEC8BF25F04D23361FCA1867FF3F8E3BC
+A33AF9C8467091612081435755B1520819D96BDBC6AEDDE388BFDBB7E13DB6756F371ED1
+6C96F4278A6D1DD3A6831D2A2E44B38AFAF0050663AF5D912DE1C772638D20EBB88C8965
+148943C11C3B8B570B8F378B1F940A3339AC72972EB1EE105483E1ECEB96F521C6B6E066
+16F249D18CEFFA41733E666978D4EB104D952E40B2A110F3D8625601EF69F81F8B685C24
+AD4685D863774AE86BC4A52D8E42DB658C69FFEABE48BCFEC233AB879E868AF281F16DC8
+336F03D972A8F63ED60F35934B30E2AD6293323B9DCDC81AC249B0A2B6AB071213BB6B5B
+E09BCBF652F249BFE72F93C2B0522F86D49CD9EDE851DEDBDC9083BDF82935F4DF8CDFD3
+236555B2534E3058388C0334FD57D7020D9EC9F4680D58CF4BAFE238D42FFFBBB743069B
+18E4DC6E0AC51F6DCA700D584BC2F3DDEE9F82873BFAA7CB621BF01468F4394E654B3C71
+0D996ECE0E2073D34415C83E565FCA00E7F0E14EAFE242D1B70A77EEAE644F2C32564199
+DC044114FDFEEE2FA8E3574F4D1E34F0177A1214BFF70FF4F290E60168ACCC6A60A54F91
+E4A6CD7FA7357DF30C4D6345E3BD9069C3804D536BA109489BF189AADF72DC4810FDB143
+55A0ABE13E81BDB2D22726587DC7D53F06DC6B25A2FD8CA7E6D67C6D79DF52CE5210D54A
+48F8E7C85A11BF6BA453B1E728AD7A620577342DE579A3CA3DE518596D558B5D51B24C0E
+1BF96B8F2B842B91DCC5B8B0F9E7EB265F9D6E689B38AC100FB83CEEE5CDA96DDA9F3D3B
+8D9FE1E56B472D1817EC19171A7CF9D13E9204988D1CAE801083FF4FD14D5F4B4A4B0409
+7D6DF440C05785F396C6E882D50248B9B6A950E5681320B305BEAD35A5D18A3EF6E83F26
+4530B1C803CF608C03071EB0238AF86AB35765D0E72AC55E7728527DB2339D25A31B8522
+9B6EF428A6232D5BE9BD447BDBDE560AD2CCB16E59756FB6FED0E9B33BFECE998B513CDE
+DE61A5301F81BDEAD09CA256794FCF576400A5837C134D278A36F52E0882EF19646C496B
+9AB9C3FD5D8A849EB0FF4A66ED09FC1275B8326499148BF7D32B5F1EB1B1207852D73C76
+F0F6D0458E78F94C71AFBFBB2E75190E5E413870AECE2CFA1BEA47398F1A35B3F9BA3575
+42D9CB84ECE4B37EB9F296E93DB35E066088746AE4BC11ACFC7F6F39275172F17692FD14
+1F7B7F85A97DF780493D457A923662C8056390E86DCE77E6756254A9C51BC632B4380F62
+338D48327677378C8483CAD8A7AA63A8521C39E757C35A607633AC6643EDA25F48333FD4
+AD2576D3B89A7B3333A9B888C3111C90BA7C52ADC4902151610E8BC32001A2B2021DF570
+EE4869E3FBD1C312732BBEEEE107739B76FE5A745FC6E3134BC22074B5E48A960F576F3B
+BAFDA622C62BA10686F262B7C1F45C7418E235BA392F51B88B1ECA73809B4A37450B352B
+EC63B921401B901E3D48884441E7F402C0719D95C145494357045C44171FE36B265B53E8
+26CE08E52242B950FA3CFEFD44B40B11C15C9EADBC9E9B4EBC79DF80E24DB37A9D41B46B
+C788F691488987FA919E61E5F9D1462F63593E48718983A3F19FA2AF287CA4EC8BD3A11A
+2B6A35AB7A642D62F744336D7A510756A855C56347D5A29EED2444E7B348A19A70E232B5
+A3307F3CCE6150338CA6606C98DD1ED7FEB1FCD8247AA38AA151D9F4F9E79C150ADC1792
+21C72855D9344BAD66EA505B87629DFB6036B48446E19C2F8F43C59FE4441D02D8A7B2C4
+6736E310F197FF4CA29DFEA4481D0E57CB5EE4F43B5DD291E6BDDE6E1BC9F44C83977B9C
+1AA2EB443D810C0DA488E94646AE3A2B63060F17DB5231E16752B71E32EE436E1980390C
+74DF8DE475EF7BA21A7067D8C2A4D4045801F18B03B700B6F4EB5808EB99B6350ACAD822
+097643C5A27EF9BA18D8D6095DE417A77A8A3FBCCA95F125E71FD6DCAA47CD0C741D61A3
+AA829C9B02EEE964B210F0D9716C7EE83F0AAE87ECC1AEFE10193CF40DCBA80E2D91C79E
+49E13E335CB9C6E4E8334ED2BE404DC8935C2A77C072263296062B0D2B2D7E2199ED63FD
+638D135BEF5906FE4C2B8C1B60A7F6C189B0653A589C8912E6D1891459B293CFB7AB298C
+E3331F4D11588E01F095D3125BD0883F502204B2108A34D57EF13B6C2C4AD2F7EF26E587
+FC54880451C96A0BFBCF93E939B000BD92BCD70FA664360366E029E24D197727A43A4260
+A06D40F30BDE44C0F5CF1D59B8A396583D21BA958A473A17CB9F1C729E66B99983A6ACCE
+C3F82A2D7C05267326637C66FA98932801FC279C03EC6C5D8FB3021737CCF1F787AA1F89
+DDE81CC56B3F183CCE4A07F11C2BD03392E82EA345C9E91A9029246575ED3F092357EDA4
+E6FDE42B5C1B4F38ED7AE45310B0EFA4061EC8BD6EED86A6E6369838780226A867A4E5BE
+10F4CC2B53F7B17211C66CAF548CE03B06F2A45E28FF21D8D4DA9272B4E874C66E037C4E
+3B7CBC1B78A35BEE50FB055069D3DF6C7F9E14DD3A8656A9A212BB9CAC4D318E32DA36FF
+9B8BCE3C2FF9D6AD32415001B184DE899B1EC3EC2E2868118E6D94C210FD26CB55ABB156
+9054C86331F647A1E25D13947AE371D26CE96D7B71C452ABAA66DC65F8C2ADFC407620DA
+810C537074BE66C272BDED789242DB409593EC4905BD9BE4A7364D3C6A58CE705CB56CD5
+35D57B60F1E2B936EDA72C10AAE5D46A1FE7926612FFBA7340BFD806A04F20F004D67045
+D6A5824CEC11AF2687803F7628DAB99FAD26ECC2F4D8D960658B3F7903484B9BBC1808BE
+257D7FD10282EBE9E5CEBE3B490C0195464AB7BFCEFE56A888E200EEBCF1DC288D80A5C3
+7CCBB119B84D3E3A2D8BD5DF72515C15263D3DB093143C89B135C211CBE6C569C9DE1C06
+0CB06EA3954AEF31731E632E076A5D971CE3A2ABFD78449F1E99108932CB7A0EE29C8142
+FB0F18E054320B40D1AC6814B5A713CB2AA239F9221FA77B4CE9C1428D6C2767B2EEB599
+FE0BCF7D99B86B83D6E52FFF8EBD48F042E258C5E9317CA579D794D01CB0A711ED1F8D0B
+3ABCA9EE7232EC658A6C23F3A01180EDE179A798023CBECF7469AA00F29C98A996F371BF
+CB45857C3A235D48E347490B949BD7D2CD784061C2B5FB2E7D9BEDD9BAA81A61634A2CAA
+C6FA8350A95334EAEBF194E1039B6C3A7368DC85437E0B98B48514090072FD19C5C1A0AB
+467A7E546B3EA91F6DF0CF0B7700159C9C79C41B6BA90E2DA0C44AF7451D9CD4DCEA27DC
+48A2534F19C8AC30928FA6A23B0CB1EC71DAA583077B92A16EF2BD61437A845E4843AFA7
+659C0D9E37723B9C92462541719AFC0EF925F3A8DD9FC1299F098F4D1042A6E7FC0F1662
+314AB2CFA9BC6AE34BE4722E4B7F2498D8E8009F56A175D49DD33A14392161FDB07FFC6E
+7915124F7F8CD86192F0FE4050AE647F9EB245C0BD8330F0A98B4D02AD658A06AF23ED28
+3C960C03CA4F87848C9996354B1A09480EF566BE7989CC703E3220CDBAC4B239EE4A341D
+616BB3FA507D1A79887C11A9A3F8207A0B2F72A6EB46581959215BD6FBADE7665AA40DF5
+67FEF3B541E4C13DD5B041B8B38D515DD98F98ACD8DFB602FAFA468D5F5EC7ABD3F3F77E
+A2BF7E47C6D1E7946435E8F20C8CCD7C2FCF75BE76C8890F950AC3FD131A86FBA419AF21
+23BF2EFCDDFDE5BD1EFCEB212DF05C471104E49C05B67FADA06796C623679C7BE88CB7B5
+AD491EBF56E446450BE05F7ED7DABD23B7581805CC982855155D79B4E71A01420B325713
+003AA8DC4B4C4C76C33ED7102B76CB5A91A9EBCE1B2125CF17D1ACD7C1987232B4A4F511
+128B7C7EC4F1DE8795C61A3C1B84A49E808E69DD61F4A77071F113E909BD31810762FABB
+EC9900A2A1298EF48C3D087E136BC8784D82E17EE82CC475F1747B61CB47827AECB11A33
+F5D35B95E5696572CDCCEDDCDFE40D7C7958C1C34576512458AEF9BC0B32E4B12B19EB86
+385AC4529EA43F5AE8FC4C32B9A4AF2602C9F6492FB2A88A135994E9C95CE238E53C1E99
+5774AC393684018F8AB7E45790F78886EEC922A331E30621F6BB4D7C401E9217E2992B99
+5CEEC0CE77A6F6B27D618C4735C9F414C27476182D5440E67CFD5C783185ADB60E02BA7F
+52411AF33FFF6ED7CB7998D0DDCF128F94049D9595846B57C25BFEDAF48194509DF1B986
+91C9A4DF299A5183D60C578909C5716A9C4A10AFC2AD555D6762543C60A301D08F1AD207
+0A1A84D7D2DA974FA60EB68D42F5A83BDE05F70C4F60E85DC9EAA28756BB4AD24F1494C1
+D01C8CDD2193E6255EB4EA9B6ECA4663FF6155445FD3DC853C1E3DEA5B1C3166F24FEBAE
+054DDD9D0CF3DEEB5F90E7D94D77EC38A4C55FBA82531AA7C807FD364E5C2789697A898E
+98621822826F8F60A15EA1B73944EEAE21C601C401DE5956198A0D1B00B10DCE4423D8C1
+203291222AE4A3F66E14973284D33EC2FF17CF82DF06FE9ADA7BF5D36ADD2B0D55BD941E
+1374BE685F3BB61C11EDB273712ED95D1FA6E3EADD503D54AA2A16CBFFE059BC129F13AE
+298A3959300FB013079F5CC820DF83176BC5A8BEDDE702900011BBDB01837D6CF3F3B17B
+9692C54FF963C94AF1BE92878A900B955BEB8C1114054B2E81BC93E37E201B7CCE5A5051
+A820245139DCFAAD705F4C81AAC4226420BF8E95D5B460EA9F054A2CB41248EE31CE1727
+5B8DA3AAEFDCE4DF6035E1971379E3FCA0BB08E14F08FE46C622018CE317DD9835F548DF
+5210528399928C01090974AE6E2C28B81550B1484026423AD59339506013C6D2B78EE633
+96B57C23CF6DB374EB2D5DFA3AE6FF5CCCADDB919DF1582BC6D05732716572B37267786D
+60527708591515517560C68C875B62D30E30027BF8BA69AF1C6ED2AE0BC40A4FEB0782E0
+670F640023E74B1F281BE6E586015904DEEDFEB718C78325A1FA51A331D35F414ABB80E4
+806CC8401D4E8E796FD38B71296725829EE6D15EF8F4D4853BAD405A570803AF67068B78
+675D7F53C40E72015BA5E13CDD9412410A0618D3A0A40FB5E144762E48BB80FBD8DA8C4F
+EBC993C03C60BDD010090D5E8F4F789D837CA855A55AE1D2DC83E3367ACAF0726E85FF55
+6176C16B39461C8C5A449FAAC48B257D5083DC9AA0F9A8338C56EB0837F59025EAF616E3
+EA78E28B1722D38B27D0CFC583CDF8751BDE1AAD7109CC69D001815DE1B96693AA9A3BC6
+B8C13DE482660CC136EDB7B376691A339025686DEA600A6B96A02F962DD5E1275EF0DBCD
+8264301259D8B4587B7FDE3B0A2D3D1DE61D3D1220488C8998FC07BF237EFA1A63B5292B
+886B58FD63655B8868815C7603B8B295502881E1780075642CAAA0F90F16DBDE7FE2DADA
+3E06C67C30541C28CFE3747717AED2489A30392AA6AEDA5939C4844522A3EB73BCE78505
+ED5AEA1E9F55FEE0A673290B532F7C100DCD8CDEA72917A073A6266E9B36D9C82350920A
+4E74AF611674073AF227312957E776885A41C7294D9ED700C01100173F63080BED857BE6
+251A250C9047B59846DAC3DA8799323B3AFB42B66BA9747C5D7AEE1BF95096987450BC40
+4445F5EC8634D0BAE1ECB48D1289C2E9ECA8DAB1AE633E21E0E9418FBD32E91A210EC606
+1753DC0526BE36ED8953FD68D50A22962658EEBF75BE2121D99FFCCB37B2009B8F0470EB
+13F8A5C800767BC7DD4A75D87EAB22E44F7BCC7DA7A90FE4B89C4BDA5E0171396BFDB9A0
+FC59A6DE3D3BB024D69B5DAEF26ED1201F1BC5CF4F941F81B0E77767237C5370F7942CC9
+E54760DA6B63850F64191448EA639BC16E3D6E361E6BFEB0AEBDB9CF9C54D8BD9D57C615
+DB4906564EFCB54268FE7CE5DEA527B076DDDC28CEF9BCECF481C0205F5349C0169945AD
+F16C5C8C4084CF13F3D9C249CFD0577331553FAA3E840FE4E5502DEB46F3F19F2518F029
+AC6B9AEEAC21CD3BD447F82AA7BE974F22349741D0914E2733C7F353E4FAAB0F112F4F1C
+FA65456CA0F33350F859877D2C1F17C34812807866DEDBD8768CC7697FB4F75B635761F4
+79E0F4E90FEAF292F50E77AA89993EADBA698671BDC28FD0FF01684D999EA78C949FC995
+81A4FE4CB8AA60A1E845E75AAE0C73DD9FADDF062E4B897016C3E6F7A74758FEAFBE50BF
+66B2830DFBAFEA62F4BEFB4D5135752116B9895223CF92AF334D3B91D56DE8E1B1BFD9CF
+7148FEF12E9763B33BA1DF93337B77FDFC471D59B786152DE5E748A0C7C3AD41C9F57075
+0BA5265090EA9AEB5646B83F17F6E673F7D2C7DB8342EA300F89278D7E1417B61F2EB98A
+27A624043A6948E8CA86D387228CB7D7B26C8A8FDFE868F9326322DA165AFF20BF532866
+57B76E98A2E26E5FAAC8915923B0CDA719FEF7B9DBAC39B9259D9B0798A513A2ED544B7D
+E36275895CDB88979897104162041596A8DBDCBC8F263BBE31629D05CE4FF72FD4BEAE8B
+C51580B1D01BC2A92CEA08483B0A1C203CCC2CB14542067886B0D050440BF795A1B9F2C2
+DE3A46169C6F206832495D07803C0AD38A4A0194378E82EFC8A741BF0A35D71CFC9BBFF5
+9E463C5E431923A3889856D5937DAAD8D2268BD94DC37C056CC0DB2833E6E5A4F62C55DC
+18B5372536A6E7871417F62E341F62AC47D046FB915F263BB3BB4A291DD7A895F5577A9E
+2FFA4018FE897A2D7B35DA607DB7DC4695481774C4C1A5E494DD95A715A59C6D0069FD09
+A837BEE5A3BD6D8B162C0320ABE0DC67DED129EA1D5B03C495BEFDE5C20886F657A1DB00
+70C57293E9DFF55F5BEDBBBC01E4C65B751D3B44C99E0FECA10758CF0952C40632441052
+0E83CE17E69347D45A3564DEA6BF5E5F4D788585EEEF7D05195D294DCF089932A96A11C3
+2D2AE1AFF7D0F7E1E1A3DE3FD7631CC45C7852F14E96741AA7E4BD3D02D04DE8A06D6BBA
+EB236505CC3778403DB7C183E077ACBB2BDBAEC5011E3C23951DCA9DF3186FB462344B2D
+C7B43FAD800EBEB0BC993AA72431D15CB9F64BA6E95A7DACBC294028A128D64F941C577F
+01309B48A3C6791B017496176926F3B7CEF2FFC9C0B0C1D38496FC59A6FDEC0A4BCEE10C
+D2639E3D2402A0A211D804758B8FD6C21D528717383C111EECB20830C67FB627CBC6470D
+1088012DE4628760A1CA86DB6BAEB91A9B251C78AFC72A7F0DAF2D7FCBCD2FF82071CB91
+AC3391E0A99CEF8558C0375E0BBAC06095589A1F9134222CFCDE2FC27ABFD08420A28AB9
+DDA86AD85A7027B948BCD93E929B5203E3798D2A5C04ADB7140A55C4E6B3A3AC2CF43BBF
+D77CF91B4F7E475E3B09E1A0338B02FFBBDADB21F60C213646953CBF4C496E1268A221A6
+F9F923F3CF57F9A25D0FE3DF926F13687458BF36CB99E970B62D5D482D7EDBF67608C582
+9A3B8DAE433C44BE608667DA02F6C5A0AC185E4A5390C32FE4341C454CAACED589B8B4BB
+0EFFDB81D6C91C209B180509BF3124B4ABABCFB381A1B472E1DA665820A8D944D5F68AFE
+07045DB9C24F682C2071FD2FEC23C2E877F2CE2A13EA60613A2892DE1654D96685A511BA
+B601A828B7A984C8EE839C60651DED0E2AD99FF4B53ECD5D48E10612F7ACC057508ED59D
+7398D68E5DD4A2D175788BB5F85AEE0132B6277CDD7AEDF7F70347DF4C1BBCDA5763A6FA
+5E69AB8C184F5467336B04692D14194EE3E7C020681FC27BA51F9E98419B99BBABD8DE2D
+ACFE9147F3F8F109D4818F6F569B4B6A09BEAD6F3F96C6ABD18F1FCA3337E4EACF87E3C3
+1C896282F2135DA80C4D85D830099CB7F49D588CA4F349D224986F4C692F0ADB68042828
+FD6A371E0E943D4FA89E7D34704D32FC0F0C6A6C8BE9579EB80975A800694E5F71D5EB0B
+C0D3A2EBD9F2EC1DE0C9B972A414CBB1B2DDB619109825144BB6F018ECDEC11BEDA73CC5
+341B96F22BA1E71076516D449115E2FBAF551DCC04423F45FBDDCE114508FF328626A1CB
+0F25F0496579D0E9FA56B521732141E64BB50625FB012FAD8ADB49ECC738052DB049F6BE
+F4936959D186F871C495476306BB3D3C121558662A58B1091291619B38C7A8D048C6627E
+1BFFFDC579D6476C17DA3C8ABB3C48A80E5B82C95CE8B8F364E1A597012515FB45D31E46
+F42A06DBA907DF2C2A482A9DFBD10CD01E1F19B5F8F6865271BC6D1D9BBD44E137FAD336
+7C2B667DE38F0E7B52F6C4AC456F72EBFB250077BB7CB4F42AF0D259F1620D712C7B71B2
+0EB90EE92EA523CC0A33808B50E00D4EF9E16E2EEC495DAAE428057A60730AE081D161F3
+19FFBDB98381714C850ED7F687BEE4A7F59EAB5F1B75D3FBD8CD22383560B0FD3E0097A8
+2BE90131742456C330F25DEA75BDD87F611E2A022718F554A75EB35BA415F385A39681D9
+1FBEAFB47203FBAC0FCAC00E4DA7B09C9B16C7E0DFB81F07785813477E775935C8B12ABB
+159BB3DF6A4685DDC3348ACD55F572202F88C7B4A024C8BDCF578B5DFED78405E5D9A384
+6216192283998F4E18D3EB57AD1208CE3F098CCECD6EB6343D89593C29612A849A65EDB9
+DB2BCBD046E096EB8712B560D9718A5571454CB59420EACAFA4164F08971773D3D46AC9D
+5A0A3CDCB6368C7B08BAC72E0D5F529C35BDECAA8ED33158028DDC58BCA8949859CBFBFF
+7941EDF8922E169C1863FEE2531667CF7880BC0AC9FF8681E3F5B496A4ACC62C097723EC
+9D9B6B0DAC7C533DB898C8219E4B721C556F259DF2C5DE61A7FB7B23CC0801F9756C25F4
+78B9F4F1E1C8E7D59D673BC46112122C37EDC136567FF77B25231BA22A4FEF91AB4F0346
+11613695BB2D14DB5F7CB60CC08E7233B09EFA90BB5035827216FAB4F606995E42B9D627
+51F25668AB511800673A13B28513B73D7AEE785D6A0E0EFEACE4B50DE5104BF795C7BABF
+67DFD8C2945A27112D9C2E1C50198EBDEF7F5F845CDB42EEAE6CF59EF4830685F7811A6F
+EB53104F384A196673C850B487E8BEF7A0165C4DC1B98CB9FA6E5AFF64D5686F02CDCCF5
+2C0B3C88A8957822F26642621B582C4331BB6C2D184F184FDFDC2C3F22DB402EC1DC9771
+5BB18F6BA8B74E8FD966256EC2FEA17818FF3C003F3BAFB28304C6204F27D4357EA7190D
+2645BB528A1E0ACB7DF9CB449EECFBDCD29ABA81465A373D5BA49419D1A9A52B33A8B5AF
+A98076671D7784C9B31537945C2C4388B4A865A68219ADBC4D35477888F54FA83D1CB61A
+355E50C8823C16821778AB7035135BEDC88981ED9A464207CE6BA8BAB95486CBCA9C9BF0
+13CD6F649BE1224978B5D79877BFEA3B23AEDE6F26A42049C10C7953704603E380B946FC
+432AF85FFCECEA399351BEF7CDC4B0F9B7ECD6515E5FC02C2B664078A98F375DE5B72911
+32FFFA9ED77DB50CF8094CD651C3030053D88AEA4DA0A5780C8AC8BDA19B85B9FCD0BC3A
+6DB90A2DECD3F043F9A2827F101349B96F183757E26F56A65D25677045FF7A1E9614DF9F
+D6CC6DC13A7064AB91193A3F6EC4C4F09691D95A8BBC4F5887E97FF79999348BDB1979E2
+F4A712C990E48347551FDD19ED8B6D10AE54938FB87D883334D54FA717CB042F3F802AA8
+4AE9EA9DE5D4A99741B4E389979BCFA8AD85088EE41ADD7CD929354945A1851A09697D59
+BFFDAEA0BEA56B2E6AF8A7CDF2D7FEFD4E24B8E765B938FBDBA0A3AB73A0D9E697D2D11F
+73304DEB8A5F95A45A7A255E86A147B243CEA976889D1BAFAD3FD6BD9EA65FE8891EF009
+916EDB89B256178D45A970787077A1640E3655DD418BFD24E896C9F1DE206E1B6A2AC596
+E57933831C61585DEDDD3E10941EED768759B20CDD6E6C3D0838E5D3790AF85A2345E8BF
+F24E533217AB160B384CBA2113E828CB0D2EEF1AD53090B41CA5F9F112CA9749AB89FE8F
+E4EB44D50EAA276EE5C7FBFE90B441AF48543F14E40FCF52FEAD546CA3B53B2B6DB932B6
+CB0F5BEFE2E109846427CCA995FB7591FFA5EB4B8521B11B29A4F15076E6E302B455D873
+55AFFA6148EE62BD23145DB4638E3B88BE287218119A26E1D03B98A2C7CAC87D8E0847B4
+53285AC3BB17A75A3C1EE02E82F0EB414F338BDE2263B3760A07BF21F4CA4FE8927EBB9B
+3DB9AF0DAC01039A83FD95D7910BF6AD7147153B1C4BCB3C41C72527EEC0D4E399048371
+71D4CE6BEA65D8ED04D8C71B76F7842D5B803615EB2056C1968CA0B08907C7E2AA875BD7
+D5CF2077D11E6CB398277D67C55E464C387A8EE05D57EBEC2020658504D0E5E89244A9A7
+74E19D8D5C873CAE4C9C7DB22C23C50BAA3E6CAF7D4A71A10527B8700F472E9B1EE48B80
+76AF15A85E10EF2A476FB0587D99FC7295FA4AE3A3E82BC778D22FE992CD24D89534BD91
+F92109601B4E64BFE6E6BE0A7A792C166C9B46C30407C541295CC8A8BD9622131B1CBFD0
+9EFF419BCD20CFDE9A86E0AFBEA5B28B4A4E13195210FFBD5397448CA13FCD187376D922
+A5C6A43A32064C67B949D844884A66F2ED95F5FEB3B20218566BCE9105282F6C9683E299
+2445A847A4D6D1DC59F86D1857AC1EDB37146AE246E623E5F7F5D87828E4C20E97DB0C30
+E5F1744201322AA75B5143742B53D5AA1A5CEB1D7DA665C4879A017ED35CCE49375C765F
+EE3364918E0684B34FEE7133189E5A7A7C08608CD2D9C4208B724B7EEEA245EB769D8D87
+AD02B7EB250CA6FDE91EAB1108A26FE25335CE20688A9400E08DB549979F5961ED0BB8F0
+448AF38BC815A79E18036DF0A41C31CA7924FE060601530FD3CC433A2C2C0F6E17E7D09E
+D1F95A0F943F9D61C5E9B7B2B8DECFBDEFA39F0D3A4EAC59BF3BC0A05E5FD61AB8670BDC
+67AF67A32014B3BC483F0FC7E0DB33B47558230E4845FAF7C0DB7E53258E995CD7517E75
+4E7883656DFE7400EB339CAEBB7196A2AAE72289BF6FCF2A2F23250BB3E4253E2838FEDF
+93197D909FEF6FF768811EF5B052071FC9D2B6906CA27E8F80BF3C833B16B020AC4DEFF3
+0DA18A2D0BDAB9A515FCEC8CD02AC81D7961C338329AA3BD59A04D042BB73E0C43DC8745
+091192445C60D569605B575FBDAE44C839582DCF73E5974486F293AEA1B323E3776B7DA7
+2C602916458EC51424DC3AE0DCF8E839D3B3B017C6C590FF936275DB23B1E49750817CBA
+987BDC71CE0E178C1CDA0396007A5B8B344484371ADDCDC42D636799955A6530D92CAFA4
+EB5289EB9B0C8CE362A76900B7F367832753E328CA3790730755D0103F9BAFA3AC0280B7
+65665C4D66AAD798CEFE3FB5B7CCC9804190A07F791EBDC5C526F4E8DB988B6E199F8066
+AD5A
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+{restore}if
diff --git a/data/fonts/LilyPond-parmesan-design20.pfa b/data/fonts/LilyPond-parmesan-design20.pfa
new file mode 100644
index 0000000..966a139
--- /dev/null
+++ b/data/fonts/LilyPond-parmesan-design20.pfa
@@ -0,0 +1,1322 @@
+%!PS-AdobeFont-1.0: GNU-LilyPond-parmesan-20 001.001
+%%Title: GNU-LilyPond-parmesan-20
+%%CreationDate: Tue Nov 25 18:43:27 2003
+%%Creator: Chris Cannam
+%%DocumentSuppliedResources: font GNU-LilyPond-parmesan-20
+% Generated from MetaFont bitmap by mftrace 1.0.19, http://www.cs.uu.nl/
+% Generated by PfaEdit 1.0 (http://pfaedit.sf.net/)
+%%EndComments
+FontDirectory/GNU-LilyPond-parmesan-20 known{/GNU-LilyPond-parmesan-20 findfont dup/UniqueID known{dup
+/UniqueID get 4030633 eq exch/FontType get 1 eq and}{pop false}ifelse
+{save true}{false}ifelse}{false}ifelse
+11 dict begin
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0 ]readonly def
+/FontName /GNU-LilyPond-parmesan-20 def
+/FontBBox [-163 -1248 671 1248 ]readonly def
+/UniqueID 4030633 def
+/PaintType 0 def
+/FontInfo 9 dict dup begin
+ /version (001.001) readonly def
+ /Notice (Generated from MetaFont bitmap by mftrace 1.0.19, http://www.cs.uu.nl/~hanwen/mftrace/ ) readonly def
+ /FullName (GNU LilyPond parmesan 20) readonly def
+ /FamilyName (LilyPond-parmesan-rosegarden) readonly def
+ /Weight (20) readonly def
+ /ItalicAngle 0 def
+ /isFixedPitch false def
+ /UnderlinePosition -100 def
+ /UnderlineThickness 50 def
+end readonly def
+/Encoding 256 array
+ 0 1 255 { 1 index exch /.notdef put} for
+dup 33/neomensmaximarest put
+dup 34/neomenslongarest put
+dup 35/neomensbreverest put
+dup 36/neomenssemibrevisrest put
+dup 37/neomensminimahalfrest put
+dup 38/neomenssemiminimarest put
+dup 39/neomensfusarest put
+dup 40/neomenssemifusarest put
+dup 41/mensmaximarest put
+dup 42/menslongarest put
+dup 43/mensbreverest put
+dup 44/menssemibrevisrest put
+dup 45/mensminimahalfrest put
+dup 46/menssemiminimarest put
+dup 47/mensfusarest put
+dup 48/menssemifusarest put
+dup 49/mensuralleftstemmedhead put
+dup 50/mensuralmaximahead put
+dup 51/mensurallongahead put
+dup 52/mensuralbrevishead put
+dup 53/neomensuralsemibrevishead put
+dup 54/neomensuralminimahead put
+dup 55/neomensuralsemiminimahead put
+dup 56/mensuralleftstemmedhead put
+dup 57/mensuralmaximahead put
+dup 58/mensurallongahead put
+dup 59/mensuralbrevishead put
+dup 60/mensuralsemibrevishead put
+dup 61/mensuralminimahead put
+dup 62/mensuralsemiminimahead put
+dup 63/vatpunctumhead put
+dup 64/vatpunctumcavumhead put
+dup 65/vatlineapunctumhead put
+dup 66/vatlineapunctumcavumhead put
+dup 67/vatinclinatumhead put
+dup 68/vatlpeshead put
+dup 69/vatvlpeshead put
+dup 70/vatupeshead put
+dup 71/vatvupeshead put
+dup 72/vatplicahead put
+dup 73/vatepiphonushead put
+dup 74/vatvepiphonushead put
+dup 75/vatrplicahead put
+dup 76/vatinnercephalicushead put
+dup 77/vatcephalicushead put
+dup 78/vatquilismahead put
+dup 79/solinclparvumhead put
+dup 80/solauctaschead put
+dup 81/solauctdeschead put
+dup 82/solpunctuminclinatumauctumhead put
+dup 83/solstrophahead put
+dup 84/solstrophaauctahead put
+dup 85/soloriscushead put
+dup 86/medinclinatumhead put
+dup 87/medpunctumhead put
+dup 88/medrvirgahead put
+dup 89/medvirgahead put
+dup 90/hufpunctumhead put
+dup 91/hufvirgahead put
+dup 92/huflpeshead put
+dup 93/vatdoclef put
+dup 94/vatcdoclef put
+dup 95/vatfaclef put
+dup 96/vatcfaclef put
+dup 97/meddoclef put
+dup 98/cmeddoclef put
+dup 99/medfaclef put
+dup 100/cmedfaclef put
+dup 101/neomenscclef put
+dup 102/cneomenscclef put
+dup 103/petruccic1clef put
+dup 104/cpetruccic1clef put
+dup 105/petruccic2clef put
+dup 106/cpetruccic2clef put
+dup 107/petruccic3clef put
+dup 108/cpetruccic3clef put
+dup 109/petruccic4clef put
+dup 110/cpetruccic4clef put
+dup 111/petruccic5clef put
+dup 112/cpetruc5iceclef put
+dup 113/menscclef put
+dup 114/cmenscclef put
+dup 115/petruccifclef put
+dup 116/cpetruccifclef put
+dup 117/mensfclef put
+dup 118/cmensfclef put
+dup 119/mensgclef put
+dup 120/cmensgclef put
+dup 121/petruccigclef put
+dup 122/cpetruccigclef put
+dup 123/hufnageldoclef put
+dup 124/chufnageldoclef put
+dup 125/hufnagelfaclef put
+dup 126/chufnagelfaclef put
+dup 127/hufnageldofaclef put
+dup 128/chufnageldofaclef put
+dup 129/hufnagelu0 put
+dup 130/hufnagelu1 put
+dup 131/hufnagelu2 put
+dup 132/hufnageld0 put
+dup 133/hufnageld1 put
+dup 134/hufnageld2 put
+dup 135/medicaeau0 put
+dup 136/medicaeau1 put
+dup 137/medicaeau2 put
+dup 138/medicaead0 put
+dup 139/medicaead1 put
+dup 140/medicaead2 put
+dup 141/vaticanau0 put
+dup 142/vaticanau1 put
+dup 143/vaticanau2 put
+dup 144/vaticanad0 put
+dup 145/vaticanad1 put
+dup 146/vaticanad2 put
+dup 147/mensuralu0 put
+dup 148/mensuralu1 put
+dup 149/mensuralu2 put
+dup 150/mensurald0 put
+dup 151/mensurald1 put
+dup 152/mensurald2 put
+dup 153/medicaeaflat put
+dup 154/vaticanaflat put
+dup 155/vaticananatural put
+dup 156/mensuralsharp put
+dup 157/mensuralflat put
+dup 158/hufnagelflat put
+dup 159/menseighthflag put
+dup 160/mens1eighthflag put
+dup 161/mens1eighthflag put
+dup 162/mensdeighthflag put
+dup 163/mensd1eighthflag put
+dup 164/mensd1eighthflag put
+dup 165/menssixteenthflag put
+dup 166/mens1sixteenthflag put
+dup 167/mens1sixteenthflag put
+dup 168/mensdsixteenthflag put
+dup 169/mensd1sixteenthflag put
+dup 170/mensd1sixteenthflag put
+dup 171/mensthirtysecondflag put
+dup 172/mens1thirtysecondflag put
+dup 173/mens1thirtysecondflag put
+dup 174/mensdthirtysecondflag put
+dup 175/mensd1thirtysecondflag put
+dup 176/mensd1thirtysecondflag put
+dup 177/menssixtyfourthflag put
+dup 178/mens1sixtyfourthflag put
+dup 179/mens1sixtyfourthflag put
+dup 180/mensdsixtyfourthflag put
+dup 181/mensd1sixtyfourthflag put
+dup 182/mensd1sixtyfourthflag put
+dup 183/mensuralfourfourmeter put
+dup 184/mensuralallabreve put
+dup 185/mensuralthreetwometer put
+dup 186/mensuralsixfourmeter put
+dup 187/mensuralninefourmeter put
+dup 188/mensuralthreefourmeter put
+dup 189/mensuralsixeightmeter put
+dup 190/mensuralnineeight put
+dup 191/mensuralfoureightmeter put
+dup 192/mensuralsixeightmeteralt put
+dup 193/mensuraltwofourmeter put
+dup 194/neomensuralfourfourmeter put
+dup 195/neomensuralallabreve put
+dup 196/neomensuralthreetwometer put
+dup 197/neomensuralsixfourmeter put
+dup 198/neomensuralninefourmeter put
+dup 199/neomensuralthreefourmeter put
+dup 200/neomensuralsixeightmeter put
+dup 201/neomensuralnineeight put
+dup 202/neomensuralfoureightmeter put
+dup 203/neomensuralsixeightmeteralt put
+dup 204/neomensuraltwofourmeter put
+dup 205/ictus put
+dup 206/uaccentus put
+dup 207/daccentus put
+dup 208/usemicirculus put
+dup 209/dsemicirculus put
+dup 210/circulus put
+dup 211/augmentum put
+dup 212/usignumcongruentiae put
+dup 213/dsignumcongruentiae put
+readonly def
+currentdict end
+currentfile eexec
+743F8413F3636CA85A9FFEFB50B4BB27302A5955DC23E0F3397300C8FCA519E56C902CB3
+B617F2A7538B6DC265A7CF20D53EB36E373340044ED3C3212B846132E1960981D2006CCD
+E888FD9671CDD7ED1352864A4B63C0967DB2112FA1C9858565C8FBD0DDD08B57B7FCEB3D
+24B86E4B8F343E1D177E9F46BDF43B991761555A2BD0087D171A8D4E0704D7976EC07F01
+20F5004A55851E3D7F1B101CCDDC3F8F02070217787E5D3D718929D6E6B9F17D30A17EB6
+ACE1F85BE11BA385884D9D001BF3FF9CCE9EA1F0B0ADC25AED55D15065B66228E8CC51F0
+8EB238617088CA01A1F271510E6C2CCD5662898565F9A3194257DA76DD63E612447790C3
+0339B1DF6132F75CB9ECB0F1C3568BF4139911FA68E223CCF5FDF83AB6786E9DAF6B084E
+E8A0206F95C0F0DF4A4645ED8E6C793B2DE7EBCB4E9F50130EC5E68D508245B861EB4236
+7A4B0ABA919797A0871F4B3129A93808BDF7D067B08A2466EF1C1F74C4A342A6F9BF8921
+5955E3645EA8FF7139A3E1A8818B94697C3E359FD7CB1D613A48A6402C834972D796A09D
+EE52C9A66F52B74641F43AAB579AB880F628F39208E2C602A5CEDF5E6827D2AEBCC05DCD
+01D23A51008D521D9FC6715397B9A48D570BBD9F798408562727B2FE590DAF1E650F5483
+4F0DACDA7D4CBDF8D39509E20C59DDCE693F89FD2186B0FDA742F5C2DCDEEB7B511A9933
+023518AA3D860D438BEFE6594A7E5B0688A3C101D4326871B1771F9749E956E114D51BAB
+38F4E8A0D864BCD7988F8878C446FA538A3E751B434CD03E7C5E05557397C02ECE03752B
+8824938ED5BD2F3021A465FC3536C3E5A17F5E541DED2917D68F2A48ED020098F12F7AEE
+0194DFC5CF186BB9483F5577B11CFCE0F6766A3308A457FB7629C67E63D9EF510F7423E2
+AFED81D5B7A6B8CFE327890D27F4F6BE62E8A9B9AAD67CFCA0CC431EDFD63D127DF4D43C
+478511D1BDCAD587E83A9F37CFD1A5BD8666613B9A0A34BB90B72F590E71D04EDFBEC98D
+7D1DE1AD2AC2B73FF72627A16C839F84C28C3E795C55B76459E1759DB45D2FF53305F17E
+E33CE94DB175AB8192E1490E3B5175B70ED6C7D1AFD5D034F76A30D3E50441EF2F23A7CE
+A70B531BEA2FA55ED69ACC71BA8FE2606ACDA680B986B2A81720DA1682FA961B28E2D2C4
+0113958D45B46C923FDB9CA28FE7D4CB3C5F324F6E968CA734E93E9C7430D3331F2BAE21
+A8F5693E13C4F07F9ED177A7138CECBF792E858F984449F75DFF26B5CFFF6DD717722084
+75F16B1ABC250EBD0499F39B9DE1C01CB88AECE6C49DF5B27A2F5EA8E5936118C82CEFE4
+5C0F9A9CE84DBA983A57ED6E87C6050515C926AC4B5FD2FAD8DB80B363C15EADB97D2D28
+21A6E143EE82660D0A3E55536F7EE7F2BE5D037A816A32B60738CF6ABC198C1CD8BE0571
+7E477A80C12420C7B980499762EFEBC863B517D0FAE958B1AE22F42CB1309617112BF97F
+CAA61357D313250F99FCA9749AB90EA9E9BBF480B3789198EA9D7AE549D07BDE33CAAE7D
+910CAA9B8DE6EDB8AE9E5F1E1A4696A6CB3D3AA7AA19A6BC69E4AE10CD7F47F8898404A5
+F1235B1FE08E599EC4DEF6D85E5EFB46A4BF1D1363830B08798381D4EFCAB66EDC741FF8
+2ADFFA73FB88284D6DBFF8488FEC4BF77DF28FB54A0B7960E6CE6FE891EBEDB544A8AAC9
+501BF24F09603F59505D508E4B23158CE23B1F3CC92712A30D148BE81B90AC8C19218A73
+12F7CF8FDE844079A29C7F1AF9596D79D1021F0548EA015DB743767665A6F9CCBFB579C7
+D646D5456D7BAAC243563D772C01412D78BCB1AE5C286480C11DC794A68183BFFCFE67A4
+3C74251D59564720D8618C0248CC0E917C0A370521561C129EE46068B2F9A3E3127304F6
+1496FAAB1C516BC69F9AAE073BF6D20441761A346C5B789C09DC52BFB828DA696755221B
+8F4EDA6891AC6C904BC672B1C2B05A2A8C4D93C65ADCFF9E62613F0B45ED09FA1C06EA76
+94428406EEC55C55F66EEA6EB88B27A99E72034B13850871F2D8DEC1C58C964A55168C5B
+633F74983F646235159FB2CBAD184B30DA0E85BF8B5AD33EDE2AA8601FF1E8581D358478
+80DDC425A05C0693C54E1D81CFB1ED40B86139C5BF8C2DF5E03AA36A2DA547986659B6E9
+DB28AB7AFD86243B8695525E96EA3FC5083A659B08B394D7B2AB46D32E7864028667523A
+EA15B93388A09158D172E552BDE027C587B67E30EABA2CC7AC550604F989F8BA8188388A
+22DBE2BC5F9189B82BA11702DB49D07413F0AA5AEA631E3F33F01354FD76E3665258E592
+377001D07F910609A269989FB1D05E1051A0191BD7CE1C5F329C8D79F21F286DB2720D1E
+5C20031B54FD182D5B7AA65FBBB8EE160C5A880FEDFD6A9F52A55A96477496090A1E8EA1
+93E433887FDDFCD8C0B95623D41D063D1053E4E6C9413BD1329EB9697E31B5860C1C8AEC
+16AEB07BB4B45B48CEE3C772D28AA613AE6939CEFA2334E18D3E3A6F630C2794B6F9E806
+4FD8284B342AB817966ECD04906EC6032F5A50ADC76081D6AFC51106DE8F93B584C09E2A
+552C7E273E297646EF66251309151F49ACD9B41AF73CF76D67AF6AD8067AC1E2C59FF70B
+C37E5D1EAF4290EC07B87E7932FDD6B0AFEF918EE87AFD667F31330DBDCA505F147E9432
+40835F1DF915E3EE1449E14321DE0F52B88C424CA518368A69BCAF3542A5E1A1ABF83EDD
+398FB64292931B4EE916A11EC82D3D7B793E943DA6E432DD90DF6627E272C96E6CFE7F31
+9F6BE23E2BDCBDCE752E0BB11AAAE5D1C84E1541DEBBC69E66A8B8747F1E23A268F6E9FD
+FB64C5B8FF6BBB1A0DC295F185BD50F47821BA7228402B07355636A050AB2405848D4853
+5131597993A04EA5A7423565EA5CAFD899BD2EB9FDE08E223AEA0B983D307FC7F32C6B5A
+54688943AAA862496DFDB585EF2F734E19A5612E52F6A56F1DF97DFF141A13B4CBD54EA4
+3D5DF9FA8131D6FC5CADD6159B8A369CD0FBAA1F7953446D02215EBBB83431A39A419D02
+110744650ED27C36E1B3A91445A68313118ABAD01DE52D25D0D4BCBD0A6B603C3EB33A97
+2B7074ED1D91FEDF65108B7F624B664E6873184426721C5DA06403D71AF2F4DDA249CFF0
+F704D48154B552C426E92433B667FF0CAFEE647F1F956F983EF63A619FF476151D5E4964
+87C433AD96A8D78DF7D6D6F574FC73EE8321ABC38C8367A72816BD0AC1D53769B0AAFFB4
+3ABEACA554793C52901BD0B3ACCEFE81B15D0F9D745A11476D9EDED1B749AAEE737E1F08
+A668D10D23BB4E1224860E42FDAE3D82BE2ADECA0E7DD2D614AFA229EB5B876D8F508A6E
+0DC6A99F3FEA3B81510CDC8B83ABA7C99CF6C86DD73269A2D7E4A3B40AF3C135980FAAD5
+0984CE0057CC9E9E38304B24690CC0C77A48C4C47666A768E032F019CFDEBDA07202862E
+5820B2BEAAB5C222840348B9F0F551C7321C0A4B96D027EC3248F029EF66923810D739E0
+B8E6F046767755C6CCCF1A18FE77A4EF1823AB5420A33A304E221FCDAEEC87479170E63A
+33CA09252272A510E9338B943B8B70544BF47E29EE538540F028E7A1AB8605A058810909
+0DC2F3427C037A8E11B6001087438C732BE0A4A207CCA3D57E7D0B9F515B3BE991CDBED5
+3C70C22EA45742FE86CC922CD55AF17EAE871FE9429371452529E9C18DD375FDA056C794
+26E2D2A4A4FB26AA849F826E6A5A332D908AE54ECC409E29BF6BA9EDCC1A9A7B7859E09E
+26B1C42F6A8793EF3052EB21AD0090C7FE4478A0287ECF84ED1F31297F946B399D71229D
+B1CC4AA4364E5CDB1ED7EE7BCE1DC493E121F7527D57B5AD69E7B7491F5133135D8E6980
+EC641F96BAA7F4949DE91C12DEE7D75D8859D6BB9BAE46D2285C332B0DA948B28C136C35
+A7B01FA2FC7AE34977A3CE5A1BEF7B07437BCA9CF6B734BD5DE5C16AD292676B6B6F3E4A
+1DD0EAB097C1D08B7AF6746AE14CF03ADD9C05D61849B6CFCA0C6CC611484CF96881C9DE
+8E35E4DFC1ECCB72FF06868C85A1E498F68F23771A614A2B775699112B37A335ABCB253E
+32CF36EE4587A389E953C69C0FF4503D96904E0FC10EAB717F018770E63B49DCB0A7B02E
+FC9018C8AAA45536B1BE420D7BBB54C54299F87337FF1004CD7FEDEB32DA629530931792
+E1ED997FEC34045F480B7DC06B0A3F746C4B4FD49180DA9120DE83428676389929456D8C
+5FF3E1D6F92429213C5D514D0E022A28219A566011A696952F86326B2FAD7F5343DE3DC3
+56A38F99E829EC1ECD06153E02E3CBB53F90E8C45F467C74532C3942FEFE4FB2F5CFA1A4
+8057A9AFD9E398E2CE08A321FA17BC6771D05CBBB354DFA8AA23C6D26468A98C3DEE8201
+DA4BD452FFD796D7233953AAA169865A3A8A772FDCA0AAB2D0A79C69266EFA18F05909C0
+C3FD6295999D26CC5AC256461B4CD27F79543218A0B72F9E525A591164A34A3D2A06005F
+0B1449B6071267779F54B366DCEFB9C2E638A2FDFBC1600F8CBE8A2B4D4EDBF5EED6F655
+6B9358CF7CA15E19845541939161D556F4D76C837E8BCAF96DB74A1FF2365BB8B4D98179
+D74147B10E0C15BB9E75E7CC2D89BCFC0AD02E76C6F3C6D5FBBFD839A3BF9FBCE8EDF370
+8838ABA2015B2BDA2F53B5FBCEB2FBE411C3D514ACB277A32F66F7D671590745F6C7F75E
+7F999C3A3B589C084097F8B0123EF11BCFCB88356F8E30F50618EEF09379E0D22D927EB7
+39FEDE524B626DE3E7CFA3813627C9C95EDC9224B1A661C49FF0DB96D4D8CC68EAAB082B
+6BD1834CC9C126EA7CABA3D64651D2EA2A37E69163A094BFEAD673C0547ECCEE160D5D43
+DE90928A5C209F1BF2258509B96C871DF292F21E65862DC6BAA9A1CFC669178BED04DA5D
+46944804151588171BB3C46FC248B492FE87118CCD401169EB626F06906107000D106B43
+16639BEDD9B75D12CC6D254258F030E6B1E2B15572D6DE69A5104B88CD402A78A1CFC2AD
+F38BE7D8CF7A47F0F0F06407616B67377AFCE54ED9CEE418AD1D871496635D40C5D16B27
+48F7AA11ECEB09516E48BDA0B6345012C6B2A266AFC69216ED88AF21E7935A60ABDC18C8
+437D6D3127124A696266ACC6E79A4C8029A1604DED48F9DCFF780F4A4DEA279E9BB46928
+15A1D66C2445F23BE6AB371B84733FD1F6D827D027F9C6169CEE1DEB92B65F5F38528DC6
+42E79A87C6CBC6799EDB74FA19844E75A5556F4485178AF9CE52C264AB7FF655515F69C4
+5B3E595A1A18FB82DFABB1D4CEAC6B67BFB4A765424AE67B6C4BEE97B82D98C92018A9DF
+74CDDA395B182E54F91AC5A3DD5751534B98B48CAA484F3D8BA213A5920EB49C47231DAB
+BEC13EA8EA940624C213B81B38FB10CE1710244A3C9B40FE83E370C18754A072A9F50927
+843A4121DCB208D2950CA2403B5ED72FEE807E1C39C0DCCF5DC37FA3615B0C65D62F2900
+6869A9ECCEB47EFA01442314E888B4858BC9D808AA5F143E514CCAC037C57497B9DE618D
+89BE0AD2E7DEF9157DB72BA770EAAA030FB00E90193ABEA818E45E4C76E75326CA0F4722
+EEA331E1290EB2E523C77D35509DDA22FAA429E9EECF0BA4159478F6673FDFB4C15BB8FB
+E32E947194B3BC640DEC6DC85453180C05C94A831E32B454C5336FD22731E973B247A455
+37BEB627DBAB2B1CD10296A45032BEDF70DA3D18F58485292034A323C4FE565A23DDA884
+846749A44C46DEAC090257E37EA09D203DA5880401F65BCE82327DE9FB425D83E2E9279E
+26FFEEA568A44228934E7CE8FB0C4C461B53540D1E364B669D1E89D91832003DC29E3F55
+E91A956D2BEA2E3388B7669E9DFDC5CAB015FFC68C2777A20B04F72766E40F40252FCF5F
+1E0F84FA45CE49DCF978409C875ED81257332D695DA4099B3E9C45E83BBEBB38B49B6435
+4AF1BE675DD3706EFD8663E377756F2524E15616C89064E85D9DE2ECFD9E90DCAAF525B4
+F122ED7242E5EC49B9F05DBACED3EB64C327FD664AE12D18412C665DC548F3D49370B107
+DF4CDFB35E12A97979FA3E9697AA2286AD215A3A0F87A4F3D01D7D241CFF97AECD368CF4
+C5A37CC7A5755F32219AC4CC5A9A83AB186AAFBCA381461620E9798340695E371E7D25F3
+7F13ABDC5468F9F93CA6FE960690F1179D2A448C89F78B95997DFDD4214B29CD07CD16B8
+4274A2EBBE33A9D38B856D7A4043424A33F8536E1A71F9C683613A71B78FA84776C8E73D
+B6FCE153D59091EA3A0CDDA97A3E94FDF2A734C2A57D6F74CBCEDB2F155B364D6CCC819C
+2B9205A2FB2C9E51F317F66EF50384E996B2091CC3A4501D2DEB35B9B77EF6DCEA23B908
+782A7A90F6CE8947E30942813C427DCEF76992BB0563112B981DF35652A717F7C85B7ADC
+C84CC66FB122E9165F1DAE9590E95E9553939EA78C93CFDA6D41C8906394051EE21A5B8F
+369D04862075A7B0B9FBA6ECD5EB18E1674B5A595246F0504828CABE534F691EAB9C15CF
+4961A0B01EF54985B6D547371CAEAE3357C6ADE80CD1B45AE87AFC8344A595D8C7DC3A90
+EC29A9EB44611A5AEC8F917DCBD017977C164C02A63E6427B3261641535ADEC326FDAA1C
+DB5DA1379B936A27CA750408F3B1538571E54B088E1DF6C733653200E37C01B32405703C
+BBCBD54FF389CBED4B6DA1C16C1A8850765186B7CBA1B9E15A2791BC6BAFAA9DBC2662FB
+FC054BF2BDD539D18599F7C7DF42825A6D7EC6EBFA4628993160466A97E7457C152408C5
+D3B0A9BBA985240E224E75F9D0B381ED280F47EC7AC4F681F25C8BD5F511368B8CF0EEF3
+CAD7CF813A1AADD7AB8E4A00A2789D0139AD178B51E367B2FEC832F7025DB9FB07DCC47D
+0F5E713279F6A55E41CFCE9EC06DBF801D59BD712C3D197C2BB6D0BA8F7CE6064BD5B4B0
+21305D890A7A84E0D16872FCE17C78F6104919DB780E08CBD7AD000453E8D9A3C6F5A6C4
+94134E5EE71477A8BCF797E6262193E484B189FEF5B52E25F1C61266D69BB9B5602CC7A6
+A194CC0EE9A08E93A5EBFC43EAECA17A7661579614B774A5172B30FECF39088073F54B05
+0AF7677965936B76AEE1095EC2D3928655686C9223FD391C602F9AC2A96BA1027B1674A6
+E750F1043C9355B260DEDBE421D07DA770A2C521318376B9F7F7D5C83D50FA5B19BCBAD7
+683E0FCAA1F3168B172D8D0DF5F2755CE27764F48B5C0EB93E0278512C731EB51E416CFD
+FA1BE3494E28C0B5A3FCA56D0FB2DB39563170CC0AFB22A473FD9AD315F5D0AED491F5A9
+AF89A8E5FA58C37507FAC44B9D52EAB266D7BECD920077A5AAB913B37851198D850204A7
+5C500D846460800A96FC059F80AF414EB0910331C95536DA6CF6E6C568E43A836336049C
+16095D8BB91B6DE418B06BA5D7CB356CCC0A773A305E73140E649679BB2BBD6B3746F0DE
+FD1A13E8F2EECA308B3944CF5DBAE39BD4F527263A4E79DDCC1CD01DCFBB503DA2F72BA0
+D6B37996471367972FA36DAB16FEF26346BD6BF4279B262782323CB8F4D5B9C84D19DD5D
+5192C3202A0BED111F6E71BF1B92DEF389137DB9C12D82E363C222DA5A25A364D04F32E2
+1E3DE2D491C0977C97B1C42E765491F6D8810E756AB42CFAEB3AA0481FA2B6DF15A841C3
+6F8F24092FD64D8B0B9EE92A09EBA7CCF85EDC7A3B822D7FBE0B866280FC381431B65781
+2873B7801767082A6D6B606A0414A29ACDB7C396965ED85EDE84A61357A57D75CC76393F
+4766056995EADF254682DF217949CB35C4CAF0B0F36856A6E63D1098B7AF17C5778CA003
+1CC2EF890147D6A5FE2B1F7954F2E0246293E922E0C8F49E17E23863ED40D5E528E45314
+7B7B20AF0020E1BE8745EEAFF84349E3F2C1F1DBEBD8E9476564BEF9F513ABA8337D11BC
+4F822015C0B610044CA8F2402B358EC6CE0FE5A1E53D441AC8970FCCA1572352BF5792D9
+BB60091771604235819D6DD2CCDCBD3831BCA19E1319BD26123D37A0DED81C21CE57C3B6
+D1E211DDCE9FFBE37BC7B3F180EE4922F1B01019237C11E486C3C47B041F67125D87C30C
+76930284E168471B65CEA8DB23087292137CEA7B6047E85D497748D33A130A6549B51788
+F1CDA7FFE0985DC26461B3EC8E35293831D5501C98C38B816811220E49BE515FE87A03D5
+CB3E8E136AC03B15D31EA1C46804BB66B3E8B293920BC2367A06EAC1EA49B69A94CADF56
+3F1BFF0A6BAF4DC3D463A6249AF67E2E6AB7FB5E57D6F3C6B144C4852797A478BC57C692
+82EAA2B23EC95DD8B10D531E2DF78C369E2B416B13A81ED49892D777F95B03E23C856413
+676AE8400A874F412BAE18955647E6ECFF24AB67D64CEBFE581D2D98EA4444332D3B9B11
+0EF835EF19671242A4A6A54C99022A91196BE0AAB0BC801C00BA386C7AAD5EF0C071E8BE
+4FFE82DE943C067A52E1E24EE00BB0EC9BC58E4F1FEAB3DAE560A9BEDC27CEE890926F19
+C96F7653BC80F56426AD62C5A61F92776C598CE64F3D06E3D441705489DEF6C3510CAC40
+23F2BA73CE29C3C74068A4BF87992AAB1AC570BB5BBD7CA5ED5B54C674C009775C5A5EB4
+78EF566F67B451F7C801C4788B1C810BA577A5ECA1E4EC70DA61FA9B1074779E793F86F2
+E36282A29006155804A3D720C5FB1671F52643350516080B9DF5D5FB19479451F7D43C41
+EB7D2F4073E28E2D55FE972A862544D32242CE8F2A011151F24C401C7C11E93B87C86AFC
+120E5B28907D96C31F0271554078476084B7938423606700A2A0A92AED7E26BBB3BBABBE
+E5548463E8C58571AE224C82F79DF1BDD6E1FFAF671E671492F440CF1ACAFB52D989E01E
+973541AE3BB6B47ED60AD54AB982CD51B60B226BEDF8AB5B452BC3D70BBE2F6CC4C797CD
+7EA80534117524A7A4A1599AA2040C5353E6CBE4903F352E86609BFA07E319120A6702A3
+24A60AD535D66D45809D76D109315F52B6936A1F18181618E06E1775798F9E5D26BA87C7
+9A54B5E620A3333E6167335B582EC0D11753835FA9713A72C395F9CC61FCC2166377040C
+E618B23DACFE977E259008E293BA1B892613C9CFCF6F1B143DED5573469866858095F701
+E35077292229D935DB9E74C2E94E86408B0B3117FD9E46EE8D6DC94CCD4A74B10358FC7F
+2B5F87418B59AB31AE7B7853A1BE9F2EF9CEDB829311D11E5545C3C2A52ADB4E527851F0
+8F72F2BB6EE6C76E466499C0A9C6221B8EDDE651ACE57EF768428BCB1AF4B42C6EB5ED7E
+678D5E09219E2450A9150495A3385AB6AED71F203A5BA702D1109C8511DE452928E7C550
+71EF529E05E12F67CE110AB9034CF08A837B7D1811779757C2F6391F7DB32F027DEF4F79
+8AC1450007F758D4561A2AF959F42D4E859FAB55F1E11876F93CA24CEA8F7E7000166F3B
+C09EDF2EA2173EDB086C19263681CE9A35A67B85AE08E0FF649FB6DA3A5826FF325D3648
+53E120FA4A1B86F5F46AEDF9B9519786B81ACE0DAB2C2C832B21AFBAA183E6B47DB3E253
+379E8254C42E5657FB0E1D8BD11579B109391DC1CB6183725CDC99096AC0CE94192A1155
+D3FE43DEBED04E50386709B4863F8490C757A2BD5F927F0CC6A495FE8769C153C3CF4C69
+28BA3A1EB88C05BADF90C06425E07E9A65A7E1E9F232D9523AEBEE3BABD0A17B30715428
+1C22F886AFD4043B97745E05BFDCFD6F0FEE83D1C207C5E12545FD4D003A958DBB206371
+94DDB015D9A513FB2A73F9859A68D474804808EC3DA5F1D7A43D8ADB40B6673284E54D96
+CF3FE1C872A350CA862BFFA720A7E73FF3094F14411852DDC9CA7F139D38803B486F0B1D
+13050EF136BBA4FC35EDFEDB38AC6F399D03DE118FE371DD309DE2CBEFC9A1AEB923B101
+F4D3A8500B2C8AB27058C8F1638DB1EEA09BF490518F123B7C69BA1D891C7AF720CD7506
+D2024FFE92CF134D9C33835B279BE9276D7CAF80D4531F10B0BC878B25D8C0C333E27F7C
+62178B2A9BC8738C79F1FF7AB877D4D796E9B0B8A093B7524614BE7C9534AA4B2E6856FF
+F174034A70576BA263C8A93A8D947B4C1A28012DE713A4686B4C096A37E8A7916708E3E3
+DF0A852759229D090990280BF551E5B5AF3E5FD3433A86FC6295E67E8901A69AE6A664B6
+38B7978711A5EC899138994CEE08D562D811B99D41EEBC0C5B0AD13E96D4F0249E8E3E1D
+195B1F693234F2DA303AF243A17B2FEBE114FD0D067E2B9DC9A49660E2B3389F2FC61077
+3FE842B24D766A11E9589A0DF0A6856E2B9370950EB8E8B567431C12A432A2947E785EC7
+0172E7FCD2C004AD65A0EF3B575960E66A45E56D54DB02B1C3A99668C8C5C2BD31BEA528
+3D55ADCC0E6C2F2B83E533196D5A79D500D9E61FC8591C8C3698A4A0D0E76FA3D2D132AC
+551E9BA9D5D1AA1B42189992608625B5E7BE44FB18D559F43F3F7944D4EF8517CD69DD46
+0617D62A5C0623D4BCEC7E96CA672049EBC12D6CDF2F8B98F1165967A9B99DA210DF8E03
+25F7765E42218733C769FF6AC0575CB66F43837D78F6A0429C5BF396BFC68754969BBC67
+4551FF95155F4CD4F90BD9FF6F1BAEB0D81E5B079A835E4EF29B0187A35E357793389FF2
+0787BE2D336C66C00A5486453C50C6801C4130CEED5BD8D95708F78AD0DE552F694F3903
+E469C4BAE54BBDEFFFD9AA12B4ACB6A662E0761395C81620B006B724288560E712400D05
+ABB34AA5FAD566FA8846A45307AC3C6AC7D1FA9616788E466D65369F492F9FD681E3F802
+4FDBF4BC79C13BC0F786ED06DC098A56B28D8DA536951EC71877A3BF1A73AB1EE93F6D78
+FD96E5A23329818323EF23862721DC8DB9B4235DC0E35FD95BEF9E9A56818AF608F9F290
+D4CEEE67237200045B01F370789A994A3BF901B2BFBAD511EF843D494582544F6F915954
+0D26ED5BEFD80A20AB0979FB5C2FB9A2CA1A81D62115D54EF3C3624D8886284803E026FF
+CAA566092787781A0EC8D8FDC1EF7D034DAB49B672DAC3A9500F49B1432142579E52EC51
+F7A751B56992C4AA11BA66C49CD9BEF36F06181A815086D3FDFB0594BEDC0C13F3427071
+225C4B0DC3953AEF0B988158FC472C3571FAC9DA67510431A48C42E4D23F94FA8F12E62D
+F71C0D182EC7EE483531E3DF9BCDE661D704E6EE523A20F97BE29A30FB067212229BA785
+DFB6F0EB947988E2517FB85907996C79CD67EA47659FA98B2B734AC8906F45585E0125B6
+385658721D27CBA6780DE58A3E4D96A70CD4DAED3097C883BDE195BCF19D41640E70D748
+8172EFDEBC32D6E6B69D69323521AB8631942D532C9FA743AED66E2C13C665D05107DBA1
+C20E3970D632B9724F6671AD9369777D367DD74F9BC23BE8B036F78EFE293F19E40593F9
+9EDAAEE4E95CED21E4070C404656D16CE541FD917DADA016300C3A21FAE23B0106BAF1E2
+25EBF061A2D9B2FC80B563C84F7FC5535C6CAAA903684C2ABD226570A39F0C615FAC5C6C
+F0444D24EE27F6C60343DCFC23CC665981F88656FF8D2A632F61572C2BE3D149D7E6E192
+2FCADE83CC86DA4F33961DE41B6278D8FC052DEFB7937FDA33480BF1EBABE6B7B627A1A0
+ED76EEA8747D153B4818546B8BBECC0354AE7B674B963C1ADE80C75B6179989BAF469D92
+B51E491D0A38F7A8A35961570B305C8087CA29E7C8F822C11204E34066DFE97A8C510AD6
+4AC389EFA1C84D99EDB6870560EA8EA012B010247207DA52850DD58EE1A32D478945447C
+FAF53F48F13ADDF06551B22DA95D4CE478D208EA9CA0CB1BC37C3DEB335841FAD7BB0733
+6AEB8A2A3EC1A1B654A28E2F3F26040E78FC1A553CC6AB2C635DC1C28CBEE0AF59512B25
+BC3FA436A808CA87828B42A6A7EA456DD84444535D90D768D3AE00B15441FFA6F0D7C78F
+1E085F6429DF3230930272C8E6341CB0DA1F4773A5082009E9382537C1300CF159F2070A
+781E0A4A2DA13470F139933D72A67881ABF51B988DEE6F2AC910494DB39FBF2E73059A7A
+70D8FA9BBD15B45D1575790537B62AF453EE0AD5B7014F79F9AF2BC8FAE0CB125FA656AA
+BD59606E126892A42131380C9743956E9BFF007D3FCA39C98FB7F6A71AB7012B8DCDAE99
+C1A678D7113D4EEEC9C98D6938E26D111319EF030CCB7448E7BB9743F6A68F9997EF10AC
+6623C7F60379050F5C655DB29D3E2994466CE199FDEFD1B9ABD4B4002ACD8A06F29CD0FA
+64B8FECE06371BDA66DF7C5FD2577A095E2648ACB1636294870255E4A960FA64C939D296
+3D180E7117645EB959B716C380C5BE5688E5FAD23DCA95729794727EDB58B7F238E97FD6
+3CF49AE818758F176C2037B8F43778FC88C15FD48D17AD63F353ABAD73E2BB9D885C1F9B
+23CB971AADFCE9115EEDBE11EBC83F12B6E5E1946248F81B12616546C01F52C9F303870F
+1C0DEE6AA1A98C274ABA5900E48B9672E75A275D46E6D94D3193CD6133056A35C37842C4
+92DD3A8FF65E4ABD904DB11B7FBB0DCF6028A0194C1825EDD3D9CEF5B4636A0AD8828E1C
+B96148B8BC83549402FFF70826023F547FAEE0F0178E20124CFABD65E299E27D33C4254C
+D9E0C090E14909B631F3FA28B1C6B50A096AC09ADF808B1E5E0BE17DB8D3A8FA5E45C08D
+537491A93C4E0241190FC35E9A67D3735A6747EEF385677FB2E15F1D66C7C2BEA02178A4
+0594B809D95D8292FF7D00097377258E81CC5E2E73EA86B3B7F014D1D3D77E7A94538098
+E22CB56EF8713D682C53E1AAD2469A9936D198E8214AB1FBE0E746C1915B6A722B93E42B
+764F67D3387BA3BD419CCFC9F7869EE3181CE8AA1CB932806771364CF05DD49A04B4DB5F
+AE91A8AC11A21BA3BDD8F4E6C1C43A229E5AA1FBEA648E6A14E1F84C7220EA361474FDE2
+2133AC5A354504289DEE503CD7750BC4B6601518F876896FD9FE1698324ECA4D1F66C4A7
+60EF44FE24F3EB7642BD64B63666DA20BAE986ED4391E0F52347C6B301B489AD25DE95C4
+6175EE4842EC5A26BD833FE376C41DDF12FEEE46D3C2F68E916EFC20D0B6A178263D1676
+CEC721C58DAEB079F8D55A512BE0362AB6DC5AF26800BD5DB6950A112D7D39F5B00997D7
+C0BEAE281062E75136746E5A61FCFED53DA5808BFE45D00DF013634DFE91D673E01FA963
+D9DE14041FD2A270317DB56FA887CE4455AF3454B9B7EE8986008A7F896616AA36109249
+60E9CDEA38FFEEC38169C6C4F3A317115ADE19876A12532EE11916D3E941052B040E1CEA
+992157396399C397701A83B449A71DEA1F6E6C8D058CEB622B950DAB0AB4B6619E8BD26F
+0266F4C6D25F633591435875BADA0C47FA7C62B3DF3801B8EE01AFC9D8C7A445F8770D8A
+22E2A3D6D671E705BA6B51C875C794DBE3D4A83987FC520320C0FB0123B38EDF518BCD6F
+CDE8C43BEA93B206235B38BC9978E597C06A62CF26CDEE3C1269BC41182FA4ABF54C2A89
+66999B352959ADA0D0AC860259434F0C7006BDAD05524042D77203110588B998A529FDBF
+6698B1D4231F1F401D708BDB528416A4B57EE907E8721DC92EB6F9D4BF2622FC5AD35218
+5F2CCC50B46E246C5DB782ED02FE9AECE25D25C07930DFAB6F4C29F8D70D5F6935E085D7
+9CC97FA6FD2D61499828446C92971106B7A1AAE9625EB2F801EF6F7A78E473710307075A
+BB8013539C9811C7003CD290AC31741DB40210FDE90DB32FDCCD1028E24BDF2AA5BB8B17
+DA9DFA62ACD1B4F3D23FE51856D1CD8C96A406FEDCA9772EEFFA10A975F95CA392271109
+AE280F451F64860EDE07A57EE645DCE8E7A06D6401DD398BA7895F4202FDB6546048DC88
+848B49ED8D852AD8C9ADCDF206AD1F172FEC6FA064286B7867F6EAE1F017E091E51DF29C
+A75188303B1D52C89805CE18872F39407143FB58F0086E5A31BB548C78CA434E684EE9EB
+DE8439918DB9FF13272A45DABF7296C309FEFB978E7FB66747625EBF7F8FB0010B4C08E1
+ACC1FC85F57AC67C100CFFB28B8B75AAB5DFEA2A5806CF9ACDC7651639C0ABA42F7372E9
+D4F54E5E1AE43E260D0455769BC3D2AFF0DF04AB030B5F91461E232EEFF6C9633E92C8EE
+3810100D83D8A887C51E6E81C7A5296B16535B93D8D563A0CDA5ACDB4CA19339B4414102
+899062CA22155A3778D6036CBA9B65510F2540588A0C2B919F53E9194F33665705E0FA7E
+1713EA5C5C0B84ABC0A88A7673870208A6CEB2C5FBC0A0D5D37FA39ED81F44665E211E13
+798F1818874E7C187F7A28FF98FD68548931C73D1BAEF62662E899D48E03978F96E40213
+09E3D7AA0E2DA15186A8875CEC29EC345508536F405AAB63F510477FFBCDACB2390E6D19
+3CB1AC7B0E788404D48FB0D519D682341793C4A220A3B1453649538EF728144ACBEFED4F
+C605DB3991A65DDA4836F395C863AEFF8FBD44AACDA9C2070766F2E7D644D284C4AFA9D7
+656C4A51756EA96501B5D4ACD0E5FB5020390A211C5E1B4EF45EFE24FF3E85D9C41A4CDB
+B28D83DEE907FF995BF761ACDA602B4B51D30C763A35D537C0C5E72CFBFEA865009E8037
+8D477A0A34A734FB230D43234C53B4ECB404764405562C52F3F6BB3311FE86FB8C9F7978
+AA7845BBDAAC38203B41673D82BBB7E46AA720B084C4E481D1A8424CBBCA57C752BEC165
+BA07921859F8ACF14C6AB2404B3CFBAFE4C7E164F6CE2C4E7043406D19D446AC649A54C4
+F825EB7201BC66A4B8035B85B5BFD0E6B2D0C08532B1D7438E7FF45FCD15E074AB7327F9
+D6B8BE630C5CD538031A362C6964EB3207CF90C9CDBBDEFFE39D23BF8552AD1FF0523E29
+E01F04B8879B37907566A674DA876436523D89D41224453F4CCE7615ED23F1E317988A40
+E2A63D6B6AC8D0DA7AD24059DD973313D61CDB02C9ADC8566F1A60827EB2FD8A269940A1
+46563F03CA9DAC1AB3D86D0755A2A914F69123E48E6A94AC89ACDCBAADE17B162DFD37CC
+42F89E412B859B2E52829C06485C876531056D69FD55C6B1FC0A635F81D9196DFF54D117
+CFFB46FC31921AC28521E650136A56F23558434BF9C2136D860B45F150EADC1F675A0CF5
+9A8D2B220448AD74C124DA3071D994E227CFBBC73F0EAF95D0598750A54EF0327611723B
+C42153CC99D4EF5E0862B0F5233AAEAD18295A5654D3717AA3A049E5261FBD5E323F675E
+C32C8EF396609F9D10F771143DE6E203E03D5A1BAA86071A62AE6D225A3B58CECD094F84
+DF421FDB58C9E3BCE1935403D994EDACF7A85670D51C6D9B73B3F99E87956ADD51B1DC8D
+4ABA2DCFFCD8032BE0BB5DA59B385237EA29E219EB8BF3C1380B3B60CA99AF03AA54E1A6
+F85C9C0D44AB237A6BA280DBE9571AE73462A4414F31B3AAD89C37174A8AC2A6AB63084B
+06C103B63ADF96010D69CCD073FE8FFAACB3639555271BB94746C580F93DBAD655904DA6
+04D8537AA58ED84CDBEC5BBADA146A52FA1E5D41EB1B647BB498476E7DBFBFC166FB58D6
+1432D27A4822639D18C810B364E9CF6DDA101ECF88775A4DC7F2F6B868993C3D766A0D10
+AE35B880E4EBCD5971FA3BCB39434B0DD26244FA241DC6DD23E092871E40FABC84DA8783
+959389FE2E8EEC8F50B5F784AD65A62BB9C5484CBB18E5B97E80A788833FB4D8DB48478C
+C50D4D1828C6E25E65A5DA2DDE3ED193C8C0F3F8D46136606520E163AACB4F60E2102C70
+B1CB30B08BE8FF8A8AEB10BBF456D9D98C319F4F791029EA8262A1F31DDF4B00A38C27AC
+3071861E6EBF438465210E712D20D157BFB6D0580C80E38E0320427AC14C66A02E40C21F
+D869768D2429708ACC99D8EB9BDCCAA809913FC07C0DC9AD0907F563D5717A1C3CD591FF
+E09E1D80BF4E2A894BADC43CFEA6E268C4172EEED76042C4DF7532F084B7A02C8653FF41
+DB6E90F6C45671705CBDDA49E8F221E86D015B26AC31C229A09B3935D371EC6E00760247
+CB7E3FD01FAC7321B6A44E7B632416B385CFA9931D9C3F540F2710FC32522D2CC44CBDE5
+111A68A45DD3C7F36734C0F9EBC2C8531BB3A088D1DE3F1FD670ADBA5E7152DBB4F5A3EA
+1A547F162A0D4C0B8B37BA49A3761FB85C09AD44FD48A463785409559B9D5D7B12EBC928
+90F0527FACD00B60D3A14BE3A5289DA376FEBC2C6AB4A06BED35F2B83D2D01383B593A8A
+2661F62D472B988F14353C73E4F9BE184B71ED9A4856EAC136FAEF499885F457C3D0CCA8
+FDB882483846FB03144A8209BA2FC26739AC3B26B741262CFC7E282A8A25A9AA412758C2
+2CE098FF5BD6802671802C703982C77684A7B8C637C05E4467ED5677FAB489278E7EB9FA
+8F87DB5ADF532ECE04B0BCDCD3EDD2251D066FACC692A49936087F9A47F330F86285C442
+B6D011485308E0BCDEAE3EEF96CA7FA64DEE19DF1652F897914F2DCF781C2604AAF6718A
+A84D3B399A4E2C43DD6062D82F98C1DF54F53E6BFEF9153129D6AF428C4CD0F31C73F984
+A86E4DF80C2F16ED667EB5453B1CA427BA7F2682E922D3DC28B838275458E40E18662AD7
+BA35C72EFED284A74FD815143B74D37FB2E8BF779AAD4728620806CCDF264BFEDBB3574A
+E194ACA846B229A4EA91F61FDA8A43D03486ECEC1B217DDA8665EDC4D2D7694B1F495C25
+D01CC7D5E75D63F46B5A5B50F5F1953A4D38DAADEEEE31427E0B31944055AEEE79D3AC1B
+71C6E0AF328CA370B08DF94B5FCBBA2197349D3AFA87AF5E1E295436BED6B6DD7A30EC1C
+1A695FAA1D49E4FE4DF9EA786AAB2BF4BEAF7A6228B8285D7E40F878976A26DF42441B54
+028DA4CFBF0A2D5B87B151D8CC6778CDF4BA5379C23ACA5BA1B1A01DEF4C9466D6FCFE58
+9B45D74812F3C3D41D31CF73F3F3552CD8A74FE3890BBA5A03A126668CAA8D01577DAAEE
+8584ACBB3338F465F03CCF90CDC985FA61C1F73EF6DE1506DC1D172EADDC13394479EC65
+4F67A603D72AC8B01E53A96D9482CE3BD05ECD5298EBB8C5C391D4DC3E9EEB38268555FB
+64F821FBD15897575FB899C4F29B79DA9B636B9F96DA89545BC50D8E7B79E0A212A3895E
+A623301D444D33BD2CCCE8DB28EAD09EDEB433ADF42ACE6F90084123A46C9DF2C9449C00
+1BD79AB9BAC642F2D62F2885953D18082D9D4F649CC4D47988361B44E7F4748BE00C9D01
+AFF9103507185B99DB72C69AB2EB0987BC5DCD8B1B5AF727FD8C60C30550827BBA95942F
+2B06DBA6FA3B87971F811A6B4F862DE66A47FDA740743DFF5CBEE9D6895F21DD738768AE
+A69AB4A67EE6E9C336F461B688BFD7238562C609F0C9A88F7BC271FB8566B8EC4343A78C
+5AD8A70D904E2203BDB1631C256A5DD168E8EC72E776D969757986AC8871D384020E7E72
+56ABF7509A379B85ADE98B5BD970940746E08B6FBF32A81875959AA0DF409C61A4750F4B
+CA20E5203F3F34FA251734120D40005FA5D41EA2DE5738DEE254D203E8F456E3281C83EE
+44946144304DBBBA7044A1CD934A88FA740E7774A8CA7585460F1969328ED0A543DF1DB8
+1664875D63B6D83C705735C12FBA774E926841F234AE0DE977BBBF95A73768FE1758A09E
+1CD5B459F96978F3828199672AADA65DBFB07647037431D7291AB49F815B98FD3F032ADA
+224A0A4913C41B9BD8DE8CB13D367CE75653DF0593FBF26B113BD9CABF67470E4A344DED
+A49A3284E54A58BA5C9FA3B143BCC99D292B42385E02342B771890E8EAC646A9170E23F0
+9DDA0C4453AD863B4885655193A6FE7689BFE655E027577A7CCE07A04FB8B2407D17C0D1
+8A355AB80204170F135E758B40321319D2285886897EF88C6FC28C54445F1A526E34B962
+0D607EF3366312592C53C87979D7FCD48BA89901D8C5A457D332617A39F2C0B0A6D13FC0
+03D1903D4D4F14880A278DFF55296C2CAD9DD5546346448C3206F6DE50195D66F519379F
+E9653D749DE4E31DDF814276839E74B3B121EF1835AB222E50716F899D33B46178C537FA
+BC3939EEAA548036606E0F0FBFDBFE56C38E5363DC0E8B6CA2E3F7A39A140DD7CD0C12B3
+2171EE94A78A05A437551A6A04BF19BAA9D2FB561C234B24C82900AFC842DD2666752F40
+1191DD5DE4B8ABD562CE6017F0F33579A7932F0C1D98CDF2817E7F82FDCA31197596AE43
+F37AB9913AA6A675187A646F71764124D5227017138C4AD256ACC9D4318BA2515F9D8226
+1EA8AE0EDCDD49298A5E72F5A6E02A15854FCD92FAFBCEA0ADD2E8295EC1BEA3DE95B270
+C1B94C1EA57C934CDC53642F22E1D524EFB74ADCB1D227320C7C09FD60DF92B7EB746471
+8E9ACE598F883101356970CF037C0169DE8736D3C8DDCA7DB95570EDD38497177DF5D373
+05596A49EABA1B404E42F37264CFE16F84404F1AF349AAF334A991006F1E33E2EF4EE99D
+5EAE854C1C45E669CA82C62845074A465B10EB41A358D1917A138CD6BED154510BAB71FF
+711FA60B7BE060125EE8247AD2762E129A14B70F04F081A836B2BE05DDF938465B694189
+48AE143B0C2F8FA19783071B06BF9F4AC2AA536AC614C09C9755ADCA8875EA747919230A
+4C9D7B527AE5AB35D321976D3D15A64268C6914D8CB90DDB67C853754E1CAB502A966B1C
+85ECCED68FA5C0C4A67DCF4A418F989B7D7A4234DACA7FD5FB6F414227110276D5A662E6
+C5F4CF32BF6E3C668BFEF6BD6B896C49FA7BA2A864EA7B96DABFA0E4A48DC9806632620D
+146EF511294D9347142EEE22BA1A92567800F25CC3E295DDA704F7F15DC5BC750385EF45
+6F1471F009E01E40EF30807AE283F8D447E2E57C7A8ED2AA90069D70343B5596B892E130
+F562081CA34F02F1BD83B2EB31EF4C4FC0FC512771DB2B5DBD5FD7A23C81B4CB41F35A61
+64F734585176CAF4C46BD20DCA7C0C257081F6E9B46BC091AE12CC10F7C5CD47E595007D
+B441679CDF07213FF8249DD94612184F6818674A32702FF0E2C47F6997E72E04AB205977
+6CDE7C2D25EDE2F65155F49869CCAD736153EBF5DC5FA158F47F6EE7F22EB8566E85BF0E
+42139419D00C58F841B25D9713D3D3A1707AED6CE4F40B591912332803A54484A80D5582
+55944D4211504A30C0C298D6B200642F4BF9000E519871C8C4F36EE57AAB30DC3F3B9098
+13F0E0C9B3818BC09B077C3651F323F60BCA4A246861428E11090DDA0B3F21E8445D18FF
+550B0370DF7006B460A3C597D8F2A6A7DC945C4BF56B684CC2D5571F792953E77E204D73
+B185A6ACE60A674857D4A25D96619BA01E324FA8AE9B0B1D9584E1D4232F184533ECF415
+2297D66C7D1AAF80BCEBCAA924C1AF31AEC8DC9A095F0C23391E589BE287F644E2611C0F
+4FECD3A3E865F94A4E42955FFDDF43826D20E43AAD50AE179166D3DA24AD854F693BDA6F
+3460C369FE9B3DF5473A11424993BA02A19E89F6F651164B010A967F30EB6B6C7A626079
+29F900259E0F524AE9ADC5BA81DD720F29CE5F16E99E892A0226CEA75893E0ED8D0F347A
+761B8C7415191A56C02F9DC51A9E2EC2EE6D8652B1D0EC17C367026EBF9EAF03CC504721
+F1E296A0CF6813CCFFE4BADE22C7258A2CBC340BCAF2E53FCDF6703CD1341D6F3FA455F0
+F728BD67E8C51E64AFD7C993E1A62E082BEC02119D9C7F6FBFE95CF6F5A1DE12127EC32C
+7ED446D052DC18500FF5AB877F28D19A514E43A7167543C0FEE25213FD6E7DACC581981F
+8EA350C5DFD661CD742024CDB43713F11C6038FEE0DD2FD70315E9051E3D39A04340C1B0
+1A8537CF81F0DFF93A44E77F097048B4F2958B5187CC9D5153C6DDFF1F20317766B15813
+40DA8A0C59ADB69CBA0F452F91D72F605AC1BAE1CB3B6D79BA27D81D993A482F114C57B7
+6E9F9A76302F2B3AC7BAC7E89B663645B3EB20EF8FA3A2ED8DC5C083E31EE420A5C1F642
+3BD00DE17D2BE7ED54125D9198F7C07B67C4D1E9367D09F724A15F47010D8A600DB572C2
+2F8C1ABFAA13D89DF04742B7AF1A67DE0EF8F5FEA4BA8B6D150E12C1D27CC6C121A06BD9
+E852ABA9CE8AA114BCFE8D4C7ACCE8C3B8ABC4CF7FCD2FD1629D4144ECA1FEF00FFA5C51
+25FC4866868B47EBC5D213E9E41C0F190EAAAE4F75651D252CBFF155867F29626AD35FA6
+93DE991753B5971FD264D7D5F64E46C6D8FE0D841D5C4D587F5F246AF9ED2A0D64C3554E
+608AAEB14B9509E330B21D56593764C413ADC23EAFDBDDBB74DE542EBE252D351E9D24C2
+A05E2F69E8B3B2C1ADA6A45D9FD0F1DFD3940DA7B2E31DF288A8666A1D43E270D733FBB1
+C8DFB7C457F4790DCDB5AAFF0A704C1DFC0AB19D255F57F688CC60D33CF04717591CF3AD
+EB14D92943A2C4D2A582315EAA1E823E6851F8003BC1BE8D62F4CC1216D9C47141856CCD
+5B57B7945DC0C1CBE212DFE946D55C57446A5F5957A0E87C57734EFEC056E337CE8F21E6
+51B93C72F951A07F65145EDE97CC550F5CD47488BD380FAC243D055D45536946748B9061
+9E6F8E92D8733618F0BDB6119AE1FC8C3FD78C11DA123375765F7C7F27384E26A44294FE
+E72E3F54857B48C54E32642A7FF54B413FCA67B75776BA8CBA66637A02F699003CC2F46B
+265EF6ED1A1F91DDF93207CFDF154A3E514491F8D4596C6BBC218457209CAB148A3FED60
+1C55322D6D147653F143F63345A6634D310C97ADA5DC805EF414DD3C883396798902FD83
+C6E99B165C3704EB9F5F93DE9FC90F02D5D88CC764906FED7438A2237D36163503517ED6
+4FA6A9B590736D0A1C3B6D3FC9C1C06B008223661447FF3DD0E9F2D025CAFC28F8B4D670
+D7D6283B309FC01F3158322A8EEC6F9F3CC318D7FE9D5282701B546AC47B477DEA6A66E0
+1E66D11C982A57D3E73D399E564353B314188487DA391759CCCDF3D70D9D2ED94BB65947
+193B89F24B74D96E7CB001B11DE79244BE770152E97C9D1D9BD8D7CA07D17D8B00656905
+2B1BA07F07A5E34E80019CE0440B42E60708EE0B781367F4935A9570BE2C6F262F5C292A
+8B2DF4A0620DF1BBF9607D1B9740B165F429EDC50BE05BAFA1C944AD15EFD2D36E347CA9
+AF467ECCDF91425019AAA939D31055A419006B1BBE0F099476AC5361C5DAB7BA11CFA2AA
+A715838B9AB41B7079F0878118942CD0049A252AF588AC56C2AF0332C5F8A7FA4168D2F0
+385BF5FD83802E72DDC526BB9FD5F22691F6629358325FD3C8CAE235A76B2E021794171C
+544CB6D8F2D369A3D4CF490C749CBE16F8160FB1CB24F0FEF1BB02F83226748E54A9F9CA
+A7149C03229E0CC8C98162DAF632BAD558F342FE12431E4E03E202B109701837EB0A4192
+E9E29C049FDB254BBE7F96D13A5E6AB924DE1A3BCDFCAB717B0B46E0A76DAA7FAE3E01D9
+AEADEDEA25E043C0BE51E2D9AFAAAE73D7C9D8D823C48BD680C777B8DEBC88D3AFEEF22E
+D5109A292C4629E55CCAF496BFA056E74D43C900D1991D2FE02FB1846D99B7B46B5DB210
+35082EDC5AC171AD6AB7C12656A3E494DA4944F23F8A795FF9D9B08DBA5DD1977B875A81
+DD9BDDE7A1D742B9B5C6DC1AF3B9290EE45F11BEC391CA9FACF6011A9F0F975611A31512
+919F9B917FA0D358458382480E87DBB493CF1365EB8542B0E48C7317F8528F0DFB0C71EF
+7ADF7308214D7916B0EACA6CE6929A673F5821BEE6E784664DCA5A26D19F42EEBD25D768
+710518F6090E0E387172738BE2B7697D055401C99F566C1AE1AF49AF35CCFFBCB5378026
+23A698E9509EC6A95A30EF72EB6B87A50FD5F5F032A359FBDDA06AE74E3083C36856A198
+86EA9DAA0DB8DB9AB6080EF8F9AC5745734B3F1BE9F679F17F59D7640F1A987C23655C96
+1AD52C46049C78996A4D359A8A0817E27776873E3A8E3BE5507D693BA72C876EE13472CE
+1FA39335674363839DE685FDFEE7396A3A9E82C13029313611BCC212157CE88FB5CE9BDD
+CCC5867ADB5765D239149CD61F8CD30A99572926219EE987824B4FA2790724CF55BF68C6
+7B092D8672D8DAC6692394736B3DCEC4F129FD986DEAEE1C9CC5D2913C547DF9F47775EA
+A58F6E397D7FD4CC3643C7AB07EE05E7A4E7D58581B25764F30EA2F7FAEFFD20FB53968F
+8A7570F978257D37B78DA40A1CFE4F5E3669BBFA318292890D2F7AFB43CD7046579528AB
+061E2100D0637410E532DD8944FF841F5A5925D664FC180D81459C92E2F8941932E09C0D
+079B9DDC2C2C8A85978E4F76EE6D63D0218F7F980F162116A1323401CDDA36F7294FA7D2
+D11937E7C2C7771EDB80410F093774B6C5C2DCB8825542B0F2EE315A200CEC2128107CF1
+18C7682CF6BE30047C24307CC76F59A1B2196B1583A2DD0DF0B54789DC31ECC4A62DF822
+59B0F4842E79E120BEC15F52916B07108AAC06BF9B2B55D27C1B72B13766679C6932643F
+1F6C3E0165EDBAACFBEB760E15EA39864C8670FBEC93E4332874F5E068F5AC9BF6C9B165
+847AF36B6ED181670FA938B0BDF5DD52FEC4CC20482B6C4DF2717CB5C1660224E8922C1E
+15714AF585B221B0D0DED79D4A0C50973959B96B6696FF41411506063B54BC5F2A6A8F0D
+4739D79EEF11F02F56342B480ED63A6548CFC8664A38693C375B214F13C9631C716EB6DE
+FF07037FD994E05245905ACFCE13F36CA3094B7AEE5F51132722768CC0BEBD2070D277EE
+E8534D6BB19B3106384DD40AFA6D7705D432CD27D3373E3D23EB9230A4CAD00EEC9E7E0F
+6DA1B11BFAB26939F1B409C16740DE96A1F509A0051C8B0E7B6C296F0DB1807B4F8A1001
+E3265A21424E402100E1C7DB4A3D8D3A0281428FD8D4CB51F2F6101BC64F527C577C39C9
+7530939965BF86B518FA7A59DB1A428A1CA0EDDA912BED9DC9BCD6B8584D1E444DE67987
+B30168C68FA953B9569D5C57D0CE40850C62ED3ECE907EDCFECEEF530BD6A198CCE7E499
+A97261FE6F0B6DA44CFB4594D93580260CEFC26EFB4FFA986423474133951231D684083D
+8E8290D0181A23FD8603C6AA72EFF44E9D4EA3B24063F4CEF56A1B56E9E55A5A774B1808
+6788619767D0F2746735203DD0B79A964CDEB87942BB64F7ECAE9BFFDA4A06288F6DD481
+935B8F77718446D880EF994136CBC4AAEAA73669907BCDED2EDE0FA5D56ADA6259147066
+F8FAE712FD24EDE4C5EFF2AD52497F0D637E8052B8EC7E34B138F7745F61CCCDCC0B3869
+BD81E8572C6E5B1F4C48E334498B81A8284CF6C6D81D4305DBD8E02504AC36F159EFA3DF
+67BDA0D7003D744EA7BAE583BE3D88049741FC93A51AD64DA3E8E8A25D5BAA2F472F930D
+C68EF8EFC8DA7B9D131E664B7649361CA3ADD2AFC00C700C3F0F8C007C008D001175B569
+AD2D87807CBF02F38CAC0D501CACBD06DD19E093CB1520E39EC8E63728DE89AD7224193A
+E0F1AEDE9D14230BDA0561F0A508933AA35E7E523F25D97ABE641E10B0EB32165A0EA9E1
+A29C64BFB75E5D50F47A994D675419667C638730B718ABC74F9107AF7D51C042756C794B
+DB008EBACA34AD3D011B644FD927D758DC37F6054C033C7741EBF00B6C94C777D9CCD8EB
+FC414E562186B2367913B505CC3B73CF4726F243E3108A42BC21668CD2DBAF3534ACD4B4
+175476C554F2874B24D6659C844F2E69CE9E27225E967398A519462F741E166D91797E94
+CF47F688F4A90FDB66F12B229D254BEB0A7A969C892AC39B42821FCEB64B184DDB5FE57F
+727B3BDF0CDD896DD064BBE23A61D7AF2555872514ACB5DFA52B390C20B732465E63945F
+6E97673A94BD7EC92A8FF8E5604FD2CB4EEEF65073330BB807F7041E3832C8076645D86B
+FDA6D17E13BE3FCBB8D0D93EF569258FB1DF4EA655A9074D09B9691D3431AFCC68C22874
+5719123293AE4D9A783B34C4323A79F1838C02AEDD1B34BCEF228AFB62DAEB7DFF586459
+B0C05E6AE5765FD250F34B8CFFA9866258AA31C751AF0B7EF3004C726FE2FC554CB36B82
+689D107CD3CE99EB264D30B88D3B8C51D184BC89A167CB7050F7776DD1F5A2CA66471847
+3CA4FCAF5464591E6A35E39BB6583EEFFD268EEE90CFA20F746BB86F65A5A745CE008BBD
+EA16D24AD9D551F8F0D6B7404F3F2FA687AD5B33C00F4636E52F9251207A6EF08156AD72
+D82F7561E37399B50FBE843172B6A69F969D59143BC651DD321795962CFBD3A1BA2801B8
+A8492ADAD7F83BF61F7BF82B399EC3998C0299889E1B99D51D33E87D96A78C9DA846D5F0
+2C85288C7546B7AFBE09D9FC3C3851D9877564C321CB68315A27B1BDEC9D6EEA4AC9CD92
+2A191177A75F015E1A911BF2E01B858C241B2670A0C334B1F1A805DBA4DA0B653D551A5A
+35233047584BFCDADE768ADA26B79AE8DCACC6B89211447C421D054C992A2F03B7D1097F
+4E1A8808289E0F4402D4AE24EB8C4E9233DA0581C3691AA8670202319017D3AF56ABEDCD
+B15DF20986CECE980554B07DA79281DECFEE786038FAA1959D5D0F9818E5CB011906A9F0
+E6838B3232FCFB53FD112E7FCC32E714A7CBA6A859DDEC5384F83325D650CF9A960F3D13
+68B3650122DE0AB0F8C99DC7FB08B216EB05DE2E0765FD8FCBFFE9AFA3123C865C6C86B7
+AE455E6886B9D2B71C96DD7BB1B54EFFEAB2DAFB24414CB70557794DF8C30AD520752DE7
+6E93D7EBC0C48A28FFC8ADCB6CE5462D8F9A4A55C10894F849D7D37BA00F2CE4F2FBC3F7
+9DCA3E94B38F5EB0321CE658EC90D7F14C011358C8CFB3139E17D4956C620DBF634E4826
+DFE3F0994E70BD5299D1E59A26440EBE2EE4A2ECD23474DEC565C0A4938A849FD1BFB8F7
+DC817369B9F165149464C69F0579D39E19932D7BC873873F31E5FF2C04134FEB924DDEB7
+97F1345FF49243F7C90C72AE7FF4D206AE6916FF6CF67D640921B59E05F63EFE86FDAD6B
+7C23A3D8456131614F684B17B9C7F51E08E5000A9D48A9766F0E59F32539161C33576ECC
+80BCFE64D5617ABAB89A385C4970FFB040890B48F0AA9313D60C5DB6D644F25D489E18AF
+85E60BF6D45C6B2CE2EF919A731D21B58910780C2914079BC9405C502716B53356B5C996
+094298FA7C1300167EBE8F05992B3745C13BF27C0143D5CBEAB5D43ECEBAC50CACC5314A
+183912F14071672EFE50F720B48D2A9562EB7E32F53D758DEFD3768218D186E69CE940F1
+9158B9BF2E48A3279759BFEBBF24B92A10251B462B0F4FBFC141AF82567562322F517071
+E4429643C86FAD2C65466D05AE069F65025C9CCD8AEF02B70A5DCAF9AE3DB3676C587BF5
+3DF2976AB06F388E0034DB3AE81298870B0A7B55B2585172CEB411622C25EF27D7E6076F
+AECB5C651916CA76F824916AD3DE239C71452C97D4890ED29645F36A53C96F05AD1734ED
+8D1BAA96FA9B7EAEC5A639AE3A18D481788AD64C07E72710DCC4DFCC70D2012ADA03AFD4
+B75D4562B4309E884808186F96F783F3DBA1F069BB7BFC9EF1256FA4EEA3DE066D610D60
+81162C242E79F5EE2BE5DED2A4048B7806CE87FDCA7A1C5A087F33973C8713CFBBA18675
+DE41DB2564268546DD5D1712F9188FA277ABB47F3D73B143319E334616B1E90C095CBD46
+227AAF3A5EF9A1264024D74EDF17288B14553CD3D89D5009837480EFDE16998555E95FEA
+D9AAC596F9E1724D796537A851722E53E499C6D0EB0F92C610B9BDDDB216FCADF1F47B49
+32CD25EDB3DC5A22F8AFBFE9E85F84D8426D846B212A227B68F69B8A6448BFDF241F71B0
+A6D6A345E321413CD786C2503A9B4E1F79AD888B61B6EDC3A2CC523992FB25D5475493F0
+A1C11D3BE6251FFCE352D717338B72E238C2AECF60742C62F77B0D0103FD27E548DBE762
+1AC9F07DCC86EC380513E851FF8A7FB661AD225C8C0DCFD5C0AD05D0BA4CE50FB3A6FD13
+7A269CCD2C0E7022EF1323F7A5A15AD21A4ECA04C4D247E2D537102A3953E764822DB224
+AB42FA19C445E4F7BA674C40F304E0023B9BDACB1453DCEC6A961DA4FC7EF52EF14BE91D
+A26069D36C4BFD09FB91064B754C5295F222FC5ACACFD1B8E5D24CC5BEB61524B825ABBB
+4F4D025049C31898398C6C6B547EC4C9E92AC9A906DD717077F9D8001723FF61B660C951
+2D329C7DC90A5D508841FC0738AF338279D9BC016F89D812DC13A3A74D7C993BD2AE352C
+B1B879A60184667EB8A65A5C77DF8AEE5DE873B1A33E72FC838E90BD8B803C5DEDF37352
+D6E394EC6FCC4B1BD94CF579288B6F8ACD79A9C7C0CA4ADE22491B7B98320DFF1DCB08FE
+B0E76E0E650C6646F106EA73B7BB678C4CD6C5560E8FD3DE3848EBCBF071E3C757512A09
+1BFCFE74EFC5B6C3CACBC39287737C8F454BC9C1BB670F5B44155E92AD1EAB6878EF8C68
+CFB0EBFC2AC1801EC5B63D460562940822FA1942C58FD53F3F9C781DD0D16AC962029735
+12DA01DF3BD0C4719B323B3444DC2BD0625986B392A927C2E0BB6DE6274F0BD89AB9EE97
+E004A7C2CED9A00E97C95C384A817AB1E45968E2C2B3D8DF0CCE375BB4286624F94B1D39
+1C2D183652B43427E3F74404DA00662A442001C4685E2DE4BD450146686A2E23618E7B95
+795F3D2BD6E3F9AEF093B8F9A00ED2A8AE29D9F37C88B9D964639A94F938D506C2DC31DB
+E03DE6271CD9339EA4A09D93E1A2F889024F3110FD96BDD6373810001DC336EE828C9827
+651D286104F3CAE019A98FE1CEB6770C8318B39B23BCF48B8DF6094C3B95D303616F31F5
+D478A0330EC4AF2D2EB1AAC101BB8DC082AC9D5D3D1158AAC1EFA382882F021AF815D7F8
+1D103748F7A9622618B293FFFA0D343A716827CEE5B0F89A3FAFF8934A90CAD616F462B5
+597ADB47AD0C2FD4DF962C9CF8EAAED05AE32C6B3CA1BB592E59C6D66AFA8084333B0A1C
+F1AC87776B3D215F6CC8AF01347B5758D21FDC5E840681F8FB78DB691AB126C2CD5D2946
+BB8861F1B66D0B87FB3FB3B490F9F1800AAD3C8BF2696673FAE9ED5A284D1394B63A61F8
+96FE149F22927256C48942D87799FC40CA85B67F39DA1A460489833995E322E0F464E934
+DC51AB62340254546AC971EC1A5403FA6D76D7C2FD2D67CA123187F2D28562FBFA4D2E68
+4C48FA2FF7A8688592C58C945A9DB4192D9D22CCE31B7A496D1FE2694C3FE1DC73EB72F1
+4ACE5E09643F7FB7262B82FBF47B0DD50E4DAA044A58CF359AB9405BB2930464C850E849
+9224842FA1F4B1FC904187AFE8F74A3F9D3C0759CD2968EDECC771A30713C9DFF9F615D3
+E1F4D77442F48138D45CCAFD57D3A38F85B483D0FB8FA7C48BB5323C9A3CF053A0BC9ED9
+797BC0B4B2EE2F06C4C00F67393E0FBC2F63051785683986C38BFE085390F81C7AB8782D
+FA95785A11B1343BD69544EEB1767240D16DC3B677F0BB2C91ECA1E751648B42439582A9
+CC531FA5A769FF2C63A74CFC0B7E2E687B67DA4E8A8BA34830089E2E288B750C227E73AD
+231D3C7B9F5167FD9BD14B22371CA4DDC5B8898F22C2F31447F99770447C6F037CED2CD6
+CCBC79CA6CE62B3678E9687AE70FBF2E2FC96F9889D2FB48566C822E602BBE76FC81C5C2
+F5F449DE84894C98DAE74B79B438F7B06916011035D16D84B46ADC46B91D6E9D5E203D1D
+90A510873447D8635FAEAB2E07D256C7B8D1026C309BD852618E45F53544D8F35DADA620
+E1D4E891336AD338755A4671DAEE4D4D676D6B810D277EF1DF1F53B1271C8F4E9F74D516
+7ED80418322EE6BB0DF8C398734F9E5C48E400EDFF3119A98CF0934ACBA18520796C9165
+9CCAD33C9D4E0EEBAB1924DF01B9948EC24FB363807B5EB654D08ED126A4541A4F8DE934
+C5EDED13DA452D215F335F4B1BDE7A08599F5AEE5E1E8D04C48AF22543C108559830F978
+4481E4B27196844010BF3E0A348B11A33ACBE1B9C21F9EF5DBD38F2307B91246AF6757B4
+AF5EBD71EA86CE3428AA809A6F80AFB6EEC296AFAFECA0B15C8A77FAF45865A6F55DA01F
+9BFEB52158B5C060CA420B99A558452436D0C28C840B726169015AB821E86CED6D9C2C1D
+125CD630FD218B2E7B21DBDD3021557F05CEB4A9A92EC66C15556BA05647D858F2CB7951
+8497E2D7812064EAE90D14DA81B5CAB4A2EAB705DCF87301CACA0DB762B52C08611B0AFD
+0E5E3288D5D9F54BF2ECD9AF5DD5F9F6FAF010AEEEA82B72FD818CECA713CE5345C67EBF
+20959544E6130B4675F6E12D11A35D78FC1DE9296BBB63F7918864E2EAACC0C3E07C61B8
+D39D1104AD9F377F708881D15C75EEABEC4121E1B9A650306ED5A40FA9383130FF3C1FFF
+B5AC81D6252025CFD9A8B1B151242F27FAC927A753D5FF067DDD657A5BA1A5445D282BF0
+0B0E406765EF8F8EA107445351967931F4FBB24E5B20BF84F6D951099EF9B7CB94772530
+E7253FEAE8E0CAEB692A07F86A9117C2E7BD653610C4708252DADFC37DC65881841F75EF
+CADD59BA6013CE26E79991B7F37547043A0DA1685A094F73FF5776BB6D8FA6281F0EE1CB
+E7C8C163C3614D2CE0816BA3B2D520FAF29B308053C16AA8C1BFAAEA80BA8F28E63D918D
+4FE96734A761E50773A24430382B094E349A634BE92253E59F41E945DA8509B0D46534F5
+9A4BDFB024B4D56845DB3EAD3F57B870AC49EA23D671847BE861C7A45B677719E78C1624
+63B604AC814FE69783154DD1E65E87B8699A94C7AA75111E9F161F3EEA7A3AADC2B03C53
+D0C2246889FB81935A54ECE5796A23048B8B64EB5AE4903AA70C7941EEAA0A84E235D173
+855F2EEFCC2064AC1919C3897E50419EB6CD2B36FC5DD0A6A774CD2EFD34429AC1017FEB
+036DD0BCD450EE4237CC87D68D9A6B8A76265E8393D4C518BBF16FB22B4EB3A09634DFDC
+F102EBA5FFFB8E654313A87700891786916AAEB2D6DC71651454D7EF27BE43F087DADBEB
+F415AA3BFC1F89AAE1E65E4D0E43648BCB5B3FF684E16051C4539764012C74E97A4859BB
+F8D8159C306F114C089F861BF98DBC80C6F40617D4BE4BD742C0E944BCF7805CD9D208E7
+15021A24B5B8FC527E25C48613104EF225FF0A089674DDA084278A549A6A0654CCD1EAB7
+7A3263E6BC4B21A2F9CB20E8FA64F314415C5A343AF33899FD5CE186883D36A83A5D8F43
+363EF0AF403770B5D3936AE3C716AD0C9004FFF3629BB549076B748ECB14E4AF294D6FCE
+F60D8D176939A5AECD5FCB21DDF7BB1D9873F1546AEA6302183656A3794293CDA12B4DDF
+59A373E2EE4297F8B1743F8A7BD4696BF9BF0361ED09FC5F1ADBFCC3351F63B4346F4595
+49AC772514436AD63105A65274A4BB8AF166ECE955174877BDC1463804DD50F4E609AF0A
+6B5BA4A234505DBBA7C00FE3CB37BE58BAF001F87854CEB19EEE90D2B97E054899314C94
+A71363D0FEAD6B0A4C641EB293B2D5D2869E60D00A5E2757CB19F6EE403DDCAB8DA6D0CF
+6E88E9B57C335E6CC00C12F50740D9047C576BE51D27C96C75882117CBDF484199EBEB7F
+D4B2D70A1FD657049CD88D9A3038E86AA7CFFB6C3731FC8D5D8346612FD37FB8747FCD42
+F6F5A1BD43C2915B6925F45CCC445F30D24B28F69A2A964317F8D5845FBF87C2508D3504
+925B272F2A0E5551C7F193F8922C64E002033FD453C044238F54B9C04014E1908E5CE4FA
+79FA2384192F8830C8598C4D3535717D66EE306F4A94BD11A99CF92D7CFD445C896E9E05
+359A5485BC8F23D86CBA1674207CE28AE8F4CBE0513E83F6C58D2AB3A11FB50584EA7BE9
+BC5DF5613B62F3E0D04D194C18F6D1461132E3F4A83CF3CA3911E533CACE85236518305C
+337AFDF89B86410DDBB77D3B0A84655876AC9E4B5AE0C32AD43F57295DBDC64C1AB1C105
+39DA7FF9C3A15C44A2C1FC77D3D06CFEEBF8895D8A7966CA9006DAB566B3A31D7B76D534
+A34C8D4D0E4EF9E31FAA247270FCFDA256D00DA53D5357652509ED0D44335C59AEF56508
+DFCE479AE005F63B5E48ADF18570AF87B92E4CF4FD69A927C178803BD0200ADB39662AB7
+7D2A067306F17D30040EB506C9AF3E5BA5104CB8A33C1CA953332615E086719B26BCE4E7
+BF1B8F0CAED7FC3F0B2AD31166557646E47A5B42510E4F0C15D5AB5A92D1FCB93F0BA054
+AB26E6FE94643F175991A4419EAB1A107B241960EAE282EE3FE52B43924209A4CD3D5212
+F51C9DAF1FB08ECAB4B4CD1247E38FCAEE42E9B871F66055D671D8F0E01A581E775E11A9
+6F7009EB75A1C37F646F6F7CD12A177C1DB1C005FB82EBEDF960071B23A59A11190FB570
+3D071D6C2C6C6570274EDF2E0179DE7F3724253907B53D79D8ABB66007A12CCC989875C6
+D0BE1071973DBFBAA88340633278F75CD4FE41CF356D91AA54E8C528F8BB57FC50414A22
+144DC33BF7F9555BC9FEBE7147DEE1D2871A18487BD8B70840C212A480E99F47E530E6F7
+3BB26D0749496C5292C9DA9726A5630E410471D3E2BDA2C1D5EE7E664AE22D17B087C814
+F6AFCBA06414D3EE9D444569204323279B60612F823296D66AED52B16A51EFDCE563D9E5
+FD05B06ACCA29307A7FF61220F7FDFFB59C76A9786A4B1ED056C5FF87DC45654BEC26444
+068A163FFE1791CE48CDB771FD1231DF44EFAA61B71F8C12796BC1C48175E01E28AA0109
+FF6FD8D04E3A1FC149F7ABD3F4C1C95A95094A0BF867071EA0E3954FA485B81FA58094C0
+B2EC09A9A2C3D6F24B0F33F21550E051B98603CD82B70852D5B90BDF6386F7EEB3C23FF6
+1A608CAC5CE44533ED3000941366E5FBE23110951635E24731E0203583ED6105D560535E
+352D322ACD0C3E735FC3BC083E13CC965B090E50C860CD8057B0165F17C1D56505F83A3A
+2F0432AB6AFC4598E24657C8493487AE704F41010EBA2EDC65281B7EA6B7A9D3A81F2109
+0E391A4467F99F29327588B79912C996DB25450F1E4122F2C3372AF23F705C9FAE55F8F0
+470A34FC6BE741DCBCB6CD5C1AAF80B545026B6C8A0F02FD7C2C81AAF07A91C8BDA6E946
+0DC967AD4F5D2584575EA7D4433C25E8B003BB3A78E60CB8DA00696B8A1529D0C6D893A6
+72F40787D5F3487A49F8DFF8B12B937C1A5AB9EBAD201EE863F3C2F1120AE907F9DE48BA
+08BD4E9FD30FBDFB53D99E4577090DDAC9EC6E5BAD7049563208E65E85DD4C582E0CA55F
+49ACAC1F4206C2ED425B6518A34DBE601CF3CEB4D9FA41453B6BC61ECF138D88521449D4
+3DE0330B632C44006E3439F106EEA301A16C858698FEEB028BEE9BD0EB5A991EB24786E2
+823ABFFBDDDCE250BA9D1999AE95001C5425BFC40C81B4D514627A992C343E48FADE88C4
+7058F363CD8D73AC8E8AF732EA6B80224EE0C6F63237CECB49D0615D2B4F6F26F256C4CF
+D07AF11DD2C3C8C4D8FF3408B81BF24F98B5EDDE53F68E69AEA7712D70AB4FD7DA51BA41
+56F9A05BBB0CCD25731CBFF350F8FCCEC9A086DE0AF73F2E79C8F0C4FFBC17E834C4BF30
+19A1BCA8A19B86740199DECBB0E64B1F0C5AE18045CB057F4C6C56E29EF366C41ED3AF6F
+FD41231E392B793808D081550E623054BCB4E70E12E4521080FD01E68C86F3070CDEC5DB
+29ED10A76C7B9E3BB902567DB0E3E175382049D372DAFCA10EF7D15BE2845B012419E4D3
+49DE7E42765B349ABAF56BDB3C224DCF7B3C1DDF3CAA5E094862B5591C729BE9A87AFDE8
+33DA40BA5FF2DD76E08D24F427AEFC9D062E26FECB6C89B30D64A0C393EFD3C2043CCD27
+2EB309072B8D95FABE7B33825FF955BAA928C39909014B79DC322FA58592ED1E0F59EE51
+335F59221F3365D2C9864DA39EBF9B75920B3A8A10DD4AECDEF40BC6678DEA8E8EC0FA23
+9D6C84797C3557ADB94D89B0A3C90906D2234A1D1351413FF40A21E20A88E108A9073975
+42F11CCC62107F6A0A21B148B7796002D4C093D98DF034B4A91942F75D6FB332645640AD
+708DC99C24E7707185273225522354421E8E2CE82B1A35C6A8150EE2AB2B8BBAB3F9CBCB
+6E228E3215193D31E9A8FBE9C9D2510F7D466B4D7AD5653A1D488DE6733E925BAC044EEC
+35BC3BB7FE89101C0CE80CA03D2D4C36920D5F93193D5393412360B3527FA24570035905
+129CD3A0D246D2BBC2FC828EEDF486DD6DB487F88C22F69FB740E6FA5172ED51C1038A31
+70973A07460A6A5F188FC6F7B52EDE3802201DFBECB7047D58761DB83A5C3FEE6AA56A00
+7DC2E973F6F2CC14B50536589D1D1C0CC79A8427D0C3E30E7C5CA2B7520312201C754843
+54A173428F6128F5C9CA527CF6CC184A8BB13CA99093C7CF79DF9C8DEAD5D83B2400D9A5
+4CA4F4BCFB3845A1DA599F5B7E4A214CCF1E2BEC0E1F01E453FFBA6B4B22704899AA1257
+816A3F2269C0679FB0865F4388493B9253DE0AC6E27AF8E2BE03AC0ABEDB81F3D3F26049
+85F7E5CB024B1C5D6B4BB54E1BCF3AA55F4B5EE4FB3C2CE28FE8326B50633AEC39F16C3F
+FF50C31562D657C12041DEBCF7ADD7E8DEACE94F61344541367BCB28893AACE2FB148EEB
+846B27284B4594C429EB97F151A2A97E7568F818E16DF7C92FDDF350392BAB05BD86F41B
+E898E5011D30D14E977FA538DAE7D4FA36BB9BEC42F7CE474468F1323CF7BB5AE6E254E7
+455C3D2C96BDCD779B49540EC2E8D40F5D8A08B354B2FDD19C136F64F2B6F70E8BF12050
+426E446CA1571CB8DE1D66E992BC77DF6C9A145EE96A4D746CA360386C4CC11E4F409E20
+B0BCD65FF30646B60E7AF9311715CD8A8E50A9813196255152FF2EDA4C3BCA42FD9DAFE3
+3BC46107A4493202DFC2D58EE27B543406A16314CE6C3A701FC39AEFA605634FFBEE6A0E
+064368F27FB80363CB061B7E11170D40F937E113F63F0C5D3D148967B180C32FEF8F2BB0
+E4858F6BE0B3687D99918A14FE1170784950598A1A5DC1525E845FCC6505161B064D4D02
+2C83CF31E7D0CFE5FDFD1BF04701C923E4E0D8F8A3ADB9054A989CDEC203904B3F3EDBF8
+3E63B689063F62E64F7940BC259DB25452876BC690435338152AF3C3D9D49F7FFC8A60F0
+74B2FF7EB76FF32B1038071EC6F22ED98A2A041479745ED4BA29A05B9B57E64DA39305F9
+8D65E03DBD9BC1DCB5F1B45600FF3B0427A48CC29596FF057C9598A3AF54CF4DA92A9F73
+0812E57EB26F55EAA2A15C8FD7700098B8179CE95113C9A133FFD90B8A6E55A159F67CEA
+E3846918FA80FD25730147BB01C7FA64F279278102CA552CC07AB835576D96DC74E44358
+2F5A2122DE47AB75D1E06EA756AAF0341F74EC67A306483C7DD79ED5E54402C3AFF070DF
+3742413BAE13FEB19647D620EED7D215FD19BE6E9F10A5E9EFCAF7F5168B2249789E7C91
+08D8EB73B9CEF8D07EE56D0629978F06BF73EC312A71AC59947BB41B1041453558832F79
+82650E5852E749592C30D2212F56843991850F91C6B646CEA0917DC2E41616158C1C0C4E
+0D7C83C07C4EC0E033FC722B163C83DEC04FFF05DCC4F034AC29A52C30E2EC47F811C613
+76FDCDA1C14486F7C25F566789BDD06F55962AC66B83E09978470951CD3D2258410D5F88
+7D59D6DB4FA66AB94FF3A921DBC5EDD09A77FDA0EEE7DCC3EBF162075B0401A1E0C9355D
+2FCE79EE82E0822712FD5DDB8A3C8D4919625B9BB9E6AAA6C94AFB97D126AF13D2DFF2E1
+02B5A7AFB7B2B2EA965AA80EB0F68F6CB389792C3ADC62DE6E52ACC311BD53022B9413C5
+4E2A23FD47AA70FFEB5EBCC5A321CB556A85C9E8F534CBD7C23E8A8F1DF866433559111B
+3116DC3D6E0FB653D6DA8DA9124D68091A0F687CF19A569FBB1DEDC3D277A5F52A925A4D
+A5F54E6F3A07761DCAE3890FC74A984CE2A441BBD043E6FC47677E6CF851A9023C75B6CD
+170645FE13A9C554AD4E1F12D871D4587A502D147934A3C73A4704D94DBB5A4246EC4DFF
+420418D14864E2EAE71B015DF3182873AD8A34B5E56A4E2A91701642956F841992EE4D6E
+566DFC423F23BF1330890BBEC31C5E9A4CC280E436B538A0D782FA44467B5A22C2512E6E
+5237D5C43709AAB9771F463AF2D17F5C034909E77B20E148AD52FBD59E56848BA63B4CB9
+73A8C0179F7AEEB5CB42D49515C86A869C5013B452E46FB75DF6EC6DCD7208C00A7FEFF4
+00F05F8A103DD4B4DDCA9EEE725002A48C5750568650C838CB45331E07D5EB709D89DF0E
+344ADD65FD58410CFB8AA6BFFF644159D36277DE9D6801FA65D55401647D577754040333
+10205B67DA9D1C24428819D81749DFD557DA8C694611CB3C8555A7EF07E360CCFA423E61
+E5441DA6EE3532C78E48FE2BAF4031FC353135B5E1A07F84BC294980AA4BB6CD1A089983
+1162C2F3CF20301E06A625FF1B32188E339C279B7402F65A6A5CC06855BA0C5FDF7AD9BC
+6599054A5B15C430DD57B95DD90FDD32FB23EDFC1244BB44596B8934E8055EC28AF0D8A7
+933129A6BA6E54EDB992781614A013F6A945D9084513BE390A039630CEB9346E71C304F1
+A310378A0842DC3AF35E1FE1D15B62C15A757050DFC15C65B0770FF39EE5B6405D953C1A
+38596D7211D0E072CD3A8CD2F812479FAC2A685F2A53023C1DCEA77F2C743DC3ABFC89CB
+0EFFF52775A5C7F191533B6A12988552E2246A14331E409CAB53BC14579732A3E7D5ACB5
+789E63376811FF552DBEA7F0CB0812FE49DB87C990F7E5E5204BB774FD29170544F3EC36
+7DFCCC44428102564210EFDC3CFD400B4E4F0722120DCF61D0728A6E1861C143E228ECDA
+BFBF784122F6CF6E9C3BE67B85AA17837CEA1C22902AA3CB6F8A7CCB959E95B73342BC49
+C9C2EE8DDDAEB26E12F77236F00F64E2E0BCCADA542375E6442179171AD0136CCC178ADF
+F2662626E950FA670A893E0148D24C6BEA471985EB173367939EA74785FF1E69F56059E0
+B9504EEEC8E534076D0FCD93E9383A290C383D9C80442723C92646B2FA358E94160FD5C2
+7D5E8B657A32ED02DADD005AD13FEC0F046873F7987A4813A66055BBB02BAF0E33EE3F10
+DF0FB67F665D6859AF92E32D48AE2DC094C04BD151E86AB7428D166EF51F2AAB10431496
+370152B344A83917A44A33C057AF1411CF56A19481AC0D72B5346ED61E3BAAECBC449F08
+290877630DB8A7D1C6BC7AA7A91A3286015F9E4064680750218A97BE4E469337B89539FE
+FB42FCF9610EF30E50628C354F0D65280580FFBEF5B3FDE394B3A8ACF80A909B7F9DE2C6
+D8A7F8E8EEF50E81018925C07BE30CF2919EAADAA9F034E4B5BB6EE1D2015470E6D9C1C4
+6335C4D238348B4F04BEC86F9D4B4199309F77DB046FAC19B8BC44A67143B0BEE2E0DA14
+7B9AA39536E3B2A026F0DC50B4E18DDC636D5F737E2CD1076FC375BBC95556922859A5AF
+81C82313FFA670DCDE72E1818B969A3C277FF935518A2335DBDDB84251FB28A175DA563D
+6629D4176AA6372C3F7FFFB0447B09B095AC261255F902E2D6EC3FEFE06A91AFB47D7195
+0FEED7B6F08F88EBDCA3F29275D81ADAFCA700EAF991A34A9F7BD279422AFF5DEF4E20AD
+0F935A34D8F05C87445D529710FF45DF20D4262981F0FF247ADFF7D534A0E350A66E7A4A
+C6C5C8F5BCC16754A4E292F39BCDB4C7A961089B92DF696272910E228C7B4F90EA0470C7
+BF752F54C0D9C4250651932D016C61B7422A57E16B31AC5DF69C3AD75473BAC3B2CC1D6D
+F458579C2B2AEFBA061CBD08EA9C3E51A82287E37A1922D025AF81CDEB9DC054B2C8296A
+28AC377ED00AA06B5D067836C99FCED77E2CCC61BC76B41446F7ADF2B428FB0721851557
+F773B12152C0EF877CB9D25E10F4BFDEEC9BA1C4C764CE47E40C033F521F2C0EADE638FD
+273FF5CC3E02C41715A9F598E5F7C2B98B3BE9FB9AA9FA054D96B224DE60E80D249BCA09
+69E8632A06DDB863C1E5416EAD29152595E9AFA9AF9EE7615DEF92D621DE8D37B98B1F99
+C8B1B0583C09CB0B2B3C3ECFA386A58FC9CCB61BA55323E442719A44E4053E738D978BC8
+C379BBFAEC777DB33776B845B574AEDEBEB8FEE7AC8494BD7F2C22DEAFDC1C1F3FC32E07
+09AB09FFA1359B0EEB84D04C925E4A3D481A6CC7F5CE0B78A9E4ED4B2A5CA40265A5C641
+B5563D03415E9143E04A0BF0A7E63B7E907F8031310F7A2BA410EF9360E83787AE94E20B
+11A235A0CE7352FE2709E6801D40B1C2C745B7E0F59BB9E3D0584570CEB69B15735F7C8E
+9621BEFDDEA3972A77F5CFF337B03A2B98F7852CC5B2F5AA35BA67EFD77FA8856AA4F543
+A02D2DD2EBAB315DB8AEC302EC8BCB9C63AD747565B75156920A3DFA3C4C52D72528B95F
+6114D76948762237B09F3C114320F19F6F6955E9176E08509D51E281FE0C5C9185D4FDA3
+B76E4FB4A488BE2FDEC018EAAFD95AE34B631D18F388401FD7E98248FD4B77ED13976104
+5391D09B9E8291F4DE2E73700E0B6F2FA8446EE6F213740B915038226AE6F1B45247EE59
+119A447553BAFAACFCA8ED240083DFC5E5B35576BF76F2C5B743F9F67BD52CB856400ECD
+A17C64D6C7C1EFEAB8F5AFA6297C32FB98ED5363503E853C01EC8C722FA25A7D18D8AF1D
+A178CFCF64ED8C1974F0FB22B9E969CCD5BF0BC0CF1D1CA40C95D3895FC159DB54364C54
+20C3E476923229CA674B2809216E4EBACB023E582718E15C97240845B5A14A26F250CDB3
+048A55977FCA3174F03E9608F6C0355B799EDE519B7839BC7448E256239DE1BC4AC48443
+52FAAC645B1F40E3AC41027A3EDA09B9645D207F9DB19EBA21F83F3B3904D40DA31E0976
+48C4722895AD93F15A7746294D691927A87531374AB40E7119F1956BBE6B97050548D6E5
+A1F5C93AB9A0A0C52068897B15B014C082540DF5D0A6BC1138C7A30ADC40E7D1F16325EC
+FE25DFE898FE26716BFC4B43C2ECA0F1672C05CD8CD1B204A531403E45F01B924DB4266C
+2013F9ED9808A06A9C9F5C0D7510413E80364913BC2A4BEB5B6E88354C0F4B6C594801B1
+A5AB2C9FA9C4D700C0F274F1BC8FF4DD708D852CA47CC31DA599DDE7031121D1DC9F921C
+2E3D710621C687B4E9F70E530AFA3CE3BE28919A2DD87822431EB744CB80CC4913428A9B
+E36BEB4C77781056D2873FC39A1BB2E9E383A75C009B5FEB7128D32E47D4462C7351D22C
+65833174A1EF2A14452107844E7BDE32B6E9BF5F7C22F6FE3585944B785EA0A3291A6571
+C3D1710D8C910DDD6A0C910A70CB315F0222BBAB919FC4ADDA9394E447CB2087CA216DFD
+E37F5E55F10F6D3B856F37506131FC2B1DB43C0FD0E9E32839FCAE4C5858B126B223516B
+6798B9A5B5C530540CFA36C36DAF2EBCDD505C9AF22F343F50BD3F17E73911BFECC30ECB
+254E2FDCD1FFD5262AF46950D74905F1DAA44BEFA1252C335406EB4BDCD04E766E366BDA
+56BAF1AE1970D0F8357947A729067302850F678FEA1B33EAE240BED97C3BF7FFB55FE714
+78EDA821558A9BF9D40D848A4764761EB01FE6BE13881EB7FF349C94E2602E90C3AE751F
+8F053E5D3E58D2223B5F827F9F443DDCBB073E0777680A4E121840FC828ADE86292A25C1
+432DDF7884699428C9FAAC95B7431FAF331741E408E578E1C659777D0A31C2A1AEB970DF
+B29889E513B16B93F0593920D52614083DF8DA22BD94FED117BB3E5A35ECAB2E9D4F0E12
+C2F2E2E7A0C02B58FEEA68AAB2735991CC15D8667342FFA75F0279C9A7774E7EC71D4C77
+84257C87D4FC0488630D2542A42A3CA2A71D33AA3F6C26DB81359FFB27460F93414BB546
+FED5DAA318F0D69E65BD24B2D5A2AB8F62FE810BBFE2227EA2A63226428C0A304B25E166
+0E073045EB395F7766FB5C50D7209CAAE19CDADA92876CA36C428EE08110C35E1B52EA48
+708164AE7FA6A3E8092A0E0D03C722B004E6FF0486B2A39247E1BB46ED20530D2B46C6E2
+7C0D0DA36DDB69C8918B65D7AF95033EB79D20A363B17A1DDDB765C869901C4648E6F5AD
+7433D117B391F51EA91B3BA250E20F2E0A355AA1C40B7A90AAB08A0BEE52DBF9E45CD246
+3416C6506BFAF67EB3A9152EB5EAA606BFBE8080C56013F7BFF7976433CCDDA24EEC557D
+767326213B71FDFF7A7D0614A827D80608A1275D68142A0131080AF5E1F33C20DF96A625
+FF9E2CADA125956C626ECEEED0D311B11D84CFB7A22126023786370B976F1D0C26FD26C6
+23F531E7675096F7E289291B059BCFC686A8C62D79C9762405BB71D999D1E10FDFAEDD29
+A7FE83FB0032740F3E4624C07E8697FD86D1D18830CD14ED5B853E6C13B6843A390E966F
+0CB34397D5A67AD42E183BFEE79FB7DF30282D47F1C1FA638E0AC7FC8780DD78EE73506A
+71F884E46667E17350069ADAB704F452D18EE42DA8C4639C2BCDFFE9E0006C555350894C
+847367894CCDE2619E562D560C9D1D6A2301EEC0A58064789199018AFDEB62051FE0AB66
+194B30F31C3911853D89DBBF9829FBC8F32C193BEF8D8AAB0543D226B9803BAE6611B816
+91649FCA000AD4F71A17C188A7A154A685092F8889E2C36F347B87E694D81EA6BB1E271B
+D924AF31C88BD786503F669B563F47E1583F6B72DD9D7B9D3E235185261D056E38285351
+11E94330D7B3B2F2FBD3E47647F1695E27871C968A05471F0B6C8708DAB32C85BFAA0F17
+39AEB987698AE83080733D3D0B7B476EABBDE3F1FC20F85AD01DAF3FB6ED7B040A2E1AF9
+58922C34A59F6655B8A24923F8B848C5C1D6650C296E6373BB59486B11C1573FF7C4D000
+FDF679DEFFF978631A81BDFE63478C9F4F3F4E4380ECE210FF79F3847A5770C3368FBDBD
+2EAC9B2F6BBB3B50888441156ACC36718EF4FA10CD7104AC6208EE08F47AE26C02563D83
+945BD2879BF9C04A32BE40311C3E969C99AAD8129AD0201178609D1AFE4AF3E73B37FDF8
+1232F27B0728AA9BC74800ADB396B8743EA72A42BF400DBBD3462405C47387BBEFE1E2BA
+BD600C1035BEF62C2D91241BFED6000915335324408745A3B5086463D9C379B6BB5EE3FC
+68488EDFB5F5E15802ECF6CBDBD1FCDD111600B7D3B20C305C180F416ACD7D5533B66AC8
+91E25F2A323E65F3DF59E3A60D10416EBBF03B94FCD35C314F76567E6E838AA25AA364DD
+F18E9989F7A59560E78F3E98C339979D8CADE6DA8ED1A37D8780475B9BB724D772BBE1B3
+1F8D2E537BED3AF207079A87D3FCF773E1E35F70BB4A18B7156DD7A8E80EBABE18820970
+A0B84DBC768587C1BB792D87BC87208477EE5B40FC84637BC129A3FC1A8B7B50A0001543
+B5EF297A1FDE4747A66437F50AF84C352F2E1AE330C2AEABAC67E1C73DA2DBA2623F01BB
+594E3BB6631AD741F2FE0E59722D9267868988E2257798893096DCC71A8B057F33F94D02
+4F8DB872913D23F2EF81C88F55E871C98025DE80DC6C85A32735BC89EC24A3BE8FE7170B
+F8E2ECF9EEED07C8E4D9C3B2EBC7570F43EB9E5B873E34DD2F9E861CBF1F9C621E901020
+F5C6F1ED1A6E6B6309D78CF6683D0EEC6AAF40EB5F047A33EA5535E68A7AD11225EEB2C8
+92F2ECFBECA687BC183E35776CE656E8417D8040AC41859025C1D7A4083DFC81EB6CF7CB
+55B1B3E7731E6374CE94ECC0CBD4C60591289F322DECB75E55AD0D21216F59EBB4EE6212
+82C8B5B26192E279F7954D7165B2F12712567D81A1058B5E8D80B274A5667E3006030B9F
+2F8B847D6CC96C20EF53D12FCE8A988857FDEA97B6F3ADDB30FA4DD5929110DCD9942446
+EA26ACD975E5752FEFBAAB25C19CD3537960E9A1CE717F86E1476C3DE8C76CE4AE757F86
+CE6EA67ECFAC761341CB68D016F9427DF2790B2704FF709E727B079D8AE2190FFD065121
+E3A6367CFBD03DF7CC138253FC6AB47E4C8A58F53068B3A1E4CB9496792540BA3ED60FD4
+C5382D5CF2F25725BF74417F007AD2006BADF7AEC86183DF32984348A83E023359C7E9AA
+4971C92B6387EC2621391B1C75A70F0A0667A4932D2D189689B52B399B6E8E13A1C4407C
+45852352206012A7081EA9397951FDA87059825755087B27E623193AC9574D4B3E5FCE69
+3BE351F4E2CEBDDC996C8311D11E65AFBA5AB58E6EF00D8C80CCEC97794003F36658D42F
+A95278ADFFA2442717FE2A0D0938A614168591304C5B63DEB4F28953F3031BBA802300A5
+9E571871706AFA5160684218B0645755BCE32F96F4C7CC4DCA63F1BEDA4C3C98D1E371FF
+64E53E2B52FF403BADC12AB98B0DAD2CFAA17AB8F62026E862F7E6417DCCC3DFD1F62464
+CCC9CDA7130CD9F7C74409F32F36BB1BE9034751DDB8FD99BCD2FD721040C11DFEFBC022
+9607BDFA4FC638B835FBC1122840870365348B23715E57BD3B74DEDA89D70B643986A225
+037FA72034CD19F840BC4C56C7F295C250ADA72F6C3C112D5D0A67C932679B2335F57C5C
+F574146CE2DEA1ED9E86E8A85C370885C659ADB4C91BCAE88B44E270D500C0EE04A6A4C6
+1549D9FDC1ADFFB934F629FA61FE786428E8ABE498DEEFF479D8413B18A22F836AFCF081
+E49F21B6AA513C5DCAF0BCBCCCE096B08A7AAB0C08A7F66054A91F4CE6357414E93158ED
+9DAA2263F627C83921B2B55E24B0A19DD8F05901B61F2DA30EBB124A41898E2E385154B5
+189CDB86BB414C3A15E7C4527363BF461E2585F1E8D0E347EB2E849F432FABB790BC4115
+7BA34D619EFE07548CD18EC57D635B4806DB00537C210A0AADA106375E984C798F34D4C9
+23BF6277F9B574B5F6E643E3691ECBB2640BAA8A34070BF8A7665E3AE6FE7AE80091D0FC
+9D6989AB5EB8ACD302AD54D4395B1BCDF0C565093048A5675C584D1E890EE85D57F86309
+E956FF8A0A389D7CF79920B8B1F52844ED8B9A89E103D4A8D6684C6551F96F976B210E99
+69120BC5499C43F5942B7676AD6BDDD996A84E2DF5BDE41DC3DFC06A4903F604C42F0AB5
+E8A602276A5440B453342FAAE6794A4875DE44C319BDB2DDA18FCBFA778BCB68E2A78BBF
+970B9CC8B08D86551BFEEE2D6145A722202A63AD476947997A4E20C711BA10C4B8132E41
+A65F73AE7C6BFD0528EAF3BCCD0E34577E7D806D5960B8C51842B84089FA4877D509AE3F
+E45898F288FBAC19FF14CAEFED09B1A979C71D011D7C4567B6F88008C00E733FA6EB58DF
+EF0026EE50ABD396A8EF4C9B89669E5BCCC69B20F6AA642CF9557BBA977DB0543EF0F80C
+5529D12A3FAE1DE044B97288C0B699BA591CA33F344D6927212334C1DE7C22C9EF65A866
+AFB71033F77E5CAF2C8A3B1E83F387FA26D467A00232E0BB6F79A40223D4834B9C531626
+DA93BCF9E81EDD95815D67722FCA5473C364DD8B2F89998D7A9DDCEB7D9C8D6529285B73
+7EFAD9BA406829B7E817B371A948993E01B676CCDB13266B1A7554655CCDB9A01C46EFF2
+CF88D0F5FA2D9875EF23F36CB820133559094F0056EA26BB4E54CD6626906456B7226215
+8E11431438C2CDFD6F6F61AEC165D461D8F13A4BD33467BD57FC9713189EDE04419427A1
+BFC56668B1674FD2743C5E52102730C4E45A930AC202DE059DDD80602EAA6ED2C07D85C1
+EDA78D3F4E516F284C0E29FF864EB1E33B4000A99FBEC9D4BC76674C24A35462AC78439B
+292D8A541F36992051D4D41615E8D25A419F442DC3D1051179980502D7E179CCB96948C7
+1495979FE76FD647ADF2E63C54404337C35BFCD3A3780B07DB48C941D59C1C4472BF819B
+1DBCABF609FE8DC37A98F1BAA486571B07F8FA8AE727FD712ED97B7F32BFCC84322971CE
+CC1C5D5368FFEA6D6133A8CE4B918EBC20CEC65C2B61F4C3DDDF0FAA052AF69CC0364B25
+5416C3C7CC6808CF63DDEB80275C4B4F51A5CEE33A5B96260FD3D1025DEAD50F3459F080
+2879C52FFD740982F4A3A7B3AB3CB65686B11B43A7F286BA0E0E551D3E9F7256B6D2684D
+3A5370383554E3828AEA9846B844C537648363B1FE02A1EB8D02182B8D3ECC977B22FE8D
+BDD25B7B855BC0B61A651F4A3E7E19D69F8A7C2C9794BC0E1277C9214ECD07A2B6089AAA
+616753CF6DD5356B57E7BDEB7F8DA07DA4BC2E5EF5145B17DF0D663FDDB3C6BFE60BF819
+D3A38B3A37BDD63F8F1F9DFC3CDECD1FAB59EEBAD01053D83FA68B3C23E2363CDAEDBDE0
+DB1C97F008D92F12FE586F5EA8BC025C0E67AAC5910527BCDC901C841FA4656CB34F98D5
+C761929D0FFE6480E885BD63DB3CDE5B04C68067D2C8530658922584530B3B8FFFCEA246
+F846D9812FAC678B95AD8870063313FFD6018C55FBFC1445F1A874D67914BCD6730E02DB
+26744B153880D397CAAE391FF76A8AAA831A8CB35E0991761DF70C082EDF54359153794A
+CD4C6D6E47A0B144922E178637C66F19E60FD40C78AF5F67F62D8E5E17427501350E61CA
+27CACE6D0837D3525877E4127FC3656541E5544D459C745A6A08A59416FC97FBBB39D110
+1DF87FD8934321A856644ABECB70CD3E1EB2D8B53234FD395A518F76DE3E0CACA9BE1530
+FAFD0946AF9EF89E55D3F77DE7AA428707985D5BC37904983B2753267BF7E4C8DA1F0E64
+FF403ACC3741E764A972B814F4EFEDE1DB7D27504BE7C2FC3878CD5EF3E7A1C4DBAE4C71
+3A44BE19F3C9397848826B95CC73E9386154D29A3F3C9BC9BE4DEF32DC2A7BC8025EBE5C
+3EDEE821F97FB4C571F08D7C42C3132B13C4D7C934BDBC43B8D49022AD5BE3DC7CF17B60
+875A1FB8418175392C869109DBFCA66C083769EF952F002318D0D831204FED8D646098CD
+2FE0188B3462DE3D80B1B5CB24E361347985E4E7C33DE1BE150624D055F92E34C862A1F6
+D050CE478E276236E8A50BEB679432C0CD12C389A4DD3DE46E6CF34D764D95F13B9863AF
+7AF8D79FFABE6992EE64E5F302EE07B3D81302C41D8E72DE8DD7115BE7099E470363ED56
+8B73678D473B1657D4F76761C56D1A35629DAD09F5073D3E6A1B1D227664D881C46C67CF
+67CEC611ED14E1C59B01776DC42E0D39817F69D43322C7B9805D8953C7978D5231A33DC7
+9B44414082E53E3A5C5362972AE23BF99018C47C464935F08D8D586A4E8B24F0EE0586BE
+500F7C64C4D314474A66C81BB2632D38AA6DF1305398B40506C90CBEAF848B19C0810469
+039775AE4755E7BD0EE0D1992DCE0FDBF2D3AFDB327469DB51FBB9CD1AC4F69840B65A41
+BC2FE8DB2290508896C1821CBD471D3188B92A37A07AB2DB3A8B9A5E70EC2FE1831BA28F
+66858A37C639B4CD432076950311C98A4EC455526278C038EC54EFF7A5CA9271FB003605
+88601CBA5664436A0F267EF92602139323047982E53DE3545E1E0343F14003BBFD78ADF9
+02EB82F172ECA31C0403588A5F4E96D73301E8FE9CA1798599CD9581796FD1FB77B563C7
+0C8E33DB44A5B1BD0519B15504AA318A2C368E217925128ADFA849298C705AD7402743D0
+E2E337D95CC5A40D784EF809F4349B170CB0F7CB05C4C9C9AAEFF1BD7CA667E50F63756A
+365A3134E63C80718B5721086269900E9D93BFA033D14BEE91749586AEA60ADF3B37BB68
+1A1302F877234997091D94A08748EAA21EE93EEC4BB8084E40D2ED99603962D50A9CBB49
+1D8218305C3B4CD082FCAE49F3F030FBCEDCFC4D22117F353C400A59A8A55322833052B7
+B3B799F274F8E0197A5B8F8647103AB41A185A3B2EFE051A95DF466C3518B7AD4D065FF5
+52AA7666120A1CD289D5525FFBCE75726582CA3AB93D9ED32459124837AA2D05317D25F4
+BA0B5CAB67873A1228388B61E3CF201AA46299553FC75D146BE01AD142D73B87B376AED0
+894EEE786ADE82B9FAFD82589EF1EE28C459B603AC05ED2D80E4F5DD43AC76B78D11BBE4
+3505B66C6FAA7A9B130A8061E76EB6DA7E408E0E58BA8956CF78B1651C9E53143E9AE5A0
+D9DC164BE6CF1F0F601B0D1F2EEFD22CE33B35A9671BE973639311A3F4DF3BE8674290E0
+5410DE88A2736A3EDD096F7158D38EF7928739310B1F823BC404DEF1204F32DD5F50624F
+6B548B900A35209446826D327AEEF54072458C0351308C38265ED42F41757395705338FF
+2D7790881B932C8481DDA03A9671847BFEBD2C11D5E987BCF116CF59C1DA1F91E77672AF
+909B441E2975278F20185621090B60DFACD2D1D558BDCBCECC0EFB8FB817E5C5CF23FB59
+710BD6050621ED2DCB67DD3DACAEC2B6DFF882E3836487AAA21943906BECFE4F99776776
+DAE6488E0276545249A944EC3655564BC9150C60CF63D0FBD8C3654FA295A950F4EE0018
+560B6F70FFAE5D04596D72EF5F9654B737933C6C33750AEDA2548F2E630A3F9AB0583210
+7BE55FA5D501AE86B7E5B1C2AFB91D38B3AB326124297E06694382363FEC87118FE7078A
+0E0EF92DC6515188565BC51D4EC830D2527F4D9627D250099BA1860A79E872A9FEA7DEF9
+A8195E927088CEF62D0C04A37263F23390D2AC22449B8B00629F5504F1ED546B9921E9C2
+329B5978333E9FBDA1DA31719B5F1C3C2838311F1ABAF7DF36816B8AC34294E32C3C9208
+E8C337B8F2EB5D63B850DFE3B4AAA39E176E6775333F6FA73AD6DC2DF403CDB8D519146F
+7A37B1CBD7F8BC051C70B977BD0D037B67A3A41486E0247822337392DDEB052AB181E619
+4FDE517ADBF202CBA902A39A14E3A21EA0AEB5A8866F03AA02D81A8F05E937E10CCB6295
+319EA16EC75582D3963847F2BC7907B3EA5F74471BCB8560690E49607F8EAC6046AC5D15
+C96097EF47503C5FA23132D7884BF270A8530578CFA752B437DAF3268D4FAC732EC3FC80
+ABC4E2746E7E8D6E3275D85C03E58735566C3943501EA2970969A112E492DAC9FF131F1E
+2390658BF23FF6BD413A69CBF962CB523AD43C2C10C18E29F205DC2CD2A47A8B8B586C4B
+079BBCFD33098C14CAF0811012F10F8DD5F2308254A30CC1E9805A9ABF41FE612DDBB33E
+049F6623BB9E2ADDFAF1C8DB1AC0DB5BC85BB3D0C29CD3D74E1364550DBD807DAE3CF375
+F25E95DA85E1DC47BCA498B16546E8A494FF4DE3CEAB5E00884DDA8C0F55750A5EAB4A05
+B7BCC466C39F1F890F05DDD2AC4196B0B6F889710E5238CD36A96157441A866C561DB2D8
+38F8E2AA10875C9FBA7211357019C3A8A3DF8CDBA2DE5A5EC9F4E4E7BC66785353818B53
+EDEAEDDD39D0DAD1210CF0F461F5DC843E9317C52616F2A5FE60A46A4E4CB716CF14AA76
+89D9D53322A8B4BE01547F8AB28433824DE7753E478A7E66A151DACDCC3CFC8DEC11C15D
+2239D2CB041757C7ECB2CA9949BFBC4D3F1C8DB68F34B3E5B27DC1838B58339B04518A2E
+4EAD13AAD193026C490FEE7CE4416F2FB1E78A22A4CE5DD871B3F1678C43E7097F3D5335
+49252665BD89F68FDE9BF09E1B52CD6FB08882103C697F0F63CBCDAF6316FE71E49C4070
+57811A94DF9A00DD1ADBC46BB1AF032808D6533DCF96354D214F4C4AB0B4B0B8282C31FE
+D475F6934A02CC1128F867EA90C04BE239988DD2C1823EAECB5DE37491F53E7DD4FBC5E1
+FB6C8CF47D19D122A6BB3F472C30043B016922B3D8D034FC993E34549C9097F139B3DDFF
+E4FFC55C00DB7C0038E4E9FA17E2C961B02A7B3A86E8E9BC5F9EB3FA025149F8C2A3E8BB
+69B557342C14314646337531C381EA4DFBFEBDDB90F72C2C5E0A18A970F4EB707EDEEB7E
+127002C2A77A928DA700D024317F51D5A8E97660C026FCE350481DEE6D5493C099121D62
+5AB2DF4365FA4402911F63D1D2F8DDDDFBB218DBBC97E910EAE8A4D2129D2DB0F57E5649
+F8BFC1A37AC3A9A1D90643779199DC7038459F51EA7CEA6F80D6AEEC3F7C276E2E35CBFF
+160A924F011F848BE5BA26400254C5509C78B97CF5C529893408F1CD610E1C33B5F848C0
+810961A8186375335C72C83DBD062FE5F422188BE5B53847FF7F770A66238CC2AF30AC4B
+B24BD942C34B654038F7F112F244B187FE93C57F4271FDADC76508354D82E317DE57E890
+1B7A71F97055A8093CCD52ABDCFCE3DF141118B2C696EB74842595FD76D346B9EAC0E1F6
+3BCFD7BE4240DEA3B92167F90DBD473D41AA97E3F63467E929397682C14F5B204FC885DE
+D4CE50247696583EDBB003E0F8ECB52F9BACA29CB854604A7441255726098EF3743F4207
+219A826BDA9EDCC4CB90BBA6E3E8575622C7258A2CA7033F7A08427B5BD2E1ADA64B5C4C
+9573C5590477F9603DA5769ABBE65676913244F4143F3A3CC1EC9CCCB084E8AD07968A9B
+63A47EF25EBE406904EA0CF325828CA8E919A115BAAF550A54CE840E6AC04C3865F95C42
+7E04C60A521FA061D23EDFB96AB373AA1ACFE347F427125FD7CFA2E86ECB7298AB7662BC
+946DD0654F40BBF889DD9B9AB7F539D3DD61AA8EE395BF17DA7CA9096E46CEBCB9C01E4E
+CADED3DCFED33A1195056DAC0E840BBCCC467510A83BD1B6F43CDD99D66E592C328E4E9D
+F52C5E40762518748044069621335DA28D2AFA7D65D565F53899B84B7286C65A3A395A26
+441D74AFEC0BE4B3162647B7FC9A5907A0FE704B902C8CBB42C9A2A4B532E51A44058CAF
+D8CF7041C50DD8098A1D644F552B95237A24FA4E8F1890DA9C97B7BF1F820761A6527D76
+C7E64BB245D6346546ABFB406BD714752549085EF56125964D6CC74865164256647327A4
+08214E794BB49D58B7CCDD1B204A65D3BD0CEFB8E2795247BCB91B38C38397C66F2AFC0D
+B7468397639BC4F7B8B161D9F5296DF31417BF467ACE173593AC4AFE2E9B93EAB9EF10E3
+B3036B15C4633452DF6654ADDC1334D29CB7F50CD872523E770A89216B70B5A9F24CD4E2
+DC485B9CCE4B4C5A50A62669D810CA23BFC936EC5F626C48F452F225776D09DDC5D2CF88
+13F0C8376FA3B72448FA22FE142396AED65C013DF4664A47649FBC4556607FDC0F89614C
+FE322CF867A2E7C006C2B35180A0E8371FF3F7D0F51AFB1C0BCCFB0E533DE2C4679DDDD5
+DDD13C7343F0CF77154C2CAE108F76FAF80236C51504D39F9508D29AE3ED160E947BB58D
+7676AA98A64282B3620D53FB389A8F69C10382C80A07DE4D5037748B10A64396911934F1
+97D8092BEDCB5BCD2B473FABF40CA434CC74626D74F5D44E45575BF30D404B9A78BE9175
+0A928EF6F95AABE4943BF4798233FC4228A476D327097AAB34B84C97473ECFA07D1FF39C
+B3F0010242D6147493773BE1B7D9E09A0B503431B5151141E45897E3EECE6748F6BB9CCE
+897588A742D50B52B0D7A021D88EE9755626BC03E97BF363F70D152F1FB069AF83D4F108
+73CB2220A69AA737CE2FFD631B9788EDCA14E8FCD8768F92EA28A309C536A03DFF979840
+EB269D9E5D05370BDC46B5D29A9B866780AAA28BD04F8F4AE7553F99F69ECDAD943F0A6C
+6B71DE019A9E3BDAFB4DD6F54F2DC158F9639F067A957AD5F997BA877CD928FFE2320CF2
+1AF6127B1CB61F3C26D0816D31A9AB985B1DF5FDB310FCE2A40155887E252E9DF2F577D9
+1D0EB768342B3C601BC616D26F6CDE3E8BD83324C10A7D88615F6EC7046B439C6F9BB6A8
+85A1E79F062ABB2AF158BCDF986CD5ADF8FD8FC04F9D13FEFC9FBC13EFBC986FAC2BCF50
+EE464991C39CFEF927A2C73EF90B362D1D56234ACB24E25EE095EC0796128BF338C155E7
+51662131E4AC4AAA726F7433F88A9CCD417A9A7F513B841A63A4A93E2B0CB8AD6A3647C1
+9B1A2122FB2579F3765F811B1999882B6619084EBA6C1544B81CBCA3538AD3245759D845
+ABDB61644DBE4132638477BD92E365895A7453B976EB9AF5799216854E8502E2A51B1AF1
+AFD0E3FB3825974A7067265F52DD8E512B2E5FF53875751ED4651579868098CCFFFA552A
+93152A6CAFBCBC440628026D370DF9994384CA17F84F728D847800B93AC28B34AE695641
+75E01CD49C041F931719567D3CC31B50F7F332E1B349476A7CD19696F5AB506320C0274F
+FBC1276F8D0ACDDCC296E92ACC9052ECC53EB54F201AEC9CE1E4E3BED6E537EE80AFB8EB
+C522B367AD6A9D532B30119483B0DB7CCF6A49733D7A84CA0B70B17321DDA1FE7F504BEA
+138DFA9E435B9B69EDF832E1B8673206D5101BE84C9E7E84BEB1F400D4B7F34849545C6A
+C86EE0C5994FFAA0AB7E7C4215FD24DB5E5E2DD384DC0494D116D466A4D1B85A3EC3EA91
+D8D8AC9929F801CE1A3567069104553F7886508084AA5A32C1481D5BC8FC64B2C666DF0A
+C75F6ADF999751CE2DB307A39DBE34D5CE24F3766879B765C2C008A88597863FBBF3B1A0
+7BF0AFF7255BB80D6F08CDA7EAC8BE75B033E325F00D251A35B379BB0DA775DDD670C00E
+B52C3C91A731448A6CB85EF8BFB2E2F2F400C796D5250C3F402E219409DDCC8EA4426D84
+E3C20E11C9F8DD1A057060341D5C9482BB5D627D6A5026F77850D58A761448804FB6900D
+24482B52D42E914ECB2BDE2FB205649206FFCA71A2CE6E35D89EA5C09FC7F515A31FC2E8
+85BC8E153AA5F10B97EA54DF19F811B68FF1C989A991C97BB192368A5867C17B621E5C4A
+68A0550A7011C58A0A1E2A3DB575A40C23564EF7C888D90639EDF17583DB8571C7C2DDF1
+1466ED27987AB9BC3CCAF75D8D3B2C066EC520932D3D1B6E5AFFCF8C3A0CCC6F0FBBC6A4
+866D7FCB7237F9CF15C2F0833821CCF49812766128BA014727ED267DEC233AE80F6EE950
+08E1549AD195F4E4ABBCBC7432E4872ABAFC1A0F6A1299412B5303F64241251AE29ABBE8
+4CBFA38E08A8D4183073C1337A21FC47CC5204BD2C2617692CCE2783D4E3FB88419871A6
+45C9DCB91804263A755CB7DBBC72E5127AB0D64B8CE1EBE7AB79EF5886D4A4F9BC31AD30
+4EFAFC5E8DF86BEF251F28BA3C1B08B7BC93EA688CE08AE4EE65A785E1A3B8514A208E39
+7C98451A146BBE2EF628B8D346946871E1F6463DBB9C45FA2F7ED1C71169609D382793F3
+A5E6C4350CC787C8FF6DC857D5D2C625B628ED9A257A83A80E9E52AC3CBA01EBCA228E65
+BF67CD4A29985A29D17FD3519BA2508D62DA758BEAE02249E090FE9822C0B9FAABD30B28
+AE77D373C14E6C5C71D2AF580F166431AC95E9E4B6856F06A8F7CE26CFACFFFF16E7E6AA
+326E8399EEBF65E18711DCD8217EE804B6BE3F7D90FE8DC17586A38B2408ECC0A09C5467
+40EF7EE7F5BB20CAD170CB7952835486759061E71DB8309926D23ED9EDBF20F71B323BE2
+68C90E9F421BDC661EE513ADDA0924FADCFE85CEFB21DF3A3C37B03F9415A6A69927081D
+5F6DF728894A10CF03DCD9B4AAEEE3E23C5BC1FC22D5444A511616D627AC25110E0382B6
+B17A2616BCDB12F824C3F9FBBC74BC74E1C6BFD86BEC2C0A7AAD805F1797D0E4147C229D
+EAA0A355E15714D15C2676B31A7A9DB8A164D0EE9F27232985E23BB0689B0BC0A3DA20AA
+5D6A919FF6F6EAA2513452C691AD3F9E8224652DB2C8FB4F3C7A784E81FFA4F72C8E51E7
+33D7E8063358EF6C976B8B6D25906880DF8F671AA7158D89DEA5016CD039FD8CC9721756
+0D85A8F36B9B38EDAB3E36DAD01FFDB6989D1D519B12D3A52E909501112E979132F1B07A
+F426EFD1A3EC8A5A641B4765192BD4EE16891AEB02764714AE7C2879C8175D94BE8B16A9
+004E72360BA05CE4666A995BC83223ACBEC897273881E51A116C0FEFF743C6CC22C6340B
+8B150C14FF3D4D8138F089A9120039F223E5CFF11D4299C1DDBFAC16BBF2559A0C6F0B6C
+5063FB0B9CB7710B84CA3465C775D49A02FFFA39161563403175088100325162B959F570
+9A732442B56D3C559C8FBBE1E4319435B1F583D4FC8962538CDEFC51ED5A06361E7A1D74
+F0495A467596E5CC6018667E29B7F87884B121816ED54B8073C998295A3E86FF9A5C2410
+7A4269FC26F79B08CA41E130306C38BFEB49B4574A10020A93AFF7741B2E4E4977D0C72B
+1C5A0D95D9B564DA44FF165396BFD804EABD653297C2271350E76E52DA2EB5BA6CED05EC
+5EEBE745B9B9E0AF3E9E78BDE6E392AB7CE6751A40CB6F54A5A659E91E84C88F6AC63510
+DD71A3263CCF078A30ED525C6FCDC636064CE295BC11E972985ED09BBA77FAA4D998157D
+A1C0B3D3412E33631FC3D43CF750ED65E170131E69A3CCD1B258F3DC7B1E2E69E8245CFF
+667E3D3C8D75EA9F575407A1DF1C3AB7DC52C8D710CE4A54007419672CBF95C4B0DD52A5
+EB0AF838E75A75BB17F19E6B30CD6BB8D5D6724AE2CDAC0FA18CCA2092193EE1F46ACDBD
+BC7CBD9E6085C483CCC0654A0945A1103F7F0B52E95FB61C732CFB10D25081A982E9AB21
+0CD8DCE29C95928807CAF55446F1D8C206D47DB8FCFD883624AE72F89C544FA33A499F67
+6CD7D28275D52A72C0AA11EFAED6516CEA2005118570E97305B9D0F6E2D003FC07386290
+9539F8856A71904F2A0E686D97AB2461FC07BEADBA06282BB722D5B92E008204B2F4BEBC
+8257B02BDE21A7F9985B8C851827625655493170406F96404834662E82D8B5B8DC274F79
+1653D630B1883C5977C0B4ACDAADD6B6A37C50A493F90FF70F3C3EE37C1E7915A88F85AE
+661A99763BC3C7CD2B2B9B6076BE82A53E1485C4900E6B839CC97BA76E44E7CAAB70E322
+1D545AB546374FC747313867B9D5FD3525B9A71E25D8B244729423F55D652ED33E9DA926
+C9F0166F475935D6987CA6934FAD17AD464E016918A853B0E253242853162C89AECE0837
+445E6D3C0F22F48076A9FE70B63ADF26FAB0A4A1C58D274753837661C128F4D29CF8F839
+EE8129C81FC61B838A7B3615BE4CF0EAC19BBA8086F80A7FEE4AF6CB263C557E3E1E4EE3
+D13AA12E2B9602DE18820DB8A3811E7B8ED30512B706108C18F84A2C66CE8076ECD2B151
+9F12B15E6A327CF5DFE3CC27E0ED4B3F9840DB6358F597CE6D3F73D1E5C045AF1E33CB76
+7CD377D6F6684338CF8B08246367A8AB99C7DF3C88F222D10E0034ACFC4F7195C303D46F
+3B68417469F7BF068F3ABFE0D4FCDB78204D736459D0C347E8175162962A9B04F87C55D3
+04D6A7C0CD2444BA581E3CE2EC44F3AA5EFA6ECDDDF0BC252B889B6F9534A459C6AEEBF9
+DB80371967EF5FC84BD855C37F56C3C1389EC477B181DF26BBAF3A0DE3926E73EC139F65
+B1EB285B5F16FCFC2BD3670E6C9C1D0371A43736F2C9E2FD6C97A10D3C812CA4354C7010
+C4E60BCFDDDF0E684E6459B79985D7EC41F44F2E0A8AD1E2F9600019AF180EB2EF053C3A
+76A99ED3153180547AC9ED8E837133F9FCF40786FA0D792390C109BD8DEA1112B83E69FD
+BBAA5233BE6083530855648CF30E4C0B909FF69E7ACD9ED818AA248B85DCE5AC250625F9
+A42C2C37B8435921ABBADC1045B58A8F50EFC7700BEE3AC719CCF4F900F23414F7DD9A60
+219016488110117AACBBA097E6F5AC638B324C02DF5FE91DCF24AD26E8F28F093F4C9A99
+B70418398E6336907B53DB364BE519328DFFF2715E0750442B086D92A4B159CBDCF4F990
+C9AB6566B109CF351A9AD8EC4CCA8E4FE0458C140A4546901262431F3879BF26E6681E41
+9D69BF861FE2C601D2B9DD5C965CB1B5D9468CFF99B3BF62E960787233F39C85A6904A15
+27A75A40BBE8FC282E206F4375A4DC6F477CED8027AB3901433560D1A758D6ED4977AB5B
+A2117B56B6282681676FF55A21C52DA8545A88D61837EFC1BFD50D750F8C1451C9F30CD0
+9CC08903C43C304A813F4056AA6CF78381134A12623434AE6D3ECD4C24940F7B7CB77611
+6E4B8E5A0AC7689A91095888292C59FC1A7850B5A71B79BAFBAAE7D97DD5684951A9ADF8
+4D84FEDD7A75F8537CED7CED8DBB290D5F869F4DC1C636F62950F83413FC9703880F7550
+56DC5C7FCBFBA83E2A947869A028512AA521723FAEE6AE3D923A0D60DC22147F1C0374A8
+34752C0F81877AAA5CA6A99866D97FF70AFF358AA44F4F7FCCFFC0CAC17E492A6E8A1EC8
+A249CD7E808BDF10675BE01DA18CF96D2FDF8CEA426F6DC998769F54845B67851F000306
+6C4577015C9857509C00B0D66F767C18DB12D497AE2AC26FE2C7A97549A036A0E582D424
+D723C3D5FE81371AA34748209E2B432003948E67C072F84DC4AF10C4D32BF200E58036CC
+FA53FC6EA8F9ECA365B55C1D651591730742324DB1DE796E3E733134689DBAF4BC0799B8
+FD67896FC1C9D3DF16C71BFB4D150C3F395B8F53D638233DB3F22548D90CB1D6C1AA75E5
+2E9AF031D73E93BB6E2C97AAA6F983142E92FDBDBFDA6AEECE1BFDEEE94BF68A74E061BB
+BEEE45A16BF910F3FCFFC3523F6B0F0A6CF6E55E71DCF1EB7A337D7EB814F932B6863F4C
+C840F0DA7A824CF155E65AE8F8D67FCA4FE7CBA369BB474070765602F3938DA7BE908515
+AC5E84873758F0EA9C9906497B436FB6E2C39A3C3D5A720568D89AD7505CD1BF937ABD2F
+3C08DC508FD5987AE713AC52C6F13EF997AF42C7CA9892BC05DA6AB847BE15153EB15E68
+7464ABBFAF42D5779C34D9E03429A216EB63A064017A8171F2111F52B0F897ECF4B02879
+2D24401BD325C23398A3D513C5DA95F65AF5D0CA63C365D451EB2327DF168119A71BBF82
+37ADDB2D2188A7062EC5DCA6E4099B58481F2AEA25425F2CFC88EE9BBD7EFC284635E290
+65584B9F64DC3925B1B754792C9374996765DD938D80EE0EFDBB6E38B48E856875C59ACC
+E6FC889BFD0C7F106BF338789007B177E4EA71E613E1FCB5D699505D071CBB03328D6126
+39A66A3DD439E67BF3886F3F66204D21116D16443A77F58D82F80EF6074AA96B1D71DF01
+CE3952DA342C7634C8C5F36D8D403EB227CF2D9AC84702F7256580F05D133509C71E18C5
+9EBD2CB1FC14F50CCE1DD212486277AC18DCEBBD04A8026FD2AEB5BD3112DF88CF0A15FB
+FE49F7562843088676C2ECDD0BC9B255B140852B87C29C447314813E93875CE18119CE9E
+2497241CC5CEAA06B14AE661A778CA6B9B64EAB8FB63C1342500274A8439AEB0718F50D5
+A85693CB5A814F1ACCB1D3DA76224CA72C7900AE9F93B51C618CA7BD662ED176BBFC64E1
+AF5B92F73A808664112F3D81985AB5AC97A93CD8EDB7C46CB4BD39D78583CF782419BCF5
+778E7CFB5DE0A89314FF66BB4C85E92E448FF0FB49574811B11EF866955933F2505A469B
+138A900EC5C2C7D17EEBE65545E1A6D580A331ACF8D8861A49DADC7EFD1202B6968794A6
+EB575DF8A7F7EA1CFECA8DA8B02C8DF5244045BB3E3F6936F5690055CD3DDC5FB08470A9
+375A9800FE7C3D78BE08E95B3883F84169621B64837A925E2D0105BDF511097C94DA3BCC
+33FB5C20D4321C26A2C800A27362657B0C040E7D77A1F31524CB4FCC4DED1D10B72F4B4E
+2B11AB37F02A0B263AD9C93B392D711C4398A045CA36C00B35618C19C39B26751E409E4C
+6042E2E3824FDB96250859D744644482470E3CDE59D5462754558C9EB3493C4F27E8088C
+787CD363B6F8E026BA191D2B1B45C7E5963F2FED2773330C97445D567ADF692B369D29EC
+5D00895496AE70F830B45C6912E366AAE05CB2C8B30D515EBC3E9C8A3C6B686F3EE3B12E
+C438AB498CB379396183239F7567F88DB6EFBBE372F9767CE9697502AF4E5988BD9C0139
+5A51F394EBCCC3604A7052A21DF79D000566C5DA9537C6474B195ECE94536AC5B4B1CF54
+A7F734B1B94997AC00A61034B6B69971F98B2D6410C617BDC60CE31DF4AD60D7D74DF3A0
+018052B2882D71DDC0CF9CBEE922E5B8EBE0FE0D5B5831D915484FB03E7ED23D7B310F1E
+981E86AA821B32C7123404E869203E4176098E8CAA406E9086A5FDAE645F8704258A07F4
+0DF30F2B82A594CCBFB440C1C090BAC4827EA508B288D86F97E90845F773E9D5F3B133F5
+B5912DC7A0D5682F1E9A22A23BC351374C6187654D1220F417837302BF74A735C878A354
+87FDFE85D6B585EFD41D4780E94B9F5AAD407ACF854E31304D97504AFB65BB1BC982FA92
+A3FBE746AB0E2F7CEA15F871AA3AA47A4362831408BB2BDB70665E12C37DD1AD11775EA1
+D030A142C63F79E3F5E7F664958DC5A6A631A9F942D438E9BA9F2FFC6E4359E30E11C8EC
+F6158C4B05C339CEAD9D18111AF289DA02806FC481342B634CEA53D23143D5B71CCC88EC
+18A2731EEAA50BFA801EEDC3846522ECE14E912F9B0219B6D0744DDACD875372DD59807C
+2BED60CFA03032DC7E67B772BA7F6AB1279D16F9413947F99A076BF7BD04FF418DCC5684
+A440FFF32715D3405001D476CA8C8544AA4B1E8FE94154FAC00BAC5EC222FB95E20CBE04
+D0FC77D92425A6CE9C48E000BD01A0F1FBCB64982691ADA3CA1E144C38D3BBF2244E2CEA
+49E8A85A4BC960F3FFDBBBE3239E4C32A1AF4AE3E883B610D9FF16884C9CE90E1AB057FE
+E860848917B0456DED6251145AD20CB98F14E6A5D75373195A6A1BD806AAE9380C8E27F7
+7FA2C0809DCAAAC1020E439D22E130BDACCBBD54615B5F6960B1BD7B839170E73E71B1BB
+637EE2CCDF4259CA4C72697A1870E18B20E925854F6242493AD9C50FF92DB912F58E4856
+8CACB989AF5022DA1CC8D7C24D4CEE603269AF3085FFD2F45B7334F048274F324735DE6A
+23ACFA93E4CC8FBA6FE74F13DA21B136610BEB8A6BB97F2E772F970BDA07FDC78A032AD9
+C00700E58A3D5CBC884CF987BE5164B65206A2675108342D462CE466340DBF1F1C967362
+73692F213E62A4A5C82BE5692DCF52339C5FF06F03C07658FE936FD2912043A44A055A8D
+D1C0E807ADEC1011A99CB5A64F0A3B20C9FFB2A1DF496D655286F83DABBA02F141BBCCF6
+D4B0D641CF6C5A03B82EBD399B632E71937E400B53B43CFA819755E591A9C301372C9F64
+4A2B7005F5A66801D5F4613F6DC39372B0E80A8F1A8CED51BAFDD8F8F7F9EDBAE4C987D3
+83487D21FCA52D053C9ED4FAF1D2ABD63552DDBA0B0679C9174C41F8BDC3582E3E1C8208
+C73F379E4EAE3E48162EEF51005158D7B4C0C891E74091C55E25F3FC05D26C104A3A8011
+10540F36818D35B707A3AA6CF02FD7CA4A84B4E3101217F3A53718D462EE34688F581094
+6184AFCA9633E07367E0C6AD4596D734C718885E1654B6965F192642C9BBFDA9632C8A2A
+CFAE0CA07030E490B84D1A21B55F036C216AF13185DF83706C80A8DE2C62A1A476C872BD
+53DAD3F42A299264D31734A8A7717D1FBD7C501FE666B465C3449C66276022C367D71ED9
+BFAA76BA3214E6619B979563912AF378DE65F1AD7507B863509A70117D92A65332B918AD
+A3E1E6CAA94B7EB27B0DCE8892DE48B078ADA1F41585F810E24AABAA7F2FD17D63BD21C2
+86EF21B7EC6D4C6BBE6CED33ACBC46A4EDDCBDD620049214204A0EF96B9D19A75580D7CD
+DC717ED8814682DC4822ADC80B9982805F9411AF16E208550A3D74E1464DA2DD8CA2913F
+1DAB1ACF0A519326CDADF77B585D52492BC8872277138C5F3762DD369EBE9DFB1B81853B
+B7F4110BEB8D487DCF0CEA7AB01D58ECB1A89A0490D58A5FD5D93D1B692D971F27BB95DE
+5D6B173F2AA04EDECA70492220FADC051D995B09AA31BFE5134A0A6D5DB5DF9AEEC4C616
+9569061EBE429826D9CCAA966B0E2B7887A5EFB9CBA1D23517AE410896C6982C56F79957
+149D3060B39D4457BD7DAE389E507E6BD6E3F35765C2257486AEAECDA58FA4B93E54B418
+A0E6E7739E0C82C66064FD726D1666727A2F2633CE83C1E6231B65950AF1268C3367EF51
+8D88B5703D77D9FB5882D381F082E5A75B0B0D33D1D28BCADBFBAE0E9A1513289390CB0A
+2B8D0DD4FD4B31BFD6E74709C7AF601473D7E6FCFBA18EA1528C663969A6286636B04677
+8195B5EA6A9455D77280C2E03DB669588AA8896ED12465F6C725F90A59C211A8DB3B0C38
+410711316804C9D82B28A3022109A389DF24DEDC4E49AEC53BD8489E36191768EBD3DC2C
+7F64656AF24F1B585C791122C5FB9DF9190E0384A7C2E127DCD404831D9715FC65AFC1E5
+F21F7F578600433E7D8976074DE5CA739DD026A2CD5C771AD1DE3E055D0E6015E5852563
+FF5E4A0D9B2A4321C589DC78B4E922EBDFF097810D13CE60B9BEBEE25DCC4335D34542FE
+BC7AA72F2DB46AAD45D35FC9E2E85A30383E7B576655F40910A1B32623B4C2A6FE2342EF
+85C205D81F4D7F37A75F2F92F60F9A2CADAE9B3E4C1F65C4BE7B8A57FDBB69C94A9F873A
+6BF143CD337A70F6B94BFEE450618AD4D1544AE26CF7D6BD7AFE125B1E195F6F1BB12C9E
+369AF9DAB0D611909E3B1395FA6DFCB6B332B84BC1CF84EA2DD4ADBF8761A9436866CBB2
+482A144CC3725AFBB8651D098A5916D5EFC7F104DB82791020652E2DB32349DB2BC3A8E2
+9AAE97FE5A71BE228679335E23F65C855FC4E97435A2246D4D1E49DB1A93A41E487862D6
+7EFA1286D019D96EBF0246A15EA0215F8A769B0E02C8415B7B3A6FCE101B9AC52AF4C9EF
+BC7817B56740D0D14562D88E7CF8BC06F653824704DE509083978775E61C1E04DBFFB8CD
+8A5E2285CC51A9D3AE9A68C95F6B7B9231B7F23F3335B9E533FC4D65AA0D38ABEFAB0DFA
+550242FB6FDE0D1BD2A4B80843A9814DABCA490DB1A941E9A685979BD740E6EF87F7808D
+9CE379A784047559861E78FF20A33C52D6206586F8C6892CDD8B1A48806651560423A5BE
+14FCD8E1FF8AE7C2DD92F7FC7EB492E2BAE3BB2809EE504097EB1BAC6C97A713C6A6E261
+FDBBADF554507EBDD2B3035A5B8EFAF06C6B46C08E6DBEF00D8A2B5138473449EDC5B21B
+FFA8C6F3E3F5F8018ACA36CB1CB6B39040B738E974D841B613775074641BEFC7A2A99F6C
+D9E772872F041D0C99E4D9823437F1B829BC27EA0F1173830CAAB9FC05C0F673068BE8E5
+16A901689EC05704C471F2EB3641F1AAFC49CB3CEF0DBE38712A8D503EFC5D50EA00EB69
+C481812B746BCAD28B2AC0F10C249E05067F3F5E0E18B64E715AE3476B
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+{restore}if
diff --git a/data/fonts/README b/data/fonts/README
new file mode 100644
index 0000000..b03bd56
--- /dev/null
+++ b/data/fonts/README
@@ -0,0 +1,48 @@
+
+ABOUT THE LILYPOND FETA FONTS
+=============================
+
+This directory includes three PostScript Type-1 fonts from the GNU
+Lilypond musical notation typesetting project:
+
+ Lilypond-feta-design20.pfa
+ Lilypond-feta-nummer-design10.pfa
+ Lilypond-parmesan-design20.pfa
+
+These were generated from the METAFONT outlines in the Lilypond 2.1.0
+distribution. A normal make in the Lilypond source distribution's mf/
+directory will create font files called (among others) feta20.pfa,
+feta-nummer10.pfa and parmesan20.pfa, and the supplied fonts are
+exactly those, renamed to make their origin clear. (The font family
+names within the .pfa files have also been renamed, adding a
+-rosegarden suffix, so as to avoid any possible conflict with other
+versions of the same fonts installed as global system fonts.)
+
+Lilypond and the feta font are copyright 1997 to 2003 by Han-Wen
+Nienhuys and Jan Nieuwenhuizen and are distributed under the terms of
+the GNU General Public Licence, a copy of which may be found in the
+COPYING file in the top-level directory of this distribution.
+
+We would like to express our gratitude to the Lilypond project for
+taking the immense amount of time and effort to create one of the
+highest quality notation fonts available, and then making it free
+under the GPL.
+
+See http://www.lilypond.org/ for more information about Lilypond.
+
+
+GPL COMPLIANCE
+==============
+
+The supplied .pfa files are a compiled version, not the source code of
+these fonts. Because we do not wish to incorporate significant parts
+of Lilypond source into the Rosegarden distribution, under the terms
+of the GPL we hereby offer to provide the standard Lilypond-2.1.0
+source distribution without charge (except for any necessary shipping
+or packaging fee) upon application to anyone who has received these
+.pfa fonts as part of the Rosegarden distribution. Of course you
+would normally find it much easier to get the code direct from
+lilypond.org, but we are making this offer anyway so as to ensure
+formal compliance with the GPL. To take up this offer, please contact
+Chris Cannam, [email protected].
+
diff --git a/data/fonts/mappings/README b/data/fonts/mappings/README
new file mode 100644
index 0000000..6483b1a
--- /dev/null
+++ b/data/fonts/mappings/README
@@ -0,0 +1,15 @@
+
+feta.xml contains descriptions for the TrueType conversion of the
+METAFONT outline font supplied with the GNU Lilypond musical notation
+typesetting system; the font may be found in gui/fonts/feta.ttf.
+
+feta pixmaps.xml contains descriptions for a pixmap version of the
+same font; the bitmaps may be found in gui/pixmaps/feta.
+
+Lilypond and the feta font are copyright 1997 to 2001 by Han-Wen
+Nienhuys and Jan Nieuwenhuizen and are distributed under the terms of
+the GNU General Public Licence, a copy of which may be found in the
+top-level directory of this distribution.
+
+See http://www.lilypond.org/ for more information about Lilypond.
+
diff --git a/data/fonts/mappings/feta.xml b/data/fonts/mappings/feta.xml
new file mode 100644
index 0000000..9c875a1
--- /dev/null
+++ b/data/fonts/mappings/feta.xml
@@ -0,0 +1,189 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE rosegarden-font-encoding>
+
+<rosegarden-font-encoding name="Feta">
+
+<font-information
+ origin="GNU Lilypond"
+ copyright="Copyright (c) 1997--2003 Han-Wen Nienhuys and Jan Nieuwenhuizen"
+ mapped-by="Chris Cannam"
+ type="scalable"
+ smooth="true"/>
+
+<font-requirements>
+ <!-- The LilyPond fonts are included with Rosegarden, so we tweak their
+ names to avoid conflict with already-installed system fonts -->
+ <font-requirement font-id="0" names="LilyPond-feta-rosegarden" strategy="prefer-glyphs"/>
+ <font-requirement font-id="1" names="LilyPond-feta-nummer-rosegarden" strategy="prefer-codes"/>
+ <font-requirement font-id="2" names="LilyPond-parmesan-rosegarden" strategy="prefer-glyphs"/>
+ <font-requirement font-id="3" names="bitstream vera serif,luxi serif,times new roman,times,DEFAULT" strategy="prefer-codes"/> <!-- text font -->
+</font-requirements>
+
+<font-sizes>
+ <font-scale font-height="4.5" beam-thickness="0.5" staff-line-thickness="0.16" leger-line-thickness="0.19" stem-thickness="0.18"/>
+ <font-scale font-id="1" font-height="2.1"/>
+</font-sizes>
+
+<font-symbol-map>
+ <!-- Symbol names are from the Unicode code charts: see
+ http://www.unicode.org/charts/PDF/U2600.pdf
+ http://www.unicode.org/charts/PDF/U1D100.pdf -->
+
+ <codebase font-id="0" base="61440"/> <!-- Unicode private-use area -->
+
+ <symbol name="__UNKNOWN__" font-id="2" code="63"/> <!-- question mark -->
+
+ <symbol name="MUSIC SHARP SIGN" font-id="0" code="63" glyph="15"/>
+ <symbol name="MUSIC NATURAL SIGN" font-id="0" code="64" glyph="18"/>
+ <symbol name="MUSIC FLAT SIGN" font-id="0" code="65" glyph="19"/>
+
+ <symbol name="MUSICAL SYMBOL DOUBLE SHARP" font-id="0" code="67" glyph="23"/>
+ <symbol name="MUSICAL SYMBOL DOUBLE FLAT" font-id="0" code="66" glyph="21"/>
+
+ <symbol name="MUSICAL SYMBOL BREVE" font-id="0" glyph="27"/>
+ <symbol name="MUSICAL SYMBOL WHOLE NOTE" font-id="0" code="72" glyph="28"/>
+ <symbol name="MUSICAL SYMBOL VOID NOTEHEAD" font-id="0" code="73" glyph="29"/>
+ <symbol name="MUSICAL SYMBOL NOTEHEAD BLACK" font-id="0" code="74" glyph="30"/>
+
+ <symbol name="MUSICAL SYMBOL X NOTEHEAD" font-id="0" code="86" glyph="42"/>
+ <symbol name="MUSICAL SYMBOL CIRCLE X NOTEHEAD" font-id="0" code="85" glyph="43"/>
+
+ <symbol name="MUSICAL SYMBOL BREVIS" font-id="2" glyph="20"/>
+ <symbol name="MUSICAL SYMBOL SEMIBREVIS WHITE" font-id="0" glyph="143"/>
+ <symbol name="MUSICAL SYMBOL SEMIBREVIS BLACK" font-id="0" glyph="144"/>
+
+ <symbol name="MUSICAL SYMBOL TRIANGLE NOTEHEAD UP WHITE" font-id="0" glyph="137"/>
+ <symbol name="MUSICAL SYMBOL TRIANGLE NOTEHEAD UP BLACK" font-id="0" glyph="138"/>
+
+ <symbol name="MUSICAL SYMBOL COMBINING FLAG-1"
+ font-id="0" code="133" inversion-code="137" glyph="98" inversion-glyph="102"/>
+ <symbol name="MUSICAL SYMBOL COMBINING FLAG-2"
+ font-id="0" code="134" inversion-code="140" glyph="99" inversion-glyph="105"/>
+ <symbol name="MUSICAL SYMBOL COMBINING FLAG-3"
+ font-id="0" code="135" inversion-code="141" glyph="100" inversion-glyph="106"/>
+ <symbol name="MUSICAL SYMBOL COMBINING FLAG-4"
+ font-id="0" code="136" inversion-code="142" glyph="101" inversion-glyph="107"/>
+
+ <!-- None of the "... REST ON STAFF" names are part of Unicode 4.0: -->
+ <symbol name="MUSICAL SYMBOL MULTI REST" font-id="0" glyph="7"/>
+ <symbol name="MUSICAL SYMBOL MULTI REST ON STAFF" font-id="0" glyph="7"/>
+ <symbol name="MUSICAL SYMBOL WHOLE REST" font-id="0" code="34" glyph="3"/>
+ <symbol name="MUSICAL SYMBOL WHOLE REST ON STAFF" font-id="0" code="32" glyph="1"/>
+ <symbol name="MUSICAL SYMBOL HALF REST" font-id="0" code="35" glyph="4"/>
+ <symbol name="MUSICAL SYMBOL HALF REST ON STAFF" font-id="0" code="33" glyph="2"/>
+ <symbol name="MUSICAL SYMBOL QUARTER REST" font-id="0" code="38" glyph="8"/>
+ <symbol name="MUSICAL SYMBOL EIGHTH REST" font-id="0" code="39" glyph="10"/>
+ <symbol name="MUSICAL SYMBOL SIXTEENTH REST" font-id="0" code="41" glyph="11"/>
+ <symbol name="MUSICAL SYMBOL THIRTY-SECOND REST" font-id="0" code="42" glyph="12"/>
+ <symbol name="MUSICAL SYMBOL SIXTY-FOURTH REST" font-id="0" code="43" glyph="13"/>
+ <symbol name="MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH REST" font-id="0" code="44" glyph="14"/>
+
+ <symbol name="MUSICAL SYMBOL COMBINING AUGMENTATION DOT" font-id="0" code="70" glyph="26"/>
+
+ <symbol name="MUSICAL SYMBOL COMBINING ACCENT" font-id="0" code="92" glyph="53"/>
+ <symbol name="MUSICAL SYMBOL COMBINING TENUTO" font-id="0" code="96" glyph="57"/>
+ <symbol name="MUSICAL SYMBOL COMBINING STACCATO" font-id="0" code="93" glyph="54"/>
+ <symbol name="MUSICAL SYMBOL COMBINING STACCATISSIMO"
+ font-id="0" code="94" inversion-code="95" glyph="55" inversion-glyph="56"/>
+ <symbol name="MUSICAL SYMBOL COMBINING MARCATO"
+ font-id="0" code="99" inversion-code="100" glyph="60" inversion-glyph="61"/>
+ <symbol name="MUSICAL SYMBOL FERMATA"
+ font-id="0" code="89" inversion-code="90" glyph="44" inversion-glyph="45"/>
+ <symbol name="MUSICAL SYMBOL TR" font-id="0" code="107" glyph="68"/>
+ <symbol name="MUSICAL SYMBOL TURN" font-id="0" code="106" glyph="67"/>
+
+ <!-- The mordents and trill line are not Unicode names: -->
+ <symbol name="MUSICAL SYMBOL COMBINING TRILL LINE" font-id="0" glyph="82"/>
+ <symbol name="MUSICAL SYMBOL MORDENT" font-id="0" glyph="87"/>
+ <symbol name="MUSICAL SYMBOL INVERTED MORDENT" font-id="0" glyph="86"/>
+ <symbol name="MUSICAL SYMBOL LONG MORDENT" font-id="0" glyph="89"/>
+ <symbol name="MUSICAL SYMBOL LONG INVERTED MORDENT" font-id="0" glyph="88"/>
+
+ <symbol name="MUSICAL SYMBOL COMBINING UP BOW" font-id="0" code="103" glyph="64"/>
+ <symbol name="MUSICAL SYMBOL COMBINING DOWN BOW" font-id="0" code="104" glyph="65"/>
+
+ <symbol name="MUSICAL SYMBOL PEDAL MARK" font-id="0" glyph="126"/>
+ <symbol name="MUSICAL SYMBOL PEDAL UP MARK" font-id="0" glyph="120"/>
+
+ <symbol name="MUSICAL SYMBOL C CLEF" font-id="0" code="145" glyph="108"/>
+ <symbol name="MUSICAL SYMBOL G CLEF" font-id="0" code="149" glyph="112"/>
+ <symbol name="MUSICAL SYMBOL F CLEF" font-id="0" code="147" glyph="110"/>
+
+ <symbol name="MUSICAL SYMBOL CUT TIME" font-id="0" glyph="119"/>
+ <symbol name="MUSICAL SYMBOL COMMON TIME" font-id="0" glyph="118"/>
+
+ <symbol name="DIGIT ZERO" font-id="1" code="48"/>
+ <symbol name="DIGIT ONE" font-id="1" code="49"/>
+ <symbol name="DIGIT TWO" font-id="1" code="50"/>
+ <symbol name="DIGIT THREE" font-id="1" code="51"/>
+ <symbol name="DIGIT FOUR" font-id="1" code="52"/>
+ <symbol name="DIGIT FIVE" font-id="1" code="53"/>
+ <symbol name="DIGIT SIX" font-id="1" code="54"/>
+ <symbol name="DIGIT SEVEN" font-id="1" code="55"/>
+ <symbol name="DIGIT EIGHT" font-id="1" code="56"/>
+ <symbol name="DIGIT NINE" font-id="1" code="57"/>
+
+</font-symbol-map>
+
+<font-hotspots>
+ <hotspot name="MUSICAL SYMBOL VOID NOTEHEAD">
+ <scaled x="0.1" y="0.5"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL NOTEHEAD BLACK">
+ <fixed x="1"/>
+ <scaled y="0.5"/>
+ </hotspot>
+ <hotspot name="MUSIC FLAT SIGN">
+ <scaled y="0.74"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL DOUBLE FLAT">
+ <scaled y="0.74"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL C CLEF">
+ <scaled y="0.47"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL G CLEF">
+ <scaled y="0.64"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL F CLEF">
+ <scaled y="0.32"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL MULTI REST">
+ <scaled y="0"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL MULTI REST ON STAFF">
+ <scaled y="0"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL WHOLE REST">
+ <scaled y="0.1"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL WHOLE REST ON STAFF">
+ <scaled y="0.1"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL HALF REST">
+ <scaled y="0.9"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL HALF REST ON STAFF">
+ <scaled y="0.9"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL QUARTER REST">
+ <scaled y="0.5"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL EIGHTH REST">
+ <scaled y="0.4"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL SIXTEENTH REST">
+ <scaled y="0.28"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL THIRTY-SECOND REST">
+ <scaled y="0.45"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL SIXTY-FOURTH REST">
+ <scaled y="0.4"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL COMBINING TRILL LINE">
+ <scaled x="0.4" y="0.5"/>
+ </hotspot>
+</font-hotspots>
+
+</rosegarden-font-encoding>
diff --git a/data/fonts/mappings/feta_pixmaps.xml b/data/fonts/mappings/feta_pixmaps.xml
new file mode 100644
index 0000000..b50bc79
--- /dev/null
+++ b/data/fonts/mappings/feta_pixmaps.xml
@@ -0,0 +1,226 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE rosegarden-font-encoding>
+
+<rosegarden-font-encoding name="Feta Pixmaps">
+
+<font-information
+ origin="GNU Lilypond"
+ copyright="Copyright (c) 1997--2003 Han-Wen Nienhuys and Jan Nieuwenhuizen"
+ mapped-by="Chris Cannam"
+ type="pixmap"
+ smooth="true"/>
+
+<font-sizes>
+ <font-size note-height="4" beam-thickness="2" staff-line-thickness="1" stem-thickness="1"/>
+ <font-size note-height="6" beam-thickness="3" staff-line-thickness="1" stem-thickness="1"/>
+ <font-size note-height="8" beam-thickness="4" staff-line-thickness="1" stem-thickness="1"/>
+ <font-size note-height="10" beam-thickness="5" staff-line-thickness="1" stem-thickness="2"/>
+ <font-size note-height="12" beam-thickness="6" staff-line-thickness="2" stem-thickness="2"/>
+</font-sizes>
+
+<font-symbol-map>
+ <!-- Symbol names are from the Unicode code charts: see
+ http://www.unicode.org/charts/PDF/U2600.pdf
+ http://www.unicode.org/charts/PDF/U1D100.pdf -->
+
+ <src-directory name="feta"/>
+
+ <symbol name="__UNKNOWN__" src="unknown"/>
+
+ <symbol name="MUSIC SHARP SIGN" src="accidentals-1"/>
+ <symbol name="MUSIC NATURAL SIGN" src="accidentals-0"/>
+ <symbol name="MUSIC FLAT SIGN" src="accidentals--1"/>
+
+ <symbol name="MUSICAL SYMBOL DOUBLE SHARP" src="accidentals-2"/>
+ <symbol name="MUSICAL SYMBOL DOUBLE FLAT" src="accidentals--2"/>
+
+ <symbol name="MUSICAL SYMBOL BREVE" src="noteheads--1"/>
+ <symbol name="MUSICAL SYMBOL WHOLE NOTE" src="noteheads-0"/>
+ <symbol name="MUSICAL SYMBOL VOID NOTEHEAD" src="noteheads-1"/>
+ <symbol name="MUSICAL SYMBOL NOTEHEAD BLACK" src="noteheads-2"/>
+
+ <symbol name="MUSICAL SYMBOL X NOTEHEAD" src="noteheads-2cross"/>
+ <symbol name="MUSICAL SYMBOL CIRCLE X NOTEHEAD" src="noteheads-2xcircle"/>
+ <symbol name="MUSICAL SYMBOL BREVIS" src="noteheads--1mensural"/>
+ <symbol name="MUSICAL SYMBOL SEMIBREVIS WHITE" src="noteheads-1mensural"/>
+ <symbol name="MUSICAL SYMBOL SEMIBREVIS BLACK" src="noteheads-2mensural"/>
+ <symbol name="MUSICAL SYMBOL TRIANGLE NOTEHEAD UP WHITE" src="noteheads-1triangle"/>
+ <symbol name="MUSICAL SYMBOL TRIANGLE NOTEHEAD UP BLACK" src="noteheads-2triangle"/>
+
+ <!-- There's only one Unicode point for each flag; I guess
+ you're expected to invert them yourself -->
+ <symbol name="MUSICAL SYMBOL COMBINING FLAG-1"
+ src="flags-u3" inversion-src="flags-d3"/>
+ <symbol name="MUSICAL SYMBOL COMBINING FLAG-2"
+ src="flags-u4" inversion-src="flags-d4"/>
+ <symbol name="MUSICAL SYMBOL COMBINING FLAG-3"
+ src="flags-u5" inversion-src="flags-d5"/>
+ <symbol name="MUSICAL SYMBOL COMBINING FLAG-4"
+ src="flags-u6" inversion-src="flags-d6"/>
+
+ <!-- None of the "... REST ON STAFF" names are part of Unicode 4.0: -->
+ <symbol name="MUSICAL SYMBOL MULTI REST" src="rests--1o"/>
+ <symbol name="MUSICAL SYMBOL MULTI REST ON STAFF" src="rests--1"/>
+ <symbol name="MUSICAL SYMBOL WHOLE REST" src="rests-0o"/>
+ <symbol name="MUSICAL SYMBOL WHOLE REST ON STAFF" src="rests-0"/>
+ <symbol name="MUSICAL SYMBOL HALF REST" src="rests-1o"/>
+ <symbol name="MUSICAL SYMBOL HALF REST ON STAFF" src="rests-1"/>
+ <symbol name="MUSICAL SYMBOL QUARTER REST" src="rests-2"/>
+ <symbol name="MUSICAL SYMBOL EIGHTH REST" src="rests-3"/>
+ <symbol name="MUSICAL SYMBOL SIXTEENTH REST" src="rests-4"/>
+ <symbol name="MUSICAL SYMBOL THIRTY-SECOND REST" src="rests-5"/>
+ <symbol name="MUSICAL SYMBOL SIXTY-FOURTH REST" src="rests-6"/>
+ <symbol name="MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH REST" src="rests-7"/>
+
+ <symbol name="MUSICAL SYMBOL COMBINING AUGMENTATION DOT" src="dots-dot"/>
+
+ <symbol name="MUSICAL SYMBOL COMBINING ACCENT" src="scripts-sforzato"/>
+ <symbol name="MUSICAL SYMBOL COMBINING TENUTO" src="scripts-tenuto"/>
+ <symbol name="MUSICAL SYMBOL COMBINING STACCATO" src="scripts-staccato"/>
+ <symbol name="MUSICAL SYMBOL COMBINING STACCATISSIMO"
+ src="scripts-ustaccatissimo" inversion-src="scripts-dstaccatissimo"/>
+ <symbol name="MUSICAL SYMBOL COMBINING MARCATO"
+ src="scripts-umarcato" inversion-src="scripts-dmarcato"/>
+ <symbol name="MUSICAL SYMBOL FERMATA"
+ src="scripts-ufermata" inversion-src="scripts-dfermata"/>
+ <symbol name="MUSICAL SYMBOL TR" src="scripts-trill"/>
+ <symbol name="MUSICAL SYMBOL TURN" src="scripts-turn"/>
+ <symbol name="MUSICAL SYMBOL COMBINING UP BOW" src="scripts-upbow"/>
+ <symbol name="MUSICAL SYMBOL COMBINING DOWN BOW" src="scripts-downbow"/>
+ <!-- Unicode (and Lilypond) just have a single G clef, they
+ don't distinguish between alto and tenor. We'll have to
+ use the same clef with an offset. -->
+ <symbol name="MUSICAL SYMBOL C CLEF" src="clefs-C"/>
+ <symbol name="MUSICAL SYMBOL G CLEF" src="clefs-G"/>
+ <symbol name="MUSICAL SYMBOL F CLEF" src="clefs-F"/>
+</font-symbol-map>
+
+<font-hotspots>
+ <hotspot name="MUSICAL SYMBOL VOID NOTEHEAD">
+ <fixed x="1"/>
+ <scaled y="0.5"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL NOTEHEAD BLACK">
+ <fixed x="1"/>
+ <scaled y="0.5"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL COMBINING FLAG-1">
+ <fixed x="1"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL COMBINING FLAG-2">
+ <fixed x="1"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL COMBINING FLAG-3">
+ <fixed x="1"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL COMBINING FLAG-4">
+ <fixed x="1"/>
+ </hotspot>
+ <hotspot name="MUSIC FLAT SIGN">
+ <when note-height="4" y="8"/>
+ <when note-height="6" y="12"/>
+ <when note-height="8" y="15"/>
+ <when note-height="10" y="19"/>
+ <when note-height="12" y="22"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL C CLEF">
+ <when note-height="4" y="9"/>
+ <when note-height="6" y="13"/>
+ <when note-height="8" y="16"/>
+ <when note-height="10" y="20"/>
+ <when note-height="12" y="24"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL G CLEF">
+ <when note-height="4" y="19"/>
+ <when note-height="6" y="29"/>
+ <when note-height="8" y="38"/>
+ <when note-height="10" y="48"/>
+ <when note-height="12" y="58"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL F CLEF">
+ <when note-height="4" y="5"/>
+ <when note-height="6" y="7"/>
+ <when note-height="8" y="9"/>
+ <when note-height="10" y="11"/>
+ <when note-height="12" y="13"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL MULTI REST">
+ <when note-height="4" y="0"/>
+ <when note-height="6" y="0"/>
+ <when note-height="8" y="0"/>
+ <when note-height="10" y="0"/>
+ <when note-height="12" y="0"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL MULTI REST ON STAFF">
+ <when note-height="4" y="0"/>
+ <when note-height="6" y="0"/>
+ <when note-height="8" y="0"/>
+ <when note-height="10" y="0"/>
+ <when note-height="12" y="0"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL WHOLE REST">
+ <when note-height="4" y="1"/>
+ <when note-height="6" y="1"/>
+ <when note-height="8" y="1"/>
+ <when note-height="10" y="1"/>
+ <when note-height="12" y="1"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL WHOLE REST ON STAFF">
+ <when note-height="4" y="1"/>
+ <when note-height="6" y="1"/>
+ <when note-height="8" y="1"/>
+ <when note-height="10" y="1"/>
+ <when note-height="12" y="1"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL HALF REST">
+ <when note-height="4" y="3"/>
+ <when note-height="6" y="4"/>
+ <when note-height="8" y="6"/>
+ <when note-height="10" y="7"/>
+ <when note-height="12" y="8"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL HALF REST ON STAFF">
+ <when note-height="4" y="3"/>
+ <when note-height="6" y="4"/>
+ <when note-height="8" y="6"/>
+ <when note-height="10" y="7"/>
+ <when note-height="12" y="8"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL QUARTER REST">
+ <when note-height="4" y="6"/>
+ <when note-height="6" y="9"/>
+ <when note-height="8" y="12"/>
+ <when note-height="10" y="15"/>
+ <when note-height="12" y="19"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL EIGHTH REST">
+ <when note-height="4" y="4"/>
+ <when note-height="6" y="6"/>
+ <when note-height="8" y="7"/>
+ <when note-height="10" y="9"/>
+ <when note-height="12" y="11"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL SIXTEENTH REST">
+ <when note-height="4" y="5"/>
+ <when note-height="6" y="7"/>
+ <when note-height="8" y="8"/>
+ <when note-height="10" y="10"/>
+ <when note-height="12" y="12"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL THIRTY-SECOND REST">
+ <when note-height="4" y="6"/>
+ <when note-height="6" y="8"/>
+ <when note-height="8" y="9"/>
+ <when note-height="10" y="11"/>
+ <when note-height="12" y="13"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL SIXTY-FOURTH REST">
+ <when note-height="4" y="7"/>
+ <when note-height="6" y="9"/>
+ <when note-height="8" y="10"/>
+ <when note-height="10" y="12"/>
+ <when note-height="12" y="14"/>
+ </hotspot>
+</font-hotspots>
+
+</rosegarden-font-encoding>
diff --git a/data/fonts/mappings/fughetta.xml b/data/fonts/mappings/fughetta.xml
new file mode 100644
index 0000000..3612f81
--- /dev/null
+++ b/data/fonts/mappings/fughetta.xml
@@ -0,0 +1,155 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE rosegarden-font-encoding>
+
+<!-- The name here must match the filename in everything except case -->
+<rosegarden-font-encoding name="Fughetta">
+
+<!-- !!! check copyright -->
+<font-information
+ origin="Created by Blake Hodgetts; freely redistributable. See http://www.efn.org/~bch/aboutfonts.html"
+ copyright="Copyright 1995-1999 Blake Hodgetts"
+ mapped-by="Chris Cannam"
+ type="scalable"
+ smooth="true"/>
+
+<font-requirements>
+ <font-requirement font-id="0" names="fughetta" strategy="prefer-glyphs"/>
+ <font-requirement font-id="1" names="georgia,times new roman,times,DEFAULT" strategy="prefer-codes"/> <!-- text font -->
+</font-requirements>
+
+<font-sizes>
+ <font-scale font-height="4.3" beam-thickness="0.5" staff-line-thickness="0.1" stem-thickness="0.1"/>
+</font-sizes>
+
+<font-symbol-map>
+ <!-- Symbol names are from the Unicode code charts: see
+ http://www.unicode.org/charts/PDF/U2600.pdf
+ http://www.unicode.org/charts/PDF/U1D100.pdf -->
+
+ <codebase font-id="0" base="61440"/> <!-- Unicode private-use area -->
+
+ <symbol name="__UNKNOWN__" font-id="1" code="63"/> <!-- question mark -->
+
+ <symbol name="MUSIC SHARP SIGN" font-id="0" code="35" glyph="35"/>
+ <symbol name="MUSIC NATURAL SIGN" font-id="0" code="110" glyph="110"/>
+ <symbol name="MUSIC FLAT SIGN" font-id="0" code="98" glyph="98"/>
+
+ <symbol name="MUSICAL SYMBOL DOUBLE SHARP" font-id="0" code="220" glyph="220"/>
+ <symbol name="MUSICAL SYMBOL DOUBLE FLAT" font-id="0" code="186" glyph="186"/>
+
+ <symbol name="MUSICAL SYMBOL BREVE" font-id="0" code="87" glyph="87"/>
+ <symbol name="MUSICAL SYMBOL WHOLE NOTE" font-id="0" code="119" glyph="119"/>
+ <symbol name="MUSICAL SYMBOL VOID NOTEHEAD" font-id="0" code="243" glyph="243"/>
+ <symbol name="MUSICAL SYMBOL NOTEHEAD BLACK" font-id="0" code="207" glyph="207"/>
+
+
+ <symbol name="MUSICAL SYMBOL X NOTEHEAD" font-id="0" code="224" glyph="224"/>
+
+ <symbol name="MUSICAL SYMBOL CIRCLE X NOTEHEAD" font-id="0" code="88" glyph="88"/>
+ <symbol name="MUSICAL SYMBOL BREVIS" font-id="0" code="221" glyph="221"/>
+ <symbol name="MUSICAL SYMBOL SEMIBREVIS WHITE" font-id="0" code="77" glyph="77"/>
+ <symbol name="MUSICAL SYMBOL SEMIBREVIS BLACK" font-id="0" code="75" glyph="75"/>
+ <symbol name="MUSICAL SYMBOL TRIANGLE NOTEHEAD UP WHITE" font-id="0" code="141" glyph="141"/>
+ <symbol name="MUSICAL SYMBOL TRIANGLE NOTEHEAD UP BLACK" font-id="0" code="143" glyph="143"/>
+
+ <!-- There's only one Unicode point for each flag; I guess
+ you're expected to invert them yourself -->
+ <symbol name="MUSICAL SYMBOL COMBINING PARTIAL FLAG"
+ font-id="0" code="730"/>
+ <symbol name="MUSICAL SYMBOL COMBINING PARTIAL FLAG FINAL"
+ font-id="0" code="106" glyph="106" inversion-code="74" inversion-glyph="74"/>
+ <symbol name="MUSICAL SYMBOL COMBINING FLAG-1"
+ font-id="0" code="106" glyph="106" inversion-code="74" inversion-glyph="74"/>
+ <symbol name="MUSICAL SYMBOL MULTI REST" font-id="0" code="214" glyph="214"/>
+ <symbol name="MUSICAL SYMBOL WHOLE REST" font-id="0" code="227" glyph="227"/>
+ <symbol name="MUSICAL SYMBOL HALF REST" font-id="0" code="238" glyph="238"/>
+ <symbol name="MUSICAL SYMBOL QUARTER REST" font-id="0" code="206" glyph="206"/>
+ <symbol name="MUSICAL SYMBOL EIGHTH REST" font-id="0" code="228" glyph="228"/>
+ <symbol name="MUSICAL SYMBOL SIXTEENTH REST" font-id="0" code="197" glyph="197"/>
+ <symbol name="MUSICAL SYMBOL THIRTY-SECOND REST" font-id="0" code="168" glyph="168"/>
+ <symbol name="MUSICAL SYMBOL SIXTY-FOURTH REST" font-id="0" code="244" glyph="244"/>
+ <symbol name="MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH REST" font-id="0" code="229" glyph="229"/>
+
+ <symbol name="MUSICAL SYMBOL COMBINING AUGMENTATION DOT" font-id="0" code="46" glyph="46"/>
+<!-- ???
+ <symbol name="MUSICAL SYMBOL COMBINING ACCENT" font-id="0" code="62" glyph="62"/>
+ <symbol name="MUSICAL SYMBOL COMBINING TENUTO" font-id="0" code="45" glyph="45"/>
+ <symbol name="MUSICAL SYMBOL COMBINING STACCATO" font-id="0" code="46" glyph="46"/>
+ <symbol name="MUSICAL SYMBOL COMBINING STACCATISSIMO"
+ font-id="0" code="174" glyph="174" inversion-code="95" inversion-glyph="95"/>
+ <symbol name="MUSICAL SYMBOL COMBINING MARCATO"
+ font-id="0" code="94" glyph="94" inversion-code="118" inversion-glyph="118"/>
+ <symbol name="MUSICAL SYMBOL FERMATA"
+ font-id="0" code="85" glyph="85" inversion-code="117" inversion-glyph="117"/>
+-->
+<!--
+ <symbol name="MUSICAL SYMBOL TR" font-id="0" code="107" glyph="107"/>
+ <symbol name="MUSICAL SYMBOL TURN" font-id="0" code="106" glyph="106"/>
+ <symbol name="MUSICAL SYMBOL COMBINING UP BOW" font-id="0" code="178" glyph="178"/>
+ <symbol name="MUSICAL SYMBOL COMBINING DOWN BOW" font-id="0" code="179" glyph="179"/>
+-->
+
+ <!-- Unicode (and Lilypond) just have a single G clef, they
+ don't distinguish between alto and tenor. We'll have to
+ use the same clef with an offset. -->
+ <symbol name="MUSICAL SYMBOL C CLEF" font-id="0" code="66" glyph="66"/>
+ <symbol name="MUSICAL SYMBOL G CLEF" font-id="0" code="38" glyph="38"/>
+ <symbol name="MUSICAL SYMBOL F CLEF" font-id="0" code="63" glyph="63"/>
+
+ <symbol name="MUSICAL SYMBOL CUT TIME" font-id="0" glyph="67"/>
+ <symbol name="MUSICAL SYMBOL COMMON TIME" font-id="0" glyph="99"/>
+ <symbol name="DIGIT ZERO" font-id="0" code="48" glyph="48"/>
+ <symbol name="DIGIT ONE" font-id="0" code="49" glyph="49"/>
+ <symbol name="DIGIT TWO" font-id="0" code="50" glyph="50"/>
+ <symbol name="DIGIT THREE" font-id="0" code="51" glyph="51"/>
+ <symbol name="DIGIT FOUR" font-id="0" code="52" glyph="52"/>
+ <symbol name="DIGIT FIVE" font-id="0" code="53" glyph="53"/>
+ <symbol name="DIGIT SIX" font-id="0" code="54" glyph="54"/>
+ <symbol name="DIGIT SEVEN" font-id="0" code="55" glyph="55"/>
+ <symbol name="DIGIT EIGHT" font-id="0" code="56" glyph="56"/>
+ <symbol name="DIGIT NINE" font-id="0" code="57" glyph="57"/>
+</font-symbol-map>
+
+<font-hotspots>
+ <hotspot name="MUSIC FLAT SIGN">
+ <scaled y="0.74"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL DOUBLE FLAT">
+ <scaled y="0.74"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL C CLEF">
+ <scaled y="0.47"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL G CLEF">
+ <scaled y="0.64"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL F CLEF">
+ <scaled y="0.32"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL MULTI REST">
+ <scaled y="0"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL WHOLE REST">
+ <scaled y="0"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL HALF REST">
+ <scaled y="0.98"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL QUARTER REST">
+ <scaled y="0.5"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL EIGHTH REST">
+ <scaled y="0.4"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL SIXTEENTH REST">
+ <scaled y="0.28"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL THIRTY-SECOND REST">
+ <scaled y="0.45"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL SIXTY-FOURTH REST">
+ <scaled y="0.4"/>
+ </hotspot>
+</font-hotspots>
+
+</rosegarden-font-encoding>
diff --git a/data/fonts/mappings/inkpen.xml b/data/fonts/mappings/inkpen.xml
new file mode 100644
index 0000000..136132c
--- /dev/null
+++ b/data/fonts/mappings/inkpen.xml
@@ -0,0 +1,154 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE rosegarden-font-encoding>
+
+<rosegarden-font-encoding name="Inkpen">
+
+<!-- !!! check copyright -->
+<font-information
+ origin="Inkpen is part of Sibelius, but other fonts may use the same mappings."
+ copyright="Copyright Sibelius Software Ltd"
+ mapped-by="Chris Cannam"
+ type="scalable"
+ smooth="true"/>
+
+<font-requirements>
+ <font-requirement font-id="0" names="inkpen2,inkpen" strategy="prefer-glyphs"/>
+ <font-requirement font-id="1" names="inkpen2 text,inkpen text,comic sans ms,times new roman,times,DEFAULT" strategy="prefer-codes"/> <!-- text font -->
+</font-requirements>
+
+<font-sizes>
+ <font-scale font-height="4.0" beam-thickness="0.5" staff-line-thickness="0.1" stem-thickness="0.15"/>
+</font-sizes>
+
+<font-symbol-map>
+ <!-- Symbol names are from the Unicode code charts: see
+ http://www.unicode.org/charts/PDF/U2600.pdf
+ http://www.unicode.org/charts/PDF/U1D100.pdf -->
+
+ <symbol name="__UNKNOWN__" font-id="1" code="63"/> <!-- question mark -->
+
+ <symbol name="MUSIC SHARP SIGN" font-id="0" code="35" glyph="3"/>
+ <symbol name="MUSIC NATURAL SIGN" font-id="0" code="110" glyph="45"/>
+ <symbol name="MUSIC FLAT SIGN" font-id="0" code="98" glyph="39"/>
+
+ <symbol name="MUSICAL SYMBOL DOUBLE SHARP" font-id="0" code="8249" glyph="69"/>
+ <symbol name="MUSICAL SYMBOL DOUBLE FLAT" font-id="0" code="8747" glyph="61"/>
+
+ <symbol name="MUSICAL SYMBOL BREVE" font-id="0" code="87" glyph="36"/>
+ <symbol name="MUSICAL SYMBOL WHOLE NOTE" font-id="0" code="119" glyph="51"/>
+ <symbol name="MUSICAL SYMBOL VOID NOTEHEAD" font-id="0" code="729" glyph="78"/>
+ <symbol name="MUSICAL SYMBOL NOTEHEAD BLACK" font-id="0" code="339" glyph="65"/>
+
+ <symbol name="MUSICAL SYMBOL X NOTEHEAD" font-id="0" code="192"/>
+
+<!-- <symbol name="MUSICAL SYMBOL CIRCLE X NOTEHEAD" font-id="0" code="85" glyph="35"/> -->
+ <symbol name="MUSICAL SYMBOL BREVIS" font-id="0" code="8250" glyph="70"/>
+ <symbol name="MUSICAL SYMBOL SEMIBREVIS WHITE" font-id="0" code="79" glyph="31"/>
+ <symbol name="MUSICAL SYMBOL SEMIBREVIS BLACK" font-id="0" code="8218" glyph="72"/>
+<!--
+ <symbol name="MUSICAL SYMBOL TRIANGLE NOTEHEAD UP WHITE" font-id="0" code="121"/>
+ <symbol name="MUSICAL SYMBOL TRIANGLE NOTEHEAD UP BLACK" font-id="0" code="209"/>
+-->
+ <!-- There's only one Unicode point for each flag; I guess
+ you're expected to invert them yourself -->
+ <symbol name="MUSICAL SYMBOL COMBINING PARTIAL FLAG"
+ font-id="0" code="75" glyph="29" inversion-code="212" inversion-glyph="76"/>
+ <symbol name="MUSICAL SYMBOL COMBINING PARTIAL FLAG FINAL"
+ font-id="0" code="106" glyph="43" inversion-code="74" inversion-glyph="28"/>
+ <symbol name="MUSICAL SYMBOL COMBINING FLAG-1"
+ font-id="0" code="106" glyph="43" inversion-code="74" inversion-glyph="28"/>
+ <symbol name="MUSICAL SYMBOL COMBINING FLAG-2"
+ font-id="0" code="114" glyph="48" inversion-code="82" inversion-glyph="33"/>
+<!--
+ <symbol name="MUSICAL SYMBOL MULTI REST" font-id="0" code=""/>
+-->
+ <symbol name="MUSICAL SYMBOL WHOLE REST" font-id="0" code="8721" glyph="60"/>
+ <symbol name="MUSICAL SYMBOL HALF REST" font-id="0" code="211" glyph="75"/>
+ <symbol name="MUSICAL SYMBOL QUARTER REST" font-id="0" code="338" glyph="64"/>
+ <symbol name="MUSICAL SYMBOL EIGHTH REST" font-id="0" code="8240" glyph="73"/>
+ <symbol name="MUSICAL SYMBOL SIXTEENTH REST" font-id="0" code="8776" glyph="63"/>
+ <symbol name="MUSICAL SYMBOL THIRTY-SECOND REST" font-id="0" code="174" glyph="55"/>
+ <symbol name="MUSICAL SYMBOL SIXTY-FOURTH REST" font-id="0" code="217" glyph="77"/>
+ <symbol name="MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH REST" font-id="0" code="194" glyph="74"/>
+
+ <symbol name="MUSICAL SYMBOL COMBINING AUGMENTATION DOT" font-id="0" code="46" glyph="10"/>
+
+ <symbol name="MUSICAL SYMBOL COMBINING ACCENT" font-id="0" code="62" glyph="22"/>
+ <symbol name="MUSICAL SYMBOL COMBINING TENUTO" font-id="0" code="45" glyph="9"/>
+ <symbol name="MUSICAL SYMBOL COMBINING STACCATO" font-id="0" code="46" glyph="10"/>
+ <symbol name="MUSICAL SYMBOL COMBINING STACCATISSIMO"
+ font-id="0" code="174" glyph="55" inversion-code="95"/>
+ <symbol name="MUSICAL SYMBOL COMBINING MARCATO"
+ font-id="0" code="94" glyph="38" inversion-code="118" inversion-glyph="50"/>
+ <symbol name="MUSICAL SYMBOL FERMATA"
+ font-id="0" code="85" glyph="35" inversion-code="117" inversion-glyph="49"/>
+ <symbol name="MUSICAL SYMBOL TR" font-id="0" code="376" glyph="68"/>
+<!--
+ <symbol name="MUSICAL SYMBOL TURN" font-id="0" code="106" glyph="43"/>
+-->
+ <symbol name="MUSICAL SYMBOL COMBINING UP BOW" font-id="0" code="8804" glyph="57"/>
+ <symbol name="MUSICAL SYMBOL COMBINING DOWN BOW" font-id="0" code="8805" glyph="58"/>
+ <!-- Unicode (and Lilypond) just have a single G clef, they
+ don't distinguish between alto and tenor. We'll have to
+ use the same clef with an offset. -->
+ <symbol name="MUSICAL SYMBOL C CLEF" font-id="0" code="66" glyph="24"/>
+ <symbol name="MUSICAL SYMBOL G CLEF" font-id="0" code="38" glyph="5"/>
+ <symbol name="MUSICAL SYMBOL F CLEF" font-id="0" code="63" glyph="23"/>
+
+ <symbol name="MUSICAL SYMBOL CUT TIME" font-id="0" glyph="25"/>
+ <symbol name="MUSICAL SYMBOL COMMON TIME" font-id="0" glyph="40"/>
+ <symbol name="DIGIT ZERO" font-id="0" code="48" glyph="12"/>
+ <symbol name="DIGIT ONE" font-id="0" code="49" glyph="13"/>
+ <symbol name="DIGIT TWO" font-id="0" code="50" glyph="14"/>
+ <symbol name="DIGIT THREE" font-id="0" code="51" glyph="15"/>
+ <symbol name="DIGIT FOUR" font-id="0" code="52" glyph="16"/>
+ <symbol name="DIGIT FIVE" font-id="0" code="53" glyph="17"/>
+ <symbol name="DIGIT SIX" font-id="0" code="54" glyph="18"/>
+ <symbol name="DIGIT SEVEN" font-id="0" code="55" glyph="19"/>
+ <symbol name="DIGIT EIGHT" font-id="0" code="56" glyph="20"/>
+ <symbol name="DIGIT NINE" font-id="0" code="57" glyph="21"/>
+</font-symbol-map>
+
+<font-hotspots>
+ <hotspot name="MUSIC FLAT SIGN">
+ <scaled y="0.74"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL DOUBLE FLAT">
+ <scaled y="0.74"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL C CLEF">
+ <scaled y="0.47"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL G CLEF">
+ <scaled y="0.64"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL F CLEF">
+ <scaled y="0.32"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL MULTI REST">
+ <scaled y="0"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL WHOLE REST">
+ <scaled y="0"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL HALF REST">
+ <scaled y="0.98"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL QUARTER REST">
+ <scaled y="0.5"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL EIGHTH REST">
+ <scaled y="0.4"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL SIXTEENTH REST">
+ <scaled y="0.28"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL THIRTY-SECOND REST">
+ <scaled y="0.45"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL SIXTY-FOURTH REST">
+ <scaled y="0.4"/>
+ </hotspot>
+</font-hotspots>
+
+</rosegarden-font-encoding>
diff --git a/data/fonts/mappings/maestro.xml b/data/fonts/mappings/maestro.xml
new file mode 100644
index 0000000..c4946de
--- /dev/null
+++ b/data/fonts/mappings/maestro.xml
@@ -0,0 +1,154 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE rosegarden-font-encoding>
+
+<!-- The name here must match the filename in everything except case -->
+<rosegarden-font-encoding name="Maestro">
+
+<!-- !!! check copyright -->
+<font-information
+ origin="Maestro is part of Finale, but other fonts use the same mappings."
+ copyright="Copyright Coda Inc"
+ mapped-by="Chris Cannam"
+ type="scalable"
+ smooth="true"/>
+
+<font-requirements>
+ <font-requirement font-id="0" names="maestro"/>
+ <font-requirement font-id="1" names="georgia,times new roman,times,DEFAULT"/> <!-- text font -->
+</font-requirements>
+
+<font-sizes>
+ <font-scale font-height="4.3" beam-thickness="0.5" staff-line-thickness="0.1" stem-thickness="0.1" flag-spacing="0.8"/>
+</font-sizes>
+
+<font-symbol-map>
+ <!-- Symbol names are from the Unicode code charts: see
+ http://www.unicode.org/charts/PDF/U2600.pdf
+ http://www.unicode.org/charts/PDF/U1D100.pdf -->
+
+ <codebase font-id="0" base="61440"/> <!-- Unicode private-use area -->
+
+ <symbol name="__UNKNOWN__" font-id="1" code="63"/> <!-- question mark -->
+
+ <symbol name="MUSIC SHARP SIGN" font-id="0" code="35" glyph="6"/>
+ <symbol name="MUSIC NATURAL SIGN" font-id="0" code="110" glyph="79"/>
+ <symbol name="MUSIC FLAT SIGN" font-id="0" code="98" glyph="68"/>
+
+ <symbol name="MUSICAL SYMBOL DOUBLE SHARP" font-id="0" code="220" glyph="174"/>
+ <symbol name="MUSICAL SYMBOL DOUBLE FLAT" font-id="0" code="186" glyph="142"/>
+
+ <symbol name="MUSICAL SYMBOL BREVE" font-id="0" code="87" glyph="57"/>
+ <symbol name="MUSICAL SYMBOL WHOLE NOTE" font-id="0" code="119" glyph="88"/>
+ <symbol name="MUSICAL SYMBOL VOID NOTEHEAD" font-id="0" code="250" glyph="204"/>
+ <symbol name="MUSICAL SYMBOL NOTEHEAD BLACK" font-id="0" code="207" glyph="161"/>
+
+ <symbol name="MUSICAL SYMBOL X NOTEHEAD" font-id="0" code="192" glyph="148"/>
+
+<!-- <symbol name="MUSICAL SYMBOL CIRCLE X NOTEHEAD" font-id="0" code="85" glyph="55"/> -->
+<!-- <symbol name="MUSICAL SYMBOL BREVIS" font-id="0" code="71" glyph="41"/> -->
+<!-- <symbol name="MUSICAL SYMBOL SEMIBREVIS WHITE" font-id="0" code=""/> -->
+<!--
+ <symbol name="MUSICAL SYMBOL SEMIBREVIS BLACK" font-id="0" code="noteheads-2mensural"/>
+-->
+ <symbol name="MUSICAL SYMBOL TRIANGLE NOTEHEAD UP WHITE" font-id="0" code="121" glyph="90"/>
+ <symbol name="MUSICAL SYMBOL TRIANGLE NOTEHEAD UP BLACK" font-id="0" code="209" glyph="163"/>
+
+ <!-- There's only one Unicode point for each flag; I guess
+ you're expected to invert them yourself -->
+ <symbol name="MUSICAL SYMBOL COMBINING PARTIAL FLAG"
+ font-id="0" code="75" glyph="45" inversion-code="239" inversion-glyph="193"/>
+ <symbol name="MUSICAL SYMBOL COMBINING FLAG-1"
+ font-id="0" code="106" glyph="75" inversion-code="74" inversion-glyph="44"/>
+ <symbol name="MUSICAL SYMBOL COMBINING FLAG-2"
+ font-id="0" code="114" glyph="83" inversion-code="82" inversion-glyph="52"/>
+ <symbol name="MUSICAL SYMBOL MULTI REST" font-id="0" code="227" glyph="181"/>
+ <symbol name="MUSICAL SYMBOL WHOLE REST" font-id="0" code="238" glyph="192"/>
+ <symbol name="MUSICAL SYMBOL HALF REST" font-id="0" code="238" glyph="192"/>
+ <symbol name="MUSICAL SYMBOL QUARTER REST" font-id="0" code="206" glyph="160"/>
+ <symbol name="MUSICAL SYMBOL EIGHTH REST" font-id="0" code="228" glyph="182"/>
+ <symbol name="MUSICAL SYMBOL SIXTEENTH REST" font-id="0" code="197" glyph="153"/>
+ <symbol name="MUSICAL SYMBOL THIRTY-SECOND REST" font-id="0" code="168" glyph="124"/>
+ <symbol name="MUSICAL SYMBOL SIXTY-FOURTH REST" font-id="0" code="244" glyph="198"/>
+ <symbol name="MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH REST" font-id="0" code="229" glyph="183"/>
+
+ <symbol name="MUSICAL SYMBOL COMBINING AUGMENTATION DOT" font-id="0" code="46" glyph="17"/>
+
+ <symbol name="MUSICAL SYMBOL COMBINING ACCENT" font-id="0" code="62" glyph="33"/>
+ <symbol name="MUSICAL SYMBOL COMBINING TENUTO" font-id="0" code="45" glyph="16"/>
+ <symbol name="MUSICAL SYMBOL COMBINING STACCATO" font-id="0" code="46" glyph="17"/>
+ <symbol name="MUSICAL SYMBOL COMBINING STACCATISSIMO"
+ font-id="0" code="174" glyph="130" inversion-code="95" inversion-glyph="65"/>
+ <symbol name="MUSICAL SYMBOL COMBINING MARCATO"
+ font-id="0" code="94" glyph="64" inversion-code="118" inversion-glyph="87"/>
+ <symbol name="MUSICAL SYMBOL FERMATA"
+ font-id="0" code="85" glyph="55" inversion-code="117" inversion-glyph="86"/>
+<!--
+ <symbol name="MUSICAL SYMBOL TR" font-id="0" code="107" glyph="76"/>
+ <symbol name="MUSICAL SYMBOL TURN" font-id="0" code="106" glyph="75"/>
+-->
+ <symbol name="MUSICAL SYMBOL COMBINING UP BOW" font-id="0" code="178" glyph="134"/>
+ <symbol name="MUSICAL SYMBOL COMBINING DOWN BOW" font-id="0" code="179" glyph="135"/>
+ <!-- Unicode (and Lilypond) just have a single G clef, they
+ don't distinguish between alto and tenor. We'll have to
+ use the same clef with an offset. -->
+ <symbol name="MUSICAL SYMBOL C CLEF" font-id="0" code="66" glyph="37"/>
+ <symbol name="MUSICAL SYMBOL G CLEF" font-id="0" code="38" glyph="9"/>
+ <symbol name="MUSICAL SYMBOL F CLEF" font-id="0" code="63" glyph="34"/>
+
+ <symbol name="MUSICAL SYMBOL CUT TIME" font-id="0" glyph="38"/>
+ <symbol name="MUSICAL SYMBOL COMMON TIME" font-id="0" glyph="69"/>
+ <symbol name="DIGIT ZERO" font-id="0" code="48" glyph="19"/>
+ <symbol name="DIGIT ONE" font-id="0" code="49" glyph="20"/>
+ <symbol name="DIGIT TWO" font-id="0" code="50" glyph="21"/>
+ <symbol name="DIGIT THREE" font-id="0" code="51" glyph="22"/>
+ <symbol name="DIGIT FOUR" font-id="0" code="52" glyph="23"/>
+ <symbol name="DIGIT FIVE" font-id="0" code="53" glyph="24"/>
+ <symbol name="DIGIT SIX" font-id="0" code="54" glyph="25"/>
+ <symbol name="DIGIT SEVEN" font-id="0" code="55" glyph="26"/>
+ <symbol name="DIGIT EIGHT" font-id="0" code="56" glyph="27"/>
+ <symbol name="DIGIT NINE" font-id="0" code="57" glyph="28"/>
+</font-symbol-map>
+
+<font-hotspots>
+ <hotspot name="MUSIC FLAT SIGN">
+ <scaled y="0.74"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL DOUBLE FLAT">
+ <scaled y="0.74"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL C CLEF">
+ <scaled y="0.47"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL G CLEF">
+ <scaled y="0.64"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL F CLEF">
+ <scaled y="0.32"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL MULTI REST">
+ <scaled y="0"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL WHOLE REST">
+ <scaled y="0"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL HALF REST">
+ <scaled y="0.98"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL QUARTER REST">
+ <scaled y="0.5"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL EIGHTH REST">
+ <scaled y="0.4"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL SIXTEENTH REST">
+ <scaled y="0.28"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL THIRTY-SECOND REST">
+ <scaled y="0.45"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL SIXTY-FOURTH REST">
+ <scaled y="0.4"/>
+ </hotspot>
+</font-hotspots>
+
+</rosegarden-font-encoding>
diff --git a/data/fonts/mappings/opus.xml b/data/fonts/mappings/opus.xml
new file mode 100644
index 0000000..ba3a882
--- /dev/null
+++ b/data/fonts/mappings/opus.xml
@@ -0,0 +1,153 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE rosegarden-font-encoding>
+
+<rosegarden-font-encoding name="Opus">
+
+<!-- !!! check copyright -->
+<font-information
+ origin="Opus is part of Sibelius, but other fonts may use the same mappings."
+ copyright="Copyright Sibelius Software Ltd"
+ mapped-by="Chris Cannam"
+ type="scalable"
+ smooth="true"/>
+
+<font-requirements>
+ <font-requirement font-id="0" names="opus" strategy="prefer-glyphs"/>
+ <font-requirement font-id="1" names="opus text,georgia,times new roman,times,DEFAULT" strategy="prefer-codes"/> <!-- text font -->
+</font-requirements>
+
+<font-sizes>
+ <font-scale font-height="4.3" beam-thickness="0.5" staff-line-thickness="0.1" stem-thickness="0.1"/>
+</font-sizes>
+
+<font-symbol-map>
+ <!-- Symbol names are from the Unicode code charts: see
+ http://www.unicode.org/charts/PDF/U2600.pdf
+ http://www.unicode.org/charts/PDF/U1D100.pdf -->
+
+ <symbol name="__UNKNOWN__" font-id="1" code="63"/> <!-- question mark -->
+
+ <symbol name="MUSIC SHARP SIGN" font-id="0" code="35" glyph="3"/>
+ <symbol name="MUSIC NATURAL SIGN" font-id="0" code="110" glyph="45"/>
+ <symbol name="MUSIC FLAT SIGN" font-id="0" code="98" glyph="39"/>
+
+ <symbol name="MUSICAL SYMBOL DOUBLE SHARP" font-id="0" code="8249" glyph="69"/>
+ <symbol name="MUSICAL SYMBOL DOUBLE FLAT" font-id="0" code="8747" glyph="61"/>
+
+ <symbol name="MUSICAL SYMBOL BREVE" font-id="0" code="87" glyph="36"/>
+ <symbol name="MUSICAL SYMBOL WHOLE NOTE" font-id="0" code="119" glyph="51"/>
+ <symbol name="MUSICAL SYMBOL VOID NOTEHEAD" font-id="0" code="729" glyph="78"/>
+ <symbol name="MUSICAL SYMBOL NOTEHEAD BLACK" font-id="0" code="339" glyph="65"/>
+
+ <symbol name="MUSICAL SYMBOL X NOTEHEAD" font-id="0" code="192"/>
+
+<!-- <symbol name="MUSICAL SYMBOL CIRCLE X NOTEHEAD" font-id="0" code="85" glyph="35"/> -->
+ <symbol name="MUSICAL SYMBOL BREVIS" font-id="0" code="8250" glyph="70"/>
+ <symbol name="MUSICAL SYMBOL SEMIBREVIS WHITE" font-id="0" code="79" glyph="31"/>
+ <symbol name="MUSICAL SYMBOL SEMIBREVIS BLACK" font-id="0" code="8218" glyph="72"/>
+<!--
+ <symbol name="MUSICAL SYMBOL TRIANGLE NOTEHEAD UP WHITE" font-id="0" code="121"/>
+ <symbol name="MUSICAL SYMBOL TRIANGLE NOTEHEAD UP BLACK" font-id="0" code="209"/>
+-->
+ <!-- There's only one Unicode point for each flag; I guess
+ you're expected to invert them yourself -->
+ <symbol name="MUSICAL SYMBOL COMBINING PARTIAL FLAG"
+ font-id="0" code="75" glyph="29" inversion-code="212" inversion-glyph="76"/>
+ <symbol name="MUSICAL SYMBOL COMBINING PARTIAL FLAG FINAL"
+ font-id="0" code="106" glyph="43" inversion-code="74" inversion-glyph="28"/>
+ <symbol name="MUSICAL SYMBOL COMBINING FLAG-1"
+ font-id="0" code="106" glyph="43" inversion-code="74" inversion-glyph="28"/>
+ <symbol name="MUSICAL SYMBOL COMBINING FLAG-2"
+ font-id="0" code="114" glyph="48" inversion-code="82" inversion-glyph="33"/>
+<!--
+ <symbol name="MUSICAL SYMBOL MULTI REST" font-id="0" code=""/>
+-->
+ <symbol name="MUSICAL SYMBOL WHOLE REST" font-id="0" code="8721" glyph="60"/>
+ <symbol name="MUSICAL SYMBOL HALF REST" font-id="0" code="211" glyph="75"/>
+ <symbol name="MUSICAL SYMBOL QUARTER REST" font-id="0" code="338" glyph="64"/>
+ <symbol name="MUSICAL SYMBOL EIGHTH REST" font-id="0" code="8240" glyph="73"/>
+ <symbol name="MUSICAL SYMBOL SIXTEENTH REST" font-id="0" code="8776" glyph="63"/>
+ <symbol name="MUSICAL SYMBOL THIRTY-SECOND REST" font-id="0" code="174" glyph="55"/>
+ <symbol name="MUSICAL SYMBOL SIXTY-FOURTH REST" font-id="0" code="217" glyph="77"/>
+ <symbol name="MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH REST" font-id="0" code="194" glyph="74"/>
+
+ <symbol name="MUSICAL SYMBOL COMBINING AUGMENTATION DOT" font-id="0" code="46" glyph="11"/>
+
+ <symbol name="MUSICAL SYMBOL COMBINING ACCENT" font-id="0" code="62" glyph="22"/>
+ <symbol name="MUSICAL SYMBOL COMBINING TENUTO" font-id="0" code="45" glyph="10"/>
+ <symbol name="MUSICAL SYMBOL COMBINING STACCATO" font-id="0" code="46" glyph="11"/>
+ <symbol name="MUSICAL SYMBOL COMBINING STACCATISSIMO"
+ font-id="0" code="174" glyph="55" inversion-code="95"/>
+ <symbol name="MUSICAL SYMBOL COMBINING MARCATO"
+ font-id="0" code="94" glyph="38" inversion-code="118" inversion-glyph="50"/>
+ <symbol name="MUSICAL SYMBOL FERMATA"
+ font-id="0" code="85" glyph="35" inversion-code="117" inversion-glyph="49"/>
+ <symbol name="MUSICAL SYMBOL TR" font-id="0" code="376" glyph="68"/>
+<!--
+ <symbol name="MUSICAL SYMBOL TURN" font-id="0" code="106" glyph="43"/>
+-->
+ <symbol name="MUSICAL SYMBOL COMBINING UP BOW" font-id="0" code="8804" glyph="57"/>
+ <symbol name="MUSICAL SYMBOL COMBINING DOWN BOW" font-id="0" code="8805" glyph="58"/>
+ <!-- Unicode (and Lilypond) just have a single G clef, they
+ don't distinguish between alto and tenor. We'll have to
+ use the same clef with an offset. -->
+ <symbol name="MUSICAL SYMBOL C CLEF" font-id="0" code="66" glyph="24"/>
+ <symbol name="MUSICAL SYMBOL G CLEF" font-id="0" code="38" glyph="5"/>
+ <symbol name="MUSICAL SYMBOL F CLEF" font-id="0" code="63" glyph="23"/>
+
+ <symbol name="MUSICAL SYMBOL CUT TIME" font-id="0" glyph="25"/>
+ <symbol name="MUSICAL SYMBOL COMMON TIME" font-id="0" glyph="40"/>
+ <symbol name="DIGIT ZERO" font-id="0" code="48" glyph="13"/>
+ <symbol name="DIGIT ONE" font-id="0" code="49" glyph="79"/>
+ <symbol name="DIGIT TWO" font-id="0" code="50" glyph="14"/>
+ <symbol name="DIGIT THREE" font-id="0" code="51" glyph="15"/>
+ <symbol name="DIGIT FOUR" font-id="0" code="52" glyph="16"/>
+ <symbol name="DIGIT FIVE" font-id="0" code="53" glyph="17"/>
+ <symbol name="DIGIT SIX" font-id="0" code="54" glyph="18"/>
+ <symbol name="DIGIT SEVEN" font-id="0" code="55" glyph="19"/>
+ <symbol name="DIGIT EIGHT" font-id="0" code="56" glyph="20"/>
+ <symbol name="DIGIT NINE" font-id="0" code="57" glyph="21"/>
+</font-symbol-map>
+
+<font-hotspots>
+ <hotspot name="MUSIC FLAT SIGN">
+ <scaled y="0.74"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL DOUBLE FLAT">
+ <scaled y="0.74"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL C CLEF">
+ <scaled y="0.47"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL G CLEF">
+ <scaled y="0.64"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL F CLEF">
+ <scaled y="0.32"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL MULTI REST">
+ <scaled y="0"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL WHOLE REST">
+ <scaled y="0"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL HALF REST">
+ <scaled y="0.98"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL QUARTER REST">
+ <scaled y="0.5"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL EIGHTH REST">
+ <scaled y="0.4"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL SIXTEENTH REST">
+ <scaled y="0.28"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL THIRTY-SECOND REST">
+ <scaled y="0.45"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL SIXTY-FOURTH REST">
+ <scaled y="0.4"/>
+ </hotspot>
+</font-hotspots>
+</rosegarden-font-encoding>
diff --git a/data/fonts/mappings/petrucci.xml b/data/fonts/mappings/petrucci.xml
new file mode 100644
index 0000000..2cf0b58
--- /dev/null
+++ b/data/fonts/mappings/petrucci.xml
@@ -0,0 +1,158 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE rosegarden-font-encoding>
+
+<!-- The name here must match the filename in everything except case -->
+<rosegarden-font-encoding name="Petrucci">
+
+<!-- !!! check copyright -->
+<font-information
+ origin="Petrucci is part of Finale, but other fonts use the same mappings."
+ copyright="Copyright Coda Inc"
+ mapped-by="Chris Cannam"
+ type="scalable"
+ smooth="true"/>
+
+<font-requirements>
+ <font-requirement font-id="0" names="petrucci"/>
+ <font-requirement font-id="1" names="georgia,times new roman,times,DEFAULT"/> <!-- text font -->
+</font-requirements>
+
+<font-sizes>
+ <font-scale font-height="4.2" beam-thickness="0.5" staff-line-thickness="0.1" stem-thickness="0.1" />
+</font-sizes>
+
+<font-symbol-map>
+ <!-- Symbol names are from the Unicode code charts: see
+ http://www.unicode.org/charts/PDF/U2600.pdf
+ http://www.unicode.org/charts/PDF/U1D100.pdf -->
+
+ <codebase font-id="0" base="61440"/> <!-- Unicode private-use area -->
+
+ <symbol name="__UNKNOWN__" font-id="1" code="63"/> <!-- question mark -->
+
+ <symbol name="MUSIC SHARP SIGN" font-id="0" code="35" glyph="6"/>
+ <symbol name="MUSIC NATURAL SIGN" font-id="0" code="110" glyph="79"/>
+ <symbol name="MUSIC FLAT SIGN" font-id="0" code="98" glyph="68"/>
+
+ <symbol name="MUSICAL SYMBOL DOUBLE SHARP" font-id="0" code="220" glyph="156"/>
+ <symbol name="MUSICAL SYMBOL DOUBLE FLAT" font-id="0" code="186" glyph="125"/>
+
+ <symbol name="MUSICAL SYMBOL BREVE" font-id="0" code="87" glyph="57"/>
+ <symbol name="MUSICAL SYMBOL WHOLE NOTE" font-id="0" code="119" glyph="88"/>
+ <symbol name="MUSICAL SYMBOL VOID NOTEHEAD" font-id="0" code="250" glyph="186"/>
+ <symbol name="MUSICAL SYMBOL NOTEHEAD BLACK" font-id="0" code="207" glyph="143"/>
+
+ <symbol name="MUSICAL SYMBOL X NOTEHEAD" font-id="0" code="192" glyph="131"/>
+
+<!-- <symbol name="MUSICAL SYMBOL CIRCLE X NOTEHEAD" font-id="0" code="85" glyph="55"/> -->
+<!-- <symbol name="MUSICAL SYMBOL BREVIS" font-id="0" code="71" glyph="41"/> -->
+<!-- <symbol name="MUSICAL SYMBOL SEMIBREVIS WHITE" font-id="0" code=""/> -->
+<!--
+ <symbol name="MUSICAL SYMBOL SEMIBREVIS BLACK" font-id="0" code="noteheads-2mensural"/>
+-->
+ <symbol name="MUSICAL SYMBOL TRIANGLE NOTEHEAD UP WHITE" font-id="0" code="121" glyph="90"/>
+ <symbol name="MUSICAL SYMBOL TRIANGLE NOTEHEAD UP BLACK" font-id="0" code="209" glyph="145"/>
+
+ <!-- There's only one Unicode point for each flag; I guess
+ you're expected to invert them yourself -->
+ <symbol name="MUSICAL SYMBOL COMBINING PARTIAL FLAG"
+ font-id="0" code="75" glyph="45" inversion-code="239" inversion-glyph="175"/>
+ <symbol name="MUSICAL SYMBOL COMBINING FLAG-1"
+ font-id="0" code="106" glyph="75" inversion-code="74" inversion-glyph="44"/>
+ <symbol name="MUSICAL SYMBOL COMBINING FLAG-2"
+ font-id="0" code="114" glyph="83" inversion-code="82" inversion-glyph="52"/>
+<!--
+ <symbol name="MUSICAL SYMBOL MULTI REST" font-id="0" code="214" glyph="150"/>
+ <symbol name="MUSICAL SYMBOL WHOLE REST" font-id="0" code="227" glyph="163"/>
+ <symbol name="MUSICAL SYMBOL HALF REST" font-id="0" code="238" glyph="174"/>
+-->
+ <symbol name="MUSICAL SYMBOL MULTI REST" font-id="0" code="227" glyph="163"/>
+ <symbol name="MUSICAL SYMBOL WHOLE REST" font-id="0" code="238" glyph="174"/>
+ <symbol name="MUSICAL SYMBOL HALF REST" font-id="0" code="238" glyph="174"/>
+ <symbol name="MUSICAL SYMBOL QUARTER REST" font-id="0" code="206" glyph="142"/>
+ <symbol name="MUSICAL SYMBOL EIGHTH REST" font-id="0" code="228" glyph="164"/>
+ <symbol name="MUSICAL SYMBOL SIXTEENTH REST" font-id="0" code="197" glyph="136"/>
+ <symbol name="MUSICAL SYMBOL THIRTY-SECOND REST" font-id="0" code="168" glyph="108"/>
+ <symbol name="MUSICAL SYMBOL SIXTY-FOURTH REST" font-id="0" code="244" glyph="180"/>
+ <symbol name="MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH REST" font-id="0" code="229" glyph="165"/>
+
+ <symbol name="MUSICAL SYMBOL COMBINING AUGMENTATION DOT" font-id="0" code="46" glyph="17"/>
+
+ <symbol name="MUSICAL SYMBOL COMBINING ACCENT" font-id="0" code="62" glyph="33"/>
+ <symbol name="MUSICAL SYMBOL COMBINING TENUTO" font-id="0" code="45" glyph="16"/>
+ <symbol name="MUSICAL SYMBOL COMBINING STACCATO" font-id="0" code="46" glyph="17"/>
+ <symbol name="MUSICAL SYMBOL COMBINING STACCATISSIMO"
+ font-id="0" code="174" glyph="113" inversion-code="95" inversion-glyph="65"/>
+ <symbol name="MUSICAL SYMBOL COMBINING MARCATO"
+ font-id="0" code="94" glyph="64" inversion-code="118" inversion-glyph="87"/>
+ <symbol name="MUSICAL SYMBOL FERMATA"
+ font-id="0" code="85" glyph="55" inversion-code="117" inversion-glyph="86"/>
+<!--
+ <symbol name="MUSICAL SYMBOL TR" font-id="0" code="107" glyph="76"/>
+ <symbol name="MUSICAL SYMBOL TURN" font-id="0" code="106" glyph="75"/>
+-->
+ <symbol name="MUSICAL SYMBOL COMBINING UP BOW" font-id="0" code="178" glyph="117"/>
+ <symbol name="MUSICAL SYMBOL COMBINING DOWN BOW" font-id="0" code="179" glyph="118"/>
+ <!-- Unicode (and Lilypond) just have a single G clef, they
+ don't distinguish between alto and tenor. We'll have to
+ use the same clef with an offset. -->
+ <symbol name="MUSICAL SYMBOL C CLEF" font-id="0" code="66" glyph="37"/>
+ <symbol name="MUSICAL SYMBOL G CLEF" font-id="0" code="38" glyph="9"/>
+ <symbol name="MUSICAL SYMBOL F CLEF" font-id="0" code="63" glyph="34"/>
+
+ <symbol name="MUSICAL SYMBOL CUT TIME" font-id="0" glyph="38"/>
+ <symbol name="MUSICAL SYMBOL COMMON TIME" font-id="0" glyph="69"/>
+ <symbol name="DIGIT ZERO" font-id="0" code="48" glyph="19"/>
+ <symbol name="DIGIT ONE" font-id="0" code="49" glyph="20"/>
+ <symbol name="DIGIT TWO" font-id="0" code="50" glyph="21"/>
+ <symbol name="DIGIT THREE" font-id="0" code="51" glyph="22"/>
+ <symbol name="DIGIT FOUR" font-id="0" code="52" glyph="23"/>
+ <symbol name="DIGIT FIVE" font-id="0" code="53" glyph="24"/>
+ <symbol name="DIGIT SIX" font-id="0" code="54" glyph="25"/>
+ <symbol name="DIGIT SEVEN" font-id="0" code="55" glyph="26"/>
+ <symbol name="DIGIT EIGHT" font-id="0" code="56" glyph="27"/>
+ <symbol name="DIGIT NINE" font-id="0" code="57" glyph="28"/>
+</font-symbol-map>
+
+<font-hotspots>
+ <hotspot name="MUSIC FLAT SIGN">
+ <scaled y="0.74"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL DOUBLE FLAT">
+ <scaled y="0.74"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL C CLEF">
+ <scaled y="0.47"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL G CLEF">
+ <scaled y="0.64"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL F CLEF">
+ <scaled y="0.32"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL MULTI REST">
+ <scaled y="0"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL WHOLE REST">
+ <scaled y="0"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL HALF REST">
+ <scaled y="0.98"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL QUARTER REST">
+ <scaled y="0.5"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL EIGHTH REST">
+ <scaled y="0.4"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL SIXTEENTH REST">
+ <scaled y="0.28"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL THIRTY-SECOND REST">
+ <scaled y="0.45"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL SIXTY-FOURTH REST">
+ <scaled y="0.4"/>
+ </hotspot>
+</font-hotspots>
+</rosegarden-font-encoding>
diff --git a/data/fonts/mappings/rg21.xml b/data/fonts/mappings/rg21.xml
new file mode 100644
index 0000000..bf64bda
--- /dev/null
+++ b/data/fonts/mappings/rg21.xml
@@ -0,0 +1,102 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE rosegarden-font-encoding>
+
+<rosegarden-font-encoding name="RG21">
+
+<font-information
+ origin="Rosegarden 2.1"
+ copyright="Copyright (c) 1994--2001 Chris Cannam"
+ mapped-by="Chris Cannam"
+ type="pixmap"
+ smooth="false"/>
+
+<font-sizes>
+ <font-size note-height="4" staff-line-thickness="1" stem-thickness="1"/>
+ <font-size note-height="8" staff-line-thickness="1" stem-thickness="1"/>
+</font-sizes>
+
+<font-symbol-map>
+ <!-- Symbol names are from the Unicode code charts: see
+ http://www.unicode.org/charts/PDF/U2600.pdf
+ http://www.unicode.org/charts/PDF/U1D100.pdf -->
+
+ <symbol name="__UNKNOWN__" src="unknown"/>
+
+ <symbol name="MUSIC SHARP SIGN" src="notemod-sharp"/>
+ <symbol name="MUSIC NATURAL SIGN" src="notemod-natural"/>
+ <symbol name="MUSIC FLAT SIGN" src="notemod-flat"/>
+ <symbol name="MUSICAL SYMBOL DOUBLE SHARP" src="notemod-doublesharp"/>
+ <symbol name="MUSICAL SYMBOL DOUBLE FLAT" src="notemod-doubleflat"/>
+
+ <symbol name="MUSICAL SYMBOL BREVE" src="note-breve"/>
+ <symbol name="MUSICAL SYMBOL WHOLE NOTE" src="note-bodyempty"/>
+ <symbol name="MUSICAL SYMBOL VOID NOTEHEAD" src="note-bodyempty"/>
+ <symbol name="MUSICAL SYMBOL NOTEHEAD BLACK" src="note-bodyfilled"/>
+
+ <!-- There's only one Unicode point for each flag; I guess
+ you're expected to invert them yourself -->
+ <symbol name="MUSICAL SYMBOL COMBINING FLAG-1"
+ src="tail-down-1" inversion-src="tail-up-1"/>
+ <symbol name="MUSICAL SYMBOL COMBINING FLAG-2"
+ src="tail-down-2" inversion-src="tail-up-2"/>
+ <symbol name="MUSICAL SYMBOL COMBINING FLAG-3"
+ src="tail-down-3" inversion-src="tail-up-3"/>
+ <symbol name="MUSICAL SYMBOL COMBINING FLAG-4"
+ src="tail-down-4" inversion-src="tail-up-4"/>
+
+ <symbol name="MUSICAL SYMBOL MULTI REST" src="rest-breve"/>
+ <symbol name="MUSICAL SYMBOL WHOLE REST" src="rest-semibreve"/>
+ <symbol name="MUSICAL SYMBOL HALF REST" src="rest-minim"/>
+ <symbol name="MUSICAL SYMBOL QUARTER REST" src="rest-crotchet"/>
+ <symbol name="MUSICAL SYMBOL EIGHTH REST" src="rest-quaver"/>
+ <symbol name="MUSICAL SYMBOL SIXTEENTH REST" src="rest-semiquaver"/>
+ <symbol name="MUSICAL SYMBOL THIRTY-SECOND REST" src="rest-demisemi"/>
+ <symbol name="MUSICAL SYMBOL SIXTY-FOURTH REST" src="rest-hemidemisemi"/>
+
+ <symbol name="MUSICAL SYMBOL COMBINING AUGMENTATION DOT" src="dot"/>
+
+ <symbol name="MUSICAL SYMBOL COMBINING ACCENT" src="chordmod-accent"/>
+ <symbol name="MUSICAL SYMBOL COMBINING TENUTO" src="chordmod-legato"/>
+ <symbol name="MUSICAL SYMBOL COMBINING STACCATO" src="chordmod-dot"/>
+ <symbol name="MUSICAL SYMBOL FERMATA" src="chordmod-pause"/>
+ <symbol name="MUSICAL SYMBOL TR" src="chordmod-trill"/>
+ <symbol name="MUSICAL SYMBOL TURN" src="chordmod-turn"/>
+ <symbol name="MUSICAL SYMBOL COMBINING UP BOW" src="unknown"/>
+ <symbol name="MUSICAL SYMBOL COMBINING DOWN BOW" src="unknown"/>
+
+ <!-- Unicode (and Lilypond) just have a single C clef, they
+ don't distinguish between alto and tenor. We'd have to
+ use the same clef with an offset. -->
+ <symbol name="MUSICAL SYMBOL C CLEF" src="clef-alto"/>
+ <symbol name="MUSICAL SYMBOL G CLEF" src="clef-treble"/>
+ <symbol name="MUSICAL SYMBOL F CLEF" src="clef-bass"/>
+</font-symbol-map>
+
+<font-hotspots>
+ <hotspot name="MUSIC FLAT SIGN">
+ <when note-height="4" y="4"/>
+ <when note-height="8" y="9"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL C CLEF">
+ <when note-height="4" y="14"/>
+ <when note-height="8" y="26"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL G CLEF">
+ <when note-height="4" y="19"/>
+ <when note-height="8" y="35"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL F CLEF">
+ <when note-height="4" y="9"/>
+ <when note-height="8" y="17"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL MULTI REST">
+ <when note-height="4" y="5"/>
+ <when note-height="8" y="9"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL WHOLE REST">
+ <when note-height="4" y="5"/>
+ <when note-height="8" y="9"/>
+ </hotspot>
+</font-hotspots>
+
+</rosegarden-font-encoding>
diff --git a/data/fonts/mappings/sonata.xml b/data/fonts/mappings/sonata.xml
new file mode 100644
index 0000000..6a30fb6
--- /dev/null
+++ b/data/fonts/mappings/sonata.xml
@@ -0,0 +1,147 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE rosegarden-font-encoding>
+
+<rosegarden-font-encoding name="Sonata">
+
+<!-- !!! check copyright -->
+<font-information
+ origin="Adobe"
+ copyright="Copyright Adobe Inc"
+ mapped-by="Chris Cannam"
+ type="scalable"
+ smooth="true"/>
+
+<font-requirements>
+ <font-requirement font-id="0" names="sonata" strategy="prefer-glyphs"/>
+ <font-requirement font-id="1" names="georgia,times new roman,times,DEFAULT" strategy="prefer-codes"/> <!-- text font -->
+</font-requirements>
+
+<font-sizes>
+ <font-scale font-height="4.5" beam-thickness="0.5" staff-line-thickness="0.12" stem-thickness="0.14"/>
+</font-sizes>
+
+<font-symbol-map>
+ <!-- Symbol names are from the Unicode code charts: see
+ http://www.unicode.org/charts/PDF/U2600.pdf
+ http://www.unicode.org/charts/PDF/U1D100.pdf -->
+
+ <symbol name="__UNKNOWN__" font-id="1" code="63"/> <!-- question mark -->
+
+ <symbol name="MUSIC SHARP SIGN" font-id="0" glyph="3"/>
+ <symbol name="MUSIC NATURAL SIGN" font-id="0" glyph="76"/>
+ <symbol name="MUSIC FLAT SIGN" font-id="0" glyph="64"/>
+
+ <symbol name="MUSICAL SYMBOL DOUBLE SHARP" font-id="0" glyph="149"/>
+ <symbol name="MUSICAL SYMBOL DOUBLE FLAT" font-id="0" glyph="121"/>
+
+ <symbol name="MUSICAL SYMBOL BREVE" font-id="0" glyph="53"/>
+ <symbol name="MUSICAL SYMBOL WHOLE NOTE" font-id="0" glyph="85"/>
+ <symbol name="MUSICAL SYMBOL VOID NOTEHEAD" font-id="0" glyph="172"/>
+ <symbol name="MUSICAL SYMBOL NOTEHEAD BLACK" font-id="0" glyph="171"/>
+
+ <symbol name="MUSICAL SYMBOL X NOTEHEAD" font-id="0" glyph="127"/>
+
+<!-- <symbol name="MUSICAL SYMBOL CIRCLE X NOTEHEAD" font-id="0" code="85" glyph="35"/> -->
+<!--
+ <symbol name="MUSICAL SYMBOL BREVIS" font-id="0" code="8250" glyph="70"/>
+ <symbol name="MUSICAL SYMBOL SEMIBREVIS WHITE" font-id="0" code="79" glyph="31"/>
+ <symbol name="MUSICAL SYMBOL SEMIBREVIS BLACK" font-id="0" code="8218" glyph="72"/>
+-->
+<!--
+ <symbol name="MUSICAL SYMBOL TRIANGLE NOTEHEAD UP WHITE" font-id="0" code="121"/>
+ <symbol name="MUSICAL SYMBOL TRIANGLE NOTEHEAD UP BLACK" font-id="0" code="209"/>
+-->
+ <!-- There's only one Unicode point for each flag; I guess
+ you're expected to invert them yourself -->
+ <symbol name="MUSICAL SYMBOL COMBINING PARTIAL FLAG"
+ font-id="0" glyph="173" inversion-glyph="166"/>
+ <symbol name="MUSICAL SYMBOL COMBINING FLAG-1"
+ font-id="0" glyph="72" inversion-glyph="41"/>
+ <symbol name="MUSICAL SYMBOL COMBINING FLAG-2"
+ font-id="0" glyph="73" inversion-glyph="42"/>
+ <symbol name="MUSICAL SYMBOL MULTI REST" font-id="0" glyph="140"/>
+ <symbol name="MUSICAL SYMBOL WHOLE REST" font-id="0" glyph="118"/>
+ <symbol name="MUSICAL SYMBOL HALF REST" font-id="0" glyph="164"/>
+ <symbol name="MUSICAL SYMBOL QUARTER REST" font-id="0" glyph="138"/>
+ <symbol name="MUSICAL SYMBOL EIGHTH REST" font-id="0" glyph="156"/>
+ <symbol name="MUSICAL SYMBOL SIXTEENTH REST" font-id="0" glyph="132"/>
+ <symbol name="MUSICAL SYMBOL THIRTY-SECOND REST" font-id="0" glyph="105"/>
+ <symbol name="MUSICAL SYMBOL SIXTY-FOURTH REST" font-id="0" glyph="170"/>
+ <symbol name="MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH REST" font-id="0" glyph="157"/>
+
+ <symbol name="MUSICAL SYMBOL COMBINING AUGMENTATION DOT" font-id="0" glyph="14"/>
+
+ <symbol name="MUSICAL SYMBOL COMBINING ACCENT" font-id="0" glyph="29"/>
+ <symbol name="MUSICAL SYMBOL COMBINING TENUTO" font-id="0" glyph="13"/>
+ <symbol name="MUSICAL SYMBOL COMBINING STACCATO" font-id="0" glyph="14"/>
+ <symbol name="MUSICAL SYMBOL COMBINING STACCATISSIMO"
+ font-id="0" glyph="110"/>
+ <symbol name="MUSICAL SYMBOL COMBINING MARCATO"
+ font-id="0" glyph="50"/>
+ <symbol name="MUSICAL SYMBOL FERMATA"
+ font-id="0" glyph="51" inversion-glyph="83"/>
+ <symbol name="MUSICAL SYMBOL TR" font-id="0" glyph="62"/>
+ <symbol name="MUSICAL SYMBOL TURN" font-id="0" glyph="50"/>
+ <symbol name="MUSICAL SYMBOL COMBINING UP BOW" font-id="0" glyph="114"/>
+ <symbol name="MUSICAL SYMBOL COMBINING DOWN BOW" font-id="0" glyph="115"/>
+
+ <symbol name="MUSICAL SYMBOL C CLEF" font-id="0" glyph="33"/>
+ <symbol name="MUSICAL SYMBOL G CLEF" font-id="0" glyph="6"/>
+ <symbol name="MUSICAL SYMBOL F CLEF" font-id="0" glyph="30"/>
+
+ <symbol name="MUSICAL SYMBOL CUT TIME" font-id="0" glyph="34"/>
+ <symbol name="MUSICAL SYMBOL COMMON TIME" font-id="0" glyph="65"/>
+ <symbol name="DIGIT ZERO" font-id="0" code="48" glyph="16"/>
+ <symbol name="DIGIT ONE" font-id="0" code="49" glyph="17"/>
+ <symbol name="DIGIT TWO" font-id="0" code="50" glyph="18"/>
+ <symbol name="DIGIT THREE" font-id="0" code="51" glyph="19"/>
+ <symbol name="DIGIT FOUR" font-id="0" code="52" glyph="20"/>
+ <symbol name="DIGIT FIVE" font-id="0" code="53" glyph="21"/>
+ <symbol name="DIGIT SIX" font-id="0" code="54" glyph="22"/>
+ <symbol name="DIGIT SEVEN" font-id="0" code="55" glyph="23"/>
+ <symbol name="DIGIT EIGHT" font-id="0" code="56" glyph="24"/>
+ <symbol name="DIGIT NINE" font-id="0" code="57" glyph="25"/>
+</font-symbol-map>
+
+<font-hotspots>
+ <hotspot name="MUSIC FLAT SIGN">
+ <scaled y="0.74"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL DOUBLE FLAT">
+ <scaled y="0.74"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL C CLEF">
+ <scaled y="0.47"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL G CLEF">
+ <scaled y="0.64"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL F CLEF">
+ <scaled y="0.32"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL MULTI REST">
+ <scaled y="0"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL WHOLE REST">
+ <scaled y="0"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL HALF REST">
+ <scaled y="0.98"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL QUARTER REST">
+ <scaled y="0.5"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL EIGHTH REST">
+ <scaled y="0.4"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL SIXTEENTH REST">
+ <scaled y="0.28"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL THIRTY-SECOND REST">
+ <scaled y="0.45"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL SIXTY-FOURTH REST">
+ <scaled y="0.4"/>
+ </hotspot>
+</font-hotspots>
+</rosegarden-font-encoding>
diff --git a/data/fonts/mappings/steinberg.xml b/data/fonts/mappings/steinberg.xml
new file mode 100644
index 0000000..bc5defa
--- /dev/null
+++ b/data/fonts/mappings/steinberg.xml
@@ -0,0 +1,142 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE rosegarden-font-encoding>
+
+<rosegarden-font-encoding name="Steinberg">
+
+<!-- !!! check copyright -->
+<font-information
+ origin="The Steinberg Notation font is part of Cubase."
+ copyright="Copyright Steinberg Inc"
+ mapped-by="Chris Cannam"
+ type="scalable"
+ smooth="true"/>
+
+<font-requirements>
+ <font-requirement font-id="0" names="steinberg notation" strategy="prefer-codes"/>
+ <font-requirement font-id="1" names="georgia,times new roman,times,DEFAULT" strategy="prefer-codes"/> <!-- text font -->
+</font-requirements>
+
+<font-sizes>
+ <font-scale font-height="8.0" beam-thickness="0.5" staff-line-thickness="0.1" stem-thickness="0.1"/>
+</font-sizes>
+
+<font-symbol-map>
+ <!-- Symbol names are from the Unicode code charts: see
+ http://www.unicode.org/charts/PDF/U2600.pdf
+ http://www.unicode.org/charts/PDF/U1D100.pdf -->
+
+ <codebase font-id="0" base="61440"/> <!-- Unicode private-use area -->
+
+ <symbol name="__UNKNOWN__" font-id="1" code="63"/> <!-- question mark -->
+
+ <symbol name="MUSIC SHARP SIGN" font-id="0" code="36"/>
+ <symbol name="MUSIC NATURAL SIGN" font-id="0" code="38"/>
+ <symbol name="MUSIC FLAT SIGN" font-id="0" code="35"/>
+
+ <symbol name="MUSICAL SYMBOL DOUBLE SHARP" font-id="0" code="37"/>
+ <symbol name="MUSICAL SYMBOL DOUBLE FLAT" font-id="0" code="34"/>
+
+ <symbol name="MUSICAL SYMBOL BREVE" font-id="0" code="216"/>
+ <symbol name="MUSICAL SYMBOL WHOLE NOTE" font-id="0" code="39"/>
+ <symbol name="MUSICAL SYMBOL VOID NOTEHEAD" font-id="0" code="40"/>
+ <symbol name="MUSICAL SYMBOL NOTEHEAD BLACK" font-id="0" code="41"/>
+
+ <symbol name="MUSICAL SYMBOL X NOTEHEAD" font-id="0" code="109"/>
+
+ <symbol name="MUSICAL SYMBOL CIRCLE X NOTEHEAD" font-id="0" code="108"/>
+<!-- <symbol name="MUSICAL SYMBOL BREVIS" font-id="0" code="71"/> -->
+<!-- <symbol name="MUSICAL SYMBOL SEMIBREVIS WHITE" font-id="0" code=""/> -->
+<!--
+ <symbol name="MUSICAL SYMBOL SEMIBREVIS BLACK" font-id="0" code="noteheads-2mensural"/>
+-->
+ <symbol name="MUSICAL SYMBOL TRIANGLE NOTEHEAD UP WHITE" font-id="0" code="116"/>
+ <symbol name="MUSICAL SYMBOL TRIANGLE NOTEHEAD UP BLACK" font-id="0" code="115"/>
+
+ <!-- There's only one Unicode point for each flag; I guess
+ you're expected to invert them yourself -->
+ <symbol name="MUSICAL SYMBOL COMBINING FLAG-1"
+ font-id="0" code="50" inversion-code="55"/>
+ <symbol name="MUSICAL SYMBOL COMBINING FLAG-2"
+ font-id="0" code="51" inversion-code="56"/>
+ <symbol name="MUSICAL SYMBOL COMBINING FLAG-3"
+ font-id="0" code="52" inversion-code="57"/>
+ <symbol name="MUSICAL SYMBOL COMBINING FLAG-4"
+ font-id="0" code="53" inversion-code="58"/>
+
+<!-- <symbol name="MUSICAL SYMBOL MULTI REST" font-id="0" code="214"/> -->
+ <symbol name="MUSICAL SYMBOL WHOLE REST" font-id="0" code="42"/>
+ <symbol name="MUSICAL SYMBOL HALF REST" font-id="0" code="43"/>
+ <symbol name="MUSICAL SYMBOL QUARTER REST" font-id="0" code="44"/>
+ <symbol name="MUSICAL SYMBOL EIGHTH REST" font-id="0" code="45"/>
+ <symbol name="MUSICAL SYMBOL SIXTEENTH REST" font-id="0" code="46"/>
+ <symbol name="MUSICAL SYMBOL THIRTY-SECOND REST" font-id="0" code="47"/>
+ <symbol name="MUSICAL SYMBOL SIXTY-FOURTH REST" font-id="0" code="48"/>
+ <symbol name="MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH REST" font-id="0" code="49"/>
+
+ <symbol name="MUSICAL SYMBOL COMBINING AUGMENTATION DOT" font-id="0" code="106"/>
+
+ <symbol name="MUSICAL SYMBOL COMBINING ACCENT" font-id="0" code="91"/>
+ <symbol name="MUSICAL SYMBOL COMBINING TENUTO" font-id="0" code="73"/>
+ <symbol name="MUSICAL SYMBOL COMBINING STACCATO" font-id="0" code="106"/>
+ <symbol name="MUSICAL SYMBOL COMBINING STACCATISSIMO"
+ font-id="0" code="122"/>
+ <symbol name="MUSICAL SYMBOL COMBINING MARCATO"
+ font-id="0" code="90"/>
+ <symbol name="MUSICAL SYMBOL FERMATA"
+ font-id="0" code="93" inversion-code="75"/>
+ <symbol name="MUSICAL SYMBOL TR" font-id="0" code="101"/>
+ <symbol name="MUSICAL SYMBOL TURN" font-id="0" code="131"/>
+<!--
+ <symbol name="MUSICAL SYMBOL COMBINING UP BOW" font-id="0" code=""/>
+ <symbol name="MUSICAL SYMBOL COMBINING DOWN BOW" font-id="0" code=""/>
+-->
+ <!-- Unicode (and Lilypond) just have a single G clef, they
+ don't distinguish between alto and tenor. We'll have to
+ use the same clef with an offset. -->
+ <symbol name="MUSICAL SYMBOL C CLEF" font-id="0" code="220"/>
+ <symbol name="MUSICAL SYMBOL G CLEF" font-id="0" code="218"/>
+ <symbol name="MUSICAL SYMBOL F CLEF" font-id="0" code="219"/>
+</font-symbol-map>
+
+<font-hotspots>
+ <hotspot name="MUSIC FLAT SIGN">
+ <scaled y="0.74"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL DOUBLE FLAT">
+ <scaled y="0.74"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL C CLEF">
+ <scaled y="0.47"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL G CLEF">
+ <scaled y="0.64"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL F CLEF">
+ <scaled y="0.32"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL MULTI REST">
+ <scaled y="0"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL WHOLE REST">
+ <scaled y="0"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL HALF REST">
+ <scaled y="0.98"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL QUARTER REST">
+ <scaled y="0.5"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL EIGHTH REST">
+ <scaled y="0.4"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL SIXTEENTH REST">
+ <scaled y="0.28"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL THIRTY-SECOND REST">
+ <scaled y="0.45"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL SIXTY-FOURTH REST">
+ <scaled y="0.4"/>
+ </hotspot>
+</font-hotspots>
+</rosegarden-font-encoding>
diff --git a/data/fonts/mappings/xinfonia.xml b/data/fonts/mappings/xinfonia.xml
new file mode 100644
index 0000000..263f87a
--- /dev/null
+++ b/data/fonts/mappings/xinfonia.xml
@@ -0,0 +1,160 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE rosegarden-font-encoding>
+
+<!-- The name here must match the filename in everything except case -->
+<rosegarden-font-encoding name="Xinfonia">
+
+<!-- !!! check copyright -->
+<font-information
+ origin="xemo.org"
+ copyright="Copyright 2001-2003 Xemus Software LLC"
+ mapped-by="Chris Cannam"
+ type="scalable"
+ smooth="true"/>
+
+<font-requirements>
+ <font-requirement font-id="0" names="xinfonia" strategy="prefer-codes"/>
+ <font-requirement font-id="1" names="georgia,times new roman,times,DEFAULT" strategy="prefer-codes"/> <!-- text font -->
+</font-requirements>
+
+<font-sizes>
+ <font-scale font-height="4.2" beam-thickness="0.5" staff-line-thickness="0.1" stem-thickness="0.1"/>
+</font-sizes>
+
+<font-symbol-map>
+ <!-- Symbol names are from the Unicode code charts: see
+ http://www.unicode.org/charts/PDF/U2600.pdf
+ http://www.unicode.org/charts/PDF/U1D100.pdf -->
+
+ <!-- Xinfonia is a Unicode font, so the codes are the Unicode
+ code points expressed in decimal. -->
+
+ <codebase font-id="0" base="119040"/> <!-- Unicode musical symbols area -->
+
+ <symbol name="__UNKNOWN__" font-id="1" code="63"/> <!-- question mark -->
+
+ <symbol name="MUSIC SHARP SIGN" font-id="0" code="41" glyph="4"/>
+ <symbol name="MUSIC NATURAL SIGN" font-id="0" code="40" glyph="28"/>
+ <symbol name="MUSIC FLAT SIGN" font-id="0" code="39" glyph="24"/>
+
+ <symbol name="MUSICAL SYMBOL DOUBLE SHARP" font-id="0" code="42" glyph="39"/>
+ <symbol name="MUSICAL SYMBOL DOUBLE FLAT" font-id="0" code="43" glyph="35"/>
+
+ <symbol name="MUSICAL SYMBOL BREVE" font-id="0" code="92"/>
+ <symbol name="MUSICAL SYMBOL WHOLE NOTE" font-id="0" code="93" glyph="32"/>
+ <symbol name="MUSICAL SYMBOL VOID NOTEHEAD" font-id="0" code="87" glyph="43"/>
+ <symbol name="MUSICAL SYMBOL NOTEHEAD BLACK" font-id="0" code="88" glyph="38"/>
+
+ <symbol name="MUSICAL SYMBOL X NOTEHEAD" font-id="0" code="67"/>
+ <symbol name="MUSICAL SYMBOL CIRCLE X NOTEHEAD" font-id="0" code="69"/>
+
+<!--
+ <symbol name="MUSICAL SYMBOL BREVIS" font-id="0" code="184"/>
+ <symbol name="MUSICAL SYMBOL SEMIBREVIS WHITE" font-id="0" code="185"/>
+ <symbol name="MUSICAL SYMBOL SEMIBREVIS BLACK" font-id="0" code="186"/>
+ <symbol name="MUSICAL SYMBOL TRIANGLE NOTEHEAD UP WHITE" font-id="0" code="72"/>
+ <symbol name="MUSICAL SYMBOL TRIANGLE NOTEHEAD UP BLACK" font-id="0" code="73"/>
+-->
+ <!-- There's only one Unicode point for each flag; I guess
+ you're expected to invert them yourself -->
+
+ <symbol name="MUSICAL SYMBOL COMBINING PARTIAL FLAG"
+ font-id="0" glyph="21" inversion-glyph="42"/>
+ <symbol name="MUSICAL SYMBOL COMBINING FLAG-1" font-id="0" code="110" glyph="26" inversion-glyph="20"/>
+ <symbol name="MUSICAL SYMBOL COMBINING FLAG-2" font-id="0" code="111" glyph="30" inversion-glyph="22"/>
+<!--
+ <symbol name="MUSICAL SYMBOL COMBINING FLAG-3" font-id="0" code="112"/>
+ <symbol name="MUSICAL SYMBOL COMBINING FLAG-4" font-id="0" code="113"/>
+ <symbol name="MUSICAL SYMBOL COMBINING FLAG-5" font-id="0" code="114"/>
+-->
+
+<!--
+ <symbol name="MUSICAL SYMBOL MULTI REST" font-id="0" code="58"/>
+-->
+ <symbol name="MUSICAL SYMBOL WHOLE REST" font-id="0" code="59" glyph="34"/>
+ <symbol name="MUSICAL SYMBOL HALF REST" font-id="0" code="60" glyph="41"/>
+ <symbol name="MUSICAL SYMBOL QUARTER REST" font-id="0" code="61" glyph="37"/>
+ <symbol name="MUSICAL SYMBOL EIGHTH REST" font-id="0" code="62" glyph="40"/>
+ <symbol name="MUSICAL SYMBOL SIXTEENTH REST" font-id="0" code="63" glyph="36"/>
+ <symbol name="MUSICAL SYMBOL THIRTY-SECOND REST" font-id="0" code="64" glyph="33"/>
+ <symbol name="MUSICAL SYMBOL SIXTY-FOURTH REST" font-id="0" code="65"/>
+ <symbol name="MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH REST" font-id="0" code="66"/>
+
+ <symbol name="MUSICAL SYMBOL COMBINING AUGMENTATION DOT" font-id="0" code="109" glyph="27"/>
+
+ <symbol name="MUSICAL SYMBOL COMBINING ACCENT" font-id="0" code="123"/>
+ <symbol name="MUSICAL SYMBOL COMBINING TENUTO" font-id="0" code="125"/>
+ <symbol name="MUSICAL SYMBOL COMBINING STACCATO" font-id="0" code="124"/>
+ <symbol name="MUSICAL SYMBOL COMBINING STACCATISSIMO" font-id="0" code="126"/>
+ <symbol name="MUSICAL SYMBOL COMBINING MARCATO" font-id="0" code="127"/>
+ <symbol name="MUSICAL SYMBOL FERMATA"
+ font-id="0" code="16" inversion-code="17" glyph="23" inversion-glyph="31"/>
+
+ <symbol name="MUSICAL SYMBOL TR" font-id="0" code="150"/>
+ <symbol name="MUSICAL SYMBOL TURN" font-id="0" code="151"/>
+
+ <symbol name="MUSICAL SYMBOL COMBINING UP BOW" font-id="0" code="171"/>
+ <symbol name="MUSICAL SYMBOL COMBINING DOWN BOW" font-id="0" code="170"/>
+
+ <!-- Unicode (and Lilypond) just have a single G clef, they
+ don't distinguish between alto and tenor. We'll have to
+ use the same clef with an offset. -->
+ <symbol name="MUSICAL SYMBOL C CLEF" font-id="0" code="33" glyph="19"/>
+ <symbol name="MUSICAL SYMBOL G CLEF" font-id="0" code="30" glyph="5"/>
+ <symbol name="MUSICAL SYMBOL F CLEF" font-id="0" code="34" glyph="18"/>
+
+ <symbol name="DIGIT ZERO" font-id="0" code="48" glyph="7"/>
+ <symbol name="DIGIT ONE" font-id="0" code="49" glyph="8"/>
+ <symbol name="DIGIT TWO" font-id="0" code="50" glyph="9"/>
+ <symbol name="DIGIT THREE" font-id="0" code="51" glyph="10"/>
+ <symbol name="DIGIT FOUR" font-id="0" code="52" glyph="11"/>
+ <symbol name="DIGIT FIVE" font-id="0" code="53" glyph="12"/>
+ <symbol name="DIGIT SIX" font-id="0" code="54" glyph="13"/>
+ <symbol name="DIGIT SEVEN" font-id="0" code="55" glyph="14"/>
+ <symbol name="DIGIT EIGHT" font-id="0" code="56" glyph="15"/>
+ <symbol name="DIGIT NINE" font-id="0" code="57" glyph="16"/>
+
+</font-symbol-map>
+
+<font-hotspots>
+ <hotspot name="MUSIC FLAT SIGN">
+ <scaled y="0.74"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL DOUBLE FLAT">
+ <scaled y="0.74"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL C CLEF">
+ <scaled y="0.47"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL G CLEF">
+ <scaled y="0.64"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL F CLEF">
+ <scaled y="0.32"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL MULTI REST">
+ <scaled y="0"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL WHOLE REST">
+ <scaled y="0"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL HALF REST">
+ <scaled y="0.98"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL QUARTER REST">
+ <scaled y="0.5"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL EIGHTH REST">
+ <scaled y="0.4"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL SIXTEENTH REST">
+ <scaled y="0.28"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL THIRTY-SECOND REST">
+ <scaled y="0.45"/>
+ </hotspot>
+ <hotspot name="MUSICAL SYMBOL SIXTY-FOURTH REST">
+ <scaled y="0.4"/>
+ </hotspot>
+</font-hotspots>
+</rosegarden-font-encoding>
diff --git a/data/library/AccessVirus.rgd b/data/library/AccessVirus.rgd
new file mode 100644
index 0000000..d56f2da
--- /dev/null
+++ b/data/library/AccessVirus.rgd
Binary files differ
diff --git a/data/library/Alesis-QS6.rgd b/data/library/Alesis-QS6.rgd
new file mode 100644
index 0000000..4fc7755
--- /dev/null
+++ b/data/library/Alesis-QS6.rgd
Binary files differ
diff --git a/data/library/Alesis-QS7.rgd b/data/library/Alesis-QS7.rgd
new file mode 100644
index 0000000..e14676c
--- /dev/null
+++ b/data/library/Alesis-QS7.rgd
Binary files differ
diff --git a/data/library/Alesis-QS7_QS8.rgd b/data/library/Alesis-QS7_QS8.rgd
new file mode 100644
index 0000000..ef6ca88
--- /dev/null
+++ b/data/library/Alesis-QS7_QS8.rgd
Binary files differ
diff --git a/data/library/Alesis-S4Plus.rgd b/data/library/Alesis-S4Plus.rgd
new file mode 100644
index 0000000..0f0483a
--- /dev/null
+++ b/data/library/Alesis-S4Plus.rgd
Binary files differ
diff --git a/data/library/Alesis-SR16.rgd b/data/library/Alesis-SR16.rgd
new file mode 100644
index 0000000..de29876
--- /dev/null
+++ b/data/library/Alesis-SR16.rgd
Binary files differ
diff --git a/data/library/Behringer-V-Amp-Pro.rgd b/data/library/Behringer-V-Amp-Pro.rgd
new file mode 100644
index 0000000..2e4a82b
--- /dev/null
+++ b/data/library/Behringer-V-Amp-Pro.rgd
Binary files differ
diff --git a/data/library/Boss-DR-660.rgd b/data/library/Boss-DR-660.rgd
new file mode 100644
index 0000000..f9cb1f8
--- /dev/null
+++ b/data/library/Boss-DR-660.rgd
Binary files differ
diff --git a/data/library/Casio-MT-540.rgd b/data/library/Casio-MT-540.rgd
new file mode 100644
index 0000000..5a8a26f
--- /dev/null
+++ b/data/library/Casio-MT-540.rgd
Binary files differ
diff --git a/data/library/Casio-WK-3000.rgd b/data/library/Casio-WK-3000.rgd
new file mode 100644
index 0000000..0c5e40e
--- /dev/null
+++ b/data/library/Casio-WK-3000.rgd
Binary files differ
diff --git a/data/library/Chaos12m.rgd b/data/library/Chaos12m.rgd
new file mode 100644
index 0000000..1cff802
--- /dev/null
+++ b/data/library/Chaos12m.rgd
Binary files differ
diff --git a/data/library/Creative-SBLive8MB.rgd b/data/library/Creative-SBLive8MB.rgd
new file mode 100644
index 0000000..c6c5296
--- /dev/null
+++ b/data/library/Creative-SBLive8MB.rgd
Binary files differ
diff --git a/data/library/Emu-Proteus-2000.rgd b/data/library/Emu-Proteus-2000.rgd
new file mode 100644
index 0000000..ff28ef9
--- /dev/null
+++ b/data/library/Emu-Proteus-2000.rgd
Binary files differ
diff --git a/data/library/Emu-Proteus-FX.rgd b/data/library/Emu-Proteus-FX.rgd
new file mode 100644
index 0000000..93cfc00
--- /dev/null
+++ b/data/library/Emu-Proteus-FX.rgd
Binary files differ
diff --git a/data/library/Ensoniq-MR76.rgd b/data/library/Ensoniq-MR76.rgd
new file mode 100644
index 0000000..5f1e678
--- /dev/null
+++ b/data/library/Ensoniq-MR76.rgd
Binary files differ
diff --git a/data/library/GM.rgd b/data/library/GM.rgd
new file mode 100644
index 0000000..51a336e
--- /dev/null
+++ b/data/library/GM.rgd
Binary files differ
diff --git a/data/library/GM2.rgd b/data/library/GM2.rgd
new file mode 100644
index 0000000..c5fd077
--- /dev/null
+++ b/data/library/GM2.rgd
Binary files differ
diff --git a/data/library/GS.rgd b/data/library/GS.rgd
new file mode 100644
index 0000000..888ee71
--- /dev/null
+++ b/data/library/GS.rgd
Binary files differ
diff --git a/data/library/Hammond-XM1.rgd b/data/library/Hammond-XM1.rgd
new file mode 100644
index 0000000..ba331b9
--- /dev/null
+++ b/data/library/Hammond-XM1.rgd
Binary files differ
diff --git a/data/library/Juno-G.rgd b/data/library/Juno-G.rgd
new file mode 100644
index 0000000..c416011
--- /dev/null
+++ b/data/library/Juno-G.rgd
Binary files differ
diff --git a/data/library/Kawai-ES-3.rgd b/data/library/Kawai-ES-3.rgd
new file mode 100644
index 0000000..e186a25
--- /dev/null
+++ b/data/library/Kawai-ES-3.rgd
Binary files differ
diff --git a/data/library/Korg-03rw.rgd b/data/library/Korg-03rw.rgd
new file mode 100644
index 0000000..ca25999
--- /dev/null
+++ b/data/library/Korg-03rw.rgd
Binary files differ
diff --git a/data/library/Korg-KARMA.rgd b/data/library/Korg-KARMA.rgd
new file mode 100644
index 0000000..e13a8c8
--- /dev/null
+++ b/data/library/Korg-KARMA.rgd
Binary files differ
diff --git a/data/library/Korg-NS5R.rgd b/data/library/Korg-NS5R.rgd
new file mode 100644
index 0000000..a62c3ee
--- /dev/null
+++ b/data/library/Korg-NS5R.rgd
Binary files differ
diff --git a/data/library/Korg-Radias-Factory.rgd b/data/library/Korg-Radias-Factory.rgd
new file mode 100644
index 0000000..aee4c5a
--- /dev/null
+++ b/data/library/Korg-Radias-Factory.rgd
Binary files differ
diff --git a/data/library/Korg-Trinity-DRS.rgd b/data/library/Korg-Trinity-DRS.rgd
new file mode 100644
index 0000000..770796b
--- /dev/null
+++ b/data/library/Korg-Trinity-DRS.rgd
Binary files differ
diff --git a/data/library/Korg-Triton-Extreme-Combi.rgd b/data/library/Korg-Triton-Extreme-Combi.rgd
new file mode 100644
index 0000000..e9ace2d
--- /dev/null
+++ b/data/library/Korg-Triton-Extreme-Combi.rgd
Binary files differ
diff --git a/data/library/Korg-Triton-Extreme-Prog.rgd b/data/library/Korg-Triton-Extreme-Prog.rgd
new file mode 100644
index 0000000..07f12b3
--- /dev/null
+++ b/data/library/Korg-Triton-Extreme-Prog.rgd
Binary files differ
diff --git a/data/library/Korg-Wavestation.rgd b/data/library/Korg-Wavestation.rgd
new file mode 100644
index 0000000..6a36569
--- /dev/null
+++ b/data/library/Korg-Wavestation.rgd
Binary files differ
diff --git a/data/library/Korg-X3.rgd b/data/library/Korg-X3.rgd
new file mode 100644
index 0000000..8727ff7
--- /dev/null
+++ b/data/library/Korg-X3.rgd
Binary files differ
diff --git a/data/library/Korg-X50_GM.rgd b/data/library/Korg-X50_GM.rgd
new file mode 100644
index 0000000..2ffec58
--- /dev/null
+++ b/data/library/Korg-X50_GM.rgd
Binary files differ
diff --git a/data/library/Korg-X50_Korg.rgd b/data/library/Korg-X50_Korg.rgd
new file mode 100644
index 0000000..caba6ce
--- /dev/null
+++ b/data/library/Korg-X50_Korg.rgd
Binary files differ
diff --git a/data/library/Korg-microKORG.rgd b/data/library/Korg-microKORG.rgd
new file mode 100644
index 0000000..a0c4d7b
--- /dev/null
+++ b/data/library/Korg-microKORG.rgd
Binary files differ
diff --git a/data/library/Korg-microX.rgd b/data/library/Korg-microX.rgd
new file mode 100644
index 0000000..f984a4b
--- /dev/null
+++ b/data/library/Korg-microX.rgd
Binary files differ
diff --git a/data/library/Korg-x5dr.rgd b/data/library/Korg-x5dr.rgd
new file mode 100644
index 0000000..67f1000
--- /dev/null
+++ b/data/library/Korg-x5dr.rgd
Binary files differ
diff --git a/data/library/Kurzweil-ME1.rgd b/data/library/Kurzweil-ME1.rgd
new file mode 100644
index 0000000..97e0b56
--- /dev/null
+++ b/data/library/Kurzweil-ME1.rgd
Binary files differ
diff --git a/data/library/Lexicon-PCM-91-internal-presets.rgd b/data/library/Lexicon-PCM-91-internal-presets.rgd
new file mode 100644
index 0000000..79cb283
--- /dev/null
+++ b/data/library/Lexicon-PCM-91-internal-presets.rgd
Binary files differ
diff --git a/data/library/Line6-PodXTLive.rgd b/data/library/Line6-PodXTLive.rgd
new file mode 100644
index 0000000..14a7172
--- /dev/null
+++ b/data/library/Line6-PodXTLive.rgd
Binary files differ
diff --git a/data/library/Native-Instruments-B4.rgd b/data/library/Native-Instruments-B4.rgd
new file mode 100644
index 0000000..8bc7362
--- /dev/null
+++ b/data/library/Native-Instruments-B4.rgd
Binary files differ
diff --git a/data/library/Novation-A-Station.rgd b/data/library/Novation-A-Station.rgd
new file mode 100644
index 0000000..c977d86
--- /dev/null
+++ b/data/library/Novation-A-Station.rgd
Binary files differ
diff --git a/data/library/Novation-D-Station.rgd b/data/library/Novation-D-Station.rgd
new file mode 100644
index 0000000..fbf86d6
--- /dev/null
+++ b/data/library/Novation-D-Station.rgd
Binary files differ
diff --git a/data/library/Novation-KS-4-5-Rack.rgd b/data/library/Novation-KS-4-5-Rack.rgd
new file mode 100644
index 0000000..f0f9115
--- /dev/null
+++ b/data/library/Novation-KS-4-5-Rack.rgd
Binary files differ
diff --git a/data/library/Novation-XioSynth.rgd b/data/library/Novation-XioSynth.rgd
new file mode 100644
index 0000000..c430773
--- /dev/null
+++ b/data/library/Novation-XioSynth.rgd
Binary files differ
diff --git a/data/library/Oberheim-Matrix-1000.rgd b/data/library/Oberheim-Matrix-1000.rgd
new file mode 100644
index 0000000..bf62427
--- /dev/null
+++ b/data/library/Oberheim-Matrix-1000.rgd
Binary files differ
diff --git a/data/library/PC51f_sf2.rgd b/data/library/PC51f_sf2.rgd
new file mode 100644
index 0000000..669c4bf
--- /dev/null
+++ b/data/library/PC51f_sf2.rgd
Binary files differ
diff --git a/data/library/Peavey-Spectrum-Bass.rgd b/data/library/Peavey-Spectrum-Bass.rgd
new file mode 100644
index 0000000..b788fc2
--- /dev/null
+++ b/data/library/Peavey-Spectrum-Bass.rgd
Binary files differ
diff --git a/data/library/PodXTLive.rgd b/data/library/PodXTLive.rgd
new file mode 100644
index 0000000..5d4ea90
--- /dev/null
+++ b/data/library/PodXTLive.rgd
Binary files differ
diff --git a/data/library/Roland-D-50-v2.rgd b/data/library/Roland-D-50-v2.rgd
new file mode 100644
index 0000000..4fb4f40
--- /dev/null
+++ b/data/library/Roland-D-50-v2.rgd
Binary files differ
diff --git a/data/library/Roland-D-50.rgd b/data/library/Roland-D-50.rgd
new file mode 100644
index 0000000..4252977
--- /dev/null
+++ b/data/library/Roland-D-50.rgd
Binary files differ
diff --git a/data/library/Roland-E-09.rgd b/data/library/Roland-E-09.rgd
new file mode 100644
index 0000000..de26d8e
--- /dev/null
+++ b/data/library/Roland-E-09.rgd
Binary files differ
diff --git a/data/library/Roland-E-09_addons.rgd b/data/library/Roland-E-09_addons.rgd
new file mode 100644
index 0000000..f353808
--- /dev/null
+++ b/data/library/Roland-E-09_addons.rgd
Binary files differ
diff --git a/data/library/Roland-EM-20.rgd b/data/library/Roland-EM-20.rgd
new file mode 100644
index 0000000..bde3991
--- /dev/null
+++ b/data/library/Roland-EM-20.rgd
Binary files differ
diff --git a/data/library/Roland-Fantom-S.rgd b/data/library/Roland-Fantom-S.rgd
new file mode 100644
index 0000000..3c6ac8c
--- /dev/null
+++ b/data/library/Roland-Fantom-S.rgd
Binary files differ
diff --git a/data/library/Roland-Fantom-S88.rgd b/data/library/Roland-Fantom-S88.rgd
new file mode 100644
index 0000000..c2dc748
--- /dev/null
+++ b/data/library/Roland-Fantom-S88.rgd
Binary files differ
diff --git a/data/library/Roland-Fantom-X.rgd b/data/library/Roland-Fantom-X.rgd
new file mode 100644
index 0000000..fc6c123
--- /dev/null
+++ b/data/library/Roland-Fantom-X.rgd
Binary files differ
diff --git a/data/library/Roland-Fantom-XA.rgd b/data/library/Roland-Fantom-XA.rgd
new file mode 100644
index 0000000..873bf53
--- /dev/null
+++ b/data/library/Roland-Fantom-XA.rgd
Binary files differ
diff --git a/data/library/Roland-Fantom-XR-addon-SRX-02.rgd b/data/library/Roland-Fantom-XR-addon-SRX-02.rgd
new file mode 100644
index 0000000..8c7738d
--- /dev/null
+++ b/data/library/Roland-Fantom-XR-addon-SRX-02.rgd
Binary files differ
diff --git a/data/library/Roland-Fantom-XR-addon-SRX-06.rgd b/data/library/Roland-Fantom-XR-addon-SRX-06.rgd
new file mode 100644
index 0000000..2ee9f09
--- /dev/null
+++ b/data/library/Roland-Fantom-XR-addon-SRX-06.rgd
Binary files differ
diff --git a/data/library/Roland-Fantom-XR-addon-SRX-09.rgd b/data/library/Roland-Fantom-XR-addon-SRX-09.rgd
new file mode 100644
index 0000000..2dcdb8d
--- /dev/null
+++ b/data/library/Roland-Fantom-XR-addon-SRX-09.rgd
Binary files differ
diff --git a/data/library/Roland-Fantom-XR.rgd b/data/library/Roland-Fantom-XR.rgd
new file mode 100644
index 0000000..be9ed03
--- /dev/null
+++ b/data/library/Roland-Fantom-XR.rgd
Binary files differ
diff --git a/data/library/Roland-GR-30.rgd b/data/library/Roland-GR-30.rgd
new file mode 100644
index 0000000..489e3e9
--- /dev/null
+++ b/data/library/Roland-GR-30.rgd
Binary files differ
diff --git a/data/library/Roland-GR-33.rgd b/data/library/Roland-GR-33.rgd
new file mode 100644
index 0000000..b4e7064
--- /dev/null
+++ b/data/library/Roland-GR-33.rgd
Binary files differ
diff --git a/data/library/Roland-JD-800.rgd b/data/library/Roland-JD-800.rgd
new file mode 100644
index 0000000..5a555f0
--- /dev/null
+++ b/data/library/Roland-JD-800.rgd
Binary files differ
diff --git a/data/library/Roland-JV-1010.rgd b/data/library/Roland-JV-1010.rgd
new file mode 100644
index 0000000..741972f
--- /dev/null
+++ b/data/library/Roland-JV-1010.rgd
Binary files differ
diff --git a/data/library/Roland-JV-1080.rgd b/data/library/Roland-JV-1080.rgd
new file mode 100644
index 0000000..b0de98d
--- /dev/null
+++ b/data/library/Roland-JV-1080.rgd
Binary files differ
diff --git a/data/library/Roland-JV-2080.rgd b/data/library/Roland-JV-2080.rgd
new file mode 100644
index 0000000..addc028
--- /dev/null
+++ b/data/library/Roland-JV-2080.rgd
Binary files differ
diff --git a/data/library/Roland-JV-80.rgd b/data/library/Roland-JV-80.rgd
new file mode 100644
index 0000000..a3d2679
--- /dev/null
+++ b/data/library/Roland-JV-80.rgd
Binary files differ
diff --git a/data/library/Roland-JX-305.rgd b/data/library/Roland-JX-305.rgd
new file mode 100644
index 0000000..d0f5af7
--- /dev/null
+++ b/data/library/Roland-JX-305.rgd
Binary files differ
diff --git a/data/library/Roland-Juno106.rgd b/data/library/Roland-Juno106.rgd
new file mode 100644
index 0000000..acfc345
--- /dev/null
+++ b/data/library/Roland-Juno106.rgd
Binary files differ
diff --git a/data/library/Roland-KR-570.rgd b/data/library/Roland-KR-570.rgd
new file mode 100644
index 0000000..b9143c6
--- /dev/null
+++ b/data/library/Roland-KR-570.rgd
Binary files differ
diff --git a/data/library/Roland-MC-303.rgd b/data/library/Roland-MC-303.rgd
new file mode 100644
index 0000000..fc40d2f
--- /dev/null
+++ b/data/library/Roland-MC-303.rgd
Binary files differ
diff --git a/data/library/Roland-MVS-1.rgd b/data/library/Roland-MVS-1.rgd
new file mode 100644
index 0000000..1710405
--- /dev/null
+++ b/data/library/Roland-MVS-1.rgd
Binary files differ
diff --git a/data/library/Roland-RD-600.rgd b/data/library/Roland-RD-600.rgd
new file mode 100644
index 0000000..e8d271a
--- /dev/null
+++ b/data/library/Roland-RD-600.rgd
Binary files differ
diff --git a/data/library/Roland-RD-700SX.rgd b/data/library/Roland-RD-700SX.rgd
new file mode 100644
index 0000000..9605def
--- /dev/null
+++ b/data/library/Roland-RD-700SX.rgd
Binary files differ
diff --git a/data/library/Roland-RS-9.rgd b/data/library/Roland-RS-9.rgd
new file mode 100644
index 0000000..f74ef4e
--- /dev/null
+++ b/data/library/Roland-RS-9.rgd
Binary files differ
diff --git a/data/library/Roland-SC-33.rgd b/data/library/Roland-SC-33.rgd
new file mode 100644
index 0000000..d04fba9
--- /dev/null
+++ b/data/library/Roland-SC-33.rgd
Binary files differ
diff --git a/data/library/Roland-SC-88.rgd b/data/library/Roland-SC-88.rgd
new file mode 100644
index 0000000..158ece6
--- /dev/null
+++ b/data/library/Roland-SC-88.rgd
Binary files differ
diff --git a/data/library/Roland-SC-8820.rgd b/data/library/Roland-SC-8820.rgd
new file mode 100644
index 0000000..3c79d1b
--- /dev/null
+++ b/data/library/Roland-SC-8820.rgd
Binary files differ
diff --git a/data/library/Roland-SR-JV80-01.rgd b/data/library/Roland-SR-JV80-01.rgd
new file mode 100644
index 0000000..fa39539
--- /dev/null
+++ b/data/library/Roland-SR-JV80-01.rgd
Binary files differ
diff --git a/data/library/Roland-SR-JV80-02.rgd b/data/library/Roland-SR-JV80-02.rgd
new file mode 100644
index 0000000..38ae09e
--- /dev/null
+++ b/data/library/Roland-SR-JV80-02.rgd
Binary files differ
diff --git a/data/library/Roland-SR-JV80-03.rgd b/data/library/Roland-SR-JV80-03.rgd
new file mode 100644
index 0000000..0da6ab1
--- /dev/null
+++ b/data/library/Roland-SR-JV80-03.rgd
Binary files differ
diff --git a/data/library/Roland-SR-JV80-04.rgd b/data/library/Roland-SR-JV80-04.rgd
new file mode 100644
index 0000000..18ff29d
--- /dev/null
+++ b/data/library/Roland-SR-JV80-04.rgd
Binary files differ
diff --git a/data/library/Roland-SR-JV80-05.rgd b/data/library/Roland-SR-JV80-05.rgd
new file mode 100644
index 0000000..7fe565d
--- /dev/null
+++ b/data/library/Roland-SR-JV80-05.rgd
Binary files differ
diff --git a/data/library/Roland-SR-JV80-08.rgd b/data/library/Roland-SR-JV80-08.rgd
new file mode 100644
index 0000000..7a26124
--- /dev/null
+++ b/data/library/Roland-SR-JV80-08.rgd
Binary files differ
diff --git a/data/library/Roland-SR-JV80-09.rgd b/data/library/Roland-SR-JV80-09.rgd
new file mode 100644
index 0000000..a505167
--- /dev/null
+++ b/data/library/Roland-SR-JV80-09.rgd
Binary files differ
diff --git a/data/library/Roland-SR-JV80-11.rgd b/data/library/Roland-SR-JV80-11.rgd
new file mode 100644
index 0000000..017d6f5
--- /dev/null
+++ b/data/library/Roland-SR-JV80-11.rgd
Binary files differ
diff --git a/data/library/Roland-SR-JV80-14.rgd b/data/library/Roland-SR-JV80-14.rgd
new file mode 100644
index 0000000..f66fc9c
--- /dev/null
+++ b/data/library/Roland-SR-JV80-14.rgd
Binary files differ
diff --git a/data/library/Roland-SR-JV80-15.rgd b/data/library/Roland-SR-JV80-15.rgd
new file mode 100644
index 0000000..d12926b
--- /dev/null
+++ b/data/library/Roland-SR-JV80-15.rgd
Binary files differ
diff --git a/data/library/Roland-SR-JV80-17.rgd b/data/library/Roland-SR-JV80-17.rgd
new file mode 100644
index 0000000..5f7f5f8
--- /dev/null
+++ b/data/library/Roland-SR-JV80-17.rgd
Binary files differ
diff --git a/data/library/Roland-TD-8.rgd b/data/library/Roland-TD-8.rgd
new file mode 100644
index 0000000..8edd284
--- /dev/null
+++ b/data/library/Roland-TD-8.rgd
Binary files differ
diff --git a/data/library/Roland-XP30.rgd b/data/library/Roland-XP30.rgd
new file mode 100644
index 0000000..f27f8e8
--- /dev/null
+++ b/data/library/Roland-XP30.rgd
Binary files differ
diff --git a/data/library/Roland-XV-2020.rgd b/data/library/Roland-XV-2020.rgd
new file mode 100644
index 0000000..2baee30
--- /dev/null
+++ b/data/library/Roland-XV-2020.rgd
Binary files differ
diff --git a/data/library/Roland-XV-88.rgd b/data/library/Roland-XV-88.rgd
new file mode 100644
index 0000000..76e4ace
--- /dev/null
+++ b/data/library/Roland-XV-88.rgd
Binary files differ
diff --git a/data/library/Sirius.rgd b/data/library/Sirius.rgd
new file mode 100644
index 0000000..7d84b5b
--- /dev/null
+++ b/data/library/Sirius.rgd
Binary files differ
diff --git a/data/library/Technics-KN901.rgd b/data/library/Technics-KN901.rgd
new file mode 100644
index 0000000..131a9ef
--- /dev/null
+++ b/data/library/Technics-KN901.rgd
Binary files differ
diff --git a/data/library/XG-Rhythmn-Kits-and-Mappings.rgd b/data/library/XG-Rhythmn-Kits-and-Mappings.rgd
new file mode 100644
index 0000000..88423c8
--- /dev/null
+++ b/data/library/XG-Rhythmn-Kits-and-Mappings.rgd
Binary files differ
diff --git a/data/library/XG.rgd b/data/library/XG.rgd
new file mode 100644
index 0000000..4fdd7b0
--- /dev/null
+++ b/data/library/XG.rgd
Binary files differ
diff --git a/data/library/Yamaha-CS1x.rgd b/data/library/Yamaha-CS1x.rgd
new file mode 100644
index 0000000..4898700
--- /dev/null
+++ b/data/library/Yamaha-CS1x.rgd
Binary files differ
diff --git a/data/library/Yamaha-CS2x.rgd b/data/library/Yamaha-CS2x.rgd
new file mode 100644
index 0000000..83870a7
--- /dev/null
+++ b/data/library/Yamaha-CS2x.rgd
Binary files differ
diff --git a/data/library/Yamaha-DGX200.rgd b/data/library/Yamaha-DGX200.rgd
new file mode 100644
index 0000000..c6e2c0f
--- /dev/null
+++ b/data/library/Yamaha-DGX200.rgd
Binary files differ
diff --git a/data/library/Yamaha-DGX500-300.rgd b/data/library/Yamaha-DGX500-300.rgd
new file mode 100644
index 0000000..02f59ea
--- /dev/null
+++ b/data/library/Yamaha-DGX500-300.rgd
Binary files differ
diff --git a/data/library/Yamaha-DGX505-305.rgd b/data/library/Yamaha-DGX505-305.rgd
new file mode 100644
index 0000000..a8b0a2b
--- /dev/null
+++ b/data/library/Yamaha-DGX505-305.rgd
Binary files differ
diff --git a/data/library/Yamaha-DX200.rgd b/data/library/Yamaha-DX200.rgd
new file mode 100644
index 0000000..a26fa2f
--- /dev/null
+++ b/data/library/Yamaha-DX200.rgd
Binary files differ
diff --git a/data/library/Yamaha-MU90R.rgd b/data/library/Yamaha-MU90R.rgd
new file mode 100644
index 0000000..1767c1a
--- /dev/null
+++ b/data/library/Yamaha-MU90R.rgd
Binary files differ
diff --git a/data/library/Yamaha-Motif-6-7-8.rgd b/data/library/Yamaha-Motif-6-7-8.rgd
new file mode 100644
index 0000000..cc6aebf
--- /dev/null
+++ b/data/library/Yamaha-Motif-6-7-8.rgd
Binary files differ
diff --git a/data/library/Yamaha-Motif-ES.rgd b/data/library/Yamaha-Motif-ES.rgd
new file mode 100644
index 0000000..f1c7777
--- /dev/null
+++ b/data/library/Yamaha-Motif-ES.rgd
Binary files differ
diff --git a/data/library/Yamaha-Motif-Rack.rgd b/data/library/Yamaha-Motif-Rack.rgd
new file mode 100644
index 0000000..2304b2a
--- /dev/null
+++ b/data/library/Yamaha-Motif-Rack.rgd
Binary files differ
diff --git a/data/library/Yamaha-P60.rgd b/data/library/Yamaha-P60.rgd
new file mode 100644
index 0000000..a84c31e
--- /dev/null
+++ b/data/library/Yamaha-P60.rgd
Binary files differ
diff --git a/data/library/Yamaha-P90.rgd b/data/library/Yamaha-P90.rgd
new file mode 100644
index 0000000..639f0b8
--- /dev/null
+++ b/data/library/Yamaha-P90.rgd
Binary files differ
diff --git a/data/library/Yamaha-PSR-E403.rgd b/data/library/Yamaha-PSR-E403.rgd
new file mode 100644
index 0000000..550d1c8
--- /dev/null
+++ b/data/library/Yamaha-PSR-E403.rgd
Binary files differ
diff --git a/data/library/Yamaha-PSR270.rgd b/data/library/Yamaha-PSR270.rgd
new file mode 100644
index 0000000..68c008e
--- /dev/null
+++ b/data/library/Yamaha-PSR270.rgd
Binary files differ
diff --git a/data/library/Yamaha-PSR280.rgd b/data/library/Yamaha-PSR280.rgd
new file mode 100644
index 0000000..11666e6
--- /dev/null
+++ b/data/library/Yamaha-PSR280.rgd
Binary files differ
diff --git a/data/library/Yamaha-PSR290.rgd b/data/library/Yamaha-PSR290.rgd
new file mode 100644
index 0000000..cb4ba5e
--- /dev/null
+++ b/data/library/Yamaha-PSR290.rgd
Binary files differ
diff --git a/data/library/Yamaha-PSR403.rgd b/data/library/Yamaha-PSR403.rgd
new file mode 100644
index 0000000..a8a615b
--- /dev/null
+++ b/data/library/Yamaha-PSR403.rgd
Binary files differ
diff --git a/data/library/Yamaha-PSR550.rgd b/data/library/Yamaha-PSR550.rgd
new file mode 100644
index 0000000..22ef25e
--- /dev/null
+++ b/data/library/Yamaha-PSR550.rgd
Binary files differ
diff --git a/data/library/Yamaha-QY70.rgd b/data/library/Yamaha-QY70.rgd
new file mode 100644
index 0000000..71b49ef
--- /dev/null
+++ b/data/library/Yamaha-QY70.rgd
Binary files differ
diff --git a/data/library/Yamaha-RM1X.rgd b/data/library/Yamaha-RM1X.rgd
new file mode 100644
index 0000000..0cc7175
--- /dev/null
+++ b/data/library/Yamaha-RM1X.rgd
Binary files differ
diff --git a/data/library/Yamaha-S08.rgd b/data/library/Yamaha-S08.rgd
new file mode 100644
index 0000000..b03d8a0
--- /dev/null
+++ b/data/library/Yamaha-S08.rgd
Binary files differ
diff --git a/data/library/Yamaha-S80.rgd b/data/library/Yamaha-S80.rgd
new file mode 100644
index 0000000..829737b
--- /dev/null
+++ b/data/library/Yamaha-S80.rgd
Binary files differ
diff --git a/data/library/Yamaha-S90.rgd b/data/library/Yamaha-S90.rgd
new file mode 100644
index 0000000..f914c98
--- /dev/null
+++ b/data/library/Yamaha-S90.rgd
Binary files differ
diff --git a/data/library/Yamaha-TG500-mlt.rgd b/data/library/Yamaha-TG500-mlt.rgd
new file mode 100644
index 0000000..cd6b0fc
--- /dev/null
+++ b/data/library/Yamaha-TG500-mlt.rgd
Binary files differ
diff --git a/data/library/Yamaha-VL70-m.rgd b/data/library/Yamaha-VL70-m.rgd
new file mode 100644
index 0000000..6c91a33
--- /dev/null
+++ b/data/library/Yamaha-VL70-m.rgd
Binary files differ
diff --git a/data/library/Zoom-RT-323.rgd b/data/library/Zoom-RT-323.rgd
new file mode 100644
index 0000000..b315028
--- /dev/null
+++ b/data/library/Zoom-RT-323.rgd
Binary files differ
diff --git a/data/library/all-numbers.rgd b/data/library/all-numbers.rgd
new file mode 100644
index 0000000..e3ce837
--- /dev/null
+++ b/data/library/all-numbers.rgd
Binary files differ
diff --git a/data/library/raw-numbers.rgd b/data/library/raw-numbers.rgd
new file mode 100644
index 0000000..4e26f29
--- /dev/null
+++ b/data/library/raw-numbers.rgd
Binary files differ
diff --git a/data/pixmaps/feta/10/accidentals-(.xpm b/data/pixmaps/feta/10/accidentals-(.xpm
new file mode 100644
index 0000000..4685843
--- /dev/null
+++ b/data/pixmaps/feta/10/accidentals-(.xpm
@@ -0,0 +1,35 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"6 22 7 1",
+" c #020202",
+". c Gray22",
+"X c Gray47",
+"o c Gray53",
+"O c #b4b4b4",
+"+ c #c3c3c3",
+"@ c None",
+/* pixels */
+"@@@@@@",
+"@@@@OO",
+"@@@@ O",
+"@@@X.@",
+"@@@ X@",
+"@@o @@",
+"@@. @@",
+"@@ X@@",
+"@+ X@@",
+"@o o@@",
+"@o o@@",
+"@o o@@",
+"@o o@@",
+"@o o@@",
+"@+ o@@",
+"@@ X@@",
+"@@. @@",
+"@@X @@",
+"@@@ X@",
+"@@@X.@",
+"@@@@ O",
+"@@@@OO"
+};
diff --git a/data/pixmaps/feta/10/accidentals-).xpm b/data/pixmaps/feta/10/accidentals-).xpm
new file mode 100644
index 0000000..2941718
--- /dev/null
+++ b/data/pixmaps/feta/10/accidentals-).xpm
@@ -0,0 +1,35 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"6 22 7 1",
+" c #020202",
+". c Gray22",
+"X c Gray47",
+"o c Gray53",
+"O c #b4b4b4",
+"+ c #c3c3c3",
+"@ c None",
+/* pixels */
+"@@@@@@",
+"@OO@@@",
+"@O @@@",
+"@@.X@@",
+"@@X @@",
+"@@@ X@",
+"@@@ .@",
+"@@@X @",
+"@@@o +",
+"@@@o o",
+"@@@o o",
+"@@@o o",
+"@@@o o",
+"@@@o o",
+"@@@o +",
+"@@@X @",
+"@@@ .@",
+"@@@ X@",
+"@@o @@",
+"@@.X@@",
+"@O @@@",
+"@OO@@@"
+};
diff --git a/data/pixmaps/feta/10/accidentals--1.xpm b/data/pixmaps/feta/10/accidentals--1.xpm
new file mode 100644
index 0000000..b92d8e3
--- /dev/null
+++ b/data/pixmaps/feta/10/accidentals--1.xpm
@@ -0,0 +1,41 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"10 27 8 1",
+" c #040404",
+". c Gray15",
+"X c #535353",
+"o c Gray44",
+"O c #848484",
+"+ c Gray68",
+"@ c #d5d5d5",
+"# c None",
+/* pixels */
+"##########",
+"#@o@######",
+"#o +######",
+"#O +######",
+"#O +######",
+"#O +######",
+"#O +######",
+"#O +######",
+"#O +######",
+"#o +######",
+"#O +######",
+"#O +######",
+"#O +######",
+"#O +######",
+"#@ @#@+@##",
+"#@.@. o#",
+"#@ @",
+"## X@+ O",
+"#@ @##+ o",
+"#@.###+ @",
+"#@.###O X#",
+"#@.###. @#",
+"#@.##. @##",
+"#@.#.o####",
+"#@ o#####",
+"## X######",
+"##+#######"
+};
diff --git a/data/pixmaps/feta/10/accidentals--2.xpm b/data/pixmaps/feta/10/accidentals--2.xpm
new file mode 100644
index 0000000..5a93569
--- /dev/null
+++ b/data/pixmaps/feta/10/accidentals--2.xpm
@@ -0,0 +1,41 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"17 27 8 1",
+" c #040404",
+". c #353535",
+"X c #585858",
+"o c Gray47",
+"O c #898989",
+"+ c #b2b2b2",
+"@ c #cecece",
+"# c None",
+/* pixels */
+"#################",
+"#@o@###@o@#######",
+"#O O###o O#######",
+"#O O#### o#######",
+"#O O#### o#######",
+"#O O#### o#######",
+"#O O#### o#######",
+"#O O#### o#######",
+"#O o#### o#######",
+"#O O#### o#######",
+"#O O#### o#######",
+"#O o#### o#######",
+"#O O#### o#######",
+"#O O#### o#######",
+"#@ @#+++ o#@++@##",
+"##.@X XX. O#",
+"## @",
+"## .@@O .@@O O",
+"## O### o###o O",
+"## #### o###o +",
+"## ###O o###X .#",
+"## ##@ O o##@ .##",
+"## #@ +# o#+ X###",
+"##.+ O## oo +####",
+"## +### .######",
+"## .#### .#######",
+"##+#####++#######"
+};
diff --git a/data/pixmaps/feta/10/accidentals-0.xpm b/data/pixmaps/feta/10/accidentals-0.xpm
new file mode 100644
index 0000000..4e9fed9
--- /dev/null
+++ b/data/pixmaps/feta/10/accidentals-0.xpm
@@ -0,0 +1,45 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"8 31 8 1",
+" c #040404",
+". c Gray19",
+"X c #5f5f5f",
+"o c #6f6f6f",
+"O c #888888",
+"+ c #b9b9b9",
+"@ c #c8c8c8",
+"# c None",
+/* pixels */
+"########",
+"#+@#####",
+"#oO#####",
+"#oO#####",
+"#oO#####",
+"#XO#####",
+"#oO#####",
+"#oO#####",
+"#ooOo. O",
+"#o O",
+"#o o",
+"#O o",
+"#o XO.o",
+"#oO###OX",
+"#oO###Oo",
+"#oO###Oo",
+"#oO###Oo",
+"#XO###OX",
+"#oO###OX",
+"#o.OX o",
+"#O o",
+"#o o",
+"#o o",
+"#O .OOoo",
+"######OX",
+"######Oo",
+"######Oo",
+"######OX",
+"######Oo",
+"######Oo",
+"######@+"
+};
diff --git a/data/pixmaps/feta/10/accidentals-1.xpm b/data/pixmaps/feta/10/accidentals-1.xpm
new file mode 100644
index 0000000..4cb1349
--- /dev/null
+++ b/data/pixmaps/feta/10/accidentals-1.xpm
@@ -0,0 +1,45 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"12 32 7 1",
+" c Gray1",
+". c #2d2d2d",
+"X c Gray50",
+"o c #898989",
+"O c #a0a0a0",
+"+ c #cbcbcb",
+"@ c None",
+/* pixels */
+"@@@@@@@@@@@@",
+"@@@@@@@@o@@@",
+"@@@@@@@@.+@@",
+"@@@+.@@@.+@@",
+"@@@+.@@@.+@@",
+"@@@+.@@@.+@@",
+"@@@+.@@@.+@@",
+"@@@+.@@@.+@@",
+"@@@+.@@@.. o",
+"@@@+.@O. o",
+"@@@+ X",
+"@+. .+",
+"@X +@@",
+"@o .O@.+@@",
+"@o ..@@@.+@@",
+"@@@+.@@@.+@@",
+"@@@+.@@@.+@@",
+"@@@+.@@@.+@@",
+"@@@+.@@@.. o",
+"@@@+.@O. o",
+"@@@+ X",
+"@+. .+",
+"@X +@@",
+"@X .O@.+@@",
+"@o ..@@@.+@@",
+"@@@+.@@@.+@@",
+"@@@+.@@@.+@@",
+"@@@+.@@@.+@@",
+"@@@+.@@@.+@@",
+"@@@+.@@@.+@@",
+"@@@+.@@@@@@@",
+"@@@@O@@@@@@@"
+};
diff --git a/data/pixmaps/feta/10/accidentals-2.xpm b/data/pixmaps/feta/10/accidentals-2.xpm
new file mode 100644
index 0000000..a2c422f
--- /dev/null
+++ b/data/pixmaps/feta/10/accidentals-2.xpm
@@ -0,0 +1,25 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"12 12 7 1",
+" c #070707",
+". c Gray27",
+"X c #7b7b7b",
+"o c #888888",
+"O c #bebebe",
+"+ c Gray79",
+"@ c None",
+/* pixels */
+"@@@@@@@@@@@@",
+"@+oo+@@@Ooo+",
+"@o @@@ o",
+"@o o@X o",
+"@@ .@. @",
+"@@@o. X .o@@",
+"@@@@@X X@@@@",
+"@@@o. X .o@@",
+"@@ .@. @",
+"@o X@o o",
+"@o @@@ o",
+"@+XoO@@@OoX+"
+};
diff --git a/data/pixmaps/feta/10/accordion-accBB.xpm b/data/pixmaps/feta/10/accordion-accBB.xpm
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/pixmaps/feta/10/accordion-accBB.xpm
diff --git a/data/pixmaps/feta/10/accordion-accBayanbase.xpm b/data/pixmaps/feta/10/accordion-accBayanbase.xpm
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/pixmaps/feta/10/accordion-accBayanbase.xpm
diff --git a/data/pixmaps/feta/10/accordion-accDiscant.xpm b/data/pixmaps/feta/10/accordion-accDiscant.xpm
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/pixmaps/feta/10/accordion-accDiscant.xpm
diff --git a/data/pixmaps/feta/10/accordion-accDot.xpm b/data/pixmaps/feta/10/accordion-accDot.xpm
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/pixmaps/feta/10/accordion-accDot.xpm
diff --git a/data/pixmaps/feta/10/accordion-accFreebase.xpm b/data/pixmaps/feta/10/accordion-accFreebase.xpm
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/pixmaps/feta/10/accordion-accFreebase.xpm
diff --git a/data/pixmaps/feta/10/accordion-accOldEE.xpm b/data/pixmaps/feta/10/accordion-accOldEE.xpm
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/pixmaps/feta/10/accordion-accOldEE.xpm
diff --git a/data/pixmaps/feta/10/accordion-accOldEES.xpm b/data/pixmaps/feta/10/accordion-accOldEES.xpm
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/pixmaps/feta/10/accordion-accOldEES.xpm
diff --git a/data/pixmaps/feta/10/accordion-accSB.xpm b/data/pixmaps/feta/10/accordion-accSB.xpm
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/pixmaps/feta/10/accordion-accSB.xpm
diff --git a/data/pixmaps/feta/10/accordion-accStdbase.xpm b/data/pixmaps/feta/10/accordion-accStdbase.xpm
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/pixmaps/feta/10/accordion-accStdbase.xpm
diff --git a/data/pixmaps/feta/10/clefs-C.xpm b/data/pixmaps/feta/10/clefs-C.xpm
new file mode 100644
index 0000000..62c9429
--- /dev/null
+++ b/data/pixmaps/feta/10/clefs-C.xpm
@@ -0,0 +1,54 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"28 40 8 1",
+" c Gray1",
+". c #323232",
+"X c Gray30",
+"o c Gray48",
+"O c #898989",
+"+ c Gray69",
+"@ c Gray82",
+"# c None",
+/* pixels */
+"############################",
+"#################oOO########",
+"#O #O ####+. o#####",
+"#O #o ###X +##OX +###",
+"#O #O ##o O#####X +##",
+"#O #o #@ .#####@ ##",
+"#O #O #O +#### o#",
+"#O #o #O o####X #",
+"#O #O #@ @####o +",
+"#O #o ##o o#####o O",
+"#O #o ###@O@######o O",
+"#O #o ###@########o O",
+"#O #o ### +#######o O",
+"#O #o ##@ X#######O #",
+"#O #O ##o #######. X#",
+"#O #o ##o +#####@ .@#",
+"#O #o ## .@####o @##",
+"#O #o #+ O@@X .@###",
+"#O #o @. .++.. .X+#####",
+"#O #o . o###@++@#######",
+"#O #O o##############",
+"#O #O O##############",
+"#O #o o X##@o .o@######",
+"#O #o #o .. .X. .+####",
+"#O #O #@ O###@. o###",
+"#O #o ##. o#####+ o##",
+"#O #o ##o @######. O#",
+"#O #o ##+ .#######o .#",
+"#O #o ### O#######o @",
+"#O #o ###o@#######O O",
+"#O #o ############o O",
+"#O #o ##@X X@#####o O",
+"#O #O ## #####o +",
+"#O #o #O O####X #",
+"#O #o #O o#### o#",
+"#O #O #+ o####@ @#",
+"#O #o ##X o#####X +##",
+"#O #O ##+ X###+X +###",
+"#O #o ###+. . o#####",
+"#@oOOOO#+O#####+oooO########"
+};
diff --git a/data/pixmaps/feta/10/clefs-C_change.xpm b/data/pixmaps/feta/10/clefs-C_change.xpm
new file mode 100644
index 0000000..87d232a
--- /dev/null
+++ b/data/pixmaps/feta/10/clefs-C_change.xpm
@@ -0,0 +1,46 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"23 32 8 1",
+" c #040404",
+". c Gray19",
+"X c Gray29",
+"o c Gray46",
+"O c #888888",
+"+ c #afafaf",
+"@ c #cdcdcd",
+"# c None",
+/* pixels */
+"#######################",
+"#############+oOO######",
+"#O O# O##+. .+###",
+"#O O# o#+ X###@ +##",
+"#O O# O# X####o +#",
+"#O o# O+ X###O .#",
+"#O O# OO #### #",
+"#O O# O@ o#### O",
+"#O O# o#@++##### O",
+"#O o# o#++###### O",
+"#O O# o#o ###### +",
+"#O O# o#o #####@ .#",
+"#O O# o#. +####o O#",
+"#O O# O# .+###. o##",
+"#O o# OO . .X. O###",
+"#O O# o##o .+@####",
+"#O O# o###########",
+"#O O# o##@+@######",
+"#O O# XX .@o .o####",
+"#O o# O+ .@@O @##",
+"#O O# O# o####o @#",
+"#O o# o#o @####+ X#",
+"#O O# o#o ###### @",
+"#O O# o#o.###### O",
+"#O O# o######### O",
+"#O O# o#o .@#### O",
+"#O O# O+ #### #",
+"#O O# OO ###+ .#",
+"#O o# O@ +###o +#",
+"#O O# O#X o###@ +##",
+"#O O# o##X X .+###",
+"#@oOo@#o+###+oOoO######"
+};
diff --git a/data/pixmaps/feta/10/clefs-F.xpm b/data/pixmaps/feta/10/clefs-F.xpm
new file mode 100644
index 0000000..ed645b4
--- /dev/null
+++ b/data/pixmaps/feta/10/clefs-F.xpm
@@ -0,0 +1,47 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"29 33 8 1",
+" c #040404",
+". c Gray19",
+"X c #535353",
+"o c #747474",
+"O c #8e8e8e",
+"+ c #acacac",
+"@ c Gray81",
+"# c None",
+/* pixels */
+"#############################",
+"##########ooooo##############",
+"#######+. .ooo o@##########",
+"######X .@#####X +#########",
+"#####. X########X +####+o##",
+"####o .#########@ +##o .#",
+"###@ o##########o .## @",
+"###o X########@ +#X #",
+"###. .######## o#@X.@#",
+"### o#######X .######",
+"### #######O ######",
+"### #######o ######",
+"###X .#######o ######",
+"###@. O#######o ##@@##",
+"####@. O########o X#+ O#",
+"######++@######### O#. @",
+"#################@ @#. @",
+"#################o .##+ O#",
+"#################. O###@@##",
+"################o .########",
+"###############@ .@########",
+"###############. +#########",
+"##############o O##########",
+"#############o O###########",
+"############o O############",
+"##########@X .@#############",
+"#########@ X###############",
+"########+ .+################",
+"######@X +##################",
+"#####X o@###################",
+"###o o######################",
+"#@..o@#######################",
+"#++##########################"
+};
diff --git a/data/pixmaps/feta/10/clefs-F_change.xpm b/data/pixmaps/feta/10/clefs-F_change.xpm
new file mode 100644
index 0000000..2e5491b
--- /dev/null
+++ b/data/pixmaps/feta/10/clefs-F_change.xpm
@@ -0,0 +1,41 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"24 27 8 1",
+" c Gray2",
+". c #393939",
+"X c #4b4b4b",
+"o c #767676",
+"O c #868686",
+"+ c #b6b6b6",
+"@ c #c3c3c3",
+"# c None",
+/* pixels */
+"########################",
+"########+oooO###########",
+"######o ooX X#########",
+"#####X X#####X +#######",
+"####X X####### +##X X#",
+"###+ ########o X## @",
+"###o o####### +# @",
+"### X######X o##O##",
+"### +#####o #####",
+"### o#####o #####",
+"###X O#####O #####",
+"###+ ######o ##O##",
+"####@. .@######X X# #",
+"############### O# @",
+"##############o ##X X#",
+"############## o######",
+"#############X X#######",
+"############+ +#######",
+"###########+ +########",
+"##########+ +#########",
+"#########+ .@##########",
+"########X X############",
+"######@. .@#############",
+"#####X o###############",
+"###o o#################",
+"#@..O###################",
+"#+O#####################"
+};
diff --git a/data/pixmaps/feta/10/clefs-G.xpm b/data/pixmaps/feta/10/clefs-G.xpm
new file mode 100644
index 0000000..c2eb4b9
--- /dev/null
+++ b/data/pixmaps/feta/10/clefs-G.xpm
@@ -0,0 +1,89 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"27 75 8 1",
+" c #040404",
+". c #2c2c2c",
+"X c #505050",
+"o c Gray46",
+"O c Gray55",
+"+ c #aeaeae",
+"@ c #d0d0d0",
+"# c None",
+/* pixels */
+"###########################",
+"################@##########",
+"###############X +#########",
+"##############. #########",
+"#############X o########",
+"############o ########",
+"###########+ o#######",
+"###########. X@ #######",
+"##########+ X##O O######",
+"##########o ###+ X######",
+"########## @#### @#####",
+"#########@ X##### O#####",
+"#########O @##### o#####",
+"#########o X###### #####",
+"#########O O###### #####",
+"#########o ######@ #####",
+"#########o ######o #####",
+"#########@ ######o #####",
+"########## #####@ X#####",
+"########## #####o o#####",
+"##########X ####@ @#####",
+"##########O +###o X######",
+"##########O O##+ @######",
+"########### o#@. X#######",
+"########### #o @#######",
+"###########X O O########",
+"###########O o#########",
+"###########o .##########",
+"##########@. .@##########",
+"#########@. @###########",
+"#########. @############",
+"#######@. #############",
+"#######. +############",
+"######O O@ o############",
+"#####O o## X############",
+"####@. .###. ############",
+"####X .@###o ############",
+"###O @####o @###########",
+"###. o#####+ X@+@########",
+"##O .#####+X .o######",
+"##X O####o O####",
+"## .####o o###",
+"#@ O###O XX. o##",
+"#O @###. +O O#@@X @#",
+"#O ###@ .@## o####O o#",
+"#O o###o +### X#####o .#",
+"#O o###O ####. #####@. @",
+"#+ o###O ####o ######O O",
+"## O###@ @###o @#####@ O",
+"##. X####. X###@ o###### O",
+"##+ ####+ @### O###### O",
+"###. O####O @##. ###### @",
+"###@ .#####+. O#o #####O .#",
+"####O o######O@#o #####X +#",
+"#####O o########@ O###@ .##",
+"######O .O####### o##@ .###",
+"#######@X .O+#### X+X .####",
+"#########@X .+#####",
+"###########@@XXoo. @#######",
+"#################+ @#######",
+"################## o#######",
+"################## o#######",
+"##################o #######",
+"#######@OO########o #######",
+"######X @######@.@######",
+"#####O ####### #######",
+"##### O######.#######",
+"##### o###### #######",
+"##### O#####o.#######",
+"#####X ######.o#######",
+"#####+ +#####+ ########",
+"######X .######+ +########",
+"#######X O###+. +#########",
+"########o o###########",
+"##########@o+##############"
+};
diff --git a/data/pixmaps/feta/10/clefs-G_change.xpm b/data/pixmaps/feta/10/clefs-G_change.xpm
new file mode 100644
index 0000000..86a3d52
--- /dev/null
+++ b/data/pixmaps/feta/10/clefs-G_change.xpm
@@ -0,0 +1,75 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"22 61 8 1",
+" c #040404",
+". c #353535",
+"X c #494949",
+"o c #777777",
+"O c #868686",
+"+ c #b7b7b7",
+"@ c #c5c5c5",
+"# c None",
+/* pixels */
+"######################",
+"#############O########",
+"############X o#######",
+"###########X #######",
+"##########O X######",
+"#########+ +#####",
+"#########X O@ o#####",
+"########+ X## #####",
+"########o ###o +####",
+"########X O###o O####",
+"######## ####O X####",
+"######## o####o ####",
+"######## +####O ####",
+"######## #####X ####",
+"########X ##### ####",
+"########O ####o o####",
+"########o #### +####",
+"########o ###O #####",
+"######### o#+ o#####",
+"######### o#. X######",
+"#########.oX +######",
+"#########o O#######",
+"#########o X########",
+"########+ X#########",
+"#######+ X##########",
+"######+ o##########",
+"######X Xo ##########",
+"#####X @O ##########",
+"####o +#+ ##########",
+"###+ +### o#########",
+"###X o#### o#########",
+"##+ X#####o.Oo+######",
+"##X +###+X o####",
+"## X###+ X###",
+"#O +### .OX X##",
+"#O ###O +# o##@. +#",
+"#O o### o##.o####X #",
+"#O O### ###o ####+ +",
+"#O O### ###o #####X O",
+"## o###X #### +####O O",
+"##..###+ o### o####O O",
+"##+ +###X +##.o####o @",
+"###o.####X X#o #### #",
+"####..####+O#o ###O O#",
+"#####..+#####+ ##+ X##",
+"######o .o+### .X X###",
+"########o o####",
+"##########+ooO..######",
+"##############o ######",
+"##############o ######",
+"############### o#####",
+"#####+oO####### o#####",
+"####+ +#####Xo#####",
+"####X X#####oo#####",
+"#### #####oo#####",
+"#### #####.o#####",
+"#### o####+ ######",
+"####o O#####.o######",
+"#####X X###O.X#######",
+"######o .o########",
+"########@o+###########"
+};
diff --git a/data/pixmaps/feta/10/clefs-hufnagel_do.xpm b/data/pixmaps/feta/10/clefs-hufnagel_do.xpm
new file mode 100644
index 0000000..5d88e4e
--- /dev/null
+++ b/data/pixmaps/feta/10/clefs-hufnagel_do.xpm
@@ -0,0 +1,29 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"13 16 7 1",
+" c #040404",
+". c #313131",
+"X c #6d6d6d",
+"o c #898989",
+"O c #afafaf",
+"+ c Gray82",
+"@ c None",
+/* pixels */
+"@@@@@@@@@@@@@",
+"@@@@@@@+o@@@@",
+"@@@@@+X .O+@",
+"@@@@X +",
+"@@@. +@",
+"@@. .+@@",
+"@o OOO@@@@",
+"@o @@@@@@@",
+"@o @@@@@@@",
+"@o @@@@@@@",
+"@o @@@@@@@",
+"@o X+@@@@@",
+"@o X@@@@@",
+"@o .@@@@@@",
+"@O O@@@@@@@",
+"@@@XO@@@@@@@@"
+};
diff --git a/data/pixmaps/feta/10/clefs-hufnagel_do_change.xpm b/data/pixmaps/feta/10/clefs-hufnagel_do_change.xpm
new file mode 100644
index 0000000..538ddc5
--- /dev/null
+++ b/data/pixmaps/feta/10/clefs-hufnagel_do_change.xpm
@@ -0,0 +1,27 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"10 13 8 1",
+" c Gray1",
+". c #313131",
+"X c #4e4e4e",
+"o c Gray48",
+"O c #929292",
+"+ c #b2b2b2",
+"@ c #d0d0d0",
+"# c None",
+/* pixels */
+"##########",
+"######O@##",
+"####O X+",
+"##@. .#",
+"#@. X##",
+"#o .++###",
+"#o .#####",
+"#o .#####",
+"#o .#####",
+"#O O####",
+"#o X####",
+"#o X#####",
+"##oO######"
+};
diff --git a/data/pixmaps/feta/10/clefs-hufnagel_do_fa.xpm b/data/pixmaps/feta/10/clefs-hufnagel_do_fa.xpm
new file mode 100644
index 0000000..9f492cb
--- /dev/null
+++ b/data/pixmaps/feta/10/clefs-hufnagel_do_fa.xpm
@@ -0,0 +1,54 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"13 40 8 1",
+" c #040404",
+". c Gray18",
+"X c #484848",
+"o c Gray45",
+"O c #8b8b8b",
+"+ c #b2b2b2",
+"@ c #cecece",
+"# c None",
+/* pixels */
+"#############",
+"########O####",
+"######o .+##",
+"####o @",
+"###X +#",
+"##. @##",
+"#O OOO####",
+"#O #######",
+"#O #######",
+"#O #######",
+"#O #######",
+"#O O######",
+"#O O#####",
+"#O @#####",
+"#O o@######",
+"##+.o########",
+"#############",
+"########@####",
+"######+X o###",
+"####@X ..@",
+"###@. o#",
+"##o O##",
+"#+ XX.O###",
+"#O #######",
+"#O #######",
+"#O @o.o@##",
+"#O o@",
+"#O .@",
+"#O X@#",
+"#O X .O###",
+"#O #@#####",
+"#O #######",
+"#O #######",
+"#O #######",
+"#O #######",
+"#O #######",
+"#O X#######",
+"#O .########",
+"#O X#########",
+"#@o##########"
+};
diff --git a/data/pixmaps/feta/10/clefs-hufnagel_do_fa_change.xpm b/data/pixmaps/feta/10/clefs-hufnagel_do_fa_change.xpm
new file mode 100644
index 0000000..b86e6dd
--- /dev/null
+++ b/data/pixmaps/feta/10/clefs-hufnagel_do_fa_change.xpm
@@ -0,0 +1,51 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"11 37 8 1",
+" c #040404",
+". c Gray22",
+"X c Gray29",
+"o c #777777",
+"O c Gray54",
+"+ c Gray71",
+"@ c Gray78",
+"# c None",
+/* pixels */
+"###########",
+"######++###",
+"####+. Xo@",
+"###X .#",
+"##X X##",
+"#O ooO###",
+"#O ######",
+"#O ######",
+"#O ######",
+"#O +#####",
+"#O O####",
+"#O X#####",
+"#+ o######",
+"###########",
+"###########",
+"###########",
+"###########",
+"###########",
+"######++###",
+"####@. Xo@",
+"###o .#",
+"##X X##",
+"#O ooo###",
+"#O ######",
+"#O #+o###",
+"#O X X@",
+"#O .#",
+"#O X##",
+"#O +o+###",
+"#O ######",
+"#O ######",
+"#O ######",
+"#O ######",
+"#O ######",
+"#O +######",
+"#O +#######",
+"#@#########"
+};
diff --git a/data/pixmaps/feta/10/clefs-hufnagel_fa.xpm b/data/pixmaps/feta/10/clefs-hufnagel_fa.xpm
new file mode 100644
index 0000000..db853da
--- /dev/null
+++ b/data/pixmaps/feta/10/clefs-hufnagel_fa.xpm
@@ -0,0 +1,38 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"13 24 8 1",
+" c #040404",
+". c #3c3c3c",
+"X c Gray29",
+"o c #777777",
+"O c #898989",
+"+ c #b4b4b4",
+"@ c Gray77",
+"# c None",
+/* pixels */
+"#############",
+"########O####",
+"######O .+##",
+"####+ @",
+"###X +#",
+"##X +##",
+"#O ooO####",
+"#O #######",
+"#O #######",
+"#O +X .+##",
+"#O O",
+"#O X#",
+"#O o##",
+"#O oXo+###",
+"#O #######",
+"#O #######",
+"#O #######",
+"#O #######",
+"#O #######",
+"#O #######",
+"#O X#######",
+"#O X########",
+"#O X#########",
+"#@O##########"
+};
diff --git a/data/pixmaps/feta/10/clefs-hufnagel_fa_change.xpm b/data/pixmaps/feta/10/clefs-hufnagel_fa_change.xpm
new file mode 100644
index 0000000..cd99011
--- /dev/null
+++ b/data/pixmaps/feta/10/clefs-hufnagel_fa_change.xpm
@@ -0,0 +1,34 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"11 20 8 1",
+" c #040404",
+". c #373737",
+"X c #4b4b4b",
+"o c #747474",
+"O c #898989",
+"+ c #b4b4b4",
+"@ c #cbcbcb",
+"# c None",
+/* pixels */
+"###########",
+"######++###",
+"####@. Xo@",
+"###o .#",
+"##X X##",
+"#O ooO###",
+"#O ######",
+"#O @oX###",
+"#O X@",
+"#O .#",
+"#O X##",
+"#O +o+###",
+"#O ######",
+"#O ######",
+"#O ######",
+"#O ######",
+"#O ######",
+"#O +######",
+"#O +#######",
+"#@@########"
+};
diff --git a/data/pixmaps/feta/10/clefs-medicaea_do.xpm b/data/pixmaps/feta/10/clefs-medicaea_do.xpm
new file mode 100644
index 0000000..5375eb1
--- /dev/null
+++ b/data/pixmaps/feta/10/clefs-medicaea_do.xpm
@@ -0,0 +1,45 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"13 31 8 1",
+" c Gray2",
+". c Gray15",
+"X c Gray36",
+"o c #747474",
+"O c #898989",
+"+ c #bbbbbb",
+"@ c #c0c0c0",
+"# c None",
+/* pixels */
+"#############",
+"#@+##########",
+"#oX##########",
+"#oo##########",
+"#oX##########",
+"#oX##########",
+"#O.##########",
+"#O .o########",
+"#O o######",
+"#O o####",
+"#O O##",
+"#O.. .#",
+"#oX#o #",
+"#oX###o o",
+"#oo#####o +",
+"#oX#######o #",
+"#O O#########",
+"#O o#######",
+"#O o#####",
+"#O o###",
+"#O o#",
+"#oXO #",
+"#oX##o +",
+"#oX####o O",
+"#oX######o #",
+"#oo########O#",
+"#oX##########",
+"#oX##########",
+"#oo##########",
+"#oX##########",
+"#@+##########"
+};
diff --git a/data/pixmaps/feta/10/clefs-medicaea_do_change.xpm b/data/pixmaps/feta/10/clefs-medicaea_do_change.xpm
new file mode 100644
index 0000000..918b9b8
--- /dev/null
+++ b/data/pixmaps/feta/10/clefs-medicaea_do_change.xpm
@@ -0,0 +1,39 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"11 25 8 1",
+" c #060606",
+". c Gray15",
+"X c Gray36",
+"o c #747474",
+"O c #888888",
+"+ c #b9b9b9",
+"@ c Gray76",
+"# c None",
+/* pixels */
+"###########",
+"#@+########",
+"#oX########",
+"#oo########",
+"#O.########",
+"#O o######",
+"#O O####",
+"#O o##",
+"#O.. #",
+"#oX#o #",
+"#oX###o @",
+"#oX#####o.#",
+"#oo########",
+"#oX########",
+"#O O#######",
+"#O o#####",
+"#O O###",
+"#O o#",
+"#oXO #",
+"#oo##o +",
+"#oX####o #",
+"#oo######O#",
+"#oo########",
+"#oo########",
+"#@+########"
+};
diff --git a/data/pixmaps/feta/10/clefs-medicaea_fa.xpm b/data/pixmaps/feta/10/clefs-medicaea_fa.xpm
new file mode 100644
index 0000000..695f8f2
--- /dev/null
+++ b/data/pixmaps/feta/10/clefs-medicaea_fa.xpm
@@ -0,0 +1,45 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"19 31 8 1",
+" c Gray2",
+". c Gray22",
+"X c Gray29",
+"o c #6f6f6f",
+"O c Gray55",
+"+ c #aaaaaa",
+"@ c #d7d7d7",
+"# c None",
+/* pixels */
+"###################",
+"########+@#########",
+"########.+#########",
+"########.+#########",
+"########.+#########",
+"########.+#########",
+"########.+#########",
+"########X o@#######",
+"########X o@#####",
+"########X o@###",
+"###@####X o##",
+"#+ .##X @",
+"#O .##.++ O",
+"#O @#.+##O. o",
+"#o +#.+####O O",
+"#O +#.+######O.@",
+"#O +#.X@########",
+"#O +#X o@######",
+"#O +#X o@####",
+"#O +#X o@##",
+"##OoO +#X o#",
+"#####XO#.X. +",
+"#####XO#.+#O. O",
+"#####XO#.+###O O",
+"#####XO#.+#####O +",
+"#####XO#.+#######O#",
+"#####XO#.+#########",
+"#####XO#.+#########",
+"#####XO#.+#########",
+"#####XO#.+#########",
+"#####+@#+@#########"
+};
diff --git a/data/pixmaps/feta/10/clefs-medicaea_fa_change.xpm b/data/pixmaps/feta/10/clefs-medicaea_fa_change.xpm
new file mode 100644
index 0000000..5671899
--- /dev/null
+++ b/data/pixmaps/feta/10/clefs-medicaea_fa_change.xpm
@@ -0,0 +1,39 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"16 25 8 1",
+" c #040404",
+". c Gray21",
+"X c Gray29",
+"o c Gray45",
+"O c Gray56",
+"+ c #aaaaaa",
+"@ c Gray81",
+"# c None",
+/* pixels */
+"################",
+"#######+@#######",
+"#######.+#######",
+"#######X+#######",
+"#######.O#######",
+"#######X X@#####",
+"#######X X@###",
+"#######X X@#",
+"##@@@##X #",
+"#+ +#.+@X O",
+"#O O#.+##@X O",
+"#O +#.+####+X#",
+"#O +#.+#######",
+"#o +#.+#######",
+"#o O#X +######",
+"#+ +#X .O####",
+"##@@.O#X .+##",
+"####XO#X .#",
+"####XO#.OO +",
+"####XO#.+#@o O",
+"####XO#.+###@o @",
+"####XO#.+#######",
+"####XO#.+#######",
+"####XO#.+#######",
+"####+@##########"
+};
diff --git a/data/pixmaps/feta/10/clefs-mensural1_c.xpm b/data/pixmaps/feta/10/clefs-mensural1_c.xpm
new file mode 100644
index 0000000..9307998
--- /dev/null
+++ b/data/pixmaps/feta/10/clefs-mensural1_c.xpm
@@ -0,0 +1,52 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"27 40 6 1",
+" c Gray1",
+". c Gray50",
+"X c Gray52",
+"o c #b4b4b4",
+"O c #c6c6c6",
+"+ c None",
+/* pixels */
+"+++++++++++++++++++++++++++",
+"+OX+OX++++++++++++++++XO+XO",
+"+X +. ++++++++++++++++ .+ X",
+"+X +X ++++++++++++++++ .+ X",
+"+X +. ++++++++++++++++ .+ X",
+"+X +. ++++++++++++++++ .+ X",
+"+X +. ++++++++++++++++ .+ X",
+"+X +. ++++++++++++++++ .+ X",
+"+X +. ++++++++++++++++ .+ X",
+"+X +. ++++++++++++++++ .+ X",
+"+X +. ++++++++++++++++ .+ X",
+"+X +. ++++++++++++++++ .+ X",
+"+X +X ++++++++++++++++ .+ X",
+"+X +. ++++++++++++++++ .+ X",
+"+X +. ++++++++++++++++ X+ X",
+"+X +X X+ X",
+"+X +X X+ X",
+"+X +X X+ X",
+"+X +X X+ X",
+"+X +X o++++++++++++++o X+ X",
+"+X +X ++++++++++++++++ .+ X",
+"+X +X o++++++++++++++o X+ X",
+"+X +X X+ X",
+"+X +X X+ X",
+"+X +X X+ X",
+"+X +X X+ X",
+"+X +. ++++++++++++++++ .+ X",
+"+X +. ++++++++++++++++ .+ X",
+"+X +. ++++++++++++++++ .+ X",
+"+X +. ++++++++++++++++ .+ X",
+"+X +. ++++++++++++++++ .+ X",
+"+X +. ++++++++++++++++ .+ X",
+"+X +. ++++++++++++++++ .+ X",
+"+X +. ++++++++++++++++ .+ X",
+"+X +. ++++++++++++++++ .+ X",
+"+X +. ++++++++++++++++ .+ X",
+"+X +. ++++++++++++++++ .+ X",
+"+X +X ++++++++++++++++ X+ X",
+"+X +. ++++++++++++++++ .+ X",
+"+OX+OX++++++++++++++++XO+XO"
+};
diff --git a/data/pixmaps/feta/10/clefs-mensural1_c_change.xpm b/data/pixmaps/feta/10/clefs-mensural1_c_change.xpm
new file mode 100644
index 0000000..a0a4e02
--- /dev/null
+++ b/data/pixmaps/feta/10/clefs-mensural1_c_change.xpm
@@ -0,0 +1,46 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"21 32 8 1",
+" c #010101",
+". c #313131",
+"X c #4c4c4c",
+"o c Gray45",
+"O c #888888",
+"+ c Gray69",
+"@ c #c8c8c8",
+"# c None",
+/* pixels */
+"#####################",
+"#+@@@############@+@+",
+"#oOoO############OoOo",
+"#oOoO############OoOo",
+"#oOoo############OoOo",
+"#oOoO############OoOo",
+"#oOoo############OoOo",
+"#oOoO############ooOo",
+"#oOoO############ooOo",
+"#oOoO############OoOo",
+"#oOoo############OoOX",
+"#oOoo############ooOo",
+"#oOO OOoOo++ooOoO OOo",
+"#oOO XX OOo",
+"#oOO XX OOo",
+"#oOo.Ooooo++ooooO.oOo",
+"#oOoO############OoOo",
+"#oOo.Ooooo++ooooO.oOo",
+"#oOO XX OOo",
+"#oOO XX OOo",
+"#oOo OoOOo++oooOO OOo",
+"#oOoo############ooOo",
+"#oOoo############ooOo",
+"#oOoo############OoOo",
+"#oOoO############ooOo",
+"#oOoO############OoOX",
+"#oOoo############OoOo",
+"#oOoO############ooOo",
+"#oOoO############OoOo",
+"#oOoo############OoOo",
+"#oOoO############OoOo",
+"#+@+@############@@@+"
+};
diff --git a/data/pixmaps/feta/10/clefs-mensural1_f.xpm b/data/pixmaps/feta/10/clefs-mensural1_f.xpm
new file mode 100644
index 0000000..93f8999
--- /dev/null
+++ b/data/pixmaps/feta/10/clefs-mensural1_f.xpm
@@ -0,0 +1,70 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"22 56 8 1",
+" c Gray1",
+". c Gray19",
+"X c Gray32",
+"o c #717171",
+"O c #8e8e8e",
+"+ c #b1b1b1",
+"@ c #cdcdcd",
+"# c None",
+/* pixels */
+"######################",
+"################+O####",
+"###############+ o###",
+"###############X +##",
+"##############+ X##",
+"#+o######+o###.X@ +#",
+"#O ######o ##o +#X .#",
+"#O oooooo. ## ##+ @",
+"#O #o +##X X#",
+"#O #X @#o @#",
+"#O #@ O+ O##",
+"#O X+OOOO ##O .###",
+"#O ######O ###. .###",
+"#O @#####o ###+ O##",
+"#O .oXXXX ###o . @#",
+"#O ##+ O@ o#",
+"#O ##. ##O +",
+"#O #+ @##. .#",
+"#O ++++++X #X .##o O#",
+"#O ######o #O +#.X##",
+"#@+######O ##X .X @##",
+"#########o ##@ X###",
+"#########o ###o .@###",
+"#########o ####. O####",
+"#########o ####oX#####",
+"#########O ####oo#####",
+"#########o ####oo#####",
+"#########o ####oo#####",
+"#########o ####oo#####",
+"#########o ####oX#####",
+"#########o ####oo#####",
+"#########o ####oo#####",
+"#########o ####oo#####",
+"#########o ####Xo#####",
+"#########O ####oo#####",
+"#########o ####oo#####",
+"#########o ####oo#####",
+"#########o ####oo#####",
+"#########o ####oo#####",
+"#########O ####oo#####",
+"#########o ####oo#####",
+"#########o ####oo#####",
+"#########O ####oo#####",
+"#########o ####Xo#####",
+"#########o ####oo#####",
+"#########o ####oo#####",
+"#########o ####oo#####",
+"#########O ####oo#####",
+"#########O ####oo#####",
+"#########o ####Xo#####",
+"#########+o####oo#####",
+"###############oo#####",
+"###############oo#####",
+"###############oo#####",
+"###############oo#####",
+"###############++#####"
+};
diff --git a/data/pixmaps/feta/10/clefs-mensural1_f_change.xpm b/data/pixmaps/feta/10/clefs-mensural1_f_change.xpm
new file mode 100644
index 0000000..3c1f498
--- /dev/null
+++ b/data/pixmaps/feta/10/clefs-mensural1_f_change.xpm
@@ -0,0 +1,60 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"18 46 8 1",
+" c #0b0b0b",
+". c #2d2d2d",
+"X c #4c4c4c",
+"o c #6d6d6d",
+"O c #8d8d8d",
+"+ c Gray70",
+"@ c #d0d0d0",
+"# c None",
+/* pixels */
+"##################",
+"##############+###",
+"#############X ###",
+"############o o##",
+"###########@.X ##",
+"###########..# X#",
+"#oo##### #+ +#O @",
+"#O.#@@#O #X O##..#",
+"#O #o #+ +#",
+"#O ## ..X##",
+"#o .... ##O @##",
+"#oo####@ ###X .###",
+"#oX#@@@@ ###o +##",
+"#O ###. .##",
+"#O ##O.@ O#",
+"#O .... #@ O#X @",
+"#oX####@ #o +#@. @",
+"#OO##### #X .##.O#",
+"########.#@ Oo ##",
+"#######@ ##X O##",
+"######## @#@. o###",
+"########.###o @###",
+"######## ###oo####",
+"######## ###oo####",
+"######## ###oo####",
+"########.@##oo####",
+"########.###oo####",
+"#######@ ###oo####",
+"######## ###oo####",
+"######## ###oo####",
+"######## ###oo####",
+"#######@ ###oo####",
+"######## ###oo####",
+"######## ###oo####",
+"#######@ ###oo####",
+"######## ###oo####",
+"######## ###oo####",
+"#######@ ###oo####",
+"########.###oo####",
+"######## ###oo####",
+"######## ###oo####",
+"######## ###oo####",
+"############oo####",
+"############oo####",
+"############oo####",
+"############++####"
+};
diff --git a/data/pixmaps/feta/10/clefs-mensural2_c.xpm b/data/pixmaps/feta/10/clefs-mensural2_c.xpm
new file mode 100644
index 0000000..990c815
--- /dev/null
+++ b/data/pixmaps/feta/10/clefs-mensural2_c.xpm
@@ -0,0 +1,51 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"11 40 5 1",
+" c Gray3",
+". c Gray48",
+"X c #868686",
+"o c #c0c0c0",
+"O c None",
+/* pixels */
+"OOOOOOOOOOO",
+"OoXOOOOOOXo",
+"O. OOOOOO .",
+"O. OOOOOO .",
+"O. OOOOOO .",
+"O. OOOOOO .",
+"O. OOOOOO .",
+"O. OOOOOO .",
+"O. OOOOOO .",
+"O. OOOOOO .",
+"O. OOOOOO .",
+"O. OOOOOO .",
+"O. .",
+"O. .",
+"O. X.X.X. .",
+"O. OOOOOO .",
+"O. OOOOOO .",
+"O. .",
+"O. .",
+"O. ...... .",
+"O. OOOOOO .",
+"O. X..... .",
+"O. .",
+"O. .",
+"O. OOOOoO .",
+"O. OOOOOO .",
+"O. X....X .",
+"O. .",
+"O. .",
+"O. OOOOOO .",
+"O. OOOOOO .",
+"O. OOOOOO .",
+"O. OOOOOO .",
+"O. OOOOOO .",
+"O. OOOOOO .",
+"O. OOOOOO .",
+"O. OOOOOO .",
+"O. OOOOOO .",
+"O. OOOOOO .",
+"OoXOOOOOOXo"
+};
diff --git a/data/pixmaps/feta/10/clefs-mensural2_c_change.xpm b/data/pixmaps/feta/10/clefs-mensural2_c_change.xpm
new file mode 100644
index 0000000..3d81fce
--- /dev/null
+++ b/data/pixmaps/feta/10/clefs-mensural2_c_change.xpm
@@ -0,0 +1,47 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"10 34 7 1",
+" c #060606",
+". c #282828",
+"X c Gray44",
+"o c #888888",
+"O c #b9b9b9",
+"+ c #c0c0c0",
+"@ c None",
+/* pixels */
+"@@@@@@@@@@",
+"@+O@@@@@OO",
+"@XX@@@@@XX",
+"@XX@@@@@XX",
+"@XX@@@@@XX",
+"@XX@@@@@XX",
+"@XX@@@@@XX",
+"@XX@@@@@XX",
+"@XX@@@@@XX",
+"@o X",
+"@o o",
+"@XX@@@@@XX",
+"@XX@@@@@XX",
+"@XX@@@@@XX",
+"@o.oXooo.X",
+"@o o",
+"@o.oXooo.X",
+"@XX@@@@@XX",
+"@o.ooXXo.o",
+"@o o",
+"@o.oXXXo.X",
+"@XX@@@@@XX",
+"@XX@@@@@XX",
+"@XX@@@@@XX",
+"@o o",
+"@o . o",
+"@XX@@@@@XX",
+"@XX@@@@@XX",
+"@XX@@@@@XX",
+"@XX@@@@@XX",
+"@XX@@@@@XX",
+"@XX@@@@@XX",
+"@XX@@@@@XX",
+"@OO@@@@@O+"
+};
diff --git a/data/pixmaps/feta/10/clefs-mensural2_f.xpm b/data/pixmaps/feta/10/clefs-mensural2_f.xpm
new file mode 100644
index 0000000..b2c015c
--- /dev/null
+++ b/data/pixmaps/feta/10/clefs-mensural2_f.xpm
@@ -0,0 +1,30 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"15 16 8 1",
+" c Gray2",
+". c #343434",
+"X c #4c4c4c",
+"o c #6f6f6f",
+"O c #8d8d8d",
+"+ c #afafaf",
+"@ c #d0d0d0",
+"# c None",
+/* pixels */
+"###############",
+"###OO@#####@+##",
+"##. X@##o +#",
+"#+ @#. +",
+"###+. X#@ +",
+"#####O @#@ o#",
+"######X X#####",
+"######@ X#####",
+"#######X X#####",
+"#######X O#####",
+"#######. ######",
+"######@ O#@X.##",
+"#####+..@#. .#",
+"##+ @##o O",
+"#@ O#####o @",
+"#@o@########O##"
+};
diff --git a/data/pixmaps/feta/10/clefs-mensural2_f_change.xpm b/data/pixmaps/feta/10/clefs-mensural2_f_change.xpm
new file mode 100644
index 0000000..87dd7fb
--- /dev/null
+++ b/data/pixmaps/feta/10/clefs-mensural2_f_change.xpm
@@ -0,0 +1,29 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"15 15 8 1",
+" c #040404",
+". c #3c3c3c",
+"X c #484848",
+"o c Gray47",
+"O c #888888",
+"+ c Gray72",
+"@ c #c3c3c3",
+"# c None",
+/* pixels */
+"###############",
+"##@OO######O+##",
+"#+ X###. +#",
+"#+oX X##o @",
+"#####X +##+ X#",
+"######X X######",
+"######+ ######",
+"####### ######",
+"####### ######",
+"####### X######",
+"######+ +######",
+"######.X##+ X##",
+"##+oo X### X#",
+"#+ o#####X @",
+"#@o@########O+#"
+};
diff --git a/data/pixmaps/feta/10/clefs-mensural3_c.xpm b/data/pixmaps/feta/10/clefs-mensural3_c.xpm
new file mode 100644
index 0000000..54696cf
--- /dev/null
+++ b/data/pixmaps/feta/10/clefs-mensural3_c.xpm
@@ -0,0 +1,62 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"11 49 7 1",
+" c #040404",
+". c #464646",
+"X c #797979",
+"o c #8b8b8b",
+"O c Gray68",
+"+ c #d5d5d5",
+"@ c None",
+/* pixels */
+"@@@@@@@@@@@",
+"@Oo@@@@@@o+",
+"@X @@@@@@ X",
+"@X @@@@@@ X",
+"@X @@@@@@ X",
+"@X @@@@@@ X",
+"@X @@@@@@ X",
+"@X @@@@@@ X",
+"@X @@@@@@ X",
+"@X @@@@@@ X",
+"@X @@@@@@ X",
+"@X ++++++ X",
+"@o X",
+"@X X",
+"@X OOOoOO X",
+"@X @@@@@@ X",
+"@X ++++++ X",
+"@X X",
+"@X X",
+"@X OOOOOO X",
+"@X @@@@@@ X",
+"@X ...... X",
+"@X o",
+"@X ...... X",
+"@X @@@@@@ X",
+"@X @@@@@@ X",
+"@X ...... X",
+"@X X",
+"@X ...... X",
+"@X @@@@@@ X",
+"@X OOOOOO X",
+"@X X",
+"@X X",
+"@X ++++++ X",
+"@X @@@@@@ X",
+"@X OOOOOO X",
+"@X X",
+"@X X",
+"@X ++++++ X",
+"@X @@@@@@ X",
+"@X @@@@@@ X",
+"@X @@@@@@ X",
+"@X @@@@@@ X",
+"@X @@@@@@ X",
+"@X @@@@@@ X",
+"@X @@@@@@ X",
+"@X @@@@@@ X",
+"@X @@@@@@ X",
+"@+o@@@@@@oO"
+};
diff --git a/data/pixmaps/feta/10/clefs-mensural3_c_change.xpm b/data/pixmaps/feta/10/clefs-mensural3_c_change.xpm
new file mode 100644
index 0000000..2f7eac5
--- /dev/null
+++ b/data/pixmaps/feta/10/clefs-mensural3_c_change.xpm
@@ -0,0 +1,57 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"9 43 8 1",
+" c #060606",
+". c Gray15",
+"X c Gray33",
+"o c #6f6f6f",
+"O c Gray52",
+"+ c Gray71",
+"@ c #cdcdcd",
+"# c None",
+/* pixels */
+"#########",
+"#+@####@+",
+"#oO####Oo",
+"#oO####Oo",
+"#oO####Oo",
+"#oO####Oo",
+"#oO####Oo",
+"#oO####Oo",
+"#oo#@@#oo",
+"#o o",
+"#o .... o",
+"#oO####Oo",
+"#oO####Oo",
+"#oO####Oo",
+"#o.oXXX.o",
+"#o O",
+"#oX@++@Xo",
+"#oO####Oo",
+"#o XX.X.o",
+"#o O",
+"#oX@++@Xo",
+"#oO####Oo",
+"#oO####Oo",
+"#oX@++@Xo",
+"#o o",
+"#o XXXX o",
+"#oO####Oo",
+"#oX@++@Xo",
+"#o o",
+"#o.oXXX.o",
+"#oO####Oo",
+"#oo####Oo",
+"#oO####Oo",
+"#o .... o",
+"#o o",
+"#oo#@@#oo",
+"#oO####Oo",
+"#oO####Oo",
+"#oO####Oo",
+"#oO####Oo",
+"#oO####Oo",
+"#oO####Oo",
+"#+@####@+"
+};
diff --git a/data/pixmaps/feta/10/clefs-mensural_g.xpm b/data/pixmaps/feta/10/clefs-mensural_g.xpm
new file mode 100644
index 0000000..035b021
--- /dev/null
+++ b/data/pixmaps/feta/10/clefs-mensural_g.xpm
@@ -0,0 +1,38 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"13 24 8 1",
+" c #040404",
+". c Gray20",
+"X c #4c4c4c",
+"o c #6c6c6c",
+"O c #8e8e8e",
+"+ c #a9a9a9",
+"@ c #d3d3d3",
+"# c None",
+/* pixels */
+"#############",
+"#######@o+###",
+"#######. @##",
+"######@ @##",
+"######+ .####",
+"####### .O@##",
+"#######O +#",
+"########o #",
+"#####@O###+ O",
+"####O .@#o o",
+"###+ X O",
+"##@ @",
+"##o O..+. +#",
+"## @#X o@##",
+"#+ @##X .##",
+"#o ###X +#",
+"#o ###X OO o#",
+"#O @##..##OX#",
+"## X##..##OX#",
+"##. @#..##OO#",
+"##+ #..##o@#",
+"###O .O X##",
+"####+. .###",
+"######+OO@###"
+};
diff --git a/data/pixmaps/feta/10/clefs-mensural_g_change.xpm b/data/pixmaps/feta/10/clefs-mensural_g_change.xpm
new file mode 100644
index 0000000..a04f33f
--- /dev/null
+++ b/data/pixmaps/feta/10/clefs-mensural_g_change.xpm
@@ -0,0 +1,34 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"11 20 8 1",
+" c #040404",
+". c Gray17",
+"X c #505050",
+"o c #717171",
+"O c #8e8e8e",
+"+ c #acacac",
+"@ c #cdcdcd",
+"# c None",
+/* pixels */
+"###########",
+"######O+###",
+"#####+ @##",
+"#####X o##",
+"#####O .+##",
+"######. O#",
+"######@. #",
+"####O +#X O",
+"###O o",
+"##+ . #",
+"##. X OoO+#",
+"#@ @@ +##",
+"#O #@ O#",
+"#o #@ .O o#",
+"#O @@ +#OX#",
+"## o@ @#OX#",
+"##o X +#o@#",
+"###. .##",
+"####+. O##",
+"######@+###"
+};
diff --git a/data/pixmaps/feta/10/clefs-percussion.xpm b/data/pixmaps/feta/10/clefs-percussion.xpm
new file mode 100644
index 0000000..6126978
--- /dev/null
+++ b/data/pixmaps/feta/10/clefs-percussion.xpm
@@ -0,0 +1,34 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"14 21 7 1",
+" c Gray1",
+". c #323232",
+"X c Gray49",
+"o c Gray51",
+"O c #a0a0a0",
+"+ c #c5c5c5",
+"@ c None",
+/* pixels */
+"@@@@@@@@@@@@@@",
+"@+oooO@@@OooX+",
+"@o .@@@. o",
+"@o .@@@. o",
+"@o .@@@. o",
+"@o .@@@. o",
+"@o .@@@. o",
+"@o .@@@. o",
+"@o .@@@. o",
+"@o .@@@. o",
+"@o .@@@. o",
+"@o .@@@. o",
+"@o .@@@. o",
+"@o .@@@. X",
+"@o .@@@. o",
+"@o .@@@. o",
+"@o .@@@. o",
+"@o .@@@. o",
+"@o .@@@. o",
+"@o .@@@. o",
+"@+XooO@@@OooX+"
+};
diff --git a/data/pixmaps/feta/10/clefs-percussion_change.xpm b/data/pixmaps/feta/10/clefs-percussion_change.xpm
new file mode 100644
index 0000000..73d2cad
--- /dev/null
+++ b/data/pixmaps/feta/10/clefs-percussion_change.xpm
@@ -0,0 +1,28 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"12 17 5 1",
+" c Gray2",
+". c Gray49",
+"X c Gray54",
+"o c #c8c8c8",
+"O c None",
+/* pixels */
+"OOOOOOOOOOOO",
+"OoXXXOOOXXXo",
+"OX OOO X",
+"OX OOO X",
+"OX OOO X",
+"OX OOO X",
+"OX OOO X",
+"OX OOO X",
+"OX OOO X",
+"OX OOO X",
+"OX OOO X",
+"OX OOO X",
+"OX OOO X",
+"OX OOO X",
+"OX OOO X",
+"OX OOO X",
+"Oo.XXOOOXXXo"
+};
diff --git a/data/pixmaps/feta/10/clefs-tab.xpm b/data/pixmaps/feta/10/clefs-tab.xpm
new file mode 100644
index 0000000..8d56653
--- /dev/null
+++ b/data/pixmaps/feta/10/clefs-tab.xpm
@@ -0,0 +1,61 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"17 47 8 1",
+" c #040404",
+". c #2c2c2c",
+"X c Gray29",
+"o c #777777",
+"O c #8b8b8b",
+"+ c #aaaaaa",
+"@ c Gray81",
+"# c None",
+/* pixels */
+"#################",
+"#@oOOOOOOOOOOOOo@",
+"#O O",
+"#O .. . . .. O",
+"#######o o######",
+"#######o o######",
+"#######o o######",
+"#######o o######",
+"#######O o######",
+"#######o o######",
+"#######o O######",
+"#######o o######",
+"#######O o######",
+"#######o O######",
+"#######O o######",
+"#######@+O@######",
+"#################",
+"#######OXXO######",
+"####### ######",
+"######+ +#####",
+"######. .#####",
+"#####+ oo +####",
+"#####. ++ .####",
+"####@ .##. @###",
+"####o +##+ o###",
+"###@ .X.X @##",
+"###o o##",
+"###. XXXXXX .##",
+"##O o######o O#",
+"##. @######@ .#",
+"#@ .########. @",
+"#@@@##########@@@",
+"#################",
+"#+ ........o@####",
+"#O o###",
+"#O .oXXoXX @##",
+"#O o######o o##",
+"#O o######X o##",
+"#O ...... @##",
+"#O X@#",
+"#O .oooooo. #",
+"#O o#######@X O",
+"#O o########O O",
+"#O o######+o +",
+"#O . . . X#",
+"#O .+##",
+"#@oOOOOOOOOO#####"
+};
diff --git a/data/pixmaps/feta/10/clefs-tab_change.xpm b/data/pixmaps/feta/10/clefs-tab_change.xpm
new file mode 100644
index 0000000..a648339
--- /dev/null
+++ b/data/pixmaps/feta/10/clefs-tab_change.xpm
@@ -0,0 +1,52 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"14 38 8 1",
+" c #060606",
+". c #343434",
+"X c #484848",
+"o c Gray48",
+"O c Gray53",
+"+ c #b9b9b9",
+"@ c #c6c6c6",
+"# c None",
+/* pixels */
+"##############",
+"#@OOOOOOOOOOO#",
+"#O #",
+"#@oOOo XOoOO#",
+"###### O#####",
+"###### o#####",
+"###### O#####",
+"###### O#####",
+"###### O#####",
+"###### o#####",
+"###### O#####",
+"###### O#####",
+"######Oo+#####",
+"##############",
+"#####+ X#####",
+"#####o #####",
+"##### O####",
+"####o .o ####",
+"#### o# O###",
+"###+ ##o X###",
+"###X oOX +##",
+"##+ X##",
+"##o XOOOOo ##",
+"## O##### o#",
+"#O ######o #",
+"##############",
+"#@oOoOOoO#####",
+"#O X###",
+"#O ooooo O##",
+"#O #####o ##",
+"#O oooOo O##",
+"#O .@#",
+"#O oOOOOo #",
+"#O ####### O",
+"#O ####### O",
+"#O oOOOOo #",
+"#O .@#",
+"#@OOOOOOOO####"
+};
diff --git a/data/pixmaps/feta/10/clefs-vaticana_do.xpm b/data/pixmaps/feta/10/clefs-vaticana_do.xpm
new file mode 100644
index 0000000..80d1ff8
--- /dev/null
+++ b/data/pixmaps/feta/10/clefs-vaticana_do.xpm
@@ -0,0 +1,29 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"7 17 6 1",
+" c #040404",
+". c #464646",
+"X c #6d6d6d",
+"o c Gray54",
+"O c #b6b6b6",
+"+ c None",
+/* pixels */
+"+++++++",
+"+++ooo+",
+"++. o",
+"+O o",
+"+o o",
+"+o o",
+"+o o",
+"+o O+OO",
+"+XX++++",
+"+XX++++",
+"+o O+OO",
+"+o o",
+"+o o",
+"+o o",
+"+O o",
+"++. o",
+"+++ooo+"
+};
diff --git a/data/pixmaps/feta/10/clefs-vaticana_do_change.xpm b/data/pixmaps/feta/10/clefs-vaticana_do_change.xpm
new file mode 100644
index 0000000..80d1ff8
--- /dev/null
+++ b/data/pixmaps/feta/10/clefs-vaticana_do_change.xpm
@@ -0,0 +1,29 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"7 17 6 1",
+" c #040404",
+". c #464646",
+"X c #6d6d6d",
+"o c Gray54",
+"O c #b6b6b6",
+"+ c None",
+/* pixels */
+"+++++++",
+"+++ooo+",
+"++. o",
+"+O o",
+"+o o",
+"+o o",
+"+o o",
+"+o O+OO",
+"+XX++++",
+"+XX++++",
+"+o O+OO",
+"+o o",
+"+o o",
+"+o o",
+"+O o",
+"++. o",
+"+++ooo+"
+};
diff --git a/data/pixmaps/feta/10/clefs-vaticana_fa.xpm b/data/pixmaps/feta/10/clefs-vaticana_fa.xpm
new file mode 100644
index 0000000..57bda0c
--- /dev/null
+++ b/data/pixmaps/feta/10/clefs-vaticana_fa.xpm
@@ -0,0 +1,38 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"12 24 8 1",
+" c #040404",
+". c Gray15",
+"X c #484848",
+"o c #6f6f6f",
+"O c Gray54",
+"+ c Gray73",
+"@ c Gray78",
+"# c None",
+/* pixels */
+"############",
+"########Oo+#",
+"#######X #",
+"######+ @",
+"######O O",
+"######o O",
+"##X @O #",
+"#O .o +#O#",
+"#O ..o####",
+"#O o####",
+"#O +#O#",
+"##+##X #",
+"#####O O",
+"#####o O",
+"#####o. +",
+"#####ooo #",
+"#####oo#Oo+#",
+"#####oo#####",
+"#####oo#####",
+"#####oo#####",
+"#####oo#####",
+"#####oo#####",
+"#####oo#####",
+"#####++#####"
+};
diff --git a/data/pixmaps/feta/10/clefs-vaticana_fa_change.xpm b/data/pixmaps/feta/10/clefs-vaticana_fa_change.xpm
new file mode 100644
index 0000000..57bda0c
--- /dev/null
+++ b/data/pixmaps/feta/10/clefs-vaticana_fa_change.xpm
@@ -0,0 +1,38 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"12 24 8 1",
+" c #040404",
+". c Gray15",
+"X c #484848",
+"o c #6f6f6f",
+"O c Gray54",
+"+ c Gray73",
+"@ c Gray78",
+"# c None",
+/* pixels */
+"############",
+"########Oo+#",
+"#######X #",
+"######+ @",
+"######O O",
+"######o O",
+"##X @O #",
+"#O .o +#O#",
+"#O ..o####",
+"#O o####",
+"#O +#O#",
+"##+##X #",
+"#####O O",
+"#####o O",
+"#####o. +",
+"#####ooo #",
+"#####oo#Oo+#",
+"#####oo#####",
+"#####oo#####",
+"#####oo#####",
+"#####oo#####",
+"#####oo#####",
+"#####oo#####",
+"#####++#####"
+};
diff --git a/data/pixmaps/feta/10/custodes-hufnagel.xpm b/data/pixmaps/feta/10/custodes-hufnagel.xpm
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/pixmaps/feta/10/custodes-hufnagel.xpm
diff --git a/data/pixmaps/feta/10/custodes-medicaea.xpm b/data/pixmaps/feta/10/custodes-medicaea.xpm
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/pixmaps/feta/10/custodes-medicaea.xpm
diff --git a/data/pixmaps/feta/10/custodes-mensural.xpm b/data/pixmaps/feta/10/custodes-mensural.xpm
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/pixmaps/feta/10/custodes-mensural.xpm
diff --git a/data/pixmaps/feta/10/custodes-rhufnagel.xpm b/data/pixmaps/feta/10/custodes-rhufnagel.xpm
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/pixmaps/feta/10/custodes-rhufnagel.xpm
diff --git a/data/pixmaps/feta/10/custodes-rmedicaea.xpm b/data/pixmaps/feta/10/custodes-rmedicaea.xpm
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/pixmaps/feta/10/custodes-rmedicaea.xpm
diff --git a/data/pixmaps/feta/10/custodes-rmensural.xpm b/data/pixmaps/feta/10/custodes-rmensural.xpm
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/pixmaps/feta/10/custodes-rmensural.xpm
diff --git a/data/pixmaps/feta/10/custodes-rvaticana.xpm b/data/pixmaps/feta/10/custodes-rvaticana.xpm
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/pixmaps/feta/10/custodes-rvaticana.xpm
diff --git a/data/pixmaps/feta/10/custodes-vaticana.xpm b/data/pixmaps/feta/10/custodes-vaticana.xpm
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/pixmaps/feta/10/custodes-vaticana.xpm
diff --git a/data/pixmaps/feta/10/dots-dot.xpm b/data/pixmaps/feta/10/dots-dot.xpm
new file mode 100644
index 0000000..3ff822b
--- /dev/null
+++ b/data/pixmaps/feta/10/dots-dot.xpm
@@ -0,0 +1,18 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"6 6 6 1",
+" c #020202",
+". c #797979",
+"X c #818181",
+"o c Gray68",
+"O c Gray85",
+"+ c None",
+/* pixels */
+"++++++",
+"++o.o+",
+"+o O",
+"+. X",
+"+o O",
+"++o.o+"
+};
diff --git a/data/pixmaps/feta/10/dots-evenrepeatcolon.xpm b/data/pixmaps/feta/10/dots-evenrepeatcolon.xpm
new file mode 100644
index 0000000..eea9924
--- /dev/null
+++ b/data/pixmaps/feta/10/dots-evenrepeatcolon.xpm
@@ -0,0 +1,37 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"6 25 6 1",
+" c #020202",
+". c Gray46",
+"X c #818181",
+"o c Gray67",
+"O c #dadada",
+"+ c None",
+/* pixels */
+"++++++",
+"++o.o+",
+"+o O",
+"+. .",
+"+o O",
+"++o.o+",
+"++++++",
+"++++++",
+"++++++",
+"++++++",
+"++++++",
+"++++++",
+"++++++",
+"++++++",
+"++++++",
+"++++++",
+"++++++",
+"++++++",
+"++++++",
+"++++++",
+"++o.o+",
+"+o O",
+"+. .",
+"+o O",
+"++o.o+"
+};
diff --git a/data/pixmaps/feta/10/dots-repeatcolon.xpm b/data/pixmaps/feta/10/dots-repeatcolon.xpm
new file mode 100644
index 0000000..6e97b1a
--- /dev/null
+++ b/data/pixmaps/feta/10/dots-repeatcolon.xpm
@@ -0,0 +1,29 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"6 16 7 1",
+" c #020202",
+". c Gray17",
+"X c #6f6f6f",
+"o c #888888",
+"O c Gray68",
+"+ c #dadada",
+"@ c None",
+/* pixels */
+"@@@@@@",
+"@@+o+@",
+"@+ .@",
+"@X O",
+"@O +",
+"@@X o@",
+"@@@@@@",
+"@@@@@@",
+"@@@@@@",
+"@@@@@@",
+"@@@@@@",
+"@@X o@",
+"@O +",
+"@X O",
+"@+ .@",
+"@@+o+@"
+};
diff --git a/data/pixmaps/feta/10/flags-d3.xpm b/data/pixmaps/feta/10/flags-d3.xpm
new file mode 100644
index 0000000..43a53ad
--- /dev/null
+++ b/data/pixmaps/feta/10/flags-d3.xpm
@@ -0,0 +1,44 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"13 30 8 1",
+" c #060606",
+". c #2a2a2a",
+"X c Gray32",
+"o c Gray46",
+"O c #8d8d8d",
+"+ c #b2b2b2",
+"@ c Gray83",
+"# c None",
+/* pixels */
+"#############",
+"#########O@##",
+"#########XX##",
+"#########+.##",
+"##########.O#",
+"##########XX#",
+"##########O #",
+"########### +",
+"########### o",
+"#++######## o",
+"#oo######## o",
+"#oo#######O +",
+"#oo#######. #",
+"#oo######+ o#",
+"#oo#####@ @#",
+"#oo####@. O##",
+"#oo###@. .###",
+"#oo##O .####",
+"#oo#. .@####",
+"#o.. O#####",
+"#O o######",
+"#o o#######",
+"#o .########",
+"#O @########",
+"#O X#########",
+"#o @#########",
+"#o ##########",
+"#oo##########",
+"#oo##########",
+"#+@##########"
+};
diff --git a/data/pixmaps/feta/10/flags-d4.xpm b/data/pixmaps/feta/10/flags-d4.xpm
new file mode 100644
index 0000000..6fc1682
--- /dev/null
+++ b/data/pixmaps/feta/10/flags-d4.xpm
@@ -0,0 +1,45 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"13 31 8 1",
+" c #040404",
+". c Gray19",
+"X c #4b4b4b",
+"o c #747474",
+"O c #898989",
+"+ c #b1b1b1",
+"@ c #cacaca",
+"# c None",
+/* pixels */
+"#############",
+"##########@o#",
+"##########O #",
+"########### o",
+"########### o",
+"########### o",
+"########### O",
+"##########O #",
+"#########@ o#",
+"#########X @#",
+"#@######X O#",
+"#oo###@. @oX#",
+"#oo#@o +#O #",
+"#ooO +##+ #",
+"#o +###o #",
+"#O +#### .#",
+"#O +####@ @#",
+"#O X#####.X##",
+"#o +####. @##",
+"#o.###@. @###",
+"#oo##+ @####",
+"#oO#X @#####",
+"#o @######",
+"#o o#######",
+"#o X########",
+"#O .#########",
+"#O O#########",
+"#o ##########",
+"#oo##########",
+"#oo##########",
+"#+@##########"
+};
diff --git a/data/pixmaps/feta/10/flags-d5.xpm b/data/pixmaps/feta/10/flags-d5.xpm
new file mode 100644
index 0000000..1654d9c
--- /dev/null
+++ b/data/pixmaps/feta/10/flags-d5.xpm
@@ -0,0 +1,53 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"13 39 8 1",
+" c Gray2",
+". c Gray20",
+"X c #4e4e4e",
+"o c #747474",
+"O c #898989",
+"+ c #aeaeae",
+"@ c #cbcbcb",
+"# c None",
+/* pixels */
+"#############",
+"##########@o#",
+"##########+ #",
+"########### o",
+"########### o",
+"########### o",
+"##########@ O",
+"##########X #",
+"#########+ o#",
+"########@ @#",
+"#######o XO#",
+"#####+X @+X#",
+"###@X +##.@",
+"##O .####.@",
+"##o .##### #",
+"##o .#####o.#",
+"##o ###### +#",
+"##Xo#####..##",
+"##X@###@X ##",
+"#oX###+ @oo#",
+"#oo#+. +#OX#",
+"#oXX +##OX#",
+"#O +###oo#",
+"#o +####.@#",
+"#O +####oX##",
+"#o X####O @##",
+"#O +###+ o###",
+"#o.###O o####",
+"#oo#@. .#####",
+"#oo+ @#####",
+"#o @######",
+"#O @#######",
+"#O O########",
+"#O X#########",
+"#o @#########",
+"#o ##########",
+"#oo##########",
+"#oo##########",
+"#+@##########"
+};
diff --git a/data/pixmaps/feta/10/flags-d6.xpm b/data/pixmaps/feta/10/flags-d6.xpm
new file mode 100644
index 0000000..682cc7c
--- /dev/null
+++ b/data/pixmaps/feta/10/flags-d6.xpm
@@ -0,0 +1,58 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"13 44 8 1",
+" c #060606",
+". c Gray20",
+"X c Gray31",
+"o c #717171",
+"O c Gray55",
+"+ c Gray69",
+"@ c #cecece",
+"# c None",
+/* pixels */
+"#############",
+"###########O#",
+"########### +",
+"########### o",
+"########### O",
+"##########@ O",
+"##########X #",
+"#########o X#",
+"######@O X.@",
+"###@OX X# #",
+"##o +##.@",
+"##o .#### @",
+"##o o####X.#",
+"##o O#####.+#",
+"##XX#####X O#",
+"##o@####.XOX#",
+"##@###+ @OX#",
+"####+. X@#OX#",
+"##O. X###oo#",
+"##o .#### +#",
+"##o .####O @#",
+"##X #####. @#",
+"##Xo####X @#",
+"##X@###X O ##",
+"#oX##@X @+ @#",
+"#oO#+ +#+ @#",
+"#oXo +##X ##",
+"#O X### X##",
+"#o X###X @##",
+"#o @##+ o###",
+"#O O### ####",
+"#o ###X +####",
+"#o.##. o#####",
+"#oo#X .######",
+"#ooo @######",
+"#O +#######",
+"#O X########",
+"#o @########",
+"#O O#########",
+"#o ##########",
+"#o ##########",
+"#oo##########",
+"#oo##########",
+"#+@##########"
+};
diff --git a/data/pixmaps/feta/10/flags-dgrace.xpm b/data/pixmaps/feta/10/flags-dgrace.xpm
new file mode 100644
index 0000000..d06508b
--- /dev/null
+++ b/data/pixmaps/feta/10/flags-dgrace.xpm
@@ -0,0 +1,27 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"23 13 8 1",
+" c #060606",
+". c Gray13",
+"X c #5b5b5b",
+"o c #6d6d6d",
+"O c Gray56",
+"+ c #b6b6b6",
+"@ c Gray85",
+"# c None",
+/* pixels */
+"#######################",
+"#+O####################",
+"#+ O##################",
+"###o O################",
+"####@o O##############",
+"######@o .O############",
+"########@X X@#########",
+"##########@O. X@#######",
+"#############O. o@#####",
+"###############O o####",
+"#################O o@#",
+"###################O +",
+"#####################O+"
+};
diff --git a/data/pixmaps/feta/10/flags-dstem.xpm b/data/pixmaps/feta/10/flags-dstem.xpm
new file mode 100644
index 0000000..e125c54
--- /dev/null
+++ b/data/pixmaps/feta/10/flags-dstem.xpm
@@ -0,0 +1,43 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"3 34 3 1",
+" c Gray45",
+". c #bebebe",
+"X c None",
+/* pixels */
+"XXX",
+"X..",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X.."
+};
diff --git a/data/pixmaps/feta/10/flags-stem.xpm b/data/pixmaps/feta/10/flags-stem.xpm
new file mode 100644
index 0000000..e125c54
--- /dev/null
+++ b/data/pixmaps/feta/10/flags-stem.xpm
@@ -0,0 +1,43 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"3 34 3 1",
+" c Gray45",
+". c #bebebe",
+"X c None",
+/* pixels */
+"XXX",
+"X..",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X.."
+};
diff --git a/data/pixmaps/feta/10/flags-u3.xpm b/data/pixmaps/feta/10/flags-u3.xpm
new file mode 100644
index 0000000..d5cc039
--- /dev/null
+++ b/data/pixmaps/feta/10/flags-u3.xpm
@@ -0,0 +1,45 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"12 31 8 1",
+" c #070707",
+". c Gray19",
+"X c #4c4c4c",
+"o c #747474",
+"O c #8e8e8e",
+"+ c #b4b4b4",
+"@ c Gray81",
+"# c None",
+/* pixels */
+"############",
+"#+@#########",
+"#oo#########",
+"#oo#########",
+"#o #########",
+"#o @########",
+"#O O########",
+"#O .########",
+"#o X#######",
+"#o +######",
+"#O .######",
+"#o.. o#####",
+"#oO@ @####",
+"#oo##X @###",
+"#oo###X o###",
+"#oo####X +##",
+"#oO##### ##",
+"#oo#####+ O#",
+"#oo######..#",
+"#oo######O #",
+"#oo####### O",
+"#@######## o",
+"########## o",
+"########## o",
+"#########@ +",
+"#########O #",
+"#########o #",
+"######### o#",
+"########@ @#",
+"########o.##",
+"########++##"
+};
diff --git a/data/pixmaps/feta/10/flags-u4.xpm b/data/pixmaps/feta/10/flags-u4.xpm
new file mode 100644
index 0000000..1991504
--- /dev/null
+++ b/data/pixmaps/feta/10/flags-u4.xpm
@@ -0,0 +1,50 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"12 36 8 1",
+" c #040404",
+". c #2f2f2f",
+"X c #4e4e4e",
+"o c #767676",
+"O c Gray55",
+"+ c #afafaf",
+"@ c Gray80",
+"# c None",
+/* pixels */
+"############",
+"#+@#########",
+"#oo#########",
+"#oo#########",
+"#o #########",
+"#O @########",
+"#O X########",
+"#o +#######",
+"#o .#######",
+"#O X######",
+"#o.. +#####",
+"#oo#X @####",
+"#o ##X @###",
+"#O @##X o###",
+"#O X###. +##",
+"#o +##+ .##",
+"#o ###O O#",
+"#o X### X#",
+"#ooo X##o @",
+"#oo#o +#O #",
+"#oo##+ @+ #",
+"#@@###+ .XX#",
+"#######+ O#",
+"########O @#",
+"######### .#",
+"#########O #",
+"########## O",
+"########## o",
+"########## o",
+"########## o",
+"#########+ @",
+"#########O #",
+"#########.X#",
+"########@ O#",
+"########+ ##",
+"########@+##"
+};
diff --git a/data/pixmaps/feta/10/flags-u5.xpm b/data/pixmaps/feta/10/flags-u5.xpm
new file mode 100644
index 0000000..6d9c5e5
--- /dev/null
+++ b/data/pixmaps/feta/10/flags-u5.xpm
@@ -0,0 +1,57 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"12 43 8 1",
+" c Gray2",
+". c #323232",
+"X c Gray31",
+"o c #747474",
+"O c #8e8e8e",
+"+ c Gray69",
+"@ c Gray80",
+"# c None",
+/* pixels */
+"############",
+"#+@#########",
+"#oo#########",
+"#oo#########",
+"#o #########",
+"#O @########",
+"#O X########",
+"#o @#######",
+"#O X#######",
+"#o +######",
+"#o.. @#####",
+"#oo#X @####",
+"#o ##. o####",
+"#O @##. +###",
+"#O X###. ###",
+"#o +##@ O##",
+"#O .###O ##",
+"#o X### +#",
+"#oX. X##oX#",
+"#oo#X o#OX#",
+"#o.##O @OX#",
+"#@X@##+ .+#",
+"##Xo###+ @#",
+"##o @###X @#",
+"##o .###@ o#",
+"##o .###X #",
+"##O X##O #",
+"###@. X#O #",
+"#####o @+ #",
+"######@ O#",
+"#######+ @#",
+"########@ o#",
+"#########X #",
+"#########@ @",
+"########## o",
+"########## o",
+"########## o",
+"#########@ +",
+"#########O #",
+"#########.X#",
+"########@ O#",
+"########O.##",
+"########@+##"
+};
diff --git a/data/pixmaps/feta/10/flags-u6.xpm b/data/pixmaps/feta/10/flags-u6.xpm
new file mode 100644
index 0000000..b096ee1
--- /dev/null
+++ b/data/pixmaps/feta/10/flags-u6.xpm
@@ -0,0 +1,67 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"12 53 8 1",
+" c #060606",
+". c Gray17",
+"X c #555555",
+"o c #727272",
+"O c #8d8d8d",
+"+ c #aeaeae",
+"@ c Gray84",
+"# c None",
+/* pixels */
+"############",
+"#+@#########",
+"#oo#########",
+"#oo#########",
+"#o #########",
+"#o @########",
+"#O o########",
+"#o @#######",
+"#o X#######",
+"#O +######",
+"#o. .@#####",
+"#oo#. X#####",
+"#o.#@. O####",
+"#o ###..####",
+"#O +##@ X###",
+"#O .###+ @##",
+"#o o###XX##",
+"#o +##@ @#",
+"#O .@##.O#",
+"#oO+ .@#OX#",
+"#oo#+. X#OX#",
+"#+X##@. +OX#",
+"##o+##@. @#",
+"##XX###@ @#",
+"##X @###o +#",
+"##o .@##@ X#",
+"##X o###X #",
+"##+. O##O @",
+"####. O#O #",
+"##+##O .#O #",
+"##O@##o ..X#",
+"##XO###o @#",
+"##X ####. @#",
+"##o o###+ o#",
+"##o o###..#",
+"##o .@##O #",
+"###O .@#O #",
+"####@. .#O.#",
+"######O ..O#",
+"#######o X##",
+"########o @#",
+"########@ o#",
+"#########X @",
+"#########@ O",
+"########## o",
+"########## o",
+"########## o",
+"#########@ +",
+"#########O #",
+"#########.X#",
+"########@ +#",
+"########O.##",
+"########@+##"
+};
diff --git a/data/pixmaps/feta/10/flags-ugrace.xpm b/data/pixmaps/feta/10/flags-ugrace.xpm
new file mode 100644
index 0000000..0ee0396
--- /dev/null
+++ b/data/pixmaps/feta/10/flags-ugrace.xpm
@@ -0,0 +1,28 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"21 14 8 1",
+" c #010101",
+". c #353535",
+"X c #4b4b4b",
+"o c Gray50",
+"O c #818181",
+"+ c #b7b7b7",
+"@ c Gray77",
+"# c None",
+/* pixels */
+"#####################",
+"###################o+",
+"#################+. +",
+"################X .@#",
+"##############o +###",
+"############@. o#####",
+"###########X .@######",
+"#########+ +########",
+"#######@. X##########",
+"######o .@###########",
+"####+ o#############",
+"##@. X###############",
+"#+ .@################",
+"#+O##################"
+};
diff --git a/data/pixmaps/feta/10/noteheads--1.xpm b/data/pixmaps/feta/10/noteheads--1.xpm
new file mode 100644
index 0000000..29ec696
--- /dev/null
+++ b/data/pixmaps/feta/10/noteheads--1.xpm
@@ -0,0 +1,26 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"24 12 8 1",
+" c #040404",
+". c #2f2f2f",
+"X c #484848",
+"o c #6f6f6f",
+"O c Gray55",
+"+ c #aaaaaa",
+"@ c #d5d5d5",
+"# c None",
+/* pixels */
+"########################",
+"##O######+oooOO@######O#",
+"#O O#@O. ooX o+##O O",
+"#O O@. o#####o o#O O",
+"#O X +######o XO O",
+"#O +######+ . O",
+"#O +#######. O",
+"#O .#######. X O",
+"#O X @######. XO O",
+"#O +@. .@####@ o#O O",
+"#O O#@O. ooX o+##O O",
+"##O######+Ooooo@######O#"
+};
diff --git a/data/pixmaps/feta/10/noteheads--1mensural.xpm b/data/pixmaps/feta/10/noteheads--1mensural.xpm
new file mode 100644
index 0000000..5300487
--- /dev/null
+++ b/data/pixmaps/feta/10/noteheads--1mensural.xpm
@@ -0,0 +1,31 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"21 17 8 1",
+" c Gray1",
+". c #2d2d2d",
+"X c Gray29",
+"o c Gray50",
+"O c #888888",
+"+ c #b9b9b9",
+"@ c #c0c0c0",
+"# c None",
+/* pixels */
+"#####################",
+"#@+################++",
+"#o.################.o",
+"#O oOooOoooooooooOo O",
+"#O O",
+"#O O",
+"#O O",
+"#O XOooooooooooOoOX O",
+"#O ################ O",
+"#O ################ O",
+"#O XOoOooooooooooOX O",
+"#O O",
+"#O O",
+"#O O",
+"#O oOoooOOooooOoooo O",
+"#o.################.o",
+"#@+################++"
+};
diff --git a/data/pixmaps/feta/10/noteheads--2mensural.xpm b/data/pixmaps/feta/10/noteheads--2mensural.xpm
new file mode 100644
index 0000000..5427bca
--- /dev/null
+++ b/data/pixmaps/feta/10/noteheads--2mensural.xpm
@@ -0,0 +1,40 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"22 26 8 1",
+" c #020202",
+". c Gray17",
+"X c Gray31",
+"o c Gray46",
+"O c #898989",
+"+ c Gray67",
+"@ c Gray77",
+"# c None",
+/* pixels */
+"######################",
+"#++################++#",
+"#o.################.o#",
+"#O oooooooooooooooo O#",
+"#O o#",
+"#O O#",
+"#O o#",
+"#O o++++++++++++++o O#",
+"#O ################ o#",
+"#O @##############@ o#",
+"#O .XXXXXXXXXXXXXX. O#",
+"#O o#",
+"#O o#",
+"#O o#",
+"#O +@@@@@@@@@@@@@@@ o#",
+"#oX################ o#",
+"##@################o #",
+"###################o #",
+"###################o #",
+"###################o #",
+"###################o #",
+"###################o @",
+"###################O O",
+"###################O O",
+"###################+ O",
+"####################O@"
+};
diff --git a/data/pixmaps/feta/10/noteheads--3mensural.xpm b/data/pixmaps/feta/10/noteheads--3mensural.xpm
new file mode 100644
index 0000000..2d5fb7b
--- /dev/null
+++ b/data/pixmaps/feta/10/noteheads--3mensural.xpm
@@ -0,0 +1,40 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"27 26 8 1",
+" c Gray1",
+". c Gray21",
+"X c #4e4e4e",
+"o c #727272",
+"O c Gray53",
+"+ c #a4a4a4",
+"@ c Gray77",
+"# c None",
+/* pixels */
+"###########################",
+"#++######################O#",
+"#O #####################O #",
+"#O ooooooooooooooooooooo. #",
+"#O #",
+"#O @",
+"#O #",
+"#O o++++++++++++++++++++. #",
+"#o #####################O #",
+"#o #####################o @",
+"#O .XXXXXXXXXXXXXXXXXXXX #",
+"#O #",
+"#O #",
+"#O #",
+"#o @@@@@@@@@@@@@@@@@@@+@o #",
+"#o.#####################o #",
+"##@#####################O #",
+"########################O #",
+"########################O #",
+"########################O #",
+"########################O #",
+"########################O @",
+"######################### O",
+"######################### O",
+"######################### o",
+"#########################O@"
+};
diff --git a/data/pixmaps/feta/10/noteheads-0.xpm b/data/pixmaps/feta/10/noteheads-0.xpm
new file mode 100644
index 0000000..7f9a2f4
--- /dev/null
+++ b/data/pixmaps/feta/10/noteheads-0.xpm
@@ -0,0 +1,26 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"21 12 8 1",
+" c #040404",
+". c Gray21",
+"X c Gray29",
+"o c Gray46",
+"O c #888888",
+"+ c Gray71",
+"@ c #c0c0c0",
+"# c None",
+/* pixels */
+"#####################",
+"########ooooOO#######",
+"####+o .oo. o+###",
+"###O +#####X o##",
+"##X #######X X#",
+"#@ #######O @",
+"#O ######## O",
+"#@ O####### @",
+"##X X####### X#",
+"###O X#####+ o##",
+"####+o .oo. o+###",
+"########OOOooo#######"
+};
diff --git a/data/pixmaps/feta/10/noteheads-0cross.xpm b/data/pixmaps/feta/10/noteheads-0cross.xpm
new file mode 100644
index 0000000..0bf41c8
--- /dev/null
+++ b/data/pixmaps/feta/10/noteheads-0cross.xpm
@@ -0,0 +1,27 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"18 13 8 1",
+" c Gray4",
+". c Gray20",
+"X c #4c4c4c",
+"o c Gray44",
+"O c #959595",
+"+ c Gray69",
+"@ c #d2d2d2",
+"# c None",
+/* pixels */
+"##################",
+"####@O#######O@###",
+"###O X@###@. O##",
+"##X @#X O#O X#@ X#",
+"#+ o###O +###o +",
+"##+. @###+###@ .+#",
+"####+ o#####o +###",
+"####O o#####X +###",
+"##+. @###+###@ .+#",
+"#+ o###+ +###o +",
+"##. @#X O#O X#@ X#",
+"###O X@###@. O##",
+"####@O#######O@###"
+};
diff --git a/data/pixmaps/feta/10/noteheads-0diamond.xpm b/data/pixmaps/feta/10/noteheads-0diamond.xpm
new file mode 100644
index 0000000..66aadda
--- /dev/null
+++ b/data/pixmaps/feta/10/noteheads-0diamond.xpm
@@ -0,0 +1,26 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"21 12 8 1",
+" c Gray2",
+". c #3c3c3c",
+"X c #444444",
+"o c Gray47",
+"O c #868686",
+"+ c #bcbcbc",
+"@ c #c1c1c1",
+"# c None",
+/* pixels */
+"#####################",
+"#########+OO+########",
+"########o o#######",
+"######+. .+#####",
+"###+o o##OX o+##",
+"#@ o####X @",
+"#O o####O O",
+"#@ X####o @",
+"###+o XO##o o+##",
+"######+. .@#####",
+"########o o#######",
+"#########+OO+########"
+};
diff --git a/data/pixmaps/feta/10/noteheads-0mensural.xpm b/data/pixmaps/feta/10/noteheads-0mensural.xpm
new file mode 100644
index 0000000..714443d
--- /dev/null
+++ b/data/pixmaps/feta/10/noteheads-0mensural.xpm
@@ -0,0 +1,24 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"11 12 6 1",
+" c Gray2",
+". c #313131",
+"X c #797979",
+"o c #898989",
+"O c #d3d3d3",
+"+ c None",
+/* pixels */
+"+++++++++++",
+"+++++OO++++",
+"+++++ .O+++",
+"++++. .+++",
+"+++..O .++",
+"++. O+X .+",
+"+o X++X o",
+"++. X+O .+",
+"+++. O..++",
+"++++. .O++",
+"+++++ ++++",
+"+++++OO++++"
+};
diff --git a/data/pixmaps/feta/10/noteheads-0slash.xpm b/data/pixmaps/feta/10/noteheads-0slash.xpm
new file mode 100644
index 0000000..7fcb3ba
--- /dev/null
+++ b/data/pixmaps/feta/10/noteheads-0slash.xpm
@@ -0,0 +1,34 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"30 21 7 1",
+" c Gray1",
+". c #484848",
+"X c Gray50",
+"o c Gray53",
+"O c #b7b7b7",
+"+ c #c8c8c8",
+"@ c None",
+/* pixels */
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@OXooooooooooooooo+",
+"@@@@@@@@@@@@ +",
+"@@@@@@@@@@@X O@",
+"@@@@@@@@@@@ .oXXXXXXXo .@@",
+"@@@@@@@@@@. .@@@@@@@@@O O@@",
+"@@@@@@@@@O O@@@@@@@@@ o@@@",
+"@@@@@@@@@. .@@@@@@@@@X @@@@",
+"@@@@@@@@X @@@@@@@@@O O@@@@",
+"@@@@@@@@ X@@@@@@@@@. .@@@@@",
+"@@@@@@@. @@@@@@@@@O O@@@@@",
+"@@@@@@O O@@@@@@@@@ .@@@@@@",
+"@@@@@@. .@@@@@@@@@o @@@@@@@",
+"@@@@@O O@@@@@@@@@ o@@@@@@@",
+"@@@@@ X@@@@@@@@@. .@@@@@@@@",
+"@@@@X @@@@@@@@@O O@@@@@@@@",
+"@@@O O@@@@@@@@@. .@@@@@@@@@",
+"@@@. oXXXXXXXo. @@@@@@@@@@",
+"@@O X@@@@@@@@@@",
+"@@ @@@@@@@@@@@",
+"@+ooooooooooooooooO@@@@@@@@@@@"
+};
diff --git a/data/pixmaps/feta/10/noteheads-0triangle.xpm b/data/pixmaps/feta/10/noteheads-0triangle.xpm
new file mode 100644
index 0000000..145bb09
--- /dev/null
+++ b/data/pixmaps/feta/10/noteheads-0triangle.xpm
@@ -0,0 +1,25 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"12 11 8 1",
+" c Gray2",
+". c Gray18",
+"X c Gray31",
+"o c #727272",
+"O c Gray53",
+"+ c Gray70",
+"@ c #cbcbcb",
+"# c None",
+/* pixels */
+"############",
+"######@#####",
+"#####@.@####",
+"#####X .####",
+"####+ + +###",
+"####.O#o.###",
+"###o ### o##",
+"### O###O ##",
+"##XX#####XX#",
+"#+ XOoOoOX +",
+"#+ooooooooo+"
+};
diff --git a/data/pixmaps/feta/10/noteheads-1.xpm b/data/pixmaps/feta/10/noteheads-1.xpm
new file mode 100644
index 0000000..08e9a2e
--- /dev/null
+++ b/data/pixmaps/feta/10/noteheads-1.xpm
@@ -0,0 +1,27 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"15 13 8 1",
+" c Gray1",
+". c #343434",
+"X c Gray29",
+"o c #777777",
+"O c #898989",
+"+ c #b7b7b7",
+"@ c #c3c3c3",
+"# c None",
+/* pixels */
+"###############",
+"########+OOo+##",
+"#####+. X#",
+"####X X@##.+",
+"###X +####oo",
+"##+ X######.o",
+"## +######X +",
+"#+ X######+ #",
+"#O.######X +#",
+"#oo####+ X##",
+"#+.##@X X###",
+"##. .+####",
+"###+oOO@#######"
+};
diff --git a/data/pixmaps/feta/10/noteheads-1cross.xpm b/data/pixmaps/feta/10/noteheads-1cross.xpm
new file mode 100644
index 0000000..95cf47c
--- /dev/null
+++ b/data/pixmaps/feta/10/noteheads-1cross.xpm
@@ -0,0 +1,27 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"16 13 8 1",
+" c #040404",
+". c Gray17",
+"X c #4b4b4b",
+"o c #676767",
+"O c Gray56",
+"+ c Gray68",
+"@ c Gray81",
+"# c None",
+/* pixels */
+"################",
+"####O#######O###",
+"##+. .@###@X .+#",
+"#+ O#o @#@ o#O +",
+"#@.o##O . O##o.+",
+"###. @#@o@#@ .##",
+"####+ o###o +###",
+"####O o###o O###",
+"###. @#@o@#@ .##",
+"#+.o##O . O##o.@",
+"#+ O#X @#@ o#O +",
+"##+. X@###@X .+#",
+"####O#######O###"
+};
diff --git a/data/pixmaps/feta/10/noteheads-1diamond.xpm b/data/pixmaps/feta/10/noteheads-1diamond.xpm
new file mode 100644
index 0000000..20b8850
--- /dev/null
+++ b/data/pixmaps/feta/10/noteheads-1diamond.xpm
@@ -0,0 +1,27 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"15 13 8 1",
+" c #070707",
+". c #343434",
+"X c #5b5b5b",
+"o c #676767",
+"O c #8d8d8d",
+"+ c #a4a4a4",
+"@ c #d0d0d0",
+"# c None",
+/* pixels */
+"###############",
+"############OO#",
+"#####@@###O O",
+"####. o",
+"###o .+#o #",
+"###o X@##+ +#",
+"###o .O###@ .##",
+"###. @###+ o##",
+"##+ +##@X o##",
+"## o#+. o##",
+"#O .###",
+"#o O###@@####",
+"##OO###########"
+};
diff --git a/data/pixmaps/feta/10/noteheads-1mensural.xpm b/data/pixmaps/feta/10/noteheads-1mensural.xpm
new file mode 100644
index 0000000..714443d
--- /dev/null
+++ b/data/pixmaps/feta/10/noteheads-1mensural.xpm
@@ -0,0 +1,24 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"11 12 6 1",
+" c Gray2",
+". c #313131",
+"X c #797979",
+"o c #898989",
+"O c #d3d3d3",
+"+ c None",
+/* pixels */
+"+++++++++++",
+"+++++OO++++",
+"+++++ .O+++",
+"++++. .+++",
+"+++..O .++",
+"++. O+X .+",
+"+o X++X o",
+"++. X+O .+",
+"+++. O..++",
+"++++. .O++",
+"+++++ ++++",
+"+++++OO++++"
+};
diff --git a/data/pixmaps/feta/10/noteheads-1slash.xpm b/data/pixmaps/feta/10/noteheads-1slash.xpm
new file mode 100644
index 0000000..15bfa90
--- /dev/null
+++ b/data/pixmaps/feta/10/noteheads-1slash.xpm
@@ -0,0 +1,34 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"26 21 7 1",
+" c Gray1",
+". c #484848",
+"X c Gray50",
+"o c #868686",
+"O c #b7b7b7",
+"+ c #c8c8c8",
+"@ c None",
+/* pixels */
+"@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@OXooooooooooo+",
+"@@@@@@@@@@@@ @",
+"@@@@@@@@@@@X O@",
+"@@@@@@@@@@@ .oXXXo .@@",
+"@@@@@@@@@@. .@@@@@O O@@",
+"@@@@@@@@@O O@@@@@ X@@@",
+"@@@@@@@@@. .@@@@@X @@@@",
+"@@@@@@@@X @@@@@O O@@@@",
+"@@@@@@@@ X@@@@@. .@@@@@",
+"@@@@@@@. @@@@@O O@@@@@",
+"@@@@@@O O@@@@@ .@@@@@@",
+"@@@@@@. .@@@@@X @@@@@@@",
+"@@@@@O O@@@@@ o@@@@@@@",
+"@@@@@ X@@@@@. .@@@@@@@@",
+"@@@@X @@@@@O O@@@@@@@@",
+"@@@O O@@@@@. .@@@@@@@@@",
+"@@@. oXXXo. @@@@@@@@@@",
+"@@O X@@@@@@@@@@",
+"@@ @@@@@@@@@@@",
+"@+oooooooooooo+@@@@@@@@@@@"
+};
diff --git a/data/pixmaps/feta/10/noteheads-1triangle.xpm b/data/pixmaps/feta/10/noteheads-1triangle.xpm
new file mode 100644
index 0000000..b5c2fa2
--- /dev/null
+++ b/data/pixmaps/feta/10/noteheads-1triangle.xpm
@@ -0,0 +1,25 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"11 11 8 1",
+" c Gray3",
+". c Gray15",
+"X c #4b4b4b",
+"o c Gray46",
+"O c Gray55",
+"+ c Gray70",
+"@ c Gray83",
+"# c None",
+/* pixels */
+"###########",
+"#####@@####",
+"#####oo####",
+"####@..####",
+"####XooX###",
+"###@ ## @##",
+"###Xo##XX##",
+"##O.####.O#",
+"##.O####O.#",
+"#+ +",
+"#+oOOOOOOo+"
+};
diff --git a/data/pixmaps/feta/10/noteheads-2.xpm b/data/pixmaps/feta/10/noteheads-2.xpm
new file mode 100644
index 0000000..3757439
--- /dev/null
+++ b/data/pixmaps/feta/10/noteheads-2.xpm
@@ -0,0 +1,25 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"14 12 7 1",
+" c #020202",
+". c #323232",
+"X c Gray42",
+"o c Gray52",
+"O c Gray69",
+"+ c Gray84",
+"@ c None",
+/* pixels */
+"@@@@@@@@@@@@@@",
+"@@@@@@@+oooO@@",
+"@@@@@O. .@",
+"@@@@X O",
+"@@@. o",
+"@@X o",
+"@+ +",
+"@o X@",
+"@o .@@",
+"@O X@@@",
+"@@. .O@@@@",
+"@@@Oooo+@@@@@@"
+};
diff --git a/data/pixmaps/feta/10/noteheads-2cross.xpm b/data/pixmaps/feta/10/noteheads-2cross.xpm
new file mode 100644
index 0000000..28aa584
--- /dev/null
+++ b/data/pixmaps/feta/10/noteheads-2cross.xpm
@@ -0,0 +1,25 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"14 12 7 1",
+" c #090909",
+". c #272727",
+"X c #505050",
+"o c #959595",
+"O c #b1b1b1",
+"+ c #d2d2d2",
+"@ c None",
+/* pixels */
+"@@@@@@@@@@@@@@",
+"@++@@@@@@@@@++",
+"@+ X@@@@@@@X O",
+"@@o X+@@@+X O@",
+"@@@@. +@+ .@@@",
+"@@@@@..o..@@@@",
+"@@@@@@X .@@@@@",
+"@@@@@. o..@@@@",
+"@@@@. +@+ .@@@",
+"@@o X+@@@+X O@",
+"@O X@@@@@@@X O",
+"@++@@@@@@@@@++"
+};
diff --git a/data/pixmaps/feta/10/noteheads-2diamond.xpm b/data/pixmaps/feta/10/noteheads-2diamond.xpm
new file mode 100644
index 0000000..ab0ecc8
--- /dev/null
+++ b/data/pixmaps/feta/10/noteheads-2diamond.xpm
@@ -0,0 +1,27 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"14 13 8 1",
+" c #020202",
+". c Gray16",
+"X c Gray37",
+"o c Gray",
+"O c #8d8d8d",
+"+ c #b2b2b2",
+"@ c #d8d8d8",
+"# c None",
+/* pixels */
+"##############",
+"######@o@#####",
+"######. .O. +",
+"#####O o",
+"#####. +",
+"####@ +#",
+"####X O##",
+"###O X###",
+"##+ @###",
+"#+ .####",
+"#o O####",
+"#+ .O. .@####",
+"######@o@#####"
+};
diff --git a/data/pixmaps/feta/10/noteheads-2mensural.xpm b/data/pixmaps/feta/10/noteheads-2mensural.xpm
new file mode 100644
index 0000000..94133ba
--- /dev/null
+++ b/data/pixmaps/feta/10/noteheads-2mensural.xpm
@@ -0,0 +1,23 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"11 12 5 1",
+" c #040404",
+". c Gray20",
+"X c #898989",
+"o c Gray84",
+"O c None",
+/* pixels */
+"OOOOOOOOOOO",
+"OOOOOooOOOO",
+"OOOOO .oOOO",
+"OOOO. .OOO",
+"OOO. .OO",
+"OO. .O",
+"OX X",
+"OO. .O",
+"OOO. .OO",
+"OOOO. .OOO",
+"OOOOO OOOO",
+"OOOOOooOOOO"
+};
diff --git a/data/pixmaps/feta/10/noteheads-2slash.xpm b/data/pixmaps/feta/10/noteheads-2slash.xpm
new file mode 100644
index 0000000..0c7022e
--- /dev/null
+++ b/data/pixmaps/feta/10/noteheads-2slash.xpm
@@ -0,0 +1,35 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"18 21 8 1",
+" c Gray1",
+". c #313131",
+"X c Gray29",
+"o c #727272",
+"O c #8d8d8d",
+"+ c #acacac",
+"@ c Gray82",
+"# c None",
+/* pixels */
+"##################",
+"############+OOOO@",
+"###########+ @",
+"###########. +#",
+"##########+ .##",
+"#########@. +##",
+"#########o o###",
+"########@. @###",
+"########X O####",
+"#######+ .#####",
+"#######. O#####",
+"######O .######",
+"######. @######",
+"#####O X#######",
+"####@ @#######",
+"####o O########",
+"###+ .@########",
+"###. +#########",
+"##+ .##########",
+"#@ +##########",
+"#@OOOOO###########"
+};
diff --git a/data/pixmaps/feta/10/noteheads-2triangle.xpm b/data/pixmaps/feta/10/noteheads-2triangle.xpm
new file mode 100644
index 0000000..322a1b5
--- /dev/null
+++ b/data/pixmaps/feta/10/noteheads-2triangle.xpm
@@ -0,0 +1,25 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"11 11 8 1",
+" c Gray1",
+". c #343434",
+"X c #5a5a5a",
+"o c #797979",
+"O c Gray54",
+"+ c #aeaeae",
+"@ c #d7d7d7",
+"# c None",
+/* pixels */
+"###########",
+"#####@@####",
+"#####oo####",
+"####@ .@###",
+"####X X###",
+"###@ @##",
+"###X X##",
+"##+ +#",
+"##. .#",
+"#+ +",
+"#+oOOOOOOo+"
+};
diff --git a/data/pixmaps/feta/10/noteheads-2xcircle.xpm b/data/pixmaps/feta/10/noteheads-2xcircle.xpm
new file mode 100644
index 0000000..d2198dd
--- /dev/null
+++ b/data/pixmaps/feta/10/noteheads-2xcircle.xpm
@@ -0,0 +1,25 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"14 13 6 1",
+" c #0e0e0e",
+". c Gray17",
+"X c Gray26",
+"o c #6f6f6f",
+"O c #afafaf",
+"+ c None",
+/* pixels */
+"++++++++++++++",
+"+++++OoooO++++",
+"+++O. ooo .O++",
+"++O .+++++. O+",
+"++ O.o+++o.O +",
+"+oX++ o+o ++Xo",
+"+oo+++...+++oo",
+"+oo+++...+++oo",
+"+oX++ o+o ++.o",
+"++ O.o+++o.O +",
+"++O .+++++. O+",
+"+++O. ooo .O++",
+"+++++OoooO++++"
+};
diff --git a/data/pixmaps/feta/10/noteheads-ledgerending.xpm b/data/pixmaps/feta/10/noteheads-ledgerending.xpm
new file mode 100644
index 0000000..7c628f5
--- /dev/null
+++ b/data/pixmaps/feta/10/noteheads-ledgerending.xpm
@@ -0,0 +1,14 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"12 4 4 1",
+" c #010101",
+". c Gray55",
+"X c #cbcbcb",
+"o c None",
+/* pixels */
+"oooooooooooo",
+"oX.........X",
+"o. .",
+"oX.........X"
+};
diff --git a/data/pixmaps/feta/10/rests--1.xpm b/data/pixmaps/feta/10/rests--1.xpm
new file mode 100644
index 0000000..b648e68
--- /dev/null
+++ b/data/pixmaps/feta/10/rests--1.xpm
@@ -0,0 +1,22 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"7 11 5 1",
+" c Gray1",
+". c Gray47",
+"X c #808080",
+"o c #bbbbbb",
+"O c None",
+/* pixels */
+"OOOOOOO",
+"Oo.X..o",
+"O. .",
+"O. .",
+"O. .",
+"O. .",
+"O. .",
+"O. .",
+"O. .",
+"O. .",
+"Oo.XX.o"
+};
diff --git a/data/pixmaps/feta/10/rests--1o.xpm b/data/pixmaps/feta/10/rests--1o.xpm
new file mode 100644
index 0000000..25ba215
--- /dev/null
+++ b/data/pixmaps/feta/10/rests--1o.xpm
@@ -0,0 +1,22 @@
+/* XPM */
+static char * rests__1o_xpm[] = {
+"19 11 8 1",
+" c None",
+". c #898989",
+"+ c #808080",
+"@ c #787878",
+"# c #020202",
+"$ c #030303",
+"% c #343434",
+"& c #626262",
+" ",
+" .......+@....... ",
+" .#######$$#######.",
+" .....%#$$#%...&. ",
+" @$$$$@ ",
+" @$$$$@ ",
+" @$$$$@ ",
+" @$$$$@ ",
+" ..&..%#$$#%..... ",
+" .#######$$#######.",
+" .......++....... "};
diff --git a/data/pixmaps/feta/10/rests--2.xpm b/data/pixmaps/feta/10/rests--2.xpm
new file mode 100644
index 0000000..14b76bb
--- /dev/null
+++ b/data/pixmaps/feta/10/rests--2.xpm
@@ -0,0 +1,32 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"7 21 5 1",
+" c #020202",
+". c Gray48",
+"X c #8b8b8b",
+"o c #c1c1c1",
+"O c None",
+/* pixels */
+"OOOOOOO",
+"Oo.XX.o",
+"O. .",
+"O. .",
+"O. .",
+"O. .",
+"O. .",
+"O. .",
+"O. .",
+"O. .",
+"O. .",
+"O. .",
+"O. .",
+"O. .",
+"O. .",
+"O. .",
+"O. .",
+"O. .",
+"O. .",
+"O. .",
+"Oo.XX.o"
+};
diff --git a/data/pixmaps/feta/10/rests--4.xpm b/data/pixmaps/feta/10/rests--4.xpm
new file mode 100644
index 0000000..69215c7
--- /dev/null
+++ b/data/pixmaps/feta/10/rests--4.xpm
@@ -0,0 +1,33 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"78 21 6 1",
+" c Gray2",
+". c #6f6f6f",
+"X c #898989",
+"o c #b9b9b9",
+"O c #c0c0c0",
+"+ c None",
+/* pixels */
+"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
+"+Oo+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++oo",
+"+..+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++..",
+"+..+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++..",
+"+..+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++..",
+"+..+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++..",
+"+..+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++..",
+"+..+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++..",
+"+X X",
+"+X X",
+"+X X",
+"+X X",
+"+X X",
+"+X X",
+"+..+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++..",
+"+..+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++..",
+"+..+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++..",
+"+..+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++..",
+"+..+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++..",
+"+..+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++..",
+"+Oo+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++oO"
+};
diff --git a/data/pixmaps/feta/10/rests-0.xpm b/data/pixmaps/feta/10/rests-0.xpm
new file mode 100644
index 0000000..ad191b0
--- /dev/null
+++ b/data/pixmaps/feta/10/rests-0.xpm
@@ -0,0 +1,19 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"16 8 5 1",
+" c #020202",
+". c Gray49",
+"X c Gray53",
+"o c #c5c5c5",
+"O c None",
+/* pixels */
+"OOOOOOOOOOOOOOOO",
+"Oo.XXXXXXXXXXX.o",
+"OX X",
+"OX X",
+"OX X",
+"OX X",
+"OX X",
+"Oo.XXXXXXXXXXX.o"
+};
diff --git a/data/pixmaps/feta/10/rests-0o.xpm b/data/pixmaps/feta/10/rests-0o.xpm
new file mode 100644
index 0000000..1a6dff7
--- /dev/null
+++ b/data/pixmaps/feta/10/rests-0o.xpm
@@ -0,0 +1,22 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"28 9 7 1",
+" c #020202",
+". c #343434",
+"X c Gray37",
+"o c #626262",
+"O c #898989",
+"+ c Gray71",
+"@ c None",
+/* pixels */
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@OOOOOOOOOOOOOOOOOOOOOOOOO@",
+"@O O",
+"@@OOOOO. .OOOoO@",
+"@@@@@@@X X@@@@@@",
+"@@@@@@@X X@@@@@@",
+"@@@@@@@X X@@@@@@",
+"@@@@@@@X X@@@@@@",
+"@@@@@@@+OOOOOOOOOOOOO+@@@@@@"
+};
diff --git a/data/pixmaps/feta/10/rests-1.xpm b/data/pixmaps/feta/10/rests-1.xpm
new file mode 100644
index 0000000..ad191b0
--- /dev/null
+++ b/data/pixmaps/feta/10/rests-1.xpm
@@ -0,0 +1,19 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"16 8 5 1",
+" c #020202",
+". c Gray49",
+"X c Gray53",
+"o c #c5c5c5",
+"O c None",
+/* pixels */
+"OOOOOOOOOOOOOOOO",
+"Oo.XXXXXXXXXXX.o",
+"OX X",
+"OX X",
+"OX X",
+"OX X",
+"OX X",
+"Oo.XXXXXXXXXXX.o"
+};
diff --git a/data/pixmaps/feta/10/rests-1o.xpm b/data/pixmaps/feta/10/rests-1o.xpm
new file mode 100644
index 0000000..692ce0a
--- /dev/null
+++ b/data/pixmaps/feta/10/rests-1o.xpm
@@ -0,0 +1,22 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"28 9 7 1",
+" c #020202",
+". c #343434",
+"X c Gray37",
+"o c #626262",
+"O c #898989",
+"+ c Gray71",
+"@ c None",
+/* pixels */
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@+OOOOOOOOOOOOO+@@@@@@",
+"@@@@@@@X X@@@@@@",
+"@@@@@@@o o@@@@@@",
+"@@@@@@@X X@@@@@@",
+"@@@@@@@X X@@@@@@",
+"@@OOoOO. .OOOOO@",
+"@O O",
+"@@OOOOOOOOOOOOOOOOOOOOOOOOO@"
+};
diff --git a/data/pixmaps/feta/10/rests-2.xpm b/data/pixmaps/feta/10/rests-2.xpm
new file mode 100644
index 0000000..06b6e7e
--- /dev/null
+++ b/data/pixmaps/feta/10/rests-2.xpm
@@ -0,0 +1,43 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"11 29 8 1",
+" c Gray2",
+". c #2f2f2f",
+"X c #505050",
+"o c #717171",
+"O c #8e8e8e",
+"+ c #b1b1b1",
+"@ c Gray80",
+"# c None",
+/* pixels */
+"###########",
+"###@O######",
+"#### o#####",
+"#####.@####",
+"#####@ @###",
+"######. @##",
+"######X X##",
+"######. O#",
+"#####+ +",
+"####@ o",
+"###O @",
+"##o @#",
+"#O +##",
+"#O +###",
+"## o####",
+"##@ @####",
+"###@ @####",
+"####+ +####",
+"##@+@X.####",
+"#@ . X###",
+"#o X##",
+"#o oo. +#",
+"#+ O###+ #",
+"## .#####@#",
+"##X #######",
+"##O.#######",
+"###.@######",
+"###OX######",
+"####+######"
+};
diff --git a/data/pixmaps/feta/10/rests-2mensural.xpm b/data/pixmaps/feta/10/rests-2mensural.xpm
new file mode 100644
index 0000000..6821a1a
--- /dev/null
+++ b/data/pixmaps/feta/10/rests-2mensural.xpm
@@ -0,0 +1,22 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"9 9 7 1",
+" c #040404",
+". c #2f2f2f",
+"X c #747474",
+"o c #898989",
+"O c #aeaeae",
+"+ c #c3c3c3",
+"@ c None",
+/* pixels */
+"@@@@@@@@@",
+"@@X+@@@@@",
+"@X X+@@",
+"@X . O",
+"@X O@@@@@",
+"@o O@@@@@",
+"@o O@@@@@",
+"@@o@@@@@@"
+};
diff --git a/data/pixmaps/feta/10/rests-3.xpm b/data/pixmaps/feta/10/rests-3.xpm
new file mode 100644
index 0000000..1b3ee77
--- /dev/null
+++ b/data/pixmaps/feta/10/rests-3.xpm
@@ -0,0 +1,33 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"15 19 8 1",
+" c Gray1",
+". c #313131",
+"X c #515151",
+"o c #747474",
+"O c Gray56",
+"+ c #b1b1b1",
+"@ c #d3d3d3",
+"# c None",
+/* pixels */
+"###############",
+"###+o+#########",
+"##. X######O+",
+"#+ +##### O",
+"#O o####O #",
+"#@ o@@+. X#",
+"##o O#",
+"###+.....o@o ##",
+"###########.X##",
+"##########O O##",
+"##########X.###",
+"#########@ o###",
+"#########o @###",
+"#########..####",
+"########O O####",
+"########X @####",
+"#######@ .#####",
+"#######o o#####",
+"########O######"
+};
diff --git a/data/pixmaps/feta/10/rests-3mensural.xpm b/data/pixmaps/feta/10/rests-3mensural.xpm
new file mode 100644
index 0000000..696fd1b
--- /dev/null
+++ b/data/pixmaps/feta/10/rests-3mensural.xpm
@@ -0,0 +1,22 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"9 9 7 1",
+" c Gray2",
+". c Gray19",
+"X c #747474",
+"o c #848484",
+"O c #aeaeae",
+"+ c #c8c8c8",
+"@ c None",
+/* pixels */
+"@@@@@@@@@",
+"@@@@@@+X@",
+"@@@+X X",
+"@+ . X",
+"@+..o@O o",
+"@@@@@@O X",
+"@@@@@@O o",
+"@@@@@@O X",
+"@@@@@@@o@"
+};
diff --git a/data/pixmaps/feta/10/rests-4.xpm b/data/pixmaps/feta/10/rests-4.xpm
new file mode 100644
index 0000000..e787b4e
--- /dev/null
+++ b/data/pixmaps/feta/10/rests-4.xpm
@@ -0,0 +1,43 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"16 29 8 1",
+" c Gray2",
+". c Gray20",
+"X c Gray32",
+"o c Gray44",
+"O c Gray56",
+"+ c Gray69",
+"@ c #d2d2d2",
+"# c None",
+/* pixels */
+"################",
+"#####@OO@#######",
+"####O O####++",
+"####. #### o",
+"###@ @### @",
+"####. @#@X #",
+"####O o#",
+"#####+. X+.O#",
+"############+ @#",
+"############XX##",
+"############ o##",
+"##+. X@####+ @##",
+"#@ .####o.###",
+"#O +### X###",
+"#o +##+ O###",
+"## oOX @###",
+"##+ X####",
+"###@oOOo+@ X####",
+"#########+ @####",
+"#########. #####",
+"######### X#####",
+"########+ O#####",
+"########X @#####",
+"######## .######",
+"#######@ O######",
+"#######X @######",
+"####### @######",
+"######@ X#######",
+"#######+@#######"
+};
diff --git a/data/pixmaps/feta/10/rests-4mensural.xpm b/data/pixmaps/feta/10/rests-4mensural.xpm
new file mode 100644
index 0000000..dfcaac0
--- /dev/null
+++ b/data/pixmaps/feta/10/rests-4mensural.xpm
@@ -0,0 +1,25 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"9 11 8 1",
+" c #060606",
+". c #252525",
+"X c Gray29",
+"o c #767676",
+"O c #888888",
+"+ c #acacac",
+"@ c Gray82",
+"# c None",
+/* pixels */
+"#########",
+"######@o#",
+"####@X O",
+"###O o",
+"#@ oO o",
+"#@.o@#X o",
+"###@o o",
+"##o .. o",
+"#O .o#+ o",
+"#@o###+ O",
+"#######O#"
+};
diff --git a/data/pixmaps/feta/10/rests-5.xpm b/data/pixmaps/feta/10/rests-5.xpm
new file mode 100644
index 0000000..aa1a2eb
--- /dev/null
+++ b/data/pixmaps/feta/10/rests-5.xpm
@@ -0,0 +1,52 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"18 38 8 1",
+" c #060606",
+". c Gray19",
+"X c #4c4c4c",
+"o c Gray45",
+"O c #8d8d8d",
+"+ c #b4b4b4",
+"@ c #cecece",
+"# c None",
+/* pixels */
+"##################",
+"#######@Oo@#######",
+"######O O####++",
+"######. ####.o",
+"#####@ @### @",
+"######. +#+. #",
+"######O ..#",
+"#######+. . [email protected]#",
+"############### +#",
+"##############O @#",
+"######@@######O.##",
+"####O o##### X##",
+"###@ +####.+##",
+"###o .###O @##",
+"###o X##@X.###",
+"#### XX o###",
+"####+. X +###",
+"######+++++#+ @###",
+"############X ####",
+"############.X####",
+"##@o.O#####@ o####",
+"##. X####+ @####",
+"#O @###X #####",
+"#o +### X#####",
+"#@ o@O o#####",
+"##o . @#####",
+"###@XXXXo@X ######",
+"##########.X######",
+"#########@ o######",
+"#########O @######",
+"#########X @######",
+"######### .#######",
+"########@ X#######",
+"########O +#######",
+"########X @#######",
+"######## .########",
+"#######@ X########",
+"########O@########"
+};
diff --git a/data/pixmaps/feta/10/rests-6.xpm b/data/pixmaps/feta/10/rests-6.xpm
new file mode 100644
index 0000000..f50bcb3
--- /dev/null
+++ b/data/pixmaps/feta/10/rests-6.xpm
@@ -0,0 +1,62 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"20 48 8 1",
+" c Gray2",
+". c #373737",
+"X c #494949",
+"o c #797979",
+"O c #868686",
+"+ c #b9b9b9",
+"@ c Gray77",
+"# c None",
+/* pixels */
+"####################",
+"#########+oO########",
+"########X +####++",
+"#######+ X####.o",
+"#######O #### +",
+"#######+ ##+. #",
+"########X . #",
+"#########O X@oX#",
+"################# O#",
+"################# ##",
+"################o ##",
+"######@. o#####o.##",
+"###### O#### o##",
+"#####O #### o##",
+"#####o ###X ###",
+"###### oo ###",
+"######+ X..###",
+"########OoooO## o###",
+"############### +###",
+"##############o ####",
+"#####+oO######o ####",
+"####X +#### o####",
+"###+ X#### o####",
+"###O ###o +####",
+"###+ ##o #####",
+"####X #####",
+"#####o o+ o#####",
+"############+ O#####",
+"############o ######",
+"############o ######",
+"##@. .+##### .######",
+"## ##### o######",
+"#O O###O O######",
+"#O o###X #######",
+"## XOo #######",
+"##+ X X#######",
+"####OooOO#+ o#######",
+"##########o +#######",
+"##########X ########",
+"########## ########",
+"########## o########",
+"#########O O########",
+"#########o +########",
+"######### #########",
+"######### #########",
+"########+ o#########",
+"########O O#########",
+"#########O##########"
+};
diff --git a/data/pixmaps/feta/10/rests-7.xpm b/data/pixmaps/feta/10/rests-7.xpm
new file mode 100644
index 0000000..8e3f578
--- /dev/null
+++ b/data/pixmaps/feta/10/rests-7.xpm
@@ -0,0 +1,71 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"22 57 8 1",
+" c Gray2",
+". c #2f2f2f",
+"X c #4e4e4e",
+"o c Gray45",
+"O c #8b8b8b",
+"+ c #afafaf",
+"@ c #d2d2d2",
+"# c None",
+/* pixels */
+"######################",
+"###########+OO########",
+"##########X +####++",
+"#########+ X####.o",
+"#########o #### @",
+"#########@ @#+. #",
+"##########X . #",
+"###########O. . .o@oX#",
+"################### O#",
+"##################@ ##",
+"##########@@######o ##",
+"########+. X#####o.##",
+"#######@ o####.o##",
+"#######o ###@ O##",
+"#######O ##@. ###",
+"########. XX ###",
+"########@. Oo.###",
+"##########+++++## o###",
+"################@ @###",
+"################o ####",
+"#######O.X@#####o ####",
+"######. +####.O####",
+"#####+ .#### o####",
+"#####o ###O @####",
+"#####@ @@X #####",
+"######o .#####",
+"#######+X....+@ o#####",
+"##############@ O#####",
+"##############o ######",
+"#####@+@######X ######",
+"####O O##### o######",
+"###@ @#### o######",
+"###O o###O +######",
+"###+ O##+. #######",
+"####. .. #######",
+"####@X .O X#######",
+"######@@@@@#@ o#######",
+"############o @#######",
+"############X ########",
+"##@o o@##### .########",
+"## .##### o########",
+"#O O###O o########",
+"#O o###X @########",
+"#@ X+O. #########",
+"##O . .#########",
+"###@ooXoo@@ O#########",
+"##########o +#########",
+"##########X ##########",
+"########## ##########",
+"########## o##########",
+"#########O O##########",
+"#########o +##########",
+"######### ###########",
+"######### ###########",
+"########+ o###########",
+"########O O###########",
+"#########O############"
+};
diff --git a/data/pixmaps/feta/10/scripts-arpeggio.xpm b/data/pixmaps/feta/10/scripts-arpeggio.xpm
new file mode 100644
index 0000000..90084ac
--- /dev/null
+++ b/data/pixmaps/feta/10/scripts-arpeggio.xpm
@@ -0,0 +1,29 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"10 15 8 1",
+" c Gray2",
+". c #2c2c2c",
+"X c Gray32",
+"o c #7b7b7b",
+"O c #8b8b8b",
+"+ c Gray67",
+"@ c #cdcdcd",
+"# c None",
+/* pixels */
+"##########",
+"###o######",
+"###X.+####",
+"####X +###",
+"##### X##",
+"##### .@",
+"####O +",
+"###o o#",
+"#@. .@##",
+"#O .@###",
+"##. o####",
+"###. O####",
+"####O @###",
+"#####+ +##",
+"######++##"
+};
diff --git a/data/pixmaps/feta/10/scripts-coda.xpm b/data/pixmaps/feta/10/scripts-coda.xpm
new file mode 100644
index 0000000..29f1125
--- /dev/null
+++ b/data/pixmaps/feta/10/scripts-coda.xpm
@@ -0,0 +1,42 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"22 29 7 1",
+" c #0b0b0b",
+". c #353535",
+"X c #535353",
+"o c Gray45",
+"O c Gray53",
+"+ c Gray72",
+"@ c None",
+/* pixels */
+"@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@O@@@@@@@@@@",
+"@@@@@@@@@@@ @@@@@@@@@@",
+"@@@@@@@@@@@ @@@@@@@@@@",
+"@@@@@@@@@@@ @@@@@@@@@@",
+"@@@@@@@@@@o X@@@@@@@@@",
+"@@@@@@@@o X X o@@@@@@@",
+"@@@@@@@X +@ @+ X@@@@@@",
+"@@@@@@o @@ @@ o@@@@@",
+"@@@@@@ o@@ @@o @@@@@",
+"@@@@@+ O@@ @@o +@@@@",
+"@@@@@o O@@ @@o o@@@@",
+"@@@@@ o@@.+@o @@@@",
+"@@@@@ o@@ @@o @@@@",
+"@+XoX .oX Xo. ooX+",
+"@+XoX .oo Xo. ooX+",
+"@@@@@ O@@ @@o @@@@",
+"@@@@@ o@@ @@o @@@@",
+"@@@@@o o@@.@@o o@@@@",
+"@@@@@+ o@@ +@O +@@@@",
+"@@@@@@ o@@ @@o @@@@@",
+"@@@@@@o @@ @@ O@@@@@",
+"@@@@@@@X +@ @+ X@@@@@@",
+"@@@@@@@@o X X o@@@@@@@",
+"@@@@@@@@@@o X@@@@@@@@@",
+"@@@@@@@@@@@ @@@@@@@@@@",
+"@@@@@@@@@@@ @@@@@@@@@@",
+"@@@@@@@@@@@ @@@@@@@@@@",
+"@@@@@@@@@@@O@@@@@@@@@@"
+};
diff --git a/data/pixmaps/feta/10/scripts-dfermata.xpm b/data/pixmaps/feta/10/scripts-dfermata.xpm
new file mode 100644
index 0000000..80cca28
--- /dev/null
+++ b/data/pixmaps/feta/10/scripts-dfermata.xpm
@@ -0,0 +1,29 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"27 16 7 1",
+" c #040404",
+". c Gray17",
+"X c #767676",
+"o c #909090",
+"O c #afafaf",
+"+ c Gray83",
+"@ c None",
+/* pixels */
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@+O@@@@@@@@@OXXO@@@@@@@@@O+",
+"@o @@@@@@@@O O@@@@@@@@ o",
+"@+ +@@@@@@@o X@@@@@@@+ O",
+"@@ X@@@@@@@o o@@@@@@@X @",
+"@@X.@@@@@@@@X X@@@@@@@@.X@",
+"@@+ o@@@@@@@@++@@@@@@@@o +@",
+"@@@. +@@@@@@@@@@@@@@@@+ .@@",
+"@@@o .+@@@@@@@@@@@@@@+. o@@",
+"@@@@. .+@@@@@@@@@@@@+. .@@@",
+"@@@@+ X+@@@@@@@@+X +@@@",
+"@@@@@o .OOOOOO. o@@@@",
+"@@@@@@o o@@@@@",
+"@@@@@@@O. .O@@@@@@",
+"@@@@@@@@@X X@@@@@@@@",
+"@@@@@@@@@@@OXooXO@@@@@@@@@@"
+};
diff --git a/data/pixmaps/feta/10/scripts-dmarcato.xpm b/data/pixmaps/feta/10/scripts-dmarcato.xpm
new file mode 100644
index 0000000..f153ace
--- /dev/null
+++ b/data/pixmaps/feta/10/scripts-dmarcato.xpm
@@ -0,0 +1,25 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"12 12 7 1",
+" c Gray2",
+". c #313131",
+"X c #6d6d6d",
+"o c #8e8e8e",
+"O c Gray68",
+"+ c #d0d0d0",
+"@ c None",
+/* pixels */
+"@@@@@@@@@@@@",
+"@+XoX+@@@@OO",
+"@o .@@@@.X",
+"@@ +@@O @",
+"@@o X@@.o@",
+"@@@. @o.@@",
+"@@@o X.o@@",
+"@@@@. .@@@",
+"@@@@O O@@@",
+"@@@@@. .@@@@",
+"@@@@@O O@@@@",
+"@@@@@@o@@@@@"
+};
diff --git a/data/pixmaps/feta/10/scripts-downbow.xpm b/data/pixmaps/feta/10/scripts-downbow.xpm
new file mode 100644
index 0000000..84313e8
--- /dev/null
+++ b/data/pixmaps/feta/10/scripts-downbow.xpm
@@ -0,0 +1,27 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"16 14 7 1",
+" c Gray1",
+". c Gray26",
+"X c #717171",
+"o c Gray52",
+"O c Gray71",
+"+ c Gray78",
+"@ c None",
+/* pixels */
+"@@@@@@@@@@@@@@@@",
+"@+XoXoooooXoooX+",
+"@o o",
+"@o o",
+"@o o",
+"@o o",
+"@X.+OOOOOOOOO+.X",
+"@XX@@@@@@@@@@@XX",
+"@XX@@@@@@@@@@@XX",
+"@XX@@@@@@@@@@@XX",
+"@XX@@@@@@@@@@@XX",
+"@XX@@@@@@@@@@@XX",
+"@XX@@@@@@@@@@@XX",
+"@OO@@@@@@@@@@@OO"
+};
diff --git a/data/pixmaps/feta/10/scripts-downmordent.xpm b/data/pixmaps/feta/10/scripts-downmordent.xpm
new file mode 100644
index 0000000..968b72e
--- /dev/null
+++ b/data/pixmaps/feta/10/scripts-downmordent.xpm
@@ -0,0 +1,31 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"35 17 8 1",
+" c #040404",
+". c #343434",
+"X c Gray29",
+"o c #6f6f6f",
+"O c Gray57",
+"+ c Gray71",
+"@ c #d0d0d0",
+"# c None",
+/* pixels */
+"###################################",
+"####O##############################",
+"###. ##############################",
+"##o O##################+###########",
+"## @#################+ @##########",
+"#O .####.@######@.@###+ @@.########",
+"#O ###. @####@. .@##+ +. .#######",
+"#O ##O @###O .@#+ . .####@@",
+"#+ #@ @#@ .#+ .##@ O",
+"##X OX @. .O .# .#",
+"##+ . O+ OO Oo +#",
+"###+ o##O .##o @#o o##",
+"####+####O @###o @##o .###",
+"##########O o#####o X @###o +###",
+"###########Oo#######oO+ @####XO####",
+"######################+ @##########",
+"#######################+###########"
+};
diff --git a/data/pixmaps/feta/10/scripts-downprall.xpm b/data/pixmaps/feta/10/scripts-downprall.xpm
new file mode 100644
index 0000000..a8c0fba
--- /dev/null
+++ b/data/pixmaps/feta/10/scripts-downprall.xpm
@@ -0,0 +1,29 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"35 15 8 1",
+" c #060606",
+". c #2a2a2a",
+"X c Gray32",
+"o c #6d6d6d",
+"O c Gray56",
+"+ c #b1b1b1",
+"@ c #d0d0d0",
+"# c None",
+/* pixels */
+"###################################",
+"###@O##############################",
+"###. ##############################",
+"##o O##############################",
+"#@ @##############################",
+"#O .###@ +######@ @######+.@#######",
+"#O ###. +####@ +####+ @######",
+"#O ##o +###X +###. .@###O@",
+"#@ @@ O#+ +#O @#O O",
+"##o O... o o . .+ X#",
+"##@. +# @@ @+ .@#",
+"###@.O##@. X##@ o##+ +##",
+"#########@. .####@ X####+ X###",
+"##########@. @#####@ .@#####+ .####",
+"###########@@#######@@#######@@####"
+};
diff --git a/data/pixmaps/feta/10/scripts-dpedalheel.xpm b/data/pixmaps/feta/10/scripts-dpedalheel.xpm
new file mode 100644
index 0000000..158fc57
--- /dev/null
+++ b/data/pixmaps/feta/10/scripts-dpedalheel.xpm
@@ -0,0 +1,25 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"12 13 6 1",
+" c #020202",
+". c Gray21",
+"X c Gray46",
+"o c #898989",
+"O c Gray70",
+"+ c None",
+/* pixels */
+"++++++++++++",
+"+++++XXo++++",
+"+++. .++",
+"++. O+++o .+",
+"++ o+++++o +",
+"+o +++++++ o",
+"+o +++++++ o",
+"+X +++++++ o",
+"+o +++++++ o",
+"+o +++++++ o",
+"+o +++++++ o",
+"+o +++++++ o",
+"+OO+++++++OO"
+};
diff --git a/data/pixmaps/feta/10/scripts-dpedaltoe.xpm b/data/pixmaps/feta/10/scripts-dpedaltoe.xpm
new file mode 100644
index 0000000..662ef25
--- /dev/null
+++ b/data/pixmaps/feta/10/scripts-dpedaltoe.xpm
@@ -0,0 +1,30 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"12 16 8 1",
+" c #060606",
+". c #2a2a2a",
+"X c Gray31",
+"o c #747474",
+"O c #909090",
+"+ c Gray68",
+"@ c Gray85",
+"# c None",
+/* pixels */
+"############",
+"##O#######++",
+"#O @###### O",
+"## o#####o #",
+"##X.#####.X#",
+"##O @###@ O#",
+"### o###o ##",
+"###X.###.X##",
+"###O @#@ O##",
+"#### o#o ###",
+"####X # X###",
+"####+ O +###",
+"##### ####",
+"#####o o####",
+"#####+ o####",
+"######O#####"
+};
diff --git a/data/pixmaps/feta/10/scripts-dstaccatissimo.xpm b/data/pixmaps/feta/10/scripts-dstaccatissimo.xpm
new file mode 100644
index 0000000..621c872
--- /dev/null
+++ b/data/pixmaps/feta/10/scripts-dstaccatissimo.xpm
@@ -0,0 +1,24 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"6 12 6 1",
+" c Gray2",
+". c Gray48",
+"X c #898989",
+"o c Gray75",
+"O c #c0c0c0",
+"+ c None",
+/* pixels */
+"++++++",
+"+++X++",
+"+++ ++",
+"++X X+",
+"++X X+",
+"++. .+",
+"++ +",
+"++ +",
+"+o o",
+"+X X",
+"+o o",
+"++o.o+"
+};
diff --git a/data/pixmaps/feta/10/scripts-flageolet.xpm b/data/pixmaps/feta/10/scripts-flageolet.xpm
new file mode 100644
index 0000000..676e43c
--- /dev/null
+++ b/data/pixmaps/feta/10/scripts-flageolet.xpm
@@ -0,0 +1,22 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"12 12 4 1",
+" c Gray57",
+". c Gray70",
+"X c Gray86",
+"o c None",
+/* pixels */
+"oooooooooooo",
+"ooooX Xooo",
+"ooo. XXX .oo",
+"oo..ooooo..o",
+"oX ooooooo X",
+"o XoooooooX ",
+"o XoooooooX ",
+"o XoooooooX ",
+"oX ooooooo X",
+"oo..ooooo..o",
+"ooo. XXX .oo",
+"ooooX Xooo"
+};
diff --git a/data/pixmaps/feta/10/scripts-lcomma.xpm b/data/pixmaps/feta/10/scripts-lcomma.xpm
new file mode 100644
index 0000000..83e3eea
--- /dev/null
+++ b/data/pixmaps/feta/10/scripts-lcomma.xpm
@@ -0,0 +1,27 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"6 13 8 1",
+" c #040404",
+". c #343434",
+"X c Gray32",
+"o c Gray45",
+"O c #888888",
+"+ c #afafaf",
+"@ c #cacaca",
+"# c None",
+/* pixels */
+"######",
+"####++",
+"#### +",
+"###.X#",
+"##+ @#",
+"##X ##",
+"## o##",
+"#+ O##",
+"#O X##",
+"#O @#",
+"#+ X#",
+"##. #",
+"###o+#"
+};
diff --git a/data/pixmaps/feta/10/scripts-lineprall.xpm b/data/pixmaps/feta/10/scripts-lineprall.xpm
new file mode 100644
index 0000000..5a37398
--- /dev/null
+++ b/data/pixmaps/feta/10/scripts-lineprall.xpm
@@ -0,0 +1,41 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"33 27 8 1",
+" c Gray1",
+". c #3f3f3f",
+"X c #464646",
+"o c Gray47",
+"O c Gray52",
+"+ c #b6b6b6",
+"@ c #c3c3c3",
+"# c None",
+/* pixels */
+"#################################",
+"##+##############################",
+"#O ##############################",
+"#O ##############################",
+"#O ##############################",
+"#O ##############################",
+"#O ##############################",
+"#O ##############################",
+"#O ##############################",
+"#O ##############################",
+"#O ##############################",
+"#o ##############################",
+"#O ##############################",
+"#O ##############################",
+"#O ##############################",
+"#O ##############################",
+"#O ###+########+########+########",
+"#O ##X +######X +######X +#######",
+"#O #O +####o +####O +######",
+"#O + +##+ +##+ +###.+",
+"#O . +#X +#X +#X +",
+"#O o X X X X o o#",
+"#O X#+ X#+ X#+ X##",
+"#+X###+ +##+ +##+ +##",
+"#######+ o####+ o####+ o###",
+"########+ X######+ .######+ X####",
+"#########+########@########@#####"
+};
diff --git a/data/pixmaps/feta/10/scripts-mordent.xpm b/data/pixmaps/feta/10/scripts-mordent.xpm
new file mode 100644
index 0000000..b485a4e
--- /dev/null
+++ b/data/pixmaps/feta/10/scripts-mordent.xpm
@@ -0,0 +1,29 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"24 15 8 1",
+" c Gray1",
+". c #3c3c3c",
+"X c #4b4b4b",
+"o c #7c7c7c",
+"O c #888888",
+"+ c #b6b6b6",
+"@ c #c3c3c3",
+"# c None",
+/* pixels */
+"########################",
+"############@###########",
+"############ o##########",
+"#####+X##### O+.########",
+"####+ X#### . X#######",
+"####X X### X####+#",
+"###O X## X##+ O",
+"##+ X+ X# .#",
+"##. #X oX +#",
+"#O +##X O#X O##",
+"##+####X . o##X X###",
+"########X + o###X +###",
+"#########X+# o####X+####",
+"############ o##########",
+"############+###########"
+};
diff --git a/data/pixmaps/feta/10/scripts-open.xpm b/data/pixmaps/feta/10/scripts-open.xpm
new file mode 100644
index 0000000..685175a
--- /dev/null
+++ b/data/pixmaps/feta/10/scripts-open.xpm
@@ -0,0 +1,25 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"10 12 7 1",
+" c #020202",
+". c #313131",
+"X c #4e4e4e",
+"o c Gray43",
+"O c Gray53",
+"+ c #bbbbbb",
+"@ c None",
+/* pixels */
+"@@@@@@@@@@",
+"@@@@+o+@@@",
+"@@@X o X@@",
+"@@o.@@@.o@",
+"@@ o@@@O @",
+"@O @@@@@ O",
+"@O @@@@@ O",
+"@O @@@@@ O",
+"@@ O@@@o @",
+"@@o.@@@.o@",
+"@@@X o X@@",
+"@@@@+o+@@@"
+};
diff --git a/data/pixmaps/feta/10/scripts-prall.xpm b/data/pixmaps/feta/10/scripts-prall.xpm
new file mode 100644
index 0000000..f992bac
--- /dev/null
+++ b/data/pixmaps/feta/10/scripts-prall.xpm
@@ -0,0 +1,26 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"24 12 8 1",
+" c Gray1",
+". c #3f3f3f",
+"X c #464646",
+"o c #7b7b7b",
+"O c #808080",
+"+ c Gray71",
+"@ c #c3c3c3",
+"# c None",
+/* pixels */
+"########################",
+"######+########@########",
+"#####X +######X +#######",
+"####O +####o +######",
+"###+ +##+ +###.+",
+"###X +#X +#X +",
+"##o o X X o o#",
+"#+ X#+ X#+ X##",
+"#+X###+ +##+ +##",
+"#######+ o####+ O###",
+"########+ X######+ X####",
+"#########@########+#####"
+};
diff --git a/data/pixmaps/feta/10/scripts-pralldown.xpm b/data/pixmaps/feta/10/scripts-pralldown.xpm
new file mode 100644
index 0000000..4ddff54
--- /dev/null
+++ b/data/pixmaps/feta/10/scripts-pralldown.xpm
@@ -0,0 +1,31 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"34 17 8 1",
+" c #040404",
+". c #313131",
+"X c #515151",
+"o c #6d6d6d",
+"O c #8e8e8e",
+"+ c Gray71",
+"@ c #d5d5d5",
+"# c None",
+/* pixels */
+"##################################",
+"#########+########+########+######",
+"########O X######o o######X O#####",
+"#######O O####o +####X @####",
+"#O.###O @##o @##X .####",
+"#@ .#O X#o o#X O###",
+"##O X .X . XX . oo @##",
+"###X .##. X##. X#@..@#",
+"###@. .@##+ X###+ o###O X#",
+"####O .#####o X#####X o####@ @",
+"#####o.#######XX#######.X######. O",
+"######@#######@################ O",
+"###############################. O",
+"##############################@ @",
+"##############################O o#",
+"############################## .##",
+"##############################O@##"
+};
diff --git a/data/pixmaps/feta/10/scripts-prallmordent.xpm b/data/pixmaps/feta/10/scripts-prallmordent.xpm
new file mode 100644
index 0000000..beb4f38
--- /dev/null
+++ b/data/pixmaps/feta/10/scripts-prallmordent.xpm
@@ -0,0 +1,29 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"33 15 8 1",
+" c Gray1",
+". c #3c3c3c",
+"X c #4b4b4b",
+"o c Gray49",
+"O c #888888",
+"+ c Gray71",
+"@ c #c3c3c3",
+"# c None",
+/* pixels */
+"#################################",
+"#####################@###########",
+"####################o ###########",
+"#####+X#######+X####o #+X########",
+"####+ X#####+ X###o + X#######",
+"####X X####X X##o . X####+#",
+"###O X##o X#o X##+ O",
+"##+ X+ Xo X# .#",
+"##X #X +X +X +#",
+"#O +##X o##X ##X O##",
+"##+####X X####X ###X X###",
+"########X +#####X . ####X +###",
+"#########X+#######X+O #####X+####",
+"####################o ###########",
+"#####################+###########"
+};
diff --git a/data/pixmaps/feta/10/scripts-prallprall.xpm b/data/pixmaps/feta/10/scripts-prallprall.xpm
new file mode 100644
index 0000000..6aa1877
--- /dev/null
+++ b/data/pixmaps/feta/10/scripts-prallprall.xpm
@@ -0,0 +1,26 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"33 12 8 1",
+" c Gray1",
+". c #3f3f3f",
+"X c Gray27",
+"o c #7b7b7b",
+"O c #808080",
+"+ c Gray71",
+"@ c #c3c3c3",
+"# c None",
+/* pixels */
+"#################################",
+"######+########@########+########",
+"#####X +######X +######X +#######",
+"####O +####O +####O +######",
+"###+ +##+ +##+ +###.+",
+"###X +#X +#X +#X +",
+"##o o X X X X o o#",
+"#+ X#+ X#+ X#+ X##",
+"#+.###+ +##+ +##+ +##",
+"#######+ O####+ O####+ o###",
+"########+ X######+ X######+ X####",
+"#########+########+########@#####"
+};
diff --git a/data/pixmaps/feta/10/scripts-prallup.xpm b/data/pixmaps/feta/10/scripts-prallup.xpm
new file mode 100644
index 0000000..d96192f
--- /dev/null
+++ b/data/pixmaps/feta/10/scripts-prallup.xpm
@@ -0,0 +1,29 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"35 15 8 1",
+" c #060606",
+". c #2a2a2a",
+"X c Gray32",
+"o c #6d6d6d",
+"O c Gray56",
+"+ c #b1b1b1",
+"@ c #d0d0d0",
+"# c None",
+/* pixels */
+"###################################",
+"###############################O@##",
+"############################### .##",
+"###############################O o#",
+"###############################@ @",
+"########@.+######@ @######+ @### O",
+"#######@ @####+ @####+ .###. O",
+"#@O###@. .###@ X###O o## O",
+"#O O#@ O#+ +#O @@ @",
+"##X + o o ...O o#",
+"##@. +@ @@ @@ .##",
+"###+ +##o @##o .@##O.@##",
+"####o +####X @####. .@########",
+"#####. +#####@. @#####@ .@#########",
+"#####@@#######@@#######@@##########"
+};
diff --git a/data/pixmaps/feta/10/scripts-rcomma.xpm b/data/pixmaps/feta/10/scripts-rcomma.xpm
new file mode 100644
index 0000000..2e792a1
--- /dev/null
+++ b/data/pixmaps/feta/10/scripts-rcomma.xpm
@@ -0,0 +1,27 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"6 13 8 1",
+" c #040404",
+". c #343434",
+"X c Gray32",
+"o c Gray45",
+"O c #888888",
+"+ c #afafaf",
+"@ c #cacaca",
+"# c None",
+/* pixels */
+"######",
+"##+o##",
+"## .#",
+"##X +",
+"##@ O",
+"###X O",
+"###O +",
+"###o #",
+"### X#",
+"##@ +#",
+"##X.##",
+"#+ @##",
+"#++###"
+};
diff --git a/data/pixmaps/feta/10/scripts-reverseturn.xpm b/data/pixmaps/feta/10/scripts-reverseturn.xpm
new file mode 100644
index 0000000..55131fd
--- /dev/null
+++ b/data/pixmaps/feta/10/scripts-reverseturn.xpm
@@ -0,0 +1,26 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"23 12 8 1",
+" c Gray1",
+". c #323232",
+"X c Gray29",
+"o c Gray46",
+"O c Gray53",
+"+ c #b9b9b9",
+"@ c #c1c1c1",
+"# c None",
+/* pixels */
+"#######################",
+"####@oO########+OOO####",
+"###X +####@. X##",
+"##X O###O X#",
+"## XO +##X XoOX #",
+"#O.##+o+##X +####.o",
+"#oo######X X######oo",
+"#O.####+ X##+o+##.O",
+"## XOOX X##+ OX #",
+"##X O###O X#",
+"###X .@####+ X##",
+"#####OOO+########Oo+###"
+};
diff --git a/data/pixmaps/feta/10/scripts-segno.xpm b/data/pixmaps/feta/10/scripts-segno.xpm
new file mode 100644
index 0000000..02ed50d
--- /dev/null
+++ b/data/pixmaps/feta/10/scripts-segno.xpm
@@ -0,0 +1,45 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"21 31 8 1",
+" c Gray1",
+". c Gray21",
+"X c #4c4c4c",
+"o c #767676",
+"O c #868686",
+"+ c Gray72",
+"@ c Gray78",
+"# c None",
+/* pixels */
+"#####################",
+"#####+oo+#########OO@",
+"###@. Xo..@######+ #",
+"##+ +###X +##### +#",
+"##X X####X X####O X##",
+"#+ o###X +### +##",
+"#O o### O##X X###",
+"#O ### o#+ ####",
+"#O o##X +#X O####",
+"#+ ###Oo+#O X#####",
+"## X###### +#####",
+"##+ X####O X######",
+"###X .+#+ +######",
+"####X OX O##+ +##",
+"#####X ###O O##",
+"######+ X#######",
+"########X +#####",
+"###O O### X####",
+"###+ +##O XO X###",
+"#######+ +#+. X##",
+"#######X O####X +#",
+"######+ ######X #",
+"######X o#+oO### +",
+"#####o X#+ X##O O",
+"##### +#o ### O",
+"####X X##O ###o O",
+"###+ ###+ X###o +",
+"###X O####X X####X X#",
+"##+ #####+ X###+ +#",
+"## +######@..oX .@##",
+"#@oO#########+oo+####"
+};
diff --git a/data/pixmaps/feta/10/scripts-sforzato.xpm b/data/pixmaps/feta/10/scripts-sforzato.xpm
new file mode 100644
index 0000000..8a9e33f
--- /dev/null
+++ b/data/pixmaps/feta/10/scripts-sforzato.xpm
@@ -0,0 +1,26 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"19 12 8 1",
+" c #060606",
+". c Gray20",
+"X c Gray25",
+"o c #747474",
+"O c #898989",
+"+ c Gray70",
+"@ c #cdcdcd",
+"# c None",
+/* pixels */
+"###################",
+"##O################",
+"#+ oo############",
+"###Oo .o+########",
+"#######O. oo@####",
+"###########oo. .OO#",
+"##############@@ O",
+"###########oo. .oO#",
+"#######O. oo#####",
+"###oo Xo+########",
+"#@ oO############",
+"#@O################"
+};
diff --git a/data/pixmaps/feta/10/scripts-staccato.xpm b/data/pixmaps/feta/10/scripts-staccato.xpm
new file mode 100644
index 0000000..ca49c14
--- /dev/null
+++ b/data/pixmaps/feta/10/scripts-staccato.xpm
@@ -0,0 +1,17 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"4 4 7 1",
+" c Gray0",
+". c #565656",
+"X c #727272",
+"o c Gray51",
+"O c Gray69",
+"+ c #d3d3d3",
+"@ c None",
+/* pixels */
+"@@@@",
+"@+o@",
+"@X X",
+"@O.O"
+};
diff --git a/data/pixmaps/feta/10/scripts-stopped.xpm b/data/pixmaps/feta/10/scripts-stopped.xpm
new file mode 100644
index 0000000..e935e81
--- /dev/null
+++ b/data/pixmaps/feta/10/scripts-stopped.xpm
@@ -0,0 +1,22 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"12 12 4 1",
+" c Gray0",
+". c #444444",
+"X c #888888",
+"o c None",
+/* pixels */
+"oooooooooooo",
+"ooooooXooooo",
+"oooooX Xoooo",
+"oooooX Xoooo",
+"oooooX Xoooo",
+"ooXXX. .XXXo",
+"oX X",
+"ooXXX. .XXXo",
+"oooooX Xoooo",
+"oooooX Xoooo",
+"oooooX Xoooo",
+"ooooooXooooo"
+};
diff --git a/data/pixmaps/feta/10/scripts-tenuto.xpm b/data/pixmaps/feta/10/scripts-tenuto.xpm
new file mode 100644
index 0000000..8022fee
--- /dev/null
+++ b/data/pixmaps/feta/10/scripts-tenuto.xpm
@@ -0,0 +1,13 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"13 3 4 1",
+" c #515151",
+". c Gray69",
+"X c gainsboro",
+"o c None",
+/* pixels */
+"ooooooooooooo",
+"oX .",
+"oX ."
+};
diff --git a/data/pixmaps/feta/10/scripts-thumb.xpm b/data/pixmaps/feta/10/scripts-thumb.xpm
new file mode 100644
index 0000000..386c73c
--- /dev/null
+++ b/data/pixmaps/feta/10/scripts-thumb.xpm
@@ -0,0 +1,29 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"10 15 8 1",
+" c #070707",
+". c #2c2c2c",
+"X c #5d5d5d",
+"o c #6f6f6f",
+"O c Gray54",
+"+ c Gray66",
+"@ c #c5c5c5",
+"# c None",
+/* pixels */
+"##########",
+"####+X+###",
+"###. o .##",
+"##o @#@ o#",
+"## ### @",
+"#O ### O",
+"#O ### O",
+"#+ ### +",
+"##. ### .#",
+"##+ X#X +#",
+"###O...O##",
+"####O O###",
+"####O O###",
+"####O o###",
+"#####O####"
+};
diff --git a/data/pixmaps/feta/10/scripts-trilelement.xpm b/data/pixmaps/feta/10/scripts-trilelement.xpm
new file mode 100644
index 0000000..8284941
--- /dev/null
+++ b/data/pixmaps/feta/10/scripts-trilelement.xpm
@@ -0,0 +1,26 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"15 12 8 1",
+" c Gray1",
+". c #3f3f3f",
+"X c #484848",
+"o c #7b7b7b",
+"O c #808080",
+"+ c #b4b4b4",
+"@ c #c3c3c3",
+"# c None",
+/* pixels */
+"###############",
+"######+########",
+"#####X +#######",
+"####o +######",
+"###+ +###.+",
+"###X +#X +",
+"##o o o o#",
+"#+ X#+ X##",
+"#+.###+ +##",
+"#######+ O###",
+"########+ X####",
+"#########+#####"
+};
diff --git a/data/pixmaps/feta/10/scripts-trill-element.xpm b/data/pixmaps/feta/10/scripts-trill-element.xpm
new file mode 100644
index 0000000..aef1b2c
--- /dev/null
+++ b/data/pixmaps/feta/10/scripts-trill-element.xpm
@@ -0,0 +1,24 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"15 10 8 1",
+" c #040404",
+". c #2c2c2c",
+"X c Gray30",
+"o c #767676",
+"O c Gray56",
+"+ c #afafaf",
+"@ c #d5d5d5",
+"# c None",
+/* pixels */
+"###############",
+"#####@O########",
+"#####. o#######",
+"####X +####++",
+"###O .@##@ +",
+"##+ .OO O#",
+"##.X##O O##",
+"#OX####O .###",
+"#######@. .@###",
+"########@O@####"
+};
diff --git a/data/pixmaps/feta/10/scripts-trill.xpm b/data/pixmaps/feta/10/scripts-trill.xpm
new file mode 100644
index 0000000..cacce86
--- /dev/null
+++ b/data/pixmaps/feta/10/scripts-trill.xpm
@@ -0,0 +1,38 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"30 24 8 1",
+" c Gray1",
+". c #343434",
+"X c #535353",
+"o c Gray45",
+"O c Gray56",
+"+ c Gray69",
+"@ c #cecece",
+"# c None",
+/* pixels */
+"##############################",
+"##############O@##############",
+"###########+X .###############",
+"###########X X###############",
+"###########X O###############",
+"##########@ +###############",
+"##########@ @###############",
+"##########o .################",
+"##########X .################",
+"##########X O###@+@@####OXX+#",
+"#########@ +##+OX .@#. +",
+"###+OOO+#@ ++O@###. .O@. O",
+"##O+###+OO .O+#####. +##X O",
+"#@+######X .#######. ### +",
+"#O@####@+. o######+ X###O.O#",
+"#++##+OO+ OO@####+ X#######",
+"##+oO+@#@ +#O@###X @#######",
+"########+ .##@O###. @#######",
+"########X .###O###. @#######",
+"########X .##++##+ X########",
+"########X @#.@##+ X########",
+"########O o###o O########",
+"#########. o####. @########",
+"#########@OO@#################"
+};
diff --git a/data/pixmaps/feta/10/scripts-turn.xpm b/data/pixmaps/feta/10/scripts-turn.xpm
new file mode 100644
index 0000000..bc4bca9
--- /dev/null
+++ b/data/pixmaps/feta/10/scripts-turn.xpm
@@ -0,0 +1,26 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"23 12 8 1",
+" c Gray1",
+". c #323232",
+"X c Gray29",
+"o c Gray46",
+"O c Gray53",
+"+ c #b9b9b9",
+"@ c #c1c1c1",
+"# c None",
+/* pixels */
+"#######################",
+"#####OOO+########OO+###",
+"###X .@####+ X##",
+"##X O###O X#",
+"## XOOX X##+ OX #",
+"#O.####+ X##+o+##.o",
+"#oo######X X######oo",
+"#O.##+o+##X +####.O",
+"## XO +##X XOOX #",
+"##X O###o X#",
+"###X +####@. X##",
+"####+OO########@OOO####"
+};
diff --git a/data/pixmaps/feta/10/scripts-ufermata.xpm b/data/pixmaps/feta/10/scripts-ufermata.xpm
new file mode 100644
index 0000000..624987a
--- /dev/null
+++ b/data/pixmaps/feta/10/scripts-ufermata.xpm
@@ -0,0 +1,29 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"27 16 7 1",
+" c #040404",
+". c Gray17",
+"X c #767676",
+"o c #909090",
+"O c #afafaf",
+"+ c Gray83",
+"@ c None",
+/* pixels */
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@OXooXO@@@@@@@@@@",
+"@@@@@@@@@X X@@@@@@@@",
+"@@@@@@@O. .O@@@@@@",
+"@@@@@@o o@@@@@",
+"@@@@@o .oOOOOO. o@@@@",
+"@@@@+ X+@@@@@@@@+X +@@@",
+"@@@@. .+@@@@@@@@@@@@+. .@@@",
+"@@@o .+@@@@@@@@@@@@@@+. o@@",
+"@@@. +@@@@@@@@@@@@@@@@+ .@@",
+"@@+ o@@@@@@@@++@@@@@@@@o +@",
+"@@X.@@@@@@@@X X@@@@@@@@.X@",
+"@@ X@@@@@@@o o@@@@@@@X @",
+"@+ +@@@@@@@o o@@@@@@@+ +",
+"@o @@@@@@@@O O@@@@@@@@ o",
+"@OO@@@@@@@@@OXXO@@@@@@@@@OO"
+};
diff --git a/data/pixmaps/feta/10/scripts-umarcato.xpm b/data/pixmaps/feta/10/scripts-umarcato.xpm
new file mode 100644
index 0000000..07353df
--- /dev/null
+++ b/data/pixmaps/feta/10/scripts-umarcato.xpm
@@ -0,0 +1,25 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"12 12 7 1",
+" c Gray2",
+". c #313131",
+"X c #6d6d6d",
+"o c #8e8e8e",
+"O c Gray68",
+"+ c #d0d0d0",
+"@ c None",
+/* pixels */
+"@@@@@@@@@@@@",
+"@@@@@@o@@@@@",
+"@@@@@O O@@@@",
+"@@@@@. .@@@@",
+"@@@@O O@@@",
+"@@@@. .@@@",
+"@@@o.X o@@",
+"@@@ O+ .@@",
+"@@o.@@X o@",
+"@@ O@@+ .@",
+"@o.@@@@. o",
+"@OO@@@@OXoXO"
+};
diff --git a/data/pixmaps/feta/10/scripts-upbow.xpm b/data/pixmaps/feta/10/scripts-upbow.xpm
new file mode 100644
index 0000000..fa0143c
--- /dev/null
+++ b/data/pixmaps/feta/10/scripts-upbow.xpm
@@ -0,0 +1,34 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"14 22 6 1",
+" c Gray1",
+". c Gray23",
+"X c #777777",
+"o c #868686",
+"O c #b7b7b7",
+"+ c None",
+/* pixels */
+"++++++++++++++",
+"++o+++++++++OO",
+"+o +++++++++ o",
+"++ X+++++++o +",
+"++ X+++++++X +",
+"++X +++++++ X+",
+"++O O+++++O O+",
+"+++ X+++++X ++",
+"+++..+++++..++",
+"+++X +++++ X++",
+"++++ X+++o +++",
+"++++ X+++X +++",
+"++++X +++ X+++",
+"++++O O+O O+++",
+"+++++ X+X ++++",
+"+++++..+..++++",
+"+++++X + o++++",
+"++++++ +++++",
+"++++++ +++++",
+"++++++X X+++++",
+"++++++O o+++++",
+"+++++++o++++++"
+};
diff --git a/data/pixmaps/feta/10/scripts-upedalheel.xpm b/data/pixmaps/feta/10/scripts-upedalheel.xpm
new file mode 100644
index 0000000..f465cd1
--- /dev/null
+++ b/data/pixmaps/feta/10/scripts-upedalheel.xpm
@@ -0,0 +1,25 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"12 13 6 1",
+" c #020202",
+". c Gray21",
+"X c Gray46",
+"o c #898989",
+"O c Gray70",
+"+ c None",
+/* pixels */
+"++++++++++++",
+"+OO+++++++OO",
+"+o +++++++ o",
+"+o +++++++ o",
+"+o +++++++ o",
+"+o +++++++ o",
+"+o +++++++ o",
+"+o +++++++ o",
+"+X +++++++ o",
+"++ o+++++o +",
+"++. O+++o .+",
+"+++. .++",
+"+++++XXX++++"
+};
diff --git a/data/pixmaps/feta/10/scripts-upedaltoe.xpm b/data/pixmaps/feta/10/scripts-upedaltoe.xpm
new file mode 100644
index 0000000..f99cfd2
--- /dev/null
+++ b/data/pixmaps/feta/10/scripts-upedaltoe.xpm
@@ -0,0 +1,30 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"12 16 8 1",
+" c #060606",
+". c #2a2a2a",
+"X c Gray31",
+"o c #747474",
+"O c #909090",
+"+ c Gray68",
+"@ c Gray85",
+"# c None",
+/* pixels */
+"############",
+"######O#####",
+"#####+ O####",
+"#####o o####",
+"##### ####",
+"####+ + +###",
+"####X # X###",
+"#### o#o ###",
+"###O @#@ O##",
+"###X.###.X##",
+"### o###o ##",
+"##O @###@ O#",
+"##X.#####.X#",
+"## o#####o #",
+"#O @#####@ O",
+"#@O#######++"
+};
diff --git a/data/pixmaps/feta/10/scripts-upmordent.xpm b/data/pixmaps/feta/10/scripts-upmordent.xpm
new file mode 100644
index 0000000..30011b6
--- /dev/null
+++ b/data/pixmaps/feta/10/scripts-upmordent.xpm
@@ -0,0 +1,33 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"34 19 8 1",
+" c #040404",
+". c #343434",
+"X c Gray28",
+"o c #6f6f6f",
+"O c Gray57",
+"+ c Gray70",
+"@ c #d0d0d0",
+"# c None",
+/* pixels */
+"##################################",
+"######################+###########",
+"#####################+ @##########",
+"#######.@######@.@###+ @@.########",
+"######. @####@. .@##+ +. .#######",
+"#####+ @###O .@#+ X .####@@",
+"####@ @#@ .#+ .##+ O",
+"####X +. .O X# .#",
+"###+ O+ OO Oo +#",
+"##+ X##+ .##O @#o o##",
+"##X O###O @###o @##o .###",
+"#+ #####O o#####o X @###X +###",
+"#O .######Oo#######oO+ @####XO####",
+"#O #################+ @##########",
+"#O ##################+###########",
+"## +#############################",
+"##o O#############################",
+"###. #############################",
+"####O#############################"
+};
diff --git a/data/pixmaps/feta/10/scripts-upprall.xpm b/data/pixmaps/feta/10/scripts-upprall.xpm
new file mode 100644
index 0000000..76fa412
--- /dev/null
+++ b/data/pixmaps/feta/10/scripts-upprall.xpm
@@ -0,0 +1,31 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"34 17 8 1",
+" c #040404",
+". c #313131",
+"X c #515151",
+"o c #6d6d6d",
+"O c #8e8e8e",
+"+ c Gray71",
+"@ c #d5d5d5",
+"# c None",
+/* pixels */
+"##################################",
+"#######+########+########+########",
+"######O X######o o######X O#######",
+"#####@ X####+ o####O O######",
+"#####. X##@ o##@ O###.O",
+"####O X#o o#X O#. @",
+"###@ oo . .X . X. X O#",
+"##@..@#X .##X .##. X##",
+"##X O###o +###X +##@. @##",
+"#@ @####o X#####X o#####. O###",
+"#O .######X.#######XX#######.o####",
+"#O ##############################",
+"#O ##############################",
+"#@ @#############################",
+"##o O#############################",
+"###. #############################",
+"####O#############################"
+};
diff --git a/data/pixmaps/feta/10/scripts-ustaccatissimo.xpm b/data/pixmaps/feta/10/scripts-ustaccatissimo.xpm
new file mode 100644
index 0000000..e0fab64
--- /dev/null
+++ b/data/pixmaps/feta/10/scripts-ustaccatissimo.xpm
@@ -0,0 +1,24 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"6 12 6 1",
+" c Gray2",
+". c Gray48",
+"X c #898989",
+"o c Gray75",
+"O c #c0c0c0",
+"+ c None",
+/* pixels */
+"++++++",
+"++o.O+",
+"+O O",
+"+X X",
+"+o o",
+"++ +",
+"++ +",
+"++. .+",
+"++X X+",
+"++X X+",
+"+++ ++",
+"+++X++"
+};
diff --git a/data/pixmaps/feta/10/unknown.xpm b/data/pixmaps/feta/10/unknown.xpm
new file mode 100644
index 0000000..8698b03
--- /dev/null
+++ b/data/pixmaps/feta/10/unknown.xpm
@@ -0,0 +1,16 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"6 8 2 1",
+"x c Gray0",
+" c None",
+/* pixels */
+" xxx ",
+" x ",
+" x ",
+" xx ",
+" x ",
+" ",
+" x ",
+" "
+};
diff --git a/data/pixmaps/feta/12/accidentals-(.xpm b/data/pixmaps/feta/12/accidentals-(.xpm
new file mode 100644
index 0000000..470584a
--- /dev/null
+++ b/data/pixmaps/feta/12/accidentals-(.xpm
@@ -0,0 +1,40 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"7 26 8 1",
+" c #070707",
+". c #2f2f2f",
+"X c Gray29",
+"o c Gray48",
+"O c Gray57",
+"+ c #b9b9b9",
+"@ c #cecece",
+"# c None",
+/* pixels */
+"#######",
+"#####++",
+"#####.O",
+"####o.#",
+"#### O#",
+"###O ##",
+"### X##",
+"##O +##",
+"##X @##",
+"## ###",
+"#@ .###",
+"#O .###",
+"#o .###",
+"#o X###",
+"#o .###",
+"#o X###",
+"#@ .###",
+"## ###",
+"##X @##",
+"##O +##",
+"### X##",
+"###o ##",
+"#### O#",
+"####o.#",
+"#####.O",
+"#####@+"
+};
diff --git a/data/pixmaps/feta/12/accidentals-).xpm b/data/pixmaps/feta/12/accidentals-).xpm
new file mode 100644
index 0000000..205ee99
--- /dev/null
+++ b/data/pixmaps/feta/12/accidentals-).xpm
@@ -0,0 +1,40 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"7 26 8 1",
+" c #070707",
+". c #2f2f2f",
+"X c Gray29",
+"o c Gray48",
+"O c Gray57",
+"+ c #b9b9b9",
+"@ c #cecece",
+"# c None",
+/* pixels */
+"#######",
+"#+@####",
+"#O.####",
+"## o###",
+"##O ###",
+"### o##",
+"###X ##",
+"###@ O#",
+"###@ X#",
+"#### #",
+"####. @",
+"####X o",
+"####X o",
+"####. o",
+"####X o",
+"####. O",
+"####. #",
+"###@ @",
+"###@ X#",
+"###@ O#",
+"###X ##",
+"### O##",
+"##O ###",
+"## o###",
+"#O.####",
+"#+@####"
+};
diff --git a/data/pixmaps/feta/12/accidentals--1.xpm b/data/pixmaps/feta/12/accidentals--1.xpm
new file mode 100644
index 0000000..ce69b43
--- /dev/null
+++ b/data/pixmaps/feta/12/accidentals--1.xpm
@@ -0,0 +1,46 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"12 32 8 1",
+" c Gray1",
+". c #313131",
+"X c Gray28",
+"o c #6c6c6c",
+"O c Gray54",
+"+ c #afafaf",
+"@ c #cacaca",
+"# c None",
+/* pixels */
+"############",
+"#@o@########",
+"#O O########",
+"#O O########",
+"#O o########",
+"#O O########",
+"#O O########",
+"#O O########",
+"#O O########",
+"#O O########",
+"#O O########",
+"#O O########",
+"#O O########",
+"#O O########",
+"#O O########",
+"#O O########",
+"#O O########",
+"#O O##o.X+##",
+"#O OO o#",
+"#O .XX @",
+"#O .@##O O",
+"#O O#### O",
+"#O O#### +",
+"#O O###@ .#",
+"#O O### +#",
+"#+ +##o O##",
+"## ##o +###",
+"## #o .+####",
+"## .######",
+"## .#######",
+"## +#######",
+"##++########"
+};
diff --git a/data/pixmaps/feta/12/accidentals--2.xpm b/data/pixmaps/feta/12/accidentals--2.xpm
new file mode 100644
index 0000000..81d7744
--- /dev/null
+++ b/data/pixmaps/feta/12/accidentals--2.xpm
@@ -0,0 +1,46 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"19 32 8 1",
+" c Gray1",
+". c #2f2f2f",
+"X c Gray29",
+"o c #727272",
+"O c #909090",
+"+ c #aeaeae",
+"@ c #cbcbcb",
+"# c None",
+/* pixels */
+"###################",
+"#@o@#####o+########",
+"#O O####@ X########",
+"#O O####@ X########",
+"#O O####@ X########",
+"#O O####@ X########",
+"#O O####@ X########",
+"#O O####@ X########",
+"#O O####@ X########",
+"#O O####@ X########",
+"#O O####@ X########",
+"#O O####@ X########",
+"#O O####@ X########",
+"#O O####@ X########",
+"#o O####@ X########",
+"#O O####@ X########",
+"#O O####@ X########",
+"#O O#+.X. X#@X..+##",
+"#O o. Xo o#",
+"#o .X XX @",
+"#O .##@ @##+ O",
+"#O O###X o####. o",
+"#O O###X +####. +",
+"#O O##@ @###@ .#",
+"#O O##o @###o O#",
+"#+ +#@ O +##O O##",
+"## ##X @@ @#O .O###",
+"#@.#X @#@ @O .@####",
+"#@.. @##@ o######",
+"## O###@ O#######",
+"##.X####@ ########",
+"#########O@########"
+};
diff --git a/data/pixmaps/feta/12/accidentals-0.xpm b/data/pixmaps/feta/12/accidentals-0.xpm
new file mode 100644
index 0000000..d06f69c
--- /dev/null
+++ b/data/pixmaps/feta/12/accidentals-0.xpm
@@ -0,0 +1,49 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"9 36 7 1",
+" c #070707",
+". c #282828",
+"X c Gray37",
+"o c #777777",
+"O c #868686",
+"+ c Gray75",
+"@ c None",
+/* pixels */
+"@@@@@@@@@",
+"@+O@@@@@@",
+"@o @@@@@@",
+"@o @@@@@@",
+"@o @@@@@@",
+"@o @@@@@@",
+"@o @@@@@@",
+"@o @@@@@@",
+"@o @@@@@@",
+"@o OOX o",
+"@o o",
+"@o o",
+"@o o",
+"@o o",
+"@o .oo@ o",
+"@o @@@@ o",
+"@o @@@@ o",
+"@o @@@@ o",
+"@o @@@@ o",
+"@o @@@@ o",
+"@o @@@@ o",
+"@o @@@@ o",
+"@o @oo. o",
+"@o o",
+"@o o",
+"@o o",
+"@o o",
+"@O XOo o",
+"@@@@@@@ o",
+"@@@@@@@ o",
+"@@@@@@@ o",
+"@@@@@@@ o",
+"@@@@@@@ o",
+"@@@@@@@ o",
+"@@@@@@@ o",
+"@@@@@@@O+"
+};
diff --git a/data/pixmaps/feta/12/accidentals-1.xpm b/data/pixmaps/feta/12/accidentals-1.xpm
new file mode 100644
index 0000000..4e60364
--- /dev/null
+++ b/data/pixmaps/feta/12/accidentals-1.xpm
@@ -0,0 +1,51 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"14 38 7 1",
+" c #040404",
+". c #232323",
+"X c #505050",
+"o c #868686",
+"O c #acacac",
+"+ c #cecece",
+"@ c None",
+/* pixels */
+"@@@@@@@@@@@@@@",
+"@@@@@@@@@oO@@@",
+"@@@@@@@@@.X@@@",
+"@@@@Oo@@@.X@@@",
+"@@@@X.@@@.X@@@",
+"@@@@X.@@@.X@@@",
+"@@@@X.@@@.X@@@",
+"@@@@X.@@@.X@@@",
+"@@@@X.@@@.X@@@",
+"@@@@X.@@@.XO o",
+"@@@@X.@@+ o",
+"@@@@X.O. o",
+"@@@@. X",
+"@+. .+",
+"@o .@@@",
+"@o .O.X@@@",
+"@X +@@.X@@@",
+"@o OX.@@@.X@@@",
+"@@@@X.@@@.X@@@",
+"@@@@X.@@@.X@@@",
+"@@@@X.@@@.X@@@",
+"@@@@X.@@@.XO o",
+"@@@@X.@@+ o",
+"@@@@X.O. o",
+"@@@@. X",
+"@+. .+",
+"@o .@@@",
+"@o .O.X@@@",
+"@X +@@.X@@@",
+"@o OX.@@@.X@@@",
+"@@@@X.@@@.X@@@",
+"@@@@X.@@@.X@@@",
+"@@@@X.@@@.X@@@",
+"@@@@X.@@@.X@@@",
+"@@@@X.@@@.X@@@",
+"@@@@X.@@@oO@@@",
+"@@@@X.@@@@@@@@",
+"@@@@Oo@@@@@@@@"
+};
diff --git a/data/pixmaps/feta/12/accidentals-2.xpm b/data/pixmaps/feta/12/accidentals-2.xpm
new file mode 100644
index 0000000..d29d604
--- /dev/null
+++ b/data/pixmaps/feta/12/accidentals-2.xpm
@@ -0,0 +1,25 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"14 14 5 1",
+" c #060606",
+". c #7b7b7b",
+"X c Gray55",
+"o c Gray83",
+"O c None",
+/* pixels */
+"OOOOOOOOOOOOOO",
+"OooOOOOOOOOOoo",
+"OX XOX X",
+"OX .O. X",
+"OX .OX X",
+"OO o o",
+"OOX.X ...O",
+"OOOOOo oOOOO",
+"OO... XX.O",
+"OO o O",
+"OX .O. X",
+"OX .O. X",
+"OX .O. X",
+"OooOOOOOOOOOoo"
+};
diff --git a/data/pixmaps/feta/12/accordion-accBB.xpm b/data/pixmaps/feta/12/accordion-accBB.xpm
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/pixmaps/feta/12/accordion-accBB.xpm
diff --git a/data/pixmaps/feta/12/accordion-accBayanbase.xpm b/data/pixmaps/feta/12/accordion-accBayanbase.xpm
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/pixmaps/feta/12/accordion-accBayanbase.xpm
diff --git a/data/pixmaps/feta/12/accordion-accDiscant.xpm b/data/pixmaps/feta/12/accordion-accDiscant.xpm
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/pixmaps/feta/12/accordion-accDiscant.xpm
diff --git a/data/pixmaps/feta/12/accordion-accDot.xpm b/data/pixmaps/feta/12/accordion-accDot.xpm
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/pixmaps/feta/12/accordion-accDot.xpm
diff --git a/data/pixmaps/feta/12/accordion-accFreebase.xpm b/data/pixmaps/feta/12/accordion-accFreebase.xpm
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/pixmaps/feta/12/accordion-accFreebase.xpm
diff --git a/data/pixmaps/feta/12/accordion-accOldEE.xpm b/data/pixmaps/feta/12/accordion-accOldEE.xpm
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/pixmaps/feta/12/accordion-accOldEE.xpm
diff --git a/data/pixmaps/feta/12/accordion-accOldEES.xpm b/data/pixmaps/feta/12/accordion-accOldEES.xpm
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/pixmaps/feta/12/accordion-accOldEES.xpm
diff --git a/data/pixmaps/feta/12/accordion-accSB.xpm b/data/pixmaps/feta/12/accordion-accSB.xpm
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/pixmaps/feta/12/accordion-accSB.xpm
diff --git a/data/pixmaps/feta/12/accordion-accStdbase.xpm b/data/pixmaps/feta/12/accordion-accStdbase.xpm
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/pixmaps/feta/12/accordion-accStdbase.xpm
diff --git a/data/pixmaps/feta/12/clefs-C.xpm b/data/pixmaps/feta/12/clefs-C.xpm
new file mode 100644
index 0000000..ea262d1
--- /dev/null
+++ b/data/pixmaps/feta/12/clefs-C.xpm
@@ -0,0 +1,62 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"33 48 8 1",
+" c #040404",
+". c #2c2c2c",
+"X c #4e4e4e",
+"o c #676767",
+"O c Gray54",
+"+ c #afafaf",
+"@ c Gray82",
+"# c None",
+/* pixels */
+"#################################",
+"#####@#############@OOO@#########",
+"#O .#o +####@o. .+######",
+"#O #o +###o .OOOo .+####",
+"#O .#o +##O @####@ +###",
+"#O #o +## +#####+ +##",
+"#O .#o +#o @#####. .##",
+"#O #o +#X .#####+ o#",
+"#O #o +#X @####+ .#",
+"#O .#o +#O .######. #",
+"#O .#o +##X +######. +",
+"#O #o +###o..+#######. O",
+"#O .#o +##############. O",
+"#O .#o +###@##########. O",
+"#O #o +##@ o#########. O",
+"#O .#o +##@ X#########. @",
+"#O .#o +##@ .#########. #",
+"#O #o +##o +#######+ O#",
+"#O .#o +##X o#######+ .##",
+"#O .#o +#@ @######X @##",
+"#O #o +#o +####+ @###",
+"#O .#o +# .. .XX. o@####",
+"#O .#o +o +##O. .o@######",
+"#O #o . .#####++@#########",
+"#O .#o .#################",
+"#O #o .#################",
+"#o .#o o. @###O..X+@#######",
+"#O #o ++ X@O. o@#####",
+"#O .#o +#. .+@@+. o####",
+"#O #o +#+ o######. o###",
+"#O .#o +##. .#######o o##",
+"#O #o +##X +#######+ @#",
+"#O #o +##+ @########. X#",
+"#O .#o +##@ X#########. #",
+"#O .#o +##@ X#########. O",
+"#O #o +###o+#########. O",
+"#O .#o +##############. O",
+"#O .#o +###@O+########. O",
+"#O #o +##+ .#######. O",
+"#O .#o +#@ o######. @",
+"#O .#o +#X @####+ .#",
+"#O #o +#X @####O +#",
+"#O .#o +#X o#####. .##",
+"#O .#o +#+ o#####+ +##",
+"#O #o +##X @####@. +###",
+"#O .#o +##@. O@OOo .+####",
+"#O .#o +###@X .+######",
+"#@oOOOOO#+o@######+oOOO@#########"
+};
diff --git a/data/pixmaps/feta/12/clefs-C_change.xpm b/data/pixmaps/feta/12/clefs-C_change.xpm
new file mode 100644
index 0000000..7ef2f11
--- /dev/null
+++ b/data/pixmaps/feta/12/clefs-C_change.xpm
@@ -0,0 +1,53 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"27 39 8 1",
+" c #040404",
+". c Gray20",
+"X c Gray29",
+"o c #797979",
+"O c #888888",
+"+ c #b1b1b1",
+"@ c Gray81",
+"# c None",
+/* pixels */
+"###########################",
+"#####@##########+oOO@######",
+"#O O# o####o .+####",
+"#O O# o##+ +##@X X###",
+"#O O# o#+ #####X X##",
+"#O O# o#. +####@ +#",
+"#O O# o# +#### .#",
+"#O O# O# O####X @",
+"#O O# o#X @####o O",
+"#O o# o##o .@#####o O",
+"#O O# o###########O O",
+"#O O# o##OO#######o O",
+"#O O# o##o #######o +",
+"#O O# o##. #######o #",
+"#O O# o#@ +######o X#",
+"#O o# o#+ o###### @#",
+"#O O# o#o O####O @##",
+"#O O# O@ .X ... o####",
+"#O O# oX O#@o...+@#####",
+"#O O# ##############",
+"#O O# ##############",
+"#O o# X. @##@++@#######",
+"#O O# OO X@o .o@####",
+"#O O# o#. O@@O O###",
+"#O O# o#o .@####@ o##",
+"#O O# o#@ O######. O#",
+"#O O# o## @######O .#",
+"#O O# o##o #######o @",
+"#O O# o##o #######o O",
+"#O O# o###########O O",
+"#O o# o##@O+######o O",
+"#O O# o#@ o#####o O",
+"#O O# o# O####X @",
+"#O o# O# o#### .#",
+"#O O# o# X####@ +#",
+"#O O# o#o @####X X##",
+"#O O# o##X ###@X X###",
+"#O O# o###o .. .+####",
+"#@oOOo@#o@#####ooOo+#######"
+};
diff --git a/data/pixmaps/feta/12/clefs-F.xpm b/data/pixmaps/feta/12/clefs-F.xpm
new file mode 100644
index 0000000..c53e90a
--- /dev/null
+++ b/data/pixmaps/feta/12/clefs-F.xpm
@@ -0,0 +1,53 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"34 39 8 1",
+" c #040404",
+". c Gray19",
+"X c Gray33",
+"o c #747474",
+"O c #8e8e8e",
+"+ c Gray69",
+"@ c #d0d0d0",
+"# c None",
+/* pixels */
+"##################################",
+"############OoOoo+################",
+"#########+. .+#############",
+"#######+. o@###O .+###########",
+"######+ X########X +##########",
+"#####+ X##########X +####+Xo+#",
+"##### ###########@ @##O @",
+"####o @############X o##o O",
+"###@ oo@##########O @#O @",
+"###O O########## o#@. X#",
+"###. +######### o###O@##",
+"### .#########X #######",
+"### +########o #######",
+"### o########O #######",
+"###. o########o #######",
+"###o @########o #######",
+"###@. o#########o .##@Xo##",
+"####@. O##########. o#O .#",
+"######+++@########### o#o +",
+"####################@ @#o O",
+"####################X o##+. .#",
+"#################### O###@@+@#",
+"###################O .#########",
+"##################@. @#########",
+"##################X O##########",
+"#################O .###########",
+"################@ .@###########",
+"###############@. .#############",
+"##############@ .##############",
+"#############@ X@##############",
+"############+ O################",
+"###########X X@#################",
+"#########@. O###################",
+"########O o@####################",
+"######@X o@######################",
+"#####X o@########################",
+"###O o###########################",
+"#+ o@############################",
+"#++###############################"
+};
diff --git a/data/pixmaps/feta/12/clefs-F_change.xpm b/data/pixmaps/feta/12/clefs-F_change.xpm
new file mode 100644
index 0000000..15e3f44
--- /dev/null
+++ b/data/pixmaps/feta/12/clefs-F_change.xpm
@@ -0,0 +1,46 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"27 32 8 1",
+" c Gray1",
+". c #2f2f2f",
+"X c #4b4b4b",
+"o c #6f6f6f",
+"O c Gray54",
+"+ c #b1b1b1",
+"@ c #d2d2d2",
+"# c None",
+/* pixels */
+"###########################",
+"#########@OoOo@############",
+"#######+. .O##########",
+"######. o@###o .@########",
+"####@. .@######O .@####@@#",
+"####o @########X X###X +",
+"###@ O#########+ O#+ O",
+"###o oo@########. .#@ O",
+"###. +#######. @#+.X@",
+"### .#######O O#####",
+"##@ +######+ o#####",
+"### +######+ X#####",
+"###. +######+ o#####",
+"###O X#######+ o##@@#",
+"####o X########O +#X +",
+"#####@+@#########. #+ O",
+"#################. X#@ O",
+"################O o##O.X@",
+"################. #######",
+"###############O O#######",
+"##############@ X########",
+"##############. @########",
+"#############. @#########",
+"############X @##########",
+"###########X .@###########",
+"#########+ o#############",
+"########O X+##############",
+"######@. O################",
+"#####X O##################",
+"###o O####################",
+"#+ o######################",
+"#++########################"
+};
diff --git a/data/pixmaps/feta/12/clefs-G.xpm b/data/pixmaps/feta/12/clefs-G.xpm
new file mode 100644
index 0000000..0268958
--- /dev/null
+++ b/data/pixmaps/feta/12/clefs-G.xpm
@@ -0,0 +1,104 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"32 90 8 1",
+" c #040404",
+". c #393939",
+"X c #484848",
+"o c Gray48",
+"O c Gray52",
+"+ c #b7b7b7",
+"@ c Gray77",
+"# c None",
+/* pixels */
+"################################",
+"###################+############",
+"##################X +###########",
+"#################X ###########",
+"################X X##########",
+"###############o +#########",
+"##############+ X#########",
+"##############X +########",
+"#############+ X#X X########",
+"#############X X##+ ########",
+"############+ #### O#######",
+"############o +####X X#######",
+"############ o#####o #######",
+"############ ######o +######",
+"###########+ O######o o######",
+"###########o #######o X######",
+"###########O o#######o ######",
+"###########o O#######o ######",
+"###########O ########X ######",
+"###########o ######## ######",
+"###########+ #######+ ######",
+"############ #######o X######",
+"############ ####### o######",
+"############X ######o +######",
+"############o ###### #######",
+"############o O####o O#######",
+"############+ o###+ ########",
+"############# o###X o########",
+"############# ##o #########",
+"#############o #+ o#########",
+"#############o o X##########",
+"#############O ###########",
+"############## +###########",
+"#############X +############",
+"############X X#############",
+"###########X X##############",
+"##########+ X###############",
+"#########+ o###############",
+"########+ o###############",
+"######## + ###############",
+"#######X +#o ###############",
+"######X +##o +##############",
+"#####+ o###o O##############",
+"##### X##### o##############",
+"####X ###### ##############",
+"###+ +######X ##############",
+"###X o#######o oooO##########",
+"### ######+. .@#######",
+"##O +#####X .@#####",
+"##. X#####X +####",
+"## O####o +###",
+"#+ ##### .+o @##OX +##",
+"#O X####O +##o O####+. X##",
+"#O o####X o###O O######X +#",
+"#O +#### ##### o#######X o#",
+"#O ##### o##### #######+ #",
+"#O ##### o#####X ########X +",
+"## #####X O#####O +#######O O",
+"## #####O X#####o o######## O",
+"##o +##### +####+ O######## O",
+"##+ o#####O X##### X######## O",
+"###X ######X X#### ######## #",
+"###+ o######X +##o #######+ X#",
+"####O #######O ##o O######o +#",
+"#####X X#######@@##O O###### .##",
+"######X X########### .#####o +##",
+"#######X +######### ####+ +###",
+"########+ .@#######. ###o +####",
+"##########o oO####o oo .@#####",
+"############O. .+#######",
+"###############+ooooo o#########",
+"##################### #########",
+"##################### #########",
+"#####################o +########",
+"#####################O o########",
+"#####################O O########",
+"###################### .########",
+"########o o#########o ########",
+"#######X X########o ########",
+"######O o#######o ########",
+"######X #######o ########",
+"###### #######o ########",
+"###### ####### .########",
+"######X o######+ O########",
+"######O @######. #########",
+"####### +######+ O#########",
+"#######+ @######O X##########",
+"########+ o+##O. X###########",
+"##########o +############",
+"############+OOOo@##############"
+};
diff --git a/data/pixmaps/feta/12/clefs-G_change.xpm b/data/pixmaps/feta/12/clefs-G_change.xpm
new file mode 100644
index 0000000..ca3c45e
--- /dev/null
+++ b/data/pixmaps/feta/12/clefs-G_change.xpm
@@ -0,0 +1,86 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"26 72 8 1",
+" c #040404",
+". c #2d2d2d",
+"X c #515151",
+"o c Gray46",
+"O c Gray54",
+"+ c #afafaf",
+"@ c Gray82",
+"# c None",
+/* pixels */
+"##########################",
+"###############O##########",
+"##############X X#########",
+"#############X +########",
+"############X ########",
+"###########+ o#######",
+"##########@ X #######",
+"##########o X#+ +######",
+"########## X### o######",
+"#########o @###o ######",
+"#########o O####o +#####",
+"######### #####O O#####",
+"######### O#####O X#####",
+"######### ######o #####",
+"######### X######o #####",
+"######### O######. #####",
+"#########X O#####@ #####",
+"#########O O#####O X#####",
+"#########O O#####. O#####",
+"########## o####+ @#####",
+"########## .####. .######",
+"##########X ###o O######",
+"##########o ##O X#######",
+"##########O +@ @#######",
+"########### XX o########",
+"########### o#########",
+"########### .##########",
+"##########O @##########",
+"#########O @###########",
+"########O O############",
+"#######O o############",
+"######+ o. ############",
+"#####@. o#o ############",
+"#####. o##o @###########",
+"####O X###+ O###########",
+"###@ .@#### o###########",
+"###. @##### .###########",
+"##O o#####@. ..X+@######",
+"##X .####@. .o@####",
+"## +###@. .@###",
+"#@ ####. .X. .@##",
+"#O o###+ X+ .##@O. .##",
+"#O o###X O##. ####@. O#",
+"#O @### .###o @####@. .#",
+"#O #### O###o O#####+ @",
+"#+ ###@ O###@ o###### O",
+"## ####o X#### X######o O",
+"##. @###+ @###. ######O O",
+"##+ O####. X###o ######O +",
+"###. @####. o@#O O#####X #",
+"###@ X####@X ++ o##### X#",
+"####O o#####@X@# X####O @#",
+"#####+ X@####### ###@ O##",
+"######+. X@#####o ##+ O###",
+"########o X+O+X . .O####",
+"##########+X. .+######",
+"#############@@#@ X#######",
+"################# #######",
+"#################. #######",
+"#################O O######",
+"#################o O######",
+"######O. X@####### o######",
+"#####X @###### o######",
+"####+ X###### o######",
+"####O ###### o######",
+"####o #####@ O######",
+"####+ X#####o #######",
+"#####. +##### .#######",
+"#####+ .@#####X +#######",
+"######+ O+##O +########",
+"########X .+#########",
+"##########OOOo@###########"
+};
diff --git a/data/pixmaps/feta/12/clefs-hufnagel_do.xpm b/data/pixmaps/feta/12/clefs-hufnagel_do.xpm
new file mode 100644
index 0000000..ce9fd36
--- /dev/null
+++ b/data/pixmaps/feta/12/clefs-hufnagel_do.xpm
@@ -0,0 +1,33 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"15 19 8 1",
+" c Gray1",
+". c #2c2c2c",
+"X c #555555",
+"o c Gray49",
+"O c #868686",
+"+ c Gray68",
+"@ c Gray80",
+"# c None",
+/* pixels */
+"###############",
+"#########O+####",
+"#######O X@##",
+"#####o O",
+"###@. X#",
+"##@. X##",
+"##. +###",
+"#O .+++@####",
+"#O .########",
+"#O .########",
+"#O .########",
+"#O .########",
+"#O .########",
+"#O X@######",
+"#O .######",
+"#O @######",
+"#O @#######",
+"#+. @########",
+"###+O##########"
+};
diff --git a/data/pixmaps/feta/12/clefs-hufnagel_do_change.xpm b/data/pixmaps/feta/12/clefs-hufnagel_do_change.xpm
new file mode 100644
index 0000000..e6ce6f9
--- /dev/null
+++ b/data/pixmaps/feta/12/clefs-hufnagel_do_change.xpm
@@ -0,0 +1,29 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"12 15 8 1",
+" c Gray1",
+". c Gray16",
+"X c Gray34",
+"o c #747474",
+"O c #818181",
+"+ c Gray69",
+"@ c Gray81",
+"# c None",
+/* pixels */
+"############",
+"######@o+###",
+"####@X XX+",
+"###O +",
+"##O .+#",
+"#+ ...X###",
+"#o +######",
+"#O +######",
+"#O +######",
+"#o +######",
+"#O o######",
+"#O @####",
+"#O X#####",
+"#O o######",
+"##+o@#######"
+};
diff --git a/data/pixmaps/feta/12/clefs-hufnagel_do_fa.xpm b/data/pixmaps/feta/12/clefs-hufnagel_do_fa.xpm
new file mode 100644
index 0000000..f380ded
--- /dev/null
+++ b/data/pixmaps/feta/12/clefs-hufnagel_do_fa.xpm
@@ -0,0 +1,62 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"15 48 8 1",
+" c Gray1",
+". c #343434",
+"X c Gray32",
+"o c #6f6f6f",
+"O c Gray53",
+"+ c Gray69",
+"@ c Gray82",
+"# c None",
+/* pixels */
+"###############",
+"#########O+####",
+"#######O o@##",
+"#####O O",
+"###@. X#",
+"###. X##",
+"##. +###",
+"#o .OOO+####",
+"#O .########",
+"#O .########",
+"#o .########",
+"#O .########",
+"#O .########",
+"#O o#######",
+"#O ######",
+"#O +######",
+"#o O#######",
+"#+ +########",
+"##@X.@#########",
+"###############",
+"###############",
+"########@Xo####",
+"######+. .+@@",
+"####@X O",
+"###@ o#",
+"##@ o##",
+"#@ @###",
+"#O .@@+@####",
+"#O .########",
+"#O .##+@####",
+"#O .@X +###",
+"#O . O",
+"#o @",
+"#O .@#",
+"#O X@##",
+"#O oXXO####",
+"#O .########",
+"#o .########",
+"#O .########",
+"#O .########",
+"#o .########",
+"#O .########",
+"#O .########",
+"#O o########",
+"#O @########",
+"#O X@#########",
+"#O X###########",
+"#++############"
+};
diff --git a/data/pixmaps/feta/12/clefs-hufnagel_do_fa_change.xpm b/data/pixmaps/feta/12/clefs-hufnagel_do_fa_change.xpm
new file mode 100644
index 0000000..3c2fb9a
--- /dev/null
+++ b/data/pixmaps/feta/12/clefs-hufnagel_do_fa_change.xpm
@@ -0,0 +1,57 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"12 43 8 1",
+" c #040404",
+". c #2d2d2d",
+"X c #4b4b4b",
+"o c #767676",
+"O c Gray54",
+"+ c #b4b4b4",
+"@ c #d2d2d2",
+"# c None",
+/* pixels */
+"############",
+"#######O+###",
+"####@o Xo+",
+"###+ +",
+"##+ @#",
+"#+ . X@##",
+"#O o######",
+"#O o######",
+"#O o######",
+"#O o######",
+"#O o######",
+"#O X#####",
+"#O X#####",
+"#O o######",
+"#@. o#######",
+"###@########",
+"############",
+"############",
+"############",
+"############",
+"############",
+"#######+@###",
+"#####+X O@@",
+"####o O",
+"##@. O#",
+"#@ O##",
+"#O o@@@###",
+"#O o######",
+"#O O#oO###",
+"#O o+@",
+"#O O",
+"#O O#",
+"#O .@##",
+"#O o#@####",
+"#O o######",
+"#O o######",
+"#O O######",
+"#O o######",
+"#O o######",
+"#O O######",
+"#O X#######",
+"#O o########",
+"#++#########"
+};
diff --git a/data/pixmaps/feta/12/clefs-hufnagel_fa.xpm b/data/pixmaps/feta/12/clefs-hufnagel_fa.xpm
new file mode 100644
index 0000000..a88bb14
--- /dev/null
+++ b/data/pixmaps/feta/12/clefs-hufnagel_fa.xpm
@@ -0,0 +1,43 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"15 29 8 1",
+" c #020202",
+". c Gray20",
+"X c #535353",
+"o c #6d6d6d",
+"O c Gray52",
+"+ c #aaaaaa",
+"@ c #cdcdcd",
+"# c None",
+/* pixels */
+"###############",
+"#########+@####",
+"#######+ o@##",
+"#####+. .@",
+"####O .#",
+"###. .##",
+"##X .###",
+"#+ .O..+####",
+"#O .#@######",
+"#O .########",
+"#O .#@Xo@###",
+"#O .o o@#",
+"#O @",
+"#O +#",
+"#O +##",
+"#O .+###",
+"#O .@o+#####",
+"#O .########",
+"#O .########",
+"#O .########",
+"#O .########",
+"#O .########",
+"#O .########",
+"#O .########",
+"#O o########",
+"#O o#########",
+"#O o##########",
+"#o @###########",
+"#@#############"
+};
diff --git a/data/pixmaps/feta/12/clefs-hufnagel_fa_change.xpm b/data/pixmaps/feta/12/clefs-hufnagel_fa_change.xpm
new file mode 100644
index 0000000..9d7d231
--- /dev/null
+++ b/data/pixmaps/feta/12/clefs-hufnagel_fa_change.xpm
@@ -0,0 +1,37 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"12 23 8 1",
+" c #040404",
+". c Gray16",
+"X c Gray27",
+"o c Gray47",
+"O c #8b8b8b",
+"+ c #afafaf",
+"@ c #d2d2d2",
+"# c None",
+/* pixels */
+"############",
+"#######++###",
+"#####+. o+#",
+"####X O",
+"##+ o#",
+"#+ . .@##",
+"#O O@O####",
+"#O o######",
+"#O O@XO###",
+"#O . ..+",
+"#O @",
+"#O .@#",
+"#O .X.X@##",
+"#O O######",
+"#O o######",
+"#O o######",
+"#O o######",
+"#O O######",
+"#O o######",
+"#O +######",
+"#O +#######",
+"#o.@########",
+"#@@#########"
+};
diff --git a/data/pixmaps/feta/12/clefs-medicaea_do.xpm b/data/pixmaps/feta/12/clefs-medicaea_do.xpm
new file mode 100644
index 0000000..8eb2473
--- /dev/null
+++ b/data/pixmaps/feta/12/clefs-medicaea_do.xpm
@@ -0,0 +1,51 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"14 37 8 1",
+" c Gray1",
+". c Gray23",
+"X c Gray36",
+"o c #717171",
+"O c #898989",
+"+ c #bbbbbb",
+"@ c Gray77",
+"# c None",
+/* pixels */
+"##############",
+"#@+###########",
+"#oo###########",
+"#oo###########",
+"#oo###########",
+"#oX###########",
+"#oX###########",
+"#oX###########",
+"#O O##########",
+"#O O########",
+"#O o######",
+"#O o####",
+"#O O##",
+"#O +",
+"#oo@. O",
+"#oo##@. O",
+"#oo####@. O",
+"#oX######+. O",
+"#oo########+.O",
+"#O +##########",
+"#O .+########",
+"#O .@######",
+"#O .+####",
+"#O .@##",
+"#O .@",
+"#oXO O",
+"#oo##o O",
+"#oo####O O",
+"#oo######o O",
+"#oX########O O",
+"#oX#########@@",
+"#oX###########",
+"#oo###########",
+"#oo###########",
+"#oo###########",
+"#oX###########",
+"#@+###########"
+};
diff --git a/data/pixmaps/feta/12/clefs-medicaea_do_change.xpm b/data/pixmaps/feta/12/clefs-medicaea_do_change.xpm
new file mode 100644
index 0000000..8da2fe6
--- /dev/null
+++ b/data/pixmaps/feta/12/clefs-medicaea_do_change.xpm
@@ -0,0 +1,44 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"12 30 8 1",
+" c Gray2",
+". c Gray15",
+"X c Gray36",
+"o c #747474",
+"O c Gray54",
+"+ c #bbbbbb",
+"@ c #c1c1c1",
+"# c None",
+/* pixels */
+"############",
+"#@+#########",
+"#oX#########",
+"#oX#########",
+"#oo#########",
+"#O.#########",
+"#O o#######",
+"#O o#####",
+"#O O###",
+"#O o#",
+"#oXO O",
+"#oX##o O",
+"#oX####o O",
+"#oo######o O",
+"#oX#########",
+"#oX#########",
+"#oX#########",
+"#O O########",
+"#O o######",
+"#O o####",
+"#O O##",
+"#O.. +",
+"#oo#o O",
+"#oX###o O",
+"#oX#####o O",
+"#oX#######o@",
+"#oo#########",
+"#oo#########",
+"#oX#########",
+"#@+#########"
+};
diff --git a/data/pixmaps/feta/12/clefs-medicaea_fa.xpm b/data/pixmaps/feta/12/clefs-medicaea_fa.xpm
new file mode 100644
index 0000000..a2cd7b0
--- /dev/null
+++ b/data/pixmaps/feta/12/clefs-medicaea_fa.xpm
@@ -0,0 +1,51 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"22 37 8 1",
+" c Gray1",
+". c #2c2c2c",
+"X c #515151",
+"o c Gray43",
+"O c #898989",
+"+ c Gray72",
+"@ c #cecece",
+"# c None",
+/* pixels */
+"######################",
+"#########@+###########",
+"#########+.###########",
+"#########@.###########",
+"#########+.###########",
+"#########+.###########",
+"#########+.###########",
+"#########+.###########",
+"#########@ X@#########",
+"#########@ o@#######",
+"#########@ o@#####",
+"#########@ o@###",
+"#########@ o##",
+"#+ o##@ +",
+"#O .##+.#X O",
+"#O .##+.##@X O",
+"#O .##+.####@X O",
+"#O .##+.######@X O",
+"#O .##+.########@.o",
+"#O .##@ O##########",
+"#o .##@ .+########",
+"#O .##@ .+######",
+"#O .##@ .+####",
+"#O .##@ .+##",
+"##ooOo.##@ .@",
+"#####@.##+.+. O",
+"#####@.##+.##O. O",
+"#####@.##+.####O. O",
+"#####@.##+.######O O",
+"#####@.##+.########O O",
+"#####@.##+.#########@@",
+"#####@.##+.###########",
+"#####@.##+.###########",
+"#####@.##+.###########",
+"#####@.##+.###########",
+"#####@.##+.###########",
+"######O##@O###########"
+};
diff --git a/data/pixmaps/feta/12/clefs-medicaea_fa_change.xpm b/data/pixmaps/feta/12/clefs-medicaea_fa_change.xpm
new file mode 100644
index 0000000..f183fd4
--- /dev/null
+++ b/data/pixmaps/feta/12/clefs-medicaea_fa_change.xpm
@@ -0,0 +1,44 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"19 30 8 1",
+" c #070707",
+". c Gray15",
+"X c #5f5f5f",
+"o c #727272",
+"O c #8b8b8b",
+"+ c #bcbcbc",
+"@ c Gray76",
+"# c None",
+/* pixels */
+"###################",
+"########++#########",
+"########oo#########",
+"########oo#########",
+"########oo#########",
+"########o.#########",
+"########o O#######",
+"########o o#####",
+"########O o###",
+"########o o#",
+"########oXO O",
+"#+ ##oX##o O",
+"#O ##Xo####o O",
+"#O ##oo######O O",
+"#O ##oX#########",
+"#O ##Xo#########",
+"#O ##oX#########",
+"#O ##o O########",
+"#O ##O o######",
+"#+ ##o o####",
+"####@ ##o o##",
+"#####.##o.. @",
+"##### @#Xo#o O",
+"#####.##oo###o O",
+"##### ##XX#####o O",
+"##### ##Xo#######o+",
+"##### ##Xo#########",
+"#####.@#oo#########",
+"#####.##oo#########",
+"#####O##++#########"
+};
diff --git a/data/pixmaps/feta/12/clefs-mensural1_c.xpm b/data/pixmaps/feta/12/clefs-mensural1_c.xpm
new file mode 100644
index 0000000..7a3413d
--- /dev/null
+++ b/data/pixmaps/feta/12/clefs-mensural1_c.xpm
@@ -0,0 +1,60 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"32 48 6 1",
+" c #040404",
+". c Gray25",
+"X c #7c7c7c",
+"o c #868686",
+"O c #c5c5c5",
+"+ c None",
+/* pixels */
+"++++++++++++++++++++++++++++++++",
+"+Oo++oO+++++++++++++++++++Oo++oO",
+"+o ++ X+++++++++++++++++++X ++ o",
+"+o ++ o+++++++++++++++++++o ++ o",
+"+o ++ X+++++++++++++++++++X ++ o",
+"+o ++ X+++++++++++++++++++X ++ o",
+"+o ++ X+++++++++++++++++++X ++ o",
+"+o ++ X+++++++++++++++++++X ++ o",
+"+o ++ X+++++++++++++++++++X ++ o",
+"+o ++ X+++++++++++++++++++X ++ o",
+"+o ++ X+++++++++++++++++++X ++ o",
+"+o ++ X+++++++++++++++++++X ++ o",
+"+o ++ X+++++++++++++++++++X ++ o",
+"+o ++ X+++++++++++++++++++X ++ o",
+"+o ++ X+++++++++++++++++++X ++ o",
+"+o ++ X+++++++++++++++++++X ++ o",
+"+o ++ X+++++++++++++++++++X ++ o",
+"+o ++ +++++++++++++++++++ ++ o",
+"+o ++ ++ o",
+"+o ++ ++ o",
+"+o ++ ++ X",
+"+o ++ ++ o",
+"+o ++ ++ o",
+"+o ++ .+++++++++++++++++++. ++ o",
+"+o ++ X+++++++++++++++++++X ++ o",
+"+o ++ .+++++++++++++++++++. ++ o",
+"+o ++ ++ o",
+"+o ++ ++ o",
+"+o ++ ++ X",
+"+o ++ ++ X",
+"+o ++ ++ o",
+"+o ++ +++++++++++++++++++ ++ o",
+"+o ++ X+++++++++++++++++++X ++ o",
+"+o ++ X+++++++++++++++++++X ++ o",
+"+o ++ X+++++++++++++++++++X ++ o",
+"+o ++ X+++++++++++++++++++X ++ o",
+"+o ++ X+++++++++++++++++++X ++ o",
+"+o ++ X+++++++++++++++++++X ++ o",
+"+o ++ X+++++++++++++++++++X ++ o",
+"+o ++ X+++++++++++++++++++X ++ o",
+"+o ++ X+++++++++++++++++++X ++ o",
+"+o ++ X+++++++++++++++++++X ++ o",
+"+o ++ X+++++++++++++++++++X ++ o",
+"+o ++ X+++++++++++++++++++X ++ o",
+"+o ++ X+++++++++++++++++++X ++ o",
+"+o ++ X+++++++++++++++++++X ++ o",
+"+o ++ X+++++++++++++++++++X ++ o",
+"+Oo++oO+++++++++++++++++++Oo++oO"
+};
diff --git a/data/pixmaps/feta/12/clefs-mensural1_c_change.xpm b/data/pixmaps/feta/12/clefs-mensural1_c_change.xpm
new file mode 100644
index 0000000..2a9468c
--- /dev/null
+++ b/data/pixmaps/feta/12/clefs-mensural1_c_change.xpm
@@ -0,0 +1,51 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"26 39 6 1",
+" c Gray1",
+". c Gray44",
+"X c Gray52",
+"o c #bbbbbb",
+"O c Gray78",
+"+ c None",
+/* pixels */
+"++++++++++++++++++++++++++",
+"+OX+oo+++++++++++++++oo+.O",
+"+X +..+++++++++++++++..+ X",
+"+X +..+++++++++++++++..+ X",
+"+X +..+++++++++++++++..+ X",
+"+X +..+++++++++++++++..+ X",
+"+X +..+++++++++++++++..+ X",
+"+X +..+++++++++++++++..+ X",
+"+X +..+++++++++++++++..+ X",
+"+X +..+++++++++++++++..+ X",
+"+X +..+++++++++++++++..+ X",
+"+X +..+++++++++++++++..+ X",
+"+X +..+++++++++++++++..+ X",
+"+X +..+++++++++++++++..+ X",
+"+X +. +++++++++++++++ .+ X",
+"+X +X X+ X",
+"+X +X X+ X",
+"+X +X X+ X",
+"+X +X .X.XX..XX.X..X. X+ X",
+"+X +..+++++++++++++++..+ X",
+"+X +..+++++++++++++++..+ X",
+"+X +. .XX..XX..X.XX.. X+ X",
+"+X +X X+ X",
+"+X +X X+ X",
+"+X +X .+ X",
+"+X +. +++++++++++++++ X+ X",
+"+X +..+++++++++++++++..+ X",
+"+X +..+++++++++++++++..+ X",
+"+X +..+++++++++++++++..+ X",
+"+X +..+++++++++++++++..+ X",
+"+X +..+++++++++++++++..+ X",
+"+X +..+++++++++++++++..+ X",
+"+X +..+++++++++++++++..+ X",
+"+X +..+++++++++++++++..+ X",
+"+X +..+++++++++++++++..+ X",
+"+X +..+++++++++++++++..+ X",
+"+X +..+++++++++++++++..+ X",
+"+X +..+++++++++++++++..+ X",
+"+OX+oo+++++++++++++++oo+XO"
+};
diff --git a/data/pixmaps/feta/12/clefs-mensural1_f.xpm b/data/pixmaps/feta/12/clefs-mensural1_f.xpm
new file mode 100644
index 0000000..30790d0
--- /dev/null
+++ b/data/pixmaps/feta/12/clefs-mensural1_f.xpm
@@ -0,0 +1,81 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"25 67 8 1",
+" c Gray1",
+". c #353535",
+"X c #515151",
+"o c Gray41",
+"O c Gray54",
+"+ c #aeaeae",
+"@ c #d2d2d2",
+"# c None",
+/* pixels */
+"#########################",
+"###################@o####",
+"##################O +###",
+"#################@ @##",
+"#################o o##",
+"################+ +#",
+"#+o########OO###. o. .#",
+"#O ########..##o .#+ +",
+"#O O#@@#@#+ X#@ O##o O",
+"#O .o .#o X##@ O",
+"#O .o .#. @##X #",
+"#O .o .#X .##. o#",
+"#O .o X#+ OO ##",
+"#O . Xo .. .##X +##",
+"#O @####### .##@. @##",
+"#o ########..###o O##",
+"#O +@@@#@@@ .###+ .##",
+"#O .o .###o o#",
+"#O .o X##+ @o @",
+"#O .o .##. o#@. O",
+"#O .o .#+ O##+ o",
+"#O . oo .. .#. @##. @",
+"#O +######@ .#. X##X X#",
+"#o ########..#O @+ @#",
+"#@+########..#@. X. O##",
+"###########..##+ ###",
+"###########..###X O###",
+"###########..###+ X####",
+"###########..####O .@####",
+"###########..####+ o#####",
+"###########..####+ o#####",
+"###########..####+ o#####",
+"###########..####+ o#####",
+"###########..####+ o#####",
+"###########..#@##+ o#####",
+"###########..####+ o#####",
+"###########..####+ o#####",
+"###########..####+ o#####",
+"###########..####+ o#####",
+"###########..####+ o#####",
+"###########..####+ o#####",
+"###########..####+ o#####",
+"###########..####+ o#####",
+"###########..####+ o#####",
+"###########..####+ o#####",
+"###########..####+ o#####",
+"###########..####+ o#####",
+"###########..####+ o#####",
+"###########..####+ o#####",
+"###########..####+ o#####",
+"###########..####+ o#####",
+"###########..####+ o#####",
+"###########..####+ o#####",
+"###########..####+ o#####",
+"###########..####+ o#####",
+"###########..####+ o#####",
+"###########..####+ o#####",
+"###########..####+ o#####",
+"###########..####+ o#####",
+"###########..####+ o#####",
+"###########OO####+ o#####",
+"#################+ o#####",
+"#################+ o#####",
+"#################+ o#####",
+"#################+ o#####",
+"#################+ o#####",
+"#################@o+#####"
+};
diff --git a/data/pixmaps/feta/12/clefs-mensural1_f_change.xpm b/data/pixmaps/feta/12/clefs-mensural1_f_change.xpm
new file mode 100644
index 0000000..9db534f
--- /dev/null
+++ b/data/pixmaps/feta/12/clefs-mensural1_f_change.xpm
@@ -0,0 +1,69 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"21 55 8 1",
+" c #070707",
+". c Gray18",
+"X c #505050",
+"o c Gray43",
+"O c #8b8b8b",
+"+ c #afafaf",
+"@ c #d2d2d2",
+"# c None",
+/* pixels */
+"#####################",
+"################++###",
+"###############+ ###",
+"##############+ o##",
+"##############. ##",
+"#############+ X .#",
+"############# X#X +",
+"#oX######Xo#o O#+ O",
+"#O @@@#@@ o# @#O #",
+"#O O# .#+ O#",
+"#O o#X +. ##",
+"#O O#@ @##",
+"#O X+OO+X O##O X###",
+"#O ###### o### .###",
+"#O @####@ o###o +##",
+"#O .oXXo. O###o .##",
+"#O O##@ o#",
+"#O o##. @. @",
+"#O ...... o#+ o#@ O",
+"#o ###### o#. .##X @",
+"#OO######oo@ O#+ X#",
+"#########oo#. @. @#",
+"#########oo#O . O##",
+"#########oo##X .###",
+"#########oo##@ O###",
+"#########oo###o O####",
+"#########oo####.#####",
+"#########oo###@ @####",
+"#########oo####.#####",
+"#########oo###@ #####",
+"#########oo###@.#####",
+"#########oo#### #####",
+"#########oo#### #####",
+"#########oo#### @####",
+"#########oo#### #####",
+"#########oo####.#####",
+"#########oo###@ #####",
+"#########oo####.@####",
+"#########oo#### #####",
+"#########oo#### #####",
+"#########oo#### #####",
+"#########oo#### #####",
+"#########oo#### @####",
+"#########oo####.#####",
+"#########oo###@ #####",
+"#########oo####.#####",
+"#########oo###@.@####",
+"#########oo#### #####",
+"#########oo###@.#####",
+"#########oo####.@####",
+"############### #####",
+"############### #####",
+"##############@.#####",
+"###############.#####",
+"###############O#####"
+};
diff --git a/data/pixmaps/feta/12/clefs-mensural2_c.xpm b/data/pixmaps/feta/12/clefs-mensural2_c.xpm
new file mode 100644
index 0000000..7759c9f
--- /dev/null
+++ b/data/pixmaps/feta/12/clefs-mensural2_c.xpm
@@ -0,0 +1,61 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"13 48 7 1",
+" c Gray2",
+". c #535353",
+"X c #797979",
+"o c #838383",
+"O c #a5a5a5",
+"+ c #c5c5c5",
+"@ c None",
+/* pixels */
+"@@@@@@@@@@@@@",
+"@+o@@@@@@@@o+",
+"@X @@@@@@@@ X",
+"@X @@@@@@@@ X",
+"@X @@@@@@@@ X",
+"@X @@@@@@@@ X",
+"@X @@@@@@@@ X",
+"@X @@@@@@@@ X",
+"@X @@@@@@@@ X",
+"@X @@@@@@@@ X",
+"@X @@@@@@@@ X",
+"@X @@@@@@@@ X",
+"@X @@@@@@@@ X",
+"@X @@@@@@@@ X",
+"@X ooXOOXoo X",
+"@o .. X",
+"@X .. o",
+"@X +@@@@@@+ X",
+"@X @@@@@@@@ X",
+"@X @@@@@@@@ X",
+"@o .oXOOXo. o",
+"@o .. o",
+"@X .. X",
+"@X @@@@@@@@ X",
+"@X @@@@@@@@ X",
+"@X @@@@@@@@ X",
+"@o .. X",
+"@o .. X",
+"@o .oXOOXo. o",
+"@X @@@@@@@@ X",
+"@X @@@@@@@@ X",
+"@X O@@@@@@+ X",
+"@o .. o",
+"@o .. X",
+"@X ooXOOXoo X",
+"@X @@@@@@@@ X",
+"@X @@@@@@@@ X",
+"@X @@@@@@@@ X",
+"@X @@@@@@@@ X",
+"@X @@@@@@@@ X",
+"@X @@@@@@@@ X",
+"@X @@@@@@@@ X",
+"@X @@@@@@@@ X",
+"@X @@@@@@@@ X",
+"@X @@@@@@@@ X",
+"@X @@@@@@@@ X",
+"@X @@@@@@@@ X",
+"@+o@@@@@@@@o+"
+};
diff --git a/data/pixmaps/feta/12/clefs-mensural2_c_change.xpm b/data/pixmaps/feta/12/clefs-mensural2_c_change.xpm
new file mode 100644
index 0000000..f26b9dd
--- /dev/null
+++ b/data/pixmaps/feta/12/clefs-mensural2_c_change.xpm
@@ -0,0 +1,54 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"10 41 7 1",
+" c Gray3",
+". c #353535",
+"X c Gray45",
+"o c #848484",
+"O c Gray73",
+"+ c #c5c5c5",
+"@ c None",
+/* pixels */
+"@@@@@@@@@@",
+"@O+@@@@@+O",
+"@Xo@@@@@XX",
+"@Xo@@@@@oX",
+"@Xo@@@@@oX",
+"@Xo@@@@@XX",
+"@Xo@@@@@oX",
+"@Xo@@@@@XX",
+"@XX@@@@@XX",
+"@XX@@@@@oX",
+"@X.oXXoo.X",
+"@X X",
+"@X X",
+"@XX@@@@@XX",
+"@Xo@@@@@oX",
+"@XX@@@@@XX",
+"@Xo@@@@@oX",
+"@X.oXoXo.X",
+"@X X",
+"@o X",
+"@XX@@@@@XX",
+"@XX@@@@@XX",
+"@o X",
+"@X X",
+"@X.oooXo.X",
+"@Xo@@@@@XX",
+"@XX@@@@@XX",
+"@Xo@@@@@oX",
+"@XX@@@@@XX",
+"@X X",
+"@X X",
+"@X.oXoXo.X",
+"@Xo@@@@@XX",
+"@XX@@@@@XX",
+"@Xo@@@@@oX",
+"@Xo@@@@@oX",
+"@Xo@@@@@XX",
+"@Xo@@@@@XX",
+"@XX@@@@@oX",
+"@Xo@@@@@XX",
+"@O+@@@@@+O"
+};
diff --git a/data/pixmaps/feta/12/clefs-mensural2_f.xpm b/data/pixmaps/feta/12/clefs-mensural2_f.xpm
new file mode 100644
index 0000000..128b512
--- /dev/null
+++ b/data/pixmaps/feta/12/clefs-mensural2_f.xpm
@@ -0,0 +1,33 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"18 19 8 1",
+" c #040404",
+". c Gray23",
+"X c Gray29",
+"o c #7b7b7b",
+"O c Gray52",
+"+ c #b7b7b7",
+"@ c #c3c3c3",
+"# c None",
+/* pixels */
+"##################",
+"###+OO+#######+###",
+"##O .@###+ .+#",
+"## +## @",
+"#@OX +# O",
+"####+. X#@. @",
+"######X ###X +#",
+"#######X O######",
+"#######+ o######",
+"######## O######",
+"########o +######",
+"########O #######",
+"########X o#######",
+"#######+ +##o o##",
+"#######X X##X X#",
+"###+oO X### O",
+"##O O####O O",
+"## .@######+ X#",
+"#@OO##########++##"
+};
diff --git a/data/pixmaps/feta/12/clefs-mensural2_f_change.xpm b/data/pixmaps/feta/12/clefs-mensural2_f_change.xpm
new file mode 100644
index 0000000..e630c67
--- /dev/null
+++ b/data/pixmaps/feta/12/clefs-mensural2_f_change.xpm
@@ -0,0 +1,32 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"17 18 8 1",
+" c Gray2",
+". c #323232",
+"X c Gray29",
+"o c #747474",
+"O c #8e8e8e",
+"+ c Gray71",
+"@ c #cdcdcd",
+"# c None",
+/* pixels */
+"#################",
+"###OOO######@O###",
+"#@ O###@ .+#",
+"#O o##o +",
+"###+. +#+ +",
+"#####O X###o X#",
+"######O #######",
+"#######. +######",
+"#######X @######",
+"#######+ @######",
+"#######@ .#######",
+"#######@ O#######",
+"#######O @#######",
+"####### .###o o##",
+"#####+ .@##O .#",
+"##o X@###o O",
+"#+ O######@ #",
+"#+o@#########@o##"
+};
diff --git a/data/pixmaps/feta/12/clefs-mensural3_c.xpm b/data/pixmaps/feta/12/clefs-mensural3_c.xpm
new file mode 100644
index 0000000..f7ce8e6
--- /dev/null
+++ b/data/pixmaps/feta/12/clefs-mensural3_c.xpm
@@ -0,0 +1,73 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"13 59 8 1",
+" c #040404",
+". c #343434",
+"X c #505050",
+"o c #777777",
+"O c Gray52",
+"+ c Gray71",
+"@ c #cacaca",
+"# c None",
+/* pixels */
+"#############",
+"#@O########O@",
+"#o ######## o",
+"#o ######## o",
+"#o ######## o",
+"#o ######## o",
+"#o ######## o",
+"#o ######## o",
+"#o ######## o",
+"#o ######## o",
+"#o ######## o",
+"#o ######## o",
+"#o ######## o",
+"#o ######## o",
+"#o oXXOOXoX o",
+"#O XX O",
+"#o ...Xo .. o",
+"#o @######@ o",
+"#o ######## o",
+"#o ######## o",
+"#O .XXOOXX. O",
+"#O XX O",
+"#o ...oo... O",
+"#o ######## o",
+"#o ######## o",
+"#o @@@@@@@@ o",
+"#O XX O",
+"#O XX o",
+"#O O@+@@+@O O",
+"#o ######## o",
+"#o ######## o",
+"#O O@+@@+@O O",
+"#o XX o",
+"#O XX O",
+"#o @@@@@@@@ o",
+"#o ######## o",
+"#o ######## o",
+"#O ...oo... o",
+"#O XX O",
+"#O .XXOOXX. O",
+"#o ######## o",
+"#o ######## o",
+"#o @######@ o",
+"#O .. oo .. O",
+"#O XX O",
+"#o ooXOOXXo o",
+"#o ######## o",
+"#o ######## o",
+"#o ######## o",
+"#o ######## o",
+"#o ######## o",
+"#o ######## o",
+"#o ######## o",
+"#o ######## o",
+"#o ######## o",
+"#o ######## o",
+"#o ######## o",
+"#o ######## o",
+"#@O########O@"
+};
diff --git a/data/pixmaps/feta/12/clefs-mensural3_c_change.xpm b/data/pixmaps/feta/12/clefs-mensural3_c_change.xpm
new file mode 100644
index 0000000..3a3df4f
--- /dev/null
+++ b/data/pixmaps/feta/12/clefs-mensural3_c_change.xpm
@@ -0,0 +1,66 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"11 52 8 1",
+" c #010101",
+". c Gray18",
+"X c #585858",
+"o c #686868",
+"O c Gray53",
+"+ c #b9b9b9",
+"@ c Gray78",
+"# c None",
+/* pixels */
+"###########",
+"#@o######o@",
+"#O ###### O",
+"#O ###### O",
+"#O ###### O",
+"#O ###### O",
+"#O ###### O",
+"#O ###### O",
+"#O ###### O",
+"#O ###### O",
+"#O oooooo O",
+"#O O",
+"#O ...... O",
+"#O ###### O",
+"#O ###### O",
+"#O ###### O",
+"#O ###### O",
+"#O XXXXXX O",
+"#O O",
+"#O ...... O",
+"#O ###### O",
+"#O @@@@@@ O",
+"#O O",
+"#O O",
+"#O ++++++ O",
+"#O ###### O",
+"#O ###### O",
+"#O ###### O",
+"#O ++++++ O",
+"#O O",
+"#O O",
+"#O @@@@@@ O",
+"#O ###### O",
+"#O ...... O",
+"#O O",
+"#O XXXXXX O",
+"#O ###### O",
+"#O ###### O",
+"#O ###### O",
+"#O ###### O",
+"#O ...... O",
+"#O O",
+"#O oooooo O",
+"#O ###### O",
+"#O ###### O",
+"#O ###### O",
+"#O ###### O",
+"#O ###### O",
+"#O ###### O",
+"#O ###### O",
+"#O ###### O",
+"#@O######O@"
+};
diff --git a/data/pixmaps/feta/12/clefs-mensural_g.xpm b/data/pixmaps/feta/12/clefs-mensural_g.xpm
new file mode 100644
index 0000000..2d708fc
--- /dev/null
+++ b/data/pixmaps/feta/12/clefs-mensural_g.xpm
@@ -0,0 +1,42 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"16 28 8 1",
+" c Gray2",
+". c Gray22",
+"X c #4c4c4c",
+"o c #797979",
+"O c #888888",
+"+ c #b6b6b6",
+"@ c #c5c5c5",
+"# c None",
+/* pixels */
+"################",
+"#########@o@####",
+"########+ +###",
+"######## O###",
+"######## o@###",
+"########X o#####",
+"########+ .@##",
+"#########X +#",
+"##########o X#",
+"#######O##### +",
+"#####@. +##+ O",
+"####+ XX O",
+"###+ +",
+"###X o. +#",
+"##o + #oOO###",
+"## X## . X@###",
+"## ### +##",
+"#O o### ##",
+"#O O### O#",
+"#O o### ##+ o#",
+"#O ### ###o O#",
+"#+ +## ###O O#",
+"## .## ###o +#",
+"##+ X# ###o ##",
+"###X ##o o##",
+"####X ###",
+"#####+o +###",
+"#######++@o+####"
+};
diff --git a/data/pixmaps/feta/12/clefs-mensural_g_change.xpm b/data/pixmaps/feta/12/clefs-mensural_g_change.xpm
new file mode 100644
index 0000000..85e16e9
--- /dev/null
+++ b/data/pixmaps/feta/12/clefs-mensural_g_change.xpm
@@ -0,0 +1,37 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"13 23 8 1",
+" c Gray1",
+". c #2d2d2d",
+"X c Gray33",
+"o c #747474",
+"O c #8d8d8d",
+"+ c Gray69",
+"@ c Gray81",
+"# c None",
+/* pixels */
+"#############",
+"#######+o+###",
+"######+ ###",
+"######o O##",
+"######o O@##",
+"######@ X+##",
+"#######o +#",
+"########+. .#",
+"#####+O###. O",
+"####O .X. O",
+"###O +",
+"##@ Xo. o#",
+"##. X+ oOX@##",
+"#@ O## O@#",
+"#o ### X#",
+"#O ### XX #",
+"#O O## o##o #",
+"#+ X## o##o #",
+"##. X# o##X.#",
+"##+ . XO. O#",
+"###+ @#",
+"####@o +##",
+"########++###"
+};
diff --git a/data/pixmaps/feta/12/clefs-percussion.xpm b/data/pixmaps/feta/12/clefs-percussion.xpm
new file mode 100644
index 0000000..8ebcb22
--- /dev/null
+++ b/data/pixmaps/feta/12/clefs-percussion.xpm
@@ -0,0 +1,37 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"17 25 6 1",
+" c #020202",
+". c Gray49",
+"X c #838383",
+"o c #acacac",
+"O c Gray81",
+"+ c None",
+/* pixels */
+"+++++++++++++++++",
+"+O.XXXO++++OXXX.O",
+"+X o++++o X",
+"+X o++++o X",
+"+X o++++o X",
+"+X o++++o X",
+"+X o++++o X",
+"+X o++++o X",
+"+X o++++o X",
+"+X o++++o X",
+"+X o++++o X",
+"+X o++++o X",
+"+X o++++o X",
+"+X o++++o X",
+"+X o++++o X",
+"+X o++++o .",
+"+X o++++o X",
+"+X o++++o X",
+"+X o++++o X",
+"+X o++++o X",
+"+X o++++o X",
+"+X o++++o X",
+"+X o++++o X",
+"+X o++++o X",
+"+O.XXXO++++OXXXXO"
+};
diff --git a/data/pixmaps/feta/12/clefs-percussion_change.xpm b/data/pixmaps/feta/12/clefs-percussion_change.xpm
new file mode 100644
index 0000000..d731142
--- /dev/null
+++ b/data/pixmaps/feta/12/clefs-percussion_change.xpm
@@ -0,0 +1,32 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"14 20 6 1",
+" c Gray1",
+". c Gray49",
+"X c Gray51",
+"o c #acacac",
+"O c Gray81",
+"+ c None",
+/* pixels */
+"++++++++++++++",
+"+O.X.O+++OXXXO",
+"+X o+++o X",
+"+X o+++o X",
+"+X o+++o X",
+"+X o+++o .",
+"+X o+++o X",
+"+X o+++o X",
+"+X o+++o X",
+"+X o+++o X",
+"+X o+++o X",
+"+X o+++o X",
+"+X o+++o X",
+"+X o+++o .",
+"+X o+++o X",
+"+X o+++o X",
+"+X o+++o X",
+"+X o+++o X",
+"+. o+++o X",
+"+O.XXO+++OXX.O"
+};
diff --git a/data/pixmaps/feta/12/clefs-tab.xpm b/data/pixmaps/feta/12/clefs-tab.xpm
new file mode 100644
index 0000000..3ec6356
--- /dev/null
+++ b/data/pixmaps/feta/12/clefs-tab.xpm
@@ -0,0 +1,70 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"21 56 8 1",
+" c Gray2",
+". c Gray24",
+"X c Gray28",
+"o c Gray49",
+"O c #888888",
+"+ c #b7b7b7",
+"@ c Gray77",
+"# c None",
+/* pixels */
+"#####################",
+"#@oOOOOOOOOOOOOOOOOo@",
+"#O O",
+"#O O",
+"#@oOooooO. oOOooOo@",
+"#########o ########",
+"#########o ########",
+"#########o ########",
+"#########o ########",
+"#########O ########",
+"#########o ########",
+"#########o ########",
+"#########o ########",
+"#########o ########",
+"#########o ########",
+"#########O ########",
+"#########o ########",
+"#########O ########",
+"#####################",
+"#####################",
+"######### ########",
+"########o O#######",
+"########X X#######",
+"#######+ +######",
+"#######X X######",
+"######+ OO +#####",
+"######X ## X#####",
+"###### o##O #####",
+"#####O #### o####",
+"##### o####o ####",
+"####o o###",
+"#### ###",
+"###O O##",
+"###X X########X X##",
+"##+ +########+ +#",
+"##X ########## .#",
+"#@ o##########o @",
+"#####################",
+"#####################",
+"## oO######",
+"## +####",
+"## +###",
+"## o#######o ###",
+"## o########o ###",
+"## o#######o ###",
+"## +###",
+"## X@##",
+"## +#",
+"## o########+. +",
+"## o##########+ O",
+"## o########### O",
+"## o#########+. O",
+"## .OooooooOX X#",
+"## X##",
+"## .+###",
+"##OOOOOOOOOOOo+######"
+};
diff --git a/data/pixmaps/feta/12/clefs-tab_change.xpm b/data/pixmaps/feta/12/clefs-tab_change.xpm
new file mode 100644
index 0000000..0fe44a0
--- /dev/null
+++ b/data/pixmaps/feta/12/clefs-tab_change.xpm
@@ -0,0 +1,59 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"17 45 8 1",
+" c #040404",
+". c #2d2d2d",
+"X c #484848",
+"o c #777777",
+"O c #8b8b8b",
+"+ c Gray66",
+"@ c #d2d2d2",
+"# c None",
+/* pixels */
+"#################",
+"#@oOOOOOOOOOOOOo@",
+"#O O",
+"#O .. . . .. O",
+"#######o o######",
+"#######o o######",
+"#######o o######",
+"#######o o######",
+"#######O o######",
+"#######o o######",
+"#######o O######",
+"#######o o######",
+"#######O o######",
+"#######O O######",
+"#######O. O######",
+"#################",
+"#######@@@@######",
+"#######. .######",
+"######+ +#####",
+"######. .#####",
+"#####@ oo @####",
+"#####o ++ o####",
+"####@ .##. @###",
+"####X +##+ o###",
+"###@ XX.X @##",
+"###O o##",
+"###. XXXXXX .##",
+"##O o######o O#",
+"## @######@ #",
+"#+XXO########OXX@",
+"#################",
+"#@+++++++++######",
+"#O .+####",
+"#O o###",
+"#O o@@@@@+. O##",
+"#O O######O o##",
+"#O X++OO+X +##",
+"#O +##",
+"#O X#",
+"#O o#@@#@#@o. O",
+"#O o########O O",
+"#O o#######+. O",
+"#O . . . .#",
+"#O o##",
+"#@oOoOOOOOOO#####"
+};
diff --git a/data/pixmaps/feta/12/clefs-vaticana_do.xpm b/data/pixmaps/feta/12/clefs-vaticana_do.xpm
new file mode 100644
index 0000000..03987cf
--- /dev/null
+++ b/data/pixmaps/feta/12/clefs-vaticana_do.xpm
@@ -0,0 +1,35 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"7 21 8 1",
+" c #020202",
+". c #343434",
+"X c Gray30",
+"o c #767676",
+"O c #929292",
+"+ c Gray68",
+"@ c Gray87",
+"# c None",
+/* pixels */
+"#######",
+"###+o+#",
+"##O @",
+"##. O",
+"#+ o",
+"#o o",
+"#o o",
+"#o o",
+"#o XO.o",
+"#oX####",
+"#oO####",
+"#oO####",
+"#oX####",
+"#o XOXo",
+"#o o",
+"#o o",
+"#o o",
+"#+ o",
+"##. o",
+"##O @",
+"###+o+#"
+};
diff --git a/data/pixmaps/feta/12/clefs-vaticana_do_change.xpm b/data/pixmaps/feta/12/clefs-vaticana_do_change.xpm
new file mode 100644
index 0000000..03987cf
--- /dev/null
+++ b/data/pixmaps/feta/12/clefs-vaticana_do_change.xpm
@@ -0,0 +1,35 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"7 21 8 1",
+" c #020202",
+". c #343434",
+"X c Gray30",
+"o c #767676",
+"O c #929292",
+"+ c Gray68",
+"@ c Gray87",
+"# c None",
+/* pixels */
+"#######",
+"###+o+#",
+"##O @",
+"##. O",
+"#+ o",
+"#o o",
+"#o o",
+"#o o",
+"#o XO.o",
+"#oX####",
+"#oO####",
+"#oO####",
+"#oX####",
+"#o XOXo",
+"#o o",
+"#o o",
+"#o o",
+"#+ o",
+"##. o",
+"##O @",
+"###+o+#"
+};
diff --git a/data/pixmaps/feta/12/clefs-vaticana_fa.xpm b/data/pixmaps/feta/12/clefs-vaticana_fa.xpm
new file mode 100644
index 0000000..f8f488b
--- /dev/null
+++ b/data/pixmaps/feta/12/clefs-vaticana_fa.xpm
@@ -0,0 +1,43 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"13 29 8 1",
+" c Gray1",
+". c #373737",
+"X c #484848",
+"o c #777777",
+"O c #868686",
+"+ c Gray72",
+"@ c #cacaca",
+"# c None",
+/* pixels */
+"#############",
+"#########OO+#",
+"########o +",
+"#######@ O",
+"#######o O",
+"#######. o",
+"#######X O",
+"##+oo@#. o",
+"#+ OX oO.o",
+"#O X.o####",
+"#O XX+####",
+"#O XX+####",
+"#O X.o####",
+"#+o##XXX oO.o",
+"#####+XX o",
+"#####+XX O",
+"#####+XX o",
+"#####+XO O",
+"#####+.# O",
+"#####+.#o +",
+"#####+.##Oo+#",
+"#####+.######",
+"#####+.######",
+"#####+.######",
+"#####+.######",
+"#####+.######",
+"#####+.######",
+"#####+.######",
+"#####@+######"
+};
diff --git a/data/pixmaps/feta/12/clefs-vaticana_fa_change.xpm b/data/pixmaps/feta/12/clefs-vaticana_fa_change.xpm
new file mode 100644
index 0000000..f8f488b
--- /dev/null
+++ b/data/pixmaps/feta/12/clefs-vaticana_fa_change.xpm
@@ -0,0 +1,43 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"13 29 8 1",
+" c Gray1",
+". c #373737",
+"X c #484848",
+"o c #777777",
+"O c #868686",
+"+ c Gray72",
+"@ c #cacaca",
+"# c None",
+/* pixels */
+"#############",
+"#########OO+#",
+"########o +",
+"#######@ O",
+"#######o O",
+"#######. o",
+"#######X O",
+"##+oo@#. o",
+"#+ OX oO.o",
+"#O X.o####",
+"#O XX+####",
+"#O XX+####",
+"#O X.o####",
+"#+o##XXX oO.o",
+"#####+XX o",
+"#####+XX O",
+"#####+XX o",
+"#####+XO O",
+"#####+.# O",
+"#####+.#o +",
+"#####+.##Oo+#",
+"#####+.######",
+"#####+.######",
+"#####+.######",
+"#####+.######",
+"#####+.######",
+"#####+.######",
+"#####+.######",
+"#####@+######"
+};
diff --git a/data/pixmaps/feta/12/custodes-hufnagel.xpm b/data/pixmaps/feta/12/custodes-hufnagel.xpm
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/pixmaps/feta/12/custodes-hufnagel.xpm
diff --git a/data/pixmaps/feta/12/custodes-medicaea.xpm b/data/pixmaps/feta/12/custodes-medicaea.xpm
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/pixmaps/feta/12/custodes-medicaea.xpm
diff --git a/data/pixmaps/feta/12/custodes-mensural.xpm b/data/pixmaps/feta/12/custodes-mensural.xpm
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/pixmaps/feta/12/custodes-mensural.xpm
diff --git a/data/pixmaps/feta/12/custodes-rhufnagel.xpm b/data/pixmaps/feta/12/custodes-rhufnagel.xpm
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/pixmaps/feta/12/custodes-rhufnagel.xpm
diff --git a/data/pixmaps/feta/12/custodes-rmedicaea.xpm b/data/pixmaps/feta/12/custodes-rmedicaea.xpm
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/pixmaps/feta/12/custodes-rmedicaea.xpm
diff --git a/data/pixmaps/feta/12/custodes-rmensural.xpm b/data/pixmaps/feta/12/custodes-rmensural.xpm
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/pixmaps/feta/12/custodes-rmensural.xpm
diff --git a/data/pixmaps/feta/12/custodes-rvaticana.xpm b/data/pixmaps/feta/12/custodes-rvaticana.xpm
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/pixmaps/feta/12/custodes-rvaticana.xpm
diff --git a/data/pixmaps/feta/12/custodes-vaticana.xpm b/data/pixmaps/feta/12/custodes-vaticana.xpm
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/pixmaps/feta/12/custodes-vaticana.xpm
diff --git a/data/pixmaps/feta/12/dots-dot.xpm b/data/pixmaps/feta/12/dots-dot.xpm
new file mode 100644
index 0000000..db739c3
--- /dev/null
+++ b/data/pixmaps/feta/12/dots-dot.xpm
@@ -0,0 +1,18 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"7 7 5 1",
+" c #040404",
+". c Gray50",
+"X c #8d8d8d",
+"o c #bebebe",
+"O c None",
+/* pixels */
+"OOOOOOO",
+"OOOX.oO",
+"OO o",
+"OX X",
+"OX X",
+"OO o",
+"OOOX.oO"
+};
diff --git a/data/pixmaps/feta/12/dots-evenrepeatcolon.xpm b/data/pixmaps/feta/12/dots-evenrepeatcolon.xpm
new file mode 100644
index 0000000..ca8d022
--- /dev/null
+++ b/data/pixmaps/feta/12/dots-evenrepeatcolon.xpm
@@ -0,0 +1,43 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"7 30 7 1",
+" c Gray1",
+". c #444444",
+"X c Gray47",
+"o c Gray55",
+"O c #bbbbbb",
+"+ c #c0c0c0",
+"@ c None",
+/* pixels */
+"@@@@@@@",
+"@@@oo@@",
+"@@. O",
+"@o o",
+"@o o",
+"@+ O",
+"@@OXXO@",
+"@@@@@@@",
+"@@@@@@@",
+"@@@@@@@",
+"@@@@@@@",
+"@@@@@@@",
+"@@@@@@@",
+"@@@@@@@",
+"@@@@@@@",
+"@@@@@@@",
+"@@@@@@@",
+"@@@@@@@",
+"@@@@@@@",
+"@@@@@@@",
+"@@@@@@@",
+"@@@@@@@",
+"@@@@@@@",
+"@@@@@@@",
+"@@OXXO@",
+"@+ O",
+"@o o",
+"@o o",
+"@@. O",
+"@@@oo@@"
+};
diff --git a/data/pixmaps/feta/12/dots-repeatcolon.xpm b/data/pixmaps/feta/12/dots-repeatcolon.xpm
new file mode 100644
index 0000000..2c9742f
--- /dev/null
+++ b/data/pixmaps/feta/12/dots-repeatcolon.xpm
@@ -0,0 +1,31 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"7 18 7 1",
+" c Gray1",
+". c #3a3a3a",
+"X c #494949",
+"o c #898989",
+"O c #b7b7b7",
+"+ c Gray80",
+"@ c None",
+/* pixels */
+"@@@@@@@",
+"@@OooO@",
+"@O o",
+"@o o",
+"@o o",
+"@@X .+",
+"@@@OO@@",
+"@@@@@@@",
+"@@@@@@@",
+"@@@@@@@",
+"@@@@@@@",
+"@@@@@@@",
+"@@@OO@@",
+"@@X .+",
+"@o o",
+"@o o",
+"@O o",
+"@@OooO@"
+};
diff --git a/data/pixmaps/feta/12/flags-d3.xpm b/data/pixmaps/feta/12/flags-d3.xpm
new file mode 100644
index 0000000..bbe8db8
--- /dev/null
+++ b/data/pixmaps/feta/12/flags-d3.xpm
@@ -0,0 +1,49 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"15 35 8 1",
+" c Gray2",
+". c Gray16",
+"X c #555555",
+"o c #747474",
+"O c #898989",
+"+ c #aeaeae",
+"@ c Gray81",
+"# c None",
+/* pixels */
+"###############",
+"##########@o###",
+"##########@ O##",
+"###########..##",
+"###########+ @#",
+"############ X#",
+"############o.#",
+"############O #",
+"############@ +",
+"############# o",
+"#@########### O",
+"#oo########## o",
+"#oo########## o",
+"#oo#########o @",
+"#oo######### #",
+"#oo########O O#",
+"#oo#######+ ##",
+"#oo######+ O##",
+"#oo#####+ X###",
+"#oo####X @###",
+"#oo##@X @####",
+"#oo#+ +#####",
+"#oXo X######",
+"#o X#######",
+"#O X########",
+"#O .#########",
+"#O +#########",
+"#o X##########",
+"#O .###########",
+"#O O###########",
+"#o ############",
+"#o.############",
+"#oo############",
+"#oo############",
+"#+@############"
+};
diff --git a/data/pixmaps/feta/12/flags-d4.xpm b/data/pixmaps/feta/12/flags-d4.xpm
new file mode 100644
index 0000000..bc9108d
--- /dev/null
+++ b/data/pixmaps/feta/12/flags-d4.xpm
@@ -0,0 +1,51 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"15 37 8 1",
+" c #040404",
+". c Gray20",
+"X c Gray31",
+"o c Gray45",
+"O c #898989",
+"+ c Gray72",
+"@ c #cbcbcb",
+"# c None",
+/* pixels */
+"###############",
+"############@+#",
+"############O #",
+"############@ @",
+"############# o",
+"############# o",
+"############# o",
+"############@ O",
+"############O #",
+"###########+ o#",
+"###########. ##",
+"##########X @#",
+"#########X X O#",
+"#oo####@. X#.X#",
+"#oo###o X##O #",
+"#oo#+. X###O #",
+"#oXX .####O #",
+"#O .#####o #",
+"#O .###### o#",
+"#o ######o @#",
+"#O O###### X##",
+"#O X######. @##",
+"#o +#####. +###",
+"#o.####@X o####",
+"#oo###O o#####",
+"#oo#@X o######",
+"#oXo X#######",
+"#O X########",
+"#o X#########",
+"#O .##########",
+"#O +##########",
+"#O X###########",
+"#O @###########",
+"#o ############",
+"#oo############",
+"#oo############",
+"#++############"
+};
diff --git a/data/pixmaps/feta/12/flags-d5.xpm b/data/pixmaps/feta/12/flags-d5.xpm
new file mode 100644
index 0000000..3fb631b
--- /dev/null
+++ b/data/pixmaps/feta/12/flags-d5.xpm
@@ -0,0 +1,61 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"15 47 8 1",
+" c Gray2",
+". c #2c2c2c",
+"X c #565656",
+"o c Gray44",
+"O c #898989",
+"+ c #aaaaaa",
+"@ c #d2d2d2",
+"# c None",
+/* pixels */
+"###############",
+"############@+#",
+"############O #",
+"############@ @",
+"############# O",
+"############# o",
+"############# o",
+"############@ +",
+"############X #",
+"###########@ o#",
+"##########@ .##",
+"#########@. @#",
+"########o o +#",
+"######@. O# X#",
+"####@o O##O #",
+"###o O###+ #",
+"##o o####O #",
+"##o o#####X #",
+"##o o###### X#",
+"##o o######+ +#",
+"##X @#####@ .##",
+"##Xo#####@. o##",
+"#@X#####+. . @#",
+"#o.###@X +@ +#",
+"#oo##+. O## o#",
+"#oo@. o### o#",
+"#o o#### o#",
+"#O o####+ @#",
+"#O o#####..##",
+"#o X#####+ +##",
+"#O @####@ .###",
+"#O +####@. +###",
+"#o ####@. O####",
+"#oX###O .#####",
+"#oo#@o .@#####",
+"#oo@. .@######",
+"#O .@#######",
+"#o +########",
+"#O o#########",
+"#O X##########",
+"#O @##########",
+"#O X###########",
+"#O @###########",
+"#o ############",
+"#oo############",
+"#oo############",
+"#+@############"
+};
diff --git a/data/pixmaps/feta/12/flags-d6.xpm b/data/pixmaps/feta/12/flags-d6.xpm
new file mode 100644
index 0000000..7be84e2
--- /dev/null
+++ b/data/pixmaps/feta/12/flags-d6.xpm
@@ -0,0 +1,67 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"15 53 8 1",
+" c #060606",
+". c #2c2c2c",
+"X c #565656",
+"o c Gray44",
+"O c Gray54",
+"+ c Gray67",
+"@ c #d2d2d2",
+"# c None",
+/* pixels */
+"###############",
+"#############O#",
+"############@ +",
+"############# o",
+"############# o",
+"############# O",
+"############@ O",
+"############X @",
+"###########o o#",
+"#########@X o#",
+"#######+X XO #",
+"###@oo X#O @",
+"##o .+##O #",
+"##o X@###O #",
+"##o +##### X#",
+"##o @#####+ +#",
+"##o @#####@ @#",
+"##XO#####@ o#",
+"##O@####@. + o#",
+"##+####O O# o#",
+"#####+. O## o#",
+"###@o O### o#",
+"##o o###@ o#",
+"##o o####O @#",
+"##o o#####..##",
+"##o X#####o o##",
+"##X @####@ X##",
+"##XO####@ . X##",
+"#@X####@. +.X##",
+"#o.###+. O# X##",
+"#oO##O O## X##",
+"#oo#. .### o##",
+"#o. @##@ @##",
+"#O @###X.###",
+"#O @###@ O###",
+"#o o####o.####",
+"#O .####+ O####",
+"#O O###@ .#####",
+"#o ###@..@#####",
+"#oX###. O######",
+"#oo#@. O#######",
+"#oO@. .@#######",
+"#o. @########",
+"#O o#########",
+"#O .##########",
+"#O @##########",
+"#o X###########",
+"#O +###########",
+"#o ############",
+"#oX############",
+"#oo############",
+"#oo############",
+"#+@############"
+};
diff --git a/data/pixmaps/feta/12/flags-dgrace.xpm b/data/pixmaps/feta/12/flags-dgrace.xpm
new file mode 100644
index 0000000..0e449ef
--- /dev/null
+++ b/data/pixmaps/feta/12/flags-dgrace.xpm
@@ -0,0 +1,29 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"28 15 8 1",
+" c Gray2",
+". c #2c2c2c",
+"X c Gray32",
+"o c #6d6d6d",
+"O c Gray57",
+"+ c #afafaf",
+"@ c #d0d0d0",
+"# c None",
+/* pixels */
+"############################",
+"#@o+########################",
+"#O .+######################",
+"##@X .+####################",
+"####@o .O##################",
+"######@o .O################",
+"########@o .O##############",
+"###########o X@###########",
+"#############o. X+#########",
+"###############@X .+#######",
+"#################@X .+#####",
+"###################@o .+###",
+"#####################@o .O#",
+"#######################@o O",
+"#########################@O#"
+};
diff --git a/data/pixmaps/feta/12/flags-dstem.xpm b/data/pixmaps/feta/12/flags-dstem.xpm
new file mode 100644
index 0000000..0c4459a
--- /dev/null
+++ b/data/pixmaps/feta/12/flags-dstem.xpm
@@ -0,0 +1,49 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"3 40 3 1",
+" c Gray45",
+". c Gray74",
+"X c None",
+/* pixels */
+"XXX",
+"X..",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X.."
+};
diff --git a/data/pixmaps/feta/12/flags-stem.xpm b/data/pixmaps/feta/12/flags-stem.xpm
new file mode 100644
index 0000000..0c4459a
--- /dev/null
+++ b/data/pixmaps/feta/12/flags-stem.xpm
@@ -0,0 +1,49 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"3 40 3 1",
+" c Gray45",
+". c Gray74",
+"X c None",
+/* pixels */
+"XXX",
+"X..",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X.."
+};
diff --git a/data/pixmaps/feta/12/flags-u3.xpm b/data/pixmaps/feta/12/flags-u3.xpm
new file mode 100644
index 0000000..174f795
--- /dev/null
+++ b/data/pixmaps/feta/12/flags-u3.xpm
@@ -0,0 +1,51 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"14 37 8 1",
+" c #020202",
+". c #2f2f2f",
+"X c #414141",
+"o c #717171",
+"O c #8b8b8b",
+"+ c #b1b1b1",
+"@ c Gray86",
+"# c None",
+/* pixels */
+"##############",
+"#++###########",
+"#oo###########",
+"#oo###########",
+"#o.###########",
+"#O ###########",
+"#O +##########",
+"#O X##########",
+"#O +#########",
+"#O .#########",
+"#O O########",
+"#O @#######",
+"#O .#######",
+"#oX. O######",
+"#oo@. +#####",
+"#oo##o .@####",
+"#oo###o o####",
+"#oo####o O###",
+"#oo#####o .@##",
+"#oo######. o##",
+"#oo######@. @#",
+"#oo#######+ O#",
+"#oo########. #",
+"#oo########o #",
+"#oo########@ O",
+"#@@######### O",
+"############ O",
+"############ O",
+"############ O",
+"###########O @",
+"###########o #",
+"###########.o#",
+"########### o#",
+"##########@ @#",
+"##########o.##",
+"########## o##",
+"##########O###"
+};
diff --git a/data/pixmaps/feta/12/flags-u4.xpm b/data/pixmaps/feta/12/flags-u4.xpm
new file mode 100644
index 0000000..67d2b68
--- /dev/null
+++ b/data/pixmaps/feta/12/flags-u4.xpm
@@ -0,0 +1,57 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"14 43 8 1",
+" c Gray1",
+". c Gray19",
+"X c #4c4c4c",
+"o c Gray45",
+"O c #898989",
+"+ c #b7b7b7",
+"@ c #c8c8c8",
+"# c None",
+/* pixels */
+"##############",
+"#@+###########",
+"#oo###########",
+"#oo###########",
+"#O ###########",
+"#O +##########",
+"#O o##########",
+"#O ##########",
+"#O X#########",
+"#O +########",
+"#O ########",
+"#O X#######",
+"#ooO X######",
+"#oX#+ O#####",
+"#O ###X +####",
+"#O +###X +###",
+"#O X####X X###",
+"#O +####X O##",
+"#O X##### ##",
+"#O o####+ o#",
+"#O +####. #",
+"#O.. +###O +",
+"#oo@. .#### O",
+"#oo##X X### O",
+"#oo###+ X## O",
+"#++####+ +@ +",
+"########+ .o #",
+"#########+ O#",
+"##########X +#",
+"########### .#",
+"###########o #",
+"###########+ O",
+"############ o",
+"############ O",
+"############ O",
+"############ O",
+"###########o #",
+"###########o #",
+"########### o#",
+"##########+ +#",
+"##########o.##",
+"########## o##",
+"##########O###"
+};
diff --git a/data/pixmaps/feta/12/flags-u5.xpm b/data/pixmaps/feta/12/flags-u5.xpm
new file mode 100644
index 0000000..bc78b7e
--- /dev/null
+++ b/data/pixmaps/feta/12/flags-u5.xpm
@@ -0,0 +1,65 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"14 51 8 1",
+" c #040404",
+". c #2f2f2f",
+"X c #535353",
+"o c #747474",
+"O c #8b8b8b",
+"+ c Gray70",
+"@ c Gray84",
+"# c None",
+/* pixels */
+"##############",
+"#++###########",
+"#oo###########",
+"#oo###########",
+"#o.###########",
+"#O ###########",
+"#O O##########",
+"#O @#########",
+"#O o#########",
+"#O +########",
+"#O .########",
+"#O .#######",
+"#ooo O######",
+"#oX#@ O#####",
+"#O ##@ @####",
+"#O +##@ .####",
+"#O .###@ O###",
+"#O O###@ @##",
+"#O @###o o##",
+"#O .@###. @#",
+"#O o###@ o#",
+"#oX. O###..#",
+"#oo#o O##o #",
+"#oX##+. o#o #",
+"#O ###@o #O #",
+"##XO####o . X#",
+"##o #####O @#",
+"##o O#####X @#",
+"##o @####@ X#",
+"##o .@####o #",
+"##o .####@ O",
+"##@. o#### O",
+"####O. o### O",
+"#####@. o#@ O",
+"#######O +O @",
+"########O . .#",
+"#########O +#",
+"##########o O#",
+"##########@ #",
+"###########o #",
+"###########@ O",
+"############ O",
+"############ O",
+"############ O",
+"###########+ @",
+"###########o #",
+"###########.o#",
+"########### +#",
+"##########o.##",
+"########## o##",
+"##########O###"
+};
diff --git a/data/pixmaps/feta/12/flags-u6.xpm b/data/pixmaps/feta/12/flags-u6.xpm
new file mode 100644
index 0000000..b4da8fd
--- /dev/null
+++ b/data/pixmaps/feta/12/flags-u6.xpm
@@ -0,0 +1,77 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"14 63 8 1",
+" c Gray1",
+". c Gray21",
+"X c Gray29",
+"o c #777777",
+"O c #888888",
+"+ c Gray71",
+"@ c Gray78",
+"# c None",
+/* pixels */
+"##############",
+"#@+###########",
+"#oo###########",
+"#oo###########",
+"#o.###########",
+"#O ###########",
+"#O O##########",
+"#O ##########",
+"#O O#########",
+"#O +########",
+"#O X########",
+"#O o#######",
+"#oXo +######",
+"#oo#+ +#####",
+"#o.##+ X#####",
+"#O ###+ X####",
+"#O O###+ +###",
+"#O ####+ ###",
+"#O X####X O##",
+"#O +#### ##",
+"#O +###o +#",
+"#O X#### o#",
+"#oX+ X###. #",
+"#oo#+. X##o #",
+"#o.###X X#o #",
+"#@X@###+ @o #",
+"##o+####+ o#",
+"##o.#####+ ##",
+"##O O#####X +#",
+"##o +##### X#",
+"##O X#####o #",
+"##o X####+ O",
+"##+ o#### O",
+"####X +### O",
+"#####+ +## O",
+"##O@###X #O #",
+"##o+####X X..#",
+"##o.#####X +#",
+"##o +#####X ##",
+"##o X#####+ o#",
+"##o X#####. #",
+"##o O####O @",
+"##+ +#### O",
+"###@. +### O",
+"#####X +## O",
+"######+ X#o #",
+"#######+ . +#",
+"########+ o##",
+"#########+ ##",
+"##########O O#",
+"########### #",
+"###########o @",
+"############ o",
+"############ O",
+"############ O",
+"############ O",
+"###########+ #",
+"###########o #",
+"###########.o#",
+"########### +#",
+"##########o.##",
+"########## o##",
+"##########O###"
+};
diff --git a/data/pixmaps/feta/12/flags-ugrace.xpm b/data/pixmaps/feta/12/flags-ugrace.xpm
new file mode 100644
index 0000000..7874dfe
--- /dev/null
+++ b/data/pixmaps/feta/12/flags-ugrace.xpm
@@ -0,0 +1,30 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"25 16 8 1",
+" c #070707",
+". c #2f2f2f",
+"X c #555555",
+"o c Gray44",
+"O c Gray57",
+"+ c Gray69",
+"@ c Gray81",
+"# c None",
+/* pixels */
+"#########################",
+"#######################O#",
+"#####################+ O",
+"###################@. O#",
+"#################@o X@##",
+"################o .+####",
+"##############+. .+######",
+"############@X X########",
+"###########o X@#########",
+"#########+. .+###########",
+"#######@X o#############",
+"#####@X X@##############",
+"####O .+################",
+"##@ +##################",
+"#O o####################",
+"#+o@#####################"
+};
diff --git a/data/pixmaps/feta/12/noteheads--1.xpm b/data/pixmaps/feta/12/noteheads--1.xpm
new file mode 100644
index 0000000..91a1d68
--- /dev/null
+++ b/data/pixmaps/feta/12/noteheads--1.xpm
@@ -0,0 +1,29 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"29 15 8 1",
+" c #040404",
+". c #3c3c3c",
+"X c #494949",
+"o c #797979",
+"O c Gray54",
+"+ c #b6b6b6",
+"@ c #c3c3c3",
+"# c None",
+/* pixels */
+"#############################",
+"##++#######+oOOOOO#########O#",
+"#@ ####O. o+####X O",
+"#O ##o O###O .+## O",
+"#O #X o######X +# O",
+"#O X ########X + O",
+"#O ########+ . O",
+"#O #########X O",
+"#O +########o O",
+"#O X########O . O",
+"#O . +#######o +. O",
+"#O #X +###### +# O",
+"#O ##o X@##@. .@## O",
+"#@ ####OX o+####X O",
+"##++#######+oOOOoO#########O#"
+};
diff --git a/data/pixmaps/feta/12/noteheads--1mensural.xpm b/data/pixmaps/feta/12/noteheads--1mensural.xpm
new file mode 100644
index 0000000..bac4384
--- /dev/null
+++ b/data/pixmaps/feta/12/noteheads--1mensural.xpm
@@ -0,0 +1,31 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"25 20 5 1",
+" c Gray2",
+". c #888888",
+"X c #b4b4b4",
+"o c Gray78",
+"O c None",
+/* pixels */
+"OOOOOOOOOOOOOOOOOOOOOOOOO",
+"Oo.OOOOOOOOOOOOOOOOOOOO.o",
+"O. OOOOOOOOOOOOOOOOOOOO .",
+"O. .OOOOOOOOOOOOOOOOOO. .",
+"O. .",
+"O. .",
+"O. .",
+"O. .",
+"O. .",
+"O. XOOOOOOOOOOOOOOOOOOX .",
+"O. OOOOOOOOOOOOOOOOOOOO .",
+"O. XOOOOOOOOOOOOOOOOOOX .",
+"O. .",
+"O. .",
+"O. .",
+"O. .",
+"O. .",
+"O. .OOOOOOOOOOOOOOOOOO. .",
+"O. OOOOOOOOOOOOOOOOOOOO .",
+"Oo.OOOOOOOOOOOOOOOOOOOO.o"
+};
diff --git a/data/pixmaps/feta/12/noteheads--2mensural.xpm b/data/pixmaps/feta/12/noteheads--2mensural.xpm
new file mode 100644
index 0000000..9588473
--- /dev/null
+++ b/data/pixmaps/feta/12/noteheads--2mensural.xpm
@@ -0,0 +1,45 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"26 31 8 1",
+" c #020202",
+". c Gray15",
+"X c Gray26",
+"o c Gray49",
+"O c #898989",
+"+ c #acacac",
+"@ c #cdcdcd",
+"# c None",
+/* pixels */
+"##########################",
+"#@o####################O+#",
+"#O #################### o#",
+"#O o##@##@#@##@#@#@#@#o O#",
+"#O o#",
+"#O o#",
+"#O o#",
+"#O o#",
+"#O .................... o#",
+"#O @##################@ o#",
+"#O #################### o#",
+"#O O@@@@@@@@@@@@@@@@@@O o#",
+"#O o#",
+"#O o#",
+"#O o#",
+"#O o#",
+"#O .X.XXXXXXXXXXXXXXXX. o#",
+"#O +##################+ O#",
+"#O ###################@ o#",
+"##@#################### o#",
+"####################### o#",
+"####################### #",
+"####################### #",
+"####################### #",
+"####################### #",
+"####################### #",
+"####################### @",
+"####################### O",
+"#######################o O",
+"#######################O O",
+"#######################@o#"
+};
diff --git a/data/pixmaps/feta/12/noteheads--3mensural.xpm b/data/pixmaps/feta/12/noteheads--3mensural.xpm
new file mode 100644
index 0000000..e84e40f
--- /dev/null
+++ b/data/pixmaps/feta/12/noteheads--3mensural.xpm
@@ -0,0 +1,45 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"32 31 8 1",
+" c #020202",
+". c #282828",
+"X c #434343",
+"o c #7b7b7b",
+"O c #898989",
+"+ c #aeaeae",
+"@ c #cecece",
+"# c None",
+/* pixels */
+"################################",
+"#@o##########################@o#",
+"#O ##########################O #",
+"#O O#@@#@#@##@#@@#@###@##@#@@ #",
+"#O #",
+"#O #",
+"#O #",
+"#O #",
+"#O .......................... #",
+"#O @#########################X #",
+"#O ##########################O #",
+"#O O@@@@@@@@@@@@@@@@@@@@@@@@@. #",
+"#O #",
+"#O #",
+"#O #",
+"#O @",
+"#O .XXXXXXXXXXXXXXXXXXXXXXXXX #",
+"#O +#########################. #",
+"#O ##########################. #",
+"#@@########################## .#",
+"############################# #",
+"#############################o #",
+"#############################O #",
+"#############################O #",
+"#############################O #",
+"#############################O #",
+"#############################O O",
+"#############################O O",
+"#############################O O",
+"#############################O O",
+"##############################O#"
+};
diff --git a/data/pixmaps/feta/12/noteheads-0.xpm b/data/pixmaps/feta/12/noteheads-0.xpm
new file mode 100644
index 0000000..9ca415e
--- /dev/null
+++ b/data/pixmaps/feta/12/noteheads-0.xpm
@@ -0,0 +1,29 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"24 15 8 1",
+" c Gray1",
+". c #2d2d2d",
+"X c #414141",
+"o c Gray44",
+"O c #898989",
+"+ c Gray69",
+"@ c #d5d5d5",
+"# c None",
+/* pixels */
+"########################",
+"#########+oOOOO+########",
+"#####@O. .O@####",
+"####o +##@o o###",
+"###. +#####@. X##",
+"##X .#######@ X#",
+"#+ .########o +",
+"#O .########@ O",
+"#O @########. O",
+"#+ o########. +",
+"##X @#######. X#",
+"###. .@#####+ .##",
+"####o o@##+ o###",
+"#####@O. .O@####",
+"#########+OOOOo+########"
+};
diff --git a/data/pixmaps/feta/12/noteheads-0cross.xpm b/data/pixmaps/feta/12/noteheads-0cross.xpm
new file mode 100644
index 0000000..1292c1d
--- /dev/null
+++ b/data/pixmaps/feta/12/noteheads-0cross.xpm
@@ -0,0 +1,30 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"21 16 8 1",
+" c Gray3",
+". c #343434",
+"X c #565656",
+"o c #6c6c6c",
+"O c #929292",
+"+ c Gray68",
+"@ c Gray80",
+"# c None",
+/* pixels */
+"#####################",
+"#####+@########@+####",
+"####. O######O .###",
+"##+ @o X@##@X o+ +#",
+"#O X###+ ++ +###X O",
+"#@. O####X o####O .@",
+"###o X####OO####X o##",
+"####O @######@ O###",
+"#####@ X######. @####",
+"####+ @######@ O###",
+"###o X####OO####X o##",
+"#@. O####X X####O .@",
+"#O X###+. ++ .+###X O",
+"##+ +o X@##@X o+ +#",
+"####. O######O .###",
+"#####+@########@+####"
+};
diff --git a/data/pixmaps/feta/12/noteheads-0diamond.xpm b/data/pixmaps/feta/12/noteheads-0diamond.xpm
new file mode 100644
index 0000000..7d9ef53
--- /dev/null
+++ b/data/pixmaps/feta/12/noteheads-0diamond.xpm
@@ -0,0 +1,29 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"24 15 8 1",
+" c #040404",
+". c Gray17",
+"X c Gray26",
+"o c #777777",
+"O c #8e8e8e",
+"+ c #aaaaaa",
+"@ c Gray84",
+"# c None",
+/* pixels */
+"########################",
+"###########+o+##########",
+"#########@. .@########",
+"########+. .+#######",
+"#######O O######",
+"###@Oo .@#OO. oO@##",
+"##X .####@ .#",
+"#O .#####. O",
+"#O .#####. O",
+"##X @####. X#",
+"###@Oo .o+#@ oO@##",
+"#######O O######",
+"########+. .+#######",
+"#########@. .@########",
+"###########+o+##########"
+};
diff --git a/data/pixmaps/feta/12/noteheads-0mensural.xpm b/data/pixmaps/feta/12/noteheads-0mensural.xpm
new file mode 100644
index 0000000..89f342b
--- /dev/null
+++ b/data/pixmaps/feta/12/noteheads-0mensural.xpm
@@ -0,0 +1,28 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"13 15 7 1",
+" c #060606",
+". c Gray18",
+"X c Gray47",
+"o c #959595",
+"O c #a9a9a9",
+"+ c Gray84",
+"@ c None",
+/* pixels */
+"@@@@@@@@@@@@@",
+"@@@@@@++@@@@@",
+"@@@@@+. +@@@@",
+"@@@@@. .@@@@",
+"@@@@o . o@@@",
+"@@@o X@ o@@",
+"@@o X@@o O@",
+"@O X@@@X O",
+"@O X@@@X O",
+"@@O X@@X O@",
+"@@@o @X o@@",
+"@@@@o . o@@@",
+"@@@@@. .@@@@",
+"@@@@@+ .+@@@@",
+"@@@@@@++@@@@@"
+};
diff --git a/data/pixmaps/feta/12/noteheads-0slash.xpm b/data/pixmaps/feta/12/noteheads-0slash.xpm
new file mode 100644
index 0000000..6fa57ea
--- /dev/null
+++ b/data/pixmaps/feta/12/noteheads-0slash.xpm
@@ -0,0 +1,39 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"35 25 8 1",
+" c #040404",
+". c #313131",
+"X c Gray34",
+"o c #6d6d6d",
+"O c Gray54",
+"+ c #aaaaaa",
+"@ c Gray83",
+"# c None",
+/* pixels */
+"###################################",
+"##############@OOOOOOOOOOOOOOOOOOo@",
+"##############. @",
+"#############O +#",
+"############@. X##",
+"############X o########### +##",
+"###########@ @##########o o###",
+"###########X O##########@ @###",
+"##########+ .###########X o####",
+"##########. +##########+ .#####",
+"#########O .###########. +#####",
+"########@ @##########+ .######",
+"########o o##########@ @######",
+"#######@ @##########o o#######",
+"#######. +##########@ @#######",
+"######+ .###########. O########",
+"######. +##########+ .#########",
+"#####o X###########. +#########",
+"####@ @##########o X##########",
+"####o o##########@ @##########",
+"###+ ###########o X###########",
+"###X .@###########",
+"##+ O############",
+"#@ .#############",
+"#@oOOOOOOOOOOOOOOOOOO@#############"
+};
diff --git a/data/pixmaps/feta/12/noteheads-0triangle.xpm b/data/pixmaps/feta/12/noteheads-0triangle.xpm
new file mode 100644
index 0000000..9dd6ac8
--- /dev/null
+++ b/data/pixmaps/feta/12/noteheads-0triangle.xpm
@@ -0,0 +1,27 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"16 13 8 1",
+" c Gray1",
+". c #272727",
+"X c #565656",
+"o c #767676",
+"O c Gray55",
+"+ c #a2a2a2",
+"@ c #cdcdcd",
+"# c None",
+/* pixels */
+"################",
+"########O#######",
+"#######+ +######",
+"######@ @#####",
+"######X + X#####",
+"#####+ o#o +####",
+"#####..###..####",
+"####O +###+ O###",
+"###@ .#####. @##",
+"###X @#####@ X##",
+"##@ o#######o @#",
+"## #",
+"#@oooooooooooOo@"
+};
diff --git a/data/pixmaps/feta/12/noteheads-1.xpm b/data/pixmaps/feta/12/noteheads-1.xpm
new file mode 100644
index 0000000..e2b22c0
--- /dev/null
+++ b/data/pixmaps/feta/12/noteheads-1.xpm
@@ -0,0 +1,28 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"17 15 7 1",
+" c Gray1",
+". c Gray21",
+"X c Gray44",
+"o c Gray54",
+"O c Gray69",
+"+ c #cecece",
+"@ c None",
+/* pixels */
+"@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@+oooXO@@",
+"@@@@@@+X .@",
+"@@@@@X XO@+ O",
+"@@@@. .+@@@@XX",
+"@@@. X@@@@@@XX",
+"@@O +@@@@@@+ o",
+"@@. X@@@@@@@+ @",
+"@@ +@@@@@@@X .@",
+"@o +@@@@@@+. O@",
+"@XX@@@@@@X .@@",
+"@XX@@@@+. .@@@",
+"@O +@OX X@@@@",
+"@@. X+@@@@@",
+"@@@OXooo+@@@@@@@@"
+};
diff --git a/data/pixmaps/feta/12/noteheads-1cross.xpm b/data/pixmaps/feta/12/noteheads-1cross.xpm
new file mode 100644
index 0000000..18aa980
--- /dev/null
+++ b/data/pixmaps/feta/12/noteheads-1cross.xpm
@@ -0,0 +1,29 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"19 15 8 1",
+" c Gray2",
+". c #282828",
+"X c Gray33",
+"o c #6f6f6f",
+"O c #959595",
+"+ c Gray69",
+"@ c Gray81",
+"# c None",
+/* pixels */
+"###################",
+"####+@########@+###",
+"###o o######o o##",
+"#@. OO @##@ OO .@",
+"#O X###. ++ .@##X O",
+"##+ X@#@X X##@X +#",
+"###+. O##OO##O .+##",
+"#####o o####o o####",
+"#####o o####o o####",
+"###+. O##OO##O .+##",
+"##+ X@#@o X##@X +#",
+"#O X###. ++ .@##X O",
+"#@. OO @##@ OO .@",
+"###o o######o o##",
+"####+@########@+###"
+};
diff --git a/data/pixmaps/feta/12/noteheads-1diamond.xpm b/data/pixmaps/feta/12/noteheads-1diamond.xpm
new file mode 100644
index 0000000..beab66d
--- /dev/null
+++ b/data/pixmaps/feta/12/noteheads-1diamond.xpm
@@ -0,0 +1,29 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"19 15 8 1",
+" c Gray2",
+". c Gray24",
+"X c #494949",
+"o c #7c7c7c",
+"O c Gray52",
+"+ c Gray75",
+"@ c Gray76",
+"# c None",
+/* pixels */
+"###################",
+"###############@o+#",
+"############+o +",
+"#####o O",
+"####o oo +",
+"#### .+##o o#",
+"#### o####X X##",
+"#### .@####X O##",
+"###O X####@. ###",
+"###X X####o ###",
+"##o o##@. ###",
+"#@ oo O###",
+"#O o####",
+"#@ o+###########",
+"##+o@##############"
+};
diff --git a/data/pixmaps/feta/12/noteheads-1mensural.xpm b/data/pixmaps/feta/12/noteheads-1mensural.xpm
new file mode 100644
index 0000000..89f342b
--- /dev/null
+++ b/data/pixmaps/feta/12/noteheads-1mensural.xpm
@@ -0,0 +1,28 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"13 15 7 1",
+" c #060606",
+". c Gray18",
+"X c Gray47",
+"o c #959595",
+"O c #a9a9a9",
+"+ c Gray84",
+"@ c None",
+/* pixels */
+"@@@@@@@@@@@@@",
+"@@@@@@++@@@@@",
+"@@@@@+. +@@@@",
+"@@@@@. .@@@@",
+"@@@@o . o@@@",
+"@@@o X@ o@@",
+"@@o X@@o O@",
+"@O X@@@X O",
+"@O X@@@X O",
+"@@O X@@X O@",
+"@@@o @X o@@",
+"@@@@o . o@@@",
+"@@@@@. .@@@@",
+"@@@@@+ .+@@@@",
+"@@@@@@++@@@@@"
+};
diff --git a/data/pixmaps/feta/12/noteheads-1slash.xpm b/data/pixmaps/feta/12/noteheads-1slash.xpm
new file mode 100644
index 0000000..85358b6
--- /dev/null
+++ b/data/pixmaps/feta/12/noteheads-1slash.xpm
@@ -0,0 +1,38 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"31 25 7 1",
+" c #040404",
+". c #484848",
+"X c Gray50",
+"o c Gray53",
+"O c #b7b7b7",
+"+ c #cdcdcd",
+"@ c None",
+/* pixels */
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@ooooooooooooooo+",
+"@@@@@@@@@@@@@@. +",
+"@@@@@@@@@@@@@O O@",
+"@@@@@@@@@@@@@. .@@",
+"@@@@@@@@@@@@X .@@@@@@+ O@@",
+"@@@@@@@@@@@@ O@@@@@@. X@@@",
+"@@@@@@@@@@@o .@@@@@@O @@@@",
+"@@@@@@@@@@O @@@@@@@. o@@@@",
+"@@@@@@@@@@. X@@@@@@X .@@@@@",
+"@@@@@@@@@O @@@@@@@ O@@@@@",
+"@@@@@@@@@ O@@@@@@X .@@@@@@",
+"@@@@@@@@X .@@@@@@O @@@@@@@",
+"@@@@@@@@ O@@@@@@. o@@@@@@@",
+"@@@@@@@. o@@@@@@O @@@@@@@@",
+"@@@@@@O @@@@@@@ O@@@@@@@@",
+"@@@@@@. X@@@@@@o .@@@@@@@@@",
+"@@@@@o .@@@@@@@ O@@@@@@@@@",
+"@@@@@ O@@@@@@. o@@@@@@@@@@",
+"@@@@X .@@@@@@O @@@@@@@@@@@",
+"@@@O +@@@@@@. o@@@@@@@@@@@",
+"@@@. .@@@@@@@@@@@@",
+"@@O O@@@@@@@@@@@@",
+"@+ .@@@@@@@@@@@@@",
+"@+ooooooooooooooo@@@@@@@@@@@@@@"
+};
diff --git a/data/pixmaps/feta/12/noteheads-1triangle.xpm b/data/pixmaps/feta/12/noteheads-1triangle.xpm
new file mode 100644
index 0000000..e4eb662
--- /dev/null
+++ b/data/pixmaps/feta/12/noteheads-1triangle.xpm
@@ -0,0 +1,27 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"14 13 8 1",
+" c #060606",
+". c #323232",
+"X c #515151",
+"o c #777777",
+"O c #818181",
+"+ c #b4b4b4",
+"@ c Gray82",
+"# c None",
+/* pixels */
+"##############",
+"#######@######",
+"######@.@#####",
+"######o o#####",
+"#####+ X +####",
+"#####. # .####",
+"####+ +#+ +###",
+"#### X###X ###",
+"###o @###@ o##",
+"### X#####X ##",
+"##X ####### X#",
+"#+ +",
+"#+oOoooooooOo+"
+};
diff --git a/data/pixmaps/feta/12/noteheads-2.xpm b/data/pixmaps/feta/12/noteheads-2.xpm
new file mode 100644
index 0000000..4001ad2
--- /dev/null
+++ b/data/pixmaps/feta/12/noteheads-2.xpm
@@ -0,0 +1,26 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"17 14 6 1",
+" c #020202",
+". c #4b4b4b",
+"X c Gray49",
+"o c #898989",
+"O c #b9b9b9",
+"+ c None",
+/* pixels */
+"+++++++++++++++++",
+"+++++++++OoooO+++",
+"+++++++X O+",
+"+++++X +",
+"++++. o",
+"+++. o",
+"++X o",
+"++ +",
+"+o X+",
+"+o .++",
+"+o .+++",
+"++ X++++",
+"++O X++++++",
+"++++OoooO++++++++"
+};
diff --git a/data/pixmaps/feta/12/noteheads-2cross.xpm b/data/pixmaps/feta/12/noteheads-2cross.xpm
new file mode 100644
index 0000000..5742e08
--- /dev/null
+++ b/data/pixmaps/feta/12/noteheads-2cross.xpm
@@ -0,0 +1,28 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"17 15 7 1",
+" c Gray1",
+". c #3e3e3e",
+"X c Gray31",
+"o c Gray58",
+"O c #b6b6b6",
+"+ c Gray77",
+"@ c None",
+/* pixels */
+"@@@@@@@@@@@@@@@@@",
+"@@o@@@@@@@@@@@@o@",
+"@o X@@@@@@@@@@X o",
+"@@X .+@@@@@@+. X@",
+"@@@O O@@@@O O@@",
+"@@@@O O@@O O@@@",
+"@@@@@O XX O@@@@",
+"@@@@@@@X X@@@@@@",
+"@@@@@@@X X@@@@@@",
+"@@@@@O XX O@@@@",
+"@@@@O O@@O O@@@",
+"@@@O O@@@@O O@@",
+"@@X .+@@@@@@+. X@",
+"@o X@@@@@@@@@@X o",
+"@@o@@@@@@@@@@@@o@"
+};
diff --git a/data/pixmaps/feta/12/noteheads-2diamond.xpm b/data/pixmaps/feta/12/noteheads-2diamond.xpm
new file mode 100644
index 0000000..bf3c169
--- /dev/null
+++ b/data/pixmaps/feta/12/noteheads-2diamond.xpm
@@ -0,0 +1,28 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"18 15 7 1",
+" c #020202",
+". c #484848",
+"X c #797979",
+"o c #898989",
+"O c #b9b9b9",
+"+ c #c0c0c0",
+"@ c None",
+/* pixels */
+"@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@+X+@@@@@@@",
+"@@@@@@@O Xo. .@",
+"@@@@@@@ o",
+"@@@@@@o o",
+"@@@@@@ .@",
+"@@@@@X .@@",
+"@@@@@ .@@@",
+"@@@@. @@@@",
+"@@@. X@@@@",
+"@@. @@@@@",
+"@o o@@@@@",
+"@o @@@@@@",
+"@@. .oX O@@@@@@",
+"@@@@@@@@+X+@@@@@@@"
+};
diff --git a/data/pixmaps/feta/12/noteheads-2mensural.xpm b/data/pixmaps/feta/12/noteheads-2mensural.xpm
new file mode 100644
index 0000000..92de7d2
--- /dev/null
+++ b/data/pixmaps/feta/12/noteheads-2mensural.xpm
@@ -0,0 +1,27 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"13 15 6 1",
+" c Gray1",
+". c #2a2a2a",
+"X c Gray59",
+"o c Gray66",
+"O c Gray84",
+"+ c None",
+/* pixels */
+"+++++++++++++",
+"++++++OO+++++",
+"+++++O..O++++",
+"+++++. .++++",
+"++++X X+++",
+"+++X X++",
+"++o o+",
+"+o o",
+"+o o",
+"++o o+",
+"+++X X++",
+"++++X X+++",
+"+++++. .++++",
+"+++++O..O++++",
+"++++++OO+++++"
+};
diff --git a/data/pixmaps/feta/12/noteheads-2slash.xpm b/data/pixmaps/feta/12/noteheads-2slash.xpm
new file mode 100644
index 0000000..965d093
--- /dev/null
+++ b/data/pixmaps/feta/12/noteheads-2slash.xpm
@@ -0,0 +1,38 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"22 25 7 1",
+" c Gray1",
+". c #484848",
+"X c Gray50",
+"o c Gray53",
+"O c #b7b7b7",
+"+ c #cdcdcd",
+"@ c None",
+/* pixels */
+"@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@@@@@@oooooo+",
+"@@@@@@@@@@@@@@. +",
+"@@@@@@@@@@@@@O O@",
+"@@@@@@@@@@@@@. .@@",
+"@@@@@@@@@@@@X O@@",
+"@@@@@@@@@@@@ o@@@",
+"@@@@@@@@@@@o @@@@",
+"@@@@@@@@@@O X@@@@",
+"@@@@@@@@@@. .@@@@@",
+"@@@@@@@@@O O@@@@@",
+"@@@@@@@@@ .@@@@@@",
+"@@@@@@@@X @@@@@@@",
+"@@@@@@@@ X@@@@@@@",
+"@@@@@@@. @@@@@@@@",
+"@@@@@@O O@@@@@@@@",
+"@@@@@@. .@@@@@@@@@",
+"@@@@@X O@@@@@@@@@",
+"@@@@@ X@@@@@@@@@@",
+"@@@@X @@@@@@@@@@@",
+"@@@O X@@@@@@@@@@@",
+"@@@. .@@@@@@@@@@@@",
+"@@O O@@@@@@@@@@@@",
+"@+ .@@@@@@@@@@@@@",
+"@+oooooo@@@@@@@@@@@@@@"
+};
diff --git a/data/pixmaps/feta/12/noteheads-2triangle.xpm b/data/pixmaps/feta/12/noteheads-2triangle.xpm
new file mode 100644
index 0000000..9ce9b31
--- /dev/null
+++ b/data/pixmaps/feta/12/noteheads-2triangle.xpm
@@ -0,0 +1,27 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"14 13 8 1",
+" c Gray1",
+". c #282828",
+"X c #4c4c4c",
+"o c #767676",
+"O c #818181",
+"+ c #b7b7b7",
+"@ c #d5d5d5",
+"# c None",
+/* pixels */
+"##############",
+"#######@######",
+"######@.@#####",
+"######o o#####",
+"#####+ +####",
+"#####. X####",
+"####+ +###",
+"#### @##",
+"###o o##",
+"### ##",
+"##X X#",
+"#+ +",
+"#+oOOOOOOOOOo+"
+};
diff --git a/data/pixmaps/feta/12/noteheads-2xcircle.xpm b/data/pixmaps/feta/12/noteheads-2xcircle.xpm
new file mode 100644
index 0000000..a48774c
--- /dev/null
+++ b/data/pixmaps/feta/12/noteheads-2xcircle.xpm
@@ -0,0 +1,29 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"17 16 7 1",
+" c Gray1",
+". c #343434",
+"X c #484848",
+"o c Gray49",
+"O c #888888",
+"+ c #b7b7b7",
+"@ c None",
+/* pixels */
+"@@@@@@@@@@@@@@@@@",
+"@@@@@@@OOOO@@@@@@",
+"@@@@@X X@@@@",
+"@@@+ o@@@@o +@@",
+"@@+ X@@@@@@X +@",
+"@@.X+ X@@@@X +X.@",
+"@@ o@+ X@@X +@O @",
+"@O @@@+ XX +@@@ O",
+"@O @@@@o o@@@@ O",
+"@O @@@+ XX +@@@ O",
+"@@ O@+ X@@X +@o @",
+"@@.X+ X@@@@X +X.@",
+"@@+ X@@@@@@X +@",
+"@@@+ O@@@@o +@@",
+"@@@@@. X@@@@",
+"@@@@@@@OOOO@@@@@@"
+};
diff --git a/data/pixmaps/feta/12/noteheads-ledgerending.xpm b/data/pixmaps/feta/12/noteheads-ledgerending.xpm
new file mode 100644
index 0000000..b19fb30
--- /dev/null
+++ b/data/pixmaps/feta/12/noteheads-ledgerending.xpm
@@ -0,0 +1,14 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"13 4 4 1",
+" c #010101",
+". c Gray55",
+"X c #cbcbcb",
+"o c None",
+/* pixels */
+"ooooooooooooo",
+"oX..........X",
+"o. .",
+"oX..........X"
+};
diff --git a/data/pixmaps/feta/12/rests--1.xpm b/data/pixmaps/feta/12/rests--1.xpm
new file mode 100644
index 0000000..b7c9ae7
--- /dev/null
+++ b/data/pixmaps/feta/12/rests--1.xpm
@@ -0,0 +1,24 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"9 13 5 1",
+" c #020202",
+". c Gray45",
+"X c Gray53",
+"o c Gray77",
+"O c None",
+/* pixels */
+"OOOOOOOOO",
+"Oo.XX.X.o",
+"OX X",
+"OX X",
+"OX X",
+"OX X",
+"OX X",
+"OX X",
+"OX X",
+"OX X",
+"OX X",
+"OX X",
+"Oo.XX.X.o"
+};
diff --git a/data/pixmaps/feta/12/rests--1o.xpm b/data/pixmaps/feta/12/rests--1o.xpm
new file mode 100644
index 0000000..351fda2
--- /dev/null
+++ b/data/pixmaps/feta/12/rests--1o.xpm
@@ -0,0 +1,26 @@
+/* XPM */
+static char * rests__1o_xpm[] = {
+"20 12 11 1",
+" c None",
+". c #828282",
+"+ c #7D7D7D",
+"@ c #737373",
+"# c #878787",
+"$ c #020202",
+"% c #CFCFCF",
+"& c #323232",
+"* c #BDBDBD",
+"= c #030303",
+"- c #898989",
+" .+@@##@##@##@##@++ ",
+".$$$$$$$$$$$$$$$$$$.",
+"%&&$$$$$$$$$$$$$$&&%",
+" #$$$$$$# ",
+" #$$$$$$# ",
+" #$$$$$$# ",
+" #$$$$$$# ",
+" #$$$$$$# ",
+" #$$$$$$# ",
+"*==================*",
+"-==================-",
+" -------------------"};
diff --git a/data/pixmaps/feta/12/rests--2.xpm b/data/pixmaps/feta/12/rests--2.xpm
new file mode 100644
index 0000000..d0d3891
--- /dev/null
+++ b/data/pixmaps/feta/12/rests--2.xpm
@@ -0,0 +1,36 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"9 25 5 1",
+" c #020202",
+". c Gray49",
+"X c #898989",
+"o c #c8c8c8",
+"O c None",
+/* pixels */
+"OOOOOOOOO",
+"Oo.XXXX.o",
+"OX X",
+"OX X",
+"OX X",
+"OX X",
+"OX X",
+"OX X",
+"OX X",
+"OX X",
+"OX X",
+"OX X",
+"OX X",
+"OX X",
+"OX X",
+"OX X",
+"OX X",
+"OX X",
+"OX X",
+"OX X",
+"OX X",
+"OX X",
+"OX X",
+"OX X",
+"Oo.XXXX.o"
+};
diff --git a/data/pixmaps/feta/12/rests--4.xpm b/data/pixmaps/feta/12/rests--4.xpm
new file mode 100644
index 0000000..c218731
--- /dev/null
+++ b/data/pixmaps/feta/12/rests--4.xpm
@@ -0,0 +1,35 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"93 25 4 1",
+" c #040404",
+". c Gray53",
+"X c Gray78",
+"o c None",
+/* pixels */
+"ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo",
+"oX.oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo.X",
+"o. oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo .",
+"o. oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo .",
+"o. oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo .",
+"o. oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo .",
+"o. oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo .",
+"o. oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo .",
+"o. oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo .",
+"o. .",
+"o. .",
+"o. .",
+"o. .",
+"o. .",
+"o. .",
+"o. .",
+"o. .",
+"o. oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo .",
+"o. oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo .",
+"o. oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo .",
+"o. oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo .",
+"o. oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo .",
+"o. oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo .",
+"o. oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo .",
+"oX.oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo.X"
+};
diff --git a/data/pixmaps/feta/12/rests-0.xpm b/data/pixmaps/feta/12/rests-0.xpm
new file mode 100644
index 0000000..ed33aa1
--- /dev/null
+++ b/data/pixmaps/feta/12/rests-0.xpm
@@ -0,0 +1,20 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"19 9 5 1",
+" c #020202",
+". c Gray49",
+"X c #898989",
+"o c #c8c8c8",
+"O c None",
+/* pixels */
+"OOOOOOOOOOOOOOOOOOO",
+"Oo.XXXXXXXXXXXXXXXo",
+"OX X",
+"OX X",
+"OX X",
+"OX X",
+"OX X",
+"OX X",
+"Oo.XXXXXXXXXXXXXX.o"
+};
diff --git a/data/pixmaps/feta/12/rests-0o.xpm b/data/pixmaps/feta/12/rests-0o.xpm
new file mode 100644
index 0000000..4a52b54
--- /dev/null
+++ b/data/pixmaps/feta/12/rests-0o.xpm
@@ -0,0 +1,23 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"33 10 7 1",
+" c #020202",
+". c #323232",
+"X c Gray49",
+"o c Gray51",
+"O c #bebebe",
+"+ c Gray81",
+"@ c None",
+/* pixels */
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@oXooooXXXXXXXXXXXXXoXXXXXXooXo@",
+"@o o",
+"@+....... .......+",
+"@@@@@@@@X X@@@@@@@",
+"@@@@@@@@X X@@@@@@@",
+"@@@@@@@@o X@@@@@@@",
+"@@@@@@@@o o@@@@@@@",
+"@@@@@@@@X X@@@@@@@",
+"@@@@@@@@OXXXXXXXXXXXXXXXXO@@@@@@@"
+};
diff --git a/data/pixmaps/feta/12/rests-1.xpm b/data/pixmaps/feta/12/rests-1.xpm
new file mode 100644
index 0000000..ed33aa1
--- /dev/null
+++ b/data/pixmaps/feta/12/rests-1.xpm
@@ -0,0 +1,20 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"19 9 5 1",
+" c #020202",
+". c Gray49",
+"X c #898989",
+"o c #c8c8c8",
+"O c None",
+/* pixels */
+"OOOOOOOOOOOOOOOOOOO",
+"Oo.XXXXXXXXXXXXXXXo",
+"OX X",
+"OX X",
+"OX X",
+"OX X",
+"OX X",
+"OX X",
+"Oo.XXXXXXXXXXXXXX.o"
+};
diff --git a/data/pixmaps/feta/12/rests-1o.xpm b/data/pixmaps/feta/12/rests-1o.xpm
new file mode 100644
index 0000000..3c787e1
--- /dev/null
+++ b/data/pixmaps/feta/12/rests-1o.xpm
@@ -0,0 +1,22 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"33 10 6 1",
+" c Gray1",
+". c Gray",
+"X c #898989",
+"o c Gray74",
+"O c Gray77",
+"+ c None",
+/* pixels */
+"+++++++++++++++++++++++++++++++++",
+"++++++++O.XXXXXXXXXXXXXXXO+++++++",
+"++++++++. .+++++++",
+"++++++++X X+++++++",
+"++++++++. .+++++++",
+"++++++++. X+++++++",
+"++++++++. .+++++++",
+"+o o",
+"+X X",
+"++XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX+"
+};
diff --git a/data/pixmaps/feta/12/rests-2.xpm b/data/pixmaps/feta/12/rests-2.xpm
new file mode 100644
index 0000000..d2dfd7b
--- /dev/null
+++ b/data/pixmaps/feta/12/rests-2.xpm
@@ -0,0 +1,49 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"14 35 8 1",
+" c Gray1",
+". c Gray19",
+"X c #565656",
+"o c Gray45",
+"O c #8d8d8d",
+"+ c #acacac",
+"@ c #d3d3d3",
+"# c None",
+/* pixels */
+"##############",
+"####@o########",
+"####O X#######",
+"#####X o######",
+"######X +#####",
+"####### +####",
+"#######O +###",
+"#######o .###",
+"#######o .##",
+"######@ .#",
+"######o +",
+"#####O O",
+"###@X .#",
+"##@. @#",
+"#@. .@##",
+"#O o####",
+"#+ X#####",
+"##X @#####",
+"##@. X######",
+"###@. o######",
+"####@ O######",
+"#####O .######",
+"##@++@O o#####",
+"#@ . O####",
+"#O @###",
+"#O @##",
+"#O .XXX @#",
+"#@ @####+ o#",
+"##. o######@##",
+"##O O#########",
+"### o#########",
+"###XX#########",
+"###@ #########",
+"####+X########",
+"#####+########"
+};
diff --git a/data/pixmaps/feta/12/rests-2mensural.xpm b/data/pixmaps/feta/12/rests-2mensural.xpm
new file mode 100644
index 0000000..b7ca53f
--- /dev/null
+++ b/data/pixmaps/feta/12/rests-2mensural.xpm
@@ -0,0 +1,23 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"11 11 6 1",
+" c #070707",
+". c #484848",
+"X c Gray46",
+"o c #8b8b8b",
+"O c #b9b9b9",
+"+ c None",
+/* pixels */
+"+++++++++++",
+"++OO+++++++",
+"+O Xo++++",
+"+o .o+",
+"+o X o",
+"+o +++o. O",
+"+o +++++++",
+"+o +++++++",
+"+o +++++++",
+"+O +++++++",
+"++OO+++++++"
+};
diff --git a/data/pixmaps/feta/12/rests-3.xpm b/data/pixmaps/feta/12/rests-3.xpm
new file mode 100644
index 0000000..6eb4645
--- /dev/null
+++ b/data/pixmaps/feta/12/rests-3.xpm
@@ -0,0 +1,37 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"17 23 8 1",
+" c Gray1",
+". c Gray19",
+"X c #4e4e4e",
+"o c Gray45",
+"O c Gray52",
+"+ c #afafaf",
+"@ c #d3d3d3",
+"# c None",
+/* pixels */
+"#################",
+"###@OO@##########",
+"##+ o#######o+",
+"#@ +#####@ o",
+"#O X#####X #",
+"#O .####@ .#",
+"#@ o##@X o#",
+"##+ @#",
+"###@o .OO .##",
+"############+ o##",
+"############. @##",
+"###########@ .###",
+"###########o o###",
+"###########. @###",
+"##########+ .####",
+"##########. o####",
+"#########@ @####",
+"#########+ .#####",
+"#########X X#####",
+"########@ @#####",
+"########O .######",
+"########X X######",
+"########@O@######"
+};
diff --git a/data/pixmaps/feta/12/rests-3mensural.xpm b/data/pixmaps/feta/12/rests-3mensural.xpm
new file mode 100644
index 0000000..c2d2c6c
--- /dev/null
+++ b/data/pixmaps/feta/12/rests-3mensural.xpm
@@ -0,0 +1,25 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"11 11 8 1",
+" c #070707",
+". c #3e3e3e",
+"X c #4e4e4e",
+"o c Gray46",
+"O c #8b8b8b",
+"+ c #bcbcbc",
+"@ c #c3c3c3",
+"# c None",
+/* pixels */
+"###########",
+"########+O#",
+"#####Oo O",
+"##@X O",
+"#+ o O",
+"##..O### O",
+"######## O",
+"######## O",
+"######## O",
+"########X O",
+"#########O#"
+};
diff --git a/data/pixmaps/feta/12/rests-4.xpm b/data/pixmaps/feta/12/rests-4.xpm
new file mode 100644
index 0000000..92ec572
--- /dev/null
+++ b/data/pixmaps/feta/12/rests-4.xpm
@@ -0,0 +1,48 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"19 34 8 1",
+" c #040404",
+". c Gray17",
+"X c Gray30",
+"o c Gray46",
+"O c Gray54",
+"+ c #b1b1b1",
+"@ c #cdcdcd",
+"# c None",
+/* pixels */
+"###################",
+"#######+oO#########",
+"######. .@#####o+",
+"#####X X####@ O",
+"####@ @###O +",
+"####@ @### #",
+"#####o .@#+. o#",
+"######X . O#",
+"#######@.... X@X @#",
+"############### ##",
+"##############+ o##",
+"##############O @##",
+"####@@########. @##",
+"##@. .+#####@ X###",
+"##. @####O O###",
+"#+ X####. @###",
+"#O .####. ####",
+"#@ .@@O. X####",
+"##o O####",
+"###+. X. @####",
+"#####@@@@@@+ X#####",
+"###########O X#####",
+"###########. +#####",
+"##########@ @#####",
+"##########O X######",
+"##########X o######",
+"##########. @######",
+"#########+ .@######",
+"#########X X#######",
+"#########. o#######",
+"########@ @#######",
+"########O .########",
+"########X X########",
+"########@o@########"
+};
diff --git a/data/pixmaps/feta/12/rests-4mensural.xpm b/data/pixmaps/feta/12/rests-4mensural.xpm
new file mode 100644
index 0000000..8291912
--- /dev/null
+++ b/data/pixmaps/feta/12/rests-4mensural.xpm
@@ -0,0 +1,27 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"11 13 8 1",
+" c Gray2",
+". c #2d2d2d",
+"X c #4b4b4b",
+"o c #727272",
+"O c #8b8b8b",
+"+ c #aeaeae",
+"@ c #d5d5d5",
+"# c None",
+/* pixels */
+"###########",
+"########@O#",
+"######@o O",
+"####@o O",
+"##@X . O",
+"#+ .+# O",
+"#@.X@##o O",
+"#####o O",
+"##@o . O",
+"#@ .O@. O",
+"#+ .+### O",
+"##@#####X O",
+"#########o#"
+};
diff --git a/data/pixmaps/feta/12/rests-5.xpm b/data/pixmaps/feta/12/rests-5.xpm
new file mode 100644
index 0000000..6965b9d
--- /dev/null
+++ b/data/pixmaps/feta/12/rests-5.xpm
@@ -0,0 +1,60 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"22 46 8 1",
+" c Gray2",
+". c Gray23",
+"X c #484848",
+"o c #7b7b7b",
+"O c Gray52",
+"+ c Gray72",
+"@ c Gray78",
+"# c None",
+/* pixels */
+"######################",
+"##########Oo+#########",
+"########+ X######o@",
+"######## o####+ O",
+"#######O ####o @",
+"#######O ####X #",
+"######## X##@. X#",
+"########+ o#",
+"##########o .@O +#",
+"##################X ##",
+"################## ##",
+"#################+ o##",
+"#################O O##",
+"######O .+######X ###",
+"#####X +##### ###",
+"####+ X####+ o###",
+"####o ####o O###",
+"####+ ####X ####",
+"#####X .OOo ####",
+"######o . X####",
+"########OooOOO#O O####",
+"###############X +####",
+"############### #####",
+"##############+ X#####",
+"####Oo+#######O O#####",
+"##+ X######X O#####",
+"## O##### ######",
+"#O ####+ ######",
+"#O ####X o######",
+"## oOo O######",
+"##+ #######",
+"####O O+ #######",
+"##########@#O o#######",
+"############X O#######",
+"############ +#######",
+"###########+ ########",
+"###########O X########",
+"###########X O########",
+"########### +########",
+"##########+ #########",
+"##########O X#########",
+"########## O#########",
+"########## O#########",
+"#########O ##########",
+"#########O ##########",
+"##########O+##########"
+};
diff --git a/data/pixmaps/feta/12/rests-6.xpm b/data/pixmaps/feta/12/rests-6.xpm
new file mode 100644
index 0000000..1ddb77e
--- /dev/null
+++ b/data/pixmaps/feta/12/rests-6.xpm
@@ -0,0 +1,71 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"23 57 8 1",
+" c Gray1",
+". c Gray18",
+"X c Gray31",
+"o c Gray43",
+"O c #8d8d8d",
+"+ c #b1b1b1",
+"@ c #d0d0d0",
+"# c None",
+/* pixels */
+"#######################",
+"###########+o+#########",
+"#########@. .@#####o+",
+"#########X X####@ O",
+"########@ @###O +",
+"########@ @###X #",
+"#########X .@#@X #",
+"#########@. X o#",
+"###########+ .@@ o#",
+"###################O +#",
+"###################X ##",
+"###################. @#",
+"################### o##",
+"########o X@#####+ o##",
+"#######. .#####O +##",
+"######O O####. @##",
+"######o X#### @##",
+"######O X###@ o###",
+"#######. oOOX o###",
+"#######@o oO +###",
+"#########@oOoOO@#. @###",
+"################# .####",
+"################+ o####",
+"################+ o####",
+"######+oO#######o @####",
+"#####. .@#####. @####",
+"####o X####@ .#####",
+"###@ +###+ o#####",
+"###@ +###o o#####",
+"####o oOo @#####",
+"#####. @#####",
+"######+. oO .######",
+"########@###@#+ X######",
+"##############o o######",
+"##############. @######",
+"##############. @######",
+"###o X@#####+ .#######",
+"##X @####+ X#######",
+"#+ o####X o#######",
+"#O .####. @#######",
+"#+ .##@o @#######",
+"##. .########",
+"###o .. X########",
+"#####oOoOoO#. X########",
+"############. @########",
+"###########@ @########",
+"###########+ X#########",
+"###########X X#########",
+"###########X O#########",
+"########### @#########",
+"##########@ @#########",
+"##########+ X##########",
+"##########X X##########",
+"##########X O##########",
+"#########@ +##########",
+"#########@ @##########",
+"##########+O###########"
+};
diff --git a/data/pixmaps/feta/12/rests-7.xpm b/data/pixmaps/feta/12/rests-7.xpm
new file mode 100644
index 0000000..12b5198
--- /dev/null
+++ b/data/pixmaps/feta/12/rests-7.xpm
@@ -0,0 +1,82 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"26 68 8 1",
+" c #040404",
+". c Gray19",
+"X c Gray31",
+"o c Gray43",
+"O c Gray54",
+"+ c #afafaf",
+"@ c #d0d0d0",
+"# c None",
+/* pixels */
+"##########################",
+"##############Oo+#########",
+"############+ X########",
+"############ o##### O",
+"###########O ####O O",
+"###########O ####o #",
+"###########+ .##@o #",
+"############X X#",
+"#############O. X+ o#",
+"###############OOOOO@#O O#",
+"######################o ##",
+"###################### ##",
+"############@@######## X##",
+"##########+. o######+ o##",
+"#########+ .#####o @##",
+"#########. +####. ###",
+"######### o#### ###",
+"#########X O###O O###",
+"#########@ ooX. o###",
+"##########@o oX @###",
+"############@O+++O@# ####",
+"#################### .####",
+"###################+ O####",
+"###################O o####",
+"########@XXO#######. @####",
+"#######O .@##### #####",
+"######@ o####@ X#####",
+"######O ####O O#####",
+"######O ####o O#####",
+"#######. X@@@. ######",
+"#######@. . ######",
+"#########+X....X@+ X######",
+"#################O O######",
+"#################o O######",
+"################# #######",
+"######@+@#######@ #######",
+"#####O .@#####o o#######",
+"####O .#####O O#######",
+"####. O####. @#######",
+"#### O###@ ########",
+"####o X@+o .########",
+"####@. o########",
+"######O. .OX O########",
+"#######@@@@@@@# @########",
+"##############@ #########",
+"##############o .#########",
+"##############O O#########",
+"###+..o@######. o#########",
+"##o @##### @#########",
+"#@ X####O ##########",
+"#O ####o o##########",
+"#+ ###+. O##########",
+"##. ... +##########",
+"##@o . ###########",
+"####@oooXoo#o ###########",
+"############O o###########",
+"############ O###########",
+"############ +###########",
+"###########@ ############",
+"###########o ############",
+"###########X o############",
+"########### O############",
+"########### @############",
+"##########O #############",
+"##########o X#############",
+"##########. o#############",
+"########## O#############",
+"##########+O##############"
+};
diff --git a/data/pixmaps/feta/12/scripts-arpeggio.xpm b/data/pixmaps/feta/12/scripts-arpeggio.xpm
new file mode 100644
index 0000000..a402782
--- /dev/null
+++ b/data/pixmaps/feta/12/scripts-arpeggio.xpm
@@ -0,0 +1,32 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"11 18 8 1",
+" c Gray2",
+". c Gray22",
+"X c #535353",
+"o c #747474",
+"O c #929292",
+"+ c #a9a9a9",
+"@ c Gray82",
+"# c None",
+/* pixels */
+"###########",
+"###o@######",
+"##@ @#####",
+"####. O####",
+"####@ o###",
+"#####X X@#",
+"#####. #",
+"####+ o",
+"###@ @",
+"##@ @#",
+"#@ X###",
+"#o .####",
+"#@. +####",
+"##@ @####",
+"####o X####",
+"#####o +###",
+"######o X##",
+"#######++##"
+};
diff --git a/data/pixmaps/feta/12/scripts-coda.xpm b/data/pixmaps/feta/12/scripts-coda.xpm
new file mode 100644
index 0000000..0587984
--- /dev/null
+++ b/data/pixmaps/feta/12/scripts-coda.xpm
@@ -0,0 +1,48 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"26 34 8 1",
+" c #020202",
+". c Gray19",
+"X c Gray36",
+"o c #6d6d6d",
+"O c Gray56",
+"+ c #b2b2b2",
+"@ c Gray79",
+"# c None",
+/* pixels */
+"##########################",
+"#############o@###########",
+"############@ @###########",
+"############@ @###########",
+"############@ +###########",
+"############+ @###########",
+"##########@X .+##########",
+"#########O .X . .#########",
+"########O #@ @O .########",
+"#######@ o#+ @# X#######",
+"#######X +#@ @#. @######",
+"######@ .##@ +#+ X######",
+"######O .##@ @#+ .######",
+"######X .##@ @#+ @#####",
+"######. .##+ +#+ O#####",
+"#####@ .##@ @#+ X#####",
+"#+oooo oOX XOX .Oooo#",
+"#O @",
+"#####@ .##+ +#+ X#####",
+"###### .##@ @#+ X#####",
+"######. .##@ +#+ O#####",
+"######X .##@ @#+ @#####",
+"######O .##@ +#+ .######",
+"######@ .##@ @#O X######",
+"#######X +#@ +#. @######",
+"#######@ o#+ @# X#######",
+"########O #@ @O .########",
+"#########O .X X .#########",
+"##########@X +##########",
+"############+ @###########",
+"############@ @###########",
+"############@ @###########",
+"############@ @###########",
+"############@O############"
+};
diff --git a/data/pixmaps/feta/12/scripts-dfermata.xpm b/data/pixmaps/feta/12/scripts-dfermata.xpm
new file mode 100644
index 0000000..24ff94f
--- /dev/null
+++ b/data/pixmaps/feta/12/scripts-dfermata.xpm
@@ -0,0 +1,33 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"32 19 8 1",
+" c Gray1",
+". c Gray19",
+"X c #484848",
+"o c Gray44",
+"O c #8b8b8b",
+"+ c #b1b1b1",
+"@ c #d2d2d2",
+"# c None",
+/* pixels */
+"################################",
+"#@O############+o+############o@",
+"#O +##########X X##########+ O",
+"#@ o#########+ +#########o @",
+"## .#########O O#########. #",
+"##X @########O O########@ X#",
+"##O o#########o o#########o O#",
+"### @#########+++#########@ ##",
+"###o .#####################. o##",
+"###@ O###################O @##",
+"####o o#################o o###",
+"####@ o@#############@o @###",
+"#####O .+###########+. O####",
+"######. .o+@###@+o. .#####",
+"#######. ... .######",
+"########. .#######",
+"#########+ +########",
+"##########@o o@#########",
+"#############@OOOOO@############"
+};
diff --git a/data/pixmaps/feta/12/scripts-dmarcato.xpm b/data/pixmaps/feta/12/scripts-dmarcato.xpm
new file mode 100644
index 0000000..6d4b283
--- /dev/null
+++ b/data/pixmaps/feta/12/scripts-dmarcato.xpm
@@ -0,0 +1,28 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"13 14 8 1",
+" c Gray2",
+". c #323232",
+"X c #555555",
+"o c #6c6c6c",
+"O c #888888",
+"+ c Gray69",
+"@ c #d3d3d3",
+"# c None",
+/* pixels */
+"#############",
+"#@oOo@#####++",
+"#O .#####.O",
+"## +###+ #",
+"##O o###.O#",
+"### @#@ ##",
+"###X o#XX##",
+"###@ + @##",
+"####o o###",
+"####@ @###",
+"#####. .####",
+"#####+ +####",
+"######..#####",
+"######++#####"
+};
diff --git a/data/pixmaps/feta/12/scripts-downbow.xpm b/data/pixmaps/feta/12/scripts-downbow.xpm
new file mode 100644
index 0000000..4313267
--- /dev/null
+++ b/data/pixmaps/feta/12/scripts-downbow.xpm
@@ -0,0 +1,29 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"19 17 6 1",
+" c #020202",
+". c Gray",
+"X c #888888",
+"o c Gray70",
+"O c Gray77",
+"+ c None",
+/* pixels */
+"+++++++++++++++++++",
+"+O.XXXXXXXXXXXXXX.O",
+"+X X",
+"+X X",
+"+X X",
+"+X X",
+"+X X",
+"+X .X..........X. X",
+"+X ++++++++++++++ .",
+"+X ++++++++++++++ X",
+"+X ++++++++++++++ X",
+"+X ++++++++++++++ X",
+"+X ++++++++++++++ X",
+"+X ++++++++++++++ .",
+"+X ++++++++++++++ X",
+"+. ++++++++++++++ X",
+"+oo++++++++++++++oO"
+};
diff --git a/data/pixmaps/feta/12/scripts-downmordent.xpm b/data/pixmaps/feta/12/scripts-downmordent.xpm
new file mode 100644
index 0000000..def5801
--- /dev/null
+++ b/data/pixmaps/feta/12/scripts-downmordent.xpm
@@ -0,0 +1,33 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"41 19 8 1",
+" c #040404",
+". c Gray18",
+"X c #4c4c4c",
+"o c #686868",
+"O c #8e8e8e",
+"+ c #acacac",
+"@ c #d5d5d5",
+"# c None",
+/* pixels */
+"#########################################",
+"####++###################################",
+"###+ O###################################",
+"##@ ####################################",
+"##. O######################..############",
+"#@ @####@@#########@###### #@@#########",
+"#O ####+ .########. O##### .O .#########",
+"#O ###@. .@#####O O#### . .@#######",
+"#O ###o .@###@ O### .@####@@",
+"#@ @#O O##. X@# O##O O",
+"##o O#. OO .+ O@ @",
+"##@ .X O. . . . +#",
+"###O .#@. o#O @. o##",
+"####OX@###O .@##@. ##O .@##",
+"###########O +#####. . ###O +###",
+"############O o#######. @ ####+ o####",
+"#############+o@########o+# #####+o@####",
+"########################### ############",
+"###########################++############"
+};
diff --git a/data/pixmaps/feta/12/scripts-downprall.xpm b/data/pixmaps/feta/12/scripts-downprall.xpm
new file mode 100644
index 0000000..c2a5741
--- /dev/null
+++ b/data/pixmaps/feta/12/scripts-downprall.xpm
@@ -0,0 +1,31 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"41 17 8 1",
+" c #020202",
+". c Gray19",
+"X c #555555",
+"o c #747474",
+"O c #8d8d8d",
+"+ c Gray67",
+"@ c #d5d5d5",
+"# c None",
+/* pixels */
+"#########################################",
+"####++###################################",
+"###+ O###################################",
+"##@ ####################################",
+"##. O####################################",
+"#@ @####@@########@@#########@@#########",
+"#O ####+ .@#######. O#######+ .@########",
+"#O ###@. .@#####O O#####@. .@#######",
+"#O ###o .@###@ O####o .@####+@",
+"#@ @#O O##. .@#O O##O O",
+"##o O@. oo .+. O@ .@",
+"##@ .X O. X .. +#",
+"###O .##. o#O @#. o##",
+"####+X@###O .###@. O###O .###",
+"###########+ +#####. X#####+ +###",
+"############+ o#######X @######+ o####",
+"#############+o#########o+########+O#####"
+};
diff --git a/data/pixmaps/feta/12/scripts-dpedalheel.xpm b/data/pixmaps/feta/12/scripts-dpedalheel.xpm
new file mode 100644
index 0000000..65303b5
--- /dev/null
+++ b/data/pixmaps/feta/12/scripts-dpedalheel.xpm
@@ -0,0 +1,26 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"13 15 5 1",
+" c #020202",
+". c #888888",
+"X c #b4b4b4",
+"o c Gray78",
+"O c None",
+/* pixels */
+"OOOOOOOOOOOOO",
+"OOOOO....OOOO",
+"OOOX XOO",
+"OOX .OO. XO",
+"OO XOOOOX O",
+"O. .OOOOOO. .",
+"O. OOOOOOOO .",
+"O. OOOOOOOO .",
+"O. OOOOOOOO .",
+"O. OOOOOOOO .",
+"O. OOOOOOOO .",
+"O. OOOOOOOO .",
+"O. OOOOOOOO .",
+"O. OOOOOOOO .",
+"Oo.OOOOOOOO.o"
+};
diff --git a/data/pixmaps/feta/12/scripts-dpedaltoe.xpm b/data/pixmaps/feta/12/scripts-dpedaltoe.xpm
new file mode 100644
index 0000000..e9064c3
--- /dev/null
+++ b/data/pixmaps/feta/12/scripts-dpedaltoe.xpm
@@ -0,0 +1,32 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"13 19 7 1",
+" c #040404",
+". c #434343",
+"X c #777777",
+"o c #888888",
+"O c Gray73",
+"+ c #c8c8c8",
+"@ c None",
+/* pixels */
+"@@@@@@@@@@@@@",
+"@+o@@@@@@@@o+",
+"@o O@@@@@@O o",
+"@+ X@@@@@@X +",
+"@@ @@@@@@ @",
+"@@X @@@@@@ X@",
+"@@o o@@@@o o@",
+"@@@ .@@@@. @@",
+"@@@. @@@@ .@@",
+"@@@o o@@o o@@",
+"@@@@ .@@. @@@",
+"@@@@. @@ .@@@",
+"@@@@o ++ o@@@",
+"@@@@O oo O@@@",
+"@@@@@ @@@@",
+"@@@@@X X@@@@",
+"@@@@@O O@@@@",
+"@@@@@@ @@@@@",
+"@@@@@@Oo@@@@@"
+};
diff --git a/data/pixmaps/feta/12/scripts-dstaccatissimo.xpm b/data/pixmaps/feta/12/scripts-dstaccatissimo.xpm
new file mode 100644
index 0000000..01d8031
--- /dev/null
+++ b/data/pixmaps/feta/12/scripts-dstaccatissimo.xpm
@@ -0,0 +1,27 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"7 14 7 1",
+" c #040404",
+". c #393939",
+"X c #434343",
+"o c Gray49",
+"O c Gray53",
+"+ c #bcbcbc",
+"@ c None",
+/* pixels */
+"@@@@@@@",
+"@@@++@@",
+"@@@..@@",
+"@@@ @@",
+"@@@ @@",
+"@@o O@",
+"@@o o@",
+"@@X X@",
+"@@ @",
+"@@ @",
+"@O O",
+"@O O",
+"@+ +",
+"@@+OO+@"
+};
diff --git a/data/pixmaps/feta/12/scripts-flageolet.xpm b/data/pixmaps/feta/12/scripts-flageolet.xpm
new file mode 100644
index 0000000..08d3d07
--- /dev/null
+++ b/data/pixmaps/feta/12/scripts-flageolet.xpm
@@ -0,0 +1,23 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"14 14 3 1",
+" c #929292",
+". c Gray85",
+"X c None",
+/* pixels */
+"XXXXXXXXXXXXXX",
+"XXXXX. .XXXX",
+"XXX. ... .XX",
+"XXX .XXXXX. XX",
+"XX .XXXXXXX. X",
+"X. XXXXXXXXX .",
+"X .XXXXXXXXX. ",
+"X .XXXXXXXXX. ",
+"X .XXXXXXXXX. ",
+"X. XXXXXXXXX .",
+"XX .XXXXXXX. X",
+"XXX .XXXXX. XX",
+"XXX. ... .XX",
+"XXXXX. .XXXX"
+};
diff --git a/data/pixmaps/feta/12/scripts-lcomma.xpm b/data/pixmaps/feta/12/scripts-lcomma.xpm
new file mode 100644
index 0000000..9911ebe
--- /dev/null
+++ b/data/pixmaps/feta/12/scripts-lcomma.xpm
@@ -0,0 +1,30 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"7 16 8 1",
+" c Gray1",
+". c Gray14",
+"X c Gray32",
+"o c Gray47",
+"O c Gray54",
+"+ c #b4b4b4",
+"@ c #d3d3d3",
+"# c None",
+/* pixels */
+"#######",
+"#####o+",
+"####+ +",
+"#### X#",
+"###o @#",
+"##@ X##",
+"##O O##",
+"##. ###",
+"#@ ###",
+"#O ###",
+"#O @##",
+"#O o##",
+"#O .##",
+"## O#",
+"##o o#",
+"###OO##"
+};
diff --git a/data/pixmaps/feta/12/scripts-lineprall.xpm b/data/pixmaps/feta/12/scripts-lineprall.xpm
new file mode 100644
index 0000000..874e2c4
--- /dev/null
+++ b/data/pixmaps/feta/12/scripts-lineprall.xpm
@@ -0,0 +1,45 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"38 31 8 1",
+" c #020202",
+". c Gray18",
+"X c #535353",
+"o c #727272",
+"O c #8d8d8d",
+"+ c Gray70",
+"@ c #cecece",
+"# c None",
+/* pixels */
+"######################################",
+"##O###################################",
+"#O O##################################",
+"#O O##################################",
+"#O O##################################",
+"#O O##################################",
+"#O O##################################",
+"#O O##################################",
+"#O O##################################",
+"#O O##################################",
+"#O O##################################",
+"#O O##################################",
+"#O O##################################",
+"#O O##################################",
+"#O O##################################",
+"#O O##################################",
+"#O O##################################",
+"#O O##################################",
+"#O O##################################",
+"#O O##@+#########+#########+@#########",
+"#O O## O#######X X#######+ @########",
+"#O O#X O#####+ .######. +#######",
+"#O O@ O####. .####o @####+@",
+"#O O. .@#X O#+ X##o O",
+"#O .O O. X@ .#",
+"#O XO X. .X +#",
+"#O +#O .#@ @#X X##",
+"#+ +###@. @###o o###+ .###",
+"########@. o#####o .#####@ +###",
+"##########. .#######o @######@ o####",
+"###########o@########OO########@o#####"
+};
diff --git a/data/pixmaps/feta/12/scripts-mordent.xpm b/data/pixmaps/feta/12/scripts-mordent.xpm
new file mode 100644
index 0000000..a0a3037
--- /dev/null
+++ b/data/pixmaps/feta/12/scripts-mordent.xpm
@@ -0,0 +1,31 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"27 17 8 1",
+" c #020202",
+". c #343434",
+"X c #494949",
+"o c Gray45",
+"O c Gray58",
+"+ c #b6b6b6",
+"@ c Gray80",
+"# c None",
+/* pixels */
+"###########################",
+"#############O@############",
+"############@ X############",
+"######o@####@ X#OO#########",
+"#####o @###@ X@ O########",
+"####+ @##@ .. O#######",
+"####. @#@ O####O+",
+"###o o@ .##X O",
+"##+ X X@ .#",
+"##. +X .o +#",
+"#O X##. .#o o##",
+"#+o####O X##@ .###",
+"########O X###@ +###",
+"#########O O .####@ o####",
+"##########OO@ X#####@o#####",
+"############@ X############",
+"#############O@############"
+};
diff --git a/data/pixmaps/feta/12/scripts-open.xpm b/data/pixmaps/feta/12/scripts-open.xpm
new file mode 100644
index 0000000..84803c0
--- /dev/null
+++ b/data/pixmaps/feta/12/scripts-open.xpm
@@ -0,0 +1,25 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"11 13 6 1",
+" c #040404",
+". c Gray30",
+"X c Gray",
+"o c Gray53",
+"O c Gray75",
+"+ c None",
+/* pixels */
+"+++++++++++",
+"++++OooO+++",
+"+++. .++",
+"++o .++. o+",
+"++ ++++ +",
+"+o X++++X o",
+"+o o++++o o",
+"+o X++++o o",
+"+o o++++X o",
+"++ ++++ +",
+"++o .++. X+",
+"+++. .++",
+"++++OooO+++"
+};
diff --git a/data/pixmaps/feta/12/scripts-prall.xpm b/data/pixmaps/feta/12/scripts-prall.xpm
new file mode 100644
index 0000000..d374bd1
--- /dev/null
+++ b/data/pixmaps/feta/12/scripts-prall.xpm
@@ -0,0 +1,27 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"27 13 8 1",
+" c Gray1",
+". c #373737",
+"X c #515151",
+"o c #747474",
+"O c #929292",
+"+ c #b4b4b4",
+"@ c Gray81",
+"# c None",
+/* pixels */
+"###########################",
+"######o@########OO#########",
+"#####o @######+ O########",
+"####+ @##### O#######",
+"####. @###o O####o+",
+"###o o#+ .##X O",
+"##+ X. X+ .#",
+"##. +X .o +#",
+"#O X##. +#o o##",
+"#@o####O o###@ .###",
+"########O .@####@ +###",
+"#########O +######@ o####",
+"##########+O########@o#####"
+};
diff --git a/data/pixmaps/feta/12/scripts-pralldown.xpm b/data/pixmaps/feta/12/scripts-pralldown.xpm
new file mode 100644
index 0000000..989bb44
--- /dev/null
+++ b/data/pixmaps/feta/12/scripts-pralldown.xpm
@@ -0,0 +1,34 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"40 20 8 1",
+" c Gray1",
+". c Gray18",
+"X c #505050",
+"o c Gray46",
+"O c Gray56",
+"+ c #acacac",
+"@ c Gray83",
+"# c None",
+/* pixels */
+"########################################",
+"##########+o#########O+########+o#######",
+"#########+ o#######X @######+ o######",
+"########+ +#####. .#####+ +#####",
+"#+X####O .###@. +###O .#####",
+"#O .##. o#O @#. o####",
+"##X O. X .. +###",
+"##@. oo .+. O@ .@##",
+"###O o##. .@#O o##o o##",
+"####X .@###@ o####X .@####. @#",
+"####@. .@#####O o#####@. .@#####o .#",
+"#####+ .@#######. O#######+ .@######@ @",
+"######@@########@@#########@@######## O",
+"##################################### O",
+"##################################### O",
+"####################################@ @",
+"####################################O o#",
+"#################################### @#",
+"###################################O +##",
+"###################################++###"
+};
diff --git a/data/pixmaps/feta/12/scripts-prallmordent.xpm b/data/pixmaps/feta/12/scripts-prallmordent.xpm
new file mode 100644
index 0000000..70e6683
--- /dev/null
+++ b/data/pixmaps/feta/12/scripts-prallmordent.xpm
@@ -0,0 +1,31 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"38 17 8 1",
+" c #040404",
+". c #3f3f3f",
+"X c #4c4c4c",
+"o c #797979",
+"O c #848484",
+"+ c #b6b6b6",
+"@ c Gray76",
+"# c None",
+/* pixels */
+"######################################",
+"########################++############",
+"######################## ############",
+"######o+########+o###### #o+#########",
+"#####O +####### X##### o +########",
+"####+ +#####X X#### +#######",
+"####X +###+ X### +####o@",
+"###o X## +# X##X O",
+"##+ XX o X+ X#",
+"##X +X o X +#",
+"#O X##X o#+ #X O##",
+"#+o####+ X####X ##+ X###",
+"########+ +#####X . ###+ +###",
+"#########+ O#######X # ####+ O####",
+"##########+o#########o@# #####+o#####",
+"######################## ############",
+"########################++############"
+};
diff --git a/data/pixmaps/feta/12/scripts-prallprall.xpm b/data/pixmaps/feta/12/scripts-prallprall.xpm
new file mode 100644
index 0000000..bebee8f
--- /dev/null
+++ b/data/pixmaps/feta/12/scripts-prallprall.xpm
@@ -0,0 +1,26 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"38 13 7 1",
+" c Gray1",
+". c #4c4c4c",
+"X c #7b7b7b",
+"o c Gray52",
+"O c #b6b6b6",
+"+ c Gray76",
+"@ c None",
+/* pixels */
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@oO@@@@@@@@Oo@@@@@@@@@oO@@@@@@@@@",
+"@@@@@o O@@@@@@@ .@@@@@@@o O@@@@@@@@",
+"@@@@O O@@@@@. .@@@@@O O@@@@@@@",
+"@@@@. O@@@O .@@@@. O@@@@X+",
+"@@@o .@@ O@X .@@. o",
+"@@O .. X .O .@",
+"@@. O. X .. O@",
+"@o .@@. X@O @@. X@@",
+"@+X@@@@O .@@@@. O@@@O .@@@",
+"@@@@@@@@O O@@@@@. .@@@@@O O@@@",
+"@@@@@@@@@O X@@@@@@@. @@@@@@@O X@@@@",
+"@@@@@@@@@@Oo@@@@@@@@@oO@@@@@@@@Oo@@@@@"
+};
diff --git a/data/pixmaps/feta/12/scripts-prallup.xpm b/data/pixmaps/feta/12/scripts-prallup.xpm
new file mode 100644
index 0000000..2440221
--- /dev/null
+++ b/data/pixmaps/feta/12/scripts-prallup.xpm
@@ -0,0 +1,31 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"41 17 8 1",
+" c #020202",
+". c Gray19",
+"X c #555555",
+"o c #747474",
+"O c #8d8d8d",
+"+ c Gray67",
+"@ c #d5d5d5",
+"# c None",
+/* pixels */
+"#########################################",
+"####################################++###",
+"####################################O +##",
+"#####################################. @#",
+"#####################################O X#",
+"##########@@#########@@########@@####@ @",
+"#########@. +#######O .########. +#### O",
+"########@. .@#####O O#####@. .@##@ O",
+"#@@####@. X####O @###@. o### O",
+"#O O##O +#@. .##O O#@ @",
+"#@. @O .+. oo .@O o#",
+"##+ .. X .O X. @#",
+"###o .#@ O#o .@#. O##",
+"####. O###O .@###. O###@X+###",
+"####+ +#####X .#####+ +##########",
+"#####o +######@ .#######o +###########",
+"######O+########+O#########o+############"
+};
diff --git a/data/pixmaps/feta/12/scripts-rcomma.xpm b/data/pixmaps/feta/12/scripts-rcomma.xpm
new file mode 100644
index 0000000..ddf920c
--- /dev/null
+++ b/data/pixmaps/feta/12/scripts-rcomma.xpm
@@ -0,0 +1,30 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"7 16 8 1",
+" c Gray1",
+". c Gray14",
+"X c Gray32",
+"o c Gray47",
+"O c Gray54",
+"+ c #b4b4b4",
+"@ c #d3d3d3",
+"# c None",
+/* pixels */
+"#######",
+"###OO##",
+"##o o#",
+"##O @",
+"###. O",
+"###o O",
+"###@ O",
+"#### O",
+"#### @",
+"#### .#",
+"###O O#",
+"###X @#",
+"##@ o##",
+"##X ###",
+"#+ +###",
+"#+o####"
+};
diff --git a/data/pixmaps/feta/12/scripts-reverseturn.xpm b/data/pixmaps/feta/12/scripts-reverseturn.xpm
new file mode 100644
index 0000000..2f48439
--- /dev/null
+++ b/data/pixmaps/feta/12/scripts-reverseturn.xpm
@@ -0,0 +1,28 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"27 14 8 1",
+" c #040404",
+". c Gray24",
+"X c #4b4b4b",
+"o c #7c7c7c",
+"O c #888888",
+"+ c #b7b7b7",
+"@ c #c1c1c1",
+"# c None",
+/* pixels */
+"###########################",
+"#####OOO##########+OOO#####",
+"###+ +######+. o###",
+"##+ #####X X##",
+"##. ####X o#",
+"#@ X#X X###X .@##O #",
+"#O ###OoO##+ +#####+ O",
+"#O #######+ +####### O",
+"#O +#####+ +##OoO### O",
+"## o##@. X###X X#X @",
+"##o X#### .#",
+"###X X##### +#",
+"####o .@######+ +##",
+"######OOO+##########OOO####"
+};
diff --git a/data/pixmaps/feta/12/scripts-segno.xpm b/data/pixmaps/feta/12/scripts-segno.xpm
new file mode 100644
index 0000000..705bedf
--- /dev/null
+++ b/data/pixmaps/feta/12/scripts-segno.xpm
@@ -0,0 +1,50 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"25 36 8 1",
+" c #040404",
+". c #2d2d2d",
+"X c Gray29",
+"o c #7c7c7c",
+"O c Gray52",
+"+ c #b6b6b6",
+"@ c #c8c8c8",
+"# c None",
+/* pixels */
+"#########################",
+"######OOOO###########@Oo@",
+"####o o#########X #",
+"###X O##@. X#######O +#",
+"##o o##### O###### X##",
+"## #####+ #####X +##",
+"#+ ##### +###+ o###",
+"#O ####O O###X ####",
+"#O +###O o##O +####",
+"#O X###+ +## X#####",
+"#+ +###X X##X +#####",
+"## X########+ O######",
+"##o X#######X #######",
+"### X#####+ +#######",
+"###+ +### X########",
+"####+ X#O +##+ .###",
+"#####+ O###o ###",
+"#######X o####OO###",
+"########+ +#######",
+"####OO####o X######",
+"#### o###O +####",
+"####. +##+ o#X +###",
+"#########X ###+ +##",
+"########+ +#####X ##",
+"######## X#######X o#",
+"#######o +########X #",
+"######+ X##X X###+ +",
+"######X ##+ +###X O",
+"#####+ O##O O###+ O",
+"##### X###O O#### O",
+"####o +###+ ##### @",
+"###+ X##### +##### #",
+"###X ######O #####O o#",
+"##+ o#######X .@##O X##",
+"## X#########O o###",
+"#@OO@###########OOOO#####"
+};
diff --git a/data/pixmaps/feta/12/scripts-sforzato.xpm b/data/pixmaps/feta/12/scripts-sforzato.xpm
new file mode 100644
index 0000000..86331f5
--- /dev/null
+++ b/data/pixmaps/feta/12/scripts-sforzato.xpm
@@ -0,0 +1,26 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"23 13 7 1",
+" c Gray2",
+". c Gray26",
+"X c #717171",
+"o c Gray54",
+"O c #bbbbbb",
+"+ c #c5c5c5",
+"@ c None",
+/* pixels */
+"@@@@@@@@@@@@@@@@@@@@@@@",
+"@+Xo@@@@@@@@@@@@@@@@@@@",
+"@o Xo@@@@@@@@@@@@@@@",
+"@@@oX Xo@@@@@@@@@@@",
+"@@@@@@@oX Xo@@@@@@@",
+"@@@@@@@@@@@oo. XXO@@",
+"@@@@@@@@@@@@@@@@+oo. o",
+"@@@@@@@@@@@@@@@@+oo. O",
+"@@@@@@@@@@@oX. XXO@@",
+"@@@@@@@oX Xo@@@@@@@",
+"@@@oX Xo@@@@@@@@@@@",
+"@o Xo@@@@@@@@@@@@@@@",
+"@+Xo@@@@@@@@@@@@@@@@@@@"
+};
diff --git a/data/pixmaps/feta/12/scripts-staccato.xpm b/data/pixmaps/feta/12/scripts-staccato.xpm
new file mode 100644
index 0000000..fe09428
--- /dev/null
+++ b/data/pixmaps/feta/12/scripts-staccato.xpm
@@ -0,0 +1,14 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"5 5 3 1",
+" c Gray0",
+". c #8b8b8b",
+"X c None",
+/* pixels */
+"XXXXX",
+"XX..X",
+"X. .",
+"X. .",
+"XX..X"
+};
diff --git a/data/pixmaps/feta/12/scripts-stopped.xpm b/data/pixmaps/feta/12/scripts-stopped.xpm
new file mode 100644
index 0000000..2028a9d
--- /dev/null
+++ b/data/pixmaps/feta/12/scripts-stopped.xpm
@@ -0,0 +1,28 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"15 15 7 1",
+" c #070707",
+". c #494949",
+"X c #7b7b7b",
+"o c Gray52",
+"O c #bcbcbc",
+"+ c #c3c3c3",
+"@ c None",
+/* pixels */
+"@@@@@@@@@@@@@@@",
+"@@@@@@@@o@@@@@@",
+"@@@@@@@. o@@@@@",
+"@@@@@@@ X@@@@@",
+"@@@@@@@ X@@@@@",
+"@@@@@@@ X@@@@@",
+"@@OXoXX .oXXo@",
+"@O o",
+"@@. O",
+"@@@@@@@ X@@@@@",
+"@@@@@@@ X@@@@@",
+"@@@@@@@ o@@@@@",
+"@@@@@@@ X@@@@@",
+"@@@@@@@. o@@@@@",
+"@@@@@@@@o@@@@@@"
+};
diff --git a/data/pixmaps/feta/12/scripts-tenuto.xpm b/data/pixmaps/feta/12/scripts-tenuto.xpm
new file mode 100644
index 0000000..8863285
--- /dev/null
+++ b/data/pixmaps/feta/12/scripts-tenuto.xpm
@@ -0,0 +1,12 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"16 3 3 1",
+" c #515151",
+". c Gray69",
+"X c None",
+/* pixels */
+"XXXXXXXXXXXXXXXX",
+"X. .",
+"X. ."
+};
diff --git a/data/pixmaps/feta/12/scripts-thumb.xpm b/data/pixmaps/feta/12/scripts-thumb.xpm
new file mode 100644
index 0000000..28d405f
--- /dev/null
+++ b/data/pixmaps/feta/12/scripts-thumb.xpm
@@ -0,0 +1,28 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"11 17 5 1",
+" c #060606",
+". c #4b4b4b",
+"X c Gray52",
+"o c Gray72",
+"O c None",
+/* pixels */
+"OOOOOOOOOOO",
+"OOOOo.XoOOO",
+"OOO. .OO",
+"OOX .OO. XO",
+"OO XOOX O",
+"OX XOO. X",
+"OX OOOO X",
+"OX OOOO X",
+"OX XOOX X",
+"OO XOO. O",
+"OOX .OO. XO",
+"OOO. .OO",
+"OOOOo oOOO",
+"OOOOO OOOO",
+"OOOOO OOOO",
+"OOOOO OOOO",
+"OOOOOooOOOO"
+};
diff --git a/data/pixmaps/feta/12/scripts-trilelement.xpm b/data/pixmaps/feta/12/scripts-trilelement.xpm
new file mode 100644
index 0000000..b4ebe54
--- /dev/null
+++ b/data/pixmaps/feta/12/scripts-trilelement.xpm
@@ -0,0 +1,26 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"17 13 7 1",
+" c #020202",
+". c #4c4c4c",
+"X c #7c7c7c",
+"o c Gray52",
+"O c #b7b7b7",
+"+ c Gray76",
+"@ c None",
+/* pixels */
+"@@@@@@@@@@@@@@@@@",
+"@@@@@@oO@@@@@@@@@",
+"@@@@@X O@@@@@@@@",
+"@@@@O O@@@@@@@",
+"@@@@. O@@@@X+",
+"@@@X .@@. o",
+"@@O .O .@",
+"@@. O. O@",
+"@o .@@. X@@",
+"@OX@@@@O .@@@",
+"@@@@@@@@O O@@@",
+"@@@@@@@@@O X@@@@",
+"@@@@@@@@@@Oo@@@@@"
+};
diff --git a/data/pixmaps/feta/12/scripts-trill-element.xpm b/data/pixmaps/feta/12/scripts-trill-element.xpm
new file mode 100644
index 0000000..2476e7a
--- /dev/null
+++ b/data/pixmaps/feta/12/scripts-trill-element.xpm
@@ -0,0 +1,25 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"18 11 8 1",
+" c Gray2",
+". c Gray20",
+"X c Gray34",
+"o c Gray46",
+"O c #8d8d8d",
+"+ c Gray67",
+"@ c Gray83",
+"# c None",
+/* pixels */
+"##################",
+"######@o@#########",
+"#####@. @########",
+"#####X @#####X+",
+"####o X####+ @",
+"###O .+@X o#",
+"##@ X. o##",
+"#@ .@##+ o###",
+"#o #####@ ####",
+"##@######@ .@####",
+"##########@o@#####"
+};
diff --git a/data/pixmaps/feta/12/scripts-trill.xpm b/data/pixmaps/feta/12/scripts-trill.xpm
new file mode 100644
index 0000000..1065dfb
--- /dev/null
+++ b/data/pixmaps/feta/12/scripts-trill.xpm
@@ -0,0 +1,43 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"36 29 8 1",
+" c Gray1",
+". c Gray19",
+"X c Gray33",
+"o c Gray43",
+"O c #909090",
+"+ c #b1b1b1",
+"@ c #d2d2d2",
+"# c None",
+/* pixels */
+"####################################",
+"#################+##################",
+"##############+X o##################",
+"#############X +##################",
+"#############. +##################",
+"############@ .@##################",
+"############@ .###################",
+"############X X###################",
+"############X +###################",
+"############. +###################",
+"###########@ @###################",
+"###########O .####@@@#######@oo+##",
+"###########X .###@OO. o+#@. X#",
+"####+OOO@##X +#@OO###o XXoO O",
+"##@O+@@@OOO OOO@####+ .@##O O",
+"##O#######O +#######+ o###. #",
+"#@O#######+ .########. @###. X#",
+"#+@#######X .########. @###+oO@#",
+"#O@####@OO. OO@######. .#########",
+"#++@@+OO@@ +#O@####+ X#########",
+"##+OO+@##@ @##O@###+ o#########",
+"#########O .###++###o @#########",
+"#########X .###++###. @#########",
+"#########o .###O@###. .##########",
+"#########o @#@X###+ X##########",
+"#########O .O +###+ X##########",
+"#########@ o####o @##########",
+"##########O o#####. @##########",
+"###########@OO@#####################"
+};
diff --git a/data/pixmaps/feta/12/scripts-turn.xpm b/data/pixmaps/feta/12/scripts-turn.xpm
new file mode 100644
index 0000000..ef25205
--- /dev/null
+++ b/data/pixmaps/feta/12/scripts-turn.xpm
@@ -0,0 +1,28 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"27 14 8 1",
+" c #040404",
+". c Gray24",
+"X c #4b4b4b",
+"o c #7c7c7c",
+"O c #888888",
+"+ c #b7b7b7",
+"@ c #c1c1c1",
+"# c None",
+/* pixels */
+"###########################",
+"######OOO+##########OOO####",
+"####o .+######+ +##",
+"###X X##### +#",
+"##o X#### X#",
+"## o##@. X###X X#X +",
+"#O +#####+ +##OoO### O",
+"#O #######+ +####### O",
+"#O ###OoO##+ +#####+ O",
+"#+ X#X X###X .@##O #",
+"##X ####X o#",
+"##+ #####X X##",
+"###+ +######+. o###",
+"#####OOO##########+OOO#####"
+};
diff --git a/data/pixmaps/feta/12/scripts-ufermata.xpm b/data/pixmaps/feta/12/scripts-ufermata.xpm
new file mode 100644
index 0000000..ba2bc32
--- /dev/null
+++ b/data/pixmaps/feta/12/scripts-ufermata.xpm
@@ -0,0 +1,33 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"32 19 8 1",
+" c Gray1",
+". c Gray19",
+"X c #484848",
+"o c Gray44",
+"O c #8b8b8b",
+"+ c #b1b1b1",
+"@ c #d2d2d2",
+"# c None",
+/* pixels */
+"################################",
+"#############@OOOoO#############",
+"##########@o o@#########",
+"#########+ O########",
+"########. .#######",
+"#######. ... .######",
+"######. .o+@###@+o. .#####",
+"#####O .+###########+. O####",
+"####@ o@#############@o @###",
+"####o o#################o o###",
+"###@ O###################O @##",
+"###o .#####################. o##",
+"### @#########+++#########@ ##",
+"##O o#########o o#########o O#",
+"##X @########O O########@ X#",
+"## .#########O O#########. #",
+"#@ O#########+ +#########O @",
+"#O +##########X X##########+ O",
+"#@o############+o+############o@"
+};
diff --git a/data/pixmaps/feta/12/scripts-umarcato.xpm b/data/pixmaps/feta/12/scripts-umarcato.xpm
new file mode 100644
index 0000000..78fb0a5
--- /dev/null
+++ b/data/pixmaps/feta/12/scripts-umarcato.xpm
@@ -0,0 +1,28 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"13 14 8 1",
+" c Gray2",
+". c #323232",
+"X c #555555",
+"o c #6c6c6c",
+"O c #888888",
+"+ c Gray69",
+"@ c #d3d3d3",
+"# c None",
+/* pixels */
+"#############",
+"######++#####",
+"######..#####",
+"#####+ +####",
+"#####. .####",
+"####@ @###",
+"####o o###",
+"###@ + @##",
+"###XX#o X##",
+"### @#@ ##",
+"##O.###o O#",
+"## +###+ .#",
+"#o.#####. O",
+"#++#####@oOo@"
+};
diff --git a/data/pixmaps/feta/12/scripts-upbow.xpm b/data/pixmaps/feta/12/scripts-upbow.xpm
new file mode 100644
index 0000000..dccb6a3
--- /dev/null
+++ b/data/pixmaps/feta/12/scripts-upbow.xpm
@@ -0,0 +1,39 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"17 25 8 1",
+" c #040404",
+". c #2f2f2f",
+"X c #5b5b5b",
+"o c #797979",
+"O c Gray55",
+"+ c #afafaf",
+"@ c #d5d5d5",
+"# c None",
+/* pixels */
+"#################",
+"#@o############O@",
+"#O +##########+ O",
+"#@ o##########o @",
+"## ########## #",
+"##o @########@ O#",
+"##O O########O O#",
+"### .########. ##",
+"###X @######@ X##",
+"###O O######O O##",
+"#### .######. ###",
+"####X ###### X###",
+"####O O####+ O###",
+"####@ X####X @###",
+"#####. #### .####",
+"#####O O##O O####",
+"#####@ X##X @####",
+"######. ## .#####",
+"######O @@ o#####",
+"######+ OO +#####",
+"####### ######",
+"#######o o######",
+"#######+ +######",
+"######## #######",
+"########+O#######"
+};
diff --git a/data/pixmaps/feta/12/scripts-upedalheel.xpm b/data/pixmaps/feta/12/scripts-upedalheel.xpm
new file mode 100644
index 0000000..c0ff86f
--- /dev/null
+++ b/data/pixmaps/feta/12/scripts-upedalheel.xpm
@@ -0,0 +1,26 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"13 15 5 1",
+" c #020202",
+". c #888888",
+"X c #b4b4b4",
+"o c Gray78",
+"O c None",
+/* pixels */
+"OOOOOOOOOOOOO",
+"Oo.OOOOOOOO.o",
+"O. OOOOOOOO .",
+"O. OOOOOOOO .",
+"O. OOOOOOOO .",
+"O. OOOOOOOO .",
+"O. OOOOOOOO .",
+"O. OOOOOOOO .",
+"O. OOOOOOOO .",
+"O. OOOOOOOO .",
+"O. .OOOOOO. .",
+"OO XOOOOX O",
+"OOX .OO. XO",
+"OOOX XOO",
+"OOOOO....OOOO"
+};
diff --git a/data/pixmaps/feta/12/scripts-upedaltoe.xpm b/data/pixmaps/feta/12/scripts-upedaltoe.xpm
new file mode 100644
index 0000000..959bc7d
--- /dev/null
+++ b/data/pixmaps/feta/12/scripts-upedaltoe.xpm
@@ -0,0 +1,32 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"13 19 7 1",
+" c #040404",
+". c #434343",
+"X c #777777",
+"o c #888888",
+"O c Gray73",
+"+ c #c8c8c8",
+"@ c None",
+/* pixels */
+"@@@@@@@@@@@@@",
+"@@@@@@Oo@@@@@",
+"@@@@@@ @@@@@",
+"@@@@@O O@@@@",
+"@@@@@X X@@@@",
+"@@@@@ @@@@",
+"@@@@O oo O@@@",
+"@@@@o ++ o@@@",
+"@@@@. @@ .@@@",
+"@@@@ .@@. @@@",
+"@@@o o@@o o@@",
+"@@@. @@@@ .@@",
+"@@@ .@@@@. @@",
+"@@o o@@@@o o@",
+"@@X @@@@@@ X@",
+"@@ @@@@@@ @",
+"@+ X@@@@@@X +",
+"@o O@@@@@@O o",
+"@+o@@@@@@@@o+"
+};
diff --git a/data/pixmaps/feta/12/scripts-upmordent.xpm b/data/pixmaps/feta/12/scripts-upmordent.xpm
new file mode 100644
index 0000000..ba3d58f
--- /dev/null
+++ b/data/pixmaps/feta/12/scripts-upmordent.xpm
@@ -0,0 +1,36 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"40 22 8 1",
+" c Gray1",
+". c #2d2d2d",
+"X c #515151",
+"o c #6f6f6f",
+"O c #8e8e8e",
+"+ c #aaaaaa",
+"@ c #d3d3d3",
+"# c None",
+/* pixels */
+"########################################",
+"##########################++############",
+"########################## ############",
+"########o+########+o###### @o+#########",
+"#######o +######@ .##### .o +########",
+"######+ O#####. .#### O#######",
+"######. O###+ .@## O####X+",
+"#####o .#@ O# .##. O",
+"####+ .. X .O X#",
+"###@. @O .+. o .@#",
+"###o o##O O#@. #O O##",
+"##@ .####@. X####o ##@. X###",
+"##. O#####@. .@#####O o ###@. .@###",
+"#@ @######@. +#######O .# #####. +####",
+"#O #########@#########@## #####@@#####",
+"#O ######################..############",
+"#O #######################@############",
+"#@ @###################################",
+"##o o###################################",
+"### ###################################",
+"###+ O##################################",
+"####++##################################"
+};
diff --git a/data/pixmaps/feta/12/scripts-upprall.xpm b/data/pixmaps/feta/12/scripts-upprall.xpm
new file mode 100644
index 0000000..30dfe68
--- /dev/null
+++ b/data/pixmaps/feta/12/scripts-upprall.xpm
@@ -0,0 +1,34 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"40 20 8 1",
+" c Gray1",
+". c Gray18",
+"X c #505050",
+"o c Gray46",
+"O c Gray56",
+"+ c #acacac",
+"@ c Gray83",
+"# c None",
+/* pixels */
+"########################################",
+"########o+########+o#########o+#########",
+"#######o +####### X#######o +########",
+"######+ +#####X .#####+ +#######",
+"######. O###+ .@###. O####X+",
+"#####o .#@ O#o .##X O",
+"####+ .. X XO X#",
+"####. @o .+ oo @#",
+"###o o##o O#@. .##o O##",
+"##@ .####@. X####o @###@. X###",
+"##. O#####@. .@#####o o#####@. .@###",
+"#@ @######@. +#######O .#######@. +####",
+"#O ########@@#########@@########@@#####",
+"#O ####################################",
+"#O ####################################",
+"#@ @###################################",
+"##o O###################################",
+"##@ ###################################",
+"###+ O##################################",
+"####++##################################"
+};
diff --git a/data/pixmaps/feta/12/scripts-ustaccatissimo.xpm b/data/pixmaps/feta/12/scripts-ustaccatissimo.xpm
new file mode 100644
index 0000000..25aacf5
--- /dev/null
+++ b/data/pixmaps/feta/12/scripts-ustaccatissimo.xpm
@@ -0,0 +1,27 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"7 14 7 1",
+" c #040404",
+". c #393939",
+"X c #434343",
+"o c Gray49",
+"O c Gray53",
+"+ c #bcbcbc",
+"@ c None",
+/* pixels */
+"@@@@@@@",
+"@@+OO+@",
+"@+ +",
+"@O O",
+"@O O",
+"@@ @",
+"@@ @",
+"@@X X@",
+"@@o o@",
+"@@o O@",
+"@@@ @@",
+"@@@ @@",
+"@@@..@@",
+"@@@++@@"
+};
diff --git a/data/pixmaps/feta/12/unknown.xpm b/data/pixmaps/feta/12/unknown.xpm
new file mode 100644
index 0000000..8698b03
--- /dev/null
+++ b/data/pixmaps/feta/12/unknown.xpm
@@ -0,0 +1,16 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"6 8 2 1",
+"x c Gray0",
+" c None",
+/* pixels */
+" xxx ",
+" x ",
+" x ",
+" xx ",
+" x ",
+" ",
+" x ",
+" "
+};
diff --git a/data/pixmaps/feta/4/accidentals-(.xpm b/data/pixmaps/feta/4/accidentals-(.xpm
new file mode 100644
index 0000000..1ca2da5
--- /dev/null
+++ b/data/pixmaps/feta/4/accidentals-(.xpm
@@ -0,0 +1,20 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"4 10 4 1",
+" c #515151",
+". c Gray45",
+"X c #d2d2d2",
+"o c None",
+/* pixels */
+"oooo",
+"oooX",
+"oo.X",
+"oX o",
+"o..o",
+"o. o",
+"o..o",
+"oo o",
+"oo.X",
+"oooX"
+};
diff --git a/data/pixmaps/feta/4/accidentals-).xpm b/data/pixmaps/feta/4/accidentals-).xpm
new file mode 100644
index 0000000..ed42cbe
--- /dev/null
+++ b/data/pixmaps/feta/4/accidentals-).xpm
@@ -0,0 +1,20 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"4 10 4 1",
+" c #515151",
+". c Gray45",
+"X c #d2d2d2",
+"o c None",
+/* pixels */
+"oooo",
+"oXoo",
+"oX.o",
+"oo o",
+"oo..",
+"oo..",
+"oo..",
+"oo X",
+"oX.o",
+"oXoo"
+};
diff --git a/data/pixmaps/feta/4/accidentals--1.xpm b/data/pixmaps/feta/4/accidentals--1.xpm
new file mode 100644
index 0000000..75cbb6f
--- /dev/null
+++ b/data/pixmaps/feta/4/accidentals--1.xpm
@@ -0,0 +1,26 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"5 12 8 1",
+" c #0b0b0b",
+". c Gray23",
+"X c Gray30",
+"o c #686868",
+"O c #939393",
+"+ c #b1b1b1",
+"@ c #cbcbcb",
+"# c None",
+/* pixels */
+"#####",
+"#+@##",
+"#oO##",
+"#oO##",
+"#oO##",
+"#oO##",
+"#ooO#",
+"#oX o",
+"#O#Oo",
+"#@+X#",
+"##.@#",
+"#@@##"
+};
diff --git a/data/pixmaps/feta/4/accidentals--2.xpm b/data/pixmaps/feta/4/accidentals--2.xpm
new file mode 100644
index 0000000..244957e
--- /dev/null
+++ b/data/pixmaps/feta/4/accidentals--2.xpm
@@ -0,0 +1,25 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"8 12 7 1",
+" c Gray6",
+". c Gray31",
+"X c #717171",
+"o c #8b8b8b",
+"O c #b9b9b9",
+"+ c Gray81",
+"@ c None",
+/* pixels */
+"@@@@@@@@",
+"@+O@o@@@",
+"@XX@ @@@",
+"@XX@ @@@",
+"@XX@ @@@",
+"@XX@ @@@",
+"@X.X .X@",
+"@o.. X o",
+"@+O.oO.@",
+"@@.+.O@@",
+"@@O@O@@@"
+};
diff --git a/data/pixmaps/feta/4/accidentals-0.xpm b/data/pixmaps/feta/4/accidentals-0.xpm
new file mode 100644
index 0000000..8b2fe67
--- /dev/null
+++ b/data/pixmaps/feta/4/accidentals-0.xpm
@@ -0,0 +1,25 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"4 13 6 1",
+" c Gray0",
+". c Gray20",
+"X c Gray45",
+"o c Gray59",
+"O c Gray81",
+"+ c None",
+/* pixels */
+"++++",
+"+O++",
+"+o++",
+"+o++",
+"+X X",
+"+X.o",
+"+o+o",
+"+oOo",
+"+o.X",
+"+X X",
+"+++o",
+"+++o",
+"+++O"
+};
diff --git a/data/pixmaps/feta/4/accidentals-1.xpm b/data/pixmaps/feta/4/accidentals-1.xpm
new file mode 100644
index 0000000..72fee1e
--- /dev/null
+++ b/data/pixmaps/feta/4/accidentals-1.xpm
@@ -0,0 +1,26 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"6 14 6 1",
+" c Gray0",
+". c #323232",
+"X c Gray57",
+"o c #bbbbbb",
+"O c #cbcbcb",
+"+ c None",
+/* pixels */
+"++++++",
+"++++O+",
+"++XoX+",
+"++XoX+",
+"++XX X",
+"+O. .O",
+"+X XX+",
+"++XoX+",
+"++XX X",
+"+O. .O",
+"+X XX+",
+"++XoX+",
+"++XoX+",
+"++O+++"
+};
diff --git a/data/pixmaps/feta/4/accidentals-2.xpm b/data/pixmaps/feta/4/accidentals-2.xpm
new file mode 100644
index 0000000..68bc1c2
--- /dev/null
+++ b/data/pixmaps/feta/4/accidentals-2.xpm
@@ -0,0 +1,16 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"6 6 4 1",
+" c Gray3",
+". c Gray53",
+"X c #c5c5c5",
+"o c None",
+/* pixels */
+"oooooo",
+"oX.o.X",
+"o. .",
+"oo o",
+"o. .",
+"oX.o.X"
+};
diff --git a/data/pixmaps/feta/4/accordion-accBB.xpm b/data/pixmaps/feta/4/accordion-accBB.xpm
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/pixmaps/feta/4/accordion-accBB.xpm
diff --git a/data/pixmaps/feta/4/accordion-accBayanbase.xpm b/data/pixmaps/feta/4/accordion-accBayanbase.xpm
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/pixmaps/feta/4/accordion-accBayanbase.xpm
diff --git a/data/pixmaps/feta/4/accordion-accDiscant.xpm b/data/pixmaps/feta/4/accordion-accDiscant.xpm
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/pixmaps/feta/4/accordion-accDiscant.xpm
diff --git a/data/pixmaps/feta/4/accordion-accDot.xpm b/data/pixmaps/feta/4/accordion-accDot.xpm
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/pixmaps/feta/4/accordion-accDot.xpm
diff --git a/data/pixmaps/feta/4/accordion-accFreebase.xpm b/data/pixmaps/feta/4/accordion-accFreebase.xpm
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/pixmaps/feta/4/accordion-accFreebase.xpm
diff --git a/data/pixmaps/feta/4/accordion-accOldEE.xpm b/data/pixmaps/feta/4/accordion-accOldEE.xpm
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/pixmaps/feta/4/accordion-accOldEE.xpm
diff --git a/data/pixmaps/feta/4/accordion-accOldEES.xpm b/data/pixmaps/feta/4/accordion-accOldEES.xpm
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/pixmaps/feta/4/accordion-accOldEES.xpm
diff --git a/data/pixmaps/feta/4/accordion-accSB.xpm b/data/pixmaps/feta/4/accordion-accSB.xpm
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/pixmaps/feta/4/accordion-accSB.xpm
diff --git a/data/pixmaps/feta/4/accordion-accStdbase.xpm b/data/pixmaps/feta/4/accordion-accStdbase.xpm
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/pixmaps/feta/4/accordion-accStdbase.xpm
diff --git a/data/pixmaps/feta/4/clefs-C.xpm b/data/pixmaps/feta/4/clefs-C.xpm
new file mode 100644
index 0000000..46c5d20
--- /dev/null
+++ b/data/pixmaps/feta/4/clefs-C.xpm
@@ -0,0 +1,31 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"12 17 8 1",
+" c #040404",
+". c #2d2d2d",
+"X c #4e4e4e",
+"o c #6f6f6f",
+"O c Gray53",
+"+ c Gray68",
+"@ c #d0d0d0",
+"# c None",
+/* pixels */
+"############",
+"#######oo@##",
+"#O oX@XOX O#",
+"#o oXX ## @",
+"#O oXo X#. O",
+"#O oX+X##. o",
+"#O oX+.##. @",
+"#O oX. +O o#",
+"#O O Oo.+##",
+"#O o @@+###",
+"#O o. ....+#",
+"#O oXo.##. @",
+"#o oX+o##. O",
+"#O oX+ O#. O",
+"#O oXX O# @",
+"#O oXo.+X O#",
+"#@o++#+oo@##"
+};
diff --git a/data/pixmaps/feta/4/clefs-C_change.xpm b/data/pixmaps/feta/4/clefs-C_change.xpm
new file mode 100644
index 0000000..48c05b2
--- /dev/null
+++ b/data/pixmaps/feta/4/clefs-C_change.xpm
@@ -0,0 +1,28 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"10 14 8 1",
+" c #0b0b0b",
+". c Gray16",
+"X c Gray33",
+"o c #727272",
+"O c Gray58",
+"+ c #aeaeae",
+"@ c #cdcdcd",
+"# c None",
+/* pixels */
+"##########",
+"#####@XO##",
+"#o +X #+ O",
+"#o O@+#+ o",
+"#o O+o#+ O",
+"#o +X.@oX#",
+"#o o O+@##",
+"#o O.X+O@#",
+"#o +O.#O @",
+"#o O@+#+ o",
+"#o +O.#+ O",
+"#o Oo o .#",
+"#+O@#+oO##"
+};
diff --git a/data/pixmaps/feta/4/clefs-F.xpm b/data/pixmaps/feta/4/clefs-F.xpm
new file mode 100644
index 0000000..72ce308
--- /dev/null
+++ b/data/pixmaps/feta/4/clefs-F.xpm
@@ -0,0 +1,28 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"12 14 8 1",
+" c Gray1",
+". c #323232",
+"X c #4e4e4e",
+"o c #717171",
+"O c Gray57",
+"+ c Gray71",
+"@ c #cdcdcd",
+"# c None",
+/* pixels */
+"############",
+"####+Oo@####",
+"##@X@#o O#@#",
+"##Xo###X @ o",
+"#@ X##+ o+@",
+"## .##+ o##",
+"##o.O##+ oXO",
+"#######X +XO",
+"######@ X###",
+"######. @###",
+"#####. @####",
+"###@.X######",
+"##oX+#######",
+"#+O#########"
+};
diff --git a/data/pixmaps/feta/4/clefs-F_change.xpm b/data/pixmaps/feta/4/clefs-F_change.xpm
new file mode 100644
index 0000000..122d93b
--- /dev/null
+++ b/data/pixmaps/feta/4/clefs-F_change.xpm
@@ -0,0 +1,26 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"10 12 8 1",
+" c Gray2",
+". c #282828",
+"X c Gray28",
+"o c #6f6f6f",
+"O c Gray54",
+"+ c #b1b1b1",
+"@ c Gray82",
+"# c None",
+/* pixels */
+"##########",
+"###@OO@###",
+"##OO#@ O#@",
+"##.o##o.OO",
+"#@ +#+ @#",
+"## @#+ +@",
+"##@@##XX+O",
+"#####@ +##",
+"#####.o###",
+"####Xo####",
+"##+X+#####",
+"#@@#######"
+};
diff --git a/data/pixmaps/feta/4/clefs-G.xpm b/data/pixmaps/feta/4/clefs-G.xpm
new file mode 100644
index 0000000..b3e80b9
--- /dev/null
+++ b/data/pixmaps/feta/4/clefs-G.xpm
@@ -0,0 +1,45 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"12 31 8 1",
+" c Gray3",
+". c Gray17",
+"X c #4e4e4e",
+"o c #727272",
+"O c Gray55",
+"+ c Gray69",
+"@ c #d5d5d5",
+"# c None",
+/* pixels */
+"############",
+"#######O####",
+"######. +###",
+"#####o @##",
+"##### @Xo##",
+"####O X#o.##",
+"####o @#o ##",
+"####o @#o ##",
+"####O #@ ##",
+"#####.#o O##",
+"####@ X .###",
+"#####o @###",
+"####@. @####",
+"###@. #####",
+"###. o.@####",
+"##+ o# #####",
+"##. @+ .X+##",
+"#+ o+ o#",
+"#O @..XX@X @",
+"#O @ O#.##XO",
+"#@ @.X# @#oo",
+"##.X#.XX@#oO",
+"###.X+@oO+X#",
+"####O.. X@#",
+"######@O.###",
+"######## ###",
+"###o X##X###",
+"### ##O@##",
+"### .##O###",
+"###+ .+++###",
+"####@Oo+####"
+};
diff --git a/data/pixmaps/feta/4/clefs-G_change.xpm b/data/pixmaps/feta/4/clefs-G_change.xpm
new file mode 100644
index 0000000..64b5bca
--- /dev/null
+++ b/data/pixmaps/feta/4/clefs-G_change.xpm
@@ -0,0 +1,39 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"10 25 8 1",
+" c #0b0b0b",
+". c #2f2f2f",
+"X c #505050",
+"o c Gray46",
+"O c #8d8d8d",
+"+ c Gray69",
+"@ c #d3d3d3",
+"# c None",
+/* pixels */
+"##########",
+"######O###",
+"#####. o##",
+"####o O ##",
+"#### X# +#",
+"#### +# o#",
+"####.#+ o#",
+"####O@. @#",
+"####O. o##",
+"####o X###",
+"###O @###",
+"##@ .####",
+"##. #O+###",
+"#+ O#X X@#",
+"#O #o ...#",
+"#oo# @X@ O",
+"#@o#.+.#oo",
+"##O@#oXoXO",
+"###+O+X.+#",
+"####@@XX##",
+"######@.##",
+"##@ X#@O##",
+"##O #@O##",
+"##+ .+++##",
+"###+oo+###"
+};
diff --git a/data/pixmaps/feta/4/clefs-hufnagel_do.xpm b/data/pixmaps/feta/4/clefs-hufnagel_do.xpm
new file mode 100644
index 0000000..5e06827
--- /dev/null
+++ b/data/pixmaps/feta/4/clefs-hufnagel_do.xpm
@@ -0,0 +1,21 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"6 8 7 1",
+" c Gray0",
+". c Gray33",
+"X c Gray48",
+"o c #8d8d8d",
+"O c #aeaeae",
+"+ c #cacaca",
+"@ c None",
+/* pixels */
+"@@@@@@",
+"@@@+O@",
+"@@o O",
+"@O .O@",
+"@X +@@",
+"@X X@@",
+"@X X@@",
+"@@+@@@"
+};
diff --git a/data/pixmaps/feta/4/clefs-hufnagel_do_change.xpm b/data/pixmaps/feta/4/clefs-hufnagel_do_change.xpm
new file mode 100644
index 0000000..8e93a84
--- /dev/null
+++ b/data/pixmaps/feta/4/clefs-hufnagel_do_change.xpm
@@ -0,0 +1,19 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"5 6 7 1",
+" c Gray8",
+". c #252525",
+"X c #6f6f6f",
+"o c Gray61",
+"O c #b7b7b7",
+"+ c #d5d5d5",
+"@ c None",
+/* pixels */
+"@@@@@",
+"@@+o+",
+"@+. O",
+"@X.@@",
+"@X @@",
+"@OX@@"
+};
diff --git a/data/pixmaps/feta/4/clefs-hufnagel_do_fa.xpm b/data/pixmaps/feta/4/clefs-hufnagel_do_fa.xpm
new file mode 100644
index 0000000..894ab20
--- /dev/null
+++ b/data/pixmaps/feta/4/clefs-hufnagel_do_fa.xpm
@@ -0,0 +1,30 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"6 17 7 1",
+" c Gray1",
+". c #313131",
+"X c #767676",
+"o c #939393",
+"O c Gray70",
+"+ c #c8c8c8",
+"@ c None",
+/* pixels */
+"@@@@@@",
+"@@@+o@",
+"@@o O",
+"@o X+@",
+"@X O@@",
+"@X X@@",
+"@o o@@",
+"@@@@+@",
+"@@+ O",
+"@+ .X@",
+"@X O@@",
+"@X O",
+"@X .o@",
+"@X +@@",
+"@X O@@",
+"@X @@@",
+"@+@@@@"
+};
diff --git a/data/pixmaps/feta/4/clefs-hufnagel_do_fa_change.xpm b/data/pixmaps/feta/4/clefs-hufnagel_do_fa_change.xpm
new file mode 100644
index 0000000..af2e19e
--- /dev/null
+++ b/data/pixmaps/feta/4/clefs-hufnagel_do_fa_change.xpm
@@ -0,0 +1,29 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"5 16 7 1",
+" c Gray4",
+". c #252525",
+"X c Gray42",
+"o c #959595",
+"O c Gray70",
+"+ c #cbcbcb",
+"@ c None",
+/* pixels */
+"@@@@@",
+"@@@O@",
+"@@. O",
+"@X.@@",
+"@X.@@",
+"@X @@",
+"@@@@@",
+"@@@@@",
+"@@+o@",
+"@o O",
+"@X @@",
+"@X O",
+"@X.+@",
+"@X.@@",
+"@XX@@",
+"@+@@@"
+};
diff --git a/data/pixmaps/feta/4/clefs-hufnagel_fa.xpm b/data/pixmaps/feta/4/clefs-hufnagel_fa.xpm
new file mode 100644
index 0000000..ed9ba48
--- /dev/null
+++ b/data/pixmaps/feta/4/clefs-hufnagel_fa.xpm
@@ -0,0 +1,24 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"6 11 7 1",
+" c Gray0",
+". c #555555",
+"X c #727272",
+"o c Gray55",
+"O c Gray71",
+"+ c #cacaca",
+"@ c None",
+/* pixels */
+"@@@@@@",
+"@@@+O@",
+"@@o O",
+"@O XO@",
+"@X XO@",
+"@X O",
+"@X .+@",
+"@X +@@",
+"@X +@@",
+"@X.@@@",
+"@+@@@@"
+};
diff --git a/data/pixmaps/feta/4/clefs-hufnagel_fa_change.xpm b/data/pixmaps/feta/4/clefs-hufnagel_fa_change.xpm
new file mode 100644
index 0000000..0567326
--- /dev/null
+++ b/data/pixmaps/feta/4/clefs-hufnagel_fa_change.xpm
@@ -0,0 +1,21 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"5 9 6 1",
+" c #0c0c0c",
+". c #232323",
+"X c #6a6a6a",
+"o c #acacac",
+"O c #d0d0d0",
+"+ c None",
+/* pixels */
+"+++++",
+"++OXO",
+"+o .O",
+"+X O+",
+"+X o",
+"+X.++",
+"+X.++",
+"+XX++",
+"+O+++"
+};
diff --git a/data/pixmaps/feta/4/clefs-medicaea_do.xpm b/data/pixmaps/feta/4/clefs-medicaea_do.xpm
new file mode 100644
index 0000000..ed883f8
--- /dev/null
+++ b/data/pixmaps/feta/4/clefs-medicaea_do.xpm
@@ -0,0 +1,25 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"6 14 5 1",
+" c #010101",
+". c Gray56",
+"X c #bebebe",
+"o c #d0d0d0",
+"O c None",
+/* pixels */
+"OOOOOO",
+"OoOOOO",
+"O.oOOO",
+"O.oOOO",
+"O. .OO",
+"O. X",
+"O.o. .",
+"O.oOoo",
+"O. .OO",
+"O. o",
+"O.o. .",
+"O.oOoo",
+"O.oOOO",
+"OoOOOO"
+};
diff --git a/data/pixmaps/feta/4/clefs-medicaea_do_change.xpm b/data/pixmaps/feta/4/clefs-medicaea_do_change.xpm
new file mode 100644
index 0000000..361a614
--- /dev/null
+++ b/data/pixmaps/feta/4/clefs-medicaea_do_change.xpm
@@ -0,0 +1,24 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"6 12 6 1",
+" c #0e0e0e",
+". c #2f2f2f",
+"X c #929292",
+"o c #bcbcbc",
+"O c #d0d0d0",
+"+ c None",
+/* pixels */
+"++++++",
+"+O++++",
+"+XO+++",
+"+X O++",
+"+X .+",
+"+XOO.O",
+"+XO+++",
+"+X O++",
+"+X. .+",
+"+XOO.o",
+"+XO+++",
+"+O++++"
+};
diff --git a/data/pixmaps/feta/4/clefs-medicaea_fa.xpm b/data/pixmaps/feta/4/clefs-medicaea_fa.xpm
new file mode 100644
index 0000000..32d5472
--- /dev/null
+++ b/data/pixmaps/feta/4/clefs-medicaea_fa.xpm
@@ -0,0 +1,28 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"9 14 8 1",
+" c Gray2",
+". c #323232",
+"X c #565656",
+"o c Gray44",
+"O c Gray57",
+"+ c Gray68",
+"@ c #cecece",
+"# c None",
+/* pixels */
+"#########",
+"####@####",
+"###@O####",
+"###@O####",
+"#### .@##",
+"#+o# X#",
+"#O OO@. O",
+"#O oo##@@",
+"#O o. O##",
+"#@Xoo #",
+"###oO#O O",
+"##@oO####",
+"###oO####",
+"###+@####"
+};
diff --git a/data/pixmaps/feta/4/clefs-medicaea_fa_change.xpm b/data/pixmaps/feta/4/clefs-medicaea_fa_change.xpm
new file mode 100644
index 0000000..d74e951
--- /dev/null
+++ b/data/pixmaps/feta/4/clefs-medicaea_fa_change.xpm
@@ -0,0 +1,26 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"7 12 8 1",
+" c #0c0c0c",
+". c Gray16",
+"X c Gray30",
+"o c Gray45",
+"O c #8e8e8e",
+"+ c Gray68",
+"@ c Gray79",
+"# c None",
+/* pixels */
+"#######",
+"###@###",
+"###O###",
+"###oO##",
+"###X .@",
+"#o O###",
+"#o.XX##",
+"##Oo +",
+"##Oo#oO",
+"##Oo###",
+"##@@###"
+};
diff --git a/data/pixmaps/feta/4/clefs-mensural1_c.xpm b/data/pixmaps/feta/4/clefs-mensural1_c.xpm
new file mode 100644
index 0000000..0114ae9
--- /dev/null
+++ b/data/pixmaps/feta/4/clefs-mensural1_c.xpm
@@ -0,0 +1,30 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"11 17 7 1",
+" c #010101",
+". c #4c4c4c",
+"X c #6c6c6c",
+"o c #8e8e8e",
+"O c Gray65",
+"+ c #d3d3d3",
+"@ c None",
+/* pixels */
+"@@@@@@@@@@@",
+"@+O@@@@@@O+",
+"@OX@@@@@@XO",
+"@OX@@@@@@XO",
+"@OX@@@@@@XO",
+"@OX@@@@@@XO",
+"@OX@@@@@+XO",
+"@O. .O",
+"@O.oOooooXO",
+"@OXoooooo.O",
+"@O. .O",
+"@OX@@@@@@XO",
+"@OX@@@@@@XO",
+"@OX@@@@@@XO",
+"@OX@@@@@@XO",
+"@oX@@@@@@Xo",
+"@+O@@@@@@O+"
+};
diff --git a/data/pixmaps/feta/4/clefs-mensural1_c_change.xpm b/data/pixmaps/feta/4/clefs-mensural1_c_change.xpm
new file mode 100644
index 0000000..aaa19bf
--- /dev/null
+++ b/data/pixmaps/feta/4/clefs-mensural1_c_change.xpm
@@ -0,0 +1,27 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"9 14 7 1",
+" c #020202",
+". c #505050",
+"X c #6f6f6f",
+"o c #979797",
+"O c Gray65",
+"+ c #d2d2d2",
+"@ c None",
+/* pixels */
+"@@@@@@@@@",
+"@+@@@@@@+",
+"@o@@@@@@o",
+"@o@@@@@@o",
+"@o+@@@@@o",
+"@OXXoXX.O",
+"@O. .O",
+"@o+@@@@+o",
+"@O. .O",
+"@OXXXoXXO",
+"@o+@@@@+o",
+"@o@@@@@@o",
+"@o@@@@@@o",
+"@+@@@@@@+"
+};
diff --git a/data/pixmaps/feta/4/clefs-mensural1_f.xpm b/data/pixmaps/feta/4/clefs-mensural1_f.xpm
new file mode 100644
index 0000000..81bb270
--- /dev/null
+++ b/data/pixmaps/feta/4/clefs-mensural1_f.xpm
@@ -0,0 +1,37 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"10 23 8 1",
+" c Gray2",
+". c Gray20",
+"X c #4c4c4c",
+"o c Gray44",
+"O c #909090",
+"+ c #b1b1b1",
+"@ c #d7d7d7",
+"# c None",
+/* pixels */
+"##########",
+"#######O##",
+"######+ .#",
+"#O@#@OX+.O",
+"#O o.OX+",
+"#OO@OOO O#",
+"#OXoXOO .#",
+"#O o.@ +",
+"#+@#@O.oX#",
+"####@OO O#",
+"####@O#o##",
+"####@O#O##",
+"####@O#O##",
+"####@O#O##",
+"####@O#O##",
+"####@O@O##",
+"####@O#O##",
+"####@O#O##",
+"####@O#O##",
+"####@O#o##",
+"#####@@O##",
+"######@O##",
+"#######@##"
+};
diff --git a/data/pixmaps/feta/4/clefs-mensural1_f_change.xpm b/data/pixmaps/feta/4/clefs-mensural1_f_change.xpm
new file mode 100644
index 0000000..3295fe6
--- /dev/null
+++ b/data/pixmaps/feta/4/clefs-mensural1_f_change.xpm
@@ -0,0 +1,33 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"8 19 8 1",
+" c #070707",
+". c #2d2d2d",
+"X c #505050",
+"o c Gray45",
+"O c Gray56",
+"+ c #b4b4b4",
+"@ c #c5c5c5",
+"# c None",
+/* pixels */
+"########",
+"#####@O#",
+"#####o @",
+"#OXXOoX+",
+"#o o o#",
+"#O@+@o #",
+"#o +o O",
+"#O+Oo.X+",
+"###++.o#",
+"###++O@#",
+"###+@++#",
+"###+@+@#",
+"###+@+@#",
+"###+@+@#",
+"###+@+@#",
+"###+@++#",
+"###+@+@#",
+"#####+@#",
+"#####@@#"
+};
diff --git a/data/pixmaps/feta/4/clefs-mensural2_c.xpm b/data/pixmaps/feta/4/clefs-mensural2_c.xpm
new file mode 100644
index 0000000..53cd0e5
--- /dev/null
+++ b/data/pixmaps/feta/4/clefs-mensural2_c.xpm
@@ -0,0 +1,28 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"6 17 5 1",
+" c #484848",
+". c #646464",
+"X c #929292",
+"o c #d7d7d7",
+"O c None",
+/* pixels */
+"OOOOOO",
+"OoOOOo",
+"OXoOoX",
+"OXoOoX",
+"OXoOoX",
+"OX . X",
+"OX.X.X",
+"OX.X.X",
+"OX.X.X",
+"OX.X.X",
+"OX.X.X",
+"OX.X.X",
+"OX . X",
+"OXoOoX",
+"OXoOoX",
+"OXoOoX",
+"OoOOOo"
+};
diff --git a/data/pixmaps/feta/4/clefs-mensural2_c_change.xpm b/data/pixmaps/feta/4/clefs-mensural2_c_change.xpm
new file mode 100644
index 0000000..487ef17
--- /dev/null
+++ b/data/pixmaps/feta/4/clefs-mensural2_c_change.xpm
@@ -0,0 +1,20 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"4 9 5 1",
+" c Gray49",
+". c Gray53",
+"X c Gray73",
+"o c #cdcdcd",
+"O c None",
+/* pixels */
+"OOOO",
+"OX X",
+"Oooo",
+"Oooo",
+"OX.X",
+"OX.X",
+"Oooo",
+"Oooo",
+"OX X"
+};
diff --git a/data/pixmaps/feta/4/clefs-mensural2_f.xpm b/data/pixmaps/feta/4/clefs-mensural2_f.xpm
new file mode 100644
index 0000000..e6bad78
--- /dev/null
+++ b/data/pixmaps/feta/4/clefs-mensural2_f.xpm
@@ -0,0 +1,21 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"7 8 7 1",
+" c #0b0b0b",
+". c #4b4b4b",
+"X c Gray49",
+"o c #898989",
+"O c Gray70",
+"+ c Gray82",
+"@ c None",
+/* pixels */
+"@@@@@@@",
+"@+o@@@@",
+"@+ X+ +",
+"@@@ Oo+",
+"@@@.O@@",
+"@@@.oO@",
+"@+.o+ O",
+"@+O@@@@"
+};
diff --git a/data/pixmaps/feta/4/clefs-mensural2_f_change.xpm b/data/pixmaps/feta/4/clefs-mensural2_f_change.xpm
new file mode 100644
index 0000000..f07ea1a
--- /dev/null
+++ b/data/pixmaps/feta/4/clefs-mensural2_f_change.xpm
@@ -0,0 +1,21 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"7 8 7 1",
+" c Gray2",
+". c #2c2c2c",
+"X c Gray46",
+"o c #8d8d8d",
+"O c #b2b2b2",
+"+ c Gray78",
+"@ c None",
+/* pixels */
+"@@@@@@@",
+"@@X+@+@",
+"@+. O o",
+"@@@.X+@",
+"@@@XX@@",
+"@@@X@O@",
+"@@X+@ o",
+"@+O@@O@"
+};
diff --git a/data/pixmaps/feta/4/clefs-mensural3_c.xpm b/data/pixmaps/feta/4/clefs-mensural3_c.xpm
new file mode 100644
index 0000000..1478946
--- /dev/null
+++ b/data/pixmaps/feta/4/clefs-mensural3_c.xpm
@@ -0,0 +1,32 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"6 21 5 1",
+" c #484848",
+". c Gray39",
+"X c Gray57",
+"o c #d7d7d7",
+"O c None",
+/* pixels */
+"OOOOOO",
+"OoOOOo",
+"OXoOoX",
+"OXoOoX",
+"OXoOoX",
+"OX . X",
+"OX.X.X",
+"OX.X.X",
+"OX...X",
+"OX.X.X",
+"OX.X.X",
+"OX.X.X",
+"OX.X.X",
+"OX.X.X",
+"OX.X.X",
+"OX.X.X",
+"OX . X",
+"OXoOoX",
+"OXoOoX",
+"OXoOoX",
+"OoOOOo"
+};
diff --git a/data/pixmaps/feta/4/clefs-mensural3_c_change.xpm b/data/pixmaps/feta/4/clefs-mensural3_c_change.xpm
new file mode 100644
index 0000000..558ce4d
--- /dev/null
+++ b/data/pixmaps/feta/4/clefs-mensural3_c_change.xpm
@@ -0,0 +1,29 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"5 19 4 1",
+" c #747474",
+". c #909090",
+"X c #cacaca",
+"o c None",
+/* pixels */
+"ooooo",
+"oXooX",
+"o.oX.",
+"o.oo.",
+"o. .",
+"o.XX.",
+"o.XX.",
+"o....",
+"o....",
+"o.XX.",
+"o.XX.",
+"o....",
+"o....",
+"o.XX.",
+"o.XX.",
+"o. .",
+"o.Xo.",
+"o.oo.",
+"oXooX"
+};
diff --git a/data/pixmaps/feta/4/clefs-mensural_g.xpm b/data/pixmaps/feta/4/clefs-mensural_g.xpm
new file mode 100644
index 0000000..40133b4
--- /dev/null
+++ b/data/pixmaps/feta/4/clefs-mensural_g.xpm
@@ -0,0 +1,24 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"6 10 8 1",
+" c Gray10",
+". c #353535",
+"X c #4e4e4e",
+"o c Gray43",
+"O c Gray55",
+"+ c Gray68",
+"@ c Gray79",
+"# c None",
+/* pixels */
+"######",
+"###@O#",
+"###..#",
+"###O O",
+"##X .o",
+"#@OX.#",
+"#O#o O",
+"#O++Oo",
+"#@XXX@",
+"###OO#"
+};
diff --git a/data/pixmaps/feta/4/clefs-mensural_g_change.xpm b/data/pixmaps/feta/4/clefs-mensural_g_change.xpm
new file mode 100644
index 0000000..8474642
--- /dev/null
+++ b/data/pixmaps/feta/4/clefs-mensural_g_change.xpm
@@ -0,0 +1,23 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"5 9 8 1",
+" c Gray0",
+". c Gray20",
+"X c #434343",
+"o c #6f6f6f",
+"O c Gray54",
+"+ c Gray66",
+"@ c #cdcdcd",
+"# c None",
+/* pixels */
+"#####",
+"###@#",
+"###.@",
+"##+OO",
+"#@ O",
+"#OO +",
+"#++++",
+"#+..O",
+"##@o#"
+};
diff --git a/data/pixmaps/feta/4/clefs-percussion.xpm b/data/pixmaps/feta/4/clefs-percussion.xpm
new file mode 100644
index 0000000..312684d
--- /dev/null
+++ b/data/pixmaps/feta/4/clefs-percussion.xpm
@@ -0,0 +1,20 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"7 10 4 1",
+" c Gray0",
+". c #868686",
+"X c Gray78",
+"o c None",
+/* pixels */
+"ooooooo",
+"oX.oo.X",
+"o. oo .",
+"o. oo .",
+"o. oo .",
+"o. oo .",
+"o. oo .",
+"o. oo .",
+"o. oo .",
+"oX.oo.X"
+};
diff --git a/data/pixmaps/feta/4/clefs-percussion_change.xpm b/data/pixmaps/feta/4/clefs-percussion_change.xpm
new file mode 100644
index 0000000..7489678
--- /dev/null
+++ b/data/pixmaps/feta/4/clefs-percussion_change.xpm
@@ -0,0 +1,18 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"6 8 4 1",
+" c Gray0",
+". c #868686",
+"X c #c6c6c6",
+"o c None",
+/* pixels */
+"oooooo",
+"oX.o.X",
+"o. o .",
+"o. o .",
+"o. o .",
+"o. o .",
+"o. o .",
+"oX.o.X"
+};
diff --git a/data/pixmaps/feta/4/clefs-tab.xpm b/data/pixmaps/feta/4/clefs-tab.xpm
new file mode 100644
index 0000000..cd5e053
--- /dev/null
+++ b/data/pixmaps/feta/4/clefs-tab.xpm
@@ -0,0 +1,34 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"8 20 8 1",
+" c #111111",
+". c Gray17",
+"X c Gray31",
+"o c #717171",
+"O c Gray54",
+"+ c Gray70",
+"@ c #c3c3c3",
+"# c None",
+/* pixels */
+"########",
+"#@ooOoo@",
+"#+Xo XX+",
+"####.###",
+"#### ###",
+"#### ###",
+"####.###",
+"####o###",
+"###O O##",
+"### o ##",
+"##+.#.+#",
+"##X . .#",
+"#+ ### +",
+"#+O###++",
+"#O .. +#",
+"#oX##Xo#",
+"#O . .#",
+"#oo###.O",
+"#O.ooo +",
+"#@oooo+#"
+};
diff --git a/data/pixmaps/feta/4/clefs-tab_change.xpm b/data/pixmaps/feta/4/clefs-tab_change.xpm
new file mode 100644
index 0000000..4e92e50
--- /dev/null
+++ b/data/pixmaps/feta/4/clefs-tab_change.xpm
@@ -0,0 +1,31 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"7 17 8 1",
+" c Gray5",
+". c Gray20",
+"X c #494949",
+"o c Gray43",
+"O c #8b8b8b",
+"+ c #b1b1b1",
+"@ c #c3c3c3",
+"# c None",
+/* pixels */
+"#######",
+"#@oOoo@",
+"#+o..o+",
+"###oo##",
+"###oo##",
+"###oo##",
+"#######",
+"###..##",
+"##+XX+#",
+"##.XX.#",
+"#+.ooX+",
+"#######",
+"#O ..+#",
+"#O oXX#",
+"#O.OOX+",
+"#o.OO.+",
+"#@ooo+#"
+};
diff --git a/data/pixmaps/feta/4/clefs-vaticana_do.xpm b/data/pixmaps/feta/4/clefs-vaticana_do.xpm
new file mode 100644
index 0000000..b91a02d
--- /dev/null
+++ b/data/pixmaps/feta/4/clefs-vaticana_do.xpm
@@ -0,0 +1,20 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"4 8 6 1",
+" c Gray0",
+". c #777777",
+"X c #959595",
+"o c #aaaaaa",
+"O c #d0d0d0",
+"+ c None",
+/* pixels */
+"++++",
+"++.+",
+"+. o",
+"+. O",
+"+XO+",
+"+. O",
+"+. o",
+"++.+"
+};
diff --git a/data/pixmaps/feta/4/clefs-vaticana_do_change.xpm b/data/pixmaps/feta/4/clefs-vaticana_do_change.xpm
new file mode 100644
index 0000000..b91a02d
--- /dev/null
+++ b/data/pixmaps/feta/4/clefs-vaticana_do_change.xpm
@@ -0,0 +1,20 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"4 8 6 1",
+" c Gray0",
+". c #777777",
+"X c #959595",
+"o c #aaaaaa",
+"O c #d0d0d0",
+"+ c None",
+/* pixels */
+"++++",
+"++.+",
+"+. o",
+"+. O",
+"+XO+",
+"+. O",
+"+. o",
+"++.+"
+};
diff --git a/data/pixmaps/feta/4/clefs-vaticana_fa.xpm b/data/pixmaps/feta/4/clefs-vaticana_fa.xpm
new file mode 100644
index 0000000..98d38a7
--- /dev/null
+++ b/data/pixmaps/feta/4/clefs-vaticana_fa.xpm
@@ -0,0 +1,24 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"6 11 7 1",
+" c Gray5",
+". c #4c4c4c",
+"X c #727272",
+"o c #8b8b8b",
+"O c Gray74",
+"+ c #cdcdcd",
+"@ c None",
+/* pixels */
+"@@@@@@",
+"@@@Oo@",
+"@@@ O",
+"@+X @",
+"@o X@@",
+"@+X @",
+"@@@ O",
+"@@+.o@",
+"@@+o@@",
+"@@@o@@",
+"@@@+@@"
+};
diff --git a/data/pixmaps/feta/4/clefs-vaticana_fa_change.xpm b/data/pixmaps/feta/4/clefs-vaticana_fa_change.xpm
new file mode 100644
index 0000000..98d38a7
--- /dev/null
+++ b/data/pixmaps/feta/4/clefs-vaticana_fa_change.xpm
@@ -0,0 +1,24 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"6 11 7 1",
+" c Gray5",
+". c #4c4c4c",
+"X c #727272",
+"o c #8b8b8b",
+"O c Gray74",
+"+ c #cdcdcd",
+"@ c None",
+/* pixels */
+"@@@@@@",
+"@@@Oo@",
+"@@@ O",
+"@+X @",
+"@o X@@",
+"@+X @",
+"@@@ O",
+"@@+.o@",
+"@@+o@@",
+"@@@o@@",
+"@@@+@@"
+};
diff --git a/data/pixmaps/feta/4/custodes-hufnagel.xpm b/data/pixmaps/feta/4/custodes-hufnagel.xpm
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/pixmaps/feta/4/custodes-hufnagel.xpm
diff --git a/data/pixmaps/feta/4/custodes-medicaea.xpm b/data/pixmaps/feta/4/custodes-medicaea.xpm
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/pixmaps/feta/4/custodes-medicaea.xpm
diff --git a/data/pixmaps/feta/4/custodes-mensural.xpm b/data/pixmaps/feta/4/custodes-mensural.xpm
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/pixmaps/feta/4/custodes-mensural.xpm
diff --git a/data/pixmaps/feta/4/custodes-rhufnagel.xpm b/data/pixmaps/feta/4/custodes-rhufnagel.xpm
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/pixmaps/feta/4/custodes-rhufnagel.xpm
diff --git a/data/pixmaps/feta/4/custodes-rmedicaea.xpm b/data/pixmaps/feta/4/custodes-rmedicaea.xpm
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/pixmaps/feta/4/custodes-rmedicaea.xpm
diff --git a/data/pixmaps/feta/4/custodes-rmensural.xpm b/data/pixmaps/feta/4/custodes-rmensural.xpm
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/pixmaps/feta/4/custodes-rmensural.xpm
diff --git a/data/pixmaps/feta/4/custodes-rvaticana.xpm b/data/pixmaps/feta/4/custodes-rvaticana.xpm
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/pixmaps/feta/4/custodes-rvaticana.xpm
diff --git a/data/pixmaps/feta/4/custodes-vaticana.xpm b/data/pixmaps/feta/4/custodes-vaticana.xpm
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/pixmaps/feta/4/custodes-vaticana.xpm
diff --git a/data/pixmaps/feta/4/dots-dot.xpm b/data/pixmaps/feta/4/dots-dot.xpm
new file mode 100644
index 0000000..f2e038d
--- /dev/null
+++ b/data/pixmaps/feta/4/dots-dot.xpm
@@ -0,0 +1,12 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"3 3 3 1",
+" c #8d8d8d",
+". c #b4b4b4",
+"X c None",
+/* pixels */
+"XXX",
+"X. ",
+"X "
+};
diff --git a/data/pixmaps/feta/4/dots-evenrepeatcolon.xpm b/data/pixmaps/feta/4/dots-evenrepeatcolon.xpm
new file mode 100644
index 0000000..017db61
--- /dev/null
+++ b/data/pixmaps/feta/4/dots-evenrepeatcolon.xpm
@@ -0,0 +1,20 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"3 11 3 1",
+" c #535353",
+". c Gray68",
+"X c None",
+/* pixels */
+"XXX",
+"X..",
+"X ",
+"XXX",
+"XXX",
+"XXX",
+"XXX",
+"XXX",
+"XXX",
+"X ",
+"X.."
+};
diff --git a/data/pixmaps/feta/4/dots-repeatcolon.xpm b/data/pixmaps/feta/4/dots-repeatcolon.xpm
new file mode 100644
index 0000000..9f6d897
--- /dev/null
+++ b/data/pixmaps/feta/4/dots-repeatcolon.xpm
@@ -0,0 +1,17 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"3 7 4 1",
+" c #565656",
+". c Gray49",
+"X c #aaaaaa",
+"o c None",
+/* pixels */
+"ooo",
+"oXX",
+"o. ",
+"ooo",
+"ooo",
+"o. ",
+"oXX"
+};
diff --git a/data/pixmaps/feta/4/flags-d3.xpm b/data/pixmaps/feta/4/flags-d3.xpm
new file mode 100644
index 0000000..40d9f94
--- /dev/null
+++ b/data/pixmaps/feta/4/flags-d3.xpm
@@ -0,0 +1,26 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"6 13 7 1",
+" c Gray3",
+". c #535353",
+"X c Gray42",
+"o c Gray57",
+"O c Gray72",
+"+ c Gray80",
+"@ c None",
+/* pixels */
+"@@@@@@",
+"@@@@+@",
+"@@@@o+",
+"@@@@+O",
+"@+@@@o",
+"@o@@OX",
+"@o@@.+",
+"@o+.o@",
+"@o X@@",
+"@X.@@@",
+"@X+@@@",
+"@o@@@@",
+"@+@@@@"
+};
diff --git a/data/pixmaps/feta/4/flags-d4.xpm b/data/pixmaps/feta/4/flags-d4.xpm
new file mode 100644
index 0000000..b86d5af
--- /dev/null
+++ b/data/pixmaps/feta/4/flags-d4.xpm
@@ -0,0 +1,26 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"6 13 7 1",
+" c Gray7",
+". c Gray36",
+"X c Gray44",
+"o c #939393",
+"O c #acacac",
+"+ c #d5d5d5",
+"@ c None",
+/* pixels */
+"@@@@@@",
+"@@@@+O",
+"@@@@+o",
+"@@@@+O",
+"@@@@ +",
+"@oo..+",
+"@X @O+",
+"@o+@o@",
+"@OOX@@",
+"@X O@@",
+"@XO@@@",
+"@o@@@@",
+"@+@@@@"
+};
diff --git a/data/pixmaps/feta/4/flags-d5.xpm b/data/pixmaps/feta/4/flags-d5.xpm
new file mode 100644
index 0000000..8130407
--- /dev/null
+++ b/data/pixmaps/feta/4/flags-d5.xpm
@@ -0,0 +1,31 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"6 17 8 1",
+" c Gray2",
+". c Gray20",
+"X c #555555",
+"o c Gray46",
+"O c Gray58",
+"+ c Gray69",
+"@ c #d3d3d3",
+"# c None",
+/* pixels */
+"######",
+"####@+",
+"####@O",
+"####@O",
+"####X@",
+"##@X.@",
+"#+ ++@",
+"#o+#O#",
+"#O#oX#",
+"#O O+@",
+"#XX#O@",
+"#O#@O#",
+"#OO.@#",
+"#o @##",
+"#o+###",
+"#O####",
+"#@####"
+};
diff --git a/data/pixmaps/feta/4/flags-d6.xpm b/data/pixmaps/feta/4/flags-d6.xpm
new file mode 100644
index 0000000..391a598
--- /dev/null
+++ b/data/pixmaps/feta/4/flags-d6.xpm
@@ -0,0 +1,33 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"6 19 8 1",
+" c Gray1",
+". c Gray19",
+"X c Gray32",
+"o c #727272",
+"O c Gray56",
+"+ c #b2b2b2",
+"@ c Gray83",
+"# c None",
+/* pixels */
+"######",
+"####@+",
+"####@O",
+"####Oo",
+"##@o.@",
+"#o O+@",
+"#O+#X@",
+"##@OO@",
+"#+ @+@",
+"#o+#o#",
+"#O#Oo#",
+"#OX+O#",
+"#oX@@#",
+"#O#O##",
+"#OX@##",
+"#oX###",
+"#O@###",
+"#O####",
+"#@####"
+};
diff --git a/data/pixmaps/feta/4/flags-dgrace.xpm b/data/pixmaps/feta/4/flags-dgrace.xpm
new file mode 100644
index 0000000..7761b3d
--- /dev/null
+++ b/data/pixmaps/feta/4/flags-dgrace.xpm
@@ -0,0 +1,18 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"10 6 6 1",
+" c Gray37",
+". c #686868",
+"X c Gray54",
+"o c #aeaeae",
+"O c #cacaca",
+"+ c None",
+/* pixels */
+"++++++++++",
+"+Oo+++++++",
+"++OXoO++++",
+"++++O .O++",
+"++++++O. O",
+"++++++++Oo"
+};
diff --git a/data/pixmaps/feta/4/flags-dstem.xpm b/data/pixmaps/feta/4/flags-dstem.xpm
new file mode 100644
index 0000000..17fd0cc
--- /dev/null
+++ b/data/pixmaps/feta/4/flags-dstem.xpm
@@ -0,0 +1,24 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"2 15 3 1",
+" c #a7a7a7",
+". c Gray84",
+"X c None",
+/* pixels */
+"XX",
+"X.",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X."
+};
diff --git a/data/pixmaps/feta/4/flags-stem.xpm b/data/pixmaps/feta/4/flags-stem.xpm
new file mode 100644
index 0000000..17fd0cc
--- /dev/null
+++ b/data/pixmaps/feta/4/flags-stem.xpm
@@ -0,0 +1,24 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"2 15 3 1",
+" c #a7a7a7",
+". c Gray84",
+"X c None",
+/* pixels */
+"XX",
+"X.",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X."
+};
diff --git a/data/pixmaps/feta/4/flags-u3.xpm b/data/pixmaps/feta/4/flags-u3.xpm
new file mode 100644
index 0000000..50a2771
--- /dev/null
+++ b/data/pixmaps/feta/4/flags-u3.xpm
@@ -0,0 +1,25 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"6 13 6 1",
+" c #0e0e0e",
+". c Gray47",
+"X c #909090",
+"o c #b1b1b1",
+"O c Gray82",
+"+ c None",
+/* pixels */
+"++++++",
+"+O++++",
+"+XO+++",
+"+XO+++",
+"+. +++",
+"+X .++",
+"+X+.X+",
+"+XO+.+",
+"+XO+Oo",
+"++++OX",
+"++++oo",
+"++++XO",
+"++++O+"
+};
diff --git a/data/pixmaps/feta/4/flags-u4.xpm b/data/pixmaps/feta/4/flags-u4.xpm
new file mode 100644
index 0000000..6fd09bb
--- /dev/null
+++ b/data/pixmaps/feta/4/flags-u4.xpm
@@ -0,0 +1,29 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"6 15 8 1",
+" c Gray3",
+". c Gray21",
+"X c Gray27",
+"o c Gray49",
+"O c Gray57",
+"+ c #a4a4a4",
+"@ c #d3d3d3",
+"# c None",
+/* pixels */
+"######",
+"#@####",
+"#O@###",
+"#OO###",
+"#O ###",
+"#Oo.@#",
+"#O@@.#",
+"#O #OO",
+"#OOX++",
+"#@#@.@",
+"####+@",
+"####@O",
+"####@O",
+"####O@",
+"####@#"
+};
diff --git a/data/pixmaps/feta/4/flags-u5.xpm b/data/pixmaps/feta/4/flags-u5.xpm
new file mode 100644
index 0000000..abc63d7
--- /dev/null
+++ b/data/pixmaps/feta/4/flags-u5.xpm
@@ -0,0 +1,32 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"6 18 8 1",
+" c #131313",
+". c #373737",
+"X c Gray30",
+"o c Gray44",
+"O c #8e8e8e",
+"+ c Gray65",
+"@ c Gray83",
+"# c None",
+/* pixels */
+"######",
+"#@####",
+"#O@###",
+"#O@###",
+"#O ###",
+"#+.o##",
+"#O@oO#",
+"#O @X#",
+"#+XXo@",
+"#O@@ #",
+"#oX#++",
+"#@.o@O",
+"###O #",
+"####O@",
+"####@+",
+"####@O",
+"####O@",
+"####@#"
+};
diff --git a/data/pixmaps/feta/4/flags-u6.xpm b/data/pixmaps/feta/4/flags-u6.xpm
new file mode 100644
index 0000000..32fbcce
--- /dev/null
+++ b/data/pixmaps/feta/4/flags-u6.xpm
@@ -0,0 +1,36 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"6 22 8 1",
+" c #0e0e0e",
+". c #323232",
+"X c Gray31",
+"o c #767676",
+"O c #939393",
+"+ c #afafaf",
+"@ c Gray84",
+"# c None",
+/* pixels */
+"######",
+"#@####",
+"#O@###",
+"#O@###",
+"#O.###",
+"#O o##",
+"#O@X+#",
+"#o.#X#",
+"#O XO@",
+"#O@X.#",
+"#OO#X@",
+"#@ +@O",
+"##+.OO",
+"#O@#X@",
+"#o.#+O",
+"##oX@O",
+"###+ #",
+"####++",
+"####@O",
+"####@O",
+"####O@",
+"####@#"
+};
diff --git a/data/pixmaps/feta/4/flags-ugrace.xpm b/data/pixmaps/feta/4/flags-ugrace.xpm
new file mode 100644
index 0000000..86624ff
--- /dev/null
+++ b/data/pixmaps/feta/4/flags-ugrace.xpm
@@ -0,0 +1,18 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"9 6 6 1",
+" c Gray34",
+". c Gray41",
+"X c Gray57",
+"o c #bbbbbb",
+"O c #cdcdcd",
+"+ c None",
+/* pixels */
+"+++++++++",
+"+++++++Oo",
+"+++++O. O",
+"++++X O++",
+"++X X++++",
+"+oX++++++"
+};
diff --git a/data/pixmaps/feta/4/noteheads--1.xpm b/data/pixmaps/feta/4/noteheads--1.xpm
new file mode 100644
index 0000000..4c9de15
--- /dev/null
+++ b/data/pixmaps/feta/4/noteheads--1.xpm
@@ -0,0 +1,18 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"11 6 6 1",
+" c #070707",
+". c Gray19",
+"X c #797979",
+"o c #8d8d8d",
+"O c #cecece",
+"+ c None",
+/* pixels */
+"+++++++++++",
+"++OOXooo++O",
+"+o o+o .o",
+"+o +++o o",
+"+o .O+. .o",
+"++OOXooo+OO"
+};
diff --git a/data/pixmaps/feta/4/noteheads--1mensural.xpm b/data/pixmaps/feta/4/noteheads--1mensural.xpm
new file mode 100644
index 0000000..8edf37e
--- /dev/null
+++ b/data/pixmaps/feta/4/noteheads--1mensural.xpm
@@ -0,0 +1,20 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"10 8 6 1",
+" c #010101",
+". c #5a5a5a",
+"X c #7b7b7b",
+"o c Gray56",
+"O c #cdcdcd",
+"+ c None",
+/* pixels */
+"++++++++++",
+"+O+++++++O",
+"+o.oXXXX.o",
+"+o o",
+"+oO+++++Oo",
+"+o o",
+"+o.XXXXX.o",
+"+O+++++++O"
+};
diff --git a/data/pixmaps/feta/4/noteheads--2mensural.xpm b/data/pixmaps/feta/4/noteheads--2mensural.xpm
new file mode 100644
index 0000000..4fdd7df
--- /dev/null
+++ b/data/pixmaps/feta/4/noteheads--2mensural.xpm
@@ -0,0 +1,25 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"10 12 7 1",
+" c #010101",
+". c #5a5a5a",
+"X c Gray47",
+"o c Gray55",
+"O c #a9a9a9",
+"+ c #cdcdcd",
+"@ c None",
+/* pixels */
+"@@@@@@@@@@",
+"@+@@@@@@@+",
+"@o.oXXXX.o",
+"@o o",
+"@o+@@@@@+o",
+"@o o",
+"@o.oXXXX.o",
+"@+@@@@@@oO",
+"@@@@@@@@Xo",
+"@@@@@@@@XX",
+"@@@@@@@@+o",
+"@@@@@@@@@+"
+};
diff --git a/data/pixmaps/feta/4/noteheads--3mensural.xpm b/data/pixmaps/feta/4/noteheads--3mensural.xpm
new file mode 100644
index 0000000..d2c498f
--- /dev/null
+++ b/data/pixmaps/feta/4/noteheads--3mensural.xpm
@@ -0,0 +1,24 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"12 12 6 1",
+" c #010101",
+". c #5b5b5b",
+"X c Gray48",
+"o c Gray56",
+"O c #d2d2d2",
+"+ c None",
+/* pixels */
+"++++++++++++",
+"+O+++++++++O",
+"+o.oXXXXXX.o",
+"+o o",
+"+oO+++O+++Oo",
+"+o o",
+"+o.oXXXXoo.o",
+"+O++++++++Oo",
+"++++++++++Oo",
+"++++++++++Oo",
+"+++++++++++o",
+"+++++++++++O"
+};
diff --git a/data/pixmaps/feta/4/noteheads-0.xpm b/data/pixmaps/feta/4/noteheads-0.xpm
new file mode 100644
index 0000000..6c3316b
--- /dev/null
+++ b/data/pixmaps/feta/4/noteheads-0.xpm
@@ -0,0 +1,17 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"9 6 5 1",
+" c #040404",
+". c Gray36",
+"X c Gray53",
+"o c #b6b6b6",
+"O c None",
+/* pixels */
+"OOOOOOOOO",
+"OOO.XXXOO",
+"Oo .Oo o",
+"OX oOOo X",
+"Oo oO. o",
+"OOOXXX.OO"
+};
diff --git a/data/pixmaps/feta/4/noteheads-0cross.xpm b/data/pixmaps/feta/4/noteheads-0cross.xpm
new file mode 100644
index 0000000..5c46508
--- /dev/null
+++ b/data/pixmaps/feta/4/noteheads-0cross.xpm
@@ -0,0 +1,17 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"8 7 4 1",
+" c #9a9a9a",
+". c #b4b4b4",
+"X c #cacaca",
+"o c None",
+/* pixels */
+"oooooooo",
+"oo.XoX.o",
+"o. . . .",
+"oo XXX o",
+"oo XXX o",
+"o. . . .",
+"oo.XoX.o"
+};
diff --git a/data/pixmaps/feta/4/noteheads-0diamond.xpm b/data/pixmaps/feta/4/noteheads-0diamond.xpm
new file mode 100644
index 0000000..c85d317
--- /dev/null
+++ b/data/pixmaps/feta/4/noteheads-0diamond.xpm
@@ -0,0 +1,19 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"9 6 7 1",
+" c #090909",
+". c #252525",
+"X c Gray30",
+"o c #929292",
+"O c Gray70",
+"+ c #c6c6c6",
+"@ c None",
+/* pixels */
+"@@@@@@@@@",
+"@@@@oo@@@",
+"@@O.X..O@",
+"@o +O o",
+"@@O. X.O@",
+"@@@@oo@@@"
+};
diff --git a/data/pixmaps/feta/4/noteheads-0mensural.xpm b/data/pixmaps/feta/4/noteheads-0mensural.xpm
new file mode 100644
index 0000000..71f903e
--- /dev/null
+++ b/data/pixmaps/feta/4/noteheads-0mensural.xpm
@@ -0,0 +1,18 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"5 6 6 1",
+" c Gray10",
+". c #3c3c3c",
+"X c Gray31",
+"o c Gray43",
+"O c #cecece",
+"+ c None",
+/* pixels */
+"+++++",
+"++OO+",
+"++o +",
+"+oOoo",
+"++.X+",
+"++OO+"
+};
diff --git a/data/pixmaps/feta/4/noteheads-0slash.xpm b/data/pixmaps/feta/4/noteheads-0slash.xpm
new file mode 100644
index 0000000..171b23e
--- /dev/null
+++ b/data/pixmaps/feta/4/noteheads-0slash.xpm
@@ -0,0 +1,23 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"13 10 7 1",
+" c #090909",
+". c #323232",
+"X c #727272",
+"o c #838383",
+"O c #b7b7b7",
+"+ c #cdcdcd",
+"@ c None",
+/* pixels */
+"@@@@@@@@@@@@@",
+"@@@@@@oXXXoo+",
+"@@@@@X.XXX. @",
+"@@@@O O@@@ O@",
+"@@@@..@@@X.@@",
+"@@@O O@@O O@@",
+"@@@.X@@@..@@@",
+"@@O.@@@O O@@@",
+"@@ .XXX.X@@@@",
+"@+XXXXXo@@@@@"
+};
diff --git a/data/pixmaps/feta/4/noteheads-0triangle.xpm b/data/pixmaps/feta/4/noteheads-0triangle.xpm
new file mode 100644
index 0000000..e40a3c1
--- /dev/null
+++ b/data/pixmaps/feta/4/noteheads-0triangle.xpm
@@ -0,0 +1,18 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"6 6 6 1",
+" c #5b5b5b",
+". c #727272",
+"X c Gray53",
+"o c Gray67",
+"O c #d5d5d5",
+"+ c None",
+/* pixels */
+"++++++",
+"+++o++",
+"++O O+",
+"++XO.+",
+"+o.+.o",
+"+o.oXo"
+};
diff --git a/data/pixmaps/feta/4/noteheads-1.xpm b/data/pixmaps/feta/4/noteheads-1.xpm
new file mode 100644
index 0000000..5f7225c
--- /dev/null
+++ b/data/pixmaps/feta/4/noteheads-1.xpm
@@ -0,0 +1,19 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"7 6 7 1",
+" c Gray0",
+". c Gray26",
+"X c #7b7b7b",
+"o c Gray59",
+"O c #b2b2b2",
+"+ c Gray80",
+"@ c None",
+/* pixels */
+"@@@@@@@",
+"@@@OXo@",
+"@@. O+o",
+"@O.@@.O",
+"@o+O .@",
+"@@oXO@@"
+};
diff --git a/data/pixmaps/feta/4/noteheads-1cross.xpm b/data/pixmaps/feta/4/noteheads-1cross.xpm
new file mode 100644
index 0000000..686889e
--- /dev/null
+++ b/data/pixmaps/feta/4/noteheads-1cross.xpm
@@ -0,0 +1,17 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"8 6 5 1",
+" c Gray42",
+". c #8e8e8e",
+"X c #b7b7b7",
+"o c Gray81",
+"O c None",
+/* pixels */
+"OOOOOOOO",
+"OOooOooO",
+"OX ... X",
+"OO .O. O",
+"OX ... X",
+"OOooOoXO"
+};
diff --git a/data/pixmaps/feta/4/noteheads-1diamond.xpm b/data/pixmaps/feta/4/noteheads-1diamond.xpm
new file mode 100644
index 0000000..652b51c
--- /dev/null
+++ b/data/pixmaps/feta/4/noteheads-1diamond.xpm
@@ -0,0 +1,19 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"7 6 7 1",
+" c Gray0",
+". c #323232",
+"X c Gray33",
+"o c #8d8d8d",
+"O c #b7b7b7",
+"+ c #dddddd",
+"@ c None",
+/* pixels */
+"@@@@@@@",
+"@@@@@XO",
+"@@X oXo",
+"@+.++.+",
+"@o.o X@",
+"@Oo@@@@"
+};
diff --git a/data/pixmaps/feta/4/noteheads-1mensural.xpm b/data/pixmaps/feta/4/noteheads-1mensural.xpm
new file mode 100644
index 0000000..71f903e
--- /dev/null
+++ b/data/pixmaps/feta/4/noteheads-1mensural.xpm
@@ -0,0 +1,18 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"5 6 6 1",
+" c Gray10",
+". c #3c3c3c",
+"X c Gray31",
+"o c Gray43",
+"O c #cecece",
+"+ c None",
+/* pixels */
+"+++++",
+"++OO+",
+"++o +",
+"+oOoo",
+"++.X+",
+"++OO+"
+};
diff --git a/data/pixmaps/feta/4/noteheads-1slash.xpm b/data/pixmaps/feta/4/noteheads-1slash.xpm
new file mode 100644
index 0000000..c376740
--- /dev/null
+++ b/data/pixmaps/feta/4/noteheads-1slash.xpm
@@ -0,0 +1,23 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"11 10 7 1",
+" c #0e0e0e",
+". c Gray20",
+"X c Gray27",
+"o c Gray46",
+"O c #8e8e8e",
+"+ c Gray84",
+"@ c None",
+/* pixels */
+"@@@@@@@@@@@",
+"@@@@@+oooO+",
+"@@@@@XXo. +",
+"@@@@O @@.O@",
+"@@@@ o@O.@@",
+"@@@O +@ O@@",
+"@@@.O@o @@@",
+"@@O.@@ O@@@",
+"@+ .o.X@@@@",
+"@+Oooo+@@@@"
+};
diff --git a/data/pixmaps/feta/4/noteheads-1triangle.xpm b/data/pixmaps/feta/4/noteheads-1triangle.xpm
new file mode 100644
index 0000000..7307fac
--- /dev/null
+++ b/data/pixmaps/feta/4/noteheads-1triangle.xpm
@@ -0,0 +1,15 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"6 5 4 1",
+" c #646464",
+". c #8b8b8b",
+"X c Gray80",
+"o c None",
+/* pixels */
+"oooooo",
+"ooo.oo",
+"ooX Xo",
+"oX o X",
+"oX...X"
+};
diff --git a/data/pixmaps/feta/4/noteheads-2.xpm b/data/pixmaps/feta/4/noteheads-2.xpm
new file mode 100644
index 0000000..3369561
--- /dev/null
+++ b/data/pixmaps/feta/4/noteheads-2.xpm
@@ -0,0 +1,18 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"7 6 6 1",
+" c Gray1",
+". c Gray27",
+"X c Gray50",
+"o c #8d8d8d",
+"O c Gray74",
+"+ c None",
+/* pixels */
+"+++++++",
+"+++Ooo+",
+"++. o",
+"+o o",
+"+o .+",
+"++oXO++"
+};
diff --git a/data/pixmaps/feta/4/noteheads-2cross.xpm b/data/pixmaps/feta/4/noteheads-2cross.xpm
new file mode 100644
index 0000000..da01332
--- /dev/null
+++ b/data/pixmaps/feta/4/noteheads-2cross.xpm
@@ -0,0 +1,16 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"7 6 4 1",
+" c Gray32",
+". c #bcbcbc",
+"X c Gray84",
+"o c None",
+/* pixels */
+"ooooooo",
+"oXXooXX",
+"oo .. o",
+"ooo oo",
+"oo .. o",
+"oXXooXX"
+};
diff --git a/data/pixmaps/feta/4/noteheads-2diamond.xpm b/data/pixmaps/feta/4/noteheads-2diamond.xpm
new file mode 100644
index 0000000..a39b5b6
--- /dev/null
+++ b/data/pixmaps/feta/4/noteheads-2diamond.xpm
@@ -0,0 +1,18 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"7 6 6 1",
+" c #060606",
+". c Gray49",
+"X c #848484",
+"o c #b7b7b7",
+"O c #c0c0c0",
+"+ c None",
+/* pixels */
+"+++++++",
+"+++oX.O",
+"+++ o",
+"++o o+",
+"+o ++",
+"+O.Xo++"
+};
diff --git a/data/pixmaps/feta/4/noteheads-2mensural.xpm b/data/pixmaps/feta/4/noteheads-2mensural.xpm
new file mode 100644
index 0000000..7a79bf1
--- /dev/null
+++ b/data/pixmaps/feta/4/noteheads-2mensural.xpm
@@ -0,0 +1,16 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"5 6 4 1",
+" c #151515",
+". c Gray49",
+"X c #d7d7d7",
+"o c None",
+/* pixels */
+"ooooo",
+"ooXXo",
+"oo o",
+"o. .",
+"oo o",
+"ooXXo"
+};
diff --git a/data/pixmaps/feta/4/noteheads-2slash.xpm b/data/pixmaps/feta/4/noteheads-2slash.xpm
new file mode 100644
index 0000000..5770bd5
--- /dev/null
+++ b/data/pixmaps/feta/4/noteheads-2slash.xpm
@@ -0,0 +1,22 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"8 10 6 1",
+" c #060606",
+". c Gray17",
+"X c Gray47",
+"o c #909090",
+"O c #d2d2d2",
+"+ c None",
+/* pixels */
+"++++++++",
+"+++++OXO",
+"+++++. O",
+"++++o o+",
+"+++O .++",
+"+++o o++",
+"+++. +++",
+"++o o+++",
+"+O .++++",
+"+OXO++++"
+};
diff --git a/data/pixmaps/feta/4/noteheads-2triangle.xpm b/data/pixmaps/feta/4/noteheads-2triangle.xpm
new file mode 100644
index 0000000..1020404
--- /dev/null
+++ b/data/pixmaps/feta/4/noteheads-2triangle.xpm
@@ -0,0 +1,17 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"6 5 6 1",
+" c Gray1",
+". c Gray50",
+"X c #929292",
+"o c #b4b4b4",
+"O c #cdcdcd",
+"+ c None",
+/* pixels */
+"++++++",
+"+++X++",
+"++o o+",
+"++ O",
+"+OXX.O"
+};
diff --git a/data/pixmaps/feta/4/noteheads-2xcircle.xpm b/data/pixmaps/feta/4/noteheads-2xcircle.xpm
new file mode 100644
index 0000000..e149172
--- /dev/null
+++ b/data/pixmaps/feta/4/noteheads-2xcircle.xpm
@@ -0,0 +1,17 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"7 7 4 1",
+" c #535353",
+". c #979797",
+"X c Gray80",
+"o c None",
+/* pixels */
+"ooooooo",
+"ooo..oo",
+"oo XX o",
+"o.X..X.",
+"o.X..X.",
+"oo XX o",
+"ooo..oo"
+};
diff --git a/data/pixmaps/feta/4/noteheads-ledgerending.xpm b/data/pixmaps/feta/4/noteheads-ledgerending.xpm
new file mode 100644
index 0000000..99ba1a3
--- /dev/null
+++ b/data/pixmaps/feta/4/noteheads-ledgerending.xpm
@@ -0,0 +1,12 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"6 3 3 1",
+" c Gray42",
+". c #bebebe",
+"X c None",
+/* pixels */
+"XXXXXX",
+"X. .",
+"X. ."
+};
diff --git a/data/pixmaps/feta/4/rests--1.xpm b/data/pixmaps/feta/4/rests--1.xpm
new file mode 100644
index 0000000..df2a459
--- /dev/null
+++ b/data/pixmaps/feta/4/rests--1.xpm
@@ -0,0 +1,16 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"4 6 4 1",
+" c Gray0",
+". c #747474",
+"X c #bebebe",
+"o c None",
+/* pixels */
+"oooo",
+"oX.X",
+"o. .",
+"o. .",
+"o. .",
+"oX.X"
+};
diff --git a/data/pixmaps/feta/4/rests--1o.xpm b/data/pixmaps/feta/4/rests--1o.xpm
new file mode 100644
index 0000000..ba2d6d6
--- /dev/null
+++ b/data/pixmaps/feta/4/rests--1o.xpm
@@ -0,0 +1,18 @@
+/* XPM */
+static char * rests__1o_xpm[] = {
+"9 6 9 1",
+" c None",
+". c #B5B5B5",
+"+ c #646464",
+"@ c #878787",
+"# c #5D5D5D",
+"$ c #292929",
+"% c #020202",
+"& c #747474",
+"* c #000000",
+" ",
+" .+@@@+. ",
+" .#$%$#. ",
+" &*& ",
+" .#$%$#. ",
+" .+@@@+. "};
diff --git a/data/pixmaps/feta/4/rests--2.xpm b/data/pixmaps/feta/4/rests--2.xpm
new file mode 100644
index 0000000..9151f93
--- /dev/null
+++ b/data/pixmaps/feta/4/rests--2.xpm
@@ -0,0 +1,20 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"4 10 4 1",
+" c Gray0",
+". c Gray45",
+"X c #bebebe",
+"o c None",
+/* pixels */
+"oooo",
+"oX.X",
+"o. .",
+"o. .",
+"o. .",
+"o. .",
+"o. .",
+"o. .",
+"o. .",
+"oX.X"
+};
diff --git a/data/pixmaps/feta/4/rests--4.xpm b/data/pixmaps/feta/4/rests--4.xpm
new file mode 100644
index 0000000..7862c4c
--- /dev/null
+++ b/data/pixmaps/feta/4/rests--4.xpm
@@ -0,0 +1,20 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"32 10 4 1",
+" c Gray4",
+". c Gray57",
+"X c #d3d3d3",
+"o c None",
+/* pixels */
+"oooooooooooooooooooooooooooooooo",
+"oXoooooooooooooooooooooooooooooX",
+"o.XoooooooooooooooooooooooooooX.",
+"o.XoooooooooooooooooXoooooooooX.",
+"o. .",
+"o. .",
+"o. .",
+"o.XoooooXooooooooooXooooooXoooX.",
+"o.XoooooooooooooooooooooooooooX.",
+"oXoooooooooooooooooooooooooooooX"
+};
diff --git a/data/pixmaps/feta/4/rests-0.xpm b/data/pixmaps/feta/4/rests-0.xpm
new file mode 100644
index 0000000..cd3ae12
--- /dev/null
+++ b/data/pixmaps/feta/4/rests-0.xpm
@@ -0,0 +1,14 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"7 4 4 1",
+" c #020202",
+". c #6f6f6f",
+"X c Gray71",
+"o c None",
+/* pixels */
+"ooooooo",
+"oX....X",
+"o. .",
+"oX....X"
+};
diff --git a/data/pixmaps/feta/4/rests-0o.xpm b/data/pixmaps/feta/4/rests-0o.xpm
new file mode 100644
index 0000000..12ed55e
--- /dev/null
+++ b/data/pixmaps/feta/4/rests-0o.xpm
@@ -0,0 +1,18 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"11 5 7 1",
+" c #020202",
+". c Gray16",
+"X c #5d5d5d",
+"o c #646464",
+"O c Gray53",
+"+ c Gray71",
+"@ c None",
+/* pixels */
+"@@@@@@@@@@@",
+"@+oOOOOOOo+",
+"@+X. .X+",
+"@@@X X@@",
+"@@@+OOOO+@@"
+};
diff --git a/data/pixmaps/feta/4/rests-1.xpm b/data/pixmaps/feta/4/rests-1.xpm
new file mode 100644
index 0000000..cd3ae12
--- /dev/null
+++ b/data/pixmaps/feta/4/rests-1.xpm
@@ -0,0 +1,14 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"7 4 4 1",
+" c #020202",
+". c #6f6f6f",
+"X c Gray71",
+"o c None",
+/* pixels */
+"ooooooo",
+"oX....X",
+"o. .",
+"oX....X"
+};
diff --git a/data/pixmaps/feta/4/rests-1o.xpm b/data/pixmaps/feta/4/rests-1o.xpm
new file mode 100644
index 0000000..4fb45b8
--- /dev/null
+++ b/data/pixmaps/feta/4/rests-1o.xpm
@@ -0,0 +1,18 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"11 5 7 1",
+" c #020202",
+". c Gray16",
+"X c #5d5d5d",
+"o c #646464",
+"O c Gray53",
+"+ c Gray71",
+"@ c None",
+/* pixels */
+"@@@@@@@@@@@",
+"@@@+OOOO+@@",
+"@@@X X@@",
+"@+X. .X+",
+"@+oOOOOOOo+"
+};
diff --git a/data/pixmaps/feta/4/rests-2.xpm b/data/pixmaps/feta/4/rests-2.xpm
new file mode 100644
index 0000000..d9d9f4c
--- /dev/null
+++ b/data/pixmaps/feta/4/rests-2.xpm
@@ -0,0 +1,27 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"6 13 8 1",
+" c Gray1",
+". c #393939",
+"X c #484848",
+"o c #767676",
+"O c #8d8d8d",
+"+ c Gray70",
+"@ c #c8c8c8",
+"# c None",
+/* pixels */
+"######",
+"##@@##",
+"###O##",
+"###o.#",
+"##+ O",
+"#+ X#",
+"#+ X##",
+"##+O##",
+"#@O.O#",
+"#O @",
+"#+X###",
+"##+###",
+"##@###"
+};
diff --git a/data/pixmaps/feta/4/rests-2mensural.xpm b/data/pixmaps/feta/4/rests-2mensural.xpm
new file mode 100644
index 0000000..205d612
--- /dev/null
+++ b/data/pixmaps/feta/4/rests-2mensural.xpm
@@ -0,0 +1,16 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"5 5 5 1",
+" c Gray9",
+". c Gray44",
+"X c Gray54",
+"o c #c6c6c6",
+"O c None",
+/* pixels */
+"OOOOO",
+"OOXOO",
+"OX X",
+"O..OO",
+"OOoOO"
+};
diff --git a/data/pixmaps/feta/4/rests-3.xpm b/data/pixmaps/feta/4/rests-3.xpm
new file mode 100644
index 0000000..9fba802
--- /dev/null
+++ b/data/pixmaps/feta/4/rests-3.xpm
@@ -0,0 +1,21 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"7 9 6 1",
+" c #0e0e0e",
+". c #505050",
+"X c #8e8e8e",
+"o c Gray74",
+"O c #d5d5d5",
+"+ c None",
+/* pixels */
+"+++++++",
+"++Xo++O",
+"+X +X.",
+"+o +",
+"++++O.+",
+"++++OX+",
+"++++XO+",
+"++++.++",
+"++++o++"
+};
diff --git a/data/pixmaps/feta/4/rests-3mensural.xpm b/data/pixmaps/feta/4/rests-3mensural.xpm
new file mode 100644
index 0000000..9bb63db
--- /dev/null
+++ b/data/pixmaps/feta/4/rests-3mensural.xpm
@@ -0,0 +1,17 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"4 5 6 1",
+" c Gray3",
+". c #6a6a6a",
+"X c #888888",
+"o c #acacac",
+"O c #cdcdcd",
+"+ c None",
+/* pixels */
+"++++",
+"++Xo",
+"+X .",
+"++o.",
+"+++O"
+};
diff --git a/data/pixmaps/feta/4/rests-4.xpm b/data/pixmaps/feta/4/rests-4.xpm
new file mode 100644
index 0000000..36254ec
--- /dev/null
+++ b/data/pixmaps/feta/4/rests-4.xpm
@@ -0,0 +1,26 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"7 12 8 1",
+" c #010101",
+". c #2d2d2d",
+"X c #4c4c4c",
+"o c Gray44",
+"O c #909090",
+"+ c Gray69",
+"@ c Gray82",
+"# c None",
+/* pixels */
+"#######",
+"###o@#@",
+"##X X++",
+"##+.. @",
+"##@##o#",
+"#O o#o#",
+"#O .O+#",
+"##@@.@#",
+"####o##",
+"###+o##",
+"###X+##",
+"###O@##"
+};
diff --git a/data/pixmaps/feta/4/rests-4mensural.xpm b/data/pixmaps/feta/4/rests-4mensural.xpm
new file mode 100644
index 0000000..f02c904
--- /dev/null
+++ b/data/pixmaps/feta/4/rests-4mensural.xpm
@@ -0,0 +1,19 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"4 6 7 1",
+" c Gray5",
+". c #2a2a2a",
+"X c Gray43",
+"o c #9d9d9d",
+"O c #aeaeae",
+"+ c Gray79",
+"@ c None",
+/* pixels */
+"@@@@",
+"@@+O",
+"@O X",
+"@O X",
+"@o.X",
+"@@@+"
+};
diff --git a/data/pixmaps/feta/4/rests-5.xpm b/data/pixmaps/feta/4/rests-5.xpm
new file mode 100644
index 0000000..e82b8a8
--- /dev/null
+++ b/data/pixmaps/feta/4/rests-5.xpm
@@ -0,0 +1,30 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"8 16 8 1",
+" c Gray3",
+". c Gray22",
+"X c #555555",
+"o c #767676",
+"O c Gray57",
+"+ c #b2b2b2",
+"@ c Gray82",
+"# c None",
+/* pixels */
+"########",
+"###@o@##",
+"###X X#O",
+"###O XX+",
+"######o@",
+"##@X@#o#",
+"##X .@o#",
+"##@.. +#",
+"##@@#O@#",
+"#O X#o##",
+"#O .+o##",
+"##@@o+##",
+"####X+##",
+"####o###",
+"###+.###",
+"###@@###"
+};
diff --git a/data/pixmaps/feta/4/rests-6.xpm b/data/pixmaps/feta/4/rests-6.xpm
new file mode 100644
index 0000000..b46c2a4
--- /dev/null
+++ b/data/pixmaps/feta/4/rests-6.xpm
@@ -0,0 +1,34 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"9 20 8 1",
+" c #060606",
+". c #2f2f2f",
+"X c #555555",
+"o c #6a6a6a",
+"O c #8e8e8e",
+"+ c #afafaf",
+"@ c Gray83",
+"# c None",
+/* pixels */
+"#########",
+"####+O###",
+"#### O@O",
+"####X XO@",
+"#######O@",
+"###+X@#O@",
+"### o+O#",
+"###O..XO#",
+"###@@#+O#",
+"##O .#O@#",
+"##O +.##",
+"###@@+o##",
+"##+@#@O##",
+"#O .#OO##",
+"#+ .X###",
+"##@@@o@##",
+"#####X###",
+"####@O###",
+"####oo###",
+"####@@###"
+};
diff --git a/data/pixmaps/feta/4/rests-7.xpm b/data/pixmaps/feta/4/rests-7.xpm
new file mode 100644
index 0000000..1c882ab
--- /dev/null
+++ b/data/pixmaps/feta/4/rests-7.xpm
@@ -0,0 +1,38 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"10 24 8 1",
+" c #090909",
+". c Gray16",
+"X c #4c4c4c",
+"o c #717171",
+"O c #8d8d8d",
+"+ c Gray68",
+"@ c #d3d3d3",
+"# c None",
+/* pixels */
+"##########",
+"#####+O###",
+"##### O@O",
+"##### ..@",
+"#####@OOX#",
+"####+o##O@",
+"#### O#O#",
+"####o X+O#",
+"#######+@#",
+"###@XO#O@#",
+"###O +X##",
+"###@X..o##",
+"###@@#@O##",
+"##O .#O@##",
+"##O +O@##",
+"###@@+X###",
+"##+@#@O###",
+"#O .#oo###",
+"#+ ..@###",
+"##@@@X####",
+"####@X####",
+"####@O####",
+"####oo####",
+"####+#####"
+};
diff --git a/data/pixmaps/feta/4/scripts-arpeggio.xpm b/data/pixmaps/feta/4/scripts-arpeggio.xpm
new file mode 100644
index 0000000..6e69d91
--- /dev/null
+++ b/data/pixmaps/feta/4/scripts-arpeggio.xpm
@@ -0,0 +1,18 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"5 7 5 1",
+" c Gray0",
+". c #929292",
+"X c #acacac",
+"o c Gray78",
+"O c None",
+/* pixels */
+"OOOOO",
+"OOXOO",
+"OOo.O",
+"OO. X",
+"OX .O",
+"OO.oO",
+"OOOXO"
+};
diff --git a/data/pixmaps/feta/4/scripts-coda.xpm b/data/pixmaps/feta/4/scripts-coda.xpm
new file mode 100644
index 0000000..dd62c53
--- /dev/null
+++ b/data/pixmaps/feta/4/scripts-coda.xpm
@@ -0,0 +1,26 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"10 12 8 1",
+" c Gray6",
+". c #2f2f2f",
+"X c #505050",
+"o c #656565",
+"O c #909090",
+"+ c #aaaaaa",
+"@ c Gray81",
+"# c None",
+/* pixels */
+"##########",
+"#####@####",
+"####O.@###",
+"###Ooo.###",
+"### ++.O##",
+"##+ OO X#@",
+"#@o oX .O@",
+"##@ ++.X##",
+"### ++.O##",
+"###Ooo.###",
+"####O.@###",
+"#####@####"
+};
diff --git a/data/pixmaps/feta/4/scripts-dfermata.xpm b/data/pixmaps/feta/4/scripts-dfermata.xpm
new file mode 100644
index 0000000..584fc1f
--- /dev/null
+++ b/data/pixmaps/feta/4/scripts-dfermata.xpm
@@ -0,0 +1,21 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"12 8 7 1",
+" c #010101",
+". c Gray26",
+"X c Gray47",
+"o c #888888",
+"O c #afafaf",
+"+ c #d5d5d5",
+"@ c None",
+/* pixels */
+"@@@@@@@@@@@@",
+"@+@@@@o@@@@+",
+"@oO@@o o@@Oo",
+"@+o@@+XO@@o+",
+"@@.O@@@@@O.@",
+"@@O X@@@X O@",
+"@@@O O@@",
+"@@@@@ooo@@@@"
+};
diff --git a/data/pixmaps/feta/4/scripts-dmarcato.xpm b/data/pixmaps/feta/4/scripts-dmarcato.xpm
new file mode 100644
index 0000000..433522b
--- /dev/null
+++ b/data/pixmaps/feta/4/scripts-dmarcato.xpm
@@ -0,0 +1,18 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"6 6 6 1",
+" c #020202",
+". c Gray44",
+"X c #848484",
+"o c #afafaf",
+"O c #c8c8c8",
+"+ c None",
+/* pixels */
+"++++++",
+"+OX++O",
+"++ Xoo",
+"++X .+",
+"+++ o+",
+"+++O++"
+};
diff --git a/data/pixmaps/feta/4/scripts-downbow.xpm b/data/pixmaps/feta/4/scripts-downbow.xpm
new file mode 100644
index 0000000..50e7080
--- /dev/null
+++ b/data/pixmaps/feta/4/scripts-downbow.xpm
@@ -0,0 +1,18 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"8 7 5 1",
+" c #020202",
+". c Gray40",
+"X c #8e8e8e",
+"o c #d3d3d3",
+"O c None",
+/* pixels */
+"OOOOOOOO",
+"OoXXXXXo",
+"OX X",
+"OX.XXX.X",
+"OXoOOOoX",
+"OXoOOOoX",
+"OoOOOOOo"
+};
diff --git a/data/pixmaps/feta/4/scripts-downmordent.xpm b/data/pixmaps/feta/4/scripts-downmordent.xpm
new file mode 100644
index 0000000..f677374
--- /dev/null
+++ b/data/pixmaps/feta/4/scripts-downmordent.xpm
@@ -0,0 +1,22 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"15 8 8 1",
+" c #090909",
+". c Gray17",
+"X c Gray31",
+"o c Gray43",
+"O c #898989",
+"+ c #aaaaaa",
+"@ c #c6c6c6",
+"# c None",
+/* pixels */
+"###############",
+"##@############",
+"#+o#######@####",
+"#oo@X##X+#.X###",
+"#+X. oo +. o+O",
+"##X+X .+ oo #",
+"#####X+#+.O#.+#",
+"##########@####"
+};
diff --git a/data/pixmaps/feta/4/scripts-downprall.xpm b/data/pixmaps/feta/4/scripts-downprall.xpm
new file mode 100644
index 0000000..6fb7d66
--- /dev/null
+++ b/data/pixmaps/feta/4/scripts-downprall.xpm
@@ -0,0 +1,21 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"15 7 8 1",
+" c #070707",
+". c Gray19",
+"X c #515151",
+"o c Gray44",
+"O c Gray58",
+"+ c #b1b1b1",
+"@ c Gray83",
+"# c None",
+/* pixels */
+"###############",
+"##@############",
+"#Oo#@######@###",
+"#ooO ## O#o.##@",
+"#@X. .X o. .oO",
+"##O@+ .#. ++ .#",
+"#####+@#@+##+@#"
+};
diff --git a/data/pixmaps/feta/4/scripts-dpedalheel.xpm b/data/pixmaps/feta/4/scripts-dpedalheel.xpm
new file mode 100644
index 0000000..cab3ca7
--- /dev/null
+++ b/data/pixmaps/feta/4/scripts-dpedalheel.xpm
@@ -0,0 +1,18 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"6 6 6 1",
+" c #555555",
+". c Gray49",
+"X c Gray59",
+"o c #a4a4a4",
+"O c #d3d3d3",
+"+ c None",
+/* pixels */
+"++++++",
+"++o.o+",
+"+o + o",
+"+XO+OX",
+"+XO+OX",
+"+O+++O"
+};
diff --git a/data/pixmaps/feta/4/scripts-dpedaltoe.xpm b/data/pixmaps/feta/4/scripts-dpedaltoe.xpm
new file mode 100644
index 0000000..c0eeb14
--- /dev/null
+++ b/data/pixmaps/feta/4/scripts-dpedaltoe.xpm
@@ -0,0 +1,20 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"6 7 7 1",
+" c #101010",
+". c #585858",
+"X c Gray47",
+"o c #8d8d8d",
+"O c #b7b7b7",
+"+ c Gray86",
+"@ c None",
+/* pixels */
+"@@@@@@",
+"@O+@+O",
+"@OX@XO",
+"@@.+.@",
+"@@oXo@",
+"@@+ +@",
+"@@@o@@"
+};
diff --git a/data/pixmaps/feta/4/scripts-dstaccatissimo.xpm b/data/pixmaps/feta/4/scripts-dstaccatissimo.xpm
new file mode 100644
index 0000000..4a805ab
--- /dev/null
+++ b/data/pixmaps/feta/4/scripts-dstaccatissimo.xpm
@@ -0,0 +1,17 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"4 6 5 1",
+" c #0e0e0e",
+". c #6f6f6f",
+"X c Gray56",
+"o c Gray79",
+"O c None",
+/* pixels */
+"OOOO",
+"OOXO",
+"OO O",
+"OO O",
+"OX X",
+"Oo.o"
+};
diff --git a/data/pixmaps/feta/4/scripts-flageolet.xpm b/data/pixmaps/feta/4/scripts-flageolet.xpm
new file mode 100644
index 0000000..1d5afb3
--- /dev/null
+++ b/data/pixmaps/feta/4/scripts-flageolet.xpm
@@ -0,0 +1,16 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"6 6 4 1",
+" c #909090",
+". c Gray71",
+"X c Gray86",
+"o c None",
+/* pixels */
+"oooooo",
+"oo. .o",
+"oX.X..",
+"o XoX ",
+"o..X..",
+"oo. .o"
+};
diff --git a/data/pixmaps/feta/4/scripts-lcomma.xpm b/data/pixmaps/feta/4/scripts-lcomma.xpm
new file mode 100644
index 0000000..58426ec
--- /dev/null
+++ b/data/pixmaps/feta/4/scripts-lcomma.xpm
@@ -0,0 +1,20 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"4 7 7 1",
+" c #202020",
+". c Gray32",
+"X c #6f6f6f",
+"o c #868686",
+"O c #acacac",
+"+ c #d7d7d7",
+"@ c None",
+/* pixels */
+"@@@@",
+"@@++",
+"@@.+",
+"@OX@",
+"@XX@",
+"@o @",
+"@@o@"
+};
diff --git a/data/pixmaps/feta/4/scripts-lineprall.xpm b/data/pixmaps/feta/4/scripts-lineprall.xpm
new file mode 100644
index 0000000..f72aea7
--- /dev/null
+++ b/data/pixmaps/feta/4/scripts-lineprall.xpm
@@ -0,0 +1,25 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"14 12 7 1",
+" c #090909",
+". c Gray20",
+"X c Gray29",
+"o c #959595",
+"O c Gray73",
+"+ c Gray80",
+"@ c None",
+/* pixels */
+"@@@@@@@@@@@@@@",
+"@+@@@@@@@@@@@@",
+"@o+@@@@@@@@@@@",
+"@o+@@@@@@@@@@@",
+"@o+@@@@@@@@@@@",
+"@o+@@@@@@@@@@@",
+"@o+@@@@@@@@@@@",
+"@o++@@O@@@O@@@",
+"@o O+ X@X O@O",
+"@o. X. .X .o",
+"@+@O X@X ++ .@",
+"@@@@O@@@+@@+@@"
+};
diff --git a/data/pixmaps/feta/4/scripts-mordent.xpm b/data/pixmaps/feta/4/scripts-mordent.xpm
new file mode 100644
index 0000000..5ce3758
--- /dev/null
+++ b/data/pixmaps/feta/4/scripts-mordent.xpm
@@ -0,0 +1,20 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"10 7 7 1",
+" c Gray0",
+". c Gray23",
+"X c #555555",
+"o c #8b8b8b",
+"O c #a9a9a9",
+"+ c #d3d3d3",
+"@ c None",
+/* pixels */
+"@@@@@@@@@@",
+"@@@@@+@@@@",
+"@@oX@X.+@@",
+"@+ oX XOo",
+"@oOX Xo +",
+"@@@+.X@Xo@",
+"@@@@@+@@@@"
+};
diff --git a/data/pixmaps/feta/4/scripts-open.xpm b/data/pixmaps/feta/4/scripts-open.xpm
new file mode 100644
index 0000000..302a86b
--- /dev/null
+++ b/data/pixmaps/feta/4/scripts-open.xpm
@@ -0,0 +1,14 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"5 6 2 1",
+" c #8e8e8e",
+". c None",
+/* pixels */
+".....",
+".. .",
+". ",
+". .. ",
+". ",
+".. ."
+};
diff --git a/data/pixmaps/feta/4/scripts-prall.xpm b/data/pixmaps/feta/4/scripts-prall.xpm
new file mode 100644
index 0000000..4920990
--- /dev/null
+++ b/data/pixmaps/feta/4/scripts-prall.xpm
@@ -0,0 +1,19 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"10 6 7 1",
+" c #0c0c0c",
+". c Gray18",
+"X c Gray30",
+"o c #929292",
+"O c #b1b1b1",
+"+ c #c8c8c8",
+"@ c None",
+/* pixels */
+"@@@@@@@@@@",
+"@@@+@@+@@@",
+"@@. @o o@O",
+"@O. X .O",
+"@O@o o@ .@",
+"@@@@O@@+@@"
+};
diff --git a/data/pixmaps/feta/4/scripts-pralldown.xpm b/data/pixmaps/feta/4/scripts-pralldown.xpm
new file mode 100644
index 0000000..f4a6b2c
--- /dev/null
+++ b/data/pixmaps/feta/4/scripts-pralldown.xpm
@@ -0,0 +1,22 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"14 8 8 1",
+" c Gray4",
+". c #323232",
+"X c Gray34",
+"o c #6f6f6f",
+"O c Gray56",
+"+ c #b7b7b7",
+"@ c Gray81",
+"# c None",
+/* pixels */
+"##############",
+"####+##@@##+##",
+"#+@O o@ @X O#",
+"#@ .X o XX#",
+"##X.#+ +#.X#O@",
+"############oo",
+"############OO",
+"############@#"
+};
diff --git a/data/pixmaps/feta/4/scripts-prallmordent.xpm b/data/pixmaps/feta/4/scripts-prallmordent.xpm
new file mode 100644
index 0000000..4fc8fc2
--- /dev/null
+++ b/data/pixmaps/feta/4/scripts-prallmordent.xpm
@@ -0,0 +1,21 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"14 7 8 1",
+" c #090909",
+". c Gray18",
+"X c Gray31",
+"o c Gray39",
+"O c #8b8b8b",
+"+ c Gray66",
+"@ c #cacaca",
+"# c None",
+/* pixels */
+"##############",
+"#########@####",
+"##+X##.+#.X###",
+"## oO + o+O",
+"#O+o + oo #",
+"####X+#+.O#X+#",
+"#########@####"
+};
diff --git a/data/pixmaps/feta/4/scripts-prallprall.xpm b/data/pixmaps/feta/4/scripts-prallprall.xpm
new file mode 100644
index 0000000..8ee833b
--- /dev/null
+++ b/data/pixmaps/feta/4/scripts-prallprall.xpm
@@ -0,0 +1,18 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"14 6 6 1",
+" c #070707",
+". c Gray22",
+"X c #494949",
+"o c #b7b7b7",
+"O c Gray77",
+"+ c None",
+/* pixels */
+"++++++++++++++",
+"+++O++O+++O+++",
+"++X oO X+X o+o",
+"+o. X. .X .o",
+"+o+o X+X Oo X+",
+"++++O+++O++O++"
+};
diff --git a/data/pixmaps/feta/4/scripts-prallup.xpm b/data/pixmaps/feta/4/scripts-prallup.xpm
new file mode 100644
index 0000000..f02c529
--- /dev/null
+++ b/data/pixmaps/feta/4/scripts-prallup.xpm
@@ -0,0 +1,21 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"15 7 8 1",
+" c #070707",
+". c Gray19",
+"X c #515151",
+"o c Gray44",
+"O c Gray58",
+"+ c #b1b1b1",
+"@ c Gray83",
+"# c None",
+/* pixels */
+"###############",
+"#############@#",
+"#############oO",
+"#@##.o#O #@ Ooo",
+"#Oo. .o o. .X@",
+"##. O+ .#X O@O#",
+"##@+##+@#@+####"
+};
diff --git a/data/pixmaps/feta/4/scripts-rcomma.xpm b/data/pixmaps/feta/4/scripts-rcomma.xpm
new file mode 100644
index 0000000..92660fb
--- /dev/null
+++ b/data/pixmaps/feta/4/scripts-rcomma.xpm
@@ -0,0 +1,20 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"4 7 7 1",
+" c #202020",
+". c Gray32",
+"X c #6f6f6f",
+"o c #868686",
+"O c #acacac",
+"+ c #d7d7d7",
+"@ c None",
+/* pixels */
+"@@@@",
+"@@o@",
+"@@ o",
+"@@XX",
+"@@XO",
+"@+.@",
+"@++@"
+};
diff --git a/data/pixmaps/feta/4/scripts-reverseturn.xpm b/data/pixmaps/feta/4/scripts-reverseturn.xpm
new file mode 100644
index 0000000..baa4ece
--- /dev/null
+++ b/data/pixmaps/feta/4/scripts-reverseturn.xpm
@@ -0,0 +1,19 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"10 6 7 1",
+" c #040404",
+". c Gray24",
+"X c #686868",
+"o c #8d8d8d",
+"O c #b4b4b4",
+"+ c Gray78",
+"@ c None",
+/* pixels */
+"@@@@@@@@@@",
+"@@oo@@OXO@",
+"@o @O X.O",
+"@o+@O O@+o",
+"@O.X O@ o",
+"@@OXO@@oo@"
+};
diff --git a/data/pixmaps/feta/4/scripts-segno.xpm b/data/pixmaps/feta/4/scripts-segno.xpm
new file mode 100644
index 0000000..66a08c2
--- /dev/null
+++ b/data/pixmaps/feta/4/scripts-segno.xpm
@@ -0,0 +1,27 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"10 13 8 1",
+" c Gray5",
+". c #343434",
+"X c #515151",
+"o c #6f6f6f",
+"O c #929292",
+"+ c Gray70",
+"@ c Gray82",
+"# c None",
+/* pixels */
+"##########",
+"##+OO###++",
+"#+.#o.#@X#",
+"#oo#o #X+#",
+"#O.#+OOo##",
+"##..## #@#",
+"###o..O#O#",
+"##O#O..o##",
+"###@ ##..#",
+"###oOO+#.O",
+"##+X# o#oo",
+"##X@#.o#.+",
+"#@+###OO+#"
+};
diff --git a/data/pixmaps/feta/4/scripts-sforzato.xpm b/data/pixmaps/feta/4/scripts-sforzato.xpm
new file mode 100644
index 0000000..e0af282
--- /dev/null
+++ b/data/pixmaps/feta/4/scripts-sforzato.xpm
@@ -0,0 +1,19 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"9 6 7 1",
+" c #161616",
+". c #5d5d5d",
+"X c #7c7c7c",
+"o c #8b8b8b",
+"O c #b7b7b7",
+"+ c #d2d2d2",
+"@ c None",
+/* pixels */
+"@@@@@@@@@",
+"@+o+@@@@@",
+"@@oo.X+@@",
+"@@@@@O+ o",
+"@@oo.X+@@",
+"@+o++@@@@"
+};
diff --git a/data/pixmaps/feta/4/scripts-staccato.xpm b/data/pixmaps/feta/4/scripts-staccato.xpm
new file mode 100644
index 0000000..63ec602
--- /dev/null
+++ b/data/pixmaps/feta/4/scripts-staccato.xpm
@@ -0,0 +1,11 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"3 3 2 1",
+" c #b2b2b2",
+". c None",
+/* pixels */
+"...",
+". ",
+". "
+};
diff --git a/data/pixmaps/feta/4/scripts-stopped.xpm b/data/pixmaps/feta/4/scripts-stopped.xpm
new file mode 100644
index 0000000..a60423e
--- /dev/null
+++ b/data/pixmaps/feta/4/scripts-stopped.xpm
@@ -0,0 +1,18 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"5 6 6 1",
+" c #020202",
+". c Gray25",
+"X c #838383",
+"o c #a4a4a4",
+"O c Gray86",
+"+ c None",
+/* pixels */
+"+++++",
+"++OO+",
+"++.o+",
+"+X X",
+"++.o+",
+"++OO+"
+};
diff --git a/data/pixmaps/feta/4/scripts-tenuto.xpm b/data/pixmaps/feta/4/scripts-tenuto.xpm
new file mode 100644
index 0000000..b33855f
--- /dev/null
+++ b/data/pixmaps/feta/4/scripts-tenuto.xpm
@@ -0,0 +1,12 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"7 2 4 1",
+" c Gray62",
+". c #a9a9a9",
+"X c Gray84",
+"o c None",
+/* pixels */
+"ooooooo",
+"oX .. X"
+};
diff --git a/data/pixmaps/feta/4/scripts-thumb.xpm b/data/pixmaps/feta/4/scripts-thumb.xpm
new file mode 100644
index 0000000..35e8fe3
--- /dev/null
+++ b/data/pixmaps/feta/4/scripts-thumb.xpm
@@ -0,0 +1,18 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"5 7 5 1",
+" c #5b5b5b",
+". c Gray45",
+"X c #8d8d8d",
+"o c #b1b1b1",
+"O c None",
+/* pixels */
+"OOOOO",
+"OOXXO",
+"O....",
+"O.XX.",
+"OX X",
+"OO O",
+"OOooO"
+};
diff --git a/data/pixmaps/feta/4/scripts-trilelement.xpm b/data/pixmaps/feta/4/scripts-trilelement.xpm
new file mode 100644
index 0000000..af6cccd
--- /dev/null
+++ b/data/pixmaps/feta/4/scripts-trilelement.xpm
@@ -0,0 +1,17 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"7 6 5 1",
+" c #0b0b0b",
+". c Gray22",
+"X c #b7b7b7",
+"o c Gray77",
+"O c None",
+/* pixels */
+"OOOOOOO",
+"OOOoOOO",
+"OO. XOX",
+"OX. .X",
+"OXOX .O",
+"OOOOoOO"
+};
diff --git a/data/pixmaps/feta/4/scripts-trill-element.xpm b/data/pixmaps/feta/4/scripts-trill-element.xpm
new file mode 100644
index 0000000..adc82d3
--- /dev/null
+++ b/data/pixmaps/feta/4/scripts-trill-element.xpm
@@ -0,0 +1,16 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"7 5 5 1",
+" c Gray0",
+". c Gray57",
+"X c #acacac",
+"o c Gray78",
+"O c None",
+/* pixels */
+"OOOOOOO",
+"OOOXOOO",
+"OO. .oX",
+"OXo. .O",
+"OOOOXOO"
+};
diff --git a/data/pixmaps/feta/4/scripts-trill.xpm b/data/pixmaps/feta/4/scripts-trill.xpm
new file mode 100644
index 0000000..c9f14ca
--- /dev/null
+++ b/data/pixmaps/feta/4/scripts-trill.xpm
@@ -0,0 +1,25 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"13 11 8 1",
+" c #090909",
+". c #2d2d2d",
+"X c #494949",
+"o c #626262",
+"O c Gray55",
+"+ c #afafaf",
+"@ c #d0d0d0",
+"# c None",
+/* pixels */
+"#############",
+"######@######",
+"##### +######",
+"####@ +######",
+"####@ #@o##@#",
+"##++X.+OX.@ +",
+"#++@. @#+.#.@",
+"#+OO X##.O###",
+"##@@ +O#.@###",
+"###@ X+@ @###",
+"####+O#@O####"
+};
diff --git a/data/pixmaps/feta/4/scripts-turn.xpm b/data/pixmaps/feta/4/scripts-turn.xpm
new file mode 100644
index 0000000..2a07d97
--- /dev/null
+++ b/data/pixmaps/feta/4/scripts-turn.xpm
@@ -0,0 +1,19 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"10 6 7 1",
+" c #040404",
+". c Gray24",
+"X c #686868",
+"o c #8d8d8d",
+"O c #b4b4b4",
+"+ c Gray78",
+"@ c None",
+/* pixels */
+"@@@@@@@@@@",
+"@@OX+@@oo@",
+"@O.X O@ o",
+"@o+@O O@+o",
+"@o @O X.O",
+"@@oo@@OXO@"
+};
diff --git a/data/pixmaps/feta/4/scripts-ufermata.xpm b/data/pixmaps/feta/4/scripts-ufermata.xpm
new file mode 100644
index 0000000..8ec0622
--- /dev/null
+++ b/data/pixmaps/feta/4/scripts-ufermata.xpm
@@ -0,0 +1,21 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"12 8 7 1",
+" c #010101",
+". c Gray26",
+"X c Gray47",
+"o c #888888",
+"O c #afafaf",
+"+ c #d5d5d5",
+"@ c None",
+/* pixels */
+"@@@@@@@@@@@@",
+"@@@@@ooo@@@@",
+"@@@O O@@",
+"@@O X@@@o O@",
+"@@.O@@@@@O.@",
+"@+X@@OX+@@o+",
+"@oO@@o X@@Oo",
+"@+@@@@o@@@++"
+};
diff --git a/data/pixmaps/feta/4/scripts-umarcato.xpm b/data/pixmaps/feta/4/scripts-umarcato.xpm
new file mode 100644
index 0000000..c4ccf08
--- /dev/null
+++ b/data/pixmaps/feta/4/scripts-umarcato.xpm
@@ -0,0 +1,18 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"6 6 6 1",
+" c #020202",
+". c Gray44",
+"X c #848484",
+"o c #afafaf",
+"O c #c8c8c8",
+"+ c None",
+/* pixels */
+"++++++",
+"+++O++",
+"++o ++",
+"++. .+",
+"+ooX +",
+"+O++XO"
+};
diff --git a/data/pixmaps/feta/4/scripts-upbow.xpm b/data/pixmaps/feta/4/scripts-upbow.xpm
new file mode 100644
index 0000000..c27fa61
--- /dev/null
+++ b/data/pixmaps/feta/4/scripts-upbow.xpm
@@ -0,0 +1,22 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"7 10 6 1",
+" c #5a5a5a",
+". c #717171",
+"X c #8d8d8d",
+"o c #b1b1b1",
+"O c #d3d3d3",
+"+ c None",
+/* pixels */
+"+++++++",
+"+O++++O",
+"+Xo++oX",
+"+OX++.O",
+"++ ++ +",
+"++.oo.+",
+"++OXXO+",
+"+++ ++",
+"+++. ++",
+"+++oO++"
+};
diff --git a/data/pixmaps/feta/4/scripts-upedalheel.xpm b/data/pixmaps/feta/4/scripts-upedalheel.xpm
new file mode 100644
index 0000000..a3351a5
--- /dev/null
+++ b/data/pixmaps/feta/4/scripts-upedalheel.xpm
@@ -0,0 +1,18 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"6 6 6 1",
+" c #555555",
+". c Gray49",
+"X c Gray59",
+"o c #a4a4a4",
+"O c #d3d3d3",
+"+ c None",
+/* pixels */
+"++++++",
+"+O+++O",
+"+XO+OX",
+"+XO+OX",
+"+o + o",
+"++o.o+"
+};
diff --git a/data/pixmaps/feta/4/scripts-upedaltoe.xpm b/data/pixmaps/feta/4/scripts-upedaltoe.xpm
new file mode 100644
index 0000000..1aeab50
--- /dev/null
+++ b/data/pixmaps/feta/4/scripts-upedaltoe.xpm
@@ -0,0 +1,20 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"6 7 7 1",
+" c #101010",
+". c #585858",
+"X c Gray47",
+"o c #8d8d8d",
+"O c #b7b7b7",
+"+ c Gray86",
+"@ c None",
+/* pixels */
+"@@@@@@",
+"@@@o@@",
+"@@+ +@",
+"@@oXo@",
+"@@.+.@",
+"@OX@XO",
+"@O+@+O"
+};
diff --git a/data/pixmaps/feta/4/scripts-upmordent.xpm b/data/pixmaps/feta/4/scripts-upmordent.xpm
new file mode 100644
index 0000000..fb0a226
--- /dev/null
+++ b/data/pixmaps/feta/4/scripts-upmordent.xpm
@@ -0,0 +1,23 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"14 9 8 1",
+" c #010101",
+". c Gray20",
+"X c Gray31",
+"o c Gray44",
+"O c Gray56",
+"+ c #a5a5a5",
+"@ c Gray80",
+"# c None",
+/* pixels */
+"##############",
+"#########@####",
+"###.@#oo#X.###",
+"##o .+ OX X+O",
+"#@o+ +. XO #",
+"#+O#OX#@.o#XO#",
+"#oo######@####",
+"#+O###########",
+"##@###########"
+};
diff --git a/data/pixmaps/feta/4/scripts-upprall.xpm b/data/pixmaps/feta/4/scripts-upprall.xpm
new file mode 100644
index 0000000..52411e3
--- /dev/null
+++ b/data/pixmaps/feta/4/scripts-upprall.xpm
@@ -0,0 +1,22 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"14 8 8 1",
+" c Gray4",
+". c #323232",
+"X c Gray34",
+"o c #6f6f6f",
+"O c Gray56",
+"+ c #b7b7b7",
+"@ c Gray81",
+"# c None",
+/* pixels */
+"##############",
+"###+##@@##+###",
+"##O X# @o O@+",
+"##XX o X. @",
+"#@O#X.#+ +#.X#",
+"#oo##@########",
+"#OO###########",
+"##@###########"
+};
diff --git a/data/pixmaps/feta/4/scripts-ustaccatissimo.xpm b/data/pixmaps/feta/4/scripts-ustaccatissimo.xpm
new file mode 100644
index 0000000..fe7b754
--- /dev/null
+++ b/data/pixmaps/feta/4/scripts-ustaccatissimo.xpm
@@ -0,0 +1,17 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"4 6 5 1",
+" c #0e0e0e",
+". c #6f6f6f",
+"X c Gray56",
+"o c Gray79",
+"O c None",
+/* pixels */
+"OOOO",
+"Oo.o",
+"OX X",
+"OO O",
+"OO O",
+"OOXO"
+};
diff --git a/data/pixmaps/feta/4/unknown.xpm b/data/pixmaps/feta/4/unknown.xpm
new file mode 100644
index 0000000..8698b03
--- /dev/null
+++ b/data/pixmaps/feta/4/unknown.xpm
@@ -0,0 +1,16 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"6 8 2 1",
+"x c Gray0",
+" c None",
+/* pixels */
+" xxx ",
+" x ",
+" x ",
+" xx ",
+" x ",
+" ",
+" x ",
+" "
+};
diff --git a/data/pixmaps/feta/6/accidentals-(.xpm b/data/pixmaps/feta/6/accidentals-(.xpm
new file mode 100644
index 0000000..2887b0e
--- /dev/null
+++ b/data/pixmaps/feta/6/accidentals-(.xpm
@@ -0,0 +1,26 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"4 14 6 1",
+" c Gray26",
+". c Gray38",
+"X c Gray56",
+"o c #a2a2a2",
+"O c #c8c8c8",
+"+ c None",
+/* pixels */
+"++++",
+"+++o",
+"++oX",
+"++.+",
+"+O +",
+"+Xo+",
+"+.o+",
+"+.o+",
+"+.o+",
+"+Xo+",
+"+O +",
+"++.+",
+"++oX",
+"+++O"
+};
diff --git a/data/pixmaps/feta/6/accidentals-).xpm b/data/pixmaps/feta/6/accidentals-).xpm
new file mode 100644
index 0000000..428228d
--- /dev/null
+++ b/data/pixmaps/feta/6/accidentals-).xpm
@@ -0,0 +1,26 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"4 14 6 1",
+" c Gray26",
+". c Gray38",
+"X c Gray56",
+"o c #a2a2a2",
+"O c #c8c8c8",
+"+ c None",
+/* pixels */
+"++++",
+"+O++",
+"+Xo+",
+"++.+",
+"++ O",
+"++oX",
+"++o.",
+"++o.",
+"++o.",
+"++oX",
+"++ O",
+"++.+",
+"+Xo+",
+"+O++"
+};
diff --git a/data/pixmaps/feta/6/accidentals--1.xpm b/data/pixmaps/feta/6/accidentals--1.xpm
new file mode 100644
index 0000000..0033ae5
--- /dev/null
+++ b/data/pixmaps/feta/6/accidentals--1.xpm
@@ -0,0 +1,30 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"7 17 7 1",
+" c #040404",
+". c #282828",
+"X c #6f6f6f",
+"o c #888888",
+"O c #b4b4b4",
+"+ c #c5c5c5",
+"@ c None",
+/* pixels */
+"@@@@@@@",
+"@+O@@@@",
+"@XX@@@@",
+"@XX@@@@",
+"@XX@@@@",
+"@XX@@@@",
+"@XX@@@@",
+"@XX@@@@",
+"@XX@@@@",
+"@XX+XO@",
+"@o +",
+"@o.@O o",
+"@XX@@ O",
+"@XX@Xo@",
+"@XXXO@@",
+"@o O@@@",
+"@OO@@@@"
+};
diff --git a/data/pixmaps/feta/6/accidentals--2.xpm b/data/pixmaps/feta/6/accidentals--2.xpm
new file mode 100644
index 0000000..813f6ea
--- /dev/null
+++ b/data/pixmaps/feta/6/accidentals--2.xpm
@@ -0,0 +1,31 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"11 17 8 1",
+" c Gray4",
+". c Gray21",
+"X c #515151",
+"o c #727272",
+"O c Gray54",
+"+ c Gray70",
+"@ c #c5c5c5",
+"# c None",
+/* pixels */
+"###########",
+"#@+##O@####",
+"#oo## o####",
+"#oo## +####",
+"#oo## @####",
+"#oo## #####",
+"#oo##.#####",
+"#oo#@ #####",
+"#oo##X#####",
+"#oo@oX#+o+#",
+"#O . +",
+"#oX#X O#X O",
+"#oo#o ##o @",
+"#oo+ X##.+#",
+"#O X@+O.+##",
+"#o.##o +###",
+"#@+##++####"
+};
diff --git a/data/pixmaps/feta/6/accidentals-0.xpm b/data/pixmaps/feta/6/accidentals-0.xpm
new file mode 100644
index 0000000..1cd3b38
--- /dev/null
+++ b/data/pixmaps/feta/6/accidentals-0.xpm
@@ -0,0 +1,31 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"6 19 6 1",
+" c #060606",
+". c #2f2f2f",
+"X c #5f5f5f",
+"o c Gray57",
+"O c Gray84",
+"+ c None",
+/* pixels */
+"++++++",
+"+O++++",
+"+oO+++",
+"+oO+++",
+"+oO+++",
+"+oXo.o",
+"+o o",
+"+o o",
+"+oO+Oo",
+"+oO+Oo",
+"+oO+Oo",
+"+oO+Oo",
+"+o o",
+"+o o",
+"+o.oXo",
+"++++Oo",
+"++++Oo",
+"++++Oo",
+"+++++O"
+};
diff --git a/data/pixmaps/feta/6/accidentals-1.xpm b/data/pixmaps/feta/6/accidentals-1.xpm
new file mode 100644
index 0000000..d44e4f4
--- /dev/null
+++ b/data/pixmaps/feta/6/accidentals-1.xpm
@@ -0,0 +1,34 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"8 20 8 1",
+" c #020202",
+". c #2d2d2d",
+"X c Gray31",
+"o c #777777",
+"O c Gray59",
+"+ c Gray66",
+"@ c #c6c6c6",
+"# c None",
+/* pixels */
+"########",
+"#####@##",
+"##@@#+@#",
+"##@+#+@#",
+"##@+#+@#",
+"##++#+X@",
+"##@Oo o",
+"#@. .@",
+"#o oO@#",
+"#@XO#++#",
+"##@+#+@#",
+"##@+#OX@",
+"##@Oo o",
+"#@. .@",
+"#o oO@#",
+"#@XO#++#",
+"##@+#+@#",
+"##@+#+@#",
+"##@+#@@#",
+"##@@####"
+};
diff --git a/data/pixmaps/feta/6/accidentals-2.xpm b/data/pixmaps/feta/6/accidentals-2.xpm
new file mode 100644
index 0000000..8ecbe47
--- /dev/null
+++ b/data/pixmaps/feta/6/accidentals-2.xpm
@@ -0,0 +1,20 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"8 8 6 1",
+" c #0e0e0e",
+". c #767676",
+"X c Gray54",
+"o c Gray75",
+"O c Gray80",
+"+ c None",
+/* pixels */
+"++++++++",
+"+O.o+O.O",
+"+X + X",
+"+O . o",
+"+++. .++",
+"+o . o",
+"+X O X",
+"+O.O+o.O"
+};
diff --git a/data/pixmaps/feta/6/accordion-accBB.xpm b/data/pixmaps/feta/6/accordion-accBB.xpm
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/pixmaps/feta/6/accordion-accBB.xpm
diff --git a/data/pixmaps/feta/6/accordion-accBayanbase.xpm b/data/pixmaps/feta/6/accordion-accBayanbase.xpm
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/pixmaps/feta/6/accordion-accBayanbase.xpm
diff --git a/data/pixmaps/feta/6/accordion-accDiscant.xpm b/data/pixmaps/feta/6/accordion-accDiscant.xpm
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/pixmaps/feta/6/accordion-accDiscant.xpm
diff --git a/data/pixmaps/feta/6/accordion-accDot.xpm b/data/pixmaps/feta/6/accordion-accDot.xpm
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/pixmaps/feta/6/accordion-accDot.xpm
diff --git a/data/pixmaps/feta/6/accordion-accFreebase.xpm b/data/pixmaps/feta/6/accordion-accFreebase.xpm
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/pixmaps/feta/6/accordion-accFreebase.xpm
diff --git a/data/pixmaps/feta/6/accordion-accOldEE.xpm b/data/pixmaps/feta/6/accordion-accOldEE.xpm
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/pixmaps/feta/6/accordion-accOldEE.xpm
diff --git a/data/pixmaps/feta/6/accordion-accOldEES.xpm b/data/pixmaps/feta/6/accordion-accOldEES.xpm
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/pixmaps/feta/6/accordion-accOldEES.xpm
diff --git a/data/pixmaps/feta/6/accordion-accSB.xpm b/data/pixmaps/feta/6/accordion-accSB.xpm
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/pixmaps/feta/6/accordion-accSB.xpm
diff --git a/data/pixmaps/feta/6/accordion-accStdbase.xpm b/data/pixmaps/feta/6/accordion-accStdbase.xpm
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/pixmaps/feta/6/accordion-accStdbase.xpm
diff --git a/data/pixmaps/feta/6/clefs-C.xpm b/data/pixmaps/feta/6/clefs-C.xpm
new file mode 100644
index 0000000..74f0e4e
--- /dev/null
+++ b/data/pixmaps/feta/6/clefs-C.xpm
@@ -0,0 +1,39 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"18 25 8 1",
+" c #040404",
+". c Gray21",
+"X c #515151",
+"o c #747474",
+"O c #909090",
+"+ c #b1b1b1",
+"@ c #cdcdcd",
+"# c None",
+/* pixels */
+"##################",
+"##########+oo+####",
+"#O OOo##oXo .+##",
+"#O OOX#. @##X +#",
+"#O Ooo@ .##O #",
+"#O Ooo+ ### +",
+"#O Ooo#o @### O",
+"#O +OX####### O",
+"#O OOX#XO#### O",
+"#O Ooo# o###@ @",
+"#O OOo# @##o o#",
+"#O OooO ..X. O##",
+"#O OO #@o.O@###",
+"#O OO ###@@####",
+"#O OOXX +o o###",
+"#O Ooo+ o@@. @#",
+"#O Ooo# o###+ #",
+"#O OOo# o#### +",
+"#O OOX#+@#### O",
+"#O Ooo#@+#### O",
+"#O Ooo@ o### +",
+"#O OOOO ##@ #",
+"#O OOo# +##X +#",
+"#O Ooo#+ oo .+##",
+"#@oo@@+###ooo+####"
+};
diff --git a/data/pixmaps/feta/6/clefs-C_change.xpm b/data/pixmaps/feta/6/clefs-C_change.xpm
new file mode 100644
index 0000000..6e595fe
--- /dev/null
+++ b/data/pixmaps/feta/6/clefs-C_change.xpm
@@ -0,0 +1,34 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"14 20 8 1",
+" c #010101",
+". c Gray19",
+"X c #565656",
+"o c #6f6f6f",
+"O c Gray53",
+"+ c Gray69",
+"@ c #c8c8c8",
+"# c None",
+/* pixels */
+"##############",
+"########Oo+###",
+"#O .@+#oXo .##",
+"#O .@+O ##+ .#",
+"#O .@+o X##. +",
+"#O .@++ +##. O",
+"#O .@+#+###. o",
+"#O .@++.###. @",
+"#O .++X +#+ o#",
+"#O .@X ....o##",
+"#O .@ @#+@###",
+"#O .@. OO.X+##",
+"#O .@O. X@O o#",
+"#O .@+o.###. @",
+"#O .@+@o###. o",
+"#O .++#O###. O",
+"#O .@+o X##. +",
+"#O .@+X O#+ .#",
+"#O .@+#.oo .##",
+"#@o+#@#@oX+###"
+};
diff --git a/data/pixmaps/feta/6/clefs-F.xpm b/data/pixmaps/feta/6/clefs-F.xpm
new file mode 100644
index 0000000..48ae4b2
--- /dev/null
+++ b/data/pixmaps/feta/6/clefs-F.xpm
@@ -0,0 +1,35 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"18 21 8 1",
+" c #040404",
+". c #353535",
+"X c #484848",
+"o c #7b7b7b",
+"O c Gray54",
+"+ c Gray71",
+"@ c #c6c6c6",
+"# c None",
+/* pixels */
+"##################",
+"######+OOo+#######",
+"####+.o@#O .@#####",
+"###+ +####O +#+o#",
+"###..###### X# O",
+"##+ +####X @@ +",
+"##o X####o O###",
+"##o ####o O###",
+"##+ ####O o###",
+"###X +####o O@ +",
+"########### # O",
+"##########+ X#+o#",
+"##########X +####",
+"#########o X#####",
+"########+ X######",
+"#######+ X#######",
+"######+ O########",
+"#####X .@#########",
+"###+..@###########",
+"##o.+#############",
+"#@O###############"
+};
diff --git a/data/pixmaps/feta/6/clefs-F_change.xpm b/data/pixmaps/feta/6/clefs-F_change.xpm
new file mode 100644
index 0000000..6cb9327
--- /dev/null
+++ b/data/pixmaps/feta/6/clefs-F_change.xpm
@@ -0,0 +1,31 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"15 17 8 1",
+" c Gray3",
+". c Gray19",
+"X c Gray33",
+"o c #747474",
+"O c #939393",
+"+ c Gray68",
+"@ c #d3d3d3",
+"# c None",
+/* pixels */
+"###############",
+"#####+ooo######",
+"####. oO. +####",
+"###.X####X +@ +",
+"##+ X+###O o@ O",
+"##o +### ###",
+"##o o### ###",
+"##@. @### #@@",
+"###@+@###@ o+ O",
+"#########o @#o@",
+"######### X####",
+"########X.#####",
+"#######X.######",
+"#####@XX@######",
+"####O.O########",
+"##oXO##########",
+"#@O############"
+};
diff --git a/data/pixmaps/feta/6/clefs-G.xpm b/data/pixmaps/feta/6/clefs-G.xpm
new file mode 100644
index 0000000..e121ee9
--- /dev/null
+++ b/data/pixmaps/feta/6/clefs-G.xpm
@@ -0,0 +1,60 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"17 46 8 1",
+" c #070707",
+". c Gray20",
+"X c #4b4b4b",
+"o c #747474",
+"O c Gray54",
+"+ c #b2b2b2",
+"@ c #d2d2d2",
+"# c None",
+/* pixels */
+"#################",
+"##########O######",
+"#########X O#####",
+"########+ #####",
+"######## o####",
+"#######o OO ####",
+"####### X## +###",
+"######+ @## o###",
+"######O o### ###",
+"######O +### ###",
+"######O ###+ ###",
+"######O ###o ###",
+"######@ ### o###",
+"####### @#o +###",
+"####### O@ X####",
+"#######ooX +####",
+"#######o O#####",
+"#######X X######",
+"######o X#######",
+"#####+ @#######",
+"####+ .o#######",
+"#### @oo#######",
+"###X +#oo#######",
+"##+ X##+ @######",
+"##X ##@X O####",
+"## o#+ +##",
+"#O @# ..O +#",
+"#O X#O X#oo##X X#",
+"#O O#o ##oo###X @",
+"#O o#O ##+ ###+ O",
+"## o## o#@ #### O",
+"##. @#+ +#.@### +",
+"##+ o##+.+oo##+.#",
+"###+ +####oo##.+#",
+"####+.Xo@#o.+X+##",
+"######+X . o@###",
+"##########@ #####",
+"########### +####",
+"###########oo####",
+"####X +###+o####",
+"###+ ###@O####",
+"###o ###@O####",
+"###O ###+O####",
+"#### +###X@####",
+"####+ o++.+#####",
+"######OoOO@######"
+};
diff --git a/data/pixmaps/feta/6/clefs-G_change.xpm b/data/pixmaps/feta/6/clefs-G_change.xpm
new file mode 100644
index 0000000..480086d
--- /dev/null
+++ b/data/pixmaps/feta/6/clefs-G_change.xpm
@@ -0,0 +1,51 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"14 37 8 1",
+" c #060606",
+". c #2f2f2f",
+"X c #4e4e4e",
+"o c Gray46",
+"O c Gray55",
+"+ c Gray68",
+"@ c #cecece",
+"# c None",
+/* pixels */
+"##############",
+"########+#####",
+"#######o @####",
+"######O X####",
+"###### ..@###",
+"#####@ @+X###",
+"#####X O#+ ###",
+"#####X @#+ @##",
+"#####X.##O @##",
+"#####X.##. ###",
+"#####+.#@ .###",
+"#####@.#X +###",
+"######.X .####",
+"######X +####",
+"#####@ +#####",
+"####@ .######",
+"####X X######",
+"###o X@ @#####",
+"##@ ##.+#####",
+"##X +#@..X+###",
+"#@ .#+ o##",
+"#O +#. X o#",
+"#o ## X+ #@X @",
+"#o #@ +#.+#+ O",
+"#@.##.o#.O## o",
+"##XO#@ O.X## o",
+"##@.@#@XoX#+ @",
+"###@.o@#+ O.O#",
+"#####oX. .O##",
+"#######@@.@###",
+"#########.X###",
+"####O+###Oo###",
+"###X O##+@###",
+"##@ .##++###",
+"###. @##X####",
+"####. O+XO####",
+"#####+oo@#####"
+};
diff --git a/data/pixmaps/feta/6/clefs-hufnagel_do.xpm b/data/pixmaps/feta/6/clefs-hufnagel_do.xpm
new file mode 100644
index 0000000..1e4bd09
--- /dev/null
+++ b/data/pixmaps/feta/6/clefs-hufnagel_do.xpm
@@ -0,0 +1,24 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"8 10 8 1",
+" c #040404",
+". c Gray22",
+"X c Gray29",
+"o c #7b7b7b",
+"O c Gray60",
+"+ c Gray73",
+"@ c Gray80",
+"# c None",
+/* pixels */
+"########",
+"####@O##",
+"##@X .+",
+"#@. X#",
+"#o .+@##",
+"#o .####",
+"#o .####",
+"#o O###",
+"#o +###",
+"##o@####"
+};
diff --git a/data/pixmaps/feta/6/clefs-hufnagel_do_change.xpm b/data/pixmaps/feta/6/clefs-hufnagel_do_change.xpm
new file mode 100644
index 0000000..2efcd7e
--- /dev/null
+++ b/data/pixmaps/feta/6/clefs-hufnagel_do_change.xpm
@@ -0,0 +1,22 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"7 9 7 1",
+" c Gray1",
+". c Gray28",
+"X c Gray49",
+"o c Gray55",
+"O c #b7b7b7",
+"+ c Gray76",
+"@ c None",
+/* pixels */
+"@@@@@@@",
+"@@@+XO@",
+"@@O +",
+"@+ O@",
+"@o X@@@",
+"@o o@@@",
+"@o O@@",
+"@o .@@@",
+"@@o@@@@"
+};
diff --git a/data/pixmaps/feta/6/clefs-hufnagel_do_fa.xpm b/data/pixmaps/feta/6/clefs-hufnagel_do_fa.xpm
new file mode 100644
index 0000000..1783328
--- /dev/null
+++ b/data/pixmaps/feta/6/clefs-hufnagel_do_fa.xpm
@@ -0,0 +1,39 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"8 25 8 1",
+" c #020202",
+". c #2f2f2f",
+"X c Gray31",
+"o c #797979",
+"O c #868686",
+"+ c #aeaeae",
+"@ c #cacaca",
+"# c None",
+/* pixels */
+"########",
+"####@+##",
+"###X X+",
+"##. .#",
+"#O .o+##",
+"#o .####",
+"#o .####",
+"#O .@###",
+"#o O###",
+"#+ o####",
+"########",
+"####@+##",
+"###X X@",
+"##. X#",
+"#O .O+##",
+"#o .####",
+"#o ...o+",
+"#o .#",
+"#o .Oo@#",
+"#O .####",
+"#o .####",
+"#O .####",
+"#O X####",
+"#o @####",
+"#+@#####"
+};
diff --git a/data/pixmaps/feta/6/clefs-hufnagel_do_fa_change.xpm b/data/pixmaps/feta/6/clefs-hufnagel_do_fa_change.xpm
new file mode 100644
index 0000000..ca15e0b
--- /dev/null
+++ b/data/pixmaps/feta/6/clefs-hufnagel_do_fa_change.xpm
@@ -0,0 +1,37 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"7 23 8 1",
+" c Gray1",
+". c #202020",
+"X c Gray31",
+"o c Gray47",
+"O c #8d8d8d",
+"+ c Gray70",
+"@ c Gray81",
+"# c None",
+/* pixels */
+"#######",
+"###+O@#",
+"##O +",
+"#+ O#",
+"#o +###",
+"#O +###",
+"#o .###",
+"#O o###",
+"##O####",
+"#######",
+"#######",
+"###@O##",
+"##O +",
+"#+ O#",
+"#o +###",
+"#o X.X@",
+"#o .#",
+"#o XO@#",
+"#O +###",
+"#o +###",
+"#o +###",
+"#oX####",
+"#@#####"
+};
diff --git a/data/pixmaps/feta/6/clefs-hufnagel_fa.xpm b/data/pixmaps/feta/6/clefs-hufnagel_fa.xpm
new file mode 100644
index 0000000..f728313
--- /dev/null
+++ b/data/pixmaps/feta/6/clefs-hufnagel_fa.xpm
@@ -0,0 +1,29 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"8 15 8 1",
+" c #040404",
+". c #373737",
+"X c #4c4c4c",
+"o c Gray47",
+"O c #9a9a9a",
+"+ c #b2b2b2",
+"@ c Gray79",
+"# c None",
+/* pixels */
+"########",
+"####@O##",
+"###O X+",
+"## .#",
+"#o .+@##",
+"#o X####",
+"#o . o#",
+"#o X#",
+"#O .oX##",
+"#o .####",
+"#o .####",
+"#o .####",
+"#O .####",
+"#o.#####",
+"#@######"
+};
diff --git a/data/pixmaps/feta/6/clefs-hufnagel_fa_change.xpm b/data/pixmaps/feta/6/clefs-hufnagel_fa_change.xpm
new file mode 100644
index 0000000..ec04757
--- /dev/null
+++ b/data/pixmaps/feta/6/clefs-hufnagel_fa_change.xpm
@@ -0,0 +1,27 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"7 13 8 1",
+" c #010101",
+". c Gray17",
+"X c #4b4b4b",
+"o c #767676",
+"O c Gray54",
+"+ c #b4b4b4",
+"@ c #c5c5c5",
+"# c None",
+/* pixels */
+"#######",
+"####+##",
+"###. .#",
+"##. O#",
+"#O O+##",
+"#O oXX@",
+"#o .#",
+"#o XO@#",
+"#O +###",
+"#o +###",
+"#o +###",
+"#oX####",
+"#@#####"
+};
diff --git a/data/pixmaps/feta/6/clefs-medicaea_do.xpm b/data/pixmaps/feta/6/clefs-medicaea_do.xpm
new file mode 100644
index 0000000..04eedf3
--- /dev/null
+++ b/data/pixmaps/feta/6/clefs-medicaea_do.xpm
@@ -0,0 +1,33 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"8 20 7 1",
+" c #020202",
+". c #323232",
+"X c #444444",
+"o c Gray57",
+"O c Gray72",
+"+ c #d3d3d3",
+"@ c None",
+/* pixels */
+"@@@@@@@@",
+"@+@@@@@@",
+"@o+@@@@@",
+"@o+@@@@@",
+"@o+@@@@@",
+"@o.+@@@@",
+"@o .O@@",
+"@o .+",
+"@ooX o",
+"@o+@OX o",
+"@oo@@@OO",
+"@o XO@@@",
+"@o XO@",
+"@o. o",
+"@o++. o",
+"@o+@@O.o",
+"@o+@@@@@",
+"@o+@@@@@",
+"@o+@@@@@",
+"@+@@@@@@"
+};
diff --git a/data/pixmaps/feta/6/clefs-medicaea_do_change.xpm b/data/pixmaps/feta/6/clefs-medicaea_do_change.xpm
new file mode 100644
index 0000000..72c9a83
--- /dev/null
+++ b/data/pixmaps/feta/6/clefs-medicaea_do_change.xpm
@@ -0,0 +1,29 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"7 16 7 1",
+" c Gray1",
+". c Gray18",
+"X c #464646",
+"o c Gray57",
+"O c #b7b7b7",
+"+ c Gray82",
+"@ c None",
+/* pixels */
+"@@@@@@@",
+"@+@@@@@",
+"@o+@@@@",
+"@oo@@@@",
+"@o X+@@",
+"@o .+",
+"@ooX o",
+"@o+@+.o",
+"@o+@@@@",
+"@o.+@@@",
+"@o XO@",
+"@o. o",
+"@o++. o",
+"@o+@@OO",
+"@o+@@@@",
+"@+@@@@@"
+};
diff --git a/data/pixmaps/feta/6/clefs-medicaea_fa.xpm b/data/pixmaps/feta/6/clefs-medicaea_fa.xpm
new file mode 100644
index 0000000..4f42fe4
--- /dev/null
+++ b/data/pixmaps/feta/6/clefs-medicaea_fa.xpm
@@ -0,0 +1,34 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"12 20 8 1",
+" c #040404",
+". c Gray20",
+"X c #444444",
+"o c Gray46",
+"O c #8d8d8d",
+"+ c Gray72",
+"@ c Gray82",
+"# c None",
+/* pixels */
+"############",
+"#####@######",
+"#####O@#####",
+"#####O@#####",
+"#####O@#####",
+"#####o.@####",
+"#####o .@##",
+"#@oO#O .@",
+"#O #OOX O",
+"#O #O@#+X O",
+"#O #OO###++",
+"#O #O .+###",
+"#O #O .+#",
+"###O#O. O",
+"###O#O@@. O",
+"###O#O@##@.O",
+"###O#O@#####",
+"###O#O@#####",
+"###O#O@#####",
+"###@#@######"
+};
diff --git a/data/pixmaps/feta/6/clefs-medicaea_fa_change.xpm b/data/pixmaps/feta/6/clefs-medicaea_fa_change.xpm
new file mode 100644
index 0000000..8d6159d
--- /dev/null
+++ b/data/pixmaps/feta/6/clefs-medicaea_fa_change.xpm
@@ -0,0 +1,30 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"10 16 8 1",
+" c Gray1",
+". c Gray19",
+"X c #535353",
+"o c #6c6c6c",
+"O c #8e8e8e",
+"+ c #aeaeae",
+"@ c #cbcbcb",
+"# c None",
+/* pixels */
+"##########",
+"####@#####",
+"####O#####",
+"####oO####",
+"####X .+##",
+"####X .#",
+"#O +O@X O",
+"#O +O##@.+",
+"#O +O#####",
+"#O +oX@###",
+"#@X+o o##",
+"##@+o. @",
+"##@+O#O. O",
+"##@+O###O#",
+"##++O#####",
+"###@@#####"
+};
diff --git a/data/pixmaps/feta/6/clefs-mensural1_c.xpm b/data/pixmaps/feta/6/clefs-mensural1_c.xpm
new file mode 100644
index 0000000..d97abf4
--- /dev/null
+++ b/data/pixmaps/feta/6/clefs-mensural1_c.xpm
@@ -0,0 +1,38 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"16 25 7 1",
+" c #0b0b0b",
+". c Gray17",
+"X c Gray49",
+"o c #979797",
+"O c Gray75",
+"+ c #c6c6c6",
+"@ c None",
+/* pixels */
+"@@@@@@@@@@@@@@@@",
+"@+@o@@@@@@@@@o@+",
+"@oO.@@@@@@@@@.Oo",
+"@oO.@@@@@@@@@.+o",
+"@oO.@@@@@@@@@.+o",
+"@o+.@@@@@@@@@.+o",
+"@o+.@@@@@@@@@.+o",
+"@o+.@@@@@@@@@.+o",
+"@o+.@@@@@@@@@.+o",
+"@o+ XXXXOoXXX +o",
+"@o+ X +o",
+"@o+ X +o",
+"@o+.@@@@@@@@@.+o",
+"@o+.@@@@@@@@@.+o",
+"@o+ X +o",
+"@o+ X +o",
+"@o+ oXXoOoXXX +o",
+"@o+.@@@@@@@@@.+o",
+"@o+.@@@@@@@@@.Oo",
+"@o+.@@@@@@@@@.Oo",
+"@oO.@@@@@@@@@.+o",
+"@oO.@@@@@@@@@.+o",
+"@o+.@@@@@@@@@.+o",
+"@o+.@@@@@@@@@.Oo",
+"@+@o@@@@@@@@@o@+"
+};
diff --git a/data/pixmaps/feta/6/clefs-mensural1_c_change.xpm b/data/pixmaps/feta/6/clefs-mensural1_c_change.xpm
new file mode 100644
index 0000000..77919b0
--- /dev/null
+++ b/data/pixmaps/feta/6/clefs-mensural1_c_change.xpm
@@ -0,0 +1,31 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"14 20 5 1",
+" c Gray6",
+". c Gray60",
+"X c #b6b6b6",
+"o c #d2d2d2",
+"O c None",
+/* pixels */
+"OOOOOOOOOOOOOO",
+"OoooOOOOOOOooo",
+"O.X.OOOOOOO.o.",
+"O.X.OOOOOOO.X.",
+"O.X.OOOOOOO.X.",
+"O.X.OOOOOOO.X.",
+"O.o.OOOOOOO.o.",
+"O.X.OOOOOOO.X.",
+"O.o o.",
+"O.o o.",
+"O.X.OoooooO.X.",
+"O.o o.",
+"O.o o.",
+"O.X.OOoOOOO.X.",
+"O.X.OOOOOOO.X.",
+"O.X.OOOOOOO.X.",
+"O.X.OOOOOOO.X.",
+"O.o.OOOOOOO.X.",
+"O.X.OOOOOOO.XX",
+"OoooOOOOOOOooo"
+};
diff --git a/data/pixmaps/feta/6/clefs-mensural1_f.xpm b/data/pixmaps/feta/6/clefs-mensural1_f.xpm
new file mode 100644
index 0000000..9be21ad
--- /dev/null
+++ b/data/pixmaps/feta/6/clefs-mensural1_f.xpm
@@ -0,0 +1,48 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"14 34 8 1",
+" c Gray4",
+". c #323232",
+"X c #535353",
+"o c #717171",
+"O c #8d8d8d",
+"+ c #aeaeae",
+"@ c #dadada",
+"# c None",
+/* pixels */
+"##############",
+"##########++##",
+"########## .##",
+"#########X. o#",
+"#oX#@@ #+X# @",
+"#O #.o#O @",
+"#O @ ++X#",
+"#o.+OO #@ . @#",
+"#oo### @#X @#",
+"#O oXX ##X o#",
+"#O #OX#. @",
+"#O ... @ .#+ #",
+"#OO###.#X +oo#",
+"######O@@ X##",
+"######O@#O @##",
+"######O@#@O###",
+"######O@#@O###",
+"######O@#@O###",
+"######O@#@O###",
+"######O@#@O###",
+"######O@#@O###",
+"######O@#@O###",
+"######O@#@O###",
+"######O@#@O###",
+"######O@#@O###",
+"######O@#@O###",
+"######O@#@O###",
+"######O@#@O###",
+"######O@#@O###",
+"######O@#@O###",
+"######O@#@O###",
+"#########@O###",
+"#########@O###",
+"##########@###"
+};
diff --git a/data/pixmaps/feta/6/clefs-mensural1_f_change.xpm b/data/pixmaps/feta/6/clefs-mensural1_f_change.xpm
new file mode 100644
index 0000000..943f427
--- /dev/null
+++ b/data/pixmaps/feta/6/clefs-mensural1_f_change.xpm
@@ -0,0 +1,42 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"11 28 8 1",
+" c #060606",
+". c Gray19",
+"X c Gray29",
+"o c Gray43",
+"O c Gray56",
+"+ c #afafaf",
+"@ c #d0d0d0",
+"# c None",
+/* pixels */
+"###########",
+"########O@#",
+"#######+ o#",
+"#######oO @",
+"#O@#@O+.# +",
+"#O X@ +o#",
+"#O ..X#X +#",
+"#O@@@o#+ @#",
+"#o .#O .#",
+"#O ..X@X@ O",
+"#+###Oo.#X+",
+"#####O@ .o#",
+"#####O#O ##",
+"#####o#OX##",
+"#####O#OX##",
+"#####O#OX##",
+"#####o#OX##",
+"#####O#+X##",
+"#####O#OX##",
+"#####O#OX##",
+"#####o#OX##",
+"#####O#+X##",
+"#####O#OX##",
+"#####O#OX##",
+"#####O#OX##",
+"#####+#OX##",
+"#######OX##",
+"#######@+##"
+};
diff --git a/data/pixmaps/feta/6/clefs-mensural2_c.xpm b/data/pixmaps/feta/6/clefs-mensural2_c.xpm
new file mode 100644
index 0000000..252eca2
--- /dev/null
+++ b/data/pixmaps/feta/6/clefs-mensural2_c.xpm
@@ -0,0 +1,39 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"7 25 8 1",
+" c #020202",
+". c #393939",
+"X c Gray27",
+"o c #6c6c6c",
+"O c #8e8e8e",
+"+ c #b9b9b9",
+"@ c #cacaca",
+"# c None",
+/* pixels */
+"#######",
+"#+@##@+",
+"#oO##Oo",
+"#oO##Oo",
+"#oO##Oo",
+"#oO##Oo",
+"#oO##Oo",
+"#oO##oo",
+"#o o",
+"#o.OO.o",
+"#oO##Oo",
+"#o O",
+"#oXOOXo",
+"#oX+OXo",
+"#o o",
+"#oO##Oo",
+"#o.OO.o",
+"#o o",
+"#oO##Oo",
+"#oO##Oo",
+"#oO##Oo",
+"#oO##Oo",
+"#oO##Oo",
+"#oO##Oo",
+"#++##@+"
+};
diff --git a/data/pixmaps/feta/6/clefs-mensural2_c_change.xpm b/data/pixmaps/feta/6/clefs-mensural2_c_change.xpm
new file mode 100644
index 0000000..c57f7c1
--- /dev/null
+++ b/data/pixmaps/feta/6/clefs-mensural2_c_change.xpm
@@ -0,0 +1,32 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"6 21 5 1",
+" c Gray0",
+". c #767676",
+"X c #929292",
+"o c Gray80",
+"O c None",
+/* pixels */
+"OOOOOO",
+"OoOOOo",
+"OXOOOX",
+"OXOOOX",
+"OXOOOX",
+"OXOOoX",
+"O. . .",
+"OX.o.X",
+"OXOOOX",
+"O. . .",
+"OX.o.X",
+"OX.o.X",
+"O. X .",
+"OXOOOX",
+"OX.o..",
+"O. . .",
+"OXOOOX",
+"OXOOOX",
+"OXOOOX",
+"OXOOOX",
+"OoOOOo"
+};
diff --git a/data/pixmaps/feta/6/clefs-mensural2_f.xpm b/data/pixmaps/feta/6/clefs-mensural2_f.xpm
new file mode 100644
index 0000000..0dad4cc
--- /dev/null
+++ b/data/pixmaps/feta/6/clefs-mensural2_f.xpm
@@ -0,0 +1,24 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"10 10 8 1",
+" c Gray2",
+". c Gray21",
+"X c #444444",
+"o c #767676",
+"O c #8b8b8b",
+"+ c #b4b4b4",
+"@ c #c5c5c5",
+"# c None",
+/* pixels */
+"##########",
+"##O+###O##",
+"#O X#O @",
+"##@X O#oX#",
+"#### ####",
+"####o ####",
+"####o.####",
+"####.+@.+#",
+"#+ +#+ #",
+"#@o####+O#"
+};
diff --git a/data/pixmaps/feta/6/clefs-mensural2_f_change.xpm b/data/pixmaps/feta/6/clefs-mensural2_f_change.xpm
new file mode 100644
index 0000000..20f326f
--- /dev/null
+++ b/data/pixmaps/feta/6/clefs-mensural2_f_change.xpm
@@ -0,0 +1,24 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"9 10 8 1",
+" c #060606",
+". c Gray24",
+"X c #444444",
+"o c #747474",
+"O c Gray55",
+"+ c #b1b1b1",
+"@ c Gray80",
+"# c None",
+/* pixels */
+"#########",
+"##o@##@+#",
+"#@ o#o +",
+"###O @#o+",
+"####.X###",
+"####+.###",
+"####+o###",
+"###@.#+o#",
+"#@oX@#O O",
+"#@o####@#"
+};
diff --git a/data/pixmaps/feta/6/clefs-mensural3_c.xpm b/data/pixmaps/feta/6/clefs-mensural3_c.xpm
new file mode 100644
index 0000000..540d579
--- /dev/null
+++ b/data/pixmaps/feta/6/clefs-mensural3_c.xpm
@@ -0,0 +1,44 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"7 30 8 1",
+" c Gray2",
+". c Gray18",
+"X c Gray34",
+"o c Gray43",
+"O c #8d8d8d",
+"+ c #bbbbbb",
+"@ c #d0d0d0",
+"# c None",
+/* pixels */
+"#######",
+"#+@##@+",
+"#oO##Oo",
+"#oO##Oo",
+"#oO##Oo",
+"#oO##OX",
+"#oO##Oo",
+"#oo##oo",
+"#o o",
+"#oX+@Xo",
+"#oo##oo",
+"#o o",
+"#oo@@oo",
+"#o XX o",
+"#o .. o",
+"#oO##Oo",
+"#o .. o",
+"#o XX.o",
+"#oo@@oo",
+"#o o",
+"#oo##oo",
+"#oX++Xo",
+"#o o",
+"#oo##oo",
+"#oO##Oo",
+"#oO##Oo",
+"#oO##Oo",
+"#oO##Oo",
+"#oO##OX",
+"#+@##@+"
+};
diff --git a/data/pixmaps/feta/6/clefs-mensural3_c_change.xpm b/data/pixmaps/feta/6/clefs-mensural3_c_change.xpm
new file mode 100644
index 0000000..552039c
--- /dev/null
+++ b/data/pixmaps/feta/6/clefs-mensural3_c_change.xpm
@@ -0,0 +1,40 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"6 26 8 1",
+" c #060606",
+". c #343434",
+"X c #565656",
+"o c Gray47",
+"O c #929292",
+"+ c #b2b2b2",
+"@ c Gray82",
+"# c None",
+/* pixels */
+"######",
+"#@###@",
+"#O##@O",
+"#O###O",
+"#O###O",
+"#O@#@O",
+"#o o",
+"#OO+OO",
+"#O@#@O",
+"#o o",
+"#O+@+O",
+"#O.X.O",
+"#o . o",
+"#O###O",
+"#o . o",
+"#O.X.O",
+"#O+@+O",
+"#o o",
+"#O@#@O",
+"#OO+OO",
+"#o o",
+"#O@#@O",
+"#O###O",
+"#O@##O",
+"#O###O",
+"#@###@"
+};
diff --git a/data/pixmaps/feta/6/clefs-mensural_g.xpm b/data/pixmaps/feta/6/clefs-mensural_g.xpm
new file mode 100644
index 0000000..501c19f
--- /dev/null
+++ b/data/pixmaps/feta/6/clefs-mensural_g.xpm
@@ -0,0 +1,29 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"9 15 8 1",
+" c #060606",
+". c #323232",
+"X c Gray31",
+"o c #717171",
+"O c #868686",
+"+ c Gray72",
+"@ c #c3c3c3",
+"# c None",
+/* pixels */
+"#########",
+"#####++##",
+"##### .##",
+"##### .+#",
+"#####+ +",
+"####o##Xo",
+"###X o o",
+"##o . +",
+"## @O X##",
+"#oo#o X#",
+"#oX#oo@ #",
+"#O #oo# #",
+"## X.o+.#",
+"##+ +#",
+"####@o@##"
+};
diff --git a/data/pixmaps/feta/6/clefs-mensural_g_change.xpm b/data/pixmaps/feta/6/clefs-mensural_g_change.xpm
new file mode 100644
index 0000000..b3d89b3
--- /dev/null
+++ b/data/pixmaps/feta/6/clefs-mensural_g_change.xpm
@@ -0,0 +1,27 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"7 13 8 1",
+" c Gray1",
+". c #252525",
+"X c #565656",
+"o c #6c6c6c",
+"O c #959595",
+"+ c Gray70",
+"@ c #cecece",
+"# c None",
+/* pixels */
+"#######",
+"####O@#",
+"###@ o#",
+"###@ O#",
+"####O +",
+"###.X o",
+"##. X.+",
+"#OoX O#",
+"#oOo #",
+"#oOX++@",
+"#@..@o@",
+"##O X#",
+"####O@#"
+};
diff --git a/data/pixmaps/feta/6/clefs-percussion.xpm b/data/pixmaps/feta/6/clefs-percussion.xpm
new file mode 100644
index 0000000..7827bdc
--- /dev/null
+++ b/data/pixmaps/feta/6/clefs-percussion.xpm
@@ -0,0 +1,26 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"9 13 7 1",
+" c Gray0",
+". c Gray21",
+"X c Gray49",
+"o c #818181",
+"O c #a2a2a2",
+"+ c Gray77",
+"@ c None",
+/* pixels */
+"@@@@@@@@@",
+"@+XO@@OX+",
+"@X .@@. X",
+"@o .@@. o",
+"@X .@@. X",
+"@X .@@. X",
+"@X .@@. X",
+"@X .@@. X",
+"@X .@@. X",
+"@X .@@. X",
+"@o .@@. o",
+"@X .@@. X",
+"@+XO@@OX+"
+};
diff --git a/data/pixmaps/feta/6/clefs-percussion_change.xpm b/data/pixmaps/feta/6/clefs-percussion_change.xpm
new file mode 100644
index 0000000..b0c723c
--- /dev/null
+++ b/data/pixmaps/feta/6/clefs-percussion_change.xpm
@@ -0,0 +1,22 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"8 11 5 1",
+" c Gray0",
+". c #7c7c7c",
+"X c Gray55",
+"o c #c8c8c8",
+"O c None",
+/* pixels */
+"OOOOOOOO",
+"Oo.oOo.o",
+"OX .O. X",
+"OX XOX X",
+"OX XO. X",
+"OX .O. X",
+"OX .O. X",
+"OX .OX X",
+"OX XO. X",
+"OX .O. X",
+"Oo.oOo.o"
+};
diff --git a/data/pixmaps/feta/6/clefs-tab.xpm b/data/pixmaps/feta/6/clefs-tab.xpm
new file mode 100644
index 0000000..faf3d14
--- /dev/null
+++ b/data/pixmaps/feta/6/clefs-tab.xpm
@@ -0,0 +1,43 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"11 29 8 1",
+" c #010101",
+". c #323232",
+"X c #4c4c4c",
+"o c #767676",
+"O c #888888",
+"+ c #b1b1b1",
+"@ c Gray82",
+"# c None",
+/* pixels */
+"###########",
+"#@oOoOOOOo@",
+"#o o",
+"#####X @###",
+"#####X @###",
+"#####X @###",
+"#####X @###",
+"#####X @###",
+"#####X @###",
+"#####o @###",
+"###########",
+"####@XX@###",
+"####o o###",
+"####....###",
+"###+ ++ +##",
+"###X @+ X##",
+"##+ +#",
+"##X +@@+ X#",
+"## X####X #",
+"##@#####@@#",
+"#@+++++@###",
+"#o X##",
+"#O O###o o#",
+"#O o+O+. O#",
+"#o X#",
+"#O O#@##o O",
+"#O +####o O",
+"#O .#",
+"#@oOoOoo@##"
+};
diff --git a/data/pixmaps/feta/6/clefs-tab_change.xpm b/data/pixmaps/feta/6/clefs-tab_change.xpm
new file mode 100644
index 0000000..e6da9a9
--- /dev/null
+++ b/data/pixmaps/feta/6/clefs-tab_change.xpm
@@ -0,0 +1,38 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"9 24 8 1",
+" c Gray2",
+". c #343434",
+"X c Gray30",
+"o c Gray45",
+"O c #868686",
+"+ c Gray71",
+"@ c #c3c3c3",
+"# c None",
+/* pixels */
+"#########",
+"#@ooOooo#",
+"#+Xo .oo#",
+"#### o###",
+"#### o###",
+"#### o###",
+"#### o###",
+"#### O###",
+"#########",
+"#### o###",
+"###O ###",
+"### o o##",
+"##O #o ##",
+"##X . +#",
+"#+ +##..#",
+"#O ###O #",
+"####@####",
+"#O O##",
+"#O ##+ o#",
+"#O oo. +#",
+"#O oooX @",
+"#O #### O",
+"#O oXo. @",
+"#@ooooo##"
+};
diff --git a/data/pixmaps/feta/6/clefs-vaticana_do.xpm b/data/pixmaps/feta/6/clefs-vaticana_do.xpm
new file mode 100644
index 0000000..e2e3b7c
--- /dev/null
+++ b/data/pixmaps/feta/6/clefs-vaticana_do.xpm
@@ -0,0 +1,21 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"5 11 4 1",
+" c #020202",
+". c #898989",
+"X c Gray72",
+"o c None",
+/* pixels */
+"ooooo",
+"ooX.o",
+"oX .",
+"o. .",
+"o. X",
+"o.Xoo",
+"o.Xoo",
+"o. X",
+"o. .",
+"oX .",
+"ooX.o"
+};
diff --git a/data/pixmaps/feta/6/clefs-vaticana_do_change.xpm b/data/pixmaps/feta/6/clefs-vaticana_do_change.xpm
new file mode 100644
index 0000000..e2e3b7c
--- /dev/null
+++ b/data/pixmaps/feta/6/clefs-vaticana_do_change.xpm
@@ -0,0 +1,21 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"5 11 4 1",
+" c #020202",
+". c #898989",
+"X c Gray72",
+"o c None",
+/* pixels */
+"ooooo",
+"ooX.o",
+"oX .",
+"o. .",
+"o. X",
+"o.Xoo",
+"o.Xoo",
+"o. X",
+"o. .",
+"oX .",
+"ooX.o"
+};
diff --git a/data/pixmaps/feta/6/clefs-vaticana_fa.xpm b/data/pixmaps/feta/6/clefs-vaticana_fa.xpm
new file mode 100644
index 0000000..0f74f94
--- /dev/null
+++ b/data/pixmaps/feta/6/clefs-vaticana_fa.xpm
@@ -0,0 +1,29 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"7 15 8 1",
+" c Gray2",
+". c #2a2a2a",
+"X c #4e4e4e",
+"o c #777777",
+"O c #898989",
+"+ c #afafaf",
+"@ c #d0d0d0",
+"# c None",
+/* pixels */
+"#######",
+"####@o+",
+"###@ O",
+"###+ o",
+"#+ . O",
+"#o +##",
+"#o. o@@",
+"#@#X O",
+"###X o",
+"###OX o",
+"###O#@#",
+"###O###",
+"###O###",
+"###O###",
+"###@###"
+};
diff --git a/data/pixmaps/feta/6/clefs-vaticana_fa_change.xpm b/data/pixmaps/feta/6/clefs-vaticana_fa_change.xpm
new file mode 100644
index 0000000..0f74f94
--- /dev/null
+++ b/data/pixmaps/feta/6/clefs-vaticana_fa_change.xpm
@@ -0,0 +1,29 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"7 15 8 1",
+" c Gray2",
+". c #2a2a2a",
+"X c #4e4e4e",
+"o c #777777",
+"O c #898989",
+"+ c #afafaf",
+"@ c #d0d0d0",
+"# c None",
+/* pixels */
+"#######",
+"####@o+",
+"###@ O",
+"###+ o",
+"#+ . O",
+"#o +##",
+"#o. o@@",
+"#@#X O",
+"###X o",
+"###OX o",
+"###O#@#",
+"###O###",
+"###O###",
+"###O###",
+"###@###"
+};
diff --git a/data/pixmaps/feta/6/custodes-hufnagel.xpm b/data/pixmaps/feta/6/custodes-hufnagel.xpm
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/pixmaps/feta/6/custodes-hufnagel.xpm
diff --git a/data/pixmaps/feta/6/custodes-medicaea.xpm b/data/pixmaps/feta/6/custodes-medicaea.xpm
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/pixmaps/feta/6/custodes-medicaea.xpm
diff --git a/data/pixmaps/feta/6/custodes-mensural.xpm b/data/pixmaps/feta/6/custodes-mensural.xpm
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/pixmaps/feta/6/custodes-mensural.xpm
diff --git a/data/pixmaps/feta/6/custodes-rhufnagel.xpm b/data/pixmaps/feta/6/custodes-rhufnagel.xpm
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/pixmaps/feta/6/custodes-rhufnagel.xpm
diff --git a/data/pixmaps/feta/6/custodes-rmedicaea.xpm b/data/pixmaps/feta/6/custodes-rmedicaea.xpm
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/pixmaps/feta/6/custodes-rmedicaea.xpm
diff --git a/data/pixmaps/feta/6/custodes-rmensural.xpm b/data/pixmaps/feta/6/custodes-rmensural.xpm
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/pixmaps/feta/6/custodes-rmensural.xpm
diff --git a/data/pixmaps/feta/6/custodes-rvaticana.xpm b/data/pixmaps/feta/6/custodes-rvaticana.xpm
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/pixmaps/feta/6/custodes-rvaticana.xpm
diff --git a/data/pixmaps/feta/6/custodes-vaticana.xpm b/data/pixmaps/feta/6/custodes-vaticana.xpm
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/pixmaps/feta/6/custodes-vaticana.xpm
diff --git a/data/pixmaps/feta/6/dots-dot.xpm b/data/pixmaps/feta/6/dots-dot.xpm
new file mode 100644
index 0000000..b78d7fd
--- /dev/null
+++ b/data/pixmaps/feta/6/dots-dot.xpm
@@ -0,0 +1,17 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"4 4 7 1",
+" c Gray0",
+". c Gray35",
+"X c #717171",
+"o c #898989",
+"O c #a9a9a9",
+"+ c #d3d3d3",
+"@ c None",
+/* pixels */
+"@@@@",
+"@@O@",
+"@o X",
+"@+.O"
+};
diff --git a/data/pixmaps/feta/6/dots-evenrepeatcolon.xpm b/data/pixmaps/feta/6/dots-evenrepeatcolon.xpm
new file mode 100644
index 0000000..800f78e
--- /dev/null
+++ b/data/pixmaps/feta/6/dots-evenrepeatcolon.xpm
@@ -0,0 +1,26 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"4 16 4 1",
+" c Gray0",
+". c #767676",
+"X c #a5a5a5",
+"o c None",
+/* pixels */
+"oooo",
+"oo.o",
+"o. .",
+"oX X",
+"oooo",
+"oooo",
+"oooo",
+"oooo",
+"oooo",
+"oooo",
+"oooo",
+"oooo",
+"oooo",
+"oX X",
+"o. .",
+"oo.o"
+};
diff --git a/data/pixmaps/feta/6/dots-repeatcolon.xpm b/data/pixmaps/feta/6/dots-repeatcolon.xpm
new file mode 100644
index 0000000..b656783
--- /dev/null
+++ b/data/pixmaps/feta/6/dots-repeatcolon.xpm
@@ -0,0 +1,20 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"4 10 4 1",
+" c Gray0",
+". c #767676",
+"X c #a5a5a5",
+"o c None",
+/* pixels */
+"oooo",
+"oo.o",
+"o. .",
+"oX X",
+"oooo",
+"oooo",
+"oooo",
+"oX X",
+"o. .",
+"oo.o"
+};
diff --git a/data/pixmaps/feta/6/flags-d3.xpm b/data/pixmaps/feta/6/flags-d3.xpm
new file mode 100644
index 0000000..7b4e1da
--- /dev/null
+++ b/data/pixmaps/feta/6/flags-d3.xpm
@@ -0,0 +1,33 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"8 19 8 1",
+" c #040404",
+". c #2d2d2d",
+"X c Gray33",
+"o c #727272",
+"O c Gray56",
+"+ c Gray68",
+"@ c #d2d2d2",
+"# c None",
+/* pixels */
+"########",
+"#####@@#",
+"#####@X#",
+"######.@",
+"######X+",
+"######Oo",
+"#@####OX",
+"#O####Oo",
+"#+####.@",
+"#O@##XX#",
+"#O@#o.##",
+"#O@o O##",
+"#o O###",
+"#O o####",
+"#o @####",
+"#oX#####",
+"#O+#####",
+"#O@#####",
+"#@######"
+};
diff --git a/data/pixmaps/feta/6/flags-d4.xpm b/data/pixmaps/feta/6/flags-d4.xpm
new file mode 100644
index 0000000..0860fcb
--- /dev/null
+++ b/data/pixmaps/feta/6/flags-d4.xpm
@@ -0,0 +1,34 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"8 20 8 1",
+" c Gray6",
+". c Gray20",
+"X c #515151",
+"o c #6f6f6f",
+"O c #8d8d8d",
+"+ c Gray69",
+"@ c #d5d5d5",
+"# c None",
+/* pixels */
+"########",
+"######@@",
+"######Oo",
+"######Oo",
+"######Oo",
+"######.@",
+"#####XX#",
+"#@##o O#",
+"#O@. #+@",
+"#o @#O@",
+"#o @##X#",
+"#oX##oO#",
+"#O+#o.##",
+"#O@o ###",
+"#O @###",
+"#o @####",
+"#oX#####",
+"#O+#####",
+"#O@#####",
+"#@######"
+};
diff --git a/data/pixmaps/feta/6/flags-d5.xpm b/data/pixmaps/feta/6/flags-d5.xpm
new file mode 100644
index 0000000..e14e509
--- /dev/null
+++ b/data/pixmaps/feta/6/flags-d5.xpm
@@ -0,0 +1,39 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"8 25 8 1",
+" c #0c0c0c",
+". c Gray17",
+"X c Gray32",
+"o c #6f6f6f",
+"O c #8d8d8d",
+"+ c #aeaeae",
+"@ c Gray83",
+"# c None",
+/* pixels */
+"########",
+"######@@",
+"######Oo",
+"######Oo",
+"######Oo",
+"######.@",
+"#####o #",
+"###@X.X@",
+"##o #Oo",
+"#@ @#oo",
+"#@ @##.+",
+"#@o##oX#",
+"#+@#o.X@",
+"#++. #+@",
+"#o @#O@",
+"#o @##O#",
+"#oX##o@#",
+"#O+#oo##",
+"#+@..###",
+"#o @###",
+"#o @####",
+"#oX#####",
+"#O+#####",
+"#O@#####",
+"#@######"
+};
diff --git a/data/pixmaps/feta/6/flags-d6.xpm b/data/pixmaps/feta/6/flags-d6.xpm
new file mode 100644
index 0000000..f513b63
--- /dev/null
+++ b/data/pixmaps/feta/6/flags-d6.xpm
@@ -0,0 +1,41 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"8 27 8 1",
+" c #070707",
+". c #2c2c2c",
+"X c Gray31",
+"o c #727272",
+"O c #8e8e8e",
+"+ c #aeaeae",
+"@ c #d3d3d3",
+"# c None",
+/* pixels */
+"########",
+"######@+",
+"######oo",
+"######Oo",
+"######XO",
+"####@. O",
+"##o. Ooo",
+"#@ .+#Xo",
+"#@.@#+ @",
+"#@+#+.X@",
+"##@o ++@",
+"##. +#O@",
+"#@ +##O#",
+"#@X##OX#",
+"#@+#+XO#",
+"#O#XX@o#",
+"#O .#+o#",
+"#o +#X@#",
+"#o.#Oo##",
+"#o++ @##",
+"#+O @###",
+"#O o####",
+"#o #####",
+"#oo#####",
+"#O@#####",
+"#O######",
+"#@######"
+};
diff --git a/data/pixmaps/feta/6/flags-dgrace.xpm b/data/pixmaps/feta/6/flags-dgrace.xpm
new file mode 100644
index 0000000..7f1ff2e
--- /dev/null
+++ b/data/pixmaps/feta/6/flags-dgrace.xpm
@@ -0,0 +1,22 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"15 9 7 1",
+" c Gray5",
+". c #2f2f2f",
+"X c Gray36",
+"o c #6f6f6f",
+"O c #b1b1b1",
+"+ c Gray80",
+"@ c None",
+/* pixels */
+"@@@@@@@@@@@@@@@",
+"@++@@@@@@@@@@@@",
+"@O o+@@@@@@@@@@",
+"@@@o.o@@@@@@@@@",
+"@@@@@o XO@@@@@@",
+"@@@@@@@oX.O@@@@",
+"@@@@@@@@@O..O@@",
+"@@@@@@@@@@@O..+",
+"@@@@@@@@@@@@@OO"
+};
diff --git a/data/pixmaps/feta/6/flags-dstem.xpm b/data/pixmaps/feta/6/flags-dstem.xpm
new file mode 100644
index 0000000..2d3884e
--- /dev/null
+++ b/data/pixmaps/feta/6/flags-dstem.xpm
@@ -0,0 +1,30 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"2 21 3 1",
+" c #a7a7a7",
+". c Gray84",
+"X c None",
+/* pixels */
+"XX",
+"X.",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X."
+};
diff --git a/data/pixmaps/feta/6/flags-stem.xpm b/data/pixmaps/feta/6/flags-stem.xpm
new file mode 100644
index 0000000..2d3884e
--- /dev/null
+++ b/data/pixmaps/feta/6/flags-stem.xpm
@@ -0,0 +1,30 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"2 21 3 1",
+" c #a7a7a7",
+". c Gray84",
+"X c None",
+/* pixels */
+"XX",
+"X.",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X."
+};
diff --git a/data/pixmaps/feta/6/flags-u3.xpm b/data/pixmaps/feta/6/flags-u3.xpm
new file mode 100644
index 0000000..05b4dfd
--- /dev/null
+++ b/data/pixmaps/feta/6/flags-u3.xpm
@@ -0,0 +1,34 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"8 20 8 1",
+" c Gray3",
+". c Gray22",
+"X c #4b4b4b",
+"o c #6f6f6f",
+"O c #929292",
+"+ c #b2b2b2",
+"@ c #d3d3d3",
+"# c None",
+/* pixels */
+"########",
+"#@######",
+"#O@#####",
+"#OO#####",
+"#oX#####",
+"#O #####",
+"#O O####",
+"#O +###",
+"#OO ###",
+"#O@@ X##",
+"#O@#+ +#",
+"#O@##o.#",
+"#O@### +",
+"#@####oo",
+"######oo",
+"######oo",
+"######.+",
+"###### #",
+"#####Oo#",
+"#####++#"
+};
diff --git a/data/pixmaps/feta/6/flags-u4.xpm b/data/pixmaps/feta/6/flags-u4.xpm
new file mode 100644
index 0000000..404aaf3
--- /dev/null
+++ b/data/pixmaps/feta/6/flags-u4.xpm
@@ -0,0 +1,37 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"8 23 8 1",
+" c #070707",
+". c #353535",
+"X c #484848",
+"o c #727272",
+"O c #8d8d8d",
+"+ c Gray68",
+"@ c Gray82",
+"# c None",
+/* pixels */
+"########",
+"#@######",
+"#O@#####",
+"#O+#####",
+"#o.#####",
+"#O +####",
+"#O X####",
+"#+O o###",
+"#o+@ +##",
+"#o.#+ ##",
+"#O +#oo#",
+"#O ##O#",
+"#O+..#O@",
+"#@##.XO@",
+"#####.X#",
+"#####+X#",
+"######X+",
+"######oo",
+"######oo",
+"######oo",
+"###### @",
+"#####+.#",
+"#####++#"
+};
diff --git a/data/pixmaps/feta/6/flags-u5.xpm b/data/pixmaps/feta/6/flags-u5.xpm
new file mode 100644
index 0000000..d36eb12
--- /dev/null
+++ b/data/pixmaps/feta/6/flags-u5.xpm
@@ -0,0 +1,41 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"8 27 8 1",
+" c Gray3",
+". c #323232",
+"X c Gray29",
+"o c #727272",
+"O c #8e8e8e",
+"+ c #b1b1b1",
+"@ c #cecece",
+"# c None",
+/* pixels */
+"########",
+"#@######",
+"#O@#####",
+"#O+#####",
+"#o.#####",
+"#O +####",
+"#O X####",
+"#+O X###",
+"#O+@ +##",
+"#o.#+ ##",
+"#O +#.o#",
+"#O #+ #",
+"#O+.X# @",
+"#++#...#",
+"#@X##.o#",
+"## +#@X#",
+"## +#o@",
+"##@. @+@",
+"####X O#",
+"#####.X#",
+"###### +",
+"######oo",
+"######oo",
+"######oo",
+"###### #",
+"#####+.#",
+"#####++#"
+};
diff --git a/data/pixmaps/feta/6/flags-u6.xpm b/data/pixmaps/feta/6/flags-u6.xpm
new file mode 100644
index 0000000..e078090
--- /dev/null
+++ b/data/pixmaps/feta/6/flags-u6.xpm
@@ -0,0 +1,47 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"8 33 8 1",
+" c #070707",
+". c #343434",
+"X c Gray28",
+"o c #767676",
+"O c #8e8e8e",
+"+ c #aeaeae",
+"@ c #d5d5d5",
+"# c None",
+/* pixels */
+"########",
+"#@######",
+"#O@#####",
+"#O+#####",
+"#o.#####",
+"#O +####",
+"#O X####",
+"#+O O###",
+"#O+@ +##",
+"#o.#+X##",
+"#O +#X+#",
+"#O X#+.#",
+"#OO X# #",
+"#@@#XO.#",
+"#@O##..#",
+"## ##+o#",
+"## .##O#",
+"##+ o#O@",
+"####X+O@",
+"#@O##.o#",
+"## ##+o#",
+"## X##O@",
+"##X X#O@",
+"###+ +O#",
+"####+ o#",
+"#####+.#",
+"######X+",
+"######oo",
+"######oo",
+"######oo",
+"###### #",
+"#####+.#",
+"#####++#"
+};
diff --git a/data/pixmaps/feta/6/flags-ugrace.xpm b/data/pixmaps/feta/6/flags-ugrace.xpm
new file mode 100644
index 0000000..da65d73
--- /dev/null
+++ b/data/pixmaps/feta/6/flags-ugrace.xpm
@@ -0,0 +1,24 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"13 10 8 1",
+" c #1d1d1d",
+". c Gray18",
+"X c #505050",
+"o c #747474",
+"O c #868686",
+"+ c #acacac",
+"@ c #cbcbcb",
+"# c None",
+/* pixels */
+"#############",
+"###########++",
+"##########o.+",
+"########@XX@#",
+"#######o +###",
+"#####@ o#####",
+"####o @######",
+"##+XO########",
+"#+.@#########",
+"#@@##########"
+};
diff --git a/data/pixmaps/feta/6/noteheads--1.xpm b/data/pixmaps/feta/6/noteheads--1.xpm
new file mode 100644
index 0000000..b64eaba
--- /dev/null
+++ b/data/pixmaps/feta/6/noteheads--1.xpm
@@ -0,0 +1,22 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"15 8 8 1",
+" c #070707",
+". c Gray19",
+"X c Gray36",
+"o c Gray45",
+"O c #8d8d8d",
+"+ c Gray72",
+"@ c #d2d2d2",
+"# c None",
+/* pixels */
+"###############",
+"#@+##+OOoO###++",
+"#oXO X@@X .@Xo",
+"#O O###O ..O",
+"#O o#### O",
+"#O #### .o",
+"#oXO .+#O .@oo",
+"#@+##+ooOO###+@"
+};
diff --git a/data/pixmaps/feta/6/noteheads--1mensural.xpm b/data/pixmaps/feta/6/noteheads--1mensural.xpm
new file mode 100644
index 0000000..7f5169f
--- /dev/null
+++ b/data/pixmaps/feta/6/noteheads--1mensural.xpm
@@ -0,0 +1,23 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"13 11 6 1",
+" c Gray3",
+". c #2a2a2a",
+"X c #777777",
+"o c #888888",
+"O c #cdcdcd",
+"+ c None",
+/* pixels */
+"+++++++++++++",
+"+O++++++++++O",
+"+o.oXXXXXXo.X",
+"+o o",
+"+o o",
+"+XX++++++++XX",
+"+XX++++++++XX",
+"+o . o",
+"+o o",
+"+o.oXoXXXXo.X",
+"+O++++++++++O"
+};
diff --git a/data/pixmaps/feta/6/noteheads--2mensural.xpm b/data/pixmaps/feta/6/noteheads--2mensural.xpm
new file mode 100644
index 0000000..23eca92
--- /dev/null
+++ b/data/pixmaps/feta/6/noteheads--2mensural.xpm
@@ -0,0 +1,30 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"14 16 8 1",
+" c #020202",
+". c #2a2a2a",
+"X c #4e4e4e",
+"o c #727272",
+"O c Gray53",
+"+ c #b9b9b9",
+"@ c #c8c8c8",
+"# c None",
+/* pixels */
+"##############",
+"#@#########@@#",
+"#o.oooooooo.o#",
+"#O O#",
+"#O ........ o#",
+"#oo########oo#",
+"#oX#@@@@@@@Xo#",
+"#O o#",
+"#O o#",
+"#Oo@@@@@@@@oX#",
+"############ #",
+"############X#",
+"############oO",
+"############oo",
+"############oo",
+"############++"
+};
diff --git a/data/pixmaps/feta/6/noteheads--3mensural.xpm b/data/pixmaps/feta/6/noteheads--3mensural.xpm
new file mode 100644
index 0000000..61415bd
--- /dev/null
+++ b/data/pixmaps/feta/6/noteheads--3mensural.xpm
@@ -0,0 +1,30 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"17 16 8 1",
+" c #040404",
+". c Gray17",
+"X c Gray35",
+"o c #727272",
+"O c Gray53",
+"+ c Gray73",
+"@ c #c8c8c8",
+"# c None",
+/* pixels */
+"#################",
+"#++############O#",
+"#o.oooooooooooo #",
+"#O #",
+"#O ............ #",
+"#oo############.@",
+"#oX@@@@@@@@@@@+ @",
+"#O #",
+"#O #",
+"#oX@+@@@@@@@@@@ #",
+"###############.@",
+"###############.#",
+"###############.+",
+"###############Oo",
+"###############oo",
+"###############@+"
+};
diff --git a/data/pixmaps/feta/6/noteheads-0.xpm b/data/pixmaps/feta/6/noteheads-0.xpm
new file mode 100644
index 0000000..3fd6ae2
--- /dev/null
+++ b/data/pixmaps/feta/6/noteheads-0.xpm
@@ -0,0 +1,21 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"13 8 7 1",
+" c Gray1",
+". c #2c2c2c",
+"X c Gray",
+"o c #8e8e8e",
+"O c #b7b7b7",
+"+ c Gray85",
+"@ c None",
+/* pixels */
+"@@@@@@@@@@@@@",
+"@@@@+ooXo+@@@",
+"@@O. O@o .O@",
+"@O .@@@O O",
+"@X .@@@@. o",
+"@O O@@@. O",
+"@@O. o+O .O@",
+"@@@@+oooo+@@@"
+};
diff --git a/data/pixmaps/feta/6/noteheads-0cross.xpm b/data/pixmaps/feta/6/noteheads-0cross.xpm
new file mode 100644
index 0000000..ce84365
--- /dev/null
+++ b/data/pixmaps/feta/6/noteheads-0cross.xpm
@@ -0,0 +1,22 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"12 9 7 1",
+" c #2a2a2a",
+". c Gray30",
+"X c Gray43",
+"o c #8d8d8d",
+"O c #b4b4b4",
+"+ c Gray82",
+"@ c None",
+/* pixels */
+"@@@@@@@@@@@@",
+"@@@O+@@@+O@@",
+"@O +@X X@+ O",
+"@@@.X@@@..@@",
+"@@@.X@@@X.@@",
+"@O +@X X@+ O",
+"@@@O+@@@+O@@"
+};
diff --git a/data/pixmaps/feta/6/noteheads-0diamond.xpm b/data/pixmaps/feta/6/noteheads-0diamond.xpm
new file mode 100644
index 0000000..4d54160
--- /dev/null
+++ b/data/pixmaps/feta/6/noteheads-0diamond.xpm
@@ -0,0 +1,20 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"13 8 6 1",
+" c #040404",
+". c #2f2f2f",
+"X c Gray46",
+"o c #8d8d8d",
+"O c Gray63",
+"+ c None",
+/* pixels */
+"+++++++++++++",
+"++++++OO+++++",
+"+++++. .++++",
+"++oX .+O Xo+",
+"+o .++. o",
+"++oX O+. Xo+",
+"+++++. .++++",
+"++++++OO+++++"
+};
diff --git a/data/pixmaps/feta/6/noteheads-0mensural.xpm b/data/pixmaps/feta/6/noteheads-0mensural.xpm
new file mode 100644
index 0000000..837b37d
--- /dev/null
+++ b/data/pixmaps/feta/6/noteheads-0mensural.xpm
@@ -0,0 +1,21 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"7 8 7 1",
+" c #131313",
+". c #252525",
+"X c #464646",
+"o c Gray50",
+"O c Gray72",
+"+ c #d8d8d8",
+"@ c None",
+/* pixels */
+"@@@@@@@",
+"@@@++@@",
+"@@+..@@",
+"@@XO .@",
+"@o @@ o",
+"@@. OX+",
+"@@@..+@",
+"@@@++@@"
+};
diff --git a/data/pixmaps/feta/6/noteheads-0slash.xpm b/data/pixmaps/feta/6/noteheads-0slash.xpm
new file mode 100644
index 0000000..5e0cb24
--- /dev/null
+++ b/data/pixmaps/feta/6/noteheads-0slash.xpm
@@ -0,0 +1,27 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"18 13 8 1",
+" c #020202",
+". c Gray17",
+"X c Gray25",
+"o c #727272",
+"O c #8b8b8b",
+"+ c #b2b2b2",
+"@ c #d5d5d5",
+"# c None",
+/* pixels */
+"##################",
+"#######@OOOOOOOOo@",
+"#######O .#",
+"######@ .OOOOO +#",
+"######. +####+ X##",
+"#####O o#####. @##",
+"#####. @####o o###",
+"####o o####@ .####",
+"###@ .#####o O####",
+"###. +####+ .#####",
+"##+ OOOOO. @#####",
+"##. O######",
+"#@oOOOOOOOO@######"
+};
diff --git a/data/pixmaps/feta/6/noteheads-0triangle.xpm b/data/pixmaps/feta/6/noteheads-0triangle.xpm
new file mode 100644
index 0000000..9173460
--- /dev/null
+++ b/data/pixmaps/feta/6/noteheads-0triangle.xpm
@@ -0,0 +1,21 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"9 7 8 1",
+" c #161616",
+". c Gray20",
+"X c Gray32",
+"o c #6f6f6f",
+"O c #979797",
+"+ c Gray67",
+"@ c #cacaca",
+"# c None",
+/* pixels */
+"#########",
+"####++###",
+"####..###",
+"###XOOX##",
+"##@.##.@#",
+"## @##@ #",
+"#@oOOOOo@"
+};
diff --git a/data/pixmaps/feta/6/noteheads-1.xpm b/data/pixmaps/feta/6/noteheads-1.xpm
new file mode 100644
index 0000000..e6f75e5
--- /dev/null
+++ b/data/pixmaps/feta/6/noteheads-1.xpm
@@ -0,0 +1,22 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"10 8 8 1",
+" c Gray1",
+". c #3c3c3c",
+"X c #4c4c4c",
+"o c Gray43",
+"O c #8b8b8b",
+"+ c Gray71",
+"@ c Gray77",
+"# c None",
+/* pixels */
+"##########",
+"#####OoOO#",
+"###O o#OO",
+"##X .@##+O",
+"#+ O###O +",
+"#O+##@. X#",
+"#OO#o o##",
+"##OOoO####"
+};
diff --git a/data/pixmaps/feta/6/noteheads-1cross.xpm b/data/pixmaps/feta/6/noteheads-1cross.xpm
new file mode 100644
index 0000000..32ee9fc
--- /dev/null
+++ b/data/pixmaps/feta/6/noteheads-1cross.xpm
@@ -0,0 +1,22 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"10 9 7 1",
+" c Gray22",
+". c #434343",
+"X c #6c6c6c",
+"o c Gray60",
+"O c #b9b9b9",
+"+ c #d3d3d3",
+"@ c None",
+/* pixels */
+"@@@@@@@@@@",
+"@@++@@@O+@",
+"@O +o o+ O",
+"@@@ +@+ @@",
+"@@+ +@+ @@",
+"@O +o o+ O",
+"@@+O@@@O+@"
+};
diff --git a/data/pixmaps/feta/6/noteheads-1diamond.xpm b/data/pixmaps/feta/6/noteheads-1diamond.xpm
new file mode 100644
index 0000000..b067cb8
--- /dev/null
+++ b/data/pixmaps/feta/6/noteheads-1diamond.xpm
@@ -0,0 +1,21 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"10 8 7 1",
+" c Gray3",
+". c Gray20",
+"X c Gray47",
+"o c #8b8b8b",
+"O c #b7b7b7",
+"+ c Gray81",
+"@ c None",
+/* pixels */
+"@@@@@@@@@@",
+"@@@@@@@Oo@",
+"@@O o",
+"@@o .+@ @",
+"@@X.+@+.X@",
+"@@ @+. o@",
+"@o O@",
+"@@XO@@@@@@"
+};
diff --git a/data/pixmaps/feta/6/noteheads-1mensural.xpm b/data/pixmaps/feta/6/noteheads-1mensural.xpm
new file mode 100644
index 0000000..837b37d
--- /dev/null
+++ b/data/pixmaps/feta/6/noteheads-1mensural.xpm
@@ -0,0 +1,21 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"7 8 7 1",
+" c #131313",
+". c #252525",
+"X c #464646",
+"o c Gray50",
+"O c Gray72",
+"+ c #d8d8d8",
+"@ c None",
+/* pixels */
+"@@@@@@@",
+"@@@++@@",
+"@@+..@@",
+"@@XO .@",
+"@o @@ o",
+"@@. OX+",
+"@@@..+@",
+"@@@++@@"
+};
diff --git a/data/pixmaps/feta/6/noteheads-1slash.xpm b/data/pixmaps/feta/6/noteheads-1slash.xpm
new file mode 100644
index 0000000..b2de115
--- /dev/null
+++ b/data/pixmaps/feta/6/noteheads-1slash.xpm
@@ -0,0 +1,26 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"16 13 7 1",
+" c #020202",
+". c Gray18",
+"X c #747474",
+"o c Gray54",
+"O c Gray71",
+"+ c Gray81",
+"@ c None",
+/* pixels */
+"@@@@@@@@@@@@@@@@",
+"@@@@@@@+ooooooX+",
+"@@@@@@@o .@",
+"@@@@@@+ .ooo O@",
+"@@@@@@. O@@O .@@",
+"@@@@@o X@@@. +@@",
+"@@@@@. +@@X X@@@",
+"@@@@X X@@+ .@@@@",
+"@@@+ .@@@X o@@@@",
+"@@@. O@@+ .@@@@@",
+"@@O ooo. +@@@@@",
+"@@. o@@@@@@",
+"@+Xoooooo+@@@@@@"
+};
diff --git a/data/pixmaps/feta/6/noteheads-1triangle.xpm b/data/pixmaps/feta/6/noteheads-1triangle.xpm
new file mode 100644
index 0000000..db7ad45
--- /dev/null
+++ b/data/pixmaps/feta/6/noteheads-1triangle.xpm
@@ -0,0 +1,19 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"7 7 6 1",
+" c #434343",
+". c #6d6d6d",
+"X c #939393",
+"o c Gray73",
+"O c Gray86",
+"+ c None",
+/* pixels */
+"+++++++",
+"+++OO++",
+"+++..++",
+"++o o+",
+"++.OO.+",
+"+X +O X",
+"+oXXXXo"
+};
diff --git a/data/pixmaps/feta/6/noteheads-2.xpm b/data/pixmaps/feta/6/noteheads-2.xpm
new file mode 100644
index 0000000..90b6ede
--- /dev/null
+++ b/data/pixmaps/feta/6/noteheads-2.xpm
@@ -0,0 +1,21 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"9 8 7 1",
+" c Gray1",
+". c Gray21",
+"X c #717171",
+"o c #848484",
+"O c #b2b2b2",
+"+ c #d8d8d8",
+"@ c None",
+/* pixels */
+"@@@@@@@@@",
+"@@@@+ooO@",
+"@@@X O",
+"@@. X",
+"@O O",
+"@X .@",
+"@O X+@",
+"@@Ooo+@@@"
+};
diff --git a/data/pixmaps/feta/6/noteheads-2cross.xpm b/data/pixmaps/feta/6/noteheads-2cross.xpm
new file mode 100644
index 0000000..f965bf4
--- /dev/null
+++ b/data/pixmaps/feta/6/noteheads-2cross.xpm
@@ -0,0 +1,19 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"9 8 5 1",
+" c Gray0",
+". c #252525",
+"X c #848484",
+"o c #b7b7b7",
+"O c None",
+/* pixels */
+"OOOOOOOOO",
+"OooOOOOoo",
+"Oo.oOOo.o",
+"OOO.XX.OO",
+"OOOo oOO",
+"OOO.XX.OO",
+"Oo.oOOo.o",
+"OooOOOOoo"
+};
diff --git a/data/pixmaps/feta/6/noteheads-2diamond.xpm b/data/pixmaps/feta/6/noteheads-2diamond.xpm
new file mode 100644
index 0000000..2421e19
--- /dev/null
+++ b/data/pixmaps/feta/6/noteheads-2diamond.xpm
@@ -0,0 +1,22 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"9 8 8 1",
+" c #020202",
+". c #313131",
+"X c #5d5d5d",
+"o c Gray",
+"O c #888888",
+"+ c #a7a7a7",
+"@ c #c5c5c5",
+"# c None",
+/* pixels */
+"#########",
+"####+OOO@",
+"###@ o",
+"###X .#",
+"###. .##",
+"##. X##",
+"#o @##",
+"#+oOO+###"
+};
diff --git a/data/pixmaps/feta/6/noteheads-2mensural.xpm b/data/pixmaps/feta/6/noteheads-2mensural.xpm
new file mode 100644
index 0000000..548a377
--- /dev/null
+++ b/data/pixmaps/feta/6/noteheads-2mensural.xpm
@@ -0,0 +1,19 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"7 8 5 1",
+" c #0b0b0b",
+". c #313131",
+"X c #838383",
+"o c #d7d7d7",
+"O c None",
+/* pixels */
+"OOOOOOO",
+"OOOooOO",
+"OOO OO",
+"OO. .O",
+"OX X",
+"OO. .O",
+"OOo..oO",
+"OOOooOO"
+};
diff --git a/data/pixmaps/feta/6/noteheads-2slash.xpm b/data/pixmaps/feta/6/noteheads-2slash.xpm
new file mode 100644
index 0000000..6c28fd8
--- /dev/null
+++ b/data/pixmaps/feta/6/noteheads-2slash.xpm
@@ -0,0 +1,27 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"12 13 8 1",
+" c Gray1",
+". c #343434",
+"X c Gray29",
+"o c #797979",
+"O c #898989",
+"+ c #b6b6b6",
+"@ c #cbcbcb",
+"# c None",
+/* pixels */
+"############",
+"########OOo@",
+"#######+ .#",
+"####### +#",
+"######X X##",
+"#####+ ###",
+"#####X O###",
+"####o X####",
+"#### +####",
+"###X X#####",
+"##+ ######",
+"##. +######",
+"#@oOO#######"
+};
diff --git a/data/pixmaps/feta/6/noteheads-2triangle.xpm b/data/pixmaps/feta/6/noteheads-2triangle.xpm
new file mode 100644
index 0000000..be8ebf9
--- /dev/null
+++ b/data/pixmaps/feta/6/noteheads-2triangle.xpm
@@ -0,0 +1,20 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"7 7 7 1",
+" c #010101",
+". c Gray37",
+"X c Gray47",
+"o c Gray55",
+"O c #aeaeae",
+"+ c #d5d5d5",
+"@ c None",
+/* pixels */
+"@@@@@@@",
+"@@@++@@",
+"@@@XX@@",
+"@@+ +@",
+"@@. .@",
+"@O O",
+"@OXooXO"
+};
diff --git a/data/pixmaps/feta/6/noteheads-2xcircle.xpm b/data/pixmaps/feta/6/noteheads-2xcircle.xpm
new file mode 100644
index 0000000..d7ce357
--- /dev/null
+++ b/data/pixmaps/feta/6/noteheads-2xcircle.xpm
@@ -0,0 +1,22 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"9 9 7 1",
+" c Gray20",
+". c #585858",
+"X c #797979",
+"o c #929292",
+"O c #a5a5a5",
+"+ c #d7d7d7",
+"@ c None",
+/* pixels */
+"@@@@@@@@@",
+"@@@OooO@@",
+"@@ .@@. @",
+"@OX.++.XO",
+"@o@@ .+@o",
+"@o++ +@o",
+"@OX.++.XO",
+"@@ .+@. @",
+"@@@OooO@@"
+};
diff --git a/data/pixmaps/feta/6/noteheads-ledgerending.xpm b/data/pixmaps/feta/6/noteheads-ledgerending.xpm
new file mode 100644
index 0000000..ca66749
--- /dev/null
+++ b/data/pixmaps/feta/6/noteheads-ledgerending.xpm
@@ -0,0 +1,12 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"8 3 3 1",
+" c #6f6f6f",
+". c #bebebe",
+"X c None",
+/* pixels */
+"XXXXXXXX",
+"X. .",
+"X. ."
+};
diff --git a/data/pixmaps/feta/6/rests--1.xpm b/data/pixmaps/feta/6/rests--1.xpm
new file mode 100644
index 0000000..7cb06b2
--- /dev/null
+++ b/data/pixmaps/feta/6/rests--1.xpm
@@ -0,0 +1,17 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"5 7 4 1",
+" c Gray0",
+". c #727272",
+"X c Gray71",
+"o c None",
+/* pixels */
+"ooooo",
+"oX..X",
+"o. .",
+"o. .",
+"o. .",
+"o. .",
+"oX..X"
+};
diff --git a/data/pixmaps/feta/6/rests--1o.xpm b/data/pixmaps/feta/6/rests--1o.xpm
new file mode 100644
index 0000000..8ae32b3
--- /dev/null
+++ b/data/pixmaps/feta/6/rests--1o.xpm
@@ -0,0 +1,17 @@
+/* XPM */
+static char * rests__1o_xpm[] = {
+"11 7 7 1",
+" c None",
+". c #B9B9B9",
+"+ c #727272",
+"@ c #898989",
+"# c #595959",
+"$ c #030303",
+"% c #D9D9D9",
+" ",
+" .+++@@+++.",
+" .#+#$$#+#.",
+" %$$% ",
+" %$$% ",
+" .#+#$$#+#.",
+" .+++@@+++."};
diff --git a/data/pixmaps/feta/6/rests--2.xpm b/data/pixmaps/feta/6/rests--2.xpm
new file mode 100644
index 0000000..4bc5415
--- /dev/null
+++ b/data/pixmaps/feta/6/rests--2.xpm
@@ -0,0 +1,24 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"5 13 5 1",
+" c Gray0",
+". c #747474",
+"X c #808080",
+"o c #bebebe",
+"O c None",
+/* pixels */
+"OOOOO",
+"OoXXo",
+"O. .",
+"O. .",
+"O. .",
+"O. .",
+"O. .",
+"O. .",
+"O. .",
+"O. .",
+"O. .",
+"O. .",
+"OoXXo"
+};
diff --git a/data/pixmaps/feta/6/rests--4.xpm b/data/pixmaps/feta/6/rests--4.xpm
new file mode 100644
index 0000000..c46fa5e
--- /dev/null
+++ b/data/pixmaps/feta/6/rests--4.xpm
@@ -0,0 +1,23 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"48 13 4 1",
+" c #070707",
+". c Gray57",
+"X c #d5d5d5",
+"o c None",
+/* pixels */
+"oooooooooooooooooooooooooooooooooooooooooooooooo",
+"oXoooooooooooooooooooooooooooooooooooooooooooooX",
+"o.XoooooooooooooooooooooooooooooooooooooooooooX.",
+"o.XoooooooooooooooooooooooooooooooooooooooooooX.",
+"o.XooooooooooooooooooXooooooooooooooooooooooooX.",
+"o. .",
+"o. .",
+"o. .",
+"o. .",
+"o.XoooooooooooooooooooooooooooooooooooooooooooX.",
+"o.XoooooooooooooooooooooooooooooooooooooooooooX.",
+"o.XoooooooooooooooooooooooooooooooooooooooooooX.",
+"oXoooooooooooooooooooooooooooooooooooooooooooooX"
+};
diff --git a/data/pixmaps/feta/6/rests-0.xpm b/data/pixmaps/feta/6/rests-0.xpm
new file mode 100644
index 0000000..938ab3f
--- /dev/null
+++ b/data/pixmaps/feta/6/rests-0.xpm
@@ -0,0 +1,15 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"10 5 4 1",
+" c #010101",
+". c Gray45",
+"X c Gray72",
+"o c None",
+/* pixels */
+"oooooooooo",
+"oX.......X",
+"oX .",
+"o. .",
+"oX.......X"
+};
diff --git a/data/pixmaps/feta/6/rests-0o.xpm b/data/pixmaps/feta/6/rests-0o.xpm
new file mode 100644
index 0000000..7616ad0
--- /dev/null
+++ b/data/pixmaps/feta/6/rests-0o.xpm
@@ -0,0 +1,19 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"17 6 7 1",
+" c Gray1",
+". c Gray35",
+"X c #727272",
+"o c #898989",
+"O c #b9b9b9",
+"+ c Gray85",
+"@ c None",
+/* pixels */
+"@@@@@@@@@@@@@@@@@",
+"@OXXXooooooooXXXO",
+"@O.X. .X.O",
+"@@@@+ +@@@",
+"@@@@+ +@@@",
+"@@@@@oooooooo@@@@"
+};
diff --git a/data/pixmaps/feta/6/rests-1.xpm b/data/pixmaps/feta/6/rests-1.xpm
new file mode 100644
index 0000000..938ab3f
--- /dev/null
+++ b/data/pixmaps/feta/6/rests-1.xpm
@@ -0,0 +1,15 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"10 5 4 1",
+" c #010101",
+". c Gray45",
+"X c Gray72",
+"o c None",
+/* pixels */
+"oooooooooo",
+"oX.......X",
+"oX .",
+"o. .",
+"oX.......X"
+};
diff --git a/data/pixmaps/feta/6/rests-1o.xpm b/data/pixmaps/feta/6/rests-1o.xpm
new file mode 100644
index 0000000..7e282a2
--- /dev/null
+++ b/data/pixmaps/feta/6/rests-1o.xpm
@@ -0,0 +1,19 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"17 6 7 1",
+" c Gray1",
+". c Gray35",
+"X c #727272",
+"o c #898989",
+"O c #b9b9b9",
+"+ c Gray85",
+"@ c None",
+/* pixels */
+"@@@@@@@@@@@@@@@@@",
+"@@@@@oooooooo@@@@",
+"@@@@+ +@@@",
+"@@@@+ +@@@",
+"@O.X. .X.O",
+"@OXXXooooooooXXXO"
+};
diff --git a/data/pixmaps/feta/6/rests-2.xpm b/data/pixmaps/feta/6/rests-2.xpm
new file mode 100644
index 0000000..3656dee
--- /dev/null
+++ b/data/pixmaps/feta/6/rests-2.xpm
@@ -0,0 +1,32 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"8 18 8 1",
+" c #040404",
+". c #343434",
+"X c #494949",
+"o c #747474",
+"O c Gray52",
+"+ c Gray69",
+"@ c Gray77",
+"# c None",
+/* pixels */
+"########",
+"###@####",
+"###+X###",
+"####o.##",
+"####O +#",
+"####o +",
+"###+ O",
+"##+ X#",
+"## X##",
+"##o ###",
+"###X ###",
+"####X+##",
+"#@ ...##",
+"#O .#",
+"#+ X##o#",
+"##.o####",
+"##+o####",
+"###@####"
+};
diff --git a/data/pixmaps/feta/6/rests-2mensural.xpm b/data/pixmaps/feta/6/rests-2mensural.xpm
new file mode 100644
index 0000000..7994d61
--- /dev/null
+++ b/data/pixmaps/feta/6/rests-2mensural.xpm
@@ -0,0 +1,19 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"6 6 7 1",
+" c Gray0",
+". c Gray15",
+"X c Gray43",
+"o c #9a9a9a",
+"O c #afafaf",
+"+ c Gray82",
+"@ c None",
+/* pixels */
+"@@@@@@",
+"@OX+@@",
+"@X ..o",
+"@Xo@o+",
+"@Xo@@@",
+"@O+@@@"
+};
diff --git a/data/pixmaps/feta/6/rests-3.xpm b/data/pixmaps/feta/6/rests-3.xpm
new file mode 100644
index 0000000..31d35ee
--- /dev/null
+++ b/data/pixmaps/feta/6/rests-3.xpm
@@ -0,0 +1,26 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"9 12 8 1",
+" c #090909",
+". c #353535",
+"X c #464646",
+"o c #727272",
+"O c #8e8e8e",
+"+ c #b1b1b1",
+"@ c #d0d0d0",
+"# c None",
+/* pixels */
+"#########",
+"##OO#####",
+"#o o##+O",
+"#O .#@X@",
+"##. .X#",
+"######Oo#",
+"######o@#",
+"#####@.##",
+"#####+X##",
+"#####.+##",
+"####+ ###",
+"####@+###"
+};
diff --git a/data/pixmaps/feta/6/rests-3mensural.xpm b/data/pixmaps/feta/6/rests-3mensural.xpm
new file mode 100644
index 0000000..65d248e
--- /dev/null
+++ b/data/pixmaps/feta/6/rests-3mensural.xpm
@@ -0,0 +1,19 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"6 6 7 1",
+" c Gray0",
+". c #282828",
+"X c Gray43",
+"o c #989898",
+"O c #afafaf",
+"+ c Gray82",
+"@ c None",
+/* pixels */
+"@@@@@@",
+"@@@+XO",
+"@+.. X",
+"@+o@oX",
+"@@@@oX",
+"@@@@OO"
+};
diff --git a/data/pixmaps/feta/6/rests-4.xpm b/data/pixmaps/feta/6/rests-4.xpm
new file mode 100644
index 0000000..9417098
--- /dev/null
+++ b/data/pixmaps/feta/6/rests-4.xpm
@@ -0,0 +1,32 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"10 18 8 1",
+" c #060606",
+". c #323232",
+"X c #4b4b4b",
+"o c #767676",
+"O c Gray53",
+"+ c #aeaeae",
+"@ c #d3d3d3",
+"# c None",
+/* pixels */
+"##########",
+"###@o+####",
+"###. O#+o",
+"##@ X#X+",
+"###+. X.@",
+"#######@O#",
+"#######OX#",
+"##. @##o@#",
+"#O .##.@#",
+"#o .OXX##",
+"##. ..X##",
+"###@##X+##",
+"#####@.###",
+"#####+X###",
+"#####oo###",
+"#####.+###",
+"####@ ####",
+"####@+####"
+};
diff --git a/data/pixmaps/feta/6/rests-4mensural.xpm b/data/pixmaps/feta/6/rests-4mensural.xpm
new file mode 100644
index 0000000..d3a5359
--- /dev/null
+++ b/data/pixmaps/feta/6/rests-4mensural.xpm
@@ -0,0 +1,21 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"6 7 8 1",
+" c #060606",
+". c #343434",
+"X c #535353",
+"o c #717171",
+"O c Gray57",
+"+ c #afafaf",
+"@ c #c3c3c3",
+"# c None",
+/* pixels */
+"######",
+"####++",
+"##+. o",
+"#+X+Xo",
+"##O. o",
+"#O +Oo",
+"####@+"
+};
diff --git a/data/pixmaps/feta/6/rests-5.xpm b/data/pixmaps/feta/6/rests-5.xpm
new file mode 100644
index 0000000..9a1aa47
--- /dev/null
+++ b/data/pixmaps/feta/6/rests-5.xpm
@@ -0,0 +1,38 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"11 24 8 1",
+" c #060606",
+". c #313131",
+"X c #4e4e4e",
+"o c #747474",
+"O c #8b8b8b",
+"+ c #acacac",
+"@ c Gray81",
+"# c None",
+/* pixels */
+"###########",
+"####@o+####",
+"####. O#+O",
+"###@ X#O+",
+"####. @",
+"####@oOo+X#",
+"########OX#",
+"###+o@##OO#",
+"##+ .##.@#",
+"##X +#.@#",
+"##@o ..X##",
+"#######OX##",
+"#######.@##",
+"##. @##.@##",
+"#O .#+X###",
+"#o OXX###",
+"##. . +###",
+"######.@###",
+"#####+.####",
+"#####+.####",
+"#####Xo####",
+"#####.+####",
+"####@ #####",
+"####@+#####"
+};
diff --git a/data/pixmaps/feta/6/rests-6.xpm b/data/pixmaps/feta/6/rests-6.xpm
new file mode 100644
index 0000000..4149256
--- /dev/null
+++ b/data/pixmaps/feta/6/rests-6.xpm
@@ -0,0 +1,43 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"12 29 8 1",
+" c Gray2",
+". c #313131",
+"X c Gray30",
+"o c Gray44",
+"O c #8e8e8e",
+"+ c #b1b1b1",
+"@ c Gray83",
+"# c None",
+/* pixels */
+"############",
+"#####@o+####",
+"#####. O#+o",
+"####@ X#o+",
+"#####. #",
+"#####@OOO+.@",
+"#########@O#",
+"####OX@##OX#",
+"###@ @#O+#",
+"###@ O@ @#",
+"####+...O.@#",
+"########+o##",
+"###@+###OX##",
+"##@. X##X+##",
+"##o +#.@##",
+"##O ..X###",
+"###o.XXXX###",
+"#######Oo###",
+"##o.###.+###",
+"#O X##.@###",
+"#o .#+.####",
+"#@. ..X####",
+"###@@@.o####",
+"######.+####",
+"###### +####",
+"#####+.#####",
+"#####O.#####",
+"#####.o#####",
+"#####+@#####"
+};
diff --git a/data/pixmaps/feta/6/rests-7.xpm b/data/pixmaps/feta/6/rests-7.xpm
new file mode 100644
index 0000000..73c43ac
--- /dev/null
+++ b/data/pixmaps/feta/6/rests-7.xpm
@@ -0,0 +1,49 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"13 35 8 1",
+" c Gray2",
+". c #313131",
+"X c Gray30",
+"o c #727272",
+"O c Gray55",
+"+ c Gray67",
+"@ c Gray82",
+"# c None",
+/* pixels */
+"#############",
+"######@o+####",
+"######. O#+O",
+"#####@ X#o+",
+"######+. X @",
+"###########.#",
+"######@###@O#",
+"#####O O##OX#",
+"####@ @#OO#",
+"####@ Xo @#",
+"#####O o.@#",
+"#########@o##",
+"#####@###OX##",
+"####. o##OO##",
+"###o @#.@##",
+"###+ XO.@##",
+"####@oOoOo###",
+"########OX###",
+"###+O###oO###",
+"##+ o##.@###",
+"##o .#@ @###",
+"##+ X####",
+"###+oo++X####",
+"#######oo####",
+"##. @##.+####",
+"#o .## @####",
+"#O .#O.#####",
+"##. XXX#####",
+"######Xo#####",
+"######.+#####",
+"#####@.@#####",
+"#####@.######",
+"#####O.######",
+"#####X+######",
+"#####+@######"
+};
diff --git a/data/pixmaps/feta/6/scripts-arpeggio.xpm b/data/pixmaps/feta/6/scripts-arpeggio.xpm
new file mode 100644
index 0000000..1b85028
--- /dev/null
+++ b/data/pixmaps/feta/6/scripts-arpeggio.xpm
@@ -0,0 +1,22 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"6 10 6 1",
+" c #090909",
+". c #3f3f3f",
+"X c #777777",
+"o c #929292",
+"O c Gray80",
+"+ c None",
+/* pixels */
+"++++++",
+"++oO++",
+"++o O+",
+"+++. O",
+"++O o",
+"+O O",
+"+X O+",
+"+O .++",
+"++O o+",
+"+++Oo+"
+};
diff --git a/data/pixmaps/feta/6/scripts-coda.xpm b/data/pixmaps/feta/6/scripts-coda.xpm
new file mode 100644
index 0000000..729a59a
--- /dev/null
+++ b/data/pixmaps/feta/6/scripts-coda.xpm
@@ -0,0 +1,31 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"14 17 8 1",
+" c Gray2",
+". c Gray18",
+"X c #505050",
+"o c #767676",
+"O c Gray56",
+"+ c Gray71",
+"@ c #d0d0d0",
+"# c None",
+/* pixels */
+"##############",
+"#######@######",
+"#######O######",
+"######@o######",
+"#####OOXo@####",
+"####o.#O+ ####",
+"#### O#o#.o###",
+"###O +#o#. ###",
+"#@+X o@X+. O+@",
+"#@+X o@X+ ++@",
+"###X +#o#. @##",
+"###@ +#o#..###",
+"####.o#O# +###",
+"####@.@Ooo####",
+"######O.+#####",
+"#######O######",
+"#######@######"
+};
diff --git a/data/pixmaps/feta/6/scripts-dfermata.xpm b/data/pixmaps/feta/6/scripts-dfermata.xpm
new file mode 100644
index 0000000..0705e84
--- /dev/null
+++ b/data/pixmaps/feta/6/scripts-dfermata.xpm
@@ -0,0 +1,25 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"17 11 8 1",
+" c #060606",
+". c #3e3e3e",
+"X c Gray28",
+"o c #6f6f6f",
+"O c Gray52",
+"+ c #b7b7b7",
+"@ c #c3c3c3",
+"# c None",
+/* pixels */
+"#################",
+"#@+#####OO#####++",
+"#oo####O O####oo",
+"##X####o O####X#",
+"##.+####Oo####+.#",
+"##+X##########X+#",
+"###X.########..##",
+"###+ O####O +##",
+"####+ +###",
+"#####@. .@####",
+"#######+OO+######"
+};
diff --git a/data/pixmaps/feta/6/scripts-dmarcato.xpm b/data/pixmaps/feta/6/scripts-dmarcato.xpm
new file mode 100644
index 0000000..81c5845
--- /dev/null
+++ b/data/pixmaps/feta/6/scripts-dmarcato.xpm
@@ -0,0 +1,22 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"8 8 8 1",
+" c Gray2",
+". c Gray21",
+"X c Gray36",
+"o c #6d6d6d",
+"O c #888888",
+"+ c Gray70",
+"@ c #d2d2d2",
+"# c None",
+/* pixels */
+"########",
+"#+oO##@+",
+"#@ @#o+",
+"##X o@X#",
+"##@ .X@#",
+"###. .##",
+"###+ +##",
+"####O###"
+};
diff --git a/data/pixmaps/feta/6/scripts-downbow.xpm b/data/pixmaps/feta/6/scripts-downbow.xpm
new file mode 100644
index 0000000..6826845
--- /dev/null
+++ b/data/pixmaps/feta/6/scripts-downbow.xpm
@@ -0,0 +1,21 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"11 9 6 1",
+" c #010101",
+". c #797979",
+"X c #929292",
+"o c Gray72",
+"O c #d3d3d3",
+"+ c None",
+/* pixels */
+"+++++++++++",
+"+O........O",
+"+X X",
+"+X X",
+"+XXooooooXX",
+"+XO++++++OX",
+"+XO++++++OX",
+"+XO++++++OX",
+"+O++++++++O"
+};
diff --git a/data/pixmaps/feta/6/scripts-downmordent.xpm b/data/pixmaps/feta/6/scripts-downmordent.xpm
new file mode 100644
index 0000000..a8965fc
--- /dev/null
+++ b/data/pixmaps/feta/6/scripts-downmordent.xpm
@@ -0,0 +1,24 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"22 10 8 1",
+" c Gray2",
+". c Gray17",
+"X c Gray30",
+"o c Gray42",
+"O c #959595",
+"+ c #afafaf",
+"@ c #d8d8d8",
+"# c None",
+/* pixels */
+"######################",
+"##O@##################",
+"#@ @##########@#######",
+"#oo#@O####O@#@.@O#####",
+"#oo#o X@#@ O#.X X@#@#",
+"#Oo+ .+. o .+.+",
+"##. X .. X o#",
+"##@O#O .##. #O .##",
+"######@.+###O..@#@.+##",
+"#############@O#######"
+};
diff --git a/data/pixmaps/feta/6/scripts-downprall.xpm b/data/pixmaps/feta/6/scripts-downprall.xpm
new file mode 100644
index 0000000..856b6c4
--- /dev/null
+++ b/data/pixmaps/feta/6/scripts-downprall.xpm
@@ -0,0 +1,24 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"22 10 8 1",
+" c Gray2",
+". c #373737",
+"X c #494949",
+"o c #767676",
+"O c Gray51",
+"+ c #b9b9b9",
+"@ c #c6c6c6",
+"# c None",
+/* pixels */
+"######################",
+"##+@##################",
+"## @##################",
+"#Oo#@+####@#####+#####",
+"#oo#o O### .@##o O####",
+"#oo@ X#X +@ X#.+",
+"## . .#",
+"##+X#X @+ X#X +#",
+"######o o##@. ###O o##",
+"#######+#####+####@###"
+};
diff --git a/data/pixmaps/feta/6/scripts-dpedalheel.xpm b/data/pixmaps/feta/6/scripts-dpedalheel.xpm
new file mode 100644
index 0000000..32887dc
--- /dev/null
+++ b/data/pixmaps/feta/6/scripts-dpedalheel.xpm
@@ -0,0 +1,19 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"8 9 4 1",
+" c #555555",
+". c #717171",
+"X c #cdcdcd",
+"o c None",
+/* pixels */
+"oooooooo",
+"ooo...oo",
+"oo . o",
+"o..ooo..",
+"o..ooo..",
+"o..ooo..",
+"o..ooo..",
+"o..ooo..",
+"oXoooooX"
+};
diff --git a/data/pixmaps/feta/6/scripts-dpedaltoe.xpm b/data/pixmaps/feta/6/scripts-dpedaltoe.xpm
new file mode 100644
index 0000000..5f79ae7
--- /dev/null
+++ b/data/pixmaps/feta/6/scripts-dpedaltoe.xpm
@@ -0,0 +1,24 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"8 10 8 1",
+" c #090909",
+". c Gray18",
+"X c #565656",
+"o c #6c6c6c",
+"O c #888888",
+"+ c #b7b7b7",
+"@ c Gray81",
+"# c None",
+/* pixels */
+"########",
+"#@@###@@",
+"#OX###.+",
+"## ##@.#",
+"##XO#oo#",
+"##OX#.@#",
+"###.+.##",
+"###o O##",
+"###+ @##",
+"####+###"
+};
diff --git a/data/pixmaps/feta/6/scripts-dstaccatissimo.xpm b/data/pixmaps/feta/6/scripts-dstaccatissimo.xpm
new file mode 100644
index 0000000..dbd58b4
--- /dev/null
+++ b/data/pixmaps/feta/6/scripts-dstaccatissimo.xpm
@@ -0,0 +1,18 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"4 7 5 1",
+" c Gray4",
+". c #7b7b7b",
+"X c Gray54",
+"o c #a4a4a4",
+"O c None",
+/* pixels */
+"OOOO",
+"OOXO",
+"OO O",
+"OO O",
+"Oo o",
+"OX X",
+"OO.O"
+};
diff --git a/data/pixmaps/feta/6/scripts-flageolet.xpm b/data/pixmaps/feta/6/scripts-flageolet.xpm
new file mode 100644
index 0000000..f516984
--- /dev/null
+++ b/data/pixmaps/feta/6/scripts-flageolet.xpm
@@ -0,0 +1,17 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"8 8 3 1",
+" c Gray59",
+". c #d5d5d5",
+"X c None",
+/* pixels */
+"XXXXXXXX",
+"XXX XX",
+"XX ... X",
+"X .XXX. ",
+"X .XXX. ",
+"X .XXX. ",
+"XX ... X",
+"XXX XX"
+};
diff --git a/data/pixmaps/feta/6/scripts-lcomma.xpm b/data/pixmaps/feta/6/scripts-lcomma.xpm
new file mode 100644
index 0000000..76058ce
--- /dev/null
+++ b/data/pixmaps/feta/6/scripts-lcomma.xpm
@@ -0,0 +1,22 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"4 9 7 1",
+" c Gray0",
+". c #323232",
+"X c Gray42",
+"o c Gray56",
+"O c #a2a2a2",
+"+ c Gray81",
+"@ c None",
+/* pixels */
+"@@@@",
+"@@@+",
+"@@Xo",
+"@@.@",
+"@o.@",
+"@X.@",
+"@X.@",
+"@O +",
+"@@X@"
+};
diff --git a/data/pixmaps/feta/6/scripts-lineprall.xpm b/data/pixmaps/feta/6/scripts-lineprall.xpm
new file mode 100644
index 0000000..dbd5c88
--- /dev/null
+++ b/data/pixmaps/feta/6/scripts-lineprall.xpm
@@ -0,0 +1,31 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"21 17 8 1",
+" c #040404",
+". c #343434",
+"X c Gray29",
+"o c #727272",
+"O c #868686",
+"+ c #bbbbbb",
+"@ c Gray76",
+"# c None",
+/* pixels */
+"#####################",
+"#@+##################",
+"#oo##################",
+"#oo##################",
+"#oo##################",
+"#oo##################",
+"#oo##################",
+"#oo##################",
+"#oo##################",
+"#oo##################",
+"#oo#+####+#####+#####",
+"#ooO o### .+##o o####",
+"#O. X#X +@ X#X+",
+"#O .#",
+"#O.#X @+ X#X +#",
+"#####O o##+. ###o o##",
+"######@#####+####+###"
+};
diff --git a/data/pixmaps/feta/6/scripts-mordent.xpm b/data/pixmaps/feta/6/scripts-mordent.xpm
new file mode 100644
index 0000000..5043edd
--- /dev/null
+++ b/data/pixmaps/feta/6/scripts-mordent.xpm
@@ -0,0 +1,23 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"15 9 8 1",
+" c #060606",
+". c #313131",
+"X c Gray32",
+"o c #6f6f6f",
+"O c #939393",
+"+ c Gray70",
+"@ c Gray85",
+"# c None",
+/* pixels */
+"###############",
+"#######@O######",
+"###OX##+ X@####",
+"###. @@ O#+@",
+"##o .o o +",
+"#+ o .. o#",
+"#@+#O .X@ .##",
+"#####@XOX##XO##",
+"#######@+######"
+};
diff --git a/data/pixmaps/feta/6/scripts-open.xpm b/data/pixmaps/feta/6/scripts-open.xpm
new file mode 100644
index 0000000..b7a6d18
--- /dev/null
+++ b/data/pixmaps/feta/6/scripts-open.xpm
@@ -0,0 +1,19 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"7 8 5 1",
+" c #464646",
+". c #717171",
+"X c Gray55",
+"o c #a7a7a7",
+"O c None",
+/* pixels */
+"OOOOOOO",
+"OOOXXOO",
+"OO oo O",
+"Oo.OO.o",
+"O..OO..",
+"Oo.OO.o",
+"OO Xo O",
+"OOOXXOO"
+};
diff --git a/data/pixmaps/feta/6/scripts-prall.xpm b/data/pixmaps/feta/6/scripts-prall.xpm
new file mode 100644
index 0000000..9bf049d
--- /dev/null
+++ b/data/pixmaps/feta/6/scripts-prall.xpm
@@ -0,0 +1,22 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"15 8 8 1",
+" c Gray2",
+". c Gray20",
+"X c #505050",
+"o c #6c6c6c",
+"O c #989898",
+"+ c Gray70",
+"@ c Gray80",
+"# c None",
+/* pixels */
+"###############",
+"###@@####@#####",
+"###o O##+ o####",
+"##+ o# .#X+",
+"##. .#",
+"#+X#. .#o +#",
+"#####o +##O X##",
+"######+####@@##"
+};
diff --git a/data/pixmaps/feta/6/scripts-pralldown.xpm b/data/pixmaps/feta/6/scripts-pralldown.xpm
new file mode 100644
index 0000000..c72e279
--- /dev/null
+++ b/data/pixmaps/feta/6/scripts-pralldown.xpm
@@ -0,0 +1,25 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"21 11 8 1",
+" c #060606",
+". c #2f2f2f",
+"X c #505050",
+"o c Gray45",
+"O c #939393",
+"+ c Gray69",
+"@ c Gray82",
+"# c None",
+/* pixels */
+"#####################",
+"######+####@@####+###",
+"####@X O##O X##+. @##",
+"#+.@. @o o+ .##",
+"##X . . .O#",
+"##@ O#X X#O @@ #",
+"###O.@##@ O###XX###XO",
+"####@##############oo",
+"###################oo",
+"################### @",
+"##################@+#"
+};
diff --git a/data/pixmaps/feta/6/scripts-prallmordent.xpm b/data/pixmaps/feta/6/scripts-prallmordent.xpm
new file mode 100644
index 0000000..c9be15e
--- /dev/null
+++ b/data/pixmaps/feta/6/scripts-prallmordent.xpm
@@ -0,0 +1,23 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"21 9 8 1",
+" c #060606",
+". c #323232",
+"X c #494949",
+"o c #797979",
+"O c #989898",
+"+ c Gray69",
+"@ c #c0c0c0",
+"# c None",
+/* pixels */
+"#####################",
+"#############O#######",
+"###+X####XO##.OX#####",
+"###X +#+ X@.. +#+#",
+"##o o . o @",
+"#@ o XX o o#",
+"##+#+ X##X #+ X##",
+"######X+###+..###X+##",
+"#############O#######"
+};
diff --git a/data/pixmaps/feta/6/scripts-prallprall.xpm b/data/pixmaps/feta/6/scripts-prallprall.xpm
new file mode 100644
index 0000000..22aeb6a
--- /dev/null
+++ b/data/pixmaps/feta/6/scripts-prallprall.xpm
@@ -0,0 +1,22 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"21 8 8 1",
+" c #040404",
+". c #393939",
+"X c #494949",
+"o c #7c7c7c",
+"O c #818181",
+"+ c Gray73",
+"@ c Gray76",
+"# c None",
+/* pixels */
+"#####################",
+"####@####@#####@#####",
+"###o o### .@##o O####",
+"##+ X#X ++ X#X+",
+"##. .#",
+"#+X#X @+ X#X +#",
+"#####O o##+. ###O o##",
+"######@#####@####@###"
+};
diff --git a/data/pixmaps/feta/6/scripts-prallup.xpm b/data/pixmaps/feta/6/scripts-prallup.xpm
new file mode 100644
index 0000000..c25cf4b
--- /dev/null
+++ b/data/pixmaps/feta/6/scripts-prallup.xpm
@@ -0,0 +1,24 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"22 10 8 1",
+" c Gray2",
+". c #373737",
+"X c #494949",
+"o c #767676",
+"O c Gray51",
+"+ c #b9b9b9",
+"@ c #c6c6c6",
+"# c None",
+/* pixels */
+"######################",
+"###################@+#",
+"###################@ #",
+"######+#####@####+##oo",
+"#####o o##@. ###O o#oo",
+"#+X#X @+ X#X @oo",
+"##. . #",
+"##+ X#X ++ X#.+#",
+"###o o### .+##o O#####",
+"####+####@#####@######"
+};
diff --git a/data/pixmaps/feta/6/scripts-rcomma.xpm b/data/pixmaps/feta/6/scripts-rcomma.xpm
new file mode 100644
index 0000000..99e94fb
--- /dev/null
+++ b/data/pixmaps/feta/6/scripts-rcomma.xpm
@@ -0,0 +1,22 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"4 9 7 1",
+" c Gray0",
+". c #323232",
+"X c Gray42",
+"o c Gray56",
+"O c #a2a2a2",
+"+ c Gray81",
+"@ c None",
+/* pixels */
+"@@@@",
+"@@X@",
+"@+ O",
+"@@.X",
+"@@.X",
+"@@.o",
+"@@.@",
+"@oX@",
+"@+@@"
+};
diff --git a/data/pixmaps/feta/6/scripts-reverseturn.xpm b/data/pixmaps/feta/6/scripts-reverseturn.xpm
new file mode 100644
index 0000000..e432a75
--- /dev/null
+++ b/data/pixmaps/feta/6/scripts-reverseturn.xpm
@@ -0,0 +1,22 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"14 8 8 1",
+" c #010101",
+". c Gray21",
+"X c #484848",
+"o c #777777",
+"O c Gray56",
+"+ c #b9b9b9",
+"@ c #c8c8c8",
+"# c None",
+/* pixels */
+"##############",
+"###OO####OO@##",
+"##. o#+. .#",
+"#@oX @+ XO.+",
+"#O@##+ +##@O",
+"#+.OX @@ Xo@",
+"##X .@#o .#",
+"###+OO####OO##"
+};
diff --git a/data/pixmaps/feta/6/scripts-segno.xpm b/data/pixmaps/feta/6/scripts-segno.xpm
new file mode 100644
index 0000000..42c5c7b
--- /dev/null
+++ b/data/pixmaps/feta/6/scripts-segno.xpm
@@ -0,0 +1,33 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"13 19 8 1",
+" c Gray1",
+". c #373737",
+"X c #4c4c4c",
+"o c Gray48",
+"O c Gray55",
+"+ c Gray70",
+"@ c Gray78",
+"# c None",
+/* pixels */
+"#############",
+"###+OO#####O@",
+"##..#O +##o #",
+"#@ O## X## +#",
+"#O o#o #o.##",
+"#O X#+ X+ +##",
+"#@ +###X.###",
+"##X +#+ ####",
+"###X O.O#.O#",
+"####X +#o+#",
+"##+o#+ X###",
+"##O.#O.O X##",
+"##### +#+ X#",
+"####X.###+ @",
+"###+ +X +#X O",
+"###.O# o#o O",
+"##+ ##X ##o @",
+"## o##+ O#..#",
+"#@O#####OO+##"
+};
diff --git a/data/pixmaps/feta/6/scripts-sforzato.xpm b/data/pixmaps/feta/6/scripts-sforzato.xpm
new file mode 100644
index 0000000..7e03ac4
--- /dev/null
+++ b/data/pixmaps/feta/6/scripts-sforzato.xpm
@@ -0,0 +1,21 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"11 8 7 1",
+" c Gray0",
+". c #2a2a2a",
+"X c Gray43",
+"o c #8d8d8d",
+"O c Gray70",
+"+ c Gray84",
+"@ c None",
+/* pixels */
+"@@@@@@@@@@@",
+"@OO@@@@@@@@",
+"@O..Xo@@@@@",
+"@@@+XX.Xo+@",
+"@@@@@@++X o",
+"@@@+XX.Xo+@",
+"@O..Xo@@@@@",
+"@OO@@@@@@@@"
+};
diff --git a/data/pixmaps/feta/6/scripts-staccato.xpm b/data/pixmaps/feta/6/scripts-staccato.xpm
new file mode 100644
index 0000000..5da730f
--- /dev/null
+++ b/data/pixmaps/feta/6/scripts-staccato.xpm
@@ -0,0 +1,12 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"3 3 3 1",
+" c #8e8e8e",
+". c #b7b7b7",
+"X c None",
+/* pixels */
+"XXX",
+"X..",
+"X "
+};
diff --git a/data/pixmaps/feta/6/scripts-stopped.xpm b/data/pixmaps/feta/6/scripts-stopped.xpm
new file mode 100644
index 0000000..99da16f
--- /dev/null
+++ b/data/pixmaps/feta/6/scripts-stopped.xpm
@@ -0,0 +1,18 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"8 8 4 1",
+" c Gray8",
+". c Gray59",
+"X c #dddddd",
+"o c None",
+/* pixels */
+"oooooooo",
+"oooo.ooo",
+"oooo ooo",
+"oooX Xoo",
+"o. .",
+"ooXX Xoo",
+"oooo ooo",
+"oooo.ooo"
+};
diff --git a/data/pixmaps/feta/6/scripts-tenuto.xpm b/data/pixmaps/feta/6/scripts-tenuto.xpm
new file mode 100644
index 0000000..3a06d14
--- /dev/null
+++ b/data/pixmaps/feta/6/scripts-tenuto.xpm
@@ -0,0 +1,12 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"8 3 3 1",
+" c Gray43",
+". c #b6b6b6",
+"X c None",
+/* pixels */
+"XXXXXXXX",
+"X. .",
+"X. ."
+};
diff --git a/data/pixmaps/feta/6/scripts-thumb.xpm b/data/pixmaps/feta/6/scripts-thumb.xpm
new file mode 100644
index 0000000..97602f5
--- /dev/null
+++ b/data/pixmaps/feta/6/scripts-thumb.xpm
@@ -0,0 +1,23 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"7 10 7 1",
+" c Gray1",
+". c #3e3e3e",
+"X c #414141",
+"o c Gray42",
+"O c Gray57",
+"+ c Gray72",
+"@ c None",
+/* pixels */
+"@@@@@@@",
+"@@@OO@@",
+"@@XOO.@",
+"@+ @@ +",
+"@O @@ O",
+"@+ @@ +",
+"@@.++.@",
+"@@@..@@",
+"@@@oo@@",
+"@@@++@@"
+};
diff --git a/data/pixmaps/feta/6/scripts-trilelement.xpm b/data/pixmaps/feta/6/scripts-trilelement.xpm
new file mode 100644
index 0000000..5fb396b
--- /dev/null
+++ b/data/pixmaps/feta/6/scripts-trilelement.xpm
@@ -0,0 +1,22 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"10 8 8 1",
+" c Gray1",
+". c Gray24",
+"X c Gray28",
+"o c #7c7c7c",
+"O c #818181",
+"+ c #b9b9b9",
+"@ c #c3c3c3",
+"# c None",
+/* pixels */
+"##########",
+"####@#####",
+"###o O####",
+"##+ X#X+",
+"##. .#",
+"#+X#X +#",
+"#####O o##",
+"######+###"
+};
diff --git a/data/pixmaps/feta/6/scripts-trill-element.xpm b/data/pixmaps/feta/6/scripts-trill-element.xpm
new file mode 100644
index 0000000..61cf5a9
--- /dev/null
+++ b/data/pixmaps/feta/6/scripts-trill-element.xpm
@@ -0,0 +1,18 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"10 6 6 1",
+" c #0e0e0e",
+". c #414141",
+"X c #6a6a6a",
+"o c #909090",
+"O c Gray81",
+"+ c None",
+/* pixels */
+"++++++++++",
+"+++OXO++++",
+"++O O+oo",
+"+O . . O",
+"+oo+O O+",
+"+++++OXO++"
+};
diff --git a/data/pixmaps/feta/6/scripts-trill.xpm b/data/pixmaps/feta/6/scripts-trill.xpm
new file mode 100644
index 0000000..8a1fce1
--- /dev/null
+++ b/data/pixmaps/feta/6/scripts-trill.xpm
@@ -0,0 +1,29 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"19 15 8 1",
+" c #060606",
+". c #2c2c2c",
+"X c Gray37",
+"o c Gray47",
+"O c Gray54",
+"+ c #aeaeae",
+"@ c Gray81",
+"# c None",
+/* pixels */
+"###################",
+"########o+#########",
+"#######o +#########",
+"####### ##########",
+"####### .##########",
+"######+ o##@@###@@#",
+"###++#O O#O. .+O. +",
+"##+++OX oO@#O X#. O",
+"#@O### @###o +#. #",
+"#O@#+O .+###. ###@#",
+"##oO@@ o#O## #####",
+"#####o O#o## .#####",
+"#####O Xoo#@ o#####",
+"###### .##o o#####",
+"######+o###########"
+};
diff --git a/data/pixmaps/feta/6/scripts-turn.xpm b/data/pixmaps/feta/6/scripts-turn.xpm
new file mode 100644
index 0000000..fa1bc6d
--- /dev/null
+++ b/data/pixmaps/feta/6/scripts-turn.xpm
@@ -0,0 +1,22 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"14 8 8 1",
+" c #010101",
+". c Gray21",
+"X c #484848",
+"o c #777777",
+"O c Gray56",
+"+ c #b9b9b9",
+"@ c #c8c8c8",
+"# c None",
+/* pixels */
+"##############",
+"###@OO####OO##",
+"##X .+#o .#",
+"#+.OX @@ Xo@",
+"#O@##+ +##@O",
+"#@oX @@ XO.+",
+"##. o#+. X#",
+"###OO####OO@##"
+};
diff --git a/data/pixmaps/feta/6/scripts-ufermata.xpm b/data/pixmaps/feta/6/scripts-ufermata.xpm
new file mode 100644
index 0000000..d5ff0a0
--- /dev/null
+++ b/data/pixmaps/feta/6/scripts-ufermata.xpm
@@ -0,0 +1,25 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"17 11 8 1",
+" c #060606",
+". c #3e3e3e",
+"X c Gray28",
+"o c #6f6f6f",
+"O c Gray52",
+"+ c #b7b7b7",
+"@ c #c3c3c3",
+"# c None",
+/* pixels */
+"#################",
+"#######+OO+######",
+"#####+. X@####",
+"####+ +###",
+"###+ O####o +##",
+"###..########X.##",
+"##+X##########X+#",
+"##.+####Oo####+.#",
+"##X####O O####X#",
+"#oo####O O####oo",
+"#++#####OO#####++"
+};
diff --git a/data/pixmaps/feta/6/scripts-umarcato.xpm b/data/pixmaps/feta/6/scripts-umarcato.xpm
new file mode 100644
index 0000000..fda4e01
--- /dev/null
+++ b/data/pixmaps/feta/6/scripts-umarcato.xpm
@@ -0,0 +1,22 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"8 8 8 1",
+" c Gray2",
+". c Gray21",
+"X c Gray36",
+"o c #6d6d6d",
+"O c #888888",
+"+ c Gray70",
+"@ c #d2d2d2",
+"# c None",
+/* pixels */
+"########",
+"####O###",
+"###+ +##",
+"###. .##",
+"##@X @#",
+"##X@o X#",
+"#+o#@ @",
+"#+@##Oo+"
+};
diff --git a/data/pixmaps/feta/6/scripts-upbow.xpm b/data/pixmaps/feta/6/scripts-upbow.xpm
new file mode 100644
index 0000000..c25301f
--- /dev/null
+++ b/data/pixmaps/feta/6/scripts-upbow.xpm
@@ -0,0 +1,28 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"9 14 8 1",
+" c #181818",
+". c #2d2d2d",
+"X c Gray26",
+"o c #6a6a6a",
+"O c #818181",
+"+ c Gray69",
+"@ c Gray79",
+"# c None",
+/* pixels */
+"#########",
+"##@#####@",
+"#oo####oo",
+"## #### #",
+"## ###+X#",
+"##oo##oo#",
+"##+.##X+#",
+"### ## ##",
+"###X++X##",
+"###oOoo##",
+"###+. ###",
+"#### ###",
+"####oo###",
+"#####@###"
+};
diff --git a/data/pixmaps/feta/6/scripts-upedalheel.xpm b/data/pixmaps/feta/6/scripts-upedalheel.xpm
new file mode 100644
index 0000000..87dadf9
--- /dev/null
+++ b/data/pixmaps/feta/6/scripts-upedalheel.xpm
@@ -0,0 +1,19 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"8 9 4 1",
+" c #555555",
+". c #717171",
+"X c #cdcdcd",
+"o c None",
+/* pixels */
+"oooooooo",
+"oXoooooX",
+"o..ooo..",
+"o..ooo..",
+"o..ooo .",
+"o..ooo..",
+"o. ooo .",
+"oo . o",
+"ooo...oo"
+};
diff --git a/data/pixmaps/feta/6/scripts-upedaltoe.xpm b/data/pixmaps/feta/6/scripts-upedaltoe.xpm
new file mode 100644
index 0000000..4080a16
--- /dev/null
+++ b/data/pixmaps/feta/6/scripts-upedaltoe.xpm
@@ -0,0 +1,24 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"8 10 8 1",
+" c #090909",
+". c Gray18",
+"X c #565656",
+"o c #6c6c6c",
+"O c #888888",
+"+ c #b7b7b7",
+"@ c Gray81",
+"# c None",
+/* pixels */
+"########",
+"####+###",
+"###+ @##",
+"###o O##",
+"###.+.##",
+"##OX#.@#",
+"##XO#oo#",
+"## ##@.#",
+"#OX###.+",
+"#@@###@@"
+};
diff --git a/data/pixmaps/feta/6/scripts-upmordent.xpm b/data/pixmaps/feta/6/scripts-upmordent.xpm
new file mode 100644
index 0000000..b3a6abe
--- /dev/null
+++ b/data/pixmaps/feta/6/scripts-upmordent.xpm
@@ -0,0 +1,26 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"21 12 8 1",
+" c Gray2",
+". c #2f2f2f",
+"X c Gray29",
+"o c Gray44",
+"O c #939393",
+"+ c #b4b4b4",
+"@ c #d3d3d3",
+"# c None",
+/* pixels */
+"#####################",
+"#############O@######",
+"####.+###oo##.OX#####",
+"###+ o##. .#X. O#+@",
+"##@ o. .. o +",
+"##.XX .o o. o#",
+"#@.##. @#o @@ .##",
+"#oo###Oo###@X @##oO##",
+"#oo##########O@######",
+"#oo##################",
+"#@ ##################",
+"##+@#################"
+};
diff --git a/data/pixmaps/feta/6/scripts-upprall.xpm b/data/pixmaps/feta/6/scripts-upprall.xpm
new file mode 100644
index 0000000..78b4a57
--- /dev/null
+++ b/data/pixmaps/feta/6/scripts-upprall.xpm
@@ -0,0 +1,25 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"21 11 8 1",
+" c #060606",
+". c #2f2f2f",
+"X c #505050",
+"o c Gray45",
+"O c #939393",
+"+ c Gray69",
+"@ c Gray82",
+"# c None",
+/* pixels */
+"#####################",
+"####+####@@####+#####",
+"###@ .@##. O##O X@###",
+"###. +o o@ .@.+",
+"##O. . . X#",
+"## @@ +#X X#O @#",
+"#OX###X.###O @##@.O##",
+"#oo##################",
+"#oo##################",
+"#@ ##################",
+"##+@#################"
+};
diff --git a/data/pixmaps/feta/6/scripts-ustaccatissimo.xpm b/data/pixmaps/feta/6/scripts-ustaccatissimo.xpm
new file mode 100644
index 0000000..2bd7272
--- /dev/null
+++ b/data/pixmaps/feta/6/scripts-ustaccatissimo.xpm
@@ -0,0 +1,18 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"4 7 5 1",
+" c Gray4",
+". c #7b7b7b",
+"X c Gray54",
+"o c #a4a4a4",
+"O c None",
+/* pixels */
+"OOOO",
+"OO.O",
+"OX X",
+"Oo o",
+"OO O",
+"OO O",
+"OOXO"
+};
diff --git a/data/pixmaps/feta/6/unknown.xpm b/data/pixmaps/feta/6/unknown.xpm
new file mode 100644
index 0000000..8698b03
--- /dev/null
+++ b/data/pixmaps/feta/6/unknown.xpm
@@ -0,0 +1,16 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"6 8 2 1",
+"x c Gray0",
+" c None",
+/* pixels */
+" xxx ",
+" x ",
+" x ",
+" xx ",
+" x ",
+" ",
+" x ",
+" "
+};
diff --git a/data/pixmaps/feta/8/accidentals-(.xpm b/data/pixmaps/feta/8/accidentals-(.xpm
new file mode 100644
index 0000000..7b48b75
--- /dev/null
+++ b/data/pixmaps/feta/8/accidentals-(.xpm
@@ -0,0 +1,31 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"5 18 7 1",
+" c #1b1b1b",
+". c #2c2c2c",
+"X c #6f6f6f",
+"o c Gray56",
+"O c #b7b7b7",
+"+ c #d2d2d2",
+"@ c None",
+/* pixels */
+"@@@@@",
+"@@@+O",
+"@@@Xo",
+"@@+.@",
+"@@XX@",
+"@@ O@",
+"@+.@@",
+"@X.@@",
+"@X @@",
+"@X.@@",
+"@X @@",
+"@X.@@",
+"@+.@@",
+"@@ O@",
+"@@XX@",
+"@@+.@",
+"@@@Xo",
+"@@@+O"
+};
diff --git a/data/pixmaps/feta/8/accidentals-).xpm b/data/pixmaps/feta/8/accidentals-).xpm
new file mode 100644
index 0000000..7b59f8c
--- /dev/null
+++ b/data/pixmaps/feta/8/accidentals-).xpm
@@ -0,0 +1,31 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"5 18 7 1",
+" c #1b1b1b",
+". c #2c2c2c",
+"X c #6f6f6f",
+"o c Gray56",
+"O c #b7b7b7",
+"+ c #d2d2d2",
+"@ c None",
+/* pixels */
+"@@@@@",
+"@O+@@",
+"@oX@@",
+"@@.+@",
+"@@Xo@",
+"@@O @",
+"@@@.+",
+"@@@.X",
+"@@@ X",
+"@@@ X",
+"@@@ X",
+"@@@ X",
+"@@@.+",
+"@@+ @",
+"@@XX@",
+"@@.+@",
+"@oX@@",
+"@O+@@"
+};
diff --git a/data/pixmaps/feta/8/accidentals--1.xpm b/data/pixmaps/feta/8/accidentals--1.xpm
new file mode 100644
index 0000000..69bf1dd
--- /dev/null
+++ b/data/pixmaps/feta/8/accidentals--1.xpm
@@ -0,0 +1,36 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"9 22 8 1",
+" c Gray5",
+". c Gray18",
+"X c #4c4c4c",
+"o c #717171",
+"O c Gray55",
+"+ c #b7b7b7",
+"@ c #cbcbcb",
+"# c None",
+/* pixels */
+"#########",
+"#@o+#####",
+"#+ +#####",
+"## ######",
+"## ######",
+"## ######",
+"## ######",
+"## ######",
+"## ######",
+"## ######",
+"## ######",
+"## ##++##",
+"## o o#",
+"## X. @",
+"## O#@ O",
+"## @## +",
+"## @#@ .#",
+"## ##X.##",
+"## #X.###",
+"##...####",
+"## .#####",
+"##O######"
+};
diff --git a/data/pixmaps/feta/8/accidentals--2.xpm b/data/pixmaps/feta/8/accidentals--2.xpm
new file mode 100644
index 0000000..4d80580
--- /dev/null
+++ b/data/pixmaps/feta/8/accidentals--2.xpm
@@ -0,0 +1,36 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"14 22 8 1",
+" c #0c0c0c",
+". c #2c2c2c",
+"X c #4c4c4c",
+"o c #747474",
+"O c #8d8d8d",
+"+ c #b4b4b4",
+"@ c Gray80",
+"# c None",
+/* pixels */
+"##############",
+"#@o+##@O######",
+"#+ +##o ######",
+"## ###o ######",
+"## ###o ######",
+"## ###O ######",
+"## #### ######",
+"## #### ######",
+"## @### ######",
+"## #### ######",
+"## #### @#####",
+"## ##@+ ##+@##",
+"## o o o#",
+"## X. X. +",
+"## X#@ O#@ O",
+"## @## ### +",
+"## ##O ##@ .#",
+"## ## O.##X.##",
+"## #XO# #X.###",
+"##..O##...####",
+"## o### .#####",
+"##O####O######"
+};
diff --git a/data/pixmaps/feta/8/accidentals-0.xpm b/data/pixmaps/feta/8/accidentals-0.xpm
new file mode 100644
index 0000000..1300396
--- /dev/null
+++ b/data/pixmaps/feta/8/accidentals-0.xpm
@@ -0,0 +1,38 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"7 25 7 1",
+" c Gray2",
+". c Gray16",
+"X c #6f6f6f",
+"o c Gray53",
+"O c #b9b9b9",
+"+ c #c5c5c5",
+"@ c None",
+/* pixels */
+"@@@@@@@",
+"@+O@@@@",
+"@XX@@@@",
+"@XX@@@@",
+"@XX@@@@",
+"@XX@@@@",
+"@XX@@XO",
+"@o o",
+"@o o",
+"@o o",
+"@o.X+XX",
+"@XX@@XX",
+"@XX@@XX",
+"@XX@@XX",
+"@XX@@XX",
+"@XX+o.o",
+"@o o",
+"@o o",
+"@o o",
+"@+X@@XX",
+"@@@@@XX",
+"@@@@@XX",
+"@@@@@XX",
+"@@@@@XX",
+"@@@@@O+"
+};
diff --git a/data/pixmaps/feta/8/accidentals-1.xpm b/data/pixmaps/feta/8/accidentals-1.xpm
new file mode 100644
index 0000000..0e90b59
--- /dev/null
+++ b/data/pixmaps/feta/8/accidentals-1.xpm
@@ -0,0 +1,40 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"10 26 8 1",
+" c #040404",
+". c #2f2f2f",
+"X c #4c4c4c",
+"o c #777777",
+"O c #9a9a9a",
+"+ c #acacac",
+"@ c Gray80",
+"# c None",
+/* pixels */
+"##########",
+"######@+##",
+"######OX##",
+"###XO#OX##",
+"###XO#OX##",
+"###XO#OX##",
+"###XO#OX@+",
+"###XO#o o",
+"###X. o",
+"#@. .@",
+"#o .X##",
+"#o o#OX##",
+"#+@XO#OX##",
+"###XO#OX##",
+"###XO#OX@+",
+"###XO#o o",
+"###X. o",
+"#@. .@",
+"#o .X##",
+"#o o#OX##",
+"#+@XO#OX##",
+"###XO#OX##",
+"###XO#OX##",
+"###XO#OX##",
+"###XO#####",
+"###+@#####"
+};
diff --git a/data/pixmaps/feta/8/accidentals-2.xpm b/data/pixmaps/feta/8/accidentals-2.xpm
new file mode 100644
index 0000000..485acb4
--- /dev/null
+++ b/data/pixmaps/feta/8/accidentals-2.xpm
@@ -0,0 +1,22 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"10 10 6 1",
+" c #020202",
+". c Gray27",
+"X c #7c7c7c",
+"o c Gray55",
+"O c Gray79",
+"+ c None",
+/* pixels */
+"++++++++++",
+"+OXo+++oXO",
+"+o o+X o",
+"+o .+. o",
+"++o. X .o+",
+"++++X X+++",
+"++o. X .o+",
+"+o .+. o",
+"+o X+X o",
+"+OXo+++oXO"
+};
diff --git a/data/pixmaps/feta/8/accordion-accBB.xpm b/data/pixmaps/feta/8/accordion-accBB.xpm
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/pixmaps/feta/8/accordion-accBB.xpm
diff --git a/data/pixmaps/feta/8/accordion-accBayanbase.xpm b/data/pixmaps/feta/8/accordion-accBayanbase.xpm
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/pixmaps/feta/8/accordion-accBayanbase.xpm
diff --git a/data/pixmaps/feta/8/accordion-accDiscant.xpm b/data/pixmaps/feta/8/accordion-accDiscant.xpm
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/pixmaps/feta/8/accordion-accDiscant.xpm
diff --git a/data/pixmaps/feta/8/accordion-accDot.xpm b/data/pixmaps/feta/8/accordion-accDot.xpm
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/pixmaps/feta/8/accordion-accDot.xpm
diff --git a/data/pixmaps/feta/8/accordion-accFreebase.xpm b/data/pixmaps/feta/8/accordion-accFreebase.xpm
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/pixmaps/feta/8/accordion-accFreebase.xpm
diff --git a/data/pixmaps/feta/8/accordion-accOldEE.xpm b/data/pixmaps/feta/8/accordion-accOldEE.xpm
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/pixmaps/feta/8/accordion-accOldEE.xpm
diff --git a/data/pixmaps/feta/8/accordion-accOldEES.xpm b/data/pixmaps/feta/8/accordion-accOldEES.xpm
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/pixmaps/feta/8/accordion-accOldEES.xpm
diff --git a/data/pixmaps/feta/8/accordion-accSB.xpm b/data/pixmaps/feta/8/accordion-accSB.xpm
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/pixmaps/feta/8/accordion-accSB.xpm
diff --git a/data/pixmaps/feta/8/accordion-accStdbase.xpm b/data/pixmaps/feta/8/accordion-accStdbase.xpm
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/pixmaps/feta/8/accordion-accStdbase.xpm
diff --git a/data/pixmaps/feta/8/clefs-C.xpm b/data/pixmaps/feta/8/clefs-C.xpm
new file mode 100644
index 0000000..87d232a
--- /dev/null
+++ b/data/pixmaps/feta/8/clefs-C.xpm
@@ -0,0 +1,46 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"23 32 8 1",
+" c #040404",
+". c Gray19",
+"X c Gray29",
+"o c Gray46",
+"O c #888888",
+"+ c #afafaf",
+"@ c #cdcdcd",
+"# c None",
+/* pixels */
+"#######################",
+"#############+oOO######",
+"#O O# O##+. .+###",
+"#O O# o#+ X###@ +##",
+"#O O# O# X####o +#",
+"#O o# O+ X###O .#",
+"#O O# OO #### #",
+"#O O# O@ o#### O",
+"#O O# o#@++##### O",
+"#O o# o#++###### O",
+"#O O# o#o ###### +",
+"#O O# o#o #####@ .#",
+"#O O# o#. +####o O#",
+"#O O# O# .+###. o##",
+"#O o# OO . .X. O###",
+"#O O# o##o .+@####",
+"#O O# o###########",
+"#O O# o##@+@######",
+"#O O# XX .@o .o####",
+"#O o# O+ .@@O @##",
+"#O O# O# o####o @#",
+"#O o# o#o @####+ X#",
+"#O O# o#o ###### @",
+"#O O# o#o.###### O",
+"#O O# o######### O",
+"#O O# o#o .@#### O",
+"#O O# O+ #### #",
+"#O O# OO ###+ .#",
+"#O o# O@ +###o +#",
+"#O O# O#X o###@ +##",
+"#O O# o##X X .+###",
+"#@oOo@#o+###+oOoO######"
+};
diff --git a/data/pixmaps/feta/8/clefs-C_change.xpm b/data/pixmaps/feta/8/clefs-C_change.xpm
new file mode 100644
index 0000000..2f112f1
--- /dev/null
+++ b/data/pixmaps/feta/8/clefs-C_change.xpm
@@ -0,0 +1,40 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"19 26 8 1",
+" c #070707",
+". c Gray17",
+"X c #4e4e4e",
+"o c #727272",
+"O c #898989",
+"+ c #aeaeae",
+"@ c #d7d7d7",
+"# c None",
+/* pixels */
+"###################",
+"###########ooO#####",
+"#O .@.##+.o. .+##",
+"#O @ #@ O###X +#",
+"#O @ #X .###O #",
+"#O @.@ O### +",
+"#O @.#o @### O",
+"#O .@.##o@#### O",
+"#O @.##.##### O",
+"#O @ #+ @#### @",
+"#O .@.#o o###+ o#",
+"#O .@.@ o@+. O##",
+"#O @.X [email protected]@###",
+"#O # o#########",
+"#O # . X#@++@####",
+"#O @.O ..X. o###",
+"#O @.#. .@##o .@#",
+"#O @ #O +###@ .#",
+"#O @.#@ ##### O",
+"#O @.##o##### O",
+"#O @.#@.o#### O",
+"#O .@.@. o### +",
+"#O @.@ +##O #",
+"#O .@.#o O###X +#",
+"#O @.##..O. .+##",
+"#@oOO#O###+ooO#####"
+};
diff --git a/data/pixmaps/feta/8/clefs-F.xpm b/data/pixmaps/feta/8/clefs-F.xpm
new file mode 100644
index 0000000..4addcdd
--- /dev/null
+++ b/data/pixmaps/feta/8/clefs-F.xpm
@@ -0,0 +1,41 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"23 27 8 1",
+" c Gray1",
+". c Gray18",
+"X c #4b4b4b",
+"o c #717171",
+"O c Gray56",
+"+ c #b1b1b1",
+"@ c Gray84",
+"# c None",
+/* pixels */
+"#######################",
+"#######@oooo@##########",
+"#####+. Xoo. .@########",
+"####+ @####o O#######",
+"###+ @######X O##X X#",
+"###X O#######+ .##. @",
+"##@ X@######. o#. @",
+"##o @#####o .##O@#",
+"##o o#####+ @####",
+"##o .#####+ @####",
+"##+ .#####+ @####",
+"###X +#####+ @#O@#",
+"####o .O######o o#. @",
+"##############. O#. @",
+"#############+ @#X X#",
+"#############o X######",
+"############@. .#######",
+"############. O#######",
+"###########o O########",
+"##########O O#########",
+"#########O .+##########",
+"########o .@###########",
+"######+. o#############",
+"####@o X@##############",
+"###+..@################",
+"##..+##################",
+"#@+####################"
+};
diff --git a/data/pixmaps/feta/8/clefs-F_change.xpm b/data/pixmaps/feta/8/clefs-F_change.xpm
new file mode 100644
index 0000000..b2ba711
--- /dev/null
+++ b/data/pixmaps/feta/8/clefs-F_change.xpm
@@ -0,0 +1,36 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"19 22 8 1",
+" c #040404",
+". c #323232",
+"X c #505050",
+"o c Gray45",
+"O c #929292",
+"+ c Gray69",
+"@ c Gray81",
+"# c None",
+/* pixels */
+"###################",
+"######@ooo+########",
+"#####X.oo. o######",
+"####.X####@ .##+o#",
+"###o ######O o# O",
+"##@ O##### @. O",
+"##o @####X +###",
+"##o o####o O###",
+"##@ O####o o###",
+"###o o#####O o@+#",
+"####++######o O. O",
+"############ #. +",
+"###########O X#@@#",
+"##########@. .@####",
+"##########X +#####",
+"#########o O######",
+"########o O#######",
+"######@X X@########",
+"#####O O##########",
+"###@. o############",
+"##X.o@#############",
+"#@O################"
+};
diff --git a/data/pixmaps/feta/8/clefs-G.xpm b/data/pixmaps/feta/8/clefs-G.xpm
new file mode 100644
index 0000000..deea1a5
--- /dev/null
+++ b/data/pixmaps/feta/8/clefs-G.xpm
@@ -0,0 +1,74 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"22 60 8 1",
+" c Gray2",
+". c #2c2c2c",
+"X c #535353",
+"o c #727272",
+"O c Gray55",
+"+ c Gray67",
+"@ c Gray82",
+"# c None",
+/* pixels */
+"######################",
+"############@@########",
+"############X +#######",
+"###########X #######",
+"##########o o######",
+"#########+ ######",
+"#########X X@ o#####",
+"########@ X## #####",
+"########o .###o +####",
+"########. +###O O####",
+"######## X####O X####",
+"######## O####o ####",
+"######## @####O ####",
+"######## #####. ####",
+"########. ####@ .####",
+"########o ####o o####",
+"########o ###@ +####",
+"########O +##o .#####",
+"######### o#+ O#####",
+"######### o#. .######",
+"#########X.. @######",
+"#########o o#######",
+"#########o o########",
+"########O X#########",
+"#######O .@#########",
+"######+ o##########",
+"#####@. .X ##########",
+"####@. #O ##########",
+"####o O#@ +#########",
+"###+ o### o#########",
+"###. X####.o#########",
+"##O @####X X.o@#####",
+"##X o###O .@###",
+"## @##o .@##",
+"#+ o##@ .X. .##",
+"#O +##X O@ o#@O o#",
+"#O ### o##o ###@. #",
+"#O ### @##o ####+ +",
+"#+ ### ###@ #####. O",
+"## @##X @### O####O O",
+"##o O##@ X###.o####O O",
+"##@..###O X@#oX####X @",
+"###+ o###+ #o ###@ .#",
+"####O o####@#O ###X +#",
+"#####O .+##### @#X +##",
+"######@X X++O O###",
+"########@o. .o@####",
+"###########@@#o ######",
+"##############+ ######",
+"##############@.######",
+"############### O#####",
+"#####@. X@#####.o#####",
+"##### .#####oo#####",
+"####O O####Xo#####",
+"####o o####oo#####",
+"####O +####.+#####",
+"##### X####o.######",
+"#####+ o####+ +######",
+"######@. XoX.+#######",
+"########+ooo+#########"
+};
diff --git a/data/pixmaps/feta/8/clefs-G_change.xpm b/data/pixmaps/feta/8/clefs-G_change.xpm
new file mode 100644
index 0000000..b24e4b1
--- /dev/null
+++ b/data/pixmaps/feta/8/clefs-G_change.xpm
@@ -0,0 +1,63 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"18 49 8 1",
+" c #040404",
+". c #2f2f2f",
+"X c #515151",
+"o c #6d6d6d",
+"O c #8e8e8e",
+"+ c #aeaeae",
+"@ c #d2d2d2",
+"# c None",
+/* pixels */
+"##################",
+"##########@@######",
+"#########@ .######",
+"########@. O#####",
+"########X .#####",
+"#######@ o O####",
+"#######X O#XX####",
+"#######. X##+ @###",
+"######@ +##+ +###",
+"######@ .###+ o###",
+"######@ +###+ o###",
+"######@ +###. o###",
+"#######.+##@ +###",
+"#######.+##o @###",
+"#######Xo#@. o####",
+"#######+.#o @####",
+"#######+.O X#####",
+"########. .######",
+"########. .@######",
+"######@. O#######",
+"#####@. .########",
+"#####. .X########",
+"####o O@ ########",
+"###+ o##.+#######",
+"###. @##.+#######",
+"##o @###o.Oo@####",
+"## o##@o o###",
+"#+ @##. X##",
+"#O .##X .O @@X o#",
+"#O O#@ +#.+##X #",
+"#O O#@ .##.X###. O",
+"#O O#@ .##OX###O O",
+"## X##X +#+.###O O",
+"##. @##. @@ @##O O",
+"##@ X###..#.@##X #",
+"###+ X@##+#.O#@ o#",
+"####+ o@##o.O .##",
+"#####@o o###",
+"########OooX @####",
+"############.@####",
+"############.O####",
+"#####oo@####XX####",
+"####o .@###OX####",
+"###@ +###OX####",
+"###@ +###XX####",
+"####. .###@ @####",
+"####O +###X.#####",
+"#####+. Xo.X@#####",
+"#######+oo@#######"
+};
diff --git a/data/pixmaps/feta/8/clefs-hufnagel_do.xpm b/data/pixmaps/feta/8/clefs-hufnagel_do.xpm
new file mode 100644
index 0000000..059ab63
--- /dev/null
+++ b/data/pixmaps/feta/8/clefs-hufnagel_do.xpm
@@ -0,0 +1,27 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"11 13 8 1",
+" c Gray1",
+". c #323232",
+"X c Gray34",
+"o c #6f6f6f",
+"O c #888888",
+"+ c #aaaaaa",
+"@ c Gray80",
+"# c None",
+/* pixels */
+"###########",
+"######++###",
+"####+. .X@",
+"###. X#",
+"##. o##",
+"#O +++###",
+"#O ######",
+"#O ######",
+"#O ######",
+"#O X@####",
+"#O +####",
+"#O +#####",
+"##oO#######"
+};
diff --git a/data/pixmaps/feta/8/clefs-hufnagel_do_change.xpm b/data/pixmaps/feta/8/clefs-hufnagel_do_change.xpm
new file mode 100644
index 0000000..e9b95b4
--- /dev/null
+++ b/data/pixmaps/feta/8/clefs-hufnagel_do_change.xpm
@@ -0,0 +1,25 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"9 11 8 1",
+" c #040404",
+". c #272727",
+"X c #5f5f5f",
+"o c Gray45",
+"O c Gray55",
+"+ c Gray70",
+"@ c #d3d3d3",
+"# c None",
+/* pixels */
+"#########",
+"#####@+##",
+"###@X .+",
+"##O @",
+"#+ ..o##",
+"#O o####",
+"#O O####",
+"#O X####",
+"#O O###",
+"#O X@###",
+"##o+#####"
+};
diff --git a/data/pixmaps/feta/8/clefs-hufnagel_do_fa.xpm b/data/pixmaps/feta/8/clefs-hufnagel_do_fa.xpm
new file mode 100644
index 0000000..7a703d5
--- /dev/null
+++ b/data/pixmaps/feta/8/clefs-hufnagel_do_fa.xpm
@@ -0,0 +1,47 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"11 33 8 1",
+" c #040404",
+". c Gray22",
+"X c #494949",
+"o c Gray48",
+"O c #898989",
+"+ c #b7b7b7",
+"@ c Gray77",
+"# c None",
+/* pixels */
+"###########",
+"######++###",
+"####+. Xo@",
+"###X .#",
+"##X X##",
+"#O ooO###",
+"#O ######",
+"#O ######",
+"#O ######",
+"#O +#####",
+"#O O####",
+"#O X#####",
+"#@ o######",
+"###########",
+"###########",
+"#####o O##",
+"###+ @",
+"##+ +#",
+"#+ X .@##",
+"#O ######",
+"#O #@o###",
+"#O . Xo@",
+"#O .#",
+"#O X##",
+"#O ooO###",
+"#O ######",
+"#O ######",
+"#O ######",
+"#O ######",
+"#O ######",
+"#O +######",
+"#O +#######",
+"#@+########"
+};
diff --git a/data/pixmaps/feta/8/clefs-hufnagel_do_fa_change.xpm b/data/pixmaps/feta/8/clefs-hufnagel_do_fa_change.xpm
new file mode 100644
index 0000000..7911ffa
--- /dev/null
+++ b/data/pixmaps/feta/8/clefs-hufnagel_do_fa_change.xpm
@@ -0,0 +1,44 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"9 30 8 1",
+" c Gray1",
+". c #2c2c2c",
+"X c #5d5d5d",
+"o c #777777",
+"O c Gray55",
+"+ c #b1b1b1",
+"@ c #d3d3d3",
+"# c None",
+/* pixels */
+"#########",
+"#####@@##",
+"###@X X#",
+"##O .#",
+"#+ O##",
+"#o +####",
+"#O +####",
+"#o +####",
+"#o .@###",
+"#o .@###",
+"#+ o#####",
+"#########",
+"#########",
+"#########",
+"#########",
+"####@X+##",
+"###O +",
+"##X O#",
+"#O XO+##",
+"#o +####",
+"#o X..+#",
+"#o .#",
+"#o .##",
+"#o O+###",
+"#O +####",
+"#o +####",
+"#o +####",
+"#o .@####",
+"#o @#####",
+"#+@######"
+};
diff --git a/data/pixmaps/feta/8/clefs-hufnagel_fa.xpm b/data/pixmaps/feta/8/clefs-hufnagel_fa.xpm
new file mode 100644
index 0000000..cd99011
--- /dev/null
+++ b/data/pixmaps/feta/8/clefs-hufnagel_fa.xpm
@@ -0,0 +1,34 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"11 20 8 1",
+" c #040404",
+". c #373737",
+"X c #4b4b4b",
+"o c #747474",
+"O c #898989",
+"+ c #b4b4b4",
+"@ c #cbcbcb",
+"# c None",
+/* pixels */
+"###########",
+"######++###",
+"####@. Xo@",
+"###o .#",
+"##X X##",
+"#O ooO###",
+"#O ######",
+"#O @oX###",
+"#O X@",
+"#O .#",
+"#O X##",
+"#O +o+###",
+"#O ######",
+"#O ######",
+"#O ######",
+"#O ######",
+"#O ######",
+"#O +######",
+"#O +#######",
+"#@@########"
+};
diff --git a/data/pixmaps/feta/8/clefs-hufnagel_fa_change.xpm b/data/pixmaps/feta/8/clefs-hufnagel_fa_change.xpm
new file mode 100644
index 0000000..73d6fe6
--- /dev/null
+++ b/data/pixmaps/feta/8/clefs-hufnagel_fa_change.xpm
@@ -0,0 +1,30 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"9 16 8 1",
+" c #020202",
+". c Gray18",
+"X c #5a5a5a",
+"o c Gray44",
+"O c #8b8b8b",
+"+ c #b2b2b2",
+"@ c Gray81",
+"# c None",
+/* pixels */
+"#########",
+"#####++##",
+"####. .+",
+"##O @",
+"#+ .o##",
+"#O O#@##",
+"#O XX.@@",
+"#O +",
+"#O .@#",
+"#O X@@##",
+"#O O####",
+"#O O####",
+"#O o####",
+"#O +####",
+"#O +#####",
+"#@@######"
+};
diff --git a/data/pixmaps/feta/8/clefs-medicaea_do.xpm b/data/pixmaps/feta/8/clefs-medicaea_do.xpm
new file mode 100644
index 0000000..281a683
--- /dev/null
+++ b/data/pixmaps/feta/8/clefs-medicaea_do.xpm
@@ -0,0 +1,39 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"11 25 8 1",
+" c #060606",
+". c Gray15",
+"X c Gray36",
+"o c #747474",
+"O c #888888",
+"+ c #b9b9b9",
+"@ c Gray76",
+"# c None",
+/* pixels */
+"###########",
+"#@+########",
+"#oo########",
+"#oo########",
+"#oo########",
+"#O.########",
+"#O O######",
+"#O o####",
+"#O O##",
+"#o.. #",
+"#oo#o #",
+"#oX###o +",
+"#oX#####o #",
+"#O O#######",
+"#O o#####",
+"#O o###",
+"#O o#",
+"#oXO #",
+"#oo##o @",
+"#oX####O #",
+"#oX######O#",
+"#oo########",
+"#oo########",
+"#oo########",
+"#@+########"
+};
diff --git a/data/pixmaps/feta/8/clefs-medicaea_do_change.xpm b/data/pixmaps/feta/8/clefs-medicaea_do_change.xpm
new file mode 100644
index 0000000..b85e408
--- /dev/null
+++ b/data/pixmaps/feta/8/clefs-medicaea_do_change.xpm
@@ -0,0 +1,34 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"9 21 7 1",
+" c #070707",
+". c #5a5a5a",
+"X c #7b7b7b",
+"o c Gray56",
+"O c Gray75",
+"+ c #d5d5d5",
+"@ c None",
+/* pixels */
+"@@@@@@@@@",
+"@+@@@@@@@",
+"@o+@@@@@@",
+"@o+@@@@@@",
+"@oX@@@@@@",
+"@o X@@@@",
+"@o X@@",
+"@o. +",
+"@o+@X o",
+"@o+@@@X o",
+"@o+@@@@@@",
+"@o+@@@@@@",
+"@o o@@@@@",
+"@o X@@@",
+"@o X@",
+"@o+o o",
+"@o+@@X o",
+"@o+@@@@X+",
+"@o+@@@@@@",
+"@o+@@@@@@",
+"@+@@@@@@@"
+};
diff --git a/data/pixmaps/feta/8/clefs-medicaea_fa.xpm b/data/pixmaps/feta/8/clefs-medicaea_fa.xpm
new file mode 100644
index 0000000..dcd6d52
--- /dev/null
+++ b/data/pixmaps/feta/8/clefs-medicaea_fa.xpm
@@ -0,0 +1,39 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"16 25 8 1",
+" c Gray3",
+". c Gray22",
+"X c Gray25",
+"o c Gray45",
+"O c Gray54",
+"+ c Gray73",
+"@ c Gray76",
+"# c None",
+/* pixels */
+"################",
+"#######O########",
+"#######.########",
+"####### ########",
+"####### ########",
+"####### +#######",
+"####### .+#####",
+"####### X@###",
+"####### .+#",
+"#+ O#.. +",
+"#O o# #@X O",
+"#O O# @##@. O",
+"#O o# #####@.O",
+"#O O# o#######",
+"#O o# o#####",
+"#O O# o###",
+"##oO.o# o#",
+"####oo# o O",
+"####oo# ##o O",
+"####oo# ####o O",
+"####oo# ######o@",
+"####oo# ########",
+"####oo# ########",
+"####oo# ########",
+"####++#O########"
+};
diff --git a/data/pixmaps/feta/8/clefs-medicaea_fa_change.xpm b/data/pixmaps/feta/8/clefs-medicaea_fa_change.xpm
new file mode 100644
index 0000000..9a5b30f
--- /dev/null
+++ b/data/pixmaps/feta/8/clefs-medicaea_fa_change.xpm
@@ -0,0 +1,35 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"13 21 8 1",
+" c #060606",
+". c #373737",
+"X c Gray29",
+"o c #727272",
+"O c Gray54",
+"+ c #bcbcbc",
+"@ c Gray79",
+"# c None",
+/* pixels */
+"#############",
+"######@######",
+"#####@O######",
+"#####@O######",
+"######X@#####",
+"###### X+###",
+"###### .@#",
+"#####@XX @",
+"#O ##O#+. O",
+"#O #@O###+.O",
+"#O @#O######",
+"#O o#O######",
+"#O O# o#####",
+"#O O# o###",
+"###oo# o#",
+"###oo#oO O",
+"###oo#o##o O",
+"###oo#O####oO",
+"###oo#O######",
+"###oo#O######",
+"###++#@######"
+};
diff --git a/data/pixmaps/feta/8/clefs-mensural1_c.xpm b/data/pixmaps/feta/8/clefs-mensural1_c.xpm
new file mode 100644
index 0000000..e7c5397
--- /dev/null
+++ b/data/pixmaps/feta/8/clefs-mensural1_c.xpm
@@ -0,0 +1,45 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"22 32 7 1",
+" c Gray3",
+". c #222222",
+"X c #414141",
+"o c #7c7c7c",
+"O c #868686",
+"+ c #c6c6c6",
+"@ c None",
+/* pixels */
+"@@@@@@@@@@@@@@@@@@@@@@",
+"@+O@O@@@@@@@@@@@@@O@O+",
+"@O +.@@@@@@@@@@@@@.@ o",
+"@O @.@@@@@@@@@@@@@.@ O",
+"@O @.@@@@@@@@@@@@@.@ O",
+"@o +.@@@@@@@@@@@@@.+ O",
+"@O @.@@@@@@@@@@@@@ @ O",
+"@O +.@@@@@@@@@@@@@.+ o",
+"@O @.@@@@@@@@@@@@+.@ O",
+"@O @ @@@@@@@@@@@@@.@ O",
+"@O +.@@@@@@@@@@@@@.+ o",
+"@o @.@@@@@@@@@@@@@ @ O",
+"@O @ .OoOOooooooO. @ o",
+"@O + @ O",
+"@O @ @ O",
+"@O @.ooooooooooooo @ O",
+"@O @.@@@@@@@@@@@@@ @ O",
+"@o + ooooooooooooo.+ O",
+"@O @ @ o",
+"@O @ @ O",
+"@O @ .OOooooOOOoO. @ o",
+"@O @ @@@@@@@@@@@@@ @ O",
+"@O +.@@@@@@@@@@@@@.@ O",
+"@o @.@@@@@@@@@@@@@.+ o",
+"@O +.@@@@@@@@@@@@+.@ O",
+"@O @.@@@@@@@@@@@@@.+ O",
+"@O +.@@@@@@@@@@@@@ @ o",
+"@O @.@@@@@@@@@@@@@.@ O",
+"@o @.@@@@@@@@@@@@@.+ O",
+"@O +.@@@@@@@@@@@@@.@ O",
+"@O @.@@@@@@@@@@@@@.@ o",
+"@+O@O@@@@@@@@@@@@@O@O+"
+};
diff --git a/data/pixmaps/feta/8/clefs-mensural1_c_change.xpm b/data/pixmaps/feta/8/clefs-mensural1_c_change.xpm
new file mode 100644
index 0000000..75ccb1a
--- /dev/null
+++ b/data/pixmaps/feta/8/clefs-mensural1_c_change.xpm
@@ -0,0 +1,40 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"18 26 8 1",
+" c Gray3",
+". c Gray14",
+"X c #5f5f5f",
+"o c #717171",
+"O c #868686",
+"+ c #bbbbbb",
+"@ c #c6c6c6",
+"# c None",
+/* pixels */
+"##################",
+"#+@@+#########+@@+",
+"#oOOX#########XOOo",
+"#oOOX#########XOOo",
+"#ooOX#########XOoo",
+"#oOOX#########XOOo",
+"#oOOX#########XOOo",
+"#oOOX#########XOOo",
+"#oOOX#########XoOo",
+"#oOOX#########XOOo",
+"#ooO . OOo",
+"#oOO Ooo",
+"#oOO.OooOoOooO.Ooo",
+"#oOOX#########XOOo",
+"#ooO.OoooOoooO.OOo",
+"#oo+ +oo",
+"#ooO . . Ooo",
+"#oOOX#########XOOo",
+"#oOOX#########XOOo",
+"#oOOX#########XOOo",
+"#oOOX#########XOOo",
+"#ooOX#########XOOo",
+"#oOOX#########XOOo",
+"#oOOo#########XOOo",
+"#oOOX#########XOOo",
+"#+@@+#########+@@+"
+};
diff --git a/data/pixmaps/feta/8/clefs-mensural1_f.xpm b/data/pixmaps/feta/8/clefs-mensural1_f.xpm
new file mode 100644
index 0000000..6a5758b
--- /dev/null
+++ b/data/pixmaps/feta/8/clefs-mensural1_f.xpm
@@ -0,0 +1,59 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"18 45 8 1",
+" c #0b0b0b",
+". c #2d2d2d",
+"X c #4c4c4c",
+"o c #6d6d6d",
+"O c #8e8e8e",
+"+ c Gray70",
+"@ c Gray81",
+"# c None",
+/* pixels */
+"##################",
+"##############+###",
+"#############X ###",
+"############o o##",
+"###########+ X ##",
+"#oo##### ##.X# X#",
+"#o.#@@#O #+ +#O @",
+"#O #X o##..#",
+"#O #O ++ +#",
+"#O ... ## ..X##",
+"#oo####@ ##@ o##",
+"#oX#@@@@ @## .##",
+"#O ##O O O#",
+"#O #@ O#X @",
+"#O .... #o +#@. @",
+"#oX####@ #o .##.o#",
+"#OO####@ #@ OO.##",
+"######## ##o O##",
+"########.##@ o###",
+"#######@ @##o @###",
+"########.###oo####",
+"######## ###oo####",
+"######## ###oo####",
+"######## ###oo####",
+"######## ###oo####",
+"########.@##oo####",
+"########.###oo####",
+"#######@ ###oo####",
+"######## ###oo####",
+"######## ###oo####",
+"######## ###oo####",
+"#######@ ###oo####",
+"######## ###oo####",
+"######## ###oo####",
+"#######@ ###oo####",
+"######## ###oo####",
+"######## ###oo####",
+"#######@ ###oo####",
+"########.###oo####",
+"######## ###oo####",
+"########.@##oo####",
+"############oo####",
+"############oo####",
+"############oo####",
+"############++####"
+};
diff --git a/data/pixmaps/feta/8/clefs-mensural1_f_change.xpm b/data/pixmaps/feta/8/clefs-mensural1_f_change.xpm
new file mode 100644
index 0000000..b1094af
--- /dev/null
+++ b/data/pixmaps/feta/8/clefs-mensural1_f_change.xpm
@@ -0,0 +1,51 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"14 37 8 1",
+" c #060606",
+". c Gray22",
+"X c #535353",
+"o c #727272",
+"O c Gray53",
+"+ c #afafaf",
+"@ c #d0d0d0",
+"# c None",
+/* pixels */
+"##############",
+"##########@o##",
+"#########@ +#",
+"#########o .#",
+"########@ @. +",
+"#oo#@#.+o #+ O",
+"#o @X O@ #",
+"#o @@ ..o#",
+"#oX+O+ +#X X##",
+"#oo###.+## .##",
+"#o oXo +#+ X#",
+"#O +#.O @",
+"#o ... @+ #o O",
+"#OO###X+X @@ @",
+"######.++ XO.#",
+"######.+# +#",
+"######.+#O o##",
+"######.+#@X###",
+"######.+##O###",
+"######.+##O###",
+"######.+##o###",
+"######.+##O###",
+"######.+##O###",
+"######.+##O###",
+"######.+##o###",
+"######.+##o###",
+"######.+##O###",
+"######.+##O###",
+"######.+##o###",
+"######.+##O###",
+"######.+##O###",
+"######X+##O###",
+"######.+##O###",
+"######O@##O###",
+"##########O###",
+"##########O###",
+"##########@###"
+};
diff --git a/data/pixmaps/feta/8/clefs-mensural2_c.xpm b/data/pixmaps/feta/8/clefs-mensural2_c.xpm
new file mode 100644
index 0000000..249f60c
--- /dev/null
+++ b/data/pixmaps/feta/8/clefs-mensural2_c.xpm
@@ -0,0 +1,45 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"9 32 7 1",
+" c Gray2",
+". c #393939",
+"X c #717171",
+"o c Gray53",
+"O c Gray73",
+"+ c #c6c6c6",
+"@ c None",
+/* pixels */
+"@@@@@@@@@",
+"@O+@@@@+O",
+"@Xo@@@@oX",
+"@Xo@@@@oX",
+"@Xo@@@@oX",
+"@Xo@@@@oX",
+"@Xo@@@@oX",
+"@Xo@@@@oX",
+"@XX@@@@oX",
+"@XX@@@@XX",
+"@X X",
+"@X X",
+"@Xo@@@@oX",
+"@X.oooo.X",
+"@X X",
+"@X.oXoo.X",
+"@Xo@@@@oX",
+"@X.oXXo.X",
+"@X X",
+"@X.oooo.X",
+"@Xo@@@@oX",
+"@X X",
+"@X X",
+"@Xo@@@@XX",
+"@Xo@@@@oX",
+"@Xo@@@@XX",
+"@Xo@@@@oX",
+"@Xo@@@@oX",
+"@Xo@@@@oX",
+"@Xo@@@@oX",
+"@Xo@@@@oX",
+"@O+@@@@+O"
+};
diff --git a/data/pixmaps/feta/8/clefs-mensural2_c_change.xpm b/data/pixmaps/feta/8/clefs-mensural2_c_change.xpm
new file mode 100644
index 0000000..2a6a335
--- /dev/null
+++ b/data/pixmaps/feta/8/clefs-mensural2_c_change.xpm
@@ -0,0 +1,42 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"8 28 8 1",
+" c #020202",
+". c #252525",
+"X c #5f5f5f",
+"o c Gray44",
+"O c Gray53",
+"+ c #b9b9b9",
+"@ c #c0c0c0",
+"# c None",
+/* pixels */
+"########",
+"#@+###+@",
+"#oo###oo",
+"#oo###oo",
+"#oo###oo",
+"#oX###oo",
+"#oo###Xo",
+"#O.OoO.O",
+"#O O",
+"#oX###Xo",
+"#oX###Xo",
+"#oX###oo",
+"#O.OoO.O",
+"#O O",
+"#oX###Xo",
+"#O O",
+"#O.OoO.O",
+"#oo###oo",
+"#oo###Xo",
+"#oX###Xo",
+"#O O",
+"#O.OoO.O",
+"#oX###Xo",
+"#oX###oo",
+"#oo###Xo",
+"#oo###oo",
+"#oo###oo",
+"#@+###+@"
+};
diff --git a/data/pixmaps/feta/8/clefs-mensural2_f.xpm b/data/pixmaps/feta/8/clefs-mensural2_f.xpm
new file mode 100644
index 0000000..6e15d3d
--- /dev/null
+++ b/data/pixmaps/feta/8/clefs-mensural2_f.xpm
@@ -0,0 +1,27 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"12 13 8 1",
+" c Gray2",
+". c Gray19",
+"X c #4e4e4e",
+"o c Gray43",
+"O c Gray54",
+"+ c Gray69",
+"@ c Gray79",
+"# c None",
+/* pixels */
+"############",
+"##+o@###@o##",
+"#+ ## .#",
+"#+o .#o O",
+"####O @#X.#",
+"#####X X####",
+"#####@ X####",
+"#####@ X####",
+"#####@ @####",
+"#####..#o.##",
+"##+o. ## +",
+"#+ X@##o +",
+"#+O######++#"
+};
diff --git a/data/pixmaps/feta/8/clefs-mensural2_f_change.xpm b/data/pixmaps/feta/8/clefs-mensural2_f_change.xpm
new file mode 100644
index 0000000..a156eea
--- /dev/null
+++ b/data/pixmaps/feta/8/clefs-mensural2_f_change.xpm
@@ -0,0 +1,27 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"12 13 8 1",
+" c #040404",
+". c #373737",
+"X c Gray32",
+"o c Gray44",
+"O c Gray56",
+"+ c #b6b6b6",
+"@ c Gray79",
+"# c None",
+/* pixels */
+"############",
+"##+o@####@##",
+"#+ o##X O#",
+"###o O#o +",
+"####O ##O+#",
+"#####X @####",
+"#####@ @####",
+"#####@ @####",
+"#####+ #####",
+"#####Xo#@o##",
+"####Xo##. .#",
+"##. X###@ +",
+"#+o@#####@+#"
+};
diff --git a/data/pixmaps/feta/8/clefs-mensural3_c.xpm b/data/pixmaps/feta/8/clefs-mensural3_c.xpm
new file mode 100644
index 0000000..b46053c
--- /dev/null
+++ b/data/pixmaps/feta/8/clefs-mensural3_c.xpm
@@ -0,0 +1,53 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"9 39 8 1",
+" c Gray2",
+". c #272727",
+"X c #515151",
+"o c #6f6f6f",
+"O c Gray52",
+"+ c Gray70",
+"@ c Gray80",
+"# c None",
+/* pixels */
+"#########",
+"#+@####@+",
+"#oO####Oo",
+"#oO####Oo",
+"#oO####Oo",
+"#oO####Oo",
+"#oO####Oo",
+"#oO####Oo",
+"#oO####Oo",
+"#oo#@@#oo",
+"#o o",
+"#o .... o",
+"#oO####Oo",
+"#o.oXXX.o",
+"#o O",
+"#oX@+++Xo",
+"#oO####Oo",
+"#o XXXX o",
+"#o O",
+"#oo@@@@oo",
+"#oo#@@@oo",
+"#o o",
+"#o XXXX.o",
+"#oO####Oo",
+"#oX@++@Xo",
+"#o o",
+"#o.XXXX.o",
+"#oO####Oo",
+"#o .... o",
+"#o o",
+"#oo#@@#oo",
+"#oO####Oo",
+"#oO####Oo",
+"#oO####Oo",
+"#oO####Oo",
+"#oO####Oo",
+"#oO####Oo",
+"#oO####OX",
+"#+@####@+"
+};
diff --git a/data/pixmaps/feta/8/clefs-mensural3_c_change.xpm b/data/pixmaps/feta/8/clefs-mensural3_c_change.xpm
new file mode 100644
index 0000000..4d87755
--- /dev/null
+++ b/data/pixmaps/feta/8/clefs-mensural3_c_change.xpm
@@ -0,0 +1,49 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"8 35 8 1",
+" c Gray3",
+". c #323232",
+"X c #4e4e4e",
+"o c Gray44",
+"O c #868686",
+"+ c #b9b9b9",
+"@ c Gray82",
+"# c None",
+/* pixels */
+"########",
+"#++###++",
+"#oo###oo",
+"#oo###oo",
+"#oo###oo",
+"#oo###oo",
+"#oo###oo",
+"#O oXo o",
+"#O O",
+"#oo###oo",
+"#oo###oo",
+"#oo###oo",
+"#O XXX O",
+"#O ... O",
+"#oX#@#Xo",
+"#O O",
+"#o.@+@Xo",
+"#oo###oo",
+"#oo###oo",
+"#oX@+@Xo",
+"#O O",
+"#oX#@#Xo",
+"#O ... O",
+"#O X.X O",
+"#oo###oo",
+"#oo###oo",
+"#oo###oo",
+"#O O",
+"#O oXo O",
+"#oo###oo",
+"#oX###oo",
+"#oo###oo",
+"#oo###oo",
+"#oo###oo",
+"#++###+@"
+};
diff --git a/data/pixmaps/feta/8/clefs-mensural_g.xpm b/data/pixmaps/feta/8/clefs-mensural_g.xpm
new file mode 100644
index 0000000..1e4cab4
--- /dev/null
+++ b/data/pixmaps/feta/8/clefs-mensural_g.xpm
@@ -0,0 +1,33 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"11 19 8 1",
+" c #060606",
+". c Gray17",
+"X c #4e4e4e",
+"o c #717171",
+"O c Gray57",
+"+ c #aeaeae",
+"@ c Gray81",
+"# c None",
+/* pixels */
+"###########",
+"#######o@##",
+"######. .##",
+"###### .+##",
+"######X.@##",
+"######@ .#",
+"#####@#@O +",
+"####O X## O",
+"###O .. O",
+"##O oX @",
+"##..+ XoO##",
+"#O @# .@#",
+"#O ## .o. #",
+"#O ## o#@ #",
+"#+ O# o## #",
+"##. @ o#@X#",
+"##+ X+XO#",
+"###+. .##",
+"#####@+O###"
+};
diff --git a/data/pixmaps/feta/8/clefs-mensural_g_change.xpm b/data/pixmaps/feta/8/clefs-mensural_g_change.xpm
new file mode 100644
index 0000000..c1c356f
--- /dev/null
+++ b/data/pixmaps/feta/8/clefs-mensural_g_change.xpm
@@ -0,0 +1,30 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"9 16 8 1",
+" c #060606",
+". c #2d2d2d",
+"X c #4e4e4e",
+"o c Gray45",
+"O c Gray55",
+"+ c Gray68",
+"@ c Gray83",
+"# c None",
+/* pixels */
+"#########",
+"#####O@##",
+"####@ .@#",
+"####@ X##",
+"#####X o#",
+"######X @",
+"###@O@+ o",
+"##@ O",
+"##X O.o#",
+"#+.#X .@#",
+"#oO#X #",
+"#oX#.X@ @",
+"#+ #X+#.@",
+"##. ooX#",
+"##@X O#",
+"####+++##"
+};
diff --git a/data/pixmaps/feta/8/clefs-percussion.xpm b/data/pixmaps/feta/8/clefs-percussion.xpm
new file mode 100644
index 0000000..73d2cad
--- /dev/null
+++ b/data/pixmaps/feta/8/clefs-percussion.xpm
@@ -0,0 +1,28 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"12 17 5 1",
+" c Gray2",
+". c Gray49",
+"X c Gray54",
+"o c #c8c8c8",
+"O c None",
+/* pixels */
+"OOOOOOOOOOOO",
+"OoXXXOOOXXXo",
+"OX OOO X",
+"OX OOO X",
+"OX OOO X",
+"OX OOO X",
+"OX OOO X",
+"OX OOO X",
+"OX OOO X",
+"OX OOO X",
+"OX OOO X",
+"OX OOO X",
+"OX OOO X",
+"OX OOO X",
+"OX OOO X",
+"OX OOO X",
+"Oo.XXOOOXXXo"
+};
diff --git a/data/pixmaps/feta/8/clefs-percussion_change.xpm b/data/pixmaps/feta/8/clefs-percussion_change.xpm
new file mode 100644
index 0000000..4f5fd7e
--- /dev/null
+++ b/data/pixmaps/feta/8/clefs-percussion_change.xpm
@@ -0,0 +1,25 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"10 14 5 1",
+" c #090909",
+". c #7b7b7b",
+"X c Gray55",
+"o c Gray79",
+"O c None",
+/* pixels */
+"OOOOOOOOOO",
+"OoXXOOOX.o",
+"OX OOO X",
+"OX OOO X",
+"OX OOO X",
+"OX OOO X",
+"OX OOO X",
+"OX OOO X",
+"OX OOO X",
+"OX OOO X",
+"OX OOO X",
+"OX OOO X",
+"OX OOO X",
+"OoXXOOOX.o"
+};
diff --git a/data/pixmaps/feta/8/clefs-tab.xpm b/data/pixmaps/feta/8/clefs-tab.xpm
new file mode 100644
index 0000000..a648339
--- /dev/null
+++ b/data/pixmaps/feta/8/clefs-tab.xpm
@@ -0,0 +1,52 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"14 38 8 1",
+" c #060606",
+". c #343434",
+"X c #484848",
+"o c Gray48",
+"O c Gray53",
+"+ c #b9b9b9",
+"@ c #c6c6c6",
+"# c None",
+/* pixels */
+"##############",
+"#@OOOOOOOOOOO#",
+"#O #",
+"#@oOOo XOoOO#",
+"###### O#####",
+"###### o#####",
+"###### O#####",
+"###### O#####",
+"###### O#####",
+"###### o#####",
+"###### O#####",
+"###### O#####",
+"######Oo+#####",
+"##############",
+"#####+ X#####",
+"#####o #####",
+"##### O####",
+"####o .o ####",
+"#### o# O###",
+"###+ ##o X###",
+"###X oOX +##",
+"##+ X##",
+"##o XOOOOo ##",
+"## O##### o#",
+"#O ######o #",
+"##############",
+"#@oOoOOoO#####",
+"#O X###",
+"#O ooooo O##",
+"#O #####o ##",
+"#O oooOo O##",
+"#O .@#",
+"#O oOOOOo #",
+"#O ####### O",
+"#O ####### O",
+"#O oOOOOo #",
+"#O .@#",
+"#@OOOOOOOO####"
+};
diff --git a/data/pixmaps/feta/8/clefs-tab_change.xpm b/data/pixmaps/feta/8/clefs-tab_change.xpm
new file mode 100644
index 0000000..4543681
--- /dev/null
+++ b/data/pixmaps/feta/8/clefs-tab_change.xpm
@@ -0,0 +1,44 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"12 31 7 1",
+" c #020202",
+". c #494949",
+"X c #777777",
+"o c #868686",
+"O c #b7b7b7",
+"+ c #c8c8c8",
+"@ c None",
+/* pixels */
+"@@@@@@@@@@@@",
+"@+XoooooooX+",
+"@o o",
+"@@@@@o o@@@@",
+"@@@@@o o@@@@",
+"@@@@@o o@@@@",
+"@@@@@o o@@@@",
+"@@@@@o o@@@@",
+"@@@@@o o@@@@",
+"@@@@@o o@@@@",
+"@@@@@+o+@@@@",
+"@@@@@+o+@@@@",
+"@@@@@ @@@@",
+"@@@@O O@@@",
+"@@@@. X .@@@",
+"@@@O .@. O@@",
+"@@@. O@O .@@",
+"@@O O@",
+"@@X XXXXX X@",
+"@@ @@@@@ @",
+"@+o+@@@@@OX+",
+"@+ooXXXXO@@@",
+"@o .@@",
+"@o o@@@@. X@",
+"@o o@@@@. o@",
+"@o O@",
+"@o .oXXX. +",
+"@o o@@@@@X o",
+"@o .XXXX. +",
+"@o XO@",
+"@+X+@@@@@@@@"
+};
diff --git a/data/pixmaps/feta/8/clefs-vaticana_do.xpm b/data/pixmaps/feta/8/clefs-vaticana_do.xpm
new file mode 100644
index 0000000..50c8053
--- /dev/null
+++ b/data/pixmaps/feta/8/clefs-vaticana_do.xpm
@@ -0,0 +1,27 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"6 14 7 1",
+" c #040404",
+". c Gray17",
+"X c #464646",
+"o c #777777",
+"O c #8b8b8b",
+"+ c Gray74",
+"@ c None",
+/* pixels */
+"@@@@@@",
+"@@@OO@",
+"@@X O",
+"@+ O",
+"@O O",
+"@O O",
+"@o.@@@",
+"@oo@@@",
+"@O.@@@",
+"@O O",
+"@O O",
+"@+ O",
+"@@X O",
+"@@@OO@"
+};
diff --git a/data/pixmaps/feta/8/clefs-vaticana_do_change.xpm b/data/pixmaps/feta/8/clefs-vaticana_do_change.xpm
new file mode 100644
index 0000000..50c8053
--- /dev/null
+++ b/data/pixmaps/feta/8/clefs-vaticana_do_change.xpm
@@ -0,0 +1,27 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"6 14 7 1",
+" c #040404",
+". c Gray17",
+"X c #464646",
+"o c #777777",
+"O c #8b8b8b",
+"+ c Gray74",
+"@ c None",
+/* pixels */
+"@@@@@@",
+"@@@OO@",
+"@@X O",
+"@+ O",
+"@O O",
+"@O O",
+"@o.@@@",
+"@oo@@@",
+"@O.@@@",
+"@O O",
+"@O O",
+"@+ O",
+"@@X O",
+"@@@OO@"
+};
diff --git a/data/pixmaps/feta/8/clefs-vaticana_fa.xpm b/data/pixmaps/feta/8/clefs-vaticana_fa.xpm
new file mode 100644
index 0000000..ea4db63
--- /dev/null
+++ b/data/pixmaps/feta/8/clefs-vaticana_fa.xpm
@@ -0,0 +1,33 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"10 19 8 1",
+" c Gray2",
+". c Gray17",
+"X c #484848",
+"o c Gray44",
+"O c Gray54",
+"+ c Gray69",
+"@ c Gray81",
+"# c None",
+/* pixels */
+"##########",
+"#######Oo#",
+"######X O",
+"#####+ O",
+"###@#o O",
+"##. XO . O",
+"#O .X###",
+"#O o###",
+"#O X. .@@@",
+"##@#o O",
+"####o O",
+"####oX. O",
+"####ooO +",
+"####oo#@@#",
+"####oo####",
+"####oo####",
+"####oo####",
+"####oo####",
+"####++####"
+};
diff --git a/data/pixmaps/feta/8/clefs-vaticana_fa_change.xpm b/data/pixmaps/feta/8/clefs-vaticana_fa_change.xpm
new file mode 100644
index 0000000..ea4db63
--- /dev/null
+++ b/data/pixmaps/feta/8/clefs-vaticana_fa_change.xpm
@@ -0,0 +1,33 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"10 19 8 1",
+" c Gray2",
+". c Gray17",
+"X c #484848",
+"o c Gray44",
+"O c Gray54",
+"+ c Gray69",
+"@ c Gray81",
+"# c None",
+/* pixels */
+"##########",
+"#######Oo#",
+"######X O",
+"#####+ O",
+"###@#o O",
+"##. XO . O",
+"#O .X###",
+"#O o###",
+"#O X. .@@@",
+"##@#o O",
+"####o O",
+"####oX. O",
+"####ooO +",
+"####oo#@@#",
+"####oo####",
+"####oo####",
+"####oo####",
+"####oo####",
+"####++####"
+};
diff --git a/data/pixmaps/feta/8/custodes-hufnagel.xpm b/data/pixmaps/feta/8/custodes-hufnagel.xpm
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/pixmaps/feta/8/custodes-hufnagel.xpm
diff --git a/data/pixmaps/feta/8/custodes-medicaea.xpm b/data/pixmaps/feta/8/custodes-medicaea.xpm
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/pixmaps/feta/8/custodes-medicaea.xpm
diff --git a/data/pixmaps/feta/8/custodes-mensural.xpm b/data/pixmaps/feta/8/custodes-mensural.xpm
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/pixmaps/feta/8/custodes-mensural.xpm
diff --git a/data/pixmaps/feta/8/custodes-rhufnagel.xpm b/data/pixmaps/feta/8/custodes-rhufnagel.xpm
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/pixmaps/feta/8/custodes-rhufnagel.xpm
diff --git a/data/pixmaps/feta/8/custodes-rmedicaea.xpm b/data/pixmaps/feta/8/custodes-rmedicaea.xpm
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/pixmaps/feta/8/custodes-rmedicaea.xpm
diff --git a/data/pixmaps/feta/8/custodes-rmensural.xpm b/data/pixmaps/feta/8/custodes-rmensural.xpm
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/pixmaps/feta/8/custodes-rmensural.xpm
diff --git a/data/pixmaps/feta/8/custodes-rvaticana.xpm b/data/pixmaps/feta/8/custodes-rvaticana.xpm
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/pixmaps/feta/8/custodes-rvaticana.xpm
diff --git a/data/pixmaps/feta/8/custodes-vaticana.xpm b/data/pixmaps/feta/8/custodes-vaticana.xpm
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/data/pixmaps/feta/8/custodes-vaticana.xpm
diff --git a/data/pixmaps/feta/8/dots-dot.xpm b/data/pixmaps/feta/8/dots-dot.xpm
new file mode 100644
index 0000000..c27b27b
--- /dev/null
+++ b/data/pixmaps/feta/8/dots-dot.xpm
@@ -0,0 +1,17 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"5 5 6 1",
+" c Gray0",
+". c #6f6f6f",
+"X c #909090",
+"o c #bcbcbc",
+"O c Gray87",
+"+ c None",
+/* pixels */
+"+++++",
+"++oo+",
+"+X O",
+"+. X",
+"+O..O"
+};
diff --git a/data/pixmaps/feta/8/dots-evenrepeatcolon.xpm b/data/pixmaps/feta/8/dots-evenrepeatcolon.xpm
new file mode 100644
index 0000000..78a9967
--- /dev/null
+++ b/data/pixmaps/feta/8/dots-evenrepeatcolon.xpm
@@ -0,0 +1,33 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"5 21 6 1",
+" c Gray0",
+". c #2d2d2d",
+"X c Gray45",
+"o c Gray65",
+"O c #d7d7d7",
+"+ c None",
+/* pixels */
+"+++++",
+"++oO+",
+"+o o",
+"+X X",
+"+O .+",
+"+++++",
+"+++++",
+"+++++",
+"+++++",
+"+++++",
+"+++++",
+"+++++",
+"+++++",
+"+++++",
+"+++++",
+"+++++",
+"+++++",
+"+O .+",
+"+X X",
+"+o o",
+"++oO+"
+};
diff --git a/data/pixmaps/feta/8/dots-repeatcolon.xpm b/data/pixmaps/feta/8/dots-repeatcolon.xpm
new file mode 100644
index 0000000..b41654d
--- /dev/null
+++ b/data/pixmaps/feta/8/dots-repeatcolon.xpm
@@ -0,0 +1,24 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"5 13 5 1",
+" c Gray0",
+". c Gray14",
+"X c Gray45",
+"o c #a4a4a4",
+"O c None",
+/* pixels */
+"OOOOO",
+"OOooO",
+"Oo o",
+"OX X",
+"OO..O",
+"OOOOO",
+"OOOOO",
+"OOOOO",
+"OOOOO",
+"OO..O",
+"OX X",
+"Oo o",
+"OOooO"
+};
diff --git a/data/pixmaps/feta/8/flags-d3.xpm b/data/pixmaps/feta/8/flags-d3.xpm
new file mode 100644
index 0000000..b5d3b44
--- /dev/null
+++ b/data/pixmaps/feta/8/flags-d3.xpm
@@ -0,0 +1,38 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"11 24 8 1",
+" c Gray4",
+". c #323232",
+"X c Gray37",
+"o c Gray44",
+"O c #8e8e8e",
+"+ c Gray68",
+"@ c Gray77",
+"# c None",
+/* pixels */
+"###########",
+"########O##",
+"########.+#",
+"########oX#",
+"######### #",
+"######### +",
+"#########oo",
+"#########Xo",
+"#oo######oo",
+"#oX######.O",
+"#oX#####O #",
+"#oX##### O#",
+"#oo###@..##",
+"#oo##+. ###",
+"#oo#X O###",
+"#O.. O####",
+"#O O#####",
+"#O .######",
+"#O @######",
+"#O o#######",
+"#O ########",
+"#oX########",
+"#oo########",
+"##@########"
+};
diff --git a/data/pixmaps/feta/8/flags-d4.xpm b/data/pixmaps/feta/8/flags-d4.xpm
new file mode 100644
index 0000000..359f564
--- /dev/null
+++ b/data/pixmaps/feta/8/flags-d4.xpm
@@ -0,0 +1,39 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"11 25 8 1",
+" c #090909",
+". c Gray17",
+"X c Gray33",
+"o c Gray44",
+"O c #8b8b8b",
+"+ c #a7a7a7",
+"@ c Gray79",
+"# c None",
+/* pixels */
+"###########",
+"#########@#",
+"#########o+",
+"#########oo",
+"#########oo",
+"#########.O",
+"########+ #",
+"######## o#",
+"#######. o#",
+"#oX##O o# #",
+"#oo#X o## #",
+"#O . o### #",
+"#O o###OX#",
+"#O .####.@#",
+"#O +###XX##",
+"#o ###o ###",
+"#oX#@..@###",
+"#ooO .#####",
+"#O +#####",
+"#O O######",
+"#O o#######",
+"#O ########",
+"#o.########",
+"#oo########",
+"##@########"
+};
diff --git a/data/pixmaps/feta/8/flags-d5.xpm b/data/pixmaps/feta/8/flags-d5.xpm
new file mode 100644
index 0000000..0470804
--- /dev/null
+++ b/data/pixmaps/feta/8/flags-d5.xpm
@@ -0,0 +1,46 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"11 32 8 1",
+" c Gray2",
+". c #313131",
+"X c #4b4b4b",
+"o c Gray45",
+"O c #868686",
+"+ c #b2b2b2",
+"@ c #c6c6c6",
+"# c None",
+/* pixels */
+"###########",
+"#########@#",
+"#########o+",
+"#########oo",
+"#########oo",
+"#########oo",
+"######### #",
+"########.o#",
+"#######...#",
+"#####O .#X+",
+"###o X##Xo",
+"##O X###oo",
+"##o X####X+",
+"##o.####oX#",
+"##o+###+ o#",
+"#+o###O .X#",
+"#oo#+X X# #",
+"#o.X X## #",
+"#O X##+.#",
+"#O X###.o#",
+"#O ###+ ##",
+"#O +##+ +##",
+"#o.##+ o###",
+"#oo#X X####",
+"#O.. X#####",
+"#O .######",
+"#O +######",
+"#O O#######",
+"#o ########",
+"#oo########",
+"#oo########",
+"##@########"
+};
diff --git a/data/pixmaps/feta/8/flags-d6.xpm b/data/pixmaps/feta/8/flags-d6.xpm
new file mode 100644
index 0000000..f105376
--- /dev/null
+++ b/data/pixmaps/feta/8/flags-d6.xpm
@@ -0,0 +1,50 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"11 36 8 1",
+" c #040404",
+". c #313131",
+"X c #4b4b4b",
+"o c #717171",
+"O c #898989",
+"+ c #b6b6b6",
+"@ c Gray78",
+"# c None",
+/* pixels */
+"###########",
+"#########+@",
+"#########oo",
+"#########oo",
+"#########oo",
+"######### +",
+"########. #",
+"#####+o Xoo",
+"##@. o#oo",
+"##o +##oo",
+"##O X#### +",
+"##o.####X #",
+"##O@###X #",
+"#####+ O.#",
+"###+X +# #",
+"##O X##+.#",
+"##o X###.o#",
+"##o ###+ o#",
+"##o+##+ .o#",
+"#@o##+ ooo#",
+"#oo#o X#oo#",
+"#ooo X##oo#",
+"#O ###.@#",
+"#O +##o.##",
+"#O o### +##",
+"#O ###.o###",
+"#O.##..####",
+"#oo#X #####",
+"#o.X +#####",
+"#O O######",
+"#O X#######",
+"#O +#######",
+"#O ########",
+"#oo########",
+"#oo########",
+"##@########"
+};
diff --git a/data/pixmaps/feta/8/flags-dgrace.xpm b/data/pixmaps/feta/8/flags-dgrace.xpm
new file mode 100644
index 0000000..dda390e
--- /dev/null
+++ b/data/pixmaps/feta/8/flags-dgrace.xpm
@@ -0,0 +1,23 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"19 11 6 1",
+" c #151515",
+". c #232323",
+"X c #7b7b7b",
+"o c #8e8e8e",
+"O c #b1b1b1",
+"+ c None",
+/* pixels */
+"+++++++++++++++++++",
+"+OX++++++++++++++++",
+"+O. X++++++++++++++",
+"+++O. o++++++++++++",
+"+++++O o++++++++++",
+"+++++++O. o++++++++",
+"+++++++++o O++++++",
+"+++++++++++o .O++++",
+"+++++++++++++o .O++",
+"+++++++++++++++X .O",
+"+++++++++++++++++XO"
+};
diff --git a/data/pixmaps/feta/8/flags-dstem.xpm b/data/pixmaps/feta/8/flags-dstem.xpm
new file mode 100644
index 0000000..e3de3d1
--- /dev/null
+++ b/data/pixmaps/feta/8/flags-dstem.xpm
@@ -0,0 +1,36 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"3 27 3 1",
+" c Gray45",
+". c #bcbcbc",
+"X c None",
+/* pixels */
+"XXX",
+"X..",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X.."
+};
diff --git a/data/pixmaps/feta/8/flags-stem.xpm b/data/pixmaps/feta/8/flags-stem.xpm
new file mode 100644
index 0000000..e3de3d1
--- /dev/null
+++ b/data/pixmaps/feta/8/flags-stem.xpm
@@ -0,0 +1,36 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"3 27 3 1",
+" c Gray45",
+". c #bcbcbc",
+"X c None",
+/* pixels */
+"XXX",
+"X..",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X ",
+"X.."
+};
diff --git a/data/pixmaps/feta/8/flags-u3.xpm b/data/pixmaps/feta/8/flags-u3.xpm
new file mode 100644
index 0000000..a0365d3
--- /dev/null
+++ b/data/pixmaps/feta/8/flags-u3.xpm
@@ -0,0 +1,39 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"10 25 8 1",
+" c #040404",
+". c #2d2d2d",
+"X c #4c4c4c",
+"o c #717171",
+"O c #868686",
+"+ c Gray71",
+"@ c #d0d0d0",
+"# c None",
+/* pixels */
+"##########",
+"#@@#######",
+"#oO#######",
+"#oo#######",
+"#o #######",
+"#o @######",
+"#O o######",
+"#O +#####",
+"#o .#####",
+"#oX. o####",
+"#oO@ +###",
+"#oo#+ @##",
+"#oo##+ .##",
+"#oO###+ +#",
+"#oO####X.#",
+"#oO####+ #",
+"#oo#####.O",
+"#@######Oo",
+"########Oo",
+"########Oo",
+"########.@",
+"#######@ @",
+"#######OX#",
+"#######.O#",
+"#######O##"
+};
diff --git a/data/pixmaps/feta/8/flags-u4.xpm b/data/pixmaps/feta/8/flags-u4.xpm
new file mode 100644
index 0000000..065eda3
--- /dev/null
+++ b/data/pixmaps/feta/8/flags-u4.xpm
@@ -0,0 +1,43 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"10 29 8 1",
+" c Gray2",
+". c #2c2c2c",
+"X c #4e4e4e",
+"o c Gray45",
+"O c Gray55",
+"+ c #b6b6b6",
+"@ c #d3d3d3",
+"# c None",
+/* pixels */
+"##########",
+"#@@#######",
+"#oO#######",
+"#oo#######",
+"#o #######",
+"#O O######",
+"#o .######",
+"#o o#####",
+"#o. @####",
+"#oO@ @###",
+"#o.#+ .###",
+"#o +#+ o##",
+"#O X##O ##",
+"#o O##.o#",
+"#o +#+ #",
+"#oOO @#.@",
+"#oO#+ X#.@",
+"#@@##+ X.#",
+"######+ o#",
+"#######X.#",
+"######## +",
+"########oo",
+"########Oo",
+"########oo",
+"########XO",
+"########.@",
+"#######OX#",
+"#######.O#",
+"#######O##"
+};
diff --git a/data/pixmaps/feta/8/flags-u5.xpm b/data/pixmaps/feta/8/flags-u5.xpm
new file mode 100644
index 0000000..8410dcd
--- /dev/null
+++ b/data/pixmaps/feta/8/flags-u5.xpm
@@ -0,0 +1,49 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"10 35 8 1",
+" c #060606",
+". c #313131",
+"X c #505050",
+"o c Gray45",
+"O c #8d8d8d",
+"+ c #aeaeae",
+"@ c Gray82",
+"# c None",
+/* pixels */
+"##########",
+"#@@#######",
+"#oO#######",
+"#oo#######",
+"#o #######",
+"#o @######",
+"#O X######",
+"#o +#####",
+"#o. @####",
+"#oO@ .####",
+"#o.#+ o###",
+"#o @#+ @##",
+"#O X##..##",
+"#o +#@ @#",
+"#o +#.o#",
+"#oOo .#OX#",
+"#oo#+ oOX#",
+"#@X@#+ o#",
+"##Xo##+ @#",
+"##X ###Xo#",
+"##X .##+ #",
+"##O X##.@",
+"###+ +#.@",
+"#####X O.#",
+"######X O#",
+"#######Xo#",
+"#######@ #",
+"########.o",
+"########Oo",
+"########oo",
+"########X+",
+"########.@",
+"#######OX#",
+"#######.O#",
+"#######O##"
+};
diff --git a/data/pixmaps/feta/8/flags-u6.xpm b/data/pixmaps/feta/8/flags-u6.xpm
new file mode 100644
index 0000000..b66db19
--- /dev/null
+++ b/data/pixmaps/feta/8/flags-u6.xpm
@@ -0,0 +1,57 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"10 43 8 1",
+" c Gray2",
+". c #2a2a2a",
+"X c #505050",
+"o c #727272",
+"O c Gray55",
+"+ c #acacac",
+"@ c Gray83",
+"# c None",
+/* pixels */
+"##########",
+"#@@#######",
+"#oO#######",
+"#oo#######",
+"#o #######",
+"#o @######",
+"#O o######",
+"#o +#####",
+"#o. .@####",
+"#oO+ o####",
+"#oX#O @###",
+"#o ##o ###",
+"#O +##.O##",
+"#o @#+.##",
+"#o .##.@#",
+"#oXX O#OX#",
+"#oO#X ++X#",
+"#+O##o.oX#",
+"##O###o +#",
+"##XX###.+#",
+"##X @##OX#",
+"##o .###.@",
+"##+. O##.@",
+"####o O#.@",
+"##@##o.OX#",
+"##o+##o +#",
+"##XX###.+#",
+"##o +##OX#",
+"##o .@##.@",
+"###. .@#.@",
+"####O .#.@",
+"#####@..+#",
+"######@ +#",
+"#######+.#",
+"########.@",
+"########oo",
+"########oo",
+"########Oo",
+"########X+",
+"########.@",
+"#######OX#",
+"#######.O#",
+"#######O##"
+};
diff --git a/data/pixmaps/feta/8/flags-ugrace.xpm b/data/pixmaps/feta/8/flags-ugrace.xpm
new file mode 100644
index 0000000..2b9c6ff
--- /dev/null
+++ b/data/pixmaps/feta/8/flags-ugrace.xpm
@@ -0,0 +1,24 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"18 12 6 1",
+" c Gray1",
+". c Gray19",
+"X c #727272",
+"o c #b4b4b4",
+"O c #c1c1c1",
+"+ c None",
+/* pixels */
+"++++++++++++++++++",
+"++++++++++++++++oo",
+"++++++++++++++o. o",
+"+++++++++++++X X++",
+"+++++++++++o .o+++",
+"+++++++++o. o+++++",
+"++++++++X X+++++++",
+"++++++o .O++++++++",
+"++++o. o++++++++++",
+"+++X X++++++++++++",
+"+o .o+++++++++++++",
+"+oo+++++++++++++++"
+};
diff --git a/data/pixmaps/feta/8/noteheads--1.xpm b/data/pixmaps/feta/8/noteheads--1.xpm
new file mode 100644
index 0000000..7b9a423
--- /dev/null
+++ b/data/pixmaps/feta/8/noteheads--1.xpm
@@ -0,0 +1,24 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"19 10 8 1",
+" c #040404",
+". c #2c2c2c",
+"X c Gray26",
+"o c #777777",
+"O c Gray54",
+"+ c #b1b1b1",
+"@ c Gray85",
+"# c None",
+/* pixels */
+"###################",
+"##O###@oOOOO+####++",
+"#O #+. o#@O o@# o",
+"#o X .####@ + o",
+"#O .#####o O",
+"#O .#####+ O",
+"#O @####+ o",
+"#o . o####+ + o",
+"#o #+. X@@@ o@# o",
+"##O###@OoOOO+####+@"
+};
diff --git a/data/pixmaps/feta/8/noteheads--1mensural.xpm b/data/pixmaps/feta/8/noteheads--1mensural.xpm
new file mode 100644
index 0000000..12e293e
--- /dev/null
+++ b/data/pixmaps/feta/8/noteheads--1mensural.xpm
@@ -0,0 +1,27 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"17 14 7 1",
+" c #010101",
+". c #252525",
+"X c #797979",
+"o c #868686",
+"O c #b9b9b9",
+"+ c #c0c0c0",
+"@ c None",
+/* pixels */
+"@@@@@@@@@@@@@@@@@",
+"@+O@@@@@@@@@@@@O+",
+"@XX@@@@@@@@@@@@XX",
+"@o XoXoXXXXoXXX o",
+"@o o",
+"@o o",
+"@o.oXXXXXXXXXXo.X",
+"@XX@@@@@@@@@@@@XX",
+"@o.oXXXXXXXXXXo.o",
+"@o o",
+"@o o",
+"@o XoXXXXoXoXoX o",
+"@XX@@@@@@@@@@@@XX",
+"@+O@@@@@@@@@@@@OO"
+};
diff --git a/data/pixmaps/feta/8/noteheads--2mensural.xpm b/data/pixmaps/feta/8/noteheads--2mensural.xpm
new file mode 100644
index 0000000..022203a
--- /dev/null
+++ b/data/pixmaps/feta/8/noteheads--2mensural.xpm
@@ -0,0 +1,35 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"18 21 8 1",
+" c #020202",
+". c #393939",
+"X c Gray30",
+"o c #717171",
+"O c Gray55",
+"+ c #a9a9a9",
+"@ c Gray77",
+"# c None",
+/* pixels */
+"##################",
+"#++############++#",
+"#oo############Xo#",
+"#O oooooooooooo o#",
+"#O O#",
+"#O o#",
+"#o.++++++++++++.o#",
+"#oo############oo#",
+"#O XXXXXXXXXXXX o#",
+"#O o#",
+"#O o#",
+"#O @@@+@+@@@@@@ o#",
+"#oo############oX#",
+"##@############o #",
+"###############+ #",
+"################ #",
+"################ #",
+"################ O",
+"################ O",
+"################ O",
+"################o+"
+};
diff --git a/data/pixmaps/feta/8/noteheads--3mensural.xpm b/data/pixmaps/feta/8/noteheads--3mensural.xpm
new file mode 100644
index 0000000..01728a5
--- /dev/null
+++ b/data/pixmaps/feta/8/noteheads--3mensural.xpm
@@ -0,0 +1,35 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"22 21 8 1",
+" c Gray1",
+". c #3f3f3f",
+"X c #4b4b4b",
+"o c #717171",
+"O c Gray54",
+"+ c #a9a9a9",
+"@ c Gray76",
+"# c None",
+/* pixels */
+"######################",
+"#++#################O#",
+"#oo################# #",
+"#O oooooooooooooooo. #",
+"#O #",
+"#O @",
+"#oX++++O+++O+++++++O #",
+"#oo################# #",
+"#O oXXXXXXXXXXXXXXXX #",
+"#O #",
+"#O #",
+"#o @@+@@+@@@@@@+@+@O #",
+"#oo################# #",
+"##@################# #",
+"#################### #",
+"#################### #",
+"#################### +",
+"#################### O",
+"#################### O",
+"#################### O",
+"####################++"
+};
diff --git a/data/pixmaps/feta/8/noteheads-0.xpm b/data/pixmaps/feta/8/noteheads-0.xpm
new file mode 100644
index 0000000..c4027f2
--- /dev/null
+++ b/data/pixmaps/feta/8/noteheads-0.xpm
@@ -0,0 +1,24 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"17 10 8 1",
+" c #040404",
+". c #373737",
+"X c #484848",
+"o c #7b7b7b",
+"O c #8e8e8e",
+"+ c Gray72",
+"@ c gainsboro",
+"# c None",
+/* pixels */
+"#################",
+"#####@OOOOoO#####",
+"###@. .@@+. .+##",
+"##X #####X X#",
+"#O #####+ O",
+"#O ###### O",
+"#O +##### O",
+"##X X##### X#",
+"###@. .+@@. .+##",
+"#####@OoOOOO#####"
+};
diff --git a/data/pixmaps/feta/8/noteheads-0cross.xpm b/data/pixmaps/feta/8/noteheads-0cross.xpm
new file mode 100644
index 0000000..08dd5fe
--- /dev/null
+++ b/data/pixmaps/feta/8/noteheads-0cross.xpm
@@ -0,0 +1,24 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"15 11 7 1",
+" c Gray3",
+". c Gray21",
+"X c Gray28",
+"o c Gray42",
+"O c #8b8b8b",
+"+ c Gray69",
+"@ c None",
+/* pixels */
+"@@@@@@@@@@@@@@@",
+"@@@@O@@@@@@o@@@",
+"@@+ o +@@+ o +@",
+"@O +@+....+@+ O",
+"@@X.+@@oo@@+.X@",
+"@@@+ o@@@@o +@@",
+"@@@+ o@@@@o +@@",
+"@@X.+@@oo@@+.X@",
+"@O +@+....+@+ O",
+"@@+ o O@@+ o +@",
+"@@@@O@@@@@@o@@@"
+};
diff --git a/data/pixmaps/feta/8/noteheads-0diamond.xpm b/data/pixmaps/feta/8/noteheads-0diamond.xpm
new file mode 100644
index 0000000..3cb826e
--- /dev/null
+++ b/data/pixmaps/feta/8/noteheads-0diamond.xpm
@@ -0,0 +1,23 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"17 10 7 1",
+" c #060606",
+". c Gray27",
+"X c Gray47",
+"o c Gray55",
+"O c #b1b1b1",
+"+ c #c0c0c0",
+"@ c None",
+/* pixels */
+"@@@@@@@@@@@@@@@@@",
+"@@@@@@@@oo@@@@@@@",
+"@@@@@@O O@@@@@",
+"@@@@o. Xo .o@@@",
+"@O @@@O +",
+"@o @@@@ o",
+"@+ O@@@ +",
+"@@@@o. XX .o@@@",
+"@@@@@@O O@@@@@",
+"@@@@@@@@oo@@@@@@@"
+};
diff --git a/data/pixmaps/feta/8/noteheads-0mensural.xpm b/data/pixmaps/feta/8/noteheads-0mensural.xpm
new file mode 100644
index 0000000..29ac3c7
--- /dev/null
+++ b/data/pixmaps/feta/8/noteheads-0mensural.xpm
@@ -0,0 +1,22 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"9 10 6 1",
+" c #0b0b0b",
+". c Gray19",
+"X c Gray46",
+"o c Gray54",
+"O c #d8d8d8",
+"+ c None",
+/* pixels */
+"+++++++++",
+"++++OO+++",
+"+++O +++",
+"+++.. .++",
+"++.X+X .+",
+"+o X++X o",
+"++. X+X.+",
+"++O. ..++",
+"+++O. +++",
+"++++OO+++"
+};
diff --git a/data/pixmaps/feta/8/noteheads-0slash.xpm b/data/pixmaps/feta/8/noteheads-0slash.xpm
new file mode 100644
index 0000000..63bf93b
--- /dev/null
+++ b/data/pixmaps/feta/8/noteheads-0slash.xpm
@@ -0,0 +1,30 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"24 17 7 1",
+" c #060606",
+". c #484848",
+"X c Gray50",
+"o c Gray53",
+"O c #b6b6b6",
+"+ c #cdcdcd",
+"@ c None",
+/* pixels */
+"@@@@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@Ooooooooooooo+",
+"@@@@@@@@@O +",
+"@@@@@@@@@. O@",
+"@@@@@@@@O X@@@@@@O .@@",
+"@@@@@@@@ .@@@@@@@. O@@",
+"@@@@@@@o O@@@@@@O o@@@",
+"@@@@@@O .@@@@@@@ @@@@",
+"@@@@@@. @@@@@@@o O@@@@",
+"@@@@@O X@@@@@@@ .@@@@@",
+"@@@@@ @@@@@@@. O@@@@@",
+"@@@@X O@@@@@@O o@@@@@@",
+"@@@O .@@@@@@@. @@@@@@@",
+"@@@. O@@@@@@X O@@@@@@@",
+"@@O .@@@@@@@@",
+"@+ O@@@@@@@@",
+"@+oooooooooooo+@@@@@@@@@"
+};
diff --git a/data/pixmaps/feta/8/noteheads-0triangle.xpm b/data/pixmaps/feta/8/noteheads-0triangle.xpm
new file mode 100644
index 0000000..a73af66
--- /dev/null
+++ b/data/pixmaps/feta/8/noteheads-0triangle.xpm
@@ -0,0 +1,23 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"11 9 8 1",
+" c Gray0",
+". c #2c2c2c",
+"X c #535353",
+"o c Gray43",
+"O c Gray55",
+"+ c Gray71",
+"@ c Gray81",
+"# c None",
+/* pixels */
+"###########",
+"#####++####",
+"#####..####",
+"####XXXX###",
+"###@.@#.@##",
+"###XO##OX##",
+"##O.####.O#",
+"## XOOOOX #",
+"#@oooooooo@"
+};
diff --git a/data/pixmaps/feta/8/noteheads-1.xpm b/data/pixmaps/feta/8/noteheads-1.xpm
new file mode 100644
index 0000000..3f90a35
--- /dev/null
+++ b/data/pixmaps/feta/8/noteheads-1.xpm
@@ -0,0 +1,24 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"12 10 8 1",
+" c Gray2",
+". c #313131",
+"X c Gray31",
+"o c Gray46",
+"O c #8b8b8b",
+"+ c Gray67",
+"@ c #d2d2d2",
+"# c None",
+/* pixels */
+"############",
+"######@oOO+#",
+"####+. .O#X+",
+"###. X@##oo",
+"##o o###@ O",
+"#@ @###@ @",
+"#O @###o o#",
+"#oO###X .##",
+"#+X@O .+###",
+"##+OOO@#####"
+};
diff --git a/data/pixmaps/feta/8/noteheads-1cross.xpm b/data/pixmaps/feta/8/noteheads-1cross.xpm
new file mode 100644
index 0000000..5cc98b5
--- /dev/null
+++ b/data/pixmaps/feta/8/noteheads-1cross.xpm
@@ -0,0 +1,23 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"13 11 6 1",
+" c Gray4",
+". c Gray23",
+"X c Gray57",
+"o c #afafaf",
+"O c #d0d0d0",
+"+ c None",
+/* pixels */
+"+++++++++++++",
+"+++XO++++OX++",
+"++.. o++O ..+",
+"+X Oo XX oO X",
+"++X O+ .+O X+",
+"+++o X++X X++",
+"+++X X++X X++",
+"++X O+. +O X+",
+"+X Oo XX oO X",
+"++.. O++O ..+",
+"+++XO++++OX++"
+};
diff --git a/data/pixmaps/feta/8/noteheads-1diamond.xpm b/data/pixmaps/feta/8/noteheads-1diamond.xpm
new file mode 100644
index 0000000..41bce2f
--- /dev/null
+++ b/data/pixmaps/feta/8/noteheads-1diamond.xpm
@@ -0,0 +1,24 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"13 10 8 1",
+" c #070707",
+". c Gray20",
+"X c Gray26",
+"o c Gray39",
+"O c #888888",
+"+ c #b7b7b7",
+"@ c #c1c1c1",
+"# c None",
+/* pixels */
+"#############",
+"##########OO#",
+"###@. o O",
+"### .@+ +",
+"### o##+ X#",
+"##+ +##+ +#",
+"##X +##O ##",
+"#+ @+. ##",
+"#O o .@##",
+"##OO#########"
+};
diff --git a/data/pixmaps/feta/8/noteheads-1mensural.xpm b/data/pixmaps/feta/8/noteheads-1mensural.xpm
new file mode 100644
index 0000000..29ac3c7
--- /dev/null
+++ b/data/pixmaps/feta/8/noteheads-1mensural.xpm
@@ -0,0 +1,22 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"9 10 6 1",
+" c #0b0b0b",
+". c Gray19",
+"X c Gray46",
+"o c Gray54",
+"O c #d8d8d8",
+"+ c None",
+/* pixels */
+"+++++++++",
+"++++OO+++",
+"+++O +++",
+"+++.. .++",
+"++.X+X .+",
+"+o X++X o",
+"++. X+X.+",
+"++O. ..++",
+"+++O. +++",
+"++++OO+++"
+};
diff --git a/data/pixmaps/feta/8/noteheads-1slash.xpm b/data/pixmaps/feta/8/noteheads-1slash.xpm
new file mode 100644
index 0000000..e292a34
--- /dev/null
+++ b/data/pixmaps/feta/8/noteheads-1slash.xpm
@@ -0,0 +1,30 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"21 17 7 1",
+" c #060606",
+". c #484848",
+"X c Gray50",
+"o c #868686",
+"O c #b6b6b6",
+"+ c #cdcdcd",
+"@ c None",
+/* pixels */
+"@@@@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@@Oooooooooo+",
+"@@@@@@@@@O +",
+"@@@@@@@@@. O@",
+"@@@@@@@@O X@@@O .@@",
+"@@@@@@@@ .@@@@. O@@",
+"@@@@@@@o O@@@O X@@@",
+"@@@@@@O .@@@@ @@@@",
+"@@@@@@. @@@@X O@@@@",
+"@@@@@O X@@@@ .@@@@@",
+"@@@@@ @@@@. O@@@@@",
+"@@@@X O@@@O X@@@@@@",
+"@@@O .@@@@. @@@@@@@",
+"@@@. O@@@X O@@@@@@@",
+"@@O .@@@@@@@@",
+"@+ O@@@@@@@@",
+"@+ooooooooo+@@@@@@@@@"
+};
diff --git a/data/pixmaps/feta/8/noteheads-1triangle.xpm b/data/pixmaps/feta/8/noteheads-1triangle.xpm
new file mode 100644
index 0000000..48852af
--- /dev/null
+++ b/data/pixmaps/feta/8/noteheads-1triangle.xpm
@@ -0,0 +1,22 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"9 9 7 1",
+" c Gray0",
+". c #2a2a2a",
+"X c #464646",
+"o c #727272",
+"O c #b1b1b1",
+"+ c #cdcdcd",
+"@ c None",
+/* pixels */
+"@@@@@@@@@",
+"@@@@++@@@",
+"@@@@oo@@@",
+"@@@+..+@@",
+"@@@XOOX@@",
+"@@+.@@.+@",
+"@@.O@@O.@",
+"@O oooo O",
+"@Ooooooo+"
+};
diff --git a/data/pixmaps/feta/8/noteheads-2.xpm b/data/pixmaps/feta/8/noteheads-2.xpm
new file mode 100644
index 0000000..4e0ff64
--- /dev/null
+++ b/data/pixmaps/feta/8/noteheads-2.xpm
@@ -0,0 +1,21 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"12 10 5 1",
+" c #020202",
+". c #494949",
+"X c #c0c0c0",
+"o c #e9e9e9",
+"O c None",
+/* pixels */
+"OOOOOOOOOOOO",
+"OOOOOOoXXoOO",
+"OOOOo .O",
+"OOO. X",
+"OO. X",
+"Oo o",
+"OX .O",
+"OX .OO",
+"OO. oOOO",
+"OOOoXXoOOOOO"
+};
diff --git a/data/pixmaps/feta/8/noteheads-2cross.xpm b/data/pixmaps/feta/8/noteheads-2cross.xpm
new file mode 100644
index 0000000..138f62e
--- /dev/null
+++ b/data/pixmaps/feta/8/noteheads-2cross.xpm
@@ -0,0 +1,23 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"12 10 7 1",
+" c #060606",
+". c #323232",
+"X c Gray26",
+"o c Gray49",
+"O c Gray71",
+"+ c #c5c5c5",
+"@ c None",
+/* pixels */
+"@@@@@@@@@@@@",
+"@OO@@@@@@@OO",
+"@O X@@@@@X O",
+"@@+..@@@..+@",
+"@@@@X o .@@@",
+"@@@@@ @@@@",
+"@@@@X o X@@@",
+"@@+..@@@..+@",
+"@O X@@@@@X O",
+"@OO@@@@@@@OO"
+};
diff --git a/data/pixmaps/feta/8/noteheads-2diamond.xpm b/data/pixmaps/feta/8/noteheads-2diamond.xpm
new file mode 100644
index 0000000..d9690d0
--- /dev/null
+++ b/data/pixmaps/feta/8/noteheads-2diamond.xpm
@@ -0,0 +1,23 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"12 11 6 1",
+" c Gray1",
+". c Gray24",
+"X c Gray28",
+"o c Gray53",
+"O c #bbbbbb",
+"+ c None",
+/* pixels */
+"++++++++++++",
+"+++++Oo+++++",
+"+++++ . O",
+"++++o o",
+"++++X X+",
+"+++O X++",
+"+++X O++",
+"++X X+++",
+"+o o+++",
+"+O . ++++",
+"++++++oO++++"
+};
diff --git a/data/pixmaps/feta/8/noteheads-2mensural.xpm b/data/pixmaps/feta/8/noteheads-2mensural.xpm
new file mode 100644
index 0000000..6d6115f
--- /dev/null
+++ b/data/pixmaps/feta/8/noteheads-2mensural.xpm
@@ -0,0 +1,21 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"9 10 5 1",
+" c #070707",
+". c Gray20",
+"X c Gray53",
+"o c #d7d7d7",
+"O c None",
+/* pixels */
+"OOOOOOOOO",
+"OOOOooOOO",
+"OOOo. OOO",
+"OOO. .OO",
+"OO. .O",
+"OX X",
+"OO. .O",
+"OOo. .oO",
+"OOOO. oOO",
+"OOOOooOOO"
+};
diff --git a/data/pixmaps/feta/8/noteheads-2slash.xpm b/data/pixmaps/feta/8/noteheads-2slash.xpm
new file mode 100644
index 0000000..82554af
--- /dev/null
+++ b/data/pixmaps/feta/8/noteheads-2slash.xpm
@@ -0,0 +1,29 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"15 17 6 1",
+" c Gray1",
+". c #464646",
+"X c #838383",
+"o c #b7b7b7",
+"O c #cdcdcd",
+"+ c None",
+/* pixels */
+"+++++++++++++++",
+"++++++++++oXXXO",
+"+++++++++o +",
+"+++++++++. o+",
+"++++++++o .++",
+"++++++++ o++",
+"+++++++X .+++",
+"++++++o ++++",
+"++++++. o++++",
+"+++++o .+++++",
+"+++++ O+++++",
+"++++. X++++++",
+"+++o +++++++",
+"+++. o+++++++",
+"++o .++++++++",
+"++ o++++++++",
+"+O.XXO+++++++++"
+};
diff --git a/data/pixmaps/feta/8/noteheads-2triangle.xpm b/data/pixmaps/feta/8/noteheads-2triangle.xpm
new file mode 100644
index 0000000..083eeb8
--- /dev/null
+++ b/data/pixmaps/feta/8/noteheads-2triangle.xpm
@@ -0,0 +1,23 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"9 9 8 1",
+" c #010101",
+". c #393939",
+"X c #585858",
+"o c #797979",
+"O c Gray54",
+"+ c #b1b1b1",
+"@ c Gray83",
+"# c None",
+/* pixels */
+"#########",
+"####@@###",
+"####oo###",
+"###@ @##",
+"###X X##",
+"##@ @#",
+"##. .#",
+"#+ +",
+"#+oOOOOo+"
+};
diff --git a/data/pixmaps/feta/8/noteheads-2xcircle.xpm b/data/pixmaps/feta/8/noteheads-2xcircle.xpm
new file mode 100644
index 0000000..6b25356
--- /dev/null
+++ b/data/pixmaps/feta/8/noteheads-2xcircle.xpm
@@ -0,0 +1,23 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"12 11 6 1",
+" c #040404",
+". c Gray21",
+"X c #4c4c4c",
+"o c #6f6f6f",
+"O c #b9b9b9",
+"+ c None",
+/* pixels */
+"++++++++++++",
+"+++++ooo++++",
+"+++o.ooo.o++",
+"++X o+++o .+",
+"+O +..+..+ O",
+"+oo++X X++oo",
+"+oo++X X++oo",
+"+O +..+..+ O",
+"++X o+++o X+",
+"+++o.ooo.o++",
+"+++++ooo++++"
+};
diff --git a/data/pixmaps/feta/8/noteheads-ledgerending.xpm b/data/pixmaps/feta/8/noteheads-ledgerending.xpm
new file mode 100644
index 0000000..a74581c
--- /dev/null
+++ b/data/pixmaps/feta/8/noteheads-ledgerending.xpm
@@ -0,0 +1,14 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"10 4 4 1",
+" c #010101",
+". c #8b8b8b",
+"X c #cbcbcb",
+"o c None",
+/* pixels */
+"oooooooooo",
+"oX.......X",
+"o. .",
+"oX.......X"
+};
diff --git a/data/pixmaps/feta/8/rests--1.xpm b/data/pixmaps/feta/8/rests--1.xpm
new file mode 100644
index 0000000..1401b29
--- /dev/null
+++ b/data/pixmaps/feta/8/rests--1.xpm
@@ -0,0 +1,20 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"6 9 5 1",
+" c #040404",
+". c Gray46",
+"X c #818181",
+"o c #b9b9b9",
+"O c None",
+/* pixels */
+"OOOOOO",
+"Oo.X.o",
+"O. .",
+"O. .",
+"O. .",
+"O. .",
+"O. .",
+"O. .",
+"Oo.X.o"
+};
diff --git a/data/pixmaps/feta/8/rests--1o.xpm b/data/pixmaps/feta/8/rests--1o.xpm
new file mode 100644
index 0000000..76958c1
--- /dev/null
+++ b/data/pixmaps/feta/8/rests--1o.xpm
@@ -0,0 +1,23 @@
+/* XPM */
+static char * rests__1o_xpm[] = {
+"15 9 11 1",
+" c None",
+". c #888888",
+"+ c #818181",
+"@ c #B9B9B9",
+"# c #020202",
+"$ c #040404",
+"% c #757575",
+"& c #C8C8C8",
+"* c #050505",
+"= c #737373",
+"- c #AAAAAA",
+" ",
+" ......+...... ",
+"@######$######@",
+" %$$$% ",
+" %$$$% ",
+" %$$$% ",
+" %$$$% ",
+"&******$******&",
+"&=====-+====== "};
diff --git a/data/pixmaps/feta/8/rests--2.xpm b/data/pixmaps/feta/8/rests--2.xpm
new file mode 100644
index 0000000..9ed05a1
--- /dev/null
+++ b/data/pixmaps/feta/8/rests--2.xpm
@@ -0,0 +1,28 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"6 17 5 1",
+" c Gray1",
+". c #777777",
+"X c #8d8d8d",
+"o c #c0c0c0",
+"O c None",
+/* pixels */
+"OOOOOO",
+"Oo.X.o",
+"O. .",
+"O. .",
+"O. .",
+"O. .",
+"O. .",
+"O. .",
+"O. .",
+"O. .",
+"O. .",
+"O. .",
+"O. .",
+"O. .",
+"O. .",
+"O. .",
+"Oo.XXo"
+};
diff --git a/data/pixmaps/feta/8/rests--4.xpm b/data/pixmaps/feta/8/rests--4.xpm
new file mode 100644
index 0000000..4d858b3
--- /dev/null
+++ b/data/pixmaps/feta/8/rests--4.xpm
@@ -0,0 +1,30 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"63 17 7 1",
+" c Gray1",
+". c #272727",
+"X c #7b7b7b",
+"o c #888888",
+"O c #b9b9b9",
+"+ c #c0c0c0",
+"@ c None",
+/* pixels */
+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+"@+O@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@OO",
+"@XX@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@XX",
+"@XX@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@XX",
+"@XX@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@XX",
+"@XX@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@XX",
+"@X.oXXXXXXXXXXXoXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.o",
+"@X o",
+"@o o",
+"@o o",
+"@o X",
+"@o.oXXXXXXoooXXXoXoXXoXXXoXXXoXoXXXXooXXoXoXXoXXXXXooXXXXoXoo X",
+"@XX@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@XX",
+"@XX@+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@XX",
+"@XX@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@XX",
+"@XX@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@XX",
+"@+O@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@O+"
+};
diff --git a/data/pixmaps/feta/8/rests-0.xpm b/data/pixmaps/feta/8/rests-0.xpm
new file mode 100644
index 0000000..e3da06f
--- /dev/null
+++ b/data/pixmaps/feta/8/rests-0.xpm
@@ -0,0 +1,18 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"13 7 5 1",
+" c Gray1",
+". c Gray49",
+"X c Gray53",
+"o c Gray77",
+"O c None",
+/* pixels */
+"OOOOOOOOOOOOO",
+"Oo.XXXXXXXX.o",
+"O. X",
+"OX X",
+"OX X",
+"OX .",
+"Oo.XXXXXXXX.o"
+};
diff --git a/data/pixmaps/feta/8/rests-0o.xpm b/data/pixmaps/feta/8/rests-0o.xpm
new file mode 100644
index 0000000..194bf4e
--- /dev/null
+++ b/data/pixmaps/feta/8/rests-0o.xpm
@@ -0,0 +1,20 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"23 8 6 1",
+" c #020202",
+". c Gray37",
+"X c Gray38",
+"o c #888888",
+"O c #b9b9b9",
+"+ c None",
+/* pixels */
+"+++++++++++++++++++++++",
+"++oooooooooooooooooooo+",
+"+O O",
+"++++++X .+++++",
+"++++++X .+++++",
+"++++++X .+++++",
+"++++++. .+++++",
+"++++++OXoooooooooO+++++"
+};
diff --git a/data/pixmaps/feta/8/rests-1.xpm b/data/pixmaps/feta/8/rests-1.xpm
new file mode 100644
index 0000000..e3da06f
--- /dev/null
+++ b/data/pixmaps/feta/8/rests-1.xpm
@@ -0,0 +1,18 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"13 7 5 1",
+" c Gray1",
+". c Gray49",
+"X c Gray53",
+"o c Gray77",
+"O c None",
+/* pixels */
+"OOOOOOOOOOOOO",
+"Oo.XXXXXXXX.o",
+"O. X",
+"OX X",
+"OX X",
+"OX .",
+"Oo.XXXXXXXX.o"
+};
diff --git a/data/pixmaps/feta/8/rests-1o.xpm b/data/pixmaps/feta/8/rests-1o.xpm
new file mode 100644
index 0000000..d94fa12
--- /dev/null
+++ b/data/pixmaps/feta/8/rests-1o.xpm
@@ -0,0 +1,19 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"23 7 6 1",
+" c Gray2",
+". c Gray37",
+"X c Gray45",
+"o c #aaaaaa",
+"O c #c8c8c8",
+"+ c None",
+/* pixels */
+"+++++++++++++++++++++++",
+"++++++oXXXXXXXXXXo+++++",
+"++++++. .+++++",
+"++++++. .+++++",
+"++++++. .+++++",
+"+O O",
+"+OXXXXXoXXXXXXXXXXXXXX+"
+};
diff --git a/data/pixmaps/feta/8/rests-2.xpm b/data/pixmaps/feta/8/rests-2.xpm
new file mode 100644
index 0000000..23e5271
--- /dev/null
+++ b/data/pixmaps/feta/8/rests-2.xpm
@@ -0,0 +1,37 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"9 23 8 1",
+" c Gray2",
+". c #2f2f2f",
+"X c Gray31",
+"o c #6f6f6f",
+"O c #909090",
+"+ c Gray72",
+"@ c #cdcdcd",
+"# c None",
+/* pixels */
+"#########",
+"###O@####",
+"###O @###",
+"####Xo###",
+"####@ o##",
+"####+ @#",
+"####o .#",
+"###@ o",
+"##@ @",
+"#@. @#",
+"#o +##",
+"#@ o###",
+"##o +###",
+"###o @###",
+"####.X###",
+"#@..X +##",
+"#o .##",
+"#O .Xo .#",
+"#@ O###o#",
+"## +#####",
+"##OO#####",
+"###O#####",
+"###@@####"
+};
diff --git a/data/pixmaps/feta/8/rests-2mensural.xpm b/data/pixmaps/feta/8/rests-2mensural.xpm
new file mode 100644
index 0000000..b57b733
--- /dev/null
+++ b/data/pixmaps/feta/8/rests-2mensural.xpm
@@ -0,0 +1,21 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"8 8 7 1",
+" c #010101",
+". c #444444",
+"X c #727272",
+"o c #898989",
+"O c #bbbbbb",
+"+ c #c1c1c1",
+"@ c None",
+/* pixels */
+"@@@@@@@@",
+"@@o+@@@@",
+"@o XO@",
+"@o o. o",
+"@o @@@X+",
+"@o @@@@@",
+"@o @@@@@",
+"@@o@@@@@"
+};
diff --git a/data/pixmaps/feta/8/rests-3.xpm b/data/pixmaps/feta/8/rests-3.xpm
new file mode 100644
index 0000000..76e19bd
--- /dev/null
+++ b/data/pixmaps/feta/8/rests-3.xpm
@@ -0,0 +1,30 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"12 16 8 1",
+" c Gray2",
+". c Gray20",
+"X c #515151",
+"o c #777777",
+"O c #8b8b8b",
+"+ c #b4b4b4",
+"@ c Gray81",
+"# c None",
+/* pixels */
+"############",
+"##+OO@######",
+"#+ @###++",
+"#o @###Xo",
+"#O +#@X #",
+"##. . X#",
+"###+oOoO#.O#",
+"########+ @#",
+"######## X##",
+"#######@ @##",
+"#######o ###",
+"####### X###",
+"######+ @###",
+"######X ####",
+"#####@ O####",
+"#####@O@####"
+};
diff --git a/data/pixmaps/feta/8/rests-3mensural.xpm b/data/pixmaps/feta/8/rests-3mensural.xpm
new file mode 100644
index 0000000..6bf3cca
--- /dev/null
+++ b/data/pixmaps/feta/8/rests-3mensural.xpm
@@ -0,0 +1,21 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"8 8 7 1",
+" c #010101",
+". c #3c3c3c",
+"X c #747474",
+"o c Gray53",
+"O c #b7b7b7",
+"+ c #c3c3c3",
+"@ c None",
+/* pixels */
+"@@@@@@@@",
+"@@@@@@o+",
+"@@@o. o",
+"@+ X o",
+"@@XO@@ o",
+"@@@@@@ o",
+"@@@@@@ o",
+"@@@@@@OO"
+};
diff --git a/data/pixmaps/feta/8/rests-4.xpm b/data/pixmaps/feta/8/rests-4.xpm
new file mode 100644
index 0000000..525ff92
--- /dev/null
+++ b/data/pixmaps/feta/8/rests-4.xpm
@@ -0,0 +1,37 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"14 23 8 1",
+" c #060606",
+". c Gray17",
+"X c Gray30",
+"o c Gray46",
+"O c #8d8d8d",
+"+ c #aaaaaa",
+"@ c #d0d0d0",
+"# c None",
+/* pixels */
+"##############",
+"#####OoO######",
+"####X .###++",
+"#### ###.O",
+"####. @@X #",
+"####@. . .#",
+"######O++O@oX#",
+"########### @#",
+"##########+ ##",
+"##OXXO####XX##",
+"#+ +### O##",
+"#O o##O ###",
+"#+ X@o .###",
+"##O . o###",
+"###@@@@@@ +###",
+"########o ####",
+"######## o####",
+"#######@ o####",
+"#######o #####",
+"####### .#####",
+"####### O#####",
+"######o +#####",
+"######+O######"
+};
diff --git a/data/pixmaps/feta/8/rests-4mensural.xpm b/data/pixmaps/feta/8/rests-4mensural.xpm
new file mode 100644
index 0000000..3b5ef4f
--- /dev/null
+++ b/data/pixmaps/feta/8/rests-4mensural.xpm
@@ -0,0 +1,22 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"8 9 7 1",
+" c Gray2",
+". c Gray32",
+"X c #777777",
+"o c Gray54",
+"O c Gray67",
+"+ c Gray82",
+"@ c None",
+/* pixels */
+"@@@@@@@@",
+"@@@@@+X+",
+"@@@+. o",
+"@+. X o",
+"@O o+O o",
+"@@@o o",
+"@+ .+ o",
+"@O.+@@ o",
+"@@@@@@OO"
+};
diff --git a/data/pixmaps/feta/8/rests-5.xpm b/data/pixmaps/feta/8/rests-5.xpm
new file mode 100644
index 0000000..ed48e47
--- /dev/null
+++ b/data/pixmaps/feta/8/rests-5.xpm
@@ -0,0 +1,45 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"15 31 8 1",
+" c #060606",
+". c #2f2f2f",
+"X c #515151",
+"o c Gray43",
+"O c #898989",
+"+ c #b1b1b1",
+"@ c #cdcdcd",
+"# c None",
+/* pixels */
+"###############",
+"######+OO@#####",
+"#####O .###++",
+"#####X @##.o",
+"#####X @#O #",
+"######. #",
+"#######OoOo+oX#",
+"############ o#",
+"############.@#",
+"####. o###O @#",
+"###o @##OX##",
+"###o +##.o##",
+"###+ XO @##",
+"####+. .X @##",
+"##########oX###",
+"##########.X###",
+"#########+ @###",
+"##. o###+ @###",
+"#O +##.X####",
+"#O +##.O####",
+"#+ XO. @####",
+"##+. . #####",
+"########.X#####",
+"#######@ O#####",
+"#######+ @#####",
+"#######X ######",
+"#######..######",
+"######@ O######",
+"######@ @######",
+"######X @######",
+"######+O#######"
+};
diff --git a/data/pixmaps/feta/8/rests-6.xpm b/data/pixmaps/feta/8/rests-6.xpm
new file mode 100644
index 0000000..1aa4a6a
--- /dev/null
+++ b/data/pixmaps/feta/8/rests-6.xpm
@@ -0,0 +1,53 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"16 39 8 1",
+" c #060606",
+". c #2f2f2f",
+"X c #505050",
+"o c Gray45",
+"O c Gray55",
+"+ c #aeaeae",
+"@ c #d0d0d0",
+"# c None",
+/* pixels */
+"################",
+"#######+Oo@#####",
+"######O .###++",
+"######X @##oo",
+"######X @#O @",
+"######@. . #",
+"########OoOo++.#",
+"#############OX#",
+"######@###### o#",
+"#####. o####.@#",
+"####o @##@ @#",
+"####X @##X.##",
+"####+ XO o##",
+"#####+. o O##",
+"###########@ @##",
+"###########+ @##",
+"###########OX###",
+"###+ .@###.X###",
+"##@ .###.O###",
+"##@ .##+ @###",
+"###. .OX @###",
+"####o XXX####",
+"#####@####.X####",
+"#########@ @####",
+"##+oo@###+ @####",
+"#+ @##o #####",
+"#O +##.X#####",
+"#O +#O X#####",
+"##. @#####",
+"###+oOo++ @#####",
+"########X ######",
+"########..######",
+"#######@ O######",
+"#######@ @######",
+"#######O @######",
+"#######..#######",
+"####### .#######",
+"######@ O#######",
+"#######o@#######"
+};
diff --git a/data/pixmaps/feta/8/rests-7.xpm b/data/pixmaps/feta/8/rests-7.xpm
new file mode 100644
index 0000000..0472e2d
--- /dev/null
+++ b/data/pixmaps/feta/8/rests-7.xpm
@@ -0,0 +1,60 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"18 46 8 1",
+" c #060606",
+". c #2c2c2c",
+"X c Gray30",
+"o c #747474",
+"O c #8e8e8e",
+"+ c #aeaeae",
+"@ c Gray82",
+"# c None",
+/* pixels */
+"##################",
+"#########OoO######",
+"########X X###oo",
+"######## ###.O",
+"######## @#o @",
+"########@ #",
+"##########OOOO@oo#",
+"###############oo#",
+"#######@@###### +#",
+"######O O###@ ##",
+"###### ###o ##",
+"###### ##@.o##",
+"######o XX o##",
+"#######+... X@ @##",
+"#############+ ###",
+"#############o ###",
+"#####OXXO####Xo###",
+"####+ +### O###",
+"####o o##@ ####",
+"####O o@O ####",
+"#####O XXX####",
+"######@++++#.o####",
+"############ O####",
+"###########O #####",
+"###@X.X@###o #####",
+"###. .###XX#####",
+"### ### o#####",
+"###. ++. O#####",
+"###@X . ######",
+"#####@@@@#O ######",
+"########## o######",
+"##@O+@#### o######",
+"#@ @##O @######",
+"#O o##o #######",
+"#O O#@X.#######",
+"##. O#######",
+"###OXoXo@ o#######",
+"########O ########",
+"########o ########",
+"######## .########",
+"######## o########",
+"#######@ O########",
+"#######o @########",
+"#######X #########",
+"####### X#########",
+"#######O+#########"
+};
diff --git a/data/pixmaps/feta/8/scripts-arpeggio.xpm b/data/pixmaps/feta/8/scripts-arpeggio.xpm
new file mode 100644
index 0000000..bf68a37
--- /dev/null
+++ b/data/pixmaps/feta/8/scripts-arpeggio.xpm
@@ -0,0 +1,27 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"8 13 8 1",
+" c Gray2",
+". c #343434",
+"X c Gray33",
+"o c #777777",
+"O c #8d8d8d",
+"+ c Gray66",
+"@ c #cbcbcb",
+"# c None",
+/* pixels */
+"########",
+"##+@####",
+"##O +###",
+"###O O##",
+"###@ .#",
+"###O O",
+"##O .#",
+"#+ .##",
+"#o ###",
+"##. X###",
+"###X ###",
+"####o ##",
+"#####O##"
+};
diff --git a/data/pixmaps/feta/8/scripts-coda.xpm b/data/pixmaps/feta/8/scripts-coda.xpm
new file mode 100644
index 0000000..8315c0d
--- /dev/null
+++ b/data/pixmaps/feta/8/scripts-coda.xpm
@@ -0,0 +1,37 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"18 24 7 1",
+" c #0b0b0b",
+". c Gray15",
+"X c #484848",
+"o c #797979",
+"O c Gray57",
+"+ c #bcbcbc",
+"@ c None",
+/* pixels */
+"@@@@@@@@@@@@@@@@@@",
+"@@@@@@@@@O@@@@@@@@",
+"@@@@@@@@@ @@@@@@@@",
+"@@@@@@@@@.@@@@@@@@",
+"@@@@@@@@@ @@@@@@@@",
+"@@@@@@@o o@@@@@@",
+"@@@@@@X O.O X@@@@@",
+"@@@@@+ O@ @O +@@@@",
+"@@@@@X @@ @+ .@@@@",
+"@@@@@ @@.@@ @@@@",
+"@@@@o @@ @@ O@@@",
+"@@@@o ++.@@ o@@@",
+"@O . . O",
+"@@@@o @@ @+ o@@@",
+"@@@@o @@ @@ O@@@",
+"@@@@@ @@ @@ @@@@",
+"@@@@@X @@.@@ .@@@@",
+"@@@@@+ O@ @O +@@@@",
+"@@@@@@X O.O X@@@@@",
+"@@@@@@@o o@@@@@@",
+"@@@@@@@@@ +@@@@@@@",
+"@@@@@@@@@.@@@@@@@@",
+"@@@@@@@@@ @@@@@@@@",
+"@@@@@@@@@O@@@@@@@@"
+};
diff --git a/data/pixmaps/feta/8/scripts-dfermata.xpm b/data/pixmaps/feta/8/scripts-dfermata.xpm
new file mode 100644
index 0000000..50ca260
--- /dev/null
+++ b/data/pixmaps/feta/8/scripts-dfermata.xpm
@@ -0,0 +1,27 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"22 13 8 1",
+" c #040404",
+". c Gray18",
+"X c #535353",
+"o c #777777",
+"O c Gray56",
+"+ c #afafaf",
+"@ c Gray84",
+"# c None",
+/* pixels */
+"######################",
+"#++#######+o+#######++",
+"#oX######+ +######Xo",
+"## ######O O######.#",
+"##XO#####@ @#####OX#",
+"##O.######@+@######.O#",
+"###.o#############o.##",
+"###+ o###########o +##",
+"####. .+#######+. .###",
+"#####. .o+O+o. .####",
+"######. .#####",
+"#######O O######",
+"#########+oOo+########"
+};
diff --git a/data/pixmaps/feta/8/scripts-dmarcato.xpm b/data/pixmaps/feta/8/scripts-dmarcato.xpm
new file mode 100644
index 0000000..c121e0d
--- /dev/null
+++ b/data/pixmaps/feta/8/scripts-dmarcato.xpm
@@ -0,0 +1,24 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"10 10 8 1",
+" c #020202",
+". c #373737",
+"X c Gray30",
+"o c Gray43",
+"O c Gray59",
+"+ c #b2b2b2",
+"@ c #d0d0d0",
+"# c None",
+/* pixels */
+"##########",
+"#+oo+###@@",
+"#@ ###.+",
+"##X +#OX#",
+"##@ .#.@#",
+"###o o.##",
+"###+ O##",
+"####. .###",
+"####+ +###",
+"#####+####"
+};
diff --git a/data/pixmaps/feta/8/scripts-downbow.xpm b/data/pixmaps/feta/8/scripts-downbow.xpm
new file mode 100644
index 0000000..9019b44
--- /dev/null
+++ b/data/pixmaps/feta/8/scripts-downbow.xpm
@@ -0,0 +1,25 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"13 12 7 1",
+" c #040404",
+". c #272727",
+"X c #747474",
+"o c #898989",
+"O c #b9b9b9",
+"+ c Gray77",
+"@ c None",
+/* pixels */
+"@@@@@@@@@@@@@",
+"@+XooooooooX+",
+"@o o",
+"@o o",
+"@o o",
+"@X.oXooXXXo.X",
+"@XX@@@@@@@@XX",
+"@XX@@@@@@@@XX",
+"@XX@@@@@@@@XX",
+"@XX@@@@@@@@XX",
+"@XX@@@@@@@@XX",
+"@OO@@@@@@@@OO"
+};
diff --git a/data/pixmaps/feta/8/scripts-downmordent.xpm b/data/pixmaps/feta/8/scripts-downmordent.xpm
new file mode 100644
index 0000000..735f48d
--- /dev/null
+++ b/data/pixmaps/feta/8/scripts-downmordent.xpm
@@ -0,0 +1,27 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"28 13 8 1",
+" c #070707",
+". c Gray16",
+"X c Gray31",
+"o c #6c6c6c",
+"O c Gray57",
+"+ c #acacac",
+"@ c #d0d0d0",
+"# c None",
+/* pixels */
+"############################",
+"###++#######################",
+"##+ @#######################",
+"##..###@######@###OX#@######",
+"#+ O##@ +####+ @##OX+ @#####",
+"#O O##. +##@ +#+ .@####",
+"#+ O#o +#X @+ @#oO",
+"## .+ . o .o .o @",
+"##@ +@. o@ o+ O#",
+"###OO##@ .##+ X#+ o##",
+"########@. @###@ .oX##+ .@##",
+"#########@o#####+++.###++###",
+"##################@+########"
+};
diff --git a/data/pixmaps/feta/8/scripts-downprall.xpm b/data/pixmaps/feta/8/scripts-downprall.xpm
new file mode 100644
index 0000000..cf627c9
--- /dev/null
+++ b/data/pixmaps/feta/8/scripts-downprall.xpm
@@ -0,0 +1,26 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"28 12 8 1",
+" c #070707",
+". c Gray17",
+"X c Gray30",
+"o c Gray42",
+"O c Gray57",
+"+ c #aeaeae",
+"@ c Gray81",
+"# c None",
+/* pixels */
+"############################",
+"###++#######################",
+"##+ @#######################",
+"##..###@######@######@######",
+"#+ O##+ +####+ @####O @#####",
+"#O O##. +##@ @##@ .@####",
+"#O O#o +#X +#. @#oO",
+"## .+ . o .o .o @",
+"##@ +@. o@ O+ O#",
+"###OO##@ .##@ X##+ o##",
+"########@. @###@ @###+ .###",
+"#########@O#####@O#####++###"
+};
diff --git a/data/pixmaps/feta/8/scripts-dpedalheel.xpm b/data/pixmaps/feta/8/scripts-dpedalheel.xpm
new file mode 100644
index 0000000..8c95c34
--- /dev/null
+++ b/data/pixmaps/feta/8/scripts-dpedalheel.xpm
@@ -0,0 +1,24 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"10 11 7 1",
+" c #060606",
+". c #343434",
+"X c Gray44",
+"o c #848484",
+"O c #b1b1b1",
+"+ c #c0c0c0",
+"@ c None",
+/* pixels */
+"@@@@@@@@@@",
+"@@@@XXo@@@",
+"@@O .X. O@",
+"@@ O@@@O @",
+"@X.@@@@@.o",
+"@XX@@@@@XX",
+"@XX@@@@@XX",
+"@XX@@@@@XX",
+"@XX@@@@@XX",
+"@XX@@@@@XX",
+"@+O@@@@@O+"
+};
diff --git a/data/pixmaps/feta/8/scripts-dpedaltoe.xpm b/data/pixmaps/feta/8/scripts-dpedaltoe.xpm
new file mode 100644
index 0000000..3e9d9f5
--- /dev/null
+++ b/data/pixmaps/feta/8/scripts-dpedaltoe.xpm
@@ -0,0 +1,27 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"10 13 8 1",
+" c #131313",
+". c #2d2d2d",
+"X c Gray31",
+"o c #6f6f6f",
+"O c #8d8d8d",
+"+ c Gray70",
+"@ c #d5d5d5",
+"# c None",
+/* pixels */
+"##########",
+"#++#####++",
+"#O #####.o",
+"## @###@ #",
+"##.o###o.#",
+"##O.###.O#",
+"##@ @#@ ##",
+"###Xo#oX##",
+"###O # O##",
+"#### O ###",
+"####o o###",
+"####+ +###",
+"#####O####"
+};
diff --git a/data/pixmaps/feta/8/scripts-dstaccatissimo.xpm b/data/pixmaps/feta/8/scripts-dstaccatissimo.xpm
new file mode 100644
index 0000000..67f3fd8
--- /dev/null
+++ b/data/pixmaps/feta/8/scripts-dstaccatissimo.xpm
@@ -0,0 +1,22 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"5 10 6 1",
+" c #020202",
+". c #393939",
+"X c #686868",
+"o c #8b8b8b",
+"O c #bbbbbb",
+"+ c None",
+/* pixels */
+"+++++",
+"++OO+",
+"++XX+",
+"++..+",
+"++ +",
+"++ +",
+"+O O",
+"+o o",
+"+o o",
+"++oo+"
+};
diff --git a/data/pixmaps/feta/8/scripts-flageolet.xpm b/data/pixmaps/feta/8/scripts-flageolet.xpm
new file mode 100644
index 0000000..b7a6601
--- /dev/null
+++ b/data/pixmaps/feta/8/scripts-flageolet.xpm
@@ -0,0 +1,20 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"10 10 4 1",
+" c Gray57",
+". c Gray73",
+"X c Gray86",
+"o c None",
+/* pixels */
+"oooooooooo",
+"oooX Xoo",
+"oo. XXX .o",
+"oX ooooo X",
+"o XoooooX ",
+"o XoooooX ",
+"o XoooooX ",
+"oX ooooo X",
+"oo. XXX .o",
+"oooX Xoo"
+};
diff --git a/data/pixmaps/feta/8/scripts-lcomma.xpm b/data/pixmaps/feta/8/scripts-lcomma.xpm
new file mode 100644
index 0000000..bc0659a
--- /dev/null
+++ b/data/pixmaps/feta/8/scripts-lcomma.xpm
@@ -0,0 +1,25 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"5 11 8 1",
+" c #040404",
+". c Gray18",
+"X c #414141",
+"o c #797979",
+"O c #929292",
+"+ c Gray67",
+"@ c #cdcdcd",
+"# c None",
+/* pixels */
+"#####",
+"###@+",
+"###.O",
+"##+.#",
+"##Xo#",
+"#@ +#",
+"#o @#",
+"#o @#",
+"#o .#",
+"#@ @",
+"##++#"
+};
diff --git a/data/pixmaps/feta/8/scripts-lineprall.xpm b/data/pixmaps/feta/8/scripts-lineprall.xpm
new file mode 100644
index 0000000..e586ad6
--- /dev/null
+++ b/data/pixmaps/feta/8/scripts-lineprall.xpm
@@ -0,0 +1,35 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"26 21 8 1",
+" c Gray2",
+". c #282828",
+"X c Gray31",
+"o c Gray45",
+"O c #8d8d8d",
+"+ c #b1b1b1",
+"@ c #cecece",
+"# c None",
+/* pixels */
+"##########################",
+"#++#######################",
+"#oo#######################",
+"#oo#######################",
+"#oo#######################",
+"#oo#######################",
+"#oo#######################",
+"#oo#######################",
+"#oo#######################",
+"#oo#######################",
+"#oo#######################",
+"#oo#######################",
+"#oo##+######@#####@@######",
+"#oo#+ O####+ +####O @#####",
+"#oo# O##@ +##+ +###@",
+"#ooo O#. +#. @#Xo",
+"#o... X.. X.. .X.@",
+"#O +#. o@ O@ +#",
+"#++###. .##@. X##+ o##",
+"######@. @###@ @###+ .###",
+"#######@O#####@+#####++###"
+};
diff --git a/data/pixmaps/feta/8/scripts-mordent.xpm b/data/pixmaps/feta/8/scripts-mordent.xpm
new file mode 100644
index 0000000..c03e615
--- /dev/null
+++ b/data/pixmaps/feta/8/scripts-mordent.xpm
@@ -0,0 +1,26 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"19 12 8 1",
+" c #040404",
+". c Gray20",
+"X c #515151",
+"o c Gray45",
+"O c #868686",
+"+ c #b4b4b4",
+"@ c #cacaca",
+"# c None",
+/* pixels */
+"###################",
+"#########++########",
+"####++###Xo@+######",
+"####X +##ooX +#####",
+"###O +#O +###@",
+"##+ @O +#.o",
+"##.. .. ..#",
+"#o.#+ O@ +#",
+"#@###+ o#+ o##",
+"######+ Xoo##+ X###",
+"#######+@oo###++###",
+"#########@+########"
+};
diff --git a/data/pixmaps/feta/8/scripts-open.xpm b/data/pixmaps/feta/8/scripts-open.xpm
new file mode 100644
index 0000000..de6b192
--- /dev/null
+++ b/data/pixmaps/feta/8/scripts-open.xpm
@@ -0,0 +1,22 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"8 10 6 1",
+" c #020202",
+". c #323232",
+"X c Gray47",
+"o c #868686",
+"O c Gray73",
+"+ c None",
+/* pixels */
+"++++++++",
+"+++oXo++",
+"++..X..+",
+"+O +++ O",
+"+o +++ o",
+"+o +++ o",
+"+o +++ o",
+"+O +++ O",
+"++..X..+",
+"+++oXo++"
+};
diff --git a/data/pixmaps/feta/8/scripts-prall.xpm b/data/pixmaps/feta/8/scripts-prall.xpm
new file mode 100644
index 0000000..3148bed
--- /dev/null
+++ b/data/pixmaps/feta/8/scripts-prall.xpm
@@ -0,0 +1,24 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"19 10 8 1",
+" c #040404",
+". c Gray20",
+"X c #434343",
+"o c Gray",
+"O c Gray51",
+"+ c #b7b7b7",
+"@ c Gray77",
+"# c None",
+/* pixels */
+"###################",
+"####++#####++######",
+"####X +####X +#####",
+"###O +##O +###@",
+"##+ @@ +#.o",
+"##.. .. ..#",
+"#O.#+ @@ +#",
+"#@###+ O##+ O##",
+"######+ X####+ X###",
+"#######++#####++###"
+};
diff --git a/data/pixmaps/feta/8/scripts-pralldown.xpm b/data/pixmaps/feta/8/scripts-pralldown.xpm
new file mode 100644
index 0000000..84fbbdc
--- /dev/null
+++ b/data/pixmaps/feta/8/scripts-pralldown.xpm
@@ -0,0 +1,28 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"27 14 8 1",
+" c Gray2",
+". c #2d2d2d",
+"X c #4e4e4e",
+"o c #6c6c6c",
+"O c #909090",
+"+ c Gray68",
+"@ c #d3d3d3",
+"# c None",
+/* pixels */
+"###########################",
+"#######O@#####O@#####O#####",
+"######O X####o o####X O####",
+"#+@##O O##o +##X @###",
+"#O.#O @o @X .###",
+"##X. X.. X.. o.o##",
+"##@ .#+ X#+ X#@ @#",
+"###O .###o X###X o###..#",
+"####X.#####.X##### o####O +",
+"####@@#####@######@#####O O",
+"########################O +",
+"########################..#",
+"#######################@ +#",
+"#######################+O##"
+};
diff --git a/data/pixmaps/feta/8/scripts-prallmordent.xpm b/data/pixmaps/feta/8/scripts-prallmordent.xpm
new file mode 100644
index 0000000..897f318
--- /dev/null
+++ b/data/pixmaps/feta/8/scripts-prallmordent.xpm
@@ -0,0 +1,26 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"26 12 8 1",
+" c #040404",
+". c #323232",
+"X c #4c4c4c",
+"o c Gray45",
+"O c #848484",
+"+ c #b4b4b4",
+"@ c Gray78",
+"# c None",
+/* pixels */
+"##########################",
+"################++########",
+"####++#####++###oo@+######",
+"####X +####. +##ooo +#####",
+"###O +##O +#o +###@",
+"##+ @@ @O +#.o",
+"##.. .. .. ..#",
+"#o.#+ @@ O@ +#",
+"#@###+ O##+ o#+ o##",
+"######+ X####+ Xoo##+ X###",
+"#######++#####+@oo###++###",
+"################++########"
+};
diff --git a/data/pixmaps/feta/8/scripts-prallprall.xpm b/data/pixmaps/feta/8/scripts-prallprall.xpm
new file mode 100644
index 0000000..3919722
--- /dev/null
+++ b/data/pixmaps/feta/8/scripts-prallprall.xpm
@@ -0,0 +1,24 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"26 10 8 1",
+" c #040404",
+". c #323232",
+"X c #434343",
+"o c Gray",
+"O c #818181",
+"+ c #b6b6b6",
+"@ c Gray77",
+"# c None",
+/* pixels */
+"##########################",
+"####++#####++#####++######",
+"####X +####X +####X +#####",
+"###O +##O +##O +###@",
+"##+ @@ +@ +#.o",
+"##.. ... .. ..#",
+"#O.#+ @@ @+ +#",
+"#@###+ o##+ O##+ O##",
+"######+ X####+ X####+ X###",
+"#######++#####++#####++###"
+};
diff --git a/data/pixmaps/feta/8/scripts-prallup.xpm b/data/pixmaps/feta/8/scripts-prallup.xpm
new file mode 100644
index 0000000..9c6c9c5
--- /dev/null
+++ b/data/pixmaps/feta/8/scripts-prallup.xpm
@@ -0,0 +1,26 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"28 12 8 1",
+" c #070707",
+". c Gray17",
+"X c Gray30",
+"o c Gray42",
+"O c Gray57",
+"+ c #aeaeae",
+"@ c Gray81",
+"# c None",
+/* pixels */
+"############################",
+"########################++##",
+"########################@ +#",
+"##############@######@###..#",
+"######@ O####@ +####+ @##O +",
+"#####@ @##@ @##+ ##O O",
+"#oo#@ .#+ X#O o#O +",
+"#@.o. o o . +. #",
+"##O @O @o @+ @#",
+"###o +##X @##. .@##OO##",
+"####. +###@ @###@ .@#######",
+"####++#####+@#####O@########"
+};
diff --git a/data/pixmaps/feta/8/scripts-rcomma.xpm b/data/pixmaps/feta/8/scripts-rcomma.xpm
new file mode 100644
index 0000000..856ab34
--- /dev/null
+++ b/data/pixmaps/feta/8/scripts-rcomma.xpm
@@ -0,0 +1,25 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"5 11 8 1",
+" c #040404",
+". c Gray18",
+"X c #414141",
+"o c #797979",
+"O c #929292",
+"+ c Gray67",
+"@ c #cdcdcd",
+"# c None",
+/* pixels */
+"#####",
+"##++#",
+"#@ @",
+"##. o",
+"##+ o",
+"##@ o",
+"##@ @",
+"##oX#",
+"##.+#",
+"#O.##",
+"#+@##"
+};
diff --git a/data/pixmaps/feta/8/scripts-reverseturn.xpm b/data/pixmaps/feta/8/scripts-reverseturn.xpm
new file mode 100644
index 0000000..ac5fe49
--- /dev/null
+++ b/data/pixmaps/feta/8/scripts-reverseturn.xpm
@@ -0,0 +1,23 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"19 10 7 1",
+" c #060606",
+". c #373737",
+"X c #767676",
+"o c #8d8d8d",
+"O c #b6b6b6",
+"+ c #c1c1c1",
+"@ c None",
+/* pixels */
+"@@@@@@@@@@@@@@@@@@@",
+"@@@@oX+@@@@@@ooo@@@",
+"@@O @@@@X O@",
+"@@ . @@+. @",
+"@o.@OXO@O o@@O o",
+"@XX@@@@O O@@@@XX",
+"@o O@@X O@[email protected]",
+"@@ .+@@ . @",
+"@@O X@@@@ O@",
+"@@@@ooo@@@@@@Ooo@@@"
+};
diff --git a/data/pixmaps/feta/8/scripts-segno.xpm b/data/pixmaps/feta/8/scripts-segno.xpm
new file mode 100644
index 0000000..4274675
--- /dev/null
+++ b/data/pixmaps/feta/8/scripts-segno.xpm
@@ -0,0 +1,38 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"17 25 7 1",
+" c Gray2",
+". c Gray29",
+"X c #747474",
+"o c Gray52",
+"O c Gray71",
+"+ c #c8c8c8",
+"@ c None",
+/* pixels */
+"@@@@@@@@@@@@@@@@@",
+"@@@@OXX@@@@@@@+X+",
+"@@@. XX O@@@@@ @",
+"@@. O@@O O@@@o O@",
+"@+ @@@. .@@@ .@@",
+"@o @@o @@. O@@",
+"@o O@X @O .@@@",
+"@o .@@. .@. @@@@",
+"@@ O@@@@O o@@@@",
+"@@X O@@@ @@@@@",
+"@@@. X@X O@OO@@",
+"@@@@. . .@@. @@",
+"@@@@@X .@@OO@@",
+"@@@OO@@. X@@@@",
+"@@@ .@@. . .@@@",
+"@@@OO@O o@X .@@",
+"@@@@@@ @@@O X@",
+"@@@@@o O@@@@O @",
+"@@@@@ .@. .@@. o",
+"@@@@. O@ o@O o",
+"@@@O .@@ o@@ o",
+"@@@. @@@. .@@@ +",
+"@@O X@@@O O@@O .@",
+"@@ @@@@@O .X .@@",
+"@+X+@@@@@@@XXO@@@"
+};
diff --git a/data/pixmaps/feta/8/scripts-sforzato.xpm b/data/pixmaps/feta/8/scripts-sforzato.xpm
new file mode 100644
index 0000000..0d44253
--- /dev/null
+++ b/data/pixmaps/feta/8/scripts-sforzato.xpm
@@ -0,0 +1,24 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"16 10 8 1",
+" c #101010",
+". c #2f2f2f",
+"X c #565656",
+"o c #6f6f6f",
+"O c Gray55",
+"+ c Gray70",
+"@ c Gray79",
+"# c None",
+/* pixels */
+"################",
+"#+o#############",
+"#+. Xo#########",
+"####+o. X+#####",
+"########+XX XO+#",
+"###########@@ O",
+"########+XX XO+#",
+"####+o. X+#####",
+"#@. Xo#########",
+"#+o#############"
+};
diff --git a/data/pixmaps/feta/8/scripts-staccato.xpm b/data/pixmaps/feta/8/scripts-staccato.xpm
new file mode 100644
index 0000000..03b9db6
--- /dev/null
+++ b/data/pixmaps/feta/8/scripts-staccato.xpm
@@ -0,0 +1,14 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"4 4 4 1",
+" c Gray0",
+". c #8b8b8b",
+"X c #cacaca",
+"o c None",
+/* pixels */
+"oooo",
+"oo.X",
+"o. .",
+"oo.X"
+};
diff --git a/data/pixmaps/feta/8/scripts-stopped.xpm b/data/pixmaps/feta/8/scripts-stopped.xpm
new file mode 100644
index 0000000..2669d33
--- /dev/null
+++ b/data/pixmaps/feta/8/scripts-stopped.xpm
@@ -0,0 +1,23 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"10 10 7 1",
+" c Gray0",
+". c #3c3c3c",
+"X c #797979",
+"o c #898989",
+"O c Gray72",
+"+ c #c3c3c3",
+"@ c None",
+/* pixels */
+"@@@@@@@@@@",
+"@@@@@OO@@@",
+"@@@@@ X@@@",
+"@@@@@ o@@@",
+"@@XXX .oXO",
+"@+ o",
+"@@@@@ X@@@",
+"@@@@@ X@@@",
+"@@@@@ X@@@",
+"@@@@@OO@@@"
+};
diff --git a/data/pixmaps/feta/8/scripts-tenuto.xpm b/data/pixmaps/feta/8/scripts-tenuto.xpm
new file mode 100644
index 0000000..a0cb960
--- /dev/null
+++ b/data/pixmaps/feta/8/scripts-tenuto.xpm
@@ -0,0 +1,12 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"11 3 3 1",
+" c Gray44",
+". c #bebebe",
+"X c None",
+/* pixels */
+"XXXXXXXXXXX",
+"X. .",
+"X. ."
+};
diff --git a/data/pixmaps/feta/8/scripts-thumb.xpm b/data/pixmaps/feta/8/scripts-thumb.xpm
new file mode 100644
index 0000000..46f2739
--- /dev/null
+++ b/data/pixmaps/feta/8/scripts-thumb.xpm
@@ -0,0 +1,25 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"8 13 6 1",
+" c Gray0",
+". c #464646",
+"X c Gray48",
+"o c Gray55",
+"O c Gray76",
+"+ c None",
+/* pixels */
+"++++++++",
+"+++oXo++",
+"++. . .+",
+"+O X+X O",
+"+o o+X o",
+"+o X+o o",
+"+o X+o o",
+"+O X+X O",
+"++. X .+",
+"+++. .++",
+"+++o o++",
+"+++o o++",
+"++++o+++"
+};
diff --git a/data/pixmaps/feta/8/scripts-trilelement.xpm b/data/pixmaps/feta/8/scripts-trilelement.xpm
new file mode 100644
index 0000000..f791330
--- /dev/null
+++ b/data/pixmaps/feta/8/scripts-trilelement.xpm
@@ -0,0 +1,24 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"12 10 8 1",
+" c #040404",
+". c Gray20",
+"X c #434343",
+"o c Gray",
+"O c Gray51",
+"+ c #b7b7b7",
+"@ c #c8c8c8",
+"# c None",
+/* pixels */
+"############",
+"####++######",
+"####X +#####",
+"###O +###@",
+"##+ +#.O",
+"##.. ..#",
+"#o.#+ +#",
+"#@###+ O##",
+"######+ X###",
+"#######++###"
+};
diff --git a/data/pixmaps/feta/8/scripts-trill-element.xpm b/data/pixmaps/feta/8/scripts-trill-element.xpm
new file mode 100644
index 0000000..4aa8055
--- /dev/null
+++ b/data/pixmaps/feta/8/scripts-trill-element.xpm
@@ -0,0 +1,22 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"13 8 8 1",
+" c #040404",
+". c #2f2f2f",
+"X c Gray32",
+"o c #6f6f6f",
+"O c #8e8e8e",
+"+ c #a9a9a9",
+"@ c #cecece",
+"# c None",
+/* pixels */
+"#############",
+"#####O#######",
+"####. .######",
+"###O .@## O",
+"##O .X o#",
+"#@ O@O o##",
+"#+O###O .###",
+"#######+o####"
+};
diff --git a/data/pixmaps/feta/8/scripts-trill.xpm b/data/pixmaps/feta/8/scripts-trill.xpm
new file mode 100644
index 0000000..ef33ed7
--- /dev/null
+++ b/data/pixmaps/feta/8/scripts-trill.xpm
@@ -0,0 +1,34 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"25 20 8 1",
+" c #060606",
+". c #3c3c3c",
+"X c #494949",
+"o c #797979",
+"O c Gray54",
+"+ c #b4b4b4",
+"@ c Gray84",
+"# c None",
+/* pixels */
+"#########################",
+"###########++############",
+"#########+ O############",
+"#########O +############",
+"#########X #############",
+"######### #############",
+"######### o#############",
+"########O o###@######@##",
+"####@@##o +#@X O@o X#",
+"##@OOOO@X @OO@#+ oX O",
+"##O@##@O O@#### o#o O",
+"#++####@ .#####+ +#+ X#",
+"#O@#@@OX X+####o ######",
+"#@OOOO#O O@+###X ######",
+"##@@###X @#O@## o######",
+"####### ##O@#+ O######",
+"####### ##o##O @######",
+"#######X X.+##O #######",
+"#######+ +### X#######",
+"########+o#####@#########"
+};
diff --git a/data/pixmaps/feta/8/scripts-turn.xpm b/data/pixmaps/feta/8/scripts-turn.xpm
new file mode 100644
index 0000000..62e3c4f
--- /dev/null
+++ b/data/pixmaps/feta/8/scripts-turn.xpm
@@ -0,0 +1,23 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"19 10 7 1",
+" c #060606",
+". c #373737",
+"X c #767676",
+"o c #8d8d8d",
+"O c #b6b6b6",
+"+ c #c1c1c1",
+"@ c None",
+/* pixels */
+"@@@@@@@@@@@@@@@@@@@",
+"@@@@ooo@@@@@@+oo@@@",
+"@@O X@@@@ O@",
+"@@ .+@@ . @",
+"@o O@@X O@[email protected]",
+"@XX@@@@O O@@@@XX",
+"@o.@OXO@O X@@O o",
+"@@ . @@O. @",
+"@@O @@@@X O@",
+"@@@@oXO@@@@@@ooo@@@"
+};
diff --git a/data/pixmaps/feta/8/scripts-ufermata.xpm b/data/pixmaps/feta/8/scripts-ufermata.xpm
new file mode 100644
index 0000000..6a56490
--- /dev/null
+++ b/data/pixmaps/feta/8/scripts-ufermata.xpm
@@ -0,0 +1,27 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"22 13 8 1",
+" c #040404",
+". c Gray18",
+"X c #535353",
+"o c #777777",
+"O c Gray56",
+"+ c #afafaf",
+"@ c Gray84",
+"# c None",
+/* pixels */
+"######################",
+"#########+oOo+########",
+"#######O O######",
+"######. .#####",
+"####@. .o+O+o. .@###",
+"####. .+#######+. .###",
+"###+ O###########O O##",
+"###.o#############o.##",
+"##O.######@+@######.O#",
+"##XO#####@ .@#####OX#",
+"##.@#####o o###### #",
+"#oX######+ +######XO",
+"#++#######+o+#######++"
+};
diff --git a/data/pixmaps/feta/8/scripts-umarcato.xpm b/data/pixmaps/feta/8/scripts-umarcato.xpm
new file mode 100644
index 0000000..9a5fa02
--- /dev/null
+++ b/data/pixmaps/feta/8/scripts-umarcato.xpm
@@ -0,0 +1,24 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"10 10 8 1",
+" c #020202",
+". c #373737",
+"X c Gray30",
+"o c Gray43",
+"O c Gray59",
+"+ c #b2b2b2",
+"@ c #d0d0d0",
+"# c None",
+/* pixels */
+"##########",
+"#####+####",
+"####+ +###",
+"####. .###",
+"###O O##",
+"###Xo o##",
+"##@.#. @#",
+"##XO#O X#",
+"#@.### +",
+"#@+###+oo@"
+};
diff --git a/data/pixmaps/feta/8/scripts-upbow.xpm b/data/pixmaps/feta/8/scripts-upbow.xpm
new file mode 100644
index 0000000..b474161
--- /dev/null
+++ b/data/pixmaps/feta/8/scripts-upbow.xpm
@@ -0,0 +1,32 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"12 18 8 1",
+" c Gray7",
+". c #313131",
+"X c Gray27",
+"o c #717171",
+"O c #8d8d8d",
+"+ c #b6b6b6",
+"@ c Gray84",
+"# c None",
+/* pixels */
+"############",
+"#++#######++",
+"#O.#######.O",
+"## @###### @",
+"##.o#####+ #",
+"##oo#####oo#",
+"##+ ##### +#",
+"### +###+ ##",
+"###oo###oX##",
+"###+ ###.o##",
+"#### @#@ @##",
+"####.o#o.###",
+"####O.#.o###",
+"####@ @ @###",
+"#####X..####",
+"#####o O####",
+"#####+ +####",
+"######O#####"
+};
diff --git a/data/pixmaps/feta/8/scripts-upedalheel.xpm b/data/pixmaps/feta/8/scripts-upedalheel.xpm
new file mode 100644
index 0000000..a0fa1cc
--- /dev/null
+++ b/data/pixmaps/feta/8/scripts-upedalheel.xpm
@@ -0,0 +1,24 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"10 11 7 1",
+" c #060606",
+". c #343434",
+"X c Gray44",
+"o c #848484",
+"O c #b1b1b1",
+"+ c #c0c0c0",
+"@ c None",
+/* pixels */
+"@@@@@@@@@@",
+"@+O@@@@@OO",
+"@XX@@@@@XX",
+"@XX@@@@@XX",
+"@XX@@@@@XX",
+"@XX@@@@@XX",
+"@XX@@@@@XX",
+"@o.@@@@@.o",
+"@@ O@@@O @",
+"@@O .X. O@",
+"@@@@oXX@@@"
+};
diff --git a/data/pixmaps/feta/8/scripts-upedaltoe.xpm b/data/pixmaps/feta/8/scripts-upedaltoe.xpm
new file mode 100644
index 0000000..c90d34c
--- /dev/null
+++ b/data/pixmaps/feta/8/scripts-upedaltoe.xpm
@@ -0,0 +1,27 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"10 13 8 1",
+" c #131313",
+". c #2d2d2d",
+"X c Gray31",
+"o c #6f6f6f",
+"O c #8d8d8d",
+"+ c Gray70",
+"@ c #d5d5d5",
+"# c None",
+/* pixels */
+"##########",
+"#####O####",
+"####+ +###",
+"####o o###",
+"#### O ###",
+"###O # O##",
+"###Xo#oX##",
+"### @#@ ##",
+"##O.###.O#",
+"##.o###o.#",
+"## @###@ #",
+"#O.#####.O",
+"#++#####++"
+};
diff --git a/data/pixmaps/feta/8/scripts-upmordent.xpm b/data/pixmaps/feta/8/scripts-upmordent.xpm
new file mode 100644
index 0000000..2ac635a
--- /dev/null
+++ b/data/pixmaps/feta/8/scripts-upmordent.xpm
@@ -0,0 +1,29 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"27 15 8 1",
+" c Gray2",
+". c #2d2d2d",
+"X c #4b4b4b",
+"o c #6d6d6d",
+"O c #8d8d8d",
+"+ c #aaaaaa",
+"@ c #d5d5d5",
+"# c None",
+/* pixels */
+"###########################",
+"#################@+########",
+"#####@o#####@o###OX@O######",
+"#####O X####o o##+Xo O#####",
+"####@ X##+ o#+ O##@+",
+"####. X@ o+ O#.O",
+"###o.o ..X ..X X#",
+"##@ @#o +#X X#. .@#",
+"##..###o X###X X#@. O##",
+"#+ O####o #####XX+X###.X###",
+"#O O#####@#####@#OX###@@###",
+"#+ O##############@########",
+"##..#######################",
+"##+ @######################",
+"###++######################"
+};
diff --git a/data/pixmaps/feta/8/scripts-upprall.xpm b/data/pixmaps/feta/8/scripts-upprall.xpm
new file mode 100644
index 0000000..3c94881
--- /dev/null
+++ b/data/pixmaps/feta/8/scripts-upprall.xpm
@@ -0,0 +1,28 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"27 14 8 1",
+" c Gray2",
+". c #2d2d2d",
+"X c #4e4e4e",
+"o c #6c6c6c",
+"O c #909090",
+"+ c Gray68",
+"@ c #d3d3d3",
+"# c None",
+/* pixels */
+"###########################",
+"######O#####@O#####@O######",
+"#####O X####o o####X O#####",
+"####@ X##+ o##O O##@+",
+"####. X@ o@ O#.O",
+"###O.o ..X ..X X#",
+"##@ @#o +#X +#. .@#",
+"## .###o X###X o###. O##",
+"#O O####X #####X.#####.X###",
+"#O O#####@######@######@###",
+"#+ O#######################",
+"##..#######################",
+"##+ @######################",
+"###++######################"
+};
diff --git a/data/pixmaps/feta/8/scripts-ustaccatissimo.xpm b/data/pixmaps/feta/8/scripts-ustaccatissimo.xpm
new file mode 100644
index 0000000..ce3790b
--- /dev/null
+++ b/data/pixmaps/feta/8/scripts-ustaccatissimo.xpm
@@ -0,0 +1,22 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"5 10 6 1",
+" c #020202",
+". c #393939",
+"X c #686868",
+"o c #8b8b8b",
+"O c #bbbbbb",
+"+ c None",
+/* pixels */
+"+++++",
+"++oo+",
+"+o o",
+"+o o",
+"+O O",
+"++ +",
+"++ +",
+"++..+",
+"++XX+",
+"++OO+"
+};
diff --git a/data/pixmaps/feta/8/unknown.xpm b/data/pixmaps/feta/8/unknown.xpm
new file mode 100644
index 0000000..8698b03
--- /dev/null
+++ b/data/pixmaps/feta/8/unknown.xpm
@@ -0,0 +1,16 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"6 8 2 1",
+"x c Gray0",
+" c None",
+/* pixels */
+" xxx ",
+" x ",
+" x ",
+" xx ",
+" x ",
+" ",
+" x ",
+" "
+};
diff --git a/data/pixmaps/feta/README b/data/pixmaps/feta/README
new file mode 100644
index 0000000..d853aee
--- /dev/null
+++ b/data/pixmaps/feta/README
@@ -0,0 +1,10 @@
+
+The pixmaps in the feta/* directories have been generated from the
+METAFONT outline font supplied with the GNU Lilypond musical notation
+typesetting system. Lilypond and the feta font are copyright 1997 to
+2001 by Han-Wen Nienhuys and Jan Nieuwenhuizen and are distributed
+under the terms of the GNU General Public Licence, a copy of which may
+be found in the top-level directory of this distribution.
+
+See http://www.lilypond.org/ for more information about Lilypond.
+
diff --git a/data/pixmaps/icons/cc-hi16-rosegarden.xpm b/data/pixmaps/icons/cc-hi16-rosegarden.xpm
new file mode 100644
index 0000000..76f5dc3
--- /dev/null
+++ b/data/pixmaps/icons/cc-hi16-rosegarden.xpm
@@ -0,0 +1,39 @@
+/* XPM */
+static char *rose-icon-tiny[] = {
+/* width height num_colors chars_per_pixel */
+" 16 16 16 1",
+/* colors */
+". c None",
+"# c #f9ca30",
+"a c #ebb400",
+"b c #b78c00",
+"c c #d0a832",
+"d c #deaa00",
+"e c #d09f00",
+"f c #f9bf00",
+"g c #947400",
+"h c #715f24",
+"i c #715500",
+"j c #000000",
+"k c #4d3a00",
+"l c #324f00",
+"m c #181300",
+"n c #487100",
+/* pixels */
+"......c#c.......",
+"......#b........",
+".c#.cacbdccccc..",
+"..#ee#bgcdccc...",
+"..faccacbcbcac..",
+".#bcddafbehefd#.",
+"..c#cfccdfgdcc..",
+"...#acedcfcbcg..",
+"..#bf#bcdcdgh...",
+"..cceeggcdhhccjh",
+"....cgcbbd.c.kjh",
+"....hjcce#...jjh",
+"....g.gckj..ljjh",
+"......h.jjk.gjj.",
+"......h.mjj..j..",
+"......lhmhiklh.."
+};
diff --git a/data/pixmaps/icons/cc-hi32-rosegarden.xpm b/data/pixmaps/icons/cc-hi32-rosegarden.xpm
new file mode 100644
index 0000000..ba972f3
--- /dev/null
+++ b/data/pixmaps/icons/cc-hi32-rosegarden.xpm
@@ -0,0 +1,54 @@
+/* XPM */
+static char * test_4_xpm[] = {
+/* width height num_colors chars_per_pixel */
+"32 32 16 1",
+/* colors */
+" c None",
+". c #f9ca30",
+"X c #ebb400",
+"o c #b78c00",
+"O c #d0a832",
+"+ c #deaa00",
+"@ c #d09f00",
+"# c #f9bf00",
+"$ c #947400",
+"% c #715f24",
+"& c #715500",
+"* c black",
+"= c #4d3a00",
+"- c #324f00",
+"; c #181300",
+": c #487100",
+/* pixels */
+" ",
+" .X. ",
+" ..oO ",
+" ...#oOXOO$OOOOO#O@. ",
+" ##[email protected]@$oO+OOOOO ",
+" ##XO+OO+oOOOoOO#OO ",
+" #.Xo.OX#O@$O$oO+OO ",
+" .%#O+O+X##$O@%o##XO. ",
+" #X+O#OOOO+X&$#OOO ",
+" ..XO#+O.@X#o#XOOO ",
+" .XXO@O@O#XOX$O% ",
+" ..$###@oOXO#+$%%O ",
+" ..Oo.#.o%oO.O@O&& ",
+" #O@@@+%$Oo+%$%O $** ",
+" .OOO@=&oOO. +O *** ",
+" &%XO#OoX %*** ",
+" **OOO@+. **** ",
+" O% %OO%** -**** ",
+" O *%%**& %**** ",
+" O* **** *** ",
+" * =***% ** ",
+" * %***= % ",
+" &***%OO%***; ",
+" $**** %*****O ",
+" %***% %%***** ",
+" % ;*=; %;=% ",
+" % :%*% ",
+" % % **** ",
+" % **** ",
+" % % ****= ",
+" "};
diff --git a/data/pixmaps/icons/cc-hi48-rosegarden.xpm b/data/pixmaps/icons/cc-hi48-rosegarden.xpm
new file mode 100644
index 0000000..3f93590
--- /dev/null
+++ b/data/pixmaps/icons/cc-hi48-rosegarden.xpm
@@ -0,0 +1,307 @@
+/* XPM */
+static char * hi48_rosegarden_xpm[] = {
+"48 48 256 2",
+" c None",
+". c #020202",
+"+ c #121205",
+"@ c #3E460E",
+"# c #466602",
+"$ c #AA8602",
+"% c #D6A602",
+"& c #FAC206",
+"* c #EEB602",
+"= c #BE9202",
+"- c #826202",
+"; c #D2A616",
+"> c #262206",
+", c #5C4602",
+"' c #EABA1A",
+") c #927204",
+"! c #E6B616",
+"~ c #B4922E",
+"{ c #6A5206",
+"] c #D2A622",
+"^ c #322602",
+"/ c #0E0E02",
+"( c #CE9E07",
+"_ c #FAC20B",
+": c #E2AE02",
+"< c #A2862A",
+"[ c #4E6E06",
+"} c #565E0E",
+"| c #8A7220",
+"1 c #DEB222",
+"2 c #CA9E02",
+"3 c #F6C21A",
+"4 c #3C3202",
+"5 c #62521E",
+"6 c #DAAE16",
+"7 c #7A6202",
+"8 c #EEBE22",
+"9 c #C29A23",
+"0 c #221E0A",
+"a c #B6921A",
+"b c #0A0A02",
+"c c #463606",
+"d c #6A5622",
+"e c #927622",
+"f c #9A7A04",
+"g c #D2AA2A",
+"h c #F2C222",
+"i c #FABE02",
+"j c #7E661A",
+"k c #E6B622",
+"l c #D2AA2E",
+"m c #FACA2A",
+"n c #5E4A06",
+"o c #1E1605",
+"p c #B28A06",
+"q c #EAB605",
+"r c #EEBE16",
+"s c #6A621E",
+"t c #524206",
+"u c #BA921A",
+"v c #C29A06",
+"w c #CEA21B",
+"x c #967A26",
+"y c #F2BE06",
+"z c #AE8E1A",
+"A c #765E1A",
+"B c #C69E22",
+"C c #826602",
+"D c #E6AE02",
+"E c #DEAE17",
+"F c #322E0E",
+"G c #D6AA22",
+"H c #1E2A02",
+"I c #DAA606",
+"J c #AE8E2A",
+"K c #C69E16",
+"L c #56461A",
+"M c #0A0602",
+"N c #EEC22C",
+"O c #A68206",
+"P c #A2822A",
+"Q c #D6AA1A",
+"R c #BE9617",
+"S c #9E7602",
+"T c #D6AE22",
+"U c #EEB60A",
+"V c #AA8616",
+"W c #EABA22",
+"X c #7A6212",
+"Y c #886E18",
+"Z c #403616",
+"` c #D0A214",
+" . c #7A5E06",
+".. c #2E2A0E",
+"+. c #060202",
+"@. c #CEA62A",
+"#. c #B28E16",
+"$. c #1A1202",
+"%. c #D6A206",
+"&. c #8A6A0A",
+"*. c #4E420E",
+"=. c #C69A19",
+"-. c #3E5206",
+";. c #9E7A16",
+">. c #DAB22A",
+",. c #7A6216",
+"'. c #DEB21D",
+"). c #CAA231",
+"!. c #322A11",
+"~. c #C69602",
+"{. c #9A7A1A",
+"]. c #5E4E12",
+"^. c #463A16",
+"/. c #F6C62A",
+"(. c #121A02",
+"_. c #D2A202",
+":. c #C29602",
+"<. c #E6B20E",
+"[. c #C29E31",
+"}. c #8A7212",
+"|. c #423A02",
+"1. c #D6AE32",
+"2. c #DAAA0C",
+"3. c #725E1E",
+"4. c #3A3212",
+"5. c #664E02",
+"6. c #F2C62A",
+"7. c #826A1E",
+"8. c #A6862B",
+"9. c #CEA630",
+"0. c #5A4E1E",
+"a. c #B68E07",
+"b. c #060602",
+"c. c #FAC622",
+"d. c #F2BA08",
+"e. c #EAB60E",
+"f. c #E2AE06",
+"g. c #E6BA31",
+"h. c #4E421A",
+"i. c #CEA226",
+"j. c #E2B20E",
+"k. c #C29A12",
+"l. c #BE960E",
+"m. c #AE8602",
+"n. c #DAAE27",
+"o. c #1E1A09",
+"p. c #D2A206",
+"q. c #2E260A",
+"r. c #A27E0C",
+"s. c #DAAA19",
+"t. c #A27E1C",
+"u. c #766224",
+"v. c #F2BA02",
+"w. c #725A06",
+"x. c #665E1E",
+"y. c #E2B62A",
+"z. c #EEBA0A",
+"A. c #E6B216",
+"B. c #D6AA26",
+"C. c #CAA21A",
+"D. c #D6A606",
+"E. c #9E7E26",
+"F. c #26220E",
+"G. c #6E5602",
+"H. c #826E26",
+"I. c #EAB205",
+"J. c #D2AA32",
+"K. c #D2A628",
+"L. c #C69A05",
+"M. c #FACA32",
+"N. c #4E3A02",
+"O. c #362E0E",
+"P. c #725E26",
+"Q. c #F2BE0E",
+"R. c #AA8A2E",
+"S. c #D6A618",
+"T. c #3A2A02",
+"U. c #524619",
+"V. c #CAA229",
+"W. c #CEA20E",
+"X. c #EEBE2E",
+"Y. c #A28211",
+"Z. c #CA9E1A",
+"`. c #0E0A02",
+" + c #E2B219",
+".+ c #D2A20B",
+"++ c #DEAE0B",
+"@+ c #161203",
+"#+ c #423202",
+"$+ c #927616",
+"%+ c #DAB231",
+"&+ c #F2C631",
+"*+ c #B6962C",
+"=+ c #FAC618",
+"-+ c #9E7E04",
+";+ c #E6B206",
+">+ c #DEAA05",
+",+ c #AA8607",
+"'+ c #D2A61C",
+")+ c #C69E1C",
+"!+ c #261E05",
+"~+ c #5E4E1D",
+"{+ c #463A0E",
+"]+ c #C29A1A",
+"^+ c #7E620E",
+"/+ c #120E06",
+"(+ c #7E660E",
+"_+ c #6A5A1F",
+":+ c #D6AA2A",
+"<+ c #E2AE16",
+"[+ c #E2AE0E",
+"}+ c #866E12",
+"|+ c #DAAE1C",
+"1+ c #EAB60A",
+"2+ c #AE860A",
+"3+ c #D6A60C",
+"4+ c #F6BE02",
+"5+ c #221A02",
+"6+ c #CA9A04",
+"7+ c #4A3A04",
+"8+ c #7A6626",
+"9+ c #B28E0E",
+"0+ c #BA9206",
+"a+ c #C29608",
+"b+ c #DEB232",
+"c+ c #E2B21E",
+"d+ c #CE9E0E",
+"e+ c #D6AE2A",
+"f+ c #7E6A26",
+"g+ c #E2B62F",
+"h+ c #EEBA0E",
+"i+ c #A6860E",
+"j+ c #2A2202",
+"k+ c #EAB61A",
+"l+ c #F2C22A",
+"m+ c #DEAA0A",
+"n+ c #CAA222",
+"o+ c #9E7E12",
+"p+ c #120E02",
+"q+ c #D6AA1E",
+"r+ c #D2A62E",
+"s+ c #C29616",
+"t+ c #DEAE22",
+"u+ c #F2BE17",
+"v+ c #AA862A",
+"w+ c #725605",
+"x+ c #BE9207",
+"y+ c #E6B61A",
+"z+ c #B28E22",
+"A+ c #C69A0A",
+"B+ c #E6B20A",
+"C+ c #261E0A",
+"D+ c #221A0A",
+"E+ c #2A220A",
+"F+ c #3A2E12",
+"G+ c #8A6E10",
+" ",
+" ",
+" M.u+z./. ",
+" M.m y+p.y.g. ",
+" h 6.&+s.x+V.G ",
+" J. q q ;+<+n.J.@..+I z./.g.J.J. M. ",
+" M.l+g.W * :..+<+I.f.S.9.9 a C.S. +g+1.9.J.1 Q.g.1 3+h ",
+" M.m m m 3 1+~.=.q+! |+9.K.#.;.=.9.9.g l J.9.c+U :+` 3+l+ ",
+" _ _ & ! l 9.w 3+h Q = ( p f a.)+K.I S.J.9.J.1.J.r+g ",
+" 4+4+i U E l ; 2.y.G K _.= O R B J.B.C.=.9.l l c+n.9.J. ",
+" i & 4+d.;+] S.++g l G ++_.x+@.).V.J.]+a.B 9.B.z. +9.J.J. ",
+" i 4+m u+: a+6 X.1.s.q v.E @.( a.O [.#.f a.=.g ++|+J.9.9. ",
+" '+l.h+k+2.( Q y.|+<+* i U E x+9+u w V G+m.d+<.I.[+|+J.b+ ",
+" M.~ | ;+k+G 2.s.g ++: q z.y B+,+u g .+O j O % i y z.<+g g.M. ",
+" v.v.D >+S.B.z. +B.:+:+:+V.` >+: O .) 2 d.n.n.:+9.1. ",
+" =+3 u+;+E :+d.I.S.l %+g+'+2.;+v.~.S = I * :+9.9.J.9. ",
+" m m /.q +n.h+B+I r+1 8 S.>+* v.I ~.* q 2.g ).[.9. ",
+" M./.z.I.[+T [email protected] 3+] <.v.v.6 @.q L.,+B R.7. ",
+" M.m T W.q v.* ! 2.( =.Z.'+|+ +<.* B+; :.r.Y P < P ",
+" M.m &+K $ I.& i & : L.m.u @.[+c+b+d.;+( ,+}+3._+E.J. ",
+" M.M.l+b+=.l.8 =+i c.2.p Y ;[email protected] %+S.( Z.{.w.G.^+ ",
+" M.6.y+'+K E ;+j.! 2.= f+}.m.B g Q S.l.Y.z $+A {.o+ 7+. . ",
+" i y+:+` ( ( ( %.6+j (+f 9 =.a+3+#.| ) G+e [.J. 7 F+. . . ",
+" l+N :+K.K.@.; = 5.n - p [email protected].%+g+ L.d+r+9. $.`.. . . ",
+" &+1.z P P l.p.;.r.p s+=.)+s.k 2.g < U.b . . . . ",
+" , , ].Y.<+:+c+h+G =.~.;+* ~+h./+. . . . ",
+" p+p+/+A g r+l B..+% 2.N /. /+`.. . . . . ",
+" _+!.p+d R.).r+).i+&.w+X j (.. . . . . . ",
+" r+8.u. f+< ~ ~ 8+4.. . p+ -.H . . . . . . ",
+" J.[. C+U.f+u.O.. . ^ w+ x.F . . . . . . ",
+" x p+C+5 Z o . . o T. C+. . . . . ",
+" 8.5+. b b.. . . b. . . . . . ",
+" b.. F+o . . . / 0. . . . . ",
+" . . ].^ . . . /+t ]. O.. . ",
+" . . 0.O.+ o.D+E+N.c 0.h. ",
+" , `.. +./ 4.d P J P u.4.+./+b +.@+ ",
+" - G.p+. . . o.^.8.9.~ 8+4.. . . . b M 0 J ",
+" - !+b.. . . . 3.Z `.. . . . . o | J ",
+" 5 q.. . . /+0. 3._+h.`.. . . . M o 0 ",
+" P.3.4.. M +./ t {+> 5 P.~++ C+q.p+$.> !.F+ ",
+" s P. @+`.`.|.F+> 5 !+^ t _+ ",
+" P.u. # } U.+ 4.P. ",
+" P.P. s [ @ q.b.o.!./+ ",
+" P.s 3. . . . . . . . ",
+" P.P. . . . . . . . ",
+" P.u. . . . . . . $. ",
+" P. P. . . . . . !+N. ",
+" "};
diff --git a/data/pixmaps/icons/cc-hi64-rosegarden.xpm b/data/pixmaps/icons/cc-hi64-rosegarden.xpm
new file mode 100644
index 0000000..3400776
--- /dev/null
+++ b/data/pixmaps/icons/cc-hi64-rosegarden.xpm
@@ -0,0 +1,100 @@
+/* XPM */
+static char * rose_64x64_xpm[] = {
+"64 64 33 1",
+" c None",
+". c #141500",
+"+ c #858E27",
+"@ c #C6A80E",
+"# c #304801",
+"$ c #FFD024",
+"% c #AE9925",
+"& c #5D5304",
+"* c #456000",
+"= c #262900",
+"- c #D0BE17",
+"; c #C69328",
+"> c #5D6202",
+", c #A97F11",
+"' c #978E03",
+") c #CF9700",
+"! c #464500",
+"~ c #BC9726",
+"{ c #E8B42C",
+"] c #E8B706",
+"^ c #D1A92B",
+"/ c #C59B00",
+"( c #BA9E2B",
+"_ c #9B842E",
+": c #323700",
+"< c #2F3000",
+"[ c #1F1F00",
+"} c #7B6000",
+"| c #EAB81E",
+"1 c #C37E07",
+"2 c #D0A805",
+"3 c #917800",
+"4 c #9A8214",
+" ",
+" ",
+" ",
+" $$$$ ",
+" $$$]|]]$$ ",
+" $$$$2((2|$|$ ",
+" $$$$$$$$2((((($$ ",
+" $$$$$$$]]2/~(~~~)) ",
+" $$$$$$$]2]22/@@@@2]||$ ",
+" 2]) ]]|$$$^2(^(@22222@2]$|$$$$$$$$ ",
+" $$$]{2@,/2{|$|](2(((({||^{(2@||$$$|||||$|^( ",
+" $$$$${((;((^|$^@(@@@(@^|2^^^^(((^^{^(^{|$]{^ ",
+" $$$$$${((;;(^$$]@(@@///(^22((^22(((((((^^((^^ ",
+" $$$$$${^((((^$$@/2@@21'%%(2(((^2(((((((^^(@^^ ",
+" $$$$${^(((@]$$@//222)~/_%~/((^2@((((((((((((( ",
+" $$$$$|{(((@2{(((/]]2/@/%~(@(((@2/((((((((^((( ",
+" $$$$$]{(((2]{(((^|$$//22(~2/((22((~@@((((^((( ",
+" $$$$$${(((2]^((22$$$$22@((@(~~/2/~3((^{^(((((~ ",
+" $$$$$${((2]](((|2|$$$222^|]2~;/2~_4(^^^((@(((^ ",
+" ]|$$$${((^|{((^{{{]$]||{{|2(,;)),4@^^^^^2]2{^|@ ",
+" ~{{$$$${(^^|((({{^^|$${{{{^2~;,;3,,@(2^2]$$${(^^ ",
+" %{{$$$$^(^(@(((]]^({$$${^((/;);~331/)/2$$$$${^{(( ",
+" %|$$$${(((((($$${(^]$$|^(~/;2@2,,,,,)$$$$$(((((( ",
+" $$$$$^((@(@{$$$|(({{|2(((@@222/3,,1$$$$2((;(--( ",
+" $$$$|^(((^{$$$@((^^^((((@@]$]%33,$$$$@(((((-- ",
+" $$$$${2^{|$$$@((^^((((((@$$$/'2$$$$|((((((@ ",
+" $$$$$$|^^|$$$@;((((^((((@$$$$$$$$$$((((((( ",
+" $$$$$$|22^|@/;(((((((((]$$$$$$$$$-(((~((; ",
+" $$$$$$@(((@(;~~((((@2]$$$$$$$$$-@(((,(( ",
+" $$$$$|@((^(1,/---]$$$$$$$$$$$@(((~%_(~ ",
+" $$$$$$2@@]]]2-$$$$$$$$$$|{{](((%%_%~(~ ",
+" 3]$$$$$$2@2$$$$$$$$$$$$$](^^/~((____~~ ",
+" 2)/3/$$$$$$2/)$$]22$$$]|^(^{({(__~~_4__(~ ",
+" $$$@(;~]$$$$$$@//2;(/((^(^(^(|{|@3+~%___%(% ",
+" $$$$^(()-$$$$$$22/~_,;(((({{{{{{|@~;;~__4%( ",
+" @]$${((/-$$$$$$$2/___;((((^^{{{^2)~~;%__'%% ",
+" {|$${(@@]$$$$$$$$~%__~((((^^^^2/~,(;%___%, ",
+" ]$$]^((22]$$$$$$|%___~(((((^^@44_~~___;% ",
+" ]$${^(/(//2$$$$24____~(((((@/43_~~~_%~~ ",
+" ]]{^(((((@2$$/4333____,(@@22@'%~~__%(~ ",
+" 2]2^^(((@@2]~433,43_4,)22@22@34444~(~ ",
+" @((((((---2~,'~/~//22@^]$] 4~ ",
+" (~~_;2@-{|22@@(((@(((|2 ",
+" ++&3)@({|{{{(((((;({| ",
+" >>>>@((((((((((((@2|2 ",
+" >>>>'@(((((((((~(@@) ",
+" &>>>* }%((((((((/@)' ",
+" &>> ,%((((((;, ",
+" &> ,_;@@@@4 ",
+" >3,/@%> ",
+" >>>! .=<=<=! ",
+" #>><[[<<<<<<<<<!<= ",
+" <>!<=!<<<<<<<<<<<<## ",
+" !>! =<<<<<<<<<<<<<<#= ",
+" <!< <<<<<<<<<<<<<<<<==[ ",
+" << <<<<<<<<<<<<<<<<<=!! ",
+" !< <<<<<<<<<<<<<<<<<<= ",
+" >! <<<<<<<<<<<<<<<<<= ",
+" !>&! <<<<<<<<<<<<<<<<<. ",
+" &&&:= <<<<<<<<<<<<<<<<< ",
+" >&&#<< <<<<<<<<<<<<<<<< ",
+" !>>#<<< <<<<<<<=<<<<<< ",
+" &><< ",
+" <<< "};
diff --git a/data/pixmaps/icons/mm-mime-hi16-rosegarden.png b/data/pixmaps/icons/mm-mime-hi16-rosegarden.png
new file mode 100644
index 0000000..0d4cf3c
--- /dev/null
+++ b/data/pixmaps/icons/mm-mime-hi16-rosegarden.png
Binary files differ
diff --git a/data/pixmaps/icons/mm-mime-hi16-rosegarden.xpm b/data/pixmaps/icons/mm-mime-hi16-rosegarden.xpm
new file mode 100644
index 0000000..f66faf3
--- /dev/null
+++ b/data/pixmaps/icons/mm-mime-hi16-rosegarden.xpm
@@ -0,0 +1,176 @@
+/* XPM */
+static char * x_mini_rosegarden_4_xpm[] = {
+"16 16 157 2",
+" c None",
+". c #BAAF8F",
+"+ c #BEB9B3",
+"@ c #AEAAA4",
+"# c #9E9B95",
+"$ c #8F8C88",
+"% c #787774",
+"& c #6D6D6D",
+"* c #D5A91C",
+"= c #D2AB31",
+"- c #E4CC83",
+"; c #E8D69F",
+"> c #EDEAE1",
+", c #EFEFEF",
+"' c #BCBCBC",
+") c #8F8F8F",
+"! c #2F2F2F",
+"~ c #EEBA11",
+"{ c #DBAC16",
+"] c #D2A515",
+"^ c #C09714",
+"/ c #BD961E",
+"( c #D0A621",
+"_ c #CFC39F",
+": c #DCDCDC",
+"< c #D4D4D4",
+"[ c #C7C7C7",
+"} c #ADADAD",
+"| c #303030",
+"1 c #E0AF11",
+"2 c #D3A616",
+"3 c #C79C15",
+"4 c #B78E07",
+"5 c #C69D1A",
+"6 c #ACA078",
+"7 c #B5B5B5",
+"8 c #C5C5C5",
+"9 c #8E8E8E",
+"0 c #C6C6C6",
+"a c #5F5F5F",
+"b c #DAAB11",
+"c c #C69A0C",
+"d c #BD9517",
+"e c #BC930F",
+"f c #947B2D",
+"g c #7E7C72",
+"h c #9C9C9C",
+"i c #B2B1B0",
+"j c #9A9995",
+"k c #85827E",
+"l c #676563",
+"m c #AD891A",
+"n c #A48111",
+"o c #B18B13",
+"p c #A48D42",
+"q c #867F4A",
+"r c #575E43",
+"s c #828282",
+"t c #838383",
+"u c #E9E8E7",
+"v c #DAD8D5",
+"w c #BCB8AF",
+"x c #6A665F",
+"y c #695D23",
+"z c #7B871D",
+"A c #5F673D",
+"B c #62704D",
+"C c #33362F",
+"D c #585858",
+"E c #636362",
+"F c #BDBAB8",
+"G c #BFBCB8",
+"H c #CCC6BD",
+"I c #787369",
+"J c #464D19",
+"K c #5D6B2E",
+"L c #5D6B29",
+"M c #666E4D",
+"N c #46483F",
+"O c #5F5E5D",
+"P c #464545",
+"Q c #B0ADA8",
+"R c #A29F9B",
+"S c #CCC4B8",
+"T c #80786B",
+"U c #50591E",
+"V c #627336",
+"W c #829247",
+"X c #44531E",
+"Y c #546320",
+"Z c #666460",
+"` c #8B8884",
+" . c #AAA59D",
+".. c #A6A29B",
+"+. c #D0C5B3",
+"@. c #83796A",
+"#. c #495A17",
+"$. c #9AA088",
+"%. c #657549",
+"&. c #56612D",
+"*. c #6F715D",
+"=. c #605E5A",
+"-. c #98938A",
+";. c #DDD1BF",
+">. c #ECDCC5",
+",. c #E7D8BE",
+"'. c #867A68",
+"). c #5B7116",
+"!. c #5B662E",
+"~. c #4B4F3A",
+"{. c #566521",
+"]. c #53534A",
+"^. c #484644",
+"/. c #78746E",
+"(. c #837C73",
+"_. c #B4AA9A",
+":. c #DCCBB0",
+"<. c #887B66",
+"[. c #8B9760",
+"}. c #787D5D",
+"|. c #4F5F19",
+"1. c #535740",
+"2. c #484744",
+"3. c #9F9689",
+"4. c #706961",
+"5. c #A89E90",
+"6. c #D5C3A6",
+"7. c #887962",
+"8. c #B0AFAD",
+"9. c #8D8983",
+"0. c #697635",
+"a. c #4D5629",
+"b. c #53504A",
+"c. c #9B9488",
+"d. c #6A6661",
+"e. c #B2A695",
+"f. c #D8C19F",
+"g. c #88775D",
+"h. c #D6CCC1",
+"i. c #D4C5B1",
+"j. c #BEB29A",
+"k. c #68742F",
+"l. c #7C785A",
+"m. c #978C7C",
+"n. c #9B8F7E",
+"o. c #E2C8A2",
+"p. c #E2C7A0",
+"q. c #877559",
+"r. c #837767",
+"s. c #897D6C",
+"t. c #817667",
+"u. c #706D4D",
+"v. c #5C5541",
+"w. c #645A4A",
+"x. c #7D6E59",
+"y. c #86765C",
+"z. c #5B4F3D",
+" . + @ # $ % & ",
+" * = - ; > , ' ) ! ",
+" ~ { ] ^ / ( _ : < [ } | ",
+" 1 2 3 4 5 6 7 8 9 0 9 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 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.f.g. ",
+" h.i.j.k.l.m.n.o.p.q. ",
+" r.s.t.u.v.w.x.y.q.z. ",
+" "};
diff --git a/data/pixmaps/icons/mm-mime-hi32-rosegarden.png b/data/pixmaps/icons/mm-mime-hi32-rosegarden.png
new file mode 100644
index 0000000..642392d
--- /dev/null
+++ b/data/pixmaps/icons/mm-mime-hi32-rosegarden.png
Binary files differ
diff --git a/data/pixmaps/icons/mm-mime-hi32-rosegarden.xpm b/data/pixmaps/icons/mm-mime-hi32-rosegarden.xpm
new file mode 100644
index 0000000..785fbbe
--- /dev/null
+++ b/data/pixmaps/icons/mm-mime-hi32-rosegarden.xpm
@@ -0,0 +1,3727 @@
+/* XPM */
+static char * mm_mime_hi32_rosegarden_xpm[] = {
+"128 128 3596 2",
+" c None",
+". c #6C6547",
+"+ c #6C6647",
+"@ c #6C6648",
+"# c #6D6748",
+"$ c #6D6749",
+"% c #6B6648",
+"& c #6B6448",
+"* c #6A6447",
+"= c #6A6345",
+"- c #696346",
+"; c #696146",
+"> c #686144",
+", c #676144",
+"' c #676143",
+") c #676044",
+"! c #665F44",
+"~ c #656043",
+"{ c #655F43",
+"] c #645E43",
+"^ c #645E42",
+"/ c #655E43",
+"( c #655E42",
+"_ c #655F42",
+": c #656044",
+"< c #665F43",
+"[ c #666044",
+"} c #686145",
+"| c #686245",
+"1 c #696245",
+"2 c #696246",
+"3 c #6D684F",
+"4 c #34322E",
+"5 c #4A4839",
+"6 c #6F694B",
+"7 c #6E6749",
+"8 c #6D6648",
+"9 c #6C6548",
+"0 c #6B6548",
+"a c #6B6447",
+"b c #6A6346",
+"c c #696345",
+"d c #675F44",
+"e c #676145",
+"f c #666144",
+"g c #645F42",
+"h c #645D43",
+"i c #646043",
+"j c #666043",
+"k c #686246",
+"l c #21211E",
+"m c #43413D",
+"n c #63625D",
+"o c #767571",
+"p c #666462",
+"q c #3C3C38",
+"r c #1C1915",
+"s c #F8F5ED",
+"t c #F7F5EC",
+"u c #F8F4ED",
+"v c #F7F4EB",
+"w c #F7F3EB",
+"x c #F6F3EB",
+"y c #EFECE3",
+"z c #E0DDD2",
+"A c #77756D",
+"B c #3F3E3A",
+"C c #7D785A",
+"D c #000000",
+"E c #F8F4EC",
+"F c #F7F4EC",
+"G c #F6F4EB",
+"H c #F4F1E9",
+"I c #EDEAE1",
+"J c #D8D5CB",
+"K c #C7C3B6",
+"L c #A7A495",
+"M c #817F73",
+"N c #7E795F",
+"O c #F7F5ED",
+"P c #F6F3EA",
+"Q c #F5F2EA",
+"R c #F1EEE5",
+"S c #E4E1D8",
+"T c #CFCCBF",
+"U c #C2BEB1",
+"V c #B2AE9F",
+"W c #9D9A8A",
+"X c #79735B",
+"Y c #EFEBE0",
+"Z c #F5F3EA",
+"` c #F5F2E9",
+" . c #F0EDE4",
+".. c #E3E0D6",
+"+. c #D1CDC0",
+"@. c #C8C4B7",
+"#. c #B1AD9E",
+"$. c #9E9B8B",
+"%. c #767157",
+"&. c #E6E2D3",
+"*. c #EEEBE0",
+"=. c #9D6241",
+"-. c #F6F2EA",
+";. c #F6F2E9",
+">. c #F5F1E9",
+",. c #F4F1E8",
+"'. c #F0ECE3",
+"). c #E4E1D7",
+"!. c #D5D2C6",
+"~. c #ADA999",
+"{. c #918E80",
+"]. c #514C3B",
+"^. c #DCD7C6",
+"/. c #E5E1D3",
+"(. c #954A22",
+"_. c #D57E2A",
+":. c #BC6925",
+"<. c #AE5425",
+"[. c #BB531E",
+"}. c #AC5428",
+"|. c #BA5A29",
+"1. c #DE6A20",
+"2. c #E57120",
+"3. c #E57024",
+"4. c #DC6925",
+"5. c #C9642E",
+"6. c #C26330",
+"7. c #151807",
+"8. c #4D4E4D",
+"9. c #242724",
+"0. c #848484",
+"a. c #585849",
+"b. c #737364",
+"c. c #727162",
+"d. c #54513E",
+"e. c #BFBBA6",
+"f. c #D8D4C2",
+"g. c #E5E2D3",
+"h. c #B96223",
+"i. c #DD7C1F",
+"j. c #D27A21",
+"k. c #B56A2A",
+"l. c #D97222",
+"m. c #DA651A",
+"n. c #E67921",
+"o. c #E97C1A",
+"p. c #EC7117",
+"q. c #EB7214",
+"r. c #E66717",
+"s. c #E7691A",
+"t. c #E9701D",
+"u. c #E37323",
+"v. c #C86729",
+"w. c #6E6648",
+"x. c #F5F1E8",
+"y. c #F4F1E7",
+"z. c #F0EDE3",
+"A. c #E7E4D9",
+"B. c #D9D6C9",
+"C. c #D1CDBF",
+"D. c #BEBBAD",
+"E. c #A7A497",
+"F. c #686658",
+"G. c #D3CEB9",
+"H. c #DCD8C6",
+"I. c #CF711E",
+"J. c #E08018",
+"K. c #E3891D",
+"L. c #E68622",
+"M. c #E9791D",
+"N. c #EA7518",
+"O. c #ED7D12",
+"P. c #EC790F",
+"Q. c #E96F0E",
+"R. c #E66C0B",
+"S. c #E2620D",
+"T. c #E36612",
+"U. c #E56916",
+"V. c #EA741F",
+"W. c #E67626",
+"X. c #CC6C2E",
+"Y. c #A3562C",
+"Z. c #E4E0D5",
+"`. c #D9D5CA",
+" + c #CFCBBF",
+".+ c #CAC6B9",
+"++ c #C1BDAF",
+"@+ c #AEAB9D",
+"#+ c #6A675D",
+"$+ c #EFECE0",
+"%+ c #924C24",
+"&+ c #DB761F",
+"*+ c #E68416",
+"=+ c #E68014",
+"-+ c #ED811E",
+";+ c #EF7A17",
+">+ c #EE730F",
+",+ c #EA6E0B",
+"'+ c #E76909",
+")+ c #E46408",
+"!+ c #E16106",
+"~+ c #E26D10",
+"{+ c #E5761B",
+"]+ c #E46B18",
+"^+ c #E97A24",
+"/+ c #EC8026",
+"(+ c #E78328",
+"_+ c #BC6929",
+":+ c #6C6649",
+"<+ c #F7F4ED",
+"[+ c #F4F0E7",
+"}+ c #F3F0E7",
+"|+ c #F3F0E6",
+"1+ c #ECE8DE",
+"2+ c #DEDBD1",
+"3+ c #D1CDC1",
+"4+ c #CCC8BB",
+"5+ c #ADA99C",
+"6+ c #5D5B52",
+"7+ c #E6E1D3",
+"8+ c #EEEADF",
+"9+ c #B96222",
+"0+ c #E07D1D",
+"a+ c #EA8314",
+"b+ c #EA7A11",
+"c+ c #F08215",
+"d+ c #EE700B",
+"e+ c #EB6608",
+"f+ c #E45905",
+"g+ c #E15606",
+"h+ c #E45C07",
+"i+ c #E05905",
+"j+ c #EC9322",
+"k+ c #F4B546",
+"l+ c #F7C35B",
+"m+ c #F3AE4B",
+"n+ c #F09832",
+"o+ c #E79029",
+"p+ c #BC7126",
+"q+ c #6D6649",
+"r+ c #F8F5EC",
+"s+ c #F3EFE6",
+"t+ c #F3EFE5",
+"u+ c #EFEBE1",
+"v+ c #E6E2D7",
+"w+ c #D8D4C9",
+"x+ c #C9C5B8",
+"y+ c #B8B4A7",
+"z+ c #6B695E",
+"A+ c #C86A21",
+"B+ c #E8861B",
+"C+ c #EC760F",
+"D+ c #EE6B0A",
+"E+ c #EE6608",
+"F+ c #EB5F05",
+"G+ c #E75503",
+"H+ c #E55203",
+"I+ c #E85F07",
+"J+ c #ED6709",
+"K+ c #EC6F0E",
+"L+ c #F7B934",
+"M+ c #FCDC55",
+"N+ c #FBD95B",
+"O+ c #F9C84F",
+"P+ c #F6B13B",
+"Q+ c #ED9D30",
+"R+ c #B36D2B",
+"S+ c #1A1C0C",
+"T+ c #1F2211",
+"U+ c #303322",
+"V+ c #727264",
+"W+ c #908E80",
+"X+ c #979587",
+"Y+ c #767467",
+"Z+ c #CDC9B4",
+"`+ c #D1CCB7",
+" @ c #D3CEBA",
+".@ c #EEECE0",
+"+@ c #C6681F",
+"@@ c #EF8717",
+"#@ c #ED5E07",
+"$@ c #ED4E03",
+"%@ c #EC5102",
+"&@ c #E74C02",
+"*@ c #E44502",
+"=@ c #EB5A08",
+"-@ c #F16B08",
+";@ c #EF6406",
+">@ c #F3941C",
+",@ c #FACD3B",
+"'@ c #FBDA49",
+")@ c #FBCC42",
+"!@ c #F8BA35",
+"~@ c #F6B12D",
+"{@ c #F1A52A",
+"]@ c #D5872A",
+"^@ c #BE7332",
+"/@ c #CA792B",
+"(@ c #C87B28",
+"_@ c #A85F2E",
+":@ c #F4F2E9",
+"<@ c #F5F2E8",
+"[@ c #F3F0E5",
+"}@ c #F2EFE5",
+"|@ c #F2EFE4",
+"1@ c #EFECE1",
+"2@ c #D4D1C6",
+"3@ c #C4C1B6",
+"4@ c #D0CDC1",
+"5@ c #CCC9BC",
+"6@ c #C2BEB0",
+"7@ c #9B4E1E",
+"8@ c #D5761C",
+"9@ c #EF730F",
+"0@ c #ED4F03",
+"a@ c #EC4201",
+"b@ c #E83C00",
+"c@ c #E53C01",
+"d@ c #E74404",
+"e@ c #F2640C",
+"f@ c #EE5A04",
+"g@ c #E95305",
+"h@ c #F8BC27",
+"i@ c #FBD93F",
+"j@ c #FBD53D",
+"k@ c #F9C232",
+"l@ c #F8B229",
+"m@ c #F6AA23",
+"n@ c #F6A522",
+"o@ c #F59F21",
+"p@ c #F39621",
+"q@ c #EA8B23",
+"r@ c #EC8922",
+"s@ c #EB7F20",
+"t@ c #D66720",
+"u@ c #AC4A1E",
+"v@ c #F5F1E7",
+"w@ c #F3F1E7",
+"x@ c #F4F0E6",
+"y@ c #F2EEE5",
+"z@ c #F2EEE4",
+"A@ c #F1EEE4",
+"B@ c #E9E6DB",
+"C@ c #DCD8CC",
+"D@ c #D3D0C3",
+"E@ c #CBC7BA",
+"F@ c #B9B5A7",
+"G@ c #7C7A6E",
+"H@ c #A65623",
+"I@ c #EA8315",
+"J@ c #EF5506",
+"K@ c #EC4001",
+"L@ c #E93901",
+"M@ c #E83B02",
+"N@ c #E83803",
+"O@ c #ED4C06",
+"P@ c #ED4F06",
+"Q@ c #E84503",
+"R@ c #ED7311",
+"S@ c #FACC2F",
+"T@ c #FBDB3C",
+"U@ c #FACF37",
+"V@ c #F8BD29",
+"W@ c #F7B021",
+"X@ c #F7AA1D",
+"Y@ c #F6A41F",
+"Z@ c #F69F20",
+"`@ c #F5931C",
+" # c #F1861C",
+".# c #ED7B1A",
+"+# c #EA721A",
+"@# c #E3651A",
+"## c #C1501B",
+"$# c #F5F3E9",
+"%# c #F1EEE3",
+"&# c #F0EDE2",
+"*# c #EBE8DC",
+"=# c #DDD9CD",
+"-# c #D5D1C4",
+";# c #ADA99B",
+"># c #6A685D",
+",# c #B75B1A",
+"'# c #F06E0C",
+")# c #ED3D00",
+"!# c #E93200",
+"~# c #E83501",
+"{# c #E73401",
+"]# c #E73202",
+"^# c #EE4905",
+"/# c #E22F01",
+"(# c #E34205",
+"_# c #F29C1C",
+":# c #FBD331",
+"<# c #FAD635",
+"[# c #F9CA2D",
+"}# c #F8BE24",
+"|# c #F8B41F",
+"1# c #F7AD20",
+"2# c #F5A51F",
+"3# c #F59C1E",
+"4# c #F58F1B",
+"5# c #F4831B",
+"6# c #EE7717",
+"7# c #E86815",
+"8# c #E35D15",
+"9# c #CF4B15",
+"0# c #F4F0E8",
+"a# c #ECE8DD",
+"b# c #DDD9CC",
+"c# c #D5D1C3",
+"d# c #C0BCAE",
+"e# c #9D9A8C",
+"f# c #5C5A4F",
+"g# c #DDD7C6",
+"h# c #672F15",
+"i# c #CD5B12",
+"j# c #EC5006",
+"k# c #EA3000",
+"l# c #E72701",
+"m# c #E52700",
+"n# c #E32601",
+"o# c #E52F02",
+"p# c #E43504",
+"q# c #D71E00",
+"r# c #E55609",
+"s# c #FAC629",
+"t# c #FBDA34",
+"u# c #FAD12F",
+"v# c #F9C929",
+"w# c #F8C324",
+"x# c #F8BB23",
+"y# c #F6B01F",
+"z# c #F5A31D",
+"A# c #F5991D",
+"B# c #F58F1F",
+"C# c #F5871E",
+"D# c #F27A19",
+"E# c #E76013",
+"F# c #DF5010",
+"G# c #D24210",
+"H# c #9A3216",
+"I# c #A06D4B",
+"J# c #D29459",
+"K# c #6F684B",
+"L# c #171A09",
+"M# c #1A1D0C",
+"N# c #272A19",
+"O# c #393B2B",
+"P# c #989789",
+"Q# c #A8A798",
+"R# c #949284",
+"S# c #514F44",
+"T# c #DDD8C6",
+"U# c #F1EDE3",
+"V# c #E4DCCE",
+"W# c #8D431A",
+"X# c #E55D10",
+"Y# c #EB3501",
+"Z# c #E62001",
+"`# c #E41A01",
+" $ c #DE1500",
+".$ c #E22403",
+"+$ c #E43004",
+"@$ c #D62002",
+"#$ c #D72F03",
+"$$ c #ED8115",
+"%$ c #FACB2D",
+"&$ c #FBD632",
+"*$ c #FAD02A",
+"=$ c #F9CA27",
+"-$ c #F8C425",
+";$ c #F7BA25",
+">$ c #F6AE1A",
+",$ c #F5A21B",
+"'$ c #F4981E",
+")$ c #F48E1F",
+"!$ c #F4851E",
+"~$ c #F37F1D",
+"{$ c #E75D14",
+"]$ c #DC450E",
+"^$ c #D13B0E",
+"/$ c #A73E21",
+"($ c #905D3B",
+"_$ c #BF8747",
+":$ c #DFA151",
+"<$ c #F0AD56",
+"[$ c #EDA553",
+"}$ c #C3754B",
+"|$ c #6B6547",
+"1$ c #7A7459",
+"2$ c #F2EEE3",
+"3$ c #F2EDE4",
+"4$ c #F0ECE2",
+"5$ c #F0ECE1",
+"6$ c #EDEADE",
+"7$ c #E9E5D9",
+"8$ c #DFDCD0",
+"9$ c #D6D2C5",
+"0$ c #C5C1B4",
+"a$ c #545247",
+"b$ c #EDEBDF",
+"c$ c #CABB9A",
+"d$ c #AB9356",
+"e$ c #9D7020",
+"f$ c #B56112",
+"g$ c #E8570F",
+"h$ c #E82400",
+"i$ c #E21501",
+"j$ c #DD0F01",
+"k$ c #D50C02",
+"l$ c #E43306",
+"m$ c #DC2C04",
+"n$ c #C30D00",
+"o$ c #E24B04",
+"p$ c #F5A41B",
+"q$ c #FACC2C",
+"r$ c #FAD22C",
+"s$ c #FACF27",
+"t$ c #F9C825",
+"u$ c #F8BF23",
+"v$ c #F7B51F",
+"w$ c #F6AB1B",
+"x$ c #F5A21D",
+"y$ c #F49320",
+"z$ c #F3871C",
+"A$ c #F27B1A",
+"B$ c #F37819",
+"C$ c #E95813",
+"D$ c #D73A0B",
+"E$ c #C52D0D",
+"F$ c #944227",
+"G$ c #C48341",
+"H$ c #E8A246",
+"I$ c #F2AE48",
+"J$ c #F5B554",
+"K$ c #F2AB5A",
+"L$ c #CB8353",
+"M$ c #726D4F",
+"N$ c #F3EEE5",
+"O$ c #F1EDE2",
+"P$ c #E6E2D6",
+"Q$ c #DAD6C9",
+"R$ c #CCC9BB",
+"S$ c #BAB6A8",
+"T$ c #48473E",
+"U$ c #DBD7C5",
+"V$ c #E4E0D1",
+"W$ c #BCAD8C",
+"X$ c #8D7721",
+"Y$ c #857003",
+"Z$ c #8D5E06",
+"`$ c #D17B18",
+" % c #E74A0C",
+".% c #E21B00",
+"+% c #DB0E01",
+"@% c #D40A01",
+"#% c #D91E04",
+"$% c #E03405",
+"%% c #CD1F02",
+"&% c #C61D00",
+"*% c #EE6D08",
+"=% c #F9B91E",
+"-% c #FACF2D",
+";% c #FACE27",
+">% c #F9C723",
+",% c #F8BB1F",
+"'% c #F8B11D",
+")% c #F7AC1C",
+"!% c #F4941B",
+"~% c #F38116",
+"{% c #F27114",
+"]% c #F26916",
+"^% c #E95313",
+"/% c #D1330A",
+"(% c #C03312",
+"_% c #B35E2C",
+":% c #EE9941",
+"<% c #F5A246",
+"[% c #F9BE57",
+"}% c #F9C970",
+"|% c #E9924B",
+"1% c #AC623E",
+"2% c #EFEDE1",
+"3% c #EBE8DB",
+"4% c #DFDCCE",
+"5% c #D1CEC0",
+"6% c #C2BFB1",
+"7% c #9B988B",
+"8% c #2E2E28",
+"9% c #BCB38F",
+"0% c #88792C",
+"a% c #786E00",
+"b% c #837002",
+"c% c #935D10",
+"d% c #EF9625",
+"e% c #E63807",
+"f% c #D20801",
+"g% c #CF0D01",
+"h% c #E63706",
+"i% c #D22803",
+"j% c #C41801",
+"k% c #D93F02",
+"l% c #F38A10",
+"m% c #F8BF22",
+"n% c #FACF2A",
+"o% c #FAD02B",
+"p% c #FACD29",
+"q% c #FAC625",
+"r% c #F7B31C",
+"s% c #F7AC1B",
+"t% c #F6A01B",
+"u% c #F48911",
+"v% c #F37A12",
+"w% c #F2660E",
+"x% c #F2610F",
+"y% c #EB5010",
+"z% c #D3340A",
+"A% c #D54C19",
+"B% c #E57B31",
+"C% c #F9A141",
+"D% c #FCBC50",
+"E% c #FCCE64",
+"F% c #EDC16E",
+"G% c #BE7448",
+"H% c #F1EDE4",
+"I% c #F0EDE1",
+"J% c #EFEBDF",
+"K% c #C4C1B4",
+"L% c #DCDACE",
+"M% c #E5E1D6",
+"N% c #DAD7CA",
+"O% c #C4C0B2",
+"P% c #C3BFAF",
+"Q% c #706E65",
+"R% c #1D1C1B",
+"S% c #D2CDB8",
+"T% c #CFCAB6",
+"U% c #897D40",
+"V% c #706705",
+"W% c #6C6600",
+"X% c #88690C",
+"Y% c #C08220",
+"Z% c #EE8621",
+"`% c #E23508",
+" & c #D30901",
+".& c #CC0A02",
+"+& c #D91E03",
+"@& c #EB4206",
+"#& c #B81201",
+"$& c #CB1E00",
+"%& c #EA5F02",
+"&& c #F6A518",
+"*& c #FAC928",
+"=& c #FAD32F",
+"-& c #FACC2B",
+";& c #F9C524",
+">& c #F8BB1D",
+",& c #F8B218",
+"'& c #F7A619",
+")& c #F69417",
+"!& c #F47C0D",
+"~& c #F46C0E",
+"{& c #F25B0D",
+"]& c #F2570B",
+"^& c #F05611",
+"/& c #D3360E",
+"(& c #E7621E",
+"_& c #F89134",
+":& c #FDBA46",
+"<& c #FDCA50",
+"[& c #FBCC5E",
+"}& c #DBAB61",
+"|& c #A2714F",
+"1& c #161908",
+"2& c #1D200F",
+"3& c #242616",
+"4& c #373929",
+"5& c #494B3B",
+"6& c #A09F90",
+"7& c #A5A293",
+"8& c #B0AD9E",
+"9& c #353430",
+"0& c #201F1D",
+"a& c #1B1A18",
+"b& c #1B1A17",
+"c& c #1D1C18",
+"d& c #3B392C",
+"e& c #6D6850",
+"f& c #847E62",
+"g& c #837D60",
+"h& c #807B5E",
+"i& c #7F795C",
+"j& c #7D7659",
+"k& c #797255",
+"l& c #766E53",
+"m& c #736D4E",
+"n& c #635812",
+"o& c #686200",
+"p& c #574703",
+"q& c #AB7E19",
+"r& c #E4A828",
+"s& c #ED7A1D",
+"t& c #D82508",
+"u& c #CA0801",
+"v& c #D81E03",
+"w& c #E43405",
+"x& c #CC2803",
+"y& c #BA1501",
+"z& c #DE3D01",
+"A& c #F17D0A",
+"B& c #F8B822",
+"C& c #FAD639",
+"D& c #FAD33B",
+"E& c #FACE31",
+"F& c #F9C731",
+"G& c #F8BF2D",
+"H& c #F8B936",
+"I& c #F6B340",
+"J& c #F69C32",
+"K& c #F5953D",
+"L& c #F38E41",
+"M& c #F27934",
+"N& c #F38644",
+"O& c #EF894A",
+"P& c #E47241",
+"Q& c #EE914D",
+"R& c #F8B45D",
+"S& c #F9C866",
+"T& c #F8CD75",
+"U& c #F9C85D",
+"V& c #E4A753",
+"W& c #895B37",
+"X& c #F2EFE6",
+"Y& c #EEEBDF",
+"Z& c #EDE9DE",
+"`& c #EBE7DB",
+" * c #DFDBCE",
+".* c #CECABC",
+"+* c #BDBAAB",
+"@* c #BBB7A7",
+"#* c #B2AE9E",
+"$* c #AEAA9A",
+"%* c #A39F8F",
+"&* c #949183",
+"** c #898578",
+"=* c #848174",
+"-* c #838073",
+";* c #807D70",
+">* c #747266",
+",* c #69675D",
+"'* c #68665D",
+")* c #6A675E",
+"!* c #66635B",
+"~* c #656045",
+"{* c #675C21",
+"]* c #614C05",
+"^* c #704C11",
+"/* c #DDA626",
+"(* c #F3B029",
+"_* c #EC711B",
+":* c #C90A02",
+"<* c #CF1204",
+"[* c #EC430D",
+"}* c #D7300E",
+"|* c #BD3728",
+"1* c #D3431B",
+"2* c #EC7528",
+"3* c #F4AB3F",
+"4* c #F7C74A",
+"5* c #F8D45C",
+"6* c #F8D55D",
+"7* c #F8D45F",
+"8* c #F6D267",
+"9* c #F6D064",
+"0* c #F5D173",
+"a* c #F4CF75",
+"b* c #F5CF7D",
+"c* c #F4D380",
+"d* c #F4CC81",
+"e* c #F4CD8A",
+"f* c #F3CF8D",
+"g* c #F4C888",
+"h* c #F5CD8C",
+"i* c #F5D290",
+"j* c #F6CF8C",
+"k* c #F8D693",
+"l* c #F9DA94",
+"m* c #F9D27A",
+"n* c #F6B351",
+"o* c #EB7C2E",
+"p* c #BB4013",
+"q* c #692911",
+"r* c #F4F2E8",
+"s* c #F0EEE2",
+"t* c #EFECE2",
+"u* c #EDEBDE",
+"v* c #EEEADE",
+"w* c #EEE9DE",
+"x* c #D2CEC1",
+"y* c #C4C0B1",
+"z* c #B9B5A6",
+"A* c #ABA796",
+"B* c #B1AD9C",
+"C* c #B1AD9D",
+"D* c #B1AE9D",
+"E* c #B3AF9F",
+"F* c #B2AE9D",
+"G* c #B4B09F",
+"H* c #B9B5A5",
+"I* c #B8B4A4",
+"J* c #B6B2A2",
+"K* c #B7B3A4",
+"L* c #9D915E",
+"M* c #846922",
+"N* c #886530",
+"O* c #B8903F",
+"P* c #EEC14C",
+"Q* c #F4B74C",
+"R* c #EA833F",
+"S* c #DF6347",
+"T* c #E9794B",
+"U* c #F38849",
+"V* c #EC9C67",
+"W* c #DF9F72",
+"X* c #F4BE77",
+"Y* c #F5C674",
+"Z* c #F6D37B",
+"`* c #F6D781",
+" = c #F6D883",
+".= c #F5D47C",
+"+= c #F5D780",
+"@= c #F5D883",
+"#= c #F5D782",
+"$= c #F6DA89",
+"%= c #F5DB91",
+"&= c #F5DA90",
+"*= c #F7DD99",
+"== c #F7DD9D",
+"-= c #F8DD9C",
+";= c #F9DDA0",
+">= c #FADE99",
+",= c #FBDF9B",
+"'= c #FBE195",
+")= c #FBE08E",
+"!= c #FBD26B",
+"~= c #FABE55",
+"{= c #F37C2B",
+"]= c #EE4F10",
+"^= c #E0480C",
+"/= c #C54E18",
+"(= c #923D1F",
+"_= c #6B6446",
+":= c #EEEAE0",
+"<= c #ECE9DD",
+"[= c #EAE6DB",
+"}= c #E3DFD4",
+"|= c #D7D3C6",
+"1= c #C5C1B2",
+"2= c #BCB8A9",
+"3= c #BBB7A8",
+"4= c #BDB9A9",
+"5= c #C1BDAD",
+"6= c #C0BCAC",
+"7= c #BFBBAB",
+"8= c #BCB8A8",
+"9= c #C0BCAD",
+"0= c #B8B2A1",
+"a= c #B7AF9C",
+"b= c #C8B896",
+"c= c #BDA55F",
+"d= c #E3C37D",
+"e= c #DCBE85",
+"f= c #F4D98F",
+"g= c #F7D986",
+"h= c #F8D487",
+"i= c #F7D692",
+"j= c #F5CD8F",
+"k= c #F7D18E",
+"l= c #F7D68F",
+"m= c #F7D794",
+"n= c #F7DB96",
+"o= c #F7D98F",
+"p= c #F7D788",
+"q= c #F8DA8A",
+"r= c #F9DC8F",
+"s= c #F9DE95",
+"t= c #F9E095",
+"u= c #F9E093",
+"v= c #F8E195",
+"w= c #F8E193",
+"x= c #F9E18E",
+"y= c #FAE392",
+"z= c #FAE5A0",
+"A= c #FAE5A5",
+"B= c #FBE7A9",
+"C= c #FCE9AB",
+"D= c #FCE59F",
+"E= c #FCE18D",
+"F= c #FCD676",
+"G= c #FBCD5F",
+"H= c #FBCA59",
+"I= c #FBBB47",
+"J= c #F57F26",
+"K= c #EE3A03",
+"L= c #ED4002",
+"M= c #F15407",
+"N= c #F36A16",
+"O= c #BD5C2C",
+"P= c #6B6347",
+"Q= c #EDEADF",
+"R= c #EDEADD",
+"S= c #ECE9DC",
+"T= c #ECE8DC",
+"U= c #E5E2D5",
+"V= c #E1DED1",
+"W= c #DDDACD",
+"X= c #D4D1C3",
+"Y= c #CECBBC",
+"Z= c #CCC9B9",
+"`= c #CBC8B8",
+" - c #CBC7B7",
+".- c #CCC8B9",
+"+- c #CAC6B7",
+"@- c #C9C5B6",
+"#- c #CDC9BB",
+"$- c #CFCBBD",
+"%- c #D1CCBD",
+"&- c #CFB591",
+"*- c #E0BF7A",
+"=- c #EDCA75",
+"-- c #F8D97D",
+";- c #F8DA7B",
+">- c #FADE7C",
+",- c #FAE282",
+"'- c #FADF7F",
+")- c #FAE089",
+"!- c #FBE7A1",
+"~- c #FCE8A2",
+"{- c #FCE49B",
+"]- c #FCE59E",
+"^- c #FCE7A3",
+"/- c #FCE7A1",
+"(- c #FCE6A2",
+"_- c #FBE197",
+":- c #FBE096",
+"<- c #FCE39B",
+"[- c #FBE6A0",
+"}- c #FBE7A2",
+"|- c #FBE8A1",
+"1- c #FCEAA3",
+"2- c #FCE99F",
+"3- c #FCE99A",
+"4- c #FDECA3",
+"5- c #FDEDA9",
+"6- c #FDEAA7",
+"7- c #FDE99E",
+"8- c #FBE386",
+"9- c #FBD865",
+"0- c #FCD753",
+"a- c #FCD247",
+"b- c #FDCD46",
+"c- c #FAB03B",
+"d- c #F57A21",
+"e- c #F04606",
+"f- c #EE3B00",
+"g- c #F04C05",
+"h- c #EE6010",
+"i- c #D96423",
+"j- c #EDE9DD",
+"k- c #E9E6DA",
+"l- c #E7E4D7",
+"m- c #E2DED1",
+"n- c #DBD7CA",
+"o- c #D2CEC0",
+"p- c #D3CFC1",
+"q- c #D1CDBE",
+"r- c #CECABB",
+"s- c #C8C0AE",
+"t- c #DDA04F",
+"u- c #F7CF63",
+"v- c #FACF56",
+"w- c #F9CC4B",
+"x- c #F9CF4F",
+"y- c #F9D24E",
+"z- c #F9D74E",
+"A- c #FADA57",
+"B- c #FADB5B",
+"C- c #FADC5E",
+"D- c #FBDF6D",
+"E- c #FCDF74",
+"F- c #FBDD72",
+"G- c #FBE281",
+"H- c #FDE998",
+"I- c #FCE28D",
+"J- c #FCE28F",
+"K- c #FDE89B",
+"L- c #F6E497",
+"M- c #EBDA8F",
+"N- c #F8E8A1",
+"O- c #FBE895",
+"P- c #FDEB98",
+"Q- c #FCEC95",
+"R- c #FCE581",
+"S- c #FBE075",
+"T- c #FCD968",
+"U- c #FCD253",
+"V- c #FCC833",
+"W- c #FCD031",
+"X- c #FDDC36",
+"Y- c #FDE03D",
+"Z- c #FBC035",
+"`- c #F46A13",
+" ; c #F04204",
+".; c #F04803",
+"+; c #F05C11",
+"@; c #CE581C",
+"#; c #6A6347",
+"$; c #F8F4EB",
+"%; c #EFEADF",
+"&; c #EDE8DD",
+"*; c #ECE8DB",
+"=; c #EAE7DB",
+"-; c #EAE6DA",
+";; c #E1DDD1",
+">; c #D8D4C6",
+",; c #D7D3C5",
+"'; c #D5D0C2",
+"); c #D4CFC1",
+"!; c #CAC5B6",
+"~; c #BDA684",
+"{; c #D9A349",
+"]; c #FBD55B",
+"^; c #FBD44F",
+"/; c #FAD046",
+"(; c #FACE43",
+"_; c #F9CC42",
+":; c #F9CE3B",
+"<; c #FAD33E",
+"[; c #FAD642",
+"}; c #FAD840",
+"|; c #FAD741",
+"1; c #FAD43C",
+"2; c #FAD039",
+"3; c #F8CD3B",
+"4; c #F6C839",
+"5; c #F5C438",
+"6; c #F6C747",
+"7; c #F2CA52",
+"8; c #E2C04B",
+"9; c #BEAC42",
+"0; c #AC9837",
+"a; c #C8AB40",
+"b; c #F9DA56",
+"c; c #FBD753",
+"d; c #FCD349",
+"e; c #FBD041",
+"f; c #FBC734",
+"g; c #FBC22E",
+"h; c #FBBC25",
+"i; c #FBBB1C",
+"j; c #FCC41E",
+"k; c #FCCE23",
+"l; c #FCCF25",
+"m; c #F8A81D",
+"n; c #F26A0F",
+"o; c #F03800",
+"p; c #F03E02",
+"q; c #F2510A",
+"r; c #F66C19",
+"s; c #D25C22",
+"t; c #EBE7DA",
+"u; c #EAE7D9",
+"v; c #E9E6D9",
+"w; c #DEDACD",
+"x; c #DCD8CB",
+"y; c #DAD5C8",
+"z; c #D8D4C7",
+"A; c #D9D4C7",
+"B; c #D6D2C3",
+"C; c #D4D0C1",
+"D; c #C2BFB0",
+"E; c #8C7756",
+"F; c #CB9E3C",
+"G; c #F7D04C",
+"H; c #FBD74C",
+"I; c #FAD547",
+"J; c #FAD03F",
+"K; c #F9CC38",
+"L; c #F9CF32",
+"M; c #FAD437",
+"N; c #FAD438",
+"O; c #FAD436",
+"P; c #FAD536",
+"Q; c #FAD033",
+"R; c #F9C72E",
+"S; c #F6BF24",
+"T; c #F3B41E",
+"U; c #F2B41B",
+"V; c #EFB41B",
+"W; c #CBA10F",
+"X; c #A28A0B",
+"Y; c #8E7C06",
+"Z; c #9E860E",
+"`; c #CFAC25",
+" > c #F9CC2E",
+".> c #FBC52A",
+"+> c #FABF28",
+"@> c #FAB61E",
+"#> c #FAAE18",
+"$> c #FAA813",
+"%> c #FAA00D",
+"&> c #FAA60B",
+"*> c #FBAE0D",
+"=> c #FBBB18",
+"-> c #F79714",
+";> c #F37619",
+">> c #F35610",
+",> c #F55410",
+"'> c #F76718",
+")> c #F3731E",
+"!> c #DD6E24",
+"~> c #883B1B",
+"{> c #F4F1E6",
+"]> c #F0EBE1",
+"^> c #EAE6D9",
+"/> c #E5E1D4",
+"(> c #E1DDD0",
+"_> c #E0DCCF",
+":> c #DFDACD",
+"<> c #DED9CC",
+"[> c #DDD8CB",
+"}> c #DCD8CA",
+"|> c #DBD7C9",
+"1> c #D8D5C7",
+"2> c #BDB9AB",
+"3> c #5D543A",
+"4> c #B98B2D",
+"5> c #F7D44B",
+"6> c #FBDA4F",
+"7> c #FBD545",
+"8> c #FAD13E",
+"9> c #FAD13B",
+"0> c #FAD43A",
+"a> c #FBD737",
+"b> c #FBD738",
+"c> c #FBD537",
+"d> c #FBD133",
+"e> c #F9C62C",
+"f> c #F8BD26",
+"g> c #F6BA22",
+"h> c #F4B31F",
+"i> c #EFB41A",
+"j> c #CFA416",
+"k> c #8A7D02",
+"l> c #807200",
+"m> c #9D8408",
+"n> c #D8B324",
+"o> c #F3C62A",
+"p> c #FBBF22",
+"q> c #F8B11C",
+"r> c #F6A516",
+"s> c #F79B0E",
+"t> c #F89209",
+"u> c #F98F07",
+"v> c #FA8D08",
+"w> c #FB990F",
+"x> c #FBAF29",
+"y> c #FBBA3E",
+"z> c #FBBD55",
+"A> c #F99335",
+"B> c #FB8525",
+"C> c #FA8423",
+"D> c #FA8B21",
+"E> c #DE721F",
+"F> c #8E4616",
+"G> c #F6F3E9",
+"H> c #EDE9DC",
+"I> c #E9E5D8",
+"J> c #E8E4D7",
+"K> c #E6E2D4",
+"L> c #E4E0D2",
+"M> c #E4DFD2",
+"N> c #DCD9CB",
+"O> c #DAD7C9",
+"P> c #D6D4C6",
+"Q> c #B1AFA0",
+"R> c #6A6348",
+"S> c #9C7D2B",
+"T> c #F3CC41",
+"U> c #FBDB4C",
+"V> c #FAD748",
+"W> c #FAD743",
+"X> c #FBD840",
+"Y> c #FBD838",
+"Z> c #FCD738",
+"`> c #FCD336",
+" , c #F9C82E",
+"., c #F8C329",
+"+, c #F8C229",
+"@, c #EBB823",
+"#, c #C29C15",
+"$, c #937F08",
+"%, c #817503",
+"&, c #A18B0D",
+"*, c #D8B11F",
+"=, c #FDCF30",
+"-, c #FCCA28",
+";, c #FAB21B",
+">, c #F29A11",
+",, c #F4940C",
+"', c #F68807",
+"), c #F98507",
+"!, c #FA8010",
+"~, c #FB8419",
+"{, c #FD9C2C",
+"], c #FDB746",
+"^, c #FCB653",
+"/, c #FAA23F",
+"(, c #FCA42D",
+"_, c #FB9F21",
+":, c #FBA01F",
+"<, c #EF931E",
+"[, c #AC5616",
+"}, c #F7F3EC",
+"|, c #F2F0E6",
+"1, c #ECE7DC",
+"2, c #EAE7DA",
+"3, c #EAE5D9",
+"4, c #E8E5D8",
+"5, c #E8E5D7",
+"6, c #E7E3D5",
+"7, c #E5E0D3",
+"8, c #E0DCCE",
+"9, c #DFDBCD",
+"0, c #DDDACC",
+"a, c #D6D3C5",
+"b, c #C0BEB0",
+"c, c #65634E",
+"d, c #927629",
+"e, c #E7C037",
+"f, c #FBDB49",
+"g, c #FBDC4D",
+"h, c #FBDA46",
+"i, c #FCDA42",
+"j, c #FCDB43",
+"k, c #FCD83C",
+"l, c #FBD436",
+"m, c #FBCF32",
+"n, c #F9C729",
+"o, c #F9C828",
+"p, c #E8BF2C",
+"q, c #BA9D1B",
+"r, c #897A07",
+"s, c #887A09",
+"t, c #B79E14",
+"u, c #E1BE21",
+"v, c #F9CF2B",
+"w, c #FDCF2C",
+"x, c #FCC222",
+"y, c #F9AD19",
+"z, c #F69C12",
+"A, c #F68E0E",
+"B, c #F98013",
+"C, c #FC7C20",
+"D, c #FD8824",
+"E, c #FD8B24",
+"F, c #FD9F25",
+"G, c #FDB335",
+"H, c #FDB734",
+"I, c #FCB126",
+"J, c #FCB01F",
+"K, c #FBB11C",
+"L, c #F59E1C",
+"M, c #C9761A",
+"N, c #6A6246",
+"O, c #F1EFE5",
+"P, c #F0EEE3",
+"Q, c #EEE9DD",
+"R, c #E8E4D6",
+"S, c #E1DDCE",
+"T, c #DFDBCC",
+"U, c #DBD7C8",
+"V, c #C4C1B2",
+"W, c #6B6A54",
+"X, c #7B6526",
+"Y, c #EBC435",
+"Z, c #FBDA44",
+"`, c #FCDB47",
+" ' c #FCDC49",
+".' c #FCDA46",
+"+' c #FCDA44",
+"@' c #FCD840",
+"#' c #FBD139",
+"$' c #FACC31",
+"%' c #F9CB2A",
+"&' c #EFC226",
+"*' c #CCA81E",
+"=' c #9D8714",
+"-' c #7C7104",
+";' c #90820B",
+">' c #C1A821",
+",' c #F5D223",
+"'' c #FBD623",
+")' c #FDD125",
+"!' c #FDCB20",
+"~' c #FCB91A",
+"{' c #F9A811",
+"]' c #F99C14",
+"^' c #FB9422",
+"/' c #FE902A",
+"(' c #FE9828",
+"_' c #FE9F26",
+":' c #FEA522",
+"<' c #FDAE1F",
+"[' c #FCB321",
+"}' c #FDB721",
+"|' c #FCB31E",
+"1' c #FBB41C",
+"2' c #FBB01D",
+"3' c #E1841A",
+"4' c #F3F0E8",
+"5' c #EBE7DC",
+"6' c #ECE7DB",
+"7' c #E9E6D8",
+"8' c #E8E4D5",
+"9' c #E3DFD1",
+"0' c #E2DDCF",
+"a' c #E2DED0",
+"b' c #E1DDCF",
+"c' c #D7D2C5",
+"d' c #C1BEB0",
+"e' c #817F6A",
+"f' c #837331",
+"g' c #E1BC36",
+"h' c #FBD63F",
+"i' c #FBD944",
+"j' c #FCDD4A",
+"k' c #FCDB4A",
+"l' c #FBD946",
+"m' c #FAD03A",
+"n' c #FACA31",
+"o' c #EEC225",
+"p' c #B19517",
+"q' c #83730B",
+"r' c #716707",
+"s' c #988911",
+"t' c #D0B720",
+"u' c #F4D52C",
+"v' c #FDDB28",
+"w' c #FDD822",
+"x' c #FDD122",
+"y' c #FCC91B",
+"z' c #FBB513",
+"A' c #F9A30C",
+"B' c #FA9614",
+"C' c #FEA22E",
+"D' c #FFA92C",
+"E' c #FFAC28",
+"F' c #FFB025",
+"G' c #FFB723",
+"H' c #FEB91F",
+"I' c #FDB61E",
+"J' c #FDB51D",
+"K' c #FCB31B",
+"L' c #ED9A1E",
+"M' c #B76915",
+"N' c #E9E5D7",
+"O' c #E7E4D6",
+"P' c #E8E3D6",
+"Q' c #E4E1D3",
+"R' c #E5E1D2",
+"S' c #E1DECF",
+"T' c #D6D2C4",
+"U' c #767663",
+"V' c #998433",
+"W' c #E4C039",
+"X' c #FBD540",
+"Y' c #FBD844",
+"Z' c #FBDB47",
+"`' c #FCDB48",
+" ) c #FBDA47",
+".) c #FAD641",
+"+) c #F9CE39",
+"@) c #EABD2C",
+"#) c #B79818",
+"$) c #736B0C",
+"%) c #776B0F",
+"&) c #94841B",
+"*) c #DEC527",
+"=) c #F7DA27",
+"-) c #FEDF2D",
+";) c #FDDE26",
+">) c #FDDB21",
+",) c #FDD61F",
+"') c #FCCB18",
+")) c #FBB810",
+"!) c #F9A30B",
+"~) c #FB9A15",
+"{) c #FEA829",
+"]) c #FFB529",
+"^) c #FFB926",
+"/) c #FFBA25",
+"() c #FEBE23",
+"_) c #FEBC20",
+":) c #FDB61B",
+"<) c #FDB71A",
+"[) c #FDB01C",
+"}) c #FBAD22",
+"|) c #D79225",
+"1) c #6D4412",
+"2) c #745116",
+"3) c #7D5216",
+"4) c #70441F",
+"5) c #141706",
+"6) c #131606",
+"7) c #181B0B",
+"8) c #3D3D26",
+"9) c #917B27",
+"0) c #F9D23B",
+"a) c #FAD941",
+"b) c #FAD945",
+"c) c #FBD942",
+"d) c #FAD848",
+"e) c #F8D244",
+"f) c #E8BB2F",
+"g) c #AC901A",
+"h) c #786B11",
+"i) c #766915",
+"j) c #9F8A23",
+"k) c #D2BB30",
+"l) c #FBE12D",
+"m) c #FEE225",
+"n) c #FEE229",
+"o) c #FDE123",
+"p) c #FDDC20",
+"q) c #FDDA1E",
+"r) c #FDCB14",
+"s) c #FBB90D",
+"t) c #FAA807",
+"u) c #FCA017",
+"v) c #FEAE24",
+"w) c #FFBD26",
+"x) c #FFBF26",
+"y) c #FFBF24",
+"z) c #FEBE22",
+"A) c #FDBB1E",
+"B) c #FDB61A",
+"C) c #FCB21A",
+"D) c #FAAC1C",
+"E) c #EFA11C",
+"F) c #824E14",
+"G) c #7E6012",
+"H) c #846314",
+"I) c #7B5016",
+"J) c #F2F0E5",
+"K) c #E6E3D4",
+"L) c #E4E1D2",
+"M) c #E5E0D1",
+"N) c #E4DFD1",
+"O) c #D5D2C3",
+"P) c #ABA99A",
+"Q) c #68664E",
+"R) c #978229",
+"S) c #F8D239",
+"T) c #FAD83F",
+"U) c #FAD942",
+"V) c #FAD73C",
+"W) c #F9D340",
+"X) c #F5CB39",
+"Y) c #B6981A",
+"Z) c #66630B",
+"`) c #635B10",
+" ! c #85731C",
+".! c #CDB430",
+"+! c #F4DC35",
+"@! c #FEE62F",
+"#! c #FEE729",
+"$! c #FEE824",
+"%! c #FEE424",
+"&! c #FDDF21",
+"*! c #FDD919",
+"=! c #FCCA12",
+"-! c #FBBA0B",
+";! c #FAAF05",
+">! c #FCA519",
+",! c #FEB525",
+"'! c #FFC026",
+")! c #FFC126",
+"!! c #FFC124",
+"~! c #FEBF21",
+"{! c #FDB91D",
+"]! c #FDB21C",
+"^! c #FCB11B",
+"/! c #EDA018",
+"(! c #C07B13",
+"_! c #715C0E",
+":! c #82690F",
+"<! c #816112",
+"[! c #E9E4D7",
+"}! c #E8E3D5",
+"|! c #E6E3D5",
+"1! c #E4DFD0",
+"2! c #E3DFD0",
+"3! c #E1DCCE",
+"4! c #A7A596",
+"5! c #4A4C38",
+"6! c #AB9126",
+"7! c #F3D037",
+"8! c #FAD93E",
+"9! c #FAD83D",
+"0! c #FAD638",
+"a! c #F8D333",
+"b! c #F3C930",
+"c! c #CFAC23",
+"d! c #7B740B",
+"e! c #474D08",
+"f! c #6C6217",
+"g! c #B69F25",
+"h! c #F9E139",
+"i! c #FDE93B",
+"j! c #FEEB34",
+"k! c #FEEC30",
+"l! c #FEEA2E",
+"m! c #FEE626",
+"n! c #FEE221",
+"o! c #FDDC1B",
+"p! c #FDCD12",
+"q! c #FBBF09",
+"r! c #FAB40A",
+"s! c #FCAD1A",
+"t! c #FEB725",
+"u! c #FFC226",
+"v! c #FFC428",
+"w! c #FEC423",
+"x! c #FEBD1F",
+"y! c #FEB21D",
+"z! c #FDB21B",
+"A! c #FBB518",
+"B! c #CC8015",
+"C! c #6B570E",
+"D! c #82690A",
+"E! c #82660E",
+"F! c #F0ECE0",
+"G! c #EEEBDE",
+"H! c #E7E2D5",
+"I! c #E6E1D4",
+"J! c #E5E0D2",
+"K! c #E2DECE",
+"L! c #E0DBCC",
+"M! c #DBD6C9",
+"N! c #D4D1C2",
+"O! c #AFAD9E",
+"P! c #45452B",
+"Q! c #9F8621",
+"R! c #F8D639",
+"S! c #FADB3F",
+"T! c #FADA3D",
+"U! c #F9D737",
+"V! c #F6D22D",
+"W! c #E6BB22",
+"X! c #9B8B0D",
+"Y! c #515904",
+"Z! c #454D08",
+"`! c #95881C",
+" ~ c #E4CC2F",
+".~ c #FEEB37",
+"+~ c #FEEE3B",
+"@~ c #FEF03A",
+"#~ c #FEF031",
+"$~ c #FEEC2E",
+"%~ c #FEE826",
+"&~ c #FEE423",
+"*~ c #FEDE1A",
+"=~ c #FDD111",
+"-~ c #FBC506",
+";~ c #FBB60A",
+">~ c #FDB21E",
+",~ c #FEBD26",
+"'~ c #FFC629",
+")~ c #FFC928",
+"!~ c #FEC222",
+"~~ c #FDB31C",
+"{~ c #FAB618",
+"]~ c #E8A114",
+"^~ c #86470D",
+"/~ c #6E590B",
+"(~ c #79610C",
+"_~ c #7C620C",
+":~ c #676245",
+"<~ c #EAE5D8",
+"[~ c #E7E3D6",
+"}~ c #E7E2D4",
+"|~ c #E3E0D0",
+"1~ c #E3DECF",
+"2~ c #E2DFCF",
+"3~ c #E2DECF",
+"4~ c #E0DCCC",
+"5~ c #DAD6C8",
+"6~ c #59573F",
+"7~ c #927E26",
+"8~ c #F5D538",
+"9~ c #F9DD42",
+"0~ c #F9DE3A",
+"a~ c #F7D92D",
+"b~ c #F2CE27",
+"c~ c #D3AE1B",
+"d~ c #6F7202",
+"e~ c #374802",
+"f~ c #505D08",
+"g~ c #CFB520",
+"h~ c #F8E332",
+"i~ c #FEF13B",
+"j~ c #FEF43F",
+"k~ c #FFF53C",
+"l~ c #FFF335",
+"m~ c #FEEE2D",
+"n~ c #FEEA24",
+"o~ c #FEE61F",
+"p~ c #FDDD15",
+"q~ c #FCD20E",
+"r~ c #FCC706",
+"s~ c #FCB80A",
+"t~ c #FEB928",
+"u~ c #FEC527",
+"v~ c #FFCC2A",
+"w~ c #FFCD28",
+"x~ c #FEBE21",
+"y~ c #FCB01D",
+"z~ c #FBB817",
+"A~ c #ECA613",
+"B~ c #B2760F",
+"C~ c #625107",
+"D~ c #796408",
+"E~ c #141607",
+"F~ c #2C2F1E",
+"G~ c #826F23",
+"H~ c #E5C735",
+"I~ c #F8DB3B",
+"J~ c #F9DD3A",
+"K~ c #F8DE32",
+"L~ c #E6C723",
+"M~ c #A69411",
+"N~ c #525B01",
+"O~ c #3D4F03",
+"P~ c #757B0F",
+"Q~ c #E6C627",
+"R~ c #FDEB33",
+"S~ c #FEF442",
+"T~ c #FEF740",
+"U~ c #FFF73E",
+"V~ c #FEF432",
+"W~ c #FEF02C",
+"X~ c #FEEE22",
+"Y~ c #FEE71A",
+"Z~ c #FDDC13",
+"`~ c #FDD30B",
+" { c #FCC506",
+".{ c #FCBE16",
+"+{ c #FEC229",
+"@{ c #FFCA27",
+"#{ c #FFCE27",
+"${ c #FECB27",
+"%{ c #FDBC21",
+"&{ c #FBAF1C",
+"*{ c #F8B911",
+"={ c #D2860E",
+"-{ c #635305",
+";{ c #726006",
+">{ c #F2EDE3",
+",{ c #E7E3D4",
+"'{ c #E4E0D0",
+"){ c #E3DFCF",
+"!{ c #DEDACA",
+"~{ c #DAD5C6",
+"{{ c #D3CFC0",
+"]{ c #777766",
+"^{ c #4E4B22",
+"/{ c #C5AA20",
+"({ c #EECE29",
+"_{ c #F4CF26",
+":{ c #F2CB1F",
+"<{ c #CAAB15",
+"[{ c #6F6D07",
+"}{ c #374400",
+"|{ c #445702",
+"1{ c #95931D",
+"2{ c #E4C92A",
+"3{ c #FCE832",
+"4{ c #FEF541",
+"5{ c #FEF83E",
+"6{ c #FEF837",
+"7{ c #FEF42A",
+"8{ c #FEF22A",
+"9{ c #FEEF20",
+"0{ c #FEE818",
+"a{ c #FDDE10",
+"b{ c #FDD508",
+"c{ c #FCC204",
+"d{ c #FDC224",
+"e{ c #FEC829",
+"f{ c #FFCE28",
+"g{ c #FFCE26",
+"h{ c #FEC523",
+"i{ c #FCB81E",
+"j{ c #F8B016",
+"k{ c #DF9B0D",
+"l{ c #9B5E09",
+"m{ c #544603",
+"n{ c #675306",
+"o{ c #E3DED0",
+"p{ c #E1DDCD",
+"q{ c #DFDBCA",
+"r{ c #D9D5C6",
+"s{ c #D2CFC0",
+"t{ c #C6C2B3",
+"u{ c #908E7F",
+"v{ c #43462D",
+"w{ c #686518",
+"x{ c #B9A217",
+"y{ c #E6BE18",
+"z{ c #DBB10E",
+"A{ c #9C8407",
+"B{ c #424B02",
+"C{ c #283600",
+"D{ c #455B00",
+"E{ c #9B9A1D",
+"F{ c #E0C124",
+"G{ c #FAE930",
+"H{ c #FDF73F",
+"I{ c #FEF939",
+"J{ c #FEF82F",
+"K{ c #FEF529",
+"L{ c #FEF324",
+"M{ c #FEEF1C",
+"N{ c #FEE914",
+"O{ c #FDDF0D",
+"P{ c #FCD107",
+"Q{ c #FCC10D",
+"R{ c #FEC932",
+"S{ c #FFCC28",
+"T{ c #FFCE29",
+"U{ c #FFCA25",
+"V{ c #FEBB1E",
+"W{ c #FAB11A",
+"X{ c #F0A50F",
+"Y{ c #B46F0B",
+"Z{ c #635507",
+"`{ c #E7E4D5",
+" ] c #E5E1D1",
+".] c #E2DDCE",
+"+] c #E2DDCD",
+"@] c #E1DCCD",
+"#] c #E1DCCC",
+"$] c #DAD6C7",
+"%] c #D4CFC0",
+"&] c #C8C4B6",
+"*] c #ABA899",
+"=] c #4F5240",
+"-] c #40451A",
+";] c #756F11",
+">] c #AB940E",
+",] c #9D8807",
+"'] c #686403",
+")] c #374202",
+"!] c #2B3A00",
+"~] c #455902",
+"{] c #828E10",
+"]] c #D6BE28",
+"^] c #FAE82B",
+"/] c #FEF93F",
+"(] c #FEF936",
+"_] c #FEF92A",
+":] c #FEF628",
+"<] c #FEF41F",
+"[] c #FEF015",
+"}] c #FEEA11",
+"|] c #FDDD0A",
+"1] c #FCCC08",
+"2] c #FDC620",
+"3] c #FECC2F",
+"4] c #FFCF29",
+"5] c #FFCD29",
+"6] c #FEC223",
+"7] c #FCB61A",
+"8] c #F5B015",
+"9] c #DA940D",
+"0] c #524307",
+"a] c #5D5409",
+"b] c #5A510A",
+"c] c #EBE6DB",
+"d] c #E8E4D8",
+"e] c #E3E0D1",
+"f] c #E0DDCC",
+"g] c #E0DCCB",
+"h] c #DED9C9",
+"i] c #DAD6C6",
+"j] c #D4D0BF",
+"k] c #B1AEA0",
+"l] c #5F604F",
+"m] c #333A1C",
+"n] c #3F490D",
+"o] c #4F5611",
+"p] c #575B08",
+"q] c #434E02",
+"r] c #2D3A00",
+"s] c #2A3800",
+"t] c #3F5602",
+"u] c #7F8E10",
+"v] c #CCBD24",
+"w] c #F5E32C",
+"x] c #FEF838",
+"y] c #FEFA32",
+"z] c #FEF928",
+"A] c #FEF722",
+"B] c #FEF41A",
+"C] c #FEF113",
+"D] c #FDE90F",
+"E] c #FCD805",
+"F] c #FCC509",
+"G] c #FDC72C",
+"H] c #FECF29",
+"I] c #FFD128",
+"J] c #FFCC26",
+"K] c #FDBC1E",
+"L] c #FAB614",
+"M] c #E0A011",
+"N] c #A7730F",
+"O] c #020100",
+"P] c #352C0D",
+"Q] c #59480B",
+"R] c #6A5B0B",
+"S] c #4C4A0A",
+"T] c #454645",
+"U] c #141606",
+"V] c #131607",
+"W] c #151809",
+"X] c #232716",
+"Y] c #31361D",
+"Z] c #323D0F",
+"`] c #445018",
+" ^ c #434F12",
+".^ c #354405",
+"+^ c #2B3800",
+"@^ c #293600",
+"#^ c #3A5002",
+"$^ c #6D8408",
+"%^ c #C7B827",
+"&^ c #F4E522",
+"*^ c #FDF82D",
+"=^ c #FEFB2E",
+"-^ c #FEFA25",
+";^ c #FEF71F",
+">^ c #FEF416",
+",^ c #FEEF0F",
+"'^ c #FDE309",
+")^ c #FCCF05",
+"!^ c #FCC213",
+"~^ c #FEC92E",
+"{^ c #FFD328",
+"]^ c #FED526",
+"^^ c #FEC921",
+"/^ c #FBB416",
+"(^ c #F1AC0B",
+"_^ c #B17309",
+":^ c #573B09",
+"<^ c #040302",
+"[^ c #251F06",
+"}^ c #4C3F0B",
+"|^ c #62530B",
+"1^ c #5F5209",
+"2^ c #514A0A",
+"3^ c #020202",
+"4^ c #EBE6DA",
+"5^ c #E0DBCB",
+"6^ c #DDD8C8",
+"7^ c #DAD7C6",
+"8^ c #D6D2C1",
+"9^ c #CDC9B8",
+"0^ c #BFBCAD",
+"a^ c #A6A394",
+"b^ c #515341",
+"c^ c #333A19",
+"d^ c #3D4814",
+"e^ c #424E17",
+"f^ c #36440B",
+"g^ c #2B3802",
+"h^ c #273400",
+"i^ c #324500",
+"j^ c #5D7109",
+"k^ c #B5AF23",
+"l^ c #F3DD1E",
+"m^ c #FDF925",
+"n^ c #FEFB2A",
+"o^ c #FEFB20",
+"p^ c #FEF71A",
+"q^ c #FEF411",
+"r^ c #FEEE0C",
+"s^ c #FDDB04",
+"t^ c #FCC306",
+"u^ c #FDC41E",
+"v^ c #FED02A",
+"w^ c #FED527",
+"x^ c #FED021",
+"y^ c #FBC016",
+"z^ c #EAA40B",
+"A^ c #C38206",
+"B^ c #613D09",
+"C^ c #483609",
+"D^ c #3F3109",
+"E^ c #292307",
+"F^ c #534A06",
+"G^ c #635C07",
+"H^ c #5F5408",
+"I^ c #4B4308",
+"J^ c #F1ECE2",
+"K^ c #010101",
+"L^ c #030303",
+"M^ c #E6E1D2",
+"N^ c #DFDBCB",
+"O^ c #DED9C8",
+"P^ c #D7D3C1",
+"Q^ c #CFCABA",
+"R^ c #C3BEAF",
+"S^ c #B1AE9F",
+"T^ c #787868",
+"U^ c #383C27",
+"V^ c #313C0D",
+"W^ c #3D4913",
+"X^ c #364408",
+"Y^ c #2C3A00",
+"Z^ c #232F00",
+"`^ c #2A3900",
+" / c #4A5D04",
+"./ c #97981B",
+"+/ c #E6D021",
+"@/ c #FBF01A",
+"#/ c #FDFA1F",
+"$/ c #FDFA1B",
+"%/ c #FEF614",
+"&/ c #FDF20A",
+"*/ c #FDE806",
+"=/ c #FCD201",
+"-/ c #FCB604",
+";/ c #FDC722",
+">/ c #FED125",
+",/ c #FED11F",
+"'/ c #FDCA15",
+")/ c #F3B20B",
+"!/ c #BF7E05",
+"~/ c #633D02",
+"{/ c #4B3A08",
+"]/ c #4D3D0A",
+"^/ c #3C3608",
+"// c #454504",
+"(/ c #4C4D00",
+"_/ c #555104",
+":/ c #4A4007",
+"</ c #666145",
+"[/ c #666045",
+"}/ c #E8E3D7",
+"|/ c #DFDACA",
+"1/ c #DEDAC9",
+"2/ c #D8D3C3",
+"3/ c #D0CCBD",
+"4/ c #C6C1B2",
+"5/ c #B8B5A5",
+"6/ c #979686",
+"7/ c #4D4F3D",
+"8/ c #313918",
+"9/ c #36420E",
+"0/ c #3E4A12",
+"a/ c #334105",
+"b/ c #283400",
+"c/ c #253400",
+"d/ c #3C5101",
+"e/ c #6D7C10",
+"f/ c #D3BF29",
+"g/ c #F7E819",
+"h/ c #FCF714",
+"i/ c #FDF811",
+"j/ c #FDF30A",
+"k/ c #FCE905",
+"l/ c #FCDB02",
+"m/ c #FBC500",
+"n/ c #FCBB0B",
+"o/ c #FEC81F",
+"p/ c #FECF1E",
+"q/ c #FCCC15",
+"r/ c #F5BF0B",
+"s/ c #D48D02",
+"t/ c #673C03",
+"u/ c #221B04",
+"v/ c #746B0A",
+"w/ c #565008",
+"x/ c #424703",
+"y/ c #494E01",
+"z/ c #4D4B02",
+"A/ c #4D4507",
+"B/ c #F0EBE0",
+"C/ c #E0DBCA",
+"D/ c #DFDAC9",
+"E/ c #DDD9C8",
+"F/ c #DCD6C6",
+"G/ c #D8D3C4",
+"H/ c #D3CEBE",
+"I/ c #C9C6B5",
+"J/ c #BCB7A9",
+"K/ c #B2AF9F",
+"L/ c #6D6E5E",
+"M/ c #393F27",
+"N/ c #333D10",
+"O/ c #3D4B09",
+"P/ c #3E4C08",
+"Q/ c #374602",
+"R/ c #314200",
+"S/ c #374C00",
+"T/ c #4E6403",
+"U/ c #8F9312",
+"V/ c #E7D719",
+"W/ c #FBF30D",
+"X/ c #FCF308",
+"Y/ c #FBE803",
+"Z/ c #F8D500",
+"`/ c #F8C800",
+" ( c #F7B500",
+".( c #FCBC11",
+"+( c #FECD19",
+"@( c #FDD213",
+"#( c #F5C00A",
+"$( c #D29203",
+"%( c #875302",
+"&( c #383007",
+"*( c #525408",
+"=( c #686F06",
+"-( c #445001",
+";( c #475200",
+">( c #5C5906",
+",( c #4D3C07",
+"'( c #151906",
+")( c #161A06",
+"!( c #202A04",
+"~( c #273302",
+"{( c #263104",
+"]( c #1B2007",
+"^( c #121506",
+"/( c #111305",
+"(( c #151709",
+"_( c #2E3220",
+":( c #2F3616",
+"<( c #3D4A09",
+"[( c #455509",
+"}( c #415104",
+"|( c #374600",
+"1( c #344600",
+"2( c #3E5500",
+"3( c #5E7305",
+"4( c #B2B110",
+"5( c #EBDC08",
+"6( c #F5DD01",
+"7( c #F0C900",
+"8( c #EEB801",
+"9( c #F0B101",
+"0( c #F6B606",
+"a( c #FDC815",
+"b( c #FDDC15",
+"c( c #F5CA09",
+"d( c #D29301",
+"e( c #815109",
+"f( c #524206",
+"g( c #4B5103",
+"h( c #475202",
+"i( c #4A5801",
+"j( c #596303",
+"k( c #636507",
+"l( c #524A10",
+"m( c #E6E2D5",
+"n( c #C2C3A5",
+"o( c #868E60",
+"p( c #6A7445",
+"q( c #656E42",
+"r( c #7E855F",
+"s( c #B7B79F",
+"t( c #E3DECE",
+"u( c #E1DECE",
+"v( c #E1DDCC",
+"w( c #E0DACA",
+"x( c #B5B69A",
+"y( c #3E4D12",
+"z( c #2F4003",
+"A( c #334404",
+"B( c #566724",
+"C( c #9FA47D",
+"D( c #DDD8C7",
+"E( c #DCD7C5",
+"F( c #D9D4C3",
+"G( c #D5D2C0",
+"H( c #CECBBA",
+"I( c #C4C0B0",
+"J( c #B6B3A4",
+"K( c #A3A192",
+"L( c #676858",
+"M( c #363C26",
+"N( c #323C16",
+"O( c #3F4C0F",
+"P( c #414E04",
+"Q( c #3A4801",
+"R( c #3B4B00",
+"S( c #3B4D00",
+"T( c #445C00",
+"U( c #778307",
+"V( c #BBA907",
+"W( c #CCA001",
+"X( c #D69F01",
+"Y( c #EEBB09",
+"Z( c #FAC710",
+"`( c #FCC917",
+" _ c #FBD21D",
+"._ c #E6BB12",
+"+_ c #BE8B05",
+"@_ c #845808",
+"#_ c #5E550C",
+"$_ c #515803",
+"%_ c #354500",
+"&_ c #3C4B00",
+"*_ c #667104",
+"=_ c #6E6D0A",
+"-_ c #675F43",
+";_ c #EDE8DC",
+">_ c #929A65",
+",_ c #566525",
+"'_ c #3C4C0D",
+")_ c #334305",
+"!_ c #334405",
+"~_ c #354505",
+"{_ c #455516",
+"]_ c #8B9267",
+"^_ c #E2DECD",
+"/_ c #A1A481",
+"(_ c #2F3F03",
+"__ c #293A00",
+":_ c #2A3B00",
+"<_ c #324302",
+"[_ c #536325",
+"}_ c #DCD8C7",
+"|_ c #DAD5C4",
+"1_ c #D8D3C1",
+"2_ c #D2CDBD",
+"3_ c #C9C5B4",
+"4_ c #ACA899",
+"5_ c #888677",
+"6_ c #454836",
+"7_ c #373F1D",
+"8_ c #374112",
+"9_ c #374208",
+"0_ c #455308",
+"a_ c #505E07",
+"b_ c #4F5E01",
+"c_ c #4E5F01",
+"d_ c #556701",
+"e_ c #747705",
+"f_ c #927701",
+"g_ c #A97C00",
+"h_ c #DBA804",
+"i_ c #E8AE0D",
+"j_ c #E8B718",
+"k_ c #DAA813",
+"l_ c #B18806",
+"m_ c #8C7002",
+"n_ c #6B6601",
+"o_ c #4E5901",
+"p_ c #425200",
+"q_ c #485601",
+"r_ c #5D6603",
+"s_ c #636508",
+"t_ c #707E3A",
+"u_ c #475A0D",
+"v_ c #384B04",
+"w_ c #344502",
+"x_ c #344601",
+"y_ c #2F4001",
+"z_ c #2E3E01",
+"A_ c #324304",
+"B_ c #6B773D",
+"C_ c #C2C3A4",
+"D_ c #8B9266",
+"E_ c #304002",
+"F_ c #2B3C00",
+"G_ c #3B4C0E",
+"H_ c #DBD6C4",
+"I_ c #D3CFBD",
+"J_ c #CCC8B7",
+"K_ c #A4A193",
+"L_ c #575848",
+"M_ c #3C441D",
+"N_ c #3F4A16",
+"O_ c #404F06",
+"P_ c #4A5A0C",
+"Q_ c #52620B",
+"R_ c #576A05",
+"S_ c #596C01",
+"T_ c #5B6C01",
+"U_ c #566601",
+"V_ c #626600",
+"W_ c #746700",
+"X_ c #8A7400",
+"Y_ c #A08302",
+"Z_ c #A38706",
+"`_ c #948100",
+" : c #837A00",
+".: c #717400",
+"+: c #576500",
+"@: c #4E5F00",
+"#: c #5B6A00",
+"$: c #5F6304",
+"%: c #474706",
+"&: c #EAE6D8",
+"*: c #E5E2D2",
+"=: c #62712B",
+"-: c #354802",
+";: c #304300",
+">: c #384C00",
+",: c #455802",
+"': c #3B4D01",
+"): c #344501",
+"!: c #2C3D00",
+"~: c #314202",
+"{: c #586722",
+"]: c #B7B996",
+"^: c #E1DCCB",
+"/: c #DEDAC8",
+"(: c #778248",
+"_: c #334304",
+":: c #2D3D00",
+"<: c #304105",
+"[: c #A4A885",
+"}: c #DBD7C4",
+"|: c #D5D0C0",
+"1: c #CFCAB9",
+"2: c #C6C1B0",
+"3: c #B9B4A5",
+"4: c #A9A596",
+"5: c #7F8066",
+"6: c #3D4817",
+"7: c #49561A",
+"8: c #475B06",
+"9: c #4D6007",
+"0: c #485908",
+"a: c #495805",
+"b: c #5A6A03",
+"c: c #6C7C01",
+"d: c #6B7900",
+"e: c #5F6B00",
+"f: c #515C02",
+"g: c #454E00",
+"h: c #525500",
+"i: c #585E00",
+"j: c #535E00",
+"k: c #545F01",
+"l: c #4D5C00",
+"m: c #475700",
+"n: c #4F5A01",
+"o: c #525604",
+"p: c #727E43",
+"q: c #324400",
+"r: c #425303",
+"s: c #425302",
+"t: c #4F6104",
+"u: c #546804",
+"v: c #506204",
+"w: c #3E5002",
+"x: c #324300",
+"y: c #304201",
+"z: c #3C4E0A",
+"A: c #707C42",
+"B: c #C1C2A4",
+"C: c #6F7C3B",
+"D: c #354605",
+"E: c #304100",
+"F: c #3C4D02",
+"G: c #304101",
+"H: c #57662C",
+"I: c #DBD5C4",
+"J: c #D9D5C2",
+"K: c #D7D2C0",
+"L: c #D3CEBB",
+"M: c #CBC6B5",
+"N: c #90907A",
+"O: c #50582C",
+"P: c #45521B",
+"Q: c #4A5C15",
+"R: c #4A6207",
+"S: c #4E6306",
+"T: c #56650B",
+"U: c #626F0C",
+"V: c #728306",
+"W: c #708200",
+"X: c #647201",
+"Y: c #575E0A",
+"Z: c #0E0F00",
+"`: c #161B00",
+" < c #141A00",
+".< c #191E02",
+"+< c #262E04",
+"@< c #272E04",
+"#< c #1B2000",
+"$< c #1B1D02",
+"%< c #040403",
+"&< c #645D42",
+"*< c #E4DFCF",
+"=< c #B5B898",
+"-< c #435506",
+";< c #5E7006",
+">< c #5B6D06",
+",< c #566705",
+"'< c #566904",
+")< c #566805",
+"!< c #495B03",
+"~< c #364801",
+"{< c #57681F",
+"]< c #A7AB81",
+"^< c #6B7A34",
+"/< c #354504",
+"(< c #4C5E04",
+"_< c #485903",
+":< c #38490B",
+"<< c #AFB091",
+"[< c #DAD5C3",
+"}< c #D8D2C0",
+"|< c #D4CFBE",
+"1< c #CECAB7",
+"2< c #C5C0AF",
+"3< c #B8B3A4",
+"4< c #A8A595",
+"5< c #4E562D",
+"6< c #394319",
+"7< c #4B5820",
+"8< c #475C0E",
+"9< c #4C6405",
+"0< c #5A6A0E",
+"a< c #697710",
+"b< c #708209",
+"c< c #697C02",
+"d< c #5E6B0E",
+"e< c #393F0B",
+"f< c #010100",
+"g< c #625C42",
+"h< c #625C41",
+"i< c #E0DCCD",
+"j< c #828C4C",
+"k< c #5F7007",
+"l< c #607206",
+"m< c #5B6C06",
+"n< c #526405",
+"o< c #4E6004",
+"p< c #5A6D05",
+"q< c #3B4C02",
+"r< c #2F3F00",
+"s< c #2F4000",
+"t< c #405209",
+"u< c #707E3C",
+"v< c #BDBD9D",
+"w< c #DDD9C7",
+"x< c #65742B",
+"y< c #344504",
+"z< c #3A4B01",
+"A< c #586A05",
+"B< c #4C5F03",
+"C< c #334406",
+"D< c #6D7746",
+"E< c #DAD6C3",
+"F< c #D9D4C2",
+"G< c #D5D1BF",
+"H< c #D1CBB9",
+"I< c #C8C4B2",
+"J< c #BDB9A8",
+"K< c #9A9885",
+"L< c #53593A",
+"M< c #47531F",
+"N< c #445314",
+"O< c #3D5500",
+"P< c #4B6303",
+"Q< c #607507",
+"R< c #607B03",
+"S< c #5F7509",
+"T< c #50571B",
+"U< c #141506",
+"V< c #605A3F",
+"W< c #E9E4D8",
+"X< c #E4E0D3",
+"Y< c #E2DFCE",
+"Z< c #D3D1BA",
+"`< c #8E9757",
+" [ c #5F7014",
+".[ c #5A6B06",
+"+[ c #556705",
+"@[ c #4E5F04",
+"#[ c #4F6004",
+"$[ c #576905",
+"%[ c #576805",
+"&[ c #455603",
+"*[ c #2D3E00",
+"=[ c #314400",
+"-[ c #44560E",
+";[ c #99A071",
+">[ c #607025",
+",[ c #334502",
+"'[ c #364701",
+")[ c #465A02",
+"![ c #304200",
+"~[ c #324307",
+"{[ c #4D5A24",
+"][ c #C5C1AB",
+"^[ c #D9D4C1",
+"/[ c #D8D3C0",
+"([ c #D6D2BE",
+"_[ c #D2CEBB",
+":[ c #CCC7B5",
+"<[ c #C1BDAC",
+"[[ c #8A8B73",
+"}[ c #494D33",
+"|[ c #38401D",
+"1[ c #424C1C",
+"2[ c #3F4E0F",
+"3[ c #3D5200",
+"4[ c #465F00",
+"5[ c #4E6602",
+"6[ c #5A6E12",
+"7[ c #7B8244",
+"8[ c #393723",
+"9[ c #020201",
+"0[ c #5E583E",
+"a[ c #D2D1B5",
+"b[ c #959E5F",
+"c[ c #5A6A11",
+"d[ c #4F6105",
+"e[ c #475903",
+"f[ c #536505",
+"g[ c #586905",
+"h[ c #5E6F06",
+"i[ c #4B5D04",
+"j[ c #2D3F00",
+"k[ c #7A854F",
+"l[ c #C1C1A5",
+"m[ c #354601",
+"n[ c #4D5F04",
+"o[ c #354703",
+"p[ c #344409",
+"q[ c #4A5822",
+"r[ c #A5A788",
+"s[ c #D8D4C1",
+"t[ c #D7D2BF",
+"u[ c #D6D2BF",
+"v[ c #D2CDBC",
+"w[ c #CDC8B6",
+"x[ c #BFBAA8",
+"y[ c #73765C",
+"z[ c #343A21",
+"A[ c #383F1B",
+"B[ c #444F1A",
+"C[ c #3D5108",
+"D[ c #435D00",
+"E[ c #405401",
+"F[ c #536113",
+"G[ c #7A7F4B",
+"H[ c #828069",
+"I[ c #28261B",
+"J[ c #5C563C",
+"K[ c #5C563D",
+"L[ c #DCD7C4",
+"M[ c #BDBE9B",
+"N[ c #798442",
+"O[ c #56660D",
+"P[ c #516204",
+"Q[ c #506104",
+"R[ c #596A05",
+"S[ c #4D5F03",
+"T[ c #3D4E02",
+"U[ c #384901",
+"V[ c #394D06",
+"W[ c #8D9465",
+"X[ c #566819",
+"Y[ c #2F4100",
+"Z[ c #34450A",
+"`[ c #475320",
+" } c #969978",
+".} c #D8D3BF",
+"+} c #D6D1BE",
+"@} c #D3CEBC",
+"#} c #CDC9B6",
+"$} c #A5A48E",
+"%} c #5C6046",
+"&} c #32391C",
+"*} c #3A4519",
+"=} c #475716",
+"-} c #435C04",
+";} c #455F00",
+">} c #3A4709",
+",} c #707438",
+"'} c #878570",
+")} c #6C6B5F",
+"!} c #242218",
+"~} c #040402",
+"{} c #5A543B",
+"]} c #5A543C",
+"^} c #C4C4A1",
+"/} c #808B49",
+"(} c #57690B",
+"_} c #455602",
+":} c #2E3F00",
+"<} c #324600",
+"[} c #63712F",
+"}} c #4C5F0E",
+"|} c #425502",
+"1} c #304102",
+"2} c #2E3E04",
+"3} c #46521F",
+"4} c #D8D2BF",
+"5} c #D5D0BD",
+"6} c #D2CDBB",
+"7} c #CCC8B5",
+"8} c #898972",
+"9} c #454A31",
+"0} c #333B19",
+"a} c #3E4A17",
+"b} c #475910",
+"c} c #486005",
+"d} c #415505",
+"e} c #4E5623",
+"f} c #7C7C57",
+"g} c #787569",
+"h} c #605E54",
+"i} c #2A271C",
+"j} c #11100B",
+"k} c #58533B",
+"l} c #DEDBC9",
+"m} c #D8D4BF",
+"n} c #B0B485",
+"o} c #6E7D2B",
+"p} c #5A6B0B",
+"q} c #556608",
+"r} c #465804",
+"s} c #4C5D04",
+"t} c #475803",
+"u} c #394B01",
+"v} c #334600",
+"w} c #506313",
+"x} c #4B5E0B",
+"y} c #354701",
+"z} c #2B3C03",
+"A} c #495623",
+"B} c #969977",
+"C} c #D6D1BD",
+"D} c #D4D0BC",
+"E} c #D1CCB9",
+"F} c #BDBAA7",
+"G} c #6D6F57",
+"H} c #31381D",
+"I} c #333D13",
+"J} c #424E16",
+"K} c #4A5E07",
+"L} c #485C02",
+"M} c #3D480C",
+"N} c #62663C",
+"O} c #7B7A63",
+"P} c #6E6B60",
+"Q} c #656258",
+"R} c #373425",
+"S} c #27251A",
+"T} c #565139",
+"U} c #DFDACB",
+"V} c #DFD9C9",
+"W} c #DED8C8",
+"X} c #D3D0B4",
+"Y} c #ABB07E",
+"Z} c #7B8840",
+"`} c #485814",
+" | c #344603",
+".| c #3A4B02",
+"+| c #40510A",
+"@| c #475909",
+"#| c #324401",
+"$| c #3C4E02",
+"%| c #2C3D03",
+"&| c #475421",
+"*| c #878C68",
+"=| c #D7D2BE",
+"-| c #D0CCB8",
+";| c #CDC8B5",
+">| c #9B9985",
+",| c #51553D",
+"'| c #313919",
+")| c #384312",
+"!| c #465611",
+"~| c #4C6104",
+"{| c #405005",
+"]| c #3B4118",
+"^| c #737553",
+"/| c #7F7C6F",
+"(| c #69665C",
+"_| c #706D61",
+":| c #44412E",
+"<| c #45412F",
+"[| c #544F38",
+"}| c #181C07",
+"|| c #212807",
+"1| c #2B3507",
+"2| c #334007",
+"3| c #324104",
+"4| c #314301",
+"5| c #465703",
+"6| c #334402",
+"7| c #394A02",
+"8| c #4D5E04",
+"9| c #293900",
+"0| c #273600",
+"a| c #253301",
+"b| c #1F2803",
+"c| c #262B13",
+"d| c #2D341B",
+"e| c #2F3814",
+"f| c #3E4B11",
+"g| c #4D6108",
+"h| c #3A460D",
+"i| c #4D512E",
+"j| c #76765E",
+"k| c #7A776B",
+"l| c #6C6A5F",
+"m| c #7A776A",
+"n| c #4C4733",
+"o| c #5A553E",
+"p| c #040404",
+"q| c #524D37",
+"r| c #B7B896",
+"s| c #868F56",
+"t| c #66752D",
+"u| c #5C6D1F",
+"v| c #57691A",
+"w| c #465A0A",
+"x| c #3C5202",
+"y| c #394F00",
+"z| c #3B4E02",
+"A| c #3C4E03",
+"B| c #526304",
+"C| c #405102",
+"D| c #2B3B02",
+"E| c #3C4A15",
+"F| c #4C5826",
+"G| c #989A7A",
+"H| c #D1CCBA",
+"I| c #B5B19C",
+"J| c #676A50",
+"K| c #353F15",
+"L| c #455316",
+"M| c #4F6404",
+"N| c #3B4016",
+"O| c #626447",
+"P| c #7F7D6B",
+"Q| c #767367",
+"R| c #7C796C",
+"S| c #8C897B",
+"T| c #55503A",
+"U| c #605B43",
+"V| c #0B0B0A",
+"W| c #090909",
+"X| c #060505",
+"Y| c #504C35",
+"Z| c #514C36",
+"`| c #D3D1BC",
+" 1 c #AEB18B",
+".1 c #7C884A",
+"+1 c #627227",
+"@1 c #5B6C1E",
+"#1 c #566718",
+"$1 c #4C5E0F",
+"%1 c #3E5403",
+"&1 c #354A00",
+"*1 c #455403",
+"=1 c #536504",
+"-1 c #3E5003",
+";1 c #2D3D01",
+">1 c #33420B",
+",1 c #535D2E",
+"'1 c #6E764C",
+")1 c #C6C3AB",
+"!1 c #D5D1BD",
+"~1 c #D2CEB9",
+"{1 c #CDC7B5",
+"]1 c #C7C2AE",
+"^1 c #8D8C75",
+"/1 c #50543B",
+"(1 c #313A17",
+"_1 c #3A4514",
+":1 c #495D03",
+"<1 c #42491B",
+"[1 c #747457",
+"}1 c #858174",
+"|1 c #737065",
+"11 c #A29E8D",
+"21 c #A5A190",
+"31 c #5C5841",
+"41 c #646046",
+"51 c #0C0C0B",
+"61 c #080808",
+"71 c #4E4A34",
+"81 c #E2DCCD",
+"91 c #CAC9B0",
+"01 c #9BA171",
+"a1 c #637329",
+"b1 c #546615",
+"c1 c #516411",
+"d1 c #4C600E",
+"e1 c #3F5503",
+"f1 c #344800",
+"g1 c #334700",
+"h1 c #405304",
+"i1 c #4F6008",
+"j1 c #556805",
+"k1 c #4B5D03",
+"l1 c #3A4909",
+"m1 c #404D19",
+"n1 c #676F44",
+"o1 c #ADAD91",
+"p1 c #C7C1AE",
+"q1 c #5D6046",
+"r1 c #32381E",
+"s1 c #323A14",
+"t1 c #3F4B14",
+"u1 c #495C09",
+"v1 c #445603",
+"w1 c #535733",
+"x1 c #77775F",
+"y1 c #777468",
+"z1 c #9A9786",
+"A1 c #CCC6B1",
+"B1 c #CAC5B0",
+"C1 c #645E44",
+"D1 c #676147",
+"E1 c #050505",
+"F1 c #4D4833",
+"G1 c #E5E2D4",
+"H1 c #C0C0A2",
+"I1 c #858F55",
+"J1 c #506310",
+"K1 c #4B5F0A",
+"L1 c #3F5403",
+"M1 c #334800",
+"N1 c #2C3E00",
+"O1 c #2E4000",
+"P1 c #4E6016",
+"Q1 c #4E6113",
+"R1 c #3F5303",
+"S1 c #4B6003",
+"T1 c #5C6D06",
+"U1 c #495909",
+"V1 c #525D2B",
+"W1 c #9EA080",
+"X1 c #D5D0BC",
+"Y1 c #D4CFBA",
+"Z1 c #D2CCB8",
+"`1 c #CEC9B5",
+" 2 c #ACA994",
+".2 c #61644A",
+"+2 c #31391B",
+"@2 c #353F14",
+"#2 c #445214",
+"$2 c #496004",
+"%2 c #405201",
+"&2 c #636447",
+"*2 c #7F7C6B",
+"=2 c #7B786B",
+"-2 c #C6C0AC",
+";2 c #D0CAB5",
+">2 c #D0CBB5",
+",2 c #645F43",
+"'2 c #665F47",
+")2 c #070707",
+"!2 c #4A4632",
+"~2 c #151907",
+"{2 c #2A3407",
+"]2 c #425407",
+"^2 c #475A07",
+"/2 c #485C07",
+"(2 c #445805",
+"_2 c #394E00",
+":2 c #364B00",
+"<2 c #314500",
+"[2 c #303E04",
+"}2 c #2E4001",
+"|2 c #2F4200",
+"12 c #465902",
+"22 c #647607",
+"32 c #2F3C04",
+"42 c #171B06",
+"52 c #141707",
+"62 c #262A17",
+"72 c #2D331A",
+"82 c #2E3713",
+"92 c #394411",
+"02 c #44560C",
+"a2 c #445903",
+"b2 c #3A4904",
+"c2 c #535638",
+"d2 c #767266",
+"e2 c #A6A291",
+"f2 c #D0C9B4",
+"g2 c #CFCAB5",
+"h2 c #625C43",
+"i2 c #645F46",
+"j2 c #494430",
+"k2 c #484430",
+"l2 c #C2C2A5",
+"m2 c #3E5103",
+"n2 c #2B3B00",
+"o2 c #2E3D04",
+"p2 c #5A6533",
+"q2 c #626C3D",
+"r2 c #304004",
+"s2 c #374801",
+"t2 c #526605",
+"u2 c #586A18",
+"v2 c #B6B694",
+"w2 c #D1CCB8",
+"x2 c #CCC7B3",
+"y2 c #C0BCA8",
+"z2 c #6C6E56",
+"A2 c #32391E",
+"B2 c #323B13",
+"C2 c #424F13",
+"D2 c #4F6407",
+"E2 c #455604",
+"F2 c #38410D",
+"G2 c #6D6C57",
+"H2 c #848072",
+"I2 c #BAB5A2",
+"J2 c #D0CBB4",
+"K2 c #CFCAB4",
+"L2 c #625B42",
+"M2 c #48432E",
+"N2 c #48432F",
+"O2 c #DDD9C9",
+"P2 c #989D74",
+"Q2 c #3C4D06",
+"R2 c #354801",
+"S2 c #374A01",
+"T2 c #2A3A00",
+"U2 c #2A3C00",
+"V2 c #2A3B01",
+"W2 c #38460F",
+"X2 c #888D67",
+"Y2 c #C1BFA7",
+"Z2 c #888D69",
+"`2 c #384710",
+" 3 c #2D3D02",
+".3 c #3E4F02",
+"+3 c #526404",
+"@3 c #4E6109",
+"#3 c #798445",
+"$3 c #CDC9B2",
+"%3 c #CFCBB7",
+"&3 c #A4A28C",
+"*3 c #5B5E44",
+"=3 c #31381B",
+"-3 c #384315",
+";3 c #495911",
+">3 c #586E05",
+",3 c #485807",
+"'3 c #353A16",
+")3 c #848171",
+"!3 c #A29E8E",
+"~3 c #C7C2AD",
+"{3 c #D0CAB3",
+"]3 c #CCC6B0",
+"^3 c #615C45",
+"/3 c #605B42",
+"(3 c #45402E",
+"_3 c #DDD7C7",
+":3 c #777E54",
+"<3 c #344408",
+"[3 c #314106",
+"}3 c #3E4E10",
+"|3 c #445319",
+"13 c #485521",
+"23 c #606A3C",
+"33 c #A3A486",
+"43 c #D7D1BE",
+"53 c #7D835A",
+"63 c #394B02",
+"73 c #425503",
+"83 c #9CA173",
+"93 c #CDC8B3",
+"03 c #CAC5B1",
+"a3 c #87876F",
+"b3 c #44492F",
+"c3 c #323B17",
+"d3 c #3E4B13",
+"e3 c #495B0D",
+"f3 c #42510A",
+"g3 c #4B4E2C",
+"h3 c #928E7F",
+"i3 c #B3AE9B",
+"j3 c #CEC9B3",
+"k3 c #CFCAB3",
+"l3 c #CFC9B2",
+"m3 c #CBC6B1",
+"n3 c #5E5A42",
+"o3 c #5E5941",
+"p3 c #45412D",
+"q3 c #45412E",
+"r3 c #DCD8C5",
+"s3 c #838964",
+"t3 c #4E5B29",
+"u3 c #37450D",
+"v3 c #36450B",
+"w3 c #3D4C12",
+"x3 c #435119",
+"y3 c #45531C",
+"z3 c #485721",
+"A3 c #5E6939",
+"B3 c #959976",
+"C3 c #CCC9B2",
+"D3 c #D6D0BD",
+"E3 c #D6D0BC",
+"F3 c #576330",
+"G3 c #314204",
+"H3 c #324200",
+"I3 c #415606",
+"J3 c #617126",
+"K3 c #BEBCA0",
+"L3 c #ABA894",
+"M3 c #54583E",
+"N3 c #30371C",
+"O3 c #333C11",
+"P3 c #435212",
+"Q3 c #4C6008",
+"R3 c #39430D",
+"S3 c #5E613C",
+"T3 c #9E9A89",
+"U3 c #BFBAA5",
+"V3 c #CFC9B3",
+"W3 c #CEC9B2",
+"X3 c #CBC5B0",
+"Y3 c #5E5940",
+"Z3 c #5D593F",
+"`3 c #44402D",
+" 4 c #191E05",
+".4 c #1D2504",
+"+4 c #1E2803",
+"@4 c #1E2703",
+"#4 c #1A2104",
+"$4 c #171C06",
+"%4 c #1C2304",
+"&4 c #283800",
+"*4 c #425505",
+"=4 c #2B3506",
+"-4 c #232712",
+";4 c #31371D",
+">4 c #303718",
+",4 c #374213",
+"'4 c #44540E",
+")4 c #495D04",
+"!4 c #3B4906",
+"~4 c #2C320C",
+"{4 c #24290D",
+"]4 c #ADA997",
+"^4 c #BEBAA5",
+"/4 c #CEC8B2",
+"(4 c #CDC8B2",
+"_4 c #C8C3AD",
+":4 c #5E583F",
+"<4 c #5E593F",
+"[4 c #44402E",
+"}4 c #DBD7C6",
+"|4 c #DAD5C2",
+"14 c #D8D4C0",
+"24 c #D7D3BF",
+"34 c #D4CFBC",
+"44 c #D4CFBB",
+"54 c #848A62",
+"64 c #304005",
+"74 c #3A4E02",
+"84 c #5F6F24",
+"94 c #BDBAA0",
+"04 c #797B63",
+"a4 c #3A4025",
+"b4 c #313A14",
+"c4 c #3D4914",
+"d4 c #485D02",
+"e4 c #3C4906",
+"f4 c #454924",
+"g4 c #75745C",
+"h4 c #C9C4AE",
+"i4 c #CCC7B0",
+"j4 c #CEC7B1",
+"k4 c #CDC8B1",
+"l4 c #C6C0AA",
+"m4 c #5E5840",
+"n4 c #443F2E",
+"o4 c #DCD6C4",
+"p4 c #DAD6C4",
+"q4 c #D9D3C1",
+"r4 c #D5CFBB",
+"s4 c #CBC6B0",
+"t4 c #55602D",
+"u4 c #2C3D01",
+"v4 c #344700",
+"w4 c #475B09",
+"x4 c #8D9266",
+"y4 c #5F624A",
+"z4 c #31371B",
+"A4 c #343E11",
+"B4 c #435014",
+"C4 c #4C6304",
+"D4 c #415102",
+"E4 c #323C0A",
+"F4 c #434822",
+"G4 c #62624F",
+"H4 c #CEC8B1",
+"I4 c #CDC7B1",
+"J4 c #CBC6AF",
+"K4 c #C6C1AC",
+"L4 c #5D5840",
+"M4 c #5D583F",
+"N4 c #E2DFD0",
+"O4 c #DDDAC9",
+"P4 c #DED8C7",
+"Q4 c #DBD6C5",
+"R4 c #DAD4C3",
+"S4 c #DAD5C1",
+"T4 c #D7D1BF",
+"U4 c #D7D1BD",
+"V4 c #D5CFBC",
+"W4 c #D4CEBA",
+"X4 c #A0A181",
+"Y4 c #39480E",
+"Z4 c #3E5302",
+"`4 c #5C6A27",
+" 5 c #4E5238",
+".5 c #3B4713",
+"+5 c #4C5D0E",
+"@5 c #506505",
+"#5 c #3D4A07",
+"$5 c #393F1A",
+"%5 c #56593A",
+"&5 c #6A685C",
+"*5 c #CDC7B0",
+"=5 c #CDC8B0",
+"-5 c #5C573F",
+";5 c #44402C",
+">5 c #DEDBCA",
+",5 c #D5D0BB",
+"'5 c #D3CFBA",
+")5 c #D3CDB9",
+"!5 c #D3CDB8",
+"~5 c #CAC6AE",
+"{5 c #535E2D",
+"]5 c #384D00",
+"^5 c #475A0B",
+"/5 c #393F23",
+"(5 c #343C17",
+"_5 c #404D15",
+":5 c #4F620A",
+"<5 c #4F6305",
+"[5 c #404A11",
+"}5 c #525435",
+"|5 c #787761",
+"15 c #999585",
+"25 c #C9C4AD",
+"35 c #C2BDA9",
+"45 c #C6C1AB",
+"55 c #5D583E",
+"65 c #43402C",
+"75 c #212C02",
+"85 c #3B5001",
+"95 c #364112",
+"05 c #333E10",
+"a5 c #45550E",
+"b5 c #4B6106",
+"c5 c #465B01",
+"d5 c #272B0D",
+"e5 c #111406",
+"f5 c #C7C2AC",
+"g5 c #C7C2AB",
+"h5 c #5D573E",
+"i5 c #5C573D",
+"j5 c #443F2C",
+"k5 c #D9D3C2",
+"l5 c #D2CCB7",
+"m5 c #9A9C7A",
+"n5 c #42501A",
+"o5 c #40500B",
+"p5 c #3B4811",
+"q5 c #49590C",
+"r5 c #485B04",
+"s5 c #3D4A08",
+"t5 c #444921",
+"u5 c #727355",
+"v5 c #8D897A",
+"w5 c #CCC6AF",
+"x5 c #C9C4AC",
+"y5 c #5D563E",
+"z5 c #433F2C",
+"A5 c #DBD6C3",
+"B5 c #D2CCB6",
+"C5 c #D1CCB6",
+"D5 c #D0CBB6",
+"E5 c #9B9C7C",
+"F5 c #314300",
+"G5 c #415307",
+"H5 c #425111",
+"I5 c #485E07",
+"J5 c #455803",
+"K5 c #38400E",
+"L5 c #545737",
+"M5 c #7C7B64",
+"N5 c #BCB7A2",
+"O5 c #CDC6AF",
+"P5 c #CBC6AE",
+"Q5 c #CAC4AE",
+"R5 c #CAC5AE",
+"S5 c #CAC5AD",
+"T5 c #5C573E",
+"U5 c #E0DACB",
+"V5 c #DCD6C5",
+"W5 c #D2CDB9",
+"X5 c #D2CDB7",
+"Y5 c #D1CBB7",
+"Z5 c #D1CBB6",
+"`5 c #C7C2A9",
+" 6 c #435017",
+".6 c #47580B",
+"+6 c #485E03",
+"@6 c #445502",
+"#6 c #313A0B",
+"$6 c #515432",
+"%6 c #888472",
+"&6 c #CCC7AF",
+"*6 c #CBC5AE",
+"=6 c #CAC4AD",
+"-6 c #423F2C",
+";6 c #DDDAC8",
+">6 c #D6D2BD",
+",6 c #D1CBB5",
+"'6 c #C9C3AB",
+")6 c #2D3E02",
+"!6 c #304001",
+"~6 c #445708",
+"{6 c #4A5D09",
+"]6 c #485B03",
+"^6 c #394507",
+"/6 c #373D15",
+"(6 c #525337",
+"_6 c #B8B29D",
+":6 c #CBC5AD",
+"<6 c #CAC4AC",
+"[6 c #C9C4AB",
+"}6 c #D3CEB8",
+"|6 c #C9C3AF",
+"16 c #B3B291",
+"26 c #425016",
+"36 c #2E3E03",
+"46 c #314104",
+"56 c #485A0B",
+"66 c #506507",
+"76 c #4A5D06",
+"86 c #394011",
+"96 c #565838",
+"06 c #797862",
+"a6 c #C9C3AC",
+"b6 c #433E2D",
+"c6 c #DCD7C7",
+"d6 c #DBD5C3",
+"e6 c #D9D5C3",
+"f6 c #D7D3C0",
+"g6 c #D5D1BC",
+"h6 c #D0CAB4",
+"i6 c #CFC8B3",
+"j6 c #C8C2AD",
+"k6 c #888E62",
+"l6 c #3A490D",
+"m6 c #2F3F02",
+"n6 c #324206",
+"o6 c #47590E",
+"p6 c #4D6205",
+"q6 c #475906",
+"r6 c #3D411C",
+"s6 c #6C6D53",
+"t6 c #989483",
+"u6 c #CBC4AD",
+"v6 c #C9C3AA",
+"w6 c #423E2D",
+"x6 c #433E2C",
+"y6 c #C1BDA8",
+"z6 c #B5B19D",
+"A6 c #4F5B25",
+"B6 c #2E3E02",
+"C6 c #354506",
+"D6 c #4A5D0B",
+"E6 c #475A04",
+"F6 c #50542B",
+"G6 c #747359",
+"H6 c #A49F8C",
+"I6 c #C8C3AB",
+"J6 c #C8C3AA",
+"K6 c #5C563E",
+"L6 c #CAC5AF",
+"M6 c #C4BEAA",
+"N6 c #8F8E75",
+"O6 c #32400A",
+"P6 c #2C3C01",
+"Q6 c #2D3E01",
+"R6 c #394808",
+"S6 c #4C6204",
+"T6 c #425005",
+"U6 c #363D10",
+"V6 c #606240",
+"W6 c #7E7B67",
+"X6 c #B0AC97",
+"Y6 c #CAC3AB",
+"Z6 c #C8C2AA",
+"`6 c #C8C2A9",
+" 7 c #5B573D",
+".7 c #423E2C",
+"+7 c #D4CEBB",
+"@7 c #CDC7B2",
+"#7 c #C6C0AB",
+"$7 c #656B46",
+"%7 c #2F3E06",
+"&7 c #314102",
+"*7 c #415208",
+"=7 c #485F03",
+"-7 c #393F17",
+";7 c #6B6C4F",
+">7 c #999584",
+",7 c #C6C1A9",
+"'7 c #C8C1A9",
+")7 c #C7C1A9",
+"!7 c #3F3A2A",
+"~7 c #CFC9B4",
+"{7 c #CBC5AF",
+"]7 c #C8C3AC",
+"^7 c #BBB6A0",
+"/7 c #424D20",
+"(7 c #2D3C04",
+"_7 c #3B4C06",
+":7 c #4A5E08",
+"<7 c #455703",
+"[7 c #384407",
+"}7 c #383D15",
+"|7 c #4A4B33",
+"17 c #9E9A86",
+"27 c #C9C2AB",
+"37 c #C9C2AA",
+"47 c #C7C2A8",
+"57 c #C7C1A8",
+"67 c #3B3727",
+"77 c #3B3627",
+"87 c #DAD6C5",
+"97 c #D9D5C1",
+"07 c #D6D1BC",
+"a7 c #CCC7B1",
+"b7 c #C9C3AE",
+"c7 c #C4BFAA",
+"d7 c #919174",
+"e7 c #364211",
+"f7 c #2B3A02",
+"g7 c #304003",
+"h7 c #465709",
+"i7 c #4F6405",
+"j7 c #415004",
+"k7 c #323A0F",
+"l7 c #484B2C",
+"m7 c #6F6D5B",
+"n7 c #BBB59F",
+"o7 c #CAC4AB",
+"p7 c #C6C1A7",
+"q7 c #534F37",
+"r7 c #383324",
+"s7 c #383223",
+"t7 c #D9D4C0",
+"u7 c #D2CEB8",
+"v7 c #CEC9B4",
+"w7 c #C4BFA9",
+"x7 c #787A5B",
+"y7 c #313E0E",
+"z7 c #2B3A05",
+"A7 c #324107",
+"B7 c #4B5D0B",
+"C7 c #404B0B",
+"D7 c #3D4023",
+"E7 c #63624E",
+"F7 c #94907E",
+"G7 c #C6C0A8",
+"H7 c #C6C0A7",
+"I7 c #504B35",
+"J7 c #4F4B35",
+"K7 c #332F22",
+"L7 c #332F21",
+"M7 c #DDD9C6",
+"N7 c #D6D0BE",
+"O7 c #B9B59F",
+"P7 c #686B4F",
+"Q7 c #2D3811",
+"R7 c #2D3A08",
+"S7 c #38460E",
+"T7 c #475B02",
+"U7 c #353F0A",
+"V7 c #454631",
+"W7 c #6E6B5D",
+"X7 c #B2AD98",
+"Y7 c #4B4732",
+"Z7 c #4C4732",
+"`7 c #2F2B1F",
+" 8 c #DAD4C2",
+".8 c #D0CCB6",
+"+8 c #CEC8B3",
+"@8 c #C9C3AD",
+"#8 c #C1BDA6",
+"$8 c #8B8A73",
+"%8 c #43482D",
+"&8 c #2F3716",
+"*8 c #35400F",
+"=8 c #435211",
+"-8 c #3D4D04",
+";8 c #282C0E",
+">8 c #4F4D40",
+",8 c #767365",
+"'8 c #C3BEA7",
+")8 c #C8C2A8",
+"!8 c #C6C1A8",
+"~8 c #484330",
+"{8 c #2B281C",
+"]8 c #C8C2AB",
+"^8 c #C4BEA8",
+"/8 c #828268",
+"(8 c #40452B",
+"_8 c #3C4815",
+":8 c #475A0C",
+"<8 c #475B03",
+"[8 c #364209",
+"}8 c #363921",
+"|8 c #7C7869",
+"18 c #C3BDA6",
+"28 c #C8C1A8",
+"38 c #C7C1A7",
+"48 c #D4CEB9",
+"58 c #D1CDB7",
+"68 c #D2CBB6",
+"78 c #CFCBB5",
+"88 c #B3AE99",
+"98 c #686A51",
+"08 c #31371C",
+"a8 c #414E15",
+"b8 c #485E06",
+"c8 c #435601",
+"d8 c #303906",
+"e8 c #313220",
+"f8 c #B8B39C",
+"g8 c #C8C1AA",
+"h8 c #2B291C",
+"i8 c #D3CDBA",
+"j8 c #CECAB3",
+"k8 c #C6C1AA",
+"l8 c #C2BDA6",
+"m8 c #94927B",
+"n8 c #4E5239",
+"o8 c #313818",
+"p8 c #394412",
+"q8 c #47560F",
+"r8 c #495F03",
+"s8 c #3A4803",
+"t8 c #2D3112",
+"u8 c #3F3E33",
+"v8 c #BCB8A0",
+"w8 c #C7C0A8",
+"x8 c #C7C0A7",
+"y8 c #443F2D",
+"z8 c #2C281C",
+"A8 c #C7C1AA",
+"B8 c #BFBAA4",
+"C8 c #7B7C61",
+"D8 c #3D4329",
+"E8 c #333B17",
+"F8 c #3F4D13",
+"G8 c #4F630A",
+"H8 c #4B5F05",
+"I8 c #353E0B",
+"J8 c #373824",
+"K8 c #626053",
+"L8 c #B3AE98",
+"M8 c #C6C2AB",
+"N8 c #ABA790",
+"O8 c #63654A",
+"P8 c #31381C",
+"Q8 c #363F15",
+"R8 c #455414",
+"S8 c #4E6506",
+"T8 c #4C6004",
+"U8 c #323711",
+"V8 c #494839",
+"W8 c #7D796B",
+"X8 c #C3BDA5",
+"Y8 c #453F2D",
+"Z8 c #2A281C",
+"`8 c #CDC7AF",
+" 9 c #C2BEA6",
+".9 c #BCB7A1",
+"+9 c #83826A",
+"@9 c #4A4F34",
+"#9 c #3B4612",
+"$9 c #4A5E05",
+"%9 c #405004",
+"&9 c #363B18",
+"*9 c #5D5B4F",
+"=9 c #A5A08D",
+"-9 c #C5BFA6",
+";9 c #C4BEA5",
+">9 c #45402D",
+",9 c #CCC5AE",
+"'9 c #CBC4AE",
+")9 c #BDB8A1",
+"!9 c #5E6045",
+"~9 c #31381E",
+"{9 c #313914",
+"]9 c #404C13",
+"^9 c #4C6009",
+"/9 c #455605",
+"(9 c #343D0A",
+"_9 c #45472F",
+":9 c #797668",
+"<9 c #C1BBA4",
+"[9 c #C2BCA4",
+"}9 c #C4BEA6",
+"|9 c #2C281D",
+"19 c #2B281D",
+"29 c #C3BCA6",
+"39 c #A4A189",
+"49 c #354014",
+"59 c #445313",
+"69 c #4B6204",
+"79 c #455702",
+"89 c #2B310E",
+"99 c #5B5A4B",
+"09 c #B6B19A",
+"a9 c #2C291D",
+"b9 c #D4D0BB",
+"c9 c #CCC6AE",
+"d9 c #BAB59E",
+"e9 c #77775E",
+"f9 c #43482E",
+"g9 c #313A15",
+"h9 c #3B4712",
+"i9 c #48590D",
+"j9 c #3C4808",
+"k9 c #393D22",
+"l9 c #666357",
+"m9 c #C1BBA3",
+"n9 c #C4BFA6",
+"o9 c #2A281D",
+"p9 c #29271B",
+"q9 c #29261B",
+"r9 c #29261A",
+"s9 c #29271A",
+"t9 c #242319",
+"u9 c #1C1B18",
+"v9 c #25241F",
+"w9 c #282721",
+"x9 c #24231E",
+"y9 c #1B1A16",
+"z9 c #222016",
+"A9 c #262218",
+"B9 c #242118",
+"C9 c #242217",
+"D9 c #232116",
+"E9 c #221F16",
+"F9 c #231F16",
+"G9 c #232016",
+"H9 c #232017",
+"I9 c #232117",
+"J9 c #232217",
+"K9 c #242117",
+"L9 c #252317",
+"M9 c #252318",
+"N9 c #252319",
+"O9 c #262318",
+"P9 c #262319",
+"Q9 c #262419",
+"R9 c #272519",
+"S9 c #27261B",
+"T9 c #2A271B",
+"U9 c #2B2A1C",
+"V9 c #383C26",
+"W9 c #2D341A",
+"X9 c #2F390F",
+"Y9 c #3F4C11",
+"Z9 c #4D6305",
+"`9 c #405006",
+" 0 c #343A19",
+".0 c #3C3C2E",
+"+0 c #353225",
+"@0 c #323022",
+"#0 c #333122",
+"$0 c #343123",
+"%0 c #3B382A",
+"&0 c #393628",
+"*0 c #363324",
+"=0 c #363323",
+"-0 c #353223",
+";0 c #363424",
+">0 c #393626",
+",0 c #3C3827",
+"'0 c #3E3B29",
+")0 c #3E3B28",
+"!0 c #3E3A29",
+"~0 c #2B271C",
+"{0 c #2A261B",
+"]0 c #28261A",
+"^0 c #28251A",
+"/0 c #252419",
+"(0 c #27241A",
+"_0 c #262418",
+":0 c #252118",
+"<0 c #222116",
+"[0 c #221F15",
+"}0 c #252218",
+"|0 c #242318",
+"10 c #272419",
+"20 c #29281A",
+"30 c #2D2E1C",
+"40 c #333720",
+"50 c #2E3517",
+"60 c #343F11",
+"70 c #45540F",
+"80 c #343D14",
+"90 c #3E3E37",
+"00 c #3F3C31",
+"a0 c #343022",
+"b0 c #353123",
+"c0 c #3D3A2C",
+"d0 c #3E3B2E",
+"e0 c #353324",
+"f0 c #363223",
+"g0 c #373324",
+"h0 c #3E3A28",
+"i0 c #212513",
+"j0 c #2D321A",
+"k0 c #313917",
+"l0 c #3E4917",
+"m0 c #465316",
+"n0 c #3D4619",
+"o0 c #36382D",
+"p0 c #393837",
+"q0 c #292827",
+"r0 c #151414",
+"s0 c #060606",
+"t0 c #0A0C07",
+"u0 c #2C311C",
+"v0 c #30371E",
+"w0 c #3D4424",
+"x0 c #52573B",
+"y0 c #50543F",
+"z0 c #51504A",
+"A0 c #2F2D2C",
+"B0 c #1B1A19",
+"C0 c #030302",
+"D0 c #101010",
+"E0 c #0E0D0D",
+"F0 c #212514",
+"G0 c #30351F",
+"H0 c #3C402E",
+"I0 c #57594C",
+"J0 c #62615B",
+"K0 c #575552",
+"L0 c #201F1E",
+"M0 c #161615",
+"N0 c #181817",
+"O0 c #080807",
+"P0 c #0A0A0A",
+"Q0 c #100F0F",
+"R0 c #0F0F0F",
+"S0 c #070706",
+"T0 c #232715",
+"U0 c #292D1D",
+"V0 c #45463C",
+"W0 c #4E4D4B",
+"X0 c #2D2C2B",
+"Y0 c #111110",
+"Z0 c #151514",
+"`0 c #0F0E0E",
+" a c #0F0F0E",
+".a c #1B1D14",
+"+a c #383732",
+"@a c #353433",
+"#a c #242322",
+"$a c #3C3B39",
+"%a c #413F3E",
+"&a c #41403E",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" . + + @ # # $ @ @ @ % & * = - - ; > , ' ) ! ~ { ] ^ / ( _ { { ~ : < < [ , > > } | | 1 2 2 = = * @ 3 4 5 6 7 ",
+" @ + 8 # $ # 8 # @ 9 0 0 a b c - 1 | > , d e , f g h ^ _ _ { i { { j j , ) } e | } 2 k 1 c c 0 l m n o p q r ",
+" @ 8 s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s t u v v w x s y z A B C ",
+" 8 @ s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s D s s s s s u E F F G G x H I J K L M N s s ",
+" 8 @ s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s D s s s s F O F v w x P Q R S T U V W X Y s s ",
+" @ @ s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s D s s s s t F v x w Z ` H ...+.@.#.$.%.&.*.s s =. ",
+" @ 8 s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s D s s t F F w G P -.;.>.,.'.).!.U ~.{.].^./.*.s s (._.:. <.[.}.|.1.2.3.4.5.6. ",
+" @ # s s s 7.7.7.7.7.7.7.7.8.D 9.0.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.D 7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.a.b.c.d.e.f.g.Y s s h.i.j.k.l.m.n.o.p.q.r.s.t.u.v. ",
+" w.$ s s s 7.s s s s s 0.D D D D D s s s s s s s s s s s s s s s s s s D t F x P P Z ;.` ` x.y.z.A.B.C.K D.E.F.G.G.H./.*.s s I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y. ",
+" $ $ s s s 7.s s s s s D D D D D D s s s s s s s s s s s s s s s s s E D F x G P P ;.` x.x.y.y.z.Z.`. +.+++@+#+G.G.G.^./.$+F s %+&+*+=+-+;+>+,+'+)+!+~+{+]+^+/+(+_+ ",
+" :+@ s s s 7.s s s s s D D D D D 0.s s s s s s s s s s s s s s s <+E F D G x P -.Q ` ,.x.y.[+}+|+1+2+3+4+U 5+6+G.G.G.G.H.7+8+s s 9+0+a+b+c+d+e+f+g+h+i+j+k+l+m+n+o+p+ ",
+" q+q+s s s 7.s s s s s D 9.D 8.s s s s s s s s s s s s s s s s E r+w w D P P ` ` x.x.y.[+}+}+s+t+u+v+w+3+x+y+z+G.G.G.G.G.H.g.$+s s s A+B+C+D+E+F+G+H+I+J+K+L+M+N+O+P+Q+R+ ",
+" q+$ s s s 7.7.7.7.7.7.D 7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.D 7.7.7.7.7.7.7.7.7.7.7.7.S+T+U+V+W+X+Y+Z+`+G.G.G. @H./..@s s s s +@@@#@$@%@&@*@=@-@;@>@,@'@)@!@~@{@]@^@/@(@_@ ",
+" 8 8 s s s 7.s s s s s D s s s s s s s s s s s s s s s r+r+F F v G P P D ` :@<@,.,.y.}+|+[@t+}@|@1@2@3@4@5@6@M G.G.G.G.G.G.G.H.&.Y s s s s 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@ ",
+" @ % s s s 7.s s s s s D s s s s s s s s s s s s s s s F E v x w -.;.Q D :@v@,.w@x@|+|+t+}@y@z@A@u+B@C@D@E@F@[email protected].^.7+Y s s s s H@I@J@K@L@M@N@O@P@Q@R@S@T@U@V@W@X@Y@Z@`@ #.#+#@### ",
+" @ @ s s s 7.s s s s s D s s s s s s s s s s s s r+r+F F v x P P $#` ` D x.y.[+|+|+|+t+y@|@A@A@%#&#*#=#-#K ;#>#G.G.G.G.G.G.G.G.G.H.&.Y s s s s ,#'#)#!#~#{#]#^#/#(#_#:#<#[#}#|#1#2#3#4#5#6#7#8#9# ",
+" 9 9 s s s 7.s s s s s D s s s s s s s s s s s r+F E F w x x P ` ` ,.x.D 0#}+s+|+t+t+y@|@A@%#%#&#&#a#b#c#d#e#f#G.G.G.G.G.G.G.G.G.G.g#/.Y s s s x 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# ",
+" 9 K#s s s 7.7.7.7.7.7.D 7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.8.D 9.D 7.7.7.7.7.7.7.7.7.7.7.L#M#N#O#P#Q#R#S#Z+G.G.G.G.G.G.G.G.G.G.T#7+$+s F U#V# W#X#Y#Z#`# $.$+$@$#$$$%$&$*$=$-$;$>$,$'$)$!$~${$]$^$/$($_$:$<$[$}$ ",
+" |$1$s s s 7.s s s s s D s s s s s s s s s E E F w v P Z ;.` 0.D D D D D |+t+}@}@|@2$3$U#&#&#4$5$1@6$7$8$9$0$a$G.G.G.G.G.G.G.G.G.G.G.G.T#7+b$y@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$s s s 7.s s s s s D s s s s s s s r+F v x x P Z P -.` ,.D D D D D D |+N$y@A@%#U#O$&#4$4$1@u+Y *#P$Q$R$S$T$G.G.G.G.G.G.G.G.G.G.G.G.G.U$V$W$X$Y$Z$`$ %.%+%@%#%$%%%&%*%=%-%*$;%>%,%'%)%z#!%~%{%]%^%/%(%_%:%<%[%}%|%1% ",
+" |$@ s s s 7.s s s s s D s s s s s r+E F v w x P Z P ` <@,.,.D D D D D 0.}@|@2$A@%#O$O$&#2%1@$+Y Y 3%4%5%6%7%8%G.G.G.G.G.G.G.G.G.G.G.G.G.`+9%0%a%b%c%d%e%j$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% ",
+" |$a s s s 7.s s s s s D s s s s r+<+F v G x Z Q ` ` ,.x.,.[+0.9.D 8.}@|@|@%#H%U#U#I%4$5$u+$+J%K%L%M%N%O%P%Q%R%G.G.G.G.G.G.G.G.G.G.G.G.S%T%U%V%W%X%Y%Z%`% &.&+&@&#&$&%&&&*&=&u#-&;&>&,&'&)&!&~&{&]&^&/&(&_&:&<&[&}&|& ",
+" |$|$s s s 7.7.7.7.7.7.D 7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.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&D&E&F&G&H&I&J&K&L&M&N&O&P&Q&R&S&T&U&V&W& ",
+" |$a s s s s s s s s s D s r+u F F w P x P ` x.:@<@,.[+|+|+s+X&}@y@z@z@%#%#&#4$1@5$5$Y *.*.Y&8+Z&Z&`& *.*+*@*#*$*%*&***=*-*;*>*,*'*'*)*!*~*{*]*^*/*(*_*:*<*[*}*|*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* ",
+" a a s s s s s s s s s D E F F v w P -.` ` ` r*,.y.}+}+|+t+t+y@}@z@%#U#s*O$&#t*1@1@Y *.8+u*v*w*Z&`&P$C@x*y*z*A*A*B*#*C*D*E*F*G*H*H*I*J*K*L*M*N*O*P*Q*R*S*T*U*V*W*X*Y*Z*`* =`*.=+=@=#=$=%=&=*===-=;=>=,='=)=!=~={=]=^=/=(= ",
+" * _=s s s s s s s s s D E v x x P $#$#` <@,.y.[+w@|+|+t+}@}@z@A@A@%#z.O$5$1@u+u+$+*.:=8+v*Z&<=a#[=}==#|=.*1=2=3=4=5=6=7=8=@*4=9=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=A=B=C=D=E=F=G=H=I=J=K=L=M=N=O= ",
+" * P=s s s s s s s s O E G v P -.Q ` >.,.,.,.}+}+|+t+}@}@|@A@%#U#U#U#&#t*5$Y Y Y Y&8+Q=6$R=<=S=T=7$U=V=W=X=Y=Z=`= -.-+-@-@-+-#-$-%-&-*-=---;->-,-'-)-!-~-{-]-^-/-(-_-:-<-[-}-|-|-1-2-3-4-5-6-7-8-9-0-a-b-c-d-e-f-g-h-i- ",
+" a |$s s s s s O t F v G w P -.` ` ` H ,.,.w@x@|+s+}@}@z@A@%#%#U#&#D I%1@1@Y Y Y&8+6$Z&j-<=S=T=3%k-l-U=m-n-o-p-o-x*o-q-q-q-q-q-r-s-t-u-v-w-x-y-z-A-B-C-D-E-F-F-G-H-I-J-K-L-M-N-O-P-Q-R-R-S-T-U-V-W-X-Y-Z-`- ;f-.;+;@; ",
+" #;#;s s s s s t $;v x x P ` Q ` x.x.y.,.x@|+s+t+}@}@|@2$U#O$&#4$4$D u+u+J%%;Y&v*Q=6$j-j-&;S=*;3%`&=;-;;;Q$9$|=9$>;,;c#';';);p-!;~;{;];^;/;(;_;:;<;[;};|;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; ",
+" b b s s s s r+v v G P P Q ` >.<@x.y.y.}+|+[@t+}@R z@[email protected]#O$&#t*1@D u+*.Y&8+w*Z&j-<=j-S=T=`&t;`&t;u;v;m-w;x;n-x;n-y;z;y;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;`; >.>+>@>#>$>%>&>*>=>->;>>>,>'>)>!>~> ",
+" b - s r+t F v w P P ;.` <@:@<@0#[+{>x@s+X&X&}@A@z@H%U#U#&#I%5$]>Y D *.8+Q=6$6$R=j-S=T=*;3%t;`&-;-;^>^>/>m-(>_>:><><>[>}>|>1>B;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>D>E>F> ",
+" b b <+E F G x w P G>;.<@<@,.,.[+[+|+X&t+t+y@z@2$%#O$z.4$4$1@1@.@:=D Y&v*Z&j-<=H>S=T=*#`&`&t;-;-;v;I>I>J>K>L>M>(>_> *w;w;N>O>P>Q>R>S>T>U>V>W>X>X>Y>Z>`>E& ,.,+,@,#,$,%,&,*,=,-,;,>,,,',),!,~,{,],^,/,(,_,:,<,[, D ",
+" b b F },v P P Q Q ` >.x.,.y.x@D |+|,}@}@|@z@%#z.&#&#4$5$1@$+Y %;Y&D 6$6$Z&j-T=T=1,`&t;t;2,2,v;3,I>4,5,D 6,7,M>(>_>8,8,9,0,O>a,b,c,d,e,f,g,h,i,j,k,l,m,q$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, D ",
+" 2 N,F w x P Q ;.` ` ,.,.[+y.}+D s+}@O,A@%#U#P,&#&#2%5$1@$+Y Y&8+6$D Q,<=j-a#T=*;`&`&t;-;^>3,I>7$4,5,R,D />m-(>_>_>_>_>S,T,U,,;V,W,X,Y,Z,`, '.'+'@'#'$'%'&'*'='-';'>',''')'!'~'{']'^'/'('_':'<'['}'|'1'2'3' D ",
+" N,N,P x P ` ;.:@x.v@4'w@x@s+s+D }@y@z@U#U#U#&#4$5$1@$+Y Y&8+8+v*w*D j-<=a#*#5'6't;2,^>^>7$7'I>4,5,J>8'D /._>(>m-m-9'0'a'b'|>c'd'e'f'g'h'i'j'k'l'X>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'J,L'M' D ",
+" - - P P ;.` <@x.,.[+[+|+s+}@t+D A@A@H%%#O$4$I%5$1@Y Y Y&Y&Q=v*Z&Z&D S=T=*;`&`&`&-;^>v;3,^>I>N'J>O'P'8'D Q'm-/.9'9'R'V$L>S'}>T'.+U'V'W'X'Y'Z'`' ).)+)@)#)$)%)&)*)=)-);)>),)')))!)~){)])^)/)()_):)<)[)})|)1) D 2)3)4) ",
+" 2 1 Q ` <@7.7.7.7.7.7.7.7.7.7.D 7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.D 7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.D 7.7.7.7.7.7.7.5)5)5)6)7)8)9)0)a)b)Y'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) ",
+" 2 | >.<@,.7.w@{>}+|,J)}@}@z@A@D z.U#&#4$1@u+Y .@Y :=6$v*6$Z&j-S=T=D `&`&2,2,^>^>3,7$I>4,5,R,P'6,6,6,K)D K>/.R'L)M)V$N)V$S,[>O)P)Q)R)S)T)U)|;V)W)X)Y)Z)`) !.!+!@!#!$!%!&!*!=!-!;!>!,!'!)!!!~!{!]!^!/!(! _!:!<! ",
+" 2 2 x.,.,.7.}+|+[@t+y@y@A@A@U#D &#I%5$1@1@$+*.Y&8+6$6$j-Z&H>T=T=1,D `&t;2,-;^>7'I>[!J>J>J>R,}!6,|!6,&.D &.R'R'V$V$V$1!2!3!}>c#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!D!E! ",
+" ; | ,.0#}+7.|+|+}@y@z@A@%#U#U#D I%t*F!1@Y Y&8+G!Z&Z&<=<=S=T=*;`&`&D t;-;v;7'7$I>J>J>J>P'6,}!H!K>K>I!/.D L>J!L>V$N)2!2!K!L!M!N!O!P!Q!R!S!T!U!V!W!X!Y!Z!`! ~.~+~@~#~$~%~&~*~=~-~;~>~,~'~)~!~J'~~{~]~^~ D /~(~_~ ",
+" :~:~}+[+|+7.t+t+|@A@z@U#O$z.4$D 1@u+Y Y 8+8+8+v*Z&j-<=S=T=3%1,t;t;D -;^><~I>N'N'J>J>[~[~6,}~K>K>/.7+/.D J!V$V$|~2!1~2~3~4~5~C;7&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 e |+s+J)7.7.7.7.7.7.7.7.7.7.D 7.7.7.7.7.7.7.7.7.7.7.7.7.7.8.D 9.D 7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.D 7.7.7.7.7.7.7.7.5)5)6)E~F~G~H~I~J~K~L~M~N~O~P~Q~R~S~T~U~V~W~X~Y~Z~`~ {.{+{@{#{${%{&{*{={ D -{;{ ",
+" > > t+J)[email protected]@%#>{P,&#&#4$5$5$D *.Y Y&8+6$Z&<=&;a#T=T=*;0.D D D D D I>4,5,J>J>R,[~H!,{}~K>K>&.R'L)J!V$D '{9'){){1~K!K!4~!{~{{{U ]{^{/{({_{:{<{[{}{|{1{2{3{4{5{6{7{8{9{0{a{b{c{d{e{f{g{h{i{j{k{l{ D m{n{ ",
+" > :~[@}@}@7.H%%#U#O$5$1@1@1@*.D Y&Y&6$6$j-j-S=T=T=*;3%=;D D D D D D 5,N'J>O'}!6,H!K>K>K>/>/./.R'L>N)'{D 2!o{3~3~K!p{S,4~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{ ",
+" | } }@z@[email protected]#&#&#4$5$u+u+Y *.D 8+v*6$j-<=a#T=3%`&t;t;2,D D D D D 0.J>J>[~`{6,6,K)K>&./.R'R' ]V$V$V$2!D 3~1~.]K!+]@]p{#]!{$]%]&]*]=]-];]>],]'])]!]~]{]]]^]/](]_]:]<][]}]|]1]2]3]4]5]6]7]8]9] D 0]a]b] ",
+" :~> z@A@%#7.&#I%1@1@1@Y J%Y 8+D 6$Z&j-&;T=T=3%6't;c]t;u;0.9.D 8.d][!l-R,6,6,6,K>&.7+/.J!R'L>V$e]1!2!2!D 3~0'.]K!p{f]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] D O] P]Q]R]S] ",
+" } > U#%#O$7.7.7.7.7.7.7.T]D 9.D 7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.8.D 9.D 7.7.7.7.7.7.7.7.5)5)U]V]W]X]Y]Z]`] ^.^+^@^#^$^%^&^*^=^-^;^>^,^'^)^!^~^{^]^^^/^(^_^:^ <^[^}^|^1^2^ ",
+" , , U#O$&#7.1@u+$+Y 0.D 3^D D D j-T=*#T=3%t;=;4^^>^>7'I>I>J>J>R,[~6,6,6,K)&.&./.R'R' ]V$V$1!0.D D D D D S,+]@]@]#]5^5^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^D^E^F^G^H^I^ ",
+" , ) J^5$4$7.u+*.Y&Y&D D D K^L^D T=*;*;`&t;2,^>^>^>I>7'4,J>R,R,O'6,,{}~K)&./.M^/.J!V$V$V$2!2!D D D D D D p{#]4~5^5^N^q{!{O^^.P^Q^R^S^T^U^V^W^X^Y^Z^`^ /./+/@/#/$/%/&/*/=/-/;/>/,/'/)/!/~/{/]/^///(/_/:/ ",
+" </[/5$t*]>7.Y Y 8+Q=D D D D D 0.*#`&`&t;t;^>^>7$7'I>I>J>}/P'P'H!6,K>K>&.7+/.J! ]V$V$N)2!){1~D D D D D 0.#]g]L!5^|/q{|/1/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/u+7.%;8+8+6$0.9.D 8.3%6'`&t;2,u;-;7$v;I>4,[!R,R,[~6,6,H!K>&.7+/.7+L)M)M)e]9'1!1~3~3~0.9.D 8.f]#]L!L!5^C/|/!{D/h]E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/`/ (.(+(@(#($(%(&(*(=(-(;(>(,( ",
+" [ [ Y $+Y&7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.'()('(7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.)(!(~({(](7.7.7.5)5)5)6)^(/(((_(:(<([(}(|(1(2(3(4(5(6(7(8(9(0(a(b(c(d(e(f(g(h(i(j(k(l( ",
+" [ [ Y Y&G!Q=Z&Z&<=<=a#*#3%`&`&t;t;u;^><~<~I>5,J>}/R,[~6,m(K>K>&./.7,n(o(p(q(r(s(){){t(K!.]u(@]v(4~4~T,5^w(x(y(z(A(B(C(D(D(E(F(G(H(I(J(K(L(M(N(O(P(Q(R(S(T(U(V(W(X(Y(Z(`( _._+_@_#_$_%_&_*_=_ ",
+" { -_8+Y&6$j-R=<=;_T=*;*#3%`&-;^>^>^>v;4,I>5,J>R,P'[~,{K>K>&./.R'R'R'>_,_'_)_!_~_{_]_K!^_+]v(p{4~g]5^N^q{|//_(___:_<_[_}_T#E(|_1_2_3_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_ ",
+" < ! v*6$6$j-j-T=T=*#`&=;4^^>-;3,<~7'N'J>J>R,P'}!6,6,K>K>g./.R'R'J!J!t_u_v_w_x_y_z_A_B_C_p{4~4~5^N^|/|/D/1/D_E_:___F_G_H.E(^.H_1_I_J_6=V K_L_M_N_O_P_Q_R_S_T_U_V_W_X_Y_Z_`_ :.:+:@:#:$:%: ",
+" ! ! Z&6$<=<=T=T=*;`&t;t;-;^>3,&:I>4,5,R,R,}!6,H!m(}~K>g.*:R'R'J!V$V$=:-:;:>:,:':):!:~:{:]:^:5^5^C/|/!{h]/:(:_::_!:::<:[:E(}:U$f.|: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: ",
+" { { j-&;S=*#1,`&`&2,2,^>^>v;<~I>I>5,R,R,O'6,m(K)&.g.&.g./.L>V$V$2!2!p:q:r:s:t:u:v:w:x:y:z:A:B:|/1/|/1//:E/C:D:E:F:F:G:H:U$H_I:J:K:L:M:7=#.N:O:P:Q:R:S:T:U:V:W:X:Y:Z:`: <.<+<@<#<$<%<D D D ",
+" &<^ <=T=T=3%`&t;t;2,^>3,7$I>N'J>J>O'O'6,|!m(}~K>&././.R'J!M)N)9'*<o{=<-<;<><,<v:'<)<!<~<!:<_{<]<}:1/O^O^D(^</<x_(<_<q::<<<H_[<[<}<|<1<2<3<4<5<6<7<8<9<0<a<b<c<d<e<D D D f<D D D D D D D ",
+" g<h<S=T=*;`&t;2,-;^>^>I>I>N'[!J>R,[~6,6,|!}~&.g./.R'M)M)V$N)1!*<2!3~i<j<k<l<m<n<o<)<p<(<q<r<s<t<u<v<E/w<D(x<y<z<A<B<x:C<D<E<J:F<1_G<H<I<J<K<L<7_M<N<O<P<Q<R<S<T<U<D D D D D D D D D D ",
+" V<V<5'3%`&t;-;^>7'I>I>W<W<J>R,[~`{6,|!K)K>g.7+M^X<J!V$V$e]2!){1~Y<K!.]Z<`< [.[+[@[#[$[$[%[&[):*[=[-[;[D(^.>[,['[v:)[![~[{[][^[^[/[([_[:[<[[[}[|[1[2[3[4[5[6[7[8[9[D D D D D D D D D ",
+" 0[0[t;t;2,-;^>&:I>I>5,8.D 9.0.[~6,m(K>&.g.R'R'L)L>N)1!1!2!2!3~3~K!S,p{p{|/a[b[c[d[e[f[g[h[><i[x:F_j[v_k[l[>[<_m[n[)[o[p[q[r[s[1_t[u[v[w[x[y[z[A[B[C[D[E[F[G[H[I[D D D D D D D D ",
+" J[K[4^2,^>v;3,I>4,0.D D D D D ,{}~K>&.&.R'J!J!V$V$2!2!2!){2~3~p{p{p{#]#]4~|/L[M[N[O[P[Q[R[)<S[T[U[*[*[V[W[X[Y[m[n[~]o[Z[`[ }1_1_.}+}@}#}$}%}&}*}=}-};}>},}'})}!}~}D D D D D ",
+" {}]}-;^>v;<~I>4,N'D D D D D D }~7+&././.L)J!M)1!2!){){1~3~K!^_S,#]4~#]L!5^C/|/|/U$^}/}(}$[_<_}Q[,<T[:}<}[}}}Y[m[n[|}1}2}3} }/[.}4}5}6}7}8}9}0}a}b}c}d}e}f}g}h}i}j}D D D D D ",
+" k}k}^>3,I>4,[!5,R,D D D D D 0.K>7+R'L)L>V$V$e]2!2!){1~3~.]p{p{#]@]#]g]C/5^q{l}1/1/w<m}n}o}p}q}r}s}t}u}v}w}x}![y}o<w:!:z}A}B}4}t[C}D}E}F}G}H}I}J}K}L}M}N}O}P}Q}R}S}D D D D ",
+" T}T}3,I>N'N'5,O'R,D 9.D 8.K>g./.R'L)L>V$N)2!1!){1~t(K!u(S,p{p{4~5^5^5^U}|/D/V}/:O^W}D(H_X}Y}Z}`} |.|_<':+|@|#|T[n[$|F_%|&|*|=|([D}-|;|>|,|'|)|!|~|{|]|^|/|(|_|:|<|D D D D ",
+" [|[|I>[!J>7.7.7.7.D 7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.}|||1|2|3|4|:}u}5|.|6|7|v:8|m[9|0|a|b|7.7.5)5)6)c|d|e|f|g|7.h|i|j|k|l|m|n|o|p|p|L^ ",
+" q|q|N'J>R,7.[~6,6,D K>/./.R'R'R'V$1!1!2!){3~t(3~.]S,p{v(p{4~g]5^N^|/!{1/h]/:O^E/D(+}r|s|t|u|v|w|x|y|z|&[t}A|7|B|C|j[D|E|F|G|C}D}H|T%I|J|H}K|L|M|7.N|O|P|Q|R|S|T|U|V|W|X| ",
+" Y|Z|J>R,}!7.6,,{K>D g.R'R'L)M)V$|~1!2!){1~.].]p{p{@]f]#]g]5^5^|/D/1/1/h]E/w<w<`| 1.1+1@1#1$1%1y|&1i^1(':C|#[*1=1-1;1>1,1'1)1!1~1{1]1^1/1(1_1!|:17.<1[1}1|1112131415161p| ",
+" 7171[~[~6,7.K>K>K>D /.J!J!V$V$1!2!2!1~K!.]S,.]81@]4~4~g]N^N^|/|/D/D/D O^w<D(9101a1b1c1d1e1S/f1i^j[!::}g1h1i1r}j1k1l1m1n1o15}5} @T%p1q1r1s1t1u1v17.w1x1y1z1A1B1C1D1W|E13^ ",
+" F1F16,6,}~7.G1&.7+D J!V$L>e]e]2!){1~K!.].].]@]4~#]g]5^5^N^q{D/h]h]E/D 6^D(H1I1t|J1K1L1y|y|M1Y[N1F_____O1P1Q1R1S1T1U1V1W1!1X1Y1Z1`1 2.2+2@2#2$2%27.&2*2=2-2;2>2,2'2)2L^K^ ",
+" !2!2|!6,K>7.7.7.7.D 7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.D ~2{2]2^2/2/2(2_2S/:2<2*[:_9|9|__F_[2}2|21222n<32427.7.5)5)526272829202a2b27.c2d2e2f2;2g2h2i261L^K^ ",
+" j2k2K>K>G17.R'R'L>D V$'{2!2!1~3~K!^_+]p{4~4~L!5^N^q{q{!{1//:O^O^w<D(D l2b1/28:m2s<n2F_N1*[N1:_9|9|9|o2p25}q2r2s2+[t2u2v2D} @w2x2y2z2A2B2C2D2E2F27.G2H2I2J2K2K2L2g<E13^K^ ",
+" M2N2&./.&.7.J!M)V$D 2!2!){3~K!S,.]+]v(#]4~4~N^5^q{|/!{V}O2O^E/w<D(H.D P2Q2R2S2;:T29|9|__:_!:U2__V2W2X2Y2+}Z2`2 3.3+3@3#3$3G.%3x2&3*3=3-3;3>3,3'37.)3!3~3{3K2]3^3/3L^K^D ",
+" (3:|/./.J!7.L>e]|~D 2~2~3~K!.]p{p{p{#]g]5^C/N^|/1/D/h]E/E/w<}__3H.^.D :3<3!::}!:T29|9|T2[3}3|3132333t[43+}Y253p[63!<73J183`+9303a3b3c3d3e3~|f3g37.h3i3j3k3l3m3n3o3E1K^D ",
+" p3q3/.J!J!7.J!1!2!D K!0'K!+]S,p{f]g]4~g]N^|/|/!{1//:E/E/D(D(_3H.r3E(D s3t3u3v3w3x3y3z3A3B3C34}t[t[t[+}C}D3E3X1F3G3H3;:I3J3K3]1L3M3N3O3P3Q3v1R3S37.T3U3V3W3j3X3Y3Z33^D D ",
+" `3:|L>L>J!7.7.7.7.D 7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.D 4.4+4+4@4#4$4'(7.7.7.7.7.7.7.7.7.7.7.7.%4&4T2F_=[*4=46)-4;4>4,4'4)4!4~4{47.]4^4l3/4(4_4:4<4K^D D ",
+" [4[4V$e]J!7.J!){3~D S,p{@]4~4~g]5^q{w(|/1/1/1/O^E/6^D(D(H.H.}4}:H_H_D [<|4|4^[F<^[14/[.}24t[=|43C}C}D3X1X13444445464n2*[74849404a4b4c4w|d4e4f4g47.h4i4(4j4k4l4m4:4D D D ",
+" [4n49'1!J!7.J!3~S,D @]p{4~4~g]5^N^|/q{!{h]E/E/6^D(}_}_^.^.U$o4H_p4[<D |4J:F<q4s[144}}<4}=|([+}+}!15}X1r44444Y1 @s4t4u4!:v4w4x4y4z4A4B4C4D4E4F4G47.j3/4H4I4J4K4L4M4D D D ",
+" `3`3o{N4J!7.J!^_+]D @]v(4~g]N^|/|/1/D//:O4E/P4D(H.H.}4E(Q4H_H_E<p4R4D S4F<1_/[/[/[24t[T4+}U4C}D3X1X1V44444W4 @G.~1X4Y4N1;:Z4`4 5'|.5+5@5#5$5%5&57.(4I4*5=5_4_4-5:4D D D ",
+" `3;51~3~0'7..]+]#]@]#]5^5^q{q{>51/1/O^O^w<D(}_T#H.H.Q4U$H_H_E<[<|4J:D ^[1_/[/[t[4}u[([+}C}D3!1X1,54444'5 @ @)5!5S%~5{5u4*[]5^5/5(5_5:5<5[5}5|5157.I4I4i42535455555D D D ",
+" ;565K!K!u(7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.D 7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.75T2n2;:859505a5b5c5E4d5e56)7.*5i4i4f5l4g5h5i5D D D ",
+" j5j5.]p{p{p{p{4~5^5^N^|/>5D/h]h]O^6^w<}_T#^.^.U$}:H_p4E<[<[<J:F<k5q4D /[K:t[=|t[+}C}D3X15}r4r444Y1W4 @G.!5!5S%l5l5`+m5n5!:Y[>:o5p5q5r5s5t5u5v5w5i4]3]3J4x525x5y5h5D D D ",
+" z5j5.]p{4~4~g]5^5^5^|/|/1/O^1/E/6^D(H.^.^.E(Q4H_H_A5[<J:J:F<F<8.D 9.D .}=|u[+}+}!1D3X1X1V4r4Y1L: @G.G.S%!5S%`+B5C5D5K2E5)_*[F5G5H5I5J5K5L5M5N5*5O5w5P5Q5~5R5S5i5T5D D D ",
+" z56581#]4~g]L!C/U5q{D/h]/:E/E/w<D(H.H.E(E(V5Q4H_E<[<R4|4^[0.D D D D D =|=|([C}C}C}X1,544Y1W4'5G. @)5W5!5X5`+Y5D5Z5>2j3`5 6z_y_*4.6+6@6#6$6%6i4&6w5w5*6=6*6=6=6i5i5D D D ",
+" -6z54~L!5^g]q{q{D/|/V};6E/6^w<H.^.^.E(U$Q4H_A5|_[<|4J:^[q4D D D D D D 43>6+}D3E3X1V434Y144W4G.G.W5S%Z1w2`+C5Z5,6>2;2w5'6P:)6!6~6{6]6^6/6(6_6w5J4*6*6*6:6=6<6[6K[i5D D D ",
+" z5z5g]5^5^C/D/|/D//:O^E/w<D(D(g#^.U$U$H_H_p4E<[<J:F<^[s[/[D D D D D 0.C}D3D3!1V4,54444Y1G.G.}6W5!5X5`+`+Z5Z5D5;2;2V3|616263646566676869606w5J4*6*6:6S5=6<6x5a6i5K[D D D ",
+" z5b65^q{q{|/D/1/O^E/D(D(D(c6^.E(U$Q4H_d6[<[<e6J:^[^[s[1_f60.9.D 8.C}C}C}g65}X1444444 @ @)5G.)5Z1S%l5`+C5D5>2>2h6i6Q5j6k6l6m6n6o6p6q6r6s6t6*6*6:6u6=6<6<6a6'6v6K[i5D D D ",
+" w6x6|/q{|/V}1/h]O^E/D(T#T#E(U$V5H_p4|_E<e6e6J:f.1_14/[/[t[t[T4=|43C}!1X1X144,5Y1'5'5G.)5!5S%X5l5B5Z5Z5>2;2J2;2K2I4y6z6A6r2B6C6D6E6O/F6G6H6*6S5=6<625<6'6v6I6J6i5K6D D D ",
+" b6w6!{1/1/h]E/E/D(D(T#^.E(U$}:H_p4A5[<|4J:F<^[^[q4f6}<t[=|([+}C}C}5}X1,5r444Y1W4'5 @W5!5l5`+l5C5Z5C5Z5h6g2K2V3/4L6M6N6O6P6Q6R6S6T6U6V6W6X6S5=6=6Y6[6I6I6Z6Z6`6 7i5D D D ",
+" -6.7!{h]h]E/E/w<H.H.H.E(Q4H_H_d6[<[<F(F<^[q4q4/[}<4}4}=|43C}!15}g6X1,5,544+7 @G.)5G.S%Z1`+`+C5Z5,6>2K2K2K2k3V3@7L6#7$7%7P6&7*7=7}(-7;7>7,7<6<6'6'6'6v6J6Z6'7)7i5i5D D D ",
+" !7!7h]O^w<D(D(T#^.H.E(Q4Q4p4[<[<e6J:J:s[^[s[f6/[24t[+}+}C}D3!1X1,5X14444W4W4G.S%S%S%l5`+`+`+Z5>2>2J2h6~7j3j3k4{7]7^7/7(7B6_7:7<7[7}7|717<6x5a6'62737Z6`5475757k}k}D D D ",
+" 6777E/E/w<T#_3^.U$Q4U$87[<p4e6|4F<97f.1_/[.}24t[=|+}43C}07E3X1,54444+7W4 @)5)5S%X5Z1`+Y5D5C5,6>2h6K2K2V3W3W3a7b7c7d7e7f7g7h7i7j7k7l7m7n7'6o7I62737Z6)7575757p7[|q7D D D ",
+" r7s7E/D(H.H.E(E(L[H_H_A5E<[<e6F<F<t714/[f624t[=|+}43D307g6V4r44444W4G. @)5u7S%S%`+C5C5D5>2;2K2g2k3v7V3j3(4/4]325w7x7y7z7A7B7~|C7D7E7F7'6[6J637Z6`6`5)757G7G7H7I7J7D D D ",
+" K7L7M7c6^.J:J:J:87p4[<|4J:J:F<F<s[1_/[2424t[+}C}N75}E3X1D}V4Y1Y1'5 @)5u7S%l5X5l5Z5C5>2D5>2K2K2K2V3W3j3(4H4]3_4w7O7P7Q7R7S7Q3T7U7V7W7X7'627J6`6`6`55757p7H7H7H7Y7Z7D D D ",
+" `7`7H.H.}4J:J:J:E<[<[< 8F<F<^[14/[}<.}t[=|43C}+}D3E3,5X1,544Y1 @ @}6S%S%S%l5`+`+.8>2>2;2K2K2k3j3+8W3(4H4I4]3@8#8$8%8&8*8=8~|-8;8>8,8'8J6Z6`6`6)8)7!8H7H7H7H7H7N2~8D D D ",
+" {8{8E(E(V5J:J:J:[<[< 8F<^[1_14f64}24t[=|+}C}D3D3X134r4Y1Y1 @W4G.S%S%S%l5l5C5D5C5>2;2K2~7~7V3W3/4/4k4I4k4*5:6]8^8/8(8(1_8:8<8[8}8|818Z6Z6`65728G738H7H7H7H7H7H7;5;5D D D ",
+" {8{8Q4Q4H_A5A5J:F< 8^[^[1_/[/[K:4}t[=|+}C}D3X1X1r44444 @48G.W5G.W5S%5868C5C5D5>278K2~7j3V3/4/4/4(4I4*5i4*6=645889808I}a8b8c8d8e8f8Z6g8)7)75738H7H7H7H7H7H7H7H7`3`3D D D ",
+" h8{8Q4H_|_E<J:F<^[s[s[1_/[}<t[t[t[+}C}C}D3D3,5V444+7W4 @i8G.S%Z1l5l5`+C5Z5D5>2h6K2V3j8j3W3/4(4I4I4*5]3&6=6k8l8m8n8o8p8q8r8s8t8u8v8`6'7)7w8H7x8H7H7H7H7H7H7H7H7`3y8D D D ",
+" {8z8H_p4|4|4F<f.s[1_1_f6244}t[43+}D3D307X1X1V44444 @G.)5!5S%S%`+C5Z5Z5D5>2h6K2K2K2V3V3W3(4k4k4*5i4]3&6w5=6A8B8C8D8E8F8G8H8I8J8K8L8575757x8H7H7H7H7H7H7H7H7H7H7y8`3D D D ",
+" z8{8p4[<|4F<F<^[t7/[/[K:t[43+}C}C}C}X1D}r4r444 @48i8)5)5!5X5l5`+C5Z5>2>2J2K2~7~7V3W3W3(4k4I4i4i4w5w5P5S5M8w7N8O8P8Q8R8S8T8U8V8W8X857G7!8H7H7H7H7H7H7H7H7H7H7H7`3Y8D D D ",
+" z8Z8[< 8F<s[s[s[}<24t[=|+}+}C}C}g6X1X13444Y1 @ @)5~1S%Z1l5l5Y5D5>2;2;2K2K2K2V3W3/4(4k4I4I4i4`8w5J4{7*6a6 9.9+9@9(1#9e3$9%9&9*9=957H7H7H7-9;9-9H7H7H7H7H7H7H7H7>9>9D D D ",
+" z8{8S4^[^[s[1_/[t[t[t[=|+}C}!1X1V434r444Y1 @G.u7)5S%S%`+`+Y5D5>2>2;2h6k3~7j3/4(4/4H4I4I4i4w5w5{7,9*6'9]8!8)9!9~9{9]9^9/9(9_9:9<9H7H7H7H7[9-9}9-9-9H7H7H7H7H7H7>9>9D D D ",
+" |919^[s[1_/[4}4}t[=|+}C}D3D3X1X1D}44W4Y1 @ @~1!5S%5858`+Z5D5>2>2;2h6V3V3V3/4W3/4k4I4i4w5&6w5J4P5*6S5x5l42939q1+249596979899909H7H7H7H7}9[9X8-9-9-9H7H7H7H7H7H7>9`3D D D ",
+" a919s[/[4}24t[=|=|43C}D35}X1b94444Y148G.)5!5S%S%`+C5C5D5>2>2>2h6~7V3j3W3(4$3k4k4a7i4]3w5c9P5*6R5=6=6'6}9d9e9f9g9h9i9<8j9k9l9H7H7H7H7-9[9m9;9n9-9H7H7H7H7H7H7H7`3`3D D ",
+" a919o9i}p9q9r9s9t9u9v9w9x9y9z9A9B9C9D9E9F9G9H9I9I9J9J9K9K9C9L9M9M9M9M9N9O9P9Q9Q9Q9Q9R9S}S}S}S}S9q9r9T9Z8U9V9W9X9Y9Z9`9 0.0+0@0#0$0R}%0&0*0=0*0-0;0>0,0'0)0!0'0>9(3D D ",
+" a919~0i}{0q9s9s9]0^0/0C9(0Q9_0:0C9I9<0[0H9H9H9I9I9J9K9C9C9!}}0|0M9M9M9O9M9/0Q9Q91010(0(0S}S}S}S9p9p9T9203040506070H8809000L7K7a0b0c0d0&0;0*0e0f0g0>0,0)0h0'0'0(3(3D D ",
+" D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D i0j0k0l0m0n0o0p0q0D D D p|r061s0p|3^D D D D D D D D D D D D ",
+" D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D t0u0v0w0x0y0z0A0B0V|C0D )2D0E0E1E1L^D D D D D D D D D D D D ",
+" D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D F0G0H0I0J0K0L0M0N0O0P0W|O051Q0R0S0K^D D D D D D D D D ",
+" T0U0V0n W0X0Q0Y0Z0B0Y0`0 R0 a ",
+" .a+a@a #a ",
+" $a %a ",
+" &a ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" "};
diff --git a/data/pixmaps/icons/mm-mime-hi64-rosegarden.png b/data/pixmaps/icons/mm-mime-hi64-rosegarden.png
new file mode 100644
index 0000000..dd2f0e7
--- /dev/null
+++ b/data/pixmaps/icons/mm-mime-hi64-rosegarden.png
Binary files differ
diff --git a/data/pixmaps/icons/rg-rwb-rose3-128x128.png b/data/pixmaps/icons/rg-rwb-rose3-128x128.png
new file mode 100644
index 0000000..b20ccd6
--- /dev/null
+++ b/data/pixmaps/icons/rg-rwb-rose3-128x128.png
Binary files differ
diff --git a/data/pixmaps/icons/rg-rwb-rose3-16x16.png b/data/pixmaps/icons/rg-rwb-rose3-16x16.png
new file mode 100644
index 0000000..4839783
--- /dev/null
+++ b/data/pixmaps/icons/rg-rwb-rose3-16x16.png
Binary files differ
diff --git a/data/pixmaps/icons/rg-rwb-rose3-32x32.png b/data/pixmaps/icons/rg-rwb-rose3-32x32.png
new file mode 100644
index 0000000..0a7a7e7
--- /dev/null
+++ b/data/pixmaps/icons/rg-rwb-rose3-32x32.png
Binary files differ
diff --git a/data/pixmaps/icons/rg-rwb-rose3-48x48.png b/data/pixmaps/icons/rg-rwb-rose3-48x48.png
new file mode 100644
index 0000000..af01ec7
--- /dev/null
+++ b/data/pixmaps/icons/rg-rwb-rose3-48x48.png
Binary files differ
diff --git a/data/pixmaps/icons/rg-rwb-rose3-64x64.png b/data/pixmaps/icons/rg-rwb-rose3-64x64.png
new file mode 100644
index 0000000..c9c221e
--- /dev/null
+++ b/data/pixmaps/icons/rg-rwb-rose3-64x64.png
Binary files differ
diff --git a/data/pixmaps/icons/rg-tux-small.png b/data/pixmaps/icons/rg-tux-small.png
new file mode 100644
index 0000000..5b9e7aa
--- /dev/null
+++ b/data/pixmaps/icons/rg-tux-small.png
Binary files differ
diff --git a/data/pixmaps/icons/sa-hi16-rosegarden.png b/data/pixmaps/icons/sa-hi16-rosegarden.png
new file mode 100644
index 0000000..35b6ba2
--- /dev/null
+++ b/data/pixmaps/icons/sa-hi16-rosegarden.png
Binary files differ
diff --git a/data/pixmaps/icons/sa-hi32-rosegarden.png b/data/pixmaps/icons/sa-hi32-rosegarden.png
new file mode 100644
index 0000000..103c312
--- /dev/null
+++ b/data/pixmaps/icons/sa-hi32-rosegarden.png
Binary files differ
diff --git a/data/pixmaps/icons/sa-hi48-rosegarden.png b/data/pixmaps/icons/sa-hi48-rosegarden.png
new file mode 100644
index 0000000..371f6d4
--- /dev/null
+++ b/data/pixmaps/icons/sa-hi48-rosegarden.png
Binary files differ
diff --git a/data/pixmaps/icons/sa-hi64-rosegarden.png b/data/pixmaps/icons/sa-hi64-rosegarden.png
new file mode 100644
index 0000000..7c47840
--- /dev/null
+++ b/data/pixmaps/icons/sa-hi64-rosegarden.png
Binary files differ
diff --git a/data/pixmaps/icons/sa-lo16-rosegarden.png b/data/pixmaps/icons/sa-lo16-rosegarden.png
new file mode 100644
index 0000000..0a349a8
--- /dev/null
+++ b/data/pixmaps/icons/sa-lo16-rosegarden.png
Binary files differ
diff --git a/data/pixmaps/icons/sa-lo32-rosegarden.png b/data/pixmaps/icons/sa-lo32-rosegarden.png
new file mode 100644
index 0000000..3784a98
--- /dev/null
+++ b/data/pixmaps/icons/sa-lo32-rosegarden.png
Binary files differ
diff --git a/data/pixmaps/misc/arrow-contracted.png b/data/pixmaps/misc/arrow-contracted.png
new file mode 100644
index 0000000..884a72c
--- /dev/null
+++ b/data/pixmaps/misc/arrow-contracted.png
Binary files differ
diff --git a/data/pixmaps/misc/arrow-expanded.png b/data/pixmaps/misc/arrow-expanded.png
new file mode 100644
index 0000000..43e645e
--- /dev/null
+++ b/data/pixmaps/misc/arrow-expanded.png
Binary files differ
diff --git a/data/pixmaps/misc/bg-desktop.xpm b/data/pixmaps/misc/bg-desktop.xpm
new file mode 100644
index 0000000..a40da0c
--- /dev/null
+++ b/data/pixmaps/misc/bg-desktop.xpm
@@ -0,0 +1,1635 @@
+/* XPM */
+static char * bg_desktop_xpm[] = {
+"166 166 1466 2",
+" c None",
+". c #B5712A",
+"+ c #AA661D",
+"@ c #B16D24",
+"# c #BB7832",
+"$ c #B0712E",
+"% c #B07235",
+"& c #9D5F24",
+"* c #A9682E",
+"= c #A66126",
+"- c #AB652A",
+"; c #A56326",
+"> c #A7672A",
+", c #A66A2E",
+"' c #A4692F",
+") c #A56A2E",
+"! c #A86C2E",
+"~ c #A86828",
+"{ c #A4631F",
+"] c #B06D26",
+"^ c #BA7730",
+"/ c #B26F28",
+"( c #B57329",
+"_ c #B47228",
+": c #B06E22",
+"< c #B87628",
+"[ c #AF6D1F",
+"} c #B07122",
+"| c #A76819",
+"1 c #B27326",
+"2 c #B9772B",
+"3 c #AB691D",
+"4 c #AB671C",
+"5 c #B57025",
+"6 c #B26C24",
+"7 c #A5621E",
+"8 c #A96528",
+"9 c #A56025",
+"0 c #A76322",
+"a c #B16F23",
+"b c #AE6C1E",
+"c c #A3601A",
+"d c #A35E25",
+"e c #A4611B",
+"f c #B16E28",
+"g c #AB6821",
+"h c #AC6922",
+"i c #A9661F",
+"j c #A36117",
+"k c #A6641A",
+"l c #B27121",
+"m c #B77527",
+"n c #B37127",
+"o c #A8651F",
+"p c #B4712A",
+"q c #BB792F",
+"r c #B8762A",
+"s c #BA782C",
+"t c #A46218",
+"u c #B06E24",
+"v c #A6631D",
+"w c #AD6A26",
+"x c #A96622",
+"y c #A06219",
+"z c #A2631C",
+"A c #AC6B27",
+"B c #AD6928",
+"C c #A5601D",
+"D c #A8621C",
+"E c #AE691C",
+"F c #AB6414",
+"G c #B16A1A",
+"H c #B46D1D",
+"I c #B77022",
+"J c #AF681A",
+"K c #A96214",
+"L c #AF671B",
+"M c #B87024",
+"N c #B56E1C",
+"O c #B8742D",
+"P c #B26E27",
+"Q c #BE7B35",
+"R c #B27232",
+"S c #B37538",
+"T c #AB6A30",
+"U c #A76229",
+"V c #AD672C",
+"W c #A9672B",
+"X c #A5672C",
+"Y c #A3662D",
+"Z c #A1662E",
+"` c #A66B31",
+" . c #AA6E30",
+".. c #A66928",
+"+. c #A05F1D",
+"@. c #AE6B25",
+"#. c #B9762F",
+"$. c #B6742A",
+"%. c #B77529",
+"&. c #AE6C20",
+"*. c #AE7121",
+"=. c #A66718",
+"-. c #B37427",
+";. c #BB792D",
+">. c #AB691F",
+",. c #AB671E",
+"'. c #B57128",
+"). c #B06C23",
+"!. c #A56122",
+"~. c #A9642B",
+"{. c #A56029",
+"]. c #A76324",
+"^. c #AE6D1D",
+"/. c #A4611A",
+"(. c #A35F22",
+"_. c #A7641E",
+":. c #B3702A",
+"<. c #A7641D",
+"[. c #A15F15",
+"}. c #AF6E1E",
+"|. c #AA681E",
+"1. c #B16E27",
+"2. c #B7752B",
+"3. c #B67428",
+"4. c #A56319",
+"5. c #AD6A24",
+"6. c #9E5B17",
+"7. c #AC6925",
+"8. c #A4601F",
+"9. c #A2641B",
+"0. c #A66722",
+"a. c #AD6C2A",
+"b. c #A96526",
+"c. c #A05B1A",
+"d. c #A9631D",
+"e. c #B36B1F",
+"f. c #AC6515",
+"g. c #B36C1E",
+"h. c #B66F21",
+"i. c #B97125",
+"j. c #B76F23",
+"k. c #A96117",
+"l. c #AF671D",
+"m. c #BA7228",
+"n. c #B77020",
+"o. c #AC6B2B",
+"p. c #B27131",
+"q. c #B77320",
+"r. c #A76A31",
+"s. c #A96C36",
+"t. c #A66932",
+"u. c #A66629",
+"v. c #AE6D2D",
+"w. c #A4632B",
+"x. c #A56528",
+"y. c #AE6E2E",
+"z. c #9C5D1A",
+"A. c #AD6E29",
+"B. c #AA6B28",
+"C. c #A26224",
+"D. c #9D5D16",
+"E. c #B07029",
+"F. c #B3732C",
+"G. c #B97931",
+"H. c #B6762C",
+"I. c #B07026",
+"J. c #B6772A",
+"K. c #AB6C1F",
+"L. c #AF6C25",
+"M. c #AD6A23",
+"N. c #B5722B",
+"O. c #AD6B2F",
+"P. c #A05E22",
+"Q. c #A46226",
+"R. c #A46225",
+"S. c #AB6A2A",
+"T. c #A36220",
+"U. c #AA6A22",
+"V. c #AB6B24",
+"W. c #A76622",
+"X. c #A3621E",
+"Y. c #A1601E",
+"Z. c #A46321",
+"`. c #A76626",
+" + c #AC6923",
+".+ c #AB6726",
+"++ c #B5722C",
+"@+ c #B8762C",
+"#+ c #B47436",
+"$+ c #A0611E",
+"%+ c #B1722F",
+"&+ c #A46522",
+"*+ c #A86926",
+"=+ c #9F5F1F",
+"-+ c #AA6A2C",
+";+ c #A66523",
+">+ c #A2611F",
+",+ c #AB6824",
+"'+ c #AA6520",
+")+ c #A46019",
+"!+ c #B16B25",
+"~+ c #B67123",
+"{+ c #B26D1F",
+"]+ c #B06B1D",
+"^+ c #B16C1E",
+"/+ c #B36E20",
+"(+ c #B77224",
+"_+ c #B97426",
+":+ c #AE6D2B",
+"<+ c #B3722E",
+"[+ c #B57022",
+"}+ c #B07030",
+"|+ c #A86B32",
+"1+ c #AA6D37",
+"2+ c #A56831",
+"3+ c #A46329",
+"4+ c #AB692C",
+"5+ c #A8672F",
+"6+ c #A9692C",
+"7+ c #B17131",
+"8+ c #A26320",
+"9+ c #B0712C",
+"0+ c #AD6E2B",
+"a+ c #B47434",
+"b+ c #A66628",
+"c+ c #9E5E17",
+"d+ c #AE6E27",
+"e+ c #AF6F28",
+"f+ c #B7772F",
+"g+ c #B57629",
+"h+ c #A96A1D",
+"i+ c #AE6B24",
+"j+ c #B37029",
+"k+ c #A26024",
+"l+ c #A86629",
+"m+ c #AA6929",
+"n+ c #AF6E2E",
+"o+ c #AC6C25",
+"p+ c #AD6D26",
+"q+ c #AB6A26",
+"r+ c #A66521",
+"s+ c #A56422",
+"t+ c #A76624",
+"u+ c #AA6625",
+"v+ c #A86423",
+"w+ c #AC6827",
+"x+ c #B4712B",
+"y+ c #A96929",
+"z+ c #AC6D2A",
+"A+ c #A76825",
+"B+ c #A66724",
+"C+ c #A26222",
+"D+ c #A96826",
+"E+ c #A56420",
+"F+ c #AB6621",
+"G+ c #A5611A",
+"H+ c #B46F21",
+"I+ c #B4742D",
+"J+ c #B36E23",
+"K+ c #B7742D",
+"L+ c #B07032",
+"M+ c #A76A33",
+"N+ c #A96B38",
+"O+ c #A46731",
+"P+ c #A26129",
+"Q+ c #A8662C",
+"R+ c #A36421",
+"S+ c #AC6D28",
+"T+ c #AB6C29",
+"U+ c #AF6F2F",
+"V+ c #A56527",
+"W+ c #A06019",
+"X+ c #AA6A23",
+"Y+ c #B4742C",
+"Z+ c #B7772D",
+"`+ c #B17127",
+" @ c #B47528",
+".@ c #A6671A",
+"+@ c #AC6A2E",
+"@@ c #AD6B2E",
+"#@ c #AC6B29",
+"$@ c #A86820",
+"%@ c #A86723",
+"&@ c #B67426",
+"*@ c #A56623",
+"=@ c #AD6C28",
+"-@ c #AC6821",
+";@ c #A6621B",
+">@ c #AA641C",
+",@ c #BB7628",
+"'@ c #AE691B",
+")@ c #B07028",
+"!@ c #B5752D",
+"~@ c #B67028",
+"{@ c #B87531",
+"]@ c #AE6E30",
+"^@ c #A5682F",
+"/@ c #A66933",
+"(@ c #A1642E",
+"_@ c #A1602A",
+":@ c #A86530",
+"<@ c #A7662E",
+"[@ c #AA6A2D",
+"}@ c #AC6C2C",
+"|@ c #A96A25",
+"1@ c #AB6B2B",
+"2@ c #A4641D",
+"3@ c #A76720",
+"4@ c #B9792F",
+"5@ c #B37329",
+"6@ c #B27026",
+"7@ c #AE6C22",
+"8@ c #AC6A20",
+"9@ c #B16F25",
+"0@ c #AD6B21",
+"a@ c #A2611D",
+"b@ c #A4641C",
+"c@ c #A86821",
+"d@ c #A86727",
+"e@ c #A86521",
+"f@ c #AD6E27",
+"g@ c #A46520",
+"h@ c #A46424",
+"i@ c #A1621F",
+"j@ c #A86924",
+"k@ c #A5661F",
+"l@ c #B1702C",
+"m@ c #AE6A23",
+"n@ c #A8641B",
+"o@ c #AB651D",
+"p@ c #B87325",
+"q@ c #BD782A",
+"r@ c #AD681A",
+"s@ c #B9732D",
+"t@ c #BA7731",
+"u@ c #AD6D2D",
+"v@ c #A26628",
+"w@ c #A2652C",
+"x@ c #9F622B",
+"y@ c #A05F29",
+"z@ c #AA6732",
+"A@ c #AA6931",
+"B@ c #AE6E31",
+"C@ c #AA6B26",
+"D@ c #BC7C32",
+"E@ c #B5752B",
+"F@ c #A8691C",
+"G@ c #B37125",
+"H@ c #AD6B1F",
+"I@ c #B47226",
+"J@ c #A36222",
+"K@ c #A46323",
+"L@ c #B06F2F",
+"M@ c #AE6D29",
+"N@ c #A6661F",
+"O@ c #A96922",
+"P@ c #A5651D",
+"Q@ c #B06D27",
+"R@ c #BA782A",
+"S@ c #B87727",
+"T@ c #B17328",
+"U@ c #A86922",
+"V@ c #A66626",
+"W@ c #A96A23",
+"X@ c #A3651A",
+"Y@ c #AF6B22",
+"Z@ c #AD681D",
+"`@ c #B46F24",
+" # c #B1712A",
+".# c #BB752D",
+"+# c #BB7831",
+"@# c #AE6F2A",
+"## c #A26725",
+"$# c #A26627",
+"%# c #9F6327",
+"&# c #A05F27",
+"*# c #A96631",
+"=# c #A6652D",
+"-# c #AB6B2E",
+";# c #AE6F2C",
+"># c #A56621",
+",# c #A76727",
+"'# c #AB6B2D",
+")# c #B6762E",
+"!# c #AF6D21",
+"~# c #B57327",
+"{# c #A26121",
+"]# c #B06F2D",
+"^# c #A96921",
+"/# c #AA6925",
+"(# c #AF6C26",
+"_# c #BA782E",
+":# c #BB792B",
+"<# c #B87725",
+"[# c #B27525",
+"}# c #AD6F26",
+"|# c #A9692B",
+"1# c #AD6D2F",
+"2# c #A86A21",
+"3# c #A46717",
+"4# c #AB6B23",
+"5# c #A7671F",
+"6# c #AC681D",
+"7# c #AE691E",
+"8# c #B57023",
+"9# c #B97429",
+"0# c #A66C23",
+"a# c #A66B27",
+"b# c #A06425",
+"c# c #9E5E21",
+"d# c #A56329",
+"e# c #A16028",
+"f# c #A0611C",
+"g# c #A96A27",
+"h# c #A36323",
+"i# c #BA7A30",
+"j# c #AC6D20",
+"k# c #AB691B",
+"l# c #B06E20",
+"m# c #B16F21",
+"n# c #B57325",
+"o# c #B37123",
+"p# c #AC6C24",
+"q# c #A86725",
+"r# c #B97828",
+"s# c #B57422",
+"t# c #AF7221",
+"u# c #AF7126",
+"v# c #A7691E",
+"w# c #A76A19",
+"x# c #A5651B",
+"y# c #B06C21",
+"z# c #AD691E",
+"A# c #B06B1E",
+"B# c #B67124",
+"C# c #B37528",
+"D# c #AA7124",
+"E# c #AA7027",
+"F# c #A26723",
+"G# c #9D5D1F",
+"H# c #A2631E",
+"I# c #A56525",
+"J# c #B8782E",
+"K# c #AD6D23",
+"L# c #AD6E21",
+"M# c #A86618",
+"N# c #B47224",
+"O# c #B06F2B",
+"P# c #A96824",
+"Q# c #A96828",
+"R# c #A8661A",
+"S# c #B6732C",
+"T# c #B2711F",
+"U# c #AC6F1E",
+"V# c #AF7124",
+"W# c #A3641F",
+"X# c #AC6C2E",
+"Y# c #A06022",
+"Z# c #AF702B",
+"`# c #A6681B",
+" $ c #AA6D1C",
+".$ c #B3732B",
+"+$ c #A4641A",
+"@$ c #AE6B1D",
+"#$ c #B77225",
+"$$ c #AB6D22",
+"%$ c #B07124",
+"&$ c #B47025",
+"*$ c #B9752A",
+"=$ c #A5672A",
+"-$ c #A0652B",
+";$ c #A06428",
+">$ c #9C6021",
+",$ c #A56825",
+"'$ c #A36721",
+")$ c #A66720",
+"!$ c #A6631F",
+"~$ c #B47323",
+"{$ c #B06F1F",
+"]$ c #A96816",
+"^$ c #AF6E1C",
+"/$ c #AA6917",
+"($ c #B67525",
+"_$ c #AD6C18",
+":$ c #AA6720",
+"<$ c #AE6A2D",
+"[$ c #AE6A2B",
+"}$ c #A5621C",
+"|$ c #B0692B",
+"1$ c #B06C25",
+"2$ c #AF6D23",
+"3$ c #AE6926",
+"4$ c #B46F22",
+"5$ c #B97522",
+"6$ c #B46E26",
+"7$ c #B66F31",
+"8$ c #A76020",
+"9$ c #B36D25",
+"0$ c #AF6A1C",
+"a$ c #B97427",
+"b$ c #B36D28",
+"c$ c #AE7025",
+"d$ c #AE6D33",
+"e$ c #A26127",
+"f$ c #AD6F24",
+"g$ c #B16D26",
+"h$ c #A6611C",
+"i$ c #B26C26",
+"j$ c #AB6619",
+"k$ c #BC7523",
+"l$ c #BF7921",
+"m$ c #B06C19",
+"n$ c #B16D1A",
+"o$ c #B26E1B",
+"p$ c #B36F1C",
+"q$ c #B5711E",
+"r$ c #B87421",
+"s$ c #B36F1E",
+"t$ c #AA6B24",
+"u$ c #AC6E23",
+"v$ c #B27024",
+"w$ c #B87429",
+"x$ c #B7732C",
+"y$ c #A46629",
+"z$ c #A1642B",
+"A$ c #A16529",
+"B$ c #A06225",
+"C$ c #9D601F",
+"D$ c #A1601C",
+"E$ c #A3601C",
+"F$ c #AB6822",
+"G$ c #AC6B1B",
+"H$ c #AE6D1B",
+"I$ c #A86717",
+"J$ c #B37222",
+"K$ c #AC6B17",
+"L$ c #B06C2D",
+"M$ c #B17020",
+"N$ c #AF682A",
+"O$ c #A36326",
+"P$ c #B6721D",
+"Q$ c #B16B23",
+"R$ c #B46D2F",
+"S$ c #A55E1E",
+"T$ c #B16D1C",
+"U$ c #BC772A",
+"V$ c #B7712B",
+"W$ c #AE7120",
+"X$ c #A05F25",
+"Y$ c #A96B20",
+"Z$ c #BA7321",
+"`$ c #BB751F",
+" % c #B4701D",
+".% c #B6721F",
+"+% c #B47123",
+"@% c #B87328",
+"#% c #B6722B",
+"$% c #A36627",
+"%% c #AA6C33",
+"&% c #AB6D32",
+"*% c #995C1D",
+"=% c #965513",
+"-% c #AB6728",
+";% c #AC682B",
+">% c #A15E1A",
+",% c #AA6721",
+"'% c #AA6919",
+")% c #B27022",
+"!% c #A66416",
+"~% c #B97729",
+"{% c #AF6B2E",
+"]% c #B16D2E",
+"^% c #A96620",
+"/% c #AE6729",
+"(% c #A16124",
+"_% c #A45F26",
+":% c #B36F1A",
+"<% c #B16A2A",
+"[% c #A45D1D",
+"}% c #B26E1D",
+"|% c #BF7A2D",
+"1% c #BB752F",
+"2% c #B07323",
+"3% c #A76729",
+"4% c #9F5F22",
+"5% c #A76920",
+"6% c #B36F28",
+"7% c #AB6618",
+"8% c #B97220",
+"9% c #B7711C",
+"0% c #B57224",
+"a% c #B56F27",
+"b% c #A26429",
+"c% c #B1733A",
+"d% c #B8773D",
+"e% c #9E5E20",
+"f% c #B57432",
+"g% c #AF6E2A",
+"h% c #945010",
+"i% c #AB672A",
+"j% c #A4611D",
+"k% c #A9671B",
+"l% c #BA7929",
+"m% c #B06C2F",
+"n% c #AC6527",
+"o% c #A25D24",
+"p% c #BB7629",
+"q% c #B26F18",
+"r% c #A45D1B",
+"s% c #B36E21",
+"t% c #BF7A2C",
+"u% c #AE6E26",
+"v% c #A56424",
+"w% c #A36124",
+"x% c #A46017",
+"y% c #B26D20",
+"z% c #BA7323",
+"A% c #AF6B18",
+"B% c #A8661C",
+"C% c #B47122",
+"D% c #AD6823",
+"E% c #AD6C32",
+"F% c #B8783A",
+"G% c #BA7935",
+"H% c #B7742E",
+"I% c #9A5713",
+"J% c #B36E2D",
+"K% c #AD6729",
+"L% c #A9671D",
+"M% c #AD6C1C",
+"N% c #AD6B1D",
+"O% c #B57424",
+"P% c #B1701C",
+"Q% c #AF6B2C",
+"R% c #AA6325",
+"S% c #AF6B24",
+"T% c #A06023",
+"U% c #B26B29",
+"V% c #A55E1C",
+"W% c #BC7729",
+"X% c #B77129",
+"Y% c #A66221",
+"Z% c #A96524",
+"`% c #A35F14",
+" & c #B06C1B",
+".& c #BC7525",
+"+& c #AD6916",
+"@& c #B87526",
+"#& c #B36C1C",
+"$& c #B66D20",
+"%& c #B56D23",
+"&& c #A8682B",
+"*& c #A26023",
+"=& c #B1702E",
+"-& c #A66219",
+";& c #B5702B",
+">& c #B16B26",
+",& c #A8651E",
+"'& c #AA681C",
+")& c #AC6A1C",
+"!& c #B47321",
+"~& c #B4731F",
+"{& c #AD692A",
+"]& c #AC6A1E",
+"^& c #A25F19",
+"/& c #A96224",
+"(& c #AD6922",
+"_& c #A26225",
+":& c #A56027",
+"<& c #B87326",
+"[& c #B16E15",
+"}& c #B36C2A",
+"|& c #A7611C",
+"1& c #B16D18",
+"2& c #BA7625",
+"3& c #AE6A29",
+"4& c #AE6A21",
+"5& c #A15E10",
+"6& c #BD7628",
+"7& c #B26B1D",
+"8& c #AE6A17",
+"9& c #B67227",
+"0& c #B77425",
+"a& c #B26B1B",
+"b& c #B46B1E",
+"c& c #B46C20",
+"d& c #AF6923",
+"e& c #B37021",
+"f& c #B16E20",
+"g& c #A56120",
+"h& c #B16E2A",
+"i& c #B77622",
+"j& c #AB6A1A",
+"k& c #A86123",
+"l& c #AD6A12",
+"m& c #AC6719",
+"n& c #A9631E",
+"o& c #B26E19",
+"p& c #B26D22",
+"q& c #B26D28",
+"r& c #B16C27",
+"s& c #A5601B",
+"t& c #B16C29",
+"u& c #A66120",
+"v& c #AC6628",
+"w& c #A66022",
+"x& c #AF6B20",
+"y& c #BC7527",
+"z& c #AE661A",
+"A& c #B77322",
+"B& c #B2691A",
+"C& c #B46B1C",
+"D& c #B46A1F",
+"E& c #B4742A",
+"F& c #C38133",
+"G& c #B77423",
+"H& c #B06D1C",
+"I& c #B97524",
+"J& c #B97826",
+"K& c #AB6A18",
+"L& c #B87723",
+"M& c #AA6627",
+"N& c #AA661F",
+"O& c #AA652C",
+"P& c #AD6825",
+"Q& c #AA670D",
+"R& c #AA6517",
+"S& c #AA641E",
+"T& c #BA7623",
+"U& c #B16C21",
+"V& c #A25D1A",
+"W& c #A86224",
+"X& c #A05A1E",
+"Y& c #A15E0E",
+"Z& c #BA7325",
+"`& c #AB6317",
+" * c #AC6815",
+".* c #B57120",
+"+* c #B06D29",
+"@* c #B6732D",
+"#* c #BE7B2D",
+"$* c #B87620",
+"%* c #B87028",
+"&* c #B9702C",
+"** c #A76614",
+"=* c #A76616",
+"-* c #B3721E",
+";* c #B3702C",
+">* c #B27228",
+",* c #BF7C2D",
+"'* c #BF7B2A",
+")* c #AC661E",
+"!* c #AD6628",
+"~* c #AC6525",
+"{* c #A8621A",
+"]* c #AB6520",
+"^* c #AD6722",
+"/* c #B56E20",
+"(* c #BA741C",
+"_* c #B9761D",
+":* c #B77426",
+"<* c #B4702F",
+"[* c #A36019",
+"}* c #A25F1B",
+"|* c #A76420",
+"1* c #A76318",
+"2* c #A96618",
+"3* c #B87423",
+"4* c #B46D1B",
+"5* c #AA6410",
+"6* c #AA6612",
+"7* c #BA7527",
+"8* c #BB762B",
+"9* c #B0691B",
+"0* c #B4701F",
+"a* c #B16E1F",
+"b* c #AD6920",
+"c* c #A15D1E",
+"d* c #B4721E",
+"e* c #AF6B16",
+"f* c #B76E2A",
+"g* c #AC6B19",
+"h* c #A96818",
+"i* c #B37022",
+"j* c #BC792A",
+"k* c #BD7928",
+"l* c #B4701B",
+"m* c #AB6424",
+"n* c #AB661B",
+"o* c #A7651B",
+"p* c #B46D1F",
+"q* c #B67325",
+"r* c #B36F2E",
+"s* c #A5621B",
+"t* c #A15E17",
+"u* c #AA661B",
+"v* c #AA6719",
+"w* c #AD6713",
+"x* c #AB6713",
+"y* c #AF6A1F",
+"z* c #AE6719",
+"A* c #B67221",
+"B* c #B26F20",
+"C* c #A05D19",
+"D* c #B5731F",
+"E* c #B1701E",
+"F* c #B4712D",
+"G* c #A5651E",
+"H* c #AD6D25",
+"I* c #B26F21",
+"J* c #B5711C",
+"K* c #A86121",
+"L* c #A7611B",
+"M* c #AC6722",
+"N* c #AE6823",
+"O* c #B8721A",
+"P* c #B8751C",
+"Q* c #B16D2C",
+"R* c #A26016",
+"S* c #B16B16",
+"T* c #AC6813",
+"U* c #AD681B",
+"V* c #A66114",
+"W* c #B0681C",
+"X* c #B26F1E",
+"Y* c #AC691B",
+"Z* c #B77521",
+"`* c #A96814",
+" = c #A2621B",
+".= c #B67324",
+"+= c #B6731C",
+"@= c #AD6626",
+"#= c #AE6725",
+"$= c #A76119",
+"%= c #AA6723",
+"&= c #9F5C18",
+"*= c #AE6924",
+"== c #AF6924",
+"-= c #B67018",
+";= c #AE6A19",
+">= c #B36C1A",
+",= c #B26C17",
+"'= c #AA6615",
+")= c #A35E11",
+"!= c #B3711D",
+"~= c #AF6C1D",
+"{= c #B47120",
+"]= c #AA6313",
+"^= c #AC6517",
+"/= c #B06F1D",
+"(= c #A25E1D",
+"_= c #A86713",
+":= c #AF6F25",
+"<= c #B57223",
+"[= c #BB7724",
+"}= c #B46D2B",
+"|= c #B16A28",
+"1= c #AA6518",
+"2= c #9D5A16",
+"3= c #A05D17",
+"4= c #AF6A25",
+"5= c #B06A25",
+"6= c #B46E16",
+"7= c #B7741B",
+"8= c #A6631C",
+"9= c #AB681A",
+"0= c #B36D18",
+"a= c #B8741F",
+"b= c #A76313",
+"c= c #AE6B27",
+"d= c #B87123",
+"e= c #B2701C",
+"f= c #B16E1D",
+"g= c #AB6714",
+"h= c #AC6513",
+"i= c #AF6816",
+"j= c #AF6C28",
+"k= c #AB6B21",
+"l= c #BC7825",
+"m= c #B7702E",
+"n= c #B26C27",
+"o= c #A86315",
+"p= c #B26C14",
+"q= c #B6731A",
+"r= c #A76517",
+"s= c #B16D22",
+"t= c #AD6A13",
+"u= c #BC7922",
+"v= c #B06E18",
+"w= c #AF6D19",
+"x= c #BA741F",
+"y= c #AB6A16",
+"z= c #B06C17",
+"A= c #A76519",
+"B= c #B16B13",
+"C= c #B57219",
+"D= c #B06D1F",
+"E= c #BC7A2C",
+"F= c #A36115",
+"G= c #AE6A1F",
+"H= c #B16A18",
+"I= c #B8751E",
+"J= c #AC6913",
+"K= c #AA670F",
+"L= c #B36B21",
+"M= c #B56D21",
+"N= c #AF6D17",
+"O= c #AC6A14",
+"P= c #BF7923",
+"Q= c #A66515",
+"R= c #A2621A",
+"S= c #A06016",
+"T= c #AF6C1E",
+"U= c #BA771C",
+"V= c #AC6620",
+"W= c #A56317",
+"X= c #A05E14",
+"Y= c #B06A13",
+"Z= c #A35F1E",
+"`= c #BF7D2F",
+" - c #A26014",
+".- c #A9651A",
+"+- c #A86517",
+"@- c #AD6918",
+"#- c #A7610D",
+"$- c #BB7722",
+"%- c #AC6911",
+"&- c #A66309",
+"*- c #B47116",
+"=- c #A8632A",
+"-- c #AA6429",
+";- c #AC671C",
+">- c #B16C1F",
+",- c #AB6716",
+"'- c #BE792C",
+")- c #A45F14",
+"!- c #AF6921",
+"~- c #C27B2D",
+"{- c #BE7729",
+"]- c #BE7A25",
+"^- c #A86318",
+"/- c #9F5D12",
+"(- c #A56315",
+"_- c #BD7B2F",
+":- c #A4640E",
+"<- c #AE6E17",
+"[- c #C07C31",
+"}- c #C88237",
+"|- c #AE661C",
+"1- c #AB6819",
+"2- c #B36D17",
+"3- c #B97520",
+"4- c #A25D22",
+"5- c #A35D22",
+"6- c #AA651A",
+"7- c #BA752A",
+"8- c #BA7528",
+"9- c #AC6817",
+"0- c #C27D30",
+"a- c #A56013",
+"b- c #BF782A",
+"c- c #BC7823",
+"d- c #A96719",
+"e- c #BC7A2E",
+"f- c #BE7A2F",
+"g- c #C37E33",
+"h- c #AD651B",
+"i- c #AC641A",
+"j- c #AD6A1C",
+"k- c #AA6718",
+"l- c #AE6813",
+"m- c #B16B15",
+"n- c #AE6A15",
+"o- c #AB6511",
+"p- c #A46023",
+"q- c #A45E20",
+"r- c #BB7726",
+"s- c #C47F32",
+"t- c #B06B20",
+"u- c #A66116",
+"v- c #BA742C",
+"w- c #B67229",
+"x- c #AC671A",
+"y- c #BB7426",
+"z- c #A56411",
+"A- c #AF6E1A",
+"B- c #BF7C2E",
+"C- c #C07B2E",
+"D- c #AD6519",
+"E- c #AC6418",
+"F- c #AF6914",
+"G- c #B7731E",
+"H- c #AE6811",
+"I- c #A5601F",
+"J- c #B67126",
+"K- c #AF6B1A",
+"L- c #A86413",
+"M- c #A96419",
+"N- c #B8722A",
+"O- c #B36F26",
+"P- c #BD7926",
+"Q- c #C38032",
+"R- c #AF6A1D",
+"S- c #A66418",
+"T- c #B06B11",
+"U- c #9F5A15",
+"V- c #A76217",
+"W- c #BD782B",
+"X- c #B97127",
+"Y- c #BF7B28",
+"Z- c #AA681A",
+"`- c #C58233",
+" ; c #AE6B1C",
+".; c #B26C16",
+"+; c #9E5A13",
+"@; c #A9631B",
+"#; c #B26F29",
+"$; c #B66E24",
+"%; c #C07C29",
+"&; c #A05F10",
+"*; c #BA7728",
+"=; c #C48132",
+"-; c #AD6618",
+";; c #B06D1E",
+">; c #B7711B",
+",; c #A86410",
+"'; c #BA7621",
+"); c #B77227",
+"!; c #A7621D",
+"~; c #AE6820",
+"{; c #AD6D16",
+"]; c #BA7A23",
+"^; c #9C5B0A",
+"/; c #BD7A29",
+"(; c #C78332",
+"_; c #AD6616",
+":; c #A96511",
+"<; c #A46015",
+"[; c #C17C2F",
+"}; c #B5722E",
+"|; c #BD752D",
+"1; c #C17D2A",
+"2; c #A15C0F",
+"3; c #AF6F18",
+"4; c #A25F18",
+"5; c #BB7A28",
+"6; c #BF7F28",
+"7; c #B77624",
+"8; c #C07D2C",
+"9; c #CA8635",
+"0; c #AF6818",
+"a; c #A35F0B",
+"b; c #A6600C",
+"c; c #BC7620",
+"d; c #B26A20",
+"e; c #A1611A",
+"f; c #AA6A20",
+"g; c #B87524",
+"h; c #AD6C1A",
+"i; c #A66717",
+"j; c #A7671D",
+"k; c #B2722B",
+"l; c #9E5A12",
+"m; c #A76215",
+"n; c #A86316",
+"o; c #AB6422",
+"p; c #9E5813",
+"q; c #BE7C30",
+"r; c #A05E13",
+"s; c #AD6914",
+"t; c #B67420",
+"u; c #A9691F",
+"v; c #A05C13",
+"w; c #A25C16",
+"x; c #A96514",
+"y; c #A15F13",
+"z; c #AE6B14",
+"A; c #AE6B13",
+"B; c #AF6C13",
+"C; c #B97627",
+"D; c #B97625",
+"E; c #AF6F27",
+"F; c #9C5C15",
+"G; c #A3631C",
+"H; c #A56118",
+"I; c #A96417",
+"J; c #BC7827",
+"K; c #AF6C15",
+"L; c #B06D16",
+"M; c #BB7827",
+"N; c #B87622",
+"O; c #A76818",
+"P; c #9F5F18",
+"Q; c #AD6721",
+"R; c #BE7A29",
+"S; c #B4711A",
+"T; c #9F5E1A",
+"U; c #9C5B19",
+"V; c #9F5E1E",
+"W; c #A86516",
+"X; c #A86919",
+"Y; c #AC681F",
+"Z; c #B46E28",
+"`; c #B06A24",
+" > c #9E5D19",
+".> c #995818",
+"+> c #A36125",
+"@> c #A66427",
+"#> c #B37230",
+"$> c #AD6E1E",
+"%> c #B37019",
+"&> c #B6702A",
+"*> c #BC7920",
+"=> c #C17F33",
+"-> c #A05F1B",
+";> c #9B5A1A",
+">> c #A9672D",
+",> c #A8662A",
+"'> c #B17030",
+")> c #B8752F",
+"!> c #B47027",
+"~> c #B3701F",
+"{> c #B37424",
+"]> c #A66113",
+"^> c #C58337",
+"/> c #9D5C1C",
+"(> c #A6632C",
+"_> c #A66525",
+":> c #AF6C1B",
+"<> c #B87929",
+"[> c #B6762F",
+"}> c #B7732A",
+"|> c #B37017",
+"1> c #A96416",
+"2> c #B06A22",
+"3> c #C9863A",
+"4> c #9D5C1A",
+"5> c #B07229",
+"6> c #B17222",
+"7> c #B57221",
+"8> c #BE792B",
+"9> c #AC6C15",
+"0> c #AB6B13",
+"a> c #AC6D11",
+"b> c #BF7E2A",
+"c> c #B06B26",
+"d> c #B3711B",
+"e> c #B5741A",
+"f> c #AF6F17",
+"g> c #B56F2A",
+"h> c #AE6F20",
+"i> c #B2711D",
+"j> c #B9772D",
+"k> c #AD6D13",
+"l> c #B06F1B",
+"m> c #BB7A26",
+"n> c #B27427",
+"o> c #B27117",
+"p> c #B07019",
+"q> c #AC6D1D",
+"r> c #B77636",
+"s> c #B9732E",
+"t> c #AA6927",
+"u> c #A16123",
+"v> c #AA6B1E",
+"w> c #AE6D19",
+"x> c #BC762E",
+"y> c #B57420",
+"z> c #B17326",
+"A> c #AC6829",
+"B> c #BA7720",
+"C> c #AB6913",
+"D> c #AF6D16",
+"E> c #AC6D1E",
+"F> c #BF7933",
+"G> c #B07225",
+"H> c #AF702D",
+"I> c #B9761F",
+"J> c #A8650F",
+"K> c #AB6915",
+"L> c #AE6C16",
+"M> c #A8691A",
+"N> c #AB6A28",
+"O> c #B57126",
+"P> c #BD7C2C",
+"Q> c #B26E2D",
+"R> c #AD682D",
+"S> c #BA742F",
+"T> c #AF6B2A",
+"U> c #B7741D",
+"V> c #B16E17",
+"W> c #AE6C18",
+"X> c #A16119",
+"Y> c #AC6D26",
+"Z> c #AB6C27",
+"`> c #C07C2B",
+" , c #BF7E2E",
+"., c #BE7C2E",
+"+, c #B06C2B",
+"@, c #BA7927",
+"#, c #B26F2B",
+"$, c #B77626",
+"%, c #B5721B",
+"&, c #A66210",
+"*, c #AD671F",
+"=, c #B16F1B",
+"-, c #A6661E",
+";, c #B6732F",
+">, c #BE7D2D",
+",, c #C07E34",
+"', c #BE7D29",
+"), c #AA6321",
+"!, c #BB772E",
+"~, c #C17F31",
+"{, c #B07227",
+"], c #AC6C22",
+"^, c #AA6C21",
+"/, c #AB6D24",
+"(, c #BB7A2A",
+"_, c #BF7D31",
+":, c #C07E32",
+"<, c #C48238",
+"[, c #BC7A30",
+"}, c #BC7B2B",
+"|, c #C1812A",
+"1, c #A65F1F",
+"2, c #C07C33",
+"3, c #C98638",
+"4, c #B16E13",
+"5, c #BD782D",
+"6, c #BA742E",
+"7, c #AE6822",
+"8, c #B57633",
+"9, c #AA6D2E",
+"0, c #B27330",
+"a, c #B67523",
+"b, c #BD7C28",
+"c, c #B77720",
+"d, c #A96913",
+"e, c #BC7B27",
+"f, c #C48234",
+"g, c #B8752E",
+"h, c #B97630",
+"i, c #BF7D33",
+"j, c #B9732B",
+"k, c #A56829",
+"l, c #C48236",
+"m, c #C17F35",
+"n, c #9E6122",
+"o, c #C38135",
+"p, c #BD7B2D",
+"q, c #9A5D1E",
+"r, c #A36325",
+"s, c #A16121",
+"t, c #B37220",
+"u, c #BE7C32",
+"v, c #B67521",
+"w, c #B97824",
+"x, c #BD7B31",
+"y, c #9C5F20",
+"z, c #A66018",
+"A, c #A06324",
+"B, c #B37431",
+"C, c #A76823",
+"D, c #BC772C",
+"E, c #A55F17",
+"F, c #A46728",
+"G, c #AF6F31",
+"H, c #B67734",
+"I, c #B67732",
+"J, c #BC7932",
+"K, c #B97534",
+"L, c #BD7A33",
+"M, c #A76A2B",
+"N, c #B47530",
+"O, c #C0813C",
+"P, c #B36F30",
+"Q, c #BA7637",
+"R, c #B77332",
+"S, c #BF7931",
+"T, c #B2722A",
+"U, c #B06B28",
+"V, c #B16C2B",
+"W, c #AC6726",
+"X, c #B67727",
+"Y, c #B8792A",
+"Z, c #B97A2B",
+"`, c #BB772C",
+" ' c #B67233",
+".' c #BE7D2B",
+"+' c #B36E2B",
+"@' c #B46E30",
+"#' c #B06A2C",
+"$' c #AD6827",
+"%' c #AF6A27",
+"&' c #B67728",
+"*' c #BA7B2C",
+"=' c #BA762B",
+"-' c #BD7C2A",
+";' c #B26E31",
+">' c #B8792C",
+",' c #BA7B2E",
+"'' c #BA7729",
+")' c #BC7B29",
+"!' c #AD692C",
+"~' c #BB7C2F",
+"{' c #C07F2D",
+"]' c #9F5E1C",
+"^' c #A16020",
+"/' c #AA682C",
+"(' c #AF6E2C",
+"_' c #B97628",
+":' c #C38230",
+"<' c #B17129",
+"[' c #A46426",
+"}' c #B1722D",
+"|' c #B77930",
+"1' c #B87830",
+"2' c #BD7D33",
+"3' c #B87527",
+"4' c #C07D36",
+"5' c #C28131",
+"6' c #B3742D",
+"7' c #B0712A",
+"8' c #B97932",
+"9' c #BE7E36",
+"0' c #C17E37",
+"a' c #BD7A36",
+"b' c #AC6C2F",
+"c' c #A8682A",
+"d' c #B2712D",
+"e' c #C3803A",
+"f' c #C17E3A",
+"g' c #A15E18",
+"h' c #B06919",
+"i' c #AE7132",
+"j' c #AE692E",
+"k' c #B67231",
+"l' c #C1802C",
+"m' c #B4741D",
+"n' c #C18137",
+"o' c #BB7B31",
+"p' c #9C5E15",
+"q' c #A96B22",
+"r' c #AB651F",
+"s' c #A06018",
+"t' c #A96C2B",
+"u' c #A3672B",
+"v' c #A4682C",
+"w' c #AB6E2F",
+"x' c #B26E2F",
+"y' c #AE6E16",
+"z' c #BE7E34",
+"A' c #A1621B",
+"B' c #AE6717",
+"C' c #A16526",
+"D' c #A96910",
+"E' c #AD6D15",
+"F' c #A76821",
+"G' c #B87121",
+"H' c #A3651C",
+"I' c #A1651F",
+"J' c #A16421",
+"K' c #B3731B",
+"L' c #AC6C14",
+"M' c #C08036",
+"N' c #A76416",
+"O' c #B1691D",
+"P' c #A6681F",
+"Q' c #B2721A",
+"R' c #C28238",
+"S' c #BD7D26",
+"T' c #A66217",
+"U' c #AA641F",
+"V' c #A76916",
+"W' c #AA6D1D",
+"X' c #AF6826",
+"Y' c #BA7733",
+"Z' c #B1711A",
+"`' c #BD7D25",
+" ) c #B9731D",
+".) c #B97721",
+"+) c #AE701D",
+"@) c #B26D2A",
+"#) c #B16728",
+"$) c #BE7B37",
+"%) c #B77430",
+"&) c #BD7A34",
+"*) c #B9791F",
+"=) c #A9651C",
+"-) c #A8621D",
+";) c #BE7832",
+">) c #BC7428",
+",) c #B6701A",
+"') c #A76711",
+")) c #B0721D",
+"!) c #AF7021",
+"~) c #B66F2D",
+"{) c #B26829",
+"]) c #BA7635",
+"^) c #BC7933",
+"/) c #B97632",
+"() c #C5853B",
+"_) c #B4741A",
+":) c #AA6A2A",
+"<) c #C27C36",
+"[) c #BF772B",
+"}) c #AE7019",
+"|) c #BA7C29",
+"1) c #B17223",
+"2) c #BA762F",
+"3) c #A25E13",
+"4) c #AB6720",
+"5) c #A8681E",
+"6) c #B06929",
+"7) c #B46E19",
+"8) c #B9731E",
+"9) c #A86425",
+"0) c #AF711E",
+"a) c #AE6F22",
+"b) c #BB7730",
+"c) c #AC6621",
+"d) c #AF6828",
+"e) c #AE6E24",
+"f) c #B9742F",
+"g) c #B26B19",
+"h) c #B8721D",
+"i) c #B06E1A",
+"j) c #BB7B34",
+"k) c #BD7D36",
+"l) c #B46F2A",
+"m) c #AE6715",
+"n) c #C27F38",
+"o) c #BB7A38",
+"p) c #B26E25",
+"q) c #B16F19",
+"r) c #AC6A16",
+"s) c #C27F39",
+"t) c #B57434",
+"u) c #B77634",
+"v) c #C07B30",
+"w) c #B16F18",
+"x) c #AD6B17",
+"y) c #BF7C36",
+"z) c #C07D37",
+"A) c #B47333",
+"B) c #B77632",
+"C) c #A56212",
+"D) c #C47F31",
+"E) c #AE6B1A",
+"F) c #B66F1D",
+"G) c #A3610C",
+"H) c #C37F2C",
+"I) c #AB6817",
+"J) c #A96610",
+"K) c #AD6614",
+"L) c #B8711F",
+"M) c #A05A13",
+"N) c #A15D13",
+"O) c #A3631B",
+"P) c #BA7937",
+"Q) c #B2712F",
+"R) c #B5752E",
+"S) c #A35F16",
+"T) c #BC782D",
+"U) c #BF7828",
+". + @ # $ % & * = - ; > , ' ) ! ~ { ] ^ / ( _ : < [ } | 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 o p q 2 r s t u g v w x y z A B C D E F G H I I J K L M N N M L K J I I H G F E D C B A z y x w v g u t s r 2 q p o o n m l k j i h g ] f e d c b a 0 9 8 7 6 5 4 3 2 1 | } [ < : _ ( / ^ ] { ~ ! ) ' , > ; - = * & % $ # @ + . ",
+"O + P Q R S & T U V W X Y Z ` ...+.@.#./ $._ : %.&.*.=.-.;.>.,.'.).!.~.{.].a ^./.(._.:.:.h h <.[.j }.b |.e _.1.2.3.3.%.4.h 5.6.7.8.9.0.a.b.c.d.e.f.g.h.i.j.L k.l.m.n.n.m.l.k.L j.i.h.g.f.e.d.c.b.a.0.9.8.7.6.5.h 4.%.3.3.2.1._.e |.b }.j [.<.h h :.:._.(./.^.a ].{.~.!.).'.,.>.;.-.=.*.&.%.: _ $./ #.@.+... .` Z Y X W V U T & S R Q P + O ",
+"o.p.q.2 $ r.s.t.u.v.w.x.y.z.A.B.R C.D.E.F.G.H.I.J.K.L./ / M.M.1.N.N.O.P.Q.R.S.p.T.T.U.V.V.W.X.Y.Z.`. +w .+b.B ++@+%.#+y.$+%+&+*+=+-+;+>+{ ,+'+)+D !+~+{+]+{+{+^+/+(+_+_+(+/+^+{+{+]+{+~+!+D )+'+,+{ >+;+-+=+*+&+%+$+y.#+%.@+++B b..+w +`.Z.Y.X.W.V.V.U.T.T.p.S.R.Q.P.O.N.N.1.M.M./ / L.K.J.I.H.G.F.E.D.C.R B.A.z.y.x.w.v.u.t.s.r.$ 2 q.p.o.",
+":+<+[+@+}+|+1+2+3+4+5+6+7+8+9+0+a+b+c+d+e+f+H.I.g+h+] / ] M.i+j+N.j+O.k+l+; m+n+Y.>+U.o+p+q+r+s+t+m+ +7.u+v+w+x+@+3.}+y+8+z+A+B+C+y+D+{ E+ +F+G+D !+~+{+]+{+/+{+H+_+/+/+_+H+{+/+{+]+{+~+!+D G+F+ +E+{ D+y+C+B+A+z+8+y+}+3.@+x+w+v+u+7. +m+t+s+r+q+p+o+U.>+Y.n+m+; l+k+O.j+N.j+i+M.] / ] h+g+I.H.f+e+d+c+b+a+0+9+8+7+6+5+4+3+2+1+|+}+@+[+<+:+",
+"e+I+J+K+L+M+N+O+P+Q+5+6+y.R+S+T+U+V+W+o+X+Y+Z+`+ @.@j+/ L.h L.N.p ] +@; @@`.`.#@[email protected]+A %@;+t+m+h +x 0 ,+:.%.&@0+R+B+A+0+R+*@[email protected]@;@>@6 ~+{+]+/+H+H+~+,@'@'@,@~+H+H+/+]+{+~+6 >@;@[email protected].=@A+*@R+0+A+B+R+0+&@%.:.,+0 x +h m+t+;+%@A p+V.$@X.+.#@`.`.@@; +@] p N.L.h L./ j+.@ @`+Z+Y+X+o+W+V+U+T+S+R+y.6+5+Q+P+O+N+M+L+K+J+I+e+",
+")@!@~@{@]@^@/@(@_@:@<@[@}@B+|@B.1@V+2@o+3@Y+4@5@ @.@_ 6@7@8@9@$._ 0@l+; n+`.;+#@a@r+b@[email protected]+%@s+;[email protected].,[email protected] m f@g@z+h@R i@j@k@l@X+c@i+m@n@o@6 [+{+^+/+[+[+p@q@r@r@q@p@[+[+/+^+{+[+6 o@n@m@i+c@X+l@k@j@i@R h@z+g@f@m 2 N.7.e@,+5.M.d@;+s+%@q+V.c@b@r+a@#@;+`.n+; l+0@_ $.9@8@7@6@_ .@ @5@4@Y+3@o+2@V+1@B.|@B+}@[@<@:@_@(@/@^@]@{@~@!@)@",
+")@Y+s@t@u@v@w@x@y@z@A@B@u@0+C@0+1@-+c@o+3@!@D@E@g+F@G@a &.H@a %.I@H@J@K@L@t+s+M@N@O@P@c@o+q+%@;+;+d@7@[email protected]@2.R@S@T@U@$ V@R R+W@X@I+V.$@i+Y@+ Z@`@[+{+^+/+[+[+p@q@^+^+q@p@[+[+/+^+{+[+`@Z@+ Y@[email protected]+X@W@R+R V@$ U@T@S@[email protected]@[email protected]@d@;+;+%@q+o+c@P@O@N@M@s+t+L@K@J@H@I@%.a H@&.a G@F@g+E@D@!@3@o+c@-+1@0+C@0+u@B@A@z@y@x@w@v@u@t@s@Y+)@",
+"d+ #.#+#@###$#%#&#*#=#-#~ ;#>#z+,#'#O@p+3@)#D@5@g+K.!#: !#&.a 3.~#: {#K@]#;+r+ #O@X+^#o+e+=@/#t+D+S.H@u Q@(#:._#:#<#[#}#;#|#1#A+2#3#Y+4#5#0@).6#7#8#~+{+]+/+H+H+~+,@H+H+,@~+H+H+/+]+{+~+8#7#6#).0@5#4#Y+3#2#A+1#|#;#}#[#<#:#_#:.(#Q@u [email protected]+t+/#=@e+o+^#X+O@ #r+;+]#K@{#: ~#3.a &.!#: !#K.g+5@D@)#3@p+O@'#,#z+>#;#~ -#=#*#&#%#$###@#+#.# #d+",
+"#@M@9#;.T@0#a#b#c#d#e#> C+0+f#g#h#[email protected]@)#i#I.-.j#k#[ l#[ m#n#&@o#Z.;+]#E+r+F.^#5#p#d+e+A %@;+q#S.3 7@] f N.s r#s#t#u#*+'#b+z+v#w#Y+U.x#8@y#z#A#B#~+{+]+{+/+{+H+_+/+/+_+H+{+/+{+]+{+~+B#A#z#y#8@x#U.Y+w#v#z+b+'#*+u#t#s#r#s N.f ] 7@3 S.q#;+%@A e+d+p#5#^#F.r+E+]#;+Z.o#&@n#m#[ l#[ k#j#-.I.i#)#[email protected]@-+h#g#f#0+C+> e#d#c#b#a#0#T@;.9#M@#@",
+"m+o.B#R@C#D#E#F#G#k+P+6+h#%+H#z+I#]@N@X+N@!@J#K#1 L#M#b m#l#m#N#&@n#t+q#O#{ N@F.$@b@p#p+p+P#E+T.;+Q#R#0@] / S#s S@T#U#V#W#X#Y#Z#`# $.$^#+$3 y#@$A##$~+{+]+{+{+^+/+(+^+^+(+/+^+{+{+]+{+~+#$A#@$y#3 +$^#.$ $`#Z#Y#X#W#V#U#T#S@s S#/ ] 0@R#Q#;+T.E+P#p+p+p#b@[email protected]@{ O#q#t+n#&@N#m#l#m#b M#L#1 K#J#!@N@X+N@]@I#z+H#%+h#6+P+k+G#F#E#D#C#R@B#o.m+",
+"C@$$T@%$&$*$K+:+=$-$;$>$,$'$)$X+T.Q#!$5.j+( ~#&@~${$]$^$/$($~$k#m R@_$:$<$[$|.^.: }$|$1$2$|@x.~.3$4$5$6$7$8$9$0$a$b$U#c$8+d$e$L+U@f$I@8@g$h$i$j$k$l$m$m$n$o$p$q$q.r$s$s$r$q.q$p$o$n$m$m$l$k$j$i$h$g$8@I@f$U@L+e$d$8+c$U#b$a$0$9$8$7$6$5$4$3$~.x.|@2$1$|$}$: ^.|.[$<$:$_$R@m k#~$($/$^$]${$~$&@~#( j+5.!$Q#T.X+)$'$,$>$;$-$=$:+K+*$&$%$T@$$C@",
+"t$u$-.v$&$w$x$a.y$z$A$B$C$>#g@D$;+m+E$F$j+( 3.&@l G$H${$I$J$($b < &@K$:$<$L$8@M$v$_.N$g$u j@O$U 3$B#P$Q$R$S$J+T$U$V$W$u#8+-#X$X#k@Y$~#7@P h$Q$j$Z$`$m$m$n$o$p$ %q$.%T$T$.%q$ %p$o$n$m$m$`$Z$j$Q$h$P 7@~#Y$k@X#X$-#8+u#W$V$U$T$J+S$R$Q$P$B#3$U O$j@u g$N$_.v$M$8@L$<$:$K$&@< b ($J$I${$H$G$l &@3.( j+F$E$m+;+D$g@>#C$B$A$z$y$a.x$w$&$v$-.u$t$",
+"U@u$g+o#+%@%#%A $%A$%%&%*%B.%@=%-%;%>%,%1._ 3.&@M$'%o#)%!%m#&@m#~%N#K$i {%]%0@l I@^%/%g$9@j@(%_%3$a$:%7#<%[%J+}%|%1%2%u#&+3%4%~ W#5%( 7@6%G+Q$7%8%9%m$m$n$o$o$o$o$o$T$T$o$o$o$o$o$n$m$m$9%8%7%Q$G+6%7@( 5%W#~ 4%3%&+u#2%1%|%}%J+[%<%7#:%a$3$_%(%j@9@g$/%^%I@l 0@]%{%i K$N#~%m#&@m#!%)%o#'%M$&@3._ 1.,%>%;%-%=%%@B.*%&%%%A$$%A #%@%+%o#g+u$U@",
+"$@K#< 0%4$#$a%w V+b%c%d%e%f%g%h%[$i%j%^%i+2$v$N#{$'%v$I@k%m#N#l#l%~$_$g m%]%8@M$v$v n%1$6@j@4%o%3$p%q%Z@<%r%s%o$t%.#1 u%r+v%w%`[email protected] P x%y%r@z%N A%m$o$p$p$n$m$A%s$s$A%m$n$p$p$o$m$A%N z%r@y%x%P h 1.c@r+`.w%v%r+u%1 .#t%o$s%r%<%Z@q%p%3$o%4%j@6@1$n%v v$M$8@]%m%g _$~$l%l#N#m#k%I@v$'%{$N#v$2$i+^%j%i%[$h%g%f%e%d%c%b%V+w a%#$4$0%< K#$@",
+"B%: < C%/+j.`@D%`.y$E%F%Z.G%H%I%J%K%e@,%:$L%H@)%l M%M.N.7@G@m#N%r#O%P%M.m%Q%L%M%&.c R%S%9@|@T%o%3$p%q%E U%V%s%n$W%X%n i+,+Y%b.Z%w+7. +i Y@`%{+ &.&H A%m$p$ % %o$A%+&s$s$+&A%o$ % %p$m$A%H .& &{+`%Y@i +7.w+Z%b.Y%,+i+n X%W%n$s%V%U%E q%p%3$o%T%|@9@S%R%c &.M%L%Q%m%M.P%O%r#N%m#G@[email protected]%l )%H@L%:$,%e@K%J%I%H%G%Z.F%E%y$`.D%`@j./+C%< : B%",
+"B%v$@&H+#&$&%&D%d@&&*&=&O@_#$.-&;&>&7.F$,&k '&)%J$}._.x+] n : )&r#!&~&L.{%{&k '%]&^&/&(&u |@_&:&3$<&[&E }&|&[+1&2&J+/ [email protected] 3&v+B u+x _.4&5&s$s$6&7&8&m$ %.%.%p$A%+&T$T$+&A%p$.%.% %m$8&7&6&s$s$5&4&_.x u+B v+3&7 @. +/ J+2&1&[+|&}&E [&<&3$:&_&|@u (&/&^&]&'%k {&{%L.~&!&r#)&: n ] x+_.}.J$)%'&k ,&F$7.>&;&-&$._#O@=&*&&&d@D%%&$&#&H+@&v$B%",
+"4 9&0&s$a&b&c&d&w+-+a@e+2.m e&f&5 9$7.F$,&k ]&o#J$}.g&h& +1.v$l#r#^$i&] {%-%4.j&!#_.k&-@7@|@x.U 3$4$l&m&b$n&(+o&2&p&q&F+r&s&t&u&v&w&Z%o x&5&p$s$y&z&+&m$ %r$r$q$n$8&}%}%8&n$q$r$r$ %m$+&z&y&s$p$5&x&o Z%w&v&u&t&s&r&F+q&p&2&o&(+n&b$m&l&4$3$U x.|@7@-@k&_.!#j&4.-%{%] i&^$r#l#v$1. +h&g&}.J$o#]&k ,&F$7.9$5 f&e&m 2.e+a@-+w+d&c&b&a&s$0&9&4 ",
+"6#w$A&}%B&C&D&d&B X#^#E&F&G&H&I&/+s%,+,%,&B%&.n#J$M%8.3&o L.~#n#J&K&L&] {%M&4.G$G@F$k&N&8@|@> O&P&y%Q&R&b$S&p@:%T&U&q&F+q&s&r&V&W&X&M&,%y#Y&o$}%Z&`& *m$q$5$5$.%o$A%.*.*A%o$.%5$5$q$m$ *`&Z&}%o$Y&y#,%M&X&W&V&r&s&q&F+q&U&T&:%p@S&b$R&Q&y%P&O&> |@8@N&k&F$G@G$4.M&{%] L&K&J&n#~#L.o 3&8.M%J$n#&.B%,&,%,+s%/+I&H&G&F&E&^#X#B d&D&C&B&}%A&w$6#",
+"!#v$7&H s$s$f&1$+*]%b.@*#*$*o&}%%*&***>.v+c =*-*%.;*p+.$>*!#0%,*'*.%p$)*!*~*{*]+8#]*]&k ^%,+!$,%u 3 8@F+^*/*(*_*:*<*7@8@q i [*(#}*|*8@L%1*2*{+3*4*5*6*:%o$}%7*a$p&J+8*8*J+p&a$7*}%o$:%6*5*4*3*{+2*1*L%8@|*}*(#[*i q 8@7@<*:*_*(*/*^*F+8@3 u ,%!$,+^%k ]&]*8#]+{*~*!*)*p$.%'*,*0%!#>*.$p+;*%.-*=*c v+>.**&*%*}%o&$*#*@*b.]%+*1$f&s$s$H 7&v$!#",
+"a G@9*#&0*.*a*b*x v+c*@.:*d*e* &%&f*g*>.v+v h*P%I@;*O@)@`+!#i*j*k*q$l*o@/&m*n*.*B#d.3 o*F$7.7 ^%9@!#8@F+^*p*(*_*q*r*a 0@$.s*t*5.c o 0@8@u*v*{+A&N w*x*p$p$0*,@#$E y*U&U&y*E #$,@0*p$p$x*w*N A&{+v*u*8@0@o c 5.t*s*$.0@a r*q*_*(*p*^*F+8@!#9@^%7 7.F$o*3 d.B#.*n*m*/&o@l*q$k*j*i*!#`+)@O@;*I@P%h*v v+>.g*f*%& &e*d*:*@.c*v+x b*a*.*0*#&9*G@a ",
+"n 6@z*#&.*A*B*4 e >%C*g q*D*o&}%j.%*E*|.0 ^%j&_$: F*G*H*`+: I*@&2&.%J*n*K*m*7#3*#$L*3 B% +,+}*v 9@v$8@M*N*g.O*P*0%Q*~#H@7@R*t*:$}$^%8@0@z#v*'@s$N S*T* % %0*2&/+7%U*V*V*U*7%/+2&0* % %T*S*N s$'@v*z#0@8@^%}$:$t*R*7@H@~#Q*0%P*O*g.N*M*8@v$9@v }*,+ +B%3 L*#$3*7#m*K*n*J*.%2&@&I*: `+H*G*F*: _$j&^%0 |.E*%*j.}%o&D*q*g C*>%e 4 B*A*.*#&z*6@n ",
+"p / W*p*A&q.X*Y*k c e 0@q*Z*p$ &g.%&T#o*8.^%G$`*]&F* =4#`+a I*.=I&r$+=7#@=#=E q$[+$=3 L%5.%=&=^&7@v$8@*===7&-=P*+%B n#]&R#4.k ,&s*<.|.0@z#v*R&;=>=,=8&p$o$o$A& &'=T$)=)=T$'= &A&o$o$p$8&,=>=;=R&v*z#0@|.<.s*,&k 4.R#]&n#B +%P*-=7&==*=8@v$7@^&&=%=5.L%3 $=[+q$E #=@=7#+=r$I&.=I*a `+4# =F*]&`*G$^%8.o*T#%&g. &p$Z*q*0@e c k Y*X*q.A&p*W*/ p ",
+"1.Q@c&I A&q.!=~=]&8@L%H@C%{=A%'=]=^=/=k (=o j&_=3 ;* =^#:=a I*<=2&[=+=y%}=|=1=A%{+>@3 B%5.x 2=3=8@!#8@4=5=9*6=7=I*u+)%)&!%H@7@o*8=8=|.7@y#9=R&;=>=0=A%o$A%m$ %8&T*a=b=b=a=T*8& %m$A%o$A%0=>=;=R&9=y#7@|.8=8=o*7@H@!%)&)%u+I*7=6=9*5=4=8@!#8@3=2=x 5.B%3 >@{+A%1=|=}=y%+=[=2&<=I*a :=^# =;*3 _=j&o (=k /=^=]='=A%{=C%H@L%8@]&~=!=q.A&I c&Q@1.",
+" +c=j.d=A*q$e=f={$v$l#m#<=.=}%g=h=i=/=|.Y%_.I$`*3 j=G*5#k=!#I*.=2&l=7=8#m=n=o=T*s$7#'&k F$x &=c 7@!#8@r&>&J p=q=f&0 {$^.r=&@3.k B%o*8@u s=@$r@ &4*0= &}%A%n$l*t=t=u=+&+&u=t=t=l*n$A%}% &0=4* &r@@$s=u 8@o*B%k 3.&@r=^.{$0 f&q=p=J >&r&8@!#7@c &=x F$k '&7#s$T*o=n=m=8#7=l=2&.=I*!#k=5#G*j=3 `*I$_.Y%|./=i=h=g=}%.=<=m#l#v${$f=e=q$A*d=j.c= +",
+"!$,+%&h..*:%v=w=H${$J$l <=@&A*n$4*x=!&6@B _.=*y=]&%=N@P@x#'&f&<=I&l=_*/+b$==o=z=A&U&A=j o %=7 ,%_ G@8@q&>&z*B=C=D=8.M$M$h*E=s F=8@0@|.0@G=Y*r@ &H=w* &s$p$P$I=J=K=_*e*e*_*K=J=I=P$p$s$ &w*H= &r@Y*G=0@|.0@8@F=s E=h*M$M$8.D=C=B=z*>&q&8@G@_ ,%7 %=o j A=U&A&z=o===b$/+_*l=I&<=f&'&x#P@N@%=]&y==*_.B 6@!&x=4*n$A*@&<=l J${$H$w=v=:%.*h.%&,+!$",
+"}*u+L=M=0*:%N=O=/$'%H$j&~=C%0*n$9%P=<#_#r*o Q=_$H@!$3@R=S=A=T=C%I&[=U=^+N*V=R&l*[=p&W=X=v ,+%=f _#%.8@q&n=z*Y=C=D=Z=l ~$'%`=:# -&.9@k B%.-+-7%@-h=#- &0*.%$-u=%-&-*-e*e**-&-%-u=$-.%0* &#-h=@-7%+-.-B%k 9@&. -:#`='%~$l Z=D=C=Y=z*n=q&8@%._#f %=,+v X=W=p&[=l*R&V=N*^+U=[=I&C%T=A=S=R=3@!$H@_$Q=o r*_#<#P=9%n$0*C%~=j&H$'%/$O=N=:%0*M=L=u+}*",
+"=---;-8*p%>-/+0*}%.*,-s$}%}%A&.*T$3*_+_+'-1=7#)-!-)*>.R#4 +-V*/+~-{-]-5$m&^-Q$U&U*/+/-H@!%(-M#b _-~#c=/ ]$:-<-E*,&E$&.%.4 [-}-;-l.|-]&!#9=1-s$z=w*2-x*l*J*J*3-:%T*z=]=]=z=T*:%3-J*J*l*x*2-w*z=s$1-9=!#]&|-l.;-}-[-4 %.&.E$,&E*<-:-]$/ c=~#_-b M#(-!%H@/-/+U*U&Q$^-m&5$]-{-~-/+V*+-4 R#>.)*!-)-7#1='-_+_+3*T$.*A&}%}%s$,-.*}%0*/+>-p%8*;---=-",
+"4-5-6-7-8->-/+0*T$s$9-.*.*.*2&A&s$I&[+p@0-E y*)-9$6$8@8@s=z#a-0$b-{-c-T&0$n*6 p&E H+ -: M#M#d-b e-I@c=9@h*:-<-l L%!$]&G@4 f-g-6-h-i-'&: j-k-}%1&l-m-n-J*:%1&J*o&n-l*o-o-l*n-o&J*1&:%J*n-m-l-1&}%k-j-: '&i-h-6-g-f-4 G@]&!$L%l <-:-h*9@c=I@e-b d-M#M#: -H+E p&6 n*0$T&c-{-b-0$a-z#s=8@8@6$9$)-y*E 0-p@[+I&s$A&2&.*.*.*9-s$T$0*/+>-8-7-6-5-4-",
+"p-q-^-@%a$>-H+.* &T$,-0*.*.*r-A&}%3*^+p@s->-t-u-~@v-0@2$w-s=V*x-y-y&a=[=/+7#9$p&A#~+!%o#'&3 3 H@R@)%5.9@I$z-A-l >.,%N%[ @$B-C-j$D-E-A=v$D=k- &o&F-l-z=P$o&n-:%1&e*G-H-H-G-e*1&:%n-o&P$z=l-F-o& &k-D=v$A=E-D-j$C-B-@$[ N%,%>.l A-z-I$9@5.)%R@H@3 3 '&o#!%~+A#p&9$7#/+[=a=y&y-x-V*s=w-2$0@v-~@u-t->-s-p@^+3*}%A&r-.*.*0*,-T$ &.*H+>-a$@%^-q-p-",
+"Y%I-u-J-#$>-[+A* &K-L-}%s$s$I&.*K-.*/+(+0-A#J+M-X%N-L.M.O-@ ^-x-i.i.P$P-p@U&6$J+A#~+h*o#'&>.>.'&m {$M.u h***E*l 8@i+m#)&+%Q-'-R-L z&S-~#+%1-T$l*S*l-e*P$o&e*:%1&e*G-T-T-G-e*1&:%e*o&P$e*l-S*l*T$1-+%~#S-z&L R-'-Q-+%)&m#i+8@l E***h*u M.{$m '&>.>.'&o#h*~+A#J+6$U&p@P-P$i.i.x-^-@ O-M.L.N-X%M-J+A#0-(+/+.*K-.*I&s$s$}%L-K- &A*[+>-#$J-u-I-Y%",
+">%U-V-J-B#A#~+A&T$K-L-}%}%}%A&0*K-.*p@(+W-U*`@n*6$!-] <.N&b*o@t-X-M=l*Y-7*p&a%`@A#{+/$l B%:$i o*~$/=0@!#Z-j&~$)%H@u J$=*@&`-7*]+J J '&%.q* ;}%:%S*.;x*l*:%o&G-:%n-l*B=B=l*n-:%G-o&:%l*x*.;S*:%}% ;q*%.'&J J ]+7*`-@&=*J$u H@)%~$j&Z-!#0@/=~$o*i :$B%l /${+A#`@a%p&7*Y-l*M=X-t-o@b*N&<.] !-6$n*`@U*W-(+p@.*K-0*A&}%}%}%L-K-T$A&~+A#B#J-V-U->%",
+"3=+;M-J-8#R-~+I&}% &9-0*s$}%3*.*}%3*7*(+p%x-5 ;-6 @;#;e G+N&o@Q$X-$;J*%;,@p&~@J-E m&K${$4._._.k O%~&]&!#N%l#< o#3 a J$&;*;=;H+0$^=-;&.3.+%;;s$e*F->;,;o&l*J*';l*n-o&,=,=o&n-l*';J*l*o&,;>;F-e*s$;;+%3.&.-;^=0$H+=;*;&;J$a 3 o#< l#N%!#]&~&O%k _._.4.{$K$m&E J-~@p&,@%;J*$;X-Q$o@N&G+e #;@;6 ;-5 x-p%(+7*3*}%.*3*}%s$0*9- &}%I&~+R-8#J-M-+;3=",
+"j `%n*);8#E ~+2&0*}%@-.*}% &A*0*}%2&(+~+W-U*`@6-Q$o@:.v !;-@S&~;%*X-P$%;,@p&X%@%x-a-{;{$j !$|*k S@];)&l#!#I@;.G@Z-[ !&^;/;(;}%K-f._;a v$D=;;}%:;5*`$,;o&:%l*';J*n-o&7&7&o&n-J*';l*:%o&,;`$5*:;}%;;D=v$a _;f.K-}%(;/;^;!&[ Z-G@;.I@!#l#)&];S@k |*!$j {${;a-x-@%X%p&,@%;P$X-%*~;S&-@!;v :.o@Q$6-`@U*W-~+(+2&}%0*A* &}%.*@-}%0*2&~+E 8#);n*`%j ",
+"j <;Z@@%4$E ~+r-A*0*9-s$K-9-}%T$ &I&/+~+[;A#J+^-6 !-};x F+m@D >@%*|;G-1;7*U&X%9#j$2;3;/=4;!$|*,&5;6;k#l#a %._-G@d-b 7;^;8;9;}%}%0;0;G@!#9=;;T$a;b;c;:;o&:%:%a=l*e*l*d;d;l*e*l*a=:%:%o&:;c;b;a;T$;;9=!#G@0;0;}%}%9;8;^;7;b d-G@_-%.a l#k#6;5;,&|*!$4;/=3;2;j$9#X%U&7*1;G-|;%*>@D m@F+x };!-6 ^-J+A#[;~+/+I& &T$}%9-K-s$9-0*A*r-~+E 4$@%Z@<;j ",
+"+.e;I.f;%$m 0%0&3*;=T$0*s$K-;=}%0*}%A#[+g;D*h;i;j;4#V.k;2@L.,.l;);8*r$q.q.3*r@q@m;n;m$>@o;p;a-T&s%>&G@G@3 q;r A=a r;_+9-A&[=l=a=,;n-J*G-a=l*n-x*s;1& *o$a=a=q%t=%-l&0$0$l&%-t=q%a=a=o$ *1&s;x*n-l*a=G-J*n-,;a=l=[=A&9-_+r;a A=r q;3 G@G@>&s%T&a-p;o;>@m$n;m;q@r@3*q.q.r$8*);l;,.L.2@k;V.4#j;i;h;D*g;[+A#}%0*}%;=K-s$0*T$;=3*0&0%m %$f;I.e;+.",
+"T.X.p#x#f;G@+%0&3*@-0*0*}%T$0*3*.*K-E H+g;t;h;i;u;H* =X+ =i+,.v;`@);r$r$q.3*r@q@n;1=m$o@#=w;x;l=4$>&a v$H@q;r k%a y;_+K-3*q.q.G-,;x*l*G-a=J*e*T*n-1&8&p$q.G-o&z;A;B;0$0$B;A;z;o&G-q.p$8&1&n-T*e*J*a=G-l*x*,;G-q.q.3*K-_+y;a k%r q;H@v$a >&4$l=x;w;#=o@m$1=n;q@r@3*q.r$r$);`@v;,.i+ =X+ =H*u;i;h;t;g;H+E K-.*3*0*T$}%0*0*@-3*0&+%G@f;x#p#X.T.",
+"Z.X.V.b@^#G@0%C;2&K-0*s$T$T$A&r-.*9-U*[+D;Z*h;i;f;E;F;G*G;L.4&H;p&`@5$5$r$I&r@q@I;U*8&6-5=L*;=c-{+==&.!#a q;%.]&: F=_+.*J;p$o$a=x*x*:%J*G-J*z=s;n-z=T$0*q.q$o&K;L;q%0$0$q%L;K;o&q$q.0*T$z=n-s;z=J*G-J*:%x*x*a=o$p$J;.*_+F=: ]&%.q;a !#&.=={+c-;=L*5=6-8&U*I;q@r@I&r$5$5$`@p&H;4&L.G;G*F;E;f;i;h;Z*D;[+U*9-.*r-A&T$T$s$0*K-2&C;0%G@^#[email protected].",
+"[email protected] D=B*A*m$s$0*T$K-}%A*.*K-R-~+M;N;H$O;u;E;P;G*[email protected]&,.U&J+T&T&5$I&m&q@j$A#T*^->&o@m$$-0$Q;]&&.3.q;~#&.!#S-p@A&R;m$A%$-1&e*o$ %.%q$o$A%A%m$s$.*A* %n$z=q%S;0$0$S;q%z=n$ %A*.*s$m$A%A%o$q$.% %o$e*1&$-A%m$R;A&p@S-!#&.~#q;3.&.]&Q;0$$-m$o@>&^-T*A#j$q@m&I&5$T&T&J+U&,.4&L.c@G*P;E;u;O;H$N;M;~+R-K-.*A*}%K-T$0*s$m$A*B*D=n V.a@E++.X.",
+"T;U;V;Y.=@/ .-W;K-8&.*3*A*K-9-T$A&I&4$p@M;N;^$X;u;p#G*3@o+g + Y;Z@U&5$T&5$3*7%W%j$s%n-1=Z;y*p$u= &`;]&H@e-_-v$: &.k%/+s$r-+& *3-:%:%o$p$ %p$o$m$m$n$H+H+0*s$n$n$:%l*0$0$l*:%n$n$s$0*H+H+n$m$m$o$p$ %p$o$:%:%3- *+&r-s$/+k%&.: v$_-e-H@]&`; &u=p$y*Z;1=n-s%j$W%7%3*5$T&5$U&Z@Y;+ g o+3@G*p#u;X;^$N;M;p@4$I&A&T$9-K-A*3*.*8&K-W;.-/ [email protected];U;T;",
+" >.>+>@>#>H%z#1-p$:%A&r-2& &,- &I&'*#$p@g;Z*T#$>k=U.O@3@d+8=H;b*^-7#5$5$5$A*o=7*j$4$%>r@&>p&J**>}%a%H@H@=>;.H@a ]&]&0$@-.* *g=J*e*J*s$s$}%T$T$T$}%s$s%/+{+}%}%o$p$:%0$0$:%p$o$}%}%{+/+s%s$}%T$T$T$}%s$s$J*e*J*g= *.*@-0$]&]&a H@;.=>H@H@a%}%*>J*p&&>r@%>4$j$7*o=A*5$5$5$7#^-b*H;8=d+3@[email protected]=$>T#Z*g;p@#$'*I& &,- &2&r-A&:%p$1-z#H%#>@>+>.> >",
+"->;>>>,>'>)>!><=T&J*A*3*A*;=,- &A&2&#$[+~>d*s#{>:=4#X+N@ #8=-&@ V-Z@r$5$r$.*]>p@j$8#S;r@6$A#1&P*m$X%: &.^>2 k%a 3 &./+,-.*m$8&o&T*a=.*s$ &K- &}%0*.*y%>-^+^+}%}%o$n$0$0$n$o$}%}%^+^+>-y%.*0*}% &K- &s$.*a=T*o&8&m$.*,-/+&.3 a k%2 ^>&.: X%m$P*1&A#6$r@S;8#j$p@]>.*r$5$r$Z@V-@ -&8= #N@X+4#:={>s#d*~>[+#$2&A& &,-;=A*3*A*J*T&<=!>)>'>,>>>;>->",
+"a@/>(>P._>h&O-0&5$e*}%s$K-'=,- &s$T$B#{+:>!=<#<>5@H*V.3@[>:$+ }>6-7#q.r$q.0*a-(+j$B#|>1>2>j$J=|> *5 a !#3>r A=a '&!#_+;=3*q.p$o&T*$-~+/+0$r@0${+[+~+A#A#A#^+}%}%n$A%0$0$A%n$}%}%^+A#A#A#~+[+{+0$r@0$/+~+$-T*o&p$q.3*;=_+!#'&a A=r 3>!#a 5 *|>J=j$2>1>|>B#j$(+a-0*q.r$q.7#6-}>+ :$[>[email protected]*5@<><#!=:>{+B#T$s$ &,-'=K-s$}%e*5$0&O-h&_>P.(>/>a@",
+"W+4>X$y+5>6>-*~&7>~>.*K-9-@-;=;=s$I&,@[+[+,@p@]+/+8>M$O%b m I@R#_ $.( 6@$.2.2$6@@+_ 9>b i+H@0>a>3;o#Z@D;b>C#g#;%c>{+9-}%3*A&T$@-}%2& *.*;=[+R&#$A#s%y*^+d>e>f>O;X+'>g>g>'>X+O;f>e>d>^+y*s%A##$R&[+;=.* *2&}%@-T$A&3*}%9-{+c>;%g#C#b>D;Z@o#3;a>0>H@i+b 9>_ @+6@2$2.$.6@( $._ R#I@m b O%M$8>/+]+p@,@[+[+,@I&s$;=;=@-9-K-.*~>7>~&-*6>5>y+X$4>W+",
+"[email protected]%~ }#h>/=i>{=B*T$;=;=T$s$}%.*I&,@[+[+7*(+]+{+W%M$J$)&&@%.H@$._ n n @+( 7@n j>9@K&8@7.>.y=k>l>I@`@D;m>n>T+;%*= &.%r$5$q.o$m$ %5$9-0*;=[+R&<&U&J+7#'@N=o>p>q>E.r>s>s>r>E.q>p>o>N='@7#J+U&<&R&[+;=0*9-5$ %m$o$q.5$r$.% &*=;%T+n>m>D;`@I@l>k>y=>.7.8@K&9@j>n 7@( @+n n _ $.H@%.&@)&J$M$W%{+]+(+7*[+[+,@I&.*}%s$T$;=;=T$B*{=i>/=h>}#~ T%T.2@",
+"3@t>u>,#t$v>G${$e&a* &;= &.*A&A*A*2&_+H+H+p@~+]+{+_+{$~$N%< 2 : 2.9@2$_ j>n 8@( _#0@N% +M&^%j&w>l x+x>@&y>z>;#A>-@K-B>I=S;L;t=z;K;L;@-0*r@[+j$9#p&J+E 9-C>D>3;E>e+#>s@s@#>e+E>3;D>C>9-E J+p&9#j$[+r@0*@-L;K;z;t=L;S;I=B>K--@A>;#z>y>@&x>x+l w>j&^%M& +N%0@_#( 8@n j>_ 2$9@2.: 2 < N%~${$_+{+]+~+p@H+H+_+2&A*A*A&.* &;= &a*e&{$G$v>t$,#u>t>3@",
+"[email protected]@*+W@$@]&l#i*B*.*}%s$3*I&A&A&2&~+{+/+(+~+/+H+_+}.S@o#:#s !#( 2$8@_ q n 8@2._#>.v$j=i%u+H@E*G@F*F>q*E*G>H>[$b*n$I>+=L;t=z;L;z;J>'@H+r@8#x-7-6 9$]+9-K>L>w>M>P@E+6$6$E+P@M>w>L>K>9-]+9$6 7-x-8#r@H+'@J>z;L;z;t=L;+=I>n$b*[$H>G>E*q*F>F*G@E*H@u+i%j=v$>._#2.8@n q _ 8@2$( !#s :#o#S@}._+H+/+~+(+/+{+~+2&A&A&I&3*s$}%.*B*i*l#]&$@W@*[email protected]@",
+"G*N>j@C@C@[email protected]@O>i*J;3*A*3*A&.*A&r-{+]+^+[+(+(+(+_+}.P>R@`=r H@_ 7@8@n q [email protected]>>.@+Q>R>{&v$O%( r*S>+%M$V#H>T>y#l*I=U>%>V>+=I>%>J>]+~+U*5 Z@.#6 Q$K-+&W>e=M$F@X>P;J+J+P;X>F@M$e=W>+&K-Q$6 .#Z@5 U*~+]+J>%>I>+=V>%>U>I=l*y#T>H>V#M$+%S>r*( O%v${&R>Q>@+>.j>2.7@$.q n 8@7@_ H@r `=R@P>}._+(+(+(+[+^+]+{+r-A&.*A&3*A*3*J;i*O>[email protected]@C@C@j@N>G*",
+"G*q#t$Y>Z>N>j=N.w-i*`>r-3*3*A&.*A*2&^+^+{+[+p@7*_+p@l ,E=.,r !#$.7@2$9@_#q n ( 2.7@s ;*<$+,3.@,%.#,U%9&$,u#T+T>i*%, %q$p$n$.%[=p$&,s%#$U*5 *,.#!+d&+&8&=,G&n#j#j;-,4$4$-,j;j#n#G&=,8&+&d&!+.#*,5 U*#$s%&,p$[=.%n$p$q$ %%,i*T>T+u#$,9&U%#,%.@,3.+,<$;*s 7@2.( n q _#9@2$7@$.!#r .,E= ,l p@_+7*p@[+{+^+^+2&A*.*A&3*3*r-`>i*w-N.j=N>Z>Y>t$q#G*",
+"c@D+$$Y>T+o.Q*;,w-s=J;I&I&r-2&A&A*I&H+H+H+~+_+,@p@[+O%>,n#R@e-r q 0@n 7@@+,,j>_ ( 9@&@(#A>+*l%',R@:.),!,~,{,0.w +%|>/+~+/+'@{+p@{+a-B#a$7#a%*,1%d&V=n-A%~>0&G@j#],I.{+{+I.],j#G@0&~>A%n-V=d&1%*,a%7#a$B#a-{+p@{+'@/+~+/+|>+%w 0.{,~,!,),:.R@',l%+*A>(#&@9@( _ j>,,@+7@n 0@q r e-R@n#>,O%[+p@,@_+~+H+H+H+I&A*A&2&r-I&I&J;s=w-;,Q*o.T+Y>$$D+c@",
+"o+t>^,/,T+o.]%;,. x&3*A*I&k*k*I&A*3*p@p@(+(+_+7*(+{+S@(,b n#_,:,,,8@( 0@2.<,[,6@n _ M$g Z%Q@},|,},p 1,2,3,T@H#,+e&4,7-5,@%t-p&7-J-6-@%8*y*~@*,6,7,]*L;1&X*i*&.j;k=5@r@r@5@k=j;&.i*X*1&L;]*7,6,*,~@y*8*@%6-J-7-p&t-@%5,7-4,e&,+H#T@3,2,1,p },|,},Q@Z%g M$_ n 6@[,<,2.0@( 8@,,:,_,n#b (,S@{+(+7*_+(+(+p@p@3*A*I&k*k*I&A*3*x&. ;,]%o.T+/,^,t>o+",
+"8,9,-+h#1@$+0,|@9+>#{$O%O%E*a,b,c,d,e,J&^$S@^.b f,)&%.3.G@G@2 _-r !#^ p / K+g,p / N.l#H@<.h,h,:$I@:#Z-_,i,(#^%|.&.n#%.v$: I@%.I@: : G@I@v$&.!#a : 3 ~+E 7#j,6 M-U*8>s*s*8>U*M-6 j,7#E ~+3 : a !#&.v$I@G@: : I@%.I@: v$%.n#&.|.^%(#i,_,Z-:#I@:$h,h,<.H@l#N./ p g,K+/ p ^ !#r _-2 G@G@3.%.)&f,b ^.S@^$J&e,d,c,b,a,E*O%O%{$>#9+|@0,$+1@h#-+9,8,",
+"$ k,'#h@1@8+0,|@A.W#l#$,r#s#7;e,y>_=@,<#/=r#M$)%l,!#%.~#G@G@r e-%.!#S#j+p g,K+/ 1.p l [ o*g,g,|.n#l%)&:,m,x+(#u G@:#2 ~#[email protected]@a G@v$G@a &.&.a !#'&{+E y*a%Q$;->-q@s*s*q@>-;-Q$a%y*E {+'&!#a &.&.a G@v$G@a [email protected]@~#2 :#G@u (#x+m,:,)&l%n#|.g,g,o*[ l p 1./ K+g,p j+S#!#%.e-r G@G@~#%.!#l,)%M$r#/=<#@,_=y>e,7;s#r#$,l#W#A.|@0,8+1@h@'#k,$ ",
+"B.n,3%h#y+B+%+C@S+0.m#~%},r#<#J&~&y=a,a,l S@N#3.o,I@3.~#v$v$3.;.3.!#1./ K+^ S#] ] j+s#M$A=$.2.'&($@,N%_,m,@*x+_ 3.p,;.r %.%.I@: a 3.: a : H@H@: !#'&r@R-J+!-Q$y*B#_+M.M._+B#y*Q$!-J+R-r@'&!#: H@H@: a : 3.a : I@%.%.r ;.p,3._ x+@*m,_,N%@,($'&2.$.A=M$s#j+] ] S#^ K+/ 1.!#3.;.3.v$v$~#3.I@o,3.N#S@l a,a,y=~&J&<#r#},~%m#0.S+C@%+B+y+h#3%n,B.",
+"&+q,r,s,I#B.%+A.A.S+v$~%E=S@$,<#7;t,M$~$~$n#n#2 u,2.~#~#v$a ~#2 3.!#h / #.^ N.] L.1.v,J$r=I@3.)&$,w,b _-x,x+x+n v$~%e-s r %.v$&.: %.]&&.H@3 H@v$a H@m&A#);>@Q$t-a$/+1.1./+a$t-Q$>@);A#m&H@a v$H@3 H@&.]&%.: &.v$%.r s e-~%v$n x+x+x,_-b w,$,)&3.I@r=J$v,1.L.] N.^ #./ h !#3.2 ~#a v$~#~#2.u,2 n#n#~$~$M$t,7;<#$,S@E=~%v$S+A.A.%+B.I#s,r,q,&+",
+"8+y,3%I#I#H>H>@#C@@#G@%.r n#O%S@5;5;^.l n#: I@j>$.@+~#~#G@a G@r 3.a g j+^ ^ N.1.L.] a,J$R#n $.!#r#J&)%e-_#:.x+9@!#n#;.2 %.3.a H@: 3.k%3 3 3 &.G@I@: 0$>-8*z,9$Z@<&[email protected]@<&Z@9$z,8*>-0$: I@G@&.3 3 3 k%3.: H@a 3.%.2 ;.n#!#9@x+:._#e-)%J&r#!#$.n R#J$a,] L.1.N.^ ^ j+g a 3.r G@a G@~#~#@+$.j>I@: n#l ^.5;5;S@O%n#r %.G@@#C@@#H>H>I#I#3%y,8+",
+"R+A,]@}@,#B,z+A.C,Z#_ _ I@I@&@l%},P>[ o#m ]&6@j>L.^ ~#3.I@a G@%.%.G@h p ^ #.N.p 1.i+N#G@o*#;H%6@;.< < q;@+#;++6@!#&@s %.3.3.G@!#: ~#'&]&]&3 !#I@I@: ^+R-D,E,X%6-#$R&] ] R&#$6-X%E,D,R-^+: I@I@!#3 ]&]&'&~#: !#[email protected].%.s &@!#6@++#;@+q;< < ;.6@H%#;o*G@N#i+1.p N.#.^ p h G@%.%.G@a I@3.~#^ L.j>6@]&m o#[ P>},l%&@I@I@_ _ Z#C,A.z+B,,#}@]@A,R+",
+"A+F,G,u@I#H,T+9+C@I,_ 6@[email protected]@:#r#$,)%m ;.|.9@#.:$J,3.%.3.v$G@%.r ~#L.S##.K+S#K+p i+9@/ |*r*K,};L,2.R@e-_ Q@++n a ~%;.3.I@%.%.I@v$I@!#: !#H@!#G@v$H@{+j$7-E,.#^-B#m&j+j+m&B#^-.#E,7-j${+H@v$G@!#H@!#: !#I@v$I@%.%.I@3.;.~%a n ++Q@_ [email protected],};K,r*|*/ 9@i+p K+S#K+#.S#L.~#r %.G@v$3.%.3.J,:$#.9@|.;.m )%$,r#:#[email protected]@6@_ I,C@9+T+H,I#u@G,F,A+",
+"B.M,'#y+s,H,T+N,9+O,n 9@6@2 q;E=&@M$3.s q;L%9@^ ,&Q %.r %.G@G@%.r 3./ K+g,N.K+#.N.i+L.f 0 P,Q,R,Q K+< 2 u +:.6@a :#;.3.I@r ;.r I@I@G@I@v$!#!#a !#'&{+V*@%E,S,V-#$'@] ] '@#$V-S,E,@%V*{+'&!#a !#!#v$I@G@I@I@r ;.r I@3.;.:#a 6@:. +u 2 < K+Q R,Q,P,0 f L.i+N.#.K+N.g,K+/ 3.r %.G@G@%.r %.Q ,&^ 9@L%q;s 3.M$&@E=q;2 6@9@n O,9+N,T+H,s,y+'#M,B.",
+"$@T,F+U,V,v&W,q&}>O>j+j+K+8@q;v$N#N#X**;@+5.r+S+9+Y>X,Y,Z,:#`,w$J-a%L.N.N.u I@e-~%b l>: c=5.o#@,_# 'l#I@2$u @+n#/=v,.'J&!&J$n#&@v$&.i>M$3 M.K+I@M%l>2$6@9@0@0@u u 0@p%p%0@u u 0@0@9@6@2$l>M%I@K+M.3 M$i>&.v$&@n#J$!&J&.'v,/=n#@+u 2$I@l# '_#@,o#5.c=: l>b ~%e-I@u N.N.L.a%J-w$`,:#Z,Y,X,Y>9+S+r+5.@+*;X*N#N#v$q;8@K+j+j+O>}>q&W,v&V,U,F+T,$@",
+"-,E;D%+'@'#'$'%'S%4 / / S#>._-v$N#o#X**;_#Q@P#A.9+f@&'Y,*':#='w$J-5 ] N.p 2$G@e-~%[ i>v$j=5.m#<#2.P,&@r 9@i+_ o#/=L&-'J&!&J$n#n#v$H@/=l '&<.1.v$M%^$u 6@9@0@0@9@n 9@p%p%9@n 9@0@0@9@6@u ^$M%v$1.<.'&l /=H@v$n#n#J$!&J&-'L&/=o#_ i+9@r &@P,2.<#m#5.j=v$i>[ ~%e-G@2$p N.] 5 J-w$=':#*'Y,&'f@9+A.P#Q@_#*;X*o#N#v$_->.S#/ / 4 S%%'$'#'@'+'D%E;-,",
+"P@4#%=+,P,;'Q%c=g o*] 1.p |.e-a o#)%X**;_#:.A @#9+f@g+>','e-'':*B#B#1.p / 2$G@s ~%m#-*v$j= +l#s#_ L$:#_-6@:$2$a l m>)'J&s#~$n#N#a H@M%o#'&[.|.: N%G$9@6@u 8@0@6@( _ a$a$_ ( 6@0@8@u 6@9@G$N%: |.[.'&o#M%H@a N#n#~$s#J&)'m>l a 2$:$6@_-:#L$_ s#l# +j=v$-*m#~%s G@2$/ p 1.B#B#:*''e-,'>'g+f@9+@#A :._#*;X*)%o#a e-|.p 1.] o*g c=Q%;'P,+,%=4#P@",
+"5#U.}*v+!'m%L$+,Q@u L.L.j+B%;.: )%)%X*@&_#x+=@A.@#Y>E@>'~'e-''q*B#~+/ j+1.2$G@2 < m#P%a w F$[ !&_ Q%_-i,j+o h a (${'5;J&a,O%n#o#!#]&'&I@8@R*|.9@]&k%2$u 7@|.>.6@$.$.4$4$$.$.6@>.|.7@u 2$k%]&9@|.R*8@I@'&]&!#o#n#O%a,J&5;{'($a h o j+i,_-Q%_ !&[ F$w a P%m#< 2 G@2$1.j+/ ~+B#q*''e-~'>'E@Y>@#A.=@x+_#@&X*)%)%: ;.B%j+L.L.u Q@+,L$m%!'v+}*U.5#",
+"p#U.]'^'@>/'@@('F.f+i+i+/ B%;.: )%)%f=.=2.:.=@Z>S+Y>Y+J#D@_-_'<=~+A&/ 1.] u I@r &@m#A-!#7.,%[ s#( L$_#,,++^%5._ R@:'@,J&7;($N#m#&.3 ,&n 2$R#&.9@|.,&0@7@8@B%L%u ( ( A#A#( ( u L%B%8@7@0@,&|.9@&.R#2$n ,&3 &.m#N#($7;J&@,:'R@_ 5.^%++,,_#L$( s#[ ,%7.!#A-m#&@r I@u ] 1./ A&~+<=_'_-D@J#Y+Y>S+Z>=@:.2..=f=)%)%: ;.B%/ i+i+f+F.('@@/'@>^']'U.p#",
+"<'p#V@['x.&&[@1@}'|'M.i+/ B%;.: o#o#X*<=( :.A |@Z>[email protected]'2'_-3'C%A*r$1.] L.6@3.%.N#l#A-!#7.F$[ s#$.]%$.4')>7.Q@2.:#5'J&J&<#$,N#l#H@3 ,%1.2$&.G@7@<.,%>.0@>.B%L%2$n 6@R-R-6@n 2$L%B%>.0@>.,%<.7@G@&.2$1.,%3 H@l#N#$,<#J&J&5':#2.Q@7.)>4'$.]%$.s#[ F$7.!#A-l#N#%.3.6@L.] 1.r$A*C%3'_-2'1'F.f@Z>|@A :.( <=X*o#o#: ;.B%/ i+M.|'}'1@[@&&x.['V@p#<'",
+"Y+p#u@|#6+T [@~ S+6'i+L.j+L%e-a N#N#7>.=( :.A |@S+7'F.8'9'q;3'~>q$5$L.i+L._ r %.o#[ i>a c= +[ s#_ L$j+0'a'h&F*g,2 P><#J&J&$,o#[ ]&'&[email protected]@l#N#L%c j=>.7@0@|.>.u 6@9@s%s%9@6@u >.|.0@7@>.j=c L%N#l#8@@.c='&]&[ o#$,J&J&<#P>2 g,F*h&a'0'j+L$_ s#[ +c=a i>[ o#%.r _ L.i+L.5$q$~>3'q;9'8'F.7'S+|@A :.( .=7>N#N#a e-L%j+L.i+6'S+~ [@T 6+|#u@p#Y+",
+"!@H*U+'#-#d$b'c'B.7'i+L.j+L%_-v$n#n#g;@&$.:.=@[email protected]'d'8'9'q;3'~>q$3-i+M.L.$.s %.m#b y>I@+*5.[ !&n [$/ e'f'};;,#.%.~%7;J&J&$,o#[ 3 '&Q>5.B%[ o#4.g'Q>8@2$2$8@0@9@6@u B#B#u 6@9@0@8@2$2$8@Q>g'4.o#[ B%5.Q>'&3 [ o#$,J&J&7;~%%.#.;,};f'e'/ [$n !&[ 5.+*I@y>b m#%.s $.L.M.i+3-q$~>3'q;9'8'd'6'A.C@=@:.$.@&g;n#n#v$_-L%j+L.i+7'B.c'b'd$-#'#U+H*!@",
+"h'a&m#9.i'r.r.i'z a m#o#m#o#r=`=b N#p u,)%($k#i+8.;'j'k'o,l'm'!&3.M.(${$M#[ e-3.0@6@7@2$u 9@u 2$0@8@i#J#n'Z+E&o'>*E@E=E=(,S@)%&.>.g y*Y;t*p'q'!#k-@-J+*,d.==r'@;m&A&W*W*A&m&@;r'==d.*,J+@-k-!#q'p't*Y;y*g >.&.)%S@(,E=E=E@>*o'E&Z+n'J#i#8@0@2$u 9@u 2$7@6@[email protected][ M#{$($M.3.!&m'l'o,k'j';'8.i+k#($)%u,p N#b `=r=o#m#o#m#a z i'r.r.i'9.m#a&h'",
+"_;h'N%s't'u'v'w'G;9@)%o#)%o#M#E=Z-l#L._#[ n#H@/ Y%x'{%F*p,];y'P%$,9@J$M%!%b ;.3.0@n 9@9@6@6@9@9@u 2$J#E@z'5@>*i#`+E@r#r#S@N#l#H@[email protected]@Y@<.A'q']&k- &t-o@r'>&d&>@m&.*W*W*.*m&>@d&>&r'o@t- &k-]&q'A'<.Y@[email protected]@H@l#N#S@r#r#E@`+i#>*5@z'E@J#2$u 9@9@6@6@9@9@n 0@3.;.b !%M%J$9@$,P%y'];p,F*{%x'Y%/ H@n#[ _#L.l#Z-E=M#o#)%o#)%9@G;w'v'u't's'N%h'_;",
+"B'#&j&S=>#b#C'y+G*1.~#I@r 3.H@;.3 : g $.3 G@&.N.x Q>#,/ $,m'D'E'i&~$J$^.r=[ e-%.2$( ( _ n n 6@6@6@n J#E&o'`+>*o'E&J#$,$,n#m#H@8@7@u n*@ 5.F't$|.+-T$y*>@7,n=Z;>@r@s$W*W*s$r@>@Z;n=7,>@y*T$+-|.t$F'5.@ n*u 7@8@H@m#n#$,$,J#E&o'>*`+o'E&J#n 6@6@6@n n _ ( ( 2$%.e-[ r=^.J$~$i&E'D'm'$,/ #,Q>x N.&.G@3 $.g : 3 ;[email protected] I@~#1.G*y+C'b#>#S=j&#&B'",
+"#&G':>r=H'I'J'&+e@1$6@u j>_ u 2.|.2$h S#|.2$>.N.:$#;N.v$a,K'D'L'm'-*S@J$k#)%_,s 9@$.$.( _ 6@6@6@n _ i#E@D@>*E&M'4@2'J&S@N#u 8@8@&.a >@[email protected]@Y>|.N''@U&@;`;==&>@;]+.*O'O'.*]+@;&>==`;@;U&'@N'|.Y>j@@.g$>@a &.8@8@u N#S@J&2'4@M'E&>*D@E@i#_ n 6@6@6@_ ( $.$.9@s _,)%k#J$S@-*m'L'D'K'a,v$N.#;:$N.>.2$|.S#h 2$|.2.u _ j>u 6@1$e@&+J'I'H'r=:>G'#&",
+"#&G'q$^$.@P'k@a@%===h ,&S#L.L.] i L.L.^ g h 8=j+>.n $.v$$,w,f>E'Q'<-},($b N#_,r 7@n ( _ n 9@9@9@6@n o'E@i#>*E@R'o'z'S'5;3.] h >.&.m#r'4=%=0.A.M.T'1=`@@;i$U'V$z,H+I&c&c&I&H+z,V$U'i$@;`@1=T'M.A.0.%=4=r'm#&.>.h ] 3.5;S'z'o'R'E@>*i#E@o'n 6@9@9@9@n _ ( n 7@r _,N#b ($},<-Q'E'f>w,$,v$$.n >.j+8=h g ^ L.L.i ] L.L.S#,&h ==%=a@k@P'.@^$q$G'#&",
+"h'G a=Z*V'W'Y$ =3$X'+*e@Y'+*};j=c=};i+L,Q@w e 1.3 N#_ !#< P>!&l>Z'9>},O%)&m#e-I@|.2$_ n 6@9@9@9@9@9@J#>*J#I.E@n'4@i#`'5;%.f +g b /=r'*=e@*@[email protected]*1=J-@;Z;|&s@E,(+r-M M r-(+E,s@|&Z;@;J-1=1*@.A.*@e@*=r'/=b g +f %.5;`'i#4@n'[email protected]#>*J#9@9@9@9@9@6@n _ 2$|.I@e-m#)&O%},9>Z'l>!&P>< !#_ N#3 1.e w Q@L,i+};c=j=};+*Y'e@+*X'3$ =Y$W'V'Z*a=G h'",
+"h'_; ).)`*+)L#/.@)#);,,+$)+*%)w j={@,&&)};r*!$/ k#!&] g ( q;m l i>w>l%~$k#m#e-I@|.2$n n n n n 6@9@u J#>*J#>*Z+R'J#J#*)L&~#+*7.h b /=n&U,w+A+z+ +=)U&5 $=V$-);)E,p@I&>)>)I&p@E,;)-)V$$=5 U&=) +z+A+w+U,n&/=b h 7.+*~#L&*)J#J#R'Z+>*J#>*J#u 9@6@n n n n n 2$|.I@e-m#k#~$l%w>i>l m q;( g ] !&k#/ !$r*};&),&{@j=w %)+*$),+;,#)@)/.L#+)`*.) )_;h'",
+"#&0;,)I>')))!)4.~){)<*0 ])Z%Q*8.v+Q>[.^)/)R,x n j&~&M._.f J,2.o#!&P%l%~$)&)%q;%.0@6@6@n _ ( _ n 9@u i#E&o'E@i#()i#4@_)~&6@j=w+h b l>|&t&Q*:)B.^%,.);p&E,s@U'<)z,p@A&[)[)A&p@z,<)U's@E,p&);,.^%B.:)Q*t&|&l>b h w+j=6@~&_)4@i#()i#E@o'E&i#u 9@n _ ( _ n 6@6@0@%.q;)%)&~$l%P%!&o#2.J,f _.M.~&j&n x R,/)^)[.Q>v+8.Q*Z%])0 <*{)~)4.!)))')I>,)0;#&",
+"0$R-,=9%1&A%C%).v+i%g <.[*4;/.,&h i+,%o o j+k _ y;&.#;g M.@+[,3.a v$~$$,l m#~%r : [email protected]@a '&:,]&G@;.Z+D@`+E@],D@4@z'})|)1)t 2)3)/+r-D S&4)4)L%5)v>j#6)]*5 r@.*b={+[+#$#$[+{+b=.*r@5 ]*6)j#v>5)L%4)4)S&D r-/+3)2)t 1)|)})z'4@D@],E@`+D@Z+;.G@]&:,'&a [email protected]@: r ~%m#l $,~$v$a 3.[,@+M.g #;&.y;_ k j+o o ,%i+h ,&/.4;[*<.g i%v+).C%A%1&9%,=R-0$",
+"]+R-7)8)o&A%B*b*7 9)i <.s*s*,&h ] / @.,% +p L%$.W=v$L.i+1.@+q r n#N#J$O%}.[ r r 6@( ~#!#G@]&_-3 v$e-Z+D@`+Z+],D@J#D@0)<>a)8=b)n@<&q@U'c)D%m@h U.4#H*d)U'`@m&.*L-/+~+#$#$~+/+L-.*m&`@U'd)H*4#U.h m@D%c)U'q@<&n@b)8=a)<>0)D@J#D@],Z+`+D@Z+e-v$3 _-]&G@!#~#( 6@r r [ }.O%J$N#n#r q @+1.i+L.v$W=$.L%p +,%@./ ] h ,&s*s*<.i 9)7 b*B*A%o&8)7)R-]+",
+"^+E 7)x=:%e*f=4 ^&g&g :$:$:$g M.L.1.(#,%5./ |.( A=I@g 1.$.2.r R@~%&@M$J$N%)&3.2.n 2.6@6@( 2$j>|.9@i,H.D@5@J#e)D@Z+i# @4@H*o f)(&.#9#]*N*c>r&(#o+o+p+@=n&J+m&.*x;[+p@<&<&p@[+x;.*m&J+n&@=p+o+o+(#r&c>N*]*9#.#(&f)o H*4@ @i#Z+D@e)J#5@[email protected],9@|.j>2$( 6@[email protected] 2.3.)&N%J$M$&@~%R@r 2.$.1.g I@A=( |./ 5.,%(#1.L.M.g :$:$:$g g&^&4 f=e*:%x=7)E ^+",
+"^+E g)h)o&n-i)v*R*v L.L.L.M.g :$:$g 5.}$ +h |.u S-a o*6@j>~#I@R@(,$,o#N#)&'&_ $./ S#u $.2.6@_ >.u m,H.D@5@4@:=2'H.J#j)k)o+ +l)S%j,2>c)==r&@)j=#@N>#@~*-)p&m&A*'=~+_+a$a$_+~+'=A*m&p&-)~*#@N>#@j=@)r&==c)2>j,S%l) +o+k)j)J#H.2':=4@5@[email protected],u >._ 6@2.$.u S#/ $._ '&)&N#o#$,(,R@I@~#j>6@o*a S-u |.h +}$5.g :$:$g M.L.L.L.v R*v*i)n-o&h)g)E ^+",
+"]+R-m)N 1&z;v=1-W=>.i+L.] i+:$,&,&i F$^&5.,&8@0@A=!#k 9@%.o#)%S@l%($n#3.H@>._ p ] p ] ^ K+p L.M.] n)E@D@5@4@:=2'Z+4@o)o)P#i+m@p)v-*,)*d&1$c>w D+D+t>m*|&p&m&A*'=~+7*a$a$7*~+'=A*m&p&|&m*t>D+D+w c>1$d&)**,v-p)m@i+P#o)o)4@Z+2':=4@5@D@E@n)] M.L.p K+^ ] p ] p _ >[email protected]#($l%S@)%o#%.9@k !#A=0@8@,&5.^&F$i ,&,&:$i+] L.i+>.W=1-v=z;1&N m)R-]+",
+"0$>-F 4*1&K;q)r)M#!#i h i+h i ,&:$M. +^&#;:$n 2$3 a '&: G@o#J$($7;a,3.%[email protected].(#:.Q@&)++++ +Q@(#s)E@o'>*J#e)2'J#o't)u)-,a 2*q*v)t-E R-G=b*:$3@%@D+m*-)p&m&A*'=~+_+a$a$_+~+'=A*m&p&-)m*D+%@3@:$b*G=R-E t-v)q*2*a -,u)t)o'J#2'e)J#>*o'E@s)(#Q@ +++++&)Q@:.(#N.N.0@2$%.3.a,7;($J$o#G@: '&a 3 2$n :$#;^& +M.:$,&i h i+h i !#M#r)q)K;1&4*F >-0$",
+"r@y%F N :%L;w)x)]$m#i h i+h ,&<.g L.5.^&H%h j>9@&.a a !#l#O%S@a,s#7;G@$.u L.g,H%f x+#;y):.@*,%x+(#z)E&i#I.H.K#z'i#z'A)B)5)($C)D;D)/+n$m$E)Y*R#-,c@X+~*-)J+m&.*'=[+p@8-8-p@[+'=.*m&J+-)~*X+c@-,R#Y*E)m$n$/+D)D;C)($5)B)A)z'i#z'K#H.I.i#E&z)(#x+,%@*:.y)#;x+f H%g,L.u $.G@7;s#a,S@O%l#!#a a &.9@j>h H%^&5.L.g <.,&h i+h i m#]$x)w)L;:%N F y%r@",
+"m&s%f.F)l*V>w)O=]$M$i+] 1.M.<.8=i i+F$g')>h q u &.: m [ b $,(,a,!&L&9@_ 2$] ^ t@;*;,:.z)f ++^%@*(#y)E&4@:=E@],z'D@n'r>j)j#@,G)$*H)}%%>o&w=I)r=x#^#4#@=n&J+m&.*x;[+p@a$a$p@[+x;.*m&J+n&@=4#^#x#r=I)w=o&%>}%H)$*G)@,j#j)r>n'D@z'],E@:=4@E&y)(#@*^%++f z):.;,;*t@^ ] 2$_ 9@L&!&a,(,$,b [ m : &.u q h )>g'F$i+i 8=<.M.1.] i+M$]$O=w)V>l*F)f.s%m&",
+"=,J)K)4*8%L)g)m)H=N ~@M)&$N)8@O)G;d'p+N@d+V.o+ #N@o+( |.S-H@n#m $,l%a 3 |.2$j+x+H%# [email protected]+[>[>P)Q)M@l@R))#f+G.H%^ S)T)U*H+U)N ]+{+r@r@{+7%]>'@;-7#9#^-);U&8*t-A&A&t-8*U&);^-9#7#;-'@]>7%{+r@r@{+]+N U)H+U*T)S)^ H%G.f+)#R)l@M@Q)P)[>[>X+E.E.O@I+I+# H%x+j+2$|.3 a l%$,m n#H@S-|.( o+N@ #o+V.d+N@p+d'G;O)8@N)&$M)~@N H=m)g)L)8%4*K)J)=,",
+"=,J)K)4*8%L)g)m)H=N ~@M)&$N)8@O)G;d'p+N@d+V.o+ #N@o+( |.S-H@n#m $,l%a 3 |.2$j+x+H%# [email protected]+[>[>P)Q)M@l@R))#f+G.H%^ S)T)U*H+U)N ]+{+r@r@{+7%]>'@;-7#9#^-);U&8*t-A&A&t-8*U&);^-9#7#;-'@]>7%{+r@r@{+]+N U)H+U*T)S)^ H%G.f+)#R)l@M@Q)P)[>[>X+E.E.O@I+I+# H%x+j+2$|.3 a l%$,m n#H@S-|.( o+N@ #o+V.d+N@p+d'G;O)8@N)&$M)~@N H=m)g)L)8%4*K)J)=,",
+"m&s%f.F)l*V>w)O=]$M$i+] 1.M.<.8=i i+F$g')>h q u &.: m [ b $,(,a,!&L&9@_ 2$] ^ t@;*;,:.z)f ++^%@*(#y)E&4@:=E@],z'D@n'r>j)j#@,G)$*H)}%%>o&w=I)r=x#^#4#@=n&J+m&.*x;[+p@a$a$p@[+x;.*m&J+n&@=4#^#x#r=I)w=o&%>}%H)$*G)@,j#j)r>n'D@z'],E@:=4@E&y)(#@*^%++f z):.;,;*t@^ ] 2$_ 9@L&!&a,(,$,b [ m : &.u q h )>g'F$i+i 8=<.M.1.] i+M$]$O=w)V>l*F)f.s%m&",
+"r@y%F N :%L;w)x)]$m#i h i+h ,&<.g L.5.^&H%h j>9@&.a a !#l#O%S@a,s#7;G@$.u L.g,H%f x+#;y):.@*,%x+(#z)E&i#I.H.K#z'i#z'A)B)5)($C)D;D)/+n$m$E)Y*R#-,c@X+~*-)J+m&.*'=[+p@8-8-p@[+'=.*m&J+-)~*X+c@-,R#Y*E)m$n$/+D)D;C)($5)B)A)z'i#z'K#H.I.i#E&z)(#x+,%@*:.y)#;x+f H%g,L.u $.G@7;s#a,S@O%l#!#a a &.9@j>h H%^&5.L.g <.,&h i+h i m#]$x)w)L;:%N F y%r@",
+"0$>-F 4*1&K;q)r)M#!#i h i+h i ,&:$M. +^&#;:$n 2$3 a '&: G@o#J$($7;a,3.%[email protected].(#:.Q@&)++++ +Q@(#s)E@o'>*J#e)2'J#o't)u)-,a 2*q*v)t-E R-G=b*:$3@%@D+m*-)p&m&A*'=~+_+a$a$_+~+'=A*m&p&-)m*D+%@3@:$b*G=R-E t-v)q*2*a -,u)t)o'J#2'e)J#>*o'E@s)(#Q@ +++++&)Q@:.(#N.N.0@2$%.3.a,7;($J$o#G@: '&a 3 2$n :$#;^& +M.:$,&i h i+h i !#M#r)q)K;1&4*F >-0$",
+"]+R-m)N 1&z;v=1-W=>.i+L.] i+:$,&,&i F$^&5.,&8@0@A=!#k 9@%.o#)%S@l%($n#3.H@>._ p ] p ] ^ K+p L.M.] n)E@D@5@4@:=2'Z+4@o)o)P#i+m@p)v-*,)*d&1$c>w D+D+t>m*|&p&m&A*'=~+7*a$a$7*~+'=A*m&p&|&m*t>D+D+w c>1$d&)**,v-p)m@i+P#o)o)4@Z+2':=4@5@D@E@n)] M.L.p K+^ ] p ] p _ >[email protected]#($l%S@)%o#%.9@k !#A=0@8@,&5.^&F$i ,&,&:$i+] L.i+>.W=1-v=z;1&N m)R-]+",
+"^+E g)h)o&n-i)v*R*v L.L.L.M.g :$:$g 5.}$ +h |.u S-a o*6@j>~#I@R@(,$,o#N#)&'&_ $./ S#u $.2.6@_ >.u m,H.D@5@4@:=2'H.J#j)k)o+ +l)S%j,2>c)==r&@)j=#@N>#@~*-)p&m&A*'=~+_+a$a$_+~+'=A*m&p&-)~*#@N>#@j=@)r&==c)2>j,S%l) +o+k)j)J#H.2':=4@5@[email protected],u >._ 6@2.$.u S#/ $._ '&)&N#o#$,(,R@I@~#j>6@o*a S-u |.h +}$5.g :$:$g M.L.L.L.v R*v*i)n-o&h)g)E ^+",
+"^+E 7)x=:%e*f=4 ^&g&g :$:$:$g M.L.1.(#,%5./ |.( A=I@g 1.$.2.r R@~%&@M$J$N%)&3.2.n 2.6@6@( 2$j>|.9@i,H.D@5@J#e)D@Z+i# @4@H*o f)(&.#9#]*N*c>r&(#o+o+p+@=n&J+m&.*x;[+p@<&<&p@[+x;.*m&J+n&@=p+o+o+(#r&c>N*]*9#.#(&f)o H*4@ @i#Z+D@e)J#5@[email protected],9@|.j>2$( 6@[email protected] 2.3.)&N%J$M$&@~%R@r 2.$.1.g I@A=( |./ 5.,%(#1.L.M.g :$:$:$g g&^&4 f=e*:%x=7)E ^+",
+"]+R-7)8)o&A%B*b*7 9)i <.s*s*,&h ] / @.,% +p L%$.W=v$L.i+1.@+q r n#N#J$O%}.[ r r 6@( ~#!#G@]&_-3 v$e-Z+D@`+Z+],D@J#D@0)<>a)8=b)n@<&q@U'c)D%m@h U.4#H*d)U'`@m&.*L-/+~+#$#$~+/+L-.*m&`@U'd)H*4#U.h m@D%c)U'q@<&n@b)8=a)<>0)D@J#D@],Z+`+D@Z+e-v$3 _-]&G@!#~#( 6@r r [ }.O%J$N#n#r q @+1.i+L.v$W=$.L%p +,%@./ ] h ,&s*s*<.i 9)7 b*B*A%o&8)7)R-]+",
+"0$R-,=9%1&A%C%).v+i%g <.[*4;/.,&h i+,%o o j+k _ y;&.#;g M.@+[,3.a v$~$$,l m#~%r : [email protected]@a '&:,]&G@;.Z+D@`+E@],D@4@z'})|)1)t 2)3)/+r-D S&4)4)L%5)v>j#6)]*5 r@.*b={+[+#$#$[+{+b=.*r@5 ]*6)j#v>5)L%4)4)S&D r-/+3)2)t 1)|)})z'4@D@],E@`+D@Z+;.G@]&:,'&a [email protected]@: r ~%m#l $,~$v$a 3.[,@+M.g #;&.y;_ k j+o o ,%i+h ,&/.4;[*<.g i%v+).C%A%1&9%,=R-0$",
+"#&0;,)I>')))!)4.~){)<*0 ])Z%Q*8.v+Q>[.^)/)R,x n j&~&M._.f J,2.o#!&P%l%~$)&)%q;%.0@6@6@n _ ( _ n 9@u i#E&o'E@i#()i#4@_)~&6@j=w+h b l>|&t&Q*:)B.^%,.);p&E,s@U'<)z,p@A&[)[)A&p@z,<)U's@E,p&);,.^%B.:)Q*t&|&l>b h w+j=6@~&_)4@i#()i#E@o'E&i#u 9@n _ ( _ n 6@6@0@%.q;)%)&~$l%P%!&o#2.J,f _.M.~&j&n x R,/)^)[.Q>v+8.Q*Z%])0 <*{)~)4.!)))')I>,)0;#&",
+"h'_; ).)`*+)L#/.@)#);,,+$)+*%)w j={@,&&)};r*!$/ k#!&] g ( q;m l i>w>l%~$k#m#e-I@|.2$n n n n n 6@9@u J#>*J#>*Z+R'J#J#*)L&~#+*7.h b /=n&U,w+A+z+ +=)U&5 $=V$-);)E,p@I&>)>)I&p@E,;)-)V$$=5 U&=) +z+A+w+U,n&/=b h 7.+*~#L&*)J#J#R'Z+>*J#>*J#u 9@6@n n n n n 2$|.I@e-m#k#~$l%w>i>l m q;( g ] !&k#/ !$r*};&),&{@j=w %)+*$),+;,#)@)/.L#+)`*.) )_;h'",
+"h'G a=Z*V'W'Y$ =3$X'+*e@Y'+*};j=c=};i+L,Q@w e 1.3 N#_ !#< P>!&l>Z'9>},O%)&m#e-I@|.2$_ n 6@9@9@9@9@9@J#>*J#I.E@n'4@i#`'5;%.f +g b /=r'*=e@*@[email protected]*1=J-@;Z;|&s@E,(+r-M M r-(+E,s@|&Z;@;J-1=1*@.A.*@e@*=r'/=b g +f %.5;`'i#4@n'[email protected]#>*J#9@9@9@9@9@6@n _ 2$|.I@e-m#)&O%},9>Z'l>!&P>< !#_ N#3 1.e w Q@L,i+};c=j=};+*Y'e@+*X'3$ =Y$W'V'Z*a=G h'",
+"#&G'q$^$.@P'k@a@%===h ,&S#L.L.] i L.L.^ g h 8=j+>.n $.v$$,w,f>E'Q'<-},($b N#_,r 7@n ( _ n 9@9@9@6@n o'E@i#>*E@R'o'z'S'5;3.] h >.&.m#r'4=%=0.A.M.T'1=`@@;i$U'V$z,H+I&c&c&I&H+z,V$U'i$@;`@1=T'M.A.0.%=4=r'm#&.>.h ] 3.5;S'z'o'R'E@>*i#E@o'n 6@9@9@9@n _ ( n 7@r _,N#b ($},<-Q'E'f>w,$,v$$.n >.j+8=h g ^ L.L.i ] L.L.S#,&h ==%=a@k@P'.@^$q$G'#&",
+"#&G':>r=H'I'J'&+e@1$6@u j>_ u 2.|.2$h S#|.2$>.N.:$#;N.v$a,K'D'L'm'-*S@J$k#)%_,s 9@$.$.( _ 6@6@6@n _ i#E@D@>*E&M'4@2'J&S@N#u 8@8@&.a >@[email protected]@Y>|.N''@U&@;`;==&>@;]+.*O'O'.*]+@;&>==`;@;U&'@N'|.Y>j@@.g$>@a &.8@8@u N#S@J&2'4@M'E&>*D@E@i#_ n 6@6@6@_ ( $.$.9@s _,)%k#J$S@-*m'L'D'K'a,v$N.#;:$N.>.2$|.S#h 2$|.2.u _ j>u 6@1$e@&+J'I'H'r=:>G'#&",
+"B'#&j&S=>#b#C'y+G*1.~#I@r 3.H@;.3 : g $.3 G@&.N.x Q>#,/ $,m'D'E'i&~$J$^.r=[ e-%.2$( ( _ n n 6@6@6@n J#E&o'`+>*o'E&J#$,$,n#m#H@8@7@u n*@ 5.F't$|.+-T$y*>@7,n=Z;>@r@s$W*W*s$r@>@Z;n=7,>@y*T$+-|.t$F'5.@ n*u 7@8@H@m#n#$,$,J#E&o'>*`+o'E&J#n 6@6@6@n n _ ( ( 2$%.e-[ r=^.J$~$i&E'D'm'$,/ #,Q>x N.&.G@3 $.g : 3 ;[email protected] I@~#1.G*y+C'b#>#S=j&#&B'",
+"_;h'N%s't'u'v'w'G;9@)%o#)%o#M#E=Z-l#L._#[ n#H@/ Y%x'{%F*p,];y'P%$,9@J$M%!%b ;.3.0@n 9@9@6@6@9@9@u 2$J#E@z'5@>*i#`+E@r#r#S@N#l#H@[email protected]@Y@<.A'q']&k- &t-o@r'>&d&>@m&.*W*W*.*m&>@d&>&r'o@t- &k-]&q'A'<.Y@[email protected]@H@l#N#S@r#r#E@`+i#>*5@z'E@J#2$u 9@9@6@6@9@9@n 0@3.;.b !%M%J$9@$,P%y'];p,F*{%x'Y%/ H@n#[ _#L.l#Z-E=M#o#)%o#)%9@G;w'v'u't's'N%h'_;",
+"h'a&m#9.i'r.r.i'z a m#o#m#o#r=`=b N#p u,)%($k#i+8.;'j'k'o,l'm'!&3.M.(${$M#[ e-3.0@6@7@2$u 9@u 2$0@8@i#J#n'Z+E&o'>*E@E=E=(,S@)%&.>.g y*Y;t*p'q'!#k-@-J+*,d.==r'@;m&A&W*W*A&m&@;r'==d.*,J+@-k-!#q'p't*Y;y*g >.&.)%S@(,E=E=E@>*o'E&Z+n'J#i#8@0@2$u 9@u 2$7@6@[email protected][ M#{$($M.3.!&m'l'o,k'j';'8.i+k#($)%u,p N#b `=r=o#m#o#m#a z i'r.r.i'9.m#a&h'",
+"!@H*U+'#-#d$b'c'B.7'i+L.j+L%_-v$n#n#g;@&$.:.=@[email protected]'d'8'9'q;3'~>q$3-i+M.L.$.s %.m#b y>I@+*5.[ !&n [$/ e'f'};;,#.%.~%7;J&J&$,o#[ 3 '&Q>5.B%[ o#4.g'Q>8@2$2$8@0@9@6@u B#B#u 6@9@0@8@2$2$8@Q>g'4.o#[ B%5.Q>'&3 [ o#$,J&J&7;~%%.#.;,};f'e'/ [$n !&[ 5.+*I@y>b m#%.s $.L.M.i+3-q$~>3'q;9'8'd'6'A.C@=@:.$.@&g;n#n#v$_-L%j+L.i+7'B.c'b'd$-#'#U+H*!@",
+"Y+p#u@|#6+T [@~ S+6'i+L.j+L%e-a N#N#7>.=( :.A |@S+7'F.8'9'q;3'~>q$5$L.i+L._ r %.o#[ i>a c= +[ s#_ L$j+0'a'h&F*g,2 P><#J&J&$,o#[ ]&'&[email protected]@l#N#L%c j=>.7@0@|.>.u 6@9@s%s%9@6@u >.|.0@7@>.j=c L%N#l#8@@.c='&]&[ o#$,J&J&<#P>2 g,F*h&a'0'j+L$_ s#[ +c=a i>[ o#%.r _ L.i+L.5$q$~>3'q;9'8'F.7'S+|@A :.( .=7>N#N#a e-L%j+L.i+6'S+~ [@T 6+|#u@p#Y+",
+"<'p#V@['x.&&[@1@}'|'M.i+/ B%;.: o#o#X*<=( :.A |@Z>[email protected]'2'_-3'C%A*r$1.] L.6@3.%.N#l#A-!#7.F$[ s#$.]%$.4')>7.Q@2.:#5'J&J&<#$,N#l#H@3 ,%1.2$&.G@7@<.,%>.0@>.B%L%2$n 6@R-R-6@n 2$L%B%>.0@>.,%<.7@G@&.2$1.,%3 H@l#N#$,<#J&J&5':#2.Q@7.)>4'$.]%$.s#[ F$7.!#A-l#N#%.3.6@L.] 1.r$A*C%3'_-2'1'F.f@Z>|@A :.( <=X*o#o#: ;.B%/ i+M.|'}'1@[@&&x.['V@p#<'",
+"p#U.]'^'@>/'@@('F.f+i+i+/ B%;.: )%)%f=.=2.:.=@Z>S+Y>Y+J#D@_-_'<=~+A&/ 1.] u I@r &@m#A-!#7.,%[ s#( L$_#,,++^%5._ R@:'@,J&7;($N#m#&.3 ,&n 2$R#&.9@|.,&0@7@8@B%L%u ( ( A#A#( ( u L%B%8@7@0@,&|.9@&.R#2$n ,&3 &.m#N#($7;J&@,:'R@_ 5.^%++,,_#L$( s#[ ,%7.!#A-m#&@r I@u ] 1./ A&~+<=_'_-D@J#Y+Y>S+Z>=@:.2..=f=)%)%: ;.B%/ i+i+f+F.('@@/'@>^']'U.p#",
+"5#U.}*v+!'m%L$+,Q@u L.L.j+B%;.: )%)%X*@&_#x+=@A.@#Y>E@>'~'e-''q*B#~+/ j+1.2$G@2 < m#P%a w F$[ !&_ Q%_-i,j+o h a (${'5;J&a,O%n#o#!#]&'&I@8@R*|.9@]&k%2$u 7@|.>.6@$.$.4$4$$.$.6@>.|.7@u 2$k%]&9@|.R*8@I@'&]&!#o#n#O%a,J&5;{'($a h o j+i,_-Q%_ !&[ F$w a P%m#< 2 G@2$1.j+/ ~+B#q*''e-~'>'E@Y>@#A.=@x+_#@&X*)%)%: ;.B%j+L.L.u Q@+,L$m%!'v+}*U.5#",
+"P@4#%=+,P,;'Q%c=g o*] 1.p |.e-a o#)%X**;_#:.A @#9+f@g+>','e-'':*B#B#1.p / 2$G@s ~%m#-*v$j= +l#s#_ L$:#_-6@:$2$a l m>)'J&s#~$n#N#a H@M%o#'&[.|.: N%G$9@6@u 8@0@6@( _ a$a$_ ( 6@0@8@u 6@9@G$N%: |.[.'&o#M%H@a N#n#~$s#J&)'m>l a 2$:$6@_-:#L$_ s#l# +j=v$-*m#~%s G@2$/ p 1.B#B#:*''e-,'>'g+f@9+@#A :._#*;X*)%o#a e-|.p 1.] o*g c=Q%;'P,+,%=4#P@",
+"-,E;D%+'@'#'$'%'S%4 / / S#>._-v$N#o#X**;_#Q@P#A.9+f@&'Y,*':#='w$J-5 ] N.p 2$G@e-~%[ i>v$j=5.m#<#2.P,&@r 9@i+_ o#/=L&-'J&!&J$n#n#v$H@/=l '&<.1.v$M%^$u 6@9@0@0@9@n 9@p%p%9@n 9@0@0@9@6@u ^$M%v$1.<.'&l /=H@v$n#n#J$!&J&-'L&/=o#_ i+9@r &@P,2.<#m#5.j=v$i>[ ~%e-G@2$p N.] 5 J-w$=':#*'Y,&'f@9+A.P#Q@_#*;X*o#N#v$_->.S#/ / 4 S%%'$'#'@'+'D%E;-,",
+"$@T,F+U,V,v&W,q&}>O>j+j+K+8@q;v$N#N#X**;@+5.r+S+9+Y>X,Y,Z,:#`,w$J-a%L.N.N.u I@e-~%b l>: c=5.o#@,_# 'l#I@2$u @+n#/=v,.'J&!&J$n#&@v$&.i>M$3 M.K+I@M%l>2$6@9@0@0@u u 0@p%p%0@u u 0@0@9@6@2$l>M%I@K+M.3 M$i>&.v$&@n#J$!&J&.'v,/=n#@+u 2$I@l# '_#@,o#5.c=: l>b ~%e-I@u N.N.L.a%J-w$`,:#Z,Y,X,Y>9+S+r+5.@+*;X*N#N#v$q;8@K+j+j+O>}>q&W,v&V,U,F+T,$@",
+"B.M,'#y+s,H,T+N,9+O,n 9@6@2 q;E=&@M$3.s q;L%9@^ ,&Q %.r %.G@G@%.r 3./ K+g,N.K+#.N.i+L.f 0 P,Q,R,Q K+< 2 u +:.6@a :#;.3.I@r ;.r I@I@G@I@v$!#!#a !#'&{+V*@%E,S,V-#$'@] ] '@#$V-S,E,@%V*{+'&!#a !#!#v$I@G@I@I@r ;.r I@3.;.:#a 6@:. +u 2 < K+Q R,Q,P,0 f L.i+N.#.K+N.g,K+/ 3.r %.G@G@%.r %.Q ,&^ 9@L%q;s 3.M$&@E=q;2 6@9@n O,9+N,T+H,s,y+'#M,B.",
+"A+F,G,u@I#H,T+9+C@I,_ 6@[email protected]@:#r#$,)%m ;.|.9@#.:$J,3.%.3.v$G@%.r ~#L.S##.K+S#K+p i+9@/ |*r*K,};L,2.R@e-_ Q@++n a ~%;.3.I@%.%.I@v$I@!#: !#H@!#G@v$H@{+j$7-E,.#^-B#m&j+j+m&B#^-.#E,7-j${+H@v$G@!#H@!#: !#I@v$I@%.%.I@3.;.~%a n ++Q@_ [email protected],};K,r*|*/ 9@i+p K+S#K+#.S#L.~#r %.G@v$3.%.3.J,:$#.9@|.;.m )%$,r#:#[email protected]@6@_ I,C@9+T+H,I#u@G,F,A+",
+"R+A,]@}@,#B,z+A.C,Z#_ _ I@I@&@l%},P>[ o#m ]&6@j>L.^ ~#3.I@a G@%.%.G@h p ^ #.N.p 1.i+N#G@o*#;H%6@;.< < q;@+#;++6@!#&@s %.3.3.G@!#: ~#'&]&]&3 !#I@I@: ^+R-D,E,X%6-#$R&] ] R&#$6-X%E,D,R-^+: I@I@!#3 ]&]&'&~#: !#[email protected].%.s &@!#6@++#;@+q;< < ;.6@H%#;o*G@N#i+1.p N.#.^ p h G@%.%.G@a I@3.~#^ L.j>6@]&m o#[ P>},l%&@I@I@_ _ Z#C,A.z+B,,#}@]@A,R+",
+"8+y,3%I#I#H>H>@#C@@#G@%.r n#O%S@5;5;^.l n#: I@j>$.@+~#~#G@a G@r 3.a g j+^ ^ N.1.L.] a,J$R#n $.!#r#J&)%e-_#:.x+9@!#n#;.2 %.3.a H@: 3.k%3 3 3 &.G@I@: 0$>-8*z,9$Z@<&[email protected]@<&Z@9$z,8*>-0$: I@G@&.3 3 3 k%3.: H@a 3.%.2 ;.n#!#9@x+:._#e-)%J&r#!#$.n R#J$a,] L.1.N.^ ^ j+g a 3.r G@a G@~#~#@+$.j>I@: n#l ^.5;5;S@O%n#r %.G@@#C@@#H>H>I#I#3%y,8+",
+"&+q,r,s,I#B.%+A.A.S+v$~%E=S@$,<#7;t,M$~$~$n#n#2 u,2.~#~#v$a ~#2 3.!#h / #.^ N.] L.1.v,J$r=I@3.)&$,w,b _-x,x+x+n v$~%e-s r %.v$&.: %.]&&.H@3 H@v$a H@m&A#);>@Q$t-a$/+1.1./+a$t-Q$>@);A#m&H@a v$H@3 H@&.]&%.: &.v$%.r s e-~%v$n x+x+x,_-b w,$,)&3.I@r=J$v,1.L.] N.^ #./ h !#3.2 ~#a v$~#~#2.u,2 n#n#~$~$M$t,7;<#$,S@E=~%v$S+A.A.%+B.I#s,r,q,&+",
+"B.n,3%h#y+B+%+C@S+0.m#~%},r#<#J&~&y=a,a,l S@N#3.o,I@3.~#v$v$3.;.3.!#1./ K+^ S#] ] j+s#M$A=$.2.'&($@,N%_,m,@*x+_ 3.p,;.r %.%.I@: a 3.: a : H@H@: !#'&r@R-J+!-Q$y*B#_+M.M._+B#y*Q$!-J+R-r@'&!#: H@H@: a : 3.a : I@%.%.r ;.p,3._ x+@*m,_,N%@,($'&2.$.A=M$s#j+] ] S#^ K+/ 1.!#3.;.3.v$v$~#3.I@o,3.N#S@l a,a,y=~&J&<#r#},~%m#0.S+C@%+B+y+h#3%n,B.",
+"$ k,'#h@1@8+0,|@A.W#l#$,r#s#7;e,y>_=@,<#/=r#M$)%l,!#%.~#G@G@r e-%.!#S#j+p g,K+/ 1.p l [ o*g,g,|.n#l%)&:,m,x+(#u G@:#2 ~#[email protected]@a G@v$G@a &.&.a !#'&{+E y*a%Q$;->-q@s*s*q@>-;-Q$a%y*E {+'&!#a &.&.a G@v$G@a [email protected]@~#2 :#G@u (#x+m,:,)&l%n#|.g,g,o*[ l p 1./ K+g,p j+S#!#%.e-r G@G@~#%.!#l,)%M$r#/=<#@,_=y>e,7;s#r#$,l#W#A.|@0,8+1@h@'#k,$ ",
+"8,9,-+h#1@$+0,|@9+>#{$O%O%E*a,b,c,d,e,J&^$S@^.b f,)&%.3.G@G@2 _-r !#^ p / K+g,p / N.l#H@<.h,h,:$I@:#Z-_,i,(#^%|.&.n#%.v$: I@%.I@: : G@I@v$&.!#a : 3 ~+E 7#j,6 M-U*8>s*s*8>U*M-6 j,7#E ~+3 : a !#&.v$I@G@: : I@%.I@: v$%.n#&.|.^%(#i,_,Z-:#I@:$h,h,<.H@l#N./ p g,K+/ p ^ !#r _-2 G@G@3.%.)&f,b ^.S@^$J&e,d,c,b,a,E*O%O%{$>#9+|@0,$+1@h#-+9,8,",
+"o+t>^,/,T+o.]%;,. x&3*A*I&k*k*I&A*3*p@p@(+(+_+7*(+{+S@(,b n#_,:,,,8@( 0@2.<,[,6@n _ M$g Z%Q@},|,},p 1,2,3,T@H#,+e&4,7-5,@%t-p&7-J-6-@%8*y*~@*,6,7,]*L;1&X*i*&.j;k=5@r@r@5@k=j;&.i*X*1&L;]*7,6,*,~@y*8*@%6-J-7-p&t-@%5,7-4,e&,+H#T@3,2,1,p },|,},Q@Z%g M$_ n 6@[,<,2.0@( 8@,,:,_,n#b (,S@{+(+7*_+(+(+p@p@3*A*I&k*k*I&A*3*x&. ;,]%o.T+/,^,t>o+",
+"c@D+$$Y>T+o.Q*;,w-s=J;I&I&r-2&A&A*I&H+H+H+~+_+,@p@[+O%>,n#R@e-r q 0@n 7@@+,,j>_ ( 9@&@(#A>+*l%',R@:.),!,~,{,0.w +%|>/+~+/+'@{+p@{+a-B#a$7#a%*,1%d&V=n-A%~>0&G@j#],I.{+{+I.],j#G@0&~>A%n-V=d&1%*,a%7#a$B#a-{+p@{+'@/+~+/+|>+%w 0.{,~,!,),:.R@',l%+*A>(#&@9@( _ j>,,@+7@n 0@q r e-R@n#>,O%[+p@,@_+~+H+H+H+I&A*A&2&r-I&I&J;s=w-;,Q*o.T+Y>$$D+c@",
+"G*q#t$Y>Z>N>j=N.w-i*`>r-3*3*A&.*A*2&^+^+{+[+p@7*_+p@l ,E=.,r !#$.7@2$9@_#q n ( 2.7@s ;*<$+,3.@,%.#,U%9&$,u#T+T>i*%, %q$p$n$.%[=p$&,s%#$U*5 *,.#!+d&+&8&=,G&n#j#j;-,4$4$-,j;j#n#G&=,8&+&d&!+.#*,5 U*#$s%&,p$[=.%n$p$q$ %%,i*T>T+u#$,9&U%#,%.@,3.+,<$;*s 7@2.( n q _#9@2$7@$.!#r .,E= ,l p@_+7*p@[+{+^+^+2&A*.*A&3*3*r-`>i*w-N.j=N>Z>Y>t$q#G*",
+"G*N>j@C@C@[email protected]@O>i*J;3*A*3*A&.*A&r-{+]+^+[+(+(+(+_+}.P>R@`=r H@_ 7@8@n q [email protected]>>.@+Q>R>{&v$O%( r*S>+%M$V#H>T>y#l*I=U>%>V>+=I>%>J>]+~+U*5 Z@.#6 Q$K-+&W>e=M$F@X>P;J+J+P;X>F@M$e=W>+&K-Q$6 .#Z@5 U*~+]+J>%>I>+=V>%>U>I=l*y#T>H>V#M$+%S>r*( O%v${&R>Q>@+>.j>2.7@$.q n 8@7@_ H@r `=R@P>}._+(+(+(+[+^+]+{+r-A&.*A&3*A*3*J;i*O>[email protected]@C@C@j@N>G*",
+"[email protected]@*+W@$@]&l#i*B*.*}%s$3*I&A&A&2&~+{+/+(+~+/+H+_+}.S@o#:#s !#( 2$8@_ q n 8@2._#>.v$j=i%u+H@E*G@F*F>q*E*G>H>[$b*n$I>+=L;t=z;L;z;J>'@H+r@8#x-7-6 9$]+9-K>L>w>M>P@E+6$6$E+P@M>w>L>K>9-]+9$6 7-x-8#r@H+'@J>z;L;z;t=L;+=I>n$b*[$H>G>E*q*F>F*G@E*H@u+i%j=v$>._#2.8@n q _ 8@2$( !#s :#o#S@}._+H+/+~+(+/+{+~+2&A&A&I&3*s$}%.*B*i*l#]&$@W@*[email protected]@",
+"3@t>u>,#t$v>G${$e&a* &;= &.*A&A*A*2&_+H+H+p@~+]+{+_+{$~$N%< 2 : 2.9@2$_ j>n 8@( _#0@N% +M&^%j&w>l x+x>@&y>z>;#A>-@K-B>I=S;L;t=z;K;L;@-0*r@[+j$9#p&J+E 9-C>D>3;E>e+#>s@s@#>e+E>3;D>C>9-E J+p&9#j$[+r@0*@-L;K;z;t=L;S;I=B>K--@A>;#z>y>@&x>x+l w>j&^%M& +N%0@_#( 8@n j>_ 2$9@2.: 2 < N%~${$_+{+]+~+p@H+H+_+2&A*A*A&.* &;= &a*e&{$G$v>t$,#u>t>3@",
+"[email protected]%~ }#h>/=i>{=B*T$;=;=T$s$}%.*I&,@[+[+7*(+]+{+W%M$J$)&&@%.H@$._ n n @+( 7@n j>9@K&8@7.>.y=k>l>I@`@D;m>n>T+;%*= &.%r$5$q.o$m$ %5$9-0*;=[+R&<&U&J+7#'@N=o>p>q>E.r>s>s>r>E.q>p>o>N='@7#J+U&<&R&[+;=0*9-5$ %m$o$q.5$r$.% &*=;%T+n>m>D;`@I@l>k>y=>.7.8@K&9@j>n 7@( @+n n _ $.H@%.&@)&J$M$W%{+]+(+7*[+[+,@I&.*}%s$T$;=;=T$B*{=i>/=h>}#~ T%T.2@",
+"W+4>X$y+5>6>-*~&7>~>.*K-9-@-;=;=s$I&,@[+[+,@p@]+/+8>M$O%b m I@R#_ $.( 6@$.2.2$6@@+_ 9>b i+H@0>a>3;o#Z@D;b>C#g#;%c>{+9-}%3*A&T$@-}%2& *.*;=[+R&#$A#s%y*^+d>e>f>O;X+'>g>g>'>X+O;f>e>d>^+y*s%A##$R&[+;=.* *2&}%@-T$A&3*}%9-{+c>;%g#C#b>D;Z@o#3;a>0>H@i+b 9>_ @+6@2$2.$.6@( $._ R#I@m b O%M$8>/+]+p@,@[+[+,@I&s$;=;=@-9-K-.*~>7>~&-*6>5>y+X$4>W+",
+"a@/>(>P._>h&O-0&5$e*}%s$K-'=,- &s$T$B#{+:>!=<#<>5@H*V.3@[>:$+ }>6-7#q.r$q.0*a-(+j$B#|>1>2>j$J=|> *5 a !#3>r A=a '&!#_+;=3*q.p$o&T*$-~+/+0$r@0${+[+~+A#A#A#^+}%}%n$A%0$0$A%n$}%}%^+A#A#A#~+[+{+0$r@0$/+~+$-T*o&p$q.3*;=_+!#'&a A=r 3>!#a 5 *|>J=j$2>1>|>B#j$(+a-0*q.r$q.7#6-}>+ :$[>[email protected]*5@<><#!=:>{+B#T$s$ &,-'=K-s$}%e*5$0&O-h&_>P.(>/>a@",
+"->;>>>,>'>)>!><=T&J*A*3*A*;=,- &A&2&#$[+~>d*s#{>:=4#X+N@ #8=-&@ V-Z@r$5$r$.*]>p@j$8#S;r@6$A#1&P*m$X%: &.^>2 k%a 3 &./+,-.*m$8&o&T*a=.*s$ &K- &}%0*.*y%>-^+^+}%}%o$n$0$0$n$o$}%}%^+^+>-y%.*0*}% &K- &s$.*a=T*o&8&m$.*,-/+&.3 a k%2 ^>&.: X%m$P*1&A#6$r@S;8#j$p@]>.*r$5$r$Z@V-@ -&8= #N@X+4#:={>s#d*~>[+#$2&A& &,-;=A*3*A*J*T&<=!>)>'>,>>>;>->",
+" >.>+>@>#>H%z#1-p$:%A&r-2& &,- &I&'*#$p@g;Z*T#$>k=U.O@3@d+8=H;b*^-7#5$5$5$A*o=7*j$4$%>r@&>p&J**>}%a%H@H@=>;.H@a ]&]&0$@-.* *g=J*e*J*s$s$}%T$T$T$}%s$s%/+{+}%}%o$p$:%0$0$:%p$o$}%}%{+/+s%s$}%T$T$T$}%s$s$J*e*J*g= *.*@-0$]&]&a H@;.=>H@H@a%}%*>J*p&&>r@%>4$j$7*o=A*5$5$5$7#^-b*H;8=d+3@[email protected]=$>T#Z*g;p@#$'*I& &,- &2&r-A&:%p$1-z#H%#>@>+>.> >",
+"T;U;V;Y.=@/ .-W;K-8&.*3*A*K-9-T$A&I&4$p@M;N;^$X;u;p#G*3@o+g + Y;Z@U&5$T&5$3*7%W%j$s%n-1=Z;y*p$u= &`;]&H@e-_-v$: &.k%/+s$r-+& *3-:%:%o$p$ %p$o$m$m$n$H+H+0*s$n$n$:%l*0$0$l*:%n$n$s$0*H+H+n$m$m$o$p$ %p$o$:%:%3- *+&r-s$/+k%&.: v$_-e-H@]&`; &u=p$y*Z;1=n-s%j$W%7%3*5$T&5$U&Z@Y;+ g o+3@G*p#u;X;^$N;M;p@4$I&A&T$9-K-A*3*.*8&K-W;.-/ [email protected];U;T;",
+"[email protected] D=B*A*m$s$0*T$K-}%A*.*K-R-~+M;N;H$O;u;E;P;G*[email protected]&,.U&J+T&T&5$I&m&q@j$A#T*^->&o@m$$-0$Q;]&&.3.q;~#&.!#S-p@A&R;m$A%$-1&e*o$ %.%q$o$A%A%m$s$.*A* %n$z=q%S;0$0$S;q%z=n$ %A*.*s$m$A%A%o$q$.% %o$e*1&$-A%m$R;A&p@S-!#&.~#q;3.&.]&Q;0$$-m$o@>&^-T*A#j$q@m&I&5$T&T&J+U&,.4&L.c@G*P;E;u;O;H$N;M;~+R-K-.*A*}%K-T$0*s$m$A*B*D=n V.a@E++.X.",
+"Z.X.V.b@^#G@0%C;2&K-0*s$T$T$A&r-.*9-U*[+D;Z*h;i;f;E;F;G*G;L.4&H;p&`@5$5$r$I&r@q@I;U*8&6-5=L*;=c-{+==&.!#a q;%.]&: F=_+.*J;p$o$a=x*x*:%J*G-J*z=s;n-z=T$0*q.q$o&K;L;q%0$0$q%L;K;o&q$q.0*T$z=n-s;z=J*G-J*:%x*x*a=o$p$J;.*_+F=: ]&%.q;a !#&.=={+c-;=L*5=6-8&U*I;q@r@I&r$5$5$`@p&H;4&L.G;G*F;E;f;i;h;Z*D;[+U*9-.*r-A&T$T$s$0*K-2&C;0%G@^#[email protected].",
+"T.X.p#x#f;G@+%0&3*@-0*0*}%T$0*3*.*K-E H+g;t;h;i;u;H* =X+ =i+,.v;`@);r$r$q.3*r@q@n;1=m$o@#=w;x;l=4$>&a v$H@q;r k%a y;_+K-3*q.q.G-,;x*l*G-a=J*e*T*n-1&8&p$q.G-o&z;A;B;0$0$B;A;z;o&G-q.p$8&1&n-T*e*J*a=G-l*x*,;G-q.q.3*K-_+y;a k%r q;H@v$a >&4$l=x;w;#=o@m$1=n;q@r@3*q.r$r$);`@v;,.i+ =X+ =H*u;i;h;t;g;H+E K-.*3*0*T$}%0*0*@-3*0&+%G@f;x#p#X.T.",
+"+.e;I.f;%$m 0%0&3*;=T$0*s$K-;=}%0*}%A#[+g;D*h;i;j;4#V.k;2@L.,.l;);8*r$q.q.3*r@q@m;n;m$>@o;p;a-T&s%>&G@G@3 q;r A=a r;_+9-A&[=l=a=,;n-J*G-a=l*n-x*s;1& *o$a=a=q%t=%-l&0$0$l&%-t=q%a=a=o$ *1&s;x*n-l*a=G-J*n-,;a=l=[=A&9-_+r;a A=r q;3 G@G@>&s%T&a-p;o;>@m$n;m;q@r@3*q.q.r$8*);l;,.L.2@k;V.4#j;i;h;D*g;[+A#}%0*}%;=K-s$0*T$;=3*0&0%m %$f;I.e;+.",
+"j <;Z@@%4$E ~+r-A*0*9-s$K-9-}%T$ &I&/+~+[;A#J+^-6 !-};x F+m@D >@%*|;G-1;7*U&X%9#j$2;3;/=4;!$|*,&5;6;k#l#a %._-G@d-b 7;^;8;9;}%}%0;0;G@!#9=;;T$a;b;c;:;o&:%:%a=l*e*l*d;d;l*e*l*a=:%:%o&:;c;b;a;T$;;9=!#G@0;0;}%}%9;8;^;7;b d-G@_-%.a l#k#6;5;,&|*!$4;/=3;2;j$9#X%U&7*1;G-|;%*>@D m@F+x };!-6 ^-J+A#[;~+/+I& &T$}%9-K-s$9-0*A*r-~+E 4$@%Z@<;j ",
+"j `%n*);8#E ~+2&0*}%@-.*}% &A*0*}%2&(+~+W-U*`@6-Q$o@:.v !;-@S&~;%*X-P$%;,@p&X%@%x-a-{;{$j !$|*k S@];)&l#!#I@;.G@Z-[ !&^;/;(;}%K-f._;a v$D=;;}%:;5*`$,;o&:%l*';J*n-o&7&7&o&n-J*';l*:%o&,;`$5*:;}%;;D=v$a _;f.K-}%(;/;^;!&[ Z-G@;.I@!#l#)&];S@k |*!$j {${;a-x-@%X%p&,@%;P$X-%*~;S&-@!;v :.o@Q$6-`@U*W-~+(+2&}%0*A* &}%.*@-}%0*2&~+E 8#);n*`%j ",
+"3=+;M-J-8#R-~+I&}% &9-0*s$}%3*.*}%3*7*(+p%x-5 ;-6 @;#;e G+N&o@Q$X-$;J*%;,@p&~@J-E m&K${$4._._.k O%~&]&!#N%l#< o#3 a J$&;*;=;H+0$^=-;&.3.+%;;s$e*F->;,;o&l*J*';l*n-o&,=,=o&n-l*';J*l*o&,;>;F-e*s$;;+%3.&.-;^=0$H+=;*;&;J$a 3 o#< l#N%!#]&~&O%k _._.4.{$K$m&E J-~@p&,@%;J*$;X-Q$o@N&G+e #;@;6 ;-5 x-p%(+7*3*}%.*3*}%s$0*9- &}%I&~+R-8#J-M-+;3=",
+">%U-V-J-B#A#~+A&T$K-L-}%}%}%A&0*K-.*p@(+W-U*`@n*6$!-] <.N&b*o@t-X-M=l*Y-7*p&a%`@A#{+/$l B%:$i o*~$/=0@!#Z-j&~$)%H@u J$=*@&`-7*]+J J '&%.q* ;}%:%S*.;x*l*:%o&G-:%n-l*B=B=l*n-:%G-o&:%l*x*.;S*:%}% ;q*%.'&J J ]+7*`-@&=*J$u H@)%~$j&Z-!#0@/=~$o*i :$B%l /${+A#`@a%p&7*Y-l*M=X-t-o@b*N&<.] !-6$n*`@U*W-(+p@.*K-0*A&}%}%}%L-K-T$A&~+A#B#J-V-U->%",
+"Y%I-u-J-#$>-[+A* &K-L-}%s$s$I&.*K-.*/+(+0-A#J+M-X%N-L.M.O-@ ^-x-i.i.P$P-p@U&6$J+A#~+h*o#'&>.>.'&m {$M.u h***E*l 8@i+m#)&+%Q-'-R-L z&S-~#+%1-T$l*S*l-e*P$o&e*:%1&e*G-T-T-G-e*1&:%e*o&P$e*l-S*l*T$1-+%~#S-z&L R-'-Q-+%)&m#i+8@l E***h*u M.{$m '&>.>.'&o#h*~+A#J+6$U&p@P-P$i.i.x-^-@ O-M.L.N-X%M-J+A#0-(+/+.*K-.*I&s$s$}%L-K- &A*[+>-#$J-u-I-Y%",
+"p-q-^-@%a$>-H+.* &T$,-0*.*.*r-A&}%3*^+p@s->-t-u-~@v-0@2$w-s=V*x-y-y&a=[=/+7#9$p&A#~+!%o#'&3 3 H@R@)%5.9@I$z-A-l >.,%N%[ @$B-C-j$D-E-A=v$D=k- &o&F-l-z=P$o&n-:%1&e*G-H-H-G-e*1&:%n-o&P$z=l-F-o& &k-D=v$A=E-D-j$C-B-@$[ N%,%>.l A-z-I$9@5.)%R@H@3 3 '&o#!%~+A#p&9$7#/+[=a=y&y-x-V*s=w-2$0@v-~@u-t->-s-p@^+3*}%A&r-.*.*0*,-T$ &.*H+>-a$@%^-q-p-",
+"4-5-6-7-8->-/+0*T$s$9-.*.*.*2&A&s$I&[+p@0-E y*)-9$6$8@8@s=z#a-0$b-{-c-T&0$n*6 p&E H+ -: M#M#d-b e-I@c=9@h*:-<-l L%!$]&G@4 f-g-6-h-i-'&: j-k-}%1&l-m-n-J*:%1&J*o&n-l*o-o-l*n-o&J*1&:%J*n-m-l-1&}%k-j-: '&i-h-6-g-f-4 G@]&!$L%l <-:-h*9@c=I@e-b d-M#M#: -H+E p&6 n*0$T&c-{-b-0$a-z#s=8@8@6$9$)-y*E 0-p@[+I&s$A&2&.*.*.*9-s$T$0*/+>-8-7-6-5-4-",
+"=---;-8*p%>-/+0*}%.*,-s$}%}%A&.*T$3*_+_+'-1=7#)-!-)*>.R#4 +-V*/+~-{-]-5$m&^-Q$U&U*/+/-H@!%(-M#b _-~#c=/ ]$:-<-E*,&E$&.%.4 [-}-;-l.|-]&!#9=1-s$z=w*2-x*l*J*J*3-:%T*z=]=]=z=T*:%3-J*J*l*x*2-w*z=s$1-9=!#]&|-l.;-}-[-4 %.&.E$,&E*<-:-]$/ c=~#_-b M#(-!%H@/-/+U*U&Q$^-m&5$]-{-~-/+V*+-4 R#>.)*!-)-7#1='-_+_+3*T$.*A&}%}%s$,-.*}%0*/+>-p%8*;---=-",
+"}*u+L=M=0*:%N=O=/$'%H$j&~=C%0*n$9%P=<#_#r*o Q=_$H@!$3@R=S=A=T=C%I&[=U=^+N*V=R&l*[=p&W=X=v ,+%=f _#%.8@q&n=z*Y=C=D=Z=l ~$'%`=:# -&.9@k B%.-+-7%@-h=#- &0*.%$-u=%-&-*-e*e**-&-%-u=$-.%0* &#-h=@-7%+-.-B%k 9@&. -:#`='%~$l Z=D=C=Y=z*n=q&8@%._#f %=,+v X=W=p&[=l*R&V=N*^+U=[=I&C%T=A=S=R=3@!$H@_$Q=o r*_#<#P=9%n$0*C%~=j&H$'%/$O=N=:%0*M=L=u+}*",
+"!$,+%&h..*:%v=w=H${$J$l <=@&A*n$4*x=!&6@B _.=*y=]&%=N@P@x#'&f&<=I&l=_*/+b$==o=z=A&U&A=j o %=7 ,%_ G@8@q&>&z*B=C=D=8.M$M$h*E=s F=8@0@|.0@G=Y*r@ &H=w* &s$p$P$I=J=K=_*e*e*_*K=J=I=P$p$s$ &w*H= &r@Y*G=0@|.0@8@F=s E=h*M$M$8.D=C=B=z*>&q&8@G@_ ,%7 %=o j A=U&A&z=o===b$/+_*l=I&<=f&'&x#P@N@%=]&y==*_.B 6@!&x=4*n$A*@&<=l J${$H$w=v=:%.*h.%&,+!$",
+" +c=j.d=A*q$e=f={$v$l#m#<=.=}%g=h=i=/=|.Y%_.I$`*3 j=G*5#k=!#I*.=2&l=7=8#m=n=o=T*s$7#'&k F$x &=c 7@!#8@r&>&J p=q=f&0 {$^.r=&@3.k B%o*8@u s=@$r@ &4*0= &}%A%n$l*t=t=u=+&+&u=t=t=l*n$A%}% &0=4* &r@@$s=u 8@o*B%k 3.&@r=^.{$0 f&q=p=J >&r&8@!#7@c &=x F$k '&7#s$T*o=n=m=8#7=l=2&.=I*!#k=5#G*j=3 `*I$_.Y%|./=i=h=g=}%.=<=m#l#v${$f=e=q$A*d=j.c= +",
+"1.Q@c&I A&q.!=~=]&8@L%H@C%{=A%'=]=^=/=k (=o j&_=3 ;* =^#:=a I*<=2&[=+=y%}=|=1=A%{+>@3 B%5.x 2=3=8@!#8@4=5=9*6=7=I*u+)%)&!%H@7@o*8=8=|.7@y#9=R&;=>=0=A%o$A%m$ %8&T*a=b=b=a=T*8& %m$A%o$A%0=>=;=R&9=y#7@|.8=8=o*7@H@!%)&)%u+I*7=6=9*5=4=8@!#8@3=2=x 5.B%3 >@{+A%1=|=}=y%+=[=2&<=I*a :=^# =;*3 _=j&o (=k /=^=]='=A%{=C%H@L%8@]&~=!=q.A&I c&Q@1.",
+"p / W*p*A&q.X*Y*k c e 0@q*Z*p$ &g.%&T#o*8.^%G$`*]&F* =4#`+a I*.=I&r$+=7#@=#=E q$[+$=3 L%5.%=&=^&7@v$8@*===7&-=P*+%B n#]&R#4.k ,&s*<.|.0@z#v*R&;=>=,=8&p$o$o$A& &'=T$)=)=T$'= &A&o$o$p$8&,=>=;=R&v*z#0@|.<.s*,&k 4.R#]&n#B +%P*-=7&==*=8@v$7@^&&=%=5.L%3 $=[+q$E #=@=7#+=r$I&.=I*a `+4# =F*]&`*G$^%8.o*T#%&g. &p$Z*q*0@e c k Y*X*q.A&p*W*/ p ",
+"n 6@z*#&.*A*B*4 e >%C*g q*D*o&}%j.%*E*|.0 ^%j&_$: F*G*H*`+: I*@&2&.%J*n*K*m*7#3*#$L*3 B% +,+}*v 9@v$8@M*N*g.O*P*0%Q*~#H@7@R*t*:$}$^%8@0@z#v*'@s$N S*T* % %0*2&/+7%U*V*V*U*7%/+2&0* % %T*S*N s$'@v*z#0@8@^%}$:$t*R*7@H@~#Q*0%P*O*g.N*M*8@v$9@v }*,+ +B%3 L*#$3*7#m*K*n*J*.%2&@&I*: `+H*G*F*: _$j&^%0 |.E*%*j.}%o&D*q*g C*>%e 4 B*A*.*#&z*6@n ",
+"a G@9*#&0*.*a*b*x v+c*@.:*d*e* &%&f*g*>.v+v h*P%I@;*O@)@`+!#i*j*k*q$l*o@/&m*n*.*B#d.3 o*F$7.7 ^%9@!#8@F+^*p*(*_*q*r*a 0@$.s*t*5.c o 0@8@u*v*{+A&N w*x*p$p$0*,@#$E y*U&U&y*E #$,@0*p$p$x*w*N A&{+v*u*8@0@o c 5.t*s*$.0@a r*q*_*(*p*^*F+8@!#9@^%7 7.F$o*3 d.B#.*n*m*/&o@l*q$k*j*i*!#`+)@O@;*I@P%h*v v+>.g*f*%& &e*d*:*@.c*v+x b*a*.*0*#&9*G@a ",
+"!#v$7&H s$s$f&1$+*]%b.@*#*$*o&}%%*&***>.v+c =*-*%.;*p+.$>*!#0%,*'*.%p$)*!*~*{*]+8#]*]&k ^%,+!$,%u 3 8@F+^*/*(*_*:*<*7@8@q i [*(#}*|*8@L%1*2*{+3*4*5*6*:%o$}%7*a$p&J+8*8*J+p&a$7*}%o$:%6*5*4*3*{+2*1*L%8@|*}*(#[*i q 8@7@<*:*_*(*/*^*F+8@3 u ,%!$,+^%k ]&]*8#]+{*~*!*)*p$.%'*,*0%!#>*.$p+;*%.-*=*c v+>.**&*%*}%o&$*#*@*b.]%+*1$f&s$s$H 7&v$!#",
+"6#w$A&}%B&C&D&d&B X#^#E&F&G&H&I&/+s%,+,%,&B%&.n#J$M%8.3&o L.~#n#J&K&L&] {%M&4.G$G@F$k&N&8@|@> O&P&y%Q&R&b$S&p@:%T&U&q&F+q&s&r&V&W&X&M&,%y#Y&o$}%Z&`& *m$q$5$5$.%o$A%.*.*A%o$.%5$5$q$m$ *`&Z&}%o$Y&y#,%M&X&W&V&r&s&q&F+q&U&T&:%p@S&b$R&Q&y%P&O&> |@8@N&k&F$G@G$4.M&{%] L&K&J&n#~#L.o 3&8.M%J$n#&.B%,&,%,+s%/+I&H&G&F&E&^#X#B d&D&C&B&}%A&w$6#",
+"4 9&0&s$a&b&c&d&w+-+a@e+2.m e&f&5 9$7.F$,&k ]&o#J$}.g&h& +1.v$l#r#^$i&] {%-%4.j&!#_.k&-@7@|@x.U 3$4$l&m&b$n&(+o&2&p&q&F+r&s&t&u&v&w&Z%o x&5&p$s$y&z&+&m$ %r$r$q$n$8&}%}%8&n$q$r$r$ %m$+&z&y&s$p$5&x&o Z%w&v&u&t&s&r&F+q&p&2&o&(+n&b$m&l&4$3$U x.|@7@-@k&_.!#j&4.-%{%] i&^$r#l#v$1. +h&g&}.J$o#]&k ,&F$7.9$5 f&e&m 2.e+a@-+w+d&c&b&a&s$0&9&4 ",
+"B%v$@&H+#&$&%&D%d@&&*&=&O@_#$.-&;&>&7.F$,&k '&)%J$}._.x+] n : )&r#!&~&L.{%{&k '%]&^&/&(&u |@_&:&3$<&[&E }&|&[+1&2&J+/ [email protected] 3&v+B u+x _.4&5&s$s$6&7&8&m$ %.%.%p$A%+&T$T$+&A%p$.%.% %m$8&7&6&s$s$5&4&_.x u+B v+3&7 @. +/ J+2&1&[+|&}&E [&<&3$:&_&|@u (&/&^&]&'%k {&{%L.~&!&r#)&: n ] x+_.}.J$)%'&k ,&F$7.>&;&-&$._#O@=&*&&&d@D%%&$&#&H+@&v$B%",
+"B%: < C%/+j.`@D%`.y$E%F%Z.G%H%I%J%K%e@,%:$L%H@)%l M%M.N.7@G@m#N%r#O%P%M.m%Q%L%M%&.c R%S%9@|@T%o%3$p%q%E U%V%s%n$W%X%n i+,+Y%b.Z%w+7. +i Y@`%{+ &.&H A%m$p$ % %o$A%+&s$s$+&A%o$ % %p$m$A%H .& &{+`%Y@i +7.w+Z%b.Y%,+i+n X%W%n$s%V%U%E q%p%3$o%T%|@9@S%R%c &.M%L%Q%m%M.P%O%r#N%m#G@[email protected]%l )%H@L%:$,%e@K%J%I%H%G%Z.F%E%y$`.D%`@j./+C%< : B%",
+"$@K#< 0%4$#$a%w V+b%c%d%e%f%g%h%[$i%j%^%i+2$v$N#{$'%v$I@k%m#N#l#l%~$_$g m%]%8@M$v$v n%1$6@j@4%o%3$p%q%Z@<%r%s%o$t%.#1 u%r+v%w%`[email protected] P x%y%r@z%N A%m$o$p$p$n$m$A%s$s$A%m$n$p$p$o$m$A%N z%r@y%x%P h 1.c@r+`.w%v%r+u%1 .#t%o$s%r%<%Z@q%p%3$o%4%j@6@1$n%v v$M$8@]%m%g _$~$l%l#N#m#k%I@v$'%{$N#v$2$i+^%j%i%[$h%g%f%e%d%c%b%V+w a%#$4$0%< K#$@",
+"U@u$g+o#+%@%#%A $%A$%%&%*%B.%@=%-%;%>%,%1._ 3.&@M$'%o#)%!%m#&@m#~%N#K$i {%]%0@l I@^%/%g$9@j@(%_%3$a$:%7#<%[%J+}%|%1%2%u#&+3%4%~ W#5%( 7@6%G+Q$7%8%9%m$m$n$o$o$o$o$o$T$T$o$o$o$o$o$n$m$m$9%8%7%Q$G+6%7@( 5%W#~ 4%3%&+u#2%1%|%}%J+[%<%7#:%a$3$_%(%j@9@g$/%^%I@l 0@]%{%i K$N#~%m#&@m#!%)%o#'%M$&@3._ 1.,%>%;%-%=%%@B.*%&%%%A$$%A #%@%+%o#g+u$U@",
+"t$u$-.v$&$w$x$a.y$z$A$B$C$>#g@D$;+m+E$F$j+( 3.&@l G$H${$I$J$($b < &@K$:$<$L$8@M$v$_.N$g$u j@O$U 3$B#P$Q$R$S$J+T$U$V$W$u#8+-#X$X#k@Y$~#7@P h$Q$j$Z$`$m$m$n$o$p$ %q$.%T$T$.%q$ %p$o$n$m$m$`$Z$j$Q$h$P 7@~#Y$k@X#X$-#8+u#W$V$U$T$J+S$R$Q$P$B#3$U O$j@u g$N$_.v$M$8@L$<$:$K$&@< b ($J$I${$H$G$l &@3.( j+F$E$m+;+D$g@>#C$B$A$z$y$a.x$w$&$v$-.u$t$",
+"C@$$T@%$&$*$K+:+=$-$;$>$,$'$)$X+T.Q#!$5.j+( ~#&@~${$]$^$/$($~$k#m R@_$:$<$[$|.^.: }$|$1$2$|@x.~.3$4$5$6$7$8$9$0$a$b$U#c$8+d$e$L+U@f$I@8@g$h$i$j$k$l$m$m$n$o$p$q$q.r$s$s$r$q.q$p$o$n$m$m$l$k$j$i$h$g$8@I@f$U@L+e$d$8+c$U#b$a$0$9$8$7$6$5$4$3$~.x.|@2$1$|$}$: ^.|.[$<$:$_$R@m k#~$($/$^$]${$~$&@~#( j+5.!$Q#T.X+)$'$,$>$;$-$=$:+K+*$&$%$T@$$C@",
+"m+o.B#R@C#D#E#F#G#k+P+6+h#%+H#z+I#]@N@X+N@!@J#K#1 L#M#b m#l#m#N#&@n#t+q#O#{ N@F.$@b@p#p+p+P#E+T.;+Q#R#0@] / S#s S@T#U#V#W#X#Y#Z#`# $.$^#+$3 y#@$A##$~+{+]+{+{+^+/+(+^+^+(+/+^+{+{+]+{+~+#$A#@$y#3 +$^#.$ $`#Z#Y#X#W#V#U#T#S@s S#/ ] 0@R#Q#;+T.E+P#p+p+p#b@[email protected]@{ O#q#t+n#&@N#m#l#m#b M#L#1 K#J#!@N@X+N@]@I#z+H#%+h#6+P+k+G#F#E#D#C#R@B#o.m+",
+"#@M@9#;.T@0#a#b#c#d#e#> C+0+f#g#h#[email protected]@)#i#I.-.j#k#[ l#[ m#n#&@o#Z.;+]#E+r+F.^#5#p#d+e+A %@;+q#S.3 7@] f N.s r#s#t#u#*+'#b+z+v#w#Y+U.x#8@y#z#A#B#~+{+]+{+/+{+H+_+/+/+_+H+{+/+{+]+{+~+B#A#z#y#8@x#U.Y+w#v#z+b+'#*+u#t#s#r#s N.f ] 7@3 S.q#;+%@A e+d+p#5#^#F.r+E+]#;+Z.o#&@n#m#[ l#[ k#j#-.I.i#)#[email protected]@-+h#g#f#0+C+> e#d#c#b#a#0#T@;.9#M@#@",
+"d+ #.#+#@###$#%#&#*#=#-#~ ;#>#z+,#'#O@p+3@)#D@5@g+K.!#: !#&.a 3.~#: {#K@]#;+r+ #O@X+^#o+e+=@/#t+D+S.H@u Q@(#:._#:#<#[#}#;#|#1#A+2#3#Y+4#5#0@).6#7#8#~+{+]+/+H+H+~+,@H+H+,@~+H+H+/+]+{+~+8#7#6#).0@5#4#Y+3#2#A+1#|#;#}#[#<#:#_#:.(#Q@u [email protected]+t+/#=@e+o+^#X+O@ #r+;+]#K@{#: ~#3.a &.!#: !#K.g+5@D@)#3@p+O@'#,#z+>#;#~ -#=#*#&#%#$###@#+#.# #d+",
+")@Y+s@t@u@v@w@x@y@z@A@B@u@0+C@0+1@-+c@o+3@!@D@E@g+F@G@a &.H@a %.I@H@J@K@L@t+s+M@N@O@P@c@o+q+%@;+;+d@7@[email protected]@2.R@S@T@U@$ V@R R+W@X@I+V.$@i+Y@+ Z@`@[+{+^+/+[+[+p@q@^+^+q@p@[+[+/+^+{+[+`@Z@+ Y@[email protected]+X@W@R+R V@$ U@T@S@[email protected]@[email protected]@d@;+;+%@q+o+c@P@O@N@M@s+t+L@K@J@H@I@%.a H@&.a G@F@g+E@D@!@3@o+c@-+1@0+C@0+u@B@A@z@y@x@w@v@u@t@s@Y+)@",
+")@!@~@{@]@^@/@(@_@:@<@[@}@B+|@B.1@V+2@o+3@Y+4@5@ @.@_ 6@7@8@9@$._ 0@l+; n+`.;+#@a@r+b@[email protected]+%@s+;[email protected].,[email protected] m f@g@z+h@R i@j@k@l@X+c@i+m@n@o@6 [+{+^+/+[+[+p@q@r@r@q@p@[+[+/+^+{+[+6 o@n@m@i+c@X+l@k@j@i@R h@z+g@f@m 2 N.7.e@,+5.M.d@;+s+%@q+V.c@b@r+a@#@;+`.n+; l+0@_ $.9@8@7@6@_ .@ @5@4@Y+3@o+2@V+1@B.|@B+}@[@<@:@_@(@/@^@]@{@~@!@)@",
+"e+I+J+K+L+M+N+O+P+Q+5+6+y.R+S+T+U+V+W+o+X+Y+Z+`+ @.@j+/ L.h L.N.p ] +@; @@`.`.#@[email protected]+A %@;+t+m+h +x 0 ,+:.%.&@0+R+B+A+0+R+*@[email protected]@;@>@6 ~+{+]+/+H+H+~+,@'@'@,@~+H+H+/+]+{+~+6 >@;@[email protected].=@A+*@R+0+A+B+R+0+&@%.:.,+0 x +h m+t+;+%@A p+V.$@X.+.#@`.`.@@; +@] p N.L.h L./ j+.@ @`+Z+Y+X+o+W+V+U+T+S+R+y.6+5+Q+P+O+N+M+L+K+J+I+e+",
+":+<+[+@+}+|+1+2+3+4+5+6+7+8+9+0+a+b+c+d+e+f+H.I.g+h+] / ] M.i+j+N.j+O.k+l+; m+n+Y.>+U.o+p+q+r+s+t+m+ +7.u+v+w+x+@+3.}+y+8+z+A+B+C+y+D+{ E+ +F+G+D !+~+{+]+{+/+{+H+_+/+/+_+H+{+/+{+]+{+~+!+D G+F+ +E+{ D+y+C+B+A+z+8+y+}+3.@+x+w+v+u+7. +m+t+s+r+q+p+o+U.>+Y.n+m+; l+k+O.j+N.j+i+M.] / ] h+g+I.H.f+e+d+c+b+a+0+9+8+7+6+5+4+3+2+1+|+}+@+[+<+:+",
+"o.p.q.2 $ r.s.t.u.v.w.x.y.z.A.B.R C.D.E.F.G.H.I.J.K.L./ / M.M.1.N.N.O.P.Q.R.S.p.T.T.U.V.V.W.X.Y.Z.`. +w .+b.B ++@+%.#+y.$+%+&+*+=+-+;+>+{ ,+'+)+D !+~+{+]+{+{+^+/+(+_+_+(+/+^+{+{+]+{+~+!+D )+'+,+{ >+;+-+=+*+&+%+$+y.#+%.@+++B b..+w +`.Z.Y.X.W.V.V.U.T.T.p.S.R.Q.P.O.N.N.1.M.M./ / L.K.J.I.H.G.F.E.D.C.R B.A.z.y.x.w.v.u.t.s.r.$ 2 q.p.o.",
+"O + P Q R S & T U V W X Y Z ` ...+.@.#./ $._ : %.&.*.=.-.;.>.,.'.).!.~.{.].a ^./.(._.:.:.h h <.[.j }.b |.e _.1.2.3.3.%.4.h 5.6.7.8.9.0.a.b.c.d.e.f.g.h.i.j.L k.l.m.n.n.m.l.k.L j.i.h.g.f.e.d.c.b.a.0.9.8.7.6.5.h 4.%.3.3.2.1._.e |.b }.j [.<.h h :.:._.(./.^.a ].{.~.!.).'.,.>.;.-.=.*.&.%.: _ $./ #.@.+... .` Z Y X W V U T & S R Q P + O ",
+". + @ # $ % & * = - ; > , ' ) ! ~ { ] ^ / ( _ : < [ } | 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 o p q 2 r s t u g v w x y z A B C D E F G H I I J K L M N N M L K J I I H G F E D C B A z y x w v g u t s r 2 q p o o n m l k j i h g ] f e d c b a 0 9 8 7 6 5 4 3 2 1 | } [ < : _ ( / ^ ] { ~ ! ) ' , > ; - = * & % $ # @ + . "};
diff --git a/data/pixmaps/misc/bg-matrix-lines.xpm b/data/pixmaps/misc/bg-matrix-lines.xpm
new file mode 100644
index 0000000..f221308
--- /dev/null
+++ b/data/pixmaps/misc/bg-matrix-lines.xpm
@@ -0,0 +1,155 @@
+/* XPM */
+static char * bg_paper_white_xpm[] = {
+"108 108 44 1",
+" c None",
+". c #F0F0F0",
+"+ c #EBEBEB",
+"@ c #EFEFEF",
+"# c #F2F2F2",
+"$ c #F6F6F6",
+"% c #E6E6E6",
+"& c #EDEDED",
+"* c #F3F3F3",
+"= c #F4F4F4",
+"- c #E9E9E9",
+"; c #F7F7F7",
+"> c #F9F9F9",
+", c #FBFBFB",
+"' c #FDFDFD",
+") c #939393",
+"! c #929292",
+"~ c #919191",
+"{ c #969696",
+"] c #949494",
+"^ c #959595",
+"/ c #909090",
+"( c #8F8F8F",
+"_ c #8E8E8E",
+": c #979797",
+"< c #8D8D8D",
+"[ c #8B8B8B",
+"} c #8A8A8A",
+"| c #E1E1E1",
+"1 c #878787",
+"2 c #D2DDF1",
+"3 c #D3DFF3",
+"4 c #DBE7FB",
+"5 c #D8E4F8",
+"6 c #DAE5F9",
+"7 c #D0DCF0",
+"8 c #D4E0F4",
+"9 c #D5E1F5",
+"0 c #D6E2F6",
+"a c #DAE6FA",
+"b c #D7E3F7",
+"c c #D8E3F7",
+"d c #DDE8FC",
+"e c #DEE9FD",
+"..+@@+#@+$..+@%&@@#*=*##@@@==@+%@.+&@+@+&*&%+-%@@%@.-+@%#;>#&@.@*-%+#$=-@@#=#@@#++@=#--@-@#@+@#@+@@@&&&&@=&#",
+"$$@*=@*..>#*@$*>;$$;>;*@%&$$@+.,==&.#@.+@$.&#@@$#@=;#=;*@$>=#=;$$@@##$=&#@@@&+&#@+@##@@=%+@@@=$>@@@@@@@@#>==",
+";$@=$#=.=>*$=,$,,>;>,,=@#*==.@=,,,=;;=;.#=#.==#>*#$$#=>;=>,;==$*$*$;=$>$>;$$=*$>$@@#*##$@#=$=#=>#@@@#***$>*.",
+"$$@$>=;*=,=>$>@=>;;>,,;#,;====$>,';,;=;*#=*#*##===$=@@==;,'>==#@##$>=$,>.*$;;$=$>$=$=##=>$$>$@@=>=#=;>>>>=&@",
+"$$@$>=;*;,#$*$&#==$$;$$=@#$$=#$'#;=;#+*###*=***@$;$*###$#;>=#*#@++#=#*$=@*$$$=#@=$$$#@@*=##$$##=>*@*>>>>>#@@",
+"#=@==@#@=$+@+.+=@@@@@@@@@&@=$===&=#=.+##@+@*@##@@*@&##@=@#*@+&+%--@@&@.@$;$####@+@==@@@#@@@*=#@##+%+@@@#.@=#",
+"@#@=#+@&+@+.&@+$@@++&@@&#@&#;$@+.=.*#&*.@-@*@@#-&@+-##@#@=#&+&+%%-@#&@#.@#@&&@@++@##@@@@@#=***#@@%%+&++@&+=@",
+"@=#>$@=*%@@>$$@$;*@@=;$=+@$>=@@=*=&.#.#&=&*;###-#$@@>>*$#$$*=;>$%+=$.#;>@#==$;=@*=*###@@@=$=$>>#=@@#=##$#+#@",
+">$=>,;.&==$>;=##$;$$>,>$#=$;;;;;.=;;;===*;.$@>=$'$=>>==,>;;>;=#*;$;;;;;;$#$,>;>$>=#*===*@=$>>>$=>#@$>$==&&=@",
+")!!))~~!{]))))^{]]))]^]!~/!]^)!)!]]]]]^{!^~)()~~{!~]]~~^^))^]!!)!)^^^^^^~(!{]]]){^^))!!)~!)^^^))^]]^^])]((]~",
+"!!])!/~])~/~~!){))!~!)!~~_()^!~!^]]]!~~!/!~!~^))^!~))~(!)!!))))]~!]^^]]^)~]:{^{^^^^)!~)^)^^^^!((!]^)~!!!~){~",
+"(!^^)~~~__(~!~/~~~/(/!~(!<<!]~(!]]!~////(//~(!~~)~~!!~((((((~~!)/~~!))))~_(!//!~(~~~~~!!))))!(<[(~~<<(~((!]<",
+"(~!!!!~~((~)]!~~~~(((!!~^_<~!(~]~/~!!]]!~~~_<<[}~((~~~(<<<<<_(/~!~((~))!)(((<_~~(~~~!)~(((~~!~~~!~([<!)!<_~}",
+")!~~!^^^)!!))!)^!!~(~]^){~_/~/!^!!!!]]!~!~!((<(<~~~~)]!((~~/~!!!^!/(!)]):]))/~))^^^))^~<(~~!!!!!)~_<()^^~(!<",
+"^^)~!^^^]!~~~~)^])!~!^^]{]~~~~){{]]~~/(_~~)()!^)~~~~]{^~)^^))^]){^]!!!)]{!~!((!!^{^)!)!())!!!~~~)/__(~!^]!^!",
+")]]!~~~(!~/~~~)^^]!~!]^]{{]!~!]^:{!~~///~~)()~^)_(((!^]/)^^))))~^{{^!~!^{!)]!~))())((~!~~~~~~!!~!((/((~^!(^{",
+"^^<(~~^()!/__(~!))!~//){{{]~~))~!!]^^!~~~)^)!!~~)!//!~/)~~(<(]^){^!!)))]])^^))^)^((~!))()^)(()^~/~!~(<_(!!]^",
+"(~<~~_~<(<<[<_((~~~/_<_(~!~(_(~~!~~!~((((~~(_<<}~~(/!~(!~/_<_/~(~((~!))^)~~([<(_)((((~~<(!~(_~!!])!!!!]^{]~~",
+"&..>>@@&*#@#*=#.&.===###@=$.+&#$$*##.@&@;$#+-+@@@@&@*@&.*@++&++&#@@=$===>=*#&@$;$.#*.#=.=$$*@+@##@++@#=$,*+-",
+"**$,,=#*;;>>>$==.=>>>;$$=;>=@@*>>$===#@.>;=@@*;>*$=;,>=;*&+@.@@#=*=;;=..=@##@#>>=#$$#*;$>;;;*&&#=#@@#=>,>#++",
+">*=>>;=$.#$;=@@#;>>$==#@$$$$##*$,;$>>$##@#**=$$**$=>,>=;$#@=$##$@@#$;$=$##$;##=#..$$.#;>$##$;*#$>>,>$$>,,;=$",
+">=$=$,$;##=$=@#>>,>=*==.=#=$$==$;==$;=#.$=*.#$;$@##=>=@#>$===#*=@@*;>;;>##>,>;;=.#;;@.;>>==;>$=$$>,>=#=$$$;,",
+"$=,#*,$;$.@*=#=>=;$##$$###=;$##*#@&@##@@>;*@#$>;*$=$,;#=$$=@@@@@**$;;$$>@&#=.#*@##$$@@==>>;$=##*>>>>$=$$@@@*",
+"@#'#@>*=*-|%+++@@#@+-++%@@*$*&+&@+%+@@@@-&#$;$@%&@&@=@+&@*#+-&@+@@.*=*$>;==*&&@&@@*#--&&@*=#@@#*=#@@.##.@+%+",
+"==*#*###$;#@*#@#+@..#=$$&$,,=.#==@+.;>$#;>,@$*$+.$*@#@-%@@*$$#.#;=###@#;=#>#,;>.=#*======.@=$;>,&#@#+##;@@#*",
+"@#$;$*#.$>=#$=#=@@@@=,,,#=;;=*;,$>,>=@@##=>.$#;#@*#@$;*#>;$$=##=,>;$#@=>,>,$,;>====;>>>>@@##.@@==$#>=,;>====",
+"&#>>$===;>$*$=.#==*=>',>$==$$=;'>$$>>$##=$,==@##*;=*;>=$>$$$$=$>,>>$#.=>>>,$>;,;==$>>,,,@*$$@++.$=@;$,=#===*",
+"#=====$>>>#@#@&@$;>>>>=@=#=>$#=>=&+@;>=#;$;$=@@#>,;=$=#=*=$>>$$;;$===$;>$;>$$$;$=$;;>>>;$>,,$@@=$=@$#>@&@.##",
+".@&@.###$$@+@@@##$;=#@@&##=$#@#>.@@@@@.=#.@=**#=;>$#=#@*$$$;$#@#=##*$>;$$>>>$$*#@*=*=$$*$$;>;=#*=$.;#;##&@.@",
+"&++&..&-##&+@##;@#.+-+#=#**@&@$,>=@.*=$;..+.@*@@>>$**@+@*.@@&+@###@@#=#@@=*;*>=#-&&+&.#@&++@@&+-&.@=@=.=#*@%",
+"#..#*#@+##@&#==;#==@@#$>*$$@@=>>,=@#$;$=@$@#-#@&>>$==@+.#@@@@@#$#==@&@@@&#&=.>=#+@@++#*@@++@@&+++@&=@=@@#=@%",
+",,>$==$;#=.@==.=>,,>>>;==>>#*>>##=;=+|-.+$##-$*=#==$>==,>>>,>$$;$,,*&@=;>,#;@>@@>,>=*>>$,>>,>;=$*$=,$>#@@*=@",
+",$##==$>>;;$=#*$;>',$.#$#>#;$@#++#$>=@@@@#+#+=++;$$>,,,$##=>>$$;>>$*=;>$;#&@@#=$$$$$*#@@>;$>>$#@@+>$#>##==.,",
+"$.&@@#$>*$>$.@#=;>,,;#=;*;#$$.$.@@@#$$@+#=@@+=@#*=====*#@@@#=*=;.*==$>>$,$###@@@#*===***$$$;>>$#++>>=>@+$=@>",
+"#@@@##=$+@@@@==#=*##@+++#=@##@=#@++@*=@+@#@@-@@@@@#.@&@@+--+&&@####.@@@+#@@##@&&&@@@@@@@@#*@@@&%&+*.&*#.;#+@",
+"@#=$$=.@@&-%.>=+>$***.@@##@@&+&&+@##@@@#@##@+@++&@@@@@@=&++&@&@@;=@+++-%&+&.#@@@@@@@@@&+&#*&++-|+-&+-.==$#++",
+"~!!!!!~/])~(~)~<)~/!]]))!~!~((_(((!~(<((!))~((!!~//~!~!)!~~)])!!]!~/~~~!!!!)!~~~)!!!!~~(~)]!!))~}<~]!!](/~!/",
+"]^)~~)^{]^{^!!)^)~(~!!~~)){^]^!]!~((!!(<)))(~~^^]!!]]!!)]!)^{{]]!~!]^^]^!!)]]))^])!)]])!)]]]]])!~)]{]){~(!{^",
+"^^^!~){{]!!)!~){^)!)])~~)!:^]{){!~(~!!~(!~!<!(!(!~!])//)]!~)^]!!!~~]^)!)((~))!)^!~~~))!~]~~!)~(({{!)/~:^~!{!",
+"~))~~~~/:~<(~(<(<[<(~~~~~({!~]~^(~))~((~~(^(^(<1_(~]~_(]{)~!)!~/)/(~!)]{~~!])~/~!~/~!)~/)_<!^!~)~]~)~({~^)^<",
+"!()((!<(}(!~<[_~!<((<()((/~(<<(~}[<(((~~((()^([[<[}(~_<~}_~!~(<[<[<))/!_[(((~_<~~!)])(<!1~!(~~(!</!~(~/_1[<[",
+"/_)!){!^((/(<[<<(_((_(~((~~~((/!<(~~((((<<(((((([}}(!((^/~!!))~~[~/~/]:(_(/~~(_~<)!(/!~(1__<~~_~<(/((((_(~!~",
+")!^^^{)^^^)!))!!(~~~!~~!~~!!~~~!!)^^!~~~!^^)!)^{~~(~)((^]!~!)^])~^)!(~{(~~~!!~/~[~(<(!~~<(_()~(~]!~!!~~~_(/~",
+"^^^]]])])!~~)^^^){)!{^){!))))))]))^^^))!!^^~~)^!^^]^^((^^)!)^]]]^)~^~<!!)~!]])))~~(!](/{)!~]^!~!:^)^{^^{^]~(",
+"~~~~!!^^///~!]{:^{~/{{)^))))]^])~~~!))!~()!(~)~}/~!^{~(^))^{{)!)~(_]~<)])(~^))^]^]){^~~:]~!^)~!)^!~)^))^{^~<",
+"@#@##@$=#*==*=>,=#&&=$#@#.@@#*#.*##*$$#@*$$=$>#%&@.$>@+#.#;,>*.*@#.#@@>@=+#;.#>=#>;####;@+@#@@=**..#*##*##@+",
+"=>*;=&.+.@@@&@@.@&@#@@@+#@&&@.@@@#=$=***#*##*=@%#@@==+|+@@#;;#@*;>*=@@=+$&=;&&=@&@@+##@#+%+@+.$@@#=#..@@;;*&",
+"=,$,>@@%;$=***##@&;,#.=@>=..=$=#+@==#@#$>>$=##@+*.@#=+|+*@@$>$=;'=@>$+##,.>>++#&#-%.,*@>.+&@+$>&&=$#@@&-#=*@",
+",>>>,,;#@,;&@>;=#$$$>;=$,>$$$#.#@>>@&&&.$;$#=>;=*=$=.@@#=;=@#>$&;,==#&#@.@#*@#$#@#=$=##$;='$>=>@>@&=*##.>;==",
+"#=$;>>=@@;=@$,>=*$=$>$##>$$>,>=##>;**##$#.###@@#$;>;==$;$$$$$;;$&##$$#;=>$;$#=;=>;;>;$$>>;>>*;>*,#*>;$$===$$",
+"+.#@@==@>,;$,,*@*$==>$@@#@#;,>=##===;=*>$##=#+-&*==#..=$===$#+&=@=#$$#;=#@.#@=,,,$==*#*$>>*>+$=*,=;,>$;;@#=$",
+"&#@%%@=#>>$$>=&@&###=#&@@@@#=#@##.@*;#@$=#@..@&&@@@&++@@@@@@+%+@=$@@@+#.>==#++@@>#&+&&&@$=.=+@@@;#=;#@*=@@.#",
+"=$*++#$$@@@.*@&*%@@@#@@*===#+-@==#@*;#@*@@+%&;;.##@@&&@@+.@++##@@#+&&+##;#==&+&@>#++&@@@#&#@@+.+=@#@+-@@@@@&",
+">>;==$;$@=*##@@$+#==$==>>,>=+-.,=$*=;=#$=$.%+>>@$=*#@@.#=>$&@$=&.$#$$#$#+-@=@@;,>#@@####@-#@$@$##@@@-+@@+&.#",
+"{)!]^])]!{^!)!~))^)!^^)^]^^)(_!:()~/!)!]^{]((~!()!!~~~~~{{]~(~~_]{^{{!]!!(~!(<~]!~(~!!!!~<~!!~)!/(~~((!/[()^",
+"{!(~)!!^/])~]^))^]/())~~(~))~/){[~(<(!)]!!!~((/!))!!))!!^!~!!~!^)^!])~^])(~)((]:!~~)^]]^!~(^(!~!((~)!)]~(!^{",
+"^)({){!)~(!]/!{)~!!~!)])(~~(_~!)(!^^))!~(~!))!~/)!~~~(~)^~(!)~_(((<~)~]]]<({{)^{]!~(~!!~)))!(_/]())(_~~_~~!)",
+"(~(~}<<~__/~(~)))]])!~~~!)~_<_((}_~~~~!!]!(___(((((~~(~!~~!)([<~<(<~!(~(^_())!)]!~_<_(~~!!~~~!))_(((((((__((",
+"~/<~(~(~!~_(^^!(!)))!~~~_(((()^{(~!~(~~!((_(~~(<(_(~!~!!^~(~~((((!(~~(~_^((((~!~)~_<[<(((_<<~)!()~/!~((~~~~!",
+"^)~]^^!~]{!~{^(~(/!)!~!]!)))]^{{^{^)~~))(_(!^^)(//~~!!!!{~_())~(]{~((~^~)~~/_/!~)!((__(!!(_~^^])]!~))!~!!!~!",
+"]^{^~<(!!:{]]~(^~~!))!)^))]^^^]]!]])!]^{{^!!]^]!!~~/~~~/!!!!~(~)){~~~~^~~!^)(~)!!~~!))]{)<<)^~/)~~~~!^^!^]))",
+"]!]~~()^{^!!^^)!^)!]]!!]((~)])!~/!]))]^^^])]^^!~])!~~!~(])!!)]))~]!^^)](~!^^//)!^!!^{^)]!<<!)_<~]^!~!^)(^]]]",
+"!_/(^)^]:~(~]{^({!(!)~~)]!~~/<}}/)^^)!~/_(!^{^~(!)!~!])/^~_(^{]((!~{{~~_~(!)/(~(^~()^)~~^)!)])!!:]~!)!(<((_(",
+"2345678909a677b55329cc560839999030665b93990bbccc99005a598999909999355383699b99939779aa55b50385b7a37060899889",
+"3999988c64bbb95b566bb5659990c55b595d6384b9b92b67999bab9689093b4a65b0c66c83389bbccbcb99973899bc92bc56aa599b56",
+"4465a65aa4b56b60aa5bc659aaa5b0bcb5a4588bcc6b35a3a65645ba99cc95aca6666a44bbbbcccb59909566b99b5c93b6acb6609b66",
+"ed65d45bdd54d44b65bbadaba446bb5485445b99b5460a4ba60b593b4a4456536666a44d6a44a665acb6a6add5b645b096ab064695aa",
+"6acc4493a45446456556446b6aa6cb563ba465bb9c5554d54abb6c95d6a4a469c99c6a6656665cbc5bb4ea54d5b44c05b565c566556a",
+"95b966cb9c9b085c66666b9944a65b9899b659969b99546b5b88bb95b38b5a4bb33966b909993338333cd6bd089659954cb6693865c5",
+"96b806a48b9b93bc00b55b9b6666a6b9b995b33bb598b59933779989b2288908c83b65095b9888889922b98a839550b6c83b59385b0b",
+"9a59b66aba56595b099565559bc56666bbcc09909ab8b09655996a56409b933260ba45bb6b0b6a655497b93cb99b644438989c5bbc5c",
+"94a54d6b6464ab59d6b646b99b55b0c69645b66b3a59b9beaab0a455d5545bb965ad4bb60995ded4bd58a6966b896eda94433569b646",
+"@=;;>,;@#$>,$.#$>',#@=$#>==;,>$=@=;$==$;&&;#*';>#$=@=,>@>#@*#@#,&=>>*.#=$=#=$;>,#$>>>,,>==###*=$###&+@##$#@#",
+"$;;;>>;=$$;>$##=,,;*$,>*>$#**#=$$>>$=$;>$=,$=>#$;>$*$,,$,*.$>$;'@$,,>=##,;$$$$>,$;>,,,>>$$;;;>>,$=#@#$$$,;==",
+"$#@###*$;$=$$=##;=#*$$$=;=*#@@#$=$=.@*==*@$=#*@$>$*##==$;@@=>$=;.=;>;=#.,>;=@&&.$==>;*#=.*===#*=$=*#$>>$>;;;",
+"@++&@&@$$====#.#@@=$.+@$=*=$=##*@@&+@##@@&@##@.;>#@@@+&#$@&#*@@##@@@###=|%+@#*;,$.@$=@+@@#*#@+&@#=*#=$$====#",
+"*@@#*@#;**==#@@===>,$@#>=#@*$$==###.*$=.=*#;;#=;>*@##@.$$*#=*.#$=@+@###=*=$;=@&&;..;>#.=;;;=##=$.=;=#*$$$$#&",
+">;;;$**=##=$*@#=';$>,>$$>#&@*$$;;>;$;>$#*=@;,;,;$##=;$;>;$$;$=;,;##$>$##-+@$>>;>=@.$>>>,;$$=$;>,#>,>==;>=;>$",
+">,,;=*#.##*$$===,;=$>>;=,$##*=;>>>>$$;$=@*+=>>,.#.@=;>;$;$$>>>>>>==>>$##*.#$;=@@=##=>,>>*.@#=;;$=;>;$;>,.;,,",
+"$,,=#*=.=##$>>$=$;;$==$;>;>>;$;>;>;==;>>=>@=>$;%###*;>=@,;;>,,$=;#@=$##$$#@=$$#@;;$=;,>$=.@#$>$##====;>>*$$#",
+"=*==@+@$>>*>;@=#;>>;#@#>#&%>==+=;;#.*;>;;;==*#=;@&%##>#=$=#$>>$#.&+@##*=#;==>=@>$##@@$;@,;*@@@@@=$#&&##@@=>$",
+"((/!~_<<)~[/)~~<(~))~(~^~~_!()(///__~]]!///~~~~!(~()_/()_<<<<<[}!~!)!~((_(<[([}_)~~~(!]~(((((_<}(/(((/~(<(~(",
+"~~~))~(_~)~])(^^)^{:^!){~^)!({^~]]!!!]!//~!!!!!!)]~)_((!!!~((_((!!]^)~~!!)!)^!(~)~!~(~)~!!!))!/(~~~!!~~)/~~(",
+"{^)!))]^/]!]~(^{]]^^]!~!~^]~~{{]{:{{{]!(!]]]!)!!{)</(!((^])!~~~~!)]^)~){(~!^:^!~^~~~(~~())!!!~~~]!!])~!^)))!",
+"])!~/!^{{]_~^^{~]~~!]]))~~~/~!^^]{{{{{]/!]]~~!!~]~}(_!((^)~!)]!/!)^^!(~)<<(!))!/{!~!!]]~)))!!~~~)~/!!/~]~!!)",
+"/~!~/~))))(~))^~{)~)^^)!!(~~)(!]]{{]]]!//!!//!)!!!(!(!~^)~/~]^)~_()^)~~!])])~]{^^~~]^{{]~)]^)!~~(((/~!!)(~!)",
+"~!!~~)!/}~((_<~()~/~~(<<~(!()(!]!]]!~!~/(!]~~))~)!()(!~^~(_(/~~~<_(~~/!])!^)_~^)~(~)~~))<(~~/((((((~)^]~~!)!",
+"])~(~)!(!^!)^^:)/~!)!(((<<~<~_)!<___/!]]_!]~~!~_)(1__!_<)!!~~)]^)~(<<<~^((])<(!(<<(~<}<(!!!~~~)^_(/~]{)<!))~",
+"))/]~)~]]]])))!~!)]^^^)~!))~(~!!]]]]]]!!~{:]((!])]~~]^)^)^]{<~~))~({:~]{^)!]^]))^^]]{{]~](()]~~]~!^(^^^<!~!)",
+"!]!{)^]{]^^^^^^]:{^]])~(~!~((~!!]]{{]]]!!]^!((~!{{^]{^!)])^)(_!~!~(^^(){^!~)])!!!]^]^^^)^~/)])!)(!]~^{{~])~~",
+"@=#,=>$,#=$$=#*=>$#=$>>>$$=*=$$=,,,,,;;=;;;=#*=$$>>>,,$$;#,*$&;=;$#,;&=,=.@#=*###$>;$;>>>$*=;>$*@$==#>$#>;$=",
+"@@+*@=@=>>,,;==;,;##==*#>;$=$;$=;;;;;=..*=;===$$*$==;$#$#@$#*@$*;;=>$+.$@++@..@@@#=##=$=$$#@=>$@+*@#-*@##=$$",
+"=@-@&#&@@@@@+%%+=#.*=#.###.#####...##.&+-&#=.@@*;>=@.@&.@@@=+#@@@.@;=-@@@++@####@@@@@*#@##@&.;$@%&+@-*#;&#=#",
+">$@$#;.#$=$>$##$++@=$==>@@@####=====;=.&%+.*@+@#$;*@.@@=##@>&$@&+&+$;@==#@@#=====#..=;=@@#@@.$$#@#@*@#*>@=$#",
+"$;=,$>=;;**;$#.=##$,$@@=#=$;$#=>;;;;,;=.#.*=*@@=@$$=;=*$=#*;=;$@@@&;,$>>;=#=$$==#===$>$*======$$,$;=$@#*#;>$",
+"&*='=$#>,$$>>*.=@@;,>#=,;>,,$.#;=#*;;;#@,;*==##=#>,,,$@.@+#.>=>.*#&$,$>;>$*=$=##+@###**#>>>>$=$>,=;#>&##+=>>",
+"$;>;#@@=>=#=;$#@,;#@.*=*+=>$#*$=,=...##*#>;@#=#@;,,;.@=;-@#@#;>=;>;#@=>,,,,;.=$&=*>=>*$@>>>>>$##=>'#@>$==##*",
+"$.@#$=@+*..=$#@+==.@@==##$;$#=$;#&&#;$*@@$$=>,=@;>>$##=$#@+%+=#+*==@@#$>;#=;=*#+=#$#>@#@@#$>=@@@>=$@&.&#@#=$",
+"&@#$$=#=@@.==@+++@@++#@-*#@@@@#==@&#$=&%&@@=,>#@=*##*##..@%|%@#@==#@@#**>&&=#@&+#@$#$@@+@@=$=@@#>@@++&+#%@*=",
+"<(!^]!]{((~)~(_(!^^!!^)<~_<__<</{!((/(<</~(~]!(~~~~!!~(((!~_}<~))!~~~~/(^((/_<(((()~^(~(~~!))~~!^((((~(!<(~~",
+")(<~^^]!!!))!~~)!^^))^)_]~(~!((~)!~~~~!^!]]^{)!{!~!])~((){{](_(~))!))!!~))^!(~!(((^!^~)!^)!))!!))~)/~^!!))!~",
+"^!(~!)))^]))!~)^/~~~!)~(^))])!~~~!]^)!]{(]{{{^]{!~!])(_(])))))~(]]^{{{^{():{!]^~((^){!^)^^)^^))^))^!!^~~{]!!",
+"~~~~/(!^^)!!~~)^)!~)^)!!)])!~~~(~!)]!~~!(]^)]]!!!(()]~(((((/!))!!!]^^)]{/~]^!!)~((^){!^)!)^^)!)^!~])!!(!^])!",
+"([}<~)!!)!~~~~~)!_<(/<<<~])(_((_(((((((~!{)(/!~~{~(]{^!~_(((__~](((~(<<(](_~(<(~((^)^~)![(^^~((^!<~))~_^]^{]",
+"(~!~~!~((/(<<(~~(<[(!!((/<())((!(~!~~~(<!(~~~~_!!~~]{^!~!^(~~~{<~_</~(_(}_(<}<<<~)~!~(~([(<[(<[!((_<<<(~)~/(",
+"]{^!~!!(!))~~!!~/_(!^^!~)~~)!((/~)])~~~!:)^!~)!{)~/~))!)!~_!~(^()~(~!~~!/!))!~([!![}}}~~(!(<!!())))!~!){~~~~",
+"!)!((!)~]^])^^]!^))^^]~~))))!))))]])~(!{^!]~((()^)!!!~!]!(_])()){)~!!~~)^)~/~))!()){^~!())~~^{))~!)!~~)]!)]^",
+")^)~!^:{])))^{^){^]))!~(!^^))^^)^)))~/){!/)~((<(]]^^]!~!!(~^!~]^:^)])~~!)!(_(!]^!^)^^~)~^)!!^{^)~!)~~~~~!!)!"};
diff --git a/data/pixmaps/misc/bg-paper-black.xpm b/data/pixmaps/misc/bg-paper-black.xpm
new file mode 100644
index 0000000..8545b35
--- /dev/null
+++ b/data/pixmaps/misc/bg-paper-black.xpm
@@ -0,0 +1,135 @@
+/* XPM */
+static char *paper-blackground[] = {
+/* width height num_colors chars_per_pixel */
+" 111 112 16 1",
+/* colors */
+". c #3b3b3b",
+"# c #363636",
+"a c #333333",
+"b c #313131",
+"c c #303030",
+"d c #2e2e2e",
+"e c #2d2d2d",
+"f c #2b2b2b",
+"g c #2a2a2a",
+"h c #292929",
+"i c #292929",
+"j c #262626",
+"k c #272727",
+"l c #222222",
+"m c #242424",
+"n c #202020",
+/* pixels */
+"eebddbfdbkeebd#cddfghgffdddhhdb#debcdbdbcgc#ba#dd#deabd#fjmfcdedga#bfkhaddfifddfbbdifaadadfdbdfdbdddccccdicfdbk",
+"kkdghdgeemfgdkgmjkkjmjgd#ckkdbeliicefdebdkecfddkfdijfhjgdkmifijkkddffkicfdddcbcfdbdffddh#bdddhkmddddddddfmihb#g",
+"jkdikfiehmgkhlkllmjmllidfgiiedilllijjijefifeihfmgfkkfhmjimljhikgkgkjikmkmjkkigkmkddfgffkdfhkifimfdddfgggkmgebbi",
+"kkdkmijgilimkmdhmjjmlljfljiiiikmlnjljhjgfigfgffhiikiddhijlnmhhfdffkmiklmegkjjkikmkikhffimkkmkddhmifhjmmmmhcdhml",
+"kkdkmijgjlfkgkcfhikkjkkidfkkhfknfjijfbgfffgigggdkjkgfffkfjmifgfdbbfifgkidgkkkifdikkkfddghffkkffimgdgmmmmmfddjlm",
+"fhdiidfdhkbdbebidddddddddcdhkihicifhebffdbdgdffddgdcffdhdfgdbcb#aaddcdedkjkffffdbdiidddfdddghfdffb#bdddfedifdeb",
+"dfdifbdcbdbecdbkddbbcddcfdcfjkdbeiegfcgedadgddfacdbaffdfdhfcbcb##adfcdfedfdccddbbdffdddddfhgggfdd##bcbbdcbidcc.",
+"dhfmkdhg#ddmkkdkjgddijkibdkmiddighcefefchcgjfffafkddmmgkfkkghjmk#bikefjmdfiikjidghgfffdddikikmmfiddfiffkfbfdhmb",
+"mkimljeciikmjiffkjkkmlmkfikjjjjjehjjjiiigjekdmiknkhmmhilmjjmjhfgjkjjjjjjkfklmjmkmifgiihgdhkmmmkimfdkmkhicchdejf",
+"kihkkgfhljkkkkmljjkkjmjhfehjmkikijjjjjmlimfkdkfglhfjjffmmkkmjihkikmmmmmmgdiljjjklmmkkiikfhkmmmkkmjjmmjkjddjfglk",
+"hijkhegjkfefghklkkigikiffcdkmifimjjjhfgieififmkkmhfkkfdhkiikkkkjfijmmjjmkgjnlmlmmmmkhgkmkmmmmiddijmkghihfklfflk",
+"dimmkffgccdfhfefgfedehgdibbhjfdijjifeeeedeefdhgfkffiifddddddffhkeffhkkkkfcdheehfdfgffgiikkkkhdbadgfbbdfddhjbbmk",
+"dfhiiigfddfkjiffffdddiifmcbfidfjfefhijjifffcbba#fddfgfdbbbbbcdefifddgkkikdddbcffdfffhkgdddfghgffhgdabhkhbcf#ajj",
+"kiffimmmkihkkikmihfdfjmklfcefehmihhijjighgiddbdbffffkjhddffefhihmiedhkjknjkkefkkmmmkkmfbdffhiiiikgcbdkmmfdhbbie",
+"mmkfhmmmjhfffgkmjkhfhmmjljgffgklljjgfedcffkdkhmkfffgjlmfkmmkkmjklmjiiikjlhghddhhmlmkikhdkkiihgffkeccdfimjimiffb",
+"kjjhfffdifefggkmmjifhjmjlljigijmnliffeeegfkdkgmkcdddimjekmmkkkkfmllmhfimlikjhgkkdkkddfigffggghhgiddeddfmhdmlmkb",
+"mmbdffmdkieccdfhkkigeekllljffkkfiijmmiffgkmkhhgfkieeigekffdbdjmklmiikkkjjkmmkkmkmddfhkkdkmkddkmfegifdbcdiijmkff",
+"dfbffcfbdbbabcddfffecbcdfigdcdffiggigddddfgdcbb#ggdeifdigecbcefdfddfikkmkffdabdckddddgfbdhgdcfihjkihhijmljffdcb",
+"ceemmddcgfdfghfeceiihfffdikebcfkkgffedcdjkfbabddddcdgdcegdbbcbbcfddhkihimigfcdkjkefgefieikkgdbdffdbbdfiklgbabcc",
+"ggkllifgjjmmmkhheimmmjkkhjmiddgmmkiiifdemjhddgjmgkijlmijgcbdeddfhgijjheehdffdfmmifkkfgjkmjjjgccfifddfimlmfbbded",
+"mgimmjikefkjhddfjmmkhhfdkkkkffgkljkmmkffdfggikkggkimlmijkfdikffkddfkjkikffkjffifeekkefjmkffkjgfkmmlmkkmlljikkif",
+"mikhklkjffikidfmmlmigiiehfhkkihkjihkjifekigefkjkdffimidfmkiiifgiddgjmjjmffmlmjjhefjjdejmmihjmkikkmlmifikkkjllmk",
+"kilfglkjkedgifimijkffkkfffhjkffgfdcdffddmjgdfkmjgkikljfikkidddddggkjjkkmdcfiefgdffkkddhimmjkiffgmmmmkikkdddgkii",
+"dfnfdmgiga.#bbbddfdbabb#ddgkgcbcdb#bddddacfkjkd#cdcdhdbcdgfbacdbddeghgkmjhigccdcddgfaaccdgifddfghfddeffedb#bbbb",
+"ihgfgfffkjfdgfdfbdeefikkcklliefiidbejmkfjmldkgkbekgdfda#ddgkkfefjifffdfjifmfljmehfghihhihedhkjmlcfdfbffjddfgdb#",
+"dfkjkgfekmifkifhddddilllfijjigjlkmlmiddffhmekfjfdgfdkjgfmjkkiffilmjkfdhmlmlkljmhhhijmmmmddffeddiikfmhljmiiiiihi",
+"cfmmkhhijmkgkiefihgimnlmkhhkkijnmkkmmkffhkliidffgjigjmikmkkkkikmlmmkfeimmmlkmjljhikmmllldgkkdbbekidjklhfiiigfij",
+"fhiihikmmmfdfdcdkjmmmmidifimkfhmhcbdjmifjkjkiddfmljikifhghkmmkkjjkiiikjmkjmkkkjkhkjjmmmjkmllkddikidkfmdcdefffgi",
+"edcdefffkkdbdddffkjifddcffikfdfmedddddeifedhggfijmkfifdgkkkjkfdfhffgkmjkkmmmkkgfdgighkkgkkjmjhfgikejfjffcdeddij",
+"cbbceecaffcbdffjdfebabfifggdcdklmhdegikjeebedgddmmkggdbdgeddcbdfffddfhfddhgjgmhfaccbcefdcbbddcbacedidiehfgd##cf",
+"feefgfdbffdcfhhjfihddfkmgkkddimmlidfkjkidkdfafdcmmkiidbefdddddfkfihdcdddcfciemhfbddbbfgddbbddcbbbdcididdfid##bd",
+"llmkiikjfiedihehmllmmmjiimmfgmmffijhb.aebkffakgifihkmihlmmmlmkkjkllgcdijmlfjdmddmlmhgmmklmmlmjikgkilkmfddghdfml",
+"lkffhikmmjjkifgkjmnlkefkfmfjkdfbbfkmiddddfbfbibbjkkmlllkffimmkkjmmkghjmkjfcddfhkkkkkgfddmjkmmkfddbmkfmffiieljli",
+"kecddfkmgkmkedfijmlljfhjgjfkkekedddfkkdbfhddbhdfgiiiiigfdddfhgijegiikmmklkfffdddfghihgggkkkjmmkfbbmmimdbkhdmgjc",
+"fdddffhkbddddhifigffdbbbfidffdifdbbdghdbdfddadddddfedcddbaabccdffffedddbfddffdcccddddddddfgdddc#cbgecgfejfbdcea",
+"dfhkkheddca#emibmkgggeddffddcbccbdffdddfdffdbdbbcddddddhcbbcdcddjidbbba#cbcefdddddddddcbcfgcbba.bacbaeihkfbbbcb",
+"fhiiihfejkfdfkfbkfeijjkkhgifddcdddhfdbddhkkfddiigeegifhkiggkjkiijifeffgiihikiffgkihhigfdfkjihkkf#bfjhijdefhedde",
+"jmkggkmljmlmiikmkfdfiiffkklmjmhjifddhhdbkkkdffmmjihjjihkjikmlljjigijmmjmiikjjkkmjkikjjkikjjjjjkifkjljklgdhlmjef",
+"mmmhfklljiikifklmkikjkgfkinmjlklhfdfiifdifibhdidifijkeekjigkmjihifgjmkikddfkkikmiffgkkigjffikfddllikefnmfilijfj",
+"fkkgfffenfbdgdbdbabdggfggdlifjfmdfkkfddffdmdmdb.cdgjgcdjlkgikhfekedfikjlffijkfefhfefikgekcbimhfkfjfkfdlfmkmbfel",
+"hdkddhbd#dhfbacfhbddbdkddefdbbdf#abdddffdddkmdaaba#dgcbf#cfifdbababkkeicadddfcbgfikjkdbh.ghdgfdhbeifdfec.ababdf",
+"eckhklhmddedbabbdcddcdfddfgfddehbdffddddbbdddddda##dhddmefhikkgfafefejndcdeffdcfbkideifd.ccbffcfbdeddddcdfhfddb",
+"kimmmlkmmmkikkihdgffhffifgihffgihkmmifffimmkikmlffdfkddmjighkmjkgmkhdgldgfgiifefafdbdhffbdcdkgdfjhfiigfgcdefhjj",
+"mmmjjjkjkhffkmmmklkhlmklikkkkkkjkkmmmkkiimmgfkmhmmjmmddmmkikmjjjmkfmgbiikgijjkkkffdijdelkigjmifinmkmlmmlmjfdejl",
+"fgffhimmeeefijlnmlfellkmkkkkjmjkgffhkkhfdkidfkf#egimlfdmkkmllkikfdcjgbkjkdgmkkmjmjklmffnjgimkfhkmifkmkkmlmfbdkm",
+"dfdffdkhfghhgimlifccikfdfeddfgfegffgkkfdgkkikmf#cdekmdbfefjlmgegdfefddmdhbfjefmhfmjffffjdbdfddhggeefgffgffdbbdf",
+"hmgjicebedddcddedcdfdddbfdccdedddfikigggfgffghd#fddhib.bddfjjfdgjmghddibkcijccidcddbffdfb#bdbekddfhfeeddjjgca##",
+"hlklmdd#jkigggffdcjlfehdmieehkifbdiifdfkmmkiffdbgedfhb.bgddkmkijnidmkbfflemmbbfcfa#elgdmebcdbkmcchkfddcafigdcdg",
+"lmmmlljfdljcdmjifkkkmjhklmkkkfefdmmdcccekjkfhmjhgikieddfijidfmkcjliifcfdedfgdfkfdfhkhffkjinkmimdmdchgffemjiikjm",
+"fikjmmiddjidklmigkikmkffmkkmlmiffmjggffkfefffddfkjmjihkjkkkkkjjkcffkkfjhmkjkfhjimjjmjkkmmjmmgjmglfgmjkkiiikkkgd",
+"befddihdmljkllgdgkiimkddfdfjlmiffihijigmkffifbacgiifeehkihikfbchdifkkfjhfdefdilllkhhgfgkmmgmbkhglijlmkjjdfikkif",
+"cfd##difmmkkmhcdcfffifcddddfhfdffedgjfdkifdeedccdddcbbddddddb#bdikdddbfemhhfbbddmfcbcccdkiehbdddjfijfdghddeffgk",
+"hkgbbfkkdddegdcg#dddfddgiiifbadihfdgjfdgddb#cjjeffddccddbedbbffddfbccbffjfiicbcdmfbbcdddfcfddbebidfdbadddddcbbd",
+"mmjiikjkdhgffddkbfihkhimmlmibaelikghjifkhke#bmmdkigfddefimkcdkicekfkkfkfbadhddjlmfddffffdafdkdkffdddabddbcefedd",
+"lkijmjkjilmikhfkkmkimmkmjmmkdcindkgeikijmljddgidkihgggfflljfdffcjlmllijhidfidbfjifdfiiiifbfiifkiedffddheadkmmjk",
+"lhdfkhimejkfjmkkmjedkkffdfkkfeklafdbdikjhiifddeikkiikkiimigiigimkmijkgmjkdfkddjnhffkmjjmifdmdifiddfkhkjfdimlmjk",
+"mkdlklikfdijeilkghhgikjkdffdcfikdimmkkhfdfhkkifekhfgfdfkmfdikfcdddbgkfjjjbdllkmljifdfhhfkkkidcejdkkdcfgcffhkjjk",
+"dfdg#bbgccegdfkkkjjkhgggikgcbcdd#cfffgihjidcccdddddffdfiffikdabfbdbfidfdmcdkkikjifcbcdffiigffikkcdddddddccddffd",
+"febfdfdfhfcdmmhdikkkhffgcddddkmldgifdfghddcdffdbdcdfighimfdffddddidffdgcmddddfifkfcbabdddcbbfkidkfehgddfgffhkkk",
+"mkgjmmhfjlhflmdfdehkigijikkkjmllmlmkfgkkdcdimmkdeefgiiiilgcdkkfdjlfddfmfkggeceifkhddccdhidcfmmjkjigkkhfhihghkkj",
+"jmlmgbdihnljjfdmffhkkikmkkjmmmjjijjkijmllmiijmjiigfefffeiiihfdfkklgffgmffimkdfkhiffikkjlkbbkmfekfgffimmimjkkjmm",
+"jijfgdkmlmiimmkimkijjhhjddfkjkhgeijkkjmmmjkjmmifjkhffhfdjkhikjkkfjimmkjdfhmmeekhmihmlmkjibbikcbgjmifimkdmjjjmll",
+"icedmkmjngdfjlmdlhdhkgfkjhffeb##ekmmkigecdimlmgdikifijkemgcdmljddhfllggcgdikedfdmfdkmkffmkikjkihnjghkidbddcddef",
+"abmhk#cdedjk##fhibadgghkecbddddebekkifdbddeffgggddeeijidcddddeddddbiibcbkddfdddbd##djjiifiebcif#jb#ekecddccddee",
+"bddddccgkmfffdifikkffikidddegihfidhlkbcmfdfdafk#dddfjfdkcdedbfmjkifegkkgcbbcdffggfgfddd#bcddfgdafgikjjiddfikkii",
+"mmkhjkhjjmfikfkejjifgkidjjjifefgfhjmiccfggkfbhjbjkhkmifjddggdijgjkkkkjmmffffgggfhddedhkkfddfhgdbfkjgfkkedfkkkii",
+"nlkilmhfllimlmmfkiffjljfjmmkffimcimmifddfimkejmfjkefidbfmjmmikibkkkkjmmlkjmmjkkijgfkjkjllifkmifedkjfekmkdhjjkik",
+"kjggmmdbjmhmmkmikihkmmkfkjjkgfhkbfjmkhffdgihimlimjffkgdilkjmjmkdgddgkjkkikkkigfgiffmnjimlhfmmgeifikigikkhikjmjj",
+"difdkkgfdgdfecigkkkkkfddmmjkifdcddfkiddkdfddimkfhfccffdifbcfhjmffbbdkkfdedddbbbcbbbglkflecdkiddimgfkkdbckhgijmk",
+"dkfcekjmcfdfdbfgeefihfdfkkkkjkfdfddifbbffidcfhddbb##ddcdfaaccdecgcbfkiedhfdcccccddaafdcjcbdhhefkgcbfidbchfefiig",
+"djhdfkkjfjikidifeddhkiiidfgikkkkffggeddedjfcfedkiiddkjikmedfdbbakefjmhffkfefkjkhimd#fdbgfddfkmmmbcdcdghffghgfde",
+"dmjimlkfkmkmjfhdlkfkmkfddfihfegkdkmhfkkfbjidfdfnjjfejmihliimiffdkijlmffkeddhlnlmflhcjkdkkfcdknljdmmbbikdfkmkddd",
+"dijjmljdfkmlkefkmnlfdikfmihjlmkidijkhikjccjfgnjmfkidhlmdmfdgfdflchmmgefikhfikjmlfkmmmllmihfffgikfffcbdffkfdffdd",
+"kjjjmmjikkjmkffilljgklmgmkfggfhkkmmkikjmkhlkhmfkjmkgkllklgekmkjndkllmiffljkkkkmlkjmlllmmkkjjjmmlkifdfkkkljihhgi",
+"kfdfffgkjkikkhffjifgkkkhjigfddfkikiedgihgdkhfgdkmkgffhikjddimkijehjmjifelmjidccekhimjgfhegiihfgikigfkmmkmjjjked",
+"dbbcdcdkkihihfefddikebdkighkiffgddcbdffddcdffdejmfdddbcfkdcfgddffdddfffh.#bdfgjlkedkidbddfgfdbcdfhgfhkkiiihfdcb",
+"gddfgdfjgghifddhhimlkdfmifdgkkhhfffegkieigfjjfijmgdffdekkgfhgefkhdbdfffighkjidccjeejmfeijjjiffhkeijifgkkkkfcbdh",
+"mjjjkggiffikgdfinjkmlmkkmfcdgkkjjmjkjmkfgidjljljkffijkjmjkkjkijljffkmkffabdkmmjmidekmmmljkkikjmlfmlmiijmijmkhff",
+"mlljhgfeffgkkihiljikmmjhlkffgijmmmmkkjkidgbimmlefedhjmjkjkkmmmmmmhhmmkffgefkjiddhffimlmmgedfijjkhjmjkjmlejlljid",
+"kllifgheiffkmmkikjjkiikjmjmmjkjmjmjiijmmimdhmkj#fffgjmidljjmllkhjfdhkffkkfdhkkfdjjkijlmkhedfkmkffiihijmmgkkfekl",
+"hghhdbdkmmgmjdhfjmmjfdfmfc#mihbijjfegjmjjjiigfijdc#ffmfikhfkmmkfecbdffgifjhhmhdmkffddkjdljgdddddikfccffddimkffi",
+"ddehfcbbkfaekffbdfkkfdgmffcidkdeeeccfjjieeeffffidfdkcedkcbbbbba#ighkifddcdbada#ckfgfdijfdddddcb#dedddefdbdfdcdf",
+"gffkkgdcgkgjkdmmkmlnmiklfmkhdlmfjjihijieefhihhhhkjfkcddiiifddcddiijmkgfiikikmidfkghfdfkfhhikkiedfffihfgkeffddeg",
+"lmkikkjmejijgdmljjmmjhfifmjfflljlnllljhdijjjikiilkbediddmjkigfffikjmkgkldfimnmifmgffdfgdkkihhgffjiijkfhmkkkhikj",
+"jkifehmlljcfmmlgjffijjkkffgegimmjllllljeijjgfhigjf#dciddmkghkjiehkmmidfkbbdikkielhfiijjfkkkihgfgkfehhefjfiikjlm",
+"eghfegkkkkdfkkmflkgkmmkiidffkdhjjlljjjheeiieeikiiididigmkgegjmkfcdkmkffijkjkfjlmmfgjmlljgkjmkiffdddeghikdfikmll",
+"fhhfgkie#fddcbfdkfeffdbbgdidkdijijjighgedijffkkgkidkdifmfdcdegffbcdgfehjkimkcfmkgdfkggkkbdffeddddddfkmjffhkikmm",
+"jkfdfkhdhmhkmmnkefikidddbbfbgckibcccehjjcijffhfckd.ccicbkihfgkjmkfdbbbfmddjkbdidbbdfb#bdiiigfgkmcdefjlkbhkkfdfg",
+"kkejfkfjjjjkkkifhkjmmmkfikkfdgihjjjjjjiiflnjddijkjffjmkmkmjlbffkkfdlnfjlmkijmjkkmmjjlljfjddkjffjfimdmmmbighkkki",
+"ijilkmjljmmmmmmjnlmjjkfdfhgddgihjjlljjjihjmhddgillmjlmikjkmkdchgifdmmdklmigkjkiiijmjmmmkmfekjkikdijfmllfjkfffgk",
+"dhflimklfikkhfgimkfhkmmmkkigikkillllljjijjjhfgikkmmmllkkjflgkcjhjkfljciliedfhgfffkmjkjmmmkghjmkgdkihfmkfmjkhgik",
+"ddbgdhdimmlljhijljffhhgfmjkikjkijjjjjieegijihhkkgkiijkfkfdkfgdkgjjhmkbekdbbdeedddfhffikikkfdhmkdbgdfagdffikkihf",
+"hdadcfcdddddb##bifeghfefffefffffeeeffecbacfheddgjmhdedcedddibfdddedjiadddbbdffffdddddgfdffdcejkd#cbdagfjcfhfefe",
+"mkdkfjefkikmkffkbbdikiimdddffffiihhijiec#begdbdfkjgdeddhffdmckdcbcbkjdhhfddfiiiihfeeijiddfddekkfdfdgdfgmdikfdij",
+"kjhlkmhjjggjkfeiffklkddhfhkjkfimjjjjljiefegigddhdkkijigkifgjijkdddcjlkmmjhfikkiifhiikmkghiihhikklkjikdfgfjmkimn",
+"cginikfmlkkmmgehddjlmfiljmllkefjhfgjjjfdljgiiffhfmlllkdedbfemimegfcklkmjmkgikiffbdfffggfmmmmkikmlhjfmcffbimmmll",
+"kjmjfddimifijkfdljfdeghgbimkfgkilieeeffgfmjdfifdjlljedhjadfdfjmijmjfdimlllljeikcigmhmgkdmmmmmkffimnfdmkhhffgkjj",
+"kedfkidbgeeikfdbiheddhiffkjkfhkjfccfjkgddkkimlidjmmkffhkfdb#bhfbgihddfkmjfijigfbhfkfmdfddfkmidddmikdcecfdfikkii",
+"cdfkkhfiddeihdbbbddbbfdagfddddfihdcfkic#cddhlmfdhgffgffeed#.#dfdhhfddfggmccifdcbfdkfkddbddikiddfmddbbcbf#dgifdc",
+"bdimjijlddgkgdcdhmmhimkbgcbccbbeliddedbbefdfjidgfffhhfdddhgc#bfkkigfffedmddecbddddkfmdfdggikkffimddddfdibdffdcb",
+"kdbfmmjiiikkiffkimmkkmkcjfdghddfkiggffimhjjmlkilhgijkfddklljdcdfkkikkihfkkmidfidddmimgkhmkikkiikkgkefmiikkhfhik",
+"mhdfikkkmjkkigkmefggikfdmkkjkifffijmkijldjlllmjlhfhjkdcdjkkkkkfdjjmlllmldknlijmfddmklimkmmkmmkkmkkmhhmgfljihkml",
+"gfggedimmkiigfkmkhgkmkihkjkhfffdfhkjiffidjmkjjiiiddkjfdddddeikkhiijmmkjlefjmiikfddmklimkikmmkhkmifjkiidhmjkigik",
+"da#bfkihkhffffgkhcbdebbbgjkdcddcdddddddfilkdeigflfdjlmigcdddccfjdddfdbbdjdcfdbdfddmkmgkiadmmfddmhbfkkfcmjmljfdc",
+"dgiffigddedbbdffdbadiiddebdkkddhdfifffdbidgfffciiffjlmifimdffglbfcbefdcd#cdb#bbbfkfigdgdadbadbaiddcbbbdfkgedffe",
+"jlmigihdikkgfiifecdhmmigkgfkiddegkjkffginkmigkhlkfegkkikigcigdmdkfdgiffheikkifdahha###fgdhdbihdkkkkighklgfffedd",
+"ikiddikgjmjkmmjhmkkmmjgfkkkkikkkkjjkfdilmijfdddkmkhiigijidcjkdkklkgiiffkmkgegkkidkklmgidkkffmlkkgikifgkjikjmmmm",
+"kmkfhmnljkkkmlmklmjkkhfdimmkkmmkmkkkfeklhekfddbdjjmmjhfiidfmifjmnmkjkffikhdcdhjmhmkmmfkgmkiimlmkfikgfffghikhffg",
+"kkiddijkjigimmmjhfdddfiiimmkikidmigiiikjmklkijegkjmmiddffekkehjkmkijkfeidfhifdddfkfigdhdgikhfkkggjmkikjkmmkebbb",
+"dfdbbfihifdfffffgecbcfffdfiffhfcffddfkhdmffbdkfikhffdbdffdkfchggcbdffddfbcddcbcddkgkkdgddfkfbdhdbdfddfhfjkifdde",
+"ijjhimlmfddffddfkhdcdgfbbcddfggfcffddkidfba.aheffeeffdfigaffdfdidbcffddkfcaabcgmkkbbaahiffkfadidbddbbcdccbbcdff",
+"kjkfdffdffimmkkjgfddimkdfddffeefdmmffmlhhccbflkideimlmkkk.difebmmkkjkhklmgdfiiikdkkmmfhdkhkfadkbmllifikffffijji"
+};
diff --git a/data/pixmaps/misc/bg-paper-cream.xpm b/data/pixmaps/misc/bg-paper-cream.xpm
new file mode 100644
index 0000000..6416b67
--- /dev/null
+++ b/data/pixmaps/misc/bg-paper-cream.xpm
@@ -0,0 +1,129 @@
+/* XPM */
+static char * bg_paper_white_xpm[] = {
+"111 112 14 1",
+" c None",
+". c #DEDCCA",
+"+ c #D7D5BF",
+"@ c #E1DFCF",
+"# c #E8E7DA",
+"$ c #D1CEB5",
+"% c #DCD9C6",
+"& c #E3E1D1",
+"* c #E4E2D3",
+"= c #D5D2BB",
+"- c #EAE9DD",
+"; c #EBEADF",
+"> c #F0EFE6",
+", c #CAC7AA",
+"..+..+@.+#..+.$%..@&*&@@...**.+$..+%.+.+%&%$+=$..$..=+.$@-;@%...&=$+@#*=..@*@..@++.*@==.=.@.+.@.+...%%%%.*%@.+#",
+"##.&*.&..;@&.#&;-##-;-&.$%##.+.>**%.@..+.#.%@..#@.*-@*-&.#;*@*-##..@@#*%@...%+%@.+.@@..*$+...*#;........@;**+$&",
+"-#.*#@*.*;&#*>#>>;-;>>*.@&**..*>>>*--*-.@*@.**@;&@##@*;-*;>-**#&#&#-*#;#;-##*&#;#..@&@@#.@*#*@*;@...@&&&#;&.++*",
+"##.#;*-&*>*;#;.*;--;>>-@>-****#;>>->-*-&@*&@&@@***#*..**->>;**@.@@#;*#>;.&#--#*#;#*#*@@*;##;#..*;*@*-;;;;*%.*;>",
+"##.#;*-&->@#&#%@**##-##*.@##*@#>@-*-@+&@@@&*&&&.#-#&@@@#@-;*@&@.++@*@&#*.&###*@.*###@..&*@@##@@*;&.&;;;;;@..->;",
+"@*.**.@.*#+.+.+*.........%.*#***%*@*.+@@.+.&.@@..&.%@@.*.@&.+%+$==..%...#-#@@@@.+.**...@...&*@.@@+$+...@..*@..+",
+".@.*@+.%+.+.%.+#..++%..%@.%@-#.+.*.&@%&..=.&..@=%.+=@@.@.*@%+%+$$=.@%.@..@.%%..++.@@.....@*&&&@..$$+%++.%+*.%%,",
+".*@;#.*&$..;##.#-&..*-#*+.#;*..*&*%.@.@%*%&-@@@=@#..;;&#@##&*-;#$+*#.@-;.@**#-*.&*&@@@...*#*#;;@*..@*@@#@+@.*;+",
+";#*;>-.%**#;-*@@#-##;>;#@*#-----.*---***&-.#.;*#>#*;;**>;--;-*@&-#------#@#>;-;#;*@&***&.*#;;;#*;@.#;#**%%*..-@",
+"#**##&@*>-####;>--##-;-*@.*-;#*#*-----;>*;@#.#@&>*@--@@;;##;-**#*#;;;;;;&.*>---#>;;##**#@*#;;;##;--;;-#-..-@&>#",
+"**-#*.&-#@.@&*#>##*&*#*@@%.#;*@*;---*@&*.*@*@;##;*@##@.*#**####-@*-;;--;#&->>;>;;;;#*&#;#;;;;*..*-;#&***@#>@@>#",
+".*;;#@@&%%.@*@.@&@...*&.*++*-@.*--*@.......@.*&@#@@**@......@@*#.@@*####@%.*..*@.@&@@&**####*.+=.&@++.@..*-++;#",
+".@****&@..@#-*@@@@...**@;%+@*.@-@.@**--*@@@%++=$@..@&@.+++++%..@*@..&##*#...+%@@.@@@*#&...@&*&@@*&.=+*#*+%@$=--",
+"#*@@*;;;#**##*#;**@.@-;#>@%.@.*;****--*&*&*..+.+@@@@#-*..@@.@***;*..*#-#>-##.@##;;;##;@+.@@*****#&%+.#;;@.*++*.",
+";;#@*;;;-*@@@&#;-#*@*;;->-&@@&#>>--&@..%@@#.#*;#@@@&->;@#;;##;-#>;-***#->*&*..**;>;#*#*.##***&@@#.%%.@*;-*;*@@+",
+"#--*@@@.*@.@&&#;;-*@*-;->>-*&*-;>>*@@...&@#.#&;#%...*;-.#;;####@;>>;*@*;>*#-*&##.##..@*&@@&&&**&*.....@;*.;>;#+",
+";;+.@@;.#*.%%.@*##*&..#>>>-@@##@**-;;*@@&#;#**&@#*..*&.#@@.+.-;#>;**###--#;;##;#;..@*##.#;#..#;@.&*@.+%.**-;#@@",
+".@+@@%@+.++=+%..@@@.%+%.@*&.%.@@*&&*&....@&.%++$&&..*@.*&.%+%.@.@..@*##;#@@.=+.%#....&@+.*&.%@**-#****-;>-@@.%+",
+"%..;;..%&@.@&*@.%.***@@@.*#.+%@##&@@..%.-#@+=+....%.&.%.&.++%++%@..*#***;*&@%.#-#.@&.@*.*##&.+.@@.++.@*#>&+=+%%",
+"&&#>>*@&--;;;#**.*;;;-##*-;*..&;;#***@..;-*..&-;&#*->;*-&%+....@*&*--*..*.@@.@;;*@##@&-#;---&%%@*@..@*;>;@++...",
+";&*;;-*#.@#-*..@-;;#**@.####@@&#>-#;;#@@.@&&*##&&#*;>;*-#@.*#@@#..@#-#*#@@#-@@*@..##.@-;#@@#-&@#;;>;##;>>-*##*@",
+";*#*#>#-@@*#*.@;;>;*&**.*@*##**#-**#-*@.#*&.@#-#.@@*;*.@;#***@&*..&-;--;@@;>;--*[email protected];;**-;#*##;>;*@*###->>;#",
+"#*>@&>#-#..&*@*;*-#@@##@@@*-#@@&@.%.@@..;-&.@#;-&#*#>-@*##*.....&&#--##;.%@*.@&.@@##..**;;-#*@@&;;;;#*##...&#**",
+".@>@.;&*&=,$+++..@.+=++$..&#&%+%.+$+....=%@#-#.$%.%.*.+%.&@+=%.+...&*&#;-**&%%.%..&@==%%.&*@..@&*@...@@..+$++++",
+"**&@&@@@#-@.&@.@+...@*##%#>>*.@**.+.-;#@-;>.#&#+.#&.@.=$..&##@.@-*@@@.@-*@;@>-;.*@&******..*#-;>%@.@+@@-..@&.+$",
+".@#-#&@.#;*@#*@*....*>>>@*--*&->#;>;*..@@*;.#@-@.&@.#-&@;-##*@@*>;-#@.*;>;>#>-;****-;;;;..@@...**#@;*>-;*******",
+"%@;;#***-;#&#*.@**&*;>>;#**##*->;##;;#@@*#>**.@@&-*&-;*#;####*#;>;;#@.*;;;>#;->-**#;;>>>.&##.++.#*.-#>*@***&@*-",
+"@*****#;;;@.@.%.#-;;;;*.*@*;#@*;*%+.-;*@-#-#*..@;>-*#*@*&*#;;##--#***#-;#-;###-#*#--;;;-#;>>#..*#*.#@;.%..@@@&*",
+"..%..@@@##.+...@@#-*@..%@@*#@.@;.......*@..*&&@*-;#@*@.&###-#@.@*@@&#;-##;;;##&@.&*&*##&##-;-*@&*#.-@-@@%....*-",
+"%++%..%=@@%+.@@-.@.+=+@*@&&.%.#>;*..&*#-..+..&..;;#&&.+.&...%+.@@@..@*@..*&-&;*@=%%+%.@.%++..%+=%..*.*.*@&.$$%@",
+"@..@&@.+@@.%@**-@**..@#;&##..*;;>*.@#-#*.#.@=@.%;;#**.+.@.....@#@**.%...%@%*.;*@+..++@&..++..%+++.%*.*..@*.$$+.",
+">>;#**#-@*..**.*;>>;;;-**;;@&;;@@*-*+,=.+#@@=#&*@**#;**>;;;>;##-#>>&%.*-;>@-.;..;>;*&;;#>;;>;-*#&#*>#;@..&*.@;>",
+">#@@**#;;--#*@&#-;>>#.@#@;@-#.@++@#;*....@+@+*++-##;>>>#@@*;;##-;;#&*-;#-@%..@*#####&@..;-#;;#@..+;#@;@@**.>->*",
+"#.%..@#;&#;#..@*-;>>-@*-&-@##.#....@##.+@*..+*.@&*****&@...@*&*-.&**#;;#>#@@@...@&***&&&###-;;#@++;;*;.+#*.;&-%",
+"@...@@*#+....**@*&@@.+++@*.@@.*@.++.&*.+.@..=.....@..%..+==+%%.@@@@....+@..@@.%%%........@&...%$%+&.%&@.-@+.%.=",
+".@*##*...%=$.;*+;#&&&...@@..%+%%+.@@...@.@@.+.++%......*%++%.%..-*.+++=$%+%.@.........%+%@&%++=,+=%+=.**#@+++%+",
+"@*****@.-#@.@#@+#@.*--##*&*@..%...*@.+..*##@..**&..&*@*#*&&#-#**-*@.@@&****#*@@&#****&@.@#-**##@$+@-**-..@*....",
+"-;#&&#;>-;>;**#;#@.@**@@##>;-;*-*@..**.+###.@@;;-**--**#-*#;>>--*&*-;;-;**#--##;-#*#--#*#-----#*@#->-#>&.*>;-.@",
+";;;*@#>>-**#*@#>;#*#-#&@#*>;->#>*@.@**@.*@*+*.*.*@*-#..#-*&#;-***@&-;#*#..@##*#;*@@&##*&-@@*#@..>>*#.@>;@*>*-@-",
+"@##&@@@.>@+.&.+.+=+.&&@&&.>*@-@;.@##@..@@.;.;.+,%.&-&%.->#&*#*@.#..@*#->@@*-#@.@*@.@*#&.#%+*;*@#@-@#@.>@;#;+@.>",
+"*.#..*+.$.*@+=%@*+..+.#...@.++.@$=+...@@...#;.==+=$.&%+@$%@*@.+=+=+##.*%=...@%+&@*#-#.+*,&*.&@.*+.*@.@.%,=+=+.@",
+".%#*#>*;....+=++.%..%.@..@&@...*+.@@....++......=$$.*..;.@**##&@=@[email protected]>.%..@@.%@+#*..*@.,%%+@@%@+......%.@*@..+",
+"#*;;;>#;;;#*##**.&@@*@@*@&**@@&**#;;*@@@*;;#*#;>@@.@#..;-*&*#;-#&;#*.&>.&@&**@.@=@.+.*@@+.%.#&.@-*@**&@&%..@*--",
+";;;---#-#*@@#;;;#>#*>;#>*######-##;;;##**;;&@#;*;;-;;..;;#*#;---;#@;&+**#&*--###@@.*-..>#*&-;*@*>;#;>;;>;[email protected]>",
+"@&@@**;;...@*->>;>@.>>#;####-;-#&@@*##*@.#*.@#@$.&*;>@.;##;>>#*#@.%-&+#-#.&;##;-;-#>;@@>-&*;#@*#;*@#;##;>;@+.#;",
+".@.@@.#*@&**&*;>*@%%*#@.@...@&@.&@@&##@.&##*#;@$%..#;.+@.@->;&.&.@.@..;.*+@-.@;*@;-@@@@-.+.@..*&&..@&@@&@@.++.@",
+"*;&-*%.+....%....%.@...+@.%%.....@*#*&&&@&@@&*.$@..**+,+..@--@.&-;&*..*+#%*-%%*.%..+@@.@+$+.+.#..@*@....--&%=$$",
+"*>#>;..$-#*&&&@@.%->@.*.;*..*#*@+.**@.@#;;#*@@.+&..@*+,+&..#;#*->*.;#+@@>.;;++@%@=$.>&.;.+%.+#;%%*#@..%=@*&.%.&",
+">;;;>>-@.>-%.;-*@###;-*#>;###@.@.;;.%%%.#-#@*;-*&*#*...@*-*.@;#%->**@%@...@&.@#@.@*#*@@#-*>#;*;.;.%*&@@.;-**#-;",
+"@*#-;;*..-*.#>;*&#*#;#@@;##;>;*@@;-&&@@#@.@@@..@#-;-**#-#####--#%@@##@-*;#-#@*-*;--;-##;;-;;&-;&>@&;-##***###&.",
+"+.@..**.;>-#>>&.&#**;#..@.@->;*@@***-*&;#@@*@+=%&**@..*#***#@+%*.*@##@-*@..@.*>>>#**&@&#;;&;+#*&>*->;#--.@*##*@",
+"%@.$$.*@;;##;*%.%@@@*@%....@*@.@@..&-@.#*@....%%...%++......+$+.*#...+@.;**@++..;@%+%%%.#*.*+...-@*-@.&*...@@&#",
+"*#&++@##....&.%&$...@..&***@+=.**@.&-@.&..+$%--.@@..%%..+..++@@..@+%%+@@-@**%+%.;@++%...@%@..+.+*.@.+=.....%++.",
+";;-**#-#.*&@@..#+@**#**;;>;*+=.>*#&*-*@#*#.$+;;.#*&@...@*;#%.#*%.#@##@#@+=.*..->;@..@@@@.=@.#.#@@...=+..+%.@...",
+">#*-;-#-*>;*#*@##;#*;;#;-;;#.%*>.#&.*#*-;>-..&*.#**&&&@@>>-@.@@%->;>>*-**.@*.+@-*@.@****@+@**@#*..@@..*.=.#;;-#",
+">*.@#**;.-#@-;##;-..##@@.@##@.#>=@.+.*#-***@...*##**##**;*&**&*;#;*-#&;-#.@#..->*@@#;--;*@.;.*@*..@#*#-@.*;>;-#",
+";#.>#>*#@.*-.*>#&**&*#-#.@@.%@*#.*;;##*@.@*##*@.#*@&@.@#;@.*#@%...+&#@---+.>>#;>-*@.@**@###*.%.-.##.%@&%@@*#--#",
+".@.&$++&%%.&.@###--#*&&&*#&%+%..$%@@@&**-*.%%%.....@@.@*@@*#.=+@+.+@*.@.;%.##*#-*@%+%.@@**&@@*##%.......%%..@@.",
+"@.+@.@.@*@%.;;*.*###*@@&%....#;>.&*@.@&*..%.@@.+.%.@*&**;@.@@....*.@@.&%;....@*@#@%+=+...%++@#*.#@.*&..@&@@*###",
+";#&-;;*@->*@>;.@..*#*&*-*###-;>>;>;#@&##.%.*;;#...@&****>&%.##@.->@..@;@#&&.%.*@#*..%%.**.%@;;-#-*&##*@***&*##-",
+"-;>;&+.**>>--@.;@@*##*#;##-;;;--*--#*-;>>;**-;-**&@.@@@.****@.@##>&@@&;@@*;#.@#**@@*##->#++#;@.#@&@@*;;*;-##-;;",
+"-*-@&.#;>;**;;#*;#*--**-..@#-#*&.*-##-;;;-#-;;*@-#*@@*@.-#**#-##@-*;;#-.@*;;..#*;**;>;#-*++*#%+&-;*@*;#.;---;>>",
+"*%..;#;->&.@->;.>*.*#&@#-*@@.+$$.#;;#*&.%.*;>;&.*#*@*-#.;&%.;>-..*@>>&&%&.*#..@.;@.#;#@@;#*#-#**>-&*#*.+..%...@",
+"=+;*#$%...-#$$@**+=.&&*#.%+.....+.##*@.+...@@&&&....*-*.%.........+**+%+#..@...+.$$.--**@*.+%*@$-+$.#.%..%%....",
+"+....%%&#;@@@.*@*##@@*#*....&**@*.*>#+%;@.@.=@#$...@-@.#%...+@;-#*@.&##&%++%.@@&&@&@...$+%..@&.=@&*#--*..@*##**",
+";;#*-#*--;@*#@#.--*@&#*.---*@.@&@*-;*%%@&&#@+*-+-#*#;*@-..&&.*-&-####-;;@@@@&&&@*....*##@..@*&.+@#-&@##..@###**",
+">>#*>;*@>>*;>;;@#*@@->-@-;;#@@*;%*;;*@..@*;#.-;@-#.@*.+@;-;;*#*+####-;;>#-;;-##*-&@#-#->>*@#;*@..#-@.#;#.*--#*#",
+"#-&&;;.+-;*;;#;*#**#;;#@#--#&@*#+@-;#*@@.&***;>*;-@@#&.*>#-;-;#.&..&#-##*###*&@&*@@;>-*;>*@;;&.*@*#*&*##**#-;--",
+".*@.##&@.&.@.%*&#####@..;;-#*@.%..@#*..#.@..*;#@*@%%@@.*@+%@*-;@@++.##@.....+++%+++&>#@>.%.#*..*;&@##.+%#*&*-;#",
+".#@%.#-;%@.@.+@&..@**@.@####-#@.@..*@++@@*.%@*..++$$..%.@==%%..%&%+@#*..*@.%%%%%..==@.%-%+.**.@#&%+@*.+%*@.@**&",
+".-*.@##-@-*#*.*@...*#***.@&*####@@&&.....-@%@..#**..#-*#;..@.++=#.@-;*@@#@.@#-#**;.$@.+&@..@#;;;+%.%.&*@@&*&@..",
+".;-*;>#@#;#;-@*.>#@#;#@..@**@.&#.#;*@##@+-*.@.@>[email protected];**>**;*@@.#*->;@@#...*>>>;@>*%-#.##@%.#>>-.;;++*#.@#;#...",
+".*--;>-.@#;>#.@#;>>@.*#@;**->;#*.*-#**#-%%-@&>-;@#*.*>;.;@.&@.@>%*;;&.@*#*@*#-;>@#;;;>>;**@@@&*#@@@%+.@@#@.@@..",
+"#---;;-*##-;#@@*>>-&#>;&;#@&&@*##;;#*#-;#*>#*;@#-;#&#>>#>&.#;#->.#>>;*@@>-####;>#-;>>>;;##---;;>#*@.@###>-***&*",
+"#@.@@@&#-#*##*@@-*@&###*-*&@..@#*#*..&**&.#*@&.#;#&@@**#-..*;#*-.*-;-*@.>;-*.%%.#**;-&@*.&***@&*#*&@#;;#;---#..",
+".++%.%.##****@.@..*#.+.#*&*#*@@&..%+.@@..%.@@..-;@...+%@#.%@&..@@...@@@*,$+.@&->#..#*.+..@&@.+%.@*&@*##****@.%+",
+"&..@&.@-&&**@..***;>#.@;*@.&##**@@@.&#*.*&@--@*-;&.@@..##&@*&.@#*.+.@@@*&*#-*.%%-..-;@.*---*@@*#.*-*@&####@%+.*",
+";---#&&*@@*#&.@*>-#;>;##;@%.&##--;-#-;#@&*.->->-#@@*-#-;-##-#*->-@@#;#@@=+.#;;-;*..#;;;>-##*#-;>@;>;**-;*-;#*@@",
+";>>-*&@.@@&##***>-*#;;-*>#@@&*-;;;;##-#*.&+*;;>.@..*-;-#-##;;;;;;**;;#@@&.@#-*..*@@*;>;;&..@*--#*-;-#-;>.->>-*.",
+"#>>*@&*.*@@#;;#*#--#**#-;-;;-#-;-;-**-;;*;.*;#-$@@@&-;*.>--;>>#*-@.*#@@##@.*##@.--#*->;#*..@#;#@@****-;;&##@.#>",
+"*&**.+.#;;&;-.*@-;;-@.@;@%$;**+*--@.&-;---**&@*-.%$@@;@*#*@#;;#@.%+.@@&*@-**;*.;#@@..#-.>-&.....*#@%%@@..*;#@@*",
+"...*@%++#@=.#@@+.@##@.&;@@%*.#....%%@--*...@@@@*.@.#%..#%+++++=$*&*#*@..%.+=.=$%#@&@.*-@.....%+$......@.+.@.%.@",
+"&@@##&.%&#&-#.;;#;>>;*#>@;#*.>;@--***-*..@******#-@#%..***@..%..**-;#&@**#*#;*.@#&*@.@#@***##*..@@@**@&#.@@...&",
+">;#*##-;.-*-&.;>--;;-*@*@;-@@>>->>>>>-*.*---*#**>#+..*..;-#*&@@@*#-;#&#>.@*;>;*@;&@@.@&.##***&@@-**-#@*;###**#-",
+"-#*@.*;>>-%@;;>&-@@*--##@@&.&*;;->>>>>-.*--&@**&-@$.%*..;#&*#-*.*#;;*.@#++.*##*.>*@**--@###**&@&#@.**.@-@**#->;",
+".&*@.&####.@##;@>#&#;;#**.@@#.*-->>---*..**..*#***.*.*&;#&.&-;#@%.#;#@@*-#-#@->;;@&-;>>-&#-;#*@@....&**#.@*#;>>",
+"@**@&#*.$@..%+@.#@.@@.++&.*.#.*-*--*&*&..*-@@##&#*.#.*@;@.%..&@@+%.&@.*-#*;#%@;#&.@#&&##+.@@.......@#;-@@*#*#;;",
+"-#@.@#*.*;*#;;>#.@*#*...++@+&%#*+%%%.*--%*-@@*@%#.,%%*%+#**@&#-;#@.+++@;..-#+.*.++.@+$+.***&@&#;%..@->#+*##@.@&",
+"##.-@#@----###*@*#-;;;#@*##@.&**------**@>>-..*-#-@@-;#;#;->+@@##@.>>@->;#*-;-##;;-->>-@-..#-@@-@*;.;;;+*&*###*",
+"*-*>#;->-;;;;;;->>;--#@.@*&..&**-->>---**-;*..&*>>;->;*#-#;#.%*&*@.;;.#>;*&#-#***-;-;;;#;@.#-#*#.*-@;>>@-#@@@&#",
+".*@>*;#>@*##*@&*;#@*#;;;##*&*##*>>>>>--*---*@&*##;;;>>##-@>&#%-*-#@>-%*>*..@*&@@@#;-#-;;;#&*-;#&.#**@;#@;-#*&*#",
+"..+&.*.*;;>>-**->-@@**&@;-#*#-#*-----*..&*-***##&#**-#@#@.#@&.#&--*;#+.#.++......@*@@*#*##@.*;#.+&.@=&.@@*##**@",
+"*.=.%@%.....+$$+*@.&*@.@@@.@@@@@...@@.%+=%@*...&-;*...%....*[email protected]*=...++.@@@@.....&@.@@.%.-#.$%+.=&@-%@*@.@.",
+";#.#@-.@#*#;#@@#++.*#**;...@@@@*****-*.%$+.&.+.@#-&....*@@.;%#.%+%+#-.**@..@*****@..*-*..@...##@.@.&.@&;.*#@.*-",
+"#-*>#;*--&&-#@.*@@#>#..*@*#-#@*;---->-*.@.&*&..*.##*-*&#*@&-*-#...%->#;;-*@*##**@***#;#&******##>#-*#.@&@-;#*;>",
+"%&*>*#@;>##;;&.*..->;@*>-;>>#.@-*@&---@.>-&**@@*@;>>>#...+@.;*;.&@%#>#;-;#&*#*@@+.@@@&&@;;;;#*#;>*-@;%@@+*;;;>>",
+"#-;-@..*;*@*-#@.>-@..&*&+*;#@&#*>*...@@&@;-.@*@.->>-..*-=.@.@-;*-;-@.*;>>>>-.*#%*&;*;&#.;;;;;#@@*;>@.;#**@@&#--",
+"#..@#*.+&..*#@.+**...**@@#-#@*#-@%%@-#&..##*;>*.-;;#@@*#@.+$+*@+&**..@#;-@*-*&@+*@#@;.@..@#;*...;*#.%.%@.@*##**",
+"%.@##*@*...**.+++..++@.=&@....@**.%@#*%$%..*>;@.*&@@&@@...$,$.@.**@..@&&;%%*@.%+@.#@#..+..*#*..@;..++%+@$.&*@.%",
+"+.*;-*->..&#&.%.*;;**;#+&%+%%++.>*....++.@.@-*.&@@@**@...*&%$+@##*&@@@..;...%+....#@;.@.&&*##@@*;....@.*+.@@.%+",
+"#.+@;;-***##*@@#*;;##;#%-@.&*..@#*&&@@*;*--;>#*>*&*-#@..#>>-.%.@##*##**@##;*.@*...;*;&#*;#*##**##&#.@;**##*@**#",
+";*.@*###;-##*&#;.@&&*#@.;##-#*@@@*-;#*->.->>>;->*@*-#.%.-#####@.--;>>>;>.#>>*-;@..;#>*;#;;#;;##;##;**;&@>-**#;>",
+"&@&&..*;;#**&@#;#*&#;#**#-#*@@@.@*#-*@@*.-;#--***..#-@......*##***-;;#->.@-;**#@..;#>*;#*#;;#*#;*@-#**.*;-#*&*#",
+".=$+@#**#*@@@@&#*%+..+++&-#.%..%.......@*>#..*&@>@.->;*&%...%%@-...@.++.-.%@.+.@..;#;&#*=.;;@..;*+@##@%;-;>-@.%",
+".&*@@*&....++.@@.+=.**...+.##..*.@*@@@.+*.&@@@%**@@->;*@*;.@@&>+@%+.@.%.$%.+$+++@#@*&.&.=.+=.+=*..%+++.@#&..@@.",
+"->;*&**.*##&@**@.%.*;;*&#&@#*...&#-#@@&*>#;*&#*>#@.&##*#*&%*&.;.#@.&*@@*.*##*@.=**=$$$@&.*.+**.####*&*#>&@@@...",
+"*#*..*#&-;-#;;-*;##;;-&@####*####--#@.*>;*-@...#;#***&*-*.%-#.##>#&**@@#;#&.&##*.##>;&*.##@@;>##&*#*@&#-*#-;;;;",
+"#;#@*;>>-###;>;#>;-##*@.*;;##;;#;###@.#>*.#@..+.--;;-*@**.@;*@-;>;#-#@@*#*.%.*-;*;#;;@#&;#**;>;#@*#&@@@&**#*@@&",
+"##*..*-#-*&*;;;-*@...@***;;#*#*.;*&***#-;#>#*-.&#-;;*..@@.##.*-#;#*-#@.*.@**@...@#@*&.*.&*#*@##&&-;#*#-#;;#.+++",
+".@.++@***@.@@@@@&.%+%@@@.@*@@*@%@@..@#*.;@@+.#@*#*@@.+.@@.#@%*&&%+.@@..@+%..%+%..#&##.&..@#@+.*.+.@..@*@-#*@...",
+"*--**;>;@..@@..@#*.%.&@++%..@&&@%@@..#*.@+=,=*.@@..@@.@*&=@@.@.*.+%@@..#@%==+%&;##++==**@@#@=.*.+..++%.%%++%.@@",
+"#-#@.@@.@@*;;##-&@..*;#.@..@@..@.;;@@;>**%%+@>#*..*;>;###,.*@.+;;##-#*#>;&.@***#.##;;@*.#*#@=.#+;>>*@*#@@@@*--*"};
diff --git a/data/pixmaps/misc/bg-paper-grey.xpm b/data/pixmaps/misc/bg-paper-grey.xpm
new file mode 100644
index 0000000..c0fc3cc
--- /dev/null
+++ b/data/pixmaps/misc/bg-paper-grey.xpm
@@ -0,0 +1,118 @@
+/* XPM */
+static char * bg_paper_grey_xpm[] = {
+"100 100 15 1",
+" c None",
+". c #D3D3D3",
+"+ c #CDCDCD",
+"@ c #CBCBCB",
+"# c #C8C8C8",
+"$ c #CACACA",
+"% c #CECECE",
+"& c #C6C6C6",
+"* c #D0D0D0",
+"= c #D1D1D1",
+"- c #C4C4C4",
+"; c #D4D4D4",
+"> c #D6D6D6",
+", c #D8D8D8",
+"' c #DCDCDC",
+".++@#$+%%@$@@#&#@%+@$$$$$*+$$$+++%$*@=#+@-@+##++&#$$#$+%%$@$$$$$$@%@&#$#@#+%%+++%=+@###@+#%=@#@++..+",
+"+&$@@@@#&$$@@$#$+%*+$#@+@+$$$$$#&+#%@=@%%&+%$$%%##@@#$++@+@######%=+&$$$@&##@@++@%+@###@@#$$##$@$==$",
+"$@%*%%+@&@@+%+@+%%.=@#+%+#$$$+%%+*+%+%#@@#+%@@%=+@++@@@@$%+$##$$#@%$-&#&####@+%@#@####+==+$#@%+++%@&",
+"%..=%+%*%%%*=*+%=+;;+$%=+$$+%****=**%=+%%@%%++%======%%+@*%%+@@@@%.=+**+%=%%%%%++@@@@+=;>=%%;;=%==+$",
+"%==%@$+%%%%===++%#.;%+=%$%*%++$$+%%%.;;>,%==%%%=;;;;;.=*%+%==%@@+@===;.%%=%%%+@%===%%+%%%+%=>;+@+;.%",
+"#@++@@+@#++%=%$#@&%.*%*+#++++$$+%+%+==;=;%%%%@$+==%%*%+++#+*=+@$@-$@@*%@@###@@#%;=%%+++++@%.;=@##%=+",
+"#$+%%%%@#$@+%+##$&$%%%%@&&$$%%*=.%%@=@+#@%%%%$&#%@##@@#$@&#$+++@$&+%+==++#&#@+@+=@@+++%%%@*..=%+#$+#",
+"=+%*%%%@##$+%+$#$&&$+%+$#-&+%%***%%@=@%#@.===+#$*@##@@@@%#&&#+%+#&+@$+%@@=@@==%+%%%%%%++%+==*==%#+=#",
+"=@+*..=%+@@+%**@&&&$%%@@%++$##+%%%@#@++%%@+**+%*@%%=;=$#@&#++@@@$$@##@@#@#==%+@@=@#@==@#%*%+%=;.=++$",
+";=;;>;.==%%%*.;.=%+%=.=%%+%%+%====%%=.;;,%%=*+%=+%*.;.*%=%==%+@@#@%%=>;=.@====%%;=+%=.%++$@++++$#&$%",
+".%%=%%+%*.*+++%%%=+@*;.%@@%%%*=.=$@%;>;====.=%=.*%=;;.;;.%==+@+++#+%%.=@$@*%%*%+*+@@%=;=%%=;;=%+@&%;",
+"%$$###@++*+###$@@+$#+==%##@+++%=*#$+==%$#%@+$&#+$%.;=*==%+%+$$+**+=%%=%##+%@@%%$@#$$$%..%+%==%+#&#%;",
+"@*%@$+==%$##@++%=@@@@%%%@&$@##@%%=%%%+@@%%@+#&#+$@%=+@%%@==%@$@+@%%@$%%+%**@@*%$#@%%@$%%@##&#@@#&&$+",
+"$%%+@+=%##&#+%++*+%+@@++@$++@$+%*@+%*%@$@=%%+#+=%#@+++%%+==%$#$$#%%#&#$$+*%$$=*$##++$#@+@@#&#+%+@@@$",
+"$@*=%+%+#+$@%%@@%%%+$@%%%%=.=%%==#$%=%@#$%@+@&$%+@@+=====%%@$$@@#=.%+*%%=%%@@==++##$@+%%%####@+@@===",
+"+%>',;;;==%=;>;;,==%@%.;.=;,;====>.%@$@=,.=.=+=;.=%%;>.=;==*%+%@#$++%..=.==%%>>..=%+%==%%+%==*%%*=;,",
+"%@$%=%%=%;=**%+@@.@&&+*%++=;*$#@%$#&=@%@;*@%=%=>,==%@@%*%$+%%%=%$+%#%&$#*+%%++++++*=+@$#&.%=%;%%$==%",
+"*@#+%@+%+====+&&&%+$$+%$&@#&#+==%%+#*@%$%=%%=@$%%#$@@+%%+&#$@%=+#&#&@&$#++++$####==%%*==++@%#+&$#+++",
+"+$#@%@+*%++%+#-&#@++@@+$-#@@##@%%+@&++=%%%$+%$#+@#@@@@+@#&##@%*+###&@#$&$++@##&&&=%@@=;;*@+=$@&+%+++",
+"###%=%=.=@$####+=+%+#@%+#+.;=$#+%$@$@+==%#&$+@+%+%+@##@@$$@+++@$#@$#@@@$@+@$$###$@#&&@==+@+=@%#=.=*%",
+"%@@=;===%%@$+%==.%%+@%=%#*=====*+%*=+%%%+$#@%+%=%@@@$@%=%+%%%@#$@@###@@%%=%+%+@@%@@$#$+%%+@*$%$%%.=*",
+">%%.;=%%$=%*;>;%+%%%=.=@&#+=*%+@$**;*=%==##@%%=;=%*==.;=%%%==%+%==+%$%#+%>..;.*%=.;;==.;>.*=+=+*+%%=",
+";%%=.%++$%++==%@#%@@==+##&+=%@$@+=@=%>%=.##@++=;*%=====%@%++=.===.%.+*#+%;==;;%%==;;==.;;;=.+=+==%+=",
+"$%+*=++*+#&&###$++##%%##%%+$+;'>*;@%%>@%+%++@#++&###&#@@$@&&%.=+$#&%$=#==#&#+%##@&##&#$+@%@+&@#%==%+",
+"##$$@+%%@$#-&@*%@%#%$@=%;;%@#+====%;%;+;;$@@#&&&@%%+##@@$##@%+$#@$%.==%+@@@@@%%==#$@##@%==;#@%#%%++*",
+"#%@#@*=%+$#&&$%+$%$%@@*@*===%@@=;%+==;+=%%+++++%%===%+%+$*%++@##@&@%%%===%%+++%%%@@@$##@%;;##+#=;@+=",
+"@;====++%+%%%=;;;%+=%%=+%=;;=%+=;=%==>=====%*=.==;>>;..=%%%%*===;%==%%=...========%%===.,.;%*.%%*$%;",
+"==.>,*#+;#@%%%*==%%==.;..;=%%===%=%%=;=;;.======+.;;.=.==$+=;;;>,.;.*%=========.;.%%.;;>';>.;>*++@%;",
+"*$@%=%@%;@%*+$$@@+%+%==.===+%=;==+@@%==++%**%+%+@+%%@$@++$+%*%%%++++@+%%%@++++%%=%@$++@@%,;%$++$=*%+",
+"&$#&#++@#@%=%++%%@@&#$#+$+%==++=;@@@=%%##$++$$++@$+@#&&$$+%+$##$#++@$$@@#$@+@$$@+@$$$$$@+%@$&$@&%=+&",
+"&$++@+%@&#@+@$@%%@+-#$&@&+%=%++%=+%+;+=+=+%+$@**@$+%@#$+++%%$#@+@==%@@+@#+%%%@@+%$%%+@%==&&+@*%-#%+&",
+"*-%;=%=;=;>;=%%%%%=&+%$%#=%@@%==%%=#=#=;'.=%$%.=$&@%+@+%*@*=%+@$&%%+$@%*%+%*%+@%*@.;+#+%@%$%@%=&%#@#",
+"=,=+%;>.%+;==;=@==*%=;;=%,>;===%%===@#=>>;>,=%.;%,.%+%=;>;>;@@*+.>===%.;%%+@$@=;+'%+=%%=+;*+%=%*.'>;",
+"#==*=;>;;=.==.=%==%%%==*+;=%%====;;======>,,=+==#*%++@@%%>%*%*$-=.=*%%=.%;@+=*+%='..;%%.%;=*====.=%+",
+"###@+@@++=%%%+%%+%%++%%%++@##+%%%+##@+@#&%%=%@==#$+%+@#$@%#@+=%&=%%%++%*%>%=;=+%%;=.=@%=%$+%++%%%.=*",
+"$@+%%@###@&@+&#@&+@@@@@@$@@###@@++##%%@#+##$##==##@+@#$$$#@%#%;++@%+$$@@@%%=+$=*&@+%$#+%+-#@#&##&#$%",
+"#***%+$&-#&%*&&@#@@@@$#$@%%%+@@+%=@+=%@%,*%+#&%=#@@#&&@+@%=.$%;@$@=%#@@#$#$@&#%%-$%+#@%+@#+%@#@@#&#%",
+"+%%++%+#&+%..+@%=%*==%%%*%%%%@@%=%@@+@#%,.=*@#=;%*%$&#%*%=%*%==#=+;%$*%#+%#$%%%%$=;=%==+%%**%%%%%%%=",
+";*===.==*=.=%===;%=..=*===%+@+%%%%%%%%+=,%==++;';==%$$%=%$#%+==+;@.+$..+=.==;%%=%;,;=;*@==%+%**==$$%",
+",$@+%%%%%=.$&%*+=#+**+@+%;=++%=%@##@+%%=;%*=%+;';%==@#@+$-+=#@;%%&*##;;%.%>,*&%=#*;.=;@#..+@%==.>%+%",
+"%=&$.=#$+%@@@#$+@&#@@@%*%=##=...*@$@%+#$+%+@+*==%+$+=%#@.$&++%.%=*=%%=%@%=%+@+%%@$+-@#+#=#=.+%%%*#$+",
+"==$+=@&#+%@+@#@%%#@@#&#+%%#$%%%%@%*%%%==%@$#$++@$@@@@@$$@.%%@@%$+#@$@%+$+#$$#$@@##$##%$#%&%%#$@@+++@",
+"=#&$@&&%=%@++#@==%=%$&#+%%+++$+%#@%%+%;>.%++%**+@+++@%;.+=+%@@%$+%=*%=+&&&@++%%%@##%#;@+%&+$&#@$$=%+",
+"%##@@#+.=.%%%+%.====%+%=%%*=%$%=@+%=**=..===.;;======;,;=+@===;%*#++%;;==#%.;...=@+*+;===$%+$%=%+==*",
+"@===*%=.%,===%==%+++%;>=++%=%$%=%==;,.$$*%%==..==;*=;;%%==%;..;%%$%++.;.=#%;;.===%.%==;*;+=%=;>=====",
+"@=+%%%==@;%++@++##&#+;>*&+@%+$+%@+@*,;##=@+%%==*%+#@.=@+.*@%@@%@%;>=+==$&#%==%%%%=>%=@=@%%===>;==;.*",
+"$+&#+@+%@@#@+##@#$##@=.+-=@%*+@+$#&$==%+=@++%%%%%&&$%=%%.$&#&&+$++=%+=;%$+%=%++++%;%++%@+*=%%==+*>=@",
+"#*$@%$#@@#$*=@@%%=%@@%*@&>%=;=+@$+++%==*+@@++@@++#+%++%+#@#+$@%#$@=%@==$-+%%@#$$#+%=#=+%+==%@+@$%=+#",
+"@%=+$*+&@%++%+@$@=%%=.%+@=+##@@+%=%+@@+%*@+%%%=%@#%=+@%.===;%@%$$$;=&&@#&$+%=%++%@@@+=.*$=@@=.%%.%%+",
+"%..*%=%@@@$$@+%%%+@%.;.==,.%%%%++$+=...=====%%=%+%%+@=>;%;=;%+=%=#.=@@+@$+%.;.=%%++%%%+@@.=======..=",
+"%+%.=##+=+@@@+%%%.====@#&=%+%=%%+==.=%%=;=.=%+%++#%=%%====+=%%=%.#====%+%@%.;>;===.;;%@+=@%*+%==%%%%",
+"%$&+%&#=%=*+@+%+$+@@@$#&&#&#@%%@@=.=+##@=**%%++++&%.=@@%=$&%==%#%@%%*.*+%@+==..=++=.%##$@$+%@@+%+++%",
+"++-&$$%=#%%+@@+@#@@$###$$+$$@+$#&&#++$#$++%%*%%%*++++%=%@@&%%%%#%%+#@=%@++%%+@@$&@;;@#%*@%%%%+##+#$@",
+"#&#++##@+#@+$$++$==%@$@+%*+$@@$###$@$##+%$@+%%+%=$@++@$@@%$+##@$=%+##**@+#++#&#@$+;;+@.;%$#+%+#@=#$$",
+"$-%=%$&#=&+=+@%%@$+%%*;,,*@##@+%*.=+#&#%=+@+%+$@*#%.=#&$==+%&&%%.%=+@*=%=#%=@#@%%#@+@$@++-$%+@+=;==.",
+"=*=$@,,%++;>=%%+@*.;====*;*@@+%=;==*%%%%%==**+$+=.====*====;++;.;@==%===;=,,=$$++%+*;.+%,$;,*@*.==..",
+"%@#%%%=+%+@@%%+@+===*%++%+=+&@;.#%=%=>%@,===%$%=@.=*=;%#$@+%*%@@%.;;.=%%%%%%%===,;.==%%=>%%+@$$+==%+",
+"$$#%+@%@*$$+%%@+=$$$+%*%%%+$#+..%%%@%;+$;$@+@#+%$==%%=+$%$@@@@$##%%%%%%%%+==*=+@@%==%+%=;%@$%%@@*=%@",
+"%&&+#&##%@+%%$&$%$##@%%+#.+##+%==%+#@*$#%$@*%+=;%#$##+@+;@@@@$##&@$##$@@+$%%@$@$&&+%@#+%*=@$%*@#@=+$",
+";$#+##@#+@++@##@%@$$@%%+@;%$#@+%%=%+++#&+#$%%@%=+&@$#$#@=%==%@$@@+@@@+%%%+%%#-$+#&+%##%*+%+@+%+@@++@",
+"%=%=%*.+%@@@@@%==##$@+%=.==%@+==@=%==+#@%+%..%%=+%;.%+$#%%;;=@@%=*===;;;.;;;%&@%&*.=@+==+#%%@@=;.@+%",
+"#.%=%=;%%**%++%=%@@@@$@%=%==+%;;%%+=.%+==;;,,==.=%>>..=*.%.;%@+*=+%=.....==>>%=.$.;=++*%@%.;%+=;.+%*",
+"$%$+@+=+%*==+@+++=%%+@@@@%%%%*==*=$%.%*=@++==@$+@#*=%=;;>@*%$#+%%@%*%@$@++#=,%=;%%==%@###;.=.=%+%%%+",
+"%@#@#$%+=&@%@#@%==%++%*%@=@#+%@@%;$+=%=%-$$%*$#++&++#+%%=@+$&#%%@*==+&-&#%&+.$@=@@%.=@-&$=##;;+@=%@#",
+"=%@#&@*%@#-&%=+@%#++$&#@+=+$@++@$..$%%-$#%@+=+&#=#%=%%=%&.+##%*%+@+%+@$#&%@###&&#++%%%%+@%%%.;=%%@%=",
+"+@@$#@%%+&&$%@&#%#@%%%%+@@##@+@$#@+&@+#%@$#@%@&&@&%*@#@$-=@&&#+%%&$@@@@#&@$#&&&##@@$$$##&@+%=%@@@&$+",
+"@$@+@@+%%$+%%@@@+$+%%==%@+@+*=%++%=@+%%=@#@%%%++@$==+#@+$*+$#$+%*&#$+=..*@++#$%%+*%+++%%+@+%%@##@#$$",
+"@@++++%*%==+@*;=@+%+@+%%%==.;=%%==.=%%=*$#%===;.%@=.%%==%%===%%%+',;=%%$&@*=@+=;==%%%=;.=%+%%+@@++++",
+"$%%++%==+++#&@=%#+%=%@@++%%%*%@+*+%%$$%+$#%=%%=*@@%%+%*%@+=;=%%%+%+@$+=..$**$#%*+$$$+%%+@*+$+%%@@@@%",
+"+%%+@%=%+-$@#&#@@#%.=%@@$$#$@$#@%%+=$&$&$@%%+$@$#$@@$@+$&$%%@#@%%>;=@##$#+=*@###&$@@+@$#&%#&#++$#+$#",
+"*%%%@@+++&$+@##$+&@%%%+$####@@$@+=%;+##&*%*=+$#$@$@@######++##@%%%*%@$+==+%%+#&##%*=%+$$@+$#$@$#&*$&",
+"*+%%@##@+@$$@++@$#$##$@$#$#$++$##+#=+#@$,%%%%$#+=&$$#&&@+$%=+@%%@@%=+@@%=$$@+$&#@+*=%@#@%%++++$##%@@",
+"@##%#$=+%$##$%=%#%.,#++;+$$%*%$#$$$++%%+$=.,%%#%+@+%@##@%*.;=%%%+%$++#+=#@%%==@$=&$%=====+@%..%%==+#",
+";@%>*@%%;=%@@%=%#%%.+=@=***..%$$+***%%%%+=%=@.*=@.;;;;;>,+%+@+%==.=;>=>,.@%%%=+$%=====.;,=*===*%=;=%",
+".%@%$@=##@#&-#+@&%#@+=&#%$$+++$+**%++++++@$%@.==+++%==.==++$#@%%++@+@#+=%@%+%=%@%+++@@+*=%%%++%%@*%%",
+"#*$+$%=#&$$##$+%+%#$%%&&$&-&&&$+=+$$$+@++&@;*=+==#$@+%%%%+@$#@%@&=%+#-#+%#%%%=%%=@@+++%%%$++$@%+#@@@",
+"&&$.%##&%$%%+$$@@%%%*%+##$&&&&&$*+$$%%++%$%,=.+==#@%+@$+*+@##+=%@;;=+@@+*&+%++$$%@@@++%%%@%*++*%$%++",
+"@@@=%@@#%&@%@##@++=%%@=+$$&&$$$+**++**+@+++=+=+%#@%*%$#@%.=@#@%%+$@$@%$&##%%$#&&$%@$#@+%%===*%++@=%+",
+"*,%==.;%=@%*%%=;;%=+=@=+$+$$+%+%*=+$%%@@%@+=@=+%#%=.=*%%%;.=%%*+$@+#@.%#@%=%@%%@@;=%%*======%@#$%%+@",
+"=+#+@##-@*%+@+===;;%;%.@+;...*+$$.+$%%+%.@='..+.;@++%%@$#@%=;;;%#==$@;=+=;;=%;,;=+++%%%@#.=*%$&@;+@@",
+"$$$$@@@+%+@$###@%+@@%=%++$$$$$$++%&-$==+$@$%%$#@#@#$&;%%@@%=&-%$&#@+$#$@@##$$&&$%$==@$%%$%+#=###;+%+",
+"&$######$-&#$$@%=%+%==%++$$&&$$$++$#+==%+&&#$&#+@$@#@=.+%+%=##=@&#+%@$@+++$#$###@#%*@$@+@=+$%#&&%$@%",
+"&%+@@+%%+#@%+@###@@+%+@@+&&&&&$$+$$$+%%+@@###&&@@$%&%@.$+$@%&$.+&+*=%+%%%%@#$@$###@%+$#@%=@++%#@%#$@",
+"+##&&$++$&$%%++%%#$@+@$@+$$$$$+**%+$+++@@%@++$@%@%=@%%=@%$$+#@;*@=;;=**===%+%%+@+@@%=+#@=;%=%>%=%%+@",
+"=====;,,;+%*%+%*%%%*%%%%%***%%*.;>.%+*==%$#+=*=.*===+;%===*=$+>===;;=%%%%=====%%=%%=.*$@=,.;=>%%$.%+",
+"%@+@#@%%@;;=+@++#===%%%%+++++$+*.,;*%=;=%@$%=*==+%%=#.@=.;.;@$=++%==%+++++%**+$+==%==*@@%=%=%=%%#=+@",
+"$$%%$@%*+%%@&@==+%+@$@%+#$$$$&$+*%*%+%==+=@@+$+%@+%%$+$@===.$&@##$+%+@@++%+++@#@%++++++@@&@$+@=%%%$#",
+"#&@@##%*+==$&#%+&$#&&@*%$+%%$$$%=&$%++%%+%#&&&@=*=;%*#+#*%%.@&@#$#@%+@+%%;=%%%%%%####@+@#&+$%#.%%;+#",
+"+#+%+$@%=&$%=*%+%;+#@%%@+&+***%%%%#$=%+%=$&&$*=+$>=%=%$#+$#$%=+#&&&&$*+@.+%#+#%@=#####@%%+#-%=#@++%%",
+";%**+@%=;++*==++%%@$@%+@$%..%$@%==@@+#&+=$##@%%+@%=;,;+%;%++==%@#$%+$+%%;+%@%#=%==%@#+===#+@=.*.%=%+",
+"+==*++=;;;==;;%=>%%====%++=.%@+.,.==+&#%=+%%%%%%**=,',=%=++%==%%%#..+%=.;%=@%@==;==+@+==%#==;;.;%,=%",
+"&==%@%=.=+##++#@;%.;..;;*&+==*=;;*%=%$+=%%%%++%===+%.,;%@@+%%%%*=#==*.;====@%#=%=%%+@@%%+#====%=+;=%",
+"+++@@+%%@+##@@#@.$%=%+==%@+%%%%+#+$$#&@+&+%+$@%==@&&$=.=%@@+@@++%@@#+=%+===#+#%@+#@+@@++@@%@*%#++@@+",
+"@#$@@+%@#*%%%+@%=#@@$@+%%%+$#@+$&=$&&&#$&+%+$@=.=$@@@@@%=$$#&&&#&=@-&+$#%==#@&+#@##@##@@#@@#++#%%&$+",
+"##@++%%@#@+%@#@++@$@+%%%=%+@$+%%+=$#@$$+++==@$%=====*+@@+++$##@$&*%$#++@%==#@&+#@+@##@+@#+%$@++=+#$@",
+"+@+%%%%%@+.;=*;;;%$@=.==.=======%+&@=*+%%&%=$&#+%.===..%$===%=;;=$=.%=;=%==#@#%@+>=##%==#+;%@@%.#$#&",
+"==*=;;=%%=;>=++==*;=@@==+=%+%%%=;+=%%%%.++%%$&#+%+#=%%%&;%.;*%=.=,.=;,;;;%@%+%=%=>=;>=;>+==.;;;=%@%*",
+"=+@@%%++%*.=+##+%@%%@+==*%@$@%%%+-@#+%@+&@%*%@@+@+%.+%=#=@%=%+%%+*+@@+%=>++>,,,%%=+=;++=@@@@+%+@&%%%",
+"%$#$@##$+#@@##$%%@@@@+@@@@$$@%=+&#+$%===@#@+++%+$+=.$@=@@&@%++%%@#@%*%@@+=@@&#%+=@@%%#&@@%+@+%%@$+@$",
+"&$@@@#&#@&#$@@+%=+##@@##@#@@@%*@&+*@%==;=$$##$+%++=%#+%$#-#@$@%%+@+=.=+$#+#@##%@%#@++#&#@%+@%%%%%++@"};
diff --git a/data/pixmaps/misc/bg-paper-white.xpm b/data/pixmaps/misc/bg-paper-white.xpm
new file mode 100644
index 0000000..45e2325
--- /dev/null
+++ b/data/pixmaps/misc/bg-paper-white.xpm
@@ -0,0 +1,135 @@
+/* XPM */
+static char *paper-background[] = {
+/* width height num_colors chars_per_pixel */
+" 111 112 16 1",
+/* colors */
+". c #e1e1e1",
+"# c #e6e6e6",
+"a c #e9e9e9",
+"b c #ebebeb",
+"c c #ededed",
+"d c #efefef",
+"e c #f0f0f0",
+"f c #f2f2f2",
+"g c #f3f3f3",
+"h c #f4f4f4",
+"i c #f4f4f4",
+"j c #f7f7f7",
+"k c #f6f6f6",
+"l c #fbfbfb",
+"m c #f9f9f9",
+"n c #fdfdfd",
+/* pixels */
+"eebddbfdbkeebd#cddfghgffdddhhdb#debcdbdbcgc#ba#dd#deabd#fjmfcdedga#bfkhaddfifddfbbdifaadadfdbdfdbdddccccdicfdbk",
+"kkdghdgeemfgdkgmjkkjmjgd#ckkdbeliicefdebdkecfddkfdijfhjgdkmifijkkddffkicfdddcbcfdbdffddh#bdddhkmddddddddfmihb#g",
+"jkdikfiehmgkhlkllmjmllidfgiiedilllijjijefifeihfmgfkkfhmjimljhikgkgkjikmkmjkkigkmkddfgffkdfhkifimfdddfgggkmgebbi",
+"kkdkmijgilimkmdhmjjmlljfljiiiikmlnjljhjgfigfgffhiikiddhijlnmhhfdffkmiklmegkjjkikmkikhffimkkmkddhmifhjmmmmhcdhml",
+"kkdkmijgjlfkgkcfhikkjkkidfkkhfknfjijfbgfffgigggdkjkgfffkfjmifgfdbbfifgkidgkkkifdikkkfddghffkkffimgdgmmmmmfddjlm",
+"fhdiidfdhkbdbebidddddddddcdhkihicifhebffdbdgdffddgdcffdhdfgdbcb#aaddcdedkjkffffdbdiidddfdddghfdffb#bdddfedifdeb",
+"dfdifbdcbdbecdbkddbbcddcfdcfjkdbeiegfcgedadgddfacdbaffdfdhfcbcb##adfcdfedfdccddbbdffdddddfhgggfdd##bcbbdcbidcc.",
+"dhfmkdhg#ddmkkdkjgddijkibdkmiddighcefefchcgjfffafkddmmgkfkkghjmk#bikefjmdfiikjidghgfffdddikikmmfiddfiffkfbfdhmb",
+"mkimljeciikmjiffkjkkmlmkfikjjjjjehjjjiiigjekdmiknkhmmhilmjjmjhfgjkjjjjjjkfklmjmkmifgiihgdhkmmmkimfdkmkhicchdejf",
+"kihkkgfhljkkkkmljjkkjmjhfehjmkikijjjjjmlimfkdkfglhfjjffmmkkmjihkikmmmmmmgdiljjjklmmkkiikfhkmmmkkmjjmmjkjddjfglk",
+"hijkhegjkfefghklkkigikiffcdkmifimjjjhfgieififmkkmhfkkfdhkiikkkkjfijmmjjmkgjnlmlmmmmkhgkmkmmmmiddijmkghihfklfflk",
+"dimmkffgccdfhfefgfedehgdibbhjfdijjifeeeedeefdhgfkffiifddddddffhkeffhkkkkfcdheehfdfgffgiikkkkhdbadgfbbdfddhjbbmk",
+"dfhiiigfddfkjiffffdddiifmcbfidfjfefhijjifffcbba#fddfgfdbbbbbcdefifddgkkikdddbcffdfffhkgdddfghgffhgdabhkhbcf#ajj",
+"kiffimmmkihkkikmihfdfjmklfcefehmihhijjighgiddbdbffffkjhddffefhihmiedhkjknjkkefkkmmmkkmfbdffhiiiikgcbdkmmfdhbbie",
+"mmkfhmmmjhfffgkmjkhfhmmjljgffgklljjgfedcffkdkhmkfffgjlmfkmmkkmjklmjiiikjlhghddhhmlmkikhdkkiihgffkeccdfimjimiffb",
+"kjjhfffdifefggkmmjifhjmjlljigijmnliffeeegfkdkgmkcdddimjekmmkkkkfmllmhfimlikjhgkkdkkddfigffggghhgiddeddfmhdmlmkb",
+"mmbdffmdkieccdfhkkigeekllljffkkfiijmmiffgkmkhhgfkieeigekffdbdjmklmiikkkjjkmmkkmkmddfhkkdkmkddkmfegifdbcdiijmkff",
+"dfbffcfbdbbabcddfffecbcdfigdcdffiggigddddfgdcbb#ggdeifdigecbcefdfddfikkmkffdabdckddddgfbdhgdcfihjkihhijmljffdcb",
+"ceemmddcgfdfghfeceiihfffdikebcfkkgffedcdjkfbabddddcdgdcegdbbcbbcfddhkihimigfcdkjkefgefieikkgdbdffdbbdfiklgbabcc",
+"ggkllifgjjmmmkhheimmmjkkhjmiddgmmkiiifdemjhddgjmgkijlmijgcbdeddfhgijjheehdffdfmmifkkfgjkmjjjgccfifddfimlmfbbded",
+"mgimmjikefkjhddfjmmkhhfdkkkkffgkljkmmkffdfggikkggkimlmijkfdikffkddfkjkikffkjffifeekkefjmkffkjgfkmmlmkkmlljikkif",
+"mikhklkjffikidfmmlmigiiehfhkkihkjihkjifekigefkjkdffimidfmkiiifgiddgjmjjmffmlmjjhefjjdejmmihjmkikkmlmifikkkjllmk",
+"kilfglkjkedgifimijkffkkfffhjkffgfdcdffddmjgdfkmjgkikljfikkidddddggkjjkkmdcfiefgdffkkddhimmjkiffgmmmmkikkdddgkii",
+"dfnfdmgiga.#bbbddfdbabb#ddgkgcbcdb#bddddacfkjkd#cdcdhdbcdgfbacdbddeghgkmjhigccdcddgfaaccdgifddfghfddeffedb#bbbb",
+"ihgfgfffkjfdgfdfbdeefikkcklliefiidbejmkfjmldkgkbekgdfda#ddgkkfefjifffdfjifmfljmehfghihhihedhkjmlcfdfbffjddfgdb#",
+"dfkjkgfekmifkifhddddilllfijjigjlkmlmiddffhmekfjfdgfdkjgfmjkkiffilmjkfdhmlmlkljmhhhijmmmmddffeddiikfmhljmiiiiihi",
+"cfmmkhhijmkgkiefihgimnlmkhhkkijnmkkmmkffhkliidffgjigjmikmkkkkikmlmmkfeimmmlkmjljhikmmllldgkkdbbekidjklhfiiigfij",
+"fhiihikmmmfdfdcdkjmmmmidifimkfhmhcbdjmifjkjkiddfmljikifhghkmmkkjjkiiikjmkjmkkkjkhkjjmmmjkmllkddikidkfmdcdefffgi",
+"edcdefffkkdbdddffkjifddcffikfdfmedddddeifedhggfijmkfifdgkkkjkfdfhffgkmjkkmmmkkgfdgighkkgkkjmjhfgikejfjffcdeddij",
+"cbbceecaffcbdffjdfebabfifggdcdklmhdegikjeebedgddmmkggdbdgeddcbdfffddfhfddhgjgmhfaccbcefdcbbddcbacedidiehfgd##cf",
+"feefgfdbffdcfhhjfihddfkmgkkddimmlidfkjkidkdfafdcmmkiidbefdddddfkfihdcdddcfciemhfbddbbfgddbbddcbbbdcididdfid##bd",
+"llmkiikjfiedihehmllmmmjiimmfgmmffijhb.aebkffakgifihkmihlmmmlmkkjkllgcdijmlfjdmddmlmhgmmklmmlmjikgkilkmfddghdfml",
+"lkffhikmmjjkifgkjmnlkefkfmfjkdfbbfkmiddddfbfbibbjkkmlllkffimmkkjmmkghjmkjfcddfhkkkkkgfddmjkmmkfddbmkfmffiieljli",
+"kecddfkmgkmkedfijmlljfhjgjfkkekedddfkkdbfhddbhdfgiiiiigfdddfhgijegiikmmklkfffdddfghihgggkkkjmmkfbbmmimdbkhdmgjc",
+"fdddffhkbddddhifigffdbbbfidffdifdbbdghdbdfddadddddfedcddbaabccdffffedddbfddffdcccddddddddfgdddc#cbgecgfejfbdcea",
+"dfhkkheddca#emibmkgggeddffddcbccbdffdddfdffdbdbbcddddddhcbbcdcddjidbbba#cbcefdddddddddcbcfgcbba.bacbaeihkfbbbcb",
+"fhiiihfejkfdfkfbkfeijjkkhgifddcdddhfdbddhkkfddiigeegifhkiggkjkiijifeffgiihikiffgkihhigfdfkjihkkf#bfjhijdefhedde",
+"jmkggkmljmlmiikmkfdfiiffkklmjmhjifddhhdbkkkdffmmjihjjihkjikmlljjigijmmjmiikjjkkmjkikjjkikjjjjjkifkjljklgdhlmjef",
+"mmmhfklljiikifklmkikjkgfkinmjlklhfdfiifdifibhdidifijkeekjigkmjihifgjmkikddfkkikmiffgkkigjffikfddllikefnmfilijfj",
+"fkkgfffenfbdgdbdbabdggfggdlifjfmdfkkfddffdmdmdb.cdgjgcdjlkgikhfekedfikjlffijkfefhfefikgekcbimhfkfjfkfdlfmkmbfel",
+"hdkddhbd#dhfbacfhbddbdkddefdbbdf#abdddffdddkmdaaba#dgcbf#cfifdbababkkeicadddfcbgfikjkdbh.ghdgfdhbeifdfec.ababdf",
+"eckhklhmddedbabbdcddcdfddfgfddehbdffddddbbdddddda##dhddmefhikkgfafefejndcdeffdcfbkideifd.ccbffcfbdeddddcdfhfddb",
+"kimmmlkmmmkikkihdgffhffifgihffgihkmmifffimmkikmlffdfkddmjighkmjkgmkhdgldgfgiifefafdbdhffbdcdkgdfjhfiigfgcdefhjj",
+"mmmjjjkjkhffkmmmklkhlmklikkkkkkjkkmmmkkiimmgfkmhmmjmmddmmkikmjjjmkfmgbiikgijjkkkffdijdelkigjmifinmkmlmmlmjfdejl",
+"fgffhimmeeefijlnmlfellkmkkkkjmjkgffhkkhfdkidfkf#egimlfdmkkmllkikfdcjgbkjkdgmkkmjmjklmffnjgimkfhkmifkmkkmlmfbdkm",
+"dfdffdkhfghhgimlifccikfdfeddfgfegffgkkfdgkkikmf#cdekmdbfefjlmgegdfefddmdhbfjefmhfmjffffjdbdfddhggeefgffgffdbbdf",
+"hmgjicebedddcddedcdfdddbfdccdedddfikigggfgffghd#fddhib.bddfjjfdgjmghddibkcijccidcddbffdfb#bdbekddfhfeeddjjgca##",
+"hlklmdd#jkigggffdcjlfehdmieehkifbdiifdfkmmkiffdbgedfhb.bgddkmkijnidmkbfflemmbbfcfa#elgdmebcdbkmcchkfddcafigdcdg",
+"lmmmlljfdljcdmjifkkkmjhklmkkkfefdmmdcccekjkfhmjhgikieddfijidfmkcjliifcfdedfgdfkfdfhkhffkjinkmimdmdchgffemjiikjm",
+"fikjmmiddjidklmigkikmkffmkkmlmiffmjggffkfefffddfkjmjihkjkkkkkjjkcffkkfjhmkjkfhjimjjmjkkmmjmmgjmglfgmjkkiiikkkgd",
+"befddihdmljkllgdgkiimkddfdfjlmiffihijigmkffifbacgiifeehkihikfbchdifkkfjhfdefdilllkhhgfgkmmgmbkhglijlmkjjdfikkif",
+"cfd##difmmkkmhcdcfffifcddddfhfdffedgjfdkifdeedccdddcbbddddddb#bdikdddbfemhhfbbddmfcbcccdkiehbdddjfijfdghddeffgk",
+"hkgbbfkkdddegdcg#dddfddgiiifbadihfdgjfdgddb#cjjeffddccddbedbbffddfbccbffjfiicbcdmfbbcdddfcfddbebidfdbadddddcbbd",
+"mmjiikjkdhgffddkbfihkhimmlmibaelikghjifkhke#bmmdkigfddefimkcdkicekfkkfkfbadhddjlmfddffffdafdkdkffdddabddbcefedd",
+"lkijmjkjilmikhfkkmkimmkmjmmkdcindkgeikijmljddgidkihgggfflljfdffcjlmllijhidfidbfjifdfiiiifbfiifkiedffddheadkmmjk",
+"lhdfkhimejkfjmkkmjedkkffdfkkfeklafdbdikjhiifddeikkiikkiimigiigimkmijkgmjkdfkddjnhffkmjjmifdmdifiddfkhkjfdimlmjk",
+"mkdlklikfdijeilkghhgikjkdffdcfikdimmkkhfdfhkkifekhfgfdfkmfdikfcdddbgkfjjjbdllkmljifdfhhfkkkidcejdkkdcfgcffhkjjk",
+"dfdg#bbgccegdfkkkjjkhgggikgcbcdd#cfffgihjidcccdddddffdfiffikdabfbdbfidfdmcdkkikjifcbcdffiigffikkcdddddddccddffd",
+"febfdfdfhfcdmmhdikkkhffgcddddkmldgifdfghddcdffdbdcdfighimfdffddddidffdgcmddddfifkfcbabdddcbbfkidkfehgddfgffhkkk",
+"mkgjmmhfjlhflmdfdehkigijikkkjmllmlmkfgkkdcdimmkdeefgiiiilgcdkkfdjlfddfmfkggeceifkhddccdhidcfmmjkjigkkhfhihghkkj",
+"jmlmgbdihnljjfdmffhkkikmkkjmmmjjijjkijmllmiijmjiigfefffeiiihfdfkklgffgmffimkdfkhiffikkjlkbbkmfekfgffimmimjkkjmm",
+"jijfgdkmlmiimmkimkijjhhjddfkjkhgeijkkjmmmjkjmmifjkhffhfdjkhikjkkfjimmkjdfhmmeekhmihmlmkjibbikcbgjmifimkdmjjjmll",
+"icedmkmjngdfjlmdlhdhkgfkjhffeb##ekmmkigecdimlmgdikifijkemgcdmljddhfllggcgdikedfdmfdkmkffmkikjkihnjghkidbddcddef",
+"abmhk#cdedjk##fhibadgghkecbddddebekkifdbddeffgggddeeijidcddddeddddbiibcbkddfdddbd##djjiifiebcif#jb#ekecddccddee",
+"bddddccgkmfffdifikkffikidddegihfidhlkbcmfdfdafk#dddfjfdkcdedbfmjkifegkkgcbbcdffggfgfddd#bcddfgdafgikjjiddfikkii",
+"mmkhjkhjjmfikfkejjifgkidjjjifefgfhjmiccfggkfbhjbjkhkmifjddggdijgjkkkkjmmffffgggfhddedhkkfddfhgdbfkjgfkkedfkkkii",
+"nlkilmhfllimlmmfkiffjljfjmmkffimcimmifddfimkejmfjkefidbfmjmmikibkkkkjmmlkjmmjkkijgfkjkjllifkmifedkjfekmkdhjjkik",
+"kjggmmdbjmhmmkmikihkmmkfkjjkgfhkbfjmkhffdgihimlimjffkgdilkjmjmkdgddgkjkkikkkigfgiffmnjimlhfmmgeifikigikkhikjmjj",
+"difdkkgfdgdfecigkkkkkfddmmjkifdcddfkiddkdfddimkfhfccffdifbcfhjmffbbdkkfdedddbbbcbbbglkflecdkiddimgfkkdbckhgijmk",
+"dkfcekjmcfdfdbfgeefihfdfkkkkjkfdfddifbbffidcfhddbb##ddcdfaaccdecgcbfkiedhfdcccccddaafdcjcbdhhefkgcbfidbchfefiig",
+"djhdfkkjfjikidifeddhkiiidfgikkkkffggeddedjfcfedkiiddkjikmedfdbbakefjmhffkfefkjkhimd#fdbgfddfkmmmbcdcdghffghgfde",
+"dmjimlkfkmkmjfhdlkfkmkfddfihfegkdkmhfkkfbjidfdfnjjfejmihliimiffdkijlmffkeddhlnlmflhcjkdkkfcdknljdmmbbikdfkmkddd",
+"dijjmljdfkmlkefkmnlfdikfmihjlmkidijkhikjccjfgnjmfkidhlmdmfdgfdflchmmgefikhfikjmlfkmmmllmihfffgikfffcbdffkfdffdd",
+"kjjjmmjikkjmkffilljgklmgmkfggfhkkmmkikjmkhlkhmfkjmkgkllklgekmkjndkllmiffljkkkkmlkjmlllmmkkjjjmmlkifdfkkkljihhgi",
+"kfdfffgkjkikkhffjifgkkkhjigfddfkikiedgihgdkhfgdkmkgffhikjddimkijehjmjifelmjidccekhimjgfhegiihfgikigfkmmkmjjjked",
+"dbbcdcdkkihihfefddikebdkighkiffgddcbdffddcdffdejmfdddbcfkdcfgddffdddfffh.#bdfgjlkedkidbddfgfdbcdfhgfhkkiiihfdcb",
+"gddfgdfjgghifddhhimlkdfmifdgkkhhfffegkieigfjjfijmgdffdekkgfhgefkhdbdfffighkjidccjeejmfeijjjiffhkeijifgkkkkfcbdh",
+"mjjjkggiffikgdfinjkmlmkkmfcdgkkjjmjkjmkfgidjljljkffijkjmjkkjkijljffkmkffabdkmmjmidekmmmljkkikjmlfmlmiijmijmkhff",
+"mlljhgfeffgkkihiljikmmjhlkffgijmmmmkkjkidgbimmlefedhjmjkjkkmmmmmmhhmmkffgefkjiddhffimlmmgedfijjkhjmjkjmlejlljid",
+"kllifgheiffkmmkikjjkiikjmjmmjkjmjmjiijmmimdhmkj#fffgjmidljjmllkhjfdhkffkkfdhkkfdjjkijlmkhedfkmkffiihijmmgkkfekl",
+"hghhdbdkmmgmjdhfjmmjfdfmfc#mihbijjfegjmjjjiigfijdc#ffmfikhfkmmkfecbdffgifjhhmhdmkffddkjdljgdddddikfccffddimkffi",
+"ddehfcbbkfaekffbdfkkfdgmffcidkdeeeccfjjieeeffffidfdkcedkcbbbbba#ighkifddcdbada#ckfgfdijfdddddcb#dedddefdbdfdcdf",
+"gffkkgdcgkgjkdmmkmlnmiklfmkhdlmfjjihijieefhihhhhkjfkcddiiifddcddiijmkgfiikikmidfkghfdfkfhhikkiedfffihfgkeffddeg",
+"lmkikkjmejijgdmljjmmjhfifmjfflljlnllljhdijjjikiilkbediddmjkigfffikjmkgkldfimnmifmgffdfgdkkihhgffjiijkfhmkkkhikj",
+"jkifehmlljcfmmlgjffijjkkffgegimmjllllljeijjgfhigjf#dciddmkghkjiehkmmidfkbbdikkielhfiijjfkkkihgfgkfehhefjfiikjlm",
+"eghfegkkkkdfkkmflkgkmmkiidffkdhjjlljjjheeiieeikiiididigmkgegjmkfcdkmkffijkjkfjlmmfgjmlljgkjmkiffdddeghikdfikmll",
+"fhhfgkie#fddcbfdkfeffdbbgdidkdijijjighgedijffkkgkidkdifmfdcdegffbcdgfehjkimkcfmkgdfkggkkbdffeddddddfkmjffhkikmm",
+"jkfdfkhdhmhkmmnkefikidddbbfbgckibcccehjjcijffhfckd.ccicbkihfgkjmkfdbbbfmddjkbdidbbdfb#bdiiigfgkmcdefjlkbhkkfdfg",
+"kkejfkfjjjjkkkifhkjmmmkfikkfdgihjjjjjjiiflnjddijkjffjmkmkmjlbffkkfdlnfjlmkijmjkkmmjjlljfjddkjffjfimdmmmbighkkki",
+"ijilkmjljmmmmmmjnlmjjkfdfhgddgihjjlljjjihjmhddgillmjlmikjkmkdchgifdmmdklmigkjkiiijmjmmmkmfekjkikdijfmllfjkfffgk",
+"dhflimklfikkhfgimkfhkmmmkkigikkillllljjijjjhfgikkmmmllkkjflgkcjhjkfljciliedfhgfffkmjkjmmmkghjmkgdkihfmkfmjkhgik",
+"ddbgdhdimmlljhijljffhhgfmjkikjkijjjjjieegijihhkkgkiijkfkfdkfgdkgjjhmkbekdbbdeedddfhffikikkfdhmkdbgdfagdffikkihf",
+"hdadcfcdddddb##bifeghfefffefffffeeeffecbacfheddgjmhdedcedddibfdddedjiadddbbdffffdddddgfdffdcejkd#cbdagfjcfhfefe",
+"mkdkfjefkikmkffkbbdikiimdddffffiihhijiec#begdbdfkjgdeddhffdmckdcbcbkjdhhfddfiiiihfeeijiddfddekkfdfdgdfgmdikfdij",
+"kjhlkmhjjggjkfeiffklkddhfhkjkfimjjjjljiefegigddhdkkijigkifgjijkdddcjlkmmjhfikkiifhiikmkghiihhikklkjikdfgfjmkimn",
+"cginikfmlkkmmgehddjlmfiljmllkefjhfgjjjfdljgiiffhfmlllkdedbfemimegfcklkmjmkgikiffbdfffggfmmmmkikmlhjfmcffbimmmll",
+"kjmjfddimifijkfdljfdeghgbimkfgkilieeeffgfmjdfifdjlljedhjadfdfjmijmjfdimlllljeikcigmhmgkdmmmmmkffimnfdmkhhffgkjj",
+"kedfkidbgeeikfdbiheddhiffkjkfhkjfccfjkgddkkimlidjmmkffhkfdb#bhfbgihddfkmjfijigfbhfkfmdfddfkmidddmikdcecfdfikkii",
+"cdfkkhfiddeihdbbbddbbfdagfddddfihdcfkic#cddhlmfdhgffgffeed#.#dfdhhfddfggmccifdcbfdkfkddbddikiddfmddbbcbf#dgifdc",
+"bdimjijlddgkgdcdhmmhimkbgcbccbbeliddedbbefdfjidgfffhhfdddhgc#bfkkigfffedmddecbddddkfmdfdggikkffimddddfdibdffdcb",
+"kdbfmmjiiikkiffkimmkkmkcjfdghddfkiggffimhjjmlkilhgijkfddklljdcdfkkikkihfkkmidfidddmimgkhmkikkiikkgkefmiikkhfhik",
+"mhdfikkkmjkkigkmefggikfdmkkjkifffijmkijldjlllmjlhfhjkdcdjkkkkkfdjjmlllmldknlijmfddmklimkmmkmmkkmkkmhhmgfljihkml",
+"gfggedimmkiigfkmkhgkmkihkjkhfffdfhkjiffidjmkjjiiiddkjfdddddeikkhiijmmkjlefjmiikfddmklimkikmmkhkmifjkiidhmjkigik",
+"da#bfkihkhffffgkhcbdebbbgjkdcddcdddddddfilkdeigflfdjlmigcdddccfjdddfdbbdjdcfdbdfddmkmgkiadmmfddmhbfkkfcmjmljfdc",
+"dgiffigddedbbdffdbadiiddebdkkddhdfifffdbidgfffciiffjlmifimdffglbfcbefdcd#cdb#bbbfkfigdgdadbadbaiddcbbbdfkgedffe",
+"jlmigihdikkgfiifecdhmmigkgfkiddegkjkffginkmigkhlkfegkkikigcigdmdkfdgiffheikkifdahha###fgdhdbihdkkkkighklgfffedd",
+"ikiddikgjmjkmmjhmkkmmjgfkkkkikkkkjjkfdilmijfdddkmkhiigijidcjkdkklkgiiffkmkgegkkidkklmgidkkffmlkkgikifgkjikjmmmm",
+"kmkfhmnljkkkmlmklmjkkhfdimmkkmmkmkkkfeklhekfddbdjjmmjhfiidfmifjmnmkjkffikhdcdhjmhmkmmfkgmkiimlmkfikgfffghikhffg",
+"kkiddijkjigimmmjhfdddfiiimmkikidmigiiikjmklkijegkjmmiddffekkehjkmkijkfeidfhifdddfkfigdhdgikhfkkggjmkikjkmmkebbb",
+"dfdbbfihifdfffffgecbcfffdfiffhfcffddfkhdmffbdkfikhffdbdffdkfchggcbdffddfbcddcbcddkgkkdgddfkfbdhdbdfddfhfjkifdde",
+"ijjhimlmfddffddfkhdcdgfbbcddfggfcffddkidfba.aheffeeffdfigaffdfdidbcffddkfcaabcgmkkbbaahiffkfadidbddbbcdccbbcdff",
+"kjkfdffdffimmkkjgfddimkdfddffeefdmmffmlhhccbflkideimlmkkk.difebmmkkjkhklmgdfiiikdkkmmfhdkhkfadkbmllifikffffijji"
+};
diff --git a/data/pixmaps/misc/bg-segmentcanvas.xpm b/data/pixmaps/misc/bg-segmentcanvas.xpm
new file mode 100644
index 0000000..172e5b6
--- /dev/null
+++ b/data/pixmaps/misc/bg-segmentcanvas.xpm
@@ -0,0 +1,171 @@
+/* XPM */
+static char * bg_segmentcanvas_xpm[] = {
+"100 100 68 1",
+" c None",
+". c #DDDCDB",
+"+ c #D9D8D7",
+"@ c #E6E5E4",
+"# c #D7D6D5",
+"$ c #E3E2E1",
+"% c #DFDEDD",
+"& c #DEDDDC",
+"* c #E0DFDE",
+"= c #E2E1E0",
+"- c #E7E6E5",
+"; c #E1E0DF",
+"> c #DCDBDA",
+", c #E5E4E3",
+"' c #DBDAD9",
+") c #D2D1D0",
+"! c #CFCECD",
+"~ c #D8D7D6",
+"{ c #C7C6C5",
+"] c #D6D5D4",
+"^ c #D0CFCE",
+"/ c #D1D0CF",
+"( c #C9C8C7",
+"_ c #CAC9C8",
+": c #CBCAC9",
+"< c #D4D3D2",
+"[ c #C8C7C6",
+"} c #CECDCC",
+"| c #DAD9D8",
+"1 c #D5D4D3",
+"2 c #CDCCCB",
+"3 c #D3D2D1",
+"4 c #DFDEDC",
+"5 c #CCCBCA",
+"6 c #CBCBCA",
+"7 c #C6C5C4",
+"8 c #CACAC9",
+"9 c #D2D0D0",
+"0 c #E4E3E2",
+"a c #CFCFCE",
+"b c #D6D6D5",
+"c c #E0DFDD",
+"d c #D5D3D3",
+"e c #DBDBDA",
+"f c #C5C4C3",
+"g c #CFCECC",
+"h c #CFCDCD",
+"i c #D4D4D2",
+"j c #DEDDDB",
+"k c #D9D7D7",
+"l c #D2D1CF",
+"m c #D6D4D4",
+"n c #D4D3D1",
+"o c #DBDAD8",
+"p c #DDDCDA",
+"q c #E2E0E0",
+"r c #D7D5D5",
+"s c #C8C8C7",
+"t c #D2D2D1",
+"u c #D5D5D4",
+"v c #E8E7E6",
+"w c #DCDADA",
+"x c #D1D0CE",
+"y c #E1E1DF",
+"z c #D1CFCF",
+"A c #D3D1D1",
+"B c #DCDCDB",
+"C c #D8D7D5",
+".+.@.#$%&*+=-%=;>,.',')&#!~!{]]^/(_):_'<[^}]='&|!/|/]1_|$^2!2]/['~^<^/+32]!:+1:'#3>31~]>&~.;|3'.>%3#",
+"*>%=~)4>~#!~~!1#]#//'1!|/}|^!.#)]3|;##@'1%+.$+|')5|<^~!1')]'1>|)$&1'.+'|&;#];~)$*+%>=,%%*>*$&'$&~%~+",
+")^535(<2_2_3)(2)^:[_!5<%|>$'#*.>%|.%~~%'1]]'.^!1!}>~]./3*..*~*&3>'1%'3|.'+1<|3}|]5313#!5)}2<!21^5/__",
+"+1!.#^1/]&~1|1'=</#]'#'>+'>~2/)2}65)}_!^(5/^35!3:^&)2~3<&])1^]<_13_)^2+){!3_<)_</5+)7<}5~^81)[339/5!",
+"-;%-&~;;;,|#='&$]&;>$>]1}(^]:^)!#<)>12~~^~+1.1]~]*;)/&~<.<//[^1!+#/>'3'~)&'^.'/.*&0]a$#)=>|@&]$=.++$",
+"|)/+1/]/b'^<+^#1:/^}<}3.32'c)+%;@++,']0;|;]#=#<'&'<^)%#<.)/]1&>^]>'%&3'']%'<>>#;.|.^/=)<0]3&~1&#/1.;",
+"5(_]/[:[~~{}2_+<(^)})1';~+-%^#'~+!}'3}~)2<:!~!:|#:!})|^/'/1&'>+)..^)#^#/}+<2)<!1)}<_!|:)&5}1:532!~3}",
+".|>0#).#;'/.~1;.)&*]*;<111>^(<)5)2:.]2~1^#31;13=+#$>>#!+*]#>)]']~<5]~5<^3*)5~<5+<!~!!|/1.!)&~~%]|./~",
+"%+|*33|/~|<+1^||2+>/']5|~!#3]*|<>13$'#,;'$|'$<#=#+;~~|#>&<1|)+&3<])+|/'~~=1]=+~;~<;d)*&&=<<;~+;11|~.",
+")5:!{5^(/'!2!_1+:]|51+'0>]%>'&~<.#/&#^~3!#!3+_/|5_!(/+!^#^<]}1~^1#}1>1|]3#22#1)|'#'^!&e#]5^~:2/f_~/2",
+">/213+%|%@1/|'=*)#+!>;>+//><_^}(#<2|3{3^}<(^~2~'(23}]+_!|/1]!~+^<1}#>//!g1/)|~}|>}3}5~#h55<&<3]!)*)2",
+",+<;''=~#><#=>>>!+.3&+!3/)>!{]]<;>1*~/&>'%<>$1>*#;;]';]'0'&&]&*#.>]>&#+>'*%>=><|]/.1/;;#+>>=+|0>+,+#",
+"<5)*i)'::~33+}}/_'|5|]3%'+*1<$;|%'#%]/%%|'<'%<]>~&&~&;#|&]+>)#'/11/#'#~']~]/|]5)]]]2)=+/~]/|]3')<>!!",
+"#3+*}/&!#0<^+3#'<;'^&+#>)}#1<*~2]^:<22>12)5/~2:)5_5_}<^!<5^]:!<_^!_]~^)):^/5#)(~&<)!<.}_#^2&#}#}3'^/",
+",>|%^~$#*,/]=~|+/++<'~/1}2|12~^2>)!>]<'33>31><]&3^1)3|3}~#>%/1>~&+]=.<'']'>1.~)$&<.+#.#+0+#0+#*#>*+&",
+"|^5]})#!1|:/&)}2:#~:<'1'~~=#}'##=##*+1>]]&]~%11%]|,'>=]1*%.j<~;+|+'%1}~+)#~/|')|1^1}2]]1k/3+!/+3/3}^",
+"')/.]/)!1&^^.^/'~;*3'~2~~3|)5|]!1/^]^}3}}1!3+:_/_)':^|)/+)2/(5/:^<^^}53^(<12+~:)1))^2+~//!^1}5#^:]//",
+"$+>0&>%'*$//.+**/>./)5_+]5<3/.3_1^^+))~31>1'#_#>3||5)>1^1))323~)+~}#~<>+#=.)'|/'*]+.'@*].'';+1*'+0|&",
+"+/)<^^)!]+}2+++)(]lf51>0|3&>~%~1;'';]+0%..m&|!&=~*&#%,.#&%%>|;=&=.]*%|$%|>])>'3>&]'~1&1).]<&~3%.#><]",
+"<^!)_:!}|'5!|<)!5|1}'$=;~/]~#|#<>]].31>3)1}]]:]|2]~!1~^^]3/)/#~)])2~]!<!5/3)1):#|^<!^]5235215(~1:![_",
+"0+>*|**~*%<.%~>|]=%|=&)}:[/32^)5)}}#!5<2}#)3]2<%^!/[!]!)](2/211:!}:]/_3/}||31)^%>53<3']#.]~&13*+3~n+",
+"=~|>1'><..3#]<&|)|~)'1_^<<&&#>~^#~#%]).'+&~~.+;@]<%>*$]|'^&>]*&~%>~;&+=&]*.]'~#=+}>>/'.|%+>;#~$+];'.",
+"+!5!(3<:]]:2/^+]5]3:##<=$'**.=|~=*>='1*')+#<~#%&^1*]].1>|#$>>0;|'|+;>)+~)&>3+])~)!.>!'|2)^/12^>!:)(}",
+"%^<|3.12>|3+.'*'n&+)&|)'~^#<!<}!~/}#}_)5[1/_/}~<f!<(}+3^)<#33]152!}<}7]~^>#:1#^+~<&')&#5k3)>]1.1<>]&",
+"+/>+/'))%|<'~<']/+32'1_])_3/!~^/|!}~22|3)%''.)o'^.*)3>]/|]1~23+^<+]>]<,%3|3_+'<>|]&+)'33*1+%<#*~]&>;",
+"(_35_~)!#^:)2}~^_#/2.1);>#;'';+'0||$#],>',~#>3.=1>&!30&+*'+.)';1>%+>~#;+}13^%./]^^|/5]!^+!]~5)#!::[!",
+"}!|+~$+3&~!###%<)*'~='#&#1>~<'<1'33+)^>3/+:2+!~;52~}10123!:^:)<[)3_^2(l)}+~^&|}<33>/!~!/]^#>/<+33]<1",
+"&&@%+*#)%'3.']%~].#^##^/!}^__]!23::#3}1^)')]*<+&!]>}1=<!')!>13]/+]}+]^'><']}.~2#~~%#1%~~%1~*]~;>.=*;",
+"~#]2_1/5|~}1<^|1^13_3#^1+|~1'$##.1'*<3'.;;1'=#1']>+5'=#+0p&,'>$%=&|$>+,&^#1!%'/~~<|</&#1&/<.}2</^1)3",
+"']]13.1!%~2~.|%|1>+3%.1>#].&**+|&~|#23|~~]^#|2}|<)3!'~_}/^1)51|1<3)#/^'/{]|<&|!#+1+3/|})%)~%!}#13~!!",
+">|&..0+3%32&=>'1/+</.<^+!}<}2)2:/5!3233_)<5^1}/.}_1}]#_!2}<5[^/:2^!/}5~33=%1+~3&>~.~#>)~;<#.1',;**<1",
+"3/^^/~/}~}5|<:2:}12_35}'1)#^!+/5~/#&~..~%.)]*++$]1$<~*+=*%=|+;*#'%>.|+;.~*+!))!~<)1!^|]#.2}#)~.1</}3",
+"<)#3_13^'3/.]3+)#.1)~~',.~*>'0]1q~.%+&%.**1#=|]>]1>3#>r&*.&>~>%#.+/]##>1_3^s/3/~)!])].)<'53'!/1:225]",
+"<]$+/;>~;'',&>&]|%|#&&'>^:]1<|^<>//</^}}^]52>/[)):}5!<!^3}}<_^3_1)5)/}</2|<^&.|%'~%+|&1~.1|%<+.33<]>",
+".&*]^.~!1]/1<}^}/+1!+~)35}#1!#]]|!/&+!<<3.^}%#<=~<.+|&~]e]#.)|'3%>#*%|;'1*~1;#/|#/#/^'~~.]^#]~>3^~;%",
+"+t<)2<<^+#53]!111.|<&|1'.*0&#*&|><.@+#=>|*<#$~]%#~&]'%<~;~+|)|##;|/+~<'12+]}#32+<2]!!.#/~):+<^3:2||1",
+"]^'+/+%>*+)>.1|%>=.3>]}+'~#3/#3!!5++:/~^}<53]8:<^_:{/|2}1_5:[^:2)_f}:(1!2&'3>'<&+)>~>0<}|]1=+]'#&&)]",
+".#&~<''3~^2+]}1~/~3(]35+<{5:2</:2!|#:!+<1.<#12#;u/#3>$1<'3]~<'+]~]#&]<;|'0>#&>#&#)>##'^3&32~1]|]''~$",
+")21)^]))|/}&]^'#/+1/*'3%+).'.$.|;*$*#*v&';|..#$-|&;|$033*&*=+%*'=*~&''$+)#}!]^!)})|^}#}^'^2+)}3!1<21",
+"1)>1)'#1|<#$'#%+#&#)&~^.+)>'|']1'~1]<]+^5/}2)}</(/<}<~5:+/)<:}^2<):^!}+3[3^/~3#'11'1#%]#=1<=#]&'e<2~",
+"&|./^|3!+#)+#!)!2]<}]^(#/[335!2:5[[))2<^:+!_<^3]/)]}/')).)<~!)]]>'1+#^'~}&&|=&o>~+*1<.]].)!>#~&#<]>,",
+"1))2!<33&~:~]{)32+|)|12>+)..~.'#||&0%|;..,~+$%=@&.%]',''$>%;+.0$=.].'<%]:.>^~]:/1].^}~!5]^}>]3]}^~31",
+"3:#13>;&&#!*>/;w]0*#.~)$;]'>+&.>=*.%]/~13|3]'3]+31+)3]^3'1)!_!)!2:(5[(1}2&~^'1[].#|/^>1)%~3*~)+t+>/]",
+"+#*~<.&]##3&')>]<%~23!/*~(2}!!5/1(:^7[3:(!{_2{^]:_1!/15232(5_2^}^)/]<3>.*0+~;+3;*]~<<*]/%~^|</~)+>1'",
+"+##!21)2/)}|]_3!2<^(^^)&3_)3~<2#3_1~x3.3^+]|>1|.)#;/1;+#&~#%%y,|&=>;%>00.>^}#/}|]23^^|!^&<2+/!~<+]:3",
+"#!]33||~>'#%|];#^+']&.~*+|*>*&'='~;='+,.>-0$=]',|~&^/%|>=+]%'#1!'|2<~/~#}1!/.^5+1z'1<.!3;#1%11&]+)5.",
+"~<%>>=*+&>1.|3.1/*;3'.].1)##|.|1A/<~)<B31.122_~=^[]^/;1)12<':{!1%]!'#!'+)']+;]3&#/']1|}/><!])<.3#~#,",
+"]<|<!<15)3!|3[<}}&~_1|^~^(1]1>121~].13]:2+^[<~&+{!$'+0]3~)&+73;;;##;~1;]2|]}]<5#<_]3!~<<&~^~<1&]+|3~",
+"!!<#}!#^~%+&~}'11;]:|*#.+<*'#&<5|.'*]3#!3&1<&+#32|&)!#^^]^#^[~]!1!_1)2#!(.~}'~2>'3$&|;+1%>C%~3#)~~}3",
+"'+&;}],++>3+]_'~1&<}'.)~]^>~2#}73!2)(_!2<')}<^)#/3/((<}_]/<1/'~/~<!.<5>1}=%+$'2.%|0']|!_#]!<22</]3(&",
+"|/]1_|$^2!2]/['~^<^/+32]!:+1:'#3>31~]>&~.;|3'.>%3#.+.@.#$%&*+=-%=;>,.',')&#!~!{]]^/(_):_'<[^}]='&|!/",
+"|<^~!1')]'1>|)$&1'.+'|&;#];~)$*+%>=,%%*>*$&'$&~%~+*>%=~)4>~#!~~!1#]#//'1!|/}|^!.#)]3|;##@'1%+.$+|')5",
+">~]./3*..*~*&3>'1%'3|.'+1<|3}|]5313#!5)}2<!21^5/__)^535(<2_2_3)(2)^:[_!5<%|>$'#*.>%|.%~~%'1]]'.^!1!}",
+"&)2~3<&])1^]<_13_)^2+){!3_<)_</5+)7<}5~^81)[339/5!+1!.#^1/]&~1|1'=</#]'#'>+'>~2/)2}65)}_!^(5/^35!3:^",
+";)/&~<.<//[^1!+#/>'3'~)&'^.'/.*&0]a$#)=>|@&]$=.++$-;%-&~;;;,|#='&$]&;>$>]1}(^]:^)!#<)>12~~^~+1.1]~]*",
+"<^)%#<.)/]1&>^]>'%&3'']%'<>>#;.|.^/=)<0]3&~1&#/1.;|)/+1/]/b'^<+^#1:/^}<}3.32'c)+%;@++,']0;|;]#=#<'&'",
+"!})|^/'/1&'>+)..^)#^#/}+<2)<!1)}<_!|:)&5}1:532!~3}5(_]/[:[~~{}2_+<(^)})1';~+-%^#'~+!}'3}~)2<:!~!:|#:",
+"$>>#!+*]#>)]']~<5]~5<^3*)5~<5+<!~!!|/1.!)&~~%]|./~.|>0#).#;'/.~1;.)&*]*;<111>^(<)5)2:.]2~1^#31;13=+#",
+";~~|#>&<1|)+&3<])+|/'~~=1]=+~;~<;d)*&&=<<;~+;11|~.%+|*33|/~|<+1^||2+>/']5|~!#3]*|<>13$'#,;'$|'$<#=#+",
+"!(/+!^#^<]}1~^1#}1>1|]3#22#1)|'#'^!&e#]5^~:2/f_~/2)5:!{5^(/'!2!_1+:]|51+'0>]%>'&~<.#/&#^~3!#!3+_/|5_",
+"3}]+_!|/1]!~+^<1}#>//!g1/)|~}|>}3}5~#h55<&<3]!)*)2>/213+%|%@1/|'=*)#+!>;>+//><_^}(#<2|3{3^}<(^~2~'(2",
+";]';]'0'&&]&*#.>]>&#+>'*%>=><|]/.1/;;#+>>=+|0>+,+#,+<;''=~#><#=>>>!+.3&+!3/)>!{]]<;>1*~/&>'%<>$1>*#;",
+"&~&;#|&]+>)#'/11/#'#~']~]/|]5)]]]2)=+/~]/|]3')<>!!<5)*i)'::~33+}}/_'|5|]3%'+*1<$;|%'#%]/%%|'<'%<]>~&",
+"5_}<^!<5^]:!<_^!_]~^)):^/5#)(~&<)!<.}_#^2&#}#}3'^/#3+*}/&!#0<^+3#'<;'^&+#>)}#1<*~2]^:<22>12)5/~2:)5_",
+"1)3|3}~#>%/1>~&+]=.<'']'>1.~)$&<.+#.#+0+#0+#*#>*+&,>|%^~$#*,/]=~|+/++<'~/1}2|12~^2>)!>]<'33>31><]&3^",
+",'>=]1*%.j<~;+|+'%1}~+)#~/|')|1^1}2]]1k/3+!/+3/3}^|^5]})#!1|:/&)}2:#~:<'1'~~=#}'##=##*+1>]]&]~%11%]|",
+"':^|)/+)2/(5/:^<^^}53^(<12+~:)1))^2+~//!^1}5#^:]//')/.]/)!1&^^.^/'~;*3'~2~~3|)5|]!1/^]^}3}}1!3+:_/_)",
+"|5)>1^1))323~)+~}#~<>+#=.)'|/'*]+.'@*].'';+1*'+0|&$+>0&>%'*$//.+**/>./)5_+]5<3/.3_1^^+))~31>1'#_#>3|",
+"&#%,.#&%%>|;=&=.]*%|$%|>])>'3>&]'~1&1).]<&~3%.#><]+/)<^^)!]+}2+++)(]lf51>0|3&>~%~1;'';]+0%..m&|!&=~*",
+"~!1~^^]3/)/#~)])2~]!<!5/3)1):#|^<!^]5235215(~1:![_<^!)_:!}|'5!|<)!5|1}'$=;~/]~#|#<>]].31>3)1}]]:]|2]",
+"/[!]!)](2/211:!}:]/_3/}||31)^%>53<3']#.]~&13*+3~n+0+>*|**~*%<.%~>|]=%|=&)}:[/32^)5)}}#!5<2}#)3]2<%^!",
+"%>*$]|'^&>]*&~%>~;&+=&]*.]'~#=+}>>/'.|%+>;#~$+];'.=~|>1'><..3#]<&|)|~)'1_^<<&&#>~^#~#%]).'+&~~.+;@]<",
+"*]].1>|#$>>0;|'|+;>)+~)&>3+])~)!.>!'|2)^/12^>!:)(}+!5!(3<:]]:2/^+]5]3:##<=$'**.=|~=*>='1*')+#<~#%&^1",
+"<(}+3^)<#33]152!}<}7]~^>#:1#^+~<&')&#5k3)>]1.1<>]&%^<|3.12>|3+.'*'n&+)&|)'~^#<!<}!~/}#}_)5[1/_/}~<f!",
+"*)3>]/|]1~23+^<+]>]<,%3|3_+'<>|]&+)'33*1+%<#*~]&>;+/>+/'))%|<'~<']/+32'1_])_3/!~^/|!}~22|3)%''.)o'^.",
+"&!30&+*'+.)';1>%+>~#;+}13^%./]^^|/5]!^+!]~5)#!::[!(_35_~)!#^:)2}~^_#/2.1);>#;'';+'0||$#],>',~#>3.=1>",
+"~}10123!:^:)<[)3_^2(l)}+~^&|}<33>/!~!/]^#>/<+33]<1}!|+~$+3&~!###%<)*'~='#&#1>~<'<1'33+)^>3/+:2+!~;52",
+">}1=<!')!>13]/+]}+]^'><']}.~2#~~%#1%~~%1~*]~;>.=*;&&@%+*#)%'3.']%~].#^##^/!}^__]!23::#3}1^)')]*<+&!]",
+"+5'=#+0p&,'>$%=&|$>+,&^#1!%'/~~<|</&#1&/<.}2</^1)3~#]2_1/5|~}1<^|1^13_3#^1+|~1'$##.1'*<3'.;;1'=#1']>",
+"3!'~_}/^1)51|1<3)#/^'/{]|<&|!#+1+3/|})%)~%!}#13~!!']]13.1!%~2~.|%|1>+3%.1>#].&**+|&~|#23|~~]^#|2}|<)",
+"1}]#_!2}<5[^/:2^!/}5~33=%1+~3&>~.~#>)~;<#.1',;**<1>|&..0+3%32&=>'1/+</.<^+!}<}2)2:/5!3233_)<5^1}/.}_",
+"$<~*+=*%=|+;*#'%>.|+;.~*+!))!~<)1!^|]#.2}#)~.1</}33/^^/~/}~}5|<:2:}12_35}'1)#^!+/5~/#&~..~%.)]*++$]1",
+">3#>r&*.&>~>%#.+/]##>1_3^s/3/~)!])].)<'53'!/1:225]<)#3_13^'3/.]3+)#.1)~~',.~*>'0]1q~.%+&%.**1#=|]>]1",
+"}5!<!^3}}<_^3_1)5)/}</2|<^&.|%'~%+|&1~.1|%<+.33<]><]$+/;>~;'',&>&]|%|#&&'>^:]1<|^<>//</^}}^]52>/[)):",
+".+|&~]e]#.)|'3%>#*%|;'1*~1;#/|#/#/^'~~.]^#]~>3^~;%.&*]^.~!1]/1<}^}/+1!+~)35}#1!#]]|!/&+!<<3.^}%#<=~<",
+"&]'%<~;~+|)|##;|/+~<'12+]}#32+<2]!!.#/~):+<^3:2||1+t<)2<<^+#53]!111.|<&|1'.*0&#*&|><.@+#=>|*<#$~]%#~",
+":{/|2}1_5:[^:2)_f}:(1!2&'3>'<&+)>~>0<}|]1=+]'#&&)]]^'+/+%>*+)>.1|%>=.3>]}+'~#3/#3!!5++:/~^}<53]8:<^_",
+"#3>$1<'3]~<'+]~]#&]<;|'0>#&>#&#)>##'^3&32~1]|]''~$.#&~<''3~^2+]}1~/~3(]35+<{5:2</:2!|#:!+<1.<#12#;u/",
+";|$033*&*=+%*'=*~&''$+)#}!]^!)})|^}#}^'^2+)}3!1<21)21)^]))|/}&]^'#/+1/*'3%+).'.$.|;*$*#*v&';|..#$-|&",
+"<}<~5:+/)<:}^2<):^!}+3[3^/~3#'11'1#%]#=1<=#]&'e<2~1)>1)'#1|<#$'#%+#&#)&~^.+)>'|']1'~1]<]+^5/}2)}</(/",
+"]}/')).)<~!)]]>'1+#^'~}&&|=&o>~+*1<.]].)!>#~&#<]>,&|./^|3!+#)+#!)!2]<}]^(#/[335!2:5[[))2<^:+!_<^3]/)",
+"%]',''$>%;+.0$=.].'<%]:.>^~]:/1].^}~!5]^}>]3]}^~311))2!<33&~:~]{)32+|)|12>+)..~.'#||&0%|;..,~+$%=@&.",
+"+)3]^3'1)!_!)!2:(5[(1}2&~^'1[].#|/^>1)%~3*~)+t+>/]3:#13>;&&#!*>/;w]0*#.~)$;]'>+&.>=*.%]/~13|3]'3]+31",
+"1!/15232(5_2^}^)/]<3>.*0+~;+3;*]~<<*]/%~^|</~)+>1'+#*~<.&]##3&')>]<%~23!/*~(2}!!5/1(:^7[3:(!{_2{^]:_",
+";/1;+#&~#%%y,|&=>;%>00.>^}#/}|]23^^|!^&<2+/!~<+]:3+##!21)2/)}|]_3!2<^(^^)&3_)3~<2#3_1~x3.3^+]|>1|.)#",
+"&^/%|>=+]%'#1!'|2<~/~#}1!/.^5+1z'1<.!3;#1%11&]+)5.#!]33||~>'#%|];#^+']&.~*+|*>*&'='~;='+,.>-0$=]',|~",
+"]^/;1)12<':{!1%]!'#!'+)']+;]3&#/']1|}/><!])<.3#~#,~<%>>=*+&>1.|3.1/*;3'.].1)##|.|1A/<~)<B31.122_~=^[",
+"$'+0]3~)&+73;;;##;~1;]2|]}]<5#<_]3!~<<&~^~<1&]+|3~]<|<!<15)3!|3[<}}&~_1|^~^(1]1>121~].13]:2+^[<~&+{!",
+"&)!#^^]^#^[~]!1!_1)2#!(.~}'~2>'3$&|;+1%>C%~3#)~~}3!!<#}!#^~%+&~}'11;]:|*#.+<*'#&<5|.'*]3#!3&1<&+#32|",
+"/((<}_]/<1/'~/~<!.<5>1}=%+$'2.%|0']|!_#]!<22</]3(&'+&;}],++>3+]_'~1&<}'.)~]^>~2#}73!2)(_!2<')}<^)#/3"};
diff --git a/data/pixmaps/misc/close.xpm b/data/pixmaps/misc/close.xpm
new file mode 100644
index 0000000..6ae2c3e
--- /dev/null
+++ b/data/pixmaps/misc/close.xpm
@@ -0,0 +1,19 @@
+/* XPM */
+static char *close_icon[] = {
+/* columns rows colors chars-per-pixel */
+"10 10 2 1",
+"x c black",
+" c none",
+/* pixels */
+"xx xx"
+" xx xx "
+" xx xx "
+" x xx "
+" xx "
+" xx "
+" xx x "
+" xx xx "
+" xx xx "
+"xx xx"
+
+};
diff --git a/data/pixmaps/misc/configure-audio.png b/data/pixmaps/misc/configure-audio.png
new file mode 100644
index 0000000..db3399f
--- /dev/null
+++ b/data/pixmaps/misc/configure-audio.png
Binary files differ
diff --git a/data/pixmaps/misc/configure-general.png b/data/pixmaps/misc/configure-general.png
new file mode 100644
index 0000000..0a7a7e7
--- /dev/null
+++ b/data/pixmaps/misc/configure-general.png
Binary files differ
diff --git a/data/pixmaps/misc/configure-midi.png b/data/pixmaps/misc/configure-midi.png
new file mode 100644
index 0000000..a87d785
--- /dev/null
+++ b/data/pixmaps/misc/configure-midi.png
Binary files differ
diff --git a/data/pixmaps/misc/configure-notation.png b/data/pixmaps/misc/configure-notation.png
new file mode 100644
index 0000000..2273c8d
--- /dev/null
+++ b/data/pixmaps/misc/configure-notation.png
Binary files differ
diff --git a/data/pixmaps/misc/connected-selected.xpm b/data/pixmaps/misc/connected-selected.xpm
new file mode 100644
index 0000000..653cd46
--- /dev/null
+++ b/data/pixmaps/misc/connected-selected.xpm
@@ -0,0 +1,20 @@
+/* XPM */
+static char *someicon[] = {
+/* columns rows colors chars-per-pixel */
+"12 12 2 1",
+"x c black",
+" c none",
+/* pixels */
+"xxxxxxxxxxxx"
+"x x"
+"x xxxxxxxx x"
+"x xxxxxxxx x"
+"x xxxxxxxx x"
+"x xxxxxxxx x"
+"x xxxxxxxx x"
+"x xxxxxxxx x"
+"x xxxxxxxx x"
+"x xxxxxxxx x"
+"x x"
+"xxxxxxxxxxxx"
+};
diff --git a/data/pixmaps/misc/connected-used.xpm b/data/pixmaps/misc/connected-used.xpm
new file mode 100644
index 0000000..d568074
--- /dev/null
+++ b/data/pixmaps/misc/connected-used.xpm
@@ -0,0 +1,20 @@
+/* XPM */
+static char *someicon[] = {
+/* columns rows colors chars-per-pixel */
+"12 12 2 1",
+"x c black",
+" c none",
+/* pixels */
+" "
+" "
+" xxxxxxxx "
+" xxxxxxxx "
+" xxxxxxxx "
+" xxxxxxxx "
+" xxxxxxxx "
+" xxxxxxxx "
+" xxxxxxxx "
+" xxxxxxxx "
+" "
+" "
+};
diff --git a/data/pixmaps/misc/connected.xpm b/data/pixmaps/misc/connected.xpm
new file mode 100644
index 0000000..05ee86b
--- /dev/null
+++ b/data/pixmaps/misc/connected.xpm
@@ -0,0 +1,20 @@
+/* XPM */
+static char *someicon[] = {
+/* columns rows colors chars-per-pixel */
+"12 12 2 1",
+"x c white",
+" c none",
+/* pixels */
+" "
+" "
+" xxxxxxxx "
+" xxxxxxxx "
+" xxxxxxxx "
+" xxxxxxxx "
+" xxxxxxxx "
+" xxxxxxxx "
+" xxxxxxxx "
+" xxxxxxxx "
+" "
+" "
+};
diff --git a/data/pixmaps/misc/mono.xpm b/data/pixmaps/misc/mono.xpm
new file mode 100644
index 0000000..bf95410
--- /dev/null
+++ b/data/pixmaps/misc/mono.xpm
@@ -0,0 +1,29 @@
+/* XPM */
+static char *mono[] = {
+/* columns rows colors chars-per-pixel */
+"31 21 2 1",
+" c black",
+". c none",
+/* pixels */
+"...............................",
+"...............................",
+"...............................",
+"...............................",
+"...............................",
+"...............................",
+"............. .............",
+"............ ............",
+"........... ... ...........",
+"........... ..... ...........",
+"........... ..... ...........",
+"........... ..... ...........",
+"........... ... ...........",
+"............ ............",
+"............. .............",
+"...............................",
+"...............................",
+"...............................",
+"...............................",
+"...............................",
+"..............................."
+};
diff --git a/data/pixmaps/misc/stereo.xpm b/data/pixmaps/misc/stereo.xpm
new file mode 100644
index 0000000..641c0ce
--- /dev/null
+++ b/data/pixmaps/misc/stereo.xpm
@@ -0,0 +1,26 @@
+/* XPM */
+static char * stereo_xpm[] = {
+"31 21 2 1",
+" c None",
+". c #000000",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ..... ..... ",
+" ............. ",
+" ... ... ... ",
+" .. ... .. ",
+" .. .... .. ",
+" .. ... .. ",
+" ... ... ... ",
+" ............. ",
+" ..... ..... ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" "};
diff --git a/data/pixmaps/misc/unconnected-selected.xpm b/data/pixmaps/misc/unconnected-selected.xpm
new file mode 100644
index 0000000..27ba058
--- /dev/null
+++ b/data/pixmaps/misc/unconnected-selected.xpm
@@ -0,0 +1,20 @@
+/* XPM */
+static char *someicon[] = {
+/* columns rows colors chars-per-pixel */
+"12 12 2 1",
+"x c black",
+" c none",
+/* pixels */
+"xxxxxxxxxxxx"
+"x x"
+"x xxxxxxxx x"
+"x x x x"
+"x x x x"
+"x x x x"
+"x x x x"
+"x x x x"
+"x x x x"
+"x xxxxxxxx x"
+"x x"
+"xxxxxxxxxxxx"
+};
diff --git a/data/pixmaps/misc/unconnected-used.xpm b/data/pixmaps/misc/unconnected-used.xpm
new file mode 100644
index 0000000..79e60b4
--- /dev/null
+++ b/data/pixmaps/misc/unconnected-used.xpm
@@ -0,0 +1,20 @@
+/* XPM */
+static char *someicon[] = {
+/* columns rows colors chars-per-pixel */
+"12 12 2 1",
+"x c black",
+" c none",
+/* pixels */
+" "
+" "
+" xxxxxxxx "
+" x x "
+" x x "
+" x x "
+" x x "
+" x x "
+" x x "
+" xxxxxxxx "
+" "
+" "
+};
diff --git a/data/pixmaps/misc/unconnected.xpm b/data/pixmaps/misc/unconnected.xpm
new file mode 100644
index 0000000..ac615db
--- /dev/null
+++ b/data/pixmaps/misc/unconnected.xpm
@@ -0,0 +1,20 @@
+/* XPM */
+static char *someicon[] = {
+/* columns rows colors chars-per-pixel */
+"12 12 2 1",
+"x c white",
+" c none",
+/* pixels */
+" "
+" "
+" xxxxxxxx "
+" x x "
+" x x "
+" x x "
+" x x "
+" x x "
+" x x "
+" xxxxxxxx "
+" "
+" "
+};
diff --git a/data/pixmaps/misc/welcome-icon.png b/data/pixmaps/misc/welcome-icon.png
new file mode 100644
index 0000000..6aa1716
--- /dev/null
+++ b/data/pixmaps/misc/welcome-icon.png
Binary files differ
diff --git a/data/pixmaps/rg21/4/blank.xpm b/data/pixmaps/rg21/4/blank.xpm
new file mode 100644
index 0000000..9341f0d
--- /dev/null
+++ b/data/pixmaps/rg21/4/blank.xpm
@@ -0,0 +1,15 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"4 8 1 1",
+". c None",
+/* pixels */
+"....",
+"....",
+"....",
+"....",
+"....",
+"....",
+"....",
+"...."
+};
diff --git a/data/pixmaps/rg21/4/chordmod-accent.xpm b/data/pixmaps/rg21/4/chordmod-accent.xpm
new file mode 100644
index 0000000..17f8eea
--- /dev/null
+++ b/data/pixmaps/rg21/4/chordmod-accent.xpm
@@ -0,0 +1,8 @@
+/* XPM */
+static char * chordmod_accent_xpm[] = {
+"5 3 2 1",
+" c black",
+". c None",
+" ...",
+".. .",
+" ..."};
diff --git a/data/pixmaps/rg21/4/chordmod-dash.xpm b/data/pixmaps/rg21/4/chordmod-dash.xpm
new file mode 100644
index 0000000..664a057
--- /dev/null
+++ b/data/pixmaps/rg21/4/chordmod-dash.xpm
@@ -0,0 +1,8 @@
+/* XPM */
+static char * chordmod_dash_xpm[] = {
+"5 3 2 1",
+" c None",
+". c black",
+" . ",
+" . ",
+" "};
diff --git a/data/pixmaps/rg21/4/chordmod-dot.xpm b/data/pixmaps/rg21/4/chordmod-dot.xpm
new file mode 100644
index 0000000..2c31250
--- /dev/null
+++ b/data/pixmaps/rg21/4/chordmod-dot.xpm
@@ -0,0 +1,8 @@
+/* XPM */
+static char * chordmod_dot_xpm[] = {
+"5 3 2 1",
+" c None",
+". c black",
+" .. ",
+" .. ",
+" "};
diff --git a/data/pixmaps/rg21/4/chordmod-legato.xpm b/data/pixmaps/rg21/4/chordmod-legato.xpm
new file mode 100644
index 0000000..ef9481b
--- /dev/null
+++ b/data/pixmaps/rg21/4/chordmod-legato.xpm
@@ -0,0 +1,8 @@
+/* XPM */
+static char * chordmod_legato_xpm[] = {
+"5 3 2 1",
+" c None",
+". c black",
+" ",
+".... ",
+" "};
diff --git a/data/pixmaps/rg21/4/chordmod-pause.xpm b/data/pixmaps/rg21/4/chordmod-pause.xpm
new file mode 100644
index 0000000..8bcf6e7
--- /dev/null
+++ b/data/pixmaps/rg21/4/chordmod-pause.xpm
@@ -0,0 +1,10 @@
+/* XPM */
+static char * chordmod_pause_xpm[] = {
+"8 5 2 1",
+" c None",
+". c black",
+" .... ",
+" . . ",
+". .",
+". .. .",
+" .. "};
diff --git a/data/pixmaps/rg21/4/chordmod-sfz.xpm b/data/pixmaps/rg21/4/chordmod-sfz.xpm
new file mode 100644
index 0000000..7407d39
--- /dev/null
+++ b/data/pixmaps/rg21/4/chordmod-sfz.xpm
@@ -0,0 +1,8 @@
+/* XPM */
+static char * chordmod_sfz_xpm[] = {
+"5 3 2 1",
+" c None",
+". c black",
+" ..",
+".. . ",
+".. . "};
diff --git a/data/pixmaps/rg21/4/chordmod-trill.xpm b/data/pixmaps/rg21/4/chordmod-trill.xpm
new file mode 100644
index 0000000..e89b630
--- /dev/null
+++ b/data/pixmaps/rg21/4/chordmod-trill.xpm
@@ -0,0 +1,8 @@
+/* XPM */
+static char * chordmod_trill_xpm[] = {
+"5 3 2 1",
+" c black",
+". c None",
+" ....",
+" . .",
+" .."};
diff --git a/data/pixmaps/rg21/4/chordmod-turn.xpm b/data/pixmaps/rg21/4/chordmod-turn.xpm
new file mode 100644
index 0000000..ee6e37d
--- /dev/null
+++ b/data/pixmaps/rg21/4/chordmod-turn.xpm
@@ -0,0 +1,8 @@
+/* XPM */
+static char * chordmod_turn_xpm[] = {
+"5 3 2 1",
+" c None",
+". c black",
+" . . ",
+". . ",
+" "};
diff --git a/data/pixmaps/rg21/4/clef-alto.xpm b/data/pixmaps/rg21/4/clef-alto.xpm
new file mode 100644
index 0000000..462a3ae
--- /dev/null
+++ b/data/pixmaps/rg21/4/clef-alto.xpm
@@ -0,0 +1,34 @@
+/* XPM */
+static char * clef_alto_xpm[] = {
+"12 29 2 1",
+" c None",
+". c black",
+" ",
+" ",
+" ",
+" ",
+" ",
+" . . ... ",
+" . . . . ",
+" . . . .. ",
+" . . . ",
+" . . . ",
+" . . . ",
+" . . . .. ",
+" . . .. . ",
+" . . .. . ",
+" . ... ",
+" . . .. . ",
+" . . .. . ",
+" . . . .. ",
+" . . . ",
+" . . . ",
+" . . . ",
+" . . . .. ",
+" . . . . ",
+" . . ... ",
+" ",
+" ",
+" ",
+" ",
+" "};
diff --git a/data/pixmaps/rg21/4/clef-bass.xpm b/data/pixmaps/rg21/4/clef-bass.xpm
new file mode 100644
index 0000000..cdf2ff0
--- /dev/null
+++ b/data/pixmaps/rg21/4/clef-bass.xpm
@@ -0,0 +1,34 @@
+/* XPM */
+static char * clef_bass_xpm[] = {
+"12 29 2 1",
+" c None",
+". c black",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ... ",
+" .. .. .. ",
+". .. .. ",
+". .. ",
+".. .. ",
+".. .. ",
+" .. .. ",
+" .. .. ",
+" .. ",
+" .. ",
+" . ",
+" .. ",
+" . ",
+" . ",
+" . ",
+" .. ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" "};
diff --git a/data/pixmaps/rg21/4/clef-tenor.xpm b/data/pixmaps/rg21/4/clef-tenor.xpm
new file mode 100644
index 0000000..70ea310
--- /dev/null
+++ b/data/pixmaps/rg21/4/clef-tenor.xpm
@@ -0,0 +1,34 @@
+/* XPM */
+static char * clef_tenor_xpm[] = {
+"12 29 2 1",
+" c None",
+". c black",
+" . . ... ",
+" . . . . ",
+" . . . .. ",
+" . . . ",
+" . . . ",
+" . . . ",
+" . . . .. ",
+" . . .. . ",
+" . . .. . ",
+" . ... ",
+" . . .. . ",
+" . . .. . ",
+" . . . .. ",
+" . . . ",
+" . . . ",
+" . . . ",
+" . . . .. ",
+" . . . . ",
+" . . ... ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" "};
diff --git a/data/pixmaps/rg21/4/clef-treble.xpm b/data/pixmaps/rg21/4/clef-treble.xpm
new file mode 100644
index 0000000..bbfd5f5
--- /dev/null
+++ b/data/pixmaps/rg21/4/clef-treble.xpm
@@ -0,0 +1,34 @@
+/* XPM */
+static char * clef_treble_xpm[] = {
+"12 29 2 1",
+" c None",
+". c black",
+" . ",
+" . . ",
+" . . ",
+" . . ",
+" . . ",
+" . . ",
+" .. ",
+" .. ",
+" .. ",
+" . ",
+" . ",
+" .. ",
+" .. ",
+" . . ",
+" . .. ",
+" .. . ",
+" . .... ",
+".. . . .. ",
+".. . . .. ",
+".. .. . .. ",
+".. . . .. ",
+" . . .. ",
+" .. . . ",
+" .. . . ",
+" .... ",
+" . ",
+" .. . ",
+" . . ",
+" .. "};
diff --git a/data/pixmaps/rg21/4/dot.xpm b/data/pixmaps/rg21/4/dot.xpm
new file mode 100644
index 0000000..bda1b45
--- /dev/null
+++ b/data/pixmaps/rg21/4/dot.xpm
@@ -0,0 +1,9 @@
+/* XPM */
+static char * dot_xpm[] = {
+"3 4 2 1",
+" c None",
+". c black",
+" ",
+" ..",
+" ..",
+" "};
diff --git a/data/pixmaps/rg21/4/note-bodyempty.xpm b/data/pixmaps/rg21/4/note-bodyempty.xpm
new file mode 100644
index 0000000..9cab84b
--- /dev/null
+++ b/data/pixmaps/rg21/4/note-bodyempty.xpm
@@ -0,0 +1,9 @@
+/* XPM */
+static char * note_bodyempty_xpm[] = {
+"6 4 2 1",
+" c None",
+". c black",
+" ... ",
+". . ",
+". . ",
+" ... "};
diff --git a/data/pixmaps/rg21/4/note-bodyfilled.xpm b/data/pixmaps/rg21/4/note-bodyfilled.xpm
new file mode 100644
index 0000000..f1c16d4
--- /dev/null
+++ b/data/pixmaps/rg21/4/note-bodyfilled.xpm
@@ -0,0 +1,9 @@
+/* XPM */
+static char * note_bodyfilled_xpm[] = {
+"6 4 2 1",
+" c None",
+". c black",
+" ... ",
+"..... ",
+"..... ",
+" ... "};
diff --git a/data/pixmaps/rg21/4/note-breve.xpm b/data/pixmaps/rg21/4/note-breve.xpm
new file mode 100644
index 0000000..0f695b7
--- /dev/null
+++ b/data/pixmaps/rg21/4/note-breve.xpm
@@ -0,0 +1,9 @@
+/* XPM */
+static char * note_bodyempty_xpm[] = {
+"12 4 2 1",
+" c None",
+"x c black",
+"x x xxx x x ",
+"x xx xx x ",
+"x xx xx x ",
+"x x xxx x x "};
diff --git a/data/pixmaps/rg21/4/notemod-doubleflat.xpm b/data/pixmaps/rg21/4/notemod-doubleflat.xpm
new file mode 100644
index 0000000..3762136
--- /dev/null
+++ b/data/pixmaps/rg21/4/notemod-doubleflat.xpm
@@ -0,0 +1,13 @@
+/* XPM */
+static char * notemod_flat_xpm[] = {
+"5 8 2 1",
+" c None",
+"x c black",
+"x x ",
+"x x ",
+"x x ",
+"xxxxx",
+"x x x",
+"xxxx ",
+"x x ",
+" "};
diff --git a/data/pixmaps/rg21/4/notemod-doublesharp.xpm b/data/pixmaps/rg21/4/notemod-doublesharp.xpm
new file mode 100644
index 0000000..f9f26ca
--- /dev/null
+++ b/data/pixmaps/rg21/4/notemod-doublesharp.xpm
@@ -0,0 +1,14 @@
+/* XPM */
+static char * notemod_doublesharp_xpm[] = {
+"5 8 2 1",
+" c None",
+"x c black",
+" ",
+" ",
+"x x",
+" x x ",
+" x ",
+" x x ",
+"x x",
+" "
+};
diff --git a/data/pixmaps/rg21/4/notemod-flat.xpm b/data/pixmaps/rg21/4/notemod-flat.xpm
new file mode 100644
index 0000000..d22d4db
--- /dev/null
+++ b/data/pixmaps/rg21/4/notemod-flat.xpm
@@ -0,0 +1,13 @@
+/* XPM */
+static char * notemod_flat_xpm[] = {
+"5 8 2 1",
+" c None",
+". c black",
+" . ",
+" . ",
+" . ",
+" ... ",
+" . . ",
+" .. ",
+" . ",
+" "};
diff --git a/data/pixmaps/rg21/4/notemod-natural.xpm b/data/pixmaps/rg21/4/notemod-natural.xpm
new file mode 100644
index 0000000..220151c
--- /dev/null
+++ b/data/pixmaps/rg21/4/notemod-natural.xpm
@@ -0,0 +1,13 @@
+/* XPM */
+static char * notemod_natural_xpm[] = {
+"5 8 2 1",
+" c None",
+". c black",
+" . ",
+" . ",
+" ... ",
+" . . ",
+" . . ",
+" ... ",
+" . ",
+" . "};
diff --git a/data/pixmaps/rg21/4/notemod-sharp.xpm b/data/pixmaps/rg21/4/notemod-sharp.xpm
new file mode 100644
index 0000000..b642818
--- /dev/null
+++ b/data/pixmaps/rg21/4/notemod-sharp.xpm
@@ -0,0 +1,13 @@
+/* XPM */
+static char * notemod_sharp_xpm[] = {
+"5 8 2 1",
+" c None",
+". c black",
+" . ",
+" . . ",
+" ....",
+".. . ",
+" . ..",
+".... ",
+" . . ",
+" . "};
diff --git a/data/pixmaps/rg21/4/rest-breve.xpm b/data/pixmaps/rg21/4/rest-breve.xpm
new file mode 100644
index 0000000..49de514
--- /dev/null
+++ b/data/pixmaps/rg21/4/rest-breve.xpm
@@ -0,0 +1,26 @@
+/* XPM */
+static char * rest_breve_xpm[] = {
+"6 21 2 1",
+" c None",
+". c black",
+" ",
+" ",
+" ",
+" ",
+" ",
+" .... ",
+" .. ",
+" .. ",
+" .. ",
+" .. ",
+" .... ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" "};
diff --git a/data/pixmaps/rg21/4/rest-crotchet.xpm b/data/pixmaps/rg21/4/rest-crotchet.xpm
new file mode 100644
index 0000000..776180e
--- /dev/null
+++ b/data/pixmaps/rg21/4/rest-crotchet.xpm
@@ -0,0 +1,26 @@
+/* XPM */
+static char * rest_crotchet_xpm[] = {
+"6 21 2 1",
+" c None",
+". c black",
+" ",
+" ",
+" ",
+" . ",
+" . ",
+" .. ",
+" . ",
+" .. ",
+" . ",
+".. ",
+". ",
+" . ",
+" . ",
+" ... ",
+".. . ",
+".. ",
+" . ",
+" . ",
+" ",
+" ",
+" "};
diff --git a/data/pixmaps/rg21/4/rest-demisemi.xpm b/data/pixmaps/rg21/4/rest-demisemi.xpm
new file mode 100644
index 0000000..c2c2321
--- /dev/null
+++ b/data/pixmaps/rg21/4/rest-demisemi.xpm
@@ -0,0 +1,26 @@
+/* XPM */
+static char * rest_demisemi_xpm[] = {
+"6 21 2 1",
+" c None",
+". c black",
+" ",
+" ",
+" ",
+" ",
+" .. .",
+" .... ",
+" . ",
+" . . ",
+".... ",
+" . ",
+". . ",
+".. ",
+" . ",
+". ",
+". ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" "};
diff --git a/data/pixmaps/rg21/4/rest-demisemiquaver.xpm b/data/pixmaps/rg21/4/rest-demisemiquaver.xpm
new file mode 100644
index 0000000..c2c2321
--- /dev/null
+++ b/data/pixmaps/rg21/4/rest-demisemiquaver.xpm
@@ -0,0 +1,26 @@
+/* XPM */
+static char * rest_demisemi_xpm[] = {
+"6 21 2 1",
+" c None",
+". c black",
+" ",
+" ",
+" ",
+" ",
+" .. .",
+" .... ",
+" . ",
+" . . ",
+".... ",
+" . ",
+". . ",
+".. ",
+" . ",
+". ",
+". ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" "};
diff --git a/data/pixmaps/rg21/4/rest-hemidemisemi.xpm b/data/pixmaps/rg21/4/rest-hemidemisemi.xpm
new file mode 100644
index 0000000..21695f3
--- /dev/null
+++ b/data/pixmaps/rg21/4/rest-hemidemisemi.xpm
@@ -0,0 +1,26 @@
+/* XPM */
+static char * rest_hemidemisemi_xpm[] = {
+"6 21 2 1",
+" c None",
+". c black",
+" ",
+" ",
+" ",
+" ",
+" .. .",
+" .... ",
+" . ",
+" . .. ",
+" ... ",
+" . ",
+". . ",
+"... ",
+" . ",
+".. ",
+".. ",
+" . ",
+". ",
+". ",
+". ",
+" ",
+" "};
diff --git a/data/pixmaps/rg21/4/rest-hemidemisemiquaver.xpm b/data/pixmaps/rg21/4/rest-hemidemisemiquaver.xpm
new file mode 100644
index 0000000..21695f3
--- /dev/null
+++ b/data/pixmaps/rg21/4/rest-hemidemisemiquaver.xpm
@@ -0,0 +1,26 @@
+/* XPM */
+static char * rest_hemidemisemi_xpm[] = {
+"6 21 2 1",
+" c None",
+". c black",
+" ",
+" ",
+" ",
+" ",
+" .. .",
+" .... ",
+" . ",
+" . .. ",
+" ... ",
+" . ",
+". . ",
+"... ",
+" . ",
+".. ",
+".. ",
+" . ",
+". ",
+". ",
+". ",
+" ",
+" "};
diff --git a/data/pixmaps/rg21/4/rest-minim.xpm b/data/pixmaps/rg21/4/rest-minim.xpm
new file mode 100644
index 0000000..9154562
--- /dev/null
+++ b/data/pixmaps/rg21/4/rest-minim.xpm
@@ -0,0 +1,26 @@
+/* XPM */
+static char * rest_minim_xpm[] = {
+"6 21 2 1",
+" c None",
+". c black",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ... ",
+" ... ",
+"..... ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" "};
diff --git a/data/pixmaps/rg21/4/rest-quaver.xpm b/data/pixmaps/rg21/4/rest-quaver.xpm
new file mode 100644
index 0000000..b1e37a3
--- /dev/null
+++ b/data/pixmaps/rg21/4/rest-quaver.xpm
@@ -0,0 +1,26 @@
+/* XPM */
+static char * rest_quaver_xpm[] = {
+"6 21 2 1",
+" c None",
+". c black",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+".. . ",
+".... ",
+" . ",
+" . ",
+" . ",
+" . ",
+" . ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" "};
diff --git a/data/pixmaps/rg21/4/rest-semibreve.xpm b/data/pixmaps/rg21/4/rest-semibreve.xpm
new file mode 100644
index 0000000..5512819
--- /dev/null
+++ b/data/pixmaps/rg21/4/rest-semibreve.xpm
@@ -0,0 +1,26 @@
+/* XPM */
+static char * rest_semibreve_xpm[] = {
+"6 21 2 1",
+" c None",
+". c black",
+" ",
+" ",
+" ",
+" ",
+" ",
+"..... ",
+" ... ",
+" ... ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" "};
diff --git a/data/pixmaps/rg21/4/rest-semiquaver.xpm b/data/pixmaps/rg21/4/rest-semiquaver.xpm
new file mode 100644
index 0000000..2a227d3
--- /dev/null
+++ b/data/pixmaps/rg21/4/rest-semiquaver.xpm
@@ -0,0 +1,26 @@
+/* XPM */
+static char * rest_semiquaver_xpm[] = {
+"6 21 2 1",
+" c None",
+". c black",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+".. . ",
+"..... ",
+" . ",
+" . ",
+". . ",
+"... ",
+" . ",
+" . ",
+". ",
+". ",
+" ",
+" ",
+" ",
+" "};
diff --git a/data/pixmaps/rg21/4/tail-down-1.xpm b/data/pixmaps/rg21/4/tail-down-1.xpm
new file mode 100644
index 0000000..c7eee55
--- /dev/null
+++ b/data/pixmaps/rg21/4/tail-down-1.xpm
@@ -0,0 +1,11 @@
+/* XPM */
+static char * tail_down_1_xpm[] = {
+"4 6 2 1",
+" c black",
+"x c None",
+" xx",
+" x",
+"xx x",
+"xxx ",
+"xxx ",
+"xx x"};
diff --git a/data/pixmaps/rg21/4/tail-down-2.xpm b/data/pixmaps/rg21/4/tail-down-2.xpm
new file mode 100644
index 0000000..88664b9
--- /dev/null
+++ b/data/pixmaps/rg21/4/tail-down-2.xpm
@@ -0,0 +1,15 @@
+/* XPM */
+static char * tail_down_2_xpm[] = {
+"4 10 2 1",
+" c black",
+". c None",
+" ..",
+" .",
+".. .",
+"... ",
+" . ",
+" .",
+".. .",
+"... ",
+"... ",
+".. ."};
diff --git a/data/pixmaps/rg21/4/tail-down-3.xpm b/data/pixmaps/rg21/4/tail-down-3.xpm
new file mode 100644
index 0000000..5f56376
--- /dev/null
+++ b/data/pixmaps/rg21/4/tail-down-3.xpm
@@ -0,0 +1,18 @@
+/* XPM */
+static char * tail_down_3_xpm[] = {
+"4 13 2 1",
+" c black",
+"x c None",
+" xx",
+" x",
+"xx x",
+"xxx ",
+" x ",
+" x",
+"xx x",
+"xxx ",
+" x ",
+" x",
+"xx x",
+"xxx ",
+"xxx "};
diff --git a/data/pixmaps/rg21/4/tail-down-4.xpm b/data/pixmaps/rg21/4/tail-down-4.xpm
new file mode 100644
index 0000000..633af2d
--- /dev/null
+++ b/data/pixmaps/rg21/4/tail-down-4.xpm
@@ -0,0 +1,22 @@
+/* XPM */
+static char * tail_down_4_xpm[] = {
+"4 17 2 1",
+" c black",
+". c None",
+" ..",
+" .",
+".. .",
+"... ",
+" . ",
+" .",
+".. .",
+"... ",
+" . ",
+" .",
+".. .",
+"... ",
+" . ",
+" .",
+".. .",
+"... ",
+"... "};
diff --git a/data/pixmaps/rg21/4/tail-up-1.xpm b/data/pixmaps/rg21/4/tail-up-1.xpm
new file mode 100644
index 0000000..28d877c
--- /dev/null
+++ b/data/pixmaps/rg21/4/tail-up-1.xpm
@@ -0,0 +1,11 @@
+/* XPM */
+static char * tail_up_1_xpm[] = {
+"4 6 2 1",
+" c None",
+". c black",
+" . ",
+" .",
+" .",
+" . ",
+"... ",
+".. "};
diff --git a/data/pixmaps/rg21/4/tail-up-2.xpm b/data/pixmaps/rg21/4/tail-up-2.xpm
new file mode 100644
index 0000000..bda5b0f
--- /dev/null
+++ b/data/pixmaps/rg21/4/tail-up-2.xpm
@@ -0,0 +1,15 @@
+/* XPM */
+static char * tail_up_2_xpm[] = {
+"4 10 2 1",
+" c None",
+". c black",
+" . ",
+" .",
+" .",
+" . ",
+"... ",
+".. .",
+" .",
+" . ",
+"... ",
+".. "};
diff --git a/data/pixmaps/rg21/4/tail-up-3.xpm b/data/pixmaps/rg21/4/tail-up-3.xpm
new file mode 100644
index 0000000..ea06dcf
--- /dev/null
+++ b/data/pixmaps/rg21/4/tail-up-3.xpm
@@ -0,0 +1,18 @@
+/* XPM */
+static char * tail_up_3_xpm[] = {
+"4 13 2 1",
+" c None",
+". c black",
+" .",
+" .",
+" . ",
+"... ",
+".. .",
+" ..",
+" . ",
+".. ",
+".. .",
+" .",
+" . ",
+"... ",
+".. "};
diff --git a/data/pixmaps/rg21/4/tail-up-4.xpm b/data/pixmaps/rg21/4/tail-up-4.xpm
new file mode 100644
index 0000000..68664cd
--- /dev/null
+++ b/data/pixmaps/rg21/4/tail-up-4.xpm
@@ -0,0 +1,22 @@
+/* XPM */
+static char * tail_up_4_xpm[] = {
+"4 17 2 1",
+" c None",
+". c black",
+" .",
+" .",
+" . ",
+"... ",
+".. .",
+" .",
+" . ",
+"... ",
+".. .",
+" .",
+" . ",
+"... ",
+".. .",
+" .",
+" . ",
+"... ",
+".. "};
diff --git a/data/pixmaps/rg21/4/unknown.xpm b/data/pixmaps/rg21/4/unknown.xpm
new file mode 100644
index 0000000..8698b03
--- /dev/null
+++ b/data/pixmaps/rg21/4/unknown.xpm
@@ -0,0 +1,16 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"6 8 2 1",
+"x c Gray0",
+" c None",
+/* pixels */
+" xxx ",
+" x ",
+" x ",
+" xx ",
+" x ",
+" ",
+" x ",
+" "
+};
diff --git a/data/pixmaps/rg21/8/blank.xpm b/data/pixmaps/rg21/8/blank.xpm
new file mode 100644
index 0000000..9341f0d
--- /dev/null
+++ b/data/pixmaps/rg21/8/blank.xpm
@@ -0,0 +1,15 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"4 8 1 1",
+". c None",
+/* pixels */
+"....",
+"....",
+"....",
+"....",
+"....",
+"....",
+"....",
+"...."
+};
diff --git a/data/pixmaps/rg21/8/chordmod-accent.xpm b/data/pixmaps/rg21/8/chordmod-accent.xpm
new file mode 100644
index 0000000..cb9ac22
--- /dev/null
+++ b/data/pixmaps/rg21/8/chordmod-accent.xpm
@@ -0,0 +1,15 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"9 7 2 1",
+" c Gray0",
+". c None",
+/* pixels */
+".........",
+". .....",
+"... ...",
+"..... .",
+"... ...",
+". .....",
+"........."
+};
diff --git a/data/pixmaps/rg21/8/chordmod-dash.xpm b/data/pixmaps/rg21/8/chordmod-dash.xpm
new file mode 100644
index 0000000..54fd3c9
--- /dev/null
+++ b/data/pixmaps/rg21/8/chordmod-dash.xpm
@@ -0,0 +1,15 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"9 7 2 1",
+" c Gray0",
+". c None",
+/* pixels */
+".........",
+".........",
+"... ....",
+"... ....",
+".... ....",
+".........",
+"........."
+};
diff --git a/data/pixmaps/rg21/8/chordmod-dot.xpm b/data/pixmaps/rg21/8/chordmod-dot.xpm
new file mode 100644
index 0000000..980e70a
--- /dev/null
+++ b/data/pixmaps/rg21/8/chordmod-dot.xpm
@@ -0,0 +1,15 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"9 7 2 1",
+" c Gray0",
+". c None",
+/* pixels */
+".........",
+".........",
+".........",
+"... ....",
+"... ....",
+".........",
+"........."
+};
diff --git a/data/pixmaps/rg21/8/chordmod-legato.xpm b/data/pixmaps/rg21/8/chordmod-legato.xpm
new file mode 100644
index 0000000..920855d
--- /dev/null
+++ b/data/pixmaps/rg21/8/chordmod-legato.xpm
@@ -0,0 +1,15 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"9 7 2 1",
+" c Gray0",
+". c None",
+/* pixels */
+".........",
+".........",
+".........",
+".........",
+" .",
+".........",
+"........."
+};
diff --git a/data/pixmaps/rg21/8/chordmod-pause.xpm b/data/pixmaps/rg21/8/chordmod-pause.xpm
new file mode 100644
index 0000000..18a7554
--- /dev/null
+++ b/data/pixmaps/rg21/8/chordmod-pause.xpm
@@ -0,0 +1,17 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"13 9 2 1",
+" c Gray0",
+". c None",
+/* pixels */
+".............",
+".... ....",
+".. ..... ..",
+".. ....... ..",
+". ......... .",
+". .... .... .",
+". ... ... .",
+"...... ......",
+"............."
+};
diff --git a/data/pixmaps/rg21/8/chordmod-rfz.xpm b/data/pixmaps/rg21/8/chordmod-rfz.xpm
new file mode 100644
index 0000000..742663f
--- /dev/null
+++ b/data/pixmaps/rg21/8/chordmod-rfz.xpm
@@ -0,0 +1,15 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"9 7 2 1",
+" c Gray0",
+". c None",
+/* pixels */
+"....... ",
+". . . ..",
+". ... ..",
+". .. .",
+" .... ...",
+" ... ....",
+".... ...."
+};
diff --git a/data/pixmaps/rg21/8/chordmod-sfz.xpm b/data/pixmaps/rg21/8/chordmod-sfz.xpm
new file mode 100644
index 0000000..81bd468
--- /dev/null
+++ b/data/pixmaps/rg21/8/chordmod-sfz.xpm
@@ -0,0 +1,15 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"9 7 2 1",
+" c Gray0",
+". c None",
+/* pixels */
+"....... ",
+".. . ..",
+". .... ..",
+". .",
+"... . ...",
+" . ....",
+".... ...."
+};
diff --git a/data/pixmaps/rg21/8/chordmod-trill.xpm b/data/pixmaps/rg21/8/chordmod-trill.xpm
new file mode 100644
index 0000000..f614398
--- /dev/null
+++ b/data/pixmaps/rg21/8/chordmod-trill.xpm
@@ -0,0 +1,15 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"9 7 2 1",
+" c Gray0",
+". c None",
+/* pixels */
+"... .....",
+".. ......",
+" . ",
+". ... . ",
+" ... ...",
+". . ....",
+"........."
+};
diff --git a/data/pixmaps/rg21/8/chordmod-turn.xpm b/data/pixmaps/rg21/8/chordmod-turn.xpm
new file mode 100644
index 0000000..c327eb5
--- /dev/null
+++ b/data/pixmaps/rg21/8/chordmod-turn.xpm
@@ -0,0 +1,15 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"9 7 2 1",
+" c Gray0",
+". c None",
+/* pixels */
+".........",
+".........",
+". .. .",
+" .. .. .",
+" .. ..",
+".........",
+"........."
+};
diff --git a/data/pixmaps/rg21/8/clef-alto.xpm b/data/pixmaps/rg21/8/clef-alto.xpm
new file mode 100644
index 0000000..5587472
--- /dev/null
+++ b/data/pixmaps/rg21/8/clef-alto.xpm
@@ -0,0 +1,61 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"24 53 2 1",
+" c Gray0",
+". c None",
+/* pixels */
+"........................",
+"........................",
+"........................",
+"........................",
+"........................",
+"........................",
+"........................",
+"........................",
+"........................",
+". .. .... ......",
+". .. ... ..... ....",
+". .. .. ........ ...",
+". .. . ........ ..",
+". .. . ........ ..",
+". .. . ......... .",
+". .. .. .......... .",
+". .. .............. .",
+". .. .............. .",
+". .. .............. .",
+". .. .............. .",
+". .. ............. ..",
+". .. ..... ....... ..",
+". .. ..... ..... ...",
+". .. ..... .. ....",
+". .. .... ......",
+". .. . .............",
+". .. ..............",
+". .. . .............",
+". .. .... ......",
+". .. ..... .. ....",
+". .. ..... ..... ...",
+". .. ..... ....... ..",
+". .. ............. ..",
+". .. .............. .",
+". .. .............. .",
+". .. .............. .",
+". .. .............. .",
+". .. .. .......... .",
+". .. . ......... .",
+". .. . ........ ..",
+". .. . ........ ..",
+". .. .. ........ ...",
+". .. ... ..... ....",
+". .. ..... ......",
+"........................",
+"........................",
+"........................",
+"........................",
+"........................",
+"........................",
+"........................",
+"........................",
+"........................"
+};
diff --git a/data/pixmaps/rg21/8/clef-bass.xpm b/data/pixmaps/rg21/8/clef-bass.xpm
new file mode 100644
index 0000000..6fe4fba
--- /dev/null
+++ b/data/pixmaps/rg21/8/clef-bass.xpm
@@ -0,0 +1,61 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"24 53 2 1",
+" c Gray0",
+". c None",
+/* pixels */
+"........................",
+"........................",
+"........................",
+"........................",
+"........................",
+"........................",
+"........................",
+"........................",
+"........................",
+"...... .........",
+".... ..... ........",
+"... ......... .......",
+"... .......... ......",
+".. ........... ......",
+".. ............ .. .",
+".. .......... .. .",
+".. ......... .....",
+".. ......... .....",
+".. ......... .....",
+"... .......... .. .",
+"................ .. .",
+"................ .....",
+"............... ......",
+"............... ......",
+"............... ......",
+".............. .......",
+".............. .......",
+".............. .......",
+"............. ........",
+"............. .........",
+"............ .........",
+"............ ..........",
+"........... ...........",
+".......... ............",
+"......... .............",
+"........ ..............",
+"....... ...............",
+"..... .................",
+"........................",
+"........................",
+"........................",
+"........................",
+"........................",
+"........................",
+"........................",
+"........................",
+"........................",
+"........................",
+"........................",
+"........................",
+"........................",
+"........................",
+"........................"
+};
diff --git a/data/pixmaps/rg21/8/clef-tenor.xpm b/data/pixmaps/rg21/8/clef-tenor.xpm
new file mode 100644
index 0000000..c4a2bdd
--- /dev/null
+++ b/data/pixmaps/rg21/8/clef-tenor.xpm
@@ -0,0 +1,61 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"24 53 2 1",
+" c Gray0",
+". c None",
+/* pixels */
+". .. ..... ......",
+". .. ... ..... ....",
+". .. .. ........ ...",
+". .. . ........ ..",
+". .. . ........ ..",
+". .. . ......... .",
+". .. .. .......... .",
+". .. .............. .",
+". .. .............. .",
+". .. .............. .",
+". .. .............. .",
+". .. ............. ..",
+". .. ..... ....... ..",
+". .. ..... ..... ...",
+". .. ..... .. ....",
+". .. .... ......",
+". .. . .............",
+". .. ..............",
+". .. . .............",
+". .. .... ......",
+". .. ..... .. ....",
+". .. ..... ..... ...",
+". .. ..... ....... ..",
+". .. ............. ..",
+". .. .............. .",
+". .. .............. .",
+". .. .............. .",
+". .. .............. .",
+". .. .. .......... .",
+". .. . ......... .",
+". .. . ........ ..",
+". .. . ........ ..",
+". .. .. ........ ...",
+". .. ... ..... ....",
+". .. ..... ......",
+"........................",
+"........................",
+"........................",
+"........................",
+"........................",
+"........................",
+"........................",
+"........................",
+"........................",
+"........................",
+"........................",
+"........................",
+"........................",
+"........................",
+"........................",
+"........................",
+"........................",
+"........................"
+};
diff --git a/data/pixmaps/rg21/8/clef-treble.xpm b/data/pixmaps/rg21/8/clef-treble.xpm
new file mode 100644
index 0000000..e0d344c
--- /dev/null
+++ b/data/pixmaps/rg21/8/clef-treble.xpm
@@ -0,0 +1,61 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"24 53 2 1",
+" c Gray0",
+". c None",
+/* pixels */
+"........................",
+"........................",
+"............ .........",
+"........... .. ........",
+".......... ... .......",
+".......... ... .......",
+".......... ... .......",
+".......... ... .......",
+".......... ... .......",
+".......... ... .......",
+".......... ... .......",
+".......... .. ........",
+".......... .. ........",
+".......... . .........",
+".......... . .........",
+"........... ..........",
+"........... ...........",
+".......... ...........",
+"......... ...........",
+"........ . ...........",
+"........ .. ...........",
+"....... .. ...........",
+"...... ... ...........",
+"..... .... ...........",
+"..... .... ...........",
+".... ..... ...........",
+"... ...... ..........",
+"... ..... ......",
+".. .... . .... ....",
+".. ... .. ..... ...",
+". ... ... ...... ..",
+". ... ... ...... ..",
+". .. .... ....... .",
+". .. .... ....... .",
+". .. .... ....... .",
+". .. .... ....... .",
+". .. ..... ...... .",
+". ... .... ...... .",
+". ... .... ...... .",
+".. ... ... ..... ..",
+".. ..... .. ..... ..",
+"... ....... .... ...",
+".... ...... ... ....",
+"...... .... . ......",
+"......... ........",
+"............. .........",
+".... ....... .........",
+"... ...... .........",
+"... ..... ..........",
+"... ..... ..........",
+".... ..... ...........",
+"..... .............",
+"........................"
+};
diff --git a/data/pixmaps/rg21/8/dot.xpm b/data/pixmaps/rg21/8/dot.xpm
new file mode 100644
index 0000000..867a67b
--- /dev/null
+++ b/data/pixmaps/rg21/8/dot.xpm
@@ -0,0 +1,16 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"4 8 2 1",
+" c Gray0",
+". c None",
+/* pixels */
+"....",
+"....",
+"....",
+". .",
+". .",
+"....",
+"....",
+"...."
+};
diff --git a/data/pixmaps/rg21/8/dual-arrow.xpm b/data/pixmaps/rg21/8/dual-arrow.xpm
new file mode 100644
index 0000000..97724bd
--- /dev/null
+++ b/data/pixmaps/rg21/8/dual-arrow.xpm
@@ -0,0 +1,18 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"23 10 2 1",
+" c black",
+". c None",
+/* pixels */
+".... ........... ....",
+".... ......... ....",
+".... ....... ....",
+".... ..... ....",
+".... ....",
+".... ..... ....",
+".... ....... ....",
+".... ......... ....",
+".... ........... ....",
+".......................",
+};
diff --git a/data/pixmaps/rg21/8/note-bodyempty.xpm b/data/pixmaps/rg21/8/note-bodyempty.xpm
new file mode 100644
index 0000000..511087b
--- /dev/null
+++ b/data/pixmaps/rg21/8/note-bodyempty.xpm
@@ -0,0 +1,16 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"8 8 2 1",
+" c Gray0",
+". c None",
+/* pixels */
+".. ..",
+". ... .",
+" ..... ",
+" ...... ",
+" ...... ",
+" ..... ",
+". ... .",
+".. .."
+};
diff --git a/data/pixmaps/rg21/8/note-bodyfilled.xpm b/data/pixmaps/rg21/8/note-bodyfilled.xpm
new file mode 100644
index 0000000..c50bd39
--- /dev/null
+++ b/data/pixmaps/rg21/8/note-bodyfilled.xpm
@@ -0,0 +1,16 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"8 8 2 1",
+" c Gray0",
+". c None",
+/* pixels */
+".... .",
+".. ",
+". ",
+" ",
+" ",
+" .",
+" ..",
+". ...."
+};
diff --git a/data/pixmaps/rg21/8/note-breve.xpm b/data/pixmaps/rg21/8/note-breve.xpm
new file mode 100644
index 0000000..b14c6ee
--- /dev/null
+++ b/data/pixmaps/rg21/8/note-breve.xpm
@@ -0,0 +1,16 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"17 8 2 1",
+"x c Gray0",
+" c None",
+/* pixels */
+"x x xxxx x x ",
+"x x xx x x x ",
+"x xxx xx x ",
+"x xx xx x ",
+"x xx xx x ",
+"x xx xxx x ",
+"x x x xx x x ",
+"x x xxxx x x "
+};
diff --git a/data/pixmaps/rg21/8/notemod-doubleflat.xpm b/data/pixmaps/rg21/8/notemod-doubleflat.xpm
new file mode 100644
index 0000000..4dce635
--- /dev/null
+++ b/data/pixmaps/rg21/8/notemod-doubleflat.xpm
@@ -0,0 +1,22 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"9 14 2 1",
+"x c Gray0",
+" c None",
+/* pixels */
+"x x ",
+"x x ",
+"x x ",
+"x x ",
+"x x ",
+"x x ",
+"x xxx xx ",
+"xxxxxxxxx",
+"x xx xx",
+"x xx xx",
+"x xx x ",
+"x x x x ",
+"xx xx ",
+"x x "
+};
diff --git a/data/pixmaps/rg21/8/notemod-doublesharp.xpm b/data/pixmaps/rg21/8/notemod-doublesharp.xpm
new file mode 100644
index 0000000..8855a27
--- /dev/null
+++ b/data/pixmaps/rg21/8/notemod-doublesharp.xpm
@@ -0,0 +1,22 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"6 14 2 1",
+"x c Gray0",
+" c None",
+/* pixels */
+" ",
+" ",
+" ",
+" ",
+"xx xx",
+"xx xx",
+" xxxx ",
+" xx ",
+" xx ",
+" xxxx ",
+"xx xx",
+"xx xx",
+" ",
+" "
+};
diff --git a/data/pixmaps/rg21/8/notemod-flat.xpm b/data/pixmaps/rg21/8/notemod-flat.xpm
new file mode 100644
index 0000000..a2cd8a7
--- /dev/null
+++ b/data/pixmaps/rg21/8/notemod-flat.xpm
@@ -0,0 +1,22 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"6 14 2 1",
+"x c Gray0",
+" c None",
+/* pixels */
+" x ",
+" x ",
+" x ",
+" x ",
+" x ",
+" x ",
+" x xx ",
+" xxxxx",
+" x xx",
+" x xx",
+" x x ",
+" x x ",
+" xx ",
+" x "
+};
diff --git a/data/pixmaps/rg21/8/notemod-natural.xpm b/data/pixmaps/rg21/8/notemod-natural.xpm
new file mode 100644
index 0000000..c1c43c7
--- /dev/null
+++ b/data/pixmaps/rg21/8/notemod-natural.xpm
@@ -0,0 +1,22 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"6 14 2 1",
+" c Gray0",
+". c None",
+/* pixels */
+". ....",
+". ....",
+". ... ",
+". .. ",
+". ",
+". .. ",
+". ... ",
+". ... ",
+". .. ",
+". ",
+". .. ",
+". ... ",
+"..... ",
+"..... "
+};
diff --git a/data/pixmaps/rg21/8/notemod-sharp.xpm b/data/pixmaps/rg21/8/notemod-sharp.xpm
new file mode 100644
index 0000000..692a75b
--- /dev/null
+++ b/data/pixmaps/rg21/8/notemod-sharp.xpm
@@ -0,0 +1,22 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"6 14 2 1",
+"x c Gray0",
+" c None",
+/* pixels */
+" x ",
+" x x ",
+" x xx",
+" xxxxx",
+"xxxxx ",
+"xx x ",
+" x x ",
+" x x ",
+" x xx",
+" xxxxx",
+"xxxxx ",
+"xx x ",
+" x x ",
+" x "
+};
diff --git a/data/pixmaps/rg21/8/rest-breve.xpm b/data/pixmaps/rg21/8/rest-breve.xpm
new file mode 100644
index 0000000..dfc215e
--- /dev/null
+++ b/data/pixmaps/rg21/8/rest-breve.xpm
@@ -0,0 +1,45 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"6 37 2 1",
+" c Gray0",
+". c None",
+/* pixels */
+"......",
+"......",
+"......",
+"......",
+"......",
+"......",
+"......",
+"......",
+"......",
+" ",
+". .",
+". .",
+". .",
+". .",
+". .",
+". .",
+". .",
+". .",
+" ",
+"......",
+"......",
+"......",
+"......",
+"......",
+"......",
+"......",
+"......",
+"......",
+"......",
+"......",
+"......",
+"......",
+"......",
+"......",
+"......",
+"......",
+"......"
+};
diff --git a/data/pixmaps/rg21/8/rest-crotchet.xpm b/data/pixmaps/rg21/8/rest-crotchet.xpm
new file mode 100644
index 0000000..7c3f8f1
--- /dev/null
+++ b/data/pixmaps/rg21/8/rest-crotchet.xpm
@@ -0,0 +1,45 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"9 37 2 1",
+" c Gray0",
+". c None",
+/* pixels */
+".........",
+".........",
+".........",
+".........",
+".. ......",
+"... .....",
+".... ....",
+".... ...",
+".... ..",
+".... .",
+"... ..",
+"... ...",
+".. ....",
+".. ....",
+". .....",
+". .....",
+" ......",
+". ......",
+".. .....",
+".. .....",
+"... ....",
+".... ....",
+"..... ...",
+".. ..",
+". .",
+" .... ",
+" ......",
+" ......",
+". ......",
+".. ......",
+"... .....",
+".........",
+".........",
+".........",
+".........",
+".........",
+"........."
+};
diff --git a/data/pixmaps/rg21/8/rest-demisemi.xpm b/data/pixmaps/rg21/8/rest-demisemi.xpm
new file mode 100644
index 0000000..31f0f53
--- /dev/null
+++ b/data/pixmaps/rg21/8/rest-demisemi.xpm
@@ -0,0 +1,45 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"12 37 2 1",
+" c Gray0",
+". c None",
+/* pixels */
+"............",
+"............",
+"............",
+"............",
+"... .... ..",
+".. .. ..",
+".. ..",
+"... . ...",
+"........ ...",
+"....... ...",
+"....... ...",
+"....... ....",
+".. ... ....",
+". . ....",
+". ....",
+".. . .....",
+"...... .....",
+"...... .....",
+"..... .....",
+"..... .....",
+". .. ......",
+" ......",
+" ......",
+". . .......",
+".... .......",
+"... ........",
+"... ........",
+"... ........",
+"... ........",
+".. .........",
+".. .........",
+"............",
+"............",
+"............",
+"............",
+"............",
+"............"
+};
diff --git a/data/pixmaps/rg21/8/rest-demisemiquaver.xpm b/data/pixmaps/rg21/8/rest-demisemiquaver.xpm
new file mode 100644
index 0000000..31f0f53
--- /dev/null
+++ b/data/pixmaps/rg21/8/rest-demisemiquaver.xpm
@@ -0,0 +1,45 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"12 37 2 1",
+" c Gray0",
+". c None",
+/* pixels */
+"............",
+"............",
+"............",
+"............",
+"... .... ..",
+".. .. ..",
+".. ..",
+"... . ...",
+"........ ...",
+"....... ...",
+"....... ...",
+"....... ....",
+".. ... ....",
+". . ....",
+". ....",
+".. . .....",
+"...... .....",
+"...... .....",
+"..... .....",
+"..... .....",
+". .. ......",
+" ......",
+" ......",
+". . .......",
+".... .......",
+"... ........",
+"... ........",
+"... ........",
+"... ........",
+".. .........",
+".. .........",
+"............",
+"............",
+"............",
+"............",
+"............",
+"............"
+};
diff --git a/data/pixmaps/rg21/8/rest-hemidemisemi.xpm b/data/pixmaps/rg21/8/rest-hemidemisemi.xpm
new file mode 100644
index 0000000..ced1ff5
--- /dev/null
+++ b/data/pixmaps/rg21/8/rest-hemidemisemi.xpm
@@ -0,0 +1,45 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"12 37 2 1",
+" c Gray0",
+". c None",
+/* pixels */
+".... ..... ",
+"... ... ",
+"... .",
+".... . .",
+"......... .",
+"......... .",
+"......... ..",
+"... ... ..",
+".. .. ..",
+".. ..",
+"... . ...",
+"........ ...",
+"....... ...",
+"....... ...",
+"....... ....",
+".. ... ....",
+". . ....",
+". ....",
+".. . .....",
+"...... .....",
+"...... .....",
+"..... .....",
+"..... .....",
+". .. ......",
+" ......",
+" ......",
+". . .......",
+".... .......",
+"... ........",
+"... ........",
+"... ........",
+"... ........",
+".. .........",
+".. .........",
+"............",
+"............",
+"............"
+};
diff --git a/data/pixmaps/rg21/8/rest-hemidemisemiquaver.xpm b/data/pixmaps/rg21/8/rest-hemidemisemiquaver.xpm
new file mode 100644
index 0000000..ced1ff5
--- /dev/null
+++ b/data/pixmaps/rg21/8/rest-hemidemisemiquaver.xpm
@@ -0,0 +1,45 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"12 37 2 1",
+" c Gray0",
+". c None",
+/* pixels */
+".... ..... ",
+"... ... ",
+"... .",
+".... . .",
+"......... .",
+"......... .",
+"......... ..",
+"... ... ..",
+".. .. ..",
+".. ..",
+"... . ...",
+"........ ...",
+"....... ...",
+"....... ...",
+"....... ....",
+".. ... ....",
+". . ....",
+". ....",
+".. . .....",
+"...... .....",
+"...... .....",
+"..... .....",
+"..... .....",
+". .. ......",
+" ......",
+" ......",
+". . .......",
+".... .......",
+"... ........",
+"... ........",
+"... ........",
+"... ........",
+".. .........",
+".. .........",
+"............",
+"............",
+"............"
+};
diff --git a/data/pixmaps/rg21/8/rest-minim.xpm b/data/pixmaps/rg21/8/rest-minim.xpm
new file mode 100644
index 0000000..b7e3ad5
--- /dev/null
+++ b/data/pixmaps/rg21/8/rest-minim.xpm
@@ -0,0 +1,45 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"9 37 2 1",
+" c Gray0",
+". c None",
+/* pixels */
+".........",
+".........",
+".........",
+".........",
+".........",
+".........",
+".........",
+".........",
+".........",
+".........",
+".........",
+".........",
+".........",
+".........",
+".........",
+". .",
+". .",
+". .",
+" ",
+".........",
+".........",
+".........",
+".........",
+".........",
+".........",
+".........",
+".........",
+".........",
+".........",
+".........",
+".........",
+".........",
+".........",
+".........",
+".........",
+".........",
+"........."
+};
diff --git a/data/pixmaps/rg21/8/rest-quaver.xpm b/data/pixmaps/rg21/8/rest-quaver.xpm
new file mode 100644
index 0000000..13ad886
--- /dev/null
+++ b/data/pixmaps/rg21/8/rest-quaver.xpm
@@ -0,0 +1,45 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"9 37 2 1",
+" c Gray0",
+". c None",
+/* pixels */
+".........",
+".........",
+".........",
+".........",
+".........",
+".........",
+".........",
+".........",
+".........",
+".........",
+".........",
+".........",
+". .... .",
+" .. .",
+" ..",
+". . ..",
+"..... ..",
+"..... ...",
+"..... ...",
+"..... ...",
+".... ....",
+".... ....",
+".... ....",
+"... .....",
+"... .....",
+"... .....",
+".........",
+".........",
+".........",
+".........",
+".........",
+".........",
+".........",
+".........",
+".........",
+".........",
+"........."
+};
diff --git a/data/pixmaps/rg21/8/rest-semibreve.xpm b/data/pixmaps/rg21/8/rest-semibreve.xpm
new file mode 100644
index 0000000..68e41d5
--- /dev/null
+++ b/data/pixmaps/rg21/8/rest-semibreve.xpm
@@ -0,0 +1,45 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"9 37 2 1",
+" c Gray0",
+". c None",
+/* pixels */
+".........",
+".........",
+".........",
+".........",
+".........",
+".........",
+".........",
+".........",
+".........",
+" ",
+". .",
+". .",
+". .",
+".........",
+".........",
+".........",
+".........",
+".........",
+".........",
+".........",
+".........",
+".........",
+".........",
+".........",
+".........",
+".........",
+".........",
+".........",
+".........",
+".........",
+".........",
+".........",
+".........",
+".........",
+".........",
+".........",
+"........."
+};
diff --git a/data/pixmaps/rg21/8/rest-semiquaver.xpm b/data/pixmaps/rg21/8/rest-semiquaver.xpm
new file mode 100644
index 0000000..b01b6c7
--- /dev/null
+++ b/data/pixmaps/rg21/8/rest-semiquaver.xpm
@@ -0,0 +1,45 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"9 37 2 1",
+" c Gray0",
+". c None",
+/* pixels */
+".........",
+".........",
+".........",
+".........",
+".........",
+".........",
+".........",
+".........",
+".........",
+".........",
+".........",
+".........",
+".. .... ",
+". . ",
+". .",
+".. . .",
+"...... .",
+"...... ..",
+"...... ..",
+"...... ..",
+". .. ...",
+" ...",
+" ...",
+". . ....",
+".... ....",
+".... ....",
+"... .....",
+"... .....",
+"... .....",
+".. ......",
+".. ......",
+".. ......",
+".........",
+".........",
+".........",
+".........",
+"........."
+};
diff --git a/data/pixmaps/rg21/8/tail-down-1.xpm b/data/pixmaps/rg21/8/tail-down-1.xpm
new file mode 100644
index 0000000..0dfb657
--- /dev/null
+++ b/data/pixmaps/rg21/8/tail-down-1.xpm
@@ -0,0 +1,22 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"6 14 2 1",
+" c Gray0",
+". c None",
+/* pixels */
+" ....",
+" ...",
+" ..",
+" ..",
+".. .",
+"... .",
+"... .",
+".... .",
+".... ",
+"..... ",
+"..... ",
+"..... ",
+"..... ",
+"..... "
+};
diff --git a/data/pixmaps/rg21/8/tail-down-2.xpm b/data/pixmaps/rg21/8/tail-down-2.xpm
new file mode 100644
index 0000000..75a2b9e
--- /dev/null
+++ b/data/pixmaps/rg21/8/tail-down-2.xpm
@@ -0,0 +1,28 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"6 20 2 1",
+" c Gray0",
+". c None",
+/* pixels */
+" ....",
+" ...",
+" ..",
+" ..",
+".. .",
+"... .",
+" . .",
+" . .",
+" . ",
+" . ",
+".. . ",
+"... ",
+"... ",
+".... ",
+".... .",
+".... ",
+"..... ",
+"..... ",
+"..... ",
+"..... "
+};
diff --git a/data/pixmaps/rg21/8/tail-down-3.xpm b/data/pixmaps/rg21/8/tail-down-3.xpm
new file mode 100644
index 0000000..905855f
--- /dev/null
+++ b/data/pixmaps/rg21/8/tail-down-3.xpm
@@ -0,0 +1,34 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"6 26 2 1",
+" c Gray0",
+". c None",
+/* pixels */
+" ....",
+" ...",
+" ..",
+" ..",
+".. .",
+"... .",
+" . .",
+" . .",
+" . ",
+" . ",
+".. . ",
+"... ",
+" . ",
+" . ",
+" . .",
+" . ",
+".. . ",
+"... ",
+"... ",
+".... ",
+".... .",
+".... ",
+"..... ",
+"..... ",
+"..... ",
+"..... "
+};
diff --git a/data/pixmaps/rg21/8/tail-down-4.xpm b/data/pixmaps/rg21/8/tail-down-4.xpm
new file mode 100644
index 0000000..6ac32d7
--- /dev/null
+++ b/data/pixmaps/rg21/8/tail-down-4.xpm
@@ -0,0 +1,40 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"6 32 2 1",
+" c Gray0",
+". c None",
+/* pixels */
+" ....",
+" ...",
+" ..",
+" ..",
+".. .",
+"... .",
+" . .",
+" . .",
+" . ",
+" . ",
+".. . ",
+"... ",
+" . ",
+" . ",
+" . .",
+" . ",
+".. . ",
+"... ",
+" . ",
+" . ",
+" . .",
+" . ",
+".. . ",
+"... ",
+"... ",
+".... ",
+".... .",
+".... ",
+"..... ",
+"..... ",
+"..... ",
+"..... "
+};
diff --git a/data/pixmaps/rg21/8/tail-up-1.xpm b/data/pixmaps/rg21/8/tail-up-1.xpm
new file mode 100644
index 0000000..d31acb4
--- /dev/null
+++ b/data/pixmaps/rg21/8/tail-up-1.xpm
@@ -0,0 +1,22 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"6 14 2 1",
+" c Gray0",
+". c None",
+/* pixels */
+".... .",
+"..... ",
+"..... ",
+"..... ",
+"..... ",
+".... ",
+".... .",
+"... .",
+"... .",
+".. .",
+" ..",
+" ..",
+" ...",
+" ...."
+};
diff --git a/data/pixmaps/rg21/8/tail-up-2.xpm b/data/pixmaps/rg21/8/tail-up-2.xpm
new file mode 100644
index 0000000..6b9713b
--- /dev/null
+++ b/data/pixmaps/rg21/8/tail-up-2.xpm
@@ -0,0 +1,28 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"6 20 2 1",
+" c Gray0",
+". c None",
+/* pixels */
+".... .",
+"..... ",
+"..... ",
+"..... ",
+"..... ",
+".... .",
+".... ",
+"... ",
+"... ",
+".. . ",
+" . ",
+" . ",
+" . .",
+" . .",
+"... .",
+".. .",
+" ..",
+" ..",
+" ...",
+" ...."
+};
diff --git a/data/pixmaps/rg21/8/tail-up-3.xpm b/data/pixmaps/rg21/8/tail-up-3.xpm
new file mode 100644
index 0000000..3ce76a6
--- /dev/null
+++ b/data/pixmaps/rg21/8/tail-up-3.xpm
@@ -0,0 +1,34 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"6 26 2 1",
+" c Gray0",
+". c None",
+/* pixels */
+".... .",
+"..... ",
+"..... ",
+"..... ",
+"..... ",
+".... .",
+".... ",
+"... ",
+"... ",
+".. . ",
+" . ",
+" . .",
+" . ",
+" . ",
+"... ",
+".. . ",
+" . ",
+" . ",
+" . .",
+" . .",
+"... .",
+".. .",
+" ..",
+" ..",
+" ...",
+" ...."
+};
diff --git a/data/pixmaps/rg21/8/tail-up-4.xpm b/data/pixmaps/rg21/8/tail-up-4.xpm
new file mode 100644
index 0000000..4430e5e
--- /dev/null
+++ b/data/pixmaps/rg21/8/tail-up-4.xpm
@@ -0,0 +1,40 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"6 32 2 1",
+" c Gray0",
+". c None",
+/* pixels */
+".... .",
+"..... ",
+"..... ",
+"..... ",
+"..... ",
+".... .",
+".... ",
+"... ",
+"... ",
+".. . ",
+" . ",
+" . .",
+" . ",
+" . ",
+"... ",
+".. . ",
+" . ",
+" . .",
+" . ",
+" . ",
+"... ",
+".. . ",
+" . ",
+" . ",
+" . .",
+" . .",
+"... .",
+".. .",
+" ..",
+" ..",
+" ...",
+" ...."
+};
diff --git a/data/pixmaps/rg21/8/unknown.xpm b/data/pixmaps/rg21/8/unknown.xpm
new file mode 100644
index 0000000..8698b03
--- /dev/null
+++ b/data/pixmaps/rg21/8/unknown.xpm
@@ -0,0 +1,16 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"6 8 2 1",
+"x c Gray0",
+" c None",
+/* pixels */
+" xxx ",
+" x ",
+" x ",
+" xx ",
+" x ",
+" ",
+" x ",
+" "
+};
diff --git a/data/pixmaps/splash-1.0.png b/data/pixmaps/splash-1.0.png
new file mode 100644
index 0000000..3ea96bb
--- /dev/null
+++ b/data/pixmaps/splash-1.0.png
Binary files differ
diff --git a/data/pixmaps/splash-1.2.3.png b/data/pixmaps/splash-1.2.3.png
new file mode 100644
index 0000000..ce0dedd
--- /dev/null
+++ b/data/pixmaps/splash-1.2.3.png
Binary files differ
diff --git a/data/pixmaps/splash-1.4-1.5.png b/data/pixmaps/splash-1.4-1.5.png
new file mode 100644
index 0000000..f16c568
--- /dev/null
+++ b/data/pixmaps/splash-1.4-1.5.png
Binary files differ
diff --git a/data/pixmaps/splash.png b/data/pixmaps/splash.png
new file mode 100644
index 0000000..fef0347
--- /dev/null
+++ b/data/pixmaps/splash.png
Binary files differ
diff --git a/data/pixmaps/toolbar/accent.xpm b/data/pixmaps/toolbar/accent.xpm
new file mode 100644
index 0000000..7e03ac4
--- /dev/null
+++ b/data/pixmaps/toolbar/accent.xpm
@@ -0,0 +1,21 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"11 8 7 1",
+" c Gray0",
+". c #2a2a2a",
+"X c Gray43",
+"o c #8d8d8d",
+"O c Gray70",
+"+ c Gray84",
+"@ c None",
+/* pixels */
+"@@@@@@@@@@@",
+"@OO@@@@@@@@",
+"@O..Xo@@@@@",
+"@@@+XX.Xo+@",
+"@@@@@@++X o",
+"@@@+XX.Xo+@",
+"@O..Xo@@@@@",
+"@OO@@@@@@@@"
+};
diff --git a/data/pixmaps/toolbar/accidental-doubleflat.xpm b/data/pixmaps/toolbar/accidental-doubleflat.xpm
new file mode 100644
index 0000000..d7aae71
--- /dev/null
+++ b/data/pixmaps/toolbar/accidental-doubleflat.xpm
@@ -0,0 +1,33 @@
+/* XPM */
+static char * basis_6_xpm[] = {
+"22 24 6 1",
+" c None",
+"# c black",
+"+ c #242724",
+"@ c #4D4E4D",
+"- c #6B6D6B",
+". c #848484",
+" ",
+" ",
+" # ",
+" # ",
+" # ",
+" # ",
+" # ",
+" # ",
+" # # # ",
+" # # # ",
+" # # # ",
+" # # # ",
+" # # # ",
+" # # # ",
+" #@#@#@##. # ",
+" #--@#--#+ @#+# ",
+" # @# #+ .##### ",
+" # -@# -#- ###### ",
+" # #-# #- #####. ",
+" #+. #+. .+#@ ",
+" + + ",
+" ",
+" ",
+" "};
diff --git a/data/pixmaps/toolbar/accidental-doublesharp.xpm b/data/pixmaps/toolbar/accidental-doublesharp.xpm
new file mode 100644
index 0000000..1961653
--- /dev/null
+++ b/data/pixmaps/toolbar/accidental-doublesharp.xpm
@@ -0,0 +1,33 @@
+/* XPM */
+static char * basis_6_xpm[] = {
+"22 24 6 1",
+" c None",
+"# c black",
+"+ c #242724",
+"@ c #4D4E4D",
+"- c #6B6D6B",
+". c #848484",
+" ",
+" ",
+" # ",
+" # ",
+" # ",
+" # ",
+" # ",
+" # ",
+" # ",
+" # ",
+" # ",
+" # ",
+" # ",
+" # ",
+" # ",
+" #- -# @#+# ",
+" @@ @@ .##### ",
+" .@. ###### ",
+" @@ @@ #####. ",
+" #- -# .+#@ ",
+" ",
+" ",
+" ",
+" "};
diff --git a/data/pixmaps/toolbar/accidental-flat.xpm b/data/pixmaps/toolbar/accidental-flat.xpm
new file mode 100644
index 0000000..687f915
--- /dev/null
+++ b/data/pixmaps/toolbar/accidental-flat.xpm
@@ -0,0 +1,33 @@
+/* XPM */
+static char * basis_6_xpm[] = {
+"22 24 6 1",
+" c None",
+"# c black",
+"+ c #242724",
+"@ c #4D4E4D",
+"- c #6B6D6B",
+". c #848484",
+" ",
+" ",
+" # ",
+" # ",
+" # ",
+" # ",
+" # ",
+" # ",
+" # # ",
+" # # ",
+" # # ",
+" # # ",
+" # # ",
+" # # ",
+" #@##. # ",
+" #--#+ @#+# ",
+" # #+ .##### ",
+" # -#- ###### ",
+" # #- #####. ",
+" #+. .+#@ ",
+" + ",
+" ",
+" ",
+" "};
diff --git a/data/pixmaps/toolbar/accidental-follow.xpm b/data/pixmaps/toolbar/accidental-follow.xpm
new file mode 100644
index 0000000..0f6e8c2
--- /dev/null
+++ b/data/pixmaps/toolbar/accidental-follow.xpm
@@ -0,0 +1,33 @@
+/* XPM */
+static char * basis_6_xpm[] = {
+"22 24 6 1",
+" c None",
+"# c black",
+"+ c #242724",
+"@ c #4D4E4D",
+"- c #6B6D6B",
+". c #848484",
+" ",
+" ",
+" # ",
+" # ",
+" # ",
+" # ",
+" # ",
+" # ",
+" # ",
+" # ",
+" # ",
+" # ",
+" # ",
+" # ",
+" ## # ",
+" ## @#+# ",
+" ## .##### ",
+" ######## ###### ",
+" ## #####. ",
+" ## .+#@ ",
+" ## ",
+" ",
+" ",
+" "};
diff --git a/data/pixmaps/toolbar/accidental-natural.xpm b/data/pixmaps/toolbar/accidental-natural.xpm
new file mode 100644
index 0000000..8e3acda
--- /dev/null
+++ b/data/pixmaps/toolbar/accidental-natural.xpm
@@ -0,0 +1,33 @@
+/* XPM */
+static char * basis_6_xpm[] = {
+"22 24 6 1",
+" c None",
+"# c black",
+"+ c #242724",
+"@ c #4D4E4D",
+"- c #6B6D6B",
+". c #848484",
+" ",
+" ",
+" # ",
+" # ",
+" # ",
+" # ",
+" # ",
+" # ",
+" # ",
+" # ",
+" # # ",
+" # # ",
+" # # ",
+" # -# # ",
+" #+## # ",
+" #@ # @#+# ",
+" # # .##### ",
+" # # ###### ",
+" # -# #####. ",
+" #+## .+#@ ",
+" #@ # ",
+" # ",
+" # ",
+" # "};
diff --git a/data/pixmaps/toolbar/accidental-none.xpm b/data/pixmaps/toolbar/accidental-none.xpm
new file mode 100644
index 0000000..2eb5c81
--- /dev/null
+++ b/data/pixmaps/toolbar/accidental-none.xpm
@@ -0,0 +1,33 @@
+/* XPM */
+static char * basis_6_xpm[] = {
+"22 24 6 1",
+" c None",
+"# c black",
+"+ c #242724",
+"@ c #4D4E4D",
+"- c #6B6D6B",
+". c #848484",
+" ",
+" ",
+" # ",
+" # ",
+" # ",
+" # ",
+" # ",
+" # ",
+" # ",
+" # ",
+" # ",
+" # ",
+" # ",
+" # ",
+" # ",
+" @#+# ",
+" .##### ",
+" ###### ",
+" #####. ",
+" .+#@ ",
+" ",
+" ",
+" ",
+" "};
diff --git a/data/pixmaps/toolbar/accidental-sharp.xpm b/data/pixmaps/toolbar/accidental-sharp.xpm
new file mode 100644
index 0000000..71b1373
--- /dev/null
+++ b/data/pixmaps/toolbar/accidental-sharp.xpm
@@ -0,0 +1,33 @@
+/* XPM */
+static char * basis_6_xpm[] = {
+"22 24 6 1",
+" c None",
+"# c black",
+"+ c #242724",
+"@ c #4D4E4D",
+"- c #6B6D6B",
+". c #848484",
+" ",
+" ",
+" # ",
+" # ",
+" # ",
+" # ",
+" # ",
+" # ",
+" # ",
+" # ",
+" # # ",
+" # # # ",
+" # # # ",
+" #.## # ",
+" @###+ # ",
+" ##.# @#+# ",
+" # # .##### ",
+" # # ###### ",
+" #.## #####. ",
+" @###+ .+#@ ",
+" ##.# ",
+" # # ",
+" # # ",
+" # "};
diff --git a/data/pixmaps/toolbar/accmenu-doubleflat.xpm b/data/pixmaps/toolbar/accmenu-doubleflat.xpm
new file mode 100644
index 0000000..813f6ea
--- /dev/null
+++ b/data/pixmaps/toolbar/accmenu-doubleflat.xpm
@@ -0,0 +1,31 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"11 17 8 1",
+" c Gray4",
+". c Gray21",
+"X c #515151",
+"o c #727272",
+"O c Gray54",
+"+ c Gray70",
+"@ c #c5c5c5",
+"# c None",
+/* pixels */
+"###########",
+"#@+##O@####",
+"#oo## o####",
+"#oo## +####",
+"#oo## @####",
+"#oo## #####",
+"#oo##.#####",
+"#oo#@ #####",
+"#oo##X#####",
+"#oo@oX#+o+#",
+"#O . +",
+"#oX#X O#X O",
+"#oo#o ##o @",
+"#oo+ X##.+#",
+"#O X@+O.+##",
+"#o.##o +###",
+"#@+##++####"
+};
diff --git a/data/pixmaps/toolbar/accmenu-doublesharp.xpm b/data/pixmaps/toolbar/accmenu-doublesharp.xpm
new file mode 100644
index 0000000..8ecbe47
--- /dev/null
+++ b/data/pixmaps/toolbar/accmenu-doublesharp.xpm
@@ -0,0 +1,20 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"8 8 6 1",
+" c #0e0e0e",
+". c #767676",
+"X c Gray54",
+"o c Gray75",
+"O c Gray80",
+"+ c None",
+/* pixels */
+"++++++++",
+"+O.o+O.O",
+"+X + X",
+"+O . o",
+"+++. .++",
+"+o . o",
+"+X O X",
+"+O.O+o.O"
+};
diff --git a/data/pixmaps/toolbar/accmenu-flat.xpm b/data/pixmaps/toolbar/accmenu-flat.xpm
new file mode 100644
index 0000000..0033ae5
--- /dev/null
+++ b/data/pixmaps/toolbar/accmenu-flat.xpm
@@ -0,0 +1,30 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"7 17 7 1",
+" c #040404",
+". c #282828",
+"X c #6f6f6f",
+"o c #888888",
+"O c #b4b4b4",
+"+ c #c5c5c5",
+"@ c None",
+/* pixels */
+"@@@@@@@",
+"@+O@@@@",
+"@XX@@@@",
+"@XX@@@@",
+"@XX@@@@",
+"@XX@@@@",
+"@XX@@@@",
+"@XX@@@@",
+"@XX@@@@",
+"@XX+XO@",
+"@o +",
+"@o.@O o",
+"@XX@@ O",
+"@XX@Xo@",
+"@XXXO@@",
+"@o O@@@",
+"@OO@@@@"
+};
diff --git a/data/pixmaps/toolbar/accmenu-natural.xpm b/data/pixmaps/toolbar/accmenu-natural.xpm
new file mode 100644
index 0000000..1cd3b38
--- /dev/null
+++ b/data/pixmaps/toolbar/accmenu-natural.xpm
@@ -0,0 +1,31 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"6 19 6 1",
+" c #060606",
+". c #2f2f2f",
+"X c #5f5f5f",
+"o c Gray57",
+"O c Gray84",
+"+ c None",
+/* pixels */
+"++++++",
+"+O++++",
+"+oO+++",
+"+oO+++",
+"+oO+++",
+"+oXo.o",
+"+o o",
+"+o o",
+"+oO+Oo",
+"+oO+Oo",
+"+oO+Oo",
+"+oO+Oo",
+"+o o",
+"+o o",
+"+o.oXo",
+"++++Oo",
+"++++Oo",
+"++++Oo",
+"+++++O"
+};
diff --git a/data/pixmaps/toolbar/accmenu-sharp.xpm b/data/pixmaps/toolbar/accmenu-sharp.xpm
new file mode 100644
index 0000000..d44e4f4
--- /dev/null
+++ b/data/pixmaps/toolbar/accmenu-sharp.xpm
@@ -0,0 +1,34 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"8 20 8 1",
+" c #020202",
+". c #2d2d2d",
+"X c Gray31",
+"o c #777777",
+"O c Gray59",
+"+ c Gray66",
+"@ c #c6c6c6",
+"# c None",
+/* pixels */
+"########",
+"#####@##",
+"##@@#+@#",
+"##@+#+@#",
+"##@+#+@#",
+"##++#+X@",
+"##@Oo o",
+"#@. .@",
+"#o oO@#",
+"#@XO#++#",
+"##@+#+@#",
+"##@+#OX@",
+"##@Oo o",
+"#@. .@",
+"#o oO@#",
+"#@XO#++#",
+"##@+#+@#",
+"##@+#+@#",
+"##@+#@@#",
+"##@@####"
+};
diff --git a/data/pixmaps/toolbar/add_tracks.png b/data/pixmaps/toolbar/add_tracks.png
new file mode 100644
index 0000000..eb7eae3
--- /dev/null
+++ b/data/pixmaps/toolbar/add_tracks.png
Binary files differ
diff --git a/data/pixmaps/toolbar/add_tracks.xpm b/data/pixmaps/toolbar/add_tracks.xpm
new file mode 100644
index 0000000..f7d6f7c
--- /dev/null
+++ b/data/pixmaps/toolbar/add_tracks.xpm
@@ -0,0 +1,70 @@
+/* XPM */
+static char * add_tracks_xpm[] = {
+"22 18 49 1",
+" c None",
+". c #666666",
+"+ c #939393",
+"@ c #FF0400",
+"# c #9E0606",
+"$ c #E6E6E6",
+"% c #C7D485",
+"& c #CBD692",
+"* c #C7D484",
+"= c #C9D58C",
+"- c #B7B7B7",
+"; c #C4C4C4",
+"> c #B2A47B",
+", c #C8BD99",
+"' c #DDBF66",
+") c #D5B760",
+"! c #E2DCCC",
+"~ c #E4C050",
+"{ c #D7AD32",
+"] c #D4CCB8",
+"^ c #CFB459",
+"/ c #DCB73F",
+"( c #E3C666",
+"_ c #F2D76E",
+": c #EDCA4F",
+"< c #D7B344",
+"[ c #B2892D",
+"} c #AA8E58",
+"| c #C8AA50",
+"1 c #ECCB58",
+"2 c #FADC63",
+"3 c #F9D653",
+"4 c #DDB435",
+"5 c #AA8A45",
+"6 c #DBD9D5",
+"7 c #D7AF3B",
+"8 c #F4D150",
+"9 c #F3CC41",
+"0 c #BA8A19",
+"a c #CCB88C",
+"b c #D0A52D",
+"c c #BD9227",
+"d c #B98C25",
+"e c #B38210",
+"f c #9D7829",
+"g c #D2CCC0",
+"h c #99753A",
+"i c #A38A68",
+"j c #DFD9D5",
+"......................",
+".++@#$$.%%%%%%%%%%%%%.",
+".++#@$$.%&*%***%%*%=%.",
+"........-------------.",
+".++;;$$.%%%%%%%%%%%%%.",
+".++;;$$.%%%%%%%%%%%%%.",
+"........-------------.",
+".++;;$$.$$$$$$$$$$$$$.",
+".++;;$$.$$$$$$$$$$$$$.",
+"........----->,------.",
+".++;;$$.$$$$$')$$$$$$.",
+".++;;$$.$$$$!~{]$$$$$.",
+"........--^/(_:<[}---.",
+" |12345 ",
+" 67890 ",
+" abcdea ",
+" afg hi ",
+" j "};
diff --git a/data/pixmaps/toolbar/breve.xpm b/data/pixmaps/toolbar/breve.xpm
new file mode 100644
index 0000000..8483638
--- /dev/null
+++ b/data/pixmaps/toolbar/breve.xpm
@@ -0,0 +1,33 @@
+/* XPM */
+static char * basis_6_xpm[] = {
+"22 24 6 1",
+" c None",
+"# c black",
+"+ c #242724",
+"@ c #4D4E4D",
+"- c #6B6D6B",
+". c #848484",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" # # -####. # # ",
+" # #+#- @#-# # ",
+" # #@# .#@# # ",
+" # #@#. #@# # ",
+" # #-#@ -#+# # ",
+" # # .####- # # ",
+" "};
diff --git a/data/pixmaps/toolbar/button-metronome.png b/data/pixmaps/toolbar/button-metronome.png
new file mode 100644
index 0000000..7c45410
--- /dev/null
+++ b/data/pixmaps/toolbar/button-metronome.png
Binary files differ
diff --git a/data/pixmaps/toolbar/chord.xpm b/data/pixmaps/toolbar/chord.xpm
new file mode 100644
index 0000000..e779785
--- /dev/null
+++ b/data/pixmaps/toolbar/chord.xpm
@@ -0,0 +1,33 @@
+/* XPM */
+static char * basis_6_xpm[] = {
+"22 24 6 1",
+" c None",
+"# c black",
+"+ c #242724",
+"@ c #4D4E4D",
+"- c #6B6D6B",
+". c #848484",
+" ",
+" ",
+" ",
+" # ",
+" # ",
+" # ",
+" # ",
+" # ",
+" # ",
+" # ",
+" # ",
+" # ",
+" # ",
+" @#+# ",
+" .##### ",
+" ###### ",
+" #####@ ",
+" .+@+ # ",
+" +@+# ",
+" .##### ",
+" ###### ",
+" #####. ",
+" .+#@ ",
+" "};
diff --git a/data/pixmaps/toolbar/clef-alto.xpm b/data/pixmaps/toolbar/clef-alto.xpm
new file mode 100644
index 0000000..00827a8
--- /dev/null
+++ b/data/pixmaps/toolbar/clef-alto.xpm
@@ -0,0 +1,57 @@
+/* XPM */
+static char *clef-alto[] = {
+/* width height num_colors chars_per_pixel */
+" 15 31 19 1",
+/* colors */
+". c #000000",
+"# c #a8a8b0",
+"a c #b0b0b0",
+"b c #a8b0a8",
+"c c #a8b0a8",
+"d c #b0acb0",
+"e c #000000",
+"f c #b0acb0",
+"g c #000000",
+"h c None",
+"i c #a8b0a8",
+"j c #a8b0a8",
+"k c #000000",
+"l c #a8b0a8",
+"m c #a8b0a8",
+"n c #000000",
+"o c #a8b0a8",
+"p c None",
+"q c #000000",
+/* pixels */
+"hhhhhhhhhhhhhhh",
+"ppppppppppppppp",
+"hhhhhhhhhhhhhhh",
+"ppppppppppppppp",
+"ddddddddddddddd",
+"ppppppppppppppp",
+"hhhhhhhhiifhhhh",
+"ppa.jklkak.appp",
+"phi.ikg.pp..lhh",
+"mmaejki.kmq.adm",
+"pha.igbkppq.ipp",
+"ppa.ikoqppqelph",
+"hpa.igqeba.iphp",
+"ppa.ae.ajqbphph",
+"oma.i..clbmmmom",
+"hpa.iq.qnqqbhph",
+"ppa.igiqppq.lhp",
+"hpi.ikoippq.aph",
+"pha.igbeapq.aph",
+"mma.ikk.am..lmd",
+"pha.iginbk.aphp",
+"ppliobpbiicppph",
+"hpppppppppphhph",
+"phhhphphpphpphp",
+"dmmdmd#dmomddmd",
+"phhphphphphphph",
+"phphphphphphphp",
+"hphphphphphphph",
+"hphphphphphphph",
+"phphphphphphphp",
+"phphphphphphphp"
+};
diff --git a/data/pixmaps/toolbar/clef-alto.xpm_rg21 b/data/pixmaps/toolbar/clef-alto.xpm_rg21
new file mode 100644
index 0000000..cd6682c
--- /dev/null
+++ b/data/pixmaps/toolbar/clef-alto.xpm_rg21
@@ -0,0 +1,35 @@
+/* XPM */
+static char * clef_alto_xpm[] = {
+"12 29 3 1",
+" c None",
+". c black",
+"x c gray60",
+" ",
+" ",
+" ",
+" ",
+"xxxxxxxxxxxx",
+" . . ... ",
+" . . . . ",
+" . . . .. ",
+" . . . ",
+"x.x.xxxxxx.x",
+" . . . ",
+" . . . .. ",
+" . . .. . ",
+" . . .. . ",
+"x.x...xxxxxx",
+" . . .. . ",
+" . . .. . ",
+" . . . .. ",
+" . . . ",
+"x.x.xxxxxx.x",
+" . . . ",
+" . . . .. ",
+" . . . . ",
+" . . ... ",
+"xxxxxxxxxxxx",
+" ",
+" ",
+" ",
+" "};
diff --git a/data/pixmaps/toolbar/clef-bass.xpm b/data/pixmaps/toolbar/clef-bass.xpm
new file mode 100644
index 0000000..489991f
--- /dev/null
+++ b/data/pixmaps/toolbar/clef-bass.xpm
@@ -0,0 +1,54 @@
+/* XPM */
+static char *clef-bass[] = {
+/* width height num_colors chars_per_pixel */
+" 15 31 16 1",
+/* colors */
+". c #000000",
+"# c #a8b0a8",
+"a c #a8b0a8",
+"b c #b0acb0",
+"c c #b0acb0",
+"d c #000000",
+"e c None",
+"f c #a8b0a8",
+"g c #a8b0a8",
+"h c #000000",
+"i c #a8b0a8",
+"j c #a8b0a8",
+"k c #a8b0a8",
+"l c #b0acb0",
+"m c None",
+"n c #000000",
+/* pixels */
+"eeeeeeeeeeeeeee",
+"mmmmmmmmmmmmmmm",
+"eeeeeeeeeeeeeee",
+"mmmmmmmmmmmmmmm",
+"ccccccccccccccc",
+"mmmmmigfjmmmmmm",
+"eeejhjmb.gejeee",
+"mmmhfmemd.j.fmm",
+"emj..hmei.fijme",
+"kck..nck#.fkkkc",
+"membngemi.fhlem",
+"ememememh.ihgme",
+"memememj.dmmeem",
+"emememen.jeemem",
+"kckckcn.akkkckc",
+"ememjnhemeememe",
+"membhimmemememe",
+"emigmmmemememem",
+"ememeememememem",
+"ckckckckckckckc",
+"mememememememem",
+"emememememememe",
+"emememememememe",
+"mememememememem",
+"ckckckckckckckc",
+"emememememememe",
+"mememememememem",
+"emememememememe",
+"emememememememe",
+"mememememememem",
+"mememememememem"
+};
diff --git a/data/pixmaps/toolbar/clef-bass.xpm_rg21 b/data/pixmaps/toolbar/clef-bass.xpm_rg21
new file mode 100644
index 0000000..21eef58
--- /dev/null
+++ b/data/pixmaps/toolbar/clef-bass.xpm_rg21
@@ -0,0 +1,35 @@
+/* XPM */
+static char * clef_bass_xpm[] = {
+"13 29 3 1",
+" c None",
+". c black",
+"x c gray60",
+" ",
+" ",
+" ",
+" ",
+"xxxxxxxxxxxxx",
+" ... ",
+" .. .. .. ",
+" . .. .. ",
+" . .. ",
+"x..xxxx..xxxx",
+" .. .. ",
+" .. .. ",
+" .. .. ",
+" .. ",
+"xxxxxx..xxxxx",
+" . ",
+" .. ",
+" . ",
+" . ",
+"xxxx.xxxxxxxx",
+" .. ",
+" ",
+" ",
+" ",
+"xxxxxxxxxxxxx",
+" ",
+" ",
+" ",
+" "};
diff --git a/data/pixmaps/toolbar/clef-tenor.xpm b/data/pixmaps/toolbar/clef-tenor.xpm
new file mode 100644
index 0000000..e75422e
--- /dev/null
+++ b/data/pixmaps/toolbar/clef-tenor.xpm
@@ -0,0 +1,56 @@
+/* XPM */
+static char *clef-tenor[] = {
+/* width height num_colors chars_per_pixel */
+" 13 31 18 1",
+/* colors */
+". c #000000",
+"# c #a8a8b0",
+"a c #b0b0b0",
+"b c #a8b0a8",
+"c c #b0acb0",
+"d c #000000",
+"e c #000000",
+"f c #000000",
+"g c None",
+"h c #a8b0a8",
+"i c #a8b0a8",
+"j c #000000",
+"k c #a8b0a8",
+"l c #a8b0a8",
+"m c #000000",
+"n c #a8b0a8",
+"o c None",
+"p c #000000",
+/* pixels */
+"ggggggggggggg",
+"ooooooohhkooo",
+"ga.hjkjaf.agg",
+"oh.hjj.ood.ko",
+"ca.hfh.jlp.ac",
+"oa.hfbjoop.ho",
+"oa.hjnpoop.kg",
+"oadijp.ba.hgo",
+"oa.ad.ahpboog",
+"la.h.dkkblllc",
+"oa.hp.ppmpbog",
+"oa.hfhpoop.kg",
+"gh.hfbiogp.ao",
+"oa.hfbdaop.ag",
+"ladhjfdal.dkl",
+"oadijiebj.ago",
+"gkhbbobihkoog",
+"goooooooooogo",
+"ogoogoogoggog",
+"clcnlcn#clcln",
+"ogoogogogogog",
+"gogogogogogog",
+"ogogogogogogo",
+"gogogogogogog",
+"lclclclclclcl",
+"gogogogogogog",
+"gogogogogogog",
+"ogogogogogogo",
+"ogogogogogogo",
+"gogogogogogog",
+"gogogogogogog"
+};
diff --git a/data/pixmaps/toolbar/clef-tenor.xpm_rg21 b/data/pixmaps/toolbar/clef-tenor.xpm_rg21
new file mode 100644
index 0000000..4deecb2
--- /dev/null
+++ b/data/pixmaps/toolbar/clef-tenor.xpm_rg21
@@ -0,0 +1,35 @@
+/* XPM */
+static char * clef_tenor_xpm[] = {
+"12 29 3 1",
+" c None",
+". c black",
+"x c gray60",
+" . . ... ",
+" . . . . ",
+" . . . .. ",
+" . . . ",
+"x.x.xxxxxx.x",
+" . . . ",
+" . . . .. ",
+" . . .. . ",
+" . . .. . ",
+"x.x...xxxxxx",
+" . . .. . ",
+" . . .. . ",
+" . . . .. ",
+" . . . ",
+"x.x.xxxxxx.x",
+" . . . ",
+" . . . .. ",
+" . . . . ",
+" . . ... ",
+"xxxxxxxxxxxx",
+" ",
+" ",
+" ",
+" ",
+"xxxxxxxxxxxx",
+" ",
+" ",
+" ",
+" "};
diff --git a/data/pixmaps/toolbar/clef-treble.xpm b/data/pixmaps/toolbar/clef-treble.xpm
new file mode 100644
index 0000000..cf4cdcf
--- /dev/null
+++ b/data/pixmaps/toolbar/clef-treble.xpm
@@ -0,0 +1,61 @@
+/* XPM */
+static char *clef-treble[] = {
+/* width height num_colors chars_per_pixel */
+" 13 31 23 1",
+/* colors */
+". c #000000",
+"# c #b0b0b0",
+"a c #a8b0a8",
+"b c #a8b0a8",
+"c c #b0acb0",
+"d c #b0acb0",
+"e c #000000",
+"f c #000000",
+"g c #000000",
+"h c None",
+"i c #a8b0a8",
+"j c #000000",
+"k c #a8b0a8",
+"l c #000000",
+"m c #a8b0a8",
+"n c #a8b0a8",
+"o c #b0acb0",
+"p c #000000",
+"q c #b0a4b0",
+"r c #a8b0a8",
+"s c None",
+"t c #000000",
+"u c #000000",
+/* pixels */
+"shshshshshshh",
+"shshshskshshs",
+"hshshsfeoshsh",
+"shshsc.p.bshs",
+"ndndnpeblidnd",
+"hshskelsifhsh",
+"shshitbsc.shs",
+"hshscemhiushs",
+"shsh#phbetshs",
+"ndndnfniekndn",
+"shshbeltfshsh",
+"hshssqe.bhshs",
+"shshbfebsshsh",
+"shsbf.pshshsh",
+"ndnf.ifbndndn",
+"hsoeiheshshsh",
+"shfebapflahsh",
+"ha.cap.e.ecsh",
+"skpbjfllbl.bs",
+"nk.beknfnnlkd",
+"sbebjlsebsiis",
+"hsjlsflgbhikh",
+"shsflabikalss",
+"hshs#ffeelbsh",
+"ndnrnnb#fnndn",
+"shshshsspshsh",
+"hshiplshlshsh",
+"shspeesskbshs",
+"shspefhsksshs",
+"shso.faoashsh",
+"hshsbkioshhsh"
+};
diff --git a/data/pixmaps/toolbar/clef-treble.xpm_rg21 b/data/pixmaps/toolbar/clef-treble.xpm_rg21
new file mode 100644
index 0000000..6191885
--- /dev/null
+++ b/data/pixmaps/toolbar/clef-treble.xpm_rg21
@@ -0,0 +1,35 @@
+/* XPM */
+static char * clef_treble_xpm[] = {
+"13 29 3 1",
+" c None",
+"# c black",
+"x c gray60",
+" # ",
+" # # ",
+" # # ",
+" # # ",
+"xxxxxx#x#xxxx",
+" # # ",
+" ## ",
+" ## ",
+" ## ",
+"xxxxxx#xxxxxx",
+" # ",
+" ## ",
+" ## ",
+" # # ",
+"xxx#xx##xxxxx",
+" ## # ",
+" # #### ",
+" ## # # ## ",
+" ## # # ## ",
+"x##x##x#xx##x",
+" ## # # ## ",
+" # # ## ",
+" ## # # ",
+" ## # # ",
+"xxxxx####xxxx",
+" # ",
+" ## # ",
+" # # ",
+" ## "};
diff --git a/data/pixmaps/toolbar/continuous-page-mode.xpm b/data/pixmaps/toolbar/continuous-page-mode.xpm
new file mode 100644
index 0000000..3e49e7b
--- /dev/null
+++ b/data/pixmaps/toolbar/continuous-page-mode.xpm
@@ -0,0 +1,98 @@
+/* XPM */
+static char * continuous_page_mode_1_xpm[] = {
+"22 22 73 1",
+" c None",
+". c #FFFFFF",
+"+ c #B1B1B1",
+"@ c #000000",
+"# c #F9F7F0",
+"$ c #F7F3EA",
+"% c #F5F0E4",
+"& c #F3F0E2",
+"* c #F4F0E4",
+"= c #F4F1E4",
+"- c #F4F1E5",
+"; c #F5F2E6",
+"> c #F5F3E7",
+", c #F6F2E8",
+"' c #F5F3E8",
+") c #F6F4E9",
+"! c #F3EEDE",
+"~ c #F4EEDF",
+"{ c #F3EFE0",
+"] c #F3EFE1",
+"^ c #F4F0E3",
+"/ c #F2EBDA",
+"( c #F2EDDB",
+"_ c #F2EDDD",
+": c #F2EDDE",
+"< c #F3EEDF",
+"[ c #F3EEE0",
+"} c #868585",
+"| c #A4A3A3",
+"1 c #A7A6A5",
+"2 c #A7A6A6",
+"3 c #A8A7A7",
+"4 c #A3A2A2",
+"5 c #F0EAD7",
+"6 c #F1EAD8",
+"7 c #F1EBD9",
+"8 c #F7F4EB",
+"9 c #322580",
+"0 c #453A8C",
+"a c #362A83",
+"b c #2C1F7D",
+"c c #DEDEDE",
+"d c #3F3E3E",
+"e c #4D4291",
+"f c #5C539A",
+"g c #1D1D1D",
+"h c #F9F9F8",
+"i c #BDB9D4",
+"j c #44398C",
+"k c #6D66A5",
+"l c #BABAC0",
+"m c #FEFDFC",
+"n c #FBFAFA",
+"o c #E4E2EB",
+"p c #42378A",
+"q c #716AA6",
+"r c #FBFBFA",
+"s c #FFFFFE",
+"t c #564D96",
+"u c #584F98",
+"v c #4B4090",
+"w c #332681",
+"x c #352983",
+"y c #392C85",
+"z c #FEFEFD",
+"A c #7B73AB",
+"B c #665D9F",
+"C c #FEFEFE",
+"D c #FCFCFA",
+"E c #FBFAF9",
+"F c #5E559B",
+"G c #4F4592",
+"H c #FDFDFC",
+" ",
+" .................... ",
+" .........+.......+.. ",
+" .@@@@@@@@@@@@@@@@@@. ",
+" ..#$%+&*=-;>,')+.... ",
+" .@@@@@@@@@@@@@@@@@@. ",
+" ...+!~{]^==-+....... ",
+" .@@@@@@@@@@@@@@@@@@. ",
+" .................... ",
+" .........+.......+.. ",
+" .@@@@@@@@@@@@@@@@@@. ",
+" .....+/(_:!<[]&+.... ",
+" .@@@@@}|123|44}@@@@. ",
+" ...+567890abbc...... ",
+" .@@@@@@d9efbbg@@@@@. ",
+" .......hijkblmm..... ",
+" .......nopqb.rs..m.. ",
+" ......bbjtuvwxy.zm.. ",
+" .......bjABvbb.CDEC. ",
+" ........bFGbb..H.... ",
+" ........ bbb ....... ",
+" b "};
diff --git a/data/pixmaps/toolbar/crotchet.xpm b/data/pixmaps/toolbar/crotchet.xpm
new file mode 100644
index 0000000..d2e1136
--- /dev/null
+++ b/data/pixmaps/toolbar/crotchet.xpm
@@ -0,0 +1,33 @@
+/* XPM */
+static char * basis_6_xpm[] = {
+"22 24 6 1",
+" c None",
+"# c black",
+"+ c #242724",
+"@ c #4D4E4D",
+"- c #6B6D6B",
+". c #848484",
+" ",
+" ",
+" ",
+" ",
+" # ",
+" # ",
+" # ",
+" # ",
+" # ",
+" # ",
+" # ",
+" # ",
+" # ",
+" # ",
+" # ",
+" # ",
+" # ",
+" # ",
+" @#+# ",
+" .##### ",
+" ###### ",
+" #####. ",
+" .+#@ ",
+" "};
diff --git a/data/pixmaps/toolbar/delete-track.png b/data/pixmaps/toolbar/delete-track.png
new file mode 100644
index 0000000..2ddfdef
--- /dev/null
+++ b/data/pixmaps/toolbar/delete-track.png
Binary files differ
diff --git a/data/pixmaps/toolbar/delete_track.png b/data/pixmaps/toolbar/delete_track.png
new file mode 100644
index 0000000..52763c3
--- /dev/null
+++ b/data/pixmaps/toolbar/delete_track.png
Binary files differ
diff --git a/data/pixmaps/toolbar/delete_track.xpm b/data/pixmaps/toolbar/delete_track.xpm
new file mode 100644
index 0000000..2fd5793
--- /dev/null
+++ b/data/pixmaps/toolbar/delete_track.xpm
@@ -0,0 +1,40 @@
+/* XPM */
+static char * delete_track_xpm[] = {
+"22 18 19 1",
+" c None",
+". c #666666",
+"+ c #939393",
+"@ c #FF0400",
+"# c #9E0606",
+"$ c #E6E6E6",
+"% c #C7D485",
+"& c #CBD692",
+"* c #C7D484",
+"= c #C9D58C",
+"- c #B7B7B7",
+"; c #C4C4C4",
+"> c #C1BEBE",
+", c #CF0000",
+"' c #A39C9C",
+") c #C8C5C5",
+"! c #B4B1B1",
+"~ c #927D7D",
+"{ c #DADADA",
+"......................",
+".++@#$$.%%%%%%%%%%%%%.",
+".++#@$$.%&*%***%%*%=%.",
+"........-------------.",
+".++;;$$.%%%%%%%%%%%%%.",
+".++;;$$.%%%%%%%%%%%%%.",
+"........-------------.",
+" ",
+" ",
+" ",
+" >,' ', ",
+" ),,, ',, ",
+" ),,,,, ",
+" ,,, ",
+" ,,,,, ",
+" ',,,,,' ",
+" !,, ),,! ",
+" ~) )~{ "};
diff --git a/data/pixmaps/toolbar/demisemi.xpm b/data/pixmaps/toolbar/demisemi.xpm
new file mode 100644
index 0000000..828e542
--- /dev/null
+++ b/data/pixmaps/toolbar/demisemi.xpm
@@ -0,0 +1,33 @@
+/* XPM */
+static char * basis_6_xpm[] = {
+"22 24 6 1",
+" c None",
+"# c black",
+"+ c #242724",
+"@ c #4D4E4D",
+"- c #6B6D6B",
+". c #848484",
+" ",
+" # ",
+" #@ ",
+" ##@ ",
+" ###@ ",
+" # @@ ",
+" #@ .- ",
+" ##@ . ",
+" ###@ . ",
+" # .@@ . ",
+" #@ .-. ",
+" ##@ . ",
+" ###@ . ",
+" # .@@ . ",
+" # .-. ",
+" # - ",
+" # . ",
+" # . ",
+" @#+# . ",
+" .##### ",
+" ###### ",
+" #####. ",
+" .+#@ ",
+" "};
diff --git a/data/pixmaps/toolbar/dotted-breve.xpm b/data/pixmaps/toolbar/dotted-breve.xpm
new file mode 100644
index 0000000..73c1e88
--- /dev/null
+++ b/data/pixmaps/toolbar/dotted-breve.xpm
@@ -0,0 +1,31 @@
+/* XPM */
+static char * breve_xpm[] = {
+"14 26 2 1",
+" c none",
+". c black",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+". . ... . . ",
+". .. .. . ..",
+". .. .. . ..",
+". . ... . . ",
+" ",
+" ",
+" "};
diff --git a/data/pixmaps/toolbar/dotted-crotchet.xpm b/data/pixmaps/toolbar/dotted-crotchet.xpm
new file mode 100644
index 0000000..2640c7a
--- /dev/null
+++ b/data/pixmaps/toolbar/dotted-crotchet.xpm
@@ -0,0 +1,33 @@
+/* XPM */
+static char * basis_6_xpm[] = {
+"22 24 6 1",
+" c None",
+"# c black",
+"+ c #242724",
+"@ c #4D4E4D",
+"- c #6B6D6B",
+". c #848484",
+" ",
+" ",
+" ",
+" ",
+" # ",
+" # ",
+" # ",
+" # ",
+" # ",
+" # ",
+" # ",
+" # ",
+" # ",
+" # ",
+" # ",
+" # ",
+" # ",
+" # ",
+" @#+# ",
+" .##### ## ",
+" ###### ## ",
+" #####. ",
+" .+#@ ",
+" "};
diff --git a/data/pixmaps/toolbar/dotted-demisemi.xpm b/data/pixmaps/toolbar/dotted-demisemi.xpm
new file mode 100644
index 0000000..47fe2a7
--- /dev/null
+++ b/data/pixmaps/toolbar/dotted-demisemi.xpm
@@ -0,0 +1,33 @@
+/* XPM */
+static char * basis_6_xpm[] = {
+"22 24 6 1",
+" c None",
+"# c black",
+"+ c #242724",
+"@ c #4D4E4D",
+"- c #6B6D6B",
+". c #848484",
+" ",
+" # ",
+" #@ ",
+" ##@ ",
+" ###@ ",
+" # @@ ",
+" #@ .- ",
+" ##@ . ",
+" ###@ . ",
+" # .@@ . ",
+" #@ .-. ",
+" ##@ . ",
+" ###@ . ",
+" # .@@ . ",
+" # .-. ",
+" # - ",
+" # . ",
+" # . ",
+" @#+# . ",
+" .##### ## ",
+" ###### ## ",
+" #####. ",
+" .+#@ ",
+" "};
diff --git a/data/pixmaps/toolbar/dotted-hemidemisemi.xpm b/data/pixmaps/toolbar/dotted-hemidemisemi.xpm
new file mode 100644
index 0000000..2bdca1f
--- /dev/null
+++ b/data/pixmaps/toolbar/dotted-hemidemisemi.xpm
@@ -0,0 +1,31 @@
+/* XPM */
+static char * dotted_hemidemisemi_xpm[] = {
+"14 26 2 1",
+" c none",
+". c black",
+" ",
+" ",
+" ",
+" . ",
+" .. ",
+" .. ",
+" . . ",
+" . . ",
+" .. . ",
+" .. . ",
+" . . ",
+" . . ",
+" .. . ",
+" .. . ",
+" . . ",
+" . . ",
+" .. . ",
+" .. . ",
+" . . ",
+" ..... ",
+" ...... .. ",
+" ...... .. ",
+" .... ",
+" ",
+" ",
+" "};
diff --git a/data/pixmaps/toolbar/dotted-minim.xpm b/data/pixmaps/toolbar/dotted-minim.xpm
new file mode 100644
index 0000000..df331a8
--- /dev/null
+++ b/data/pixmaps/toolbar/dotted-minim.xpm
@@ -0,0 +1,33 @@
+/* XPM */
+static char * basis_6_xpm[] = {
+"22 24 6 1",
+" c None",
+"# c black",
+"+ c #242724",
+"@ c #4D4E4D",
+"- c #6B6D6B",
+". c #848484",
+" ",
+" ",
+" ",
+" ",
+" # ",
+" # ",
+" # ",
+" # ",
+" # ",
+" # ",
+" # ",
+" # ",
+" # ",
+" # ",
+" # ",
+" # ",
+" # ",
+" # ",
+" @#+# ",
+" .#- .# ## ",
+" #- .@ ## ",
+" #. -#. ",
+" .+## ",
+" "};
diff --git a/data/pixmaps/toolbar/dotted-quaver.xpm b/data/pixmaps/toolbar/dotted-quaver.xpm
new file mode 100644
index 0000000..985fe92
--- /dev/null
+++ b/data/pixmaps/toolbar/dotted-quaver.xpm
@@ -0,0 +1,33 @@
+/* XPM */
+static char * basis_6_xpm[] = {
+"22 24 6 1",
+" c None",
+"# c black",
+"+ c #242724",
+"@ c #4D4E4D",
+"- c #6B6D6B",
+". c #848484",
+" ",
+" ",
+" ",
+" # ",
+" #. ",
+" #@ ",
+" ##. ",
+" ##+ ",
+" # .- ",
+" # . ",
+" # . ",
+" # . ",
+" # .. ",
+" # - ",
+" # + ",
+" # + ",
+" # - ",
+" # . ",
+" @#+# ",
+" .##### ## ",
+" ###### ## ",
+" #####. ",
+" .+#@ ",
+" "};
diff --git a/data/pixmaps/toolbar/dotted-rest-breve.xpm b/data/pixmaps/toolbar/dotted-rest-breve.xpm
new file mode 100644
index 0000000..a43eabd
--- /dev/null
+++ b/data/pixmaps/toolbar/dotted-rest-breve.xpm
@@ -0,0 +1,26 @@
+/* XPM */
+static char * rest_breve_xpm[] = {
+"9 21 2 1",
+" c None",
+". c black",
+" ",
+" ",
+" ",
+" ",
+" ",
+"....... ",
+" ... ",
+" ... ..",
+" ... ..",
+" ... ",
+"....... ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" "};
diff --git a/data/pixmaps/toolbar/dotted-rest-crotchet.xpm b/data/pixmaps/toolbar/dotted-rest-crotchet.xpm
new file mode 100644
index 0000000..c6e2e84
--- /dev/null
+++ b/data/pixmaps/toolbar/dotted-rest-crotchet.xpm
@@ -0,0 +1,33 @@
+/* XPM */
+static char * basis_6_xpm[] = {
+"22 24 6 1",
+" c None",
+"# c black",
+"+ c #242724",
+"@ c #4D4E4D",
+"- c #6B6D6B",
+". c #848484",
+" ",
+" ",
+" - ",
+" -- ",
+" #. ",
+" #+ ",
+" .##@ ",
+" ###- ",
+" @##@ ## ",
+" +#. ## ",
+" .# ",
+" @- ",
+" .###. ",
+" +#### ",
+" ##- .. ",
+" +# ",
+" #- ",
+" @ ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" "};
diff --git a/data/pixmaps/toolbar/dotted-rest-demisemi.xpm b/data/pixmaps/toolbar/dotted-rest-demisemi.xpm
new file mode 100644
index 0000000..b3d5668
--- /dev/null
+++ b/data/pixmaps/toolbar/dotted-rest-demisemi.xpm
@@ -0,0 +1,33 @@
+/* XPM */
+static char * basis_6_xpm[] = {
+"22 24 6 1",
+" c None",
+"# c black",
+"+ c #242724",
+"@ c #4D4E4D",
+"- c #6B6D6B",
+". c #848484",
+" ",
+" ",
+" ",
+" #+ ",
+" .#+ .- ",
+" +#+@@ ",
+" @. ",
+" #. ",
+" .#. .@ ## ",
+" ##@ @@ ## ",
+" @#@-# ",
+" .+ ",
+" +@ ",
+" .#+ .# ",
+" ##@.++ ",
+" @##@#@ ",
+" -+ ",
+" #- ",
+" -#. ",
+" -+ ",
+" +- ",
+" @ ",
+" ",
+" "};
diff --git a/data/pixmaps/toolbar/dotted-rest-hemidemisemi.xpm b/data/pixmaps/toolbar/dotted-rest-hemidemisemi.xpm
new file mode 100644
index 0000000..f11dc67
--- /dev/null
+++ b/data/pixmaps/toolbar/dotted-rest-hemidemisemi.xpm
@@ -0,0 +1,26 @@
+/* XPM */
+static char * rest_hemidemisemi_xpm[] = {
+"9 21 2 1",
+" c None",
+". c black",
+" ",
+" ",
+" ",
+" ",
+" .. . ",
+" .... ",
+" . ",
+" . .. ..",
+" ... ..",
+" . ",
+". . ",
+"... ",
+" . ",
+".. ",
+".. ",
+" . ",
+". ",
+". ",
+". ",
+" ",
+" "};
diff --git a/data/pixmaps/toolbar/dotted-rest-minim.xpm b/data/pixmaps/toolbar/dotted-rest-minim.xpm
new file mode 100644
index 0000000..424e42b
--- /dev/null
+++ b/data/pixmaps/toolbar/dotted-rest-minim.xpm
@@ -0,0 +1,33 @@
+/* XPM */
+static char * basis_6_xpm[] = {
+"22 24 6 1",
+" c None",
+"# c black",
+"+ c #242724",
+"@ c #4D4E4D",
+"- c #6B6D6B",
+". c #848484",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ## ",
+" ###### ## ",
+" ###### ",
+" ########## ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" "};
diff --git a/data/pixmaps/toolbar/dotted-rest-quaver.xpm b/data/pixmaps/toolbar/dotted-rest-quaver.xpm
new file mode 100644
index 0000000..c7bcd6a
--- /dev/null
+++ b/data/pixmaps/toolbar/dotted-rest-quaver.xpm
@@ -0,0 +1,33 @@
+/* XPM */
+static char * basis_6_xpm[] = {
+"22 24 6 1",
+" c None",
+"# c black",
+"+ c #242724",
+"@ c #4D4E4D",
+"- c #6B6D6B",
+". c #848484",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" .#+ .# ",
+" ##@.++ ## ",
+" @##@#@ ## ",
+" -+ ",
+" #- ",
+" -#. ",
+" -+ ",
+" +- ",
+" # ",
+" -@ ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" "};
diff --git a/data/pixmaps/toolbar/dotted-rest-semibreve.xpm b/data/pixmaps/toolbar/dotted-rest-semibreve.xpm
new file mode 100644
index 0000000..7e460d8
--- /dev/null
+++ b/data/pixmaps/toolbar/dotted-rest-semibreve.xpm
@@ -0,0 +1,34 @@
+/* XPM */
+static char * basis_6_xpm[] = {
+"22 24 6 1",
+" c None",
+"# c black",
+"+ c #242724",
+"@ c #4D4E4D",
+"- c #6B6D6B",
+". c #848484",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ########## ",
+" ###### ",
+" ###### ",
+" ## ",
+" ## ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" "};
diff --git a/data/pixmaps/toolbar/dotted-rest-semiquaver.xpm b/data/pixmaps/toolbar/dotted-rest-semiquaver.xpm
new file mode 100644
index 0000000..8106327
--- /dev/null
+++ b/data/pixmaps/toolbar/dotted-rest-semiquaver.xpm
@@ -0,0 +1,33 @@
+/* XPM */
+static char * basis_6_xpm[] = {
+"22 24 6 1",
+" c None",
+"# c black",
+"+ c #242724",
+"@ c #4D4E4D",
+"- c #6B6D6B",
+". c #848484",
+" ",
+" ",
+" ",
+" ",
+" ",
+" .#. .@ ",
+" ##@ @@ ",
+" @#@-# ",
+" .+ ## ",
+" +@ ## ",
+" .#+ .# ",
+" ##@.++ ",
+" @##@#@ ",
+" -+ ",
+" #- ",
+" -#. ",
+" -+ ",
+" +- ",
+" @ ",
+" ",
+" ",
+" ",
+" ",
+" "};
diff --git a/data/pixmaps/toolbar/dotted-semibreve.xpm b/data/pixmaps/toolbar/dotted-semibreve.xpm
new file mode 100644
index 0000000..a8dff5a
--- /dev/null
+++ b/data/pixmaps/toolbar/dotted-semibreve.xpm
@@ -0,0 +1,33 @@
+/* XPM */
+static char * basis_6_xpm[] = {
+"22 24 6 1",
+" c None",
+"# c black",
+"+ c #242724",
+"@ c #4D4E4D",
+"- c #6B6D6B",
+". c #848484",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" -####. ",
+" @#- @#- ",
+" +# .#+ ## ",
+" +#. #+ ## ",
+" -#@ -#@ ",
+" .####- ",
+" "};
diff --git a/data/pixmaps/toolbar/dotted-semiquaver.xpm b/data/pixmaps/toolbar/dotted-semiquaver.xpm
new file mode 100644
index 0000000..0734632
--- /dev/null
+++ b/data/pixmaps/toolbar/dotted-semiquaver.xpm
@@ -0,0 +1,33 @@
+/* XPM */
+static char * basis_6_xpm[] = {
+"22 24 6 1",
+" c None",
+"# c black",
+"+ c #242724",
+"@ c #4D4E4D",
+"- c #6B6D6B",
+". c #848484",
+" ",
+" # ",
+" #. ",
+" ## ",
+" ##+ ",
+" # .+ ",
+" #. .- ",
+" #+ - ",
+" ##- .. ",
+" #.@. - ",
+" # - . ",
+" # .- ",
+" # . ",
+" # . ",
+" # - ",
+" # # ",
+" # @ ",
+" # . ",
+" @#+# ",
+" .##### ## ",
+" ###### ## ",
+" #####. ",
+" .+#@ ",
+" "};
diff --git a/data/pixmaps/toolbar/down-bow.xpm b/data/pixmaps/toolbar/down-bow.xpm
new file mode 100644
index 0000000..6826845
--- /dev/null
+++ b/data/pixmaps/toolbar/down-bow.xpm
@@ -0,0 +1,21 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"11 9 6 1",
+" c #010101",
+". c #797979",
+"X c #929292",
+"o c Gray72",
+"O c #d3d3d3",
+"+ c None",
+/* pixels */
+"+++++++++++",
+"+O........O",
+"+X X",
+"+X X",
+"+XXooooooXX",
+"+XO++++++OX",
+"+XO++++++OX",
+"+XO++++++OX",
+"+O++++++++O"
+};
diff --git a/data/pixmaps/toolbar/event-delete.png b/data/pixmaps/toolbar/event-delete.png
new file mode 100644
index 0000000..2cc8f6b
--- /dev/null
+++ b/data/pixmaps/toolbar/event-delete.png
Binary files differ
diff --git a/data/pixmaps/toolbar/event-delete.xpm b/data/pixmaps/toolbar/event-delete.xpm
new file mode 100644
index 0000000..8a771a5
--- /dev/null
+++ b/data/pixmaps/toolbar/event-delete.xpm
@@ -0,0 +1,92 @@
+/* XPM */
+static char * event_delete_xpm[] = {
+"32 32 57 1",
+" c None",
+". c #C40000",
+"+ c #B50000",
+"@ c #F70000",
+"# c #CF0000",
+"$ c #940000",
+"% c #BF0000",
+"& c #B20000",
+"* c #FC0000",
+"= c #D90000",
+"- c #880000",
+"; c #390000",
+"> c #930000",
+", c #BA0000",
+"' c #C60000",
+") c #F00000",
+"! c #BD0000",
+"~ c #540000",
+"{ c #970000",
+"] c #B90000",
+"^ c #6F0000",
+"/ c #BE0000",
+"( c #C30000",
+"_ c #B40000",
+": c #F20000",
+"< c #F40000",
+"[ c #950000",
+"} c #C80000",
+"| c #E60000",
+"1 c #C50000",
+"2 c #6C0000",
+"3 c #9E0000",
+"4 c #C70000",
+"5 c #990000",
+"6 c #A70000",
+"7 c #FD0000",
+"8 c #E00000",
+"9 c #C20000",
+"0 c #B00000",
+"a c #EB0000",
+"b c #B60000",
+"c c #830000",
+"d c #A80000",
+"e c #EA0000",
+"f c #5B0000",
+"g c #F30000",
+"h c #BB0000",
+"i c #5E0000",
+"j c #DC0000",
+"k c #8B0000",
+"l c #FA0000",
+"m c #E40000",
+"n c #9F0000",
+"o c #4B0000",
+"p c #AD0000",
+"q c #450000",
+"r c #460000",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" .+ @# ",
+" $%.& *=-; ",
+" >,'& )!~ ",
+" {].+ ).^ ",
+" $/(_ :.^ ",
+" $!.+ <.^ ",
+" []}=|12 ",
+" 3%445 ",
+" 44'6 ",
+" 789(10 ",
+" *abcd,._ ",
+" 7e]f [!(+ ",
+" ghi $/.& ",
+" *jk $]'& ",
+" lmno {,.+ ",
+" mpq >%( ",
+" r ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" "};
diff --git a/data/pixmaps/toolbar/event-edit-advanced.png b/data/pixmaps/toolbar/event-edit-advanced.png
new file mode 100644
index 0000000..e98b1a0
--- /dev/null
+++ b/data/pixmaps/toolbar/event-edit-advanced.png
Binary files differ
diff --git a/data/pixmaps/toolbar/event-edit-advanced.xpm b/data/pixmaps/toolbar/event-edit-advanced.xpm
new file mode 100644
index 0000000..e040017
--- /dev/null
+++ b/data/pixmaps/toolbar/event-edit-advanced.xpm
@@ -0,0 +1,409 @@
+/* XPM */
+static char * event_edit_advanced_xpm[] = {
+"32 32 374 2",
+" c None",
+". c #868686",
+"+ c #7D7D7D",
+"@ c #777777",
+"# c #6F6F6F",
+"$ c #6A6A6A",
+"% c #676767",
+"& c #656565",
+"* c #626262",
+"= c #606060",
+"- c #585858",
+"; c #515151",
+"> c #4A4A4A",
+", c #484848",
+"' c #C9C9C9",
+") c #939393",
+"! c #7A7A7A",
+"~ c #FFFFFF",
+"{ c #FEFEFE",
+"] c #BABABA",
+"^ c #707070",
+"/ c #6E6E6E",
+"( c #7793C6",
+"_ c #556FD3",
+": c #6D6D6D",
+"< c #718DD5",
+"[ c #6C6C6C",
+"} c #B9B9B9",
+"| c #6B6B6B",
+"1 c #708CD4",
+"2 c #FDFDFD",
+"3 c #546ED1",
+"4 c #708BD3",
+"5 c #696969",
+"6 c #FBFBFB",
+"7 c #FAFAFA",
+"8 c #F9F9F9",
+"9 c #5773D9",
+"0 c #536ECF",
+"a c #536CCE",
+"b c #6E89CF",
+"c c #6F8AD1",
+"d c #6F8BD2",
+"e c #546ED2",
+"f c #686868",
+"g c #F7F7F7",
+"h c #F5F5F5",
+"i c #5B77E1",
+"j c #4B62BA",
+"k c #6D87CC",
+"l c #6C86CB",
+"m c #526BCB",
+"n c #666666",
+"o c #B7B7B7",
+"p c #F4F4F4",
+"q c #DFEDFF",
+"r c #CFDCFF",
+"s c #C2CDF0",
+"t c #55699F",
+"u c #506496",
+"v c #6078B5",
+"w c #4F68C4",
+"x c #4F68C5",
+"y c #6B86CA",
+"z c #6D88CE",
+"A c #B8B8B8",
+"B c #B5B5B5",
+"C c #B2B2B2",
+"D c #E1EEFF",
+"E c #D6E3FF",
+"F c #C1CDF0",
+"G c #A6B0CE",
+"H c #A4AECC",
+"I c #9DA6C2",
+"J c #364787",
+"K c #394A8C",
+"L c #5C72AD",
+"M c #667FC1",
+"N c #6881C4",
+"O c #5068C7",
+"P c #F8F8F8",
+"Q c #B1B1B1",
+"R c #E0EEFF",
+"S c #C3CFF2",
+"T c #B4BEDF",
+"U c #A1ABC8",
+"V c #A0AAC7",
+"W c #8E97B1",
+"X c #3D4C73",
+"Y c #3A496E",
+"Z c #4054A0",
+"` c #637CBB",
+" . c #6780C2",
+".. c #636363",
+"+. c #F2F2F2",
+"@. c #ACB6D6",
+"#. c #ACB6D5",
+"$. c #AFB9D9",
+"%. c #9FA9C6",
+"&. c #666C7E",
+"*. c #13182E",
+"=. c #384569",
+"-. c #5D75B1",
+";. c #FCFCFC",
+">. c #F6F6F6",
+",. c #F1F1F1",
+"'. c #A6B0CF",
+"). c #A7B1CF",
+"!. c #ABB5D4",
+"~. c #ADB8D7",
+"{. c #9BA5C0",
+"]. c #4B505E",
+"^. c #05060C",
+"/. c #1A2240",
+"(. c #404244",
+"_. c #BAC6E8",
+":. c #A2ABC8",
+"<. c #A3ACCA",
+"[. c #A5AFCD",
+"}. c #A8B2D1",
+"|. c #ADB7D7",
+"1. c #777F94",
+"2. c #1E2025",
+"3. c #000000",
+"4. c #838383",
+"5. c #3B3B3B",
+"6. c #9AA4BF",
+"7. c #9AA3BF",
+"8. c #9DA6C3",
+"9. c #A9B3D2",
+"0. c #4F5462",
+"a. c #383838",
+"b. c #5F5F5F",
+"c. c #B6B6B6",
+"d. c #B4B4B4",
+"e. c #B0B0B0",
+"f. c #949DB7",
+"g. c #959EB9",
+"h. c #98A1BD",
+"i. c #9BA5C1",
+"j. c #9EA7C4",
+"k. c #ABB6D5",
+"l. c #828AA2",
+"m. c #1C1E23",
+"n. c #505050",
+"o. c #5D5D5D",
+"p. c #363636",
+"q. c #5E5E5E",
+"r. c #C7C7C7",
+"s. c #9098B2",
+"t. c #8F98B2",
+"u. c #939CB7",
+"v. c #99A2BE",
+"w. c #9FA8C5",
+"x. c #A7B1D0",
+"y. c #A5AECC",
+"z. c #514A3F",
+"A. c #5D5548",
+"B. c #6D6455",
+"C. c #737373",
+"D. c #5C5C5C",
+"E. c #C0CCEF",
+"F. c #8E97B0",
+"G. c #8B94AD",
+"H. c #8E96B0",
+"I. c #919AB4",
+"J. c #97A0BB",
+"K. c #9BA4C0",
+"L. c #A0A9C7",
+"M. c #7C849A",
+"N. c #494D5A",
+"O. c #0F1012",
+"P. c #524B40",
+"Q. c #5F574A",
+"R. c #716758",
+"S. c #373737",
+"T. c #5B5B5B",
+"U. c #C5C5C5",
+"V. c #8C95AE",
+"W. c #939BB6",
+"X. c #99A3BF",
+"Y. c #737A8E",
+"Z. c #1D1F24",
+"`. c #474137",
+" + c #4E473C",
+".+ c #585144",
+"++ c #665E4F",
+"@+ c #786E5D",
+"#+ c #7E7E7E",
+"$+ c #3A3A3A",
+"%+ c #595959",
+"&+ c #C2C2C2",
+"*+ c #8C94AD",
+"=+ c #8D96AF",
+"-+ c #9099B3",
+";+ c #767E93",
+">+ c #101113",
+",+ c #494339",
+"'+ c #575044",
+")+ c #635A4D",
+"!+ c #726858",
+"~+ c #847967",
+"{+ c #766750",
+"]+ c #3D3D3D",
+"^+ c #565656",
+"/+ c #C0C0C0",
+"(+ c #D0DCFF",
+"_+ c #8891A9",
+":+ c #868EA6",
+"<+ c #676D80",
+"[+ c #474B58",
+"}+ c #3F434E",
+"|+ c #353842",
+"1+ c #0E0F11",
+"2+ c #4D463D",
+"3+ c #534C40",
+"4+ c #5B5346",
+"5+ c #655C4E",
+"6+ c #827664",
+"7+ c #928671",
+"8+ c #88755B",
+"9+ c #241D17",
+"0+ c #555555",
+"a+ c #969798",
+"b+ c #B3B3B5",
+"c+ c #86878B",
+"d+ c #4A4D56",
+"e+ c #3A3E49",
+"f+ c #4D4D4D",
+"g+ c #40392F",
+"h+ c #3D372D",
+"i+ c #3F382E",
+"j+ c #423B31",
+"k+ c #473F34",
+"l+ c #4D4538",
+"m+ c #554C3F",
+"n+ c #5F5546",
+"o+ c #6A5E4D",
+"p+ c #4E4539",
+"q+ c #6D5D46",
+"r+ c #272319",
+"s+ c #D5D5D5",
+"t+ c #C6C6C6",
+"u+ c #A4A4A3",
+"v+ c #94928F",
+"w+ c #85827E",
+"x+ c #79756F",
+"y+ c #6F6B63",
+"z+ c #69645B",
+"A+ c #463F33",
+"B+ c #635C50",
+"C+ c #645B4E",
+"D+ c #675E50",
+"E+ c #746A5A",
+"F+ c #7F7462",
+"G+ c #897E6B",
+"H+ c #978A75",
+"I+ c #A3957E",
+"J+ c #B0A189",
+"K+ c #A08866",
+"L+ c #282117",
+"M+ c #E0E0E0",
+"N+ c #D3D3D3",
+"O+ c #A5A4A1",
+"P+ c #96938F",
+"Q+ c #8A8680",
+"R+ c #817C74",
+"S+ c #7A746B",
+"T+ c #766F64",
+"U+ c #51493C",
+"V+ c #756B5D",
+"W+ c #776D5C",
+"X+ c #7B7160",
+"Y+ c #827765",
+"Z+ c #8A7F6B",
+"`+ c #948773",
+" @ c #9E907A",
+".@ c #A99B83",
+"+@ c #B4A48B",
+"@@ c #BEAE94",
+"#@ c #A98D68",
+"$@ c #2A2318",
+"%@ c #4F4F4F",
+"&@ c #DFDFDF",
+"*@ c #D4D4D4",
+"=@ c #B7B7B4",
+"-@ c #AAA8A4",
+";@ c #9F9B95",
+">@ c #969189",
+",@ c #8F897F",
+"'@ c #8B8377",
+")@ c #887F71",
+"!@ c #615747",
+"~@ c #897D6A",
+"{@ c #8D816D",
+"]@ c #918571",
+"^@ c #988B76",
+"/@ c #9F927C",
+"(@ c #A89A83",
+"_@ c #B9A98F",
+":@ c #C2B196",
+"<@ c #C9B89C",
+"[@ c #AE9369",
+"}@ c #2B2418",
+"|@ c #464646",
+"1@ c #E2E2E2",
+"2@ c #D8D8D8",
+"3@ c #CCCCCA",
+"4@ c #C1BEBA",
+"5@ c #B6B2AC",
+"6@ c #ADA79F",
+"7@ c #A59F94",
+"8@ c #A1998C",
+"9@ c #9E9485",
+"0@ c #9D917F",
+"a@ c #706452",
+"b@ c #9E917B",
+"c@ c #A2947E",
+"d@ c #A79982",
+"e@ c #AD9E86",
+"f@ c #BAAA90",
+"g@ c #C0B095",
+"h@ c #C7B69A",
+"i@ c #CCBB9E",
+"j@ c #D2C0A3",
+"k@ c #B49568",
+"l@ c #2C251D",
+"m@ c #3C3C3C",
+"n@ c #B8B4A9",
+"o@ c #B5AEA5",
+"p@ c #AEA79D",
+"q@ c #A79E90",
+"r@ c #A2978A",
+"s@ c #9E9382",
+"t@ c #9B907E",
+"u@ c #978A79",
+"v@ c #958774",
+"w@ c #928570",
+"x@ c #93836E",
+"y@ c #6E6150",
+"z@ c #9B8870",
+"A@ c #9E8B71",
+"B@ c #A18E6F",
+"C@ c #A38C6F",
+"D@ c #A58E70",
+"E@ c #AA916E",
+"F@ c #AD946E",
+"G@ c #B1936D",
+"H@ c #B2966B",
+"I@ c #B59669",
+"J@ c #B7986A",
+"K@ c #2D2519",
+"L@ c #151511",
+"M@ c #2F2720",
+"N@ c #2E2A27",
+"O@ c #2D261E",
+"P@ c #2C2825",
+"Q@ c #282421",
+"R@ c #2A241D",
+"S@ c #2A2723",
+"T@ c #272320",
+"U@ c #27231C",
+"V@ c #26221C",
+"W@ c #26231F",
+"X@ c #27201A",
+"Y@ c #28211A",
+"Z@ c #2C251E",
+"`@ c #29221A",
+" # c #2D261B",
+".# c #2B281C",
+"+# c #2C281C",
+"@# c #2C2519",
+"## c #2D291D",
+"$# c #090905",
+" . + @ # $ % & * = - ; > , , ; ; ; ; ; ; ; ; ; ; ; ",
+" @ ' ' ' ' ' ' ' ' ' ' ' ) ' ' ' ' ' ' ' ' ' ' ' ; ",
+" ! ' ~ ~ ~ ~ ~ ~ ~ ~ { ~ ] ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ' ; ",
+" ^ ' ~ ~ ~ ~ ~ ~ ~ ~ { ~ ] ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ' ; ",
+" / ' ~ ~ ~ ~ ~ ~ ~ ~ { ~ ] ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ' ; ",
+" / ' ~ ~ ~ ~ ~ ~ ~ ~ { ~ ] ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ' ; ( ( _ ",
+" : ' ~ ~ ~ ~ ~ ~ ~ ~ { ~ ] ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ' ; < ( _ _ ",
+" [ ) ] ] ] ] ] ] ] ] } ] ] ] ] ] ] ] ] ] ] ] ] _ < < _ _ ( ",
+" | ' ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ] ~ ~ ~ ~ { { { { { 1 < _ _ ( ( _ ",
+" $ ' ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ] ~ ~ { 2 2 2 2 2 3 4 3 1 1 _ ( _ ",
+" 5 ' ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ] { 2 2 6 7 8 9 0 a b c d 3 e ( _ ",
+" f ' ~ ~ ~ ~ ~ ~ ~ ~ ~ { } 2 6 8 g h i j j k l m a c 4 ( _ ",
+" n ' ~ ~ ~ ~ ~ ~ ~ ~ { 2 o 7 g p q r s t u v w x y z a ( ",
+" n ) ] ] ] ] ] ] ] } A o B C D E F G H I J K L M N O m ",
+" & ' ~ ~ ~ ~ ~ ~ { 2 6 P Q R S T U V V U W X Y Z ` ._ ",
+" ..' ~ ~ ~ ~ { 2 2 7 g +.q S @.#.$.$.V V %.&.*.=.-. ",
+" * ' ~ ~ ~ { 2 ;.8 >.,.R S '.).!.~.$.$.V {.].^./.(. ",
+" * ' ~ ~ { 2 ;.8 h D E _.:.<.[.}.!.$.$.|.1.2.3.4.5. ",
+" = ' ~ { 2 6 P p R S 6.7.8.V <.G 9.~.$.9.0.3.4.! a. ",
+" b.) } A c.d.e.q S f.g.h.i.j.U [.}.!.k.l.m.n.o.[ p. ",
+" q.r.2 7 >.,.R S s.t.u.g.v.i.w.<.[.x.y.0.z.A.B.C.p. ",
+" D.r.7 >.D E E.F.G.H.I.u.J.K.8.U L.M.N.O.P.Q.R.@ S. ",
+" T.U.>.q S t.V.G.G.G.W W.g.h.X.v.Y.Z.`. +.+++@+#+$+ ",
+" %+&+E S F.G.G.G.G.G.*+=+-+-+;+N.>+,+ +'+)+!+~+{+]+ ",
+" ^+/+(+=+_+_+_+_+_+:+<+[+}+|+1+2+ +3+4+5+!+6+7+8+9+ ",
+" 0+a+b+c+d+e+e+e+e+|+1+f+g+h+h+i+j+k+l+m+n+o+p+q+r+ ",
+" - ' ~ s+t+c.u+v+w+x+y+z+A+B+C+D+B.E+F+G+H+I+J+K+L+ ",
+" n.A M+N+U.B O+P+Q+R+S+T+U+V+W+X+Y+Z+`+ @.@+@@@#@$@ ",
+" %@o &@*@r.=@-@;@>@,@'@)@!@~@{@]@^@/@(@J+_@:@<@[@}@ ",
+" |@} 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@D@E@F@G@H@I@J@K@ ",
+" L@M@N@O@P@Q@R@S@T@U@V@W@X@Y@Z@`@ #$@T@.#+#@###K@$# "};
diff --git a/data/pixmaps/toolbar/event-edit.png b/data/pixmaps/toolbar/event-edit.png
new file mode 100644
index 0000000..822ba5a
--- /dev/null
+++ b/data/pixmaps/toolbar/event-edit.png
Binary files differ
diff --git a/data/pixmaps/toolbar/event-edit.xpm b/data/pixmaps/toolbar/event-edit.xpm
new file mode 100644
index 0000000..37302c2
--- /dev/null
+++ b/data/pixmaps/toolbar/event-edit.xpm
Binary files differ
diff --git a/data/pixmaps/toolbar/event-insert-tempo.png b/data/pixmaps/toolbar/event-insert-tempo.png
new file mode 100644
index 0000000..8e69b38
--- /dev/null
+++ b/data/pixmaps/toolbar/event-insert-tempo.png
Binary files differ
diff --git a/data/pixmaps/toolbar/event-insert-timesig.png b/data/pixmaps/toolbar/event-insert-timesig.png
new file mode 100644
index 0000000..c56a31b
--- /dev/null
+++ b/data/pixmaps/toolbar/event-insert-timesig.png
Binary files differ
diff --git a/data/pixmaps/toolbar/event-insert.png b/data/pixmaps/toolbar/event-insert.png
new file mode 100644
index 0000000..03fd5d1
--- /dev/null
+++ b/data/pixmaps/toolbar/event-insert.png
Binary files differ
diff --git a/data/pixmaps/toolbar/eventfilter.xpm b/data/pixmaps/toolbar/eventfilter.xpm
new file mode 100644
index 0000000..d60ae96
--- /dev/null
+++ b/data/pixmaps/toolbar/eventfilter.xpm
@@ -0,0 +1,124 @@
+/* XPM */
+static char * eventfilter_xpm[] = {
+"32 32 89 1",
+" c None",
+". c #000000",
+"+ c #181818",
+"@ c #171717",
+"# c #161616",
+"$ c #959595",
+"% c #ABABAB",
+"& c #C0C0C0",
+"* c #D0D0D0",
+"= c #D1D1D1",
+"- c #D2D2D2",
+"; c #D3D3D3",
+"> c #040404",
+", c #0F0F0F",
+"' c #939393",
+") c #949494",
+"! c #A0A0A0",
+"~ c #A3A3A3",
+"{ c #AFAFAF",
+"] c #BBBBBB",
+"^ c #CACACA",
+"/ c #CECECE",
+"( c #C1C1C1",
+"_ c #070707",
+": c #242424",
+"< c #A6A6A6",
+"[ c #AAAAAA",
+"} c #ADADAD",
+"| c #B7B7B7",
+"1 c #BDBDBD",
+"2 c #C2C2C2",
+"3 c #C5C5C5",
+"4 c #C9C9C9",
+"5 c #CDCDCD",
+"6 c #1F1F1F",
+"7 c #A2A2A2",
+"8 c #A7A7A7",
+"9 c #A9A9A9",
+"0 c #B0B0B0",
+"a c #B6B6B6",
+"b c #BEBEBE",
+"c c #C3C3C3",
+"d c #CCCCCC",
+"e c #060606",
+"f c #757575",
+"g c #9E9E9E",
+"h c #A8A8A8",
+"i c #ACACAC",
+"j c #B3B3B3",
+"k c #B9B9B9",
+"l c #C6C6C6",
+"m c #CBCBCB",
+"n c #BABABA",
+"o c #050505",
+"p c #0B0B0B",
+"q c #828282",
+"r c #B2B2B2",
+"s c #C7C7C7",
+"t c #141414",
+"u c #989898",
+"v c #BFBFBF",
+"w c #101010",
+"x c #1E1E1E",
+"y c #7A7A7A",
+"z c #BCBCBC",
+"A c #565656",
+"B c #020202",
+"C c #5F5F5F",
+"D c #030303",
+"E c #0E0E0E",
+"F c #393939",
+"G c #090909",
+"H c #717171",
+"I c #AEAEAE",
+"J c #C8C8C8",
+"K c #A5A5A5",
+"L c #B1B1B1",
+"M c #888888",
+"N c #CFCFCF",
+"O c #B4B4B4",
+"P c #8B8B8B",
+"Q c #C4C4C4",
+"R c #A1A1A1",
+"S c #9B9B9B",
+"T c #010101",
+"U c #B5B5B5",
+"V c #8D8D8D",
+"W c #868686",
+"X c #898989",
+" ",
+" ",
+" ",
+" ",
+" .......... ",
+" .+@#@$%&*=-;;;.... ",
+" >,.')!~{]&^/=;;;;;;(_.. ",
+" :''!<[}|12345*;;;;;;;;;. ",
+" 6'789%0abc4d/*;;;;;;;;;&e ",
+" .fghi0jk](lm/*;;;;;;;;;no ",
+" .pq!9rak12sd5*;;;;;;;;;.. ",
+" .t'uhan1vl^5=;;;;;;;... ",
+" .w#xy<zb3m*-;;;bAB.. ",
+" .;CDE']l=;;;;...F. ",
+" .;(j.GD.....HI$. ",
+" _&;555ddJ&j{K. ",
+" .;;;;;-4kLM. ",
+" .;;;;N2OP. ",
+" .;/=J|r. ",
+" eNmQ<. ",
+" EccbR. ",
+" >&ckS. ",
+" T2cU). ",
+" .32rV. ",
+" .lvrM. ",
+" .m(UW. ",
+" .=&OW. ",
+" .=]UX. ",
+" .... ",
+" ",
+" ",
+" "};
diff --git a/data/pixmaps/toolbar/eventlist.png b/data/pixmaps/toolbar/eventlist.png
new file mode 100644
index 0000000..21a203d
--- /dev/null
+++ b/data/pixmaps/toolbar/eventlist.png
Binary files differ
diff --git a/data/pixmaps/toolbar/eventlist.xpm b/data/pixmaps/toolbar/eventlist.xpm
new file mode 100644
index 0000000..f985011
--- /dev/null
+++ b/data/pixmaps/toolbar/eventlist.xpm
@@ -0,0 +1,30 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"22 18 6 1",
+"X c #000000",
+"O c #404040",
+". c None",
+"r c #d04040",
+"o c #808080",
+" c None",
+/* pixels */
+" XXXXXXXXXXXXX ",
+" X...........X ",
+" X...........X ",
+" X..XOO.OO...X ",
+" X..Ooo.Oo...X ",
+" X...........X ",
+" X..XOO.OOO..X ",
+" X..Ooo.Ooo..X ",
+" X...........X ",
+" X..XOO..OO..X ",
+" X..Ooo..Oo..X ",
+" X...........X ",
+" X..XOO.OO...X ",
+" X..Ooo.Oo...X ",
+" X...........X ",
+" X...........X ",
+" X...........X ",
+" XXXXXXXXXXXXX "
+};
diff --git a/data/pixmaps/toolbar/group-beam.xpm b/data/pixmaps/toolbar/group-beam.xpm
new file mode 100644
index 0000000..af8fbf0
--- /dev/null
+++ b/data/pixmaps/toolbar/group-beam.xpm
@@ -0,0 +1,33 @@
+/* XPM */
+static char * basis_6_xpm[] = {
+"22 24 6 1",
+" c None",
+"# c black",
+"+ c #242724",
+"@ c #4D4E4D",
+"- c #6B6D6B",
+". c #848484",
+" ",
+" ",
+" ",
+" ######### ",
+" ######### ",
+" # # ",
+" # # ",
+" # # ",
+" # # ",
+" # # ",
+" # # ",
+" # # ",
+" -@## -@## ",
+" +#### +#### ",
+" ##### ##### ",
+" .#@. .#@. ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" "};
diff --git a/data/pixmaps/toolbar/group-chord.xpm b/data/pixmaps/toolbar/group-chord.xpm
new file mode 100644
index 0000000..4248f23
--- /dev/null
+++ b/data/pixmaps/toolbar/group-chord.xpm
@@ -0,0 +1,33 @@
+/* XPM */
+static char * basis_6_xpm[] = {
+"22 24 6 1",
+" c None",
+"# c black",
+"+ c #242724",
+"@ c #4D4E4D",
+"- c #6B6D6B",
+". c #848484",
+" ",
+" # ",
+" # ",
+" # ",
+" # ",
+" # ",
+" # ",
+" # ",
+" -@## ",
+" +#### ",
+" ##### ",
+" .#@.# ",
+" -@## ",
+" +#### ",
+" ##### ",
+" .#@. ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" "};
diff --git a/data/pixmaps/toolbar/group-crescendo.xpm b/data/pixmaps/toolbar/group-crescendo.xpm
new file mode 100644
index 0000000..0177a76
--- /dev/null
+++ b/data/pixmaps/toolbar/group-crescendo.xpm
@@ -0,0 +1,27 @@
+/* XPM */
+static char * basis_6_xpm[] = {
+"22 18 6 1",
+" c None",
+"# c black",
+"+ c #242724",
+"@ c #4D4E4D",
+"- c #6B6D6B",
+". c #848484",
+" ",
+" ",
+" ",
+" ",
+" ",
+" .-### ",
+" .-##-. ",
+" .-##-. ",
+" ###+. ",
+" .-##-. ",
+" .-##-. ",
+" .-### ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" "};
diff --git a/data/pixmaps/toolbar/group-decrescendo.xpm b/data/pixmaps/toolbar/group-decrescendo.xpm
new file mode 100644
index 0000000..f652728
--- /dev/null
+++ b/data/pixmaps/toolbar/group-decrescendo.xpm
@@ -0,0 +1,27 @@
+/* XPM */
+static char * basis_6_xpm[] = {
+"22 18 6 1",
+" c None",
+"# c black",
+"+ c #242724",
+"@ c #4D4E4D",
+"- c #6B6D6B",
+". c #848484",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ###+. ",
+" .-##-. ",
+" .-##-. ",
+" .-### ",
+" .-##-. ",
+" .-##-. ",
+" ###+. ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" "};
diff --git a/data/pixmaps/toolbar/group-grace.xpm b/data/pixmaps/toolbar/group-grace.xpm
new file mode 100644
index 0000000..521c7f8
--- /dev/null
+++ b/data/pixmaps/toolbar/group-grace.xpm
@@ -0,0 +1,33 @@
+/* XPM */
+static char * basis_6_xpm[] = {
+"22 24 6 1",
+" c None",
+"# c black",
+"+ c #242724",
+"@ c #4D4E4D",
+"- c #6B6D6B",
+". c #848484",
+" ",
+" ",
+" -## #. ",
+" @##+@# ## ",
+" #@- # #.- ",
+" # # # @ ",
+" # # # .- ",
+" # @## # @ ",
+" @## #### # # ",
+" #### @#@ # # ",
+" @#@ # -- ",
+" # . ",
+" -@## ",
+" +#### ",
+" ##### ",
+" .#@. ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" "};
diff --git a/data/pixmaps/toolbar/group-ottava.xpm b/data/pixmaps/toolbar/group-ottava.xpm
new file mode 100644
index 0000000..55d5555
--- /dev/null
+++ b/data/pixmaps/toolbar/group-ottava.xpm
@@ -0,0 +1,27 @@
+/* XPM */
+static char * basis_6_xpm[] = {
+"22 18 6 1",
+" c None",
+"# c black",
+"+ c #242724",
+"@ c #4D4E4D",
+"- c #6B6D6B",
+". c #848484",
+" ",
+" ",
+" ",
+" ",
+" ### ",
+" #. -@ ",
+" # #@ ",
+" ##- ## # +# # ",
+" +.#. # -# #- #@ ",
+" ++ # # #- +- # ",
+" # # #-# # +@ ",
+" #. #- #+. # .#+ ",
+" .##@ # .## +# ",
+" ",
+" ",
+" ",
+" ",
+" "};
diff --git a/data/pixmaps/toolbar/group-simple-tuplet.xpm b/data/pixmaps/toolbar/group-simple-tuplet.xpm
new file mode 100644
index 0000000..c82bf8e
--- /dev/null
+++ b/data/pixmaps/toolbar/group-simple-tuplet.xpm
@@ -0,0 +1,33 @@
+/* XPM */
+static char * basis_6_xpm[] = {
+"22 24 6 1",
+" c None",
+"# c black",
+"+ c #242724",
+"@ c #4D4E4D",
+"- c #6B6D6B",
+". c #848484",
+" ",
+" ",
+" ",
+" ############# ",
+" ############# ",
+" # # # ",
+" # # # ",
+" # # # ",
+" # # # ",
+" # # # ",
+" # # # ",
+" # # # ",
+" -@## -@## -@## ",
+" +#### +#### +#### ",
+" ##### ##### ##### ",
+" .#@. .#@. .#@. ",
+" ",
+" #### ",
+" #- ",
+" ##. ",
+" @# ",
+" . @# ",
+" +##. ",
+" "};
diff --git a/data/pixmaps/toolbar/group-slur.xpm b/data/pixmaps/toolbar/group-slur.xpm
new file mode 100644
index 0000000..5760f49
--- /dev/null
+++ b/data/pixmaps/toolbar/group-slur.xpm
@@ -0,0 +1,33 @@
+/* XPM */
+static char * basis_6_xpm[] = {
+"22 24 6 1",
+" c None",
+"# c black",
+"+ c #242724",
+"@ c #4D4E4D",
+"- c #6B6D6B",
+". c #848484",
+" ",
+" ",
+" -+##### ",
+" ############# ",
+" ######@- # ",
+" # # # ",
+" # # # ",
+" # # # ",
+" # # # ",
+" # # # ",
+" # # -@## ",
+" # -@## +#### ",
+" -@## +#### ##### ",
+" +#### ##### .#@. ",
+" ##### .#@. ",
+" .#@. # ",
+" .@ ",
+" # .@ ",
+" .## @+@ ",
+" -####-. ",
+" ",
+" ",
+" ",
+" "};
diff --git a/data/pixmaps/toolbar/group-tuplet.xpm b/data/pixmaps/toolbar/group-tuplet.xpm
new file mode 100644
index 0000000..163e831
--- /dev/null
+++ b/data/pixmaps/toolbar/group-tuplet.xpm
@@ -0,0 +1,33 @@
+/* XPM */
+static char * basis_6_xpm[] = {
+"22 24 6 1",
+" c None",
+"# c black",
+"+ c #242724",
+"@ c #4D4E4D",
+"- c #6B6D6B",
+". c #848484",
+" ",
+" ",
+" ",
+" ############# ",
+" ############# ",
+" # # # ",
+" # # # ",
+" # # # ",
+" # # # ",
+" # # # ",
+" # # # ",
+" # # # ",
+" -@## -@## -@## ",
+" +#### +#### +#### ",
+" ##### ##### ##### ",
+" .#@. .#@. .#@. ",
+" ",
+" ###@ ",
+" .# ",
+" +#- ",
+" # ",
+" ",
+" #. ",
+" "};
diff --git a/data/pixmaps/toolbar/group-unbeam.xpm b/data/pixmaps/toolbar/group-unbeam.xpm
new file mode 100644
index 0000000..00ad0b7
--- /dev/null
+++ b/data/pixmaps/toolbar/group-unbeam.xpm
@@ -0,0 +1,33 @@
+/* XPM */
+static char * basis_6_xpm[] = {
+"22 24 6 1",
+" c None",
+"# c black",
+"+ c #242724",
+"@ c #4D4E4D",
+"- c #6B6D6B",
+". c #848484",
+" ",
+" ",
+" #. #. ",
+" ## ## ",
+" #.- #.- ",
+" # @ # @ ",
+" # .- # .- ",
+" # @ # @ ",
+" # # # # ",
+" # # # # ",
+" # -- # -- ",
+" # . # . ",
+" -@## -@## ",
+" +#### +#### ",
+" ##### ##### ",
+" .#@. .#@. ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" "};
diff --git a/data/pixmaps/toolbar/guitarchord.png b/data/pixmaps/toolbar/guitarchord.png
new file mode 100644
index 0000000..72949fe
--- /dev/null
+++ b/data/pixmaps/toolbar/guitarchord.png
Binary files differ
diff --git a/data/pixmaps/toolbar/hemidemisemi.xpm b/data/pixmaps/toolbar/hemidemisemi.xpm
new file mode 100644
index 0000000..3683ae8
--- /dev/null
+++ b/data/pixmaps/toolbar/hemidemisemi.xpm
@@ -0,0 +1,33 @@
+/* XPM */
+static char * basis_6_xpm[] = {
+"22 24 6 1",
+" c None",
+"# c black",
+"+ c #242724",
+"@ c #4D4E4D",
+"- c #6B6D6B",
+". c #848484",
+" # ",
+" #@ ",
+" ##@ ",
+" ###@ ",
+" # @@ ",
+" #@ .- ",
+" ##@ . ",
+" ###@ . ",
+" # @@ . ",
+" #@ .- ",
+" ##@ . ",
+" ###@ . ",
+" # .@@ . ",
+" #@ .-. ",
+" ##@ - ",
+" ###@ . ",
+" # .@@ . ",
+" # .-. ",
+" @#+# - ",
+" .##### . ",
+" ###### . ",
+" #####. . ",
+" .+#@ ",
+" "};
diff --git a/data/pixmaps/toolbar/insert_audio_into_track.xpm b/data/pixmaps/toolbar/insert_audio_into_track.xpm
new file mode 100644
index 0000000..89eb1cc
--- /dev/null
+++ b/data/pixmaps/toolbar/insert_audio_into_track.xpm
@@ -0,0 +1,60 @@
+/* XPM */
+static char * insert_audio_into_track_xpm[] = {
+"22 18 39 1",
+" c None",
+". c #666666",
+"+ c #939393",
+"@ c #FF0400",
+"# c #9E0606",
+"$ c #E6E6E6",
+"% c #C7D485",
+"& c #CBD692",
+"* c #C7D484",
+"= c #C9D58C",
+"- c #B7B7B7",
+"; c #C4C4C4",
+"> c #6D8516",
+", c #B6B6B7",
+"' c #A9A9B8",
+") c #B4B4B7",
+"! c #605DEA",
+"~ c #4541D0",
+"{ c #6A67F4",
+"] c #5D5AE7",
+"^ c #4B47D6",
+"/ c #6865F2",
+"( c #5D59E7",
+"_ c #4D49D7",
+": c #6B68F5",
+"< c #6864F2",
+"[ c #4B48D6",
+"} c #625EEC",
+"| c #5956E3",
+"1 c #3734C2",
+"2 c #403CCB",
+"3 c #6360ED",
+"4 c #3D3AC8",
+"5 c #5F5CE9",
+"6 c #4340CE",
+"7 c #5D5AE8",
+"8 c #4A47D5",
+"9 c #6966F3",
+"0 c #5E5AE8",
+"......................",
+".++@#$$.%%%%%%%%%%%%%.",
+".++#@$$.%&*%***%%*%=%.",
+"........-------------.",
+".++;;$$.>>>>>>>>>>>>>.",
+".++;;$$.>>>>>>>>>>>>>.",
+"........----,-')-----.",
+" !~ ",
+" {{]^ ",
+" {{{/(_ ",
+" {{:::<][ ",
+" {{{::{}/|1 ",
+" ::{2 ",
+" {:34 ",
+" {:56 ",
+" ::78 ",
+" {:90 ",
+" {:{/ "};
diff --git a/data/pixmaps/toolbar/join.xpm b/data/pixmaps/toolbar/join.xpm
new file mode 100644
index 0000000..4e9c3d4
--- /dev/null
+++ b/data/pixmaps/toolbar/join.xpm
@@ -0,0 +1,36 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"22 22 8 1",
+" c Gray0",
+". c #080000",
+"X c #5d0000",
+"o c #c5d37d",
+"O c #8c0800",
+"+ c #c57dd3",
+"@ c Gray100",
+"# c None",
+/* pixels */
+"######################",
+"######################",
+"######################",
+"######################",
+"## ##",
+"## ++++++ oooooooo ##",
+"## +++++++ ooooooo ##",
+"## ++++++++ oooooo ##",
+"## +++++++++ ooooo ##",
+"## ++++++++ oooooo ##",
+"## +++++++ ooooooo ##",
+"## ++++++ oooooooo ##",
+"## +++++ ooooooooo ##",
+"## ++++++ oooooooo ##",
+"## +++++++ ooooooo ##",
+"## ++++++++ oooooo ##",
+"## ##",
+"######################",
+"######################",
+"######################",
+"######################",
+"######################"
+};
diff --git a/data/pixmaps/toolbar/key-green.png b/data/pixmaps/toolbar/key-green.png
new file mode 100644
index 0000000..42c39e8
--- /dev/null
+++ b/data/pixmaps/toolbar/key-green.png
Binary files differ
diff --git a/data/pixmaps/toolbar/key-white.png b/data/pixmaps/toolbar/key-white.png
new file mode 100644
index 0000000..d5098c5
--- /dev/null
+++ b/data/pixmaps/toolbar/key-white.png
Binary files differ
diff --git a/data/pixmaps/toolbar/linear-layout.xpm b/data/pixmaps/toolbar/linear-layout.xpm
new file mode 100644
index 0000000..7fdbfa0
--- /dev/null
+++ b/data/pixmaps/toolbar/linear-layout.xpm
@@ -0,0 +1,41 @@
+/* XPM */
+static char * linear_layout_1_xpm[] = {
+"22 22 16 1",
+" c None",
+". c #FFFFFF",
+"+ c #F8F7EF",
+"@ c #B1B1B1",
+"# c #000000",
+"$ c #F6F5ED",
+"% c #F6F6ED",
+"& c #F7F7EE",
+"* c #F4F3EA",
+"= c #F6F4EB",
+"- c #F6F5EC",
+"; c #F7F6EE",
+"> c #F2F2F7",
+", c #AFAACD",
+"' c #FCFCFD",
+") c #2C1F7D",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ....................+",
+" .........@.......@..+",
+" .####################",
+" .....@.........@$%&++",
+" .####################",
+" ...@........@**=-%;&+",
+" .####################",
+" .....................",
+" .............>,'.....",
+" )) ",
+" ))))) )))) ",
+" ))))))))))))))) ",
+" ))))))))))))))) ",
+" )))) ))) ",
+" )) ",
+" "};
diff --git a/data/pixmaps/toolbar/manage-audio-segments.png b/data/pixmaps/toolbar/manage-audio-segments.png
new file mode 100644
index 0000000..27f70df
--- /dev/null
+++ b/data/pixmaps/toolbar/manage-audio-segments.png
Binary files differ
diff --git a/data/pixmaps/toolbar/manage-audio-segments.xpm b/data/pixmaps/toolbar/manage-audio-segments.xpm
new file mode 100644
index 0000000..e3a922a
--- /dev/null
+++ b/data/pixmaps/toolbar/manage-audio-segments.xpm
@@ -0,0 +1,33 @@
+/* XPM */
+static char * manage_audio_segments_xpm[] = {
+"22 22 8 1",
+" c None",
+"# c #000000",
+"@ c #a0a0a0",
+"b c #a0a0f0",
+"x c #d0d0d0",
+"% c #C7D485",
+"- c #B7B7B7",
+". c #666666",
+" # ",
+" # @ ",
+" # # # ",
+" # ##@ #x ",
+" #@###@x#@ x ",
+" ####@##@#@##@### ",
+" # #@@##@# # ",
+" # ## # ",
+" @ # ",
+" # ",
+" x ",
+" ",
+" .--------------. ",
+" .%%%%%%%%%%%%%%. ",
+" .%%%%%%%%%%%%%%. ",
+" .--------------. ",
+" .%%%%%%%%%%%%%%. ",
+" .%%%%%%%%%%%%%%. ",
+" .--------------. ",
+" ",
+" ",
+" "};
diff --git a/data/pixmaps/toolbar/manage-midi-devices.xpm b/data/pixmaps/toolbar/manage-midi-devices.xpm
new file mode 100644
index 0000000..e765c19
--- /dev/null
+++ b/data/pixmaps/toolbar/manage-midi-devices.xpm
@@ -0,0 +1,248 @@
+/* XPM */
+static char * manage_midi_devices1_2_xpm[] = {
+"22 22 223 2",
+" c None",
+". c #020200",
+"+ c #000000",
+"@ c #080B00",
+"# c #171F02",
+"$ c #354705",
+"% c #273504",
+"& c #63830E",
+"* c #749211",
+"= c #6E8A10",
+"- c #85A614",
+"; c #A5C02E",
+"> c #C1D450",
+", c #B6CC41",
+"' c #BAD046",
+") c #C6DE44",
+"! c #090909",
+"~ c #314306",
+"{ c #44580B",
+"] c #647C1A",
+"^ c #5C7415",
+"/ c #6C8222",
+"( c #7A9125",
+"_ c #C5DD4E",
+": c #B1CC39",
+"< c #BAD439",
+"[ c #BDDB32",
+"} c #FFFFFF",
+"| c #020202",
+"1 c #DADADA",
+"2 c #050505",
+"3 c #B4B4B4",
+"4 c #C4C4C4",
+"5 c #020400",
+"6 c #181D09",
+"7 c #A7C087",
+"8 c #4D7113",
+"9 c #5A7D16",
+"0 c #AED027",
+"a c #788F24",
+"b c #7D9628",
+"c c #8FE31B",
+"d c #93D318",
+"e c #8CDB16",
+"f c #89E917",
+"g c #010101",
+"h c #D2D2D2",
+"i c #D7D7D7",
+"j c #0A0E01",
+"k c #1E260C",
+"l c #EFF2EA",
+"m c #3C5A07",
+"n c #60801E",
+"o c #799023",
+"p c #799124",
+"q c #99FF00",
+"r c #A4C91D",
+"s c #ADD31E",
+"t c #A5D91D",
+"u c #030303",
+"v c #FCFCFC",
+"w c #D5D5D5",
+"x c #050800",
+"y c #090C04",
+"z c #426208",
+"A c #577512",
+"B c #799123",
+"C c #7A9124",
+"D c #84EC15",
+"E c #8EE518",
+"F c #FDFDFD",
+"G c #E7E7E7",
+"H c #040600",
+"I c #0E1106",
+"J c #3D6006",
+"K c #537211",
+"L c #789023",
+"M c #829C24",
+"N c #A4C81A",
+"O c #A3C712",
+"P c #7FEF15",
+"Q c #FEFEFE",
+"R c #040404",
+"S c #DEDEDE",
+"T c #010100",
+"U c #1A2010",
+"V c #3D6306",
+"W c #517012",
+"X c #788F23",
+"Y c #7A941D",
+"Z c #A6D519",
+"` c #93E10D",
+" . c #A9D41D",
+".. c #090C00",
+"+. c #080808",
+"@. c #0C0C0C",
+"#. c #EEEEEE",
+"$. c #161B0B",
+"%. c #3E6306",
+"&. c #5B7516",
+"*. c #7B9420",
+"=. c #7E991D",
+"-. c #95E018",
+";. c #92E114",
+">. c #AADE12",
+",. c #131B01",
+"'. c #202020",
+"). c #F5F5F5",
+"!. c #0E1206",
+"~. c #426809",
+"{. c #5E7B1A",
+"]. c #80981F",
+"^. c #829A21",
+"/. c #85E815",
+"(. c #A7D51C",
+"_. c #343534",
+":. c #2A2B2A",
+"<. c #393A39",
+"[. c #4B4B4B",
+"}. c #232423",
+"|. c #45640B",
+"1. c #718D1F",
+"2. c #809D18",
+"3. c #809F18",
+"4. c #AED21F",
+"5. c #AACE1D",
+"6. c #80ED15",
+"7. c #ACD21E",
+"8. c #020300",
+"9. c #FBFBFB",
+"0. c #FBFBF9",
+"a. c #F9F9F5",
+"b. c #F5F7EE",
+"c. c #EEF1DF",
+"d. c #E3E8C7",
+"e. c #D8E0AD",
+"f. c #D3DF9A",
+"g. c #B6CB5A",
+"h. c #ADC63C",
+"i. c #A7D324",
+"j. c #8BAE13",
+"k. c #AFD31F",
+"l. c #B7D343",
+"m. c #ABD01E",
+"n. c #82F609",
+"o. c #C0DB16",
+"p. c #233003",
+"q. c #F5F5F2",
+"r. c #E9EEDB",
+"s. c #E1EABB",
+"t. c #CDE17A",
+"u. c #BBD64E",
+"v. c #B4D042",
+"w. c #ADCF24",
+"x. c #91E516",
+"y. c #97C016",
+"z. c #AFD322",
+"A. c #B9D633",
+"B. c #AED531",
+"C. c #86FD03",
+"D. c #C6DE16",
+"E. c #141B01",
+"F. c #070A01",
+"G. c #E5E5E5",
+"H. c #DCDCDC",
+"I. c #F6F6F6",
+"J. c #DCDED3",
+"K. c #CFD8A8",
+"L. c #C9DE74",
+"M. c #BCE130",
+"N. c #A7E415",
+"O. c #87FF00",
+"P. c #8FD215",
+"Q. c #BADE25",
+"R. c #B2DC40",
+"S. c #7FF111",
+"T. c #E1EC0C",
+"U. c #2B3D06",
+"V. c #848484",
+"W. c #1B210C",
+"X. c #1E270A",
+"Y. c #1C2704",
+"Z. c #1F2A04",
+"`. c #1F2A05",
+" + c #1A2304",
+".+ c #141B03",
+"++ c #0E1302",
+"@+ c #3F5109",
+"#+ c #A6D715",
+"$+ c #B4E40E",
+"%+ c #CAE30A",
+"&+ c #C2D127",
+"*+ c #C6D90A",
+"=+ c #A6D433",
+"-+ c #A4E43E",
+";+ c #86FD02",
+">+ c #F9F905",
+",+ c #3C4911",
+"'+ c #6B720A",
+")+ c #BBC616",
+"!+ c #C7CB25",
+"~+ c #CED28A",
+"{+ c #E0E305",
+"]+ c #C8CF91",
+"^+ c #C8CE04",
+"/+ c #C0DC8F",
+"(+ c #DEE004",
+"_+ c #BCDC72",
+":+ c #FAFF00",
+"<+ c #475F0C",
+"[+ c #686638",
+"}+ c #FCF8AF",
+"|+ c #F6FF00",
+"1+ c #839715",
+"2+ c #18180D",
+"3+ c #CCD200",
+"4+ c #141300",
+"5+ c #C7CE00",
+"6+ c #272609",
+"7+ c #0C0B00",
+"8+ c #CDDC00",
+"9+ c #87933E",
+"0+ c #809420",
+" ",
+" ",
+" . + @ # + $ % % + % + + ",
+" & * = - - - ; > , ' ) + ",
+"+ + + + + ! + + + + + ~ { ] ^ / ( _ : < [ + ",
+"+ } + | 1 + 2 3 4 5 6 7 8 9 0 a b c d e f + ",
+"+ } + + } + g h i j k l m n 0 o p q r s t + ",
+"+ } + + } + u v w x y } z A 0 B C q q D E + ",
+"+ F + + } + u } G H I } J K 0 L M q N O P + ",
+"+ Q + + } + R } S T U } V W 0 X Y q Z ` ...",
+"+ } + +.F + @.} #.+ $.} %.&.0 *.=.q -.;.>.,.",
+"+ } + R F + '.} ).+ !.Q ~.{.0 ].^.P P /.(.+ ",
+"+ } _.:.Q <.[.} } T }.Q |.1.0 2.3.4.5.6.7.+ ",
+"8.} } F 9.0.a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.",
+"H F } } } Q v q.r.s.t.u.v.w.x.y.z.A.B.C.D.E.",
+"F.1 } G.H.} I.J.K.L.M.N.P O.O.P.P Q.R.S.T.U.",
+"V.W.X.Y.Z.`. +.+++@+#+$+%+&+*+=+q -+q ;+>+,+",
+" '+)+!+~+{+]+^+/+(+_+:+<+",
+" [+}+} |+} |+} |+} } 1+",
+" 2+3+4+5+6+3+7+8+9+0+",
+" ",
+" "};
diff --git a/data/pixmaps/toolbar/manage-synth-plugins.png b/data/pixmaps/toolbar/manage-synth-plugins.png
new file mode 100644
index 0000000..f618822
--- /dev/null
+++ b/data/pixmaps/toolbar/manage-synth-plugins.png
Binary files differ
diff --git a/data/pixmaps/toolbar/manage-synth-plugins.xpm b/data/pixmaps/toolbar/manage-synth-plugins.xpm
new file mode 100644
index 0000000..4ea96e2
--- /dev/null
+++ b/data/pixmaps/toolbar/manage-synth-plugins.xpm
@@ -0,0 +1,112 @@
+/* XPM */
+static char * manage_synth_plugins1_xpm[] = {
+"23 22 87 1",
+" c None",
+". c #FF6D0B",
+"+ c #AA8974",
+"@ c #9E9FA1",
+"# c #A8A9AB",
+"$ c #ACADAE",
+"% c #909195",
+"& c #FFCAAA",
+"* c #EF4D45",
+"= c #9D9EA0",
+"- c #ADADAF",
+"; c #D6D6D8",
+"> c #B8B9BB",
+", c #FF944C",
+"' c #C3D0F9",
+") c #C3D1FE",
+"! c #BFCEFD",
+"~ c #B6C3EF",
+"{ c #F11B10",
+"] c #A6A7A9",
+"^ c #D2DAF1",
+"/ c #A6B0D1",
+"( c #C3C4C5",
+"_ c #FFB5A1",
+": c #C5D1FB",
+"< c #EAEEFF",
+"[ c #D5DEFF",
+"} c #BFCEFE",
+"| c #B3C0EB",
+"1 c #9CA0AE",
+"2 c #BAC9FA",
+"3 c #C2D0FE",
+"4 c #D5DEFE",
+"5 c #C2CDF0",
+"6 c #C1CFFF",
+"7 c #B9C8F9",
+"8 c #CBD4F1",
+"9 c #CBD7FD",
+"0 c #BECDFC",
+"a c #C8D4F9",
+"b c #000000",
+"c c #ADBAE3",
+"d c #B9C8F8",
+"e c #DC0A00",
+"f c #C1CDF6",
+"g c #BFCDFE",
+"h c #B6C1E7",
+"i c #BECDFD",
+"j c #C0CEFE",
+"k c #9AA2C2",
+"l c #6F6F70",
+"m c #A1ABCD",
+"n c #B0BCE1",
+"o c #B7C5F3",
+"p c #B6C4F3",
+"q c #B3B5B6",
+"r c #A9B4D5",
+"s c #ADAFB2",
+"t c #9EA2B0",
+"u c #989CA9",
+"v c #D0B9BC",
+"w c #ADB3C6",
+"x c #B0B7CE",
+"y c #D0CEE4",
+"z c #120000",
+"A c #BCCBFC",
+"B c #A9B3D2",
+"C c #AAAAAC",
+"D c #C2D1FD",
+"E c #6A6A6A",
+"F c #C1CFFE",
+"G c #9FA2AC",
+"H c #8B8B8D",
+"I c #C1CFFD",
+"J c #BCC6E3",
+"K c #BAC5E8",
+"L c #C0CFFF",
+"M c #BBC9F8",
+"N c #C3D1FF",
+"O c #C6D3FF",
+"P c #C2D1FF",
+"Q c #B7C5F4",
+"R c #BAC9F9",
+"S c #BBCAFB",
+"T c #A9AEBF",
+"U c #A8B1CE",
+"V c #A5AECA",
+" ",
+" ...+ @#$% ",
+" ..&&**.+ =-;;;;>% ",
+" .,')!~{. ]^')!/;( ",
+" ._:<<[}|{+ 1;:<<[}/2# ",
+" .&3<4567{. 1;3<896/[1 ",
+" .&0[abcde. 1;0[bfg%[% ",
+" .&hij/bke+ l;/bmi2%2% ",
+" _,&nopmbe lqbr/%%21 ",
+" __stuee+ l1;[221% ",
+" +%%+ 111% ",
+" ..._ ...+ ",
+" .._*b_++ ..*{{{.+ ",
+" .,vwbx1+ .*')!~{. ",
+" ._y<mzABC+ ._:<<[}|{+ ",
+" ._D<wEFdGH .&3<4567{. ",
+" .&I[JKL7GH .&0[abcde. ",
+" .&MNOPAQGH .&hij/bke+ ",
+" _,&RS2dG1 _,&nopmbe ",
+" ._TUVGH+ __stuee+ ",
+" HHH+ +%%+ ",
+" "};
diff --git a/data/pixmaps/toolbar/marcato.xpm b/data/pixmaps/toolbar/marcato.xpm
new file mode 100644
index 0000000..fda4e01
--- /dev/null
+++ b/data/pixmaps/toolbar/marcato.xpm
@@ -0,0 +1,22 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"8 8 8 1",
+" c Gray2",
+". c Gray21",
+"X c Gray36",
+"o c #6d6d6d",
+"O c #888888",
+"+ c Gray70",
+"@ c #d2d2d2",
+"# c None",
+/* pixels */
+"########",
+"####O###",
+"###+ +##",
+"###. .##",
+"##@X @#",
+"##X@o X#",
+"#+o#@ @",
+"#+@##Oo+"
+};
diff --git a/data/pixmaps/toolbar/matrix-percussion.png b/data/pixmaps/toolbar/matrix-percussion.png
new file mode 100644
index 0000000..e0d1929
--- /dev/null
+++ b/data/pixmaps/toolbar/matrix-percussion.png
Binary files differ
diff --git a/data/pixmaps/toolbar/matrix-percussion.xpm b/data/pixmaps/toolbar/matrix-percussion.xpm
new file mode 100644
index 0000000..c8d16c2
--- /dev/null
+++ b/data/pixmaps/toolbar/matrix-percussion.xpm
@@ -0,0 +1,36 @@
+/* XPM */
+static char * matrix_xpm[] = {
+"22 18 15 1",
+" c None",
+". c #000000",
+"+ c #C0C0C0",
+"@ c #808080",
+"# c #D04040",
+"$ c #B46600",
+"% c #FFF2B6",
+"& c #DEB527",
+"* c #900000",
+"= c #FBCE05",
+"- c #633800",
+"; c #DE910D",
+"> c #8F7311",
+", c #D0A040",
+"' c #996B1C",
+" ",
+" ................. ",
+" ++@+++@+++@+++@++ ",
+" . ",
+" .#. ... ",
+" . .###.$%&. ",
+" .#*...*#*.$&$. ",
+" .##*$%=.* .&$$. ",
+" .#*$&=. .&-.. ",
+" . ..;$&>.;-. ",
+" .,. ...&&-. ",
+" .,,,. .'-&&$. ",
+" .,. .&$-.;&$. ",
+" . .&$-. .;&=. ",
+" .&;$. .;&=. ",
+" ++@+.&;-.+@+++.$&- ",
+" ....&--.........-- ",
+" "};
diff --git a/data/pixmaps/toolbar/matrix.png b/data/pixmaps/toolbar/matrix.png
new file mode 100644
index 0000000..3de07c0
--- /dev/null
+++ b/data/pixmaps/toolbar/matrix.png
Binary files differ
diff --git a/data/pixmaps/toolbar/matrix.xpm b/data/pixmaps/toolbar/matrix.xpm
new file mode 100644
index 0000000..91fd854
--- /dev/null
+++ b/data/pixmaps/toolbar/matrix.xpm
@@ -0,0 +1,30 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"22 18 6 1",
+"X c #000000",
+"O c #808080",
+". c #c0c0c0",
+"r c #d04040",
+"o c #d0a040",
+" c None",
+/* pixels */
+" ",
+" XXXXXXXXXXXXXXXXX ",
+" ..O...O...O...O.. ",
+" ",
+" XXXXX ",
+" XrrrX ",
+" XXXXX XXXXX ",
+" XrrrX ",
+" XXXXX ",
+" ",
+" XXXXXXXXXX ",
+" XooooooooX ",
+" XXXXXXXXXX ",
+" ",
+" ",
+" ..O...O...O...O.. ",
+" XXXXXXXXXXXXXXXXX "
+" "
+};
diff --git a/data/pixmaps/toolbar/menu-3-3-hemidemisemi.xpm b/data/pixmaps/toolbar/menu-3-3-hemidemisemi.xpm
new file mode 100644
index 0000000..bbdaf42
--- /dev/null
+++ b/data/pixmaps/toolbar/menu-3-3-hemidemisemi.xpm
@@ -0,0 +1,19 @@
+/* XPM */
+static char * scratch[] = {
+"14 13 3 1",
+" c none",
+"# c black",
+"x c black",
+" ",
+" xxx ### ",
+" xx # # ",
+" xxx #### ",
+" xx # # ",
+" xxx #### ",
+" # # ",
+" #### ",
+" # # ",
+" #### # ",
+" ##### ",
+" #### ",
+" "};
diff --git a/data/pixmaps/toolbar/menu-3-breve.xpm b/data/pixmaps/toolbar/menu-3-breve.xpm
new file mode 100644
index 0000000..6bf05b5
--- /dev/null
+++ b/data/pixmaps/toolbar/menu-3-breve.xpm
@@ -0,0 +1,19 @@
+/* XPM */
+static char * scratch[] = {
+"14 13 3 1",
+" c none",
+"# c black",
+"x c black",
+" ",
+" xxx ",
+" xx ",
+" xxx ",
+" xx ",
+" xxx ",
+" ",
+" ",
+" # #### # ",
+" ### ### ",
+" ### ### ",
+" # #### # ",
+" "};
diff --git a/data/pixmaps/toolbar/menu-3-crotchet.xpm b/data/pixmaps/toolbar/menu-3-crotchet.xpm
new file mode 100644
index 0000000..942889d
--- /dev/null
+++ b/data/pixmaps/toolbar/menu-3-crotchet.xpm
@@ -0,0 +1,19 @@
+/* XPM */
+static char * scratch[] = {
+"14 13 3 1",
+" c none",
+"# c black",
+"x c black",
+" ",
+" xxx ",
+" xx # ",
+" xxx # ",
+" xx # ",
+" xxx # ",
+" # ",
+" # ",
+" # ",
+" #### ",
+" ##### ",
+" #### ",
+" "};
diff --git a/data/pixmaps/toolbar/menu-3-demisemi.xpm b/data/pixmaps/toolbar/menu-3-demisemi.xpm
new file mode 100644
index 0000000..fd557c1
--- /dev/null
+++ b/data/pixmaps/toolbar/menu-3-demisemi.xpm
@@ -0,0 +1,19 @@
+/* XPM */
+static char * scratch[] = {
+"14 13 3 1",
+" c none",
+"# c black",
+"x c black",
+" ",
+" xxx ",
+" xx ### ",
+" xxx # # ",
+" xx #### ",
+" xxx # # ",
+" #### ",
+" # # ",
+" # # ",
+" #### ",
+" ##### ",
+" #### ",
+" "};
diff --git a/data/pixmaps/toolbar/menu-3-dotted-breve.xpm b/data/pixmaps/toolbar/menu-3-dotted-breve.xpm
new file mode 100644
index 0000000..8a5d61a
--- /dev/null
+++ b/data/pixmaps/toolbar/menu-3-dotted-breve.xpm
@@ -0,0 +1,19 @@
+/* XPM */
+static char * scratch[] = {
+"14 13 3 1",
+" c none",
+"# c black",
+"x c black",
+" ",
+" xxx ",
+" xx ",
+" xxx ",
+" xx ",
+" xxx ",
+" ",
+" ",
+" # #### # ",
+" ### ### ##",
+" ### ### ##",
+" # #### # ",
+" "};
diff --git a/data/pixmaps/toolbar/menu-3-dotted-crotchet.xpm b/data/pixmaps/toolbar/menu-3-dotted-crotchet.xpm
new file mode 100644
index 0000000..9ac0731
--- /dev/null
+++ b/data/pixmaps/toolbar/menu-3-dotted-crotchet.xpm
@@ -0,0 +1,19 @@
+/* XPM */
+static char * scratch[] = {
+"14 13 3 1",
+" c none",
+"# c black",
+"x c black",
+" ",
+" xxx ",
+" xx # ",
+" xxx # ",
+" xx # ",
+" xxx # ",
+" # ",
+" # ",
+" # ",
+" #### ",
+" ##### ## ",
+" #### ## ",
+" "};
diff --git a/data/pixmaps/toolbar/menu-3-dotted-demisemi.xpm b/data/pixmaps/toolbar/menu-3-dotted-demisemi.xpm
new file mode 100644
index 0000000..0e8b1cd
--- /dev/null
+++ b/data/pixmaps/toolbar/menu-3-dotted-demisemi.xpm
@@ -0,0 +1,19 @@
+/* XPM */
+static char * scratch[] = {
+"14 13 3 1",
+" c none",
+"# c black",
+"x c black",
+" ",
+" xxx ",
+" xx ### ",
+" xxx # # ",
+" xx #### ",
+" xxx # # ",
+" #### ",
+" # # ",
+" # # ",
+" #### ",
+" ##### ## ",
+" #### ## ",
+" "};
diff --git a/data/pixmaps/toolbar/menu-3-dotted-hemidemisemi.xpm b/data/pixmaps/toolbar/menu-3-dotted-hemidemisemi.xpm
new file mode 100644
index 0000000..71db40f
--- /dev/null
+++ b/data/pixmaps/toolbar/menu-3-dotted-hemidemisemi.xpm
@@ -0,0 +1,19 @@
+/* XPM */
+static char * scratch[] = {
+"14 13 3 1",
+" c none",
+"# c black",
+"x c black",
+" ",
+" xxx ### ",
+" xx # # ",
+" xxx #### ",
+" xx # # ",
+" xxx #### ",
+" # # ",
+" #### ",
+" # # ",
+" #### ",
+" ##### ## ",
+" #### ## ",
+" "};
diff --git a/data/pixmaps/toolbar/menu-3-dotted-minim.xpm b/data/pixmaps/toolbar/menu-3-dotted-minim.xpm
new file mode 100644
index 0000000..74873ff
--- /dev/null
+++ b/data/pixmaps/toolbar/menu-3-dotted-minim.xpm
@@ -0,0 +1,19 @@
+/* XPM */
+static char * scratch[] = {
+"14 13 3 1",
+" c none",
+"# c black",
+"x c black",
+" ",
+" xxx ",
+" xx # ",
+" xxx # ",
+" xx # ",
+" xxx # ",
+" # ",
+" # ",
+" # ",
+" #### ",
+" # # ## ",
+" #### ## ",
+" "};
diff --git a/data/pixmaps/toolbar/menu-3-dotted-quaver.xpm b/data/pixmaps/toolbar/menu-3-dotted-quaver.xpm
new file mode 100644
index 0000000..7d7ee6e
--- /dev/null
+++ b/data/pixmaps/toolbar/menu-3-dotted-quaver.xpm
@@ -0,0 +1,19 @@
+/* XPM */
+static char * scratch[] = {
+"14 13 3 1",
+" c none",
+"# c black",
+"x c black",
+" ",
+" xxx ",
+" xx ## ",
+" xxx # # ",
+" xx # # ",
+" xxx # # ",
+" # # ",
+" # ",
+" # ",
+" #### ",
+" ##### ## ",
+" #### ## ",
+" "};
diff --git a/data/pixmaps/toolbar/menu-3-dotted-semibreve.xpm b/data/pixmaps/toolbar/menu-3-dotted-semibreve.xpm
new file mode 100644
index 0000000..ac73f85
--- /dev/null
+++ b/data/pixmaps/toolbar/menu-3-dotted-semibreve.xpm
@@ -0,0 +1,19 @@
+/* XPM */
+static char * scratch[] = {
+"14 13 3 1",
+" c none",
+"# c black",
+"x c black",
+" ",
+" xxx ",
+" xx ",
+" xxx ",
+" xx ",
+" xxx ",
+" ",
+" ",
+" #### ",
+" ## ## ## ",
+" ## ## ## ",
+" #### ",
+" "};
diff --git a/data/pixmaps/toolbar/menu-3-dotted-semiquaver.xpm b/data/pixmaps/toolbar/menu-3-dotted-semiquaver.xpm
new file mode 100644
index 0000000..37ff2de
--- /dev/null
+++ b/data/pixmaps/toolbar/menu-3-dotted-semiquaver.xpm
@@ -0,0 +1,19 @@
+/* XPM */
+static char * scratch[] = {
+"14 13 3 1",
+" c none",
+"# c black",
+"x c black",
+" ",
+" xxx ",
+" xx ## ",
+" xxx # # ",
+" xx # # ",
+" xxx ## # ",
+" # ## ",
+" # # ",
+" # # ",
+" #### ",
+" ##### ## ",
+" #### ## ",
+" "};
diff --git a/data/pixmaps/toolbar/menu-3-hemidemisemi.xpm b/data/pixmaps/toolbar/menu-3-hemidemisemi.xpm
new file mode 100644
index 0000000..bbdaf42
--- /dev/null
+++ b/data/pixmaps/toolbar/menu-3-hemidemisemi.xpm
@@ -0,0 +1,19 @@
+/* XPM */
+static char * scratch[] = {
+"14 13 3 1",
+" c none",
+"# c black",
+"x c black",
+" ",
+" xxx ### ",
+" xx # # ",
+" xxx #### ",
+" xx # # ",
+" xxx #### ",
+" # # ",
+" #### ",
+" # # ",
+" #### # ",
+" ##### ",
+" #### ",
+" "};
diff --git a/data/pixmaps/toolbar/menu-3-minim.xpm b/data/pixmaps/toolbar/menu-3-minim.xpm
new file mode 100644
index 0000000..576b0f3
--- /dev/null
+++ b/data/pixmaps/toolbar/menu-3-minim.xpm
@@ -0,0 +1,19 @@
+/* XPM */
+static char * scratch[] = {
+"14 13 3 1",
+" c none",
+"# c black",
+"x c black",
+" ",
+" xxx ",
+" xx # ",
+" xxx # ",
+" xx # ",
+" xxx # ",
+" # ",
+" # ",
+" # ",
+" #### ",
+" # # ",
+" #### ",
+" "};
diff --git a/data/pixmaps/toolbar/menu-3-quaver.xpm b/data/pixmaps/toolbar/menu-3-quaver.xpm
new file mode 100644
index 0000000..1ee48e5
--- /dev/null
+++ b/data/pixmaps/toolbar/menu-3-quaver.xpm
@@ -0,0 +1,19 @@
+/* XPM */
+static char * scratch[] = {
+"14 13 3 1",
+" c none",
+"# c black",
+"x c black",
+" ",
+" xxx ",
+" xx ## ",
+" xxx # # ",
+" xx # # ",
+" xxx # # ",
+" # # ",
+" # ",
+" # ",
+" #### ",
+" ##### ",
+" #### ",
+" "};
diff --git a/data/pixmaps/toolbar/menu-3-semibreve.xpm b/data/pixmaps/toolbar/menu-3-semibreve.xpm
new file mode 100644
index 0000000..d10df5a
--- /dev/null
+++ b/data/pixmaps/toolbar/menu-3-semibreve.xpm
@@ -0,0 +1,19 @@
+/* XPM */
+static char * scratch[] = {
+"14 13 3 1",
+" c none",
+"# c black",
+"x c black",
+" ",
+" xxx ",
+" xx ",
+" xxx ",
+" xx ",
+" xxx ",
+" ",
+" ",
+" #### ",
+" ## ## ",
+" ## ## ",
+" #### ",
+" "};
diff --git a/data/pixmaps/toolbar/menu-3-semiquaver.xpm b/data/pixmaps/toolbar/menu-3-semiquaver.xpm
new file mode 100644
index 0000000..d26c9ec
--- /dev/null
+++ b/data/pixmaps/toolbar/menu-3-semiquaver.xpm
@@ -0,0 +1,19 @@
+/* XPM */
+static char * scratch[] = {
+"14 13 3 1",
+" c none",
+"# c black",
+"x c black",
+" ",
+" xxx ",
+" xx ## ",
+" xxx # # ",
+" xx # # ",
+" xxx ## # ",
+" # ## ",
+" # # ",
+" # # ",
+" #### ",
+" ##### ",
+" #### ",
+" "};
diff --git a/data/pixmaps/toolbar/menu-breve.xpm b/data/pixmaps/toolbar/menu-breve.xpm
new file mode 100644
index 0000000..b10e863
--- /dev/null
+++ b/data/pixmaps/toolbar/menu-breve.xpm
@@ -0,0 +1,19 @@
+/* XPM */
+static char * scratch[] = {
+"14 13 3 1",
+" c none",
+"# c black",
+"x c black",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" # #### # ",
+" ### ### ",
+" ### ### ",
+" # #### # ",
+" "};
diff --git a/data/pixmaps/toolbar/menu-crotchet.xpm b/data/pixmaps/toolbar/menu-crotchet.xpm
new file mode 100644
index 0000000..72ef0db
--- /dev/null
+++ b/data/pixmaps/toolbar/menu-crotchet.xpm
@@ -0,0 +1,19 @@
+/* XPM */
+static char * scratch[] = {
+"14 13 3 1",
+" c none",
+"# c black",
+"x c black",
+" ",
+" ",
+" # ",
+" # ",
+" # ",
+" # ",
+" # ",
+" # ",
+" # ",
+" #### ",
+" ##### ",
+" #### ",
+" "};
diff --git a/data/pixmaps/toolbar/menu-demisemi.xpm b/data/pixmaps/toolbar/menu-demisemi.xpm
new file mode 100644
index 0000000..e8e0882
--- /dev/null
+++ b/data/pixmaps/toolbar/menu-demisemi.xpm
@@ -0,0 +1,19 @@
+/* XPM */
+static char * scratch[] = {
+"14 13 3 1",
+" c none",
+"# c black",
+"x c black",
+" ",
+" ",
+" ### ",
+" # # ",
+" #### ",
+" # # ",
+" #### ",
+" # # ",
+" # # ",
+" #### ",
+" ##### ",
+" #### ",
+" "};
diff --git a/data/pixmaps/toolbar/menu-dotted-breve.xpm b/data/pixmaps/toolbar/menu-dotted-breve.xpm
new file mode 100644
index 0000000..3be4f24
--- /dev/null
+++ b/data/pixmaps/toolbar/menu-dotted-breve.xpm
@@ -0,0 +1,19 @@
+/* XPM */
+static char * scratch[] = {
+"14 13 3 1",
+" c none",
+"# c black",
+"x c black",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" # #### # ",
+" ### ### ##",
+" ### ### ##",
+" # #### # ",
+" "};
diff --git a/data/pixmaps/toolbar/menu-dotted-crotchet.xpm b/data/pixmaps/toolbar/menu-dotted-crotchet.xpm
new file mode 100644
index 0000000..d1a1060
--- /dev/null
+++ b/data/pixmaps/toolbar/menu-dotted-crotchet.xpm
@@ -0,0 +1,19 @@
+/* XPM */
+static char * scratch[] = {
+"14 13 3 1",
+" c none",
+"# c black",
+"x c black",
+" ",
+" ",
+" # ",
+" # ",
+" # ",
+" # ",
+" # ",
+" # ",
+" # ",
+" #### ",
+" ##### ## ",
+" #### ## ",
+" "};
diff --git a/data/pixmaps/toolbar/menu-dotted-demisemi.xpm b/data/pixmaps/toolbar/menu-dotted-demisemi.xpm
new file mode 100644
index 0000000..a9e4813
--- /dev/null
+++ b/data/pixmaps/toolbar/menu-dotted-demisemi.xpm
@@ -0,0 +1,19 @@
+/* XPM */
+static char * scratch[] = {
+"14 13 3 1",
+" c none",
+"# c black",
+"x c black",
+" ",
+" ",
+" ### ",
+" # # ",
+" #### ",
+" # # ",
+" #### ",
+" # # ",
+" # # ",
+" #### ",
+" ##### ## ",
+" #### ## ",
+" "};
diff --git a/data/pixmaps/toolbar/menu-dotted-hemidemisemi.xpm b/data/pixmaps/toolbar/menu-dotted-hemidemisemi.xpm
new file mode 100644
index 0000000..8643f7e
--- /dev/null
+++ b/data/pixmaps/toolbar/menu-dotted-hemidemisemi.xpm
@@ -0,0 +1,19 @@
+/* XPM */
+static char * scratch[] = {
+"14 13 3 1",
+" c none",
+"# c black",
+"x c black",
+" ",
+" ### ",
+" # # ",
+" #### ",
+" # # ",
+" #### ",
+" # # ",
+" #### ",
+" # # ",
+" #### ",
+" ##### ## ",
+" #### ## ",
+" "};
diff --git a/data/pixmaps/toolbar/menu-dotted-minim.xpm b/data/pixmaps/toolbar/menu-dotted-minim.xpm
new file mode 100644
index 0000000..80daea2
--- /dev/null
+++ b/data/pixmaps/toolbar/menu-dotted-minim.xpm
@@ -0,0 +1,19 @@
+/* XPM */
+static char * scratch[] = {
+"14 13 3 1",
+" c none",
+"# c black",
+"x c black",
+" ",
+" ",
+" # ",
+" # ",
+" # ",
+" # ",
+" # ",
+" # ",
+" # ",
+" #### ",
+" # # ## ",
+" #### ## ",
+" "};
diff --git a/data/pixmaps/toolbar/menu-dotted-quaver.xpm b/data/pixmaps/toolbar/menu-dotted-quaver.xpm
new file mode 100644
index 0000000..7ba6ef9
--- /dev/null
+++ b/data/pixmaps/toolbar/menu-dotted-quaver.xpm
@@ -0,0 +1,19 @@
+/* XPM */
+static char * scratch[] = {
+"14 13 3 1",
+" c none",
+"# c black",
+"x c black",
+" ",
+" ",
+" ## ",
+" # # ",
+" # # ",
+" # # ",
+" # # ",
+" # ",
+" # ",
+" #### ",
+" ##### ## ",
+" #### ## ",
+" "};
diff --git a/data/pixmaps/toolbar/menu-dotted-semibreve.xpm b/data/pixmaps/toolbar/menu-dotted-semibreve.xpm
new file mode 100644
index 0000000..65127d3
--- /dev/null
+++ b/data/pixmaps/toolbar/menu-dotted-semibreve.xpm
@@ -0,0 +1,19 @@
+/* XPM */
+static char * scratch[] = {
+"14 13 3 1",
+" c none",
+"# c black",
+"x c black",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" #### ",
+" ## ## ## ",
+" ## ## ## ",
+" #### ",
+" "};
diff --git a/data/pixmaps/toolbar/menu-dotted-semiquaver.xpm b/data/pixmaps/toolbar/menu-dotted-semiquaver.xpm
new file mode 100644
index 0000000..1beb8c5
--- /dev/null
+++ b/data/pixmaps/toolbar/menu-dotted-semiquaver.xpm
@@ -0,0 +1,19 @@
+/* XPM */
+static char * scratch[] = {
+"14 13 3 1",
+" c none",
+"# c black",
+"x c black",
+" ",
+" ",
+" ## ",
+" # # ",
+" # # ",
+" ## # ",
+" # ## ",
+" # # ",
+" # # ",
+" #### ",
+" ##### ## ",
+" #### ## ",
+" "};
diff --git a/data/pixmaps/toolbar/menu-hemidemisemi.xpm b/data/pixmaps/toolbar/menu-hemidemisemi.xpm
new file mode 100644
index 0000000..7f37864
--- /dev/null
+++ b/data/pixmaps/toolbar/menu-hemidemisemi.xpm
@@ -0,0 +1,19 @@
+/* XPM */
+static char * scratch[] = {
+"14 13 3 1",
+" c none",
+"# c black",
+"x c black",
+" ",
+" ### ",
+" # # ",
+" #### ",
+" # # ",
+" #### ",
+" # # ",
+" #### ",
+" # # ",
+" #### # ",
+" ##### ",
+" #### ",
+" "};
diff --git a/data/pixmaps/toolbar/menu-minim.xpm b/data/pixmaps/toolbar/menu-minim.xpm
new file mode 100644
index 0000000..837aba3
--- /dev/null
+++ b/data/pixmaps/toolbar/menu-minim.xpm
@@ -0,0 +1,19 @@
+/* XPM */
+static char * scratch[] = {
+"14 13 3 1",
+" c none",
+"# c black",
+"x c black",
+" ",
+" ",
+" # ",
+" # ",
+" # ",
+" # ",
+" # ",
+" # ",
+" # ",
+" #### ",
+" # # ",
+" #### ",
+" "};
diff --git a/data/pixmaps/toolbar/menu-no-note.xpm b/data/pixmaps/toolbar/menu-no-note.xpm
new file mode 100644
index 0000000..576bc2d
--- /dev/null
+++ b/data/pixmaps/toolbar/menu-no-note.xpm
@@ -0,0 +1,19 @@
+/* XPM */
+static char * scratch[] = {
+"14 13 3 1",
+" c none",
+"# c black",
+"x c black",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" "};
diff --git a/data/pixmaps/toolbar/menu-quaver.xpm b/data/pixmaps/toolbar/menu-quaver.xpm
new file mode 100644
index 0000000..f2e952f
--- /dev/null
+++ b/data/pixmaps/toolbar/menu-quaver.xpm
@@ -0,0 +1,19 @@
+/* XPM */
+static char * scratch[] = {
+"14 13 3 1",
+" c none",
+"# c black",
+"x c black",
+" ",
+" ",
+" ## ",
+" # # ",
+" # # ",
+" # # ",
+" # # ",
+" # ",
+" # ",
+" #### ",
+" ##### ",
+" #### ",
+" "};
diff --git a/data/pixmaps/toolbar/menu-semibreve.xpm b/data/pixmaps/toolbar/menu-semibreve.xpm
new file mode 100644
index 0000000..5dd251b
--- /dev/null
+++ b/data/pixmaps/toolbar/menu-semibreve.xpm
@@ -0,0 +1,19 @@
+/* XPM */
+static char * scratch[] = {
+"14 13 3 1",
+" c none",
+"# c black",
+"x c black",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" #### ",
+" ## ## ",
+" ## ## ",
+" #### ",
+" "};
diff --git a/data/pixmaps/toolbar/menu-semiquaver.xpm b/data/pixmaps/toolbar/menu-semiquaver.xpm
new file mode 100644
index 0000000..ad78e40
--- /dev/null
+++ b/data/pixmaps/toolbar/menu-semiquaver.xpm
@@ -0,0 +1,19 @@
+/* XPM */
+static char * scratch[] = {
+"14 13 3 1",
+" c none",
+"# c black",
+"x c black",
+" ",
+" ",
+" ## ",
+" # # ",
+" # # ",
+" ## # ",
+" # ## ",
+" # # ",
+" # # ",
+" #### ",
+" ##### ",
+" #### ",
+" "};
diff --git a/data/pixmaps/toolbar/midimixer.png b/data/pixmaps/toolbar/midimixer.png
new file mode 100644
index 0000000..a673743
--- /dev/null
+++ b/data/pixmaps/toolbar/midimixer.png
Binary files differ
diff --git a/data/pixmaps/toolbar/midimixer.xpm b/data/pixmaps/toolbar/midimixer.xpm
new file mode 100644
index 0000000..dfd43b1
--- /dev/null
+++ b/data/pixmaps/toolbar/midimixer.xpm
@@ -0,0 +1,151 @@
+/* XPM */
+static char * midimixer1_1_xpm[] = {
+"22 22 126 2",
+" c None",
+". c #626262",
+"+ c #3D3D3D",
+"@ c #474747",
+"# c #4D4D4D",
+"$ c #575757",
+"% c #595959",
+"& c #484848",
+"* c #5E5E5E",
+"= c #606060",
+"- c #505050",
+"; c #515151",
+"> c #5C5C5C",
+", c #636363",
+"' c #4E4E4E",
+") c #525252",
+"! c #6F6F6F",
+"~ c #2D2D2D",
+"{ c #C9C9C9",
+"] c #D2D2D2",
+"^ c #373737",
+"/ c #ADADAD",
+"( c #292929",
+"_ c #333333",
+": c #C8C8C8",
+"< c #C5C5C5",
+"[ c #CDCDCD",
+"} c #222222",
+"| c #2F2F2F",
+"1 c #272727",
+"2 c #212121",
+"3 c #F4F4F4",
+"4 c #D5D5D5",
+"5 c #353535",
+"6 c #363636",
+"7 c #DBDBDB",
+"8 c #E4E4E4",
+"9 c #262626",
+"0 c #E5E5E5",
+"a c #323232",
+"b c #3C3C3C",
+"c c #E6E6E6",
+"d c #2B2B2B",
+"e c #FFFFFF",
+"f c #DADADA",
+"g c #383838",
+"h c #303030",
+"i c #F3F3F3",
+"j c #2C2C2C",
+"k c #F9F9F9",
+"l c #2E2E2E",
+"m c #F5F5F5",
+"n c #E8E8E8",
+"o c #EBEBEB",
+"p c #EDEDED",
+"q c #D1D1D1",
+"r c #CECECE",
+"s c #F6F6F6",
+"t c #313131",
+"u c #F7F7F7",
+"v c #ECECEC",
+"w c #D8D8D8",
+"x c #3A3A3A",
+"y c #D7D7D7",
+"z c #FAFAFA",
+"A c #343434",
+"B c #393939",
+"C c #444444",
+"D c #FBFBFB",
+"E c #D9D9D9",
+"F c #404040",
+"G c #DFDFDF",
+"H c #3B3B3B",
+"I c #4A4A4A",
+"J c #F2F2F2",
+"K c #3F3F3F",
+"L c #424242",
+"M c #585858",
+"N c #E7E7E7",
+"O c #545454",
+"P c #DCDCDC",
+"Q c #FDFDFD",
+"R c #6D6D6D",
+"S c #D3D3D3",
+"T c #696969",
+"U c #5F5F5F",
+"V c #747474",
+"W c #616161",
+"X c #666666",
+"Y c #E1E1E1",
+"Z c #F1EFF3",
+"` c #EEEEEE",
+" . c #5B5B5B",
+".. c #B7B7B7",
+"+. c #FEFEFE",
+"@. c #7B7B7B",
+"#. c #616162",
+"$. c #F4F3F5",
+"%. c #7A797A",
+"&. c #565656",
+"*. c #828282",
+"=. c #FCFCFC",
+"-. c #787878",
+";. c #838383",
+">. c #868686",
+",. c #585759",
+"'. c #939393",
+"). c #000000",
+"!. c #AFAFAF",
+"~. c #BEBEBE",
+"{. c #010101",
+"]. c #707070",
+"^. c #3E3E3E",
+"/. c #6A6A6A",
+"(. c #B9B9B9",
+"_. c #1A1A1A",
+":. c #7A7A7A",
+"<. c #DEDEDE",
+"[. c #BCBCBC",
+"}. c #8E8E8E",
+"|. c #232323",
+"1. c #070707",
+"2. c #454545",
+"3. c #464646",
+"4. c #28262D",
+"5. c #130D1B",
+" ",
+". + @ # $ % & & * = - * ; % > , ' ' % ) ! ",
+"~ { ] ^ ^ / ( _ : < _ @ [ } | < 1 2 3 4 5 ",
+"6 7 8 9 9 0 a _ 8 0 b + c d d 8 ( ( e f g ",
+"h < i j j k l l m n b b o ~ ~ p d d e q ^ ",
+"6 r s j h e t t u v b b p | a p 9 d e w ^ ",
+"x y z A A e A B m v C b p | a D 1 ~ e E ^ ",
+"F G D b H e ^ I s v C B J K K e ( t e E ^ ",
+"L 0 e C C e I ; v s M @ N O O e a | e P H ",
+"' 8 e = . Q R R S D R T r U V Q W X e o L ",
+") Y e i Z e ` e 4 s i e Y i i e 4 e e 0 F ",
+" .G e e ..e +.e @.k e e #.$.e e %.e e k &. ",
+"*.P =.+.-.e e ;.g >.e e ^ e e e ,.e +.m V ",
+"'.y s Y > S e ).!.).e ~.{.q $.].^./.n c '. ",
+" (.(.q g ] f ).] ).y /._.:.<.).!.).{ [. ",
+" }.g }. |.|.|. ).!.). ).] ). ",
+" ).!.). 0 .0 ).] ). 1.|.|. ",
+" ).] ). 0 $ 0 |.|.|. 0 % 0 ",
+" |.|.|. 0 2.0 0 3.0 0 ) 0 ",
+" ] 4.] ] j ] ] j ] ] 3.] ",
+" ] 5.] q ).] ] ).] q ~ ] ",
+" "};
diff --git a/data/pixmaps/toolbar/minim.xpm b/data/pixmaps/toolbar/minim.xpm
new file mode 100644
index 0000000..b4f7fd3
--- /dev/null
+++ b/data/pixmaps/toolbar/minim.xpm
@@ -0,0 +1,33 @@
+/* XPM */
+static char * basis_6_xpm[] = {
+"22 24 6 1",
+" c None",
+"# c black",
+"+ c #242724",
+"@ c #4D4E4D",
+"- c #6B6D6B",
+". c #848484",
+" ",
+" ",
+" ",
+" ",
+" # ",
+" # ",
+" # ",
+" # ",
+" # ",
+" # ",
+" # ",
+" # ",
+" # ",
+" # ",
+" # ",
+" # ",
+" # ",
+" # ",
+" @#+# ",
+" .#- .# ",
+" #- .@ ",
+" #. -#. ",
+" .+## ",
+" "};
diff --git a/data/pixmaps/toolbar/mixer.png b/data/pixmaps/toolbar/mixer.png
new file mode 100644
index 0000000..e259590
--- /dev/null
+++ b/data/pixmaps/toolbar/mixer.png
Binary files differ
diff --git a/data/pixmaps/toolbar/mixer.xpm b/data/pixmaps/toolbar/mixer.xpm
new file mode 100644
index 0000000..35790e6
--- /dev/null
+++ b/data/pixmaps/toolbar/mixer.xpm
@@ -0,0 +1,89 @@
+/* XPM */
+static char * mixer1_1_xpm[] = {
+"22 22 64 1",
+" c None",
+". c #000000",
+"+ c #A0A0A0",
+"@ c #666666",
+"# c #D0D0D0",
+"$ c #E5E5E5",
+"% c #9B9B9B",
+"& c #B8A4D4",
+"* c #9C8EA8",
+"= c #A9A4AB",
+"- c #979198",
+"; c #8F8F8F",
+"> c #818181",
+", c #949494",
+"' c #747474",
+") c #7A7A7A",
+"! c #3F3F3F",
+"~ c #616161",
+"{ c #FFFFFF",
+"] c #868686",
+"^ c #020202",
+"/ c #AFAFAF",
+"( c #CBCBCB",
+"_ c #E9E9E9",
+": c #737373",
+"< c #D9D9D9",
+"[ c #727272",
+"} c #3E3E3E",
+"| c #6A6A6A",
+"1 c #EEEEEE",
+"2 c #ECECEC",
+"3 c #D2D2D2",
+"4 c #6B6B6B",
+"5 c #333333",
+"6 c #8E8E8E",
+"7 c #232323",
+"8 c #F1F1F1",
+"9 c #787878",
+"0 c #070707",
+"a c #EAEAEA",
+"b c #5D5D5D",
+"c c #F7F7F7",
+"d c #434343",
+"e c #494949",
+"f c #FEFEFE",
+"g c #FAFAFA",
+"h c #515151",
+"i c #E7E7E7",
+"j c #F9F9F9",
+"k c #626064",
+"l c #F4F4F4",
+"m c #343434",
+"n c #2B2B2B",
+"o c #F5F5F5",
+"p c #464646",
+"q c #F8F8F8",
+"r c #F0F0F0",
+"s c #0F0A18",
+"t c #F6F6F6",
+"u c #EBEBEB",
+"v c #DFDFDF",
+"w c #E8E8E8",
+"x c #CFCFCF",
+"y c #2A2A2A",
+" . ",
+" . + ",
+" . . . ",
+" . @.+ .# ",
+" .@@..@#.+ # ",
+" @....+..@.+..+..@ ",
+" . .@$..@.@. ",
+" @ . .@ . ",
+" @ . ",
+" % ",
+" & * = - ",
+" ; @ > , ",
+" ' )!) ~ {$]$ ",
+" ) ^/.(_: <[}| ",
+" 1:2 .3. 45) ./. ",
+" 6!; 777 ./. .3. ",
+" ./. 892 .3. 077 ",
+" .3. ab_ 777 c)c ",
+" 777 $d$ {ef ghi ",
+" jkl 1m2 1nc opq ",
+" rs$ t.u v.w xya ",
+" "};
diff --git a/data/pixmaps/toolbar/move_track_down.png b/data/pixmaps/toolbar/move_track_down.png
new file mode 100644
index 0000000..31d632c
--- /dev/null
+++ b/data/pixmaps/toolbar/move_track_down.png
Binary files differ
diff --git a/data/pixmaps/toolbar/move_track_down.xpm b/data/pixmaps/toolbar/move_track_down.xpm
new file mode 100644
index 0000000..f963d6c
--- /dev/null
+++ b/data/pixmaps/toolbar/move_track_down.xpm
@@ -0,0 +1,35 @@
+/* XPM */
+static char * move_track_down_xpm[] = {
+"22 18 14 1",
+" c None",
+". c #666666",
+"+ c #939393",
+"@ c #FF0400",
+"# c #9E0606",
+"$ c #E6E6E6",
+"% c #C7D485",
+"& c #CBD692",
+"* c #C7D484",
+"= c #C9D58C",
+"- c #B7B7B7",
+"; c #C4C4C4",
+"> c #62664E",
+", c #3A3A3A",
+"......................",
+".++@#$$.%%%%%%%%%%%%%.",
+".++#@$$.%&*%*%%%%*%=%.",
+"........-------------.",
+".++;;$$.>>>>>>>>>>>>>.",
+".++;;$$.>>>>>>>>>>>>>.",
+"........-----,,,-----.",
+".++;;$$.%%%%%,,,%%%%%.",
+".++;;$$.%%%%%,,,%%%%%.",
+"........-----,,,-----.",
+".++;;$$.%%%%%,,,%%%%%.",
+".++;;$$.%%%%%,,,%%%%%.",
+"........-----,,,-----.",
+".++;;$$.%%%,,,,,,,%%%.",
+".++;;$$.%%%%,,,,,%%%%.",
+"........-----,,,-----.",
+".++;;$$.%%%%%%,%%%%%%.",
+".++;;$$.%%%%%%%%%%%%%."};
diff --git a/data/pixmaps/toolbar/move_track_up.png b/data/pixmaps/toolbar/move_track_up.png
new file mode 100644
index 0000000..6125fa4
--- /dev/null
+++ b/data/pixmaps/toolbar/move_track_up.png
Binary files differ
diff --git a/data/pixmaps/toolbar/move_track_up.xpm b/data/pixmaps/toolbar/move_track_up.xpm
new file mode 100644
index 0000000..1dcb163
--- /dev/null
+++ b/data/pixmaps/toolbar/move_track_up.xpm
@@ -0,0 +1,35 @@
+/* XPM */
+static char * move_track_up_xpm[] = {
+"22 18 14 1",
+" c None",
+". c #666666",
+"+ c #939393",
+"@ c #FF0400",
+"# c #9E0606",
+"$ c #E6E6E6",
+"% c #C7D485",
+"& c #CBD692",
+"* c #C7D484",
+"= c #3A3A3A",
+"- c #C9D58C",
+"; c #B7B7B7",
+"> c #C4C4C4",
+", c #62664E",
+"......................",
+".++@#$$.%%%%%%%%%%%%%.",
+".++#@$$.%&*%**=%%*%-%.",
+"........;;;;;===;;;;;.",
+".++>>$$.%%%%=====%%%%.",
+".++>>$$.%%%=======%%%.",
+"........;;;;;===;;;;;.",
+".++>>$$.%%%%%===%%%%%.",
+".++>>$$.%%%%%===%%%%%.",
+"........;;;;;===;;;;;.",
+".++>>$$.%%%%%===%%%%%.",
+".++>>$$.%%%%%===%%%%%.",
+"........;;;;;===;;;;;.",
+".++>>$$.,,,,,,,,,,,,,.",
+".++>>$$.,,,,,,,,,,,,,.",
+"........;;;;;;;;;;;;;.",
+".++>>$$.%%%%%%%%%%%%%.",
+".++>>$$.%%%%%%%%%%%%%."};
diff --git a/data/pixmaps/toolbar/multi-page-mode.xpm b/data/pixmaps/toolbar/multi-page-mode.xpm
new file mode 100644
index 0000000..b046c84
--- /dev/null
+++ b/data/pixmaps/toolbar/multi-page-mode.xpm
@@ -0,0 +1,32 @@
+/* XPM */
+static char * multi_page_mode_xpm[] = {
+"22 22 7 1",
+" c None",
+". c #AB0011",
+"+ c #FFFFFF",
+"@ c #020011",
+"# c #50504D",
+"$ c #989893",
+"% c #131120",
+" .......... ",
+" .++++++++.+++++++++ ",
+" .+@@@@#@+.++@#@@#@+ ",
+" .++++++++.+++++++++ ",
+" .+@#@@@@+.++@@#@@@+ ",
+" .++++++++.+++++++++ ",
+" .+@@@#@@+.++@@@@$@+ ",
+" .++++++++.+++++++++ ",
+" .+@#@@@@+.++@#@@@@+ ",
+" .++++++++.+++++++++ ",
+" ..........+++++++++ ",
+" ++++++++++++++++++ ",
+" ++++++++++++++++++ ",
+" +@#@@@@++++#@@@@@+ ",
+" ++++++++++++++++++ ",
+" +@@@@#@++++@@#@@@+ ",
+" ++++++++++++++++++ ",
+" +@@#@@@++++@#@@#@+ ",
+" ++++++++++++++++++ ",
+" +#@@@#@++++@@#%+++ ",
+" ++++++++++++++++++ ",
+" "};
diff --git a/data/pixmaps/toolbar/mute-all.png b/data/pixmaps/toolbar/mute-all.png
new file mode 100644
index 0000000..93956d9
--- /dev/null
+++ b/data/pixmaps/toolbar/mute-all.png
Binary files differ
diff --git a/data/pixmaps/toolbar/mute-all.xpm b/data/pixmaps/toolbar/mute-all.xpm
new file mode 100644
index 0000000..3327042
--- /dev/null
+++ b/data/pixmaps/toolbar/mute-all.xpm
@@ -0,0 +1,86 @@
+/* XPM */
+static char * mute_all_xpm[] = {
+"22 22 61 1",
+" c None",
+". c #8D8E8E",
+"+ c #7F7F7F",
+"@ c #727272",
+"# c #8A8A8B",
+"$ c #ADAEAF",
+"% c #7F7F80",
+"& c #5F6264",
+"* c #092442",
+"= c #0C3159",
+"- c #0C345E",
+"; c #8A9096",
+"> c #A7A8A8",
+", c #8C8D8E",
+"' c #595C5E",
+") c #376291",
+"! c #47719D",
+"~ c #34608F",
+"{ c #1B4A7B",
+"] c #9EA6AF",
+"^ c #C0C1C1",
+"/ c #777777",
+"( c #0D2640",
+"_ c #7C9BBD",
+": c #84A2C2",
+"< c #5D83AB",
+"[ c #255384",
+"} c #BFBFBF",
+"| c #676767",
+"1 c #0B2D52",
+"2 c #8AA7C5",
+"3 c #668AB1",
+"4 c #3C6795",
+"5 c #295687",
+"6 c #CFCFCF",
+"7 c #5C6772",
+"8 c #0B2E53",
+"9 c #537AA5",
+"0 c #356190",
+"a c #436D9A",
+"b c #E6E6E6",
+"c c #A9AAAB",
+"d c #7E848A",
+"e c #184678",
+"f c #2E5B8B",
+"g c #E2EFFE",
+"h c #F5F5F5",
+"i c #9B9B9B",
+"j c #9098A1",
+"k c #2E5B8A",
+"l c #225081",
+"m c #D4E1EF",
+"n c #FBFBFC",
+"o c #B5B6B6",
+"p c #AEAEAE",
+"q c #BBBBBB",
+"r c #D1D1D1",
+"s c #E2E3E3",
+"t c #07203A",
+"u c #808080",
+"v c #1E4C7D",
+" ",
+" ",
+" .+@#$ ",
+" %&*=-;> ",
+" ,'-)!~{]^ ",
+" /()_:<~[} ",
+" |1!:23456 ",
+" 78~<390ab ",
+" cde~40fgh ",
+" ijkl0mn ",
+" opqrs ",
+" ",
+" ",
+" .+@#$ ",
+" %&*=-;> ",
+" ,'-)!~{]^ ",
+" /t)_:<~[} ",
+" |1!:23456 ",
+" u8~<390ab ",
+" cde~40fgh ",
+" ijvl0mn ",
+" opqrs "};
diff --git a/data/pixmaps/toolbar/no-note.xpm b/data/pixmaps/toolbar/no-note.xpm
new file mode 100644
index 0000000..70ef3f1
--- /dev/null
+++ b/data/pixmaps/toolbar/no-note.xpm
@@ -0,0 +1,30 @@
+/* XPM */
+static char * scratch[] = {
+"14 26 1 1",
+" c none",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" "};
diff --git a/data/pixmaps/toolbar/notation.png b/data/pixmaps/toolbar/notation.png
new file mode 100644
index 0000000..81917f8
--- /dev/null
+++ b/data/pixmaps/toolbar/notation.png
Binary files differ
diff --git a/data/pixmaps/toolbar/notation.xpm b/data/pixmaps/toolbar/notation.xpm
new file mode 100644
index 0000000..0ccf6f9
--- /dev/null
+++ b/data/pixmaps/toolbar/notation.xpm
@@ -0,0 +1,31 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"22 19 6 1",
+" c None",
+"X c black",
+"x c #242724",
+"O c #4D4E4D",
+"o c #6B6D6B",
+". c #848484",
+/* pixels */
+" oxX ",
+" oxXXXXX ",
+" XXXXXxo X ",
+" Xxo oxX ",
+" X oxXXXXX ",
+" XXXXXxo X ",
+" Xxo X ",
+" X X ",
+" X X ",
+" X X ",
+" X X ",
+" X oOXX ",
+" X xXXXX ",
+" X XXXXX ",
+" oOXX .XO. ",
+" xXXXX ",
+" XXXXX ",
+" .XO. ",
+" "
+};
diff --git a/data/pixmaps/toolbar/palette-accidentals.xpm b/data/pixmaps/toolbar/palette-accidentals.xpm
new file mode 100644
index 0000000..f02d200
--- /dev/null
+++ b/data/pixmaps/toolbar/palette-accidentals.xpm
@@ -0,0 +1,21 @@
+/* XPM */
+static char * palette_accidentals_xpm[] = {
+"16 16 2 1",
+" c None",
+". c black",
+" . ",
+" . . . ",
+" . . .. ",
+" . ..... ",
+" . ..... ",
+" . .. . ",
+" . . . ",
+" . .. . . ",
+" ..... . .. ",
+" . .. ..... ",
+" . .. ..... ",
+" . . .. . ",
+" . . . . ",
+" .. . ",
+" . ",
+" "};
diff --git a/data/pixmaps/toolbar/palette-clefs.xpm b/data/pixmaps/toolbar/palette-clefs.xpm
new file mode 100644
index 0000000..54a0bf4
--- /dev/null
+++ b/data/pixmaps/toolbar/palette-clefs.xpm
@@ -0,0 +1,21 @@
+/* XPM */
+static char * palette_clefs_xpm[] = {
+"16 16 2 1",
+" c None",
+". c black",
+" . ... ",
+" .. . .. .",
+" .. .. .. ",
+" .. . .. ",
+" . .. .",
+" .. . ",
+" .. . ",
+" . ... . ",
+". .. .. . ",
+". .. . . ",
+". . . ",
+" . . . ",
+" ... ",
+" . ",
+" .. ",
+" "};
diff --git a/data/pixmaps/toolbar/palette-group.xpm b/data/pixmaps/toolbar/palette-group.xpm
new file mode 100644
index 0000000..7ff377a
--- /dev/null
+++ b/data/pixmaps/toolbar/palette-group.xpm
@@ -0,0 +1,35 @@
+/* XPM */
+static char * palette_group_xpm[] = {
+"16 16 16 1",
+" c None",
+". c #282828",
+"+ c #9A9898",
+"@ c #918F8F",
+"# c #5F5E5E",
+"$ c #494949",
+"% c #7F7D7D",
+"& c #807F7F",
+"* c #2F2F2F",
+"= c #838181",
+"- c #474747",
+"; c #7C7A7A",
+"> c #2C2C2C",
+", c #787676",
+"' c #707070",
+") c #9B9999",
+"...+ @ ",
+" # .....$% ",
+" &*.....",
+" =-..... ; ",
+"..>, ",
+" ",
+" ",
+" . ..... ",
+" . . . ",
+" . . . . ",
+" . .. . . ",
+" . .. .. .. ",
+" .. .. .. ",
+" .. ' ''",
+" '.. ..' ",
+" ).....) "};
diff --git a/data/pixmaps/toolbar/palette-marks.xpm b/data/pixmaps/toolbar/palette-marks.xpm
new file mode 100644
index 0000000..e9705fc
--- /dev/null
+++ b/data/pixmaps/toolbar/palette-marks.xpm
@@ -0,0 +1,38 @@
+/* XPM */
+static char * palette_marks_xpm[] = {
+"16 16 19 1",
+" c None",
+". c #AFAFAF",
+"+ c #010101",
+"@ c #787878",
+"# c #888888",
+"$ c #424242",
+"% c #D5D5D5",
+"& c #7B7B7B",
+"* c #8A8A8A",
+"= c #0A0A0A",
+"- c #A4A4A4",
+"; c #8D8D8D",
+"> c #D6D6D6",
+", c #D0D0D0",
+"' c #090909",
+") c #626262",
+"! c #494949",
+"~ c #2D2D2D",
+"{ c #8C8C8C",
+" .+++++. ",
+" .+@ #+.",
+" $. .$",
+" @ .@% #",
+" & #+@ ",
+"*=* # ",
+"-=- ; ",
+" = > , ",
+" = '. ",
+" * ,'. ",
+" ,' ,) ,",
+" ..!~.{!~,'",
+" ..,~', .~ ~",
+" .{{'! ~{ ",
+" ,,'.{ ~, ",
+" ,'!.,', "};
diff --git a/data/pixmaps/toolbar/palette-notes.xpm b/data/pixmaps/toolbar/palette-notes.xpm
new file mode 100644
index 0000000..74b368a
--- /dev/null
+++ b/data/pixmaps/toolbar/palette-notes.xpm
@@ -0,0 +1,21 @@
+/* XPM */
+static char * palette_notes_xpm[] = {
+"16 16 2 1",
+" c None",
+". c black",
+" ",
+" . ",
+" . .. ",
+" . .. ",
+" . . . ",
+" . . . ",
+" . . . ",
+" . . . ",
+" . . . ",
+" . .... ",
+" . ..... ",
+" .... ..... ",
+" . . ... ",
+" . . ",
+" ... ",
+" "};
diff --git a/data/pixmaps/toolbar/palette-rests.xpm b/data/pixmaps/toolbar/palette-rests.xpm
new file mode 100644
index 0000000..073beaf
--- /dev/null
+++ b/data/pixmaps/toolbar/palette-rests.xpm
@@ -0,0 +1,21 @@
+/* XPM */
+static char * palette_rests_xpm[] = {
+"16 16 2 1",
+" c None",
+". c black",
+" . ",
+" . ",
+" .. ",
+" . ",
+" .. . .. ",
+" .... . ",
+" . .. ",
+" . . . ",
+" .... . ",
+" . . ",
+" . . ... ",
+" .. .. . ",
+" . .. ",
+" . . ",
+" . . ",
+" "};
diff --git a/data/pixmaps/toolbar/pause.xpm b/data/pixmaps/toolbar/pause.xpm
new file mode 100644
index 0000000..8ec0622
--- /dev/null
+++ b/data/pixmaps/toolbar/pause.xpm
@@ -0,0 +1,21 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"12 8 7 1",
+" c #010101",
+". c Gray26",
+"X c Gray47",
+"o c #888888",
+"O c #afafaf",
+"+ c #d5d5d5",
+"@ c None",
+/* pixels */
+"@@@@@@@@@@@@",
+"@@@@@ooo@@@@",
+"@@@O O@@",
+"@@O X@@@o O@",
+"@@.O@@@@@O.@",
+"@+X@@OX+@@o+",
+"@oO@@o X@@Oo",
+"@+@@@@o@@@++"
+};
diff --git a/data/pixmaps/toolbar/quantize.png b/data/pixmaps/toolbar/quantize.png
new file mode 100644
index 0000000..6f17d6b
--- /dev/null
+++ b/data/pixmaps/toolbar/quantize.png
Binary files differ
diff --git a/data/pixmaps/toolbar/quantize.xpm b/data/pixmaps/toolbar/quantize.xpm
new file mode 100644
index 0000000..088f9d3
--- /dev/null
+++ b/data/pixmaps/toolbar/quantize.xpm
@@ -0,0 +1,31 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"22 19 6 1",
+" c None",
+"X c black",
+"x c #242724",
+"O c #4D4E4D",
+"o c #6B6D6B",
+". c #848484",
+/* pixels */
+" ",
+" ",
+" ",
+" .XXXX. ",
+" xXo oXO ",
+" xX Xx ",
+" oX. .X. ",
+" XX XX ",
+" XX XX ",
+" XX XX ",
+" XX oXO XX ",
+" .X. .XO XX ",
+" xX .XoX ",
+" OXo ooXO ",
+" .XXXX..XO ",
+" .Xo ",
+" ",
+" ",
+" "
+};
diff --git a/data/pixmaps/toolbar/quaver.xpm b/data/pixmaps/toolbar/quaver.xpm
new file mode 100644
index 0000000..2112fb3
--- /dev/null
+++ b/data/pixmaps/toolbar/quaver.xpm
@@ -0,0 +1,33 @@
+/* XPM */
+static char * basis_6_xpm[] = {
+"22 24 6 1",
+" c None",
+"# c black",
+"+ c #242724",
+"@ c #4D4E4D",
+"- c #6B6D6B",
+". c #848484",
+" ",
+" ",
+" ",
+" # ",
+" #. ",
+" #@ ",
+" ##. ",
+" ##+ ",
+" # .- ",
+" # . ",
+" # . ",
+" # . ",
+" # .. ",
+" # - ",
+" # + ",
+" # + ",
+" # - ",
+" # . ",
+" @#+# . ",
+" .##### ",
+" ###### ",
+" #####. ",
+" .+#@ ",
+" "};
diff --git a/data/pixmaps/toolbar/resize.xpm b/data/pixmaps/toolbar/resize.xpm
new file mode 100644
index 0000000..5e577e3
--- /dev/null
+++ b/data/pixmaps/toolbar/resize.xpm
@@ -0,0 +1,36 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"22 22 8 1",
+" c Gray0",
+". c #080000",
+"X c #5d0000",
+"o c #005482",
+"O c #8c0800",
+"+ c #aa7900",
+"@ c Gray100",
+"# c None",
+/* pixels */
+"######################",
+"######################",
+"######################",
+"######################",
+"########## ##########",
+"########## ##########",
+"########## ##########",
+"### ###### ###### ###",
+"## ###### ###### ##",
+"# ###### ###### #",
+" ",
+" ",
+"# ###### ###### #",
+"## ###### ###### ##",
+"### ###### ###### ###",
+"########## ##########",
+"########## ##########",
+"########## ##########",
+"######################",
+"######################",
+"######################",
+"######################"
+};
diff --git a/data/pixmaps/toolbar/rest-breve.xpm b/data/pixmaps/toolbar/rest-breve.xpm
new file mode 100644
index 0000000..5462817
--- /dev/null
+++ b/data/pixmaps/toolbar/rest-breve.xpm
@@ -0,0 +1,34 @@
+/* XPM */
+static char * basis_6_xpm[] = {
+"22 24 6 1",
+" c None",
+"# c black",
+"+ c #242724",
+"@ c #4D4E4D",
+"- c #6B6D6B",
+". c #848484",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ######### ",
+" ##### ",
+" ##### ",
+" ##### ",
+" ##### ",
+" ##### ",
+" ######### ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" "};
diff --git a/data/pixmaps/toolbar/rest-crotchet.xpm b/data/pixmaps/toolbar/rest-crotchet.xpm
new file mode 100644
index 0000000..731f84f
--- /dev/null
+++ b/data/pixmaps/toolbar/rest-crotchet.xpm
@@ -0,0 +1,33 @@
+/* XPM */
+static char * basis_6_xpm[] = {
+"22 24 6 1",
+" c None",
+"# c black",
+"+ c #242724",
+"@ c #4D4E4D",
+"- c #6B6D6B",
+". c #848484",
+" ",
+" ",
+" - ",
+" -- ",
+" #. ",
+" #+ ",
+" .##@ ",
+" ###- ",
+" @##@ ",
+" +#. ",
+" .# ",
+" @- ",
+" .###. ",
+" +#### ",
+" ##- .. ",
+" +# ",
+" #- ",
+" @ ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" "};
diff --git a/data/pixmaps/toolbar/rest-demisemi.xpm b/data/pixmaps/toolbar/rest-demisemi.xpm
new file mode 100644
index 0000000..4aaf678
--- /dev/null
+++ b/data/pixmaps/toolbar/rest-demisemi.xpm
@@ -0,0 +1,33 @@
+/* XPM */
+static char * basis_6_xpm[] = {
+"22 24 6 1",
+" c None",
+"# c black",
+"+ c #242724",
+"@ c #4D4E4D",
+"- c #6B6D6B",
+". c #848484",
+" ",
+" ",
+" ",
+" #+ ",
+" .#+ .- ",
+" +#+@@ ",
+" @. ",
+" #. ",
+" .#. .@ ",
+" ##@ @@ ",
+" @#@-# ",
+" .+ ",
+" +@ ",
+" .#+ .# ",
+" ##@.++ ",
+" @##@#@ ",
+" -+ ",
+" #- ",
+" -#. ",
+" -+ ",
+" +- ",
+" @ ",
+" ",
+" "};
diff --git a/data/pixmaps/toolbar/rest-hemidemisemi.xpm b/data/pixmaps/toolbar/rest-hemidemisemi.xpm
new file mode 100644
index 0000000..b089ce0
--- /dev/null
+++ b/data/pixmaps/toolbar/rest-hemidemisemi.xpm
@@ -0,0 +1,33 @@
+/* XPM */
+static char * basis_6_xpm[] = {
+"22 24 6 1",
+" c None",
+"# c black",
+"+ c #242724",
+"@ c #4D4E4D",
+"- c #6B6D6B",
+". c #848484",
+" . ",
+" @#@ ",
+" .##.-@ ",
+" +- ",
+" + ",
+" #+ @@ ",
+" .#+ -# ",
+" +#+@+ ",
+" @@ ",
+" #. ",
+" .#. .@ ",
+" ##@ @@ ",
+" @#@-# ",
+" .+ ",
+" +@ ",
+" .#+ .# ",
+" ##@.++ ",
+" @##@#@ ",
+" -+ ",
+" #- ",
+" -#. ",
+" -+ ",
+" +- ",
+" @ "};
diff --git a/data/pixmaps/toolbar/rest-minim.xpm b/data/pixmaps/toolbar/rest-minim.xpm
new file mode 100644
index 0000000..1f060b2
--- /dev/null
+++ b/data/pixmaps/toolbar/rest-minim.xpm
@@ -0,0 +1,33 @@
+/* XPM */
+static char * basis_6_xpm[] = {
+"22 24 6 1",
+" c None",
+"# c black",
+"+ c #242724",
+"@ c #4D4E4D",
+"- c #6B6D6B",
+". c #848484",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ###### ",
+" ###### ",
+" ########## ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" "};
diff --git a/data/pixmaps/toolbar/rest-quaver.xpm b/data/pixmaps/toolbar/rest-quaver.xpm
new file mode 100644
index 0000000..d1b0d23
--- /dev/null
+++ b/data/pixmaps/toolbar/rest-quaver.xpm
@@ -0,0 +1,33 @@
+/* XPM */
+static char * basis_6_xpm[] = {
+"22 24 6 1",
+" c None",
+"# c black",
+"+ c #242724",
+"@ c #4D4E4D",
+"- c #6B6D6B",
+". c #848484",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" .#+ .# ",
+" ##@.++ ",
+" @##@#@ ",
+" -+ ",
+" #- ",
+" -#. ",
+" -+ ",
+" +- ",
+" # ",
+" -@ ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" "};
diff --git a/data/pixmaps/toolbar/rest-semibreve.xpm b/data/pixmaps/toolbar/rest-semibreve.xpm
new file mode 100644
index 0000000..016528f
--- /dev/null
+++ b/data/pixmaps/toolbar/rest-semibreve.xpm
@@ -0,0 +1,34 @@
+/* XPM */
+static char * basis_6_xpm[] = {
+"22 24 6 1",
+" c None",
+"# c black",
+"+ c #242724",
+"@ c #4D4E4D",
+"- c #6B6D6B",
+". c #848484",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ########## ",
+" ###### ",
+" ###### ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" "};
diff --git a/data/pixmaps/toolbar/rest-semiquaver.xpm b/data/pixmaps/toolbar/rest-semiquaver.xpm
new file mode 100644
index 0000000..207b2c8
--- /dev/null
+++ b/data/pixmaps/toolbar/rest-semiquaver.xpm
@@ -0,0 +1,33 @@
+/* XPM */
+static char * basis_6_xpm[] = {
+"22 24 6 1",
+" c None",
+"# c black",
+"+ c #242724",
+"@ c #4D4E4D",
+"- c #6B6D6B",
+". c #848484",
+" ",
+" ",
+" ",
+" ",
+" ",
+" .#. .@ ",
+" ##@ @@ ",
+" @#@-# ",
+" .+ ",
+" +@ ",
+" .#+ .# ",
+" ##@.++ ",
+" @##@#@ ",
+" -+ ",
+" #- ",
+" -#. ",
+" -+ ",
+" +- ",
+" @ ",
+" ",
+" ",
+" ",
+" ",
+" "};
diff --git a/data/pixmaps/toolbar/select.xpm b/data/pixmaps/toolbar/select.xpm
new file mode 100644
index 0000000..e9fe6f0
--- /dev/null
+++ b/data/pixmaps/toolbar/select.xpm
@@ -0,0 +1,32 @@
+/* XPM */
+static char *left_ptr_big[] = {
+/* width height num_colors chars_per_pixel */
+" 20 20 5 1",
+/* colors */
+". c None",
+"x c #9090e0",
+"y c #8080d0",
+"z c #7070c0",
+"# c #000000",
+/* pixels */
+"....................",
+"....................",
+".....##.............",
+".....#x#............",
+".....#xx#...........",
+".....#xxy#..........",
+".....#xxyy#.........",
+".....#xxyyz#........",
+".....#xxyyzz#.......",
+".....#xxyyzzz#......",
+".....#xxyyz####.....",
+".....#xx#y#.........",
+".....#x#.#z#........",
+".....##..#z#........",
+".....#....#z#.......",
+"..........#z#.......",
+"...........#z#......",
+"...........#z#......",
+"............##......",
+"...................."
+};
diff --git a/data/pixmaps/toolbar/semibreve.xpm b/data/pixmaps/toolbar/semibreve.xpm
new file mode 100644
index 0000000..d11c2a4
--- /dev/null
+++ b/data/pixmaps/toolbar/semibreve.xpm
@@ -0,0 +1,33 @@
+/* XPM */
+static char * basis_6_xpm[] = {
+"22 24 6 1",
+" c None",
+"# c black",
+"+ c #242724",
+"@ c #4D4E4D",
+"- c #6B6D6B",
+". c #848484",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" -####. ",
+" @#- @#- ",
+" +# .#+ ",
+" +#. #+ ",
+" -#@ -#@ ",
+" .####- ",
+" "};
diff --git a/data/pixmaps/toolbar/semiquaver.xpm b/data/pixmaps/toolbar/semiquaver.xpm
new file mode 100644
index 0000000..399ccfc
--- /dev/null
+++ b/data/pixmaps/toolbar/semiquaver.xpm
@@ -0,0 +1,33 @@
+/* XPM */
+static char * basis_6_xpm[] = {
+"22 24 6 1",
+" c None",
+"# c black",
+"+ c #242724",
+"@ c #4D4E4D",
+"- c #6B6D6B",
+". c #848484",
+" ",
+" # ",
+" #. ",
+" ## ",
+" ##+ ",
+" # .+ ",
+" #. .- ",
+" #+ - ",
+" ##- .. ",
+" #.@. - ",
+" # - . ",
+" # .- ",
+" # . ",
+" # . ",
+" # - ",
+" # # ",
+" # @ ",
+" # . ",
+" @#+# . ",
+" .##### ",
+" ###### ",
+" #####. ",
+" .+#@ ",
+" "};
diff --git a/data/pixmaps/toolbar/split.xpm b/data/pixmaps/toolbar/split.xpm
new file mode 100644
index 0000000..68369eb
--- /dev/null
+++ b/data/pixmaps/toolbar/split.xpm
@@ -0,0 +1,36 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"22 22 8 1",
+" c Gray0",
+". c #080000",
+"X c #5d0000",
+"o c #c5d37d",
+"O c #8c0800",
+"+ c #c57dd3",
+"@ c Gray100",
+"# c None",
+/* pixels */
+"######################",
+"######################",
+"######################",
+"######################",
+"# ## #",
+"# ++++++ ## oooooooo #",
+"# +++++++ ## ooooooo #",
+"# ++++++++ ## oooooo #",
+"# +++++++++ ## ooooo #",
+"# ++++++++ ## oooooo #",
+"# +++++++ ## ooooooo #",
+"# ++++++ ## oooooooo #",
+"# +++++ ## ooooooooo #",
+"# ++++++ ## oooooooo #",
+"# +++++++ ## ooooooo #",
+"# ++++++++ ## oooooo #",
+"# ## #",
+"######################",
+"######################",
+"######################",
+"######################",
+"######################"
+};
diff --git a/data/pixmaps/toolbar/staccatissimo.xpm b/data/pixmaps/toolbar/staccatissimo.xpm
new file mode 100644
index 0000000..2bd7272
--- /dev/null
+++ b/data/pixmaps/toolbar/staccatissimo.xpm
@@ -0,0 +1,18 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"4 7 5 1",
+" c Gray4",
+". c #7b7b7b",
+"X c Gray54",
+"o c #a4a4a4",
+"O c None",
+/* pixels */
+"OOOO",
+"OO.O",
+"OX X",
+"Oo o",
+"OO O",
+"OO O",
+"OOXO"
+};
diff --git a/data/pixmaps/toolbar/staccato.xpm b/data/pixmaps/toolbar/staccato.xpm
new file mode 100644
index 0000000..03b9db6
--- /dev/null
+++ b/data/pixmaps/toolbar/staccato.xpm
@@ -0,0 +1,14 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"4 4 4 1",
+" c Gray0",
+". c #8b8b8b",
+"X c #cacaca",
+"o c None",
+/* pixels */
+"oooo",
+"oo.X",
+"o. .",
+"oo.X"
+};
diff --git a/data/pixmaps/toolbar/step_by_step.xpm b/data/pixmaps/toolbar/step_by_step.xpm
new file mode 100644
index 0000000..241eed8
--- /dev/null
+++ b/data/pixmaps/toolbar/step_by_step.xpm
@@ -0,0 +1,26 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"18 16 4 1",
+"# c #000000",
+"o c #ffffff",
+". c #c0c0ff",
+" c None",
+/* pixels */
+" ",
+"############ ",
+"oo###oo###oo ",
+"oo###oo###oo # ",
+"oo###oo###oo ## ",
+"oo###oo###oo #.# ",
+"oo###oo###o###..# ",
+"oo###oo###o#.....#",
+"oo###oo###o#.....#",
+"ooo#oooo#oo###..# ",
+"ooo#oooo#ooo #.# ",
+"ooo#oooo#ooo ## ",
+"ooo#oooo#ooo # ",
+"ooo#oooo#ooo ",
+"############ ",
+" "
+};
diff --git a/data/pixmaps/toolbar/tenuto.xpm b/data/pixmaps/toolbar/tenuto.xpm
new file mode 100644
index 0000000..a0cb960
--- /dev/null
+++ b/data/pixmaps/toolbar/tenuto.xpm
@@ -0,0 +1,12 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"11 3 3 1",
+" c Gray44",
+". c #bebebe",
+"X c None",
+/* pixels */
+"XXXXXXXXXXX",
+"X. .",
+"X. ."
+};
diff --git a/data/pixmaps/toolbar/text-mark.xpm b/data/pixmaps/toolbar/text-mark.xpm
new file mode 100644
index 0000000..bd79da4
--- /dev/null
+++ b/data/pixmaps/toolbar/text-mark.xpm
@@ -0,0 +1,40 @@
+/* XPM */
+static char * text_mark_xpm[] = {
+"14 26 11 1",
+" c None",
+". c #000000",
+"+ c #34021C",
+"@ c #200011",
+"# c #14000B",
+"$ c #1A010E",
+"% c #13000A",
+"& c #16000C",
+"* c #17000C",
+"= c #100008",
+"- c #18000C",
+" ",
+" ",
+" . ",
+" . ",
+" . ",
+" . ",
+" . ",
+" . ",
+" . ",
+" . ",
+" . ",
+" . ",
+" ..... ",
+" ...... ",
+" ...... ",
+" .... ",
+" ",
+" ",
+" +@.#$ ",
+" . % . ",
+" & ",
+" * ",
+" = ",
+" %-. ",
+" ",
+" "};
diff --git a/data/pixmaps/toolbar/text.xpm b/data/pixmaps/toolbar/text.xpm
new file mode 100644
index 0000000..e8be58d
--- /dev/null
+++ b/data/pixmaps/toolbar/text.xpm
@@ -0,0 +1,40 @@
+/* XPM */
+static char *text[] = {
+/* width height num_colors chars_per_pixel */
+" 20 23 10 1",
+/* colors */
+". c #000000",
+"# c #1d1d1d",
+"a c #393939",
+"b c #555555",
+"c c #727272",
+"d c #8e8e8e",
+"e c #aaaaaa",
+"f c #c7c7c7",
+"g c #e3e3e3",
+"h c None",
+/* pixels */
+"hhhhhhhhhhhhhhhhhhhh",
+"hhhhhhhhhhhhhhhhhhhh",
+"hhhhhhhhhhhhhhhhhhhh",
+"hhhheeeeeeeeeeeeehhh",
+"hhhe...ba...ba...hhh",
+"hhhe.#hhha.bhhe..hhh",
+"hhhe.fhhhb.bhhhb.hhh",
+"hhhe#hhhhb.bhhhf.hhh",
+"hhhcbhhhhb.bhhhh.hhh",
+"hhhbehhhhb.bhhhhaehh",
+"hhhhhhhhhb.bhhhhhhhh",
+"hhhhhhhhhb.bhhhhhhhh",
+"hhhhhhhhhb.bhhhhhhhh",
+"hhhhhhhhhb.bhhhhhhhh",
+"hhhhhhhhhb.bhhhhhhhh",
+"hhhhhhhhhb.bhhhhhhhh",
+"hhhhhhhhhb.bhhhhhhhh",
+"hhhhhhhhhb.bhhhhhhhh",
+"hhhhhhhed#.#eehhhhhh",
+"hhhhhhfbbbbbbbhhhhhh",
+"hhhhhhhhhhhhhhhhhhhh",
+"hhhhhhhhhhhhhhhhhhhh",
+"hhhhhhhhhhhhhhhhhhhh"
+};
diff --git a/data/pixmaps/toolbar/text_rf.xpm b/data/pixmaps/toolbar/text_rf.xpm
new file mode 100644
index 0000000..742663f
--- /dev/null
+++ b/data/pixmaps/toolbar/text_rf.xpm
@@ -0,0 +1,15 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"9 7 2 1",
+" c Gray0",
+". c None",
+/* pixels */
+"....... ",
+". . . ..",
+". ... ..",
+". .. .",
+" .... ...",
+" ... ....",
+".... ...."
+};
diff --git a/data/pixmaps/toolbar/text_sf.xpm b/data/pixmaps/toolbar/text_sf.xpm
new file mode 100644
index 0000000..81bd468
--- /dev/null
+++ b/data/pixmaps/toolbar/text_sf.xpm
@@ -0,0 +1,15 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"9 7 2 1",
+" c Gray0",
+". c None",
+/* pixels */
+"....... ",
+".. . ..",
+". .... ..",
+". .",
+"... . ...",
+" . ....",
+".... ...."
+};
diff --git a/data/pixmaps/toolbar/time-musical.png b/data/pixmaps/toolbar/time-musical.png
new file mode 100644
index 0000000..f1b424c
--- /dev/null
+++ b/data/pixmaps/toolbar/time-musical.png
Binary files differ
diff --git a/data/pixmaps/toolbar/time-musical.xpm b/data/pixmaps/toolbar/time-musical.xpm
new file mode 100644
index 0000000..8053513
--- /dev/null
+++ b/data/pixmaps/toolbar/time-musical.xpm
@@ -0,0 +1,51 @@
+/* XPM */
+static char *time_musical[] = {
+/* width height num_colors chars_per_pixel */
+" 20 19 25 1",
+/* colors */
+". c None",
+"# c #d7d7d7",
+"a c #8e8e8e",
+"b c #555555",
+"c c #2b2b2b",
+"d c #101010",
+"e c #020202",
+"f c #a4a4a4",
+"g c #373737",
+"h c #000000",
+"i c #cecece",
+"j c #383838",
+"k c #a6a6a6",
+"l c #212121",
+"m c #757575",
+"n c #b3b3b3",
+"o c #dcdcdc",
+"p c #b2b2b2",
+"q c #4a4a4a",
+"r c #151515",
+"s c #9f9f9f",
+"t c #838383",
+"u c #888888",
+"v c #313131",
+"w c #060606",
+/* pixels */
+"....................",
+"....................",
+".......qhhhhq.......",
+"...hh..h....h.......",
+"...hh.sv....vs......",
+"....htqt....tq......",
+".....hh......h......",
+".....qh......h......",
+".....sht.....vs.....",
+".....qqh.....tq.....",
+".....h.ht.....h.....",
+".....h.fh.....h.....",
+"....sv..ht....vs....",
+"....qt..fhh...tq....",
+"....h....hh....h....",
+"...sh..........hs...",
+"...hhhhhhhhhhhhhh...",
+"....................",
+"...................."
+};
diff --git a/data/pixmaps/toolbar/time-raw.png b/data/pixmaps/toolbar/time-raw.png
new file mode 100644
index 0000000..849965e
--- /dev/null
+++ b/data/pixmaps/toolbar/time-raw.png
Binary files differ
diff --git a/data/pixmaps/toolbar/time-raw.xpm b/data/pixmaps/toolbar/time-raw.xpm
new file mode 100644
index 0000000..78c89ab
--- /dev/null
+++ b/data/pixmaps/toolbar/time-raw.xpm
@@ -0,0 +1,26 @@
+/* XPM */
+static char * time_raw_xpm[] = {
+"19 19 4 1",
+" c None",
+". c #7A7A7A",
+"+ c #000000",
+"@ c #A0A0A0",
+" ",
+" ",
+" ",
+" .+ @++++++@ +@ ",
+" +. +@ ",
+" ",
+" .+ .+++ +++++@ ",
+" +. +@ ",
+" ",
+" .+ .++++ +@ +@ ",
+" +. +@ ",
+" ",
+" .+ .+++ +++++@ ",
+" +. +@ ",
+" ",
+" ",
+" ",
+" ",
+" "};
diff --git a/data/pixmaps/toolbar/time-real.png b/data/pixmaps/toolbar/time-real.png
new file mode 100644
index 0000000..afbb614
--- /dev/null
+++ b/data/pixmaps/toolbar/time-real.png
Binary files differ
diff --git a/data/pixmaps/toolbar/time-real.xpm b/data/pixmaps/toolbar/time-real.xpm
new file mode 100644
index 0000000..ebba1ad
--- /dev/null
+++ b/data/pixmaps/toolbar/time-real.xpm
@@ -0,0 +1,29 @@
+/* XPM */
+static char * time_real_xpm[] = {
+"19 19 7 1",
+" c None",
+". c #7A7A7A",
+"+ c #6B6B6B",
+"@ c #2A2A2A",
+"# c #000000",
+"$ c #454545",
+"% c #ABABAB",
+" ",
+" ",
+" .+++. @. ",
+" .+######. .@. ",
+" .$@+++++@#. .@ ",
+" .$++% %+%#. ",
+" $@+ +@# ",
+" .#+% %+#. ",
+" +#% %#+ ",
+" +#%.###. %#+ ",
+" +#% # %#+ ",
+" .#+% # +#. ",
+" #@% # %@+ ",
+" .#+%% . %+#. ",
+" .#@+%%%+##+ ",
+" .@#####+. ",
+" .@$+. ",
+" ",
+" "};
diff --git a/data/pixmaps/toolbar/transforms-decounterpoint.xpm b/data/pixmaps/toolbar/transforms-decounterpoint.xpm
new file mode 100644
index 0000000..6ad9d6e
--- /dev/null
+++ b/data/pixmaps/toolbar/transforms-decounterpoint.xpm
@@ -0,0 +1,33 @@
+/* XPM */
+static char * basis_6_xpm[] = {
+"22 24 6 1",
+" c None",
+"# c black",
+"+ c #242724",
+"@ c #4D4E4D",
+"- c #6B6D6B",
+". c #848484",
+" ",
+" # ",
+" # ",
+" # ",
+" # # ",
+" # # ",
+" # # ",
+" # # ",
+" -@## # ",
+" +#### # ",
+" ##### # ",
+" .#@.# # ",
+" -@## -@## ",
+" +#### +#### ",
+" ##### ##### ",
+" .#@. .#@. ",
+" ",
+" # # ",
+" ###### ",
+" ",
+" ",
+" ",
+" ",
+" "};
diff --git a/data/pixmaps/toolbar/transforms-tie.xpm b/data/pixmaps/toolbar/transforms-tie.xpm
new file mode 100644
index 0000000..16706f8
--- /dev/null
+++ b/data/pixmaps/toolbar/transforms-tie.xpm
@@ -0,0 +1,33 @@
+/* XPM */
+static char * basis_6_xpm[] = {
+"22 24 6 1",
+" c None",
+"# c black",
+"+ c #242724",
+"@ c #4D4E4D",
+"- c #6B6D6B",
+". c #848484",
+" ",
+" ",
+" ",
+" ",
+" # # ",
+" # # ",
+" # # ",
+" # # ",
+" # # ",
+" # # ",
+" # # ",
+" # # ",
+" -@## -@## ",
+" +@ # +#### ",
+" # -# ##### ",
+" .#@. .#@. ",
+" ",
+" # # ",
+" ###### ",
+" ",
+" ",
+" ",
+" ",
+" "};
diff --git a/data/pixmaps/toolbar/transport-cursor-to-pointer.png b/data/pixmaps/toolbar/transport-cursor-to-pointer.png
new file mode 100644
index 0000000..02919ff
--- /dev/null
+++ b/data/pixmaps/toolbar/transport-cursor-to-pointer.png
Binary files differ
diff --git a/data/pixmaps/toolbar/transport-cursor-to-pointer.xpm b/data/pixmaps/toolbar/transport-cursor-to-pointer.xpm
new file mode 100644
index 0000000..65cc416
--- /dev/null
+++ b/data/pixmaps/toolbar/transport-cursor-to-pointer.xpm
@@ -0,0 +1,18 @@
+/* XPM */
+static char *transport[]={
+"12 12 3 1",
+". c None",
+"a c #000080",
+"# c #c000c0",
+"............",
+"............",
+".##.....aa..",
+".##.....aa..",
+".##.#...aa..",
+".##.##..aa..",
+".##.###.aa..",
+".##.##..aa..",
+".##.#...aa..",
+".##.....aa..",
+".##.....aa..",
+"............"};
diff --git a/data/pixmaps/toolbar/transport-ffwd-end.png b/data/pixmaps/toolbar/transport-ffwd-end.png
new file mode 100644
index 0000000..4fd2e0d
--- /dev/null
+++ b/data/pixmaps/toolbar/transport-ffwd-end.png
Binary files differ
diff --git a/data/pixmaps/toolbar/transport-ffwd-end.xpm b/data/pixmaps/toolbar/transport-ffwd-end.xpm
new file mode 100644
index 0000000..b976b78
--- /dev/null
+++ b/data/pixmaps/toolbar/transport-ffwd-end.xpm
@@ -0,0 +1,45 @@
+/* XPM */
+static char *transport[]={
+"11 12 30 1",
+". c None",
+"# c #000000",
+"k c #000100",
+"t c #040404",
+"d c #0a0a0a",
+"g c #0d0d0d",
+"o c #222222",
+"n c #292a28",
+"q c #2b2c28",
+"l c #3d403d",
+"u c #424542",
+"x c #4c4c4c",
+"h c #606360",
+"e c #72726e",
+"a c #7a7e7a",
+"p c #7b7d7b",
+"r c #959794",
+"m c #959995",
+"v c #aeb0ae",
+"y c #b5b7b5",
+"s c #babbba",
+"i c #bec1be",
+"j c #c1c2c1",
+"c c #c2c2c2",
+"f c #cacaca",
+"b c #d4d4d3",
+"B c #d5d5d5",
+"z c #d6d7d6",
+"w c #d7d8d7",
+"A c #d8d8d8",
+"...........",
+"..#ab..c#..",
+"..#def.c#..",
+"..##ghij#..",
+"..###klm#..",
+"..#####n#..",
+"..#####g#..",
+"..####op#..",
+"..##kqrs#..",
+"..#tuvwc#..",
+"..#xyw.c#..",
+"..........."};
diff --git a/data/pixmaps/toolbar/transport-ffwd.png b/data/pixmaps/toolbar/transport-ffwd.png
new file mode 100644
index 0000000..6245f0c
--- /dev/null
+++ b/data/pixmaps/toolbar/transport-ffwd.png
Binary files differ
diff --git a/data/pixmaps/toolbar/transport-ffwd.xpm b/data/pixmaps/toolbar/transport-ffwd.xpm
new file mode 100644
index 0000000..4d6b88c
--- /dev/null
+++ b/data/pixmaps/toolbar/transport-ffwd.xpm
@@ -0,0 +1,59 @@
+/* XPM */
+static char *transport[]={
+"11 12 44 1",
+". c None",
+"m c #000000",
+"s c #010101",
+"E c #030303",
+"u c #050505",
+"z c #060606",
+"t c #0b0b0b",
+"x c #0c0c0c",
+"B c #0e0e0e",
+"g c #111111",
+"j c #131413",
+"p c #151515",
+"f c #171717",
+"i c #171817",
+"c c #171a17",
+"n c #191a19",
+"# c #1a1a17",
+"q c #1b1d1b",
+"A c #222322",
+"v c #2b2e2b",
+"J c #2e2e2e",
+"L c #31312d",
+"P c #393d39",
+"N c #3e403e",
+"o c #505350",
+"F c #525352",
+"H c #535353",
+"C c #595b59",
+"a c #6b6e6b",
+"d c #6d706d",
+"G c #828582",
+"y c #848584",
+"r c #8b8f8b",
+"k c #8c8e8c",
+"h c #8e908e",
+"w c #adb1ad",
+"O c #b2b4b2",
+"M c #b8b8b8",
+"K c #b8bbb8",
+"D c #c6c7c6",
+"I c #c8c8c8",
+"e c #d4d5d4",
+"b c #d4d6d4",
+"l c #d6d7d6",
+"...........",
+"..NO..PM...",
+"..#ab.cde..",
+"..fgh.ijkl.",
+"..fmnopmqre",
+"..fmstumsvw",
+"..fmmmmmmxy",
+"..fmzABmzCD",
+"..fEFGiuHI.",
+"..fJK.iLM..",
+"..NO..PM...",
+"..........."};
diff --git a/data/pixmaps/toolbar/transport-panic.png b/data/pixmaps/toolbar/transport-panic.png
new file mode 100644
index 0000000..1b34cf0
--- /dev/null
+++ b/data/pixmaps/toolbar/transport-panic.png
Binary files differ
diff --git a/data/pixmaps/toolbar/transport-play.png b/data/pixmaps/toolbar/transport-play.png
new file mode 100644
index 0000000..65591c9
--- /dev/null
+++ b/data/pixmaps/toolbar/transport-play.png
Binary files differ
diff --git a/data/pixmaps/toolbar/transport-play.xpm b/data/pixmaps/toolbar/transport-play.xpm
new file mode 100644
index 0000000..14096e6
--- /dev/null
+++ b/data/pixmaps/toolbar/transport-play.xpm
@@ -0,0 +1,57 @@
+/* XPM */
+static char *transport[]={
+"14 12 42 1",
+". c None",
+"i c #000000",
+"x c #000100",
+"A c #010101",
+"u c #010201",
+"j c #020202",
+"o c #030303",
+"d c #050605",
+"F c #0b0b0b",
+"e c #0d0e0d",
+"v c #191a19",
+"s c #1e1f1e",
+"B c #232423",
+"I c #262726",
+"k c #272927",
+"a c #2b2c2b",
+"y c #3e403e",
+"G c #464946",
+"p c #474947",
+"f c #4f504f",
+"C c #797a79",
+"l c #828382",
+"J c #888985",
+"b c #8c8f8c",
+"z c #9da09d",
+"q c #a6a6a6",
+"H c #b0b1b0",
+"g c #b6b8b6",
+"L c #bcbcbc",
+"# c #c3c3c3",
+"K c #c6c7c6",
+"c c #c8c9c8",
+"D c #cbcccb",
+"m c #cecece",
+"w c #d0d0d0",
+"t c #d0d1d0",
+"r c #d1d2d1",
+"h c #d8d8d8",
+"M c #d9d9d9",
+"E c #dadada",
+"N c #dadbda",
+"n c #dbdbdb",
+"....#.........",
+"....abc.......",
+"....defgh.....",
+"....dijklmn...",
+"....diiiopqr..",
+"....diiiijsst.",
+"....diiiiuvvw.",
+"....diiixyzt..",
+"....diABCDE...",
+"....dFGHh.....",
+"....IJK.......",
+"....L........."};
diff --git a/data/pixmaps/toolbar/transport-pointer-to-cursor.png b/data/pixmaps/toolbar/transport-pointer-to-cursor.png
new file mode 100644
index 0000000..f9868ae
--- /dev/null
+++ b/data/pixmaps/toolbar/transport-pointer-to-cursor.png
Binary files differ
diff --git a/data/pixmaps/toolbar/transport-pointer-to-cursor.xpm b/data/pixmaps/toolbar/transport-pointer-to-cursor.xpm
new file mode 100644
index 0000000..6d1cbb8
--- /dev/null
+++ b/data/pixmaps/toolbar/transport-pointer-to-cursor.xpm
@@ -0,0 +1,28 @@
+/* XPM */
+static char * transport_pointer_to_cursor_xpm[] = {
+"22 22 3 1",
+" c None",
+". c #000080",
+"+ c #C000C0",
+" ",
+" ",
+" ",
+" .... ++++ ",
+" .... ++++ ",
+" .... ++++ ",
+" .... ++++ ",
+" .... .. ++++ ",
+" .... .. ++++ ",
+" .... ... ++++ ",
+" .... ..... ++++ ",
+" .... ..... ++++ ",
+" .... .... ++++ ",
+" .... ... ++++ ",
+" .... .. ++++ ",
+" .... .. ++++ ",
+" .... ++++ ",
+" .... ++++ ",
+" .... ++++ ",
+" .... ++++ ",
+" ",
+" "};
diff --git a/data/pixmaps/toolbar/transport-record.png b/data/pixmaps/toolbar/transport-record.png
new file mode 100644
index 0000000..e331965
--- /dev/null
+++ b/data/pixmaps/toolbar/transport-record.png
Binary files differ
diff --git a/data/pixmaps/toolbar/transport-record.xpm b/data/pixmaps/toolbar/transport-record.xpm
new file mode 100644
index 0000000..2918feb
--- /dev/null
+++ b/data/pixmaps/toolbar/transport-record.xpm
@@ -0,0 +1,72 @@
+/* XPM */
+static char *transport[]={
+"12 12 57 1",
+". c None",
+"F c #d76666",
+"O c #d79293",
+"y c #d85d5e",
+"q c #d97a7b",
+"k c #d99797",
+"1 c #d9bbbb",
+"Y c #d9c6c6",
+"s c #d9d2d2",
+"t c #da5f5f",
+"R c #da8282",
+"Z c #dab2b3",
+"D c #dab8b8",
+"# c #dabcbc",
+"L c #dac9c9",
+"2 c #dad1d2",
+"P c #dad6d6",
+"C c #db4343",
+"M c #db4d4d",
+"c c #dbacac",
+"0 c #dbadad",
+"w c #dbb5b5",
+"K c #dbb6b6",
+"m c #dbc2c2",
+"d c #dbcbcb",
+"Q c #dbd2d2",
+"r c #dbd3d4",
+"B c #dc3b3b",
+"a c #dca3a3",
+"z c #dca8a8",
+"v c #dcadad",
+"X c #dcc7c7",
+"l c #dcdbdb",
+"W c #dd4f4f",
+"e c #dd6767",
+"G c #dd7878",
+"b c #dd9f9f",
+"J c #de2828",
+"V c #de2a2a",
+"n c #de3535",
+"S c #de3939",
+"T c #df2121",
+"x c #df2425",
+"E c #df292a",
+"j c #df3d3d",
+"i c #e01a1a",
+"U c #e01c1c",
+"f c #e02a2a",
+"g c #e11212",
+"A c #e11313",
+"p c #e20a0a",
+"h c #e20e0e",
+"I c #e30101",
+"N c #e30202",
+"u c #e30404",
+"H c #e30707",
+"o c #e40101",
+"....#abcd...",
+"..defghijkl.",
+".mnoooooopqr",
+"stuoooooooiv",
+"wxoooooooooy",
+"zAoooooooooB",
+"zAoooooooooC",
+"DEoooooooooF",
+".GHooooooIJK",
+".LMNoooooAOP",
+"..QRSTUVWX..",
+"....YZ012..."};
diff --git a/data/pixmaps/toolbar/transport-rewind-end.png b/data/pixmaps/toolbar/transport-rewind-end.png
new file mode 100644
index 0000000..c7ba16f
--- /dev/null
+++ b/data/pixmaps/toolbar/transport-rewind-end.png
Binary files differ
diff --git a/data/pixmaps/toolbar/transport-rewind-end.xpm b/data/pixmaps/toolbar/transport-rewind-end.xpm
new file mode 100644
index 0000000..d0f8e0a
--- /dev/null
+++ b/data/pixmaps/toolbar/transport-rewind-end.xpm
@@ -0,0 +1,44 @@
+/* XPM */
+static char *transport[]={
+"11 12 29 1",
+". c None",
+"b c #000000",
+"o c #000100",
+"y c #040404",
+"h c #0a0a0a",
+"l c #0d0d0d",
+"r c #222222",
+"p c #292a28",
+"u c #2b2c28",
+"n c #3d403d",
+"x c #424542",
+"A c #4c4c4c",
+"k c #606360",
+"g c #72726e",
+"e c #7a7e7a",
+"q c #7b7d7b",
+"t c #959794",
+"m c #959995",
+"w c #aeb0ae",
+"z c #b5b7b5",
+"s c #babbba",
+"j c #bec1be",
+"i c #c1c2c1",
+"c c #c2c2c2",
+"f c #cacaca",
+"a c #cdcecd",
+"d c #d4d4d3",
+"v c #d7d8d7",
+"# c #d9d9d9",
+"...........",
+"..bc..deb..",
+"..bc.fghb..",
+"..bijklbb..",
+"..bmnobbb..",
+"..bpbbbbb..",
+"..blbbbbb..",
+"..bqrbbbb..",
+"..bstuobb..",
+"..bcvwxyb..",
+"..bc.vzAb..",
+"..........."};
diff --git a/data/pixmaps/toolbar/transport-rewind.png b/data/pixmaps/toolbar/transport-rewind.png
new file mode 100644
index 0000000..c1cb1db
--- /dev/null
+++ b/data/pixmaps/toolbar/transport-rewind.png
Binary files differ
diff --git a/data/pixmaps/toolbar/transport-rewind.xpm b/data/pixmaps/toolbar/transport-rewind.xpm
new file mode 100644
index 0000000..af83218
--- /dev/null
+++ b/data/pixmaps/toolbar/transport-rewind.xpm
@@ -0,0 +1,58 @@
+/* XPM */
+static char *transport[]={
+"11 12 43 1",
+". c None",
+"o c #000000",
+"u c #010101",
+"H c #030303",
+"v c #050505",
+"B c #060606",
+"w c #0b0b0b",
+"y c #0c0c0c",
+"C c #0e0e0e",
+"k c #111111",
+"h c #131413",
+"p c #151515",
+"l c #171717",
+"i c #171817",
+"b c #171a17",
+"r c #191a19",
+"e c #1a1a17",
+"n c #1b1d1b",
+"D c #222322",
+"t c #2b2e2b",
+"L c #2e2e2e",
+"J c #31312d",
+"M c #393d39",
+"O c #3e403e",
+"q c #505350",
+"G c #525352",
+"F c #535353",
+"A c #595b59",
+"d c #6b6e6b",
+"a c #6d706d",
+"x c #848584",
+"m c #8b8f8b",
+"g c #8c8e8c",
+"j c #8e908e",
+"s c #adb1ad",
+"N c #b2b4b2",
+"I c #b8b8b8",
+"K c #b8bbb8",
+"z c #c6c7c6",
+"E c #c8c8c8",
+"# c #d4d5d4",
+"c c #d4d6d4",
+"f c #d6d7d6",
+"...........",
+"...IM..NO..",
+"..#ab.cde..",
+".fghi.jkl..",
+"#mnopqrol..",
+"stuovwuol..",
+"xyooooool..",
+"zABoCDBol..",
+".EFvi.GHl..",
+"..IJi.KLl..",
+"...IM..NO..",
+"..........."};
diff --git a/data/pixmaps/toolbar/transport-solo.png b/data/pixmaps/toolbar/transport-solo.png
new file mode 100644
index 0000000..d74345a
--- /dev/null
+++ b/data/pixmaps/toolbar/transport-solo.png
Binary files differ
diff --git a/data/pixmaps/toolbar/transport-solo.xpm b/data/pixmaps/toolbar/transport-solo.xpm
new file mode 100644
index 0000000..e299305
--- /dev/null
+++ b/data/pixmaps/toolbar/transport-solo.xpm
@@ -0,0 +1,26 @@
+/* XPM */
+static char * transport_solo_xpm[] = {
+"14 12 11 1",
+" c None",
+". c #696C69",
+"+ c #0D0E0D",
+"@ c #000000",
+"# c #333633",
+"$ c #1F211F",
+"% c #353735",
+"& c #050605",
+"* c #070707",
+"= c #383A38",
+"- c #545854",
+" ",
+" ",
+" .+@@@@# ",
+" $@@@@@@@ ",
+" @@@ ",
+" %&@@@*=- ",
+" -=*@@@&% ",
+" @@@ ",
+" @@@@@@@@$ ",
+" *@@@@@+. ",
+" ",
+" "};
diff --git a/data/pixmaps/toolbar/transport-stop.png b/data/pixmaps/toolbar/transport-stop.png
new file mode 100644
index 0000000..3d73b10
--- /dev/null
+++ b/data/pixmaps/toolbar/transport-stop.png
Binary files differ
diff --git a/data/pixmaps/toolbar/transport-stop.xpm b/data/pixmaps/toolbar/transport-stop.xpm
new file mode 100644
index 0000000..3a11cf7
--- /dev/null
+++ b/data/pixmaps/toolbar/transport-stop.xpm
@@ -0,0 +1,17 @@
+/* XPM */
+static char *transport[]={
+"13 12 2 1",
+". c None",
+"# c #000000",
+".............",
+".............",
+"...#######...",
+"...#######...",
+"...#######...",
+"...#######...",
+"...#######...",
+"...#######...",
+"...#######...",
+"...#######...",
+".............",
+"............."};
diff --git a/data/pixmaps/toolbar/transport-tracking.png b/data/pixmaps/toolbar/transport-tracking.png
new file mode 100644
index 0000000..a2ceae9
--- /dev/null
+++ b/data/pixmaps/toolbar/transport-tracking.png
Binary files differ
diff --git a/data/pixmaps/toolbar/transport-tracking.xpm b/data/pixmaps/toolbar/transport-tracking.xpm
new file mode 100644
index 0000000..18dec51
--- /dev/null
+++ b/data/pixmaps/toolbar/transport-tracking.xpm
@@ -0,0 +1,27 @@
+/* XPM */
+static char * transport_tracking_xpm[] = {
+"20 22 2 1",
+" c None",
+". c #222285",
+" ",
+" ",
+" ",
+" ",
+" ... ",
+" .... ",
+" .... ",
+" .... ",
+".. . .... ",
+"... .. .... ",
+".... ... .... ",
+"................... ",
+"................... ",
+"..... ..... ..... ",
+".... ... .... ",
+"... .. .... ",
+".. . .... ",
+" .... ",
+" .... ",
+" .... ",
+" .. ",
+" "};
diff --git a/data/pixmaps/toolbar/trill.xpm b/data/pixmaps/toolbar/trill.xpm
new file mode 100644
index 0000000..c9f14ca
--- /dev/null
+++ b/data/pixmaps/toolbar/trill.xpm
@@ -0,0 +1,25 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"13 11 8 1",
+" c #090909",
+". c #2d2d2d",
+"X c #494949",
+"o c #626262",
+"O c Gray55",
+"+ c #afafaf",
+"@ c #d0d0d0",
+"# c None",
+/* pixels */
+"#############",
+"######@######",
+"##### +######",
+"####@ +######",
+"####@ #@o##@#",
+"##++X.+OX.@ +",
+"#++@. @#+.#.@",
+"#+OO X##.O###",
+"##@@ +O#.@###",
+"###@ X+@ @###",
+"####+O#@O####"
+};
diff --git a/data/pixmaps/toolbar/triplet.xpm b/data/pixmaps/toolbar/triplet.xpm
new file mode 100644
index 0000000..c82bf8e
--- /dev/null
+++ b/data/pixmaps/toolbar/triplet.xpm
@@ -0,0 +1,33 @@
+/* XPM */
+static char * basis_6_xpm[] = {
+"22 24 6 1",
+" c None",
+"# c black",
+"+ c #242724",
+"@ c #4D4E4D",
+"- c #6B6D6B",
+". c #848484",
+" ",
+" ",
+" ",
+" ############# ",
+" ############# ",
+" # # # ",
+" # # # ",
+" # # # ",
+" # # # ",
+" # # # ",
+" # # # ",
+" # # # ",
+" -@## -@## -@## ",
+" +#### +#### +#### ",
+" ##### ##### ##### ",
+" .#@. .#@. .#@. ",
+" ",
+" #### ",
+" #- ",
+" ##. ",
+" @# ",
+" . @# ",
+" +##. ",
+" "};
diff --git a/data/pixmaps/toolbar/turn.xpm b/data/pixmaps/toolbar/turn.xpm
new file mode 100644
index 0000000..fa1bc6d
--- /dev/null
+++ b/data/pixmaps/toolbar/turn.xpm
@@ -0,0 +1,22 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"14 8 8 1",
+" c #010101",
+". c Gray21",
+"X c #484848",
+"o c #777777",
+"O c Gray56",
+"+ c #b9b9b9",
+"@ c #c8c8c8",
+"# c None",
+/* pixels */
+"##############",
+"###@OO####OO##",
+"##X .+#o .#",
+"#+.OX @@ Xo@",
+"#O@##+ +##@O",
+"#@oX @@ XO.+",
+"##. o#+. X#",
+"###OO####OO@##"
+};
diff --git a/data/pixmaps/toolbar/un-mute-all.png b/data/pixmaps/toolbar/un-mute-all.png
new file mode 100644
index 0000000..27af613
--- /dev/null
+++ b/data/pixmaps/toolbar/un-mute-all.png
Binary files differ
diff --git a/data/pixmaps/toolbar/un-mute-all.xpm b/data/pixmaps/toolbar/un-mute-all.xpm
new file mode 100644
index 0000000..36ea88c
--- /dev/null
+++ b/data/pixmaps/toolbar/un-mute-all.xpm
@@ -0,0 +1,87 @@
+/* XPM */
+static char * un_mute_all_xpm[] = {
+"22 22 62 1",
+" c None",
+". c #8D8E8E",
+"+ c #7F7F7F",
+"@ c #727272",
+"# c #8A8A8B",
+"$ c #ADAEAF",
+"% c #7F7F80",
+"& c #5F6264",
+"* c #63788F",
+"= c #668EB8",
+"- c #758FAB",
+"; c #8A9096",
+"> c #A7A8A8",
+", c #8C8D8E",
+"' c #595C5E",
+") c #6593C5",
+"! c #94C6FD",
+"~ c #A4D0FF",
+"{ c #8CC3FF",
+"] c #77AEE9",
+"^ c #9EA6AF",
+"/ c #C0C1C1",
+"( c #777777",
+"_ c #5C7188",
+": c #DDEDFF",
+"< c #E5F2FF",
+"[ c #BFDEFF",
+"} c #8CC4FF",
+"| c #92B5D9",
+"1 c #BFBFBF",
+"2 c #676767",
+"3 c #6088B3",
+"4 c #EAF4FF",
+"5 c #C7E2FF",
+"6 c #97C9FF",
+"7 c #86BAF1",
+"8 c #CFCFCF",
+"9 c #808080",
+"0 c #6D87A3",
+"a c #BEDEFF",
+"b c #B2D7FF",
+"c c #8DC4FF",
+"d c #A5CCF6",
+"e c #E6E6E6",
+"f c #A9AAAB",
+"g c #7E848A",
+"h c #74ABE6",
+"i c #84C0FF",
+"j c #E2EFFE",
+"k c #F5F5F5",
+"l c #9B9B9B",
+"m c #9098A1",
+"n c #89ACD0",
+"o c #81B4EC",
+"p c #9CC3EC",
+"q c #D4E1EF",
+"r c #FBFBFC",
+"s c #B5B6B6",
+"t c #AEAEAE",
+"u c #BBBBBB",
+"v c #D1D1D1",
+"w c #E2E3E3",
+" ",
+" .+@#$ ",
+" %&*=-;> ",
+" ,')!~{]^/ ",
+" (_!:<[}|1 ",
+" 23~<45678 ",
+" 90{a5bcde ",
+" fgh}6cijk ",
+" lmnopqr ",
+" stuvw ",
+" ",
+" ",
+" .+@#$ ",
+" %&*=-;> ",
+" ,')!~{]^/ ",
+" (_!:<[}|1 ",
+" 23~<45678 ",
+" 90{a5bcde ",
+" fgh}6cijk ",
+" lmnopqr ",
+" stuvw ",
+" "};
diff --git a/data/pixmaps/toolbar/up-bow.xpm b/data/pixmaps/toolbar/up-bow.xpm
new file mode 100644
index 0000000..c25301f
--- /dev/null
+++ b/data/pixmaps/toolbar/up-bow.xpm
@@ -0,0 +1,28 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"9 14 8 1",
+" c #181818",
+". c #2d2d2d",
+"X c Gray26",
+"o c #6a6a6a",
+"O c #818181",
+"+ c Gray69",
+"@ c Gray79",
+"# c None",
+/* pixels */
+"#########",
+"##@#####@",
+"#oo####oo",
+"## #### #",
+"## ###+X#",
+"##oo##oo#",
+"##+.##X+#",
+"### ## ##",
+"###X++X##",
+"###oOoo##",
+"###+. ###",
+"#### ###",
+"####oo###",
+"#####@###"
+};
diff --git a/data/pixmaps/transport/button-bar-time.png b/data/pixmaps/transport/button-bar-time.png
new file mode 100644
index 0000000..d79a2c5
--- /dev/null
+++ b/data/pixmaps/transport/button-bar-time.png
Binary files differ
diff --git a/data/pixmaps/transport/button-bar-time.xpm b/data/pixmaps/transport/button-bar-time.xpm
new file mode 100644
index 0000000..d2ed579
--- /dev/null
+++ b/data/pixmaps/transport/button-bar-time.xpm
@@ -0,0 +1,21 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"11 11 4 1",
+" c None",
+"X c black",
+"O c gray25",
+"o c gray50",
+/* pixels */
+" ",
+" OO OO ",
+" OO OO ",
+" OO OO ",
+" OO OO ",
+" OO OO ",
+" OO OO ",
+" OO OO ",
+" OO OO ",
+" OO OO ",
+" ",
+};
diff --git a/data/pixmaps/transport/button-clock.xpm b/data/pixmaps/transport/button-clock.xpm
new file mode 100644
index 0000000..0ed9391
--- /dev/null
+++ b/data/pixmaps/transport/button-clock.xpm
@@ -0,0 +1,21 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"11 11 4 1",
+" c None",
+"X c black",
+"O c gray25",
+"o c gray50",
+/* pixels */
+" oOXXXOo ",
+" oXXo oXXo ",
+"oXo X oXo",
+"OX X o XO",
+"Xo X X oX",
+"X XX X",
+"Xo X oX",
+"OX XO",
+"oXo oXo",
+" oXXo oXXo ",
+" oOXXXOo ",
+};
diff --git a/data/pixmaps/transport/button-ffwd-end.png b/data/pixmaps/transport/button-ffwd-end.png
new file mode 100644
index 0000000..2247807
--- /dev/null
+++ b/data/pixmaps/transport/button-ffwd-end.png
Binary files differ
diff --git a/data/pixmaps/transport/button-ffwd-end.xpm b/data/pixmaps/transport/button-ffwd-end.xpm
new file mode 100644
index 0000000..067cbc2
--- /dev/null
+++ b/data/pixmaps/transport/button-ffwd-end.xpm
@@ -0,0 +1,102 @@
+/* XPM */
+static char *end[] = {
+/* width height num_colors chars_per_pixel */
+" 14 21 74 2",
+/* colors */
+".. c #000000",
+".# c #000400",
+".a c #080800",
+".b c #080808",
+".c c #080c08",
+".d c #101010",
+".e c #101410",
+".f c #181818",
+".g c #202020",
+".h c #202420",
+".i c #282828",
+".j c #282c28",
+".k c #303028",
+".l c #303030",
+".m c #303430",
+".n c #383838",
+".o c #404040",
+".p c #404440",
+".q c #484848",
+".r c #484c48",
+".s c #505050",
+".t c #505450",
+".u c #606060",
+".v c #606460",
+".w c #686868",
+".x c #686c68",
+".y c #687880",
+".z c #707070",
+".A c #707470",
+".B c #787870",
+".C c #787878",
+".D c #787c78",
+".E c #808080",
+".F c #808480",
+".G c #8098a0",
+".H c #888888",
+".I c #888c88",
+".J c #909088",
+".K c #909090",
+".L c #909490",
+".M c #989898",
+".N c #989c98",
+".O c #98b8c8",
+".P c #a0a098",
+".Q c #a0a0a0",
+".R c #a0a4a0",
+".S c #a0b8c8",
+".T c #a0bcc8",
+".U c #a8a8a8",
+".V c #a8aca8",
+".W c #a8bcc8",
+".X c #a8c0c8",
+".Y c #a8c4c8",
+".Z c #b0b0b0",
+".0 c #b0b4b0",
+".1 c #b0c0c8",
+".2 c #b0c4c8",
+".3 c #b0c8d0",
+".4 c #b8bcb8",
+".5 c #b8c4c8",
+".6 c #b8c8c8",
+".7 c #b8c8d0",
+".8 c #c0c0c0",
+".9 c #c0c4c0",
+"#. c #c0c8c8",
+"## c #c0c8d0",
+"#a c #c0ccd0",
+"#b c #c8c8c8",
+"#c c #c8ccc8",
+"#d c #c8ccd0",
+"#e c #c8d0d0",
+"#f c None",
+"#g c #d0d4d0",
+"#h c #e8ece8",
+/* pixels */
+"#f#f#f#f#f#f#f#f#f#f#f#f#f#f",
+"#f#f#f#f#f#f#f#f#f#f#c#c#f#f",
+"#f#f.0.N#c#f#f#f#f#f.l.E#f#f",
+"#f#f.U.c.L#f#f#f#f#f.j.E#f#f",
+"#f#f.U...b.J#f#f#f#f.j.E#f#f",
+"#f#f.U.....b.H#f#f#f.j.E#f#f",
+"#f#f.U.......#.F#c#f.j.E#f#f",
+"#f#f.U.........#.D#c.j.E#f#f",
+"#f#f.U.............A.j.E#f#f",
+"#f#f.U...............a.E#f#f",
+"#f#f.U...............#.E#f#f",
+"#f#f.U.............w.j.E#f#f",
+"#f#f.U...........z#c.j.E#f#f",
+"#f#f.U.......#.B#c#f.j.E#f#f",
+"#f#f.U.....#.C#c#f#f.j.E#f#f",
+"#f#f.U...b.E#c#f#f#f.j.E#f#f",
+"#f#f.U.b.H#c#f#f#f#f.j.E#f#f",
+"#f#f.Z.K#c#f#f#f#f#f.j.E#f#f",
+"#f#f#c#f#f#f#f#f#f#f.Z.8#f#f",
+"#f#f#f#f#f#f#f#f#f#f#f#f#f#f",
+"#f#f#f#f#f#f#f#f#f#f#f#f#f#f"
+};
diff --git a/data/pixmaps/transport/button-ffwd.png b/data/pixmaps/transport/button-ffwd.png
new file mode 100644
index 0000000..358fda8
--- /dev/null
+++ b/data/pixmaps/transport/button-ffwd.png
Binary files differ
diff --git a/data/pixmaps/transport/button-ffwd.xpm b/data/pixmaps/transport/button-ffwd.xpm
new file mode 100644
index 0000000..d9429f0
--- /dev/null
+++ b/data/pixmaps/transport/button-ffwd.xpm
@@ -0,0 +1,99 @@
+/* XPM */
+static char *ffwd[] = {
+/* width height num_colors chars_per_pixel */
+" 14 18 74 2",
+/* colors */
+".. c #000000",
+".# c #000400",
+".a c #080800",
+".b c #080808",
+".c c #080c08",
+".d c #101010",
+".e c #101410",
+".f c #181818",
+".g c #202020",
+".h c #202420",
+".i c #282828",
+".j c #282c28",
+".k c #303028",
+".l c #303030",
+".m c #303430",
+".n c #383838",
+".o c #404040",
+".p c #404440",
+".q c #484848",
+".r c #484c48",
+".s c #505050",
+".t c #505450",
+".u c #606060",
+".v c #606460",
+".w c #686868",
+".x c #686c68",
+".y c #687880",
+".z c #707070",
+".A c #707470",
+".B c #787870",
+".C c #787878",
+".D c #787c78",
+".E c #808080",
+".F c #808480",
+".G c #8098a0",
+".H c #888888",
+".I c #888c88",
+".J c #909088",
+".K c #909090",
+".L c #909490",
+".M c #989898",
+".N c #989c98",
+".O c #98b8c8",
+".P c #a0a098",
+".Q c #a0a0a0",
+".R c #a0a4a0",
+".S c #a0b8c8",
+".T c #a0bcc8",
+".U c #a8a8a8",
+".V c #a8aca8",
+".W c #a8bcc8",
+".X c #a8c0c8",
+".Y c #a8c4c8",
+".Z c #b0b0b0",
+".0 c #b0b4b0",
+".1 c #b0c0c8",
+".2 c #b0c4c8",
+".3 c #b0c8d0",
+".4 c #b8bcb8",
+".5 c #b8c4c8",
+".6 c #b8c8c8",
+".7 c #b8c8d0",
+".8 c #c0c0c0",
+".9 c #c0c4c0",
+"#. c #c0c8c8",
+"## c #c0c8d0",
+"#a c #c0ccd0",
+"#b c #c8c8c8",
+"#c c #c8ccc8",
+"#d c #c8ccd0",
+"#e c #c8d0d0",
+"#f c None",
+"#g c #d0d4d0",
+"#h c #e8ece8",
+/* pixels */
+"#f#f#c#f#f#f#f#c#f#f#f#f#f#f",
+"#f#f.D#c#f#f#f.E#b#f#f#f#f#f",
+"#f#f.o.A#f#f#f.t.u#c#f#f#f#f",
+"#f#f.o.a.R#f#f.t.#.L#f#f#f#f",
+"#f#f.o...g.9#f.t...e.4#f#f#f",
+"#f#f.o.....s#c.t.....o#c#f#f",
+"#f#f.o.......F.t.......A#c#f",
+"#f#f.o.......c.n.......b.R#f",
+"#f#f.o...................h.9",
+"#f#f.o.....................K",
+"#f#f.o.........#.........o#c",
+"#f#f.o.......g.q.......f.4#f",
+"#f#f.o.....b.R.t.......M#f#f",
+"#f#f.o.....A#f.t.....u#f#f#f",
+"#f#f.o...o#c#f.t...k#b#f#f#f",
+"#f#f.o.e.4#f#f.t.c.Z#f#f#f#f",
+"#f#f.p.M#f#f#f.t.F#f#f#f#f#f",
+"#f#f.N#c#f#f#f.P#c#f#f#f#f#f"
+};
diff --git a/data/pixmaps/transport/button-flip-closed.png b/data/pixmaps/transport/button-flip-closed.png
new file mode 100644
index 0000000..3a9ba62
--- /dev/null
+++ b/data/pixmaps/transport/button-flip-closed.png
Binary files differ
diff --git a/data/pixmaps/transport/button-flip-closed.xpm b/data/pixmaps/transport/button-flip-closed.xpm
new file mode 100644
index 0000000..ca64998
--- /dev/null
+++ b/data/pixmaps/transport/button-flip-closed.xpm
@@ -0,0 +1,21 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"11 11 4 1",
+" c None",
+"X c black",
+"O c gray25",
+"o c gray50",
+/* pixels */
+" ",
+" ",
+" O ",
+" OXX ",
+" OX XO ",
+" OX XO ",
+" OX XO ",
+" XoooooooX ",
+" XXXXXXXXX ",
+" ",
+" ",
+};
diff --git a/data/pixmaps/transport/button-flip-open.png b/data/pixmaps/transport/button-flip-open.png
new file mode 100644
index 0000000..92959c8
--- /dev/null
+++ b/data/pixmaps/transport/button-flip-open.png
Binary files differ
diff --git a/data/pixmaps/transport/button-flip-open.xpm b/data/pixmaps/transport/button-flip-open.xpm
new file mode 100644
index 0000000..09afecf
--- /dev/null
+++ b/data/pixmaps/transport/button-flip-open.xpm
@@ -0,0 +1,21 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"11 11 4 1",
+" c None",
+"X c black",
+"O c gray25",
+"o c gray50",
+/* pixels */
+" ",
+" ",
+" XXXXXXXXX ",
+" XoooooooX ",
+" OX XO ",
+" OX XO ",
+" OX XO ",
+" OXX ",
+" O ",
+" ",
+" ",
+};
diff --git a/data/pixmaps/transport/button-from-end.png b/data/pixmaps/transport/button-from-end.png
new file mode 100644
index 0000000..6846b0a
--- /dev/null
+++ b/data/pixmaps/transport/button-from-end.png
Binary files differ
diff --git a/data/pixmaps/transport/button-from-end.xpm b/data/pixmaps/transport/button-from-end.xpm
new file mode 100644
index 0000000..f4c120e
--- /dev/null
+++ b/data/pixmaps/transport/button-from-end.xpm
@@ -0,0 +1,21 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"11 11 4 1",
+" c None",
+"X c black",
+"O c gray25",
+"o c gray50",
+/* pixels */
+" ",
+" X OO ",
+" XX OO ",
+" XX OO ",
+" XXoooo OO ",
+"XXXXXXX OO ",
+" XXoooo OO ",
+" XX OO ",
+" XX OO ",
+" X OO ",
+" ",
+};
diff --git a/data/pixmaps/transport/button-loop-2.png b/data/pixmaps/transport/button-loop-2.png
new file mode 100644
index 0000000..6243235
--- /dev/null
+++ b/data/pixmaps/transport/button-loop-2.png
Binary files differ
diff --git a/data/pixmaps/transport/button-loop-2.xpm b/data/pixmaps/transport/button-loop-2.xpm
new file mode 100644
index 0000000..75da0f2
--- /dev/null
+++ b/data/pixmaps/transport/button-loop-2.xpm
@@ -0,0 +1,56 @@
+/* XPM */
+static char *button-loop-2[] = {
+/* width height num_colors chars_per_pixel */
+" 30 20 29 1",
+/* colors */
+". c None",
+"# c #d7d7d7",
+"a c #8e8e8e",
+"b c #555555",
+"c c #2b2b2b",
+"d c #101010",
+"e c #020202",
+"f c #a4a4a4",
+"g c #373737",
+"h c #000000",
+"i c #cecece",
+"j c #383838",
+"k c #a6a6a6",
+"l c #212121",
+"m c #757575",
+"n c #b3b3b3",
+"o c #dcdcdc",
+"p c #f3f3f3",
+"q c #fdfdfd",
+"r c #b2b2b2",
+"s c #4a4a4a",
+"t c #f7f7f7",
+"u c #151515",
+"v c #9f9f9f",
+"w c #838383",
+"x c #888888",
+"y c #313131",
+"z c #f1f1f1",
+"A c #060606",
+/* pixels */
+".........#abcdeedcba#.........",
+".......fghhhhhhhhhhhhgf.......",
+".....ijhhhhhhhhhhhhhhhhji.....",
+"....khhhhlmn.....onmlhhhhk....",
+"...rhhhs#............#shhhr...",
+"...uhhv................vhhu...",
+"..whhx..................xhhw..",
+"..yhh....................hhy..",
+"..Ahh....................hhA..",
+"..Ahhx..................xhhA..",
+"..yhhhv.....h..........vhhhy..",
+"..whhhhs#...hh.......#shhhhw..",
+"...uhhhhhlmnhhh.....lhhhhhu...",
+"...rhhhhhhhhhhhh....hhhhhhr...",
+"....khhhhhhhhhhhh...hhhhhk....",
+".....ijhhhhhhhhhh...hhhji.....",
+".......fghhhhhhh....hgf.......",
+".........#abhhh.....#.........",
+"............hh................",
+"............h................."
+};
diff --git a/data/pixmaps/transport/button-loop-3.png b/data/pixmaps/transport/button-loop-3.png
new file mode 100644
index 0000000..dd95b41
--- /dev/null
+++ b/data/pixmaps/transport/button-loop-3.png
Binary files differ
diff --git a/data/pixmaps/transport/button-loop.xpm b/data/pixmaps/transport/button-loop.xpm
new file mode 100644
index 0000000..3673178
--- /dev/null
+++ b/data/pixmaps/transport/button-loop.xpm
@@ -0,0 +1,35 @@
+/* XPM */
+static char * button_loop_xpm[] = {
+"24 24 8 1",
+" c None",
+". c #030303",
+"+ c #020202",
+"@ c #000000",
+"# c #010101",
+"$ c #060606",
+"% c #040404",
+"& c #050505",
+" ",
+" .. ",
+" +@@@@@@# ",
+" @@@@@@@@@@+ ",
+" $@@@@@@@@@@@@+ ",
+" @@@@#. .#@@@@. ",
+" +@@@. .@@@@ ",
+" @@@# +@@@. ",
+" @@@ @@@+ ",
+" +@@@ +@@# ",
+" #@@@ +@@@ ",
+" +@@@ +@@# ",
+" @@@ + @@@+ ",
+" @@@# +@++@@@. ",
+" +@@@+ #@@@@@@ ",
+" @@@@# @@@@@@. ",
+" %@@@# .@@@@@# ",
+" %@@ #@@@@@# ",
+" @@@@@@@# ",
+" .@@@@@@@@& ",
+" #@@#+. ",
+" . ",
+" ",
+" "};
diff --git a/data/pixmaps/transport/button-loopend.png b/data/pixmaps/transport/button-loopend.png
new file mode 100644
index 0000000..d8b30e3
--- /dev/null
+++ b/data/pixmaps/transport/button-loopend.png
Binary files differ
diff --git a/data/pixmaps/transport/button-loopstart.png b/data/pixmaps/transport/button-loopstart.png
new file mode 100644
index 0000000..bcbd6d7
--- /dev/null
+++ b/data/pixmaps/transport/button-loopstart.png
Binary files differ
diff --git a/data/pixmaps/transport/button-metronome.png b/data/pixmaps/transport/button-metronome.png
new file mode 100644
index 0000000..7df11b0
--- /dev/null
+++ b/data/pixmaps/transport/button-metronome.png
Binary files differ
diff --git a/data/pixmaps/transport/button-metronome.xpm b/data/pixmaps/transport/button-metronome.xpm
new file mode 100644
index 0000000..fab16e0
--- /dev/null
+++ b/data/pixmaps/transport/button-metronome.xpm
@@ -0,0 +1,52 @@
+/* XPM */
+static char *button-metronome[] = {
+/* width height num_colors chars_per_pixel */
+" 20 20 25 1",
+/* colors */
+". c None",
+"# c #d7d7d7",
+"a c #8e8e8e",
+"b c #555555",
+"c c #2b2b2b",
+"d c #101010",
+"e c #020202",
+"f c #a4a4a4",
+"g c #373737",
+"h c #000000",
+"i c #cecece",
+"j c #383838",
+"k c #a6a6a6",
+"l c #212121",
+"m c #757575",
+"n c #b3b3b3",
+"o c #dcdcdc",
+"p c #b2b2b2",
+"q c #4a4a4a",
+"r c #151515",
+"s c #9f9f9f",
+"t c #838383",
+"u c #888888",
+"v c #313131",
+"w c #060606",
+/* pixels */
+"....................",
+"....................",
+"........hhhh........",
+".......qt..tq.......",
+"...hh..h....h.......",
+"...hh.sv....vs......",
+"....htqt....tq......",
+".....hh......h......",
+".....qh......h......",
+".....sht.....vs.....",
+".....qqh.....tq.....",
+".....h.ht.....h.....",
+".....h.fh.....h.....",
+"....sv..ht....vs....",
+"....qt..fhh...tq....",
+"....h....hh....h....",
+"...sh..........hs...",
+"...hhhhhhhhhhhhhh...",
+"....................",
+"...................."
+};
diff --git a/data/pixmaps/transport/button-panic.png b/data/pixmaps/transport/button-panic.png
new file mode 100644
index 0000000..0a1fa2a
--- /dev/null
+++ b/data/pixmaps/transport/button-panic.png
Binary files differ
diff --git a/data/pixmaps/transport/button-panic.xpm b/data/pixmaps/transport/button-panic.xpm
new file mode 100644
index 0000000..2fc49ae
--- /dev/null
+++ b/data/pixmaps/transport/button-panic.xpm
@@ -0,0 +1,46 @@
+/* XPM */
+static char * button_panic_xpm[] = {
+"40 40 3 1",
+" c None",
+". c #000000",
+"x c #808080",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ...... ",
+" ...... ",
+" ...... ",
+" x....x ",
+" x....x ",
+" x....x ",
+" .... ",
+" .... ",
+" x..x ",
+" x..x ",
+" x..x ",
+" xx ",
+" ",
+" .... ",
+" .... ",
+" .... ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" "};
diff --git a/data/pixmaps/transport/button-pause.xpm b/data/pixmaps/transport/button-pause.xpm
new file mode 100644
index 0000000..6d295f5
--- /dev/null
+++ b/data/pixmaps/transport/button-pause.xpm
@@ -0,0 +1,150 @@
+/* XPM */
+static char *pause[] = {
+/* width height num_colors chars_per_pixel */
+" 18 20 123 2",
+/* colors */
+".. c #000000",
+".# c #0000f8",
+".a c #000400",
+".b c #080800",
+".c c #080808",
+".d c #080c08",
+".e c #101010",
+".f c #101410",
+".g c #181818",
+".h c #181c18",
+".i c #202020",
+".j c #202420",
+".k c #282828",
+".l c #282c28",
+".m c #303028",
+".n c #303030",
+".o c #303430",
+".p c #383838",
+".q c #404040",
+".r c #404440",
+".s c #484848",
+".t c #484c48",
+".u c #505050",
+".v c #505450",
+".w c #585c58",
+".x c #606060",
+".y c #606460",
+".z c #686868",
+".A c #686c68",
+".B c #707070",
+".C c #707470",
+".D c #787870",
+".E c #787878",
+".F c #787c78",
+".G c #808078",
+".H c #808080",
+".I c #808480",
+".J c #888888",
+".K c #888c88",
+".L c #909088",
+".M c #909090",
+".N c #909490",
+".O c #989898",
+".P c #989c98",
+".Q c #98b8c8",
+".R c #a0a098",
+".S c #a0a0a0",
+".T c #a0a4a0",
+".U c #a0b8c8",
+".V c #a0bcc8",
+".W c #a8a8a8",
+".X c #a8aca8",
+".Y c #a8bcc8",
+".Z c #a8c0c8",
+".0 c #a8c4c8",
+".1 c #b0b0b0",
+".2 c #b0b4b0",
+".3 c #b0c0c8",
+".4 c #b0c4c8",
+".5 c #b0c8d0",
+".6 c #b8b8b8",
+".7 c #b8bcb8",
+".8 c #b8c4c8",
+".9 c #b8c8c8",
+"#. c #b8c8d0",
+"## c #c0c0c0",
+"#a c #c0c4c0",
+"#b c #c0c8c8",
+"#c c #c0c8d0",
+"#d c #c0ccc8",
+"#e c #c0ccd0",
+"#f c #c8c8c8",
+"#g c #c8ccc8",
+"#h c #c8ccd0",
+"#i c #c8d0d0",
+"#j c None",
+"#k c #d0d4d0",
+"#l c #e00000",
+"#m c #e0aca8",
+"#n c #e0b0b0",
+"#o c #e0b4b0",
+"#p c #e0b8b8",
+"#q c #e80000",
+"#r c #e87070",
+"#s c #e87470",
+"#t c #e87878",
+"#u c #e87c78",
+"#v c #e88080",
+"#w c #e88480",
+"#x c #e88888",
+"#y c #e8a098",
+"#z c #e8a0a0",
+"#A c #e8a4a0",
+"#B c #e8a8a8",
+"#C c #e8ece8",
+"#D c #f00000",
+"#E c #f04040",
+"#F c #f04440",
+"#G c #f04848",
+"#H c #f04c48",
+"#I c #f05450",
+"#J c #f05c58",
+"#K c #f06060",
+"#L c #f06868",
+"#M c #f06c68",
+"#N c #f07878",
+"#O c #f07c78",
+"#P c #f80000",
+"#Q c #f80400",
+"#R c #f80808",
+"#S c #f80c08",
+"#T c #f81010",
+"#U c #f81c18",
+"#V c #f82020",
+"#W c #f82420",
+"#X c #f82828",
+"#Y c #f82c28",
+"#Z c #f83030",
+"#0 c #f83430",
+"#1 c #f83c38",
+"#2 c #f84040",
+"#3 c #f84440",
+"#4 c #f84c48",
+/* pixels */
+"#j#j#j#j#j#j#j#j#j#j#j#j#j#j#j#j#j#j",
+"#j#j#j#j#j#j#j#j#j#j#j#j#j#j#j#j#j#j",
+"#j#j#j#j#j#j#j#j#j#j#j#j#j#j#j#j#j#j",
+"#j#j#j#j#f#######j#j#######g#j#j#j#j",
+"#j#j#j#j.K.c.c.j#j#g.c.c.c.W#j#j#j#j",
+"#j#j#j#j.J.....h#j#g.......W#j#j#j#j",
+"#j#j#j#j.J.....h#j#g.......W#j#j#j#j",
+"#j#j#j#j.J.....h#j#g.......W#j#j#j#j",
+"#j#j#j#j.J.....h#j#g.......W#j#j#j#j",
+"#j#j#j#j.J.....h#j#g.......W#j#j#j#j",
+"#j#j#j#j.J.....h#j#g.......W#j#j#j#j",
+"#j#j#j#j.J.....h#j#g.......W#j#j#j#j",
+"#j#j#j#j.J.....h#j#g.......W#j#j#j#j",
+"#j#j#j#j.J.....h#j#g.......W#j#j#j#j",
+"#j#j#j#j.J.....h#j#g.......W#j#j#j#j",
+"#j#j#j#j.K.a.a.i#j#g.a.a.a.W#j#j#j#j",
+"#j#j#j#j#f.7.7###j#j.7.7.7#g#j#j#j#j",
+"#j#j#j#j#j#j#j#j#j#j#j#j#j#j#j#j#j#j",
+"#j#j#j#j#j#j#j#j#j#j#j#j#j#j#j#j#j#j",
+"#j#j#j#j#j#j#j#j#j#j#j#j#j#j#j#j#j#j"
+};
diff --git a/data/pixmaps/transport/button-play.xpm b/data/pixmaps/transport/button-play.xpm
new file mode 100644
index 0000000..11f005c
--- /dev/null
+++ b/data/pixmaps/transport/button-play.xpm
@@ -0,0 +1,150 @@
+/* XPM */
+static char *play[] = {
+/* width height num_colors chars_per_pixel */
+" 20 20 123 2",
+/* colors */
+".. c #000000",
+".# c #0000f8",
+".a c #000400",
+".b c #080800",
+".c c #080808",
+".d c #080c08",
+".e c #101010",
+".f c #101410",
+".g c #181818",
+".h c #181c18",
+".i c #202020",
+".j c #202420",
+".k c #282828",
+".l c #282c28",
+".m c #303028",
+".n c #303030",
+".o c #303430",
+".p c #383838",
+".q c #404040",
+".r c #404440",
+".s c #484848",
+".t c #484c48",
+".u c #505050",
+".v c #505450",
+".w c #585c58",
+".x c #606060",
+".y c #606460",
+".z c #686868",
+".A c #686c68",
+".B c #707070",
+".C c #707470",
+".D c #787870",
+".E c #787878",
+".F c #787c78",
+".G c #808078",
+".H c #808080",
+".I c #808480",
+".J c #888888",
+".K c #888c88",
+".L c #909088",
+".M c #909090",
+".N c #909490",
+".O c #989898",
+".P c #989c98",
+".Q c #98b8c8",
+".R c #a0a098",
+".S c #a0a0a0",
+".T c #a0a4a0",
+".U c #a0b8c8",
+".V c #a0bcc8",
+".W c #a8a8a8",
+".X c #a8aca8",
+".Y c #a8bcc8",
+".Z c #a8c0c8",
+".0 c #a8c4c8",
+".1 c #b0b0b0",
+".2 c #b0b4b0",
+".3 c #b0c0c8",
+".4 c #b0c4c8",
+".5 c #b0c8d0",
+".6 c #b8b8b8",
+".7 c #b8bcb8",
+".8 c #b8c4c8",
+".9 c #b8c8c8",
+"#. c #b8c8d0",
+"## c #c0c0c0",
+"#a c #c0c4c0",
+"#b c #c0c8c8",
+"#c c #c0c8d0",
+"#d c #c0ccc8",
+"#e c #c0ccd0",
+"#f c #c8c8c8",
+"#g c #c8ccc8",
+"#h c #c8ccd0",
+"#i c #c8d0d0",
+"#j c None",
+"#k c #d0d4d0",
+"#l c #e00000",
+"#m c #e0aca8",
+"#n c #e0b0b0",
+"#o c #e0b4b0",
+"#p c #e0b8b8",
+"#q c #e80000",
+"#r c #e87070",
+"#s c #e87470",
+"#t c #e87878",
+"#u c #e87c78",
+"#v c #e88080",
+"#w c #e88480",
+"#x c #e88888",
+"#y c #e8a098",
+"#z c #e8a0a0",
+"#A c #e8a4a0",
+"#B c #e8a8a8",
+"#C c #e8ece8",
+"#D c #f00000",
+"#E c #f04040",
+"#F c #f04440",
+"#G c #f04848",
+"#H c #f04c48",
+"#I c #f05450",
+"#J c #f05c58",
+"#K c #f06060",
+"#L c #f06868",
+"#M c #f06c68",
+"#N c #f07878",
+"#O c #f07c78",
+"#P c #f80000",
+"#Q c #f80400",
+"#R c #f80808",
+"#S c #f80c08",
+"#T c #f81010",
+"#U c #f81c18",
+"#V c #f82020",
+"#W c #f82420",
+"#X c #f82828",
+"#Y c #f82c28",
+"#Z c #f83030",
+"#0 c #f83430",
+"#1 c #f83c38",
+"#2 c #f84040",
+"#3 c #f84440",
+"#4 c #f84c48",
+/* pixels */
+"#j#j#j#j#j#j#j#j#j#j#j#j#j#j#j#j#j#j#j#j",
+"#j#j#j#j#j#j#j#j#j#j#j#j#j#j#j#j#j#j#j#j",
+"#j#j#j#j#j.B###j#j#j#j#j#j#j#j#j#j#j#j#j",
+"#j#j#j#j#j.h.g.K#g#j#j#j#j#j#j#j#j#j#j#j",
+"#j#j#j#j#j.h.....r.6#j#j#j#j#j#j#j#j#j#j",
+"#j#j#j#j#j.h.......e.F#g#j#j#j#j#j#j#j#j",
+"#j#j#j#j#j.h...........o.1#j#j#j#j#j#j#j",
+"#j#j#j#j#j.h.............c.A#f#j#j#j#j#j",
+"#j#j#j#j#j.h.................k.S#g#j#j#j",
+"#j#j#j#j#j.h...................a.w#a#j#j",
+"#j#j#j#j#j.h.....................u###j#j",
+"#j#j#j#j#j.h.................h.N#g#j#j#j",
+"#j#j#j#j#j.h.............a.w#a#j#j#j#j#j",
+"#j#j#j#j#j.h...........k.T#j#j#j#j#j#j#j",
+"#j#j#j#j#j.h.......d.A#f#j#j#j#j#j#j#j#j",
+"#j#j#j#j#j.h.....p.X#j#j#j#j#j#j#j#j#j#j",
+"#j#j#j#j#j.h.e.G#g#j#j#j#j#j#j#j#j#j#j#j",
+"#j#j#j#j#j.x.6#j#j#j#j#j#j#j#j#j#j#j#j#j",
+"#j#j#j#j#j#g#j#j#j#j#j#j#j#j#j#j#j#j#j#j",
+"#j#j#j#j#j#j#j#j#j#j#j#j#j#j#j#j#j#j#j#j"
+};
diff --git a/data/pixmaps/transport/button-playpause.png b/data/pixmaps/transport/button-playpause.png
new file mode 100644
index 0000000..752fa38
--- /dev/null
+++ b/data/pixmaps/transport/button-playpause.png
Binary files differ
diff --git a/data/pixmaps/transport/button-playpause.xpm b/data/pixmaps/transport/button-playpause.xpm
new file mode 100644
index 0000000..ee8a65a
--- /dev/null
+++ b/data/pixmaps/transport/button-playpause.xpm
@@ -0,0 +1,58 @@
+/* XPM */
+static char * button_playpause_xpm[] = {
+"36 20 35 1",
+" c None",
+". c #707070",
+"+ c #C0C0C0",
+"@ c #181C18",
+"# c #181818",
+"$ c #888C88",
+"% c #C8CCC8",
+"& c #C8C8C8",
+"* c #000000",
+"= c #404440",
+"- c #B8B8B8",
+"; c #080808",
+"> c #202420",
+", c #A8A8A8",
+"' c #101010",
+") c #787C78",
+"! c #888888",
+"~ c #303430",
+"{ c #B0B0B0",
+"] c #686C68",
+"^ c #282828",
+"/ c #A0A0A0",
+"( c #000400",
+"_ c #585C58",
+": c #C0C4C0",
+"< c #505050",
+"[ c #909490",
+"} c #A0A4A0",
+"| c #080C08",
+"1 c #383838",
+"2 c #A8ACA8",
+"3 c #202020",
+"4 c #808078",
+"5 c #B8BCB8",
+"6 c #606060",
+" ",
+" ",
+" .+ ",
+" @#$% &+++ +++% ",
+" @**=- $;;> %;;;, ",
+" @***')% !**@ %***, ",
+" @*****~{ !**@ %***, ",
+" @******;]& !**@ %***, ",
+" @********^/% !**@ %***, ",
+" @*********(_:!**@ %***, ",
+" @**********<+!**@ %***, ",
+" @********@[% !**@ %***, ",
+" @******(_: !**@ %***, ",
+" @*****^} !**@ %***, ",
+" @***|]& !**@ %***, ",
+" @**12 $((3 %(((, ",
+" @'4% &55+ 555% ",
+" 6- ",
+" % ",
+" "};
diff --git a/data/pixmaps/transport/button-record.png b/data/pixmaps/transport/button-record.png
new file mode 100644
index 0000000..6173931
--- /dev/null
+++ b/data/pixmaps/transport/button-record.png
Binary files differ
diff --git a/data/pixmaps/transport/button-record.xpm b/data/pixmaps/transport/button-record.xpm
new file mode 100644
index 0000000..c099e71
--- /dev/null
+++ b/data/pixmaps/transport/button-record.xpm
@@ -0,0 +1,58 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"17 18 34 1",
+" c #df2b2c",
+". c #de3535",
+"X c #dc3e3f",
+"o c #e40101",
+"O c #e30c0c",
+"+ c #e11a1a",
+"@ c #e02121",
+"# c #dc4344",
+"$ c #db4748",
+"% c #db4848",
+"& c #da5455",
+"* c #d95959",
+"= c #d76d6e",
+"- c #d86262",
+"; c #d66f70",
+": c #d67273",
+"> c #d57e7f",
+", c #d38a8b",
+"< c #d29091",
+"1 c #d19b9c",
+"2 c #d09fa0",
+"3 c #cfa6a7",
+"4 c #cfadae",
+"5 c None",
+"6 c None",
+"7 c None",
+"8 c None",
+"9 c None",
+"0 c None",
+"q c None",
+"w c None",
+"e c None",
+"r c None",
+"t c None",
+/* pixels */
+"99997wre57er07999",
+"999906-X@ #:50899",
+"9890&oooooooO>089",
+"880#oooooooooo;q8",
+"70*oooooooooooo,0",
+"q4ooooooooooooo+9",
+"r-oooooooooooooo<",
+"w#oooooooooooooo=",
+"5@oooooooooooooo$",
+"7@oooooooooooooo&",
+"t#oooooooooooooo:",
+"r:oooooooooooooo2",
+"05Ooooooooooooo.9",
+"70>oooooooooooO30",
+"99q:oooooooooO108",
+"998q,+oooooo 6089",
+"999709,=$&:100899"
+"99997wre57er07999",
+};
diff --git a/data/pixmaps/transport/button-rewind-end.png b/data/pixmaps/transport/button-rewind-end.png
new file mode 100644
index 0000000..7331829
--- /dev/null
+++ b/data/pixmaps/transport/button-rewind-end.png
Binary files differ
diff --git a/data/pixmaps/transport/button-rewind-end.xpm b/data/pixmaps/transport/button-rewind-end.xpm
new file mode 100644
index 0000000..99dfc49
--- /dev/null
+++ b/data/pixmaps/transport/button-rewind-end.xpm
@@ -0,0 +1,102 @@
+/* XPM */
+static char *start[] = {
+/* width height num_colors chars_per_pixel */
+" 14 21 74 2",
+/* colors */
+".. c #000000",
+".# c #000400",
+".a c #080800",
+".b c #080808",
+".c c #080c08",
+".d c #101010",
+".e c #101410",
+".f c #181818",
+".g c #202020",
+".h c #202420",
+".i c #282828",
+".j c #282c28",
+".k c #303028",
+".l c #303030",
+".m c #303430",
+".n c #383838",
+".o c #404040",
+".p c #404440",
+".q c #484848",
+".r c #484c48",
+".s c #505050",
+".t c #505450",
+".u c #606060",
+".v c #606460",
+".w c #686868",
+".x c #686c68",
+".y c #687880",
+".z c #707070",
+".A c #707470",
+".B c #787870",
+".C c #787878",
+".D c #787c78",
+".E c #808080",
+".F c #808480",
+".G c #8098a0",
+".H c #888888",
+".I c #888c88",
+".J c #909088",
+".K c #909090",
+".L c #909490",
+".M c #989898",
+".N c #989c98",
+".O c #98b8c8",
+".P c #a0a098",
+".Q c #a0a0a0",
+".R c #a0a4a0",
+".S c #a0b8c8",
+".T c #a0bcc8",
+".U c #a8a8a8",
+".V c #a8aca8",
+".W c #a8bcc8",
+".X c #a8c0c8",
+".Y c #a8c4c8",
+".Z c #b0b0b0",
+".0 c #b0b4b0",
+".1 c #b0c0c8",
+".2 c #b0c4c8",
+".3 c #b0c8d0",
+".4 c #b8bcb8",
+".5 c #b8c4c8",
+".6 c #b8c8c8",
+".7 c #b8c8d0",
+".8 c #c0c0c0",
+".9 c #c0c4c0",
+"#. c #c0c8c8",
+"## c #c0c8d0",
+"#a c #c0ccd0",
+"#b c #c8c8c8",
+"#c c #c8ccc8",
+"#d c #c8ccd0",
+"#e c #c8d0d0",
+"#f c None",
+"#g c #d0d4d0",
+"#h c #e8ece8",
+/* pixels */
+"#f#f#f#f#f#f#f#f#f#f#f#f#f#f",
+"#f#f#c#c#f#f#f#f#f#f#f#f#f#f",
+"#f#f.E.l#f#f#f#f#f#c.N.0#f#f",
+"#f#f.E.j#f#f#f#f#f.L.c.U#f#f",
+"#f#f.E.j#f#f#f#f.J.b...U#f#f",
+"#f#f.E.j#f#f#f.H.b.....U#f#f",
+"#f#f.E.j#f#c.F.#.......U#f#f",
+"#f#f.E.j#c.D.#.........U#f#f",
+"#f#f.E.j.A.............U#f#f",
+"#f#f.E.a...............U#f#f",
+"#f#f.E.#...............U#f#f",
+"#f#f.E.j.w.............U#f#f",
+"#f#f.E.j#c.z...........U#f#f",
+"#f#f.E.j#f#c.B.#.......U#f#f",
+"#f#f.E.j#f#f#c.C.#.....U#f#f",
+"#f#f.E.j#f#f#f#c.E.b...U#f#f",
+"#f#f.E.j#f#f#f#f#c.H.b.U#f#f",
+"#f#f.E.j#f#f#f#f#f#c.K.Z#f#f",
+"#f#f.8.Z#f#f#f#f#f#f#f#c#f#f",
+"#f#f#f#f#f#f#f#f#f#f#f#f#f#f",
+"#f#f#f#f#f#f#f#f#f#f#f#f#f#f"
+};
diff --git a/data/pixmaps/transport/button-rewind.png b/data/pixmaps/transport/button-rewind.png
new file mode 100644
index 0000000..4080772
--- /dev/null
+++ b/data/pixmaps/transport/button-rewind.png
Binary files differ
diff --git a/data/pixmaps/transport/button-rewind.xpm b/data/pixmaps/transport/button-rewind.xpm
new file mode 100644
index 0000000..41526f9
--- /dev/null
+++ b/data/pixmaps/transport/button-rewind.xpm
@@ -0,0 +1,99 @@
+/* XPM */
+static char *rwd[] = {
+/* width height num_colors chars_per_pixel */
+" 14 18 74 2",
+/* colors */
+".. c #000000",
+".# c #000400",
+".a c #080800",
+".b c #080808",
+".c c #080c08",
+".d c #101010",
+".e c #101410",
+".f c #181818",
+".g c #202020",
+".h c #202420",
+".i c #282828",
+".j c #282c28",
+".k c #303028",
+".l c #303030",
+".m c #303430",
+".n c #383838",
+".o c #404040",
+".p c #404440",
+".q c #484848",
+".r c #484c48",
+".s c #505050",
+".t c #505450",
+".u c #606060",
+".v c #606460",
+".w c #686868",
+".x c #686c68",
+".y c #687880",
+".z c #707070",
+".A c #707470",
+".B c #787870",
+".C c #787878",
+".D c #787c78",
+".E c #808080",
+".F c #808480",
+".G c #8098a0",
+".H c #888888",
+".I c #888c88",
+".J c #909088",
+".K c #909090",
+".L c #909490",
+".M c #989898",
+".N c #989c98",
+".O c #98b8c8",
+".P c #a0a098",
+".Q c #a0a0a0",
+".R c #a0a4a0",
+".S c #a0b8c8",
+".T c #a0bcc8",
+".U c #a8a8a8",
+".V c #a8aca8",
+".W c #a8bcc8",
+".X c #a8c0c8",
+".Y c #a8c4c8",
+".Z c #b0b0b0",
+".0 c #b0b4b0",
+".1 c #b0c0c8",
+".2 c #b0c4c8",
+".3 c #b0c8d0",
+".4 c #b8bcb8",
+".5 c #b8c4c8",
+".6 c #b8c8c8",
+".7 c #b8c8d0",
+".8 c #c0c0c0",
+".9 c #c0c4c0",
+"#. c #c0c8c8",
+"## c #c0c8d0",
+"#a c #c0ccd0",
+"#b c #c8c8c8",
+"#c c #c8ccc8",
+"#d c #c8ccd0",
+"#e c #c8d0d0",
+"#f c None",
+"#g c #d0d4d0",
+"#h c #e8ece8",
+/* pixels */
+"#f#f#f#f#f#f#c#f#f#f#f#c#f#f",
+"#f#f#f#f#f#b.E#f#f#f#c.D#f#f",
+"#f#f#f#f#c.u.t#f#f#f.A.o#f#f",
+"#f#f#f#f.L.#.t#f#f.R.a.o#f#f",
+"#f#f#f.4.e...t#f.9.g...o#f#f",
+"#f#f#c.o.....t#c.s.....o#f#f",
+"#f#c.A.......t.F.......o#f#f",
+"#f.R.b.......n.c.......o#f#f",
+".9.h...................o#f#f",
+".K.....................o#f#f",
+"#c.o.........#.........o#f#f",
+"#f.4.f.......q.g.......o#f#f",
+"#f#f.M.......t.R.b.....o#f#f",
+"#f#f#f.u.....t#f.A.....o#f#f",
+"#f#f#f#b.k...t#f#c.o...o#f#f",
+"#f#f#f#f.Z.c.t#f#f.4.e.o#f#f",
+"#f#f#f#f#f.F.t#f#f#f.M.p#f#f",
+"#f#f#f#f#f#c.P#f#f#f#c.N#f#f"
+};
diff --git a/data/pixmaps/transport/button-solo-2.xpm b/data/pixmaps/transport/button-solo-2.xpm
new file mode 100644
index 0000000..c2483cf
--- /dev/null
+++ b/data/pixmaps/transport/button-solo-2.xpm
@@ -0,0 +1,31 @@
+/* XPM */
+static char *button-solo-2[] = {
+/* width height num_colors chars_per_pixel */
+" 20 20 4 1",
+/* colors */
+". c #000000",
+"k c #585c58",
+"y c #c0c4c0",
+"B c None",
+/* pixels */
+"BBBBBBBBBBBBBBBBBBBB",
+"BBBBBBBBBBBBBBBBBBBB",
+"BBBByk..........kBBB",
+"BBBk.............BBB",
+"BBk..............BBB",
+"BB...............BBB",
+"BB....BBBBBBBBBBBBBB",
+"BB....BBBBBBBBBBBBBB",
+"BB............kyBBBB",
+"BBk.............kBBB",
+"BBBk.............kBB",
+"BBBByk............BB",
+"BBBBBBBBBBBBBB....BB",
+"BBBBBBBBBBBBBB....BB",
+"BB................BB",
+"BB...............kBB",
+"BB..............kBBB",
+"BBk...........kyBBBB",
+"BBBBBBBBBBBBBBBBBBBB",
+"BBBBBBBBBBBBBBBBBBBB"
+};
diff --git a/data/pixmaps/transport/button-solo.png b/data/pixmaps/transport/button-solo.png
new file mode 100644
index 0000000..b2aaf49
--- /dev/null
+++ b/data/pixmaps/transport/button-solo.png
Binary files differ
diff --git a/data/pixmaps/transport/button-solo.xpm b/data/pixmaps/transport/button-solo.xpm
new file mode 100644
index 0000000..38ce9d3
--- /dev/null
+++ b/data/pixmaps/transport/button-solo.xpm
@@ -0,0 +1,45 @@
+/* XPM */
+static char * button_solo_xpm[] = {
+"40 40 2 1",
+" c None",
+". c #000000",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" .. ",
+" .......... ",
+" ............ ",
+" .............. ",
+" ..... ..... ",
+" ...... ..... ",
+" ...... ",
+" ......... ",
+" ............ ",
+" ............. ",
+" ............ ",
+" ......... ",
+" ...... ",
+" ..... ..... ",
+" ..... ..... ",
+" ...... ...... ",
+" .............. ",
+" ............ ",
+" .......... ",
+" .. ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" "};
diff --git a/data/pixmaps/transport/button-stop.png b/data/pixmaps/transport/button-stop.png
new file mode 100644
index 0000000..147dbe1
--- /dev/null
+++ b/data/pixmaps/transport/button-stop.png
Binary files differ
diff --git a/data/pixmaps/transport/button-stop.xpm b/data/pixmaps/transport/button-stop.xpm
new file mode 100644
index 0000000..1074949
--- /dev/null
+++ b/data/pixmaps/transport/button-stop.xpm
@@ -0,0 +1,148 @@
+/* XPM */
+static char *stop[] = {
+/* width height num_colors chars_per_pixel */
+" 18 18 123 2",
+/* colors */
+".. c #000000",
+".# c #0000f8",
+".a c #000400",
+".b c #080800",
+".c c #080808",
+".d c #080c08",
+".e c #101010",
+".f c #101410",
+".g c #181818",
+".h c #181c18",
+".i c #202020",
+".j c #202420",
+".k c #282828",
+".l c #282c28",
+".m c #303028",
+".n c #303030",
+".o c #303430",
+".p c #383838",
+".q c #404040",
+".r c #404440",
+".s c #484848",
+".t c #484c48",
+".u c #505050",
+".v c #505450",
+".w c #585c58",
+".x c #606060",
+".y c #606460",
+".z c #686868",
+".A c #686c68",
+".B c #707070",
+".C c #707470",
+".D c #787870",
+".E c #787878",
+".F c #787c78",
+".G c #808078",
+".H c #808080",
+".I c #808480",
+".J c #888888",
+".K c #888c88",
+".L c #909088",
+".M c #909090",
+".N c #909490",
+".O c #989898",
+".P c #989c98",
+".Q c #98b8c8",
+".R c #a0a098",
+".S c #a0a0a0",
+".T c #a0a4a0",
+".U c #a0b8c8",
+".V c #a0bcc8",
+".W c #a8a8a8",
+".X c #a8aca8",
+".Y c #a8bcc8",
+".Z c #a8c0c8",
+".0 c #a8c4c8",
+".1 c #b0b0b0",
+".2 c #b0b4b0",
+".3 c #b0c0c8",
+".4 c #b0c4c8",
+".5 c #b0c8d0",
+".6 c #b8b8b8",
+".7 c #b8bcb8",
+".8 c #b8c4c8",
+".9 c #b8c8c8",
+"#. c #b8c8d0",
+"## c #c0c0c0",
+"#a c #c0c4c0",
+"#b c #c0c8c8",
+"#c c #c0c8d0",
+"#d c #c0ccc8",
+"#e c #c0ccd0",
+"#f c #c8c8c8",
+"#g c #c8ccc8",
+"#h c #c8ccd0",
+"#i c #c8d0d0",
+"#j c None",
+"#k c #d0d4d0",
+"#l c #e00000",
+"#m c #e0aca8",
+"#n c #e0b0b0",
+"#o c #e0b4b0",
+"#p c #e0b8b8",
+"#q c #e80000",
+"#r c #e87070",
+"#s c #e87470",
+"#t c #e87878",
+"#u c #e87c78",
+"#v c #e88080",
+"#w c #e88480",
+"#x c #e88888",
+"#y c #e8a098",
+"#z c #e8a0a0",
+"#A c #e8a4a0",
+"#B c #e8a8a8",
+"#C c #e8ece8",
+"#D c #f00000",
+"#E c #f04040",
+"#F c #f04440",
+"#G c #f04848",
+"#H c #f04c48",
+"#I c #f05450",
+"#J c #f05c58",
+"#K c #f06060",
+"#L c #f06868",
+"#M c #f06c68",
+"#N c #f07878",
+"#O c #f07c78",
+"#P c #f80000",
+"#Q c #f80400",
+"#R c #f80808",
+"#S c #f80c08",
+"#T c #f81010",
+"#U c #f81c18",
+"#V c #f82020",
+"#W c #f82420",
+"#X c #f82828",
+"#Y c #f82c28",
+"#Z c #f83030",
+"#0 c #f83430",
+"#1 c #f83c38",
+"#2 c #f84040",
+"#3 c #f84440",
+"#4 c #f84c48",
+/* pixels */
+"#j#j#j#j#j#j#j#j#j#j#j#j#j#j#j#j#j#j",
+"#j#j#j#j#j#j#j#j#j#j#j#j#j#j#j#j#j#j",
+"#j#j#j#j#f###################g#j#j#j",
+"#j#j#j#j.K.c.c.c.c.c.c.c.c.c.1#j#j#j",
+"#j#j#j#j.J...................1#j#j#j",
+"#j#j#j#j.J...................1#j#j#j",
+"#j#j#j#j.J...................1#j#j#j",
+"#j#j#j#j.J...................1#j#j#j",
+"#j#j#j#j.J...................1#j#j#j",
+"#j#j#j#j.J...................1#j#j#j",
+"#j#j#j#j.J...................1#j#j#j",
+"#j#j#j#j.J...................1#j#j#j",
+"#j#j#j#j.J...................1#j#j#j",
+"#j#j#j#j.J...................1#j#j#j",
+"#j#j#j#j.K.a.a.a.a.a.a.a.a.a.1#j#j#j",
+"#j#j#j#j#f.7.7.7.7.7.7.7.7.7#g#j#j#j",
+"#j#j#j#j#j#j#j#j#j#j#j#j#j#j#j#j#j#j",
+"#j#j#j#j#j#j#j#j#j#j#j#j#j#j#j#j#j#j"
+};
diff --git a/data/pixmaps/transport/button-to-end.xpm b/data/pixmaps/transport/button-to-end.xpm
new file mode 100644
index 0000000..e8cf1c0
--- /dev/null
+++ b/data/pixmaps/transport/button-to-end.xpm
@@ -0,0 +1,21 @@
+/* XPM */
+static char *magick[] = {
+/* columns rows colors chars-per-pixel */
+"11 11 4 1",
+" c None",
+"X c black",
+"O c gray25",
+"o c gray50",
+/* pixels */
+" ",
+" X OO ",
+" XX OO ",
+" XX OO ",
+"ooooXX OO ",
+"XXXXXXX OO ",
+"ooooXX OO ",
+" XX OO ",
+" XX OO ",
+" X OO ",
+" ",
+};
diff --git a/data/pixmaps/transport/led--.xpm b/data/pixmaps/transport/led--.xpm
new file mode 100644
index 0000000..492fc22
--- /dev/null
+++ b/data/pixmaps/transport/led--.xpm
@@ -0,0 +1,41 @@
+/* XPM */
+static char *led[]={
+"20 34 4 1",
+". c #000000",
+"# c #404c80",
+"a c #808fc0",
+"b c #c0d8ff",
+"....................",
+"....................",
+"....................",
+"....................",
+"....................",
+"....................",
+"....................",
+"....................",
+"....................",
+"....................",
+"....................",
+"....................",
+"....................",
+"....................",
+"....................",
+"....................",
+"......##aaaaa#......",
+".....bbbbbbbbbb.....",
+"......#aaaaa##......",
+"....................",
+"....................",
+"....................",
+"....................",
+"....................",
+"....................",
+"....................",
+"....................",
+"....................",
+"....................",
+"....................",
+"....................",
+"....................",
+"....................",
+"...................."};
diff --git a/data/pixmaps/transport/led-0.xpm b/data/pixmaps/transport/led-0.xpm
new file mode 100644
index 0000000..69a6758
--- /dev/null
+++ b/data/pixmaps/transport/led-0.xpm
@@ -0,0 +1,41 @@
+/* XPM */
+static char *led[]={
+"20 34 4 1",
+". c #000000",
+"# c #404c80",
+"b c #808fc0",
+"a c #c0d8ff",
+"....................",
+"....................",
+".....#aaaaaaaaaaaab#",
+".....baaaaaaaaaab#..",
+"....#.#...........b.",
+"...#a#...........#ab",
+"...#aab..........#ab",
+"...#aab.........#aab",
+"...baa#.........baa#",
+"...baa#.........baa#",
+"...baa#.........baa#",
+"..#aab.........#aab.",
+"..#aab.........#aab.",
+"..#aab.........#aab.",
+"..baa#.........baa#.",
+"..ba#..........#ba#.",
+"..b#............#b#.",
+"....................",
+".#b#............#b..",
+".#ab#..........#ab..",
+".#aab.........#aab..",
+".baa#.........baa#..",
+".baa#.........baa#..",
+".baa#.........baa#..",
+"#aab.........#aab...",
+"#aab.........#aab...",
+"#aab.........#aab...",
+"baa#.........baa#...",
+"ba#..........baa#...",
+"ba#...........#a#...",
+".b...........#.#....",
+"..#baaaaaaaaaab.....",
+"#baaaaaaaaaaaab#....",
+"...................."};
diff --git a/data/pixmaps/transport/led-1.xpm b/data/pixmaps/transport/led-1.xpm
new file mode 100644
index 0000000..7e0cc46
--- /dev/null
+++ b/data/pixmaps/transport/led-1.xpm
@@ -0,0 +1,41 @@
+/* XPM */
+static char *led[]={
+"20 34 4 1",
+". c #000000",
+"a c #404c80",
+"# c #808fc0",
+"b c #c0d8ff",
+"....................",
+"....................",
+"....................",
+"....................",
+"..................#.",
+".................ab#",
+".................ab#",
+"................abb#",
+"................#bba",
+"................#bba",
+"................#bba",
+"...............abb#.",
+"...............abb#.",
+"...............abb#.",
+"...............#bba.",
+"...............a#ba.",
+"................a#a.",
+"....................",
+"................a#..",
+"...............ab#..",
+"..............abb#..",
+"..............#bba..",
+"..............#bba..",
+"..............#bba..",
+".............abb#...",
+".............abb#...",
+".............abb#...",
+".............#bba...",
+".............#bba...",
+"..............aba...",
+"...............a....",
+"....................",
+"....................",
+"...................."};
diff --git a/data/pixmaps/transport/led-2.xpm b/data/pixmaps/transport/led-2.xpm
new file mode 100644
index 0000000..6f9f2b5
--- /dev/null
+++ b/data/pixmaps/transport/led-2.xpm
@@ -0,0 +1,41 @@
+/* XPM */
+static char *led[]={
+"20 34 4 1",
+". c #000000",
+"# c #404c80",
+"b c #808fc0",
+"a c #c0d8ff",
+"....................",
+"....................",
+".....#aaaaaaaaaaaab#",
+".....baaaaaaaaaab#..",
+"......#...........b.",
+".................#ab",
+".................#ab",
+"................#aab",
+"................baa#",
+"................baa#",
+"................baa#",
+"...............#aab.",
+"...............#aab.",
+"...............#aab.",
+"...............baa#.",
+"...............#ba#.",
+"......##bbbbb#..#b#.",
+".....aaaaaaaaaa.....",
+".#b#..#bbbbb##......",
+".#ab#...............",
+".#aab...............",
+".baa#...............",
+".baa#...............",
+".baa#...............",
+"#aab................",
+"#aab................",
+"#aab................",
+"baa#................",
+"ba#.................",
+"ba#.................",
+".b...........#......",
+"..#baaaaaaaaaab.....",
+"#baaaaaaaaaaaab#....",
+"...................."};
diff --git a/data/pixmaps/transport/led-3.xpm b/data/pixmaps/transport/led-3.xpm
new file mode 100644
index 0000000..e3fa3d9
--- /dev/null
+++ b/data/pixmaps/transport/led-3.xpm
@@ -0,0 +1,41 @@
+/* XPM */
+static char *led[]={
+"20 34 4 1",
+". c #000000",
+"# c #404c80",
+"b c #808fc0",
+"a c #c0d8ff",
+"....................",
+"....................",
+".....#aaaaaaaaaaaab#",
+".....baaaaaaaaaab#..",
+"......#...........b.",
+".................#ab",
+".................#ab",
+"................#aab",
+"................baa#",
+"................baa#",
+"................baa#",
+"...............#aab.",
+"...............#aab.",
+"...............#aab.",
+"...............baa#.",
+"...............#ba#.",
+"......##bbbbb#..#b#.",
+".....aaaaaaaaaa.....",
+"......#bbbbb##..#b..",
+"...............#ab..",
+"..............#aab..",
+"..............baa#..",
+"..............baa#..",
+"..............baa#..",
+".............#aab...",
+".............#aab...",
+".............#aab...",
+".............baa#...",
+".............baa#...",
+"..............#a#...",
+".............#.#....",
+"..#baaaaaaaaaab.....",
+"#baaaaaaaaaaaab#....",
+"...................."};
diff --git a/data/pixmaps/transport/led-4.xpm b/data/pixmaps/transport/led-4.xpm
new file mode 100644
index 0000000..aa01582
--- /dev/null
+++ b/data/pixmaps/transport/led-4.xpm
@@ -0,0 +1,41 @@
+/* XPM */
+static char *led[]={
+"20 34 4 1",
+". c #000000",
+"# c #404c80",
+"a c #808fc0",
+"b c #c0d8ff",
+"....................",
+"....................",
+"....................",
+"....................",
+"....#.............a.",
+"...#b#...........#ba",
+"...#bba..........#ba",
+"...#bba.........#bba",
+"...abb#.........abb#",
+"...abb#.........abb#",
+"...abb#.........abb#",
+"..#bba.........#bba.",
+"..#bba.........#bba.",
+"..#bba.........#bba.",
+"..abb#.........abb#.",
+"..ab#..........#ab#.",
+"..a#..##aaaaa#..#a#.",
+".....bbbbbbbbbb.....",
+"......#aaaaa##..#a..",
+"...............#ba..",
+"..............#bba..",
+"..............abb#..",
+"..............abb#..",
+"..............abb#..",
+".............#bba...",
+".............#bba...",
+".............#bba...",
+".............abb#...",
+".............abb#...",
+"..............#b#...",
+"...............#....",
+"....................",
+"....................",
+"...................."};
diff --git a/data/pixmaps/transport/led-5.xpm b/data/pixmaps/transport/led-5.xpm
new file mode 100644
index 0000000..8a3c49c
--- /dev/null
+++ b/data/pixmaps/transport/led-5.xpm
@@ -0,0 +1,41 @@
+/* XPM */
+static char *led[]={
+"20 34 4 1",
+". c #000000",
+"# c #404c80",
+"b c #808fc0",
+"a c #c0d8ff",
+"....................",
+"....................",
+".....#aaaaaaaaaaaab#",
+".....baaaaaaaaaab#..",
+"....#.#.............",
+"...#a#..............",
+"...#aab.............",
+"...#aab.............",
+"...baa#.............",
+"...baa#.............",
+"...baa#.............",
+"..#aab..............",
+"..#aab..............",
+"..#aab..............",
+"..baa#..............",
+"..ba#...............",
+"..b#..##bbbbb#......",
+".....aaaaaaaaaa.....",
+"......#bbbbb##..#b..",
+"...............#ab..",
+"..............#aab..",
+"..............baa#..",
+"..............baa#..",
+"..............baa#..",
+".............#aab...",
+".............#aab...",
+".............#aab...",
+".............baa#...",
+".............baa#...",
+"..............#a#...",
+".............#.#....",
+"..#baaaaaaaaaab.....",
+"#baaaaaaaaaaaab#....",
+"...................."};
diff --git a/data/pixmaps/transport/led-6.xpm b/data/pixmaps/transport/led-6.xpm
new file mode 100644
index 0000000..b8d8580
--- /dev/null
+++ b/data/pixmaps/transport/led-6.xpm
@@ -0,0 +1,41 @@
+/* XPM */
+static char *led[]={
+"20 34 4 1",
+". c #000000",
+"# c #404c80",
+"b c #808fc0",
+"a c #c0d8ff",
+"....................",
+"....................",
+".....#aaaaaaaaaaaab#",
+".....baaaaaaaaaab#..",
+"....#.#.............",
+"...#a#..............",
+"...#aab.............",
+"...#aab.............",
+"...baa#.............",
+"...baa#.............",
+"...baa#.............",
+"..#aab..............",
+"..#aab..............",
+"..#aab..............",
+"..baa#..............",
+"..ba#...............",
+"..b#..##bbbbb#......",
+".....aaaaaaaaaa.....",
+".#b#..#bbbbb##..#b..",
+".#ab#..........#ab..",
+".#aab.........#aab..",
+".baa#.........baa#..",
+".baa#.........baa#..",
+".baa#.........baa#..",
+"#aab.........#aab...",
+"#aab.........#aab...",
+"#aab.........#aab...",
+"baa#.........baa#...",
+"ba#..........baa#...",
+"ba#...........#a#...",
+".b...........#.#....",
+"..#baaaaaaaaaab.....",
+"#baaaaaaaaaaaab#....",
+"...................."};
diff --git a/data/pixmaps/transport/led-7.xpm b/data/pixmaps/transport/led-7.xpm
new file mode 100644
index 0000000..c75f9ab
--- /dev/null
+++ b/data/pixmaps/transport/led-7.xpm
@@ -0,0 +1,41 @@
+/* XPM */
+static char *led[]={
+"20 34 4 1",
+". c #000000",
+"# c #404c80",
+"b c #808fc0",
+"a c #c0d8ff",
+"....................",
+"....................",
+".....#aaaaaaaaaaaab#",
+".....baaaaaaaaaab#..",
+"......#...........b.",
+".................#ab",
+".................#ab",
+"................#aab",
+"................baa#",
+"................baa#",
+"................baa#",
+"...............#aab.",
+"...............#aab.",
+"...............#aab.",
+"...............baa#.",
+"...............#ba#.",
+"................#b#.",
+"....................",
+"................#b..",
+"...............#ab..",
+"..............#aab..",
+"..............baa#..",
+"..............baa#..",
+"..............baa#..",
+".............#aab...",
+".............#aab...",
+".............#aab...",
+".............baa#...",
+".............baa#...",
+"..............#a#...",
+"...............#....",
+"....................",
+"....................",
+"...................."};
diff --git a/data/pixmaps/transport/led-8.xpm b/data/pixmaps/transport/led-8.xpm
new file mode 100644
index 0000000..a8c7d92
--- /dev/null
+++ b/data/pixmaps/transport/led-8.xpm
@@ -0,0 +1,50 @@
+/* XPM */
+static char *0[] = {
+/* width height num_colors chars_per_pixel */
+" 20 34 4 1",
+/* colors */
+"# c #c0d8ff",
+" c #000000",
+"a c #404c80",
+"b c #808fc0",
+/* pixels */
+" ",
+" ",
+" a############ba",
+" b##########ba ",
+" a a b ",
+" a#a a#b",
+" a##b a#b",
+" a##b a##b",
+" b##a b##a",
+" b##a b##a",
+" b##a b##a",
+" a##b a##b ",
+" a##b a##b ",
+" a##b a##b ",
+" b##a b##a ",
+" b#a ab#a ",
+" ba aabbbbba aba ",
+" ########## ",
+" aba abbbbbaa ab ",
+" a#ba a#b ",
+" a##b a##b ",
+" b##a b##a ",
+" b##a b##a ",
+" b##a b##a ",
+"a##b a##b ",
+"a##b a##b ",
+"a##b a##b ",
+"b##a b##a ",
+"b#a b##a ",
+"b#a a#a ",
+" b a a ",
+" ab##########b ",
+"ab############ba ",
+" "
+};
+
+--------------040202080106060504000906--
+
+
+
diff --git a/data/pixmaps/transport/led-9.xpm b/data/pixmaps/transport/led-9.xpm
new file mode 100644
index 0000000..551cd76
--- /dev/null
+++ b/data/pixmaps/transport/led-9.xpm
@@ -0,0 +1,41 @@
+/* XPM */
+static char *led[]={
+"20 34 4 1",
+". c #000000",
+"# c #404c80",
+"b c #808fc0",
+"a c #c0d8ff",
+"....................",
+"....................",
+".....#aaaaaaaaaaaab#",
+".....baaaaaaaaaab#..",
+"....#.#...........b.",
+"...#a#...........#ab",
+"...#aab..........#ab",
+"...#aab.........#aab",
+"...baa#.........baa#",
+"...baa#.........baa#",
+"...baa#.........baa#",
+"..#aab.........#aab.",
+"..#aab.........#aab.",
+"..#aab.........#aab.",
+"..baa#.........baa#.",
+"..ba#..........#ba#.",
+"..b#..##bbbbb#..#b#.",
+".....aaaaaaaaaa.....",
+"......#bbbbb##..#b..",
+"...............#ab..",
+"..............#aab..",
+"..............baa#..",
+"..............baa#..",
+"..............baa#..",
+".............#aab...",
+".............#aab...",
+".............#aab...",
+".............baa#...",
+".............baa#...",
+"..............#a#...",
+"...............#....",
+"....................",
+"....................",
+"...................."};
diff --git a/data/pixmaps/transport/led-colon.xpm b/data/pixmaps/transport/led-colon.xpm
new file mode 100644
index 0000000..f6f2607
--- /dev/null
+++ b/data/pixmaps/transport/led-colon.xpm
@@ -0,0 +1,41 @@
+/* XPM */
+static char *led[]={
+"5 34 4 1",
+". c #000000",
+"# c #404c80",
+"b c #808fc0",
+"a c #c0d8ff",
+".....",
+".....",
+".....",
+".....",
+".....",
+".....",
+".....",
+".....",
+".....",
+".....",
+".....",
+".....",
+".#aab",
+".baa#",
+".....",
+".....",
+".....",
+".....",
+".....",
+".....",
+".....",
+"#aab.",
+"baa#.",
+".....",
+".....",
+".....",
+".....",
+".....",
+".....",
+".....",
+".....",
+".....",
+".....",
+"....."};
diff --git a/data/presets/README b/data/presets/README
new file mode 100644
index 0000000..dcb1645
--- /dev/null
+++ b/data/presets/README
@@ -0,0 +1,26 @@
+
+This directory contains the source for the instrument definition presets.
+
+I am maintaining it in plain text "conf file" format for ease of
+editing. If you make changes to the file, you must generate a new
+presets.xml by running
+
+ ./regenerate-presets
+
+The default presets-editable.conf contains U.S. English definitions.
+
+To translate it, copy it to presets-editable-<lang>.conf (for example
+presets-editable-fr.conf or presets-editable-zh_CN.conf), edit it
+appropriately, and run ./regenerate-presets to generate your new
+translated XML file. Note that _only_ the "name" strings should be
+translated -- you _must_ leave the clef names untouched, or they will
+fail to work. The displayed clef names themselves are translated
+separately as part of the program's .po file.
+
+Once you've generated a translation as presets-<lang>.xml in this
+directory, it should then be installed by the standard install process
+and picked up automatically by Rosegarden.
+
+Please send your translated .conf file to us at the rosegarden-devel
+mailing list.
+
diff --git a/data/presets/presets-editable.conf b/data/presets/presets-editable.conf
new file mode 100644
index 0000000..b8fe523
--- /dev/null
+++ b/data/presets/presets-editable.conf
@@ -0,0 +1,2754 @@
+# Rosegarden parameters describing the ranges and preferred notation
+# defaults for a variety of real world instruments
+#
+# Instruments will be sorted by category in the GUI:
+#
+# Category [...]
+# Instrument [...]
+# Player Ability [...]
+#
+# category = a logical grouping for the instruments that follow it, remaining
+# in effect until the next category = tag is encountered.
+#
+# name = the name of the instrument
+#
+# category = Flutes
+# name = Piccolo
+# ...
+# name = Flute
+#
+# category = Double reeds
+# name = Oboe
+# ...
+# name = English Horn
+#
+# transposition = the sounding transposition expressed in semitone steps
+# of -48 to 48
+#
+# NOTE: it is not necessary to put a + on positive values
+# clef = french violin
+# treble
+# soprano
+# mezzosoprano * NOT IMPLEMENTED
+# alto
+# tenor
+# baritone (C) * NOT IMPLEMENTED
+# baritone (F) * NOT IMPLEMENTED
+# bass
+# subbass * NOT IMPLEMENTED
+# crotale (treble clef quindicesima)
+# xylophone (treble clef ottava)
+# guitar (treble clef ottava bassa)
+# modern celesta (bass clef quindicesima)
+# old celesta (bass clef ottava)
+# contrabass (bass clef ottava bassa)
+# two-bar (unpitched percussion)
+#
+# A lowest/A highest = The lowest/highest notes for an Amateur player
+#
+# P lowest/P highest = The lowest/highest notes for a Professional player
+#
+# Determining for the ranges can be both playing ability of the performer or
+# difference between so called professional and amateur instrument versions.
+#
+# NOTES: If there is no difference for amateur/professional, use
+# the same pitches for both. If no range limitation is desired
+# for some reason, use a low of 0 and a high of 127, rather than
+# letter pitches. Otherwise use letter + sharp + octave such as
+# G5 F#3. (All pitches ultimately get converted to numbers, so
+# these explict 0/127 are effectively pre-converted.)
+#
+# Most chromatic alterations should be spelled with sharps
+#
+# C4 is one-lined c
+#
+# -----------------[strings]----------------
+category = Bowed strings
+
+name = "Violin"
+clef = treble
+transposition = 0
+A lowest = G3
+A highest = E6
+P lowest = G3
+P highest = G7
+
+name = "Baroque violin"
+clef = treble
+transposition = 0
+A lowest = G3
+A highest = E6
+P lowest = G3
+P highest = G7
+
+name = "Viola"
+clef = alto
+transposition = 0
+A lowest = C3
+A highest = G5
+P lowest = C3
+P highest = A6
+
+name = "Baroque viola"
+clef = alto
+transposition = 0
+A lowest = C3
+A highest = G5
+P lowest = C3
+P highest = A6
+
+name = "Violoncello"
+clef = bass
+transposition = 0
+A lowest = C2
+A highest = G4
+P lowest = C2
+P highest = C5
+
+name = "Baroque violoncello"
+clef = bass
+transposition = 0
+A lowest = C2
+A highest = G4
+P lowest = C2
+P highest = C5
+
+name = "Contrabass"
+clef = contrabass
+transposition = 0
+A lowest = E2
+A highest = D4
+P lowest = B1
+P highest = G5
+
+name = "Baroque contrabass"
+clef = contrabass
+transposition = 0
+A lowest = E2
+A highest = D4
+P lowest = E2
+P highest = G5
+
+name = "Soprano viola da gamba"
+clef = soprano
+transposition = 0
+A lowest = D3
+A highest = D6
+P lowest = D3
+P highest = A6
+
+name = "Alto viola da gamba"
+clef = alto
+transposition = 0
+A lowest = A2
+A highest = A5
+P lowest = A2
+P highest = E6
+
+name = "Tenor viola da gamba"
+clef = tenor
+transposition = 0
+A lowest = G2
+A highest = G5
+P lowest = G2
+P highest = D6
+
+name = "Viola da gamba"
+clef = bass
+transposition = 0
+A lowest = D2
+A highest = D5
+P lowest = D2
+P highest = A5
+
+name = "Violone"
+clef = contrabass
+transposition = 0
+A lowest = E2
+A highest = D4
+P lowest = E2
+P highest = G5
+
+# end category = Bowed strings
+#
+category = Plucked strings
+
+name = "Soprano guitar"
+clef = treble
+transposition = 0
+A lowest = E3
+A highest = B7
+P lowest = E3
+P highest = B7
+
+name = "Alto guitar"
+clef = guitar
+transposition = 0
+A lowest = B2
+A highest = E6
+P lowest = B2
+P highest = E6
+
+name = "Guitar (prim)"
+clef = guitar
+transposition = 0
+A lowest = E2
+A highest = B6
+P lowest = E2
+P highest = B6
+
+name = "Contrabass guitar"
+clef = contrabass
+transposition = 0
+A lowest = E1
+A highest = B5
+P lowest = E1
+P highest = B5
+
+name = "11-string alto guitar (treble)"
+clef = treble
+transposition = 0
+A lowest = Bb1
+A highest = D7
+P lowest = Bb1
+P highest = D7
+
+name = "11-string alto guitar (bass)"
+clef = bass
+transposition = 0
+A lowest = Bb1
+A highest = D7
+P lowest = Bb1
+P highest = D7
+
+name = "Steel string guitar"
+clef = guitar
+transposition = 0
+A lowest = E2
+A highest = B6
+P lowest = E2
+P highest = B6
+
+name = "Pedal steel guitar"
+clef = tab
+transposition = 0
+A lowest = B1
+A highest = D#5
+P lowest = B1
+P highest = D#5
+
+name = "12-string guitar"
+clef = guitar
+transposition = 0
+A lowest = E2
+A highest = B6
+P lowest = E2
+P highest = B6
+
+name = "Electric guitar"
+clef = guitar
+transposition = 0
+A lowest = E2
+A highest = B6
+P lowest = E2
+P highest = B6
+
+name = "Electric bass guitar (fretted)"
+clef = contrabass
+transposition = 0
+A lowest = E1
+A highest = B5
+P lowest = B0
+P highest = E6
+
+name = "Electric bass guitar (fretless)"
+clef = contrabass
+transposition = 0
+A lowest = E1
+A highest = B5
+P lowest = B0
+P highest = E6
+
+name = "Lute"
+clef = guitar
+transposition = 0
+A lowest = A1
+A highest = D7
+P lowest = A1
+P highest = D7
+
+name = "Cittern"
+clef = treble
+transposition = 0
+A lowest = C3
+A highest = A#6
+P lowest = C3
+P highest = A#6
+
+name = "Piccolo balalaika"
+clef = xylophone
+transposition = 0
+A lowest = B4
+A highest = G6
+P lowest = B4
+P highest = G6
+
+name = "Prima balalaika"
+clef = treble
+transposition = 0
+A lowest = E4
+A highest = G5
+P lowest = E4
+P highest = G5
+
+name = "Secunda balalaika"
+clef = treble
+transposition = 0
+A lowest = A3
+A highest = C5
+P lowest = A3
+P highest = C5
+
+name = "Alto balalaika"
+clef = treble
+transposition = 0
+A lowest = E3
+A highest = G4
+P lowest = E3
+P highest = G4
+
+name = "Bass balalaika"
+clef = bass
+transposition = 0
+A lowest = E2
+A highest = C4
+P lowest = E2
+P highest = C4
+
+name = "Contrabass balalaika"
+clef = contrabass
+transposition = 0
+A lowest = E1
+A highest = C3
+P lowest = E1
+P highest = C3
+
+name = "Mandolin"
+clef = treble
+transposition = 0
+A lowest = G3
+A highest = C#6
+P lowest = G3
+P highest = C#6
+
+name = "Mandola"
+clef = guitar
+transposition = 0
+A lowest = G2
+A highest = B5
+P lowest = G2
+P highest = B5
+
+name = "Ukulele"
+clef = treble
+transposition = 0
+A lowest = C4
+A highest = A6
+P lowest = C4
+P highest = A6
+
+name = "Banjo (5-string)"
+clef = guitar
+transposition = 0
+A lowest = C2
+A highest = D6
+P lowest = C2
+P highest = D6
+
+name = "Tenor banjo"
+clef = guitar
+transposition = 0
+A lowest = C2
+A highest = B5
+P lowest = C2
+P highest = B5
+
+name = "Harp (treble)"
+clef = treble
+transposition = 0
+A lowest = B0
+A highest = G#7
+P lowest = B0
+P highest = G#7
+
+name = "Harp (bass)"
+clef = bass
+transposition = 0
+A lowest = B0
+A highest = G#7
+P lowest = B0
+P highest = G#7
+
+name = "Koto"
+clef = treble
+transposition = 0
+A lowest = D3
+A highest = A5
+P lowest = D3
+P highest = A5
+
+# end category = Plucked strings
+
+# -----------------[woodwinds]----------------
+category = Flutes
+
+name = "Piccolo"
+clef = xylophone
+transposition = 0
+A lowest = D5
+A highest = A7
+P lowest = D5
+P highest = C8
+
+name = "Eb flute"
+clef = treble
+transposition = +3
+A lowest = C4
+A highest = A6
+P lowest = C4
+P highest = D7
+
+name = "Flute"
+clef = treble
+transposition = 0
+A lowest = C4
+A highest = A6
+P lowest = B3
+P highest = D7
+
+name = "Alto flute"
+clef = treble
+transposition = -5
+A lowest = C4
+A highest = A6
+P lowest = C4
+P highest = C7
+
+name = "Bass flute"
+clef = guitar
+transposition = 0
+A lowest = C3
+A highest = F5
+P lowest = C3
+P highest = A5
+
+name = "Contra-alto flute"
+clef = treble
+transposition = -17
+A lowest = C4
+A highest = A6
+P lowest = D4
+P highest = C7
+
+name = "Contrabass flute"
+clef = bass
+transposition = 0
+A lowest = C2
+A highest = F4
+P lowest = C2
+P highest = A4
+
+name = "Transverse flute (D foot)"
+clef = treble
+transposition = 0
+A lowest = D4
+A highest = F6
+P lowest = D4
+P highest = A6
+
+name = "Transverse flute (C foot)"
+clef = treble
+transposition = 0
+A lowest = D4
+A highest = F6
+P lowest = C4
+P highest = A6
+
+name = "Transverse flute (B foot)"
+clef = treble
+transposition = 0
+A lowest = D4
+A highest = F6
+P lowest = B3
+P highest = A6
+
+name = "Alto transverse flute"
+clef = treble
+transposition = 0
+A lowest = G3
+A highest = E5
+P lowest = G3
+P highest = G#5
+
+name = "Garklein recorder"
+clef = crotale
+transposition = 0
+A lowest = C6
+A highest = A7
+P lowest = C6
+P highest = C8
+
+name = "Sopranino recorder"
+clef = xylophone
+transposition = 0
+A lowest = F5
+A highest = E7
+P lowest = F5
+P highest = G7
+
+name = "Soprano recorder"
+clef = xylophone
+transposition = 0
+A lowest = C5
+A highest = A6
+P lowest = C5
+P highest = D7
+
+name = "Alto recorder"
+clef = treble
+transposition = 0
+A lowest = F4
+A highest = E6
+P lowest = B3
+P highest = G6
+
+name = "Tenor recorder"
+clef = treble
+transposition = 0
+A lowest = C4
+A highest = A5
+P lowest = C4
+P highest = D6
+
+name = "Bass recorder"
+clef = old celesta
+transposition = 0
+A lowest = F3
+A highest = D5
+P lowest = F3
+P highest = F5
+
+name = "Greatbass recorder"
+clef = old celesta
+transposition = 0
+A lowest = C3
+A highest = A4
+P lowest = A3
+P highest = D7
+
+name = "Contrabass recorder"
+clef = bass
+transposition = 0
+A lowest = F2
+A highest = D4
+P lowest = F2
+P highest = F5
+
+name = "G soprano ocarina"
+clef = xylphone
+transposition = 0
+A lowest = G5
+A highest = A6
+P lowest = G5
+P highest = B6
+
+name = "F soprano ocarina"
+clef = xylophone
+transposition = 0
+A lowest = F5
+A highest = G6
+P lowest = F5
+P highest = A6
+
+name = "C soprano ocarina"
+clef = xylophone
+transposition = 0
+A lowest = C5
+A highest = D6
+P lowest = C5
+P highest = E6
+
+name = "Bb soprano ocarina"
+clef = xylophone
+transposition = 0
+A lowest = Bb4
+A highest = C6
+P lowest = Bb4
+P highest = D6
+
+name = "G alto ocarina"
+clef = treble
+transposition = 0
+A lowest = G4
+A highest = A5
+P lowest = G4
+P highest = B5
+
+name = "F alto ocarina"
+clef = treble
+transposition = 0
+A lowest = F4
+A highest = G5
+P lowest = F4
+P highest = A5
+
+name = "C alto ocarina"
+clef = treble
+transposition = 0
+A lowest = C4
+A highest = D5
+P lowest = C4
+P highest = E5
+
+name = "Bb alto ocarina"
+clef = treble
+transposition = 0
+A lowest = Bb3
+A highest = C5
+P lowest = Bb3
+P highest = D5
+
+name = "C bass ocarina"
+clef = bass
+transposition = 0
+A lowest = C3
+A highest = D4
+P lowest = C3
+P highest = E4
+
+name = "Slide whistle"
+clef = xylophone
+transposition = 0
+A lowest = A4
+A highest = C7
+P lowest = A4
+P highest = C7
+
+name = "Pan flute"
+clef = treble
+transposition = 0
+A lowest = G3
+A highest = G6
+P lowest = G3
+P highest = G6
+
+name = "Shakuhachi"
+clef = treble
+transposition = 0
+A lowest = D4
+A highest = D6
+P lowest = D4
+P highest = D6
+
+# end category = Flutes
+#
+category = Double reeds
+
+name = "Piccolo oboe in F"
+clef = treble
+transposition = +5
+A lowest = Bb3
+A highest = D6
+P lowest = Bb3
+P highest = G#6
+
+name = "Piccolo oboe in Eb"
+clef = treble
+transposition = +3
+A lowest = Bb3
+A highest = D6
+P lowest = Bb3
+P highest = G#6
+
+name = "Oboe"
+clef = treble
+transposition = 0
+A lowest = Bb3
+A highest = D#6
+P lowest = Bb3
+P highest = A6
+
+name = "Oboe d'amore"
+clef = treble
+transposition = -3
+A lowest = B3
+A highest = D#6
+P lowest = B3
+P highest = F#6
+
+name = "English horn"
+clef = treble
+transposition = -7
+A lowest = B3
+A highest = E6
+P lowest = B3
+P highest = F#6
+
+name = "Baritone oboe"
+clef = guitar
+transposition = 0
+A lowest = B2
+A highest = E5
+P lowest = B2
+P highest = F#5
+
+name = "Heckelphone"
+clef = guitar
+transposition = 0
+A lowest = A2
+A highest = D#5
+P lowest = A2
+P highest = F#5
+
+name = "Baroque oboe"
+clef = treble
+transposition = 0
+A lowest = C4
+A highest = B5
+P lowest = C4
+P highest = D6
+
+name = "Oboe da caccia"
+clef = treble
+transposition = -7
+A lowest = C4
+A highest = D6
+P lowest = C4
+P highest = E6
+
+name = "Shawm"
+clef = treble
+transposition = 0
+A lowest = C4
+A highest = E5
+P lowest = C4
+P highest = G5
+
+name = "Sopranino shawm"
+clef = treble
+transposition = 0
+A lowest = F4
+A highest = A5
+P lowest = F4
+P highest = D6
+
+name = "Descant pommer"
+clef = treble
+transposition = 0
+A lowest = C4
+A highest = B6
+P lowest = C4
+P highest = D6
+
+name = "Alto pommer"
+clef = treble
+transposition = 0
+A lowest = F3
+A highest = D5
+P lowest = F3
+P highest = F5
+
+name = "Soprano crumhorn"
+clef = treble
+transposition = 0
+A lowest = C4
+A highest = D5
+P lowest = C4
+P highest = F5
+
+name = "Alto crumhorn"
+clef = treble
+transposition = 0
+A lowest = F3
+A highest = G4
+P lowest = F3
+P highest = Bb4
+
+name = "Tenor crumhorn"
+clef = guitar
+transposition = 0
+A lowest = C3
+A highest = D4
+P lowest = C3
+P highest = F4
+
+name = "Bass crumhorn"
+clef = bass
+transposition = 0
+A lowest = F2
+A highest = G3
+P lowest = F2
+P highest = Bb3
+
+name = "Greatbass crumhorn"
+clef = bass
+transposition = 0
+A lowest = C2
+A highest = D3
+P lowest = C2
+P highest = F3
+
+name = "Soprano cornamuse"
+clef = treble
+transposition = 0
+A lowest = C4
+A highest = D5
+P lowest = C4
+P highest = F5
+
+name = "Alto cornamuse"
+clef = treble
+transposition = 0
+A lowest = F3
+A highest = G4
+P lowest = F3
+P highest = Bb4
+
+name = "Tenor cornamuse"
+clef = guitar
+transposition = 0
+A lowest = C3
+A highest = D4
+P lowest = C3
+P highest = F4
+
+name = "Bass cornamuse"
+clef = bass
+transposition = 0
+A lowest = F2
+A highest = G3
+P lowest = F2
+P highest = Bb3
+
+name = "Sopranino rauschpfeife"
+clef = treble
+transposition = 0
+A lowest = F4
+A highest = A5
+P lowest = F4
+P highest = C6
+
+name = "Soprano rauschpfeife"
+clef = treble
+transposition = 0
+A lowest = C4
+A highest = E5
+P lowest = C4
+P highest = G5
+
+name = "Bassoon"
+clef = bass
+transposition = 0
+A lowest = Bb1
+A highest = A4
+P lowest = Bb1
+P highest = E5
+
+name = "Contrabassoon"
+clef = contrabass
+transposition = 0
+A lowest = Bb0
+A highest = A3
+P lowest = A0
+P highest = C4
+
+name = "Dulcian"
+clef = bass
+transposition = 0
+A lowest = E2
+A highest = D4
+P lowest = E2
+P highest = F4
+
+name = "Rackett"
+clef = bass
+transposition = 0
+A lowest = Bb1
+A highest = D4
+P lowest = Bb1
+P highest = F4
+
+name = "Sopranino sarrusophone"
+clef = treble
+transposition = +3
+A lowest = Bb3
+A highest = C6
+P lowest = Bb3
+P highest = Eb6
+
+name = "Soprano sarrusophone"
+clef = treble
+transposition = -2
+A lowest = Bb3
+A highest = F6
+P lowest = Bb3
+P highest = Bb6
+
+name = "Alto sarrusophone"
+clef = treble
+transposition = -9
+A lowest = Bb3
+A highest = F6
+P lowest = Bb3
+P highest = Bb6
+
+name = "Tenor sarrusophone"
+clef = treble
+transposition = -14
+A lowest = Bb3
+A highest = F6
+P lowest = Bb3
+P highest = Bb6
+
+name = "Baritone sarrusophone"
+clef = treble
+transposition = -21
+A lowest = Bb3
+A highest = F6
+P lowest = A3
+P highest = Bb6
+
+name = "Bass sarrusophone"
+clef = treble
+transposition = -26
+A lowest = Bb3
+A highest = F6
+P lowest = Bb3
+P highest = Bb6
+
+name = "Contrabass sarrusophone"
+clef = treble
+transposition = -33
+A lowest = Bb3
+A highest = D6
+P lowest = Bb3
+P highest = F6
+
+name = "Bagpipe"
+clef = treble
+transposition = 0
+A lowest = C4
+A highest = G5
+P lowest = C4
+P highest = G5
+
+# end category = Double reeds
+#
+category = Single reeds
+
+name = "Soprano clarinet"
+clef = treble
+transposition = +7
+A lowest = E3
+A highest = A5
+P lowest = E3
+P highest = A5
+
+name = "Eb clarinet"
+clef = treble
+transposition = +3
+A lowest = E3
+A highest = G6
+P lowest = E3
+P highest = C7
+
+name = "D clarinet"
+clef = treble
+transposition = +2
+A lowest = E3
+A highest = G6
+P lowest = E3
+P highest = C7
+
+name = "C clarinet"
+clef = treble
+transposition = 0
+A lowest = E3
+A highest = G6
+P lowest = E3
+P highest = C7
+
+name = "Bb clarinet"
+clef = treble
+transposition = -2
+A lowest = E3
+A highest = G6
+P lowest = E3
+P highest = C7
+
+name = "A clarinet"
+clef = treble
+transposition = -3
+A lowest = E3
+A highest = G6
+P lowest = E3
+P highest = C7
+
+name = "Alto clarinet"
+clef = treble
+transposition = -9
+A lowest = E3
+A highest = F6
+P lowest = E3
+P highest = A6
+
+name = "Bassett horn"
+clef = treble
+transposition = -7
+A lowest = C3
+A highest = G6
+P lowest = C3
+P highest = A6
+
+name = "Bass clarinet"
+clef = treble
+transposition = -14
+A lowest = Eb3
+A highest = F6
+P lowest = Eb3
+P highest = A6
+
+name = "Contra-alto clarinet"
+clef = treble
+transposition = -21
+A lowest = E3
+A highest = G6
+P lowest = E3
+P highest = C7
+
+name = "Contrabass clarinet"
+clef = treble
+transposition = -26
+A lowest = E3
+A highest = G6
+P lowest = E3
+P highest = C7
+
+name = "Sopranino chalumeau"
+clef = treble
+transposition = 0
+A lowest = F4
+A highest = G5
+P lowest = F4
+P highest = Bb5
+
+name = "Soprano chalumeau"
+clef = treble
+transposition = 0
+A lowest = C4
+A highest = D5
+P lowest = C4
+P highest = F5
+
+name = "Alto chalumeau"
+clef = guitar
+transposition = 0
+A lowest = F3
+A highest = G4
+P lowest = F3
+P highest = Bb4
+
+name = "Tenor chalumeau"
+clef = guitar
+transposition = 0
+A lowest = C3
+A highest = D4
+P lowest = C3
+P highest = F4
+
+name = "Sopranino saxophone"
+clef = treble
+transposition = +3
+A lowest = Bb3
+A highest = C6
+P lowest = Bb3
+P highest = Eb6
+
+name = "Soprano saxophone"
+clef = treble
+transposition = -2
+A lowest = Bb3
+A highest = G6
+P lowest = Bb3
+P highest = C7
+
+name = "Alto saxophone"
+clef = treble
+transposition = -9
+A lowest = Bb3
+A highest = G6
+P lowest = Bb3
+P highest = C7
+
+name = "Tenor saxophone"
+clef = treble
+transposition = -14
+A lowest = Bb3
+A highest = G6
+P lowest = Bb3
+P highest = C7
+
+name = "Baritone saxophone"
+clef = treble
+transposition = -21
+A lowest = Bb3
+A highest = G6
+P lowest = A3
+P highest = C7
+
+name = "Bass saxophone"
+clef = treble
+transposition = -26
+A lowest = Bb3
+A highest = G6
+P lowest = Bb3
+P highest = C7
+
+name = "Contrabass saxophone"
+clef = treble
+transposition = -33
+A lowest = Bb3
+A highest = D6
+P lowest = Bb3
+P highest = F6
+
+#end category = Single reeds
+#
+category = Wind electrophones
+
+name = "Wind synthesizer"
+clef = treble
+transposition = 0
+A lowest = 0
+A highest = 127
+P lowest = 0
+P highest = 127
+
+
+# -----------------[brass]----------------
+category = Brass
+
+name = "Piccolo trumpet in Bb"
+clef = treble
+transposition = +10
+A lowest = Db2
+A highest = E5
+P lowest = Db2
+P highest = G5
+
+name = "Piccolo trumpet in A"
+clef = treble
+transposition = +9
+A lowest = Db2
+A highest = E5
+P lowest = Db2
+P highest = G5
+
+name = "Trumpet in Eb"
+clef = treble
+transposition = +3
+A lowest = F#3
+A highest = A5
+P lowest = F#3
+P highest = C6
+
+name = "Trumpet in D"
+clef = treble
+transposition = +2
+A lowest = F#3
+A highest = A5
+P lowest = F#3
+P highest = C6
+
+name = "Trumpet in C"
+clef = treble
+transposition = 0
+A lowest = F#3
+A highest = A5
+P lowest = F#3
+P highest = C6
+
+name = "Trumpet in Bb"
+clef = treble
+transposition = -2
+A lowest = F#3
+A highest = A5
+P lowest = F#3
+P highest = C6
+
+name = "Bass trumpet in Eb"
+clef = treble
+transposition = -9
+A lowest = F#3
+A highest = A5
+P lowest = F#3
+P highest = C6
+
+name = "Bass trumpet in Bb"
+clef = treble
+transposition = -14
+A lowest = F#3
+A highest = A5
+P lowest = F#3
+P highest = C6
+
+name = "Baroque trumpet in F"
+clef = treble
+transposition = +5
+A lowest = C4
+A highest = A5
+P lowest = C4
+P highest = E6
+
+name = "Baroque trumpet in Eb"
+clef = treble
+transposition = +3
+A lowest = C4
+A highest = A5
+P lowest = C4
+P highest = E6
+
+name = "Baroque trumpet in D"
+clef = treble
+transposition = +2
+A lowest = C4
+A highest = A5
+P lowest = C4
+P highest = E6
+
+name = "Baroque trumpet in C"
+clef = treble
+transposition = 0
+A lowest = C4
+A highest = A5
+P lowest = C4
+P highest = E6
+
+name = "Baroque trumpet in Bb"
+clef = treble
+transposition = -2
+A lowest = C4
+A highest = A5
+P lowest = C4
+P highest = E6
+
+name = "Cornet in Eb"
+clef = treble
+transposition = +3
+A lowest = F#3
+A highest = A5
+P lowest = F#3
+P highest = C6
+
+name = "Cornet in Bb"
+clef = treble
+transposition = -2
+A lowest = F#3
+A highest = A5
+P lowest = F#3
+P highest = C6
+
+name = "Flugelhorn"
+clef = treble
+transposition = -2
+A lowest = F#3
+A highest = A5
+P lowest = F#3
+P highest = C6
+
+name = "Cornettino"
+clef = treble
+transposition = 0
+A lowest = C4
+A highest = B5
+P lowest = C4
+P highest = D6
+
+name = "Alto cornetto"
+clef = treble
+transposition = 0
+A lowest = A3
+A highest = B5
+P lowest = A3
+P highest = D6
+
+name = "Tenor cornetto"
+clef = tenor
+transposition = 0
+A lowest = C3
+A highest = B4
+P lowest = C3
+P highest = E5
+
+name = "Serpent"
+clef = bass
+transposition = 0
+A lowest = C2
+A highest = F4
+P lowest = C2
+P highest = A4
+
+name = "Alto ophicleide in F"
+clef = treble
+transposition = 0
+A lowest = E3
+A highest = A5
+P lowest = E3
+P highest = C6
+
+name = "Alto ophicleide in Eb"
+clef = treble
+transposition = 0
+A lowest = Eb3
+A highest = G5
+P lowest = Eb3
+P highest = Bb5
+
+name = "Bass ophicleide in C"
+clef = bass
+transposition = 0
+A lowest = B1
+A highest = Eb4
+P lowest = B1
+P highest = G4
+
+name = "Bass ophicleide in Bb"
+clef = bass
+transposition = 0
+A lowest = A1
+A highest = D4
+P lowest = A1
+P highest = F#4
+
+name = "Contrabass ophicleide in Eb"
+clef = bass
+transposition = 0
+A lowest = D1
+A highest = G3
+P lowest = D1
+P highest = Bb3
+
+name = "French horn"
+clef = treble
+transposition = -7
+A lowest = F#2
+A highest = Bb5
+P lowest = D2
+P highest = C6
+
+name = "French horn in C alto"
+clef = treble
+transposition = 0
+A lowest = Bb2
+A highest = G5
+P lowest = F#2
+P highest = C6
+
+name = "French horn in Bb alto"
+clef = treble
+transposition = -2
+A lowest = A#2
+A highest = G5
+P lowest = F#2
+P highest = C6
+
+name = "French horn in A"
+clef = treble
+transposition = -3
+A lowest = A#2
+A highest = G5
+P lowest = F#2
+P highest = C6
+
+name = "French horn in Ab"
+clef = treble
+transposition = -4
+A lowest = A#2
+A highest = G5
+P lowest = F#2
+P highest = C6
+
+name = "French horn in G"
+clef = treble
+transposition = -5
+A lowest = A#2
+A highest = G5
+P lowest = F#2
+P highest = C6
+
+name = "French horn in E"
+clef = treble
+transposition = -8
+A lowest = A#2
+A highest = G5
+P lowest = F#2
+P highest = C6
+
+name = "French horn in Eb"
+clef = treble
+transposition = -9
+A lowest = A#2
+A highest = G5
+P lowest = F#2
+P highest = C6
+
+name = "French horn in D"
+clef = treble
+transposition = -10
+A lowest = A#2
+A highest = G5
+P lowest = F#2
+P highest = C6
+
+name = "French horn in C basso"
+clef = treble
+transposition = -12
+A lowest = A#2
+A highest = G5
+P lowest = F#2
+P highest = C6
+
+name = "French horn in Bb basso"
+clef = treble
+transposition = -14
+A lowest = A#2
+A highest = G5
+P lowest = F#2
+P highest = C6
+
+name = "Alto horn in F"
+clef = treble
+transposition = -7
+A lowest = F#3
+A highest = A5
+P lowest = F#3
+P highest = C6
+
+name = "Alto horn in Eb"
+clef = treble
+transposition = -9
+A lowest = F#3
+A highest = A5
+P lowest = F#3
+P highest = C6
+
+name = "Baritone horn"
+clef = bass
+transposition = 0
+A lowest = E2
+A highest = G4
+P lowest = E2
+P highest = Bb4
+
+name = "Mellophone in F"
+clef = treble
+transposition = -7
+A lowest = F#3
+A highest = A5
+P lowest = F#3
+P highest = C6
+
+name = "Mellophone in Eb"
+clef = treble
+transposition = -9
+A lowest = F#3
+A highest = A5
+P lowest = F#3
+P highest = C6
+
+name = "Mellophonium in F"
+clef = treble
+transposition = -7
+A lowest = F#3
+A highest = A5
+P lowest = F#3
+P highest = C6
+
+name = "Mellophonium in Eb"
+clef = treble
+transposition = -9
+A lowest = F#3
+A highest = A5
+P lowest = F#3
+P highest = C6
+
+name = "Wagner tuba in Bb"
+clef = treble
+transposition = -2
+A lowest = F#2
+A highest = F5
+P lowest = F#2
+P highest = A5
+
+name = "Wagner tuba in F"
+clef = treble
+transposition = -7
+A lowest = F#2
+A highest = A5
+P lowest = F#2
+P highest = C6
+
+name = "Soprano trombone"
+clef = treble
+transposition = 0
+A lowest = E3
+A highest = F5
+P lowest = E3
+P highest = A5
+
+name = "Alto trombone"
+clef = alto
+transposition = 0
+A lowest = A2
+A highest = D5
+P lowest = A2
+P highest = F5
+
+name = "Tenor trombone"
+clef = bass
+transposition = 0
+A lowest = E2
+A highest = Bb4
+P lowest = E2
+P highest = D5
+
+name = "Bass trombone"
+clef = bass
+transposition = 0
+A lowest = C2
+A highest = Bb4
+P lowest = C2
+P highest = D5
+
+name = "Contrabass trombone"
+clef = bass
+transposition = 0
+A lowest = E1
+A highest = G3
+P lowest = E1
+P highest = Bb3
+
+name = "Euphonium"
+clef = bass
+transposition = 0
+A lowest = E2
+A highest = Bb4
+P lowest = E2
+P highest = D5
+
+name = "F tuba"
+clef = bass
+transposition = 0
+A lowest = D1
+A highest = E4
+P lowest = C1
+P highest = A4
+
+name = "C tuba"
+clef = bass
+transposition = 0
+A lowest = D1
+A highest = C4
+P lowest = C1
+P highest = F4
+
+name = "Bb tuba"
+clef = bass
+transposition = 0
+A lowest = E1
+A highest = Bb3
+P lowest = Bb0
+P highest = Eb4
+
+
+# -----------------[pitched percussion]----------------
+category = Pitched Percussion
+
+name = "Timpani"
+clef = bass
+transposition = 0
+A lowest = D2
+A highest = C4
+P lowest = D2
+P highest = C4
+
+name = "Roto-toms (treble)"
+clef = treble
+transposition = 0
+A lowest = G3
+A highest = E5
+P lowest = G3
+P highest = E5
+
+name = "Roto-toms (bass)"
+clef = bass
+transposition = 0
+A lowest = E2
+A highest = B3
+P lowest = E2
+P highest = B3
+
+name = "Glockenspiel"
+clef = crotale
+transposition = 0
+A lowest = G5
+A highest = C8
+P lowest = G5
+P highest = C8
+
+name = "Orff soprano glockenspiel"
+clef = crotale
+transposition = 0
+A lowest = C6
+A highest = A7
+P lowest = C6
+P highest = A7
+
+name = "Orff alto glockenspiel"
+clef = xylophone
+transposition = 0
+A lowest = C5
+A highest = A6
+P lowest = C5
+P highest = A6
+
+name = "Crotales"
+clef = crotale
+transposition = 0
+A lowest = C6
+A highest = C8
+P lowest = C6
+P highest = C8
+
+name = "Tubaphone"
+clef = crotale
+transposition = 0
+A lowest = C6
+A highest = C8
+P lowest = C6
+P highest = C8
+
+name = "Almglocken (treble)"
+clef = crotale
+transposition = 0
+A lowest = C4
+A highest = A7
+P lowest = C4
+P highest = A7
+
+name = "Almglocken (bass)"
+clef = modern celesta
+transposition = 0
+A lowest = C4
+A highest = A7
+P lowest = C4
+P highest = A7
+
+name = "Vibraphone"
+clef = treble
+transposition = 0
+A lowest = F3
+A highest = F6
+P lowest = C3
+P highest = C7
+
+name = "Orff soprano metallophone"
+clef = xylophone
+transposition = 0
+A lowest = C5
+A highest = A6
+P lowest = C5
+P highest = A6
+
+name = "Orff alto metallophone"
+clef = treble
+transposition = 0
+A lowest = C4
+A highest = A5
+P lowest = C4
+P highest = A5
+
+name = "Orff bass metallophone"
+clef = guitar
+transposition = 0
+A lowest = C3
+A highest = A4
+P lowest = C3
+P highest = A4
+
+name = "Tubular chimes"
+clef = treble
+transposition = 0
+A lowest = C4
+A highest = G5
+P lowest = C4
+P highest = G5
+
+name = "Bass steel drums"
+clef = bass
+transposition = 0
+A lowest = C2
+A highest = F3
+P lowest = C2
+P highest = F3
+
+name = "Cello steel drums"
+clef = tenor
+transposition = 0
+A lowest = B2
+A highest = G4
+P lowest = B2
+P highest = G4
+
+name = "Tenor steel drums"
+clef = alto
+transposition = 0
+A lowest = E3
+A highest = A4
+P lowest = E3
+P highest = A4
+
+name = "Guitar steel drums"
+clef = treble
+transposition = 0
+A lowest = F#3
+A highest = A5
+P lowest = F#3
+P highest = A5
+
+name = "Alto steel drums"
+clef = treble
+transposition = 0
+A lowest = G#3
+A highest = C#6
+P lowest = G#3
+P highest = C#6
+
+name = "Soprano steel drums"
+clef = treble
+transposition = 0
+A lowest = C4
+A highest = E6
+P lowest = C4
+P highest = E6
+
+name = "Hand bells (treble)"
+clef = treble
+transposition = 0
+A lowest = C2
+A highest = C7
+P lowest = C2
+P highest = C7
+
+name = "Hand bells (bass)"
+clef = bass
+transposition = 0
+A lowest = C2
+A highest = C7
+P lowest = C2
+P highest = C7
+
+name = "Tuned gongs"
+clef = bass
+transposition = 0
+A lowest = A2
+A highest = A3
+P lowest = A2
+P highest = A3
+
+name = "Flexatone"
+clef = xylophone
+transposition = 0
+A lowest = E5
+A highest = A6
+P lowest = E5
+P highest = A6
+
+name = "Musical saw"
+clef = treble
+transposition = 0
+A lowest = E4
+A highest = E7
+P lowest = E4
+P highest = E7
+
+name = "Musical glasses"
+clef = xylophone
+transposition = 0
+A lowest = C5
+A highest = G6
+P lowest = C5
+P highest = G6
+
+name = "Glass harmonica"
+clef = treble
+transposition = 0
+A lowest = F3
+A highest = F6
+P lowest = F3
+P highest = F6
+
+name = "Xylophone"
+clef = xylophone
+transposition = 0
+A lowest = F4
+A highest = C8
+P lowest = F4
+P highest = C8
+
+name = "Orff soprano xylophone"
+clef = xylophone
+transposition = 0
+A lowest = C5
+A highest = A6
+P lowest = C5
+P highest = A6
+
+name = "Orff alto xylophone"
+clef = treble
+transposition = 0
+A lowest = C4
+A highest = A5
+P lowest = C4
+P highest = A5
+
+name = "Orff bass xylophone"
+clef = guitar
+transposition = 0
+A lowest = C3
+A highest = A4
+P lowest = C3
+P highest = A4
+
+name = "Marimba (treble)"
+clef = treble
+transposition = 0
+A lowest = A2
+A highest = C7
+P lowest = A2
+P highest = C7
+
+name = "Marimba (bass)"
+clef = bass
+transposition = 0
+A lowest = A2
+A highest = C7
+P lowest = A2
+P highest = C7
+
+name = "Dulcimer (treble)"
+clef = treble
+transposition = 0
+A lowest = C3
+A highest = D6
+P lowest = G2
+P highest = E6
+
+name = "Dulcimer (bass)"
+clef = bass
+transposition = 0
+A lowest = C3
+A highest = D6
+P lowest = G2
+P highest = E6
+
+name = "Mallet synthesizer (treble)"
+clef = treble
+transposition = 0
+A lowest = 0
+A highest = 127
+P lowest = 0
+P highest = 127
+
+name = "Mallet synthesizer (bass)"
+clef = bass
+transposition = 0
+A lowest = 0
+A highest = 127
+P lowest = 0
+P highest = 127
+
+
+
+# -----------------[unpitched percussion]----------------
+category = Unpitched Percussion
+
+name = "Snare drum"
+clef = two-bar
+transposition = 0
+A lowest = 0
+A highest = 127
+P lowest = 0
+P highest = 127
+
+name = "Piccolo snare drum"
+clef = two-bar
+transposition = 0
+A lowest = 0
+A highest = 127
+P lowest = 0
+P highest = 127
+
+name = "Military drum"
+clef = two-bar
+transposition = 0
+A lowest = 0
+A highest = 127
+P lowest = 0
+P highest = 127
+
+name = "Tom-toms"
+clef = two-bar
+transposition = 0
+A lowest = 0
+A highest = 127
+P lowest = 0
+P highest = 127
+
+name = "Chinese tom-toms"
+clef = two-bar
+transposition = 0
+A lowest = 0
+A highest = 127
+P lowest = 0
+P highest = 127
+
+name = "Bongos"
+clef = two-bar
+transposition = 0
+A lowest = 0
+A highest = 127
+P lowest = 0
+P highest = 127
+
+name = "Congas"
+clef = two-bar
+transposition = 0
+A lowest = 0
+A highest = 127
+P lowest = 0
+P highest = 127
+
+name = "Timbales"
+clef = two-bar
+transposition = 0
+A lowest = 0
+A highest = 127
+P lowest = 0
+P highest = 127
+
+name = "Bass drum"
+clef = two-bar
+transposition = 0
+A lowest = 0
+A highest = 127
+P lowest = 0
+P highest = 127
+
+name = "Tambourine"
+clef = two-bar
+transposition = 0
+A lowest = 0
+A highest = 127
+P lowest = 0
+P highest = 127
+
+name = "Frame drum"
+clef = two-bar
+transposition = 0
+A lowest = 0
+A highest = 127
+P lowest = 0
+P highest = 127
+
+name = "Tablas"
+clef = two-bar
+transposition = 0
+A lowest = 0
+A highest = 127
+P lowest = 0
+P highest = 127
+
+name = "Cu�ca"
+clef = two-bar
+transposition = 0
+A lowest = 0
+A highest = 127
+P lowest = 0
+P highest = 127
+
+name = "Finger cymbals"
+clef = two-bar
+transposition = 0
+A lowest = 0
+A highest = 127
+P lowest = 0
+P highest = 127
+
+name = "Cymbals"
+clef = two-bar
+transposition = 0
+A lowest = 0
+A highest = 127
+P lowest = 0
+P highest = 127
+
+name = "Hi-hat cymbals"
+clef = two-bar
+transposition = 0
+A lowest = 0
+A highest = 127
+P lowest = 0
+P highest = 127
+
+name = "Suspended cymbal"
+clef = two-bar
+transposition = 0
+A lowest = 0
+A highest = 127
+P lowest = 0
+P highest = 127
+
+name = "Ride cymbal"
+clef = two-bar
+transposition = 0
+A lowest = 0
+A highest = 127
+P lowest = 0
+P highest = 127
+
+name = "Sizzle cymbal"
+clef = two-bar
+transposition = 0
+A lowest = 0
+A highest = 127
+P lowest = 0
+P highest = 127
+
+name = "Crash cymbal"
+clef = two-bar
+transposition = 0
+A lowest = 0
+A highest = 127
+P lowest = 0
+P highest = 127
+
+name = "Splash cymbal"
+clef = two-bar
+transposition = 0
+A lowest = 0
+A highest = 127
+P lowest = 0
+P highest = 127
+
+name = "Chinese cymbal"
+clef = two-bar
+transposition = 0
+A lowest = 0
+A highest = 127
+P lowest = 0
+P highest = 127
+
+name = "Triangle"
+clef = two-bar
+transposition = 0
+A lowest = 0
+A highest = 127
+P lowest = 0
+P highest = 127
+
+name = "Cowbells"
+clef = two-bar
+transposition = 0
+A lowest = 0
+A highest = 127
+P lowest = 0
+P highest = 127
+
+name = "Tam-tam"
+clef = two-bar
+transposition = 0
+A lowest = 0
+A highest = 127
+P lowest = 0
+P highest = 127
+
+name = "Bells"
+clef = two-bar
+transposition = 0
+A lowest = 0
+A highest = 127
+P lowest = 0
+P highest = 127
+
+name = "Sleighbells"
+clef = two-bar
+transposition = 0
+A lowest = 0
+A highest = 127
+P lowest = 0
+P highest = 127
+
+name = "Bell plate"
+clef = two-bar
+transposition = 0
+A lowest = 0
+A highest = 127
+P lowest = 0
+P highest = 127
+
+name = "Bowl gongs"
+clef = two-bar
+transposition = 0
+A lowest = 0
+A highest = 127
+P lowest = 0
+P highest = 127
+
+name = "Tubo"
+clef = two-bar
+transposition = 0
+A lowest = 0
+A highest = 127
+P lowest = 0
+P highest = 127
+
+name = "Metal castanets"
+clef = two-bar
+transposition = 0
+A lowest = 0
+A highest = 127
+P lowest = 0
+P highest = 127
+
+name = "Automobile brake drums"
+clef = two-bar
+transposition = 0
+A lowest = 0
+A highest = 127
+P lowest = 0
+P highest = 127
+
+name = "Iron pipes"
+clef = two-bar
+transposition = 0
+A lowest = 0
+A highest = 127
+P lowest = 0
+P highest = 127
+
+name = "Chaines"
+clef = two-bar
+transposition = 0
+A lowest = 0
+A highest = 127
+P lowest = 0
+P highest = 127
+
+name = "Anvil"
+clef = two-bar
+transposition = 0
+A lowest = 0
+A highest = 127
+P lowest = 0
+P highest = 127
+
+name = "Woodblocks"
+clef = two-bar
+transposition = 0
+A lowest = 0
+A highest = 127
+P lowest = 0
+P highest = 127
+
+name = "Temple blocks"
+clef = two-bar
+transposition = 0
+A lowest = 0
+A highest = 127
+P lowest = 0
+P highest = 127
+
+name = "Claves"
+clef = two-bar
+transposition = 0
+A lowest = 0
+A highest = 127
+P lowest = 0
+P highest = 127
+
+name = "Castanets"
+clef = two-bar
+transposition = 0
+A lowest = 0
+A highest = 127
+P lowest = 0
+P highest = 127
+
+name = "Guiro"
+clef = two-bar
+transposition = 0
+A lowest = 0
+A highest = 127
+P lowest = 0
+P highest = 127
+
+name = "Maracas"
+clef = two-bar
+transposition = 0
+A lowest = 0
+A highest = 127
+P lowest = 0
+P highest = 127
+
+name = "Cabasa"
+clef = two-bar
+transposition = 0
+A lowest = 0
+A highest = 127
+P lowest = 0
+P highest = 127
+
+name = "Quijada"
+clef = two-bar
+transposition = 0
+A lowest = 0
+A highest = 127
+P lowest = 0
+P highest = 127
+
+name = "Vibra slap"
+clef = two-bar
+transposition = 0
+A lowest = 0
+A highest = 127
+P lowest = 0
+P highest = 127
+
+name = "Slit drum"
+clef = two-bar
+transposition = 0
+A lowest = 0
+A highest = 127
+P lowest = 0
+P highest = 127
+
+name = "Whip"
+clef = two-bar
+transposition = 0
+A lowest = 0
+A highest = 127
+P lowest = 0
+P highest = 127
+
+name = "Ratchet"
+clef = two-bar
+transposition = 0
+A lowest = 0
+A highest = 127
+P lowest = 0
+P highest = 127
+
+name = "Thundersheet"
+clef = two-bar
+transposition = 0
+A lowest = 0
+A highest = 127
+P lowest = 0
+P highest = 127
+
+name = "Sandpaper blocks"
+clef = two-bar
+transposition = 0
+A lowest = 0
+A highest = 127
+P lowest = 0
+P highest = 127
+
+name = "Wooden wind chimes"
+clef = two-bar
+transposition = 0
+A lowest = 0
+A highest = 127
+P lowest = 0
+P highest = 127
+
+name = "Bamboo wind chimes"
+clef = two-bar
+transposition = 0
+A lowest = 0
+A highest = 127
+P lowest = 0
+P highest = 127
+
+name = "Metal wind chimes"
+clef = two-bar
+transposition = 0
+A lowest = 0
+A highest = 127
+P lowest = 0
+P highest = 127
+
+name = "Glass wind chimes"
+clef = two-bar
+transposition = 0
+A lowest = 0
+A highest = 127
+P lowest = 0
+P highest = 127
+
+name = "Shell wind chimes"
+clef = two-bar
+transposition = 0
+A lowest = 0
+A highest = 127
+P lowest = 0
+P highest = 127
+
+name = "Stones"
+clef = two-bar
+transposition = 0
+A lowest = 0
+A highest = 127
+P lowest = 0
+P highest = 127
+
+name = "Finger snap"
+clef = two-bar
+transposition = 0
+A lowest = 0
+A highest = 127
+P lowest = 0
+P highest = 127
+
+name = "Hand clap"
+clef = two-bar
+transposition = 0
+A lowest = 0
+A highest = 127
+P lowest = 0
+P highest = 127
+
+name = "Slap"
+clef = two-bar
+transposition = 0
+A lowest = 0
+A highest = 127
+P lowest = 0
+P highest = 127
+
+name = "Stamp"
+clef = two-bar
+transposition = 0
+A lowest = 0
+A highest = 127
+P lowest = 0
+P highest = 127
+
+name = "Drum set"
+clef = box
+transposition = 0
+A lowest = 0
+A highest = 127
+P lowest = 0
+P highest = 127
+
+name = "Percussion synthesizer"
+clef = two-bar
+transposition = 0
+A lowest = 0
+A highest = 127
+P lowest = 0
+P highest = 127
+
+# -----------------[keyboards]----------------
+category = Keyboards
+
+name = "Piano (treble)"
+clef = treble
+transposition = 0
+A lowest = A0
+A highest = C8
+P lowest = A0
+P highest = C8
+
+name = "Piano (bass)"
+clef = bass
+transposition = 0
+A lowest = A0
+A highest = C8
+P lowest = A0
+P highest = C8
+
+name = "Clavichord (treble)"
+clef = treble
+transposition = 0
+A lowest = F1
+A highest = F6
+P lowest = F1
+P highest = F6
+
+name = "Clavichord (bass)"
+clef = bass
+transposition = 0
+A lowest = F1
+A highest = F6
+P lowest = F1
+P highest = F6
+
+name = "Harpsichord (treble)"
+clef = treble
+transposition = 0
+A lowest = F1
+A highest = F6
+P lowest = F1
+P highest = F6
+
+name = "Harpsichord (bass)"
+clef = bass
+transposition = 0
+A lowest = F1
+A highest = F6
+P lowest = F1
+P highest = F6
+
+name = "Celesta (treble)"
+clef = crotale
+transposition = 0
+A lowest = C4
+A highest = C8
+P lowest = C4
+P highest = C8
+
+name = "Celesta (bass)"
+clef = modern celesta
+transposition = 0
+A lowest = C4
+A highest = C8
+P lowest = C4
+P highest = C8
+
+name = "Electric piano (treble)"
+clef = treble
+transposition = 0
+A lowest = A0
+A highest = C8
+P lowest = A0
+P highest = C8
+
+name = "Electric piano (bass)"
+clef = bass
+transposition = 0
+A lowest = A0
+A highest = C8
+P lowest = A0
+P highest = C8
+
+name = "Toy piano"
+clef = treble
+transposition = 0
+A lowest = C4
+A highest = G5
+P lowest = C4
+P highest = G5
+
+name = "Keyboard synthesizer (treble)"
+clef = treble
+transposition = 0
+A lowest = 0
+A highest = 127
+P lowest = 0
+P highest = 127
+
+name = "Keyboard synthesizer (bass)"
+clef = bass
+transposition = 0
+A lowest = 0
+A highest = 127
+P lowest = 0
+P highest = 127
+
+name = "Organ (manual) (treble)"
+clef = treble
+transposition = 0
+A lowest = C2
+A highest = C7
+P lowest = C2
+P highest = C7
+
+name = "Organ (manual) (bass)"
+clef = bass
+transposition = 0
+A lowest = C2
+A highest = C7
+P lowest = C2
+P highest = C7
+
+name = "Organ (pedal)"
+clef = bass
+transposition = 0
+A lowest = C2
+A highest = G4
+P lowest = C2
+P highest = G4
+
+name = "Electronic organ (manual) (treble)"
+clef = treble
+transposition = 0
+A lowest = C2
+A highest = C7
+P lowest = C2
+P highest = C7
+
+name = "Electronic organ (manual) (bass)"
+clef = bass
+transposition = 0
+A lowest = C2
+A highest = C7
+P lowest = C2
+P highest = C7
+
+name = "Electronic organ (pedal)"
+clef = bass
+transposition = 0
+A lowest = C2
+A highest = G4
+P lowest = C2
+P highest = G4
+
+name = "Harmonium (treble)"
+clef = treble
+transposition = 0
+A lowest = F1
+A highest = F6
+P lowest = F1
+P highest = F6
+
+name = "Harmonium (bass)"
+clef = bass
+transposition = 0
+A lowest = F1
+A highest = F6
+P lowest = F1
+P highest = F6
+
+#end category Keyboards
+#
+category = Free reeds
+
+name = "Accordion (treble)"
+clef = treble
+transposition = 0
+A lowest = F3
+A highest = A6
+P lowest = F3
+P highest = A6
+
+name = "Accordion (bass)"
+clef = bass
+transposition = 0
+A lowest = C2
+A highest = A4
+P lowest = C2
+P highest = A4
+
+name = "Bandoneon (treble)"
+clef = treble
+transposition = 0
+A lowest = A3
+A highest = A6
+P lowest = A3
+P highest = A6
+
+name = "Bandoneon (bass)"
+clef = bass
+transposition = 0
+A lowest = C2
+A highest = A4
+P lowest = C2
+P highest = A4
+
+name = "Harmonica"
+clef = treble
+transposition = 0
+A lowest = E1
+A highest = G7
+P lowest = E1
+P highest = G7
+
+name = "Melodica"
+clef = treble
+transposition = 0
+A lowest = F3
+A highest = C6
+P lowest = F3
+P highest = C6
+
+# end category Free reeds
+#
+# -----------------[voices]----------------
+category = Voices
+name = "Soprano"
+clef = treble
+transposition = 0
+A lowest = C4
+A highest = A5
+P lowest = C4
+P highest = C6
+
+name = "Mezzosoprano"
+clef = treble
+transposition = 0
+A lowest = A3
+A highest = F5
+P lowest = A3
+P highest = A5
+
+name = "Alto"
+clef = treble
+transposition = 0
+A lowest = G3
+A highest = D5
+P lowest = G3
+P highest = F5
+
+name = "Tenor"
+clef = guitar
+transposition = 0
+A lowest = C3
+A highest = A4
+P lowest = C3
+P highest = C5
+
+name = "Baritone"
+clef = bass
+transposition = 0
+A lowest = A2
+A highest = F4
+P lowest = A2
+P highest = A4
+
+name = "Bass"
+clef = bass
+transposition = 0
+A lowest = F2
+A highest = D4
+P lowest = F2
+P highest = F4
+
+name = "Boy soprano"
+clef = treble
+transposition = 0
+A lowest = C4
+A highest = F5
+P lowest = C4
+P highest = A5
+
+# -----------------[miscellaneous]----------------
+category = Miscellaneous
+
+name = "Kazoo (treble)"
+clef = treble
+transposition = 0
+A lowest = G3
+A highest = A5
+P lowest = G3
+P highest = C6
+
+name = "Kazoo (bass)"
+clef = bass
+transposition = 0
+A lowest = F2
+A highest = A4
+P lowest = F2
+P highest = C5
+
+name = "Police whistle"
+clef = two-bar
+transposition = 0
+A lowest = 0
+A highest = 127
+P lowest = 0
+P highest = 127
+
+name = "Bird whistle"
+clef = two-bar
+transposition = 0
+A lowest = 0
+A highest = 127
+P lowest = 0
+P highest = 127
+
+name = "Duck call"
+clef = two-bar
+transposition = 0
+A lowest = 0
+A highest = 127
+P lowest = 0
+P highest = 127
+
+name = "Mouth siren"
+clef = two-bar
+transposition = 0
+A lowest = 0
+A highest = 127
+P lowest = 0
+P highest = 127
+
+name = "Siren"
+clef = two-bar
+transposition = 0
+A lowest = 0
+A highest = 127
+P lowest = 0
+P highest = 127
+
+name = "Auto horn"
+clef = two-bar
+transposition = 0
+A lowest = 0
+A highest = 127
+P lowest = 0
+P highest = 127
+
+name = "Klaxon horn"
+clef = two-bar
+transposition = 0
+A lowest = 0
+A highest = 127
+P lowest = 0
+P highest = 127
+
+name = "Lion's roar"
+clef = two-bar
+transposition = 0
+A lowest = 0
+A highest = 127
+P lowest = 0
+P highest = 127
+
+name = "Wind machine"
+clef = two-bar
+transposition = 0
+A lowest = 0
+A highest = 127
+P lowest = 0
+P highest = 127
+
+name = "Pistol shot"
+clef = two-bar
+transposition = 0
+A lowest = 0
+A highest = 127
+P lowest = 0
+P highest = 127
diff --git a/data/presets/presets.xml b/data/presets/presets.xml
new file mode 100644
index 0000000..a7f451c
--- /dev/null
+++ b/data/presets/presets.xml
@@ -0,0 +1,2010 @@
+<!-- THIS FILE WAS GENERATED AUTOMATICALLY FROM SOURCE. DO NOT EDIT THIS FILE! -->
+<presets>
+ <category name="Bowed strings">
+ <instrument name="Violin">
+ <clef type="treble" />
+ <transpose value="0" />
+ <range class="amateur" low="55" high="88"/>
+ <range class="professional" low="55" high="103"/>
+ </instrument>
+ <instrument name="Baroque violin">
+ <clef type="treble" />
+ <transpose value="0" />
+ <range class="amateur" low="55" high="88"/>
+ <range class="professional" low="55" high="103"/>
+ </instrument>
+ <instrument name="Viola">
+ <clef type="alto" />
+ <transpose value="0" />
+ <range class="amateur" low="48" high="79"/>
+ <range class="professional" low="48" high="93"/>
+ </instrument>
+ <instrument name="Baroque viola">
+ <clef type="alto" />
+ <transpose value="0" />
+ <range class="amateur" low="48" high="79"/>
+ <range class="professional" low="48" high="93"/>
+ </instrument>
+ <instrument name="Violoncello">
+ <clef type="bass" />
+ <transpose value="0" />
+ <range class="amateur" low="36" high="67"/>
+ <range class="professional" low="36" high="72"/>
+ </instrument>
+ <instrument name="Baroque violoncello">
+ <clef type="bass" />
+ <transpose value="0" />
+ <range class="amateur" low="36" high="67"/>
+ <range class="professional" low="36" high="72"/>
+ </instrument>
+ <instrument name="Contrabass">
+ <clef type="contrabass" />
+ <transpose value="0" />
+ <range class="amateur" low="40" high="62"/>
+ <range class="professional" low="35" high="79"/>
+ </instrument>
+ <instrument name="Baroque contrabass">
+ <clef type="contrabass" />
+ <transpose value="0" />
+ <range class="amateur" low="40" high="62"/>
+ <range class="professional" low="40" high="79"/>
+ </instrument>
+ <instrument name="Soprano viola da gamba">
+ <clef type="soprano" />
+ <transpose value="0" />
+ <range class="amateur" low="50" high="86"/>
+ <range class="professional" low="50" high="93"/>
+ </instrument>
+ <instrument name="Alto viola da gamba">
+ <clef type="alto" />
+ <transpose value="0" />
+ <range class="amateur" low="45" high="81"/>
+ <range class="professional" low="45" high="88"/>
+ </instrument>
+ <instrument name="Tenor viola da gamba">
+ <clef type="tenor" />
+ <transpose value="0" />
+ <range class="amateur" low="43" high="79"/>
+ <range class="professional" low="43" high="86"/>
+ </instrument>
+ <instrument name="Viola da gamba">
+ <clef type="bass" />
+ <transpose value="0" />
+ <range class="amateur" low="38" high="74"/>
+ <range class="professional" low="38" high="81"/>
+ </instrument>
+ <instrument name="Violone">
+ <clef type="contrabass" />
+ <transpose value="0" />
+ <range class="amateur" low="40" high="62"/>
+ <range class="professional" low="40" high="79"/>
+ </instrument>
+ </category>
+ <category name="Plucked strings">
+ <instrument name="Soprano guitar">
+ <clef type="treble" />
+ <transpose value="0" />
+ <range class="amateur" low="52" high="107"/>
+ <range class="professional" low="52" high="107"/>
+ </instrument>
+ <instrument name="Alto guitar">
+ <clef type="guitar" />
+ <transpose value="0" />
+ <range class="amateur" low="47" high="88"/>
+ <range class="professional" low="47" high="88"/>
+ </instrument>
+ <instrument name="Guitar (prim)">
+ <clef type="guitar" />
+ <transpose value="0" />
+ <range class="amateur" low="40" high="95"/>
+ <range class="professional" low="40" high="95"/>
+ </instrument>
+ <instrument name="Contrabass guitar">
+ <clef type="contrabass" />
+ <transpose value="0" />
+ <range class="amateur" low="28" high="83"/>
+ <range class="professional" low="28" high="83"/>
+ </instrument>
+ <instrument name="11-string alto guitar (treble)">
+ <clef type="treble" />
+ <transpose value="0" />
+ <range class="amateur" low="34" high="98"/>
+ <range class="professional" low="34" high="98"/>
+ </instrument>
+ <instrument name="11-string alto guitar (bass)">
+ <clef type="bass" />
+ <transpose value="0" />
+ <range class="amateur" low="34" high="98"/>
+ <range class="professional" low="34" high="98"/>
+ </instrument>
+ <instrument name="Steel string guitar">
+ <clef type="guitar" />
+ <transpose value="0" />
+ <range class="amateur" low="40" high="95"/>
+ <range class="professional" low="40" high="95"/>
+ </instrument>
+ <instrument name="Pedal steel guitar">
+ <clef type="tab" />
+ <transpose value="0" />
+ <range class="amateur" low="35" high="75"/>
+ <range class="professional" low="35" high="75"/>
+ </instrument>
+ <instrument name="12-string guitar">
+ <clef type="guitar" />
+ <transpose value="0" />
+ <range class="amateur" low="40" high="95"/>
+ <range class="professional" low="40" high="95"/>
+ </instrument>
+ <instrument name="Electric guitar">
+ <clef type="guitar" />
+ <transpose value="0" />
+ <range class="amateur" low="40" high="95"/>
+ <range class="professional" low="40" high="95"/>
+ </instrument>
+ <instrument name="Electric bass guitar (fretted)">
+ <clef type="contrabass" />
+ <transpose value="0" />
+ <range class="amateur" low="28" high="83"/>
+ <range class="professional" low="23" high="88"/>
+ </instrument>
+ <instrument name="Electric bass guitar (fretless)">
+ <clef type="contrabass" />
+ <transpose value="0" />
+ <range class="amateur" low="28" high="83"/>
+ <range class="professional" low="23" high="88"/>
+ </instrument>
+ <instrument name="Lute">
+ <clef type="guitar" />
+ <transpose value="0" />
+ <range class="amateur" low="33" high="98"/>
+ <range class="professional" low="33" high="98"/>
+ </instrument>
+ <instrument name="Cittern">
+ <clef type="treble" />
+ <transpose value="0" />
+ <range class="amateur" low="48" high="94"/>
+ <range class="professional" low="48" high="94"/>
+ </instrument>
+ <instrument name="Piccolo balalaika">
+ <clef type="xylophone" />
+ <transpose value="0" />
+ <range class="amateur" low="71" high="91"/>
+ <range class="professional" low="71" high="91"/>
+ </instrument>
+ <instrument name="Prima balalaika">
+ <clef type="treble" />
+ <transpose value="0" />
+ <range class="amateur" low="64" high="79"/>
+ <range class="professional" low="64" high="79"/>
+ </instrument>
+ <instrument name="Secunda balalaika">
+ <clef type="treble" />
+ <transpose value="0" />
+ <range class="amateur" low="57" high="72"/>
+ <range class="professional" low="57" high="72"/>
+ </instrument>
+ <instrument name="Alto balalaika">
+ <clef type="treble" />
+ <transpose value="0" />
+ <range class="amateur" low="52" high="67"/>
+ <range class="professional" low="52" high="67"/>
+ </instrument>
+ <instrument name="Bass balalaika">
+ <clef type="bass" />
+ <transpose value="0" />
+ <range class="amateur" low="40" high="60"/>
+ <range class="professional" low="40" high="60"/>
+ </instrument>
+ <instrument name="Contrabass balalaika">
+ <clef type="contrabass" />
+ <transpose value="0" />
+ <range class="amateur" low="28" high="48"/>
+ <range class="professional" low="28" high="48"/>
+ </instrument>
+ <instrument name="Mandolin">
+ <clef type="treble" />
+ <transpose value="0" />
+ <range class="amateur" low="55" high="85"/>
+ <range class="professional" low="55" high="85"/>
+ </instrument>
+ <instrument name="Mandola">
+ <clef type="guitar" />
+ <transpose value="0" />
+ <range class="amateur" low="43" high="83"/>
+ <range class="professional" low="43" high="83"/>
+ </instrument>
+ <instrument name="Ukulele">
+ <clef type="treble" />
+ <transpose value="0" />
+ <range class="amateur" low="60" high="93"/>
+ <range class="professional" low="60" high="93"/>
+ </instrument>
+ <instrument name="Banjo (5-string)">
+ <clef type="guitar" />
+ <transpose value="0" />
+ <range class="amateur" low="36" high="86"/>
+ <range class="professional" low="36" high="86"/>
+ </instrument>
+ <instrument name="Tenor banjo">
+ <clef type="guitar" />
+ <transpose value="0" />
+ <range class="amateur" low="36" high="83"/>
+ <range class="professional" low="36" high="83"/>
+ </instrument>
+ <instrument name="Harp (treble)">
+ <clef type="treble" />
+ <transpose value="0" />
+ <range class="amateur" low="23" high="104"/>
+ <range class="professional" low="23" high="104"/>
+ </instrument>
+ <instrument name="Harp (bass)">
+ <clef type="bass" />
+ <transpose value="0" />
+ <range class="amateur" low="23" high="104"/>
+ <range class="professional" low="23" high="104"/>
+ </instrument>
+ <instrument name="Koto">
+ <clef type="treble" />
+ <transpose value="0" />
+ <range class="amateur" low="50" high="81"/>
+ <range class="professional" low="50" high="81"/>
+ </instrument>
+ </category>
+ <category name="Flutes">
+ <instrument name="Piccolo">
+ <clef type="xylophone" />
+ <transpose value="0" />
+ <range class="amateur" low="74" high="105"/>
+ <range class="professional" low="74" high="108"/>
+ </instrument>
+ <instrument name="Eb flute">
+ <clef type="treble" />
+ <transpose value="3" />
+ <range class="amateur" low="60" high="93"/>
+ <range class="professional" low="60" high="98"/>
+ </instrument>
+ <instrument name="Flute">
+ <clef type="treble" />
+ <transpose value="0" />
+ <range class="amateur" low="60" high="93"/>
+ <range class="professional" low="59" high="98"/>
+ </instrument>
+ <instrument name="Alto flute">
+ <clef type="treble" />
+ <transpose value="-5" />
+ <range class="amateur" low="60" high="93"/>
+ <range class="professional" low="60" high="96"/>
+ </instrument>
+ <instrument name="Bass flute">
+ <clef type="guitar" />
+ <transpose value="0" />
+ <range class="amateur" low="48" high="77"/>
+ <range class="professional" low="48" high="81"/>
+ </instrument>
+ <instrument name="Contra-alto flute">
+ <clef type="treble" />
+ <transpose value="-17" />
+ <range class="amateur" low="60" high="93"/>
+ <range class="professional" low="62" high="96"/>
+ </instrument>
+ <instrument name="Contrabass flute">
+ <clef type="bass" />
+ <transpose value="0" />
+ <range class="amateur" low="36" high="65"/>
+ <range class="professional" low="36" high="69"/>
+ </instrument>
+ <instrument name="Transverse flute (D foot)">
+ <clef type="treble" />
+ <transpose value="0" />
+ <range class="amateur" low="62" high="89"/>
+ <range class="professional" low="62" high="93"/>
+ </instrument>
+ <instrument name="Transverse flute (C foot)">
+ <clef type="treble" />
+ <transpose value="0" />
+ <range class="amateur" low="62" high="89"/>
+ <range class="professional" low="60" high="93"/>
+ </instrument>
+ <instrument name="Transverse flute (B foot)">
+ <clef type="treble" />
+ <transpose value="0" />
+ <range class="amateur" low="62" high="89"/>
+ <range class="professional" low="59" high="93"/>
+ </instrument>
+ <instrument name="Alto transverse flute">
+ <clef type="treble" />
+ <transpose value="0" />
+ <range class="amateur" low="55" high="76"/>
+ <range class="professional" low="55" high="80"/>
+ </instrument>
+ <instrument name="Garklein recorder">
+ <clef type="crotale" />
+ <transpose value="0" />
+ <range class="amateur" low="84" high="105"/>
+ <range class="professional" low="84" high="108"/>
+ </instrument>
+ <instrument name="Sopranino recorder">
+ <clef type="xylophone" />
+ <transpose value="0" />
+ <range class="amateur" low="77" high="100"/>
+ <range class="professional" low="77" high="103"/>
+ </instrument>
+ <instrument name="Soprano recorder">
+ <clef type="xylophone" />
+ <transpose value="0" />
+ <range class="amateur" low="72" high="93"/>
+ <range class="professional" low="72" high="98"/>
+ </instrument>
+ <instrument name="Alto recorder">
+ <clef type="treble" />
+ <transpose value="0" />
+ <range class="amateur" low="65" high="88"/>
+ <range class="professional" low="59" high="91"/>
+ </instrument>
+ <instrument name="Tenor recorder">
+ <clef type="treble" />
+ <transpose value="0" />
+ <range class="amateur" low="60" high="81"/>
+ <range class="professional" low="60" high="86"/>
+ </instrument>
+ <instrument name="Bass recorder">
+ <clef type="old celesta" />
+ <transpose value="0" />
+ <range class="amateur" low="53" high="74"/>
+ <range class="professional" low="53" high="77"/>
+ </instrument>
+ <instrument name="Greatbass recorder">
+ <clef type="old celesta" />
+ <transpose value="0" />
+ <range class="amateur" low="48" high="69"/>
+ <range class="professional" low="57" high="98"/>
+ </instrument>
+ <instrument name="Contrabass recorder">
+ <clef type="bass" />
+ <transpose value="0" />
+ <range class="amateur" low="41" high="62"/>
+ <range class="professional" low="41" high="77"/>
+ </instrument>
+ <instrument name="G soprano ocarina">
+ <clef type="xylphone" />
+ <transpose value="0" />
+ <range class="amateur" low="79" high="93"/>
+ <range class="professional" low="79" high="95"/>
+ </instrument>
+ <instrument name="F soprano ocarina">
+ <clef type="xylophone" />
+ <transpose value="0" />
+ <range class="amateur" low="77" high="91"/>
+ <range class="professional" low="77" high="93"/>
+ </instrument>
+ <instrument name="C soprano ocarina">
+ <clef type="xylophone" />
+ <transpose value="0" />
+ <range class="amateur" low="72" high="86"/>
+ <range class="professional" low="72" high="88"/>
+ </instrument>
+ <instrument name="Bb soprano ocarina">
+ <clef type="xylophone" />
+ <transpose value="0" />
+ <range class="amateur" low="70" high="84"/>
+ <range class="professional" low="70" high="86"/>
+ </instrument>
+ <instrument name="G alto ocarina">
+ <clef type="treble" />
+ <transpose value="0" />
+ <range class="amateur" low="67" high="81"/>
+ <range class="professional" low="67" high="83"/>
+ </instrument>
+ <instrument name="F alto ocarina">
+ <clef type="treble" />
+ <transpose value="0" />
+ <range class="amateur" low="65" high="79"/>
+ <range class="professional" low="65" high="81"/>
+ </instrument>
+ <instrument name="C alto ocarina">
+ <clef type="treble" />
+ <transpose value="0" />
+ <range class="amateur" low="60" high="74"/>
+ <range class="professional" low="60" high="76"/>
+ </instrument>
+ <instrument name="Bb alto ocarina">
+ <clef type="treble" />
+ <transpose value="0" />
+ <range class="amateur" low="58" high="72"/>
+ <range class="professional" low="58" high="74"/>
+ </instrument>
+ <instrument name="C bass ocarina">
+ <clef type="bass" />
+ <transpose value="0" />
+ <range class="amateur" low="48" high="62"/>
+ <range class="professional" low="48" high="64"/>
+ </instrument>
+ <instrument name="Slide whistle">
+ <clef type="xylophone" />
+ <transpose value="0" />
+ <range class="amateur" low="69" high="96"/>
+ <range class="professional" low="69" high="96"/>
+ </instrument>
+ <instrument name="Pan flute">
+ <clef type="treble" />
+ <transpose value="0" />
+ <range class="amateur" low="55" high="91"/>
+ <range class="professional" low="55" high="91"/>
+ </instrument>
+ <instrument name="Shakuhachi">
+ <clef type="treble" />
+ <transpose value="0" />
+ <range class="amateur" low="62" high="86"/>
+ <range class="professional" low="62" high="86"/>
+ </instrument>
+ </category>
+ <category name="Double reeds">
+ <instrument name="Piccolo oboe in F">
+ <clef type="treble" />
+ <transpose value="5" />
+ <range class="amateur" low="58" high="86"/>
+ <range class="professional" low="58" high="92"/>
+ </instrument>
+ <instrument name="Piccolo oboe in Eb">
+ <clef type="treble" />
+ <transpose value="3" />
+ <range class="amateur" low="58" high="86"/>
+ <range class="professional" low="58" high="92"/>
+ </instrument>
+ <instrument name="Oboe">
+ <clef type="treble" />
+ <transpose value="0" />
+ <range class="amateur" low="58" high="87"/>
+ <range class="professional" low="58" high="93"/>
+ </instrument>
+ <instrument name="Oboe d'amore">
+ <clef type="treble" />
+ <transpose value="-3" />
+ <range class="amateur" low="59" high="87"/>
+ <range class="professional" low="59" high="90"/>
+ </instrument>
+ <instrument name="English horn">
+ <clef type="treble" />
+ <transpose value="-7" />
+ <range class="amateur" low="59" high="88"/>
+ <range class="professional" low="59" high="90"/>
+ </instrument>
+ <instrument name="Baritone oboe">
+ <clef type="guitar" />
+ <transpose value="0" />
+ <range class="amateur" low="47" high="76"/>
+ <range class="professional" low="47" high="78"/>
+ </instrument>
+ <instrument name="Heckelphone">
+ <clef type="guitar" />
+ <transpose value="0" />
+ <range class="amateur" low="45" high="75"/>
+ <range class="professional" low="45" high="78"/>
+ </instrument>
+ <instrument name="Baroque oboe">
+ <clef type="treble" />
+ <transpose value="0" />
+ <range class="amateur" low="60" high="83"/>
+ <range class="professional" low="60" high="86"/>
+ </instrument>
+ <instrument name="Oboe da caccia">
+ <clef type="treble" />
+ <transpose value="-7" />
+ <range class="amateur" low="60" high="86"/>
+ <range class="professional" low="60" high="88"/>
+ </instrument>
+ <instrument name="Shawm">
+ <clef type="treble" />
+ <transpose value="0" />
+ <range class="amateur" low="60" high="76"/>
+ <range class="professional" low="60" high="79"/>
+ </instrument>
+ <instrument name="Sopranino shawm">
+ <clef type="treble" />
+ <transpose value="0" />
+ <range class="amateur" low="65" high="81"/>
+ <range class="professional" low="65" high="86"/>
+ </instrument>
+ <instrument name="Descant pommer">
+ <clef type="treble" />
+ <transpose value="0" />
+ <range class="amateur" low="60" high="95"/>
+ <range class="professional" low="60" high="86"/>
+ </instrument>
+ <instrument name="Alto pommer">
+ <clef type="treble" />
+ <transpose value="0" />
+ <range class="amateur" low="53" high="74"/>
+ <range class="professional" low="53" high="77"/>
+ </instrument>
+ <instrument name="Soprano crumhorn">
+ <clef type="treble" />
+ <transpose value="0" />
+ <range class="amateur" low="60" high="74"/>
+ <range class="professional" low="60" high="77"/>
+ </instrument>
+ <instrument name="Alto crumhorn">
+ <clef type="treble" />
+ <transpose value="0" />
+ <range class="amateur" low="53" high="67"/>
+ <range class="professional" low="53" high="70"/>
+ </instrument>
+ <instrument name="Tenor crumhorn">
+ <clef type="guitar" />
+ <transpose value="0" />
+ <range class="amateur" low="48" high="62"/>
+ <range class="professional" low="48" high="65"/>
+ </instrument>
+ <instrument name="Bass crumhorn">
+ <clef type="bass" />
+ <transpose value="0" />
+ <range class="amateur" low="41" high="55"/>
+ <range class="professional" low="41" high="58"/>
+ </instrument>
+ <instrument name="Greatbass crumhorn">
+ <clef type="bass" />
+ <transpose value="0" />
+ <range class="amateur" low="36" high="50"/>
+ <range class="professional" low="36" high="53"/>
+ </instrument>
+ <instrument name="Soprano cornamuse">
+ <clef type="treble" />
+ <transpose value="0" />
+ <range class="amateur" low="60" high="74"/>
+ <range class="professional" low="60" high="77"/>
+ </instrument>
+ <instrument name="Alto cornamuse">
+ <clef type="treble" />
+ <transpose value="0" />
+ <range class="amateur" low="53" high="67"/>
+ <range class="professional" low="53" high="70"/>
+ </instrument>
+ <instrument name="Tenor cornamuse">
+ <clef type="guitar" />
+ <transpose value="0" />
+ <range class="amateur" low="48" high="62"/>
+ <range class="professional" low="48" high="65"/>
+ </instrument>
+ <instrument name="Bass cornamuse">
+ <clef type="bass" />
+ <transpose value="0" />
+ <range class="amateur" low="41" high="55"/>
+ <range class="professional" low="41" high="58"/>
+ </instrument>
+ <instrument name="Sopranino rauschpfeife">
+ <clef type="treble" />
+ <transpose value="0" />
+ <range class="amateur" low="65" high="81"/>
+ <range class="professional" low="65" high="84"/>
+ </instrument>
+ <instrument name="Soprano rauschpfeife">
+ <clef type="treble" />
+ <transpose value="0" />
+ <range class="amateur" low="60" high="76"/>
+ <range class="professional" low="60" high="79"/>
+ </instrument>
+ <instrument name="Bassoon">
+ <clef type="bass" />
+ <transpose value="0" />
+ <range class="amateur" low="34" high="69"/>
+ <range class="professional" low="34" high="76"/>
+ </instrument>
+ <instrument name="Contrabassoon">
+ <clef type="contrabass" />
+ <transpose value="0" />
+ <range class="amateur" low="22" high="57"/>
+ <range class="professional" low="21" high="60"/>
+ </instrument>
+ <instrument name="Dulcian">
+ <clef type="bass" />
+ <transpose value="0" />
+ <range class="amateur" low="40" high="62"/>
+ <range class="professional" low="40" high="65"/>
+ </instrument>
+ <instrument name="Rackett">
+ <clef type="bass" />
+ <transpose value="0" />
+ <range class="amateur" low="34" high="62"/>
+ <range class="professional" low="34" high="65"/>
+ </instrument>
+ <instrument name="Sopranino sarrusophone">
+ <clef type="treble" />
+ <transpose value="3" />
+ <range class="amateur" low="58" high="84"/>
+ <range class="professional" low="58" high="87"/>
+ </instrument>
+ <instrument name="Soprano sarrusophone">
+ <clef type="treble" />
+ <transpose value="-2" />
+ <range class="amateur" low="58" high="89"/>
+ <range class="professional" low="58" high="94"/>
+ </instrument>
+ <instrument name="Alto sarrusophone">
+ <clef type="treble" />
+ <transpose value="-9" />
+ <range class="amateur" low="58" high="89"/>
+ <range class="professional" low="58" high="94"/>
+ </instrument>
+ <instrument name="Tenor sarrusophone">
+ <clef type="treble" />
+ <transpose value="-14" />
+ <range class="amateur" low="58" high="89"/>
+ <range class="professional" low="58" high="94"/>
+ </instrument>
+ <instrument name="Baritone sarrusophone">
+ <clef type="treble" />
+ <transpose value="-21" />
+ <range class="amateur" low="58" high="89"/>
+ <range class="professional" low="57" high="94"/>
+ </instrument>
+ <instrument name="Bass sarrusophone">
+ <clef type="treble" />
+ <transpose value="-26" />
+ <range class="amateur" low="58" high="89"/>
+ <range class="professional" low="58" high="94"/>
+ </instrument>
+ <instrument name="Contrabass sarrusophone">
+ <clef type="treble" />
+ <transpose value="-33" />
+ <range class="amateur" low="58" high="86"/>
+ <range class="professional" low="58" high="89"/>
+ </instrument>
+ <instrument name="Bagpipe">
+ <clef type="treble" />
+ <transpose value="0" />
+ <range class="amateur" low="60" high="79"/>
+ <range class="professional" low="60" high="79"/>
+ </instrument>
+ </category>
+ <category name="Single reeds">
+ <instrument name="Soprano clarinet">
+ <clef type="treble" />
+ <transpose value="7" />
+ <range class="amateur" low="52" high="81"/>
+ <range class="professional" low="52" high="81"/>
+ </instrument>
+ <instrument name="Eb clarinet">
+ <clef type="treble" />
+ <transpose value="3" />
+ <range class="amateur" low="52" high="91"/>
+ <range class="professional" low="52" high="96"/>
+ </instrument>
+ <instrument name="D clarinet">
+ <clef type="treble" />
+ <transpose value="2" />
+ <range class="amateur" low="52" high="91"/>
+ <range class="professional" low="52" high="96"/>
+ </instrument>
+ <instrument name="C clarinet">
+ <clef type="treble" />
+ <transpose value="0" />
+ <range class="amateur" low="52" high="91"/>
+ <range class="professional" low="52" high="96"/>
+ </instrument>
+ <instrument name="Bb clarinet">
+ <clef type="treble" />
+ <transpose value="-2" />
+ <range class="amateur" low="52" high="91"/>
+ <range class="professional" low="52" high="96"/>
+ </instrument>
+ <instrument name="A clarinet">
+ <clef type="treble" />
+ <transpose value="-3" />
+ <range class="amateur" low="52" high="91"/>
+ <range class="professional" low="52" high="96"/>
+ </instrument>
+ <instrument name="Alto clarinet">
+ <clef type="treble" />
+ <transpose value="-9" />
+ <range class="amateur" low="52" high="89"/>
+ <range class="professional" low="52" high="93"/>
+ </instrument>
+ <instrument name="Bassett horn">
+ <clef type="treble" />
+ <transpose value="-7" />
+ <range class="amateur" low="48" high="91"/>
+ <range class="professional" low="48" high="93"/>
+ </instrument>
+ <instrument name="Bass clarinet">
+ <clef type="treble" />
+ <transpose value="-14" />
+ <range class="amateur" low="51" high="89"/>
+ <range class="professional" low="51" high="93"/>
+ </instrument>
+ <instrument name="Contra-alto clarinet">
+ <clef type="treble" />
+ <transpose value="-21" />
+ <range class="amateur" low="52" high="91"/>
+ <range class="professional" low="52" high="96"/>
+ </instrument>
+ <instrument name="Contrabass clarinet">
+ <clef type="treble" />
+ <transpose value="-26" />
+ <range class="amateur" low="52" high="91"/>
+ <range class="professional" low="52" high="96"/>
+ </instrument>
+ <instrument name="Sopranino chalumeau">
+ <clef type="treble" />
+ <transpose value="0" />
+ <range class="amateur" low="65" high="79"/>
+ <range class="professional" low="65" high="82"/>
+ </instrument>
+ <instrument name="Soprano chalumeau">
+ <clef type="treble" />
+ <transpose value="0" />
+ <range class="amateur" low="60" high="74"/>
+ <range class="professional" low="60" high="77"/>
+ </instrument>
+ <instrument name="Alto chalumeau">
+ <clef type="guitar" />
+ <transpose value="0" />
+ <range class="amateur" low="53" high="67"/>
+ <range class="professional" low="53" high="70"/>
+ </instrument>
+ <instrument name="Tenor chalumeau">
+ <clef type="guitar" />
+ <transpose value="0" />
+ <range class="amateur" low="48" high="62"/>
+ <range class="professional" low="48" high="65"/>
+ </instrument>
+ <instrument name="Sopranino saxophone">
+ <clef type="treble" />
+ <transpose value="3" />
+ <range class="amateur" low="58" high="84"/>
+ <range class="professional" low="58" high="87"/>
+ </instrument>
+ <instrument name="Soprano saxophone">
+ <clef type="treble" />
+ <transpose value="-2" />
+ <range class="amateur" low="58" high="91"/>
+ <range class="professional" low="58" high="96"/>
+ </instrument>
+ <instrument name="Alto saxophone">
+ <clef type="treble" />
+ <transpose value="-9" />
+ <range class="amateur" low="58" high="91"/>
+ <range class="professional" low="58" high="96"/>
+ </instrument>
+ <instrument name="Tenor saxophone">
+ <clef type="treble" />
+ <transpose value="-14" />
+ <range class="amateur" low="58" high="91"/>
+ <range class="professional" low="58" high="96"/>
+ </instrument>
+ <instrument name="Baritone saxophone">
+ <clef type="treble" />
+ <transpose value="-21" />
+ <range class="amateur" low="58" high="91"/>
+ <range class="professional" low="57" high="96"/>
+ </instrument>
+ <instrument name="Bass saxophone">
+ <clef type="treble" />
+ <transpose value="-26" />
+ <range class="amateur" low="58" high="91"/>
+ <range class="professional" low="58" high="96"/>
+ </instrument>
+ <instrument name="Contrabass saxophone">
+ <clef type="treble" />
+ <transpose value="-33" />
+ <range class="amateur" low="58" high="86"/>
+ <range class="professional" low="58" high="89"/>
+ </instrument>
+ </category>
+ <category name="Wind electrophones">
+ <instrument name="Wind synthesizer">
+ <clef type="treble" />
+ <transpose value="0" />
+ <range class="amateur" low="0" high="127"/>
+ <range class="professional" low="0" high="127"/>
+ </instrument>
+ </category>
+ <category name="Brass">
+ <instrument name="Piccolo trumpet in Bb">
+ <clef type="treble" />
+ <transpose value="10" />
+ <range class="amateur" low="37" high="76"/>
+ <range class="professional" low="37" high="79"/>
+ </instrument>
+ <instrument name="Piccolo trumpet in A">
+ <clef type="treble" />
+ <transpose value="9" />
+ <range class="amateur" low="37" high="76"/>
+ <range class="professional" low="37" high="79"/>
+ </instrument>
+ <instrument name="Trumpet in Eb">
+ <clef type="treble" />
+ <transpose value="3" />
+ <range class="amateur" low="54" high="81"/>
+ <range class="professional" low="54" high="84"/>
+ </instrument>
+ <instrument name="Trumpet in D">
+ <clef type="treble" />
+ <transpose value="2" />
+ <range class="amateur" low="54" high="81"/>
+ <range class="professional" low="54" high="84"/>
+ </instrument>
+ <instrument name="Trumpet in C">
+ <clef type="treble" />
+ <transpose value="0" />
+ <range class="amateur" low="54" high="81"/>
+ <range class="professional" low="54" high="84"/>
+ </instrument>
+ <instrument name="Trumpet in Bb">
+ <clef type="treble" />
+ <transpose value="-2" />
+ <range class="amateur" low="54" high="81"/>
+ <range class="professional" low="54" high="84"/>
+ </instrument>
+ <instrument name="Bass trumpet in Eb">
+ <clef type="treble" />
+ <transpose value="-9" />
+ <range class="amateur" low="54" high="81"/>
+ <range class="professional" low="54" high="84"/>
+ </instrument>
+ <instrument name="Bass trumpet in Bb">
+ <clef type="treble" />
+ <transpose value="-14" />
+ <range class="amateur" low="54" high="81"/>
+ <range class="professional" low="54" high="84"/>
+ </instrument>
+ <instrument name="Baroque trumpet in F">
+ <clef type="treble" />
+ <transpose value="5" />
+ <range class="amateur" low="60" high="81"/>
+ <range class="professional" low="60" high="88"/>
+ </instrument>
+ <instrument name="Baroque trumpet in Eb">
+ <clef type="treble" />
+ <transpose value="3" />
+ <range class="amateur" low="60" high="81"/>
+ <range class="professional" low="60" high="88"/>
+ </instrument>
+ <instrument name="Baroque trumpet in D">
+ <clef type="treble" />
+ <transpose value="2" />
+ <range class="amateur" low="60" high="81"/>
+ <range class="professional" low="60" high="88"/>
+ </instrument>
+ <instrument name="Baroque trumpet in C">
+ <clef type="treble" />
+ <transpose value="0" />
+ <range class="amateur" low="60" high="81"/>
+ <range class="professional" low="60" high="88"/>
+ </instrument>
+ <instrument name="Baroque trumpet in Bb">
+ <clef type="treble" />
+ <transpose value="-2" />
+ <range class="amateur" low="60" high="81"/>
+ <range class="professional" low="60" high="88"/>
+ </instrument>
+ <instrument name="Cornet in Eb">
+ <clef type="treble" />
+ <transpose value="3" />
+ <range class="amateur" low="54" high="81"/>
+ <range class="professional" low="54" high="84"/>
+ </instrument>
+ <instrument name="Cornet in Bb">
+ <clef type="treble" />
+ <transpose value="-2" />
+ <range class="amateur" low="54" high="81"/>
+ <range class="professional" low="54" high="84"/>
+ </instrument>
+ <instrument name="Flugelhorn">
+ <clef type="treble" />
+ <transpose value="-2" />
+ <range class="amateur" low="54" high="81"/>
+ <range class="professional" low="54" high="84"/>
+ </instrument>
+ <instrument name="Cornettino">
+ <clef type="treble" />
+ <transpose value="0" />
+ <range class="amateur" low="60" high="83"/>
+ <range class="professional" low="60" high="86"/>
+ </instrument>
+ <instrument name="Alto cornetto">
+ <clef type="treble" />
+ <transpose value="0" />
+ <range class="amateur" low="57" high="83"/>
+ <range class="professional" low="57" high="86"/>
+ </instrument>
+ <instrument name="Tenor cornetto">
+ <clef type="tenor" />
+ <transpose value="0" />
+ <range class="amateur" low="48" high="71"/>
+ <range class="professional" low="48" high="76"/>
+ </instrument>
+ <instrument name="Serpent">
+ <clef type="bass" />
+ <transpose value="0" />
+ <range class="amateur" low="36" high="65"/>
+ <range class="professional" low="36" high="69"/>
+ </instrument>
+ <instrument name="Alto ophicleide in F">
+ <clef type="treble" />
+ <transpose value="0" />
+ <range class="amateur" low="52" high="81"/>
+ <range class="professional" low="52" high="84"/>
+ </instrument>
+ <instrument name="Alto ophicleide in Eb">
+ <clef type="treble" />
+ <transpose value="0" />
+ <range class="amateur" low="51" high="79"/>
+ <range class="professional" low="51" high="82"/>
+ </instrument>
+ <instrument name="Bass ophicleide in C">
+ <clef type="bass" />
+ <transpose value="0" />
+ <range class="amateur" low="35" high="63"/>
+ <range class="professional" low="35" high="67"/>
+ </instrument>
+ <instrument name="Bass ophicleide in Bb">
+ <clef type="bass" />
+ <transpose value="0" />
+ <range class="amateur" low="33" high="62"/>
+ <range class="professional" low="33" high="66"/>
+ </instrument>
+ <instrument name="Contrabass ophicleide in Eb">
+ <clef type="bass" />
+ <transpose value="0" />
+ <range class="amateur" low="26" high="55"/>
+ <range class="professional" low="26" high="58"/>
+ </instrument>
+ <instrument name="French horn">
+ <clef type="treble" />
+ <transpose value="-7" />
+ <range class="amateur" low="42" high="82"/>
+ <range class="professional" low="38" high="84"/>
+ </instrument>
+ <instrument name="French horn in C alto">
+ <clef type="treble" />
+ <transpose value="0" />
+ <range class="amateur" low="46" high="79"/>
+ <range class="professional" low="42" high="84"/>
+ </instrument>
+ <instrument name="French horn in Bb alto">
+ <clef type="treble" />
+ <transpose value="-2" />
+ <range class="amateur" low="46" high="79"/>
+ <range class="professional" low="42" high="84"/>
+ </instrument>
+ <instrument name="French horn in A">
+ <clef type="treble" />
+ <transpose value="-3" />
+ <range class="amateur" low="46" high="79"/>
+ <range class="professional" low="42" high="84"/>
+ </instrument>
+ <instrument name="French horn in Ab">
+ <clef type="treble" />
+ <transpose value="-4" />
+ <range class="amateur" low="46" high="79"/>
+ <range class="professional" low="42" high="84"/>
+ </instrument>
+ <instrument name="French horn in G">
+ <clef type="treble" />
+ <transpose value="-5" />
+ <range class="amateur" low="46" high="79"/>
+ <range class="professional" low="42" high="84"/>
+ </instrument>
+ <instrument name="French horn in E">
+ <clef type="treble" />
+ <transpose value="-8" />
+ <range class="amateur" low="46" high="79"/>
+ <range class="professional" low="42" high="84"/>
+ </instrument>
+ <instrument name="French horn in Eb">
+ <clef type="treble" />
+ <transpose value="-9" />
+ <range class="amateur" low="46" high="79"/>
+ <range class="professional" low="42" high="84"/>
+ </instrument>
+ <instrument name="French horn in D">
+ <clef type="treble" />
+ <transpose value="-10" />
+ <range class="amateur" low="46" high="79"/>
+ <range class="professional" low="42" high="84"/>
+ </instrument>
+ <instrument name="French horn in C basso">
+ <clef type="treble" />
+ <transpose value="-12" />
+ <range class="amateur" low="46" high="79"/>
+ <range class="professional" low="42" high="84"/>
+ </instrument>
+ <instrument name="French horn in Bb basso">
+ <clef type="treble" />
+ <transpose value="-14" />
+ <range class="amateur" low="46" high="79"/>
+ <range class="professional" low="42" high="84"/>
+ </instrument>
+ <instrument name="Alto horn in F">
+ <clef type="treble" />
+ <transpose value="-7" />
+ <range class="amateur" low="54" high="81"/>
+ <range class="professional" low="54" high="84"/>
+ </instrument>
+ <instrument name="Alto horn in Eb">
+ <clef type="treble" />
+ <transpose value="-9" />
+ <range class="amateur" low="54" high="81"/>
+ <range class="professional" low="54" high="84"/>
+ </instrument>
+ <instrument name="Baritone horn">
+ <clef type="bass" />
+ <transpose value="0" />
+ <range class="amateur" low="40" high="67"/>
+ <range class="professional" low="40" high="70"/>
+ </instrument>
+ <instrument name="Mellophone in F">
+ <clef type="treble" />
+ <transpose value="-7" />
+ <range class="amateur" low="54" high="81"/>
+ <range class="professional" low="54" high="84"/>
+ </instrument>
+ <instrument name="Mellophone in Eb">
+ <clef type="treble" />
+ <transpose value="-9" />
+ <range class="amateur" low="54" high="81"/>
+ <range class="professional" low="54" high="84"/>
+ </instrument>
+ <instrument name="Mellophonium in F">
+ <clef type="treble" />
+ <transpose value="-7" />
+ <range class="amateur" low="54" high="81"/>
+ <range class="professional" low="54" high="84"/>
+ </instrument>
+ <instrument name="Mellophonium in Eb">
+ <clef type="treble" />
+ <transpose value="-9" />
+ <range class="amateur" low="54" high="81"/>
+ <range class="professional" low="54" high="84"/>
+ </instrument>
+ <instrument name="Wagner tuba in Bb">
+ <clef type="treble" />
+ <transpose value="-2" />
+ <range class="amateur" low="42" high="77"/>
+ <range class="professional" low="42" high="81"/>
+ </instrument>
+ <instrument name="Wagner tuba in F">
+ <clef type="treble" />
+ <transpose value="-7" />
+ <range class="amateur" low="42" high="81"/>
+ <range class="professional" low="42" high="84"/>
+ </instrument>
+ <instrument name="Soprano trombone">
+ <clef type="treble" />
+ <transpose value="0" />
+ <range class="amateur" low="52" high="77"/>
+ <range class="professional" low="52" high="81"/>
+ </instrument>
+ <instrument name="Alto trombone">
+ <clef type="alto" />
+ <transpose value="0" />
+ <range class="amateur" low="45" high="74"/>
+ <range class="professional" low="45" high="77"/>
+ </instrument>
+ <instrument name="Tenor trombone">
+ <clef type="bass" />
+ <transpose value="0" />
+ <range class="amateur" low="40" high="70"/>
+ <range class="professional" low="40" high="74"/>
+ </instrument>
+ <instrument name="Bass trombone">
+ <clef type="bass" />
+ <transpose value="0" />
+ <range class="amateur" low="36" high="70"/>
+ <range class="professional" low="36" high="74"/>
+ </instrument>
+ <instrument name="Contrabass trombone">
+ <clef type="bass" />
+ <transpose value="0" />
+ <range class="amateur" low="28" high="55"/>
+ <range class="professional" low="28" high="58"/>
+ </instrument>
+ <instrument name="Euphonium">
+ <clef type="bass" />
+ <transpose value="0" />
+ <range class="amateur" low="40" high="70"/>
+ <range class="professional" low="40" high="74"/>
+ </instrument>
+ <instrument name="F tuba">
+ <clef type="bass" />
+ <transpose value="0" />
+ <range class="amateur" low="26" high="64"/>
+ <range class="professional" low="24" high="69"/>
+ </instrument>
+ <instrument name="C tuba">
+ <clef type="bass" />
+ <transpose value="0" />
+ <range class="amateur" low="26" high="60"/>
+ <range class="professional" low="24" high="65"/>
+ </instrument>
+ <instrument name="Bb tuba">
+ <clef type="bass" />
+ <transpose value="0" />
+ <range class="amateur" low="28" high="58"/>
+ <range class="professional" low="22" high="63"/>
+ </instrument>
+ </category>
+ <category name="Pitched Percussion">
+ <instrument name="Timpani">
+ <clef type="bass" />
+ <transpose value="0" />
+ <range class="amateur" low="38" high="60"/>
+ <range class="professional" low="38" high="60"/>
+ </instrument>
+ <instrument name="Roto-toms (treble)">
+ <clef type="treble" />
+ <transpose value="0" />
+ <range class="amateur" low="55" high="76"/>
+ <range class="professional" low="55" high="76"/>
+ </instrument>
+ <instrument name="Roto-toms (bass)">
+ <clef type="bass" />
+ <transpose value="0" />
+ <range class="amateur" low="40" high="59"/>
+ <range class="professional" low="40" high="59"/>
+ </instrument>
+ <instrument name="Glockenspiel">
+ <clef type="crotale" />
+ <transpose value="0" />
+ <range class="amateur" low="79" high="108"/>
+ <range class="professional" low="79" high="108"/>
+ </instrument>
+ <instrument name="Orff soprano glockenspiel">
+ <clef type="crotale" />
+ <transpose value="0" />
+ <range class="amateur" low="84" high="105"/>
+ <range class="professional" low="84" high="105"/>
+ </instrument>
+ <instrument name="Orff alto glockenspiel">
+ <clef type="xylophone" />
+ <transpose value="0" />
+ <range class="amateur" low="72" high="93"/>
+ <range class="professional" low="72" high="93"/>
+ </instrument>
+ <instrument name="Crotales">
+ <clef type="crotale" />
+ <transpose value="0" />
+ <range class="amateur" low="84" high="108"/>
+ <range class="professional" low="84" high="108"/>
+ </instrument>
+ <instrument name="Tubaphone">
+ <clef type="crotale" />
+ <transpose value="0" />
+ <range class="amateur" low="84" high="108"/>
+ <range class="professional" low="84" high="108"/>
+ </instrument>
+ <instrument name="Almglocken (treble)">
+ <clef type="crotale" />
+ <transpose value="0" />
+ <range class="amateur" low="60" high="105"/>
+ <range class="professional" low="60" high="105"/>
+ </instrument>
+ <instrument name="Almglocken (bass)">
+ <clef type="modern celesta" />
+ <transpose value="0" />
+ <range class="amateur" low="60" high="105"/>
+ <range class="professional" low="60" high="105"/>
+ </instrument>
+ <instrument name="Vibraphone">
+ <clef type="treble" />
+ <transpose value="0" />
+ <range class="amateur" low="53" high="89"/>
+ <range class="professional" low="48" high="96"/>
+ </instrument>
+ <instrument name="Orff soprano metallophone">
+ <clef type="xylophone" />
+ <transpose value="0" />
+ <range class="amateur" low="72" high="93"/>
+ <range class="professional" low="72" high="93"/>
+ </instrument>
+ <instrument name="Orff alto metallophone">
+ <clef type="treble" />
+ <transpose value="0" />
+ <range class="amateur" low="60" high="81"/>
+ <range class="professional" low="60" high="81"/>
+ </instrument>
+ <instrument name="Orff bass metallophone">
+ <clef type="guitar" />
+ <transpose value="0" />
+ <range class="amateur" low="48" high="69"/>
+ <range class="professional" low="48" high="69"/>
+ </instrument>
+ <instrument name="Tubular chimes">
+ <clef type="treble" />
+ <transpose value="0" />
+ <range class="amateur" low="60" high="79"/>
+ <range class="professional" low="60" high="79"/>
+ </instrument>
+ <instrument name="Bass steel drums">
+ <clef type="bass" />
+ <transpose value="0" />
+ <range class="amateur" low="36" high="53"/>
+ <range class="professional" low="36" high="53"/>
+ </instrument>
+ <instrument name="Cello steel drums">
+ <clef type="tenor" />
+ <transpose value="0" />
+ <range class="amateur" low="47" high="67"/>
+ <range class="professional" low="47" high="67"/>
+ </instrument>
+ <instrument name="Tenor steel drums">
+ <clef type="alto" />
+ <transpose value="0" />
+ <range class="amateur" low="52" high="69"/>
+ <range class="professional" low="52" high="69"/>
+ </instrument>
+ <instrument name="Guitar steel drums">
+ <clef type="treble" />
+ <transpose value="0" />
+ <range class="amateur" low="54" high="81"/>
+ <range class="professional" low="54" high="81"/>
+ </instrument>
+ <instrument name="Alto steel drums">
+ <clef type="treble" />
+ <transpose value="0" />
+ <range class="amateur" low="56" high="85"/>
+ <range class="professional" low="56" high="85"/>
+ </instrument>
+ <instrument name="Soprano steel drums">
+ <clef type="treble" />
+ <transpose value="0" />
+ <range class="amateur" low="60" high="88"/>
+ <range class="professional" low="60" high="88"/>
+ </instrument>
+ <instrument name="Hand bells (treble)">
+ <clef type="treble" />
+ <transpose value="0" />
+ <range class="amateur" low="36" high="96"/>
+ <range class="professional" low="36" high="96"/>
+ </instrument>
+ <instrument name="Hand bells (bass)">
+ <clef type="bass" />
+ <transpose value="0" />
+ <range class="amateur" low="36" high="96"/>
+ <range class="professional" low="36" high="96"/>
+ </instrument>
+ <instrument name="Tuned gongs">
+ <clef type="bass" />
+ <transpose value="0" />
+ <range class="amateur" low="45" high="57"/>
+ <range class="professional" low="45" high="57"/>
+ </instrument>
+ <instrument name="Flexatone">
+ <clef type="xylophone" />
+ <transpose value="0" />
+ <range class="amateur" low="76" high="93"/>
+ <range class="professional" low="76" high="93"/>
+ </instrument>
+ <instrument name="Musical saw">
+ <clef type="treble" />
+ <transpose value="0" />
+ <range class="amateur" low="64" high="100"/>
+ <range class="professional" low="64" high="100"/>
+ </instrument>
+ <instrument name="Musical glasses">
+ <clef type="xylophone" />
+ <transpose value="0" />
+ <range class="amateur" low="72" high="91"/>
+ <range class="professional" low="72" high="91"/>
+ </instrument>
+ <instrument name="Glass harmonica">
+ <clef type="treble" />
+ <transpose value="0" />
+ <range class="amateur" low="53" high="89"/>
+ <range class="professional" low="53" high="89"/>
+ </instrument>
+ <instrument name="Xylophone">
+ <clef type="xylophone" />
+ <transpose value="0" />
+ <range class="amateur" low="65" high="108"/>
+ <range class="professional" low="65" high="108"/>
+ </instrument>
+ <instrument name="Orff soprano xylophone">
+ <clef type="xylophone" />
+ <transpose value="0" />
+ <range class="amateur" low="72" high="93"/>
+ <range class="professional" low="72" high="93"/>
+ </instrument>
+ <instrument name="Orff alto xylophone">
+ <clef type="treble" />
+ <transpose value="0" />
+ <range class="amateur" low="60" high="81"/>
+ <range class="professional" low="60" high="81"/>
+ </instrument>
+ <instrument name="Orff bass xylophone">
+ <clef type="guitar" />
+ <transpose value="0" />
+ <range class="amateur" low="48" high="69"/>
+ <range class="professional" low="48" high="69"/>
+ </instrument>
+ <instrument name="Marimba (treble)">
+ <clef type="treble" />
+ <transpose value="0" />
+ <range class="amateur" low="45" high="96"/>
+ <range class="professional" low="45" high="96"/>
+ </instrument>
+ <instrument name="Marimba (bass)">
+ <clef type="bass" />
+ <transpose value="0" />
+ <range class="amateur" low="45" high="96"/>
+ <range class="professional" low="45" high="96"/>
+ </instrument>
+ <instrument name="Dulcimer (treble)">
+ <clef type="treble" />
+ <transpose value="0" />
+ <range class="amateur" low="48" high="86"/>
+ <range class="professional" low="43" high="88"/>
+ </instrument>
+ <instrument name="Dulcimer (bass)">
+ <clef type="bass" />
+ <transpose value="0" />
+ <range class="amateur" low="48" high="86"/>
+ <range class="professional" low="43" high="88"/>
+ </instrument>
+ <instrument name="Mallet synthesizer (treble)">
+ <clef type="treble" />
+ <transpose value="0" />
+ <range class="amateur" low="0 " high="127 "/>
+ <range class="professional" low="0 " high="127 "/>
+ </instrument>
+ <instrument name="Mallet synthesizer (bass)">
+ <clef type="bass" />
+ <transpose value="0" />
+ <range class="amateur" low="0 " high="127 "/>
+ <range class="professional" low="0 " high="127 "/>
+ </instrument>
+ </category>
+ <category name="Unpitched Percussion">
+ <instrument name="Snare drum">
+ <clef type="two-bar" />
+ <transpose value="0" />
+ <range class="amateur" low="0" high="127"/>
+ <range class="professional" low="0" high="127"/>
+ </instrument>
+ <instrument name="Piccolo snare drum">
+ <clef type="two-bar" />
+ <transpose value="0" />
+ <range class="amateur" low="0" high="127"/>
+ <range class="professional" low="0" high="127"/>
+ </instrument>
+ <instrument name="Military drum">
+ <clef type="two-bar" />
+ <transpose value="0" />
+ <range class="amateur" low="0" high="127"/>
+ <range class="professional" low="0" high="127"/>
+ </instrument>
+ <instrument name="Tom-toms">
+ <clef type="two-bar" />
+ <transpose value="0" />
+ <range class="amateur" low="0" high="127"/>
+ <range class="professional" low="0" high="127"/>
+ </instrument>
+ <instrument name="Chinese tom-toms">
+ <clef type="two-bar" />
+ <transpose value="0" />
+ <range class="amateur" low="0" high="127"/>
+ <range class="professional" low="0" high="127"/>
+ </instrument>
+ <instrument name="Bongos">
+ <clef type="two-bar" />
+ <transpose value="0" />
+ <range class="amateur" low="0" high="127"/>
+ <range class="professional" low="0" high="127"/>
+ </instrument>
+ <instrument name="Congas">
+ <clef type="two-bar" />
+ <transpose value="0" />
+ <range class="amateur" low="0" high="127"/>
+ <range class="professional" low="0" high="127"/>
+ </instrument>
+ <instrument name="Timbales">
+ <clef type="two-bar" />
+ <transpose value="0" />
+ <range class="amateur" low="0" high="127"/>
+ <range class="professional" low="0" high="127"/>
+ </instrument>
+ <instrument name="Bass drum">
+ <clef type="two-bar" />
+ <transpose value="0" />
+ <range class="amateur" low="0" high="127"/>
+ <range class="professional" low="0" high="127"/>
+ </instrument>
+ <instrument name="Tambourine">
+ <clef type="two-bar" />
+ <transpose value="0" />
+ <range class="amateur" low="0" high="127"/>
+ <range class="professional" low="0" high="127"/>
+ </instrument>
+ <instrument name="Frame drum">
+ <clef type="two-bar" />
+ <transpose value="0" />
+ <range class="amateur" low="0" high="127"/>
+ <range class="professional" low="0" high="127"/>
+ </instrument>
+ <instrument name="Tablas">
+ <clef type="two-bar" />
+ <transpose value="0" />
+ <range class="amateur" low="0" high="127"/>
+ <range class="professional" low="0" high="127"/>
+ </instrument>
+ <instrument name="Cu�ca">
+ <clef type="two-bar" />
+ <transpose value="0" />
+ <range class="amateur" low="0" high="127"/>
+ <range class="professional" low="0" high="127"/>
+ </instrument>
+ <instrument name="Finger cymbals">
+ <clef type="two-bar" />
+ <transpose value="0" />
+ <range class="amateur" low="0" high="127"/>
+ <range class="professional" low="0" high="127"/>
+ </instrument>
+ <instrument name="Cymbals">
+ <clef type="two-bar" />
+ <transpose value="0" />
+ <range class="amateur" low="0" high="127"/>
+ <range class="professional" low="0" high="127"/>
+ </instrument>
+ <instrument name="Hi-hat cymbals">
+ <clef type="two-bar" />
+ <transpose value="0" />
+ <range class="amateur" low="0" high="127"/>
+ <range class="professional" low="0" high="127"/>
+ </instrument>
+ <instrument name="Suspended cymbal">
+ <clef type="two-bar" />
+ <transpose value="0" />
+ <range class="amateur" low="0" high="127"/>
+ <range class="professional" low="0" high="127"/>
+ </instrument>
+ <instrument name="Ride cymbal">
+ <clef type="two-bar" />
+ <transpose value="0" />
+ <range class="amateur" low="0" high="127"/>
+ <range class="professional" low="0" high="127"/>
+ </instrument>
+ <instrument name="Sizzle cymbal">
+ <clef type="two-bar" />
+ <transpose value="0" />
+ <range class="amateur" low="0" high="127"/>
+ <range class="professional" low="0" high="127"/>
+ </instrument>
+ <instrument name="Crash cymbal">
+ <clef type="two-bar" />
+ <transpose value="0" />
+ <range class="amateur" low="0" high="127"/>
+ <range class="professional" low="0" high="127"/>
+ </instrument>
+ <instrument name="Splash cymbal">
+ <clef type="two-bar" />
+ <transpose value="0" />
+ <range class="amateur" low="0" high="127"/>
+ <range class="professional" low="0" high="127"/>
+ </instrument>
+ <instrument name="Chinese cymbal">
+ <clef type="two-bar" />
+ <transpose value="0" />
+ <range class="amateur" low="0" high="127"/>
+ <range class="professional" low="0" high="127"/>
+ </instrument>
+ <instrument name="Triangle">
+ <clef type="two-bar" />
+ <transpose value="0" />
+ <range class="amateur" low="0" high="127"/>
+ <range class="professional" low="0" high="127"/>
+ </instrument>
+ <instrument name="Cowbells">
+ <clef type="two-bar" />
+ <transpose value="0" />
+ <range class="amateur" low="0" high="127"/>
+ <range class="professional" low="0" high="127"/>
+ </instrument>
+ <instrument name="Tam-tam">
+ <clef type="two-bar" />
+ <transpose value="0" />
+ <range class="amateur" low="0" high="127"/>
+ <range class="professional" low="0" high="127"/>
+ </instrument>
+ <instrument name="Bells">
+ <clef type="two-bar" />
+ <transpose value="0" />
+ <range class="amateur" low="0" high="127"/>
+ <range class="professional" low="0" high="127"/>
+ </instrument>
+ <instrument name="Sleighbells">
+ <clef type="two-bar" />
+ <transpose value="0" />
+ <range class="amateur" low="0" high="127"/>
+ <range class="professional" low="0" high="127"/>
+ </instrument>
+ <instrument name="Bell plate">
+ <clef type="two-bar" />
+ <transpose value="0" />
+ <range class="amateur" low="0" high="127"/>
+ <range class="professional" low="0" high="127"/>
+ </instrument>
+ <instrument name="Bowl gongs">
+ <clef type="two-bar" />
+ <transpose value="0" />
+ <range class="amateur" low="0" high="127"/>
+ <range class="professional" low="0" high="127"/>
+ </instrument>
+ <instrument name="Tubo">
+ <clef type="two-bar" />
+ <transpose value="0" />
+ <range class="amateur" low="0" high="127"/>
+ <range class="professional" low="0" high="127"/>
+ </instrument>
+ <instrument name="Metal castanets">
+ <clef type="two-bar" />
+ <transpose value="0" />
+ <range class="amateur" low="0" high="127"/>
+ <range class="professional" low="0" high="127"/>
+ </instrument>
+ <instrument name="Automobile brake drums">
+ <clef type="two-bar" />
+ <transpose value="0" />
+ <range class="amateur" low="0" high="127"/>
+ <range class="professional" low="0" high="127"/>
+ </instrument>
+ <instrument name="Iron pipes">
+ <clef type="two-bar" />
+ <transpose value="0" />
+ <range class="amateur" low="0" high="127"/>
+ <range class="professional" low="0" high="127"/>
+ </instrument>
+ <instrument name="Chaines">
+ <clef type="two-bar" />
+ <transpose value="0" />
+ <range class="amateur" low="0" high="127"/>
+ <range class="professional" low="0" high="127"/>
+ </instrument>
+ <instrument name="Anvil">
+ <clef type="two-bar" />
+ <transpose value="0" />
+ <range class="amateur" low="0" high="127"/>
+ <range class="professional" low="0" high="127"/>
+ </instrument>
+ <instrument name="Woodblocks">
+ <clef type="two-bar" />
+ <transpose value="0" />
+ <range class="amateur" low="0" high="127"/>
+ <range class="professional" low="0" high="127"/>
+ </instrument>
+ <instrument name="Temple blocks">
+ <clef type="two-bar" />
+ <transpose value="0" />
+ <range class="amateur" low="0" high="127"/>
+ <range class="professional" low="0" high="127"/>
+ </instrument>
+ <instrument name="Claves">
+ <clef type="two-bar" />
+ <transpose value="0" />
+ <range class="amateur" low="0" high="127"/>
+ <range class="professional" low="0" high="127"/>
+ </instrument>
+ <instrument name="Castanets">
+ <clef type="two-bar" />
+ <transpose value="0" />
+ <range class="amateur" low="0" high="127"/>
+ <range class="professional" low="0" high="127"/>
+ </instrument>
+ <instrument name="Guiro">
+ <clef type="two-bar" />
+ <transpose value="0" />
+ <range class="amateur" low="0" high="127"/>
+ <range class="professional" low="0" high="127"/>
+ </instrument>
+ <instrument name="Maracas">
+ <clef type="two-bar" />
+ <transpose value="0" />
+ <range class="amateur" low="0" high="127"/>
+ <range class="professional" low="0" high="127"/>
+ </instrument>
+ <instrument name="Cabasa">
+ <clef type="two-bar" />
+ <transpose value="0" />
+ <range class="amateur" low="0" high="127"/>
+ <range class="professional" low="0" high="127"/>
+ </instrument>
+ <instrument name="Quijada">
+ <clef type="two-bar" />
+ <transpose value="0" />
+ <range class="amateur" low="0" high="127"/>
+ <range class="professional" low="0" high="127"/>
+ </instrument>
+ <instrument name="Vibra slap">
+ <clef type="two-bar" />
+ <transpose value="0" />
+ <range class="amateur" low="0" high="127"/>
+ <range class="professional" low="0" high="127"/>
+ </instrument>
+ <instrument name="Slit drum">
+ <clef type="two-bar" />
+ <transpose value="0" />
+ <range class="amateur" low="0" high="127"/>
+ <range class="professional" low="0" high="127"/>
+ </instrument>
+ <instrument name="Whip">
+ <clef type="two-bar" />
+ <transpose value="0" />
+ <range class="amateur" low="0" high="127"/>
+ <range class="professional" low="0" high="127"/>
+ </instrument>
+ <instrument name="Ratchet">
+ <clef type="two-bar" />
+ <transpose value="0" />
+ <range class="amateur" low="0" high="127"/>
+ <range class="professional" low="0" high="127"/>
+ </instrument>
+ <instrument name="Thundersheet">
+ <clef type="two-bar" />
+ <transpose value="0" />
+ <range class="amateur" low="0" high="127"/>
+ <range class="professional" low="0" high="127"/>
+ </instrument>
+ <instrument name="Sandpaper blocks">
+ <clef type="two-bar" />
+ <transpose value="0" />
+ <range class="amateur" low="0" high="127"/>
+ <range class="professional" low="0" high="127"/>
+ </instrument>
+ <instrument name="Wooden wind chimes">
+ <clef type="two-bar" />
+ <transpose value="0" />
+ <range class="amateur" low="0" high="127"/>
+ <range class="professional" low="0" high="127"/>
+ </instrument>
+ <instrument name="Bamboo wind chimes">
+ <clef type="two-bar" />
+ <transpose value="0" />
+ <range class="amateur" low="0" high="127"/>
+ <range class="professional" low="0" high="127"/>
+ </instrument>
+ <instrument name="Metal wind chimes">
+ <clef type="two-bar" />
+ <transpose value="0" />
+ <range class="amateur" low="0" high="127"/>
+ <range class="professional" low="0" high="127"/>
+ </instrument>
+ <instrument name="Glass wind chimes">
+ <clef type="two-bar" />
+ <transpose value="0" />
+ <range class="amateur" low="0" high="127"/>
+ <range class="professional" low="0" high="127"/>
+ </instrument>
+ <instrument name="Shell wind chimes">
+ <clef type="two-bar" />
+ <transpose value="0" />
+ <range class="amateur" low="0" high="127"/>
+ <range class="professional" low="0" high="127"/>
+ </instrument>
+ <instrument name="Stones">
+ <clef type="two-bar" />
+ <transpose value="0" />
+ <range class="amateur" low="0" high="127"/>
+ <range class="professional" low="0" high="127"/>
+ </instrument>
+ <instrument name="Finger snap">
+ <clef type="two-bar" />
+ <transpose value="0" />
+ <range class="amateur" low="0" high="127"/>
+ <range class="professional" low="0" high="127"/>
+ </instrument>
+ <instrument name="Hand clap">
+ <clef type="two-bar" />
+ <transpose value="0" />
+ <range class="amateur" low="0" high="127"/>
+ <range class="professional" low="0" high="127"/>
+ </instrument>
+ <instrument name="Slap">
+ <clef type="two-bar" />
+ <transpose value="0" />
+ <range class="amateur" low="0" high="127"/>
+ <range class="professional" low="0" high="127"/>
+ </instrument>
+ <instrument name="Stamp">
+ <clef type="two-bar" />
+ <transpose value="0" />
+ <range class="amateur" low="0" high="127"/>
+ <range class="professional" low="0" high="127"/>
+ </instrument>
+ <instrument name="Drum set">
+ <clef type="box" />
+ <transpose value="0" />
+ <range class="amateur" low="0" high="127"/>
+ <range class="professional" low="0" high="127"/>
+ </instrument>
+ <instrument name="Percussion synthesizer">
+ <clef type="two-bar" />
+ <transpose value="0" />
+ <range class="amateur" low="0 " high="127 "/>
+ <range class="professional" low="0 " high="127 "/>
+ </instrument>
+ </category>
+ <category name="Keyboards">
+ <instrument name="Piano (treble)">
+ <clef type="treble" />
+ <transpose value="0" />
+ <range class="amateur" low="21" high="108"/>
+ <range class="professional" low="21" high="108"/>
+ </instrument>
+ <instrument name="Piano (bass)">
+ <clef type="bass" />
+ <transpose value="0" />
+ <range class="amateur" low="21" high="108"/>
+ <range class="professional" low="21" high="108"/>
+ </instrument>
+ <instrument name="Clavichord (treble)">
+ <clef type="treble" />
+ <transpose value="0" />
+ <range class="amateur" low="29" high="89"/>
+ <range class="professional" low="29" high="89"/>
+ </instrument>
+ <instrument name="Clavichord (bass)">
+ <clef type="bass" />
+ <transpose value="0" />
+ <range class="amateur" low="29" high="89"/>
+ <range class="professional" low="29" high="89"/>
+ </instrument>
+ <instrument name="Harpsichord (treble)">
+ <clef type="treble" />
+ <transpose value="0" />
+ <range class="amateur" low="29" high="89"/>
+ <range class="professional" low="29" high="89"/>
+ </instrument>
+ <instrument name="Harpsichord (bass)">
+ <clef type="bass" />
+ <transpose value="0" />
+ <range class="amateur" low="29" high="89"/>
+ <range class="professional" low="29" high="89"/>
+ </instrument>
+ <instrument name="Celesta (treble)">
+ <clef type="crotale" />
+ <transpose value="0" />
+ <range class="amateur" low="60" high="108"/>
+ <range class="professional" low="60" high="108"/>
+ </instrument>
+ <instrument name="Celesta (bass)">
+ <clef type="modern celesta" />
+ <transpose value="0" />
+ <range class="amateur" low="60" high="108"/>
+ <range class="professional" low="60" high="108"/>
+ </instrument>
+ <instrument name="Electric piano (treble)">
+ <clef type="treble" />
+ <transpose value="0" />
+ <range class="amateur" low="21" high="108"/>
+ <range class="professional" low="21" high="108"/>
+ </instrument>
+ <instrument name="Electric piano (bass)">
+ <clef type="bass" />
+ <transpose value="0" />
+ <range class="amateur" low="21" high="108"/>
+ <range class="professional" low="21" high="108"/>
+ </instrument>
+ <instrument name="Toy piano">
+ <clef type="treble" />
+ <transpose value="0" />
+ <range class="amateur" low="60" high="79"/>
+ <range class="professional" low="60" high="79"/>
+ </instrument>
+ <instrument name="Keyboard synthesizer (treble)">
+ <clef type="treble" />
+ <transpose value="0" />
+ <range class="amateur" low="0 " high="127 "/>
+ <range class="professional" low="0 " high="127 "/>
+ </instrument>
+ <instrument name="Keyboard synthesizer (bass)">
+ <clef type="bass" />
+ <transpose value="0" />
+ <range class="amateur" low="0 " high="127 "/>
+ <range class="professional" low="0 " high="127 "/>
+ </instrument>
+ <instrument name="Organ (manual) (treble)">
+ <clef type="treble" />
+ <transpose value="0" />
+ <range class="amateur" low="36" high="96"/>
+ <range class="professional" low="36" high="96"/>
+ </instrument>
+ <instrument name="Organ (manual) (bass)">
+ <clef type="bass" />
+ <transpose value="0" />
+ <range class="amateur" low="36" high="96"/>
+ <range class="professional" low="36" high="96"/>
+ </instrument>
+ <instrument name="Organ (pedal)">
+ <clef type="bass" />
+ <transpose value="0" />
+ <range class="amateur" low="36" high="67"/>
+ <range class="professional" low="36" high="67"/>
+ </instrument>
+ <instrument name="Electronic organ (manual) (treble)">
+ <clef type="treble" />
+ <transpose value="0" />
+ <range class="amateur" low="36" high="96"/>
+ <range class="professional" low="36" high="96"/>
+ </instrument>
+ <instrument name="Electronic organ (manual) (bass)">
+ <clef type="bass" />
+ <transpose value="0" />
+ <range class="amateur" low="36" high="96"/>
+ <range class="professional" low="36" high="96"/>
+ </instrument>
+ <instrument name="Electronic organ (pedal)">
+ <clef type="bass" />
+ <transpose value="0" />
+ <range class="amateur" low="36" high="67"/>
+ <range class="professional" low="36" high="67"/>
+ </instrument>
+ <instrument name="Harmonium (treble)">
+ <clef type="treble" />
+ <transpose value="0" />
+ <range class="amateur" low="29" high="89"/>
+ <range class="professional" low="29" high="89"/>
+ </instrument>
+ <instrument name="Harmonium (bass)">
+ <clef type="bass" />
+ <transpose value="0" />
+ <range class="amateur" low="29" high="89"/>
+ <range class="professional" low="29" high="89"/>
+ </instrument>
+ </category>
+ <category name="Free reeds">
+ <instrument name="Accordion (treble)">
+ <clef type="treble" />
+ <transpose value="0" />
+ <range class="amateur" low="53" high="93"/>
+ <range class="professional" low="53" high="93"/>
+ </instrument>
+ <instrument name="Accordion (bass)">
+ <clef type="bass" />
+ <transpose value="0" />
+ <range class="amateur" low="36" high="69"/>
+ <range class="professional" low="36" high="69"/>
+ </instrument>
+ <instrument name="Bandoneon (treble)">
+ <clef type="treble" />
+ <transpose value="0" />
+ <range class="amateur" low="57" high="93"/>
+ <range class="professional" low="57" high="93"/>
+ </instrument>
+ <instrument name="Bandoneon (bass)">
+ <clef type="bass" />
+ <transpose value="0" />
+ <range class="amateur" low="36" high="69"/>
+ <range class="professional" low="36" high="69"/>
+ </instrument>
+ <instrument name="Harmonica">
+ <clef type="treble" />
+ <transpose value="0" />
+ <range class="amateur" low="28" high="103"/>
+ <range class="professional" low="28" high="103"/>
+ </instrument>
+ <instrument name="Melodica">
+ <clef type="treble" />
+ <transpose value="0" />
+ <range class="amateur" low="53" high="84"/>
+ <range class="professional" low="53" high="84"/>
+ </instrument>
+ </category>
+ <category name="Voices">
+ <instrument name="Soprano">
+ <clef type="treble" />
+ <transpose value="0" />
+ <range class="amateur" low="60" high="81"/>
+ <range class="professional" low="60" high="84"/>
+ </instrument>
+ <instrument name="Mezzosoprano">
+ <clef type="treble" />
+ <transpose value="0" />
+ <range class="amateur" low="57" high="77"/>
+ <range class="professional" low="57" high="81"/>
+ </instrument>
+ <instrument name="Alto">
+ <clef type="treble" />
+ <transpose value="0" />
+ <range class="amateur" low="55" high="74"/>
+ <range class="professional" low="55" high="77"/>
+ </instrument>
+ <instrument name="Tenor">
+ <clef type="guitar" />
+ <transpose value="0" />
+ <range class="amateur" low="48" high="69"/>
+ <range class="professional" low="48" high="72"/>
+ </instrument>
+ <instrument name="Baritone">
+ <clef type="bass" />
+ <transpose value="0" />
+ <range class="amateur" low="45" high="65"/>
+ <range class="professional" low="45" high="69"/>
+ </instrument>
+ <instrument name="Bass">
+ <clef type="bass" />
+ <transpose value="0" />
+ <range class="amateur" low="41" high="62"/>
+ <range class="professional" low="41" high="65"/>
+ </instrument>
+ <instrument name="Boy soprano">
+ <clef type="treble" />
+ <transpose value="0" />
+ <range class="amateur" low="60" high="77"/>
+ <range class="professional" low="60" high="81"/>
+ </instrument>
+ </category>
+ <category name="Miscellaneous">
+ <instrument name="Kazoo (treble)">
+ <clef type="treble" />
+ <transpose value="0" />
+ <range class="amateur" low="55" high="81"/>
+ <range class="professional" low="55" high="84"/>
+ </instrument>
+ <instrument name="Kazoo (bass)">
+ <clef type="bass" />
+ <transpose value="0" />
+ <range class="amateur" low="41" high="69"/>
+ <range class="professional" low="41" high="72"/>
+ </instrument>
+ <instrument name="Police whistle">
+ <clef type="two-bar" />
+ <transpose value="0" />
+ <range class="amateur" low="0" high="127"/>
+ <range class="professional" low="0" high="127"/>
+ </instrument>
+ <instrument name="Bird whistle">
+ <clef type="two-bar" />
+ <transpose value="0" />
+ <range class="amateur" low="0" high="127"/>
+ <range class="professional" low="0" high="127"/>
+ </instrument>
+ <instrument name="Duck call">
+ <clef type="two-bar" />
+ <transpose value="0" />
+ <range class="amateur" low="0" high="127"/>
+ <range class="professional" low="0" high="127"/>
+ </instrument>
+ <instrument name="Mouth siren">
+ <clef type="two-bar" />
+ <transpose value="0" />
+ <range class="amateur" low="0" high="127"/>
+ <range class="professional" low="0" high="127"/>
+ </instrument>
+ <instrument name="Siren">
+ <clef type="two-bar" />
+ <transpose value="0" />
+ <range class="amateur" low="0" high="127"/>
+ <range class="professional" low="0" high="127"/>
+ </instrument>
+ <instrument name="Auto horn">
+ <clef type="two-bar" />
+ <transpose value="0" />
+ <range class="amateur" low="0" high="127"/>
+ <range class="professional" low="0" high="127"/>
+ </instrument>
+ <instrument name="Klaxon horn">
+ <clef type="two-bar" />
+ <transpose value="0" />
+ <range class="amateur" low="0" high="127"/>
+ <range class="professional" low="0" high="127"/>
+ </instrument>
+ <instrument name="Lion's roar">
+ <clef type="two-bar" />
+ <transpose value="0" />
+ <range class="amateur" low="0" high="127"/>
+ <range class="professional" low="0" high="127"/>
+ </instrument>
+ <instrument name="Wind machine">
+ <clef type="two-bar" />
+ <transpose value="0" />
+ <range class="amateur" low="0" high="127"/>
+ <range class="professional" low="0" high="127"/>
+ </instrument>
+ <instrument name="Pistol shot">
+ <clef type="two-bar" />
+ <transpose value="0" />
+ <range class="amateur" low="0" high="127"/>
+ <range class="professional" low="0" high="127"/>
+ </instrument>
+ </category>
+</presets>
+<!-- IMPORTED 330 INSTRUMENTS -->
diff --git a/data/presets/regenerate-presets b/data/presets/regenerate-presets
new file mode 100755
index 0000000..ff33a00
--- /dev/null
+++ b/data/presets/regenerate-presets
@@ -0,0 +1,26 @@
+#!/bin/bash
+#
+# regenerate-presets
+#
+# Copyright (c) 2006 D. Michael McIntyre <[email protected]>
+# Released under the GPL
+#
+# REQUIRES: ../scripts/preset-xmlify ../scripts/dehumanize
+#
+#
+# PURPOSE: to run the above scripts without a lot of bothersome typing
+#
+#
+#
+
+rm -f presets*.xml
+
+for x in presets-editable*.conf; do
+ xmlfile=presets`echo $x | sed 's/^presets-editable\(.*\)\.conf$/\1/'`.xml
+ ../../scripts/preset-xmlify < "$x" > "$xmlfile" && \
+ ../../scripts/dehumanize "$xmlfile" || \
+ echo "Something went wrong. $xmlfile is probably mangled."
+ chmod -w "$xmlfile"
+ echo $xmlfile updated successfully
+done
+
diff --git a/data/profile/rosegarden.profile.xml b/data/profile/rosegarden.profile.xml
new file mode 100644
index 0000000..857ff61
--- /dev/null
+++ b/data/profile/rosegarden.profile.xml
@@ -0,0 +1,55 @@
+<?xml version="1.0" ?>
+<!DOCTYPE profile SYSTEM "profile.dtd">
+
+<profile id="rosegarden" servicename="Rosegarden">
+ <name>Rosegarden</name>
+ <author>Pedro Lopez-Cabanillas</author>
+ <action objid="RosegardenIface" prototype="void play()" class="play">
+ <name>Play/Pause</name>
+ <comment>Toggles between playing and pausing</comment>
+ </action>
+ <action objid="RosegardenIface" prototype="void stop()" class="stop">
+ <name>Stop</name>
+ <comment>Stops current playback/record session</comment>
+ </action>
+ <action objid="RosegardenIface" prototype="void rewind()" class="rewind">
+ <name>Rewind</name>
+ <comment>Rewind to the previous bar</comment>
+ </action>
+ <action objid="RosegardenIface" prototype="void rewindToBeginning()">
+ <name>Rewind to beginning</name>
+ <comment>Rewind to the start of the composition</comment>
+ </action>
+ <action objid="RosegardenIface" prototype="void fastForwardToEnd()">
+ <name>Fast Forward to end</name>
+ <comment>Forward to the end of the composition</comment>
+ </action>
+ <action objid="RosegardenIface" prototype="void fastForward()" class="forward">
+ <name>Fast Forward</name>
+ <comment>Forward to the next bar</comment>
+ </action>
+ <action objid="RosegardenIface" prototype="void record()" class="record">
+ <name>Recording Mode</name>
+ <comment>Starts recording to the armed tracks</comment>
+ </action>
+ <action objid="RosegardenIface" prototype="void trackDown()" class="next">
+ <name>Next track</name>
+ <comment>Selects the next track</comment>
+ </action>
+ <action objid="RosegardenIface" prototype="void trackUp()" class="previous">
+ <name>Previous track</name>
+ <comment>Selects the previous track</comment>
+ </action>
+ <action objid="RosegardenIface" prototype="void toggleMutedCurrentTrack()" class="mute">
+ <name>Toggle mute track</name>
+ <comment>Toggle muted state for the currently selected track</comment>
+ </action>
+ <action objid="RosegardenIface" prototype="void toggleRecordCurrentTrack()">
+ <name>Toggle arm track</name>
+ <comment>Toggle armed state for the currently selected track</comment>
+ </action>
+ <action objid="RosegardenIface" prototype="void quit()" class="off">
+ <name>Quit</name>
+ <comment>Exit Rosegarden</comment>
+ </action>
+</profile>
diff --git a/data/styles/Classical.xml b/data/styles/Classical.xml
new file mode 100644
index 0000000..c7957c3
--- /dev/null
+++ b/data/styles/Classical.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE rosegarden-note-style>
+
+<rosegarden-note-style>
+
+ <global shape="angled oval" filled="true" stem="true" flags="0"
+ hfixpoint="normal" vfixpoint="middle"/>
+
+ <note type="hemidemisemiquaver" flags="4"/>
+ <note type="demisemiquaver" flags="3"/>
+ <note type="semiquaver" flags="2"/>
+ <note type="quaver" flags="1"/>
+ <note type="minim" filled="false"/>
+ <note type="semibreve" filled="false" shape="level oval" stem="false"/>
+ <note type="breve" filled="false" shape="breve" stem="false"/>
+
+</rosegarden-note-style>
diff --git a/data/styles/Cross.xml b/data/styles/Cross.xml
new file mode 100644
index 0000000..7f449b8
--- /dev/null
+++ b/data/styles/Cross.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE rosegarden-note-style>
+
+<rosegarden-note-style base-style="Classical">
+
+ <global shape="cross" vfixpoint="near"/>
+
+</rosegarden-note-style>
diff --git a/data/styles/Mensural.xml b/data/styles/Mensural.xml
new file mode 100644
index 0000000..bd48510
--- /dev/null
+++ b/data/styles/Mensural.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE rosegarden-note-style>
+
+<rosegarden-note-style base-style="Classical">
+
+ <global shape="diamond" filled="false" stem="true" flags="0"
+ hfixpoint="central" vfixpoint="near"/>
+
+ <!-- Mapping from mensural to classical picked up from
+ http://listen.to/early.music
+ I know nothing about mensural notation myself.
+ The white mensural note names are in comments.
+ -->
+
+ <note type="hemidemisemiquaver" flags="3"/>
+ <note type="demisemiquaver" flags="2"/>
+ <note type="semiquaver" flags="1"/> <!-- fusa (flag shouldn't be curved) -->
+ <note type="quaver" filled="true"/> <!-- semiminim -->
+ <note type="crotchet"/> <!-- minim -->
+ <note type="minim" stem="false"/> <!-- semibreve -->
+ <note type="semibreve" charname="MUSICAL SYMBOL BREVIS" stem="false"/> <!-- breve -->
+ <note type="breve" charname="MUSICAL SYMBOL BREVIS" stem="true" hfixpoint="reversed"/> <!-- long -->
+
+ <!-- and we can't deal with the maxima... perhaps we should have
+ mapped semibreve to quarter -->
+
+</rosegarden-note-style>
+
diff --git a/data/styles/Triangle.xml b/data/styles/Triangle.xml
new file mode 100644
index 0000000..7877bdc
--- /dev/null
+++ b/data/styles/Triangle.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE rosegarden-note-style>
+
+<rosegarden-note-style base-style="Classical">
+
+ <global shape="triangle up" vfixpoint="near" hfixpoint="central"/>
+
+</rosegarden-note-style>
diff --git a/docs/CMakeLists.txt b/docs/CMakeLists.txt
new file mode 100644
index 0000000..9d1ac8b
--- /dev/null
+++ b/docs/CMakeLists.txt
@@ -0,0 +1,4 @@
+
+ADD_DOCS(rosegarden en es ja sv)
+
+INSTALL(FILES en/tips DESTINATION ${KDE3DATADIR}/rosegarden)
diff --git a/docs/en/headers-and-unicode-lyrics.png b/docs/en/headers-and-unicode-lyrics.png
new file mode 100644
index 0000000..a315eca
--- /dev/null
+++ b/docs/en/headers-and-unicode-lyrics.png
Binary files differ
diff --git a/docs/en/index.docbook b/docs/en/index.docbook
new file mode 100644
index 0000000..064dd2b
--- /dev/null
+++ b/docs/en/index.docbook
@@ -0,0 +1,6885 @@
+<?xml version="1.0" ?>
+<!DOCTYPE book PUBLIC "-//KDE//DTD DocBook XML V4.1.2-Based Variant V1.0//EN" "dtd/kdex.dtd" [
+ <!ENTITY rosegarden "<application>Rosegarden</application>">
+ <!ENTITY MIDI "<acronym>MIDI</acronym>">
+ <!ENTITY % English "INCLUDE" > <!-- change language only here -->
+ <!ENTITY % addindex "IGNORE">
+]>
+
+<!-- The language must be changed in the <book> tag for translations. -->
+
+
+<!--
+
+ Notes on style and terminology for Rosegarden handbook
+ ======================================================
+
+ * Try to use British spelling and idiom as much as you possibly
+ can, so the American bits don't stick out like a sore
+ thumb. Realise, not realize, colour, not color, though of
+ course an American is going to miss using colorful (oops)
+ British sayings like "a bit naff," and won't have any idea
+ what the bloody hell (that was good, but a bit too vulgar, of
+ course) words like "heuristic" mean.
+
+ * Aim to be clear, brief and direct, but be informal.
+
+ * Write instructions in the second person.
+
+ Good: "You can select segments by clicking on them with
+ the arrow tool."
+
+ Bad: "Segments can be selected by clicking on them with
+ the arrow tool."
+
+ Very bad: "The arrow tool allows the user to select segments
+ by clicking on them."
+
+ If you dislike the first of these because you want to make the
+ phrase "the arrow tool" more obvious by placing it at the
+ start of the sentence, then perhaps you should be using a
+ variablelist instead and making "the arrow tool" a list item.
+
+ * It's perfectly permissible to detour to explain why
+ something is the way it is, particularly if it might not be
+ obvious.
+
+ * It's also entirely permissible to omit advanced stuff. This
+ document is be about understanding how and why, not about
+ knowing every last clever detail. Initially we were going to
+ include a function reference section for the clever details,
+ but it proved too hard to keep up to date, and not all that
+ useful. Providing a quick bit of guidance is most of the job.
+
+ * Bear in mind we can link extensively from any part of
+ the handbook to any other. Unfortunately DocBook won't allow
+ you to write a link to a target that doesn't exist yet, so if
+ you want to link to something that's not yet been written,
+ either make a note of the planned link in an XML comment, or
+ go and create a stub for the bit that hasn't been written yet,
+ or else just write in a way that allows for a link to be
+ easily added later (we could do an editing phase specially for
+ links).
+
+ * Be strict about using the correct terminology for
+ Rosegarden data structures (segment, event, track, instrument,
+ composition), but don't capitalise the words. Capitalisation
+ is useful in technical documents to make it clear that you're
+ referring to a precise concept, but you shouldn't have to do
+ it to make your meaning clear in user documentation. If
+ something seems ambiguous without, try rewording it instead.
+
+
+ About Screenshots
+ =================
+
+ We recommend saving your current user preferences as a new theme
+ using the KDE theme manager, so you can restore your usual
+ desktop after your work on this manual is done. Then we
+ recommend that you spare yourself some effort, and use the
+ "Rosegarden Handbook" KDE theme I just created, and put here:
+
+ http://rosegarden.sourceforge.net/Rosegarden\ Handbook.kth
+
+ If you can't use the theme for some reason, you must dial in
+ these changes by hand. Screenshots used with this documentation
+ should use the following style, colour and font settings:
+
+ (NOTE: These specs are from the KDE 2.x era, surely, and make no
+ particular mention of icon themes. I have no idea what icons
+ were used in the original version of this document, since it was
+ not specified. I have used the new default "Crystal SVG" icons
+ in creating the theme above. This will probably result in a
+ mis-match, but I find I really don't care.)
+
+ (NOTE in reply to the above: the scheme was originally from
+ KDE 2.x, yes. I suggest we don't worry about icon mismatches too
+ much, as most of the screenshots don't have icons in semantically
+ meaningful roles anyway. I use Crystal SVG too now and I don't
+ really intend to change that for the documentation.)
+
+ * KDE Style: "Light Style, 3rd Revision"
+
+ * Colour scheme: "Blue Slate", with high-contrast
+ setting and with the standard widget background set to white.
+ (I have this saved as a new scheme.)
+
+ * Fonts: Verdana 11px for general use and menus; Verdana
+ 11px bold for window titles; antialiasing on, but sub-pixel
+ antialiasing off. (For pictures of the segment and instrument
+ parameter boxes I usually turn the size up to 13px, which
+ perhaps says something about our use of font size in these
+ boxes.) WARNING: This is not a reliable hint any more, as
+ the KDE font size is not in pixels but points that depend
+ on the detected monitor resolution. Go for something that
+ looks a bit like the existing screenshots; it will probably
+ be smaller than 11pt.
+
+ NOTE: switching off sub-pixel antialiasing is quite important,
+ as otherwise your text will look weird and fuzzy to any
+ readers with CRT monitors or LCDs with a different colour
+ ordering. The exact choice of font is less important: I
+ think you can get away with Vera or whatever.
+
+ * Window Decorations: "Quartz"
+
+ None of these would be my first choice for nice-looking
+ screenshots now, but we're not here to sell Rosegarden in this
+ document, we're here to provide clear and consistent help text.
+ So the priority is to make new screenshots look like the existing
+ ones, not to make them look fancy. Also, I think there is an
+ advantage to having screenshots in a help document look a bit
+ distinct from the user's own window decorations surrounding the
+ help text.
+
+ Screenshots of the whole program or of whole matrix or notation
+ windows may be taken using different themes if desired, but
+ screenshots of individual dialogs or window components must use
+ the above scheme.
+
+-->
+
+<!--
+ Notes on Usability Defects
+ ==========================
+
+ This comment is a place to note anything I find difficult to
+ document, or anything where the functions for two necessarily
+ linked concepts are not actually linked in the GUI (etc).
+
+ * The audio file directory (in document properties) can't be
+ inspected or changed from the audio file manager. This is
+ arguably linked to a need for a project directory. There
+ are various other usability problems with the audio file
+ manager as well, e.g. there's no way to tell it to pull all
+ imported audio files into a single audio directory.
+
+ * Track buttons showing sometimes-instrument, sometimes-label.
+
+ * Mostly FIXED - Can't usefully double-click / right-click on
+ most rulers. This would be useful for a slower but clearer
+ way to set loops; adding and editing markers; etc. Setting
+ loops is particularly opaque especially in notation and
+ matrix views.
+
+ * Hideous inconsistency (documented in an RFE already) between
+ having to use RG for MIDI routing and being unable to use RG
+ for audio routing.
+
+ Troubleshooting
+ ===============
+
+ Shall we have a troubleshooting section?
+
+ * I'm not seeing any MIDI outputs
+ * I'm not hearing any sound from my MIDI outputs
+ * I'm not seeing any audio outputs
+ * I'm not hearing any sound from my audio outputs
+ * I don't see any synth plugins
+
+-->
+
+<!--
+ Still to do (yeah right, in 30 to 75 years)
+ ===========
+
+ * Control rulers
+
+ * Controller editing
+
+ * Event list
+
+ * Event editor dialogs
+
+ * Document properties
+
+ * Add images for the tools (move, split &c) when describing them
+
+ * Add images for transport buttons in transport section
+
+ * Update notation menu references
+
+ * Add new notation stuff <- "new" when this to-do item was added? when was that I wonder?
+
+ * Config dialog
+
+ * Make sure the guimenuitem etc tags are being used for all menu refs
+
+ * Give keyboard shortcuts for menu functions?
+
+ * Go through again changing Rosegarden -> &rosegarden; and double-hyphen ->
+ &ndash; or &mdash; and review any uses of "the ... function" to see
+ if these words are redundant
+
+ * Troubleshooter
+
+ * Check !!! items
+
+ * Fill gaps in revision history
+
+ * Consistent capitalisation: Instrument Parameter Box or instrument
+ parameter box? Audio Mixer or audio mixer? Device or device?
+
+ * Finally, review the structure again and adjust the <chapter>/<sect*>
+ for balance
+
+-->
+
+
+<book id="rosegarden" lang="&language;">
+
+ <!-- This header contains all of the meta-information for the document such
+ as Authors, publish date, the abstract, and Keywords -->
+
+ <bookinfo>
+ <title>The Rosegarden Handbook</title>
+ <authorgroup>
+ <author>
+ <firstname>Chris</firstname>
+ <surname>Cannam</surname>
+ </author>
+ <author>
+ <firstname>Richard</firstname>
+ <surname>Bown</surname>
+ </author>
+ <author>
+ <firstname>Guillaume</firstname>
+ <surname>Laurent</surname>
+ <firstname>D. Michael</firstname>
+ <surname>McIntyre</surname>
+ <firstname>Pedro</firstname>
+ <surname>Lopez-Cabanillas</surname>
+ <firstname>Heikki</firstname>
+ <surname>Junes</surname>
+ </author>
+ <!-- TRANS:ROLES_OF_TRANSLATORS -->
+ </authorgroup>
+
+ <copyright>
+ <year>2002-2008</year>
+ <holder>Chris Cannam, Richard Bown, Guillaume Laurent, D. Michael
+ McIntyre, Pedro Lopez-Cabanillas, Heikki Junes</holder>
+ </copyright>
+
+ <date>2008-05-05</date>
+ <releaseinfo>1.7.0</releaseinfo>
+
+ <abstract>
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-mainwindow.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase>&rosegarden;</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+
+ Rosegarden is an audio and &MIDI; sequencer and musical notation
+ editor. This Handbook describes how to use it.
+
+ </para>
+ </abstract>
+
+ <keywordset>
+ <keyword>Rosegarden</keyword>
+ <keyword>sequencer</keyword>
+ <keyword>MIDI</keyword>
+ <keyword>audio</keyword>
+ <keyword>music</keyword>
+ <keyword>notation</keyword>
+ <keyword>score</keyword>
+ <keyword>KDE</keyword>
+ </keywordset>
+
+ </bookinfo>
+
+ <!-- The contents of the documentation begins here. Label each
+ chapter so with the id attribute. This is necessary for two reasons:
+ it allows you to easily reference the chapter from other chapters of
+ your document, and if there is no ID, the name of the generated HTML
+ files will vary from time to time making it hard to manage for
+ maintainers and for the CVS system. Any chapter labelled (OPTIONAL)
+ may be left out at the author's discretion. Other chapters should
+ not be left out in order to maintain a consistent documentation
+ style across all KDE apps. -->
+
+ <chapter id="introduction">
+ <title>Introduction</title>
+
+ <sect1>
+ <title>About Rosegarden</title>
+ <para>
+ <application>Rosegarden</application> is a &MIDI; and audio
+ sequencer and musical notation editor. Rosegarden allows you to
+ record, arrange, and compose music, in the shape of traditional
+ score or &MIDI; data, or of audio files either imported or
+ recorded from a microphone, guitar or whatever audio source you
+ care to specify. You can use Rosegarden to write, edit, and
+ organise music to create a composition, which you can then
+ synthesise, add effects to, and mix down for burning to CD or
+ distribution on the web. Rosegarden also contains well-rounded
+ notation editing support for high quality printed output.
+ </para>
+
+ <para>
+ <application>Rosegarden</application> is designed to look and
+ act in a manner familiar to experienced users coming to Linux
+ from other platforms, whilst also being accessible and friendly
+ to users new to music software generally.
+ </para>
+
+ <sect2 id="intro-handbook">
+ <title>About this Handbook</title>
+ <para>
+ This handbook summarises the capabilities of &rosegarden; and
+ provides a reference for some of the concepts involved. It's
+ designed to make sense either read in order or used as a reference
+ to the concepts and functions available in Rosegarden. If you
+ would like to read a tutorial as well, <ulink
+ url="http://rosegarden.sourceforge.net/tutorial/en/chapter-0.html">you
+ can find one here</ulink>.</para>
+
+ <para>If there's something else that you
+ don't understand or require further help with, please visit
+ <ulink url="http://www.rosegardenmusic.com/support/">the
+ Rosegarden website</ulink> for Frequently Asked Questions and
+ mailing list instructions.
+ </para>
+ </sect2>
+
+ <sect2 id="intro-menufunctions">
+ <title>About Menus and Shortcuts</title> <para>This handbook
+ usually refers to the functions you can use in Rosegarden by
+ describing where they live on the menus. For example, the
+ function to add a single new track to the main track editor is
+ <menuchoice>
+ <guimenu lang="en">Tracks</guimenu>
+ <guimenuitem>Add Track</guimenuitem>
+ </menuchoice>.</para>
+
+ <para>In many cases, this is not the only way to reach a
+ particular function. In this case the same function is also
+ available through the keyboard shortcut Ctrl+T, and it also
+ appears as an icon on one of the main window's toolbars. Both
+ the keyboard shortcut and the icon can quickly be learned,
+ because they are shown on the menu in Rosegarden alongside the
+ name of the function. You should bear in mind that although we
+ always give the full menu location in this documentation for
+ reference purposes, it's not necessarily the best or most usual
+ way to use a function, and you should keep an eye on the
+ keyboard shortcuts or toolbar icons as well.
+ </para>
+ </sect2>
+
+ <sect2 id="intro-optional">
+ <title>Optional Features</title> <para>This Handbook assumes
+ that your Rosegarden installation supports all the features of
+ which it is capable. Some of Rosegarden's features, including
+ some very major ones, are actually optional when building a
+ Rosegarden installation, depending on which other libraries and
+ supporting code is available. For example, the whole audio
+ subsystem is only compiled in if JACK libraries are available;
+ synth plugin support depends on a number of other modules;
+ etc.</para> <para>These dependencies are documented in the
+ Rosegarden README and configuration documentation. If you find
+ that this Handbook refers to features not visible in the version
+ of Rosegarden you're using, consult your configuration
+ documentation or distributor.
+ </para>
+ </sect2>
+ </sect1>
+ </chapter>
+
+
+<!--
+ **********************************
+
+ PART I:
+ Discussion and tutorial material
+
+ **********************************
+ -->
+
+
+ <chapter id="file-operations">
+ <title>Rosegarden Files and Documents</title>
+ <para>
+ &rosegarden; stores each composition in its own document, using
+ its own internal format. When you save a document it is stored
+ on disc as a file with the .rg extension.<footnote><para>
+ Many users have complained about our opaque binary file
+ format. It is, in fact, nothing more than gzipped XML.
+ </para></footnote> &rosegarden; can also
+ handle a number of other standard file formats.
+ </para>
+
+ <sect1 id="file-creating">
+ <title>New compositions</title>
+ <para>
+ When &rosegarden; starts up, it does so with a new document,
+ containing an "empty" composition ready to start editing.
+ To put something in that composition, you must either record
+ something, or create some blank lengths of music (referred
+ to as "segments") that you can then fill in using the
+ various editing facilities.
+ </para>
+ <para>See <link linkend="recording">Recording</link> for details of how to record music, and see the <link
+ linkend="segment-view">Track Editor</link> section for a
+ description of how to create, edit, and manage segments of
+ music.
+ </para>
+ </sect1>
+
+ <sect1 id="file-midi">
+ <title>Using MIDI files</title>
+ <para>
+ To import and export MIDI files, use the
+ <menuchoice>
+ <guimenu lang="en">File</guimenu>
+ <guimenuitem>Import</guimenuitem>
+ <guimenuitem>Import MIDI File</guimenuitem>
+ </menuchoice>
+ and
+ <menuchoice>
+ <guimenu lang="en">File</guimenu>
+ <guimenuitem>Export</guimenuitem>
+ <guimenuitem>Export MIDI File</guimenuitem>
+ </menuchoice>
+ functions.
+ </para>
+ <para>
+ Although &rosegarden; can load and save file formats such as
+ MIDI, it does not store MIDI data internally. You should
+ generally prefer to save files in &rosegarden;'s own format,
+ as &rosegarden; stores quite a lot of information that will
+ be lost when exporting to MIDI. This also applies if you merely
+ import a file, and then immediately export it back out. &rosegarden;
+ translates the raw MIDI to its internal format, and then translates that format
+ back into MIDI. Some details of the file structure can and do get
+ lost or rearranged in this translation, but the resulting performances
+ should be functionally identical.
+ </para>
+ <para>
+ When a MIDI file is loaded, &rosegarden; splits out the
+ music into one track per MIDI track or channel in the file,
+ <link linkend="studio-midi-import">sets up the appropriate
+ instrument mappings</link>, and <link
+ linkend="nv-quantization">attempts to calculate plausible
+ notation</link> for the MIDI performance data.
+ </para>
+ </sect1>
+
+ <sect1 id="file-rgproject">
+ <title>Rosegarden Project files</title> <para>A Rosegarden
+ composition file (.rg) contains all of the the note information
+ for your composition, as well as other data such as MIDI
+ controller settings, plugin details, and the names of any audio
+ files referred to in your composition. The audio files
+ themselves are not stored in the Rosegarden composition file;
+ instead you are expected to keep track of their location on disk
+ yourself (see <link linkend="segment-view-audio-segments">Audio
+ segments</link>). When you need to transfer a project from one
+ computer to another, or to a friend or colleague, this can be
+ inconvenient. This is where Rosegarden Project files are
+ useful. A Project file contains your composition, all of the
+ audio files it uses, any further data files required for plugins
+ used in the composition, and any additional files you may want
+ to include, all in one big bundle.</para>
+ <para>Use <menuchoice>
+ <guimenu>File</guimenu>
+ <guimenuitem>Export</guimenuitem>
+ <guimenuitem>Export Rosegarden Project file...</guimenuitem></menuchoice> to export the current composition and its associated data into a Rosegarden Project file, and <menuchoice>
+ <guimenu>File</guimenu>
+ <guimenuitem>Import</guimenuitem>
+ <guimenuitem>Import Rosegarden Project file...</guimenuitem></menuchoice> to expand a Rosegarden Project file back into a composition and load it.</para>
+
+ <para>Note that Rosegarden Project format is an interchange
+ format, not an archival format. Although Rosegarden composition
+ files are very carefully checked for compatibility from one
+ Rosegarden version to the next, no long-term guarantees are made for the
+ Project file format.</para>
+ </sect1>
+
+ <sect1 id="file-other">
+ <title>Other file formats</title>
+ <para>Rosegarden can export to and import from a number of other file formats. Some of these are described here; see also <link linkend="file-printing">Printing</link> for information about LilyPond file export.</para>
+ <variablelist>
+ <varlistentry>
+ <term>Csound</term>
+ <listitem>
+ <para>You can export score files for the Csound synthesis system using
+ <menuchoice>
+ <guimenu>File</guimenu>
+ <guimenuitem>Export</guimenuitem>
+ <guimenuitem>Export Csound score file...</guimenuitem>
+ </menuchoice>. Together with a suitable orchestra file (not supplied), this can be used to play the composition through <ulink url="http://www.csounds.com/">Csound</ulink>. Note that not all data in the Rosegarden composition necessarily can or will be saved in the Csound format.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>Mup</term>
+ <listitem>
+ <para>You can use <menuchoice>
+ <guimenu>File</guimenu>
+ <guimenuitem>Export</guimenuitem>
+ <guimenuitem>Export Mup file...</guimenuitem>
+ </menuchoice>
+ to save the contents of the current composition into a new Mup file. This can then be processed by the <ulink url="http://www.arkkra.com/">Mup</ulink> music publication system, although it is likely that the file may need some tweaking to get really good quality output. Note that not all data in the Rosegarden composition necessarily can or will be saved in the Mup format.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>MusicXML</term>
+ <listitem>
+ <para>The <menuchoice>
+ <guimenu>File</guimenu>
+ <guimenuitem>Export</guimenuitem>
+ <guimenuitem>Export MusicXML file...</guimenuitem>
+ </menuchoice>
+ function saves the contents of the current composition into a new MusicXML file. This can then be used with any music software that supports the MusicXML format. Note that MusicXML support is experimental and has not been well tested. Not all data in the Rosegarden composition necessarily can or will be saved in the MusicXML format.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>Hydrogen</term>
+ <listitem>
+ <para>Rosegarden can import h2song files created by the Hydrogen drum machine. These are imported into a skeletal MIDI-style structure with one track per pattern. The audio samples they use are not imported. Use <menuchoice>
+ <guimenu>File</guimenu>
+ <guimenuitem>Import</guimenuitem>
+ <guimenuitem>Import Hydrogen file...</guimenuitem>
+ </menuchoice> to import a Hydrogen file.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>Rosegarden 2.1</term>
+ <listitem>
+ <para>Use the
+ <menuchoice>
+ <guimenu>File</guimenu>
+ <guimenuitem>Import</guimenuitem>
+ <guimenuitem>Import Rosegarden 2.1 file...</guimenuitem>
+ </menuchoice> function to create a new composition from the contents of an existing X11 Rosegarden v2.1 (.rose) file.
+ </para>
+ </listitem>
+
+ </varlistentry>
+ </variablelist>
+ </sect1>
+
+ <sect1 id="file-merge">
+ <title>Merging files</title> <para>As well as loading or
+ importing files, you can also merge them into the current
+ document, loading or importing the data from the file, as necessary,
+ and adding it to the existing composition.
+ </para>
+
+ <para>To merge a file, just use the relevant option on the
+ <menuchoice>
+ <guimenu lang="en">File</guimenu>
+ <guimenuitem>Merge</guimenuitem>
+ </menuchoice>
+ submenu, instead of using the Open or
+ Import option.
+ </para>
+ </sect1>
+
+ <sect1 id="file-printing">
+ <title>Printing</title>
+ <para>
+ You can print out a composition in the form of a musical
+ score, using the
+ <menuchoice>
+ <guimenu lang="en">File</guimenu>
+ <guimenuitem>Print</guimenuitem>
+ </menuchoice>
+ function or the
+ <menuchoice>
+ <guimenu lang="en">File</guimenu>
+ <guimenuitem>Print with LilyPond</guimenuitem>
+ </menuchoice>
+ function.
+ </para>
+
+ <para>
+ Producing a score from performance data is a hard task, and
+ in most cases it's unreasonable to expect a default printout
+ based on MIDI data to be very readable. You should use the
+ <link linkend="notation-view">notation editor</link> to tidy
+ up the score before printing. (See also <link
+ linkend="nv-quantization">Notation from performance
+ data</link>.)
+ </para>
+
+ <para>&rosegarden; is capable of producing very readable scores. Even
+ so, it is designed to be a screen editor and not primarily a
+ typesetter. If you want to produce true print-quality scores you
+ should consider using <ulink
+ url="http://www.lilypond.org">LilyPond</ulink> in conjunction
+ with &rosegarden;. LilyPond is music typesetting software that
+ reads a specialised text file format and produces high-quality
+ typeset output. &rosegarden; is capable of writing LilyPond files
+ using the
+ <menuchoice>
+ <guimenu lang="en">File</guimenu>
+ <guimenuitem>Export</guimenuitem>
+ <guimenuitem>Export LilyPond</guimenuitem>
+ </menuchoice>
+ function, and it
+ features special <link linkend="nv-lilypond-directives">exportable
+ directives</link> and <link linkend="track-parameters">track
+ parameters</link> that provide access to LilyPond features for
+ which there is currently no parallel within &rosegarden;'s own
+ native interface.
+ </para>
+
+ <para>LilyPond may be conveniently used with the
+ <menuchoice>
+ <guimenu lang="en">File</guimenu>
+ <guimenuitem>Preview with LilyPond</guimenuitem>
+ </menuchoice>
+ function, which exports the file into a temporary file and processes
+ it directly with LilyPond for preview with a PDF viewer.
+ If you are happy with the preview, you may print the score using the
+ printing capability of the PDF viewer, or use the
+ <menuchoice>
+ <guimenu lang="en">File</guimenu>
+ <guimenuitem>Print with LilyPond</guimenuitem>
+ </menuchoice>
+ function.
+ </para>
+
+ <para>
+ When Export, Preview, or Printing is done with LilyPond,
+ there is available also a collection of
+ <link linkend="lilypond-options">LilyPond options</link>.
+ </para>
+ </sect1>
+
+ <sect1 id="lilypond-options">
+ <title>LilyPond options</title>
+ <para>If one of the LilyPond export functions is invoked, there will
+ appear a dialog in which options specific to LilyPond export may be
+ altered.
+ </para>
+
+ <variablelist>
+ <varlistentry>
+ <term>LilyPond version</term>
+ <listitem><para>
+ LilyPond version installed into the system should be automatically
+ detected in the dialog, but it is possible to export to any other
+ LilyPond version since 2.6. Historically, LilyPond's syntax has
+ changed somewhat over time, but since LilyPond version 2.6 changes
+ have have been less radical and more maintainable.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>Paper size and Landscape</term>
+ <listitem><para>
+ Paper size can be A3, A4, A5, A6, Legal, US Letter, and Tabloid.
+ All paper sizes may also be used in Landscape mode.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>Font size</term>
+ <listitem><para>
+ Font size affects the size of the notes. If you want to fit more
+ staffs into the paper, you should decrease the font size.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>Export content</term>
+ <listitem><para>
+ Export content concerns tracks that have segments in them, which
+ are the tracks that are not empty.
+ It is possible to export All tracks, Non-muted tracks, the current
+ Selected track, or Selected segments. If LilyPond export is
+ launched from the Notation view, Selected segments include
+ the same selection which was used in opening the Notation view.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>Merge tracks that have the same name</term>
+ <listitem><para>
+ It is possible to Merge tracks that have the same name.
+ This options allows for example to make a piano score with
+ several independent voices. You may give first three tracks
+ name "Right" and three next tracks "Left" and then merge
+ them in LilyPond export. (This provides an easier way to manage
+ overlapping segments with the price that the top and bottom
+ parts will have different names on the page. If you wish both
+ of them to be named, eg. "Piano," then you will have to keep all
+ of the segments on the same pair of staffs. Consult <ulink
+ url="http://rosegarden.sourceforge.net/tutorial/supplemental/piano/">Piano
+ by Example</ulink> for a hands-on demonstration of this.) <!--
+ this comment makes absolutely no sense to me(dmm): Sometimes you
+ may encounter notes that overlap in printed form, you may avoid
+ them by selecting one of the collapsing notes and fine adjust
+ its position in Notation view function -->
+ <menuchoice>
+ <guimenu lang="en">Adjust</guimenu>
+ <guimenuitem>Fine Positioning</guimenuitem>
+ <guimenuitem>Push Right/Left</guimenuitem>
+ </menuchoice>.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>Export tempo marks</term>
+ <listitem><para>
+ Tempo marks are not exported by default. If tempo changes
+ rarely, you may want to export all tempo marks, but if
+ tempo changes too often, you may export only the first mark.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>Export lyrics</term>
+ <listitem><para>
+ <link linkend="nv-text-lyrics">Lyrics</link> is exported if this
+ option is checked. Text is entered in Unicode, which
+ makes it possible to enter lyrics in all languages. Multiple
+ lines of lyrics per staff is also possible, see the section
+ on <link linkend="nv-text-lyrics">Editing lyrics</link>.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>Export beamings</term>
+ <listitem><para>
+ <link linkend="nv-beamed-groups">Beams</link> defined in
+ &rosegarden; can be exported, or the default
+ beam grouping of LilyPond can be used. Future versions
+ of &rosegarden; may support nested note grouping.</para>
+ </listitem>
+ </varlistentry>
+<!-- deprecated
+ <varlistentry>
+ <term>Add staff group bracket</term>
+ <listitem><para>
+ Staff group bracket may be added to cover all staffs.
+ Future versions of &rosegarden; may support nested staff
+ groupings.</para>
+ </listitem>
+ </varlistentry> -->
+ <varlistentry>
+ <term>Lyrics alignment</term>
+ <listitem><para>
+ Lyrics is aligned Left by default. Sometimes Center or
+ Right alignment provides results and more pleasant output.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>Ragged bottom</term>
+ <listitem><para>
+ The staffs normally cover the whole page from top to bottom.
+ When there are only a few staffs, this option places the
+ extra vertical space at the bottom of the page instead.</para>
+ </listitem>
+ </varlistentry> <varlistentry>
+ <term>Enable "point-and-click" debugging</term>
+ <listitem><para>
+ If you export the LilyPond source with the
+ <menuchoice>
+ <guimenu lang="en">File</guimenu>
+ <guimenuitem>Export</guimenuitem>
+ <guimenuitem>Export LilyPond</guimenuitem>
+ </menuchoice>
+ function, you may open the LilyPond source by clicking
+ notes in the PDF output. Consult <ulink url=" http://lilypond.org/doc/v2.10/Documentation/user/lilypond/Point-and-click#Point-and-click">LilyPond documentation</ulink> for more
+ information.
+</para>
+ </listitem>
+ </varlistentry> <varlistentry>
+ <term>Export \midi block</term>
+ <listitem><para>
+ LilyPond is also capable of producing MIDI output. Check this
+ option if you wish the LilyPond source to use this option.
+ Note however that MIDI output which you obtain via &rosegarden;
+ sequencer, via
+ <menuchoice>
+ <guimenu lang="en">File</guimenu>
+ <guimenuitem>Export</guimenuitem>
+ <guimenuitem>Export MIDI file</guimenuitem>
+ </menuchoice>,
+ and via LilyPond's MIDI output may differ considerably.</para>
+ </listitem>
+ </varlistentry> <varlistentry>
+ <term>Headers</term>
+ <listitem><para>
+ Headers can be edited both in LilyPond export dialog and through the
+ <menuchoice>
+ <guimenu lang="en">Composition</guimenu>
+ <guimenuitem>Edit Document Properties</guimenuitem>
+ </menuchoice> function.</para><para>Some of the headers will appear
+ only in LilyPond output.
+ The position of the Printable headers match roughly with
+ the positions of the headers in the printed output.
+ Below is shown an example with all headers and lyrics
+ entered with Unicode text.</para>
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="headers-and-unicode-lyrics.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase>LilyPond's output showing all headers and Unicode lyrics.</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </sect1>
+
+ </chapter>
+
+ <chapter id="segment-view">
+ <title>The Track Editor</title>
+ <sect1 id="segment-view-overview">
+ <title>Overview</title>
+ <para>
+ &rosegarden;'s main layout is similar to many
+ other popular sequencers. It is based on a track
+ structure &mdash; the main window shows a track editor with
+ a list of tracks and their associated instruments down the
+ left hand side. You can manipulate and move blocks of
+ music data (referred to as &ldquo;segments&rdquo;) on the
+ track editor as well as opening the segments themselves in
+ specialised editors (<link
+ linkend="notation-view">notation</link>, <link
+ linkend="matrix-view">matrix</link>, <link
+ linkend="percussion-matrix-view">percussion matrix</link>, and <link
+ linkend="event-view">event list</link>).
+ </para>
+
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-trackeditor.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase>&rosegarden;'s Track Editor showing two segments of music data</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+
+ <para>
+ Tracks govern what sort of segment you can create in a particular
+ place. If you create a segment on an audio track, it will be an audio
+ segment, no matter where that segment subsequently moves. If you
+ create a segment on a &MIDI; track, it will always be a &MIDI;
+ segment. You can set <link linkend="track-parameters">
+ track parameters</link> to pre-select various segment properties at the track
+ level, and to exercise fine control over &MIDI; recording.
+ </para>
+ <para>
+ Tracks can be assigned to a range of &MIDI;, plugin synth, or
+ audio instruments. In the picture above we see three segments
+ in the track editor on tracks assigned to General MIDI
+ instruments.
+ </para>
+
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-trackbutton-labels.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase>&rosegarden;'s Track buttons showing track labels</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+
+ <para>
+ The button area to the left of the segment canvas shows you
+ the track number, mute and record status, and the label of the
+ track. You can mute or unmute a track by clicking on the blue
+ LED-style button, and select a particular track as a record
+ target by clicking on the red one. To change the track label,
+ double-click on it.
+ </para>
+
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-trackbutton-instruments.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase>&rosegarden;'s Track buttons showing instrument assignments</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+
+ <para>
+ Track labels are only shown if the
+ <menuchoice>
+ <guimenu lang="en">Settings</guimenu>
+ <guimenuitem>Show Track Labels</guimenuitem>
+ </menuchoice>
+ menu option is enabled.
+ Otherwise, as in this picture, the instrument assignments for
+ the tracks are shown instead.</para>
+
+ </sect1>
+ <sect1 id="segment-view-instruments">
+ <title>Tracks and instruments</title>
+ <para>
+ Each track must have an instrument assigned to it, in order to
+ be heard. By default the first 16 tracks are assigned to the
+ 16 instruments of the first available MIDI device, and the
+ next 16 tracks are assigned to audio.</para>
+
+ <para>To change the instrument assignment for a track,
+ right-click on the track label: a pop-up menu will appear from
+ which you can select among all the available instruments.
+ </para>
+
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-trackbutton-instrumentmenu.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase>&rosegarden;'s Instrument menu</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+
+ <para>
+ An instrument can be understood as a single channel on a
+ &MIDI; device, or as a mono or stereo audio output or an audio
+ synth plugin. Tracks containing note data should be assigned
+ to &MIDI; or synth plugin instruments, and those containing
+ audio to audio instruments. You can assign more than one
+ track to the same instrument, in which case the multiple
+ tracks will produce sounds in the same way (&MIDI; tracks playing
+ panned to the left with a flute, or audio tracks playing with the same
+ volume levels, through the same stack of <link linkend="studio-plugins">
+ plugins</link>.)
+ </para>
+ <para>
+ You can change various properties of the instrument
+ associated with a track using the <link
+ linkend="segment-view-instrumentparameterbox">Instrument
+ Parameter Box</link>. This is where, for example, you would
+ set a MIDI instrument to use a particular patch and so
+ produce a particular sound (piano, strings etc).
+ </para>
+ <para>
+ See the
+ <link linkend="studio-introduction">Studio</link> section
+ for more about instruments.
+ </para>
+
+ </sect1>
+ <sect1 id="segment-view-creating">
+ <title>Creating segments</title>
+
+ <para>
+ To create an empty segment, in order to begin composing
+ something new, you need to use the pencil tool (which is normally the
+ default active tool when you first start &rosegarden;). Click on
+ the pencil on the toolbar, and then click at the point where
+ you want the segment to start (at the correct height for the
+ track you want the segment to be on, and at a distance
+ across the editor window corresponding to the correct time)
+ and drag rightwards until the segment is the right number of
+ bars long.
+ </para>
+
+ <para>You can also create segments using the <link
+ linkend="segment-view-selector">Select tool</link>, by clicking
+ and dragging either with the middle mouse button, or with the
+ left button and Ctrl held down.</para>
+
+
+ <para>If you want to draw a segment longer than the visible
+ portion of the canvas, the canvas will scroll automatically once you
+ reach its edge. If you keep dragging past the end of the entire
+ composition, you can keep dragging, and will push the end marker right along
+ with you. (This is a welcome contrast to earlier versions of
+ &rosegarden;.)
+ </para>
+
+ <para>
+ Usually each new segment starts on a barline and extends bar
+ by bar, but this snap-to-grid effect can be prevented by
+ holding down Shift while clicking and dragging.
+ </para>
+
+ <para>New segments are created in a yellow colour, with a treble clef by
+ default. You may wish to jump ahead and have a look at <link
+ linkend="track-parameters">track parameters</link> to explore
+ other possibilities.
+ </para>
+
+ <para>If you wish to draw a segment that begins in the middle of an
+ existing segment, hold Ctrl and Alt when clicking. The track will
+ automatically expand to accommodate this new segment. This is especially
+ useful for some situations involving music notation.
+ </para>
+
+ <para>
+ Once you have created a segment, you can then begin editing
+ using the <link linkend="matrix-view">matrix</link>, <link linkend="percussion-matrix-view">percussion matrix</link> or <link
+ linkend="notation-view">notation</link> editors. To use one
+ of these editors, either double-click on the segment, or
+ else click with the right mouse button and choose the editor
+ you want from the context menu.
+ </para>
+
+ <para>
+ If you are intending to <link
+ linkend="recording">record</link> from a MIDI device or audio
+ input, you don't need to create a new segment to record into
+ first -- each separate recording always goes into a new
+ segment, created automatically during recording.
+ </para>
+ </sect1>
+
+ <sect1 id="segment-view-audio-segments">
+ <title>Audio segments</title>
+ <para>
+ An audio segment contains recorded or sampled audio data,
+ instead of editable note-event data. Rosegarden allows you to
+ record, play, arrange and split audio segments, but does not
+ contain audio waveform editing facilities.
+ </para>
+ <para>To create an audio segment, you can <link
+ linkend="recording">record</link> from an audio source onto a
+ track assigned to an audio instrument, or you can work with
+ existing WAV files. To do this, you need to use the audio
+ manager dialog (reached via <menuchoice><guimenu
+ lang="en">File</guimenu><guimenuitem>Manage Audio Files</guimenuitem></menuchoice>).
+ </para>
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-audiofilemanager.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase>The audio file manager</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+
+ <para>You can drag-and-drop audio files from the KDE file
+ browser or your KDE desktop into the audio file manager, or you
+ can open them using its File menu. Then you can either
+ drag-and-drop them onto Rosegarden's track canvas, or use the
+ audio file manager's <menuchoice><guimenu
+ lang="en">Action</guimenu><guimenuitem>Insert into Selected
+ Audio Track</guimenuitem></menuchoice> menu function, provided the current
+ selected track in the main window is assigned to an audio
+ instrument. Newly-recorded audio segments also appear in the
+ audio file manager dialog.</para>
+
+ <para>Details of the audio files associated with a particular
+ composition are saved with that composition, but the audio files
+ themselves are not. You should ensure your document has a
+ sensible audio file search path (via <menuchoice><guimenu
+ lang="en">Composition</guimenu><guimenuitem>Edit Document
+ Properties...</guimenuitem><guimenuitem>Audio</guimenuitem></menuchoice>)
+ so as to keep your audio files accessible together. You can also export
+ your project to a &rosegarden; project package file (.rgp) via
+ <menuchoice><guimenu lang="en">File</guimenu>
+ <guimenuitem>Export</guimenuitem><guimenuitem>Export Rosegarden Project File
+ </guimenuitem></menuchoice> to collect any scattered audio files
+ together in one place.</para>
+
+ <para>The audio manager dialog also shows the sample-rate and
+ other information for each audio file, and marks with an
+ asterisk any audio file whose sample rate does not match that of
+ the current JACK audio session that Rosegarden is using.
+ Rosegarden will resample these files at playback time using a
+ very low quality zero order hold resampler. You are advised to
+ resample them separately using a separate dedicated audio editor
+ instead.
+ </para>
+
+ </sect1>
+
+ <sect1 id="segment-view-manipulating">
+ <title>Manipulating segments</title>
+ <para>
+ The main window contains a selection of "tools" for editing
+ segments. These are available from the main toolbar: first
+ select the tool you want from the toolbar, and then click
+ and drag on the segments on the main canvas.
+ </para>
+
+ <sect2 id="segment-view-selector">
+ <title>The Select tool</title>
+ <para>
+ The select tool <inlinemediaobject>
+ <imageobject>
+ <imagedata fileref="rg-select.png"/>
+ </imageobject>
+ </inlinemediaobject>
+ is actually a
+ multipurpose tool: it can be used to select, move, copy,
+ resize and create segments.</para>
+
+ <para>The most obvious use is
+ selection: select a single segment by clicking on it with
+ the select tool, or select several by clicking with Shift
+ held down, or by clicking in an empty area of the window and
+ dragging out an area.
+ </para>
+
+ <para>To move segments with the select tool, simply click and
+ drag on the segment. To create copies, click and drag with
+ Ctrl held down. To resize a segment, click and drag on the
+ right-hand edge of the segment. To create new segments, click
+ and drag on an empty area either with the middle mouse button
+ or with the left mouse button and Ctrl held down.</para>
+
+ <para>
+ The select tool doesn't replace the other tools completely,
+ though &mdash; sometimes you need to be more precise about
+ which operation you intend, particularly when working on small
+ segments.
+ </para>
+
+ </sect2>
+
+ <sect2 id="segment-view-move-resize">
+ <title>Move and Resize tools</title>
+ <para>To move a segment to a different start time or track,
+ use the move tool <inlinemediaobject>
+ <imageobject>
+ <imagedata fileref="rg-move.png"/>
+ </imageobject>
+ </inlinemediaobject>
+ and click and drag on the segment you want
+ to move. If you hold down the Ctrl key while dragging, the
+ segment will be copied instead of moved.</para>
+
+ <para>To resize a segment, use the resize tool <inlinemediaobject>
+ <imageobject>
+ <imagedata fileref="rg-resize.png"/>
+ </imageobject>
+ </inlinemediaobject>
+ and click and drag on the right-hand end of the segment.
+ Resizing a segment has the effect of extending or
+ shortening it, by subtracting some of its contents or adding
+ silence at the start or end. If you hold down the Ctrl
+ key, the segment will be <link
+ linkend="segment-view-rescale">rescaled</link> (stretched
+ or squashed) instead of extended or shortened.</para>
+
+ <para>For both move and resize you can hold Shift for fine
+ positioning, to avoid snapping to a particular grid position.
+ </para>
+
+ </sect2>
+
+ <sect2 id="segment-view-rescale">
+ <title>Stretching and squashing segments</title>
+ <para>Resizing a segment normally makes it shorter or longer
+ by subtracting content or adding some extra space. However,
+ by holding the Ctrl key while resizing, you can instead
+ stretch or squash the contents of the segment. You can also do this by selecting the segment and then using <menuchoice><guimenu lang="en">Segments</guimenu>
+ <guimenuitem>Stretch or Squash...</guimenuitem></menuchoice>.</para>
+ <para>
+ For segments that contain MIDI events, this re-spaces the
+ events so that they are spread across the new segment's
+ duration, playing back faster or slower than before but in
+ the same relative proportions.
+ </para>
+ <para>
+ For audio segments, this time-stretches the audio, altering
+ its played speed without altering its pitch (as would happen
+ if the audio was simply played back faster or slower).
+ Time-stretching usually adds some audible artifacts as well,
+ so the quality of your results may vary.
+ </para>
+ <para>
+ &rosegarden; does not alter the original audio file when
+ time-stretching an audio segment, and if you rescale the same
+ segment repeatedly it will always work from the original
+ file instead of accumulating timestretching artifacts with
+ each rescale. You can rescale both mono and stereo audio.
+ </para>
+ <para>
+ (For reference, &rosegarden; uses a frequency-domain
+ time-stretcher based on a phase vocoder with phase-locking
+ at percussive transients. This usually produces good
+ results with stable harmonic sounds such as pads and basses
+ as well as purely percussive sounds such as drum loops, but
+ is less effective for composite material or music with soft
+ or breathy note onsets.)
+ </para>
+ </sect2>
+
+ <sect2 id="segment-view-split-join">
+ <title>Split tool</title>
+ <para>
+ You can use the split tool
+ <inlinemediaobject>
+ <imageobject>
+ <imagedata fileref="rg-split.png"/>
+ </imageobject>
+ </inlinemediaobject>
+ to split a single segment
+ into two separate segments. To split your segment, select the
+ split tool and click on the segment you wish to split.
+ </para>
+ <para>
+ By default segments are split on the closest barline to the
+ cursor, but this can be prevented by holding down Shift
+ while splitting the segment.
+ </para>
+
+ </sect2>
+
+ <sect2 id="segment-view-split-by-pitch">
+ <title>Other Split functions</title>
+ <para>The Segments menu contains a number of other Split functions.</para>
+ <variablelist>
+ <varlistentry>
+ <term>Split on Silence</term>
+ <listitem><para><menuchoice>
+ <guimenu>Segments</guimenu>
+ <guimenuitem>Split</guimenuitem>
+ <guimenuitem>Split on Silence</guimenuitem>
+ </menuchoice>
+ splits the selected segments on silences.
+ This function works slightly differently depending
+ on whether the selected segments contain audio or
+ MIDI data. For audio segments, it offers you a
+ dialog in which you can choose a threshold below
+ which the segment is considered "silent"; it then
+ splits the segment whenever its amplitude falls
+ below this threshold. For MIDI segments, it simply
+ splits the segment everywhere that a full bar of
+ silence occurs.
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>Split by Pitch</term>
+ <listitem><para>
+ <menuchoice>
+ <guimenu>Segments</guimenu>
+ <guimenuitem>Split</guimenuitem>
+ <guimenuitem>Split by Pitch...</guimenuitem>
+ </menuchoice>
+ splits the currently selected segments into higher and
+ lower parts.
+
+ This function invokes a dialog allowing you to
+ choose a pitch as a "split point", and then splits
+ the selected segments in half with all the notes on
+ or above that split point in the "higher" segment
+ and all the notes below it in the "lower".
+
+ </para>
+ <para>
+ If the music in the segment consists of two separate
+ parts (e.g. left and right hand piano parts) that
+ are not always completely on either side of a single
+ split point, you may with to select the "ranging
+ split-point" option. If this is selected,
+ Rosegarden will attempt to track the two parts as
+ they move up and down, usually doing a slightly
+ better job of separating out notes that were
+ intended to lie in the two separate parts.
+
+ </para>
+ <para>
+ The resulting segments are both created on the same
+ track, with one overlapping the other.
+
+ </para>
+ </listitem></varlistentry>
+
+ <varlistentry>
+<term>Split by Recording Source</term><listitem><para><menuchoice>
+ <guimenu>Segments</guimenu>
+ <guimenuitem>Split</guimenuitem>
+ <guimenuitem>Split by Recording Source...</guimenuitem>
+ </menuchoice> splits the currently selected segments according to the MIDI channel and device their events were recorded from.</para><para>If you have recorded events from more than one MIDI channel or device into the a single segment, you can use this function to split them into separate segments afterwards. Select the channel or device whose events you want to split out, and the segment will be split into two segments, one containing events from the selected channel or device and the other containing the remaining events. The two segments are both created on the same track, with one overlapping the other.</para><para>See also <link linkend="recording">Recording</link> and <link linkend="track-recording-filters">Track recording filters</link> for more details on how to select the source MIDI channel or device for a recording.</para></listitem></varlistentry>
+
+
+ <varlistentry>
+ <term>Split at Time</term><listitem><para>The <menuchoice>
+ <guimenu>Segments</guimenu>
+ <guimenuitem>Split</guimenuitem>
+ <guimenuitem>Split at Time...</guimenuitem>
+ </menuchoice> function simply splits the currently selected segments into two parts at the time you specify.</para></listitem></varlistentry>
+
+ </variablelist>
+
+ </sect2>
+ </sect1>
+
+ <sect1 id="segment-view-tempo-timesig">
+ <title>Tempo and Time Signature</title>
+
+ <sect2 id="tempo">
+ <title>Tempo in Rosegarden</title>
+ <para>
+ &rosegarden; considers a composition to be accompanied by a
+ single stream of "tempo changes" and "time signature
+ changes", which you can edit to adjust the tempo and the
+ number and structure of beats in each bar.</para>
+
+ <para>A tempo change
+ can be to a constant fixed tempo, or it can be "ramped"
+ &mdash; changing smoothly to a different target tempo at a
+ given future time. Each tempo change takes effect until the
+ following one is reached, so any two consecutive tempo changes
+ together describe a region that will be played at a constant
+ or smoothly ramping tempo.
+ </para>
+
+ <para>
+ Tempo and time signature are related, because &rosegarden;
+ displays tempo in beats per minute, and the duration of a
+ beat depends on the time signature. &rosegarden; only
+ permits a single time signature to be in effect in any given
+ bar (that is, you can't have different time signatures in
+ different tracks). Each new time signature causes a new bar
+ to start, so you can place two time signatures closer
+ together than the natural bar duration in order to obtain a
+ partial bar.
+ </para>
+ </sect2>
+
+ <sect2 id="tempo-ruler">
+ <title>Tempo rulers</title>
+ <para>
+ The &rosegarden; <link linkend="segment-view">track editor</link>, <link
+ linkend="matrix-view">matrix editor</link> and <link
+ linkend="notation-view">notation editor</link> each contain
+ a tempo ruler, which can be optionally displayed at the top
+ of the editing area.</para>
+
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-temporuler.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase>&rosegarden;'s tempo ruler (and the bar and beat ruler beneath it)</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+
+ <para>The tempo ruler shows changes to tempo and time
+ signature throughout the composition, and can be used for
+ editing tempo.</para>
+
+ <para>To increase or decrease the tempo within the range of a
+ single tempo change, click and drag the horizontal line (or
+ sloped line, for ramped tempos) representing that tempo
+ upwards or downwards.</para>
+
+ <para>To insert a new tempo change, right-click on the ruler
+ for a menu and select <guimenuitem>Insert Tempo
+ Change</guimenuitem>. This will insert a new tempo change
+ with the same tempo as the prior one, which you can then drag
+ to increase or decrease.</para>
+
+ <para>You can also click and drag the starting point of a
+ tempo change left or right to move that tempo change to a
+ different time, and you can click and drag the ending point of
+ a tempo change up or down to make the tempo ramp gradually
+ towards an ending tempo value.</para>
+
+ <para>Double-click on the tempo ruler to open the <link linkend="tempo-timesig">tempo and
+ time signature editor</link>.</para>
+
+</sect2>
+
+<sect2 id="tempo-timesig">
+ <title>Tempo and time signature editor</title>
+
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-tempotimesig.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase>&rosegarden;'s tempo and time signature editor</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+
+ <para>The tempo and time signature editor window lists all of the tempo and time signature changes in the composition. You can edit an individual tempo or time signature change by double-clicking on it.</para>
+
+ </sect2>
+
+ <sect2 id="tempo-edit">
+ <title>Changing Tempo</title>
+ <para>
+ You can edit an existing tempo change, or add a new one, by using the <link linkend="tempo-ruler">tempo ruler</link>, by double-clicking on the tempo display in the <link linkend="transport">Transport window</link>, by using the <menuchoice>
+ <guimenu>Composition</guimenu>
+ <guimenuitem>Add Tempo Change...</guimenuitem>
+ </menuchoice> menu function, or by double-clicking on an existing tempo in the <link linkend="tempo-timesig">tempo and time signature editor</link>. Each of these will bring you to some variation of the tempo editing dialog:</para>
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-tempodialog.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase>&rosegarden;'s tempo dialog</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+ <para>To set a new tempo, either dial it into the numeric tempo spinbox at the top, or else click repeatedly on the Tap button at approximately the speed you want and let &rosegarden; work out the tempo for you.
+ </para>
+ <para>By default, a new tempo is "fixed"; that is, the tempo remains constant from the tempo change until the next tempo change is reached. Alternatively, you can tell &rosegarden; to make the tempo ramp smoothly to a particular value, or to the following tempo value, by the point at which the next tempo change is reached. See also <link linkend="tempo">Tempo</link> for more details on tempo handling.</para>
+ </sect2>
+
+ <sect2 id="time-signature">
+ <title>Time signature</title>
+ <para>
+ To change the time signature, use <menuchoice>
+ <guimenu>Composition</guimenu>
+ <guimenuitem>Add Time Signature Change...</guimenuitem>
+ </menuchoice> or double-click on the existing time signature in the <link linkend="transport">Transport window</link> or <link linkend="tempo-timesig">tempo and time signature editor</link>.</para><para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-timesigdialog.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase>&rosegarden;'s time signature dialog</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+ </sect2>
+<sect2 id="tempo-from-segment">
+ <title>Setting tempo from an existing segment</title>
+ <para>&rosegarden; provides two ways to set tempo from a segment that you have recorded or imported:</para>
+ <variablelist>
+ <varlistentry>
+ <term>Audio Segment Duration</term>
+ <listitem><para>Use the <menuchoice>
+ <guimenu>Composition</guimenu>
+ <guimenuitem>Set Tempo to Audio Segment Duration</guimenuitem></menuchoice> function when you have imported or recorded an audio segment that you know is exactly one bar long, and you want to ensure that the tempo for surrounding note events is set appropriately.</para><para>This function uses the duration of the selected segment (which must be an audio segment of a single bar) to work out a single matching tempo setting. It does not analyse the content of the audio segment in any way; it simply looks at how long it is.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>Beat Segment</term>
+ <listitem><para><menuchoice>
+ <guimenu>Composition</guimenu>
+ <guimenuitem>Set Tempos from Beat Segment</guimenuitem></menuchoice> analyses a segment of MIDI events that are assumed to be at beat positions for the current time signature, and sets a series of tempo changes according to the time elapsed between consecutive beats.</para>
+ <para>You can use this to set an overall tempo map for a composition by "tapping" tempo in a recorded segment. For example, you can record from a MIDI keyboard and tap a series of single notes at approximate beat positions, speeding up and slowing down gradually; then select the recorded segment and use this function to set a tempo map that speeds up and slows down to match your tapping.</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </sect2>
+
+ </sect1>
+
+ <sect1 id="markers-ranges-loops">
+ <title>Markers, ranges, and loops</title>
+ <sect2 id="markers">
+ <title>Markers</title>
+
+ <para>Markers are moments in time that have labels. You can
+ create any number of markers in your &rosegarden; composition,
+ to define particular points that you wish to remember the
+ locations of. Marker positions and labels will be saved in
+ your &rosegarden; file.</para>
+
+ <para>Markers are shown in the main ruler at the top of each
+ of &rosegarden;'s editor windows.</para>
+
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-markerloop.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase>A marker and a loop range</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+ <para>To add
+ a new marker, double-click on the marker area (top half) of
+ the ruler to open the marker editor. Make sure &rosegarden;'s
+ playback pointer (see <link linkend="transport">The
+ Transport</link>) is in the location you want to add the
+ marker at, and then click the Add button to add a new marker
+ at the playback position. You can then double-click on the
+ marker's entry in the marker editor window to edit its name or
+ adjust its location.</para>
+
+ <para>Click on the text of a marker in the marker ruler to
+ move the playback pointer directly to that marker.</para>
+
+ <para>You can set a <link linkend="ranges-loops">loop range</link>
+ between two marker positions, by clicking in the area between
+ the markers in the marker ruler with the Shift key
+ pressed.</para>
+ </sect2>
+
+ <sect2 id="quick_marker">
+ <title>Quick Marker</title>
+
+ <para>The quick marker is a special moment in time that can be defined
+ on the fly with a single key (by default Ctrl-1) from the main window
+ (track editor). Once defined it appears as a red line in the loop ruler
+ (it does not appear among other markers, since it does not have a label).
+ At any time when in the track editor you can jump to the quick marker
+ position with a single key (by default simply 1).
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-quickmarker.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase>Quick Marker at the start of the third bar</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+
+ <para>A typical use of the quick marker is when you want to record the same bars
+ on different instruments: after setting the quick marker at the first bar of
+ the working interval, it is easy to jump to the quick marker each time you need
+ to record a new part.</para>
+
+ <para>Note that the quick marker position is not saved in your &rosegarden; file.</para>
+ </sect2>
+
+ <sect2 id="ranges-loops">
+ <title>Ranges and loops</title>
+ <para>
+ &rosegarden; allows you to highlight a period of time in the
+ main ruler, which will be used as a "range" for editing
+ operations and which will be looped during playback.
+ </para>
+
+ <para>To set the current range, click and drag with the Shift
+ key pressed on the subdivided area of the main ruler at the
+ top of the editing window. The range that you drag will be
+ highlighted in white as you drag it, and will snap to the
+ nearest beat boundary at both ends. Any subsequent playback
+ will then be constrained to looping this range.
+ </para>
+
+ <para>You can also set a range between two <link
+ linkend="markers">markers</link> by shift-clicking between the
+ marker positions in the marker ruler, or set a range using the
+ <link linkend="transport-overview">Transport</link> window.
+ The Transport contains small buttons to set the start and end
+ of the current range to the current playback pointer position.
+ Either of these methods allows you to set more precise end
+ points for your range than you can with click-drag.</para>
+
+ <para>To clear a range and restore normal playback, click on
+ the subdivided area of the main ruler with the Shift key
+ pressed, or toggle the loop button on the Transport.</para>
+
+ <para>Note that playback looping when a range is defined is
+ not the same thing as the <link
+ linkend="segment-view-segmentparameterbox">repeating
+ segment</link> function available in the segment parameters
+ (which seamlessly repeats individual segments rather than
+ causing the transport to jump).</para>
+
+ <sect3 id="range-operations">
+ <title>Range editing</title>
+
+ <para>You can carry out edits
+ on the current range in order to cut and paste sections
+ of music that include the relevant parts of all
+ segments, tempos and time signatures within the range.
+ </para>
+
+ <para>Set a range and then use the <menuchoice> <guimenu
+ lang="en">Edit</guimenu> <guimenuitem>Cut
+ Range</guimenuitem> </menuchoice> or
+ <menuchoice><guimenuitem>Copy
+ Range</guimenuitem></menuchoice> menu functions to cut or
+ copy the range to the clipboard.</para>
+
+ <para>You can paste a range using the standard <menuchoice>
+ <guimenu lang="en">Edit</guimenu>
+ <guimenuitem>Paste</guimenuitem></menuchoice> menu function
+ to overlay its contents onto the rest of the composition at
+ the current playback pointer position, or you can use
+ <menuchoice> <guimenu lang="en">Edit</guimenu>
+ <guimenuitem>Paste Range</guimenuitem></menuchoice> to
+ insert the range from the clipboard into the composition at
+ the current playback pointer position.</para>
+
+ </sect3>
+
+ <sect3 id="range-insert">
+ <title>Inserting a range</title>
+
+ <para>You can also insert an empty range at the current
+ playback position using the <menuchoice> <guimenu
+ lang="en">Edit</guimenu> <guimenuitem>Insert
+ Range</guimenuitem> </menuchoice> menu function. You can
+ specify how much space you want to insert, and then all of
+ the segment content, tempos and time signatures following
+ the playback position will be pushed along in time by that
+ duration to leave an empty space.
+ </para>
+ </sect3>
+
+ </sect2>
+ </sect1>
+
+ <sect1 id="triggered-segments">
+ <title>Triggered segments</title>
+
+ <para>A triggered segment is a segment that does not appear on
+ the main canvas and is not positioned at a particular time or
+ on any particular instrument, but is instead triggered during
+ playback by one or more notes in other segments. These
+ triggering notes serve as a shorthand for the full triggered
+ segment, in the same way as written ornaments such as trills
+ in notation serve as shorthand for the notes that make up the
+ trill. One use of triggered segments is in fact for
+ <link linkend="nv-ornaments">playing ornaments</link>.</para>
+
+ <para>Rosegarden can optionally stretch or squash each triggered
+ segment to match the duration of the note that triggers it, and
+ can raise or lower the pitch and velocity of the segment likewise
+ to match. A triggered segment is played on the same instrument as
+ its triggering event.</para>
+
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-triggersegment.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase>&rosegarden;'s Trigger Segment dialog, as reached from the matrix editor</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+
+ <para>Triggered segments are managed through a window available
+ via the <menuchoice> <guimenu
+ lang="en">Segments</guimenu><guimenuitem>Manage Triggered
+ Segments</guimenuitem></menuchoice> option in the main segment
+ canvas. To make a new triggered segment, copy a segment or part
+ of a segment to Rosegarden's clipboard, then use the <menuchoice>
+ <guimenu lang="en">Edit</guimenu> <guimenuitem>Paste as New
+ Triggered Segment</guimenuitem></menuchoice> menu option in this
+ manager window. You can then set a particular note to play this
+ triggered segment instead of the original note, using the
+ <menuchoice> <guimenu lang="en">Adjust</guimenu>
+ <guimenuitem>Trigger Segment...</guimenuitem></menuchoice>
+ function in the matrix or <menuchoice> <guimenu
+ lang="en">Note</guimenu><guimenuitem
+ lang="en">Ornaments</guimenuitem> <guimenuitem>Trigger
+ Ornament...</guimenuitem></menuchoice> function in the notation
+ editor.</para>
+
+ <para>When triggering a segment, you will be offered a choice for
+ how it is played in terms of timing, because the triggered segment
+ (or ornament) may have a different underlying duration from your
+ triggering note. The options for playback timing are:</para>
+
+ <variablelist>
+
+ <varlistentry>
+ <term>As stored</term>
+ <listitem>
+ <para>Play the triggered segment with a start time
+ coinciding with that of the note, and at the original speed.
+ Keep playing the triggered segment until it ends, even if it
+ is longer than the triggering note.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>Truncate if longer than note</term>
+ <listitem>
+ <para>Play the triggered segment with a start time
+ coinciding with that of the note, and at the original speed.
+ If the triggered segment is longer than the triggering note,
+ truncate it so that it ends at the end time of the note.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>End at same time as note</term>
+ <listitem>
+ <para>Play the triggered segment with its end time
+ coinciding with the end of the note, and at the original
+ speed. This means the start of the triggered segment may be
+ chopped off if it is longer than the triggering note.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>Stretch or squash segment to note duration</term>
+ <listitem>
+ <para>Speed up or slow down the triggered segment so that it
+ fits exactly into the duration of the triggering note. This
+ is the default.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ </variablelist>
+
+ <para>A triggered segment may contain silence at the start or end,
+ and this will be "played" (and stretched or squashed if
+ appropriate) as well as the notes and other events in the segment.</para>
+
+ <para>It is not currently possible to make a triggered segment
+ start playing before the start time of its triggering note. You
+ also can't trigger a segment from within another triggered
+ segment, and you can't trigger audio segments.</para>
+
+ <para>To edit the contents of a triggered segment, either
+ double-click on it in the Manage Triggered Segments window, or
+ double-click on any note that triggers it. Apart from editing the
+ notes in the segment, you can also change the duration of the
+ segment itself from the Edit menu of the resulting event list
+ view. Remember that editing a triggered segment will affect all
+ the notes that trigger it, not just the one that you
+ double-clicked to get to the editing window.</para>
+
+ </sect1>
+ </chapter>
+
+ <chapter id="transport">
+ <title>The Transport</title>
+ <para>
+ When you play a composition,
+ &rosegarden; sweeps a playback pointer across
+ the tracks from left to right playing the contents of the
+ segments as it crosses them. The pointer's position on the
+ screen is tracked and controlled by a window called the
+ Transport.
+ </para>
+
+ <sect1 id="transport-overview"><title>Overview</title>
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-transport.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase>&rosegarden;'s Transport window</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+
+ <para>
+ If the Transport isn't visible, you can activate it with <menuchoice> <guimenu lang="en">Settings</guimenu>
+ <guimenuitem>Show Transport</guimenuitem> </menuchoice>.
+ </para>
+
+ <para>The Transport shows the time reached by the playback
+ pointer, in seconds by default.</para>
+
+ <para>You can switch it to show
+ musical time (bar and beat counts), musical time with a flashing
+ visual metronome, or audio sample frame times, using the topmost
+ of the small buttons <inlinemediaobject>
+ <imageobject>
+ <imagedata fileref="rg-button-bar-time.png"/>
+ </imageobject>
+ </inlinemediaobject> on the left of the transport window.</para>
+
+ <para>The
+ button immediately below that <inlinemediaobject>
+ <imageobject>
+ <imagedata fileref="rg-button-from-end.png"/>
+ </imageobject>
+ </inlinemediaobject> toggles the display so as to show
+ time remaining to the end of the composition instead of from the
+ start.</para>
+
+ <para>
+ The main controls on the transport start the sequencer playing
+ and pause it, fast forward the pointer position, rewind it, stop
+ it or jump to beginning or end of composition.
+ </para>
+
+ <para>
+ The transport display also shows the tempo and time signature in
+ effect at the current playback position. Double-click on either
+ of these to insert a new tempo or time signature change. See
+ <link linkend="segment-view-tempo-timesig">Tempo and Time
+ Signature</link> for more ways to adjust these elsewhere in Rosegarden.
+ </para>
+
+ <para>
+ You can also double-click anywhere on the main time display on
+ the transport window, to enter a precise time that you want the
+ playback position to be set to.
+ </para>
+
+ <para>Additional controls and a &MIDI; event display are hidden on
+ the bottom flap on the transport, which can be toggled on or off
+ using the arrow button next to it at the left. Also on this extra
+ portion there are buttons for recording, setting the loop start
+ and end (see <link linkend="ranges-loops">Ranges and loops</link>),
+ soloing individual tracks, turning on or off the metronome (see
+ <link linkend="studio-metronome">Metronomes</link>), and silencing
+ your MIDI devices (the panic button). </para>
+
+ </sect1>
+ <sect1 id="recording">
+ <title>Recording</title>
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-trackbuttons.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase>Track buttons in various states of recording readiness</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+ <para>
+ To record a new segment into a track, first make sure the
+ right tracks are armed for recording by selecting the red
+ (for audio tracks) or yellow (for MIDI tracks) LED-style
+ buttons on the track labels, and then use the <link
+ linkend="transport-overview">Transport's</link> record
+ control. This has the effect of both starting the transport,
+ thus playing the existing composition, and recording into the
+ appropriate track, or tracks.
+ </para>
+ <para>
+ You can record any number of &MIDI; and audio tracks at once so long
+ as your computer is powerful enough, and you have enough disk space.
+ Be careful not to accidentally leave tracks selected when you have
+ finished using them and are trying to record somewhere else.
+ </para>
+ <para>
+ Alternatively you can use punch-in record to separate the acts
+ of starting the transport and entering record mode. Punch-in
+ record is toggled with the <keycap>Space</keycap> bar. You can press
+ <keycap>Space</keycap>
+ while playing a composition to switch instantly between
+ playback and recording without stopping the transport, or you
+ can use <keycap>Space</keycap> to arm for recording when the transport is
+ stopped, so that a subsequent Play will in fact record as
+ well. (The latter is handy when synchronising to an <link
+ linkend="transport-external">external transport</link>.)
+ </para>
+ <para>
+ If you record to MIDI tracks, you will record from the
+ MIDI devices that are selected for recording in the
+ <link linkend="studio-device-editor">MIDI device
+ manager</link>, as filtered through the <link
+ linkend="track-recording-filters">track level recording filter</link>
+ and the global <link linkend="studio-midi-filters">MIDI filters</link>.
+ </para>
+ <para>
+ If you record to audio tracks, your recording to each track
+ will be from the input currently selected for that track's
+ instrument in the <link
+ linkend="segment-view-instrumentparameterbox">instrument
+ parameter box</link>. This will either be an external audio
+ input or an audio submaster or master (for performing
+ mixdowns). If it's an external input, it will by default
+ record from your soundcard's first available physical record
+ in. You may wish to use a JACK connection tool to
+ connect some other JACK audio application to the input
+ instead. See also <link
+ linkend="studio-audio-routing">Audio Routing</link>.
+ </para>
+ </sect1>
+ <sect1 id="transport-external">
+ <title>Synchronising to external transports</title>
+ <sect2 id="transport-jack">
+ <title>JACK Transport</title>
+ <para>
+ Rosegarden supports the JACK transport mechanism for
+ synchronising its transport with other JACK applications on
+ the same computer. To activate it, go to
+ <menuchoice>
+ <guimenu lang="en">Settings</guimenu>
+ <guimenuitem>Configure Rosegarden...</guimenuitem>
+ </menuchoice>
+ and check the <guimenuitem>Use JACK transport</guimenuitem> box.</para>
+
+ <para>When the JACK transport is in use, all of the applications
+ that are subscribed to it share a common transport control, and
+ you can start, stop, and move the transport from any one of
+ them.</para>
+
+ <para>Many Linux audio applications that use the JACK audio
+ server also support JACK transport: consult their
+ documentation for details of whether and how.</para>
+ </sect2>
+ <sect2 id="transport-mtc">
+ <title>MIDI Time Code</title>
+ <para>
+ Rosegarden supports MIDI Time Code (MTC) synchronisation in
+ master and slave modes. This is particularly useful for
+ synchronising the Rosegarden transport with a hardware
+ MTC-capable device, or with software running on other
+ computers connected via MIDI.
+ </para>
+ <para>To make Rosegarden the MTC Master, so that it will
+ control any MTC slave device or application connected to it,
+ go to
+ <menuchoice>
+ <guimenu lang="en">Settings</guimenu>
+ <guimenuitem>Configure Rosegarden...</guimenuitem>
+ </menuchoice>
+ and in the MIDI page's MIDI Sync tab, select "MTC
+ Master" from the MIDI Time Code menu. To make Rosegarden an
+ MTC Slave so that Rosegarden's transport will automatically
+ be synchronised with incoming MTC events, select "MTC
+ Slave".
+ </para>
+ </sect2>
+ </sect1>
+
+ <sect1 id="infrared-remote-controls">
+ <title>Infrared Remote Controls</title>
+ <para>
+ Rosegarden supports infrared remote controls for
+ almost all transport functions. In order to use it,
+ you need either the internal LIRC client, which is
+ an optional feature at Rosegarden's compile time,
+ or the KDE IRKick application (KDE LIRC daemon)
+ that you can find in your Linux distribution's
+ repositories. In both cases, you need to install
+ and configure the LIRC server daemon. The exact
+ details depend on your remote control and receiver,
+ and you should refer to the <ulink url="http://www.lirc.org/html">
+ LIRC web site</ulink> for more information.
+ </para>
+
+ <para>
+ You can find more details online about the internal
+ LIRC client configuration file and IRKick basics, at
+ <ulink url="http://www.rosegardenmusic.com/resources/documents/infrared-remotes.shtml">
+ Rosegarden's web site</ulink>.
+ </para>
+ </sect1>
+ </chapter>
+
+ <chapter id="studio">
+ <title>The Studio</title>
+
+ <sect1 id="studio-introduction">
+ <title>Devices, instruments and connections</title>
+
+ <para>Rosegarden uses the term Studio to refer to everything it
+ knows about the sound systems attached to the computer. This
+ may include &MIDI; and audio hardware and other sound software,
+ and includes information about connections, configuration,
+ &MIDI; patches and so on. The Studio is built-in to every
+ composition you create with Rosegarden.</para>
+
+ <para>Three pieces of terminology are essential here:
+
+ <variablelist>
+
+ <varlistentry>
+ <term>Device</term>
+ <listitem>
+ <para>A <quote>device</quote>, as far as Rosegarden is
+ concerned, is simply something capable of producing
+ sounds. This may be a MIDI or audio device. MIDI
+ devices do not necessarily correspond directly to
+ physical MIDI ports: they are just things with names
+ that you can refer to, expected to work in particular
+ ways. Configuration information such as MIDI patch maps
+ can be attached to devices.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>Instrument</term>
+ <listitem>
+ <para>Each device has a number of
+ <quote>instruments</quote>, each of which is assumed
+ to make a particular sound. These are the things that
+ you can assign tracks to in order to choose which
+ sound they play. By default, a device contains 16
+ instruments, created for you at startup: if the device
+ is a MIDI device, then these will each be initialised
+ to one of the 16 MIDI channels. The instrument is
+ where you set all the properties of a particular
+ voice, such as program settings, reverb, volume etc.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>Connection</term>
+ <listitem>
+ <para>While a MIDI device is simply a name and a
+ collection of configuration information, the
+ <quote>connection</quote> specifies which MIDI port it
+ is physically attached to. This can be configured in
+ the <link linkend="studio-device-editor">MIDI device
+ manager</link>. (Audio and synth plugin devices do not
+ have connections in the same way.)
+ </para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </para>
+
+ <para>For example, imagine a setup consisting of a PC with two
+ physical MIDI ports, one of which has an external synth
+ attached to it. Here you would normally configure Rosegarden
+ so as to have one MIDI device, corresponding to the synth.
+ You could then configure this device with the correct name and
+ patch map, and then specify a connection for it that
+ corresponded to the relevant MIDI port on your soundcard.
+ Each of the 16 default instruments on the device could then be
+ configured with a suitable program, and you would then assign
+ tracks to those.</para>
+
+ <para>
+ In practice, Rosegarden will by default create a device for
+ each of the available connections on startup. So in the
+ example above, two MIDI devices will be created by default
+ even though you only need one. You would generally then
+ rename and apply patch maps to the first, and delete or
+ simply not use the second. Remember that there is no way
+ for Rosegarden to know what synths you actually have plugged
+ in to the MIDI ports on your computer: for this reason, the
+ devices created at startup are just intended to be a default
+ set, and it's up to you to ensure that the devices you
+ configure match those you are really using.
+ </para>
+
+ <para>Once configured, the studio setup is stored with every
+ Rosegarden-format file you save.</para>
+
+ </sect1>
+
+ <sect1 id="studio-device-editor">
+ <title>Managing MIDI devices</title>
+
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-devicemanager.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase>The MIDI device manager</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+
+ <para>
+ The MIDI device manager dialog shows you the MIDI devices
+ that you currently have available to you, and where they are
+ connected. To reach this dialog, use <menuchoice>
+ <guimenu lang="en">Studio</guimenu>
+ <guimenuitem>Manage MIDI Devices</guimenuitem>
+ </menuchoice>.
+ </para>
+
+ <para>
+ As described in the <link
+ linkend="studio-introduction">Devices, Instruments and
+ Connections</link> section, by default Rosegarden tries to
+ provide a plausible set of devices for you at startup, and
+ to make sensible connections for those devices. But the
+ default configuration might not always be suitable, and so
+ this dialog allows you to rename devices and modify their
+ connections and play/record direction.
+ </para>
+
+ <para>
+ Each of the Play devices listed here provides a target for
+ MIDI tracks to talk to: if you add a new Play device, you
+ will then have 16 new instruments on this device which you
+ can assign tracks to. If you then assign a connection for
+ that device, the tracks assigned to it will play to the
+ appropriate channel (depending on the instrument) of any
+ MIDI synth attached to that connection.
+ </para>
+
+ <para> The Record devices listed here represent possible
+ sources for recording MIDI. You can make one or more of them
+ current (so that Rosegarden will listen to them when
+ recording) using the checkboxes on each line, as shown in this
+ dialog. </para>
+
+ </sect1>
+
+ <sect1 id="studio-bank-editor">
+ <title>Managing banks and programs for MIDI devices</title>
+
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-bankeditor.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase>The MIDI bank and program editor</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+
+ <para>
+ Remember that each MIDI device contains a number of
+ instruments, and that you can assign tracks to those
+ instruments. In MIDI terms, each instrument corresponds to
+ a single channel on your MIDI synth. You can choose which
+ of the available voices (sounds) on your synth each
+ instrument uses, but in order to do this, you need to let
+ Rosegarden know the names for all of the available voices.
+ </para>
+
+ <para>
+ This dialog allows you to attach banks of programs (names for
+ voices) to your MIDI devices, thus permitting each
+ instrument on a device to be set to use one of those voices
+ in the <link
+ linkend="segment-view-instrumentparameterbox">Instrument
+ Parameter Box</link>.
+ </para>
+
+ <para>
+ The usual way to set up the program names for a device is
+ simply to import them from one of the supplied device
+ (".rgd") files. To do this, select a device in the list on
+ the left of the dialog, then click the Import button below
+ the list and choose the .rgd file corresponding to your
+ synth.
+ </para>
+
+ <para>
+ If there is no current .rgd file available for your synth,
+ then you can use this dialog to create a new bank. To do this
+ you will have to find the program map in your synth's MIDI
+ Implementation Chart and enter all the names by hand: you can
+ then Export them to a .rgd file to share with other Rosegarden
+ users. Contact the rosegarden-user mailing list if you have
+ made a new .rgd file and would like to share it. (This is how
+ all of the existing .rgd files have come to be included with
+ Rosegarden: other users have contributed them.)
+ </para>
+
+ <sect2 id="studio-keymappings">
+ <title>Percussion Key Mappings</title>
+
+ <para>
+ Many MIDI synthesizers have at least one percussion program,
+ in which each "pitch" plays a different type of sound.
+ Rosegarden contains a dedicated percussion matrix editor to
+ view and edit notes against a scale consisting of the
+ correct names for the pitches, instead of against the
+ conventional piano keyboard pitch scale.
+ </para>
+
+ <para>
+ The key mappings available for a particular MIDI device are
+ also defined in the Rosegarden device (".rgd") file. Each
+ MIDI program that is defined as a percussion program can
+ have a key mapping associated with it; if there is one, then
+ it will be used by default in any track that is assigned to
+ this program. Like program and bank definitions, key
+ mappings can be imported from and exported to .rgd files.
+ </para>
+ </sect2>
+
+ <sect2 id="studio-soundfonts">
+ <title>SoundFonts</title>
+
+ <para>
+ If you happen to be using a soft-synth or soundcard synth
+ that uses SoundFont (.sf2) files, you can simply load the
+ correct program names directly from your .sf2 file into this
+ dialog. Just ask to Import as normal, and then choose the
+ .sf2 file that you are using instead of a .rgd file.
+ </para>
+
+ <para>Note that the Studio only manages information about
+ existing MIDI devices for Rosegarden, it does not actually
+ handle tasks such as loading a SoundFont to your soundcard in
+ the first place. If you want to make sure a SoundFont is
+ loaded to your soundcard when Rosegarden starts up, you should
+ use the special "Load SoundFont to SoundBlaster card at
+ startup" option in the sequencer configuration in
+ <menuchoice>
+ <guimenu lang="en">Settings</guimenu>
+ <guimenuitem>Configure Rosegarden...</guimenuitem>
+ </menuchoice>.
+ </para>
+ </sect2>
+
+ <sect2 id="studio-variations">
+ <title>Variations</title>
+
+ <para>
+ Some MIDI devices (for example, those from Roland)
+ organise their program names using a scheme known as
+ "variations". For these devices, you generally want to
+ select a program by first selecting the basic program name
+ &mdash; such as a piano &mdash; and then selecting one
+ of a set of variations on that program &mdash; such as an
+ electric piano. This is in contrast to General MIDI-based
+ synths, which organise their programs into banks and
+ expect you to choose a bank first and then a program from
+ that bank.
+ </para>
+
+ <para>
+ Rosegarden can support devices that use variations, but
+ you still have to enter the program names in a bank
+ format. Internally, devices that use variations still use
+ MIDI bank select controllers to choose between the
+ variations; you need to find out from your synth's
+ documentation whether your device uses the LSB or MSB bank
+ select to choose variations, and which bank number
+ corresponds to which variation. You can then enter the
+ banks as normal, and use the "Show Variation list based on
+ MSB/LSB" option on the bank dialog to tell Rosegarden to
+ show variations instead of banks when displaying that
+ device in an instrument parameter box.
+ </para>
+ </sect2>
+
+ <sect2 id="studio-midi-import">
+ <title>Program mapping on &MIDI; import</title>
+ <para>
+
+ When you import a &MIDI; file into a composition, &rosegarden;
+ uses the existing studio setup to determine how to map the
+ &MIDI; programs onto &rosegarden; instruments. The aim is to
+ ensure that every &MIDI; program gets mapped to an instrument
+ that really exists in your studio (and thus is actually
+ attached to your computer), so that all the &MIDI; tracks
+ can be heard.
+
+ </para><para>
+
+ The &MIDI; program-change and bank-select events found in the
+ imported file are used when importing, but only as an aid to
+ help find the appropriate instrument for each &MIDI; track
+ from the set of instruments in your studio. So, for
+ example, if your studio is currently set up to contain only
+ <acronym>GM</acronym> instruments, and you import a &MIDI; file with <acronym>GS</acronym> program
+ changes onto it, &rosegarden; will remap the <acronym>GS</acronym> banks back
+ onto <acronym>GM</acronym> because they're all it knows that you have at the
+ time you import the file. It doesn't remember the original
+ <acronym>GS</acronym> program numbers.
+
+ </para><para>
+
+ This means that you should always ensure that your studio is
+ correctly configured for the devices you actually have,
+ before you import the &MIDI; file. Otherwise the program data
+ in the &MIDI; file may be lost.
+
+ </para>
+ </sect2>
+ </sect1>
+
+ <sect1 id="studio-audio-routing">
+ <title>Audio Routing</title>
+ <para>
+ Any Rosegarden track assigned to an audio or synth plugin
+ instrument becomes part of Rosegarden's audio routing
+ architecture. There are 16 audio instruments and 16 synth
+ plugin instruments, and each of these has a set of adjustable
+ parameters including fader level, pan, effects and so on.
+ These are generally configurable in the <link
+ linkend="segment-view-instrumentparameterbox">Instrument
+ Parameter Box</link> or <link
+ linkend="studio-audio-mixer">audio mixer</link>. Each audio
+ instrument also has an input connection, and both audio and
+ synth plugin instruments have an output connection.
+ </para>
+
+ <para>An instrument's input connection defines where Rosegarden
+ will read audio data from when recording to this instrument.
+ The most usual setting would be to one of Rosegarden's external
+ audio inputs, the number of which is configurable in the <link
+ linkend="studio-audio-mixer">audio mixer</link>. These
+ correspond to JACK audio ports exposed by Rosegarden, to which
+ you can connect outputs from any other JACK audio application or
+ soundcard capture ports using an external JACK router
+ application such as <ulink
+ url="http://qjackctl.sf.net/">QJackCtl</ulink>. You can also
+ set an instrument's audio input to the output of one of
+ Rosegarden's built-in audio submasters or master output for
+ mixdowns.
+ </para>
+ <para>An instrument's output connection defines where the audio
+ goes when played. Instruments default to sending their audio to
+ Rosegarden's master output, which is another (stereo pair of)
+ external JACK port(s) that can then be connected up using the
+ same external JACK router. However, Rosegarden also supports up
+ to eight internal submaster busses, to which you can send
+ instrument outputs instead so as to group instruments into
+ related categories. You can control the number and routing of
+ these in the <link linkend="studio-audio-mixer">audio
+ mixer</link>.
+ </para>
+ <para>
+ Rosegarden currently supports effects using a set of pre-fader
+ insert effects slots for each audio instrument. You cannot
+ yet assign effects to the submaster busses, and Rosegarden
+ does not yet support send effects, although you can obtain
+ similar results using an external JACK effects and mixing
+ architecture.
+ </para>
+ <para>Some further details of audio routing configuration,
+ mixing, and effects are discussed in the <link
+ linkend="studio-audio-mixer">audio mixer</link>, <link
+ linkend="segment-view-instrumentparameterbox">instrument
+ parameter box</link> and <link
+ linkend="studio-plugins">audio plugins</link> sections.</para>
+ </sect1>
+
+ <sect1 id="studio-midi-routing">
+ <title>MIDI Routing</title>
+ <para>&rosegarden; is able to instantly send incoming MIDI events to
+ some output device and MIDI channel. This feature is known as MIDI Thru.</para>
+ <para>MIDI Thru is enabled by default in &rosegarden;. You may want
+ to globally disable it using the menu option <menuchoice>
+ <guimenu lang="en">Studio</guimenu>
+ <guimenuitem>MIDI Thru Routing</guimenuitem></menuchoice>, if you prefer
+ to use an external MIDI routing system. There is also a global filter by
+ MIDI event type, which you may use to ignore some event types and let other
+ types to be routed. It is explained in the section <link linkend="studio-midi-filters">
+ MIDI filters</link>.</para>
+ <para>MIDI Thru routing works quite differently when &rosegarden; is playing
+ or stopped than when it is recording.</para>
+ <itemizedlist>
+ <listitem><para>When &rosegarden; is playing or in stopped state, the MIDI
+ thru function routes events to the selected track instrument. The selected
+ track has its track name highlighted.</para></listitem>
+ <listitem><para>When &rosegarden; is recording, the MIDI events are routed
+ to the armed track instruments, based on the <link linkend="track-recording-filters">
+ recording filters</link>. It doesn't
+ matter which track is selected. Only one instrument is selected for each event,
+ corresponding to the first track with a matching record filter.</para>
+ </listitem>
+ </itemizedlist>
+ </sect1>
+
+ <sect1 id="studio-audio-mixer">
+ <title>The Audio Mixer</title>
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-audiomixer.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase>&rosegarden;'s Audio Mixer</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+
+ <para>
+ Rosegarden's audio mixer window, reached through
+ <menuchoice>
+ <guimenu lang="en">Studio</guimenu> <guimenuitem>Audio
+ Mixer</guimenuitem></menuchoice>, resembles a hardware audio
+ mixer and provides a way to see and change the state of a
+ number of audio instruments at once. It contains many of
+ the same controls as found in the audio and synth plugin
+ <link
+ linkend="segment-view-instrumentparameterbox">instrument
+ parameter boxes</link>, most importantly a playback level
+ meter and fader control for each audio and synth plugin
+ instrument, as well as routing controls, pan, mono/stereo
+ and effects plugin slots.
+ </para>
+ <para>
+ The audio mixer window is also where you see and control the
+ master audio output level (at the far right of the picture
+ above), as well as the record level (to the left of the master
+ fader) and submaster output levels.
+ </para>
+ <para>
+ The audio mixer's <menuchoice> <guimenu
+ lang="en">Settings</guimenu></menuchoice> menu is particularly
+ relevant. Apart from controlling what will be shown in the
+ mixer window, this menu also contains the <link
+ linkend="studio-audio-routing">audio routing</link> settings
+ for the number of stereo audio record inputs available and the
+ number of submasters. These are studio settings whose values
+ are saved with your Rosegarden format file.</para>
+
+ <para>Note that if you are not actually using any submasters
+ (i.e. if there are no instruments configured to route their
+ output to a submaster) you may see a small performance
+ improvement if you set the number of submasters explicitly to
+ None, rather than keeping unused ones in the configuration.
+ </para>
+ </sect1>
+
+ <sect1 id="studio-midi-mixer">
+ <title>The MIDI Mixer</title>
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-midimixer.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase>&rosegarden;'s MIDI Mixer</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+ <para>
+ Rosegarden's MIDI mixer window, reached through
+ <menuchoice>
+ <guimenu lang="en">Studio</guimenu> <guimenuitem>MIDI
+ Mixer</guimenuitem></menuchoice>, provides a way to see and
+ edit the <link
+ linkend="segment-view-instrumentparameterbox-midi">instrument
+ parameter values</link> for a number of MIDI instruments at once.</para>
+
+ <para>The window is organised using a tabbed pane. Along the
+ bottom, you will see one tab for each playback MIDI device in
+ your studio configuration. When you select a device tab, the
+ rest of the window will update to show the controls for the 16
+ instruments of that device.
+ </para>
+
+ <para>
+ The controls shown for each instrument are those set up in the
+ <!-- !!! link linkend="studio-device-controllers" --> control
+ parameter manager, as well as volume (corresponding to the
+ MIDI volume control change, not to MIDI velocity or audio dB
+ levels) and an approximate output level indicator.
+ </para>
+ </sect1>
+
+ <sect1 id="studio-plugins">
+ <title>Audio Plugins</title>
+ <para>An audio plugin is a piece of software, separate from
+ Rosegarden, that Rosegarden can load and use in order to perform
+ a particular audio processing task. These can be broadly
+ divided into effects plugins and synth plugins. Effects plugins
+ take an audio input and manipulate it to produce a different
+ audio output; synth plugins take MIDI-like events as input and
+ turn them into audio output. Rosegarden uses the Linux standard
+ LADSPA plugin API for effects and the DSSI plugin API for
+ synths, permitting the use of large numbers of open-source
+ plugins made available by many developers.
+ </para>
+ <para>The use of plugins has a cost in CPU time, as audio
+ processing in real time usually takes a significant amount of
+ work even on a modern CPU. It also has a potential cost in
+ reliability: when Rosegarden is running a plugin, if the plugin
+ hangs or crashes, so does Rosegarden. Many plugins are very
+ reliable, but it's inevitable that some will not be so well
+ tested.
+ </para>
+ <sect2 id="studio-plugins-effects">
+ <title>Effects plugins</title> <para>An effects plugin is
+ something that you can use to modify an audio signal in a
+ controllable way. Examples include reverb, delay effects,
+ dynamic compression and so on.
+ </para>
+ <para>Every audio or synth-plugin instrument in Rosegarden has
+ five associated effects slots. By default these are empty,
+ but you can load plugins into them in order to chain up to
+ five effects onto the audio signal before it goes through
+ fader level and pan processing.</para>
+
+ <para>To load a plugin to a slot, click its button on the
+ <link linkend="segment-view-instrumentparameterbox-audio">instrument
+ parameter box</link>:
+ </para>
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-pluginbuttons.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase>Plugin Slot Buttons</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+ <para>(These buttons are also optionally available in the <link
+ linkend="studio-audio-mixer">audio mixer</link> window.)
+ </para>
+ <para>Clicking a plugin button will
+ pop up the plugin dialog. This shows you
+ the available categories of effects in the first menu; select
+ one, and you can then choose your plugin in the second menu.
+ </para>
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-plugin-dialog.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase>A &rosegarden; Plugin Dialog</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+
+ <para>Below the plugin selection menus, the dialog gives you a
+ varying number of rotary controllers showing all the
+ modifiable parameters for the plugin you have selected. To
+ change a value, just click a rotary and drag up and down or
+ left and right. (Up or right to raise the value, down or left
+ to lower it.) You can also roll the mouse wheel to change the
+ value, or click with the middle mouse button to reset it to
+ its initial default.</para>
+
+ <para>It is also possible to copy one plugin with its current
+ configuration into another slot, so as to use the same plugin
+ settings with more than one instrument, or to base one plugin
+ configuration on another. Just click the Copy button when you
+ have the plugin set up the way you want it, and then open
+ another plugin slot's plugin dialog and click Paste.</para>
+
+ <para>Finally, you can use the Bypass toggle to remove a
+ plugin temporarily from processing while retaining its
+ configuration.
+ </para>
+ </sect2>
+ <sect2 id="studio-plugins-synths">
+ <title>Synth plugins</title>
+ <para>
+ Synth plugins can be used in place of hardware or standalone
+ soft-synth MIDI devices, to generate sounds from your note
+ event segments.</para>
+
+ <para>Using a synth plugin gives you somewhat better control
+ and repeatability than using an external MIDI device, because
+ Rosegarden will be able to load the correct plugins for you
+ and use the correct settings the next time you load your same
+ file. Plugins may also offer better timing resolution than
+ external MIDI devices, and synth plugin instruments have the
+ advantage of being routable like audio instruments, which also
+ means you can add effects plugins on top of them.
+ </para>
+
+ <para>To make use of a synth plugin, first <link
+ linkend="segment-view-instruments">assign a track</link> to a
+ synth plugin instrument, and then load a synth plugin by
+ clicking on the topmost button in the <link
+ linkend="segment-view-instrumentparameterbox-synth">instrument
+ parameter box</link>:</para>
+
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-synthpluginbuttons.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase>Synth Plugin Buttons</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+
+ <para>This will bring up the same plugin dialog as shown above
+ for effects plugins, but with a list of synth plugins instead
+ of effects. Once again, you will be shown the particular set
+ of rotary parameters for the synth you have selected. Synth
+ plugins may also have "programs", selectable from a menu --
+ this menu will only appear if you have chosen a synth that supports
+ them. When you have selected and configured a synth plugin
+ for an instrument, any MIDI data on tracks assigned to that
+ instrument should play through that synth, as should
+ incoming MIDI data during recording or monitoring.
+ </para>
+ </sect2>
+
+ <sect2 id="studio-plugins-guis">
+ <title>Plugin native editor windows</title>
+
+ <para>Most plugins can be controlled completely using the
+ rotary controllers in Rosegarden's plugin dialog. However, a
+ few plugins (generally synths) also have their own editor
+ windows which can be switched on or off from Rosegarden and
+ which may provide more complete or more organised
+ controls.</para>
+
+ <para>When you select a plugin that has its own editor window,
+ the button at the lower left of the plugin dialog labelled
+ "Editor" will become active:</para>
+
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-plugineditorbutton.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase>A Plugin Editor Button</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+
+ <para>(For synth plugins, there is a similar button in the
+ instrument parameter box.) Clicking this button should show
+ the plugin's own editor window. Any changes you make in this
+ editor window should also be reflected in Rosegarden's own
+ plugin dialog, if visible, and of course should be saved in
+ your Rosegarden file as normal.</para>
+ </sect2>
+ </sect1>
+
+ <sect1 id="studio-metronome">
+ <title>Metronomes</title>
+ <para>
+ Rosegarden has two built-in metronomes, one for use during
+ recording and one that can be switched on during normal
+ playback. They work by sending notes to a MIDI instrument,
+ and both metronomes use the same instrument, pitch and
+ velocity information.
+ </para>
+
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-metronome.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase>&rosegarden;'s metronome configuration dialog</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+ <para>
+ To configure the metronomes, use
+ <menuchoice>
+ <guimenu lang="en">Studio</guimenu>
+ <guimenuitem>Manage Metronome</guimenuitem>
+ </menuchoice>
+ to bring up the metronome dialog.
+ Here you can select a MIDI instrument for the metronome and
+ choose the metronome's resolution (whether it should tick
+ once per beat, once per subdivision of a beat, or only once
+ per bar), pitch, and velocities. Properties such as the
+ actual voice the MIDI synth uses for the metronome tick
+ depend on the instrument selected, just as the voice used
+ for a MIDI track depends on the instrument that track is
+ assigned to. You can configure the instrument by assigning
+ a track to it on the main window and selecting the correct
+ program from the instrument parameter box.
+ </para>
+
+ <para>
+ The record and play metronomes can be switched on or off
+ from the Transport window, using the metronome button. This
+ button controls the record metronome when recording is armed
+ or in progress, and the play metronome at other times. By
+ default, the record metronome is switched on and the play
+ metronome switched off.
+ </para>
+
+ <para>
+ Rosegarden also has a "visual metronome": the transport window
+ can be told to flash brightly to mark each beat. See <link
+ linkend="transport">the Transport section</link> for more
+ details.</para>
+ </sect1>
+
+ <sect1 id="studio-midi-filters">
+ <title>MIDI filters</title>
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-midifilter.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase>The MIDI filter dialog</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+
+ <para>
+ Using this dialog you can decide which MIDI events Rosegarden
+ will ignore or accept, either when forwarding events using
+ MIDI THRU or when simply recording them. Use the check boxes
+ on this dialog to tell Rosegarden which types of MIDI events
+ you don't want to forward or record.
+ </para>
+
+ </sect1>
+
+
+ <sect1 id="studio-external-controllers">
+ <title>External MIDI control surfaces</title>
+ <para>
+ Rosegarden's audio and MIDI mixer windows and main canvas can
+ also be controlled to some degree by an external MIDI device.
+ To set this up, you will need to use an ALSA MIDI connection
+ manager such as qjackctl to connect your MIDI controller
+ device to Rosegarden's "external controller" input and output
+ MIDI ports.
+ </para>
+ <para>
+ Rosegarden accepts MIDI control change messages to adjust the
+ mixer track corresponding to the incoming MIDI channel on each
+ controller event, and also sends out MIDI messages when
+ something is changed in a mixer track in order to support
+ controllers with powered faders or knobs.
+ </para>
+ <para>Rosegarden accepts MIDI controller number 81 to change the
+ currently active window. Send controller 81 with data value 0-9
+ to select the main window, 10-19 to select the audio mixer
+ window or 20-29 to select the MIDI mixer window.</para>
+ <para>Rosegarden accepts MIDI controller number 82 to change the
+ currently selected track in the main window. The stepping of
+ this controller depends on the number of tracks in the window --
+ the ratio of controller data value to track number will be
+ calculated so as to use the full MIDI controller data range,
+ provided there are no more than 128 tracks in the window.</para>
+ </sect1>
+
+ </chapter>
+
+ <chapter id="segment-instrument-parameters">
+ <title>Special Parameters</title>
+
+ <sect1 id="track-parameters">
+ <title>The Track Parameter Box</title>
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-trackparameterbox.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase>&rosegarden;'s track parameter box</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+ <para>
+ The track parameter box can be found at the left side of the
+ &rosegarden; main window. It displays the parameters for the
+ currently selected track. (If you can't see it, try using <menuchoice>
+ <guimenu lang="en">Settings</guimenu>
+ <guimenuitem>Show Special Parameters</guimenuitem>
+ </menuchoice>.)
+ </para>
+ <para>
+ It allows you to assign instruments to tracks, control what
+ incoming &MIDI; data from which sources will be recorded to
+ particular tracks, control staff attributes (currently only for LilyPond
+ export,) make selections that govern how &MIDI; segments
+ will be created for each track that is assigned to a non-audio
+ instrument, and apply these selections to existing segments (as when
+ converting a trumpet part from an imported &MIDI; file to be
+ represented as notation playable by a real human on a real instrument,
+ for example.)
+ </para>
+ <para>This box is divided into three sections:</para>
+ <sect2 id="track-playback-parameters">
+ <title>Playback parameters</title>
+ <para>
+ These provide an alternative mechanism to the <link
+ linkend="segment-view-instruments">menu-based
+ system</link> of instrument assignment.
+ </para>
+ </sect2>
+ <sect2 id="track-recording-filters">
+ <title>Track recording filters</title>
+ <para>
+ These provide you a way to control what events are recorded to this track. If you leave the default values ("all") for both parameters, every received event will be stored in the track. This setting is safe and convenient if you are recording only one MIDI track. Otherwise, you should adjust one or both parameters to select only the desired events for the track.
+ </para>
+ <variablelist>
+ <varlistentry>
+ <term>Device</term>
+ <listitem>
+ <para>You can record from only one of the available devices marked for recording in the <link linkend="studio-device-editor">device manager</link>, or from all of them simultaneously.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>Channel</term>
+ <listitem>
+ <para>You can record from all channels, or limit recording to only one of the 16 available MIDI channels. In this case, only MIDI channel messages matching the channel number will be recorded, and system messages not having a channel (as system exclusive events) will be discarded.</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ <para>
+ Both parameters are cummulative: you can filter only a device, only a channel, or both a device and a channel simultaneously. It is not mandatory to ensure mutually exclusive selections for all the armed tracks, but if you don't do so you will find duplicated events at several recorded tracks.
+ </para>
+ <para>
+ The recording filters are also used to <link linkend="studio-midi-routing">route MIDI events </link> to the assigned track instrument when you are recording.
+ </para>
+ </sect2>
+ <sect2 id="track-staff-params">
+ <title>Staff export options</title>
+ <para>
+ These provide you with a means of exporting notation to render
+ at either normal, small, or tiny size (eg. for printing certain
+ parts at cue size,) and allow you to export a variety of nested
+ brackets.
+ </para>
+ <para>
+ You are responsible for creating a series of bracket start and
+ end markers that will yield a functional result, and if you make
+ a mistake with these, it is likely that your file will not
+ export or preview correctly in LilyPond.
+ </para>
+ <para>For a detailed, hands-on demonstration of brackets in action,
+ please see
+ <ulink url="http://rosegarden.sourceforge.net/tutorial/supplemental/fidelio/fidelio.html">this
+ online tutorial.</ulink>
+ </para>
+ </sect2>
+ <sect2 id="track-create-with">
+ <title>Create segments with</title>
+ <para>
+ These provide you with a means of controlling many of
+ the <link
+ linkend="segment-view-segmentparameterbox">segment
+ parameters</link> for segments that don't yet
+ exist. They are aimed especially at notation users,
+ and they facilitate operations that require you to use
+ more than one segment on a track (as when using
+ <!-- link -->repeats, or <link
+ linkend="nv-lilypond-directives">alternative
+ endings</link>), by allowing you to create a series of new
+ segments that all have the same properties by default.
+ </para>
+ <para>
+ <variablelist>
+
+ <varlistentry>
+ <term>Preset</term>
+ <listitem>
+ <para>
+ The <guimenuitem>Load</guimenuitem> button
+ launches a dialog that allows you to pick
+ a pre-defined collection of parameters
+ that provide guidelines for how you should
+ write parts for real-world instruments, and
+ optionally convert any existing segments on this
+ track to take on these new parameters.
+ <!-- needs a tutorial somewhere, and a link to
+ that tutorial DMM -->
+ </para>
+ <para>
+ <inlinemediaobject>
+ <imageobject>
+ <imagedata fileref="rg-loadpreset.png" format="PNG"/>
+ </imageobject>
+ </inlinemediaobject>
+ </para>
+ <para>
+ You first pick a Category, then an Instrument,
+ and finally choose whether you wish to write a
+ part for an amateur or a professional player.
+ <footnote><para>This database was compiled by
+ Magnus Johansson, who deserves all the special
+ mention we can muster for his outstanding effort
+ on this.</para></footnote> The Scope controls
+ allow you to choose whether these parameters
+ will only affect segments that don't yet exist
+ (which you will subsequently record, or draw
+ with the pencil) or should convert any existing
+ segments to take these parameters as well. (For
+ a demonstration of the latter case in action,
+ please see
+ <ulink url="http://rosegarden.sourceforge.net/tutorial/supplemental/fidelio/fidelio.html">
+ this online tutorial.)</ulink>
+ Clicking the <guimenuitem>OK</guimenuitem>
+ button injects the appropriate parameters into
+ the remaining widgets in this part of the track
+ parameters box, where you can tweak them if you
+ desire.<footnote><para>No facility is provided
+ at this time for assembling your own database of
+ presets, or customizing the existing ones in a
+ permanent way.</para></footnote> </para>
+ <para>
+ Once you have loaded a preset, the name of
+ your chosen preset will be used as the label
+ for any segments you subsequently draw or
+ record on this track, even if you change some
+ or all of the associated parameters away from
+ the values you just loaded.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>Clef</term>
+ <listitem>
+ <para>This lets you choose the clef for any
+ segments you subsequently draw or record on
+ this track. Clefs are events, not properties.
+ Your segments will be created with an initial
+ clef event of the appropriate type (which you
+ may subsequently alter or delete, should you
+ have some occasion to do so.)
+ </para>
+ <para>
+ The clefs available include a variety of named
+ clefs representing standard clefs with various
+ octave offsets.
+ </para>
+ <!-- !!! I would enumerate this list, but I have
+ no idea how to do it in docbook. I'm just winging
+ it by the seat of my pants here. Why do you think
+ I avoided touching this hateful mess until now? I
+ wrote Rosegarden Companion using OO.o, and didn't
+ touch tag one. Wah. -->
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>Transpose</term>
+ <listitem>
+ <para>
+ This causes segments on this track to be
+ created so that their note events sound at a
+ given transposition. Useful, especially, for
+ writing parts for transposing instruments.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>Colour</term>
+ <listitem>
+ <para>
+ This causes segments on this track to be
+ created using a given colour.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>Range</term>
+ <listitem>
+ <para>
+ The <guimenuitem>Low:</guimenuitem> and
+ <guimenuitem>High:</guimenuitem> buttons,
+ launch a dialog that allows you to pick a
+ pitch using a staff. The lowest and highest pitches
+ you select will then appear right on these
+ buttons.
+ </para>
+ <para>
+ These represent the lowest and highest
+ playable notes, respectively, on the instrument for which you
+ are writing notation. In some cases, these
+ limits will be hard and fast, like the low B
+ on a Transverse Flute (B foot). In others,
+ they may only serve as guidelines to help you
+ make good choices for instruments with which
+ you are not intimately familiar.
+ </para>
+ <para>
+ If you enter, record, or import data that has
+ pitches exceeding the values specified, the
+ note heads will appear in red by default. You
+ can turn this behavior off with
+ <menuchoice><guimenu>Settings</guimenu><guimenuitem>Configure
+ Rosegarden</guimenuitem><guimenuitem>Notation</guimenuitem><guimenuitem>Show
+ notes outside playable range in
+ red</guimenuitem></menuchoice>
+ </para>
+ </listitem>
+ </varlistentry>
+
+ </variablelist>
+ </para>
+ </sect2>
+
+ </sect1>
+
+ <sect1 id="segment-view-segmentparameterbox">
+ <title>The Segment Parameter Box</title>
+
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-segmentparameterbox.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase>&rosegarden;'s segment parameter box</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+
+ <para>
+ The segment parameter box can be found at the left side of the Rosegarden main window. (If you can't see it, try using <menuchoice>
+ <guimenu lang="en">Settings</guimenu>
+ <guimenuitem>Show Special Parameters</guimenuitem>
+ </menuchoice>.)
+ It allows you to modify some aspects of the
+ selected segments.</para><para>If a single segment is currently selected, its
+ parameters will be shown in the segment parameter box and can be
+ edited there. If several segments are selected, the parameter box
+ will only show the current values where they are the same for all
+ of the selected segments -- but you can still edit them, and your
+ changes will apply to the whole selection.
+
+ <variablelist>
+ <varlistentry>
+ <term>Label</term>
+ <listitem>
+ <para>Shows the label of the selected segment (or segments, if
+ they all have the same label). Click the "Edit" button to edit
+ the label.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>Repeat</term>
+ <listitem>
+ <para>Switches repeat on or off for the selected segments. A
+ repeating segment will repeat until the start of the following
+ segment on the same track, or until the end of the composition
+ if there is no following segment.</para>
+
+ <para>The repeated parts of a repeating segment are shown on
+ the main canvas in a fainter colour than the original segment.
+ You can turn them into real editable copies of the original
+ segment either by using
+ <menuchoice>
+ <guimenu lang="en">Segments</guimenu>
+ <guimenuitem>Turn Repeats into Copies</guimenuitem>
+ </menuchoice>, or simply by double-clicking on the
+ individual repeating blocks.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>Quantize</term>
+ <listitem>
+ <para>
+ Shows the quantization setting for the selected
+ segments. You can change this to quickly quantize
+ the start times of all their notes. For more
+ advanced quantization, use <menuchoice>
+ <guimenu lang="en">Segments</guimenu>
+ <guimenuitem>Quantize...</guimenuitem>
+ </menuchoice>. See <link
+ linkend="quantization">Quantization</link> for more
+ details.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>Transpose</term>
+ <listitem>
+ <para>Shows the transposition (in semitones) currently applied
+ to the selected segments. This transposition is applied when
+ the segment is played, and is not shown in the notes displayed
+ in the matrix, notation or event list editors. You can use
+ this to quickly change the pitch of part or all of a
+ composition, and it is commonly used with segments containing
+ notation written for transposing instruments, such as the
+ clarinet.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>Delay</term>
+ <listitem>
+ <para>Shows the delay currently in effect on the selected
+ segments. You can set a delay here in order to cause an entire
+ segment to play later than written. This delay is applied when
+ the segment is played, and is not shown in the notes displayed
+ in the matrix, notation or event list editors.
+ </para>
+ <para>
+ You can set a delay either in musical time (by
+ choosing a note duration from the delay dropdown),
+ in which time the exact delay will depend on the
+ tempo, or in real time (by choosing a time in
+ milliseconds from the dropdown).
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>Colour</term>
+ <listitem>
+ <para>Shows the colour being used for the display of the
+ selected segments. You can choose another colour from the
+ dropdown, or choose the "Add New Colour" option if you want a
+ colour not in the dropdown.
+ </para>
+ <para>
+ You can also manage and rename colours using
+<menuchoice>
+ <guimenu lang="en">Composition</guimenu>
+ <guimenuitem>Edit Document Properties...</guimenuitem>
+ </menuchoice>
+ (then choose the Colour page on the document properties
+ dialog). The modified colour palette will be saved
+ with the composition in the Rosegarden file.
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-colours.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase>&rosegarden;'s colour manager</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+ </listitem>
+ </varlistentry>
+
+ </variablelist>
+ </para>
+ </sect1>
+
+ <sect1 id="segment-view-instrumentparameterbox">
+ <title>The Instrument Parameter Box</title>
+ <para>
+ The instrument parameter box can be found at the left side of
+ the Rosegarden main window, near the <link
+ linkend="segment-view-segmentparameterbox">Segment Parameter
+ Box</link>. (If you can't see it, try using
+ <menuchoice> <guimenu lang="en">Settings</guimenu>
+ <guimenuitem>Show Special
+ Parameters</guimenuitem> </menuchoice>.)</para>
+
+ <para>It shows you
+ which instrument is assigned to the current selected track,
+ and contains all of the editable controls for that instrument.
+ Remember that because any number of tracks can be assigned to
+ the same instrument, the settings in this box may affect more
+ than one track at a time.</para>
+
+ <para>The layout and contents of the instrument
+ parameter box depend on the type of instrument: MIDI, audio,
+ or synth plugin.
+ </para>
+
+ <sect2 id="segment-view-instrumentparameterbox-midi">
+ <title>MIDI Instrument Parameters</title>
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-ipb-midi.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase>&rosegarden;'s instrument parameter box for a MIDI instrument</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+ <para>When you select a track assigned to a MIDI instrument,
+ the instrument parameter box shows MIDI parameters.
+ </para>
+ <para>At the top, this box
+ shows the name of the instrument and the connection that its
+ device is using.
+ </para>
+ <para>Below that, you can see and edit the MIDI
+ channel number and the <link linkend="studio-bank-editor">bank
+ and program</link> settings that should be sent to the
+ instrument at the start of playback (including a "percussion"
+ toggle that controls whether only percussion programs should
+ be offered in these settings).</para>
+
+ <para>Finally this box shows you the <!-- !!! link
+ linkend="studio-device-controllers" --> controllers available
+ for this device (those for a General MIDI device are shown
+ above). Any settings you make here will be sent to this
+ instrument's channel at the start of playback.</para>
+ </sect2>
+
+ <sect2 id="segment-view-instrumentparameterbox-audio">
+ <title>Audio Instrument Parameters</title>
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-ipb-audio.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase>&rosegarden;'s instrument parameter box for an audio instrument</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+ <para>
+ When you select an audio track, the instrument parameter
+ box shows audio parameters.
+ </para>
+ <para>
+ The box has two main faders, one with a blue surround for
+ playback level and the other with a red surround for the
+ record level when recording to this instrument. Between
+ them is a playback level meter.
+ </para>
+ <para>The two menus at the top of the box are used to select
+ the input and output <link linkend="studio-audio-routing">audio routing</link> for this
+ instrument. Below them you can select whether the instrument
+ is mono or stereo, and the pan setting for position in the
+ stereo field. (Audio instruments are always ultimately
+ stereo, because the pan setting is always applied. But if you
+ set the instrument to mono, it will reduce any audio data and
+ effect outputs to mono before applying pan.)
+ </para>
+ <para>The column of five buttons at lower left are the effects
+ slots. Click on them to select and activate plugin effects
+ for this audio instrument, and to control them using the <link linkend="studio-plugins">plugin editor dialog</link>. These are insert effects,
+ applied in order from top to bottom before the fader and pan.
+ </para>
+ </sect2>
+
+ <sect2 id="segment-view-instrumentparameterbox-synth">
+ <title>Synth Plugin Instrument Parameters</title>
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-ipb-synth.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase>&rosegarden;'s instrument parameter box for a synth plugin instrument</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+ <para>When you select a track assigned to a synth plugin
+ instrument, the instrument parameter box shows synth
+ parameters. You will notice that although a synth plugin
+ track uses segments with MIDI data in them, in terms of
+ control and routing it behaves more like an audio track.
+ </para>
+ <para>The most important control here is the button at top
+ left (saying Xsynth in the above picture) which shows the name
+ of the synth plugin in use for this instrument. Click this to
+ select a particular synth and control it in the standard
+ Rosegarden <link linkend="studio-plugins">plugin editor dialog</link>. Once
+ you've selected a plugin, you may also be able to click the
+ Editor button below it in order to open a dedicated GUI editor
+ for the particular plugin (if the plugin has one).
+ </para>
+ <para>The remaining controls here are the same as for audio
+ instruments: the playback fader, playback level, output
+ routing, mono/stereo and pan settings and effects slots are
+ all exactly the same.</para>
+ </sect2>
+
+ </sect1>
+ </chapter>
+
+ <chapter id="quantization">
+ <title>Quantization</title>
+ <para>
+ "Quantization" is the process of repositioning notes and other
+ events so that they start or finish on exact beat divisions. It
+ is traditionally used to make an approximate performance into a
+ precise but rather mechanical-sounding one -- either because
+ precision is the desired effect, or for reasons such as making
+ the notes clearer in notation.
+ </para>
+
+ <para>
+ For general quantization, use
+ <menuchoice>
+ <guimenu lang="en">Segments</guimenu>
+ <guimenuitem>Quantize</guimenuitem>
+ </menuchoice>
+ in the main window or
+ <menuchoice>
+ <guimenu lang="en">Adjust</guimenu>
+ <guimenuitem>Quantize</guimenuitem>
+ </menuchoice>
+ in matrix or notation editors. This shows you a dialog in which
+ you can select the precise quantization parameters you need, and
+ then it applies these to all of the selected segments or notes.
+ (You can also quickly reach this dialog by pressing the "="
+ key.)
+ </para>
+
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-gridquantizer.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase>&rosegarden;'s quantize dialog</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+
+ <para>
+ The quantize dialog offers a selection of quantizers, each with
+ its own set of parameters. The quantizers available are:
+ </para>
+ <variablelist>
+
+ <varlistentry>
+ <term>Grid quantizer</term>
+ <listitem>
+ <para>The grid quantizer moves the start times of notes so
+ that they start at the nearest point on some grid (defined
+ by various parameters of the quantizer). Thus notes that
+ initially vary slightly in start time will be aligned by the
+ quantizer, making for a more precise and mechanical
+ performance.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>Legato quantizer</term>
+ <listitem>
+ <para>The legato quantizer carries out a simple grid
+ quantization, and also adjusts the note durations so as to
+ remove any gaps between notes by extending each note so as
+ to (at least) continue until the start of the following one.
+ You can also obtain this legato effect without the
+ accompanying grid quantization using the
+ <menuchoice>
+ <guimenu lang="en">Adjust</guimenu>
+ <guimenuitem>Quantize</guimenuitem>
+ <guimenuitem>Legato</guimenuitem>
+ </menuchoice> function in the Matrix editor.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>Heuristic notation quantizer</term>
+ <listitem>
+ <para>The notation quantizer attempts to adjust note start
+ times and durations so as to produce readable notation. See
+ <link linkend="nv-quantization">Notation from performance
+ data</link> for a description of this quantizer and its
+ uses.</para>
+ </listitem>
+ </varlistentry>
+
+ </variablelist>
+
+ <para>The grid quantizer has the following adjustable parameters:</para>
+ <variablelist>
+
+ <varlistentry>
+ <term>Base grid unit</term>
+ <listitem>
+ <para>This is the size of the grid used for quantization.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>Swing</term>
+ <listitem>
+ <para>This is a percentage figure which adjusts the degree
+ by which alternate beats are quantized "late".</para>
+ <para>If set to
+ None (the default), quantization will be to an even grid
+ spaced according to the base grid unit.</para>
+ <para>If set to 100%,
+ every second grid line will be placed two-thirds of the distance
+ between the previous and next ones, instead of only half.
+ This will result in notes being quantized to the first and
+ third triplets of a swing beat.
+ </para>
+ <para>Other settings will produce proportionately varying degrees of
+ swinginess. You can also set this parameter to negative
+ figures (for alternate beats to start early) or to figures
+ greater than 100%.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>Iterative amount</term>
+ <listitem>
+ <para>The default behaviour of the grid quantizer is to move
+ each note exactly onto its nearest grid line. But if you
+ set the iterative amount to something less than 100% (the
+ "Full quantize" default), each note will only be moved that
+ percentage of the distance toward its nearest grid line,
+ resulting in a nearly-but-not-quite quantized effect.</para>
+ <para>This quantizer may be applied repeatedly so as to try
+ out gradually increasing degrees of quantization, hence the
+ name "iterative". Use
+ <menuchoice>
+ <guimenu lang="en">Adjust</guimenu>
+ <guimenuitem>Quantize</guimenuitem>
+ <guimenuitem>Repeat Last Quantize</guimenuitem>
+ </menuchoice> in the Matrix editor to do so.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>Quantize durations as well as start times</term>
+ <listitem>
+ <para>If this option is enabled, the quantizer will quantize
+ the notes' end times to the same grid as their start times.
+ </para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ <para>The quantize dialog also has an optional Advanced section
+ containing further options for
+ <link linkend="nv-quantization">notation quantization</link>.
+ </para>
+
+ <para>
+ Another simple way to apply a grid quantizer is to do it in the
+ main window, using the <guimenuitem>Quantize</guimenuitem> menu
+ on the <link linkend="segment-view-segmentparameterbox">Segment
+ Parameter Box</link>. If you select some segments and change
+ the value shown in the menu, the segments will immediately be
+ grid-quantized to the resolution shown in the menu.
+ </para>
+
+ <para>
+ Finally, there is also a <link
+ linkend="matrix-grid-quantize">quantize control</link> in the matrix
+ view.</para>
+
+ </chapter>
+
+ <chapter id="matrix-view">
+ <title>The Matrix editor</title>
+ <para>
+ The &rosegarden; matrix editor enables you to view and edit
+ music in a simple, logical format: each note represented as a
+ block in a grid, at a height corresponding to the pitch.
+ </para>
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-matrixview.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase>&rosegarden;'s matrix editor</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ Each matrix editor window shows a single segment. To edit a
+ segment, just right-click on it in the main canvas and select
+ the matrix editor from the menu. Alternatively, you can
+ configure Rosegarden to make the matrix editor the default
+ editor available when you double-click on a segment.
+ </para>
+
+ <sect1 id="matrix-grid-quantize">
+ <title>The Grid and Quantize controls</title>
+ <para>
+ The matrix view contains Grid and Quantize menus in its main
+ toolbar.
+ </para>
+ <para>The Grid menu controls the size of the visible grid in the
+ background of the matrix view, as well as the time resolution
+ used when entering and moving notes. After you set it to a
+ particular time value, the normal note insertion and drag
+ operations will then snap automatically to grid points spaced at
+ that time width. You can override the snap-to-grid effect
+ temporarily by holding down Shift during editing, or you can
+ disable it by setting the Grid menu to None.
+ </para>
+ <para>The Quantize menu works rather differently. Rather than
+ controlling the behaviour of other editing tools, it actually
+ performs an action. When you change the value in this menu, the
+ selected notes -- or the whole segment if nothing is selected
+ -- will immediately be quantized using a grid quantizer of the
+ chosen resolution.
+ </para>
+ <para>The Quantize menu also shows you continuously what
+ resolution the current segment or selection is quantized to.
+ For example, if you select a set of notes that start on
+ consecutive quarter-note beats, the Quantize menu will update
+ itself to show 1/4, as this is the coarsest resolution
+ consistent with the existing quantization of the current
+ selection.
+ </para>
+ </sect1>
+
+ <sect1 id="matrix-insertion">
+ <title>Inserting notes</title>
+ <para>
+ The simplest way to enter a note in the matrix view is to
+ use the mouse. To do this, select the pencil tool on the
+ toolbar, and then click and drag on the matrix editor. The
+ note will be entered at the time and pitch corresponding to
+ the point you click at, and will have a duration
+ corresponding to the distance you drag before releasing the
+ mouse button.</para>
+
+ <para>You can also draw notes using the Select tool (the
+ arrow), by clicking and dragging either with the middle mouse
+ button, or with the left mouse button and Ctrl pressed.</para>
+
+ <para>By default, the time and duration are snapped to a
+ particular grid unit, according to the Grid setting on the
+ View menu or the toolbar. You can prevent this effect by
+ holding down Shift while clicking and dragging.
+ </para>
+
+ <sect2 id="matrix-insertion-keyboard">
+ <title>Typing notes with the PC keyboard</title>
+
+ <sect3>
+ <title>Duration</title>
+
+ <para>The durations of notes entered from the keyboard are
+ controlled by the Grid setting on the View menu or
+ toolbar. You can set this using the number keys:</para>
+
+ <itemizedlist>
+ <listitem><para><keycap>5</keycap> &ndash; Whole bar</para></listitem>
+ <listitem><para><keycap>1</keycap> &ndash; Beat</para></listitem>
+ <listitem><para><keycap>2</keycap> &ndash; Half note (minim)</para></listitem>
+ <listitem><para><keycap>4</keycap> &ndash; Quarter note (crotchet)</para></listitem>
+ <listitem><para><keycap>8</keycap> &ndash; Eighth note (quaver)</para></listitem>
+ <listitem><para><keycap>6</keycap> &ndash; Sixteenth note (semiquaver)</para></listitem>
+ <listitem><para><keycap>3</keycap> &ndash; Thirty-second note (demisemiquaver)</para></listitem>
+ <listitem><para><keycap>0</keycap> &ndash; Sixty-fourth note (hemidemisemiquaver)</para></listitem>
+ </itemizedlist>
+
+ </sect3>
+
+ <sect3>
+ <title>Pitch</title>
+
+ <para>Once the correct duration is selected in the Grid
+ menu, you can insert a note at the current position of the
+ <link linkend="nv-rulers">insert cursor</link> by pressing
+ one of the pitch keys:</para>
+
+ <itemizedlist>
+ <listitem><para><keycap>A</keycap> &ndash; Do (the tonic of the current key in the current clef)<!-- !!! FIXME: no clef in matrix view --></para></listitem>
+ <listitem><para><keycap>S</keycap> &ndash; Re</para></listitem>
+ <listitem><para><keycap>D</keycap> &ndash; Mi</para></listitem>
+ <listitem><para><keycap>F</keycap> &ndash; Fa</para></listitem>
+ <listitem><para><keycap>J</keycap> &ndash; So</para></listitem>
+ <listitem><para><keycap>K</keycap> &ndash; La</para></listitem>
+ <listitem><para><keycap>L</keycap> &ndash; Ti</para></listitem>
+ </itemizedlist>
+
+ <para>Holding <keycap>Shift</keycap> while pressing a key
+ will sharpen the note (except for Mi and Ti, which don't
+ have sharpened versions) and holding <keycap>Shift</keycap>
+ and <keycap>Ctrl</keycap> together will flatten it (except
+ for Fa and Do).</para>
+
+ <para>To enter notes an octave higher, use the corresponding
+ keys on the next row up: <keycap>Q</keycap>,
+ <keycap>W</keycap>, <keycap>E</keycap>, <keycap>R</keycap>,
+ <keycap>U</keycap>, <keycap>I</keycap>, and
+ <keycap>O</keycap>. Likewise to enter notes an octave
+ lower, use <keycap>Z</keycap>, <keycap>X</keycap>,
+ <keycap>C</keycap>, <keycap>V</keycap>, <keycap>B</keycap>,
+ <keycap>N</keycap> and <keycap>M</keycap>.</para>
+
+ </sect3>
+
+ <sect3>
+ <title>Other remarks</title>
+
+ <para>All of the insertion commands are also available on a
+ submenu of the Tools menu. It's unlikely you'd ever want to
+ navigate the menus just to insert a single note, but the
+ menus show the keyboard shortcuts and so provide a useful
+ reference in case you forget which key is which.</para>
+
+ <para>The keyboard shortcuts are currently designed for use
+ with a QWERTY-layout keyboard. There is not yet any way to
+ remap the keys for another layout, short of reassigning each
+ key individually using <menuchoice>
+ <guimenu lang="en">Settings</guimenu>
+ <guimenuitem>Configure Shortcuts...</guimenuitem>
+ </menuchoice>.</para>
+
+ </sect3>
+
+ </sect2>
+
+ <sect2 id="matrix-insertion-midi">
+ <title>Entering notes using a MIDI keyboard</title>
+
+ <para>
+ You can enter notes into the matrix editor one at a time
+ using a MIDI keyboard or other MIDI control device. The
+ matrix editor uses the pitches you play on the keyboard,
+ but the durations you have selected in the Grid setting of
+ the editor itself. This is known as "step recording".
+ </para>
+
+ <para>
+ To start entering notes from a MIDI keyboard, first make
+ sure the keyboard is configured as a MIDI
+ record device. Then make sure you have the right Grid
+ setting in the View menu or toolbar, as this controls the
+ note duration. Then press the <!-- !!! image of button
+ --> step recording button on the matrix editor's toolbar,
+ or select Step Recording from the Tools menu. From that
+ point on all notes pressed on the MIDI keyboard will be
+ inserted at the current insertion time in that window,
+ until step recording is switched off again or activated in
+ a different window or the window is closed.
+ </para>
+
+ <para>
+ You can change the Grid setting while step recording is in
+ progress, in order to insert notes of different durations.
+ </para>
+ </sect2>
+ </sect1>
+
+ <sect1 id="matrix-selection">
+ <title>Selecting notes</title> <para>To select notes in the
+ matrix editor, switch to the Select (arrow) tool and then
+ outline a rectangular area containing the notes you want to
+ select. The selected events will then be highlighted in blue.
+ If you instead click on a single event, just that event will
+ be selected.
+
+ </para><para>If you hold <keycap>Shift</keycap> while dragging
+ out a rectangle or clicking on a note, the new selection will
+ be added to any existing selection instead of replacing it.
+ </para>
+
+ <para>
+ To clear a selection, click in an empty space on the matrix
+ editor, or hit the Escape key.</para>
+
+ <para>You can also select all of the notes of a given pitch,
+ by shift-clicking on a key in the piano keyboard down the left
+ side of the matrix editor. You can also shift-click and drag
+ to select a range of pitches. This selection is added to any
+ existing selection you have, so if you want a clean new
+ selection, clear the old one first.
+ </para>
+
+ <sect2 id="matrix-selectionfilter">
+ <title>Filtering the selection</title>
+ <para>The <menuchoice>
+ <guimenu>Edit</guimenu>
+ <guimenuitem>Filter Selection</guimenuitem>
+ </menuchoice> function offers you the ability to filter a range of events in
+ any of several categories out of your selection. You can use this to refine the selection, if you want some action to apply to only certain events in it.
+ </para>
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-eventfilter.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase>The event filter dialog</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+ <para>
+ All ranges may be either inclusive or exclusive.
+ </para>
+ <para>
+ An inclusive range will remove events on either side of it
+ from the selection. You can use this, for example, to
+ filter everything below middle C and above the A above
+ middle C out of your selection.
+ </para>
+ <para>
+ An exclusive range will remove the events within the range
+ itself, leaving everything on either side of it selected.
+ Using the same search points as in the previous example,
+ you would use an exclusive range to remove everything
+ between middle C and the A above middle C from your
+ selection, while leaving everything above and below that
+ range selected.
+ </para>
+ <para>
+ Once your selection has been filtered, you can manipulate
+ it by any conventional means.
+ </para>
+ </sect2>
+ </sect1>
+
+ <sect1 id="matrix-editing">
+ <title>Moving and copying notes</title>
+ <para>
+ You can move notes in both time and pitch on the matrix
+ editor by either clicking and dragging them with the Move
+ tool, or selecting them and then dragging them with the
+ Select tool.
+ </para>
+ <para>
+ To copy notes, select them and then use the standard copy
+ and paste functions. After the paste the pasted notes will
+ be selected instead, and you can then drag them wherever you
+ need them. You may also copy notes by selecting them with
+ the Select tool, then keeping Ctrl pressed click-and-drag
+ the selected notes in a new position.
+ </para>
+ </sect1>
+
+ </chapter>
+
+ <chapter id="percussion-matrix-view">
+ <title>The Percussion Matrix editor</title>
+
+ <para>The Percussion Matrix editor is identical to the <link
+ linkend="matrix-view">Matrix editor</link>, except that it shows
+ pitch names on the vertical scale instead of a piano keyboard, and
+ it does not show the duration for each note. This is intended for
+ use with percussion programs on MIDI instruments, in which each
+ note pitch plays a different percussion sound.</para>
+
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-percussionmatrix.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase>&rosegarden;'s percussion matrix editor</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ The pitch names are only shown if the segment being edited is
+ playing through a percussion instrument that has an associated
+ key mapping to define the names; otherwise the standard matrix
+ view piano keyboard will appear instead. See <link
+ linkend="studio-keymappings">Percussion Key Mappings</link> for
+ more information about key mappings.</para>
+ </chapter>
+
+ <chapter id="notation-view">
+ <title>The Notation editor</title>
+
+ <!-- Introduction, purpose -->
+
+ <sect1 id="nv-introduction">
+ <title>Introduction</title>
+
+ <para>
+
+ The &rosegarden; notation editor enables you to view and edit
+ one or more staffs in traditional score notation.
+
+ </para><para>
+
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-notationview.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase>&rosegarden;'s notation editor</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+ <para>
+ &rosegarden; aims to present scores with the best possible
+ layout compatible with its primary focus as a sequencer
+ application. This means that although the editor supports
+ chords, overlapping and nested beamed groups, triplets and
+ arbitrary tuplets, grace notes, dynamics, accents, text and so
+ on, it does not provide as much fine control over layout
+ (especially in contrapuntal music) as a dedicated score
+ editing program might. &rosegarden; does not aim to produce
+ typeset-quality score, although it can export LilyPond files,
+ which may form a good basis for typesetting.
+
+ </para>
+ </sect1>
+
+ <!-- Single and multiple staffs, and "current staff" -->
+
+ <sect1 id="nv-staffs">
+ <title>Single and multiple staffs</title>
+
+ <para>
+ There are three ways to open a notation editor from the
+ &rosegarden; main window. (They all require that you
+ have some existing segments in the main window first,
+ so if you're starting a new composition, you should
+ create your segments before you start thinking about
+ how to edit them.)
+
+ <variablelist>
+
+ <varlistentry>
+ <term>Double-clicking on segments</term>
+ <listitem>
+
+ <para>The most obvious way is just to double-click on
+ a segment in the main canvas. This opens the segment
+ in whatever you have configured <!-- !!!Link --> as
+ the default editor (notation, matrix, or event list),
+ and by default this is the notation editor. So
+ double-clicking a single segment will open it as a
+ single staff in a Notation editor window.</para>
+
+ <para>You can also open a multi-staff editor this way:
+ holding down the Shift key, select (with a single
+ mouse click) each of the segments on the main view
+ that you want to open, but double-click on the last
+ one. All of the selected segments will then be opened
+ together in a single notation window.</para>
+
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>The Open in Default Editor menu function (the Return key)</term>
+ <listitem>
+
+ <para>The Return key is a shortcut for the Open in
+ Default Editor menu function, which does much the same
+ thing as double-clicking: opens all of the currently
+ selected segments together in a notation editor, or in
+ whichever other editor you have configured as your
+ default. </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>The Open in Notation Editor menu functions</term>
+ <listitem>
+
+ <para>Alternatively, you can use the main window's
+ Open in
+ Notation Editor menu function, either on
+ the Segments menu or on the right-button popup menu on
+ a segment in the canvas. Select the segments you want
+ to edit (by shift-clicking as above, or by using the
+ Select All Segments function) and
+ then select Open in
+ Notation Editor.</para>
+ </listitem>
+
+ </varlistentry>
+ </variablelist>
+
+ </para>
+
+ <para>
+ If you have more than one staff (i.e. segment) visible in the notation
+ editor, only one of them can be "current" at once. The
+ current staff can be distinguished because it has the insert
+ cursor on it (see <link linkend="nv-rulers">Rulers and
+ Cursors</link>), and this is the staff on which any editing
+ operations that use the insert cursor will take place. The
+ topmost staff is the current one by default, but you can
+ switch to a different staff by ctrl-clicking on it, or by using the
+ <menuchoice><guimenu>Tools</guimenu><guimenuitem>Local
+ Cursor</guimenuitem><guimenuitem>Cursor Up Staff</guimenuitem></menuchoice> and
+ <menuchoice><guimenuitem>Cursor Down Staff</guimenuitem></menuchoice> menu functions.
+ </para>
+
+ </sect1>
+
+ <!-- Linear and page layouts -->
+
+ <sect1 id="nv-layout">
+ <title>Linear and page layouts</title>
+
+ <para>
+ The usual way the notation editor displays staffs is known
+ as Linear layout: one staff on top of another, with each
+ staff as a single, horizontally scrollable long line. Some
+ of the functions of the editor (such as the <link
+ linkend="nv-rulers">Rulers</link>) are only available in
+ Linear layout.
+ </para>
+
+ <para>
+ However, you can also display staffs in two different
+ page-based layouts: Continuous Page and Multiple Page.</para>
+
+ <para>In Continuous Page layout, the music is arranged in one
+ infinitely-tall page of the same width as the window. Each
+ staff breaks at the end of a line, starting a new line below
+ the remaining staffs.</para>
+
+ <para>In Multiple Page layout, the music is divided up into
+ real pages much as it will be when printed. The size of each
+ page is calculated so that approximately the same amount of
+ music will fit on each line as it will when actually printed
+ (according to the point size specified for the printing
+ resolution in the configuration dialog). The printed version
+ is unlikely to be exactly the same, as it depends on the
+ precise paper size and margins in use when printing, but it
+ should be fairly close if you happen to be using A4
+ paper.</para>
+
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-notationview-multipage.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase>&rosegarden;'s notation editor in Multiple Page layout</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para><para>
+ Most, but not all, of the display and editing functions
+ work in the page layout modes as well as in linear layout.
+ </para>
+
+ <para>
+ To switch between these layout modes, use the Linear Layout, Continuous Page Layout and Multiple Page Layout menu functions.
+ </para>
+ </sect1>
+
+ <!-- Rulers and Cursors -->
+
+ <sect1 id="nv-rulers">
+ <title>Rulers and cursors</title>
+
+ <para>
+ The &rosegarden; Notation editor window includes two graduated rulers,
+ each associated with its own cursor. The rulers are the horizontal strips
+ divided up with tickmarks at top and bottom of the main
+ notation canvas, and the cursors are the coloured vertical
+ lines shown initially at the start of the top staff in the
+ editor. In addition to these main two, there are the <guimenuitem>chord
+ name</guimenuitem> ruler, the <guimenuitem>tempo</guimenuitem> ruler,
+ and the <guimenuitem>raw note</guimenuitem> ruler.
+ </para>
+ <para>
+ Note that the rulers are only shown in <link
+ linkend="nv-layout">Linear layout</link> mode, and several of them
+ are not displayed by default.
+ </para>
+
+
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-cursors.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase>The notation editor's two cursors</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+
+ <para>
+ The purple cursor is the insert cursor. It shows the point
+ at which operations such as insert and paste will take
+ place. You can reposition the insert cursor by clicking or
+ dragging on the top ruler, or by clicking with the Select
+ tool on an empty part of the staff (avoiding any events), or
+ by clicking anywhere with <keycap>Ctrl</keycap> held down.
+ </para>
+
+ <para>You can also use the left and right arrow keys to move
+ the insert cursor one event at a time. If you hold <keycap>Ctrl</keycap> while
+ pressing the arrow keys, the cursor will move a whole bar at a
+ time; if you hold Shift, the cursor will <link
+ linkend="nv-tools-selections">select the events</link> as it
+ passes over them.
+ </para>
+
+ <para>
+ The blue cursor is the playback pointer. Just like the
+ similar cursors in the main window and the matrix views,
+ this shows the location of the current playback or record
+ position, and it sweeps across the notation while the transport is
+ rolling. It can be repositioned using the bottom ruler.
+ </para>
+ <sect2 id="nv-raw-note-ruler">
+ <title>The raw note ruler</title>
+ <para>The raw note ruler is particularly
+ useful when editing <link linkend="nv-quantization">quantized
+ notation</link> where the display duration on the page
+ differs from the duration of the actual performance.
+ Enabled via
+ <menuchoice>
+ <guimenu>Settings</guimenu>
+ <guimenuitem>Rulers</guimenuitem>
+ <guimenuitem>Show Raw Note Ruler</guimenuitem>
+ </menuchoice>, it draws a small bar above
+ each note, similar to the way notes appear in the matrix. In this
+ example screenshot, you can see how interpreted, quantized notes
+ appear on this ruler. The tenuto notes have full performance
+ durations, while the staccato notes are considerably shorter, and
+ the accented notes have a higher velocity (more red colour) than
+ their neighbors.
+ </para>
+ <para>
+ Raw note ruler marks only notes in the selected segment in the track.
+ The colour of the selected segment is used in the background of
+ the raw note ruler between the start and end time of the segment.
+ </para>
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata
+ fileref="rg-rawnoteruler.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase>The raw note ruler,
+ showing notation whose performance duration value differs
+ from what appears on the staff</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+ </sect2>
+ <sect2 id="nv-chord-name-ruler">
+ <title>The chord name ruler</title>
+ <para>The chord name ruler analyzes the tonality of the piece, and
+ attempts to display which chords are sounding. This is for
+ informational purposes only, and you can neither print nor edit the
+ contents of this ruler.
+ <!-- !!! throw in a link to how to do proper chords with text, and
+ should probably get into fretboards too, but I'm not going to mention
+ fretboards in this manual at this time (for 1.3) because it's too
+ rough, and I just don't care to get into that yet -->
+ </para>
+ </sect2>
+ <sect2 id="nv-tempo-ruler">
+ <title>The tempo ruler</title> <para>The tempo ruler displays
+ the global tempo, and provides a vehicle for entering,
+ editing, and manipulating it. It works the same way as the
+ tempo rulers in the main window and the matrix editor. See
+ <link linkend="tempo-ruler">Tempo Rulers</link> for more
+ information.</para>
+ </sect2>
+
+ </sect1>
+
+ <!-- Display conventions (annotated picture with some selected notes,
+ some quantized notes, a bar of incorrect length etc) -->
+
+ <!-- Tools and Selections -->
+
+ <sect1 id="nv-tools-selections">
+ <title>Tools and selections</title>
+ <para>
+ Most of the menu and toolbar editing functions in the
+ &rosegarden; Notation editor fall into one of three
+ categories: <quote>tools</quote>, <quote>functions that
+ operate on selections</quote>, and <quote>drag
+ operations</quote>.
+ </para>
+
+ <variablelist>
+ <varlistentry>
+ <term>Tools</term>
+ <listitem>
+ <para>
+ The basic tools are the selection tool, the erase
+ tool, and those for inserting notes, rests, text and so
+ on, which are usually accessed from the toolbar buttons.
+ </para>
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata
+ fileref="rg-notationtools.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase>The insert, erase, text, and guitar chord tools</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+
+ <para>
+ Choosing a tool changes the default behaviour of the
+ mouse buttons on the main notation canvas, at least
+ until another tool is chosen instead. For example,
+ choosing the selection tool allows you to make
+ selections and so to use the selection-based functions
+ (below); choosing an insertion tool (such as one of the
+ notes) switches the <acronym>GUI</acronym>'s behaviour so as to insert
+ notes by clicking on the canvas; choosing the erase tool
+ allows you to remove events by clicking on them.
+ </para>
+ <para>
+ You can also change the current tool using the Tools menu.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>Functions that operate on selections</term>
+ <listitem>
+ <para>
+ The majority of the remaining menu functions require a
+ selection to be made on the canvas before they can be
+ used. Some of them (such as <guimenuitem>Cut</guimenuitem>
+ or the <guimenuitem>Note Style</guimenuitem>
+ functions) will operate on any selected events; others
+ (<guimenuitem>Stem Directions</guimenuitem> function)
+ will refuse to work unless the selection contains
+ some notes.
+ </para>
+ <para>
+ To select some events on the canvas, switch to the
+ Select (arrow) tool and then outline a rectangular area
+ containing the events you want to select. The selected
+ events will then be highlighted in blue. If you click
+ on a single event, just that event will be selected <footnote>
+ <para> You can also double-click on a single event to open an
+ editing dialog for that event, but that's got nothing to
+ do with selections.</para> </footnote>).
+ </para><para>If you hold
+ <keycap>Shift</keycap> while dragging
+ out a rectangle, its contents will be added to any
+ existing selection instead of replacing it.
+ </para>
+ <para>
+ To select a whole bar, double-click with the Select tool
+ on some empty space within that bar; to select the whole
+ staff, click three times. The Edit menu carries
+ functions for selecting extended areas based on the
+ location of the insert cursor, and you can also select
+ events around the insert cursor by holding Shift and
+ pressing the left or right arrow keys.
+ </para>
+ <para>
+ It is not possible to select events from more than
+ one staff at once.
+ </para>
+ <para>After selecting some events, you can filter your selection further using the <menuchoice>
+ <guimenu>Edit</guimenu>
+ <guimenuitem>Filter Selection</guimenuitem>
+ </menuchoice> function. For more details, refer to <link linkend="matrix-selectionfilter">the corresponding function in the matrix editor</link>.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>Drag operations</term>
+ <listitem>
+ <para>
+ You can also do a certain amount of editing just by
+ dragging things around. Switch to the Select (arrow)
+ tool, and then you can change the pitch of notes by
+ just click-and-dragging their heads up or down, and
+ change the times of notes and other events by dragging
+ them left or right. (You can't drag rests or time
+ signatures, but you can drag everything else. If you
+ have more than one event selected, the whole selection
+ will be dragged at once.)
+ </para>
+ <para>
+ Dragging is usually a less accurate way of editing
+ things than using the menu or toolbar functions, but
+ it can be easier.
+ </para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ <sect2>
+ <title>Transposing</title>
+
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="transpose-by-interval.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase>Transposing by interval</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+ <para>
+ In Notation view menu there are two functions which can be
+ used to transpose notes by an arbitrary interval, namely
+ <menuchoice>
+ <guimenu lang="en">Adjust</guimenu>
+ <guimenuitem>Transpose</guimenuitem>
+ <guimenuitem>Transpose by Semitones</guimenuitem>
+ </menuchoice>
+ function which asks just the number of semitones to be
+ transposed, and
+ <menuchoice>
+ <guimenu lang="en">Adjust</guimenu>
+ <guimenuitem>Transpose</guimenuitem>
+ <guimenuitem>Transpose by Interval</guimenuitem>
+ </menuchoice>
+ function which shows a neat dialog that can be used to
+ transpose notes. In the latter, the dialog shows an example
+ notes before and after transposing and expresses the
+ interval in written form. The interval may be changed either
+ by dragging the notes shown by the dialog or by changing
+ separately the base note, its octavation and accidentals.
+ </para>
+ <para>
+ In Segment view, Notation view, and Track view there is also
+ <menuchoice>
+ <guimenu lang="en">Segment(s)</guimenu>
+ <guimenuitem>Transpose by Interval</guimenuitem>
+ </menuchoice>
+ function which makes a transpose to entire segment. In this
+ dialog you may also choose whether only the notes are
+ transposed or the keys of the segment are transposed also.
+ </para>
+ </sect2>
+ </sect1>
+
+ <!-- Insertion: notes, auto-ties, accidentals -->
+
+ <sect1 id="nv-insertion">
+ <title>Inserting notes and rests</title>
+
+ <para>To insert a note, select one of the note tools by clicking
+ on a particular duration of note on the toolbar, and then click
+ on the staff at the point where you want to add the note.</para>
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata
+ fileref="rg-notation-toolbars.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase>The duration, rests, and accidentals toolbars</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+
+ <para>You can also select one of the accidentals on the toolbar
+ to insert sharpened or flattened notes. If no accidental is
+ selected, the note inserted will follow the key signature.
+ Alternatively, you can select the "Follow previous accidental"
+ icon (shown as a note with an arrow pointing back from where the
+ accidental would appear) to make the note follow whatever
+ accidental was last used at the same height on the staff.</para>
+
+ <para>If you add a note at the same time as an existing note of
+ different duration, the editor will generally assume that you
+ want to create chords and will split the existing or new note
+ accordingly so as to create one or more chords with ties. If
+ you really do want to chord two different durations, you can
+ select the tied noteheads and use the Collapse Equal-Pitch Notes
+ function to merge them together. Alternatively, the default
+ behaviour can be changed in the &rosegarden; configuration dialog
+ so as not to do the split at all.</para>
+
+ <para>If you add a note exactly over an existing note of
+ different duration (i.e. at the same pitch), the duration of the
+ existing note will be changed to that of the new one.</para>
+
+ <para>If you add a rest at the same time as an existing note,
+ the note will be silenced for the duration of the rest,
+ shortening or possibly removing it altogether.</para>
+
+ <sect2 id="nv-insertion-keyboard">
+ <title>Typing notes and rests with the PC keyboard</title>
+
+ <sect3>
+ <title>Duration</title>
+
+ <para>First, ensure a notation tool is selected to indicate
+ the duration of note (or rest) you wish to insert. You can
+ select the various note types using the number keys:</para>
+
+ <itemizedlist>
+ <listitem><para><keycap>5</keycap> &ndash; Breve</para></listitem>
+ <listitem><para><keycap>1</keycap> &ndash; Whole note (semibreve)</para></listitem>
+ <listitem><para><keycap>2</keycap> &ndash; Half note (minim)</para></listitem>
+ <listitem><para><keycap>4</keycap> &ndash; Quarter note (crotchet)</para></listitem>
+ <listitem><para><keycap>8</keycap> &ndash; Eighth note (quaver)</para></listitem>
+ <listitem><para><keycap>6</keycap> &ndash; Sixteenth note (semiquaver)</para></listitem>
+ <listitem><para><keycap>3</keycap> &ndash; Thirty-second note (demisemiquaver)</para></listitem>
+ <listitem><para><keycap>0</keycap> &ndash; Sixty-fourth note (hemidemisemiquaver)</para></listitem>
+ </itemizedlist>
+
+ <para>You can switch to a triplet version of the note
+ duration by pressing the <keycap>G</keycap> key. Pressing it
+ again will switch back to the normal duration. The status
+ bar at the bottom of the window will notify you of when a
+ triplet duration is active.</para>
+ </sect3>
+
+ <sect3>
+ <title>Pitch</title>
+
+ <para>Once a notation tool is selected, you can insert a
+ note at the current position of the <link
+ linkend="nv-rulers">insert cursor</link> by pressing one of
+ the pitch keys:</para>
+
+ <itemizedlist>
+ <listitem><para><keycap>A</keycap> &ndash; Do (the tonic of the current key in the current clef)</para></listitem>
+ <listitem><para><keycap>S</keycap> &ndash; Re</para></listitem>
+ <listitem><para><keycap>D</keycap> &ndash; Mi</para></listitem>
+ <listitem><para><keycap>F</keycap> &ndash; Fa</para></listitem>
+ <listitem><para><keycap>J</keycap> &ndash; So</para></listitem>
+ <listitem><para><keycap>K</keycap> &ndash; La</para></listitem>
+ <listitem><para><keycap>L</keycap> &ndash; Ti</para></listitem>
+ </itemizedlist>
+
+ <para>Press the "." key to togggle between dotted and
+ undotted durations.</para>
+
+ <para>Holding <keycap>Shift</keycap> while pressing a key
+ will sharpen the note (except for Mi and Ti, which don't
+ have sharpened versions) and holding <keycap>Shift</keycap>
+ and <keycap>Ctrl</keycap> together will flatten it (except
+ for Fa and Do).</para>
+
+ <para>To enter notes an octave higher, use the corresponding
+ keys on the next row up: <keycap>Q</keycap>,
+ <keycap>W</keycap>, <keycap>E</keycap>, <keycap>R</keycap>,
+ <keycap>U</keycap>, <keycap>I</keycap>, and
+ <keycap>O</keycap>. Likewise to enter notes an octave
+ lower, use <keycap>Z</keycap>, <keycap>X</keycap>,
+ <keycap>C</keycap>, <keycap>V</keycap>, <keycap>B</keycap>,
+ <keycap>N</keycap> and <keycap>M</keycap>.</para>
+
+ </sect3>
+
+ <sect3>
+ <title>Rests</title>
+
+ <para>To insert a rest instead of a note, press
+ <keycap>P</keycap>. Alternatively, you can use the
+ <keycap>T</keycap> and <keycap>Y</keycap> keys to switch the
+ current tool to a rest tool and back to a note tool again.</para>
+
+ </sect3>
+
+ <sect3>
+ <title>Chords</title>
+
+ <para>The default behaviour of the notation editor is to
+ move the insert cursor forward after inserting a note, so as
+ to be ready to insert another note after it in a melody;
+ this can be changed using the <keycap>H</keycap> key, which
+ switches to chord mode so that subsequent insertions occur
+ at the same time as the last one. Pressing
+ <keycap>H</keycap> again switches back to the melody
+ insertion behaviour.</para>
+
+ </sect3>
+
+ <sect3>
+ <title>Changing note durations</title>
+
+ <para>You can use the keyboard to change the durations of
+ notes that you've already entered. Make sure the notes you
+ want to change are selected, and then press
+ <keycap>Ctrl</keycap> plus the number key for the note you
+ want. You can also add or remove dots, by pressing
+ <keycap>Ctrl</keycap> plus "." &mdash; use this repeatedly to
+ select between one dot, two dots and no dots.</para>
+
+ <para>If you also hold <keycap>Alt</keycap> as well as
+ <keycap>Ctrl</keycap>, you will change the durations of the
+ notes as displayed in the notation editor without changing
+ their performed durations. This can be very useful for
+ tidying up a score: see also <link
+ linkend="nv-quantization">notation from performance
+ data</link>.
+ </para>
+ </sect3>
+
+ <sect3>
+ <title>Other remarks</title>
+
+ <para>All of the insertion commands are also available on a
+ submenu of the Tools menu. It's unlikely you'd ever want to
+ navigate the menus just to insert a single note, but the
+ menus show the keyboard shortcuts and so provide a useful
+ reference in case you forget which key is which.</para>
+
+ <para>The keyboard shortcuts are currently designed for use
+ with a QWERTY-layout keyboard. There is not yet any way to
+ remap the keys for another layout, short of reassigning each
+ key individually using the "Configure Shortcuts..." option
+ on the Settings menu.</para>
+
+ <para>Holding the <keycap>Ctrl</keycap> key while pressing a
+ number will select the corresponding dotted-note
+ tool.</para>
+
+ </sect3>
+
+ </sect2>
+
+ <sect2 id="nv-insertion-midi">
+ <title>Entering notes using a MIDI keyboard</title>
+
+ <para>
+ You can enter notes into the notation editor one at a time
+ using a MIDI keyboard or other MIDI control device &mdash; a
+ process known as step recording. The notation editor uses
+ the pitches you play on the keyboard, but the durations you
+ have selected in the editor itself.
+ </para>
+
+ <para>
+ To start entering notes from a MIDI keyboard, first make
+ sure the keyboard is configured as your default MIDI
+ record device. Then make sure a notation tool is selected
+ to set a duration. Then press the <!-- !!! image of
+ button --> step recording button on the notation editor's
+ toolbar, or select Step Recording from the Tools menu.
+ From that point on all notes pressed on the MIDI keyboard
+ will be inserted at the current insertion time in that
+ notation window, until step recording is switched off
+ again or activated in a different window or the window is
+ closed.
+ </para>
+
+ <para>
+ You can select another notation tool while step recording
+ is in progress, in order to insert notes of different
+ durations; and you can also switch into Chord mode <!--
+ !!! link --> to insert chords.
+ </para>
+ </sect2>
+
+ </sect1>
+
+ <!-- Keys, Clefs and Time Signatures -->
+
+ <sect1 id="nv-signatures">
+ <title>Clef and key</title>
+
+<!-- !!! rework -->
+ <para>The first thing to know about the way &rosegarden; handles
+ these is that time-related changes (tempos and time
+ signatures) are treated entirely differently from clefs and
+ keys. In order to simplify managing playback and recording as
+ well as notation, &rosegarden; requires that when the tempo or
+ time signature changes, it does so in all staffs at once. You
+ can't have one staff in 2/4 and another in 6/8 simultaneously,
+ or one staff playing at 120 to the beat and another at 90.
+ This applies only to time: there is no such restriction on the
+ use of clef and key changes. See also <link linkend="tempo">Tempo in Rosegarden</link>.</para>
+
+ <para>To change the clef, key, tempo or time signature within a
+ notation editor window, position the <link
+ linkend="nv-rulers">insert cursor</link> at the point where you
+ want the change to happen, and use one of the Edit menu's Add
+ Clef Change..., Add Key Change..., Add Tempo Change... and Add
+ Time Signature Change... functions. You will then see a dialog
+ box in which you can choose the particular clef, key, tempo or
+ time signature setting you want to apply, as follows.</para>
+
+ <sect2 id="nv-signatures-clef">
+ <title>Clef</title>
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-clefdialog.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase>&rosegarden;'s clef dialog</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+
+ <para>The dialog allows you to choose a clef, but also
+ to choose how you want the clef to be applied, in
+ cases where there are already some notes following
+ the point where the clef is to be inserted. You
+ must choose one of the following:
+
+ <variablelist>
+
+ <varlistentry>
+ <term>Maintain current pitches</term>
+ <listitem>
+ <para>
+ Any notes following the clef will keep
+ their current performance pitches.
+ </para>
+ <para>
+ For example, inserting a
+ tenor clef in the middle of a previously
+ treble-clef section will cause the notes following
+ the clef to be moved an octave
+ higher up the staff, because they will still have
+ their treble-clef pitches.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>Transpose into appropriate octave</term>
+ <listitem>
+ <para>
+ Any notes following the clef will
+ retain their pitch within the octave, but
+ may be moved into a different octave to
+ match the new clef, and therefore will play
+ at a new pitch.
+ </para>
+ <para>
+ For example, inserting a tenor clef in the
+ middle of a previously treble-clef section
+ will cause the notes following the clef to
+ move by one staff line only to adjust to the new
+ clef, but to play an octave lower than before.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ </variablelist>
+
+ </para>
+ </sect2>
+
+ <sect2 id="nv-signatures-key">
+ <title>Key</title>
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-keysigdialog.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase>&rosegarden;'s key signature dialog</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+ <para>The dialog allows you to choose a key signature, but also
+ to choose how you want the key signature to be applied. You
+ must choose among the following:
+ </para>
+
+ <variablelist>
+
+ <varlistentry>
+ <term>Key signature</term>
+ <listitem>
+ <para>
+ Used to dial up the actual key signature. The dialog will
+ attempt to analyze the tonality of the piece, and guess at
+ the key signature if no key is already in effect at that
+ point in the notation.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>Key transposition</term>
+ <listitem>
+ <para>You must choose whether to transpose the key according
+ to segment transposition, or to use the key exactly as
+ specified.
+ </para>
+ <para>
+ For example, if you are inserting a key of Bb major into a
+ transposed Bb trumpet part that's sounding at a
+ transposition of -2, you use this option to tell
+ &rosegarden; whether the key of Bb you have entered should
+ be written as a Bb (concert Ab), or should be transposed
+ against the segment to result in the trumpet key of C major
+ (concert Bb).
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>Scope</term>
+ <listitem>
+ <para>
+ You must choose whether to apply this key signature to
+ the current segment only, or to all segments, on all
+ tracks, at this time.
+ </para>
+ <para>
+ If you elect to apply the change to all segments at
+ this time, the previous key transposition choice will
+ govern whether all segments receive the specified key,
+ or a key appropriately transposed segment by segment.
+ (This is a convenient way to deal with notation for
+ transposing instruments, because it frees you to think
+ of all keys in concert pitch, and allow &rosegarden;
+ to work out what key is used for what transposition.)
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>Existing notes following key change</term>
+ <listitem>
+ <para>
+ You must choose whether any existing notes following
+ this key change will maintain their current pitches,
+ maintain their current accidentals in the key, or
+ whether Rosegarden should make an attempt to transpose
+ the part into the new key.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ </variablelist>
+ </sect2>
+
+ </sect1>
+
+ <!-- Text -->
+
+ <sect1 id="nv-text">
+ <title>Text, Lyrics, and LilyPond directives</title>
+
+ <para>A staff can contain various sorts of text, in text
+ events. There are two basic classes of user-editable text event: single
+ text items used for point annotations etc., and lyrics, plus a third
+ type used especially for tweaking LilyPond export. User-editable
+ types can be created (and so associated with a particular
+ time in the staff) using the Text tool, which is available on
+ the
+ <inlinemediaobject>
+ <imageobject>
+ <imagedata fileref="rg-text-cursor.png" format="PNG"/>
+ </imageobject>
+ </inlinemediaobject>
+ button in the toolbar. Lyrics can
+ also be created this way, but are more easily created using
+ the <link linkend="nv-text-lyrics">lyric editor</link>.</para>
+
+ <para>To add a piece of text, select the Text tool and click
+ at the point where you want to add it. If you want the text
+ associated with a particular note or rest, it may be helpful to click
+ the T cursor directly on that note, so as to ensure proper placement
+ in time. A dialog box will appear, into which you can type the text
+ and choose its intended purpose. (Rosegarden prefers to store what
+ the text is for, rather than how it should look; this is so that in
+ future we may be able to configure how the various sorts of text are
+ presented for each individual user.)
+
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-textdialog.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase>&rosegarden;'s text dialog</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+
+ The available
+ purposes (or styles) are:</para>
+
+ <variablelist>
+
+ <!-- NOTE: I have removed the "by default" in the following
+ descriptions. There is no "by default" to this. It does
+ what it does, and there is no changing it without editing
+ source code. (dmm) -->
+
+ <varlistentry><term>Dynamic</term><listitem><para> Used for
+ minor local indications such as the dynamic marks "p", "mf"
+ etc. Shown below the staff in small italic
+ type. </para></listitem></varlistentry>
+
+ <varlistentry><term>Direction</term><listitem><para> Used
+ when indicating significant changes in style or mood. Shown
+ above the staff in large roman type.
+ </para></listitem></varlistentry>
+
+ <varlistentry><term>Local Direction</term><listitem><para>
+ Used to indicate less significant changes in style or mood.
+ Shown below the staff in a smaller bold-italic roman
+ type. </para></listitem></varlistentry>
+
+ <varlistentry><term>Tempo</term><listitem><para> Used to
+ indicate significant changes in tempo. Shown above the
+ staff in large bold roman type.
+ </para></listitem></varlistentry>
+
+ <varlistentry><term>Local Tempo</term><listitem><para> Used
+ to indicate more minor or local changes in tempo. Shown
+ above the staff in a small bold roman type.
+ </para></listitem></varlistentry>
+
+ <varlistentry><term>Chord</term><listitem><para> Used
+ to indicate chord changes for guitarists, etc. Shown
+ above the staff in a small bold roman type.
+ </para></listitem></varlistentry>
+
+ <varlistentry><term>Lyric</term><listitem><para> Although
+ lyrics are usually created in the <link
+ linkend="nv-text-lyrics">lyric editor</link>, they can also
+ be entered word by word if necessary using this style. This
+ style is shown below the text in a small roman typet.
+ (Warning: if you enter lyrics this way and later
+ edit the staff's lyrics using the lyric editor, any lyrics
+ entered this way may be modified or moved if their
+ positioning is not compatible with that expected by the
+ lyric editor.) </para></listitem></varlistentry>
+
+ <varlistentry><term>Annotation</term><listitem><para> Used
+ for helpful text that is not strictly considered part of the
+ score. Shown below the staff, boxed-out in a yellow
+ sticky-label-style box. These may not be visible
+ initially, and can be turned on via
+ <guimenu>Settings</guimenu>
+ <guimenuitem>Show Annotations</guimenuitem>
+ </para></listitem></varlistentry>
+
+ <varlistentry><term>LilyPond Directive</term><listitem><para> Used
+ as the mechanism for exporting special tags that are
+ only understood by the LilyPond exporter. These
+ provide a means to extend &rosegarden;'s capabilities
+ beyond what it can do within its own native interface.
+ Shown above the staff, in a green box. These may not be visible
+ initially, and can be turned on via
+ <guimenu>Settings</guimenu>
+ <guimenuitem>Show LilyPond Directives</guimenuitem>
+ </para></listitem></varlistentry>
+ </variablelist>
+
+ <para>For many of the styles, a new combo box will appear that allows
+ you to select from a variety of commonly-used texts appropriate for
+ that style, such as "Allegro" and "ritardando." Selecting one of
+ these texts saves typing, but in no way impedes your ability to type
+ your own text by hand, should you so desire.
+ </para>
+
+ <para>You can also edit text after creating it, by clicking on
+ the existing text with the text tool.</para>
+
+ <sect2 id="nv-text-lyrics">
+ <title>Editing lyrics</title>
+
+ <para>The Lyric editor, available from the
+ <menuchoice>
+ <guimenu lang="en">View</guimenu>
+ <guimenuitem>Open Lyric Editor</guimenuitem>
+ </menuchoice>
+ function, allows you to edit all of
+ the lyric events for a single staff at once, using a fairly
+ rudimentary textual editing system. To use it, just
+ activate the menu option, edit the lyric text in the
+ resulting dialog, and then hit OK.</para>
+
+ <para>The lyrics you enter should follow a particular
+ format. Bar lines are vital to avoid the editor getting
+ confused, and are represented with a slash ("/"). Within
+ each bar the individual syllables are separated by spaces
+ (at least one space: the editor doesn't care about any extra
+ whitespace). Each syllable in turn will be attached to the
+ next subsequent note or chord within that bar (although at
+ the moment the editor can get quite confused by chords that
+ are not exact, i.e. that require smoothing or
+ quantizing).</para>
+
+ <para>If you want a note to have no syllable attached to it,
+ you need to provide a dot (".") as the syllable for that
+ note. (This is why the default lyric text for a segment is
+ usually full of dots.) Remember to separate the dots with
+ spaces, so that they are clearly separate syllables.</para>
+
+ <para>If you want more than one syllable on the same note,
+ with a space between them, use a tilde ("~") instead of the
+ space. It will be shown as a space on the score.</para>
+
+ <para>If you want to split a syllable across two notes, with
+ a hyphen, you need to enter a space following the hyphen so
+ the editor knows to treat it as two syllables. (Hyphens get
+ no special treatment within syllables.)</para>
+
+ <para>Syllables consisting only of numbers surrounded by
+ square brackets (like "[29]") will be ignored; this is the
+ format used for the automatically-generated bar numbers
+ shown in the editor.</para>
+
+ <para>You should also be aware that the textual format of
+ lyrics is only used for editing: the lyrics are actually
+ stored as distinct text events (one per syllable). This
+ means that the text format may potentially change in the
+ future to accommodate more advanced editing capabilities,
+ although the event format should not change and so your
+ saved files should continue to be compatible.</para>
+
+ <para>&rosegarden; supports also multiple lines of lyrics.
+ You may always attach one more verse into a single staff
+ by clicking Add Verse in the lyrics editor. All the verses
+ are entered with the same syntax. If you leave the last verse
+ without syllables, or make it empty, it is removed from
+ the list of verses next time you open the lyrics editor.
+ </para>
+
+ </sect2>
+ <sect2 id="nv-lilypond-directives">
+ <!-- text has a link here because the reading chain is:
+ intro -> lilypond directives, which puts you at a point well away
+ from any explanation of the whole text dialog and whatnot -->
+ <title>Using special LilyPond directives</title>
+ <para>LilyPond directives are a special kind of <link
+ linkend="nv-text">text</link> that you can
+ use to export .ly files that take advantage of
+ functionality not yet available directly through &rosegarden;'s
+ own native interface.
+ </para>
+ <para>Some of these are a bit fiddly with respect to how their
+ placement in time affects their function. It is not always
+ immediately apparent at a glance just where they are, or what notes
+ or barlines they will affect, so I have made placement suggestions
+ to help ease the process of getting them in the right spot.
+ </para>
+ <para>
+ These directives are:
+ </para>
+
+ <variablelist>
+ <varlistentry>
+ <term>Segno</term><listitem><para>used to export a
+ <inlinemediaobject>
+ <imageobject>
+ <imagedata fileref="rg-segno.png" format="PNG"/>
+ </imageobject>
+ </inlinemediaobject>
+ </para></listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>Coda</term><listitem><para>used to export a
+ <inlinemediaobject>
+ <imageobject>
+ <imagedata fileref="rg-coda.png" format="PNG"/>
+ </imageobject>
+ </inlinemediaobject>
+ </para></listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>Alt1</term><listitem><para>Placed anywhere in a
+ measure, designates that the measure(s)
+ that follow this one should be exported as the
+ first alternate ending (see file
+ lilypond-alternative-endings.rg for example)
+ </para></listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>Alt2</term><listitem><para>Placed anywhere in a
+ measure, designates that the measure(s)
+ that follow this one should be exported as the
+ second alternate ending (see file
+ lilypond-alterantive-endings.rg for example)
+ </para></listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>|| -></term><listitem><para>Placed anywhere in a
+ measure, designates that the next calculated barline will be
+ rendered as a double barline (see file
+ lilypond-directives.rg for example)
+ </para></listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>|. -></term><listitem><para>Placed anywhere in a
+ measure, designates that the next calculated barline will be
+ rendered as a terminating barline (see file
+ lilypond-directives.rg for example)
+ </para></listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>: -></term><listitem><para>Placed anywhere in a
+ measure, designates that the next calculated barline will be
+ rendered as a dashed barline (see file
+ lilypond-directives.rg for example)
+ </para></listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>Gliss.</term><listitem><para>Placed by clicking
+ directly on a notehead, draws a glissando between
+ the target note and the note immediately following (see file
+ lilypond-directives.rg for example)
+ </para></listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>Arp.</term><listitem><para>Placed by clicking
+ directly on a chord, draws a wavy line arpeggio
+ symbol immediately to the left of the affected chord (see file
+ lilypond-directives.rg for example)
+ </para></listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>Tiny ->.</term><listitem><para>Placed anywhere,
+ designates that notation immediately following this
+ directive should be rendered at the "tiny" size (see file
+ lilypond-directives.rg for example)
+ </para></listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>Small ->.</term><listitem><para>Placed anywhere,
+ designates that notation immediately following this
+ directive should be rendered at the "small" size (see file
+ lilypond-directives.rg for example)
+ </para></listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>Norm. ->.</term><listitem><para>Placed anywhere,
+ designates that notation immediately following this
+ directive should be rendered at the normal size;
+ usually used to cancel a Tiny -> or Small ->. (see file
+ lilypond-directives.rg for example)
+ </para></listitem>
+ </varlistentry>
+ </variablelist>
+ </sect2>
+ </sect1>
+
+ <!-- Indications -->
+
+ <sect1 id="nv-guitarchords">
+ <title>Guitar Chords</title>
+
+ <para>
+ Like text, it is possible to add guitar chord diagrams to a
+ notation track (or to edit previously added ones). This is
+ done by toggling the
+ <guimenuitem>Guitar Chord</guimenuitem>
+ button, and then clicking on the same area as for adding text.
+ This will open the Guitar Chord dialog. With it you can select
+ which guitar chord diagram you want to add from a chord
+ dictionary which comprises most of the common chord fingerings
+ by specifying a chord's root and its extension. For
+ convenience, the fingerings are sorted in three different
+ categories :
+ <guimenuitem>beginner</guimenuitem>
+ ,
+ <guimenuitem>common</guimenuitem>
+ and
+ <guimenuitem>all</guimenuitem>
+ . These categories are actually based on the chord extension
+ (A7 is a beginner chord, while A13 isn't), not on the
+ fingering itself, so you can still see "advanced" chord
+ fingerings listed, even in beginner mode.
+ </para>
+
+
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-guitarchorddialog.png"
+ format="PNG" />
+ </imageobject>
+ <textobject>
+ <phrase>&rosegarden;'s chord selector dialog
+ </phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+
+ <para>
+ It is also possible to add your own fingerings if needed. To
+ do this, click on the 'New' button. This will pop up a chord
+ editor, where you can "draw" which fingering you want to add,
+ and specify its root, chord extension, and starting fret
+ number.
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata
+ fileref="rg-guitarchordeditordialog.png" format="PNG" />
+ </imageobject>
+ <textobject>
+ <phrase>&rosegarden;'s chord editor dialog
+ </phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+
+ Note that while you can choose the extension from a list of
+ predefined values, you can also type whatever value you want.
+ However, in that case, the new fingering will only be
+ available in the 'all' list. Also, you can only delete and
+ edit your own chords. Those from the predefined dictionary
+ cannot be changed. If you spot a mistake in one of them,
+ please report it to the development team.
+ </para>
+
+ </sect1>
+
+ <!-- Indications -->
+
+ <sect1 id="nv-indication">
+ <title>Slurs and hairpins</title>
+
+ <para>Slur and hairpin (crescendo/decrescendo) dynamic markings are stored as events,
+ just like notes or rests. To create one, select the area you
+ want it to cover (a series of notes or whatever), and then use
+ the <guimenuitem>Add Slur</guimenuitem>,
+ <guimenuitem>Add Crescendo</guimenuitem> or
+ <guimenuitem>Add Decrescendo</guimenuitem> options from
+ the <guimenu>Phrase</guimenu> menu.</para>
+
+ <para>Placement of hairpins can be somewhat tricky, and this is
+ especially so with haripins that run in line with dynamic markings.
+ It is commonly the case that a hairpin that doesn't quite look right
+ in &rosegarden;'s own notation editor will nevertheless come out just
+ fine once exported to LilyPond. &rosegarden;'s slurs generally come
+ out best when all the stems are running in the same direction, and
+ occasionally need to be <link
+ linkend="nv-microposition">repositioned</link> by hand to achieve
+ better placement. Slurs also tend to fare slightly better once
+ exported to LilyPond.
+ </para>
+
+ <para>You remove a slur or hairpin in the same way as any
+ other event: either select it with the selection tool and then
+ hit <keycap>Delete</keycap>, or click on it with the erase tool active.</para>
+
+ </sect1>
+
+ <!-- Stem direction, slashes etc -->
+
+ <sect1 id="nv-note-qualities">
+ <title>Note stems and slashes</title>
+
+ <para>You can set the stem direction of any selected notes
+ (provided they are a sort that have stems) using the three
+ Stem Direction options on the Notes menu. The options allow
+ you to either fix the stems up or down, or revert to the stem
+ direction that &rosegarden; would otherwise have chosen. See
+ also <link linkend="nv-beamed-groups">Beams</link>.</para>
+
+ <para>The <guimenu>Note</guimenu> menu also contains options for adding slashes
+ across note stems, for example to indicate short repeated
+ notes or drum rolls. These are currently purely notational;
+ &rosegarden; will not take them into account when playing the
+ staff or generating &MIDI;.</para>
+ </sect1>
+
+ <!-- Beamed groups, including overlapping and nesting them -->
+
+ <sect1 id="nv-beamed-groups">
+ <title>Beams</title>
+
+ <para>Adding beams to notes is considered a grouping operation
+ in the &rosegarden; Notation editor, available on the <guimenu>Phrase</guimenu>
+ menu. Select the notes you want to beam, and use the
+ <guimenuitem>Beam Group</guimenuitem> menu option. To remove a beam, select the notes and use
+ the <guimenuitem>Unbeam</guimenuitem> menu option.</para>
+
+ <para>It is possible to have more than one beamed group
+ happening at the same time &mdash; you just select and beam the
+ separate groups one at a time &mdash; but Rosegarden is usually not
+ yet clever enough to work out which notes should have stems up
+ and which should have stems down for simultaneous beamed
+ groups, so you will probably have to set the stem directions
+ of the notes in the groups explicitly as well as beaming them.</para>
+
+ <para>&rosegarden; can attempt to guess a sensible beaming for a
+ piece of music, provided it's not too complicated. To invoke
+ this, select the notes you want to calculate the beaming for
+ (for example by triple-clicking to select a whole staff) and
+ then use the <guimenuitem>Auto-Beam</guimenuitem> option on the
+ <guimenu>Phrase</guimenu> menu. Auto-beaming
+ is also done automatically when loading a &MIDI; file, for
+ example, and the editor also does some automatic beaming as
+ you enter notes (this can be disabled by changing the
+ "Auto-Beam when appropriate" setting on the configuration
+ dialog or the insertion tool's right-button menu).</para>
+
+ </sect1>
+
+ <!-- Tuplets -->
+
+ <sect1 id="nv-tuplets">
+ <title>Triplets and other tuplets</title>
+
+ <para>A triplet group consists of three notes or chords played
+ in the time of two. (More precisely, it consists of notes
+ with a total duration of three arbitrary units played in the
+ time of two of those units.)</para>
+
+ <para>We use the word <quote>tuplet</quote> to describe the general
+ situation in which notes with a total duration of any given
+ number of units are played in the time of a different number
+ of those units: nine notes in the time of eight, or six in the
+ time of four, or a crotchet and a quaver in the time of a
+ single crotchet, or even two notes in the time of three. (At
+ present &rosegarden; does not support the last example &mdash; tuplet
+ groups must always be played with a shorter duration than
+ written.)</para>
+
+ <para>The triplet and tuplet menu functions work by taking an
+ existing series of notes or rests and squashing them so they
+ play quicker, filling in the left-over space at the end of the
+ series with a final rest and drawing the whole as a tuplet
+ group. You can therefore create a new series of triplets by
+ entering the first two notes of the series (in their normal
+ form), making them into triplets, and then filling in the rest
+ left over by the triplet operation with the final note of the
+ triplet. Or you can apply the triplet operation before you
+ enter any notes, thus turning the original rest itself into
+ triplet form, and then insert the notes of the triplet on top
+ of it. Some examples may help:</para>
+
+ <!-- Need examples and screenshots -->
+
+ <!-- Then discuss general tuplet dialog... -->
+
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-tupletdialog.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase>&rosegarden;'s general tuplet dialog</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+
+ <para>To specify a general tuplet group, we need to know what
+ the base note is (for example, if we play three crotchets in
+ the time of two then the base is a crotchet) and the ratio of
+ the number of base notes written to the number played.</para>
+
+ <!-- Then discuss "tuplet mode": with a subtitle? -->
+
+ </sect1>
+
+ <!-- Grace notes -->
+
+ <!-- Paste -->
+
+ <sect1 id="nv-paste-types">
+ <title>Paste types</title>
+
+ <para>
+ The meaning of <quote>cut and paste</quote> is less obvious for a music
+ editing program than it is for something like a word
+ processor in which the letters and words go in a simple
+ linear order. Accordingly, &rosegarden;'s Notation editor
+ offers several different types of Paste operation, as well
+ as separate Cut and Cut and
+ Close functions.
+ </para>
+
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-pastedialog.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase>&rosegarden;'s paste-type dialog</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+
+ The types of Paste operation are:</para>
+
+ <variablelist>
+
+ <varlistentry>
+ <term>Restricted</term>
+ <listitem>
+ <para>Requires an existing gap (containing nothing but
+ rests) of enough duration to completely contain the
+ clipboard's contents. The contents are pasted into
+ the gap. If there is no gap long enough, the paste
+ is not carried out.
+ </para>
+ <para>
+ This is the default paste type.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>Simple</term>
+ <listitem>
+ <para>Erases enough events to make a gap long enough to
+ paste into, and then pastes into that. The pasted
+ events therefore completely replace any existing ones
+ in the time covered by the paste.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>Open and Paste</term>
+ <listitem>
+ <para>The opposite of Cut and
+ Close. <!-- !!! define that --> Makes room for the paste by moving all of the
+ subsequent events further towards the end of the
+ composition.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>Note Overlay</term>
+ <listitem>
+ <para>Carries out a paste in the way that it would
+ happen if you entered each of the notes in the clipboard
+ yourself using the notation editor: if there are other
+ notes overlapping with them, the new or existing notes
+ will be split into ties appropriately.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>Matrix Overlay</term>
+ <listitem>
+ <para>Carries out a paste in the way that it would
+ happen if you entered each of the notes in the clipboard
+ yourself using the matrix editor: the notes presently
+ in the way of the paste will be ignored, allowing the new
+ notes to overlap arbitrarily with them.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ </variablelist>
+
+ <para>All of these take effect at the current position of the
+ insert cursor on the current staff. To choose between the various
+ paste types, use the Paste...
+ menu option (with dots) on the Edit menu.
+ </para>
+
+ </sect1>
+
+ <sect1 id="nv-adjustments">
+ <title>Adjusting Notation</title>
+
+
+ <sect2 id="nv-adjustments-note-rest-durations">
+ <title>Adjusting note and rest durations</title>
+
+ <sect3 id="nv-normalize-rests">
+ <title>Normalizing rests</title>
+
+ <para>Sometimes as a result of editing or quantization
+ operations, a piece of notation can end up with incorrect
+ rest durations for the current time signature. You can use
+ the <menuchoice><guimenu>Adjust</guimenu><guimenuitem>Rests</guimenuitem><guimenuitem>Normalize Rests</guimenuitem></menuchoice> function to
+ fix these. This examines each sequence of
+ consecutive rests found in the selection, and adjusts,
+ splits and merges rests as necessary to ensure that the
+ rests have theoretically correct durations and fall on the
+ correct boundaries.
+ </para>
+
+ <para>For example, a 4/4 bar containing a crotchet
+ (quarter-note), then a minim (half-note) rest and a
+ crotchet rest will be rearranged to place the crotchet
+ rest first, as the minim rest should not cross the
+ central beat boundary of the bar.
+ </para>
+ </sect3>
+
+ <sect3 id="nv-make-viable">
+ <title>Splitting very long notes</title> <para>The
+ <menuchoice> <guimenu>Adjust</guimenu>
+ <guimenuitem>Notes</guimenuitem> <guimenuitem>Tie Notes at
+ Barlines</guimenuitem> </menuchoice> is intended to deal
+ with notes that have excessively long durations, and
+ therefore overflow barlines or are too long to be
+ displayed as a single note. It takes any such notes and
+ splits them into shorter, tied notes.
+ </para>
+ </sect3>
+
+ <sect3 id="nv-de-counterpoint">
+ <title>Splitting overlapping notes</title>
+ <para>The
+<menuchoice> <guimenu>Adjust</guimenu>
+ <guimenuitem>Notes</guimenuitem> <guimenuitem>Split-and-Tie Overlapping Chords</guimenuitem> </menuchoice> function can be used to turn "counterpoint" notes into a series of split-and-tied notes and chords.</para>
+
+ <para>It can be applied to a selection that contains
+ overlapping notes. It will split overlapping notes at the
+ point where they overlap, and tie together the resulting
+ split notes, ensuring that the music takes the form of a
+ series of chords and/or single notes starting and ending in
+ neat blocks, with some notes possibly tied.
+ </para>
+ </sect3>
+
+ <sect3 id="nv-rescale">
+ <title>Rescaling note durations</title>
+ <para>The
+ <menuchoice> <guimenu>Adjust</guimenu>
+ <guimenuitem>Rescale</guimenuitem> <guimenuitem>Halve
+ Durations</guimenuitem> </menuchoice> and
+ <menuchoice> <guimenu>Adjust</guimenu>
+ <guimenuitem>Rescale</guimenuitem> <guimenuitem>Double
+ Durations</guimenuitem> </menuchoice> functions can be
+ used to perform the most simple rescaling functions.
+ </para>
+
+ <para>For more elaborate rescalings, use the
+ <menuchoice> <guimenu>Adjust</guimenu>
+ <guimenuitem>Rescale</guimenuitem> <guimenuitem>Stretch
+ or Squash...</guimenuitem> </menuchoice> function with
+ which you scale the total lenth of the selection.
+ </para>
+ </sect3>
+
+<!-- need a proper section for this and diatonic transpose
+ <varlistentry id="nv-transpose">
+ <title>Transpose</title>
+ <para><action>Alters the pitch of the selected
+ notes.</action> This submenu contains basic
+ transposition functions which move the selected notes
+ up or down a semitone or a whole octave in pitch, as
+ well as a general transpose function that allows you
+ to choose how far up or down you want to transpose the
+ selection.
+ </para>
+
+ <para>These functions simply change the stored pitches
+ of the notes in the selection, so that they both play
+ and appear at the new pitches. They do not deal with
+ performance transposition (displaying one pitch and
+ playing another), for which see the main window's
+ segment parameter box; nor do they help you with
+ transposing from one key into another, for which see
+ <link linkend="nv-signatures-key">Key
+ Signatures</link>.
+ </para>
+ </varlistentry>
+-->
+ </sect2>
+
+ <sect2>
+ <title id="nv-microposition">Repositioning notation elements</title>
+ <para>
+ You may occasionally wish to to nudge the positioning of some
+ element of notation that Rosegarden's layout algorithm has not
+ placed in an optimal location. Use Ctrl-click and drag to move slurs, hairpins,
+ text events, and several other sorts of events. You may not reposition notes in
+ this fashion.
+ </para>
+ </sect2>
+
+
+
+ </sect1>
+
+ <sect1 id="nv-interpret">
+ <title>Interpreting Performance Cues in Notation</title>
+ <!-- !!! -->
+ <para>
+ You can use the Interpret function<menuchoice>
+ <guimenu>Adjust</guimenu><guimenuitem>Interpret...</guimenuitem>
+ </menuchoice>
+ to modify the velocities and timings of notes according to any
+ written or indicated dynamics found. The selection of
+ interpretations available is as follows:
+
+ <variablelist>
+ <varlistentry>
+ <term>Apply text dynamics (p, mf, ff etc)
+ </term>
+ <listitem><para> Sets a velocity to each note
+ based on the last piece of text of "Dynamic"
+ type seen on the same staff (only texts of the
+ form pp, p, mp, mf, f, ff, fff, etc., are matched; these are
+ the texts that are available by default when entering text events
+ of this style).
+ </para></listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>Apply hairpin dynamics
+ </term>
+ <listitem><para> Makes the notes gradually
+ increase or decrease in velocity during a
+ crescendo or decrescendo hairpin.
+ </para></listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>
+ Stress beats
+ </term>
+ <listitem><para> Makes notes that land on bar or
+ beat boundaries slightly louder (greater
+ velocity) than the surrounding notes.
+ </para></listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>
+ Articulate slurs, staccato, tenuto etc
+ </term>
+ <listitem><para> Shortens unslurred notes,
+ shortens staccato notes more, and gives notes
+ inside slurs and tenuto notes their full length.
+ </para></listitem>
+ </varlistentry>
+ </variablelist>
+
+ </para>
+
+ </sect1>
+
+ <!-- Quantization, smoothing, and display of quantized notes -->
+
+ <sect1 id="nv-quantization">
+ <title>Notation from performance data</title>
+
+ <para>
+ &rosegarden; is a multi-purpose program: it is a notation
+ editor, but it is primarily a sequencer and editor for
+ performed music. And in performance, of course, the times
+ and durations of notes are rarely as precise as they are on
+ a printed score.
+ </para>
+
+ <para>
+ This means that it's often desirable for &rosegarden; to do
+ a lot of tidying of the basic note times and durations when
+ attempting to make meaningful notes to show in the notation
+ editor. This is a kind of quantization, but a kind that
+ requires a surprising amount of guesswork to do well.
+ &rosegarden; includes a quantizer designed to do a slightly
+ better job of this than the plain grid quantizer.
+ </para>
+
+ <para>Applying
+ quantization strictly for notation is rather unimaginatively
+ referred to as <quote>notation quantization</quote>: it only
+ applies to the notes you see and edit in notation, and
+ doesn't affect the notes that play, or that you edit in
+ other views such as the matrix. This quantization is
+ automatically applied to music imported or recorded from
+ MIDI, although not all of its possible capabilities are
+ enabled by default.
+ </para>
+
+ <para>
+ There are two ways to see which notes have been quantized
+ for notation. By default, each notation view contains a <link
+ linkend="nv-raw-note-ruler">raw
+ note ruler</link> (in the group of rulers above the score) showing
+ a rectangular block for each note. This block is positioned
+ so as to represent the time and duration of the note as
+ performed, but with the top and bottom edges of the
+ rectangle extended or shortened to represent the time after
+ notation quantization. If this is too much information for
+ you, you can alternatively choose (in the configuration
+ dialog) to show in a green colour all note heads in the
+ score that have had their timings altered by notation
+ quantization.
+ </para>
+
+ <para>
+
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-notationquantizer.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase>&rosegarden;'s notation quantize dialog</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para><para>
+ If the quantization &rosegarden; has used is not suitable,
+ either for the entire score or for a selection of notes, you
+ can choose to use a different level of quantization or none
+ at all. To apply a different quantization to some notes,
+ select the notes and use the Quantize...
+ menu function (tick the box labelled <quote>Quantize for
+ notation only</quote>). The quantization level or type used
+ by default can be changed in the configuration dialog.
+ </para>
+
+ <sect2 id="nv-quantization-parameters">
+ <title>Configurable parameters for the heuristic notation quantizer</title>
+
+ <sect3 id="nv-quantization-parameters-during">
+ <title>Parameters for quantization itself</title>
+
+ <variablelist>
+
+ <varlistentry>
+ <term>Complexity</term>
+ <listitem>
+ <para>The "complexity" of a notation quantizer is its
+ most fundamental parameter. A "complex" quantizer
+ will be more prepared to accept that complex-looking
+ music is in fact intended to be complex, whereas a
+ "simple" quantizer is more likely to assume that
+ complex-looking music results from an imprecise
+ performance of simple music.
+ </para>
+ <para>The default setting is intended to produce
+ reasonable results for a fairly wide range of music.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>Base grid unit</term>
+ <listitem>
+ <para>The base grid unit (set to a note duration
+ value) specifies the absolute minimum unit of note
+ that will be permitted to remain in the score after
+ quantization. For example, if set to a semiquaver,
+ all notes will be placed on boundaries of a multiple
+ of a semiquaver, with durations also a multiple of a
+ semiquaver.
+ </para>
+ <para>The setting of the base grid unit is not quite
+ as significant for a notation quantizer as it is for a
+ plain grid quantizer, because all it does is impose an
+ absolute limit on the level of precision permitted by
+ the complexity parameter. Mostly, when you find a
+ case in which increasing the grid unit produces better
+ results, you've actually found a case in which the
+ quantizer simply didn't do as good a job as it should
+ have been able to with the smaller unit.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>Tuplet level</term>
+ <listitem>
+ <para>The notation quantizer is capable of identifying
+ tuplets (triplets and other time-squashed groups),
+ within reasonable limits. This parameter controls how
+ ambitious it will attempt to be when looking for
+ tuplets, by setting a limit on how many notes per
+ tuplet group it will attempt to identify. If it is
+ set to <quote>None</quote>, the quantizer will not
+ attempt to identify tuplets at all.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ </variablelist>
+
+ </sect3>
+
+ <sect3 id="nv-quantization-parameters-after">
+ <title>Parameters that control tidying up after quantization</title>
+
+ <variablelist>
+
+ <varlistentry>
+ <term>Re-beam</term>
+ <listitem>
+ <para>
+ Causes the notes to be re-beamed into groups
+ appropriately after quantization. This is usually
+ desirable.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>Add articulations (staccato, tenuto,
+ slurs)</term>
+ <listitem>
+ <para>
+ Causes the quantizer to attempt to identify, based
+ on the durations of individual and consecutive
+ notes, which notes should be notated with staccato
+ marks (for notes that fall significantly short of
+ the following note, but not apparently short
+ enough to merit a rest), tenuto (for notes that
+ almost or just overlap the following note) and
+ slurs (for series of notes that meet or overlap).
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>Tie notes at barlines etc</term>
+ <listitem>
+ <para>Causes any notes that are still found after
+ quantization to overlap barlines or to have
+ durations not exactly expressible with single note
+ heads to be split into multiple notes appropriately,
+ and tied. This has the same effect as applying the
+ <!-- !!! link --> "Tie Notes at Barlines" function
+ in the notation view.
+ </para>
+ <para>
+ This parameter is not set by default because it
+ changes the number of note events, which is
+ undesirable when using &rosegarden; partly or
+ principally as a MIDI sequencer.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>Split-and-tie overlapping chords</term>
+ <listitem>
+ <para>
+ Causes overlapping notes to be split and tied, so
+ as to make strict chords with individual noteheads
+ tied as necessary. This has the same effect as
+ applying the <!-- !!! link --> "Split-and-Tie
+ Overlapping Chords" function in the notation view.
+ </para>
+ <para>
+ This parameter is not set by default partly because
+ it changes the number of note events, which is
+ undesirable when using &rosegarden; partly or
+ principally as a MIDI sequencer.
+ </para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </sect3>
+ </sect2>
+ </sect1>
+
+ <sect1 id="nv-ornaments">
+
+ <title>Playing ornaments</title>
+
+ <para>Rosegarden supports playback of ornaments using its <link
+ linkend="triggered-segments">triggered segments</link>
+ mechanism. You can create triggered segments containing any of
+ the various types of trill or ornament you might want, and
+ associate them with the notes that want to play them.</para>
+
+ <para>To create a new type of ornament, first write out the
+ notes "in longhand" that you want the ornament to play, and then
+ select the notes and use <menuchoice>
+ <guimenu>Note</guimenu><guimenuitem>Ornaments</guimenuitem><guimenuitem>Make
+ Ornament...</guimenuitem></menuchoice>. This cuts the notes to
+ the clipboard, pastes them into a new triggered segment, and
+ replaces them with a single note of the same duration that
+ triggers this segment.</para>
+
+ <para>To make a note play an existing ornament, select it and
+ use <menuchoice>
+ <guimenu>Note</guimenu><guimenuitem>Ornaments</guimenuitem><guimenuitem>Trigger
+ Ornament...</guimenuitem></menuchoice>.</para>
+
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-useornament.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase>&rosegarden;'s Trigger Ornament dialog</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+
+ <para>To edit the notes played in a triggered ornament, you can
+ double-click on the note that triggers it. This will
+ change all uses of that ornament, not just the one that you
+ double-clicked on.</para>
+
+ <para>Note that while Rosegarden can shift triggered segments up
+ and down in pitch to match their triggering notes, it is not
+ clever enough to perform transposition into a different
+ key or scale position.</para>
+
+ <para>See <link linkend="triggered-segments">triggered
+ segments</link> for more details about ornaments and other uses
+ of triggered segments.</para>
+ </sect1>
+
+ <sect1 id="nv-note-styles">
+ <title>Note styles</title>
+
+ <para>
+ &rosegarden; also allows you to change various aspects of the
+ way the various types of notes are drawn, such as the choice
+ of note heads, the number of tails, whether notes are filled
+ or unfilled and so on.
+ </para>
+
+ <para>
+ A set of standard styles (Classical, Cross, Triangle and
+ Mensural) is provided, and you can change the style used for
+ individual notes by selecting them and then using the Note
+ Style menu options. Each note remembers which
+ style has been chosen for it, and this information is saved
+ as part of the composition. You can also change the default
+ style for new notes using the
+ <guimenuitem>Configure Rosegarden...</guimenuitem> option in the
+ <guimenu>Settings</guimenu> menu.
+ </para>
+
+ <para>
+ It is also possible to create your own note styles by
+ describing them in <acronym>XML</acronym> files. (Even the
+ standard styles are defined this way: the only reason the
+ editor knows that a Classical semiquaver has a tilted oval
+ filled head, a stem, two flags, etc., is that the description
+ in Classical.xml says so.) See <link
+ linkend="developers-note-styles">Customising Rosegarden</link>
+ for more information.
+ </para>
+ </sect1>
+
+ <sect1 id="nv-note-fonts">
+ <title>Note fonts</title>
+ <para>
+ &rosegarden; is supplied with a single scalable notation
+ font, the Feta font developed by the LilyPond project. Feta
+ is an extremely high quality font that should be suitable
+ for nearly all classical work.
+ </para>
+
+ <para>&rosegarden; also includes support as standard for a
+ number of other notation fonts. You will need to provide the
+ fonts themselves in TrueType (.ttf) or PostScript Type-1
+ (.pfb, .pfa) format, and you will need the relevant
+ permissions to install them to the same place as &rosegarden;
+ was installed. To install a supported notation font, locate
+ the share directory for the &rosegarden; installation (usually
+ a subdirectory of the KDE desktop installation tree, such as
+ /opt/kde/share/apps/rosegarden). You will find that this
+ directory has a subdirectory called "fonts": copy the font
+ files into there, and restart &rosegarden;. If your font is
+ supported, it should now appear on the font menu in the
+ notation editor.</para>
+
+ <para>Complete or partial support is currently provided for
+ the following fonts: Fughetta, by Blake Hodgetts; Petrucci,
+ the "original" Finale font; Maestro, the "new" Finale font;
+ Opus, the Sibelius font; Inkpen, the Sibelius jazz font;
+ Sonata from Adobe; Steinberg, from the Cubase sequencer; and
+ Xinfonia. (Most of the above font names are registered
+ trademarks of the respective companies.) THE ROSEGARDEN TEAM
+ MAKES NO REPRESENTATION AS TO THE LEGAL STATUS OF ANY USE OF
+ THESE FONTS WITH ROSEGARDEN. It is your responsibility to
+ ensure you are in compliance with the licence (if any) under
+ which a font was provided to you, before attempting to use it.
+ If you are not sure whether you have the right to use a font,
+ don't: apart from anything else, the standard Feta font is
+ better than most of these anyway.</para>
+
+ <para>It is also possible to provide new mapping files so as
+ to use new fonts. For some fonts that have similar mappings
+ or metrics to fonts in the above list, this may be as simple
+ as editing the name of the font in the mapping file. See
+ <link linkend="developers-note-fonts">Customising Rosegarden</link>
+ for more information.
+
+ </para>
+ </sect1>
+ </chapter>
+
+ <chapter id="event-view">
+ <title>The Event List editor</title>
+ <sect1 id="ev-introduction">
+ <title>Introduction</title>
+
+ <para>
+
+ The &rosegarden; Event List editor shows the events in a
+ single segment in a raw form, and enables you to edit the
+ precise properties of those events individually.
+
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-eventlisteditor.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase>&rosegarden;'s event list editor</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+ </sect1>
+ </chapter>
+
+
+
+
+ <!--
+ **********************************
+
+ PART III:
+ Technical material
+
+ **********************************
+ -->
+
+ <chapter id="developers">
+ <title>Customising Rosegarden</title>
+
+ <sect1 id="developers-note-fonts">
+ <title>Configuring custom notation fonts</title>
+
+ <para>If you have a notation font installed on your system in a
+ scalable format (TrueType or Type-1) but it is not currently
+ supported by Rosegarden, you can create your own mapping XML
+ file to describe the font's character map and metrics in a way
+ Rosegarden can use. These files are installed in the
+ fonts/mappings subdirectory of the Rosegarden installation
+ directory, and a number of samples are included with the
+ distribution.</para>
+
+ <para>You can also use these mapping files to define new
+ pixmap-based fonts, in which every shape in a particular size is
+ loaded from a separate pixmap file. The two standard notation
+ fonts supplied with Rosegarden are pixmap fonts defined in
+ exactly this way.
+ </para>
+
+ <para>It is even possible to define a notation font as using one
+ or more scalable system fonts, augmented with pixmaps for
+ particular sizes or for characters not found in the scalable
+ fonts. This is because most of the mapping file format is the
+ same for scalable and pixmap fonts, and where there are
+ different elements for the different sorts of fonts, it is
+ usually possible to include both of them. Rosegarden will
+ usually use pixmaps where available and scalable fonts
+ otherwise.
+ </para>
+
+ <para>You may also wish to edit the mapping files supplied with
+ Rosegarden if you find their measurements for alignment or
+ sizing are not to your liking. (If you believe that any of the
+ supplied files are actually wrong, please let us know.)
+ </para>
+
+ <sect2 id="developers-note-fonts-codes-glyphs">
+ <title>Codes and Glyphs</title>
+
+ <para></para>
+ </sect2>
+
+ <sect2 id="developers-note-fonts-mapping-format">
+ <title>Notation font mapping XML format</title>
+
+ <para>Here is a summary of the XML elements that may be used
+ in the font mapping file.</para>
+
+ <sect3 id="developers-note-fonts-mapping-format-font-encoding">
+ <title>rosegarden-font-encoding</title>
+
+ <para>This element must exist in every mapping file, and
+ should contain all the other elements. The only attribute
+ is "name", which contains the font's name as shown in the
+ font selection dropdown. Although the file format will
+ permit any name to be used here, Rosegarden will only pick
+ up the font corectly if the XML file has the same name as
+ the contents of this attribute (except that the XML file
+ should be named in lower-case and should end in ".xml").
+ </para>
+ </sect3>
+
+ <sect3 id="developers-note-fonts-mapping-format-font-information">
+ <title>font-information</title>
+
+ <para>This should normally be the first child element of
+ "rosegarden-font-encoding". It may have any of the
+ following attributes, all of which are optional:
+
+ <variablelist>
+ <varlistentry>
+ <term>origin</term>
+ <listitem>
+ <para>A textual description of the likely origin of
+ the mapped font (not the origin of the mapping
+ file).</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>copyright</term>
+ <listitem>
+ <para>A textual description of the likely copyright
+ status of the mapped font (not the copyright status
+ of the mapping file). Note that because the mapping
+ file contains information such as origin and
+ copyright of the font itself, it is usually
+ advisable to make separate mapping files for
+ separate fonts where practical, even if the fonts
+ share other mapping data.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>mapped-by</term>
+ <listitem>
+ <para>The name of the creator of the mapping file
+ (i.e. you, presumably).</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>type</term>
+ <listitem>
+ <para>The type of the font. This attribute should
+ contain one of the values "pixmap" or "scalable".
+ Fonts that are loaded into the windowing system and
+ are available to Rosegarden as standard system fonts
+ have type "scalable"; fonts that need to be loaded
+ from pixmap files corresponding to individual sizes
+ of pixmap (such as the feta and rg21 fonts included
+ with Rosegarden) have type "pixmap".</para>
+
+ <para>This information is only intended for the user
+ reference; it isn't actually used by Rosegarden. It is
+ legitimate in practice for a font to be a mixture of the
+ two, but in general we will assume in this documentation
+ that a font is either scalable or pixmap.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>smooth</term>
+ <listitem>
+ <para>A boolean attribute indicating whether the
+ font is antialiased (smooth) or not. Should have
+ the value "true" or "false". If the font is smooth,
+ other display elements such as beams and slurs that
+ are not generated from the font will also be
+ antialiased.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>autocrop</term>
+ <listitem>
+ <para>Only relevant for scalable (system) fonts.
+ Rosegarden usually expects the metrics for a font to
+ contain the vertically smallest bounding boxes for
+ elements such as note heads and accents, rather than
+ including empty space above or below these elements
+ for alignment purposes. Most fonts do not do what
+ Rosegarden expects. Therefore for these fonts you
+ should set the autocrop attribute to "true"; then
+ Rosegarden will crop any unnecessary space from the
+ top and bottom of these elements when rendering
+ them.</para>
+ </listitem>
+ </varlistentry>
+
+ </variablelist>
+
+ </para>
+ </sect3>
+
+ <sect3 id="developers-note-fonts-mapping-format-font-requirements">
+ <title>font-requirements</title>
+ <para>
+ This element is only relevant for scalable fonts. It is
+ used to specify that this font should only be offered if
+ certain system fonts are available, as well as to
+ associate IDs with those system fonts to refer to in the
+ <link
+ linkend="developers-note-fonts-mapping-format-font-symbol-map">font-symbol-map</link>
+ element. This scheme is used to decide which notation
+ fonts should be offered to the user, and also allows you
+ to compose a Rosegarden notation font from more than one
+ system font if desired.
+ </para>
+ <para>The "font-requirements" element should contain a list
+ of "font-requirement" child elements. Each of these has two
+ attributes: "font-id", containing a numerical ID of your
+ choice for reference elsewhere in the file, and either a
+ "name" or a "names" attribute. If "name" is provided, it
+ will be used as the name of a single system font to be
+ associated with the font id; if "names" is provided, it will
+ be treated as a comma-separated list of system fonts and the
+ first one found will be associated with the font id.
+ </para>
+ </sect3>
+
+ <sect3 id="developers-note-fonts-mapping-format-font-sizes">
+ <title>font-sizes</title>
+
+ <para>The "font-sizes" element specifies which notation font
+ sizes are available, and how the nominal font size relates
+ to the dimensions of non-font elements such as stems, staff
+ lines and beams. The "size" of a notation font is assumed
+ to be the distance in pixels between staff lines, or more
+ precisely, the height of a conventional note head that
+ completely fills the space between lines: the size therefore
+ does not include the thickness of either of the neighbouring
+ staff lines.
+ </para>
+
+ <para>
+ <!-- !!! TODO throughout this section: how to mark up XML element/attribute names? equiv of <code> in HTML would do -->
+ There are two possible child elements of "font-sizes":
+ "font-scale" and "font-size". Their use depends on the
+ type of font being described.</para>
+
+ <para>
+ For pixmap (non-scalable) fonts, the "font-sizes" element
+ should contain a list of "font-size" elements, one for
+ each size of pixmaps available. The pixmaps themselves
+ must be installed in the
+ fonts/&lt;font-name&gt;/&lt;font-size&gt; subdirectory of
+ the Rosegarden installation directory, where
+ &lt;font-name&gt; is the name of the font (as specified in
+ the "rosegarden-font-encoding" element at the start of the
+ mapping file), or a lower-case version of the name, and
+ &lt;font-size&gt; is the pixel size of the font. A font
+ size will only be made available to the user if it has an
+ entry in the "font-sizes" list and the pixmap directory is
+ found.
+ </para>
+
+ <para>
+ For scalable fonts, the "font-sizes" element should
+ contain one "font-scale" element that defines the
+ relationships between font and non-font elements in a
+ general way, and also defines the relationship between
+ Rosegarden's nominal font size and the size of the
+ corresponding system font. If this "font-scale" element
+ is found, then Rosegarden will assume the font is
+ available in any size. You can however still include one
+ or more "font-size" elements to define precise proportions
+ for any particular size for which the general proportions
+ do not quite work correctly, for example because of
+ rounding error.
+ </para>
+
+ <para>
+ The attributes of "font-scale" and "font-size" are very
+ similar. The main difference is that all attributes of
+ "font-scale" are floating-point values relative to the
+ font size, where 1.0 is the base font size (i.e. the
+ distance between staff lines), whereas attributes of
+ "font-size" are integer pixel values. The attributes
+ available are as follows. (Those marked "optional" have
+ vaguely sensible defaults, so it's a good idea to try not
+ setting them first.)
+ </para>
+
+ <variablelist>
+
+ <varlistentry>
+ <term>note-height</term>
+ <listitem>
+ <para>This attribute is only available for the
+ "font-size" element, and it is mandatory in that
+ element. It defines the base size of font to which the
+ other attributes in this element apply, and a size that
+ will be offered to the user and used when looking up
+ pixmaps for this font.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>font-height</term>
+ <listitem>
+ <para>May be used in either "font-size" or "font-scale".
+ This is only relevant for scalable fonts, but is
+ mandatory for them if used in the "font-scale" element.
+ This defines the size of the system font used to draw a
+ given size of notation font.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>beam-thickness</term>
+ <listitem>
+ <para>Optional. Defines the thickness of a beam.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>staff-line-thickness</term>
+ <listitem>
+ <para>Optional. Defines the thickness of a staff line.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>stem-thickness</term>
+ <listitem>
+ <para>Optional. Defines the thickness of a note stem.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>flag-spacing</term>
+ <listitem>
+ <para>Optional. Defines the gap between note flags in
+ cases where multiple flags are drawn by drawing a single
+ flag several times.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>border-x</term>
+ <listitem>
+ <para>Optional. Specifies that the note head pixmaps
+ have a fixed area to left and right that should not be
+ considered part of the note head. This attribute gives
+ the thickness of that area.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>border-y</term>
+ <listitem>
+ <para>Optional. Specifies that the note head pixmaps
+ have a fixed area to top and bottom that should not be
+ considered part of the note head. This attribute gives
+ the thickness of that area.</para>
+ </listitem>
+ </varlistentry>
+
+ </variablelist>
+ </sect3>
+
+ <sect3 id="developers-note-fonts-mapping-format-font-symbol-map">
+ <title>font-symbol-map</title>
+ <para>
+ This element lists the symbols available in this notation
+ font, and which pixmap files or system font code points
+ they should be drawn from.</para>
+
+ <para>It should contain a list of "symbol" elements. These
+ have several possible attributes, the choice of which will
+ normally depend on whether the font is based on pixmaps or
+ system fonts:
+ </para>
+
+ <variablelist>
+ <varlistentry>
+ <term>name</term>
+ <listitem>
+ <para>Mandatory. This attribute should contain the
+ name of the notation symbol. If the symbol exists in
+ the <ulink
+ url="http://www.unicode.org/charts/PDF/U1D100.pdf">Unicode
+ 3.2 standard</ulink>, the name should be that used to
+ identify the symbol in the standard.</para>
+
+ <para>Most of the symbols Rosegarden expects to find
+ are in the standard; one exception is that many fonts
+ have a special version of the flag symbol that is
+ intended to be used when composing multiple flags from
+ individual single flags. Rosegarden refers to this as
+ "MUSICAL SYMBOL COMBINING FLAG-0", a name not used in
+ the Unicode standard (which has flags 1-5 only).</para>
+
+ <para>For a definitive set of the symbol names
+ Rosegarden knows about, see the file
+ "gui/notecharname.cpp" in the Rosegarden source
+ distribution. Note however that it is possible to use
+ additional symbol names by introducing them in a <link
+ linkend="developers-note-styles">notation
+ style</link>.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>src</term>
+ <listitem>
+ <para>The name of the pixmap file from which this
+ symbol should be loaded, without a directory or
+ extension. This is the usual way of describing a
+ symbol in a pixmap font. The file itself should be
+ installed to
+ fonts/&lt;font-name&gt;/&lt;font-size&gt;/&lt;src&gt;.xpm
+ under the Rosegarden installation directory.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>inversion-src</term>
+ <listitem>
+ <para>The name of a pixmap file from which an inverted
+ version of this symbol may be loaded, without a
+ directory or extension. If this attribute is absent
+ and an inverted version of the symbol is required, it
+ will be generated simply by loading the normal version
+ and reflecting it in a central x-axis.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>code</term>
+ <listitem>
+ <para>The code point at which this symbol may be found
+ in the relevant system font, as a decimal integer.
+ This is a way of describing a symbol in a scalable
+ font. This attribute will only be referred to if no
+ pixmap file is supplied, or if the pixmap file fails
+ to load.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>inversion-code</term>
+ <listitem>
+ <para>The code point at which an inverted version of
+ this symbol may be found in the relevant system font.
+ If this attribute is absent and an inverted version of
+ the symbol is required, it will be generated simply by
+ loading the normal version and reflecting it in a
+ central x-axis.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>glyph</term>
+ <listitem>
+ <para>The raw glyph index at which this symbol may be found
+ in the relevant system font, as a decimal integer.
+ This is a way of describing a symbol in a scalable
+ font. This attribute will only be referred to if no
+ pixmap file is supplied, or if the pixmap file fails
+ to load.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>inversion-glyph</term>
+ <listitem>
+ <para>The raw glyph index at which an inverted version of
+ this symbol may be found in the relevant system font.
+ If this attribute is absent and an inverted version of
+ the symbol is required, it will be generated simply by
+ loading the normal version and reflecting it in a
+ central x-axis.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>font-id</term>
+ <listitem>
+ <para>The id of the system font from which this symbol
+ should be loaded, as defined in the <link
+ linkend="developers-note-fonts-mapping-format-font-requirements">font-requirements</link>
+ element. The default is 0.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>codebase</term>
+ <listitem>
+ <para>This (decimal integer) attribute may be of use
+ if many of the symbols in a scalable font cover a
+ short range of code points starting at a relatively
+ high code page. If supplied, the codebase value will
+ be added to each of the subsequent code and
+ inversion-code values when looking up a symbol.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ </variablelist>
+
+ <para>
+ Although none of these attributes is mandatory except for
+ the name, a symbol obviously needs to supply at least one
+ of "src", "inversion-src", "code", "inversion-code",
+ "glyph", or "inversion-glyph" to stand any chance of being
+ rendered at all. It is of course perfectly legitimate to
+ supply several or all of these attributes.
+ </para>
+
+ </sect3>
+
+ <sect3 id="developers-note-fonts-mapping-format-font-hotspots">
+ <title>font-hotspots</title>
+ <para>&nbsp;
+ </para>
+ </sect3>
+
+ </sect2>
+
+ </sect1>
+
+ <sect1 id="developers-note-styles">
+ <title>Creating new notation styles</title>
+
+ <para>
+ Rosegarden's notation editor has the ability to display and
+ edit notes in various standard styles: classical, diamond
+ heads and so on. These styles are all defined in XML style
+ definition files installed along with the application, and
+ it's possible to create a new one by writing a simple XML
+ file. Rosegarden simply looks at the set of installed files
+ to determine which styles to offer the user. You can refer to
+ the default set of files in the styles subdirectory of the
+ Rosegarden installation directory for examples.
+ </para>
+
+ <para>
+ The file format is not yet especially comprehensive; at the
+ moment it has been designed to be powerful enough to describe
+ the standard styles that come with Rosegarden, but not much
+ more. If you should try to create new styles this way, we'd
+ be very interested in your feedback on the Rosegarden
+ mailing-lists.
+ </para>
+
+ <sect2 id="developers-note-styles-format">
+ <title>Notation style XML format</title>
+
+ <para>
+ Here is a summary of the XML elements that may be used in
+ a style definition file.
+ </para>
+
+ <sect3 id="developers-note-styles-note-style">
+ <title>rosegarden-note-style</title>
+
+ <para>This element must exist in every style file, and
+ should contain all the other elements. It has one optional
+ attribute, "base-style", which may be used to name a style
+ from which this style takes the default values for any
+ parameters not specified elsewhere in the present file.
+ It's often good practice to define a style in terms of the
+ minimal difference from a given base style: see the supplied
+ Cross.xml for a particularly simple example.
+ </para>
+
+ <para>Note that the "rosegarden-note-style" element does not
+ give the name of the style being defined, which is instead
+ currently drawn from the name of the file. At some point in
+ the future we may add internationalizable style name
+ attributes to this element.</para>
+ </sect3>
+
+ <sect3 id="developers-note-styles-global-note">
+ <title>global, note</title>
+
+ <para>Within the "rosegarden-note-style" element, there may
+ be one "global" element and any number of "note" elements.
+ We describe these together, as they have almost identical
+ sets of attributes. The "global" element simply provides
+ default values for those parameters not specified for a
+ particular note type in any following "note" element.
+ </para>
+
+ <para>The attributes for these elements are as follows. All
+ of these are optional except as described:</para>
+
+ <variablelist>
+
+ <varlistentry>
+ <term>type</term>
+ <listitem>
+ <para>Only relevant to the "note" element, and
+ mandatory for that element. This attribute specifies
+ which sort of note is being styled. Legal values are
+ textual American or British note names (from "64th",
+ "sixth-fourth note", "hemidemisemiquaver" etc to
+ "double whole note").
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>shape</term>
+ <listitem>
+ <para>Defines a note head shape for this style. Any
+ string is a legal value, but the only values
+ implemented so far are "angled oval", "level oval",
+ "breve", "cross", "triangle up", "triangle down",
+ "diamond" and "rectangle". The value "number" is also
+ recognised but not yet implemented.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>charname</term>
+ <listitem>
+ <para>Defines a note font character name to be used as
+ the note head for this style. An element may supply a
+ "shape" or "charname" attribute, but not both. The
+ name should be one of those defined in the current
+ notation font's <link
+ linkend="developers-note-fonts-mapping-format-font-symbol-map">symbol
+ map</link> (in a "name" attribute).
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>filled</term>
+ <listitem>
+ <para>Specifies whether this note should have a filled
+ head (where applicable, i.e. where the shape attribute
+ supplies a shape that is available both filled and
+ unfilled). Must be "true" or "false".
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>stem</term>
+ <listitem>
+ <para>Specifies whether this note should have a stem.
+ Must be "true" or "false".
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>flags</term>
+ <listitem>
+ <para>Defines how many flags or beams this note should
+ have. The valid range is 0 to 4.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>slashes</term>
+ <listitem>
+ <para>Defines how many slashes this note should have
+ across its stem.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>hfixpoint</term>
+ <listitem>
+ <para>Specifies in which x position the stem fixes to
+ the note head. Acceptable values are "normal" (the
+ right side when the stem points up, the left when it
+ points down), "central", and "reversed" (left side
+ when the stem points up, right when it points down).
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>vfixpoint</term>
+ <listitem>
+ <para>Specifies in which y position the stem fixes to
+ the note head. Acceptable values are "near" (the stem
+ fixes to the top when pointing up, the bottom when
+ pointing down), "middle", or "far".
+ </para>
+ </listitem>
+ </varlistentry>
+
+ </variablelist>
+ </sect3>
+ </sect2>
+ </sect1>
+
+
+ <!-- (OPTIONAL) A Programming/Scripting reference chapter should be
+ used for apps that use plugins or that provide their own scripting hooks
+ and/or development libraries. -->
+
+ <!-- cc: I think we should document the DCOP API here, but I don't
+ think we should include extensive developer docs, although we should
+ point to where they can be found in the source tree or online. -->
+ <!--
+ <para>
+ Programming <application>Rosegarden</application> plugins is
+ a joy to behold. Just read through the next
+ 66 pages of <acronym>API</acronym>'s to learn how!
+ </para>
+ -->
+ <!-- Use refentries to describe APIs. Refentries are fairly
+ complicated and you should consult the docbook reference for
+ further details. The example below was taken from that reference
+ and shortened a bit for readability. -->
+ <!--
+ <refentry id="re-1007-unmanagechildren-1">
+ <refmeta>
+ <refentrytitle>XtUnmanageChildren</refentrytitle>
+ <refmiscinfo>Xt &ndash; Geometry Management</refmiscinfo>
+ </refmeta>
+ <refnamediv>
+ <refname>XtUnmanageChildren
+ </refname>
+ <refpurpose>remove a list of children from a parent widget's managed list.
+ </refpurpose>
+ </refnamediv>
+ <refsynopsisdiv>
+ <refsynopsisdivinfo>
+ <date>4 March 1996</date>
+ </refsynopsisdivinfo>
+ <synopsis>
+ void XtUnmanageChildren(<replaceable>children</replaceable>, <replaceable>num_children</replaceable>)
+ WidgetList <replaceable>children</replaceable>;
+ Cardinal <replaceable>num_children</replaceable>;
+ </synopsis>
+
+ <refsect2 id="r2-1007-unmanagechildren-1">
+ <title>Inputs</title>
+ <variablelist>
+ <varlistentry>
+ <term><replaceable>children</replaceable>
+ </term>
+ <listitem>
+ <para>
+ Specifies an array of child widgets. Each child must be of
+ class RectObj or any subclass thereof.
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><replaceable>num_children</replaceable>
+ </term>
+ <listitem>
+ <para>Specifies the number of elements in <replaceable>children</replaceable>.
+ </para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refsect2></refsynopsisdiv>
+
+ <refsect1 id="r1-1007-unmanagechildren-1">
+ <title>Description
+ </title>
+ <para>
+ <function>XtUnmanageChildren()</function> unmaps the specified widgets
+ and removes them from their parent's geometry management.
+ The widgets will disappear from the screen, and (depending
+ on its parent) may no longer have screen space allocated for
+ them.
+ </para>
+ <para>Each of the widgets in the <replaceable>children</replaceable> array must have
+ the same parent.
+ </para>
+ <para>See the &ldquo;Algorithm&rdquo; section below for full details of the
+ widget unmanagement procedure.
+ </para>
+ </refsect1>
+
+ <refsect1 id="r1-1007-unmanagechildren-2">
+ <title>Usage</title>
+ <para>
+ Unmanaging widgets is the usual method for temporarily
+ making them invisible. They can be re-managed with
+ <function>XtManageChildren()</function>.
+ </para>
+ <para>
+ You can unmap a widget, but leave it under geometry
+ management by calling <function>XtUnmapWidget()</function>. You can
+ destroy a widget's window without destroying the widget by
+ calling <function>XtUnrealizeWidget()</function>. You can destroy a
+ widget completely with <function>XtDestroyWidget()</function>.
+ </para>
+ <para>
+ If you are only going to unmanage a single widget, it is
+ more convenient to call <function>XtUnmanageChild()</function>. It is
+ often more convenient to call <function>XtUnmanageChild()</function>
+ several times than it is to declare and initialize an array
+ of widgets to pass to <function>XtUnmanageChildren()</function>. Calling
+ <function>XtUnmanageChildren()</function> is more efficient, however,
+ because it only calls the parent's <function>change_managed()</function>
+ method once.
+ </para>
+ </refsect1>
+
+ <refsect1 id="r1-1007-unmanagechildren-3">
+ <title>Algorithm
+ </title>
+ <para><function>XtUnmanageChildren()</function> performs the following:
+ </para>
+ <variablelist>
+ <varlistentry>
+ <term>-
+ </term>
+ <listitem>
+ <para>Ignores the child if it already is unmanaged or is being
+ destroyed.
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>-
+ </term>
+ <listitem>
+ <para>Otherwise, if the child is realized, it makes it nonvisible
+ by unmapping it.
+ </para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ <para>
+ </para>
+ </refsect1>
+
+ <refsect1 id="r1-1007-unmanagechildren-4">
+ <title>Structures</title>
+ <para>
+ The <type>WidgetList</type> type is simply an array of widgets:
+ </para>
+ <screen id="sc-1007-unmanagechildren-1">
+ typedef Widget *WidgetList;
+ </screen>
+ </refsect1>
+ </refentry>
+ -->
+ </chapter>
+
+
+ <chapter id="credits">
+
+ <title>Credits and License</title>
+
+ <para>
+ <application>Rosegarden</application>
+ </para>
+ <para>
+ <itemizedlist>
+ <listitem>
+ <para>
+
+ Rosegarden is Copyright 2000-2008 Guillaume Laurent,
+ Chris Cannam and Richard Bown. The moral rights of
+ Guillaume Laurent, Chris Cannam and Richard Bown to be
+ identified as the authors of this work have been asserted.
+
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+
+ Parts of Rosegarden are derived from X11 Rosegarden 2.1,
+ which is Copyright 1994 &ndash; 2001 Chris Cannam, Andrew Green,
+ Richard Bown and Guillaume Laurent.
+
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+
+ For musical notation display Rosegarden uses pixmaps
+ derived from the Feta font, part of the <ulink
+ url="http://lilypond.org/">LilyPond</ulink> software,
+ which is Copyright 1997 &ndash; 2001 Jan Nieuwenhuizen and
+ Han-Wen Nienhuys.
+
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+
+ Other major contributors include Randall Farmer, Ron
+ Kuris, Hans Kieserman, Michael McIntyre, and Pedro
+ Lopez-Cabanillas.
+
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+
+ The Rosegarden splash-screen image is Copyright 2006 Carolyn H. McIntyre,
+ used by permission.
+
+ </para>
+ </listitem>
+
+ </itemizedlist>
+ </para>
+
+ <para>
+ Documentation copyright 2002-2006 Chris Cannam, Richard Bown, Guillaume Laurent
+ </para>
+ <!--
+ <para>
+ Translations done by:
+ <itemizedlist>
+ <listitem>
+ <para>Babel D. Fish <email>[email protected]</email> (Sanskrit)</para>
+ </listitem>
+ </itemizedlist>
+ </para>
+ -->
+ <!-- For URL links to common stuff like the one below,
+ always use paths like "common/gpl-licence".
+ In this path, "common" will be a symbolic link built at "make install" time.
+ This link will normally point to $KDEDIR/share/doc/HTML/en/common,
+ where "en" should be replaced with the current language. -->
+
+ <para>
+ This program is licensed under the terms of the
+ <ulink url="common/gpl-license.html">GNU General Public License</ulink>.
+ </para>
+ </chapter>
+
+ <!-- Note that the revhistory tags apply to the documentation
+ version and not to the app version. That is why we use an
+ ItemizedList instead for this list of revisions to the app. -->
+
+ <chapter id="rosegarden-revhistory">
+ <title>Rosegarden Revision History</title>
+ <para>
+ <itemizedlist>
+ <listitem><para>
+ 1.7.0 &ndash; May 2008: notation track headers, nested brackets in
+ LilyPond export, grace notes finally functional, quick playback
+ position marker, ties can be flipped, variable-height tracks allow
+ access to all previously overlapping segments, take track
+ transpose into account while recording, convert existing segments
+ when loading an instrument preset, etc., bug fixes galore
+ </para></listitem>
+ <listitem><para>
+ 1.6.0 &ndash; November 2007: fretboards, diatonic transpose, multiple lines of lyrics, marker ruler improvements, overlapping notes visibility, LilyPond export enhancements and new dialog, better infrared remote control support, better configuration dialog, fixes
+ </para></listitem>
+ <listitem><para>
+ 1.5.1 &ndash; March 2007: bug fixes
+ </para></listitem>
+ <listitem><para>
+ 1.5 &ndash; February 2007: audio timestretching and input format conversion, matrix usability improvements, tempo tapping, context help, some features, code reorganisation and new build system (again)
+ </para></listitem>
+ <listitem><para>
+ 1.4 &ndash; September 2006: LilyPond export vastly improved,
+ exportable LilyPond directives, cut/copy/paste by ranges that
+ include tempo and time data, tempo entry and manipulation vastly
+ improved, multi-track MIDI recording, MIDI recording filters,
+ track paramter box, create segments using preset parameters from
+ a database of over 300 real-world instruments, texts like
+ "Allegro" offered as a parallel alternative to typing, LilyPond
+ preview, assorted smaller features, many bug fixes
+ </para></listitem>
+ <listitem><para>
+ 1.2.4 &ndash; July 2006: bug fixes
+ </para></listitem>
+ <listitem><para>
+ 1.2.3 &ndash; February 2006: new segment canvas, percussion matrix, multi-track audio recording, project packager, external MIDI controllers, MTC sync, proper ALSA MIDI ports, new icons, new build system
+ </para></listitem>
+ <listitem><para>
+ 1.0 &ndash; February 2005: many fixes, DSSI effects, latency compensation
+ </para></listitem>
+ <listitem><para>
+ 0.9.9 &ndash; July 2004: plugin synths, triggered segments, notation improvements
+ </para></listitem>
+ <listitem><para>
+ 0.9.8 &ndash; May 2004: better audio subsystem
+ </para></listitem>
+ <listitem><para>
+ 0.9.7 &ndash; February 2004:
+ </para></listitem>
+ <listitem><para>
+ 0.9.6 &ndash; December 2003: bug fixes
+ </para></listitem>
+ <listitem><para>
+ 0.9.5 &ndash; November 2003: a great lot of stuff
+ </para></listitem>
+ <listitem><para>
+ 0.9.1 &ndash; May 2003: step recording, Mup export, many many bug fixes
+ </para></listitem>
+ <listitem><para>
+ 0.9 &ndash; April 2003: many notation improvements, improved bank editor, audio enhancements and refinements, translations
+ </para></listitem>
+ <listitem><para>
+ 0.8.5 &ndash; December 2002: bank editor, MIDI filters, panic button
+ </para></listitem>
+ <listitem><para>
+ 0.8 &ndash; October 2002: printing, LADSPA plugins, improved Matrix View
+ </para></listitem>
+ <listitem><para>
+ 0.2.0 &ndash; August 2002: WAV file support, sweep selections, contrapuntal staves
+ </para></listitem>
+ <listitem><para>
+ 0.1.6 &ndash; June 2002: configuration dialog, LilyPond support, quantize dialog
+ </para></listitem>
+ <listitem><para>
+ 0.1.5 &ndash; May 2002: KDE 3, ALSA support, JACK audio support
+ </para></listitem>
+ <listitem><para>
+ 0.1.4 &ndash; March 2002: more undo, segment editing, audio playback
+ </para></listitem>
+ <listitem><para>
+ 0.1.3 &ndash; January 2002: piano-roll/matrix view, &MIDI; recording
+ </para></listitem>
+ <listitem><para>
+ 0.1.2 &ndash; November 2001: notation undo, transport dialog, position pointer
+ </para></listitem>
+ <listitem><para>
+ 0.1.1 &ndash; October 2001: scalable notation
+ </para></listitem>
+ <listitem><para>
+ 0.1 &ndash; June 2001: first public release of Rosegarden-4
+ </para></listitem>
+ </itemizedlist>
+ </para>
+ </chapter>
+
+ &documentation.index;
+</book>
diff --git a/docs/en/rg-audiofilemanager.png b/docs/en/rg-audiofilemanager.png
new file mode 100644
index 0000000..cec91d3
--- /dev/null
+++ b/docs/en/rg-audiofilemanager.png
Binary files differ
diff --git a/docs/en/rg-audiomixer.png b/docs/en/rg-audiomixer.png
new file mode 100644
index 0000000..2fdb115
--- /dev/null
+++ b/docs/en/rg-audiomixer.png
Binary files differ
diff --git a/docs/en/rg-bankeditor.png b/docs/en/rg-bankeditor.png
new file mode 100644
index 0000000..aee8d0b
--- /dev/null
+++ b/docs/en/rg-bankeditor.png
Binary files differ
diff --git a/docs/en/rg-button-bar-time.png b/docs/en/rg-button-bar-time.png
new file mode 100644
index 0000000..d79a2c5
--- /dev/null
+++ b/docs/en/rg-button-bar-time.png
Binary files differ
diff --git a/docs/en/rg-button-from-end.png b/docs/en/rg-button-from-end.png
new file mode 100644
index 0000000..6846b0a
--- /dev/null
+++ b/docs/en/rg-button-from-end.png
Binary files differ
diff --git a/docs/en/rg-clefdialog.png b/docs/en/rg-clefdialog.png
new file mode 100644
index 0000000..d5667cf
--- /dev/null
+++ b/docs/en/rg-clefdialog.png
Binary files differ
diff --git a/docs/en/rg-coda.png b/docs/en/rg-coda.png
new file mode 100644
index 0000000..39ca7c8
--- /dev/null
+++ b/docs/en/rg-coda.png
Binary files differ
diff --git a/docs/en/rg-colours.png b/docs/en/rg-colours.png
new file mode 100644
index 0000000..7800a12
--- /dev/null
+++ b/docs/en/rg-colours.png
Binary files differ
diff --git a/docs/en/rg-cursors.png b/docs/en/rg-cursors.png
new file mode 100644
index 0000000..7d72bed
--- /dev/null
+++ b/docs/en/rg-cursors.png
Binary files differ
diff --git a/docs/en/rg-devicemanager.png b/docs/en/rg-devicemanager.png
new file mode 100644
index 0000000..9453c9a
--- /dev/null
+++ b/docs/en/rg-devicemanager.png
Binary files differ
diff --git a/docs/en/rg-eraser.png b/docs/en/rg-eraser.png
new file mode 100644
index 0000000..2242903
--- /dev/null
+++ b/docs/en/rg-eraser.png
Binary files differ
diff --git a/docs/en/rg-eventfilter.png b/docs/en/rg-eventfilter.png
new file mode 100644
index 0000000..d275a30
--- /dev/null
+++ b/docs/en/rg-eventfilter.png
Binary files differ
diff --git a/docs/en/rg-eventlisteditor.png b/docs/en/rg-eventlisteditor.png
new file mode 100644
index 0000000..a5e9e75
--- /dev/null
+++ b/docs/en/rg-eventlisteditor.png
Binary files differ
diff --git a/docs/en/rg-gridquantizer.png b/docs/en/rg-gridquantizer.png
new file mode 100644
index 0000000..65f2a11
--- /dev/null
+++ b/docs/en/rg-gridquantizer.png
Binary files differ
diff --git a/docs/en/rg-guitarchorddialog.png b/docs/en/rg-guitarchorddialog.png
new file mode 100644
index 0000000..48725d3
--- /dev/null
+++ b/docs/en/rg-guitarchorddialog.png
Binary files differ
diff --git a/docs/en/rg-guitarchordeditordialog.png b/docs/en/rg-guitarchordeditordialog.png
new file mode 100644
index 0000000..cda7ca6
--- /dev/null
+++ b/docs/en/rg-guitarchordeditordialog.png
Binary files differ
diff --git a/docs/en/rg-ipb-audio.png b/docs/en/rg-ipb-audio.png
new file mode 100644
index 0000000..82d4bbc
--- /dev/null
+++ b/docs/en/rg-ipb-audio.png
Binary files differ
diff --git a/docs/en/rg-ipb-midi.png b/docs/en/rg-ipb-midi.png
new file mode 100644
index 0000000..f99f9d5
--- /dev/null
+++ b/docs/en/rg-ipb-midi.png
Binary files differ
diff --git a/docs/en/rg-ipb-synth.png b/docs/en/rg-ipb-synth.png
new file mode 100644
index 0000000..2ca4d57
--- /dev/null
+++ b/docs/en/rg-ipb-synth.png
Binary files differ
diff --git a/docs/en/rg-keysigdialog.png b/docs/en/rg-keysigdialog.png
new file mode 100644
index 0000000..f2147d4
--- /dev/null
+++ b/docs/en/rg-keysigdialog.png
Binary files differ
diff --git a/docs/en/rg-loadpreset.png b/docs/en/rg-loadpreset.png
new file mode 100644
index 0000000..5d4b9fb
--- /dev/null
+++ b/docs/en/rg-loadpreset.png
Binary files differ
diff --git a/docs/en/rg-mainwindow.png b/docs/en/rg-mainwindow.png
new file mode 100644
index 0000000..21b3802
--- /dev/null
+++ b/docs/en/rg-mainwindow.png
Binary files differ
diff --git a/docs/en/rg-markerloop.png b/docs/en/rg-markerloop.png
new file mode 100644
index 0000000..27bec8c
--- /dev/null
+++ b/docs/en/rg-markerloop.png
Binary files differ
diff --git a/docs/en/rg-matrixview.png b/docs/en/rg-matrixview.png
new file mode 100644
index 0000000..ebf8035
--- /dev/null
+++ b/docs/en/rg-matrixview.png
Binary files differ
diff --git a/docs/en/rg-metronome.png b/docs/en/rg-metronome.png
new file mode 100644
index 0000000..487b12e
--- /dev/null
+++ b/docs/en/rg-metronome.png
Binary files differ
diff --git a/docs/en/rg-midifilter.png b/docs/en/rg-midifilter.png
new file mode 100644
index 0000000..3b7ae06
--- /dev/null
+++ b/docs/en/rg-midifilter.png
Binary files differ
diff --git a/docs/en/rg-midimixer.png b/docs/en/rg-midimixer.png
new file mode 100644
index 0000000..f90a14e
--- /dev/null
+++ b/docs/en/rg-midimixer.png
Binary files differ
diff --git a/docs/en/rg-move.png b/docs/en/rg-move.png
new file mode 100644
index 0000000..703dd40
--- /dev/null
+++ b/docs/en/rg-move.png
Binary files differ
diff --git a/docs/en/rg-notation-toolbars.png b/docs/en/rg-notation-toolbars.png
new file mode 100644
index 0000000..2c55841
--- /dev/null
+++ b/docs/en/rg-notation-toolbars.png
Binary files differ
diff --git a/docs/en/rg-notationquantizer.png b/docs/en/rg-notationquantizer.png
new file mode 100644
index 0000000..21d470d
--- /dev/null
+++ b/docs/en/rg-notationquantizer.png
Binary files differ
diff --git a/docs/en/rg-notationtools.png b/docs/en/rg-notationtools.png
new file mode 100644
index 0000000..f3c6e6d
--- /dev/null
+++ b/docs/en/rg-notationtools.png
Binary files differ
diff --git a/docs/en/rg-notationview-multipage.png b/docs/en/rg-notationview-multipage.png
new file mode 100644
index 0000000..7b4e3ec
--- /dev/null
+++ b/docs/en/rg-notationview-multipage.png
Binary files differ
diff --git a/docs/en/rg-notationview.png b/docs/en/rg-notationview.png
new file mode 100644
index 0000000..df5eb52
--- /dev/null
+++ b/docs/en/rg-notationview.png
Binary files differ
diff --git a/docs/en/rg-pastedialog.png b/docs/en/rg-pastedialog.png
new file mode 100644
index 0000000..c7421d8
--- /dev/null
+++ b/docs/en/rg-pastedialog.png
Binary files differ
diff --git a/docs/en/rg-pencil.png b/docs/en/rg-pencil.png
new file mode 100644
index 0000000..f2eaf5d
--- /dev/null
+++ b/docs/en/rg-pencil.png
Binary files differ
diff --git a/docs/en/rg-percussionmatrix.png b/docs/en/rg-percussionmatrix.png
new file mode 100644
index 0000000..339dc66
--- /dev/null
+++ b/docs/en/rg-percussionmatrix.png
Binary files differ
diff --git a/docs/en/rg-plugin-dialog.png b/docs/en/rg-plugin-dialog.png
new file mode 100644
index 0000000..e74adb5
--- /dev/null
+++ b/docs/en/rg-plugin-dialog.png
Binary files differ
diff --git a/docs/en/rg-pluginbuttons.png b/docs/en/rg-pluginbuttons.png
new file mode 100644
index 0000000..cf06768
--- /dev/null
+++ b/docs/en/rg-pluginbuttons.png
Binary files differ
diff --git a/docs/en/rg-plugineditorbutton.png b/docs/en/rg-plugineditorbutton.png
new file mode 100644
index 0000000..6c209cb
--- /dev/null
+++ b/docs/en/rg-plugineditorbutton.png
Binary files differ
diff --git a/docs/en/rg-quickmarker.png b/docs/en/rg-quickmarker.png
new file mode 100755
index 0000000..e2153d2
--- /dev/null
+++ b/docs/en/rg-quickmarker.png
Binary files differ
diff --git a/docs/en/rg-rawnoteruler.png b/docs/en/rg-rawnoteruler.png
new file mode 100644
index 0000000..1430bec
--- /dev/null
+++ b/docs/en/rg-rawnoteruler.png
Binary files differ
diff --git a/docs/en/rg-resize.png b/docs/en/rg-resize.png
new file mode 100644
index 0000000..4dcd991
--- /dev/null
+++ b/docs/en/rg-resize.png
Binary files differ
diff --git a/docs/en/rg-segmentparameterbox.png b/docs/en/rg-segmentparameterbox.png
new file mode 100644
index 0000000..68eac36
--- /dev/null
+++ b/docs/en/rg-segmentparameterbox.png
Binary files differ
diff --git a/docs/en/rg-segno.png b/docs/en/rg-segno.png
new file mode 100644
index 0000000..5c9bdbc
--- /dev/null
+++ b/docs/en/rg-segno.png
Binary files differ
diff --git a/docs/en/rg-select.png b/docs/en/rg-select.png
new file mode 100644
index 0000000..4a81612
--- /dev/null
+++ b/docs/en/rg-select.png
Binary files differ
diff --git a/docs/en/rg-split.png b/docs/en/rg-split.png
new file mode 100644
index 0000000..86f8034
--- /dev/null
+++ b/docs/en/rg-split.png
Binary files differ
diff --git a/docs/en/rg-synthpluginbuttons.png b/docs/en/rg-synthpluginbuttons.png
new file mode 100644
index 0000000..ac791fe
--- /dev/null
+++ b/docs/en/rg-synthpluginbuttons.png
Binary files differ
diff --git a/docs/en/rg-tempodialog.png b/docs/en/rg-tempodialog.png
new file mode 100644
index 0000000..65924c4
--- /dev/null
+++ b/docs/en/rg-tempodialog.png
Binary files differ
diff --git a/docs/en/rg-temporuler.png b/docs/en/rg-temporuler.png
new file mode 100644
index 0000000..572736b
--- /dev/null
+++ b/docs/en/rg-temporuler.png
Binary files differ
diff --git a/docs/en/rg-text-cursor.png b/docs/en/rg-text-cursor.png
new file mode 100644
index 0000000..5fc332a
--- /dev/null
+++ b/docs/en/rg-text-cursor.png
Binary files differ
diff --git a/docs/en/rg-textdialog.png b/docs/en/rg-textdialog.png
new file mode 100644
index 0000000..51e3bf5
--- /dev/null
+++ b/docs/en/rg-textdialog.png
Binary files differ
diff --git a/docs/en/rg-timesigdialog.png b/docs/en/rg-timesigdialog.png
new file mode 100644
index 0000000..a06c805
--- /dev/null
+++ b/docs/en/rg-timesigdialog.png
Binary files differ
diff --git a/docs/en/rg-trackbutton-instrumentmenu.png b/docs/en/rg-trackbutton-instrumentmenu.png
new file mode 100644
index 0000000..5fcb077
--- /dev/null
+++ b/docs/en/rg-trackbutton-instrumentmenu.png
Binary files differ
diff --git a/docs/en/rg-trackbutton-instruments.png b/docs/en/rg-trackbutton-instruments.png
new file mode 100644
index 0000000..024f067
--- /dev/null
+++ b/docs/en/rg-trackbutton-instruments.png
Binary files differ
diff --git a/docs/en/rg-trackbutton-labels.png b/docs/en/rg-trackbutton-labels.png
new file mode 100644
index 0000000..019eadd
--- /dev/null
+++ b/docs/en/rg-trackbutton-labels.png
Binary files differ
diff --git a/docs/en/rg-trackbuttons.png b/docs/en/rg-trackbuttons.png
new file mode 100644
index 0000000..86f4bb3
--- /dev/null
+++ b/docs/en/rg-trackbuttons.png
Binary files differ
diff --git a/docs/en/rg-trackeditor.png b/docs/en/rg-trackeditor.png
new file mode 100644
index 0000000..b690316
--- /dev/null
+++ b/docs/en/rg-trackeditor.png
Binary files differ
diff --git a/docs/en/rg-trackparameterbox.png b/docs/en/rg-trackparameterbox.png
new file mode 100644
index 0000000..293b903
--- /dev/null
+++ b/docs/en/rg-trackparameterbox.png
Binary files differ
diff --git a/docs/en/rg-transport.png b/docs/en/rg-transport.png
new file mode 100644
index 0000000..44faa64
--- /dev/null
+++ b/docs/en/rg-transport.png
Binary files differ
diff --git a/docs/en/rg-triggersegment.png b/docs/en/rg-triggersegment.png
new file mode 100644
index 0000000..ba5137a
--- /dev/null
+++ b/docs/en/rg-triggersegment.png
Binary files differ
diff --git a/docs/en/rg-tupletdialog.png b/docs/en/rg-tupletdialog.png
new file mode 100644
index 0000000..9872d86
--- /dev/null
+++ b/docs/en/rg-tupletdialog.png
Binary files differ
diff --git a/docs/en/rg-useornament.png b/docs/en/rg-useornament.png
new file mode 100644
index 0000000..58d4001
--- /dev/null
+++ b/docs/en/rg-useornament.png
Binary files differ
diff --git a/docs/en/tips b/docs/en/tips
new file mode 100644
index 0000000..99074a8
--- /dev/null
+++ b/docs/en/tips
@@ -0,0 +1,316 @@
+<tip category="Rosegarden|General">
+<html>
+<p>To configure a track to play using a particular instrument:</p>
+&nbsp;&nbsp;* click on the track label and hold a moment<br>
+&nbsp;&nbsp;* select an output device<br>
+&nbsp;&nbsp;* select one of that device's available instruments (#1 - #16)<br>
+&nbsp;&nbsp;* adjust that instrument's output channel, program, bank, and
+controllers via the instrument parameters box
+</html>
+</tip>
+<tip category="Rosegarden|General">
+<html>
+<p>...that Rosegarden has an autosave feature?<br><br>
+You can select your autosave interval from <b>Settings->Configure
+Rosegarden</b>.<br><br>
+When something goes awry, such as a power outage or a Rosegarden crash
+(unfortunately, it happens...) simply load the file you were working on, and you'll be given the
+option to load the autosaved version, or the unmodified original.</p>
+</html>
+</tip>
+<tip category="Rosegarden|General">
+<html>
+<p>
+...that you can save the current document as your default studio by using
+<b>Composition -> Studio -> Save Current Document as Default Studio</b>?</p>
+</html>
+</tip>
+<tip category="Rosegarden|General">
+<html>
+<p>...that your default studio is a complete Rosegarden composition that gets
+loaded every time you create a new document or import a MIDI file?</p>
+</html>
+</tip>
+<tip category="Rosegarden|General">
+<html>
+<p>...that your default studio can contain instrument assignments, document properties, LilyPond headers,
+and many other things?<br><br>The default studio is a complete Rosegarden composition, so it can contain anything that you may wish to have available in each
+new document you create.</p>
+</html>
+</tip>
+<tip category="Rosegarden|General">
+<html>
+<p>...that Rosegarden will detect and create a default connection for ALSA soft
+synth applications that are started after Rosegarden is already running?</p>
+</html>
+</tip>
+<tip category="Rosegarden|General">
+<html>
+<p>...that you can make your default studio override that in every Rosegarden composition you load?<br><br>If your studio setup does not change very often, and you would prefer for
+the settings in your default studio to take precedence over whatever
+studio is saved with any files you happen to load, you can make your studio the default for everything using <b>Settings -> Configure Rosegarden ->
+MIDI -> Always use default studio when loading files</b>.</p>
+</html>
+</tip>
+<tip category="Rosegarden|General">
+<html>
+<p>If you have accidentally recorded a segment so short that it does not
+appear on the canvas, which you can only hear during subsequent recording
+sessions, you can gain access to it by using <b>Composition -> Change
+Composition Start and End</b> and then setting the composition to start at a negative number.</p>
+</html>
+</tip>
+<tip category="Rosegarden|General">
+<html>
+<p>...that if you place a note at the wrong pitch using the notation or matrix editor, you can move it one semitone at a time with the up and down arrow keys on your keyboard?</p>
+</html>
+</tip>
+<tip category="Rosegarden|General">
+<html>
+<p>...that you can toggle stem directions in the notation editor by selecting
+one or more notes and using Ctrl-PageUp and Ctrl-PageDown?</p>
+</html>
+</tip>
+<tip category="Rosegarden|General">
+<html>
+<p>...that you can change the accidental used for a note in the notation editor (without changing the pitch of the note) by selecting
+it and using the up and down arrow keys with both Ctrl and Shift pressed?</p>
+</html>
+</tip>
+<tip category="Rosegarden|General">
+<html>
+<p>...that you can hold down the Shift key while repositioning segments on the
+segment canvas in order to avoid the "snap-to" effect and exert finer control?</p>
+</html>
+</tip>
+<tip category="Rosegarden|General">
+<html>
+<p>...that you can use the arrow tool to draw, move, and resize segments and events as well as to select them?<br><br>Drag a segment or event block to move it, drag the right edge of a block to resize it, and drag with the middle mouse button pressed to draw a new segment or event.<br><br>(Of course, the dedicated draw, move and resize tools are still quicker for repeated operations.)</p>
+</html>
+</tip>
+<tip category="Rosegarden|General">
+<html>
+<p>...that you can hold down the Shift key while repositioning segments on the
+segment canvas in order to avoid the "snap-to" effect and exert finer control?</p>
+</html>
+</tip>
+<tip category="Rosegarden|General">
+<html>
+<p>...that you can hold down the Shift key while repositioning or resizing events in the
+matrix view in order to avoid the "snap-to" effect and exert finer control?</p>
+</html>
+</tip>
+<tip category="Rosegarden|General">
+<html>
+<p>...that you can edit multiple segments on multiple tracks simultaneously in
+the notation editor? Simply select the segments, then use <b>Edit -> Open in Notation Editor</b>.</p>
+</html>
+</tip>
+<tip category="Rosegarden|General">
+<html>
+<p>...that Rosegarden can export files for use by LilyPond, the high-quality score typesetting system?<br><br>
+From the <b>File</b> menu, navigate to <b>Export -> Export LilyPond File</b></p>
+</html>
+</tip>
+<tip category="Rosegarden|General">
+<html>
+<p>...that Rosegarden can print via LilyPond, the high-quality score typesetting system?<br><br>
+From the <b>File</b> menu, navigate to <b>Preview with LilyPond</b>. The file
+will be exported, rendered, and a preview will appear in KPDF, or one of
+several other PDF viewers, where it can then be printed as well.</p>
+</html>
+</tip>
+<tip category="Rosegarden|General">
+<html>
+<p>...that if you use the quantizer from within the notation view, you can tell it to quantize only the timing used for notation -- making it possible to have good looking notation <b>and</b> a human MIDI performance?</p>
+</html>
+</tip>
+<tip category="Rosegarden|General">
+<html>
+<p>...that you can change segment labels using the controls on the Segment Parameters box
+in the main window?</p>
+</html>
+</tip>
+<tip category="Rosegarden|General">
+<html>
+<p>...that the number of tracks in new documents is based on the contents of
+your autoload.rg file?
+<br><br>
+Whether you prefer to start with three tracks or 43, create a document that
+contains the desired number of tracks, plus any other studio or document properties settings
+you wish to configure, and use <b>Composition -> Studio -> Save Current Document as Default
+Studio</b> to make this your new default.</p>
+</html>
+</tip>
+<tip category="Rosegarden|General">
+<html>
+<p>...that you can change the name of a track by double clicking on the label? (The
+label must be visible for this to work.)</p>
+</html>
+</tip>
+<tip category="Rosegarden|General">
+<html>
+<p>...that you can configure what happens when you double-click on a segment?<br><br>Go to <b>Settings -> Configure Rosegarden</b> and choose your preferred editing window under the <b>Behaviour</b> tab.</p>
+</html>
+</tip>
+<tip category="Rosegarden|General">
+<html>
+<p>...that Rosegarden is being developed as a community effort with
+contributions from around the world?<br><br>
+The four most active developers live in London (England), Cannes, Barcelona,
+and... Christiansburg? (Christiansburg is a town of about 50,000 in
+southwestern Virginia, USA.)<br><br>
+We have had contributors from elsewhere in the US, UK, Spain, Mexico, Argentina, Germany,
+Sweden, Russia, Japan, Finland, and Italy, just to name a few...</p>
+</html>
+</tip>
+<tip category="Rosegarden|General">
+<html>
+<p>...that Rosegarden is available in Spanish, French, German, Russian, Welsh, Swedish, Italian and Estonian
+translations? (Just to name a few.)<br><br>
+If you're interested in translating Rosegarden to another language, drop us a
+line at <b>[email protected]</b>.</p>
+</html>
+</tip>
+<tip category="Rosegarden|General">
+<html>
+<p>...that you can change the total number of bars in the composition via
+<b>Composition -> Change Composition Start and End</b>?</p>
+</html>
+</tip>
+<tip category="Rosegarden|General">
+<html>
+<p>...that you can see the difference between performance and display duration
+of duration-quantized notes in the notation editor?<br><br>
+Use <b>Settings -> Show Raw Note Ruler</b> to turn on this handy
+feature.<br><br>
+<i>Note that this feature does not work in page layout view.</i></p>
+</html>
+</tip>
+<tip category="Rosegarden|General">
+<html>
+<p>...that you can add tempo and time-signature changes by double-clicking on the values displayed in the transport window or tempo rulers?</p>
+</html>
+</tip>
+<tip category="Rosegarden|General">
+<html>
+<p>...that the transport window can display musical time, sample frame count, and a visual metronome as well as real time?<br><br>Just click on the small button at the extreme top left of the window.</p>
+</html>
+</tip>
+<tip category="Rosegarden|General">
+<html>
+<p>...that you can select all notes of a particular pitch in the matrix view, by shift-clicking on that pitch on the piano keyboard at the left?<br><br>If you shift-click-drag, you can select whole ranges too.</p>
+</html>
+</tip>
+<tip category="Rosegarden|General">
+<html>
+<p>...that you can set a loop in the main window by clicking-and-dragging on the time ruler with Shift pressed?<br><br>(If the ruler isn't visible, use <b>Settings -> Show Rulers</b>.)</p>
+</html>
+</tip>
+<tip category="Rosegarden|General">
+<html>
+<p>...that if you're editing a section in the matrix or notation view, you can
+set that section to loop while you edit it?<br><br>Select it and use <b>Tools ->
+Local Cursor -> Set Loop to Selection</b>, then hit Play.</p><br><br>
+<i>This feature does not work quite as well for compositions that include sampled
+audio.</i>
+</html>
+</tip>
+<tip category="Rosegarden|General">
+<html>
+<p>...if you have more than one note or controller event at the same time, you
+can use the [ and ] keys to flip the stack of events around on the controller
+and velocity rulers in order to bring the item you wish to adjust into
+focus.</p>
+</html>
+</tip>
+<tip category="Rosegarden|General">
+<html>
+<p>...that the notation view shows you notes using their display duration, while the
+matrix allows you to edit their performance duration?<br><br>
+<i>Be careful with tied notes in the matrix. It is not apparent that they are
+tied, and if you split up a pair of tied notes, subsequent notation views will
+be confused and unhappy. This is an old bug that has been on our TODO list
+for years. Sorry about that, folks. Patches welcome.</i>
+</p>
+</html>
+</tip>
+<tip category="Rosegarden|General">
+<html>
+<p>If you're working with a human performance and you need to insert some new
+notes, these new notes will sound for their entire written duration. To blend
+these new notes into a human performance, select them, then use <b>Adjust -> Interpret...</b>
+from the notation view to interpret any marks and massage their performance
+durations to something less mechanical.</p>
+</html>
+</tip>
+<tip category="Rosegarden|General">
+<html>
+<p>...that Rosegarden can export certain things to LilyPond that it cannot yet
+display within its own native interface?<br><br>These new directives can be inserted
+via the <b>T</b> text insert tool in the notation view.<br><br>
+Load the example files
+<b>lilypond-alternative-endings.rg</b> and <b>lilypond-directives.rg</b> for a
+demonstration of how to use the new exportable directives.<br><br>
+Use <b>File -> Preview with
+LilyPond</b> to see what they look like on the exported page.<br><br>
+<i>Be sure to turn on
+<b>Settings -> Show LilyPond Directives</b> and <b>Show Annotations</b> within
+the notation view.</i></p>
+</html>
+</tip>
+<tip category="Rosegarden|General">
+<html>
+<p>...that Rosegarden has track parameters allowing you to <b>Create segments with:</b> certain
+properties by default?<br><br>You can pre-select the clef, transposition, colour, and specify
+the highest and lowest playable notes (notes outside this range display in
+red by default). Then draw a segment with the pencil, or record one, and any
+new segments created on this track will take these properties as segment
+parameters.<br><br>
+<i>These parameters do not apply to audio tracks.</i></p>
+</html>
+</tip>
+<tip category="Rosegarden|General">
+<html>
+<p>...that Rosegarden has a database of preset parameters describing more than 300
+musical instruments from the real world, grouped into several convenient
+categories?<br><br>Each preset contains a clef, transposition, and playable range
+suggestions for both amateur and professional players.<br><br>Click the
+<b>Load</b> button in the new track parameters box to get started! <i>(If you
+do not see a <b>Load</b> button, be sure your parameter panel is set for
+tabbed mode, rather than stacked mode.)</i> <br><br> <i>(Special thanks to Magnus
+Johansson for assembling this extraordinary database.)</i></p>
+</html>
+</tip>
+<tip category="Rosegarden|General">
+<html>
+<p>...that when exporting to Lilypond, you can merge tracks that have the same name onto a single staff?<br><br>For example, if there are three voices in a single part, write each
+voice as an independent segment/staff, each on a separate track. Give all
+three tracks the same name, and select <b>[x] Merge tracks that have the same
+name</b> from the options dialog that appears when you export to, or preview
+with LilyPond.<br><br>
+<i>The tracks must have a non-default name for this to work.</i></p>
+</html>
+</tip>
+<tip category="Rosegarden|General">
+<html>
+<p>...that you can use the mouse wheel to scroll up and down, scroll left and right, and zoom in and out?<br><br>Just roll the wheel to scroll up or down. Hold Alt as well to scroll left or right, or hold Ctrl to zoom in and out.</p>
+</html>
+</tip>
+<tip category="Rosegarden|General">
+<html>
+<p>...that you can time-stretch an audio segment -- stretching or squashing a
+sample to a different duration without changing its pitch -- just by
+dragging its right edge with the Ctrl key pressed?</p>
+</html>
+</tip>
+<tip category="Rosegarden|General">
+<html>
+<p>...that you can add audio to your Rosegarden composition just by dragging an audio file from your file manager and dropping it on the Rosegarden segment canvas? (Make sure you drop it on an audio track!)<br><br>You can also drop audio files from Rosegarden's audio file manager window onto the segment canvas, and from other programs onto the audio file manager.</p>
+</html>
+</tip>
+<tip category="Rosegarden|General">
+<html>
+<p>...that you can set the tempo to match the duration of an audio segment if you know it's an exact number of bars or beats long?<br><br>Just select the audio segment and use <b>Composition -> Tempo and Time Signature -> Set Tempo to Audio Segment Duration</b>.</p>
+</html>
+</tip>
diff --git a/docs/en/transpose-by-interval.png b/docs/en/transpose-by-interval.png
new file mode 100644
index 0000000..1eb5c5d
--- /dev/null
+++ b/docs/en/transpose-by-interval.png
Binary files differ
diff --git a/docs/es/index.docbook b/docs/es/index.docbook
new file mode 100644
index 0000000..3b15e0d
--- /dev/null
+++ b/docs/es/index.docbook
@@ -0,0 +1,6416 @@
+<?xml version="1.0" ?>
+<!DOCTYPE book PUBLIC "-//KDE//DTD DocBook XML V4.1.2-Based Variant V1.0//EN" "dtd/kdex.dtd" [
+ <!ENTITY rosegarden "<application
+>Rosegarden</application
+>">
+ <!ENTITY MIDI "<acronym
+>MIDI</acronym
+>">
+ <!ENTITY % Spanish "INCLUDE"
+> <!-- change language only here -->
+ <!ENTITY % addindex "IGNORE">
+]>
+
+<!-- The language must be changed in the <book
+> tag for translations. -->
+
+
+<!--
+
+ Notes on style and terminology for Rosegarden handbook
+ ======================================================
+
+ * Aim to be clear, brief and direct, but be informal.
+
+ * Write instructions in the second person.
+
+ Good: "You can select segments by clicking on
+ them with the arrow tool."
+
+ Bad: "Segments can be selected by clicking on
+ them with the arrow tool."
+
+ Very bad: "The arrow tool allows the user to select
+ segments by clicking on them."
+
+ If you dislike the first of these because you want to
+ make the phrase "the arrow tool" more obvious by placing
+ it at the start of the sentence, then perhaps you
+ should be using a variablelist instead and making
+ "the arrow tool" a list item.
+
+ * It's perfectly permissible to detour to explain why
+ something is the way it is, particularly if it might
+ not be obvious.
+
+ * It's also entirely permissible to omit advanced stuff
+ from the "Using Rosegarden" section and document it
+ only in the reference section. "Using Rosegarden"
+ should be about understanding how and why, not about
+ knowing every last clever detail.
+
+ * Bear in mind we can link extensively from any part of
+ the handbook to any other. Unfortunately DocBook won't
+ allow you to write a link to a target that doesn't
+ exist yet, so if you want to link to something that's
+ not yet been written, either make a note of the planned
+ link in an XML comment, or go and create a stub for the
+ bit that hasn't been written yet, or else just write in
+ a way that allows for a link to be easily added later
+ (we could do an editing phase specially for links).
+
+ * Be strict about using the correct terminology for
+ Rosegarden data structures (segment, event, track,
+ instrument, composition), but don't capitalise the
+ words. Capitalisation is useful in technical documents
+ to make it clear that you're referring to a precise
+ concept, but you shouldn't have to do it to make your
+ meaning clear in user documentation. If something
+ seems ambiguous without, try rewording it instead.
+
+
+ About Screenshots
+ =================
+
+ Screenshots used with this documentation should use the
+ following style, colour and font settings:
+
+ * KDE Style: "Light Style, 3rd Revision"
+
+ * Colour scheme: "Blue Slate", with high-contrast
+ setting and with the standard widget background set
+ to white. (I have this saved as a new scheme.)
+
+ * Fonts: Verdana 11px for general use and menus; Verdana
+ 11px bold for window titles; antialiasing on, but
+ sub-pixel antialiasing off. (For pictures of the
+ segment and instrument parameter boxes I usually turn
+ the size up to 13px, which perhaps says something about
+ our use of font size in these boxes.)
+
+ * Window Decorations: "Quartz"
+
+ None of these would be my first choice for nice-looking
+ screenshots now, but we're not here to sell Rosegarden in this
+ document, we're here to provide clear and consistent help text.
+ So the priority is to make new screenshots look like the existing
+ ones, not to make them look fancy. Also, I think there is an
+ advantage to having screenshots in a help document look a bit
+ distinct from the user's own window decorations surrounding the
+ help text.
+
+ Screenshots of the whole program or of whole matrix or
+ notation windows may be taken using different themes if
+ desired, but screenshots of individual dialogs or window
+ components must use the above scheme.
+
+-->
+
+<!--
+ Notes on Usability Defects
+ ==========================
+
+ This comment is a place to note anything I find difficult to
+ document, or anything where the functions for two necessarily
+ linked concepts are not actually linked in the GUI (etc).
+
+ * The audio file directory (in document properties) can't be
+ inspected or changed from the audio file manager. This is
+ arguably linked to a need for a project directory. There
+ are various other usability problems with the audio file
+ manager as well, e.g. there's no way to tell it to pull all
+ imported audio files into a single audio directory.
+
+ * Track buttons showing sometimes-instrument, sometimes-label.
+
+ * Can't usefully double-click / right-click on most rulers.
+ This would be useful for a slower but clearer way to set
+ loops; adding and editing markers; etc. Setting loops is
+ particularly opaque especially in notation and matrix views.
+
+ * Hideous inconsistency (documented in an RFE already) between
+ having to use RG for MIDI routing and being unable to use RG
+ for audio routing.
+
+ * Uh, Pedro implemented this multiport recording but we can't
+ actually split the results can we?
+
+ Troubleshooting
+ ===============
+
+ Shall we have a troubleshooting section?
+
+ * I'm not seeing any MIDI outputs
+ * I'm not hearing any sound from my MIDI outputs
+ * I'm not seeing any audio outputs
+ * I'm not hearing any sound from my audio outputs
+ * I don't see any synth plugins
+
+-->
+
+<!--
+ Still to do
+ ===========
+
+ * Control rulers
+
+ * Controller editing
+
+ * Event list
+
+ * Event editor dialogs
+
+ * Tempo / timesig editor
+
+ * Triggered segments
+
+ * Split by Pitch
+
+ * Document properties
+
+ * Add images for the tools (move, split &c) when describing them
+
+ * Add images for transport buttons in transport section
+
+ * Update notation menu references
+
+ * Add new notation stuff
+
+ * Config dialog
+
+ * Make sure the guimenuitem etc tags are being used for all menu refs
+
+ * Give keyboard shortcuts for menu functions?
+
+ * Go through again changing Rosegarden -> &rosegarden; and double-hyphen ->
+ &ndash; or &mdash; and review any uses of "the ... function" to see
+ if these words are redundant
+
+ * Troubleshooter
+
+ * Check !!! items
+
+ * Fill gaps in revision history
+
+ * Consistent capitalisation: Instrument Parameter Box or instrument
+ parameter box? Audio Mixer or audio mixer? Device or device?
+
+ * Finally, review the structure again and adjust the <chapter
+>/<sect*>
+ for balance
+
+-->
+
+
+<book id="rosegarden" lang="&language;">
+
+ <!-- This header contains all of the meta-information for the document such
+ as Authors, publish date, the abstract, and Keywords -->
+
+ <bookinfo>
+ <title
+>El Manual de Rosegarden</title>
+ <authorgroup>
+ <author
+><firstname
+>Chris</firstname
+> <surname
+>Cannam</surname
+> </author>
+ <author
+><firstname
+>Richard</firstname
+> <surname
+>Bown</surname
+> </author>
+ <author
+><firstname
+>Guillaume</firstname
+> <surname
+>Laurent</surname
+> </author>
+ <othercredit role="translator"
+><firstname
+>Marcos</firstname
+> <surname
+>Guglielmetti</surname
+> <affiliation
+><address
+> <email
+ </address
+></affiliation>
+ <contrib
+>traducci n</contrib
+> <!-- ??? not sure what this tag is actually for -->
+ </othercredit>
+ </authorgroup>
+
+ <copyright>
+ <year
+>2002-2004</year>
+ <holder
+>Chris Cannam, Richard Bown, Guillaume Laurent</holder>
+ </copyright>
+
+ <date
+>2004-08-04</date>
+ <releaseinfo
+>0.9.9</releaseinfo>
+
+ <abstract>
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-mainwindow.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase
+>&rosegarden;</phrase>
+ </textobject>
+ </mediaobject>
+</screenshot
+> Rosegarden es un secuenciador de audio y &MIDI; y un editor de notación musical. Este manual describe como usarlo. </para>
+ </abstract>
+
+ <keywordset>
+ <keyword
+>Rosegarden</keyword>
+ <keyword
+>secuenciador</keyword>
+ <keyword
+>MIDI</keyword>
+ <keyword
+>audio</keyword>
+ <keyword
+>música</keyword>
+ <keyword
+>notación</keyword>
+ <keyword
+>partitura</keyword>
+ <keyword
+>KDE</keyword>
+ </keywordset>
+
+ </bookinfo>
+
+ <!-- The contents of the documentation begins here. Label each
+ chapter so with the id attribute. This is necessary for two reasons:
+ it allows you to easily reference the chapter from other chapters of
+ your document, and if there is no ID, the name of the generated HTML
+ files will vary from time to time making it hard to manage for
+ maintainers and for the CVS system. Any chapter labelled (OPTIONAL)
+ may be left out at the author's discretion. Other chapters should
+ not be left out in order to maintain a consistent documentation
+ style across all KDE apps. -->
+
+ <chapter id="introduction">
+ <title
+>introducción</title>
+
+ <sect1>
+ <title
+>Sobre Rosegarden</title>
+ <para
+><application
+>Rosegarden</application
+>es un secuenciador de audio y &MIDI; y un editor de notación musical. Rosegarden le permite grabar, armar y componer música en la forma tradicional de partituras o como datos &MIDI;, o archivos de audio tanto importados como grabados de un micrófono, guitarra o cualquier fuente de audio que usted desee. Puede usar Rosegarden para escribir, editar y organizar música para crear una composición, a la cual puede sintetizarla, agregarle efectos, y mezclar para quemar un CD o distribuir en la web. Rosegarden también provee soporte para edición de notación profesional para impresiones de alta calidad. </para>
+
+ <para
+><application
+>Rosegarden</application
+>está diseñado para parecer y actuar de manera similar para usuarios experimentados que llegan a Linux de otras plataformas, siendo generalmente accesible y amistoso para nuevos usuarios de software para música. </para>
+
+ <sect2 id="intro-handbook">
+ <title
+>Sobre este Manual</title>
+ <para
+>Este manual resume la capacidades de &rosegarden; y provee una referencia para alguno de los conceptos involucrados. Está diseñado para tener sentido tanto leyéndolo en orden o siendo usado como referencia de los conceptos y funciones disponibles en Rosegarden. Si quiere leer un tutorial también, <ulink url="http://www.rosegardenmusic.com/resources/tutorial/using_en.shtml"
+>you puede encontrar uno aquí</ulink
+>.</para>
+
+ <para
+>Si llegara a existir algo que no entienda o requiera de ayuda, por favor visite <ulink url="http://www.rosegardenmusic.com/support/"
+>el website de Rosegarden</ulink
+> para la lista de Preguntas Frecuentes (FAQ) e instrucciones sobre la lista de correo. </para>
+ </sect2>
+
+ <sect2 id="intro-menufunctions">
+ <title
+>Sobre los Menúes y Atajos</title
+> <para
+>Este manual usualmente se refiere a las funciones que puede usar en Rosegarden describiendo donde se encuentran en los menúes. Por ejemplo, la función para agregar una pista nueva al editor principal de pistas es <menuchoice
+> <guimenu lang="en"
+>Tracks</guimenu
+> <guimenuitem
+>Add Track</guimenuitem
+> </menuchoice
+>.</para>
+
+ <para
+>En muchos casos, ésta no es la única forma forma de llegar a una función particular. Ebn el caso en particular, ésta misma función se encuentra disponible a través del atajo de teclado Ctrl+T, y también aparece como un ícono en una de las barras de herramientas de la ventana princiapl. Tanto el atajo de teclado como el ícono pueden ser fácilmente aprendidos, puesto que son mostrados en el menú de Rosegarden junto con el nombre de la función. Debe tener presente que , por motivos de referencia en ésta documentación, aunque siempre damos la localización dentro del menú de forma completa, no es necesariamente la mejor o mas usual forma para usar una función, por lo que debe prestar atención a los atajos de teclados e íconos de las barras de herramientas. </para>
+ </sect2>
+
+ <sect2 id="intro-optional">
+ <title
+>Características especiales</title
+> <para
+>Éste manual asume que su instalación de Rosegarden soporta todas las características de las que es capaz. Algunas de ellas, incluyendo ciertas muy importantes, son actualmente opcionales al momento de realizar la instalación de Rosegarden, dependiendo en qué otras librerías y códigos de soporte se encuentran disponibles. Por ejemplo, el subsistema completo de audio es compilado sólo si las librerías de JACK se encuentran disponibles; plugins de soporte para sintetizadores dependen de un número de otros módulos; etc.</para
+> <para
+>Éstas dependencias están documentadas en el README de Rosegarden y en la documentacíon de configuración. Si encuentra que éste manual se refiere a características no visibles en la versión de Rosegarden que está utilizando, consulte la documentación de configuración o a su distribuidor. </para>
+ </sect2>
+ </sect1>
+ </chapter>
+
+
+<!--
+ **********************************
+
+ PART I:
+ Discussion and tutorial material
+
+ **********************************
+ -->
+
+
+ <chapter id="file-operations">
+ <title
+>Archivos y Documentos de Rosegarden</title>
+ <para
+>&rosegarden; guarda cada configuración en su propio documento, usando su propio formato interno. Cuando guarda un documento, el mismo es guardado en el disco como un archivo con la extensión .rg . &rosegarden; también puede manejar otros formatos estándar. </para>
+
+ <sect1 id="file-creating">
+ <title
+>Nuevas composiciones</title>
+ <para
+>&rosegarden; inicia con un documento nuevo, conteniendo una composición "vacía" lista para empezar a ser editada. Para colocar algo en su composición, es posible tanto grabar algo o crear algunos segmentos en blanco de música (referidos como "segmentos") que puede llenar usando varias de las facilidades de edición. </para>
+ <para
+>Mire <link linkend="recording"
+>Grabación</link
+> para obtener detalles de cómo grabar música, y mire la sección <link linkend="segment-view"
+>Editor de Pistas</link
+> para una descripción de como crear, editar y manejar segmentos de música. </para>
+ </sect1>
+
+ <sect1 id="file-midi">
+ <title
+>Usando archivos MIDI</title>
+ <para
+>Para importar y exportar archivos MIDI, utilice el menú <menuchoice
+> <guimenu lang="es"
+>Archivo</guimenu
+> <guimenuitem
+>Importar</guimenuitem
+> <guimenuitem
+>Importar archivo MIDI</guimenuitem
+> </menuchoice
+> y <menuchoice
+> <guimenu lang="es"
+>Archivo</guimenu
+> <guimenuitem
+>Exportar</guimenuitem
+> <guimenuitem
+>Exportar archivo MIDI</guimenuitem
+> </menuchoice
+>. </para>
+ <para
+>Aunque &rosegarden; puede cargar y guardar archivos en formatos como el MIDI, no guarda datos MIDI internamente. Generalmente debería preferir guardar los archivos en el formato propio de &rosegarden;, ya que &rosegarden; guarda un montón mas de información que sería perdida si se exportara a MIDI. </para>
+ <para
+>Cuando un archivo MIDI es cargado, &rosegarden; particiona la música en una pista por pista MIDI o canal en el archivo, <link linkend="studio-midi-import"
+>setea los mapeos de instrumentos apropiados</link
+>, e <link linkend="nv-quantization"
+>inetnta calcular notación plausible</link
+> para los datos MIDI de performance. </para>
+ </sect1>
+
+ <sect1 id="file-merge">
+ <title
+>Mezclando archivos</title
+> <para
+>De la misma manera en que es posible cargar o importar archivos, también es posible mezclarlos en el documento actual, agregando los segmentos del archivo a los que se se encuentran ya ahí. </para>
+
+ <para
+>Para mezclar un archivo, utilice la opción del submenú <menuchoice
+> <guimenu lang="es"
+>Archivo</guimenu
+> <guimenuitem
+>Merge</guimenuitem
+> </menuchoice
+> en vez de usar la opción Abrir o Importar. </para>
+ </sect1>
+
+ <sect1 id="file-printing">
+ <title
+>Imprimiendo</title>
+ <para
+>Es posible imprimir una composición en el formato de partitura, usando la función <menuchoice
+> <guimenu lang="es"
+>Archivo</guimenu
+> <guimenuitem
+>Imprimir</guimenuitem
+> </menuchoice
+>. </para>
+
+ <para
+>Producir una partitura de los datos de la performance es una tarea difícil. Es recomendable usar el <link linkend="notation-view"
+>editor de notación</link
+> para emprolijar la partitura antes de imprimir. (Ver también <link linkend="nv-quantization"
+>Notación desde datos de performance</link
+>.) </para>
+
+ <para
+>&rosegarden; es capaz de producir partituras muy legibles. De todas formas, está diseñado para ser un editor de pantalla y no primariamente un editor de partes. Si quiere producir partituras con verdadera calidad de impresión, se debe considerar el uso de <ulink url="http://www.lilypond.org"
+>Lilypond</ulink
+> junto con &rosegarden;. Lilypond es un software para crear partituras que lee un archivo de texto especializado y produce impresiones de alta calidad. &rosegarden; es capaz de escribir archivos de Lilypond usando la función <menuchoice
+> <guimenu lang="es"
+>Archivo</guimenu
+> <guimenuitem
+>Exportar</guimenuitem
+> <guimenuitem
+>Exportar a Lilypond</guimenuitem
+> </menuchoice
+>. </para
+> </sect1>
+
+ </chapter>
+
+ <chapter id="segment-view">
+ <title
+>El editor de Pistas</title>
+ <sect1 id="segment-view-overview">
+ <title
+>Características</title>
+ <para
+>La presentación principal de &rosegarden; es similar a la de muchos otros secuenciadores populares. Está basado en una estructura de pistas &mdash; la ventana principalmuestra un editor de pistas con una lista de las mismas y sus instrumentos asociados en la izquierda. Es posible manipular y mover bloques de datos (referidos como &ldquo;segmentos&rdquo;) en el editor de pistas como así también abrir los segmentos en un editores especializados (<link linkend="notation-view"
+>notación</link
+>, <link linkend="matrix-view"
+>matríz</link
+>, and <link linkend="event-view"
+>lista de eventos</link
+>). </para>
+
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-trackeditor.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase
+>El editor de pistas de &rosegarden; mostrando dos segmentos de datos de música.</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+
+ <para
+>Las pistas pueden ser asignadas a un rango de instrumentos &MIDI;, sintetizadores por plugins o instrumentos de audio. En la figura de arriba se puede ver tres segmentos en el editor de pistas asignados a instrumentos General MIDI. </para>
+
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-trackbutton-labels.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase
+>Los botones de pista de &rosegarden; mostrando susetiquetas correspondientes.</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+
+ <para
+>El área de botones a la izqueirda del canvas de segmentos muestra el número de pista, los estátus de silenciamiento y grabación y la etiqueta de la pista. Puede silenciar o desilenciar una pista cliqueando en el botón con forma de LED azul, y seleccionar una pista en particular para grabacíon cliqueando en el rojo. Para cambiar la etiqueta de la pista, haga doble click en ella. </para>
+
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-trackbutton-instruments.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase
+>Los botones de pista de &rosegarden; mostrando la asignación de instrumentos.</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+
+ <para
+>Las etiquetas de pistas son sólo mostradas si la opción del menú <menuchoice
+> <guimenu lang="es"
+>Configuraciones</guimenu
+> <guimenuitem
+>Mostrar las Etiquetas de Pistas</guimenuitem
+> </menuchoice
+> está activado. De otra forma, como se ve en la figura, se muestra la asignación de instrumentos para cada pista.</para>
+
+ </sect1>
+ <sect1 id="segment-view-instruments">
+ <title
+>Pistas e Instrumentos</title>
+ <para
+>Cada pista debe tener un instrumento asignado a ella, para que pueda ser escuchada. Por defecto, las primeras 16 pistas son asignadas a los 16 instrumentos del primer dispositivo MIDI disponible, y las siguientes 16 asignadas a audio.</para>
+
+ <para
+>Para cambiar la asignación de instrumentos para cada pista, cliquee con el botón derecho en la etiqueta de la pista Un menú emergente aparecerá, en el cuál es posible seleccionar entre todos los instrumentos disponibles. </para>
+
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-trackbutton-instrumentmenu.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase
+>Mneú de instrumentos de &rosegarden;</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+
+ <para
+>Un instrumento puede ser interpretado como un solo canál en un dispositivo &MIDI;, o como una entrada de audio mono ó estéreo o un plugin de sintetizador. Las pistas que contienen datos de notas deben ser asignados a un instrumento &MIDI; o a uno de un plugin de sintetizador, y aquellas que contengan audio, a un instrumento de audio. Es posible asignar más de una pista para el mismo instrumento, en cuyo caso las múltiples pistas van a usar los mismos sonidos. </para>
+ <para
+>Es posible cambiar varias de las propiedades de los instrumentos asociados con una pista usando la <link linkend="segment-view-instrumentparameterbox"
+>caja de Parámetros de Instrumentos</link
+>. Desde aquí se puede, por ejemplo, setear un instrumento MIDI para utilizar un patch en particular y de ésa manera producir un sonido en particular (piano, cuerdas, etc.). </para>
+ <para
+>Vea la sección <link linkend="studio-introduction"
+>Estudio</link
+> para mas información acerca de instrumentos. </para>
+
+ </sect1>
+
+ <sect1 id="segment-view-creating">
+ <title
+>Creando segmentos</title>
+ <para
+>Para crear un segmento vacío, de forma de empezar a componer algo nuevo, es necesario utilizar la herramienta lapiz. Cliquee en el lápiz de la barra de herramientas y luego cliquee en el punto donde quiere que empiece su segmento (a la altura correcta para la pista en la que desea que el segmento se encuentre, y a una distancia através de la ventana del editor correspondiente al tiempo que desea) y arrastre hacia la derecha hasta que el segmento tenga el número correcto de barras de longitud. </para>
+
+ <para
+>Usualmente cada nuevo segmento empieza en una línea de barra y se extiende barra por barra, pero este efecto de ajustar-a-la-grilla puede ser prevenido presionando la tecla Shift mientras se cliquea y arrastra. </para>
+
+ <para
+>Una vez creado el segmento, puede empezar a editarlo utilizando los ediores de<link linkend="matrix-view"
+>matríz</link
+> o de <link linkend="notation-view"
+>notación</link
+>. Para usar uno de éstos editores, haga doble click en el segmento, o cliquee con el botón derecho y elija el editor que quiere del menú de contexto. </para>
+
+ <para
+>Si pretende <link linkend="recording"
+>grabar</link
+> de un dispositivo MIDI o una entrada de audio, no necesita crear un nuevo segmento para grabar en él. Cada granación por separado siempre va en un segmento nuevo, creado automáticamente durante la grabación. </para>
+ </sect1>
+
+ <sect1 id="segment-view-audio-segments">
+ <title
+>Segmentos de audio</title>
+ <para
+>Un segmento de audio contiene o datos de una grabación o de audio sampleado, en vez de datos de eventos-de-nota editables. Rosegarden permite grabar, reproducir, acomodar y dividir segmentos de audio, pero no contiene facilidades de edición de señal de audio. </para>
+ <para
+>Para crear un segmento de audio, puede <link linkend="recording"
+>grabar</link
+> desde una fuente de audio en una pista asignada a un instrumento de audio, o puede trabajar con archivos WAV existentes. Para lograr esto, se utiliza el diálogo de administración de audio (que se puede encontrar en <menuchoice
+><guimenu lang="es"
+>Segmentos</guimenu
+><guimenuitem
+>Manejar Segmentos de Audio</guimenuitem
+></menuchoice
+>). </para>
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-audiofilemanager.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase
+>El administrador de archivos de audio</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+
+ <para
+>Es posible arrastrar y soltar archivos de audio desde el explorador de archivos de KDE o desde su escritorio KDE dentro del administrador de archivos de audio, o puede abrirlos usando el menú Archivo. Entonces es posible arrastar y soltarlos en el canvas de pistas de Rosegarden, o usar la función del administrador de archivos de audio<menuchoice
+><guimenu lang="es"
+>Acción</guimenu
+><guimenuitem
+>Insertar en la Pista de Audio seleccionada</guimenuitem
+></menuchoice
+>, siempre que la pista seleccionada en la ventana principal esté asignada a un instrumento de audio. Segmentos de audio recién grabados también aparecen en el diálogo del administrador de archivos de audio.</para>
+
+ <para
+>Detalles de los archivos de audio utilizados con una composición en particular son guardados junto con ésa composición, pero no lo son los archivos de audio propiamente dichos. Debe asegurarse que su documento tenga el path de búsqueda de archivos de audio correcto (vía <menuchoice
+><guimenu lang="es"
+>Composición</guimenu
+><guimenuitem
+>Editar Propiedades del Documento...</guimenuitem
+><guimenuitem
+>Audio</guimenuitem
+></menuchoice
+>) de manera de mantener sus archivos de audio accesibles al mismo tiempo.</para>
+
+ <para
+>El administrador de audio también muestra la tasa de sampleo y otros detalles para cada archivo de audio, y marca con un asterisco cualquier archivo de audio cuya tasa de sampleo no coincide con la sesión de JACK utilizada en el momento por Rosegarden. Rosegarden resampleará éstos archivos al momento de reproducción usando un resampleador lineal rápido (pero de muy baja calidad). Se recomienda resamplear los archivos utilizando un editor de audio dedicado de manera separada. </para>
+
+ </sect1>
+
+ <sect1 id="segment-view-manipulating">
+ <title
+>Manipulando segmentos</title>
+ <para
+>La ventana principal contiene una selección de "herramientas" para editar segmentos. éstas se esncuentran disponibles desde la barra de herramientas principal: primero seleccione la herramienta que desea de la barra, y luego cliquee y arrastre sobre los segmentos del canvas principal. </para>
+
+ <sect2 id="segment-view-selector">
+ <title
+>La herramienta de selección</title>
+ <para
+>La "herramienta de selección" (la herramienta flecha) es realmente una multipropósito, puede ser usada para seleccionar, mover, copiar y redimensionar segmentos.</para>
+
+ <para
+>El uso mas obvio es selección: seleccione un solo segmento cliqueando sobre él con la herramienta de selección, o seleccione varios de ellos manteniendo presionada la tecla Shift, o cliqueando en un área vacía de la ventana y arrastrando un área que cubra dichos segmentos. </para>
+
+ <para
+>Para mover segmentos con la herramienta de selección, simplemente cliquee y arrastre sobre el segmento. Para crear copias, cliquee y arrastre mientras presiona la tecla Ctrl. Para redimensionar un segmento, cliquee y arrastre en el borde derecho del segmento; y para crear nuevos segmentos, cliquee y arrastre en un área vacía con el botón del medio del ratón. </para>
+
+ <para
+>La herramienta de selección no reemplaza a las demás herramientas completamente;&mdash; a veces se necesita ser mas preciso sobre la operación que se pretende, particularmente cuando se trata de segmentos pequeños. </para>
+
+ </sect2>
+
+ <sect2 id="segment-view-move-resize">
+ <title
+>Herramientas para Mover y Redimensionar</title>
+ <para
+>Para mover un segmento a un punto distinto de comienzo o pista, use la herramienta Mover y cliquee y arrastre el segmento que desea mover. Si mantiene presionada la tecla Ctrl mientras arrastra, el segmento será copiado en vez de movido.</para>
+
+ <para
+>Para redimensionar un segmento, utilice la herramienta Redimensionar; y cliquee y arrastre en el lado derecho del segmento.</para>
+
+ <para
+>Para mover y redimensionar de manera mas precisa (posicionamiento fino) se debe mantener presionada la tecla Shift, de ésta manera se evita que el segmento se ajuste a una posición particular de la grilla. </para>
+
+ </sect2>
+
+ <sect2 id="segment-view-split-join">
+ <title
+>Herramienta de División</title>
+ <para
+>La herramienta de división <inlinemediaobject
+> <imageobject
+> <imagedata fileref="rg-split.png"/> </imageobject
+> </inlinemediaobject
+> permite dividir un segmento en dos separados. Para dividir un segmento, seleccione la herramienta de división y cliquee en el segmento que desea dividir. </para>
+ <para
+>Por defecto, los segmentos son divididos en la línea de barras mas cercana al cursor, pero ésto puede ser evitado presionando la tecla Shift mientras se separa el segmento. </para>
+ </sect2>
+ </sect1>
+
+ <sect1 id="segment-view-tempo-timesig">
+ <title
+>Tiempo de medida y compás</title>
+ <sect2 id="tempo">
+ <title
+>Tempo</title>
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-tempodialog.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase
+>Diálogo de tempo de &rosegarden;</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+ </sect2>
+
+ <sect2 id="time-signature">
+ <title
+>Tiempo de medida y compás</title>
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-timesigdialog.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase
+>El diálogo de tiempo de medida y compás de &rosegarden;</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+ </sect2>
+ </sect1>
+ </chapter>
+
+ <chapter id="transport">
+ <title
+>El Transporte</title>
+ <para
+>Cuando se reproduce una composición, &rosegarden; muestra un puntero de reproducción através de las pistas de izquierda a derecha, reproduciendo el contenido de los segmentos que atraviesa. La posición del puntero en pantalla es seguida y controlada por una ventana llamada el Transporte. </para>
+
+ <sect1 id="transport-overview"
+><title
+>Características</title>
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-transport.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase
+>Ventana de Transporte de &rosegarden;</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+
+ <para
+>Si el Transporte no se encuentra visible, puede activarlo con <menuchoice
+> <guimenu lang="es"
+>Configuración</guimenu
+> <guimenuitem
+>Mostrar Transporte</guimenuitem
+> </menuchoice
+>. </para>
+
+ <para
+>El Transporte muestra el tiempo a el cuál ha llegado el puntero de reproducción, mostrado en segundos por defecto. Puede cambiarlo para mostrar tiempo musical (conteo de barras y beats), tiempo musical con un metrónomo visual relampageante, o frames de muestreo de audio, usando el botón que se encuentra mas arriba entre los botones pequeños en la ventana de transporte izquierda. El botón inmediatamente inferior cambia el display de manera de mostrar el tiempo faltante para el final de la composición en vez de mostrar el tiempo transcurrido desde el comienzo.</para>
+
+ <para
+>Los controles principales del transporte comienzan la ejecución del secuenciador y lo pausan, adelantan el puntero de posición, lo rebobinan, lo paran o permiten saltar hasta el principio o el final de la composición. </para>
+
+ <para
+>Controles adicionales y un display de eventos &MIDI; se encuentran escondidos en el fondo extensible del transporte, el cuál puede ser mostrado o escondido mediante el botón con forma de flecha en el borde inferior izquierdo del transporte. En ésta porción extra del transporte se puede encontrar también botones para grabación, setear loops, solos de pistas determinadas, encender o apagar el metrónomo, y silenciar dispositivos MIDI (botón de pánico). </para>
+
+ </sect1>
+ <sect1 id="recording">
+ <title
+>Grabando</title>
+ <para
+>Para grabar un nuevo segmento en una pista, primero asegúrese que la pista correcta haya sido seleccionada para grabar seleccionando el botón estilo LED rojo en la etiqueta de la pista, y luego use el control de grabación del Tranporte. Esto hace que se inicien tanto el transporte (por lo que se reproduce la composición existente) como la grabación en la pista apropiada. Por el momento solo una pista por vez puede estar activa para grabar. </para>
+ <para
+>Alternativamente se puede utilizar la grabación de pinchado para separar los actos de comenzar el transporte y entrar en modo de grabación. Las grabaciones por pinchado pueden ser activadas y desactivadas con la barra espaciadora. Puede presionarla mientras se reproduce una composición para cambiar instantáneamente entre reproducción y grabación sin tener que parar el transporte, o puede utilizarla para armar para grabación cuando el transporte se encuentra detenido, de manera que la reproducción subsecuente sea de hecho una grabación. (Esto último es práctico cuando se utiliza un <link linkend="transport-external"
+>transporte externo</link
+>.) </para>
+ <para
+>Si la pista a grabar está asignada a un instrumento MIDI, la grabación va a llevarse a cabo para todos los intrumentos en <link linkend="studio-device-editor"
+>Administrador de dispositivos MIDI</link
+>. </para>
+ <para
+>Si la pista a grabar está asignada a un instrumento de audio, la grabación será desde la entrada seleccionada en ese momento en la <link linkend="segment-view-instrumentparameterbox"
+>caja de parámetros de instrumentos</link
+>. Éste puede ser una entrada de audio externa o un master o submaster de audio (para realizar mezclas). Si se tratara de una entrada externa, será por defecto grabada de la primer entrada física de sonido disponible de la placa de audio. Quizás prefiera usar una herramienta de conección para JACK para conectar alguna otra aplicación JACK a la entrada de audio. </para>
+ </sect1>
+
+ <sect1 id="transport-external">
+ <title
+>Transportes externos</title>
+ <para
+>Rosegarden soporta el mecanismo de tranporte JACK para sincronizar su transporte con otras aplicaciones JACK. Para activarlo, vaya a <menuchoice
+> <guimenu lang="es"
+>Configuraciones</guimenu
+> <guimenuitem
+>Configurar Rosegarden...</guimenuitem
+> </menuchoice
+> y en la página del Secuenciador, tab Sincronización, seleccione "Sincronizar" del menú de modo de transporte JACK.</para>
+
+ <para
+>Cuando el transporte JACK se encuentra en uso, todas las aplicaciones subscriptas a él comparten un control de transporte común, y es posible empezar, parar y mover el transporte para cualquiera de ellas.</para>
+
+ <para
+>Muchas aplicaciones de audio para Linux soportan el transporte JACK: consulte la documentación de las aplicaciones para mas detalles.</para>
+ </sect1>
+ </chapter>
+
+ <chapter id="studio">
+ <title
+>El Estudio</title>
+
+ <sect1 id="studio-introduction">
+ <title
+>Dispositivos, instrumentos y conecciones</title>
+
+ <para
+>Rosegarden utiliza el término Estudio para referirse a todo lo que conoce sobre los sistemas de sonido de su computadora. Esto puede incluir hardware &MIDI; y de audio, y otros softwares de audio, e incluye información sobre conecciones, configuraciones, parches &MIDI; y demás. El Estudio está dentro de cada composición que cree con Rosegarden.</para>
+
+ <para
+>Tres piezas de terminología son esenciales aquí: <variablelist>
+
+ <varlistentry>
+ <term
+>Dispositivo</term>
+ <listitem>
+ <para
+>Un <quote
+>dispositivo</quote
+>, a consideración de Rosegarden, es sencillamente algo que es capaz de producir sonidos. Ésto puede ser un dispositivo de audio o MIDI. Los dispositivos MIDI no corresponden necesariamente a un puerto MIDI físico: son sólo cosas con nombres a los que es posible referirse, y de los que se espera que funcionen de cierta manera. Información de configuración como mapas de parches MIDI pueden ser adozadas a los dispositivos. </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>Instrumento</term>
+ <listitem>
+ <para
+>Cada dispositivo tiene un número de <quote
+>instrumentos</quote
+>, para los que se asume que cada uno de los cuales tienen un sonido particular. éstas son las cosas a las que se les puede asignar pistas con el fin de elegir que sonido ejecutar. Por defecto, un dispositivo contiene 16 instrumentos, creados parra usted al inicio. Si el dispositivo fuera MIDI, entonces éstos seran inicializados a uno de los 16 canales MIDI. El instrumento es donde se configuran todas las propiedades de una voz en particular, como seteos de programa, reverberación, volumen, etc. </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>Conexión</term>
+ <listitem>
+ <para
+>Mientras que un dispositivo MIDI es simplemente un nombre y una colección de información de configuración, la <quote
+>conexión</quote
+> especifica qué puerto MIDI está físicamente vinculado. Esto puede ser configurado en <link linkend="studio-device-editor"
+>Composición - Estudio - Gestionar Dispositivos MIDI</link
+>. (El Audio y los dispositivos de plugins sintéticos no tienen el mismo tipo de conexiones.) </para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </para>
+
+ <para
+>Por ejemplo, imagina una configuración consistente en una PC con dos puertos MIDI físicos, uno de los cuales tiene un sintetizador externo conectado a éste. Aquí normalmente configurarías Rosegarden para que tuviera un dispositivo MIDI, correspondiente al sintetizador. Podrías luego configurar este dispositivo con el nombre y datos de Banco, Programa y Controladores correspondiente, y luego especificar una conexión para éste que corresponda al puerto pertinente en tu placa de sonido. Cada uno de los 16 instrumentos predeterminados en el dispositivo pueden luego ser configurados con un programa satisfactorio, y luego les asignarías pistas.</para>
+
+ <para
+>En la práctica, Rosegarden creará de forma predeterminada un dispositivo por cada una de las conexiones disponibles durante el inicio. Entonces, en el ejemplo anterior, serán creados dos dispositivos MIDI de manera predeterminada incluso si necesitaras sólo uno. Generalmente renombrarías y aplicarías Datos de Banco, Programa y Controladores al primer dispositivo, y borrarías o simplemente no usarías el segundo. Recuerda que no hay un modo actualmente en que Rosegarden pueda saber qué sintetizadores conectaste a los puertos MIDI de tu computadora: por ésta razón, los dispositivos creados durante el inicio intentan ser solamente un set predeterminado, y depende de tí asegurarte de que los dispositivos configurados tengan que ver con los que realmente estás usando. </para>
+
+ <para
+>Una vez configurada, la configuración del Estudio es guardada con cada archivo de formato Rosegarden que grabes posteriormente.</para>
+
+ </sect1>
+
+ <sect1 id="studio-device-editor">
+ <title
+>Gestionando dispositivos MIDI</title>
+
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-devicemanager.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase
+>Gestionar Dispositivos MIDI</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+
+ <para
+>El diálogo Gestionar Dispositivos MIDI te muestra los dispositivos MIDI disponibles para tí en este momento y dónde están conectados. Para llegar a éste diálogo, usa <menuchoice
+> <guimenu lang="es"
+>Composición</guimenu
+> <guimenuitem
+>Estudio</guimenuitem
+> <guimenuitem
+>Gestionar Dispositivos MIDI</guimenuitem
+> </menuchoice
+>. </para>
+
+ <para
+>Como se describe en la sección <link linkend="studio-introduction"
+>Dispositivos, Instrumentos y Conexiones</link
+>, Rosegarden, de forma predeterminada, trata de proveer un plausible set de dispositivos para tí en el inicio, y de hacer conexiones razonables para esos dispositivos. Pero la configuración predeterminada puede no ser siempre satisfactoria y, por eso mismo, éste diálogo te permite renombrar los dispositivos y modificar sus conexiones y dirección de reproducción y grabación. </para>
+
+ <para
+>Cada uno de los dispositivos de Reproducción listados aquí provee un destino o target para que las pistas MIDI le puedan hablar: si agregas un nuevo dispositivo de Reproducción, tendrás 16 nuevos instrumentos en este dispositivo al cual le puedes asignar pistas. Si luego asignas una conexión para ese dispositivo, las pistas asignadas a él reproducirán el canal apropiado (dependiendo del instrumento) de cualquier sintetizador MIDI conectado a esa conexión. </para>
+
+ <para
+>Los dispositivos de grabación listados aquí representan posibles fuentes para grabar MIDI. Puedes converir en actual uno o más de ellos (entonces Rosegarden los escuchará cuando graba) usando las casillas de chequeo en cada línea, como se muestra en éste diálogo </para>
+
+ </sect1>
+
+ <sect1 id="studio-bank-editor">
+ <title
+>Administrando bancos y programas para dispositivos MIDI</title>
+
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-bankeditor.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase
+>El Editor de bancos y programas MIDI</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+
+ <para
+>Recuerda que cada dispositivo MIDI contienen un número de instrumentos, y que puedes asignar pistas para elegir instrumentos. En términos MIDI, cada instrumento corresponde a un sólo canal en tu sintetizador MIDI. Puedes elegir cuál de las voces disponibles (sonidos) en tu sintetizador usa cada instrumento, pero para hacer ésto, debes dejar que Rosegarden sepa los nombres para todas las voces disponibles. </para>
+
+ <para
+>Éste diálogo te permite adjuntar bancos de programas (nombres de voces) a tus dispositivos MIDI, de ese modo permite a cada instrumento en un dispositivo dado ser configurado para usar una de esas voces en la ventana <link linkend="segment-view-instrumentparameterbox"
+>Parámetros de Instrumento</link
+>. </para>
+
+ <para
+>El modo usual para configurar nombres de programas para un dispositivo consiste simplemente en importarlo desde alguno de los archivos de dispositivo dados (".rgd"). Para hacer ésto, selecciona un dispositivo en la lista en la izquierda del diálogo, luego haz click en el botón Importar debajo de la lista, y elige el archivo .rgd correspondiente a tu sintetizador. </para>
+
+ <para
+>Si no hay un archivo .rgd actualmente para tu sintetizador, puedes usar éste diálogo para crear un nuevo banco. Para hacer ésto deberás encontrar el mapa de programa en tu Esquema de Implementación MIDI de tu Sintetizador e ingresar todos los nombres a mano: puedes luego exportarlo a un archivo .rgd para compartir con otros usuarios de Rosegarden. </para>
+
+ <sect2 id="studio-soundfonts">
+ <title
+>SoundFonts(fuentes de sonido)</title>
+
+ <para
+>Si sucede que estás usando un sintetizador por software o un sintetizador de placa de sonido que usa archivos SoundFont (.sf2), puedes simplemente cargar los nombres de programa correctos directamente desde tu archivo .sf2 dentro de éste diálogo. Sólo elige Importar normalmente, y luego elige el archivo .sf2 que estás usando, en lugar de un archivo .rgd. </para>
+
+ <para
+>Nota que el Estudio sólo maneja información acerca de los dispositivos MIDI existentes paraq Rosegarden, actualmente no maneja tareas como por ejemplo cargar un SoundFont en tu placa de sonido en un primer momento. Si quieres asegurarte que un SoundFont fue cargado en tu placa de sonido cuando Rosegarden inicia, deberías usar la opción especial "Cargar Fuente de Sonidos en la tarjeta SoundBlaster al inicio" </para>
+ </sect2>
+
+ <sect2 id="studio-variations">
+ <title
+>Variaciones</title>
+
+ <para
+>Algunos dispositivos MIDI (por ejemplo, esos de Roland) organizan sus nombres de programa usando un esquema conocido como "variaciones". Para esos dispositivos, generalmente querrás seleccionar un programa primeramente seleccionado el nombre de programa básico &mdash;, como por ejemplo un piano &mdash; y luego selecciona uno del set de variaciones en ese programa &mdash; como por ejemplo, piano eléctrico. Ésto contrasta con los sintetizadores basados en General MIDI, que organizan sus programas dentro de bancos y esperan que tú elijas un banco en primer lugar, y luego un programa para ese banco. </para>
+
+ <para
+>Rosegarden puede soportar dispositivos que usan variaciones, pero todavía tiene que ingresar los nombres de programas en un formato de banco. Internamente, los dispositivos que usan variaciones aún usan selección de controladores por banco MIDI para elegir entre las variaciones; debes encontrar en la documentación de tu sintetizador si tu dispositivo usa selección de banco LSB o MSB para elegir variaciones, y qué número de banco corresponde a qué variación. Puedes luego ingresar los bancos normalmente, y usar "Mostrar lista de Variaciones basada en MSB/LSB" </para>
+ </sect2>
+
+ <sect2 id="studio-midi-import">
+ <title
+>Mapeo de programas en &MIDI; importar</title>
+ <para
+>Cuando importas un archivo &MIDI; dentro de una composición, &rosegarden; usa la configuración estudio existente para determinar cómo mapear los programas &MIDI; dentro de los instrumentos de &rosegarden;. Lo que se pretende es asegurarse de que cada programa &MIDI; quede mapeado a un instrumento que realmente exista en tu estudio (y que esté conectado tu PC), así todas las pistas &MIDI; pueden ser escuchadas. </para
+><para
+>Los cambios de programas &MIDI; y los eventos de selección de bancos encontrados en el archivo importado son usados mientras se importa, pero como un ayuda para ayudar a encontrar el instrumento apropiado para cada pista &MIDI; desde el set de instrumentos en tu estudio. Así, por ejemplo, si tu estudio está actualmente configurado para contener solamente instrumentos <acronym
+>GM</acronym
+>, y tú importas un archivo &MIDI; con cambios de programa <acronym
+>GS</acronym
+> dentro de éste, &rosegarden; remapeará los bancos <acronym
+>GS</acronym
+> de vuelta dentro de <acronym
+>GM</acronym
+> porque son todos los que conoce que tú tienes al momento de importar el archivo. Rosegarden no recuerda los números de programas <acronym
+>GS</acronym
+> originales. </para
+><para
+>Ésto significa que tú deberías siempre asegurarte que tu estudio esté correctamente configurado para los dispositivos que posees actualmente, antes de importar el archivo &MIDI;. De otra manera, los datos de programas en el archivo &MIDI; se perderán. </para>
+ </sect2>
+ </sect1>
+
+ <sect1 id="studio-audio-routing">
+ <title
+>Direccionamiento de Audio</title>
+ <para
+>Cualquier pista de Rosegarden asignada a un instrumento de audio o synth plugin se convierte en parte de la arquitectura de direccionamiento de audio de Rosegarden. Hay 16 instrumentos de audio y 16 instrumentos synth plugin, y cada uno de ellos tiene un set de parámetros ajustables incluyendo nivel del fader (volumen), paneo, efectos, etc. Éstos son configurables generalmente en el diálogo de <link linkend="segment-view-instrumentparameterbox"
+>Parámetros de Segmento</link
+> o en <link linkend="studio-audio-mixer"
+>Mezclador de audio</link
+>. Cada instrumento de audio también tiene una conexión de entrada, y ambos instrumentos audio y synth plugin tienen una conexión de salida. </para>
+
+ <para
+>Una conexión de entrada de un instrumento define de dónde Rosegarden leerá datos de audio mientras graba en este instrumento. La configuración más usual sería desde una de las conexiones de entrada externas de Rosegarden, cuyo número es configurable en el <link linkend="studio-audio-mixer"
+>Mezclador de Audio</link
+>. Ésto corresponde a los puertos de audio JACK expuestos por Rosegarden, en los cuales puedes conectar salidas desde cualquier otra aplicación de audio JACK o puertos de captura de placa de sonido usando una aplicación de direccionamiento externo como <ulink url="http://qjackctl.sf.net/"
+>QJackCtl</ulink
+>. Puedes también configurar una entrada de un instrumento de audio hacia la salida de una de las salidas de submasters o master incorporadas en rosegarden para realizar mezclas. </para>
+ <para
+>Una conexión de salida de instrumento define dónde va el audio cuando se reproduce. De forma predeterminada los instrumentos envían su audio hacia la salida de master de Rosegarden, que es otro par de puertos externos de JACK que pueden ser conectados usando el mismdo direccionador externo de JACK (qjackctl). De todos modos, Rosegarden también soporta hasta ocho buses de submaster internos, hacia los cuales puedes enviar salidas de instrumentos para agruparlos en categorías específicas. Puedes controlar el número de direccionamiento de éstos en el <link linkend="studio-audio-mixer"
+>Mezclador de Audio</link
+>. </para>
+ <para
+>Actualmente Rosegarden soporta efectos usando un set de slots insert pre-fader para cada instrumento de audio. No puedes aún asignar efectos a los busses de submaster, y Rosegrden no soporta aún enviar efectos, aunque puedes obtener resultados similares usando la arquitectura de efectos externos y mezcla de JACK. </para>
+ <para
+>Algunos detalles más acerca de la configuración del direccionamiento de audio, mezcla y efectos son discutidos en las secciones <link linkend="studio-audio-mixer"
+>Mezclador de Audio</link
+>, <link linkend="segment-view-instrumentparameterbox"
+>Parámetros de Instrumento</link
+> y <link linkend="studio-plugins"
+>Plugins de Audio</link
+>.</para>
+ </sect1>
+
+ <sect1 id="studio-audio-mixer">
+ <title
+>El Mezclador de Audio</title>
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-audiomixer.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase
+>El Mezclador de Audio de &rosegarden;</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+
+ <para
+>La ventana de Mezclador de Audio de Rosegarden, a la cual se llega mediante <menuchoice
+> <guimenu lang="en"
+>Composición</guimenu
+> <guimenuitem
+>Estudio</guimenuitem
+> <guimenuitem
+>MEzclador de Audio</guimenuitem
+></menuchoice
+>, se parece a un mezclador de audio físico (por hardware) y provee un modo de ver y cambiar el estado de un número de instrumentos de audio de una vez. Contiene muchos de los mismos controles tal como se encuentran en audio y synth plugin <link linkend="segment-view-instrumentparameterbox"
+>Parámetros de Instrumento</link
+>, siendo los más importantes un display de volumen de reproducción y una perilla de volumen (fader) para cada instrumento de audio y synth plugin, como también controles de direccionamiento, paneo, mono/stereo y slots de plugins de efectos. </para>
+ <para
+>La ventana de mezclador de audio es también el lugar en el cual ves y controlas el nivel de volumen de audio de salida del master (bien sobre la derecha en la imagen de arriba), tanto como el nivel de grabación (a la izquierda del fader del master) y los niveles de salida del submaster. </para>
+ <para
+>El menu de <menuchoice
+> <guimenu lang="es"
+>Preferencias</guimenu
+></menuchoice
+> del mezclador de audio es particularmente relevante. Además de controlar lo que será mostrado en la ventana del mezclador, éste menú también contiene la configuración del <link linkend="studio-audio-routing"
+>Direccionamiento de Audio</link
+> para el número de entradas de grabación stereo disponibles y el número de sobmasters. Estas son configuraciones de Estudio que son grabadas con tu archivo de formato Rosegarden.</para>
+
+ <para
+>Nota que si actualmente no estás usando ningún submaster (por ejemplo si no hay instrumentos configurados para direccionar sus salidas hacia un submaster) puedes ver una pequeña mejora en la performance si configuras el número de submaster explícitamente a Ninguno, en lugar de mantener submasters en desuso en la configuración. </para>
+ </sect1>
+
+ <sect1 id="studio-midi-mixer">
+ <title
+>El Mezclador MIDI</title>
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-midimixer.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase
+>El Mezclador MIDI de &rosegarden;</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+ <para
+>AL ventana de Mezclador MIDI de Rosegarden, que se alcanza desde <menuchoice
+> <guimenu lang="es"
+>Composición</guimenu
+> <guimenuitem
+>Estudio</guimenuitem
+> <guimenuitem
+>Mezclador MIDI</guimenuitem
+></menuchoice
+>, provee una forma de ver y editar los <link linkend="segment-view-instrumentparameterbox-midi"
+>Valores de parámetros de instrumento</link
+> para un número de instumentos MIDI de una sola vez.</para>
+
+ <para
+>La ventana está organizada usando un panel de solapas. A lo largo de la parte iferior verás una solapa para cada dispositivo de reproducción MIDI en tu configuración de estudio. Cuando seleccionas una solapa de dispositivo, el resto de la ventana se actualizará para mostrar los controles para los 16 instrumentos de ese dispositivo. </para>
+
+ <para
+>Los controles mostrados para cada instrumento son esos que han sido configurados en el administrador de control de parámetros, así como el volumen (correspondiente al controlador de cambio de volumen MIDI, no a la velocidad o MIDI velocity o niveles en dB de audio) y un indicador de nivel aproximado de salida. </para>
+ </sect1>
+
+ <sect1 id="studio-plugins">
+ <title
+>Plugins de Audio</title>
+ <para
+>Un plugin (o extensión) de audio es una pieza de software, separada de Rosegarden, que Rosegarden puede cargar y usar con el objetivo de cumplir una tarea particular de procesamiento de audio. Éstas pueden ser ampliamente divididas en plugins de efectos y synth plugins (extensiones de sintetizador). Los plugins de efectos toman una entrada de audio y la manipulan para producir una salida de audio diferente; los synth plugins toman eventos del tipo MIDI como entrada y los convierten salida de audio. Rosegarden usa el API standard para Linux LADSPA para efectos y el API plugin DSSI para los sintetizadores, permitiendo el uso de una gran candidad de plugins de código abierto, que están disponibles gracias al trabajo de muchos desarrolladores. </para>
+ <para
+>El uso de plugins tiene un costo en términos de tiempo de CPU, porque el procesamiento de audio en tiempo real usualmente toma una significante cantidad de trabajo incluso en un moderno CPU. </para>
+ <sect2 id="studio-plugins-effects">
+ <title
+>Extensiones de Efectos (plugins de efectos)</title
+> <para
+>Un plugin de efectos es algo que podés usar para modificar una señal de audio de un modo controlable. Los ejemplos incluyen reverb, delay, comprensión dinámica y así. </para>
+ <para
+>Cada instrumento de audio o synth-plugin en Rosegarden tiene cinco slots de efectos asociados. De forma predeterminada están vacíos, pero puedes cargar plugins dentro de ellos para encadenar hasta cinco efectos dentro de la señal de audio antes de que ésta vaya al procesamiento de nivel de fader (volumen) y paneo.</para>
+
+ <para
+>Para cargar un plugin en un slot (o casilla), cliquea su botón en <link linkend="segment-view-instrumentparameterbox-audio"
+>Parámetros de Instrumento</link
+>: </para>
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-pluginbuttons.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase
+>Botones de Slots de Plugins</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+ <para
+>(Estos botones están disponibles de forma opcional en la ventana del <link linkend="studio-audio-mixer"
+>mezclador de audio</link
+>.) </para>
+ <para
+>Haciendo clic en un botón de un plugin desplegarás el diálogo del mismo. Esto te muestra las categorías de efectos disponibles en el primer menú; selecciona uno, y luego puedes seleccionar tu plugin en el segundo menú. </para>
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-plugin-dialog.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase
+>Un diálogo de Plugin de &rosegarden;</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+
+ <para
+>Debajo de los menús, el diálogo te da un número variante de controladores rotatorios mostrando todos los parámetros modificables para el plugin que has seleccionado. Para cambiar el valor, sólo cliquea en una perilla y arrastra el mouse hacia arriba, abajo, izquierda o derecha. (Arriba o a la derecha para elevar el valor, abajo o a la izquierda para bajarlo). Tabién puedes girar la rueda del mouse para cambiar ese valor, o hacer clic con el botón del medio del mouse para resetearla a si valor inicial.</para>
+
+ <para
+>También es posible copiar un plugin con su configuración actual dentro de otro slot, para usar las mismas configuraciones de plugins con más de un instrumento, o basar una configuración de plugin en otra. Sólo cliquea en el botón Copy cuando tengas el plugins configurado del modo en tú lo quieres tener, y luego abre otro diálogo de slot de plugin y cliquea en Pegar.</para>
+
+ <para
+>Finalmente, puedes checkear la casilla Desviación para que el plugin deje de procesar temporariamente, y a la vez retiene su configuración. </para>
+ </sect2>
+ <sect2 id="studio-plugins-synths">
+ <title
+>Extensiones de Síntesis o Synth Plugins</title>
+ <para
+>Las extensiones de síntesis o Synth Plugins pueden utilizarse en lugar de dispositivos MIDI basados en hardware o software para generar sonidos desde tus segmentos de eventos de notas.</para>
+
+ <para
+>Usar una extensión de síntesis (synth plugin) le da un mejor control que usar un dispositivo MIDI externo, debido a que Rosegarden cargara las extensiones correspondientes y usara las configuraciones correctas la próxima vez que utilice el mismo archivo. Las extensiones también pueden ofrecer una mejor resolución temporal que un dispositivo MIDI externo; y los instrumentos sintetizados tienen la ventaja de ser ruteables como instrumentos de audio, lo que significa que usted puede agregar efectos por arriba de ellos </para>
+
+ <para
+>Para utilizar una extensión de síntesis (synth plugin), primero <link linkend="segment-view-instruments"
+>asigne una pista</link
+> a un instrumento y luego cargue una extensión de síntesis (synth plugin) cliqueando en el botón de mas arriba en el <link linkend="segment-view-instrumentparameterbox-synth"
+>cuadro de dialogo parámetros de instrumento</link
+>:</para>
+
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-synthpluginbuttons.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase
+>Botones de Extensiones de Síntesis</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+
+ <para
+>Esto abrirá la misma caja de dialogo que la mostrada anteriormente para los efectos, pero con una lista de sintetizadores. Una vez mas vera el conjunto particular de parámetros rotativos para el sintetizador seleccionado. Los sintetizadores también pueden tener "programs", seleccionables desde un menú --este menú solo aparecerá si ha elegido un sintetizador que los soporta. Cuando seleccione y configure una extensión para un instrumento, cualquier dato MIDI o pistas asignadas a ese instrumento deberían reproducirse a través de ese sintetizador y debería recibir datos MIDI durante el monitoreo o grabación. </para>
+ </sect2>
+
+ <sect2 id="studio-plugins-guis">
+ <title
+>Ventanas del editor nativo de extensiones</title>
+
+ <para
+>La mayoría de las extensiones pueden ser controladas completamente usando los controles rotativos en el cuadro de dialogo de extensión de Rosegarden. Sin embargo, algunas de ellas (generalmente sintetizadores) también tienen su propia ventana de edición que puede ser activada o no desde Rosegarden y que puede proveer controles mas completos u organizados.</para>
+
+ <para
+>Cuando se selecciona una extensión que tiene su propia ventana de edición, el botón en la esquina inferior izquierda del cuadro de dialogo llamada "Editor" se activara:</para>
+
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-plugineditorbutton.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase
+>Un botón de edición de la extensión</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+
+ <para
+>(para los sintetizadores, existe un botón similar en el cuadro de dialogo parámetros de instrumento.) Al cliquear este botón aparece la ventana de edición del sintetizador. Cualquier cambio que haga en esta ventana de edición también debería verse reflejado en el cuadro de dialogo de la extensión de Rosegarden, si esta visible, y por supuesto debería guardarse normalmente en su archivo de Rosegarden.</para>
+ </sect2>
+ </sect1>
+
+ <sect1 id="studio-metronome">
+ <title
+>Metrónomos</title>
+ <para
+>Rosegarden tiene dos metrónomos incorporados, uno para usar durante la grabación y otro que puede encenderse durante la reproducción normal. Trabajan enviando notas a un instrumento MIDI y ambos metrónomos usan la misma información de instrumento, tono y velocidad. </para>
+
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-metronome.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase
+>Configuración del metrónomo de &rosegarden;'</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+ <para
+>Para configurar los metrónomos, use <menuchoice
+> <guimenu lang="en"
+>Composition</guimenu
+> <guimenu lang="en"
+>Studio</guimenu
+> <guimenuitem
+>Manage Metronome</guimenuitem
+> </menuchoice
+> para abrir el cuadro de dialogo metrónomo. Aquí puede elegir un instrumento MIDI para el metrónomo y elegir la resolución del mismo (si es un tick por beat, uno por subdivisión de beat o solo uno por barra), el tono y la velocidad. Propiedades como la voz actual utilizada por el sintetizador MIDI para el tick del metrónomo dependen del instrumento elegido, así como la voz utilizada por una pista MIDI depende del instrumento asignado a esa pista. Puede configurar el instrumento asignándole una pista en la ventana principal y eligiendo el programa correcto en los parámetros del instrumento. </para>
+
+ <para
+>Los metrónomos de grabación y reproducción pueden ser activados desde la ventana Transporte, usando el botón metrónomo. Este botón controla el metrónomo de grabación cuando hay una grabación armada o en progreso y el metrónomo de reproducción en los demás casos. Por omisión el metrónomo de grabación esta activado, no así el de reproducción. </para>
+
+ <para
+>Rosegarden también tiene un "visual metronome": la ventana Transporte puede parpadear para marcar cada beat. Vea <link linkend="transport"
+>la sección Transporte</link
+> para mas detalles.</para>
+ </sect1>
+
+ <sect1 id="studio-midi-filters">
+ <title
+>Filtros MIDI</title>
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-midifilter.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase
+>El cuadro de dialogo Filtro MIDI</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+
+ <para
+>Usando este cuadro de dialogo puede decidir que eventos MIDI ignorara o aceptara Rosegarden, ya sea al reenviar eventos a través de MIDI THRU o simplemente al grabarlos. Utilice las casillas de verificación para decirle a Rosegarden que tipo de eventos MIDI no quiere reenviar o grabar. </para>
+
+ </sect1>
+
+ </chapter>
+
+
+ <chapter id="segment-instrument-parameters">
+ <title
+>Parámetros de Segmento e Instrumento</title>
+
+ <sect1 id="segment-view-segmentparameterbox">
+ <title
+>El Cuadro de Dialogo Parámetro de Segmento</title>
+
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-segmentparameterbox.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase
+>el cuadro de dialogo parámetro de segmento de &rosegarden;</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+
+ <para
+>El cuadro de dialogo Parámetro de Segmento se ubica a la izquierda de la ventana principal de Rosegarden. (Si no puede verla, intente usar <menuchoice
+> <guimenu lang="en"
+>Settings</guimenu
+> <guimenuitem
+>Show Segment and Instrument Parameters</guimenuitem
+> </menuchoice
+>.) Esto permite modificar algunos aspectos de los segmentos elegidos.</para
+><para
+>Si se selecciona un único segmento, sus parámetros serán mostrados en el cuadro de dialogo y pueden ser editados allí mismo. Si se eligen múltiples segmentos, el cuadro de dialogo solo mostrara los valores actuales que son iguales para todos los segmentos - pero todavía puede editarlos y sus cambios se aplicaran a toda la selección. <variablelist>
+ <varlistentry>
+ <term
+>Etiqueta</term>
+ <listitem>
+ <para
+>Muestra la etiqueta del segmento elegido (o segmentos, si todos tienen la misma etiqueta). Cliquee el botón "..." para editarla.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>Repetir</term>
+ <listitem>
+ <para
+>Activa o desactiva la repetición de los segmentos elegidos. Un segmento se repetirá hasta el comienzo del segmento siguiente de la misma pista, o hasta el final de la composición si no es seguido por ningún otro segmento.</para>
+
+ <para
+>Las partes repetidas de un segmento repetido se muestran en el cuadro principal en un color mas tenue que el segmento original. Puede transformarlo en copias reales editables del segmento original ya sea usando <menuchoice
+> <guimenu lang="en"
+>Segments</guimenu
+> <guimenuitem
+>Turn Repeats into Copies</guimenuitem
+> </menuchoice
+>, o simplemente haciendo doble click en los bloques individuales repetidos.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>Cuantificar</term>
+ <listitem>
+ <para
+>Muestra la configuración de cuantificación para los segmentos elegidos. Puede cambiar esto para cuantificar rápidamente los comienzos de todas las notas. Para una cuantificación mas avanzada, utilice <menuchoice
+> <guimenu lang="en"
+>Segments</guimenu
+> <guimenuitem
+>Quantize...</guimenuitem
+> </menuchoice
+>. Vea <link linkend="quantization"
+>Cuantificación</link
+> para mas detalles. </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>Transponer</term>
+ <listitem>
+ <para
+>Muestra la transposición (en semitonos) actualmente aplicada a los segmentos elegidos. Esta transposición es aplicada cuando el segmento es reproducido y no se muestra en las notas de los editores de matriz, notación o eventos. Puede utilizar esto para cambiar rápidamente el tono de una parte o toda la composición.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>Retardo</term>
+ <listitem>
+ <para
+>Muestra el retardo actualmente en efecto en los segmentos seleccionados. Puede fijar un retardo aquí para provocar que un segmento completo se reproduzca mas tarde que lo previsto. Este retardo es aplicado en la reproducción del segmento y no se muestra en las notas de los editores de matriz, notación o eventos. </para>
+ <para
+>Puede fijar un retardo ya sea en tiempo musical (eligiendo la duración de una nota en el menú desplegable), en cuyo caso el retardo exacto dependerá del tempo; o en tiempo real (eligiendo una duración en milisegundos en el menú desplegable). </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>Color</term>
+ <listitem>
+ <para
+>Muestra el color utilizado para mostrar los segmentos seleccionados. Puede elegir otro color en el menú desplegable, o elegir la opción "Add New Colour" si desea un color que no esta en el menú. </para>
+ <para
+>También puede administrar y renombrar colores usando <menuchoice
+> <guimenu lang="en"
+>Composition</guimenu
+> <guimenuitem
+>Edit Document Properties...</guimenuitem
+> </menuchoice
+> (luego elija la página Color en el cuadro de dialogo propiedades de documento). La paleta de colores modificada se guardara con la composición en el archivo de Rosegarden. <screenshot
+> <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-colours.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase
+>Administrador de color de &rosegarden;'</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+ </listitem>
+ </varlistentry>
+
+ </variablelist>
+ </para>
+ </sect1>
+
+ <sect1 id="segment-view-instrumentparameterbox">
+ <title
+>El Cuadro de Dialogo Parámetro de Instrumento</title>
+ <para
+>El cuadro de dialogo Parámetro de Instrumento se encuentra en la esquina inferior izquierda de la ventana principal de Rosegarden, debajo de <link linkend="segment-view-segmentparameterbox"
+>Cuadro de dialogo Parámetro de Segmento</link
+>. (Si no puede verla, pruebe usando <menuchoice
+> <guimenu lang="en"
+>Settings</guimenu
+> <guimenuitem
+>Show Segment and Instrument Parameters</guimenuitem
+> </menuchoice
+>.)</para>
+
+ <para
+>Le muestra que instrumento esta asignado a la pista actual y contiene todos los controles editables para ese instrumento. Recuerde que debido a que se puede asignar cualquier cantidad de pistas al mismo instrumento, la configuración de este cuadro de dialogo puede afectar a mas de una pista a la vez.</para>
+
+ <para
+>La disposición y los contenidos del cuadro de dialogo parámetro de instrumento depende del tipo de instrumento: MIDI, audio o sintetizador. </para>
+
+ <sect2 id="segment-view-instrumentparameterbox-midi">
+ <title
+>Parámetros de Instrumento MIDI</title>
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-ipb-midi.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase
+>cuadro de dialogo parámetro de instrumento de &rosegarden; para un instrumento MIDI</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+ <para
+>Cuando selecciona una pista asignada a un instrumento MIDI, el cuadro de dialogo parámetro de instrumento muestra los parámetros MIDI </para>
+ <para
+>En la parte superior, este cuadro de dialogo muestra el nombre del instrumento y la conexión que esta utilizando el dispositivo. </para>
+ <para
+>Debajo, puede ver y editar el numero de canal MIDI y la configuración <link linkend="studio-bank-editor"
+>bank and program</link
+> que deben ser enviadas al instrumento al comienzo de la reproducción (incluyendo un "percussion" toggle que controla cuando se deben ofrecer solo programas de percusión en estas configuraciones).</para>
+
+ <para
+>Finalmente este cuadro de dialogo le muestra los controladores disponibles para este dispositivo (aquellos para un dispositivo General MIDI son mostrados arriba). Cualquier ajuste que haga aquí sera enviado al canal del instrumento al comienzo de la reproducción.</para>
+ </sect2>
+
+ <sect2 id="segment-view-instrumentparameterbox-audio">
+ <title
+>Parámetros de Instrumento de Audio</title>
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-ipb-audio.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase
+>cuadro de dialogo parámetro de instrumento de &rosegarden;' para un instrumento de audio</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+ <para
+>Cuando selecciona una pista de audio, el cuadro de dialogo parámetro de instrumento muestra los parámetros de audio. </para>
+ <para
+>El cuadro de dialogo tiene dos atenuadores, uno con contorno azul para el nivel de reproducción y otro con contorno rojo para el nivel de grabación de este instrumento. Entre ellos hay un medidor de nivel de reproducción. </para>
+ <para
+>Los dos menús en la parte superior se usan para seleccionar el ruteo de entrada y salida de audio para este instrumento. Debajo de ellos puede seleccionar si el instrumento es mono o estéreo y el ajuste panorámico de la posición en el campo estéreo. (Los instrumentos de audio son siempre estéreo, debido a que el ajuste panorámico siempre se aplica. Pero si cambia el instrumento a mono, reducirá cualquier salida de datos o efectos a mono antes de aplicar la panorámica.) </para>
+ <para
+>La columna de cinco botones abajo a la izquierda son las ranuras de efectos. Haga click en ellas para seleccionar y activar efectos para este instrumento y para controlarlos usando el editor de extensiones. Estos son efectos de inserción, aplicados en orden de abajo hacia arriba después del atenuador y la panorámica. </para>
+ </sect2>
+
+ <sect2 id="segment-view-instrumentparameterbox-synth">
+ <title
+>Parámetros de Sintetizador</title>
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-ipb-synth.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase
+>el cuadro de dialogo parámetro de instrumento de &rosegarden; para un sintetizador</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+ <para
+>Cuando selecciona una pista asignada a un sintetizador, el cuadro de dialogo parámetro de instrumento muestra sus parámetros. Notara que si bien una pista de sintetizador usa segmentos con datos MIDI, en términos de control y ruteo se comporta como una pista de audio. </para>
+ <para
+>El control mas importante aquí es el botón arriba a la izquierda (el que dice Xsynth en la figura de arriba) que muestra el nombre del sintetizador en uso por este instrumento. Haga click allí para elegir un sintetizador en particular y controlarlo en el editor de extensiones estándar de Rosegarden. Una vez que eligió la extensión, debería poder cliquear el botón Editor para abrir un editor para esa extensión (si tiene uno). </para>
+ <para
+>Los controles restantes son iguales a los de los instrumentos de audio: el atenuador, el nivel de reproducción, el ruteo de salida, los ajustes mono/estereo y panorámicos así como las ranuras de efectos son exactamente iguales.</para>
+ </sect2>
+
+ </sect1>
+ </chapter>
+
+ <chapter id="quantization">
+ <title
+>Cuantificación</title>
+ <para
+>"Quantization" es el proceso de reposicionar notas y otros eventos de manera que comiencen o terminen en divisiones rítmicas exactas. Se utiliza tradicionalmente para transformar una ejecución aproximada en una precisa pero de sonido mecánico - ya sea porque se busca precisión o para hacer las notas mas claras en la notación. </para>
+
+ <para
+>Para cuantificación general, utilice <menuchoice
+> <guimenu lang="en"
+>Segments</guimenu
+> <guimenuitem
+>Quantize</guimenuitem
+> </menuchoice
+> en la ventana principal o <menuchoice
+> <guimenu lang="en"
+>Adjust</guimenu
+> <guimenuitem
+>Quantize</guimenuitem
+> </menuchoice
+> en los editores de matriz o notación. Esto le muestra un cuadro de dialogo en donde puede elegir los parámetros precisos de cuantificación que necesita, que luego se aplican a todos los segmentos o notas. (También puede abrir rápidamente este cuadro de dialogo presionando la tecla "=".) </para>
+
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-gridquantizer.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase
+>Cuadro de diálogo de cuantificación de &rosegarden;</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+
+ <para
+>El cuadro de dialogo de cuantificación ofrece una selección de cuantificadores, cada uno con su propio conjunto de parámetros. Los cuantificadores disponibles son: </para>
+ <variablelist>
+
+ <varlistentry>
+ <term
+>Cuantizador de Grilla</term>
+ <listitem>
+ <para
+>El cuantizador de grilla mueve los tiempos de inicio de las notas haciendo que èstos inicien en el punto más cercano de la grilla (definido por varios parámetros del cuantizador). Aquellas notas que inicialmente varían en el inicio, serán alineadas por el cuantizador, logrando un resultado más preciso y mecánico </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>Cuantizador de ligados</term>
+ <listitem>
+ <para
+>EL cuantizador de ligados funciona como una simple cuantización por grilla, pero además ajusta la duración de las notas y remueve los silencios o cortes entre ellas extendiendo cada nota hasta el comienzo de la siguiente. También puede obtener este efecto de ligado sin usar la cuantización de grilla usando la función <menuchoice
+> <guimenu lang="en"
+>Adjust</guimenu
+> <guimenuitem
+>Quantize</guimenuitem
+> <guimenuitem
+>Legato</guimenuitem
+> </menuchoice
+> en el editor de matriz </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>Cuantizador de notación heurística</term>
+ <listitem>
+ <para
+>El cuantizador de notación heurística intenta ajustar los tiempos de inicio y duración de las notas para producir una notación leíble. Ver <link linkend="nv-quantization"
+> Notación desde datos de ejecución </link
+> para una descripción de este cuantizador y sus usos.</para>
+ </listitem>
+ </varlistentry>
+
+ </variablelist>
+
+ <para
+>El cuanizador de grilla tiene los siguientes parámetros:</para>
+ <variablelist>
+
+ <varlistentry>
+ <term
+>Unidad base de grilla</term>
+ <listitem>
+ <para
+>Esta es la medida de la grilla usada para la cuantización. </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>Ritmo</term>
+ <listitem>
+ <para
+>Este es un porcentaje de la figura la cual ajusta el grado de cuantización de los tiempos "late".</para>
+ <para
+>Si se setea en Ninguno (por defecto), la cuantización será siempre espaciada en la grilla de acuerdo a la unidad base de grilla</para>
+ <para
+>Si se setea al 100%, cada segunda línea en la grilla será ubicada a dos tercios de la distancia entre la previa y las siguientes, en vez de sólo la mitad. Esto dará por resultado que las notas serán cuantizadas a la primera y tercera figura de un tresillo </para>
+ <para
+>Otros seteos producirán variaciones proporcionales de grado de ritmo. También es posible setear este parámetro a figuras negativas (para que algunos tiempos comiencen antes) o para figuras mayores que 100%.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>Suma iterativa</term>
+ <listitem>
+ <para
+>El comportamiento por defecto de el cuantizador de grilla es mover cada nota exactamente sobre la línea de la grilla más cercana. Pero si se configura la suma iterativa a algo menos que el 100% (el "Cuantización completa" por defecto), cad nota será corrida el porcentage propicio de la distancia a su línea más cercana, resultando un cercano-pero-no-del todo efecto de cuantización</para>
+ <para
+>Este cuantizador debe ser aplicado repetidamente para ir probando gradualmente incrementos en el grado de cuantización, de allí en nombre "iterativo". Usando <menuchoice
+> <guimenu lang="en"
+>Adjust</guimenu
+> <guimenuitem
+>Quantize</guimenuitem
+> <guimenuitem
+>Repeat Last Quantize</guimenuitem
+> </menuchoice
+> en el editor de Matriz se logra el mismo resultado </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>Duración de cuantización además de tiempos de inicio</term>
+ <listitem>
+ <para
+>Si esta opción está habilitada, el cuantizador cuantizará las notas' tiempo de finalización a la misma grilla que los tiempos de inicio </para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ <para
+>El diálogo de cuantización tiene además una sección Avanzada conteniendo opciones adicionales para <link linkend="nv-quantization"
+>cuantización de notas</link
+>. </para>
+
+ <para
+>Otra simple manera de aplicar una cuantización de grilla es hacerlo en la ventana principal, usando el <guimenuitem
+>Quantize</guimenuitem
+> menú en la <link linkend="segment-view-segmentparameterbox"
+>Caja de Parámetros de Secciones</link
+>. Si se seleccionan algunas secciones y se cambia el valor mostrado en el menú, la selección entera será automáticamente cualtizada a la resolución mostrada en el menú </para>
+
+ <para
+>Finalmente, Hay también un <link linkend="matrix-grid-quantize"
+>control de cuantización</link
+> en la vista de matriz.</para>
+
+ </chapter>
+
+ <chapter id="matrix-view">
+ <title
+>El editor de matriz</title>
+ <para
+>El editor de matriz de &rosegarden; permite ver y editar música de una forma simple y lógica: cada nota es representada por un bloque en una grilla, a una altura correspondiente con el tono. </para>
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-matrixview.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase
+>El editor de matriz de &rosegarden;</phrase>
+ </textobject>
+ </mediaobject>
+</screenshot
+> cada ventana del editor de matriz muestra un sólo segmento o sección. Para editar alguna de ellas, simplemente se hace un clic derecho en el cuadro principal y se selecciona el editor de matriz desde el menú. De otra manera, se puede configurar Rosegarden para que el editor de matriz se abra por defecto al hacer doble clic sobre alguna sección. </para>
+
+ <sect1 id="matrix-grid-quantize">
+ <title
+>Los controles de Grilla y Cuantización</title>
+ <para
+>La vista de matriz contiene los menúes de Grilla y Cuantización en su barra de herramientas principal. </para>
+ <para
+>El menú de Grilla controla el tamaño de la grilla visible en segundo plano de la vista de matriz, así como también la resolución del tiempo usada cuando se ingresan y se mueven notas. Luego que se setea a un tiempo particular, la inserción común de notas y las operaciones de copiado y pegado se acomodarán automáticamente a esos espacios de tiempo. Se puede obviar este efecto temporariamente manteniendo apretada la tecla Shift durante la edición, o se puede desabilitar poniendo el menú de Grilla en Ninguno. </para>
+ <para
+>El menú de Cuantización trabaja de manera diferente. En lugar de controlar el comportamiento de otras herramientas de edición, interpreta una acción. Cuando se cambia el valor en este menú, las notas seleccionadas -- o el segmento entero si niguna es seleccionada -- inmediatamente será cuantizada usando el cuantizador de grilla de la resolución elegida. </para>
+ <para
+>El menú de Cuantización también muestra continuamente a qué resolución está cuantizado el segmento actual. Por ejemplo, si se seleeciona un grupo de notas que empiezan en negras consecutivas, el menú de Cuantización se actualizará y mostrará 1/4, por ser la resolución más común resultante de la actual selección. </para>
+ </sect1>
+
+ <sect1 id="matrix-insertion">
+ <title
+>Insertando notas</title>
+ <para
+>La manera más simple de insertar una nota en la vista de matriz es usando el mouse. Para hacerlo, primero se selecciona la herramienta lápiz en la barra de herramientas, y luego se cliquea y arrastra en el editor de matriz. La nota será ingresada al tiempo y la altura correspondiente a lo que se ha cliqueado, y la duración de la nota dependerá de la distancia que se arrastre antes de soltar el botón del mouse.</para>
+
+ <para
+>Por defecto, el tiempo y la duración están relacionadas con una unidad particular de la unidad de grilla, de acuerdo a la configuración de Grilla en menú Ver o la barra de herramientas. Se puede prevenir este efecto manteniendo apretada la tecla Shift mientras se cliquea y arrastra </para>
+
+ <sect2 id="matrix-insertion-keyboard">
+ <title
+>Tipeando notas con el teclado de la PC</title>
+
+ <sect3>
+ <title
+>Duración</title>
+
+ <para
+>La duración de las notas ingresadas con el teclado están controladas por el seteo de Grilla en el menú Ver o la barra de herramientas. Se puede editar usando las teclas numéricas:</para>
+
+ <itemizedlist>
+ <listitem
+><para
+><keycap
+>5</keycap
+> &ndash; Compás entero</para
+></listitem>
+ <listitem
+><para
+><keycap
+>1</keycap
+> &ndash; Un tiempo</para
+></listitem>
+ <listitem
+><para
+><keycap
+>2</keycap
+> &ndash; 1/2 (Blanca)</para
+></listitem>
+ <listitem
+><para
+><keycap
+>4</keycap
+> &ndash; 1/4 (Negra)</para
+></listitem>
+ <listitem
+><para
+><keycap
+>8</keycap
+> &ndash; 1/8 (Corchea)</para
+></listitem>
+ <listitem
+><para
+><keycap
+>6</keycap
+> &ndash; 1/16 (Semicorchea)</para
+></listitem>
+ <listitem
+><para
+><keycap
+>3</keycap
+> &ndash; 1/32 (Fusa)</para
+></listitem>
+ <listitem
+><para
+><keycap
+>0</keycap
+> &ndash; 1/64 (Semifusa)</para
+></listitem>
+ </itemizedlist>
+
+ </sect3>
+
+ <sect3>
+ <title
+>Tono / Altura</title>
+
+ <para
+>Una vez que se ha seleccionado la duración en el menú Grilla, se procede a insertar la nota en la posición actual <link linkend="nv-rulers"
+>del cursor</link
+> presionando una de las teclas de tono </para>
+
+ <itemizedlist>
+ <listitem
+><para
+><keycap
+>A</keycap
+> &ndash; Do (la tónica de la escala en la actual tonalidad) </para
+></listitem>
+ <listitem
+><para
+><keycap
+>S</keycap
+> &ndash; Re</para
+></listitem>
+ <listitem
+><para
+><keycap
+>D</keycap
+> &ndash; Mi</para
+></listitem>
+ <listitem
+><para
+><keycap
+>F</keycap
+> &ndash; Fa</para
+></listitem>
+ <listitem
+><para
+><keycap
+>J</keycap
+> &ndash; Sol</para
+></listitem>
+ <listitem
+><para
+><keycap
+>K</keycap
+> &ndash; La</para
+></listitem>
+ <listitem
+><para
+><keycap
+>L</keycap
+> &ndash; Si</para
+></listitem>
+ </itemizedlist>
+
+ <para
+>manteniendo apretada la tecla <keycap
+>Shift</keycap
+> mientras se pulsa una tecla agregaremos un sostenido (#) a esa nota (salvo Mi y si que no lo tienen) y manteniendo apretada <keycap
+>Shift</keycap
+> y <keycap
+>Ctrl</keycap
+> juntas la alteraremos con un bemol (b) (excepto para Fa y Do).</para>
+
+ <para
+>Para ingresar notas una octava más alta, se deben usar las teclas de la fila superior: <keycap
+>Q</keycap
+>, <keycap
+>W</keycap
+>, <keycap
+>E</keycap
+>, <keycap
+>R</keycap
+>, <keycap
+>U</keycap
+>, <keycap
+>I</keycap
+>, y <keycap
+>O</keycap
+>. Asimismo, para notas una octava más baja, usar <keycap
+>Z</keycap
+>, <keycap
+>X</keycap
+>, <keycap
+>C</keycap
+>, <keycap
+>V</keycap
+>, <keycap
+>B</keycap
+>, <keycap
+>N</keycap
+> y <keycap
+>M</keycap
+>.</para>
+
+ </sect3>
+
+ <sect3>
+ <title
+>Otras observaciones</title>
+
+ <para
+>Todos los comandos de inserción están también disponibles en un submenú del menú Herramientas. Es improbable que para ingresar una nota se deba navegar por todo un menú, pero el menú muestra los atajos de teclado y provee una útil referencia en caso de que las combinaciones de teclas sean olvidadas.</para>
+
+ <para
+>Los atajos de teclado están designados para ser usados con una disposición QWERTY. No hay aún una forma de mapear las teclas para otros diseños de teclado, lo que se puede hacer es reasignar tecla por tecla usando <menuchoice
+> <guimenu lang="en"
+>Settings</guimenu
+> <guimenuitem
+>Configurar atajos......</guimenuitem
+> </menuchoice
+>.</para>
+
+ </sect3>
+
+ </sect2>
+
+ <sect2 id="matrix-insertion-midi">
+ <title
+>Ingresando notas a través de un teclado MIDI</title>
+
+ <para
+>Se pueden ingresar notas una por vez en el editor de matriz usando un teclado MIDI o cualquier dispositivo de control MIDI. El editor matricial usa las notas que se ejecutan en el teclado, pero la duración de las mismas se seleccionan en el editor de Grilla. Esto es conocido como "grabación por pasos". </para>
+
+ <para
+>Para ingresar las notas a través de un teclado MIDI, primero hay que confirmar que el teclado está configurado como el dispositivo MIDI predeterminado. Verificar que esté configurado correctamente el seteo de la Grilla en el menú Ver o la barra de herramientas, como los controles de duración de las notas. Entonces se presiona el botón de grabación por pasos en la barra de herramientas del editor de matriz, o se selecciona Grabación por pasos desde el menú Herramientas. A partir de allí, todas las notas presionadas en el teclado MIDI serán insertadas en la posición actual en la ventana, hasta que la grabación por pasos se termine, o se cambie de ventana, o se cierre la misma. </para>
+
+ <para
+>Es posible cambiar la configuración de la Grilla mientras se está grabando, para poder ingresar notas de diferente duración. </para>
+ </sect2>
+ </sect1>
+
+ <sect1 id="matrix-selection">
+ <title
+>Seleccionando notas</title
+> <para
+>Para seleccionar notas en el editor de matriz, cambiar a la herramienta de Selección (flecha) y dibujar un área rectangular abarcando las notas requeridas. Los elementos seleccionados se resaltarán en azul. Si se cliquea en un solo evento, sólo ese evento será seleccionado. </para
+><para
+>Si se mantiene apretada la tecla <keycap
+>Shift</keycap
+> mientras se arrastra o se cliquea, la nueva selección será adicionada a una existente en lugar de reemplazarla. </para>
+
+ <para
+>Para deseleccionar un área, cliquear en un espacio vacío del editor matricial, o pulsar la tecla Escape.</para>
+
+ <para
+>También es posible seleccionar todas las notas de una determinada altura, presionando Shift + clic y arrastrando para seleccionar una rango de notas. Esta selección es agregada a una preexistente, por lo que si se necesita una selección limpia, hay que deseleccionar la previa antes. </para>
+ </sect1>
+
+ <sect1 id="matrix-editing">
+ <title
+>Moviendo y copiando notas</title>
+ <para
+>Se puede mover notas en altura y posición en el editor de matriz, cliqueando y arrastrando con la herramienta Mover, o seleccionando primero con la herramienta de selección y luego arrastrando. </para>
+ <para
+>Para copiar notas, seleccionarlas primero y luego usar las funciones habituales de copiar y pegar. Luego de pegadas, las notas pueden ser ubicadas allí donde se las necesitare. </para>
+ </sect1>
+
+ </chapter>
+
+ <chapter id="notation-view">
+ <title
+>El Editor de Partituras</title>
+
+ <!-- Introduction, purpose -->
+
+ <sect1 id="nv-introduction">
+ <title
+>introducción</title>
+
+ <para
+>El editor de partituras de Rosegarden permite ver y editar en la forma tradicional de partituras </para
+><para>
+
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-notationview.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase
+>Editor de partituras Rosegarden</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+ <para
+>Rosegarden pretende presentar partituras con la mejor distribución posible compatible con la función de secuenciador. Esto significa que soporta acordes, superposiciones y grupos anidados, tresillos y arbtrarios, notas de adorno, dinámicas, acentos y demás, no provee mucho control fino sobre la disposición (especialmente en música con contrapuntos) como un programa específico de edición de partituras. Rosegarden no pretende ser un editor de partituras de calidad, pero permite exportar en formato lilypond, lo cual es una buena base para la publicación. </para>
+ </sect1>
+
+ <!-- Single and multiple staffs, and "current staff" -->
+
+ <sect1 id="nv-staffs">
+ <title
+>Partituras simples y múltiples</title>
+
+ <para
+>Hay tres maneras de abrir el editor de partituras desde la ventana principal de Rosegarden. (Todas ellas requieren que haya segmentos ya insertados en la ventana principal, por lo que si se está comenzando una nueva composición, deberían crearse segmentos antes de pensar en esitarlos. <variablelist>
+
+ <varlistentry>
+ <term
+>Doble clic en los segmentos</term>
+ <listitem>
+
+ <para
+>La manera más obvia es hacer doble clic en un segmento en el tablero principal. Esta acción abre el segmento en el editor que se haya configurado por defecto (partituras, matriz o lista de eventos), y por omisión está configurado el editor de partituras. Así es que si se hace doble clic en un determinado segmento abrirá éste como un pentagrama solitario en el editor de partituras.</para>
+
+ <para
+>Es posible además abrir el editor con varias líneas de pentagrama, manteniendo la tecla Shift, seleccionar los segmentos que se desean editar (con un solo clic del mouse) pero doble clic en el último. Todos los segmentos serán abiertos juntos en una ventana del editor</para>
+
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>La función de Abrir en el Editor por Defecto (La tecla Enter)</term>
+ <listitem>
+
+ <para
+>la tecla Enter es un atajo para la función Abrir en el Editor por Defecto, que hace lo mismo que un cliqueo doble: abre los segmentos actualmente seleccionados en el editor de partituras, o en el que se haya preseleccionado como editor por omisión. </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>Las funciones del menú Abrir en el Editor de Partituras</term>
+ <listitem>
+
+ <para
+>Alternativamente, se puede usar la función de Abrir en el Editor de Partituras en los menúes de los Segmentos o con el menú contextual (botón derecho del mouse) sobre un segmento en el tablero principal. Se seleccionan primero los segmentos a editar (cliqueando + Shift como se ha dicho anteriormente, o usando la función Seleccionar Todo) y lo seleccionado se abre en el Editor de Partituras.</para>
+ </listitem>
+
+ </varlistentry>
+ </variablelist>
+
+ </para>
+
+ <para
+>Si se tiene más de una línea de pentagrama (por ejemplo en un segmento) visible en el editor de partiturasm sólo una de ellas podrá ser la editable a la vez. La que lo sea será distinguible por tener el cursor de ingreso en ella (ver <link linkend="nv-rulers"
+>Reglas y Cursores</link
+>) y ésta será el pentagrama en el cual tomarán lugar los eventos de edición. Por omisión, la línea superior es la actualmente editable, pero es seleccionable presionando Ctrl + cliqueando en la línea deseada o usando las funciones Mover el Cursor al Pentagrama Superior y Mover el Cursor al Pentagrama Inferior del menú de funciones. </para>
+
+ </sect1>
+
+ <!-- Linear and page layouts -->
+
+ <sect1 id="nv-layout">
+ <title
+>Distribuciones lineales y de página</title>
+
+ <para
+>La manera usual de presentación del editor de partituras es conocida como distribución Lineal: una línea de pentagrama sobre la otra, en las cuales, cada pentagrama es una línea horizontal. Algunas funciones del editor (como la <link linkend="nv-rulers"
+>Reglas</link
+>)solamente están disponibles en la distribución Lineal. </para>
+
+ <para
+>De todos modos, se puede mostrar las partituras en dos diferentes distribuciones: Página Continua y Páginas Múltiples.</para>
+
+ <para
+>En la vista de Página Continua, la música es ubicada en una infinita página del ancho de la ventana. Cada pentagrama se corta al final de una línea, empezando una nueva línea debajo de los restantes pentagramas.</para>
+
+ <para
+>En la distribución de Página Múltiple, la música es dividida en páginas reales, tantas como serán impresas. El tamaño de cada página es calculado aproximadamente al valor de la música que completará cada línea cuando sea impresa (de acuerdo al tamaño de puntos especificado en la resolución de la impresora en el cuadro de configuración). La versión impresa será no todo lo igual que se quisiera, pero bastante aproximada si se usa papel tamaño A4.</para>
+
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-notationview-multipage.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase
+>El editor de partituras Rosegarden en la vista de Página Múltiple</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para
+><para
+>La mayoría, pero no todas las funciones, funcionan igual de bien en las vistas de página tanto como en la lineal. </para>
+
+ <para
+>Para cambiar entre estas vistas, se debe usar las funciones del menú, Vista Lineal, Vista de Página Continua y Vista de Múltiples Páginas </para>
+ </sect1>
+
+ <!-- Rulers and Cursors -->
+
+ <sect1 id="nv-rulers">
+ <title
+>Reglas y cursores</title>
+
+ <para
+>El editor de partituras de Rosegarden incluye dos reglas y dos cursores. Las reglas están graduadas y ubicadas en las tiras horizontales, arriba y debajo del tablero principal, y los cursores son las líneas verticales de color que se muestran inicialmente al principio del pentagrama superior en el editor. </para>
+
+ <para
+>El cursor púrpura es el cursor de inserción. Muestra el punto en el cual tomarán lugar las operaciones tales como copiar y pegar. Se puede ubicar el cursor de inserción cliqueando o arrastrando sobre la regla superior, o cliqueando con la herramienta de selección en una parte vacía del pentagrama (evitando los eventos), o cliqueando en cualquier lugar mientas se mantiene apretada la tecla <keycap
+>Ctrl</keycap
+>. </para>
+
+ <para
+>También es posible usar las flechas derecha e izquierda para mover el cursor de ingreso un evento a la vez. Si se mantiene apretada la tecla <keycap
+>Ctrl</keycap
+> mientras se presionan las teclas de flechas, el cursor se moverá un compás a la vez; si se presiona Shift el cursor <link linkend="nv-tools-selections"
+>seleccionará los eventos</link
+> mientras pasa sobre ellos. </para>
+
+ <para
+>El cursor azul es el puntero de reproducción. Tal cual los homónimos en la ventana principal y en las vistas de matriz, muestra la posición actual de la reproducción o grabación en curso. Puede ser reposicionado usando la regla inferior. </para>
+
+ <para
+>Nótese que las reglas son mostradas únicamente en el modo <link linkend="nv-layout"
+>Distribución Lineal</link
+>. </para>
+
+ </sect1>
+
+ <!-- Display conventions (annotated picture with some selected notes,
+ some quantized notes, a bar of incorrect length etc) -->
+
+ <!-- Tools and Selections -->
+
+ <sect1 id="nv-tools-selections">
+ <title
+>Herramientas y selecciones</title>
+ <para
+>La mayoría de las funciones y herramientas de edición del menú del Editor de Partituras de Rosegarden se ubican en tres categorías: <quote
+>herramientas</quote
+>, <quote
+>funciones que afectan selecciones</quote
+>, y <quote
+>operaciones de arrastre.</quote
+>. </para>
+
+ <variablelist>
+ <varlistentry>
+ <term
+>Herramientas</term>
+ <listitem>
+ <para
+>Las herramientas básicas son la de selección, la de borrado y aquellas para insertar notas y silencios, a las cuales se acceden desde los botones de la barra de herramientas. Eligiendo una herramienta cambian los comportamientos por defecto de los botones del mouse en la ventana principal, hasta que otra herramienta es escogida. Por ejemplo, eligiendo la herrramienta de seleccionar, es posible hacer selecciones de eventos y usar las funciones basadas en ellas (abajo); eligiendo una herramienta de inserción (como la de las notas) cambia el comportamiento de la <acronym
+>interfase gráfica </acronym
+> insertando notas cliqueando en el tablero, eligiendo la herramienta de borrado, permite remover eventos cliqueando sobre ellos. </para>
+ <para
+>También se puede cambiar la herramienta usando el menú de Herramientas. </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>Funciones que operan en selecciones</term>
+ <listitem>
+ <para
+>La mayor parte de las funciones que restan en el menú, requieren que previamente se realice una selección antes de aplicarlas. Alguna de ellas, (como las funciones <guimenuitem
+>Cortar</guimenuitem
+> o la <guimenuitem
+>Estilo de Nota</guimenuitem
+> ) operarán en todos los eventos seleccionados; y otras (como las funciones <guimenuitem
+>Notas de gracia</guimenuitem
+> o <guimenuitem
+>Direcciones de Plica </guimenuitem
+> ) no funcionarán hasta que la selección incluya algunas notas. </para>
+ <para
+>Para seleccionar eventos en la ventana principal, cambiar a la herramienta de Selección (flecha) y entonces dibujar un área rectangular conteniendo los eventos que se quieran seleccionar. Los eventos seleccionados se resaltarán en color azul. Si se hace clic en un sólo evento, sólo éste será seleccionado. <footnote
+> <para
+>De todas maneras, es posible hacer un doble clic en un evento en particular para abrir una ventana de diálogo para ese evento, pero nada que hacer con lo seleccionado.</para
+> </footnote
+> </para
+><para
+>Si se mantiene presionada la tecla <keycap
+>Shift</keycap
+> mientras se arrastra el rectángulo, se agregará lo seleecionado a una selección previa, en lugar de reemplazar a aquella. </para>
+ <para
+>Para seleccionar un compás entero, hacer doble clic con la herramienta de Seleccionar en un espacio libre en ese compás, para seleccionar una línea de pentagrama entera, hacer tres clics. El menú Edición contiene funciones para seleccionar areas extensas según la ubicación del cursor de inserción, apretando la tecla Shift y presionado las flechas derecha o izquierda. </para>
+ <para
+>No es posible seleccionar eventos en más de un pentagrama a la vez. </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>Operaciones de arrastre</term>
+ <listitem>
+ <para
+>Es posible realizar una cierta clase de edición, simplemente arrastrando elementos. Cambiar a la herramienta (flecha) de selección, y desde allí se puede cambiar la altura de las notas simplemente cliqueando sobre la cabeza de la nota y la ubicación de ellas arrastrando a izquierda y derecha. (No se pueden arrastrar silencios o tiempos, pero sí todo lo demás. Si se han seleccionado varios eventos, todos se mueven a la vez.) </para>
+ <para
+>El arrastre es usualmente una manera no tan exacta de editar eventos, tal como el uso del menú o las funciones del menú de Herramientas, pero es la más simple. </para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </sect1>
+
+ <!-- Insertion: notes, auto-ties, accidentals -->
+
+ <sect1 id="nv-insertion">
+ <title
+>Insertando notas y silencios</title>
+
+ <para
+>Para insertar una nota, seleccionar una de las herramientas de nota cliqueando en una duración particular en la barra de herramientas, y luego cliquear en el pentagrama en el punto en el que se quiera insertar.</para>
+
+ <para
+>También se pueden seleccionar las alteraciones en el menú de herramientas, para insertar bemoles o sostenidos. Si no se seleccionan alteraciones, la nota seguirá la armadura de clave. Alternativamente, se puede seleccionar el ícono "Continuar la alteración previa" (se ve como una nota con una flecha señalando hacia atrás donde la alteración aparecerá) para hacer que la nota siga la última alteración que se haya producido en la partitura.</para>
+
+ <para
+>Si se agrega una nota al mismo tiempo que una nota existente de diferente duración, el editor generalmente asume que se intenta crear una acorde y entonces se corre la nota para armar la representación del mismo con puntillo. Si realmente se quiere hacer una corde con dos duraciones diferentes, se debe seleccionar las notas con puntillos y usar la función de Juntar las Notas de Igual Altura para juntarlas. De otra manera se puede editar el comportamiento por defecto de esta función desde el diálogo de configuración de Rosegarden.</para>
+
+ <para
+>Si se agrega una nota exactamente sobre una nota existente de diferente duración (por ejemplo con la misma altura), la duración de la nota existente será cambiada a la nueva. </para>
+
+ <para
+>Si se agrega un silencio al mismo tiempo que una nota existente, la nota será silenciada por la duración del silencio, acortando o suprimiendo al mismo.</para>
+
+ <sect2 id="nv-insertion-keyboard">
+ <title
+>Tipeando notas y silencios con el teclado de la PC</title>
+
+ <sect3>
+ <title
+>Duración</title>
+
+ <para
+>Primero, confirmar que la herramienta de notación está seleccionada para indicar la duración de las notas o silencios que se deseen insertar. Es posible insertar varios tipos de notas usando las teclas numéricas:</para>
+
+ <itemizedlist>
+ <listitem
+><para
+><keycap
+>5</keycap
+> &ndash; Breve</para
+></listitem>
+ <listitem
+><para
+><keycap
+>1</keycap
+> &ndash; Nota entera (semibreve)</para
+></listitem>
+ <listitem
+><para
+><keycap
+>2</keycap
+> &ndash; 1/2 (Blanca)</para
+></listitem>
+ <listitem
+><para
+><keycap
+>4</keycap
+> &ndash; 1/4 (Negra)</para
+></listitem>
+ <listitem
+><para
+><keycap
+>8</keycap
+> &ndash; 1/8 (Corchea)</para
+></listitem>
+ <listitem
+><para
+><keycap
+>6</keycap
+> &ndash; 1/16 (Semicorchea)</para
+></listitem>
+ <listitem
+><para
+><keycap
+>3</keycap
+> &ndash; 1/32 (Fusa)</para
+></listitem>
+ <listitem
+><para
+><keycap
+>0</keycap
+> &ndash; 1/64 (Semifusa)</para
+></listitem>
+ </itemizedlist>
+
+ <para
+>Se puede cambiar a nota atresillada presionando la tecla <keycap
+>G</keycap
+>. Presionando la misma tecla una vez más se vuelve a la duración normal. La barra de status en la parte inferior de la ventana notificará cuando la duración atresillada está activa.</para>
+ </sect3>
+
+ <sect3>
+ <title
+>Tono / Altura</title>
+
+ <para
+>Una vez que la herramienta de notación está seleccionada, se puede insertar una nota en la posición actual del <link linkend="nv-rulers"
+>cursor de inserción</link
+> presionando una de las teclas de las teclas de altura:</para>
+
+ <itemizedlist>
+ <listitem
+><para
+><keycap
+>A</keycap
+> &ndash; Do (la tónica de la escala en la actual tonalidad)</para
+></listitem>
+ <listitem
+><para
+><keycap
+>S</keycap
+> &ndash; Re</para
+></listitem>
+ <listitem
+><para
+><keycap
+>D</keycap
+> &ndash; Mi</para
+></listitem>
+ <listitem
+><para
+><keycap
+>F</keycap
+> &ndash; Fa</para
+></listitem>
+ <listitem
+><para
+><keycap
+>J</keycap
+> &ndash; Sol</para
+></listitem>
+ <listitem
+><para
+><keycap
+>K</keycap
+> &ndash; La</para
+></listitem>
+ <listitem
+><para
+><keycap
+>L</keycap
+> &ndash; Si</para
+></listitem>
+ </itemizedlist>
+
+ <para
+>Presione la tecla "." para cambiar entre duraciones con puntillos o sin ellos.</para>
+
+ <para
+>manteniendo apretada la tecla <keycap
+>Shift</keycap
+> mientras se pulsa una tecla agregaremos un sostenido (#) a esa nota (salvo Mi y si que no lo tienen) y manteniendo apretada <keycap
+>Shift</keycap
+> y <keycap
+>Ctrl</keycap
+> juntas la alteraremos con un bemol (b) (excepto para Fa y Do).</para>
+
+ <para
+>Para ingresar notas una octava más alta, se deben usar las teclas de la fila superior: <keycap
+>Q</keycap
+>, <keycap
+>W</keycap
+>, <keycap
+>E</keycap
+>, <keycap
+>R</keycap
+>, <keycap
+>U</keycap
+>, <keycap
+>I</keycap
+>, y <keycap
+>O</keycap
+>. Asimismo, para notas una octava más baja, usar <keycap
+>Z</keycap
+>, <keycap
+>X</keycap
+>, <keycap
+>C</keycap
+>, <keycap
+>V</keycap
+>, <keycap
+>B</keycap
+>, <keycap
+>N</keycap
+> y <keycap
+>M</keycap
+>.</para>
+
+ </sect3>
+
+ <sect3>
+ <title
+>Silencios</title>
+
+ <para
+>Para insertar un silencio en vez de una nota, presionar <keycap
+>P</keycap
+>. Alternativamente, se puede usar la tecla <keycap
+>T</keycap
+> y la <keycap
+>Y</keycap
+> para cambiar la herrramienta actual a la de silencio y volver a la de nota nuevamente.</para>
+
+ </sect3>
+
+ <sect3>
+ <title
+>Acordes</title>
+
+ <para
+>El comportamiento por defecto del editor de partituras es mover el cursor de inserción hacia adelante luego de insertar una nota, para quedar listo para el ingreso de la próxima nota en la melodía; esto puede ser cambiado presionando la tecla <keycap
+>H</keycap
+>, que cambia a modo de acorde, para poner las siguientes notas en el mismo tempo que la anterior para armar el acorde. Cambiando luego con <keycap
+>H</keycap
+> volvemos al comportamiento melodía.</para>
+
+ </sect3>
+
+ <sect3>
+ <title
+>Cambiando la duración de las notas</title>
+
+ <para
+>Es posible usar el teclado para cambiar la duración de las notas que se han ingresado. Verificar que las notas se han seleccionado y luego presionar <keycap
+>Ctrl</keycap
+> más la tecla numérica de la nota que se desee. También se puede agregar o quitar puntillos presionando <keycap
+>Ctrl</keycap
+> más "." guión; usando repetidamente se puede selecconar entre puntillo, doble puntillo y sin él.</para>
+
+ <para
+>Si se mantiene presionada la tecla <keycap
+>Alt</keycap
+> junto con la <keycap
+>Ctrl</keycap
+> se cambiará las duraciones de las notas en el menú de edición sin cambiar sus duraciones de interpretación. Esto puede ser muy útil para hacer más prolija una partitura: ver también <link linkend="nv-quantization"
+>partitura desde una interpretación</link
+>. </para>
+ </sect3>
+
+ <sect3>
+ <title
+>Otras observaciones</title>
+
+ <para
+>Todos los comandos de inserción están también disponibles en un submenú del menú Herramientas. Es improbable que para ingresar una nota se deba navegar por todo un menú, pero el menú muestra los atajos de teclado y provee una útil referencia en caso de que las combinaciones de teclas sean olvidadas.</para>
+
+ <para
+>Los atajos de teclado están diseñados para ser usados desde un teclado QWERTY. No hay forma aún de remapear todo el teclado y para otras distribuciones se debe asiganr cada tecal desde el menú "Configurar atajos..." en el menú de Opciones.</para>
+
+ <para
+>Manteniendo la tecla <keycap
+>Ctrl</keycap
+> mientras se presiona un número se seleccionará la correspndiente herramienta de puntillos.</para>
+
+ </sect3>
+
+ </sect2>
+
+ <sect2 id="nv-insertion-midi">
+ <title
+>Ingresando notas a través de un teclado MIDI</title>
+
+ <para
+>Es posible ingresar notas desde un teclado MIDI, en un proceso conocido como grabación por pasos. Las notas tendrán la altura de las notas pulsadas en el teclado pero la duración que figura en el editor </para>
+
+ <para
+>Para ingresar las notas a través de un teclado MIDI, primero hay que confirmar que el teclado está configurado como el dispositivo MIDI predeterminado. Verificar asimismo que la herramienta de notación muestra la duración deseada. Entonces se presiona el botón de grabación por pasos en la barra de herramientas del editor de partituras, o se selecciona Grabación por pasos desde el menú Herramientas. A partir de allí, todas las notas presionadas en el teclado MIDI serán insertadas en la posición actual en la ventana, hasta que la grabación por pasos se termine, o se cambie de ventana, o se cierre la misma. </para>
+
+ <para
+>Se puede seleccionar una herramienta de partituras diferente mientras la grabación por pasos está en proceso; y además se puede cambiar al modo Acorde para ingresar los mismos. </para>
+ </sect2>
+
+ </sect1>
+
+ <!-- Keys, Clefs and Time Signatures -->
+
+ <sect1 id="nv-signatures">
+ <title
+>Armadura de clave y tonalidad</title>
+
+<!-- !!! rework -->
+ <para
+>La primera cuestión que hay que saber acerca de la manera en que Rosegarden maneja estas cuestiones, es que los cambios relativos al tiempo (tempo y duración de las notas) son tratados de manera completamente distinta de las alturas y tonalidades. En la senda de simplificar el manejo de la grabación y reproducción tanto como la escritura de la partitura, Rosegarden requiere que cuando el tiempo o el compás cambian, lo hagan en todos las líneas de pentagramas a la vez. No es posible tener una línea en 3/4 y otra en 4/4 a la vez, o un pentagrama con nerga de 120 y otro con 90. Esta restricción se aplica sólo a los tiempos: no a el uso de tonalidades o armaduras de clave.</para>
+
+ <para
+>Para cambiar la tonalidad, clave, tiempo o compás en la ventana del editor de partituras, colocar el <link linkend="nv-rulers"
+>cursor de inserción</link
+> en el lugar en que se quiera aplicar el cambio, y suar luego las funciones Agregar cambio de Tonalidad..., Agregar Cambio de Clave..., Agregar Cambio de Tempo..., Agregar Cambio de Compás... del Menú Edición. Entonces se verá una caja de diálogo en la que se podrán seleccionar los parámetros requeridos.</para>
+
+ <sect2 id="nv-signatures-clef">
+ <title
+>Armadura de clave</title>
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-clefdialog.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase
+>Diálogo de armadura de clave Rosegarden</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+
+ <para
+>El diálogo perimite elegir una tonalidad, pero también escoger como esa tonalidad será aplicada, en caso en que haya algunas notas luego de la armadura de clave. Se deberá elegir una de las siguientes: <variablelist>
+
+ <varlistentry>
+ <term
+>Manteniendo las alturas iguales</term>
+ <listitem>
+ <para
+>Todas las notas posteriores a la armadura mantienen su altura de ejecución </para>
+ <para
+>Por ejemplo insertando una armadura de clave de tenor en el medio de una sección en agudos, causará que las notas siguientes a la armadura serán movidas una octava hacia arriba, porque ellas aún tendrán sus alturas de agudos. </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>Transponer una octava</term>
+ <listitem>
+ <para
+>Las notas que siguen a la armadura de clave, retendrán su afinación dentro de la octava, pero deben ser movidas a una octava diferente para confeccionar una nueva clave, y allí serán ejecutadas en la nueva afinación. </para>
+ <para
+>Por ejemplo insertando una clave de tenor en el medio de una sección de clave aguda causará que las notas se ajusten a la nueva tonalidad moviéndose una línea pero se ejecutarán una octava más baja que antes., </para>
+ </listitem>
+ </varlistentry>
+
+ </variablelist>
+
+ </para>
+ </sect2>
+
+ <sect2 id="nv-signatures-key">
+ <title
+>Tonalidad</title>
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-keysigdialog.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase
+>Diálogo de tonalidad Rosegarden</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+ </sect2>
+
+ </sect1>
+
+ <!-- Text -->
+
+ <sect1 id="nv-text">
+ <title
+>Texto y letras</title>
+
+ <para
+>Un pentagrama puede contener varias clases eventos de textos. Hay dos clases básicas de un evento de texto: ítems simples usados como anotaciones de notas etc., y las letras. El esquema será creado (y asociado a un determinado tempo en el pentagrama) usando la Herramienta de Texto, la cual está disponible en el botón con la <guilabel
+>T</guilabel
+> en la barra de herramientas. Las letras pueden ser creadas también de esta manera, pero es más fácil usando el <link linkend="nv-text-lyrics"
+>editor de letras</link
+>.</para>
+
+ <para
+>Para agregar un texto, seleccionar la herramienta de Texto y cliquear en el sitio en que se quiera insertar el mismo. Una caja de diálogo aparecerá, Allí se tipea el texto u se elige el propósito al que se destinará. (Rosegarden prefiere guardar el destino del texto, en vez de su aspecto; así en el futuro estará disponible para editar las diferentes clases de texto según la elección de cada usuario.) Los destinos (o estilos) disponibles son:</para>
+
+ <variablelist>
+
+ <varlistentry
+><term
+>Dinámico</term
+><listitem
+><para
+>Usada para indicaciones menores como marcas "p", "mf" etc. Se muestran pequeñas y en bastardilla por defecto. </para
+></listitem
+></varlistentry>
+
+ <varlistentry
+><term
+>Dirección</term
+><listitem
+><para
+>Se usan para indicar cambios significativos en el estilo. Se muestran en el pentagrama en tipo romano grande por default. </para
+></listitem
+></varlistentry>
+
+ <varlistentry
+><term
+>Dirección local</term
+><listitem
+><para
+>usado para representar cambios menores en el estilo. Por omisión, en el pentagrama se verán con una tipografía roman bastardilla y negrita más pequeña. </para
+></listitem
+></varlistentry>
+
+ <varlistentry
+><term
+>Tempo</term
+><listitem
+><para
+>Se usa para identificar cambios en el tiempo. Se mostrará en el pentagrama en una fuente roman en negrita por defecto. </para
+></listitem
+></varlistentry>
+
+ <varlistentry
+><term
+>Tempo Local</term
+><listitem
+><para
+>Usada para indicar cambios menores en el tiempo. Se verán en el pentagrama en una tipografía pequeña roman en negrita. </para
+></listitem
+></varlistentry>
+
+ <varlistentry
+><term
+>Letras</term
+><listitem
+><para
+>No obstante las letras son usualmente creadas en el <link linkend="nv-text-lyrics"
+>editor de letras</link
+>, pueden ser ingresadas palabra por palabra si fuese necesario usando este estilo. Este estilo es mostrado abajo en una tipografía romana pequeña. (Advertencia: Si las letras son ingresadas de esta manera y luego se edita en el editor de letras del editor de partituras, las letras ingresadas deben ser modificadas o movidas si su posición no es compatible con lo esperado por el editor. </para
+></listitem
+></varlistentry>
+
+ <varlistentry
+><term
+>Anotación</term
+><listitem
+><para
+>Usado para texto de ayuda que no es considerado estrictamente parte de la partitura. Se mostrará bajo el pentagrama, recuadrado en un estilo tipo papel de notas amarillo. </para
+></listitem
+></varlistentry>
+
+ </variablelist>
+
+ <para
+>Se puede además editar el texto luego de escribirlo, cliqueando en el texto con la herramienta Texto.</para>
+
+ <sect2 id="nv-text-lyrics">
+ <title
+>Editando letras</title>
+
+ <para
+>El Editor de Letras, disponible desde el la opción <guimenuitem
+>Abrir Editor de Letras</guimenuitem
+> de el menú <guimenu
+>Ver</guimenu
+>, permite la edición de todos los eventos de letras de canciones de una sola vez para un pentagrama completo, usando un sistema básico de edición textual. Para usarlo, simplemente se deba activar la opción en el menú, editar el texto en el diálogo resultante y apretar "OK"</para>
+
+ <para
+>Las letras que se ingresen, estarán en un formato particular. Las líneas de compás que son vitales para evitar que el editor se confunda, están representadas por una barra ("/"). Entre cada barra las sílabas están separadas por espacios (en realidad un espacio: el editor no tiene en cuenta los espacios adicionales). Cada sílaba será adjuntada a el siguiente acorde o nota en ese compás. (no obstante lo cual el editor puede llega a perderse cuando los acordes no se correspnden exactamente, por ejemplo en aquellos que requieren cuantización</para>
+
+ <para
+>Si se requiere tener una nota que no tenga una sílaba adjuntada a ella, se coloac n punto (".") para esa nota. (He allí el porqué de que la letra por default para un segmento está llena de puntos.) Recuerdesé separa los puntos con espacios, para separar claramente las sílabas.</para>
+
+ <para
+>Si se necesita más de una sílaba para la misma nota, con un espacio entre ellas, se debe usar un tilde ("~") en lugar de un espacio. Será mostrado como un espacio en el pentagrama.</para>
+
+ <para
+>Si se necesita repartir na sílaba entre dos notas, con un guión, se debe ingresar un espacio siguiendo a el guión para que el editor sepa que se trata de dos sílabas. (El guión no toma tratamiento especial entre dos sílabas.)</para>
+
+ <para
+>Las sílabas que consisten solamente en números seguidos por corchtes (como "[29]") serán ignoradas; este es el formato usado para generar automáticamente números de compás mostrados en el editor.</para>
+
+ <para
+>Se debe prestar atención al formato de texto usado para editar las letras: éstas son guardadas como diferentes eventos de texto (uno por sílaba). Esto significa que el formato de texto puede variar en el futuro para incorporar capacidades de edición avanzadas, de todas maneras los formatos de eventos no deberían cambiar para mantener la compatibilidad entre archivos.</para>
+
+ </sect2>
+
+ </sect1>
+
+ <!-- Indications -->
+
+ <sect1 id="nv-indication">
+ <title
+>Borrones y ganchos</title>
+
+ <para
+>Son marcas dinámicas guardadas como eventos, como las notas o los silencios. Para crear uno, seleccionar el área a cubrir (una serie de notas o lo que sea), y entonces se debe usar las opciones <guimenuitem
+>Agregar borrón</guimenuitem
+>, <guimenuitem
+>Agregar Crescendo</guimenuitem
+> o <guimenuitem
+>Agregar Decrescendo</guimenuitem
+> del menú <guimenu
+>Grupo</guimenu
+>.</para>
+
+ <para
+>Se remueven exactamente igual que otro evento: primero se seleccionan con la herramienta de selección y luego se aprieta la tecla <keycap
+>Suprimir</keycap
+> o con la herramienta de borrado.</para>
+
+ </sect1>
+
+ <!-- Stem direction, slashes etc -->
+
+ <sect1 id="nv-note-qualities">
+ <title
+>Fade Out y Cortes de notas</title>
+
+ <para
+>Es posible setear la dirección de la plica de las notas seleccionadas (se proveen varias) usando las tres posibilidades del submenú Dirección de Plica en el manú Notas. Estas opciones le permitirán seleccionar plica hacia arriba o abajo o revertir las existentes que Rosegarden ha escogido. Ver también<link linkend="nv-beamed-groups"
+>Pulsos</link
+>.</para>
+
+ <para
+>El menu <guimenu
+>Grupo</guimenu
+> también contiene optciones para agregar barras a través de las asas de las notas, por ejemplo, para indicar notas corta y repetidas o rolls de percusión. Éstas son actualmente puramente notación; &rosegarden; no las tomará en cuenta cuando reproduzca la partitura o genere &MIDI;.</para>
+ </sect1>
+
+ <!-- Beamed groups, including overlapping and nesting them -->
+
+ <sect1 id="nv-beamed-groups">
+ <title
+>Unir Plicas</title>
+
+ <para
+>Unir plicas en las notas está considerada una operación de agrupamiento en el Editor de Partitura de &rosegarden;, disponible en el menu <guimenu
+>Grupo</guimenu
+>. Selecciona las notas que quieres unir, y usa la opción Agrupar Plicas dentro del menú <guimenu
+>Grupo</guimenu
+>. Para remover la plica, selecciona las notas y usa la opción <guimenuitem
+>Desagrupar Plicas</guimenuitem
+>.</para>
+
+ <para
+>Es posible tener más de un grupo con plicas al mismo tiempo &mdash; simplemente selecciona y une los grupos separados de a uno &mdash; pero Rosegarden usualmente no es lo suficientemente inteligente como para saber qué notas deben tener las plicas hacia arriba y cuáles deben estar hacia abajo para un grupo de plicas unidas simultáneamente, entonces probablememte deberás corregir las direcciones de las plicas de las notas en los grupos explícitamente, como así también deberás unirlas.</para>
+
+ <para
+>&rosegarden; puede intentar adivinar una forma coherente de unir las piezas de música, no es tan complicado. Para invocar ésto, selecciona las notas para las cuales que quieres calcular la unión, (por ejemplo, por triple-clicleo para seleccionar todo el pentagrama) y luego usa la opción <guimenuitem
+>Auto-Unir</guimenuitem
+> en el <guimenu
+>Groupos menu</guimenu
+>. Esto es realizado incluso cuando se carga un archivo &MIDI;, por ejemplo, y el editor también hace algunas uniones automáticas mientras ingresas notas (ésto puede ser deshabilitado cambiando la configuración del diálogo "Auto-Unir cuando sea apropiado" o en la barra de herrramientas de inserción, con el menú que aparece presionando el botón derecho.</para>
+
+ </sect1>
+
+ <!-- Tuplets -->
+
+ <sect1 id="nv-tuplets">
+ <title
+>Tresillos y otros tríos</title>
+
+ <para
+>Un grupo de tresillos consiste en tres notas o acordes repoducidos en el tiempo de dos. (Más precisamente, consiste en notas con una duración total de tres unidades arbitrarias reproducidas en el tiempo de dos de esas unidades.)</para>
+
+ <para
+>Usamos la frase <quote
+>grupo irregular</quote
+> para describir la situación general en la cual las notas con una duración total de cualquier número de unidades son reproducidas en el tiempo de un diferente número de esas unidades: nueve notas en el tiempo de ocho, o seis en el tiempo de cuatro, o incluso dos notas en el tiempo de tres. (En el presente &rosegarden; no soporta el último ejemplo &mdash;, los grupo irregular deben siempre ser reproducidos con una duración más corta que la escrita.)</para>
+
+ <para
+>Las funciones de los menus de tresillos y grupos irregulares funcionan tomando una serie de notas existentes o silencios, </para>
+
+ <!-- Need examples and screenshots -->
+
+ <!-- Then discuss general tuplet dialog... -->
+
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-tupletdialog.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase
+>Diálogo de tresillos de Rosegarden</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+
+ <para
+>Para especificar un grupo irregular general, necesitamos saber cuál es la nota base (por ejemplo, si tocamos tres corcheas en el tiempo de dos, entonces la base es una corchea) y el radio del número de notas base escritas en el número interpretado.</para>
+
+ <!-- Then discuss "tuplet mode": with a subtitle? -->
+
+ </sect1>
+
+ <!-- Grace notes -->
+
+ <!-- Paste -->
+
+ <sect1 id="nv-paste-types">
+ <title
+>Tipos de pegado</title>
+
+ <para
+>El significado de <quote
+>cortar y pegar</quote
+> es menos obvio para un programa de edición de música de lo que lo es para algo como un procesador de textos en el cual las letras y las palabras van en un orden simple y lineal. De acuerdo con ésto, el Editor de Partituras de &rosegarden; ofrece diferentes y variados tipos de operaciones de Pegado, así como funciones separadas de Cortar, y Cortar y Cerrar. </para>
+
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-pastedialog.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase
+>Diálogo de tipos de pegado Rosegarden</phrase>
+ </textobject>
+ </mediaobject>
+</screenshot
+> Los tipos de operación de pegado son:</para>
+
+ <variablelist>
+
+ <varlistentry>
+ <term
+>Restringido</term>
+ <listitem>
+ <para
+>Requiere un vacío existente (conteniendo nada salvo los silencios) de una duración suficiente como para contener completamente los contenidos del portapapeles. Los contenidos son pegados dentro del vacío. Si no hay un espacio vacío lo suficientemente largo, la operación de pegado no se lleva a cabo. </para>
+ <para
+>Este es el tipo de pegado por defecto </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>Simple</term>
+ <listitem>
+ <para
+>Borra suficientes eventos como para hacer un vacío lo suficientemente largo como para pegar algo dentro, y luego pega dentro de éste. Los eventos pegados remplazan cualquier nota existente en el tiempo cubierto por el pegado. </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>Abrir y Pegar</term>
+ <listitem>
+ <para
+>Lo opuesto a Cortar y Cerrar. Hace lugar para el pegado moviendo todos los eventos subsecuentes un poco más lejos hacia el final de la composición. </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>Solapar la nota</term>
+ <listitem>
+ <para
+>Lleva a cabo un pegado en la manera en que pasaría si ingresaras cada una de las notas en el portapapeles tú mismo usando el Editor de Partituras: si hay otras notas superponiéndose encima de ellas, las nuevas o existentes notas serán divididas con ligaduras de prolongación de una manera apropiada. </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>Solapar la matriz</term>
+ <listitem>
+ <para
+>Lleva a cabo un pegado en la manera en que pasaría si ingresaras cada una de las notas en el portapapeles tú mismo usando el Editor de Matriz: las notas presentes en el camino del pegado serán ignoradas, permitiendo a las nuevas notas superponerse arbitrariamente con ellas. </para>
+ </listitem>
+ </varlistentry>
+
+ </variablelist>
+
+ <para
+>Todo ésto tiene efecto en la posición actual del cursor de inserción en el pentagrama actual. Para elegir entre los varios tipos de pegado, usa la opción de menú Pegar... (con puntos suspensivos) en el menú Editar. </para>
+
+ </sect1>
+
+ <sect1 id="nv-adjustments">
+ <title
+>Ajustando la partitura</title>
+
+
+ <sect2 id="nv-adjustments-note-rest-durations">
+ <title
+>Ajustando las duraciones de silencios y notas</title>
+
+ <sect3 id="nv-normalize-rests">
+ <title
+>Normalizando silencios</title>
+
+ <para
+>A veces como resultado de operaciones de editado o cuantización, una parte de la partitura puede terminar con duraciones de silencios incorrectas para la medida de compás actual. Puedes usar la funcion <guimenuitem
+>Normalizar Silencios</guimenuitem
+> para arreglar ésto. Ésta función examina cada secuencia consecutiva e silencios que se encuentran en la selección, y ajusta, divide y mezcla los silencios tanto como sea necesario como para asegurar que esos silencios tienen teóricamente duraciones correctas y caen en las barras correctas. </para>
+
+ <para
+>Por ejemplo, una barra 4/4 que contiene una negra, luego un silencio de blanca y un silencio de negra será reacomodado de manera de poner el silencio de negra antes que el de blanca, dado que éste último no debe cruzar el límite central de pulso de la barra. </para>
+ </sect3>
+<!--
+ <varlistentry id="commands-nv-menu-transforms-make-viable">
+ <term
+><menuchoice>
+ <guimenu
+>Transforms</guimenu>
+ <guimenuitem
+>Make Notes Viable</guimenuitem>
+ </menuchoice
+></term>
+ <listitem>
+ <para
+><action
+>Splits notes at displayable
+ durations.</action
+> This function is intended to deal
+ with notes that have excessively long durations that
+ overflow barlines or that are too long to be displayed
+ as a single note. It takes any such notes and splits
+ them into shorter, tied notes.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry id="commands-nv-menu-transforms-de-counterpoint">
+ <term
+><menuchoice>
+ <guimenu
+>Transforms</guimenu>
+ <guimenuitem
+>De-Counterpoint</guimenuitem>
+ </menuchoice
+></term>
+ <listitem>
+ <para
+><action
+>Turns counterpoint into a series of split-and-tied notes and chords.</action>
+
+ &rosegarden; has no explicit support for counterpoint
+ (multiple lines of notes edited separately on the
+ same staff), but it will do its best to approximate
+ it when it finds notes in a segment that are
+ apparently contrapuntal, i.e. that overlap but that
+ are not precise enough to be treated as chords. For
+ example, when a short note starts shortly after a
+ longer note, Rosegarden will show the longer note
+ and a short <quote
+>spacing</quote
+> rest together, followed by the
+ shorter note. Unfortunately this often isn't what
+ you want.
+ </para>
+
+ <para
+>The De-Counterpoint function can be applied to a
+ selection that contains overlapping notes. It will
+ split overlapping notes at the point where they
+ overlap, and tie together the resulting split notes,
+ ensuring that the music takes the form of a series of
+ chords and/or single notes starting and ending in neat
+ blocks, with some notes possibly tied.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry id="nv-transpose">
+ <title
+>Transpose</title>
+ <para
+><action
+>Alters the pitch of the selected
+ notes.</action
+> This submenu contains basic
+ transposition functions which move the selected notes
+ up or down a semitone or a whole octave in pitch, as
+ well as a general transpose function that allows you
+ to choose how far up or down you want to transpose the
+ selection.
+ </para>
+
+ <para
+>These functions simply change the stored pitches
+ of the notes in the selection, so that they both play
+ and appear at the new pitches. They do not deal with
+ performance transposition (displaying one pitch and
+ playing another), for which see the main window's
+ segment parameter box; nor do they help you with
+ transposing from one key into another, for which see
+ <link linkend="nv-signatures-key"
+>Key
+ Signatures</link
+>.
+ </para>
+ </varlistentry>
+-->
+ </sect2>
+ </sect1>
+
+ <sect1 id="nv-interpret">
+ <title
+>Interpretando colas de performance en la notación</title>
+ <!-- !!! -->
+ <para
+>La función Interpretación puede ser usada para modificar las velocidades y tiempos de las notas de acuerdo a cualquier marca dinámica escrita o indicada que se encuentre. La selección de interpretaciones disponibles son: <variablelist>
+ <varlistentry>
+ <term
+>Aplicar las marcas dinámicas de texto (p, mf, ff, etc) </term>
+ <listitem
+><para
+>Setea la velocidad de cada nota basado en la última marca de texto de tipo "Dinámico"vista en el mismo staff (sólo se consideran textos de la forma pp, p, mp, f, ff, fff, etc). </para
+></listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>Dinámicas de crescendo/decrescendo </term>
+ <listitem
+><para
+>Hace que las notas aumenten o disminuyan su velocidad gradualmente durante una marca de este tipo. </para
+></listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>Acentuación de pulsos </term>
+ <listitem
+><para
+>Hace que las notas que descansan en la barra o en pulsos suenen un poco mas fuerte que las restantes (acentuación). </para
+></listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>Articular ligaduras de expresión, staccatos, tenutos, etc. </term>
+ <listitem
+><para
+>Acorta notas no ligadas, acorta mas las notas staccato, y le da a las notas dentro de ligaduras de expresión y tenutos su longitud completa </para
+></listitem>
+ </varlistentry>
+ </variablelist>
+
+ </para>
+
+ </sect1>
+
+ <!-- Quantization, smoothing, and display of quantized notes -->
+
+ <sect1 id="nv-quantization">
+ <title
+>Notación desde datos de ejecución (performance)</title>
+
+ <para
+>&rosegarden; es un programa multi propósito: es un editor de notación, pero es primariamente un secuenciador y editor para música ejecutada. Y en una ejecución, por supuesto, los tiempos y duraciones de las notas son raramente tan precisas como en una partitura impresa. </para>
+
+ <para
+>Esto significa que es deseable que &rosegarden; haga un gran trabajo de ordenamiento de los tiempos y duraciones de las notas cuando se intenta lograr notas significativas para mostrar en el editor de notación. Ésto es una forma de cuantización, pero una forma que requiere una sorprendente cantidad de trabajo de suposición para funcionar bien. &rosegarden; incluye un cuantizador diseñado para hacer un trabajo un poco mejor que éste que el cuantizador de grilla común. </para>
+
+ <para
+>Aplicar cuantización estrictamente para la notación es normalmente referido como <quote
+>cuantización de notación</quote
+>: sólo se aplica a las notas que uno ve y edita en notación, y no afecta a otras notas que se ven o editan desde otras vistas que no sea la matrix. Ésta cuantización es automáticamente aplicada a la música importada o grabada desde MIDI, aunque no todas las capacidades posibles son activadas por defecto. </para>
+
+ <para
+>Existen dos maneras de ver que notas han sido cuantizadas para la notación. Por defecto, cada vista de notación contiene una Regla de Notas (en el grupo de reglas por sobre la parte) que muestra un block rectangular para cada nota. éste block está posicionado para representar el teimpo y la duración de a nota según haya sido ejecutada, pero con los bordes superior e inferior del rectángulo extendidos o reducidos para representar el tiempo después de la cuantización de notas. Si esto resulta demasiada información, puede, alternativamente, elegir (en el diálogo de configuración) mostrar en un color verde todas las cabezas de las notas de la parte cuyos tiempos han sido alterados por la cuantización de notación. </para>
+
+ <para>
+
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-notationquantizer.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase
+>El diálogo de cuantización de &rosegarden;</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para
+><para
+>Si la cuantizacíon que &rosegarden; ha realizado no es conveniente, tanto para la parte completa como para una selección de notas, puede usar un nivel de cuantización distinto o ninguno en absoluto. Para aplicar una cuantización diferente a algunas notas, seleccione las notas y utilice la función del menú Cuantizar... (marque la caja llamada <quote
+> Cuantizar para notación solamente</quote
+>). El nivel o tipo de cuantización usado por defecto puede ser cambiado en el diálogo de configuración. </para>
+
+ <sect2 id="nv-quantization-parameters">
+ <title
+>Parámetros configurables para el cuantizador de notación heurístico</title>
+
+ <sect3 id="nv-quantization-parameters-during">
+ <title
+>Parámetros para la cuantización misma</title>
+
+ <variablelist>
+
+ <varlistentry>
+ <term
+>Complejidad</term>
+ <listitem>
+ <para
+>la "complejidad" de un cuantizador de notación es el parámetro mas fundamental. Un cuantizador "complejo"va a estar mas preparado para aceptar que música-que-se-ve-compleja es de hecho música que se pretende compleja, mientras que es mas normal que un cuantizador "simple" asuma que música-que-se-ve-compleja resulta de una performance imprecisa de música simple. </para>
+ <para
+>El seteo por defecto tiene por cometido producir resultados razonables para un verdadero amplio rango de música. </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>Unidad base de grilla</term>
+ <listitem>
+ <para
+>La unidad base de grilla (seteado al valor de duración de una nota) especifica la unidad absoluta mínima de una nota a la que se permite en la parte luego de una cuantización. Por ejemplo, si se setea el valor a una semicorchea, todas las notas serán colocadas en las vecindades de un múltiplo de una semicorchea, con duraciones también múltiplo de la misma. </para>
+ <para
+>El seteo de la unidad de base de grilla no es tan significante para un cuantizador de notación como lo es para un cuantizador de grilla plana, ya que todo lo que hace es imponer un límite absoluto en el nivel de presición permitido por el parámetro de complejidad. Mayormente, cuando se encuentra un caso en el cuál incrementando la unidad de grilla producen mejores resultados, ha encontrado realmente un caso en el que el cuantizador simplemente no hizo un tan buen trabajo como el que podría haber hecho con una unidad menor. </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>Nivel de trecillo</term>
+ <listitem>
+ <para
+>El cuantizador de notación es capaz de identidficar trecillos (tripletos y otros tipos de particiones de tiempo), con límites razonables. Éste parámetro controla que tan ambiciosamente va a intentar ser al momento de buscar trecillos, seteando un límite en cuántas notas por grupo de trecillos va a intentar identificar. Si se encuentra seteado a <quote
+>Ninguno</quote
+>, el cuantizador no intentará identificar trecillos. </para>
+ </listitem>
+ </varlistentry>
+
+ </variablelist>
+
+ </sect3>
+
+ <sect3 id="nv-quantization-parameters-after">
+ <title
+>Parámetros que controlan el emparejamiento luego de la cuantización</title>
+
+ <variablelist>
+
+ <varlistentry>
+ <term
+>Re-ligadura</term>
+ <listitem>
+ <para
+>Hace que la notación sea re-ligada en grupos apropiados luego de la cuantización. Ésto es usualmente deseable. </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>Agregar articulaciones (staccatos, tenutos, ligaduras de expresión)</term>
+ <listitem>
+ <para
+>Hace que el cuantizador intente identificar, basado en la duración de notas individuales y consecutivas, que notas deben ser escritas con marcas de staccato (para notas que son significantemente mas cortas que la nota siguiente, pero aparentemente no lo suficientemente cortas para merecer un silencio), tenuto (para notas que casi o justamente se sobreponen a la siguiente nota) y ligaduras de expresión (para series de notas que se sobreponen). </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>Ligación de notas en las barras, etc.</term>
+ <listitem>
+ <para
+>Hace que las notas que luego de la cuantización todavía se encuentran presentes através de una barra o que no son exactamente expresables con la cabeza de una nota simple, sean divididas en múltiples notas apropiadamente, y ligadas. Ésto tiene el mismo efecto que aplicar la función "Ligar notas en las barras" en la vista de notación. </para>
+ <para
+>Éste parámetro no se encuentra activado por defecto debido a que cambia el número de eventos de notas, lo que es indeseable cuando se utiliza &rosegarden; principalmente o en parte como secuanciador MIDI. </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>Dividir y ligar acordes que se sobreponen</term>
+ <listitem>
+ <para
+>Hace que los acordes que se sobreponen sean divididos y ligados, de manera de formar los acordes estrictos con notas individuales ligadas de la forma que sea necesaria. Ésto tiene el mismo efecto que aplicar la función "Dividir y ligar acordes superpuestos" en la vista de notación. </para>
+ <para
+>Éste parámetro no se encuentra activado por defecto debido a que cambia el número de eventos de notas, lo que es indeseable cuando se utiliza &rosegarden; principalmente o en parte como secuanciador MIDI. </para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </sect3>
+ </sect2>
+ </sect1>
+
+
+ <sect1 id="nv-note-styles">
+ <title
+>Estilos de notas</title>
+
+ <para
+>&rosegarden; también permite cambiar varios aspectos de la manera en la que varios tipos de notas son dibujadas, como la cabeza de las notas, el número de colas, si las notas son o no rellenadas, etc. </para>
+
+ <para
+>Se provee un set de estilos estándar (Clásico, Cruzado, Triángulo y Medible), y es posible cambiar el estilo usado para notas individuales seleccionandolas y utilizando las opciones del menú Estilo de notas. Cada nota recuerda que estilo ha sido elegido para ella, y esta información es guardada como parte de la composición. También es posible cambiar el estilo por defecto para notas nuevas usando la opción <guimenuitem
+>Configurar Rosegarden...</guimenuitem
+> el el menú <guimenu
+>Configuraciones</guimenu
+>. </para>
+
+ <para
+>También es posible crear sus propios estilos de nota describiéndolos en archivos <acronym
+>XML</acronym
+>. Incluso los estilos estándar son definidos de ésta forma, la única razón por la cuál el editor sabe que una semicirchea de estilo Clásico tiene una cabez ovalada, rellena y aplastada, una plica, dos banderas, etc., es porque la descripción en Classical.xml dice eso. Vea <link linkend="developers-note-styles"
+>Personalizando Rosegarden</link
+> para mas información. </para>
+ </sect1>
+
+ <sect1 id="nv-note-fonts">
+ <title
+>Fuentes de notas</title>
+ <para
+>&rosegarden; se provee con una sola fuente escalable de notación, la fuente Feta desarrollada por el proyecto Lilypond. Feta es una fuente de extremadamente alta calidad que debería ser apropiada para casi todo el trabajo clásico. </para>
+
+ <para
+>&rosegarden; también incluye soporte como estándar para un número de otras fuentes de notación. Necesitará proveer éstas fuentes en formato TrueType (.ttf) o PostScript tipo 1 (.pfb, .pfa), y necesitará los permisos relevantes para instalarlos en el mismo lugar en el que &rosegarden; fué instalado. Para instalar una fuente soportadalocalice el directorio compartido para la instalación de &rosegarden; (usualmente un subdirectorio del árbol de instalación de KDE, como por ejemplo /opt/kde/share/apps/rosegarden). Encontrará que éste directorio contiene un subdirectorio llamado "fonts":copie los archivos de fuentes ahí, y reinicie &rosegarden;. Si su fuente es soportada, debería aparecer ahora en el menú de fuentes en el editor de notación.</para>
+
+ <para
+>Soporte parcial o completo es actualmente proveído para las siguientes fuentes: Fughetta, por Blake Hodgetts; Petrucci, la fuente "original" de Finale; Maestro, la "nueva" fuente de Finale; Opus, la fuente de Sibelius; Inkpen, la fuente de jazz Sibelius; Sonata de Adobe; Steinberg, del secuenciador Cubase; y Xinfonia. EL EQUIPO DE ROSEGARDEN NO HACE REPRESENTACIÓN DEL ESTÁTUS LEGAL DE ALGÚN USO DE ÉSTAS FUENTES CON ROSEGARDEN. Es su responsabilidad de asegurarse que está cumpliendo con la licencia (si existe alguna) bajo la cuál la fuente le fué provista, antes de usarla. Si no está seguro de si tiene o no el derecho de usar una fuente, no se aparte a otra cosa, la fuente Feta es mejor que la mayoría de éstas de todos modos.</para>
+
+ <para
+>Es también posible proveer nuevos archivos de mapeos de manera de usar nuevas fuentes. Para algunas fuentes que poseen mapeos o métricas similares a la lista de mas arriba, ésto puede ser tan simple como editar el nombre de la fuente en el archivo de mapeo. Vea <link linkend="developers-note-fonts"
+>Personalizando Rosegarden</link
+> para mas información. </para>
+ </sect1>
+
+
+ </chapter>
+
+ <chapter id="event-view">
+ <title
+>El editor de Lista de Eventos</title>
+ <sect1 id="ev-introduction">
+ <title
+>introducción</title>
+
+ <para
+>El editor de Lista de Eventos de &rosegarden; muestra los eventos en un segmento simple en una forma cruda, y le permite editar las propiedades precisas de esos eventos individualmente. <screenshot
+> <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-eventlisteditor.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase
+>El editor de eventos de &rosegarden;</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+ </sect1>
+ </chapter>
+
+
+
+
+ <!--
+ **********************************
+
+ PART II:
+ Command reference
+
+ **********************************
+ -->
+<!-- NO
+
+ <chapter id="commands">
+ <title
+>Command Reference</title>
+
+
+ <para
+></para>
+
+ <sect1 id="commands-main">
+ <title
+>Main window</title>
+ <para
+></para>
+
+
+ <sect2>
+ <title
+>File menu</title>
+ <para>
+ <variablelist>
+
+ <varlistentry id="commands-main-file-new">
+ <term
+><menuchoice>
+ <shortcut>
+ <keycombo
+><keycap
+>Ctrl</keycap
+><keycap
+>n</keycap
+></keycombo>
+ </shortcut>
+ <guimenu
+>File</guimenu>
+ <guimenuitem
+>New</guimenuitem>
+ </menuchoice
+></term>
+ <listitem
+><para
+><action
+>Creates a new composition.</action
+></para
+></listitem>
+ </varlistentry>
+
+ <varlistentry id="commands-main-file-open">
+ <term
+><menuchoice>
+ <shortcut>
+ <keycombo
+><keycap
+>Ctrl</keycap
+><keycap
+>o</keycap
+></keycombo>
+ </shortcut>
+ <guimenu
+>File</guimenu>
+ <guimenuitem
+>Open</guimenuitem>
+ </menuchoice
+></term>
+ <listitem
+><para
+><action
+>Opens an existing composition from a Rosegarden-4 (.rg) file.</action
+></para
+></listitem>
+ </varlistentry>
+
+ <varlistentry id="commands-main-file-import">
+ <term
+><menuchoice>
+ <guimenu
+>File</guimenu>
+ <guimenuitem
+>Import</guimenuitem>
+ </menuchoice
+></term>
+ <listitem
+><para
+>This submenu contains functions for importing compositions from other file formats.</para>
+
+ <variablelist>
+
+ <varlistentry id="commands-main-file-import-midi">
+ <term
+><menuchoice>
+ <guimenu
+>Import</guimenu>
+ <guimenuitem
+>Import &MIDI; file...</guimenuitem>
+ </menuchoice
+></term>
+ <listitem
+><para
+><action
+>Creates a new composition from the contents of an existing &MIDI; (.mid) file.</action
+></para
+></listitem>
+ </varlistentry>
+
+ <varlistentry id="commands-main-file-import-rg21">
+ <term
+><menuchoice>
+ <guimenu
+>Import</guimenu>
+ <guimenuitem
+>Import Rosegarden 2.1 file...</guimenuitem>
+ </menuchoice
+></term>
+ <listitem
+><para
+><action
+>Creates a new composition from the contents of an existing Rosegarden 2.1 (.rose) file.</action
+></para
+></listitem>
+ </varlistentry>
+
+ </variablelist>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry id="commands-main-file-merge">
+ <term
+><menuchoice>
+ <guimenu
+>File</guimenu>
+ <guimenuitem
+>Merge</guimenuitem>
+ </menuchoice
+></term>
+ <listitem
+><para
+>This submenu contains functions for merging other files into the current composition.</para>
+
+ <variablelist>
+
+ <varlistentry id="commands-main-file-merge-file">
+ <term
+><menuchoice>
+ <guimenu
+>Merge</guimenu>
+ <guimenuitem
+>Merge File...</guimenuitem>
+ </menuchoice
+></term>
+ <listitem
+><para
+><action
+>Merges the contents of an existing Rosegarden (.rg) file into the current composition. You will be offered a choice of whether to merge the file in new tracks at the start of the composition, or after the end of the current composition.</action
+></para
+></listitem>
+ </varlistentry>
+
+ <varlistentry id="commands-main-file-merge-midi">
+ <term
+><menuchoice>
+ <guimenu
+>Merge</guimenu>
+ <guimenuitem
+>Merge &MIDI; file...</guimenuitem>
+ </menuchoice
+></term>
+ <listitem
+><para
+><action
+>Merges the contents of an existing &MIDI; (.mid) file into the current composition. You will be offered a choice of whether to merge the file in new tracks at the start of the composition, or after the end of the current composition.</action
+></para
+></listitem>
+ </varlistentry>
+
+ <varlistentry id="commands-main-file-merge-rg21">
+ <term
+><menuchoice>
+ <guimenu
+>Merge</guimenu>
+ <guimenuitem
+>Merge Rosegarden 2.1 file...</guimenuitem>
+ </menuchoice
+></term>
+ <listitem
+><para
+><action
+>Merges the contents of an existing Rosegarden 2.1 (.rose) file into the current composition. You will be offered a choice of whether to merge the file in new tracks at the start of the composition, or after the end of the current composition.</action
+></para
+></listitem>
+ </varlistentry>
+
+ </variablelist>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry id="commands-main-file-export">
+ <term
+><menuchoice>
+ <guimenu
+>File</guimenu>
+ <guimenuitem
+>Export</guimenuitem>
+ </menuchoice
+></term>
+ <listitem
+><para
+>This submenu contains functions for exporting the contents of compositions to other file formats.</para>
+
+ <variablelist>
+
+ <varlistentry id="commands-main-file-export-midi">
+ <term
+><menuchoice>
+ <guimenu
+>Export</guimenu>
+ <guimenuitem
+>Export &MIDI; file...</guimenuitem>
+ </menuchoice
+></term>
+ <listitem
+><para
+><action
+>Saves the contents of the current composition into a new &MIDI; file.</action
+> Note that not all data in the Rosegarden composition necessarily can or will be saved in the &MIDI; format.</para
+></listitem>
+ </varlistentry>
+
+ <varlistentry id="commands-main-file-export-csound">
+ <term
+><menuchoice>
+ <guimenu
+>Export</guimenu>
+ <guimenuitem
+>Export Csound score file...</guimenuitem>
+ </menuchoice
+></term>
+ <listitem
+><para
+><action
+>Saves the contents of the current composition into a new Csound score file.</action
+> Together with a suitable orchestra file (not supplied), this can be used to play the composition through <ulink url="http://www.csounds.com/"
+>Csound</ulink
+>. Note that not all data in the Rosegarden composition necessarily can or will be saved in the Csound format.</para
+></listitem>
+ </varlistentry>
+
+ <varlistentry id="commands-main-file-export-lilypond">
+ <term
+><menuchoice>
+ <guimenu
+>Export</guimenu>
+ <guimenuitem
+>Export Lilypond file...</guimenuitem>
+ </menuchoice
+></term>
+ <listitem
+><para
+><action
+>Saves the contents of the current composition into a new Lilypond file.</action
+> This can then be processed by the <ulink url="http://www.lilypond.org/"
+>Lilypond</ulink
+> system to produce typeset-quality music, although it is likely that the file may need some tweaking to get really good quality output. Note that not all data in the Rosegarden composition necessarily can or will be saved in the Lilypond format.</para
+></listitem>
+ </varlistentry>
+
+ <varlistentry id="commands-main-file-export-mup">
+ <term
+><menuchoice>
+ <guimenu
+>Export</guimenu>
+ <guimenuitem
+>Export Mup file...</guimenuitem>
+ </menuchoice
+></term>
+ <listitem
+><para
+><action
+>Saves the contents of the current composition into a new Mup file.</action
+> This can then be processed by the <ulink url="http://www.arkkra.com/"
+>Mup</ulink
+> music publication system, although it is likely that the file may need some tweaking to get really good quality output. Note that not all data in the Rosegarden composition necessarily can or will be saved in the Mup format.</para
+></listitem>
+ </varlistentry>
+
+ <varlistentry id="commands-main-file-export-musicxml">
+ <term
+><menuchoice>
+ <guimenu
+>Export</guimenu>
+ <guimenuitem
+>Export MusicXML file...</guimenuitem>
+ </menuchoice
+></term>
+ <listitem
+><para
+><action
+>Saves the contents of the current composition into a new MusicXML file.</action
+> This can then be used with any music software that supports the MusicXML format. Note that MusicXML support is experimental and has not been well tested. Not all data in the Rosegarden composition necessarily can or will be saved in the MusicXML format.</para
+></listitem>
+ </varlistentry>
+
+ </variablelist>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry id="commands-main-file-save">
+ <term
+><menuchoice>
+ <shortcut>
+ <keycombo
+><keycap
+>Ctrl</keycap
+><keycap
+>s</keycap
+></keycombo>
+ </shortcut>
+ <guimenu
+>File</guimenu>
+ <guimenuitem
+>Save</guimenuitem>
+ </menuchoice
+></term>
+ <listitem
+><para
+><action
+>Saves the composition.</action
+></para
+></listitem>
+ </varlistentry>
+
+ <varlistentry id="commands-main-file-save-as">
+ <term
+><menuchoice>
+ <guimenu
+>File</guimenu>
+ <guimenuitem
+>Save As...</guimenuitem>
+ </menuchoice
+></term>
+ <listitem
+><para
+><action
+>Saves the composition with a new filename.</action
+></para
+></listitem>
+ </varlistentry>
+
+ <varlistentry id="commands-main-file-close">
+ <term
+><menuchoice>
+ <shortcut>
+ <keycombo
+><keycap
+>Ctrl</keycap
+><keycap
+>w</keycap
+></keycombo>
+ </shortcut>
+ <guimenu
+>File</guimenu>
+ <guimenuitem
+>Close</guimenuitem>
+ </menuchoice
+></term>
+ <listitem
+><para
+><action
+>Closes the current composition.</action
+></para
+></listitem>
+ </varlistentry>
+
+ <varlistentry id="commands-main-file-print">
+ <term
+><menuchoice>
+ <shortcut>
+ <keycombo
+><keycap
+>Ctrl</keycap
+><keycap
+>p</keycap
+></keycombo>
+ </shortcut>
+ <guimenu
+>File</guimenu>
+ <guimenuitem
+>Print</guimenuitem>
+ </menuchoice
+></term>
+ <listitem
+><para
+><action
+>Prints the current composition.</action
+> At the time of writing, the print function is incomplete. We recommend using the <link linkend="commands-main-file-export-lilypond"
+>Export Lilypond file</link
+> function and printing with Lilypond instead.</para
+></listitem>
+ </varlistentry>
+
+ <varlistentry id="commands-main-file-quit">
+ <term
+><menuchoice>
+ <shortcut>
+ <keycombo
+><keycap
+>Ctrl</keycap
+><keycap
+>q</keycap
+></keycombo>
+ </shortcut>
+ <guimenu
+>File</guimenu>
+ <guimenuitem
+>Quit</guimenuitem>
+ </menuchoice
+></term>
+ <listitem
+><para
+><action
+>Quits &rosegarden;</action
+></para
+></listitem>
+ </varlistentry>
+
+ </variablelist>
+ </para>
+
+ </sect2>
+
+
+ <sect2>
+ <title
+>Edit menu</title>
+ <para>
+ <variablelist>
+
+ <varlistentry id="commands-main-edit-undo">
+ <term>
+ <menuchoice>
+ <shortcut>
+ <keycombo>
+ <keycap
+>Ctrl</keycap>
+ <keycap
+>z</keycap>
+ </keycombo>
+ </shortcut>
+ <guimenu
+>Edit</guimenu>
+ <guimenuitem
+>Undo</guimenuitem>
+ </menuchoice>
+ </term>
+ <listitem>
+ <para>
+ <action>
+ Reverses the last command performed.
+ </action>
+ </para>
+ </listitem>
+ </varlistentry
+>
+
+ <varlistentry id="commands-main-edit-redo">
+ <term>
+ <menuchoice>
+ <shortcut>
+ <keycombo>
+ <keycap
+>Ctrl</keycap>
+ <keycap
+>Shift</keycap>
+ <keycap
+>z</keycap>
+ </keycombo>
+ </shortcut>
+ <guimenu
+>Edit</guimenu>
+ <guimenuitem
+>Redo</guimenuitem>
+ </menuchoice>
+ </term>
+ <listitem>
+ <para>
+ <action>
+ Repeats the last command performed, following an undo.
+ </action>
+ </para>
+ </listitem>
+ </varlistentry
+>
+
+ <varlistentry id="commands-main-edit-cut">
+ <term>
+ <menuchoice>
+ <shortcut>
+ <keycombo>
+ <keycap
+>Ctrl</keycap>
+ <keycap
+>x</keycap>
+ </keycombo>
+ </shortcut>
+ <guimenu
+>Edit</guimenu>
+ <guimenuitem
+>Cut</guimenuitem>
+ </menuchoice>
+ </term>
+ <listitem>
+ <para>
+ <action>
+ Removes the currently selected segment from the
+ composition view and adds it to the clipboard. Note that
+ when you have selected a track, all segments in that track
+ are selected.
+ </action>
+ </para>
+ </listitem>
+ </varlistentry
+>
+
+ <varlistentry id="commands-main-edit-copy">
+ <term>
+ <menuchoice>
+ <shortcut>
+ <keycombo>
+ <keycap
+>Ctrl</keycap>
+ <keycap
+>c</keycap>
+ </keycombo>
+ </shortcut>
+ <guimenu
+>Edit</guimenu>
+ <guimenuitem
+>Copy</guimenuitem>
+ </menuchoice>
+ </term>
+ <listitem>
+ <para>
+ <action>
+ Removes the selected segments from the composition and
+ places them in the clipboard to replace any contents the
+ clipboard previously had.
+ </action
+>
+ Note that when you have selected a track, all segments in that track
+ are selected.
+ </para>
+ </listitem>
+ </varlistentry
+>
+
+
+ <varlistentry id="commands-main-edit-paste">
+ <term>
+ <menuchoice>
+ <shortcut>
+ <keycombo>
+ <keycap
+>Ctrl</keycap>
+ <keycap
+>v</keycap>
+ </keycombo>
+ </shortcut>
+ <guimenu
+>Edit</guimenu>
+ <guimenuitem
+>Paste</guimenuitem>
+ </menuchoice>
+ </term>
+ <listitem>
+ <para>
+ <action>
+ Inserts the contents of the clipboard into the composition.
+ Verbage hear stating where the contents are inserted
+ (current track, offset within that track etc).
+ </action>
+ </para>
+ </listitem>
+ </varlistentry
+>
+
+ <varlistentry id="commands-main-edit-delete">
+ <term>
+ <menuchoice>
+ <shortcut>
+ <keycombo>
+ <keycap
+>Delete</keycap>
+ </keycombo>
+ </shortcut>
+ <guimenu
+>Edit</guimenu>
+ <guimenuitem
+>Delete</guimenuitem>
+ </menuchoice>
+ </term>
+ <listitem>
+ <para>
+ <action>
+ Removes the selected segments from the composition and throws them away.
+ </action>
+ </para>
+ </listitem>
+ </varlistentry
+>
+
+
+ <varlistentry id="commands-main-edit-select-all-segments">
+ <term>
+ <menuchoice>
+ <guimenu
+>Edit</guimenu>
+ <guimenuitem
+>Select All Segments</guimenuitem>
+ </menuchoice>
+ </term>
+ <listitem>
+ <para>
+ <action>
+ Selects all segments within the composition.
+ </action>
+ </para>
+ </listitem>
+ </varlistentry
+>
+
+ <varlistentry id="commands-main-edit-add-tempo-change">
+ <term>
+ <menuchoice>
+ <guimenu
+>Edit</guimenu>
+ <guimenuitem
+>Add Tempo Change...</guimenuitem>
+ </menuchoice>
+ </term>
+ <listitem>
+ <para>
+ <action>
+ Invokes a tempo change dialog.
+ </action>
+ This offers a
+ selection of ways to change the tempo of the
+ composition, including changing the tempo from the
+ insert cursor position onwards, from the last
+ tempo change onwards, or for the entire
+ composition. See
+
+for more information.
+
+ </para>
+ </listitem>
+ </varlistentry
+>
+
+ <varlistentry id="commands-main-edit-add-time-signature">
+ <term>
+ <menuchoice>
+ <guimenu
+>Edit</guimenu>
+ <guimenuitem
+>Add Time Signature Change...</guimenuitem>
+ </menuchoice>
+ </term>
+ <listitem>
+ <para>
+ <action>
+ Invokes a time-signature change dialog.
+ </action>
+
+ This offers a
+ selection of ways to change the tempo of the
+ composition, including changing the time signature
+ from the insert cursor position onwards or from the
+ start of the current bar. See
+
+ for more information.
+
+ </para>
+ </listitem>
+ </varlistentry
+>
+
+
+ <varlistentry id="commands-main-edit-change-composition-duration">
+ <term>
+ <menuchoice>
+ <guimenu
+>Edit</guimenu>
+ <guimenuitem
+>Change Composition Duration...</guimenuitem>
+ </menuchoice>
+ </term>
+ <listitem>
+ <para>
+ <action>
+ Invokes a composition duration change dialog.
+ </action>
+
+ This allows you to change the overall duration of
+ the composition. This duration sets a hard limit
+ (as a number of bars) on the scrollable width of the
+ main window and the length of time you can play or
+ record before the composition is deemed to have
+ ended. The default is 100 bars.
+
+ </para>
+ </listitem>
+ </varlistentry
+>
+
+
+ <varlistentry id="commands-main-edit-document-properties">
+ <term>
+ <menuchoice>
+ <guimenu
+>Edit</guimenu>
+ <guimenuitem
+>Edit Document Properties...</guimenuitem>
+ </menuchoice>
+ </term>
+ <listitem>
+ <para>
+ <action>
+ Invokes a document properties dialog.
+ </action>
+
+ The document properties dialog allows you to review and/or modify the current document properties. Note - explain what are properties. Note to developers - It seems kinda weird to have icons on the left for selecting, and tabs in each one. Why not just tabs or just the things on the left?
+
+ </para>
+ </listitem>
+ </varlistentry
+>
+
+
+ </variablelist>
+ </para>
+ </sect2>
+
+ <sect2>
+ <title
+>Segments menu</title>
+ <para>
+ <variablelist>
+
+ <varlistentry id="commands-main-segments-open-default-editor">
+ <term>
+ <menuchoice>
+ <shortcut>
+ <keycombo>
+ <keycap
+>Return</keycap>
+ </keycombo>
+ </shortcut>
+ <guimenu
+>Segments</guimenu>
+ <guimenuitem
+>Open in Default Editor</guimenuitem>
+ </menuchoice>
+ </term>
+ <listitem>
+ <para>
+ <action
+> Opens all of the currently
+ selected segments together in a notation editor, or in
+ whichever other editor you have configured as your
+ default.
+ </action>
+ </para>
+ </listitem>
+ </varlistentry
+>
+
+ <varlistentry id="commands-main-segments-open-matrix-editor">
+ <term>
+ <menuchoice>
+ <guimenu
+>Segments</guimenu>
+ <guimenuitem
+>Open in Matrix Editor</guimenuitem>
+ </menuchoice>
+ </term>
+ <listitem>
+ <para>
+ <action
+> Opens all of the currently
+ selected segments in a matrix editor.
+ </action>
+ See <link linkend="matrix-view"
+>matrix editor</link
+>.
+ </para>
+ </listitem>
+ </varlistentry
+>
+
+ <varlistentry id="commands-main-segments-open-notation-editor">
+ <term>
+ <menuchoice>
+ <guimenu
+>Segments</guimenu>
+ <guimenuitem
+>Open in Notation Editor</guimenuitem>
+ </menuchoice>
+ </term>
+ <listitem>
+ <para>
+ <action
+> Opens all of the currently
+ selected segments together in a notation editor.
+ </action>
+ See <link linkend="notation-view"
+>notation editor</link
+>.
+ </para>
+ </listitem>
+ </varlistentry
+>
+
+ <varlistentry id="commands-main-segments-open-event-editor">
+ <term>
+ <menuchoice>
+ <guimenu
+>Segments</guimenu>
+ <guimenuitem
+>Open in Event List Editor</guimenuitem>
+ </menuchoice>
+ </term>
+ <listitem>
+ <para>
+ <action
+> Opens all of the currently
+ selected segments together in a event-list editor.
+ </action>
+ See <link linkend="event-view"
+>event-list editor</link
+>.
+ </para>
+ </listitem>
+ </varlistentry
+>
+
+
+ <varlistentry id="commands-main-segments-quantize">
+ <term>
+ <menuchoice>
+ <guimenu
+>Segments</guimenu>
+ <guimenuitem
+>Quantize...</guimenuitem>
+ </menuchoice>
+ </term>
+ <listitem>
+ <para>
+ <action
+>Invokes a quantization dialog for quantizing the current selection.
+ </action>
+ See <link linkend="nv-quantization"
+>quantization</link
+>.
+ </para>
+ </listitem>
+ </varlistentry
+>
+
+ <varlistentry id="commands-main-segments-rescale">
+ <term>
+ <menuchoice>
+ <guimenu
+>Segments</guimenu>
+ <guimenuitem
+>Rescale...</guimenuitem>
+ </menuchoice>
+ </term>
+ <listitem>
+ <para>
+ <action
+>Allows you to stretch or squash segments in time.
+ </action>
+
+ This option invokes a rescale dialog, which allows
+ you to specify a ratio of timings that is then
+ applied to the selected segments. This has the
+ result of stretching (slowing down) or squashing
+ (speeding up) the selected segments, changing their
+ durations accordingly.
+
+ </para>
+ <para>
+ This only applies to segments containing MIDI
+ events, not to audio segments. Rosegarden does not
+ currently provide native support for audio
+ time-stretching.
+ </para>
+ </listitem>
+ </varlistentry
+>
+
+ <varlistentry id="commands-main-segments-auto-split">
+ <term>
+ <menuchoice>
+ <guimenu
+>Segments</guimenu>
+ <guimenuitem
+>Auto-Split</guimenuitem>
+ </menuchoice>
+ </term>
+ <listitem>
+ <para>
+ <action>
+ Splits the selected segments on silences.
+ </action>
+
+ This function works slightly differently depending
+ on whether the selected segments contain audio or
+ MIDI data. For audio segments, it offers you a
+ dialog in which you can choose a threshold below
+ which the segment is considered "silent"; it then
+ splits the segment whenever its amplitude falls
+ below this threshold. For MIDI segments, it simply
+ splits the segment everywhere that a full bar of
+ silence occurs.
+ </para>
+ </listitem>
+ </varlistentry
+>
+
+ <varlistentry id="commands-main-segments-split-by-pitch">
+ <term>
+ <menuchoice>
+ <guimenu
+>Segments</guimenu>
+ <guimenuitem
+>Split by Pitch...</guimenuitem>
+ </menuchoice>
+ </term>
+ <listitem>
+ <para>
+ <action
+>Splits the currently selected segments into higher and
+ lower parts.
+ </action>
+
+ This function invokes a dialog allowing you to
+ choose a pitch as a "split point", and then splits
+ the selected segments in half with all the notes on
+ or above that split point in the "higher" segment
+ and all the notes below it in the "lower".
+
+ </para>
+ <para>
+ If the music in the segment consists of two separate
+ parts (e.g. left and right hand piano parts) that
+ are not always completely on either side of a single
+ split point, you may with to select the "ranging
+ split-point" option. If this is selected,
+ Rosegarden will attempt to track the two parts as
+ they move up and down, usually doing a slightly
+ better job of separating out notes that were
+ intended to lie in the two separate parts.
+
+ </para>
+ <para>
+ The resulting segments are both created on the same
+ track, with one overlapping the other.
+
+ </para>
+ </listitem>
+ </varlistentry
+>
+
+
+
+
+ </variablelist>
+ </para>
+ </sect2>
+ </sect1>
+
+ <sect1 id="commands-nv">
+ <title
+>Notation editor</title>
+ <para
+></para>
+
+
+ <sect2 id="commands-nv-menu-file">
+ <title
+>File menu</title>
+ <para>
+ <variablelist>
+
+ <varlistentry id="commands-nv-menu-file-close">
+ <term
+><menuchoice>
+ <shortcut>
+ <keycombo
+><keycap
+>Ctrl</keycap
+><keycap
+>w</keycap
+></keycombo>
+ </shortcut>
+ <guimenu
+>File</guimenu>
+ <guimenuitem
+>Close</guimenuitem>
+ </menuchoice
+></term>
+ <listitem
+><para
+><action
+>Closes the window</action
+></para
+></listitem>
+ </varlistentry>
+
+ </variablelist>
+ </para>
+
+ </sect2>
+
+ <sect2 id="commands-nv-menu-edit">
+ <title
+>Edit menu</title>
+ <para>
+ <variablelist>
+
+ <varlistentry id="commands-nv-menu-edit-undo">
+ <term
+><menuchoice>
+ <shortcut>
+ <keycombo
+><keycap
+>Ctrl</keycap
+><keycap
+>z</keycap
+></keycombo>
+ </shortcut>
+ <guimenu
+>Edit</guimenu>
+ <guimenuitem
+>Undo</guimenuitem>
+ </menuchoice
+></term>
+ <listitem>
+ <para>
+ <action>
+
+ Reverses the last edit.
+
+ </action
+> Edits are shared across
+ all views, so if the last edit was not made in
+ this view, undoing it might not appear to change
+ this view either.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry id="commands-nv-menu-edit-redo">
+ <term
+><menuchoice>
+ <shortcut>
+ <keycombo
+><keycap
+>Ctrl</keycap
+><keycap
+>Shift</keycap
+><keycap
+>z</keycap
+></keycombo>
+ </shortcut>
+ <guimenu
+>Edit</guimenu>
+ <guimenuitem
+>Redo</guimenuitem>
+ </menuchoice
+></term>
+ <listitem>
+ <para>
+ <action>
+
+ Repeats the last edit, following an undo.
+
+ </action>
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry id="commands-nv-menu-edit-cut">
+ <term
+><menuchoice>
+ <shortcut>
+ <keycombo
+><keycap
+>Ctrl</keycap
+><keycap
+>x</keycap
+></keycombo>
+ </shortcut>
+ <guimenu
+>Edit</guimenu>
+ <guimenuitem
+>Cut</guimenuitem>
+ </menuchoice
+></term>
+ <listitem>
+ <para>
+ <action>
+
+ Removes the selected events from the composition
+ and places them in the clipboard to replace any
+ contents the clipboard previously had.
+
+ </action>
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry id="commands-nv-menu-edit-copy">
+ <term
+><menuchoice>
+ <shortcut>
+ <keycombo
+><keycap
+>Ctrl</keycap
+><keycap
+>c</keycap
+></keycombo>
+ </shortcut>
+ <guimenu
+>Edit</guimenu>
+ <guimenuitem
+>Copy</guimenuitem>
+ </menuchoice
+></term>
+ <listitem>
+ <para>
+ <action>
+
+ Copies the selected events to the clipboard
+ to replace any contents the clipboard previously had.
+
+ </action>
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry id="commands-nv-menu-edit-paste">
+ <term
+><menuchoice>
+ <shortcut>
+ <keycombo
+><keycap
+>Ctrl</keycap
+><keycap
+>v</keycap
+></keycombo>
+ </shortcut>
+ <guimenu
+>Edit</guimenu>
+ <guimenuitem
+>Paste</guimenuitem>
+ </menuchoice
+></term>
+ <listitem>
+ <para>
+ <action>
+
+ Copies the contents of the clipboard to the
+ location of the insert cursor in the current
+ composition.
+
+ </action>
+
+ The clipboard must not contain
+ multiple segments, and there must be enough
+ space (occupied only by rests) starting at
+ the insert cursor position to accommodate the
+ clipboard's contents.
+
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry id="commands-nv-menu-edit-cut-and-close">
+ <term
+><menuchoice>
+ <shortcut>
+ <keycombo
+><keycap
+>Ctrl</keycap
+><keycap
+>Shift</keycap
+><keycap
+>x</keycap
+></keycombo>
+ </shortcut>
+ <guimenu
+>Edit</guimenu>
+ <guimenuitem
+>Cut and Close</guimenuitem>
+ </menuchoice
+></term>
+ <listitem>
+ <para>
+ <action>
+
+ Removes the selected events from the composition
+ and places them in the clipboard to replace any
+ contents the clipboard previously had, and closes
+ the gap left behind by moving all subsequent
+ events towards the beginning of the composition.
+
+ </action>
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry id="commands-nv-menu-edit-paste-dot-dot-dot">
+ <term
+><menuchoice>
+ <shortcut>
+ <keycombo
+><keycap
+>Ctrl</keycap
+><keycap
+>Shift</keycap
+><keycap
+>v</keycap
+></keycombo>
+ </shortcut>
+ <guimenu
+>Edit</guimenu>
+ <guimenuitem
+>Paste...</guimenuitem>
+ </menuchoice
+></term>
+ <listitem>
+ <para>
+ <action>
+
+ Provides a choice of paste mechanisms with the
+ ability to set one as the default for use in the
+ Paste menu function.
+
+ </action>
+
+ See the section on <link linkend="nv-paste-types"
+>Paste types</link
+> for more information.
+
+ </para>
+ </listitem>
+ </varlistentry>
+
+
+ <varlistentry id="commands-nv-menu-edit-delete">
+ <term
+><menuchoice>
+ <shortcut>
+ <keycombo
+><keycap
+>Del</keycap
+></keycombo>
+ </shortcut>
+ <guimenu
+>Edit</guimenu>
+ <guimenuitem
+>Delete</guimenuitem>
+ </menuchoice
+></term>
+ <listitem>
+ <para>
+ <action>
+ Removes the selected events from the composition
+ and throws them away.
+ </action>
+ </para>
+ </listitem>
+ </varlistentry>
+
+
+ <varlistentry id="commands-nv-menu-edit-select-from-start">
+ <term
+><menuchoice>
+ <guimenu
+>Edit</guimenu>
+ <guimenuitem
+>Select from Start</guimenuitem>
+ </menuchoice
+></term>
+ <listitem>
+ <para>
+ <action>
+ Extends the current selection by selecting
+ all events from the start of the staff up to the
+ current selection (or up to the insert cursor,
+ if no events are currently selected).
+ </action>
+ </para>
+ </listitem>
+ </varlistentry>
+
+
+ <varlistentry id="commands-nv-menu-edit-select-to-end">
+ <term
+><menuchoice>
+ <guimenu
+>Edit</guimenu>
+ <guimenuitem
+>Select to End</guimenuitem>
+ </menuchoice
+></term>
+ <listitem>
+ <para>
+ <action>
+ Extends the current selection by selecting
+ all events from the end of the current selection
+ (or from the insert cursor, if no events are
+ currently selected) up to the end of the staff.
+ </action>
+ </para>
+ </listitem>
+ </varlistentry>
+
+
+ <varlistentry id="commands-nv-menu-edit-select-whole-staff">
+ <term
+><menuchoice>
+ <guimenu
+>Edit</guimenu>
+ <guimenuitem
+>Select Whole Staff</guimenuitem>
+ </menuchoice
+></term>
+ <listitem>
+ <para>
+ <action>
+ Selects all the events on the current staff.
+ </action>
+ </para>
+ </listitem>
+ </varlistentry>
+
+
+ <varlistentry id="commands-nv-menu-edit-clear-selection">
+ <term
+><menuchoice>
+ <shortcut>
+ <keycombo
+><keycap
+>Esc</keycap
+></keycombo>
+ </shortcut>
+ <guimenu
+>Edit</guimenu>
+ <guimenuitem
+>Clear Selection</guimenuitem>
+ </menuchoice
+></term>
+ <listitem>
+ <para>
+ <action>
+ Unselects all events.
+ </action>
+ </para>
+ </listitem>
+ </varlistentry>
+
+
+ <varlistentry id="commands-nv-menu-edit-filter-selection">
+ <term
+><menuchoice>
+ <guimenu
+>Edit</guimenu>
+ <guimenuitem
+>Filter Selection</guimenuitem>
+ </menuchoice
+></term>
+ <listitem>
+ <para>
+ <action>
+ Invokes an event filter dialog.
+ </action>
+ This offers you the ability to filter a range of events in
+ any of several categories out of your selection.
+ </para>
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-eventfilter.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase
+>The event filter dialog</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+ <para>
+ All ranges may be either inclusive or exclusive.
+ </para>
+ <para>
+ An inclusive range will remove events on either side of it
+ from the selection. You can use this, for example, to
+ filter everything below middle C and above the A above
+ middle C out of your selection.
+ </para>
+ <para>
+ An exclusive range will remove the events within the range
+ itself, leaving everything on either side of it selected.
+ Using the same search points as in the previous example,
+ you would use an exclusive range to remove everything
+ between middle C and the A above middle C from your
+ selection, while leaving everything above and below that
+ range selected.
+ </para>
+ <para>
+ Once your selection has been filtered, you can manipulate
+ it by any conventional means.
+ </para>
+ </listitem>
+ </varlistentry>
+
+
+ <varlistentry id="commands-nv-menu-edit-add-tempo">
+ <term
+><menuchoice>
+ <guimenu
+>Edit</guimenu>
+ <guimenuitem
+>Add Tempo Change...</guimenuitem>
+ </menuchoice
+></term>
+ <listitem>
+ <para>
+ <action>
+ Invokes a tempo change dialog.
+ </action>
+ This offers a
+ selection of ways to change the tempo of the
+ composition, including changing the tempo from the
+ insert cursor position onwards, from the last
+ tempo change onwards, or for the entire
+ composition. See
+
+for more information.
+ </para>
+ </listitem>
+ </varlistentry>
+
+
+ <varlistentry id="commands-nv-menu-edit-add-time-signature">
+ <term
+><menuchoice>
+ <guimenu
+>Edit</guimenu>
+ <guimenuitem
+>Add Time Signature Change...</guimenuitem>
+ </menuchoice
+></term>
+ <listitem>
+ <para>
+ <action>
+
+ Invokes a time-signature change dialog.
+
+ </action>
+
+ This offers a
+ selection of ways to change the tempo ofthe
+ composition, including changing the time signature
+ from the insert cursor position onwards or from the
+ start of the current bar. See
+Changing the Time Signature
+
+ for more information.
+
+ </para>
+ </listitem>
+ </varlistentry>
+
+
+ <varlistentry id="commands-nv-menu-edit-add-clef">
+ <term
+><menuchoice>
+ <guimenu
+>Edit</guimenu>
+ <guimenuitem
+>Add Clef Change...</guimenuitem>
+ </menuchoice
+></term>
+ <listitem>
+ <para>
+ <action>
+
+ Invokes a clef selection dialog, and inserts the
+ chosen clef at the current insert cursor position.
+
+ </action>
+
+ The dialog allows you to choose a clef, but also
+ to choose how you want the clef to be applied, in
+ cases where there are already some notes following
+ the point where the clef is to be inserted. You
+ must choose one of the following:
+
+ <variablelist>
+
+ <varlistentry>
+ <term
+>Maintain current pitches</term>
+ <listitem>
+ <para>
+ Any notes following the clef will keep
+ their current performance pitches.
+ </para>
+ <para>
+ For example, inserting a
+ tenor clef in the middle of a previously
+ treble-clef section will cause the notes following
+ the clef to be moved an octave
+ higher up the staff, because they will still have
+ their treble-clef pitches.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>Transpose into appropriate octave</term>
+ <listitem>
+ <para>
+ Any notes following the clef will
+ retain their pitch within the octave, but
+ may be moved into a different octave to
+ match the new clef, and therefore will play
+ at a new pitch.
+ </para>
+ <para>
+ For example, inserting a tenor clef in the
+ middle of a previously treble-clef section
+ will cause the notes following the clef to
+ move by one staff line only to adjust to the new
+ clef, but to play an octave lower than before.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ </variablelist>
+
+ </para>
+ </listitem>
+ </varlistentry>
+
+
+ <varlistentry id="commands-nv-menu-edit-add-key-signature">
+ <term
+><menuchoice>
+ <guimenu
+>Edit</guimenu>
+ <guimenuitem
+>Add Key Change...</guimenuitem>
+ </menuchoice
+></term>
+ <listitem>
+ <para>
+ <action>
+
+ </action>
+ </para>
+ </listitem>
+ </varlistentry>
+
+
+ </variablelist>
+ </para>
+
+ </sect2>
+
+ <sect2 id="commands-nv-menu-group">
+ <title
+>Group menu</title>
+ <para>
+ <variablelist>
+
+
+ <varlistentry id="commands-nv-menu-group-beam">
+ <term
+><menuchoice>
+ <guimenu
+>Group</guimenu>
+ <guimenuitem
+>Beam Group</guimenuitem>
+ </menuchoice
+></term>
+ <listitem>
+ <para>
+ <action>
+ Makes the selected notes into a beamed group.
+ </action>
+ </para>
+ </listitem>
+ </varlistentry>
+
+
+ <varlistentry id="commands-nv-menu-group-auto-beam">
+ <term
+><menuchoice>
+ <guimenu
+>Group</guimenu>
+ <guimenuitem
+>Auto-Beam</guimenuitem>
+ </menuchoice
+></term>
+ <listitem>
+ <para>
+ <action>
+ Scans the area covered by the selection and attempts
+ to group short notes into plausible beamed groups.
+ </action>
+ </para>
+ </listitem>
+ </varlistentry>
+
+
+ <varlistentry id="commands-nv-menu-group-break-group">
+ <term
+><menuchoice>
+ <guimenu
+>Group</guimenu>
+ <guimenuitem
+>Unbeam</guimenuitem>
+ </menuchoice
+></term>
+ <listitem>
+ <para>
+ <action>
+ Removes the selected notes from any beamed groups
+ they may be part of, leaving them as separate
+ individuals.
+ </action>
+ If part of a beamed group is selected, the unselected
+ part of the group will remain beamed.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry id="commands-nv-menu-group-tuplet">
+ <term
+><menuchoice>
+ <guimenu
+>Group</guimenu>
+ <guimenuitem
+>Tuplet</guimenuitem>
+ </menuchoice
+></term>
+ <listitem>
+ <para>
+ <action>
+ Makes a triplet or other tuplet group.
+ </action>
+ This function allows you to adjust the timing of a
+ short section of music in the ratio of two
+ durations, for example to indicate that three notes
+ should be played in the time of two (the classic
+ triplet), or nine in the time of six, or whatever.
+ You can set this ratio in a dialog box when you
+ invoke the function.
+ </para>
+ <para>
+ If you have selected some events before invoking the
+ function, it will assume that you want to make a
+ tuplet group out of the selected region (or as close
+ to its duration as possible) and will adjust the
+ default values available in the dialog accordingly.
+ </para>
+ </listitem>
+ </varlistentry>
+
+
+ <varlistentry id="commands-nv-menu-group-simple-tuplet">
+ <term
+><menuchoice>
+ <guimenu
+>Group</guimenu>
+ <guimenuitem
+>Simple Tuplet</guimenuitem>
+ </menuchoice
+></term>
+ <listitem>
+ <para>
+ <action>
+
+ Makes a tuplet group (normally of triplets) with
+ the most apparently obvious ratio of durations.
+
+ </action>
+ Usually this function will attempt to make a triplet
+ group starting at the current insert cursor, or if
+ some events are selected, will attempt to make them
+ into triplets. It is possible that it might end up
+ making non-triplet groups if there is no obvious
+ valid triplet arrangement.
+ </para>
+ </listitem>
+ </varlistentry>
+
+
+ <varlistentry id="commands-nv-menu-group-grace">
+ <term
+><menuchoice>
+ <guimenu
+>Group</guimenu>
+ <guimenuitem
+>Make Grace Notes</guimenuitem>
+ </menuchoice
+></term>
+ <listitem>
+ <para>
+ <action>
+ Converts the selected notes into grace notes.
+ </action>
+ </para>
+ </listitem>
+ </varlistentry>
+
+
+
+ <varlistentry id="commands-nv-menu-group-ungrace">
+ <term
+><menuchoice>
+ <guimenu
+>Group</guimenu>
+ <guimenuitem
+>Ungrace</guimenuitem>
+ </menuchoice
+></term>
+ <listitem>
+ <para>
+ <action>
+ Converts any grace notes in the selection to
+ normal notes.
+ </action>
+ </para>
+ </listitem>
+ </varlistentry>
+
+
+
+ <varlistentry id="commands-nv-menu-group-slur">
+ <term
+><menuchoice>
+ <guimenu
+>Group</guimenu>
+ <guimenuitem
+>Slur</guimenuitem>
+ </menuchoice
+></term>
+ <listitem>
+ <para>
+ <action>
+ Adds a slur across the selected notes.
+ </action>
+ To remove the slur, click on it
+ with the erase tool just as you would for a note.
+ </para>
+ </listitem>
+ </varlistentry>
+
+
+
+ <varlistentry id="commands-nv-menu-group-crescendo">
+ <term
+><menuchoice>
+ <guimenu
+>Group</guimenu>
+ <guimenuitem
+>Crescendo</guimenuitem>
+ </menuchoice
+></term>
+ <listitem>
+ <para>
+ <action>
+ Adds a crescendo (opening hairpin) indication
+ across the selected notes.
+ </action>
+ To remove the crescendo indication, click on it
+ with the erase tool just as you would for a note.
+ </para>
+ </listitem>
+ </varlistentry>
+
+
+
+ <varlistentry id="commands-nv-menu-group-decrescendo">
+ <term
+><menuchoice>
+ <guimenu
+>Group</guimenu>
+ <guimenuitem
+>Decrescendo</guimenuitem>
+ </menuchoice
+></term>
+ <listitem>
+ <para>
+ <action>
+ Adds a decrescendo (closing hairpin) indication
+ across the selected notes.
+ </action>
+ To remove the decrescendo indication, click on it
+ with the erase tool just as you would for a note.
+ </para>
+ </listitem>
+ </varlistentry>
+
+
+ </variablelist>
+ </para>
+
+ </sect2>
+
+ <sect2 id="commands-nv-menu-notes">
+ <title
+>Notes menu</title>
+ <para>
+ <variablelist>
+
+ <varlistentry id="commands-nv-menu-notes-">
+ <term
+><menuchoice>
+ <guimenu
+>Notes</guimenu>
+ <guimenuitem
+></guimenuitem>
+ </menuchoice
+></term>
+ <listitem>
+ <para>
+ <action>
+
+ </action>
+ </para>
+ </listitem>
+ </varlistentry>
+
+
+ <varlistentry id="commands-nv-menu-notes-style-actionmenu">
+ <term
+><menuchoice>
+ <guimenu
+>Notes</guimenu>
+ <guimenuitem
+>Note Style</guimenuitem>
+ </menuchoice
+></term>
+ <listitem>
+ <para>
+ <action>
+ Change the note style of the selected notes.
+ </action>
+ This submenu contains an entry for each of the <link
+ linkend="nv-note-styles"
+>note
+ styles</link
+> that are currently available. Choosing one
+ will change the note style of the selected notes to
+ that style.
+ </para>
+ </listitem>
+ </varlistentry>
+
+
+ <varlistentry id="commands-nv-menu-notes-stems">
+ <term
+><menuchoice>
+ <guimenu
+>Notes</guimenu>
+ <guimenuitem
+>Stem Direction</guimenuitem>
+ </menuchoice
+></term>
+ <listitem>
+ <para>
+ <action>
+ Change the stem
+ direction of the selected notes.
+ </action>
+ This submenu allows you to specify that all the
+ <link linkend="nv-note-qualities"
+>stems</link
+> of
+ the selected notes should point up or down, plus an
+ entry to reset the stem directions to those that
+ Rosegarden originally chose for the notes.
+ </para>
+ </listitem>
+ </varlistentry>
+
+
+ <varlistentry id="commands-nv-menu-notes-slashes">
+ <term
+><menuchoice>
+ <guimenu
+>Notes</guimenu>
+ <guimenuitem
+>Slashes</guimenuitem>
+ </menuchoice
+></term>
+ <listitem>
+ <para>
+ <action>
+ Add diagonal
+ slashes across the selected notes' stems.
+ </action>
+ This submenu allows you to choose a number of
+ diagonal strokes or <link linkend="nv-note-qualities"
+>slashes</link
+> to be drawn across the
+ stems of each of the selected notes. These may be
+ used, for example, to indicate repetition or rolls
+ to a human reader. They do not (yet) affect
+ performance using Rosegarden.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ </variablelist>
+ </para>
+
+ </sect2>
+
+ <sect2 id="commands-nv-menu-marks">
+ <title
+>Marks menu</title>
+ <para>
+ <variablelist>
+ <varlistentry>
+ <term
+><menuchoice>
+ <guimenu
+>blah</guimenu>
+ <guimenuitem
+>blah</guimenuitem>
+ </menuchoice
+></term>
+ <listitem>
+ <para
+>to be continued</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </para>
+
+ </sect2>
+
+ <sect2 id="commands-nv-menu-transforms">
+ <title
+>Transforms menu</title>
+ <para>
+ <variablelist>
+
+ <varlistentry id="commands-nv-menu-transforms-normalize-rests">
+ <term
+><menuchoice>
+ <guimenu
+>Transforms</guimenu>
+ <guimenuitem
+>Normalize Rests</guimenuitem>
+ </menuchoice
+></term>
+ <listitem>
+ <para>
+ <action
+>Makes the rests in the selection
+ theoretically correct.</action>
+
+ This function examines each sequence of consecutive
+ rests found in the selection, and adjusts, splits
+ and merges rests as necessary to ensure that the
+ rests have theoretically correct durations and fall
+ on the correct boundaries.
+ </para>
+
+ <para
+>For example, a 4/4 bar containing a crotchet
+ (quarter-note), then a minim (half-note) rest and a
+ crotchet rest will be rearranged to place the crotchet
+ rest first, as the minim rest should not cross the
+ central beat boundary of the bar.
+ </para>
+
+ <para
+>This function is also useful in occasional
+ situations where Rosegarden has made a bad job of
+ maintaining the rests correctly within a bar, for
+ example when editing imported &MIDI; data. Normalizing
+ the rests will usually make the arrangement of notes
+ in such a situation a bit clearer. (Rosegarden always
+ normalizes the rests as a matter of course when
+ importing or recording &MIDI;, but things can sometimes
+ get muddled up again.)</para>
+
+ </listitem>
+ </varlistentry>
+
+ <varlistentry id="commands-nv-menu-transforms-collapse-rests">
+ <term
+><menuchoice>
+ <guimenu
+>Transforms</guimenu>
+ <guimenuitem
+>Collapse Rests</guimenuitem>
+ </menuchoice
+></term>
+ <listitem>
+ <para>
+ <action
+>Makes multiple short rests into fewer longer
+ ones.</action>
+
+ This function merges consecutive rests into longer
+ rests, wherever possible. That is, wherever two
+ consecutive rests in the selection are found to have
+ a total duration expressible as a single longer
+ rest, they will be merged.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry id="commands-nv-menu-transforms-collapse-notes">
+ <term
+><menuchoice>
+ <guimenu
+>Transforms</guimenu>
+ <guimenuitem
+>Collapse Equal-Pitch Notes</guimenuitem>
+ </menuchoice
+></term>
+ <listitem>
+ <para>
+ <action
+>Makes multiple short notes into fewer longer
+ ones.</action>
+
+ This function merges consecutive notes into longer
+ notes, wherever possible. That is, wherever two
+ consecutive notes of equal pitch in the selection
+ are found to have a total duration expressible as a
+ single longer note, they will be merged.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry id="commands-nv-menu-transforms-tie-notes">
+ <term
+><menuchoice>
+ <guimenu
+>Transforms</guimenu>
+ <guimenuitem
+>Tie Equal-Pitch Notes</guimenuitem>
+ </menuchoice
+></term>
+ <listitem>
+ <para
+><action
+>Ties consecutive notes whenever possible.</action>
+
+ This function ties together any consecutive notes of
+ equal pitch found in the selection. Tied notes are
+ shown with a curved line joining the note heads, and
+ are played as a single long note.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry id="commands-nv-menu-transforms-untie-notes">
+ <term
+><menuchoice>
+ <guimenu
+>Transforms</guimenu>
+ <guimenuitem
+>Untie Notes</guimenuitem>
+ </menuchoice
+></term>
+ <listitem>
+ <para
+><action
+>Breaks ties between notes.</action>
+
+ Any tied notes found in the selection are untied,
+ and will subsequently be played as separate
+ notes.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry id="commands-nv-menu-transforms-make-viable">
+ <term
+><menuchoice>
+ <guimenu
+>Transforms</guimenu>
+ <guimenuitem
+>Make Notes Viable</guimenuitem>
+ </menuchoice
+></term>
+ <listitem>
+ <para
+><action
+>Splits notes at displayable
+ durations.</action
+> This function is intended to deal
+ with notes that have excessively long durations that
+ overflow barlines or that are too long to be displayed
+ as a single note. It takes any such notes and splits
+ them into shorter, tied notes.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry id="commands-nv-menu-transforms-de-counterpoint">
+ <term
+><menuchoice>
+ <guimenu
+>Transforms</guimenu>
+ <guimenuitem
+>De-Counterpoint</guimenuitem>
+ </menuchoice
+></term>
+ <listitem>
+ <para
+><action
+>Turns counterpoint into a series of split-and-tied notes and chords.</action>
+
+ &rosegarden; has no explicit support for counterpoint
+ (multiple lines of notes edited separately on the
+ same staff), but it will do its best to approximate
+ it when it finds notes in a segment that are
+ apparently contrapuntal, i.e. that overlap but that
+ are not precise enough to be treated as chords. For
+ example, when a short note starts shortly after a
+ longer note, Rosegarden will show the longer note
+ and a short <quote
+>spacing</quote
+> rest together, followed by the
+ shorter note. Unfortunately this often isn't what
+ you want.
+ </para>
+
+ <para
+>The De-Counterpoint function can be applied to a
+ selection that contains overlapping notes. It will
+ split overlapping notes at the point where they
+ overlap, and tie together the resulting split notes,
+ ensuring that the music takes the form of a series of
+ chords and/or single notes starting and ending in neat
+ blocks, with some notes possibly tied.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry id="commands-nv-menu-transforms-quantize">
+ <term
+><menuchoice>
+ <guimenu
+>Transforms</guimenu>
+ <guimenuitem
+>Quantize...</guimenuitem>
+ </menuchoice
+></term>
+ <listitem>
+ <para
+><action
+>Quantizes the selection.</action
+></para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry id="commands-nv-menu-transforms-fix-smoothing">
+ <term
+><menuchoice>
+ <guimenu
+>Transforms</guimenu>
+ <guimenuitem
+>Fix Smoothed Values</guimenuitem>
+ </menuchoice
+></term>
+ <listitem>
+ <para
+><action
+>Makes the note durations in the current
+ view permanent.</action>
+
+ When notating recorded or performance &MIDI;,
+ Rosegarden usually has to round off the durations of
+ some notes so that they can be displayed as normal
+ note types. This is known as <link
+ linkend="nv-quantization"
+>smoothing</link
+>, and it
+ normally does not affect the notes actually played,
+ it's just a convenience for display. The Fix
+ Smoothed Values function takes the current smoothed
+ note durations and sets them such that they are used
+ for performance (and editing in the matrix view,
+ etc) as well as for notation.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry id="commands-nv-menu-transforms-interpret">
+ <term
+><menuchoice>
+ <guimenu
+>Transforms</guimenu>
+ <guimenuitem
+>Interpret...</guimenuitem>
+ </menuchoice
+></term>
+ <listitem>
+ <para
+><action
+>Modifies the velocities and timings of
+ notes according to any written or indicated dynamics
+ found.</action
+> The selection of interpretations
+ available is as follows:
+
+ <variablelist>
+ <varlistentry>
+ <term
+>Apply text dynamics (p, mf, ff etc)
+ </term>
+ <listitem
+><para
+> Sets a velocity to each note
+ based on the last piece of text of "Dynamic"
+ type seen on the same staff (only texts of the
+ form pp, p, mp, mf, f, ff, fff etc are matched).
+ </para
+></listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>Apply hairpin dynamics
+ </term>
+ <listitem
+><para
+> Makes the notes gradually
+ increase or decrease in velocity during a
+ crescendo or decrescendo hairpin.
+ </para
+></listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>
+ Stress beats
+ </term>
+ <listitem
+><para
+> Makes notes that land on bar or
+ beat boundaries slightly louder (greater
+ velocity) than the surrounding notes.
+ </para
+></listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>
+ Articulate slurs, staccato, tenuto etc
+ </term>
+ <listitem
+><para
+> Shortens unslurred notes,
+ shortens staccato notes more, and gives notes
+ inside slurs and tenuto notes their full length.
+ </para
+></listitem>
+ </varlistentry>
+ </variablelist>
+
+ </para>
+
+ </listitem>
+ </varlistentry>
+
+ <varlistentry id="commands-nv-menu-transforms-transpose">
+ <term
+><menuchoice>
+ <guimenu
+>Transforms</guimenu>
+ <guimenuitem
+>Transpose</guimenuitem>
+ </menuchoice
+></term>
+ <listitem>
+ <para
+><action
+>Alters the pitch of the selected
+ notes.</action
+> This submenu contains basic
+ transposition functions which move the selected notes
+ up or down a semitone or a whole octave in pitch, as
+ well as a general transpose function that allows you
+ to choose how far up or down you want to transpose the
+ selection.
+ </para>
+
+ <para
+>These functions simply change the stored pitches
+ of the notes in the selection, so that they both play
+ and appear at the new pitches. They do not deal with
+ performance transposition (displaying one pitch and
+ playing another), for which see the main window's
+ segment parameter box; nor do they help you with
+ transposing from one key into another, for which see
+ the <link
+ linkend="commands-nv-menu-edit-add-key-signature"
+>key
+ change</link
+> function.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ </variablelist>
+ </para>
+
+ </sect2>
+
+
+ </sect1>
+ </chapter>
+
+-->
+
+
+ <!--
+ **********************************
+
+ PART III:
+ Technical material
+
+ **********************************
+ -->
+
+ <chapter id="developers">
+ <title
+>Personalizando Rosegarden</title>
+
+ <sect1 id="developers-note-fonts">
+ <title
+>Configurando fuentes de notación personales</title>
+
+ <para
+>Si dispone de una fuente de notación en su sistema en un formato escalable (TrueType o Type-1) pero no es actualmente soportado por Rosegarden, puede crear su propio archivo de mapeo XML para describir el mapa de caracteres y métrica de la fuente de una forma que Rosegarden pueda usar. Éstos archivosson instalados en el subdirectorio fonts/mapping del directorio de instalación de Rosegarden, y un número de ejemplos son incluídos con la distribución.</para>
+
+ <para
+>También puede usar estos archivos de mapeo para definir nuevas fuentes basadas en mapas de pixeles (pixmaps), donde cada forma en un tamaño particular es cargada de un mapa de pixeles diferente. Las dos fuentes estándar de notación proveídas con Rosegarden-4 son fuentes de mapa de pixeles definidas en exactamente ésta forma. </para>
+
+ <para
+>Es incluso posible definir una fuente de notación usando una o mas fuentes escalables del sistema, aumentadas con mapas de pixeles para tamaños particulares o para caracteres que no se encuentran en fuentes escalables. Ésto es porquela mayoría del formato del archivo de mapeo es el mismo para fuentes escalables y de mapa de pixeles, y cuando hay diferentes elementos para los diferentes tipos de fuentes, es usualmente posible incluir ambos de ellos. Rosegarden va a usar usualmente mapas de pixeles donde se los disponga y fuentes escalables en caso contrario. </para>
+
+ <para
+>Quizás quiera editar los archivos de mapeo provistos con Rosegarden si encuentra que sus dimensiones para alineación o tamaño no son de su preferencia (si cree que cualquiera de los archivos provistos están equivocados, por favor háganoslo saber). </para>
+
+ <sect2 id="developers-note-fonts-codes-glyphs">
+ <title
+>Codas y Glipses</title>
+
+ <para
+></para>
+ </sect2>
+
+ <sect2 id="developers-note-fonts-mapping-format">
+ <title
+>Formato de mapeo XML de las fuentes de notación</title>
+
+ <para
+>Aquí hay un sumario de los elementos XML que pueden ser usados en el archivo de mapeo de fuentes.</para>
+
+ <sect3 id="developers-note-fonts-mapping-format-font-encoding">
+ <title
+>rosegarden-font-encoding</title>
+
+ <para
+>Éste elemento debe existir en cada archivo de mapeo, y debe contener a el resto de los elementos. El único atributo es "name" (nombre), que contiene el nombre de la fuente que es mostrado el el menú desplegable de selección de fuentes. Aunque éste formato de archivo va a permitir que cualquier nombre se utilice aquí, Rosegarden solo usará la fuente correctamente si el archivo XML tiene el mismo nombre que los contenidos de éste atributo (excepto que el archivo XML sea nombrado en minúsculas y termine en ".xml"). </para>
+ </sect3>
+
+ <sect3 id="developers-note-fonts-mapping-format-font-information">
+ <title
+>font-information</title>
+
+ <para
+>Éste debe normalmente ser el primer elemento hijo de "rosegarden-font-encoding". Puede tener alguno de los siguientes atributos, todos ellos opcionales: <variablelist>
+ <varlistentry>
+ <term
+>origin</term>
+ <listitem>
+ <para
+>Una descripción textual del origen de la fuente mapeada (no del origen del archivo de mapeo).</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>copyright</term>
+ <listitem>
+ <para
+>Una descripción textual del estátus del derecho de copia (copyright) de la fuente mapeada (no el estátus de copyright del archivo de mapeo). Note que debido a que el archivo de mapeo contenga información como el origen y copyright de la fuente misma, es usualmente recomendable hacer archivos de mapeo separados para fuentes separadas mientras sea práctico, incluso si las fuentes compartem otros datos de mapeo.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>mapped-by</term>
+ <listitem>
+ <para
+>El nombre del creador del archivo de mapeo (i.e. usted, presumiblemente).</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>type</term>
+ <listitem>
+ <para
+>El tipo de la fuente. éste atributo debe contener uno de los valores "pixmap" o "scalable". Las fuentes que son cargadas en el sistema de ventanas están disponibles para Rosegarden como fuentes estándar del sistema del tipo "scalable", las fuentes que necesitan ser cargadas de archivos de mapa de pixeles correspondientes a tamaños individuales de mapa de pixeles (como las fuentes feta y rg21 incluídas en Rosegarden) son del tipo "pixmap".</para>
+
+ <para
+>Ésta información pretende ser solo para referencia del usuario, realmente no es usada por Rosegarden. En la práctica, para una fuente es legítimo ser una mezcla de los dos, pero en general asumiremos en ésta documentación que una fuente es o escalable o de mapa de pixeles.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>smooth</term>
+ <listitem>
+ <para
+>Un atributo booleano que indica si la fuente utiliza antialiasing (suave o smooth) o no. Debe tener el valor "true" (verdadero) o "false" (falso). Si la fuente es suave (smooth), otros elementos como ligaduras que no son generados desde la fuente serán también suaves (antialiased).</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>autocrop</term>
+ <listitem>
+ <para
+>Sólo importante para fuentes escalables (del sistema). Rosegarden normalmente espera que las medidas de una fuente contengan las mas pequeñas cajas contenedoras para elementos como cabezas de notas y acentos, mas que incluir espacio libre por sobre o debajo de éstos elementos para propósitos de alineación. La mayoría de las fuentes no hacen lo que Rosegarden espera. Por lo tanto, éstas fuentes deben setar el atrubuto autocrop a "true"; luego Rosegarden va a recortar cualquier espacio innecesario de la parte superior o inferior de éstos elementos cuando los renderiza.</para>
+ </listitem>
+ </varlistentry>
+
+ </variablelist>
+
+ </para>
+ </sect3>
+
+ <sect3 id="developers-note-fonts-mapping-format-font-requirements">
+ <title
+>font-requirements</title>
+ <para
+>Éste elemento es solo importante para fuentes escalables. es usado para especificar que ésta fuente debe solo ser ofrecida si ciertos tipos de fuentes se encuentran disponibles, como también para asociar IDs con aquellas fuentes del sistema a las que referirse en el elemento <link linkend="developers-note-fonts-mapping-format-font-symbol-map"
+>font-symbol-map</link
+>. Éste esquema es usado para decidir que fuentes de notación deben ser ofrecidas al usuario, y también permite crear una fuente de notación para Rosegarden desde mas de una fuente de sistema si así lo desea. </para>
+ <para
+>El elemento "font-requirements" debe contener una lista de elementos "font-requirement" hijos. Cada uno de ellos tiene dos atributos: "font-id", contiene un ID numéricode su preferencia para referirse en otro lugar del archivo, y también un atributo "nme" o "names". Si se utiliza "name", se interpretará como el nombre de una sola fuente del sistema asociada al id de la fuente; si se utiliza "names", será tratado como una lista separada por comasde fuentes del sistema, y la primera que se encuentre será asociada al id de fuente. </para>
+ </sect3>
+
+ <sect3 id="developers-note-fonts-mapping-format-font-sizes">
+ <title
+>font-sizes</title>
+
+ <para
+>El elemento "font-sizes" especifica que tamaños de fuente de notación se encuentran disponibles, y como los tamaños de fuente nominales se relacionan con las dimensiones de elementos no-fuente como plicas, pentagramas y ligaduras. El atributo "size" (tamaño) de una fuente de notación se asume de ser la distancia en pixeles entre lineas del pentagrama, o mas precisamente, la altura de una cabeza de nota convencional que rellena completamente el espacio entre líneas: por lo tanto, el tamaño no incluye el grosor o la proximidad de las líneas del pentagrama. </para>
+
+ <para
+>Existen dos posibles elementos hijos de "font-sizes": "font-scale" y "font-size". Su uso depende del tipo de fuente que se está describiendo.</para>
+
+ <para
+>Para fuentes de mapa de pixeles (no escalables), el elemento "font-sizes" debe contener una lista de elementos "font-size", uno para cada tamaño de mapa de bits disponible. Los mapas de bits por sí mismos deben ser instalados en el subdirectorio fonts/&lt;font-name&gt;/&lt;font-size&gt; del directorio de instalación de Rosegarden, donde &lt;font-name&gt;es el nombre de la fuente (como fué especificado en el elemento "rosegarden-font-encoding" al comienzo del archivo de mapeo), o una versión en minúsculas del nombre, y &lt;font-size&gt; es el tamaño en pixeles de la fuente. Un tamaño específico será disponible al usuario solo si tiene una entrada en la lista "font-sizes" y el directorio de mapa de pixeles es encontrado. </para>
+
+ <para
+>Para fuentes escalables, el elemento "font-sizes" debería contener un elemento "font-scale" que define la relación entre elementos de fuente y no-fuente en una forma general, y también define la relación entre el tamaño nominal de fuente de Rosegarden y el tamaño de la fuente de sistema correspondiente. Si el elemento "font-scale" no se encontrara, entonces Rosegarden asumirá que la fuente se encuentra disponible en cualquier tamaño. De todas maneras se puede incluir uno o mas elementos "font-size" para definir proporciones precisaspara cualquier tipo particular de tamaño para los cuales las proporciones generales no funcionan correctamente, por ejemplo debido a un error de redondeo. </para>
+
+ <para
+>Los atributos de "font-scale" y "font-size" son muy similares. La diferencia principal es que todos los atributos de "font-scale" son valores de punto flotante relativos al tamaño de la fuente, donde 1.0 es el tamaño de la fuente base (i.e. la distancia entre líneas del pentagrama), mientras que los atributos de "font-size" son valores enteros de pixeles. Los atributos disponibles son los siguientes. Aquellos marcados como "optional" tienen resultados vagamente sensibles, por lo que es una buena idea tratar de no setearlos primero. </para>
+
+ <variablelist>
+
+ <varlistentry>
+ <term
+>note-height</term>
+ <listitem>
+ <para
+>Éste atributo se encuentra disponible solo para el elemento "font-size", y es obligatorio en ése elemento. Define el tamaño base de la fuente en el cuál los otros atributos se aplican, y un tamaño que será ofrecido al usuario y usado al momento de buscar mapas de pixeles para ésta fuente.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>font-height</term>
+ <listitem>
+ <para
+>Puede ser usado tanto en "font-size" como en "font-scale". Es sólo relevante para fuentes escalables, pero es obligatorio para ellos si es usado en el elemento "font-scale". Define el tamaño de la fuente de sistema usada para dibujar un tamaño dado de fuente de notación.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>beam-thickness</term>
+ <listitem>
+ <para
+>Opcional. Define el grosor de una ligadura.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>staff-line-thickness</term>
+ <listitem>
+ <para
+>Opcional. Define el grosor de una línea de pentagrama.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>stem-thickness</term>
+ <listitem>
+ <para
+>Opcional. Define la anchura de un note stem.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>flag-spacing</term>
+ <listitem>
+ <para
+>Opcional. Define el espacio entre note flags en los casos en donde se dibujan múltiples flags repitiendo uno muchas veces.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>border-x</term>
+ <listitem>
+ <para
+>Opcional. Especifica que los mapas de pixels de los note heads tienen un área fija a derecha e izquierda que no debe ser considerada parte del mismo. Este atributo fija la anchura de ese área.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>border-y</term>
+ <listitem>
+ <para
+>Opcional. Especifica que los mapas de pixels de los note heads tienen un área fija arriba y abajo que no debe ser considerada parte del mismo. Este atributo fija la anchura de ese área.</para>
+ </listitem>
+ </varlistentry>
+
+ </variablelist>
+ </sect3>
+
+ <sect3 id="developers-note-fonts-mapping-format-font-symbol-map">
+ <title
+>mapa tipo de letra-simbolo</title>
+ <para
+>Este elemento lista los símbolos disponibles en este tipo de letra, y desde que archivos de mapa de pixeles o tipos de letra del sistema debe dibujarse.</para>
+
+ <para
+>Debería contener una lista de elementos "símbolo". Estos tienen numerosos atributos posibles, la elección de los cuales dependerá de si la fuente esta basada en mapas de pixeles o tipos de letra del sistema. </para>
+
+ <variablelist>
+ <varlistentry>
+ <term
+>name</term>
+ <listitem>
+ <para
+>Obligatorio. Este atributo debería contener el nombre del símbolo. Si el símbolo existe en el <ulink url="http://www.unicode.org/charts/PDF/U1D100.pdf"
+>estándar Unicode 3.2</ulink
+>, el nombre debería usarse para identificar el símbolo en el estándar.</para>
+
+ <para
+>La mayoría de los símbolos que Rosegarden espera encontrar están en el estándar; una excepción es que muchas fuentes tienen una versión especial del símbolo flag, que se utiliza en los casos en donde se componen múltiples flags a partir de uno solo. Rosegarden se refiere a esto como "MUSICAL SYMBOL COMBINING FLAG-0", un nombre no utilizado en el estándar Unicode (que tiene los flags 1-5 solamente).</para>
+
+ <para
+>Para una lista definitiva de los nombres de símbolo reconocidos por Rosegarden, vea el archivo "gui/notecharname.cpp" en su código fuente. Notar, sin embargo, que es posible usar nombres de símbolo adicionales introduciéndolos en <link linkend="developers-note-styles"
+>estilo notación</link
+>. </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>src</term>
+ <listitem>
+ <para
+>El nombre del archivo de mapa de pixels desde donde se carga el símbolo, sin directorio o extensión. Esta es la forma usual de describir un símbolo en un tipo de letra pixmap. El archivo en si debe ser instalado en fonts/&lt;font-name&gt;/&lt;font-size&gt;/&lt;src&gt;.xpm dentro del directorio de instalación de Rosegarden. </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>inversion-src</term>
+ <listitem>
+ <para
+>El nombre del archivo de mapa de pixels desde donde se carga la versión invertida del símbolo, sin directorio o extensión. Si este atributo esta ausente y se requiere una versión invertida del símbolo, sera generado cargando la versión normal y reflejándola en el eje x central. </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>code</term>
+ <listitem>
+ <para
+>El punto del código en el cual se encuentra el símbolo en el tipo de letra del sistema, como un entero decimal. Esta es una manera de describir un símbolo en una fuente escalable. Este atributo solo sera referenciado si no se proporciona un archivo de mapa de pixels o si el mismo falla en el momento de la carga. </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>inversion-code</term>
+ <listitem>
+ <para
+>El punto del código en donde se encuentra la versión invertida del símbolo en el tipo de letra del sistema. Si este atributo esta ausente y se requiere una versión invertida del símbolo, sera generado cargando la versión normal y reflejándola en el eje x central. </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>glyph</term>
+ <listitem>
+ <para
+>El índice raw glyph en donde se encuentra el símbolo en el tipo de letra del sistema, como un entero decimal. Esta es una forma de describir un símbolo en un tipo de letra escalable. Este atributo sólo será referenciado si no se proporciona un archivo de mapa de pixels o si falla la carga del mismo. </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>inversion-glyph</term>
+ <listitem>
+ <para
+>El índice raw glyph en el que se encuentra la versión invertida del símbolo, en el tipo de letra correspondiente. Si se omite este atributo y se necesita una versión invertida del símbolo, el mismo se generará cargando la versión normal y reflejándola en su eje x central. </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>font-id</term>
+ <listitem>
+ <para
+>El identificador del tipo de letra del sistema desde el cual se cargara el símbolo, según lo definido en el elemento <link linkend="developers-note-fonts-mapping-format-font-requirements"
+>requisitos de tipo de letra</link
+>. El valor por defecto es 0. </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>codebase</term>
+ <listitem>
+ <para
+>Este atributo (entero decimal) debe ser útil si muchos de los símbolos en un tipo de letra escalable cubren un rango corto de puntos de código, comenzando en un código de página relativamente alto. Si es incluido, el valor codebase sera agregado a cada uno de los valores de los códigos (y códigos inversos) al buscar un símbolo. </para>
+ </listitem>
+ </varlistentry>
+
+ </variablelist>
+
+ <para
+>Si bien ninguno de estos atributos es obligatorio excepto el nombre, un símbolo obviamente necesita tener por lo menos algún "src", "inversion-src", "code", "inversion-code", "glyph", or "inversion-glyph" para tener alguna chance de ser interpretado. Por supuesto, es perfectamente legítimo suministrar muchos de estos atributos. </para>
+
+ </sect3>
+
+ <sect3 id="developers-note-fonts-mapping-format-font-hotspots">
+ <title
+>font-hotspots</title>
+ <para
+>&nbsp; </para>
+ </sect3>
+
+ </sect2>
+
+ </sect1>
+
+ <sect1 id="developers-note-styles">
+ <title
+>Creando nuevos estilos de notación</title>
+
+ <para
+>El editor de notación de Rosegarden tiene la habilidad de mostrar y editar notas en varios estilos estándar: clásico, diamond heads, etc. Todos estos estilos están definidos mediante archivos XML instalados con la aplicación y es posible crear nuevos escribiendo un simple archivo XML. Rosegarden solo mira el conjunto de archivos instalado para determinar que estilos puede ofrecerle al usuario. Puede ver el conjunto de archivos por defecto en el subdirectorio estilos del directorio de instalación de Rosegarden para ver ejemplos. </para>
+
+ <para
+>El formato de archivo no es especialmente comprehensivo aun, por el momento ha sido diseñado para ser lo suficientemente poderoso para describir los estilos estándar incluidos en Rosegarden, pero no mucho mas.Si usted intenta crear nuevos estilos de esta forma, estaremos muy interesados en recibir sus comentarios en la lista de correo de Rosegarden. </para>
+
+ <sect2 id="developers-note-styles-format">
+ <title
+>Estilo de notación en formato XML</title>
+
+ <para
+>Este es un sumario de los elementos XML que pueden usarse en un archivo de definición de estilos. </para>
+
+ <sect3 id="developers-note-styles-note-style">
+ <title
+>rosegarden-note-style</title>
+
+ <para
+>Este elemento debe existir en cada archivo de estilos y debe contener a todos los demás elementos. Tiene un atributo opcional, "base-style", el cual puede usarse para nombrar un estilo del cual el estilo actual toma valores por defecto para cualquier parámetro no especificado en el archivo. Habitualmente es una buena practica definir un estilo en términos de la diferencia mínima con un estilo base dado: vea el archivo Cross.xml proporcionado para un ejemplo particular simple. </para>
+
+ <para
+>Notar que el elemento "rosegarden-note-style" no da el nombre del estilo definido, el cual es extraído del nombre del archivo. El el futuro podríamos agregar atributos para nombres de estilo internacionales a este elemento.</para>
+ </sect3>
+
+ <sect3 id="developers-note-styles-global-note">
+ <title
+>global, note</title>
+
+ <para
+>Con el elemento "rosegarden-note-style", puede haber un elemento "global" y cualquier cantidad de elementos "note". Los describimos juntos porque sus atributos son casi idénticos. El elemento "global" simplemente provee valores por defecto para aquellos parámetros no especificados para un tipo de nota en particular en cualquiera de los elementos "note" que lo siguen. </para>
+
+ <para
+>Los atributos para estos elementos son los siguientes. Todos son opcionales, a menos que se indique lo contrario:</para>
+
+ <variablelist>
+
+ <varlistentry>
+ <term
+>type</term>
+ <listitem>
+ <para
+>Sólo es relevante al elemento "nota", y es obligatorio para ese elemento. Este atributo especifica que clase de nota esta siendo estilizada. Los valores legales son los nombres americanos o ingleses de las notas (desde "64th", "sixth-fourth note", "hemidemisemiquaver" etc, a "double whole note"). </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>shape</term>
+ <listitem>
+ <para
+>Define la forma de un note head para este estilo. Cualquier cadena de caracteres es un valor legal, pero los únicos valores implementados son "angled oval", "level oval", "breve", "cross", "triangle up", "triangle down", "diamond" y "rectangle". El valor "number" también es reconocido pero no esta implementado aun. </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>charname</term>
+ <listitem>
+ <para
+>Define un nombre de carácter para ser usado como note head para este estilo. Un elemento puede proporcionar un atributo "shape" o "charname", pero no ambos. El nombre debería ser uno de los definidos en el tipo de letra de la notación actual... ??? </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>filled</term>
+ <listitem>
+ <para
+>Especifica cuando esta nota debería tener filled head (cuando es aplicable, por ejemplo cuando el atributo shape proporciona una forma disponible como filled o unfilled). Debe ser "true" o "false". </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>stem</term>
+ <listitem>
+ <para
+>Especifica cuando esta nota debería tener un stem. Debe ser "true" o "false". </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>flags</term>
+ <listitem>
+ <para
+>Define cuantos flags o beams debe tener esta nota. El rango válido es entre 0 y 4. </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>slashes</term>
+ <listitem>
+ <para
+>Define cuantos slashes debe tener esta nota a través de su stem. </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>hfixpoint</term>
+ <listitem>
+ <para
+>Especifica en que posición x se fija el stem al note head. Los valores aceptables son "normal" (el lado derecho cuando el stem apunta hacia arriba, el izquierdo cuando apunta hacia abajo), "central" y "reversed" (lado izquierdo cuando el stem apunta hacia arriba, derecho cuando apunta hacia abajo). </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>vfixpoint</term>
+ <listitem>
+ <para
+>Especifica en que posición y se fija al stem al note head. Los valores aceptables son "near" (el stem se fija al tope cuando apunta hacia arriba, a la parte inferior cuando apunta hacia abajo), "middle", o "far". </para>
+ </listitem>
+ </varlistentry>
+
+ </variablelist>
+ </sect3>
+ </sect2>
+ </sect1>
+
+
+ <!-- (OPTIONAL) A Programming/Scripting reference chapter should be
+ used for apps that use plugins or that provide their own scripting hooks
+ and/or development libraries. -->
+
+ <!-- cc: I think we should document the DCOP API here, but I don't
+ think we should include extensive developer docs, although we should
+ point to where they can be found in the source tree or online. -->
+ <!--
+ <para>
+ Programming <application
+>Rosegarden</application
+> plugins is
+ a joy to behold. Just read through the next
+ 66 pages of <acronym
+>API</acronym
+>'s to learn how!
+ </para>
+ -->
+ <!-- Use refentries to describe APIs. Refentries are fairly
+ complicated and you should consult the docbook reference for
+ further details. The example below was taken from that reference
+ and shortened a bit for readability. -->
+ <!--
+ <refentry id="re-1007-unmanagechildren-1">
+ <refmeta>
+ <refentrytitle
+>XtUnmanageChildren</refentrytitle>
+ <refmiscinfo
+>Xt &ndash; Geometry Management</refmiscinfo>
+ </refmeta>
+ <refnamediv>
+ <refname
+>XtUnmanageChildren
+ </refname>
+ <refpurpose
+>remove a list of children from a parent widget's managed list.
+ </refpurpose>
+ </refnamediv>
+ <refsynopsisdiv>
+ <refsynopsisdivinfo>
+ <date
+>4 March 1996</date>
+ </refsynopsisdivinfo>
+ <synopsis
+>
+ void XtUnmanageChildren(<replaceable>children</replaceable>, <replaceable>num_children</replaceable>)
+ WidgetList <replaceable>children</replaceable>;
+ Cardinal <replaceable>num_children</replaceable>;
+ </synopsis>
+
+ <refsect2 id="r2-1007-unmanagechildren-1">
+ <title
+>Inputs</title>
+ <variablelist>
+ <varlistentry>
+ <term
+><replaceable
+>children</replaceable>
+ </term>
+ <listitem>
+ <para>
+ Specifies an array of child widgets. Each child must be of
+ class RectObj or any subclass thereof.
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term
+><replaceable
+>num_children</replaceable>
+ </term>
+ <listitem>
+ <para
+>Specifies the number of elements in <replaceable
+>children</replaceable
+>.
+ </para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refsect2
+></refsynopsisdiv>
+
+ <refsect1 id="r1-1007-unmanagechildren-1">
+ <title
+>Description
+ </title>
+ <para>
+ <function
+>XtUnmanageChildren()</function
+> unmaps the specified widgets
+ and removes them from their parent's geometry management.
+ The widgets will disappear from the screen, and (depending
+ on its parent) may no longer have screen space allocated for
+ them.
+ </para>
+ <para
+>Each of the widgets in the <replaceable
+>children</replaceable
+> array must have
+ the same parent.
+ </para>
+ <para
+>See the &ldquo;Algorithm&rdquo; section below for full details of the
+ widget unmanagement procedure.
+ </para>
+ </refsect1>
+
+ <refsect1 id="r1-1007-unmanagechildren-2">
+ <title
+>Usage</title>
+ <para>
+ Unmanaging widgets is the usual method for temporarily
+ making them invisible. They can be re-managed with
+ <function
+>XtManageChildren()</function
+>.
+ </para>
+ <para>
+ You can unmap a widget, but leave it under geometry
+ management by calling <function
+>XtUnmapWidget()</function
+>. You can
+ destroy a widget's window without destroying the widget by
+ calling <function
+>XtUnrealizeWidget()</function
+>. You can destroy a
+ widget completely with <function
+>XtDestroyWidget()</function
+>.
+ </para>
+ <para>
+ If you are only going to unmanage a single widget, it is
+ more convenient to call <function
+>XtUnmanageChild()</function
+>. It is
+ often more convenient to call <function
+>XtUnmanageChild()</function>
+ several times than it is to declare and initialize an array
+ of widgets to pass to <function
+>XtUnmanageChildren()</function
+>. Calling
+ <function
+>XtUnmanageChildren()</function
+> is more efficient, however,
+ because it only calls the parent's <function
+>change_managed()</function>
+ method once.
+ </para>
+ </refsect1>
+
+ <refsect1 id="r1-1007-unmanagechildren-3">
+ <title
+>Algorithm
+ </title>
+ <para
+><function
+>XtUnmanageChildren()</function
+> performs the following:
+ </para>
+ <variablelist>
+ <varlistentry>
+ <term
+>-
+ </term>
+ <listitem>
+ <para
+>Ignores the child if it already is unmanaged or is being
+ destroyed.
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term
+>-
+ </term>
+ <listitem>
+ <para
+>Otherwise, if the child is realized, it makes it nonvisible
+ by unmapping it.
+ </para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1>
+
+ <refsect1 id="r1-1007-unmanagechildren-4">
+ <title
+>Structures</title>
+ <para>
+ The <type
+>WidgetList</type
+> type is simply an array of widgets:
+ </para>
+ <screen id="sc-1007-unmanagechildren-1"
+>
+ typedef Widget *WidgetList;
+ </screen>
+ </refsect1>
+ </refentry>
+ -->
+ </chapter>
+
+
+ <chapter id="credits">
+
+ <title
+>Créditos y Licencia</title>
+
+ <para>
+ <application
+>Rosegarden</application>
+ </para>
+ <para>
+ <itemizedlist>
+ <listitem>
+ <para
+>Rosegarden-4 es Copyright 2000-2004 Guillaume Laurent, Chris Cannam y Richard Bown. Los derechos morales de Guillaume Laurent, Chris Cannam y Richard Bown serán identificados ??? </para>
+ </listitem>
+
+ <listitem>
+ <para
+>Partes de Rosegarden-4 son derivadas de Rosegarden 2.1, que es Copyright 1994 &ndash; 2001 Chris Cannam, Andrew Green, Richard Bown y Guillaume Laurent. </para>
+ </listitem>
+
+ <listitem>
+ <para
+>Para reproducir notación musical, Rosegarden utiliza mapas de pixels derivados del tipo de letra Feta, parte del software <ulink url="http://lilypond.org/"
+>Lilypond</ulink
+>, que es Copyright 1997 &ndash; 2001 Jan Nieuwenhuizen y Han-Wen Nienhuys. </para>
+ </listitem>
+
+ <listitem>
+ <para
+>Otros colaboradores importantes son Randall Farmer, Ron Kuris, Hans Kieserman y Michael McIntyre. </para>
+ </listitem>
+
+ <listitem>
+ <para
+>La imagen de bienvenida de Rosegarden es de una postal del 1900 de Thornden Park en la Universidad de Syracuse, Syracuse, NY, usada con permiso del personal de la universidad. </para>
+ </listitem>
+
+ </itemizedlist>
+ </para>
+
+ <para
+>Documentación: copyright 2002-2004 Chris Cannam, Richard Bown, Guillaume Laurent </para>
+ <!--
+ <para>
+ Translations done by:
+ <itemizedlist>
+ <listitem>
+ <para
+>Babel D. Fish <email
+> (Sanskrit)</para>
+ </listitem>
+ </itemizedlist>
+ </para>
+ -->
+ <!-- For URL links to common stuff like the one below,
+ always use paths like "common/gpl-licence".
+ In this path, "common" will be a symbolic link built at "make install" time.
+ This link will normally point to $KDEDIR/share/doc/HTML/en/common,
+ where "en" should be replaced with the current language. -->
+
+ <para
+>Este programa esta licenciado bajo los términos de la <ulink url="common/gpl-license.html"
+>GNU General Public License</ulink
+>. </para>
+ </chapter>
+
+ <!-- Note that the revhistory tags apply to the documentation
+ version and not to the app version. That is why we use an
+ ItemizedList instead for this list of revisions to the app. -->
+
+ <chapter id="rosegarden-revhistory">
+ <title
+>Historial de revisiones de Rosegarden-4</title>
+ <para>
+ <itemizedlist>
+ <listitem
+><para
+>0.9.9 &ndash; Julio 2004: mejoras en extensiones de síntesis, segmentos ??? y notación </para
+></listitem>
+ <listitem
+><para
+>0.9.8 &ndash; Mayo 2004: mejor subsistema de audio </para
+></listitem>
+ <listitem
+><para
+>0.9.7 &ndash; Febrero 2004: </para
+></listitem>
+ <listitem
+><para
+>0.9.6 &ndash; Diciembre 2003: correcciones </para
+></listitem>
+ <listitem
+><para
+>0.9.5 &ndash; Noviembre 2003: muchas mejoras </para
+></listitem>
+ <listitem
+><para
+>0.9.1 &ndash; Mayo 2003: grabación por pasos, exportación Mup, numerosas correcciones </para
+></listitem>
+ <listitem
+><para
+>0.9 &ndash; Abril 2003: numerosas mejoras en la notación, editor de bancos mejorado, mejoras de audio, traducciones </para
+></listitem>
+ <listitem
+><para
+>0.8.5 &ndash; Diciembre 2002: editor de bancos, filtros MIDI, boton panic </para
+></listitem>
+ <listitem
+><para
+>0.8 &ndash; Octubre 2002: impresión, extensiones LADSPA, vista de matriz mejorada </para
+></listitem>
+ <listitem
+><para
+>0.2.0 &ndash; Agosto 2002: soporte para archivos WAV, selecciones de barrido, ??? </para
+></listitem>
+ <listitem
+><para
+>0.1.6 &ndash; Junio 2002: cuadro de dialogo de configuración, soporte Lilypond, cuadro de dialogo Cuantificar </para
+></listitem>
+ <listitem
+><para
+>0.1.5 &ndash; Mayo 2002: KDE 3, soporte ALSA, soporte para JACK </para
+></listitem>
+ <listitem
+><para
+>0.1.4 &ndash; Marzo 2002: Deshacer mejorado, edición de segmentos, reproducción de audio </para
+></listitem>
+ <listitem
+><para
+>0.1.3 &ndash; Enero 2002: vista piano-roll/matriz, grabación &MIDI; </para
+></listitem>
+ <listitem
+><para
+>0.1.2 &ndash; Noviembre 2001: Deshacer notación, cuadro de dialogo transporte, puntero de posición </para
+></listitem>
+ <listitem
+><para
+>0.1.1 &ndash; Octubre 2001: notación escalable </para
+></listitem>
+ <listitem
+><para
+>0.1 &ndash; Junio 2001: primera versión de Rosegarden-4 </para
+></listitem>
+ </itemizedlist>
+ </para>
+ </chapter>
+
+ &documentation.index;
+</book>
diff --git a/docs/ja/index.docbook b/docs/ja/index.docbook
new file mode 100644
index 0000000..a1c09bf
--- /dev/null
+++ b/docs/ja/index.docbook
@@ -0,0 +1,5376 @@
+<?xml version="1.0" ?>
+<!DOCTYPE book PUBLIC "-//KDE//DTD DocBook XML V4.1.2-Based Variant V1.0//EN" "dtd/kdex.dtd" [
+ <!ENTITY rosegarden "<application>Rosegarden</application>">
+ <!ENTITY MIDI "<acronym>MIDI</acronym>">
+ <!ENTITY % English "INCLUDE" > <!-- change language only here -->
+ <!ENTITY % addindex "IGNORE">
+]>
+
+<!-- The language must be changed in the <book> tag for translations. -->
+
+
+<!--
+
+ Notes on style and terminology for Rosegarden handbook
+ ======================================================
+
+ * Aim to be clear, brief and direct, but be informal.
+
+ * Write instructions in the second person.
+
+ Good: "You can select segments by clicking on
+ them with the arrow tool."
+
+ Bad: "Segments can be selected by clicking on
+ them with the arrow tool."
+
+ Very bad: "The arrow tool allows the user to select
+ segments by clicking on them."
+
+ If you dislike the first of these because you want to
+ make the phrase "the arrow tool" more obvious by placing
+ it at the start of the sentence, then perhaps you
+ should be using a variablelist instead and making
+ "the arrow tool" a list item.
+
+ * It's perfectly permissible to detour to explain why
+ something is the way it is, particularly if it might
+ not be obvious.
+
+ * It's also entirely permissible to omit advanced stuff
+ from the "Using Rosegarden" section and document it
+ only in the reference section. "Using Rosegarden"
+ should be about understanding how and why, not about
+ knowing every last clever detail.
+
+ * Bear in mind we can link extensively from any part of
+ the handbook to any other. Unfortunately DocBook won't
+ allow you to write a link to a target that doesn't
+ exist yet, so if you want to link to something that's
+ not yet been written, either make a note of the planned
+ link in an XML comment, or go and create a stub for the
+ bit that hasn't been written yet, or else just write in
+ a way that allows for a link to be easily added later
+ (we could do an editing phase specially for links).
+
+ * Be strict about using the correct terminology for
+ Rosegarden data structures (segment, event, track,
+ instrument, composition), but don't capitalise the
+ words. Capitalisation is useful in technical documents
+ to make it clear that you're referring to a precise
+ concept, but you shouldn't have to do it to make your
+ meaning clear in user documentation. If something
+ seems ambiguous without, try rewording it instead.
+
+-->
+
+
+<book id="rosegarden" lang="ja">
+
+ <!-- This header contains all of the meta-information for the document such
+ as Authors, publish date, the abstract, and Keywords -->
+
+ <bookinfo>
+ <title>Rosegarden ハンドブック</title>
+ <authorgroup>
+ <author>
+ <firstname>Richard</firstname>
+ <surname>Bown</surname>
+ </author>
+ <author>
+ <firstname>Chris</firstname>
+ <surname>Cannam</surname>
+ </author>
+ <author>
+ <firstname>Guillaume</firstname>
+ <surname>Laurent</surname>
+ </author>
+ <!-- TRANS:ROLES_OF_TRANSLATORS -->
+ </authorgroup>
+
+ <copyright>
+ <year>2002-2003</year>
+ <holder>Richard Bown, Chris Cannam, Guillaume Laurent</holder>
+ </copyright>
+
+ <date>2003-11-26</date>
+ <releaseinfo>0.9.5</releaseinfo>
+
+ <abstract>
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-mainwindow.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase>&rosegarden;</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+
+ Rosegardenは音と &MIDI; シーケンサと楽譜エディタである。この
+ ハンドブックはどのようにこれを使うかを説明する。
+
+ </para>
+ </abstract>
+
+ <keywordset>
+ <keyword>Rosegarden</keyword>
+ <keyword>sequencer</keyword>
+ <keyword>MIDI</keyword>
+ <keyword>audio</keyword>
+ <keyword>music</keyword>
+ <keyword>notation</keyword>
+ <keyword>score</keyword>
+ <keyword>KDE</keyword>
+ </keywordset>
+
+ </bookinfo>
+
+ <!-- The contents of the documentation begins here. Label each
+ chapter so with the id attribute. This is necessary for two reasons:
+ it allows you to easily reference the chapter from other chapters of
+ your document, and if there is no ID, the name of the generated HTML
+ files will vary from time to time making it hard to manage for
+ maintainers and for the CVS system. Any chapter labelled (OPTIONAL)
+ may be left out at the author's discretion. Other chapters should
+ not be left out in order to maintain a consistent documentation
+ style across all KDE apps. -->
+
+ <chapter id="introduction">
+ <title>概要</title>
+
+ <para>
+ <application>Rosegarden</application> は&MIDI; と音シーケンサ
+ と楽譜エディタである。音楽の録音、編曲と作曲ができる。音楽は
+ 従来の楽譜か&MIDI; データ、あるいは指定した任意の音源かギターか
+ マイクからの入力で録音されたものか、一続きの音ファイルから
+ インポートされたもので表現される。
+ sequencer and musical notation editor. It allows the user to
+ record, arrange and compose music. Music is represented either
+ by traditional score or &MIDI; data, or by sets of audio files
+ either imported or recorded from a microphone, guitar or
+ whatever audio source you care to specify. Music data can be
+ edited to create a composition, effects can be applied and the
+ resulting mix can be burnt to CD or turned into MP3/ogg format
+ suitable for distribution on the web. Professional notation
+ editing support also provides high quality printed output of the
+ composition.
+ </para>
+
+ <para>
+ <application>Rosegarden</application> is designed to look and
+ act in a manner familiar to experienced users coming to Linux
+ from other platforms whilst also being accessible and friendly
+ to users new to music software generally.
+ </para>
+
+ <para>
+ このハンドブックは参考資料と基本概念の簡単な概要と、&rosegarden; の
+ 使用法を含んでいる。これは
+ <ulink url="http://rosegarden.sourceforge.net/tutorial/"> ここに
+ 置いてあるチュートリアル</ulink> ではない。 もしも何か理解できないか、
+ さらに助言が必要であれば、
+ <ulink url="http://www.all-day-breakfast.com/rosegarden/">
+ Rosegarden webサイト</ulink> にFAQ とメーリングリストがあるので
+ 見てほしい。
+ </para>
+
+ <!-- Note that the revhistory tags apply to the documentation
+ version and not to the app version. That is why we use an
+ ItemizedList here. -->
+
+ <sect1 id="rosegarden-revhistory">
+ <title>変更記録</title>
+ <para>
+ <itemizedlist>
+ <listitem><para>
+ 0.9.5 &ndash; November 2003: a great many stuff
+ </para></listitem>
+ <listitem><para>
+ 0.9.1 &ndash; May 2003: step recording, Mup export, many many bug fixes
+ </para></listitem>
+ <listitem><para>
+ 0.9 &ndash; April 2003: many notation improvements, improved bank editor, audio enhancements and refinements, translations
+ </para></listitem>
+ <listitem><para>
+ 0.8.5 &ndash; December 2002: bank editor, MIDI filters, panic button
+ </para></listitem>
+ <listitem><para>
+ 0.8 &ndash; October 2002: printing, LADSPA plugins, improved Matrix View
+ </para></listitem>
+ <listitem><para>
+ 0.2.0 &ndash; August 2002: WAV file support, sweep selections, contrapuntal staves
+ </para></listitem>
+ <listitem><para>
+ 0.1.6 &ndash; June 2002: configuration dialog, Lilypond support, quantize dialog
+ </para></listitem>
+ <listitem><para>
+ 0.1.5 &ndash; May 2002: KDE 3, ALSA support, JACK audio support
+ </para></listitem>
+ <listitem><para>
+ 0.1.4 &ndash; March 2002: more undo, segment editing, audio playback
+ </para></listitem>
+ <listitem><para>
+ 0.1.3 &ndash; January 2002: piano-roll/matrix view, &MIDI; recording
+ </para></listitem>
+ <listitem><para>
+ 0.1.2 &ndash; November 2001: notation undo, transport dialog, position pointer
+ </para></listitem>
+ <listitem><para>
+ 0.1.1 &ndash; October 2001: scalable notation
+ </para></listitem>
+ <listitem><para>
+ 0.1 &ndash; June 2001: first public release of Rosegarden4
+ </para></listitem>
+ </itemizedlist>
+ </para>
+ </sect1>
+ </chapter>
+
+
+<!--
+ **********************************
+
+ PART I:
+ Discussion and tutorial material
+
+ **********************************
+ -->
+
+
+ <chapter id="using-rosegarden">
+ <title>Rosegardenの使用法</title>
+
+ <!-- This chapter should tell the user how to use your app. You
+ should use as many sections (Chapter, Sect1, Sect3, etc...) as is
+ necessary to fully document your application. -->
+
+ <!-- Note that all graphics should be in .png format. Use no
+ gifs because of patent issues. -->
+
+
+ <sect1 id="file-operations">
+ <title>ファイルとドキュメントの基礎</title>
+ <para>
+ &rosegarden; は各々の楽曲情報を固有のドキュメントに、固有の内部
+ 形式で格納する。ドキュメントをセーブするとき、ディスク上に、
+ .rg 拡張子を付けたファイルとして格納される。&rosegarden; は、
+ いくつかの、その他のファイル形式も扱うことができる。
+ </para>
+
+ <sect2 id="file-creating">
+ <title>新しい楽曲情報</title>
+ <para>
+ &rosegarden; の起動時には、編集を行なうための、"空白の"楽曲情報
+ を含む新しいドキュメントが開かれる。その楽曲情報になんらかのもの
+ を配置するために、何らかを録音するか、色々な編集機能を使って埋める
+ ことができる、長さ0(空白)の音楽("セグメント"として参照される)を
+ 作成しなければならない。
+ </para>
+ <para>音楽の録音についての詳細の記述がある
+ <!-- link linkend="recording" -->録音<!-- /link
+ --> と、どのように音楽のセグメントを作成、編集、編集するか
+ が記載されている<link
+ linkend="segment-view">トラックエディタ</link> セクションを
+ 参照のこと。
+ </para>
+ </sect2>
+
+ <sect2 id="file-midi">
+ <title>MIDIファイルの使用法</title>
+ <para>
+ MIDIファイルをインポート/エクスポートするためには、
+ ファイルメニューのインポートとエクスポートサブメニュー
+ 中にある
+ "MIDIファイルのインポート"と"MIDIファイルのエクスポート"
+ を使用する。
+ </para>
+ <para>
+     &rosegarden; がMIDIファイルのようなファイル形式をロード/セーブ
+ できるにもかかわらず、内部的にはMIDIデータを格納しない。
+ 一般的には、&rosegarden; が、MIDIにエクスポートするときに
+ 失われる大量の情報を格納する &rosegarden; 固有の形式でセーブ
+ することを選択しなければならない。
+ </para>
+ <para>
+ MIDIファイルがロードされると、&rosegarden;は音楽データを
+ MIDI1トラックごとに1つのトラックに分割するか、ファイルに送り
+ 込み、
+ <link linkend="studio-midi-import">は適切な楽器のマッピングを
+ 行ない</link>、 <link
+ linkend="nv-quantization">MIDIパフォーマンスデータのために
+ もっともな楽譜</link>を計算することを試みる。
+ </para>
+ </sect2>
+
+ <sect2 id="file-merge">
+ <title>ファイルのマージ</title>
+ <para>
+ ファイルをロード/インポートするだけではなく、現在のドキュメント
+ 中にそれらをマージすることも、すでにそこにあるファイル中にある
+ セグメントを追加することもできる。
+ </para>
+
+ <para>
+ ファイルをマージするために、オープン又はインポートオプションを
+ 使う代わりに、ファイルメニュー中のマージサブメニュー上の適切な
+ オプションを使う。
+ </para>
+ </sect2>
+
+ <sect2 id="file-printing">
+ <title>印刷</title>
+ <para>
+ ファイルメニュー中の"印刷"機能を使うことで、
+ 楽譜として楽曲情報を印刷することができる。
+ </para>
+
+ <para>
+ 楽譜を演奏データから作成することは大変な作業なので、
+ ほとんどの場合、MIDIデータに基づく既定値の印刷結果がとても読み
+ やすいことを期待するのは無謀である。印刷する前に、楽譜を
+ <link linkend="notation-view">楽譜エディタ</link>
+ を使って整形すべきである。
+ (<link linkend="nv-quantization">演奏データからの作譜</link>
+ も参照のこと。)
+ </para>
+
+ <para>
+ 注意深く扱うことによって、 &rosegarden;はとても読みやすい楽譜を
+ 作成する能力がある。たとえそうでも、スクリーンエディタとして
+ デザインされたのであって、写植機ではない。本当に印刷品質の
+ 楽譜を作成したいのであれば、&rosegarden; と結合できる
+ <ulink url="http://www.lilypond.org">Lilypond</ulink>
+ を考慮すべきである。 Lilypond は楽譜の写植を行なうソフトウェアで、
+ 特別なテキストファイル形式を読み込み、高品質の活字化された
+ 楽譜を生成する。
+ &rosegarden; はファイルメニュー中のエクスポートサブメニュー上の
+ "Lilypondにエクスポート"を使うことでLilypondファイルを書き出す
+ ことができる。
+ </para>
+ </sect2>
+
+ </sect1>
+
+ <sect1 id="segment-view">
+ <title>トラックエディタ</title>
+ <sect2 id="segment-view-overview">
+ <title>概要</title>
+ <para>
+ &rosegarden; のメインレイアウトは、その他の一般的なシーケンサ
+ とよく似たコンセプトである。これは、&mdash; のトラック
+ コンセプトを基礎としていて、メインウィンドウはトラックの
+ 一覧を表示しているトラックエディタを表示し、そのトラックは、
+ 左側の下の楽器に関連付けられている。
+ (<link
+ linkend="notation-view">notation</link>、 <link
+ linkend="matrix-view">matrix</link>、と <link
+ linkend="event-view">event list</link>)という特化した
+ エディタ中でセグメントそれ自身をオープンするのと同じように、
+ トラックエディタ上で(&ldquo;セグメント&rdquo;として参照
+ される)音楽データのブロックを移動したり操作することができる。
+ </para>
+
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-trackeditor.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase>&rosegarden;'s Track Editor showing two segments of music data</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+
+ <para>
+ トラックは、&MIDI;のレンジや、オーディオ楽器(audio instruments)
+ に割り当てることができる。上記の絵の中では、トラックエディタ上で
+ 2つのセグメント(黄色がかった緑のブロックの部分)が表示されていて、
+ それは"IIWU Synth"という楽器に割り当てられている。
+ </para>
+ </sect2>
+ <sect2 id="segment-view-instruments">
+ <title>トラックと楽器</title>
+ <para>
+ 各々のトラックは、音を鳴らすために、それに割り当てられている
+ 楽器を持たなければならない。1つの楽器をトラックに割り当てるために、
+ トラックラベル上で左マウスボタンをクリックしホールドする。
+ するとポップアップメニューが表示され、その中に有効な楽器の
+ 一覧が表示される。
+ </para>
+ <para>
+ 楽器というものは、&MIDI;デバイス上の1つのチャネル、あるいは
+ 1つのオーディオ出力として理解することができる。トラックには
+ &MIDI; 楽器に割り当てられなければならない音符データを含み、
+ それらは、音から音へのinstrumentを含んでいる。1つ以上のトラックに
+ 同じ楽器を割り当てることができ、その場合、複数のトラックは
+ 同じ音を使う。
+ </para>
+ <para>
+ <link
+ linkend="segment-view-instrumentparameterbox">楽器パラメータ
+ ボックス</link> を使うことで、トラックに割り当てられた色々な
+ プロパティを変更することができる。ここは、たとえば、特定の
+ パッチを使って特定の音(ピアノ、ストリング、その他)を出すために
+ MIDI楽器を設定するところである。
+ </para>
+ <para>
+ 楽器についての詳細がある
+ <link linkend="studio-introduction">Studio</link> セクションを
+ 参照のこと。 </para>
+ </sect2>
+
+ <sect2 id="segment-view-creating">
+ <title>セグメントの作成</title>
+ <para>
+ 何らかの作曲を開始するために、1つの空白のセグメントを作成するために、
+ 鉛筆ツールを使う必要がある。ツールバーの鉛筆をクリックし、
+ セグメントを開始したい場所でまたクリックし、
+ (at the correct height for the
+ track you want the segment to be on, and at a distance
+ across the editor window corresponding to the correct time)
+ セグメントが正しい長さのバーになるまで右にドラッグする。
+ </para>
+
+ <para>
+ 既定値では、新しいセグメントはバーライン上で開始し、バー単位で
+ 拡張するが、これは、クリックとドラッグ中シフトキーを押すことに
+ よってグリッドに張り付く効果を抑止できる。
+ </para>
+
+ <para>
+ 一度セグメントを作成すると、
+ <link linkend="matrix-view">マトリクス</link> 又は <link
+ linkend="notation-view">notation</link>エディタを使って編集を
+ 開始できる。それらのエディタを使うためには、セグメントをダブル
+ クリックするか、右マウスボタンをクリックし、コンテキストメニュー で使いたいエディタを選択する。
+ </para>
+
+ <para>
+ MIDIデバイスかオーディオ入力からの録音を考えているならば、
+ 最初に新しいセグメントを作成する必要はない -- それぞれの分離
+ された録音は、録音中に自動的に作成される常に新しいセグメント
+ 中に入る。
+ </para>
+ </sect2>
+
+ <sect2 id="segment-view-manipulating">
+ <title>セグメントの操作</title>
+ <para>
+ メインウィンドウはセグメントを編集するための"ツール"の集まり
+ が用意されている。それらはメインツールバーで有効になっている。
+ 最初にツールバーから使いたいツールを選択し、メインキャンバス上の
+ セグメント上にクリックとドラッグを行なう。
+ </para>
+
+ <sect3 id="segment-view-selector">
+ <title>選択ツール</title>
+ <para>
+ "選択ツール"(矢印ツール)は実際には他目的のツールである:
+ それは選択、移動、コピー、リサイズとセグメントの作成に
+ 使える。</para>
+
+ <para>
+ 最も明白な使用方法は"選択"である:これは、選択ツールで、
+ セグメントを、
+ セグメント上でクリックすることで1つを選択するか、
+ シフトキーを押したままでクリックしていくつかを選択するか、
+ ウィンドウの空白の領域中でクリックして領域外にドラッグする。
+ </para>
+
+ <para>
+ 選択ツールでセグメントを移動するためには、単にクリックし、
+ セグメントをドラッグする。コピーを作成するためには、クリックし、
+ セグメントの右端をドラッグする。新しいセグメントを作成するため
+ には、中マウスボタンで空白の領域をクリックしてドラッグする。
+ </para>
+
+ <para>
+ 選択ツールは、時々、&mdash;が
+ 特に小さなセグメント上で、意図している動作により明確にする必要がある
+ にもかかわらず、
+ その他のツールを完全に置き換えるものではない。
+ </para>
+
+ </sect3>
+
+ <sect3 id="segment-view-move-resize">
+ <title>移動とリサイズツール</title>
+ <para>
+ セグメントを別の開始時間又はトラックに移動するためには、
+ 移動ツールを使い、移動したい場所に、セグメント上でクリックし
+ ドラッグする。もしも、Ctrlキーを押したまま移動するならば、
+ セグメントは移動でなはくてコピーされる。
+ </para>
+
+ <para>
+ セグメントのリサイズをしたいならば、リサイズツールを使い、
+ セグメントの右端をクリックし、ドラッグする。</para>
+
+ <para>
+ 移動とリサイズの両方のために、特定のグリッド位置に張り付くのを
+ 防ぐため、シフトキーを押すことができる。
+ </para>
+
+ </sect3>
+
+ <sect3 id="segment-view-split-join">
+ <title>分割ツール</title>
+ <para>
+
+ <inlinemediaobject>
+ <imageobject>
+ <imagedata fileref="rg-split.png"/>
+ </imageobject>
+ </inlinemediaobject>
+ を、1つのセグメントを2つの分離されたセグメントにするために
+ 分割ツールを使うことができる。セグメントを分割するために、
+ 分割ツールを選択し、分割したい点でクリックする。
+ </para>
+ <para>
+ 既定値では、セグメントは、カーソルに関係した最も近いバーラインに
+ 分割されるが、これはセグメントを分割している間シフトキーを押すこと
+ で抑制できる。
+ </para>
+ </sect3>
+ </sect2>
+
+ <sect2 id="segment-view-segmentparameterbox">
+ <title>セグメントパラメータボックス</title>
+
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-segmentparameterbox.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase>&rosegarden;'s segment parameter box</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+
+ <para>
+ セグメントパラメータボックスは、選択されたセグメントのいくつかの
+ 外見を変更することができる。もしも1つのセグメントが現在選択され
+ ているのならば、そのパラメータはセグメントパラメータボックス中
+ で表示され、そこで編集できる。もしも複数のセグメントが選択されて
+ いるのならば、パラメータボックスは選択されたセグメントすべてで
+ 現在共通な値のみが表示されるが、それらは変更でき、それはすべての
+ 選択されたセグメントに反映される。
+
+ <variablelist>
+ <varlistentry>
+ <term>ラベル</term>
+ <listitem>
+ <para>
+ 選択されたセグメント(もしも同じラベルを持っているならば、
+ 複数のセグメント)のラベルを表示する。"..."ボタンをクリック
+ してラベルの編集ができる</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>繰り返し</term>
+ <listitem>
+ <para>
+ 選択されたセグメントの繰り返しのon/offを切り替える。繰り返しを
+ 指定されたセグメントは、同じトラック上の継続するセグメントの
+ 開始点まで繰り返すか、継続するセグメントがない場合、楽曲の
+ 最後まで繰り返す。
+ </para>
+
+ <para>
+ 繰り返しているセグメントの繰り返している部分は、オリジナルの
+ セグメントに比べて、メインキャンバス上で淡い色で表示される。
+ セグメントメニュー上で"Turn Repeats into Copies"オプションを
+ 使うか、単に単一の繰り返しブロック上でダブルクリックを行なう
+ ことによって、オリジナルのセグメントを真に編集可能なコピーに
+ 変更することができる。
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>Quantize</term>
+ <listitem>
+ <para>
+ 選択されたセグメントのquantizationを表示する。
+ すべてのそれらの音符の開始時間を簡単にquantize
+ するために、これを変更することができる。
+ より詳細なquantizationはセグメントメニュー上の
+ Quantize機能を使う。 <link
+ linkend="quantization">Quantization</link>
+ に詳細がある。
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>Transpose</term>
+ <listitem>
+ <para>
+ 選択されたセグメントに現在適用されているtransposition(in semitones)
+ を表示する。このtranspositionはセグメントが演奏されるときに適用され、
+ マトリクス、notationまたはイベントリストエディタ内で表示される音符
+ では見えない。楽曲全部または一部分のピッチを簡単に変更するために、
+ これを使うことができる。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>ディレイ</term>
+ <listitem>
+ <para>
+ 選択されたセグメント上で現在効力のあるディレイを表示する。
+ 演奏するために、後で書くより、セグメント全体にさせるために、
+ ここでディレイを設定することができる。このディレイはセグメントが
+ 演奏されるときに適用されるが、マトリクス、notationまたはイベント
+ リストエディタ内で表示される音符では見えない。
+ </para>
+ <para>
+ You can set a delay either in musical time (by
+ choosing a note duration from the delay dropdown),
+ in which time the exact delay will depend on the
+ tempo, or in real time (by choosing a time in
+ milliseconds from the dropdown).
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>色</term>
+ <listitem>
+ <para>
+ 選択されたセグメントが表示されるときに使われる色を表示する。
+ ドロップダウン機能を使うか、ドロップダウンで見付からない場合、
+ "新しい色を追加"オプションを選択することでその他の色を選択できる。
+ </para>
+ <para>
+ 編集メニュー上の"ドキュメントプロパティの編集"
+ (ドキュメントプロパティダイアログの色ページを選択)
+ を使うことによって色の管理と名前の変更もできる。
+ 変更された色のパレットはRosegardenファイル中の楽曲
+ データと共にセーブされる。
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-colours.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase>&rosegarden;の色マネージャ</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+ </listitem>
+ </varlistentry>
+
+ </variablelist>
+ </para>
+ </sect2>
+
+ <sect2 id="segment-view-instrumentparameterbox">
+ <title>楽器パラメータボックス</title>
+ <para>
+ </para>
+ </sect2>
+ </sect1>
+
+ <sect1 id="transport">
+ <title>The Transport</title>
+ <para>
+ トラックエディタは、割り当てられた楽器にたいして配置される一連の
+ セグメントを表示する。楽曲を演奏するとき、&rosegarden; はそれが
+ クロスしているセグメントの内容を演奏するときに左から右へとトラック
+ 上でポインタを横切る。画面上でのポインタの位置は、Transportと
+ 呼ばれるダイアログによってtrackされ制御される。
+ </para>
+
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-transport.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase>&rosegarden;'s Transport dialog</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+
+ <para>
+ もしもTransportが見えないならば設定メニューに行くことで
+ 有効にできる。
+ (<menuchoice> <guimenu lang="ja">設定</guimenu>
+ <guimenuitem>Transportの表示</guimenuitem> </menuchoice>).
+ </para>
+
+ <para>
+ Transportは最初のバー(秒単位)または、24-fps<acronym>SMPTE
+ </acronym>中の時間又は代わりにバーとビートからの絶対時間の
+ ポインタの現在位置を表示する。それは、希望するならば、
+ 楽曲の最後からの時間も表示できる。それらの機能はメインの
+ transport表示の左にある小さなボタンによって制御できる。
+ </para>
+
+ <para>
+ transport上のメインコントロールはシーケンサの演奏を起動、一時停止、
+ ポインタの位置の早送り、巻き戻し、停止または楽曲の最初/最後への
+ 移動を行なう。
+ </para>
+
+ <para>
+ 追加のコントロールと &MIDI; イベントはtransport上の下部にある
+ 矢印ボタンの左に隣接しているものでon/offすることができる。
+ さらに、この特別な部分は録音、ループ、ソロとメトロノームの実行
+ ボタンがある。
+ </para>
+
+ </sect1>
+
+ <sect1 id="studio">
+ <title>スタジオ</title>
+
+ <sect2 id="studio-introduction">
+ <title>デバイス、楽器と接続</title>
+
+ <para>
+ Rosegardenは"スタジオ"という単語をコンピュータに繋がれる
+ サウンドシステムについて知っているモのすべてを参照するために
+ 使う。これは、&MIDI; とオーディオ用のハードウェアとその他の
+ サウンドソフトウェアを含んでもよく、さらに、接続状態の情報と
+ 構成(configuration)と&MIDI; パッチやその他を含んでもよい。
+ </para>
+
+ <para>
+ 用語の3つの部分はここで重要である:
+
+ <variablelist>
+
+ <varlistentry>
+ <term>デバイス</term>
+ <listitem>
+ <para>
+ <quote>デバイス</quote>はRosegardenの範囲において
+ 関係するものは、単に音を生成する能力がある何かである。
+ これはMIDIシンセサイザーやオーディオデバイスでもよい。
+ MIDIデバイスは物理的なMIDIポートに直接対応する必要は
+ ない:それらは参照することができ、特定の手段で動作する
+ ことを期待する、名前を持つ何らかのものである。MIDIパッチ
+ マップのような構成情報は、デバイスに割り当てることができる。
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>楽器</term>
+ <listitem>
+ <para>
+ 各々のデバイスはいくつかの<quote>楽器</quote>をもち、
+ それらの各々は、特定の音を作るために仮定される。それらは
+ 音を演奏するために選択されたトラックに割り当てることができる
+ ものである。既定値ではデバイスは起動時に生成される16の
+ 楽器を持つ:もしも、デバイスがMIDIデバイスであれば、16の
+ MIDIチャネルのうちの1つに初期化される。楽器はたとえば、
+ プログラムの設定、リバーブ(reverb)、ボイスなどのような
+ 特定のボイスのすべてのプロパティである。
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>接続</term>
+ <listitem>
+ <para>
+ MIDIデバイスが単に名前で、構成情報の集合の間は<quote>
+ 接続</quote>はどのMIDIポートに物理的に割り当てられている
+ かを指定する。これは、MIDIデバイス管理ダイアログ中で構成
+ することができる(オーディオデバイスは同じ方法では接続を
+ もたない)。
+ </para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </para>
+
+ <para>
+ 例をあげると、セットアップが、2つの物理MIDIポートを持つPC
+ によって成り立っていて、その1つは外部のシンセサイザー
+ が接続されていることを想像する。ここでは1台のシンセサイザーに
+ 対応するMIDIデバイスを持つために、通常Resegardenを構成する。
+ 次に、このデバイスについて、名前を修正し、マップをパッチする
+ ように構成することができ、次にサウンドカードの関連するMIDI
+ ポートにそれを結合するために接続を指定する。それぞれの16個の
+ デバイス上の既定値の楽器は適切なプログラムとともに構成でき、
+ それらをトラックに割り当てられる。</para>
+
+ <para>
+ 実際の所、Rosegardenは既定値で、起動時に有効な接続をおのおのの
+ デバイスに対して作成するだろう。そのため、上記の例では、
+ 2つのMIDIデバイスは1つのみが必要だったとしても既定値で2つの
+ デバイスが作成されるだろう。一般的に、最初のものに対して
+ 名前を変え、パッチマップを適用し、2つめのものに対しては、
+ 削除するか未使用にする。コンピュータ上のMIDIポートに実際に
+ どのシンセサイザーが接続されているかをRosegardenが知るすべは
+ ないことを記憶しておくこと。この理由により、起動時に作成され
+ るデバイスは、既定値のセットになる予定であり、構成するデバイスが
+ 本当に使うものに一致しているかどうかはあなた次第である。
+ </para>
+
+ <para>
+ 一度構成されると、スタジオのセットアップはセーブするRosegarden
+ 形式のファイルに毎回保存される。
+ </para>
+
+ </sect2>
+ <sect2 id="studio-midi-import">
+ <title>&MIDI; インポート上のスタジオのマッピング</title>
+ <para>
+ 楽曲情報に &MIDI;ファイルをインポートするとき、&rosegarden; は
+ &rosegarden; の楽器上に &MIDI; プログラムをどのようにマップするかを
+ 決めるために、存在するスタジオのセットアップを使用する。
+ 目的は、スタジオ中に実際に存在するマップされた1つの楽器を、
+ すべての &MIDI; プログラムが得ることを確実にすることであり、
+ (そして、そういう理由で、実際にコンピュータに割り当てられる)
+ そのため、すべての &MIDI;トラックは聞くことができる。
+
+ </para><para>
+
+ インポートされたファイル中に見付かった、&MIDI; プログラム
+ チェンジとバンクセレクトイベントはインポートのときに使用されるが、
+ スタジオ中の1まとまりの楽器から各々の&MIDI;トラックのための
+ 適切な楽器を見つけるのを手助けする手段としてのみ使われる。そのため、
+ 例をあげると、もしもスタジオが現在<acronym>GM</acronym>楽器(音源)
+ のみ含んでいるようにセットアップされていた場合で、
+ <acronym>GS</acronym> プログラムチェンジをその上に含む&MIDI;ファイル
+ をインポートした場合、&rosegarden;は<acronym>GS</acronym>バンク
+ を<acronym>GM</acronym>にリマップする。なぜならば、ファイルを
+ インポートするときに知っているすべてだからである。オリジナルの
+ <acronym>GS</acronym> プログラムナンバーを憶えているわけではない。
+
+ </para><para>
+
+ このことは、&MIDI; ファイルをインポートする前に、
+ 実際に持っているデバイス向けに正しくスタジオを
+ 構成することを確実にしなければならない、ということを意味する。
+ それ以外では、&MIDI;ファイル中のプログラムデータは失われるだ
+ ろう。
+
+ </para>
+ </sect2>
+
+ <sect2 id="studio-device-editor">
+ <title>MIDIデバイスの管理</title>
+
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-devicemanager.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase>The MIDI device manager</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+
+ <para>
+ MIDIデバイスマネージャダイアログは現在有効なMIDIデバイスと
+ どこに繋がっているかを表示する。このダイアログに到達する
+ ためには、スタジオメニューのMIDIデバイス管理機能を使う。
+ </para>
+
+ <para>
+ <link linkend="studio-introduction"> デバイス、楽器、と接続
+ </link> 中で説明されているように、既定値では Rosegardenは
+ 起動時に、もっともらしいデバイスのセットを提供しようとする。
+ しかし、既定値の構成では、通常は最適ではないかもしれないので、
+ このダイアログはデバイスの名前を変更し、それらの接続を変更
+ し、再生/録音方向の接続を修正する。
+ </para>
+
+ <para>
+ 各々のここでリストされた再生デバイスは、通信(talk to)するため
+ のMIDIトラックのためのターゲットを提供する。もしも、新しい
+ 再生デバイスを追加するならば、トラックに割り当てることができる
+ このデバイス上の16の新しい楽器を持つことができるだろう。
+ もしも、そのデバイスに対する接続を割り当てるならば、
+ トラックはその接続に割り当てられた任意のMIDIシンセサイザー
+ の適切なチャネル(楽器によって依存する)で再生するために
+ 割り当てられる。
+ </para>
+
+ <para>
+ ここでリストされた録音デバイスは、MIDIを録音することが
+ 可能なソースを意味する。それらの1つはこのダイアログ中でその
+ 時点で有効状態になっている。
+ </para>
+
+ </sect2>
+
+ <sect2 id="studio-bank-editor">
+ <title>MIDIデバイスのバンクとプログラムの管理</title>
+
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-bankeditor.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase>The MIDI bank and program editor</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+
+ <para>
+ おのおののMIDIデバイスは複数の楽器を含み、それらの楽器を
+ トラックに割り当てることができることを憶えておくこと。
+ MIDI用語中では、おのおのの楽器はMIDIシンセサイザー上の
+ 1つのチャネルに対応する。使用する各々の楽器のシンセサイザー
+ 上の有効なボイス(サウンド)のどれかを選択することができるが、
+ この理由により、すべての有効なボイスの名前をRosegardenが
+ 知っているようにする必要がある。
+ </para>
+
+ <para>
+ このダイアログはプログラムのバンク(ボイスの名前)をMIDIデバイス
+ に接続することを可能にし、それゆえ、
+ <link
+ linkend="segment-view-instrumentparameterbox">
+ 楽器パラメータボックス</link>
+ 中のそれらのボイスの1つを使うために、デバイス上の各々の楽器は
+ セットされる。
+ </para>
+
+ <para>
+ デバイスのプログラム名をセットアップするための通常の方法は、
+ 単に提供されるデバイスファイル(".rgd")の1つからそれらを
+ インポートすることである。これを行なうために、ダイアログの
+ 左のリスト中のデバイスを選択し、リストの下のインポートボタン
+ をクリックし、シンセサイザーに対応する.rgdファイルを選択する。
+ </para>
+
+ <para>
+ もしも、シンセサイザー用に何らの.rgdファイルが有効になっていない
+ のであれば、新しいバンクを作るためにこのダイアログを使うことが
+ できる。これを行なうために、シンセサイザーのMIDI実装チャート中の
+ プログラムマップを見つけ、すべての名前を手入力で入力する必要が
+ ある。次にそれを他のRosegardenユーザのために.rgdファイルに
+ エクスポートする。もしもそれを共有したいのであれば、
+ rosegarden-userメーリングリストにコンタクトしてほしい(これは
+ どのようにして、Rosegardenと共に存在するすべての.rgdファイルが
+ 含まれているかの理由である)。
+ </para>
+
+ <para>
+ もしも、ソフトウェアシンセサイザーかSountFont(.sf2)ファイルを
+ 使うサウンドカードを使っているならば、このダイアログ中に
+ .sf2ファイルから正しいプログラム名を単純に直接ロードすることが
+ できる。通常と同じようにインポートをも止められたら、.rgdファイル
+ の代わりに.sf2ファイルを選択する。
+ </para>
+
+ <sect3 id="studio-variations">
+ <title>Variations</title>
+
+ <para>
+ いくつかのMIDIデバイス(たとえばローランドからのもの)は、
+ "variations"として知られているスキームを使うプログラム名
+ を体系化している。それらのデバイスのために、一般的に
+ 基本的なプログラム名&mdash;を最初に選択することによって
+ プログラムを選択したい。そして、電子ピアノのようなプログラム
+ &mdash;上の1セットのvariationsを選択する。これは、一般的な
+ MIDIベースのシンセサイザーと対象的であり、それはバンク中に
+ それらのプログラムを組織化し、バンクを最初に選択することを
+ 期待し、次にそのバンクからプログラムを選択する。
+ </para>
+
+ <para>
+ Rosegarden はvariationを使うデバイスをサポートできるが、
+ バンクフォーマット中にプログラム名を入力しなければならない。
+ 内部的に、variationを使うデバイスはvariationsとの間で
+ 選択するために、MIDIバンク選択コントローラを使う。
+ variationを選択するために、デバイスがLSBかMSBのどちらかの
+ バンクセレクトを使うかを、シンセサイザーのドキュメントから
+ 見つけ出す必要があり、どのバンク番号がどのvariationに
+ 対応しているかを見つけ出す必要がある。次に、通常として、
+ バンクを入力し、バンクダイアログ上の、
+ "MSB/LSB上のVariationリストの表示"オプションを使い、
+ Rosegardenに楽器パラメータボックス内でそのデバイスが表示される
+ ときにバンクの代わりにvariationが表示するように伝える。
+ </para>
+ </sect3>
+
+ </sect2>
+
+ <sect2 id="studio-metronome">
+ <title>メトロノーム</title>
+ <para>
+ Rosegarden は内蔵の2ツのメトロノームを持っていて、その1つは
+ 録音中に使い、もう一つは通常の再生中にスイッチすることができる。
+ それらはMIDI楽器にノートを送ることによって動作し、両方の
+ メトロノームは同じ楽器、ピッチとベロシティ情報を使う。
+ </para>
+
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-metronome.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase>&rosegarden;'s metronome configuration dialog</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+
+ メトロノームを構成するためには、スタジオメニュー上の
+ "メトロノームの管理"オプションを使いメトロノームダイアログを
+ 起動する。そののち、メトロノームのためのMIDI楽器とメトロノーム
+ の解像度(1つのビートあたりのティック、ビートの再分割、
+ あるいはビートあたり1つ)を選択できる。MIDIシンセサイザーの
+ 実際のボイスのようなプロパティは選択された楽器に依存する
+ メトロノームのティックのために使われ、トラックに割り当てられた
+ 楽器に依存するMIDIトラックのために使われるボイスのようである。
+ メインウィンドウ上でそれにをラックを割り当てることで楽器を
+ 構成することができ、楽器パラメータボックスから正しいプログラム
+ を選択することができる。
+ </para>
+
+ <para>
+ メトロノームの録音と再生はTransportウィンドウでメトロノーム
+ ボタンによってonまたはoffすることができる。このボタンは
+ 録音が供給されているか、実行中の時にメトロノームの録音を制御し、
+ 録音メトロノームはonにされ、再生メトロノームはoffにされる。
+ </para>
+ </sect2>
+
+ <sect2 id="studio-midi-filters">
+ <title>MIDIフィルタ</title>
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-midifilter.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase>The MIDI filter dialog</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+
+ <para>
+ このダイアログを使うことで、どのMIDIイベントをRosegardenが
+ MIDI THRUを使ってイベントを送るか、それを単に録音するかで
+ 受け付けたり無視したりすることを決められる。このダイアログ上の
+ チェックボックスを使うことで、RosegardenにどのタイプのMIDI
+ イベントを送るか録音するかを希望しないことを伝える。
+ </para>
+
+ </sect2>
+
+ </sect1>
+
+ <sect1 id="quantization">
+ <title>Quantization</title>
+ <para>
+ "Quantization" は音符の再ポジショニングのプロセスとその他の
+ イベントであり、 so that they start or finish on exact beat divisions.
+ It is traditionally used to make an approximate performance
+ into a precise but rather mechanical-sounding one, either
+ because precision is the desired effect or for a result such
+ as making the notes clearer in notation.
+ </para>
+
+ <para>
+ The quickest way to quantize something is to do it in the main
+ window, using the Quantize menu on the <link
+ linkend="segment-view-segmentparameterbox">Segment Parameter
+ Box</link>. If you select some segments and change the value
+ shown in the menu, the segments will immediately be quantized
+ so that all their notes start at multiples of the note
+ duration in the menu.
+ </para>
+
+ <para>
+
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-gridquantizer.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase>&rosegarden;'s quantize dialog</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ For more control, use the Quantize function on the Segments
+ menu of the main window, or on the Transforms menu of the
+ matrix or notation editors. This shows you a dialog in which
+ you can select the precise quantization parameters you need,
+ and then it applies these to all of the selected segments or
+ notes.
+ </para>
+
+ <para>
+ <!-- !!! to be continued -->
+ </para>
+
+ </sect1>
+
+ <sect1 id="matrix-view">
+ <title>マトリクスエディタ</title>
+ <para>
+ &rosegarden;のマトリクスエディタは、クリヤで論理的な形式で
+ 音楽を表示し、編集することを可能にする。それぞれの音符は
+ グリッド中のブロックとして表わされ、高さはピッチに関連する。
+ </para>
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-matrixview.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase>&rosegarden;'s matrix editor</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ それぞれのマトリクスエディタウィンドウは1つのセグメントを表示する。
+ セグメントを編集するために、メインキャンバス上で右クリックし、
+ メニューからマトリクスエディタを選択する。代わりに、セグメントを
+ ダブルクリックするときにマトリクスエディタが既定値のエディタに
+ なるようにRosegardenを設定することも可能である。
+ </para>
+
+ <sect2 id="matrix-insertion">
+ <title>音符の挿入</title>
+ <para>
+ マトリクスビューにノートを挿入する一番簡単な方法は、マウスを
+ 使うことである。これを行なうために、ツールバー上で鉛筆ツール
+ を選択し、マトリクスエディタ上にクリックしドラッグする。
+ 音符と、そこでクリックした点に関連するピッチが入力され、
+ マウスボタンをリリースする前に関連した距離に関連するduration
+ を持つだろう。
+ </para>
+
+ <para>
+ 既定値では、時間とdurationはツールバー又は表示メニュー上のグリッド
+ 設定に添った形で、特定のグリッドユニットに貼り付けられる。
+ クリックとドラッグ中にシフトキーを押したままにすることでこの効果を
+ 抑止できる。
+ </para>
+
+ <sect3 id="matrix-insertion-keyboard">
+ <title>PCキーボードからのノートのタイプ</title>
+
+ <sect4>
+ <title>Duration</title>
+
+ <para>
+ キーボードからのノートのdurations入力は、ツールバー又は
+ 表示メニュー上のグリッド設定によって制御される。これを
+ 以下の数字キーを使って設定することができる:</para>
+
+ <itemizedlist>
+ <listitem><para><keycap>5</keycap> &ndash; Whole bar</para></listitem>
+ <listitem><para><keycap>1</keycap> &ndash; Beat</para></listitem>
+ <listitem><para><keycap>2</keycap> &ndash; Half note (minim)</para></listitem>
+ <listitem><para><keycap>4</keycap> &ndash; Quarter note (crotchet)</para></listitem>
+ <listitem><para><keycap>8</keycap> &ndash; Eighth note (quaver)</para></listitem>
+ <listitem><para><keycap>6</keycap> &ndash; Sixteenth note (semiquaver)</para></listitem>
+ <listitem><para><keycap>3</keycap> &ndash; Thirty-second note (demisemiquaver)</para></listitem>
+ <listitem><para><keycap>0</keycap> &ndash; Sixty-fourth note (hemidemisemiquaver)</para></listitem>
+ </itemizedlist>
+
+ </sect4>
+
+ <sect4>
+ <title>ピッチ</title>
+
+ <para>
+ 一旦正確なdurationがグリッドメニュー中で選択されると、
+ 以下のピッチキーの1つを押すことによって、
+ <link linkend="nv-rulers">カーソルの挿入</link>による
+ 現在の位置にノートを挿入できる。
+ </para>
+
+ <itemizedlist>
+ <listitem><para><keycap>A</keycap> &ndash; ド (the tonic of the current key in the current clef)<!-- !!! FIXME: no clef in matrix view --></para></listitem>
+ <listitem><para><keycap>S</keycap> &ndash; レ</para></listitem>
+ <listitem><para><keycap>D</keycap> &ndash; ミ</para></listitem>
+ <listitem><para><keycap>F</keycap> &ndash; ファ</para></listitem>
+ <listitem><para><keycap>J</keycap> &ndash; ソ</para></listitem>
+ <listitem><para><keycap>K</keycap> &ndash; ラ</para></listitem>
+ <listitem><para><keycap>L</keycap> &ndash; シ</para></listitem>
+ </itemizedlist>
+
+ <para>キーを押す間に<keycap>Shiftキー</keycap>を押すと、
+ ノートが半音上がり、(シャープが定義されていないミとシは
+ 除く) <keycap>Shift</keycap>と<keycap>Ctrl</keycap>キーを
+ 一緒に押すと、半音下がる(ファとドを除く)</para>
+
+ <para>
+ 1オクターブ上を入力する場合は、
+ use the corresponding
+ keys on the next row up: <keycap>Q</keycap>,
+ <keycap>W</keycap>, <keycap>E</keycap>, <keycap>R</keycap>,
+ <keycap>U</keycap>, <keycap>I</keycap>, と
+ <keycap>O</keycap>を使う。
+ 同様に、1オクターブ下を入力する場合には
+ <keycap>Z</keycap>, <keycap>X</keycap>,
+ <keycap>C</keycap>, <keycap>V</keycap>, <keycap>B</keycap>,
+ <keycap>N</keycap> と <keycap>M</keycap>を使う。</para>
+
+ </sect4>
+
+ <sect4>
+ <title>その他の注意すべき点</title>
+
+ <para>
+ すべてのコマンドの挿入はツールメニューのサブメニュー上で
+ 有効である。たった1つのノートを挿入するためにメニューを
+ 辿っていくことはありそうもないが、メニューはキーボード
+ ショートカットを表示しているので、どのキーがどの機能に
+ 割り当てられているかを忘れた場合には役に立つリファレンスを
+ 提供する。</para>
+
+ <para>
+ キーボードショートカットはQWERTYレイアウトキーボード用に
+ 現在デザインされている。その他のレイアウトにキーをリマップ
+ する方法はまだなく、設定メニュー上の"ショートカットの構成"
+ オプションを使うことによって各々のキーの再定義を個別に行なう??。
+ short of reassigning each
+ key individually using the "Configure Shortcuts..." option
+ on the Settings menu.</para>
+
+ </sect4>
+
+ </sect3>
+
+ <sect3 id="matrix-insertion-midi">
+ <title>MIDIキーボードからのノートの入力</title>
+
+ <para>
+ MIDIキーボード又はその他のMIDI制御デバイスを使うことで
+ マトリクスエディタ中にノートを入力することができる。
+ マトリクスエディタはキーボード上で演奏したピッチを使うが、
+ durationsはエディタそれ自身でのグリッドの設定中で選択したもの
+ You can enter notes into the matrix editor one at a time
+ using a MIDI keyboard or other MIDI control device. The
+ matrix editor uses the pitches you play on the keyboard,
+ but the durations you have selected in the Grid setting of
+ the editor itself. これは"ステップ録音"として知られている。
+ </para>
+
+ <para>
+ MIDIキーボードからノートを入力するために、最初に既定値の
+ MIDIデバイスにキーボードを構成することを確実にする必要が
+ ある。次に、ツールバー又は表示メニュー中で、このコントロールが、
+ ノートのdurationとなる正しいグリッド設定を確実にする必要がある。
+ Then make sure you have the right Grid
+ setting in the View menu or toolbar, as this controls the
+ note duration.
+ 次に、マトリクスエディタのツールバー上のステップ録音ボタンか
+ ツールメニューのステップ録音を選択する。MIDIキーボード上で
+ 押されたすべてのノート上のその点は、ウィンドウがクローズするか、
+ 別のウィンドウが有効になるか、再度ステップ録音がoffにされるまで
+ そのウィンドウ中に現在の挿入時間で挿入される。
+ </para>
+
+ <para>
+ 異なったdurationのノートを挿入するために、ステップ録音実行
+ 中の間グリッド設定を変更することができる。
+ </para>
+ </sect3>
+ </sect2>
+
+ <sect2 id="matrix-selection">
+ <title>ノートの選択</title> <para>
+ マトリクスエディタ中でノートを選択するために、選択(矢印)ツール
+ にスイッチし、次に、選択したいノートを含む四角の領域を囲む。
+ 選択されたイベントは青でハイライトされる。もしも1つのイベント
+ 上で代わりにクリックすると、そのイベントのみが選択される。
+ </para><para>
+ もしも、<keycap>シフト</keycap>キーを、ノートをクリックするか、
+ 四角で囲む間押しているならば、新しい選択が、置き代わる代わりに
+ 存在する任意の選択に追加される。
+ </para>
+
+ <para>
+ 選択を解除したい場合には、マトリクスエディタの空白の場所で
+ クリックするか、エスケープキーを押す。</para>
+
+ <para>
+ マトリクスエディタの左端のピアノキーボードの下中でキー上で
+ シフトしながらクリックすることによって与えられたピッチの
+ ノートをすべて選択することができる。ピッチの範囲を選択する
+ ために、シフトキーをOSIながらドラッグすることもできる。この選択
+ は、今まで選択したものに追加されるので、新しく選択したい場合には
+ 古いものを先に消す。
+ </para>
+ </sect2>
+
+ <sect2 id="matrix-editing">
+ <title>音符の移動とコピー</title>
+ <para>
+ 移動ツールと共にクリックしてドラッグするか、選択の後
+ 選択ツールと共にドラッグするかをマトリクスエディタで
+ 行なうことによって時間とピッチの両方中でノートを移動
+ することができる。
+ </para>
+ <para>
+ ノートをコピーするためには、まず選択し、標準のコピーと
+ 貼り付け機能を使う。貼り付け後、張り付けられた音符は
+ 代わりに選択され、必要なところにどこにもドラッグすることが
+ できる。
+ </para>
+ </sect2>
+
+ <sect2 id="matrix-view-options">
+ <title>マトリクス表示の設定</title>
+ <para>
+ <!-- zoom, rulers etc -->
+ </para>
+ </sect2>
+ </sect1>
+
+ <sect1 id="notation-view">
+ <title>Notationエディタ</title>
+
+ <!-- Introduction, purpose -->
+
+ <sect2 id="nv-introduction">
+ <title>概要</title>
+
+ <para>
+
+ &rosegarden;のnotationエディタは、伝統的なスコア記法中で
+ 1つまたはそれ以上のstaffを表示、編集することを可能にする。
+
+ </para><para>
+
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-notationview.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase>&rosegarden;'s notation editor</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ &rosegarden; はシーケンサアプリケーションとして、その主要な
+ 焦点と互換性を持つ、最高のレイアウトを提供しようとする。
+ This means that although the editor supports
+ chords, overlapping and nested beamed groups, triplets and
+ arbitrary tuplets, grace notes, dynamics, accents, text and
+ so on, it does not provide as much fine control over layout
+ (especially in contrapuntal music) as a dedicated score
+ editing program might.
+
+ 写植によい形式である、
+ <link linkend="commands-main-file-export-lilypond">
+ Lilypondファイル</link> を書くことができるのにもかかわらず、
+ 写植品質の楽譜を&rosegarden;は生成することを目的としない。
+
+ </para>
+ </sect2>
+
+ <!-- Single and multiple staffs, and "current staff" -->
+
+ <sect2 id="nv-staffs">
+ <title>1つまたは複数のstaff</title>
+
+ <para>
+ &rosegarden;メインウィンドウからnotationエディタを開く
+ 3つの方法がある(それらはすべて、メインウィンドウに
+ いくつかのセグメントが存在することを最初に要求し、
+ そのため、もしも、新しい楽曲構成を始めるならば、
+ それを編集することを考え始める前に、セグメントを
+ 作成する必要がある)。
+
+ <variablelist>
+
+ <varlistentry>
+ <term>セグメント上でのダブルクリック</term>
+ <listitem>
+
+ <para>
+ 最も明らかな手段は、メインキャンバス中でセグメントを
+ ダブルクリックする方法である。これは既定のエディタ
+ (notation、マトリクスまたはイベントリスト)として
+ 構成されているもので、どこででもセグメントを
+ オープンし、既定値でこれはnotationエディタである。
+ そのため、Notationエディタウィンドウ中で1つの
+ staffとして、1つのセグメントをダブルクリックする
+ と開く。</para>
+
+ <para>
+ この方法で複数のstaffをオープンすることもできる。
+ シフトキーを押しながら、オープンしたい複数のセグメントの
+ 各々を、メイン表示上で選択(1つのマウスクリック)するが、
+ 最後のものをダブルクリックする。選択されたすべての
+ セグメントは1つのnotationウィンドウ中に一緒に
+ オープンされる。
+ </para>
+
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>既定のエディタメニュー機能でのオープン(リターンキー)</term>
+ <listitem>
+
+ <para>
+ リターンキーは既定のエディタメニュー機能の中のオープン
+ のショートカットであり、それはダブルクリックと同じ
+ である。notationエディタ中で現在選択されている
+ セグメントすべてをまとめてオープンするか、既定値として
+ 構成したその他のエディタでオープンする。</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>Notationエディタメニュー機能内でのオープン</term>
+ <listitem>
+
+ <para>代わりに、メインウィンドウのメニュー機能内の
+ オープンた、キャンバス内のセグメント上の右ボタンの
+ ポップアップメニュー上でオープンすることもできる。
+ 希望のセグメントを選択(上記のようにシフトキー+クリックか、
+ <link linkend="commands-main-edit-select-all-segments">
+ すべてのセグメントの選択</link>機能のどちらか)し、
+ 次に、Notationエディタ中でオープンを選択する。
+ </para>
+ </listitem>
+
+ </varlistentry>
+ </variablelist>
+
+ </para>
+
+ <para>
+ もしも1つ以上のstaff(すなわちセグメント)をnotationエディタ
+ 内で表示したいのであれば、一時にそのうちの1つのみが"カレント"
+ にできる。
+ カレントstaffは、その上に挿入カーソルを持つことで識別すること
+ ができ(<link linkend="nv-rulers">ルーラとカーソル</link>
+ を参照)、挿入用カーソルを使う編集操作が起こった上のstaff
+ である。this is the staff on which any editing
+ operations that use the insert cursor will take place.
+ 最上部のstaffは既定値ではカレントであるが、その上で
+ コントロールキーを押しながらクリックするか、
+ Staff上のカーソルを上に
+ とStaff上のカーソルを下にメニュー機能を使うことで、
+ 違ったstaffに切り替えることができる。
+ </para>
+
+ </sect2>
+
+ <!-- Linear and page layouts -->
+
+ <sect2 id="nv-layout">
+ <title>リニアとページレイアウト</title>
+
+ <para>
+ notationエディタがstaffを表示する通常の方法は、
+ リニアレイアウトとして知られているものである。1つのstaff
+ がその他の一番上にあり、それぞれのstaffは単独の、水平に
+ スクロール可能な長い行になっている。エディタ上のいくつかの
+ 機能は(<link linkend="nv-rulers">ルーラ</link>のようなもの)
+ リニアレイアウトのみで有効である。
+ </para>
+
+ <para>
+ しかし、2つの違ったページベースのレイアウト内でstaffを
+ 表示させることも可能である。継続(Continuous)ページ
+ と複数(Multiple)ページである。</para>
+
+ <para>
+ 継続ページレイアウト内では、楽曲はウィンドウとして同じ
+ 幅の無限の高さのページとして編集される。各々のstaffは
+ 各行の終わりで区切られ、残りのstaffを以下に持つ新しい
+ 行で始まる。
+ </para>
+
+ <para>
+ 複数ページレイアウトでは楽曲は印刷されるときに真のページに
+ 分割される。それぞれのページのサイズは、実際に印刷される
+ 的にそれぞれのラインにほぼ同じ量の楽曲がフィットするように
+ 計算される(構成ダイアログ中で印刷の改造度のために指定された
+ ポイントサイズに従って)。印刷バージョンは、印刷するときに
+ 明確な紙の大きさとマージンに依存するので、まったく同じという
+ ことはありそうもないが、A4サイズを使うときにはそれはかなり
+ 近くなければならない。
+ </para>
+
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-notationview-multipage.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase>複数ページレイアウトでの&rosegarden;のnotationエディタ</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ ほとんど、但し全部ではない、表示と編集機能はリニアレイアウト
+ と同じようにページレイアウトモードで動く。
+ </para>
+
+ <para>
+ 3つのレイアウトモードを切り替えるためには、リニアレイアウト、
+ 継続ページレイアウトと複数ページレイアウトメニュー機能を使う。
+ </para>
+ </sect2>
+
+ <!-- Rulers and Cursors -->
+
+ <sect2 id="nv-rulers">
+ <title>ルーラとカーソル</title>
+
+ <para>
+ &rosegarden;notation エディタウィンドウは2つのルーラと
+ カーソルを含んでいる。ルーラはメインnotationキャンバスの
+ 上から下までtickmarkとともに水平のstripで分割されていて、
+ カーソルはエディタ中のトップのstaffの開始点に初期状態として
+ 垂直の色が付いた行としてある。
+ </para>
+
+ <para>
+ 紫色のカーソルは挿入カーソルである。これは、挿入かペースト
+ が起こるような動作のポイントを表示する。上部のルーラ上で
+ ドラッグかクリックをするか、(任意のイベントを避ける)空白の
+ staffの一部上でクリックするかドラッグするか、<keycap>
+ コントロール</keycap>キーを押したままどこかでクリックすること
+ で挿入カーソルを移動することができる。
+ </para>
+
+ <para>
+ 一度に1つのイベントを、挿入カーソルを移動するために、左か右の
+ 矢印キーを使うことができる。もしも<keycap>コントロール</keycap>
+ キーを、矢印キーを押すときに押していると、カーソルは一度に
+ すべてのバーを移動する。もしもシフトキーを押しているならば、
+ カーソルはそれらをパスするように、
+ <link linkend="nv-tools-selections">イベントの選択</link>
+ を行なう。
+ </para>
+
+ <para>
+ 青のカーソルは再生ポインタである。マトリクス表示とメイン
+ ウィンドウ内の同様のカーソルと同じく、これは、現在の再生
+ または録音位置を示す。これは下の方のルーラで位置を変更できる。
+ </para>
+
+ <para>
+ ルーラは<link linkend="nv-layout">リニアレイアウト</link>
+ モードでのみ表示されることに注意。
+ </para>
+
+ </sect2>
+
+ <!-- Display conventions (annotated picture with some selected notes,
+ some quantized notes, a bar of incorrect length etc) -->
+
+ <!-- Tools and Selections -->
+
+ <sect2 id="nv-tools-selections">
+ <title>ツールと選択</title>
+ <para>
+ ほとんどの、&rosegarden; Notationエディタのメニューと
+ ツールバー編集機能は<quote>ツール</quote>、<quote>
+ 選択を行なう機能</quote>と<quote>ドラッグ操作</quote>
+ の3つの機能に分類される。
+ </para>
+
+ <variablelist>
+ <varlistentry>
+ <term>ツール</term>
+ <listitem>
+ <para>
+ 基本的なツールはツールバーボタンから通常アクセスできる、
+ 選択ツール、消去ツールと、ノートの挿入、rests、テキスト
+ その他のためのそれらである。ツールを選択すると、代わりに
+ 少なくとも他のツールが選択されるまで、メインnotation
+ キャンバス上でマウスボタンの既定の動作が変わる。たとえば、
+ 選択ツールを選択すると、選択が可能になり、(以下の)
+ 選択ベースの機能が使えるようになる。挿入ツールを選択すると
+ (たとえばノートの1つ)、<acronym>GUI</acronym>の動作が
+ 切り替えられ、キャンバス上でクリックすることでノートを
+ 挿入できる。削除ツールはそれらをクリックすることでイベントを
+ 削除する。
+ </para>
+ <para>
+ ツール目丹生を使うことで現在のツールを変更することもできる。
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>選択操作上の機能</term>
+ <listitem>
+ <para>
+ 残りの大多数のメニュー機能は使うことができる前にキャンバス
+ 上で選択されることを要求する。そのうちのいくつかは、
+ (たとえば、<guimenuitem>Cut</guimenuitem> や
+ <guimenuitem>Note スタイル</guimenuitem>機能)
+ 選択されたイベント上で動作する。その他は
+ (たとえば<guimenuitem>Grace Notes</guimenuitem>や
+ <guimenuitem>Stem Directions</guimenuitem>機能)
+ 選択がいくつかのnoteを含むまで実行を凍結する。
+ </para>
+ <para>
+ キャンバス上のいくつかのイベントを選択するために、
+ 選択(矢印)ツールに切り替え、選択したいイベントを含む
+ 矩形領域を囲む。選択されたイベントは、青にハイライト
+ される。もしも1つのイベント上でクリックすると、
+ そのイベントのみが選択される。
+ <footnote><para>
+ そのイベントのために編集ダイアログをオープンするために
+ 1つのイベント上でダブルクリックをすることもできるが、
+ それは選択には何の動作もしない。</para></footnote>。
+ </para>
+ <para>
+ もしも、<keycap>シフト</keycap>を矩形領域からドラッグ
+ アウトする間押しているならば、そのコンテンツは置換の
+ 変わりに存在する任意の選択に追加される。
+ </para>
+ <para>
+ すべてのバーを選択するために、そのバー内のどこか空白の
+ 場所で、選択ツールと共にダブルクリックする。staffのすべて
+ をセンタcするために、3回クリックする。編集メニューは
+ 挿入カーソルの位置上を元にした拡張領域を選択するための
+ 機能を運び、シフトキーと左又は右矢印キーを押すことによって、
+ 挿入カーソルの周りのイベントを選択できる。
+ </para>
+ <para>
+ 一度に、1つのstaffより多くイベントを選択することはできない。
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>ドラッグ操作</term>
+ <listitem>
+ <para>
+ あるものの周りでドラッグを行なうことでひとまとまりの編集を
+ 確実にすることができる。選択(矢印)ツールに切り替え、
+ ノートのピッチを、その頭を上か下にクリックし、ドラッグする
+ ことによって変更でき、noteの時間とその他のイベントは、
+ それらを左か右にドラッグすることによって変更できる。
+ (残りの時間シグネチャにドラッグできないが、それ以外は
+ すべてドラッグできる。もしも1つ以上のイベントを選択
+ しているならば、一度にすべての選択がドラッグされる。)
+ </para>
+ <para>
+ ドラッグは通常ツールバー機能やメニューを使うよりも、
+ より少ない確実な手段であるが、それはより簡単である。
+ </para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </sect2>
+
+ <!-- Insertion: notes, auto-ties, accidentals -->
+
+ <sect2 id="nv-insertion">
+ <title>ノートの挿入とrests</title>
+
+ <para>
+ noteを挿入するために、ツールバー上の特定のduration上でクリックする
+ ことによってノートメニューの1つを選択し、ノートを追加したい位置の
+ staff上でクリックする。
+ </para>
+
+ <para>
+ If you add a note at the same time as an existing note of
+ different duration, the editor will generally assume that you
+ want to create chords and will split the existing or new note
+ accordingly so as to create one or more chords with ties. If
+ you really do want to chord two different durations, you can
+ select the tied noteheads and use the Collapse Equal-Pitch Notes
+ function to merge them together. Alternatively, the default
+ behaviour can be changed in the &rosegarden; configuration dialog
+ so as not to do the split at all.</para>
+
+ <para>
+ もしも、異なったduration(すなわち同じピッチ)の存在する音符の
+ 上に正確に音符を追加するならば、存在する音符のdurationは新しい
+ ものによって変更される。
+ </para>
+
+ <para>
+ もしも存在する音符と同じような時間の休符を追加するならば、
+ 音符は、おそらくそれと共に削除されるか、短くされるか、
+ restのdurationのために、封じられる。
+ If you add a rest at the same time as an existing note,
+ the note will be silenced for the duration of the rest,
+ shortening or possibly removing it altogether.</para>
+
+ <sect3 id="nv-insertion-keyboard">
+ <title>PCキーボードによる音符と休符の入力</title>
+
+ <sect4>
+ <title>Duration</title>
+
+ <para>
+ 最初に、挿入したいときに音符(又は休符)のdurationを
+ 表示するためにnotationツールを選択することを確実にすること。
+ 以下の数字キーを使うことによって色々なノートタイプを選択できる:
+ </para>
+
+ <itemizedlist>
+ <listitem><para><keycap>5</keycap> &ndash; Breve</para></listitem>
+ <listitem><para><keycap>1</keycap> &ndash; Whole note (semibreve)</para></listitem>
+ <listitem><para><keycap>2</keycap> &ndash; Half note (minim)</para></listitem>
+ <listitem><para><keycap>4</keycap> &ndash; Quarter note (crotchet)</para></listitem>
+ <listitem><para><keycap>8</keycap> &ndash; Eighth note (quaver)</para></listitem>
+ <listitem><para><keycap>6</keycap> &ndash; Sixteenth note (semiquaver)</para></listitem>
+ <listitem><para><keycap>3</keycap> &ndash; Thirty-second note (demisemiquaver)</para></listitem>
+ <listitem><para><keycap>0</keycap> &ndash; Sixty-fourth note (hemidemisemiquaver)</para></listitem>
+ </itemizedlist>
+
+ <para>数字キーを押す間に<keycap>Ctrl</keycap>キーを押すと、
+ 関連するdotted-noteツールを選択する。</para>
+
+ <para>
+ <keycap>G</keycap>キーを押すことで、tripletバージョンの
+ note durationに切り替えることができる。もう一回押すと、
+ 通常のdurationに切り替わる。ウィンドウの下部のステータス
+ バーはtriplet durationが有効の時にそれを通知する。</para>
+ </sect4>
+
+ <sect4>
+ <title>ピッチ</title>
+
+ <para>
+ notationツールが選択されると、以下のピッチキーのどれかを
+ 押すことによって<link linkend="nv-rulers">カーソルの挿入
+ </link> で現在の位置に音符を挿入することができる。</para>
+
+ <itemizedlist>
+ <listitem><para><keycap>A</keycap> &ndash; ド (the tonic of the current key in the current clef)</para></listitem>
+ <listitem><para><keycap>S</keycap> &ndash; レ</para></listitem>
+ <listitem><para><keycap>D</keycap> &ndash; ミ</para></listitem>
+ <listitem><para><keycap>F</keycap> &ndash; ファ</para></listitem>
+ <listitem><para><keycap>J</keycap> &ndash; ソ</para></listitem>
+ <listitem><para><keycap>K</keycap> &ndash; ラ</para></listitem>
+ <listitem><para><keycap>L</keycap> &ndash; シ</para></listitem>
+ </itemizedlist>
+
+ <para>キーを押している間<keycap>Shift</keycap>キーを押すと、
+ 半音noteが高くなり(#が定義されていないミとシを除く)
+ <keycap>Shift</keycap>と<keycap>Ctrl</keycap>キーを一緒に押すと、
+ 半音低くなる(ファとドを除く)
+ </para>
+
+ <para>一オクターブ高い音符を入力するためには、以下にあるキーを
+ 使う。<keycap>Q</keycap>,
+ <keycap>W</keycap>, <keycap>E</keycap>, <keycap>R</keycap>,
+ <keycap>U</keycap>, <keycap>I</keycap>と
+ <keycap>O</keycap>。同様に、オクターブ下の音符を入力する
+ ためには、 <keycap>Z</keycap>, <keycap>X</keycap>,
+ <keycap>C</keycap>, <keycap>V</keycap>, <keycap>B</keycap>,
+ <keycap>N</keycap> と<keycap>M</keycap>を使う。</para>
+
+ </sect4>
+
+ <sect4>
+ <title>休符</title>
+
+ <para>音符の代わりに休符を挿入するためには、
+ <keycap>P</keycap>を使う。その代わりに、現在のツールを
+ 切り替えてrestツールに、また、noteツールに再度戻すために、
+ <keycap>T</keycap> と <keycap>Y</keycap>を使うことができる。
+ </para>
+
+ </sect4>
+
+ <sect4>
+ <title>Chords</title>
+
+ <para>
+ 既定値のnotationエディタの動作は、音符の挿入後に挿入
+ カーソルを次に進め、メロディ中でその後に別の音符を
+ 挿入できるようになる。これは、<keycap>H</keycap>キーを、
+ chordモードに切り替えるために使うことによって、変更する
+ ことができ、最後のものの同じ時間に続く挿入が起きるchord
+ モードへ切り替えることができる。再度<keycap>H</keycap>
+ キーを押すと、メロディ挿入動作に戻る。</para>
+
+ </sect4>
+
+ <sect4>
+ <title>その他の注意点</title>
+
+ <para>
+ 挿入コマンドのすべては、ツールメニューのサブメニューで有効で
+ ある。1つのno-toを挿入するためにメニューを操作することは、
+ ありそうもないことであるが、メニューはショートカットを表示し、
+ それゆえ、どのキーがどの機能か忘れた場合に有効なリファレンス
+ を提供する。</para>
+
+ <para>
+ キーボードショートカットはQWERTYレイアウトキーボード用に
+ 現在デザインされている。その他のレイアウトにキーをリマップ
+ する方法はまだなく、設定メニュー上の"ショートカットの構成"
+ オプションを使うことによって各々のキーの再定義を個別に行なう??。
+ The keyboard shortcuts are currently designed for use
+ with a QWERTY-layout keyboard. There is not yet any way to
+ remap the keys for another layout, short of reassigning each
+ key individually using the "Configure Shortcuts..." option
+ on the Settings menu.</para>
+
+ </sect4>
+
+ </sect3>
+
+ <sect3 id="nv-insertion-midi">
+ <title>MIDIキーボードを使った音符の挿入</title>
+
+ <para>
+ MIDIキーボード又はその他のMIDI制御デバイスを使うことで
+ マトリクスエディタ中に音符を入力することができる。
+ notationエディタはキーボード上で演奏したピッチを使うが、
+ durationsはエディタそれ自身でのグリッドの設定中で選択したもの
+ をつかう。これは"ステップ録音"として知られている。
+ </para>
+
+ <para>
+ MIDIキーボードからノートを入力するために、最初に既定値の
+ MIDIデバイスにキーボードを構成することを確実にする必要が
+ ある。次に、notationツールがdurationをセットするために選択
+ されることを確実にする。次に、notationエディタのツールバー
+ 上のステップ録音ボタンかツールメニューのステップ録音を
+ 選択する。MIDIキーボード上で押されたすべてのノート上のその点
+ は、ウィンドウがクローズするか、
+ 別のウィンドウが有効になるか、再度ステップ録音がoffにされるまで
+ そのウィンドウ中に現在の挿入時間で挿入される。
+ </para>
+
+ <para>
+ 異なったdurationのノートを挿入するために、ステップ録音実行
+ 中の間別のnotationツールに変更することができ、また、chord
+ を挿入するために、Chordモードに切り替えることができる。
+ </para>
+ </sect3>
+
+ </sect2>
+
+ <!-- Keys, Clefs and Time Signatures -->
+
+ <sect2 id="nv-signatures">
+ <title>Clefs, keys, テンポと時間シグネチャ</title>
+
+ <para>
+ 時間に関係した変更(テンポと時間シグネチャ)を操作するために
+ &rosegarden;が行なう方法について知る最初のことは、clefsと
+ keysに完全に違うことが扱われる。
+ The first thing to know about the way &rosegarden; handles
+ these is that time-related changes (tempos and time
+ signatures) are treated entirely differently from clefs and
+ keys.
+ notationと同じように再生と録音を簡単に管理するために、&rosegarden;
+ はテンポと時間シグネチャが変更されることを要求し、それは一度に
+ すべてのstaffを行なう。
+ In order to simplify managing playback and recording as
+ well as notation, &rosegarden; requires that when the tempo or
+ time signature changes, it does so in all staffs at once. You
+ can't have one staff in 3/4 and another in 4/4 simultaneously,
+ or one staff playing at 120 to the beat and another at 90.
+ This applies only to time: there is no such restriction on the
+ use of clef and key changes.</para>
+
+ <para>clef, key, テンポまたは時間シグネチャをnotationエディタ
+ 内で変更したい場合、変更を行ないたい場所に<link
+ linkend="nv-rulers">挿入カーソル</link>を位置づけ、編集
+ メニュー
+ <link linkend="commands-nv-menu-edit-add-clef">Add Clef
+ Change...</link>, <link linkend="commands-nv-menu-edit-add-key-signature">Add Key
+ Change...</link>, <link linkend="commands-nv-menu-edit-add-tempo">Add
+ Tempo Change...</link> と <link
+ linkend="commands-nv-menu-edit-add-time-signature">Add Time Signature
+ Change...</link> 機能を使う。すると以下のように、変更したい固有の
+ clef,key,テンポまたは時間シグネチャを変更できる所にダイアログ
+ ボックスが表示される。</para>
+
+ <sect3 id="nv-signatures-clef">
+ <title>Clef</title>
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-clefdialog.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase>&rosegarden;'s clef dialog</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+ </sect3>
+
+ <sect3 id="nv-signatures-key">
+ <title>Key</title>
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-keysigdialog.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase>&rosegarden;'s key signature dialog</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+ </sect3>
+
+ <sect3 id="nv-signatures-tempo">
+ <title>テンポ</title>
+ <!-- Should be in general section, not notation -->
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-tempodialog.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase>&rosegarden;'s tempo dialog</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+ </sect3>
+
+ <sect3 id="nv-signatures-time-signature">
+ <title>時間シグネチャ</title>
+ <!-- Should be in general section, not notation -->
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-timesigdialog.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase>&rosegarden;'s time signature dialog</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+ </sect3>
+ </sect2>
+
+ <!-- Text -->
+
+ <sect2 id="nv-text">
+ <title>テキストと歌詞</title>
+
+ <para>
+ テキストイベント中で、staffはたくさんの種類のテキストを含む
+ ことが可能である。テキストイベントには2つの基本的なクラスがある。
+ 最初のものは、(staff中の特定の時間に関連付けられる)ツールバー
+ 中の大きな<guilabel>T</guilabel>としてマークされたボタン上で
+ 有効な、テキストツールを使うことで、作成できる。
+ 歌詞は、これと同じ方法で作成できるが、
+ <link linkend="nv-text-lyrics">歌詞エディタ</link>
+ を使うことによってより簡単に作成できる。
+ </para>
+
+ <para>
+ 小さなテキストを追加するために、追加したい点でテキストツールを
+ 選択してクリックする。ダイアログボックスが表示され、その中に
+ テキストを入力することができ、その意図された目的を選択する。
+ (Rosegarden prefers to store what the text
+ is for, rather than how it should look; this is so that in
+ future we may be able to configure how the various sorts of
+ text are presented for each individual user.)
+ 有効なpurposes(又はスタイル)は以下の通りである。
+ </para>
+
+ <variablelist>
+
+ <varlistentry><term>Dynamic</term><listitem><para> Used for
+ minor local indications such as the dynamic marks "p", "mf"
+ etc. Shown below the staff in small italic
+ type by default. </para></listitem></varlistentry>
+
+ <varlistentry><term>Direction</term><listitem><para> Used
+ when indicating significant changes in style or mood. Shown
+ above the staff in large roman type by default.
+ </para></listitem></varlistentry>
+
+ <varlistentry><term>Local Direction</term><listitem><para>
+ Used to indicate less significant changes in style or mood.
+ Shown below the staff in a smaller bold-italic roman type by
+ default. </para></listitem></varlistentry>
+
+ <varlistentry><term>Tempo</term><listitem><para> Used to
+ indicate significant changes in tempo. Shown above the
+ staff in large bold roman type by default.
+ </para></listitem></varlistentry>
+
+ <varlistentry><term>Local Tempo</term><listitem><para> Used
+ to indicate more minor or local changes in tempo. Shown
+ above the staff in a small bold roman type by default.
+ </para></listitem></varlistentry>
+
+ <varlistentry><term>歌詞</term><listitem><para>
+ <link linkend="nv-text-lyrics">歌詞エディタ</link>
+ を使うことで通常歌詞は作成できるが、このスタイルを使うことで
+ 1語1語入力することもできる。このスタイルは既定値では
+ 小さなroman type でテキストの下に表示される。
+ (注意:もしもこの方法で歌詞を入力し、staffの歌詞を
+ あとで編集する場合、この方法で入力した任意の歌詞は、
+ その位置が、もしも、歌詞エディタによって期待される所と適合して
+ いなければ、変更又は移動される。)
+ </para></listitem></varlistentry>
+
+ <varlistentry><term>Annotation</term><listitem><para> Used
+ for helpful text that is not strictly considered part of the
+ score. Shown below the staff, boxed-out in a yellow
+ sticky-label-style box by default.
+ </para></listitem></varlistentry>
+
+ </variablelist>
+
+ <para>
+ テキストツールで存在するテキスト上でクリックすることで、
+ 作成した後にテキストを編集することもできる。</para>
+
+ <sect3 id="nv-text-lyrics">
+ <title>歌誌の編集</title>
+
+ <para><guimenu>表示</guimenu>メニュー中の、
+ <guimenuitem>歌詞エディタのオープン</guimenuitem>オプション
+ から、歌詞エディタは有効であり、これは、一度に1つのstaffの
+ ためにすべての歌詞イベントを編集することができるようになり、
+ これは基本の本文編集システムを使う。これを使うために、メニュー
+ オプションを有効にし、残りのダイアログ中で歌詞を編集し、
+ OKをクリックする。</para>
+
+ <para>The lyrics you enter should follow a particular
+ format. Bar lines are vital to avoid the editor getting
+ confused, and are represented with a slash ("/"). Within
+ each bar the individual syllables are separated by spaces
+ (at least one space: the editor doesn't care about any extra
+ whitespace). Each syllable in turn will be attached to the
+ next subsequent note or chord within that bar (although at
+ the moment the editor can get quite confused by chords that
+ are not exact, i.e. that require smoothing or
+ quantizing).</para>
+
+ <para>If you want a note to have no syllable attached to it,
+ you need to provide a dot (".") as the syllable for that
+ note. (This is why the default lyric text for a segment is
+ usually full of dots.) Remember to separate the dots with
+ spaces, so that they are clearly separate syllables.</para>
+
+ <para>If you want more than one syllable on the same note,
+ with a space between them, use a tilde ("~") instead of the
+ space. It will be shown as a space on the score.</para>
+
+ <para>If you want to split a syllable across two notes, with
+ a hyphen, you need to enter a space following the hyphen so
+ the editor knows to treat it as two syllables. (Hyphens get
+ no special treatment within syllables.)</para>
+
+ <para>Syllables consisting only of numbers surrounded by
+ square brackets (like "[29]") will be ignored; this is the
+ format used for the automatically-generated bar numbers
+ shown in the editor.</para>
+
+ <para>You should also be aware that the textual format of
+ lyrics is only used for editing: the lyrics are actually
+ stored as distinct text events (one per syllable). This
+ means that the text format may potentially change in the
+ future to accommodate more advanced editing capabilities,
+ although the event format should not change and so your
+ saved files should continue to be compatible.</para>
+
+ </sect3>
+
+ </sect2>
+
+ <!-- Indications -->
+
+ <sect2 id="nv-indication">
+ <title>スラーとhairpins</title>
+
+ <para>スラーとhairpin dynamic markingsはイベントとして、
+ noteやrestsと同じように保存される。これらを生成するために、
+ カバーしたいもの(一続きのnoteやその他)の領域を選択し、次に、
+ <guimenu>グループ</guimenu>メニューからの
+ <guimenuitem>スラーの追加</guimenuitem>,
+ <guimenuitem>クレッシェンドの追加</guimenuitem> または
+ <guimenuitem>デクレッシェンドの追加</guimenuitem> options from
+ the <guimenu>Group</guimenu> を選択する。</para>
+
+ <para>その他のイベントと同じように、スラー又はhairpin を取り除く
+ ことができる。選択ツールを使って選択し、<keycap>Delete</keycap>
+ キーを押すか、削除ツールを有効にしてそれをクリックする。</para>
+
+ </sect2>
+
+ <!-- Stem direction, slashes etc -->
+
+ <sect2 id="nv-note-qualities">
+ <title>Note stems and slashes</title>
+
+ <para>You can set the stem direction of any selected notes
+ (provided they are a sort that have stems) using the three
+ Stem Direction options on the Notes menu. The options allow
+ you to either fix the stems up or down, or revert to the stem
+ direction that &rosegarden; would otherwise have chosen. See
+ also <link linkend="nv-beamed-groups">Beams</link>.</para>
+
+ <para>The <guimenu>Notes</guimenu> menu also contains options for adding slashes
+ across note stems, for example to indicate short repeated
+ notes or drum rolls. These are currently purely notational;
+ &rosegarden; will not take them into account when playing the
+ staff or generating &MIDI;.</para>
+ </sect2>
+
+ <!-- Beamed groups, including overlapping and nesting them -->
+
+ <sect2 id="nv-beamed-groups">
+ <title>Beams</title>
+
+ <para>Adding beams to notes is considered a grouping operation
+ in the &rosegarden; Notation editor, available on the <guimenu>Group</guimenu>
+ menu. Select the notes you want to beam, and use the Beam
+ <guimenu>Group</guimenu> menu option. To remove a beam, select the notes and use
+ the <guimenuitem>Unbeam</guimenuitem> menu option.</para>
+
+ <para>It is possible to have more than one beamed group
+ happening at the same time &mdash; you just select and beam the
+ separate groups one at a time &mdash; but Rosegarden is usually not
+ yet clever enough to work out which notes should have stems up
+ and which should have stems down for simultaneous beamed
+ groups, so you will probably have to set the stem directions
+ of the notes in the groups explicitly as well as beaming them.</para>
+
+ <para>&rosegarden; can attempt to guess a sensible beaming for a
+ piece of music, provided it's not too complicated. To invoke
+ this, select the notes you want to calculate the beaming for
+ (for example by triple-clicking to select a whole staff) and
+ then use the <guimenuitem>Auto-Beam</guimenuitem> option on the
+ <guimenu>Group menu</guimenu>. Auto-beaming
+ is also done automatically when loading a &MIDI; file, for
+ example, and the editor also does some automatic beaming as
+ you enter notes (this can be disabled by changing the
+ "Auto-Beam when appropriate" setting on the configuration
+ dialog or the insertion tool's right-button menu).</para>
+
+ </sect2>
+
+ <!-- Tuplets -->
+
+ <sect2 id="nv-tuplets">
+ <title>三連符とその他の連符</title>
+
+ <para>A triplet group consists of three notes or chords played
+ in the time of two. (More precisely, it consists of notes
+ with a total duration of three arbitrary units played in the
+ time of two of those units.)</para>
+
+ <para>We use the word <quote>tuplet</quote> to describe the general
+ situation in which notes with a total duration of any given
+ number of units are played in the time of a different number
+ of those units: nine notes in the time of eight, or six in the
+ time of four, or a crotchet and a quaver in the time of a
+ single crotchet, or even two notes in the time of three. (At
+ present &rosegarden; does not support the last example &mdash; tuplet
+ groups must always be played with a shorter duration than
+ written.)</para>
+
+ <para>The triplet and tuplet menu functions work by taking an
+ existing series of notes or rests and squashing them so they
+ play quicker, filling in the left-over space at the end of the
+ series with a final rest and drawing the whole as a tuplet
+ group. You can therefore create a new series of triplets by
+ entering the first two notes of the series (in their normal
+ form), making them into triplets, and then filling in the rest
+ left over by the triplet operation with the final note of the
+ triplet. Or you can apply the triplet operation before you
+ enter any notes, thus turning the original rest itself into
+ triplet form, and then insert the notes of the triplet on top
+ of it. Some examples may help:</para>
+
+ <!-- Need examples and screenshots -->
+
+ <!-- Then discuss general tuplet dialog... -->
+
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-tupletdialog.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase>&rosegarden;'s general tuplet dialog</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+
+ <para>To specify a general tuplet group, we need to know what
+ the base note is (for example, if we play three crotchets in
+ the time of two then the base is a crotchet) and the ratio of
+ the number of base notes written to the number played.</para>
+
+ <!-- Then discuss "tuplet mode": with a subtitle? -->
+
+ </sect2>
+
+ <!-- Grace notes -->
+
+ <!-- Paste -->
+
+ <sect2 id="nv-paste-types">
+ <title>Paste types</title>
+
+ <para>
+ The meaning of <quote>cut and paste</quote> is less obvious for a music
+ editing program than it is for something like a word
+ processor in which the letters and words go in a simple
+ linear order. Accordingly, &rosegarden;'s Notation editor
+ offers several different types of Paste operation, as well
+ as separate <link
+ linkend="commands-nv-menu-edit-cut">Cut</link> and <link
+ linkend="commands-nv-menu-edit-cut-and-close">Cut and
+ Close</link> functions.
+ </para>
+
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-pastedialog.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase>&rosegarden;'s paste-type dialog</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+
+ The types of Paste operation are:</para>
+
+ <variablelist>
+
+ <varlistentry>
+ <term>Restricted</term>
+ <listitem>
+ <para>Requires an existing gap (containing nothing but
+ rests) of enough duration to completely contain the
+ clipboard's contents. The contents are pasted into
+ the gap. If there is no gap long enough, the paste
+ is not carried out.
+ </para>
+ <para>
+ This is the default paste type.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>Simple</term>
+ <listitem>
+ <para>Erases enough events to make a gap long enough to
+ paste into, and then pastes into that. The pasted
+ events therefore completely replace any existing ones
+ in the time covered by the paste.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>Open and Paste</term>
+ <listitem>
+ <para>The opposite of <link
+ linkend="commands-nv-menu-edit-cut-and-close">Cut and
+ Close</link>. Makes room for the paste by moving all of the
+ subsequent events further towards the end of the
+ composition.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>Note Overlay</term>
+ <listitem>
+ <para>Carries out a paste in the way that it would
+ happen if you entered each of the notes in the clipboard
+ yourself using the notation editor: if there are other
+ notes overlapping with them, the new or existing notes
+ will be split into ties appropriately.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>Matrix Overlay</term>
+ <listitem>
+ <para>Carries out a paste in the way that it would
+ happen if you entered each of the notes in the clipboard
+ yourself using the matrix editor: the notes presently
+ in the way of the paste will be ignored, allowing the new
+ notes to overlap arbitrarily with them.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ </variablelist>
+
+ <para>All of these take effect at the current position of the
+ insert cursor on the current staff. To choose between the various
+ paste types, use the <link
+ linkend="commands-nv-menu-edit-paste-dot-dot-dot">Paste...</link>
+ menu option (with dots) on the <link
+ linkend="commands-nv-menu-edit">Edit</link> menu.
+ </para>
+
+ </sect2>
+
+ <sect2 id="nv-note-styles">
+ <title>音符のスタイル</title>
+
+ <para>
+ &rosegarden;は、たとえば、音符の頭の選択、tailの数を、音符が
+ 埋まっているか埋まっていないかにかかわらず、描画された音符の
+ 色々なタイプの色々な描画方法を変更することができる。
+ </para>
+
+ <para>
+ 標準のスタイル(クラシック、クロス、三角とMensual)が提供され、
+ 音符スタイルメニューオプションを、選択した個別の音符のために
+ スタイルを変更することができる。それぞれの音符はそれに対して
+ ドのスタイルが選択されたかを憶えていて、この情報は楽曲情報
+ の中に格納される。<guimenu>設定</guimenu>メニュー中の
+ <guimenuitem>Rosegardenの構成...</guimenuitem>オプションを
+ 使うことによって新しい音符の既定値のスタイルを
+ 変更することができる。
+ </para>
+
+ <para>
+ <acronym>XML</acronym>ファイル中に音符のスタイルを記述する
+ ことによって固有の音符スタイルを作成することができる。
+ (Even the standard styles are
+ defined this way: the only reason the editor knows that a
+ Classical semiquaver has a tilted oval filled head, a stem,
+ two flags, etc., is that the description in Classical.xml
+ says so.) See the <link
+ linkend="developers-note-styles">Developers Guide</link> for
+ more information.
+ </para>
+ </sect2>
+
+ <sect2 id="nv-note-fonts">
+ <title>音符フォント</title>
+ <para>
+ &rosegarden; は、Lilypondプロジェクトによって開発された、
+ Fetaフォントという1つのスケーラブルなnotationフォントを提供
+ している。Fetaはほとんどすべての古典的な仕事のために適合して
+ いるとても高品質のフォントである。
+ </para>
+
+ <para>&rosegarden; は、数多くの、その他のnotationフォントを
+ 標準のサポートを含む。それらは、TrueType(.ttf)またはPostScript
+ Type-1(.pfb,.pfa)形式のフォントで提供されることを必要とし、
+ &rosegarden;がインストールされた場所にそれらをインストール
+ するために、関連したパーミッションを必要とする。サポートされて
+ いるnotationフォントをインストールするために、&rosegarden;
+ のインストールのためにshareディレクトリに位置づける(通常
+ /opt/kde/share/apps/rosegardenのようなKDEデスクトップの
+ インストールツリーである)。これは、"fonts"と呼ばれる
+ サブディレクトリで見付かる。そこにフォントファイルをコピーし、
+ &rosegarden;を再起動する。もしも、そのフォントがサポートされて
+ いるならば、それは、notationエディタのフォントメニューに
+ 現われる</para>
+
+ <para>完全又は部分的なサポートは以下のフォントで提供されて
+ いる:Blake HodgettsによるFughetta; "オリジナル" Finale
+ フォントのPetrucci;"新しい"Finale"フォントのMaestro;
+ SibeliusフォントのOpus;Sibelius ジャズフォントのInkpen;
+ AdobeからのSonata;CubaseシーケンサからのSteinberg;と
+ Xinfonia(上記のフォントのほとんどは、各社の登録商標で
+ ある)。THE ROSEGARDEN TEAM
+ MAKES NO REPRESENTATION AS TO THE LEGAL STATUS OF ANY USE OF
+ THESE FONTS WITH ROSEGARDEN。
+ It is your responsibility to
+ ensure you are in compliance with the licence (if any) under
+ which a font was provided to you, before attempting to use it.
+ If you are not sure whether you have the right to use a font,
+ don't: apart from anything else, the standard Feta font better
+ than most of these anyway.</para>
+
+ <para>It is also possible to provide new mapping files so as
+ to use new fonts. For some fonts that have similar mappings
+ or metrics to fonts in the above list, this may be as simple
+ as editing the name of the font in the mapping file. See the
+ <link linkend="developers-note-fonts">Developers Guide</link>
+ for more information.
+
+ </para>
+ </sect2>
+
+
+ <!-- Quantization, smoothing, and display of quantized notes -->
+
+ <sect2 id="nv-quantization">
+ <title>Notation from performance data</title>
+
+ <para>
+ &rosegarden; は多用途のプログラムである。これはnotation
+ エディタであるが、第一次的にはシーケンサと音楽を演奏する
+ ためのプログラムである。さらに、演奏中、もちろん、時間と
+ noteのduration は印刷された楽譜上ほど明確ではない。
+ </para>
+
+ <para>
+ これは、notationエディタ中で意味のあるnoteを表示させるために
+ 大量の基本的なnoteの時間とdurationを試みることを&rosegarden;
+ が行なうためにそれはたびたび望ましいことを意味する。これは
+ quantizationの一種であるが、大量の、驚くべき、あてずっぽうで
+ うまく行なうことを要求する種類のものである。&rosegarden;は、
+ 平面のグリッドquantizerよりもわずかによい仕事を行なうために
+ デザインされたquantizerを含む。</para>
+
+ <para>Applying
+ quantization strictly for notation is rather unimaginatively
+ referred to as <quote>notation quantization</quote>: it only
+ applies to the notes you see and edit in notation, and
+ doesn't affect the notes that play, or that you edit in
+ other views such as the matrix. This quantization is
+ automatically applied to music imported or recorded from
+ MIDI, although not all of its possible capabilities are
+ enabled by default.
+ </para>
+
+ <para>
+ There are two ways to see which notes have been quantized
+ for notation. By default, each notation view contains a Raw
+ Note Ruler (in the group of rulers above the score) showing
+ a rectangular block for each note. This block is positioned
+ so as to represent the time and duration of the note as
+ performed, but with the top and bottom edges of the
+ rectangle extended or shortened to represent the time after
+ notation quantization. If this is too much information for
+ you, you can alternatively choose (in the configuration
+ dialog) to show in a green colour all note heads in the
+ score that have had their timings altered by notation
+ quantization.
+ </para>
+
+ <para>
+
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-notationquantizer.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase>&rosegarden;'s notation quantize dialog</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ If the quantization &rosegarden; has used is not suitable,
+ either for the entire score or for a selection of notes, you
+ can choose to use a different level of quantization or none
+ at all. To apply a different quantization to some notes,
+ select the notes and use the <link
+ linkend="commands-nv-menu-transforms-quantize">Quantize</link>
+ menu function (tick the box labelled <quote>Quantize for
+ notation only</quote>). The quantization level or type used
+ by default can be changed in the configuration dialog.
+ </para>
+
+ <sect3 id="nv-quantization-parameters">
+ <title>Configurable parameters for the heuristic notation quantizer</title>
+
+ <sect4 id="nv-quantization-parameters-during">
+ <title>Parameters for quantization itself</title>
+
+ <variablelist>
+
+ <varlistentry>
+ <term>Complexity</term>
+ <listitem>
+ <para>The "complexity" of a notation quantizer is its
+ most fundamental parameter. A "complex" quantizer
+ will be more prepared to accept that complex-looking
+ music is in fact intended to be complex, whereas a
+ "simple" quantizer is more likely to assume that
+ complex-looking music results from an imprecise
+ performance of simple music.
+ </para>
+ <para>The default setting is intended to produce
+ reasonable results for a fairly wide range of music.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>Base grid unit</term>
+ <listitem>
+ <para>The base grid unit (set to a note duration
+ value) specifies the absolute minimum unit of note
+ that will be permitted to remain in the score after
+ quantization. For example, if set to a semiquaver,
+ all notes will be placed on boundaries of a multiple
+ of a semiquaver, with durations also a multiple of a
+ semiquaver.
+ </para>
+ <para>The setting of the base grid unit is not quite
+ as significant for a notation quantizer as it is for a
+ plain grid quantizer, because all it does is impose an
+ absolute limit on the level of precision permitted by
+ the complexity parameter. Mostly, when you find a
+ case in which increasing the grid unit produces better
+ results, you've actually found a case in which the
+ quantizer simply didn't do as good a job as it should
+ have been able to with the smaller unit.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>Tuplet level</term>
+ <listitem>
+ <para>The notation quantizer is capable of identifying
+ tuplets (triplets and other time-squashed groups),
+ within reasonable limits. This parameter controls how
+ ambitious it will attempt to be when looking for
+ tuplets, by setting a limit on how many notes per
+ tuplet group it will attempt to identify. If it is
+ set to <quote>None</quote>, the quantizer will not
+ attempt to identify tuplets at all.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ </variablelist>
+
+ </sect4>
+
+ <sect4 id="nv-quantization-parameters-after">
+ <title>Parameters that control tidying up after quantization</title>
+
+ <variablelist>
+
+ <varlistentry>
+ <term>Tie notes at barlines etc</term>
+ <listitem>
+ <para>Causes any notes that are still found after
+ quantization to overlap barlines or to have
+ durations not exactly expressible with single note
+ heads to be split into multiple notes appropriately,
+ and tied. This has the same effect as applying the
+ <!-- !!! link --> "Tie Notes at Barlines" function
+ in the notation view.
+ </para>
+ <para>
+ This parameter is not set by default because it
+ changes the number of note events, which is
+ undesirable when using &rosegarden; partly or
+ principally as a MIDI sequencer.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>Split-and-tie overlapping chords</term>
+ <listitem>
+ <para>
+ Causes overlapping notes to be split and tied, so
+ as to make strict chords with individual noteheads
+ tied as necessary. This has the same effect as
+ applying the <!-- !!! link --> "Split-and-Tie
+ Overlapping Chords" function in the notation view.
+ </para>
+ <para>
+ This parameter is not set by default partly because
+ it changes the number of note events, which is
+ undesirable when using &rosegarden; partly or
+ principally as a MIDI sequencer.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>Re-beam</term>
+ <listitem>
+ <para>
+ Causes the notes to be re-beamed into groups
+ appropriately after quantization. This is usually
+ desirable.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>Add articulations (staccato, tenuto,
+ slurs)</term>
+ <listitem>
+ <para>
+ Causes the quantizer to attempt to identify, based
+ on the durations of individual and consecutive
+ notes, which notes should be notated with staccato
+ marks (for notes that fall significantly short of
+ the following note, but not apparently short
+ enough to merit a rest), tenuto (for notes that
+ almost or just overlap the following note) and
+ slurs (for series of notes that meet or overlap).
+ </para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </sect4>
+ </sect3>
+ </sect2>
+
+ </sect1>
+
+ <sect1 id="event-view">
+ <title>The Event List editor</title>
+ <sect2 id="ev-introduction">
+ <title>概要</title>
+
+ <para>
+
+ The &rosegarden; Event List editor shows the events in a
+ single segment in a raw form, and enables you to edit the
+ precise properties of those events individually.
+
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-eventlisteditor.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase>&rosegarden;'s event list editor</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+ </sect2>
+ </sect1>
+
+ </chapter>
+
+
+
+
+<!--
+ **********************************
+
+ PART II:
+ Command reference
+
+ **********************************
+ -->
+
+
+ <chapter id="commands">
+ <title>Command Reference</title>
+
+ <!-- (OPTIONAL, BUT RECOMMENDED) This chapter should list all of
+ the application windows and their menubar and toolbar commands for
+ easy reference. Also include any keys that have a special
+ function but have no equivalent in the menus or toolbars. This may
+ not be necessary for small apps or apps with no tool or menu
+ bars. -->
+
+ <para></para>
+
+ <sect1 id="commands-main">
+ <title>Main window</title>
+ <para></para>
+
+
+ <sect2>
+ <title>File menu</title>
+ <para>
+ <variablelist>
+
+ <varlistentry id="commands-main-file-new">
+ <term><menuchoice>
+ <shortcut>
+ <keycombo><keycap>Ctrl</keycap><keycap>n</keycap></keycombo>
+ </shortcut>
+ <guimenu>File</guimenu>
+ <guimenuitem>New</guimenuitem>
+ </menuchoice></term>
+ <listitem><para><action>Creates a new composition.</action></para></listitem>
+ </varlistentry>
+
+ <varlistentry id="commands-main-file-open">
+ <term><menuchoice>
+ <shortcut>
+ <keycombo><keycap>Ctrl</keycap><keycap>o</keycap></keycombo>
+ </shortcut>
+ <guimenu>File</guimenu>
+ <guimenuitem>Open</guimenuitem>
+ </menuchoice></term>
+ <listitem><para><action>Opens an existing composition from a Rosegarden-4 (.rg) file.</action></para></listitem>
+ </varlistentry>
+
+ <varlistentry id="commands-main-file-import">
+ <term><menuchoice>
+ <guimenu>File</guimenu>
+ <guimenuitem>Import</guimenuitem>
+ </menuchoice></term>
+ <listitem><para>This submenu contains functions for importing compositions from other file formats.</para>
+
+ <variablelist>
+
+ <varlistentry id="commands-main-file-import-midi">
+ <term><menuchoice>
+ <guimenu>Import</guimenu>
+ <guimenuitem>Import &MIDI; file...</guimenuitem>
+ </menuchoice></term>
+ <listitem><para><action>Creates a new composition from the contents of an existing &MIDI; (.mid) file.</action></para></listitem>
+ </varlistentry>
+
+ <varlistentry id="commands-main-file-import-rg21">
+ <term><menuchoice>
+ <guimenu>Import</guimenu>
+ <guimenuitem>Import Rosegarden 2.1 file...</guimenuitem>
+ </menuchoice></term>
+ <listitem><para><action>Creates a new composition from the contents of an existing Rosegarden 2.1 (.rose) file.</action></para></listitem>
+ </varlistentry>
+
+ </variablelist>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry id="commands-main-file-merge">
+ <term><menuchoice>
+ <guimenu>File</guimenu>
+ <guimenuitem>Merge</guimenuitem>
+ </menuchoice></term>
+ <listitem><para>This submenu contains functions for merging other files into the current composition.</para>
+
+ <variablelist>
+
+ <varlistentry id="commands-main-file-merge-file">
+ <term><menuchoice>
+ <guimenu>Merge</guimenu>
+ <guimenuitem>Merge File...</guimenuitem>
+ </menuchoice></term>
+ <listitem><para><action>Merges the contents of an existing Rosegarden (.rg) file into the current composition. You will be offered a choice of whether to merge the file in new tracks at the start of the composition, or after the end of the current composition.</action></para></listitem>
+ </varlistentry>
+
+ <varlistentry id="commands-main-file-merge-midi">
+ <term><menuchoice>
+ <guimenu>Merge</guimenu>
+ <guimenuitem>Merge &MIDI; file...</guimenuitem>
+ </menuchoice></term>
+ <listitem><para><action>Merges the contents of an existing &MIDI; (.mid) file into the current composition. You will be offered a choice of whether to merge the file in new tracks at the start of the composition, or after the end of the current composition.</action></para></listitem>
+ </varlistentry>
+
+ <varlistentry id="commands-main-file-merge-rg21">
+ <term><menuchoice>
+ <guimenu>Merge</guimenu>
+ <guimenuitem>Merge Rosegarden 2.1 file...</guimenuitem>
+ </menuchoice></term>
+ <listitem><para><action>Merges the contents of an existing Rosegarden 2.1 (.rose) file into the current composition. You will be offered a choice of whether to merge the file in new tracks at the start of the composition, or after the end of the current composition.</action></para></listitem>
+ </varlistentry>
+
+ </variablelist>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry id="commands-main-file-export">
+ <term><menuchoice>
+ <guimenu>File</guimenu>
+ <guimenuitem>Export</guimenuitem>
+ </menuchoice></term>
+ <listitem><para>This submenu contains functions for exporting the contents of compositions to other file formats.</para>
+
+ <variablelist>
+
+ <varlistentry id="commands-main-file-export-midi">
+ <term><menuchoice>
+ <guimenu>Export</guimenu>
+ <guimenuitem>Export &MIDI; file...</guimenuitem>
+ </menuchoice></term>
+ <listitem><para><action>Saves the contents of the current composition into a new &MIDI; file.</action> Note that not all data in the Rosegarden composition necessarily can or will be saved in the &MIDI; format.</para></listitem>
+ </varlistentry>
+
+ <varlistentry id="commands-main-file-export-csound">
+ <term><menuchoice>
+ <guimenu>Export</guimenu>
+ <guimenuitem>Export Csound score file...</guimenuitem>
+ </menuchoice></term>
+ <listitem><para><action>Saves the contents of the current composition into a new Csound score file.</action> Together with a suitable orchestra file (not supplied), this can be used to play the composition through <ulink url="http://www.csounds.com/">Csound</ulink>. Note that not all data in the Rosegarden composition necessarily can or will be saved in the Csound format.</para></listitem>
+ </varlistentry>
+
+ <varlistentry id="commands-main-file-export-lilypond">
+ <term><menuchoice>
+ <guimenu>Export</guimenu>
+ <guimenuitem>Export Lilypond file...</guimenuitem>
+ </menuchoice></term>
+ <listitem><para><action>Saves the contents of the current composition into a new Lilypond file.</action> This can then be processed by the <ulink url="http://www.lilypond.org/">Lilypond</ulink> system to produce typeset-quality music, although it is likely that the file may need some tweaking to get really good quality output. Note that not all data in the Rosegarden composition necessarily can or will be saved in the Lilypond format.</para></listitem>
+ </varlistentry>
+
+ <varlistentry id="commands-main-file-export-mup">
+ <term><menuchoice>
+ <guimenu>Export</guimenu>
+ <guimenuitem>Export Mup file...</guimenuitem>
+ </menuchoice></term>
+ <listitem><para><action>Saves the contents of the current composition into a new Mup file.</action> This can then be processed by the <ulink url="http://www.arkkra.com/">Mup</ulink> music publication system, although it is likely that the file may need some tweaking to get really good quality output. Note that not all data in the Rosegarden composition necessarily can or will be saved in the Mup format.</para></listitem>
+ </varlistentry>
+
+ <varlistentry id="commands-main-file-export-musicxml">
+ <term><menuchoice>
+ <guimenu>Export</guimenu>
+ <guimenuitem>Export MusicXML file...</guimenuitem>
+ </menuchoice></term>
+ <listitem><para><action>Saves the contents of the current composition into a new MusicXML file.</action> This can then be used with any music software that supports the MusicXML format. Note that MusicXML support is experimental and has not been well tested. Not all data in the Rosegarden composition necessarily can or will be saved in the MusicXML format.</para></listitem>
+ </varlistentry>
+
+ </variablelist>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry id="commands-main-file-save">
+ <term><menuchoice>
+ <shortcut>
+ <keycombo><keycap>Ctrl</keycap><keycap>s</keycap></keycombo>
+ </shortcut>
+ <guimenu>File</guimenu>
+ <guimenuitem>Save</guimenuitem>
+ </menuchoice></term>
+ <listitem><para><action>Saves the composition.</action></para></listitem>
+ </varlistentry>
+
+ <varlistentry id="commands-main-file-save-as">
+ <term><menuchoice>
+ <guimenu>File</guimenu>
+ <guimenuitem>Save As...</guimenuitem>
+ </menuchoice></term>
+ <listitem><para><action>Saves the composition with a new filename.</action></para></listitem>
+ </varlistentry>
+
+ <varlistentry id="commands-main-file-close">
+ <term><menuchoice>
+ <shortcut>
+ <keycombo><keycap>Ctrl</keycap><keycap>w</keycap></keycombo>
+ </shortcut>
+ <guimenu>File</guimenu>
+ <guimenuitem>Close</guimenuitem>
+ </menuchoice></term>
+ <listitem><para><action>Closes the current composition.</action></para></listitem>
+ </varlistentry>
+
+ <varlistentry id="commands-main-file-print">
+ <term><menuchoice>
+ <shortcut>
+ <keycombo><keycap>Ctrl</keycap><keycap>p</keycap></keycombo>
+ </shortcut>
+ <guimenu>File</guimenu>
+ <guimenuitem>Print</guimenuitem>
+ </menuchoice></term>
+ <listitem><para><action>Prints the current composition.</action> At the time of writing, the print function is incomplete. We recommend using the <link linkend="commands-main-file-export-lilypond">Export Lilypond file</link> function and printing with Lilypond instead.</para></listitem>
+ </varlistentry>
+
+ <varlistentry id="commands-main-file-quit">
+ <term><menuchoice>
+ <shortcut>
+ <keycombo><keycap>Ctrl</keycap><keycap>q</keycap></keycombo>
+ </shortcut>
+ <guimenu>File</guimenu>
+ <guimenuitem>Quit</guimenuitem>
+ </menuchoice></term>
+ <listitem><para><action>Quits &rosegarden;</action></para></listitem>
+ </varlistentry>
+
+ </variablelist>
+ </para>
+
+ </sect2>
+
+
+ <!-- Levi Burton additions 2003.03.05 -->
+ <sect2>
+ <title>Edit menu</title>
+ <para>
+ <variablelist>
+
+ <varlistentry id="commands-main-edit-undo">
+ <term>
+ <menuchoice>
+ <shortcut>
+ <keycombo>
+ <keycap>Ctrl</keycap>
+ <keycap>z</keycap>
+ </keycombo>
+ </shortcut>
+ <guimenu>Edit</guimenu>
+ <guimenuitem>Undo</guimenuitem>
+ </menuchoice>
+ </term>
+ <listitem>
+ <para>
+ <action>
+ Reverses the last command performed.
+ </action>
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry id="commands-main-edit-redo">
+ <term>
+ <menuchoice>
+ <shortcut>
+ <keycombo>
+ <keycap>Ctrl</keycap>
+ <keycap>Shift</keycap>
+ <keycap>z</keycap>
+ </keycombo>
+ </shortcut>
+ <guimenu>Edit</guimenu>
+ <guimenuitem>Redo</guimenuitem>
+ </menuchoice>
+ </term>
+ <listitem>
+ <para>
+ <action>
+ Repeats the last command performed, following an undo.
+ </action>
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry id="commands-main-edit-cut">
+ <term>
+ <menuchoice>
+ <shortcut>
+ <keycombo>
+ <keycap>Ctrl</keycap>
+ <keycap>x</keycap>
+ </keycombo>
+ </shortcut>
+ <guimenu>Edit</guimenu>
+ <guimenuitem>Cut</guimenuitem>
+ </menuchoice>
+ </term>
+ <listitem>
+ <para>
+ <action>
+ Removes the currently selected segment from the
+ composition view and adds it to the clipboard. Note that
+ when you have selected a track, all segments in that track
+ are selected.
+ </action>
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry id="commands-main-edit-copy">
+ <term>
+ <menuchoice>
+ <shortcut>
+ <keycombo>
+ <keycap>Ctrl</keycap>
+ <keycap>c</keycap>
+ </keycombo>
+ </shortcut>
+ <guimenu>Edit</guimenu>
+ <guimenuitem>Copy</guimenuitem>
+ </menuchoice>
+ </term>
+ <listitem>
+ <para>
+ <action>
+ Removes the selected segments from the composition and
+ places them in the clipboard to replace any contents the
+ clipboard previously had.
+ </action>
+ Note that when you have selected a track, all segments in that track
+ are selected.
+ </para>
+ </listitem>
+ </varlistentry>
+
+
+ <varlistentry id="commands-main-edit-paste">
+ <term>
+ <menuchoice>
+ <shortcut>
+ <keycombo>
+ <keycap>Ctrl</keycap>
+ <keycap>v</keycap>
+ </keycombo>
+ </shortcut>
+ <guimenu>Edit</guimenu>
+ <guimenuitem>Paste</guimenuitem>
+ </menuchoice>
+ </term>
+ <listitem>
+ <para>
+ <action>
+ Inserts the contents of the clipboard into the composition.
+ Verbage hear stating where the contents are inserted
+ (current track, offset within that track etc).
+ </action>
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry id="commands-main-edit-delete">
+ <term>
+ <menuchoice>
+ <shortcut>
+ <keycombo>
+ <keycap>Delete</keycap>
+ </keycombo>
+ </shortcut>
+ <guimenu>Edit</guimenu>
+ <guimenuitem>Delete</guimenuitem>
+ </menuchoice>
+ </term>
+ <listitem>
+ <para>
+ <action>
+ Removes the selected segments from the composition and throws them away.
+ </action>
+ </para>
+ </listitem>
+ </varlistentry>
+
+
+ <varlistentry id="commands-main-edit-select-all-segments">
+ <term>
+ <menuchoice>
+ <guimenu>Edit</guimenu>
+ <guimenuitem>Select All Segments</guimenuitem>
+ </menuchoice>
+ </term>
+ <listitem>
+ <para>
+ <action>
+ Selects all segments within the composition.
+ </action>
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry id="commands-main-edit-add-tempo-change">
+ <term>
+ <menuchoice>
+ <guimenu>Edit</guimenu>
+ <guimenuitem>Add Tempo Change...</guimenuitem>
+ </menuchoice>
+ </term>
+ <listitem>
+ <para>
+ <action>
+ Invokes a tempo change dialog.
+ </action>
+ This offers a
+ selection of ways to change the tempo of the
+ composition, including changing the tempo from the
+ insert cursor position onwards, from the last
+ tempo change onwards, or for the entire
+ composition. See <!-- !!!link linkend="segment-tempo-changes" -->Changing the Tempo<!-- /link --> for more information.
+
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry id="commands-main-edit-add-time-signature">
+ <term>
+ <menuchoice>
+ <guimenu>Edit</guimenu>
+ <guimenuitem>Add Time Signature Change...</guimenuitem>
+ </menuchoice>
+ </term>
+ <listitem>
+ <para>
+ <action>
+ Invokes a time-signature change dialog.
+ </action>
+
+ This offers a
+ selection of ways to change the tempo of the
+ composition, including changing the time signature
+ from the insert cursor position onwards or from the
+ start of the current bar. See
+ <!-- !!!link linkend="segment-tempo-changes" -->Changing the Time Signature<!-- /link -->
+ for more information.
+
+ </para>
+ </listitem>
+ </varlistentry>
+
+
+ <varlistentry id="commands-main-edit-change-composition-duration">
+ <term>
+ <menuchoice>
+ <guimenu>Edit</guimenu>
+ <guimenuitem>Change Composition Duration...</guimenuitem>
+ </menuchoice>
+ </term>
+ <listitem>
+ <para>
+ <action>
+ Invokes a composition duration change dialog.
+ </action>
+
+ This allows you to change the overall duration of
+ the composition. This duration sets a hard limit
+ (as a number of bars) on the scrollable width of the
+ main window and the length of time you can play or
+ record before the composition is deemed to have
+ ended. The default is 100 bars.
+
+ </para>
+ </listitem>
+ </varlistentry>
+
+
+ <varlistentry id="commands-main-edit-document-properties">
+ <term>
+ <menuchoice>
+ <guimenu>Edit</guimenu>
+ <guimenuitem>Edit Document Properties...</guimenuitem>
+ </menuchoice>
+ </term>
+ <listitem>
+ <para>
+ <action>
+ Invokes a document properties dialog.
+ </action>
+
+ The document properties dialog allows you to review and/or modify the current document properties. Note - explain what are properties. Note to developers - It seems kinda weird to have icons on the left for selecting, and tabs in each one. Why not just tabs or just the things on the left?
+
+ </para>
+ </listitem>
+ </varlistentry>
+
+
+ </variablelist>
+ </para>
+ </sect2>
+ <!-- Levi Burton additions 2003.03.05 -->
+
+ <sect2>
+ <title>Segments menu</title>
+ <para>
+ <variablelist>
+
+ <varlistentry id="commands-main-segments-open-default-editor">
+ <term>
+ <menuchoice>
+ <shortcut>
+ <keycombo>
+ <keycap>Return</keycap>
+ </keycombo>
+ </shortcut>
+ <guimenu>Segments</guimenu>
+ <guimenuitem>Open in Default Editor</guimenuitem>
+ </menuchoice>
+ </term>
+ <listitem>
+ <para>
+ <action> Opens all of the currently
+ selected segments together in a notation editor, or in
+ whichever other editor you have configured as your
+ default.
+ </action>
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry id="commands-main-segments-open-matrix-editor">
+ <term>
+ <menuchoice>
+ <guimenu>Segments</guimenu>
+ <guimenuitem>Open in Matrix Editor</guimenuitem>
+ </menuchoice>
+ </term>
+ <listitem>
+ <para>
+ <action> Opens all of the currently
+ selected segments in a matrix editor.
+ </action>
+ See <link linkend="matrix-view">matrix editor</link>.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry id="commands-main-segments-open-notation-editor">
+ <term>
+ <menuchoice>
+ <guimenu>Segments</guimenu>
+ <guimenuitem>Open in Notation Editor</guimenuitem>
+ </menuchoice>
+ </term>
+ <listitem>
+ <para>
+ <action> Opens all of the currently
+ selected segments together in a notation editor.
+ </action>
+ See <link linkend="notation-view">notation editor</link>.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry id="commands-main-segments-open-event-editor">
+ <term>
+ <menuchoice>
+ <guimenu>Segments</guimenu>
+ <guimenuitem>Open in Event List Editor</guimenuitem>
+ </menuchoice>
+ </term>
+ <listitem>
+ <para>
+ <action> Opens all of the currently
+ selected segments together in a event-list editor.
+ </action>
+ See <link linkend="event-view">event-list editor</link>.
+ </para>
+ </listitem>
+ </varlistentry>
+
+
+ <varlistentry id="commands-main-segments-quantize">
+ <term>
+ <menuchoice>
+ <guimenu>Segments</guimenu>
+ <guimenuitem>Quantize...</guimenuitem>
+ </menuchoice>
+ </term>
+ <listitem>
+ <para>
+ <action>Invokes a quantization dialog for quantizing the current selection.
+ </action>
+ See <link linkend="nv-quantization">quantization</link>.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry id="commands-main-segments-rescale">
+ <term>
+ <menuchoice>
+ <guimenu>Segments</guimenu>
+ <guimenuitem>Rescale...</guimenuitem>
+ </menuchoice>
+ </term>
+ <listitem>
+ <para>
+ <action>Allows you to stretch or squash segments in time.
+ </action>
+
+ This option invokes a rescale dialog, which allows
+ you to specify a ratio of timings that is then
+ applied to the selected segments. This has the
+ result of stretching (slowing down) or squashing
+ (speeding up) the selected segments, changing their
+ durations accordingly.
+
+ </para>
+ <para>
+ This only applies to segments containing MIDI
+ events, not to audio segments. Rosegarden does not
+ currently provide native support for audio
+ time-stretching.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry id="commands-main-segments-auto-split">
+ <term>
+ <menuchoice>
+ <guimenu>Segments</guimenu>
+ <guimenuitem>Auto-Split</guimenuitem>
+ </menuchoice>
+ </term>
+ <listitem>
+ <para>
+ <action>
+ Splits the selected segments on silences.
+ </action>
+
+ This function works slightly differently depending
+ on whether the selected segments contain audio or
+ MIDI data. For audio segments, it offers you a
+ dialog in which you can choose a threshold below
+ which the segment is considered "silent"; it then
+ splits the segment whenever its amplitude falls
+ below this threshold. For MIDI segments, it simply
+ splits the segment everywhere that a full bar of
+ silence occurs.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry id="commands-main-segments-split-by-pitch">
+ <term>
+ <menuchoice>
+ <guimenu>Segments</guimenu>
+ <guimenuitem>Split by Pitch...</guimenuitem>
+ </menuchoice>
+ </term>
+ <listitem>
+ <para>
+ <action>Splits the currently selected segments into higher and
+ lower parts.
+ </action>
+
+ This function invokes a dialog allowing you to
+ choose a pitch as a "split point", and then splits
+ the selected segments in half with all the notes on
+ or above that split point in the "higher" segment
+ and all the notes below it in the "lower".
+
+ </para>
+ <para>
+ If the music in the segment consists of two separate
+ parts (e.g. left and right hand piano parts) that
+ are not always completely on either side of a single
+ split point, you may with to select the "ranging
+ split-point" option. If this is selected,
+ Rosegarden will attempt to track the two parts as
+ they move up and down, usually doing a slightly
+ better job of separating out notes that were
+ intended to lie in the two separate parts.
+
+ </para>
+ <para>
+ The resulting segments are both created on the same
+ track, with one overlapping the other.
+
+ </para>
+ </listitem>
+ </varlistentry>
+
+
+
+
+ </variablelist>
+ </para>
+ </sect2>
+
+
+
+
+ </sect1>
+
+ <sect1 id="commands-nv">
+ <title>Notation editor</title>
+ <para></para>
+
+ <!-- Tools -->
+ <!-- Note insertion tools -->
+ <!-- Rest insertion tools -->
+ <!-- Clef insertion tools -->
+ <!-- Text tool -->
+ <!-- Eraser -->
+
+ <sect2 id="commands-nv-menu-file">
+ <title>File menu</title>
+ <para>
+ <variablelist>
+
+ <varlistentry id="commands-nv-menu-file-close">
+ <term><menuchoice>
+ <shortcut>
+ <keycombo><keycap>Ctrl</keycap><keycap>w</keycap></keycombo>
+ </shortcut>
+ <guimenu>File</guimenu>
+ <guimenuitem>Close</guimenuitem>
+ </menuchoice></term>
+ <listitem><para><action>Closes the window</action></para></listitem>
+ </varlistentry>
+
+ </variablelist>
+ </para>
+
+ </sect2>
+
+ <sect2 id="commands-nv-menu-edit">
+ <title>Edit menu</title>
+ <para>
+ <variablelist>
+
+ <varlistentry id="commands-nv-menu-edit-undo">
+ <term><menuchoice>
+ <shortcut>
+ <keycombo><keycap>Ctrl</keycap><keycap>z</keycap></keycombo>
+ </shortcut>
+ <guimenu>Edit</guimenu>
+ <guimenuitem>Undo</guimenuitem>
+ </menuchoice></term>
+ <listitem>
+ <para>
+ <action>
+
+ Reverses the last edit.
+
+ </action> Edits are shared across
+ all views, so if the last edit was not made in
+ this view, undoing it might not appear to change
+ this view either.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry id="commands-nv-menu-edit-redo">
+ <term><menuchoice>
+ <shortcut>
+ <keycombo><keycap>Ctrl</keycap><keycap>Shift</keycap><keycap>z</keycap></keycombo>
+ </shortcut>
+ <guimenu>Edit</guimenu>
+ <guimenuitem>Redo</guimenuitem>
+ </menuchoice></term>
+ <listitem>
+ <para>
+ <action>
+
+ Repeats the last edit, following an undo.
+
+ </action>
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry id="commands-nv-menu-edit-cut">
+ <term><menuchoice>
+ <shortcut>
+ <keycombo><keycap>Ctrl</keycap><keycap>x</keycap></keycombo>
+ </shortcut>
+ <guimenu>Edit</guimenu>
+ <guimenuitem>Cut</guimenuitem>
+ </menuchoice></term>
+ <listitem>
+ <para>
+ <action>
+
+ Removes the selected events from the composition
+ and places them in the clipboard to replace any
+ contents the clipboard previously had.
+
+ </action>
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry id="commands-nv-menu-edit-copy">
+ <term><menuchoice>
+ <shortcut>
+ <keycombo><keycap>Ctrl</keycap><keycap>c</keycap></keycombo>
+ </shortcut>
+ <guimenu>Edit</guimenu>
+ <guimenuitem>Copy</guimenuitem>
+ </menuchoice></term>
+ <listitem>
+ <para>
+ <action>
+
+ Copies the selected events to the clipboard
+ to replace any contents the clipboard previously had.
+
+ </action>
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry id="commands-nv-menu-edit-paste">
+ <term><menuchoice>
+ <shortcut>
+ <keycombo><keycap>Ctrl</keycap><keycap>v</keycap></keycombo>
+ </shortcut>
+ <guimenu>Edit</guimenu>
+ <guimenuitem>Paste</guimenuitem>
+ </menuchoice></term>
+ <listitem>
+ <para>
+ <action>
+
+ Copies the contents of the clipboard to the
+ location of the insert cursor in the current
+ composition.
+
+ </action>
+
+ The clipboard must not contain
+ multiple segments, and there must be enough
+ space (occupied only by rests) starting at
+ the insert cursor position to accommodate the
+ clipboard's contents.
+
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry id="commands-nv-menu-edit-cut-and-close">
+ <term><menuchoice>
+ <shortcut>
+ <keycombo><keycap>Ctrl</keycap><keycap>Shift</keycap><keycap>x</keycap></keycombo>
+ </shortcut>
+ <guimenu>Edit</guimenu>
+ <guimenuitem>Cut and Close</guimenuitem>
+ </menuchoice></term>
+ <listitem>
+ <para>
+ <action>
+
+ Removes the selected events from the composition
+ and places them in the clipboard to replace any
+ contents the clipboard previously had, and closes
+ the gap left behind by moving all subsequent
+ events towards the beginning of the composition.
+
+ </action>
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry id="commands-nv-menu-edit-paste-dot-dot-dot">
+ <term><menuchoice>
+ <shortcut>
+ <keycombo><keycap>Ctrl</keycap><keycap>Shift</keycap><keycap>v</keycap></keycombo>
+ </shortcut>
+ <guimenu>Edit</guimenu>
+ <guimenuitem>Paste...</guimenuitem>
+ </menuchoice></term>
+ <listitem>
+ <para>
+ <action>
+
+ Provides a choice of paste mechanisms with the
+ ability to set one as the default for use in the
+ Paste menu function.
+
+ </action>
+
+ See the section on <link linkend="nv-paste-types">Paste types</link> for more information.
+
+ </para>
+ </listitem>
+ </varlistentry>
+
+
+ <varlistentry id="commands-nv-menu-edit-delete">
+ <term><menuchoice>
+ <shortcut>
+ <keycombo><keycap>Del</keycap></keycombo>
+ </shortcut>
+ <guimenu>Edit</guimenu>
+ <guimenuitem>Delete</guimenuitem>
+ </menuchoice></term>
+ <listitem>
+ <para>
+ <action>
+ Removes the selected events from the composition
+ and throws them away.
+ </action>
+ </para>
+ </listitem>
+ </varlistentry>
+
+
+ <varlistentry id="commands-nv-menu-edit-select-from-start">
+ <term><menuchoice>
+ <guimenu>Edit</guimenu>
+ <guimenuitem>Select from Start</guimenuitem>
+ </menuchoice></term>
+ <listitem>
+ <para>
+ <action>
+ Extends the current selection by selecting
+ all events from the start of the staff up to the
+ current selection (or up to the insert cursor,
+ if no events are currently selected).
+ </action>
+ </para>
+ </listitem>
+ </varlistentry>
+
+
+ <varlistentry id="commands-nv-menu-edit-select-to-end">
+ <term><menuchoice>
+ <guimenu>Edit</guimenu>
+ <guimenuitem>Select to End</guimenuitem>
+ </menuchoice></term>
+ <listitem>
+ <para>
+ <action>
+ Extends the current selection by selecting
+ all events from the end of the current selection
+ (or from the insert cursor, if no events are
+ currently selected) up to the end of the staff.
+ </action>
+ </para>
+ </listitem>
+ </varlistentry>
+
+
+ <varlistentry id="commands-nv-menu-edit-select-whole-staff">
+ <term><menuchoice>
+ <guimenu>Edit</guimenu>
+ <guimenuitem>Select Whole Staff</guimenuitem>
+ </menuchoice></term>
+ <listitem>
+ <para>
+ <action>
+ Selects all the events on the current staff.
+ </action>
+ </para>
+ </listitem>
+ </varlistentry>
+
+
+ <varlistentry id="commands-nv-menu-edit-clear-selection">
+ <term><menuchoice>
+ <shortcut>
+ <keycombo><keycap>Esc</keycap></keycombo>
+ </shortcut>
+ <guimenu>Edit</guimenu>
+ <guimenuitem>Clear Selection</guimenuitem>
+ </menuchoice></term>
+ <listitem>
+ <para>
+ <action>
+ Unselects all events.
+ </action>
+ </para>
+ </listitem>
+ </varlistentry>
+
+
+ <varlistentry id="commands-nv-menu-edit-filter-selection">
+ <term><menuchoice>
+ <guimenu>Edit</guimenu>
+ <guimenuitem>Filter Selection</guimenuitem>
+ </menuchoice></term>
+ <listitem>
+ <para>
+ <action>
+ Invokes an event filter dialog.
+ </action>
+ This offers you the ability to filter a range of events in
+ any of several categories out of your selection.
+ </para>
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-eventfilter.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase>The event filter dialog</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+ <para>
+ All ranges may be either inclusive or exclusive.
+ </para>
+ <para>
+ An inclusive range will remove events on either side of it
+ from the selection. You can use this, for example, to
+ filter everything below middle C and above the A above
+ middle C out of your selection.
+ </para>
+ <para>
+ An exclusive range will remove the events within the range
+ itself, leaving everything on either side of it selected.
+ Using the same search points as in the previous example,
+ you would use an exclusive range to remove everything
+ between middle C and the A above middle C from your
+ selection, while leaving everything above and below that
+ range selected.
+ </para>
+ <para>
+ Once your selection has been filtered, you can manipulate
+ it by any conventional means.
+ </para>
+ </listitem>
+ </varlistentry>
+
+
+ <varlistentry id="commands-nv-menu-edit-add-tempo">
+ <term><menuchoice>
+ <guimenu>Edit</guimenu>
+ <guimenuitem>Add Tempo Change...</guimenuitem>
+ </menuchoice></term>
+ <listitem>
+ <para>
+ <action>
+ Invokes a tempo change dialog.
+ </action>
+ This offers a
+ selection of ways to change the tempo of the
+ composition, including changing the tempo from the
+ insert cursor position onwards, from the last
+ tempo change onwards, or for the entire
+ composition. See <!-- !!!link linkend="segment-tempo-changes" -->Changing the Tempo<!-- /link --> for more information.
+ </para>
+ </listitem>
+ </varlistentry>
+
+
+ <varlistentry id="commands-nv-menu-edit-add-time-signature">
+ <term><menuchoice>
+ <guimenu>Edit</guimenu>
+ <guimenuitem>Add Time Signature Change...</guimenuitem>
+ </menuchoice></term>
+ <listitem>
+ <para>
+ <action>
+
+ Invokes a time-signature change dialog.
+
+ </action>
+
+ This offers a
+ selection of ways to change the tempo ofthe
+ composition, including changing the time signature
+ from the insert cursor position onwards or from the
+ start of the current bar. See
+ <!-- !!!link linkend="segment-tempo-changes" -->Changing the Time Signature<!-- /link -->
+ for more information.
+
+ </para>
+ </listitem>
+ </varlistentry>
+
+
+ <varlistentry id="commands-nv-menu-edit-add-clef">
+ <term><menuchoice>
+ <guimenu>Edit</guimenu>
+ <guimenuitem>Add Clef Change...</guimenuitem>
+ </menuchoice></term>
+ <listitem>
+ <para>
+ <action>
+
+ Invokes a clef selection dialog, and inserts the
+ chosen clef at the current insert cursor position.
+
+ </action>
+
+ The dialog allows you to choose a clef, but also
+ to choose how you want the clef to be applied, in
+ cases where there are already some notes following
+ the point where the clef is to be inserted. You
+ must choose one of the following:
+
+ <variablelist>
+
+ <varlistentry>
+ <term>Maintain current pitches</term>
+ <listitem>
+ <para>
+ Any notes following the clef will keep
+ their current performance pitches.
+ </para>
+ <para>
+ For example, inserting a
+ tenor clef in the middle of a previously
+ treble-clef section will cause the notes following
+ the clef to be moved an octave
+ higher up the staff, because they will still have
+ their treble-clef pitches.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>Transpose into appropriate octave</term>
+ <listitem>
+ <para>
+ Any notes following the clef will
+ retain their pitch within the octave, but
+ may be moved into a different octave to
+ match the new clef, and therefore will play
+ at a new pitch.
+ </para>
+ <para>
+ For example, inserting a tenor clef in the
+ middle of a previously treble-clef section
+ will cause the notes following the clef to
+ move by one staff line only to adjust to the new
+ clef, but to play an octave lower than before.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ </variablelist>
+
+ </para>
+ </listitem>
+ </varlistentry>
+
+
+ <varlistentry id="commands-nv-menu-edit-add-key-signature">
+ <term><menuchoice>
+ <guimenu>Edit</guimenu>
+ <guimenuitem>Add Key Change...</guimenuitem>
+ </menuchoice></term>
+ <listitem>
+ <para>
+ <action>
+
+ </action>
+ </para>
+ </listitem>
+ </varlistentry>
+
+
+ </variablelist>
+ </para>
+
+ </sect2>
+
+ <sect2 id="commands-nv-menu-group">
+ <title>Group menu</title>
+ <para>
+ <variablelist>
+
+
+ <varlistentry id="commands-nv-menu-group-beam">
+ <term><menuchoice>
+ <guimenu>Group</guimenu>
+ <guimenuitem>Beam Group</guimenuitem>
+ </menuchoice></term>
+ <listitem>
+ <para>
+ <action>
+ Makes the selected notes into a beamed group.
+ </action>
+ </para>
+ </listitem>
+ </varlistentry>
+
+
+ <varlistentry id="commands-nv-menu-group-auto-beam">
+ <term><menuchoice>
+ <guimenu>Group</guimenu>
+ <guimenuitem>Auto-Beam</guimenuitem>
+ </menuchoice></term>
+ <listitem>
+ <para>
+ <action>
+ Scans the area covered by the selection and attempts
+ to group short notes into plausible beamed groups.
+ </action>
+ </para>
+ </listitem>
+ </varlistentry>
+
+
+ <varlistentry id="commands-nv-menu-group-break-group">
+ <term><menuchoice>
+ <guimenu>Group</guimenu>
+ <guimenuitem>Unbeam</guimenuitem>
+ </menuchoice></term>
+ <listitem>
+ <para>
+ <action>
+ Removes the selected notes from any beamed groups
+ they may be part of, leaving them as separate
+ individuals.
+ </action>
+ If part of a beamed group is selected, the unselected
+ part of the group will remain beamed.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry id="commands-nv-menu-group-tuplet">
+ <term><menuchoice>
+ <guimenu>Group</guimenu>
+ <guimenuitem>Tuplet</guimenuitem>
+ </menuchoice></term>
+ <listitem>
+ <para>
+ <action>
+ Makes a triplet or other tuplet group.
+ </action>
+ This function allows you to adjust the timing of a
+ short section of music in the ratio of two
+ durations, for example to indicate that three notes
+ should be played in the time of two (the classic
+ triplet), or nine in the time of six, or whatever.
+ You can set this ratio in a dialog box when you
+ invoke the function.
+ </para>
+ <para>
+ If you have selected some events before invoking the
+ function, it will assume that you want to make a
+ tuplet group out of the selected region (or as close
+ to its duration as possible) and will adjust the
+ default values available in the dialog accordingly.
+ </para>
+ </listitem>
+ </varlistentry>
+
+
+ <varlistentry id="commands-nv-menu-group-simple-tuplet">
+ <term><menuchoice>
+ <guimenu>Group</guimenu>
+ <guimenuitem>Simple Tuplet</guimenuitem>
+ </menuchoice></term>
+ <listitem>
+ <para>
+ <action>
+
+ Makes a tuplet group (normally of triplets) with
+ the most apparently obvious ratio of durations.
+
+ </action>
+ Usually this function will attempt to make a triplet
+ group starting at the current insert cursor, or if
+ some events are selected, will attempt to make them
+ into triplets. It is possible that it might end up
+ making non-triplet groups if there is no obvious
+ valid triplet arrangement.
+ </para>
+ </listitem>
+ </varlistentry>
+
+
+ <varlistentry id="commands-nv-menu-group-grace">
+ <term><menuchoice>
+ <guimenu>Group</guimenu>
+ <guimenuitem>Make Grace Notes</guimenuitem>
+ </menuchoice></term>
+ <listitem>
+ <para>
+ <action>
+ Converts the selected notes into grace notes.
+ </action>
+ </para>
+ </listitem>
+ </varlistentry>
+
+
+
+ <varlistentry id="commands-nv-menu-group-ungrace">
+ <term><menuchoice>
+ <guimenu>Group</guimenu>
+ <guimenuitem>Ungrace</guimenuitem>
+ </menuchoice></term>
+ <listitem>
+ <para>
+ <action>
+ Converts any grace notes in the selection to
+ normal notes.
+ </action>
+ </para>
+ </listitem>
+ </varlistentry>
+
+
+
+ <varlistentry id="commands-nv-menu-group-slur">
+ <term><menuchoice>
+ <guimenu>Group</guimenu>
+ <guimenuitem>Slur</guimenuitem>
+ </menuchoice></term>
+ <listitem>
+ <para>
+ <action>
+ Adds a slur across the selected notes.
+ </action>
+ To remove the slur, click on it
+ with the erase tool just as you would for a note.
+ </para>
+ </listitem>
+ </varlistentry>
+
+
+
+ <varlistentry id="commands-nv-menu-group-crescendo">
+ <term><menuchoice>
+ <guimenu>Group</guimenu>
+ <guimenuitem>Crescendo</guimenuitem>
+ </menuchoice></term>
+ <listitem>
+ <para>
+ <action>
+ Adds a crescendo (opening hairpin) indication
+ across the selected notes.
+ </action>
+ To remove the crescendo indication, click on it
+ with the erase tool just as you would for a note.
+ </para>
+ </listitem>
+ </varlistentry>
+
+
+
+ <varlistentry id="commands-nv-menu-group-decrescendo">
+ <term><menuchoice>
+ <guimenu>Group</guimenu>
+ <guimenuitem>Decrescendo</guimenuitem>
+ </menuchoice></term>
+ <listitem>
+ <para>
+ <action>
+ Adds a decrescendo (closing hairpin) indication
+ across the selected notes.
+ </action>
+ To remove the decrescendo indication, click on it
+ with the erase tool just as you would for a note.
+ </para>
+ </listitem>
+ </varlistentry>
+
+<!--
+
+ <varlistentry id="commands-nv-menu-group-remove-indications">
+ <term><menuchoice>
+ <guimenu>Group</guimenu>
+ <guimenuitem>Remove Indications</guimenuitem>
+ </menuchoice></term>
+ <listitem>
+ <para>
+ <action>
+
+ </action>
+ </para>
+ </listitem>
+ </varlistentry>
+
+-->
+
+ </variablelist>
+ </para>
+
+ </sect2>
+
+ <sect2 id="commands-nv-menu-notes">
+ <title>Notes menu</title>
+ <para>
+ <variablelist>
+
+ <varlistentry id="commands-nv-menu-notes-">
+ <term><menuchoice>
+ <guimenu>Notes</guimenu>
+ <guimenuitem></guimenuitem>
+ </menuchoice></term>
+ <listitem>
+ <para>
+ <action>
+
+ </action>
+ </para>
+ </listitem>
+ </varlistentry>
+
+
+ <varlistentry id="commands-nv-menu-notes-style-actionmenu">
+ <term><menuchoice>
+ <guimenu>Notes</guimenu>
+ <guimenuitem>Note Style</guimenuitem>
+ </menuchoice></term>
+ <listitem>
+ <para>
+ <action>
+ Change the note style of the selected notes.
+ </action>
+ This submenu contains an entry for each of the <link
+ linkend="nv-note-styles">note
+ styles</link> that are currently available. Choosing one
+ will change the note style of the selected notes to
+ that style.
+ </para>
+ </listitem>
+ </varlistentry>
+
+
+ <varlistentry id="commands-nv-menu-notes-stems">
+ <term><menuchoice>
+ <guimenu>Notes</guimenu>
+ <guimenuitem>Stem Direction</guimenuitem>
+ </menuchoice></term>
+ <listitem>
+ <para>
+ <action>
+ Change the stem
+ direction of the selected notes.
+ </action>
+ This submenu allows you to specify that all the
+ <link linkend="nv-note-qualities">stems</link> of
+ the selected notes should point up or down, plus an
+ entry to reset the stem directions to those that
+ Rosegarden originally chose for the notes.
+ </para>
+ </listitem>
+ </varlistentry>
+
+
+ <varlistentry id="commands-nv-menu-notes-slashes">
+ <term><menuchoice>
+ <guimenu>Notes</guimenu>
+ <guimenuitem>Slashes</guimenuitem>
+ </menuchoice></term>
+ <listitem>
+ <para>
+ <action>
+ Add diagonal
+ slashes across the selected notes' stems.
+ </action>
+ This submenu allows you to choose a number of
+ diagonal strokes or <link linkend="nv-note-qualities">slashes</link> to be drawn across the
+ stems of each of the selected notes. These may be
+ used, for example, to indicate repetition or rolls
+ to a human reader. They do not (yet) affect
+ performance using Rosegarden.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ </variablelist>
+ </para>
+
+ </sect2>
+
+ <sect2 id="commands-nv-menu-marks">
+ <title>Marks menu</title>
+ <para>
+ <variablelist>
+ <varlistentry>
+ <term><menuchoice>
+ <guimenu>blah</guimenu>
+ <guimenuitem>blah</guimenuitem>
+ </menuchoice></term>
+ <listitem>
+ <para>to be continued</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </para>
+
+ </sect2>
+
+ <sect2 id="commands-nv-menu-transforms">
+ <title>Transforms menu</title>
+ <para>
+ <variablelist>
+
+ <varlistentry id="commands-nv-menu-transforms-normalize-rests">
+ <term><menuchoice>
+ <guimenu>Transforms</guimenu>
+ <guimenuitem>Normalize Rests</guimenuitem>
+ </menuchoice></term>
+ <listitem>
+ <para>
+ <action>Makes the rests in the selection
+ theoretically correct.</action>
+
+ This function examines each sequence of consecutive
+ rests found in the selection, and adjusts, splits
+ and merges rests as necessary to ensure that the
+ rests have theoretically correct durations and fall
+ on the correct boundaries.
+ </para>
+
+ <para>For example, a 4/4 bar containing a crotchet
+ (quarter-note), then a minim (half-note) rest and a
+ crotchet rest will be rearranged to place the crotchet
+ rest first, as the minim rest should not cross the
+ central beat boundary of the bar.
+ </para>
+
+ <para>This function is also useful in occasional
+ situations where Rosegarden has made a bad job of
+ maintaining the rests correctly within a bar, for
+ example when editing imported &MIDI; data. Normalizing
+ the rests will usually make the arrangement of notes
+ in such a situation a bit clearer. (Rosegarden always
+ normalizes the rests as a matter of course when
+ importing or recording &MIDI;, but things can sometimes
+ get muddled up again.)</para>
+
+ </listitem>
+ </varlistentry>
+
+ <varlistentry id="commands-nv-menu-transforms-collapse-rests">
+ <term><menuchoice>
+ <guimenu>Transforms</guimenu>
+ <guimenuitem>Collapse Rests</guimenuitem>
+ </menuchoice></term>
+ <listitem>
+ <para>
+ <action>Makes multiple short rests into fewer longer
+ ones.</action>
+
+ This function merges consecutive rests into longer
+ rests, wherever possible. That is, wherever two
+ consecutive rests in the selection are found to have
+ a total duration expressible as a single longer
+ rest, they will be merged.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry id="commands-nv-menu-transforms-collapse-notes">
+ <term><menuchoice>
+ <guimenu>Transforms</guimenu>
+ <guimenuitem>Collapse Equal-Pitch Notes</guimenuitem>
+ </menuchoice></term>
+ <listitem>
+ <para>
+ <action>Makes multiple short notes into fewer longer
+ ones.</action>
+
+ This function merges consecutive notes into longer
+ notes, wherever possible. That is, wherever two
+ consecutive notes of equal pitch in the selection
+ are found to have a total duration expressible as a
+ single longer note, they will be merged.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry id="commands-nv-menu-transforms-tie-notes">
+ <term><menuchoice>
+ <guimenu>Transforms</guimenu>
+ <guimenuitem>Tie Equal-Pitch Notes</guimenuitem>
+ </menuchoice></term>
+ <listitem>
+ <para><action>Ties consecutive notes whenever possible.</action>
+
+ This function ties together any consecutive notes of
+ equal pitch found in the selection. Tied notes are
+ shown with a curved line joining the note heads, and
+ are played as a single long note.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry id="commands-nv-menu-transforms-untie-notes">
+ <term><menuchoice>
+ <guimenu>Transforms</guimenu>
+ <guimenuitem>Untie Notes</guimenuitem>
+ </menuchoice></term>
+ <listitem>
+ <para><action>Breaks ties between notes.</action>
+
+ Any tied notes found in the selection are untied,
+ and will subsequently be played as separate
+ notes.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry id="commands-nv-menu-transforms-make-viable">
+ <term><menuchoice>
+ <guimenu>Transforms</guimenu>
+ <guimenuitem>Make Notes Viable</guimenuitem>
+ </menuchoice></term>
+ <listitem>
+ <para><action>Splits notes at displayable
+ durations.</action> This function is intended to deal
+ with notes that have excessively long durations that
+ overflow barlines or that are too long to be displayed
+ as a single note. It takes any such notes and splits
+ them into shorter, tied notes.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry id="commands-nv-menu-transforms-de-counterpoint">
+ <term><menuchoice>
+ <guimenu>Transforms</guimenu>
+ <guimenuitem>De-Counterpoint</guimenuitem>
+ </menuchoice></term>
+ <listitem>
+ <para><action>Turns counterpoint into a series of split-and-tied notes and chords.</action>
+
+ &rosegarden; has no explicit support for counterpoint
+ (multiple lines of notes edited separately on the
+ same staff), but it will do its best to approximate
+ it when it finds notes in a segment that are
+ apparently contrapuntal, i.e. that overlap but that
+ are not precise enough to be treated as chords. For
+ example, when a short note starts shortly after a
+ longer note, Rosegarden will show the longer note
+ and a short <quote>spacing</quote> rest together, followed by the
+ shorter note. Unfortunately this often isn't what
+ you want.
+ </para>
+
+ <para>The De-Counterpoint function can be applied to a
+ selection that contains overlapping notes. It will
+ split overlapping notes at the point where they
+ overlap, and tie together the resulting split notes,
+ ensuring that the music takes the form of a series of
+ chords and/or single notes starting and ending in neat
+ blocks, with some notes possibly tied.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry id="commands-nv-menu-transforms-quantize">
+ <term><menuchoice>
+ <guimenu>Transforms</guimenu>
+ <guimenuitem>Quantize...</guimenuitem>
+ </menuchoice></term>
+ <listitem>
+ <para><action>Quantizes the selection.</action></para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry id="commands-nv-menu-transforms-fix-smoothing">
+ <term><menuchoice>
+ <guimenu>Transforms</guimenu>
+ <guimenuitem>Fix Smoothed Values</guimenuitem>
+ </menuchoice></term>
+ <listitem>
+ <para><action>Makes the note durations in the current
+ view permanent.</action>
+
+ When notating recorded or performance &MIDI;,
+ Rosegarden usually has to round off the durations of
+ some notes so that they can be displayed as normal
+ note types. This is known as <link
+ linkend="nv-quantization">smoothing</link>, and it
+ normally does not affect the notes actually played,
+ it's just a convenience for display. The Fix
+ Smoothed Values function takes the current smoothed
+ note durations and sets them such that they are used
+ for performance (and editing in the matrix view,
+ etc) as well as for notation.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry id="commands-nv-menu-transforms-interpret">
+ <term><menuchoice>
+ <guimenu>Transforms</guimenu>
+ <guimenuitem>Interpret...</guimenuitem>
+ </menuchoice></term>
+ <listitem>
+ <para><action>Modifies the velocities and timings of
+ notes according to any written or indicated dynamics
+ found.</action> The selection of interpretations
+ available is as follows:
+
+ <variablelist>
+ <varlistentry>
+ <term>Apply text dynamics (p, mf, ff etc)
+ </term>
+ <listitem><para> Sets a velocity to each note
+ based on the last piece of text of "Dynamic"
+ type seen on the same staff (only texts of the
+ form pp, p, mp, mf, f, ff, fff etc are matched).
+ </para></listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>Apply hairpin dynamics
+ </term>
+ <listitem><para> Makes the notes gradually
+ increase or decrease in velocity during a
+ crescendo or decrescendo hairpin.
+ </para></listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>
+ Stress beats
+ </term>
+ <listitem><para> Makes notes that land on bar or
+ beat boundaries slightly louder (greater
+ velocity) than the surrounding notes.
+ </para></listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>
+ Articulate slurs, staccato, tenuto etc
+ </term>
+ <listitem><para> Shortens unslurred notes,
+ shortens staccato notes more, and gives notes
+ inside slurs and tenuto notes their full length.
+ </para></listitem>
+ </varlistentry>
+ </variablelist>
+
+ </para>
+
+ </listitem>
+ </varlistentry>
+
+ <varlistentry id="commands-nv-menu-transforms-transpose">
+ <term><menuchoice>
+ <guimenu>Transforms</guimenu>
+ <guimenuitem>Transpose</guimenuitem>
+ </menuchoice></term>
+ <listitem>
+ <para><action>Alters the pitch of the selected
+ notes.</action> This submenu contains basic
+ transposition functions which move the selected notes
+ up or down a semitone or a whole octave in pitch, as
+ well as a general transpose function that allows you
+ to choose how far up or down you want to transpose the
+ selection.
+ </para>
+
+ <para>These functions simply change the stored pitches
+ of the notes in the selection, so that they both play
+ and appear at the new pitches. They do not deal with
+ performance transposition (displaying one pitch and
+ playing another), for which see the main window's
+ segment parameter box; nor do they help you with
+ transposing from one key into another, for which see
+ the <link
+ linkend="commands-nv-menu-edit-add-key-signature">key
+ change</link> function.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ </variablelist>
+ </para>
+
+ </sect2>
+
+
+ </sect1>
+ </chapter>
+
+
+
+
+<!--
+ **********************************
+
+ PART III:
+ Technical material
+
+ **********************************
+ -->
+
+ <chapter id="developers">
+ <title>Developer's Guide to Rosegarden</title>
+
+ <sect1 id="developers-note-fonts">
+ <title>Configuring custom notation fonts</title>
+
+ <para>If you have a notation font installed on your system in a
+ scalable format (TrueType or Type-1) but it is not currently
+ supported by Rosegarden, you can create your own mapping XML
+ file to describe the font's character map and metrics in a way
+ Rosegarden can use. These files are installed in the
+ fonts/mappings subdirectory of the Rosegarden installation
+ directory, and a number of samples are included with the
+ distribution.</para>
+
+ <para>You can also use these mapping files to define new
+ pixmap-based fonts, in which every shape in a particular size is
+ loaded from a separate pixmap file. The two standard notation
+ fonts supplied with Rosegarden-4 are pixmap fonts defined in
+ exactly this way.
+ </para>
+
+ <para>It is even possible to define a notation font as using one
+ or more scalable system fonts, augmented with pixmaps for
+ particular sizes or for characters not found in the scalable
+ fonts. This is because most of the mapping file format is the
+ same for scalable and pixmap fonts, and where there are
+ different elements for the different sorts of fonts, it is
+ usually possible to include both of them. Rosegarden will
+ usually use pixmaps where available and scalable fonts
+ otherwise.
+ </para>
+
+ <para>You may also wish to edit the mapping files supplied with
+ Rosegarden if you find their measurements for alignment or
+ sizing are not to your liking. (If you believe that any of the
+ supplied files are actually wrong, please let us know.)
+ </para>
+
+ <sect2 id="developers-note-fonts-codes-glyphs">
+ <title>Codes and Glyphs</title>
+
+ <para></para>
+ </sect2>
+
+ <sect2 id="developers-note-fonts-mapping-format">
+ <title>Notation font mapping XML format</title>
+
+ <para>Here is a summary of the XML elements that may be used
+ in the font mapping file.</para>
+
+ <sect3 id="developers-note-fonts-mapping-format-font-encoding">
+ <title>rosegarden-font-encoding</title>
+
+ <para>This element must exist in every mapping file, and
+ should contain all the other elements. The only attribute
+ is "name", which contains the font's name as shown in the
+ font selection dropdown. Although the file format will
+ permit any name to be used here, Rosegarden will only pick
+ up the font corectly if the XML file has the same name as
+ the contents of this attribute (except that the XML file
+ should be named in lower-case and should end in ".xml").
+ </para>
+ </sect3>
+
+ <sect3 id="developers-note-fonts-mapping-format-font-information">
+ <title>font-information</title>
+
+ <para>This should normally be the first child element of
+ "rosegarden-font-encoding". It may have any of the
+ following attributes, all of which are optional:
+
+ <variablelist>
+ <varlistentry>
+ <term>origin</term>
+ <listitem>
+ <para>A textual description of the likely origin of
+ the mapped font (not the origin of the mapping
+ file).</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>copyright</term>
+ <listitem>
+ <para>A textual description of the likely copyright
+ status of the mapped font (not the copyright status
+ of the mapping file). Note that because the mapping
+ file contains information such as origin and
+ copyright of the font itself, it is usually
+ advisable to make separate mapping files for
+ separate fonts where practical, even if the fonts
+ share other mapping data.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>mapped-by</term>
+ <listitem>
+ <para>The name of the creator of the mapping file
+ (i.e. you, presumably).</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>type</term>
+ <listitem>
+ <para>The type of the font. This attribute should
+ contain one of the values "pixmap" or "scalable".
+ Fonts that are loaded into the windowing system and
+ are available to Rosegarden as standard system fonts
+ have type "scalable"; fonts that need to be loaded
+ from pixmap files corresponding to individual sizes
+ of pixmap (such as the feta and rg21 fonts included
+ with Rosegarden) have type "pixmap".</para>
+
+ <para>This information is only intended for the user
+ reference; it isn't actually used by Rosegarden. It is
+ legitimate in practice for a font to be a mixture of the
+ two, but in general we will assume in this documentation
+ that a font is either scalable or pixmap.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>smooth</term>
+ <listitem>
+ <para>A boolean attribute indicating whether the
+ font is antialiased (smooth) or not. Should have
+ the value "true" or "false". If the font is smooth,
+ other display elements such as beams and slurs that
+ are not generated from the font will also be
+ antialiased.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>autocrop</term>
+ <listitem>
+ <para>Only relevant for scalable (system) fonts.
+ Rosegarden usually expects the metrics for a font to
+ contain the vertically smallest bounding boxes for
+ elements such as note heads and accents, rather than
+ including empty space above or below these elements
+ for alignment purposes. Most fonts do not do what
+ Rosegarden expects. Therefore for these fonts you
+ should set the autocrop attribute to "true"; then
+ Rosegarden will crop any unnecessary space from the
+ top and bottom of these elements when rendering
+ them.</para>
+ </listitem>
+ </varlistentry>
+
+ </variablelist>
+
+ </para>
+ </sect3>
+
+ <sect3 id="developers-note-fonts-mapping-format-font-requirements">
+ <title>font-requirements</title>
+ <para>
+ This element is only relevant for scalable fonts. It is
+ used to specify that this font should only be offered if
+ certain system fonts are available, as well as to
+ associate IDs with those system fonts to refer to in the
+ <link
+ linkend="developers-note-fonts-mapping-format-font-symbol-map">font-symbol-map</link>
+ element. This scheme is used to decide which notation
+ fonts should be offered to the user, and also allows you
+ to compose a Rosegarden notation font from more than one
+ system font if desired.
+ </para>
+ <para>The "font-requirements" element should contain a list
+ of "font-requirement" child elements. Each of these has two
+ attributes: "font-id", containing a numerical ID of your
+ choice for reference elsewhere in the file, and either a
+ "name" or a "names" attribute. If "name" is provided, it
+ will be used as the name of a single system font to be
+ associated with the font id; if "names" is provided, it will
+ be treated as a comma-separated list of system fonts and the
+ first one found will be associated with the font id.
+ </para>
+ </sect3>
+
+ <sect3 id="developers-note-fonts-mapping-format-font-sizes">
+ <title>font-sizes</title>
+
+ <para>The "font-sizes" element specifies which notation font
+ sizes are available, and how the nominal font size relates
+ to the dimensions of non-font elements such as stems, staff
+ lines and beams. The "size" of a notation font is assumed
+ to be the distance in pixels between staff lines, or more
+ precisely, the height of a conventional note head that
+ completely fills the space between lines: the size therefore
+ does not include the thickness of either of the neighbouring
+ staff lines.
+ </para>
+
+ <para>
+ <!-- !!! TODO throughout this section: how to mark up XML element/attribute names? equiv of <code> in HTML would do -->
+ There are two possible child elements of "font-sizes":
+ "font-scale" and "font-size". Their use depends on the
+ type of font being described.</para>
+
+ <para>
+ For pixmap (non-scalable) fonts, the "font-sizes" element
+ should contain a list of "font-size" elements, one for
+ each size of pixmaps available. The pixmaps themselves
+ must be installed in the
+ fonts/&lt;font-name&gt;/&lt;font-size&gt; subdirectory of
+ the Rosegarden installation directory, where
+ &lt;font-name&gt; is the name of the font (as specified in
+ the "rosegarden-font-encoding" element at the start of the
+ mapping file), or a lower-case version of the name, and
+ &lt;font-size&gt; is the pixel size of the font. A font
+ size will only be made available to the user if it has an
+ entry in the "font-sizes" list and the pixmap directory is
+ found.
+ </para>
+
+ <para>
+ For scalable fonts, the "font-sizes" element should
+ contain one "font-scale" element that defines the
+ relationships between font and non-font elements in a
+ general way, and also defines the relationship between
+ Rosegarden's nominal font size and the size of the
+ corresponding system font. If this "font-scale" element
+ is found, then Rosegarden will assume the font is
+ available in any size. You can however still include one
+ or more "font-size" elements to define precise proportions
+ for any particular size for which the general proportions
+ do not quite work correctly, for example because of
+ rounding error.
+ </para>
+
+ <para>
+ The attributes of "font-scale" and "font-size" are very
+ similar. The main difference is that all attributes of
+ "font-scale" are floating-point values relative to the
+ font size, where 1.0 is the base font size (i.e. the
+ distance between staff lines), whereas attributes of
+ "font-size" are integer pixel values. The attributes
+ available are as follows. (Those marked "optional" have
+ vaguely sensible defaults, so it's a good idea to try not
+ setting them first.)
+ </para>
+
+ <variablelist>
+
+ <varlistentry>
+ <term>note-height</term>
+ <listitem>
+ <para>This attribute is only available for the
+ "font-size" element, and it is mandatory in that
+ element. It defines the base size of font to which the
+ other attributes in this element apply, and a size that
+ will be offered to the user and used when looking up
+ pixmaps for this font.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>font-height</term>
+ <listitem>
+ <para>May be used in either "font-size" or "font-scale".
+ This is only relevant for scalable fonts, but is
+ mandatory for them if used in the "font-scale" element.
+ This defines the size of the system font used to draw a
+ given size of notation font.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>beam-thickness</term>
+ <listitem>
+ <para>Optional. Defines the thickness of a beam.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>staff-line-thickness</term>
+ <listitem>
+ <para>Optional. Defines the thickness of a staff line.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>stem-thickness</term>
+ <listitem>
+ <para>Optional. Defines the thickness of a note stem.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>flag-spacing</term>
+ <listitem>
+ <para>Optional. Defines the gap between note flags in
+ cases where multiple flags are drawn by drawing a single
+ flag several times.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>border-x</term>
+ <listitem>
+ <para>Optional. Specifies that the note head pixmaps
+ have a fixed area to left and right that should not be
+ considered part of the note head. This attribute gives
+ the thickness of that area.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>border-y</term>
+ <listitem>
+ <para>Optional. Specifies that the note head pixmaps
+ have a fixed area to top and bottom that should not be
+ considered part of the note head. This attribute gives
+ the thickness of that area.</para>
+ </listitem>
+ </varlistentry>
+
+ </variablelist>
+ </sect3>
+
+ <sect3 id="developers-note-fonts-mapping-format-font-symbol-map">
+ <title>font-symbol-map</title>
+ <para>
+ This element lists the symbols available in this notation
+ font, and which pixmap files or system font code points
+ they should be drawn from.</para>
+
+ <para>It should contain a list of "symbol" elements. These
+ have several possible attributes, the choice of which will
+ normally depend on whether the font is based on pixmaps or
+ system fonts:
+ </para>
+
+ <variablelist>
+ <varlistentry>
+ <term>name</term>
+ <listitem>
+ <para>Mandatory. This attribute should contain the
+ name of the notation symbol. If the symbol exists in
+ the <ulink
+ url="http://www.unicode.org/charts/PDF/U1D100.pdf">Unicode
+ 3.2 standard</ulink>, the name should be that used to
+ identify the symbol in the standard.</para>
+
+ <para>Most of the symbols Rosegarden expects to find
+ are in the standard; one exception is that many fonts
+ have a special version of the flag symbol that is
+ intended to be used when composing multiple flags from
+ individual single flags. Rosegarden refers to this as
+ "MUSICAL SYMBOL COMBINING FLAG-0", a name not used in
+ the Unicode standard (which has flags 1-5 only).</para>
+
+ <para>For a definitive set of the symbol names
+ Rosegarden knows about, see the file
+ "gui/notecharname.cpp" in the Rosegarden source
+ distribution. Note however that it is possible to use
+ additional symbol names by introducing them in a <link
+ linkend="developers-note-styles">notation
+ style</link>.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>src</term>
+ <listitem>
+ <para>The name of the pixmap file from which this
+ symbol should be loaded, without a directory or
+ extension. This is the usual way of describing a
+ symbol in a pixmap font. The file itself should be
+ installed to
+ fonts/&lt;font-name&gt;/&lt;font-size&gt;/&lt;src&gt;.xpm
+ under the Rosegarden installation directory.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>inversion-src</term>
+ <listitem>
+ <para>The name of a pixmap file from which an inverted
+ version of this symbol may be loaded, without a
+ directory or extension. If this attribute is absent
+ and an inverted version of the symbol is required, it
+ will be generated simply by loading the normal version
+ and reflecting it in a central x-axis.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>code</term>
+ <listitem>
+ <para>The code point at which this symbol may be found
+ in the relevant system font, as a decimal integer.
+ This is a way of describing a symbol in a scalable
+ font. This attribute will only be referred to if no
+ pixmap file is supplied, or if the pixmap file fails
+ to load.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>inversion-code</term>
+ <listitem>
+ <para>The code point at which an inverted version of
+ this symbol may be found in the relevant system font.
+ If this attribute is absent and an inverted version of
+ the symbol is required, it will be generated simply by
+ loading the normal version and reflecting it in a
+ central x-axis.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>glyph</term>
+ <listitem>
+ <para>The raw glyph index at which this symbol may be found
+ in the relevant system font, as a decimal integer.
+ This is a way of describing a symbol in a scalable
+ font. This attribute will only be referred to if no
+ pixmap file is supplied, or if the pixmap file fails
+ to load.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>inversion-glyph</term>
+ <listitem>
+ <para>The raw glyph index at which an inverted version of
+ this symbol may be found in the relevant system font.
+ If this attribute is absent and an inverted version of
+ the symbol is required, it will be generated simply by
+ loading the normal version and reflecting it in a
+ central x-axis.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>font-id</term>
+ <listitem>
+ <para>The id of the system font from which this symbol
+ should be loaded, as defined in the <link
+ linkend="developers-note-fonts-mapping-format-font-requirements">font-requirements</link>
+ element. The default is 0.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>codebase</term>
+ <listitem>
+ <para>This (decimal integer) attribute may be of use
+ if many of the symbols in a scalable font cover a
+ short range of code points starting at a relatively
+ high code page. If supplied, the codebase value will
+ be added to each of the subsequent code and
+ inversion-code values when looking up a symbol.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ </variablelist>
+
+ <para>
+ Although none of these attributes is mandatory except for
+ the name, a symbol obviously needs to supply at least one
+ of "src", "inversion-src", "code", "inversion-code",
+ "glyph", or "inversion-glyph" to stand any chance of being
+ rendered at all. It is of course perfectly legitimate to
+ supply several or all of these attributes.
+ </para>
+
+ </sect3>
+
+ <sect3 id="developers-note-fonts-mapping-format-font-hotspots">
+ <title>font-hotspots</title>
+ <para>
+ </para>
+ </sect3>
+
+ </sect2>
+
+ </sect1>
+
+ <sect1 id="developers-note-styles">
+ <title>Creating new notation styles</title>
+
+ <para>
+ Rosegarden's notation editor has the ability to display and
+ edit notes in various standard styles: classical, diamond
+ heads and so on. These styles are all defined in XML style
+ definition files installed along with the application, and
+ it's possible to create a new one by writing a simple XML
+ file. Rosegarden simply looks at the set of installed files
+ to determine which styles to offer the user. You can refer to
+ the default set of files in the styles subdirectory of the
+ Rosegarden installation directory for examples.
+ </para>
+
+ <para>
+ The file format is not yet especially comprehensive; at the
+ moment it has been designed to be powerful enough to describe
+ the standard styles that come with Rosegarden, but not much
+ more. If you should try to create new styles this way, we'd
+ be very interested in your feedback on the Rosegarden
+ mailing-lists.
+ </para>
+
+ <sect2 id="developers-note-styles-format">
+ <title>Notation style XML format</title>
+
+ <para>
+ Here is a summary of the XML elements that may be used in
+ a style definition file.
+ </para>
+
+ <sect3 id="developers-note-styles-note-style">
+ <title>rosegarden-note-style</title>
+
+ <para>This element must exist in every style file, and
+ should contain all the other elements. It has one optional
+ attribute, "base-style", which may be used to name a style
+ from which this style takes the default values for any
+ parameters not specified elsewhere in the present file.
+ It's often good practice to define a style in terms of the
+ minimal difference from a given base style: see the supplied
+ Cross.xml for a particularly simple example.
+ </para>
+
+ <para>Note that the "rosegarden-note-style" element does not
+ give the name of the style being defined, which is instead
+ currently drawn from the name of the file. At some point in
+ the future we may add internationalizable style name
+ attributes to this element.</para>
+ </sect3>
+
+ <sect3 id="developers-note-styles-global-note">
+ <title>global, note</title>
+
+ <para>Within the "rosegarden-note-style" element, there may
+ be one "global" element and any number of "note" elements.
+ We describe these together, as they have almost identical
+ sets of attributes. The "global" element simply provides
+ default values for those parameters not specified for a
+ particular note type in any following "note" element.
+ </para>
+
+ <para>The attributes for these elements are as follows. All
+ of these are optional except as described:</para>
+
+ <variablelist>
+
+ <varlistentry>
+ <term>type</term>
+ <listitem>
+ <para>Only relevant to the "note" element, and
+ mandatory for that element. This attribute specifies
+ which sort of note is being styled. Legal values are
+ textual American or British note names (from "64th",
+ "sixth-fourth note", "hemidemisemiquaver" etc to
+ "double whole note").
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>shape</term>
+ <listitem>
+ <para>Defines a note head shape for this style. Any
+ string is a legal value, but the only values
+ implemented so far are "angled oval", "level oval",
+ "breve", "cross", "triangle up", "triangle down",
+ "diamond" and "rectangle". The value "number" is also
+ recognised but not yet implemented.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>charname</term>
+ <listitem>
+ <para>Defines a note font character name to be used as
+ the note head for this style. An element may supply a
+ "shape" or "charname" attribute, but not both. The
+ name should be one of those defined in the current
+ notation font's <link
+ linkend="developers-note-fonts-mapping-format-font-symbol-map">symbol
+ map</link> (in a "name" attribute).
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>filled</term>
+ <listitem>
+ <para>Specifies whether this note should have a filled
+ head (where applicable, i.e. where the shape attribute
+ supplies a shape that is available both filled and
+ unfilled). Must be "true" or "false".
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>stem</term>
+ <listitem>
+ <para>Specifies whether this note should have a stem.
+ Must be "true" or "false".
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>flags</term>
+ <listitem>
+ <para>Defines how many flags or beams this note should
+ have. The valid range is 0 to 4.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>slashes</term>
+ <listitem>
+ <para>Defines how many slashes this note should have
+ across its stem.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>hfixpoint</term>
+ <listitem>
+ <para>Specifies in which x position the stem fixes to
+ the note head. Acceptable values are "normal" (the
+ right side when the stem points up, the left when it
+ points down), "central", and "reversed" (left side
+ when the stem points up, right when it points down).
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>vfixpoint</term>
+ <listitem>
+ <para>Specifies in which y position the stem fixes to
+ the note head. Acceptable values are "near" (the stem
+ fixes to the top when pointing up, the bottom when
+ pointing down), "middle", or "far".
+ </para>
+ </listitem>
+ </varlistentry>
+
+ </variablelist>
+ </sect3>
+ </sect2>
+ </sect1>
+
+
+ <!-- (OPTIONAL) A Programming/Scripting reference chapter should be
+ used for apps that use plugins or that provide their own scripting hooks
+ and/or development libraries. -->
+
+ <!-- cc: I think we should document the DCOP API here, but I don't
+ think we should include extensive developer docs, although we should
+ point to where they can be found in the source tree or online. -->
+<!--
+ <para>
+ Programming <application>Rosegarden</application> plugins is
+ a joy to behold. Just read through the next
+ 66 pages of <acronym>API</acronym>'s to learn how!
+ </para>
+-->
+ <!-- Use refentries to describe APIs. Refentries are fairly
+ complicated and you should consult the docbook reference for
+ further details. The example below was taken from that reference
+ and shortened a bit for readability. -->
+<!--
+ <refentry id="re-1007-unmanagechildren-1">
+ <refmeta>
+ <refentrytitle>XtUnmanageChildren</refentrytitle>
+ <refmiscinfo>Xt &ndash; Geometry Management</refmiscinfo>
+ </refmeta>
+ <refnamediv>
+ <refname>XtUnmanageChildren
+ </refname>
+ <refpurpose>remove a list of children from a parent widget's managed list.
+ </refpurpose>
+ </refnamediv>
+ <refsynopsisdiv>
+ <refsynopsisdivinfo>
+ <date>4 March 1996</date>
+ </refsynopsisdivinfo>
+ <synopsis>
+ void XtUnmanageChildren(<replaceable>children</replaceable>, <replaceable>num_children</replaceable>)
+ WidgetList <replaceable>children</replaceable>;
+ Cardinal <replaceable>num_children</replaceable>;
+ </synopsis>
+
+ <refsect2 id="r2-1007-unmanagechildren-1">
+ <title>Inputs</title>
+ <variablelist>
+ <varlistentry>
+ <term><replaceable>children</replaceable>
+ </term>
+ <listitem>
+ <para>
+ Specifies an array of child widgets. Each child must be of
+ class RectObj or any subclass thereof.
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><replaceable>num_children</replaceable>
+ </term>
+ <listitem>
+ <para>Specifies the number of elements in <replaceable>children</replaceable>.
+ </para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refsect2></refsynopsisdiv>
+
+ <refsect1 id="r1-1007-unmanagechildren-1">
+ <title>Description
+ </title>
+ <para>
+ <function>XtUnmanageChildren()</function> unmaps the specified widgets
+ and removes them from their parent's geometry management.
+ The widgets will disappear from the screen, and (depending
+ on its parent) may no longer have screen space allocated for
+ them.
+ </para>
+ <para>Each of the widgets in the <replaceable>children</replaceable> array must have
+ the same parent.
+ </para>
+ <para>See the &ldquo;Algorithm&rdquo; section below for full details of the
+ widget unmanagement procedure.
+ </para>
+ </refsect1>
+
+ <refsect1 id="r1-1007-unmanagechildren-2">
+ <title>Usage</title>
+ <para>
+ Unmanaging widgets is the usual method for temporarily
+ making them invisible. They can be re-managed with
+ <function>XtManageChildren()</function>.
+ </para>
+ <para>
+ You can unmap a widget, but leave it under geometry
+ management by calling <function>XtUnmapWidget()</function>. You can
+ destroy a widget's window without destroying the widget by
+ calling <function>XtUnrealizeWidget()</function>. You can destroy a
+ widget completely with <function>XtDestroyWidget()</function>.
+ </para>
+ <para>
+ If you are only going to unmanage a single widget, it is
+ more convenient to call <function>XtUnmanageChild()</function>. It is
+ often more convenient to call <function>XtUnmanageChild()</function>
+ several times than it is to declare and initialize an array
+ of widgets to pass to <function>XtUnmanageChildren()</function>. Calling
+ <function>XtUnmanageChildren()</function> is more efficient, however,
+ because it only calls the parent's <function>change_managed()</function>
+ method once.
+ </para>
+ </refsect1>
+
+ <refsect1 id="r1-1007-unmanagechildren-3">
+ <title>Algorithm
+ </title>
+ <para><function>XtUnmanageChildren()</function> performs the following:
+ </para>
+ <variablelist>
+ <varlistentry>
+ <term>-
+ </term>
+ <listitem>
+ <para>Ignores the child if it already is unmanaged or is being
+ destroyed.
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>-
+ </term>
+ <listitem>
+ <para>Otherwise, if the child is realized, it makes it nonvisible
+ by unmapping it.
+ </para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ <para>
+ </para>
+ </refsect1>
+
+ <refsect1 id="r1-1007-unmanagechildren-4">
+ <title>Structures</title>
+ <para>
+ The <type>WidgetList</type> type is simply an array of widgets:
+ </para>
+ <screen id="sc-1007-unmanagechildren-1">
+ typedef Widget *WidgetList;
+ </screen>
+ </refsect1>
+ </refentry>
+-->
+ </chapter>
+
+
+ <chapter id="credits">
+
+ <title>Credits and License</title>
+
+ <para>
+ <application>Rosegarden</application>
+ </para>
+ <para>
+ <itemizedlist>
+ <listitem>
+ <para>
+
+ Rosegarden-4 is Copyright 2000-2003 Guillaume Laurent,
+ Chris Cannam and Richard Bown. The moral rights of
+ Guillaume Laurent, Chris Cannam and Richard Bown to be
+ identified as the authors of this work have been asserted.
+
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+
+ Parts of Rosegarden-4 are derived from Rosegarden 2.1,
+ which is Copyright 1994 &ndash; 2001 Chris Cannam, Andrew Green,
+ Richard Bown and Guillaume Laurent.
+
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+
+ For musical notation display Rosegarden-4 uses pixmaps
+ derived from the Feta font, part of the <ulink
+ url="http://lilypond.org/">Lilypond</ulink> software,
+ which is Copyright 1997 &ndash; 2001 Jan Nieuwenhuizen and
+ Han-Wen Nienhuys.
+
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+
+ Other major contributors include Randall Farmer, Ron
+ Kuris, Hans Kieserman, and Michael McIntyre.
+
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+
+ The Rosegarden splash-screen image is from a 1900 postcard
+ of Thornden Park at Syracuse University, Syracuse, NY,
+ used with thanks to the staff of Syracuse University.
+
+ </para>
+ </listitem>
+
+ </itemizedlist>
+ </para>
+
+ <para>
+ Documentation copyright 2002-2003 Chris Cannam, Richard Bown, Guillaume Laurent
+ </para>
+<!--
+ <para>
+ Translations done by:
+ <itemizedlist>
+ <listitem>
+ <para>Babel D. Fish <email>[email protected]</email> (Sanskrit)</para>
+ </listitem>
+ </itemizedlist>
+ </para>
+-->
+ <!-- For URL links to common stuff like the one below,
+ always use paths like "common/gpl-licence".
+ In this path, "common" will be a symbolic link built at "make install" time.
+ This link will normally point to $KDEDIR/share/doc/HTML/en/common,
+ where "en" should be replaced with the current language. -->
+
+ <para>
+ This program is licensed under the terms of the
+ <ulink url="common/gpl-license.html">GNU GPL</ulink>.
+ </para>
+ </chapter>
+
+
+ &documentation.index;
+</book>
diff --git a/docs/sv/index.docbook b/docs/sv/index.docbook
new file mode 100644
index 0000000..066dcb0
--- /dev/null
+++ b/docs/sv/index.docbook
@@ -0,0 +1,6485 @@
+<?xml version="1.0" ?>
+<!DOCTYPE book PUBLIC "-//KDE//DTD DocBook XML V4.1.2-Based Variant V1.0//EN" "dtd/kdex.dtd" [
+ <!ENTITY rosegarden "<application
+>Rosegarden</application
+>">
+ <!ENTITY MIDI "<acronym
+>MIDI</acronym
+>">
+ <!ENTITY % Swedish "INCLUDE"
+> <!-- change language only here -->
+ <!ENTITY % addindex "IGNORE">
+]>
+
+<!-- The language must be changed in the <book
+> tag for translations. -->
+
+
+<!--
+
+ Notes on style and terminology for Rosegarden handbook
+ ======================================================
+
+ * Aim to be clear, brief and direct, but be informal.
+
+ * Write instructions in the second person.
+
+ Good: "You can select segments by clicking on
+ them with the arrow tool."
+
+ Bad: "Segments can be selected by clicking on
+ them with the arrow tool."
+
+ Very bad: "The arrow tool allows the user to select
+ segments by clicking on them."
+
+ If you dislike the first of these because you want to
+ make the phrase "the arrow tool" more obvious by placing
+ it at the start of the sentence, then perhaps you
+ should be using a variablelist instead and making
+ "the arrow tool" a list item.
+
+ * It's perfectly permissible to detour to explain why
+ something is the way it is, particularly if it might
+ not be obvious.
+
+ * It's also entirely permissible to omit advanced stuff
+ from the "Using Rosegarden" section and document it
+ only in the reference section. "Using Rosegarden"
+ should be about understanding how and why, not about
+ knowing every last clever detail.
+
+ * Bear in mind we can link extensively from any part of
+ the handbook to any other. Unfortunately DocBook won't
+ allow you to write a link to a target that doesn't
+ exist yet, so if you want to link to something that's
+ not yet been written, either make a note of the planned
+ link in an XML comment, or go and create a stub for the
+ bit that hasn't been written yet, or else just write in
+ a way that allows for a link to be easily added later
+ (we could do an editing phase specially for links).
+
+ * Be strict about using the correct terminology for
+ Rosegarden data structures (segment, event, track,
+ instrument, composition), but don't capitalise the
+ words. Capitalisation is useful in technical documents
+ to make it clear that you're referring to a precise
+ concept, but you shouldn't have to do it to make your
+ meaning clear in user documentation. If something
+ seems ambiguous without, try rewording it instead.
+
+
+ About Screenshots
+ =================
+
+ Screenshots used with this documentation should use the
+ following style, colour and font settings:
+
+ * KDE Style: "Light Style, 3rd Revision"
+
+ * Colour scheme: "Blue Slate", with high-contrast
+ setting and with the standard widget background set
+ to white. (I have this saved as a new scheme.)
+
+ * Fonts: Verdana 11px for general use and menus; Verdana
+ 11px bold for window titles; antialiasing on, but
+ sub-pixel antialiasing off. (For pictures of the
+ segment and instrument parameter boxes I usually turn
+ the size up to 13px, which perhaps says something about
+ our use of font size in these boxes.)
+
+ * Window Decorations: "Quartz"
+
+ None of these would be my first choice for nice-looking
+ screenshots now, but we're not here to sell Rosegarden in this
+ document, we're here to provide clear and consistent help text.
+ So the priority is to make new screenshots look like the existing
+ ones, not to make them look fancy. Also, I think there is an
+ advantage to having screenshots in a help document look a bit
+ distinct from the user's own window decorations surrounding the
+ help text.
+
+ Screenshots of the whole program or of whole matrix or
+ notation windows may be taken using different themes if
+ desired, but screenshots of individual dialogs or window
+ components must use the above scheme.
+
+-->
+
+<!--
+ Notes on Usability Defects
+ ==========================
+
+ This comment is a place to note anything I find difficult to
+ document, or anything where the functions for two necessarily
+ linked concepts are not actually linked in the GUI (etc).
+
+ * The audio file directory (in document properties) can't be
+ inspected or changed from the audio file manager. This is
+ arguably linked to a need for a project directory. There
+ are various other usability problems with the audio file
+ manager as well, e.g. there's no way to tell it to pull all
+ imported audio files into a single audio directory.
+
+ * Track buttons showing sometimes-instrument, sometimes-label.
+
+ * Can't usefully double-click / right-click on most rulers.
+ This would be useful for a slower but clearer way to set
+ loops; adding and editing markers; etc. Setting loops is
+ particularly opaque especially in notation and matrix views.
+
+ * Hideous inconsistency (documented in an RFE already) between
+ having to use RG for MIDI routing and being unable to use RG
+ for audio routing.
+
+ * Uh, Pedro implemented this multiport recording but we can't
+ actually split the results can we?
+
+ Troubleshooting
+ ===============
+
+ Shall we have a troubleshooting section?
+
+ * I'm not seeing any MIDI outputs
+ * I'm not hearing any sound from my MIDI outputs
+ * I'm not seeing any audio outputs
+ * I'm not hearing any sound from my audio outputs
+ * I don't see any synth plugins
+
+-->
+
+<!--
+ Still to do
+ ===========
+
+ * Control rulers
+
+ * Controller editing
+
+ * Event list
+
+ * Event editor dialogs
+
+ * Tempo / timesig editor
+
+ * Triggered segments
+
+ * Split by Pitch
+
+ * Document properties
+
+ * Add images for the tools (move, split &c) when describing them
+
+ * Add images for transport buttons in transport section
+
+ * Update notation menu references
+
+ * Add new notation stuff
+
+ * Config dialog
+
+ * Make sure the guimenuitem etc tags are being used for all menu refs
+
+ * Give keyboard shortcuts for menu functions?
+
+ * Go through again changing Rosegarden -> &rosegarden; and double-hyphen ->
+ &ndash; or &mdash; and review any uses of "the ... function" to see
+ if these words are redundant
+
+ * Troubleshooter
+
+ * Check !!! items
+
+ * Fill gaps in revision history
+
+ * Consistent capitalisation: Instrument Parameter Box or instrument
+ parameter box? Audio Mixer or audio mixer? Device or device?
+
+ * Finally, review the structure again and adjust the <chapter
+>/<sect*>
+ for balance
+
+-->
+
+
+<book id="rosegarden" lang="&language;">
+
+ <!-- This header contains all of the meta-information for the document such
+ as Authors, publish date, the abstract, and Keywords -->
+
+ <bookinfo>
+ <title
+>Handbok Rosegarden</title>
+ <authorgroup>
+ <author
+><firstname
+>Chris</firstname
+> <surname
+>Cannam</surname
+> </author>
+ <author
+><firstname
+>Richard</firstname
+> <surname
+>Bown</surname
+> </author>
+ <author
+><firstname
+>Guillaume</firstname
+> <surname
+>Laurent</surname
+> </author>
+ <othercredit role="translator"
+> <firstname
+>Stefan</firstname
+> <surname
+>Asserhäll</surname
+> <affiliation
+><address
+><email
+></address
+></affiliation
+> <contrib
+>Översättare</contrib
+></othercredit
+>
+ </authorgroup>
+
+ <copyright>
+ <year
+>2002-2004</year>
+ <holder
+>Chris Cannam, Richard Bown, Guillaume Laurent</holder>
+ </copyright>
+
+ <date
+>2005-08-04</date>
+ <releaseinfo
+>1.2.0</releaseinfo>
+
+ <abstract>
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-mainwindow.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase
+>&rosegarden;</phrase>
+ </textobject>
+ </mediaobject>
+</screenshot
+> Rosegarden är ett program för ljud- och &MIDI;-inspelning och en editor för musikalisk notskrift. Den här handboken beskriver hur det används. </para>
+ </abstract>
+
+ <keywordset>
+ <keyword
+>Rosegarden</keyword>
+ <keyword
+>musikbehandlare</keyword>
+ <keyword
+>MIDI</keyword>
+ <keyword
+>ljud</keyword>
+ <keyword
+>musik</keyword>
+ <keyword
+>beteckning</keyword>
+ <keyword
+>partitur</keyword>
+ <keyword
+>KDE</keyword>
+ </keywordset>
+
+ </bookinfo>
+
+ <!-- The contents of the documentation begins here. Label each
+ chapter so with the id attribute. This is necessary for two reasons:
+ it allows you to easily reference the chapter from other chapters of
+ your document, and if there is no ID, the name of the generated HTML
+ files will vary from time to time making it hard to manage for
+ maintainers and for the CVS system. Any chapter labelled (OPTIONAL)
+ may be left out at the author's discretion. Other chapters should
+ not be left out in order to maintain a consistent documentation
+ style across all KDE apps. -->
+
+ <chapter id="introduction">
+ <title
+>Inledning</title>
+
+ <sect1>
+ <title
+>Om Rosegarden</title>
+ <para
+><application
+>Rosegarden</application
+> är ett program för ljud- och &MIDI;-inspelning och en editor för musikalisk notskrift. Rosegarden låter dig spela in, arrangera och komponera musik, i form av ett traditionellt partitur eller &MIDI;-data, eller ljudfiler som antingen importeras eller spelas in via en mikrofon, gitarr eller vilken ljudkälla du önskar. Du kan använda Rosegarden för att skriva, redigera och organisera musik för att skapa en komposition, som du därefter kan syntetisera, lägga till effekter i och mixa för att bränna till en cd eller distribuera på webben. Rosegarden innehåller också professionellt stöd för notredigering för utskrift med hög kvalitet. </para>
+
+ <para
+><application
+>Rosegarden</application
+> är konstruerat för att se ut som och fungera på ett sätt som är bekant för erfarna användare som kommer till Linux från andra plattformar, medan det också är tillgängligt och användarvänligt för de som är nykomlingar till musikprogramvara i allmänhet. </para>
+
+ <sect2 id="intro-handbook">
+ <title
+>Om den här handboken</title>
+ <para
+>Den här handboken ger en översikt av &rosegarden;s möjligheter, och tillhandahåller en referens för en del av de begrepp som ingår. Den är skapad för att antingen vara meningsfull när den läses i en följd, eller när den används som en referens till begrepp och tillgängliga funktioner i Rosegarden. Om du dessutom vill läsa en handledning, <ulink url="http://www.rosegardenmusic.com/resources/tutorial/using_en.shtml"
+>hittar du en här</ulink
+>.</para>
+
+ <para
+>Om det finns något annat du inte förstår eller något du behöver ytterligare hjälp med, besök gärna <ulink url="http://www.rosegardenmusic.com/support/"
+>Rosegardens webbplats</ulink
+> för vanliga frågor och instruktioner om användning av e-postlistan. </para>
+ </sect2>
+
+ <sect2 id="intro-menufunctions">
+ <title
+>Om menyer och snabbtangenter</title
+> <para
+>Handboken hänvisar oftast till funktionerna du kan använda i Rosegarden genom att beskriva var de befinner sig i menyerna. Funktionen för att lägga till ett enstaka nytt spår i huvudspåreditorn är exempelvis <menuchoice
+><guimenu lang="sv"
+>Spår</guimenu
+> <guimenuitem
+>Lägg till spår</guimenuitem
+></menuchoice
+>.</para>
+
+ <para
+>I många fall är det inte det enda sättet att nå en viss funktion. I det här fallet är samma funktion också tillgänglig via snabbtangenten Ctrl+T, och den visas också som en ikon i en av huvudfönstrets verktygsrader. Både snabbtangenten och ikonen kan snabbt läras in, eftersom de visas i Rosegardens meny tillsammans med funktionens namn. Du bör komma ihåg att även om vi alltid anger det fullständiga menyalternativet i dokumentationen av referensskäl, är det inte nödvändigtvis det bästa eller det vanligaste sättet att använda en funktion, och du bör dessutom hålla ett öga på snabbtangenter och ikoner i verktygsraderna. </para>
+ </sect2>
+
+ <sect2 id="intro-optional">
+ <title
+>Valfria funktioner</title
+> <para
+>Handboken antar att installationen av Rosegarden stöder alla funktionerna som det har möjlighet till. Vissa av Rosegardens funktioner, inklusive några av de större, är i själva verket valfria när en installation av Rosegarden byggs. Hela ljuddelsystemet kompileras till exempel bara om JACK-biblioteken är tillgängliga, stöd för syntinsticksmoduler beror på ett antal andra moduler, etc.</para
+> <para
+>Dessa beroenden är dokumenterade i filen README och Rosegardens konfigureringsdokumentation. Om du märker att handboken hänvisar till funktioner som inte finns i den version av Rosegarden som du använder, rådfråga konfigureringsdokumentationen eller distributören. </para>
+ </sect2>
+ </sect1>
+ </chapter>
+
+
+<!--
+ **********************************
+
+ PART I:
+ Discussion and tutorial material
+
+ **********************************
+ -->
+
+
+ <chapter id="file-operations">
+ <title
+>Rosegarden-filer och -dokument</title>
+ <para
+>&rosegarden; lagrar varje komposition i ett eget dokument, med sitt eget interna format. När du sparar ett dokument lagras det på disk som en fil med filändelsen .rg. &rosegarden; kan också hantera ett antal andra standardfilformat. </para>
+
+ <sect1 id="file-creating">
+ <title
+>Nya kompositioner</title>
+ <para
+>När &rosegarden; startar, görs det med ett nytt dokument som innehåller en "tom" komposition som är klar att börja redigera. För att lägga till något i kompositionen måste du antingen spela in något eller skapa några tomma musikavsnitt (som kallas "segment"), som du sedan kan fylla i med de olika redigeringsfunktionerna. </para>
+ <para
+>Se <link linkend="recording"
+>Inspelning</link
+> för detaljinformation om hur musik spelas in, och se avsnittet om <link linkend="segment-view"
+>spåreditorn</link
+> för en beskrivning av hur musiksegment skapas, redigeras och hanteras. </para>
+ </sect1>
+
+ <sect1 id="file-midi">
+ <title
+>Använda MIDI-filer</title>
+ <para
+>För att importera och exportera MIDI-filer, använd alternativen <menuchoice
+><guimenu lang="sv"
+>Arkiv</guimenu
+> <guimenuitem
+>Importera</guimenuitem
+> <guimenuitem
+>Importera MIDI-fil</guimenuitem
+></menuchoice
+> och <menuchoice
+><guimenu lang="sv"
+>Arkiv</guimenu
+> <guimenuitem
+>Exportera</guimenuitem
+> <guimenuitem
+>Exportera MIDI-fil</guimenuitem
+></menuchoice
+>. </para>
+ <para
+>Även om &rosegarden; kan ladda och spara filformat som MIDI, lagras inte MIDI-data internt. Du bör i allmänhet föredra att spara filer med &rosegarden;s eget format, eftersom &rosegarden; lagrar en hel del information som går förlorad vid export till MIDI. </para>
+ <para
+>När en MIDI-fil laddas, delar &rosegarden; upp musiken i ett spår per MIDI-spår eller kanal i filen, <link linkend="studio-midi-import"
+>ställer in lämpliga instrumentavbildningar</link
+> och <link linkend="nv-quantization"
+>försöker beräkna en trolig notering</link
+> för utförd MIDI-data. </para>
+ </sect1>
+
+ <sect1 id="file-merge">
+ <title
+>Sammanfoga filer</title
+> <para
+>Förutom att ladda eller importera filer, kan du också sammanfoga dem med det nuvarande dokumentet, och lägga till segmenten som hittas i filen till de som redan finns. </para>
+
+ <para
+>För att sammanfoga en fil, använd bara passande alternativ i undermenyn <menuchoice
+><guimenu lang="sv"
+>Arkiv</guimenu
+> <guimenuitem
+>Sammanfoga</guimenuitem
+></menuchoice
+>, istället för att använda alternativen Öppna eller Importera. </para>
+ </sect1>
+
+ <sect1 id="file-printing">
+ <title
+>Utskrift</title>
+ <para
+>Du kan skriva ut en komposition i form av ett partitur, genom att använda funktionen <menuchoice
+><guimenu lang="sv"
+>Arkiv</guimenu
+> <guimenuitem
+>Skriv ut</guimenuitem
+></menuchoice
+>. </para>
+
+ <para
+>Att skapa ett partitur från utförd data är en svår uppgift, och i de flesta fall är det inte rimligt att förvänta sig att en standardutskrift baserad på MIDI-data är särskilt läsbar. Du bör använda <link linkend="notation-view"
+>notbehandlaren</link
+> för att städa upp partituret innan du skriver ut det. (Se också <link linkend="nv-quantization"
+>Notskrift från utförandedata</link
+>.) </para>
+
+ <para
+>&rosegarden; klarar av att skapa helt läsbara partitur. Även om det är så, är programmet avsett att vara en skärmeditor, och inte i huvudsak avsett för typsättning. Om du vill skapa partitur med riktig utskriftskvalitet, bör du fundera på att använda <ulink url="http://www.lilypond.org"
+>Lilypond</ulink
+> tillsammans med &rosegarden;. Lilypond är programvara för typsättning av musik som läser ett specialiserat textfilformat, och skapar typsatt utmatning av hög kvalitet. &rosegarden; klarar av att skriva Lilypond-filer med funktionen <menuchoice
+> <guimenu lang="sv"
+>Arkiv</guimenu
+> <guimenuitem
+>Exportera</guimenuitem
+> <guimenuitem
+>Exportera Lilypond-fil</guimenuitem
+></menuchoice
+>. </para
+> </sect1>
+
+ </chapter>
+
+ <chapter id="segment-view">
+ <title
+>Spåreditorn</title>
+ <sect1 id="segment-view-overview">
+ <title
+>Översikt</title>
+ <para
+>&rosegarden;s utseende liknar många andra populära musikbehandlare. Det är baserat på en spårstruktur: Huvudfönstret visar en spåreditor med en spårlista och tillhörande instrument längs med vänster sida. Du kan behandla och flytta block med musikdata (som kallas &ldquo;segment&rdquo;) i spåreditorn, samt öppna själva segmenten i specialiserade editorer (<link linkend="notation-view"
+>not</link
+>, <link linkend="matrix-view"
+>matris</link
+>, <link linkend="percussion-matrix-view"
+>slagverksmatris</link
+> och <link linkend="event-view"
+>händelselista</link
+>). </para>
+
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-trackeditor.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase
+>&rosegarden;s spåreditor som visar två segment med musikdata</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+
+ <para
+>Spår kan tilldelas en uppsättning &MIDI;-instrument, syntinsticksmoduler eller ljudinstrument. I bilden ovan syns tre segment i spåreditorn för spår som är tilldelade till generella MIDI-instrument. </para>
+
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-trackbutton-labels.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase
+>&rosegarden;s spårknappar som visar spårnamn</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+
+ <para
+>Området med knappar till vänster om segmentduken visar spårnummer, tystnads- och inspelningsstatus, och spårets namn. Du kan göra ett spår tyst eller inte genom att klicka på den blåa knappen i form av en lysdiod, och välja ett visst spår som ska användas för inspelning genom att klicka på den röda knappen. För att ändra spårnamnet, dubbelklicka på det. </para>
+
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-trackbutton-instruments.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase
+>&rosegarden;s spårknappar som visar instrumenttilldelningar</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+
+ <para
+>Spårnamn visas bara om menyalternativet <menuchoice
+><guimenu lang="sv"
+>Inställningar</guimenu
+> <guimenuitem
+>Visa spårnamn</guimenuitem
+></menuchoice
+> är aktiverat. Annars visas spårens instrumenttilldelningar istället, som i bilden.</para>
+
+ </sect1>
+ <sect1 id="segment-view-instruments">
+ <title
+>Spår och instrument</title>
+ <para
+>Varje spår måste ha ett tilldelat instrument för att kunna höras. Normalt tilldelas de 16 första spåren till de 16 instrumenten i den första tillgängliga MIDI-enheten, och de följande 16 spåren tilldelas till ljud.</para>
+
+ <para
+>För att ändra instrumenttilldelningen för ett spår, högerklicka på spårnamnet: En meny dyker upp där du kan välja bland alla tillgängliga instrument. </para>
+
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-trackbutton-instrumentmenu.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase
+>&rosegarden;s instrumentmeny</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+
+ <para
+>Ett instrument kan betraktas som en enstaka kanal i en &MIDI;-enhet, som en mono- eller stereoljudutgång, eller som en ljudsyntinsticksmodul. Spår som innehåller notinformation ska tilldelas till &MIDI;- eller syntinsticksinstrument, och de som innehåller ljud till ljudinstrument. Du kan tilldela mer än ett spår till samma instrument, och i så fall använder alla dessa spår samma ljud. </para>
+ <para
+>Du kan ändra diverse egenskaper för instrumentet som tilldelats ett spår, genom att använda <link linkend="segment-view-instrumentparameterbox"
+>instrumentparameterrutan</link
+>. Det är till exempel här som du kan ställa in ett MIDI-instrument så att det använder en speciell ljudpatch, och på så sätt åstadkommer ett speciellt ljud (piano, stråkar, etc.). </para>
+ <para
+>Se avsnittet <link linkend="studio-introduction"
+>Studio</link
+> för mer om instrument. </para>
+
+ </sect1>
+
+ <sect1 id="segment-view-creating">
+ <title
+>Skapa segment</title>
+ <para
+>För att skapa ett tomt segment när någonting nytt ska komponeras, måste du använda pennverktyget. Klicka på pennan i verktygsraden, och klicka därefter på stället där du vill att segmentet ska börja (på rätt plats för spåret som du vill att segmentet ska finnas i, och på ett avstånd i redigeringsfönstret som motsvarar rätt tid) och dra åt höger till segmentet är rätt antal takter i längd. </para>
+
+ <para
+>Oftast börjar varje nytt segment på ett taktstreck och utökas takt för takt, men effekten att låsa till rutnätet kan förhindras genom att hålla nere Skift under klick- och dragåtgärden. </para>
+
+ <para
+>När du väl har skapat ett segment kan du börja redigera det med <link linkend="matrix-view"
+>matriseditorn</link
+>, <link linkend="percussion-matrix-view"
+>slagverksmatriseditorn</link
+> eller <link linkend="notation-view"
+>notbehandlaren</link
+>. För att använda en av editorerna, dubbelklicka antingen på segmentet eller klicka med höger musknapp och välj editorn du vill använda i den sammanhangsberoende menyn. </para>
+
+ <para
+>Om du avser att <link linkend="recording"
+>spela in</link
+> från en MIDI-enhet eller ljudingång, behöver du inte först skapa ett nytt segment att spela in till. Varje enskild inspelning hamnar alltid i ett nytt segment, som skapas automatiskt under inspelningen. </para>
+ </sect1>
+
+ <sect1 id="segment-view-audio-segments">
+ <title
+>Ljudsegment</title>
+ <para
+>Ett ljudsegment innehåller inspelad eller samplad ljuddata, istället för redigerbar tonhändelsedata. Rosegarden låter dig spela in, spela upp, arrangera och dela ljudsegment, men innehåller inte funktioner för redigering av ljudvågformer. </para>
+ <para
+>För att skapa ett ljudsegment kan du <link linkend="recording"
+>spela in</link
+> från en ljudkälla till ett spår som hör till ett ljudinstrument, eller arbeta med befintliga WAV-filer. För att göra det måste du använda ljudhanteringsdialogrutan (som nås via <menuchoice
+><guimenu lang="sv"
+>Segment</guimenu
+> <guimenuitem
+>Hantera ljudsegment</guimenuitem
+></menuchoice
+>). </para>
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-audiofilemanager.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase
+>Ljudfilhantering</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+
+ <para
+>Du kan dra och släppa ljudfiler från KDE:s filbläddrare eller KDE-skrivbordet till ljudfilhanteringen, eller öppna dem med dess arkivmeny. Därefter kan du antingen dra och släppa dem på Rosegardens spårduk, eller använda menyfunktionen <menuchoice
+><guimenu lang="sv"
+>Åtgärd</guimenu
+> <guimenuitem
+>Infoga i markerat ljudspår</guimenuitem
+></menuchoice
+> i ljudfilhanteringen, under förutsättning att spåret som för närvarande är markerat i huvudfönstret är tilldelat till ett ljudinstrument. Nyinspelade ljudsegment syns också i dialogrutan för ljudfilhantering.</para>
+
+ <para
+>Information om ljudfilerna som hör ihop med en viss komposition är sparad med kompositionen, men själva ljudfilerna är inte det. Du måste försäkra dig om att ditt dokument har en vettig sökväg för ljudfiler (via <menuchoice
+><guimenu lang="sv"
+>Komposition</guimenu
+> <guimenuitem
+>Redigera dokumentegenskaper...</guimenuitem
+> <guimenuitem
+>Ljud</guimenuitem
+></menuchoice
+>, för att göra det möjligt att komma åt dina ljudfiler tillsammans.</para>
+
+ <para
+>Dialogrutan för ljudfilhantering visar också samplingsfrekvensen och annan information för varje ljudfil, och markerar eventuella ljudfiler vars samplingsfrekvens inte motsvarar nuvarande JACK-ljudsessionen som Rosegarden använder. Rosegarden samplar om filerna vid uppspelning med en snabb linjär omsampling (men därför med mycket dålig kvalitet). Du råds att sampla om dem separat med en särskild dedicerad ljudeditor istället. </para>
+
+ </sect1>
+
+ <sect1 id="segment-view-manipulating">
+ <title
+>Hantering av segment</title>
+ <para
+>Huvudfönstret innehåller en uppsättning "verktyg" för att redigera segment. De är tillgängliga i huvudverktygsraden: Välj först verktyget du vill ha i verktygsraden, och klicka och dra därefter på segmenten i huvudduken. </para>
+
+ <sect2 id="segment-view-selector">
+ <title
+>Markeringsverktyget</title>
+ <para
+>"Markeringsverktyget" (pilverktyget) är i själva verket ett verktyg med flera användningar. Det kan användas för att markera, flytta, kopiera, ändra storlek och skapa segment.</para>
+
+ <para
+>Den mest uppenbara användningen är markering: Markera ett enstaka segment genom att klicka på det med markeringsverktyget, eller markera flera genom att klicka med Skift nertryckt, eller genom att klicka på ett tomt ställe i fönstret och dra för att åstadkomma ett område. </para>
+
+ <para
+>För att flytta segment med markeringsverktyget, klicka och dra helt enkelt segmentet. För att skapa kopior, klicka och dra med Ctrl nertryckt. För att ändra storlek på ett segment, klicka och dra segmentets högerkant, och för att skapa nya segment klicka och dra på ett tomt ställe med musens mittenknapp. </para>
+
+ <para
+>Markeringsverktyget ersätter ändå inte övriga verktyg helt och hållet: Ibland behöver du vara noggrannare med vilken åtgärd du avsåg, särskilt vid arbete med små segment. </para>
+
+ </sect2>
+
+ <sect2 id="segment-view-move-resize">
+ <title
+>Verktygen för att flytta och ändra storlek</title>
+ <para
+>För att flytta ett segment till en annan starttid eller ett annat spår, använd förflyttningsverktyget och klicka och dra segmentet du vill flytta. Om du håller nere Ctrl-tangenten medan du drar, kopieras segmentet istället för att flyttas.</para>
+
+ <para
+>För att ändra storlek på ett segment, använd verktyget för storleksändring, och klicka och dra i högra ändan av segmentet.</para>
+
+ <para
+>Både vid förflyttning och storleksändring kan du hålla nere Skift för finpositionering, för att undvika att hoppa till en viss rutnätsposition. </para>
+
+ </sect2>
+
+ <sect2 id="segment-view-split-join">
+ <title
+>Delningsverktyget</title>
+ <para
+>Du kan använda delningsverktyget <inlinemediaobject
+> <imageobject
+> <imagedata fileref="rg-split.png"/> </imageobject
+> </inlinemediaobject
+> för att dela ett enstaka segment i två separata segment. För att dela segmentet, välj delningsverktyget och klicka på segmentet du vill dela. </para>
+ <para
+>Normalt delas segment vid taktstrecket närmast markören, men det kan förhindras genom att hålla nere Skift när segmentet delas. </para>
+ </sect2>
+ </sect1>
+
+ <sect1 id="segment-view-tempo-timesig">
+ <title
+>Tempo och taktart</title>
+ <sect2 id="tempo">
+ <title
+>Tempo</title>
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-tempodialog.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase
+>&rosegarden;s tempodialogruta</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+ </sect2>
+
+ <sect2 id="time-signature">
+ <title
+>Taktart</title>
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-timesigdialog.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase
+>&rosegarden;s taktartsdialogruta</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+ </sect2>
+ </sect1>
+ </chapter>
+
+ <chapter id="transport">
+ <title
+>Överföringen</title>
+ <para
+>När du spelar upp en komposition, sveper &rosegarden; en uppspelningsmarkör över spåren från vänster till höger och spelar upp innehållet i segmenten när den korsar dem. Markörens position på skärmen följs och styrs av ett fönster som kallas Överföring. </para>
+
+ <sect1 id="transport-overview"
+><title
+>Översikt</title>
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-transport.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase
+>&rosegarden;s överföringsfönster</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+
+ <para
+>Om överföringen inte är synlig, kan du aktivera den med <menuchoice
+> <guimenu lang="sv"
+>Inställningar</guimenu
+> <guimenuitem
+>Visa överföring</guimenuitem
+></menuchoice
+>. </para>
+
+ <para
+>Överföringen visar tiden som uppnåtts av uppspelningsmarkören, normalt i sekunder. Du kan ändra den att visa metronomtid (takter och taktslag), metronomtid med en blinkande visuell metronom, eller ramtider för ljudsampling, med den översta av de små knapparna till vänster i överföringsfönstret. Knappen direkt nedanför byter mellan att visa tid som är kvar till kompositionens slut istället för tid från början.</para>
+
+ <para
+>Huvudknapparna i överföringen startar uppspelning med musikbehandlaren eller gör paus, flyttar markörpositionen framåt, flyttar den bakåt, stoppar den eller går till kompositionens början eller slut. </para>
+
+ <para
+>Ytterligare knappar och visning av &MIDI;-händelser är dolda längst ner i överföringsfönstret, och kan visas eller inte med pilknappen i det längst till vänster. Dessutom finns knappar för inspelning, för upprepning, för att spela enskilda spår solo, för att stänga av eller sätta på metronomen och för att tysta dina MIDI-enheter (panikknapp) i extradelen. </para>
+
+ </sect1>
+ <sect1 id="recording">
+ <title
+>Inspelning</title>
+ <para
+>För att spela in ett nytt segment i ett spår, försäkra dig först om att rätt spår är markerat för inspelning genom att klicka på den röda (för ljudspår) eller gula (för MIDI-spår) lysdiodknappen vid spårets namn, och använd därefter överföringens inspelningsknapp. Det ger effekten att både starta överföringen, och därigenom spela upp den befintliga kompositionen, och att spela in i motsvarande spår. </para>
+ <para
+>Du kan bara markera ett enda MIDI-spår för inspelning, men du kan spela in hur många ljudspår som helst samtidigt så länge datorn är kraftfull nog. Du kan också markera ett MIDI-spår och ett eller flera ljudspår samtidigt. Var försiktig så att du inte lämnar spår markerade av misstag när du är klar med användning av dem och försöker spela in någon annanstans. </para>
+ <para
+>Som ett alternativ kan du använda punch-in inspelning för att skilja på åtgärderna att starta överföringen och gå in i inspelningsläge. Punch-in inspelning ändras med mellanslagstangenten. Du kan trycka på mellanslag medan en komposition spelas upp för att omedelbart byta mellan uppspelning och inspelning utan att stoppa överföringen, eller använda mellanslag för att förbereda inspelning medan överföringen är stoppad, så att följande uppspelning i själva verket också spelar in. (Det senare är praktiskt vid synkronisering med en <link linkend="transport-external"
+>extern överföring</link
+>.) </para>
+ <para
+>Om du spelar in ett MIDI-spår, sker inspelning från alla MIDI-enheter som är inställda för inspelning i <link linkend="studio-device-editor"
+>MIDI-enhetshanteringen</link
+>. </para>
+ <para
+>Om du spelar in ljudspår, sker inspelning av varje spår från ingången som för närvarande är inställd för det spårets instrument i <link linkend="segment-view-instrumentparameterbox"
+>instrumentparameterrutan</link
+>. Det är antingen en extern ljudingång eller en delnivå eller huvudnivå för ljud (för att utföra ihopmixningar). Om det är en extern ingång, spelas det normalt in från ljudkortets första tillgängliga fysiska inspelningsingång. Du kanske vill använda ett anslutningsverktyg i JACK för att ansluta ett annat ljudprogram som stöder JACK till ingången istället. </para>
+ </sect1>
+ <sect1 id="transport-external">
+ <title
+>Synkronisering med extern överföring</title>
+ <sect2 id="transport-jack">
+ <title
+>Överföring med JACK</title>
+ <para
+>Rosegarden stöder överföringsmekanismen i JACK för att synkronisera överföringen med andra program med JACK på samma dator. För att aktivera den, gå till <menuchoice
+><guimenu lang="sv"
+>Inställningar</guimenu
+> <guimenuitem
+>Anpassa Rosegarden...</guimenuitem
+></menuchoice
+> och välj "Synkronisera" i menyn för JACK överföringsläge på sidan Musikbehandlare under fliken Synkronisering.</para>
+
+ <para
+>När överföring med JACK används, delar alla program som prenumererar på den en gemensam styrning av överföringen, och du kan starta, stoppa och förflytta överföringen från vart och ett av dem.</para>
+
+ <para
+>Många ljudprogram under Linux som använder ljudservern JACK stöder också överföring med JACK. Titta i deras dokumentation för detaljinformation om de gör det och hur.</para>
+ </sect2>
+ <sect2 id="transport-mtc">
+ <title
+>MIDI-tidkod</title>
+ <para
+>Rosegarden stöder synkronisering med MIDI-tidkod (MTC) i huvud- och slavläge. Det är särskilt användbart för att synkronisera Rosegardens överföring med en hårdvaruenhet som stöder MTC, eller med programvara som kör på andra datorer anslutna via MIDI. </para>
+ <para
+>För att göra Rosegarden till MTC-huvudenhet, så att det styr alla MTC-slavar eller program som ansluts, gå till <menuchoice
+><guimenu lang="sv"
+>Inställningar</guimenu
+> <guimenuitem
+>Anpassa Rosegarden...</guimenuitem
+></menuchoice
+> och välj "MTC-huvudenhet" i menyn MIDI-tidkodsläge under fliken Synkronisering på sidan Musikbehandlare. För att göra Rosegarden till en slav, så att Rosegardens överföring automatiskt synkroniseras med inkommande MTC-händelser, välj "MTC-slav". </para>
+ </sect2>
+ </sect1>
+ </chapter>
+
+ <chapter id="studio">
+ <title
+>Studion</title>
+
+ <sect1 id="studio-introduction">
+ <title
+>Enheter, instrument och anslutningar</title>
+
+ <para
+>Rosegarden använder termen studio för att ange allt som den känner till om ljudsystemen anslutna till datorn. Det kan omfatta &MIDI;- och ljudhårdvara och annan ljudprogramvara, och omfattar information om anslutningar, inställning, &MIDI;-patchar och så vidare. Studion är inbyggd i alla kompositioner du skapar med Rosegarden.</para>
+
+ <para
+>Tre ord i terminologin är fundamentala här: <variablelist>
+
+ <varlistentry>
+ <term
+>Enhet</term>
+ <listitem>
+ <para
+>En <quote
+>enhet</quote
+>, så vitt det angår Rosegarden, är helt enkelt något som kan skapa ljud. Det kan vara en MIDI- eller ljudenhet. MIDI-enheter motsvarar inte nödvändigtvis direkt med fysiska MIDI-portar: De är bara saker med namn som du kan ange, som förväntas fungera på ett visst sätt. Inställningsinformation som MIDI-patchavbildningar kan anslutas till enheter. </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>Instrument</term>
+ <listitem>
+ <para
+>Varje enhet har ett antal <quote
+>instrument</quote
+>, där vart och ett antas låta på ett visst sätt. Detta är det du kan tilldela spår till för att välja vilket ljud de spelar. Normalt innehåller en enhet 16 instrument, som skapas åt dig vid start. Om enheten är en MIDI-enhet, initieras vart och ett av dem till en av de 16 MIDI-kanalerna. Instrumentet är stället där du anger alla egenskaper för en viss stämma, som programinställningar, eko, volym, etc. </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>Anslutning</term>
+ <listitem>
+ <para
+>Även om en MIDI-enhet helt enkelt är ett namn och en samling inställningsinformation, anger <quote
+>anslutningen</quote
+> vilken MIDI-port som den är fysiskt ansluten till. Det kan ställas in i <link linkend="studio-device-editor"
+>MIDI-enhetshanteringen</link
+>. (Ljud- och syntinsticksmodulenheter har inte anslutningar på samma sätt). </para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </para>
+
+ <para
+>Tänk dig exempelvis en konfiguration som består av en dator med två fysiska MIDI-portar, där den ena har en extern synt ansluten. Då skulle du normalt ställa in Rosegarden att ha en MIDI-enhet, som motsvarar synten. Du skulle därefter kunna ställa in enheten med rätt namn och patchavbildning, och ange en anslutning för den som motsvarar ljudkortets verkliga MIDI-port. Vart och ett av de 16 standardinstrumenten på enheten skulle kunna anpassas med ett lämpligt program, och därefter skulle du tilldela spår till dem.</para>
+
+ <para
+>I praktiken försöker Rosegarden normalt skapa en enhet för var och en av de tillgängliga anslutningarna vid start. Så med exemplet ovan skulle två MIDI-enheter normalt skapas även om du bara behöver en. Du skulle därefter i allmänhet byta namn på och ange patchavbildningar för den första, och ta bort eller helt enkelt inte använda den andra. Kom ihåg att det finns inget sätt för Rosegarden att veta vilka syntar som du verkligen har anslutit till MIDI-portarna på datorn. Av denna anledning är enheterna som skapas vid start bara avsedda som en standarduppsättning, och det är upp till dig att försäkra dig om att enheterna du ställer in stämmer med de du verkligen använder. </para>
+
+ <para
+>Så fort den är inställd, lagras studioinställningen med varje fil på Rosegarden-format som du sparar.</para>
+
+ </sect1>
+
+ <sect1 id="studio-device-editor">
+ <title
+>Hantering av MIDI-enheter</title>
+
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-devicemanager.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase
+>MIDI-enhetshantering</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+
+ <para
+>Dialogrutan för MIDI-enhetshantering visar de MIDI-enheter som för närvarande är tillgängliga, och var de är anslutna. Använd <menuchoice
+><guimenu lang="sv"
+>Komposition</guimenu
+> <guimenuitem
+>Studio</guimenuitem
+> <guimenuitem
+>Hantera MIDI-enheter</guimenuitem
+></menuchoice
+> för att nå dialogrutan. </para>
+
+ <para
+>Som beskrivs i avsnittet <link linkend="studio-introduction"
+>Enheter, instrument och anslutningar</link
+>, försöker Rosegarden normalt tillhandahålla en rimlig uppsättning enheter vid start, och göra rimliga anslutningar för enheterna. Standarduppsättningen kanske dock inte alltid är lämplig, och därför låter dialogrutan dig byta namn på enheter och ändra deras anslutningar och uppspelnings- eller inspelningsriktningar. </para>
+
+ <para
+>Var och en av uppspelningsenheterna här tillhandahåller en utgång för MIDI-spår att skicka till: Om du lägger till en ny uppspelningsenhet, får du 16 nya instrument i enheten som du kan tilldela spår till. Om du därefter tilldelar en anslutning till enheten, spelas spåren som har tilldelats till den på lämplig kanal (beroende på instrumentet) i vilken MIDI-synt som helst som är kopplad till anslutningen. </para>
+
+ <para
+>Inspelningsenheterna som listas här representerar möjliga källor för att spela in MIDI. Du kan göra en eller flera av dem aktuella (så att Rosegarden lyssnar på den vid inspelning) med kryssrutorna på varje rad, som visas i dialogrutan. </para>
+
+ </sect1>
+
+ <sect1 id="studio-bank-editor">
+ <title
+>Hantera banker och program för MIDI-enheter</title>
+
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-bankeditor.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase
+>Editorn för MIDI-banker och program</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+
+ <para
+>Kom ihåg att varje MIDI-enhet innehåller ett antal instrument, och att du kan tilldela spår till instrumenten. Med MIDI-terminologi, motsvarar varje instrument en enskild kanal i MIDI-synten. Du kan välja vilken av de tillgängliga stämmorna (ljuden) i synten som varje instrument använder, men för att göra det måste du tala om namnen på alla tillgängliga stämmor för Rosegarden. </para>
+
+ <para
+>Den här dialogrutan låter dig tilldela programbanker (namn på stämmor) till MIDI-enheter, och på så sätt låta varje instrument i en enhet att ställas in att använda en av stämmorna i <link linkend="segment-view-instrumentparameterbox"
+> instrumentparameterrutan</link
+>. </para>
+
+ <para
+>Det vanliga sättet att ställa in programnamn för en enhet är att helt enkelt importera dem från en av enhetsfilerna (".rgd") som tillhandahålls. För att göra det, markera en enhet i listan till vänster i dialogrutan, klicka därefter på importknappen under listan och välj .rgd-filen som motsvarar din synt. </para>
+
+ <para
+>Om det inte finns en aktuell .rgd-fil tillgänglig för din synt, kan du använda dialogrutan för att skapa en ny bank. För att göra det måste du hitta programavbildningen i din synts MIDI-implementeringsdiagram och skriva in namnen för hand: Därefter kan du exportera dem till en .rgd-fil att dela med andra användare av Rosegarden. Kontakta e-postlistan rosegarden-user om du har skapat en ny .rgd-fil och vill bidra med den. (Det är hur alla befintliga .rgd-filer har kommit att inkluderas med Rosegarden: andra användare har bidragit dem.) </para>
+
+ <sect2 id="studio-keymappings">
+ <title
+>Tonavbildningar för slagverk</title>
+
+ <para
+>Många MIDI-syntar har åtminstone ett slagverksprogram, där varje "tonhöjd" spelar ett annorlunda ljud. Rosegarden innehåller en särskild matriseditor för slagverk för att visa och redigera toner med en skala som består av de riktiga namnen på tonhöjderna, istället för den konventionella tonskalan på ett piano. </para>
+
+ <para
+>Tonavbildningarna som är tillgängliga för en viss MIDI-synt definieras också i Rosegardens enhetsfil (".rgd"). Varje MIDI-program som definieras som ett slagverksprogram kan ha en tillhörande tonavbildning. Om det finns en, används den normalt för alla spår som tilldelas programmet. Liksom program och bankdefinitioner kan tonavbildningar importeras från och exporteras till .rgd-filer. </para>
+ </sect2>
+
+ <sect2 id="studio-soundfonts">
+ <title
+>Ljudteckensnitt</title>
+
+ <para
+>Om du råkar använda en programvarusynt eller ljudkortssynt som använder ljudteckensnittsfiler (.sf2), kan du helt enkelt ladda riktiga programnamn direkt från .sf2-filen i dialogrutan. Begär bara import som vanligt, och välj därefter .sf2-filen som du använder istället för en .rgd-fil. </para>
+
+ <para
+>Observera att studion bara hanterar information om befintliga MIDI-enheter i Rosegarden. Den hanterar inte uppgifter som att ladda ett ljudteckensnitt till ljudkortet från början. Om du vill försäkra dig om att ett ljudteckensnitt laddas till ljudkortet när Rosegarden startas, ska du använda det speciella alternativet "Ladda ljudsamplingar till Soundblaster-kort vid start" i inställningen av musikbehandlaren under <menuchoice
+><guimenu lang="sv"
+>Inställningar</guimenu
+> <guimenuitem
+>Anpassa Rosegarden...</guimenuitem
+></menuchoice
+>. </para>
+ </sect2>
+
+ <sect2 id="studio-variations">
+ <title
+>Varianter</title>
+
+ <para
+>Vissa MIDI-enheter (till exempel de från Roland) organiserar programnamn på ett sätt som kallas "varianter". För dessa enheter vill man i allmänhet välja ett program genom att först ange ett grundprogramnamn, som ett piano, och därefter ange en av ett antal varianter av programmet, som ett elektriskt piano. Detta skiljer sig från syntar baserad på generell MIDI, som organiserar programmen i banker och förväntar sig att du först väljer en bank och därefter ett program i banken. </para>
+
+ <para
+>Rosegarden kan stödja enheter som använder varianter, men du måste ändå skriva in programnamnen med bankformat. Internt använder enheter med variationer fortfarande styrning med val av MIDI-bank för att välja bland variationerna: Du måste ta reda på om enheten använder mest signifikant eller minst signifikant värde i bankväljaren för att ange variationer, och vilket banknummer som motsvarar vilken variant. Därefter kan du skriva in bankerna som vanligt, och använda alternativet "Visa variantlista baserad på Mest signifikant värde/Minst signifikant värde" i bankdialogrutan för att tala om för Rosegarden att varianter istället för banker ska visas när enheten visas i en instrumentparameterruta. </para>
+ </sect2>
+
+ <sect2 id="studio-midi-import">
+ <title
+>Programavbildning vid &MIDI;-import</title>
+ <para
+>När du importerar en &MIDI;-fil till en komposition, använder &rosegarden; befintlig studioinställning för att avgöra hur &MIDI;-programmen avbildas på &rosegarden;-instrument. Målet är att försäkra att varje &MIDI;-program avbildas på ett instrument som verkligen finns i studion (och alltså verkligen är anslutet till datorn), så att alla &MIDI;-spår kan höras. </para
+><para
+>&MIDI; programändrings- och bankvalshändelserna som hittas i den importerade filen används vid import, men bara som en hjälp att hitta lämpligt instrument för varje &MIDI;-spår bland instrumentuppsättningen i studion. Om studion till exempel för närvarande är inställd att bara innehålla <acronym
+>GM</acronym
+>-instrument, och du importerar en &MIDI;-fil som innehåller <acronym
+>GS</acronym
+>-programändringar, avbildar &rosegarden; <acronym
+>GS</acronym
+>-bankerna tillbaka till <acronym
+>GM</acronym
+> eftersom de är allt som den vet om att du har vid tiden då filen importeras. Den kommer inte ihåg ursprungliga <acronym
+>GS</acronym
+>-programnummer. </para
+><para
+>Det här betyder att du alltid ska försäkra dig om att din studio är riktigt inställd för enheterna som du verkligen har, innan du importerar &MIDI;-filen. Annars kan programdata i &MIDI;-filen gå förlorad. </para>
+ </sect2>
+ </sect1>
+
+ <sect1 id="studio-audio-routing">
+ <title
+>Ljudfördelning</title>
+ <para
+>Alla spår i Rosegarden som tilldelas till ett ljudinstrument eller syntinsticksmodulinstrument blir en del av Rosegardens ljudfördelningsarkitektur. Det finns 16 ljudinstrument och 16 syntinsticksmodulinstrument, och vart och ett av dem har en uppsättning justerbara parametrar som omfattar toningsnivå, panorering, effekter och så vidare. De är i allmänhet inställningsbara i <link linkend="segment-view-instrumentparameterbox"
+>instrumentparameterrutan</link
+> eller <link linkend="studio-audio-mixer"
+>ljudmixern</link
+>. Varje ljudinstrument har också en ingångsanslutning, och både ljudinstrument och syntinsticksmodulinstrument har en utgångsanslutning. </para>
+
+ <para
+>Ett instruments ingångsanslutning definierar varifrån Rosegarden läser ljuddata vid inspelning till instrumentet. Den vanligaste inställningen är en av Rosegardens externa ljudingångar, vars antal kan ställas in i <link linkend="studio-audio-mixer"
+>ljudmixern</link
+>. De motsvarar JACK ljudportar exponerade av Rosegarden, där du kan ansluta utgångar från vilket JACK ljudprogram som helst eller från någon av ljudkortets portar med ett externt JACK fördelningsprogram som <ulink url="http://qjackctl.sf.net/"
+>QJackCtl</ulink
+>. Du kan också ställa in ett instruments ljudingång till en av Rosegardens inbyggda delnivåutgångar eller huvudutgångar för ihopmixningar. </para>
+ <para
+>Ett instruments utgångsanslutning definierar var ljudet tar vägen när det spelas upp. Instrumentens normalinställning är att skicka ljud till Rosegardens huvudutgång, som är en annan extern JACK port (eller ett par portar vid stereo), som därefter kan anslutas genom att använda samma externa JACK fördelningsprogram. Rosegarden stöder dock också upp till åtta interna delutgångsbussar, dit du kan skicka utdata från instrument istället, för att gruppera instrument i samhörande kategorier. Du kan styra antalet och fördelningen av dem i <link linkend="studio-audio-mixer"
+>ljudmixern</link
+>. </para>
+ <para
+>Rosegarden stöder för närvarande effekter med en uppsättning effektplatser som infogas innan toningen för varje ljudinstrument. Du kan ännu inte tilldela effekter till delnivåbussarna, och Rosegarden stöder ännu inte att skicka effekter, även om du kan uppnå liknande resultat genom att använda JACK externa effekter och mixningsarkitektur. </para>
+ <para
+>Några ytterligare detaljer angående inställning av ljudfördelning, mixning och effekter beskrivs i avsnitten <link linkend="studio-audio-mixer"
+> ljudmixern</link
+>, <link linkend="segment-view-instrumentparameterbox"
+>instrumentparameterrutan</link
+> och <link linkend="studio-plugins"
+>ljudinsticksmoduler</link
+>.</para>
+ </sect1>
+
+ <sect1 id="studio-audio-mixer">
+ <title
+>Ljudmixern</title>
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-audiomixer.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase
+>&rosegarden;s ljudmixer</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+
+ <para
+>Rosegardens ljudmixningsfönster, som visas med <menuchoice
+><guimenu lang="sv"
+>Komposition</guimenu
+> <guimenuitem
+>Studio</guimenuitem
+> <guimenuitem
+>Ljudmixer</guimenuitem
+></menuchoice
+>, liknar en ljudmixer i hårdvara och tillhandahåller ett sätt att se och ändra tillståndet för ett antal ljudinstrument på en gång. Den innehåller många likadana knappar som finns i ljud- och syntinsticksmodulernas <link linkend="segment-view-instrumentparameterbox"
+> instrumentparameterrutor</link
+>, där de viktigaste är mätaren av uppspelningsnivå och toningskontroll för varje ljudinstrument och syntinsticksmodulinstrument, samt fördelningskontroll, panorering, mono/stereo och platser för effektinsticksmoduler. </para>
+ <para
+>Ljudmixerfönstret är också platsen där du ser och styr huvudljudnivån (längst till höger i bilden ovan), samt inspelningsnivån (till vänster om huvudtoningen) och delutnivåer. </para>
+ <para
+>Menyn <menuchoice
+><guimenu lang="sv"
+>Inställningar</guimenu
+></menuchoice
+> i ljudmixern är särskilt relevant. Förutom att styra vad som visas i mixerfönstret, innehåller menyn också inställningen av <link linkend="studio-audio-routing"
+>ljudfördelningen</link
+> för antalet ljudinspelningsingångar i stereo som är tillgängliga och för antalet delnivåutgångar. De är studioinställningar som sparas med din Rosegarden formatfil.</para>
+
+ <para
+>Observera att om du i själva verket inte använder några delnivåer (dvs. om det inte finns några instrument som är inställda att skicka sin utsignal till en delnivå) kan du se en liten prestandaförbättring om du uttryckligen ställer in antalet delnivåer till inga, istället för att behålla oanvända i inställningen. </para>
+ </sect1>
+
+ <sect1 id="studio-midi-mixer">
+ <title
+>MIDI-mixern</title>
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-midimixer.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase
+>&rosegarden;s MIDI-mixer</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+ <para
+>Rosegardens MIDI-mixningsfönster, som visas med <menuchoice
+><guimenu lang="sv"
+>Komposition</guimenu
+> <guimenuitem
+>Studio</guimenuitem
+> <guimenuitem
+>MIDI-mixer</guimenuitem
+></menuchoice
+>, tillhandahåller ett sätt att se och redigera <link linkend="segment-view-instrumentparameterbox-midi"
+>instrumentparametervärden</link
+> för ett antal MIDI-instrument på en gång.</para>
+
+ <para
+>Fönstret är organiserat som en ruta med flikar. Längs nederkanten ser du en flik för varje MIDI-uppspelningsenhet i studioinställningen. När en enhetsflik väljes, uppdateras resten av fönstret för att visa knapparna för enhetens 16 instrument. </para>
+
+ <para
+>Knapparna som visas för varje instrument är de som ställts in i hanteringen av styrparametrar, samt volym (som motsvarar ändring av MIDI-volymstyrningen, inte en MIDI-ljudstyrka eller ljudnivå i decibel) och en ungefärlig utnivåindikator. </para>
+ </sect1>
+
+ <sect1 id="studio-plugins">
+ <title
+>Ljudinsticksmoduler</title>
+ <para
+>En ljudinsticksmodul är en programvarumodul, skild från Rosegarden, men som Rosegarden kan ladda och använda för att utföra en viss ljudbehandlingsuppgift. De kan grovt delas upp i effektinsticksmoduler och syntinsticksmoduler. Effektinsticksmoduler tar ljudindata och behandlar det för att skapa annorlunda ljudutdata. Rosegarden använder Linux-standarden LADSPA för effektinsticksmodulernas programmeringsgränssnitt, och DSSI för syntinsticksmodulernas programmeringsgränssnitt, vilket gör det möjligt att använda ett stort antal insticksmoduler med öppen källkod som gjorts tillgängliga av många utvecklare. </para>
+ <para
+>Användning av insticksmoduler ger en kostnad i processortid, eftersom ljudbehandling i realtid oftast kräver en väsentlig mängd arbete till och med med en modern processor. Det ger också en potentiell kostnad i tillförlitlighet: När Rosegarden kör en insticksmodul, och insticksmodulen hänger sig eller kraschar, så gör Rosegarden också det. Många insticksmoduler är mycket tillförlitliga, men det är oundvikligt att vissa inte är så vältestade. </para>
+ <sect2 id="studio-plugins-effects">
+ <title
+>Effektinsticksmoduler</title
+> <para
+>En effektinsticksmodul är något som du kan använda för att ändra en ljudsignal på ett styrbart sätt. Exempel omfattar eko, fördröjningseffekter, dynamisk komprimering och så vidare. </para>
+ <para
+>Varje ljud- eller syntinsticksmodulinstrument i Rosegarden har fem tillhörande effektplatser. Normalt är de tomma, men du kan ladda insticksprogram i dem för att bilda en kedja med upp till fem effekter för ljudsignalen innan den går igenom toningsnivå och panoreringsbehandling.</para>
+
+ <para
+>För att ladda en insticksmodul på en plats, klicka på dess knapp i <link linkend="segment-view-instrumentparameterbox-audio"
+>instrumentparameterrutan</link
+>: </para>
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-pluginbuttons.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase
+>Insticksplatsknappar</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+ <para
+>(Dessa knappar är också alternativt tillgängliga i <link linkend="studio-audio-mixer"
+>ljudmixerns fönster</link
+>.) </para>
+ <para
+>Att klicka på en insticksmodulknapp visar insticksmoduldialogrutan. Den visar tillgängliga effektkategorier i den första menyn. Markera en, så kan du därefter välja insticksmodul i den andra menyn. </para>
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-plugin-dialog.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase
+>En insticksdialogruta i &rosegarden;</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+
+ <para
+>Under menyerna för val av insticksmoduler, har dialogrutan ett varierande antal vridbara rattar som visar alla parametrar som kan ändras för insticksprogrammet du har valt. För att ändra ett värde, klicka bara på en ratt och dra uppåt och neråt, eller vänster och höger. (Uppåt eller åt höger för att öka värdet, neråt eller åt vänster för att minska det.) Du kan också rulla mushjulet för att ändra värdet, eller klicka med musens mittenknapp för att återställa det till det ursprungliga normalvärdet.</para>
+
+ <para
+>Det är också möjligt att kopiera en insticksmodul med sin nuvarande inställning till en annan plats, för att använda samma insticksmodulinställningar för mer än ett instrument, eller för att basera en insticksmodulinställning på en annan. Klicka bara på knappen Kopiera när du har ställt in insticksmodulen som du vill ha den, och öppna därefter dialogrutan för en annan insticksmodulplats och klicka på Klistra in.</para>
+
+ <para
+>Till sist kan du använda åtgärden Förbikoppla för att tillfälligt ta bort en insticksmodul från behandlingen, men ändå behålla dess inställning. </para>
+ </sect2>
+ <sect2 id="studio-plugins-synths">
+ <title
+>Syntinsticksmoduler</title>
+ <para
+>Syntinsticksmoduler kan användas istället för MIDI-enheter i hårdvara eller fristående programvarusyntar, för att skapa ljud från segmenten med tonhändelser.</para>
+
+ <para
+>Att använda en syntinsticksmodul ger dig något bättre kontroll och upprepningsbarhet än att använda en extern MIDI-enhet, eftersom Rosegarden kan ladda rätt insticksmodul åt dig och använda riktiga inställningar nästa gång du laddar samma fil. Insticksmoduler kan också ge bättre tidsupplösning än externa MIDI-enheter, och syntinsticksmodulinstrument har fördelen att vara fördelningsbara som ljudinstrument, vilket också betyder att du kan lägga till effektinsticksmoduler ovanför dem. </para>
+
+ <para
+>För att använda en syntinsticksmodul, <link linkend="segment-view-instruments"
+>tilldela först ett spår</link
+> till ett syntinsticksmodulinstrument, och ladda därefter en syntinsticksmodul genom att klicka på den översta knappen i <link linkend="segment-view-instrumentparameterbox-synth"
+>instrumentparameterrutan</link
+>:</para>
+
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-synthpluginbuttons.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase
+>Syntinsticksmodulknappar</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+
+ <para
+>Det här visar samma insticksmoduldialogruta som visas ovan för effektinsticksmoduler, men med en lista över syntinsticksmoduler istället för effekter. Återigen visas den särskilda uppsättning med vridbara parametrar för synten du har valt. Syntinsticksmoduler kan också ha "program" som kan väljas i en meny. Menyn visas bara om du har valt en synt som stöder det. När du har valt och ställt in en syntinsticksmodul för ett instrument, ska all MIDI-data på spår som tilldelas till det instrumentet spelas via synten, liksom inkommande MIDI-data under inspelning eller övervakning. </para>
+ </sect2>
+
+ <sect2 id="studio-plugins-guis">
+ <title
+>Egna redigeringsfönster i en insticksmodul</title>
+
+ <para
+>De flesta insticksmoduler kan styras helt och hållet med rattarna i Rosegardens insticksmoduldialogruta. Dock har några få insticksmoduler (i allmänhet syntar) också sina egna redigeringsfönster som kan aktiveras eller inaktiveras från Rosegarden, och som kan tillhandahålla fullständigare eller bättre organiserade knappar.</para>
+
+ <para
+>När du väljer en insticksmodul som har sitt eget redigeringsfönster, aktiveras knappen nere till vänster i insticksmodulens dialogruta som heter "Editor":</para>
+
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-plugineditorbutton.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase
+>Redigeringsknappen i en insticksmodul</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+
+ <para
+>(För syntinsticksmoduler finns en liknande knapp i instrumentparameterrutan.) Att klicka på knappen visar insticksmodulens eget redigeringsfönster. Alla ändringar som du gör i redigeringsfönstret ska också synas i Rosegardens egen insticksmoduldialogruta, och ska naturligtvis sparas i din Rosegarden-fil som vanligt.</para>
+ </sect2>
+ </sect1>
+
+ <sect1 id="studio-metronome">
+ <title
+>Metronomer</title>
+ <para
+>Rosegarden har två inbyggda metronomer, en för användning under inspelning och en som kan kopplas in under normal uppspelning. De fungerar genom att skicka toner till ett MIDI-instrument, och båda metronomerna använder samma instrument, tonhöjds- och ljudstyrkeinformation. </para>
+
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-metronome.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase
+>&rosegarden;s inställningsdialogruta för metronom</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+ <para
+>För att ställa in metronomerna, använd <menuchoice
+><guimenu lang="sv"
+>Komposition</guimenu
+> <guimenu lang="sv"
+>Studio</guimenu
+> <guimenuitem
+>Hantera metronom</guimenuitem
+></menuchoice
+> för att visa metronomdialogrutan. Här kan du välja ett MIDI-instrument för metronomen och välja metronomens upplösning (om den ska ticka en gång per taktslag, en gång per underavdelning av ett taktslag, eller bara en gång per takt), tonhöjd och ljudstyrkor. Egenskaper som själva stämman som MIDI-synten använder för metronomens tick beror på instrumentet som väljes, precis som stämman för ett MIDI-spår beror på instrumentet som spåret är tilldelat till. Du kan ställa in instrumentet genom att tilldela ett spår till det i huvudfönstret och välja rätt program från instrumentparameterrutan. </para>
+
+ <para
+>Metronomerna för inspelning och uppspelning kan aktiveras eller inaktiveras från överföringsfönstret genom att använda metronomknappen. Knappen styr inspelningsmetronomen när inspelning är förberedd eller pågår, och annars uppspelningsmetronomen. Normalt är inspelningsmetronomen aktiverad och uppspelningsmetronomen inaktiverad. </para>
+
+ <para
+>Rosegarden har också en "visuell metronom": Överföringsfönstret kan ställas in att blinka starkt för att markera varje taktslag. Se avsnittet om <link linkend="transport"
+>överföringen</link
+> för mer detaljinformation.</para>
+ </sect1>
+
+ <sect1 id="studio-midi-filters">
+ <title
+>MIDI-filter</title>
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-midifilter.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase
+>MIDI-filterdialogrutan</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+
+ <para
+>Genom att använda den här dialogrutan kan du bestämma vilka MIDI-händelser som Rosegarden ignorerar eller accepterar, antingen när händelser skickas vidare med MIDI THRU, eller helt enkelt när de spelas in. Använd kryssrutorna för att tala om för Rosegarden vilka typer av MIDI-händelser som du inte vill skicka vidare eller spela in. </para>
+
+ </sect1>
+
+
+ <sect1 id="studio-external-controllers">
+ <title
+>Externa MIDI-styrenheter</title>
+ <para
+>Rosegardens ljud- och MIDI-mixningsfönster samt huvudfönstret kan också i viss mån styras av en extern MIDI-enhet. För att ställa in det, måste du använda ett ALSA MIDI-anslutningsprogram som qjackctl för att ansluta MIDI-styrenheten till Rosegardens "externa styringång" och MIDI-utgångarna. </para>
+ <para
+>Rosegarden tar emot MIDI-styrändringsmeddelanden för att justera mixerspåret som motsvarar den inkommande MIDI-kanalen vid varje styrenhetshändelse, och skickar också ut MIDI-meddelanden när något ändras i ett mixerspår för att stödja styrenheter med motoriserade skjutreglage eller knappar. </para>
+ <para
+>Rosegarden tar emot MIDI-styrenhet nummer 81 för att ändra fönstret som för närvarande är aktivt. Skicka styrenhet 81 med datavärdet 0-9 för att välja huvudfönstret, 10-19 för att välja ljudmixerfönstret eller 20-29 för att välja MIDI-mixerfönstret.</para>
+ <para
+>Rosegarden tar emot MIDI-styrenhet nummer 82 för att ändra spår som för närvarande är markerat i huvudfönstret. Stegningen av styrenheten beror på antal spår i fönstret: förhållandet mellan styrenhetens datavärde till spårnummer beräknas så att det fullständiga dataintervallet i MIDI-styrenheten används, under förutsättning att det inte finns mer än 128 spår i fönstret.</para>
+ </sect1>
+
+ </chapter>
+
+
+ <chapter id="segment-instrument-parameters">
+ <title
+>Segment- och instrumentparametrar</title>
+
+ <sect1 id="segment-view-segmentparameterbox">
+ <title
+>Segmentparameterrutan</title>
+
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-segmentparameterbox.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase
+>&rosegarden;s segmentparameterruta</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+
+ <para
+>Segmentparameterrutan hör hemma till vänster i Rosegardens huvudfönster. (Om du inte kan se den, försök använda <menuchoice
+><guimenu lang="sv"
+>Inställningar</guimenu
+> <guimenuitem
+>Visa segment- och instrumentparametrar</guimenuitem
+></menuchoice
+>.) Den låter dig ändra vissa aspekter av markerade segment.</para
+><para
+>Om ett enstaka segment för närvarande är markerat, visas dess parametrar i segmentparameterrutan och kan redigeras där. Om flera segment är markerade, visar parameterrutan bara nuvarande värden där de är samma för alla markerade segment, men du kan fortfarande redigera dem och ändringarna gäller för allt som är markerat. <variablelist>
+ <varlistentry>
+ <term
+>Namn</term>
+ <listitem>
+ <para
+>Visar namnet på det markerade segmentet (eller segmenten, om alla har samma namn). Klicka på knappen "..." för att redigera namnet.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>Upprepa</term>
+ <listitem>
+ <para
+>Stänger av eller sätter på upprepning för markerade segment. Ett upprepande segment upprepas till efterföljande segment börjar i samma spår, eller till kompositionens slut om det inte finns något efterföljande segment.</para>
+
+ <para
+>Upprepade delar av ett upprepande segment visas med en svagare färg på huvudduken än det ursprungliga segmentet. Du kan ändra dem till riktiga redigerbara kopior av det ursprungliga segmentet genom att antingen använda <menuchoice
+><guimenu lang="sv"
+>Segment</guimenu
+> <guimenuitem
+>Omvandla upprepningar till kopior</guimenuitem
+></menuchoice
+>, eller genom att helt enkelt dubbelklicka på enskilda upprepade block.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>Kvantisera</term>
+ <listitem>
+ <para
+>Visar kvantiseringsinställningen för markerade segment. Du kan ändra den för att snabbt kvantisera starttider för alla deras toner. För mer avancerad kvantisering, använd <menuchoice
+> <guimenu lang="sv"
+>Segment</guimenu
+> <guimenuitem
+>Kvantisera...</guimenuitem
+> </menuchoice
+>. Se <link linkend="quantization"
+>Kvantisering</link
+> för mer detaljinformation. </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>Transponera</term>
+ <listitem>
+ <para
+>Visar transponeringen (i halvtonssteg) som för närvarande används för det markerade segmentet. Transponeringen utförs när segmentet spelas upp, och visas inte med noterna i matris-, not- eller händelseeditorerna. Du kan använda den för att snabbt ändra tonhöjd för en del eller hela kompositionen.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>Fördröjning</term>
+ <listitem>
+ <para
+>Visar fördröjningen som för närvarande gäller för markerade segment. Du kan ställa in en fördröjning här för att göra att ett helt segment spelas upp senare än skrivet. Fördröjningen utförs när segmentet spelas upp, och visas inte med noterna i matris-, not- eller händelseeditorerna. </para>
+ <para
+>Du kan antingen ange en fördröjning med metronomtid (genom att välja notvärde i fördröjningskombinationsrutan), då fördröjningens exakta tid beror på tempot, eller med klocktid (genom att välja tiden i millisekunder i kombinationsrutan). </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>Färg</term>
+ <listitem>
+ <para
+>Visar färgen som används för att visa markerade segment. Du kan välja en annan färg i kombinationsrutan, eller välja alternativet "Lägg till ny färg" om du vill ha en färg som inte finns i kombinationsrutan. </para>
+ <para
+>Du kan också hantera och byta namn på färger genom att använda <menuchoice
+><guimenu lang="sv"
+>Komposition</guimenu
+> <guimenuitem
+>Redigera dokumentegenskaper...</guimenuitem
+></menuchoice
+> (och därefter välja sidan Färg i dialogrutan med dokumentegenskaper). Den ändrade färgpaletten sparas med kompositionen i Rosegarden-filen. <screenshot
+> <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-colours.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase
+>&rosegarden;s färghantering</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+ </listitem>
+ </varlistentry>
+
+ </variablelist>
+ </para>
+ </sect1>
+
+ <sect1 id="segment-view-instrumentparameterbox">
+ <title
+>Instrumentparameterrutan</title>
+ <para
+>Instrumentparameterrutan finns i nedre vänstra hörnet av Rosegardens huvudfönster, nedanför <link linkend="segment-view-segmentparameterbox"
+>segmentparameterrutan</link
+>. (Om du inte kan se den, försök använda <menuchoice
+><guimenu lang="sv"
+>Inställningar</guimenu
+> <guimenuitem
+>Visa segment- och instrumentparametrar</guimenuitem
+></menuchoice
+>.)</para>
+
+ <para
+>Den visar vilka instrument som tilldelats nuvarande markerat spår, och innehåller alla redigerbara knapparna för instrumentet. Kom ihåg att eftersom hur många spår som helst kan tilldelas till samma instrument, kan inställningarna i rutan påverka mer än ett spår åt gången.</para>
+
+ <para
+>Utseendet och innehållet i instrumentparameterrutan beror på instrumenttypen: MIDI, ljud eller syntinsticksmodul. </para>
+
+ <sect2 id="segment-view-instrumentparameterbox-midi">
+ <title
+>MIDI-instrumentparametrar</title>
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-ipb-midi.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase
+>&rosegarden;s instrumentparameterruta för ett MIDI-instrument</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+ <para
+>När du markerar ett spår som är tilldelat till ett MIDI-instrument, visar instrumentparameterrutan MIDI-parametrar. </para>
+ <para
+>Längst upp visar rutan instrumentets namn och anslutningen som dess enhet använder. </para>
+ <para
+>Därunder kan du se och redigera MIDI-kanalnumret och inställningar av <link linkend="studio-bank-editor"
+>bank och program</link
+> som ska skickas till instrumentet vid uppspelningens start (inklusive kryssrutan "Slagverk" som styr om bara slagverksprogram ska erbjudas i inställningarna).</para>
+
+ <para
+>Till sist visar rutan tillgängliga styrenheter för enheten (de för en generell MIDI-enhet visas ovan). Alla inställningar som du gör här skickas till instrumentets kanal vid uppspelningens start.</para>
+ </sect2>
+
+ <sect2 id="segment-view-instrumentparameterbox-audio">
+ <title
+>Ljudinstrumentparametrar</title>
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-ipb-audio.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase
+>&rosegarden;s instrumentparameterruta för ett ljudinstrument</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+ <para
+>När du markerar ett ljudspår, visar instrumentparameterrutan ljudparametrar. </para>
+ <para
+>Rutan har två huvudtoningar, en omgiven av blått för uppspelning och den andra omgiven av rött för inspelningsnivå vid inspelning till instrumentet. Mellan dem finns en mätare av uppspelningsnivå. </para>
+ <para
+>De två menyerna längst upp i rutan används för att välja ingångs- och utgångsfördelning för instrumentet. Under dem kan du välja om instrumentet är mono eller stereo, och panoreringsinställning för plats i stereofältet. (Ljudinstrument är alltid till sist stereo, eftersom panoreringsinställningen alltid tillämpas. Men om du ställer in instrumentet till mono, reduceras all ljuddata och effektutdata till mono innan panoreringen tillämpas.) </para>
+ <para
+>Kolumnen med fem knappar längst ner till vänster är effektplatserna. Klicka på dem för att välja och aktivera insticksmoduler för ljudinstrumentet, och för att styra dem med redigeringsdialogrutan för insticksmoduler. Detta är infogade effekter, som utförs i ordning uppifrån och ner innan toning och panorering. </para>
+ </sect2>
+
+ <sect2 id="segment-view-instrumentparameterbox-synth">
+ <title
+>Instrumentparametrar för syntinsticksmoduler</title>
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-ipb-synth.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase
+>&rosegarden;s instrumentparameterruta för ett syntinsticksmodulinstrument</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+ <para
+>När du markerar ett spår som är tilldelat till ett syntinsticksmodulinstrument, visar instrumentparameterrutan syntparametrar. Du märker att även om en syntinsticksmodul använder segment med MIDI-data, så beter den sig mer som ett ljudspår när det gäller styrning och fördelning. </para>
+ <para
+>Den viktigaste knappen här är den längst upp till vänster (som lyder Xsynth i bilen ovan), som visar namnet på syntinsticksmodulen som används för instrumentet. Klicka på den för att välja en viss synt och styra den i Rosegardens vanliga redigeringsdialog för insticksmoduler. När du väl har valt en insticksmodul, kanske du också kan klicka på redigeringsknappen nedanför för att öppna en dedicerad grafisk editor för den särskilda insticksmodulen (om insticksmodulen har någon). </para>
+ <para
+>Återstående knappar här är samma som för ljudinstrument: Uppspelningstoning, uppspelningsnivå, utgångsfördelning, mono/stereo, panoreringsinställningar och effektplatser är alla exakt likadana.</para>
+ </sect2>
+
+ </sect1>
+ </chapter>
+
+ <chapter id="quantization">
+ <title
+>Kvantisering</title>
+ <para
+>"Kvantisering" är processen att flytta toner och andra händelser så att de börjar eller avslutas på exakta taktdelar. Det används traditionellt för att göra ett ungefärligt utförande till ett precist men som låter ganska mekaniskt, antingen på grund av att precision är önskad effekt, eller på grund av orsaker som att göra noter tydligare i notering. </para>
+
+ <para
+>För allmän kvantisering, använd <menuchoice
+><guimenu lang="sv"
+>Segment</guimenu
+> <guimenuitem
+>Kvantisera</guimenuitem
+></menuchoice
+> i huvudfönstret eller <menuchoice
+><guimenu lang="sv"
+>Justera</guimenu
+> <guimenuitem
+>Kvantisera</guimenuitem
+></menuchoice
+> i matriseditorn eller notbehandlarna. Det visar en dialogruta där du kan välja precis de kvantiseringsparametrarna du behöver, och tillämpar dem på alla markerade segment eller toner. (Du kan också snabbt nå dialogrutan genom att trycka på tangenten "=".) </para>
+
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-gridquantizer.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase
+>&rosegarden;s kvantiseringsdialogruta</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+
+ <para
+>Kvantiseringsdialogrutan erbjuder ett urval kvantiseringsmetoder, var och en med sin egen uppsättning parametrar. Tillgängliga kvantiseringsmetoder är: </para>
+ <variablelist>
+
+ <varlistentry>
+ <term
+>Rutnätskvantisering</term>
+ <listitem>
+ <para
+>Rutnätskvantiseringen flyttar starttider för toner så att de börjar på den närmaste punkten i ett rutnät (definierat av de olika parametrarna för kvantiseringen). På så sätt justeras toner som ursprungligen varierar något i starttid av kvantiseringen, vilket ger ett mer precist och mekaniskt utförande. </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>Legato-kvantisering</term>
+ <listitem>
+ <para
+>Legato-kvantiseringen utför en enkel rutnätskvantisering, och justerar också notvärdena så att eventuella avstånd mellan tonerna tas bort genom att förlänga varje not så att den (åtminstone) fortsätter till början på nästa. Du kan också få denna legato-effekt utan tillhörande rutnätskvantisering med funktionen <menuchoice
+><guimenu lang="sv"
+>Justera</guimenu
+> <guimenuitem
+>Kvantisera</guimenuitem
+> <guimenuitem
+>Legato</guimenuitem
+></menuchoice
+> i matriseditorn. </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>Heuristisk kvantisering</term>
+ <listitem>
+ <para
+>Kvantiseringen försöker justera starttider och notvärden för toner så att en läsbar notering skapas. Se <link linkend="nv-quantization"
+>Notskrift från utförandedata</link
+> för en beskrivning av kvantiseringen och dess användning.</para>
+ </listitem>
+ </varlistentry>
+
+ </variablelist>
+
+ <para
+>Rutnätskvantiseringen har följande justerbara parametrar:</para>
+ <variablelist>
+
+ <varlistentry>
+ <term
+>Grundenhet för rutnät</term>
+ <listitem>
+ <para
+>Det här är storleken på rutnätet som används för kvantiseringen. </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>Svaj</term>
+ <listitem>
+ <para
+>Det här är ett procenttal som justerar graden som alternerande taktslag kvantiseras "sent".</para>
+ <para
+>Om inställt till inget (förvalt värde), görs kvantiseringen till ett jämt rutnät med avstånd enligt grundenheten för rutnätet.</para>
+ <para
+>Om inställd till 100 %, placeras varannan rutnätslinje två tredjedelar av avståndet mellan föregående och nästa, istället för halvvägs. Det gör att toner kvantiseras till första och tredje triolen med en svajig takt. </para>
+ <para
+>Övriga inställningar ger proportionellt varierande grad av svaj. Du kan också ställa in parametern till negativa värden (för att omväxlande taktslag ska börja tidigare) eller till värden större än 100 %.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>Itereringsvärde</term>
+ <listitem>
+ <para
+>Rutnätskvantiseringens normalbeteende är att exakt flytta varje not till den närmaste rutnätslinjen, men om du ställer in iterationsgränsen till något som är mindre än 100 % (normalvärdet "Fullständig kvantisering") flyttas varje not bara den procentandelen av avståndet till närmaste rutnätslinje, vilket resulterar i en kvantiseringseffekt som nästan utförs, men inte helt och hållet.</para>
+ <para
+>Kvantiseringen kan utföras upprepade gånger, för att pröva gradvis ökande kvantiseringsgrader, därav namnet "iterativ". Använd <menuchoice
+><guimenu lang="sv"
+>Justera</guimenu
+> <guimenuitem
+>Kvantisera</guimenuitem
+> <guimenuitem
+>Upprepa senaste kvantisering</guimenuitem
+></menuchoice
+> i matriseditorn för att göra det. </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>Kvantisera både notvärden och starttider</term>
+ <listitem>
+ <para
+>Om det här alternativet är aktiverat, kvantiseras tonernas sluttider till samma rutnät som deras starttider. </para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ <para
+>Kvantiseringsdialogrutan har också en valfri avancerad sektion som innehåller ytterligare alternativ för <link linkend="nv-quantization"
+>kvantisering</link
+>. </para>
+
+ <para
+>Ett annat enkelt sätt att utföra en rutnätskvantisering är att göra den i huvudfönstret med menyn <guimenuitem
+>Kvantisera</guimenuitem
+> i <link linkend="segment-view-segmentparameterbox"
+>segmentparameterrutan</link
+>. Om du markerar några segment och ändrar värdet som visas i menyn, blir segmenten omedelbart rutnätskvantiserade till upplösningen som visas i menyn. </para>
+
+ <para
+>Till sist finns också en <link linkend="matrix-grid-quantize"
+>styrning av kvantisering</link
+> i matrisvyn.</para>
+
+ </chapter>
+
+ <chapter id="matrix-view">
+ <title
+>Matriseditorn</title>
+ <para
+>&rosegarden;s matriseditor låter dig visa och redigera musik med ett enkelt logiskt format: Varje not representeras som ett block i ett rutnät, på en plats som motsvarar tonhöjden. </para>
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-matrixview.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase
+>&rosegarden;s matriseditor</phrase>
+ </textobject>
+ </mediaobject>
+</screenshot
+> Varje fönster i matriseditorn visar ett enstaka segment. För att redigera ett segment, högerklicka bara på det på huvudduken och välj matriseditorn i menyn. Alternativt kan du ställa in Rosegarden att göra matriseditorn till standardvy som är tillgänglig genom att dubbelklicka på ett segment. </para>
+
+ <sect1 id="matrix-grid-quantize">
+ <title
+>Styrning av rutnät och kvantisering</title>
+ <para
+>Matrisvyn innehåller menyerna Rutnät och Kvantisering i huvudmenyraden. </para>
+ <para
+>Rutnätsmenyn styr det synliga rutnätets storlek i matrisvyns bakgrund, samt tidsupplösningen som används när noter skrivs in och flyttas. Efter du har ställt in det till ett visst tidsvärde, låses de normala åtgärderna för att infoga och dra noter automatiskt till rutnätspunkter åtskilda med det tidsvärdets bredd. Du kan överskrida positioneringsfunktionen tillfälligt genom att hålla nere Skift under redigeringen, eller inaktivera den genom att ställa in rutnätsmenyn till Ingen låsning. </para>
+ <para
+>Kvantiseringsmenyn fungerar på ett ganska annorlunda sätt. I stället för att styra beteendet hos andra redigeringsverktyg, utför den verkligen en åtgärd. När du ändrar värde i menyn, blir de markerade noterna, eller hela segmentet om ingenting är markerat, omedelbart kvantiserade av en rutnätskvantisering med vald upplösning. </para>
+ <para
+>Kvantiseringsmenyn visar också kontinuerligt vilken upplösning som det nuvarande segmentet eller markeringen är kvantiserad med. Om du till exempel markerar en uppsättning noter som börjar på efterföljande kvartsnotstaktslag, uppdateras kvantiseringsmenyn så att 1/4 visas, eftersom det är den grövsta upplösningen som motsvarar den befintliga kvantiseringen av nuvarande markering. </para>
+ </sect1>
+
+ <sect1 id="matrix-insertion">
+ <title
+>Infoga noter</title>
+ <para
+>Det enklaste sättet att mata in en not i matrisvyn är att använda musen. För att göra det, välj pennverktyget i verktygsraden, klicka och dra därefter i matriseditorn. Noten matas in vid tiden och med tonhöjden som motsvarar punkten du klickar, och har ett notvärde som motsvarar avståndet du drar innan du släpper musknappen.</para>
+
+ <para
+>Normalt är tiden och notvärdet låsta till en viss rutnätsenhet enligt rutnätsinställningarna i menyn Visa eller verktygsraden. Du kan förhindra effekten genom att hålla nere Skift medan du klickar och drar. </para>
+
+ <sect2 id="matrix-insertion-keyboard">
+ <title
+>Skriva in noter med datorns tangentbord</title>
+
+ <sect3>
+ <title
+>Notvärde</title>
+
+ <para
+>Notvärden för noter som matas in via tangentbordet styrs av rutnätsinställningarna i menyn Visa eller verktygsraden . Du kan ställa in det genom att använda de numeriska tangenterna:</para>
+
+ <itemizedlist>
+ <listitem
+><para
+><keycap
+>5</keycap
+> &ndash; Hel takt</para
+></listitem>
+ <listitem
+><para
+><keycap
+>1</keycap
+> &ndash; Takt</para
+></listitem>
+ <listitem
+><para
+><keycap
+>2</keycap
+> &ndash; Halvnot</para
+></listitem>
+ <listitem
+><para
+><keycap
+>4</keycap
+> &ndash; Kvartsnot</para
+></listitem>
+ <listitem
+><para
+><keycap
+>8</keycap
+> &ndash; Åttondedelsnot</para
+></listitem>
+ <listitem
+><para
+><keycap
+>6</keycap
+> &ndash; Sextondedelsnot</para
+></listitem>
+ <listitem
+><para
+><keycap
+>3</keycap
+> &ndash; Trettioandredelsnot</para
+></listitem>
+ <listitem
+><para
+><keycap
+>0</keycap
+> &ndash; Sextifjärdedelsnot</para
+></listitem>
+ </itemizedlist>
+
+ </sect3>
+
+ <sect3>
+ <title
+>Tonhöjd</title>
+
+ <para
+>Så fort rätt notvärde är vald i rutnätsmenyn kan du infoga en not på <link linkend="nv-rulers"
+>infogningsmarkörens</link
+> aktuella position genom att trycka på en av tonhöjdstangenterna:</para>
+
+ <itemizedlist>
+ <listitem
+><para
+><keycap
+>A</keycap
+> &ndash; C (Do, tonikan i aktuell tonart för aktuell klav) </para
+></listitem>
+ <listitem
+><para
+><keycap
+>S</keycap
+> &ndash; D (Re)</para
+></listitem>
+ <listitem
+><para
+><keycap
+>D</keycap
+> &ndash; E (Mi)</para
+></listitem>
+ <listitem
+><para
+><keycap
+>F</keycap
+> &ndash; F (Fa)</para
+></listitem>
+ <listitem
+><para
+><keycap
+>J</keycap
+> &ndash; G (So)</para
+></listitem>
+ <listitem
+><para
+><keycap
+>K</keycap
+> &ndash; A (La)</para
+></listitem>
+ <listitem
+><para
+><keycap
+>L</keycap
+> &ndash; H (Ti)</para
+></listitem>
+ </itemizedlist>
+
+ <para
+>Genom att hålla nere <keycap
+>Skift</keycap
+> när en tangent trycks, fås en upphöjd not (utom för E och H som inte har upphöjda versioner) och genom att hålla nere <keycap
+>Skift</keycap
+> och <keycap
+>Ctrl</keycap
+> tillsammans fås en nersänkt not (utom för F och C).</para>
+
+ <para
+>För att skriva in noter en oktav högre,använd motsvarande tangenter på nästa rad ovanför: <keycap
+>Q</keycap
+>, <keycap
+>W</keycap
+>, <keycap
+>E</keycap
+>, <keycap
+>R</keycap
+>, <keycap
+>U</keycap
+>, <keycap
+>I</keycap
+> och <keycap
+>O</keycap
+>. På motsvarande sätt, för att lägga till noter en oktav lägre, använd <keycap
+>Z</keycap
+>, <keycap
+>X</keycap
+>, <keycap
+>C</keycap
+>, <keycap
+>V</keycap
+>, <keycap
+>B</keycap
+>, <keycap
+>N</keycap
+> och <keycap
+>M</keycap
+>.</para>
+
+ </sect3>
+
+ <sect3>
+ <title
+>Övriga anmärkningar</title>
+
+ <para
+>Alla infogningskommandon är också tillgängliga från en undermeny i menyn Verktyg. Det är inte troligt att du någonsin vill navigera i menyn bara för att infoga en enstaka not, men menyerna visar snabbtangenterna och tillhandahåller på så sätt en användbar referens om du skulle glömma vilken tangent som gör vad.</para>
+
+ <para
+>Snabbtangenterna är för närvarande gjorda för att användas med tangentbord som har QWERTY-organisation. Det finns ännu inte något sätt att ändra snabbtangenter till en annan organisation, förutom att individuellt ändra tilldelning av varje tangent med <menuchoice
+><guimenu lang="sv"
+>Inställningar</guimenu
+> <guimenuitem
+>Anpassa genvägar...</guimenuitem
+></menuchoice
+>.</para>
+
+ </sect3>
+
+ </sect2>
+
+ <sect2 id="matrix-insertion-midi">
+ <title
+>Skriva in noter genom att använda ett MIDI-keyboard</title>
+
+ <para
+>Du kan lägga till noter i matriseditorn en i taget med ett MIDI-keyboard eller en annan MIDI-styrenhet. Matriseditorn använder tonhöjden du spelar på ett keyboard, men de notvärden du har valt i editorns egna rutnätsinställningar. Det är känt som "stegvis inspelning". </para>
+
+ <para
+>För att börja mata in noter från ett MIDI-keyboard, försäkra dig först om att det är inställt som förvald MIDI-inspelningsenhet. Försäkra dig därefter om att du har rätt rutnätsinställning i menyn Visa eller på verktygsraden, eftersom det styr notvärdena. Tryck därefter på knappen för stegvis inspelning i matriseditorns verktygsrad, eller välj Stegvis inspelning i menyn Verktyg. Från detta ögonblick infogas alla toner som du spelar på ditt MIDI-keyboard vid den nuvarande inmatningstiden i fönstret, ända till stegvis inspelning stängs av igen, aktiveras i ett annat fönster eller fönstret stängs. </para>
+
+ <para
+>Du kan ändra rutnätsinställningar medan stegvis inspelning pågår, för att infoga noter med olika notvärden. </para>
+ </sect2>
+ </sect1>
+
+ <sect1 id="matrix-selection">
+ <title
+>Markera noter</title
+> <para
+>För att markera noter i matriseditorn, byt till markeringsverktyget (pilen) och rita upp ett rektangulärt område som innehåller noterna du vill markera. Markerade händelser färgläggs då i blått. Om du istället klickar på en enstaka händelse, markeras bara den händelsen. </para
+><para
+>Om du håller nere <keycap
+>Skift</keycap
+> medan du ritar upp en rektangel eller klickar på en not, läggs den nya markeringen till i en eventuell befintlig markering istället för att ersätta den. </para>
+
+ <para
+>För att rensa en markering, klicka på ett tomt område i matriseditorn eller tryck på Esc-tangenten.</para>
+
+ <para
+>Du kan också markera alla noter av en viss tonhöjd genom att skift-klicka på en tangent på pianoklaviaturen längs vänster sida i matriseditorn. Du kan också skift-klicka och dra för att markera en uppsättning tonhöjder. Markeringen läggs till i en eventuell befintlig markering, så om du vill ha en helt ny markering, avmarkera först den föregående. </para>
+ </sect1>
+
+ <sect1 id="matrix-editing">
+ <title
+>Flytta och kopiera noter</title>
+ <para
+>Du kan flytta noter både i tid och tonhöjd i matriseditorn genom att antingen klicka och dra dem med förflyttningsverktyget, eller markera dem och därefter dra dem med markeringsverktyget. </para>
+ <para
+>För att kopiera noter, markera dem och använd därefter de vanliga funktionerna kopiera och klistra in. Efter de har klistrats in är de inklistrade noterna markerade istället, och du kan dra dem var du än vill ha dem. </para>
+ </sect1>
+
+ </chapter>
+
+ <chapter id="percussion-matrix-view">
+ <title
+>Slagverksmatriseditorn</title>
+
+ <para
+>Slagverksmatriseditorn är identisk med <link linkend="matrix-view"
+>matriseditorn</link
+>, förutom att den visar tonhöjdsnamn på den vertikala skalan istället för pianotangenter, och att den inte visar notvärdet för varje not. Den är avsedd för användning med slagverksprogram i MIDI-instrument, där varje tonhöjd spelar ett annorlunda slagverksljud.</para>
+
+ <para
+>Se också <link linkend="studio-keymappings"
+>Tonavbildningar för slagverk</link
+>.</para>
+ </chapter>
+
+ <chapter id="notation-view">
+ <title
+>Notbehandlaren</title>
+
+ <!-- Introduction, purpose -->
+
+ <sect1 id="nv-introduction">
+ <title
+>Inledning</title>
+
+ <para
+>&rosegarden;s notbehandlare gör det möjligt att visa och redigera ett eller flera notsystem med traditionell partiturnotation. </para
+><para>
+
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-notationview.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase
+>&rosegarden;s notbehandlare</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+ <para
+>&rosegarden; försöker presentera partitur med bästa möjliga utläggning givet dess huvudsakliga fokus som en musikbehandlare. Det betyder att även om editorn stöder ackord, överlappande och nästlade balkgrupper, trioler och godtyckliga annandelningar, prydnadsnoter, dynamik, accenter, text och så vidare, tillhandahåller den inte så mycket detaljkontroll över utläggningen (särskilt i musik med kontrapunkt) som särskilda program för redigering av partitur kan göra. &rosegarden; har inte som mål att skapa partitur av typsättningskvalitet, även om Lilypond-filer kan exporteras, vilka kan utgöra en bra grund för typsättning. </para>
+ </sect1>
+
+ <!-- Single and multiple staffs, and "current staff" -->
+
+ <sect1 id="nv-staffs">
+ <title
+>Enkla och flera notsystem</title>
+
+ <para
+>Det finns tre sätt att öppna en notbehandlare i &rosegarden;s huvudfönster. (Alla kräver att du först har ett befintligt segment i huvudfönstret, så om du påbörjar en ny komposition, bör du skapa dina segment innan du börjar fundera på hur de ska redigeras.) <variablelist>
+
+ <varlistentry>
+ <term
+>Dubbelklicka på segment</term>
+ <listitem>
+
+ <para
+>Det mest uppenbara sättet är att dubbelklicka på ett segment på huvudduken. Det öppnar segmentet i den editor som du har ställt in som standardvy (not, matris eller händelselista), som normalt är notbehandlaren. Alltså öppnas ett segment som ett enskilt notsystem i notbehandlarens fönster genom att dubbelklicka på det.</para>
+
+ <para
+>Du kan också öppna en editor med flera notsystem på följande sätt: Håll nere Skift-tangenten, markera (med ett enda musklick) alla segment i huvudvyn som du vill öppna, men dubbelklicka på det sista. Alla markerade segment öppnas då tillsammans i ett enda fönster i notbehandlaren.</para>
+
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>Funktionen Öppna i standardvy (returtangenten)</term>
+ <listitem>
+
+ <para
+>Returtangenten är en snabbtangent för menyfunktionen att öppna i standardvyn, som gör i stort sett samma sak som att dubbelklicka: Den öppnar alla segment som för närvarande är markerade i notbehandlaren, eller i någon annan editor som du har ställt in som standardvy. </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>Menyfunktionerna Öppna i notbehandlare</term>
+ <listitem>
+
+ <para
+>Som ett alternativ kan du använda huvudfönstrets menyalternativ Öppna i notbehandlare, antingen i menyn Segment eller i menyn som visas med höger musknapp över ett segment på duken. Markera segmenten du vill redigera (genom att skift-klicka som ovan, eller genom att använda alternativet Markera alla segment) och välj därefter Öppna i notbehandlare.</para>
+ </listitem>
+
+ </varlistentry>
+ </variablelist>
+
+ </para>
+
+ <para
+>Om du har mer än ett notsystem (dvs. segment) synligt i notbehandlaren kan bara ett av dem vara "aktuellt" på en gång. Det aktuella notsystemet kan urskiljas eftersom infogningsmarkören visas i det (se <link linkend="nv-rulers"
+>Linjaler och markörer</link
+>), och det är notsystemet där alla redigeringsåtgärder som använder infogningsmarkören äger rum. Det översta notsystemet är normalt det aktuella, men du kan byta till ett annat notsystem genom att Ctrl-klicka på det eller genom att använda menyalternativen Markör upp notsystem och Markör ner notsystem. </para>
+
+ </sect1>
+
+ <!-- Linear and page layouts -->
+
+ <sect1 id="nv-layout">
+ <title
+>Horisontell och sidbaserad utläggning</title>
+
+ <para
+>Det vanliga sättet som notbehandlaren visar notsystem är känt som horisontell utläggning: Notsystem ovanför varandra, med varje notsystem som en enda, horisontell rullande lång rad. Vissa funktioner i editorn (som <link linkend="nv-rulers"
+>linjalerna</link
+>) är bara tillgängliga med horisontell utläggning. </para>
+
+ <para
+>Du kan dock också visa notsystem med två olika sidbaserade utläggningar: Vertikal utläggning eller Sidutläggning.</para>
+
+ <para
+>I vertikal utläggning visas noteringen på en oändligt hög sida med samma bredd som fönstret. Varje notsystem bryts vid radens slut, och påbörjar en ny rad under återstående notsystem.</para>
+
+ <para
+>I sidutläggning visas noteringen uppdelad på riktiga sidor i stort sett som den ser ut när den skrivs ut. Varje sidas storlek beräknas så att ungefär samma antal noter får plats på varje rad som när det verkligen skrivs ut (enligt punktstorleken som anges för utskriftsupplösningen i inställningsdialogrutan). Den utskrivna versionen är troligen inte precis likadan, eftersom det beror på den exakta pappersstorleken och marginalerna som används vid utskrift, men det bör vara ganska nära om du råkar använda A4-papper.</para>
+
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-notationview-multipage.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase
+>&rosegarden;s notbehandlare med sidutläggning</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para
+><para
+>De flesta, men inte alla, av visnings- och redigeringsfunktionerna fungerar lika bra i sidutläggningslägena som i horisontell utläggning. </para>
+
+ <para
+>För att byta mellan utläggningslägen, använd menyalternativen Horisontell utläggning, Vertikal utläggning och Sidutläggning. </para>
+ </sect1>
+
+ <!-- Rulers and Cursors -->
+
+ <sect1 id="nv-rulers">
+ <title
+>Linjaler och markörer</title>
+
+ <para
+>&rosegarden;s notredigeringsfönster innehåller två linjaler och två markörer. Linjalerna är de horisontella raderna uppdelade med graderingar längst upp och längst ner på huvudnoteringsduken, och markörerna är de färgade vertikala linjerna som ursprungligen visas i början av det översta notsystemet i editorn. </para>
+
+ <para
+>Den violetta markören är infogningsmarkören. Den visar platsen där åtgärder som infoga och klistra in utförs. Du kan flytta infogningsmarkören genom att klicka eller dra på den övre linjalen, eller genom att klicka med markeringsverktyget på en tom del av notsystemet (och undvika alla händelser), eller genom att klicka var som helst med <keycap
+>Ctrl</keycap
+> intryckt. </para>
+
+ <para
+>Du kan också använda vänster och höger piltangenter för att flytta infogningsmarkören en händelse i taget. Om du håller nere <keycap
+>Ctrl</keycap
+> medan piltangenterna trycks, flyttas markören en hel takt åt gången. Om du håller nere Skift, <link linkend="nv-tools-selections"
+>markeras händelserna</link
+> medan markören rör sig över dem. </para>
+
+ <para
+>Den blåa markören är uppspelningsmarkören. Precis som liknande markörer i huvudfönstret och matrisvyn, visar den platsen för nuvarande uppspelning eller inspelning. Den kan förflyttas genom att använda linjalen längst ner. </para>
+
+ <para
+>Observera att linjalerna bara visas i läget <link linkend="nv-layout"
+>Horisontell utläggning</link
+>. </para>
+
+ </sect1>
+
+ <!-- Display conventions (annotated picture with some selected notes,
+ some quantized notes, a bar of incorrect length etc) -->
+
+ <!-- Tools and Selections -->
+
+ <sect1 id="nv-tools-selections">
+ <title
+>Verktyg och markeringar</title>
+ <para
+>De flesta redigeringsfunktioner i menyer och verktygsrader i &rosegarden;s notbehandlare ingår i en av tre kategorier: <quote
+>verktyg</quote
+>, <quote
+>funktioner som arbetar med markeringar</quote
+> och <quote
+>dragåtgärder</quote
+>. </para>
+
+ <variablelist>
+ <varlistentry>
+ <term
+>Verktyg</term>
+ <listitem>
+ <para
+>De grundläggande verktygen är markeringsverktyget, borttagningsverktyget och de som används för att infoga noter, pauser, text och så vidare, vilka oftast väljes med knappar i verktygsraden. Att välja ett verktyg ändrar det normala beteendet hos musknapparna på huvudnoteringsduken, åtminstone till ett annat verktyg väljes istället. Genom att till exempel välja markeringsverktyget kan du göra markeringar och på så sätt använda de markeringsbaserade funktionerna (nedan). Genom att välja ett infogningsverktyg (som en av noterna) ändras det grafiska gränssnittets beteende så att noter infogas genom att klicka på duken. Genom att välja borttagningsverktyget gör att du kan ta bort händelser genom att klicka på dem. </para>
+ <para
+>Du kan också byta aktuellt verktyg med menyn Verktyg. </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>Funktioner som arbetar med markeringar</term>
+ <listitem>
+ <para
+>Flertalet återstående menyalternativen kräver att en markering görs på duken innan de kan användas. Vissa av dem (såsom alternativen <guimenuitem
+>Klipp ut</guimenuitem
+> eller <guimenuitem
+>Notstil</guimenuitem
+>) fungerar på alla händelser som markerats. Andra (såsom <guimenuitem
+>Prydnadsnot</guimenuitem
+> eller <guimenuitem
+>Skaftriktning</guimenuitem
+>) vägrar fungera om inte markeringen innehåller några noter. </para>
+ <para
+>För att markera några händelser på duken, byt till markeringsverktyget (pilen) och rita därefter upp ett rektangulärt område som innehåller händelserna du vill markera. De markerade händelserna färgläggs då med blått. Om du klickar på en enskild händelse, markeras bara den händelsen <footnote
+> <para
+> Du kan också dubbelklicka på en enskild händelse för att visa en redigeringsdialogruta för händelsen, men det har ingenting att göra med markeringar.</para
+> </footnote
+>). </para
+><para
+>Om du håller nere <keycap
+>Skift</keycap
+> medan du ritar upp en rektangel, läggs innehållet till i en eventuell befintlig markering istället för att ersätta den. </para>
+ <para
+>För att markera en hel takt, dubbelklicka med markeringsverktyget på ett tomt utrymme i takten. För att markera hela notsystemet, klicka tre gånger. Redigeringsmenyn innehåller alternativ för att markera utökade områden baserat på infogningsmarkörens plats, och du kan också markera händelser omkring infogningsmarkören genom att hålla nere Skift och trycka på vänster eller höger piltangent. </para>
+ <para
+>Det är inte möjligt att markera händelser i mer än ett notsystem på en gång. </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>Dragåtgärder</term>
+ <listitem>
+ <para
+>Du kan också utföra en viss mängd redigering genom att bara dra omkring saker. Byt till markeringsverktyget (pilen), och därefter kan du ändra tonhöjd på noter genom att bara klicka och dra deras huvuden uppåt eller neråt, och ändra tider för noter och andra händelser genom att dra dem åt vänster eller höger. (Du kan inte dra pauser eller taktarter, men du kan dra allting annat. Om du har markerat mer än en händelse, dras hela markeringen på en gång.) </para>
+ <para
+>Att dra är oftast ett mindre noggrant sätt att redigera än att använda funktionerna i menyn eller verktygsraden, men det kan vara enklare. </para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </sect1>
+
+ <!-- Insertion: notes, auto-ties, accidentals -->
+
+ <sect1 id="nv-insertion">
+ <title
+>Infoga noter och pauser</title>
+
+ <para
+>För att infoga en not, välj ett av notverktygen genom att klicka på ett visst notvärde i verktygsraden, och därefter klicka i notsystemet på platsen där du vill lägga till noten.</para>
+
+ <para
+>Du kan också markera en av de tillfälliga förtecknen på verktygsraden för att infoga upphöjda eller nersänkta noter. Om inget tillfälligt förtecken används, följer den infogade noten de fasta förtecknen. Som ett alternativ kan du välja ikonen "Följ föregående tillfälliga förtecken" (som visas som en not med en pil som pekar tillbaka från stället där förtecknet skulle visas) för att få noten att följa det tillfälliga förtecken som senast användes på samma plats i notsystemet.</para>
+
+ <para
+>Om du lägger till en not på samma tid som en befintlig not med annat notvärde, antar editorn i allmänhet att du vill skapa ackord och delar upp den befintliga eller nya noten på motsvarande sätt för att skapa ett eller flera bundna ackord. Om du verkligen vill skapa ett ackord med två olika notvärden, kan du markera de bundna nothuvudena och använda funktionen Lägg ihop noter med samma tonhöjd för att lägga ihop dem. Som ett alternativ kan det förvalda beteendet ändras in &rosegarden;s inställningsdialogruta, så att uppdelningen inte alls görs.</para>
+
+ <para
+>Om du lägger till en not exakt ovanpå en befintlig not med annorlunda notvärde (dvs. på samma tonhöjd), ändras notvärdet på den befintliga noten till det nya notvärdet.</para>
+
+ <para
+>Om du lägger till en paus på exakt samma tid som en befintlig not, blir den befintliga noten tyst under pausvärdet, vilket förkortar den eller möjligen tar bort den helt och hållet.</para>
+
+ <sect2 id="nv-insertion-keyboard">
+ <title
+>Skriva in noter och pauser med datorns tangentbord</title>
+
+ <sect3>
+ <title
+>Notvärde</title>
+
+ <para
+>Försäkra dig först om att ett notverktyg är valt för att ange notvärdet (eller pausvärdet) som du vill infoga. Du kan välja de olika nottyperna genom att använda nummertangenterna:</para>
+
+ <itemizedlist>
+ <listitem
+><para
+><keycap
+>5</keycap
+> &ndash; Brevis</para
+></listitem>
+ <listitem
+><para
+><keycap
+>1</keycap
+> &ndash; Helnot</para
+></listitem>
+ <listitem
+><para
+><keycap
+>2</keycap
+> &ndash; Halvnot</para
+></listitem>
+ <listitem
+><para
+><keycap
+>4</keycap
+> &ndash; Kvartsnot</para
+></listitem>
+ <listitem
+><para
+><keycap
+>8</keycap
+> &ndash; Åttondedelsnot</para
+></listitem>
+ <listitem
+><para
+><keycap
+>6</keycap
+> &ndash; Sextondedelsnot</para
+></listitem>
+ <listitem
+><para
+><keycap
+>3</keycap
+> &ndash; Trettioandredelsnot</para
+></listitem>
+ <listitem
+><para
+><keycap
+>0</keycap
+> &ndash; Sextifjärdedelsnot</para
+></listitem>
+ </itemizedlist>
+
+ <para
+>Du kan byta till en triolversion av notvärdet genom att trycka på tangenten <keycap
+>G</keycap
+>. Genom att trycka på den igen byter du tillbaka till normalt notvärde. Statusraden längst ner i fönstret underrättar dig om att ett triolvärde är aktivt.</para>
+ </sect3>
+
+ <sect3>
+ <title
+>Tonhöjd</title>
+
+ <para
+>Så fort ett notverktyg är valt, kan du infoga en not på <link linkend="nv-rulers"
+>infogningsmarkörens</link
+> aktuella position genom att trycka på en av tonhöjdstangenterna:</para>
+
+ <itemizedlist>
+ <listitem
+><para
+><keycap
+>A</keycap
+> &ndash; C (Do, tonikan i aktuell tonart för aktuell klav)</para
+></listitem>
+ <listitem
+><para
+><keycap
+>S</keycap
+> &ndash; D (Re)</para
+></listitem>
+ <listitem
+><para
+><keycap
+>D</keycap
+> &ndash; E (Mi)</para
+></listitem>
+ <listitem
+><para
+><keycap
+>F</keycap
+> &ndash; F (Fa)</para
+></listitem>
+ <listitem
+><para
+><keycap
+>J</keycap
+> &ndash; G (So)</para
+></listitem>
+ <listitem
+><para
+><keycap
+>K</keycap
+> &ndash; A (La)</para
+></listitem>
+ <listitem
+><para
+><keycap
+>L</keycap
+> &ndash; H (Ti)</para
+></listitem>
+ </itemizedlist>
+
+ <para
+>Tryck på tangenten "." för att växla mellan notvärden med eller utan punkt.</para>
+
+ <para
+>Genom att hålla nere <keycap
+>Skift</keycap
+> när en tangent trycks, fås en upphöjd not (utom för E och H som inte har upphöjda versioner) och genom att hålla nere <keycap
+>Skift</keycap
+> och <keycap
+>Ctrl</keycap
+> tillsammans fås en nersänkt not (utom för F och C).</para>
+
+ <para
+>För att skriva in noter en oktav högre,använd motsvarande tangenter på nästa rad ovanför: <keycap
+>Q</keycap
+>, <keycap
+>W</keycap
+>, <keycap
+>E</keycap
+>, <keycap
+>R</keycap
+>, <keycap
+>U</keycap
+>, <keycap
+>I</keycap
+> och <keycap
+>O</keycap
+>. På motsvarande sätt, för att lägga till noter en oktav lägre, använd <keycap
+>Z</keycap
+>, <keycap
+>X</keycap
+>, <keycap
+>C</keycap
+>, <keycap
+>V</keycap
+>, <keycap
+>B</keycap
+>, <keycap
+>N</keycap
+> och <keycap
+>M</keycap
+>.</para>
+
+ </sect3>
+
+ <sect3>
+ <title
+>Pauser</title>
+
+ <para
+>För att infoga en paus istället för en not, tryck på <keycap
+>P</keycap
+>. Som ett alternativ kan du använda tangenterna <keycap
+>T</keycap
+> och <keycap
+>Y</keycap
+> för att byta aktuellt verktyg till ett pausverktyg och tillbaka till ett notverktyg igen.</para>
+
+ </sect3>
+
+ <sect3>
+ <title
+>Ackord</title>
+
+ <para
+>Normalbeteendet i notbehandlaren är att flytta infogningsmarkören framåt efter en not har infogats, så att den är klar att mata in en ny not på efterföljande plats i en melodi. Det kan ändras med tangenten <keycap
+>H</keycap
+>, som byter till ackordsläge så att efterföljande inmatning sker samtidigt som den senaste. Att trycka på <keycap
+>H</keycap
+> igen byter tillbaka till inmatningsbeteende för melodi.</para>
+
+ </sect3>
+
+ <sect3>
+ <title
+>Ändra notvärden</title>
+
+ <para
+>Du kan använda tangentbordet för att ändra notvärden som du redan har skrivit in. Försäkra dig om att noterna du vill ändra är markerade, och tryck därefter på <keycap
+>Ctrl</keycap
+> samt nummertangenten för noten som du vill ha. Du kan också lägga till eller ta bort punkter, genom att trycka <keycap
+>Ctrl</keycap
+> och ".". Använd det upprepade gånger för att välja mellan en punkt, två punkter eller ingen punkt.</para>
+
+ <para
+>Om du håller nere <keycap
+>Alt</keycap
+> samt <keycap
+>Ctrl</keycap
+>, ändrar du notvärden som de visas i notbehandlaren utan att ändra utfört notvärde. Det kan vara mycket användbart för att städa upp ett partitur: Se också <link linkend="nv-quantization"
+>Notskrift från utförandedata</link
+>. </para>
+ </sect3>
+
+ <sect3>
+ <title
+>Övriga anmärkningar</title>
+
+ <para
+>Alla infogningskommandon är också tillgängliga från en undermeny i menyn Verktyg. Det är inte troligt att du någonsin vill navigera i menyn bara för att infoga en enstaka not, men menyerna visar snabbtangenterna och tillhandahåller på så sätt en användbar referens om du skulle glömma vilken tangent som gör vad.</para>
+
+ <para
+>Snabbtangenterna är för närvarande gjorda för att användas med tangentbord som har QWERTY-organisation. Det finns ännu inte något sätt att ändra snabbtangenter till en annan organisation, förutom att individuellt ändra tilldelning av varje tangent med alternativet "Anpassa genvägar..." i menyn Inställningar.</para>
+
+ <para
+>Genom att hålla nere <keycap
+>Ctrl</keycap
+> vid tryck på en nummertangent väljes motsvarande verktyg med punkt.</para>
+
+ </sect3>
+
+ </sect2>
+
+ <sect2 id="nv-insertion-midi">
+ <title
+>Skriva in noter genom att använda ett MIDI-keyboard</title>
+
+ <para
+>Du kan lägga till noter i notbehandlaren en i taget med ett MIDI-keyboard eller en annan MIDI-styrenhet, en process som är känd som "stegvis inspelning". Notbehandlaren använder tonhöjden du spelar på ett keyboard, men de notvärden du har valt i själva editorn. </para>
+
+ <para
+>För att börja mata in noter från ett MIDI-keyboard, försäkra dig först om att det är inställt som förvald MIDI-inspelningsenhet. Försäkra dig därefter om att ett notverktyg är valt för att ange ett notvärde. Tryck därefter på knappen för stegvis inspelning i notbehandlarens verktygsrad, eller välj Stegvis inspelning i menyn Verktyg. Från detta ögonblick infogas alla toner som du spelar på ditt MIDI-keyboard vid den nuvarande inmatningstiden i noteringsfönstret, ända till stegvis inspelning stängs av igen, aktiveras i ett annat fönster eller fönstret stängs. </para>
+
+ <para
+>Du kan välja ett annat notverktyg medan stegvis inspelning pågår för att infoga noter med olika notvärden, och du kan också byta till ackordläge för att infoga ackord. </para>
+ </sect2>
+
+ </sect1>
+
+ <!-- Keys, Clefs and Time Signatures -->
+
+ <sect1 id="nv-signatures">
+ <title
+>Klav och tonart</title>
+
+<!-- !!! rework -->
+ <para
+>Det första man måste veta om hur &rosegarden; hanterar dessa är att tidsrelaterade ändringar (tempo och taktarter) hanteras helt annorlunda än klaver och tonarter. För att förenkla hantering av uppspelning och inspelning samt notering, kräver &rosegarden; att när tempo eller taktart ändras, görs det i alla notsystem på en gång. Du kan inte låta ett notsystem använda 3/4 medan ett annat samtidigt använder 4/4, eller ha ett notsystem som spelar med 120 taktslag och ett annat med 90. Det gäller bara tid: Det finns inga sådana begränsningar för användning av klav- och tonartsbyten.</para>
+
+ <para
+>För att ändra klav, tonart, tempobeteckning eller taktart inne i ett fönster i notbehandlaren, placera <link linkend="nv-rulers"
+>infogningsmarkören</link
+> på ett ställe där du vill att ändringen ska ske, och använd en av redigeringsmenyns funktioner Lägg till klavbyte..., Lägg till tonartsbyte..., Byt tempo... eller Byt taktart... . Då visas en dialogruta där du kan välja en viss inställning för klav, tonart, tempobeteckning eller taktart som du vill använda, enligt följande.</para>
+
+ <sect2 id="nv-signatures-clef">
+ <title
+>Klav</title>
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-clefdialog.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase
+>&rosegarden;s klavdialogruta</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+
+ <para
+>Dialogrutan låter dig välja en klav, och låter dig dessutom välja hur du vill att klaven ska användas, i fall där det redan finns några noter efter punkten där klaven ska infogas. Du måste välja något av följande: <variablelist>
+
+ <varlistentry>
+ <term
+>Behåll nuvarande tonhöjder</term>
+ <listitem>
+ <para
+>Alla noter som följer klaven behåller sina nuvarande utförda tonhöjder. </para>
+ <para
+>Genom att till exempel infoga en c-klav i mitten av ett avsnitt med en tidigare g-klav gör att noterna som kommer efter klaven att flyttas en oktav högre i notsystemet, eftersom de fortfarande har sina tonhöjder enligt g-klaven. </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>Transponera till lämplig oktav</term>
+ <listitem>
+ <para
+>Alla noter som kommer efter klaven behåller sin tonhöjd inom oktaven, men kan flyttas till en annan oktav för att passa med den nya klaven, och spelas därför med annan tonhöjd. </para>
+ <para
+>Genom att till exempel infoga en c-klav i mitten av ett avsnitt med en tidigare g-klav gör att noterna som kommer efter klaven bara att flyttas en linje i notsystemet för att justeras enligt den nya klaven, men spelas en oktav lägre än tidigare. </para>
+ </listitem>
+ </varlistentry>
+
+ </variablelist>
+
+ </para>
+ </sect2>
+
+ <sect2 id="nv-signatures-key">
+ <title
+>Tonart</title>
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-keysigdialog.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase
+>&rosegarden;s dialogruta för fasta förtecken</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+ </sect2>
+
+ </sect1>
+
+ <!-- Text -->
+
+ <sect1 id="nv-text">
+ <title
+>Text och sångtexter</title>
+
+ <para
+>Ett notsystem kan innehålla olika sorters text, i texthändelser. Det finns två grundläggande klasser med texthändelser: Enstaka textobjekt som används för punktnoteringar etc., och sångtexter. De förstnämnda kan skapas (och på så sätt kopplas till en viss tid i notsystemet) med textverktyget, som är tillgängligt från knappen markerad med ett stort <guilabel
+>T</guilabel
+> i verktygsraden. Sångtext kan också skapas på detta sätt, men skapas enklare med <link linkend="nv-text-lyrics"
+>sångtexteditorn</link
+>.</para>
+
+ <para
+>För att lägga till ett textstycke, välj textverktyget och klicka på stället där du vill lägga till den. En dialogruta visas, där du kan skriva in texten och välja dess tänkta syfte. (Rosegarden föredrar att lagra vad texten är till för, istället för hur. Det görs så att vi i framtiden kan ställa in hur diverse textsorter presenteras för varje individuell användare). Tillgängliga syften (eller stilar) är:</para>
+
+ <variablelist>
+
+ <varlistentry
+><term
+>Dynamik</term
+><listitem
+><para
+>Används för mindre lokala föredragsbeteckningar som dynamikbeteckningarna "p", "mf" etc. Visas normalt under notsystemet med liten kursiv stil. </para
+></listitem
+></varlistentry>
+
+ <varlistentry
+><term
+>Anvisning</term
+><listitem
+><para
+>Används för att ange väsentliga ändringar i stil eller stämning. Visas normalt ovanför notsystemet med stort romerskt teckensnitt. </para
+></listitem
+></varlistentry>
+
+ <varlistentry
+><term
+>Lokal anvisning</term
+><listitem
+><para
+>Används för att ange mindre väsentliga ändringar i stil eller stämning. Visas normalt under notsystemet med mindre romerskt teckensnitt i fetstil. </para
+></listitem
+></varlistentry>
+
+ <varlistentry
+><term
+>Tempo</term
+><listitem
+><para
+>Används för att ange väsentliga ändringar av tempo. Visas normalt ovanför notsystemet med stort romerskt teckensnitt i fetstil. </para
+></listitem
+></varlistentry>
+
+ <varlistentry
+><term
+>Lokalt tempo</term
+><listitem
+><para
+>Används för att ange mindre viktiga eller lokala ändringar av tempo. Visas normalt ovanför notsystemet med litet romerskt teckensnitt i fetstil. </para
+></listitem
+></varlistentry>
+
+ <varlistentry
+><term
+>Sångtext</term
+><listitem
+><para
+>Även om sångtext oftast skapas i <link linkend="nv-text-lyrics"
+>sångtexteditorn</link
+>, kan de också skrivas in ord för ord om det behövs genom att använda den här stilen. Normalt visas stilen under texten med litet romerskt teckensnitt. (Varning: Om du skriver in sångtext på detta sätt och senare redigerar notsystemets sångtext med sångtexteditorn, kan all sångtext som skrivs in på detta sätt ändras eller flyttas om positionen inte stämmer med den som sångtexteditorn förväntar sig.) </para
+></listitem
+></varlistentry>
+
+ <varlistentry
+><term
+>Anteckning</term
+><listitem
+><para
+>Används för hjälptext som inte strikt anses tillhöra partituret. Visas normalt under notsystemet, i en gul ruta som liknar en klisterlapp. </para
+></listitem
+></varlistentry>
+
+ </variablelist>
+
+ <para
+>Du kan också redigera text efter den skapats genom att klicka på den befintliga texten med textverktyget.</para>
+
+ <sect2 id="nv-text-lyrics">
+ <title
+>Redigera sångtexter</title>
+
+ <para
+>Sångtexteditorn, tillgänglig från alternativet <guimenuitem
+>Öppna sångtexteditor</guimenuitem
+> i menyn <guimenu
+>Visa</guimenu
+>, låter dig redigera alla sångtexthändelser för ett enskilt notsystem på en gång, med ett ganska grundläggande textbaserat redigeringssystem. För att använda den, välj bara menyalternativet, redigera sångtexten i dialogrutan som visas, och klicka därefter på Ok.</para>
+
+ <para
+>Sångtext som du skriver in måste följa ett visst format. Taktstreck är mycket viktiga för att undvika att editorn blir förvirrad, och representeras med ett snedstreck ("/"). Inom varje takt skiljs enskilda stavelser åt med mellanslag (åtminstone ett mellanslag: editorn bryr sig inte om extra blanktecken). Varje stavelse kopplas i sin tur till nästföljande not eller ackord i takten (även om editorn för närvarande kan bli riktigt förvirrad av ackord som inte är exakta, dvs. som kräver utjämning eller kvantisering).</para>
+
+ <para
+>Om du vill att en not inte ska ha någon tillhörande stavelse, måste du använda en punkt (".") som stavelse för noten. (Det är därför standardtexten för ett segment oftast är full med punkter.) Kom ihåg att skilja punkterna åt med mellanslag, så att de tydligt är skilda stavelser.</para>
+
+ <para
+>Om du vill ha mer än en stavelse för samma not, med ett mellanslag mellan dem, använd tilde ("~") istället för mellanslag. Det visas som ett mellanslag i partituret.</para>
+
+ <para
+>Om du vill dela en stavelse mellan två noter med ett bindestreck, måste du skriva in ett mellanslag efter bindestrecket så att editorn vet att det ska behandlas som två stavelser. (Bindestreck hanteras inte speciellt inne i stavelser.)</para>
+
+ <para
+>Stavelser som bara består av siffror omgivna av hakparenteser (som "[29]") ignoreras. Det är formatet för automatiskt skapade taktnummer som visas i editorn.</para>
+
+ <para
+>Du bör också vara medveten om att textformatet för sångtext bara används för redigering: sångtexten lagras i själva verket som distinkta texthändelser (en per stavelse). Det betyder att textformatet potentiellt kan ändras i framtiden för att hantera mer avancerade redigeringsmöjligheter, även om händelseformatet inte bör ändras och sparade filer bör fortsätta att fungera.</para>
+
+ </sect2>
+
+ </sect1>
+
+ <!-- Indications -->
+
+ <sect1 id="nv-indication">
+ <title
+>Legatobågar och klykor</title>
+
+ <para
+>Dynamikmarkeringarna legatobågar och klykor lagras som händelser, precis som noter eller pauser. För att skapa en, markera området du vill täcka (en följd av noter eller något annat), och använd därefter alternativen <guimenuitem
+>Lägg till legatobåge</guimenuitem
+>, <guimenuitem
+>Lägg till crescendo</guimenuitem
+> eller <guimenuitem
+>Lägg till diminuendo</guimenuitem
+> i menyn <guimenu
+>Grupp</guimenu
+>.</para>
+
+ <para
+>Du kan ta bort en legatobåge eller klyka på samma sätt som alla andra händelser: Markera den antingen med markeringsverktyget och tryck därefter på <keycap
+>Delete</keycap
+>, eller klicka på den med borttagningsverktyget aktivt.</para>
+
+ </sect1>
+
+ <!-- Stem direction, slashes etc -->
+
+ <sect1 id="nv-note-qualities">
+ <title
+>Notskaft och tvärbalkar</title>
+
+ <para
+>Du kan ställa in skaftriktningen på alla markerade noter (under förutsättning att de är av en sort som har skaft) med de tre skaftriktningsalternativen i menyn Noter. Alternativen låter dig antingen låsa skaften uppåt eller neråt, eller återgå till skaftriktningen som &rosegarden; annars skulle ha valt. Se också <link linkend="nv-beamed-groups"
+>Balkar</link
+>.</para>
+
+ <para
+>Menyn <guimenu
+>Noter</guimenu
+> innehåller också alternativ för att lägga till tvärbalkar på notskaft, för att till exempel ange korta upprepade noter eller trumvirvlar. De är för närvarande bara notation. &rosegarden; tar inte hänsyn till dem när notsystemet spelas upp eller när &MIDI; skapas.</para>
+ </sect1>
+
+ <!-- Beamed groups, including overlapping and nesting them -->
+
+ <sect1 id="nv-beamed-groups">
+ <title
+>Balkar</title>
+
+ <para
+>Att lägga till balkar till noter anses som en grupperingsåtgärd i &rosegarden;s notbehandlare, tillgänglig i menyn <guimenu
+>Grupp</guimenu
+>. Markera noterna du vill lägga till en balk för, och använd menyalternativet Balkar i menyn <guimenu
+>Grupp</guimenu
+>. För att ta bort en balk, markera noterna och använd menyalternativet <guimenuitem
+>Ta bort balkar</guimenuitem
+>.</para>
+
+ <para
+>Det är möjligt att ha mer än en balkgrupp som inträffar samtidigt. Du markerar och lägger bara till balkar för enskilda grupper en åt gången. Oftast är Rosegarden inte ännu smart nog för att räkna ut vilka noter som bör ha skaften uppåt och vilka som bör ha skaften neråt för grupper som samtidigt ges balkar, alltså behöver du troligen explicit ange skaftriktningar för noter i grupperna samt ge dem balkar.</para>
+
+ <para
+>&rosegarden; kan försöka att gissa lämpliga balkar för ett musikstycke, under förutsättning att det inte är alltför komplicerat. För att göra det, markera noterna du vill beräkna balkar för (till exempel genom att trippelklicka för att markera ett helt notsystem) och därefter använda alternativet <guimenuitem
+>Automatiska balkar</guimenuitem
+> i menyn <guimenu
+>Grupp</guimenu
+>. Balkar skapas också automatiskt till exempel när en &MIDI;-fil laddas, och editorn skapar också vissa balkar automatiskt när du skriver in noter (det kan stängas av genom att ändra inställningen "Lägg automatiskt till balkar om lämpligt" i inställningsdialogrutan eller infogningsverktygets meny som visas med höger musknapp).</para>
+
+ </sect1>
+
+ <!-- Tuplets -->
+
+ <sect1 id="nv-tuplets">
+ <title
+>Trioler och andra annandelningar</title>
+
+ <para
+>En triolgrupp består av tre toner eller ackord som spelas under samma tid som två. (Mer exakt består den av toner med ett totalt notvärde av tre godtyckliga enheter, som spelas under samma tid som två av enheterna.)</para>
+
+ <para
+>Vi använder ordet <quote
+>annandelning</quote
+> för att beskriva det allmänna fallet då toner med ett totalt notvärde av ett givet antal enheter, spelas under en tid som anges av ett annat antal av enheterna: Nio toner under tiden för åtta, eller sex under tiden för fyra, eller en fjärdedelsnot och en åttondedelsnot under tiden för en enda fjärdedelsnot, eller till och med två toner under tiden för tre. (För närvarande stöder inte &rosegarden; det sista exemplet. Annandelningar måste alltid spelas med ett kortare notvärde än det skrivna.)</para>
+
+ <para
+>Menyfunktionerna för trioler och annandelningar fungerar genom att ta en befintlig följd av noter eller pauser och trycka ihop dem så att de spelas upp snabbare, och fylla i överblivet utrymme efter följden med en slutgiltig paus och rita upp det hela som en annandelning. Därför kan du skapa en ny följd av trioler genom att mata in de första två noterna i följden (med normal form), göra dem till trioler, och därefter fylla i utrymmet som blivit kvar efter triolåtgärden med den sista noten i triolen. Eller kan du utföra triolåtgärden innan du matar in några noter, och på så sätt omvandla den ursprungliga pausen till triolform, och därefter infoga triolens noter ovanpå den. Några exempel kan vara till hjälp:</para>
+
+ <!-- Need examples and screenshots -->
+
+ <!-- Then discuss general tuplet dialog... -->
+
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-tupletdialog.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase
+>&rosegarden;s allmänna dialogruta för annandelningar</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+
+ <para
+>För att ange en allmän annandelning, måste man känna till vad grundnoten är (om man till exempel spelar tre fjärdedelsnoter under tiden för två är grundnoten en fjärdedelsnot) och förhållandet mellan antalet grundnoter som skrivs till antalet som spelas.</para>
+
+ <!-- Then discuss "tuplet mode": with a subtitle? -->
+
+ </sect1>
+
+ <!-- Grace notes -->
+
+ <!-- Paste -->
+
+ <sect1 id="nv-paste-types">
+ <title
+>Inklistringstyper</title>
+
+ <para
+>Betydelsen av <quote
+>klipp ut och klistra in</quote
+> är inte så uppenbar för musikredigeringsprogram som den är för något som en ordbehandlare, där bokstäverna och orden anges i en enkel linjär ordning. I enlighet med det erbjuder &rosegarden;s notbehandlare flera olika typer av inklistringsåtgärder, samt separata funktioner för Klipp ut eller Klipp ut och stäng. </para>
+
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-pastedialog.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase
+>&rosegarden;s inklistringstypdialogruta</phrase>
+ </textobject>
+ </mediaobject>
+</screenshot
+> Typerna av inklistringsåtgärder är:</para>
+
+ <variablelist>
+
+ <varlistentry>
+ <term
+>Begränsat</term>
+ <listitem>
+ <para
+>Kräver ett befintligt gap (som inte innehåller något annat än pauser) med tillräckligt notvärde för att helt omfatta klippbordets innehåll. Innehållet klistras in i gapet. Om det inte finns ett gap som är långt nog, utförs inte inklistringen. </para>
+ <para
+>Det här är förvald inklistringstyp. </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>Enkel</term>
+ <listitem>
+ <para
+>Raderar tillräckligt med händelser för att skapa ett gap som är långt nog att klistra in i, och klistrar därefter in i det. De inklistrade händelserna ersätter därför fullständigt alla eventuella befintliga i tiden som täcks av inklistringen. </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>Öppna och klistra in</term>
+ <listitem>
+ <para
+>Motsatsen till Klipp ut och stäng. Gör rum för det som ska klistras in genom att flytta alla efterföljande händelser längre mot kompositionens slut. </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>Överlagring av noter</term>
+ <listitem>
+ <para
+>Utför en inklistring på samma sätt som skulle ske om du skrev in var och en av noterna på klippbordet själv med notbehandlaren: Om det finns andra noter som överlappar med dem, delas nya och befintliga noter i lämpliga bindebågar. </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>Matrisöverlagring</term>
+ <listitem>
+ <para
+>Utför en inklistring på samma sätt som skulle ske om du skrev in var och en av noterna på klippbordet själv med matriseditorn: Noterna som för närvarande är ivägen för inklistringen ignoreras, och de nya noterna får överlappa godtyckligt med dem. </para>
+ </listitem>
+ </varlistentry>
+
+ </variablelist>
+
+ <para
+>Alla dessa får effekt på infogningsmarkörens aktuella position i aktuellt notsystem. För att välja mellan de olika typerna av inklistring, använd menyalternativet Klistra in... (med punkter) i menyn Redigera. </para>
+
+ </sect1>
+
+ <sect1 id="nv-adjustments">
+ <title
+>Justera notering</title>
+
+
+ <sect2 id="nv-adjustments-note-rest-durations">
+ <title
+>Justera not- och pausvärden</title>
+
+ <sect3 id="nv-normalize-rests">
+ <title
+>Normalisera pauser</title>
+
+ <para
+>Ibland kan ett notavsnitt råka ut för felaktiga pausvärden för aktuell taktart, som ett resultat av redigering eller kvantiseringsåtgärder. Du kan använda funktionen <guimenuitem
+>Normalisera pauser</guimenuitem
+> för att fixa dem. Funktionen undersöker varje sekvens av pauser i en följd som hittas i markeringen och justerar, delar och lägger ihop pauser enligt vad som är nödvändigt för att försäkra att pauserna har rätt teoretiskt pausvärde och hamnar på rätt gränser. </para>
+
+ <para
+>Om en 4/4-takt innehåller en fjärdedelsnot, arrangeras en halvnotspaus och en fjärdedelspaus om så att fjärdedelspausen placeras först, eftersom halvnotspausen inte ska överlappa den centrala taktgränsen i takten. </para>
+ </sect3>
+<!--
+ <varlistentry id="commands-nv-menu-transforms-make-viable">
+ <term
+><menuchoice>
+ <guimenu
+>Transforms</guimenu>
+ <guimenuitem
+>Make Notes Viable</guimenuitem>
+ </menuchoice
+></term>
+ <listitem>
+ <para
+><action
+>Splits notes at displayable
+ durations.</action
+> This function is intended to deal
+ with notes that have excessively long durations that
+ overflow barlines or that are too long to be displayed
+ as a single note. It takes any such notes and splits
+ them into shorter, tied notes.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry id="commands-nv-menu-transforms-de-counterpoint">
+ <term
+><menuchoice>
+ <guimenu
+>Transforms</guimenu>
+ <guimenuitem
+>De-Counterpoint</guimenuitem>
+ </menuchoice
+></term>
+ <listitem>
+ <para
+><action
+>Turns counterpoint into a series of split-and-tied notes and chords.</action>
+
+ &rosegarden; has no explicit support for counterpoint
+ (multiple lines of notes edited separately on the
+ same staff), but it will do its best to approximate
+ it when it finds notes in a segment that are
+ apparently contrapuntal, i.e. that overlap but that
+ are not precise enough to be treated as chords. For
+ example, when a short note starts shortly after a
+ longer note, Rosegarden will show the longer note
+ and a short <quote
+>spacing</quote
+> rest together, followed by the
+ shorter note. Unfortunately this often isn't what
+ you want.
+ </para>
+
+ <para
+>The De-Counterpoint function can be applied to a
+ selection that contains overlapping notes. It will
+ split overlapping notes at the point where they
+ overlap, and tie together the resulting split notes,
+ ensuring that the music takes the form of a series of
+ chords and/or single notes starting and ending in neat
+ blocks, with some notes possibly tied.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry id="nv-transpose">
+ <title
+>Transpose</title>
+ <para
+><action
+>Alters the pitch of the selected
+ notes.</action
+> This submenu contains basic
+ transposition functions which move the selected notes
+ up or down a semitone or a whole octave in pitch, as
+ well as a general transpose function that allows you
+ to choose how far up or down you want to transpose the
+ selection.
+ </para>
+
+ <para
+>These functions simply change the stored pitches
+ of the notes in the selection, so that they both play
+ and appear at the new pitches. They do not deal with
+ performance transposition (displaying one pitch and
+ playing another), for which see the main window's
+ segment parameter box; nor do they help you with
+ transposing from one key into another, for which see
+ <link linkend="nv-signatures-key"
+>Key
+ Signatures</link
+>.
+ </para>
+ </varlistentry>
+-->
+ </sect2>
+ </sect1>
+
+ <sect1 id="nv-interpret">
+ <title
+>Tolka utförandeantydningar i notskrift</title>
+ <!-- !!! -->
+ <para
+>Du kan använda tolkningsfunktionen för att ändra ljudstyrkor och tider för toner enligt eventuell skriven eller angiven dynamik som hittas. Tillgängliga val av tolkningar är följande: <variablelist>
+ <varlistentry>
+ <term
+>Tillämpa dynamikbeteckningar (p, mf, ff, etc.) </term>
+ <listitem
+><para
+>Anger en ljudstyrka för varje not baserat på senaste texten av typen "Dynamik" som observerats i samma notsystem (bara text på formen pp, p, mp, mf, f, ff, fff etc känns igen). </para
+></listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>Använd dynamikklykor </term>
+ <listitem
+><para
+>Gör att noterna gradvis ökar eller minskar ljudstyrka under en klyka som anger crescendo eller diminuendo. </para
+></listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>Betona taktslag </term>
+ <listitem
+><para
+>Gör noter som hamnar på takt- eller taktslagsgränser något starkare (större ljudstyrka) än omgivande noter. </para
+></listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>Artikulationsbeteckningar </term>
+ <listitem
+><para
+>Avkortar noter utan legatobågar, avkortar staccato-noter ännu mer, och ger noter inne i legatobågar och tenuto-noter sina fulla notvärden. </para
+></listitem>
+ </varlistentry>
+ </variablelist>
+
+ </para>
+
+ </sect1>
+
+ <!-- Quantization, smoothing, and display of quantized notes -->
+
+ <sect1 id="nv-quantization">
+ <title
+>Notskrift från utförandedata</title>
+
+ <para
+>&rosegarden; är ett program med flera användningsområden: Det är en notbehandlare, men det är i huvudsak en musikbehandlare och editor för utförd musik, och i utföranden är tonernas tider och notvärden naturligtvis sällan så precisa som de är i ett tryckt partitur. </para>
+
+ <para
+>Det betyder att det ofta är önskvärt för &rosegarden; att göra en hel del uppstädning av grundläggande nottider och notvärden vid försök att skapa meningsfulla noter att visa i notbehandlaren. Det är en sorts kvantisering, men en sort som kräver en förvånansvärd mängd gissningar för att göras bra. Det ingår en kvantisering i &rosegarden; som är konstruerad för att göra ett något bättre jobb än den enkla rutnätskvantiseringen. </para>
+
+ <para
+>Att använda kvantisering enbart för notskrift kallas ganska fantasilöst för <quote
+>kvantisering</quote
+>: Den gäller bara noterna du ser och redigerar i notskrift, och påverkar inte tonerna som spelas, eller det du redigerar i andra vyer som matrisvyn. Kvantiseringen utförs automatiskt för musik som importeras eller spelas in från MIDI, även om inte alla dess möjliga funktioner normalt är aktiverade. </para>
+
+ <para
+>Det finns två sätt att se vilka noter som har kvantiserats för notskrift. Normalt innehåller varje notvy en linjal för obehandlade noter (i gruppen med linjaler ovanför partituret) som visar ett rektangulärt block för varje not. Blocket är placerat så att det representerar tiden och notvärdet för noten som utfördes, men med rektangelns övre och nedre kant utökade eller avkortade för att representera tiden efter kvantisering. Om det är för mycket information för dig, kan du som ett alternativ välja (i inställningsdialogrutan) att visa alla nothuvuden i partituret som har ändrade tider efter kvantisering med grön färg. </para>
+
+ <para>
+
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-notationquantizer.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase
+>&rosegarden;s kvantiseringsdialogruta</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para
+><para
+>Om kvantiseringen &rosegarden; har använt inte är lämplig, antingen för hela partituret eller för ett antal markerade noter, kan du välja att använda en annan kvantiseringsnivå eller ingen alls. För att använda en annan kvantisering för vissa noter, markera noterna och använd menyfunktionen Kvantisera... (markera rutan som heter <quote
+>Kvantisera bara för notskrift</quote
+>). Kvantiseringsnivån som normalt används kan ändras i inställningsdialogrutan. </para>
+
+ <sect2 id="nv-quantization-parameters">
+ <title
+>Inställningsbara parametrar för den heuristiska kvantiseringen</title>
+
+ <sect3 id="nv-quantization-parameters-during">
+ <title
+>Parametrar för själva kvantiseringen</title>
+
+ <variablelist>
+
+ <varlistentry>
+ <term
+>Komplexitet</term>
+ <listitem>
+ <para
+>Kvantiseringens "komplexitet" är dess mest grundläggande parameter. En "komplex" kvantisering är mer redo att acceptera att musik som ser komplex ut i själva verket är avsedd att vara komplex, medan en "enkel" kvantisering är mer redo att anta att musik som ser komplex ut orsakas av ett mindre precist utförande av enkel musik. </para>
+ <para
+>Standardinställningarna är avsedda att skapa rimliga resultat för ett ganska brett musikspektrum. </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>Grundenhet för rutnät</term>
+ <listitem>
+ <para
+>Den grundläggande rutnätsenheten (inställd till ett notvärde) anger den absolut minsta notenheten som tillåts bli kvar i partituret efter kvantisering. Om den till exempel är inställd till en sextondedelsnot, placeras alla noter på gränser som är en multipel av sextondedelsnoter, och notvärdena är också multiplar av sextondedelsnoter. </para>
+ <para
+>Basrutnätsenhetens Inställning är inte riktigt så viktig för kvantisering som den är för den vanliga rutnätskvantiseringen, eftersom allt den gör är att lägga en absolut gräns på precisionsnivån som tillåts av komplexitetsparametern. Oftast när du hittar ett fall där bättre resultat uppnås genom att öka rutnätsenheten, har du i själva verket hittat ett fall där kvantiseringen helt enkelt inte gjorde ett så bra jobb som den skulle ha kunnat göra med den mindre enheten. </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>Annandelningsnivå</term>
+ <listitem>
+ <para
+>Kvantiseringen klarar av att identifiera annandelningar (trioler och andra tidskomprimerade grupper), inom rimliga gränser. Parametern styr hur ambitiös den försöker vara när den letar efter annandelningar, genom att ange en gräns för hur många noter per annandelning som den försöker identifiera. Om den är inställd till <quote
+>Inget</quote
+>, försöker inte kvantiseringen identifiera annandelningar överhuvudtaget. </para>
+ </listitem>
+ </varlistentry>
+
+ </variablelist>
+
+ </sect3>
+
+ <sect3 id="nv-quantization-parameters-after">
+ <title
+>Parametrar som styr uppstädning efter kvantisering</title>
+
+ <variablelist>
+
+ <varlistentry>
+ <term
+>Lägg till balkar igen</term>
+ <listitem>
+ <para
+>Gör att noterna placeras in i balkar med grupper som är passande efter kvantiseringen. Det är ofta önskvärt. </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>Lägg till artikulationsbeteckningar</term>
+ <listitem>
+ <para
+>Gör att kvantiseringen försöker identifiera vilka noter som ska markeras som staccato, baserat på notvärdet hos individuella noter och noter i följd (för noter som slutar väsentligt tidigare än den efterföljande noten, men uppenbarligen inte tidigt nog för att vara värda en paus), tenuto (för noter som nästan eller precis överlappar följande not) och legatobågar (för följder av noter som möts eller överlappar). </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>Bind noter vid taktstreck etc.</term>
+ <listitem>
+ <para
+>Gör att alla noter som fortfarande finns kvar efter kvantisering och överlappar taktstreck eller som har notvärden som inte kan uttryckas exakt med enstaka nothuvuden att delas upp i flera noter på lämpligt sätt, och bindas. Det får samma effekt som att utföra funktionen "Bind noter vid taktstreck" i notvyn. </para>
+ <para
+>Den här parametern är normalt inte aktiverad, delvis på grund av att den ändrar antalet tonhändelser, vilket är olämpligt när &rosegarden; delvis eller huvudsakligen används som en MIDI-musikbehandlare. </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>Dela och bind ackordnoter med för stora notvärden</term>
+ <listitem>
+ <para
+>Gör att överlappande noter delas och binds, så att strikta ackord med individuella nothuvuden bundna efter behov skapas. Det får samma effekt som att utföra funktionen "Dela och bind ackordnoter med för stora notvärden" i notvyn. </para>
+ <para
+>Den här parametern är normalt inte aktiverad, delvis på grund av att den ändrar antalet tonhändelser, vilket är olämpligt när &rosegarden; delvis eller huvudsakligen används som en MIDI-musikbehandlare. </para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </sect3>
+ </sect2>
+ </sect1>
+
+
+ <sect1 id="nv-note-styles">
+ <title
+>Notstilar</title>
+
+ <para
+>&rosegarden; låter dig också ändra diverse aspekter av sättet som olika nottyper ritas upp, som val av nothuvuden, antal flaggor, om noter är ifyllda eller inte och så vidare. </para>
+
+ <para
+>En uppsättning standardstilar (Klassisk, Kors, Triangel och Mensural) tillhandahålls, och du kan ändra stilen som används för enskilda noter genom att markera dem och därefter använda alternativen i menyn Notstil. Varje not kommer ihåg vilken stil som har valts för den, och informationen sparas som en del av kompositionen. Du kan också ändra förvald stil för nya noter genom att använda alternativet <guimenuitem
+>Anpassa Rosegarden...</guimenuitem
+> i menyn <guimenu
+>Inställningar</guimenu
+>. </para>
+
+ <para
+>Det är också möjligt att skapa dina egna notstilar genom att beskriva dem med <acronym
+>XML</acronym
+>-filer. (Till och med standardstilarna är definierade på detta sätt: Den enda orsaken att editorn vet om att en klassisk sextondedelsnot har ett ovalt lutande ifyllt huvud, ett skaft, två flaggor etc., är att beskrivningen i Classical.xml anger det.) Se <link linkend="developers-note-styles"
+>Anpassa Rosegarden</link
+> för mer information. </para>
+ </sect1>
+
+ <sect1 id="nv-note-fonts">
+ <title
+>Notteckensnitt</title>
+ <para
+>&rosegarden; levereras med ett enda skalbart notteckensnitt, Feta-teckensnittet utvecklat i Lilypond-projektet. Feta är ett teckensnitt med mycket hög kvalitet som bör vara lämpligt för nästan allt klassiskt arbete. </para>
+
+ <para
+>&rosegarden; innehåller också stöd som standard för ett antal andra notteckensnitt. Du måste själv tillhandahålla teckensnitten på formaten Truetype (.ttf) eller Postscript Typ-1 (.pfb, .pfa), och du måste ha lämpliga rättigheter för att installera dem på samma plats som &rosegarden; installerades. För att installera ett notteckensnitt som stöds, lokalisera katalogen share för &rosegarden;s installation (oftast en underkatalog till KDE-skrivbordets installationsträd, som /opt/kde/share/apps/rosegarden). Du märker att katalogen har en underkatalog som heter "fonts". Kopiera teckensnittsfilerna till den, och starta om &rosegarden;. Om teckensnittet stöds, ska det nu synas i teckensnittsmenyn i notbehandlaren.</para>
+
+ <para
+>Fullständigt eller delvis stöd tillhandahålls för närvarande för följande teckensnitt: Fughetta, av Blake Hodgetts; Petrucci, det "ursprungliga" Finale-teckensnittet; Maestro, det "nya" Finale-teckensnittet; Opus, Sibelius teckensnitt; Inkpen, Sibelius jazz-teckensnitt; Sonata från Adobe; Steinberg, från Cubase-musikbehandlaren; och Xinfonia. (De flesta av ovanstående teckensnittsnamn är registrerade varumärken av respektive företag.) ROSEGARDEN-GRUPPEN GER INGA UTFÄSTELSER ANGÅENDE JURIDISK STATUS FÖR ANVÄNDNING AV NÅGOT AV DESSA TECKENSNITT MED ROSEGARDEN. Det är ditt ansvar att försäkra dig om att du följer den licens (om det finns någon) som du erhöll teckensnittet med, innan du försöker använda det. Om du inte är säker på att du har rättighet att använda ett teckensnitt, gör då inte det. Förutom alla andra aspekter, så är det vanliga Feta-teckensnittet ändå bättre än de flesta av dem.</para>
+
+ <para
+>Det är också möjligt att tillhandahålla nya avbildningsfiler för att använda nya teckensnitt. För vissa teckensnitt som har liknande avbildningar eller mått som teckensnitt i listan ovan, kan det vara så enkelt som att redigera teckensnittets namn i avbildningsfilen. Se <link linkend="developers-note-fonts"
+>Anpassa Rosegarden</link
+> för mer information. </para>
+ </sect1>
+
+
+ </chapter>
+
+ <chapter id="event-view">
+ <title
+>Händelselisteditorn</title>
+ <sect1 id="ev-introduction">
+ <title
+>Inledning</title>
+
+ <para
+>&rosegarden;s editor för händelselistan visar händelserna i ett enstaka segment i obehandlad form, och gör det möjligt att redigera de exakta egenskaperna för händelserna individuellt. <screenshot
+> <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-eventlisteditor.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase
+>&rosegarden;s händelselisteditor</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+ </sect1>
+ </chapter>
+
+
+
+
+ <!--
+ **********************************
+
+ PART II:
+ Command reference
+
+ **********************************
+ -->
+<!-- NO
+
+ <chapter id="commands">
+ <title
+>Command Reference</title>
+
+
+ <para
+></para>
+
+ <sect1 id="commands-main">
+ <title
+>Main window</title>
+ <para
+></para>
+
+
+ <sect2>
+ <title
+>File menu</title>
+ <para>
+ <variablelist>
+
+ <varlistentry id="commands-main-file-new">
+ <term
+><menuchoice>
+ <shortcut>
+ <keycombo
+><keycap
+>Ctrl</keycap
+><keycap
+>n</keycap
+></keycombo>
+ </shortcut>
+ <guimenu
+>File</guimenu>
+ <guimenuitem
+>New</guimenuitem>
+ </menuchoice
+></term>
+ <listitem
+><para
+><action
+>Creates a new composition.</action
+></para
+></listitem>
+ </varlistentry>
+
+ <varlistentry id="commands-main-file-open">
+ <term
+><menuchoice>
+ <shortcut>
+ <keycombo
+><keycap
+>Ctrl</keycap
+><keycap
+>o</keycap
+></keycombo>
+ </shortcut>
+ <guimenu
+>File</guimenu>
+ <guimenuitem
+>Open</guimenuitem>
+ </menuchoice
+></term>
+ <listitem
+><para
+><action
+>Opens an existing composition from a Rosegarden-4 (.rg) file.</action
+></para
+></listitem>
+ </varlistentry>
+
+ <varlistentry id="commands-main-file-import">
+ <term
+><menuchoice>
+ <guimenu
+>File</guimenu>
+ <guimenuitem
+>Import</guimenuitem>
+ </menuchoice
+></term>
+ <listitem
+><para
+>This submenu contains functions for importing compositions from other file formats.</para>
+
+ <variablelist>
+
+ <varlistentry id="commands-main-file-import-midi">
+ <term
+><menuchoice>
+ <guimenu
+>Import</guimenu>
+ <guimenuitem
+>Import &MIDI; file...</guimenuitem>
+ </menuchoice
+></term>
+ <listitem
+><para
+><action
+>Creates a new composition from the contents of an existing &MIDI; (.mid) file.</action
+></para
+></listitem>
+ </varlistentry>
+
+ <varlistentry id="commands-main-file-import-rg21">
+ <term
+><menuchoice>
+ <guimenu
+>Import</guimenu>
+ <guimenuitem
+>Import Rosegarden 2.1 file...</guimenuitem>
+ </menuchoice
+></term>
+ <listitem
+><para
+><action
+>Creates a new composition from the contents of an existing Rosegarden 2.1 (.rose) file.</action
+></para
+></listitem>
+ </varlistentry>
+
+ </variablelist>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry id="commands-main-file-merge">
+ <term
+><menuchoice>
+ <guimenu
+>File</guimenu>
+ <guimenuitem
+>Merge</guimenuitem>
+ </menuchoice
+></term>
+ <listitem
+><para
+>This submenu contains functions for merging other files into the current composition.</para>
+
+ <variablelist>
+
+ <varlistentry id="commands-main-file-merge-file">
+ <term
+><menuchoice>
+ <guimenu
+>Merge</guimenu>
+ <guimenuitem
+>Merge File...</guimenuitem>
+ </menuchoice
+></term>
+ <listitem
+><para
+><action
+>Merges the contents of an existing Rosegarden (.rg) file into the current composition. You will be offered a choice of whether to merge the file in new tracks at the start of the composition, or after the end of the current composition.</action
+></para
+></listitem>
+ </varlistentry>
+
+ <varlistentry id="commands-main-file-merge-midi">
+ <term
+><menuchoice>
+ <guimenu
+>Merge</guimenu>
+ <guimenuitem
+>Merge &MIDI; file...</guimenuitem>
+ </menuchoice
+></term>
+ <listitem
+><para
+><action
+>Merges the contents of an existing &MIDI; (.mid) file into the current composition. You will be offered a choice of whether to merge the file in new tracks at the start of the composition, or after the end of the current composition.</action
+></para
+></listitem>
+ </varlistentry>
+
+ <varlistentry id="commands-main-file-merge-rg21">
+ <term
+><menuchoice>
+ <guimenu
+>Merge</guimenu>
+ <guimenuitem
+>Merge Rosegarden 2.1 file...</guimenuitem>
+ </menuchoice
+></term>
+ <listitem
+><para
+><action
+>Merges the contents of an existing Rosegarden 2.1 (.rose) file into the current composition. You will be offered a choice of whether to merge the file in new tracks at the start of the composition, or after the end of the current composition.</action
+></para
+></listitem>
+ </varlistentry>
+
+ </variablelist>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry id="commands-main-file-export">
+ <term
+><menuchoice>
+ <guimenu
+>File</guimenu>
+ <guimenuitem
+>Export</guimenuitem>
+ </menuchoice
+></term>
+ <listitem
+><para
+>This submenu contains functions for exporting the contents of compositions to other file formats.</para>
+
+ <variablelist>
+
+ <varlistentry id="commands-main-file-export-midi">
+ <term
+><menuchoice>
+ <guimenu
+>Export</guimenu>
+ <guimenuitem
+>Export &MIDI; file...</guimenuitem>
+ </menuchoice
+></term>
+ <listitem
+><para
+><action
+>Saves the contents of the current composition into a new &MIDI; file.</action
+> Note that not all data in the Rosegarden composition necessarily can or will be saved in the &MIDI; format.</para
+></listitem>
+ </varlistentry>
+
+ <varlistentry id="commands-main-file-export-csound">
+ <term
+><menuchoice>
+ <guimenu
+>Export</guimenu>
+ <guimenuitem
+>Export Csound score file...</guimenuitem>
+ </menuchoice
+></term>
+ <listitem
+><para
+><action
+>Saves the contents of the current composition into a new Csound score file.</action
+> Together with a suitable orchestra file (not supplied), this can be used to play the composition through <ulink url="http://www.csounds.com/"
+>Csound</ulink
+>. Note that not all data in the Rosegarden composition necessarily can or will be saved in the Csound format.</para
+></listitem>
+ </varlistentry>
+
+ <varlistentry id="commands-main-file-export-lilypond">
+ <term
+><menuchoice>
+ <guimenu
+>Export</guimenu>
+ <guimenuitem
+>Export Lilypond file...</guimenuitem>
+ </menuchoice
+></term>
+ <listitem
+><para
+><action
+>Saves the contents of the current composition into a new Lilypond file.</action
+> This can then be processed by the <ulink url="http://www.lilypond.org/"
+>Lilypond</ulink
+> system to produce typeset-quality music, although it is likely that the file may need some tweaking to get really good quality output. Note that not all data in the Rosegarden composition necessarily can or will be saved in the Lilypond format.</para
+></listitem>
+ </varlistentry>
+
+ <varlistentry id="commands-main-file-export-mup">
+ <term
+><menuchoice>
+ <guimenu
+>Export</guimenu>
+ <guimenuitem
+>Export Mup file...</guimenuitem>
+ </menuchoice
+></term>
+ <listitem
+><para
+><action
+>Saves the contents of the current composition into a new Mup file.</action
+> This can then be processed by the <ulink url="http://www.arkkra.com/"
+>Mup</ulink
+> music publication system, although it is likely that the file may need some tweaking to get really good quality output. Note that not all data in the Rosegarden composition necessarily can or will be saved in the Mup format.</para
+></listitem>
+ </varlistentry>
+
+ <varlistentry id="commands-main-file-export-musicxml">
+ <term
+><menuchoice>
+ <guimenu
+>Export</guimenu>
+ <guimenuitem
+>Export MusicXML file...</guimenuitem>
+ </menuchoice
+></term>
+ <listitem
+><para
+><action
+>Saves the contents of the current composition into a new MusicXML file.</action
+> This can then be used with any music software that supports the MusicXML format. Note that MusicXML support is experimental and has not been well tested. Not all data in the Rosegarden composition necessarily can or will be saved in the MusicXML format.</para
+></listitem>
+ </varlistentry>
+
+ </variablelist>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry id="commands-main-file-save">
+ <term
+><menuchoice>
+ <shortcut>
+ <keycombo
+><keycap
+>Ctrl</keycap
+><keycap
+>s</keycap
+></keycombo>
+ </shortcut>
+ <guimenu
+>File</guimenu>
+ <guimenuitem
+>Save</guimenuitem>
+ </menuchoice
+></term>
+ <listitem
+><para
+><action
+>Saves the composition.</action
+></para
+></listitem>
+ </varlistentry>
+
+ <varlistentry id="commands-main-file-save-as">
+ <term
+><menuchoice>
+ <guimenu
+>File</guimenu>
+ <guimenuitem
+>Save As...</guimenuitem>
+ </menuchoice
+></term>
+ <listitem
+><para
+><action
+>Saves the composition with a new filename.</action
+></para
+></listitem>
+ </varlistentry>
+
+ <varlistentry id="commands-main-file-close">
+ <term
+><menuchoice>
+ <shortcut>
+ <keycombo
+><keycap
+>Ctrl</keycap
+><keycap
+>w</keycap
+></keycombo>
+ </shortcut>
+ <guimenu
+>File</guimenu>
+ <guimenuitem
+>Close</guimenuitem>
+ </menuchoice
+></term>
+ <listitem
+><para
+><action
+>Closes the current composition.</action
+></para
+></listitem>
+ </varlistentry>
+
+ <varlistentry id="commands-main-file-print">
+ <term
+><menuchoice>
+ <shortcut>
+ <keycombo
+><keycap
+>Ctrl</keycap
+><keycap
+>p</keycap
+></keycombo>
+ </shortcut>
+ <guimenu
+>File</guimenu>
+ <guimenuitem
+>Print</guimenuitem>
+ </menuchoice
+></term>
+ <listitem
+><para
+><action
+>Prints the current composition.</action
+> At the time of writing, the print function is incomplete. We recommend using the <link linkend="commands-main-file-export-lilypond"
+>Export Lilypond file</link
+> function and printing with Lilypond instead.</para
+></listitem>
+ </varlistentry>
+
+ <varlistentry id="commands-main-file-quit">
+ <term
+><menuchoice>
+ <shortcut>
+ <keycombo
+><keycap
+>Ctrl</keycap
+><keycap
+>q</keycap
+></keycombo>
+ </shortcut>
+ <guimenu
+>File</guimenu>
+ <guimenuitem
+>Quit</guimenuitem>
+ </menuchoice
+></term>
+ <listitem
+><para
+><action
+>Quits &rosegarden;</action
+></para
+></listitem>
+ </varlistentry>
+
+ </variablelist>
+ </para>
+
+ </sect2>
+
+
+ <sect2>
+ <title
+>Edit menu</title>
+ <para>
+ <variablelist>
+
+ <varlistentry id="commands-main-edit-undo">
+ <term>
+ <menuchoice>
+ <shortcut>
+ <keycombo>
+ <keycap
+>Ctrl</keycap>
+ <keycap
+>z</keycap>
+ </keycombo>
+ </shortcut>
+ <guimenu
+>Edit</guimenu>
+ <guimenuitem
+>Undo</guimenuitem>
+ </menuchoice>
+ </term>
+ <listitem>
+ <para>
+ <action>
+ Reverses the last command performed.
+ </action>
+ </para>
+ </listitem>
+ </varlistentry
+>
+
+ <varlistentry id="commands-main-edit-redo">
+ <term>
+ <menuchoice>
+ <shortcut>
+ <keycombo>
+ <keycap
+>Ctrl</keycap>
+ <keycap
+>Shift</keycap>
+ <keycap
+>z</keycap>
+ </keycombo>
+ </shortcut>
+ <guimenu
+>Edit</guimenu>
+ <guimenuitem
+>Redo</guimenuitem>
+ </menuchoice>
+ </term>
+ <listitem>
+ <para>
+ <action>
+ Repeats the last command performed, following an undo.
+ </action>
+ </para>
+ </listitem>
+ </varlistentry
+>
+
+ <varlistentry id="commands-main-edit-cut">
+ <term>
+ <menuchoice>
+ <shortcut>
+ <keycombo>
+ <keycap
+>Ctrl</keycap>
+ <keycap
+>x</keycap>
+ </keycombo>
+ </shortcut>
+ <guimenu
+>Edit</guimenu>
+ <guimenuitem
+>Cut</guimenuitem>
+ </menuchoice>
+ </term>
+ <listitem>
+ <para>
+ <action>
+ Removes the currently selected segment from the
+ composition view and adds it to the clipboard. Note that
+ when you have selected a track, all segments in that track
+ are selected.
+ </action>
+ </para>
+ </listitem>
+ </varlistentry
+>
+
+ <varlistentry id="commands-main-edit-copy">
+ <term>
+ <menuchoice>
+ <shortcut>
+ <keycombo>
+ <keycap
+>Ctrl</keycap>
+ <keycap
+>c</keycap>
+ </keycombo>
+ </shortcut>
+ <guimenu
+>Edit</guimenu>
+ <guimenuitem
+>Copy</guimenuitem>
+ </menuchoice>
+ </term>
+ <listitem>
+ <para>
+ <action>
+ Removes the selected segments from the composition and
+ places them in the clipboard to replace any contents the
+ clipboard previously had.
+ </action
+>
+ Note that when you have selected a track, all segments in that track
+ are selected.
+ </para>
+ </listitem>
+ </varlistentry
+>
+
+
+ <varlistentry id="commands-main-edit-paste">
+ <term>
+ <menuchoice>
+ <shortcut>
+ <keycombo>
+ <keycap
+>Ctrl</keycap>
+ <keycap
+>v</keycap>
+ </keycombo>
+ </shortcut>
+ <guimenu
+>Edit</guimenu>
+ <guimenuitem
+>Paste</guimenuitem>
+ </menuchoice>
+ </term>
+ <listitem>
+ <para>
+ <action>
+ Inserts the contents of the clipboard into the composition.
+ Verbage hear stating where the contents are inserted
+ (current track, offset within that track etc).
+ </action>
+ </para>
+ </listitem>
+ </varlistentry
+>
+
+ <varlistentry id="commands-main-edit-delete">
+ <term>
+ <menuchoice>
+ <shortcut>
+ <keycombo>
+ <keycap
+>Delete</keycap>
+ </keycombo>
+ </shortcut>
+ <guimenu
+>Edit</guimenu>
+ <guimenuitem
+>Delete</guimenuitem>
+ </menuchoice>
+ </term>
+ <listitem>
+ <para>
+ <action>
+ Removes the selected segments from the composition and throws them away.
+ </action>
+ </para>
+ </listitem>
+ </varlistentry
+>
+
+
+ <varlistentry id="commands-main-edit-select-all-segments">
+ <term>
+ <menuchoice>
+ <guimenu
+>Edit</guimenu>
+ <guimenuitem
+>Select All Segments</guimenuitem>
+ </menuchoice>
+ </term>
+ <listitem>
+ <para>
+ <action>
+ Selects all segments within the composition.
+ </action>
+ </para>
+ </listitem>
+ </varlistentry
+>
+
+ <varlistentry id="commands-main-edit-add-tempo-change">
+ <term>
+ <menuchoice>
+ <guimenu
+>Edit</guimenu>
+ <guimenuitem
+>Add Tempo Change...</guimenuitem>
+ </menuchoice>
+ </term>
+ <listitem>
+ <para>
+ <action>
+ Invokes a tempo change dialog.
+ </action>
+ This offers a
+ selection of ways to change the tempo of the
+ composition, including changing the tempo from the
+ insert cursor position onwards, from the last
+ tempo change onwards, or for the entire
+ composition. See
+
+for more information.
+
+ </para>
+ </listitem>
+ </varlistentry
+>
+
+ <varlistentry id="commands-main-edit-add-time-signature">
+ <term>
+ <menuchoice>
+ <guimenu
+>Edit</guimenu>
+ <guimenuitem
+>Add Time Signature Change...</guimenuitem>
+ </menuchoice>
+ </term>
+ <listitem>
+ <para>
+ <action>
+ Invokes a time-signature change dialog.
+ </action>
+
+ This offers a
+ selection of ways to change the tempo of the
+ composition, including changing the time signature
+ from the insert cursor position onwards or from the
+ start of the current bar. See
+
+ for more information.
+
+ </para>
+ </listitem>
+ </varlistentry
+>
+
+
+ <varlistentry id="commands-main-edit-change-composition-duration">
+ <term>
+ <menuchoice>
+ <guimenu
+>Edit</guimenu>
+ <guimenuitem
+>Change Composition Duration...</guimenuitem>
+ </menuchoice>
+ </term>
+ <listitem>
+ <para>
+ <action>
+ Invokes a composition duration change dialog.
+ </action>
+
+ This allows you to change the overall duration of
+ the composition. This duration sets a hard limit
+ (as a number of bars) on the scrollable width of the
+ main window and the length of time you can play or
+ record before the composition is deemed to have
+ ended. The default is 100 bars.
+
+ </para>
+ </listitem>
+ </varlistentry
+>
+
+
+ <varlistentry id="commands-main-edit-document-properties">
+ <term>
+ <menuchoice>
+ <guimenu
+>Edit</guimenu>
+ <guimenuitem
+>Edit Document Properties...</guimenuitem>
+ </menuchoice>
+ </term>
+ <listitem>
+ <para>
+ <action>
+ Invokes a document properties dialog.
+ </action>
+
+ The document properties dialog allows you to review and/or modify the current document properties. Note - explain what are properties. Note to developers - It seems kinda weird to have icons on the left for selecting, and tabs in each one. Why not just tabs or just the things on the left?
+
+ </para>
+ </listitem>
+ </varlistentry
+>
+
+
+ </variablelist>
+ </para>
+ </sect2>
+
+ <sect2>
+ <title
+>Segments menu</title>
+ <para>
+ <variablelist>
+
+ <varlistentry id="commands-main-segments-open-default-editor">
+ <term>
+ <menuchoice>
+ <shortcut>
+ <keycombo>
+ <keycap
+>Return</keycap>
+ </keycombo>
+ </shortcut>
+ <guimenu
+>Segments</guimenu>
+ <guimenuitem
+>Open in Default Editor</guimenuitem>
+ </menuchoice>
+ </term>
+ <listitem>
+ <para>
+ <action
+> Opens all of the currently
+ selected segments together in a notation editor, or in
+ whichever other editor you have configured as your
+ default.
+ </action>
+ </para>
+ </listitem>
+ </varlistentry
+>
+
+ <varlistentry id="commands-main-segments-open-matrix-editor">
+ <term>
+ <menuchoice>
+ <guimenu
+>Segments</guimenu>
+ <guimenuitem
+>Open in Matrix Editor</guimenuitem>
+ </menuchoice>
+ </term>
+ <listitem>
+ <para>
+ <action
+> Opens all of the currently
+ selected segments in a matrix editor.
+ </action>
+ See <link linkend="matrix-view"
+>matrix editor</link
+>.
+ </para>
+ </listitem>
+ </varlistentry
+>
+
+ <varlistentry id="commands-main-segments-open-notation-editor">
+ <term>
+ <menuchoice>
+ <guimenu
+>Segments</guimenu>
+ <guimenuitem
+>Open in Notation Editor</guimenuitem>
+ </menuchoice>
+ </term>
+ <listitem>
+ <para>
+ <action
+> Opens all of the currently
+ selected segments together in a notation editor.
+ </action>
+ See <link linkend="notation-view"
+>notation editor</link
+>.
+ </para>
+ </listitem>
+ </varlistentry
+>
+
+ <varlistentry id="commands-main-segments-open-event-editor">
+ <term>
+ <menuchoice>
+ <guimenu
+>Segments</guimenu>
+ <guimenuitem
+>Open in Event List Editor</guimenuitem>
+ </menuchoice>
+ </term>
+ <listitem>
+ <para>
+ <action
+> Opens all of the currently
+ selected segments together in a event-list editor.
+ </action>
+ See <link linkend="event-view"
+>event-list editor</link
+>.
+ </para>
+ </listitem>
+ </varlistentry
+>
+
+
+ <varlistentry id="commands-main-segments-quantize">
+ <term>
+ <menuchoice>
+ <guimenu
+>Segments</guimenu>
+ <guimenuitem
+>Quantize...</guimenuitem>
+ </menuchoice>
+ </term>
+ <listitem>
+ <para>
+ <action
+>Invokes a quantization dialog for quantizing the current selection.
+ </action>
+ See <link linkend="nv-quantization"
+>quantization</link
+>.
+ </para>
+ </listitem>
+ </varlistentry
+>
+
+ <varlistentry id="commands-main-segments-rescale">
+ <term>
+ <menuchoice>
+ <guimenu
+>Segments</guimenu>
+ <guimenuitem
+>Rescale...</guimenuitem>
+ </menuchoice>
+ </term>
+ <listitem>
+ <para>
+ <action
+>Allows you to stretch or squash segments in time.
+ </action>
+
+ This option invokes a rescale dialog, which allows
+ you to specify a ratio of timings that is then
+ applied to the selected segments. This has the
+ result of stretching (slowing down) or squashing
+ (speeding up) the selected segments, changing their
+ durations accordingly.
+
+ </para>
+ <para>
+ This only applies to segments containing MIDI
+ events, not to audio segments. Rosegarden does not
+ currently provide native support for audio
+ time-stretching.
+ </para>
+ </listitem>
+ </varlistentry
+>
+
+ <varlistentry id="commands-main-segments-auto-split">
+ <term>
+ <menuchoice>
+ <guimenu
+>Segments</guimenu>
+ <guimenuitem
+>Auto-Split</guimenuitem>
+ </menuchoice>
+ </term>
+ <listitem>
+ <para>
+ <action>
+ Splits the selected segments on silences.
+ </action>
+
+ This function works slightly differently depending
+ on whether the selected segments contain audio or
+ MIDI data. For audio segments, it offers you a
+ dialog in which you can choose a threshold below
+ which the segment is considered "silent"; it then
+ splits the segment whenever its amplitude falls
+ below this threshold. For MIDI segments, it simply
+ splits the segment everywhere that a full bar of
+ silence occurs.
+ </para>
+ </listitem>
+ </varlistentry
+>
+
+ <varlistentry id="commands-main-segments-split-by-pitch">
+ <term>
+ <menuchoice>
+ <guimenu
+>Segments</guimenu>
+ <guimenuitem
+>Split by Pitch...</guimenuitem>
+ </menuchoice>
+ </term>
+ <listitem>
+ <para>
+ <action
+>Splits the currently selected segments into higher and
+ lower parts.
+ </action>
+
+ This function invokes a dialog allowing you to
+ choose a pitch as a "split point", and then splits
+ the selected segments in half with all the notes on
+ or above that split point in the "higher" segment
+ and all the notes below it in the "lower".
+
+ </para>
+ <para>
+ If the music in the segment consists of two separate
+ parts (e.g. left and right hand piano parts) that
+ are not always completely on either side of a single
+ split point, you may with to select the "ranging
+ split-point" option. If this is selected,
+ Rosegarden will attempt to track the two parts as
+ they move up and down, usually doing a slightly
+ better job of separating out notes that were
+ intended to lie in the two separate parts.
+
+ </para>
+ <para>
+ The resulting segments are both created on the same
+ track, with one overlapping the other.
+
+ </para>
+ </listitem>
+ </varlistentry
+>
+
+
+
+
+ </variablelist>
+ </para>
+ </sect2>
+ </sect1>
+
+ <sect1 id="commands-nv">
+ <title
+>Notation editor</title>
+ <para
+></para>
+
+
+ <sect2 id="commands-nv-menu-file">
+ <title
+>File menu</title>
+ <para>
+ <variablelist>
+
+ <varlistentry id="commands-nv-menu-file-close">
+ <term
+><menuchoice>
+ <shortcut>
+ <keycombo
+><keycap
+>Ctrl</keycap
+><keycap
+>w</keycap
+></keycombo>
+ </shortcut>
+ <guimenu
+>File</guimenu>
+ <guimenuitem
+>Close</guimenuitem>
+ </menuchoice
+></term>
+ <listitem
+><para
+><action
+>Closes the window</action
+></para
+></listitem>
+ </varlistentry>
+
+ </variablelist>
+ </para>
+
+ </sect2>
+
+ <sect2 id="commands-nv-menu-edit">
+ <title
+>Edit menu</title>
+ <para>
+ <variablelist>
+
+ <varlistentry id="commands-nv-menu-edit-undo">
+ <term
+><menuchoice>
+ <shortcut>
+ <keycombo
+><keycap
+>Ctrl</keycap
+><keycap
+>z</keycap
+></keycombo>
+ </shortcut>
+ <guimenu
+>Edit</guimenu>
+ <guimenuitem
+>Undo</guimenuitem>
+ </menuchoice
+></term>
+ <listitem>
+ <para>
+ <action>
+
+ Reverses the last edit.
+
+ </action
+> Edits are shared across
+ all views, so if the last edit was not made in
+ this view, undoing it might not appear to change
+ this view either.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry id="commands-nv-menu-edit-redo">
+ <term
+><menuchoice>
+ <shortcut>
+ <keycombo
+><keycap
+>Ctrl</keycap
+><keycap
+>Shift</keycap
+><keycap
+>z</keycap
+></keycombo>
+ </shortcut>
+ <guimenu
+>Edit</guimenu>
+ <guimenuitem
+>Redo</guimenuitem>
+ </menuchoice
+></term>
+ <listitem>
+ <para>
+ <action>
+
+ Repeats the last edit, following an undo.
+
+ </action>
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry id="commands-nv-menu-edit-cut">
+ <term
+><menuchoice>
+ <shortcut>
+ <keycombo
+><keycap
+>Ctrl</keycap
+><keycap
+>x</keycap
+></keycombo>
+ </shortcut>
+ <guimenu
+>Edit</guimenu>
+ <guimenuitem
+>Cut</guimenuitem>
+ </menuchoice
+></term>
+ <listitem>
+ <para>
+ <action>
+
+ Removes the selected events from the composition
+ and places them in the clipboard to replace any
+ contents the clipboard previously had.
+
+ </action>
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry id="commands-nv-menu-edit-copy">
+ <term
+><menuchoice>
+ <shortcut>
+ <keycombo
+><keycap
+>Ctrl</keycap
+><keycap
+>c</keycap
+></keycombo>
+ </shortcut>
+ <guimenu
+>Edit</guimenu>
+ <guimenuitem
+>Copy</guimenuitem>
+ </menuchoice
+></term>
+ <listitem>
+ <para>
+ <action>
+
+ Copies the selected events to the clipboard
+ to replace any contents the clipboard previously had.
+
+ </action>
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry id="commands-nv-menu-edit-paste">
+ <term
+><menuchoice>
+ <shortcut>
+ <keycombo
+><keycap
+>Ctrl</keycap
+><keycap
+>v</keycap
+></keycombo>
+ </shortcut>
+ <guimenu
+>Edit</guimenu>
+ <guimenuitem
+>Paste</guimenuitem>
+ </menuchoice
+></term>
+ <listitem>
+ <para>
+ <action>
+
+ Copies the contents of the clipboard to the
+ location of the insert cursor in the current
+ composition.
+
+ </action>
+
+ The clipboard must not contain
+ multiple segments, and there must be enough
+ space (occupied only by rests) starting at
+ the insert cursor position to accommodate the
+ clipboard's contents.
+
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry id="commands-nv-menu-edit-cut-and-close">
+ <term
+><menuchoice>
+ <shortcut>
+ <keycombo
+><keycap
+>Ctrl</keycap
+><keycap
+>Shift</keycap
+><keycap
+>x</keycap
+></keycombo>
+ </shortcut>
+ <guimenu
+>Edit</guimenu>
+ <guimenuitem
+>Cut and Close</guimenuitem>
+ </menuchoice
+></term>
+ <listitem>
+ <para>
+ <action>
+
+ Removes the selected events from the composition
+ and places them in the clipboard to replace any
+ contents the clipboard previously had, and closes
+ the gap left behind by moving all subsequent
+ events towards the beginning of the composition.
+
+ </action>
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry id="commands-nv-menu-edit-paste-dot-dot-dot">
+ <term
+><menuchoice>
+ <shortcut>
+ <keycombo
+><keycap
+>Ctrl</keycap
+><keycap
+>Shift</keycap
+><keycap
+>v</keycap
+></keycombo>
+ </shortcut>
+ <guimenu
+>Edit</guimenu>
+ <guimenuitem
+>Paste...</guimenuitem>
+ </menuchoice
+></term>
+ <listitem>
+ <para>
+ <action>
+
+ Provides a choice of paste mechanisms with the
+ ability to set one as the default for use in the
+ Paste menu function.
+
+ </action>
+
+ See the section on <link linkend="nv-paste-types"
+>Paste types</link
+> for more information.
+
+ </para>
+ </listitem>
+ </varlistentry>
+
+
+ <varlistentry id="commands-nv-menu-edit-delete">
+ <term
+><menuchoice>
+ <shortcut>
+ <keycombo
+><keycap
+>Del</keycap
+></keycombo>
+ </shortcut>
+ <guimenu
+>Edit</guimenu>
+ <guimenuitem
+>Delete</guimenuitem>
+ </menuchoice
+></term>
+ <listitem>
+ <para>
+ <action>
+ Removes the selected events from the composition
+ and throws them away.
+ </action>
+ </para>
+ </listitem>
+ </varlistentry>
+
+
+ <varlistentry id="commands-nv-menu-edit-select-from-start">
+ <term
+><menuchoice>
+ <guimenu
+>Edit</guimenu>
+ <guimenuitem
+>Select from Start</guimenuitem>
+ </menuchoice
+></term>
+ <listitem>
+ <para>
+ <action>
+ Extends the current selection by selecting
+ all events from the start of the staff up to the
+ current selection (or up to the insert cursor,
+ if no events are currently selected).
+ </action>
+ </para>
+ </listitem>
+ </varlistentry>
+
+
+ <varlistentry id="commands-nv-menu-edit-select-to-end">
+ <term
+><menuchoice>
+ <guimenu
+>Edit</guimenu>
+ <guimenuitem
+>Select to End</guimenuitem>
+ </menuchoice
+></term>
+ <listitem>
+ <para>
+ <action>
+ Extends the current selection by selecting
+ all events from the end of the current selection
+ (or from the insert cursor, if no events are
+ currently selected) up to the end of the staff.
+ </action>
+ </para>
+ </listitem>
+ </varlistentry>
+
+
+ <varlistentry id="commands-nv-menu-edit-select-whole-staff">
+ <term
+><menuchoice>
+ <guimenu
+>Edit</guimenu>
+ <guimenuitem
+>Select Whole Staff</guimenuitem>
+ </menuchoice
+></term>
+ <listitem>
+ <para>
+ <action>
+ Selects all the events on the current staff.
+ </action>
+ </para>
+ </listitem>
+ </varlistentry>
+
+
+ <varlistentry id="commands-nv-menu-edit-clear-selection">
+ <term
+><menuchoice>
+ <shortcut>
+ <keycombo
+><keycap
+>Esc</keycap
+></keycombo>
+ </shortcut>
+ <guimenu
+>Edit</guimenu>
+ <guimenuitem
+>Clear Selection</guimenuitem>
+ </menuchoice
+></term>
+ <listitem>
+ <para>
+ <action>
+ Unselects all events.
+ </action>
+ </para>
+ </listitem>
+ </varlistentry>
+
+
+ <varlistentry id="commands-nv-menu-edit-filter-selection">
+ <term
+><menuchoice>
+ <guimenu
+>Edit</guimenu>
+ <guimenuitem
+>Filter Selection</guimenuitem>
+ </menuchoice
+></term>
+ <listitem>
+ <para>
+ <action>
+ Invokes an event filter dialog.
+ </action>
+ This offers you the ability to filter a range of events in
+ any of several categories out of your selection.
+ </para>
+ <para>
+ <screenshot>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="rg-eventfilter.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase
+>The event filter dialog</phrase>
+ </textobject>
+ </mediaobject>
+ </screenshot>
+ </para>
+ <para>
+ All ranges may be either inclusive or exclusive.
+ </para>
+ <para>
+ An inclusive range will remove events on either side of it
+ from the selection. You can use this, for example, to
+ filter everything below middle C and above the A above
+ middle C out of your selection.
+ </para>
+ <para>
+ An exclusive range will remove the events within the range
+ itself, leaving everything on either side of it selected.
+ Using the same search points as in the previous example,
+ you would use an exclusive range to remove everything
+ between middle C and the A above middle C from your
+ selection, while leaving everything above and below that
+ range selected.
+ </para>
+ <para>
+ Once your selection has been filtered, you can manipulate
+ it by any conventional means.
+ </para>
+ </listitem>
+ </varlistentry>
+
+
+ <varlistentry id="commands-nv-menu-edit-add-tempo">
+ <term
+><menuchoice>
+ <guimenu
+>Edit</guimenu>
+ <guimenuitem
+>Add Tempo Change...</guimenuitem>
+ </menuchoice
+></term>
+ <listitem>
+ <para>
+ <action>
+ Invokes a tempo change dialog.
+ </action>
+ This offers a
+ selection of ways to change the tempo of the
+ composition, including changing the tempo from the
+ insert cursor position onwards, from the last
+ tempo change onwards, or for the entire
+ composition. See
+
+for more information.
+ </para>
+ </listitem>
+ </varlistentry>
+
+
+ <varlistentry id="commands-nv-menu-edit-add-time-signature">
+ <term
+><menuchoice>
+ <guimenu
+>Edit</guimenu>
+ <guimenuitem
+>Add Time Signature Change...</guimenuitem>
+ </menuchoice
+></term>
+ <listitem>
+ <para>
+ <action>
+
+ Invokes a time-signature change dialog.
+
+ </action>
+
+ This offers a
+ selection of ways to change the tempo ofthe
+ composition, including changing the time signature
+ from the insert cursor position onwards or from the
+ start of the current bar. See
+Changing the Time Signature
+
+ for more information.
+
+ </para>
+ </listitem>
+ </varlistentry>
+
+
+ <varlistentry id="commands-nv-menu-edit-add-clef">
+ <term
+><menuchoice>
+ <guimenu
+>Edit</guimenu>
+ <guimenuitem
+>Add Clef Change...</guimenuitem>
+ </menuchoice
+></term>
+ <listitem>
+ <para>
+ <action>
+
+ Invokes a clef selection dialog, and inserts the
+ chosen clef at the current insert cursor position.
+
+ </action>
+
+ The dialog allows you to choose a clef, but also
+ to choose how you want the clef to be applied, in
+ cases where there are already some notes following
+ the point where the clef is to be inserted. You
+ must choose one of the following:
+
+ <variablelist>
+
+ <varlistentry>
+ <term
+>Maintain current pitches</term>
+ <listitem>
+ <para>
+ Any notes following the clef will keep
+ their current performance pitches.
+ </para>
+ <para>
+ For example, inserting a
+ tenor clef in the middle of a previously
+ treble-clef section will cause the notes following
+ the clef to be moved an octave
+ higher up the staff, because they will still have
+ their treble-clef pitches.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>Transpose into appropriate octave</term>
+ <listitem>
+ <para>
+ Any notes following the clef will
+ retain their pitch within the octave, but
+ may be moved into a different octave to
+ match the new clef, and therefore will play
+ at a new pitch.
+ </para>
+ <para>
+ For example, inserting a tenor clef in the
+ middle of a previously treble-clef section
+ will cause the notes following the clef to
+ move by one staff line only to adjust to the new
+ clef, but to play an octave lower than before.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ </variablelist>
+
+ </para>
+ </listitem>
+ </varlistentry>
+
+
+ <varlistentry id="commands-nv-menu-edit-add-key-signature">
+ <term
+><menuchoice>
+ <guimenu
+>Edit</guimenu>
+ <guimenuitem
+>Add Key Change...</guimenuitem>
+ </menuchoice
+></term>
+ <listitem>
+ <para>
+ <action>
+
+ </action>
+ </para>
+ </listitem>
+ </varlistentry>
+
+
+ </variablelist>
+ </para>
+
+ </sect2>
+
+ <sect2 id="commands-nv-menu-group">
+ <title
+>Group menu</title>
+ <para>
+ <variablelist>
+
+
+ <varlistentry id="commands-nv-menu-group-beam">
+ <term
+><menuchoice>
+ <guimenu
+>Group</guimenu>
+ <guimenuitem
+>Beam Group</guimenuitem>
+ </menuchoice
+></term>
+ <listitem>
+ <para>
+ <action>
+ Makes the selected notes into a beamed group.
+ </action>
+ </para>
+ </listitem>
+ </varlistentry>
+
+
+ <varlistentry id="commands-nv-menu-group-auto-beam">
+ <term
+><menuchoice>
+ <guimenu
+>Group</guimenu>
+ <guimenuitem
+>Auto-Beam</guimenuitem>
+ </menuchoice
+></term>
+ <listitem>
+ <para>
+ <action>
+ Scans the area covered by the selection and attempts
+ to group short notes into plausible beamed groups.
+ </action>
+ </para>
+ </listitem>
+ </varlistentry>
+
+
+ <varlistentry id="commands-nv-menu-group-break-group">
+ <term
+><menuchoice>
+ <guimenu
+>Group</guimenu>
+ <guimenuitem
+>Unbeam</guimenuitem>
+ </menuchoice
+></term>
+ <listitem>
+ <para>
+ <action>
+ Removes the selected notes from any beamed groups
+ they may be part of, leaving them as separate
+ individuals.
+ </action>
+ If part of a beamed group is selected, the unselected
+ part of the group will remain beamed.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry id="commands-nv-menu-group-tuplet">
+ <term
+><menuchoice>
+ <guimenu
+>Group</guimenu>
+ <guimenuitem
+>Tuplet</guimenuitem>
+ </menuchoice
+></term>
+ <listitem>
+ <para>
+ <action>
+ Makes a triplet or other tuplet group.
+ </action>
+ This function allows you to adjust the timing of a
+ short section of music in the ratio of two
+ durations, for example to indicate that three notes
+ should be played in the time of two (the classic
+ triplet), or nine in the time of six, or whatever.
+ You can set this ratio in a dialog box when you
+ invoke the function.
+ </para>
+ <para>
+ If you have selected some events before invoking the
+ function, it will assume that you want to make a
+ tuplet group out of the selected region (or as close
+ to its duration as possible) and will adjust the
+ default values available in the dialog accordingly.
+ </para>
+ </listitem>
+ </varlistentry>
+
+
+ <varlistentry id="commands-nv-menu-group-simple-tuplet">
+ <term
+><menuchoice>
+ <guimenu
+>Group</guimenu>
+ <guimenuitem
+>Simple Tuplet</guimenuitem>
+ </menuchoice
+></term>
+ <listitem>
+ <para>
+ <action>
+
+ Makes a tuplet group (normally of triplets) with
+ the most apparently obvious ratio of durations.
+
+ </action>
+ Usually this function will attempt to make a triplet
+ group starting at the current insert cursor, or if
+ some events are selected, will attempt to make them
+ into triplets. It is possible that it might end up
+ making non-triplet groups if there is no obvious
+ valid triplet arrangement.
+ </para>
+ </listitem>
+ </varlistentry>
+
+
+ <varlistentry id="commands-nv-menu-group-grace">
+ <term
+><menuchoice>
+ <guimenu
+>Group</guimenu>
+ <guimenuitem
+>Make Grace Notes</guimenuitem>
+ </menuchoice
+></term>
+ <listitem>
+ <para>
+ <action>
+ Converts the selected notes into grace notes.
+ </action>
+ </para>
+ </listitem>
+ </varlistentry>
+
+
+
+ <varlistentry id="commands-nv-menu-group-ungrace">
+ <term
+><menuchoice>
+ <guimenu
+>Group</guimenu>
+ <guimenuitem
+>Ungrace</guimenuitem>
+ </menuchoice
+></term>
+ <listitem>
+ <para>
+ <action>
+ Converts any grace notes in the selection to
+ normal notes.
+ </action>
+ </para>
+ </listitem>
+ </varlistentry>
+
+
+
+ <varlistentry id="commands-nv-menu-group-slur">
+ <term
+><menuchoice>
+ <guimenu
+>Group</guimenu>
+ <guimenuitem
+>Slur</guimenuitem>
+ </menuchoice
+></term>
+ <listitem>
+ <para>
+ <action>
+ Adds a slur across the selected notes.
+ </action>
+ To remove the slur, click on it
+ with the erase tool just as you would for a note.
+ </para>
+ </listitem>
+ </varlistentry>
+
+
+
+ <varlistentry id="commands-nv-menu-group-crescendo">
+ <term
+><menuchoice>
+ <guimenu
+>Group</guimenu>
+ <guimenuitem
+>Crescendo</guimenuitem>
+ </menuchoice
+></term>
+ <listitem>
+ <para>
+ <action>
+ Adds a crescendo (opening hairpin) indication
+ across the selected notes.
+ </action>
+ To remove the crescendo indication, click on it
+ with the erase tool just as you would for a note.
+ </para>
+ </listitem>
+ </varlistentry>
+
+
+
+ <varlistentry id="commands-nv-menu-group-decrescendo">
+ <term
+><menuchoice>
+ <guimenu
+>Group</guimenu>
+ <guimenuitem
+>Decrescendo</guimenuitem>
+ </menuchoice
+></term>
+ <listitem>
+ <para>
+ <action>
+ Adds a decrescendo (closing hairpin) indication
+ across the selected notes.
+ </action>
+ To remove the decrescendo indication, click on it
+ with the erase tool just as you would for a note.
+ </para>
+ </listitem>
+ </varlistentry>
+
+
+ </variablelist>
+ </para>
+
+ </sect2>
+
+ <sect2 id="commands-nv-menu-notes">
+ <title
+>Notes menu</title>
+ <para>
+ <variablelist>
+
+ <varlistentry id="commands-nv-menu-notes-">
+ <term
+><menuchoice>
+ <guimenu
+>Notes</guimenu>
+ <guimenuitem
+></guimenuitem>
+ </menuchoice
+></term>
+ <listitem>
+ <para>
+ <action>
+
+ </action>
+ </para>
+ </listitem>
+ </varlistentry>
+
+
+ <varlistentry id="commands-nv-menu-notes-style-actionmenu">
+ <term
+><menuchoice>
+ <guimenu
+>Notes</guimenu>
+ <guimenuitem
+>Note Style</guimenuitem>
+ </menuchoice
+></term>
+ <listitem>
+ <para>
+ <action>
+ Change the note style of the selected notes.
+ </action>
+ This submenu contains an entry for each of the <link
+ linkend="nv-note-styles"
+>note
+ styles</link
+> that are currently available. Choosing one
+ will change the note style of the selected notes to
+ that style.
+ </para>
+ </listitem>
+ </varlistentry>
+
+
+ <varlistentry id="commands-nv-menu-notes-stems">
+ <term
+><menuchoice>
+ <guimenu
+>Notes</guimenu>
+ <guimenuitem
+>Stem Direction</guimenuitem>
+ </menuchoice
+></term>
+ <listitem>
+ <para>
+ <action>
+ Change the stem
+ direction of the selected notes.
+ </action>
+ This submenu allows you to specify that all the
+ <link linkend="nv-note-qualities"
+>stems</link
+> of
+ the selected notes should point up or down, plus an
+ entry to reset the stem directions to those that
+ Rosegarden originally chose for the notes.
+ </para>
+ </listitem>
+ </varlistentry>
+
+
+ <varlistentry id="commands-nv-menu-notes-slashes">
+ <term
+><menuchoice>
+ <guimenu
+>Notes</guimenu>
+ <guimenuitem
+>Slashes</guimenuitem>
+ </menuchoice
+></term>
+ <listitem>
+ <para>
+ <action>
+ Add diagonal
+ slashes across the selected notes' stems.
+ </action>
+ This submenu allows you to choose a number of
+ diagonal strokes or <link linkend="nv-note-qualities"
+>slashes</link
+> to be drawn across the
+ stems of each of the selected notes. These may be
+ used, for example, to indicate repetition or rolls
+ to a human reader. They do not (yet) affect
+ performance using Rosegarden.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ </variablelist>
+ </para>
+
+ </sect2>
+
+ <sect2 id="commands-nv-menu-marks">
+ <title
+>Marks menu</title>
+ <para>
+ <variablelist>
+ <varlistentry>
+ <term
+><menuchoice>
+ <guimenu
+>blah</guimenu>
+ <guimenuitem
+>blah</guimenuitem>
+ </menuchoice
+></term>
+ <listitem>
+ <para
+>to be continued</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </para>
+
+ </sect2>
+
+ <sect2 id="commands-nv-menu-transforms">
+ <title
+>Transforms menu</title>
+ <para>
+ <variablelist>
+
+ <varlistentry id="commands-nv-menu-transforms-normalize-rests">
+ <term
+><menuchoice>
+ <guimenu
+>Transforms</guimenu>
+ <guimenuitem
+>Normalize Rests</guimenuitem>
+ </menuchoice
+></term>
+ <listitem>
+ <para>
+ <action
+>Makes the rests in the selection
+ theoretically correct.</action>
+
+ This function examines each sequence of consecutive
+ rests found in the selection, and adjusts, splits
+ and merges rests as necessary to ensure that the
+ rests have theoretically correct durations and fall
+ on the correct boundaries.
+ </para>
+
+ <para
+>For example, a 4/4 bar containing a crotchet
+ (quarter-note), then a minim (half-note) rest and a
+ crotchet rest will be rearranged to place the crotchet
+ rest first, as the minim rest should not cross the
+ central beat boundary of the bar.
+ </para>
+
+ <para
+>This function is also useful in occasional
+ situations where Rosegarden has made a bad job of
+ maintaining the rests correctly within a bar, for
+ example when editing imported &MIDI; data. Normalizing
+ the rests will usually make the arrangement of notes
+ in such a situation a bit clearer. (Rosegarden always
+ normalizes the rests as a matter of course when
+ importing or recording &MIDI;, but things can sometimes
+ get muddled up again.)</para>
+
+ </listitem>
+ </varlistentry>
+
+ <varlistentry id="commands-nv-menu-transforms-collapse-rests">
+ <term
+><menuchoice>
+ <guimenu
+>Transforms</guimenu>
+ <guimenuitem
+>Collapse Rests</guimenuitem>
+ </menuchoice
+></term>
+ <listitem>
+ <para>
+ <action
+>Makes multiple short rests into fewer longer
+ ones.</action>
+
+ This function merges consecutive rests into longer
+ rests, wherever possible. That is, wherever two
+ consecutive rests in the selection are found to have
+ a total duration expressible as a single longer
+ rest, they will be merged.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry id="commands-nv-menu-transforms-collapse-notes">
+ <term
+><menuchoice>
+ <guimenu
+>Transforms</guimenu>
+ <guimenuitem
+>Collapse Equal-Pitch Notes</guimenuitem>
+ </menuchoice
+></term>
+ <listitem>
+ <para>
+ <action
+>Makes multiple short notes into fewer longer
+ ones.</action>
+
+ This function merges consecutive notes into longer
+ notes, wherever possible. That is, wherever two
+ consecutive notes of equal pitch in the selection
+ are found to have a total duration expressible as a
+ single longer note, they will be merged.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry id="commands-nv-menu-transforms-tie-notes">
+ <term
+><menuchoice>
+ <guimenu
+>Transforms</guimenu>
+ <guimenuitem
+>Tie Equal-Pitch Notes</guimenuitem>
+ </menuchoice
+></term>
+ <listitem>
+ <para
+><action
+>Ties consecutive notes whenever possible.</action>
+
+ This function ties together any consecutive notes of
+ equal pitch found in the selection. Tied notes are
+ shown with a curved line joining the note heads, and
+ are played as a single long note.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry id="commands-nv-menu-transforms-untie-notes">
+ <term
+><menuchoice>
+ <guimenu
+>Transforms</guimenu>
+ <guimenuitem
+>Untie Notes</guimenuitem>
+ </menuchoice
+></term>
+ <listitem>
+ <para
+><action
+>Breaks ties between notes.</action>
+
+ Any tied notes found in the selection are untied,
+ and will subsequently be played as separate
+ notes.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry id="commands-nv-menu-transforms-make-viable">
+ <term
+><menuchoice>
+ <guimenu
+>Transforms</guimenu>
+ <guimenuitem
+>Make Notes Viable</guimenuitem>
+ </menuchoice
+></term>
+ <listitem>
+ <para
+><action
+>Splits notes at displayable
+ durations.</action
+> This function is intended to deal
+ with notes that have excessively long durations that
+ overflow barlines or that are too long to be displayed
+ as a single note. It takes any such notes and splits
+ them into shorter, tied notes.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry id="commands-nv-menu-transforms-de-counterpoint">
+ <term
+><menuchoice>
+ <guimenu
+>Transforms</guimenu>
+ <guimenuitem
+>De-Counterpoint</guimenuitem>
+ </menuchoice
+></term>
+ <listitem>
+ <para
+><action
+>Turns counterpoint into a series of split-and-tied notes and chords.</action>
+
+ &rosegarden; has no explicit support for counterpoint
+ (multiple lines of notes edited separately on the
+ same staff), but it will do its best to approximate
+ it when it finds notes in a segment that are
+ apparently contrapuntal, i.e. that overlap but that
+ are not precise enough to be treated as chords. For
+ example, when a short note starts shortly after a
+ longer note, Rosegarden will show the longer note
+ and a short <quote
+>spacing</quote
+> rest together, followed by the
+ shorter note. Unfortunately this often isn't what
+ you want.
+ </para>
+
+ <para
+>The De-Counterpoint function can be applied to a
+ selection that contains overlapping notes. It will
+ split overlapping notes at the point where they
+ overlap, and tie together the resulting split notes,
+ ensuring that the music takes the form of a series of
+ chords and/or single notes starting and ending in neat
+ blocks, with some notes possibly tied.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry id="commands-nv-menu-transforms-quantize">
+ <term
+><menuchoice>
+ <guimenu
+>Transforms</guimenu>
+ <guimenuitem
+>Quantize...</guimenuitem>
+ </menuchoice
+></term>
+ <listitem>
+ <para
+><action
+>Quantizes the selection.</action
+></para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry id="commands-nv-menu-transforms-fix-smoothing">
+ <term
+><menuchoice>
+ <guimenu
+>Transforms</guimenu>
+ <guimenuitem
+>Fix Smoothed Values</guimenuitem>
+ </menuchoice
+></term>
+ <listitem>
+ <para
+><action
+>Makes the note durations in the current
+ view permanent.</action>
+
+ When notating recorded or performance &MIDI;,
+ Rosegarden usually has to round off the durations of
+ some notes so that they can be displayed as normal
+ note types. This is known as <link
+ linkend="nv-quantization"
+>smoothing</link
+>, and it
+ normally does not affect the notes actually played,
+ it's just a convenience for display. The Fix
+ Smoothed Values function takes the current smoothed
+ note durations and sets them such that they are used
+ for performance (and editing in the matrix view,
+ etc) as well as for notation.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry id="commands-nv-menu-transforms-interpret">
+ <term
+><menuchoice>
+ <guimenu
+>Transforms</guimenu>
+ <guimenuitem
+>Interpret...</guimenuitem>
+ </menuchoice
+></term>
+ <listitem>
+ <para
+><action
+>Modifies the velocities and timings of
+ notes according to any written or indicated dynamics
+ found.</action
+> The selection of interpretations
+ available is as follows:
+
+ <variablelist>
+ <varlistentry>
+ <term
+>Apply text dynamics (p, mf, ff etc)
+ </term>
+ <listitem
+><para
+> Sets a velocity to each note
+ based on the last piece of text of "Dynamic"
+ type seen on the same staff (only texts of the
+ form pp, p, mp, mf, f, ff, fff etc are matched).
+ </para
+></listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>Apply hairpin dynamics
+ </term>
+ <listitem
+><para
+> Makes the notes gradually
+ increase or decrease in velocity during a
+ crescendo or decrescendo hairpin.
+ </para
+></listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>
+ Stress beats
+ </term>
+ <listitem
+><para
+> Makes notes that land on bar or
+ beat boundaries slightly louder (greater
+ velocity) than the surrounding notes.
+ </para
+></listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>
+ Articulate slurs, staccato, tenuto etc
+ </term>
+ <listitem
+><para
+> Shortens unslurred notes,
+ shortens staccato notes more, and gives notes
+ inside slurs and tenuto notes their full length.
+ </para
+></listitem>
+ </varlistentry>
+ </variablelist>
+
+ </para>
+
+ </listitem>
+ </varlistentry>
+
+ <varlistentry id="commands-nv-menu-transforms-transpose">
+ <term
+><menuchoice>
+ <guimenu
+>Transforms</guimenu>
+ <guimenuitem
+>Transpose</guimenuitem>
+ </menuchoice
+></term>
+ <listitem>
+ <para
+><action
+>Alters the pitch of the selected
+ notes.</action
+> This submenu contains basic
+ transposition functions which move the selected notes
+ up or down a semitone or a whole octave in pitch, as
+ well as a general transpose function that allows you
+ to choose how far up or down you want to transpose the
+ selection.
+ </para>
+
+ <para
+>These functions simply change the stored pitches
+ of the notes in the selection, so that they both play
+ and appear at the new pitches. They do not deal with
+ performance transposition (displaying one pitch and
+ playing another), for which see the main window's
+ segment parameter box; nor do they help you with
+ transposing from one key into another, for which see
+ the <link
+ linkend="commands-nv-menu-edit-add-key-signature"
+>key
+ change</link
+> function.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ </variablelist>
+ </para>
+
+ </sect2>
+
+
+ </sect1>
+ </chapter>
+
+-->
+
+
+ <!--
+ **********************************
+
+ PART III:
+ Technical material
+
+ **********************************
+ -->
+
+ <chapter id="developers">
+ <title
+>Anpassa Rosegarden</title>
+
+ <sect1 id="developers-note-fonts">
+ <title
+>Anpassa egna notteckensnitt</title>
+
+ <para
+>Om du har ett notteckensnitt installerat på systemet med ett skalbart format (Truetype eller Typ-1) men den för närvarande inte stöds av Rosegarden, kan du skapa din egen XML-avbildningsfil för att beskriva teckensnittets teckenavbildning och mått på ett sätt som Rosegarden kan använda. Filerna installeras i underkatalogen fonts/mappings i Rosegardens installationskatalog, och ett antal exempel ingår i distributionen.</para>
+
+ <para
+>Du kan också använda avbildningsfilerna för att definiera nya teckensnitt baserade på punktavbildning, där varje form av en viss storlek laddas från en separat punktavbildningsfil. De två standardteckensnitten för notskrift som levereras med Rosegarden-4 är punktavbildade teckensnitt som definierats exakt på detta sätt. </para>
+
+ <para
+>Det är till och med möjligt att definiera ett notteckensnitt att använda en eller flera skalbara systemteckensnitt, förbättrade med punktavbildningar för vissa storlekar eller för tecken som inte finns i de skalbara teckensnitten. Det går eftersom det mesta av avbildningsfilernas format är samma för skalbara och punktavbildade teckensnitt, och när det finns olika element för olika sorters teckensnitt är det oftast möjligt att inkludera båda. Rosegarden använder oftast punktavbildningar om de är tillgängliga, och annars skalbara teckensnitt. </para>
+
+ <para
+>Du kanske också vill redigera avbildningsfilerna som levereras med Rosegarden om du tycker att deras mått för justering eller storlek inte passar dig. (Om du tycker att någon av filerna som levereras är felaktig på något sätt, tala gärna om det för oss.) </para>
+
+ <sect2 id="developers-note-fonts-codes-glyphs">
+ <title
+>Koder och glyfer</title>
+
+ <para
+></para>
+ </sect2>
+
+ <sect2 id="developers-note-fonts-mapping-format">
+ <title
+>XML-format för avbildning av notteckensnitt</title>
+
+ <para
+>Här är en översikt över XML-elementen som kan användas i en teckensnittsavbildningsfil.</para>
+
+ <sect3 id="developers-note-fonts-mapping-format-font-encoding">
+ <title
+>rosegarden-font-encoding</title>
+
+ <para
+>Elementet måste finnas i varje avbildningsfil, och ska innehålla alla övriga element. Det enda attributet är "name" som innehåller teckensnittets namn som visas i kombinationsrutan för teckensnittsval. Även om filformatet tillåter att vilket namn som helst används här, hittar Rosegarden bara teckensnittet på ett riktigt sätt om XML-filen har samma namn som det här attributets innehåll (utom att XML-filen ska namnges med små bokstäver och ska sluta med ".xml"). </para>
+ </sect3>
+
+ <sect3 id="developers-note-fonts-mapping-format-font-information">
+ <title
+>font-information</title>
+
+ <para
+>Det här ska normalt vara första delelement i "rosegarden-font-encoding". Det kan ha vilket som helst av följande attribut, som alla är valfria: <variablelist>
+ <varlistentry>
+ <term
+>origin</term>
+ <listitem>
+ <para
+>En textbeskrivning av det avbildade teckensnittets troliga ursprung (inte ursprunget för avbildningsfilen).</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>copyright</term>
+ <listitem>
+ <para
+>En textbaserad beskrivning av trolig copyright-status för det avbildade teckensnittet (inte copyright-status för avbildningsfilen). Observera att eftersom avbildningsfilen innehåller information som ursprung och copyright för själva teckensnittet, är det oftast lämpligt att göra separata avbildningsfiler för separata teckensnitt när det är praktiskt, även om teckensnitten delar annan avbildningsdata.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>mapped-by</term>
+ <listitem>
+ <para
+>Namnet på skaparen av avbildningsfilen (dvs. antagligen du själv).</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>type</term>
+ <listitem>
+ <para
+>Teckensnittets typ. Attributet ska innehålla ett av värdena "pixmap" eller "scalable". Teckensnitt som laddas i fönsterhanteringssystemet och är tillgängliga för Rosegarden som vanliga systemteckensnitt har typen "scalable". Teckensnitt som måste laddas från punktavbildningsfiler som motsvarar individuella storlekar på punktavbildningar (som teckensnitten feta och rg21 som ingår i Rosegarden) har typen "pixmap".</para>
+
+ <para
+>Den här informationen är bara avsett som referens för användaren. Den används i själva verket inte av Rosegarden. I praktiken är det legitimt att ett teckensnitt är en blandning av de två, men i allmänhet antar vi i den här dokumentationen att teckensnittet antingen är skalbart eller punktavbildat.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>smooth</term>
+ <listitem>
+ <para
+>Ett Booleanskt attribut som anger om teckensnittet är kantutjämnat eller inte. Ska ha värdet "true" eller "false". Om teckensnittet är utjämnat, kommer andra element som balkar och legatobågar som inte skapas från teckensnittet att vara kantutjämnade.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>autocrop</term>
+ <listitem>
+ <para
+>Bara relevant för skalbara (system) teckensnitt. Rosegarden förväntar sig oftast att ett teckensnitts mått innehåller de vertikala minsta omgivande rutor för element som nothuvuden och accenter, istället för att omfatta tomt utrymme ovanför eller under elementen av justeringssyfte. De flesta teckensnitt gör inte vad Rosegarden förväntar sig. Därför ska du ställa in attributet för automatisk beskärning till "true". Då beskär Rosegarden allt onödigt tomt utrymme längst upp och längst ner i elementen när de ritas upp.</para>
+ </listitem>
+ </varlistentry>
+
+ </variablelist>
+
+ </para>
+ </sect3>
+
+ <sect3 id="developers-note-fonts-mapping-format-font-requirements">
+ <title
+>font-requirements</title>
+ <para
+>Det här elementet är bara relevant för skalbara teckensnitt. Det används för att ange att teckensnittet bara ska erbjudas om vissa systemteckensnitt är tillgängliga, samt att koppla identifikationsvärden med systemteckensnitten att kunna hänvisa till i elementet <link linkend="developers-note-fonts-mapping-format-font-symbol-map"
+>font-symbol-map</link
+>. Den här metoden används för att bestämma vilka notteckensnitt som användaren ska erbjudas, och dessutom låta dig komponera ett notteckensnitt i Rosegarden från mer än ett systemteckensnitt om du önskar. </para>
+ <para
+>Elementet "font-requirements" ska innehålla en lista med delelementen "font-requirement". Vart och ett av dessa har två attribut: "font-id" som innehåller en numerisk identifikation av ditt val för referenser på andra ställe in filen, och antingen attributet "name" eller "names". Om "name" tillhandahålls, används det som namnet på ett enstaka systemteckensnitt som ska höra ihop med teckensnittsidentifikationen. Om "names" tillhandahålls behandlas det som en lista av systemteckensnitt åtskilda med kommatecken, där det första som hittas kopplas ihop med teckensnittsidentifikationen. </para>
+ </sect3>
+
+ <sect3 id="developers-note-fonts-mapping-format-font-sizes">
+ <title
+>font-sizes</title>
+
+ <para
+>Elementet "font-sizes" anger vilka storlekar av notteckensnitt som är tillgängliga, och hur den nominella teckenstorleken förhåller sig till storleken på element som inte ingår i teckensnittet, såsom skaft, notsystemlinjer och balkar. Ett notteckensnitts "storlek" antas vara avståndet i bildpunkter mellan notsystemlinjer, eller exaktare, platsen för ett vanligt nothuvud som fullständigt fyller avståndet mellan linjer: Storleken omfattar därför inte tjockleken hos någon av intilliggande notlinjer. </para>
+
+ <para
+>Det finns två möjliga delelement till "font-sizes": "font-scale" och "font-size". Deras användning beror på typ av teckensnitt som beskrivs.</para>
+
+ <para
+>För punktavbildade (inte skalbara) teckensnitt, ska elementet "font-sizes" innehålla en lista med element "font-size", ett för varje storlek av punktavbilder som är tillgängliga. Punktavbilderna själva måste vara installerade i underkatalogen fonts/&lt;font-name&gt;/&lt;font-size&gt; i Rosegardens installationskatalog, där &lt;font-name&gt; är teckensnittets namn (som det anges i elementet "rosegarden-font-encoding" i avbildningsfilens början), eller en version av namnet med små bokstäver, och &lt;font-size&gt; är teckensnittets bildpunktsstorlek. En teckenstorlek görs bara tillgänglig för användaren om den har en post i listan "font-sizes" och punktavbildningskatalogen hittas. </para>
+
+ <para
+>För skalbara teckensnitt ska elementet "font-sizes" innehålla ett element "font-scale" som definierar förhållandet mellan teckensnitt och element som inte hör till teckensnittet på ett allmänt sätt, och också definierar förhållandet mellan Rosegardens nominella teckenstorlek och motsvarande systemteckensnitts storlek. Om elementet "font-scale" hittas, antar Rosegarden att teckensnittet är tillgängligt i alla storlekar. Du kan dock fortfarande inkludera ett eller flera element "font-size" för att definiera exakta proportioner för en särskild storlek där de allmänna proportionerna inte riktigt fungerar rätt, till exempel på grund av avrundningsfel. </para>
+
+ <para
+>Attributen till "font-scale" och "font-size" är mycket lika. Den huvudsakliga skillnaden är att alla attribut till "font-scale" är flyttal i förhållande till teckenstorleken, där 1,0 är basstorleken (dvs. avståndet mellan linjer i notsystemet), medan attributen till "font-size" är heltalsvärden av bildpunkter. Tillgängliga attribut är de följande. (De som är markerade som "valfria" har i viss mån rimliga standardvärden, så det är en god idé att inte ange dem först.) </para>
+
+ <variablelist>
+
+ <varlistentry>
+ <term
+>note-height</term>
+ <listitem>
+ <para
+>Det här attributet är bara tillgängligt för elementet "font-size", och krävs för elementet. Det definierar teckensnittets grundstorlek som andra attribut i elementet gäller, och en storlek som erbjuds användaren och används vid uppslagning av punktavbildningar för teckensnittet.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>font-height</term>
+ <listitem>
+ <para
+>Kan antingen användas i "font-size" eller "font-scale". Det är bara tillämpligt för skalbara teckensnitt, men krävs för dem om det används i elementet "font-scale". Det anger storleken på systemteckensnittet som används för att rita en given storlek av notteckensnittet.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>beam-thickness</term>
+ <listitem>
+ <para
+>Valfritt. Anger tjockleken på en balk.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>staff-line-thickness</term>
+ <listitem>
+ <para
+>Valfritt. Anger tjockleken på en notsystemslinje.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>stem-thickness</term>
+ <listitem>
+ <para
+>Valfritt. Anger tjockleken på ett notskaft.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>flag-spacing</term>
+ <listitem>
+ <para
+>Valfritt. Anger avståndet mellan notflaggor i de fall då flera flaggor ritas genom att upprepa en enstaka flagga flera gånger.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>border-x</term>
+ <listitem>
+ <para
+>Valfritt. Anger att nothuvudets punktavbildning har ett fast område till vänster och höger som inte ska anses vara en del av nothuvudet. Attributet anger områdets tjocklek.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>border-y</term>
+ <listitem>
+ <para
+>Valfritt. Anger att nothuvudets punktavbildning har ett fast område ovanför och under som inte ska anses vara en del av nothuvudet. Attributet anger områdets tjocklek.</para>
+ </listitem>
+ </varlistentry>
+
+ </variablelist>
+ </sect3>
+
+ <sect3 id="developers-note-fonts-mapping-format-font-symbol-map">
+ <title
+>font-symbol-map</title>
+ <para
+>Det här elementet listar symbolerna som är tillgängliga i notteckensnittet, och vilka punktavbildningsfiler eller vilka kodpunkter i ett systemteckensnitt som de ska ritas upp med.</para>
+
+ <para
+>Det ska innehålla en lista med "symbol" element. De har flera möjliga attribut, där valet av vilka normalt beror på om teckensnittet är baserat på punktavbildningar eller systemteckensnitt: </para>
+
+ <variablelist>
+ <varlistentry>
+ <term
+>name</term>
+ <listitem>
+ <para
+>Krävs. Det här attributet ska innehålla namnet på notsymbolen. Om symbolen finns i <ulink url="http://www.unicode.org/charts/PDF/U1D100.pdf"
+>Unicode 3.2 standarden</ulink
+>, ska namnet som används för att identifiera symbolen vara det som används i standarden.</para>
+
+ <para
+>De flesta symboler som Rosegarden förväntar sig att hitta ingår i standarden. Ett undantag är att många teckensnitt har en specialversion av flaggsymbolen som är avsedd att användas när flera flaggor skapas från individuella enstaga flaggor. Rosegarden kallar den för "MUSICAL SYMBOL COMBINING FLAG-0", ett namn som inte används av Unicode-standarden (som bara har flaggorna 1 - 5).</para>
+
+ <para
+>För den fullständiga uppsättningen symbolnamn som Rosegarden känner till, se filen "gui/notecharname.cpp" i Rosegardens källkodsdistribution. Observera dock att det är möjligt att använda ytterligare symbolnamn genom att lägga till dem i en <link linkend="developers-note-styles"
+>notationsstil</link
+>. </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>src</term>
+ <listitem>
+ <para
+>Namnet på punktavbildningsfilen som ska användas för att ladda symbolen, utan katalog eller filändelse. Det är det vanliga sättet att beskriva en symbol i ett punktavbildat teckensnitt. Själva filen ska installeras i fonts/&lt;teckensnittsnamn&gt;/&lt;teckenstorlek&gt;/&lt;källa&gt;.xpm under Rosegardens installationskatalog. </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>inversion-src</term>
+ <listitem>
+ <para
+>Namnet på en punktavbildningsfil som kan användas för att ladda en inverterad version av symbolen, utan katalog eller filändelse. Om attributet saknas och en inverterad version av symbolen behövs, skapas den helt enkelt genom att ladda den normala versionen och spegla den i den centrala x-axeln. </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>code</term>
+ <listitem>
+ <para
+>Kodpunkten där symbolen kan hittas i relevant systemteckensnitt, som ett decimalt heltal. Det är ett sätt att beskriva en symbol i ett skalbart teckensnitt. Attributet används bara om ingen punktavbildningsfil tillhandahålls, eller om laddning av punktavbildningsfilen misslyckas. </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>inversion-code</term>
+ <listitem>
+ <para
+>Kodpunkten där en inverterad version av symbolen kan hittas i relevant systemteckensnitt. Om attributet saknas och en inverterad version av symbolen behövs, skapas den helt enkelt genom att ladda den normala versionen och spegla den i den centrala x-axeln. </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>glyph</term>
+ <listitem>
+ <para
+>Det obehandlade indexet för glyfen där symbolen kan hittas i relevant systemteckensnitt, som ett decimalt heltal. Det är ett sätt att beskriva en symbol i ett skalbart teckensnitt. Attributet används bara om ingen punktavbildningsfil tillhandahålls, eller om laddning av punktavbildningsfilen misslyckas. </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>inversion-glyph</term>
+ <listitem>
+ <para
+>Det obehandlade indexet för glyfen där en inverterad version av symbolen kan hittas i relevant systemteckensnitt. Om attributet saknas och en inverterad version av symbolen behövs, skapas den helt enkelt genom att ladda den normala versionen och spegla den i den centrala x-axeln. </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>font-id</term>
+ <listitem>
+ <para
+>Identifikationen för systemteckensnittet som den här symbolen ska laddas från, som det är definierat i elementet <link linkend="developers-note-fonts-mapping-format-font-requirements"
+>font-requirements</link
+>. Normalvärdet är 0. </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>codebase</term>
+ <listitem>
+ <para
+>Det här attributet (ett decimalt heltal) kan vara användbart om många av symbolerna i ett skalbart teckensnitt täcker ett kort område med kodpunkter med början på en relativt hög kodsida. Om det anges, läggs värdet codebase till för vart och ett av efterföljande värden på code och inversion-code när en symbol slås upp. </para>
+ </listitem>
+ </varlistentry>
+
+ </variablelist>
+
+ <para
+>Även om inget av attributen krävs, förutom namnet, måste en symbol uppenbarligen tillhandahålla åtminstone en av "src", "inversion-src", "code", "inversion-code", "glyph" eller "inversion-glyph" för att ha någon möjlighet att överhuvudtaget ritas upp. Det är förstås fullständig legitimt att tillhandahålla flera eller alla dessa attribut. </para>
+
+ </sect3>
+
+ <sect3 id="developers-note-fonts-mapping-format-font-hotspots">
+ <title
+>font-hotspots</title>
+ <para
+>&nbsp; </para>
+ </sect3>
+
+ </sect2>
+
+ </sect1>
+
+ <sect1 id="developers-note-styles">
+ <title
+>Skapa nya notstilar</title>
+
+ <para
+>Rosegardens notbehandlare har möjlighet att visa och redigera noter med olika standardstilar: klassisk, rombformade huvuden och så vidare. Alla stilar definieras i definitionsfiler på XML-form som installeras tillsammans med programmet, och det är möjligt att skapa en ny genom att skriva en enkel XML-fil. Rosegarden tittar helt enkelt på uppsättningen installerade filer för att avgöra vilka stilar som användaren ska erbjudas. Du kan till exempel hänvisa till standarduppsättningen med filer i underkatalogen för stilar i Rosegardens installationskatalog. </para>
+
+ <para
+>Filformatet är inte ännu särskilt omfattande. För ögonblicket är det konstruerat för att vara kraftfullt nog att beskriva standardstilarna som levereras med Rosegarden, men inte mycket mer. Om du gör ett försök att skapa nya stilar på det här sättet, är vi mycket intresserade av din återmatning via Rosegardens e-postlistor. </para>
+
+ <sect2 id="developers-note-styles-format">
+ <title
+>XML-format för notstil</title>
+
+ <para
+>Här är en översikt över XML-elementen som kan användas i en stildefinitionsfil. </para>
+
+ <sect3 id="developers-note-styles-note-style">
+ <title
+>rosegarden-note-style</title>
+
+ <para
+>Det här elementet måste finnas i alla stilfiler, och ska innehålla alla övriga element. Det har ett valfritt attribut, "base-style", som kan användas för att namnge en stil där den här stilen hämtar standardvärden för alla parametrar som inte anges någon annanstans i den befintliga filen. Det är ofta lämpligt att definiera en stil i form av minsta möjliga skillnader från en given basstil. Se filen Cross.xml som tillhandahålls, för ett särskilt enkelt exempel. </para>
+
+ <para
+>Observera att elementet "rosegarden-note-style" inte anger namnet på stilen som definieras, som istället tas från filens namn. Någon gång i framtiden kanske stöd för översättning av stilnamn läggs till i det här elementets attribut.</para>
+ </sect3>
+
+ <sect3 id="developers-note-styles-global-note">
+ <title
+>global, note</title>
+
+ <para
+>I elementet "rosegarden-note-style" kan det finnas ett "global" element och hur många "note" element som helst. De beskrivs tillsammans, eftersom de har nästan identiska uppsättningar attribut. Elementet "global" tillhandahåller helt enkelt standardvärden för de parametrar som inte anges för en viss nottyp i något av följande "note" element. </para>
+
+ <para
+>Attributen för elementen är följande. Alla är valfria utom enligt beskrivningen:</para>
+
+ <variablelist>
+
+ <varlistentry>
+ <term
+>type</term>
+ <listitem>
+ <para
+>Gäller bara elementet "note", och krävs för det elementet. Det här attributet anger vilken sorts not som stilen gäller för. Giltiga värden är tonnamn på amerikansk eller brittisk engelska (från "64th", "sixth-fourth note", "hemidemisemiquaver" etc till "double whole note"). </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>shape</term>
+ <listitem>
+ <para
+>Definierar en form för nothuvudet i den här stilen. Vilken sträng som helst är ett giltigt värde, men de enda värden som hittills är implementerade är "angled oval", "level oval", "breve", "cross", "triangle up", "triangle down", "diamond" och "rectangle". Värdet "number" känns också igen, men är ännu inte implementerat. </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>charname</term>
+ <listitem>
+ <para
+>Definierar ett teckennamn i notteckensnittet som ska användas som nothuvud för stilen. Ett element kan tillhandahålla attributet "shape" eller "charname", men inte båda. Namnet ska vara ett av de som definieras i det nuvarande notskriftteckensnittets <link linkend="developers-note-fonts-mapping-format-font-symbol-map"
+>symbol map</link
+> (i ett attribut "name"). </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>filled</term>
+ <listitem>
+ <para
+>Anger om noten ska ha ett ifyllt huvud (när det är tillämpligt, dvs. när formegenskapen anger en form som både är tillgänglig ifylld och inte). Måste vara "true" eller "false". </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>stem</term>
+ <listitem>
+ <para
+>Anger om noten ska ha ett skaft. Måste vara "true" eller "false". </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>flags</term>
+ <listitem>
+ <para
+>Anger hur många flaggor eller balkar som noten ska ha. Giltigt intervall är 0 till 4. </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>slashes</term>
+ <listitem>
+ <para
+>Anger hur många tvärbalkar noten ska ha över skaftet. </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>hfixpoint</term>
+ <listitem>
+ <para
+>Anger på vilken x-position som skaftet ansluts till nothuvudet. Acceptabla värden är "normal" (höger sida när skaftet pekar uppåt, vänster sida när det pekar neråt), "central" och "reversed" (vänster sida när skaftet pekar uppåt, höger sida när det pekar neråt). </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term
+>vfixpoint</term>
+ <listitem>
+ <para
+>Anger på vilken y-position som skaftet ansluts till nothuvudet. Acceptabla värden är "near" (skaftet ansluts till toppen när det pekar uppåt, till botten när det pekar neråt), "middle" eller "far". </para>
+ </listitem>
+ </varlistentry>
+
+ </variablelist>
+ </sect3>
+ </sect2>
+ </sect1>
+
+
+ <!-- (OPTIONAL) A Programming/Scripting reference chapter should be
+ used for apps that use plugins or that provide their own scripting hooks
+ and/or development libraries. -->
+
+ <!-- cc: I think we should document the DCOP API here, but I don't
+ think we should include extensive developer docs, although we should
+ point to where they can be found in the source tree or online. -->
+ <!--
+ <para>
+ Programming <application
+>Rosegarden</application
+> plugins is
+ a joy to behold. Just read through the next
+ 66 pages of <acronym
+>API</acronym
+>'s to learn how!
+ </para>
+ -->
+ <!-- Use refentries to describe APIs. Refentries are fairly
+ complicated and you should consult the docbook reference for
+ further details. The example below was taken from that reference
+ and shortened a bit for readability. -->
+ <!--
+ <refentry id="re-1007-unmanagechildren-1">
+ <refmeta>
+ <refentrytitle
+>XtUnmanageChildren</refentrytitle>
+ <refmiscinfo
+>Xt &ndash; Geometry Management</refmiscinfo>
+ </refmeta>
+ <refnamediv>
+ <refname
+>XtUnmanageChildren
+ </refname>
+ <refpurpose
+>remove a list of children from a parent widget's managed list.
+ </refpurpose>
+ </refnamediv>
+ <refsynopsisdiv>
+ <refsynopsisdivinfo>
+ <date
+>4 March 1996</date>
+ </refsynopsisdivinfo>
+ <synopsis
+>
+ void XtUnmanageChildren(<replaceable>children</replaceable>, <replaceable>num_children</replaceable>)
+ WidgetList <replaceable>children</replaceable>;
+ Cardinal <replaceable>num_children</replaceable>;
+ </synopsis>
+
+ <refsect2 id="r2-1007-unmanagechildren-1">
+ <title
+>Inputs</title>
+ <variablelist>
+ <varlistentry>
+ <term
+><replaceable
+>children</replaceable>
+ </term>
+ <listitem>
+ <para>
+ Specifies an array of child widgets. Each child must be of
+ class RectObj or any subclass thereof.
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term
+><replaceable
+>num_children</replaceable>
+ </term>
+ <listitem>
+ <para
+>Specifies the number of elements in <replaceable
+>children</replaceable
+>.
+ </para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refsect2
+></refsynopsisdiv>
+
+ <refsect1 id="r1-1007-unmanagechildren-1">
+ <title
+>Description
+ </title>
+ <para>
+ <function
+>XtUnmanageChildren()</function
+> unmaps the specified widgets
+ and removes them from their parent's geometry management.
+ The widgets will disappear from the screen, and (depending
+ on its parent) may no longer have screen space allocated for
+ them.
+ </para>
+ <para
+>Each of the widgets in the <replaceable
+>children</replaceable
+> array must have
+ the same parent.
+ </para>
+ <para
+>See the &ldquo;Algorithm&rdquo; section below for full details of the
+ widget unmanagement procedure.
+ </para>
+ </refsect1>
+
+ <refsect1 id="r1-1007-unmanagechildren-2">
+ <title
+>Usage</title>
+ <para>
+ Unmanaging widgets is the usual method for temporarily
+ making them invisible. They can be re-managed with
+ <function
+>XtManageChildren()</function
+>.
+ </para>
+ <para>
+ You can unmap a widget, but leave it under geometry
+ management by calling <function
+>XtUnmapWidget()</function
+>. You can
+ destroy a widget's window without destroying the widget by
+ calling <function
+>XtUnrealizeWidget()</function
+>. You can destroy a
+ widget completely with <function
+>XtDestroyWidget()</function
+>.
+ </para>
+ <para>
+ If you are only going to unmanage a single widget, it is
+ more convenient to call <function
+>XtUnmanageChild()</function
+>. It is
+ often more convenient to call <function
+>XtUnmanageChild()</function>
+ several times than it is to declare and initialize an array
+ of widgets to pass to <function
+>XtUnmanageChildren()</function
+>. Calling
+ <function
+>XtUnmanageChildren()</function
+> is more efficient, however,
+ because it only calls the parent's <function
+>change_managed()</function>
+ method once.
+ </para>
+ </refsect1>
+
+ <refsect1 id="r1-1007-unmanagechildren-3">
+ <title
+>Algorithm
+ </title>
+ <para
+><function
+>XtUnmanageChildren()</function
+> performs the following:
+ </para>
+ <variablelist>
+ <varlistentry>
+ <term
+>-
+ </term>
+ <listitem>
+ <para
+>Ignores the child if it already is unmanaged or is being
+ destroyed.
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term
+>-
+ </term>
+ <listitem>
+ <para
+>Otherwise, if the child is realized, it makes it nonvisible
+ by unmapping it.
+ </para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1>
+
+ <refsect1 id="r1-1007-unmanagechildren-4">
+ <title
+>Structures</title>
+ <para>
+ The <type
+>WidgetList</type
+> type is simply an array of widgets:
+ </para>
+ <screen id="sc-1007-unmanagechildren-1"
+>
+ typedef Widget *WidgetList;
+ </screen>
+ </refsect1>
+ </refentry>
+ -->
+ </chapter>
+
+
+ <chapter id="credits">
+
+ <title
+>Tack till och licens</title>
+
+ <para>
+ <application
+>Rosegarden</application>
+ </para>
+ <para>
+ <itemizedlist>
+ <listitem>
+ <para
+>Rosegarden-4 är Copyright 2000-2004 Guillaume Laurent, Chris Cannam och Richard Bown. Moralisk rättighet att identifieras som upphovsmän till det här verket hävdas av Guillaume Laurent, Chris Cannam och Richard Bown. </para>
+ </listitem>
+
+ <listitem>
+ <para
+>Delar av Rosegarden-4 är härledda från Rosegarden 2.1, som är Copyright 1994 &ndash; 2001 Chris Cannam, Andrew Green, Richard Bown och Guillaume Laurent. </para>
+ </listitem>
+
+ <listitem>
+ <para
+>För visning av musikalisk notskrift använder Rosegarden-4 punktavbildningar härledda från teckensnittet Feta, som är en del av programvaran <ulink url="http://lilypond.org/"
+>Lilypond</ulink
+>, som är Copyright 1997 &ndash; 2001 Jan Nieuwenhuizen och Han-Wen Nienhuys. </para>
+ </listitem>
+
+ <listitem>
+ <para
+>Bland andra väsentliga bidragsgivare finns Randall Farmer, Ron Kuris, Hans Kieserman och Michael McIntyre. </para>
+ </listitem>
+
+ <listitem>
+ <para
+>Rosegardens startskärm kommer från ett vykort av Thornden-parken vid Syracuse-universitetet i Syracuse, New York, tryckt år 1900. Tack till personalen på Syracuse-universitetet för användning av det. </para>
+ </listitem>
+
+ </itemizedlist>
+ </para>
+
+ <para
+>Dokumentation copyright 2002-2004 Chris Cannam, Richard Bown, Guillaume Laurent </para>
+ <!--
+ <para>
+ Translations done by:
+ <itemizedlist>
+ <listitem>
+ <para
+>Babel D. Fish <email
+> (Sanskrit)</para>
+ </listitem>
+ </itemizedlist>
+ </para>
+ -->
+ <!-- For URL links to common stuff like the one below,
+ always use paths like "common/gpl-licence".
+ In this path, "common" will be a symbolic link built at "make install" time.
+ This link will normally point to $KDEDIR/share/doc/HTML/en/common,
+ where "en" should be replaced with the current language. -->
+
+ <para
+>Det här programmet distribueras under villkoren i <ulink url="common/gpl-license.html"
+>GNU General Public License</ulink
+>. </para>
+ </chapter>
+
+ <!-- Note that the revhistory tags apply to the documentation
+ version and not to the app version. That is why we use an
+ ItemizedList instead for this list of revisions to the app. -->
+
+ <chapter id="rosegarden-revhistory">
+ <title
+>Rosegarden-4 utgåvehistorik</title>
+ <para>
+ <itemizedlist>
+ <listitem
+><para
+>0.9.9 &ndash; juli 2004: syntinsticksmoduler, utlösande segment, notationsförbättringar </para
+></listitem>
+ <listitem
+><para
+>0.9.8 &ndash; maj 2004: bättre ljuddelsystem </para
+></listitem>
+ <listitem
+><para
+>0.9.7 &ndash; februari 2004: </para
+></listitem>
+ <listitem
+><para
+>0.9.6 &ndash; december 2003: felrättningar </para
+></listitem>
+ <listitem
+><para
+>0.9.5 &ndash; november 2003: en hel del saker </para
+></listitem>
+ <listitem
+><para
+>0.9.1 &ndash; maj 2003: stegvis inspelning, MUP-export, många många felrättningar </para
+></listitem>
+ <listitem
+><para
+>0.9 &ndash; april 2003: många förbättringar av notation, förbättrad bankeditor, ljudförbättringar och förfiningar, översättningar </para
+></listitem>
+ <listitem
+><para
+>0.8.5 &ndash; december 2002: bankeditor, MIDI-filter, panikknapp </para
+></listitem>
+ <listitem
+><para
+>0.8 &ndash; oktober 2002: utskrift, LADSPA-insticksmoduler, förbättrad matrisvy </para
+></listitem>
+ <listitem
+><para
+>0.2.0 &ndash; augusti 2002: WAV-filstöd, markering med svepning, kontrapunkt </para
+></listitem>
+ <listitem
+><para
+>0.1.6 &ndash; juni 2002: inställningsdialogruta, Lilypond-stöd, kvantiseringsdialogruta </para
+></listitem>
+ <listitem
+><para
+>0.1.5 &ndash; maj 2002: KDE 3, ALSA-stöd, JACK-ljudstöd </para
+></listitem>
+ <listitem
+><para
+>0.1.4 &ndash; mars 2002: mer ångra, segmentredigering, ljuduppspelning </para
+></listitem>
+ <listitem
+><para
+>0.1.3 &ndash; januari 2002: pianorulle och matrisvy, &MIDI;-inspelning </para
+></listitem>
+ <listitem
+><para
+>0.1.2 &ndash; november 2001: ångra notation, transportdialogruta, positionspekare </para
+></listitem>
+ <listitem
+><para
+>0.1.1 &ndash; oktober 2001: skalbar notation </para
+></listitem>
+ <listitem
+><para
+>0.1 &ndash; juni 2001: första öppna utgåva av Rosegarden-4 </para
+></listitem>
+ </itemizedlist>
+ </para>
+ </chapter>
+
+ &documentation.index;
+</book>
diff --git a/docs/sv/rg-audiofilemanager.png b/docs/sv/rg-audiofilemanager.png
new file mode 100644
index 0000000..3696a90
--- /dev/null
+++ b/docs/sv/rg-audiofilemanager.png
Binary files differ
diff --git a/docs/sv/rg-audiomixer.png b/docs/sv/rg-audiomixer.png
new file mode 100644
index 0000000..e4403f7
--- /dev/null
+++ b/docs/sv/rg-audiomixer.png
Binary files differ
diff --git a/docs/sv/rg-bankeditor.png b/docs/sv/rg-bankeditor.png
new file mode 100644
index 0000000..e650dc4
--- /dev/null
+++ b/docs/sv/rg-bankeditor.png
Binary files differ
diff --git a/docs/sv/rg-clefdialog.png b/docs/sv/rg-clefdialog.png
new file mode 100644
index 0000000..f9bdcd7
--- /dev/null
+++ b/docs/sv/rg-clefdialog.png
Binary files differ
diff --git a/docs/sv/rg-colours.png b/docs/sv/rg-colours.png
new file mode 100644
index 0000000..c86592a
--- /dev/null
+++ b/docs/sv/rg-colours.png
Binary files differ
diff --git a/docs/sv/rg-devicemanager.png b/docs/sv/rg-devicemanager.png
new file mode 100644
index 0000000..ad10b19
--- /dev/null
+++ b/docs/sv/rg-devicemanager.png
Binary files differ
diff --git a/docs/sv/rg-eventlisteditor.png b/docs/sv/rg-eventlisteditor.png
new file mode 100644
index 0000000..7020cbc
--- /dev/null
+++ b/docs/sv/rg-eventlisteditor.png
Binary files differ
diff --git a/docs/sv/rg-gridquantizer.png b/docs/sv/rg-gridquantizer.png
new file mode 100644
index 0000000..361759d
--- /dev/null
+++ b/docs/sv/rg-gridquantizer.png
Binary files differ
diff --git a/docs/sv/rg-ipb-audio.png b/docs/sv/rg-ipb-audio.png
new file mode 100644
index 0000000..a595d31
--- /dev/null
+++ b/docs/sv/rg-ipb-audio.png
Binary files differ
diff --git a/docs/sv/rg-ipb-midi.png b/docs/sv/rg-ipb-midi.png
new file mode 100644
index 0000000..839e5f8
--- /dev/null
+++ b/docs/sv/rg-ipb-midi.png
Binary files differ
diff --git a/docs/sv/rg-ipb-synth.png b/docs/sv/rg-ipb-synth.png
new file mode 100644
index 0000000..9af58eb
--- /dev/null
+++ b/docs/sv/rg-ipb-synth.png
Binary files differ
diff --git a/docs/sv/rg-keysigdialog.png b/docs/sv/rg-keysigdialog.png
new file mode 100644
index 0000000..698a583
--- /dev/null
+++ b/docs/sv/rg-keysigdialog.png
Binary files differ
diff --git a/docs/sv/rg-mainwindow.png b/docs/sv/rg-mainwindow.png
new file mode 100644
index 0000000..317132d
--- /dev/null
+++ b/docs/sv/rg-mainwindow.png
Binary files differ
diff --git a/docs/sv/rg-matrixview.png b/docs/sv/rg-matrixview.png
new file mode 100644
index 0000000..b389776
--- /dev/null
+++ b/docs/sv/rg-matrixview.png
Binary files differ
diff --git a/docs/sv/rg-metronome.png b/docs/sv/rg-metronome.png
new file mode 100644
index 0000000..4af8961
--- /dev/null
+++ b/docs/sv/rg-metronome.png
Binary files differ
diff --git a/docs/sv/rg-midifilter.png b/docs/sv/rg-midifilter.png
new file mode 100644
index 0000000..a01c6e7
--- /dev/null
+++ b/docs/sv/rg-midifilter.png
Binary files differ
diff --git a/docs/sv/rg-midimixer.png b/docs/sv/rg-midimixer.png
new file mode 100644
index 0000000..926ee2c
--- /dev/null
+++ b/docs/sv/rg-midimixer.png
Binary files differ
diff --git a/docs/sv/rg-notationquantizer.png b/docs/sv/rg-notationquantizer.png
new file mode 100644
index 0000000..2914c0b
--- /dev/null
+++ b/docs/sv/rg-notationquantizer.png
Binary files differ
diff --git a/docs/sv/rg-notationview-multipage.png b/docs/sv/rg-notationview-multipage.png
new file mode 100644
index 0000000..a0e94ff
--- /dev/null
+++ b/docs/sv/rg-notationview-multipage.png
Binary files differ
diff --git a/docs/sv/rg-notationview.png b/docs/sv/rg-notationview.png
new file mode 100644
index 0000000..d16acb9
--- /dev/null
+++ b/docs/sv/rg-notationview.png
Binary files differ
diff --git a/docs/sv/rg-pastedialog.png b/docs/sv/rg-pastedialog.png
new file mode 100644
index 0000000..948710e
--- /dev/null
+++ b/docs/sv/rg-pastedialog.png
Binary files differ
diff --git a/docs/sv/rg-plugin-dialog.png b/docs/sv/rg-plugin-dialog.png
new file mode 100644
index 0000000..d03b369
--- /dev/null
+++ b/docs/sv/rg-plugin-dialog.png
Binary files differ
diff --git a/docs/sv/rg-pluginbuttons.png b/docs/sv/rg-pluginbuttons.png
new file mode 100644
index 0000000..9ebc12d
--- /dev/null
+++ b/docs/sv/rg-pluginbuttons.png
Binary files differ
diff --git a/docs/sv/rg-plugineditorbutton.png b/docs/sv/rg-plugineditorbutton.png
new file mode 100644
index 0000000..cfa6e4b
--- /dev/null
+++ b/docs/sv/rg-plugineditorbutton.png
Binary files differ
diff --git a/docs/sv/rg-segmentparameterbox.png b/docs/sv/rg-segmentparameterbox.png
new file mode 100644
index 0000000..2b9635a
--- /dev/null
+++ b/docs/sv/rg-segmentparameterbox.png
Binary files differ
diff --git a/docs/sv/rg-synthpluginbuttons.png b/docs/sv/rg-synthpluginbuttons.png
new file mode 100644
index 0000000..42d49b1
--- /dev/null
+++ b/docs/sv/rg-synthpluginbuttons.png
Binary files differ
diff --git a/docs/sv/rg-tempodialog.png b/docs/sv/rg-tempodialog.png
new file mode 100644
index 0000000..6e7a525
--- /dev/null
+++ b/docs/sv/rg-tempodialog.png
Binary files differ
diff --git a/docs/sv/rg-timesigdialog.png b/docs/sv/rg-timesigdialog.png
new file mode 100644
index 0000000..3426fa3
--- /dev/null
+++ b/docs/sv/rg-timesigdialog.png
Binary files differ
diff --git a/docs/sv/rg-trackbutton-instruments.png b/docs/sv/rg-trackbutton-instruments.png
new file mode 100644
index 0000000..07388bc
--- /dev/null
+++ b/docs/sv/rg-trackbutton-instruments.png
Binary files differ
diff --git a/docs/sv/rg-trackbutton-labels.png b/docs/sv/rg-trackbutton-labels.png
new file mode 100644
index 0000000..cda662e
--- /dev/null
+++ b/docs/sv/rg-trackbutton-labels.png
Binary files differ
diff --git a/docs/sv/rg-trackeditor.png b/docs/sv/rg-trackeditor.png
new file mode 100644
index 0000000..96ac7c4
--- /dev/null
+++ b/docs/sv/rg-trackeditor.png
Binary files differ
diff --git a/docs/sv/rg-transport.png b/docs/sv/rg-transport.png
new file mode 100644
index 0000000..0389da8
--- /dev/null
+++ b/docs/sv/rg-transport.png
Binary files differ
diff --git a/docs/sv/rg-tupletdialog.png b/docs/sv/rg-tupletdialog.png
new file mode 100644
index 0000000..156c3a0
--- /dev/null
+++ b/docs/sv/rg-tupletdialog.png
Binary files differ
diff --git a/docs/sv/rosegarden.po b/docs/sv/rosegarden.po
new file mode 100644
index 0000000..3c37a3b
--- /dev/null
+++ b/docs/sv/rosegarden.po
@@ -0,0 +1,7454 @@
+# translation of rosegarden.po to Swedish
+#
+# Stefan Asserhäll <[email protected]>, 2005, 2006.
+msgid ""
+msgstr ""
+"Project-Id-Version: rosegarden\n"
+"POT-Creation-Date: 2006-01-06 12:01+0000\n"
+"PO-Revision-Date: 2006-01-06 19:07+0100\n"
+"Last-Translator: Stefan Asserhäll <[email protected]>\n"
+"Language-Team: Swedish <[email protected]>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.1\n"
+
+#. Tag: title
+#: index.docbook:204
+#, no-c-format
+msgid "The Rosegarden Handbook"
+msgstr "Handbok Rosegarden"
+
+#. Tag: author
+#: index.docbook:206
+#, no-c-format
+msgid "<firstname>Chris</firstname> <surname>Cannam</surname>"
+msgstr "<firstname>Chris</firstname> <surname>Cannam</surname>"
+
+#. Tag: author
+#: index.docbook:210
+#, no-c-format
+msgid "<firstname>Richard</firstname> <surname>Bown</surname>"
+msgstr "<firstname>Richard</firstname> <surname>Bown</surname>"
+
+#. Tag: author
+#: index.docbook:214
+#, no-c-format
+msgid "<firstname>Guillaume</firstname> <surname>Laurent</surname>"
+msgstr "<firstname>Guillaume</firstname> <surname>Laurent</surname>"
+
+#. Tag: trans_comment
+#: index.docbook:218
+#, no-c-format
+msgid "ROLES_OF_TRANSLATORS"
+msgstr ""
+"<othercredit role=\"translator\"> <firstname>Stefan</firstname> "
+"<surname>Asserhäll</surname> "
+"<affiliation><address><email>[email protected]</email></address></af"
+"filiation> <contrib>Översättare</contrib></othercredit>"
+
+#. Tag: holder
+#: index.docbook:223
+#, no-c-format
+msgid "Chris Cannam, Richard Bown, Guillaume Laurent"
+msgstr "Chris Cannam, Richard Bown, Guillaume Laurent"
+
+#. Tag: phrase
+#: index.docbook:237
+#, no-c-format
+msgid "&rosegarden;"
+msgstr "&rosegarden;"
+
+#. Tag: para
+#: index.docbook:239
+#, no-c-format
+msgid ""
+"Rosegarden is an audio and &MIDI; sequencer and musical notation editor. "
+"This Handbook describes how to use it."
+msgstr ""
+"Rosegarden är ett program för ljud- och &MIDI;-inspelning och en editor "
+"för musikalisk notskrift. Den här handboken beskriver hur det används."
+
+#. Tag: keyword
+#: index.docbook:249
+#, no-c-format
+msgid "<keyword>Rosegarden</keyword>"
+msgstr "<keyword>Rosegarden</keyword>"
+
+#. Tag: keyword
+#: index.docbook:250
+#, no-c-format
+msgid "sequencer"
+msgstr "musikbehandlare"
+
+#. Tag: keyword
+#: index.docbook:251
+#, no-c-format
+msgid "MIDI"
+msgstr "MIDI"
+
+#. Tag: keyword
+#: index.docbook:252
+#, no-c-format
+msgid "audio"
+msgstr "ljud"
+
+#. Tag: keyword
+#: index.docbook:253
+#, no-c-format
+msgid "music"
+msgstr "musik"
+
+#. Tag: keyword
+#: index.docbook:254
+#, no-c-format
+msgid "notation"
+msgstr "beteckning"
+
+#. Tag: keyword
+#: index.docbook:255
+#, no-c-format
+msgid "score"
+msgstr "partitur"
+
+#. Tag: keyword
+#: index.docbook:256
+#, no-c-format
+msgid "<keyword>KDE</keyword>"
+msgstr "<keyword>KDE</keyword>"
+
+#. Tag: title
+#: index.docbook:272 index.docbook:2458 index.docbook:3918
+#, no-c-format
+msgid "Introduction"
+msgstr "Inledning"
+
+#. Tag: title
+#: index.docbook:275
+#, no-c-format
+msgid "About Rosegarden"
+msgstr "Om Rosegarden"
+
+#. Tag: para
+#: index.docbook:276
+#, no-c-format
+msgid ""
+"<application>Rosegarden</application> is a &MIDI; and audio sequencer and "
+"musical notation editor. Rosegarden allows you to record, arrange, and "
+"compose music, in the shape of traditional score or &MIDI; data, or of audio "
+"files either imported or recorded from a microphone, guitar or whatever "
+"audio source you care to specify. You can use Rosegarden to write, edit, and "
+"organise music to create a composition, which you can then synthesise, add "
+"effects to, and mix down for burning to CD or distribution on the web. "
+"Rosegarden also contains professional notation editing support for high "
+"quality printed output."
+msgstr ""
+"<application>Rosegarden</application> är ett program för ljud- och "
+"&MIDI;-inspelning och en editor för musikalisk notskrift. Rosegarden låter "
+"dig spela in, arrangera och komponera musik, i form av ett traditionellt "
+"partitur eller &MIDI;-data, eller ljudfiler som antingen importeras eller "
+"spelas in via en mikrofon, gitarr eller vilken ljudkälla du önskar. Du kan "
+"använda Rosegarden för att skriva, redigera och organisera musik för att "
+"skapa en komposition, som du därefter kan syntetisera, lägga till effekter "
+"i och mixa för att bränna till en cd eller distribuera på webben. Rosegarden "
+"innehåller också professionellt stöd för notredigering för utskrift med hög "
+"kvalitet."
+
+#. Tag: para
+#: index.docbook:289
+#, no-c-format
+msgid ""
+"<application>Rosegarden</application> is designed to look and act in a "
+"manner familiar to experienced users coming to Linux from other platforms, "
+"whilst also being accessible and friendly to users new to music software "
+"generally."
+msgstr ""
+"<application>Rosegarden</application> är konstruerat för att se ut som och "
+"fungera på ett sätt som är bekant för erfarna användare som kommer till "
+"Linux från andra plattformar, medan det också är tillgängligt och "
+"användarvänligt för de som är nykomlingar till musikprogramvara i "
+"allmänhet."
+
+#. Tag: title
+#: index.docbook:297
+#, no-c-format
+msgid "About this Handbook"
+msgstr "Om den här handboken"
+
+#. Tag: para
+#: index.docbook:298
+#, no-c-format
+msgid ""
+"This handbook summarises the capabilities of &rosegarden; and provides a "
+"reference for some of the concepts involved. It's designed to make sense "
+"either read in order or used as a reference to the concepts and functions "
+"available in Rosegarden. If you would like to read a tutorial as well, "
+"<ulink "
+"url=\"http://www.rosegardenmusic.com/resources/tutorial/using_en.shtml\">you "
+"can find one here</ulink>."
+msgstr ""
+"Den här handboken ger en översikt av &rosegarden;s möjligheter, och "
+"tillhandahåller en referens för en del av de begrepp som ingår. Den är "
+"skapad för att antingen vara meningsfull när den läses i en följd, eller "
+"när den används som en referens till begrepp och tillgängliga funktioner "
+"i Rosegarden. Om du dessutom vill läsa en handledning, <ulink "
+"url=\"http://www.rosegardenmusic.com/resources/tutorial/using_en.shtml\">hitt"
+"ar du en här</ulink>."
+
+#. Tag: para
+#: index.docbook:307
+#, no-c-format
+msgid ""
+"If there's something else that you don't understand or require further help "
+"with, please visit <ulink "
+"url=\"http://www.rosegardenmusic.com/support/\">the Rosegarden "
+"website</ulink> for Frequently Asked Questions and mailing list instructions."
+msgstr ""
+"Om det finns något annat du inte förstår eller något du behöver "
+"ytterligare hjälp med, besök gärna <ulink "
+"url=\"http://www.rosegardenmusic.com/support/\">Rosegardens "
+"webbplats</ulink> för vanliga frågor och instruktioner om användning av "
+"e-postlistan."
+
+#. Tag: title
+#: index.docbook:316
+#, no-c-format
+msgid "About Menus and Shortcuts"
+msgstr "Om menyer och snabbtangenter"
+
+#. Tag: para
+#: index.docbook:316
+#, no-c-format
+msgid ""
+"This handbook usually refers to the functions you can use in Rosegarden by "
+"describing where they live on the menus. For example, the function to add a "
+"single new track to the main track editor is <menuchoice> <guimenu "
+"lang=\"en\">Tracks</guimenu> <guimenuitem>Add Track</guimenuitem> "
+"</menuchoice>."
+msgstr ""
+"Handboken hänvisar oftast till funktionerna du kan använda i Rosegarden "
+"genom att beskriva var de befinner sig i menyerna. Funktionen för att "
+"lägga till ett enstaka nytt spår i huvudspåreditorn är exempelvis "
+"<menuchoice><guimenu lang=\"sv\">Spår</guimenu> <guimenuitem>Lägg till "
+"spår</guimenuitem></menuchoice>."
+
+#. Tag: para
+#: index.docbook:325
+#, no-c-format
+msgid ""
+"In many cases, this is not the only way to reach a particular function. In "
+"this case the same function is also available through the keyboard shortcut "
+"Ctrl+T, and it also appears as an icon on one of the main window's toolbars. "
+"Both the keyboard shortcut and the icon can quickly be learned, because they "
+"are shown on the menu in Rosegarden alongside the name of the function. You "
+"should bear in mind that although we always give the full menu location in "
+"this documentation for reference purposes, it's not necessarily the best or "
+"most usual way to use a function, and you should keep an eye on the keyboard "
+"shortcuts or toolbar icons as well."
+msgstr ""
+"I många fall är det inte det enda sättet att nå en viss funktion. I det "
+"här fallet är samma funktion också tillgänglig via snabbtangenten "
+"Ctrl+T, och den visas också som en ikon i en av huvudfönstrets "
+"verktygsrader. Både snabbtangenten och ikonen kan snabbt läras in, "
+"eftersom de visas i Rosegardens meny tillsammans med funktionens namn. Du "
+"bör komma ihåg att även om vi alltid anger det fullständiga "
+"menyalternativet i dokumentationen av referensskäl, är det inte "
+"nödvändigtvis det bästa eller det vanligaste sättet att använda en "
+"funktion, och du bör dessutom hålla ett öga på snabbtangenter och ikoner "
+"i verktygsraderna."
+
+#. Tag: title
+#: index.docbook:340
+#, no-c-format
+msgid "Optional Features"
+msgstr "Valfria funktioner"
+
+#. Tag: para
+#: index.docbook:340
+#, no-c-format
+msgid ""
+"This Handbook assumes that your Rosegarden installation supports all the "
+"features of which it is capable. Some of Rosegarden's features, including "
+"some very major ones, are actually optional when building a Rosegarden "
+"installation, depending on which other libraries and supporting code is "
+"available. For example, the whole audio subsystem is only compiled in if "
+"JACK libraries are available; synth plugin support depends on a number of "
+"other modules; etc."
+msgstr ""
+"Handboken antar att installationen av Rosegarden stöder alla funktionerna "
+"som det har möjlighet till. Vissa av Rosegardens funktioner, inklusive "
+"några av de större, är i själva verket valfria när en installation av "
+"Rosegarden byggs. Hela ljuddelsystemet kompileras till exempel bara om "
+"JACK-biblioteken är tillgängliga, stöd för syntinsticksmoduler beror på "
+"ett antal andra moduler, etc."
+
+#. Tag: para
+#: index.docbook:348
+#, no-c-format
+msgid ""
+"These dependencies are documented in the Rosegarden README and configuration "
+"documentation. If you find that this Handbook refers to features not visible "
+"in the version of Rosegarden you're using, consult your configuration "
+"documentation or distributor."
+msgstr ""
+"Dessa beroenden är dokumenterade i filen README och Rosegardens "
+"konfigureringsdokumentation. Om du märker att handboken hänvisar till "
+"funktioner som inte finns i den version av Rosegarden som du använder, "
+"rådfråga konfigureringsdokumentationen eller distributören."
+
+#. Tag: title
+#: index.docbook:370
+#, no-c-format
+msgid "Rosegarden Files and Documents"
+msgstr "Rosegarden-filer och -dokument"
+
+#. Tag: para
+#: index.docbook:371
+#, no-c-format
+msgid ""
+"&rosegarden; stores each composition in its own document, using its own "
+"internal format. When you save a document it is stored on disc as a file "
+"with the .rg extension. &rosegarden; can also handle a number of other "
+"standard file formats."
+msgstr ""
+"&rosegarden; lagrar varje komposition i ett eget dokument, med sitt eget "
+"interna format. När du sparar ett dokument lagras det på disk som en fil "
+"med filändelsen .rg. &rosegarden; kan också hantera ett antal andra "
+"standardfilformat."
+
+#. Tag: title
+#: index.docbook:379
+#, no-c-format
+msgid "New compositions"
+msgstr "Nya kompositioner"
+
+#. Tag: para
+#: index.docbook:380
+#, no-c-format
+msgid ""
+"When &rosegarden; starts up, it does so with a new document, containing an "
+"\"empty\" composition ready to start editing. To put something in that "
+"composition, you must either record something, or create some blank lengths "
+"of music (referred to as \"segments\") that you can then fill in using the "
+"various editing facilities."
+msgstr ""
+"När &rosegarden; startar, görs det med ett nytt dokument som innehåller "
+"en \"tom\" komposition som är klar att börja redigera. För att lägga "
+"till något i kompositionen måste du antingen spela in något eller skapa "
+"några tomma musikavsnitt (som kallas \"segment\"), som du sedan kan fylla i "
+"med de olika redigeringsfunktionerna."
+
+#. Tag: para
+#: index.docbook:388
+#, no-c-format
+msgid ""
+"See <link linkend=\"recording\">Recording</link> for details of how to "
+"record music, and see the <link linkend=\"segment-view\">Track Editor</link> "
+"section for a description of how to create, edit, and manage segments of "
+"music."
+msgstr ""
+"Se <link linkend=\"recording\">Inspelning</link> för detaljinformation om "
+"hur musik spelas in, och se avsnittet om <link "
+"linkend=\"segment-view\">spåreditorn</link> för en beskrivning av hur "
+"musiksegment skapas, redigeras och hanteras."
+
+#. Tag: title
+#: index.docbook:396
+#, no-c-format
+msgid "Using MIDI files"
+msgstr "Använda MIDI-filer"
+
+#. Tag: para
+#: index.docbook:397
+#, no-c-format
+msgid ""
+"To import and export MIDI files, use the <menuchoice> <guimenu "
+"lang=\"en\">File</guimenu> <guimenuitem>Import</guimenuitem> "
+"<guimenuitem>Import MIDI File</guimenuitem> </menuchoice> and <menuchoice> "
+"<guimenu lang=\"en\">File</guimenu> <guimenuitem>Export</guimenuitem> "
+"<guimenuitem>Export MIDI File</guimenuitem> </menuchoice> functions."
+msgstr ""
+"För att importera och exportera MIDI-filer, använd alternativen "
+"<menuchoice><guimenu lang=\"sv\">Arkiv</guimenu> "
+"<guimenuitem>Importera</guimenuitem> <guimenuitem>Importera "
+"MIDI-fil</guimenuitem></menuchoice> och <menuchoice><guimenu "
+"lang=\"sv\">Arkiv</guimenu> <guimenuitem>Exportera</guimenuitem> "
+"<guimenuitem>Exportera MIDI-fil</guimenuitem></menuchoice>."
+
+#. Tag: para
+#: index.docbook:412
+#, no-c-format
+msgid ""
+"Although &rosegarden; can load and save file formats such as MIDI, it does "
+"not store MIDI data internally. You should generally prefer to save files in "
+"&rosegarden;'s own format, as &rosegarden; stores quite a lot of information "
+"that will be lost when exporting to MIDI."
+msgstr ""
+"Även om &rosegarden; kan ladda och spara filformat som MIDI, lagras inte "
+"MIDI-data internt. Du bör i allmänhet föredra att spara filer med "
+"&rosegarden;s eget format, eftersom &rosegarden; lagrar en hel del "
+"information som går förlorad vid export till MIDI."
+
+#. Tag: para
+#: index.docbook:419
+#, no-c-format
+msgid ""
+"When a MIDI file is loaded, &rosegarden; splits out the music into one track "
+"per MIDI track or channel in the file, <link "
+"linkend=\"studio-midi-import\">sets up the appropriate instrument "
+"mappings</link>, and <link linkend=\"nv-quantization\">attempts to calculate "
+"plausible notation</link> for the MIDI performance data."
+msgstr ""
+"När en MIDI-fil laddas, delar &rosegarden; upp musiken i ett spår per "
+"MIDI-spår eller kanal i filen, <link "
+"linkend=\"studio-midi-import\">ställer in lämpliga "
+"instrumentavbildningar</link> och <link "
+"linkend=\"nv-quantization\">försöker beräkna en trolig notering</link> "
+"för utförd MIDI-data."
+
+#. Tag: title
+#: index.docbook:430
+#, no-c-format
+msgid "Merging files"
+msgstr "Sammanfoga filer"
+
+#. Tag: para
+#: index.docbook:430
+#, no-c-format
+msgid ""
+"As well as loading or importing files, you can also merge them into the "
+"current document, adding the segments found in the file to the ones already "
+"there."
+msgstr ""
+"Förutom att ladda eller importera filer, kan du också sammanfoga dem med "
+"det nuvarande dokumentet, och lägga till segmenten som hittas i filen till "
+"de som redan finns."
+
+#. Tag: para
+#: index.docbook:436
+#, no-c-format
+msgid ""
+"To merge a file, just use the relevant option on the <menuchoice> <guimenu "
+"lang=\"en\">File</guimenu> <guimenuitem>Merge</guimenuitem> </menuchoice> "
+"submenu, instead of using the Open or Import option."
+msgstr ""
+"För att sammanfoga en fil, använd bara passande alternativ i undermenyn "
+"<menuchoice><guimenu lang=\"sv\">Arkiv</guimenu> "
+"<guimenuitem>Sammanfoga</guimenuitem></menuchoice>, istället för att "
+"använda alternativen Öppna eller Importera."
+
+#. Tag: title
+#: index.docbook:447
+#, no-c-format
+msgid "Printing"
+msgstr "Utskrift"
+
+#. Tag: para
+#: index.docbook:448
+#, no-c-format
+msgid ""
+"You can print out a composition in the form of a musical score, using the "
+"<menuchoice> <guimenu lang=\"en\">File</guimenu> "
+"<guimenuitem>Print</guimenuitem> </menuchoice> function."
+msgstr ""
+"Du kan skriva ut en komposition i form av ett partitur, genom att använda "
+"funktionen <menuchoice><guimenu lang=\"sv\">Arkiv</guimenu> "
+"<guimenuitem>Skriv ut</guimenuitem></menuchoice>."
+
+#. Tag: para
+#: index.docbook:458
+#, no-c-format
+msgid ""
+"Producing a score from performance data is a hard task, and in most cases "
+"it's unreasonable to expect a default printout based on MIDI data to be very "
+"readable. You should use the <link linkend=\"notation-view\">notation "
+"editor</link> to tidy up the score before printing. (See also <link "
+"linkend=\"nv-quantization\">Notation from performance data</link>.)"
+msgstr ""
+"Att skapa ett partitur från utförd data är en svår uppgift, och i de "
+"flesta fall är det inte rimligt att förvänta sig att en standardutskrift "
+"baserad på MIDI-data är särskilt läsbar. Du bör använda <link "
+"linkend=\"notation-view\">notbehandlaren</link> för att städa upp "
+"partituret innan du skriver ut det. (Se också <link "
+"linkend=\"nv-quantization\">Notskrift från utförandedata</link>.)"
+
+#. Tag: para
+#: index.docbook:468
+#, no-c-format
+msgid ""
+"&rosegarden; is capable of producing very readable scores. Even so, it is "
+"designed to be a screen editor and not primarily a typesetter. If you want "
+"to produce true print-quality scores you should consider using <ulink "
+"url=\"http://www.lilypond.org\">Lilypond</ulink> in conjunction with "
+"&rosegarden;. Lilypond is music typesetting software that reads a "
+"specialised text file format and produces high-quality typeset output. "
+"&rosegarden; is capable of writing Lilypond files using the <menuchoice> "
+"<guimenu lang=\"en\">File</guimenu> <guimenuitem>Export</guimenuitem> "
+"<guimenuitem>Export Lilypond</guimenuitem> </menuchoice> function."
+msgstr ""
+"&rosegarden; klarar av att skapa helt läsbara partitur. Även om det är "
+"så, är programmet avsett att vara en skärmeditor, och inte i huvudsak "
+"avsett för typsättning. Om du vill skapa partitur med riktig "
+"utskriftskvalitet, bör du fundera på att använda <ulink "
+"url=\"http://www.lilypond.org\">Lilypond</ulink> tillsammans med "
+"&rosegarden;. Lilypond är programvara för typsättning av musik som läser "
+"ett specialiserat textfilformat, och skapar typsatt utmatning av hög "
+"kvalitet. &rosegarden; klarar av att skriva Lilypond-filer med funktionen "
+"<menuchoice> <guimenu lang=\"sv\">Arkiv</guimenu> "
+"<guimenuitem>Exportera</guimenuitem> <guimenuitem>Exportera "
+"Lilypond-fil</guimenuitem></menuchoice>."
+
+#. Tag: title
+#: index.docbook:487
+#, no-c-format
+msgid "The Track Editor"
+msgstr "Spåreditorn"
+
+#. Tag: title
+#: index.docbook:489 index.docbook:842
+#, no-c-format
+msgid "Overview"
+msgstr "Översikt"
+
+#. Tag: para
+#: index.docbook:490
+#, no-c-format
+msgid ""
+"&rosegarden;'s main layout is similar to many other popular sequencers. It "
+"is based on a track structure &mdash; the main window shows a track editor "
+"with a list of tracks and their associated instruments down the left hand "
+"side. You can manipulate and move blocks of music data (referred to as "
+"&ldquo;segments&rdquo;) on the track editor as well as opening the segments "
+"themselves in specialised editors (<link "
+"linkend=\"notation-view\">notation</link>, <link "
+"linkend=\"matrix-view\">matrix</link>, <link "
+"linkend=\"percussion-matrix-view\">percussion matrix</link>, and <link "
+"linkend=\"event-view\">event list</link>)."
+msgstr ""
+"&rosegarden;s utseende liknar många andra populära musikbehandlare. "
+"Det är baserat på en spårstruktur: Huvudfönstret visar en spåreditor "
+"med en spårlista och tillhörande instrument längs med vänster sida. Du "
+"kan behandla och flytta block med musikdata (som kallas "
+"&ldquo;segment&rdquo;) i spåreditorn, samt öppna själva segmenten i "
+"specialiserade editorer (<link linkend=\"notation-view\">not</link>, "
+"<link linkend=\"matrix-view\">matris</link>, "
+"<link linkend=\"percussion-matrix-view\">slagverksmatris</link> "
+"och <link linkend=\"event-view\">händelselista</link>)."
+
+#. Tag: phrase
+#: index.docbook:512
+#, no-c-format
+msgid "&rosegarden;'s Track Editor showing two segments of music data"
+msgstr "&rosegarden;s spåreditor som visar två segment med musikdata"
+
+#. Tag: para
+#: index.docbook:518
+#, no-c-format
+msgid ""
+"Tracks can be assigned to a range of &MIDI;, plugin synth, or audio "
+"instruments. In the picture above we see three segments in the track editor "
+"on tracks assigned to General MIDI instruments."
+msgstr ""
+"Spår kan tilldelas en uppsättning &MIDI;-instrument, syntinsticksmoduler "
+"eller ljudinstrument. I bilden ovan syns tre segment i spåreditorn för "
+"spår som är tilldelade till generella MIDI-instrument."
+
+#. Tag: phrase
+#: index.docbook:532
+#, no-c-format
+msgid "&rosegarden;'s Track buttons showing track labels"
+msgstr "&rosegarden;s spårknappar som visar spårnamn"
+
+#. Tag: para
+#: index.docbook:538
+#, no-c-format
+msgid ""
+"The button area to the left of the segment canvas shows you the track "
+"number, mute and record status, and the label of the track. You can mute or "
+"unmute a track by clicking on the blue LED-style button, and select a "
+"particular track as a record target by clicking on the red one. To change "
+"the track label, double-click on it."
+msgstr ""
+"Området med knappar till vänster om segmentduken visar spårnummer, "
+"tystnads- och inspelningsstatus, och spårets namn. Du kan göra ett spår "
+"tyst eller inte genom att klicka på den blåa knappen i form av en lysdiod, "
+"och välja ett visst spår som ska användas för inspelning genom att "
+"klicka på den röda knappen. För att ändra spårnamnet, dubbelklicka "
+"på det."
+
+#. Tag: phrase
+#: index.docbook:554
+#, no-c-format
+msgid "&rosegarden;'s Track buttons showing instrument assignments"
+msgstr "&rosegarden;s spårknappar som visar instrumenttilldelningar"
+
+#. Tag: para
+#: index.docbook:560
+#, no-c-format
+msgid ""
+"Track labels are only shown if the <menuchoice> <guimenu "
+"lang=\"en\">Settings</guimenu> <guimenuitem>Show Track Labels</guimenuitem> "
+"</menuchoice> menu option is enabled. Otherwise, as in this picture, the "
+"instrument assignments for the tracks are shown instead."
+msgstr ""
+"Spårnamn visas bara om menyalternativet <menuchoice><guimenu "
+"lang=\"sv\">Inställningar</guimenu> <guimenuitem>Visa "
+"spårnamn</guimenuitem></menuchoice> är aktiverat. Annars visas "
+"spårens instrumenttilldelningar istället, som i bilden."
+
+#. Tag: title
+#: index.docbook:572
+#, no-c-format
+msgid "Tracks and instruments"
+msgstr "Spår och instrument"
+
+#. Tag: para
+#: index.docbook:573
+#, no-c-format
+msgid ""
+"Each track must have an instrument assigned to it, in order to be heard. By "
+"default the first 16 tracks are assigned to the 16 instruments of the first "
+"available MIDI device, and the next 16 tracks are assigned to audio."
+msgstr ""
+"Varje spår måste ha ett tilldelat instrument för att kunna höras. "
+"Normalt tilldelas de 16 första spåren till de 16 instrumenten i den "
+"första tillgängliga MIDI-enheten, och de följande 16 spåren tilldelas "
+"till ljud."
+
+#. Tag: para
+#: index.docbook:579
+#, no-c-format
+msgid ""
+"To change the instrument assignment for a track, right-click on the track "
+"label: a pop-up menu will appear from which you can select among all the "
+"available instruments."
+msgstr ""
+"För att ändra instrumenttilldelningen för ett spår, högerklicka på "
+"spårnamnet: En meny dyker upp där du kan välja bland alla tillgängliga "
+"instrument."
+
+#. Tag: phrase
+#: index.docbook:591
+#, no-c-format
+msgid "&rosegarden;'s Instrument menu"
+msgstr "&rosegarden;s instrumentmeny"
+
+#. Tag: para
+#: index.docbook:597
+#, no-c-format
+msgid ""
+"An instrument can be understood as a single channel on a &MIDI; device, or "
+"as a mono or stereo audio output or an audio synth plugin. Tracks containing "
+"note data should be assigned to &MIDI; or synth plugin instruments, and "
+"those containing audio to audio instruments. You can assign more than one "
+"track to the same instrument, in which case the multiple tracks will use the "
+"same sounds."
+msgstr ""
+"Ett instrument kan betraktas som en enstaka kanal i en &MIDI;-enhet, som en "
+"mono- eller stereoljudutgång, eller som en ljudsyntinsticksmodul. Spår som "
+"innehåller notinformation ska tilldelas till &MIDI;- eller "
+"syntinsticksinstrument, och de som innehåller ljud till ljudinstrument. Du "
+"kan tilldela mer än ett spår till samma instrument, och i så fall "
+"använder alla dessa spår samma ljud."
+
+#. Tag: para
+#: index.docbook:606
+#, no-c-format
+msgid ""
+"You can change various properties of the instrument associated with a track "
+"using the <link linkend=\"segment-view-instrumentparameterbox\">Instrument "
+"Parameter Box</link>. This is where, for example, you would set a MIDI "
+"instrument to use a particular patch and so produce a particular sound "
+"(piano, strings etc)."
+msgstr ""
+"Du kan ändra diverse egenskaper för instrumentet som tilldelats ett spår, "
+"genom att använda <link "
+"linkend=\"segment-view-instrumentparameterbox\">instrumentparameterrutan</lin"
+"k>. Det är till exempel här som du kan ställa in ett MIDI-instrument så "
+"att det använder en speciell ljudpatch, och på så sätt åstadkommer ett "
+"speciellt ljud (piano, stråkar, etc.)."
+
+#. Tag: para
+#: index.docbook:614
+#, no-c-format
+msgid ""
+"See the <link linkend=\"studio-introduction\">Studio</link> section for more "
+"about instruments."
+msgstr ""
+"Se avsnittet <link linkend=\"studio-introduction\">Studio</link> för mer om "
+"instrument."
+
+#. Tag: title
+#: index.docbook:623
+#, no-c-format
+msgid "Creating segments"
+msgstr "Skapa segment"
+
+#. Tag: para
+#: index.docbook:624
+#, no-c-format
+msgid ""
+"To create an empty segment, in order to begin composing something new, you "
+"need to use the pencil tool. Click on the pencil on the toolbar, and then "
+"click at the point where you want the segment to start (at the correct "
+"height for the track you want the segment to be on, and at a distance across "
+"the editor window corresponding to the correct time) and drag rightwards "
+"until the segment is the right number of bars long."
+msgstr ""
+"För att skapa ett tomt segment när någonting nytt ska komponeras, måste "
+"du använda pennverktyget. Klicka på pennan i verktygsraden, och klicka "
+"därefter på stället där du vill att segmentet ska börja (på rätt "
+"plats för spåret som du vill att segmentet ska finnas i, och på ett "
+"avstånd i redigeringsfönstret som motsvarar rätt tid) och dra åt höger "
+"till segmentet är rätt antal takter i längd."
+
+#. Tag: para
+#: index.docbook:635
+#, no-c-format
+msgid ""
+"Usually each new segment starts on a barline and extends bar by bar, but "
+"this snap-to-grid effect can be prevented by holding down Shift while "
+"clicking and dragging."
+msgstr ""
+"Oftast börjar varje nytt segment på ett taktstreck och utökas takt för "
+"takt, men effekten att låsa till rutnätet kan förhindras genom att hålla "
+"nere Skift under klick- och dragåtgärden."
+
+#. Tag: para
+#: index.docbook:641
+#, no-c-format
+msgid ""
+"Once you have created a segment, you can then begin editing using the <link "
+"linkend=\"matrix-view\">matrix</link>, <link "
+"linkend=\"percussion-matrix-view\">percussion matrix</link> or <link "
+"linkend=\"notation-view\">notation</link> editors. To use one of these "
+"editors, either double-click on the segment, or else click with the right "
+"mouse button and choose the editor you want from the context menu."
+msgstr ""
+"När du väl har skapat ett segment kan du börja redigera det med <link "
+"linkend=\"matrix-view\">matriseditorn</link>, <link "
+"linkend=\"percussion-matrix-view\">slagverksmatriseditorn</link> eller "
+"<link linkend=\"notation-view\">notbehandlaren</link>. För att använda en "
+"av editorerna, dubbelklicka antingen på segmentet eller klicka med höger "
+"musknapp och välj editorn du vill använda i den sammanhangsberoende menyn."
+
+#. Tag: para
+#: index.docbook:650
+#, no-c-format
+msgid ""
+"If you are intending to <link linkend=\"recording\">record</link> from a "
+"MIDI device or audio input, you don't need to create a new segment to record "
+"into first -- each separate recording always goes into a new segment, "
+"created automatically during recording."
+msgstr ""
+"Om du avser att <link linkend=\"recording\">spela in</link> från en "
+"MIDI-enhet eller ljudingång, behöver du inte först skapa ett nytt segment "
+"att spela in till. Varje enskild inspelning hamnar alltid i ett nytt "
+"segment, som skapas automatiskt under inspelningen."
+
+#. Tag: title
+#: index.docbook:660
+#, no-c-format
+msgid "Audio segments"
+msgstr "Ljudsegment"
+
+#. Tag: para
+#: index.docbook:661
+#, no-c-format
+msgid ""
+"An audio segment contains recorded or sampled audio data, instead of "
+"editable note-event data. Rosegarden allows you to record, play, arrange and "
+"split audio segments, but does not contain audio waveform editing facilities."
+msgstr ""
+"Ett ljudsegment innehåller inspelad eller samplad ljuddata, istället för "
+"redigerbar tonhändelsedata. Rosegarden låter dig spela in, spela upp, "
+"arrangera och dela ljudsegment, men innehåller inte funktioner för "
+"redigering av ljudvågformer."
+
+#. Tag: para
+#: index.docbook:667
+#, no-c-format
+msgid ""
+"To create an audio segment, you can <link "
+"linkend=\"recording\">record</link> from an audio source onto a track "
+"assigned to an audio instrument, or you can work with existing WAV files. To "
+"do this, you need to use the audio manager dialog (reached via "
+"<menuchoice><guimenu lang=\"en\">Segments</guimenu><guimenuitem>Manage Audio "
+"Segments</guimenuitem></menuchoice>)."
+msgstr ""
+"För att skapa ett ljudsegment kan du <link linkend=\"recording\">spela "
+"in</link> från en ljudkälla till ett spår som hör till ett "
+"ljudinstrument, eller arbeta med befintliga WAV-filer. För att göra det "
+"måste du använda ljudhanteringsdialogrutan (som nås via "
+"<menuchoice><guimenu lang=\"sv\">Segment</guimenu> <guimenuitem>Hantera "
+"ljudsegment</guimenuitem></menuchoice>)."
+
+#. Tag: phrase
+#: index.docbook:682
+#, no-c-format
+msgid "The audio file manager"
+msgstr "Ljudfilhantering"
+
+#. Tag: para
+#: index.docbook:688
+#, no-c-format
+msgid ""
+"You can drag-and-drop audio files from the KDE file browser or your KDE "
+"desktop into the audio file manager, or you can open them using its File "
+"menu. Then you can either drag-and-drop them onto Rosegarden's track canvas, "
+"or use the audio file manager's <menuchoice><guimenu "
+"lang=\"en\">Action</guimenu><guimenuitem>Insert into Selected Audio "
+"Track</guimenuitem></menuchoice> menu function, provided the current "
+"selected track in the main window is assigned to an audio instrument. "
+"Newly-recorded audio segments also appear in the audio file manager dialog."
+msgstr ""
+"Du kan dra och släppa ljudfiler från KDE:s filbläddrare eller "
+"KDE-skrivbordet till ljudfilhanteringen, eller öppna dem med dess "
+"arkivmeny. Därefter kan du antingen dra och släppa dem på Rosegardens "
+"spårduk, eller använda menyfunktionen <menuchoice><guimenu "
+"lang=\"sv\">Åtgärd</guimenu> <guimenuitem>Infoga i markerat "
+"ljudspår</guimenuitem></menuchoice> i ljudfilhanteringen, under "
+"förutsättning att spåret som för närvarande är markerat i "
+"huvudfönstret är tilldelat till ett ljudinstrument. Nyinspelade "
+"ljudsegment syns också i dialogrutan för ljudfilhantering."
+
+#. Tag: para
+#: index.docbook:699
+#, no-c-format
+msgid ""
+"Details of the audio files associated with a particular composition are "
+"saved with that composition, but the audio files themselves are not. You "
+"should ensure your document has a sensible audio file search path (via "
+"<menuchoice><guimenu lang=\"en\">Composition</guimenu><guimenuitem>Edit "
+"Document "
+"Properties...</guimenuitem><guimenuitem>Audio</guimenuitem></menuchoice>) so "
+"as to keep your audio files accessible together."
+msgstr ""
+"Information om ljudfilerna som hör ihop med en viss komposition är sparad "
+"med kompositionen, men själva ljudfilerna är inte det. Du måste "
+"försäkra dig om att ditt dokument har en vettig sökväg för ljudfiler "
+"(via <menuchoice><guimenu lang=\"sv\">Komposition</guimenu> "
+"<guimenuitem>Redigera dokumentegenskaper...</guimenuitem> "
+"<guimenuitem>Ljud</guimenuitem></menuchoice>, för att göra det möjligt "
+"att komma åt dina ljudfiler tillsammans."
+
+#. Tag: para
+#: index.docbook:707
+#, no-c-format
+msgid ""
+"The audio manager dialog also shows the sample-rate and other information "
+"for each audio file, and marks with an asterisk any audio file whose sample "
+"rate does not match that of the current JACK audio session that Rosegarden "
+"is using. Rosegarden will resample these files at playback time using a fast "
+"(but correspondingly very low quality) linear resampler. You are advised to "
+"resample them separately using a separate dedicated audio editor instead."
+msgstr ""
+"Dialogrutan för ljudfilhantering visar också samplingsfrekvensen och annan "
+"information för varje ljudfil, och markerar eventuella ljudfiler vars "
+"samplingsfrekvens inte motsvarar nuvarande JACK-ljudsessionen som Rosegarden "
+"använder. Rosegarden samplar om filerna vid uppspelning med en snabb "
+"linjär omsampling (men därför med mycket dålig kvalitet). Du råds att "
+"sampla om dem separat med en särskild dedicerad ljudeditor istället."
+
+#. Tag: title
+#: index.docbook:720
+#, no-c-format
+msgid "Manipulating segments"
+msgstr "Hantering av segment"
+
+#. Tag: para
+#: index.docbook:721
+#, no-c-format
+msgid ""
+"The main window contains a selection of \"tools\" for editing segments. "
+"These are available from the main toolbar: first select the tool you want "
+"from the toolbar, and then click and drag on the segments on the main canvas."
+msgstr ""
+"Huvudfönstret innehåller en uppsättning \"verktyg\" för att redigera "
+"segment. De är tillgängliga i huvudverktygsraden: Välj först verktyget "
+"du vill ha i verktygsraden, och klicka och dra därefter på segmenten i "
+"huvudduken."
+
+#. Tag: title
+#: index.docbook:729
+#, no-c-format
+msgid "The Select tool"
+msgstr "Markeringsverktyget"
+
+#. Tag: para
+#: index.docbook:730
+#, no-c-format
+msgid ""
+"The \"select tool\" (the arrow tool) is actually a multipurpose tool: it can "
+"be used to select, move, copy, resize and create segments."
+msgstr ""
+"\"Markeringsverktyget\" (pilverktyget) är i själva verket ett verktyg med "
+"flera användningar. Det kan användas för att markera, flytta, kopiera, "
+"ändra storlek och skapa segment."
+
+#. Tag: para
+#: index.docbook:735
+#, no-c-format
+msgid ""
+"The most obvious use is selection: select a single segment by clicking on it "
+"with the select tool, or select several by clicking with Shift held down, or "
+"by clicking in an empty area of the window and dragging out an area."
+msgstr ""
+"Den mest uppenbara användningen är markering: Markera ett enstaka segment "
+"genom att klicka på det med markeringsverktyget, eller markera flera genom "
+"att klicka med Skift nertryckt, eller genom att klicka på ett tomt ställe "
+"i fönstret och dra för att åstadkomma ett område."
+
+#. Tag: para
+#: index.docbook:742
+#, no-c-format
+msgid ""
+"To move segments with the select tool, simply click and drag on the segment. "
+"To create copies, click and drag with Ctrl held down. To resize a segment, "
+"click and drag on the right-hand edge of the segment; and to create new "
+"segments, click and drag on an empty area with the middle mouse button."
+msgstr ""
+"För att flytta segment med markeringsverktyget, klicka och dra helt enkelt "
+"segmentet. För att skapa kopior, klicka och dra med Ctrl nertryckt. För "
+"att ändra storlek på ett segment, klicka och dra segmentets högerkant, "
+"och för att skapa nya segment klicka och dra på ett tomt ställe med "
+"musens mittenknapp."
+
+#. Tag: para
+#: index.docbook:749
+#, no-c-format
+msgid ""
+"The select tool doesn't replace the other tools completely, though &mdash; "
+"sometimes you need to be more precise about which operation you intend, "
+"particularly when working on small segments."
+msgstr ""
+"Markeringsverktyget ersätter ändå inte övriga verktyg helt och hållet: "
+"Ibland behöver du vara noggrannare med vilken åtgärd du avsåg, särskilt "
+"vid arbete med små segment."
+
+#. Tag: title
+#: index.docbook:759
+#, no-c-format
+msgid "Move and Resize tools"
+msgstr "Verktygen för att flytta och ändra storlek"
+
+#. Tag: para
+#: index.docbook:760
+#, no-c-format
+msgid ""
+"To move a segment to a different start time or track, use the Move tool and "
+"click and drag on the segment you want to move. If you hold down the Ctrl "
+"key while dragging, the segment will be copied instead of moved."
+msgstr ""
+"För att flytta ett segment till en annan starttid eller ett annat spår, "
+"använd förflyttningsverktyget och klicka och dra segmentet du vill flytta. "
+"Om du håller nere Ctrl-tangenten medan du drar, kopieras segmentet "
+"istället för att flyttas."
+
+#. Tag: para
+#: index.docbook:765
+#, no-c-format
+msgid ""
+"To resize a segment, use the Resize tool, and click and drag on the "
+"right-hand end of the segment."
+msgstr ""
+"För att ändra storlek på ett segment, använd verktyget för "
+"storleksändring, och klicka och dra i högra ändan av segmentet."
+
+#. Tag: para
+#: index.docbook:768
+#, no-c-format
+msgid ""
+"For both move and resize you can hold Shift for fine positioning, to avoid "
+"snapping to a particular grid position."
+msgstr ""
+"Både vid förflyttning och storleksändring kan du hålla nere Skift för "
+"finpositionering, för att undvika att hoppa till en viss rutnätsposition."
+
+#. Tag: title
+#: index.docbook:775
+#, no-c-format
+msgid "Split tool"
+msgstr "Delningsverktyget"
+
+#. Tag: para
+#: index.docbook:776
+#, no-c-format
+msgid ""
+"You can use the split tool <inlinemediaobject> <imageobject> <imagedata "
+"fileref=\"rg-split.png\"/> </imageobject> </inlinemediaobject> to split a "
+"single segment into two separate segments. To split your segment, select the "
+"split tool and click on the segment you wish to split."
+msgstr ""
+"Du kan använda delningsverktyget <inlinemediaobject> <imageobject> "
+"<imagedata fileref=\"rg-split.png\"/> </imageobject> </inlinemediaobject> "
+"för att dela ett enstaka segment i två separata segment. För att dela "
+"segmentet, välj delningsverktyget och klicka på segmentet du vill dela."
+
+#. Tag: para
+#: index.docbook:787
+#, no-c-format
+msgid ""
+"By default segments are split on the closest barline to the cursor, but this "
+"can be prevented by holding down Shift while splitting the segment."
+msgstr ""
+"Normalt delas segment vid taktstrecket närmast markören, men det kan "
+"förhindras genom att hålla nere Skift när segmentet delas."
+
+#. Tag: title
+#: index.docbook:796
+#, no-c-format
+msgid "Tempo and Time Signature"
+msgstr "Tempo och taktart"
+
+#. Tag: title
+#: index.docbook:798
+#, no-c-format
+msgid "<title>Tempo</title>"
+msgstr "<title>Tempo</title>"
+
+#. Tag: phrase
+#: index.docbook:806
+#, no-c-format
+msgid "&rosegarden;'s tempo dialog"
+msgstr "&rosegarden;s tempodialogruta"
+
+#. Tag: title
+#: index.docbook:814
+#, no-c-format
+msgid "Time signature"
+msgstr "Taktart"
+
+#. Tag: phrase
+#: index.docbook:822
+#, no-c-format
+msgid "&rosegarden;'s time signature dialog"
+msgstr "&rosegarden;s taktartsdialogruta"
+
+#. Tag: title
+#: index.docbook:832
+#, no-c-format
+msgid "The Transport"
+msgstr "Överföringen"
+
+#. Tag: para
+#: index.docbook:833
+#, no-c-format
+msgid ""
+"When you play a composition, &rosegarden; sweeps a playback pointer across "
+"the tracks from left to right playing the contents of the segments as it "
+"crosses them. The pointer's position on the screen is tracked and controlled "
+"by a window called the Transport."
+msgstr ""
+"När du spelar upp en komposition, sveper &rosegarden; en "
+"uppspelningsmarkör över spåren från vänster till höger och spelar upp "
+"innehållet i segmenten när den korsar dem. Markörens position på "
+"skärmen följs och styrs av ett fönster som kallas Överföring."
+
+#. Tag: phrase
+#: index.docbook:850
+#, no-c-format
+msgid "&rosegarden;'s Transport window"
+msgstr "&rosegarden;s överföringsfönster"
+
+#. Tag: para
+#: index.docbook:856
+#, no-c-format
+msgid ""
+"If the Transport isn't visible, you can activate it with <menuchoice> "
+"<guimenu lang=\"en\">Settings</guimenu> <guimenuitem>Show "
+"Transport</guimenuitem> </menuchoice>."
+msgstr ""
+"Om överföringen inte är synlig, kan du aktivera den med <menuchoice> "
+"<guimenu lang=\"sv\">Inställningar</guimenu> <guimenuitem>Visa "
+"överföring</guimenuitem></menuchoice>."
+
+#. Tag: para
+#: index.docbook:861
+#, no-c-format
+msgid ""
+"The Transport shows the time reached by the playback pointer, in seconds by "
+"default. You can switch it to show musical time (bar and beat counts), "
+"musical time with a flashing visual metronome, or audio sample frame times, "
+"using the topmost of the small buttons on the left of the transport window. "
+"The button immediately below that toggles the display so as to show time "
+"remaining to the end of the composition instead of from the start."
+msgstr ""
+"Överföringen visar tiden som uppnåtts av uppspelningsmarkören, normalt i "
+"sekunder. Du kan ändra den att visa metronomtid (takter och taktslag), "
+"metronomtid med en blinkande visuell metronom, eller ramtider för "
+"ljudsampling, med den översta av de små knapparna till vänster i "
+"överföringsfönstret. Knappen direkt nedanför byter mellan att visa tid "
+"som är kvar till kompositionens slut istället för tid från början."
+
+#. Tag: para
+#: index.docbook:870
+#, no-c-format
+msgid ""
+"The main controls on the transport start the sequencer playing and pause it, "
+"fast forward the pointer position, rewind it, stop it or jump to beginning "
+"or end of composition."
+msgstr ""
+"Huvudknapparna i överföringen startar uppspelning med musikbehandlaren eller "
+"gör paus, flyttar markörpositionen framåt, flyttar den bakåt, stoppar "
+"den eller går till kompositionens början eller slut."
+
+#. Tag: para
+#: index.docbook:876
+#, no-c-format
+msgid ""
+"Additional controls and a &MIDI; event display are hidden on the bottom flap "
+"on the transport, which can be toggled on or off using the arrow button next "
+"to it at the left. Also on this extra portion there are buttons for "
+"recording, setting loops, soloing individual tracks, turning on or off the "
+"metronome, and silencing your MIDI devices (panic button)."
+msgstr ""
+"Ytterligare knappar och visning av &MIDI;-händelser är dolda längst ner i "
+"överföringsfönstret, och kan visas eller inte med pilknappen i det "
+"längst till vänster. Dessutom finns knappar för inspelning, för "
+"upprepning, för att spela enskilda spår solo, för att stänga av eller "
+"sätta på metronomen och för att tysta dina MIDI-enheter (panikknapp) i "
+"extradelen."
+
+#. Tag: title
+#: index.docbook:885
+#, no-c-format
+msgid "Recording"
+msgstr "Inspelning"
+
+#. Tag: para
+#: index.docbook:886
+#, no-c-format
+msgid ""
+"To record a new segment into a track, first make sure the right track is "
+"selected for recording by selecting the red (for audio tracks) or yellow "
+"(for MIDI tracks) LED-style button on the track label, and then use the "
+"Transport's record control. This has the effect of both starting the "
+"transport, thus playing the existing composition, and recording into the "
+"appropriate track."
+msgstr ""
+"För att spela in ett nytt segment i ett spår, försäkra dig först om att "
+"rätt spår är markerat för inspelning genom att klicka på den röda (för ljudspår) "
+"eller gula (för MIDI-spår) lysdiodknappen vid spårets namn, och använd "
+"därefter överföringens inspelningsknapp. Det ger effekten att både starta "
+"överföringen, och därigenom spela upp den befintliga kompositionen, och att "
+"spela in i motsvarande spår."
+
+#. Tag: para
+#: index.docbook:895
+#, no-c-format
+msgid ""
+"You can only select a single MIDI track for recording, but you can record "
+"any number of audio tracks at once so long as your computer is powerful "
+"enough. You can also select a MIDI track and one or more audio tracks at the "
+"same time. Be careful not to accidentally leave tracks selected when you "
+"have finished using them and are trying to record somewhere else."
+msgstr ""
+"Du kan bara markera ett enda MIDI-spår för inspelning, men du kan "
+"spela in hur många ljudspår som helst samtidigt så länge datorn är "
+"kraftfull nog. Du kan också markera ett MIDI-spår och ett eller flera "
+"ljudspår samtidigt. Var försiktig så att du inte lämnar spår markerade "
+"av misstag när du är klar med användning av dem och försöker "
+"spela in någon annanstans."
+
+#. Tag: para
+#: index.docbook:903
+#, no-c-format
+msgid ""
+"Alternatively you can use punch-in record to separate the acts of starting "
+"the transport and entering record mode. Punch-in record is toggled with the "
+"Space bar. You can press Space while playing a composition to switch "
+"instantly between playback and recording without stopping the transport, or "
+"you can use Space to arm for recording when the transport is stopped, so "
+"that a subsequent Play will in fact record as well. (The latter is handy "
+"when synchronising to an <link linkend=\"transport-external\">external "
+"transport</link>.)"
+msgstr ""
+"Som ett alternativ kan du använda punch-in inspelning för att skilja på "
+"åtgärderna att starta överföringen och gå in i inspelningsläge. "
+"Punch-in inspelning ändras med mellanslagstangenten. Du kan trycka på "
+"mellanslag medan en komposition spelas upp för att omedelbart byta mellan "
+"uppspelning och inspelning utan att stoppa överföringen, eller använda "
+"mellanslag för att förbereda inspelning medan överföringen är stoppad, "
+"så att följande uppspelning i själva verket också spelar in. (Det senare "
+"är praktiskt vid synkronisering med en <link linkend=\"transport-external\">"
+"extern överföring</link>.)"
+
+#. Tag: para
+#: index.docbook:914
+#, no-c-format
+msgid ""
+"If you record to a MIDI track, your recording will be from all of the MIDI "
+"devices that are selected for recording in the <link "
+"linkend=\"studio-device-editor\">MIDI device manager</link>."
+msgstr ""
+"Om du spelar in ett MIDI-spår, sker inspelning från alla MIDI-enheter "
+"som är inställda för inspelning i <link linkend=\"studio-device-editor\">"
+"MIDI-enhetshanteringen</link>."
+
+#. Tag: para
+#: index.docbook:920
+#, no-c-format
+msgid ""
+"If you record to audio tracks, your recording to each track will be from the "
+"input currently selected for that track's instrument in the <link "
+"linkend=\"segment-view-instrumentparameterbox\">instrument parameter "
+"box</link>. This will either be an external audio input or an audio "
+"submaster or master (for performing mixdowns). If it's an external input, it "
+"will by default record from your soundcard's first available physical record "
+"in. You may wish to use a JACK connection tool to connect some other JACK "
+"audio application to the input instead."
+msgstr ""
+"Om du spelar in ljudspår, sker inspelning av varje spår från ingången som för "
+"närvarande är inställd för det spårets instrument i <link "
+"linkend=\"segment-view-instrumentparameterbox\">instrumentparameterrutan"
+"</link>. Det är antingen en extern ljudingång eller en delnivå eller "
+"huvudnivå för ljud (för att utföra ihopmixningar). Om det är en extern "
+"ingång, spelas det normalt in från ljudkortets första tillgängliga "
+"fysiska inspelningsingång. Du kanske vill använda ett anslutningsverktyg i "
+"JACK för att ansluta ett annat ljudprogram som stöder JACK till ingången "
+"istället."
+
+#. Tag: title
+#: index.docbook:936
+#, no-c-format
+msgid "Synchronising to external transports"
+msgstr "Synkronisering med extern överföring"
+
+#. Tag: title
+#: index.docbook:938
+#, no-c-format
+msgid "JACK Transport"
+msgstr "Överföring med JACK"
+
+#. Tag: para
+#: index.docbook:939
+#, no-c-format
+msgid ""
+"Rosegarden supports the JACK transport mechanism for synchronising its "
+"transport with other JACK applications on the same computer. To activate it, "
+"go to <menuchoice> <guimenu lang=\"en\">Settings</guimenu> "
+"<guimenuitem>Configure Rosegarden...</guimenuitem> </menuchoice> and in the "
+"Sequencer page's Synchronisation tab, select \"Sync\" from the JACK "
+"transport mode menu."
+msgstr ""
+"Rosegarden stöder överföringsmekanismen i JACK för att synkronisera "
+"överföringen med andra program med JACK på samma dator. För att aktivera "
+"den, gå till <menuchoice><guimenu lang=\"sv\">Inställningar</guimenu> "
+"<guimenuitem>Anpassa Rosegarden...</guimenuitem></menuchoice> och välj "
+"\"Synkronisera\" i menyn för JACK överföringsläge på sidan Musikbehandlare "
+"under fliken Synkronisering."
+
+#. Tag: para
+#: index.docbook:950
+#, no-c-format
+msgid ""
+"When the JACK transport is in use, all of the applications that are "
+"subscribed to it share a common transport control, and you can start, stop, "
+"and move the transport from any one of them."
+msgstr ""
+"När överföring med JACK används, delar alla program som prenumererar på "
+"den en gemensam styrning av överföringen, och du kan starta, stoppa och "
+"förflytta överföringen från vart och ett av dem."
+
+#. Tag: para
+#: index.docbook:955
+#, no-c-format
+msgid ""
+"Many Linux audio applications that use the JACK audio server also support "
+"JACK transport: consult their documentation for details of whether and how."
+msgstr ""
+"Många ljudprogram under Linux som använder ljudservern JACK stöder också "
+"överföring med JACK. Titta i deras dokumentation för detaljinformation om de "
+"gör det och hur."
+
+#. Tag: title
+#: index.docbook:960
+#, no-c-format
+msgid "MIDI Time Code"
+msgstr "MIDI-tidkod"
+
+#. Tag: para
+#: index.docbook:961
+#, no-c-format
+msgid ""
+"Rosegarden supports MIDI Time Code (MTC) synchronisation in master and slave "
+"modes. This is particularly useful for synchronising the Rosegarden "
+"transport with a hardware MTC-capable device, or with software running on "
+"other computers connected via MIDI."
+msgstr ""
+"Rosegarden stöder synkronisering med MIDI-tidkod (MTC) i huvud- och slavläge. "
+"Det är särskilt användbart för att synkronisera Rosegardens överföring med "
+"en hårdvaruenhet som stöder MTC, eller med programvara som kör på andra "
+"datorer anslutna via MIDI."
+
+#. Tag: para
+#: index.docbook:968
+#, no-c-format
+msgid ""
+"To make Rosegarden the MTC Master, so that it will control any MTC slave "
+"device or application connected to it, go to <menuchoice> <guimenu "
+"lang=\"en\">Settings</guimenu> <guimenuitem>Configure "
+"Rosegarden...</guimenuitem> </menuchoice> and in the Sequencer page's "
+"Synchronisation tab, select \"MTC Master\" from the MIDI Time Code menu. To "
+"make Rosegarden an MTC Slave so that Rosegarden's transport will "
+"automatically be synchronised with incoming MTC events, select \"MTC Slave\"."
+msgstr ""
+"För att göra Rosegarden till MTC-huvudenhet, så att det styr alla MTC-slavar "
+"eller program som ansluts, gå till <menuchoice><guimenu lang=\"sv\">"
+"Inställningar</guimenu> <guimenuitem>Anpassa Rosegarden...</guimenuitem>"
+"</menuchoice> och välj \"MTC-huvudenhet\" i menyn MIDI-tidkodsläge under "
+"fliken Synkronisering på sidan Musikbehandlare. För att göra Rosegarden "
+"till en slav, så att Rosegardens överföring automatiskt synkroniseras med "
+"inkommande MTC-händelser, välj \"MTC-slav\"."
+
+#. Tag: title
+#: index.docbook:986
+#, no-c-format
+msgid "The Studio"
+msgstr "Studion"
+
+#. Tag: title
+#: index.docbook:989
+#, no-c-format
+msgid "Devices, instruments and connections"
+msgstr "Enheter, instrument och anslutningar"
+
+#. Tag: para
+#: index.docbook:991
+#, no-c-format
+msgid ""
+"Rosegarden uses the term Studio to refer to everything it knows about the "
+"sound systems attached to the computer. This may include &MIDI; and audio "
+"hardware and other sound software, and includes information about "
+"connections, configuration, &MIDI; patches and so on. The Studio is built-in "
+"to every composition you create with Rosegarden."
+msgstr ""
+"Rosegarden använder termen studio för att ange allt som den känner till "
+"om ljudsystemen anslutna till datorn. Det kan omfatta &MIDI;- och "
+"ljudhårdvara och annan ljudprogramvara, och omfattar information om "
+"anslutningar, inställning, &MIDI;-patchar och så vidare. Studion är "
+"inbyggd i alla kompositioner du skapar med Rosegarden."
+
+#. Tag: para
+#: index.docbook:998
+#, no-c-format
+msgid "Three pieces of terminology are essential here:"
+msgstr "Tre ord i terminologin är fundamentala här:"
+
+#. Tag: term
+#: index.docbook:1003
+#, no-c-format
+msgid "Device"
+msgstr "Enhet"
+
+#. Tag: para
+#: index.docbook:1005
+#, no-c-format
+msgid ""
+"A <quote>device</quote>, as far as Rosegarden is concerned, is simply "
+"something capable of producing sounds. This may be a MIDI or audio device. "
+"MIDI devices do not necessarily correspond directly to physical MIDI ports: "
+"they are just things with names that you can refer to, expected to work in "
+"particular ways. Configuration information such as MIDI patch maps can be "
+"attached to devices."
+msgstr ""
+"En <quote>enhet</quote>, så vitt det angår Rosegarden, är helt enkelt "
+"något som kan skapa ljud. Det kan vara en MIDI- eller ljudenhet. "
+"MIDI-enheter motsvarar inte nödvändigtvis direkt med fysiska MIDI-portar: "
+"De är bara saker med namn som du kan ange, som förväntas fungera på ett "
+"visst sätt. Inställningsinformation som MIDI-patchavbildningar kan "
+"anslutas till enheter."
+
+#. Tag: term
+#: index.docbook:1018
+#, no-c-format
+msgid "Instrument"
+msgstr "Instrument"
+
+#. Tag: para
+#: index.docbook:1020
+#, no-c-format
+msgid ""
+"Each device has a number of <quote>instruments</quote>, each of which is "
+"assumed to make a particular sound. These are the things that you can assign "
+"tracks to in order to choose which sound they play. By default, a device "
+"contains 16 instruments, created for you at startup: if the device is a MIDI "
+"device, then these will each be initialised to one of the 16 MIDI channels. "
+"The instrument is where you set all the properties of a particular voice, "
+"such as program settings, reverb, volume etc."
+msgstr ""
+"Varje enhet har ett antal <quote>instrument</quote>, där vart och ett antas "
+"låta på ett visst sätt. Detta är det du kan tilldela spår till för att "
+"välja vilket ljud de spelar. Normalt innehåller en enhet 16 instrument, "
+"som skapas åt dig vid start. Om enheten är en MIDI-enhet, initieras vart "
+"och ett av dem till en av de 16 MIDI-kanalerna. Instrumentet är stället "
+"där du anger alla egenskaper för en viss stämma, som "
+"programinställningar, eko, volym, etc."
+
+#. Tag: term
+#: index.docbook:1035
+#, no-c-format
+msgid "Connection"
+msgstr "Anslutning"
+
+#. Tag: para
+#: index.docbook:1037
+#, no-c-format
+msgid ""
+"While a MIDI device is simply a name and a collection of configuration "
+"information, the <quote>connection</quote> specifies which MIDI port it is "
+"physically attached to. This can be configured in the <link "
+"linkend=\"studio-device-editor\">MIDI device manager</link>. (Audio and "
+"synth plugin devices do not have connections in the same way.)"
+msgstr ""
+"Även om en MIDI-enhet helt enkelt är ett namn och en samling "
+"inställningsinformation, anger <quote>anslutningen</quote> vilken MIDI-port "
+"som den är fysiskt ansluten till. Det kan ställas in i <link "
+"linkend=\"studio-device-editor\">MIDI-enhetshanteringen</link>. (Ljud- och "
+"syntinsticksmodulenheter har inte anslutningar på samma sätt)."
+
+#. Tag: para
+#: index.docbook:1050
+#, no-c-format
+msgid ""
+"For example, imagine a setup consisting of a PC with two physical MIDI "
+"ports, one of which has an external synth attached to it. Here you would "
+"normally configure Rosegarden so as to have one MIDI device, corresponding "
+"to the synth. You could then configure this device with the correct name and "
+"patch map, and then specify a connection for it that corresponded to the "
+"relevant MIDI port on your soundcard. Each of the 16 default instruments on "
+"the device could then be configured with a suitable program, and you would "
+"then assign tracks to those."
+msgstr ""
+"Tänk dig exempelvis en konfiguration som består av en dator med två "
+"fysiska MIDI-portar, där den ena har en extern synt ansluten. Då skulle du "
+"normalt ställa in Rosegarden att ha en MIDI-enhet, som motsvarar synten. Du "
+"skulle därefter kunna ställa in enheten med rätt namn och "
+"patchavbildning, och ange en anslutning för den som motsvarar ljudkortets "
+"verkliga MIDI-port. Vart och ett av de 16 standardinstrumenten på enheten "
+"skulle kunna anpassas med ett lämpligt program, och därefter skulle du "
+"tilldela spår till dem."
+
+#. Tag: para
+#: index.docbook:1061
+#, no-c-format
+msgid ""
+"In practice, Rosegarden will by default create a device for each of the "
+"available connections on startup. So in the example above, two MIDI devices "
+"will be created by default even though you only need one. You would "
+"generally then rename and apply patch maps to the first, and delete or "
+"simply not use the second. Remember that there is no way for Rosegarden to "
+"know what synths you actually have plugged in to the MIDI ports on your "
+"computer: for this reason, the devices created at startup are just intended "
+"to be a default set, and it's up to you to ensure that the devices you "
+"configure match those you are really using."
+msgstr ""
+"I praktiken försöker Rosegarden normalt skapa en enhet för var och en av "
+"de tillgängliga anslutningarna vid start. Så med exemplet ovan skulle två "
+"MIDI-enheter normalt skapas även om du bara behöver en. Du skulle "
+"därefter i allmänhet byta namn på och ange patchavbildningar för den "
+"första, och ta bort eller helt enkelt inte använda den andra. Kom ihåg "
+"att det finns inget sätt för Rosegarden att veta vilka syntar som du "
+"verkligen har anslutit till MIDI-portarna på datorn. Av denna anledning är "
+"enheterna som skapas vid start bara avsedda som en standarduppsättning, och "
+"det är upp till dig att försäkra dig om att enheterna du ställer in "
+"stämmer med de du verkligen använder."
+
+#. Tag: para
+#: index.docbook:1075
+#, no-c-format
+msgid ""
+"Once configured, the studio setup is stored with every Rosegarden-format "
+"file you save."
+msgstr ""
+"Så fort den är inställd, lagras studioinställningen med varje fil på "
+"Rosegarden-format som du sparar."
+
+#. Tag: title
+#: index.docbook:1081
+#, no-c-format
+msgid "Managing MIDI devices"
+msgstr "Hantering av MIDI-enheter"
+
+#. Tag: phrase
+#: index.docbook:1090
+#, no-c-format
+msgid "The MIDI device manager"
+msgstr "MIDI-enhetshantering"
+
+#. Tag: para
+#: index.docbook:1096
+#, no-c-format
+msgid ""
+"The MIDI device manager dialog shows you the MIDI devices that you currently "
+"have available to you, and where they are connected. To reach this dialog, "
+"use <menuchoice> <guimenu lang=\"en\">Composition</guimenu> "
+"<guimenuitem>Studio</guimenuitem> <guimenuitem>Manage MIDI "
+"Devices</guimenuitem> </menuchoice>."
+msgstr ""
+"Dialogrutan för MIDI-enhetshantering visar de MIDI-enheter som för "
+"närvarande är tillgängliga, och var de är anslutna. Använd "
+"<menuchoice><guimenu lang=\"sv\">Komposition</guimenu> "
+"<guimenuitem>Studio</guimenuitem> <guimenuitem>Hantera "
+"MIDI-enheter</guimenuitem></menuchoice> för att nå dialogrutan."
+
+#. Tag: para
+#: index.docbook:1106
+#, no-c-format
+msgid ""
+"As described in the <link linkend=\"studio-introduction\">Devices, "
+"Instruments and Connections</link> section, by default Rosegarden tries to "
+"provide a plausible set of devices for you at startup, and to make sensible "
+"connections for those devices. But the default configuration might not "
+"always be suitable, and so this dialog allows you to rename devices and "
+"modify their connections and play/record direction."
+msgstr ""
+"Som beskrivs i avsnittet <link linkend=\"studio-introduction\">Enheter, "
+"instrument och anslutningar</link>, försöker Rosegarden normalt "
+"tillhandahålla en rimlig uppsättning enheter vid start, och göra rimliga "
+"anslutningar för enheterna. Standarduppsättningen kanske dock inte alltid "
+"är lämplig, och därför låter dialogrutan dig byta namn på enheter och "
+"ändra deras anslutningar och uppspelnings- eller inspelningsriktningar."
+
+#. Tag: para
+#: index.docbook:1117
+#, no-c-format
+msgid ""
+"Each of the Play devices listed here provides a target for MIDI tracks to "
+"talk to: if you add a new Play device, you will then have 16 new instruments "
+"on this device which you can assign tracks to. If you then assign a "
+"connection for that device, the tracks assigned to it will play to the "
+"appropriate channel (depending on the instrument) of any MIDI synth attached "
+"to that connection."
+msgstr ""
+"Var och en av uppspelningsenheterna här tillhandahåller en utgång för "
+"MIDI-spår att skicka till: Om du lägger till en ny uppspelningsenhet, får "
+"du 16 nya instrument i enheten som du kan tilldela spår till. Om du "
+"därefter tilldelar en anslutning till enheten, spelas spåren som har "
+"tilldelats till den på lämplig kanal (beroende på instrumentet) i vilken "
+"MIDI-synt som helst som är kopplad till anslutningen."
+
+#. Tag: para
+#: index.docbook:1127
+#, no-c-format
+msgid ""
+"The Record devices listed here represent possible sources for recording "
+"MIDI. You can make one or more of them current (so that Rosegarden will "
+"listen to them when recording) using the checkboxes on each line, as shown "
+"in this dialog."
+msgstr ""
+"Inspelningsenheterna som listas här representerar möjliga källor för att "
+"spela in MIDI. Du kan göra en eller flera av dem aktuella (så att "
+"Rosegarden lyssnar på den vid inspelning) med kryssrutorna på varje rad, "
+"som visas i dialogrutan."
+
+#. Tag: title
+#: index.docbook:1136
+#, no-c-format
+msgid "Managing banks and programs for MIDI devices"
+msgstr "Hantera banker och program för MIDI-enheter"
+
+#. Tag: phrase
+#: index.docbook:1145
+#, no-c-format
+msgid "The MIDI bank and program editor"
+msgstr "Editorn för MIDI-banker och program"
+
+#. Tag: para
+#: index.docbook:1151
+#, no-c-format
+msgid ""
+"Remember that each MIDI device contains a number of instruments, and that "
+"you can assign tracks to those instruments. In MIDI terms, each instrument "
+"corresponds to a single channel on your MIDI synth. You can choose which of "
+"the available voices (sounds) on your synth each instrument uses, but in "
+"order to do this, you need to let Rosegarden know the names for all of the "
+"available voices."
+msgstr ""
+"Kom ihåg att varje MIDI-enhet innehåller ett antal instrument, och att du "
+"kan tilldela spår till instrumenten. Med MIDI-terminologi, motsvarar varje "
+"instrument en enskild kanal i MIDI-synten. Du kan välja vilken av de "
+"tillgängliga stämmorna (ljuden) i synten som varje instrument använder, "
+"men för att göra det måste du tala om namnen på alla tillgängliga "
+"stämmor för Rosegarden."
+
+#. Tag: para
+#: index.docbook:1161
+#, no-c-format
+msgid ""
+"This dialog allows you to attach banks of programs (names for voices) to "
+"your MIDI devices, thus permitting each instrument on a device to be set to "
+"use one of those voices in the <link "
+"linkend=\"segment-view-instrumentparameterbox\">Instrument Parameter "
+"Box</link>."
+msgstr ""
+"Den här dialogrutan låter dig tilldela programbanker (namn på stämmor) "
+"till MIDI-enheter, och på så sätt låta varje instrument i en enhet att "
+"ställas in att använda en av stämmorna i <link "
+"linkend=\"segment-view-instrumentparameterbox\"> "
+"instrumentparameterrutan</link>."
+
+#. Tag: para
+#: index.docbook:1170
+#, no-c-format
+msgid ""
+"The usual way to set up the program names for a device is simply to import "
+"them from one of the supplied device (\".rgd\") files. To do this, select a "
+"device in the list on the left of the dialog, then click the Import button "
+"below the list and choose the .rgd file corresponding to your synth."
+msgstr ""
+"Det vanliga sättet att ställa in programnamn för en enhet är att helt "
+"enkelt importera dem från en av enhetsfilerna (\".rgd\") som "
+"tillhandahålls. För att göra det, markera en enhet i listan till vänster "
+"i dialogrutan, klicka därefter på importknappen under listan och välj "
+".rgd-filen som motsvarar din synt."
+
+#. Tag: para
+#: index.docbook:1179
+#, no-c-format
+msgid ""
+"If there is no current .rgd file available for your synth, then you can use "
+"this dialog to create a new bank. To do this you will have to find the "
+"program map in your synth's MIDI Implementation Chart and enter all the "
+"names by hand: you can then Export them to a .rgd file to share with other "
+"Rosegarden users. Contact the rosegarden-user mailing list if you have made "
+"a new .rgd file and would like to share it. (This is how all of the existing "
+".rgd files have come to be included with Rosegarden: other users have "
+"contributed them.)"
+msgstr ""
+"Om det inte finns en aktuell .rgd-fil tillgänglig för din synt, kan du "
+"använda dialogrutan för att skapa en ny bank. För att göra det måste du "
+"hitta programavbildningen i din synts MIDI-implementeringsdiagram och skriva "
+"in namnen för hand: Därefter kan du exportera dem till en .rgd-fil att "
+"dela med andra användare av Rosegarden. Kontakta e-postlistan "
+"rosegarden-user om du har skapat en ny .rgd-fil och vill bidra med den. (Det "
+"är hur alla befintliga .rgd-filer har kommit att inkluderas med Rosegarden: "
+"andra användare har bidragit dem.)"
+
+#. Tag: title
+#: index.docbook:1192
+#, no-c-format
+msgid "Percussion Key Mappings"
+msgstr "Tonavbildningar för slagverk"
+
+#. Tag: para
+#: index.docbook:1194
+#, no-c-format
+msgid ""
+"Many MIDI synthesizers have at least one percussion program, in which each "
+"\"pitch\" plays a different type of sound. Rosegarden contains a dedicated "
+"percussion matrix editor to view and edit notes against a scale consisting "
+"of the correct names for the pitches, instead of against the conventional "
+"piano keyboard pitch scale."
+msgstr ""
+"Många MIDI-syntar har åtminstone ett slagverksprogram, där varje \"tonhöjd\" "
+"spelar ett annorlunda ljud. Rosegarden innehåller en särskild matriseditor för "
+"slagverk för att visa och redigera toner med en skala som består av de "
+"riktiga namnen på tonhöjderna, istället för den konventionella tonskalan på "
+"ett piano."
+
+#. Tag: para
+#: index.docbook:1203
+#, no-c-format
+msgid ""
+"The key mappings available for a particular MIDI device are also defined in "
+"the Rosegarden device (\".rgd\") file. Each MIDI program that is defined as "
+"a percussion program can have a key mapping associated with it; if there is "
+"one, then it will be used by default in any track that is assigned to this "
+"program. Like program and bank definitions, key mappings can be imported "
+"from and exported to .rgd files."
+msgstr ""
+"Tonavbildningarna som är tillgängliga för en viss MIDI-synt definieras också "
+"i Rosegardens enhetsfil (\".rgd\"). Varje MIDI-program som definieras som "
+"ett slagverksprogram kan ha en tillhörande tonavbildning. Om det finns en, "
+"används den normalt för alla spår som tilldelas programmet. Liksom "
+"program och bankdefinitioner kan tonavbildningar importeras från och "
+"exporteras till .rgd-filer."
+
+#. Tag: title
+#: index.docbook:1215
+#, no-c-format
+msgid "SoundFonts"
+msgstr "Ljudteckensnitt"
+
+#. Tag: para
+#: index.docbook:1217
+#, no-c-format
+msgid ""
+"If you happen to be using a soft-synth or soundcard synth that uses "
+"SoundFont (.sf2) files, you can simply load the correct program names "
+"directly from your .sf2 file into this dialog. Just ask to Import as normal, "
+"and then choose the .sf2 file that you are using instead of a .rgd file."
+msgstr ""
+"Om du råkar använda en programvarusynt eller ljudkortssynt som använder "
+"ljudteckensnittsfiler (.sf2), kan du helt enkelt ladda riktiga programnamn "
+"direkt från .sf2-filen i dialogrutan. Begär bara import som vanligt, och "
+"välj därefter .sf2-filen som du använder istället för en .rgd-fil."
+
+#. Tag: para
+#: index.docbook:1225
+#, no-c-format
+msgid ""
+"Note that the Studio only manages information about existing MIDI devices "
+"for Rosegarden, it does not actually handle tasks such as loading a "
+"SoundFont to your soundcard in the first place. If you want to make sure a "
+"SoundFont is loaded to your soundcard when Rosegarden starts up, you should "
+"use the special \"Load SoundFont to SoundBlaster card at startup\" option in "
+"the sequencer configuration in <menuchoice> <guimenu "
+"lang=\"en\">Settings</guimenu> <guimenuitem>Configure "
+"Rosegarden...</guimenuitem> </menuchoice>."
+msgstr ""
+"Observera att studion bara hanterar information om befintliga MIDI-enheter i "
+"Rosegarden. Den hanterar inte uppgifter som att ladda ett ljudteckensnitt "
+"till ljudkortet från början. Om du vill försäkra dig om att ett "
+"ljudteckensnitt laddas till ljudkortet när Rosegarden startas, ska du "
+"använda det speciella alternativet \"Ladda ljudsamplingar till "
+"Soundblaster-kort vid start\" i inställningen av musikbehandlaren under "
+"<menuchoice><guimenu lang=\"sv\">Inställningar</guimenu> "
+"<guimenuitem>Anpassa Rosegarden...</guimenuitem></menuchoice>."
+
+#. Tag: title
+#: index.docbook:1240
+#, no-c-format
+msgid "Variations"
+msgstr "Varianter"
+
+#. Tag: para
+#: index.docbook:1242
+#, no-c-format
+msgid ""
+"Some MIDI devices (for example, those from Roland) organise their program "
+"names using a scheme known as \"variations\". For these devices, you "
+"generally want to select a program by first selecting the basic program name "
+"&mdash; such as a piano &mdash; and then selecting one of a set of "
+"variations on that program &mdash; such as an electric piano. This is in "
+"contrast to General MIDI-based synths, which organise their programs into "
+"banks and expect you to choose a bank first and then a program from that "
+"bank."
+msgstr ""
+"Vissa MIDI-enheter (till exempel de från Roland) organiserar programnamn "
+"på ett sätt som kallas \"varianter\". För dessa enheter vill man i "
+"allmänhet välja ett program genom att först ange ett grundprogramnamn, "
+"som ett piano, och därefter ange en av ett antal varianter av programmet, "
+"som ett elektriskt piano. Detta skiljer sig från syntar baserad på "
+"generell MIDI, som organiserar programmen i banker och förväntar sig att "
+"du först väljer en bank och därefter ett program i banken."
+
+#. Tag: para
+#: index.docbook:1255
+#, no-c-format
+msgid ""
+"Rosegarden can support devices that use variations, but you still have to "
+"enter the program names in a bank format. Internally, devices that use "
+"variations still use MIDI bank select controllers to choose between the "
+"variations; you need to find out from your synth's documentation whether "
+"your device uses the LSB or MSB bank select to choose variations, and which "
+"bank number corresponds to which variation. You can then enter the banks as "
+"normal, and use the \"Show Variation list based on MSB/LSB\" option on the "
+"bank dialog to tell Rosegarden to show variations instead of banks when "
+"displaying that device in an instrument parameter box."
+msgstr ""
+"Rosegarden kan stödja enheter som använder varianter, men du måste ändå "
+"skriva in programnamnen med bankformat. Internt använder enheter med "
+"variationer fortfarande styrning med val av MIDI-bank för att välja bland "
+"variationerna: Du måste ta reda på om enheten använder mest signifikant "
+"eller minst signifikant värde i bankväljaren för att ange variationer, "
+"och vilket banknummer som motsvarar vilken variant. Därefter kan du skriva "
+"in bankerna som vanligt, och använda alternativet \"Visa variantlista "
+"baserad på Mest signifikant värde/Minst signifikant värde\" i "
+"bankdialogrutan för att tala om för Rosegarden att varianter istället "
+"för banker ska visas när enheten visas i en instrumentparameterruta."
+
+#. Tag: title
+#: index.docbook:1272
+#, no-c-format
+msgid "Program mapping on &MIDI; import"
+msgstr "Programavbildning vid &MIDI;-import"
+
+#. Tag: para
+#: index.docbook:1273
+#, no-c-format
+msgid ""
+"When you import a &MIDI; file into a composition, &rosegarden; uses the "
+"existing studio setup to determine how to map the &MIDI; programs onto "
+"&rosegarden; instruments. The aim is to ensure that every &MIDI; program "
+"gets mapped to an instrument that really exists in your studio (and thus is "
+"actually attached to your computer), so that all the &MIDI; tracks can be "
+"heard."
+msgstr ""
+"När du importerar en &MIDI;-fil till en komposition, använder &rosegarden; "
+"befintlig studioinställning för att avgöra hur &MIDI;-programmen avbildas "
+"på &rosegarden;-instrument. Målet är att försäkra att varje "
+"&MIDI;-program avbildas på ett instrument som verkligen finns i studion "
+"(och alltså verkligen är anslutet till datorn), så att alla &MIDI;-spår "
+"kan höras."
+
+#. Tag: para
+#: index.docbook:1283
+#, no-c-format
+msgid ""
+"The &MIDI; program-change and bank-select events found in the imported file "
+"are used when importing, but only as an aid to help find the appropriate "
+"instrument for each &MIDI; track from the set of instruments in your studio. "
+"So, for example, if your studio is currently set up to contain only "
+"<acronym>GM</acronym> instruments, and you import a &MIDI; file with "
+"<acronym>GS</acronym> program changes onto it, &rosegarden; will remap the "
+"<acronym>GS</acronym> banks back onto <acronym>GM</acronym> because they're "
+"all it knows that you have at the time you import the file. It doesn't "
+"remember the original <acronym>GS</acronym> program numbers."
+msgstr ""
+"&MIDI; programändrings- och bankvalshändelserna som hittas i den "
+"importerade filen används vid import, men bara som en hjälp att hitta "
+"lämpligt instrument för varje &MIDI;-spår bland instrumentuppsättningen "
+"i studion. Om studion till exempel för närvarande är inställd att bara "
+"innehålla <acronym>GM</acronym>-instrument, och du importerar en &MIDI;-fil "
+"som innehåller <acronym>GS</acronym>-programändringar, avbildar "
+"&rosegarden; <acronym>GS</acronym>-bankerna tillbaka till "
+"<acronym>GM</acronym> eftersom de är allt som den vet om att du har vid "
+"tiden då filen importeras. Den kommer inte ihåg ursprungliga "
+"<acronym>GS</acronym>-programnummer."
+
+#. Tag: para
+#: index.docbook:1296
+#, no-c-format
+msgid ""
+"This means that you should always ensure that your studio is correctly "
+"configured for the devices you actually have, before you import the &MIDI; "
+"file. Otherwise the program data in the &MIDI; file may be lost."
+msgstr ""
+"Det här betyder att du alltid ska försäkra dig om att din studio är "
+"riktigt inställd för enheterna som du verkligen har, innan du importerar "
+"&MIDI;-filen. Annars kan programdata i &MIDI;-filen gå förlorad."
+
+#. Tag: title
+#: index.docbook:1308
+#, no-c-format
+msgid "Audio Routing"
+msgstr "Ljudfördelning"
+
+#. Tag: para
+#: index.docbook:1309
+#, no-c-format
+msgid ""
+"Any Rosegarden track assigned to an audio or synth plugin instrument becomes "
+"part of Rosegarden's audio routing architecture. There are 16 audio "
+"instruments and 16 synth plugin instruments, and each of these has a set of "
+"adjustable parameters including fader level, pan, effects and so on. These "
+"are generally configurable in the <link "
+"linkend=\"segment-view-instrumentparameterbox\">Instrument Parameter "
+"Box</link> or <link linkend=\"studio-audio-mixer\">audio mixer</link>. Each "
+"audio instrument also has an input connection, and both audio and synth "
+"plugin instruments have an output connection."
+msgstr ""
+"Alla spår i Rosegarden som tilldelas till ett ljudinstrument eller "
+"syntinsticksmodulinstrument blir en del av Rosegardens "
+"ljudfördelningsarkitektur. Det finns 16 ljudinstrument och 16 "
+"syntinsticksmodulinstrument, och vart och ett av dem har en uppsättning "
+"justerbara parametrar som omfattar toningsnivå, panorering, effekter och "
+"så vidare. De är i allmänhet inställningsbara i <link "
+"linkend=\"segment-view-instrumentparameterbox\">instrumentparameterrutan</lin"
+"k> eller <link linkend=\"studio-audio-mixer\">ljudmixern</link>. Varje "
+"ljudinstrument har också en ingångsanslutning, och både ljudinstrument "
+"och syntinsticksmodulinstrument har en utgångsanslutning."
+
+#. Tag: para
+#: index.docbook:1323
+#, no-c-format
+msgid ""
+"An instrument's input connection defines where Rosegarden will read audio "
+"data from when recording to this instrument. The most usual setting would be "
+"to one of Rosegarden's external audio inputs, the number of which is "
+"configurable in the <link linkend=\"studio-audio-mixer\">audio mixer</link>. "
+"These correspond to JACK audio ports exposed by Rosegarden, to which you can "
+"connect outputs from any other JACK audio application or soundcard capture "
+"ports using an external JACK router application such as <ulink "
+"url=\"http://qjackctl.sf.net/\">QJackCtl</ulink>. You can also set an "
+"instrument's audio input to the output of one of Rosegarden's built-in audio "
+"submasters or master output for mixdowns."
+msgstr ""
+"Ett instruments ingångsanslutning definierar varifrån Rosegarden läser "
+"ljuddata vid inspelning till instrumentet. Den vanligaste inställningen är "
+"en av Rosegardens externa ljudingångar, vars antal kan ställas in i <link "
+"linkend=\"studio-audio-mixer\">ljudmixern</link>. De motsvarar JACK "
+"ljudportar exponerade av Rosegarden, där du kan ansluta utgångar från "
+"vilket JACK ljudprogram som helst eller från någon av ljudkortets portar "
+"med ett externt JACK fördelningsprogram som <ulink "
+"url=\"http://qjackctl.sf.net/\">QJackCtl</ulink>. Du kan också ställa in "
+"ett instruments ljudingång till en av Rosegardens inbyggda "
+"delnivåutgångar eller huvudutgångar för ihopmixningar."
+
+#. Tag: para
+#: index.docbook:1337
+#, no-c-format
+msgid ""
+"An instrument's output connection defines where the audio goes when played. "
+"Instruments default to sending their audio to Rosegarden's master output, "
+"which is another (stereo pair of) external JACK port(s) that can then be "
+"connected up using the same external JACK router. However, Rosegarden also "
+"supports up to eight internal submaster busses, to which you can send "
+"instrument outputs instead so as to group instruments into related "
+"categories. You can control the number and routing of these in the <link "
+"linkend=\"studio-audio-mixer\">audio mixer</link>."
+msgstr ""
+"Ett instruments utgångsanslutning definierar var ljudet tar vägen när det "
+"spelas upp. Instrumentens normalinställning är att skicka ljud till "
+"Rosegardens huvudutgång, som är en annan extern JACK port (eller ett par "
+"portar vid stereo), som därefter kan anslutas genom att använda samma "
+"externa JACK fördelningsprogram. Rosegarden stöder dock också upp till "
+"åtta interna delutgångsbussar, dit du kan skicka utdata från instrument "
+"istället, för att gruppera instrument i samhörande kategorier. Du kan "
+"styra antalet och fördelningen av dem i <link "
+"linkend=\"studio-audio-mixer\">ljudmixern</link>."
+
+#. Tag: para
+#: index.docbook:1348
+#, no-c-format
+msgid ""
+"Rosegarden currently supports effects using a set of pre-fader insert "
+"effects slots for each audio instrument. You cannot yet assign effects to "
+"the submaster busses, and Rosegarden does not yet support send effects, "
+"although you can obtain similar results using an external JACK effects and "
+"mixing architecture."
+msgstr ""
+"Rosegarden stöder för närvarande effekter med en uppsättning "
+"effektplatser som infogas innan toningen för varje ljudinstrument. Du kan "
+"ännu inte tilldela effekter till delnivåbussarna, och Rosegarden stöder "
+"ännu inte att skicka effekter, även om du kan uppnå liknande resultat "
+"genom att använda JACK externa effekter och mixningsarkitektur."
+
+#. Tag: para
+#: index.docbook:1356
+#, no-c-format
+msgid ""
+"Some further details of audio routing configuration, mixing, and effects are "
+"discussed in the <link linkend=\"studio-audio-mixer\">audio mixer</link>, "
+"<link linkend=\"segment-view-instrumentparameterbox\">instrument parameter "
+"box</link> and <link linkend=\"studio-plugins\">audio plugins</link> "
+"sections."
+msgstr ""
+"Några ytterligare detaljer angående inställning av ljudfördelning, "
+"mixning och effekter beskrivs i avsnitten <link "
+"linkend=\"studio-audio-mixer\"> ljudmixern</link>, <link "
+"linkend=\"segment-view-instrumentparameterbox\">instrumentparameterrutan</lin"
+"k> och <link linkend=\"studio-plugins\">ljudinsticksmoduler</link>."
+
+#. Tag: title
+#: index.docbook:1365
+#, no-c-format
+msgid "The Audio Mixer"
+msgstr "Ljudmixern"
+
+#. Tag: phrase
+#: index.docbook:1373
+#, no-c-format
+msgid "&rosegarden;'s Audio Mixer"
+msgstr "&rosegarden;s ljudmixer"
+
+#. Tag: para
+#: index.docbook:1379
+#, no-c-format
+msgid ""
+"Rosegarden's audio mixer window, reached through <menuchoice> <guimenu "
+"lang=\"en\">Composition</guimenu> <guimenuitem>Studio</guimenuitem> "
+"<guimenuitem>Audio Mixer</guimenuitem></menuchoice>, resembles a hardware "
+"audio mixer and provides a way to see and change the state of a number of "
+"audio instruments at once. It contains many of the same controls as found in "
+"the audio and synth plugin <link "
+"linkend=\"segment-view-instrumentparameterbox\">instrument parameter "
+"boxes</link>, most importantly a playback level meter and fader control for "
+"each audio and synth plugin instrument, as well as routing controls, pan, "
+"mono/stereo and effects plugin slots."
+msgstr ""
+"Rosegardens ljudmixningsfönster, som visas med <menuchoice><guimenu "
+"lang=\"sv\">Komposition</guimenu> <guimenuitem>Studio</guimenuitem> "
+"<guimenuitem>Ljudmixer</guimenuitem></menuchoice>, liknar en ljudmixer i "
+"hårdvara och tillhandahåller ett sätt att se och ändra tillståndet för "
+"ett antal ljudinstrument på en gång. Den innehåller många likadana "
+"knappar som finns i ljud- och syntinsticksmodulernas <link "
+"linkend=\"segment-view-instrumentparameterbox\"> "
+"instrumentparameterrutor</link>, där de viktigaste är mätaren av "
+"uppspelningsnivå och toningskontroll för varje ljudinstrument och "
+"syntinsticksmodulinstrument, samt fördelningskontroll, panorering, "
+"mono/stereo och platser för effektinsticksmoduler."
+
+#. Tag: para
+#: index.docbook:1395
+#, no-c-format
+msgid ""
+"The audio mixer window is also where you see and control the master audio "
+"output level (at the far right of the picture above), as well as the record "
+"level (to the left of the master fader) and submaster output levels."
+msgstr ""
+"Ljudmixerfönstret är också platsen där du ser och styr huvudljudnivån "
+"(längst till höger i bilden ovan), samt inspelningsnivån (till vänster "
+"om huvudtoningen) och delutnivåer."
+
+#. Tag: para
+#: index.docbook:1401
+#, no-c-format
+msgid ""
+"The audio mixer's <menuchoice> <guimenu "
+"lang=\"en\">Settings</guimenu></menuchoice> menu is particularly relevant. "
+"Apart from controlling what will be shown in the mixer window, this menu "
+"also contains the <link linkend=\"studio-audio-routing\">audio "
+"routing</link> settings for the number of stereo audio record inputs "
+"available and the number of submasters. These are studio settings whose "
+"values are saved with your Rosegarden format file."
+msgstr ""
+"Menyn <menuchoice><guimenu lang=\"sv\">Inställningar</guimenu></menuchoice> "
+"i ljudmixern är särskilt relevant. Förutom att styra vad som visas i "
+"mixerfönstret, innehåller menyn också inställningen av <link "
+"linkend=\"studio-audio-routing\">ljudfördelningen</link> för antalet "
+"ljudinspelningsingångar i stereo som är tillgängliga och för antalet "
+"delnivåutgångar. De är studioinställningar som sparas med din Rosegarden "
+"formatfil."
+
+#. Tag: para
+#: index.docbook:1411
+#, no-c-format
+msgid ""
+"Note that if you are not actually using any submasters (i.e. if there are no "
+"instruments configured to route their output to a submaster) you may see a "
+"small performance improvement if you set the number of submasters explicitly "
+"to None, rather than keeping unused ones in the configuration."
+msgstr ""
+"Observera att om du i själva verket inte använder några delnivåer (dvs. "
+"om det inte finns några instrument som är inställda att skicka sin "
+"utsignal till en delnivå) kan du se en liten prestandaförbättring om du "
+"uttryckligen ställer in antalet delnivåer till inga, istället för att "
+"behålla oanvända i inställningen."
+
+#. Tag: title
+#: index.docbook:1420
+#, no-c-format
+msgid "The MIDI Mixer"
+msgstr "MIDI-mixern"
+
+#. Tag: phrase
+#: index.docbook:1428
+#, no-c-format
+msgid "&rosegarden;'s MIDI Mixer"
+msgstr "&rosegarden;s MIDI-mixer"
+
+#. Tag: para
+#: index.docbook:1433
+#, no-c-format
+msgid ""
+"Rosegarden's MIDI mixer window, reached through <menuchoice> <guimenu "
+"lang=\"en\">Composition</guimenu> <guimenuitem>Studio</guimenuitem> "
+"<guimenuitem>MIDI Mixer</guimenuitem></menuchoice>, provides a way to see "
+"and edit the <link "
+"linkend=\"segment-view-instrumentparameterbox-midi\">instrument parameter "
+"values</link> for a number of MIDI instruments at once."
+msgstr ""
+"Rosegardens MIDI-mixningsfönster, som visas med <menuchoice><guimenu "
+"lang=\"sv\">Komposition</guimenu> <guimenuitem>Studio</guimenuitem> "
+"<guimenuitem>MIDI-mixer</guimenuitem></menuchoice>, tillhandahåller ett "
+"sätt att se och redigera <link "
+"linkend=\"segment-view-instrumentparameterbox-midi\">instrumentparametervärd"
+"en</link> för ett antal MIDI-instrument på en gång."
+
+#. Tag: para
+#: index.docbook:1443
+#, no-c-format
+msgid ""
+"The window is organised using a tabbed pane. Along the bottom, you will see "
+"one tab for each playback MIDI device in your studio configuration. When you "
+"select a device tab, the rest of the window will update to show the controls "
+"for the 16 instruments of that device."
+msgstr ""
+"Fönstret är organiserat som en ruta med flikar. Längs nederkanten ser du "
+"en flik för varje MIDI-uppspelningsenhet i studioinställningen. När en "
+"enhetsflik väljes, uppdateras resten av fönstret för att visa knapparna "
+"för enhetens 16 instrument."
+
+#. Tag: para
+#: index.docbook:1450
+#, no-c-format
+msgid ""
+"The controls shown for each instrument are those set up in the control "
+"parameter manager, as well as volume (corresponding to the MIDI volume "
+"control change, not to MIDI velocity or audio dB levels) and an approximate "
+"output level indicator."
+msgstr ""
+"Knapparna som visas för varje instrument är de som ställts in i "
+"hanteringen av styrparametrar, samt volym (som motsvarar ändring av "
+"MIDI-volymstyrningen, inte en MIDI-ljudstyrka eller ljudnivå i decibel) och "
+"en ungefärlig utnivåindikator."
+
+#. Tag: title
+#: index.docbook:1460
+#, no-c-format
+msgid "Audio Plugins"
+msgstr "Ljudinsticksmoduler"
+
+#. Tag: para
+#: index.docbook:1461
+#, no-c-format
+msgid ""
+"An audio plugin is a piece of software, separate from Rosegarden, that "
+"Rosegarden can load and use in order to perform a particular audio "
+"processing task. These can be broadly divided into effects plugins and synth "
+"plugins. Effects plugins take an audio input and manipulate it to produce a "
+"different audio output; synth plugins take MIDI-like events as input and "
+"turn them into audio output. Rosegarden uses the Linux standard LADSPA "
+"plugin API for effects and the DSSI plugin API for synths, permitting the "
+"use of large numbers of open-source plugins made available by many "
+"developers."
+msgstr ""
+"En ljudinsticksmodul är en programvarumodul, skild från Rosegarden, men "
+"som Rosegarden kan ladda och använda för att utföra en viss "
+"ljudbehandlingsuppgift. De kan grovt delas upp i effektinsticksmoduler och "
+"syntinsticksmoduler. Effektinsticksmoduler tar ljudindata och behandlar det "
+"för att skapa annorlunda ljudutdata. Rosegarden använder Linux-standarden "
+"LADSPA för effektinsticksmodulernas programmeringsgränssnitt, och DSSI "
+"för syntinsticksmodulernas programmeringsgränssnitt, vilket gör det "
+"möjligt att använda ett stort antal insticksmoduler med öppen källkod "
+"som gjorts tillgängliga av många utvecklare."
+
+#. Tag: para
+#: index.docbook:1472
+#, no-c-format
+msgid ""
+"The use of plugins has a cost in CPU time, as audio processing in real time "
+"usually takes a significant amount of work even on a modern CPU. It also has "
+"a potential cost in reliability: when Rosegarden is running a plugin, if the "
+"plugin hangs or crashes, so does Rosegarden. Many plugins are very reliable, "
+"but it's inevitable that some will not be so well tested."
+msgstr ""
+"Användning av insticksmoduler ger en kostnad i processortid, eftersom "
+"ljudbehandling i realtid oftast kräver en väsentlig mängd arbete till och "
+"med med en modern processor. Det ger också en potentiell kostnad i "
+"tillförlitlighet: När Rosegarden kör en insticksmodul, och "
+"insticksmodulen hänger sig eller kraschar, så gör Rosegarden också det. "
+"Många insticksmoduler är mycket tillförlitliga, men det är oundvikligt "
+"att vissa inte är så vältestade."
+
+#. Tag: title
+#: index.docbook:1481
+#, no-c-format
+msgid "Effects plugins"
+msgstr "Effektinsticksmoduler"
+
+#. Tag: para
+#: index.docbook:1481
+#, no-c-format
+msgid ""
+"An effects plugin is something that you can use to modify an audio signal in "
+"a controllable way. Examples include reverb, delay effects, dynamic "
+"compression and so on."
+msgstr ""
+"En effektinsticksmodul är något som du kan använda för att ändra en "
+"ljudsignal på ett styrbart sätt. Exempel omfattar eko, "
+"fördröjningseffekter, dynamisk komprimering och så vidare."
+
+#. Tag: para
+#: index.docbook:1486
+#, no-c-format
+msgid ""
+"Every audio or synth-plugin instrument in Rosegarden has five associated "
+"effects slots. By default these are empty, but you can load plugins into "
+"them in order to chain up to five effects onto the audio signal before it "
+"goes through fader level and pan processing."
+msgstr ""
+"Varje ljud- eller syntinsticksmodulinstrument i Rosegarden har fem "
+"tillhörande effektplatser. Normalt är de tomma, men du kan ladda "
+"insticksprogram i dem för att bilda en kedja med upp till fem effekter för "
+"ljudsignalen innan den går igenom toningsnivå och panoreringsbehandling."
+
+#. Tag: para
+#: index.docbook:1492
+#, no-c-format
+msgid ""
+"To load a plugin to a slot, click its button on the <link "
+"linkend=\"segment-view-instrumentparameterbox-audio\">instrument parameter "
+"box</link>:"
+msgstr ""
+"För att ladda en insticksmodul på en plats, klicka på dess knapp i <link "
+"linkend=\"segment-view-instrumentparameterbox-audio\">instrumentparameterruta"
+"n</link>:"
+
+#. Tag: phrase
+#: index.docbook:1503
+#, no-c-format
+msgid "Plugin Slot Buttons"
+msgstr "Insticksplatsknappar"
+
+#. Tag: para
+#: index.docbook:1508
+#, no-c-format
+msgid ""
+"(These buttons are also optionally available in the <link "
+"linkend=\"studio-audio-mixer\">audio mixer</link> window.)"
+msgstr ""
+"(Dessa knappar är också alternativt tillgängliga i <link "
+"linkend=\"studio-audio-mixer\">ljudmixerns fönster</link>.)"
+
+#. Tag: para
+#: index.docbook:1511
+#, no-c-format
+msgid ""
+"Clicking a plugin button will pop up the plugin dialog. This shows you the "
+"available categories of effects in the first menu; select one, and you can "
+"then choose your plugin in the second menu."
+msgstr ""
+"Att klicka på en insticksmodulknapp visar insticksmoduldialogrutan. Den "
+"visar tillgängliga effektkategorier i den första menyn. Markera en, så "
+"kan du därefter välja insticksmodul i den andra menyn."
+
+#. Tag: phrase
+#: index.docbook:1523
+#, no-c-format
+msgid "A &rosegarden; Plugin Dialog"
+msgstr "En insticksdialogruta i &rosegarden;"
+
+#. Tag: para
+#: index.docbook:1529
+#, no-c-format
+msgid ""
+"Below the plugin selection menus, the dialog gives you a varying number of "
+"rotary controllers showing all the modifiable parameters for the plugin you "
+"have selected. To change a value, just click a rotary and drag up and down "
+"or left and right. (Up or right to raise the value, down or left to lower "
+"it.) You can also roll the mouse wheel to change the value, or click with "
+"the middle mouse button to reset it to its initial default."
+msgstr ""
+"Under menyerna för val av insticksmoduler, har dialogrutan ett varierande "
+"antal vridbara rattar som visar alla parametrar som kan ändras för "
+"insticksprogrammet du har valt. För att ändra ett värde, klicka bara på "
+"en ratt och dra uppåt och neråt, eller vänster och höger. (Uppåt "
+"eller åt höger för att öka värdet, neråt eller åt vänster för att "
+"minska det.) Du kan också rulla mushjulet för att ändra värdet, eller "
+"klicka med musens mittenknapp för att återställa det till det "
+"ursprungliga normalvärdet."
+
+#. Tag: para
+#: index.docbook:1538
+#, no-c-format
+msgid ""
+"It is also possible to copy one plugin with its current configuration into "
+"another slot, so as to use the same plugin settings with more than one "
+"instrument, or to base one plugin configuration on another. Just click the "
+"Copy button when you have the plugin set up the way you want it, and then "
+"open another plugin slot's plugin dialog and click Paste."
+msgstr ""
+"Det är också möjligt att kopiera en insticksmodul med sin nuvarande "
+"inställning till en annan plats, för att använda samma "
+"insticksmodulinställningar för mer än ett instrument, eller för att "
+"basera en insticksmodulinställning på en annan. Klicka bara på knappen "
+"Kopiera när du har ställt in insticksmodulen som du vill ha den, och "
+"öppna därefter dialogrutan för en annan insticksmodulplats och klicka på "
+"Klistra in."
+
+#. Tag: para
+#: index.docbook:1545
+#, no-c-format
+msgid ""
+"Finally, you can use the Bypass toggle to remove a plugin temporarily from "
+"processing while retaining its configuration."
+msgstr ""
+"Till sist kan du använda åtgärden Förbikoppla för att tillfälligt ta "
+"bort en insticksmodul från behandlingen, men ändå behålla dess "
+"inställning."
+
+#. Tag: title
+#: index.docbook:1551
+#, no-c-format
+msgid "Synth plugins"
+msgstr "Syntinsticksmoduler"
+
+#. Tag: para
+#: index.docbook:1552
+#, no-c-format
+msgid ""
+"Synth plugins can be used in place of hardware or standalone soft-synth MIDI "
+"devices, to generate sounds from your note event segments."
+msgstr ""
+"Syntinsticksmoduler kan användas istället för MIDI-enheter i hårdvara "
+"eller fristående programvarusyntar, för att skapa ljud från segmenten med "
+"tonhändelser."
+
+#. Tag: para
+#: index.docbook:1557
+#, no-c-format
+msgid ""
+"Using a synth plugin gives you somewhat better control and repeatability "
+"than using an external MIDI device, because Rosegarden will be able to load "
+"the correct plugins for you and use the correct settings the next time you "
+"load your same file. Plugins may also offer better timing resolution than "
+"external MIDI devices, and synth plugin instruments have the advantage of "
+"being routable like audio instruments, which also means you can add effects "
+"plugins on top of them."
+msgstr ""
+"Att använda en syntinsticksmodul ger dig något bättre kontroll och "
+"upprepningsbarhet än att använda en extern MIDI-enhet, eftersom Rosegarden "
+"kan ladda rätt insticksmodul åt dig och använda riktiga inställningar "
+"nästa gång du laddar samma fil. Insticksmoduler kan också ge bättre "
+"tidsupplösning än externa MIDI-enheter, och syntinsticksmodulinstrument "
+"har fördelen att vara fördelningsbara som ljudinstrument, vilket också "
+"betyder att du kan lägga till effektinsticksmoduler ovanför dem."
+
+#. Tag: para
+#: index.docbook:1567
+#, no-c-format
+msgid ""
+"To make use of a synth plugin, first <link "
+"linkend=\"segment-view-instruments\">assign a track</link> to a synth plugin "
+"instrument, and then load a synth plugin by clicking on the topmost button "
+"in the <link "
+"linkend=\"segment-view-instrumentparameterbox-synth\">instrument parameter "
+"box</link>:"
+msgstr ""
+"För att använda en syntinsticksmodul, <link "
+"linkend=\"segment-view-instruments\">tilldela först ett spår</link> till "
+"ett syntinsticksmodulinstrument, och ladda därefter en syntinsticksmodul "
+"genom att klicka på den översta knappen i <link "
+"linkend=\"segment-view-instrumentparameterbox-synth\">instrumentparameterruta"
+"n</link>:"
+
+#. Tag: phrase
+#: index.docbook:1581
+#, no-c-format
+msgid "Synth Plugin Buttons"
+msgstr "Syntinsticksmodulknappar"
+
+#. Tag: para
+#: index.docbook:1587
+#, no-c-format
+msgid ""
+"This will bring up the same plugin dialog as shown above for effects "
+"plugins, but with a list of synth plugins instead of effects. Once again, "
+"you will be shown the particular set of rotary parameters for the synth you "
+"have selected. Synth plugins may also have \"programs\", selectable from a "
+"menu -- this menu will only appear if you have chosen a synth that supports "
+"them. When you have selected and configured a synth plugin for an "
+"instrument, any MIDI data on tracks assigned to that instrument should play "
+"through that synth, as should incoming MIDI data during recording or "
+"monitoring."
+msgstr ""
+"Det här visar samma insticksmoduldialogruta som visas ovan för "
+"effektinsticksmoduler, men med en lista över syntinsticksmoduler istället "
+"för effekter. Återigen visas den särskilda uppsättning med vridbara "
+"parametrar för synten du har valt. Syntinsticksmoduler kan också ha "
+"\"program\" som kan väljas i en meny. Menyn visas bara om du har valt en "
+"synt som stöder det. När du har valt och ställt in en syntinsticksmodul "
+"för ett instrument, ska all MIDI-data på spår som tilldelas till det "
+"instrumentet spelas via synten, liksom inkommande MIDI-data under inspelning "
+"eller övervakning."
+
+#. Tag: title
+#: index.docbook:1601
+#, no-c-format
+msgid "Plugin native editor windows"
+msgstr "Egna redigeringsfönster i en insticksmodul"
+
+#. Tag: para
+#: index.docbook:1603
+#, no-c-format
+msgid ""
+"Most plugins can be controlled completely using the rotary controllers in "
+"Rosegarden's plugin dialog. However, a few plugins (generally synths) also "
+"have their own editor windows which can be switched on or off from "
+"Rosegarden and which may provide more complete or more organised controls."
+msgstr ""
+"De flesta insticksmoduler kan styras helt och hållet med rattarna i "
+"Rosegardens insticksmoduldialogruta. Dock har några få insticksmoduler (i "
+"allmänhet syntar) också sina egna redigeringsfönster som kan aktiveras "
+"eller inaktiveras från Rosegarden, och som kan tillhandahålla "
+"fullständigare eller bättre organiserade knappar."
+
+#. Tag: para
+#: index.docbook:1610
+#, no-c-format
+msgid ""
+"When you select a plugin that has its own editor window, the button at the "
+"lower left of the plugin dialog labelled \"Editor\" will become active:"
+msgstr ""
+"När du väljer en insticksmodul som har sitt eget redigeringsfönster, "
+"aktiveras knappen nere till vänster i insticksmodulens dialogruta som heter "
+"\"Editor\":"
+
+#. Tag: phrase
+#: index.docbook:1621
+#, no-c-format
+msgid "A Plugin Editor Button"
+msgstr "Redigeringsknappen i en insticksmodul"
+
+#. Tag: para
+#: index.docbook:1627
+#, no-c-format
+msgid ""
+"(For synth plugins, there is a similar button in the instrument parameter "
+"box.) Clicking this button should show the plugin's own editor window. Any "
+"changes you make in this editor window should also be reflected in "
+"Rosegarden's own plugin dialog, if visible, and of course should be saved in "
+"your Rosegarden file as normal."
+msgstr ""
+"(För syntinsticksmoduler finns en liknande knapp i "
+"instrumentparameterrutan.) Att klicka på knappen visar insticksmodulens "
+"eget redigeringsfönster. Alla ändringar som du gör i redigeringsfönstret "
+"ska också synas i Rosegardens egen insticksmoduldialogruta, och ska "
+"naturligtvis sparas i din Rosegarden-fil som vanligt."
+
+#. Tag: title
+#: index.docbook:1637
+#, no-c-format
+msgid "Metronomes"
+msgstr "Metronomer"
+
+#. Tag: para
+#: index.docbook:1638
+#, no-c-format
+msgid ""
+"Rosegarden has two built-in metronomes, one for use during recording and one "
+"that can be switched on during normal playback. They work by sending notes "
+"to a MIDI instrument, and both metronomes use the same instrument, pitch and "
+"velocity information."
+msgstr ""
+"Rosegarden har två inbyggda metronomer, en för användning under "
+"inspelning och en som kan kopplas in under normal uppspelning. De fungerar "
+"genom att skicka toner till ett MIDI-instrument, och båda metronomerna "
+"använder samma instrument, tonhöjds- och ljudstyrkeinformation."
+
+#. Tag: phrase
+#: index.docbook:1653
+#, no-c-format
+msgid "&rosegarden;'s metronome configuration dialog"
+msgstr "&rosegarden;s inställningsdialogruta för metronom"
+
+#. Tag: para
+#: index.docbook:1658
+#, no-c-format
+msgid ""
+"To configure the metronomes, use <menuchoice> <guimenu "
+"lang=\"en\">Composition</guimenu> <guimenu lang=\"en\">Studio</guimenu> "
+"<guimenuitem>Manage Metronome</guimenuitem> </menuchoice> to bring up the "
+"metronome dialog. Here you can select a MIDI instrument for the metronome "
+"and choose the metronome's resolution (whether it should tick once per beat, "
+"once per subdivision of a beat, or only once per bar), pitch, and "
+"velocities. Properties such as the actual voice the MIDI synth uses for the "
+"metronome tick depend on the instrument selected, just as the voice used for "
+"a MIDI track depends on the instrument that track is assigned to. You can "
+"configure the instrument by assigning a track to it on the main window and "
+"selecting the correct program from the instrument parameter box."
+msgstr ""
+"För att ställa in metronomerna, använd <menuchoice><guimenu "
+"lang=\"sv\">Komposition</guimenu> <guimenu lang=\"sv\">Studio</guimenu> "
+"<guimenuitem>Hantera metronom</guimenuitem></menuchoice> för att visa "
+"metronomdialogrutan. Här kan du välja ett MIDI-instrument för metronomen "
+"och välja metronomens upplösning (om den ska ticka en gång per taktslag, "
+"en gång per underavdelning av ett taktslag, eller bara en gång per takt), "
+"tonhöjd och ljudstyrkor. Egenskaper som själva stämman som MIDI-synten "
+"använder för metronomens tick beror på instrumentet som väljes, precis "
+"som stämman för ett MIDI-spår beror på instrumentet som spåret är "
+"tilldelat till. Du kan ställa in instrumentet genom att tilldela ett spår "
+"till det i huvudfönstret och välja rätt program från "
+"instrumentparameterrutan."
+
+#. Tag: para
+#: index.docbook:1678
+#, no-c-format
+msgid ""
+"The record and play metronomes can be switched on or off from the Transport "
+"window, using the metronome button. This button controls the record "
+"metronome when recording is armed or in progress, and the play metronome at "
+"other times. By default, the record metronome is switched on and the play "
+"metronome switched off."
+msgstr ""
+"Metronomerna för inspelning och uppspelning kan aktiveras eller inaktiveras "
+"från överföringsfönstret genom att använda metronomknappen. Knappen "
+"styr inspelningsmetronomen när inspelning är förberedd eller pågår, och "
+"annars uppspelningsmetronomen. Normalt är inspelningsmetronomen aktiverad "
+"och uppspelningsmetronomen inaktiverad."
+
+#. Tag: para
+#: index.docbook:1687
+#, no-c-format
+msgid ""
+"Rosegarden also has a \"visual metronome\": the transport window can be told "
+"to flash brightly to mark each beat. See <link linkend=\"transport\">the "
+"Transport section</link> for more details."
+msgstr ""
+"Rosegarden har också en \"visuell metronom\": Överföringsfönstret kan "
+"ställas in att blinka starkt för att markera varje taktslag. Se avsnittet "
+"om <link linkend=\"transport\">överföringen</link> för mer "
+"detaljinformation."
+
+#. Tag: title
+#: index.docbook:1695
+#, no-c-format
+msgid "MIDI filters"
+msgstr "MIDI-filter"
+
+#. Tag: phrase
+#: index.docbook:1703
+#, no-c-format
+msgid "The MIDI filter dialog"
+msgstr "MIDI-filterdialogrutan"
+
+#. Tag: para
+#: index.docbook:1709
+#, no-c-format
+msgid ""
+"Using this dialog you can decide which MIDI events Rosegarden will ignore or "
+"accept, either when forwarding events using MIDI THRU or when simply "
+"recording them. Use the check boxes on this dialog to tell Rosegarden which "
+"types of MIDI events you don't want to forward or record."
+msgstr ""
+"Genom att använda den här dialogrutan kan du bestämma vilka "
+"MIDI-händelser som Rosegarden ignorerar eller accepterar, antingen när "
+"händelser skickas vidare med MIDI THRU, eller helt enkelt när de spelas "
+"in. Använd kryssrutorna för att tala om för Rosegarden vilka typer av "
+"MIDI-händelser som du inte vill skicka vidare eller spela in."
+
+#. Tag: title
+#: index.docbook:1721
+#, no-c-format
+msgid "External MIDI controllers"
+msgstr "Externa MIDI-styrenheter"
+
+#. Tag: para
+#: index.docbook:1722
+#, no-c-format
+msgid ""
+"Rosegarden's audio and MIDI mixer windows and main canvas can also be "
+"controlled to some degree by an external MIDI device. To set this up, you "
+"will need to use an ALSA MIDI connection manager such as qjackctl to connect "
+"your MIDI controller device to Rosegarden's \"external controller\" input "
+"and output MIDI ports."
+msgstr ""
+"Rosegardens ljud- och MIDI-mixningsfönster samt huvudfönstret kan "
+"också i viss mån styras av en extern MIDI-enhet. För att ställa in det, "
+"måste du använda ett ALSA MIDI-anslutningsprogram som qjackctl "
+"för att ansluta MIDI-styrenheten till Rosegardens \"externa styringång\" "
+"och MIDI-utgångarna."
+
+#. Tag: para
+#: index.docbook:1730
+#, no-c-format
+msgid ""
+"Rosegarden accepts MIDI control change messages to adjust the mixer track "
+"corresponding to the incoming MIDI channel on each controller event, and "
+"also sends out MIDI messages when something is changed in a mixer track in "
+"order to support controllers with powered faders or knobs."
+msgstr ""
+"Rosegarden tar emot MIDI-styrändringsmeddelanden för att justera mixerspåret "
+"som motsvarar den inkommande MIDI-kanalen vid varje styrenhetshändelse, "
+"och skickar också ut MIDI-meddelanden när något ändras i ett mixerspår "
+"för att stödja styrenheter med motoriserade skjutreglage eller knappar."
+
+#. Tag: para
+#: index.docbook:1737
+#, no-c-format
+msgid ""
+"Rosegarden accepts MIDI controller number 81 to change the currently active "
+"window. Send controller 81 with data value 0-9 to select the main window, "
+"10-19 to select the audio mixer window or 20-29 to select the MIDI mixer "
+"window."
+msgstr ""
+"Rosegarden tar emot MIDI-styrenhet nummer 81 för att ändra fönstret som "
+"för närvarande är aktivt. Skicka styrenhet 81 med datavärdet 0-9 för att "
+"välja huvudfönstret, 10-19 för att välja ljudmixerfönstret eller 20-29 för "
+"att välja MIDI-mixerfönstret."
+
+#. Tag: para
+#: index.docbook:1741
+#, no-c-format
+msgid ""
+"Rosegarden accepts MIDI controller number 82 to change the currently "
+"selected track in the main window. The stepping of this controller depends "
+"on the number of tracks in the window -- the ratio of controller data value "
+"to track number will be calculated so as to use the full MIDI controller "
+"data range, provided there are no more than 128 tracks in the window."
+msgstr ""
+"Rosegarden tar emot MIDI-styrenhet nummer 82 för att ändra spår som "
+"för närvarande är markerat i huvudfönstret. Stegningen av styrenheten "
+"beror på antal spår i fönstret: förhållandet mellan styrenhetens "
+"datavärde till spårnummer beräknas så att det fullständiga dataintervallet "
+"i MIDI-styrenheten används, under förutsättning att det inte finns mer "
+"än 128 spår i fönstret."
+
+#. Tag: title
+#: index.docbook:1753
+#, no-c-format
+msgid "Segment and Instrument Parameters"
+msgstr "Segment- och instrumentparametrar"
+
+#. Tag: title
+#: index.docbook:1756
+#, no-c-format
+msgid "The Segment Parameter Box"
+msgstr "Segmentparameterrutan"
+
+#. Tag: phrase
+#: index.docbook:1765
+#, no-c-format
+msgid "&rosegarden;'s segment parameter box"
+msgstr "&rosegarden;s segmentparameterruta"
+
+#. Tag: para
+#: index.docbook:1771
+#, no-c-format
+msgid ""
+"The segment parameter box lives at the left side of the Rosegarden main "
+"window. (If you can't see it, try using <menuchoice> <guimenu "
+"lang=\"en\">Settings</guimenu> <guimenuitem>Show Segment and Instrument "
+"Parameters</guimenuitem> </menuchoice>.) It allows you to modify some "
+"aspects of the selected segments."
+msgstr ""
+"Segmentparameterrutan hör hemma till vänster i Rosegardens huvudfönster. "
+"(Om du inte kan se den, försök använda <menuchoice><guimenu "
+"lang=\"sv\">Inställningar</guimenu> <guimenuitem>Visa segment- och "
+"instrumentparametrar</guimenuitem></menuchoice>.) Den låter dig ändra "
+"vissa aspekter av markerade segment."
+
+#. Tag: para
+#: index.docbook:1777
+#, no-c-format
+msgid ""
+"If a single segment is currently selected, its parameters will be shown in "
+"the segment parameter box and can be edited there. If several segments are "
+"selected, the parameter box will only show the current values where they are "
+"the same for all of the selected segments -- but you can still edit them, "
+"and your changes will apply to the whole selection."
+msgstr ""
+"Om ett enstaka segment för närvarande är markerat, visas dess parametrar "
+"i segmentparameterrutan och kan redigeras där. Om flera segment är "
+"markerade, visar parameterrutan bara nuvarande värden där de är samma "
+"för alla markerade segment, men du kan fortfarande redigera dem och "
+"ändringarna gäller för allt som är markerat."
+
+#. Tag: term
+#: index.docbook:1786
+#, no-c-format
+msgid "Label"
+msgstr "Namn"
+
+#. Tag: para
+#: index.docbook:1788
+#, no-c-format
+msgid ""
+"Shows the label of the selected segment (or segments, if they all have the "
+"same label). Click the \"...\" button to edit the label."
+msgstr ""
+"Visar namnet på det markerade segmentet (eller segmenten, om alla har "
+"samma namn). Klicka på knappen \"...\" för att redigera namnet."
+
+#. Tag: term
+#: index.docbook:1795
+#, no-c-format
+msgid "Repeat"
+msgstr "Upprepa"
+
+#. Tag: para
+#: index.docbook:1797
+#, no-c-format
+msgid ""
+"Switches repeat on or off for the selected segments. A repeating segment "
+"will repeat until the start of the following segment on the same track, or "
+"until the end of the composition if there is no following segment."
+msgstr ""
+"Stänger av eller sätter på upprepning för markerade segment. Ett "
+"upprepande segment upprepas till efterföljande segment börjar i samma "
+"spår, eller till kompositionens slut om det inte finns något "
+"efterföljande segment."
+
+#. Tag: para
+#: index.docbook:1802
+#, no-c-format
+msgid ""
+"The repeated parts of a repeating segment are shown on the main canvas in a "
+"fainter colour than the original segment. You can turn them into real "
+"editable copies of the original segment either by using <menuchoice> "
+"<guimenu lang=\"en\">Segments</guimenu> <guimenuitem>Turn Repeats into "
+"Copies</guimenuitem> </menuchoice>, or simply by double-clicking on the "
+"individual repeating blocks."
+msgstr ""
+"Upprepade delar av ett upprepande segment visas med en svagare färg på "
+"huvudduken än det ursprungliga segmentet. Du kan ändra dem till riktiga "
+"redigerbara kopior av det ursprungliga segmentet genom att antingen använda "
+"<menuchoice><guimenu lang=\"sv\">Segment</guimenu> <guimenuitem>Omvandla "
+"upprepningar till kopior</guimenuitem></menuchoice>, eller genom att helt "
+"enkelt dubbelklicka på enskilda upprepade block."
+
+#. Tag: term
+#: index.docbook:1815
+#, no-c-format
+msgid "Quantize"
+msgstr "Kvantisera"
+
+#. Tag: para
+#: index.docbook:1817
+#, no-c-format
+msgid ""
+"Shows the quantization setting for the selected segments. You can change "
+"this to quickly quantize the start times of all their notes. For more "
+"advanced quantization, use <menuchoice> <guimenu "
+"lang=\"en\">Segments</guimenu> <guimenuitem>Quantize...</guimenuitem> "
+"</menuchoice>. See <link linkend=\"quantization\">Quantization</link> for "
+"more details."
+msgstr ""
+"Visar kvantiseringsinställningen för markerade segment. Du kan ändra den "
+"för att snabbt kvantisera starttider för alla deras toner. För mer "
+"avancerad kvantisering, använd <menuchoice> <guimenu "
+"lang=\"sv\">Segment</guimenu> <guimenuitem>Kvantisera...</guimenuitem> "
+"</menuchoice>. Se <link linkend=\"quantization\">Kvantisering</link> för "
+"mer detaljinformation."
+
+#. Tag: term
+#: index.docbook:1832
+#, no-c-format
+msgid "Transpose"
+msgstr "Transponera"
+
+#. Tag: para
+#: index.docbook:1834
+#, no-c-format
+msgid ""
+"Shows the transposition (in semitones) currently applied to the selected "
+"segments. This transposition is applied when the segment is played, and is "
+"not shown in the notes displayed in the matrix, notation or event list "
+"editors. You can use this to quickly change the pitch of part or all of a "
+"composition."
+msgstr ""
+"Visar transponeringen (i halvtonssteg) som för närvarande används för det "
+"markerade segmentet. Transponeringen utförs när segmentet spelas upp, och "
+"visas inte med noterna i matris-, not- eller händelseeditorerna. Du "
+"kan använda den för att snabbt ändra tonhöjd för en del eller hela "
+"kompositionen."
+
+#. Tag: term
+#: index.docbook:1843
+#, no-c-format
+msgid "Delay"
+msgstr "Fördröjning"
+
+#. Tag: para
+#: index.docbook:1845
+#, no-c-format
+msgid ""
+"Shows the delay currently in effect on the selected segments. You can set a "
+"delay here in order to cause an entire segment to play later than written. "
+"This delay is applied when the segment is played, and is not shown in the "
+"notes displayed in the matrix, notation or event list editors."
+msgstr ""
+"Visar fördröjningen som för närvarande gäller för markerade segment. "
+"Du kan ställa in en fördröjning här för att göra att ett helt segment "
+"spelas upp senare än skrivet. Fördröjningen utförs när segmentet spelas "
+"upp, och visas inte med noterna i matris-, not- eller "
+"händelseeditorerna."
+
+#. Tag: para
+#: index.docbook:1851
+#, no-c-format
+msgid ""
+"You can set a delay either in musical time (by choosing a note duration from "
+"the delay dropdown), in which time the exact delay will depend on the tempo, "
+"or in real time (by choosing a time in milliseconds from the dropdown)."
+msgstr ""
+"Du kan antingen ange en fördröjning med metronomtid (genom att välja "
+"notvärde i fördröjningskombinationsrutan), då fördröjningens exakta "
+"tid beror på tempot, eller med klocktid (genom att välja tiden i "
+"millisekunder i kombinationsrutan)."
+
+#. Tag: term
+#: index.docbook:1862
+#, no-c-format
+msgid "Colour"
+msgstr "Färg"
+
+#. Tag: para
+#: index.docbook:1864
+#, no-c-format
+msgid ""
+"Shows the colour being used for the display of the selected segments. You "
+"can choose another colour from the dropdown, or choose the \"Add New "
+"Colour\" option if you want a colour not in the dropdown."
+msgstr ""
+"Visar färgen som används för att visa markerade segment. Du kan välja en "
+"annan färg i kombinationsrutan, eller välja alternativet \"Lägg till ny "
+"färg\" om du vill ha en färg som inte finns i kombinationsrutan."
+
+#. Tag: para
+#: index.docbook:1869
+#, no-c-format
+msgid ""
+"You can also manage and rename colours using <menuchoice> <guimenu "
+"lang=\"en\">Composition</guimenu> <guimenuitem>Edit Document "
+"Properties...</guimenuitem> </menuchoice> (then choose the Colour page on "
+"the document properties dialog). The modified colour palette will be saved "
+"with the composition in the Rosegarden file."
+msgstr ""
+"Du kan också hantera och byta namn på färger genom att använda "
+"<menuchoice><guimenu lang=\"sv\">Komposition</guimenu> <guimenuitem>Redigera "
+"dokumentegenskaper...</guimenuitem></menuchoice> (och därefter välja sidan "
+"Färg i dialogrutan med dokumentegenskaper). Den ändrade färgpaletten "
+"sparas med kompositionen i Rosegarden-filen."
+
+#. Tag: phrase
+#: index.docbook:1884
+#, no-c-format
+msgid "&rosegarden;'s colour manager"
+msgstr "&rosegarden;s färghantering"
+
+#. Tag: title
+#: index.docbook:1897
+#, no-c-format
+msgid "The Instrument Parameter Box"
+msgstr "Instrumentparameterrutan"
+
+#. Tag: para
+#: index.docbook:1898
+#, no-c-format
+msgid ""
+"The instrument parameter box can be found at the lower left of the "
+"Rosegarden main window, below the <link "
+"linkend=\"segment-view-segmentparameterbox\">Segment Parameter Box</link>. "
+"(If you can't see it, try using <menuchoice> <guimenu "
+"lang=\"en\">Settings</guimenu> <guimenuitem>Show Segment and Instrument "
+"Parameters</guimenuitem> </menuchoice>.)"
+msgstr ""
+"Instrumentparameterrutan finns i nedre vänstra hörnet av Rosegardens "
+"huvudfönster, nedanför <link "
+"linkend=\"segment-view-segmentparameterbox\">segmentparameterrutan</link>. "
+"(Om du inte kan se den, försök använda <menuchoice><guimenu "
+"lang=\"sv\">Inställningar</guimenu> <guimenuitem>Visa segment- och "
+"instrumentparametrar</guimenuitem></menuchoice>.)"
+
+#. Tag: para
+#: index.docbook:1907
+#, no-c-format
+msgid ""
+"It shows you which instrument is assigned to the current selected track, and "
+"contains all of the editable controls for that instrument. Remember that "
+"because any number of tracks can be assigned to the same instrument, the "
+"settings in this box may affect more than one track at a time."
+msgstr ""
+"Den visar vilka instrument som tilldelats nuvarande markerat spår, och "
+"innehåller alla redigerbara knapparna för instrumentet. Kom ihåg att "
+"eftersom hur många spår som helst kan tilldelas till samma instrument, kan "
+"inställningarna i rutan påverka mer än ett spår åt gången."
+
+#. Tag: para
+#: index.docbook:1914
+#, no-c-format
+msgid ""
+"The layout and contents of the instrument parameter box depend on the type "
+"of instrument: MIDI, audio, or synth plugin."
+msgstr ""
+"Utseendet och innehållet i instrumentparameterrutan beror på "
+"instrumenttypen: MIDI, ljud eller syntinsticksmodul."
+
+#. Tag: title
+#: index.docbook:1920
+#, no-c-format
+msgid "MIDI Instrument Parameters"
+msgstr "MIDI-instrumentparametrar"
+
+#. Tag: phrase
+#: index.docbook:1928
+#, no-c-format
+msgid "&rosegarden;'s instrument parameter box for a MIDI instrument"
+msgstr "&rosegarden;s instrumentparameterruta för ett MIDI-instrument"
+
+#. Tag: para
+#: index.docbook:1933
+#, no-c-format
+msgid ""
+"When you select a track assigned to a MIDI instrument, the instrument "
+"parameter box shows MIDI parameters."
+msgstr ""
+"När du markerar ett spår som är tilldelat till ett MIDI-instrument, visar "
+"instrumentparameterrutan MIDI-parametrar."
+
+#. Tag: para
+#: index.docbook:1936
+#, no-c-format
+msgid ""
+"At the top, this box shows the name of the instrument and the connection "
+"that its device is using."
+msgstr ""
+"Längst upp visar rutan instrumentets namn och anslutningen som dess enhet "
+"använder."
+
+#. Tag: para
+#: index.docbook:1940
+#, no-c-format
+msgid ""
+"Below that, you can see and edit the MIDI channel number and the <link "
+"linkend=\"studio-bank-editor\">bank and program</link> settings that should "
+"be sent to the instrument at the start of playback (including a "
+"\"percussion\" toggle that controls whether only percussion programs should "
+"be offered in these settings)."
+msgstr ""
+"Därunder kan du se och redigera MIDI-kanalnumret och inställningar av "
+"<link linkend=\"studio-bank-editor\">bank och program</link> som ska skickas "
+"till instrumentet vid uppspelningens start (inklusive kryssrutan "
+"\"Slagverk\" som styr om bara slagverksprogram ska erbjudas i "
+"inställningarna)."
+
+#. Tag: para
+#: index.docbook:1947
+#, no-c-format
+msgid ""
+"Finally this box shows you the controllers available for this device (those "
+"for a General MIDI device are shown above). Any settings you make here will "
+"be sent to this instrument's channel at the start of playback."
+msgstr ""
+"Till sist visar rutan tillgängliga styrenheter för enheten (de för en "
+"generell MIDI-enhet visas ovan). Alla inställningar som du gör här "
+"skickas till instrumentets kanal vid uppspelningens start."
+
+#. Tag: title
+#: index.docbook:1955
+#, no-c-format
+msgid "Audio Instrument Parameters"
+msgstr "Ljudinstrumentparametrar"
+
+#. Tag: phrase
+#: index.docbook:1963
+#, no-c-format
+msgid "&rosegarden;'s instrument parameter box for an audio instrument"
+msgstr "&rosegarden;s instrumentparameterruta för ett ljudinstrument"
+
+#. Tag: para
+#: index.docbook:1968
+#, no-c-format
+msgid ""
+"When you select an audio track, the instrument parameter box shows audio "
+"parameters."
+msgstr ""
+"När du markerar ett ljudspår, visar instrumentparameterrutan "
+"ljudparametrar."
+
+#. Tag: para
+#: index.docbook:1972
+#, no-c-format
+msgid ""
+"The box has two main faders, one with a blue surround for playback level and "
+"the other with a red surround for the record level when recording to this "
+"instrument. Between them is a playback level meter."
+msgstr ""
+"Rutan har två huvudtoningar, en omgiven av blått för uppspelning och den "
+"andra omgiven av rött för inspelningsnivå vid inspelning till "
+"instrumentet. Mellan dem finns en mätare av uppspelningsnivå."
+
+#. Tag: para
+#: index.docbook:1978
+#, no-c-format
+msgid ""
+"The two menus at the top of the box are used to select the input and output "
+"audio routing for this instrument. Below them you can select whether the "
+"instrument is mono or stereo, and the pan setting for position in the stereo "
+"field. (Audio instruments are always ultimately stereo, because the pan "
+"setting is always applied. But if you set the instrument to mono, it will "
+"reduce any audio data and effect outputs to mono before applying pan.)"
+msgstr ""
+"De två menyerna längst upp i rutan används för att välja ingångs- och "
+"utgångsfördelning för instrumentet. Under dem kan du välja om "
+"instrumentet är mono eller stereo, och panoreringsinställning för plats i "
+"stereofältet. (Ljudinstrument är alltid till sist stereo, eftersom "
+"panoreringsinställningen alltid tillämpas. Men om du ställer in "
+"instrumentet till mono, reduceras all ljuddata och effektutdata till mono "
+"innan panoreringen tillämpas.)"
+
+#. Tag: para
+#: index.docbook:1987
+#, no-c-format
+msgid ""
+"The column of five buttons at lower left are the effects slots. Click on "
+"them to select and activate plugin effects for this audio instrument, and to "
+"control them using the plugin editor dialog. These are insert effects, "
+"applied in order from top to bottom before the fader and pan."
+msgstr ""
+"Kolumnen med fem knappar längst ner till vänster är effektplatserna. "
+"Klicka på dem för att välja och aktivera insticksmoduler för "
+"ljudinstrumentet, och för att styra dem med redigeringsdialogrutan för "
+"insticksmoduler. Detta är infogade effekter, som utförs i ordning "
+"uppifrån och ner innan toning och panorering."
+
+#. Tag: title
+#: index.docbook:1996
+#, no-c-format
+msgid "Synth Plugin Instrument Parameters"
+msgstr "Instrumentparametrar för syntinsticksmoduler"
+
+#. Tag: phrase
+#: index.docbook:2004
+#, no-c-format
+msgid "&rosegarden;'s instrument parameter box for a synth plugin instrument"
+msgstr "&rosegarden;s instrumentparameterruta för ett syntinsticksmodulinstrument"
+
+#. Tag: para
+#: index.docbook:2009
+#, no-c-format
+msgid ""
+"When you select a track assigned to a synth plugin instrument, the "
+"instrument parameter box shows synth parameters. You will notice that "
+"although a synth plugin track uses segments with MIDI data in them, in terms "
+"of control and routing it behaves more like an audio track."
+msgstr ""
+"När du markerar ett spår som är tilldelat till ett "
+"syntinsticksmodulinstrument, visar instrumentparameterrutan syntparametrar. "
+"Du märker att även om en syntinsticksmodul använder segment med "
+"MIDI-data, så beter den sig mer som ett ljudspår när det gäller styrning "
+"och fördelning."
+
+#. Tag: para
+#: index.docbook:2015
+#, no-c-format
+msgid ""
+"The most important control here is the button at top left (saying Xsynth in "
+"the above picture) which shows the name of the synth plugin in use for this "
+"instrument. Click this to select a particular synth and control it in the "
+"standard Rosegarden plugin editor dialog. Once you've selected a plugin, you "
+"may also be able to click the Editor button below it in order to open a "
+"dedicated GUI editor for the particular plugin (if the plugin has one)."
+msgstr ""
+"Den viktigaste knappen här är den längst upp till vänster (som lyder "
+"Xsynth i bilen ovan), som visar namnet på syntinsticksmodulen som används "
+"för instrumentet. Klicka på den för att välja en viss synt och styra den "
+"i Rosegardens vanliga redigeringsdialog för insticksmoduler. När du väl "
+"har valt en insticksmodul, kanske du också kan klicka på "
+"redigeringsknappen nedanför för att öppna en dedicerad grafisk editor "
+"för den särskilda insticksmodulen (om insticksmodulen har någon)."
+
+#. Tag: para
+#: index.docbook:2024
+#, no-c-format
+msgid ""
+"The remaining controls here are the same as for audio instruments: the "
+"playback fader, playback level, output routing, mono/stereo and pan settings "
+"and effects slots are all exactly the same."
+msgstr ""
+"Återstående knappar här är samma som för ljudinstrument: "
+"Uppspelningstoning, uppspelningsnivå, utgångsfördelning, mono/stereo, "
+"panoreringsinställningar och effektplatser är alla exakt likadana."
+
+#. Tag: title
+#: index.docbook:2034
+#, no-c-format
+msgid "Quantization"
+msgstr "Kvantisering"
+
+#. Tag: para
+#: index.docbook:2035
+#, no-c-format
+msgid ""
+"\"Quantization\" is the process of repositioning notes and other events so "
+"that they start or finish on exact beat divisions. It is traditionally used "
+"to make an approximate performance into a precise but rather "
+"mechanical-sounding one -- either because precision is the desired effect, "
+"or for reasons such as making the notes clearer in notation."
+msgstr ""
+"\"Kvantisering\" är processen att flytta toner och andra händelser så att "
+"de börjar eller avslutas på exakta taktdelar. Det används traditionellt "
+"för att göra ett ungefärligt utförande till ett precist men som låter "
+"ganska mekaniskt, antingen på grund av att precision är önskad effekt, "
+"eller på grund av orsaker som att göra noter tydligare i notering."
+
+#. Tag: para
+#: index.docbook:2044
+#, no-c-format
+msgid ""
+"For general quantization, use <menuchoice> <guimenu "
+"lang=\"en\">Segments</guimenu> <guimenuitem>Quantize</guimenuitem> "
+"</menuchoice> in the main window or <menuchoice> <guimenu "
+"lang=\"en\">Adjust</guimenu> <guimenuitem>Quantize</guimenuitem> "
+"</menuchoice> in matrix or notation editors. This shows you a dialog in "
+"which you can select the precise quantization parameters you need, and then "
+"it applies these to all of the selected segments or notes. (You can also "
+"quickly reach this dialog by pressing the \"=\" key.)"
+msgstr ""
+"För allmän kvantisering, använd <menuchoice><guimenu "
+"lang=\"sv\">Segment</guimenu> "
+"<guimenuitem>Kvantisera</guimenuitem></menuchoice> i huvudfönstret eller "
+"<menuchoice><guimenu lang=\"sv\">Justera</guimenu> "
+"<guimenuitem>Kvantisera</guimenuitem></menuchoice> i matriseditorn eller "
+"notbehandlarna. Det visar en dialogruta där du kan välja precis de "
+"kvantiseringsparametrarna du behöver, och tillämpar dem på alla markerade "
+"segment eller toner. (Du kan också snabbt nå dialogrutan genom att "
+"trycka på tangenten \"=\".)"
+
+#. Tag: phrase
+#: index.docbook:2069
+#, no-c-format
+msgid "&rosegarden;'s quantize dialog"
+msgstr "&rosegarden;s kvantiseringsdialogruta"
+
+#. Tag: para
+#: index.docbook:2075
+#, no-c-format
+msgid ""
+"The quantize dialog offers a selection of quantizers, each with its own set "
+"of parameters. The quantizers available are:"
+msgstr ""
+"Kvantiseringsdialogrutan erbjuder ett urval kvantiseringsmetoder, var och en "
+"med sin egen uppsättning parametrar. Tillgängliga kvantiseringsmetoder är:"
+
+#. Tag: term
+#: index.docbook:2082
+#, no-c-format
+msgid "Grid quantizer"
+msgstr "Rutnätskvantisering"
+
+#. Tag: para
+#: index.docbook:2084
+#, no-c-format
+msgid ""
+"The grid quantizer moves the start times of notes so that they start at the "
+"nearest point on some grid (defined by various parameters of the quantizer). "
+"Thus notes that initially vary slightly in start time will be aligned by the "
+"quantizer, making for a more precise and mechanical performance."
+msgstr ""
+"Rutnätskvantiseringen flyttar starttider för toner så att de börjar på "
+"den närmaste punkten i ett rutnät (definierat av de olika parametrarna "
+"för kvantiseringen). På så sätt justeras toner som ursprungligen "
+"varierar något i starttid av kvantiseringen, vilket ger ett mer precist och "
+"mekaniskt utförande."
+
+#. Tag: term
+#: index.docbook:2095
+#, no-c-format
+msgid "Legato quantizer"
+msgstr "Legato-kvantisering"
+
+#. Tag: para
+#: index.docbook:2097
+#, no-c-format
+msgid ""
+"The legato quantizer carries out a simple grid quantization, and also "
+"adjusts the note durations so as to remove any gaps between notes by "
+"extending each note so as to (at least) continue until the start of the "
+"following one. You can also obtain this legato effect without the "
+"accompanying grid quantization using the <menuchoice> <guimenu "
+"lang=\"en\">Adjust</guimenu> <guimenuitem>Quantize</guimenuitem> "
+"<guimenuitem>Legato</guimenuitem> </menuchoice> function in the Matrix "
+"editor."
+msgstr ""
+"Legato-kvantiseringen utför en enkel rutnätskvantisering, och justerar "
+"också notvärdena så att eventuella avstånd mellan tonerna tas bort "
+"genom att förlänga varje not så att den (åtminstone) fortsätter till "
+"början på nästa. Du kan också få denna legato-effekt utan tillhörande "
+"rutnätskvantisering med funktionen <menuchoice><guimenu "
+"lang=\"sv\">Justera</guimenu> <guimenuitem>Kvantisera</guimenuitem> "
+"<guimenuitem>Legato</guimenuitem></menuchoice> i matriseditorn."
+
+#. Tag: term
+#: index.docbook:2113
+#, no-c-format
+msgid "Heuristic notation quantizer"
+msgstr "Heuristisk kvantisering"
+
+#. Tag: para
+#: index.docbook:2115
+#, no-c-format
+msgid ""
+"The notation quantizer attempts to adjust note start times and durations so "
+"as to produce readable notation. See <link "
+"linkend=\"nv-quantization\">Notation from performance data</link> for a "
+"description of this quantizer and its uses."
+msgstr ""
+"Kvantiseringen försöker justera starttider och notvärden för "
+"toner så att en läsbar notering skapas. Se <link "
+"linkend=\"nv-quantization\">Notskrift från utförandedata</link> för en "
+"beskrivning av kvantiseringen och dess användning."
+
+#. Tag: para
+#: index.docbook:2125
+#, no-c-format
+msgid "The grid quantizer has the following adjustable parameters:"
+msgstr "Rutnätskvantiseringen har följande justerbara parametrar:"
+
+#. Tag: term
+#: index.docbook:2129 index.docbook:3711
+#, no-c-format
+msgid "Base grid unit"
+msgstr "Grundenhet för rutnät"
+
+#. Tag: para
+#: index.docbook:2131
+#, no-c-format
+msgid "This is the size of the grid used for quantization."
+msgstr "Det här är storleken på rutnätet som används för kvantiseringen."
+
+#. Tag: term
+#: index.docbook:2137
+#, no-c-format
+msgid "Swing"
+msgstr "Svaj"
+
+#. Tag: para
+#: index.docbook:2139
+#, no-c-format
+msgid ""
+"This is a percentage figure which adjusts the degree by which alternate "
+"beats are quantized \"late\"."
+msgstr ""
+"Det här är ett procenttal som justerar graden som alternerande taktslag "
+"kvantiseras \"sent\"."
+
+#. Tag: para
+#: index.docbook:2141
+#, no-c-format
+msgid ""
+"If set to None (the default), quantization will be to an even grid spaced "
+"according to the base grid unit."
+msgstr ""
+"Om inställt till inget (förvalt värde), görs kvantiseringen till ett "
+"jämt rutnät med avstånd enligt grundenheten för rutnätet."
+
+#. Tag: para
+#: index.docbook:2144
+#, no-c-format
+msgid ""
+"If set to 100%, every second grid line will be placed two-thirds of the "
+"distance between the previous and next ones, instead of only half. This will "
+"result in notes being quantized to the first and third triplets of a swing "
+"beat."
+msgstr ""
+"Om inställd till 100 %, placeras varannan rutnätslinje två tredjedelar av "
+"avståndet mellan föregående och nästa, istället för halvvägs. Det "
+"gör att toner kvantiseras till första och tredje triolen med en svajig "
+"takt."
+
+#. Tag: para
+#: index.docbook:2150
+#, no-c-format
+msgid ""
+"Other settings will produce proportionately varying degrees of swinginess. "
+"You can also set this parameter to negative figures (for alternate beats to "
+"start early) or to figures greater than 100%."
+msgstr ""
+"Övriga inställningar ger proportionellt varierande grad av svaj. Du kan "
+"också ställa in parametern till negativa värden (för att omväxlande "
+"taktslag ska börja tidigare) eller till värden större än 100 %."
+
+#. Tag: term
+#: index.docbook:2158
+#, no-c-format
+msgid "Iterative amount"
+msgstr "Itereringsvärde"
+
+#. Tag: para
+#: index.docbook:2160
+#, no-c-format
+msgid ""
+"The default behaviour of the grid quantizer is to move each note exactly "
+"onto its nearest grid line. But if you set the iterative amount to something "
+"less than 100% (the \"Full quantize\" default), each note will only be moved "
+"that percentage of the distance toward its nearest grid line, resulting in a "
+"nearly-but-not-quite quantized effect."
+msgstr ""
+"Rutnätskvantiseringens normalbeteende är att exakt flytta varje not till "
+"den närmaste rutnätslinjen, men om du ställer in iterationsgränsen till "
+"något som är mindre än 100 % (normalvärdet \"Fullständig "
+"kvantisering\") flyttas varje not bara den procentandelen av avståndet till "
+"närmaste rutnätslinje, vilket resulterar i en kvantiseringseffekt som "
+"nästan utförs, men inte helt och hållet."
+
+#. Tag: para
+#: index.docbook:2166
+#, no-c-format
+msgid ""
+"This quantizer may be applied repeatedly so as to try out gradually "
+"increasing degrees of quantization, hence the name \"iterative\". Use "
+"<menuchoice> <guimenu lang=\"en\">Adjust</guimenu> "
+"<guimenuitem>Quantize</guimenuitem> <guimenuitem>Repeat Last "
+"Quantize</guimenuitem> </menuchoice> in the Matrix editor to do so."
+msgstr ""
+"Kvantiseringen kan utföras upprepade gånger, för att pröva gradvis "
+"ökande kvantiseringsgrader, därav namnet \"iterativ\". Använd "
+"<menuchoice><guimenu lang=\"sv\">Justera</guimenu> "
+"<guimenuitem>Kvantisera</guimenuitem> <guimenuitem>Upprepa senaste "
+"kvantisering</guimenuitem></menuchoice> i matriseditorn för att göra det."
+
+#. Tag: term
+#: index.docbook:2179
+#, no-c-format
+msgid "Quantize durations as well as start times"
+msgstr "Kvantisera både notvärden och starttider"
+
+#. Tag: para
+#: index.docbook:2181
+#, no-c-format
+msgid ""
+"If this option is enabled, the quantizer will quantize the notes' end times "
+"to the same grid as their start times."
+msgstr ""
+"Om det här alternativet är aktiverat, kvantiseras tonernas sluttider till "
+"samma rutnät som deras starttider."
+
+#. Tag: para
+#: index.docbook:2188
+#, no-c-format
+msgid ""
+"The quantize dialog also has an optional Advanced section containing further "
+"options for <link linkend=\"nv-quantization\">notation quantization</link>."
+msgstr ""
+"Kvantiseringsdialogrutan har också en valfri avancerad sektion som "
+"innehåller ytterligare alternativ för <link "
+"linkend=\"nv-quantization\">kvantisering</link>."
+
+#. Tag: para
+#: index.docbook:2193
+#, no-c-format
+msgid ""
+"Another simple way to apply a grid quantizer is to do it in the main window, "
+"using the <guimenuitem>Quantize</guimenuitem> menu on the <link "
+"linkend=\"segment-view-segmentparameterbox\">Segment Parameter Box</link>. "
+"If you select some segments and change the value shown in the menu, the "
+"segments will immediately be grid-quantized to the resolution shown in the "
+"menu."
+msgstr ""
+"Ett annat enkelt sätt att utföra en rutnätskvantisering är att göra den "
+"i huvudfönstret med menyn <guimenuitem>Kvantisera</guimenuitem> i <link "
+"linkend=\"segment-view-segmentparameterbox\">segmentparameterrutan</link>. "
+"Om du markerar några segment och ändrar värdet som visas i menyn, blir "
+"segmenten omedelbart rutnätskvantiserade till upplösningen som visas i "
+"menyn."
+
+#. Tag: para
+#: index.docbook:2202
+#, no-c-format
+msgid ""
+"Finally, there is also a <link linkend=\"matrix-grid-quantize\">quantize "
+"control</link> in the matrix view."
+msgstr ""
+"Till sist finns också en <link linkend=\"matrix-grid-quantize\">styrning av "
+"kvantisering</link> i matrisvyn."
+
+#. Tag: title
+#: index.docbook:2210
+#, no-c-format
+msgid "The Matrix editor"
+msgstr "Matriseditorn"
+
+#. Tag: para
+#: index.docbook:2211
+#, no-c-format
+msgid ""
+"The &rosegarden; matrix editor enables you to view and edit music in a "
+"simple, logical format: each note represented as a block in a grid, at a "
+"height corresponding to the pitch."
+msgstr ""
+"&rosegarden;s matriseditor låter dig visa och redigera musik med ett enkelt "
+"logiskt format: Varje not representeras som ett block i ett rutnät, på en "
+"plats som motsvarar tonhöjden."
+
+#. Tag: phrase
+#: index.docbook:2223
+#, no-c-format
+msgid "&rosegarden;'s matrix editor"
+msgstr "&rosegarden;s matriseditor"
+
+#. Tag: para
+#: index.docbook:2225
+#, no-c-format
+msgid ""
+"Each matrix editor window shows a single segment. To edit a segment, just "
+"right-click on it in the main canvas and select the matrix editor from the "
+"menu. Alternatively, you can configure Rosegarden to make the matrix editor "
+"the default editor available when you double-click on a segment."
+msgstr ""
+"Varje fönster i matriseditorn visar ett enstaka segment. För att redigera "
+"ett segment, högerklicka bara på det på huvudduken och välj "
+"matriseditorn i menyn. Alternativt kan du ställa in Rosegarden att göra "
+"matriseditorn till standardvy som är tillgänglig genom att "
+"dubbelklicka på ett segment."
+
+#. Tag: title
+#: index.docbook:2235
+#, no-c-format
+msgid "The Grid and Quantize controls"
+msgstr "Styrning av rutnät och kvantisering"
+
+#. Tag: para
+#: index.docbook:2236
+#, no-c-format
+msgid "The matrix view contains Grid and Quantize menus in its main toolbar."
+msgstr "Matrisvyn innehåller menyerna Rutnät och Kvantisering i huvudmenyraden."
+
+#. Tag: para
+#: index.docbook:2240
+#, no-c-format
+msgid ""
+"The Grid menu controls the size of the visible grid in the background of the "
+"matrix view, as well as the time resolution used when entering and moving "
+"notes. After you set it to a particular time value, the normal note "
+"insertion and drag operations will then snap automatically to grid points "
+"spaced at that time width. You can override the snap-to-grid effect "
+"temporarily by holding down Shift during editing, or you can disable it by "
+"setting the Grid menu to None."
+msgstr ""
+"Rutnätsmenyn styr det synliga rutnätets storlek i matrisvyns bakgrund, "
+"samt tidsupplösningen som används när noter skrivs in och flyttas. Efter "
+"du har ställt in det till ett visst tidsvärde, låses de normala "
+"åtgärderna för att infoga och dra noter automatiskt till rutnätspunkter "
+"åtskilda med det tidsvärdets bredd. Du kan överskrida "
+"positioneringsfunktionen tillfälligt genom att hålla nere Skift under "
+"redigeringen, eller inaktivera den genom att ställa in rutnätsmenyn till "
+"Ingen låsning."
+
+#. Tag: para
+#: index.docbook:2249
+#, no-c-format
+msgid ""
+"The Quantize menu works rather differently. Rather than controlling the "
+"behaviour of other editing tools, it actually performs an action. When you "
+"change the value in this menu, the selected notes -- or the whole segment if "
+"nothing is selected -- will immediately be quantized using a grid quantizer "
+"of the chosen resolution."
+msgstr ""
+"Kvantiseringsmenyn fungerar på ett ganska annorlunda sätt. I stället för "
+"att styra beteendet hos andra redigeringsverktyg, utför den verkligen en "
+"åtgärd. När du ändrar värde i menyn, blir de markerade noterna, eller "
+"hela segmentet om ingenting är markerat, omedelbart kvantiserade av en "
+"rutnätskvantisering med vald upplösning."
+
+#. Tag: para
+#: index.docbook:2256
+#, no-c-format
+msgid ""
+"The Quantize menu also shows you continuously what resolution the current "
+"segment or selection is quantized to. For example, if you select a set of "
+"notes that start on consecutive quarter-note beats, the Quantize menu will "
+"update itself to show 1/4, as this is the coarsest resolution consistent "
+"with the existing quantization of the current selection."
+msgstr ""
+"Kvantiseringsmenyn visar också kontinuerligt vilken upplösning som det "
+"nuvarande segmentet eller markeringen är kvantiserad med. Om du till "
+"exempel markerar en uppsättning noter som börjar på efterföljande "
+"kvartsnotstaktslag, uppdateras kvantiseringsmenyn så att 1/4 visas, "
+"eftersom det är den grövsta upplösningen som motsvarar den befintliga "
+"kvantiseringen av nuvarande markering."
+
+#. Tag: title
+#: index.docbook:2267
+#, no-c-format
+msgid "Inserting notes"
+msgstr "Infoga noter"
+
+#. Tag: para
+#: index.docbook:2268
+#, no-c-format
+msgid ""
+"The simplest way to enter a note in the matrix view is to use the mouse. To "
+"do this, select the pencil tool on the toolbar, and then click and drag on "
+"the matrix editor. The note will be entered at the time and pitch "
+"corresponding to the point you click at, and will have a duration "
+"corresponding to the distance you drag before releasing the mouse button."
+msgstr ""
+"Det enklaste sättet att mata in en not i matrisvyn är att använda musen. "
+"För att göra det, välj pennverktyget i verktygsraden, klicka och dra "
+"därefter i matriseditorn. Noten matas in vid tiden och med tonhöjden som "
+"motsvarar punkten du klickar, och har ett notvärde som motsvarar avståndet "
+"du drar innan du släpper musknappen."
+
+#. Tag: para
+#: index.docbook:2277
+#, no-c-format
+msgid ""
+"By default, the time and duration are snapped to a particular grid unit, "
+"according to the Grid setting on the View menu or the toolbar. You can "
+"prevent this effect by holding down Shift while clicking and dragging."
+msgstr ""
+"Normalt är tiden och notvärdet låsta till en viss rutnätsenhet enligt "
+"rutnätsinställningarna i menyn Visa eller verktygsraden. Du kan förhindra "
+"effekten genom att hålla nere Skift medan du klickar och drar."
+
+#. Tag: title
+#: index.docbook:2284
+#, no-c-format
+msgid "Typing notes with the PC keyboard"
+msgstr "Skriva in noter med datorns tangentbord"
+
+#. Tag: title
+#: index.docbook:2287 index.docbook:2822
+#, no-c-format
+msgid "Duration"
+msgstr "Notvärde"
+
+#. Tag: para
+#: index.docbook:2289
+#, no-c-format
+msgid ""
+"The durations of notes entered from the keyboard are controlled by the Grid "
+"setting on the View menu or toolbar. You can set this using the number keys:"
+msgstr ""
+"Notvärden för noter som matas in via tangentbordet styrs av "
+"rutnätsinställningarna i menyn Visa eller verktygsraden . Du kan ställa "
+"in det genom att använda de numeriska tangenterna:"
+
+#. Tag: para
+#: index.docbook:2294
+#, no-c-format
+msgid "<keycap>5</keycap> &ndash; Whole bar"
+msgstr "<keycap>5</keycap> &ndash; Hel takt"
+
+#. Tag: para
+#: index.docbook:2295
+#, no-c-format
+msgid "<keycap>1</keycap> &ndash; Beat"
+msgstr "<keycap>1</keycap> &ndash; Takt"
+
+#. Tag: para
+#: index.docbook:2296 index.docbook:2831
+#, no-c-format
+msgid "<keycap>2</keycap> &ndash; Half note (minim)"
+msgstr "<keycap>2</keycap> &ndash; Halvnot"
+
+#. Tag: para
+#: index.docbook:2297 index.docbook:2832
+#, no-c-format
+msgid "<keycap>4</keycap> &ndash; Quarter note (crotchet)"
+msgstr "<keycap>4</keycap> &ndash; Kvartsnot"
+
+#. Tag: para
+#: index.docbook:2298 index.docbook:2833
+#, no-c-format
+msgid "<keycap>8</keycap> &ndash; Eighth note (quaver)"
+msgstr "<keycap>8</keycap> &ndash; Åttondedelsnot"
+
+#. Tag: para
+#: index.docbook:2299 index.docbook:2834
+#, no-c-format
+msgid "<keycap>6</keycap> &ndash; Sixteenth note (semiquaver)"
+msgstr "<keycap>6</keycap> &ndash; Sextondedelsnot"
+
+#. Tag: para
+#: index.docbook:2300 index.docbook:2835
+#, no-c-format
+msgid "<keycap>3</keycap> &ndash; Thirty-second note (demisemiquaver)"
+msgstr "<keycap>3</keycap> &ndash; Trettioandredelsnot"
+
+#. Tag: para
+#: index.docbook:2301 index.docbook:2836
+#, no-c-format
+msgid "<keycap>0</keycap> &ndash; Sixty-fourth note (hemidemisemiquaver)"
+msgstr "<keycap>0</keycap> &ndash; Sextifjärdedelsnot"
+
+#. Tag: title
+#: index.docbook:2307 index.docbook:2847
+#, no-c-format
+msgid "Pitch"
+msgstr "Tonhöjd"
+
+#. Tag: para
+#: index.docbook:2309
+#, no-c-format
+msgid ""
+"Once the correct duration is selected in the Grid menu, you can insert a "
+"note at the current position of the <link linkend=\"nv-rulers\">insert "
+"cursor</link> by pressing one of the pitch keys:"
+msgstr ""
+"Så fort rätt notvärde är vald i rutnätsmenyn kan du infoga en not på "
+"<link linkend=\"nv-rulers\">infogningsmarkörens</link> aktuella position "
+"genom att trycka på en av tonhöjdstangenterna:"
+
+#. Tag: para
+#: index.docbook:2315 index.docbook:2855
+#, no-c-format
+msgid ""
+"<keycap>A</keycap> &ndash; Do (the tonic of the current key in the current "
+"clef)"
+msgstr "<keycap>A</keycap> &ndash; C (Do, tonikan i aktuell tonart för aktuell klav)"
+
+#. Tag: para
+#: index.docbook:2316 index.docbook:2856
+#, no-c-format
+msgid "<keycap>S</keycap> &ndash; Re"
+msgstr "<keycap>S</keycap> &ndash; D (Re)"
+
+#. Tag: para
+#: index.docbook:2317 index.docbook:2857
+#, no-c-format
+msgid "<keycap>D</keycap> &ndash; Mi"
+msgstr "<keycap>D</keycap> &ndash; E (Mi)"
+
+#. Tag: para
+#: index.docbook:2318 index.docbook:2858
+#, no-c-format
+msgid "<keycap>F</keycap> &ndash; Fa"
+msgstr "<keycap>F</keycap> &ndash; F (Fa)"
+
+#. Tag: para
+#: index.docbook:2319 index.docbook:2859
+#, no-c-format
+msgid "<keycap>J</keycap> &ndash; So"
+msgstr "<keycap>J</keycap> &ndash; G (So)"
+
+#. Tag: para
+#: index.docbook:2320 index.docbook:2860
+#, no-c-format
+msgid "<keycap>K</keycap> &ndash; La"
+msgstr "<keycap>K</keycap> &ndash; A (La)"
+
+#. Tag: para
+#: index.docbook:2321 index.docbook:2861
+#, no-c-format
+msgid "<keycap>L</keycap> &ndash; Ti"
+msgstr "<keycap>L</keycap> &ndash; H (Ti)"
+
+#. Tag: para
+#: index.docbook:2324 index.docbook:2867
+#, no-c-format
+msgid ""
+"Holding <keycap>Shift</keycap> while pressing a key will sharpen the note "
+"(except for Mi and Ti, which don't have sharpened versions) and holding "
+"<keycap>Shift</keycap> and <keycap>Ctrl</keycap> together will flatten it "
+"(except for Fa and Do)."
+msgstr ""
+"Genom att hålla nere <keycap>Skift</keycap> när en tangent trycks, fås en "
+"upphöjd not (utom för E och H som inte har upphöjda versioner) och genom "
+"att hålla nere <keycap>Skift</keycap> och <keycap>Ctrl</keycap> tillsammans "
+"fås en nersänkt not (utom för F och C)."
+
+#. Tag: para
+#: index.docbook:2330 index.docbook:2873
+#, no-c-format
+msgid ""
+"To enter notes an octave higher, use the corresponding keys on the next row "
+"up: <keycap>Q</keycap>, <keycap>W</keycap>, <keycap>E</keycap>, "
+"<keycap>R</keycap>, <keycap>U</keycap>, <keycap>I</keycap>, and "
+"<keycap>O</keycap>. Likewise to enter notes an octave lower, use "
+"<keycap>Z</keycap>, <keycap>X</keycap>, <keycap>C</keycap>, "
+"<keycap>V</keycap>, <keycap>B</keycap>, <keycap>N</keycap> and "
+"<keycap>M</keycap>."
+msgstr ""
+"För att skriva in noter en oktav högre,använd motsvarande tangenter på "
+"nästa rad ovanför: <keycap>Q</keycap>, <keycap>W</keycap>, "
+"<keycap>E</keycap>, <keycap>R</keycap>, <keycap>U</keycap>, "
+"<keycap>I</keycap> och <keycap>O</keycap>. På motsvarande sätt, för att "
+"lägga till noter en oktav lägre, använd <keycap>Z</keycap>, "
+"<keycap>X</keycap>, <keycap>C</keycap>, <keycap>V</keycap>, "
+"<keycap>B</keycap>, <keycap>N</keycap> och <keycap>M</keycap>."
+
+#. Tag: title
+#: index.docbook:2342 index.docbook:2930
+#, no-c-format
+msgid "Other remarks"
+msgstr "Övriga anmärkningar"
+
+#. Tag: para
+#: index.docbook:2344 index.docbook:2932
+#, no-c-format
+msgid ""
+"All of the insertion commands are also available on a submenu of the Tools "
+"menu. It's unlikely you'd ever want to navigate the menus just to insert a "
+"single note, but the menus show the keyboard shortcuts and so provide a "
+"useful reference in case you forget which key is which."
+msgstr ""
+"Alla infogningskommandon är också tillgängliga från en undermeny i menyn "
+"Verktyg. Det är inte troligt att du någonsin vill navigera i menyn bara "
+"för att infoga en enstaka not, men menyerna visar snabbtangenterna och "
+"tillhandahåller på så sätt en användbar referens om du skulle glömma "
+"vilken tangent som gör vad."
+
+#. Tag: para
+#: index.docbook:2350
+#, no-c-format
+msgid ""
+"The keyboard shortcuts are currently designed for use with a QWERTY-layout "
+"keyboard. There is not yet any way to remap the keys for another layout, "
+"short of reassigning each key individually using <menuchoice> <guimenu "
+"lang=\"en\">Settings</guimenu> <guimenuitem>Configure "
+"Shortcuts...</guimenuitem> </menuchoice>."
+msgstr ""
+"Snabbtangenterna är för närvarande gjorda för att användas med "
+"tangentbord som har QWERTY-organisation. Det finns ännu inte något sätt att "
+"ändra snabbtangenter till en annan organisation, förutom att individuellt "
+"ändra tilldelning av varje tangent med <menuchoice><guimenu "
+"lang=\"sv\">Inställningar</guimenu> <guimenuitem>Anpassa "
+"genvägar...</guimenuitem></menuchoice>."
+
+#. Tag: title
+#: index.docbook:2363 index.docbook:2953
+#, no-c-format
+msgid "Entering notes using a MIDI keyboard"
+msgstr "Skriva in noter genom att använda ett MIDI-keyboard"
+
+#. Tag: para
+#: index.docbook:2365
+#, no-c-format
+msgid ""
+"You can enter notes into the matrix editor one at a time using a MIDI "
+"keyboard or other MIDI control device. The matrix editor uses the pitches "
+"you play on the keyboard, but the durations you have selected in the Grid "
+"setting of the editor itself. This is known as \"step recording\"."
+msgstr ""
+"Du kan lägga till noter i matriseditorn en i taget med ett MIDI-keyboard "
+"eller en annan MIDI-styrenhet. Matriseditorn använder tonhöjden du spelar "
+"på ett keyboard, men de notvärden du har valt i editorns egna "
+"rutnätsinställningar. Det är känt som \"stegvis inspelning\"."
+
+#. Tag: para
+#: index.docbook:2373
+#, no-c-format
+msgid ""
+"To start entering notes from a MIDI keyboard, first make sure the keyboard "
+"is configured as your default MIDI record device. Then make sure you have "
+"the right Grid setting in the View menu or toolbar, as this controls the "
+"note duration. Then press the step recording button on the matrix editor's "
+"toolbar, or select Step Recording from the Tools menu. From that point on "
+"all notes pressed on the MIDI keyboard will be inserted at the current "
+"insertion time in that window, until step recording is switched off again or "
+"activated in a different window or the window is closed."
+msgstr ""
+"För att börja mata in noter från ett MIDI-keyboard, försäkra dig först "
+"om att det är inställt som förvald MIDI-inspelningsenhet. Försäkra dig "
+"därefter om att du har rätt rutnätsinställning i menyn Visa eller på "
+"verktygsraden, eftersom det styr notvärdena. Tryck därefter på "
+"knappen för stegvis inspelning i matriseditorns verktygsrad, eller välj "
+"Stegvis inspelning i menyn Verktyg. Från detta ögonblick infogas alla "
+"toner som du spelar på ditt MIDI-keyboard vid den nuvarande inmatningstiden "
+"i fönstret, ända till stegvis inspelning stängs av igen, aktiveras i ett "
+"annat fönster eller fönstret stängs."
+
+#. Tag: para
+#: index.docbook:2387
+#, no-c-format
+msgid ""
+"You can change the Grid setting while step recording is in progress, in "
+"order to insert notes of different durations."
+msgstr ""
+"Du kan ändra rutnätsinställningar medan stegvis inspelning pågår, för "
+"att infoga noter med olika notvärden."
+
+#. Tag: title
+#: index.docbook:2395
+#, no-c-format
+msgid "Selecting notes"
+msgstr "Markera noter"
+
+#. Tag: para
+#: index.docbook:2395
+#, no-c-format
+msgid ""
+"To select notes in the matrix editor, switch to the Select (arrow) tool and "
+"then outline a rectangular area containing the notes you want to select. The "
+"selected events will then be highlighted in blue. If you instead click on a "
+"single event, just that event will be selected."
+msgstr ""
+"För att markera noter i matriseditorn, byt till markeringsverktyget (pilen) "
+"och rita upp ett rektangulärt område som innehåller noterna du vill "
+"markera. Markerade händelser färgläggs då i blått. Om du istället "
+"klickar på en enstaka händelse, markeras bara den händelsen."
+
+#. Tag: para
+#: index.docbook:2402
+#, no-c-format
+msgid ""
+"If you hold <keycap>Shift</keycap> while dragging out a rectangle or "
+"clicking on a note, the new selection will be added to any existing "
+"selection instead of replacing it."
+msgstr ""
+"Om du håller nere <keycap>Skift</keycap> medan du ritar upp en rektangel "
+"eller klickar på en not, läggs den nya markeringen till i en eventuell "
+"befintlig markering istället för att ersätta den."
+
+#. Tag: para
+#: index.docbook:2407
+#, no-c-format
+msgid ""
+"To clear a selection, click in an empty space on the matrix editor, or hit "
+"the Escape key."
+msgstr ""
+"För att rensa en markering, klicka på ett tomt område i matriseditorn "
+"eller tryck på Esc-tangenten."
+
+#. Tag: para
+#: index.docbook:2411
+#, no-c-format
+msgid ""
+"You can also select all of the notes of a given pitch, by shift-clicking on "
+"a key in the piano keyboard down the left side of the matrix editor. You can "
+"also shift-click and drag to select a range of pitches. This selection is "
+"added to any existing selection you have, so if you want a clean new "
+"selection, clear the old one first."
+msgstr ""
+"Du kan också markera alla noter av en viss tonhöjd genom att skift-klicka "
+"på en tangent på pianoklaviaturen längs vänster sida i matriseditorn. Du "
+"kan också skift-klicka och dra för att markera en uppsättning tonhöjder. "
+"Markeringen läggs till i en eventuell befintlig markering, så om du vill "
+"ha en helt ny markering, avmarkera först den föregående."
+
+#. Tag: title
+#: index.docbook:2421
+#, no-c-format
+msgid "Moving and copying notes"
+msgstr "Flytta och kopiera noter"
+
+#. Tag: para
+#: index.docbook:2422
+#, no-c-format
+msgid ""
+"You can move notes in both time and pitch on the matrix editor by either "
+"clicking and dragging them with the Move tool, or selecting them and then "
+"dragging them with the Select tool."
+msgstr ""
+"Du kan flytta noter både i tid och tonhöjd i matriseditorn genom att "
+"antingen klicka och dra dem med förflyttningsverktyget, eller markera dem "
+"och därefter dra dem med markeringsverktyget."
+
+#. Tag: para
+#: index.docbook:2428
+#, no-c-format
+msgid ""
+"To copy notes, select them and then use the standard copy and paste "
+"functions. After the paste the pasted notes will be selected instead, and "
+"you can then drag them wherever you need them."
+msgstr ""
+"För att kopiera noter, markera dem och använd därefter de vanliga "
+"funktionerna kopiera och klistra in. Efter de har klistrats in är de "
+"inklistrade noterna markerade istället, och du kan dra dem var du än vill "
+"ha dem."
+
+#. Tag: title
+#: index.docbook:2439
+#, no-c-format
+msgid "The Percussion Matrix editor"
+msgstr "Slagverksmatriseditorn"
+
+#. Tag: para
+#: index.docbook:2441
+#, no-c-format
+msgid ""
+"The Percussion Matrix editor is identical to the <link "
+"linkend=\"matrix-view\">Matrix editor</link>, except that it shows pitch "
+"names on the vertical scale instead of a piano keyboard, and it does not "
+"show the duration for each note. This is intended for use with percussion "
+"programs on MIDI instruments, in which each note pitch plays a different "
+"percussion sound."
+msgstr ""
+"Slagverksmatriseditorn är identisk med <link linkend=\"matrix-view\">"
+"matriseditorn</link>, förutom att den visar tonhöjdsnamn på den "
+"vertikala skalan istället för pianotangenter, och att den inte visar "
+"notvärdet för varje not. Den är avsedd för användning med "
+"slagverksprogram i MIDI-instrument, där varje tonhöjd spelar ett "
+"annorlunda slagverksljud."
+
+#. Tag: para
+#: index.docbook:2448
+#, no-c-format
+msgid "See also <link linkend=\"studio-keymappings\">Percussion Key Mappings</link>"
+msgstr "Se också <link linkend=\"studio-keymappings\">Tonavbildningar för slagverk</link>."
+
+#. Tag: title
+#: index.docbook:2453
+#, no-c-format
+msgid "The Notation editor"
+msgstr "Notbehandlaren"
+
+#. Tag: para
+#: index.docbook:2460
+#, no-c-format
+msgid ""
+"The &rosegarden; notation editor enables you to view and edit one or more "
+"staffs in traditional score notation."
+msgstr ""
+"&rosegarden;s notbehandlare gör det möjligt att visa och redigera ett "
+"eller flera notsystem med traditionell partiturnotation."
+
+#. Tag: phrase
+#: index.docbook:2473
+#, no-c-format
+msgid "&rosegarden;'s notation editor"
+msgstr "&rosegarden;s notbehandlare"
+
+#. Tag: para
+#: index.docbook:2478
+#, no-c-format
+msgid ""
+"&rosegarden; aims to present scores with the best possible layout compatible "
+"with its primary focus as a sequencer application. This means that although "
+"the editor supports chords, overlapping and nested beamed groups, triplets "
+"and arbitrary tuplets, grace notes, dynamics, accents, text and so on, it "
+"does not provide as much fine control over layout (especially in "
+"contrapuntal music) as a dedicated score editing program might. &rosegarden; "
+"does not aim to produce typeset-quality score, although it can export "
+"Lilypond files, which may form a good basis for typesetting."
+msgstr ""
+"&rosegarden; försöker presentera partitur med bästa möjliga utläggning givet "
+"dess huvudsakliga fokus som en musikbehandlare. Det betyder att även om "
+"editorn stöder ackord, överlappande och nästlade balkgrupper, trioler och "
+"godtyckliga annandelningar, prydnadsnoter, dynamik, accenter, text och så "
+"vidare, tillhandahåller den inte så mycket detaljkontroll över utläggningen "
+"(särskilt i musik med kontrapunkt) som särskilda program för redigering "
+"av partitur kan göra. &rosegarden; har inte som mål att skapa partitur av "
+"typsättningskvalitet, även om Lilypond-filer kan exporteras, vilka kan "
+"utgöra en bra grund för typsättning."
+
+#. Tag: title
+#: index.docbook:2496
+#, no-c-format
+msgid "Single and multiple staffs"
+msgstr "Enkla och flera notsystem"
+
+#. Tag: para
+#: index.docbook:2498
+#, no-c-format
+msgid ""
+"There are three ways to open a notation editor from the &rosegarden; main "
+"window. (They all require that you have some existing segments in the main "
+"window first, so if you're starting a new composition, you should create "
+"your segments before you start thinking about how to edit them.)"
+msgstr ""
+"Det finns tre sätt att öppna en notbehandlare i &rosegarden;s "
+"huvudfönster. (Alla kräver att du först har ett befintligt segment i "
+"huvudfönstret, så om du påbörjar en ny komposition, bör du skapa dina "
+"segment innan du börjar fundera på hur de ska redigeras.)"
+
+#. Tag: term
+#: index.docbook:2509
+#, no-c-format
+msgid "Double-clicking on segments"
+msgstr "Dubbelklicka på segment"
+
+#. Tag: para
+#: index.docbook:2512
+#, no-c-format
+msgid ""
+"The most obvious way is just to double-click on a segment in the main "
+"canvas. This opens the segment in whatever you have configured as the "
+"default editor (notation, matrix, or event list), and by default this is the "
+"notation editor. So double-clicking a single segment will open it as a "
+"single staff in a Notation editor window."
+msgstr ""
+"Det mest uppenbara sättet är att dubbelklicka på ett segment på "
+"huvudduken. Det öppnar segmentet i den editor som du har ställt in som "
+"standardvy (not, matris eller händelselista), som normalt är "
+"notbehandlaren. Alltså öppnas ett segment som ett enskilt notsystem i "
+"notbehandlarens fönster genom att dubbelklicka på det."
+
+#. Tag: para
+#: index.docbook:2520
+#, no-c-format
+msgid ""
+"You can also open a multi-staff editor this way: holding down the Shift key, "
+"select (with a single mouse click) each of the segments on the main view "
+"that you want to open, but double-click on the last one. All of the selected "
+"segments will then be opened together in a single notation window."
+msgstr ""
+"Du kan också öppna en editor med flera notsystem på följande sätt: "
+"Håll nere Skift-tangenten, markera (med ett enda musklick) alla segment i "
+"huvudvyn som du vill öppna, men dubbelklicka på det sista. Alla markerade "
+"segment öppnas då tillsammans i ett enda fönster i notbehandlaren."
+
+#. Tag: term
+#: index.docbook:2531
+#, no-c-format
+msgid "The Open in Default Editor menu function (the Return key)"
+msgstr "Funktionen Öppna i standardvy (returtangenten)"
+
+#. Tag: para
+#: index.docbook:2534
+#, no-c-format
+msgid ""
+"The Return key is a shortcut for the Open in Default Editor menu function, "
+"which does much the same thing as double-clicking: opens all of the "
+"currently selected segments together in a notation editor, or in whichever "
+"other editor you have configured as your default."
+msgstr ""
+"Returtangenten är en snabbtangent för menyfunktionen att öppna i "
+"standardvyn, som gör i stort sett samma sak som att dubbelklicka: Den "
+"öppnar alla segment som för närvarande är markerade i notbehandlaren, "
+"eller i någon annan editor som du har ställt in som standardvy."
+
+#. Tag: term
+#: index.docbook:2544
+#, no-c-format
+msgid "The Open in Notation Editor menu functions"
+msgstr "Menyfunktionerna Öppna i notbehandlare"
+
+#. Tag: para
+#: index.docbook:2547
+#, no-c-format
+msgid ""
+"Alternatively, you can use the main window's Open in Notation Editor menu "
+"function, either on the Segments menu or on the right-button popup menu on a "
+"segment in the canvas. Select the segments you want to edit (by "
+"shift-clicking as above, or by using the Select All Segments function) and "
+"then select Open in Notation Editor."
+msgstr ""
+"Som ett alternativ kan du använda huvudfönstrets menyalternativ Öppna i "
+"notbehandlare, antingen i menyn Segment eller i menyn som visas med "
+"höger musknapp över ett segment på duken. Markera segmenten du vill "
+"redigera (genom att skift-klicka som ovan, eller genom att använda "
+"alternativet Markera alla segment) och välj därefter Öppna i "
+"notbehandlare."
+
+#. Tag: para
+#: index.docbook:2563
+#, no-c-format
+msgid ""
+"If you have more than one staff (i.e. segment) visible in the notation "
+"editor, only one of them can be \"current\" at once. The current staff can "
+"be distinguished because it has the insert cursor on it (see <link "
+"linkend=\"nv-rulers\">Rulers and Cursors</link>), and this is the staff on "
+"which any editing operations that use the insert cursor will take place. The "
+"topmost staff is the current one by default, but you can switch to a "
+"different staff by ctrl-clicking on it or by using the Move Cursor Up Staff "
+"and Move Cursor Down Staff menu functions."
+msgstr ""
+"Om du har mer än ett notsystem (dvs. segment) synligt i notbehandlaren "
+"kan bara ett av dem vara \"aktuellt\" på en gång. Det aktuella notsystemet "
+"kan urskiljas eftersom infogningsmarkören visas i det (se <link "
+"linkend=\"nv-rulers\">Linjaler och markörer</link>), och det är "
+"notsystemet där alla redigeringsåtgärder som använder "
+"infogningsmarkören äger rum. Det översta notsystemet är normalt det "
+"aktuella, men du kan byta till ett annat notsystem genom att Ctrl-klicka på "
+"det eller genom att använda menyalternativen Markör upp notsystem och "
+"Markör ner notsystem."
+
+#. Tag: title
+#: index.docbook:2579
+#, no-c-format
+msgid "Linear and page layouts"
+msgstr "Horisontell och sidbaserad utläggning"
+
+#. Tag: para
+#: index.docbook:2581
+#, no-c-format
+msgid ""
+"The usual way the notation editor displays staffs is known as Linear layout: "
+"one staff on top of another, with each staff as a single, horizontally "
+"scrollable long line. Some of the functions of the editor (such as the <link "
+"linkend=\"nv-rulers\">Rulers</link>) are only available in Linear layout."
+msgstr ""
+"Det vanliga sättet som notbehandlaren visar notsystem är känt som "
+"horisontell utläggning: Notsystem ovanför varandra, med varje notsystem som "
+"en enda, horisontell rullande lång rad. Vissa funktioner i editorn (som "
+"<link linkend=\"nv-rulers\">linjalerna</link>) är bara tillgängliga med "
+"horisontell utläggning."
+
+#. Tag: para
+#: index.docbook:2590
+#, no-c-format
+msgid ""
+"However, you can also display staffs in two different page-based layouts: "
+"Continuous Page and Multiple Page."
+msgstr ""
+"Du kan dock också visa notsystem med två olika sidbaserade utläggningar: "
+"Vertikal utläggning eller Sidutläggning."
+
+#. Tag: para
+#: index.docbook:2594
+#, no-c-format
+msgid ""
+"In Continuous Page layout, the music is arranged in one infinitely-tall page "
+"of the same width as the window. Each staff breaks at the end of a line, "
+"starting a new line below the remaining staffs."
+msgstr ""
+"I vertikal utläggning visas noteringen på en oändligt hög sida med "
+"samma bredd som fönstret. Varje notsystem bryts vid radens slut, och "
+"påbörjar en ny rad under återstående notsystem."
+
+#. Tag: para
+#: index.docbook:2599
+#, no-c-format
+msgid ""
+"In Multiple Page layout, the music is divided up into real pages much as it "
+"will be when printed. The size of each page is calculated so that "
+"approximately the same amount of music will fit on each line as it will when "
+"actually printed (according to the point size specified for the printing "
+"resolution in the configuration dialog). The printed version is unlikely to "
+"be exactly the same, as it depends on the precise paper size and margins in "
+"use when printing, but it should be fairly close if you happen to be using "
+"A4 paper."
+msgstr ""
+"I sidutläggning visas noteringen uppdelad på riktiga sidor i stort sett "
+"som den ser ut när den skrivs ut. Varje sidas storlek beräknas så att "
+"ungefär samma antal noter får plats på varje rad som när det verkligen "
+"skrivs ut (enligt punktstorleken som anges för utskriftsupplösningen i "
+"inställningsdialogrutan). Den utskrivna versionen är troligen inte precis "
+"likadan, eftersom det beror på den exakta pappersstorleken och marginalerna "
+"som används vid utskrift, men det bör vara ganska nära om du råkar "
+"använda A4-papper."
+
+#. Tag: phrase
+#: index.docbook:2617
+#, no-c-format
+msgid "&rosegarden;'s notation editor in Multiple Page layout"
+msgstr "&rosegarden;s notbehandlare med sidutläggning"
+
+#. Tag: para
+#: index.docbook:2621
+#, no-c-format
+msgid ""
+"Most, but not all, of the display and editing functions work in the page "
+"layout modes as well as in linear layout."
+msgstr ""
+"De flesta, men inte alla, av visnings- och redigeringsfunktionerna fungerar "
+"lika bra i sidutläggningslägena som i horisontell utläggning."
+
+#. Tag: para
+#: index.docbook:2626
+#, no-c-format
+msgid ""
+"To switch between these layout modes, use the Linear Layout, Continuous Page "
+"Layout and Multiple Page Layout menu functions."
+msgstr ""
+"För att byta mellan utläggningslägen, använd menyalternativen Horisontell "
+"utläggning, Vertikal utläggning och Sidutläggning."
+
+#. Tag: title
+#: index.docbook:2634
+#, no-c-format
+msgid "Rulers and cursors"
+msgstr "Linjaler och markörer"
+
+#. Tag: para
+#: index.docbook:2636
+#, no-c-format
+msgid ""
+"The &rosegarden; Notation editor window includes two rulers and two cursors. "
+"The rulers are the horizontal strips divided up with tickmarks at top and "
+"bottom of the main notation canvas, and the cursors are the coloured "
+"vertical lines shown initially at the start of the top staff in the editor."
+msgstr ""
+"&rosegarden;s notredigeringsfönster innehåller två linjaler och "
+"två markörer. Linjalerna är de horisontella raderna uppdelade med "
+"graderingar längst upp och längst ner på huvudnoteringsduken, och "
+"markörerna är de färgade vertikala linjerna som ursprungligen visas i "
+"början av det översta notsystemet i editorn."
+
+#. Tag: para
+#: index.docbook:2645
+#, no-c-format
+msgid ""
+"The purple cursor is the insert cursor. It shows the point at which "
+"operations such as insert and paste will take place. You can reposition the "
+"insert cursor by clicking or dragging on the top ruler, or by clicking with "
+"the Select tool on an empty part of the staff (avoiding any events), or by "
+"clicking anywhere with <keycap>Ctrl</keycap> held down."
+msgstr ""
+"Den violetta markören är infogningsmarkören. Den visar platsen där "
+"åtgärder som infoga och klistra in utförs. Du kan flytta "
+"infogningsmarkören genom att klicka eller dra på den övre linjalen, eller "
+"genom att klicka med markeringsverktyget på en tom del av notsystemet (och "
+"undvika alla händelser), eller genom att klicka var som helst med "
+"<keycap>Ctrl</keycap> intryckt."
+
+#. Tag: para
+#: index.docbook:2654
+#, no-c-format
+msgid ""
+"You can also use the left and right arrow keys to move the insert cursor one "
+"event at a time. If you hold <keycap>Ctrl</keycap> while pressing the arrow "
+"keys, the cursor will move a whole bar at a time; if you hold Shift, the "
+"cursor will <link linkend=\"nv-tools-selections\">select the events</link> "
+"as it passes over them."
+msgstr ""
+"Du kan också använda vänster och höger piltangenter för att flytta "
+"infogningsmarkören en händelse i taget. Om du håller nere "
+"<keycap>Ctrl</keycap> medan piltangenterna trycks, flyttas markören en hel "
+"takt åt gången. Om du håller nere Skift, <link "
+"linkend=\"nv-tools-selections\">markeras händelserna</link> medan markören "
+"rör sig över dem."
+
+#. Tag: para
+#: index.docbook:2662
+#, no-c-format
+msgid ""
+"The blue cursor is the playback pointer. Just like the similar cursors in "
+"the main window and the matrix views, this shows the location of the current "
+"playback or record position. It can be repositioned using the bottom ruler."
+msgstr ""
+"Den blåa markören är uppspelningsmarkören. Precis som liknande markörer "
+"i huvudfönstret och matrisvyn, visar den platsen för nuvarande uppspelning "
+"eller inspelning. Den kan förflyttas genom att använda linjalen längst "
+"ner."
+
+#. Tag: para
+#: index.docbook:2669
+#, no-c-format
+msgid ""
+"Note that the rulers are only shown in <link linkend=\"nv-layout\">Linear "
+"layout</link> mode."
+msgstr ""
+"Observera att linjalerna bara visas i läget <link "
+"linkend=\"nv-layout\">Horisontell utläggning</link>."
+
+#. Tag: title
+#: index.docbook:2682
+#, no-c-format
+msgid "Tools and selections"
+msgstr "Verktyg och markeringar"
+
+#. Tag: para
+#: index.docbook:2683
+#, no-c-format
+msgid ""
+"Most of the menu and toolbar editing functions in the &rosegarden; Notation "
+"editor fall into one of three categories: <quote>tools</quote>, "
+"<quote>functions that operate on selections</quote>, and <quote>drag "
+"operations</quote>."
+msgstr ""
+"De flesta redigeringsfunktioner i menyer och verktygsrader i &rosegarden;s "
+"notbehandlare ingår i en av tre kategorier: <quote>verktyg</quote>, "
+"<quote>funktioner som arbetar med markeringar</quote> och "
+"<quote>dragåtgärder</quote>."
+
+#. Tag: term
+#: index.docbook:2693
+#, no-c-format
+msgid "Tools"
+msgstr "Verktyg"
+
+#. Tag: para
+#: index.docbook:2695
+#, no-c-format
+msgid ""
+"The basic tools are the selection tool, the erase tool, and those for "
+"inserting notes, rests, text and so on, which are usually accessed from the "
+"toolbar buttons. Choosing a tool changes the default behaviour of the mouse "
+"buttons on the main notation canvas, at least until another tool is chosen "
+"instead. For example, choosing the selection tool allows you to make "
+"selections and so to use the selection-based functions (below); choosing an "
+"insertion tool (such as one of the notes) switches the "
+"<acronym>GUI</acronym>'s behaviour so as to insert notes by clicking on the "
+"canvas; choosing the erase tool allows you to remove events by clicking on "
+"them."
+msgstr ""
+"De grundläggande verktygen är markeringsverktyget, borttagningsverktyget "
+"och de som används för att infoga noter, pauser, text och så vidare, "
+"vilka oftast väljes med knappar i verktygsraden. Att välja ett verktyg "
+"ändrar det normala beteendet hos musknapparna på huvudnoteringsduken, "
+"åtminstone till ett annat verktyg väljes istället. Genom att till exempel "
+"välja markeringsverktyget kan du göra markeringar och på så sätt "
+"använda de markeringsbaserade funktionerna (nedan). Genom att välja ett "
+"infogningsverktyg (som en av noterna) ändras det grafiska gränssnittets "
+"beteende så att noter infogas genom att klicka på duken. Genom att välja "
+"borttagningsverktyget gör att du kan ta bort händelser genom att klicka "
+"på dem."
+
+#. Tag: para
+#: index.docbook:2709
+#, no-c-format
+msgid "You can also change the current tool using the Tools menu."
+msgstr "Du kan också byta aktuellt verktyg med menyn Verktyg."
+
+#. Tag: term
+#: index.docbook:2716
+#, no-c-format
+msgid "Functions that operate on selections"
+msgstr "Funktioner som arbetar med markeringar"
+
+#. Tag: para
+#: index.docbook:2718
+#, no-c-format
+msgid ""
+"The majority of the remaining menu functions require a selection to be made "
+"on the canvas before they can be used. Some of them (such as "
+"<guimenuitem>Cut</guimenuitem> or the <guimenuitem>Note Style</guimenuitem> "
+"functions) will operate on any selected events; others (such as the "
+"<guimenuitem>Grace Notes</guimenuitem> or <guimenuitem>Stem "
+"Directions</guimenuitem> functions) will refuse to work unless the selection "
+"contains some notes."
+msgstr ""
+"Flertalet återstående menyalternativen kräver att en markering görs på "
+"duken innan de kan användas. Vissa av dem (såsom alternativen "
+"<guimenuitem>Klipp ut</guimenuitem> eller "
+"<guimenuitem>Notstil</guimenuitem>) fungerar på alla händelser som "
+"markerats. Andra (såsom <guimenuitem>Prydnadsnot</guimenuitem> eller "
+"<guimenuitem>Skaftriktning</guimenuitem>) vägrar fungera om inte "
+"markeringen innehåller några noter."
+
+#. Tag: para
+#: index.docbook:2729
+#, no-c-format
+msgid ""
+"To select some events on the canvas, switch to the Select (arrow) tool and "
+"then outline a rectangular area containing the events you want to select. "
+"The selected events will then be highlighted in blue. If you click on a "
+"single event, just that event will be selected <footnote> <para> You can "
+"also double-click on a single event to open an editing dialog for that "
+"event, but that's got nothing to do with selections.</para> </footnote>)."
+msgstr ""
+"För att markera några händelser på duken, byt till markeringsverktyget "
+"(pilen) och rita därefter upp ett rektangulärt område som innehåller "
+"händelserna du vill markera. De markerade händelserna färgläggs då med "
+"blått. Om du klickar på en enskild händelse, markeras bara den händelsen "
+"<footnote> <para> Du kan också dubbelklicka på en enskild händelse för "
+"att visa en redigeringsdialogruta för händelsen, men det har ingenting att "
+"göra med markeringar.</para> </footnote>)."
+
+#. Tag: para
+#: index.docbook:2738
+#, no-c-format
+msgid ""
+"If you hold <keycap>Shift</keycap> while dragging out a rectangle, its "
+"contents will be added to any existing selection instead of replacing it."
+msgstr ""
+"Om du håller nere <keycap>Skift</keycap> medan du ritar upp en rektangel, "
+"läggs innehållet till i en eventuell befintlig markering istället för "
+"att ersätta den."
+
+#. Tag: para
+#: index.docbook:2743
+#, no-c-format
+msgid ""
+"To select a whole bar, double-click with the Select tool on some empty space "
+"within that bar; to select the whole staff, click three times. The Edit menu "
+"carries functions for selecting extended areas based on the location of the "
+"insert cursor, and you can also select events around the insert cursor by "
+"holding Shift and pressing the left or right arrow keys."
+msgstr ""
+"För att markera en hel takt, dubbelklicka med markeringsverktyget på ett "
+"tomt utrymme i takten. För att markera hela notsystemet, klicka tre "
+"gånger. Redigeringsmenyn innehåller alternativ för att markera utökade "
+"områden baserat på infogningsmarkörens plats, och du kan också markera "
+"händelser omkring infogningsmarkören genom att hålla nere Skift och "
+"trycka på vänster eller höger piltangent."
+
+#. Tag: para
+#: index.docbook:2752
+#, no-c-format
+msgid "It is not possible to select events from more than one staff at once."
+msgstr ""
+"Det är inte möjligt att markera händelser i mer än ett notsystem på en "
+"gång."
+
+#. Tag: term
+#: index.docbook:2760
+#, no-c-format
+msgid "Drag operations"
+msgstr "Dragåtgärder"
+
+#. Tag: para
+#: index.docbook:2762
+#, no-c-format
+msgid ""
+"You can also do a certain amount of editing just by dragging things around. "
+"Switch to the Select (arrow) tool, and then you can change the pitch of "
+"notes by just click-and-dragging their heads up or down, and change the "
+"times of notes and other events by dragging them left or right. (You can't "
+"drag rests or time signatures, but you can drag everything else. If you have "
+"more than one event selected, the whole selection will be dragged at once.)"
+msgstr ""
+"Du kan också utföra en viss mängd redigering genom att bara dra omkring "
+"saker. Byt till markeringsverktyget (pilen), och därefter kan du ändra "
+"tonhöjd på noter genom att bara klicka och dra deras huvuden uppåt eller "
+"neråt, och ändra tider för noter och andra händelser genom att dra dem "
+"åt vänster eller höger. (Du kan inte dra pauser eller taktarter, "
+"men du kan dra allting annat. Om du har markerat mer än en händelse, dras "
+"hela markeringen på en gång.)"
+
+#. Tag: para
+#: index.docbook:2773
+#, no-c-format
+msgid ""
+"Dragging is usually a less accurate way of editing things than using the "
+"menu or toolbar functions, but it can be easier."
+msgstr ""
+"Att dra är oftast ett mindre noggrant sätt att redigera än att använda "
+"funktionerna i menyn eller verktygsraden, men det kan vara enklare."
+
+#. Tag: title
+#: index.docbook:2786
+#, no-c-format
+msgid "Inserting notes and rests"
+msgstr "Infoga noter och pauser"
+
+#. Tag: para
+#: index.docbook:2788
+#, no-c-format
+msgid ""
+"To insert a note, select one of the note tools by clicking on a particular "
+"duration of note on the toolbar, and then click on the staff at the point "
+"where you want to add the note."
+msgstr ""
+"För att infoga en not, välj ett av notverktygen genom att klicka på ett "
+"visst notvärde i verktygsraden, och därefter klicka i notsystemet på "
+"platsen där du vill lägga till noten."
+
+#. Tag: para
+#: index.docbook:2792
+#, no-c-format
+msgid ""
+"You can also select one of the accidentals on the toolbar to insert "
+"sharpened or flattened notes. If no accidental is selected, the note "
+"inserted will follow the key signature. Alternatively, you can select the "
+"\"Follow previous accidental\" icon (shown as a note with an arrow pointing "
+"back from where the accidental would appear) to make the note follow "
+"whatever accidental was last used at the same height on the staff."
+msgstr ""
+"Du kan också markera en av de tillfälliga förtecknen på verktygsraden "
+"för att infoga upphöjda eller nersänkta noter. Om inget tillfälligt "
+"förtecken används, följer den infogade noten de fasta förtecknen. Som ett "
+"alternativ kan du välja ikonen \"Följ föregående tillfälliga förtecken\" "
+"(som visas som en not med en pil som pekar tillbaka från stället där "
+"förtecknet skulle visas) för att få noten att följa det tillfälliga "
+"förtecken som senast användes på samma plats i notsystemet."
+
+#. Tag: para
+#: index.docbook:2800
+#, no-c-format
+msgid ""
+"If you add a note at the same time as an existing note of different "
+"duration, the editor will generally assume that you want to create chords "
+"and will split the existing or new note accordingly so as to create one or "
+"more chords with ties. If you really do want to chord two different "
+"durations, you can select the tied noteheads and use the Collapse "
+"Equal-Pitch Notes function to merge them together. Alternatively, the "
+"default behaviour can be changed in the &rosegarden; configuration dialog so "
+"as not to do the split at all."
+msgstr ""
+"Om du lägger till en not på samma tid som en befintlig not med annat "
+"notvärde, antar editorn i allmänhet att du vill skapa ackord och delar upp "
+"den befintliga eller nya noten på motsvarande sätt för att skapa ett "
+"eller flera bundna ackord. Om du verkligen vill skapa ett ackord med två "
+"olika notvärden, kan du markera de bundna nothuvudena och använda funktionen "
+"Lägg ihop noter med samma tonhöjd för att lägga ihop dem. Som ett "
+"alternativ kan det förvalda beteendet ändras in &rosegarden;s "
+"inställningsdialogruta, så att uppdelningen inte alls görs."
+
+#. Tag: para
+#: index.docbook:2810
+#, no-c-format
+msgid ""
+"If you add a note exactly over an existing note of different duration (i.e. "
+"at the same pitch), the duration of the existing note will be changed to "
+"that of the new one."
+msgstr ""
+"Om du lägger till en not exakt ovanpå en befintlig not med annorlunda "
+"notvärde (dvs. på samma tonhöjd), ändras notvärdet på den befintliga noten "
+"till det nya notvärdet."
+
+#. Tag: para
+#: index.docbook:2814
+#, no-c-format
+msgid ""
+"If you add a rest at the same time as an existing note, the note will be "
+"silenced for the duration of the rest, shortening or possibly removing it "
+"altogether."
+msgstr ""
+"Om du lägger till en paus på exakt samma tid som en befintlig not, blir "
+"den befintliga noten tyst under pausvärdet, vilket förkortar den eller "
+"möjligen tar bort den helt och hållet."
+
+#. Tag: title
+#: index.docbook:2819
+#, no-c-format
+msgid "Typing notes and rests with the PC keyboard"
+msgstr "Skriva in noter och pauser med datorns tangentbord"
+
+#. Tag: para
+#: index.docbook:2824
+#, no-c-format
+msgid ""
+"First, ensure a notation tool is selected to indicate the duration of note "
+"(or rest) you wish to insert. You can select the various note types using "
+"the number keys:"
+msgstr ""
+"Försäkra dig först om att ett notverktyg är valt för att ange "
+"notvärdet (eller pausvärdet) som du vill infoga. Du kan välja de "
+"olika nottyperna genom att använda nummertangenterna:"
+
+#. Tag: para
+#: index.docbook:2829
+#, no-c-format
+msgid "<keycap>5</keycap> &ndash; Breve"
+msgstr "<keycap>5</keycap> &ndash; Brevis"
+
+#. Tag: para
+#: index.docbook:2830
+#, no-c-format
+msgid "<keycap>1</keycap> &ndash; Whole note (semibreve)"
+msgstr "<keycap>1</keycap> &ndash; Helnot"
+
+#. Tag: para
+#: index.docbook:2839
+#, no-c-format
+msgid ""
+"You can switch to a triplet version of the note duration by pressing the "
+"<keycap>G</keycap> key. Pressing it again will switch back to the normal "
+"duration. The status bar at the bottom of the window will notify you of when "
+"a triplet duration is active."
+msgstr ""
+"Du kan byta till en triolversion av notvärdet genom att trycka på "
+"tangenten <keycap>G</keycap>. Genom att trycka på den igen byter du "
+"tillbaka till normalt notvärde. Statusraden längst ner i fönstret "
+"underrättar dig om att ett triolvärde är aktivt."
+
+#. Tag: para
+#: index.docbook:2849
+#, no-c-format
+msgid ""
+"Once a notation tool is selected, you can insert a note at the current "
+"position of the <link linkend=\"nv-rulers\">insert cursor</link> by pressing "
+"one of the pitch keys:"
+msgstr ""
+"Så fort ett notverktyg är valt, kan du infoga en not på <link "
+"linkend=\"nv-rulers\">infogningsmarkörens</link> aktuella position genom "
+"att trycka på en av tonhöjdstangenterna:"
+
+#. Tag: para
+#: index.docbook:2864
+#, no-c-format
+msgid "Press the \".\" key to togggle between dotted and undotted durations."
+msgstr ""
+"Tryck på tangenten \".\" för att växla mellan notvärden med eller utan "
+"punkt."
+
+#. Tag: title
+#: index.docbook:2885
+#, no-c-format
+msgid "Rests"
+msgstr "Pauser"
+
+#. Tag: para
+#: index.docbook:2887
+#, no-c-format
+msgid ""
+"To insert a rest instead of a note, press <keycap>P</keycap>. Alternatively, "
+"you can use the <keycap>T</keycap> and <keycap>Y</keycap> keys to switch the "
+"current tool to a rest tool and back to a note tool again."
+msgstr ""
+"För att infoga en paus istället för en not, tryck på <keycap>P</keycap>. "
+"Som ett alternativ kan du använda tangenterna <keycap>T</keycap> och "
+"<keycap>Y</keycap> för att byta aktuellt verktyg till ett pausverktyg och "
+"tillbaka till ett notverktyg igen."
+
+#. Tag: title
+#: index.docbook:2895
+#, no-c-format
+msgid "Chords"
+msgstr "Ackord"
+
+#. Tag: para
+#: index.docbook:2897
+#, no-c-format
+msgid ""
+"The default behaviour of the notation editor is to move the insert cursor "
+"forward after inserting a note, so as to be ready to insert another note "
+"after it in a melody; this can be changed using the <keycap>H</keycap> key, "
+"which switches to chord mode so that subsequent insertions occur at the same "
+"time as the last one. Pressing <keycap>H</keycap> again switches back to the "
+"melody insertion behaviour."
+msgstr ""
+"Normalbeteendet i notbehandlaren är att flytta infogningsmarkören "
+"framåt efter en not har infogats, så att den är klar att mata in en ny "
+"not på efterföljande plats i en melodi. Det kan ändras med tangenten "
+"<keycap>H</keycap>, som byter till ackordsläge så att efterföljande "
+"inmatning sker samtidigt som den senaste. Att trycka på <keycap>H</keycap> "
+"igen byter tillbaka till inmatningsbeteende för melodi."
+
+#. Tag: title
+#: index.docbook:2909
+#, no-c-format
+msgid "Changing note durations"
+msgstr "Ändra notvärden"
+
+#. Tag: para
+#: index.docbook:2911
+#, no-c-format
+msgid ""
+"You can use the keyboard to change the durations of notes that you've "
+"already entered. Make sure the notes you want to change are selected, and "
+"then press <keycap>Ctrl</keycap> plus the number key for the note you want. "
+"You can also add or remove dots, by pressing <keycap>Ctrl</keycap> plus "
+"\".\" &mdash; use this repeatedly to select between one dot, two dots and no "
+"dots."
+msgstr ""
+"Du kan använda tangentbordet för att ändra notvärden som du redan "
+"har skrivit in. Försäkra dig om att noterna du vill ändra är markerade, "
+"och tryck därefter på <keycap>Ctrl</keycap> samt nummertangenten för "
+"noten som du vill ha. Du kan också lägga till eller ta bort punkter, genom "
+"att trycka <keycap>Ctrl</keycap> och \".\". Använd det upprepade gånger "
+"för att välja mellan en punkt, två punkter eller ingen punkt."
+
+#. Tag: para
+#: index.docbook:2919
+#, no-c-format
+msgid ""
+"If you also hold <keycap>Alt</keycap> as well as <keycap>Ctrl</keycap>, you "
+"will change the durations of the notes as displayed in the notation editor "
+"without changing their performed durations. This can be very useful for "
+"tidying up a score: see also <link linkend=\"nv-quantization\">notation from "
+"performance data</link>."
+msgstr ""
+"Om du håller nere <keycap>Alt</keycap> samt <keycap>Ctrl</keycap>, ändrar "
+"du notvärden som de visas i notbehandlaren utan att ändra "
+"utfört notvärde. Det kan vara mycket användbart för att städa upp ett "
+"partitur: Se också <link linkend=\"nv-quantization\">Notskrift från "
+"utförandedata</link>."
+
+#. Tag: para
+#: index.docbook:2938
+#, no-c-format
+msgid ""
+"The keyboard shortcuts are currently designed for use with a QWERTY-layout "
+"keyboard. There is not yet any way to remap the keys for another layout, "
+"short of reassigning each key individually using the \"Configure "
+"Shortcuts...\" option on the Settings menu."
+msgstr ""
+"Snabbtangenterna är för närvarande gjorda för att användas med "
+"tangentbord som har QWERTY-organisation. Det finns ännu inte något sätt att "
+"ändra snabbtangenter till en annan organisation, förutom att individuellt "
+"ändra tilldelning av varje tangent med alternativet \"Anpassa genvägar...\" "
+"i menyn Inställningar."
+
+#. Tag: para
+#: index.docbook:2944
+#, no-c-format
+msgid ""
+"Holding the <keycap>Ctrl</keycap> key while pressing a number will select "
+"the corresponding dotted-note tool."
+msgstr ""
+"Genom att hålla nere <keycap>Ctrl</keycap> vid tryck på en nummertangent "
+"väljes motsvarande verktyg med punkt."
+
+#. Tag: para
+#: index.docbook:2955
+#, no-c-format
+msgid ""
+"You can enter notes into the notation editor one at a time using a MIDI "
+"keyboard or other MIDI control device &mdash; a process known as step "
+"recording. The notation editor uses the pitches you play on the keyboard, "
+"but the durations you have selected in the editor itself."
+msgstr ""
+"Du kan lägga till noter i notbehandlaren en i taget med ett "
+"MIDI-keyboard eller en annan MIDI-styrenhet, en process som är känd som "
+"\"stegvis inspelning\". Notbehandlaren använder tonhöjden du spelar på "
+"ett keyboard, men de notvärden du har valt i själva editorn."
+
+#. Tag: para
+#: index.docbook:2963
+#, no-c-format
+msgid ""
+"To start entering notes from a MIDI keyboard, first make sure the keyboard "
+"is configured as your default MIDI record device. Then make sure a notation "
+"tool is selected to set a duration. Then press the step recording button on "
+"the notation editor's toolbar, or select Step Recording from the Tools menu. "
+"From that point on all notes pressed on the MIDI keyboard will be inserted "
+"at the current insertion time in that notation window, until step recording "
+"is switched off again or activated in a different window or the window is "
+"closed."
+msgstr ""
+"För att börja mata in noter från ett MIDI-keyboard, försäkra dig först "
+"om att det är inställt som förvald MIDI-inspelningsenhet. Försäkra dig "
+"därefter om att ett notverktyg är valt för att ange ett notvärde. "
+"Tryck därefter på knappen för stegvis inspelning i notbehandlarens "
+"verktygsrad, eller välj Stegvis inspelning i menyn Verktyg. Från detta "
+"ögonblick infogas alla toner som du spelar på ditt MIDI-keyboard vid den "
+"nuvarande inmatningstiden i noteringsfönstret, ända till stegvis "
+"inspelning stängs av igen, aktiveras i ett annat fönster eller fönstret "
+"stängs."
+
+#. Tag: para
+#: index.docbook:2977
+#, no-c-format
+msgid ""
+"You can select another notation tool while step recording is in progress, in "
+"order to insert notes of different durations; and you can also switch into "
+"Chord mode to insert chords."
+msgstr ""
+"Du kan välja ett annat notverktyg medan stegvis inspelning pågår "
+"för att infoga noter med olika notvärden, och du kan också byta till "
+"ackordläge för att infoga ackord."
+
+#. Tag: title
+#: index.docbook:2990
+#, no-c-format
+msgid "Clef and key"
+msgstr "Klav och tonart"
+
+#. Tag: para
+#: index.docbook:2993
+#, no-c-format
+msgid ""
+"The first thing to know about the way &rosegarden; handles these is that "
+"time-related changes (tempos and time signatures) are treated entirely "
+"differently from clefs and keys. In order to simplify managing playback and "
+"recording as well as notation, &rosegarden; requires that when the tempo or "
+"time signature changes, it does so in all staffs at once. You can't have one "
+"staff in 3/4 and another in 4/4 simultaneously, or one staff playing at 120 "
+"to the beat and another at 90. This applies only to time: there is no such "
+"restriction on the use of clef and key changes."
+msgstr ""
+"Det första man måste veta om hur &rosegarden; hanterar dessa är att "
+"tidsrelaterade ändringar (tempo och taktarter) hanteras helt "
+"annorlunda än klaver och tonarter. För att förenkla hantering av "
+"uppspelning och inspelning samt notering, kräver &rosegarden; att när "
+"tempo eller taktart ändras, görs det i alla notsystem på en "
+"gång. Du kan inte låta ett notsystem använda 3/4 medan ett annat "
+"samtidigt använder 4/4, eller ha ett notsystem som spelar med 120 taktslag "
+"och ett annat med 90. Det gäller bara tid: Det finns inga sådana "
+"begränsningar för användning av klav- och tonartsbyten."
+
+#. Tag: para
+#: index.docbook:3004
+#, no-c-format
+msgid ""
+"To change the clef, key, tempo or time signature within a notation editor "
+"window, position the <link linkend=\"nv-rulers\">insert cursor</link> at the "
+"point where you want the change to happen, and use one of the Edit menu's "
+"Add Clef Change..., Add Key Change..., Add Tempo Change... and Add Time "
+"Signature Change... functions. You will then see a dialog box in which you "
+"can choose the particular clef, key, tempo or time signature setting you "
+"want to apply, as follows."
+msgstr ""
+"För att ändra klav, tonart, tempobeteckning eller taktart inne i ett "
+"fönster i notbehandlaren, placera <link "
+"linkend=\"nv-rulers\">infogningsmarkören</link> på ett ställe där du "
+"vill att ändringen ska ske, och använd en av redigeringsmenyns funktioner "
+"Lägg till klavbyte..., Lägg till tonartsbyte..., Byt "
+"tempo... eller Byt taktart... . Då visas en "
+"dialogruta där du kan välja en viss inställning för klav, tonart, "
+"tempobeteckning eller taktart som du vill använda, enligt följande."
+
+#. Tag: title
+#: index.docbook:3014
+#, no-c-format
+msgid "Clef"
+msgstr "Klav"
+
+#. Tag: phrase
+#: index.docbook:3022
+#, no-c-format
+msgid "&rosegarden;'s clef dialog"
+msgstr "&rosegarden;s klavdialogruta"
+
+#. Tag: para
+#: index.docbook:3028
+#, no-c-format
+msgid ""
+"The dialog allows you to choose a clef, but also to choose how you want the "
+"clef to be applied, in cases where there are already some notes following "
+"the point where the clef is to be inserted. You must choose one of the "
+"following:"
+msgstr ""
+"Dialogrutan låter dig välja en klav, och låter dig dessutom välja hur du "
+"vill att klaven ska användas, i fall där det redan finns några noter "
+"efter punkten där klaven ska infogas. Du måste välja något av följande:"
+
+#. Tag: term
+#: index.docbook:3037
+#, no-c-format
+msgid "Maintain current pitches"
+msgstr "Behåll nuvarande tonhöjder"
+
+#. Tag: para
+#: index.docbook:3039
+#, no-c-format
+msgid "Any notes following the clef will keep their current performance pitches."
+msgstr "Alla noter som följer klaven behåller sina nuvarande utförda tonhöjder."
+
+#. Tag: para
+#: index.docbook:3043
+#, no-c-format
+msgid ""
+"For example, inserting a tenor clef in the middle of a previously "
+"treble-clef section will cause the notes following the clef to be moved an "
+"octave higher up the staff, because they will still have their treble-clef "
+"pitches."
+msgstr ""
+"Genom att till exempel infoga en c-klav i mitten av ett avsnitt med en "
+"tidigare g-klav gör att noterna som kommer efter klaven att flyttas en "
+"oktav högre i notsystemet, eftersom de fortfarande har sina tonhöjder "
+"enligt g-klaven."
+
+#. Tag: term
+#: index.docbook:3055
+#, no-c-format
+msgid "Transpose into appropriate octave"
+msgstr "Transponera till lämplig oktav"
+
+#. Tag: para
+#: index.docbook:3057
+#, no-c-format
+msgid ""
+"Any notes following the clef will retain their pitch within the octave, but "
+"may be moved into a different octave to match the new clef, and therefore "
+"will play at a new pitch."
+msgstr ""
+"Alla noter som kommer efter klaven behåller sin tonhöjd inom oktaven, men "
+"kan flyttas till en annan oktav för att passa med den nya klaven, och "
+"spelas därför med annan tonhöjd."
+
+#. Tag: para
+#: index.docbook:3064
+#, no-c-format
+msgid ""
+"For example, inserting a tenor clef in the middle of a previously "
+"treble-clef section will cause the notes following the clef to move by one "
+"staff line only to adjust to the new clef, but to play an octave lower than "
+"before."
+msgstr ""
+"Genom att till exempel infoga en c-klav i mitten av ett avsnitt med en "
+"tidigare g-klav gör att noterna som kommer efter klaven bara att flyttas en "
+"linje i notsystemet för att justeras enligt den nya klaven, men spelas en "
+"oktav lägre än tidigare."
+
+#. Tag: title
+#: index.docbook:3080
+#, no-c-format
+msgid "<title>Key</title>"
+msgstr "<title>Tonart</title>"
+
+#. Tag: phrase
+#: index.docbook:3088
+#, no-c-format
+msgid "&rosegarden;'s key signature dialog"
+msgstr "&rosegarden;s dialogruta för fasta förtecken"
+
+#. Tag: title
+#: index.docbook:3100
+#, no-c-format
+msgid "Text and lyrics"
+msgstr "Text och sångtexter"
+
+#. Tag: para
+#: index.docbook:3102
+#, no-c-format
+msgid ""
+"A staff can contain various sorts of text, in text events. There are two "
+"basic classes of text event: single text items used for point annotations "
+"etc., and lyrics. The former can be created (and so associated with a "
+"particular time in the staff) using the Text tool, which is available on the "
+"button marked with a big <guilabel>T</guilabel> in the toolbar. Lyrics can "
+"also be created this way, but are more easily created using the <link "
+"linkend=\"nv-text-lyrics\">lyric editor</link>."
+msgstr ""
+"Ett notsystem kan innehålla olika sorters text, i texthändelser. Det finns "
+"två grundläggande klasser med texthändelser: Enstaka textobjekt som "
+"används för punktnoteringar etc., och sångtexter. De förstnämnda kan "
+"skapas (och på så sätt kopplas till en viss tid i notsystemet) med "
+"textverktyget, som är tillgängligt från knappen markerad med ett stort "
+"<guilabel>T</guilabel> i verktygsraden. Sångtext kan också skapas på "
+"detta sätt, men skapas enklare med <link "
+"linkend=\"nv-text-lyrics\">sångtexteditorn</link>."
+
+#. Tag: para
+#: index.docbook:3111
+#, no-c-format
+msgid ""
+"To add a piece of text, select the Text tool and click at the point where "
+"you want to add it. A dialog box will appear, into which you can type the "
+"text and choose its intended purpose. (Rosegarden prefers to store what the "
+"text is for, rather than how it should look; this is so that in future we "
+"may be able to configure how the various sorts of text are presented for "
+"each individual user.) The available purposes (or styles) are:"
+msgstr ""
+"För att lägga till ett textstycke, välj textverktyget och klicka på "
+"stället där du vill lägga till den. En dialogruta visas, där du kan "
+"skriva in texten och välja dess tänkta syfte. (Rosegarden föredrar att "
+"lagra vad texten är till för, istället för hur. Det görs så att vi i "
+"framtiden kan ställa in hur diverse textsorter presenteras för varje "
+"individuell användare). Tillgängliga syften (eller stilar) är:"
+
+#. Tag: term
+#: index.docbook:3122
+#, no-c-format
+msgid "Dynamic"
+msgstr "Dynamik"
+
+#. Tag: para
+#: index.docbook:3122
+#, no-c-format
+msgid ""
+"Used for minor local indications such as the dynamic marks \"p\", \"mf\" "
+"etc. Shown below the staff in small italic type by default."
+msgstr ""
+"Används för mindre lokala föredragsbeteckningar som dynamikbeteckningarna "
+"\"p\", \"mf\" etc. Visas normalt under notsystemet med liten kursiv stil."
+
+#. Tag: term
+#: index.docbook:3127
+#, no-c-format
+msgid "Direction"
+msgstr "Anvisning"
+
+#. Tag: para
+#: index.docbook:3127
+#, no-c-format
+msgid ""
+"Used when indicating significant changes in style or mood. Shown above the "
+"staff in large roman type by default."
+msgstr ""
+"Används för att ange väsentliga ändringar i stil eller stämning. Visas "
+"normalt ovanför notsystemet med stort romerskt teckensnitt."
+
+#. Tag: term
+#: index.docbook:3132
+#, no-c-format
+msgid "Local Direction"
+msgstr "Lokal anvisning"
+
+#. Tag: para
+#: index.docbook:3132
+#, no-c-format
+msgid ""
+"Used to indicate less significant changes in style or mood. Shown below the "
+"staff in a smaller bold-italic roman type by default."
+msgstr ""
+"Används för att ange mindre väsentliga ändringar i stil eller stämning. "
+"Visas normalt under notsystemet med mindre romerskt teckensnitt i fetstil."
+
+#. Tag: term
+#: index.docbook:3137
+#, no-c-format
+msgid "<term>Tempo</term>"
+msgstr "<term>Tempo</term>"
+
+#. Tag: para
+#: index.docbook:3137
+#, no-c-format
+msgid ""
+"Used to indicate significant changes in tempo. Shown above the staff in "
+"large bold roman type by default."
+msgstr ""
+"Används för att ange väsentliga ändringar av tempo. Visas normalt "
+"ovanför notsystemet med stort romerskt teckensnitt i fetstil."
+
+#. Tag: term
+#: index.docbook:3142
+#, no-c-format
+msgid "Local Tempo"
+msgstr "Lokalt tempo"
+
+#. Tag: para
+#: index.docbook:3142
+#, no-c-format
+msgid ""
+"Used to indicate more minor or local changes in tempo. Shown above the staff "
+"in a small bold roman type by default."
+msgstr ""
+"Används för att ange mindre viktiga eller lokala ändringar av tempo. "
+"Visas normalt ovanför notsystemet med litet romerskt teckensnitt i fetstil."
+
+#. Tag: term
+#: index.docbook:3147
+#, no-c-format
+msgid "Lyric"
+msgstr "Sångtext"
+
+#. Tag: para
+#: index.docbook:3147
+#, no-c-format
+msgid ""
+"Although lyrics are usually created in the <link "
+"linkend=\"nv-text-lyrics\">lyric editor</link>, they can also be entered "
+"word by word if necessary using this style. This style is shown below the "
+"text in a small roman type by default. (Warning: if you enter lyrics this "
+"way and later edit the staff's lyrics using the lyric editor, any lyrics "
+"entered this way may be modified or moved if their positioning is not "
+"compatible with that expected by the lyric editor.)"
+msgstr ""
+"Även om sångtext oftast skapas i <link "
+"linkend=\"nv-text-lyrics\">sångtexteditorn</link>, kan de också skrivas in "
+"ord för ord om det behövs genom att använda den här stilen. Normalt "
+"visas stilen under texten med litet romerskt teckensnitt. (Varning: Om du "
+"skriver in sångtext på detta sätt och senare redigerar notsystemets "
+"sångtext med sångtexteditorn, kan all sångtext som skrivs in på detta "
+"sätt ändras eller flyttas om positionen inte stämmer med den som "
+"sångtexteditorn förväntar sig.)"
+
+#. Tag: term
+#: index.docbook:3158
+#, no-c-format
+msgid "Annotation"
+msgstr "Anteckning"
+
+#. Tag: para
+#: index.docbook:3158
+#, no-c-format
+msgid ""
+"Used for helpful text that is not strictly considered part of the score. "
+"Shown below the staff, boxed-out in a yellow sticky-label-style box by "
+"default."
+msgstr ""
+"Används för hjälptext som inte strikt anses tillhöra partituret. Visas "
+"normalt under notsystemet, i en gul ruta som liknar en klisterlapp."
+
+#. Tag: para
+#: index.docbook:3166
+#, no-c-format
+msgid ""
+"You can also edit text after creating it, by clicking on the existing text "
+"with the text tool."
+msgstr ""
+"Du kan också redigera text efter den skapats genom att klicka på den "
+"befintliga texten med textverktyget."
+
+#. Tag: title
+#: index.docbook:3170
+#, no-c-format
+msgid "Editing lyrics"
+msgstr "Redigera sångtexter"
+
+#. Tag: para
+#: index.docbook:3172
+#, no-c-format
+msgid ""
+"The Lyric editor, available from the <guimenuitem>Open Lyric "
+"Editor</guimenuitem> option of the <guimenu>View</guimenu> menu, allows you "
+"to edit all of the lyric events for a single staff at once, using a fairly "
+"rudimentary textual editing system. To use it, just activate the menu "
+"option, edit the lyric text in the resulting dialog, and then hit OK."
+msgstr ""
+"Sångtexteditorn, tillgänglig från alternativet <guimenuitem>Öppna "
+"sångtexteditor</guimenuitem> i menyn <guimenu>Visa</guimenu>, låter dig "
+"redigera alla sångtexthändelser för ett enskilt notsystem på en gång, "
+"med ett ganska grundläggande textbaserat redigeringssystem. För att "
+"använda den, välj bara menyalternativet, redigera sångtexten i "
+"dialogrutan som visas, och klicka därefter på Ok."
+
+#. Tag: para
+#: index.docbook:3179
+#, no-c-format
+msgid ""
+"The lyrics you enter should follow a particular format. Bar lines are vital "
+"to avoid the editor getting confused, and are represented with a slash "
+"(\"/\"). Within each bar the individual syllables are separated by spaces "
+"(at least one space: the editor doesn't care about any extra whitespace). "
+"Each syllable in turn will be attached to the next subsequent note or chord "
+"within that bar (although at the moment the editor can get quite confused by "
+"chords that are not exact, i.e. that require smoothing or quantizing)."
+msgstr ""
+"Sångtext som du skriver in måste följa ett visst format. Taktstreck är "
+"mycket viktiga för att undvika att editorn blir förvirrad, och "
+"representeras med ett snedstreck (\"/\"). Inom varje takt skiljs enskilda "
+"stavelser åt med mellanslag (åtminstone ett mellanslag: editorn bryr sig "
+"inte om extra blanktecken). Varje stavelse kopplas i sin tur till "
+"nästföljande not eller ackord i takten (även om editorn för närvarande "
+"kan bli riktigt förvirrad av ackord som inte är exakta, dvs. som kräver "
+"utjämning eller kvantisering)."
+
+#. Tag: para
+#: index.docbook:3190
+#, no-c-format
+msgid ""
+"If you want a note to have no syllable attached to it, you need to provide a "
+"dot (\".\") as the syllable for that note. (This is why the default lyric "
+"text for a segment is usually full of dots.) Remember to separate the dots "
+"with spaces, so that they are clearly separate syllables."
+msgstr ""
+"Om du vill att en not inte ska ha någon tillhörande stavelse, måste du "
+"använda en punkt (\".\") som stavelse för noten. (Det är därför "
+"standardtexten för ett segment oftast är full med punkter.) Kom ihåg att "
+"skilja punkterna åt med mellanslag, så att de tydligt är skilda stavelser."
+
+#. Tag: para
+#: index.docbook:3196
+#, no-c-format
+msgid ""
+"If you want more than one syllable on the same note, with a space between "
+"them, use a tilde (\"~\") instead of the space. It will be shown as a space "
+"on the score."
+msgstr ""
+"Om du vill ha mer än en stavelse för samma not, med ett mellanslag mellan "
+"dem, använd tilde (\"~\") istället för mellanslag. Det visas som ett "
+"mellanslag i partituret."
+
+#. Tag: para
+#: index.docbook:3200
+#, no-c-format
+msgid ""
+"If you want to split a syllable across two notes, with a hyphen, you need to "
+"enter a space following the hyphen so the editor knows to treat it as two "
+"syllables. (Hyphens get no special treatment within syllables.)"
+msgstr ""
+"Om du vill dela en stavelse mellan två noter med ett bindestreck, måste du "
+"skriva in ett mellanslag efter bindestrecket så att editorn vet att det ska "
+"behandlas som två stavelser. (Bindestreck hanteras inte speciellt inne i "
+"stavelser.)"
+
+#. Tag: para
+#: index.docbook:3205
+#, no-c-format
+msgid ""
+"Syllables consisting only of numbers surrounded by square brackets (like "
+"\"[29]\") will be ignored; this is the format used for the "
+"automatically-generated bar numbers shown in the editor."
+msgstr ""
+"Stavelser som bara består av siffror omgivna av hakparenteser (som "
+"\"[29]\") ignoreras. Det är formatet för automatiskt skapade taktnummer "
+"som visas i editorn."
+
+#. Tag: para
+#: index.docbook:3210
+#, no-c-format
+msgid ""
+"You should also be aware that the textual format of lyrics is only used for "
+"editing: the lyrics are actually stored as distinct text events (one per "
+"syllable). This means that the text format may potentially change in the "
+"future to accommodate more advanced editing capabilities, although the event "
+"format should not change and so your saved files should continue to be "
+"compatible."
+msgstr ""
+"Du bör också vara medveten om att textformatet för sångtext bara "
+"används för redigering: sångtexten lagras i själva verket som distinkta "
+"texthändelser (en per stavelse). Det betyder att textformatet potentiellt "
+"kan ändras i framtiden för att hantera mer avancerade "
+"redigeringsmöjligheter, även om händelseformatet inte bör ändras och "
+"sparade filer bör fortsätta att fungera."
+
+#. Tag: title
+#: index.docbook:3225
+#, no-c-format
+msgid "Slurs and hairpins"
+msgstr "Legatobågar och klykor"
+
+#. Tag: para
+#: index.docbook:3227
+#, no-c-format
+msgid ""
+"Slur and hairpin dynamic markings are stored as events, just like notes or "
+"rests. To create one, select the area you want it to cover (a series of "
+"notes or whatever), and then use the <guimenuitem>Add Slur</guimenuitem>, "
+"<guimenuitem>Add Crescendo</guimenuitem> or <guimenuitem>Add "
+"Decrescendo</guimenuitem> options from the <guimenu>Group</guimenu> menu."
+msgstr ""
+"Dynamikmarkeringarna legatobågar och klykor lagras som händelser, precis som "
+"noter eller pauser. För att skapa en, markera området du vill täcka (en "
+"följd av noter eller något annat), och använd därefter alternativen "
+"<guimenuitem>Lägg till legatobåge</guimenuitem>, <guimenuitem>Lägg till "
+"crescendo</guimenuitem> eller <guimenuitem>Lägg till "
+"diminuendo</guimenuitem> i menyn <guimenu>Grupp</guimenu>."
+
+#. Tag: para
+#: index.docbook:3235
+#, no-c-format
+msgid ""
+"You remove a slur or hairpin in the same way as any other event: either "
+"select it with the selection tool and then hit <keycap>Delete</keycap>, or "
+"click on it with the erase tool active."
+msgstr ""
+"Du kan ta bort en legatobåge eller klyka på samma sätt som alla andra "
+"händelser: Markera den antingen med markeringsverktyget och tryck därefter "
+"på <keycap>Delete</keycap>, eller klicka på den med borttagningsverktyget "
+"aktivt."
+
+#. Tag: title
+#: index.docbook:3244
+#, no-c-format
+msgid "Note stems and slashes"
+msgstr "Notskaft och tvärbalkar"
+
+#. Tag: para
+#: index.docbook:3246
+#, no-c-format
+msgid ""
+"You can set the stem direction of any selected notes (provided they are a "
+"sort that have stems) using the three Stem Direction options on the Notes "
+"menu. The options allow you to either fix the stems up or down, or revert to "
+"the stem direction that &rosegarden; would otherwise have chosen. See also "
+"<link linkend=\"nv-beamed-groups\">Beams</link>."
+msgstr ""
+"Du kan ställa in skaftriktningen på alla markerade noter (under "
+"förutsättning att de är av en sort som har skaft) med de tre "
+"skaftriktningsalternativen i menyn Noter. Alternativen låter dig antingen "
+"låsa skaften uppåt eller neråt, eller återgå till skaftriktningen som "
+"&rosegarden; annars skulle ha valt. Se också <link "
+"linkend=\"nv-beamed-groups\">Balkar</link>."
+
+#. Tag: para
+#: index.docbook:3253
+#, no-c-format
+msgid ""
+"The <guimenu>Notes</guimenu> menu also contains options for adding slashes "
+"across note stems, for example to indicate short repeated notes or drum "
+"rolls. These are currently purely notational; &rosegarden; will not take "
+"them into account when playing the staff or generating &MIDI;."
+msgstr ""
+"Menyn <guimenu>Noter</guimenu> innehåller också alternativ för att lägga "
+"till tvärbalkar på notskaft, för att till exempel ange korta upprepade "
+"noter eller trumvirvlar. De är för närvarande bara notation. &rosegarden; "
+"tar inte hänsyn till dem när notsystemet spelas upp eller när &MIDI; "
+"skapas."
+
+#. Tag: title
+#: index.docbook:3263
+#, no-c-format
+msgid "Beams"
+msgstr "Balkar"
+
+#. Tag: para
+#: index.docbook:3265
+#, no-c-format
+msgid ""
+"Adding beams to notes is considered a grouping operation in the &rosegarden; "
+"Notation editor, available on the <guimenu>Group</guimenu> menu. Select the "
+"notes you want to beam, and use the Beam <guimenu>Group</guimenu> menu "
+"option. To remove a beam, select the notes and use the "
+"<guimenuitem>Unbeam</guimenuitem> menu option."
+msgstr ""
+"Att lägga till balkar till noter anses som en grupperingsåtgärd i "
+"&rosegarden;s notbehandlare, tillgänglig i menyn "
+"<guimenu>Grupp</guimenu>. Markera noterna du vill lägga till en balk för, "
+"och använd menyalternativet Balkar i menyn <guimenu>Grupp</guimenu>. För "
+"att ta bort en balk, markera noterna och använd menyalternativet "
+"<guimenuitem>Ta bort balkar</guimenuitem>."
+
+#. Tag: para
+#: index.docbook:3271
+#, no-c-format
+msgid ""
+"It is possible to have more than one beamed group happening at the same time "
+"&mdash; you just select and beam the separate groups one at a time &mdash; "
+"but Rosegarden is usually not yet clever enough to work out which notes "
+"should have stems up and which should have stems down for simultaneous "
+"beamed groups, so you will probably have to set the stem directions of the "
+"notes in the groups explicitly as well as beaming them."
+msgstr ""
+"Det är möjligt att ha mer än en balkgrupp som inträffar samtidigt. Du "
+"markerar och lägger bara till balkar för enskilda grupper en åt gången. "
+"Oftast är Rosegarden inte ännu smart nog för att räkna ut vilka noter "
+"som bör ha skaften uppåt och vilka som bör ha skaften neråt för grupper "
+"som samtidigt ges balkar, alltså behöver du troligen explicit ange "
+"skaftriktningar för noter i grupperna samt ge dem balkar."
+
+#. Tag: para
+#: index.docbook:3279
+#, no-c-format
+msgid ""
+"&rosegarden; can attempt to guess a sensible beaming for a piece of music, "
+"provided it's not too complicated. To invoke this, select the notes you want "
+"to calculate the beaming for (for example by triple-clicking to select a "
+"whole staff) and then use the <guimenuitem>Auto-Beam</guimenuitem> option on "
+"the <guimenu>Group menu</guimenu>. Auto-beaming is also done automatically "
+"when loading a &MIDI; file, for example, and the editor also does some "
+"automatic beaming as you enter notes (this can be disabled by changing the "
+"\"Auto-Beam when appropriate\" setting on the configuration dialog or the "
+"insertion tool's right-button menu)."
+msgstr ""
+"&rosegarden; kan försöka att gissa lämpliga balkar för ett musikstycke, "
+"under förutsättning att det inte är alltför komplicerat. För att göra "
+"det, markera noterna du vill beräkna balkar för (till exempel genom att "
+"trippelklicka för att markera ett helt notsystem) och därefter använda "
+"alternativet <guimenuitem>Automatiska balkar</guimenuitem> i menyn "
+"<guimenu>Grupp</guimenu>. Balkar skapas också automatiskt till exempel när "
+"en &MIDI;-fil laddas, och editorn skapar också vissa balkar automatiskt "
+"när du skriver in noter (det kan stängas av genom att ändra "
+"inställningen \"Lägg automatiskt till balkar om lämpligt\" i "
+"inställningsdialogrutan eller infogningsverktygets meny som visas med "
+"höger musknapp)."
+
+#. Tag: title
+#: index.docbook:3296
+#, no-c-format
+msgid "Triplets and other tuplets"
+msgstr "Trioler och andra annandelningar"
+
+#. Tag: para
+#: index.docbook:3298
+#, no-c-format
+msgid ""
+"A triplet group consists of three notes or chords played in the time of two. "
+"(More precisely, it consists of notes with a total duration of three "
+"arbitrary units played in the time of two of those units.)"
+msgstr ""
+"En triolgrupp består av tre toner eller ackord som spelas under samma tid "
+"som två. (Mer exakt består den av toner med ett totalt notvärde av tre "
+"godtyckliga enheter, som spelas under samma tid som två av enheterna.)"
+
+#. Tag: para
+#: index.docbook:3303
+#, no-c-format
+msgid ""
+"We use the word <quote>tuplet</quote> to describe the general situation in "
+"which notes with a total duration of any given number of units are played in "
+"the time of a different number of those units: nine notes in the time of "
+"eight, or six in the time of four, or a crotchet and a quaver in the time of "
+"a single crotchet, or even two notes in the time of three. (At present "
+"&rosegarden; does not support the last example &mdash; tuplet groups must "
+"always be played with a shorter duration than written.)"
+msgstr ""
+"Vi använder ordet <quote>annandelning</quote> för att beskriva det allmänna "
+"fallet då toner med ett totalt notvärde av ett givet antal enheter, spelas "
+"under en tid som anges av ett annat antal av enheterna: Nio toner under "
+"tiden för åtta, eller sex under tiden för fyra, eller en fjärdedelsnot "
+"och en åttondedelsnot under tiden för en enda fjärdedelsnot, eller till och "
+"med två toner under tiden för tre. (För närvarande stöder inte "
+"&rosegarden; det sista exemplet. Annandelningar måste alltid spelas med ett "
+"kortare notvärde än det skrivna.)"
+
+#. Tag: para
+#: index.docbook:3313
+#, no-c-format
+msgid ""
+"The triplet and tuplet menu functions work by taking an existing series of "
+"notes or rests and squashing them so they play quicker, filling in the "
+"left-over space at the end of the series with a final rest and drawing the "
+"whole as a tuplet group. You can therefore create a new series of triplets "
+"by entering the first two notes of the series (in their normal form), making "
+"them into triplets, and then filling in the rest left over by the triplet "
+"operation with the final note of the triplet. Or you can apply the triplet "
+"operation before you enter any notes, thus turning the original rest itself "
+"into triplet form, and then insert the notes of the triplet on top of it. "
+"Some examples may help:"
+msgstr ""
+"Menyfunktionerna för trioler och annandelningar fungerar genom att ta en "
+"befintlig följd av noter eller pauser och trycka ihop dem så att de spelas "
+"upp snabbare, och fylla i överblivet utrymme efter följden med en slutgiltig "
+"paus och rita upp det hela som en annandelning. Därför kan du skapa en ny "
+"följd av trioler genom att mata in de första två noterna i följden (med "
+"normal form), göra dem till trioler, och därefter fylla i utrymmet som "
+"blivit kvar efter triolåtgärden med den sista noten i triolen. Eller kan "
+"du utföra triolåtgärden innan du matar in några noter, och på så sätt "
+"omvandla den ursprungliga pausen till triolform, och därefter infoga "
+"triolens noter ovanpå den. Några exempel kan vara till hjälp:"
+
+#. Tag: phrase
+#: index.docbook:3337
+#, no-c-format
+msgid "&rosegarden;'s general tuplet dialog"
+msgstr "&rosegarden;s allmänna dialogruta för annandelningar"
+
+#. Tag: para
+#: index.docbook:3343
+#, no-c-format
+msgid ""
+"To specify a general tuplet group, we need to know what the base note is "
+"(for example, if we play three crotchets in the time of two then the base is "
+"a crotchet) and the ratio of the number of base notes written to the number "
+"played."
+msgstr ""
+"För att ange en allmän annandelning, måste man känna till vad grundnoten "
+"är (om man till exempel spelar tre fjärdedelsnoter under tiden för två "
+"är grundnoten en fjärdedelsnot) och förhållandet mellan antalet "
+"grundnoter som skrivs till antalet som spelas."
+
+#. Tag: title
+#: index.docbook:3357
+#, no-c-format
+msgid "Paste types"
+msgstr "Inklistringstyper"
+
+#. Tag: para
+#: index.docbook:3359
+#, no-c-format
+msgid ""
+"The meaning of <quote>cut and paste</quote> is less obvious for a music "
+"editing program than it is for something like a word processor in which the "
+"letters and words go in a simple linear order. Accordingly, &rosegarden;'s "
+"Notation editor offers several different types of Paste operation, as well "
+"as separate Cut and Cut and Close functions."
+msgstr ""
+"Betydelsen av <quote>klipp ut och klistra in</quote> är inte så uppenbar "
+"för musikredigeringsprogram som den är för något som en ordbehandlare, "
+"där bokstäverna och orden anges i en enkel linjär ordning. I enlighet med "
+"det erbjuder &rosegarden;s notbehandlare flera olika typer av "
+"inklistringsåtgärder, samt separata funktioner för Klipp ut eller Klipp "
+"ut och stäng."
+
+#. Tag: phrase
+#: index.docbook:3376
+#, no-c-format
+msgid "&rosegarden;'s paste-type dialog"
+msgstr "&rosegarden;s inklistringstypdialogruta"
+
+#. Tag: para
+#: index.docbook:3378
+#, no-c-format
+msgid "The types of Paste operation are:"
+msgstr "Typerna av inklistringsåtgärder är:"
+
+#. Tag: term
+#: index.docbook:3386
+#, no-c-format
+msgid "Restricted"
+msgstr "Begränsat"
+
+#. Tag: para
+#: index.docbook:3388
+#, no-c-format
+msgid ""
+"Requires an existing gap (containing nothing but rests) of enough duration "
+"to completely contain the clipboard's contents. The contents are pasted into "
+"the gap. If there is no gap long enough, the paste is not carried out."
+msgstr ""
+"Kräver ett befintligt gap (som inte innehåller något annat än pauser) "
+"med tillräckligt notvärde för att helt omfatta klippbordets innehåll. "
+"Innehållet klistras in i gapet. Om det inte finns ett gap som är långt "
+"nog, utförs inte inklistringen."
+
+#. Tag: para
+#: index.docbook:3394
+#, no-c-format
+msgid "This is the default paste type."
+msgstr "Det här är förvald inklistringstyp."
+
+#. Tag: term
+#: index.docbook:3401
+#, no-c-format
+msgid "Simple"
+msgstr "Enkel"
+
+#. Tag: para
+#: index.docbook:3403
+#, no-c-format
+msgid ""
+"Erases enough events to make a gap long enough to paste into, and then "
+"pastes into that. The pasted events therefore completely replace any "
+"existing ones in the time covered by the paste."
+msgstr ""
+"Raderar tillräckligt med händelser för att skapa ett gap som är långt "
+"nog att klistra in i, och klistrar därefter in i det. De inklistrade "
+"händelserna ersätter därför fullständigt alla eventuella befintliga i "
+"tiden som täcks av inklistringen."
+
+#. Tag: term
+#: index.docbook:3412
+#, no-c-format
+msgid "Open and Paste"
+msgstr "Öppna och klistra in"
+
+#. Tag: para
+#: index.docbook:3414
+#, no-c-format
+msgid ""
+"The opposite of Cut and Close. Makes room for the paste by moving all of the "
+"subsequent events further towards the end of the composition."
+msgstr ""
+"Motsatsen till Klipp ut och stäng. Gör rum för det som ska klistras in "
+"genom att flytta alla efterföljande händelser längre mot kompositionens "
+"slut."
+
+#. Tag: term
+#: index.docbook:3423
+#, no-c-format
+msgid "Note Overlay"
+msgstr "Överlagring av noter"
+
+#. Tag: para
+#: index.docbook:3425
+#, no-c-format
+msgid ""
+"Carries out a paste in the way that it would happen if you entered each of "
+"the notes in the clipboard yourself using the notation editor: if there are "
+"other notes overlapping with them, the new or existing notes will be split "
+"into ties appropriately."
+msgstr ""
+"Utför en inklistring på samma sätt som skulle ske om du skrev in var och "
+"en av noterna på klippbordet själv med notbehandlaren: Om det finns "
+"andra noter som överlappar med dem, delas nya och befintliga noter i "
+"lämpliga bindebågar."
+
+#. Tag: term
+#: index.docbook:3435
+#, no-c-format
+msgid "Matrix Overlay"
+msgstr "Matrisöverlagring"
+
+#. Tag: para
+#: index.docbook:3437
+#, no-c-format
+msgid ""
+"Carries out a paste in the way that it would happen if you entered each of "
+"the notes in the clipboard yourself using the matrix editor: the notes "
+"presently in the way of the paste will be ignored, allowing the new notes to "
+"overlap arbitrarily with them."
+msgstr ""
+"Utför en inklistring på samma sätt som skulle ske om du skrev in var och "
+"en av noterna på klippbordet själv med matriseditorn: Noterna som för "
+"närvarande är ivägen för inklistringen ignoreras, och de nya noterna "
+"får överlappa godtyckligt med dem."
+
+#. Tag: para
+#: index.docbook:3448
+#, no-c-format
+msgid ""
+"All of these take effect at the current position of the insert cursor on the "
+"current staff. To choose between the various paste types, use the Paste... "
+"menu option (with dots) on the Edit menu."
+msgstr ""
+"Alla dessa får effekt på infogningsmarkörens aktuella position i aktuellt "
+"notsystem. För att välja mellan de olika typerna av inklistring, använd "
+"menyalternativet Klistra in... (med punkter) i menyn Redigera."
+
+#. Tag: title
+#: index.docbook:3457
+#, no-c-format
+msgid "Adjusting Notation"
+msgstr "Justera notering"
+
+#. Tag: title
+#: index.docbook:3461
+#, no-c-format
+msgid "Adjusting note and rest durations"
+msgstr "Justera not- och pausvärden"
+
+#. Tag: title
+#: index.docbook:3464
+#, no-c-format
+msgid "Normalizing Rests"
+msgstr "Normalisera pauser"
+
+#. Tag: para
+#: index.docbook:3466
+#, no-c-format
+msgid ""
+"Sometimes as a result of editing or quantization operations, a piece of "
+"notation can end up with incorrect rest durations for the current time "
+"signature. You can use the <guimenuitem>Normalize Rests</guimenuitem> "
+"function to fix these. This function examines each sequence of consecutive "
+"rests found in the selection, and adjusts, splits and merges rests as "
+"necessary to ensure that the rests have theoretically correct durations and "
+"fall on the correct boundaries."
+msgstr ""
+"Ibland kan ett notavsnitt råka ut för felaktiga pausvärden för "
+"aktuell taktart, som ett resultat av redigering eller "
+"kvantiseringsåtgärder. Du kan använda funktionen <guimenuitem>Normalisera "
+"pauser</guimenuitem> för att fixa dem. Funktionen undersöker varje sekvens "
+"av pauser i en följd som hittas i markeringen och justerar, delar och "
+"lägger ihop pauser enligt vad som är nödvändigt för att försäkra att "
+"pauserna har rätt teoretiskt pausvärde och hamnar på rätt gränser."
+
+#. Tag: para
+#: index.docbook:3477
+#, no-c-format
+msgid ""
+"For example, a 4/4 bar containing a crotchet (quarter-note), then a minim "
+"(half-note) rest and a crotchet rest will be rearranged to place the "
+"crotchet rest first, as the minim rest should not cross the central beat "
+"boundary of the bar."
+msgstr ""
+"Om en 4/4-takt innehåller en fjärdedelsnot, arrangeras en halvnotspaus och "
+"en fjärdedelspaus om så att fjärdedelspausen placeras först, eftersom "
+"halvnotspausen inte ska överlappa den centrala taktgränsen i takten."
+
+#. Tag: title
+#: index.docbook:3560
+#, no-c-format
+msgid "Interpreting Performance Cues in Notation"
+msgstr "Tolka utförandeantydningar i notskrift"
+
+#. Tag: para
+#: index.docbook:3562
+#, no-c-format
+msgid ""
+"You can use the Interpret function to modify the velocities and timings of "
+"notes according to any written or indicated dynamics found. The selection of "
+"interpretations available is as follows:"
+msgstr ""
+"Du kan använda tolkningsfunktionen för att ändra ljudstyrkor och tider "
+"för toner enligt eventuell skriven eller angiven dynamik som hittas. "
+"Tillgängliga val av tolkningar är följande:"
+
+#. Tag: term
+#: index.docbook:3570
+#, no-c-format
+msgid "Apply text dynamics (p, mf, ff etc)"
+msgstr "Tillämpa dynamikbeteckningar (p, mf, ff, etc.)"
+
+#. Tag: para
+#: index.docbook:3572
+#, no-c-format
+msgid ""
+"Sets a velocity to each note based on the last piece of text of \"Dynamic\" "
+"type seen on the same staff (only texts of the form pp, p, mp, mf, f, ff, "
+"fff etc are matched)."
+msgstr ""
+"Anger en ljudstyrka för varje not baserat på senaste texten av typen "
+"\"Dynamik\" som observerats i samma notsystem (bara text på formen pp, p, "
+"mp, mf, f, ff, fff etc känns igen)."
+
+#. Tag: term
+#: index.docbook:3580
+#, no-c-format
+msgid "Apply hairpin dynamics"
+msgstr "Använd dynamikklykor"
+
+#. Tag: para
+#: index.docbook:3582
+#, no-c-format
+msgid ""
+"Makes the notes gradually increase or decrease in velocity during a "
+"crescendo or decrescendo hairpin."
+msgstr ""
+"Gör att noterna gradvis ökar eller minskar ljudstyrka under en klyka som "
+"anger crescendo eller diminuendo."
+
+#. Tag: term
+#: index.docbook:3589
+#, no-c-format
+msgid "Stress beats"
+msgstr "Betona taktslag"
+
+#. Tag: para
+#: index.docbook:3592
+#, no-c-format
+msgid ""
+"Makes notes that land on bar or beat boundaries slightly louder (greater "
+"velocity) than the surrounding notes."
+msgstr ""
+"Gör noter som hamnar på takt- eller taktslagsgränser något starkare "
+"(större ljudstyrka) än omgivande noter."
+
+#. Tag: term
+#: index.docbook:3599
+#, no-c-format
+msgid "Articulate slurs, staccato, tenuto etc"
+msgstr "Artikulationsbeteckningar"
+
+#. Tag: para
+#: index.docbook:3602
+#, no-c-format
+msgid ""
+"Shortens unslurred notes, shortens staccato notes more, and gives notes "
+"inside slurs and tenuto notes their full length."
+msgstr ""
+"Avkortar noter utan legatobågar, avkortar staccato-noter ännu mer, och ger "
+"noter inne i legatobågar och tenuto-noter sina fulla notvärden."
+
+#. Tag: title
+#: index.docbook:3616
+#, no-c-format
+msgid "Notation from performance data"
+msgstr "Notskrift från utförandedata"
+
+#. Tag: para
+#: index.docbook:3618
+#, no-c-format
+msgid ""
+"&rosegarden; is a multi-purpose program: it is a notation editor, but it is "
+"primarily a sequencer and editor for performed music. And in performance, of "
+"course, the times and durations of notes are rarely as precise as they are "
+"on a printed score."
+msgstr ""
+"&rosegarden; är ett program med flera användningsområden: Det är en "
+"notbehandlare, men det är i huvudsak en musikbehandlare och editor för "
+"utförd musik, och i utföranden är tonernas tider och notvärden "
+"naturligtvis sällan så precisa som de är i ett tryckt partitur."
+
+#. Tag: para
+#: index.docbook:3626
+#, no-c-format
+msgid ""
+"This means that it's often desirable for &rosegarden; to do a lot of tidying "
+"of the basic note times and durations when attempting to make meaningful "
+"notes to show in the notation editor. This is a kind of quantization, but a "
+"kind that requires a surprising amount of guesswork to do well. &rosegarden; "
+"includes a quantizer designed to do a slightly better job of this than the "
+"plain grid quantizer."
+msgstr ""
+"Det betyder att det ofta är önskvärt för &rosegarden; att göra en hel "
+"del uppstädning av grundläggande nottider och notvärden vid försök att "
+"skapa meningsfulla noter att visa i notbehandlaren. Det är en sorts "
+"kvantisering, men en sort som kräver en förvånansvärd mängd gissningar "
+"för att göras bra. Det ingår en kvantisering i &rosegarden; som är "
+"konstruerad för att göra ett något bättre jobb än den enkla "
+"rutnätskvantiseringen."
+
+#. Tag: para
+#: index.docbook:3636
+#, no-c-format
+msgid ""
+"Applying quantization strictly for notation is rather unimaginatively "
+"referred to as <quote>notation quantization</quote>: it only applies to the "
+"notes you see and edit in notation, and doesn't affect the notes that play, "
+"or that you edit in other views such as the matrix. This quantization is "
+"automatically applied to music imported or recorded from MIDI, although not "
+"all of its possible capabilities are enabled by default."
+msgstr ""
+"Att använda kvantisering enbart för notskrift kallas ganska fantasilöst "
+"för <quote>kvantisering</quote>: Den gäller bara noterna du ser "
+"och redigerar i notskrift, och påverkar inte tonerna som spelas, eller det "
+"du redigerar i andra vyer som matrisvyn. Kvantiseringen utförs automatiskt "
+"för musik som importeras eller spelas in från MIDI, även om inte alla "
+"dess möjliga funktioner normalt är aktiverade."
+
+#. Tag: para
+#: index.docbook:3647
+#, no-c-format
+msgid ""
+"There are two ways to see which notes have been quantized for notation. By "
+"default, each notation view contains a Raw Note Ruler (in the group of "
+"rulers above the score) showing a rectangular block for each note. This "
+"block is positioned so as to represent the time and duration of the note as "
+"performed, but with the top and bottom edges of the rectangle extended or "
+"shortened to represent the time after notation quantization. If this is too "
+"much information for you, you can alternatively choose (in the configuration "
+"dialog) to show in a green colour all note heads in the score that have had "
+"their timings altered by notation quantization."
+msgstr ""
+"Det finns två sätt att se vilka noter som har kvantiserats för notskrift. "
+"Normalt innehåller varje notvy en linjal för obehandlade noter (i "
+"gruppen med linjaler ovanför partituret) som visar ett rektangulärt block "
+"för varje not. Blocket är placerat så att det representerar tiden och "
+"notvärdet för noten som utfördes, men med rektangelns övre och nedre "
+"kant utökade eller avkortade för att representera tiden efter "
+"kvantisering. Om det är för mycket information för dig, kan du "
+"som ett alternativ välja (i inställningsdialogrutan) att visa alla "
+"nothuvuden i partituret som har ändrade tider efter kvantisering "
+"med grön färg."
+
+#. Tag: phrase
+#: index.docbook:3670
+#, no-c-format
+msgid "&rosegarden;'s notation quantize dialog"
+msgstr "&rosegarden;s kvantiseringsdialogruta"
+
+#. Tag: para
+#: index.docbook:3674
+#, no-c-format
+msgid ""
+"If the quantization &rosegarden; has used is not suitable, either for the "
+"entire score or for a selection of notes, you can choose to use a different "
+"level of quantization or none at all. To apply a different quantization to "
+"some notes, select the notes and use the Quantize... menu function (tick the "
+"box labelled <quote>Quantize for notation only</quote>). The quantization "
+"level or type used by default can be changed in the configuration dialog."
+msgstr ""
+"Om kvantiseringen &rosegarden; har använt inte är lämplig, antingen för "
+"hela partituret eller för ett antal markerade noter, kan du välja att "
+"använda en annan kvantiseringsnivå eller ingen alls. För att använda en "
+"annan kvantisering för vissa noter, markera noterna och använd "
+"menyfunktionen Kvantisera... (markera rutan som heter <quote>Kvantisera bara "
+"för notskrift</quote>). Kvantiseringsnivån som normalt används kan "
+"ändras i inställningsdialogrutan."
+
+#. Tag: title
+#: index.docbook:3686
+#, no-c-format
+msgid "Configurable parameters for the heuristic notation quantizer"
+msgstr "Inställningsbara parametrar för den heuristiska kvantiseringen"
+
+#. Tag: title
+#: index.docbook:3689
+#, no-c-format
+msgid "Parameters for quantization itself"
+msgstr "Parametrar för själva kvantiseringen"
+
+#. Tag: term
+#: index.docbook:3694
+#, no-c-format
+msgid "Complexity"
+msgstr "Komplexitet"
+
+#. Tag: para
+#: index.docbook:3696
+#, no-c-format
+msgid ""
+"The \"complexity\" of a notation quantizer is its most fundamental "
+"parameter. A \"complex\" quantizer will be more prepared to accept that "
+"complex-looking music is in fact intended to be complex, whereas a "
+"\"simple\" quantizer is more likely to assume that complex-looking music "
+"results from an imprecise performance of simple music."
+msgstr ""
+"Kvantiseringens \"komplexitet\" är dess mest grundläggande "
+"parameter. En \"komplex\" kvantisering är mer redo att acceptera att musik "
+"som ser komplex ut i själva verket är avsedd att vara komplex, medan en "
+"\"enkel\" kvantisering är mer redo att anta att musik som ser komplex ut "
+"orsakas av ett mindre precist utförande av enkel musik."
+
+#. Tag: para
+#: index.docbook:3704
+#, no-c-format
+msgid ""
+"The default setting is intended to produce reasonable results for a fairly "
+"wide range of music."
+msgstr ""
+"Standardinställningarna är avsedda att skapa rimliga resultat för ett "
+"ganska brett musikspektrum."
+
+#. Tag: para
+#: index.docbook:3713
+#, no-c-format
+msgid ""
+"The base grid unit (set to a note duration value) specifies the absolute "
+"minimum unit of note that will be permitted to remain in the score after "
+"quantization. For example, if set to a semiquaver, all notes will be placed "
+"on boundaries of a multiple of a semiquaver, with durations also a multiple "
+"of a semiquaver."
+msgstr ""
+"Den grundläggande rutnätsenheten (inställd till ett notvärde) "
+"anger den absolut minsta notenheten som tillåts bli kvar i partituret efter "
+"kvantisering. Om den till exempel är inställd till en sextondedelsnot, "
+"placeras alla noter på gränser som är en multipel av sextondedelsnoter, och "
+"notvärdena är också multiplar av sextondedelsnoter."
+
+#. Tag: para
+#: index.docbook:3721
+#, no-c-format
+msgid ""
+"The setting of the base grid unit is not quite as significant for a notation "
+"quantizer as it is for a plain grid quantizer, because all it does is impose "
+"an absolute limit on the level of precision permitted by the complexity "
+"parameter. Mostly, when you find a case in which increasing the grid unit "
+"produces better results, you've actually found a case in which the quantizer "
+"simply didn't do as good a job as it should have been able to with the "
+"smaller unit."
+msgstr ""
+"Basrutnätsenhetens Inställning är inte riktigt så viktig för "
+"kvantisering som den är för den vanliga rutnätskvantiseringen, "
+"eftersom allt den gör är att lägga en absolut gräns på precisionsnivån "
+"som tillåts av komplexitetsparametern. Oftast när du hittar ett fall där "
+"bättre resultat uppnås genom att öka rutnätsenheten, har du i själva "
+"verket hittat ett fall där kvantiseringen helt enkelt inte gjorde ett så "
+"bra jobb som den skulle ha kunnat göra med den mindre enheten."
+
+#. Tag: term
+#: index.docbook:3735
+#, no-c-format
+msgid "Tuplet level"
+msgstr "Annandelningsnivå"
+
+#. Tag: para
+#: index.docbook:3737
+#, no-c-format
+msgid ""
+"The notation quantizer is capable of identifying tuplets (triplets and other "
+"time-squashed groups), within reasonable limits. This parameter controls how "
+"ambitious it will attempt to be when looking for tuplets, by setting a limit "
+"on how many notes per tuplet group it will attempt to identify. If it is set "
+"to <quote>None</quote>, the quantizer will not attempt to identify tuplets "
+"at all."
+msgstr ""
+"Kvantiseringen klarar av att identifiera annandelningar (trioler och andra "
+"tidskomprimerade grupper), inom rimliga gränser. Parametern styr hur "
+"ambitiös den försöker vara när den letar efter annandelningar, genom att "
+"ange en gräns för hur många noter per annandelning som den försöker "
+"identifiera. Om den är inställd till <quote>Inget</quote>, försöker inte "
+"kvantiseringen identifiera annandelningar överhuvudtaget."
+
+#. Tag: title
+#: index.docbook:3754
+#, no-c-format
+msgid "Parameters that control tidying up after quantization"
+msgstr "Parametrar som styr uppstädning efter kvantisering"
+
+#. Tag: term
+#: index.docbook:3759
+#, no-c-format
+msgid "Re-beam"
+msgstr "Lägg till balkar igen"
+
+#. Tag: para
+#: index.docbook:3761
+#, no-c-format
+msgid ""
+"Causes the notes to be re-beamed into groups appropriately after "
+"quantization. This is usually desirable."
+msgstr ""
+"Gör att noterna placeras in i balkar med grupper som är passande efter "
+"kvantiseringen. Det är ofta önskvärt."
+
+#. Tag: term
+#: index.docbook:3770
+#, no-c-format
+msgid "Add articulations (staccato, tenuto, slurs)"
+msgstr "Lägg till artikulationsbeteckningar"
+
+#. Tag: para
+#: index.docbook:3773
+#, no-c-format
+msgid ""
+"Causes the quantizer to attempt to identify, based on the durations of "
+"individual and consecutive notes, which notes should be notated with "
+"staccato marks (for notes that fall significantly short of the following "
+"note, but not apparently short enough to merit a rest), tenuto (for notes "
+"that almost or just overlap the following note) and slurs (for series of "
+"notes that meet or overlap)."
+msgstr ""
+"Gör att kvantiseringen försöker identifiera vilka noter som ska markeras "
+"som staccato, baserat på notvärdet hos individuella noter och noter i följd "
+"(för noter som slutar väsentligt tidigare än den efterföljande "
+"noten, men uppenbarligen inte tidigt nog för att vara värda en paus), "
+"tenuto (för noter som nästan eller precis överlappar följande not) och "
+"legatobågar (för följder av noter som möts eller överlappar)."
+
+#. Tag: term
+#: index.docbook:3787
+#, no-c-format
+msgid "Tie notes at barlines etc"
+msgstr "Bind noter vid taktstreck etc."
+
+#. Tag: para
+#: index.docbook:3789
+#, no-c-format
+msgid ""
+"Causes any notes that are still found after quantization to overlap barlines "
+"or to have durations not exactly expressible with single note heads to be "
+"split into multiple notes appropriately, and tied. This has the same effect "
+"as applying the \"Tie Notes at Barlines\" function in the notation view."
+msgstr ""
+"Gör att alla noter som fortfarande finns kvar efter kvantisering och "
+"överlappar taktstreck eller som har notvärden som inte kan uttryckas exakt "
+"med enstaka nothuvuden att delas upp i flera noter på lämpligt sätt, och "
+"bindas. Det får samma effekt som att utföra funktionen \"Bind noter vid "
+"taktstreck\" i notvyn."
+
+#. Tag: para
+#: index.docbook:3797
+#, no-c-format
+msgid ""
+"This parameter is not set by default because it changes the number of note "
+"events, which is undesirable when using &rosegarden; partly or principally "
+"as a MIDI sequencer."
+msgstr ""
+"Den här parametern är normalt inte aktiverad, delvis på grund av att den "
+"ändrar antalet tonhändelser, vilket är olämpligt när &rosegarden; "
+"delvis eller huvudsakligen används som en MIDI-musikbehandlare."
+
+#. Tag: term
+#: index.docbook:3807
+#, no-c-format
+msgid "Split-and-tie overlapping chords"
+msgstr "Dela och bind ackordnoter med för stora notvärden"
+
+#. Tag: para
+#: index.docbook:3809
+#, no-c-format
+msgid ""
+"Causes overlapping notes to be split and tied, so as to make strict chords "
+"with individual noteheads tied as necessary. This has the same effect as "
+"applying the \"Split-and-Tie Overlapping Chords\" function in the notation "
+"view."
+msgstr ""
+"Gör att överlappande noter delas och binds, så att strikta ackord med "
+"individuella nothuvuden bundna efter behov skapas. Det får samma effekt som "
+"att utföra funktionen \"Dela och bind ackordnoter med för stora notvärden\" "
+"i notvyn."
+
+#. Tag: para
+#: index.docbook:3816
+#, no-c-format
+msgid ""
+"This parameter is not set by default partly because it changes the number of "
+"note events, which is undesirable when using &rosegarden; partly or "
+"principally as a MIDI sequencer."
+msgstr ""
+"Den här parametern är normalt inte aktiverad, delvis på grund av att den "
+"ändrar antalet tonhändelser, vilket är olämpligt när &rosegarden; "
+"delvis eller huvudsakligen används som en MIDI-musikbehandlare."
+
+#. Tag: title
+#: index.docbook:3831
+#, no-c-format
+msgid "Note styles"
+msgstr "Notstilar"
+
+#. Tag: para
+#: index.docbook:3833
+#, no-c-format
+msgid ""
+"&rosegarden; also allows you to change various aspects of the way the "
+"various types of notes are drawn, such as the choice of note heads, the "
+"number of tails, whether notes are filled or unfilled and so on."
+msgstr ""
+"&rosegarden; låter dig också ändra diverse aspekter av sättet som olika "
+"nottyper ritas upp, som val av nothuvuden, antal flaggor, om noter är "
+"ifyllda eller inte och så vidare."
+
+#. Tag: para
+#: index.docbook:3840
+#, no-c-format
+msgid ""
+"A set of standard styles (Classical, Cross, Triangle and Mensural) is "
+"provided, and you can change the style used for individual notes by "
+"selecting them and then using the Note Style menu options. Each note "
+"remembers which style has been chosen for it, and this information is saved "
+"as part of the composition. You can also change the default style for new "
+"notes using the <guimenuitem>Configure Rosegarden...</guimenuitem> option in "
+"the <guimenu>Settings</guimenu> menu."
+msgstr ""
+"En uppsättning standardstilar (Klassisk, Kors, Triangel och Mensural) "
+"tillhandahålls, och du kan ändra stilen som används för enskilda noter "
+"genom att markera dem och därefter använda alternativen i menyn Notstil. "
+"Varje not kommer ihåg vilken stil som har valts för den, och informationen "
+"sparas som en del av kompositionen. Du kan också ändra förvald stil för "
+"nya noter genom att använda alternativet <guimenuitem>Anpassa "
+"Rosegarden...</guimenuitem> i menyn <guimenu>Inställningar</guimenu>."
+
+#. Tag: para
+#: index.docbook:3852
+#, no-c-format
+msgid ""
+"It is also possible to create your own note styles by describing them in "
+"<acronym>XML</acronym> files. (Even the standard styles are defined this "
+"way: the only reason the editor knows that a Classical semiquaver has a "
+"tilted oval filled head, a stem, two flags, etc., is that the description in "
+"Classical.xml says so.) See <link "
+"linkend=\"developers-note-styles\">Customising Rosegarden</link> for more "
+"information."
+msgstr ""
+"Det är också möjligt att skapa dina egna notstilar genom att beskriva dem "
+"med <acronym>XML</acronym>-filer. (Till och med standardstilarna är "
+"definierade på detta sätt: Den enda orsaken att editorn vet om att en "
+"klassisk sextondedelsnot har ett ovalt lutande ifyllt huvud, ett skaft, två "
+"flaggor etc., är att beskrivningen i Classical.xml anger det.) Se <link "
+"linkend=\"developers-note-styles\">Anpassa Rosegarden</link> för mer "
+"information."
+
+#. Tag: title
+#: index.docbook:3865
+#, no-c-format
+msgid "Note fonts"
+msgstr "Notteckensnitt"
+
+#. Tag: para
+#: index.docbook:3866
+#, no-c-format
+msgid ""
+"&rosegarden; is supplied with a single scalable notation font, the Feta font "
+"developed by the Lilypond project. Feta is an extremely high quality font "
+"that should be suitable for nearly all classical work."
+msgstr ""
+"&rosegarden; levereras med ett enda skalbart notteckensnitt, "
+"Feta-teckensnittet utvecklat i Lilypond-projektet. Feta är ett teckensnitt "
+"med mycket hög kvalitet som bör vara lämpligt för nästan allt klassiskt "
+"arbete."
+
+#. Tag: para
+#: index.docbook:3873
+#, no-c-format
+msgid ""
+"&rosegarden; also includes support as standard for a number of other "
+"notation fonts. You will need to provide the fonts themselves in TrueType "
+"(.ttf) or PostScript Type-1 (.pfb, .pfa) format, and you will need the "
+"relevant permissions to install them to the same place as &rosegarden; was "
+"installed. To install a supported notation font, locate the share directory "
+"for the &rosegarden; installation (usually a subdirectory of the KDE desktop "
+"installation tree, such as /opt/kde/share/apps/rosegarden). You will find "
+"that this directory has a subdirectory called \"fonts\": copy the font files "
+"into there, and restart &rosegarden;. If your font is supported, it should "
+"now appear on the font menu in the notation editor."
+msgstr ""
+"&rosegarden; innehåller också stöd som standard för ett antal andra "
+"notteckensnitt. Du måste själv tillhandahålla teckensnitten på "
+"formaten Truetype (.ttf) eller Postscript Typ-1 (.pfb, .pfa), och du måste "
+"ha lämpliga rättigheter för att installera dem på samma plats som "
+"&rosegarden; installerades. För att installera ett notteckensnitt "
+"som stöds, lokalisera katalogen share för &rosegarden;s installation "
+"(oftast en underkatalog till KDE-skrivbordets installationsträd, som "
+"/opt/kde/share/apps/rosegarden). Du märker att katalogen har en "
+"underkatalog som heter \"fonts\". Kopiera teckensnittsfilerna till den, och "
+"starta om &rosegarden;. Om teckensnittet stöds, ska det nu synas i "
+"teckensnittsmenyn i notbehandlaren."
+
+#. Tag: para
+#: index.docbook:3887
+#, no-c-format
+msgid ""
+"Complete or partial support is currently provided for the following fonts: "
+"Fughetta, by Blake Hodgetts; Petrucci, the \"original\" Finale font; "
+"Maestro, the \"new\" Finale font; Opus, the Sibelius font; Inkpen, the "
+"Sibelius jazz font; Sonata from Adobe; Steinberg, from the Cubase sequencer; "
+"and Xinfonia. (Most of the above font names are registered trademarks of the "
+"respective companies.) THE ROSEGARDEN TEAM MAKES NO REPRESENTATION AS TO THE "
+"LEGAL STATUS OF ANY USE OF THESE FONTS WITH ROSEGARDEN. It is your "
+"responsibility to ensure you are in compliance with the licence (if any) "
+"under which a font was provided to you, before attempting to use it. If you "
+"are not sure whether you have the right to use a font, don't: apart from "
+"anything else, the standard Feta font is better than most of these anyway."
+msgstr ""
+"Fullständigt eller delvis stöd tillhandahålls för närvarande för "
+"följande teckensnitt: Fughetta, av Blake Hodgetts; Petrucci, det "
+"\"ursprungliga\" Finale-teckensnittet; Maestro, det \"nya\" "
+"Finale-teckensnittet; Opus, Sibelius teckensnitt; Inkpen, Sibelius jazz-"
+"teckensnitt; Sonata från Adobe; Steinberg, från Cubase-musikbehandlaren; "
+"och Xinfonia. (De flesta av ovanstående teckensnittsnamn är registrerade "
+"varumärken av respektive företag.) ROSEGARDEN-GRUPPEN GER INGA "
+"UTFÄSTELSER ANGÅENDE JURIDISK STATUS FÖR ANVÄNDNING AV NÅGOT AV DESSA "
+"TECKENSNITT MED ROSEGARDEN. Det är ditt ansvar att försäkra dig om att du "
+"följer den licens (om det finns någon) som du erhöll teckensnittet med, "
+"innan du försöker använda det. Om du inte är säker på att du har "
+"rättighet att använda ett teckensnitt, gör då inte det. Förutom alla "
+"andra aspekter, så är det vanliga Feta-teckensnittet ändå bättre än de "
+"flesta av dem."
+
+#. Tag: para
+#: index.docbook:3902
+#, no-c-format
+msgid ""
+"It is also possible to provide new mapping files so as to use new fonts. For "
+"some fonts that have similar mappings or metrics to fonts in the above list, "
+"this may be as simple as editing the name of the font in the mapping file. "
+"See <link linkend=\"developers-note-fonts\">Customising Rosegarden</link> "
+"for more information."
+msgstr ""
+"Det är också möjligt att tillhandahålla nya avbildningsfiler för att "
+"använda nya teckensnitt. För vissa teckensnitt som har liknande "
+"avbildningar eller mått som teckensnitt i listan ovan, kan det vara så "
+"enkelt som att redigera teckensnittets namn i avbildningsfilen. Se <link "
+"linkend=\"developers-note-fonts\">Anpassa Rosegarden</link> för mer "
+"information."
+
+#. Tag: title
+#: index.docbook:3916
+#, no-c-format
+msgid "The Event List editor"
+msgstr "Händelselisteditorn"
+
+#. Tag: para
+#: index.docbook:3920
+#, no-c-format
+msgid ""
+"The &rosegarden; Event List editor shows the events in a single segment in a "
+"raw form, and enables you to edit the precise properties of those events "
+"individually."
+msgstr ""
+"&rosegarden;s editor för händelselistan visar händelserna i ett enstaka "
+"segment i obehandlad form, och gör det möjligt att redigera de exakta "
+"egenskaperna för händelserna individuellt."
+
+#. Tag: phrase
+#: index.docbook:3932
+#, no-c-format
+msgid "&rosegarden;'s event list editor"
+msgstr "&rosegarden;s händelselisteditor"
+
+#. Tag: title
+#: index.docbook:5702
+#, no-c-format
+msgid "Customising Rosegarden"
+msgstr "Anpassa Rosegarden"
+
+#. Tag: title
+#: index.docbook:5705
+#, no-c-format
+msgid "Configuring custom notation fonts"
+msgstr "Anpassa egna notteckensnitt"
+
+#. Tag: para
+#: index.docbook:5707
+#, no-c-format
+msgid ""
+"If you have a notation font installed on your system in a scalable format "
+"(TrueType or Type-1) but it is not currently supported by Rosegarden, you "
+"can create your own mapping XML file to describe the font's character map "
+"and metrics in a way Rosegarden can use. These files are installed in the "
+"fonts/mappings subdirectory of the Rosegarden installation directory, and a "
+"number of samples are included with the distribution."
+msgstr ""
+"Om du har ett notteckensnitt installerat på systemet med ett "
+"skalbart format (Truetype eller Typ-1) men den för närvarande inte stöds "
+"av Rosegarden, kan du skapa din egen XML-avbildningsfil för att beskriva "
+"teckensnittets teckenavbildning och mått på ett sätt som Rosegarden kan "
+"använda. Filerna installeras i underkatalogen fonts/mappings i Rosegardens "
+"installationskatalog, och ett antal exempel ingår i distributionen."
+
+#. Tag: para
+#: index.docbook:5716
+#, no-c-format
+msgid ""
+"You can also use these mapping files to define new pixmap-based fonts, in "
+"which every shape in a particular size is loaded from a separate pixmap "
+"file. The two standard notation fonts supplied with Rosegarden-4 are pixmap "
+"fonts defined in exactly this way."
+msgstr ""
+"Du kan också använda avbildningsfilerna för att definiera nya teckensnitt "
+"baserade på punktavbildning, där varje form av en viss storlek laddas "
+"från en separat punktavbildningsfil. De två standardteckensnitten för "
+"notskrift som levereras med Rosegarden-4 är punktavbildade teckensnitt som "
+"definierats exakt på detta sätt."
+
+#. Tag: para
+#: index.docbook:5723
+#, no-c-format
+msgid ""
+"It is even possible to define a notation font as using one or more scalable "
+"system fonts, augmented with pixmaps for particular sizes or for characters "
+"not found in the scalable fonts. This is because most of the mapping file "
+"format is the same for scalable and pixmap fonts, and where there are "
+"different elements for the different sorts of fonts, it is usually possible "
+"to include both of them. Rosegarden will usually use pixmaps where available "
+"and scalable fonts otherwise."
+msgstr ""
+"Det är till och med möjligt att definiera ett notteckensnitt att "
+"använda en eller flera skalbara systemteckensnitt, förbättrade med "
+"punktavbildningar för vissa storlekar eller för tecken som inte finns i de "
+"skalbara teckensnitten. Det går eftersom det mesta av avbildningsfilernas "
+"format är samma för skalbara och punktavbildade teckensnitt, och när det "
+"finns olika element för olika sorters teckensnitt är det oftast möjligt "
+"att inkludera båda. Rosegarden använder oftast punktavbildningar om de är "
+"tillgängliga, och annars skalbara teckensnitt."
+
+#. Tag: para
+#: index.docbook:5734
+#, no-c-format
+msgid ""
+"You may also wish to edit the mapping files supplied with Rosegarden if you "
+"find their measurements for alignment or sizing are not to your liking. (If "
+"you believe that any of the supplied files are actually wrong, please let us "
+"know.)"
+msgstr ""
+"Du kanske också vill redigera avbildningsfilerna som levereras med "
+"Rosegarden om du tycker att deras mått för justering eller storlek inte "
+"passar dig. (Om du tycker att någon av filerna som levereras är felaktig "
+"på något sätt, tala gärna om det för oss.)"
+
+#. Tag: title
+#: index.docbook:5741
+#, no-c-format
+msgid "Codes and Glyphs"
+msgstr "Koder och glyfer"
+
+#. Tag: title
+#: index.docbook:5747
+#, no-c-format
+msgid "Notation font mapping XML format"
+msgstr "XML-format för avbildning av notteckensnitt"
+
+#. Tag: para
+#: index.docbook:5749
+#, no-c-format
+msgid ""
+"Here is a summary of the XML elements that may be used in the font mapping "
+"file."
+msgstr ""
+"Här är en översikt över XML-elementen som kan användas i en "
+"teckensnittsavbildningsfil."
+
+#. Tag: title
+#: index.docbook:5753
+#, no-c-format
+msgid "rosegarden-font-encoding"
+msgstr "rosegarden-font-encoding"
+
+#. Tag: para
+#: index.docbook:5755
+#, no-c-format
+msgid ""
+"This element must exist in every mapping file, and should contain all the "
+"other elements. The only attribute is \"name\", which contains the font's "
+"name as shown in the font selection dropdown. Although the file format will "
+"permit any name to be used here, Rosegarden will only pick up the font "
+"corectly if the XML file has the same name as the contents of this attribute "
+"(except that the XML file should be named in lower-case and should end in "
+"\".xml\")."
+msgstr ""
+"Elementet måste finnas i varje avbildningsfil, och ska innehålla alla "
+"övriga element. Det enda attributet är \"name\" som innehåller "
+"teckensnittets namn som visas i kombinationsrutan för teckensnittsval. "
+"Även om filformatet tillåter att vilket namn som helst används här, "
+"hittar Rosegarden bara teckensnittet på ett riktigt sätt om XML-filen har "
+"samma namn som det här attributets innehåll (utom att XML-filen ska "
+"namnges med små bokstäver och ska sluta med \".xml\")."
+
+#. Tag: title
+#: index.docbook:5767
+#, no-c-format
+msgid "font-information"
+msgstr "font-information"
+
+#. Tag: para
+#: index.docbook:5769
+#, no-c-format
+msgid ""
+"This should normally be the first child element of "
+"\"rosegarden-font-encoding\". It may have any of the following attributes, "
+"all of which are optional:"
+msgstr ""
+"Det här ska normalt vara första delelement i \"rosegarden-font-encoding\". "
+"Det kan ha vilket som helst av följande attribut, som alla är valfria:"
+
+#. Tag: term
+#: index.docbook:5775
+#, no-c-format
+msgid "origin"
+msgstr "origin"
+
+#. Tag: para
+#: index.docbook:5777
+#, no-c-format
+msgid ""
+"A textual description of the likely origin of the mapped font (not the "
+"origin of the mapping file)."
+msgstr ""
+"En textbeskrivning av det avbildade teckensnittets troliga ursprung (inte "
+"ursprunget för avbildningsfilen)."
+
+#. Tag: term
+#: index.docbook:5784
+#, no-c-format
+msgid "copyright"
+msgstr "copyright"
+
+#. Tag: para
+#: index.docbook:5786
+#, no-c-format
+msgid ""
+"A textual description of the likely copyright status of the mapped font (not "
+"the copyright status of the mapping file). Note that because the mapping "
+"file contains information such as origin and copyright of the font itself, "
+"it is usually advisable to make separate mapping files for separate fonts "
+"where practical, even if the fonts share other mapping data."
+msgstr ""
+"En textbaserad beskrivning av trolig copyright-status för det avbildade "
+"teckensnittet (inte copyright-status för avbildningsfilen). Observera att "
+"eftersom avbildningsfilen innehåller information som ursprung och copyright "
+"för själva teckensnittet, är det oftast lämpligt att göra separata "
+"avbildningsfiler för separata teckensnitt när det är praktiskt, även om "
+"teckensnitten delar annan avbildningsdata."
+
+#. Tag: term
+#: index.docbook:5798
+#, no-c-format
+msgid "mapped-by"
+msgstr "mapped-by"
+
+#. Tag: para
+#: index.docbook:5800
+#, no-c-format
+msgid "The name of the creator of the mapping file (i.e. you, presumably)."
+msgstr "Namnet på skaparen av avbildningsfilen (dvs. antagligen du själv)."
+
+#. Tag: term
+#: index.docbook:5806 index.docbook:6264
+#, no-c-format
+msgid "type"
+msgstr "type"
+
+#. Tag: para
+#: index.docbook:5808
+#, no-c-format
+msgid ""
+"The type of the font. This attribute should contain one of the values "
+"\"pixmap\" or \"scalable\". Fonts that are loaded into the windowing system "
+"and are available to Rosegarden as standard system fonts have type "
+"\"scalable\"; fonts that need to be loaded from pixmap files corresponding "
+"to individual sizes of pixmap (such as the feta and rg21 fonts included with "
+"Rosegarden) have type \"pixmap\"."
+msgstr ""
+"Teckensnittets typ. Attributet ska innehålla ett av värdena \"pixmap\" "
+"eller \"scalable\". Teckensnitt som laddas i fönsterhanteringssystemet och "
+"är tillgängliga för Rosegarden som vanliga systemteckensnitt har typen "
+"\"scalable\". Teckensnitt som måste laddas från punktavbildningsfiler som "
+"motsvarar individuella storlekar på punktavbildningar (som teckensnitten "
+"feta och rg21 som ingår i Rosegarden) har typen \"pixmap\"."
+
+#. Tag: para
+#: index.docbook:5817
+#, no-c-format
+msgid ""
+"This information is only intended for the user reference; it isn't actually "
+"used by Rosegarden. It is legitimate in practice for a font to be a mixture "
+"of the two, but in general we will assume in this documentation that a font "
+"is either scalable or pixmap."
+msgstr ""
+"Den här informationen är bara avsett som referens för användaren. Den "
+"används i själva verket inte av Rosegarden. I praktiken är det legitimt "
+"att ett teckensnitt är en blandning av de två, men i allmänhet antar vi i "
+"den här dokumentationen att teckensnittet antingen är skalbart eller "
+"punktavbildat."
+
+#. Tag: term
+#: index.docbook:5826
+#, no-c-format
+msgid "smooth"
+msgstr "smooth"
+
+#. Tag: para
+#: index.docbook:5828
+#, no-c-format
+msgid ""
+"A boolean attribute indicating whether the font is antialiased (smooth) or "
+"not. Should have the value \"true\" or \"false\". If the font is smooth, "
+"other display elements such as beams and slurs that are not generated from "
+"the font will also be antialiased."
+msgstr ""
+"Ett Booleanskt attribut som anger om teckensnittet är kantutjämnat eller "
+"inte. Ska ha värdet \"true\" eller \"false\". Om teckensnittet är "
+"utjämnat, kommer andra element som balkar och legatobågar som inte skapas "
+"från teckensnittet att vara kantutjämnade."
+
+#. Tag: term
+#: index.docbook:5838
+#, no-c-format
+msgid "autocrop"
+msgstr "autocrop"
+
+#. Tag: para
+#: index.docbook:5840
+#, no-c-format
+msgid ""
+"Only relevant for scalable (system) fonts. Rosegarden usually expects the "
+"metrics for a font to contain the vertically smallest bounding boxes for "
+"elements such as note heads and accents, rather than including empty space "
+"above or below these elements for alignment purposes. Most fonts do not do "
+"what Rosegarden expects. Therefore for these fonts you should set the "
+"autocrop attribute to \"true\"; then Rosegarden will crop any unnecessary "
+"space from the top and bottom of these elements when rendering them."
+msgstr ""
+"Bara relevant för skalbara (system) teckensnitt. Rosegarden förväntar sig "
+"oftast att ett teckensnitts mått innehåller de vertikala minsta omgivande "
+"rutor för element som nothuvuden och accenter, istället för att omfatta "
+"tomt utrymme ovanför eller under elementen av justeringssyfte. De flesta "
+"teckensnitt gör inte vad Rosegarden förväntar sig. Därför ska du "
+"ställa in attributet för automatisk beskärning till \"true\". Då beskär "
+"Rosegarden allt onödigt tomt utrymme längst upp och längst ner i "
+"elementen när de ritas upp."
+
+#. Tag: title
+#: index.docbook:5860
+#, no-c-format
+msgid "font-requirements"
+msgstr "font-requirements"
+
+#. Tag: para
+#: index.docbook:5861
+#, no-c-format
+msgid ""
+"This element is only relevant for scalable fonts. It is used to specify that "
+"this font should only be offered if certain system fonts are available, as "
+"well as to associate IDs with those system fonts to refer to in the <link "
+"linkend=\"developers-note-fonts-mapping-format-font-symbol-map\">font-symbol-"
+"map</link> element. This scheme is used to decide which notation fonts "
+"should be offered to the user, and also allows you to compose a Rosegarden "
+"notation font from more than one system font if desired."
+msgstr ""
+"Det här elementet är bara relevant för skalbara teckensnitt. Det används "
+"för att ange att teckensnittet bara ska erbjudas om vissa systemteckensnitt "
+"är tillgängliga, samt att koppla identifikationsvärden med "
+"systemteckensnitten att kunna hänvisa till i elementet <link "
+"linkend=\"developers-note-fonts-mapping-format-font-symbol-map\">font-symbol-"
+"map</link>. Den här metoden används för att bestämma vilka "
+"notteckensnitt som användaren ska erbjudas, och dessutom låta dig "
+"komponera ett notteckensnitt i Rosegarden från mer än ett "
+"systemteckensnitt om du önskar."
+
+#. Tag: para
+#: index.docbook:5873
+#, no-c-format
+msgid ""
+"The \"font-requirements\" element should contain a list of "
+"\"font-requirement\" child elements. Each of these has two attributes: "
+"\"font-id\", containing a numerical ID of your choice for reference "
+"elsewhere in the file, and either a \"name\" or a \"names\" attribute. If "
+"\"name\" is provided, it will be used as the name of a single system font to "
+"be associated with the font id; if \"names\" is provided, it will be treated "
+"as a comma-separated list of system fonts and the first one found will be "
+"associated with the font id."
+msgstr ""
+"Elementet \"font-requirements\" ska innehålla en lista med delelementen "
+"\"font-requirement\". Vart och ett av dessa har två attribut: \"font-id\" "
+"som innehåller en numerisk identifikation av ditt val för referenser på "
+"andra ställe in filen, och antingen attributet \"name\" eller \"names\". Om "
+"\"name\" tillhandahålls, används det som namnet på ett enstaka "
+"systemteckensnitt som ska höra ihop med teckensnittsidentifikationen. Om "
+"\"names\" tillhandahålls behandlas det som en lista av systemteckensnitt "
+"åtskilda med kommatecken, där det första som hittas kopplas ihop med "
+"teckensnittsidentifikationen."
+
+#. Tag: title
+#: index.docbook:5886
+#, no-c-format
+msgid "font-sizes"
+msgstr "font-sizes"
+
+#. Tag: para
+#: index.docbook:5888
+#, no-c-format
+msgid ""
+"The \"font-sizes\" element specifies which notation font sizes are "
+"available, and how the nominal font size relates to the dimensions of "
+"non-font elements such as stems, staff lines and beams. The \"size\" of a "
+"notation font is assumed to be the distance in pixels between staff lines, "
+"or more precisely, the height of a conventional note head that completely "
+"fills the space between lines: the size therefore does not include the "
+"thickness of either of the neighbouring staff lines."
+msgstr ""
+"Elementet \"font-sizes\" anger vilka storlekar av notteckensnitt som "
+"är tillgängliga, och hur den nominella teckenstorleken förhåller sig "
+"till storleken på element som inte ingår i teckensnittet, såsom skaft, "
+"notsystemlinjer och balkar. Ett notteckensnitts \"storlek\" antas "
+"vara avståndet i bildpunkter mellan notsystemlinjer, eller exaktare, "
+"platsen för ett vanligt nothuvud som fullständigt fyller avståndet mellan "
+"linjer: Storleken omfattar därför inte tjockleken hos någon av "
+"intilliggande notlinjer."
+
+#. Tag: para
+#: index.docbook:5899
+#, no-c-format
+msgid ""
+"There are two possible child elements of \"font-sizes\": \"font-scale\" and "
+"\"font-size\". Their use depends on the type of font being described."
+msgstr ""
+"Det finns två möjliga delelement till \"font-sizes\": \"font-scale\" och "
+"\"font-size\". Deras användning beror på typ av teckensnitt som beskrivs."
+
+#. Tag: para
+#: index.docbook:5905
+#, no-c-format
+msgid ""
+"For pixmap (non-scalable) fonts, the \"font-sizes\" element should contain a "
+"list of \"font-size\" elements, one for each size of pixmaps available. The "
+"pixmaps themselves must be installed in the "
+"fonts/&lt;font-name&gt;/&lt;font-size&gt; subdirectory of the Rosegarden "
+"installation directory, where &lt;font-name&gt; is the name of the font (as "
+"specified in the \"rosegarden-font-encoding\" element at the start of the "
+"mapping file), or a lower-case version of the name, and &lt;font-size&gt; is "
+"the pixel size of the font. A font size will only be made available to the "
+"user if it has an entry in the \"font-sizes\" list and the pixmap directory "
+"is found."
+msgstr ""
+"För punktavbildade (inte skalbara) teckensnitt, ska elementet "
+"\"font-sizes\" innehålla en lista med element \"font-size\", ett för varje "
+"storlek av punktavbilder som är tillgängliga. Punktavbilderna själva "
+"måste vara installerade i underkatalogen "
+"fonts/&lt;font-name&gt;/&lt;font-size&gt; i Rosegardens "
+"installationskatalog, där &lt;font-name&gt; är teckensnittets namn (som "
+"det anges i elementet \"rosegarden-font-encoding\" i avbildningsfilens "
+"början), eller en version av namnet med små bokstäver, och "
+"&lt;font-size&gt; är teckensnittets bildpunktsstorlek. En teckenstorlek "
+"görs bara tillgänglig för användaren om den har en post i listan "
+"\"font-sizes\" och punktavbildningskatalogen hittas."
+
+#. Tag: para
+#: index.docbook:5921
+#, no-c-format
+msgid ""
+"For scalable fonts, the \"font-sizes\" element should contain one "
+"\"font-scale\" element that defines the relationships between font and "
+"non-font elements in a general way, and also defines the relationship "
+"between Rosegarden's nominal font size and the size of the corresponding "
+"system font. If this \"font-scale\" element is found, then Rosegarden will "
+"assume the font is available in any size. You can however still include one "
+"or more \"font-size\" elements to define precise proportions for any "
+"particular size for which the general proportions do not quite work "
+"correctly, for example because of rounding error."
+msgstr ""
+"För skalbara teckensnitt ska elementet \"font-sizes\" innehålla ett "
+"element \"font-scale\" som definierar förhållandet mellan teckensnitt och "
+"element som inte hör till teckensnittet på ett allmänt sätt, och också "
+"definierar förhållandet mellan Rosegardens nominella teckenstorlek och "
+"motsvarande systemteckensnitts storlek. Om elementet \"font-scale\" hittas, "
+"antar Rosegarden att teckensnittet är tillgängligt i alla storlekar. Du "
+"kan dock fortfarande inkludera ett eller flera element \"font-size\" för "
+"att definiera exakta proportioner för en särskild storlek där de "
+"allmänna proportionerna inte riktigt fungerar rätt, till exempel på grund "
+"av avrundningsfel."
+
+#. Tag: para
+#: index.docbook:5936
+#, no-c-format
+msgid ""
+"The attributes of \"font-scale\" and \"font-size\" are very similar. The "
+"main difference is that all attributes of \"font-scale\" are floating-point "
+"values relative to the font size, where 1.0 is the base font size (i.e. the "
+"distance between staff lines), whereas attributes of \"font-size\" are "
+"integer pixel values. The attributes available are as follows. (Those marked "
+"\"optional\" have vaguely sensible defaults, so it's a good idea to try not "
+"setting them first.)"
+msgstr ""
+"Attributen till \"font-scale\" och \"font-size\" är mycket lika. Den "
+"huvudsakliga skillnaden är att alla attribut till \"font-scale\" är "
+"flyttal i förhållande till teckenstorleken, där 1,0 är basstorleken "
+"(dvs. avståndet mellan linjer i notsystemet), medan attributen till "
+"\"font-size\" är heltalsvärden av bildpunkter. Tillgängliga attribut är "
+"de följande. (De som är markerade som \"valfria\" har i viss mån rimliga "
+"standardvärden, så det är en god idé att inte ange dem först.)"
+
+#. Tag: term
+#: index.docbook:5951
+#, no-c-format
+msgid "note-height"
+msgstr "note-height"
+
+#. Tag: para
+#: index.docbook:5953
+#, no-c-format
+msgid ""
+"This attribute is only available for the \"font-size\" element, and it is "
+"mandatory in that element. It defines the base size of font to which the "
+"other attributes in this element apply, and a size that will be offered to "
+"the user and used when looking up pixmaps for this font."
+msgstr ""
+"Det här attributet är bara tillgängligt för elementet \"font-size\", och "
+"krävs för elementet. Det definierar teckensnittets grundstorlek som andra "
+"attribut i elementet gäller, och en storlek som erbjuds användaren och "
+"används vid uppslagning av punktavbildningar för teckensnittet."
+
+#. Tag: term
+#: index.docbook:5963
+#, no-c-format
+msgid "font-height"
+msgstr "font-height"
+
+#. Tag: para
+#: index.docbook:5965
+#, no-c-format
+msgid ""
+"May be used in either \"font-size\" or \"font-scale\". This is only relevant "
+"for scalable fonts, but is mandatory for them if used in the \"font-scale\" "
+"element. This defines the size of the system font used to draw a given size "
+"of notation font."
+msgstr ""
+"Kan antingen användas i \"font-size\" eller \"font-scale\". Det är bara "
+"tillämpligt för skalbara teckensnitt, men krävs för dem om det används "
+"i elementet \"font-scale\". Det anger storleken på systemteckensnittet som "
+"används för att rita en given storlek av notteckensnittet."
+
+#. Tag: term
+#: index.docbook:5974
+#, no-c-format
+msgid "beam-thickness"
+msgstr "beam-thickness"
+
+#. Tag: para
+#: index.docbook:5976
+#, no-c-format
+msgid "Optional. Defines the thickness of a beam."
+msgstr "Valfritt. Anger tjockleken på en balk."
+
+#. Tag: term
+#: index.docbook:5981
+#, no-c-format
+msgid "staff-line-thickness"
+msgstr "staff-line-thickness"
+
+#. Tag: para
+#: index.docbook:5983
+#, no-c-format
+msgid "Optional. Defines the thickness of a staff line."
+msgstr "Valfritt. Anger tjockleken på en notsystemslinje."
+
+#. Tag: term
+#: index.docbook:5988
+#, no-c-format
+msgid "stem-thickness"
+msgstr "stem-thickness"
+
+#. Tag: para
+#: index.docbook:5990
+#, no-c-format
+msgid "Optional. Defines the thickness of a note stem."
+msgstr "Valfritt. Anger tjockleken på ett notskaft."
+
+#. Tag: term
+#: index.docbook:5995
+#, no-c-format
+msgid "flag-spacing"
+msgstr "flag-spacing"
+
+#. Tag: para
+#: index.docbook:5997
+#, no-c-format
+msgid ""
+"Optional. Defines the gap between note flags in cases where multiple flags "
+"are drawn by drawing a single flag several times."
+msgstr ""
+"Valfritt. Anger avståndet mellan notflaggor i de fall då flera flaggor "
+"ritas genom att upprepa en enstaka flagga flera gånger."
+
+#. Tag: term
+#: index.docbook:6004
+#, no-c-format
+msgid "border-x"
+msgstr "border-x"
+
+#. Tag: para
+#: index.docbook:6006
+#, no-c-format
+msgid ""
+"Optional. Specifies that the note head pixmaps have a fixed area to left and "
+"right that should not be considered part of the note head. This attribute "
+"gives the thickness of that area."
+msgstr ""
+"Valfritt. Anger att nothuvudets punktavbildning har ett fast område till "
+"vänster och höger som inte ska anses vara en del av nothuvudet. Attributet "
+"anger områdets tjocklek."
+
+#. Tag: term
+#: index.docbook:6014
+#, no-c-format
+msgid "border-y"
+msgstr "border-y"
+
+#. Tag: para
+#: index.docbook:6016
+#, no-c-format
+msgid ""
+"Optional. Specifies that the note head pixmaps have a fixed area to top and "
+"bottom that should not be considered part of the note head. This attribute "
+"gives the thickness of that area."
+msgstr ""
+"Valfritt. Anger att nothuvudets punktavbildning har ett fast område "
+"ovanför och under som inte ska anses vara en del av nothuvudet. Attributet "
+"anger områdets tjocklek."
+
+#. Tag: title
+#: index.docbook:6027
+#, no-c-format
+msgid "font-symbol-map"
+msgstr "font-symbol-map"
+
+#. Tag: para
+#: index.docbook:6028
+#, no-c-format
+msgid ""
+"This element lists the symbols available in this notation font, and which "
+"pixmap files or system font code points they should be drawn from."
+msgstr ""
+"Det här elementet listar symbolerna som är tillgängliga i "
+"notteckensnittet, och vilka punktavbildningsfiler eller vilka "
+"kodpunkter i ett systemteckensnitt som de ska ritas upp med."
+
+#. Tag: para
+#: index.docbook:6033
+#, no-c-format
+msgid ""
+"It should contain a list of \"symbol\" elements. These have several possible "
+"attributes, the choice of which will normally depend on whether the font is "
+"based on pixmaps or system fonts:"
+msgstr ""
+"Det ska innehålla en lista med \"symbol\" element. De har flera möjliga "
+"attribut, där valet av vilka normalt beror på om teckensnittet är baserat "
+"på punktavbildningar eller systemteckensnitt:"
+
+#. Tag: term
+#: index.docbook:6041
+#, no-c-format
+msgid "name"
+msgstr "name"
+
+#. Tag: para
+#: index.docbook:6043
+#, no-c-format
+msgid ""
+"Mandatory. This attribute should contain the name of the notation symbol. If "
+"the symbol exists in the <ulink "
+"url=\"http://www.unicode.org/charts/PDF/U1D100.pdf\">Unicode 3.2 "
+"standard</ulink>, the name should be that used to identify the symbol in the "
+"standard."
+msgstr ""
+"Krävs. Det här attributet ska innehålla namnet på notsymbolen. Om "
+"symbolen finns i <ulink "
+"url=\"http://www.unicode.org/charts/PDF/U1D100.pdf\">Unicode 3.2 "
+"standarden</ulink>, ska namnet som används för att identifiera symbolen "
+"vara det som används i standarden."
+
+#. Tag: para
+#: index.docbook:6050
+#, no-c-format
+msgid ""
+"Most of the symbols Rosegarden expects to find are in the standard; one "
+"exception is that many fonts have a special version of the flag symbol that "
+"is intended to be used when composing multiple flags from individual single "
+"flags. Rosegarden refers to this as \"MUSICAL SYMBOL COMBINING FLAG-0\", a "
+"name not used in the Unicode standard (which has flags 1-5 only)."
+msgstr ""
+"De flesta symboler som Rosegarden förväntar sig att hitta ingår i "
+"standarden. Ett undantag är att många teckensnitt har en specialversion av "
+"flaggsymbolen som är avsedd att användas när flera flaggor skapas från "
+"individuella enstaga flaggor. Rosegarden kallar den för \"MUSICAL SYMBOL "
+"COMBINING FLAG-0\", ett namn som inte används av Unicode-standarden (som "
+"bara har flaggorna 1 - 5)."
+
+#. Tag: para
+#: index.docbook:6058
+#, no-c-format
+msgid ""
+"For a definitive set of the symbol names Rosegarden knows about, see the "
+"file \"gui/notecharname.cpp\" in the Rosegarden source distribution. Note "
+"however that it is possible to use additional symbol names by introducing "
+"them in a <link linkend=\"developers-note-styles\">notation style</link>."
+msgstr ""
+"För den fullständiga uppsättningen symbolnamn som Rosegarden känner "
+"till, se filen \"gui/notecharname.cpp\" i Rosegardens källkodsdistribution. "
+"Observera dock att det är möjligt att använda ytterligare symbolnamn "
+"genom att lägga till dem i en <link "
+"linkend=\"developers-note-styles\">notationsstil</link>."
+
+#. Tag: term
+#: index.docbook:6070
+#, no-c-format
+msgid "<term>src</term>"
+msgstr "<term>src</term>"
+
+#. Tag: para
+#: index.docbook:6072
+#, no-c-format
+msgid ""
+"The name of the pixmap file from which this symbol should be loaded, without "
+"a directory or extension. This is the usual way of describing a symbol in a "
+"pixmap font. The file itself should be installed to "
+"fonts/&lt;font-name&gt;/&lt;font-size&gt;/&lt;src&gt;.xpm under the "
+"Rosegarden installation directory."
+msgstr ""
+"Namnet på punktavbildningsfilen som ska användas för att ladda symbolen, "
+"utan katalog eller filändelse. Det är det vanliga sättet att beskriva en "
+"symbol i ett punktavbildat teckensnitt. Själva filen ska installeras i "
+"fonts/&lt;teckensnittsnamn&gt;/&lt;teckenstorlek&gt;/&lt;källa&gt;.xpm "
+"under Rosegardens installationskatalog."
+
+#. Tag: term
+#: index.docbook:6084
+#, no-c-format
+msgid "inversion-src"
+msgstr "inversion-src"
+
+#. Tag: para
+#: index.docbook:6086
+#, no-c-format
+msgid ""
+"The name of a pixmap file from which an inverted version of this symbol may "
+"be loaded, without a directory or extension. If this attribute is absent and "
+"an inverted version of the symbol is required, it will be generated simply "
+"by loading the normal version and reflecting it in a central x-axis."
+msgstr ""
+"Namnet på en punktavbildningsfil som kan användas för att ladda en "
+"inverterad version av symbolen, utan katalog eller filändelse. Om "
+"attributet saknas och en inverterad version av symbolen behövs, skapas den "
+"helt enkelt genom att ladda den normala versionen och spegla den i den "
+"centrala x-axeln."
+
+#. Tag: term
+#: index.docbook:6097
+#, no-c-format
+msgid "code"
+msgstr "code"
+
+#. Tag: para
+#: index.docbook:6099
+#, no-c-format
+msgid ""
+"The code point at which this symbol may be found in the relevant system "
+"font, as a decimal integer. This is a way of describing a symbol in a "
+"scalable font. This attribute will only be referred to if no pixmap file is "
+"supplied, or if the pixmap file fails to load."
+msgstr ""
+"Kodpunkten där symbolen kan hittas i relevant systemteckensnitt, som ett "
+"decimalt heltal. Det är ett sätt att beskriva en symbol i ett skalbart "
+"teckensnitt. Attributet används bara om ingen punktavbildningsfil "
+"tillhandahålls, eller om laddning av punktavbildningsfilen misslyckas."
+
+#. Tag: term
+#: index.docbook:6110
+#, no-c-format
+msgid "inversion-code"
+msgstr "inversion-code"
+
+#. Tag: para
+#: index.docbook:6112
+#, no-c-format
+msgid ""
+"The code point at which an inverted version of this symbol may be found in "
+"the relevant system font. If this attribute is absent and an inverted "
+"version of the symbol is required, it will be generated simply by loading "
+"the normal version and reflecting it in a central x-axis."
+msgstr ""
+"Kodpunkten där en inverterad version av symbolen kan hittas i relevant "
+"systemteckensnitt. Om attributet saknas och en inverterad version av "
+"symbolen behövs, skapas den helt enkelt genom att ladda den normala "
+"versionen och spegla den i den centrala x-axeln."
+
+#. Tag: term
+#: index.docbook:6123
+#, no-c-format
+msgid "glyph"
+msgstr "glyph"
+
+#. Tag: para
+#: index.docbook:6125
+#, no-c-format
+msgid ""
+"The raw glyph index at which this symbol may be found in the relevant system "
+"font, as a decimal integer. This is a way of describing a symbol in a "
+"scalable font. This attribute will only be referred to if no pixmap file is "
+"supplied, or if the pixmap file fails to load."
+msgstr ""
+"Det obehandlade indexet för glyfen där symbolen kan hittas i relevant "
+"systemteckensnitt, som ett decimalt heltal. Det är ett sätt att beskriva "
+"en symbol i ett skalbart teckensnitt. Attributet används bara om ingen "
+"punktavbildningsfil tillhandahålls, eller om laddning av "
+"punktavbildningsfilen misslyckas."
+
+#. Tag: term
+#: index.docbook:6136
+#, no-c-format
+msgid "inversion-glyph"
+msgstr "inversion-glyph"
+
+#. Tag: para
+#: index.docbook:6138
+#, no-c-format
+msgid ""
+"The raw glyph index at which an inverted version of this symbol may be found "
+"in the relevant system font. If this attribute is absent and an inverted "
+"version of the symbol is required, it will be generated simply by loading "
+"the normal version and reflecting it in a central x-axis."
+msgstr ""
+"Det obehandlade indexet för glyfen där en inverterad version av symbolen "
+"kan hittas i relevant systemteckensnitt. Om attributet saknas och en "
+"inverterad version av symbolen behövs, skapas den helt enkelt genom att "
+"ladda den normala versionen och spegla den i den centrala x-axeln."
+
+#. Tag: term
+#: index.docbook:6149
+#, no-c-format
+msgid "font-id"
+msgstr "font-id"
+
+#. Tag: para
+#: index.docbook:6151
+#, no-c-format
+msgid ""
+"The id of the system font from which this symbol should be loaded, as "
+"defined in the <link "
+"linkend=\"developers-note-fonts-mapping-format-font-requirements\">font-requi"
+"rements</link> element. The default is 0."
+msgstr ""
+"Identifikationen för systemteckensnittet som den här symbolen ska laddas "
+"från, som det är definierat i elementet <link "
+"linkend=\"developers-note-fonts-mapping-format-font-requirements\">font-requi"
+"rements</link>. Normalvärdet är 0."
+
+#. Tag: term
+#: index.docbook:6160
+#, no-c-format
+msgid "codebase"
+msgstr "codebase"
+
+#. Tag: para
+#: index.docbook:6162
+#, no-c-format
+msgid ""
+"This (decimal integer) attribute may be of use if many of the symbols in a "
+"scalable font cover a short range of code points starting at a relatively "
+"high code page. If supplied, the codebase value will be added to each of the "
+"subsequent code and inversion-code values when looking up a symbol."
+msgstr ""
+"Det här attributet (ett decimalt heltal) kan vara användbart om många av "
+"symbolerna i ett skalbart teckensnitt täcker ett kort område med "
+"kodpunkter med början på en relativt hög kodsida. Om det anges, läggs "
+"värdet codebase till för vart och ett av efterföljande värden på code "
+"och inversion-code när en symbol slås upp."
+
+#. Tag: para
+#: index.docbook:6174
+#, no-c-format
+msgid ""
+"Although none of these attributes is mandatory except for the name, a symbol "
+"obviously needs to supply at least one of \"src\", \"inversion-src\", "
+"\"code\", \"inversion-code\", \"glyph\", or \"inversion-glyph\" to stand any "
+"chance of being rendered at all. It is of course perfectly legitimate to "
+"supply several or all of these attributes."
+msgstr ""
+"Även om inget av attributen krävs, förutom namnet, måste en symbol "
+"uppenbarligen tillhandahålla åtminstone en av \"src\", \"inversion-src\", "
+"\"code\", \"inversion-code\", \"glyph\" eller \"inversion-glyph\" för att "
+"ha någon möjlighet att överhuvudtaget ritas upp. Det är förstås "
+"fullständig legitimt att tillhandahålla flera eller alla dessa attribut."
+
+#. Tag: title
+#: index.docbook:6186
+#, no-c-format
+msgid "font-hotspots"
+msgstr "font-hotspots"
+
+#. Tag: para
+#: index.docbook:6187
+#, no-c-format
+msgid "&nbsp;"
+msgstr "&nbsp;"
+
+#. Tag: title
+#: index.docbook:6196
+#, no-c-format
+msgid "Creating new notation styles"
+msgstr "Skapa nya notstilar"
+
+#. Tag: para
+#: index.docbook:6198
+#, no-c-format
+msgid ""
+"Rosegarden's notation editor has the ability to display and edit notes in "
+"various standard styles: classical, diamond heads and so on. These styles "
+"are all defined in XML style definition files installed along with the "
+"application, and it's possible to create a new one by writing a simple XML "
+"file. Rosegarden simply looks at the set of installed files to determine "
+"which styles to offer the user. You can refer to the default set of files in "
+"the styles subdirectory of the Rosegarden installation directory for "
+"examples."
+msgstr ""
+"Rosegardens notbehandlare har möjlighet att visa och redigera noter med "
+"olika standardstilar: klassisk, rombformade huvuden och så vidare. Alla "
+"stilar definieras i definitionsfiler på XML-form som installeras "
+"tillsammans med programmet, och det är möjligt att skapa en ny genom att "
+"skriva en enkel XML-fil. Rosegarden tittar helt enkelt på uppsättningen "
+"installerade filer för att avgöra vilka stilar som användaren ska "
+"erbjudas. Du kan till exempel hänvisa till standarduppsättningen med filer "
+"i underkatalogen för stilar i Rosegardens installationskatalog."
+
+#. Tag: para
+#: index.docbook:6210
+#, no-c-format
+msgid ""
+"The file format is not yet especially comprehensive; at the moment it has "
+"been designed to be powerful enough to describe the standard styles that "
+"come with Rosegarden, but not much more. If you should try to create new "
+"styles this way, we'd be very interested in your feedback on the Rosegarden "
+"mailing-lists."
+msgstr ""
+"Filformatet är inte ännu särskilt omfattande. För ögonblicket är det "
+"konstruerat för att vara kraftfullt nog att beskriva standardstilarna som "
+"levereras med Rosegarden, men inte mycket mer. Om du gör ett försök att "
+"skapa nya stilar på det här sättet, är vi mycket intresserade av din "
+"återmatning via Rosegardens e-postlistor."
+
+#. Tag: title
+#: index.docbook:6220
+#, no-c-format
+msgid "Notation style XML format"
+msgstr "XML-format för notstil"
+
+#. Tag: para
+#: index.docbook:6222
+#, no-c-format
+msgid ""
+"Here is a summary of the XML elements that may be used in a style definition "
+"file."
+msgstr ""
+"Här är en översikt över XML-elementen som kan användas i en "
+"stildefinitionsfil."
+
+#. Tag: title
+#: index.docbook:6228
+#, no-c-format
+msgid "rosegarden-note-style"
+msgstr "rosegarden-note-style"
+
+#. Tag: para
+#: index.docbook:6230
+#, no-c-format
+msgid ""
+"This element must exist in every style file, and should contain all the "
+"other elements. It has one optional attribute, \"base-style\", which may be "
+"used to name a style from which this style takes the default values for any "
+"parameters not specified elsewhere in the present file. It's often good "
+"practice to define a style in terms of the minimal difference from a given "
+"base style: see the supplied Cross.xml for a particularly simple example."
+msgstr ""
+"Det här elementet måste finnas i alla stilfiler, och ska innehålla alla "
+"övriga element. Det har ett valfritt attribut, \"base-style\", som kan "
+"användas för att namnge en stil där den här stilen hämtar "
+"standardvärden för alla parametrar som inte anges någon annanstans i den "
+"befintliga filen. Det är ofta lämpligt att definiera en stil i form av "
+"minsta möjliga skillnader från en given basstil. Se filen Cross.xml som "
+"tillhandahålls, för ett särskilt enkelt exempel."
+
+#. Tag: para
+#: index.docbook:6240
+#, no-c-format
+msgid ""
+"Note that the \"rosegarden-note-style\" element does not give the name of "
+"the style being defined, which is instead currently drawn from the name of "
+"the file. At some point in the future we may add internationalizable style "
+"name attributes to this element."
+msgstr ""
+"Observera att elementet \"rosegarden-note-style\" inte anger namnet på "
+"stilen som definieras, som istället tas från filens namn. Någon gång i "
+"framtiden kanske stöd för översättning av stilnamn läggs till i det "
+"här elementets attribut."
+
+#. Tag: title
+#: index.docbook:6248
+#, no-c-format
+msgid "global, note"
+msgstr "global, note"
+
+#. Tag: para
+#: index.docbook:6250
+#, no-c-format
+msgid ""
+"Within the \"rosegarden-note-style\" element, there may be one \"global\" "
+"element and any number of \"note\" elements. We describe these together, as "
+"they have almost identical sets of attributes. The \"global\" element simply "
+"provides default values for those parameters not specified for a particular "
+"note type in any following \"note\" element."
+msgstr ""
+"I elementet \"rosegarden-note-style\" kan det finnas ett \"global\" element "
+"och hur många \"note\" element som helst. De beskrivs tillsammans, eftersom "
+"de har nästan identiska uppsättningar attribut. Elementet \"global\" "
+"tillhandahåller helt enkelt standardvärden för de parametrar som inte "
+"anges för en viss nottyp i något av följande \"note\" element."
+
+#. Tag: para
+#: index.docbook:6258
+#, no-c-format
+msgid ""
+"The attributes for these elements are as follows. All of these are optional "
+"except as described:"
+msgstr ""
+"Attributen för elementen är följande. Alla är valfria utom enligt "
+"beskrivningen:"
+
+#. Tag: para
+#: index.docbook:6266
+#, no-c-format
+msgid ""
+"Only relevant to the \"note\" element, and mandatory for that element. This "
+"attribute specifies which sort of note is being styled. Legal values are "
+"textual American or British note names (from \"64th\", \"sixth-fourth "
+"note\", \"hemidemisemiquaver\" etc to \"double whole note\")."
+msgstr ""
+"Gäller bara elementet \"note\", och krävs för det elementet. Det här "
+"attributet anger vilken sorts not som stilen gäller för. Giltiga värden "
+"är tonnamn på amerikansk eller brittisk engelska (från \"64th\", "
+"\"sixth-fourth note\", \"hemidemisemiquaver\" etc till \"double whole "
+"note\")."
+
+#. Tag: term
+#: index.docbook:6277
+#, no-c-format
+msgid "shape"
+msgstr "shape"
+
+#. Tag: para
+#: index.docbook:6279
+#, no-c-format
+msgid ""
+"Defines a note head shape for this style. Any string is a legal value, but "
+"the only values implemented so far are \"angled oval\", \"level oval\", "
+"\"breve\", \"cross\", \"triangle up\", \"triangle down\", \"diamond\" and "
+"\"rectangle\". The value \"number\" is also recognised but not yet "
+"implemented."
+msgstr ""
+"Definierar en form för nothuvudet i den här stilen. Vilken sträng som "
+"helst är ett giltigt värde, men de enda värden som hittills är "
+"implementerade är \"angled oval\", \"level oval\", \"breve\", \"cross\", "
+"\"triangle up\", \"triangle down\", \"diamond\" och \"rectangle\". Värdet "
+"\"number\" känns också igen, men är ännu inte implementerat."
+
+#. Tag: term
+#: index.docbook:6290
+#, no-c-format
+msgid "charname"
+msgstr "charname"
+
+#. Tag: para
+#: index.docbook:6292
+#, no-c-format
+msgid ""
+"Defines a note font character name to be used as the note head for this "
+"style. An element may supply a \"shape\" or \"charname\" attribute, but not "
+"both. The name should be one of those defined in the current notation font's "
+"<link "
+"linkend=\"developers-note-fonts-mapping-format-font-symbol-map\">symbol "
+"map</link> (in a \"name\" attribute)."
+msgstr ""
+"Definierar ett teckennamn i notteckensnittet som ska användas som nothuvud "
+"för stilen. Ett element kan tillhandahålla attributet \"shape\" eller "
+"\"charname\", men inte båda. Namnet ska vara ett av de som definieras i det "
+"nuvarande notskriftteckensnittets <link "
+"linkend=\"developers-note-fonts-mapping-format-font-symbol-map\">symbol "
+"map</link> (i ett attribut \"name\")."
+
+#. Tag: term
+#: index.docbook:6304
+#, no-c-format
+msgid "filled"
+msgstr "filled"
+
+#. Tag: para
+#: index.docbook:6306
+#, no-c-format
+msgid ""
+"Specifies whether this note should have a filled head (where applicable, "
+"i.e. where the shape attribute supplies a shape that is available both "
+"filled and unfilled). Must be \"true\" or \"false\"."
+msgstr ""
+"Anger om noten ska ha ett ifyllt huvud (när det är tillämpligt, dvs. när "
+"formegenskapen anger en form som både är tillgänglig ifylld och inte). "
+"Måste vara \"true\" eller \"false\"."
+
+#. Tag: term
+#: index.docbook:6315
+#, no-c-format
+msgid "stem"
+msgstr "stem"
+
+#. Tag: para
+#: index.docbook:6317
+#, no-c-format
+msgid ""
+"Specifies whether this note should have a stem. Must be \"true\" or "
+"\"false\"."
+msgstr "Anger om noten ska ha ett skaft. Måste vara \"true\" eller \"false\"."
+
+#. Tag: term
+#: index.docbook:6324
+#, no-c-format
+msgid "flags"
+msgstr "flags"
+
+#. Tag: para
+#: index.docbook:6326
+#, no-c-format
+msgid ""
+"Defines how many flags or beams this note should have. The valid range is 0 "
+"to 4."
+msgstr ""
+"Anger hur många flaggor eller balkar som noten ska ha. Giltigt intervall "
+"är 0 till 4."
+
+#. Tag: term
+#: index.docbook:6333
+#, no-c-format
+msgid "slashes"
+msgstr "slashes"
+
+#. Tag: para
+#: index.docbook:6335
+#, no-c-format
+msgid "Defines how many slashes this note should have across its stem."
+msgstr "Anger hur många tvärbalkar noten ska ha över skaftet."
+
+#. Tag: term
+#: index.docbook:6342
+#, no-c-format
+msgid "hfixpoint"
+msgstr "hfixpoint"
+
+#. Tag: para
+#: index.docbook:6344
+#, no-c-format
+msgid ""
+"Specifies in which x position the stem fixes to the note head. Acceptable "
+"values are \"normal\" (the right side when the stem points up, the left when "
+"it points down), \"central\", and \"reversed\" (left side when the stem "
+"points up, right when it points down)."
+msgstr ""
+"Anger på vilken x-position som skaftet ansluts till nothuvudet. Acceptabla "
+"värden är \"normal\" (höger sida när skaftet pekar uppåt, vänster sida "
+"när det pekar neråt), \"central\" och \"reversed\" (vänster sida när "
+"skaftet pekar uppåt, höger sida när det pekar neråt)."
+
+#. Tag: term
+#: index.docbook:6354
+#, no-c-format
+msgid "vfixpoint"
+msgstr "vfixpoint"
+
+#. Tag: para
+#: index.docbook:6356
+#, no-c-format
+msgid ""
+"Specifies in which y position the stem fixes to the note head. Acceptable "
+"values are \"near\" (the stem fixes to the top when pointing up, the bottom "
+"when pointing down), \"middle\", or \"far\"."
+msgstr ""
+"Anger på vilken y-position som skaftet ansluts till nothuvudet. Acceptabla "
+"värden är \"near\" (skaftet ansluts till toppen när det pekar uppåt, "
+"till botten när det pekar neråt), \"middle\" eller \"far\"."
+
+#. Tag: title
+#: index.docbook:6517
+#, no-c-format
+msgid "Credits and License"
+msgstr "Tack till och licens"
+
+#. Tag: application
+#: index.docbook:6520
+#, no-c-format
+msgid "<application>Rosegarden</application>"
+msgstr "<application>Rosegarden</application>"
+
+#. Tag: para
+#: index.docbook:6525
+#, no-c-format
+msgid ""
+"Rosegarden-4 is Copyright 2000-2004 Guillaume Laurent, Chris Cannam and "
+"Richard Bown. The moral rights of Guillaume Laurent, Chris Cannam and "
+"Richard Bown to be identified as the authors of this work have been asserted."
+msgstr ""
+"Rosegarden-4 är Copyright 2000-2004 Guillaume Laurent, Chris Cannam och "
+"Richard Bown. Moralisk rättighet att identifieras som upphovsmän till det "
+"här verket hävdas av Guillaume Laurent, Chris Cannam och Richard Bown."
+
+#. Tag: para
+#: index.docbook:6536
+#, no-c-format
+msgid ""
+"Parts of Rosegarden-4 are derived from Rosegarden 2.1, which is Copyright "
+"1994 &ndash; 2001 Chris Cannam, Andrew Green, Richard Bown and Guillaume "
+"Laurent."
+msgstr ""
+"Delar av Rosegarden-4 är härledda från Rosegarden 2.1, som är Copyright "
+"1994 &ndash; 2001 Chris Cannam, Andrew Green, Richard Bown och Guillaume "
+"Laurent."
+
+#. Tag: para
+#: index.docbook:6546
+#, no-c-format
+msgid ""
+"For musical notation display Rosegarden-4 uses pixmaps derived from the Feta "
+"font, part of the <ulink url=\"http://lilypond.org/\">Lilypond</ulink> "
+"software, which is Copyright 1997 &ndash; 2001 Jan Nieuwenhuizen and Han-Wen "
+"Nienhuys."
+msgstr ""
+"För visning av musikalisk notskrift använder Rosegarden-4 "
+"punktavbildningar härledda från teckensnittet Feta, som är en del av "
+"programvaran <ulink url=\"http://lilypond.org/\">Lilypond</ulink>, som är "
+"Copyright 1997 &ndash; 2001 Jan Nieuwenhuizen och Han-Wen Nienhuys."
+
+#. Tag: para
+#: index.docbook:6558
+#, no-c-format
+msgid ""
+"Other major contributors include Randall Farmer, Ron Kuris, Hans Kieserman, "
+"and Michael McIntyre."
+msgstr ""
+"Bland andra väsentliga bidragsgivare finns Randall Farmer, Ron Kuris, Hans "
+"Kieserman och Michael McIntyre."
+
+#. Tag: para
+#: index.docbook:6567
+#, no-c-format
+msgid ""
+"The Rosegarden splash-screen image is from a 1900 postcard of Thornden Park "
+"at Syracuse University, Syracuse, NY, used with thanks to the staff of "
+"Syracuse University."
+msgstr ""
+"Rosegardens startskärm kommer från ett vykort av Thornden-parken vid "
+"Syracuse-universitetet i Syracuse, New York, tryckt år 1900. Tack till "
+"personalen på Syracuse-universitetet för användning av det."
+
+#. Tag: para
+#: index.docbook:6579
+#, no-c-format
+msgid ""
+"Documentation copyright 2002-2004 Chris Cannam, Richard Bown, Guillaume "
+"Laurent"
+msgstr ""
+"Dokumentation copyright 2002-2004 Chris Cannam, Richard Bown, Guillaume "
+"Laurent"
+
+#. Tag: para
+#: index.docbook:6598
+#, no-c-format
+msgid ""
+"This program is licensed under the terms of the <ulink "
+"url=\"common/gpl-license.html\">GNU General Public License</ulink>."
+msgstr ""
+"Det här programmet distribueras under villkoren i <ulink "
+"url=\"common/gpl-license.html\">GNU General Public License</ulink>."
+
+#. Tag: title
+#: index.docbook:6609
+#, no-c-format
+msgid "Rosegarden-4 Revision History"
+msgstr "Rosegarden-4 utgåvehistorik"
+
+#. Tag: para
+#: index.docbook:6612
+#, no-c-format
+msgid ""
+"0.9.9 &ndash; July 2004: plugin synths, triggered segments, notation "
+"improvements"
+msgstr ""
+"0.9.9 &ndash; juli 2004: syntinsticksmoduler, utlösande segment, "
+"notationsförbättringar"
+
+#. Tag: para
+#: index.docbook:6615
+#, no-c-format
+msgid "0.9.8 &ndash; May 2004: better audio subsystem"
+msgstr "0.9.8 &ndash; maj 2004: bättre ljuddelsystem"
+
+#. Tag: para
+#: index.docbook:6618
+#, no-c-format
+msgid "0.9.7 &ndash; February 2004:"
+msgstr "0.9.7 &ndash; februari 2004:"
+
+#. Tag: para
+#: index.docbook:6621
+#, no-c-format
+msgid "0.9.6 &ndash; December 2003: bug fixes"
+msgstr "0.9.6 &ndash; december 2003: felrättningar"
+
+#. Tag: para
+#: index.docbook:6624
+#, no-c-format
+msgid "0.9.5 &ndash; November 2003: a great many stuff"
+msgstr "0.9.5 &ndash; november 2003: en hel del saker"
+
+#. Tag: para
+#: index.docbook:6627
+#, no-c-format
+msgid "0.9.1 &ndash; May 2003: step recording, Mup export, many many bug fixes"
+msgstr ""
+"0.9.1 &ndash; maj 2003: stegvis inspelning, MUP-export, många många "
+"felrättningar"
+
+#. Tag: para
+#: index.docbook:6630
+#, no-c-format
+msgid ""
+"0.9 &ndash; April 2003: many notation improvements, improved bank editor, "
+"audio enhancements and refinements, translations"
+msgstr ""
+"0.9 &ndash; april 2003: många förbättringar av notation, förbättrad "
+"bankeditor, ljudförbättringar och förfiningar, översättningar"
+
+#. Tag: para
+#: index.docbook:6633
+#, no-c-format
+msgid "0.8.5 &ndash; December 2002: bank editor, MIDI filters, panic button"
+msgstr "0.8.5 &ndash; december 2002: bankeditor, MIDI-filter, panikknapp"
+
+#. Tag: para
+#: index.docbook:6636
+#, no-c-format
+msgid "0.8 &ndash; October 2002: printing, LADSPA plugins, improved Matrix View"
+msgstr ""
+"0.8 &ndash; oktober 2002: utskrift, LADSPA-insticksmoduler, förbättrad "
+"matrisvy"
+
+#. Tag: para
+#: index.docbook:6639
+#, no-c-format
+msgid ""
+"0.2.0 &ndash; August 2002: WAV file support, sweep selections, contrapuntal "
+"staves"
+msgstr "0.2.0 &ndash; augusti 2002: WAV-filstöd, markering med svepning, kontrapunkt"
+
+#. Tag: para
+#: index.docbook:6642
+#, no-c-format
+msgid ""
+"0.1.6 &ndash; June 2002: configuration dialog, Lilypond support, quantize "
+"dialog"
+msgstr ""
+"0.1.6 &ndash; juni 2002: inställningsdialogruta, Lilypond-stöd, "
+"kvantiseringsdialogruta"
+
+#. Tag: para
+#: index.docbook:6645
+#, no-c-format
+msgid "0.1.5 &ndash; May 2002: KDE 3, ALSA support, JACK audio support"
+msgstr "0.1.5 &ndash; maj 2002: KDE 3, ALSA-stöd, JACK-ljudstöd"
+
+#. Tag: para
+#: index.docbook:6648
+#, no-c-format
+msgid "0.1.4 &ndash; March 2002: more undo, segment editing, audio playback"
+msgstr "0.1.4 &ndash; mars 2002: mer ångra, segmentredigering, ljuduppspelning"
+
+#. Tag: para
+#: index.docbook:6651
+#, no-c-format
+msgid "0.1.3 &ndash; January 2002: piano-roll/matrix view, &MIDI; recording"
+msgstr "0.1.3 &ndash; januari 2002: pianorulle och matrisvy, &MIDI;-inspelning"
+
+#. Tag: para
+#: index.docbook:6654
+#, no-c-format
+msgid ""
+"0.1.2 &ndash; November 2001: notation undo, transport dialog, position "
+"pointer"
+msgstr ""
+"0.1.2 &ndash; november 2001: ångra notation, transportdialogruta, "
+"positionspekare"
+
+#. Tag: para
+#: index.docbook:6657
+#, no-c-format
+msgid "0.1.1 &ndash; October 2001: scalable notation"
+msgstr "0.1.1 &ndash; oktober 2001: skalbar notation"
+
+#. Tag: para
+#: index.docbook:6660
+#, no-c-format
+msgid "0.1 &ndash; June 2001: first public release of Rosegarden-4"
+msgstr "0.1 &ndash; juni 2001: första öppna utgåva av Rosegarden-4"
+
diff --git a/po/CMakeLists.txt b/po/CMakeLists.txt
new file mode 100644
index 0000000..a653d59
--- /dev/null
+++ b/po/CMakeLists.txt
@@ -0,0 +1,25 @@
+
+# Automatic discovery of sources
+FILE(GLOB PO_FILES *.po)
+
+# DISABLED: explicit set of source files
+# SET(PO_FILES
+# ca.po
+# cs.po
+# cy.po
+# de.po
+# en_GB.po
+# en.po
+# es.po
+# et.po
+# fi.po
+# fr.po
+# it.po
+# ja.po
+# nl.po
+# ru.po
+# sv.po
+# zh_CN.po
+# )
+
+ADD_TRANSLATIONS(rosegarden ${PO_FILES})
diff --git a/po/ca.po b/po/ca.po
new file mode 100644
index 0000000..ff5da9d
--- /dev/null
+++ b/po/ca.po
@@ -0,0 +1,12380 @@
+# translation of ca.po to Català
+# This file is distributed under the same license as the PACKAGE package.
+# Quim Perez i Noguer, 2006.
+# Quim Perez i Noguer, 2006.
+# Quim Perez i Noguer, 2006.
+# Quim Perez i Noguer, 2006.
+# Quim Perez i Noguer, 2006.
+# Quim Perez i Noguer, 2006.
+# Quim Perez i Noguer, 2006.
+# Quim Perez i Noguer, 2006.
+# Quim Perez i Noguer, 2006.
+# Quim Perez i Noguer, 2006.
+# Quim Perez i Noguer, 2006.
+# Quim Perez i Noguer, 2006.
+# Quim Perez i Noguer, 2006.
+# Quim Perez i Noguer, 2006.
+# Quim Perez i Noguer, 2006.
+# Quim Perez i Noguer, 2006.
+# Quim Perez i Noguer, 2006.
+# Quim Perez i Noguer, 2006.
+# Quim Perez i Noguer, 2006.
+# Quim Perez i Noguer, 2006.
+# Quim Perez i Noguer, 2006.
+# Quim Perez i Noguer, 2006.
+# Quim Perez i Noguer, 2006.
+# Quim Perez i Noguer, 2006.
+# Quim Perez i Noguer, 2006.
+# Quim Perez i Noguer, 2006.
+# Quim Perez i Noguer, 2006.
+# Quim Perez i Noguer, 2006.
+# Quim Perez i Noguer, 2006.
+# Quim Perez i Noguer, 2006.
+# Quim Perez i Noguer, 2006.
+# Quim Perez i Noguer, 2006.
+# Quim Perez i Noguer, 2006.
+# Quim Perez i Noguer, 2006.
+# Quim Perez i Noguer, 2006.
+# Quim Perez i Noguer, 2006.
+# Quim Perez i Noguer, 2006.
+# Quim Perez i Noguer, 2006.
+# Quim Perez i Noguer, 2006.
+# Quim Perez i Noguer, 2006.
+# Quim Perez i Noguer, 2006.
+# Quim Perez i Noguer, 2006.
+# Quim Perez i Noguer, 2006.
+# Quim Perez i Noguer, 2006.
+# Quim Perez i Noguer, 2006.
+# Quim Perez i Noguer, 2006.
+# Quim Perez i Noguer, 2006.
+# Quim Perez i Noguer, 2006.
+# Quim Perez i Noguer, 2006.
+# Quim Perez i Noguer, 2006.
+# Quim Perez i Noguer, 2006.
+# Quim Perez i Noguer, 2006.
+# Quim Perez i Noguer, 2006.
+# Quim Perez i Noguer, 2006.
+# Quim Perez i Noguer, 2006.
+# Quim Perez i Noguer, 2006.
+# Quim Perez i Noguer, 2006.
+# Quim Perez i Noguer, 2006.
+# Quim Perez i Noguer, 2006.
+# Quim Perez i Noguer, 2006.
+# Quim Perez i Noguer, 2006.
+# Quim Perez i Noguer, 2006.
+# Quim Perez i Noguer, 2006.
+# Quim Perez i Noguer, 2006.
+# Quim Perez i Noguer, 2006.
+# Quim Perez i Noguer, 2006.
+# Quim Perez i Noguer, 2006.
+# Quim Perez i Noguer, 2006.
+# Quim Perez i Noguer, 2006.
+# Quim Perez i Noguer, 2006.
+# Quim Perez i Noguer, 2006.
+# Quim Perez i Noguer, 2006.
+# Quim Perez i Noguer, 2006.
+# Quim Perez i Noguer, 2006.
+# Quim Perez i Noguer, 2006.
+# Quim Perez i Noguer, 2006.
+# Quim Perez i Noguer, 2006.
+# Quim Perez i Noguer, 2006.
+# Quim Perez i Noguer, 2006.
+# Quim Perez i Noguer, 2006.
+# Quim Perez i Noguer, 2006.
+# Quim Perez i Noguer, 2006.
+# Quim Perez i Noguer, 2006.
+# Quim Perez i Noguer, 2006.
+# Quim Perez i Noguer, 2006.
+# Quim Perez i Noguer, 2006.
+# Quim Perez i Noguer, 2006.
+# Quim Perez i Noguer, 2006.
+# Quim Perez i Noguer, 2006.
+# Quim Perez i Noguer, 2006.
+# Quim Perez i Noguer, 2006.
+# Quim Perez i Noguer, 2006.
+# Quim Perez i Noguer, 2006.
+# Quim Perez i Noguer, 2006.
+# Quim Perez i Noguer, 2006.
+# Quim Perez i Noguer, 2006.
+# Quim Perez i Noguer, 2006.
+# Quim Perez i Noguer, 2006.
+# Quim Perez i Noguer, 2006.
+# Quim Perez i Noguer, 2006.
+# Quim Perez i Noguer, 2006.
+# Quim Perez i Noguer, 2006.
+# Quim Perez i Noguer, 2006.
+# Quim Perez i Noguer, 2006.
+# Quim Perez i Noguer, 2006.
+# Quim Perez i Noguer, 2006.
+# Quim Perez i Noguer, 2006.
+# Quim Perez i Noguer, 2006.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER.
+# Pedro Lopez-Cabanillas <[email protected]>, 2003, 2004.
+# D. Michael McIntyre <[email protected]>, 2003, 2004.
+# Feliu Ferrer <[email protected]>, 2005.
+# Maria-Rosa Vergés <[email protected]>, 2005.
+# Quim Perez Noguer <[email protected]>, 2005.
+# Quim Perez i Noguer, 2006.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: ca\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-04-24 18:19-0400\n"
+"PO-Revision-Date: 2006-06-30 23:32+0200\n"
+"Last-Translator: Quim Perez i Noguer\n"
+"Language-Team: Català <[email protected]>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.10.2\n"
+
+#: ../src/gui/dialogs/RescaleDialog.cpp:51 rc.cpp:192 rc.cpp:312
+#, no-c-format
+msgid "Rescale"
+msgstr "Canvia d'escala"
+
+#: ../src/gui/dialogs/RescaleDialog.cpp:56
+msgid "Duration of selection"
+msgstr "Duració de la selecció"
+
+#: ../src/gui/dialogs/RescaleDialog.cpp:62
+msgid "Adjust times of following events accordingly"
+msgstr "Ajusta els temps dels següents esdeveniments"
+
+#: ../src/gui/dialogs/PitchDialog.cpp:45
+#: ../src/gui/dialogs/RescaleDialog.cpp:72
+#: ../src/gui/dialogs/TimeDialog.cpp:51 ../src/gui/dialogs/TimeDialog.cpp:68
+#: ../src/gui/studio/BankEditorDialog.cpp:109
+msgid "Reset"
+msgstr "Reinicia"
+
+#: ../src/commands/segment/SegmentSplitByPitchCommand.cpp:46
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:46
+msgid "Split by Pitch"
+msgstr "Divideix pel to"
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:54
+msgid "Starting split pitch"
+msgstr "To d'inici de divisió"
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:57
+msgid "Range up and down to follow music"
+msgstr "Abast superior i inferior per seguir la música"
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:63
+msgid "Duplicate non-note events"
+msgstr "Duplica els esdeveniments que no siguin notes"
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:66
+msgid "Clef handling:"
+msgstr "Gestió de claus:"
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:69
+msgid "Leave clefs alone"
+msgstr "Deixa les claus tal com estan"
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:70
+msgid "Guess new clefs"
+msgstr "Suposa noves claus"
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:71
+msgid "Use treble and bass clefs"
+msgstr "Fes servir claus de soprano i de baix"
+
+#: ../src/gui/dialogs/DocumentConfigureDialog.cpp:64
+msgid "Document Properties"
+msgstr "Propietats del document"
+
+#: ../src/gui/dialogs/MakeOrnamentDialog.cpp:45
+#: ../src/gui/editors/notation/NotationView.cpp:6048
+msgid "Make Ornament"
+msgstr "Crea l'ornamentació"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:183
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:179
+#: ../src/gui/dialogs/EventEditDialog.cpp:128
+#: ../src/gui/dialogs/MakeOrnamentDialog.cpp:49
+#: ../src/gui/studio/DeviceEditorDialog.cpp:74
+#: ../src/gui/studio/NameSetEditor.cpp:72
+#: ../src/gui/widgets/ColourTable.cpp:51
+msgid "Name"
+msgstr "Nom"
+
+#: ../src/gui/dialogs/MakeOrnamentDialog.cpp:51
+msgid ""
+"The name is used to identify both the ornament\n"
+"and the triggered segment that stores\n"
+"the ornament's notes."
+msgstr ""
+"El nom s'utilitza per identificar tant l'ornament\n"
+"com el fragment activable que conté les notes\n"
+"de l'ornamentació."
+
+#: ../src/gui/dialogs/MakeOrnamentDialog.cpp:54
+msgid "Name: "
+msgstr "Nom: "
+
+#: ../src/gui/dialogs/MakeOrnamentDialog.cpp:57
+#: ../src/gui/editors/eventlist/EventView.cpp:717
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:92
+msgid "Base pitch"
+msgstr "Altura de la base"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:57
+#: ../src/gui/editors/eventlist/EventView.cpp:140
+msgid "Text"
+msgstr "Text"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:66
+msgid "Specification"
+msgstr "Especificació"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:68
+msgid "Preview"
+msgstr "Visualització prèvia"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:72
+msgid "Text: "
+msgstr "Text: "
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:79
+msgid "Style: "
+msgstr "Estil: "
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:90
+msgid "Dynamic"
+msgstr "Dinàmica"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:93
+msgid "Direction"
+msgstr "Direcció"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:96
+msgid "Local Direction"
+msgstr "Direcció local"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:63
+#: ../src/gui/dialogs/TextEventDialog.cpp:99
+#: ../src/gui/editors/tempo/TempoView.cpp:91
+msgid "Tempo"
+msgstr "Tempo"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:102
+msgid "Local Tempo"
+msgstr "Tempo local"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:105
+msgid "Lyric"
+msgstr "Lírica"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:108
+#: ../src/gui/editors/notation/NotationView.cpp:4242
+msgid "Chord"
+msgstr "Acord"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:111
+msgid "Annotation"
+msgstr "Anotació"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:114
+#, fuzzy
+msgid "LilyPond Directive"
+msgstr "Fitxers Lilypond"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:138
+msgid "Verse: "
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:148
+#, fuzzy
+msgid "Dynamic: "
+msgstr "Dinàmica"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:152
+msgid "ppp"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:153
+msgid "pp"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:154
+msgid "p"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:155
+msgid "mp"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:156
+msgid "mf"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:157
+msgid "f"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:158
+msgid "ff"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:159
+msgid "fff"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:160
+msgid "rfz"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:161
+msgid "sf"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:165
+#, fuzzy
+msgid "Direction: "
+msgstr "Direcció"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:174
+msgid " ,"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:175
+msgid "D.C. al Fine"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:176
+msgid "D.S. al Fine"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:177
+#, fuzzy
+msgid "Fine"
+msgstr "Digitació"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:178
+msgid "D.S. al Coda"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:179
+#, fuzzy
+msgid "to Coda"
+msgstr " Acord"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:180
+#, fuzzy
+msgid "Coda"
+msgstr "Codis"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:184
+#, fuzzy
+msgid "Local Direction: "
+msgstr "Direcció local"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:188
+#, fuzzy
+msgid "accel."
+msgstr "C&ancel·la"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:189
+msgid "ritard."
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:190
+msgid "ralletando"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:191
+#, fuzzy
+msgid "a tempo"
+msgstr "Nou tempo:"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:192
+#, fuzzy
+msgid "legato"
+msgstr "&Lligat"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:193
+#, fuzzy
+msgid "simile"
+msgstr "Temps"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:194
+msgid "pizz."
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:195
+#, fuzzy
+msgid "arco"
+msgstr "&Marcato"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:196
+msgid "non vib."
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:197
+msgid "sul pont."
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:198
+#: ../src/gui/dialogs/TextEventDialog.cpp:200
+msgid "sul tasto"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:199
+msgid "con legno"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:201
+msgid "sul G"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:202
+msgid "ordinario"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:203
+#, fuzzy
+msgid "Muta in "
+msgstr "Sosté"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:204
+msgid "volti subito "
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:205
+msgid "soli"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:206
+msgid "div."
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:210
+#, fuzzy
+msgid "Tempo: "
+msgstr "Tempo "
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:214
+#: ../src/gui/dialogs/TextEventDialog.cpp:238
+#, fuzzy
+msgid "Grave"
+msgstr "Grec"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:215
+#: ../src/gui/dialogs/TextEventDialog.cpp:239
+#, fuzzy
+msgid "Adagio"
+msgstr "Àudio"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:216
+#: ../src/gui/dialogs/TextEventDialog.cpp:240
+msgid "Largo"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:217
+#: ../src/gui/dialogs/TextEventDialog.cpp:241
+#, fuzzy
+msgid "Lento"
+msgstr "&Lligat"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:218
+#: ../src/gui/dialogs/TextEventDialog.cpp:242
+#, fuzzy
+msgid "Andante"
+msgstr "Avançat"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:219
+#: ../src/gui/dialogs/TextEventDialog.cpp:243
+#, fuzzy
+msgid "Moderato"
+msgstr "Mordent"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:220
+#: ../src/gui/dialogs/TextEventDialog.cpp:244
+msgid "Allegretto"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:221
+#: ../src/gui/dialogs/TextEventDialog.cpp:245
+msgid "Allegro"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:222
+#: ../src/gui/dialogs/TextEventDialog.cpp:246
+msgid "Vivace"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:223
+#: ../src/gui/dialogs/TextEventDialog.cpp:247
+#, fuzzy
+msgid "Presto"
+msgstr "silenci"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:224
+#: ../src/gui/dialogs/TextEventDialog.cpp:248
+#, fuzzy
+msgid "Prestissimo"
+msgstr "Presentació"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:225
+#: ../src/gui/dialogs/TextEventDialog.cpp:249
+#, fuzzy
+msgid "Maestoso"
+msgstr "Maestro"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:226
+#: ../src/gui/dialogs/TextEventDialog.cpp:250
+#, fuzzy
+msgid "Sostenuto"
+msgstr "T&enuto"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:227
+#: ../src/gui/dialogs/TextEventDialog.cpp:251
+#, fuzzy
+msgid "Tempo Primo"
+msgstr "Tempo "
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:234
+#, fuzzy
+msgid "Local Tempo: "
+msgstr "Tempo local"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:255
+#, fuzzy
+msgid "Directive: "
+msgstr "Direcció"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:312
+msgid "Example"
+msgstr "Exemple"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:65
+msgid "Event Filter"
+msgstr "Filtre d'esdeveniments"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:86
+msgid "Note Events"
+msgstr "Esdeveniments de nota"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:90
+msgid "lowest:"
+msgstr ""
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:93
+msgid "highest:"
+msgstr ""
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:96
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:141
+#: ../src/gui/widgets/PitchChooser.cpp:53
+msgid "Pitch:"
+msgstr "Altura:"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:99
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:163
+msgid "Velocity:"
+msgstr "Velocitat:"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:102
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:129
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:257
+msgid "Duration:"
+msgstr "Duració:"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:107
+#: ../src/gui/dialogs/EventFilterDialog.cpp:114
+#: ../src/gui/dialogs/EventFilterDialog.cpp:121
+msgid "include"
+msgstr "inclou"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:108
+#: ../src/gui/dialogs/EventFilterDialog.cpp:115
+#: ../src/gui/dialogs/EventFilterDialog.cpp:122
+msgid "exclude"
+msgstr "exclou"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:136
+#: ../src/gui/dialogs/EventFilterDialog.cpp:155
+#: ../src/gui/editors/eventlist/EventView.cpp:172
+#: ../src/gui/editors/eventlist/EventView.cpp:179
+#: ../src/gui/editors/eventlist/EventView.cpp:186
+#, fuzzy
+msgid "edit"
+msgstr "Editor"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:141
+#: ../src/gui/dialogs/EventFilterDialog.cpp:157
+msgid "choose a pitch using a staff"
+msgstr "tria una altura de nota fent servir una vara"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:182
+#: ../src/gui/dialogs/EventFilterDialog.cpp:188
+msgid "longest"
+msgstr ""
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:200
+msgid "Include all"
+msgstr "Inclou-ho tot"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:203
+msgid "Include entire range of values"
+msgstr "Inclou l'abast dels valors complet"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:206
+msgid "Exclude all"
+msgstr "Exclou-ho tot"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:209
+msgid "Exclude entire range of values"
+msgstr "Exclou l'abast dels valors complet"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:233
+#: ../src/gui/dialogs/EventFilterDialog.cpp:234
+#, fuzzy
+msgid "shortest"
+msgstr "silenci"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:333
+#, fuzzy
+msgid "Lowest pitch"
+msgstr "Altura de la nota:"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:343
+#, fuzzy
+msgid "Highest pitch"
+msgstr "Altura de la clau;"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:56
+#: ../src/gui/editors/notation/NotationView.cpp:1619
+#: ../src/gui/editors/notation/NotationView.cpp:6088
+msgid "Use Ornament"
+msgstr "Fes servir l'ornamentació"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:260
+#: ../src/gui/configuration/NotationConfigurationPage.h:64
+#: ../src/gui/configuration/NotationConfigurationPage.h:65
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:63
+msgid "Notation"
+msgstr "Partitura"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:68
+msgid "Display as: "
+msgstr "Visualitza com: "
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:84
+msgid "Trill"
+msgstr "Trinat"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:84
+msgid "Trill with line"
+msgstr "Trinat amb línia"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:84
+msgid "Trill line only"
+msgstr "Només línia de trinat"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:85
+msgid "Turn"
+msgstr "Grupet"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:85
+msgid "Mordent"
+msgstr "Mordent"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:85
+msgid "Inverted mordent"
+msgstr "Mordent invertit"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:86
+msgid "Long mordent"
+msgstr "Mordent llarg"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:86
+msgid "Long inverted mordent"
+msgstr "Mordent llarg invertit"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:94
+msgid "Text mark"
+msgstr "Marca de text"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:98
+msgid " Text: "
+msgstr " Text: "
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:104
+msgid "Performance"
+msgstr "Interpretació"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:109
+msgid "Perform using triggered segment: "
+msgstr "Interpreta amb el fragment activable: "
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:75
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:123
+msgid "Perform with timing: "
+msgstr "Interpreta amb el temps: "
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:81
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:129
+msgid "As stored"
+msgstr "Tal com s'emmagatzemà"
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:82
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:130
+msgid "Truncate if longer than note"
+msgstr "Trunca, si és més llarg que la nota"
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:83
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:131
+msgid "End at same time as note"
+msgstr "Finalitza al mateix temps que la nota"
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:84
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:132
+msgid "Stretch or squash segment to note duration"
+msgstr "Estira o comprimeix el fragment a la durada de la nota"
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:86
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:134
+msgid "Adjust pitch to note"
+msgstr "Ajusta l'altura de la nota"
+
+#: ../src/gui/dialogs/PitchPickerDialog.cpp:40
+msgid "Pitch Selector"
+msgstr "Selector de l'alçada de la nota"
+
+#: ../src/gui/dialogs/BeatsBarsDialog.cpp:44
+msgid "Audio Segment Duration"
+msgstr "Durada del fragment d'àudio"
+
+#: ../src/gui/dialogs/BeatsBarsDialog.cpp:50
+msgid "The selected audio segment contains:"
+msgstr "El fragment d'àudio seleccionat conté:"
+
+#: ../src/gui/dialogs/BeatsBarsDialog.cpp:59
+msgid "beat(s)"
+msgstr "pulsació(ons)"
+
+#: ../src/gui/dialogs/BeatsBarsDialog.cpp:60
+msgid "bar(s)"
+msgstr "compàs(assos)"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:51
+msgid "Tuplet"
+msgstr "Grup irregular"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:58
+msgid "New timing for tuplet group"
+msgstr "Temps nou per al grup irregular"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:76
+msgid "Play "
+msgstr "Reprodueix "
+
+#: ../src/gui/dialogs/TupletDialog.cpp:98
+msgid "in the time of "
+msgstr "en el temps de "
+
+#: ../src/gui/dialogs/TupletDialog.cpp:104
+msgid "Timing is already correct: update display only"
+msgstr "El temps ja és correcte: s'actualitzarà només la presentació"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:114
+msgid "Timing calculations"
+msgstr "Càlculs de temps"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:120
+msgid "Selected region:"
+msgstr "Regió seleccionada:"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:129
+msgid "Group with current timing:"
+msgstr "Agrupa amb el temps actual:"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:135
+msgid "Group with new timing:"
+msgstr "Agrupa amb el temps nou:"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:141
+msgid "Gap created by timing change:"
+msgstr "Buit creat pel canvi de temps:"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:149
+msgid "Unchanged at end of selection:"
+msgstr "Cap canvi al final de la selecció:"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:63 rc.cpp:372
+#, no-c-format
+msgid "Metronome"
+msgstr "Metrònom"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:77
+msgid "Metronome Instrument"
+msgstr "Instrument del metrònom"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:82
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:150
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:183
+#: ../src/gui/studio/DeviceEditorDialog.cpp:73
+#: ../src/gui/studio/DeviceManagerDialog.cpp:105
+#: ../src/gui/studio/DeviceManagerDialog.cpp:163
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:66
+msgid "Device"
+msgstr "Dispositiu"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:101
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:89
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:215
+#: ../src/gui/studio/DeviceEditorDialog.cpp:195
+#: ../src/gui/studio/DeviceEditorDialog.cpp:218
+#: ../src/gui/studio/DeviceEditorDialog.cpp:230
+#: ../src/gui/studio/DeviceManagerDialog.cpp:196
+#: ../src/gui/studio/DeviceManagerDialog.cpp:440
+#: ../src/gui/studio/DeviceManagerDialog.cpp:452
+msgid "No connection"
+msgstr "Sense connexió"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:112
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:111
+#: ../src/gui/editors/parameters/InstrumentParameterBox.cpp:53
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:1209
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:159
+#: ../src/gui/general/PresetHandlerDialog.cpp:92
+#: ../src/gui/studio/MidiMixerWindow.cpp:204
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:67
+msgid "Instrument"
+msgstr "Instrument"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:118
+msgid "Beats"
+msgstr "Pulsacions"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:184
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:123
+msgid "Resolution"
+msgstr "Resolució"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:309
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:139
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:205
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:125
+#: ../src/gui/editors/matrix/MatrixView.cpp:2132
+#: ../src/gui/editors/notation/NotationView.cpp:1582
+#: ../src/gui/widgets/QuantizeParameters.cpp:128
+#: ../src/gui/widgets/QuantizeParameters.cpp:301
+msgid "None"
+msgstr "Cap"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:126
+msgid "Bars only"
+msgstr "Només els compassos"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:127
+msgid "Bars and beats"
+msgstr "Compassos i pulsacions"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:128
+msgid "Bars, beats, and divisions"
+msgstr "Compassos, pulsacions i divisions"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:132
+msgid "Bar velocity"
+msgstr "Velocitat del compàs"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:139
+msgid "Beat velocity"
+msgstr "Velocitat de la pulsació"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:146
+msgid "Sub-beat velocity"
+msgstr "Velocitat de la subpulsació"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:155
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:324
+msgid "Pitch"
+msgstr "Altura"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:160
+msgid "for Bar"
+msgstr "per al compàs"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:161
+msgid "for Beat"
+msgstr "Per pulsació"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:162
+msgid "for Sub-beat"
+msgstr "Per subpulsació"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:166
+msgid "Metronome Activated"
+msgstr "Metrònom activat"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:167
+msgid "Playing"
+msgstr "S'està reproduint"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:168
+msgid "Recording"
+msgstr "S'està enregistrant"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:46
+msgid "Choose Text Encoding"
+msgstr "Selecciona la codificació del text"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:50
+msgid ""
+"\n"
+"This file contains text in an unknown language encoding.\n"
+"\n"
+"Please select one of the following estimated text encodings\n"
+"for use with the text in this file:\n"
+msgstr ""
+"\n"
+"Aquest fitxer conté text en un codificació desconeguda.\n"
+"\n"
+"Seleccioneu un de les següents codificacions possibles\n"
+"per utilitzar-la amb aquest fitxer:\n"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:61
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:77
+msgid "Japanese Shift-JIS"
+msgstr "Japonès Shift-JIS"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:62
+msgid "Unicode variable-width"
+msgstr "Unicode de mida varible"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:63
+msgid "Western Europe"
+msgstr "Europa occidental"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:64
+msgid "Western Europe + Euro"
+msgstr "Europa occidental + Euro"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:65
+msgid "Eastern Europe"
+msgstr "Europa de l'Est"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:66
+msgid "Southern Europe"
+msgstr "Sud d'Europa"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:67
+msgid "Northern Europe"
+msgstr "Nord d'Europa"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:68
+msgid "Cyrillic"
+msgstr "Ciríl·lic"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:69
+msgid "Arabic"
+msgstr "Àrab"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:70
+msgid "Greek"
+msgstr "Grec"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:71
+msgid "Hebrew"
+msgstr "Hebreu"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:72
+msgid "Turkish"
+msgstr "Turc"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:73
+msgid "Nordic"
+msgstr "Nòrdic"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:74
+msgid "Thai"
+msgstr "Tai"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:75
+msgid "Baltic"
+msgstr "Bàltic"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:76
+msgid "Celtic"
+msgstr "Celta"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:78
+msgid "Traditional Chinese"
+msgstr "Xinès tradicional"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:79
+msgid "Simplified Chinese"
+msgstr "Xinès simplificat"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:80
+msgid "Russian"
+msgstr "Rus"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:81
+msgid "Ukrainian"
+msgstr "Ucraïnès"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:82
+msgid "Tamil"
+msgstr "Tàmil"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:117
+#, c-format
+msgid "Microsoft Code Page %1"
+msgstr "Còdi de pàgina Microsoft %1"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:123
+#: ../src/gui/editors/matrix/MatrixView.cpp:1490
+msgid "%1 (%2)"
+msgstr "%1 (%2)"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:142
+msgid ""
+"\n"
+"Example text from file:"
+msgstr ""
+"\n"
+"Exemple del text del fitxer:"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:59
+#: ../src/gui/editors/tempo/TempoView.cpp:92
+msgid "Time Signature"
+msgstr "Indicació de compàs"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:82
+msgid "Time signature"
+msgstr "Indicació de compàs"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:116
+msgid "Time where signature takes effect"
+msgstr "Temps on l'armadura fa efecte"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:83
+#: ../src/gui/dialogs/TempoDialog.cpp:128
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:129
+#: ../src/gui/general/PresetHandlerDialog.cpp:101
+msgid "Scope"
+msgstr "Àmbit"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:141
+#, c-format
+msgid "Insertion point is at start of measure %1."
+msgstr "El punt d'inserció és al començament del compàs %1"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:145
+#, c-format
+msgid "Insertion point is in the middle of measure %1."
+msgstr "El punt d'inserció és al mig del compàs %1."
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:150
+msgid "Insertion point is at start of composition."
+msgstr "El punt d'inserció és al començament de la composició"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:155
+msgid "Start measure %1 here"
+msgstr "Inicia el compàs %1 aquí"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:159
+#, fuzzy, c-format
+msgid "Change time from start of measure %1"
+msgstr "Canvia el temps des de l'inici del compàs %1"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:166
+#, c-format
+msgid "Time change will take effect at the start of measure %1."
+msgstr "El canvi del temps tindrà efecte a l'inici del compàs %1."
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:176
+#, fuzzy
+msgid "Hide the time signature"
+msgstr "Amaga la indicació de compàs"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:181
+#, fuzzy
+msgid "Hide the affected bar lines"
+msgstr "Lliga les notes a les barres etc"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:186
+msgid "Show as common time"
+msgstr "Mostra com a temps comú"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:191
+msgid "Correct the durations of following measures"
+msgstr "Corregeix la durada dels compassos que segueixen"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:280
+msgid "Display as common time"
+msgstr "Visualitza com a temps comú"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:284
+msgid "Display as cut common time"
+msgstr "Visualitza com a temps comú incomplet"
+
+#: ../src/gui/dialogs/ConfigureDialog.cpp:66
+msgid "Configure Rosegarden"
+msgstr "Configuració del Rosegarden"
+
+#: ../src/gui/dialogs/MarkerModifyDialog.cpp:53
+#: ../src/gui/dialogs/MarkerModifyDialog.cpp:61
+msgid "Edit Marker"
+msgstr "Edita el marcador"
+
+#: ../src/gui/dialogs/MarkerModifyDialog.cpp:78
+msgid "Marker Time"
+msgstr "Temps del marcador"
+
+#: ../src/gui/dialogs/MarkerModifyDialog.cpp:94
+msgid "Marker Properties"
+msgstr "Propietats del marcador"
+
+#: ../src/gui/dialogs/MarkerModifyDialog.cpp:100
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:554
+msgid "Text:"
+msgstr "Text:"
+
+#: ../src/gui/dialogs/MarkerModifyDialog.cpp:104
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:85
+msgid "Description:"
+msgstr "Descripció:"
+
+#: ../src/gui/dialogs/FileMergeDialog.cpp:46
+msgid "Merge File"
+msgstr "Fusiona el fitxer"
+
+#: ../src/gui/dialogs/FileMergeDialog.cpp:53
+msgid "Merge new file "
+msgstr "Fusiona el nou fitxer "
+
+#: ../src/gui/dialogs/FileMergeDialog.cpp:56
+msgid "At start of existing composition"
+msgstr "Al començament d'una composició ja existent"
+
+#: ../src/gui/dialogs/FileMergeDialog.cpp:57
+msgid "From end of existing composition"
+msgstr "Des del final d'una composició ja existent"
+
+#: ../src/gui/dialogs/FileMergeDialog.cpp:61
+msgid "The file has different time signatures or tempos."
+msgstr "El fitxer té diferents indicacions de compàs o tempos."
+
+#: ../src/gui/dialogs/FileMergeDialog.cpp:62
+msgid "Import these as well"
+msgstr "Importa també aquests"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:171
+#: ../src/gui/dialogs/ShowSequencerStatusDialog.cpp:44
+msgid "Sequencer status"
+msgstr "Estat del seqüenciador"
+
+#: ../src/gui/dialogs/ShowSequencerStatusDialog.cpp:48
+msgid "Sequencer status:"
+msgstr "Estat del seqüenciador:"
+
+#: ../src/gui/dialogs/ShowSequencerStatusDialog.cpp:50
+msgid "Status not available."
+msgstr "Estat no disponible."
+
+#: ../src/gui/dialogs/ShowSequencerStatusDialog.cpp:57
+msgid "Sequencer is not running or is not responding."
+msgstr "El seqüenciador no s'està executant o bé no respon."
+
+#: ../src/gui/dialogs/ShowSequencerStatusDialog.cpp:64
+msgid "Sequencer is not returning a valid status report."
+msgstr "El seqüenciador no respon amb un informe d'estat vàlid."
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:46
+#, fuzzy
+msgid "Add Tracks"
+msgstr "Afegeix una &pista"
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:54
+msgid "How many tracks do you want to add?"
+msgstr "Quantes pistes voleu afegir?"
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:62
+#, fuzzy
+msgid "Add tracks"
+msgstr "Afegeix vàries pistes"
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:64
+msgid "At the top"
+msgstr ""
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:65
+#, fuzzy
+msgid "Above the current selected track"
+msgstr "Posa silencia a totes les pistes excepte la seleccionada"
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:66
+#, fuzzy
+msgid "Below the current selected track"
+msgstr "Posa silencia a totes les pistes excepte la seleccionada"
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:67
+msgid "At the bottom"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:75
+msgid "Event Properties"
+msgstr "Propietats de l'esdeveniment"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:81
+msgid "Event type:"
+msgstr "Tipus d'esdeveniment"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:117
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:251
+#: ../src/gui/editors/segment/MarkerEditor.cpp:97
+msgid "Absolute time:"
+msgstr "Temps absolut:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:156
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:323
+msgid "Controller name:"
+msgstr "Nom del controlador:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:157
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:530
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:562
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:563
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:602
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:631
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:267
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:269
+#: ../src/gui/editors/segment/MarkerEditor.cpp:279
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:272
+#: ../src/gui/studio/AudioMixerWindow.cpp:388
+#: ../src/gui/studio/AudioMixerWindow.cpp:519
+#: ../src/gui/studio/AudioMixerWindow.cpp:683
+#: ../src/gui/studio/AudioMixerWindow.cpp:722
+#: ../src/gui/studio/AudioMixerWindow.cpp:904
+#: ../src/gui/studio/SynthPluginManagerDialog.cpp:121
+msgid "<none>"
+msgstr "<cap>"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:174
+msgid "Meta string:"
+msgstr "Cadena meta:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:179
+msgid "Load data"
+msgstr "Carrega les dades"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:181
+msgid "Save data"
+msgstr "Desa les dades"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:192
+msgid "Notation Properties"
+msgstr "Propietats de la notació"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:198
+msgid "Lock to changes in performed values"
+msgstr "Fixa els canvis en els valors executats"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:205
+msgid "Notation time:"
+msgstr "Temps de notació:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:217
+msgid "Notation duration:"
+msgstr "Duració de la notació:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:283
+msgid "Note pitch:"
+msgstr "Altura de la nota:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:291
+msgid "Note velocity:"
+msgstr "Velocitat de la nota:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:317
+msgid "Controller number:"
+msgstr "Número de controlador:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:326
+msgid "Controller value:"
+msgstr "Valor del controlador:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:354
+msgid "Key pitch:"
+msgstr "Altura de la clau;"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:362
+msgid "Key pressure:"
+msgstr "Pressió de la tecla:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:390
+msgid "Channel pressure:"
+msgstr "Pressió del canal:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:418
+msgid "Program change:"
+msgstr "Canvio de programa:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:461
+msgid "Data length:"
+msgstr "Longitud de les dades:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:462
+msgid "Data:"
+msgstr "Dades:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:480
+msgid "Pitchbend MSB:"
+msgstr "Inflexió MSB:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:488
+msgid "Pitchbend LSB:"
+msgstr "Inflexió LSB:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:523
+msgid "Indication:"
+msgstr "Indicació:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:553
+msgid "Text type:"
+msgstr "Tipus de text:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:596
+msgid "Clef type:"
+msgstr "Tipus de clau:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:625
+msgid "Key name:"
+msgstr "Nom de la clau:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:674
+msgid "Unsupported event type:"
+msgstr "Tipus d'esdeveniment desconegut:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:931
+msgid "Edit Event Time"
+msgstr "Edita el temps de l'esdeveniment"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:943
+msgid "Edit Event Notation Time"
+msgstr "Edita el temps de notació de l'esdeveniment"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:955
+msgid "Edit Duration"
+msgstr "Edita la duració"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:968
+msgid "Edit Notation Duration"
+msgstr "Edita la duració de la notació"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:981
+msgid "Edit Pitch"
+msgstr "Edita l'altura"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:991
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:1016
+msgid "*.syx|System exclusive files (*.syx)"
+msgstr "*.syx|Fitxers de sistema exclusiu (*.syx)"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:992
+msgid "Load System Exclusive data in File"
+msgstr "Carrega les dades del sistema exclusiu en el fitxer"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:1017
+msgid "Save System Exclusive data to..."
+msgstr "Desa les dades del sistema exclusiu a..."
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:46
+msgid "Locate audio file"
+msgstr "Busca el fitxer d'àudio"
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:50
+msgid "&Skip"
+msgstr "&Omet"
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:51
+msgid "Skip &All"
+msgstr "O&met tot"
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:52
+msgid "&Locate"
+msgstr "&Localitza"
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:57
+msgid ""
+"Can't find file \"%1\".\n"
+"Would you like to try and locate this file or skip it?"
+msgstr ""
+"No es pot trobar el fitxer \"%1\".\n"
+"Voleu intentar buscar i localitzar-lo o voleu ometre'l?"
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:71
+msgid ""
+"%1|Requested file (%2)\n"
+"*.wav|WAV files (*.wav)"
+msgstr ""
+"%1|Fitxer demanat (%2)\n"
+"*.wav|fitxers WAV (*.wav)"
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:74
+msgid "Select an Audio File"
+msgstr "Selecciona un fitxer d'àudio"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:53 ../src/gui/dialogs/ClefDialog.cpp:62
+#: ../src/gui/dialogs/ClefDialog.cpp:79 ../src/gui/dialogs/ClefDialog.cpp:90
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:278
+msgid "Clef"
+msgstr "Clau"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:65
+msgid "Existing notes following clef change"
+msgstr "Hi han notes a continuació del canvi de clau"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:71
+msgid "Lower clef"
+msgstr "Clau més greu"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:77
+msgid "Up an Octave"
+msgstr "Pujar una octava"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:84
+msgid "Down an Octave"
+msgstr "Baixar una octava"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:88
+msgid "Higher clef"
+msgstr "Clau més aguda"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:96
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:152
+msgid "Maintain current pitches"
+msgstr "Manté els tons actuals"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:99
+msgid "Transpose into appropriate octave"
+msgstr "Transposa a l'octava apropiada"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:231
+msgid "%1 down an octave"
+msgstr "%1 una octava avall"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:234
+msgid "%1 down two octaves"
+msgstr "%1 dues octaves avall"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:237
+msgid "%1 up an octave"
+msgstr "%1 una octava amunt"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:240
+msgid "%1 up two octaves"
+msgstr "%1 dues octaves amunt"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:249
+msgid "Treble"
+msgstr "Soprano"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:251
+#, fuzzy
+msgid "French violin"
+msgstr "traducció al francès"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:253
+#, fuzzy
+msgid "Soprano"
+msgstr "S&forzando"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:255
+#, fuzzy
+msgid "Mezzo-soprano"
+msgstr "S&forzando"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:257
+msgid "Alto"
+msgstr "Alto"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:259
+msgid "Tenor"
+msgstr "Tenor"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:261
+#, fuzzy
+msgid "C-baritone"
+msgstr "Variació"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:263
+#, fuzzy
+msgid "F-baritone"
+msgstr "Variació"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:265
+msgid "Bass"
+msgstr "Baix"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:267
+#, fuzzy
+msgid "Sub-bass"
+msgstr "Baix"
+
+#: ../src/gui/dialogs/CountdownDialog.cpp:52
+msgid "Recording..."
+msgstr "S'està enregistrant..."
+
+#: ../src/gui/dialogs/CountdownDialog.cpp:60
+msgid "Recording time remaining: "
+msgstr "Temps restant de l'enregistrament: "
+
+#: ../src/gui/dialogs/CountdownDialog.cpp:120
+msgid "Just how big is your hard disk?"
+msgstr "Quina és la capacitat del vostre disc dur?"
+
+#: ../src/gui/dialogs/CountdownDialog.cpp:154
+msgid "Recording beyond end of composition: "
+msgstr "Grava fins i tot després del final de la composició: "
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:52
+msgid "Specify Interval"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:58
+msgid "Reference note:"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:59
+#, fuzzy
+msgid "Target note:"
+msgstr "negra"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:68
+#: ../src/gui/dialogs/IntervalDialog.cpp:315
+msgid "a perfect unison"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:76
+msgid "Effect on Key"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:77
+#, fuzzy
+msgid "Transpose within key"
+msgstr "Transposa a aquesta clau"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:79
+#, fuzzy
+msgid "Change key for selection"
+msgstr "Cap canvi al final de la selecció:"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:89
+msgid ""
+"Adjust segment transposition in opposite direction (maintain audible pitch)"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:190
+#: ../src/gui/dialogs/IntervalDialog.cpp:220
+msgid "a diminished"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:192
+#: ../src/gui/dialogs/IntervalDialog.cpp:222
+msgid "an augmented"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:194
+#: ../src/gui/dialogs/IntervalDialog.cpp:224
+msgid "a doubly diminished"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:196
+#: ../src/gui/dialogs/IntervalDialog.cpp:226
+msgid "a doubly augmented"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:198
+#: ../src/gui/dialogs/IntervalDialog.cpp:228
+msgid "a triply diminished"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:200
+#: ../src/gui/dialogs/IntervalDialog.cpp:230
+msgid "a triply augmented"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:202
+msgid "a quadruply diminished"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:204
+#: ../src/gui/dialogs/IntervalDialog.cpp:232
+msgid "a quadruply augmented"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:206
+#: ../src/gui/dialogs/IntervalDialog.cpp:234
+msgid "a perfect"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:208
+#: ../src/gui/dialogs/IntervalDialog.cpp:236
+msgid "an (unknown, %1)"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:216
+#, fuzzy
+msgid "a minor"
+msgstr "Menor"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:218
+#, fuzzy
+msgid "a major"
+msgstr "Major"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:239
+#, fuzzy
+msgid "an (unknown)"
+msgstr "Desconegut/da"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:248
+#: ../src/gui/dialogs/IntervalDialog.cpp:251
+#, fuzzy
+msgid "%1 octave"
+msgstr "%1 una octava amunt"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:254
+#, fuzzy
+msgid "%1 unison"
+msgstr "unitats"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:258
+#, fuzzy
+msgid "%1 second"
+msgstr "Segons:"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:261
+#, fuzzy
+msgid "%1 third"
+msgstr "Altre"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:264
+#, fuzzy
+msgid "%1 fourth"
+msgstr "%1 bemoll"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:267
+#, fuzzy
+msgid "%1 fifth"
+msgstr "Altura"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:270
+#, fuzzy
+msgid "%1 sixth"
+msgstr "Altura"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:273
+#, fuzzy
+msgid "%1 seventh"
+msgstr "Redimensiona l'esdeveniment"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:276
+#: ../src/gui/studio/DeviceManagerDialog.cpp:329
+#: ../src/gui/studio/DeviceManagerDialog.cpp:363
+#, c-format
+msgid "%1"
+msgstr "%1"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:287
+msgid ""
+"_n: up 1 octave and %1\n"
+"up %n octaves and %1"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:291
+#, c-format
+msgid ""
+"_n: up 1 octave\n"
+"up %n octaves"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:295
+#, fuzzy, c-format
+msgid "up %1"
+msgstr "Sub %1"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:303
+msgid ""
+"_n: down 1 octave and %1\n"
+"down %n octaves and %1"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:307
+#, fuzzy, c-format
+msgid ""
+"_n: down 1 octave\n"
+"down %n octaves"
+msgstr ""
+"%1 en 1 pista\n"
+"%1 en %n pistes"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:311
+#, fuzzy, c-format
+msgid "down %1"
+msgstr "Id: %1"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:81
+msgid "Intrinsics"
+msgstr "Intrínsecs"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:85
+msgid "Event type: "
+msgstr "Tipus d'esdeveniment: "
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:91
+msgid "Absolute time: "
+msgstr "Temps absolut: "
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:101
+msgid "Duration: "
+msgstr "Duració: "
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:114
+msgid "Sub-ordering: "
+msgstr "Subordre: "
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:125
+msgid "Persistent properties"
+msgstr "Propietats persistents"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:169
+#: ../src/gui/dialogs/EventEditDialog.cpp:133
+#: ../src/gui/studio/BankEditorDialog.cpp:129
+#: ../src/gui/studio/DeviceEditorDialog.cpp:75
+msgid "Type"
+msgstr "Tipus"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:184
+#: ../src/gui/dialogs/EventEditDialog.cpp:135
+#: ../src/gui/dialogs/EventParameterDialog.cpp:89
+#: ../src/gui/dialogs/EventParameterDialog.cpp:93
+#: ../src/gui/dialogs/EventParameterDialog.cpp:115
+msgid "Value"
+msgstr "Valor"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:155
+msgid "Non-persistent properties"
+msgstr "Propietats no persistents"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:156
+msgid "These are cached values, lost if the event is modified."
+msgstr ""
+"Aquests valors estan en la memòria cau i es perdran al modificar la "
+"incidència"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:170
+msgid "Name "
+msgstr "Nom "
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:172
+msgid "Type "
+msgstr "Tipus "
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:174
+msgid "Value "
+msgstr "Valor "
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:188
+msgid "Make persistent"
+msgstr "Fes persistent"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:292
+msgid "Delete this property"
+msgstr "Suprimeix aquesta propietat"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:433
+msgid ""
+"Are you sure you want to delete the \"%1\" property?\n"
+"\n"
+"Removing necessary properties may cause unexpected behavior."
+msgstr ""
+"Esteu segur de voler suprimir la propietat \"%1\"?\n"
+"\n"
+"La supressió d'una propietat necessària pot causar un comportament inesperat."
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:436
+#: ../src/gui/dialogs/EventEditDialog.cpp:469
+msgid "Edit Event"
+msgstr "Edita l'esdeveniment"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:465
+msgid ""
+"Are you sure you want to make the \"%1\" property persistent?\n"
+"\n"
+"This could cause problems if it overrides a different computed value later "
+"on."
+msgstr ""
+"Esteu segur de voler fer persistent la propietat \"%1\"?\n"
+"\n"
+"Això pot causar problemes si, més endavant, se substitueix per un valor "
+"calculat diferent."
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:470
+msgid "Make &Persistent"
+msgstr "Fer &persistent"
+
+#: ../src/gui/dialogs/PasteNotationDialog.cpp:52
+msgid "Paste type"
+msgstr "Forma d'enganxar"
+
+#: ../src/gui/dialogs/PasteNotationDialog.cpp:72
+msgid "Make this the default paste type"
+msgstr "Enganxa d'aquesta forma a partir d'ara"
+
+#: ../src/gui/dialogs/LyricEditDialog.cpp:53
+msgid "Edit Lyrics"
+msgstr "Edita la lírica"
+
+#: ../src/gui/dialogs/LyricEditDialog.cpp:62
+msgid "Lyrics for this segment"
+msgstr "Lírica per aquest fragment"
+
+#: ../src/gui/dialogs/LyricEditDialog.cpp:70
+#, fuzzy
+msgid "Add Verse"
+msgstr "Afegeix un &decrescendo..."
+
+#: ../src/gui/dialogs/LyricEditDialog.cpp:84
+#: ../src/gui/dialogs/LyricEditDialog.cpp:106
+#, c-format
+msgid "Verse %1"
+msgstr ""
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:59
+msgid "Import from Device..."
+msgstr "Importa des del dispositiu..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2163
+#: ../src/gui/application/RosegardenGUIApp.cpp:2229
+#: ../src/gui/application/RosegardenGUIApp.cpp:7780
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:87
+#: ../src/sound/AudioFileManager.cpp:664
+#, c-format
+msgid "Cannot download file %1"
+msgstr "No s'ha pogut descarregar el fitxer %1"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:99
+#, c-format
+msgid "Cannot open file %1"
+msgstr "No s'ha pogut obrir el fitxer %1"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:106
+#, c-format
+msgid "No devices found in file %1"
+msgstr "No s'han trobat dispositius en el fitxer %1"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:113
+msgid "Source device"
+msgstr "Dispositiu d'origen"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:118
+msgid "Import from: "
+msgstr "Importa des de: "
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:140
+#: ../src/gui/studio/DeviceEditorDialog.cpp:148
+#, c-format
+msgid "Device %1"
+msgstr "Dispositiu %1"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:155
+msgid "Import banks"
+msgstr "Importa bancs"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:156
+msgid "Import key mappings"
+msgstr "Importa dreceres"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:157
+msgid "Import controllers"
+msgstr "Importa controladors"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:160
+msgid "Import device name"
+msgstr "Nom del dispositiu importat"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:166
+msgid "Bank import behavior"
+msgstr "Comportament de la importació de bancs"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:168
+msgid "Merge banks"
+msgstr "Fusiona els bancs"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:169
+msgid "Overwrite banks"
+msgstr "Sobreescriu els bancs"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:367
+msgid "Bank %1:%2"
+msgstr "Banc %1 %2"
+
+#: ../src/commands/segment/SegmentSplitByRecordingSrcCommand.cpp:42
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:48
+msgid "Split by Recording Source"
+msgstr "Divideix segons l'origen"
+
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:53
+#, fuzzy
+msgid "Recording Source"
+msgstr "Origen de l'entrada del registre"
+
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:57
+#, fuzzy
+msgid "Channel:"
+msgstr "Canal"
+
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:64
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:75
+msgid "any"
+msgstr "qualsevol"
+
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:69
+#, fuzzy
+msgid "Device:"
+msgstr "Dispositiu"
+
+#: ../src/gui/dialogs/UnusedAudioSelectionDialog.cpp:46
+msgid "Select Unused Audio Files"
+msgstr "Selecciona els fitxers d'àudio en desús"
+
+#: ../src/gui/dialogs/UnusedAudioSelectionDialog.cpp:53
+#: ../src/gui/editors/segment/PlayListView.cpp:36
+msgid "File name"
+msgstr "Nom del fitxer"
+
+#: ../src/gui/dialogs/UnusedAudioSelectionDialog.cpp:54
+msgid "File size"
+msgstr "Mida del fitxer"
+
+#: ../src/gui/dialogs/UnusedAudioSelectionDialog.cpp:55
+msgid "Last modified date"
+msgstr "Data de l'últim canvi"
+
+#: ../src/gui/dialogs/UnusedAudioSelectionDialog.cpp:60
+msgid " (not found) "
+msgstr " (no s'ha trobat) "
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:105
+msgid "Audio File Manager"
+msgstr "Gestor de fitxers d'àudio"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:126
+msgid ""
+"* Some audio files are encoded at a sample rate different from that of the "
+"JACK audio server.\n"
+"Rosegarden will play them at the correct speed, but they will sound "
+"terrible.\n"
+"Please consider resampling such files externally, or adjusting the sample "
+"rate of the JACK server."
+msgstr ""
+"* Alguns fitxers d'àudio estan codificats en un mostreig diferent del del "
+"JACK.\n"
+"El Rosegarden el reproduirà a la velocitat normal, però sonarà malament.\n"
+"Caldria reeditar els fitxers i ajustar el mostreig com el del servidor JACK."
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:132
+msgid "&Add Audio File..."
+msgstr "&Afegeix un fitxer d'àudio..."
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:135
+msgid "&Unload Audio File"
+msgstr "Descarrega &un fitxer d'àudio"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:140
+msgid "&Play Preview"
+msgstr "&Reprodueix una mostra"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:151
+msgid "&Insert into Selected Audio Track"
+msgstr "&Insereix dins de la pista d'àudio seleccionada"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:155
+msgid "Unload &all Audio Files"
+msgstr "Desc&arrega tots els fitxers d'àudio"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:159
+msgid "Unload all &Unused Audio Files"
+msgstr "Descarrega tots els fitxers d'à&udio en desús"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:163
+msgid "&Delete Unused Audio Files..."
+msgstr "Esborra tots els fitxers &d'àudio en desús..."
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:167
+msgid "&Export Audio File..."
+msgstr "&Exporta un fitxer d'àudio..."
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:173
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:180
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:91
+msgid "Duration"
+msgstr "Durada"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:181
+msgid "Envelope"
+msgstr "Sobre"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:182
+msgid "Sample rate"
+msgstr "Mostreig"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:183
+msgid "Channels"
+msgstr "Canals"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:282
+msgid "<no audio files>"
+msgstr "<cap fitxer d'àudio>"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:488
+msgid "*.wav|WAV files (*.wav)"
+msgstr "*.wav|fitxers WAV (*.wav)"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:489
+msgid "Choose a name to save this file as"
+msgstr "Escolliu un nom per desar el fitxer"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:499
+msgid "Exporting audio file..."
+msgstr "S'està exportant el fitxer d'àudio..."
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:609
+msgid ""
+"This will unload audio file \"%1\" and remove all associated segments. Are "
+"you sure?"
+msgstr ""
+"Això descarregarà el fitxer d''audio \"%1\" i esborrarà tots els fragments "
+"associats. Voleu continuar?"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:692
+#, fuzzy
+msgid ""
+"*.wav|WAV files (*.wav)\n"
+"*.*|All files"
+msgstr "*.wav|fitxers WAV (*.wav)"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:697
+msgid ""
+"*.wav *.flac *.ogg *.mp3|Audio files (*.wav *.flac *.ogg *.mp3)\n"
+"*.wav|WAV files (*.wav)\n"
+"*.flac|FLAC files (*.flac)\n"
+"*.ogg|Ogg files (*.ogg)\n"
+"*.mp3|MP3 files (*.mp3)\n"
+"*.*|All files"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:704
+msgid "Select one or more audio files"
+msgstr "Selecciona un o més fitxers d'àudio"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:763
+msgid ""
+"This will unload all audio files and remove their associated segments.\n"
+"This action cannot be undone, and associations with these files will be "
+"lost.\n"
+"Files will not be removed from your disk.\n"
+"Are you sure?"
+msgstr ""
+"Això descarregarà tots els fitxers d''audio i esborrarà tots els fragments "
+"associats. \n"
+"Aquesta acció no es pot desfer, i les fitxers associats es perdran.\n"
+"Tot i així els fitxers no s'esborraran del disc.\n"
+"Voleu continuar?"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:800
+msgid ""
+"This will unload all audio files that are not associated with any segments "
+"in this composition.\n"
+"This action cannot be undone, and associations with these files will be "
+"lost.\n"
+"Files will not be removed from your disk.\n"
+"Are you sure?"
+msgstr ""
+"Això descarregarà tots els fitxes d'àudio que no estan associats a cap "
+"fragment de la composició.\n"
+"Aquesta acció no es pot desfer, i els fitxers associats es perdran.\n"
+"Tot i així els fitxers no s'esborraran del disc.\n"
+"Voleu continuar?"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:865
+msgid ""
+"The following audio files are not used in the current composition.\n"
+"\n"
+"Please select the ones you wish to delete permanently from the hard disk.\n"
+msgstr ""
+"Els fitxers d'àudio següents no s'utilitzen en la composició.\n"
+"\n"
+"Seleccioneu els que voleu esborrar permanentment del disc dur.\n"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:875
+#, fuzzy, c-format
+msgid ""
+"_n: <qt>About to delete 1 audio file permanently from the hard disk.<br>This "
+"action cannot be undone, and there will be no way to recover this file."
+"<br>Are you sure?</qt>\n"
+"\n"
+"<qt>About to delete %n audio files permanently from the hard disk.<br>This "
+"action cannot be undone, and there will be no way to recover these files."
+"<br>Are you sure?</qt>"
+msgstr ""
+"_n: Si esborreu el fitxer d'àudio permanentment del disc dur,\n"
+"no podreu desfer aquesta acció i no es podrà recuperar el fitxer.\n"
+"Voleu continuar?\n"
+"_n: Si esborreu %n fitxers d'àudio permanentment del disc dur,\n"
+"no podreu desfer aquesta acció i no es podran recuperar els fitxers.\n"
+"Voleu continuar?"
+
+#: ../src/document/RosegardenGUIDoc.cpp:525
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:888
+msgid "File %1 could not be deleted."
+msgstr "No s'ha pogut esborrar el fitxer %1"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:921
+msgid "Change Audio File label"
+msgstr "Canvia l'etiqueta del fitxer d'àudio"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:6466
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:922
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:1099
+msgid "Enter new label"
+msgstr "Introduïu una nova etiqueta"
+
+#: ../src/gui/application/RosegardenGUIView.cpp:1538
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:1086
+#, fuzzy
+msgid "Adding audio file..."
+msgstr "S'està exportant el fitxer d'àudio..."
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:1107
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:1112
+#, fuzzy
+msgid "Failed to add audio file. "
+msgstr "El seqüenciador no ha pogut afegir el fitxer d'àduio %1"
+
+#: ../src/document/RosegardenGUIDoc.cpp:2789
+#: ../src/gui/application/RosegardenGUIApp.cpp:2736
+#: ../src/gui/application/RosegardenGUIView.cpp:1574
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:1122
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:180
+msgid "Generating audio preview..."
+msgstr "S'està generant una mostra d'àudio..."
+
+#: ../src/gui/application/RosegardenGUIView.cpp:1581
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:1130
+msgid ""
+"Try copying this file to a directory where you have write permission and re-"
+"add it"
+msgstr ""
+"Mireu de copiar aquest fitxer en una carpeta on tingueu permisos i torneu a "
+"afegir-lo."
+
+#: ../src/gui/dialogs/TransportDialog.cpp:90 rc.cpp:357
+#, no-c-format
+msgid "Rosegarden Transport"
+msgstr "Transport del Rosegarden"
+
+#: ../src/gui/dialogs/TransportDialog.cpp:925
+#: ../src/gui/dialogs/TransportDialog.cpp:985
+msgid "PITCH WHEEL"
+msgstr "PITCH WHEEL"
+
+#: ../src/gui/dialogs/TransportDialog.cpp:929
+#: ../src/gui/dialogs/TransportDialog.cpp:989
+msgid "CONTROLLER"
+msgstr "CONTROLLER"
+
+#: ../src/gui/dialogs/TransportDialog.cpp:933
+#: ../src/gui/dialogs/TransportDialog.cpp:993
+msgid "PROG CHNGE"
+msgstr "PROG CHNGE"
+
+#: ../src/gui/dialogs/TransportDialog.cpp:938
+#: ../src/gui/dialogs/TransportDialog.cpp:998
+msgid "PRESSURE"
+msgstr "PRESSURE"
+
+#: ../src/gui/dialogs/TransportDialog.cpp:942
+#: ../src/gui/dialogs/TransportDialog.cpp:1002
+msgid "SYS MESSAGE"
+msgstr "SYS MESSAGE"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:177
+#: ../src/gui/dialogs/QuantizeDialog.cpp:40
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:127
+msgid "Quantize"
+msgstr "Quantificació"
+
+#: ../src/gui/dialogs/QuantizeDialog.cpp:52
+msgid "Advanced"
+msgstr "Avançat"
+
+#: ../src/gui/dialogs/ExportDeviceDialog.cpp:42
+msgid "Export Devices..."
+msgstr "Exporta els dispositius..."
+
+#: ../src/gui/dialogs/ExportDeviceDialog.cpp:47
+msgid "Export devices"
+msgstr "Exporta els dispositius"
+
+#: ../src/gui/dialogs/ExportDeviceDialog.cpp:49
+msgid "Export all devices"
+msgstr "Exporta tots els dispositius"
+
+#: ../src/gui/dialogs/ExportDeviceDialog.cpp:50
+msgid "Export selected device only"
+msgstr "Exporta només el dispositiu seleccionat"
+
+#: ../src/gui/dialogs/ExportDeviceDialog.cpp:51
+msgid " (\"%1\")"
+msgstr " (\"%1\")"
+
+#: ../src/gui/dialogs/CompositionLengthDialog.cpp:44
+msgid "Change Composition Length"
+msgstr "Canvia la duració de la composició"
+
+#: ../src/gui/dialogs/CompositionLengthDialog.cpp:50
+msgid "Set the Start and End bar markers for this Composition"
+msgstr ""
+"Estableix els marcadors dels compassos inicial i final per aquesta composició"
+
+#: ../src/gui/dialogs/CompositionLengthDialog.cpp:54
+msgid "Start Bar"
+msgstr "Compàs inicial"
+
+#: ../src/gui/dialogs/CompositionLengthDialog.cpp:62
+msgid "End Bar"
+msgstr "Compàs final"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:62
+#, fuzzy
+msgid "LilyPond Export/Preview"
+msgstr "Exporta al Lilypond"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:85
+#, fuzzy
+msgid "General options"
+msgstr "Configuració general"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:90
+#, fuzzy
+msgid "Advanced options"
+msgstr "Mostra les opcions avançades"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:112
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:95
+msgid "Headers"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:106
+msgid "Basic options"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:113
+#, fuzzy
+msgid "Compatibility level"
+msgstr "Nivell de compatibilitat amb el Lilypond"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:117
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:118
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:119
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:120
+#, fuzzy, c-format
+msgid "LilyPond %1"
+msgstr "Lilypond 2.2"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:125
+#, fuzzy
+msgid "Paper size"
+msgstr "per fitxer"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:129
+msgid "A3"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:130
+msgid "A4"
+msgstr "A4"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:131
+msgid "A5"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:132
+msgid "A6"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:133
+msgid "Legal"
+msgstr "Legal"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:134
+msgid "US Letter"
+msgstr "Carta estil EEUU"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:135
+msgid "Tabloid"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:136
+msgid "do not specify"
+msgstr "no ho especifiquis"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:152
+#, fuzzy
+msgid "Font size"
+msgstr "Mida del fitxer"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:157
+#, fuzzy
+msgid "%1 pt"
+msgstr "%1 (partició)"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:169
+#, fuzzy
+msgid "Staff level options"
+msgstr "Mostra les opcions avançades"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:176
+#, fuzzy
+msgid "Export content"
+msgstr "Exporta els dispositius"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:179
+#, fuzzy
+msgid "All tracks"
+msgstr "Afegeix vàries pistes"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:180
+#, fuzzy
+msgid "Non-muted tracks"
+msgstr "Posa la pista en silenci"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:181
+#, fuzzy
+msgid "Selected track"
+msgstr "Seleccio&na la pista següent"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:182
+#, fuzzy
+msgid "Selected segments"
+msgstr "Selecciona &tots els fragments"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:188
+#, fuzzy
+msgid "Merge tracks that have the same name"
+msgstr "Ajunta les pistes que tinguin el mateix nom (no buit)"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:198
+#, fuzzy
+msgid "Notation options"
+msgstr "Propietats de la notació"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:206
+#, fuzzy
+msgid "First"
+msgstr "silenci"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:207
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:538
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:557
+msgid "All"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:211
+msgid "Export tempo marks "
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:215
+#, fuzzy
+msgid "Export lyrics"
+msgstr "Exporta els blocs \\lírica"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:225
+msgid "Export beamings"
+msgstr "Exporta les barres d'agrupació"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:232
+msgid "Export track staff brackets"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:244
+#, fuzzy
+msgid "Layout options"
+msgstr "Opcions d'exportació al Lilypond"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:257
+#, fuzzy
+msgid "Lyrics alignment"
+msgstr "Lírica per aquest fragment"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:261
+msgid "Ragged bottom (systems will not be spread vertically across the page)"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:267
+msgid "Miscellaneous options"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:274
+msgid "Enable \"point and click\" debugging"
+msgstr "Activa la depuració \"apunta i fes clic\""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:279
+msgid "Export \\midi block"
+msgstr "Exporta el bloc \\MIDI"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:284
+#, fuzzy
+msgid "No markers"
+msgstr "Cap submaster"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:285
+#, fuzzy
+msgid "Rehearsal marks"
+msgstr "Suprimeix tots els marcadors"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:286
+#, fuzzy
+msgid "Marker text"
+msgstr "Temps del marcador "
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:290
+#, fuzzy
+msgid "Export markers"
+msgstr "Exporta com..."
+
+#: ../src/gui/dialogs/AudioSplitDialog.cpp:57
+msgid "Autosplit Audio Segment"
+msgstr "Divideix automàticament el fragment d'àudio"
+
+#: ../src/gui/dialogs/AudioSplitDialog.cpp:70
+msgid "AutoSplit Segment \""
+msgstr "Divideix automàticament el fragment \""
+
+#: ../src/gui/dialogs/AudioSplitDialog.cpp:84
+msgid "Threshold"
+msgstr "Llindar"
+
+#: ../src/gui/dialogs/AudioSplitDialog.cpp:142
+msgid "<no preview generated for this audio file>"
+msgstr "<no s'ha pogut generar la vista prèvia per aquest fitxer d'àudio>"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:70
+msgid "Audio Plugin"
+msgstr "Connector d'àudio"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:94
+#: ../src/gui/widgets/AudioFaderBox.cpp:136
+msgid "Editor"
+msgstr "Editor"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:100
+msgid "Plugin"
+msgstr "Connector"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:105
+msgid "Category:"
+msgstr "Categoria:"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:110
+msgid "Plugin:"
+msgstr "Connector:"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:114
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:398
+msgid "Select a plugin from this list."
+msgstr "Selecciona un \"connector\" d'aquesta llista."
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:119
+msgid "Bypass"
+msgstr "Desviació"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:121
+msgid "Bypass this plugin."
+msgstr "Deshabilita aquest connector."
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:127
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:390
+msgid "<ports>"
+msgstr "<ports>"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:130
+msgid "Input and output port counts."
+msgstr "Recompte de ports d'entrada i de sortida."
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:132
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:391
+msgid "<id>"
+msgstr "<id>"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:135
+msgid "Unique ID of plugin."
+msgstr "ID únic del connector."
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:149
+msgid "Copy plugin parameters"
+msgstr "Copia els paràmetres del connector"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:155
+msgid "Paste plugin parameters"
+msgstr "Enganxa els paràmetres del connector"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:161
+msgid "Set to defaults"
+msgstr "Estableix els valors predeterminats"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:225
+msgid "(any)"
+msgstr "(qualsevol)"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:226
+msgid "(unclassified)"
+msgstr "(sense classificar)"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:247
+msgid "(none)"
+msgstr "(cap)"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:389
+#: ../src/gui/editors/parameters/AudioInstrumentParameterPanel.cpp:132
+#: ../src/gui/editors/parameters/AudioInstrumentParameterPanel.cpp:361
+#: ../src/gui/studio/AudioMixerWindow.cpp:685
+#: ../src/gui/studio/AudioMixerWindow.cpp:724
+#: ../src/gui/studio/AudioMixerWindow.cpp:906
+#: ../src/gui/widgets/AudioFaderBox.cpp:79
+msgid "<no plugin>"
+msgstr "<sense connector>"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:427
+msgid "This plugin has too many controls to edit here."
+msgstr "Aquest connector té masses controls per editar."
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:438
+#, c-format
+msgid "Id: %1"
+msgstr "Id: %1"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:490
+msgid "mono"
+msgstr "mono"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:492
+msgid "stereo"
+msgstr "estéreo"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:494
+msgid "%1 in, %2 out"
+msgstr "%1 entrades, %2 sortides"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:518
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:704
+msgid "Program: "
+msgstr "Programa: "
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:522
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:532
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:708
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:716
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:745
+msgid "<none selected>"
+msgstr "<cap seleccionat>"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:56
+msgid "Set the %1 property of the event selection:"
+msgstr "Defineix la propietat %1 de la selecció de l'esdeveniment:"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:61
+msgid "Pattern"
+msgstr "Patró"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:66
+msgid "Flat - set %1 to value"
+msgstr "Bemoll - defineix %1 al valor"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:70
+msgid "Alternating - set %1 to max and min on alternate events"
+msgstr ""
+"Alternant - defineix %1 al màxim i mínim en els esdeveniments alternats"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:74
+msgid "Crescendo - set %1 rising from min to max"
+msgstr "Crescendo - defineix %1 creixent des del mínim fins al màxim"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:78
+msgid "Diminuendo - set %1 falling from max to min"
+msgstr "Diminuendo - defineix %1 descendent des del màxim fins al mínim"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:82
+msgid "Ringing - set %1 alternating from max to min with both dying to zero"
+msgstr ""
+"Repic - defineix %1 alternant des del màxim fins al mínim amb ambdós caient "
+"cap a zero"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:123
+#: ../src/gui/dialogs/EventParameterDialog.cpp:150
+msgid "First Value"
+msgstr "Primer valor"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:124
+#: ../src/gui/dialogs/EventParameterDialog.cpp:151
+msgid "Second Value"
+msgstr "Segon valor"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:132
+#: ../src/gui/dialogs/EventParameterDialog.cpp:142
+msgid "Low Value"
+msgstr "Valor baix"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:133
+#: ../src/gui/dialogs/EventParameterDialog.cpp:141
+msgid "High Value"
+msgstr "Primer alt"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:56 ../src/gui/rulers/TempoRuler.cpp:127
+msgid "Insert Tempo Change"
+msgstr "Afegeix el canvi de tempo"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:69
+msgid "New tempo:"
+msgstr "Nou tempo:"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:76
+msgid "Tap"
+msgstr ""
+
+#: ../src/gui/dialogs/TempoDialog.cpp:81
+msgid "Tempo is fixed until the following tempo change"
+msgstr "El tempo no varia fins que canvia el tempo següent"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:82
+#, fuzzy
+msgid "Tempo ramps to the following tempo"
+msgstr "El tempo canvia suaument per arribar al tempo següent"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:83
+#, fuzzy
+msgid "Tempo ramps to:"
+msgstr "Tempo "
+
+#: ../src/gui/dialogs/TempoDialog.cpp:120
+msgid "Time of tempo change"
+msgstr "Temps del canvi de tempo"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:138
+msgid "The pointer is currently at "
+msgstr "El punter és actualment en el "
+
+#: ../src/gui/dialogs/TempoDialog.cpp:154
+msgid "Apply this tempo from here onwards"
+msgstr "Aplica aquest tempo des d'aquí en endavant"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:158
+msgid "Replace the last tempo change"
+msgstr "Reemplaça l'últim canvi de tempo"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:164
+msgid "Apply this tempo from the start of this bar"
+msgstr "Aplica aquest tempo des de l'inici d'aquest compàs"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:167
+msgid "Apply this tempo to the whole composition"
+msgstr "Aplica aquest tempo a tota la composició"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:172
+msgid "Also make this the default tempo"
+msgstr "A part, posa aquest tempo per defecte a partir d'ara"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:256
+msgid "%1.%2 s,"
+msgstr "%1.%2 s,"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:262
+#, c-format
+msgid "at the start of measure %1."
+msgstr "a l'inici del compàs %1."
+
+#: ../src/gui/dialogs/TempoDialog.cpp:266
+#, c-format
+msgid "in the middle of measure %1."
+msgstr "al mig del compàs %1."
+
+#: ../src/gui/dialogs/TempoDialog.cpp:285
+msgid " (at %1.%2 s, in measure %3)"
+msgstr " (a %1.%2 s, en el compàs %3) "
+
+#: ../src/gui/dialogs/TempoDialog.cpp:302
+msgid "There are no preceding tempo changes."
+msgstr "No hi han canvis de tempo precedents."
+
+#: ../src/gui/dialogs/TempoDialog.cpp:310
+msgid "There are no other tempo changes."
+msgstr "No hi han altres canvis de tempo."
+
+#: ../src/gui/dialogs/TempoDialog.cpp:328
+msgid " bpm"
+msgstr " bpm"
+
+#: ../src/gui/dialogs/AudioPlayingDialog.cpp:42
+msgid "Playing audio file"
+msgstr "S'està reproduint el fitxer d'àudio"
+
+#: ../src/gui/dialogs/AudioPlayingDialog.cpp:47
+msgid "Playing audio file \"%1\""
+msgstr "S'està reproduint el fitxer d'àudio \"%1\""
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:52
+#: ../src/gui/editors/matrix/MatrixView.cpp:2655
+msgid "Trigger Segment"
+msgstr "Fragment activable"
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:61
+msgid "Trigger segment: "
+msgstr "Fragment activable: "
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:59
+msgid "Key Change"
+msgstr "Canvi de clau"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:77
+msgid "Key signature"
+msgstr "Armadura de la clau"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:80
+#, fuzzy
+msgid "Key transposition"
+msgstr "traducció al gal·lès"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:86
+msgid "Existing notes following key change"
+msgstr "Notes existents a continuació del canvi de clau"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:98
+msgid "Flatten"
+msgstr "Altera amb bemoll"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:100
+msgid "Key"
+msgstr "Clau"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:105
+msgid "Sharpen"
+msgstr "Altera amb diesi"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:109
+msgid "Major"
+msgstr "Major"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:110
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:369
+msgid "Minor"
+msgstr "Menor"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:123
+msgid "Transpose key according to segment transposition"
+msgstr ""
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:126
+msgid "Use specified key. Do not transpose"
+msgstr ""
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:134
+msgid "Apply to current segment only"
+msgstr "Aplica només al fragment actual"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:137
+msgid "Apply to all segments at this time"
+msgstr "Aplica a tots els fragments d'aquest moment"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:141
+msgid "Exclude percussion segments"
+msgstr ""
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:155
+msgid "Maintain current accidentals"
+msgstr "Manté els accidents actuals"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:158
+msgid "Transpose into this key"
+msgstr "Transposa a aquesta clau"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:331
+msgid "No such key"
+msgstr "No hi ha aquesta clau"
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:44
+#: ../src/gui/editors/notation/NotationSelector.cpp:118
+msgid "Interpret"
+msgstr "Interpretació"
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:50
+msgid "Interpretations to apply"
+msgstr "Interpretacions per aplicar"
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:53
+msgid "Apply text dynamics (p, mf, ff etc)"
+msgstr "Aplica els matisos de text (p, mf, ff, etc)"
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:55
+msgid "Apply hairpin dynamics"
+msgstr "Aplica les matisacions graduals"
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:57
+msgid "Stress beats"
+msgstr "Estressa les pulsacions"
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:59
+msgid "Articulate slurs, staccato, tenuto etc"
+msgstr "Articula les lligadures, els staccato, els tenuto, etc"
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:61
+msgid "All available interpretations"
+msgstr "Totes les interpretacions disponibles"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:316
+#, fuzzy
+msgid ""
+"Attempted to launch JACK audio daemon failed. Audio will be disabled.\n"
+"Please check configuration (Settings -> Configure Rosegarden -> Audio -> "
+"Startup)\n"
+" and restart."
+msgstr ""
+"No s'ha pogut iniciar el servei d'àudio JACK. L'àudio no funcionarà.\n"
+"Comproveu la configuració (Configuració -> Configuració del Rosegarden \n"
+"-> Seqüenciador -> Control del JACK) i torneu a engegar."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:325
+msgid "Starting sequencer..."
+msgstr "S'està iniciant el seqüenciador..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:333
+msgid "Initializing plugin manager..."
+msgstr "S'està iniciant el gestor de connectors..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:338
+msgid "Initializing view..."
+msgstr "S'està carregant la vista..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:354
+#, fuzzy
+msgid "Special Parameters"
+msgstr "Paràmetres del fragment"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:430
+msgid "Starting sequence manager..."
+msgstr "S'està inicial el gestor del seqüenciador..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:456
+msgid "Clearing studio data..."
+msgstr "S'està netejant les dades de l'estudi..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:475
+#: ../src/gui/editors/notation/NotationView.cpp:558
+msgid "Starting..."
+msgstr "S'està iniciant..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:556
+msgid "Import Rosegarden &Project file..."
+msgstr "Importa el fitxer de &projecte Rosegarden..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:560
+msgid "Import &MIDI file..."
+msgstr "Importa el fitxer &MIDI..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:564
+msgid "Import &Rosegarden 2.1 file..."
+msgstr "Importa el fitxer &Rosegarden 2.1..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:568
+msgid "Import &Hydrogen file..."
+msgstr "Importa el fitxer &Hydrogen..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:572
+msgid "Merge &File..."
+msgstr "&Fusiona el fitxer..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:576
+msgid "Merge &MIDI file..."
+msgstr "Fusiona el fitxer &MIDI..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:580
+msgid "Merge &Rosegarden 2.1 file..."
+msgstr "Fusiona el fitxer &Rosegarden 2.1..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:584
+msgid "Merge &Hydrogen file..."
+msgstr "Fusiona el fitxer &Hydrogen..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:588
+msgid "Export Rosegarden &Project file..."
+msgstr "Exporta el fitxer de &projecte Rosegarden..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:592
+msgid "Export &MIDI file..."
+msgstr "Exporta el fitxer &MIDI..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:596
+#, fuzzy
+msgid "Export &LilyPond file..."
+msgstr "Exporta el fitxer &Lilypond..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:600
+msgid "Export Music&XML file..."
+msgstr "Exporta el fitxer Music&XML..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:604
+msgid "Export &Csound score file..."
+msgstr "Exporta el fitxer &Csound score..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:608
+msgid "Export M&up file..."
+msgstr "Exporta el fitxer M&up..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:612
+#: ../src/gui/editors/notation/NotationView.cpp:1500
+#, fuzzy
+msgid "Print &with LilyPond..."
+msgstr "S'està visualitzant el fitxer Lilypond..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:616
+#: ../src/gui/editors/notation/NotationView.cpp:1504
+#, fuzzy
+msgid "Preview with Lil&yPond..."
+msgstr "S'està visualitzant el fitxer Lilypond..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:620
+msgid "Play&list"
+msgstr "&Llista de peces"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:627
+msgid "Rosegarden &Tutorial"
+msgstr "&Tutorial del Rosegarden"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:631
+msgid "&Bug Reporting Guidelines"
+msgstr "Guia per enviar &bugs descoberts"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:645
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:348
+#: ../src/gui/editors/segment/MarkerEditor.cpp:378
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:388
+#: ../src/gui/general/EditViewBase.cpp:190
+#: ../src/gui/studio/BankEditorDialog.cpp:318
+#: ../src/gui/studio/DeviceManagerDialog.cpp:227
+msgid "Und&o"
+msgstr "&Desfés"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:651
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:354
+#: ../src/gui/editors/segment/MarkerEditor.cpp:384
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:394
+#: ../src/gui/general/EditViewBase.cpp:196
+#: ../src/gui/studio/BankEditorDialog.cpp:324
+#: ../src/gui/studio/DeviceManagerDialog.cpp:233
+msgid "Re&do"
+msgstr "&Refés"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:665
+#: ../src/gui/editors/notation/NotationView.cpp:2297
+msgid "Show T&ools Toolbar"
+msgstr "M&ostra la barra d'eines de les eines"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:669
+msgid "Show Trac&ks Toolbar"
+msgstr "Mostra la barra de &pistes"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:673
+msgid "Show &Editors Toolbar"
+msgstr "M&ostra la barra d'&edició"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:677
+#: ../src/gui/editors/notation/NotationView.cpp:2309
+msgid "Show Trans&port Toolbar"
+msgstr "Mostra la barra d'eines de les &tecles de reproducció"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:681
+msgid "Show &Zoom Toolbar"
+msgstr "M&ostra la barra de zoom"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:688
+msgid "Show Tra&nsport"
+msgstr "Mostra la barra de tra&nsport"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:693
+msgid "Show Track &Labels"
+msgstr "Mostra les eti&quetes de les pistes"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:698
+msgid "Show Playback Position R&uler"
+msgstr "Mostra el regle del &puntejat"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:703
+msgid "Show Te&mpo Ruler"
+msgstr "Mostra el regle del te&mpo"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:708
+msgid "Show Cho&rd Name Ruler"
+msgstr "M&ostra el regle dels acords"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:714
+msgid "Show Segment Pre&views"
+msgstr "Mostra &maquetes dels fragments"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:719
+#, fuzzy
+msgid "Show Special &Parameters"
+msgstr "Mostra els paràmetres de l'instrument"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:753
+#: ../src/gui/editors/matrix/MatrixView.cpp:641
+#: ../src/gui/editors/notation/NotationView.cpp:1772
+#, fuzzy
+msgid "&Select and Edit"
+msgstr "S&elecciona fins el final"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:758
+#: ../src/gui/editors/matrix/MatrixView.cpp:646
+msgid "&Draw"
+msgstr "&Dibuixa"
+
+#: ../src/commands/edit/EraseCommand.h:50
+#: ../src/gui/application/RosegardenGUIApp.cpp:763
+#: ../src/gui/editors/matrix/MatrixView.cpp:651
+#: ../src/gui/editors/notation/NotationView.cpp:1766
+msgid "&Erase"
+msgstr "&Esborra"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:768
+#: ../src/gui/editors/matrix/MatrixView.cpp:656
+msgid "&Move"
+msgstr "&Mou"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:775
+msgid "&Resize"
+msgstr "&Redimensiona"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:782 rc.cpp:87
+#, no-c-format
+msgid "&Split"
+msgstr "&Divideix"
+
+#: ../src/commands/segment/SegmentJoinCommand.h:53
+#: ../src/gui/application/RosegardenGUIApp.cpp:789
+msgid "&Join"
+msgstr "&Ajunta"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:795
+msgid "&Harmonize"
+msgstr "&Harmonitza"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:806
+#: ../src/gui/rulers/TempoRuler.cpp:157
+msgid "Open Tempo and Time Signature Editor"
+msgstr "Obre en l'editor del tempo i de l'indicador del compàs"
+
+#: ../src/commands/segment/CutRangeCommand.cpp:41
+#: ../src/gui/application/RosegardenGUIApp.cpp:812
+#, fuzzy
+msgid "Cut Range"
+msgstr "Ret&alla i tanca"
+
+#: ../src/commands/edit/CopyCommand.cpp:73
+#: ../src/gui/application/RosegardenGUIApp.cpp:816
+#, fuzzy
+msgid "Copy Range"
+msgstr "Canvi de clau"
+
+#: ../src/commands/segment/PasteRangeCommand.cpp:45
+#: ../src/gui/application/RosegardenGUIApp.cpp:820
+#, fuzzy
+msgid "Paste Range"
+msgstr "Forma d'enganxar"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:828
+#, fuzzy
+msgid "Insert Range..."
+msgstr "Afegeix un silenci"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:832
+#: ../src/gui/editors/notation/NotationView.cpp:1804
+msgid "De&lete"
+msgstr "S&uprimeix"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:836
+msgid "Select &All Segments"
+msgstr "Selecciona &tots els fragments"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:852
+msgid "Edit Mar&kers..."
+msgstr "Edita els marcadors..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:856
+msgid "Edit Document P&roperties..."
+msgstr "Edita les propietats del document..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:864
+msgid "Open in &Default Editor"
+msgstr "Obre en l'editor per &defecte"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:870
+#: ../src/gui/general/EditViewBase.cpp:206
+msgid "Open in Matri&x Editor"
+msgstr "Obre a l'editor de matri&us"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:876
+#: ../src/gui/general/EditViewBase.cpp:212
+msgid "Open in &Percussion Matrix Editor"
+msgstr "Obre en l'editor matriu de percussió"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:882
+#: ../src/gui/general/EditViewBase.cpp:218
+msgid "Open in &Notation Editor"
+msgstr "Obre a l'editor de &partitures"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:888
+#: ../src/gui/general/EditViewBase.cpp:224
+msgid "Open in &Event List Editor"
+msgstr "Obre a l'editor de la llista d'&esdeveniments"
+
+#: ../src/commands/edit/EventQuantizeCommand.cpp:120
+#: ../src/commands/edit/EventUnquantizeCommand.cpp:87
+#: ../src/gui/application/RosegardenGUIApp.cpp:894
+msgid "&Quantize..."
+msgstr "Quanti&fica..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:908
+#: ../src/gui/editors/matrix/MatrixView.cpp:686
+msgid "Repeat Last Quantize"
+msgstr "Repeteix l'última quantificació"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:928
+#, fuzzy
+msgid "Split at Time..."
+msgstr "Defineix el temps d'inici..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:932
+#: ../src/gui/general/EditView.cpp:796
+msgid "Jog &Left"
+msgstr "Mou a l'&esquerra"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:936
+#: ../src/gui/general/EditView.cpp:800
+msgid "Jog &Right"
+msgstr "Mou a la d&reta"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:940
+msgid "Set Start Time..."
+msgstr "Defineix el temps d'inici..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:944
+msgid "Set Duration..."
+msgstr "Defineix la durada..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:953
+msgid "Turn Re&peats into Copies"
+msgstr "Transforma les re&peticions en còpies"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:958
+#, fuzzy
+msgid "Manage Tri&ggered Segments"
+msgstr "Gestiona els &fragments activables"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:962
+msgid "Set Tempos from &Beat Segment"
+msgstr "Agafa el tempo del fragment de &pulsacions"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:966
+#, fuzzy
+msgid "Set &Tempo to Audio Segment Duration"
+msgstr "Posa el &tempo a la durada del fragment d'àudio"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:972
+#, fuzzy
+msgid "Manage A&udio Files"
+msgstr "Canvia l'etiqueta del fitxer d'àudio"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:977
+msgid "Show Segment Labels"
+msgstr "Mostra les etiquetes del fragment"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:986
+msgid "Add &Track"
+msgstr "Afegeix una &pista"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:990
+#, fuzzy
+msgid "&Add Tracks..."
+msgstr "Afegeix pistes..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:996
+msgid "D&elete Track"
+msgstr "&Suprimeix una pista"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1002
+msgid "Move Track &Down"
+msgstr "Mou la pista a&vall"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1008
+msgid "Move Track &Up"
+msgstr "Mou la pista am&unt"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1012
+msgid "Select &Next Track"
+msgstr "Seleccio&na la pista següent"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1017
+msgid "Select &Previous Track"
+msgstr "Selecciona la &pista anterior"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1022
+#, fuzzy
+msgid "Mute or Unmute Track"
+msgstr "Posa la pista en silenci"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1027
+msgid "Arm or Un-arm Track for Record"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1034
+msgid "&Mute all Tracks"
+msgstr "&posa en silenci les pistes"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1040
+msgid "&Unmute all Tracks"
+msgstr "&treu el silenci de les pistes"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1044
+msgid "&Remap Instruments..."
+msgstr "&Assignació dels instruments...."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1053
+msgid "&Audio Mixer"
+msgstr "Mescl&ador d'àudio"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1059
+msgid "Midi Mi&xer"
+msgstr "Me&sclador de MIDI"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1065
+msgid "Manage MIDI &Devices"
+msgstr "Gestiona els &dispositius MIDI"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1071
+msgid "Manage S&ynth Plugins"
+msgstr "Gestiona els s&intetitzadors"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1075
+msgid "Modify MIDI &Filters"
+msgstr "Modifica els &filtres MIDI"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1079
+msgid "MIDI Thru Routing"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1085
+msgid "Manage &Metronome"
+msgstr "Gestiona el &metrònom"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1089
+msgid "&Save Current Document as Default Studio"
+msgstr "&Desa el document actual com a estudi per defecte"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1093
+msgid "&Import Default Studio"
+msgstr "&Importa l'estudi per defecte"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1097
+msgid "Im&port Studio from File..."
+msgstr "Im&porta l'estudi del fitxer..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1101
+msgid "&Reset MIDI Network"
+msgstr "&Reinicia la xarxa MIDI"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1105
+#, fuzzy
+msgid "Set Quick Marker at Playback Position"
+msgstr "Afegeix el canvi de tempo"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1109
+msgid "Jump to Quick Marker"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1142
+#: ../src/gui/editors/matrix/MatrixView.cpp:782
+#: ../src/gui/editors/notation/NotationView.cpp:2397
+#: ../src/gui/studio/AudioMixerWindow.cpp:105
+#: ../src/gui/studio/MidiMixerWindow.cpp:81
+msgid "&Play"
+msgstr "&Reprodueix"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1153
+#: ../src/gui/editors/matrix/MatrixView.cpp:791
+#: ../src/gui/editors/notation/NotationView.cpp:2406
+#: ../src/gui/studio/AudioMixerWindow.cpp:114
+#: ../src/gui/studio/MidiMixerWindow.cpp:90
+msgid "&Stop"
+msgstr "&Atura"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1160
+#: ../src/gui/editors/matrix/MatrixView.cpp:802
+#: ../src/gui/editors/notation/NotationView.cpp:2417
+#: ../src/gui/studio/AudioMixerWindow.cpp:125
+#: ../src/gui/studio/MidiMixerWindow.cpp:101
+msgid "&Fast Forward"
+msgstr "Avanç &ràpid"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1168
+#: ../src/gui/editors/matrix/MatrixView.cpp:796
+#: ../src/gui/editors/notation/NotationView.cpp:2411
+#: ../src/gui/studio/AudioMixerWindow.cpp:119
+#: ../src/gui/studio/MidiMixerWindow.cpp:95
+msgid "Re&wind"
+msgstr "Re&bobina"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1175
+#, fuzzy
+msgid "P&unch in Record"
+msgstr "Activa gra&vació"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1182
+#: ../src/gui/studio/AudioMixerWindow.cpp:143
+#: ../src/gui/studio/MidiMixerWindow.cpp:119
+msgid "&Record"
+msgstr "En&registra"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1189
+#: ../src/gui/editors/matrix/MatrixView.cpp:808
+#: ../src/gui/editors/notation/NotationView.cpp:2423
+#: ../src/gui/studio/AudioMixerWindow.cpp:131
+#: ../src/gui/studio/MidiMixerWindow.cpp:107
+msgid "Rewind to &Beginning"
+msgstr "Re&bobina fins al començament"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1196
+#: ../src/gui/editors/matrix/MatrixView.cpp:814
+#: ../src/gui/editors/notation/NotationView.cpp:2429
+#: ../src/gui/studio/AudioMixerWindow.cpp:137
+#: ../src/gui/studio/MidiMixerWindow.cpp:113
+msgid "Fast Forward to &End"
+msgstr "Avanç rà&pid al final"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1203
+#: ../src/gui/editors/matrix/MatrixView.cpp:832
+#: ../src/gui/editors/notation/NotationView.cpp:2447
+msgid "Scro&ll to Follow Playback"
+msgstr "&Segueix el punt de reproducció"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1209
+#: ../src/gui/editors/matrix/MatrixView.cpp:838
+#: ../src/gui/editors/notation/NotationView.cpp:2453
+#: ../src/gui/studio/AudioMixerWindow.cpp:149
+#: ../src/gui/studio/MidiMixerWindow.cpp:125
+msgid "Panic"
+msgstr "Pànic"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1213
+msgid "Segment Debug Dump "
+msgstr "Llista la depuració del fragment "
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1283
+msgid " Zoom: "
+msgstr " Zoom: "
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1719
+msgid "File \"%1\" does not exist"
+msgstr "El fitxer \"%1\" no existeix"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1725
+msgid "File \"%1\" is actually a directory"
+msgstr "El fitxer \"%1\" és una carpeta"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1734
+msgid "You do not have read permission for \"%1\""
+msgstr "No teniu permisos per llegir \"%1\""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1802
+msgid ""
+"An auto-save file for this document has been found\n"
+"Do you want to open it instead ?"
+msgstr ""
+"S'ha trobat un fitxer desat automàticament per a aquest\n"
+"document. El voleu obrir en lloc d'aquest document ?"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1896
+msgid "Example Files"
+msgstr "Fitxers d'exemple"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2100
+msgid "Opening a new application window..."
+msgstr "S'està obrint una nova finestra de l'aplicació..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2110
+msgid "Creating new document..."
+msgstr "S'està creant un nou document..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2154
+#, c-format
+msgid ""
+"Malformed URL\n"
+"%1"
+msgstr ""
+"El URL està mal fet\n"
+"%1"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2179
+#: ../src/gui/application/RosegardenGUIApp.cpp:2240
+msgid "Opening file..."
+msgstr "S'està obrint el fitxer..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2201
+#: ../src/gui/application/RosegardenGUIApp.cpp:2220
+msgid "Open File"
+msgstr "Obre el fitxer"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1225
+#: ../src/gui/application/RosegardenGUIApp.cpp:2258
+msgid "Saving file..."
+msgstr "Desa el fitxer..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2330
+msgid "This is not a valid filename.\n"
+msgstr "No és un nom de fitxer vàlid.\n"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2335
+msgid "This is not a local file.\n"
+msgstr "No és un fitxer local.\n"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2342
+#: ../src/gui/studio/BankEditorDialog.cpp:1640
+#: ../src/gui/studio/DeviceManagerDialog.cpp:787
+msgid "You have specified a directory"
+msgstr "Heu especificat una carpeta"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2348
+#: ../src/gui/studio/BankEditorDialog.cpp:1646
+#: ../src/gui/studio/DeviceManagerDialog.cpp:793
+msgid "The specified file exists. Overwrite?"
+msgstr "El fitxer especificat ja existeix. Voleu sobreescriure'l?"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2362
+msgid "Saving file with a new filename..."
+msgstr "S'està desant el fitxer amb un nou nom..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2364
+#, fuzzy
+msgid "Rosegarden files"
+msgstr "Fitxes del Rosegarden-4"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2365
+#: ../src/gui/application/RosegardenGUIApp.cpp:4860
+#: ../src/gui/application/RosegardenGUIApp.cpp:4904
+#: ../src/gui/application/RosegardenGUIApp.cpp:4942
+#: ../src/gui/application/RosegardenGUIApp.cpp:4975
+#: ../src/gui/application/RosegardenGUIApp.cpp:5009
+#: ../src/gui/application/RosegardenGUIApp.cpp:5116
+msgid "All files"
+msgstr "Tots els fitxers"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2366
+msgid "Save as..."
+msgstr "Anomena i desa..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2404
+msgid "Closing file..."
+msgstr "S'està tancant el fitxer..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2421
+#: ../src/gui/editors/notation/NotationView.cpp:4618
+msgid "Printing..."
+msgstr "S'està imprimint..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2433
+#: ../src/gui/editors/notation/NotationView.cpp:4635
+msgid "Previewing..."
+msgstr "Visualització prèvia..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2440
+msgid "Exiting..."
+msgstr "S'està sortint..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2463
+msgid "Cutting selection..."
+msgstr "S'està retallant la selecció..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2474
+#: ../src/gui/editors/matrix/MatrixView.cpp:1614
+#: ../src/gui/editors/notation/NotationView.cpp:4763
+msgid "Copying selection to clipboard..."
+msgstr "S'està copiant la selecció al porta-retalls..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2484
+#: ../src/gui/editors/eventlist/EventView.cpp:878
+#: ../src/gui/editors/matrix/MatrixView.cpp:1625
+#: ../src/gui/editors/notation/NotationView.cpp:4796
+#: ../src/gui/editors/notation/NotationView.cpp:4841
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:352
+msgid "Clipboard is empty"
+msgstr "El porta-retalls està buit"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2487
+#: ../src/gui/editors/eventlist/EventView.cpp:882
+#: ../src/gui/editors/matrix/MatrixView.cpp:1629
+#: ../src/gui/editors/notation/NotationView.cpp:4804
+#: ../src/gui/editors/notation/NotationView.cpp:4845
+msgid "Inserting clipboard contents..."
+msgstr "S'està afegint el contingut del porta-retalls..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2556
+#, fuzzy
+msgid "Duration of empty range to insert"
+msgstr "Duració de la selecció"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2631
+msgid "This function needs no more than one segment to be selected."
+msgstr "Aquesta funció només necessita que se seleccioni un sol fragment."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2654
+msgid "Can't join Audio segments"
+msgstr "No es poden ajunar fragments d'àudio"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2707
+#, fuzzy
+msgid "rescaling an audio file"
+msgstr "S'està reproduint el fitxer d'àudio"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2723
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:172
+#, fuzzy
+msgid "Rescaling audio file..."
+msgstr "S'està exportant el fitxer d'àudio..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2767
+#, fuzzy
+msgid ""
+"The audio file path does not exist or is not writable.\n"
+"You must set the audio file path to a valid directory in Document Properties "
+"before %1.\n"
+"Would you like to set it now?"
+msgstr ""
+"La ubicació del fitxer d'àudio no existeix o no s'hi pot escriure.\n"
+"Seleccioneu una ubicació correcta, en les propietats del document abans de "
+"gravar l'àudio.\n"
+"Voleu configurar-ho ara?"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2769
+#: ../src/gui/application/RosegardenGUIApp.cpp:5291
+#: ../src/gui/application/RosegardenGUIApp.cpp:5339
+#: ../src/gui/editors/segment/TrackButtons.cpp:419
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:159
+msgid "Set audio file path"
+msgstr "Selecciona una ubicació per al fitxer"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2833
+#, fuzzy
+msgid "Jog Selection"
+msgstr "Toca la selecció"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2978
+#, fuzzy, c-format
+msgid ""
+"_n: Split Segment at Time\n"
+"Split %n Segments at Time"
+msgstr ""
+"_n: %1 - Fragment - Notació\n"
+"%2 - %n Fragments - Notació"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3013
+#: ../src/gui/general/EditViewBase.cpp:619
+msgid "Segment Start Time"
+msgstr "Temps d'inici del fragment"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3023
+msgid "Set Segment Start Times"
+msgstr "Defineix el temps d'inici del fragment"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3024
+#: ../src/gui/general/EditViewBase.cpp:626
+msgid "Set Segment Start Time"
+msgstr "Defineix el temps d'inici del fragment"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3056
+#: ../src/gui/general/EditViewBase.cpp:644
+msgid "Segment Duration"
+msgstr "Durada del fragment"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3068
+msgid "Set Segment Durations"
+msgstr "Defineix la durada del fragment"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3069
+#: ../src/gui/general/EditViewBase.cpp:652
+msgid "Set Segment Duration"
+msgstr "Defineix la durada del fragment"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3176
+#: ../src/gui/application/RosegardenGUIApp.cpp:5875
+msgid "Set Global Tempo"
+msgstr "Defineix el tempo global"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3234
+#: ../src/gui/general/EditViewBase.cpp:477
+msgid "Toggle the toolbar..."
+msgstr "Commuta la barra d'eines..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3244
+msgid "Toggle the tools toolbar..."
+msgstr "Commuta la barra d'eines..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3254
+msgid "Toggle the tracks toolbar..."
+msgstr "Commuta la barra de pistes..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3264
+msgid "Toggle the editor toolbar..."
+msgstr "Commuta la barra d'edició..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3274
+msgid "Toggle the transport toolbar..."
+msgstr "Commuta la barra de transport..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3284
+msgid "Toggle the zoom toolbar..."
+msgstr "Commuta la barra de zoom..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3294
+msgid "Toggle the Transport"
+msgstr "Commuta el transport..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3377
+#: ../src/gui/general/EditViewBase.cpp:487
+msgid "Toggle the statusbar..."
+msgstr "Commuta la barra d'estat..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3434
+#, fuzzy
+msgid ""
+"The join tool isn't implemented yet. Instead please highlight the segments "
+"you want to join and then use the menu option:\n"
+"\n"
+" Segments->Collapse Segments.\n"
+msgstr ""
+"L'eina per ajuntar encara no està implementada. En comptes d'això "
+"seleccioneu els fragments que voleu ajuntar i feu servir l'opció de menú:\n"
+"\n"
+" Fragments->Col·lapsa els fragments.\n"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3437
+msgid "Join tool not yet implemented"
+msgstr "L'eina per ajuntar encara no està implementada"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3675
+msgid "Revert modified document to previous saved version?"
+msgstr "Voleu recuperar la versió anterior del document modificat?"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3691
+msgid ""
+"*.rgp|Rosegarden Project files\n"
+"*|All files"
+msgstr ""
+"*.rgp|Fitxers de projecte del Rosegarden\n"
+"*|Tots els fitxers"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3692
+msgid "Import Rosegarden Project File"
+msgstr "Importa el fitxer de projecte Rosegarden"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3717
+msgid "Failed to import project file \"%1\""
+msgstr "No s'ha pogut importar el fitxer de projecte \"%1\""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3739
+msgid "Open MIDI File"
+msgstr "Obre el fitxer MIDI"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3756
+msgid "Merge MIDI File"
+msgstr "Fusiona el fitxer MIDI"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3866
+msgid "Importing MIDI file..."
+msgstr "S'està important el fitxer MIDI..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3903
+msgid "Calculating notation..."
+msgstr "S'estan calculant els compassos..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3950
+msgid "Calculate Notation"
+msgstr "Calcula els compassos"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3991
+#: ../src/gui/application/RosegardenGUIApp.cpp:4008
+msgid ""
+"*.rose|Rosegarden-2 files\n"
+"*|All files"
+msgstr ""
+"*.rose|Fitxers del Rosegarden-2\n"
+"*|Tots els fitxers"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3992
+#: ../src/gui/application/RosegardenGUIApp.cpp:4009
+msgid "Open Rosegarden 2.1 File"
+msgstr "Obre el fitxer Rosegarden 2.1"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4026
+msgid "Importing Rosegarden 2.1 file..."
+msgstr "S'està important el fitxer Rosegarden 2.1..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4052
+msgid "Can't load Rosegarden 2.1 file. It appears to be corrupted."
+msgstr ""
+"No es pot carregar el fitxer Rosegarden 2.1. Sembla que que està malament."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4078
+#: ../src/gui/application/RosegardenGUIApp.cpp:4095
+msgid ""
+"*.h2song|Hydrogen files\n"
+"*|All files"
+msgstr ""
+"*.h2song|Fitxers Hydrogen\n"
+"*|Tots els fitxers"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4079
+#: ../src/gui/application/RosegardenGUIApp.cpp:4096
+msgid "Open Hydrogen File"
+msgstr "Obre el fitxer Hydrogen"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4113
+msgid "Importing Hydrogen file..."
+msgstr "S'està important el fitxer Hydrogen..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4139
+msgid "Can't load Hydrogen file. It appears to be corrupted."
+msgstr "No es pot carregar el fitxer Hydrogen. Sembla que està malament."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4527
+#, fuzzy
+msgid "Export and import of Rosegarden Project files"
+msgstr "S'està exportant el fitxer de projecte Rosegarden..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4529
+#, fuzzy
+msgid "The Rosegarden Project Packager helper script"
+msgstr "Fitxers de projecte Rosegarden\n"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4533
+msgid "%1 - for project file support"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4550
+msgid "The Rosegarden LilyPondView helper script"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4554
+#, fuzzy
+msgid "%1 - for LilyPond preview support"
+msgstr "Opcions Lilypond de la mostra prèvia "
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4570
+msgid "The Rosegarden Audio File Importer helper script"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4574
+#, fuzzy
+msgid "%1 - for audio file import"
+msgstr "Selecciona una ubicació per al fitxer"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4585
+msgid ""
+"<h3>Helper programs not found</h3><p>Rosegarden could not find one or more "
+"helper programs which it needs to provide some features. The following "
+"features will not be available:</p>"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4586
+#: ../src/gui/application/RosegardenGUIApp.cpp:4592
+#, fuzzy
+msgid "<ul>"
+msgstr "<per defecte>"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4588
+#: ../src/gui/application/RosegardenGUIApp.cpp:4594
+#, fuzzy
+msgid "<li>%1</li>"
+msgstr "-- %1 (des de %2)\n"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4590
+#: ../src/gui/application/RosegardenGUIApp.cpp:4596
+msgid "</ul>"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4591
+msgid ""
+"<p>To fix this, you should install the following additional programs:</p>"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4603
+msgid "Helper programs not found"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4686
+msgid "Starting the sequencer..."
+msgstr "S'està iniciant el seqüenciador..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4712
+msgid "Couldn't start the sequencer"
+msgstr "No s'ha pogut engegar el seqüenciador"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4789
+msgid "Clearing down jackd..."
+msgstr "Netejant el jackd..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4803
+msgid "Starting jackd..."
+msgstr "S'està iniciant el jackd..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4842
+msgid ""
+"The Rosegarden sequencer process has exited unexpectedly. Sound and "
+"recording will no longer be available for this session.\n"
+"Please exit and restart Rosegarden to restore sound capability."
+msgstr ""
+"El procés seqüenciador del Rosegarden ha acabat de forma sobtada. El so i "
+"l'enregistrament han deixat de funcionar per aquesta sessió.\n"
+"Heu de sortir i tornar a iniciar el Rosegarden per restaurar el sistema de "
+"so."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4846
+msgid ""
+"The Rosegarden sequencer could not be started, so sound and recording will "
+"be unavailable for this session.\n"
+"For assistance with correct audio and MIDI configuration, go to http://"
+"rosegardenmusic.com."
+msgstr ""
+"El seqüenciador del Rosegarden no s'ha pogut engegar, per tant el so i "
+"l'enregistrament \n"
+"no funcionaran. Si necessiteu ajuda en la configuració del so aneu a http://"
+"rosegardenmusic.com."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4856
+msgid "Exporting Rosegarden Project file..."
+msgstr "S'està exportant el fitxer de projecte Rosegarden..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4859
+msgid "Rosegarden Project files\n"
+msgstr "Fitxers de projecte Rosegarden\n"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4861
+#: ../src/gui/application/RosegardenGUIApp.cpp:4905
+#: ../src/gui/application/RosegardenGUIApp.cpp:4943
+#: ../src/gui/application/RosegardenGUIApp.cpp:4976
+#: ../src/gui/application/RosegardenGUIApp.cpp:5010
+#: ../src/gui/application/RosegardenGUIApp.cpp:5116
+msgid "Export as..."
+msgstr "Exporta com..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4875
+#, c-format
+msgid "Saving Rosegarden file to package failed: %1"
+msgstr "No s'ha pogut desar el fitxer Rosegarden al paquet: %1"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4889
+msgid "Failed to export to project file \"%1\""
+msgstr "No s'ha pogut exportar el fitxer de projecte \"%1\""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4900
+#: ../src/gui/application/RosegardenGUIApp.cpp:4915
+msgid "Exporting MIDI file..."
+msgstr "S'està exportant el fitxer MIDI..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4903
+msgid "Standard MIDI files\n"
+msgstr "Fitxers de MIDI estàndars\n"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4934
+#: ../src/gui/application/RosegardenGUIApp.cpp:4966
+#: ../src/gui/application/RosegardenGUIApp.cpp:4999
+#: ../src/gui/application/RosegardenGUIApp.cpp:5103
+#: ../src/gui/application/RosegardenGUIApp.cpp:5140
+#: ../src/gui/editors/notation/NotationView.cpp:4733
+msgid "Export failed. The file could not be opened for writing."
+msgstr "No s'ha pogut exportar. El fitxer no s'ha pogut obrir per escriure'l."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4940
+#: ../src/gui/application/RosegardenGUIApp.cpp:4952
+msgid "Exporting Csound score file..."
+msgstr "S'està exportant el fitxer Csound score..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4972
+#: ../src/gui/application/RosegardenGUIApp.cpp:4985
+msgid "Exporting Mup file..."
+msgstr "S'està exportant el fitxer Mup..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4975
+msgid "Mup files\n"
+msgstr "Fitxers Mup\n"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5005
+#: ../src/gui/application/RosegardenGUIApp.cpp:5089
+#: ../src/gui/editors/notation/NotationView.cpp:4719
+#, fuzzy
+msgid "Exporting LilyPond file..."
+msgstr "S'està exportant el fitxer Lilypond..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5008
+#, fuzzy
+msgid "LilyPond files"
+msgstr "Fitxers Lilypond"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5023
+#: ../src/gui/editors/notation/NotationView.cpp:4653
+#, fuzzy
+msgid "Printing LilyPond file..."
+msgstr "S'està visualitzant el fitxer Lilypond..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5028
+#: ../src/gui/application/RosegardenGUIApp.cpp:5052
+#: ../src/gui/editors/notation/NotationView.cpp:4658
+#: ../src/gui/editors/notation/NotationView.cpp:4682
+#, fuzzy
+msgid "Failed to open a temporary file for LilyPond export."
+msgstr "No s'ha pogut obrir un fitxer temportal per exportar com a Lilypond."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5047
+#: ../src/gui/editors/notation/NotationView.cpp:4677
+#, fuzzy
+msgid "Previewing LilyPond file..."
+msgstr "S'està visualitzant el fitxer Lilypond..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5080
+#: ../src/gui/editors/notation/NotationView.cpp:4710
+#, fuzzy
+msgid "LilyPond Preview Options"
+msgstr "Opcions Lilypond de la mostra prèvia "
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5081
+#: ../src/gui/editors/notation/NotationView.cpp:4711
+#, fuzzy
+msgid "LilyPond preview options"
+msgstr "Opcions Lilypond de la mostra prèvia "
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5112
+#: ../src/gui/application/RosegardenGUIApp.cpp:5126
+msgid "Exporting MusicXML file..."
+msgstr "S'està exportant el fitxer MusicXML..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5115
+msgid "XML files"
+msgstr "Fitxers XML"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5289
+#: ../src/gui/editors/segment/TrackButtons.cpp:417
+msgid ""
+"The audio file path does not exist or is not writable.\n"
+"Please set the audio file path to a valid directory in Document Properties "
+"before recording audio.\n"
+"Would you like to set it now?"
+msgstr ""
+"La ubicació del fitxer d'àudio no existeix o no s'hi pot escriure.\n"
+"Seleccioneu una ubicació correcta, en les propietats del document abans de "
+"gravar l'àudio.\n"
+"Voleu configurar-ho ara?"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5337
+msgid ""
+"The audio file path does not exist or is not writable.\n"
+"Please set the audio file path to a valid directory in Document Properties "
+"before you start to record audio.\n"
+"Would you like to set it now?"
+msgstr ""
+"La ubicació del fitxer d'àudio no existeix o no s'hi pot escriure.\n"
+"Seleccioneu una ubicació correcta, en les propietats del document abans de "
+"gravar l'àudio.\n"
+"Voleu configurar-ho ara?"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5780
+#, fuzzy
+msgid "Move playback pointer to time"
+msgstr "Punt de reproducció al &cursor"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5793
+#: ../src/gui/editors/matrix/MatrixView.cpp:2240
+msgid "%1%"
+msgstr "%1%"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5861
+#, c-format
+msgid "Replace Tempo Change at %1"
+msgstr "Reemplaça l'últim canvi de tempo a %1"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5891
+msgid "Set Global and Default Tempo"
+msgstr "Estableix el tempo global i per defecte"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5914
+#, fuzzy
+msgid "Move Tempo Change"
+msgstr "Elimina el canvi de &tempo..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5949
+#, fuzzy
+msgid "new marker"
+msgstr "Cap submaster"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5950
+#, fuzzy
+msgid "no description"
+msgstr "Descripció"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:6363
+#, c-format
+msgid "Sequencer failed to add audio file %1"
+msgstr "El seqüenciador no ha pogut afegir el fitxer d'àduio %1"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:6388
+#, c-format
+msgid "Sequencer failed to remove audio file id %1"
+msgstr "El seqüenciador no ha pogut suprimir el fitxer d'àduio %1"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:6448
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:1086
+msgid "Modify Segment label"
+msgstr "Canvia l'etiqueta del fragment"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:6450
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:1088
+msgid "Modify Segments label"
+msgstr "Canvia l'etiqueta dels fragments"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:6452
+msgid "Relabelling selection..."
+msgstr "S'estan canviant les etiquetes de la selecció..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7539
+msgid "Play List"
+msgstr "Llista de peces"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7567
+msgid "http://rosegarden.sourceforge.net/tutorial/en/chapter-0.html"
+msgstr "http://rosegarden.sourceforge.net/tutorial/en/chapter-0.html"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7574
+msgid "http://rosegarden.sourceforge.net/tutorial/bug-guidelines.html"
+msgstr "http://rosegarden.sourceforge.net/tutorial/bug-guidelines.html"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7650
+msgid "Queueing MIDI panic events for tranmission..."
+msgstr "S'estan encuant els esdeveniments de pànic MIDI per la transmissió..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7708
+msgid "Are you sure you want to save this as your default studio?"
+msgstr "Voleu desar-ho com a estudi per defecte?"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7713
+msgid "Saving current document as default studio..."
+msgstr "S'està desant el document actual com a estudi per defecte..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7738
+msgid ""
+"Are you sure you want to import your default studio and lose the current one?"
+msgstr "Voleu importar el vostre estudi per defecte i perdre l'actual?"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7773
+msgid "Import Studio from File"
+msgstr "Importa l'estudi des d'un fitxer"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7807
+msgid "Import Studio"
+msgstr "Importa l'estudi"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:8015
+msgid ""
+"<h3>Newer version available</h3><p>A newer version of Rosegarden may be "
+"available.<br>Please consult the <a href=\"http://www.rosegardenmusic.com/"
+"getting/\">Rosegarden website</a> for more information.</p>"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:8016
+#, fuzzy
+msgid "Newer version available"
+msgstr "Localitzat (quan sigui possible)"
+
+#: ../src/gui/application/RosegardenApplication.cpp:104
+#, c-format
+msgid "Failed to load soundfont %1"
+msgstr "No s'ha pogut carregar el fitxer de so %1"
+
+#: ../src/gui/application/main.cpp:311
+msgid "Rosegarden - A sequencer and musical notation editor"
+msgstr "Rosegarden - Un seqüenciador i editor de partitures"
+
+#: ../src/gui/application/main.cpp:315
+msgid "Don't use the sequencer (support editing only)"
+msgstr "No feu servir el seqüenciador (només està permesa l'edició)"
+
+#: ../src/gui/application/main.cpp:316
+msgid "Don't show the splash screen"
+msgstr "No mostris la pantalla de presentació"
+
+#: ../src/gui/application/main.cpp:317
+msgid "Don't automatically run in the background"
+msgstr "No executis automàticament en segon pla"
+
+#: ../src/gui/application/main.cpp:318
+msgid "Attach to a running sequencer process, if found"
+msgstr "Si hi és, adjunta'l a un procés actiu del seqüenciador"
+
+#: ../src/gui/application/main.cpp:319
+msgid "Ignore installed version - for devs only"
+msgstr "Ignora la versió instal·lada - només per devs"
+
+#: ../src/gui/application/main.cpp:320
+msgid "file to open"
+msgstr "fitxer per obrir"
+
+#: ../src/gui/application/main.cpp:370
+msgid "Installation contains the wrong version of Rosegarden."
+msgstr "La instal·lació conté una versió.incorrecta del Rosegarden"
+
+#: ../src/gui/application/main.cpp:371
+#, fuzzy
+msgid ""
+" The wrong versions of Rosegarden's data files were\n"
+" found in the standard KDE installation directories.\n"
+" (I am %1, but the installed files are for version %2.)\n"
+"\n"
+" This may mean one of the following:\n"
+"\n"
+" 1. This is a new upgrade of Rosegarden, and it has not yet been\n"
+" installed. If you compiled it yourself, check that you have\n"
+" run \"make install\" and that the procedure completed\n"
+" successfully.\n"
+"\n"
+" 2. The upgrade was installed in a non-standard directory,\n"
+" and an old version was found in a standard directory. If so,\n"
+" you will need to add the correct directory to your KDEDIRS\n"
+" environment variable before you can run it."
+msgstr ""
+" Les versions incorrectes dels fitxers de dades del Rosegarden\n"
+" s'han trobat en les carpetes normals d'instal·lació de KDE.\n"
+" (Aquest programa és %1, però els fitxers instal·lats són\n"
+" per a la versió %2.)\n"
+"\n"
+" Això pot ser degut a una de les raons següents:\n"
+"\n"
+" 1. Aquesta és una actualització del Rosegarden, que no s'ha\n"
+" instal·lat encara. Si l'heu compilada vós mateix, comproveu\n"
+" que heu executat \"make install\" i que el procediment s'ha\n"
+" completat satisfactòriament.\n"
+"\n"
+" 2. L'actualització s'ha instal·lat en una carpeta que no és habitual,\n"
+" i una versió anterior s'ha trobat en la carpeta habitual.\n"
+" Si és així, cal que afegiu la carpeta correcta a la variable\n"
+" d'entorn KDEDIRS abans d'executar el programa."
+
+#: ../src/gui/application/main.cpp:383 ../src/gui/application/main.cpp:401
+msgid "Installation problem"
+msgstr "Problema d'instal·lació"
+
+#: ../src/gui/application/main.cpp:389
+msgid "Rosegarden does not appear to have been installed."
+msgstr "Sembla que el Rosegarden no s'ha instal·lat bé."
+
+#: ../src/gui/application/main.cpp:390
+#, fuzzy
+msgid ""
+" One or more of Rosegarden's data files could not be\n"
+" found in the standard KDE installation directories.\n"
+"\n"
+" This may mean one of the following:\n"
+"\n"
+" 1. Rosegarden has not been correctly installed. If you compiled\n"
+" it yourself, check that you have run \"make install\" and that\n"
+" the procedure completed successfully.\n"
+"\n"
+" 2. Rosegarden has been installed in a non-standard directory,\n"
+" and you need to add this directory to your KDEDIRS environment\n"
+" variable before you can run it. This may be the case if you\n"
+" installed into $HOME or a local third-party package directory\n"
+" like /usr/local or /opt."
+msgstr ""
+" Un o més fitxers de dades del Rosegarden no s'han trobat\n"
+" en les carpetes normals d'instal·lació de KDE.\n"
+"\n"
+" Això pot ser degut a una de les raons següents:\n"
+"\n"
+" 1. El Rosegarden no s'ha instal·lat correctament. Si heu\n"
+" compilat el programa vós mateix, comproveu que heu executat\n"
+" \"make install\" i que el procediment s'ha completat\n"
+" satisfactòriament.\n"
+"\n"
+" 2. El Rosegarden s'ha instal·lat en una carpeta que no és habitual,\n"
+" i cal afegir aquesta carpeta a la variable d'entorn KDEDIRS\n"
+" abans d'executar el programa. Això pot ser degut a que l'heu\n"
+" instal·lat en la carpeta $HOME o en una carpeta local\n"
+" de paquets de tercers, com /usr/local o /opt."
+
+#: ../src/gui/application/main.cpp:414
+msgid "Rosegarden"
+msgstr "Rosegarden"
+
+#: ../src/gui/application/main.cpp:416
+#, fuzzy
+msgid ""
+"Copyright 2000 - 2008 Guillaume Laurent, Chris Cannam, Richard Bown\n"
+"Parts copyright 1994 - 2004 Chris Cannam, Andy Green, Richard Bown, "
+"Guillaume Laurent\n"
+"LilyPond fonts copyright 1997 - 2005 Han-Wen Nienhuys and Jan Nieuwenhuizen"
+msgstr ""
+"Copyright: 2000 - 2005 Guillaume Laurent, Chris Cannam, Richard Bown\n"
+"Parts del copyright: 1994 - 2004 Chris Cannam, Andy Green, Richard Bown, "
+"Guillaume Laurent\n"
+"Tipus de lletra de Lilypond: copyright 1997 - 2005 Han-Wen Nienhuys i Jan "
+"Nieuwenhuizen"
+
+#: ../src/gui/application/main.cpp:428
+msgid "Chord labelling code"
+msgstr "Codi de l'etiquetat dels acords"
+
+#: ../src/gui/application/main.cpp:429
+#, fuzzy
+msgid ""
+"LilyPond output\n"
+"assorted other patches\n"
+"i18n-ization"
+msgstr ""
+"exportació a Lilypond\n"
+"pedaços diversos\n"
+"internacionalització"
+
+#: ../src/gui/application/main.cpp:430
+msgid ""
+"UI improvements\n"
+"bug fixes"
+msgstr ""
+"millores en la interfície de l'usuari\n"
+"correccions d'errors"
+
+#: ../src/gui/application/main.cpp:431
+msgid ""
+"Segment colours\n"
+"Other UI and bug fixes"
+msgstr ""
+"Colors del fragment\n"
+"Interfície i correcció de bugs"
+
+#: ../src/gui/application/main.cpp:432
+msgid ""
+"Russian translation\n"
+"i18n-ization"
+msgstr ""
+"traducció al rus\n"
+"internacionalització"
+
+#: ../src/gui/application/main.cpp:433 ../src/gui/application/main.cpp:434
+msgid "German translation"
+msgstr "traducció a l'alemany"
+
+#: ../src/gui/application/main.cpp:435
+msgid "Welsh translation"
+msgstr "traducció al gal·lès"
+
+#: ../src/gui/application/main.cpp:436
+msgid "French translation"
+msgstr "traducció al francès"
+
+#: ../src/gui/application/main.cpp:437
+#, fuzzy
+msgid ""
+"French translation\n"
+"Bug fixes"
+msgstr "traducció al francès"
+
+#: ../src/gui/application/main.cpp:438 ../src/gui/application/main.cpp:439
+msgid "Italian translation"
+msgstr "traducció a l'italià"
+
+#: ../src/gui/application/main.cpp:440 ../src/gui/application/main.cpp:441
+msgid "Swedish translation"
+msgstr "traducció al suec"
+
+#: ../src/gui/application/main.cpp:442
+msgid "Estonian translation"
+msgstr "traducció a l'estonià"
+
+#: ../src/gui/application/main.cpp:443 ../src/gui/application/main.cpp:444
+msgid "Dutch translation"
+msgstr "traducció a l'holandès"
+
+#: ../src/gui/application/main.cpp:445
+msgid "HSpinBox class"
+msgstr "classe HSpinBox"
+
+#: ../src/gui/application/main.cpp:446
+msgid "Transposition by interval"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:447
+msgid "Original designs for rotary controllers"
+msgstr "dissenys originals per a controls rotatoris"
+
+#: ../src/gui/application/main.cpp:448
+msgid "Japanese translation"
+msgstr "traducció al japonès"
+
+#: ../src/gui/application/main.cpp:449
+msgid ""
+"Auto-scroll deceleration\n"
+"Rests outside staves and other bug fixes"
+msgstr ""
+"Desacceleració dels desplaçaments\n"
+"Silencis fora de lloc i altres bugs"
+
+#: ../src/gui/application/main.cpp:450
+msgid "Simplified Chinese translation"
+msgstr "traducció al xinès simplificat"
+
+#: ../src/gui/application/main.cpp:451
+msgid "LIRC infrared remote-controller support"
+msgstr "Connexió a controladors remots d'infrarojos LIRC"
+
+#: ../src/gui/application/main.cpp:452
+msgid "MTC slave timing implementation"
+msgstr "Implementació del temporitzador MTC esclau"
+
+#: ../src/gui/application/main.cpp:453
+msgid "Czech translation"
+msgstr "traducció al txec"
+
+#: ../src/gui/application/main.cpp:454
+msgid "SCons/bksys building system"
+msgstr "Sistema constructor SCons/bksys"
+
+#: ../src/gui/application/main.cpp:455
+msgid "icons, icons, icons"
+msgstr "icones, icones, icones"
+
+#: ../src/gui/application/main.cpp:456 ../src/gui/application/main.cpp:457
+#: ../src/gui/application/main.cpp:458 ../src/gui/application/main.cpp:459
+msgid "Spanish translation"
+msgstr "traducció a l'espanyol"
+
+#: ../src/gui/application/main.cpp:460 ../src/gui/application/main.cpp:461
+msgid "Catalan translation"
+msgstr "traducció al català"
+
+#: ../src/gui/application/main.cpp:462
+msgid ""
+"1.2.3 splash screen photo\n"
+"Gave birth to D. Michael McIntyre, bought him a good flute once\n"
+"upon a time, and always humored him when he came over to play her\n"
+"some new instrument, even though she really hated his playing.\n"
+"Born October 19, 1951, died September 21, 2007, R. I. P."
+msgstr ""
+
+#: ../src/gui/application/main.cpp:463
+#, fuzzy
+msgid "Initial guitar chord editing code"
+msgstr "editor d'acords de guitarra"
+
+#: ../src/gui/application/main.cpp:464
+#, fuzzy
+msgid "Polish translation"
+msgstr "traducció al gal·lès"
+
+#: ../src/gui/application/main.cpp:465
+#, fuzzy
+msgid "Basque translation"
+msgstr "traducció al japonès"
+
+#: ../src/gui/application/main.cpp:466
+msgid "Klearlook theme"
+msgstr ""
+
+#: ../src/_translatorinfo.cpp:1 ../src/gui/application/main.cpp:468
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr "Feliu Ferrer i Valero, Quim Perez i Noguer"
+
+#: ../src/_translatorinfo.cpp:3 ../src/gui/application/main.cpp:468
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+
+#: ../src/gui/application/main.cpp:719
+msgid "Welcome!"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:731
+msgid ""
+"<h2>Welcome to Rosegarden!</h2><p>Welcome to the Rosegarden audio and MIDI "
+"sequencer and musical notation editor.</p><ul><li>If you have not already "
+"done so, you may wish to install some DSSI synth plugins, or a separate "
+"synth program such as QSynth. Rosegarden does not synthesize sounds from "
+"MIDI on its own, so without these you will hear nothing.</"
+"li><br><br><li>Rosegarden uses the JACK audio server for recording and "
+"playback of audio, and for playback from DSSI synth plugins. These features "
+"will only be available if the JACK server is running.</"
+"li><br><br><li>Rosegarden has comprehensive documentation: see the Help menu "
+"for the handbook, tutorials, and other information!</li></ul><p>Rosegarden "
+"was brought to you by a team of volunteers across the world. To learn more, "
+"go to <a href=\"http://www.rosegardenmusic.com/\">http://www.rosegardenmusic."
+"com/</a>.</p>"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIView.cpp:257
+msgid "No non-audio segments in composition"
+msgstr "No hi han fragments de no-àudio en la composició"
+
+#: ../src/gui/application/RosegardenGUIView.cpp:333
+msgid "Selection must contain only audio or non-audio segments"
+msgstr "La selecció només pot tenir fragments d'àudio o de no-àudio"
+
+#: ../src/gui/application/RosegardenGUIView.cpp:431
+#: ../src/gui/application/RosegardenGUIView.cpp:576
+#: ../src/gui/application/RosegardenGUIView.cpp:612
+#: ../src/gui/application/RosegardenGUIView.cpp:776
+msgid "No non-audio segments selected"
+msgstr "No s'ha seleccionat cap fragment de no-àudio"
+
+#: ../src/gui/application/RosegardenGUIView.cpp:851
+#, fuzzy
+msgid ""
+"You've not yet defined an audio editor for Rosegarden to use.\n"
+"See Settings -> Configure Rosegarden -> Audio."
+msgstr ""
+"Encara no heu definit un editor d'àudio per utilitzar-lo amb el Rosegarden.\n"
+"Mireu Configuració -> Configuració del Rosegarden -> General -> Editors "
+"externs."
+
+#: ../src/gui/application/RosegardenGUIView.cpp:1559
+#: ../src/gui/application/RosegardenGUIView.cpp:1564
+msgid "Can't add dropped file. "
+msgstr "No s'ha pogut afegir el fitxer deixat. "
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1014
+#: ../src/gui/seqmanager/SequenceManager.cpp:1150
+msgid ""
+"The JACK Audio subsystem has failed or it has stopped Rosegarden from "
+"processing audio.\n"
+"Please restart Rosegarden to continue working with audio.\n"
+"Quitting other running applications may improve Rosegarden's performance."
+msgstr ""
+"El subsistema d'àudio del JACK ha fallat o s'ha desconnectat l'àudio del "
+"Rosegarden des de la consola JACK.\n"
+"Reinicieu el Rosegarden per tornar a tenir l'àudio funcionant.\n"
+"Si sortiu de les altres aplicacions que estan corrent, millorareu el "
+"rendiment del Rosegarden."
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1020
+#: ../src/gui/seqmanager/SequenceManager.cpp:1156
+msgid ""
+"The JACK Audio subsystem has stopped Rosegarden from processing audio, "
+"probably because of a processing overload.\n"
+"An attempt to restart the audio service has been made, but some problems may "
+"remain.\n"
+"Quitting other running applications may improve Rosegarden's performance."
+msgstr ""
+"El subsistema d'àudio del JACK ha parat de processar l'àudio del Rosegarden, "
+"segurament perquè el sistema està sobrecarregat.\n"
+"S'ha provat de reiniciar el Rosegarden però no ha anat bé, encara deu haver-"
+"hi algun problema.\n"
+"Si sortiu de les altres aplicacions que estan corrent, millorareu el "
+"rendiment del Rosegarden."
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1031
+msgid ""
+"Run out of processor power for real-time audio processing. Cannot continue."
+msgstr ""
+"No es té prou potència per al processat de l'àudio en temps real. No es pot "
+"continuar."
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1057
+msgid ""
+"A serious error has occurred in the ALSA MIDI subsystem. It may not be "
+"possible to continue sequencing. Please check console output for more "
+"information."
+msgstr ""
+"El subsistema ALSA MIDI ha tingut un problema seriós. No es podrà continuar "
+"amb la seqüenciació. Si voleu més informació mireu la consola de sortida."
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1078
+msgid "JACK Audio subsystem is losing sample frames."
+msgstr "El subsitema d'àudio JACK no dóna l'abast."
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1096
+msgid ""
+"Failed to read audio data from disc in time to service the audio subsystem."
+msgstr ""
+"No s'ha pogut llegir les dades del disc a temps per servir-les al subsistema "
+"d'àudio."
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1100
+msgid ""
+"Failed to write audio data to disc fast enough to service the audio "
+"subsystem."
+msgstr ""
+"No s'ha pogut escriure les dades del disc a temps per servir-les al "
+"subsistema d'àudio."
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1104
+msgid "The audio mixing subsystem is failing to keep up."
+msgstr "El subsistema mesclador d'àudio no ha pogut continuar"
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1108
+msgid "The audio subsystem is failing to keep up."
+msgstr "El subsistema d'àudio no ha pogut continuar"
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1112
+msgid "Unknown sequencer failure mode!"
+msgstr "El seqüenciador té un problema desconegut!"
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1170
+#, fuzzy
+msgid ""
+"<h3>System timer resolution is too low</h3><p>Rosegarden was unable to find "
+"a high-resolution timing source for MIDI performance.</p><p>This may mean "
+"you are using a Linux system with the kernel timer resolution set too low. "
+"Please contact your Linux distributor for more information.</p><p>Some Linux "
+"distributors already provide low latency kernels, see <a href=\"http://"
+"rosegarden.wiki.sourceforge.net/Low+latency+kernels\">http://rosegarden.wiki."
+"sourceforge.net/Low+latency+kernels</a> for instructions.</p>"
+msgstr ""
+"<h3>El rellotge del sistema és massa lent</h3><p>El Rosegarden no ha pogut "
+"trobar un rellotge d'alta freqüència per millorar l'eficència del MIDI.</"
+"p><p>Això vol dir que esteu fent servir un sistema Linux amb el kernel "
+"configurat perquè el rellotge del sistema vagi lent. Demaneu ajuda al "
+"vostre distribuidor Linux.</p>"
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1188
+#, fuzzy
+msgid ""
+"<h3>System timer resolution is too low</h3><p>Rosegarden was unable to find "
+"a high-resolution timing source for MIDI performance.</p><p>You may be able "
+"to solve this problem by loading the RTC timer kernel module. To do this, "
+"try running <b>sudo modprobe snd-rtctimer</b> in a terminal window and then "
+"restarting Rosegarden.</p><p>Alternatively, check whether your Linux "
+"distributor provides a multimedia-optimized kernel. See <a href=\"http://"
+"rosegarden.wiki.sourceforge.net/Low+latency+kernels\">http://rosegarden.wiki."
+"sourceforge.net/Low+latency+kernels</a> for notes about this.</p>"
+msgstr ""
+"<h3>El rellotge del sistema és massa lent</h3><p>El Rosegarden no ha pogut "
+"trobar un rellotge d'alta freqüència per millorar l'eficència del MIDI.</"
+"p><p>Això vol dir que esteu fent servir un sistema Linux amb el kernel "
+"configurat perquè el rellotge del sistema vagi lent. Demaneu ajuda al "
+"vostre distribuidor Linux.</p>"
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1312
+msgid ""
+"<p>Both MIDI and Audio subsystems have failed to initialize.</p><p>You may "
+"continue without the sequencer, but we suggest closing Rosegarden, running "
+"\"alsaconf\" as root, and starting Rosegarden again. If you wish to run "
+"with no sequencer by design, then use \"rosegarden --nosequencer\" to avoid "
+"seeing this error in the future.</p>"
+msgstr ""
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1314
+msgid ""
+"<p>The MIDI subsystem has failed to initialize.</p><p>You may continue "
+"without the sequencer, but we suggest closing Rosegarden, running \"modprobe "
+"snd-seq-midi\" as root, and starting Rosegarden again. If you wish to run "
+"with no sequencer by design, then use \"rosegarden --nosequencer\" to avoid "
+"seeing this error in the future.</p>"
+msgstr ""
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1316
+msgid ""
+"<p>The Rosegarden sequencer module version does not match the GUI module "
+"version.</p><p>You have probably mixed up files from two different versions "
+"of Rosegarden. Please check your installation.</p>"
+msgstr ""
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1322
+#, fuzzy, c-format
+msgid "<h3>Sequencer startup failed</h3>%1"
+msgstr "No s'ha pogut engegar el seqüenciador: %1"
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1330
+msgid ""
+"<h3>Failed to connect to JACK audio server.</h3><p>Rosegarden could not "
+"connect to the JACK audio server. This probably means the JACK server is "
+"not running.</p><p>If you want to be able to play or record audio files or "
+"use plugins, you should exit Rosegarden and start the JACK server before "
+"running Rosegarden again.</p>"
+msgstr ""
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1331
+msgid "Failed to connect to JACK"
+msgstr ""
+
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:46
+msgid "Modify MIDI filters..."
+msgstr "Modifica els filtres MIDI..."
+
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:58
+msgid "THRU events to ignore"
+msgstr "Esdeveniments THRU per ignorar"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:131
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:60
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:96
+msgid "Note"
+msgstr "Nota"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:132
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:61
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:97
+msgid "Program Change"
+msgstr "Canvi de programa"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:136
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:62
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:98
+msgid "Key Pressure"
+msgstr "Pressió de la tecla"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:137
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:63
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:99
+msgid "Channel Pressure"
+msgstr "Pressió del canal"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:134
+#: ../src/gui/general/EditView.cpp:899
+#: ../src/gui/rulers/ControllerEventsRuler.cpp:198
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:64
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:100
+msgid "Pitch Bend"
+msgstr "Inflexió de to"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:133
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:65
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:101
+msgid "Controller"
+msgstr "Controlador"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:135
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:66
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:102
+msgid "System Exclusive"
+msgstr "Sistema exclusiu"
+
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:94
+msgid "RECORD events to ignore"
+msgstr "Esdeveniments RECORD per ignorar"
+
+#: ../src/gui/widgets/TimeWidget.cpp:101
+msgid "Note:"
+msgstr "Nota:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:108 ../src/gui/widgets/TimeWidget.cpp:145
+msgid "<inexact>"
+msgstr "<inexacte>"
+
+#: ../src/gui/widgets/TimeWidget.cpp:151
+msgid "Units:"
+msgstr "Unitats:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:173
+msgid "Time:"
+msgstr "Temps:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:184
+msgid "units"
+msgstr "unitats"
+
+#: ../src/gui/widgets/TimeWidget.cpp:193
+msgid "Measures:"
+msgstr "Mesures:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:193
+msgid "Measure:"
+msgstr "Mesura:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:212
+msgid "beats:"
+msgstr "pulsacions:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:212
+msgid "beat:"
+msgstr "pulsació:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:230
+msgid "%1:"
+msgstr "%1:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:254
+msgid "Seconds:"
+msgstr "Segons:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:273
+msgid "msec:"
+msgstr "Milisegons:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:407 ../src/gui/widgets/TimeWidget.cpp:531
+msgid "(%1/%2 time)"
+msgstr "(%1/%2 temps)"
+
+#: ../src/gui/widgets/TimeWidget.cpp:452
+msgid "(starting %1.%2 qpm, %2.%3 bpm)"
+msgstr "(inici %1.%2 qpm, %2.%3 bpm)"
+
+#: ../src/gui/widgets/TimeWidget.cpp:458
+msgid "(starting %1.%2 bpm)"
+msgstr "(inici %1.%2 bpm)"
+
+#: ../src/gui/widgets/TimeWidget.cpp:464
+msgid "(%1.%2 qpm, %2.%3 bpm)"
+msgstr "(%1.%2 qpm, %2.%3 bpm)"
+
+#: ../src/gui/widgets/TimeWidget.cpp:470
+msgid "(%1.%2 bpm)"
+msgstr "(%1.%2 bpm)"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:239
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:60
+msgid "C"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:241
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:61
+#, fuzzy
+msgid "D"
+msgstr "Id"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:243
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:62
+msgid "E"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:244
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:63
+msgid "F"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:246
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:64
+msgid "G"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:248
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:65
+#, fuzzy
+msgid "A"
+msgstr "A4"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:250
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:66
+msgid "B"
+msgstr ""
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:70
+msgid "-2"
+msgstr ""
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:71
+msgid "-1"
+msgstr ""
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:72
+msgid "0"
+msgstr "0"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:73
+#, fuzzy
+msgid "1"
+msgstr "%1"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:74
+msgid "2"
+msgstr ""
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:75
+msgid "3"
+msgstr ""
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:76
+#, fuzzy
+msgid "4"
+msgstr "A4"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:77
+msgid "5"
+msgstr ""
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:78
+msgid "6"
+msgstr ""
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:79
+msgid "7"
+msgstr ""
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:83
+#, fuzzy
+msgid "double flat"
+msgstr "Doble bemoll"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:84
+#, fuzzy
+msgid "flat"
+msgstr "Bemoll"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:85
+#, fuzzy
+msgid "natural"
+msgstr "Becaire"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:86
+#, fuzzy
+msgid "sharp"
+msgstr "Diesi"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:87
+#, fuzzy
+msgid "double sharp"
+msgstr "Doble diesi"
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:234
+#, c-format
+msgid "In %1"
+msgstr "Entrada %1"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:587
+#: ../src/gui/widgets/AudioRouteMenu.cpp:236
+#: ../src/gui/widgets/AudioRouteMenu.cpp:259
+msgid "Master"
+msgstr "Master"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:528
+#: ../src/gui/widgets/AudioRouteMenu.cpp:238
+#: ../src/gui/widgets/AudioRouteMenu.cpp:261
+#, c-format
+msgid "Sub %1"
+msgstr "Sub %1"
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:244
+msgid "In %1 R"
+msgstr "Entrada %1 D"
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:245
+msgid "In %1 L"
+msgstr "Entrada %1 E"
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:247
+msgid "Master R"
+msgstr "Master D"
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:248
+msgid "Master L"
+msgstr "Master E"
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:250
+msgid "Sub %1 R"
+msgstr "Sub %1 D"
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:251
+msgid "Sub %1 L"
+msgstr "Sub %1 E"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:391
+#: ../src/gui/studio/AudioMixerWindow.cpp:522
+#: ../src/gui/widgets/AudioFaderBox.cpp:82
+msgid "Audio plugin button"
+msgstr "Botó del connector d'àudio"
+
+#: ../src/gui/editors/parameters/AudioInstrumentParameterPanel.cpp:129
+#: ../src/gui/editors/parameters/AudioInstrumentParameterPanel.cpp:357
+#: ../src/gui/widgets/AudioFaderBox.cpp:91
+msgid "<no synth>"
+msgstr "<sense sintetitzador>"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:93
+msgid "Synth plugin button"
+msgstr "Botó del sintonitzador"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:153
+#, fuzzy
+msgid "Set the audio pan position in the stereo field"
+msgstr "Ubica la posició d'inici de l'àudio en el camp estéreo."
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:155
+msgid "Open synth plugin's native editor"
+msgstr "Obre a l'editor natiu del connector del sintonitzador"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:157
+msgid "Mono or Stereo Instrument"
+msgstr "Instrument mono o stereo"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:159
+msgid "Record level"
+msgstr "Volum d'enregistrament"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:161
+msgid "Playback level"
+msgstr "Volum de reproducció"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:345
+#: ../src/gui/studio/AudioMixerWindow.cpp:347
+#: ../src/gui/studio/AudioMixerWindow.cpp:503
+#: ../src/gui/studio/AudioMixerWindow.cpp:505
+#: ../src/gui/widgets/AudioFaderBox.cpp:163
+msgid "Audio level"
+msgstr "Nivell d'àudio"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:170
+msgid "In:"
+msgstr "Entrada:"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:173
+msgid "Out:"
+msgstr "Sortida:"
+
+#: ../src/gui/widgets/ProgressDialog.cpp:48
+#: ../src/gui/widgets/ProgressDialog.cpp:53
+#: ../src/gui/widgets/ProgressDialog.cpp:76
+msgid "Processing..."
+msgstr "S'està processant..."
+
+#: ../src/gui/configuration/ColourConfigurationPage.h:60
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:130
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:346
+#: ../src/gui/widgets/ColourTable.cpp:52
+msgid "Color"
+msgstr "Color"
+
+#: ../src/gui/widgets/ColourTable.cpp:68
+msgid "Modify Color Name"
+msgstr "Modifica el nom del color"
+
+#: ../src/gui/configuration/ColourConfigurationPage.cpp:129
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:983
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:882
+#: ../src/gui/widgets/ColourTable.cpp:68
+msgid "Enter new name"
+msgstr "Introdueix un nom nou"
+
+#: ../src/gui/widgets/ColourTable.cpp:107
+msgid "Default Color"
+msgstr "Color per defecte"
+
+#: ../src/gui/widgets/Rotary.cpp:108
+msgid ""
+"Click and drag up and down or left and right to modify.\n"
+"Double click to edit value directly."
+msgstr ""
+"Clica i arrossega-ho amunt i avall o d'esquerra a dreta per modificar-lo.\n"
+"Fes doble clic per editar el valor directament."
+
+#: ../src/gui/widgets/Rotary.cpp:433
+msgid "Select a new value"
+msgstr "Seleccioneu un nou valor"
+
+#: ../src/gui/widgets/Rotary.cpp:434
+msgid "Enter a new value"
+msgstr "Introduïu un nou valor"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:80
+msgid "Quantizer"
+msgstr "Quantificador"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:86
+msgid "Quantizer type:"
+msgstr "Tipus de quantificador:"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:88
+#, fuzzy
+msgid "Grid quantizer"
+msgstr "Quantifica graelles"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:89
+msgid "Legato quantizer"
+msgstr "Quantifica legatos"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:90
+msgid "Heuristic notation quantizer"
+msgstr "Quantifica compassos heurístics"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:94
+msgid "Quantize for notation only (leave performance unchanged)"
+msgstr "Només quantifica els compassos (deixa la qualitat sense canvis)"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:104
+msgid "Notation parameters"
+msgstr "Propietats del compàs"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:109
+#: ../src/gui/widgets/QuantizeParameters.cpp:150
+msgid "Base grid unit:"
+msgstr "Unitat bàsica de la graella:"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:114
+msgid "Complexity:"
+msgstr "Complexitat:"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:118
+msgid "Very high"
+msgstr "Molt alta"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:119
+msgid "High"
+msgstr "Alta"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:224
+#: ../src/gui/widgets/QuantizeParameters.cpp:120
+msgid "Normal"
+msgstr "Normal"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:121
+msgid "Low"
+msgstr "Baixa"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:122
+msgid "Very low"
+msgstr "Molt baixa"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:125
+#, fuzzy
+msgid "Tuplet level:"
+msgstr "Nivell de tuplet:"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:129
+msgid "2-in-the-time-of-3"
+msgstr "2 en el temps de 3"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4241
+#: ../src/gui/widgets/QuantizeParameters.cpp:130
+msgid "Triplet"
+msgstr "Treset"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:138
+msgid "Any"
+msgstr "Qualsevol"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:141
+msgid "Permit counterpoint"
+msgstr "Permet contrapnt"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:145
+msgid "Grid parameters"
+msgstr "Paràmetres de la graella"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:154
+#, fuzzy
+msgid "Swing:"
+msgstr "Swing:"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:159
+msgid "Iterative amount:"
+msgstr "Quantitat iterativa:"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:165
+msgid "Quantize durations as well as start times"
+msgstr "Quantifica la duració tant com el temps d'inici"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:169
+msgid "After quantization"
+msgstr "Després de quantificar"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:183
+msgid "Show advanced options"
+msgstr "Mostra les opcions avançades"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:192
+msgid "Re-beam"
+msgstr "Torna a posar les barres d'agrupació"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:194
+msgid "Add articulations (staccato, tenuto, slurs)"
+msgstr "Afegeix articulacions (staccato, els tenuto, lligats)"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:195
+msgid "Tie notes at barlines etc"
+msgstr "Lliga les notes a les barres etc"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:196
+msgid "Split-and-tie overlapping chords"
+msgstr "Divideix-i-lliga els acords encavalcats"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:307
+msgid "Full quantize"
+msgstr "Quantificació total"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:450
+msgid "Show Advanced Options"
+msgstr "Mostra les opcions avançades"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:454
+msgid "Hide Advanced Options"
+msgstr "Oculta les opcions avançades"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:257
+#: ../src/gui/configuration/MatrixConfigurationPage.h:56
+#: ../src/gui/configuration/MatrixConfigurationPage.h:57
+#: ../src/gui/editors/matrix/MatrixView.cpp:2709
+msgid "Matrix"
+msgstr "Matriu"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:64
+msgid "Printable headers"
+msgstr ""
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:92
+#, fuzzy
+msgid "Dedication"
+msgstr "Indicació"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:96
+#: ../src/gui/editors/segment/PlayListView.cpp:35
+msgid "Title"
+msgstr "Títol"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:100
+msgid "Subtitle"
+msgstr "Subtítol"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:104
+#, fuzzy
+msgid "Subsubtitle"
+msgstr "Subtítol"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:108
+#, fuzzy
+msgid "Poet"
+msgstr "silenci"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:116
+msgid "Composer"
+msgstr "Compositor"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:120
+#, fuzzy
+msgid "Meter"
+msgstr "Master"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:124
+msgid "Arranger"
+msgstr "Retocs"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:128
+#, fuzzy
+msgid "Piece"
+msgstr "Altures"
+
+#: ../data/fonts/mappings/fonts.cpp:26
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:132
+msgid "Opus"
+msgstr "Opus"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:136
+msgid "Copyright"
+msgstr "Copyright"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:140
+#, fuzzy
+msgid "Tagline"
+msgstr "Triangle"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:155
+#, fuzzy
+msgid "The composition comes here."
+msgstr "Canvia la duració de la composició"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:172
+msgid "Non-printable headers"
+msgstr ""
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:213
+msgid "Add New Property"
+msgstr "Afegeix una nova propietat"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:217
+msgid "Delete Property"
+msgstr "Suprimeix aquesta propietat"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:236
+msgid "{new property %1}"
+msgstr "{nova propietat %1}"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:236
+msgid "{new property}"
+msgstr "{nova propietat}"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:243
+msgid "{undefined}"
+msgstr "{indefinit}"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:87
+#, fuzzy
+msgid "Double-click opens segment in"
+msgstr "Editor per defecte (quan es faci doble clic en un fragment)"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:91
+#, fuzzy
+msgid "Notation editor"
+msgstr "Duració de la notació:"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:92
+#, fuzzy
+msgid "Matrix editor"
+msgstr "Obre a l'editor de matri&us"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:93
+#, fuzzy
+msgid "Event List editor"
+msgstr "Obre a l'editor de la llista d'&esdeveniments"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:99
+msgid "Number of count-in measures when recording"
+msgstr "Nombre de mesures internet quan s'està gravant"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:109
+#, fuzzy
+msgid "Auto-save interval"
+msgstr "Cada quan cal desar automàticament (en segons)"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:112
+msgid "Every 30 seconds"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:113
+msgid "Every minute"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:114
+msgid "Every five minutes"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:115
+msgid "Every half an hour"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:116
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:277
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:157
+msgid "Never"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:140
+#, fuzzy
+msgid "Use JACK transport"
+msgstr "Ignora el transport del JACK"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:173
+msgid "Unknown"
+msgstr "Desconegut/da"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:179
+msgid "No MIDI, audio OK"
+msgstr "No hi ha MIDI, l'àudio va bé"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:182
+msgid "MIDI OK, no audio"
+msgstr "El MIDI va bé, l'àudio no"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:185
+msgid "MIDI OK, audio OK"
+msgstr "El MIDI va bé, l'àudio també"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:188
+msgid "No driver"
+msgstr "Sense dispositiu"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:195
+#, fuzzy
+msgid "Details..."
+msgstr "Esborra les pistes..."
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:204
+msgid "Behavior"
+msgstr "Comportament"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:219
+msgid "Side-bar parameter box layout"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:223
+msgid "Vertically stacked"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:225
+msgid "Tabbed"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:233
+msgid "Note name style"
+msgstr "Estil del nom de la nota"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:237
+msgid "Always use US names (e.g. quarter, 8th)"
+msgstr "Utilitza l'estil americà (p.e. quarter, 8th)"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:238
+msgid "Localized (where available)"
+msgstr "Localitzat (quan sigui possible)"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:252
+#, fuzzy
+msgid "Show textured background on"
+msgstr "Fes servir textures com a fons"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:254
+msgid "Main window"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:275
+msgid "Use bundled Klearlook theme"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:278
+msgid "When not running under KDE"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:279
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:159
+#, fuzzy
+msgid "Always"
+msgstr "Àlies"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:287
+msgid "Presentation"
+msgstr "Presentació"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:423
+msgid ""
+"Changes to the textured background in the main window will not take effect "
+"until you restart Rosegarden."
+msgstr ""
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:168
+#: ../src/gui/configuration/GeneralConfigurationPage.h:78
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:207
+#: ../src/gui/configuration/MatrixConfigurationPage.cpp:59
+msgid "General"
+msgstr "General"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.h:79
+msgid "General Configuration"
+msgstr "Configuració general"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:92
+msgid "Base octave number for MIDI pitch display"
+msgstr "Número d'octava de referència per al monitor de MIDI"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:107
+msgid "Always use default studio when loading files"
+msgstr "Sempre utilitza l'estudi per defecte quan es carreguin fitxers"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:119
+#, fuzzy
+msgid "Send all MIDI Controllers at start of each playback"
+msgstr ""
+"Envia tots els controls MIDI a l'inici de la reproducció\n"
+" (pot fer que us hagueu d'esperar més)"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:121
+msgid ""
+"Rosegarden can send all MIDI Controllers (Pan, Reverb etc) to all MIDI "
+"devices every\n"
+"time you hit play if you so wish. Please note that this option will usually "
+"incur a\n"
+"delay at the start of playback due to the amount of data being transmitted."
+msgstr ""
+"El Rosegarden pot enviar tots els controladors MIDI (?) a tots els "
+"dispositius \n"
+"MIDI cada cop que reproduïu una peça, si voleu. Cal tenir en compta que \n"
+"això pot provocar un retard degut al volum de dades a transferir als "
+"dispositius."
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:138
+#, fuzzy
+msgid "Sequencer timing source"
+msgstr "Rellotge del seqüenciador"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:163
+msgid "Load SoundFont to SoundBlaster card at startup"
+msgstr "Carrega la taula de sons a la targeta SoundBlaster a l'inici"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:164
+msgid ""
+"Check this box to enable soundfont loading on EMU10K-based cards when "
+"Rosegarden is launched"
+msgstr ""
+"Marca aquest casella per fer que es carregui la taula de sons en les "
+"targetes basades en EMU10K cada cop que el Rosegarden s'iniciï"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:173
+msgid "Path to 'asfxload' or 'sfxload' command"
+msgstr "Ubicació de l'ordre 'asfxload' o 'sfxload'"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:180
+msgid "SoundFont"
+msgstr "Taula de sons"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:223
+#, fuzzy
+msgid "MIDI Clock and System messages"
+msgstr "Envia els missatges del sistema i el rellotge MIDI"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:229
+#, fuzzy
+msgid "Send MIDI Clock, Start and Stop"
+msgstr "Envia els missatges del sistema i el rellotge MIDI"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:230
+msgid "Accept Start, Stop and Continue"
+msgstr ""
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:241
+msgid "MIDI Machine Control mode"
+msgstr "Mode de control de la màquina MIDI"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:248
+msgid "MMC Master"
+msgstr "Master MMC"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:249
+msgid "MMC Slave"
+msgstr "Esclau MMC"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:260
+msgid "MIDI Time Code mode"
+msgstr "Mode codificador de temps MIDI"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:267
+msgid "MTC Master"
+msgstr "Master MTC"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:268
+msgid "MTC Slave"
+msgstr "Esclau MTC"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:281
+msgid "Automatically connect sync output to all devices in use"
+msgstr ""
+"Automàticament connecta la sortida sincronitzada a tots els dispositius "
+"utilitzats"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:292
+#, fuzzy
+msgid "MIDI Sync"
+msgstr "MIDI"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:308
+msgid "sfxload path"
+msgstr "Ubicació sfxload"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:315
+msgid "Soundfont path"
+msgstr "Ubicació taula de sons"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:67
+msgid "%1 minutes %2.%3%4 seconds (%5 units, %6 measures)"
+msgstr "%1 minuts %2.%3%4 segons (%5 unitats, %6 mesures)"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:133
+msgid "Filename:"
+msgstr "Nom del fitxer:"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:136
+msgid "Formal duration (to end marker):"
+msgstr "Durada formal (fins la marca de fi):"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:141
+msgid "Playing duration:"
+msgstr "Durada de reproducció:"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:146
+msgid "Tracks:"
+msgstr "Pistes:"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:147
+msgid "%1 used, %2 total"
+msgstr "%1 utilitzats, %2 totals"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:152
+msgid "Segments:"
+msgstr "Fragments:"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:153
+msgid "%1 MIDI, %2 audio, %3 total"
+msgstr "%1 MIDI, %2 àudio, %3 total"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:161
+msgid "Statistics"
+msgstr "Estadístiques"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:170
+#: ../src/gui/editors/parameters/InstrumentParameterBox.cpp:155
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:92
+msgid "Track"
+msgstr "Pista"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:171
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:125
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:90
+msgid "Label"
+msgstr "Etiqueta"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:172
+msgid "Time"
+msgstr "Temps"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:174
+msgid "Events"
+msgstr "Esdeveniments"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:175
+msgid "Polyphony"
+msgstr "Polifonia"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:176
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:126
+msgid "Repeat"
+msgstr "Repeteix"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:178
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:128
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:305
+#: ../src/gui/general/EditView.cpp:1488
+msgid "Transpose"
+msgstr "Transposa"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:179
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:129
+msgid "Delay"
+msgstr "Retard"
+
+#: ../src/gui/configuration/AudioConfigurationPage.h:61
+#: ../src/gui/configuration/AudioPropertiesPage.h:58
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:204
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:523
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:524
+msgid "Audio"
+msgstr "Àudio"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:204
+#: ../src/gui/configuration/MIDIConfigurationPage.h:62
+msgid "MIDI"
+msgstr "MIDI"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:317
+msgid "Segment Summary"
+msgstr "Resum del fragment"
+
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:63
+msgid "Audio file path:"
+msgstr "Ubicació del fitxer d'àudio:"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:137
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:68
+msgid "Choose..."
+msgstr "Tria... "
+
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:73
+msgid "Disk space remaining:"
+msgstr "Espai de disc lliure:"
+
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:78
+#, fuzzy
+msgid "Equivalent minutes of 16-bit stereo:"
+msgstr "Minuts que equivalen a 16-bits stereo:"
+
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:90
+msgid "Modify audio path"
+msgstr "Canvia l'ubicació de l'àudio"
+
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:113
+msgid "%1 out of %2 (%3% used)"
+msgstr "%1 de %2 (%3% utilitzat)"
+
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:144
+msgid "minutes at"
+msgstr "minuts a"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.h:63
+#, fuzzy
+msgid "MIDI Settings"
+msgstr "Configuració de l'àudio"
+
+#: ../src/gui/configuration/AudioConfigurationPage.h:62
+#: ../src/gui/configuration/AudioPropertiesPage.h:59
+msgid "Audio Settings"
+msgstr "Configuració de l'àudio"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:87
+msgid "Default layout mode"
+msgstr "Format per defecte"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:91
+msgid "Linear layout"
+msgstr "Format &lineal"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:92
+msgid "Continuous page layout"
+msgstr "Format de pàgina continu"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:93
+msgid "Multiple page layout"
+msgstr "Format de pàgina múltiple"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:101
+msgid "Default spacing"
+msgstr "Espaiat per defecte"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:125
+msgid "Default duration factor"
+msgstr "Factor de durada per defecte"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:141
+msgid "Full"
+msgstr "Ple"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:152
+msgid "Show track headers (linear layout only)"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:158
+msgid "When needed"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:166
+msgid ""
+"\"Always\" and \"Never\" mean what they usually mean\n"
+"\"When needed\" means \"when staves are too many to all fit in the current "
+"window\""
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:178
+msgid "Show non-notation events as question marks"
+msgstr "Mostra els esdeveniments que no siguin del compas com a interrogants"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:188
+msgid "Show notation-quantized notes in a different color"
+msgstr "Mostra les notes del compàs quantificables en un altre color"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:198
+msgid "Show \"invisible\" events in grey"
+msgstr "Mostra els esdeveniments \"invisibles\" en gris"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:208
+msgid "Show notes outside suggested playable range in red"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:218
+msgid "Highlight superimposed notes with a halo effect"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:231
+msgid "When recording MIDI, split-and-tie long notes at barlines"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:242
+msgid "Layout"
+msgstr "Format"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:255
+msgid "Default note style for new notes"
+msgstr "Estil de les notes per defecte per a les noves notes"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:287
+msgid "When inserting notes..."
+msgstr "Quan s'afegeixi notes..."
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:294
+msgid "Split notes into ties to make durations match"
+msgstr "Separa les notes ajuntades per fer quadrar les durades "
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:295
+msgid "Ignore existing durations"
+msgstr "Ignora les durades existents"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:305
+msgid "Auto-beam on insert when appropriate"
+msgstr "Posa les barres d'agrupació automàticament quan sigui apropiat"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:317
+#: ../src/gui/editors/notation/NotationEraser.cpp:54
+msgid "Collapse rests after erase"
+msgstr "Redueix els silencis després d'haver suprimit"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:328
+msgid "Default paste type"
+msgstr "Forma d'enganxar per defecte"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:350
+msgid "Editing"
+msgstr "S'està editant"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:362
+msgid "Accidentals in one octave..."
+msgstr "Accidents en una octava..."
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:364
+msgid "Affect only that octave"
+msgstr "Afecta només aquella octava"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:365
+msgid "Require cautionaries in other octaves"
+msgstr "Necessita accidents preventius en altres octaves"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:366
+msgid "Affect all subsequent octaves"
+msgstr "Afecta totes les octaves que segueixin"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:374
+msgid "Accidentals in one bar..."
+msgstr "Accidents en una barra..."
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:376
+msgid "Affect only that bar"
+msgstr "Afecta només aquest compàs"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:377
+msgid "Require cautionary resets in following bar"
+msgstr "Necessita silencis preventius en els compassos posteriors"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:378
+msgid "Require explicit resets in following bar"
+msgstr "Necessita silencis explícits en el compàs posterior"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:386
+#, fuzzy
+msgid "Key signature cancellation style"
+msgstr "Estil del canvi de clau:"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:388
+msgid "Cancel only when entering C major or A minor"
+msgstr "Atura només quan entri un Do major o un La menor"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:389
+msgid "Cancel whenever removing sharps or flats"
+msgstr "Atura només quan es suprimeixin sostinguts o bemolls"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:390
+msgid "Cancel always"
+msgstr "Atura sempre"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:400
+msgid "Accidentals"
+msgstr "Accidents"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:441
+msgid "Notation font"
+msgstr "Tipus de notes"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:467
+msgid "Origin:"
+msgstr "Origen:"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:471
+msgid "Copyright:"
+msgstr "Copyright:"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:475
+msgid "Mapped by:"
+msgstr "Mapajat per:"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:479
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:81
+msgid "Type:"
+msgstr "Tipus:"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:508
+msgid "Font size for single-staff views"
+msgstr "Mida de lletra quan hi hagi una única vista"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:516
+msgid "Font size for multi-staff views"
+msgstr "Mida de lletra quan hi hagi vàries vistes"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:524
+msgid "Font size for printing (pt)"
+msgstr "Mida de lletra per a imprimir (pt)"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:541
+msgid "Text font"
+msgstr "Tipus de lletra"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:549
+msgid "Sans-serif font"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:664
+msgid "%1 (smooth)"
+msgstr "%1 (suau)"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:667
+#, fuzzy
+msgid "%1 (jaggy)"
+msgstr "%1 (jaggy)"
+
+#: ../src/gui/configuration/LatencyConfigurationPage.cpp:58
+msgid "JACK latency"
+msgstr "Latència del JACK"
+
+#: ../src/gui/configuration/LatencyConfigurationPage.cpp:61
+msgid ""
+"Use the \"Fetch JACK latencies\" button to discover the latency values set "
+"at\n"
+"the sequencer. It's recommended that you use the returned values but it's "
+"also\n"
+"possible to override them manually using the sliders. Note that if you "
+"change\n"
+"your JACK server parameters you should always fetch the latency values "
+"again.\n"
+"The latency values will be stored by Rosegarden for use next time."
+msgstr ""
+"Fes servir el botó \"Comprova les latències del JACK\" per veure quines \n"
+"latències fa servir el seqüenciador. Es recomana que utilitzeu aquests \n"
+"valors, tot i que podeu modificar-los. Si canvieu els valors, haureu de "
+"tornar \n"
+"a comprovar les latències del JACK de nou. Els valors de latències les "
+"desa \n"
+"el Rosegarden per utilitzar-les la propera vegada."
+
+#: ../src/gui/configuration/LatencyConfigurationPage.cpp:65
+msgid "JACK playback latency (in ms)"
+msgstr "Latència de reproducció del JACK (en ms)"
+
+#: ../src/gui/configuration/LatencyConfigurationPage.cpp:66
+msgid "JACK record latency (in ms)"
+msgstr "Latència de gravació del JACK (en ms)"
+
+#: ../src/gui/configuration/LatencyConfigurationPage.cpp:68
+msgid "Fetch JACK latencies"
+msgstr "Comprova les latències del JACK"
+
+#: ../src/gui/configuration/LatencyConfigurationPage.cpp:121
+msgid "JACK Latency"
+msgstr "Latència del JACK"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:92
+#, fuzzy
+msgid "Audio preview scale"
+msgstr "Nivell d'àudio"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:96
+msgid "Linear - easier to see loud peaks"
+msgstr ""
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:97
+msgid "Meter scaling - easier to see quiet activity"
+msgstr ""
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:105
+#, fuzzy
+msgid "Record audio files as"
+msgstr "Grava el fitxer d'àudio com a:"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:107
+msgid "16-bit PCM WAV format (smaller files)"
+msgstr "Format en 16-bit PCM WAV (fitxers més petits)"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:108
+msgid "32-bit float WAV format (higher quality)"
+msgstr "Format en 32-bit decimals WAV (alta qualitat)"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:117
+msgid "External audio editor"
+msgstr "Editor d'àudio extern"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:145
+msgid "Create JACK outputs"
+msgstr ""
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:150
+#, fuzzy
+msgid "for individual audio instruments"
+msgstr "per a cada instrument"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:157
+#, fuzzy
+msgid "for submasters"
+msgstr "Cap submaster"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:184
+#, fuzzy
+msgid ""
+"Rosegarden can start the JACK audio daemon (jackd) for you automatically if "
+"it isn't already running when Rosegarden starts.\n"
+"\n"
+"This is recommended for beginners and those who use Rosegarden as their main "
+"audio application, but it might not be to the liking of advanced users.\n"
+"\n"
+"If you want to start JACK automatically, make sure the command includes a "
+"full path where necessary as well as any command-line arguments you want to "
+"use.\n"
+"\n"
+"For example: /usr/local/bin/jackd -d alsa -d hw -r44100 -p 2048 -n 2\n"
+"\n"
+msgstr ""
+"El Rosegarden pot iniciar el servei d'àudio JACK (jackd) per tu, \n"
+"automàticament, si aquest no es troba en l'inici del Rosegarden.\n"
+"\n"
+"Aquesta opció és la recomanada pels principiants i aquells qui volen \n"
+"fer servir el Rosegarden com a principal aplicació d'àudio, però no per a "
+"usuaris avançats.\n"
+"\n"
+"Si voleu que s'iniciï el JACK automàticament, cal que informeu la "
+"correctament \n"
+"de quina és la línia d'ordres per engagar-lo.\n"
+"\n"
+"Per exemple: /usr/local/bin/jackd -d alsa -d hw -r44100 -p 2048 -n 2\n"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:196
+msgid "Start JACK when Rosegarden starts"
+msgstr "Inicia el JACK quan s'iniciï el Rosegarden"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:201
+msgid "JACK command"
+msgstr ""
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:214
+#, fuzzy
+msgid "JACK Startup"
+msgstr "Inici"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:224
+msgid "External audio editor path"
+msgstr "Ubicació de l'editor d'àudio extern"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:262
+msgid "External audio editor \"%1\" not found or not executable"
+msgstr ""
+
+#: ../src/gui/configuration/ColourConfigurationPage.cpp:70
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:448
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:863
+msgid "Add New Color"
+msgstr "Afegeix un nou color"
+
+#: ../src/gui/configuration/ColourConfigurationPage.cpp:74
+msgid "Delete Color"
+msgstr "Suprimeix el color"
+
+#: ../src/gui/configuration/ColourConfigurationPage.cpp:93
+msgid "Color Map"
+msgstr "Mapa de colors"
+
+#: ../src/gui/configuration/ColourConfigurationPage.cpp:128
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:983
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:882
+msgid "New Color Name"
+msgstr "Anomena el color"
+
+#: ../src/gui/configuration/ColourConfigurationPage.cpp:130
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:59
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:984
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:883
+#: ../src/gui/studio/DeviceManagerDialog.cpp:115
+#: ../src/gui/studio/DeviceManagerDialog.cpp:174
+msgid "New"
+msgstr "Nou"
+
+#: ../src/gui/configuration/LatencyConfigurationPage.h:62
+msgid "Latency"
+msgstr "Latència"
+
+#: ../src/gui/configuration/LatencyConfigurationPage.h:63
+msgid "Sequencer Latency"
+msgstr "Latència del seqüenciador"
+
+#: ../src/gui/configuration/ColourConfigurationPage.h:61
+msgid "Color Settings"
+msgstr "Configuració dels colors"
+
+#: ../src/gui/studio/MidiDeviceListViewItem.cpp:55
+#: ../src/gui/studio/MidiKeyMapListViewItem.cpp:44
+msgid "Key Mapping"
+msgstr "Dreceres"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:97
+msgid "Manage MIDI Banks and Programs"
+msgstr "Gestiona els bancs i els programes MIDI"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:128
+msgid "MIDI Device"
+msgstr "Dispositiu MIDI"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:130
+#: ../src/gui/studio/BankEditorDialog.cpp:219
+msgid "MSB"
+msgstr "MSB"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:131
+#: ../src/gui/studio/BankEditorDialog.cpp:218
+msgid "LSB"
+msgstr "LSB"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:140
+msgid "Add Bank"
+msgstr "Afegeix un dispositiu"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:141
+msgid "Add Key Mapping"
+msgstr "Afegeix una drecera"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:153
+msgid "Add a Bank to the current device"
+msgstr "Afegeix un banc al dispositiu actual"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:157
+msgid "Add a Percussion Key Mapping to the current device"
+msgstr "Afegeix una drecera de percussió per al dispositiu actual"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:161
+msgid "Delete the current Bank or Key Mapping"
+msgstr "Suprimeix el banc o drecera actuals"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:165
+msgid "Delete all Banks and Key Mappings from the current Device"
+msgstr "Esborra tots els bancs o dreceres del dispositiu actual"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:167
+#: ../src/gui/studio/DeviceManagerDialog.cpp:117
+msgid "Import..."
+msgstr "Importa..."
+
+#: ../src/gui/studio/BankEditorDialog.cpp:168
+#: ../src/gui/studio/DeviceManagerDialog.cpp:118
+msgid "Export..."
+msgstr "Exporta..."
+
+#: ../src/gui/studio/BankEditorDialog.cpp:176
+msgid ""
+"Import Bank and Program data from a Rosegarden file to the current Device"
+msgstr ""
+"Importa dades del banc i del programa des d'un fitxer del Rosegarden cap al "
+"dispositiu actual"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:179
+msgid ""
+"Export all Device and Bank information to a Rosegarden format interchange "
+"file"
+msgstr ""
+"Exporta tota la informació del dispositiu i del banc a un fitxer del "
+"Rosegarden amb format d'intercanvi."
+
+#: ../src/gui/studio/BankEditorDialog.cpp:190
+msgid "Copy all Program names from current Bank to clipboard"
+msgstr "Copia tots els noms de programa del banc actual al porta-retalls"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:194
+msgid "Paste Program names from clipboard to current Bank"
+msgstr "Enganxa els noms de programa del porta-retalls al banc actual"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:216
+msgid "Show Variation list based on "
+msgstr "Mostra la llista de variacions basades en "
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1010
+msgid "<new bank>"
+msgstr "<nou banc>"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1046
+msgid "<new mapping>"
+msgstr "<nova drecera>"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1048
+msgid "<new mapping %1>"
+msgstr "<nova drecera %1>"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1089
+msgid "Really delete this bank?"
+msgstr "Confirmeu l'eliminació d'aquest banc?"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1137
+msgid "Really delete this key mapping?"
+msgstr "Voleu suprimir aquest banc?"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1187
+msgid "Really delete all banks for "
+msgstr "Confirmeu l'eliminació de tots els bancs per a "
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1476
+msgid "Import Banks from Device in File"
+msgstr "Importa bancs"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1623
+#: ../src/gui/studio/DeviceManagerDialog.cpp:770
+msgid "Export Device as..."
+msgstr "Exporta el dispositiu com..."
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1694
+msgid ""
+"There are unsaved changes.\n"
+"Do you want to apply the changes before exiting the Bank Editor or discard "
+"the changes ?"
+msgstr ""
+"Heu fet canvis però no els heu desat.\n"
+"Voleu aplicar els canvis abans de sortir de l'editor de bancs, o voleu "
+"descartar els canvis?"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1697
+msgid "Unsaved Changes"
+msgstr "Canvis sense desar"
+
+#: ../src/gui/studio/NameSetEditor.cpp:68
+msgid "Librarian"
+msgstr "Bibliotecari"
+
+#: ../src/gui/studio/NameSetEditor.cpp:75
+msgid "Email"
+msgstr "Correu electrònic"
+
+#: ../src/gui/studio/NameSetEditor.cpp:80
+msgid ""
+"The librarian maintains the Rosegarden device data for this device.\n"
+"If you've made modifications to suit your own device, it might be worth\n"
+"liaising with the librarian in order to publish your information for the "
+"benefit\n"
+"of others."
+msgstr ""
+"El bibliotecari manté la informació la informació del dispositiu.\n"
+"Si heu fet modificacions per adequar-la al vostre propi dispositiu, \n"
+"pot ser interessant comunicar-ho al bibliotecari per a benefici d'altres."
+
+#: ../src/gui/studio/MidiBankListViewItem.cpp:51
+#: ../src/gui/studio/MidiDeviceListViewItem.cpp:48
+msgid "Percussion Bank"
+msgstr "Banc de percussió"
+
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:84
+#: ../src/gui/studio/MidiBankListViewItem.cpp:51
+#: ../src/gui/studio/MidiDeviceListViewItem.cpp:48
+msgid "Bank"
+msgstr "Banc"
+
+#: ../src/gui/studio/ChangeRecordDeviceCommand.h:39
+msgid "Change Record Device"
+msgstr "Canvia el dispositiu de registre"
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:61
+#: ../src/gui/studio/DeviceManagerDialog.cpp:96
+msgid "Manage MIDI Devices"
+msgstr "Gestiona els dispositius MIDI"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:98
+msgid "Play devices"
+msgstr "Dispositius de reproducció"
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:76
+#: ../src/gui/studio/DeviceManagerDialog.cpp:106
+#: ../src/gui/studio/DeviceManagerDialog.cpp:165
+msgid "Connection"
+msgstr "Connexió"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:119
+msgid "Banks..."
+msgstr "Bancs..."
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:120
+msgid "Control Events..."
+msgstr "Esdeveniments de control..."
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:126
+msgid "Create a new Play device"
+msgstr "Crea un nou dispositiu de reproducció"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:129
+#: ../src/gui/studio/DeviceManagerDialog.cpp:184
+msgid "Delete the selected device"
+msgstr "Suprimeix el dispositiu seleccionat"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:132
+msgid ""
+"Import Bank, Program and Controller data from a Rosegarden file to the "
+"selected device"
+msgstr ""
+"Importa les dades del banc, del programa i del controlador des d'un fitxer "
+"del Rosegarden per al dispositiu actual"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:135
+msgid "Export Bank and Controller data to a Rosegarden interchange file"
+msgstr ""
+"Exporta les dades de banc i de controlador a un fitxer de intercanvi del "
+"Rosegarden"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:138
+msgid "View and edit Banks and Programs for the selected device"
+msgstr ""
+"Visualitza i edita els bancs i els programes per al dispositiu seleccionat"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:141
+msgid ""
+"View and edit Control Events for the selected device - these are special "
+"Event types that you can define against your device and control through "
+"Control Rulers or the Instrument Parameter Box "
+msgstr ""
+"Visualitza i edita els esdeveniments de control del dispositiu seleccionat\n"
+"(aquests esdeveniments són d'un tipus especial que podeu definir contra\n"
+"el dispositiu, i controlar mitjançant els regles de control i el quadre de\n"
+"paràmetres de l'instrument)."
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:156
+msgid "Record devices"
+msgstr "Dispositius de registre"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:164
+msgid "Current"
+msgstr "Actual"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:181
+msgid "Create a new Record device"
+msgstr "Crea un nou dispositiu de registre"
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:360
+#: ../src/gui/studio/DeviceEditorDialog.cpp:378
+#: ../src/gui/studio/DeviceManagerDialog.cpp:486
+#: ../src/gui/studio/DeviceManagerDialog.cpp:501
+msgid "New Device"
+msgstr "Nou dispositiu"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:703
+msgid "Import from Device in File"
+msgstr "Importa des del dispositiu en el fitxer"
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:55
+msgid "Remap Instrument assigments..."
+msgstr "Redefineix l'assignació dels instruments."
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:62
+msgid "Device or Instrument"
+msgstr "Dispositiu o instrument"
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:65
+msgid "Remap Tracks by all Instruments on a Device or by single Instrument"
+msgstr ""
+"Redefineix les pistes, per a tots els instruments o bé per a un de sol, en "
+"un dispositiu"
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:74
+msgid "Choose Source and Destination"
+msgstr "Tria l'origen i la destinació"
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:77
+msgid "From"
+msgstr "Des de"
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:78
+msgid "To"
+msgstr "Cap a"
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:120
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:121
+msgid "<no devices>"
+msgstr "<no hi ha cap dispositiu>"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:155
+msgid "Show Audio &Faders"
+msgstr "Mostra els reguladors d'à&udio"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:160
+msgid "Show Synth &Faders"
+msgstr "Mostra els reguladors del &sintetitzador"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:165
+msgid "Show &Submasters"
+msgstr "Mostra els &submasters"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:170
+msgid "Show &Plugin Buttons"
+msgstr "Mostra els botons de &connector"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:175
+msgid "Show &Unassigned Faders"
+msgstr "Mostra els reguladors de corredora n&o assignats"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:184
+#, c-format
+msgid ""
+"_n: 1 Input\n"
+"%n Inputs"
+msgstr ""
+"_n: 1 entrada\n"
+"%n entrades"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:194
+msgid "No Submasters"
+msgstr "Cap submaster"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:203
+#, c-format
+msgid ""
+"_n: 1 Submaster\n"
+"%n Submasters"
+msgstr ""
+"_n: 1 Submaster\n"
+"%n Submasters"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:279
+msgid "Audio Mixer"
+msgstr "Mesclador d'àudio"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:311
+msgid "Record input source"
+msgstr "Origen de l'entrada del registre"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:322
+msgid "Output destination"
+msgstr "Destinació de la sortida"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:336
+#: ../src/gui/studio/AudioMixerWindow.cpp:495
+msgid "Pan"
+msgstr "Balanç"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:355
+msgid "Mono or stereo"
+msgstr "Mono o estéreo"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:364
+#: ../src/gui/studio/AudioMixerWindow.cpp:513
+msgid "Mute"
+msgstr "Silencia"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:373 rc.cpp:408
+#, no-c-format
+msgid "Solo"
+msgstr "Solo"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:382
+msgid "Arm recording"
+msgstr "Arma l'enregistrament"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:400
+#, c-format
+msgid "Audio %1"
+msgstr "Àudio %1"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:404
+#, c-format
+msgid "Synth %1"
+msgstr "Sint.%1"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:578
+#: ../src/gui/studio/AudioMixerWindow.cpp:580
+msgid "Audio master output level"
+msgstr "Nivell principal de la sortida d'àudio"
+
+#: ../src/gui/studio/SynthPluginManagerDialog.cpp:71
+msgid "Manage Synth Plugins"
+msgstr "Gestiona els connectors dels sintetitzadors"
+
+#: ../src/gui/studio/SynthPluginManagerDialog.cpp:78
+msgid "Synth plugins"
+msgstr "Connectors de sintetitzadors"
+
+#: ../src/gui/studio/SynthPluginManagerDialog.cpp:145
+msgid "Controls"
+msgstr "Controls"
+
+#: ../src/gui/studio/SynthPluginManagerDialog.cpp:152
+msgid "Editor >>"
+msgstr "Editor >>"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:66
+#: ../src/gui/studio/MidiProgramsEditor.cpp:169
+msgid "Bank and Program details"
+msgstr "Detalls del banc i del programa"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:67
+msgid "Programs"
+msgstr "Programes"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2711
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:88
+#: ../src/gui/studio/MidiProgramsEditor.cpp:93
+msgid "Percussion"
+msgstr "Percussió"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:99
+msgid "MSB Value"
+msgstr "Valor MSB"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:107
+msgid ""
+"Selects a MSB controller Bank number (MSB/LSB pairs are always unique for "
+"any Device)"
+msgstr ""
+"Selecciona un número de banc de controlador MSB (les parelles MSB/LSB són "
+"sempre úniques per a qualsevol dispositiu)"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:111
+msgid ""
+"Selects a LSB controller Bank number (MSB/LSB pairs are always unique for "
+"any Device)"
+msgstr ""
+"Selecciona un número de banc de controlador LSB (les parelles MSB/LSB són "
+"sempre úniques per a qualsevol dispositiu)"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:116
+msgid "LSB Value"
+msgstr "Valor LSB"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:254
+#: ../src/gui/studio/MidiProgramsEditor.cpp:541
+#, c-format
+msgid "Key Mapping: %1"
+msgstr "Drecera: %1"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:476
+msgid "<no key mapping>"
+msgstr "<sense definir>"
+
+#: ../src/gui/studio/MidiKeyMappingEditor.cpp:57
+#: ../src/gui/studio/MidiKeyMappingEditor.cpp:81
+msgid "Key Mapping details"
+msgstr "Detalls de la drecera"
+
+#: ../src/gui/studio/MidiKeyMappingEditor.cpp:58
+msgid "Pitches"
+msgstr "Altures"
+
+#: ../src/gui/studio/MidiMixerWindow.cpp:152
+msgid "MIDI Mixer"
+msgstr "Mesclador de MIDI"
+
+#: ../src/gui/studio/MidiMixerWindow.cpp:199
+msgid "Volume"
+msgstr "Volum"
+
+#: ../src/gui/studio/AudioPluginOSCGUIManager.cpp:444
+msgid "Rosegarden Plugin"
+msgstr "Connector del Rosegarden"
+
+#: ../src/gui/studio/AudioPluginOSCGUIManager.cpp:447
+#, c-format
+msgid "Rosegarden: %1"
+msgstr "Rosegarden: %1"
+
+#: ../src/gui/studio/AudioPluginOSCGUIManager.cpp:449
+msgid "Rosegarden: %1: %2"
+msgstr "Rosegarden: %1: %2"
+
+#: ../src/gui/studio/AudioPluginOSCGUIManager.cpp:450
+#, c-format
+msgid "Plugin slot %1"
+msgstr "Ranura de connector %1"
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:92
+msgid "Add Play Device"
+msgstr "Afegeix el dispositiu de reproducció"
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:93
+msgid "Add Record Device"
+msgstr "Afegeix el dispositiu de registre"
+
+#: ../src/commands/studio/CreateOrDeleteDeviceCommand.h:68
+#: ../src/gui/studio/DeviceEditorDialog.cpp:94
+msgid "Delete Device"
+msgstr "Suprimeix el dispositiu"
+
+#: ../src/gui/editors/segment/PlayList.cpp:77
+#: ../src/gui/studio/DeviceEditorDialog.cpp:156
+#: ../src/gui/studio/DeviceEditorDialog.cpp:361
+msgid "Play"
+msgstr "Reprodueix"
+
+#: ../src/commands/segment/SegmentRecordCommand.cpp:37
+#: ../src/gui/studio/DeviceEditorDialog.cpp:156
+#: ../src/gui/studio/DeviceEditorDialog.cpp:379 rc.cpp:394
+#, no-c-format
+msgid "Record"
+msgstr "Registra"
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:256
+msgid "Apply pending changes?"
+msgstr "Aplica els canvis pendents?"
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:359
+#: ../src/gui/studio/DeviceEditorDialog.cpp:377
+msgid "<new device>"
+msgstr "<nou dispositiu>"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentEraser.cpp:82
+msgid "Click on a segment to delete it"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSplitter.cpp:166
+msgid ""
+"Click on a segment to split it in two; hold Shift to avoid snapping to beat "
+"grid"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSplitter.cpp:168
+msgid "Click on a segment to split it in two"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:81
+#, fuzzy
+msgid "Click and drag to select segments"
+msgstr "Fes clic per seleccionar un tipus de lletra"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentMover.cpp:154
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:238
+msgid "Move Segment"
+msgstr "Mou el fragment"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentMover.cpp:154
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:239
+msgid "Move Segments"
+msgstr "Mou els fragments"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:217
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:169
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:141
+#: ../src/gui/editors/segment/segmentcanvas/SegmentMover.cpp:210
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:255
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:359
+msgid "Hold Shift to avoid snapping to beat grid"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:485
+msgid ""
+"Click and drag to select segments; middle-click and drag to draw an empty "
+"segment"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:384
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:502
+msgid ""
+"Click and drag to resize a segment; hold Ctrl as well to rescale its contents"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:386
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:504
+msgid "Click and drag to rescale segment"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:509
+msgid "Click and drag to move segments; hold Ctrl as well to copy them"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:511
+msgid "Click and drag to copy segments"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:515
+msgid ""
+"Click and drag to move segment; hold Ctrl as well to copy it; double-click "
+"to edit"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:517
+msgid "Click and drag to copy segment"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:157
+#, fuzzy
+msgid ""
+"The audio file path does not exist or is not writable.\n"
+"You must set the audio file path to a valid directory in Document Properties "
+"before rescaling an audio file.\n"
+"Would you like to set it now?"
+msgstr ""
+"La ubicació del fitxer d'àudio no existeix o no s'hi pot escriure.\n"
+"Seleccioneu una ubicació correcta, en les propietats del document abans de "
+"gravar l'àudio.\n"
+"Voleu configurar-ho ara?"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:261
+msgid ""
+"Hold Shift to avoid snapping to beat grid; hold Ctrl as well to rescale "
+"contents"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentMover.cpp:325
+msgid "Click and drag to move a segment"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentPencil.cpp:225
+msgid "Hold Shift to avoid snapping to bar lines"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentPencil.cpp:283
+#, fuzzy
+msgid "Record or drop audio here"
+msgstr "Grava o MIDI o àudio"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentPencil.cpp:289
+msgid ""
+"Click and drag to draw an empty segment. Control+Alt click and drag to draw "
+"in overlap mode."
+msgstr ""
+
+#: ../src/gui/editors/segment/TrackLabel.cpp:77
+msgid ""
+"Click and hold with left mouse button to assign this Track to an Instrument."
+msgstr ""
+"Feu clic durant uns segons amb el botó esquerra per assignar aquesta pista a "
+"un instrument."
+
+#: ../src/gui/editors/segment/TrackLabel.cpp:191
+msgid "Change track name"
+msgstr "Canvia el nom de la pista"
+
+#: ../src/gui/editors/segment/TrackLabel.cpp:192
+msgid "Enter new track name"
+msgstr "Introduïu un nom nou per a la pista"
+
+#: ../src/gui/editors/segment/TrackEditor.cpp:648
+msgid "Turn Repeating Segment into Real Copies"
+msgstr "Converteix el fragment repetit en un còpia"
+
+#: ../src/gui/editors/segment/TrackEditor.cpp:650
+msgid "Turn Repeating Segments into Real Copies"
+msgstr "Converteix els fragments repetits en còpies"
+
+#: ../src/gui/editors/segment/TrackEditor.cpp:814
+msgid ""
+"You can't drop files into Rosegarden from this client. Try using Konqueror "
+"instead."
+msgstr ""
+"No podeu arrossegar fitxers cap al Rosegarden des d'aquest client. Proveu-ho "
+"de fer amb el Konqueror."
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:85
+msgid "Manage Triggered Segments"
+msgstr "Gestiona els fragments activables"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:89
+msgid "ID"
+msgstr "Id"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:735
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:93
+msgid "Base velocity"
+msgstr "Velocitat de base"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:94
+msgid "Triggers"
+msgstr "Activadors"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:115
+msgid "Add a Triggered Segment"
+msgstr "Afegeix un fragment activable"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:119
+msgid "Delete a Triggered Segment"
+msgstr "Suprimeix un fragment activable"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:123
+msgid "Delete All Triggered Segments"
+msgstr "Suprimeix tots els fragment activables"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:127
+msgid "Close the Triggered Segment Manager"
+msgstr "Tanca tots els fragment activables"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:169
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:245
+msgid "<no label>"
+msgstr "<sense etiqueta>"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:248
+msgid ""
+"_n: %1 on 1 track\n"
+"%1 on %n tracks"
+msgstr ""
+"%1 en 1 pista\n"
+"%1 en %n pistes"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:284
+msgid ""
+"This will remove all triggered segments from the whole composition. Are you "
+"sure?"
+msgstr ""
+"Aquesta acció eliminarà tots els fragments activables de tota la composició. "
+"Voleu continuar?"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:288
+msgid "Remove all triggered segments"
+msgstr "S'estan suprimint tots els fragment activables"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:313
+msgid "Trigger Segment Duration"
+msgstr "Durada del fragment activable"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:336
+#, fuzzy, c-format
+msgid ""
+"_n: This triggered segment is used 1 time in the current composition. Are "
+"you sure you want to remove it?\n"
+"This triggered segment is used %n times in the current composition. Are you "
+"sure you want to remove it?"
+msgstr ""
+"_n: Aquest fragment activable només es fa servir un únic cop en tota la "
+"composició. Voleu suprimir-lo tot i així?\n"
+" Aquest fragment activable es fa servir %n cops en la composició. Voleu "
+"suprimir-lo tot i així?"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:400
+msgid "Pa&ste as New Triggered Segment"
+msgstr "Enganxa com un nou fragment activable"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1169
+#: ../src/gui/editors/segment/MarkerEditor.cpp:399
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:412
+#: ../src/gui/editors/tempo/TempoView.cpp:622
+msgid "&Musical Times"
+msgstr "Temps &musical"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1179
+#: ../src/gui/editors/segment/MarkerEditor.cpp:409
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:422
+#: ../src/gui/editors/tempo/TempoView.cpp:632
+msgid "&Real Times"
+msgstr "Temps &reals"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1189
+#: ../src/gui/editors/segment/MarkerEditor.cpp:419
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:432
+#: ../src/gui/editors/tempo/TempoView.cpp:642
+msgid "Ra&w Times"
+msgstr "Temps t&otal"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:83
+msgid "Manage Markers"
+msgstr "Gestiona els marcadors"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:86
+msgid "Marker time "
+msgstr "Temps del marcador "
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:87
+#, fuzzy
+msgid "Marker text "
+msgstr "Temps del marcador "
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:88
+msgid "Marker description "
+msgstr "Descripció del marcador "
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:95
+msgid "Pointer position"
+msgstr "Posició del punter"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:100
+msgid "Real time:"
+msgstr "Temps real:"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:103
+msgid "In measure:"
+msgstr "En el compàs:"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:121
+msgid "Add a Marker"
+msgstr "Afegeix un marcador"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:125
+msgid "Delete a Marker"
+msgstr "Suprimeix un marcador"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:129
+msgid "Delete All Markers"
+msgstr "Suprimeix tots els marcadors"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:133
+msgid "Close the Marker Editor"
+msgstr "Tanca l'editor de marcadors"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:296
+msgid "Remove all markers"
+msgstr "Suprimeix tots els marcadors"
+
+#: ../src/gui/editors/segment/PlayList.cpp:76
+msgid "Add..."
+msgstr "Afegeix..."
+
+#: ../src/gui/editors/segment/PlayList.cpp:78
+msgid "Move Up"
+msgstr "Mou amunt"
+
+#: ../src/gui/editors/segment/PlayList.cpp:79
+msgid "Move Down"
+msgstr "Mou avall"
+
+#: ../src/gui/editors/segment/PlayList.cpp:124
+msgid "Select one or more Rosegarden files"
+msgstr "Selecciona un o més fitxers del Rosegarden"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:73
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:55
+msgid "<not showing>"
+msgstr "<no s'ha mostrat>"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:89
+msgid "Manage Control Events"
+msgstr "Gestiona els esdeveniments de control"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:91
+msgid "<no device>"
+msgstr "<sense dispositiu>"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:99
+msgid " Control Events for %1 (device %2)"
+msgstr " Esdeveniments de control per al %1 (dispositiu %2)"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:104
+msgid "Control Event name "
+msgstr "Nom de l'esdeveniment de control "
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:105
+msgid "Control Event type "
+msgstr "Tipus d'esdeveniment de control "
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:106
+msgid "Control Event value "
+msgstr "Valor de l'esdeveniment de control "
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:107
+msgid "Description "
+msgstr "Descripció "
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:108
+msgid "Min "
+msgstr "Mín. "
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:109
+msgid "Max "
+msgstr "Màx. "
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:110
+msgid "Default "
+msgstr "Per omissió "
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:111
+msgid "Color "
+msgstr "Color "
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:112
+msgid "Position on instrument panel"
+msgstr "Posició en el plafó de l'instrument"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:136
+msgid "Add a Control Parameter to the Studio"
+msgstr "Afegeix un paràmetre de control a l'estudi"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:140
+msgid "Delete a Control Parameter from the Studio"
+msgstr "Elimina un paràmetre de control de l'estudi"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:144
+msgid "Close the Control Parameter editor"
+msgstr "Tanca l'editor de paràmetres de control"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:221
+msgid "<default>"
+msgstr "<per defecte>"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:62
+msgid "Edit Control Parameter"
+msgstr "Edita el paràmetre de control"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:71
+msgid "Control Event Properties"
+msgstr "Propietats de l'esdeveniment de control"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:77
+msgid "Name:"
+msgstr "Nom:"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:93
+msgid "Control Event value:"
+msgstr "Valor de l'esdeveniment de control:"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:97
+msgid "Minimum value:"
+msgstr "Valor mínim:"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:101
+msgid "Maximum value:"
+msgstr "Valor màxim:"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:105
+msgid "Default value:"
+msgstr "Valor per omissió:"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:109
+msgid "Color:"
+msgstr "Color:"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:113
+msgid "Instrument Parameter Box position:"
+msgstr "Posició de la caixa de paràmetres de l'instrument"
+
+#: ../src/gui/editors/segment/TrackButtons.cpp:209
+#: ../src/gui/editors/segment/TrackButtons.cpp:585
+#: ../src/gui/editors/segment/TrackButtons.cpp:935
+#: ../src/gui/editors/segment/TrackButtons.cpp:1127
+msgid "<no instrument>"
+msgstr "<cap instrument>"
+
+#: ../src/gui/editors/segment/TrackButtons.cpp:352
+#: ../src/gui/editors/segment/TrackButtons.cpp:1094
+msgid "<untitled audio>"
+msgstr "<àudio sense nom>"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:130
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:662
+#: ../src/gui/editors/segment/TrackButtons.cpp:354
+#: ../src/gui/editors/segment/TrackButtons.cpp:1096
+msgid "<untitled>"
+msgstr "<sense nom>"
+
+#: ../src/gui/editors/segment/TrackButtons.cpp:1058
+msgid "Mute track"
+msgstr "Posa la pista en silenci"
+
+#: ../src/gui/editors/segment/TrackButtons.cpp:1063
+msgid "Record on this track"
+msgstr "Grava en aquesta pista"
+
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:88
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:1015
+#, fuzzy
+msgid "Segment"
+msgstr "Fra&gment"
+
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:89
+#, fuzzy
+msgid "Segment Parameters"
+msgstr "Paràmetres de l'instrument"
+
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:366
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:697
+msgid "%1 ms"
+msgstr "%1 ms"
+
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:1031
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:910
+msgid "Highest playable note"
+msgstr ""
+
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:1051
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:930
+msgid "Lowest playable note"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:93
+#, fuzzy
+msgid "Track Parameters"
+msgstr "Paràmetres de la graella"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:137
+#, fuzzy
+msgid "Playback parameters"
+msgstr "Volum de reproducció"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:172
+#, fuzzy
+msgid "Recording filters"
+msgstr "Dispositiu de gravació:"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:191
+msgid "Channel"
+msgstr "Canal"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:203
+#, fuzzy
+msgid "Staff export options"
+msgstr "Mostra les opcions avançades"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:220
+#, fuzzy
+msgid "Notation size:"
+msgstr "Temps de notació:"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:225
+#, fuzzy
+msgid "Small"
+msgstr "Correu electrònic"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:226
+msgid "Tiny"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:233
+#, fuzzy
+msgid "Bracket type:"
+msgstr "Tipus de text:"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:237
+msgid "-----"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:238
+msgid "[----"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:239
+msgid "----]"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:240
+msgid "[---]"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:241
+msgid "{----"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:242
+msgid "----}"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:243
+msgid "{[---"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:244
+msgid "---]}"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:253
+#, fuzzy
+msgid "Create segments with"
+msgstr "Crea un fragment"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:264
+#, fuzzy
+msgid "Preset"
+msgstr "silenci"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:272
+#, fuzzy
+msgid "Load"
+msgstr "Carrega les dades"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:282
+#, fuzzy
+msgid "treble"
+msgstr "Soprano"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:283
+#, fuzzy
+msgid "bass"
+msgstr "Baix"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:284
+#, fuzzy
+msgid "crotales"
+msgstr "&Octaves"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:285
+msgid "xylophone"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:286
+msgid "guitar"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:287
+msgid "contrabass"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:288
+msgid "celesta"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:289
+msgid "old celesta"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:290
+msgid "french"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:291
+msgid "soprano"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:292
+#, fuzzy
+msgid "mezzosoprano"
+msgstr "S&forzando"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:293
+#, fuzzy
+msgid "alto"
+msgstr "Alto"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:294
+#, fuzzy
+msgid "tenor"
+msgstr "Tenor"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:295
+#, fuzzy
+msgid "baritone"
+msgstr "Variació"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:296
+#, fuzzy
+msgid "varbaritone"
+msgstr "Variació"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:297
+#, fuzzy
+msgid "subbass"
+msgstr "Baix"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:327
+#, fuzzy
+msgid "Lowest"
+msgstr "Baixa"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:329
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:336
+msgid "---"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:331
+msgid "Choose the lowest suggested playable note, using a staff"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:334
+#, fuzzy
+msgid "Highest"
+msgstr "Alta"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:338
+msgid "Choose the highest suggested playable note, using a staff"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:666
+msgid "[ Track %1 - %2 ]"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:985
+msgid "The instrument preset database is corrupt. Check your installation."
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:173
+#: ../src/gui/editors/parameters/InstrumentParameterBox.cpp:54
+msgid "Instrument Parameters"
+msgstr "Paràmetres de l'instrument"
+
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:85
+msgid "Variation"
+msgstr "Variació"
+
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:86
+msgid "Program"
+msgstr "Programa"
+
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:87
+#, fuzzy
+msgid "Channel out"
+msgstr "Canal"
+
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:215
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:221
+msgid "[ %1 ]"
+msgstr "[ %1 ]"
+
+#: ../src/gui/editors/matrix/MatrixEraser.cpp:58
+#: ../src/gui/editors/matrix/MatrixMover.cpp:71
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:67
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:77
+msgid "Switch to Draw Tool"
+msgstr "Agafa l'eina de dibuixar"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:75
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:69
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:71
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:81
+#: ../src/gui/editors/notation/ClefInserter.cpp:57
+#: ../src/gui/editors/notation/GuitarChordInserter.cpp:63
+#: ../src/gui/editors/notation/NotationSelector.cpp:87
+#: ../src/gui/editors/notation/NoteInserter.cpp:113
+#: ../src/gui/editors/notation/RestInserter.cpp:72
+#: ../src/gui/editors/notation/TextInserter.cpp:61
+msgid "Switch to Erase Tool"
+msgstr "Agafa l'eina d'esborrar"
+
+#: ../src/gui/editors/matrix/MatrixEraser.cpp:62
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:73
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:75
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:85
+msgid "Switch to Move Tool"
+msgstr "Agafa l'eina de moure"
+
+#: ../src/gui/editors/matrix/MatrixEraser.cpp:68
+#: ../src/gui/editors/matrix/MatrixMover.cpp:81
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:79
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:93
+msgid "Switch to Resize Tool"
+msgstr "Agafa l'eina de redimensionar"
+
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:446
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:579
+msgid "Click and drag to select; middle-click and drag to draw new note"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:324
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:597
+msgid "Click and drag to resize selected notes"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:599
+msgid "Click and drag to resize note"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:471
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:604
+msgid "Click and drag to move selected notes; hold Ctrl as well to copy"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:473
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:606
+#, fuzzy
+msgid "Click and drag to copy selected notes"
+msgstr "Fes clic per seleccionar un tipus de lletra"
+
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:610
+msgid "Click and drag to move note; hold Ctrl as well to copy"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:612
+msgid "Click and drag to copy note"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixEraser.cpp:54
+#: ../src/gui/editors/matrix/MatrixMover.cpp:67
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:65
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:63
+#: ../src/gui/editors/notation/ClefInserter.cpp:53
+#: ../src/gui/editors/notation/GuitarChordInserter.cpp:59
+#: ../src/gui/editors/notation/NotationEraser.cpp:67
+#: ../src/gui/editors/notation/NoteInserter.cpp:109
+#: ../src/gui/editors/notation/RestInserter.cpp:68
+#: ../src/gui/editors/notation/TextInserter.cpp:57
+msgid "Switch to Select Tool"
+msgstr "Agafa l'eina de seleccionar"
+
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:218
+msgid "Resize Event"
+msgstr "Redimensiona l'esdeveniment"
+
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:221
+msgid "Resize Events"
+msgstr "Redimensiona els esdeveniments"
+
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:326
+#, fuzzy
+msgid "Click and drag to resize a note"
+msgstr "Fes clic per seleccionar un tipus de lletra"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:328
+#, fuzzy
+msgid "Copy and Move Event"
+msgstr "Mou l'esdeveniment"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:330
+#, fuzzy
+msgid "Copy and Move Events"
+msgstr "Mou els esdeveniments"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:334
+msgid "Move Event"
+msgstr "Mou l'esdeveniment"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:336
+msgid "Move Events"
+msgstr "Mou els esdeveniments"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:465
+msgid "Click and drag to move a note; hold Ctrl as well to copy it"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:467
+msgid "Click and drag to copy a note"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:361
+msgid "Click and drag to draw a note; Shift to avoid snapping to grid"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:363
+msgid "Click and drag to draw a note"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:437
+#: ../src/gui/editors/matrix/MatrixView.cpp:3053
+msgid "Couldn't apply piano roll layout"
+msgstr "No s'ha pogut aplicar el format de rotlle de pianola"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:663
+msgid "Resi&ze"
+msgstr "Redimensi&ona"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:669
+#: ../src/gui/editors/notation/NotationView.cpp:1919
+msgid "C&hord Insert Mode"
+msgstr "Mode d'afegit d'&acords"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:676
+#: ../src/gui/editors/notation/NotationView.cpp:1778
+msgid "Ste&p Recording"
+msgstr "Enregistrament &pas a pas"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:694
+msgid "&Legato"
+msgstr "&Lligat"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:708
+#, fuzzy
+msgid "Set to Current Velocity"
+msgstr "Velocitat de base"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:712
+msgid "Set Event &Velocities..."
+msgstr "Estableix la &velocitat dels esdeveniments..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:716
+msgid "Trigger Se&gment..."
+msgstr "Activa el &fragment activable..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:720
+msgid "Remove Triggers..."
+msgstr "Suprimeix els activadors..."
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1153
+#: ../src/gui/editors/matrix/MatrixView.cpp:724
+#: ../src/gui/editors/tempo/TempoView.cpp:606
+msgid "Select &All"
+msgstr "Selecciona-ho &tot"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:732
+#: ../src/gui/editors/notation/NotationView.cpp:2325
+msgid "Cursor &Back"
+msgstr "Cursor &enrera"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:736
+#: ../src/gui/editors/notation/NotationView.cpp:2329
+msgid "Cursor &Forward"
+msgstr "Cursor en&davant"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:740
+#: ../src/gui/editors/notation/NotationView.cpp:2333
+msgid "Cursor Ba&ck Bar"
+msgstr "&Cursor al compàs anterior"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:744
+#: ../src/gui/editors/notation/NotationView.cpp:2337
+msgid "Cursor For&ward Bar"
+msgstr "Cursor al &compàs següent"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:748
+#: ../src/gui/editors/notation/NotationView.cpp:2341
+msgid "Cursor Back and Se&lect"
+msgstr "Cursor enrera i &selecciona"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:752
+#: ../src/gui/editors/notation/NotationView.cpp:2345
+msgid "Cursor Forward and &Select"
+msgstr "Avança el cursor i &selecciona"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:756
+#: ../src/gui/editors/notation/NotationView.cpp:2349
+msgid "Cursor Back Bar and Select"
+msgstr "Cursor al compàs anterior i selecciona"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:760
+#: ../src/gui/editors/notation/NotationView.cpp:2353
+msgid "Cursor Forward Bar and Select"
+msgstr "Cursor al compàs següent i selecciona"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:764
+#: ../src/gui/editors/notation/NotationView.cpp:2363
+msgid "Cursor to St&art"
+msgstr "Cursor &al començament"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:770
+#: ../src/gui/editors/notation/NotationView.cpp:2369
+msgid "Cursor to &End"
+msgstr "Cursor al &final"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:776
+#: ../src/gui/editors/notation/NotationView.cpp:2391
+msgid "Cursor to &Playback Pointer"
+msgstr "Cursor al &punt de reproducció"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:820
+#: ../src/gui/editors/notation/NotationView.cpp:2435
+msgid "Playback Pointer to &Cursor"
+msgstr "Punt de reproducció al &cursor"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:826
+#: ../src/gui/editors/notation/NotationView.cpp:2441
+msgid "&Solo"
+msgstr "&Solo"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:841
+#: ../src/gui/editors/notation/NotationView.cpp:2456
+msgid "Set Loop to Selection"
+msgstr "Defineix la repetició en la selecció"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:845
+#: ../src/gui/editors/notation/NotationView.cpp:2460
+msgid "Clear L&oop"
+msgstr "Neteja la &repetició"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1157
+#: ../src/gui/editors/matrix/MatrixView.cpp:849
+#: ../src/gui/editors/notation/NotationView.cpp:2464
+#: ../src/gui/editors/tempo/TempoView.cpp:610
+msgid "Clear Selection"
+msgstr "Neteja la selecció"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1149
+#: ../src/gui/editors/matrix/MatrixView.cpp:854
+#: ../src/gui/editors/notation/NotationView.cpp:2471
+msgid "&Filter Selection"
+msgstr "&Filtra la selecció"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:879
+msgid "&No Snap"
+msgstr "&No desplacis"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:884
+msgid "Snap to Bea&t"
+msgstr "&Quadra amb pulsació"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:888
+msgid "Snap to &Bar"
+msgstr "Desplaça al &compàs"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:908
+#, fuzzy, c-format
+msgid "Snap to %1"
+msgstr "Desplaça a 1/2"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:917
+msgid "Show Instrument Parameters"
+msgstr "Mostra els paràmetres de l'instrument"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:922
+#: ../src/gui/editors/notation/NotationView.cpp:1850
+msgid "Show Ch&ord Name Ruler"
+msgstr "M&ostra el regle de noms d'acord"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:926
+#: ../src/gui/editors/notation/NotationView.cpp:1858
+msgid "Show &Tempo Ruler"
+msgstr "Mostra el regle del &tempo"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1238
+#: ../src/gui/editors/notation/NotationView.cpp:3245
+#, c-format
+msgid ""
+"_n: 1 event selected \n"
+" %n events selected "
+msgstr ""
+"_n: 1 esdeveniment seleccionat\n"
+" %n esdeveniments seleccionats"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1241
+#: ../src/gui/editors/notation/NotationView.cpp:3247
+msgid " No selection "
+msgstr " No hi ha cap selecció "
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1348
+#: ../src/gui/editors/matrix/MatrixView.cpp:1360
+#: ../src/gui/editors/matrix/MatrixView.cpp:2079
+#: ../src/gui/editors/notation/NotationView.cpp:5869
+msgid "Quantizing..."
+msgstr "S'està quantificant..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1370
+#: ../src/gui/editors/notation/NotationView.cpp:5407
+msgid "Collapsing notes..."
+msgstr "S'està eliminant notes..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1381
+msgid "Making legato..."
+msgstr "S'està fent el legato..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1476
+#, fuzzy
+msgid "Note: %1 (%2.%3s)"
+msgstr "Temps: %1 (%2.%3s)"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1531
+#: ../src/gui/editors/notation/NotationView.cpp:7206
+msgid "Time: %1 (%2.%3s)"
+msgstr "Temps: %1 (%2.%3s)"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1604
+#: ../src/gui/editors/notation/NotationView.cpp:4744
+#: ../src/gui/editors/notation/NotationView.cpp:4773
+msgid "Cutting selection to clipboard..."
+msgstr "S'està tallant la selecció al porta-retalls..."
+
+#: ../src/gui/editors/eventlist/EventView.cpp:912
+#: ../src/gui/editors/matrix/MatrixView.cpp:1636
+#: ../src/gui/editors/notation/NotationSelectionPaster.cpp:82
+msgid "Couldn't paste at this point"
+msgstr "No s'ha pogut enganxar en aquest punt"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1647
+#: ../src/gui/editors/notation/NotationView.cpp:4754
+msgid "Deleting selection..."
+msgstr "S'està eliminant la selecció..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1833
+#: ../src/gui/editors/notation/NotationView.cpp:5617
+#, c-format
+msgid "Unknown note insert action %1"
+msgstr "Acció d'afegir una nota, desconeguda: %1"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1837
+#: ../src/gui/editors/matrix/MatrixView.cpp:2857
+#: ../src/gui/editors/notation/NotationView.cpp:5621
+msgid "Inserting note"
+msgstr "S'està afegint una nota"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2091
+msgid "Unquantizing..."
+msgstr "S'està desquantificant..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2120
+msgid " Grid: "
+msgstr " Graella: "
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2134
+msgid "Unit"
+msgstr "Unitat"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2136
+msgid "Beat"
+msgstr "Pulsació"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2138
+msgid "Bar"
+msgstr "Compàs"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2159
+#, fuzzy
+msgid " Velocity: "
+msgstr "Velocitat:"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2170
+msgid " Quantize: "
+msgstr " Quantificació: "
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2584
+msgid "Raising velocities..."
+msgstr "S'està apujant les velocitats..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2596
+msgid "Lowering velocities..."
+msgstr "S'està abaixant les velocitats..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2611
+msgid "Set Event Velocities"
+msgstr "Defineix les velocitats dels esdeveniments"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2616
+msgid "Setting Velocities..."
+msgstr "S'està definint les velocitats..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2665
+msgid "Remove Triggers"
+msgstr "Suprimeix els activadors"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2723
+msgid "%1 - Segment Track #%2 - %3"
+msgstr "%1 - Fragment de pista #%2 - %3"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2730
+msgid "%1 - All Segments - %2"
+msgstr "%1 - Tots els fragments - %2"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2737
+msgid ""
+"_n: %1 - 1 Segment - %2\n"
+"%1 - %n Segments - %2"
+msgstr ""
+"_n: %1 - 1 fragment - %2\n"
+"%1 - %n fragments - %2"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2885
+msgid "Can't insert note: No grid duration selected"
+msgstr ""
+"No s'ha pogut afegir una nota: No hi ha seleccionada una durada de graella."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2935
+#, fuzzy
+msgid " Chord "
+msgstr " Acord"
+
+#: ../src/gui/editors/matrix/MatrixEraser.cpp:105
+#, fuzzy
+msgid "Click on a note to delete it"
+msgstr "Fes clic per seleccionar un tipus de lletra"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:89
+msgid "Filter"
+msgstr "Filtre"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:245
+#: ../src/gui/editors/tempo/TempoView.cpp:117
+msgid "Time "
+msgstr "Temps "
+
+#: ../src/gui/editors/tempo/TempoView.cpp:118
+msgid "Type "
+msgstr "Tipus"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:119
+msgid "Value "
+msgstr "Valor"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:120
+msgid "Properties "
+msgstr "Propietats"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:208
+msgid "Common, hidden"
+msgstr "Comú, ocult"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:210
+msgid "Hidden"
+msgstr "Ocult"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:213
+msgid "Common"
+msgstr "Comú"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:220
+msgid "Time Signature "
+msgstr "Indicació del compàs"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:245
+msgid "%1.%2%3"
+msgstr "%1.%2%3"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:255
+msgid "%1.%2%3 qpm (%4.%5%6 bpm) "
+msgstr "%1.%2%3 qpm (%4.%5%6 bpm) "
+
+#: ../src/gui/editors/tempo/TempoView.cpp:264
+msgid "Tempo "
+msgstr "Tempo "
+
+#: ../src/gui/editors/tempo/TempoView.cpp:271
+msgid "<nothing at this filter level>"
+msgstr "<res en aquest nivell de filtrat>"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:463
+msgid "Delete Tempo or Time Signature"
+msgstr "Suprimeix el tempo i la indicació del compàs"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:602
+msgid "&Edit Item"
+msgstr "&Edita"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:834
+msgid "%1 - Tempo and Time Signature Editor"
+msgstr "%1 - Editor del tempo i de la indicació del compàs"
+
+#: ../src/gui/editors/guitar/GuitarChordEditorDialog.cpp:43
+#, fuzzy
+msgid "Guitar Chord Editor"
+msgstr "editor d'acords de guitarra"
+
+#: ../src/gui/editors/guitar/GuitarChordEditorDialog.cpp:51
+#, fuzzy
+msgid "Start fret"
+msgstr "Compàs inicial"
+
+#: ../src/gui/editors/guitar/GuitarChordEditorDialog.cpp:58
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:51
+msgid "Root"
+msgstr ""
+
+#: ../src/gui/editors/guitar/GuitarChordEditorDialog.cpp:62
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:55
+#, fuzzy
+msgid "Extension"
+msgstr "Versió"
+
+#: ../src/gui/editors/guitar/Fingering.cpp:118
+msgid "couldn't parse fingering '%1' in '%2'"
+msgstr ""
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:45
+#, fuzzy
+msgid "Guitar Chord Selector"
+msgstr "Selector d'acords"
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:64
+msgid "beginner"
+msgstr ""
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:65
+#, fuzzy
+msgid "common"
+msgstr "Comú"
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:66
+msgid "all"
+msgstr ""
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:86
+#, fuzzy
+msgid "Fingerings"
+msgstr "&Digitacions"
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:419
+#, fuzzy
+msgid "couldn't open file '%1'"
+msgstr "No s'ha pogut obrir el fitxer '%1'"
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:428
+#, c-format
+msgid "couldn't parse chord dictionnary : %1"
+msgstr ""
+
+#: ../src/gui/editors/notation/NoteFontViewer.cpp:87
+#, c-format
+msgid "Note Font Viewer: %1"
+msgstr "Visualitzador de font de notes: %1"
+
+#: ../src/gui/editors/notation/NoteFontViewer.cpp:93
+msgid " Component: "
+msgstr " Component: "
+
+#: ../src/gui/editors/notation/NoteFontViewer.cpp:101
+msgid " View: "
+msgstr " Visualitza: "
+
+#: ../src/gui/editors/notation/NoteFontViewer.cpp:104
+#, fuzzy
+msgid "Glyphs"
+msgstr "Figures"
+
+#: ../src/gui/editors/notation/NoteFontViewer.cpp:105
+msgid "Codes"
+msgstr "Codis"
+
+#: ../src/gui/editors/notation/NoteFontViewer.cpp:107
+msgid " Page: "
+msgstr " Pàgina: "
+
+#: ../src/gui/editors/notation/ClefInserter.cpp:64
+#: ../src/gui/editors/notation/GuitarChordInserter.cpp:71
+#: ../src/gui/editors/notation/RestInserter.cpp:79
+#: ../src/gui/editors/notation/TextInserter.cpp:68
+msgid "Switch to Inserting Notes"
+msgstr "Agafa l'eina per a afegir notes"
+
+#: ../src/gui/editors/notation/NotationView.cpp:522
+#, fuzzy
+msgid "Close track headers"
+msgstr "Canvia el nom de la pista"
+
+#: ../src/gui/editors/notation/NotationView.cpp:917
+msgid "Preparing to print..."
+msgstr "S'està preparant per imprimir..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:1516
+msgid "Note &Font"
+msgstr "&Font de notes"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1539
+msgid "Si&ze"
+msgstr "&Mida"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1545
+#, fuzzy
+msgid "Show Track Headers"
+msgstr "Mostra les eti&quetes de les pistes"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1550
+msgid "S&pacing"
+msgstr "Espa&iat"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1572
+msgid "Du&ration Factor"
+msgstr "Factor de du&ració"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1598
+msgid "Note &Style"
+msgstr "&Estil de la nota"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1624
+msgid "Insert Rest"
+msgstr "Afegeix un silenci"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1628
+msgid "Switch from Note to Rest"
+msgstr "Canvia una nota per un silenci"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1633
+msgid "Switch from Rest to Note"
+msgstr "Canvia un silenci per una nota"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1690
+msgid "No accidental"
+msgstr "Sense accidents"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1691
+msgid "Follow previous accidental"
+msgstr "Segueix l'accident anterior"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1692
+msgid "Sharp"
+msgstr "Diesi"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1693
+msgid "Flat"
+msgstr "Bemoll"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1694
+msgid "Natural"
+msgstr "Becaire"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1695
+msgid "Double sharp"
+msgstr "Doble diesi"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1696
+msgid "Double flat"
+msgstr "Doble bemoll"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1717
+msgid "&Treble Clef"
+msgstr "Clau de &soprano"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1724
+msgid "&Alto Clef"
+msgstr "Clau de &contralt"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1731
+msgid "Te&nor Clef"
+msgstr "Clau de &tenor"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1738
+msgid "&Bass Clef"
+msgstr "Clau de &baix"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1745
+msgid "&Text"
+msgstr "&Text"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1751
+#, fuzzy
+msgid "&Guitar Chord"
+msgstr "editor d'acords de guitarra"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1784
+msgid "Select from Sta&rt"
+msgstr "Seleccion&a des de l'inici"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1788
+msgid "Select to &End"
+msgstr "S&elecciona fins el final"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1792
+msgid "Select Whole St&aff"
+msgstr "Seleccio&na tot el pentagrama"
+
+#: ../src/commands/edit/CutAndCloseCommand.h:53
+#: ../src/gui/editors/notation/NotationView.cpp:1796
+msgid "C&ut and Close"
+msgstr "Ret&alla i tanca"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1800
+msgid "Pa&ste..."
+msgstr "&Enganxa..."
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:122
+#: ../src/gui/editors/notation/NotationView.cpp:1808
+msgid "Move to Staff Above"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:126
+#: ../src/gui/editors/notation/NotationView.cpp:1812
+msgid "Move to Staff Below"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1826
+msgid "&Linear Layout"
+msgstr "Format &lineal"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1835
+msgid "&Continuous Page Layout"
+msgstr "Format de pàgina &continu"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1844
+msgid "&Multiple Page Layout"
+msgstr "Format de pàgina &múltiple"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1854
+msgid "Show Ra&w Note Ruler"
+msgstr "Mostra el &regle de la nota crua"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1862
+msgid "Show &Annotations"
+msgstr "Mostra les &anotacions"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1866
+msgid "Show Lily&Pond Directives"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1870
+msgid "Open L&yric Editor"
+msgstr "Obre l'editor de la &lírica"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1912
+msgid "Trip&let Insert Mode"
+msgstr "Mode d'inserció de &tresets"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1926
+#, fuzzy
+msgid "Grace Insert Mode"
+msgstr "Mode d'inserció de &tresets"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2180
+msgid "&Dump selected events to stderr"
+msgstr "&Llença els esdeveniments seleccionats al stderr"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2248
+msgid "Ma&ke Ornament..."
+msgstr "&Fes l'ornamentació..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:2252
+msgid "Trigger &Ornament..."
+msgstr "&Ornament activador..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:2256
+msgid "Remove Ornament..."
+msgstr "Suprimeix l'ornament..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:2261
+msgid "&None"
+msgstr "&Res"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2289
+#, fuzzy
+msgid "Convert Notation For..."
+msgstr "S'està exportant el fitxer d'àudio..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:2298
+msgid "Show &Notes Toolbar"
+msgstr "Mostra la barra d'eines de les&notes"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2299
+msgid "Show &Rests Toolbar"
+msgstr "Mostra la barra d'eines dels &silencis"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2300
+msgid "Show &Accidentals Toolbar"
+msgstr "Mostra la barra d'eines d'&accidents"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2301
+msgid "Show Cle&fs Toolbar"
+msgstr "Mostra la barra d'eines de les cla&us"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2303
+msgid "Show &Marks Toolbar"
+msgstr "Mostra la barra d'eines dels &marcadors"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2305
+msgid "Show &Group Toolbar"
+msgstr "Mostra la barra d'eines del &grup"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2307
+msgid "Show &Layout Toolbar"
+msgstr "Mostra la barra d'eines del &format"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2311
+msgid "Show M&eta Toolbar"
+msgstr "Mostra la barra d'eines M&eta"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2373
+msgid "Cursor &Up Staff"
+msgstr "Apuja el c&ursor un pentagrama"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2377
+msgid "Cursor &Down Staff"
+msgstr "Abaixa el cursor un &pentagrama"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2381
+msgid "Cursor Pre&vious Segment"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2385
+#, fuzzy
+msgid "Cursor Ne&xt Segment"
+msgstr "Crea un fragment"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2475
+msgid "Push &Left"
+msgstr "Empeny cap a l'&esquerra"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2479
+msgid "Push &Right"
+msgstr "Empeny cap a la d&reta"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2483
+msgid "Push &Up"
+msgstr "Empeny cap &amunt"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2487
+msgid "Push &Down"
+msgstr "Empeny cap a&vall"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2491
+#, fuzzy
+msgid "&Restore Positions"
+msgstr "Restaura les posicions calculades"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2495
+msgid "Make &Invisible"
+msgstr "Fes &invisible"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2499
+msgid "Make &Visible"
+msgstr "Fes &visible"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2503
+msgid "Toggle Dot"
+msgstr "Commuta el punt"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2507
+#: ../src/gui/editors/notation/NotationView.cpp:2511
+msgid "Add Dot"
+msgstr "Afegeix un punt"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2570
+#, c-format
+msgid ""
+"_n: 1 pixel\n"
+"%n pixels"
+msgstr ""
+"_n: 1 píxel\n"
+"%n píxels"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2619
+msgid " Font: "
+msgstr " Font: "
+
+#: ../src/gui/editors/notation/NotationView.cpp:2647
+msgid "Unknown font \"%1\", using default"
+msgstr "No s'ha trobat la font \"%1\" i es farà servir la predeterminada"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2655
+msgid " Size: "
+msgstr " Mida: "
+
+#: ../src/gui/editors/notation/NotationView.cpp:2677
+msgid " Spacing: "
+msgstr " Espaiat: "
+
+#: ../src/gui/editors/notation/NotationView.cpp:2993
+#: ../src/gui/editors/notation/NotationView.cpp:3818
+msgid " Ready."
+msgstr " A punt."
+
+#: ../src/gui/editors/notation/NotationView.cpp:2998
+msgid "Laying out score..."
+msgstr "S'està donant format a la partitura..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:3011
+msgid "Laying out staff %1..."
+msgstr "S'està donant format al pentagrama %1..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:3020
+msgid "Reconciling staffs..."
+msgstr "S'està reconciliant els pentagrames..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:3885
+msgid "Sizing and allocating canvas..."
+msgstr "S'està ubicant i dimensionant el full..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:4050
+msgid "note"
+msgstr "nota"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4050
+msgid "rest"
+msgstr "silenci"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4211
+msgid "%1 - Segment Track #%2 - Notation"
+msgstr "%1 - Fragment de la pista #%2 - Partitura"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4217
+msgid "%1 - All Segments - Notation"
+msgstr "%1 - Tots els fragments - Partitura"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4222
+msgid ""
+"_n: %1 - Segment - Notation\n"
+"%1 - %n Segments - Notation"
+msgstr ""
+"_n: %1 - Fragment - Notació\n"
+"%2 - %n Fragments - Notació"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4243
+#, fuzzy
+msgid "Grace"
+msgstr "Grec"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4247
+#: ../src/gui/editors/notation/NotationView.cpp:4251
+#: ../src/gui/editors/notation/NotationView.cpp:4255
+#, fuzzy
+msgid "%1 %2"
+msgstr "%1 (%2)"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4271
+msgid "Hidden annotations"
+msgstr "Anotacions ocultes"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4293
+msgid "Hidden LilyPond directives"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:4326
+#, c-format
+msgid "Unknown spacing action %1"
+msgstr "Es desconeix l'acció d'espaiat %1"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4384
+#, c-format
+msgid "Unknown proportion action %1"
+msgstr "Es desconeix l'acció de proporcionalitat %1"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4431
+#, c-format
+msgid "Unknown font action %1"
+msgstr "Es desconeix l'acció %1"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4449
+#, c-format
+msgid "Unknown font size %1"
+msgstr "No s'ha trobat la mida %1 per aquesta font"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4453
+#, c-format
+msgid "Unknown font size action %1"
+msgstr "Es desconeix l'acció de canvi de mida %1"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4780
+#, fuzzy
+msgid ""
+"The Restricted paste type requires enough empty space (containing only "
+"rests) at the paste position to hold all of the events to be pasted.\n"
+"Not enough space was found.\n"
+"If you want to paste anyway, consider using one of the other paste types "
+"from the \"Paste...\" option on the Edit menu. You can also change the "
+"default paste type to something other than Restricted if you wish."
+msgstr ""
+"El tipus d'enganxat restringit requereix que hi hagi un espai\n"
+" buit suficient (espai en silenci) per\n"
+"fer-hi quebre tots els esdeveniments que es volen posar.\n"
+"Però no hi ha prou espai.\n"
+"Si, de totes maneres, voleu enganxar-ho, teniu\n"
+"tipus d'enganxat en l'opció \"Enganxa\"\n"
+"del menú Edita. Per altra banda també podeu canviar\n"
+" el tipus d'enganxatper defecte per un altre de diferent."
+
+#: ../src/gui/editors/notation/NotationView.cpp:4800
+msgid "Can't paste multiple Segments into one"
+msgstr "No s'han pogut enganxar múltiples fragments en un de sol"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4828
+#: ../src/gui/editors/notation/NotationView.cpp:4877
+msgid "Couldn't paste at this point."
+msgstr "No s'ha pogut enganxar en aquest punt."
+
+#: ../src/gui/editors/notation/NotationView.cpp:4896
+#, fuzzy
+msgid "Move Events to Staff Above"
+msgstr "&Mou els esdeveniments a un altre fragment"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4924
+#, fuzzy
+msgid "Move Events to Staff Below"
+msgstr "&Mou els esdeveniments a un altre fragment"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5036
+msgid "Pushing selection left..."
+msgstr "S'està empenyent la selecció cap a l'esquerra..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5047
+msgid "Pushing selection right..."
+msgstr "S'està empenyent la selecció cap a la dreta..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5058
+msgid "Pushing selection up..."
+msgstr "S'està empenyent la selecció cap amunt..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5069
+msgid "Pushing selection down..."
+msgstr "S'està empenyent la selecció cap avall..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5080
+msgid "Restoring computed positions..."
+msgstr "S'està restaurant les posicions calculades..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5089
+msgid "Making visible..."
+msgstr "S'està fent visible..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5098
+msgid "Making invisible..."
+msgstr "S'està fent invisible..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5185
+msgid "Beaming group..."
+msgstr "S'està posant una barra al grup..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5195
+msgid "Auto-beaming selection..."
+msgstr "S'està posant les barres automàticament a la selecció..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5205
+msgid "Breaking groups..."
+msgstr "S'està separant els grups"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5293
+#, fuzzy
+msgid "Untupleting..."
+msgstr "&Divideix els grups irregulars..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5301
+msgid "Adding slur..."
+msgstr "S'està afegint el lligat..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5302
+msgid "slur"
+msgstr "lligat"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5307
+msgid "Adding phrasing slur..."
+msgstr "S'està afegeixint el lligat de la frase..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5308
+msgid "phrasing slur"
+msgstr "lligat de frase"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5313
+msgid "Adding glissando..."
+msgstr "S'està afegint el glissando..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5314
+msgid "glissando"
+msgstr "glissando"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5319
+msgid "Adding crescendo..."
+msgstr "S'està afegint el crescendo..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5320
+#: ../src/gui/editors/notation/NotationView.cpp:5326
+msgid "dynamic"
+msgstr "Dinàmica"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5325
+msgid "Adding decrescendo..."
+msgstr "S'està afegint el decrescendo..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5331
+#: ../src/gui/editors/notation/NotationView.cpp:5337
+#: ../src/gui/editors/notation/NotationView.cpp:5343
+#: ../src/gui/editors/notation/NotationView.cpp:5349
+msgid "Adding octave..."
+msgstr "S'està afegint una octava"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5332
+#: ../src/gui/editors/notation/NotationView.cpp:5338
+#: ../src/gui/editors/notation/NotationView.cpp:5344
+#: ../src/gui/editors/notation/NotationView.cpp:5350
+msgid "ottava"
+msgstr "octava"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5366
+msgid "Can't add overlapping %1 indications"
+msgstr "No es poden afegir les %1 indicacions solapades"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5375
+msgid "Making chord..."
+msgstr "S'està creant l'acord..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5387
+msgid "Normalizing rests..."
+msgstr "S'estan normalitzant els silencis..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5397
+msgid "Collapsing rests..."
+msgstr "S'estan eliminant els sinlencis..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5417
+msgid "Tying notes..."
+msgstr "S'estan eliminant notes..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5427
+msgid "Untying notes..."
+msgstr "S'estan deslligant les notes..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5437
+msgid "Making notes viable..."
+msgstr "S'estan fent les notes viables..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5447
+msgid "Removing counterpoint..."
+msgstr "S'està eliminant el contrapunt..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5457
+msgid "Pointing stems up..."
+msgstr "S'estan dibuixant les vírgules cap amunt..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5467
+msgid "Pointing stems down..."
+msgstr "S'estan dibuixant les vírgules cap avall..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5478
+msgid "Restoring computed stem directions..."
+msgstr "S'està restaurant l'orientació de les vírgules..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5488
+#: ../src/gui/editors/notation/NotationView.cpp:5498
+msgid "Positioning slurs..."
+msgstr "S'estan dibuixant els lligats..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5509
+msgid "Restoring slur positions..."
+msgstr "S'està restaurant les posicions dels lligats..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5519
+#: ../src/gui/editors/notation/NotationView.cpp:5529
+#, fuzzy
+msgid "Positioning ties..."
+msgstr "S'estan dibuixant els lligats..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5540
+#, fuzzy
+msgid "Restoring tie positions..."
+msgstr "S'està restaurant les posicions calculades..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5550
+msgid "Fixing notation quantization..."
+msgstr "S'està quantificant la notació..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5560
+msgid "Removing notation quantization..."
+msgstr "S'està suprimeix la quantificació de la partitura..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5577
+msgid "Changing to %1 style..."
+msgstr "S'està canviant a l'estil %1..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5585
+#, c-format
+msgid "Unknown style action %1"
+msgstr "Es desconeix l'acció d'estil %1"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5598
+#: ../src/gui/editors/notation/NotationView.cpp:5639
+#: ../src/gui/editors/notation/NotationView.cpp:5695
+msgid "No note duration selected"
+msgstr "No s'ha seleccionat cap durada de nota"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5660
+msgid "No rest duration selected"
+msgstr "No s'ha seleccionat cap durada de silenci"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5746
+msgid "No note or rest duration selected"
+msgstr "No s'ha seleccionat cap durada ni de nota ni de silenci"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5757
+#: ../src/gui/editors/notation/NotationView.cpp:5768
+#: ../src/gui/editors/notation/NotationView.cpp:5779
+#: ../src/gui/editors/notation/NotationView.cpp:5790
+#: ../src/gui/editors/notation/NotationView.cpp:5801
+#: ../src/gui/editors/notation/NotationView.cpp:5812
+#: ../src/gui/editors/notation/NotationView.cpp:5823
+msgid "Forcing accidentals..."
+msgstr "S'estan forçant els accidents..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5834
+msgid "Restoring accidentals..."
+msgstr "S'estan recuperant els accidents..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5845
+#, fuzzy
+msgid "Showing cautionary accidentals..."
+msgstr "S'estan mostrant els accidents de pre&caució..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5855
+msgid "Cancelling cautionary accidentals..."
+msgstr "S'estan cancel·lant els accidents de precaució..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5884
+msgid "Interpreting selection..."
+msgstr "S'està interpretant la selecció..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5896
+msgid "Setting note durations..."
+msgstr "S'està definint la durada de les notes..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5904
+#: ../src/gui/editors/notation/NotationView.cpp:5912
+msgid "Adding dot..."
+msgstr "S'està afegeix un punt..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5934
+msgid "Text: "
+msgstr "Text: "
+
+#: ../src/gui/editors/notation/NotationView.cpp:5948
+msgid "Fingering: "
+msgstr "Digitació: "
+
+#: ../src/gui/editors/notation/NotationView.cpp:6036
+msgid "Ornament track %1 bar %2"
+msgstr "Ornament a la pista %1 compàs %2"
+
+#: ../src/gui/editors/notation/NotationView.cpp:6038
+#, c-format
+msgid "Ornament bar %1"
+msgstr "Ornament al compàs %1"
+
+#: ../src/gui/editors/notation/NotationView.cpp:6098
+msgid "Remove Ornaments"
+msgstr "Suprimeix els ornaments"
+
+#: ../src/gui/editors/notation/NotationView.cpp:6145
+msgid "Estimated key signature shown"
+msgstr "Mostra la clau recomanada"
+
+#: ../src/gui/editors/notation/NotationStaff.cpp:1249
+#: ../src/gui/editors/notation/NotationView.cpp:6202
+msgid "Sustain"
+msgstr "Sosté"
+
+#: ../src/gui/editors/notation/NotationView.cpp:6218
+msgid ""
+"There is no sustain controller defined for this device.\n"
+"Please ensure the device is configured correctly in the Manage MIDI Devices "
+"dialog in the main window."
+msgstr ""
+"No hi ha cap controlador definit per aquest dispositiu.\n"
+"Mireu si el dispositiu està ben configurat en el gestor de dispositius MIDI"
+
+#: ../src/gui/editors/notation/NotationView.cpp:7250
+msgid "Can't insert note: No note duration selected"
+msgstr ""
+"No s'ha pogut afegir una nota: No hi ha seleccionada s'ha seleccionat cap "
+"durada"
+
+#: ../src/gui/editors/notation/NotationEraser.cpp:61
+#: ../src/gui/editors/notation/NotationSelector.cpp:83
+msgid "Switch to Insert Tool"
+msgstr "Agafa l'eina per a afegir"
+
+#: ../src/gui/editors/notation/NotePixmapFactory.cpp:2303
+#: ../src/gui/editors/notation/NotePixmapFactory.cpp:2347
+msgid "..."
+msgstr "..."
+
+#: ../src/gui/editors/notation/NoteFontFactory.cpp:200
+msgid "Can't obtain a default font -- no fonts found"
+msgstr ""
+"No s'ha trobat el tipus de lletre per defecte -- no hi ha cap tipus de lletra"
+
+#: ../src/gui/editors/notation/NoteFontMap.cpp:52
+#: ../src/gui/general/PresetGroup.cpp:49
+msgid "unknown error"
+msgstr "error desconegut"
+
+#: ../src/gui/editors/notation/NoteFontMap.cpp:78
+#, fuzzy
+msgid "Can't open font mapping file %1 or %2"
+msgstr "No s'ha pogut obrir el fitxer de tipus de lletra %1 o %2"
+
+#: ../src/gui/editors/notation/NoteFontMap.cpp:82
+#, fuzzy, c-format
+msgid "Can't open font mapping file %1"
+msgstr "No s'ha pogut obrir el fitxer de tipus de lletra %1"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:52
+msgid "%1-dotted-%2"
+msgstr "%1-amb punt-%2"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:54
+msgid "%1-dotted %2"
+msgstr "%1-amb punt %2"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:57
+#, c-format
+msgid "dotted-%1"
+msgstr "%1-amb punt"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:59
+#, c-format
+msgid "dotted %1"
+msgstr "%1 amb punt"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:83
+msgid "sixty-fourth note"
+msgstr "semifusa"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:83
+msgid "thirty-second note"
+msgstr "fusa"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:84
+msgid "sixteenth note"
+msgstr "semicorxera"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:84
+msgid "eighth note"
+msgstr "corxera"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:85
+msgid "quarter note"
+msgstr "negra"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:85
+msgid "half note"
+msgstr "blanca"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:86
+msgid "whole note"
+msgstr "rodona"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:86
+msgid "double whole note"
+msgstr "quadrada"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:89
+msgid "sixty-fourth notes"
+msgstr "semifuses"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:89
+msgid "thirty-second notes"
+msgstr "fuses"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:90
+msgid "sixteenth notes"
+msgstr "semicorxeres"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:90
+msgid "eighth notes"
+msgstr "corxeres"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:91
+msgid "quarter notes"
+msgstr "negres"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:91
+msgid "half notes"
+msgstr "blanques"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:92
+msgid "whole notes"
+msgstr "rodones"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:92
+msgid "double whole notes"
+msgstr "quadrades"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:96
+#: ../src/gui/editors/notation/NotationStrings.cpp:154
+msgid "%1 triplets"
+msgstr "%1 tresets"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:100
+#: ../src/gui/editors/notation/NotationStrings.cpp:158
+msgid "%1 triplet"
+msgstr "treset de %1"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:143
+msgid "64th"
+msgstr "semifusa"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:143
+msgid "32nd"
+msgstr "fusa"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:143
+msgid "16th"
+msgstr "semicorxera"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:143
+msgid "8th"
+msgstr "corxera"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:144
+msgid "quarter"
+msgstr "negra"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:144
+msgid "half"
+msgstr "blanca"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:144
+msgid "whole"
+msgstr "rodona"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:145
+msgid "double whole"
+msgstr "quadrada"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:148
+msgid "64ths"
+msgstr "semifuses"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:148
+msgid "32nds"
+msgstr "fuses"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:148
+msgid "16ths"
+msgstr "semicorxeres"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:148
+msgid "8ths"
+msgstr "corxeres"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:149
+msgid "quarters"
+msgstr "negres"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:149
+msgid "halves"
+msgstr "blanques"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:149
+msgid "wholes"
+msgstr "rodones"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:150
+msgid "double wholes"
+msgstr "quadrades"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:278
+msgid "%1 ticks"
+msgstr "%1 batecs"
+
+#: ../src/gui/editors/notation/FontViewFrame.cpp:100
+#, c-format
+msgid "Error: Unable to match font name %1"
+msgstr "Error: no s'ha pogut trobar el tipus de lletra %1"
+
+#: ../src/gui/editors/notation/FontViewFrame.cpp:108
+msgid "Warning: No good match for font name %1 (best is %2)"
+msgstr "Avís: no s'ha trobat el tipus de lletra %1 (però es ferà servir %2) "
+
+#: ../src/gui/editors/notation/FontViewFrame.cpp:116
+#, c-format
+msgid "Error: Unable to open best-match font %1"
+msgstr "Error: no s'ha pogut obrir el tipus de lletra alternatiu %1"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:113
+#, fuzzy
+msgid "Track %1 : \"%2\""
+msgstr "Banc %1 %2"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:119
+#, fuzzy, c-format
+msgid ""
+"\n"
+"Notate for: %1"
+msgstr "Visualitzador de font de notes: %1"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:121
+#, fuzzy
+msgid "normal"
+msgstr "Normal"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:124
+#, fuzzy
+msgid "small"
+msgstr "escalable"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:127
+msgid "tiny"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:131
+msgid "--"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:156
+msgid ""
+"\n"
+"Size: %1, Bracket: %2 "
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:183
+msgid ""
+"\n"
+"bars [%1-%2] in %3 (tr=%4) : \"%5\""
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:190
+msgid ""
+"\n"
+"bars [%1-%2] (tr=%3) : \"%4\""
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:240
+#, fuzzy
+msgid "C#"
+msgstr "Do#%1"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:242
+msgid "Eb"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:245
+#, fuzzy
+msgid "F#"
+msgstr "Fa#%1"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:247
+#, fuzzy
+msgid "G#"
+msgstr "Sol#%1"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:249
+msgid "Bb"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:352
+#, fuzzy
+msgid "%1: %2"
+msgstr "%1 (%2)"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:355
+#, fuzzy, c-format
+msgid " in %1"
+msgstr "Entrada %1"
+
+#: ../src/gui/editors/notation/NotationStaff.cpp:452
+msgid "Rendering staff %1..."
+msgstr "S'està dibuixant el pentagrama %1..."
+
+#: ../src/gui/editors/notation/NotationStaff.cpp:515
+msgid "Rendering notes on staff %1..."
+msgstr "S'estan dibuixant les notes en el pentagrama %1..."
+
+#: ../src/gui/editors/notation/NotationStaff.cpp:583
+msgid "Positioning staff %1..."
+msgstr "S'està ubicant %1..."
+
+#: ../src/gui/editors/notation/NotationSelectionPaster.cpp:85
+msgid "Ready."
+msgstr "Preparat."
+
+#: ../src/gui/editors/notation/RestInserter.cpp:62
+msgid "Dotted rest"
+msgstr "Nota amb punt"
+
+#: ../src/gui/editors/notation/NoteStyleFileReader.cpp:57
+#, c-format
+msgid "Can't open style file %1"
+msgstr "No s'ha pogut obrir el fitxer d'estil %1"
+
+#: ../src/gui/editors/notation/NoteStyleFileReader.cpp:92
+msgid "type is a required attribute of note"
+msgstr "el tipus és un atribut obligatori de la nota"
+
+#: ../src/gui/editors/notation/NoteStyleFileReader.cpp:101
+#, c-format
+msgid "Unrecognised note name %1"
+msgstr "No s'ha reconegut el nom de la nota %1"
+
+#: ../src/gui/editors/notation/NoteStyleFileReader.cpp:108
+msgid "global element must precede note elements"
+msgstr "l'element global ha de precedir els elements de la nota"
+
+#: ../src/gui/editors/notation/NoteStyleFileReader.cpp:137
+msgid ""
+"global and note elements may have shape or charname attribute, but not both"
+msgstr ""
+"els elements globals i de la nota han de tenir una forma o un atribut nom-"
+"del-caràcter, però no els dos "
+
+#: ../src/gui/editors/notation/NotationVLayout.cpp:493
+msgid ""
+"Spanned note at %1 has no HEIGHT_ON_STAFF property!\n"
+"This is a bug (the program would previously have crashed by now)"
+msgstr ""
+"La nota de %1 no té la propietat HEIGHT_ON_STAFF!\n"
+"Això és un bug del programa (el programa es pot haver penjat)"
+
+#: ../src/gui/editors/notation/NoteInserter.cpp:82
+msgid "Auto-Beam when appropriate"
+msgstr "Posa les barres d'agrupació automàticament on sigui apropiat"
+
+#: ../src/gui/editors/notation/NoteInserter.cpp:103
+msgid "Dotted note"
+msgstr "Nota amb punt"
+
+#: ../src/gui/editors/notation/NoteInserter.cpp:120
+msgid "Switch to Inserting Rests"
+msgstr "Agafa l'eina per a afegir silencis"
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:98
+msgid "Collapse Rests"
+msgstr "Redueix els silencis"
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:102
+msgid "Respell as Flat"
+msgstr "Reescriu en bemoll"
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:106
+msgid "Respell as Sharp"
+msgstr "Reescriu en sostingut"
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:110
+msgid "Respell as Natural"
+msgstr "Reescriu de la forma natural"
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:114
+msgid "Collapse Notes"
+msgstr "Redueix les notes"
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:130
+msgid "Make Invisible"
+msgstr "Fes invisible"
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:134
+msgid "Make Visible"
+msgstr "Fes visible"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:129
+msgid "Event filters"
+msgstr "Filtres de l'esdeveniment"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:138
+msgid "Rest"
+msgstr "Silenci"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:139
+msgid "Indication"
+msgstr "Indicació"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:141
+msgid "Other"
+msgstr "Altre"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:161
+msgid "Triggered Segment Properties"
+msgstr "Propietats del fragment activable"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:166
+msgid "Label: "
+msgstr "Etiqueta: "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:176
+msgid "Base pitch: "
+msgstr "Altura de base: "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:183
+msgid "Base velocity: "
+msgstr "Velocitat de base: "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:246
+msgid "Duration "
+msgstr "Durada "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:247
+msgid "Event Type "
+msgstr "Tipus d'esdeveniment "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:248
+msgid "Pitch "
+msgstr "Altura "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:249
+msgid "Velocity "
+msgstr "Velocitat "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:250
+msgid "Type (Data1) "
+msgstr "Tipus (Dada 1) "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:251
+msgid "Value (Data2) "
+msgstr "Valor (Dada 2) "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:461
+msgid "(group %1) "
+msgstr "(grup %1) "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:519
+msgid "<no events at this filter level>"
+msgstr "<no s'han trobat esdeveniments en aquest nivell de filtrat>"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:521
+msgid "<no events>"
+msgstr "<no s'han trobat esdeveniments>"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:696
+msgid "Segment label"
+msgstr "Etiqueta del fragment"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:696
+msgid "Label:"
+msgstr "Etiqueta:"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1123
+msgid "&Insert Event"
+msgstr "&Afegeix un esdeveniment"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1130
+msgid "&Delete Event"
+msgstr "&Suprimeix l'esdeveniment"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1137
+msgid "&Edit Event"
+msgstr "&Edita l'esdeveniment"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1144
+msgid "&Advanced Event Editor"
+msgstr "Editor &avançat d'esdeveniments"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1518
+msgid "Open in Event Editor"
+msgstr "Obre en l'editor d'esdeveniments"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1519
+msgid "Open in Expert Event Editor"
+msgstr "Obre en l'editor avançat d'esdeveniments"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1577
+msgid "%1 - Triggered Segment: %2"
+msgstr "%1 - Fragment activable: %2"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1592
+msgid "%1 - Segment Track #%2 - Event List"
+msgstr "%1 - Fragment de la pista #%2 - Llista d'esdeveniments"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1598
+msgid "%1 - %2 Segments - Event List"
+msgstr "%1 - %2 Fragments - Llista d'esdeveniments"
+
+#: ../src/gui/rulers/TempoRuler.cpp:131
+#, fuzzy
+msgid "Insert Tempo Change at Playback Position"
+msgstr "Afegeix el canvi de tempo"
+
+#: ../src/gui/rulers/TempoRuler.cpp:136
+#, fuzzy
+msgid "Delete Tempo Change"
+msgstr "Afegeix el canvi de tempo"
+
+#: ../src/gui/rulers/TempoRuler.cpp:140
+msgid "Ramp Tempo to Next Tempo"
+msgstr ""
+
+#: ../src/gui/rulers/TempoRuler.cpp:144
+msgid "Un-Ramp Tempo"
+msgstr ""
+
+#: ../src/gui/rulers/TempoRuler.cpp:149
+#, fuzzy
+msgid "Edit Tempo..."
+msgstr "Modifica el tempo per &defecte..."
+
+#: ../src/gui/rulers/TempoRuler.cpp:153
+#, fuzzy
+msgid "Edit Time Signature..."
+msgstr "Indicació de compàs"
+
+#: ../src/gui/rulers/TempoRuler.cpp:588
+#, fuzzy
+msgid "%1.%2%3 (%4.%5%6 bpm)"
+msgstr "%1.%2%3 qpm (%4.%5%6 bpm) "
+
+#: ../src/gui/rulers/TempoRuler.cpp:596
+#, fuzzy
+msgid "%1.%2%3 bpm"
+msgstr "(%1.%2 bpm)"
+
+#: ../src/gui/rulers/TempoRuler.cpp:604
+#, fuzzy
+msgid "%1 - %2.%3%4"
+msgstr "%1.%2%3"
+
+#: ../src/gui/rulers/ControlRulerEventInsertCommand.cpp:36
+msgid "Insert Controller Event"
+msgstr "Afegeix un controlador d'esdeveniments"
+
+#: ../src/gui/rulers/ControlChangeCommand.cpp:35
+msgid "Control Change"
+msgstr "Canvi de control"
+
+#: ../src/gui/rulers/PropertyViewRuler.cpp:72
+msgid "%1 controller"
+msgstr "controlador %1"
+
+#: ../src/gui/rulers/RawNoteRuler.cpp:453
+msgid "Track #%1, Segment \"%2\" (runtime id %3)"
+msgstr ""
+
+#: ../src/gui/rulers/MarkerRuler.cpp:100
+#, fuzzy
+msgid "Insert Marker"
+msgstr "Afegeix un silenci"
+
+#: ../src/gui/rulers/MarkerRuler.cpp:104
+#, fuzzy
+msgid "Insert Marker at Playback Position"
+msgstr "Afegeix el canvi de tempo"
+
+#: ../src/gui/rulers/MarkerRuler.cpp:109
+#, fuzzy
+msgid "Delete Marker"
+msgstr "Suprimeix un marcador"
+
+#: ../src/gui/rulers/MarkerRuler.cpp:114
+#, fuzzy
+msgid "Edit Marker..."
+msgstr "Edita els marcadors..."
+
+#: ../src/gui/rulers/MarkerRuler.cpp:119
+msgid ""
+"Click on a marker to move the playback pointer.\n"
+"Shift-click to set a range between markers.\n"
+"Double-click to open the marker editor."
+msgstr ""
+
+#: ../src/gui/rulers/ChordNameRuler.cpp:97
+msgid ""
+"Chord name ruler.\n"
+"Turn it on and off from the Settings->Rulers menu."
+msgstr ""
+"Regle pels noms dels acords.\n"
+"Activa'l i desactiva'l des del menú preferències->regles."
+
+#: ../src/gui/rulers/ControlRulerEventEraseCommand.cpp:37
+msgid "Erase Controller Event(s)"
+msgstr "Suprimeix el controlador d'esdeveniments"
+
+#: ../src/gui/general/EditView.cpp:901
+#: ../src/gui/rulers/ControllerEventsRuler.cpp:188
+msgid "Unsupported Event Type"
+msgstr "Tipus d'esdeveniment desconegut"
+
+#: ../src/gui/rulers/ControllerEventsRuler.cpp:203
+msgid "Controller Events"
+msgstr "Controlador d'esdeveniments"
+
+#: ../src/gui/rulers/ControllerEventsRuler.cpp:278
+msgid "Controller Event Number"
+msgstr "Número de controlador d'esdeveniments"
+
+#: ../src/gui/rulers/ControllerEventsRuler.cpp:471
+msgid "Add line of controllers"
+msgstr "Afegeix la línia de controladors"
+
+#: ../src/gui/rulers/LoopRuler.cpp:89
+#, fuzzy
+msgid ""
+"Click and drag to move the playback pointer.\n"
+"Shift-click and drag to set a range for looping or editing.\n"
+"Shift-click to clear the loop or range.\n"
+"Double-click to start playback."
+msgstr ""
+"Feu clic en les marques per establir el punt de reproducció.\n"
+"Majúscules + clic esquerre + arrossegueu per marcar un bucle.\n"
+"Majúscules + clic esquerre per desfer el bucle (o desmarcar el botó en el "
+"Control)."
+
+#: ../src/gui/general/EditViewBase.cpp:228
+msgid "Set Segment Start Time..."
+msgstr "Defineix el temps d'inici del fragment..."
+
+#: ../src/gui/general/EditViewBase.cpp:232
+msgid "Set Segment Duration..."
+msgstr "Defineix la duració del fragment..."
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:56
+msgid "Load track parameters preset"
+msgstr ""
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:62
+#, fuzzy
+msgid "Convert notation for..."
+msgstr "S'està exportant el fitxer d'àudio..."
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:86
+msgid "Select preset track parameters for:"
+msgstr ""
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:87
+msgid "Create appropriate notation for:"
+msgstr ""
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:89
+#, fuzzy
+msgid "Category"
+msgstr "Categoria:"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:95
+#, fuzzy
+msgid "Player Ability"
+msgstr "&Llista de peces"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:97
+#, fuzzy
+msgid "Amateur"
+msgstr "Master"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:98
+#, fuzzy
+msgid "Professional"
+msgstr "S'està processant..."
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:104
+#, fuzzy
+msgid "Only selected segments"
+msgstr "Selecciona &tots els fragments"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:106
+#, fuzzy
+msgid "All segments in this track"
+msgstr "Aplica a tots els fragments d'aquest moment"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:111
+#, fuzzy
+msgid "Only for new segments"
+msgstr "Lírica per aquest fragment"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:113
+#, fuzzy
+msgid "Convert existing segments"
+msgstr "Crea un fragment"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:39
+#, c-format
+msgid "C%1"
+msgstr "Do%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:39
+#, c-format
+msgid "C#%1"
+msgstr "Do#%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:39
+#, c-format
+msgid "D%1"
+msgstr "Re%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:39
+#, c-format
+msgid "D#%1"
+msgstr "Re#%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:40
+#, c-format
+msgid "E%1"
+msgstr "Mi%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:40
+#, c-format
+msgid "F%1"
+msgstr "Fa%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:40
+#, c-format
+msgid "F#%1"
+msgstr "Fa#%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:40
+#, c-format
+msgid "G%1"
+msgstr "Sol%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:41
+#, c-format
+msgid "G#%1"
+msgstr "Sol#%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:41
+#, c-format
+msgid "A%1"
+msgstr "La%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:41
+#, c-format
+msgid "A#%1"
+msgstr "La#%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:41
+#, c-format
+msgid "B%1"
+msgstr "Si%1"
+
+#: ../src/gui/general/PresetGroup.cpp:95
+#, fuzzy, c-format
+msgid "Can't open preset file %1"
+msgstr "No s'ha pogut obrir el fitxer d'estil %1"
+
+#: ../src/gui/general/EditView.cpp:744
+#, fuzzy
+msgid "&Halve Durations"
+msgstr "Durada"
+
+#: ../src/gui/general/EditView.cpp:748
+#, fuzzy
+msgid "&Double Durations"
+msgstr "Doble bemoll"
+
+#: ../src/gui/general/EditView.cpp:806
+msgid "Show Velocity Property Ruler"
+msgstr "Mostra el regle de propietat de la velocitat"
+
+#: ../src/gui/general/EditView.cpp:825
+msgid "Insert item"
+msgstr "Afegeix l'element"
+
+#: ../src/gui/general/EditView.cpp:831
+msgid "Erase selected items"
+msgstr "Esborra els elements seleccionats"
+
+#: ../src/gui/general/EditView.cpp:835
+msgid "Clear ruler"
+msgstr "Neteja el regle"
+
+#: ../src/gui/general/EditView.cpp:839
+msgid "Insert line of controllers"
+msgstr "Afegeix una línia de controladors"
+
+#: ../src/gui/general/EditView.cpp:843
+msgid "Flip forward"
+msgstr "Invertir endavant"
+
+#: ../src/gui/general/EditView.cpp:847
+msgid "Flip backwards"
+msgstr "Invertir enrere"
+
+#: ../src/gui/general/EditView.cpp:851
+msgid "Draw property line"
+msgstr "Dibuixa una línia de propietat"
+
+#: ../src/gui/general/EditView.cpp:855
+msgid "Select all property values"
+msgstr "Selecciona tots els valors de propietat"
+
+#: ../src/gui/general/EditView.cpp:894
+msgid "%1 Controller %2 %3"
+msgstr "%1 controlador %2 %3"
+
+#: ../src/gui/general/EditView.cpp:1066
+msgid "I"
+msgstr "I"
+
+#: ../src/gui/general/EditView.cpp:1066
+msgid "II"
+msgstr "II"
+
+#: ../src/gui/general/EditView.cpp:1066
+msgid "III"
+msgstr "III"
+
+#: ../src/gui/general/EditView.cpp:1066
+msgid "IV"
+msgstr "IV"
+
+#: ../src/gui/general/EditView.cpp:1067
+msgid "V"
+msgstr "V"
+
+#: ../src/gui/general/EditView.cpp:1067
+msgid "VI"
+msgstr "VI"
+
+#: ../src/gui/general/EditView.cpp:1067
+msgid "VII"
+msgstr "VII"
+
+#: ../src/gui/general/EditView.cpp:1067
+msgid "VIII"
+msgstr "VIII"
+
+#: ../src/gui/general/EditView.cpp:1069
+msgid "%1 flat"
+msgstr "%1 bemoll"
+
+#: ../src/gui/general/EditView.cpp:1070
+msgid "%1 sharp"
+msgstr "%1 diesi"
+
+#: ../src/gui/general/EditView.cpp:1085
+msgid "&Insert Note"
+msgstr "&Afegeix una nota"
+
+#: ../src/gui/general/EditView.cpp:1091
+msgid "&Upper Octave"
+msgstr "Octava s&uperior"
+
+#: ../src/gui/general/EditView.cpp:1096
+msgid "&Lower Octave"
+msgstr "Octava &inferior"
+
+#: ../src/gui/general/EditView.cpp:1268
+msgid "Estimated time signature shown"
+msgstr "Es mostra la indicació de compàs estimada"
+
+#: ../src/gui/general/EditView.cpp:1431
+#, fuzzy
+msgid "Halving durations..."
+msgstr "S'està definint la durada de les notes..."
+
+#: ../src/gui/general/EditView.cpp:1445
+#, fuzzy
+msgid "Doubling durations..."
+msgstr "S'està definint la durada de les notes..."
+
+#: ../src/gui/general/EditView.cpp:1469
+msgid "Rescaling..."
+msgstr "S'està canviant la mida..."
+
+#: ../src/gui/general/EditView.cpp:1489
+#, fuzzy
+msgid "By number of semitones: "
+msgstr "Introdueix el número de semitons a transposar:"
+
+#: ../src/gui/general/EditView.cpp:1496 ../src/gui/general/EditView.cpp:1518
+msgid "Transposing..."
+msgstr "S'està transposant..."
+
+#: ../src/gui/general/EditView.cpp:1536
+msgid "Transposing up one semitone..."
+msgstr "S'està transposant un semitò cap amunt..."
+
+#: ../src/gui/general/EditView.cpp:1545
+msgid "Transposing up one octave..."
+msgstr "S'està transposant una octava cap amunt..."
+
+#: ../src/gui/general/EditView.cpp:1554
+msgid "Transposing down one semitone..."
+msgstr "S'està transposant un semitò cap avall..."
+
+#: ../src/gui/general/EditView.cpp:1563
+msgid "Transposing down one octave..."
+msgstr "S'està transposant una octava cap avall..."
+
+#: ../src/gui/general/EditView.cpp:1575
+#, fuzzy
+msgid "Inverting..."
+msgstr "S'està iniciant..."
+
+#: ../src/gui/general/EditView.cpp:1587
+#, fuzzy
+msgid "Retrograding..."
+msgstr "S'està enregistrant..."
+
+#: ../src/gui/general/EditView.cpp:1599
+#, fuzzy
+msgid "Retrograde inverting..."
+msgstr "S'està enregistrant..."
+
+#: ../src/gui/general/EditView.cpp:1608
+msgid "Jogging left..."
+msgstr "Mou a l'esquerra..."
+
+#: ../src/gui/general/EditView.cpp:1623
+msgid "Jogging right..."
+msgstr "Mou a la dreta..."
+
+#: ../src/sound/AudioFileManager.cpp:660
+#, fuzzy, c-format
+msgid "Downloading file %1"
+msgstr "No s'ha pogut descarregar el fitxer %1"
+
+#: ../src/sound/AudioFileManager.cpp:735
+#, fuzzy
+msgid "Converting audio file..."
+msgstr "S'està exportant el fitxer d'àudio..."
+
+#: ../src/sound/AudioFileManager.cpp:737
+#, fuzzy
+msgid "Resampling audio file..."
+msgstr "S'està exportant el fitxer d'àudio..."
+
+#: ../src/sound/AudioFileManager.cpp:739
+#, fuzzy
+msgid "Converting and resampling audio file..."
+msgstr "S'està exportant el fitxer d'àudio..."
+
+#: ../src/sound/AudioFileManager.cpp:741
+#, fuzzy
+msgid "Importing audio file..."
+msgstr "S'està exportant el fitxer d'àudio..."
+
+#: ../src/sound/AudioFileManager.cpp:794
+#, fuzzy
+msgid "Failed to convert or resample audio file on import"
+msgstr "No s'ha pogut obrir un fitxer temportal per exportar com a Lilypond."
+
+#: ../src/sequencer/main.cpp:46 ../src/sequencer/main.cpp:86
+#, fuzzy
+msgid "RosegardenSequencer"
+msgstr "Rosegarden"
+
+#: ../src/sequencer/main.cpp:54
+#, fuzzy
+msgid "JACK playback and capture ports"
+msgstr "Latència de reproducció del JACK (en ms)"
+
+#: ../src/commands/segment/SegmentSyncCommand.cpp:38
+#: ../src/commands/segment/SegmentSyncCommand.cpp:44
+#: ../src/commands/segment/SegmentSyncCommand.cpp:55
+#: ../src/commands/segment/SegmentSyncCommand.cpp:63
+#, fuzzy
+msgid "Sync segment parameters"
+msgstr "Paràmetres de l'instrument"
+
+#: ../src/commands/segment/RenameTrackCommand.h:52
+msgid "Rename Track"
+msgstr "Canvia el nom de la pista"
+
+#: ../src/commands/segment/SegmentRepeatToCopyCommand.cpp:39
+msgid "Turn Repeats into Copies"
+msgstr "Converteix les repeticions en còpies"
+
+#: ../src/commands/segment/SegmentTransposeCommand.cpp:36
+#: ../src/commands/segment/SegmentTransposeCommand.cpp:42
+#, fuzzy
+msgid "Change segment transposition"
+msgstr "Canvia el color del fragment"
+
+#: ../src/commands/edit/RescaleCommand.h:50
+#: ../src/commands/segment/AudioSegmentRescaleCommand.h:62
+#: ../src/commands/segment/SegmentRescaleCommand.h:58
+msgid "Stretch or S&quash..."
+msgstr "Estira o encon&geix..."
+
+#: ../src/commands/segment/SegmentLabelCommand.h:52
+msgid "Re&label..."
+msgstr "Canvia &l'etiqueta..."
+
+#: ../src/commands/segment/AudioSegmentResizeFromStartCommand.cpp:39
+#: ../src/commands/segment/SegmentResizeFromStartCommand.cpp:39
+msgid "Resize Segment"
+msgstr "Redimensiona el fragment"
+
+#: ../src/commands/segment/RemoveTempoChangeCommand.h:58
+msgid "Remove &Tempo Change..."
+msgstr "Elimina el canvi de &tempo..."
+
+#: ../src/commands/segment/SegmentEraseCommand.cpp:40
+#: ../src/commands/segment/SegmentEraseCommand.cpp:52
+msgid "Erase Segment"
+msgstr "Esborra el fragment"
+
+#: ../src/commands/segment/AudioSegmentRescaleCommand.cpp:126
+#: ../src/commands/segment/SegmentRescaleCommand.cpp:102
+#, fuzzy
+msgid "(rescaled)"
+msgstr "%1 (escalat)"
+
+#: ../src/commands/segment/AudioSegmentRescaleCommand.cpp:127
+#: ../src/commands/segment/SegmentRescaleCommand.cpp:105
+msgid "%1 (rescaled)"
+msgstr "%1 (escalat)"
+
+#: ../src/commands/segment/PasteToTriggerSegmentCommand.cpp:47
+#, fuzzy
+msgid "Paste as New Triggered Segment"
+msgstr "Enganxa com un nou fragment activable"
+
+#: ../src/commands/segment/SegmentColourMapCommand.h:52
+msgid "Change Segment Color Map..."
+msgstr "Canvia el mapa de colors del fragment..."
+
+#: ../src/commands/segment/SegmentQuickCopyCommand.h:55
+msgid "Quick-Copy Segment"
+msgstr "Copia ràpidament el fragment"
+
+#: ../src/commands/segment/AudioSegmentSplitCommand.cpp:42
+msgid "Split Audio Segment"
+msgstr "Divideix el fragment d'àudio"
+
+#: ../src/commands/segment/AudioSegmentSplitCommand.cpp:103
+#: ../src/commands/segment/SegmentSplitCommand.cpp:135
+#, fuzzy
+msgid " (split)"
+msgstr "%1 (dividit)"
+
+#: ../src/commands/segment/AudioSegmentSplitCommand.cpp:104
+#: ../src/commands/segment/SegmentSplitByRecordingSrcCommand.cpp:120
+#: ../src/commands/segment/SegmentSplitByRecordingSrcCommand.cpp:122
+#: ../src/commands/segment/SegmentSplitCommand.cpp:136
+msgid "%1 (split)"
+msgstr "%1 (dividit)"
+
+#: ../src/commands/segment/SegmentLabelCommand.cpp:40
+msgid "Label Segments"
+msgstr "Fragments activables"
+
+#: ../src/commands/segment/OpenOrCloseRangeCommand.cpp:43
+msgid "Open or Close Range"
+msgstr ""
+
+#: ../src/commands/edit/TransposeCommand.h:55
+#: ../src/commands/segment/SegmentTransposeCommand.h:54
+#, fuzzy
+msgid "Transpose by &Interval..."
+msgstr "&Transposa..."
+
+#: ../src/commands/segment/SegmentAutoSplitCommand.cpp:148
+msgid "%1 (part)"
+msgstr "%1 (partició)"
+
+#: ../src/commands/segment/AudioSegmentInsertCommand.cpp:51
+#: ../src/commands/segment/SegmentInsertCommand.cpp:43
+#: ../src/commands/segment/SegmentInsertCommand.cpp:56
+msgid "Create Segment"
+msgstr "Crea un fragment"
+
+#: ../src/commands/segment/AudioSegmentInsertCommand.cpp:114
+msgid "%1 (inserted)"
+msgstr "%1 (inserit)"
+
+#: ../src/commands/segment/AudioSegmentInsertCommand.cpp:117
+msgid "unknown audio file"
+msgstr "Fitxer d'àudio desconegut"
+
+#: ../src/commands/segment/CreateTempoMapFromSegmentCommand.cpp:40
+msgid "Set Tempos from Beat Segment"
+msgstr "Extreu el Tempo del fragment de pulsacions"
+
+#: ../src/commands/segment/SegmentSplitByRecordingSrcCommand.h:52
+msgid "Split by &Recording Source..."
+msgstr "Divideix segons l'&origen..."
+
+#: ../src/commands/segment/SegmentColourMapCommand.cpp:40
+msgid "Change Segment Color Map"
+msgstr "Canvia el mapa de colors del fragment"
+
+#: ../src/commands/edit/CopyCommand.cpp:64
+#: ../src/commands/segment/SegmentQuickCopyCommand.cpp:57
+msgid "%1 (copied)"
+msgstr "%1 (copiat)"
+
+#: ../src/commands/segment/SegmentColourCommand.h:52
+msgid "Change Segment Color..."
+msgstr "Canvia el color del fragment..."
+
+#: ../src/commands/segment/SegmentSplitByPitchCommand.cpp:170
+msgid "%1 (upper)"
+msgstr "%1 (augmentat)"
+
+#: ../src/commands/segment/SegmentSplitByPitchCommand.cpp:172
+msgid "%1 (lower)"
+msgstr "%1 (disminuït)"
+
+#: ../src/commands/segment/SegmentSingleRepeatToCopyCommand.cpp:39
+msgid "Turn Single Repeat into Copy"
+msgstr "Converteix les repeticions d'un sol cop en còpies"
+
+#: ../src/commands/segment/AddTempoChangeCommand.h:58
+msgid "Add Te&mpo Change..."
+msgstr "Afegeix un ca&nvi de tempo..."
+
+#: ../src/commands/segment/AudioSegmentAutoSplitCommand.h:57
+#: ../src/commands/segment/SegmentAutoSplitCommand.h:53
+msgid "&Split on Silence"
+msgstr "Divideix el &silenci"
+
+#: ../src/commands/segment/SetTriggerSegmentBaseVelocityCommand.cpp:39
+msgid "Set Base Velocity"
+msgstr "Velocitat de base"
+
+#: ../src/commands/segment/DeleteRangeCommand.cpp:43
+#: ../src/commands/segment/EraseSegmentsStartingInRangeCommand.cpp:39
+#, fuzzy
+msgid "Delete Range"
+msgstr "Suprimeix un marcador"
+
+#: ../src/commands/segment/ChangeCompositionLengthCommand.h:53
+msgid "Change &Composition Start and End..."
+msgstr "&Canvia l'inici i el final de la composició..."
+
+#: ../src/commands/segment/MoveTracksCommand.h:51
+msgid "Move Tracks..."
+msgstr "Mou les pistes..."
+
+#: ../src/commands/segment/SegmentColourCommand.cpp:39
+msgid "Change Segment Color"
+msgstr "Canvia el color del fragment"
+
+#: ../src/commands/segment/AudioSegmentDistributeCommand.h:66
+msgid "Distribute Audio Segments over MIDI"
+msgstr "Envia els fragments d'àudio al dispositiu MIDI"
+
+#: ../src/commands/segment/AudioSegmentAutoSplitCommand.cpp:147
+msgid "%1 (autosplit %2)"
+msgstr "%1 (dividit automàtic %2)"
+
+#: ../src/commands/segment/SetTriggerSegmentDefaultRetuneCommand.cpp:39
+#, fuzzy
+msgid "Set Default Retune"
+msgstr "Defineix un to per defecte"
+
+#: ../src/commands/segment/AddTimeSignatureCommand.h:52
+msgid "Add Time Si&gnature Change..."
+msgstr "&Canvia d'indicació de compàs..."
+
+#: ../src/commands/segment/AddTriggerSegmentCommand.cpp:42
+#, fuzzy
+msgid "Add Triggered Segment"
+msgstr "Afegeix un fragment activable"
+
+#: ../src/commands/segment/SetTriggerSegmentDefaultTimeAdjustCommand.cpp:39
+msgid "Set Default Time Adjust"
+msgstr "Ajust de temps per defecte"
+
+#: ../src/commands/segment/RemoveTimeSignatureCommand.h:58
+msgid "Remove &Time Signature Change..."
+msgstr "&Elimina el canvi d'indicació de compàs..."
+
+#: ../src/commands/segment/SegmentCommandRepeat.cpp:39
+msgid "Repeat Segments"
+msgstr "Repeteix el fragment"
+
+#: ../src/commands/segment/AddTracksCommand.h:55
+msgid "Add Tracks..."
+msgstr "Afegeix pistes..."
+
+#: ../src/commands/segment/ModifyDefaultTempoCommand.h:51
+msgid "Modify &Default Tempo..."
+msgstr "Modifica el tempo per &defecte..."
+
+#: ../src/commands/segment/SegmentSplitByPitchCommand.h:61
+msgid "Split by &Pitch..."
+msgstr "Divideix se&gons to..."
+
+#: ../src/commands/segment/DeleteTriggerSegmentCommand.cpp:40
+#, fuzzy
+msgid "Delete Triggered Segment"
+msgstr "Suprimeix el fragment activable"
+
+#: ../src/commands/segment/SegmentSplitCommand.cpp:42
+msgid "Split Segment"
+msgstr "Divideix el fragment"
+
+#: ../src/commands/segment/DeleteTracksCommand.h:51
+msgid "Delete Tracks..."
+msgstr "Esborra les pistes..."
+
+#: ../src/commands/segment/InsertRangeCommand.cpp:42
+#, fuzzy
+msgid "Insert Range"
+msgstr "Afegeix un silenci"
+
+#: ../src/commands/segment/DeleteRangeCommand.h:62
+msgid "Rejoin Command"
+msgstr ""
+
+#: ../src/commands/segment/SetTriggerSegmentBasePitchCommand.cpp:39
+msgid "Set Base Pitch"
+msgstr "Altura de base"
+
+#: ../src/commands/segment/PasteConductorDataCommand.cpp:41
+#, fuzzy
+msgid "Paste Tempos and Time Signatures"
+msgstr "&Tempo i indicació de compàs"
+
+#: ../src/commands/segment/SegmentSyncClefCommand.cpp:34
+#, fuzzy
+msgid "Sync segment clef"
+msgstr "Etiqueta del fragment"
+
+#: ../src/commands/matrix/MatrixInsertionCommand.cpp:46
+#: ../src/commands/notation/NoteInsertionCommand.cpp:54
+msgid "Insert Note"
+msgstr "Afegeix una nota"
+
+#: ../src/commands/matrix/MatrixEraseCommand.cpp:41
+msgid "Erase Note"
+msgstr "Esborra la nota"
+
+#: ../src/commands/matrix/MatrixPercussionInsertionCommand.cpp:47
+msgid "Insert Percussion Note"
+msgstr "Afegeix una nota de percusió"
+
+#: ../src/commands/matrix/MatrixModifyCommand.cpp:43
+msgid "Move Note"
+msgstr "Mou la nota"
+
+#: ../src/commands/matrix/MatrixModifyCommand.cpp:43
+msgid "Modify Note"
+msgstr "Modifica la nota"
+
+#: ../src/commands/edit/PasteEventsCommand.cpp:98
+msgid "Paste into an existing gap [\"restricted\"]"
+msgstr "Enganxa a una ranura existent [\"restringit\"]"
+
+#: ../src/commands/edit/PasteEventsCommand.cpp:100
+msgid "Erase existing events to make room [\"simple\"]"
+msgstr ""
+"Esborra els esdeveniments existents, per tenir espai lliure [\"simple\"]"
+
+#: ../src/commands/edit/PasteEventsCommand.cpp:102
+msgid "Move existing events out of the way [\"open-n-paste\"]"
+msgstr "Mou els esdeveniments existents fora del seu lloc [\"obre-i-enganxa\"]"
+
+#: ../src/commands/edit/PasteEventsCommand.cpp:104
+msgid "Overlay notes, tying against present notes [\"note-overlay\"]"
+msgstr ""
+"Sobreposa les notes, enllaçant-les amb les que ja existeixen [\"sobreposa\"]"
+
+#: ../src/commands/edit/PasteEventsCommand.cpp:106
+msgid "Overlay notes, ignoring present notes [\"matrix-overlay\"]"
+msgstr ""
+"Sobreposa les notes, ignorant les que ja existeixen [\"sobreposa en matriu\"]"
+
+#: ../src/commands/edit/AddDotCommand.h:52
+msgid "&Add Dot"
+msgstr "&Afegeix el punt"
+
+#: ../src/commands/edit/RemoveMarkerCommand.h:55
+msgid "&Remove Marker"
+msgstr "&Suprimeix el marcador"
+
+#: ../src/commands/edit/EventUnquantizeCommand.cpp:43
+#: ../src/commands/edit/EventUnquantizeCommand.cpp:54
+msgid "Unquantize Events"
+msgstr "Desquantifica els esdeveniments"
+
+#: ../src/commands/edit/ChangeVelocityCommand.h:53
+msgid "&Increase Velocity"
+msgstr "&Incrementa la velocitat"
+
+#: ../src/commands/edit/ChangeVelocityCommand.h:54
+msgid "&Reduce Velocity"
+msgstr "&Redueix la velocitat"
+
+#: ../src/commands/edit/CopyCommand.cpp:46
+msgid "(excerpt)"
+msgstr "(extracte)"
+
+#: ../src/commands/edit/CopyCommand.cpp:60
+msgid "(copied)"
+msgstr "(copiat)"
+
+#: ../src/commands/edit/EventInsertionCommand.cpp:39
+msgid "Insert Event"
+msgstr "Afegeix l'esdeveniment"
+
+#: ../src/commands/edit/InsertTriggerNoteCommand.cpp:55
+msgid "Insert Trigger Note"
+msgstr "Afegeix una nota activadora"
+
+#: ../src/commands/edit/CollapseNotesCommand.h:50
+msgid "Collapse &Equal-Pitch Notes"
+msgstr "Redueix les notes d&e la mateixa altura"
+
+#: ../src/commands/edit/TransposeCommand.h:61
+msgid "&Up a Semitone"
+msgstr "Ap&uja un semitò"
+
+#: ../src/commands/edit/TransposeCommand.h:62
+msgid "&Down a Semitone"
+msgstr "A&baixa un semitò"
+
+#: ../src/commands/edit/TransposeCommand.h:63
+msgid "Up an &Octave"
+msgstr "Apuja una &octava"
+
+#: ../src/commands/edit/TransposeCommand.h:64
+msgid "Down an Octa&ve"
+msgstr "Abaixa una octa&va"
+
+#: ../src/commands/edit/TransposeCommand.h:65
+#, fuzzy
+msgid "&Transpose by Semitones..."
+msgstr "S'està transposant un semitò cap amunt..."
+
+#: ../src/commands/edit/SetNoteTypeCommand.h:56
+msgid "&Set Note Type"
+msgstr "E&stableix el tipus de nota"
+
+#: ../src/commands/edit/EventEditCommand.h:55
+msgid "Edit E&vent"
+msgstr "Edita l'esde&veniment"
+
+#: ../src/commands/edit/AddMarkerCommand.h:54
+msgid "&Add Marker"
+msgstr "&Afegeix el marcador"
+
+#: ../src/commands/edit/SelectionPropertyCommand.h:66
+msgid "Set &Property"
+msgstr "Defineix la &propietat"
+
+#: ../src/commands/edit/CutCommand.h:55
+msgid "Cu&t"
+msgstr "Re&talla"
+
+#: ../src/commands/edit/EventQuantizeCommand.cpp:114
+msgid "Heuristic Notation &Quantize"
+msgstr "&Quantificació heurística"
+
+#: ../src/commands/edit/EventQuantizeCommand.cpp:116
+msgid "Grid &Quantize"
+msgstr "Graella de &Quantificació"
+
+#: ../src/commands/edit/ClearTriggersCommand.h:52
+msgid "&Clear Triggers"
+msgstr "&Neteja els activadors"
+
+#: ../src/commands/edit/RetrogradeCommand.h:51
+#, fuzzy
+msgid "&Retrograde"
+msgstr "En&registra"
+
+#: ../src/commands/edit/InvertCommand.h:51
+#, fuzzy
+msgid "&Invert"
+msgstr "&Afegeix una nota"
+
+#: ../src/commands/edit/SetTriggerCommand.h:64
+msgid "Tri&gger Segment"
+msgstr "Acti&va el fragment activable"
+
+#: ../src/commands/edit/SetLyricsCommand.h:50
+msgid "Edit L&yrics"
+msgstr "Edita la &lírica"
+
+#: ../src/commands/edit/MoveAcrossSegmentsCommand.cpp:73
+msgid "&Move Events to Other Segment"
+msgstr "&Mou els esdeveniments a un altre fragment"
+
+#: ../src/commands/edit/RetrogradeInvertCommand.h:51
+msgid "Re&trograde Invert"
+msgstr ""
+
+#: ../src/commands/edit/ModifyMarkerCommand.h:55
+msgid "&Modify Marker"
+msgstr "&Modifica el marcador"
+
+#: ../src/commands/studio/AddControlParameterCommand.h:61
+msgid "&Add Control Parameter"
+msgstr "&Afegeix un paràmetre de control"
+
+#: ../src/commands/studio/ModifyInstrumentMappingCommand.h:55
+msgid "Modify &Instrument Mapping"
+msgstr "Modifica el mapa d'&instruments"
+
+#: ../src/commands/studio/RemoveControlParameterCommand.h:60
+msgid "&Remove Control Parameter"
+msgstr "&Suprimeix un paràmetre de control"
+
+#: ../src/commands/studio/ReconnectDeviceCommand.h:55
+msgid "Reconnect Device"
+msgstr "Torna a connectar el dispositiu"
+
+#: ../src/commands/studio/ModifyDeviceCommand.h:68
+msgid "Modify &MIDI Bank"
+msgstr "Modifica el banc &MIDI"
+
+#: ../src/commands/studio/CreateOrDeleteDeviceCommand.h:68
+msgid "Create Device"
+msgstr "Crea un dispositiu"
+
+#: ../src/commands/studio/ModifyDeviceMappingCommand.h:55
+msgid "Modify &Device Mapping"
+msgstr "Modifica el mapa de &dispositius"
+
+#: ../src/commands/studio/RenameDeviceCommand.h:55
+msgid "Rename Device"
+msgstr "Canvia el nom del dispositiu"
+
+#: ../src/commands/studio/ModifyControlParameterCommand.h:61
+msgid "&Modify Control Parameter"
+msgstr "&Modifica el paràmetre de control"
+
+#: ../src/commands/notation/TieNotesCommand.h:49
+msgid "&Tie"
+msgstr "Ll&igats"
+
+#: ../src/commands/notation/ClefInsertionCommand.cpp:74
+msgid "Add Cle&f Change..."
+msgstr "Afegeix el ca&nvi de clau..."
+
+#: ../src/commands/notation/GuitarChordInsertionCommand.cpp:40
+#, fuzzy
+msgid "Insert Guitar Chord"
+msgstr "editor d'acords de guitarra"
+
+#: ../src/commands/notation/RespellCommand.cpp:47
+#, c-format
+msgid "Respell with %1"
+msgstr "Força les alteracions amb %1"
+
+#: ../src/commands/notation/RespellCommand.cpp:50
+msgid "Do&uble Sharp"
+msgstr "Doble die&si"
+
+#: ../src/commands/notation/RespellCommand.cpp:52
+msgid "&Sharp"
+msgstr "&Diesi"
+
+#: ../src/commands/notation/RespellCommand.cpp:54
+msgid "&Flat"
+msgstr "&Bemoll"
+
+#: ../src/commands/notation/RespellCommand.cpp:56
+msgid "Dou&ble Flat"
+msgstr "Do&ble bemoll"
+
+#: ../src/commands/notation/RespellCommand.cpp:58
+msgid "&Natural"
+msgstr "B&ecaire"
+
+#: ../src/commands/notation/RespellCommand.cpp:60
+msgid "N&one"
+msgstr "Ca&p"
+
+#: ../src/commands/notation/RespellCommand.cpp:66
+msgid "Respell Accidentals &Upward"
+msgstr "Força els accidents &cap amunt"
+
+#: ../src/commands/notation/RespellCommand.cpp:69
+msgid "Respell Accidentals &Downward"
+msgstr "Força els accidents cap a&vall"
+
+#: ../src/commands/notation/RespellCommand.cpp:72
+#, fuzzy
+msgid "&Restore Accidentals"
+msgstr "Reescriu els accidents"
+
+#: ../src/commands/notation/RespellCommand.cpp:75
+msgid "Respell Accidentals"
+msgstr "Reescriu els accidents"
+
+#: ../src/commands/notation/DeCounterpointCommand.h:55
+msgid "Split-and-Tie Overlapping &Chords"
+msgstr "Divideix-i-lliga els a&cords encavalcats"
+
+#: ../src/commands/notation/BeamCommand.h:49
+msgid "&Beam Group"
+msgstr "&Barra d'agrupació"
+
+#: ../src/commands/notation/AddTextMarkCommand.h:51
+msgid "Add Te&xt Mark..."
+msgstr "Afegeix la marca de te&xt..."
+
+#: ../src/commands/notation/RestoreSlursCommand.h:49
+#, fuzzy
+msgid "&Restore Slur Positions"
+msgstr "&Restaura la direcció calculada dels lligats"
+
+#: ../src/commands/notation/SustainInsertionCommand.h:56
+msgid "Add Pedal &Press"
+msgstr "Afegeix el pedal &premut"
+
+#: ../src/commands/notation/SustainInsertionCommand.h:58
+msgid "Add Pedal &Release"
+msgstr "Afegeix el pedal lliu&re"
+
+#: ../src/commands/notation/FixNotationQuantizeCommand.h:49
+msgid "Fi&x Notation Quantization"
+msgstr "Fi&xa la quantificació de la partitura"
+
+#: ../src/commands/notation/ChangeStemsCommand.h:51
+msgid "Stems &Up"
+msgstr "Vírgules cap &amunt"
+
+#: ../src/commands/notation/ChangeStemsCommand.h:51
+msgid "Stems &Down"
+msgstr "Vírgules cap a&vall"
+
+#: ../src/commands/notation/MakeAccidentalsCautionaryCommand.cpp:43
+#, fuzzy
+msgid "Use &Cautionary Accidentals"
+msgstr "Fes servir els accidents de pre&caució"
+
+#: ../src/commands/notation/MakeAccidentalsCautionaryCommand.cpp:45
+#, fuzzy
+msgid "Cancel C&autionary Accidentals"
+msgstr "Cancel·la els &accidents de precaució"
+
+#: ../src/commands/notation/SetVisibilityCommand.h:50
+msgid "Set Visibility"
+msgstr "Estableix la visibilitat"
+
+#: ../src/commands/notation/ChangeStyleCommand.h:53
+msgid "Change &Note Style"
+msgstr "Canvia l'estil de la &nota"
+
+#: ../src/commands/notation/TextInsertionCommand.cpp:41
+msgid "Insert Text"
+msgstr "Afegeix el text"
+
+#: ../src/commands/notation/InterpretCommand.h:70
+msgid "&Interpret..."
+msgstr "&Interpreta..."
+
+#: ../src/commands/notation/TupletCommand.h:53
+msgid "&Triplet"
+msgstr "&Treset"
+
+#: ../src/commands/notation/TupletCommand.h:54
+msgid "Tu&plet..."
+msgstr "Grup &irregular..."
+
+#: ../src/commands/notation/UnTupletCommand.h:50
+msgid "&Untuplet"
+msgstr "&Divideix els grups irregulars..."
+
+#: ../src/commands/notation/CollapseRestsCommand.h:54
+msgid "&Collapse Rests"
+msgstr "&Redueix els silencis"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:145
+msgid "Add S&lur"
+msgstr "Afegeix el &lligat"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:147
+msgid "Add &Phrasing Slur"
+msgstr "Afegeix el lligat de &fraseig"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:149
+msgid "Add Double-Octave Up"
+msgstr "Afegeix una doble-octava superior"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:151
+msgid "Add Octave &Up"
+msgstr "Afegeix una octava s&uperior"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:153
+msgid "Add Octave &Down"
+msgstr "Afegeix una octava &inferior"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:155
+msgid "Add Double Octave Down"
+msgstr "Afegeix una doble-octava inferior"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:160
+msgid "Add &Crescendo"
+msgstr "Afegeix un &crescendo"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:162
+msgid "Add &Decrescendo"
+msgstr "Afegeix un &decrescendo..."
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:164
+msgid "Add &Glissando"
+msgstr "Afegeix el &glissando"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:167
+msgid "Add &%1%2"
+msgstr "Afegeix &%1%2"
+
+#: ../src/commands/notation/RemoveNotationQuantizeCommand.h:49
+msgid "Remo&ve Notation Quantization"
+msgstr "Suprimeix la &quantificació de la partitura"
+
+#: ../src/commands/notation/MakeChordCommand.h:50
+msgid "Make &Chord"
+msgstr "Crea l'a&cord"
+
+#: ../src/commands/notation/MultiKeyInsertionCommand.h:63
+msgid "Change all to &Key %1..."
+msgstr "Canvia-ho tot al &to %1..."
+
+#: ../src/commands/notation/KeyInsertionCommand.h:67
+#: ../src/commands/notation/MultiKeyInsertionCommand.h:65
+msgid "Add &Key Change..."
+msgstr "Afegeix el canvi de &to..."
+
+#: ../src/commands/notation/RestoreStemsCommand.h:49
+#, fuzzy
+msgid "&Restore Stems"
+msgstr "&Restaura la direcció calculada de les vírgules"
+
+#: ../src/commands/notation/MakeNotesViableCommand.h:55
+#: ../src/commands/notation/MakeRegionViableCommand.h:52
+msgid "Tie Notes at &Barlines"
+msgstr "Lliga les notes a les &barres de compàs"
+
+#: ../src/commands/notation/AddSlashesCommand.h:46
+msgid "Slashes"
+msgstr "Barres inverses"
+
+#: ../src/commands/notation/ChangeSlurPositionCommand.h:51
+msgid "Slur &Above"
+msgstr "Lligat &amunt"
+
+#: ../src/commands/notation/ChangeSlurPositionCommand.h:51
+msgid "Slur &Below"
+msgstr "Lligat a&vall"
+
+#: ../src/commands/notation/NormalizeRestsCommand.h:54
+msgid "&Normalize Rests"
+msgstr "&Normalitza els silencis"
+
+#: ../src/commands/notation/TextChangeCommand.cpp:41
+msgid "Edit Text"
+msgstr "Edita el text"
+
+#: ../src/commands/notation/RemoveMarksCommand.h:49
+msgid "&Remove All Marks"
+msgstr "&Suprimeix totes les marques"
+
+#: ../src/commands/notation/AutoBeamCommand.h:52
+msgid "&Auto-Beam"
+msgstr "Barres d'agrupació &automàtiques"
+
+#: ../src/commands/notation/UntieNotesCommand.h:49
+msgid "&Untie"
+msgstr "&Deslliga les notes"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:48
+msgid "S&forzando"
+msgstr "S&forzando"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:50
+msgid "Sta&ccato"
+msgstr "Sta&ccato"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:52
+msgid "R&inforzando"
+msgstr "R&inforzando"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:54
+msgid "T&enuto"
+msgstr "T&enuto"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:56
+msgid "Tri&ll"
+msgstr "Tri&nat"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:58
+msgid "Trill &with Line"
+msgstr "Trinat &amb línia"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:60
+msgid "Trill Line"
+msgstr "Línia de trinat"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:62
+msgid "&Turn"
+msgstr "&Gira"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:64
+msgid "&Accent"
+msgstr "&Accent"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:66
+msgid "&Staccatissimo"
+msgstr "&Staccatissimo"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:68
+msgid "&Marcato"
+msgstr "&Marcato"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:70
+msgid "&Pause"
+msgstr "&Calderó"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:72
+msgid "&Up-Bow"
+msgstr "P&unta"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:74
+msgid "&Down-Bow"
+msgstr "&Taló"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:76
+msgid "Mo&rdent"
+msgstr "Mo&rdent"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:78
+msgid "Inverted Mordent"
+msgstr "Mordent invertit"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:80
+msgid "Long Mordent"
+msgstr "Mordent llarg"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:82
+msgid "Lon&g Inverted Mordent"
+msgstr "Mordent llar&g invertit"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:84
+msgid "&%1%2"
+msgstr "&%1%2"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:89
+#, c-format
+msgid "Add %1"
+msgstr "Afegeix %1"
+
+#: ../src/commands/notation/ResetDisplacementsCommand.h:49
+#, fuzzy
+msgid "Restore Positions"
+msgstr "Restaura les posicions calculades"
+
+#: ../src/commands/notation/IncrementDisplacementsCommand.h:52
+msgid "Fine Reposition"
+msgstr "Reubicació precisa"
+
+#: ../src/commands/notation/RestoreTiesCommand.h:49
+#, fuzzy
+msgid "&Restore Tie Positions"
+msgstr "Restaura les posicions calculades"
+
+#: ../src/commands/notation/ChangeTiePositionCommand.h:47
+#, fuzzy
+msgid "Tie &Above"
+msgstr "Lligat &amunt"
+
+#: ../src/commands/notation/ChangeTiePositionCommand.h:47
+#, fuzzy
+msgid "Tie &Below"
+msgstr "Lligat a&vall"
+
+#: ../src/commands/notation/KeyInsertionCommand.h:65
+msgid "Change to &Key %1..."
+msgstr "Canvia al &to %1..."
+
+#: ../src/commands/notation/RemoveFingeringMarksCommand.h:49
+msgid "&Remove Fingerings"
+msgstr "Suprimeix les&digitacions"
+
+#: ../src/commands/notation/BreakCommand.h:49
+msgid "&Unbeam"
+msgstr "Tre&u les barres d'agrupació"
+
+#: ../src/commands/notation/UnGraceCommand.h:48
+msgid "Ung&race"
+msgstr "&Suprimeix les notes d'ornament"
+
+#: ../src/commands/notation/AddFingeringMarkCommand.cpp:45
+msgid "Add Other &Fingering..."
+msgstr "Afegeix una altra &digitació..."
+
+#: ../src/commands/notation/AddFingeringMarkCommand.cpp:47
+msgid "Add Fingering &0 (Thumb)"
+msgstr "Afegeix la digitació &0 (polze)..."
+
+#: ../src/commands/notation/AddFingeringMarkCommand.cpp:49
+#, c-format
+msgid "Add Fingering &%1"
+msgstr "Afegeix la digitació &%1"
+
+#: ../src/document/io/HydrogenXMLHandler.cpp:277
+msgid " imported from Hydrogen "
+msgstr " importat de l'Hydrogen "
+
+#: ../src/document/io/LilyPondExporter.cpp:404
+#, fuzzy
+msgid ""
+"LilyPond does not allow spaces or backslashes in filenames.\n"
+"\n"
+"Would you like to use\n"
+"\n"
+" %1\n"
+"\n"
+" instead?"
+msgstr ""
+"Lilypond no permet espais o barres invertides en els noms de fitxers.\n"
+"\n"
+"Voleu fer servir\n"
+"\n"
+" %1\n"
+"\n"
+"en comptes seu ?"
+
+#: ../src/document/io/LilyPondExporter.cpp:2054
+msgid "warning: overlong bar truncated here"
+msgstr "atenció: compàs massa llarg, truncat aquí"
+
+#: ../src/document/io/LilyPondExporter.cpp:2060
+msgid "warning: bar too short, padding with rests"
+msgstr "atenció: compàs massa curt, completat amb silencis"
+
+#: ../src/document/MultiViewCommandHistory.cpp:318
+msgid "Nothing to undo"
+msgstr "No hi ha res per desfer"
+
+#: ../src/document/MultiViewCommandHistory.cpp:320
+msgid "Nothing to redo"
+msgstr "No hi ha res per refer"
+
+#: ../src/document/MultiViewCommandHistory.cpp:328
+#: ../src/document/MultiViewCommandHistory.cpp:372
+#, c-format
+msgid "Und&o %1"
+msgstr "&Desfer %1"
+
+#: ../src/document/MultiViewCommandHistory.cpp:330
+#: ../src/document/MultiViewCommandHistory.cpp:374
+#, c-format
+msgid "Re&do %1"
+msgstr "Re&fer %1"
+
+#: ../src/document/RosegardenGUIDoc.cpp:328
+msgid ""
+"The current file has been modified.\n"
+"Do you want to save it?"
+msgstr ""
+"El fitxer actual s'ha modificat.\n"
+"Voleu desar-lo?"
+
+#: ../src/document/RosegardenGUIDoc.cpp:480
+#, fuzzy, c-format
+msgid ""
+"_n: Delete the 1 audio file recorded during the unsaved session?\n"
+"Delete the %n audio files recorded during the unsaved session?"
+msgstr ""
+"_n: Voleu esborrar el fitxer d'àudio enregistrat durant la sessió sense "
+"desar?\n"
+"Voleu esborrar els %n fitxers d'àudio enregistrats durant la sessió sense "
+"desar?"
+
+#: ../src/document/RosegardenGUIDoc.cpp:501
+msgid ""
+"The following audio files were recorded during this session but have been "
+"unloaded\n"
+"from the audio file manager, and so are no longer in use in the document you "
+"are saving.\n"
+"\n"
+"You may want to clean up these files to save disk space.\n"
+"\n"
+"Please select any you wish to delete permanently from the hard disk.\n"
+msgstr ""
+"Els següents fitxers d'àudio s'han enregistrat durant aquesta sessió,però no "
+"consten \n"
+"en el gestor de fitxers d'àudio, i per tant no tenen utilitat en el document "
+"que voleu desar.\n"
+"\n"
+"Pot ser voleu suprimir aquests fitxers.\n"
+"\n"
+"Seleccioneu de la llista els fitxers que voleu esborrar del disc dur.\n"
+
+#: ../src/document/RosegardenGUIDoc.cpp:517
+#, fuzzy, c-format
+msgid ""
+"_n: <qt>About to delete 1 audio file permanently from the hard disk."
+"<br>There will be no way to recover this file.<br>Are you sure?</qt>\n"
+"\n"
+"<qt>About to delete %n audio files permanently from the hard disk.<br>There "
+"will be no way to recover these files.<br>Are you sure?</qt>"
+msgstr ""
+"_n: Si esborreu el fitxer d'àudio permanentment del disc dur,\n"
+"no podreu desfer aquesta acció i no es podrà recuperar el fitxer.\n"
+"Voleu continuar?\n"
+"_n: Si esborreu %n fitxers d'àudio permanentment del disc dur,\n"
+"no podreu desfer aquesta acció i no es podran recuperar els fitxers.\n"
+"Voleu continuar?"
+
+#: ../src/document/RosegardenGUIDoc.cpp:580
+msgid "Can't open file '%1'"
+msgstr "No s'ha pogut obrir el fitxer '%1'"
+
+#: ../src/document/RosegardenGUIDoc.cpp:585
+msgid "Reading file..."
+msgstr "S'està llegint el fitxer..."
+
+#: ../src/document/RosegardenGUIDoc.cpp:603
+#, fuzzy
+msgid "Could not open Rosegarden file"
+msgstr "No s'ha pogut obrir el fitxer Rosegarden-4"
+
+#: ../src/document/RosegardenGUIDoc.cpp:641
+msgid "Error when parsing file '%1': \"%2\""
+msgstr "No s'ha pogut processar el fitxer '%1: \"%2\""
+
+#: ../src/document/RosegardenGUIDoc.cpp:689
+msgid "Generating audio previews..."
+msgstr "S'estan generant mostres d'àudio..."
+
+#: ../src/document/RosegardenGUIDoc.cpp:721
+msgid "Merge"
+msgstr "Fusiona"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1605
+msgid "File load cancelled"
+msgstr "S'ha avortat la càrrega del fitxer"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1625
+msgid ""
+"<h3>Audio and plugins not available</h3><p>This composition uses audio files "
+"or plugins, but Rosegarden is currently running without audio because the "
+"JACK audio server was not available on startup.</p><p>Please exit "
+"Rosegarden, start the JACK audio server and re-start Rosegarden if you wish "
+"to load this complete composition.</p><p><b>WARNING:</b> If you re-save this "
+"composition, all audio and plugin data and settings in it will be lost.</p>"
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:1628
+msgid ""
+"<h3>Audio and plugins not available</h3><p>This composition uses audio files "
+"or plugins, but you are running a version of Rosegarden that was compiled "
+"without audio support.</p><p><b>WARNING:</b> If you re-save this composition "
+"from this version of Rosegarden, all audio and plugin data and settings in "
+"it will be lost.</p>"
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:1665
+msgid ""
+"<h3>Incorrect audio sample rate</h3><p>This composition contains audio files "
+"that were recorded or imported with the audio server running at a different "
+"sample rate (%1 Hz) from the current JACK server sample rate (%2 Hz).</"
+"p><p>Rosegarden will play this composition at the correct speed, but any "
+"audio files in it will probably sound awful.</p><p>Please consider re-"
+"starting the JACK server at the correct rate (%3 Hz) and re-loading this "
+"composition before you do any more work with it.</p>"
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:1675
+msgid ""
+"<h3>Inconsistent audio sample rates</h3><p>This composition contains audio "
+"files at more than one sample rate.</p><p>Rosegarden will play them at the "
+"correct speed, but any audio files that were recorded or imported at rates "
+"different from the current JACK server sample rate (%1 Hz) will probably "
+"sound awful.</p><p>Please see the audio file manager dialog for more "
+"details, and consider resampling any files that are at the wrong rate.</p>"
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:1676
+#, fuzzy
+msgid "Inconsistent sample rates"
+msgstr "Propietats no persistents"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1690
+#, fuzzy
+msgid ""
+"<h3>Plugins not found</h3><p>The following audio plugins could not be loaded:"
+"</p><ul>"
+msgstr ""
+"Els connectors següents no s'han pogut carregar:\n"
+"\n"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1698
+#, fuzzy
+msgid "<li>%1 (from %2)</li>"
+msgstr "-- %1 (des de %2)\n"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1712
+msgid ""
+"This file contains one or more old element types that are now deprecated.\n"
+"Support for these elements may disappear in future versions of Rosegarden.\n"
+"We recommend you re-save this file from this version of Rosegarden to ensure "
+"that it can still be re-loaded in future versions."
+msgstr ""
+"Aquest fitxer conté un o més tipus d'elements anticuats i que ara estan "
+"desaconsellats.\n"
+"En properes versions del Rosegarden aquests elements desapareixeran.\n"
+"Es recomana que ho torneu desar amb aquesta versió del Rosegarden per així "
+"estar segurs que funcionarà en properes versions. "
+
+#: ../src/document/RosegardenGUIDoc.cpp:2207
+msgid "Insert Recorded MIDI"
+msgstr "Insereix el MIDI enregistrat"
+
+#: ../src/document/RosegardenGUIDoc.cpp:2560
+msgid "%1 (recorded)"
+msgstr "%1 (enregistrat)"
+
+#: ../src/document/RoseXmlHandler.cpp:442
+msgid ""
+"This file was written by Rosegarden %1, and it uses\n"
+"a different file format that cannot be read by this version."
+msgstr ""
+"Aquest fitxer s'ha escrit amb el Rosegarden %1, i fa servir \n"
+"un format diferent que no es pot llegir amb aquesta versió."
+
+#: ../src/document/RoseXmlHandler.cpp:452
+msgid ""
+"This file was written by Rosegarden %1, which is more recent than this "
+"version.\n"
+"There may be some incompatibilities with the file format."
+msgstr ""
+"Aquest fitxer s'ha escrit amb el Rosegarden %1, que és una versió més nova "
+"que aquesta.\n"
+"Poden haver-hi algunes incompatibilitats amb el format del fitxer."
+
+#: ../src/document/RoseXmlHandler.cpp:1687
+msgid "Loading plugins..."
+msgstr "S'estan carregant els connectors..."
+
+#: rc.cpp:6 rc.cpp:144
+#, no-c-format
+msgid "Se&gment"
+msgstr "Fra&gment"
+
+#: rc.cpp:9 rc.cpp:84 rc.cpp:147 rc.cpp:303
+#, no-c-format
+msgid "Edit &With"
+msgstr "Edita &amb"
+
+#: rc.cpp:12 rc.cpp:21 rc.cpp:30 rc.cpp:39 rc.cpp:345
+#, no-c-format
+msgid "Actions Toolbar"
+msgstr "Barra d'accions"
+
+#: rc.cpp:15 rc.cpp:33 rc.cpp:129 rc.cpp:285
+#, no-c-format
+msgid "Time Toolbar"
+msgstr "Barra del temps"
+
+#: rc.cpp:18 rc.cpp:36 rc.cpp:57 rc.cpp:63 rc.cpp:120 rc.cpp:243 rc.cpp:342
+#, no-c-format
+msgid "Transport Toolbar"
+msgstr "Barra de transport"
+
+#: rc.cpp:24 rc.cpp:42 rc.cpp:123 rc.cpp:348
+#, fuzzy, no-c-format
+msgid "Zoom Toolbar"
+msgstr "Barra de zoom"
+
+#: rc.cpp:45 rc.cpp:60 rc.cpp:99 rc.cpp:228 rc.cpp:327
+#, no-c-format
+msgid "T&ransport"
+msgstr "T&ransport"
+
+#: rc.cpp:51
+#, no-c-format
+msgid "Number of Stereo &Inputs"
+msgstr "Nombre d'&entrades d'estéreo"
+
+#: rc.cpp:54
+#, no-c-format
+msgid "&Number of Submasters"
+msgstr "&Nombre de submasters"
+
+#: rc.cpp:66
+#, no-c-format
+msgid "&Import"
+msgstr "&Importa"
+
+#: rc.cpp:69
+#, no-c-format
+msgid "&Merge"
+msgstr "&Fusiona"
+
+#: rc.cpp:72
+#, no-c-format
+msgid "&Export"
+msgstr "&Exporta"
+
+#: rc.cpp:75 rc.cpp:141 rc.cpp:297
+#, no-c-format
+msgid "&Composition"
+msgstr "&Composició"
+
+#: rc.cpp:78
+#, no-c-format
+msgid "&Studio"
+msgstr "E&studi"
+
+#: rc.cpp:81
+#, no-c-format
+msgid "Se&gments"
+msgstr "Fra&gments"
+
+#: rc.cpp:90
+#, no-c-format
+msgid "Trac&ks"
+msgstr "&Pistes"
+
+#: rc.cpp:93
+#, no-c-format
+msgid "Set &Instrument"
+msgstr "Posa un &instrument"
+
+#: rc.cpp:102 rc.cpp:234 rc.cpp:333
+#, no-c-format
+msgid "&Toolbars"
+msgstr "B&arra d'eines"
+
+#: rc.cpp:105 rc.cpp:237 rc.cpp:336
+#, no-c-format
+msgid "&Rulers"
+msgstr "&Regles"
+
+#: rc.cpp:111 rc.cpp:240 rc.cpp:339
+#, no-c-format
+msgid "Tools Toolbar"
+msgstr "Barra d'eines"
+
+#: rc.cpp:114
+#, no-c-format
+msgid "Tracks Toolbar"
+msgstr "Barra d'eines de les pistes"
+
+#: rc.cpp:117
+#, no-c-format
+msgid "Editors Toolbar"
+msgstr "Barra d'editors"
+
+#: rc.cpp:135
+#, no-c-format
+msgid "&Layout Mode"
+msgstr "&Format"
+
+#: rc.cpp:138 rc.cpp:294
+#, no-c-format
+msgid "Add Event Ruler"
+msgstr "Afegeix un regle d'esdeveniments"
+
+#: rc.cpp:150
+#, fuzzy, no-c-format
+msgid "N&ote"
+msgstr "N&otes"
+
+#: rc.cpp:153
+#, no-c-format
+msgid "Mar&ks"
+msgstr "Mar&ques"
+
+#: rc.cpp:156
+#, no-c-format
+msgid "&Ornaments"
+msgstr "&Ornaments"
+
+#: rc.cpp:159
+#, no-c-format
+msgid "&Fingerings"
+msgstr "&Digitacions"
+
+#: rc.cpp:162
+#, no-c-format
+msgid "S&lashes"
+msgstr "S&lash"
+
+#: rc.cpp:165 rc.cpp:219
+#, no-c-format
+msgid "&Accidentals"
+msgstr "&Accidents"
+
+#: rc.cpp:168
+#, fuzzy, no-c-format
+msgid "&Phrase"
+msgstr "&Esborra"
+
+#: rc.cpp:171
+#, no-c-format
+msgid "Slur &Position"
+msgstr "&Posició del lligat"
+
+#: rc.cpp:174
+#, fuzzy, no-c-format
+msgid "Tie &Position"
+msgstr "&Posició del lligat"
+
+#: rc.cpp:177
+#, no-c-format
+msgid "&Octaves"
+msgstr "&Octaves"
+
+#: rc.cpp:180 rc.cpp:306
+#, no-c-format
+msgid "Ad&just"
+msgstr "A&justa"
+
+#: rc.cpp:183
+#, no-c-format
+msgid "R&ests"
+msgstr "Sil&encis"
+
+#: rc.cpp:186 rc.cpp:213
+#, no-c-format
+msgid "&Notes"
+msgstr "&Notes"
+
+#: rc.cpp:189 rc.cpp:309
+#, no-c-format
+msgid "&Quantize"
+msgstr "&Quantifica"
+
+#: rc.cpp:195 rc.cpp:315
+#, no-c-format
+msgid "Trans&pose"
+msgstr "Trans&posa"
+
+#: rc.cpp:198 rc.cpp:318
+#, no-c-format
+msgid "Convert"
+msgstr ""
+
+#: rc.cpp:201
+#, no-c-format
+msgid "&Fine Positioning"
+msgstr "&Ubicació precisa"
+
+#: rc.cpp:204
+#, no-c-format
+msgid "Fine Ti&ming"
+msgstr "Te&mps precís"
+
+#: rc.cpp:207
+#, no-c-format
+msgid "&Visibility"
+msgstr "&Visibilitat"
+
+#: rc.cpp:216
+#, no-c-format
+msgid "&Rests"
+msgstr "&Silencis"
+
+#: rc.cpp:222
+#, no-c-format
+msgid "&Clefs"
+msgstr "&Clau"
+
+#: rc.cpp:225 rc.cpp:324
+#, fuzzy, no-c-format
+msgid "Local &Cursor"
+msgstr "&Cursor local"
+
+#: rc.cpp:246
+#, no-c-format
+msgid "Notes Toolbar"
+msgstr "Barra de &notes"
+
+#: rc.cpp:249
+#, no-c-format
+msgid "Rests Toolbar"
+msgstr "Barra de silencis"
+
+#: rc.cpp:252
+#, no-c-format
+msgid "Clefs Toolbar"
+msgstr "Barra de claus"
+
+#: rc.cpp:255
+#, no-c-format
+msgid "Accidentals Toolbar"
+msgstr "Barra d'accidents"
+
+#: rc.cpp:258
+#, no-c-format
+msgid "Group Toolbar"
+msgstr "Barra de grups"
+
+#: rc.cpp:261
+#, no-c-format
+msgid "Marks Toolbar"
+msgstr "Barra de màrques"
+
+#: rc.cpp:264
+#, no-c-format
+msgid "Meta Toolbar"
+msgstr "Barra d'eines Meta"
+
+#: rc.cpp:267
+#, no-c-format
+msgid "Layout Toolbar"
+msgstr "Barra de formats"
+
+#: rc.cpp:270 rc.cpp:351
+#, no-c-format
+msgid "Control Ruler actions"
+msgstr "Accions del regle de control"
+
+#: rc.cpp:273 rc.cpp:354
+#, no-c-format
+msgid "Property Ruler actions"
+msgstr "Accions del regle de propietats"
+
+#: rc.cpp:276
+#, no-c-format
+msgid "&Action"
+msgstr "&Acció"
+
+#: rc.cpp:279
+#, no-c-format
+msgid "General Toolbar"
+msgstr "Barra d'eines general"
+
+#: rc.cpp:291
+#, no-c-format
+msgid "&Grid"
+msgstr "&Graella"
+
+#: rc.cpp:300
+#, no-c-format
+msgid "&Segment"
+msgstr "&Fragment"
+
+#: rc.cpp:361
+#, no-c-format
+msgid "Hide additional controls"
+msgstr "Amaga els controls addicionals"
+
+#: rc.cpp:365
+#, no-c-format
+msgid "Panic Button"
+msgstr "Botó de pànic"
+
+#: rc.cpp:368
+#, no-c-format
+msgid "Resets all MIDI devices if you've got stuck notes"
+msgstr "Fa callar tots els dispositius MIDI si teniu cap nota clavada"
+
+#: rc.cpp:375
+#, no-c-format
+msgid "Provides a metronome click for you to play along with"
+msgstr "Us dóna un tic-tac de metrònom per ajudar-vos a tocar conjutament"
+
+#: rc.cpp:378
+#, no-c-format
+msgid "Shows MIDI activity in and out of Rosegarden"
+msgstr "Mostra l'activiatat d'entrada i sortida del MIDI del Rosegarden "
+
+#: rc.cpp:381
+#, no-c-format
+msgid "IN"
+msgstr "Entrada"
+
+#: rc.cpp:384
+#, no-c-format
+msgid "OUT"
+msgstr "Sortida"
+
+#: rc.cpp:387 rc.cpp:390
+#, no-c-format
+msgid "NO EVENTS"
+msgstr "Sense esdeveniments"
+
+#: rc.cpp:397
+#, no-c-format
+msgid "Record either MIDI or audio"
+msgstr "Grava o MIDI o àudio"
+
+#: rc.cpp:401
+#, no-c-format
+msgid "Loop"
+msgstr "Bucle de repetició"
+
+#: rc.cpp:404
+#, no-c-format
+msgid "Turn on and off the loop markers (if set)"
+msgstr "Commuta les marques dels bucles (si n'hi ha)"
+
+#: rc.cpp:411
+#, no-c-format
+msgid "Mutes all but the currently selected track"
+msgstr "Posa silencia a totes les pistes excepte la seleccionada"
+
+#: rc.cpp:415
+#, no-c-format
+msgid "Start loop or range here"
+msgstr ""
+
+#: rc.cpp:419
+#, no-c-format
+msgid "End loop or range here"
+msgstr ""
+
+#: rc.cpp:422
+#, no-c-format
+msgid "SIG"
+msgstr "SIG"
+
+#: rc.cpp:425
+#, no-c-format
+msgid "DIV"
+msgstr "DIV"
+
+#: rc.cpp:428
+#, no-c-format
+msgid "/16"
+msgstr "/16"
+
+#: rc.cpp:431
+#, no-c-format
+msgid "TEMPO"
+msgstr "TEMPO"
+
+#: rc.cpp:434
+#, no-c-format
+msgid "END"
+msgstr "END"
+
+#: rc.cpp:437
+#, no-c-format
+msgid "BAR"
+msgstr "BAR"
+
+#: rc.cpp:441
+#, no-c-format
+msgid "Switch between real time, musical time, and frame count"
+msgstr "Commuta entre temps real, temps musical i comptador de trams"
+
+#: rc.cpp:445
+#, no-c-format
+msgid "Show additional controls"
+msgstr "Mostra els controls addicionals"
+
+#: rc.cpp:449
+#, no-c-format
+msgid "Rewind"
+msgstr "Rebobina"
+
+#: rc.cpp:452
+#, no-c-format
+msgid "Moves the current pointer position back one bar."
+msgstr "Mou la posició una compàs enrere."
+
+#: rc.cpp:456
+#, no-c-format
+msgid "Rewind to beginning"
+msgstr "Rebobina fins al començament"
+
+#: rc.cpp:459
+#, no-c-format
+msgid ""
+"Moves the pointer position to the start of the composition. (This may mean "
+"going forwards if the pointer is currently before the start.)"
+msgstr ""
+"Torna al principi de la composició. (Això pot voler dir que es mou endavant, "
+"en cas que la posició actual era més enrere del principi.)"
+
+#: rc.cpp:463
+#, no-c-format
+msgid "Play/Pause"
+msgstr "Reprodueix/pausa"
+
+#: rc.cpp:466
+#, no-c-format
+msgid ""
+"Plays from the current pointer position, or pauses playback if already in "
+"progress."
+msgstr "Toca des de la posició actual, o para de reproduir si estava en marxa."
+
+#: rc.cpp:473
+#, no-c-format
+msgid "Stops playback or recording."
+msgstr "Para de reproduir o de gravar."
+
+#: rc.cpp:477
+#, no-c-format
+msgid "Fast forward"
+msgstr "Avança ràpidament"
+
+#: rc.cpp:480
+#, no-c-format
+msgid "Moves the current pointer position forwards one bar."
+msgstr "Mou la posició una compàs endavant."
+
+#: rc.cpp:484
+#, no-c-format
+msgid "Fast forward to end"
+msgstr "Avança ràpidament fins al final"
+
+#: rc.cpp:487
+#, no-c-format
+msgid ""
+"Moves the pointer position to the end of the composition. (This may mean "
+"going backwards if the pointer is already beyond the end.)"
+msgstr ""
+"Va al final de la composició. (Això pot voler dir que es mou endarrere, en "
+"cas que la posició actual sigui més enllà del final.)"
+
+#: rc.cpp:491
+#, no-c-format
+msgid "Display time to end"
+msgstr "Mostra el temps que queda"
+
+#: ../docs/en/tips.cpp:3
+msgid ""
+"<p>To configure a track to play using a particular instrument:</p>\n"
+"&nbsp;&nbsp;* click on the track label and hold a moment<br>\n"
+"&nbsp;&nbsp;* select an output device<br>\n"
+"&nbsp;&nbsp;* select one of that device's available instruments (#1 - #16)"
+"<br>\n"
+"&nbsp;&nbsp;* adjust that instrument's output channel, program, bank, and\n"
+"controllers via the instrument parameters box\n"
+msgstr ""
+"<p>Per configurar una pista per tocar amb un instrument determinat:</p>\n"
+"&nbsp;&nbsp;* feu clic en l'etiqueta de la pista i manteniu premut el botó "
+"un moment<br> \n"
+"&nbsp;&nbsp;* seleccioneu un dispositiu de sortida<br>\n"
+"&nbsp;&nbsp;* seleccioneu un dels instruments disponibles del dispositiu (#1 "
+"- #16)<br>\n"
+"&nbsp;&nbsp;* ajusteu el canal, el banc, el programa, i els controladors de "
+"l'instrument \n"
+"fent servir els controls del quadre de paràmetres de l'instrument\n"
+
+#: ../docs/en/tips.cpp:13
+msgid ""
+"<p>...that Rosegarden has an autosave feature?<br><br>\n"
+"You can select your autosave interval from <b>Settings->Configure\n"
+"Rosegarden</b>.<br><br>\n"
+"When something goes awry, such as a power outage or a Rosegarden crash\n"
+"(unfortunately, it happens...) simply load the file you were working on, and "
+"you'll be given the\n"
+"option to load the autosaved version, or the unmodified original.</p>\n"
+msgstr ""
+"<p>...que el Rosegarden té una característica d'auto-desat?<br><br> \n"
+"Podeu seleccionar l'interval de temps a <b>Preferències->Configura el\n"
+"Rosegarden</b><br><br>\n"
+"Quan alguna cosa va malament, com una tallada del corrent o una fallada del "
+"Rosegarden \n"
+"(desgraciadament, això passa...) simplement, recupereu el fitxer amb el qual "
+"estàveu treballant, \n"
+"i se us presentarà l'opció d'obrir la versió auto-desada, o be l'original "
+"sense modificar.</p>\n"
+
+#: ../docs/en/tips.cpp:23
+#, fuzzy
+msgid ""
+"<p>\n"
+"...that you can save the current document as your default studio by using\n"
+"<b>Composition -> Studio -> Save Current Document as Default Studio</b>?</"
+"p>\n"
+msgstr ""
+"<p> \n"
+"Podeu desar el document actual com a l'estudi per defecte fent servir\n"
+"<b>Composició -> Estudi -> Desa el document actual com a l'estudi per "
+"defecte</b>.</p>\n"
+
+#: ../docs/en/tips.cpp:30
+msgid ""
+"<p>...that your default studio is a complete Rosegarden composition that "
+"gets\n"
+"loaded every time you create a new document or import a MIDI file?</p>\n"
+msgstr ""
+"<p>...que el vostre estudi per defecte és una composició completa del "
+"Rosegarden, que es\n"
+"carrega cada vegada que creeu un document nou o importeu un fitxer MIDI?</"
+"p>\n"
+
+#: ../docs/en/tips.cpp:36
+#, fuzzy
+msgid ""
+"<p>...that your default studio can contain instrument assignments, document "
+"properties, LilyPond headers,\n"
+"and many other things?<br><br>The default studio is a complete Rosegarden "
+"composition, so it can contain anything that you may wish to have available "
+"in each\n"
+"new document you create.</p>\n"
+msgstr ""
+"<p>Com que el vostre estudi per defecte és una composició completa del\n"
+" Rosegarden, pot contenir assignacions d'instruments per defecte, "
+"propietats\n"
+"del document, capçaleres del Lilypond, i moltes altres coses que podeu\n"
+"tenir disponibles per defecte en cada document nou que creeu.</p>\n"
+
+#: ../docs/en/tips.cpp:43
+#, fuzzy
+msgid ""
+"<p>...that Rosegarden will detect and create a default connection for ALSA "
+"soft\n"
+"synth applications that are started after Rosegarden is already running?</"
+"p>\n"
+msgstr ""
+"<p>...que el Rosegarden detectarà i crearà una connexió per defecte per als\n"
+"sintetitzadors de software d'ALSA, que s'iniciïn després de què el "
+"Rosegarden ja\n"
+" estigui en execució?</p>\n"
+
+#: ../docs/en/tips.cpp:49
+#, fuzzy
+msgid ""
+"<p>...that you can make your default studio override that in every "
+"Rosegarden composition you load?<br><br>If your studio setup does not change "
+"very often, and you would prefer for\n"
+"the settings in your default studio to take precedence over whatever\n"
+"studio is saved with any files you happen to load, you can make your studio "
+"the default for everything using <b>Settings -> Configure Rosegarden ->\n"
+"MIDI -> Always use default studio when loading files</b>.</p>\n"
+msgstr ""
+"<p>Si la configuració del teu estudi no el canvies mai, i prefereixes que \n"
+" el teu estudi sigui el primer a carregar de tots els estudis de <b>autoload."
+"rg</b>,\n"
+"podeu configurar el teu autoload perquè sigui el predeterminat dins \n"
+"<b>Configuració -> Configura el Rosegarden -> Comportament ->\n"
+" Sempre utilitza l'estudi per defecte quan carreguis fitxers</b>.</p>\n"
+
+#: ../docs/en/tips.cpp:57
+#, fuzzy
+msgid ""
+"<p>If you have accidentally recorded a segment so short that it does not\n"
+"appear on the canvas, which you can only hear during subsequent recording\n"
+"sessions, you can gain access to it by using <b>Composition -> Change\n"
+"Composition Start and End</b> and then setting the composition to start at a "
+"negative number.</p>\n"
+msgstr ""
+"<p>Si, accidentalment, heu gravat un fragment tant curt que ni tan sols \n"
+"es veu, però que el sentiu igualment, podeu seleccionar-lo anant a\n"
+" <b>Composició -> Canvia la durada del document </b> i posant un número\n"
+" negatiu en el punt d'inici de la composició.</p>\n"
+
+#: ../docs/en/tips.cpp:65
+#, fuzzy
+msgid ""
+"<p>...that if you place a note at the wrong pitch using the notation or "
+"matrix editor, you can move it one semitone at a time with the up and down "
+"arrow keys on your keyboard?</p>\n"
+msgstr ""
+"<p>...que si col·loqueu una nota a una altura incorrecta fent servir "
+"l'editor de\n"
+"partitures, podeu moure-la un semitò cada vegada, amb les tecles de "
+"desplaçament, amunt i avall?</p>\n"
+
+#: ../docs/en/tips.cpp:70
+msgid ""
+"<p>...that you can toggle stem directions in the notation editor by "
+"selecting\n"
+"one or more notes and using Ctrl-PageUp and Ctrl-PageDown?</p>\n"
+msgstr ""
+"<p>...que podeu canviar la direcció de les vírgules en l'editor de "
+"partitures seleccionant\n"
+"una o més notes i fent servir Ctrl-RePàg i Ctrl-AvPàg?</p>\n"
+
+#: ../docs/en/tips.cpp:76
+msgid ""
+"<p>...that you can change the accidental used for a note in the notation "
+"editor (without changing the pitch of the note) by selecting\n"
+"it and using the up and down arrow keys with both Ctrl and Shift pressed?</"
+"p>\n"
+msgstr ""
+"<p>...que podeu canviar l'accident d'una nota en l'editor de partitures\n"
+" (sense canviar l'altura de la nota) seleccionant-la i fent servir les "
+"tecles\n"
+"de desplaçament, amunt i avall amb Ctrl i majúscules premudes simultàniament?"
+"</p>\n"
+
+#: ../docs/en/tips.cpp:82 ../docs/en/tips.cpp:93
+msgid ""
+"<p>...that you can hold down the Shift key while repositioning segments on "
+"the\n"
+"segment canvas in order to avoid the \"snap-to\" effect and exert finer "
+"control?</p>\n"
+msgstr ""
+"<p>...que podeu mantenir la tecla de les majúscules premuda mentre "
+"recol·loqueu els fragments en el\n"
+"fragment per tal d'evitar l'efecte d'\"auto-posicionament\" i poder fer un "
+"control més fi?</p>\n"
+
+#: ../docs/en/tips.cpp:88
+msgid ""
+"<p>...that you can use the arrow tool to draw, move, and resize segments and "
+"events as well as to select them?<br><br>Drag a segment or event block to "
+"move it, drag the right edge of a block to resize it, and drag with the "
+"middle mouse button pressed to draw a new segment or event.<br><br>(Of "
+"course, the dedicated draw, move and resize tools are still quicker for "
+"repeated operations.)</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:99
+msgid ""
+"<p>...that you can hold down the Shift key while repositioning or resizing "
+"events in the\n"
+"matrix view in order to avoid the \"snap-to\" effect and exert finer control?"
+"</p>\n"
+msgstr ""
+"<p>...que podeu mantenir premuda la tecla de les majúscules mentre\n"
+" recol·loqueu o redimensioneu els esdeveniments en la vista de l'editor de "
+"matrius, \n"
+"per evitar l'efecte d'\"auto-posicionament\" i poder fer un control més fi?</"
+"p>\n"
+
+#: ../docs/en/tips.cpp:105
+msgid ""
+"<p>...that you can edit multiple segments on multiple tracks simultaneously "
+"in\n"
+"the notation editor? Simply select the segments, then use <b>Edit -> Open "
+"in Notation Editor</b>.</p>\n"
+msgstr ""
+"<p>...que podeu editar múltiples fragments en múltiples pistes "
+"simultàniament en\n"
+"l'editor de partitures? Simplement seleccioneu els fragments, després feu "
+"servir <b>Edita->Obre a l'editor de partitures</b></p>\n"
+
+#: ../docs/en/tips.cpp:111
+#, fuzzy
+msgid ""
+"<p>...that Rosegarden can export files for use by LilyPond, the high-quality "
+"score typesetting system?<br><br>\n"
+"From the <b>File</b> menu, navigate to <b>Export -> Export LilyPond File</"
+"b></p>\n"
+msgstr ""
+"<p>...que el Rosegarden pot exportar fitxers per a ser usat amb el Lilypond, "
+"el sistema\n"
+"d'edició de partitures d'alta qualitat?<br><br>\n"
+"Des del menú <b>Fitxer</b>, navega a <b>Exporta -> Exporta a fitxer del "
+"Lilypond</b></p>\n"
+
+#: ../docs/en/tips.cpp:117
+#, fuzzy
+msgid ""
+"<p>...that Rosegarden can print via LilyPond, the high-quality score "
+"typesetting system?<br><br>\n"
+"From the <b>File</b> menu, navigate to <b>Preview with LilyPond</b>. The "
+"file\n"
+"will be exported, rendered, and a preview will appear in KPDF, or one of\n"
+"several other PDF viewers, where it can then be printed as well.</p>\n"
+msgstr ""
+"<p>...que el Rosegarden pot exportar fitxers per a ser usat amb el Lilypond, "
+"el sistema\n"
+"d'edició de partitures d'alta qualitat?<br><br>\n"
+"Des del menú <b>Fitxer</b>, navega a <b>Exporta -> Exporta a fitxer del "
+"Lilypond</b></p>\n"
+
+#: ../docs/en/tips.cpp:125
+msgid ""
+"<p>...that if you use the quantizer from within the notation view, you can "
+"tell it to quantize only the timing used for notation -- making it possible "
+"to have good looking notation <b>and</b> a human MIDI performance?</p>\n"
+msgstr ""
+"<p>...que si feu servir la quantificació des de la vista d'edició de "
+"partitures, podeu dir-li que quantifiqui només els temps utilitzats per a la "
+"notació de la partitura -- fent possible obtenir una partitura elegant <b>i, "
+"a la vegada,</b> una interpretació MIDI humana?</p>\n"
+
+#: ../docs/en/tips.cpp:130
+msgid ""
+"<p>...that you can change segment labels using the controls on the Segment "
+"Parameters box\n"
+"in the main window?</p>\n"
+msgstr ""
+"<p>...que podeu canviar les etiquetes dels fragments fent servir els "
+"controls en la caixa Paràmetres del fragment de la finestra principal?</p>\n"
+
+#: ../docs/en/tips.cpp:136
+msgid ""
+"<p>...that the number of tracks in new documents is based on the contents "
+"of\n"
+"your autoload.rg file?\n"
+"<br><br>\n"
+"Whether you prefer to start with three tracks or 43, create a document that\n"
+"contains the desired number of tracks, plus any other studio or document "
+"properties settings\n"
+"you wish to configure, and use <b>Composition -> Studio -> Save Current "
+"Document as Default\n"
+"Studio</b> to make this your new default.</p>\n"
+msgstr ""
+"<p>...que el número de pistes en els documents nous està basat en el \n"
+"contingut del seu fitxer autoload.rg?\n"
+"<br><br>\n"
+"Si preferiu començar amb 3 o amb 43 pistes, creeu un document que contingui\n"
+" el número de pistes desitjat, a més de qualssevol altres preferències "
+"d'estudi\n"
+"o de document que desitgeu configurar, i feu servir <b>Composició -> Estudi -"
+">\n"
+" Desa el document actual com estudi per defecte</b> perquè aquesta "
+"configuració\n"
+"s'activi per defecte.</p>\n"
+
+#: ../docs/en/tips.cpp:147
+msgid ""
+"<p>...that you can change the name of a track by double clicking on the "
+"label? (The\n"
+"label must be visible for this to work.)</p>\n"
+msgstr ""
+"<p>...que podeu canviar el nom d'una pista fent doble clic a la seva "
+"etiqueta \n"
+"(L'etiqueta ha de ser visible perquè això funcioni.)</p>\n"
+
+#: ../docs/en/tips.cpp:153
+#, fuzzy
+msgid ""
+"<p>...that you can configure what happens when you double-click on a segment?"
+"<br><br>Go to <b>Settings -> Configure Rosegarden</b> and choose your "
+"preferred editing window under the <b>Behaviour</b> tab.</p>\n"
+msgstr ""
+"<p>...que podeu configurar el que està passant quan feu doble clic en un \n"
+"fragment? Seleccioneu <b>Preferències -> Configura el Rosegarden</b> i "
+"trieu\n"
+"l'opció que preferiu, sota la pestanya <b>Comportament</b>.</p>\n"
+
+#: ../docs/en/tips.cpp:158
+#, fuzzy
+msgid ""
+"<p>...that Rosegarden is being developed as a community effort with\n"
+"contributions from around the world?<br><br>\n"
+"The four most active developers live in London (England), Cannes, "
+"Barcelona,\n"
+"and... Christiansburg? (Christiansburg is a town of about 50,000 in\n"
+"southwestern Virginia, USA.)<br><br>\n"
+"We have had contributors from elsewhere in the US, UK, Spain, Mexico, "
+"Argentina, Germany,\n"
+"Sweden, Russia, Japan, Finland, and Italy, just to name a few...</p>\n"
+msgstr ""
+"<p>...que el Rosegarden s'està desenvolupant, amb un esforç comunitari, amb\n"
+"contribucions procedents de totes les parts del món?<br><br>\n"
+"Els desenvolupadors principals viuen al Regne Unit i a França, i hem tingut\n"
+"col·laboradors dels EEUU, Espanya, Alemanya, Rússia, Eslovènia i d'altres\n"
+" països...</p>\n"
+
+#: ../docs/en/tips.cpp:169
+#, fuzzy
+msgid ""
+"<p>...that Rosegarden is available in Spanish, French, German, Russian, "
+"Welsh, Swedish, Italian and Estonian\n"
+"translations? (Just to name a few.)<br><br>\n"
+"If you're interested in translating Rosegarden to another language, drop us "
+"a\n"
+"line at <b>[email protected]</b>.</p>\n"
+msgstr ""
+"<p>...que el Rosegarden té disponibles traduccions a l'espanyol, al "
+"francès,\n"
+"a l'alemany, al rus, al gal·lès, al suec,a l' italià i a l'estonià?<br><br>\n"
+"Si esteu interessat en traduir el Rosegarden a un altre idioma, envieu-nos "
+"un missatge a\n"
+"<b>[email protected]</b>.</p>\n"
+
+#: ../docs/en/tips.cpp:177
+#, fuzzy
+msgid ""
+"<p>...that you can change the total number of bars in the composition via\n"
+"<b>Composition -> Change Composition Start and End</b>?</p>\n"
+msgstr ""
+"<p>...que es pot canviar el número total de compassos de la composició "
+"mitjançant\n"
+"<b>Edita -> Canvia la durada de la composició</b>?</p>\n"
+
+#: ../docs/en/tips.cpp:183
+msgid ""
+"<p>...that you can see the difference between performance and display "
+"duration\n"
+"of duration-quantized notes in the notation editor?<br><br>\n"
+"Use <b>Settings -> Show Raw Note Ruler</b> to turn on this handy\n"
+"feature.<br><br>\n"
+"<i>Note that this feature does not work in page layout view.</i></p>\n"
+msgstr ""
+"<p>...que podeu veure la diferència entre la interpretació i la durada "
+"representada\n"
+"de les notes, la durada de les quals ha estat quantificada en l'editor de "
+"partitures?<br><br>\n"
+"Feu servir <b>Preferències -> Mostra el regle de la Nota crua</b> per "
+"activar aquesta\n"
+" pràctica característica.<br><br>\n"
+"<i>Fixeu-vos que aquesta característica no funciona en la vista de format de "
+"pàgina.</i></p>\n"
+
+#: ../docs/en/tips.cpp:192
+msgid ""
+"<p>...that you can add tempo and time-signature changes by double-clicking "
+"on the values displayed in the transport window or tempo rulers?</p>\n"
+msgstr ""
+"<p>...que podeu afegir canvis de tempo i d'indicació de compàs fent doble "
+"clic\n"
+" en els valors mostrats a la finestra de control o en el regle del tempo?</"
+"p>\n"
+
+#: ../docs/en/tips.cpp:197
+#, fuzzy
+msgid ""
+"<p>...that the transport window can display musical time, sample frame "
+"count, and a visual metronome as well as real time?<br><br>Just click on the "
+"small button at the extreme top left of the window.</p>\n"
+msgstr ""
+"<p>...que la finestra de control pot mostrar el temps musical, el comptador\n"
+" de mostres i un metrònom visual? Feu un clic sobre el botonet de l'angle\n"
+" superior esquerra de la finestra.</p>\n"
+
+#: ../docs/en/tips.cpp:202
+#, fuzzy
+msgid ""
+"<p>...that you can select all notes of a particular pitch in the matrix "
+"view, by shift-clicking on that pitch on the piano keyboard at the left?"
+"<br><br>If you shift-click-drag, you can select whole ranges too.</p>\n"
+msgstr ""
+"<p>...que podeu seleccionar totes les notes d'una determinada altura en la\n"
+" vista de matrius, prement la tecla de les majúscules i fent un clic a la "
+"nota, del\n"
+" teclat del piano, de l'esquerra? També podeu arrossegar el ratolí per "
+"seleccionar\n"
+" abasts complets.</p>\n"
+
+#: ../docs/en/tips.cpp:207
+#, fuzzy
+msgid ""
+"<p>...that you can set a loop in the main window by clicking-and-dragging on "
+"the time ruler with Shift pressed?<br><br>(If the ruler isn't visible, use "
+"<b>Settings -> Show Rulers</b>.)</p>\n"
+msgstr ""
+"<p>...que podeu definir una repetició a la finestra principal, fent clic i "
+"arrossegant\n"
+" en el regle del temps amb la tecla de les majúscules premuda? (si el regle "
+"no és\n"
+" visible, utilitzeu <b>Preferències -> Mostra els regles</b>.)</p>\n"
+
+#: ../docs/en/tips.cpp:212
+#, fuzzy
+msgid ""
+"<p>...that if you're editing a section in the matrix or notation view, you "
+"can\n"
+"set that section to loop while you edit it?<br><br>Select it and use "
+"<b>Tools ->\n"
+"Local Cursor -> Set Loop to Selection</b>, then hit Play.</p><br><br>\n"
+"<i>This feature does not work quite as well for compositions that include "
+"sampled\n"
+"audio.</i>\n"
+msgstr ""
+"<p>...que si esteu editant una secció en les vistes de matrius o de "
+"partitures,\n"
+" podeu definir aquesta secció com a repetició, mentre l'esteu editant? "
+"Seleccioneu\n"
+"i feu servir <b>Eines -> Cursor local -> Defineix la repetició en la "
+"selecció</b>, i després feu clic sobre Reprodueix.</p>\n"
+
+#: ../docs/en/tips.cpp:221
+msgid ""
+"<p>...if you have more than one note or controller event at the same time, "
+"you\n"
+"can use the [ and ] keys to flip the stack of events around on the "
+"controller\n"
+"and velocity rulers in order to bring the item you wish to adjust into\n"
+"focus.</p>\n"
+msgstr ""
+"<p>...si teniu vàries notes o esdeveniments de controlador en el mateix "
+"instant, podeu fer servir\n"
+"les tecles [ i ] per tal de visualitzar millor l'element que desitgeu "
+"ajustar.</p>\n"
+
+#: ../docs/en/tips.cpp:229
+msgid ""
+"<p>...that the notation view shows you notes using their display duration, "
+"while the\n"
+"matrix allows you to edit their performance duration?<br><br>\n"
+"<i>Be careful with tied notes in the matrix. It is not apparent that they "
+"are\n"
+"tied, and if you split up a pair of tied notes, subsequent notation views "
+"will\n"
+"be confused and unhappy. This is an old bug that has been on our TODO list\n"
+"for years. Sorry about that, folks. Patches welcome.</i>\n"
+"</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:240
+#, fuzzy
+msgid ""
+"<p>If you're working with a human performance and you need to insert some "
+"new\n"
+"notes, these new notes will sound for their entire written duration. To "
+"blend\n"
+"these new notes into a human performance, select them, then use <b>Adjust -> "
+"Interpret...</b> \n"
+"from the notation view to interpret any marks and massage their "
+"performance\n"
+"durations to something less mechanical.</p>\n"
+msgstr ""
+"<p>si esteu treballant amb una interpretació humana i necessiteu inserir "
+"algunes\n"
+"notes noves, aquestes sonaran durant tant de temps com indiqui la seva "
+"durada\n"
+"escrita. Per fusionar aquestes notes amb una interpretació humana, "
+"seleccioneu-les\n"
+"i feu servir <b>Ajust -> Notes -> Interpreta...</b> des de la finestra de "
+"l'editor de partitures,\n"
+"per interpretar qualsevol marcadors i fer que la seva interpretació sigui "
+"alguna cosa\n"
+"menys mecànica</p>\n"
+
+#: ../docs/en/tips.cpp:249
+msgid ""
+"<p>...that Rosegarden can export certain things to LilyPond that it cannot "
+"yet\n"
+"display within its own native interface?<br><br>These new directives can be "
+"inserted\n"
+"via the <b>T</b> text insert tool in the notation view.<br><br>\n"
+"Load the example files\n"
+"<b>lilypond-alternative-endings.rg</b> and <b>lilypond-directives.rg</b> for "
+"a\n"
+"demonstration of how to use the new exportable directives.<br><br>\n"
+"Use <b>File -> Preview with\n"
+"LilyPond</b> to see what they look like on the exported page.<br><br>\n"
+"<i>Be sure to turn on\n"
+"<b>Settings -> Show LilyPond Directives</b> and <b>Show Annotations</b> "
+"within\n"
+"the notation view.</i></p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:264
+msgid ""
+"<p>...that Rosegarden has track parameters allowing you to <b>Create "
+"segments with:</b> certain\n"
+"properties by default?<br><br>You can pre-select the clef, transposition, "
+"colour, and specify\n"
+"the highest and lowest playable notes (notes outside this range display in\n"
+"red by default). Then draw a segment with the pencil, or record one, and "
+"any\n"
+"new segments created on this track will take these properties as segment\n"
+"parameters.<br><br>\n"
+"<i>These parameters do not apply to audio tracks.</i></p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:275
+msgid ""
+"<p>...that Rosegarden has a database of preset parameters describing more "
+"than 300\n"
+"musical instruments from the real world, grouped into several convenient\n"
+"categories?<br><br>Each preset contains a clef, transposition, and playable "
+"range\n"
+"suggestions for both amateur and professional players.<br><br>Click the\n"
+"<b>Load</b> button in the new track parameters box to get started! <i>(If "
+"you\n"
+"do not see a <b>Load</b> button, be sure your parameter panel is set for\n"
+"tabbed mode, rather than stacked mode.)</i> <br><br> <i>(Special thanks to "
+"Magnus\n"
+"Johansson for assembling this extraordinary database.)</i></p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:287
+msgid ""
+"<p>...that when exporting to Lilypond, you can merge tracks that have the "
+"same name onto a single staff?<br><br>For example, if there are three voices "
+"in a single part, write each\n"
+"voice as an independent segment/staff, each on a separate track. Give all\n"
+"three tracks the same name, and select <b>[x] Merge tracks that have the "
+"same\n"
+"name</b> from the options dialog that appears when you export to, or "
+"preview\n"
+"with LilyPond.<br><br>\n"
+"<i>The tracks must have a non-default name for this to work.</i></p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:297
+msgid ""
+" \t \n"
+"<p>...that you can use the mouse wheel to scroll up and down, scroll left "
+"and right, and zoom in and out?<br><br>Just roll the wheel to scroll up or "
+"down. Hold Alt as well to scroll left or right, or hold Ctrl to zoom in and "
+"out.</p> \t \n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:303
+msgid ""
+" \t \n"
+"<p>...that you can time-stretch an audio segment -- stretching or squashing "
+"a\n"
+"sample to a different duration without changing its pitch -- just by\n"
+"dragging its right edge with the Ctrl key pressed?</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:311
+msgid ""
+" \t \n"
+"<p>...that you can add audio to your Rosegarden composition just by dragging "
+"an audio file from your file manager and dropping it on the Rosegarden "
+"segment canvas? (Make sure you drop it on an audio track!)<br><br>You can "
+"also drop audio files from Rosegarden's audio file manager window onto the "
+"segment canvas, and from other programs onto the audio file manager.</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:317
+msgid ""
+" \t \n"
+"<p>...that you can set the tempo to match the duration of an audio segment "
+"if you know it's an exact number of bars or beats long?<br><br>Just select "
+"the audio segment and use <b>Composition -> Tempo and Time Signature -> Set "
+"Tempo to Audio Segment Duration</b>.</p>\n"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:1
+msgid "Feta Pixmaps"
+msgstr "Imatges Feta"
+
+#: ../data/fonts/mappings/fonts.cpp:2 ../data/fonts/mappings/fonts.cpp:7
+msgid "GNU Lilypond"
+msgstr "GNU Lilypond"
+
+#: ../data/fonts/mappings/fonts.cpp:3 ../data/fonts/mappings/fonts.cpp:8
+msgid "Copyright (c) 1997--2003 Han-Wen Nienhuys and Jan Nieuwenhuizen"
+msgstr "Copyright (c) 1997--2003 Han-Wen Nienhuys and Jan Nieuwenhuizen"
+
+#: ../data/fonts/mappings/fonts.cpp:4 ../data/fonts/mappings/fonts.cpp:9
+#: ../data/fonts/mappings/fonts.cpp:14 ../data/fonts/mappings/fonts.cpp:19
+#: ../data/fonts/mappings/fonts.cpp:24 ../data/fonts/mappings/fonts.cpp:29
+#: ../data/fonts/mappings/fonts.cpp:34 ../data/fonts/mappings/fonts.cpp:39
+#: ../data/fonts/mappings/fonts.cpp:44 ../data/fonts/mappings/fonts.cpp:49
+#: ../data/fonts/mappings/fonts.cpp:54
+msgid "Chris Cannam"
+msgstr "Chris Cannam"
+
+#: ../data/fonts/mappings/fonts.cpp:5 ../data/fonts/mappings/fonts.cpp:40
+msgid "pixmap"
+msgstr "imatge"
+
+#: ../data/fonts/mappings/fonts.cpp:6
+msgid "Feta"
+msgstr "Feta"
+
+#: ../data/fonts/mappings/fonts.cpp:10 ../data/fonts/mappings/fonts.cpp:15
+#: ../data/fonts/mappings/fonts.cpp:20 ../data/fonts/mappings/fonts.cpp:25
+#: ../data/fonts/mappings/fonts.cpp:30 ../data/fonts/mappings/fonts.cpp:35
+#: ../data/fonts/mappings/fonts.cpp:45 ../data/fonts/mappings/fonts.cpp:50
+#: ../data/fonts/mappings/fonts.cpp:55
+msgid "scalable"
+msgstr "escalable"
+
+#: ../data/fonts/mappings/fonts.cpp:11
+msgid "Fughetta"
+msgstr "Fughetta"
+
+#: ../data/fonts/mappings/fonts.cpp:12
+#, fuzzy
+msgid ""
+"Created by Blake Hodgetts; freely redistributable. See http://www.efn.org/"
+"~bch/aboutfonts.html"
+msgstr ""
+"Creat per en Blake Hodgetts; Es pot distribuir lliurement. Consulteu http://"
+"www.efh.org/~bch/aboutfonts.html"
+
+#: ../data/fonts/mappings/fonts.cpp:13
+msgid "Copyright 1995-1999 Blake Hodgetts"
+msgstr "Copyright 1995-1999 Blake Hodgetts"
+
+#: ../data/fonts/mappings/fonts.cpp:16
+msgid "Inkpen"
+msgstr "Inkpen"
+
+#: ../data/fonts/mappings/fonts.cpp:17
+msgid "Inkpen is part of Sibelius, but other fonts may use the same mappings."
+msgstr ""
+"Inkpen és part del Sibelius, però aquesta codificació també pot ser "
+"utilitzada en altres fonts."
+
+#: ../data/fonts/mappings/fonts.cpp:18 ../data/fonts/mappings/fonts.cpp:28
+msgid "Copyright Sibelius Software Ltd"
+msgstr "Copyright Sibelius Software Ltd"
+
+#: ../data/fonts/mappings/fonts.cpp:21
+msgid "Maestro"
+msgstr "Maestro"
+
+#: ../data/fonts/mappings/fonts.cpp:22
+msgid "Maestro is part of Finale, but other fonts use the same mappings."
+msgstr ""
+"Maestro és part del Finale, però aquesta codificació també pot ser "
+"utilitzada en altres fonts."
+
+#: ../data/fonts/mappings/fonts.cpp:23 ../data/fonts/mappings/fonts.cpp:33
+msgid "Copyright Coda Inc"
+msgstr "Copyright Coda Inc"
+
+#: ../data/fonts/mappings/fonts.cpp:27
+msgid "Opus is part of Sibelius, but other fonts may use the same mappings."
+msgstr ""
+"Opus és una part del Sibelius, però aquesta codificació també pot ser "
+"utilitzada en altres fonts."
+
+#: ../data/fonts/mappings/fonts.cpp:31
+msgid "Petrucci"
+msgstr "Petrucci"
+
+#: ../data/fonts/mappings/fonts.cpp:32
+msgid "Petrucci is part of Finale, but other fonts use the same mappings."
+msgstr ""
+"Petrucci és part del Finale, però aquesta codificació també pot ser "
+"utilitzada en altres fonts."
+
+#: ../data/fonts/mappings/fonts.cpp:36
+msgid "RG21"
+msgstr "RG21"
+
+#: ../data/fonts/mappings/fonts.cpp:37
+msgid "Rosegarden 2.1"
+msgstr "Rosegarden 2.1"
+
+#: ../data/fonts/mappings/fonts.cpp:38
+msgid "Copyright (c) 1994--2001 Chris Cannam"
+msgstr "Copyright (c) 1994--2001 Chris Cannam"
+
+#: ../data/fonts/mappings/fonts.cpp:41
+msgid "Sonata"
+msgstr "Sonata"
+
+#: ../data/fonts/mappings/fonts.cpp:42
+msgid "Adobe"
+msgstr "Adobe"
+
+#: ../data/fonts/mappings/fonts.cpp:43
+msgid "Copyright Adobe Inc"
+msgstr "Copyright Adobe Inc"
+
+#: ../data/fonts/mappings/fonts.cpp:46
+msgid "Steinberg"
+msgstr "Steinberg"
+
+#: ../data/fonts/mappings/fonts.cpp:47
+msgid "The Steinberg Notation font is part of Cubase."
+msgstr "La notació Steinberg és part del Cubase."
+
+#: ../data/fonts/mappings/fonts.cpp:48
+msgid "Copyright Steinberg Inc"
+msgstr "Copyright Steinberg Inc"
+
+#: ../data/fonts/mappings/fonts.cpp:51
+msgid "Xinfonia"
+msgstr "Xinfonia"
+
+#: ../data/fonts/mappings/fonts.cpp:52
+msgid "xemo.org"
+msgstr "xemo.org"
+
+#: ../data/fonts/mappings/fonts.cpp:53
+msgid "Copyright 2001-2003 Xemus Software LLC"
+msgstr "Copyright 2001-2003 Xemus Software LLC"
+
+#: ../data/styles/styles.cpp:1
+msgid "Classical"
+msgstr "Clàssica"
+
+#: ../data/styles/styles.cpp:2
+msgid "Cross"
+msgstr "Creu"
+
+#: ../data/styles/styles.cpp:3
+msgid "Mensural"
+msgstr "Mensural"
+
+#: ../data/styles/styles.cpp:4
+msgid "Triangle"
+msgstr "Triangle"
+
+#, fuzzy
+#~ msgid "Set Quick Marker"
+#~ msgstr "Suprimeix un marcador"
+
+#, fuzzy
+#~ msgid "LilyPond previews not available"
+#~ msgstr "Opcions Lilypond de la mostra prèvia "
+
+#, fuzzy
+#~ msgid "Audio file importer not available"
+#~ msgstr "Memòria per l'escriptura de fitxers d'àudio"
+
+#~ msgid " Triplet Chord"
+#~ msgstr " Tríada"
+
+#~ msgid " Chord"
+#~ msgstr " Acord"
+
+#~ msgid " Triplet"
+#~ msgstr " Treset"
+
+#~ msgid "Making grace notes..."
+#~ msgstr "S'està posant notes d'adornament..."
+
+#~ msgid "Making non-grace notes..."
+#~ msgstr "S'està posant demés notes..."
+
+#~ msgid "Marker name "
+#~ msgstr "Nom del marcador "
+
+#~ msgid "Time Signature font"
+#~ msgstr "Estil de l'indicació de compàs"
+
+#~ msgid "&Halve Speed"
+#~ msgstr "Mitja &velocitat"
+
+#~ msgid "&Double Speed"
+#~ msgstr "&Doble velocitat"
+
+#~ msgid "Halving speed..."
+#~ msgstr "S'està reduint la velocitat a la meitat..."
+
+#~ msgid "Doubling speed..."
+#~ msgstr "S'està doblant la velocitat..."
+
+#~ msgid "Add staff group bracket"
+#~ msgstr "Afegeix "
+
+#~ msgid "Make subsequent bar lines hidden"
+#~ msgstr "Amaga les línies de compàs que segueixen"
+
+#~ msgid "Make &Grace Notes"
+#~ msgstr "&Crea notes d'ornament"
+
+#, fuzzy
+#~ msgid "Change Te&mpo..."
+#~ msgstr "Canvia el color del fragment..."
+
+#, fuzzy
+#~ msgid "Insert Fretboard"
+#~ msgstr "Afegeix un tabulat"
+
+#~ msgid "&Restore Computed Accidentals"
+#~ msgstr "&Restaura els accidents calculats"
+
+#, fuzzy
+#~ msgid "LilyPond export/preview options"
+#~ msgstr "Opcions Lilypond de la mostra prèvia "
+
+#, fuzzy
+#~ msgid "LilyPond 2.6"
+#~ msgstr "Lilypond 2.6"
+
+#, fuzzy
+#~ msgid "LilyPond 2.8"
+#~ msgstr "Lilypond 2.8"
+
+#, fuzzy
+#~ msgid "LilyPond 2.12"
+#~ msgstr "Lilypond 2.2"
+
+#~ msgid "Export Document Properties as \\header block"
+#~ msgstr "Exporta les propietats del document com a bloc \\header"
+
+#, fuzzy
+#~ msgid "prime"
+#~ msgstr "Temps"
+
+#, fuzzy
+#~ msgid " and 1 octave"
+#~ msgstr "Pujar una octava"
+
+#, fuzzy
+#~ msgid " and %1 octaves"
+#~ msgstr "%1 una octava amunt"
+
+#, fuzzy
+#~ msgid "Transpose by Interval"
+#~ msgstr "Transposa"
+
+#~ msgid "Manage Files Associated with A&udio Segments"
+#~ msgstr "Gestiona els fitxers associats amb el fragmetn d'àudio"
+
+#~ msgid "&Add Multiple Tracks..."
+#~ msgstr "&Afageix vàries pistes..."
+
+#, fuzzy
+#~ msgid "Split Segments at Time"
+#~ msgstr "Defineix el temps d'inici del fragment"
+
+#, fuzzy
+#~ msgid "Split Segment at Time"
+#~ msgstr "Defineix el temps d'inici del fragment"
+
+#~ msgid "Add Multiple Tracks"
+#~ msgstr "Afegeix vàries pistes"
+
+#~ msgid ""
+#~ "1.2.3 splash screen photo (of Michael's rose garden)\n"
+#~ "new splash screen photo (of Michael McIntyre's\n"
+#~ "instruments along with a rose from the garden of Hassell Arnold Hale, "
+#~ "1916-2006,\n"
+#~ "may he rest in peace)"
+#~ msgstr ""
+#~ "1.2.3 foto en la pantalla flaix (del jardi de roses d'en Michael)\n"
+#~ "nova foto en la pantalla flaix (dels instrumetns d'en Michael McIntyre\n"
+#~ "junt amb una rosa del jardí d'en Hassell Arnold Hale, 1916-2006,\n"
+#~ "ara descansa en pau) "
+
+#~ msgid "Event List"
+#~ msgstr "Llista d'esdeveniments"
+
+#~ msgid "External Editors"
+#~ msgstr "Editors externs"
+
+#~ msgid "Enable auto-save"
+#~ msgstr "Desa automàticament"
+
+#~ msgid "Auto-save"
+#~ msgstr "Desa automàticament"
+
+#~ msgid "Show detailed status"
+#~ msgstr "Mostra l'estat detalladament"
+
+#~ msgid "JACK command (including path as necessary)"
+#~ msgstr "Línia d'ordres del JACK (amb la ubicació i tot si cal) "
+
+#~ msgid ""
+#~ "Longer buffers usually improve playback quality, but use more memory and "
+#~ "slow response."
+#~ msgstr ""
+#~ "Si utilitzeu una memòria intermèdia gran millorareu la qualitat del so, "
+#~ "però en canvi gastareu més memòria i la resposta serà més lenta."
+
+#~ msgid "Event read-ahead"
+#~ msgstr "Llegeix els esdeveniments previsorament"
+
+#~ msgid "Audio mix buffer"
+#~ msgstr "Memòria per al mesclador d'àudio"
+
+#~ msgid "Audio file read buffer"
+#~ msgstr "Memòria per la lectura de fitxers d'àudio"
+
+#~ msgid "Audio file write buffer"
+#~ msgstr "Memòria per l'escriptura de fitxers d'àudio"
+
+#~ msgid "Per-file limit for cacheable audio files"
+#~ msgstr "Límit de cada fitxer en la memòria cau"
+
+#~ msgid "20 msec"
+#~ msgstr "20 ms"
+
+#~ msgid "5 sec"
+#~ msgstr "5 s"
+
+#~ msgid "per file"
+#~ msgstr "per fitxer"
+
+#~ msgid "32KB"
+#~ msgstr "32KB"
+
+#~ msgid "32MB"
+#~ msgstr "32MB"
+
+#~ msgid "Audio mix and monitor mode:"
+#~ msgstr "Mode mesclador i monitor:"
+
+#~ msgid "Low latency"
+#~ msgstr "Latència baixa"
+
+#~ msgid "Buffered"
+#~ msgstr "En memòria intermèdia"
+
+#~ msgid "Create post-fader outputs for audio instruments"
+#~ msgstr "Crea sortides progressives per als instruments d'àudio"
+
+#~ msgid "Create post-fader outputs for submasters"
+#~ msgstr "Crea sortides d'acabada per als submasters"
+
+#~ msgid "Record and Mix"
+#~ msgstr "Grava i mescla"
+
+#~ msgid "JACK transport mode"
+#~ msgstr "Mode de transport JACK"
+
+#~ msgid "Sync"
+#~ msgstr "Sincronitza"
+
+#~ msgid "Synchronisation"
+#~ msgstr "Sincronització"
+
+#~ msgid "%1 msec / %2 KB %3"
+#~ msgstr "%1 ms / %2 KB %3"
+
+#~ msgid "%1 msec / %2 MB %3"
+#~ msgstr "%1 ms / %2 MB %3"
+
+#~ msgid "%1 sec / %2 KB %3"
+#~ msgstr "%1 s / %2 KB %3"
+
+#~ msgid "%1 sec / %2 MB %3"
+#~ msgstr "%1 s / %2 MB %3"
+
+#~ msgid "%1 msec"
+#~ msgstr "%1 ms"
+
+#~ msgid "%1 sec"
+#~ msgstr "%1 s"
+
+#~ msgid "%1 KB"
+#~ msgstr "%1 KB"
+
+#~ msgid "%1 MB"
+#~ msgstr "%1 MB"
+
+#~ msgid "Other fonts"
+#~ msgstr "Altres tipus de notes"
+
+#~ msgid "Rescan available fonts"
+#~ msgstr "Recarrega els tipus de lletra"
+
+#~ msgid ""
+#~ "Rosegarden can apply automatic quantization to recorded or imported MIDI "
+#~ "data for notation purposes only. This does not affect playback, and does "
+#~ "not affect editing in any of the views except notation."
+#~ msgstr ""
+#~ "El Rosegarden pot quantificar automàticament les dades MIDI gravades o "
+#~ "importades, amb el propòsit d'arreglar la notació. Això no afecta la "
+#~ "reproducció de la peça ni l'editor."
+
+#~ msgid "Sequencer"
+#~ msgstr "Seqüenciador"
+
+#~ msgid "Sequencer Settings"
+#~ msgstr "Configuració del seqüenciador"
+
+#, fuzzy
+#~ msgid "Audio auto-fade"
+#~ msgstr "Entrada o sortida progressiva (auto)"
+
+#~ msgid "Fade in"
+#~ msgstr "Entrada progressiva"
+
+#~ msgid "Fade out"
+#~ msgstr "Sortida regressiva"
+
+#, fuzzy
+#~ msgid "Range"
+#~ msgstr "Triangle"
+
+#, fuzzy
+#~ msgid "High: ---"
+#~ msgstr "Alta"
+
+#~ msgid " ms"
+#~ msgstr " ms"
+
+#, fuzzy
+#~ msgid "&Fretboard"
+#~ msgstr "&Tabulat"
+
+#~ msgid "Restore &Computed Positions"
+#~ msgstr "Restaura les posicions &calculades"
+
+#~ msgid ""
+#~ "You encountered an enharmonic resolution bug somewhere during this "
+#~ "operation. You may wish to save a copy of your current composition and "
+#~ "email it to [email protected] for analysis.\n"
+#~ "\n"
+#~ "In the meantime, you will probably need to make manual adjustments to the "
+#~ "file you've just exported."
+#~ msgstr ""
+#~ "Heu trobat un error en la resolució anharmònica en algun punt, d'aquesta "
+#~ "operació. Si ho desitgeu, podeu desar una còpia de la composició actual i "
+#~ "enviar-la, per correu electrònic, a [email protected] per a "
+#~ "la seva anàlisi\n"
+#~ "\n"
+#~ "Mentrestant, probablement haureu de fer ajustaments manualment al fitxer "
+#~ "que acabeu d'exportar."
+
+#~ msgid "&Tempo and Time Signature"
+#~ msgstr "&Tempo i indicació de compàs"
+
+#, fuzzy
+#~ msgid "&Split..."
+#~ msgstr "&Divideix"
+
+#~ msgid "&Editor Tools"
+#~ msgstr "&Eines de l'editor"
+
+#~ msgid "&Beams"
+#~ msgstr "&Barres d'agrupació"
+
+#~ msgid "&Indications"
+#~ msgstr "&Indicacions"
+
+#~ msgid "Trip&lets and Tuplets"
+#~ msgstr "Tresets i &grups irregulars"
+
+#~ msgid "S&tem Direction"
+#~ msgstr "Direcció de la &vírgula"
+
+#~ msgid "&Clear"
+#~ msgstr "&Neteja"
+
+#~ msgid "A&dd Alias"
+#~ msgstr "A&fegeix un àlies"
+
+#~ msgid "C&ancel"
+#~ msgstr "C&ancel·la"
+
+#~ msgid "&Ok"
+#~ msgstr "D'ac&ord"
+
+#~ msgid "Toggle &Mode"
+#~ msgstr "Canvia el &mode"
+
+#~ msgid "Scale"
+#~ msgstr "Escala"
+
+#~ msgid "Modifier"
+#~ msgstr "Alteració"
+
+#~ msgid "Suffix"
+#~ msgstr "Sufix"
+
+#~ msgid "&New"
+#~ msgstr "&Nou"
+
+#, fuzzy
+#~ msgid "Additivies"
+#~ msgstr "Aditius"
+
+#~ msgid "Fingering"
+#~ msgstr "Digitació"
+
+#, fuzzy
+#~ msgid "LilyPond 2.4"
+#~ msgstr "Lilypond 2.4"
+
+#~ msgid "Paper size to use in \\paper block"
+#~ msgstr "Mida del paper a utilitzar en el \\bloc de paper"
+
+#, fuzzy
+#~ msgid "LilyPond font size"
+#~ msgstr "Mida de la lletra Lilypond"
+
+#~ msgid "Do not export muted tracks"
+#~ msgstr "No exportis les pistes silenciades"
+
+#~ msgid "Write bar checks at end of measures"
+#~ msgstr "Grava la barra de comprovació al final dels compassos"
+
+#~ msgid "Half Speed"
+#~ msgstr "Mitja velocitat"
+
+#~ msgid "Double Speed"
+#~ msgstr "Doble velocitat"
+
+#~ msgid " (takes effect only from next restart)"
+#~ msgstr " (tindrà efecte quan es torni a engegar)"
+
+#~ msgid "&Select"
+#~ msgstr "&Selecciona"
+
+#~ msgid "Snap to 1/64"
+#~ msgstr "Desplaça a 1/64"
+
+#~ msgid "Snap to 1/48"
+#~ msgstr "Desplaça a 1/48"
+
+#~ msgid "Snap to 1/32"
+#~ msgstr "Desplaça a 1/32"
+
+#~ msgid "Snap to 1/24"
+#~ msgstr "Desplaça a 1/24"
+
+#~ msgid "Snap to 1/16"
+#~ msgstr "Desplaça a 1/16"
+
+#~ msgid "Snap to 1/12"
+#~ msgstr "Desplaça a 1/12"
+
+#~ msgid "Snap to 1/8"
+#~ msgstr "Desplaça a 1/8"
+
+#~ msgid "Snap to 1/6"
+#~ msgstr "Desplaça a 1/6"
+
+#~ msgid "Snap to 1/4"
+#~ msgstr "Desplaça a 1/4"
+
+#~ msgid "Snap to &Unit"
+#~ msgstr "Desplaça a la &unitat"
+
+#, fuzzy
+#~ msgid "%1 (%2.%3s)"
+#~ msgstr "Temps: %1 (%2.%3s)"
+
+#, fuzzy
+#~ msgid "%1 (%2): %3"
+#~ msgstr "%1 (%2)"
+
+#~ msgid "Add Fretboard"
+#~ msgstr "Afegeix un tabulat"
+
+#~ msgid "Getting sound driver status..."
+#~ msgstr "S'està obtenint l'estat del dispositiu de so..."
+
+#~ msgid "Distribute Audio on &MIDI"
+#~ msgstr "Envia l'àudio al MIDI"
+
+#~ msgid "Cannot add file %1: %2"
+#~ msgstr "No s'ha pogut afegir el fitxer %1: %2"
+
+#~ msgid "Enable"
+#~ msgstr "Habilita"
+
+#~ msgid "from:"
+#~ msgstr "des de:"
+
+#~ msgid "to:"
+#~ msgstr "fins:"
+
+#~ msgid "unlimited"
+#~ msgstr "il·limitada"
+
+#~ msgid "Number:"
+#~ msgstr "Número:"
+
+#~ msgid "Value:"
+#~ msgstr "Valor:"
+
+#~ msgid "Wheel Events"
+#~ msgstr "Esdeveniments de roda"
+
+#~ msgid "Amount:"
+#~ msgstr "Quantitat:"
+
+#, fuzzy
+#~ msgid "Pitch from"
+#~ msgstr "Altura "
+
+#, fuzzy
+#~ msgid "Pitch to"
+#~ msgstr "Altura "
+
+#, fuzzy
+#~ msgid "High: %1"
+#~ msgstr "Alta"
+
+#~ msgid "&Velocity"
+#~ msgstr "&Velocitat"
+
+#, fuzzy
+#~ msgid "Advanced Event Edit"
+#~ msgstr "Editor &avançat d'esdeveniments"
+
+#~ msgid "Advanced Event Viewer"
+#~ msgstr "Vista &avançada d'esdeveniments"
+
+#, fuzzy
+#~ msgid ""
+#~ "About to delete 1 audio file permanently from the hard disk.\n"
+#~ "There will be no way to recover this file.\n"
+#~ "Are you sure?"
+#~ msgstr ""
+#~ "_n: S'esborrarà el fitxer d'àudio permanentment.\n"
+#~ "No es podrà recuperar.\n"
+#~ "Voleu continuar?\n"
+#~ "S'esborraran els %n fitxers d'àudio permanentment.\n"
+#~ "No es podran recuperar.\n"
+#~ "Voleu continuar?"
+
+#, fuzzy
+#~ msgid "%1 on 1 track"
+#~ msgstr "Grava en aquesta pista"
+
+#~ msgid "1 Input"
+#~ msgstr "1 Entrada"
+
+#~ msgid "1 Submaster"
+#~ msgstr "Cap submaster"
+
+#, fuzzy
+#~ msgid " 1 event selected "
+#~ msgstr "No s'ha seleccionat cap fragment de no-àudio"
+
+#~ msgid "%1 - 1 Segment - %2"
+#~ msgstr "%1 - 1 fragment - %2"
+
+#~ msgid "1 pixel"
+#~ msgstr "1 píxel"
+
+#~ msgid "%1 - Segment - Notation"
+#~ msgstr "%1 - Fragment - Partitura"
+
+#, fuzzy
+#~ msgid ""
+#~ "About to delete 1 audio file permanently from the hard disk.\n"
+#~ "This action cannot be undone, and there will be no way to recover this "
+#~ "file.\n"
+#~ "Are you sure?"
+#~ msgstr ""
+#~ "_n: S'esborrarà el fitxer d'àudio permanentment.\n"
+#~ "No es podrà recuperar.\n"
+#~ "Voleu continuar?\n"
+#~ "S'esborraran els %n fitxers d'àudio permanentment.\n"
+#~ "No es podran recuperar.\n"
+#~ "Voleu continuar?"
+
+#~ msgid "Time: %1"
+#~ msgstr "Temps: %1"
+
+#~ msgid ""
+#~ "<p>A Rosegarden composition is not infinite, and does not automatically "
+#~ "expand\n"
+#~ "if you attempt to insert events beyond the end of it. While recording, "
+#~ "you will see a\n"
+#~ "countdown showing you how much time you have remaining. In order to "
+#~ "extend\n"
+#~ "this, use <b>Composition -> Change Composition Duration</b></p>\n"
+#~ msgstr ""
+#~ "<p>Una composició del Rosegarden no és infinita, i no s'expandeix "
+#~ "automàticament a\n"
+#~ "l'intentar inserir esdeveniments més enllà del final. Durant "
+#~ "l'enregistrament, veureu un compte\n"
+#~ "enrere que mostra el temps que queda. Si voleu allargar aquest temps, feu "
+#~ "servir <b>Composició -> \n"
+#~ "Canvia la durada de la composició</b></p>\n"
+
+#~ msgid ""
+#~ "<p>The notation view shows you notes using their display duration, while "
+#~ "the\n"
+#~ "matrix allows you to edit their performance duration.</p>\n"
+#~ msgstr ""
+#~ "<p> La vista de l'editor de partitures mostra les notes fent servir la "
+#~ "seva durada de la notació, \n"
+#~ "mentre que l'editor de matrius permet editar la seva durada d'execució.</"
+#~ "p>\n"
+
+#~ msgid "Tempo changes smoothly to:"
+#~ msgstr "El tempo canvia suaument per:"
+
+#~ msgid "Recording Channel:"
+#~ msgstr "Canal de gravació:"
+
+#~ msgid ""
+#~ "Spanish translation\n"
+#~ "ALSA hacking and bug fixes\n"
+#~ "multi-input MIDI recording"
+#~ msgstr ""
+#~ "traducció a l'espanyol\n"
+#~ "hacking amb ALSA i correccions d'errors\n"
+#~ "enregistrament MIDI des de múltiples entrades"
+
+#~ msgid "Finnish translation"
+#~ msgstr "traducció al finès"
+
+#~ msgid "Close this tab"
+#~ msgstr "Tanca aquesta pestanya"
+
+#~ msgid "Preview of the selected font"
+#~ msgstr "Mostra un exemple del tipus de lletra seleccionat"
+
+#~ msgid ""
+#~ "This is a preview of the selected font. You can change it by clicking the "
+#~ "\"Choose...\" button."
+#~ msgstr ""
+#~ "Això és un exemple del tipus de lletra seleccionat. Per canviar cliqueu "
+#~ "el botó \"Tria...\"."
+
+#~ msgid "Preview of the \"%1\" font"
+#~ msgstr "Exemple del tipus de lletra \"%1\""
+
+#~ msgid ""
+#~ "This is a preview of the \"%1\" font. You can change it by clicking the "
+#~ "\"Choose...\" button."
+#~ msgstr ""
+#~ "Això és un exemple del tipus de lletra seleccionat \"%1\". Per canviar "
+#~ "cliqueu el botó \"Tria...\"."
+
+#~ msgid "Segment & Instrument Parameters"
+#~ msgstr "Paràmetres de l'instrument i el fragment"
+
+#~ msgid "Pre&view Lilypond file..."
+#~ msgstr "&Visualització prèvia del fitxer Lilypond..."
+
+#~ msgid "Show Se&gment and Instrument Parameters"
+#~ msgstr "Mostra els paràmetres de l'instrument i del fragment"
+
+#~ msgid "%1 Pitch"
+#~ msgstr "Altura %1"
+
+#~ msgid "&Split or Join"
+#~ msgstr "&Divideix i ajunta"
+
+#~ msgid "Lilypond 1.6 or 1.8"
+#~ msgstr "Lilypond 1.6 o 1.8"
+
+#~ msgid "Lilypond 2.0"
+#~ msgstr "Lilypond 2.0"
+
+#~ msgid "<timing has gone astray>"
+#~ msgstr "<el temps s'ha esgarriat>"
diff --git a/po/cs.po b/po/cs.po
new file mode 100644
index 0000000..e38ddae
--- /dev/null
+++ b/po/cs.po
@@ -0,0 +1,11518 @@
+# translation of cs.po to
+# This file is put in the public domain.
+#
+# Jan Bína <[email protected]>, 2005.
+# Jan Bina <[email protected]>, 2006, 2007.
+# Jan Bína <[email protected]>, 2008.
+msgid ""
+msgstr ""
+"Project-Id-Version: cs\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-04-24 18:19-0400\n"
+"PO-Revision-Date: 2008-04-20 12:41+0200\n"
+"Last-Translator: Jan Bína <[email protected]>\n"
+"Language-Team: <[email protected]>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.4\n"
+
+#: ../src/gui/dialogs/RescaleDialog.cpp:51 rc.cpp:192 rc.cpp:312
+#, no-c-format
+msgid "Rescale"
+msgstr "Změnit délku"
+
+#: ../src/gui/dialogs/RescaleDialog.cpp:56
+msgid "Duration of selection"
+msgstr "Doba trvání výběru"
+
+#: ../src/gui/dialogs/RescaleDialog.cpp:62
+msgid "Adjust times of following events accordingly"
+msgstr "Přizpůsobit adekvátně časy následujících událostí"
+
+#: ../src/gui/dialogs/PitchDialog.cpp:45
+#: ../src/gui/dialogs/RescaleDialog.cpp:72
+#: ../src/gui/dialogs/TimeDialog.cpp:51 ../src/gui/dialogs/TimeDialog.cpp:68
+#: ../src/gui/studio/BankEditorDialog.cpp:109
+msgid "Reset"
+msgstr "Reset"
+
+#: ../src/commands/segment/SegmentSplitByPitchCommand.cpp:46
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:46
+msgid "Split by Pitch"
+msgstr "Rozdělit podle výšky tónu"
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:54
+msgid "Starting split pitch"
+msgstr "Začíná dělení výšky tónu"
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:57
+msgid "Range up and down to follow music"
+msgstr "Rozsah nahoru nebo dolů podle melodie"
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:63
+msgid "Duplicate non-note events"
+msgstr "Duplikovat ne-notové události"
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:66
+msgid "Clef handling:"
+msgstr "Zacházení s notový klíčem:"
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:69
+msgid "Leave clefs alone"
+msgstr "Ponechat notové klíče samostatně"
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:70
+msgid "Guess new clefs"
+msgstr "Odhadnout nové notové klíče"
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:71
+msgid "Use treble and bass clefs"
+msgstr "Použít houslové a basové klíče"
+
+#: ../src/gui/dialogs/DocumentConfigureDialog.cpp:64
+msgid "Document Properties"
+msgstr "Vlastnosti dokumentu"
+
+#: ../src/gui/dialogs/MakeOrnamentDialog.cpp:45
+#: ../src/gui/editors/notation/NotationView.cpp:6048
+msgid "Make Ornament"
+msgstr "Vytvořit melodickou ozdobu"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:183
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:179
+#: ../src/gui/dialogs/EventEditDialog.cpp:128
+#: ../src/gui/dialogs/MakeOrnamentDialog.cpp:49
+#: ../src/gui/studio/DeviceEditorDialog.cpp:74
+#: ../src/gui/studio/NameSetEditor.cpp:72
+#: ../src/gui/widgets/ColourTable.cpp:51
+msgid "Name"
+msgstr "Jméno"
+
+#: ../src/gui/dialogs/MakeOrnamentDialog.cpp:51
+msgid ""
+"The name is used to identify both the ornament\n"
+"and the triggered segment that stores\n"
+"the ornament's notes."
+msgstr ""
+"Název se používá k identifikaci melodické ozdoby\n"
+"i spouštěného segmentu, ve kterém jsou\n"
+"noty s melodickými ozdobami uloženy."
+
+#: ../src/gui/dialogs/MakeOrnamentDialog.cpp:54
+msgid "Name: "
+msgstr "Název: "
+
+#: ../src/gui/dialogs/MakeOrnamentDialog.cpp:57
+#: ../src/gui/editors/eventlist/EventView.cpp:717
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:92
+msgid "Base pitch"
+msgstr "Základní výška tónu"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:57
+#: ../src/gui/editors/eventlist/EventView.cpp:140
+msgid "Text"
+msgstr "Text"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:66
+msgid "Specification"
+msgstr "Specifikace"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:68
+msgid "Preview"
+msgstr "Náhled"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:72
+msgid "Text: "
+msgstr "Text: "
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:79
+msgid "Style: "
+msgstr "Styl: "
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:90
+msgid "Dynamic"
+msgstr "Dynamika"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:93
+msgid "Direction"
+msgstr "Směr"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:96
+msgid "Local Direction"
+msgstr "Lokální směr"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:63
+#: ../src/gui/dialogs/TextEventDialog.cpp:99
+#: ../src/gui/editors/tempo/TempoView.cpp:91
+msgid "Tempo"
+msgstr "Tempo"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:102
+msgid "Local Tempo"
+msgstr "Lokální tempo"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:105
+msgid "Lyric"
+msgstr "Text melodie"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:108
+#: ../src/gui/editors/notation/NotationView.cpp:4242
+msgid "Chord"
+msgstr "Akord"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:111
+msgid "Annotation"
+msgstr "Anotace"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:114
+msgid "LilyPond Directive"
+msgstr "Direktiva aplikace Lilypond"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:138
+msgid "Verse: "
+msgstr "Sloka:"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:148
+msgid "Dynamic: "
+msgstr "Dynamika:"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:152
+msgid "ppp"
+msgstr "ppp"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:153
+msgid "pp"
+msgstr "pp"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:154
+msgid "p"
+msgstr "p"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:155
+msgid "mp"
+msgstr "mp"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:156
+msgid "mf"
+msgstr "mf"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:157
+msgid "f"
+msgstr "f"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:158
+msgid "ff"
+msgstr "ff"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:159
+msgid "fff"
+msgstr "fff"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:160
+msgid "rfz"
+msgstr "rfz"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:161
+msgid "sf"
+msgstr "sf"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:165
+msgid "Direction: "
+msgstr "Směr:"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:174
+msgid " ,"
+msgstr " ,"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:175
+msgid "D.C. al Fine"
+msgstr "D.C. al Fine"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:176
+msgid "D.S. al Fine"
+msgstr "D.S. al Fine"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:177
+msgid "Fine"
+msgstr "Fine"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:178
+msgid "D.S. al Coda"
+msgstr "D.S. al Coda"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:179
+msgid "to Coda"
+msgstr "k označení Coda"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:180
+msgid "Coda"
+msgstr "Coda"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:184
+msgid "Local Direction: "
+msgstr "Lokální směr:"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:188
+msgid "accel."
+msgstr "accel."
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:189
+msgid "ritard."
+msgstr "ritard."
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:190
+msgid "ralletando"
+msgstr "ralletando"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:191
+msgid "a tempo"
+msgstr "a tempo"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:192
+msgid "legato"
+msgstr "legato"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:193
+msgid "simile"
+msgstr "simile"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:194
+msgid "pizz."
+msgstr "pizz."
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:195
+msgid "arco"
+msgstr "arco"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:196
+msgid "non vib."
+msgstr "non vib."
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:197
+msgid "sul pont."
+msgstr "sul pont."
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:198
+#: ../src/gui/dialogs/TextEventDialog.cpp:200
+msgid "sul tasto"
+msgstr "sul tasto"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:199
+msgid "con legno"
+msgstr "con legno"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:201
+msgid "sul G"
+msgstr "sul G"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:202
+msgid "ordinario"
+msgstr "ordinario"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:203
+msgid "Muta in "
+msgstr "Muta in "
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:204
+msgid "volti subito "
+msgstr "volti subito "
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:205
+msgid "soli"
+msgstr "soli"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:206
+msgid "div."
+msgstr "div."
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:210
+msgid "Tempo: "
+msgstr "Tempo:"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:214
+#: ../src/gui/dialogs/TextEventDialog.cpp:238
+msgid "Grave"
+msgstr "Grave"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:215
+#: ../src/gui/dialogs/TextEventDialog.cpp:239
+msgid "Adagio"
+msgstr "Adagio"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:216
+#: ../src/gui/dialogs/TextEventDialog.cpp:240
+msgid "Largo"
+msgstr "Largo"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:217
+#: ../src/gui/dialogs/TextEventDialog.cpp:241
+msgid "Lento"
+msgstr "Lento"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:218
+#: ../src/gui/dialogs/TextEventDialog.cpp:242
+msgid "Andante"
+msgstr "Andante"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:219
+#: ../src/gui/dialogs/TextEventDialog.cpp:243
+msgid "Moderato"
+msgstr "Moderato"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:220
+#: ../src/gui/dialogs/TextEventDialog.cpp:244
+msgid "Allegretto"
+msgstr "Allegretto"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:221
+#: ../src/gui/dialogs/TextEventDialog.cpp:245
+msgid "Allegro"
+msgstr "Allegro"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:222
+#: ../src/gui/dialogs/TextEventDialog.cpp:246
+msgid "Vivace"
+msgstr "Vivace"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:223
+#: ../src/gui/dialogs/TextEventDialog.cpp:247
+msgid "Presto"
+msgstr "Presto"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:224
+#: ../src/gui/dialogs/TextEventDialog.cpp:248
+msgid "Prestissimo"
+msgstr "Prestissimo"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:225
+#: ../src/gui/dialogs/TextEventDialog.cpp:249
+msgid "Maestoso"
+msgstr "Maestoso"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:226
+#: ../src/gui/dialogs/TextEventDialog.cpp:250
+msgid "Sostenuto"
+msgstr "Sostenuto"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:227
+#: ../src/gui/dialogs/TextEventDialog.cpp:251
+msgid "Tempo Primo"
+msgstr "Tempo Primo"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:234
+msgid "Local Tempo: "
+msgstr "Lokální tempo:"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:255
+msgid "Directive: "
+msgstr "Direktiva:"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:312
+msgid "Example"
+msgstr "Příklad"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:65
+msgid "Event Filter"
+msgstr "Filtr událostí"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:86
+msgid "Note Events"
+msgstr "Notové události"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:90
+msgid "lowest:"
+msgstr "nejnižší:"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:93
+msgid "highest:"
+msgstr "nejvyšší:"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:96
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:141
+#: ../src/gui/widgets/PitchChooser.cpp:53
+msgid "Pitch:"
+msgstr "Výška tónu:"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:99
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:163
+msgid "Velocity:"
+msgstr "Rychlost:"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:102
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:129
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:257
+msgid "Duration:"
+msgstr "Doba trvání:"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:107
+#: ../src/gui/dialogs/EventFilterDialog.cpp:114
+#: ../src/gui/dialogs/EventFilterDialog.cpp:121
+msgid "include"
+msgstr "zahrnout"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:108
+#: ../src/gui/dialogs/EventFilterDialog.cpp:115
+#: ../src/gui/dialogs/EventFilterDialog.cpp:122
+msgid "exclude"
+msgstr "vyřadit"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:136
+#: ../src/gui/dialogs/EventFilterDialog.cpp:155
+#: ../src/gui/editors/eventlist/EventView.cpp:172
+#: ../src/gui/editors/eventlist/EventView.cpp:179
+#: ../src/gui/editors/eventlist/EventView.cpp:186
+msgid "edit"
+msgstr "upravit"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:141
+#: ../src/gui/dialogs/EventFilterDialog.cpp:157
+msgid "choose a pitch using a staff"
+msgstr "vybrat výšku tónu pomocí osnovy"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:182
+#: ../src/gui/dialogs/EventFilterDialog.cpp:188
+msgid "longest"
+msgstr "nejdelší"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:200
+msgid "Include all"
+msgstr "Zahrnout vše"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:203
+msgid "Include entire range of values"
+msgstr "Zahrnout celý rozsah hodnot"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:206
+msgid "Exclude all"
+msgstr "Vyřadit vše"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:209
+msgid "Exclude entire range of values"
+msgstr "Vyřadit celý rozsah hodnot"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:233
+#: ../src/gui/dialogs/EventFilterDialog.cpp:234
+msgid "shortest"
+msgstr "nejkratší"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:333
+msgid "Lowest pitch"
+msgstr "Nejnižší výška tónu"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:343
+msgid "Highest pitch"
+msgstr "Nejvyšší výška tónu"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:56
+#: ../src/gui/editors/notation/NotationView.cpp:1619
+#: ../src/gui/editors/notation/NotationView.cpp:6088
+msgid "Use Ornament"
+msgstr "Použít melodickou ozdobu"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:260
+#: ../src/gui/configuration/NotationConfigurationPage.h:64
+#: ../src/gui/configuration/NotationConfigurationPage.h:65
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:63
+msgid "Notation"
+msgstr "Notace"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:68
+msgid "Display as: "
+msgstr "Zobrazit jako: "
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:84
+msgid "Trill"
+msgstr "Trylek"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:84
+msgid "Trill with line"
+msgstr "Trylek s linkou"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:84
+msgid "Trill line only"
+msgstr "Pouze trylková linka"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:85
+msgid "Turn"
+msgstr "Obal"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:85
+msgid "Mordent"
+msgstr "Mordent"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:85
+msgid "Inverted mordent"
+msgstr "Invertovaný mordent"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:86
+msgid "Long mordent"
+msgstr "Dlouhý mordent"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:86
+msgid "Long inverted mordent"
+msgstr "Dlouhý invertovaný mordent"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:94
+msgid "Text mark"
+msgstr "Textová značka"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:98
+msgid " Text: "
+msgstr " Text: "
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:104
+msgid "Performance"
+msgstr "Provedení"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:109
+msgid "Perform using triggered segment: "
+msgstr "Provést s použitím spouštěného segmentu: "
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:75
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:123
+msgid "Perform with timing: "
+msgstr "Provést s dělením dob: "
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:81
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:129
+msgid "As stored"
+msgstr "Jako uložené"
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:82
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:130
+msgid "Truncate if longer than note"
+msgstr "Zkrátit, je-li delší než nota"
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:83
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:131
+msgid "End at same time as note"
+msgstr "Skončit zároveň s notou"
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:84
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:132
+msgid "Stretch or squash segment to note duration"
+msgstr "Prodloužit nebo zkrátit segment podle doby trvání noty"
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:86
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:134
+msgid "Adjust pitch to note"
+msgstr "Přizpůsobit výšku tónu notě"
+
+#: ../src/gui/dialogs/PitchPickerDialog.cpp:40
+msgid "Pitch Selector"
+msgstr "Selektor výšky tónu"
+
+#: ../src/gui/dialogs/BeatsBarsDialog.cpp:44
+msgid "Audio Segment Duration"
+msgstr "Doba trvání zvukového segmentu"
+
+#: ../src/gui/dialogs/BeatsBarsDialog.cpp:50
+msgid "The selected audio segment contains:"
+msgstr "Vybraný zvukový segment obsahuje:"
+
+#: ../src/gui/dialogs/BeatsBarsDialog.cpp:59
+msgid "beat(s)"
+msgstr "doba(y)"
+
+#: ../src/gui/dialogs/BeatsBarsDialog.cpp:60
+msgid "bar(s)"
+msgstr "taktová čára(y)"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:51
+msgid "Tuplet"
+msgstr "Rytmická notová skupina"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:58
+msgid "New timing for tuplet group"
+msgstr "Nové dělení dob pro rytmickou notovou skupinu"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:76
+msgid "Play "
+msgstr "Hrát "
+
+#: ../src/gui/dialogs/TupletDialog.cpp:98
+msgid "in the time of "
+msgstr "za dobu"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:104
+msgid "Timing is already correct: update display only"
+msgstr "Dělení dob je již správné: pouze aktualizovat zobrazení"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:114
+msgid "Timing calculations"
+msgstr "Výpočty dělení dob"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:120
+msgid "Selected region:"
+msgstr "Vybraná oblast:"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:129
+msgid "Group with current timing:"
+msgstr "Seskupit s použitím aktuálního dělení dob:"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:135
+msgid "Group with new timing:"
+msgstr "Seskupit s použitím nového dělení dob:"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:141
+msgid "Gap created by timing change:"
+msgstr "Rozdíl způsobený změnou dělení dob:"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:149
+msgid "Unchanged at end of selection:"
+msgstr "Nezměněno na konci výběru:"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:63 rc.cpp:372
+#, no-c-format
+msgid "Metronome"
+msgstr "Metronom"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:77
+msgid "Metronome Instrument"
+msgstr "Nástroj metronomu"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:82
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:150
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:183
+#: ../src/gui/studio/DeviceEditorDialog.cpp:73
+#: ../src/gui/studio/DeviceManagerDialog.cpp:105
+#: ../src/gui/studio/DeviceManagerDialog.cpp:163
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:66
+msgid "Device"
+msgstr "Zařízení"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:101
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:89
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:215
+#: ../src/gui/studio/DeviceEditorDialog.cpp:195
+#: ../src/gui/studio/DeviceEditorDialog.cpp:218
+#: ../src/gui/studio/DeviceEditorDialog.cpp:230
+#: ../src/gui/studio/DeviceManagerDialog.cpp:196
+#: ../src/gui/studio/DeviceManagerDialog.cpp:440
+#: ../src/gui/studio/DeviceManagerDialog.cpp:452
+msgid "No connection"
+msgstr "Není připojení"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:112
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:111
+#: ../src/gui/editors/parameters/InstrumentParameterBox.cpp:53
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:1209
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:159
+#: ../src/gui/general/PresetHandlerDialog.cpp:92
+#: ../src/gui/studio/MidiMixerWindow.cpp:204
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:67
+msgid "Instrument"
+msgstr "Nástroj"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:118
+msgid "Beats"
+msgstr "Doby"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:184
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:123
+msgid "Resolution"
+msgstr "Rozlišení"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:309
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:139
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:205
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:125
+#: ../src/gui/editors/matrix/MatrixView.cpp:2132
+#: ../src/gui/editors/notation/NotationView.cpp:1582
+#: ../src/gui/widgets/QuantizeParameters.cpp:128
+#: ../src/gui/widgets/QuantizeParameters.cpp:301
+msgid "None"
+msgstr "Žádný"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:126
+msgid "Bars only"
+msgstr "Pouze taktové čáry"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:127
+msgid "Bars and beats"
+msgstr "Taktové čáry a doby"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:128
+msgid "Bars, beats, and divisions"
+msgstr "Taktové čáry, doby a figurace"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:132
+msgid "Bar velocity"
+msgstr "Rychlost taktových čar"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:139
+msgid "Beat velocity"
+msgstr "Rychlost dob"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:146
+msgid "Sub-beat velocity"
+msgstr "Rychlost vedlejších dob"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:155
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:324
+msgid "Pitch"
+msgstr "Výška tónu"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:160
+msgid "for Bar"
+msgstr "na taktovou čáru"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:161
+msgid "for Beat"
+msgstr "na dobu"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:162
+msgid "for Sub-beat"
+msgstr "na vedlejší dobu"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:166
+msgid "Metronome Activated"
+msgstr "Metronom je aktivován"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:167
+msgid "Playing"
+msgstr "Probíhá přehrávání"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:168
+msgid "Recording"
+msgstr "Probíhá záznam"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:46
+msgid "Choose Text Encoding"
+msgstr "Vybrat kódování textu"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:50
+msgid ""
+"\n"
+"This file contains text in an unknown language encoding.\n"
+"\n"
+"Please select one of the following estimated text encodings\n"
+"for use with the text in this file:\n"
+msgstr ""
+"\n"
+"Tento soubor obsahuje text v neznámém jazykovém kódování.\n"
+"\n"
+"Zvolte jedno z následujících předpokládaných kódování textu,\n"
+"které bude použito na text v tomto souboru:\n"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:61
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:77
+msgid "Japanese Shift-JIS"
+msgstr "Japonština Shift-JIS"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:62
+msgid "Unicode variable-width"
+msgstr "Unicode, proměnná šířka"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:63
+msgid "Western Europe"
+msgstr "Západní Evropa"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:64
+msgid "Western Europe + Euro"
+msgstr "Západní Evropa + Euro"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:65
+msgid "Eastern Europe"
+msgstr "Východní Evropa"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:66
+msgid "Southern Europe"
+msgstr "Jižní Evropa"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:67
+msgid "Northern Europe"
+msgstr "Severní Evropa"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:68
+msgid "Cyrillic"
+msgstr "Cyrilice"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:69
+msgid "Arabic"
+msgstr "Arabština"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:70
+msgid "Greek"
+msgstr "Řečtina"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:71
+msgid "Hebrew"
+msgstr "Hebrejština"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:72
+msgid "Turkish"
+msgstr "Turečtina"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:73
+msgid "Nordic"
+msgstr "Skandinávské jazyky"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:74
+msgid "Thai"
+msgstr "Thajština"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:75
+msgid "Baltic"
+msgstr "Baltské jazyky"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:76
+msgid "Celtic"
+msgstr "Keltské jazyky"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:78
+msgid "Traditional Chinese"
+msgstr "Tradiční čínština"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:79
+msgid "Simplified Chinese"
+msgstr "Zjednodušená čínština"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:80
+msgid "Russian"
+msgstr "Ruština"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:81
+msgid "Ukrainian"
+msgstr "Ukrajinština"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:82
+msgid "Tamil"
+msgstr "Tamilština"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:117
+#, c-format
+msgid "Microsoft Code Page %1"
+msgstr "Kódová stránka Microsoft %1"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:123
+#: ../src/gui/editors/matrix/MatrixView.cpp:1490
+msgid "%1 (%2)"
+msgstr "%1 (%2)"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:142
+msgid ""
+"\n"
+"Example text from file:"
+msgstr ""
+"\n"
+"Vzor textu ze souboru:"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:59
+#: ../src/gui/editors/tempo/TempoView.cpp:92
+msgid "Time Signature"
+msgstr "Taktové označení"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:82
+msgid "Time signature"
+msgstr "Taktové označení"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:116
+msgid "Time where signature takes effect"
+msgstr "Takt, ve kterém se označení uplatňuje"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:83
+#: ../src/gui/dialogs/TempoDialog.cpp:128
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:129
+#: ../src/gui/general/PresetHandlerDialog.cpp:101
+msgid "Scope"
+msgstr "Oblast"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:141
+#, c-format
+msgid "Insertion point is at start of measure %1."
+msgstr "Bod vložení je na začátku %1 taktu."
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:145
+#, c-format
+msgid "Insertion point is in the middle of measure %1."
+msgstr "Bod vložení je uprostřed %1 taktu."
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:150
+msgid "Insertion point is at start of composition."
+msgstr "Bod vložení je na začátku skladby."
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:155
+msgid "Start measure %1 here"
+msgstr "Takt %1 začít zde"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:159
+#, c-format
+msgid "Change time from start of measure %1"
+msgstr "Změnit taktové označení od začátku taktu %1"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:166
+#, c-format
+msgid "Time change will take effect at the start of measure %1."
+msgstr "Změna taktového označení se uplatní od začátku taktu %1."
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:176
+msgid "Hide the time signature"
+msgstr "Skrýt taktové označení"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:181
+msgid "Hide the affected bar lines"
+msgstr "Skrýt odpovídající taktové čáry"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:186
+msgid "Show as common time"
+msgstr "Zobrazit jako 4/4 takt"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:191
+msgid "Correct the durations of following measures"
+msgstr "Opravit dobu trvání následujících taktů"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:280
+msgid "Display as common time"
+msgstr "Zobrazit jako 4/4 takt"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:284
+msgid "Display as cut common time"
+msgstr "Zobrazit jako alla breve"
+
+#: ../src/gui/dialogs/ConfigureDialog.cpp:66
+msgid "Configure Rosegarden"
+msgstr "Konfigurace aplikace Rosegarden"
+
+#: ../src/gui/dialogs/MarkerModifyDialog.cpp:53
+#: ../src/gui/dialogs/MarkerModifyDialog.cpp:61
+msgid "Edit Marker"
+msgstr "Upravit záložku"
+
+#: ../src/gui/dialogs/MarkerModifyDialog.cpp:78
+msgid "Marker Time"
+msgstr "Čas záložky"
+
+#: ../src/gui/dialogs/MarkerModifyDialog.cpp:94
+msgid "Marker Properties"
+msgstr "Vlastnosti záložky"
+
+#: ../src/gui/dialogs/MarkerModifyDialog.cpp:100
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:554
+msgid "Text:"
+msgstr "Text:"
+
+#: ../src/gui/dialogs/MarkerModifyDialog.cpp:104
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:85
+msgid "Description:"
+msgstr "Popis:"
+
+#: ../src/gui/dialogs/FileMergeDialog.cpp:46
+msgid "Merge File"
+msgstr "Připojit soubor"
+
+#: ../src/gui/dialogs/FileMergeDialog.cpp:53
+msgid "Merge new file "
+msgstr "Připojit nový soubor "
+
+#: ../src/gui/dialogs/FileMergeDialog.cpp:56
+msgid "At start of existing composition"
+msgstr "Na začátek existující skladby"
+
+#: ../src/gui/dialogs/FileMergeDialog.cpp:57
+msgid "From end of existing composition"
+msgstr "Od konce existující skladby"
+
+#: ../src/gui/dialogs/FileMergeDialog.cpp:61
+msgid "The file has different time signatures or tempos."
+msgstr "Soubor má jiná taktová označení nebo jiná tempa."
+
+#: ../src/gui/dialogs/FileMergeDialog.cpp:62
+msgid "Import these as well"
+msgstr "Importovat také toto"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:171
+#: ../src/gui/dialogs/ShowSequencerStatusDialog.cpp:44
+msgid "Sequencer status"
+msgstr "Stav sekvenceru"
+
+#: ../src/gui/dialogs/ShowSequencerStatusDialog.cpp:48
+msgid "Sequencer status:"
+msgstr "Stav sekvenceru:"
+
+#: ../src/gui/dialogs/ShowSequencerStatusDialog.cpp:50
+msgid "Status not available."
+msgstr "Stav není dostupný."
+
+#: ../src/gui/dialogs/ShowSequencerStatusDialog.cpp:57
+msgid "Sequencer is not running or is not responding."
+msgstr "Sekvencer není spuštěný nebo neodpovídá."
+
+#: ../src/gui/dialogs/ShowSequencerStatusDialog.cpp:64
+msgid "Sequencer is not returning a valid status report."
+msgstr "Sekvencer nevrací platnou zprávu o svém stavu."
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:46
+msgid "Add Tracks"
+msgstr "Přidat stopy"
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:54
+msgid "How many tracks do you want to add?"
+msgstr "Kolik stop chcete přidat?"
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:62
+msgid "Add tracks"
+msgstr "Přidat stopy"
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:64
+msgid "At the top"
+msgstr ""
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:65
+#, fuzzy
+msgid "Above the current selected track"
+msgstr "Ztlumení všech stop kromě aktuálně vybrané"
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:66
+#, fuzzy
+msgid "Below the current selected track"
+msgstr "Ztlumení všech stop kromě aktuálně vybrané"
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:67
+msgid "At the bottom"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:75
+msgid "Event Properties"
+msgstr "Vlastnosti události"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:81
+msgid "Event type:"
+msgstr "Typ události:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:117
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:251
+#: ../src/gui/editors/segment/MarkerEditor.cpp:97
+msgid "Absolute time:"
+msgstr "Absolutní čas:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:156
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:323
+msgid "Controller name:"
+msgstr "Název ovládacího prvku:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:157
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:530
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:562
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:563
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:602
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:631
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:267
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:269
+#: ../src/gui/editors/segment/MarkerEditor.cpp:279
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:272
+#: ../src/gui/studio/AudioMixerWindow.cpp:388
+#: ../src/gui/studio/AudioMixerWindow.cpp:519
+#: ../src/gui/studio/AudioMixerWindow.cpp:683
+#: ../src/gui/studio/AudioMixerWindow.cpp:722
+#: ../src/gui/studio/AudioMixerWindow.cpp:904
+#: ../src/gui/studio/SynthPluginManagerDialog.cpp:121
+msgid "<none>"
+msgstr "<žádný>"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:174
+msgid "Meta string:"
+msgstr "Meta řetězec:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:179
+msgid "Load data"
+msgstr "Načíst data"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:181
+msgid "Save data"
+msgstr "Uložit data"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:192
+msgid "Notation Properties"
+msgstr "Vlastnosti notace"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:198
+msgid "Lock to changes in performed values"
+msgstr "Uzamknout před změnami přehrávaných hodnot"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:205
+msgid "Notation time:"
+msgstr "Čas notace:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:217
+msgid "Notation duration:"
+msgstr "Doba trvání notace:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:283
+msgid "Note pitch:"
+msgstr "Výška noty:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:291
+msgid "Note velocity:"
+msgstr "Rychlost noty:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:317
+msgid "Controller number:"
+msgstr "Číslo ovládacího prvku:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:326
+msgid "Controller value:"
+msgstr "Hodnota ovládacího prvku:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:354
+msgid "Key pitch:"
+msgstr "Výška tónu klávesy:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:362
+msgid "Key pressure:"
+msgstr "Tlaková citlivost klávesy:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:390
+msgid "Channel pressure:"
+msgstr "Kanálová tlaková citlivost:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:418
+msgid "Program change:"
+msgstr "Změna programu:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:461
+msgid "Data length:"
+msgstr "Délka dat:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:462
+msgid "Data:"
+msgstr "Data:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:480
+msgid "Pitchbend MSB:"
+msgstr "Ohýbání výšky tónu MSB:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:488
+msgid "Pitchbend LSB:"
+msgstr "Ohýbání výšky tónu LSB:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:523
+msgid "Indication:"
+msgstr "Označení způsobu hry:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:553
+msgid "Text type:"
+msgstr "Typ textu:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:596
+msgid "Clef type:"
+msgstr "Typ notového klíče:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:625
+msgid "Key name:"
+msgstr "Název klávesy:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:674
+msgid "Unsupported event type:"
+msgstr "Nepodporovaný typ události:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:931
+msgid "Edit Event Time"
+msgstr "Upravit čas události"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:943
+msgid "Edit Event Notation Time"
+msgstr "Upravit čas notace události"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:955
+msgid "Edit Duration"
+msgstr "Upravit dobu trvání"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:968
+msgid "Edit Notation Duration"
+msgstr "Upravit dobu trvání notace"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:981
+msgid "Edit Pitch"
+msgstr "Upravit výšku tónu"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:991
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:1016
+msgid "*.syx|System exclusive files (*.syx)"
+msgstr "*.syx|Systémové exkluzivní soubory (*.syx)"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:992
+msgid "Load System Exclusive data in File"
+msgstr "Načíst systémová exkluzivní data v souboru"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:1017
+msgid "Save System Exclusive data to..."
+msgstr "Uložit systémová exkluzivní data do..."
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:46
+msgid "Locate audio file"
+msgstr "Najít zvukový soubor"
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:50
+msgid "&Skip"
+msgstr "&Přeskočit"
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:51
+msgid "Skip &All"
+msgstr "Přeskočit &vše"
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:52
+msgid "&Locate"
+msgstr "&Najít"
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:57
+msgid ""
+"Can't find file \"%1\".\n"
+"Would you like to try and locate this file or skip it?"
+msgstr ""
+"Nelze najít soubor \"%1\".\n"
+"Chcete se pokusit nalézt soubor manuálně nebo se má přeskočit?"
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:71
+msgid ""
+"%1|Requested file (%2)\n"
+"*.wav|WAV files (*.wav)"
+msgstr ""
+"%1|Požadovaný soubor (%2)\n"
+"soubory *.wav|WAV (*.wav)"
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:74
+msgid "Select an Audio File"
+msgstr "Vybrat zvukový soubor"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:53 ../src/gui/dialogs/ClefDialog.cpp:62
+#: ../src/gui/dialogs/ClefDialog.cpp:79 ../src/gui/dialogs/ClefDialog.cpp:90
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:278
+msgid "Clef"
+msgstr "Klíč"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:65
+msgid "Existing notes following clef change"
+msgstr "Stávající noty následující po změně klíče"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:71
+msgid "Lower clef"
+msgstr "Klíč hlubší polohy"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:77
+msgid "Up an Octave"
+msgstr "O oktávu výš"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:84
+msgid "Down an Octave"
+msgstr "O oktávu níž"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:88
+msgid "Higher clef"
+msgstr "Klíč vyšší polohy"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:96
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:152
+msgid "Maintain current pitches"
+msgstr "Zachovat aktuální výšky tónů"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:99
+msgid "Transpose into appropriate octave"
+msgstr "Transponovat do příslušné oktávy"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:231
+msgid "%1 down an octave"
+msgstr "%1 snížit o oktávu"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:234
+msgid "%1 down two octaves"
+msgstr "%1 snížit o dvě oktávy"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:237
+msgid "%1 up an octave"
+msgstr "%1 zvýšit o oktávu"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:240
+msgid "%1 up two octaves"
+msgstr "%1 zvýšit o dvě oktávy"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:249
+msgid "Treble"
+msgstr "Houslový"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:251
+msgid "French violin"
+msgstr "Francouzský houslový"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:253
+msgid "Soprano"
+msgstr "Soprano"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:255
+msgid "Mezzo-soprano"
+msgstr "Mezosopránový"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:257
+msgid "Alto"
+msgstr "Violový"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:259
+msgid "Tenor"
+msgstr "Tenorový"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:261
+msgid "C-baritone"
+msgstr "C-barytonový"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:263
+msgid "F-baritone"
+msgstr "F-barytonový"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:265
+msgid "Bass"
+msgstr "Basový"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:267
+msgid "Sub-bass"
+msgstr "Subbasový"
+
+#: ../src/gui/dialogs/CountdownDialog.cpp:52
+msgid "Recording..."
+msgstr "Probíhá záznam..."
+
+#: ../src/gui/dialogs/CountdownDialog.cpp:60
+msgid "Recording time remaining: "
+msgstr "Zbývající záznamový čas: "
+
+#: ../src/gui/dialogs/CountdownDialog.cpp:120
+msgid "Just how big is your hard disk?"
+msgstr "Jak je velký váš pevný disk?"
+
+#: ../src/gui/dialogs/CountdownDialog.cpp:154
+msgid "Recording beyond end of composition: "
+msgstr "Záznam za koncem skladby: "
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:52
+msgid "Specify Interval"
+msgstr "Zadat interval"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:58
+msgid "Reference note:"
+msgstr "Referenční nota:"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:59
+msgid "Target note:"
+msgstr "Cílová nota:"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:68
+#: ../src/gui/dialogs/IntervalDialog.cpp:315
+msgid "a perfect unison"
+msgstr "prima"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:76
+msgid "Effect on Key"
+msgstr "Efekt na tónině"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:77
+msgid "Transpose within key"
+msgstr "Transponovat v tónině"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:79
+msgid "Change key for selection"
+msgstr "Změnit tóninu pro výběr"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:89
+msgid ""
+"Adjust segment transposition in opposite direction (maintain audible pitch)"
+msgstr ""
+"Upravit transpozici segmentu v opačném směru (udržet slyšitelnou výšku)"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:190
+#: ../src/gui/dialogs/IntervalDialog.cpp:220
+msgid "a diminished"
+msgstr "zmenšený"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:192
+#: ../src/gui/dialogs/IntervalDialog.cpp:222
+msgid "an augmented"
+msgstr "zvětšený"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:194
+#: ../src/gui/dialogs/IntervalDialog.cpp:224
+msgid "a doubly diminished"
+msgstr "dvojnásobně zmenšený"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:196
+#: ../src/gui/dialogs/IntervalDialog.cpp:226
+msgid "a doubly augmented"
+msgstr "dvojnásobně zvětšený"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:198
+#: ../src/gui/dialogs/IntervalDialog.cpp:228
+msgid "a triply diminished"
+msgstr "trojnásobně zmenšený"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:200
+#: ../src/gui/dialogs/IntervalDialog.cpp:230
+msgid "a triply augmented"
+msgstr "trojnásobně zvětšený"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:202
+msgid "a quadruply diminished"
+msgstr "čtyřnásobně zmenšený"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:204
+#: ../src/gui/dialogs/IntervalDialog.cpp:232
+msgid "a quadruply augmented"
+msgstr "čtyřnásobně zvětšený"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:206
+#: ../src/gui/dialogs/IntervalDialog.cpp:234
+msgid "a perfect"
+msgstr "dokonalý"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:208
+#: ../src/gui/dialogs/IntervalDialog.cpp:236
+msgid "an (unknown, %1)"
+msgstr "(neznámé, %1)"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:216
+msgid "a minor"
+msgstr "moll"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:218
+msgid "a major"
+msgstr "dur"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:239
+msgid "an (unknown)"
+msgstr "(neznámé)"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:248
+#: ../src/gui/dialogs/IntervalDialog.cpp:251
+msgid "%1 octave"
+msgstr "%1 oktáva"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:254
+msgid "%1 unison"
+msgstr "%1 prima"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:258
+msgid "%1 second"
+msgstr "%1 sekunda"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:261
+msgid "%1 third"
+msgstr "%1 tercie"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:264
+msgid "%1 fourth"
+msgstr "%1 kvarta"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:267
+msgid "%1 fifth"
+msgstr "%1 kvinta"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:270
+msgid "%1 sixth"
+msgstr "%1 sexta"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:273
+msgid "%1 seventh"
+msgstr "%1 septima"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:276
+#: ../src/gui/studio/DeviceManagerDialog.cpp:329
+#: ../src/gui/studio/DeviceManagerDialog.cpp:363
+#, c-format
+msgid "%1"
+msgstr "%1"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:287
+msgid ""
+"_n: up 1 octave and %1\n"
+"up %n octaves and %1"
+msgstr ""
+"_n: o 1 oktávu výš a %1\n"
+"o %n oktáv(y) výš a %1"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:291
+#, c-format
+msgid ""
+"_n: up 1 octave\n"
+"up %n octaves"
+msgstr ""
+"_n: o 1 oktávu výš\n"
+"o %n oktáv(y) výš"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:295
+#, c-format
+msgid "up %1"
+msgstr "zvýšit o %1"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:303
+msgid ""
+"_n: down 1 octave and %1\n"
+"down %n octaves and %1"
+msgstr ""
+"_n: o 1 oktávu níž a %1\n"
+"o %n oktáv(y) níž a %1"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:307
+#, c-format
+msgid ""
+"_n: down 1 octave\n"
+"down %n octaves"
+msgstr ""
+"_n: o 1 oktávu níž\n"
+"o %n oktáv(y) níž"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:311
+#, c-format
+msgid "down %1"
+msgstr "snížit o %1"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:81
+msgid "Intrinsics"
+msgstr "Vnitřní hodnoty"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:85
+msgid "Event type: "
+msgstr "Typ události: "
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:91
+msgid "Absolute time: "
+msgstr "Absolutní čas: "
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:101
+msgid "Duration: "
+msgstr "Doba trvání: "
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:114
+msgid "Sub-ordering: "
+msgstr "Podřád: "
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:125
+msgid "Persistent properties"
+msgstr "Trvalé vlastnosti"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:169
+#: ../src/gui/dialogs/EventEditDialog.cpp:133
+#: ../src/gui/studio/BankEditorDialog.cpp:129
+#: ../src/gui/studio/DeviceEditorDialog.cpp:75
+msgid "Type"
+msgstr "Typ"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:184
+#: ../src/gui/dialogs/EventEditDialog.cpp:135
+#: ../src/gui/dialogs/EventParameterDialog.cpp:89
+#: ../src/gui/dialogs/EventParameterDialog.cpp:93
+#: ../src/gui/dialogs/EventParameterDialog.cpp:115
+msgid "Value"
+msgstr "Hodnota"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:155
+msgid "Non-persistent properties"
+msgstr "Dočasné vlastnosti"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:156
+msgid "These are cached values, lost if the event is modified."
+msgstr ""
+"Toto jsou hodnoty ukládané do paměti cache, které budou při modifikaci "
+"události ztraceny."
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:170
+msgid "Name "
+msgstr "Název "
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:172
+msgid "Type "
+msgstr "Typ "
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:174
+msgid "Value "
+msgstr "Hodnota "
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:188
+msgid "Make persistent"
+msgstr "Nastavit trvalý charakter"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:292
+msgid "Delete this property"
+msgstr "Odstranit tuto vlastnost"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:433
+msgid ""
+"Are you sure you want to delete the \"%1\" property?\n"
+"\n"
+"Removing necessary properties may cause unexpected behavior."
+msgstr ""
+"Skutečně chcete odstranit vlastnost \"%1\"?\n"
+"\n"
+"Odstranění nezbytných vlastností může způsobit nevypočitatelné chování."
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:436
+#: ../src/gui/dialogs/EventEditDialog.cpp:469
+msgid "Edit Event"
+msgstr "Upravit událost"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:465
+msgid ""
+"Are you sure you want to make the \"%1\" property persistent?\n"
+"\n"
+"This could cause problems if it overrides a different computed value later "
+"on."
+msgstr ""
+"Skutečně chcete nastavit trvalý charakter vlastnosti \"%1\"?\n"
+"\n"
+"Mohlo by to způsobit problémy, pokud by takto byla později potlačena nějaká "
+"jiná vypočítaná hodnota."
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:470
+msgid "Make &Persistent"
+msgstr "Nastavit &trvalý charakter"
+
+#: ../src/gui/dialogs/PasteNotationDialog.cpp:52
+msgid "Paste type"
+msgstr "Typ vložení"
+
+#: ../src/gui/dialogs/PasteNotationDialog.cpp:72
+msgid "Make this the default paste type"
+msgstr "Tento typ vložení používat jako výchozí"
+
+#: ../src/gui/dialogs/LyricEditDialog.cpp:53
+msgid "Edit Lyrics"
+msgstr "Upravit text melodie"
+
+#: ../src/gui/dialogs/LyricEditDialog.cpp:62
+msgid "Lyrics for this segment"
+msgstr "Text melodie tohoto segmentu"
+
+#: ../src/gui/dialogs/LyricEditDialog.cpp:70
+msgid "Add Verse"
+msgstr "Přidat sloku/verš"
+
+#: ../src/gui/dialogs/LyricEditDialog.cpp:84
+#: ../src/gui/dialogs/LyricEditDialog.cpp:106
+#, c-format
+msgid "Verse %1"
+msgstr "Sloka %1"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:59
+msgid "Import from Device..."
+msgstr "Importovat ze zařízení..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2163
+#: ../src/gui/application/RosegardenGUIApp.cpp:2229
+#: ../src/gui/application/RosegardenGUIApp.cpp:7780
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:87
+#: ../src/sound/AudioFileManager.cpp:664
+#, c-format
+msgid "Cannot download file %1"
+msgstr "Nelze stáhnout soubor %1"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:99
+#, c-format
+msgid "Cannot open file %1"
+msgstr "Nelze otevřít soubor %1"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:106
+#, c-format
+msgid "No devices found in file %1"
+msgstr "V souboru %1 nebyla nalezena žádná zařízení"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:113
+msgid "Source device"
+msgstr "Zdrojové zařízení"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:118
+msgid "Import from: "
+msgstr "Importovat z: "
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:140
+#: ../src/gui/studio/DeviceEditorDialog.cpp:148
+#, c-format
+msgid "Device %1"
+msgstr "Zařízení %1"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:155
+msgid "Import banks"
+msgstr "Importovat banky"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:156
+msgid "Import key mappings"
+msgstr "Importovat mapování tónin"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:157
+msgid "Import controllers"
+msgstr "Importovat ovládací prvky"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:160
+msgid "Import device name"
+msgstr "Importovat název zařízení"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:166
+msgid "Bank import behavior"
+msgstr "Chování při importu banky"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:168
+msgid "Merge banks"
+msgstr "Připojit banky"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:169
+msgid "Overwrite banks"
+msgstr "Přepsat banky"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:367
+msgid "Bank %1:%2"
+msgstr "Banka %1:%2"
+
+#: ../src/commands/segment/SegmentSplitByRecordingSrcCommand.cpp:42
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:48
+msgid "Split by Recording Source"
+msgstr "Rozdělit podle záznamového zdroje"
+
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:53
+msgid "Recording Source"
+msgstr "Záznamový zdroj"
+
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:57
+msgid "Channel:"
+msgstr "Kanál:"
+
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:64
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:75
+msgid "any"
+msgstr "jakýkoli"
+
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:69
+msgid "Device:"
+msgstr "Zařízení:"
+
+#: ../src/gui/dialogs/UnusedAudioSelectionDialog.cpp:46
+msgid "Select Unused Audio Files"
+msgstr "Vybrat nepoužívané zvukové soubory"
+
+#: ../src/gui/dialogs/UnusedAudioSelectionDialog.cpp:53
+#: ../src/gui/editors/segment/PlayListView.cpp:36
+msgid "File name"
+msgstr "Název souboru"
+
+#: ../src/gui/dialogs/UnusedAudioSelectionDialog.cpp:54
+msgid "File size"
+msgstr "Velikost souboru"
+
+#: ../src/gui/dialogs/UnusedAudioSelectionDialog.cpp:55
+msgid "Last modified date"
+msgstr "Datum posledních úprav"
+
+#: ../src/gui/dialogs/UnusedAudioSelectionDialog.cpp:60
+msgid " (not found) "
+msgstr " (nenalezeno)"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:105
+msgid "Audio File Manager"
+msgstr "Správce zvukových souborů"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:126
+msgid ""
+"* Some audio files are encoded at a sample rate different from that of the "
+"JACK audio server.\n"
+"Rosegarden will play them at the correct speed, but they will sound "
+"terrible.\n"
+"Please consider resampling such files externally, or adjusting the sample "
+"rate of the JACK server."
+msgstr ""
+"* Některé zvukové soubory jsou zakódované vzorkovací frekvencí odlišnou od "
+"frekvence zvukového serveru JACK.\n"
+"Aplikace Rosegarden je přehraje správnou rychlostí, ale budou znít strašně.\n"
+"Zvažte proto možnost externího převzorkování takových souborů nebo upravení "
+"vzorkovací frekvence serveru JACK."
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:132
+msgid "&Add Audio File..."
+msgstr "&Přidat zvukový soubor..."
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:135
+msgid "&Unload Audio File"
+msgstr "Uvolnit &zvukový soubor z paměti"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:140
+msgid "&Play Preview"
+msgstr "Přehrát &ukázku"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:151
+msgid "&Insert into Selected Audio Track"
+msgstr "&Vložit do vybrané zvukové stopy"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:155
+msgid "Unload &all Audio Files"
+msgstr "Uvolnit &všechny zvukové soubory z paměti"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:159
+msgid "Unload all &Unused Audio Files"
+msgstr "Uvolnit všechny &nepoužívané zvukové soubory z paměti"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:163
+msgid "&Delete Unused Audio Files..."
+msgstr "&Odstranit nepoužívané zvukové soubory z paměti..."
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:167
+msgid "&Export Audio File..."
+msgstr "&Exportovat zvukový soubor..."
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:173
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:180
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:91
+msgid "Duration"
+msgstr "Doba trvání"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:181
+msgid "Envelope"
+msgstr "Obalová křivka"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:182
+msgid "Sample rate"
+msgstr "Vzorkovací frekvence"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:183
+msgid "Channels"
+msgstr "Kanály"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:282
+msgid "<no audio files>"
+msgstr "<žádné zvukové soubory>"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:488
+msgid "*.wav|WAV files (*.wav)"
+msgstr "soubory *.wav|WAV (*.wav)"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:489
+msgid "Choose a name to save this file as"
+msgstr "Vyberte název pro uložení toho souboru jako"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:499
+msgid "Exporting audio file..."
+msgstr "Probíhá export zvukového souboru..."
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:609
+msgid ""
+"This will unload audio file \"%1\" and remove all associated segments. Are "
+"you sure?"
+msgstr ""
+"Tímto dojde k uvolnění zvukového souboru \"%1\" z paměti a odstranění "
+"všechsouvisejících segmentů. Skutečně to chcete provést?"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:692
+msgid ""
+"*.wav|WAV files (*.wav)\n"
+"*.*|All files"
+msgstr ""
+"soubory *.wav|WAV (*.wav)\n"
+"*.*|Všechny soubory"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:697
+msgid ""
+"*.wav *.flac *.ogg *.mp3|Audio files (*.wav *.flac *.ogg *.mp3)\n"
+"*.wav|WAV files (*.wav)\n"
+"*.flac|FLAC files (*.flac)\n"
+"*.ogg|Ogg files (*.ogg)\n"
+"*.mp3|MP3 files (*.mp3)\n"
+"*.*|All files"
+msgstr ""
+"soubory *.wav *.flac *.ogg *.mp3|Zvukové soubory (*.wav *.flac *.ogg *.mp3)\n"
+"soubory *.wav|WAV (*.wav)\n"
+"soubory *.flac|FLAC (*.flac)\n"
+"soubory *.ogg|Ogg (*.ogg)\n"
+"soubory *.mp3|MP3 (*.mp3)\n"
+"*.*|Všechny soubory"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:704
+msgid "Select one or more audio files"
+msgstr "Vybrat jeden nebo více zvukových souborů"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:763
+msgid ""
+"This will unload all audio files and remove their associated segments.\n"
+"This action cannot be undone, and associations with these files will be "
+"lost.\n"
+"Files will not be removed from your disk.\n"
+"Are you sure?"
+msgstr ""
+"Tímto se uvolní všechny zvukové soubory z paměti a odstraní jejich "
+"související segmenty.\n"
+"Tuto akci nelze vrátit zpět a asociace s těmito soubory budou ztraceny.\n"
+"Soubory nebudou odstraněny z pevného disku.\n"
+"Skutečně chcete pokračovat?"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:800
+msgid ""
+"This will unload all audio files that are not associated with any segments "
+"in this composition.\n"
+"This action cannot be undone, and associations with these files will be "
+"lost.\n"
+"Files will not be removed from your disk.\n"
+"Are you sure?"
+msgstr ""
+"Tímto se uvolní všechny zvukové soubory z paměti, které nejsou asociovány s "
+"žádnými segmenty v této skladbě.\n"
+"Tuto akci nelze vrátit zpět a asociace s těmito soubory budou ztraceny.\n"
+"Soubory nebudou odstraněny z pevného disku.\n"
+"Skutečně chcete pokračovat?"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:865
+msgid ""
+"The following audio files are not used in the current composition.\n"
+"\n"
+"Please select the ones you wish to delete permanently from the hard disk.\n"
+msgstr ""
+"Následující zvukové soubory nejsou v aktuální skladbě použity.\n"
+"\n"
+"Vyberte ty, které chcete z pevného disku trvale odstranit.\n"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:875
+#, c-format
+msgid ""
+"_n: <qt>About to delete 1 audio file permanently from the hard disk.<br>This "
+"action cannot be undone, and there will be no way to recover this file."
+"<br>Are you sure?</qt>\n"
+"\n"
+"<qt>About to delete %n audio files permanently from the hard disk.<br>This "
+"action cannot be undone, and there will be no way to recover these files."
+"<br>Are you sure?</qt>"
+msgstr ""
+"_n: <qt>Chystáte se z pevného disku trvale odstranit 1 zvukový soubor."
+"<br>Tuto akci nelze vrátit zpět a neexistuje způsob, jak tento soubor "
+"později obnovit.<br>Skutečně chcete pokračovat?</qt>\n"
+"\n"
+"<qt>Chystáte se z pevného disku trvale odstranit %n zvukové(ých) soubory(ů)."
+"<br> Tuto akci nelze vrátit zpět a neexistuje způsob, jak tyto soubory "
+"později obnovit.<br>Skutečně chcete pokračovat?</qt>"
+
+#: ../src/document/RosegardenGUIDoc.cpp:525
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:888
+msgid "File %1 could not be deleted."
+msgstr "Soubor %1 nelze odstranit."
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:921
+msgid "Change Audio File label"
+msgstr "Změnit popisek zvukového souboru"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:6466
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:922
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:1099
+msgid "Enter new label"
+msgstr "Zadat nový popisek"
+
+#: ../src/gui/application/RosegardenGUIView.cpp:1538
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:1086
+msgid "Adding audio file..."
+msgstr "Probíhá přidání zvukového souboru..."
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:1107
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:1112
+msgid "Failed to add audio file. "
+msgstr "Přidání zvukového souboru selhalo."
+
+#: ../src/document/RosegardenGUIDoc.cpp:2789
+#: ../src/gui/application/RosegardenGUIApp.cpp:2736
+#: ../src/gui/application/RosegardenGUIView.cpp:1574
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:1122
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:180
+msgid "Generating audio preview..."
+msgstr "Probíhá vytváření zvukové ukázky..."
+
+#: ../src/gui/application/RosegardenGUIView.cpp:1581
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:1130
+msgid ""
+"Try copying this file to a directory where you have write permission and re-"
+"add it"
+msgstr ""
+"Zkuste zkopírovat tento soubor do adresáře, ve kterém máte oprávnění k "
+"zápisu,a vyzkoušejte jej přidat znovu"
+
+#: ../src/gui/dialogs/TransportDialog.cpp:90 rc.cpp:357
+#, no-c-format
+msgid "Rosegarden Transport"
+msgstr "Transport aplikace Rosegarden"
+
+#: ../src/gui/dialogs/TransportDialog.cpp:925
+#: ../src/gui/dialogs/TransportDialog.cpp:985
+msgid "PITCH WHEEL"
+msgstr "OVLÁDÁNÍ VÝŠKY TÓNU"
+
+#: ../src/gui/dialogs/TransportDialog.cpp:929
+#: ../src/gui/dialogs/TransportDialog.cpp:989
+msgid "CONTROLLER"
+msgstr "OVLÁDACÍ PRVEK"
+
+#: ../src/gui/dialogs/TransportDialog.cpp:933
+#: ../src/gui/dialogs/TransportDialog.cpp:993
+msgid "PROG CHNGE"
+msgstr "ZMĚNA PROGRAMU"
+
+#: ../src/gui/dialogs/TransportDialog.cpp:938
+#: ../src/gui/dialogs/TransportDialog.cpp:998
+msgid "PRESSURE"
+msgstr "TLAKOVÁ CITLIVOST"
+
+#: ../src/gui/dialogs/TransportDialog.cpp:942
+#: ../src/gui/dialogs/TransportDialog.cpp:1002
+msgid "SYS MESSAGE"
+msgstr "SYSTÉMOVÁ ZPRÁVA"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:177
+#: ../src/gui/dialogs/QuantizeDialog.cpp:40
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:127
+msgid "Quantize"
+msgstr "Kvantizovat"
+
+#: ../src/gui/dialogs/QuantizeDialog.cpp:52
+msgid "Advanced"
+msgstr "Rozšířené možnosti"
+
+#: ../src/gui/dialogs/ExportDeviceDialog.cpp:42
+msgid "Export Devices..."
+msgstr "Exportovat zařízení..."
+
+#: ../src/gui/dialogs/ExportDeviceDialog.cpp:47
+msgid "Export devices"
+msgstr "Exportovat zařízení"
+
+#: ../src/gui/dialogs/ExportDeviceDialog.cpp:49
+msgid "Export all devices"
+msgstr "Exportovat všechna zařízení"
+
+#: ../src/gui/dialogs/ExportDeviceDialog.cpp:50
+msgid "Export selected device only"
+msgstr "Exportovat pouze vybraná zařízení"
+
+#: ../src/gui/dialogs/ExportDeviceDialog.cpp:51
+msgid " (\"%1\")"
+msgstr " (\"%1\")"
+
+#: ../src/gui/dialogs/CompositionLengthDialog.cpp:44
+msgid "Change Composition Length"
+msgstr "Změnit délku skladby"
+
+#: ../src/gui/dialogs/CompositionLengthDialog.cpp:50
+msgid "Set the Start and End bar markers for this Composition"
+msgstr "Nastavit počáteční a koncovou taktovou čáru pro tuto skladbu"
+
+#: ../src/gui/dialogs/CompositionLengthDialog.cpp:54
+msgid "Start Bar"
+msgstr "Počáteční taktová čára"
+
+#: ../src/gui/dialogs/CompositionLengthDialog.cpp:62
+msgid "End Bar"
+msgstr "Koncová taktová čára"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:62
+msgid "LilyPond Export/Preview"
+msgstr "Export/náhled do aplikace LilyPond"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:85
+msgid "General options"
+msgstr "Obecné možnosti"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:90
+msgid "Advanced options"
+msgstr "Rozšířené možnosti"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:112
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:95
+msgid "Headers"
+msgstr "Hlavičky"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:106
+msgid "Basic options"
+msgstr "Základní možnosti"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:113
+msgid "Compatibility level"
+msgstr "Úroveň kompatibility"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:117
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:118
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:119
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:120
+#, c-format
+msgid "LilyPond %1"
+msgstr "LilyPond %1"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:125
+msgid "Paper size"
+msgstr "Formát papíru"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:129
+msgid "A3"
+msgstr "A3"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:130
+msgid "A4"
+msgstr "A4"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:131
+msgid "A5"
+msgstr "A5"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:132
+msgid "A6"
+msgstr "A6"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:133
+msgid "Legal"
+msgstr "Legal"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:134
+msgid "US Letter"
+msgstr "US Letter"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:135
+msgid "Tabloid"
+msgstr "Tabloid"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:136
+msgid "do not specify"
+msgstr "nespecifikováno"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:152
+msgid "Font size"
+msgstr "Velikost písma"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:157
+msgid "%1 pt"
+msgstr "%1 (bod)"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:169
+msgid "Staff level options"
+msgstr "Možnosti úrovně osnovy"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:176
+msgid "Export content"
+msgstr "Exportovat obsah"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:179
+msgid "All tracks"
+msgstr "Všechny stopy"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:180
+msgid "Non-muted tracks"
+msgstr "Neztlumené stopy"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:181
+msgid "Selected track"
+msgstr "Vybraná stopa"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:182
+msgid "Selected segments"
+msgstr "Vybrané segmenty"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:188
+msgid "Merge tracks that have the same name"
+msgstr "Spojit stopy se stejným názvem"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:198
+msgid "Notation options"
+msgstr "Možnosti notace"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:206
+msgid "First"
+msgstr "První"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:207
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:538
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:557
+msgid "All"
+msgstr "Vše"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:211
+msgid "Export tempo marks "
+msgstr "Exportovat značky tempa"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:215
+msgid "Export lyrics"
+msgstr "Exportovat text melodie"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:225
+msgid "Export beamings"
+msgstr "Exportovat trámce"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:232
+msgid "Export track staff brackets"
+msgstr "Exportovat závorky osnovy stop"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:244
+msgid "Layout options"
+msgstr "Možnosti uspořádání"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:257
+msgid "Lyrics alignment"
+msgstr "Zarovnání textu melodie"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:261
+msgid "Ragged bottom (systems will not be spread vertically across the page)"
+msgstr ""
+"Nevyrovnaná spodní část (osnovy nebudou vertikálně roztaženy po celé straně)"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:267
+msgid "Miscellaneous options"
+msgstr "Různé možnosti"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:274
+msgid "Enable \"point and click\" debugging"
+msgstr "Zapnout ladění \"point and click\" (debugging, ukaž a klepni)"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:279
+msgid "Export \\midi block"
+msgstr "Exportovat \\blok midi"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:284
+msgid "No markers"
+msgstr "Žádné záložky"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:285
+msgid "Rehearsal marks"
+msgstr "Cvičební značky"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:286
+msgid "Marker text"
+msgstr "Text záložky"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:290
+msgid "Export markers"
+msgstr "Exportovat záložky"
+
+#: ../src/gui/dialogs/AudioSplitDialog.cpp:57
+msgid "Autosplit Audio Segment"
+msgstr "Automaticky rozdělit zvukový segment"
+
+#: ../src/gui/dialogs/AudioSplitDialog.cpp:70
+msgid "AutoSplit Segment \""
+msgstr "Automaticky rozdělit segment \""
+
+#: ../src/gui/dialogs/AudioSplitDialog.cpp:84
+msgid "Threshold"
+msgstr "Prahová hodnota"
+
+#: ../src/gui/dialogs/AudioSplitDialog.cpp:142
+msgid "<no preview generated for this audio file>"
+msgstr "<pro tento zvukový soubor není vygenerována žádná ukázka>"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:70
+msgid "Audio Plugin"
+msgstr "Zvukový zásuvný modul"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:94
+#: ../src/gui/widgets/AudioFaderBox.cpp:136
+msgid "Editor"
+msgstr "Editor"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:100
+msgid "Plugin"
+msgstr "Zásuvný modul"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:105
+msgid "Category:"
+msgstr "Kategorie:"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:110
+msgid "Plugin:"
+msgstr "Zásuvný modul:"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:114
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:398
+msgid "Select a plugin from this list."
+msgstr "Vyberte zásuvný modul z tohoto seznamu."
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:119
+msgid "Bypass"
+msgstr "Obejít"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:121
+msgid "Bypass this plugin."
+msgstr "Obejít tento zásuvný modul."
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:127
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:390
+msgid "<ports>"
+msgstr "<porty>"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:130
+msgid "Input and output port counts."
+msgstr "Počet vstupních a výstupních portů."
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:132
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:391
+msgid "<id>"
+msgstr "<id>"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:135
+msgid "Unique ID of plugin."
+msgstr "Jednoznačné ID zásuvného modulu."
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:149
+msgid "Copy plugin parameters"
+msgstr "Kopírovat parametry zásuvného modulu"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:155
+msgid "Paste plugin parameters"
+msgstr "Vložit parametry zásuvného modulu"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:161
+msgid "Set to defaults"
+msgstr "Nastavit na výchozí hodnoty"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:225
+msgid "(any)"
+msgstr "(jakýkoli)"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:226
+msgid "(unclassified)"
+msgstr "(nezařazený)"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:247
+msgid "(none)"
+msgstr "(žádný)"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:389
+#: ../src/gui/editors/parameters/AudioInstrumentParameterPanel.cpp:132
+#: ../src/gui/editors/parameters/AudioInstrumentParameterPanel.cpp:361
+#: ../src/gui/studio/AudioMixerWindow.cpp:685
+#: ../src/gui/studio/AudioMixerWindow.cpp:724
+#: ../src/gui/studio/AudioMixerWindow.cpp:906
+#: ../src/gui/widgets/AudioFaderBox.cpp:79
+msgid "<no plugin>"
+msgstr "<žádný zásuvný modul>"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:427
+msgid "This plugin has too many controls to edit here."
+msgstr "Tento zásuvný modul obsahuje příliš mnoho ovládacích prvků k editaci."
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:438
+#, c-format
+msgid "Id: %1"
+msgstr "Id: %1"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:490
+msgid "mono"
+msgstr "mono"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:492
+msgid "stereo"
+msgstr "stereo"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:494
+msgid "%1 in, %2 out"
+msgstr "vstup %1, výstup %2"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:518
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:704
+msgid "Program: "
+msgstr "Program: "
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:522
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:532
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:708
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:716
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:745
+msgid "<none selected>"
+msgstr "<není vybrán žádný>"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:56
+msgid "Set the %1 property of the event selection:"
+msgstr "Nastavit vlastnost %1 výběru události:"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:61
+msgid "Pattern"
+msgstr "Vzor"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:66
+msgid "Flat - set %1 to value"
+msgstr "Ploché - nastavit %1 na hodnotu"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:70
+msgid "Alternating - set %1 to max and min on alternate events"
+msgstr ""
+"Střídavé - nastavit %1 střídavě na maximum a minimum při střídání událostí"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:74
+msgid "Crescendo - set %1 rising from min to max"
+msgstr "Crescendo - nastavit %1 na zvětšující se od minima po maximum"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:78
+msgid "Diminuendo - set %1 falling from max to min"
+msgstr "Diminuendo - nastavit %1 na zmenšující se od maxima po minimum"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:82
+msgid "Ringing - set %1 alternating from max to min with both dying to zero"
+msgstr ""
+"Vyzvánění - nastavit %1 na střídání od maxima po minimum s ukončením na nule"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:123
+#: ../src/gui/dialogs/EventParameterDialog.cpp:150
+msgid "First Value"
+msgstr "První hodnota"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:124
+#: ../src/gui/dialogs/EventParameterDialog.cpp:151
+msgid "Second Value"
+msgstr "Druhá hodnota"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:132
+#: ../src/gui/dialogs/EventParameterDialog.cpp:142
+msgid "Low Value"
+msgstr "Nízká hodnota"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:133
+#: ../src/gui/dialogs/EventParameterDialog.cpp:141
+msgid "High Value"
+msgstr "Vysoká hodnota"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:56 ../src/gui/rulers/TempoRuler.cpp:127
+msgid "Insert Tempo Change"
+msgstr "Vložit změnu tempa"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:69
+msgid "New tempo:"
+msgstr "Nové tempo:"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:76
+msgid "Tap"
+msgstr "Vyťukat"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:81
+msgid "Tempo is fixed until the following tempo change"
+msgstr "Tempo je pevně dané až do následující změny tempa"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:82
+msgid "Tempo ramps to the following tempo"
+msgstr "Tempo přechází do následujícího tempa"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:83
+msgid "Tempo ramps to:"
+msgstr "Tempo přechází do:"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:120
+msgid "Time of tempo change"
+msgstr "Změna času tempa"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:138
+msgid "The pointer is currently at "
+msgstr "Ukazatel je v této chvíli na "
+
+#: ../src/gui/dialogs/TempoDialog.cpp:154
+msgid "Apply this tempo from here onwards"
+msgstr "Použít toto tempo odtud dál"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:158
+msgid "Replace the last tempo change"
+msgstr "Nahradit poslední změnu tempa"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:164
+msgid "Apply this tempo from the start of this bar"
+msgstr "Použít toto tempo od této taktové čáry"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:167
+msgid "Apply this tempo to the whole composition"
+msgstr "Použít toto tempo na celou skladbu"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:172
+msgid "Also make this the default tempo"
+msgstr "Toto tempo nastavit také jako výchozí"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:256
+msgid "%1.%2 s,"
+msgstr "%1.%2 s,"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:262
+#, c-format
+msgid "at the start of measure %1."
+msgstr "na začátku taktu %1."
+
+#: ../src/gui/dialogs/TempoDialog.cpp:266
+#, c-format
+msgid "in the middle of measure %1."
+msgstr "uprostřed taktu %1."
+
+#: ../src/gui/dialogs/TempoDialog.cpp:285
+msgid " (at %1.%2 s, in measure %3)"
+msgstr " (u %1.%2 s, v taktu %3)"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:302
+msgid "There are no preceding tempo changes."
+msgstr "Neexistují předchozí změny tempa."
+
+#: ../src/gui/dialogs/TempoDialog.cpp:310
+msgid "There are no other tempo changes."
+msgstr "Neexistují další změny tempa."
+
+#: ../src/gui/dialogs/TempoDialog.cpp:328
+msgid " bpm"
+msgstr " bpm"
+
+#: ../src/gui/dialogs/AudioPlayingDialog.cpp:42
+msgid "Playing audio file"
+msgstr "Přehrává se zvukový soubor"
+
+#: ../src/gui/dialogs/AudioPlayingDialog.cpp:47
+msgid "Playing audio file \"%1\""
+msgstr "Přehrává se zvukový soubor \"%1\""
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:52
+#: ../src/gui/editors/matrix/MatrixView.cpp:2655
+msgid "Trigger Segment"
+msgstr "Spouštěcí segment"
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:61
+msgid "Trigger segment: "
+msgstr "Spouštěcí segment: "
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:59
+msgid "Key Change"
+msgstr "Změna tóniny"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:77
+msgid "Key signature"
+msgstr "Předznamenání"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:80
+msgid "Key transposition"
+msgstr "Transpozice tóniny"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:86
+msgid "Existing notes following key change"
+msgstr "Existující noty následující za změnou tóniny"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:98
+msgid "Flatten"
+msgstr "Snížit o půl tónu"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:100
+msgid "Key"
+msgstr "Tónina"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:105
+msgid "Sharpen"
+msgstr "Zvýšit o půl tónu"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:109
+msgid "Major"
+msgstr "Dur"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:110
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:369
+msgid "Minor"
+msgstr "Moll"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:123
+msgid "Transpose key according to segment transposition"
+msgstr "Transponovat tóninu podle transpozice segmentu"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:126
+msgid "Use specified key. Do not transpose"
+msgstr "Použít zadanou tóninu. Netransponovat"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:134
+msgid "Apply to current segment only"
+msgstr "Použít pouze na aktuální segment"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:137
+msgid "Apply to all segments at this time"
+msgstr "Použít na všechny segmenty v tomto taktovém označení"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:141
+msgid "Exclude percussion segments"
+msgstr "Vyjmout segmenty bicích"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:155
+msgid "Maintain current accidentals"
+msgstr "Zachovat aktuální posuvky"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:158
+msgid "Transpose into this key"
+msgstr "Transponovat do této tóniny"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:331
+msgid "No such key"
+msgstr "Taková tónina neexistuje"
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:44
+#: ../src/gui/editors/notation/NotationSelector.cpp:118
+msgid "Interpret"
+msgstr "Interpretace"
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:50
+msgid "Interpretations to apply"
+msgstr "Interpretace k použití"
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:53
+msgid "Apply text dynamics (p, mf, ff etc)"
+msgstr "Použít znaménkovou dynamiku (p, mf, ff atd.)"
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:55
+msgid "Apply hairpin dynamics"
+msgstr "Použít čárovou dynamiku (crescendo, diminuendo)"
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:57
+msgid "Stress beats"
+msgstr "Důraz na doby"
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:59
+msgid "Articulate slurs, staccato, tenuto etc"
+msgstr "Artikulovat legato, staccato, tenuto atd."
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:61
+msgid "All available interpretations"
+msgstr "Všechny dostupné interpretace"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:316
+msgid ""
+"Attempted to launch JACK audio daemon failed. Audio will be disabled.\n"
+"Please check configuration (Settings -> Configure Rosegarden -> Audio -> "
+"Startup)\n"
+" and restart."
+msgstr ""
+"Pokus o spuštění zvukového démona JACK selhal. Zvuk bude deaktivován.\n"
+"Zkontrolujte konfiguraci (Nastavení->Konfigurace aplikace Rosegarden->Zvuk-"
+">Spuštění)\n"
+"a proveďte restart."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:325
+msgid "Starting sequencer..."
+msgstr "Probíhá spuštění sekvenceru..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:333
+msgid "Initializing plugin manager..."
+msgstr "Probíhá inicializace správce zásuvných modulů..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:338
+msgid "Initializing view..."
+msgstr "Probíhá inicializace zobrazení..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:354
+msgid "Special Parameters"
+msgstr "Speciální parametry"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:430
+msgid "Starting sequence manager..."
+msgstr "Probíhá spuštění správce sekvence..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:456
+msgid "Clearing studio data..."
+msgstr "Probíhá mazání dat studia..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:475
+#: ../src/gui/editors/notation/NotationView.cpp:558
+msgid "Starting..."
+msgstr "Spouští se..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:556
+msgid "Import Rosegarden &Project file..."
+msgstr "Importovat soubor &projektu aplikace Rosegarden..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:560
+msgid "Import &MIDI file..."
+msgstr "Importovat soubor &MIDI..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:564
+msgid "Import &Rosegarden 2.1 file..."
+msgstr "Importovat soubor aplikace &Rosegarden 2.1..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:568
+msgid "Import &Hydrogen file..."
+msgstr "Importovat soubor &Hydrogen..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:572
+msgid "Merge &File..."
+msgstr "Připojit &soubor..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:576
+msgid "Merge &MIDI file..."
+msgstr "Připojit soubor &MIDI..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:580
+msgid "Merge &Rosegarden 2.1 file..."
+msgstr "Připojit soubor aplikace &Rosegarden 2.1..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:584
+msgid "Merge &Hydrogen file..."
+msgstr "Připojit soubor &Hydrogen..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:588
+msgid "Export Rosegarden &Project file..."
+msgstr "Exportovat soubor &projektu aplikace Rosegarden..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:592
+msgid "Export &MIDI file..."
+msgstr "Exportovat soubor &MIDI..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:596
+msgid "Export &LilyPond file..."
+msgstr "Exportovat soubor &LilyPond..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:600
+msgid "Export Music&XML file..."
+msgstr "Exportovat hudební soubor &XML..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:604
+msgid "Export &Csound score file..."
+msgstr "Exportovat pratiturový soubor score pro &Csound..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:608
+msgid "Export M&up file..."
+msgstr "Exportovat soubor M&up..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:612
+#: ../src/gui/editors/notation/NotationView.cpp:1500
+msgid "Print &with LilyPond..."
+msgstr "Tisk &s aplikací LilyPond..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:616
+#: ../src/gui/editors/notation/NotationView.cpp:1504
+msgid "Preview with Lil&yPond..."
+msgstr "Náhled s aplikací Lily&Pond..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:620
+msgid "Play&list"
+msgstr "Seznam &přehrávání"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:627
+msgid "Rosegarden &Tutorial"
+msgstr "&Cvičení v ovládání aplikace Rosegarden"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:631
+msgid "&Bug Reporting Guidelines"
+msgstr "Pravidla a návody pro hlášení chy&b"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:645
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:348
+#: ../src/gui/editors/segment/MarkerEditor.cpp:378
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:388
+#: ../src/gui/general/EditViewBase.cpp:190
+#: ../src/gui/studio/BankEditorDialog.cpp:318
+#: ../src/gui/studio/DeviceManagerDialog.cpp:227
+msgid "Und&o"
+msgstr "&Vrátit akci zpět"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:651
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:354
+#: ../src/gui/editors/segment/MarkerEditor.cpp:384
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:394
+#: ../src/gui/general/EditViewBase.cpp:196
+#: ../src/gui/studio/BankEditorDialog.cpp:324
+#: ../src/gui/studio/DeviceManagerDialog.cpp:233
+msgid "Re&do"
+msgstr "&Zrušit vrácení akce zpět"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:665
+#: ../src/gui/editors/notation/NotationView.cpp:2297
+msgid "Show T&ools Toolbar"
+msgstr "Zobrazit nástrojovou lištu ovládacích &nástrojů"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:669
+msgid "Show Trac&ks Toolbar"
+msgstr "Zobrazit nástrojovou lištu pro &stopy"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:673
+msgid "Show &Editors Toolbar"
+msgstr "Zobrazit nástrojovou lištu pro &editory"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:677
+#: ../src/gui/editors/notation/NotationView.cpp:2309
+msgid "Show Trans&port Toolbar"
+msgstr "Zobrazit nástrojovou lištu pro trans&port"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:681
+msgid "Show &Zoom Toolbar"
+msgstr "Zobrazit nástrojovou lištu pro &zoom"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:688
+msgid "Show Tra&nsport"
+msgstr "Zobrazit tra&nsport"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:693
+msgid "Show Track &Labels"
+msgstr "Zobrazit &popisky stop"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:698
+msgid "Show Playback Position R&uler"
+msgstr "Zobrazit pravítko pozice &přehrávání"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:703
+msgid "Show Te&mpo Ruler"
+msgstr "Zobrazit pravítko &tempa"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:708
+msgid "Show Cho&rd Name Ruler"
+msgstr "Zobrazit pravítko názvů &akordů"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:714
+msgid "Show Segment Pre&views"
+msgstr "Zobrazit &náhledy segmentu"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:719
+msgid "Show Special &Parameters"
+msgstr "Zobrazit speciální &parametry"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:753
+#: ../src/gui/editors/matrix/MatrixView.cpp:641
+#: ../src/gui/editors/notation/NotationView.cpp:1772
+msgid "&Select and Edit"
+msgstr "&Vybrat a upravit"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:758
+#: ../src/gui/editors/matrix/MatrixView.cpp:646
+msgid "&Draw"
+msgstr "&Kreslit"
+
+#: ../src/commands/edit/EraseCommand.h:50
+#: ../src/gui/application/RosegardenGUIApp.cpp:763
+#: ../src/gui/editors/matrix/MatrixView.cpp:651
+#: ../src/gui/editors/notation/NotationView.cpp:1766
+msgid "&Erase"
+msgstr "&Vymazat"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:768
+#: ../src/gui/editors/matrix/MatrixView.cpp:656
+msgid "&Move"
+msgstr "&Přesunout"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:775
+msgid "&Resize"
+msgstr "&Změnit velikost"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:782 rc.cpp:87
+#, no-c-format
+msgid "&Split"
+msgstr "&Rozdělit"
+
+#: ../src/commands/segment/SegmentJoinCommand.h:53
+#: ../src/gui/application/RosegardenGUIApp.cpp:789
+msgid "&Join"
+msgstr "&Spojit"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:795
+msgid "&Harmonize"
+msgstr "&Harmonizovat"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:806
+#: ../src/gui/rulers/TempoRuler.cpp:157
+msgid "Open Tempo and Time Signature Editor"
+msgstr "Otevřít editor tempa a taktového označení"
+
+#: ../src/commands/segment/CutRangeCommand.cpp:41
+#: ../src/gui/application/RosegardenGUIApp.cpp:812
+msgid "Cut Range"
+msgstr "Vyjmout úsek"
+
+#: ../src/commands/edit/CopyCommand.cpp:73
+#: ../src/gui/application/RosegardenGUIApp.cpp:816
+msgid "Copy Range"
+msgstr "Kopírovat úsek"
+
+#: ../src/commands/segment/PasteRangeCommand.cpp:45
+#: ../src/gui/application/RosegardenGUIApp.cpp:820
+msgid "Paste Range"
+msgstr "Vložit úsek"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:828
+msgid "Insert Range..."
+msgstr "Vložit úsek..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:832
+#: ../src/gui/editors/notation/NotationView.cpp:1804
+msgid "De&lete"
+msgstr "&Odstranit"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:836
+msgid "Select &All Segments"
+msgstr "Vybrat &všechny segmenty"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:852
+msgid "Edit Mar&kers..."
+msgstr "Upravit zál&ožky..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:856
+msgid "Edit Document P&roperties..."
+msgstr "Upravit vlas&tnosti dokumentu..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:864
+msgid "Open in &Default Editor"
+msgstr "Otevřít ve &výchozím editoru"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:870
+#: ../src/gui/general/EditViewBase.cpp:206
+msgid "Open in Matri&x Editor"
+msgstr "Otevřít v &maticovém editoru"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:876
+#: ../src/gui/general/EditViewBase.cpp:212
+msgid "Open in &Percussion Matrix Editor"
+msgstr "Otevřít v maticovém editoru &bicích"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:882
+#: ../src/gui/general/EditViewBase.cpp:218
+msgid "Open in &Notation Editor"
+msgstr "Otevřít v editoru &notového zápisu"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:888
+#: ../src/gui/general/EditViewBase.cpp:224
+msgid "Open in &Event List Editor"
+msgstr "Otevřít v editoru seznamu &událostí"
+
+#: ../src/commands/edit/EventQuantizeCommand.cpp:120
+#: ../src/commands/edit/EventUnquantizeCommand.cpp:87
+#: ../src/gui/application/RosegardenGUIApp.cpp:894
+msgid "&Quantize..."
+msgstr "&Kvantizovat..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:908
+#: ../src/gui/editors/matrix/MatrixView.cpp:686
+msgid "Repeat Last Quantize"
+msgstr "Opakovat poslední kvantizaci"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:928
+msgid "Split at Time..."
+msgstr "Rozdělit na době..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:932
+#: ../src/gui/general/EditView.cpp:796
+msgid "Jog &Left"
+msgstr "Krokový posun v&levo"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:936
+#: ../src/gui/general/EditView.cpp:800
+msgid "Jog &Right"
+msgstr "Krokový posun v&pravo"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:940
+msgid "Set Start Time..."
+msgstr "Nastavit počáteční čas..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:944
+msgid "Set Duration..."
+msgstr "Nastavit dobu trvání..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:953
+msgid "Turn Re&peats into Copies"
+msgstr "Převést o&pakování na kopie"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:958
+msgid "Manage Tri&ggered Segments"
+msgstr "Správa spouštěných se&gmentů"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:962
+msgid "Set Tempos from &Beat Segment"
+msgstr "Nastavit tempa ze segmentu &doby"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:966
+msgid "Set &Tempo to Audio Segment Duration"
+msgstr "Nastavit &tempo na dobu trvání zvukového segmentu"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:972
+msgid "Manage A&udio Files"
+msgstr "Správa zv&ukových souborů"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:977
+msgid "Show Segment Labels"
+msgstr "Zobrazit popisky segmentů"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:986
+msgid "Add &Track"
+msgstr "Přidat s&topu"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:990
+msgid "&Add Tracks..."
+msgstr "&Přidat stopy..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:996
+msgid "D&elete Track"
+msgstr "&Odstranit stopu"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1002
+msgid "Move Track &Down"
+msgstr "Přesunout stopu &dolů"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1008
+msgid "Move Track &Up"
+msgstr "Přesunout stopu &nahoru"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1012
+msgid "Select &Next Track"
+msgstr "Vybrat &další stopu"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1017
+msgid "Select &Previous Track"
+msgstr "Vybrat &předchozí stopu"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1022
+msgid "Mute or Unmute Track"
+msgstr "Ztlumit nebo zrušit ztlumení stopy"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1027
+msgid "Arm or Un-arm Track for Record"
+msgstr "Uchopit nebo pustit stopu pro záznam"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1034
+msgid "&Mute all Tracks"
+msgstr "Ztlu&mit všechny stopy"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1040
+msgid "&Unmute all Tracks"
+msgstr "&Zrušit ztlumení pro všechny stopy"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1044
+msgid "&Remap Instruments..."
+msgstr "Přem&apovat nástroje..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1053
+msgid "&Audio Mixer"
+msgstr "Zv&ukový směšovač"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1059
+msgid "Midi Mi&xer"
+msgstr "Směšovač MI&DI"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1065
+msgid "Manage MIDI &Devices"
+msgstr "Správa zařízení MI&DI"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1071
+msgid "Manage S&ynth Plugins"
+msgstr "Správa zásuvných modulů s&yntetizéru"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1075
+msgid "Modify MIDI &Filters"
+msgstr "Upravit &filtry MIDI"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1079
+msgid "MIDI Thru Routing"
+msgstr "Směrování MIDI Thru"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1085
+msgid "Manage &Metronome"
+msgstr "Správa &metronomu"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1089
+msgid "&Save Current Document as Default Studio"
+msgstr "&Uložit aktuální dokument jako výchozí studio"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1093
+msgid "&Import Default Studio"
+msgstr "&Imortovat výchozí studio"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1097
+msgid "Im&port Studio from File..."
+msgstr "Im&portovat studio ze souboru..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1101
+msgid "&Reset MIDI Network"
+msgstr "Provést &reset sítě MIDI"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1105
+msgid "Set Quick Marker at Playback Position"
+msgstr "Vložit rychlou záložku na pozici přehrávání"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1109
+msgid "Jump to Quick Marker"
+msgstr "Přeskočit na rychlou záložku"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1142
+#: ../src/gui/editors/matrix/MatrixView.cpp:782
+#: ../src/gui/editors/notation/NotationView.cpp:2397
+#: ../src/gui/studio/AudioMixerWindow.cpp:105
+#: ../src/gui/studio/MidiMixerWindow.cpp:81
+msgid "&Play"
+msgstr "&Přehrát"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1153
+#: ../src/gui/editors/matrix/MatrixView.cpp:791
+#: ../src/gui/editors/notation/NotationView.cpp:2406
+#: ../src/gui/studio/AudioMixerWindow.cpp:114
+#: ../src/gui/studio/MidiMixerWindow.cpp:90
+msgid "&Stop"
+msgstr "&Stop"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1160
+#: ../src/gui/editors/matrix/MatrixView.cpp:802
+#: ../src/gui/editors/notation/NotationView.cpp:2417
+#: ../src/gui/studio/AudioMixerWindow.cpp:125
+#: ../src/gui/studio/MidiMixerWindow.cpp:101
+msgid "&Fast Forward"
+msgstr "Ukazatel přehrávání o takt &dopředu"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1168
+#: ../src/gui/editors/matrix/MatrixView.cpp:796
+#: ../src/gui/editors/notation/NotationView.cpp:2411
+#: ../src/gui/studio/AudioMixerWindow.cpp:119
+#: ../src/gui/studio/MidiMixerWindow.cpp:95
+msgid "Re&wind"
+msgstr "Ukazatel přehrávání o takt &zpět"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1175
+msgid "P&unch in Record"
+msgstr "&Díra v záznamu"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1182
+#: ../src/gui/studio/AudioMixerWindow.cpp:143
+#: ../src/gui/studio/MidiMixerWindow.cpp:119
+msgid "&Record"
+msgstr "&Zaznamenat"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1189
+#: ../src/gui/editors/matrix/MatrixView.cpp:808
+#: ../src/gui/editors/notation/NotationView.cpp:2423
+#: ../src/gui/studio/AudioMixerWindow.cpp:131
+#: ../src/gui/studio/MidiMixerWindow.cpp:107
+msgid "Rewind to &Beginning"
+msgstr "Ukazatel přehrávání na z&ačátek"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1196
+#: ../src/gui/editors/matrix/MatrixView.cpp:814
+#: ../src/gui/editors/notation/NotationView.cpp:2429
+#: ../src/gui/studio/AudioMixerWindow.cpp:137
+#: ../src/gui/studio/MidiMixerWindow.cpp:113
+msgid "Fast Forward to &End"
+msgstr "Ukazatel přehrávání na &konec"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1203
+#: ../src/gui/editors/matrix/MatrixView.cpp:832
+#: ../src/gui/editors/notation/NotationView.cpp:2447
+msgid "Scro&ll to Follow Playback"
+msgstr "Ro&lovat podle přehrávání"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1209
+#: ../src/gui/editors/matrix/MatrixView.cpp:838
+#: ../src/gui/editors/notation/NotationView.cpp:2453
+#: ../src/gui/studio/AudioMixerWindow.cpp:149
+#: ../src/gui/studio/MidiMixerWindow.cpp:125
+msgid "Panic"
+msgstr "Nouzové zastavení"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1213
+msgid "Segment Debug Dump "
+msgstr "Výpis chyb segmentu (debug dump)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1283
+msgid " Zoom: "
+msgstr " Zoom: "
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1719
+msgid "File \"%1\" does not exist"
+msgstr "Soubor \"%1\" neexistuje"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1725
+msgid "File \"%1\" is actually a directory"
+msgstr "Soubor \"%1\" je vlastně adresář"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1734
+msgid "You do not have read permission for \"%1\""
+msgstr "Nemáte oprávnění ke čtení pro \"%1\""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1802
+msgid ""
+"An auto-save file for this document has been found\n"
+"Do you want to open it instead ?"
+msgstr ""
+"Pro tento dokument byl nalezen automaticky uložený soubor\n"
+"Chcete jej otevřít?"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1896
+msgid "Example Files"
+msgstr "Soubory příkladů"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2100
+msgid "Opening a new application window..."
+msgstr "Otevírá se nové aplikační okno..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2110
+msgid "Creating new document..."
+msgstr "Vytváří se nový dokument..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2154
+#, c-format
+msgid ""
+"Malformed URL\n"
+"%1"
+msgstr ""
+"Chybně formulovaná adresa URL\n"
+"%1"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2179
+#: ../src/gui/application/RosegardenGUIApp.cpp:2240
+msgid "Opening file..."
+msgstr "Otevírá se soubor..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2201
+#: ../src/gui/application/RosegardenGUIApp.cpp:2220
+msgid "Open File"
+msgstr "Otevřít soubor"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1225
+#: ../src/gui/application/RosegardenGUIApp.cpp:2258
+msgid "Saving file..."
+msgstr "Ukládá se soubor..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2330
+msgid "This is not a valid filename.\n"
+msgstr "Toto není platný název souboru.\n"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2335
+msgid "This is not a local file.\n"
+msgstr "Toto není lokální soubor.\n"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2342
+#: ../src/gui/studio/BankEditorDialog.cpp:1640
+#: ../src/gui/studio/DeviceManagerDialog.cpp:787
+msgid "You have specified a directory"
+msgstr "Zadali jste adresář"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2348
+#: ../src/gui/studio/BankEditorDialog.cpp:1646
+#: ../src/gui/studio/DeviceManagerDialog.cpp:793
+msgid "The specified file exists. Overwrite?"
+msgstr "Zadaný soubor již existuje. Chcete jej přepsat?"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2362
+msgid "Saving file with a new filename..."
+msgstr "Probíhá uložení souboru s novým názvem..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2364
+msgid "Rosegarden files"
+msgstr "Soubory aplikace Rosegarden"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2365
+#: ../src/gui/application/RosegardenGUIApp.cpp:4860
+#: ../src/gui/application/RosegardenGUIApp.cpp:4904
+#: ../src/gui/application/RosegardenGUIApp.cpp:4942
+#: ../src/gui/application/RosegardenGUIApp.cpp:4975
+#: ../src/gui/application/RosegardenGUIApp.cpp:5009
+#: ../src/gui/application/RosegardenGUIApp.cpp:5116
+msgid "All files"
+msgstr "Všechny soubory"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2366
+msgid "Save as..."
+msgstr "Uložit jako..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2404
+msgid "Closing file..."
+msgstr "Zavírá se soubor..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2421
+#: ../src/gui/editors/notation/NotationView.cpp:4618
+msgid "Printing..."
+msgstr "Probíhá tisk..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2433
+#: ../src/gui/editors/notation/NotationView.cpp:4635
+msgid "Previewing..."
+msgstr "Náhled..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2440
+msgid "Exiting..."
+msgstr "Probíhá ukončení..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2463
+msgid "Cutting selection..."
+msgstr "Probíhá vyjmutí výběru..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2474
+#: ../src/gui/editors/matrix/MatrixView.cpp:1614
+#: ../src/gui/editors/notation/NotationView.cpp:4763
+msgid "Copying selection to clipboard..."
+msgstr "Probíhá kopírování výběru do schránky..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2484
+#: ../src/gui/editors/eventlist/EventView.cpp:878
+#: ../src/gui/editors/matrix/MatrixView.cpp:1625
+#: ../src/gui/editors/notation/NotationView.cpp:4796
+#: ../src/gui/editors/notation/NotationView.cpp:4841
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:352
+msgid "Clipboard is empty"
+msgstr "Schránka je prázdná"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2487
+#: ../src/gui/editors/eventlist/EventView.cpp:882
+#: ../src/gui/editors/matrix/MatrixView.cpp:1629
+#: ../src/gui/editors/notation/NotationView.cpp:4804
+#: ../src/gui/editors/notation/NotationView.cpp:4845
+msgid "Inserting clipboard contents..."
+msgstr "Probíhá vkládání obsahu schránky..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2556
+msgid "Duration of empty range to insert"
+msgstr "Doba trvání prázdného úseku k vložení"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2631
+msgid "This function needs no more than one segment to be selected."
+msgstr "Tato funkce nevyžaduje výběr více než jednoho segmentu."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2654
+msgid "Can't join Audio segments"
+msgstr "Nelze spojit zvukové segmenty"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2707
+msgid "rescaling an audio file"
+msgstr "probíhá změna délky zvukového souboru"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2723
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:172
+msgid "Rescaling audio file..."
+msgstr "Probíhá změna délky zvukového souboru..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2767
+msgid ""
+"The audio file path does not exist or is not writable.\n"
+"You must set the audio file path to a valid directory in Document Properties "
+"before %1.\n"
+"Would you like to set it now?"
+msgstr ""
+"Cesta ke zvukovému souboru neexistuje nebo se do ní nedá zapisovat.\n"
+"Nastavte platný adresář jako cestu ke zvukovému souboru ve Vlastnostech "
+"dokumentu před %1.\n"
+"Chcete cestu nastavit nyní?"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2769
+#: ../src/gui/application/RosegardenGUIApp.cpp:5291
+#: ../src/gui/application/RosegardenGUIApp.cpp:5339
+#: ../src/gui/editors/segment/TrackButtons.cpp:419
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:159
+msgid "Set audio file path"
+msgstr "Nastavit cestu ke zvukovému souboru"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2833
+msgid "Jog Selection"
+msgstr "Krokový posun výběru"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2978
+#, c-format
+msgid ""
+"_n: Split Segment at Time\n"
+"Split %n Segments at Time"
+msgstr ""
+"_n: Rozdělit segment na době\n"
+"Rozdělit %n segmenty(ů) na době"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3013
+#: ../src/gui/general/EditViewBase.cpp:619
+msgid "Segment Start Time"
+msgstr "Počáteční čas segmentu"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3023
+msgid "Set Segment Start Times"
+msgstr "Nastavit počáteční časy segmentu"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3024
+#: ../src/gui/general/EditViewBase.cpp:626
+msgid "Set Segment Start Time"
+msgstr "Nastavit počáteční čas segmentu"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3056
+#: ../src/gui/general/EditViewBase.cpp:644
+msgid "Segment Duration"
+msgstr "Doba trvání segmentu"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3068
+msgid "Set Segment Durations"
+msgstr "Nastavit doby trvání segmentu"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3069
+#: ../src/gui/general/EditViewBase.cpp:652
+msgid "Set Segment Duration"
+msgstr "Nastavit dobu trvání segmentu"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3176
+#: ../src/gui/application/RosegardenGUIApp.cpp:5875
+msgid "Set Global Tempo"
+msgstr "Nastavit globální tempo"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3234
+#: ../src/gui/general/EditViewBase.cpp:477
+msgid "Toggle the toolbar..."
+msgstr "Přepnout lištu nástrojů..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3244
+msgid "Toggle the tools toolbar..."
+msgstr "Přepnout nástrojovou lištu ovládacích nástrojů..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3254
+msgid "Toggle the tracks toolbar..."
+msgstr "Přepnout nástrojovou lištu pro stopy..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3264
+msgid "Toggle the editor toolbar..."
+msgstr "Přepnout nástrojovou lištu pro editor..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3274
+msgid "Toggle the transport toolbar..."
+msgstr "Přepnout nástrojovou lištu pro transport..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3284
+msgid "Toggle the zoom toolbar..."
+msgstr "Přepnout nástrojovou lištu pro zoom..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3294
+msgid "Toggle the Transport"
+msgstr "Přepnout transport"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3377
+#: ../src/gui/general/EditViewBase.cpp:487
+msgid "Toggle the statusbar..."
+msgstr "Přepnout stavovou lištu..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3434
+msgid ""
+"The join tool isn't implemented yet. Instead please highlight the segments "
+"you want to join and then use the menu option:\n"
+"\n"
+" Segments->Collapse Segments.\n"
+msgstr ""
+"Nástroj pro spojování nebyl dosud implementován. Místo toho vyznačte "
+"segmenty,které chcete spojit, a potom použijte možnost nabídky:\n"
+"\n"
+"........Segmenty->Sjednotit segmenty.\n"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3437
+msgid "Join tool not yet implemented"
+msgstr "Nástroj pro spojování nebyl dosud implementován"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3675
+msgid "Revert modified document to previous saved version?"
+msgstr "Chcete vrátit upravené dokumenty do stavu předešlých uložených verzí?"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3691
+msgid ""
+"*.rgp|Rosegarden Project files\n"
+"*|All files"
+msgstr ""
+"*.rose|Soubory projektů aplikace Rosegarden\n"
+"*|Všechny soubory"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3692
+msgid "Import Rosegarden Project File"
+msgstr "Importovat soubor projektu aplikace Rosegarden"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3717
+msgid "Failed to import project file \"%1\""
+msgstr "Import souboru projektu \"%1\" selhal"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3739
+msgid "Open MIDI File"
+msgstr "Otevřít soubor MIDI"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3756
+msgid "Merge MIDI File"
+msgstr "Připojit soubor MIDI"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3866
+msgid "Importing MIDI file..."
+msgstr "Probíhá import souboru MIDI..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3903
+msgid "Calculating notation..."
+msgstr "Probíhá výpočet notace..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3950
+msgid "Calculate Notation"
+msgstr "Vypočíst notaci"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3991
+#: ../src/gui/application/RosegardenGUIApp.cpp:4008
+msgid ""
+"*.rose|Rosegarden-2 files\n"
+"*|All files"
+msgstr ""
+"*.rose|Soubory Rosegarden-2\n"
+"*|Všechny soubory"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3992
+#: ../src/gui/application/RosegardenGUIApp.cpp:4009
+msgid "Open Rosegarden 2.1 File"
+msgstr "Otevřít soubor aplikace Rosegarden 2.1"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4026
+msgid "Importing Rosegarden 2.1 file..."
+msgstr "Probíhá import souboru aplikace Rosegarden 2.1..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4052
+msgid "Can't load Rosegarden 2.1 file. It appears to be corrupted."
+msgstr "Nelze načíst soubor aplikace Rosegarden 2.1. Zdá se, že je poškozený."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4078
+#: ../src/gui/application/RosegardenGUIApp.cpp:4095
+msgid ""
+"*.h2song|Hydrogen files\n"
+"*|All files"
+msgstr ""
+"*.h2song|Soubory Hydrogen\n"
+"*|Všechny soubory"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4079
+#: ../src/gui/application/RosegardenGUIApp.cpp:4096
+msgid "Open Hydrogen File"
+msgstr "Otevřít soubor Hydrogen"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4113
+msgid "Importing Hydrogen file..."
+msgstr "Probíhá import souboru Hydrogen..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4139
+msgid "Can't load Hydrogen file. It appears to be corrupted."
+msgstr "Nelze načíst soubor Hydrogen. Zdá se, že je poškozený."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4527
+msgid "Export and import of Rosegarden Project files"
+msgstr "Export a import souborů projektu aplikace Rosegarden"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4529
+msgid "The Rosegarden Project Packager helper script"
+msgstr "Skript pomocníka balíčkovače Rosegarden Project Packager"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4533
+msgid "%1 - for project file support"
+msgstr "%1 - pro podporu projektového souboru"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4550
+msgid "The Rosegarden LilyPondView helper script"
+msgstr "Skript pomocníka prohlížeče Rosegarden LilyPondView"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4554
+msgid "%1 - for LilyPond preview support"
+msgstr "%1 - pro podporu náhledů pro aplikaci LilyPond"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4570
+msgid "The Rosegarden Audio File Importer helper script"
+msgstr "Skript pomocníka importu zvukového souboru Rosegarden"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4574
+msgid "%1 - for audio file import"
+msgstr "%1 - pro import zvukového souboru"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4585
+msgid ""
+"<h3>Helper programs not found</h3><p>Rosegarden could not find one or more "
+"helper programs which it needs to provide some features. The following "
+"features will not be available:</p>"
+msgstr ""
+"<h3>Programy pomocníků nebyly nalezeny</h3><p>Aplikace Rosegarden nenalezla "
+"jeden nebo více programů pomocníků, které potřebuje k některým funkcím. "
+"Následující funkce proto nebudou dostupné:</p>"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4586
+#: ../src/gui/application/RosegardenGUIApp.cpp:4592
+msgid "<ul>"
+msgstr "<ul>"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4588
+#: ../src/gui/application/RosegardenGUIApp.cpp:4594
+msgid "<li>%1</li>"
+msgstr "<li>%1</li>"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4590
+#: ../src/gui/application/RosegardenGUIApp.cpp:4596
+msgid "</ul>"
+msgstr "</ul>"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4591
+msgid ""
+"<p>To fix this, you should install the following additional programs:</p>"
+msgstr ""
+"<p>K napravení tohoto stavu byste měli nainstalovat dodatečné programy:</p>"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4603
+msgid "Helper programs not found"
+msgstr "Programy pomocníků nebyly nalezeny"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4686
+msgid "Starting the sequencer..."
+msgstr "Spouští se sekvencer..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4712
+msgid "Couldn't start the sequencer"
+msgstr "Nebylo možné spustit sekvencer"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4789
+msgid "Clearing down jackd..."
+msgstr "Probíhá ukončení démonu jackd..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4803
+msgid "Starting jackd..."
+msgstr "Spouští se démon jackd..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4842
+msgid ""
+"The Rosegarden sequencer process has exited unexpectedly. Sound and "
+"recording will no longer be available for this session.\n"
+"Please exit and restart Rosegarden to restore sound capability."
+msgstr ""
+"Proces sekvenceru aplikace Rosegarden byl nečekaně ukončen. Zvuk a záznam "
+"nebude pro tuto relaci dostupný.\n"
+"Chcete-li obnovit funkci zvuku, ukončete a znovu spusťte aplikaci Rosegarden."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4846
+msgid ""
+"The Rosegarden sequencer could not be started, so sound and recording will "
+"be unavailable for this session.\n"
+"For assistance with correct audio and MIDI configuration, go to http://"
+"rosegardenmusic.com."
+msgstr ""
+"Sekvencer aplikace Rosegarden nebylo možné spustit. Zvuk a záznam tedy "
+"nebude pro tuto relaci dostupný.\n"
+"Informace o správné konfiguraci zvuku a MIDI naleznete na adrese http://"
+"rosegardenmusic.com."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4856
+msgid "Exporting Rosegarden Project file..."
+msgstr "Probíhá export souboru projektu aplikace Rosegarden..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4859
+msgid "Rosegarden Project files\n"
+msgstr "Soubory projektů aplikace Rosegarden\n"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4861
+#: ../src/gui/application/RosegardenGUIApp.cpp:4905
+#: ../src/gui/application/RosegardenGUIApp.cpp:4943
+#: ../src/gui/application/RosegardenGUIApp.cpp:4976
+#: ../src/gui/application/RosegardenGUIApp.cpp:5010
+#: ../src/gui/application/RosegardenGUIApp.cpp:5116
+msgid "Export as..."
+msgstr "Exportovat jako..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4875
+#, c-format
+msgid "Saving Rosegarden file to package failed: %1"
+msgstr "Ukládání souboru aplikace Rosegarden do balíku selhalo: %1"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4889
+msgid "Failed to export to project file \"%1\""
+msgstr "Export do souboru projektu \"%1\" selhal"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4900
+#: ../src/gui/application/RosegardenGUIApp.cpp:4915
+msgid "Exporting MIDI file..."
+msgstr "Probíhá export souboru MIDI..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4903
+msgid "Standard MIDI files\n"
+msgstr "Standardní soubory MIDI\n"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4934
+#: ../src/gui/application/RosegardenGUIApp.cpp:4966
+#: ../src/gui/application/RosegardenGUIApp.cpp:4999
+#: ../src/gui/application/RosegardenGUIApp.cpp:5103
+#: ../src/gui/application/RosegardenGUIApp.cpp:5140
+#: ../src/gui/editors/notation/NotationView.cpp:4733
+msgid "Export failed. The file could not be opened for writing."
+msgstr "Export selhal. Soubor nebylo možné otevřít pro zápis."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4940
+#: ../src/gui/application/RosegardenGUIApp.cpp:4952
+msgid "Exporting Csound score file..."
+msgstr "Probíhá export partiturového souboru score pro Csound..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4972
+#: ../src/gui/application/RosegardenGUIApp.cpp:4985
+msgid "Exporting Mup file..."
+msgstr "Probíhá export souboru Mup..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4975
+msgid "Mup files\n"
+msgstr "Soubory Mup\n"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5005
+#: ../src/gui/application/RosegardenGUIApp.cpp:5089
+#: ../src/gui/editors/notation/NotationView.cpp:4719
+msgid "Exporting LilyPond file..."
+msgstr "Probíhá export souboru aplikace LilyPond..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5008
+msgid "LilyPond files"
+msgstr "Soubory aplikace LilyPond"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5023
+#: ../src/gui/editors/notation/NotationView.cpp:4653
+msgid "Printing LilyPond file..."
+msgstr "Probíhá tisk souboru aplikace LilyPond..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5028
+#: ../src/gui/application/RosegardenGUIApp.cpp:5052
+#: ../src/gui/editors/notation/NotationView.cpp:4658
+#: ../src/gui/editors/notation/NotationView.cpp:4682
+msgid "Failed to open a temporary file for LilyPond export."
+msgstr "Nepodařilo se otevřít dočasný soubor pro export do aplikace LilyPond."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5047
+#: ../src/gui/editors/notation/NotationView.cpp:4677
+msgid "Previewing LilyPond file..."
+msgstr "Zobrazuje se náhled souboru aplikace LilyPond..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5080
+#: ../src/gui/editors/notation/NotationView.cpp:4710
+msgid "LilyPond Preview Options"
+msgstr "Možnosti zobrazení náhledu pro aplikaci LilyPond"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5081
+#: ../src/gui/editors/notation/NotationView.cpp:4711
+msgid "LilyPond preview options"
+msgstr "Možnosti zobrazení náhledu pro aplikaci LilyPond"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5112
+#: ../src/gui/application/RosegardenGUIApp.cpp:5126
+msgid "Exporting MusicXML file..."
+msgstr "Probíhá export souboru MusicXML..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5115
+msgid "XML files"
+msgstr "Soubory XML"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5289
+#: ../src/gui/editors/segment/TrackButtons.cpp:417
+msgid ""
+"The audio file path does not exist or is not writable.\n"
+"Please set the audio file path to a valid directory in Document Properties "
+"before recording audio.\n"
+"Would you like to set it now?"
+msgstr ""
+"Cesta ke zvukovému souboru neexistuje nebo se do ní nedá zapisovat.\n"
+"Nastavte platný adresář jako cestu ke zvukovému souboru ve Vlastnostech "
+"dokumentu před pořizováním zvukového záznamu.\n"
+"Chcete cestu nastavit nyní?"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5337
+msgid ""
+"The audio file path does not exist or is not writable.\n"
+"Please set the audio file path to a valid directory in Document Properties "
+"before you start to record audio.\n"
+"Would you like to set it now?"
+msgstr ""
+"Cesta ke zvukovému souboru neexistuje nebo se do ní nedá zapisovat.\n"
+"Nastavte platný adresář jako cestu ke zvukovému souboru ve Vlastnostech "
+"dokumentu před začátkem pořizování zvukového záznamu.\n"
+"Chcete cestu nastavit nyní?"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5780
+msgid "Move playback pointer to time"
+msgstr "Přesunout ukazatel přehrávání na dobu"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5793
+#: ../src/gui/editors/matrix/MatrixView.cpp:2240
+msgid "%1%"
+msgstr "%1%"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5861
+#, c-format
+msgid "Replace Tempo Change at %1"
+msgstr "Nahradit změnu tempa na místě %1"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5891
+msgid "Set Global and Default Tempo"
+msgstr "Nastavit globální a výchozí tempo"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5914
+msgid "Move Tempo Change"
+msgstr "Přesunout změnu tempa"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5949
+msgid "new marker"
+msgstr "nová záložka"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5950
+msgid "no description"
+msgstr "bez popisu"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:6363
+#, c-format
+msgid "Sequencer failed to add audio file %1"
+msgstr "Sekvenceru se nepodařilo přidat zvukový soubor %1"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:6388
+#, c-format
+msgid "Sequencer failed to remove audio file id %1"
+msgstr "Sekvenceru se nepodařilo odebrat id zvukového souboru %1"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:6448
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:1086
+msgid "Modify Segment label"
+msgstr "Upravit popisek segmentu"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:6450
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:1088
+msgid "Modify Segments label"
+msgstr "Upravit popisky segmentu"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:6452
+msgid "Relabelling selection..."
+msgstr "Probíhá změna popisků výběru..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7539
+msgid "Play List"
+msgstr "Seznam přehrávání"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7567
+msgid "http://rosegarden.sourceforge.net/tutorial/en/chapter-0.html"
+msgstr "http://rosegarden.sourceforge.net/tutorial/en/chapter-0.html"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7574
+msgid "http://rosegarden.sourceforge.net/tutorial/bug-guidelines.html"
+msgstr "http://rosegarden.sourceforge.net/tutorial/bug-guidelines.html"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7650
+msgid "Queueing MIDI panic events for tranmission..."
+msgstr "Probíhá řazení nouzových událostí MIDI do fronty pro přenos..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7708
+msgid "Are you sure you want to save this as your default studio?"
+msgstr "Skutečně chcete toto uložit jako svoje výchozí studio?"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7713
+msgid "Saving current document as default studio..."
+msgstr "Probíhá ukládání aktuálního dokumentu jako výchozího studia..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7738
+msgid ""
+"Are you sure you want to import your default studio and lose the current one?"
+msgstr "Skutečně chcete importovat svoje výchozí studio a ztratit to aktuální?"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7773
+msgid "Import Studio from File"
+msgstr "Importovat studio ze souboru"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7807
+msgid "Import Studio"
+msgstr "Importovat studio"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:8015
+msgid ""
+"<h3>Newer version available</h3><p>A newer version of Rosegarden may be "
+"available.<br>Please consult the <a href=\"http://www.rosegardenmusic.com/"
+"getting/\">Rosegarden website</a> for more information.</p>"
+msgstr ""
+"<h3>Je dostupná novější verze</h3><p>Pravděpodobně je dostupná novější verze "
+"aplikace Rosegarden.<br>Více informací naleznete na webové stránce <a href="
+"\"http://www.rosegardenmusic.com/getting/\">aplikace Rosegarden</a>."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:8016
+msgid "Newer version available"
+msgstr "Je dostupná novější verze"
+
+#: ../src/gui/application/RosegardenApplication.cpp:104
+#, c-format
+msgid "Failed to load soundfont %1"
+msgstr "Selhalo načítání zvukového písma %1"
+
+#: ../src/gui/application/main.cpp:311
+msgid "Rosegarden - A sequencer and musical notation editor"
+msgstr "Aplikace Rosegarden - sekvencer a editor notového zápisu"
+
+#: ../src/gui/application/main.cpp:315
+msgid "Don't use the sequencer (support editing only)"
+msgstr "Nepoužívat sekvencer (je podporována pouze editace)"
+
+#: ../src/gui/application/main.cpp:316
+msgid "Don't show the splash screen"
+msgstr "Nezobrazovat úvodní obrázek"
+
+#: ../src/gui/application/main.cpp:317
+msgid "Don't automatically run in the background"
+msgstr "Nespouštět automaticky na pozadí"
+
+#: ../src/gui/application/main.cpp:318
+msgid "Attach to a running sequencer process, if found"
+msgstr "Připojit ke spuštěnému procesu sekvenceru, je-li nalezen"
+
+#: ../src/gui/application/main.cpp:319
+msgid "Ignore installed version - for devs only"
+msgstr "Ignorovat instalovanou verzi - pouze pro vývojáře"
+
+#: ../src/gui/application/main.cpp:320
+msgid "file to open"
+msgstr "soubor k otevření"
+
+#: ../src/gui/application/main.cpp:370
+msgid "Installation contains the wrong version of Rosegarden."
+msgstr "Instalace obsahuje nesprávnou verzi aplikace Rosegarden."
+
+#: ../src/gui/application/main.cpp:371
+msgid ""
+" The wrong versions of Rosegarden's data files were\n"
+" found in the standard KDE installation directories.\n"
+" (I am %1, but the installed files are for version %2.)\n"
+"\n"
+" This may mean one of the following:\n"
+"\n"
+" 1. This is a new upgrade of Rosegarden, and it has not yet been\n"
+" installed. If you compiled it yourself, check that you have\n"
+" run \"make install\" and that the procedure completed\n"
+" successfully.\n"
+"\n"
+" 2. The upgrade was installed in a non-standard directory,\n"
+" and an old version was found in a standard directory. If so,\n"
+" you will need to add the correct directory to your KDEDIRS\n"
+" environment variable before you can run it."
+msgstr ""
+" Ve standardních instalačních adresářích KDE byly nalezeny\n"
+" nesprávné verze datových souborů aplikace Rosegarden.\n"
+" (Já jsem %1, ale instalované soubory patří k verzi %2.)\n"
+"\n"
+" To může znamenat následující:\n"
+"\n"
+" 1. Toto je nová, vyšší verze aplikace Rosegarden a nebyla ještě\n"
+" nainstalovaná. Pokud jste ji kompilovali sami, zkontrolujte, zda\n"
+" jste spustili \"make install\" a zda tato procedura byla úspěšně\n"
+" dokončena.\n"
+"\n"
+" 2. Vyšší verze byla nainstalovaná do nestandardního adresáře\n"
+" a ve standardním adresáři byla nalezena verze stará. Je-li tomu\n"
+" tak, budete muset nejprve přidat správnou cestu do proměnné KDEDIRS\n"
+" předtím, než bude možné aplikaci spustit."
+
+#: ../src/gui/application/main.cpp:383 ../src/gui/application/main.cpp:401
+msgid "Installation problem"
+msgstr "Instalační problém"
+
+#: ../src/gui/application/main.cpp:389
+msgid "Rosegarden does not appear to have been installed."
+msgstr "Aplikace Rosegarden zřejmě není nainstalovaná."
+
+#: ../src/gui/application/main.cpp:390
+msgid ""
+" One or more of Rosegarden's data files could not be\n"
+" found in the standard KDE installation directories.\n"
+"\n"
+" This may mean one of the following:\n"
+"\n"
+" 1. Rosegarden has not been correctly installed. If you compiled\n"
+" it yourself, check that you have run \"make install\" and that\n"
+" the procedure completed successfully.\n"
+"\n"
+" 2. Rosegarden has been installed in a non-standard directory,\n"
+" and you need to add this directory to your KDEDIRS environment\n"
+" variable before you can run it. This may be the case if you\n"
+" installed into $HOME or a local third-party package directory\n"
+" like /usr/local or /opt."
+msgstr ""
+" Ve standardních instalačních adresářích KDE nebyl nalezen\n"
+" jeden nebo více datových souborů aplikace Rosegarden.\n"
+"\n"
+" To může znamenat následující:\n"
+"\n"
+" 1. Aplikace Rosegarden nebyla správně nainstalovaná. Pokud\n"
+" jste ji kompilovali sami, zkontrolujte, zda jste spustili\n"
+" \"make install\" a zda tato procedura byla úspěšně dokončena.\n"
+"\n"
+" 2. Aplikace Rosegarden byla nainstalovaná do nestandardního adresáře\n"
+" a budete muset nejprve přidat správnou cestu do proměnné KDEDIRS\n"
+" předtím, než bude možné aplikaci spustit. To mohlo nastat, pokud\n"
+" jste instalovali do adresáře $HOME nebo do místního adresáře, který\n"
+" používá instalační balíček třetí strany např. /usr/local nebo /opt."
+
+#: ../src/gui/application/main.cpp:414
+msgid "Rosegarden"
+msgstr "Rosegarden"
+
+#: ../src/gui/application/main.cpp:416
+msgid ""
+"Copyright 2000 - 2008 Guillaume Laurent, Chris Cannam, Richard Bown\n"
+"Parts copyright 1994 - 2004 Chris Cannam, Andy Green, Richard Bown, "
+"Guillaume Laurent\n"
+"LilyPond fonts copyright 1997 - 2005 Han-Wen Nienhuys and Jan Nieuwenhuizen"
+msgstr ""
+"Copyright 2000 - 2008 Guillaume Laurent, Chris Cannam, Richard Bown\n"
+"Částečný copyright 1994 - 2004 Chris Cannam, Andy Green, Richard Bown, "
+"Guillaume Laurent\n"
+"Písma LilyPond - copyright 1997 - 2005 Han-Wen Nienhuys a Jan Nieuwenhuizen"
+
+#: ../src/gui/application/main.cpp:428
+msgid "Chord labelling code"
+msgstr "Kód označování akordů"
+
+#: ../src/gui/application/main.cpp:429
+msgid ""
+"LilyPond output\n"
+"assorted other patches\n"
+"i18n-ization"
+msgstr ""
+"Výstup LilyPond\n"
+"různé další opravy\n"
+"i18n-ization"
+
+#: ../src/gui/application/main.cpp:430
+msgid ""
+"UI improvements\n"
+"bug fixes"
+msgstr ""
+"Vylepšení uživatelského rozhraní\n"
+"opravy chyb"
+
+#: ../src/gui/application/main.cpp:431
+msgid ""
+"Segment colours\n"
+"Other UI and bug fixes"
+msgstr ""
+"Barvy segmentů\n"
+"Jiné uživatelské rozhraní a opravy chyb"
+
+#: ../src/gui/application/main.cpp:432
+msgid ""
+"Russian translation\n"
+"i18n-ization"
+msgstr ""
+"Ruský překlad\n"
+"i18n-ization"
+
+#: ../src/gui/application/main.cpp:433 ../src/gui/application/main.cpp:434
+msgid "German translation"
+msgstr "Německý překlad"
+
+#: ../src/gui/application/main.cpp:435
+msgid "Welsh translation"
+msgstr "Welšský překlad"
+
+#: ../src/gui/application/main.cpp:436
+msgid "French translation"
+msgstr "Francouzský překlad"
+
+#: ../src/gui/application/main.cpp:437
+msgid ""
+"French translation\n"
+"Bug fixes"
+msgstr ""
+"Francouzský překlad\n"
+"Opravy chyb"
+
+#: ../src/gui/application/main.cpp:438 ../src/gui/application/main.cpp:439
+msgid "Italian translation"
+msgstr "Italský překlad"
+
+#: ../src/gui/application/main.cpp:440 ../src/gui/application/main.cpp:441
+msgid "Swedish translation"
+msgstr "Švédský překlad"
+
+#: ../src/gui/application/main.cpp:442
+msgid "Estonian translation"
+msgstr "Estonský překlad"
+
+#: ../src/gui/application/main.cpp:443 ../src/gui/application/main.cpp:444
+msgid "Dutch translation"
+msgstr "Holandský překlad"
+
+#: ../src/gui/application/main.cpp:445
+msgid "HSpinBox class"
+msgstr "Třída HSpinBox"
+
+#: ../src/gui/application/main.cpp:446
+msgid "Transposition by interval"
+msgstr "Transpozice podle intervalu"
+
+#: ../src/gui/application/main.cpp:447
+msgid "Original designs for rotary controllers"
+msgstr "Originální návrhy otočných ovládacích prvků"
+
+#: ../src/gui/application/main.cpp:448
+msgid "Japanese translation"
+msgstr "Japonský překlad"
+
+#: ../src/gui/application/main.cpp:449
+msgid ""
+"Auto-scroll deceleration\n"
+"Rests outside staves and other bug fixes"
+msgstr ""
+"Zpomalování automatického procházení scroll\n"
+"Pomlky mimo osnovu a jiné opravy chyb"
+
+#: ../src/gui/application/main.cpp:450
+msgid "Simplified Chinese translation"
+msgstr "Překlad ve zjednodušené čínštině"
+
+#: ../src/gui/application/main.cpp:451
+msgid "LIRC infrared remote-controller support"
+msgstr "Podpora infračerveného dálkového ovladače LIRC"
+
+#: ../src/gui/application/main.cpp:452
+msgid "MTC slave timing implementation"
+msgstr "Implementace podřízeného časování MTC"
+
+#: ../src/gui/application/main.cpp:453
+msgid "Czech translation"
+msgstr "Český překlad"
+
+#: ../src/gui/application/main.cpp:454
+msgid "SCons/bksys building system"
+msgstr "Budování systému - SCons/bksys"
+
+#: ../src/gui/application/main.cpp:455
+msgid "icons, icons, icons"
+msgstr "ikony, ikony, ikony"
+
+#: ../src/gui/application/main.cpp:456 ../src/gui/application/main.cpp:457
+#: ../src/gui/application/main.cpp:458 ../src/gui/application/main.cpp:459
+msgid "Spanish translation"
+msgstr "Španělský překlad"
+
+#: ../src/gui/application/main.cpp:460 ../src/gui/application/main.cpp:461
+msgid "Catalan translation"
+msgstr "Katalánský překlad"
+
+#: ../src/gui/application/main.cpp:462
+msgid ""
+"1.2.3 splash screen photo\n"
+"Gave birth to D. Michael McIntyre, bought him a good flute once\n"
+"upon a time, and always humored him when he came over to play her\n"
+"some new instrument, even though she really hated his playing.\n"
+"Born October 19, 1951, died September 21, 2007, R. I. P."
+msgstr ""
+"1.2.3 fotografie úvodní obrazovky\n"
+"Narodil se jí D. Michael McIntyr, jednou za čas mu koupila dobrou flétnu\n"
+"a vždy trpělivě poslouchala, když přišel, aby jí zahrál na nějaký\n"
+"nový nástroj, i když jeho hraní skutečně nenáviděla.\n"
+"Narozena 19. října 1951, zemřela 21. září 2007, odpočívej v pokoji."
+
+#: ../src/gui/application/main.cpp:463
+msgid "Initial guitar chord editing code"
+msgstr "Původní kód editace kytarových akordů"
+
+#: ../src/gui/application/main.cpp:464
+msgid "Polish translation"
+msgstr "Polský překlad"
+
+#: ../src/gui/application/main.cpp:465
+msgid "Basque translation"
+msgstr "Baskický překlad"
+
+#: ../src/gui/application/main.cpp:466
+msgid "Klearlook theme"
+msgstr "Téma Klearlook"
+
+#: ../src/_translatorinfo.cpp:1 ../src/gui/application/main.cpp:468
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr "Jan Bína"
+
+#: ../src/_translatorinfo.cpp:3 ../src/gui/application/main.cpp:468
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+
+#: ../src/gui/application/main.cpp:719
+msgid "Welcome!"
+msgstr "Vítejte!"
+
+#: ../src/gui/application/main.cpp:731
+msgid ""
+"<h2>Welcome to Rosegarden!</h2><p>Welcome to the Rosegarden audio and MIDI "
+"sequencer and musical notation editor.</p><ul><li>If you have not already "
+"done so, you may wish to install some DSSI synth plugins, or a separate "
+"synth program such as QSynth. Rosegarden does not synthesize sounds from "
+"MIDI on its own, so without these you will hear nothing.</"
+"li><br><br><li>Rosegarden uses the JACK audio server for recording and "
+"playback of audio, and for playback from DSSI synth plugins. These features "
+"will only be available if the JACK server is running.</"
+"li><br><br><li>Rosegarden has comprehensive documentation: see the Help menu "
+"for the handbook, tutorials, and other information!</li></ul><p>Rosegarden "
+"was brought to you by a team of volunteers across the world. To learn more, "
+"go to <a href=\"http://www.rosegardenmusic.com/\">http://www.rosegardenmusic."
+"com/</a>.</p>"
+msgstr ""
+"<h2>Vítejte v aplikaci Rosegarden!</h2><p>Vítejte v audio a MIDI sekvenceru "
+"a v hudebním notovém editoru Rosegarden.</p><ul><li>Pokud jste tak ještě "
+"neučinili, možná si budete chtít nainstalovat některé moduly syntetizéru "
+"DSSI nebo samostatný programový syntetizér, např. QSynth. Aplikace "
+"Rosegarden sama neprovádí syntézu zvuků ze zařízení MIDI, takže bez této "
+"podpory nic neuslyšíte.</li><br><br><li>Aplikace Rosegarden použivá zvukový "
+"server Jack pro záznam a přehrávání zvuku nebo pro přehrávání z modulů "
+"syntetizéru DSSI. Tyto možnosti budou dostupné pouze tehdy, bude-li server "
+"Jack spuštěný.</li><br><br><li>Aplikace Rosegarden má podrobnou dokumentaci: "
+"viz nabídku nápovědy, kde naleznete příručku, příklady a další informace!</"
+"li></ul><p>Aplikaci Rosegarden pro vás připravil tým dobrovolníků z celého "
+"světa. Chcete-li se dozvědět více, podívejte se na adresu <a href=\"http://"
+"www.rosegardenmusic.com/\">http://www.rosegardenmusic.com/</a>.</p>"
+
+#: ../src/gui/application/RosegardenGUIView.cpp:257
+msgid "No non-audio segments in composition"
+msgstr "Ve skladbě nejsou žádné nezvukové segmenty"
+
+#: ../src/gui/application/RosegardenGUIView.cpp:333
+msgid "Selection must contain only audio or non-audio segments"
+msgstr "Výběr musí obsahovat pouze zvukové nebo nezvukové segmenty"
+
+#: ../src/gui/application/RosegardenGUIView.cpp:431
+#: ../src/gui/application/RosegardenGUIView.cpp:576
+#: ../src/gui/application/RosegardenGUIView.cpp:612
+#: ../src/gui/application/RosegardenGUIView.cpp:776
+msgid "No non-audio segments selected"
+msgstr "Nebyly vybrány žádné nezvukové segmenty"
+
+#: ../src/gui/application/RosegardenGUIView.cpp:851
+msgid ""
+"You've not yet defined an audio editor for Rosegarden to use.\n"
+"See Settings -> Configure Rosegarden -> Audio."
+msgstr ""
+"Dosud jste nedefinovali zvukový editor, který má aplikace Rosegarden "
+"použít.\n"
+"Viz Nastavení -> Konfigurace aplikace Rosegarden -> Zvuk."
+
+#: ../src/gui/application/RosegardenGUIView.cpp:1559
+#: ../src/gui/application/RosegardenGUIView.cpp:1564
+msgid "Can't add dropped file. "
+msgstr "Nelze přidat vyřazený soubor. "
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1014
+#: ../src/gui/seqmanager/SequenceManager.cpp:1150
+msgid ""
+"The JACK Audio subsystem has failed or it has stopped Rosegarden from "
+"processing audio.\n"
+"Please restart Rosegarden to continue working with audio.\n"
+"Quitting other running applications may improve Rosegarden's performance."
+msgstr ""
+"Zvukový subsystém JACK byl ukončen nebo zastavil zpracovávání zvuku aplikací "
+"Rosegarden.\n"
+"Pro pokračování v práci se zvukem restartujte aplikaci Rosegarden.\n"
+"Ukončení ostatních běžících aplikací by mohlo zlepšit výkon aplikace "
+"Rosegarden."
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1020
+#: ../src/gui/seqmanager/SequenceManager.cpp:1156
+msgid ""
+"The JACK Audio subsystem has stopped Rosegarden from processing audio, "
+"probably because of a processing overload.\n"
+"An attempt to restart the audio service has been made, but some problems may "
+"remain.\n"
+"Quitting other running applications may improve Rosegarden's performance."
+msgstr ""
+"Zvukový subsystém JACK zastavil zpracovávání zvuku aplikací Rosegarden, "
+"pravděpodobně z důvodu přetížení.\n"
+"Byl proveden pokus o restart zvukových služeb, některé problémy však mohou "
+"přetrvávat.\n"
+"Ukončení ostatních běžících aplikací by mohlo zlepšit výkon aplikace "
+"Rosegarden."
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1031
+msgid ""
+"Run out of processor power for real-time audio processing. Cannot continue."
+msgstr ""
+"Procesor nemá dostatečný výkon na zpracování zvuku v reálném čase. Nelze "
+"pokračovat."
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1057
+msgid ""
+"A serious error has occurred in the ALSA MIDI subsystem. It may not be "
+"possible to continue sequencing. Please check console output for more "
+"information."
+msgstr ""
+"V subsystému ALSA MIDI dolšo k vážné chybě. Nemusí být dále možné pokračovat "
+"v práci (sekvencer). Více informací naleznete na konzolovém výstupu."
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1078
+msgid "JACK Audio subsystem is losing sample frames."
+msgstr "Zvukový subsystém JACK ztrácí vzorkové rámce."
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1096
+msgid ""
+"Failed to read audio data from disc in time to service the audio subsystem."
+msgstr ""
+"Načítání zvukových dat z disku selhalo z časových důvodu a nebylo tedy možné "
+"obsloužit zvukový subsystém."
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1100
+msgid ""
+"Failed to write audio data to disc fast enough to service the audio "
+"subsystem."
+msgstr ""
+"Zápis zvukových dat na disk selhal, protože nebyl dostatečně rychlý na to, "
+"aby bylo možné obsloužit zvukový subsystém."
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1104
+msgid "The audio mixing subsystem is failing to keep up."
+msgstr "Zvukový směšovací subsystém nestačí svým výkonem držet krok."
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1108
+msgid "The audio subsystem is failing to keep up."
+msgstr "Zvukový subsystém nestačí svým výkonem držet krok."
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1112
+msgid "Unknown sequencer failure mode!"
+msgstr "Neznámý režim selhání sekvenceru!"
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1170
+msgid ""
+"<h3>System timer resolution is too low</h3><p>Rosegarden was unable to find "
+"a high-resolution timing source for MIDI performance.</p><p>This may mean "
+"you are using a Linux system with the kernel timer resolution set too low. "
+"Please contact your Linux distributor for more information.</p><p>Some Linux "
+"distributors already provide low latency kernels, see <a href=\"http://"
+"rosegarden.wiki.sourceforge.net/Low+latency+kernels\">http://rosegarden.wiki."
+"sourceforge.net/Low+latency+kernels</a> for instructions.</p>"
+msgstr ""
+"<h3>Rozlišení časovače systému je příliš nízké.</h3><p>Aplikace Rosegarden "
+"nemohla najít zdroj časování s vysokým rozlišením pro správný výkon MIDI.</"
+"p><p>To může znamenat, že používáte linuxový systém s nastavením rozlišení "
+"časovače v jádře (kernel) na příliš nízkou hodnotu. Více informací získáte u "
+"svého distributora Linuxu.</p><p>Někteří distributoři Linuxu již poskytují "
+"jádra s nízkou latencí, viz <a href=\"http://rosegarden.wiki.sourceforge.net/"
+"Low+latency+kernels\">http://rosegarden.wiki.sourceforge.net/Low+latency"
+"+kernels</a>, kde naleznete další instrukce.</p>"
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1188
+msgid ""
+"<h3>System timer resolution is too low</h3><p>Rosegarden was unable to find "
+"a high-resolution timing source for MIDI performance.</p><p>You may be able "
+"to solve this problem by loading the RTC timer kernel module. To do this, "
+"try running <b>sudo modprobe snd-rtctimer</b> in a terminal window and then "
+"restarting Rosegarden.</p><p>Alternatively, check whether your Linux "
+"distributor provides a multimedia-optimized kernel. See <a href=\"http://"
+"rosegarden.wiki.sourceforge.net/Low+latency+kernels\">http://rosegarden.wiki."
+"sourceforge.net/Low+latency+kernels</a> for notes about this.</p>"
+msgstr ""
+"<h3>Rozlišení časovače systému je příliš nízké.</h3><p>Aplikace Rosegarden "
+"nemohla najít zdroj časování s vysokým rozlišením pro správný výkon MIDI.</"
+"p><p>Tento problém půjde možná odstranit načtením jaderného modulu s RTC "
+"časovačem. To provedete tak, že v okně terminálu zkusíte zadat <b>sudo "
+"modprobe snd-rtctimer</b> a restartujete aplikaci Rosegarden.<p></p>Další "
+"možností je zkontrolovat, zda váš distributor Linuxu neposkytuje kernel s "
+"optimalizací pro multimédia. Viz <a href=\"http://rosegarden.wiki."
+"sourceforge.net/Low+latency+kernels\">http://rosegarden.wiki.sourceforge.net/"
+"Low+latency+kernels</a>, kde naleznete další instrukce.</p>"
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1312
+msgid ""
+"<p>Both MIDI and Audio subsystems have failed to initialize.</p><p>You may "
+"continue without the sequencer, but we suggest closing Rosegarden, running "
+"\"alsaconf\" as root, and starting Rosegarden again. If you wish to run "
+"with no sequencer by design, then use \"rosegarden --nosequencer\" to avoid "
+"seeing this error in the future.</p>"
+msgstr ""
+"<p>U obou subsystémů - MIDI i audio - selhala inicializace.</p><p>Můžete "
+"pokračovat bez sekvenceru, ale doporučujeme spíše zavřít aplikaci "
+"Rosegarden, spustit jako uživatel root \"alsaconf\" a znovu spustit "
+"Rosegarden. Pokud chcete pracovat bez sekvenceru záměrně, použijte možnost "
+"spuštění \"rosegarden --nosequencer\", abyste se s touto chybou v "
+"budoucnosti již nesetkávali.</p>"
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1314
+msgid ""
+"<p>The MIDI subsystem has failed to initialize.</p><p>You may continue "
+"without the sequencer, but we suggest closing Rosegarden, running \"modprobe "
+"snd-seq-midi\" as root, and starting Rosegarden again. If you wish to run "
+"with no sequencer by design, then use \"rosegarden --nosequencer\" to avoid "
+"seeing this error in the future.</p>"
+msgstr ""
+"<p>Inicializace subsystému MIDI selhala.</p><p>Můžete pokračovat bez "
+"sekvenceru, ale doporučujeme spíše zavřít aplikaci Rosegarden, spustit jako "
+"uživatel root \"modprobe snd-seq-midi\" a znovu spustit Rosegarden. Pokud "
+"chcete pracovat bez sekvenceru záměrně, použijte možnost spuštění "
+"\"rosegarden --nosequencer\", abyste se s touto chybou v budoucnosti již "
+"nesetkávali.</p>"
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1316
+msgid ""
+"<p>The Rosegarden sequencer module version does not match the GUI module "
+"version.</p><p>You have probably mixed up files from two different versions "
+"of Rosegarden. Please check your installation.</p>"
+msgstr ""
+"<p>Verze modulu sekvenceru aplikace Rosegarden neodpovídá verzi modulu GUI.</"
+"p> <p>Pravděpodobně jste smíchali soubory ze dvou různých verzí aplikace "
+"Rosegarden. Zkontrolujte si svoji instalaci.</p>"
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1322
+#, c-format
+msgid "<h3>Sequencer startup failed</h3>%1"
+msgstr "<h3>Spuštění sekvenceru selhalo</h3>%1"
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1330
+msgid ""
+"<h3>Failed to connect to JACK audio server.</h3><p>Rosegarden could not "
+"connect to the JACK audio server. This probably means the JACK server is "
+"not running.</p><p>If you want to be able to play or record audio files or "
+"use plugins, you should exit Rosegarden and start the JACK server before "
+"running Rosegarden again.</p>"
+msgstr ""
+"<h3>Připojení ke zvukovému serveru JACK se nezdařilo.</h3> <p>Aplikaci "
+"Rosegarden se nepodařilo připojit ke zvukovému serveru JACK. To "
+"pravděpodobně znamená, že server JACK není spuštěn.</p> <p>Pokud chcete "
+"přehrávat nebo nahrávat zvukové soubory nebo používat zásuvné moduly, měli "
+"byste ukončit aplikaci Rosegarden a spustit server JACK před jejím opětovným "
+"spuštěním.</p>"
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1331
+msgid "Failed to connect to JACK"
+msgstr "Připojení k severu JACK se nepodařilo"
+
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:46
+msgid "Modify MIDI filters..."
+msgstr "Upravit filtry MIDI..."
+
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:58
+msgid "THRU events to ignore"
+msgstr "Průchozí události THRU, které se mají ignorovat"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:131
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:60
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:96
+msgid "Note"
+msgstr "Nota"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:132
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:61
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:97
+msgid "Program Change"
+msgstr "Změna programu"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:136
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:62
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:98
+msgid "Key Pressure"
+msgstr "Tlaková citlivost klávesy"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:137
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:63
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:99
+msgid "Channel Pressure"
+msgstr "Kanálová tlaková citlivost"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:134
+#: ../src/gui/general/EditView.cpp:899
+#: ../src/gui/rulers/ControllerEventsRuler.cpp:198
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:64
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:100
+msgid "Pitch Bend"
+msgstr "Ohýbání výšky tónu"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:133
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:65
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:101
+msgid "Controller"
+msgstr "Ovládací prvek"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:135
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:66
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:102
+msgid "System Exclusive"
+msgstr "Exkluzivní systémový"
+
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:94
+msgid "RECORD events to ignore"
+msgstr "Záznamové události RECORD, které se mají ignorovat"
+
+#: ../src/gui/widgets/TimeWidget.cpp:101
+msgid "Note:"
+msgstr "Nota:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:108 ../src/gui/widgets/TimeWidget.cpp:145
+msgid "<inexact>"
+msgstr "<nepřesné>"
+
+#: ../src/gui/widgets/TimeWidget.cpp:151
+msgid "Units:"
+msgstr "Jednotky:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:173
+msgid "Time:"
+msgstr "Čas:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:184
+msgid "units"
+msgstr "jednotky"
+
+#: ../src/gui/widgets/TimeWidget.cpp:193
+msgid "Measures:"
+msgstr "Takty:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:193
+msgid "Measure:"
+msgstr "Takt:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:212
+msgid "beats:"
+msgstr "doby:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:212
+msgid "beat:"
+msgstr "doba:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:230
+msgid "%1:"
+msgstr "%1:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:254
+msgid "Seconds:"
+msgstr "Sekundy:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:273
+msgid "msec:"
+msgstr "msec:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:407 ../src/gui/widgets/TimeWidget.cpp:531
+msgid "(%1/%2 time)"
+msgstr "(%1/%2 čas"
+
+#: ../src/gui/widgets/TimeWidget.cpp:452
+msgid "(starting %1.%2 qpm, %2.%3 bpm)"
+msgstr "(začíná %1.%2 qpm, %2.%3 bpm)"
+
+#: ../src/gui/widgets/TimeWidget.cpp:458
+msgid "(starting %1.%2 bpm)"
+msgstr "(začíná %1.%2 bpm)"
+
+#: ../src/gui/widgets/TimeWidget.cpp:464
+msgid "(%1.%2 qpm, %2.%3 bpm)"
+msgstr "(%1.%2 qpm, %2.%3 bpm)"
+
+#: ../src/gui/widgets/TimeWidget.cpp:470
+msgid "(%1.%2 bpm)"
+msgstr "(%1.%2 bpm)"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:239
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:60
+msgid "C"
+msgstr "C"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:241
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:61
+msgid "D"
+msgstr "D"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:243
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:62
+msgid "E"
+msgstr "E"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:244
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:63
+msgid "F"
+msgstr "F"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:246
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:64
+msgid "G"
+msgstr "G"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:248
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:65
+msgid "A"
+msgstr "A"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:250
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:66
+msgid "B"
+msgstr "H"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:70
+msgid "-2"
+msgstr "-2"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:71
+msgid "-1"
+msgstr "-1"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:72
+msgid "0"
+msgstr "0"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:73
+msgid "1"
+msgstr "1"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:74
+msgid "2"
+msgstr "2"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:75
+msgid "3"
+msgstr "3"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:76
+msgid "4"
+msgstr "4"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:77
+msgid "5"
+msgstr "5"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:78
+msgid "6"
+msgstr "6"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:79
+msgid "7"
+msgstr "7"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:83
+msgid "double flat"
+msgstr "dvojité béčko"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:84
+msgid "flat"
+msgstr "béčko"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:85
+msgid "natural"
+msgstr "přirozené"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:86
+msgid "sharp"
+msgstr "křížek"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:87
+msgid "double sharp"
+msgstr "dvojitý křížek"
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:234
+#, c-format
+msgid "In %1"
+msgstr "Vstup %1"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:587
+#: ../src/gui/widgets/AudioRouteMenu.cpp:236
+#: ../src/gui/widgets/AudioRouteMenu.cpp:259
+msgid "Master"
+msgstr "Řídící sek."
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:528
+#: ../src/gui/widgets/AudioRouteMenu.cpp:238
+#: ../src/gui/widgets/AudioRouteMenu.cpp:261
+#, c-format
+msgid "Sub %1"
+msgstr "Řízený sek. %1"
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:244
+msgid "In %1 R"
+msgstr "Vstup %1 R"
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:245
+msgid "In %1 L"
+msgstr "Vstup %1 L"
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:247
+msgid "Master R"
+msgstr "Master R"
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:248
+msgid "Master L"
+msgstr "Master L"
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:250
+msgid "Sub %1 R"
+msgstr "Sub %1 R"
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:251
+msgid "Sub %1 L"
+msgstr "Sub %1 L"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:391
+#: ../src/gui/studio/AudioMixerWindow.cpp:522
+#: ../src/gui/widgets/AudioFaderBox.cpp:82
+msgid "Audio plugin button"
+msgstr "Tlačítko zvukového zásuvného modulu"
+
+#: ../src/gui/editors/parameters/AudioInstrumentParameterPanel.cpp:129
+#: ../src/gui/editors/parameters/AudioInstrumentParameterPanel.cpp:357
+#: ../src/gui/widgets/AudioFaderBox.cpp:91
+msgid "<no synth>"
+msgstr "<žádný syntetizér>"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:93
+msgid "Synth plugin button"
+msgstr "Tlačítko zásuvného modulu syntetizéru"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:153
+msgid "Set the audio pan position in the stereo field"
+msgstr "Nstavit pozici pan zvuku ve stereo prostoru"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:155
+msgid "Open synth plugin's native editor"
+msgstr "Otevřít nativní editor zásuvného modulu syntetizéru"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:157
+msgid "Mono or Stereo Instrument"
+msgstr "Nástroj - mono nebo stereo"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:159
+msgid "Record level"
+msgstr "Záznamová úroveň"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:161
+msgid "Playback level"
+msgstr "Přehrávací úroveň"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:345
+#: ../src/gui/studio/AudioMixerWindow.cpp:347
+#: ../src/gui/studio/AudioMixerWindow.cpp:503
+#: ../src/gui/studio/AudioMixerWindow.cpp:505
+#: ../src/gui/widgets/AudioFaderBox.cpp:163
+msgid "Audio level"
+msgstr "Zvuková úroveň"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:170
+msgid "In:"
+msgstr "Vstup:"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:173
+msgid "Out:"
+msgstr "Výstup:"
+
+#: ../src/gui/widgets/ProgressDialog.cpp:48
+#: ../src/gui/widgets/ProgressDialog.cpp:53
+#: ../src/gui/widgets/ProgressDialog.cpp:76
+msgid "Processing..."
+msgstr "Probíhá zpracování..."
+
+#: ../src/gui/configuration/ColourConfigurationPage.h:60
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:130
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:346
+#: ../src/gui/widgets/ColourTable.cpp:52
+msgid "Color"
+msgstr "Barva"
+
+#: ../src/gui/widgets/ColourTable.cpp:68
+msgid "Modify Color Name"
+msgstr "Změnit název barvy"
+
+#: ../src/gui/configuration/ColourConfigurationPage.cpp:129
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:983
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:882
+#: ../src/gui/widgets/ColourTable.cpp:68
+msgid "Enter new name"
+msgstr "Zadejte nový název"
+
+#: ../src/gui/widgets/ColourTable.cpp:107
+msgid "Default Color"
+msgstr "Výchozí barva"
+
+#: ../src/gui/widgets/Rotary.cpp:108
+msgid ""
+"Click and drag up and down or left and right to modify.\n"
+"Double click to edit value directly."
+msgstr ""
+"Klepnutím a tažením nahoru/dolů nebo doprava/doleva provedete změny.\n"
+"Poklepáním můžete upravit hodnotu přímo."
+
+#: ../src/gui/widgets/Rotary.cpp:433
+msgid "Select a new value"
+msgstr "Vybrat novou hodnotu"
+
+#: ../src/gui/widgets/Rotary.cpp:434
+msgid "Enter a new value"
+msgstr "Zadat novou hodnotu"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:80
+msgid "Quantizer"
+msgstr "Kvantizér"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:86
+msgid "Quantizer type:"
+msgstr "Typ kvantizéru:"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:88
+msgid "Grid quantizer"
+msgstr "Rastrový kvantizér"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:89
+msgid "Legato quantizer"
+msgstr "Legatový kvantizér"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:90
+msgid "Heuristic notation quantizer"
+msgstr "Heuristický kvantizér notace"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:94
+msgid "Quantize for notation only (leave performance unchanged)"
+msgstr "Kvantizovat pouze notaci (neměnit provedení)"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:104
+msgid "Notation parameters"
+msgstr "Parametry notace"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:109
+#: ../src/gui/widgets/QuantizeParameters.cpp:150
+msgid "Base grid unit:"
+msgstr "Základní jednotka rastru:"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:114
+msgid "Complexity:"
+msgstr "Složitost:"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:118
+msgid "Very high"
+msgstr "Velmi vysoká"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:119
+msgid "High"
+msgstr "Vysoká"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:224
+#: ../src/gui/widgets/QuantizeParameters.cpp:120
+msgid "Normal"
+msgstr "Normální"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:121
+msgid "Low"
+msgstr "Nízká"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:122
+msgid "Very low"
+msgstr "Velmi nízká"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:125
+msgid "Tuplet level:"
+msgstr "Úroveň rytmické notové skupiny:"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:129
+msgid "2-in-the-time-of-3"
+msgstr "2-na-dobu-3"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4241
+#: ../src/gui/widgets/QuantizeParameters.cpp:130
+msgid "Triplet"
+msgstr "Triola"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:138
+msgid "Any"
+msgstr "Jakákoli"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:141
+msgid "Permit counterpoint"
+msgstr "Povolit kontrapunkt"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:145
+msgid "Grid parameters"
+msgstr "Parametry rastru"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:154
+msgid "Swing:"
+msgstr "Swing:"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:159
+msgid "Iterative amount:"
+msgstr "Iterativní množství:"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:165
+msgid "Quantize durations as well as start times"
+msgstr "Kvantizovat doby trvání i počáteční časy"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:169
+msgid "After quantization"
+msgstr "Po kvantizaci"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:183
+msgid "Show advanced options"
+msgstr "Zobrazit rozšířené možnosti"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:192
+msgid "Re-beam"
+msgstr "Znovu upravit trámce"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:194
+msgid "Add articulations (staccato, tenuto, slurs)"
+msgstr "Přidat artikulaci (staccato, tenuto, legato)"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:195
+msgid "Tie notes at barlines etc"
+msgstr "Svázat noty ligaturou na taktových čárách atd."
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:196
+msgid "Split-and-tie overlapping chords"
+msgstr "Rozdělit-a-svázat ligaturou překrývající se akordy"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:307
+msgid "Full quantize"
+msgstr "Úplná kvantizace"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:450
+msgid "Show Advanced Options"
+msgstr "Zobrazit rozšířené možnosti"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:454
+msgid "Hide Advanced Options"
+msgstr "Skrýt rozšířené možnosti"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:257
+#: ../src/gui/configuration/MatrixConfigurationPage.h:56
+#: ../src/gui/configuration/MatrixConfigurationPage.h:57
+#: ../src/gui/editors/matrix/MatrixView.cpp:2709
+msgid "Matrix"
+msgstr "Matice"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:64
+msgid "Printable headers"
+msgstr "Tisknutelné hlavičky"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:92
+msgid "Dedication"
+msgstr "Věnování"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:96
+#: ../src/gui/editors/segment/PlayListView.cpp:35
+msgid "Title"
+msgstr "Název"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:100
+msgid "Subtitle"
+msgstr "Podtitul"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:104
+msgid "Subsubtitle"
+msgstr "Podpodtitul"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:108
+msgid "Poet"
+msgstr "Textař"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:116
+msgid "Composer"
+msgstr "Skladatel"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:120
+msgid "Meter"
+msgstr "Metrum"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:124
+msgid "Arranger"
+msgstr "Aranžmá"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:128
+msgid "Piece"
+msgstr "Skladba"
+
+#: ../data/fonts/mappings/fonts.cpp:26
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:132
+msgid "Opus"
+msgstr "Opus"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:136
+msgid "Copyright"
+msgstr "Copyright"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:140
+msgid "Tagline"
+msgstr "Motto"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:155
+msgid "The composition comes here."
+msgstr "Sem přijde kompozice."
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:172
+msgid "Non-printable headers"
+msgstr "Netisknutelné hlavičky"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:213
+msgid "Add New Property"
+msgstr "Přidat novou vlastnost"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:217
+msgid "Delete Property"
+msgstr "Odstranit vlastnost"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:236
+msgid "{new property %1}"
+msgstr "{nová vlastnost %1}"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:236
+msgid "{new property}"
+msgstr "{nová vlastnost}"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:243
+msgid "{undefined}"
+msgstr "{nedefinováno}"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:87
+msgid "Double-click opens segment in"
+msgstr "Poklepáním se segment otevře v"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:91
+msgid "Notation editor"
+msgstr "Notový editor"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:92
+msgid "Matrix editor"
+msgstr "Maticový editor"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:93
+msgid "Event List editor"
+msgstr "Editor seznamu událostí"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:99
+msgid "Number of count-in measures when recording"
+msgstr "Počet vypočtených taktů při záznamu"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:109
+msgid "Auto-save interval"
+msgstr "Interval automatického ukládání"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:112
+msgid "Every 30 seconds"
+msgstr "Každých 30 sekund"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:113
+msgid "Every minute"
+msgstr "Každou minutu"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:114
+msgid "Every five minutes"
+msgstr "Každých pět minut"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:115
+msgid "Every half an hour"
+msgstr "Každé půl hodiny"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:116
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:277
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:157
+msgid "Never"
+msgstr "Nikdy"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:140
+msgid "Use JACK transport"
+msgstr "Použít transport JACK"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:173
+msgid "Unknown"
+msgstr "Neznámá"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:179
+msgid "No MIDI, audio OK"
+msgstr "Bez MIDI, zvuk OK"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:182
+msgid "MIDI OK, no audio"
+msgstr "MIDI OK, bez zvuku"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:185
+msgid "MIDI OK, audio OK"
+msgstr "MIDI OK, zvuk OK"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:188
+msgid "No driver"
+msgstr "Není ovladač"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:195
+msgid "Details..."
+msgstr "Podrobnosti..."
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:204
+msgid "Behavior"
+msgstr "Chování"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:219
+msgid "Side-bar parameter box layout"
+msgstr "Rozvržení okna parametrů boční lišty"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:223
+msgid "Vertically stacked"
+msgstr "Vertikálně seřazeno na sobě"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:225
+msgid "Tabbed"
+msgstr "Se záložkami"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:233
+msgid "Note name style"
+msgstr "Styl názvu noty"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:237
+msgid "Always use US names (e.g. quarter, 8th)"
+msgstr "Vždy používat americké názvy (např. quarter, 8th)"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:238
+msgid "Localized (where available)"
+msgstr "Lokalizováno (je-li lokalizace dostupná)"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:252
+msgid "Show textured background on"
+msgstr "Zobrazit pozadí s texturou na"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:254
+msgid "Main window"
+msgstr "Hlavní okno"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:275
+msgid "Use bundled Klearlook theme"
+msgstr "Použít přibalené téma Klearlook"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:278
+msgid "When not running under KDE"
+msgstr "Když není spuštěna pod KDE"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:279
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:159
+msgid "Always"
+msgstr "Vždy"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:287
+msgid "Presentation"
+msgstr "Prezentace"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:423
+msgid ""
+"Changes to the textured background in the main window will not take effect "
+"until you restart Rosegarden."
+msgstr ""
+"Změny provedené v textuře pozadí hlavního okna se neprojeví, dokud aplikaci "
+"Rosegarden nerestartujete."
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:168
+#: ../src/gui/configuration/GeneralConfigurationPage.h:78
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:207
+#: ../src/gui/configuration/MatrixConfigurationPage.cpp:59
+msgid "General"
+msgstr "Obecné"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.h:79
+msgid "General Configuration"
+msgstr "Obecná konfigurace"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:92
+msgid "Base octave number for MIDI pitch display"
+msgstr "Číslo základní oktávy pro displej výšky tónu MIDI"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:107
+msgid "Always use default studio when loading files"
+msgstr "Při načítání souborů vždy používat výchozí studio"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:119
+msgid "Send all MIDI Controllers at start of each playback"
+msgstr "Odeslat všechny ovládací prvky MIDI na začátku přehrávání"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:121
+msgid ""
+"Rosegarden can send all MIDI Controllers (Pan, Reverb etc) to all MIDI "
+"devices every\n"
+"time you hit play if you so wish. Please note that this option will usually "
+"incur a\n"
+"delay at the start of playback due to the amount of data being transmitted."
+msgstr ""
+"Aplikace Rosegarden může odesílat všechny ovládací prvky MIDI (Pan, Reverb "
+"atd.)\n"
+"na všechna zařízení MIDI pokaždé, když stisknete přehrávání. Uvědomte si, že "
+"s tím\n"
+"bude obvykle spojeno zpoždění začátku přehrávání, protože se bude napřed "
+"přenášet značný objem dat."
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:138
+msgid "Sequencer timing source"
+msgstr "Zdroj časování sekvenceru"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:163
+msgid "Load SoundFont to SoundBlaster card at startup"
+msgstr "Načíst zvukové písmo do karty Soundblaster při spuštění"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:164
+msgid ""
+"Check this box to enable soundfont loading on EMU10K-based cards when "
+"Rosegarden is launched"
+msgstr ""
+"Zaškrtnutím tohoto políčka aktivujete načítání zvukového písma do karet typu "
+"EMU10K při spouštění aplikace Rosegarden"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:173
+msgid "Path to 'asfxload' or 'sfxload' command"
+msgstr "Cesta k příkazu 'asfxload' nebo 'sfxload'"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:180
+msgid "SoundFont"
+msgstr "Zvukové písmo"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:223
+msgid "MIDI Clock and System messages"
+msgstr "Čas a systémová hlášení MIDI"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:229
+msgid "Send MIDI Clock, Start and Stop"
+msgstr "Odeslat čas, začátek a konec MIDI"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:230
+msgid "Accept Start, Stop and Continue"
+msgstr "Přijmout začátek, konec a pokračování"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:241
+msgid "MIDI Machine Control mode"
+msgstr "Režim řízení MIDI Machine Control"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:248
+msgid "MMC Master"
+msgstr "Řídící MMC"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:249
+msgid "MMC Slave"
+msgstr "Řízené MMC"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:260
+msgid "MIDI Time Code mode"
+msgstr "Režim časového kódu MIDI"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:267
+msgid "MTC Master"
+msgstr "Řídící MTC"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:268
+msgid "MTC Slave"
+msgstr "Řízené MTC"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:281
+msgid "Automatically connect sync output to all devices in use"
+msgstr ""
+"Automaticky připojit synchronizovaný výstup ke všem používaným zařízením"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:292
+msgid "MIDI Sync"
+msgstr "MIDI Sync"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:308
+msgid "sfxload path"
+msgstr "cesta k sfxload"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:315
+msgid "Soundfont path"
+msgstr "cesta ke zvukovému písmu"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:67
+msgid "%1 minutes %2.%3%4 seconds (%5 units, %6 measures)"
+msgstr "%1 minut %2.%3%4 sekund (%5 jednotek, %6 taktů)"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:133
+msgid "Filename:"
+msgstr "Název souboru:"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:136
+msgid "Formal duration (to end marker):"
+msgstr "Formální doba trvání (ke koncové záložce)"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:141
+msgid "Playing duration:"
+msgstr "Doba trvání přehrávání:"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:146
+msgid "Tracks:"
+msgstr "Stopy:"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:147
+msgid "%1 used, %2 total"
+msgstr "%1 využito, %2 celkem"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:152
+msgid "Segments:"
+msgstr "Segmenty:"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:153
+msgid "%1 MIDI, %2 audio, %3 total"
+msgstr "%1 MIDI, %2 zvuk, %3 celkem"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:161
+msgid "Statistics"
+msgstr "Statistika"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:170
+#: ../src/gui/editors/parameters/InstrumentParameterBox.cpp:155
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:92
+msgid "Track"
+msgstr "Stopa"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:171
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:125
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:90
+msgid "Label"
+msgstr "Popisek"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:172
+msgid "Time"
+msgstr "Čas"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:174
+msgid "Events"
+msgstr "Události"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:175
+msgid "Polyphony"
+msgstr "Polyfonie"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:176
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:126
+msgid "Repeat"
+msgstr "Opakovat"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:178
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:128
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:305
+#: ../src/gui/general/EditView.cpp:1488
+msgid "Transpose"
+msgstr "Transponovat"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:179
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:129
+msgid "Delay"
+msgstr "Zpoždění"
+
+#: ../src/gui/configuration/AudioConfigurationPage.h:61
+#: ../src/gui/configuration/AudioPropertiesPage.h:58
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:204
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:523
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:524
+msgid "Audio"
+msgstr "Zvuk"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:204
+#: ../src/gui/configuration/MIDIConfigurationPage.h:62
+msgid "MIDI"
+msgstr "MIDI"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:317
+msgid "Segment Summary"
+msgstr "Souhrn segmentu"
+
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:63
+msgid "Audio file path:"
+msgstr "Cesta ke zvukovému souboru:"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:137
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:68
+msgid "Choose..."
+msgstr "Vybrat..."
+
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:73
+msgid "Disk space remaining:"
+msgstr "Zbývající místo na disku:"
+
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:78
+msgid "Equivalent minutes of 16-bit stereo:"
+msgstr "Ekvivalentní minuty 16bit sterea:"
+
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:90
+msgid "Modify audio path"
+msgstr "Upravit zvukovou cestu"
+
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:113
+msgid "%1 out of %2 (%3% used)"
+msgstr "%1 z %2 (%3% použito)"
+
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:144
+msgid "minutes at"
+msgstr "minut v"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.h:63
+msgid "MIDI Settings"
+msgstr "Nastavení MIDI"
+
+#: ../src/gui/configuration/AudioConfigurationPage.h:62
+#: ../src/gui/configuration/AudioPropertiesPage.h:59
+msgid "Audio Settings"
+msgstr "Nastavení zvuku"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:87
+msgid "Default layout mode"
+msgstr "Výchozí režim uspořádání"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:91
+msgid "Linear layout"
+msgstr "Lineární uspořádání"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:92
+msgid "Continuous page layout"
+msgstr "Nekonečná stránka"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:93
+msgid "Multiple page layout"
+msgstr "Stránkové uspořádání"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:101
+msgid "Default spacing"
+msgstr "Výchozí rozestupy"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:125
+msgid "Default duration factor"
+msgstr "Výchozí faktor doby trvání"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:141
+msgid "Full"
+msgstr "Úplná"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:152
+msgid "Show track headers (linear layout only)"
+msgstr "Zobrazit hlavičky stop (pouze lineární uspořádání)"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:158
+msgid "When needed"
+msgstr "V případě potřeby"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:166
+msgid ""
+"\"Always\" and \"Never\" mean what they usually mean\n"
+"\"When needed\" means \"when staves are too many to all fit in the current "
+"window\""
+msgstr ""
+"\"Vždy\" a \"Nikdy\" znamená to, co obvykle\n"
+"\"V případě potřeby\" znamená \"je-li příliš mnoho osnov k tomu, aby se "
+"vešly do aktuálního okna\""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:178
+msgid "Show non-notation events as question marks"
+msgstr "Zobrazit události ne-notové povahy jako otazníky"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:188
+msgid "Show notation-quantized notes in a different color"
+msgstr "Zobrazit kvantizované noty notace jinou barvou"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:198
+msgid "Show \"invisible\" events in grey"
+msgstr "Zobrazit \"neviditelné\" události šedou barvou"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:208
+msgid "Show notes outside suggested playable range in red"
+msgstr "Zobrazit noty mimo navržený hratelný rozsah červeně"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:218
+msgid "Highlight superimposed notes with a halo effect"
+msgstr "Zvýraznit překrývající se noty halo efektem"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:231
+msgid "When recording MIDI, split-and-tie long notes at barlines"
+msgstr ""
+"Při nahrávání přes MIDI, rozdělujte a svazujte dlouhé noty na taktových "
+"čarách"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:242
+msgid "Layout"
+msgstr "Uspořádání"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:255
+msgid "Default note style for new notes"
+msgstr "Výchozí styl not pro nové noty"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:287
+msgid "When inserting notes..."
+msgstr "Při vkládání not..."
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:294
+msgid "Split notes into ties to make durations match"
+msgstr "Rozdělit noty ligaturou tak, aby odpovídaly doby trvání"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:295
+msgid "Ignore existing durations"
+msgstr "Ignorovat existující doby trvání"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:305
+msgid "Auto-beam on insert when appropriate"
+msgstr "Provést automatické spojení trámcem při vkládání tam, kde je to vhodné"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:317
+#: ../src/gui/editors/notation/NotationEraser.cpp:54
+msgid "Collapse rests after erase"
+msgstr "Sjednotit pomlky po vymazání"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:328
+msgid "Default paste type"
+msgstr "Výchozí typ vložení"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:350
+msgid "Editing"
+msgstr "Úpravy"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:362
+msgid "Accidentals in one octave..."
+msgstr "Posuvky v jedné oktávě..."
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:364
+msgid "Affect only that octave"
+msgstr "Ovlivní pouze tuto oktávu"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:365
+msgid "Require cautionaries in other octaves"
+msgstr "Vyžadovat varovné posuvky v dalších oktávách"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:366
+msgid "Affect all subsequent octaves"
+msgstr "Ovlivní všechny následující oktávy"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:374
+msgid "Accidentals in one bar..."
+msgstr "Posuvky v jedné taktové čáře..."
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:376
+msgid "Affect only that bar"
+msgstr "Ovlivní pouze tuto taktovou čáru"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:377
+msgid "Require cautionary resets in following bar"
+msgstr "Vyžadovat varovná nová nastavení na následující taktové čáře"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:378
+msgid "Require explicit resets in following bar"
+msgstr "Vyžadovat explicitní nová nastavení na následující taktové čáře"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:386
+msgid "Key signature cancellation style"
+msgstr "Styl rušení předznamenání"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:388
+msgid "Cancel only when entering C major or A minor"
+msgstr "Zrušit pouze při zadávání C dur nebo A moll"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:389
+msgid "Cancel whenever removing sharps or flats"
+msgstr "Zrušit při každém odstraňování křížků nebo béček"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:390
+msgid "Cancel always"
+msgstr "Zrušit pokaždé"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:400
+msgid "Accidentals"
+msgstr "Posuvky"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:441
+msgid "Notation font"
+msgstr "Písmo notace"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:467
+msgid "Origin:"
+msgstr "Originál:"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:471
+msgid "Copyright:"
+msgstr "Copyright:"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:475
+msgid "Mapped by:"
+msgstr "Mapováno:"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:479
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:81
+msgid "Type:"
+msgstr "Typ:"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:508
+msgid "Font size for single-staff views"
+msgstr "Velikost písma pro zobrazení s jednou osnovou"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:516
+msgid "Font size for multi-staff views"
+msgstr "Velikost písma pro zobrazení s více osnovami"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:524
+msgid "Font size for printing (pt)"
+msgstr "Velikost písma pro tisk (v bodech)"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:541
+msgid "Text font"
+msgstr "Písmo textu"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:549
+msgid "Sans-serif font"
+msgstr "Písmo Sans-serif"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:664
+msgid "%1 (smooth)"
+msgstr "%1 (vyhlazený)"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:667
+msgid "%1 (jaggy)"
+msgstr "%1 (nerovný)"
+
+#: ../src/gui/configuration/LatencyConfigurationPage.cpp:58
+msgid "JACK latency"
+msgstr "Latence JACK"
+
+#: ../src/gui/configuration/LatencyConfigurationPage.cpp:61
+msgid ""
+"Use the \"Fetch JACK latencies\" button to discover the latency values set "
+"at\n"
+"the sequencer. It's recommended that you use the returned values but it's "
+"also\n"
+"possible to override them manually using the sliders. Note that if you "
+"change\n"
+"your JACK server parameters you should always fetch the latency values "
+"again.\n"
+"The latency values will be stored by Rosegarden for use next time."
+msgstr ""
+"Pomocí tlačítka \"Načíst latence JACK\" zjistíte hodnoty latencí nastavené "
+"na\n"
+"sekvenceru. Doporučujeme použít tyto vrácené hodnoty. Je však také možné\n"
+"hodnoty ručně přepsat pomocí posuvníků. Uvědomte si, že pokud změníte\n"
+"parametry serveru JACK, měli byste vždy načíst hodnoty latencí znovu.\n"
+"Hodnoty latencí budou aplikací Rosegarden uloženy pro další použití."
+
+#: ../src/gui/configuration/LatencyConfigurationPage.cpp:65
+msgid "JACK playback latency (in ms)"
+msgstr "Latence přehrávání přes JACK (ms)"
+
+#: ../src/gui/configuration/LatencyConfigurationPage.cpp:66
+msgid "JACK record latency (in ms)"
+msgstr "Latence záznamu přes JACK (ms)"
+
+#: ../src/gui/configuration/LatencyConfigurationPage.cpp:68
+msgid "Fetch JACK latencies"
+msgstr "Načíst latence JACK"
+
+#: ../src/gui/configuration/LatencyConfigurationPage.cpp:121
+msgid "JACK Latency"
+msgstr "Latence JACK"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:92
+msgid "Audio preview scale"
+msgstr "Rozsah zvukového náhledu"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:96
+msgid "Linear - easier to see loud peaks"
+msgstr "Lineární - snáze lze vidět hlasité špičky"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:97
+msgid "Meter scaling - easier to see quiet activity"
+msgstr "Měřítko ukazatele - snadněji lze vidět tiché aktivity"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:105
+msgid "Record audio files as"
+msgstr "Zaznamenávat zvukové soubory jako"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:107
+msgid "16-bit PCM WAV format (smaller files)"
+msgstr "16bitový formát PCM WAV (menší soubory)"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:108
+msgid "32-bit float WAV format (higher quality)"
+msgstr "32bitový formát float WAV (vyšší kvalita)"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:117
+msgid "External audio editor"
+msgstr "Externí editor zvuku"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:145
+msgid "Create JACK outputs"
+msgstr "Vytvořit výstupy JACK"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:150
+msgid "for individual audio instruments"
+msgstr "pro jednotlivé zvukové nástroje"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:157
+msgid "for submasters"
+msgstr "pro řízené sekvencery"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:184
+msgid ""
+"Rosegarden can start the JACK audio daemon (jackd) for you automatically if "
+"it isn't already running when Rosegarden starts.\n"
+"\n"
+"This is recommended for beginners and those who use Rosegarden as their main "
+"audio application, but it might not be to the liking of advanced users.\n"
+"\n"
+"If you want to start JACK automatically, make sure the command includes a "
+"full path where necessary as well as any command-line arguments you want to "
+"use.\n"
+"\n"
+"For example: /usr/local/bin/jackd -d alsa -d hw -r44100 -p 2048 -n 2\n"
+"\n"
+msgstr ""
+"Aplikace Rosegarden může spouštět zvukový démon JACK (jackd)\n"
+"automaticky, pokud není již v době startu aplikace Rosegarden spuštěn.\n"
+"\n"
+"Toto je doporučené chování pro začátečníky a ty, kteří používají aplikaci\n"
+"Rosegarden jako hlavní zvukovou aplikaci. Nemusí to však vyhovovat "
+"pokročilým uživatelům.\n"
+"\n"
+"Chcete-li spouštět démon JACK automaticky, ujistěte se, že příkaz obsahuje\n"
+"úplnou cestu, je-li to nutné, stejně jako všechny argumenty příkazové řádky, "
+"které chcete použít.\n"
+"\n"
+"Například: /usr/local/bin/jackd -d alsa -d hw -r44100 -p 2048 -n 2\n"
+"\n"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:196
+msgid "Start JACK when Rosegarden starts"
+msgstr "Spustit démon JACK při spuštění aplikace Rosegarden"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:201
+msgid "JACK command"
+msgstr "Příkaz JACK"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:214
+msgid "JACK Startup"
+msgstr "Spuštění JACK"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:224
+msgid "External audio editor path"
+msgstr "Cesta k externímu editoru zvuku"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:262
+msgid "External audio editor \"%1\" not found or not executable"
+msgstr "Externí zvukový editor \"%1\" nebyl nalezen nebo nelze spustit"
+
+#: ../src/gui/configuration/ColourConfigurationPage.cpp:70
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:448
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:863
+msgid "Add New Color"
+msgstr "Přidat novou barvu"
+
+#: ../src/gui/configuration/ColourConfigurationPage.cpp:74
+msgid "Delete Color"
+msgstr "Odstranit barvu"
+
+#: ../src/gui/configuration/ColourConfigurationPage.cpp:93
+msgid "Color Map"
+msgstr "Barevná mapa"
+
+#: ../src/gui/configuration/ColourConfigurationPage.cpp:128
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:983
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:882
+msgid "New Color Name"
+msgstr "Název nové barvy"
+
+#: ../src/gui/configuration/ColourConfigurationPage.cpp:130
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:59
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:984
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:883
+#: ../src/gui/studio/DeviceManagerDialog.cpp:115
+#: ../src/gui/studio/DeviceManagerDialog.cpp:174
+msgid "New"
+msgstr "Nový"
+
+#: ../src/gui/configuration/LatencyConfigurationPage.h:62
+msgid "Latency"
+msgstr "Latence"
+
+#: ../src/gui/configuration/LatencyConfigurationPage.h:63
+msgid "Sequencer Latency"
+msgstr "Latence sekvenceru"
+
+#: ../src/gui/configuration/ColourConfigurationPage.h:61
+msgid "Color Settings"
+msgstr "Nastavení barev"
+
+#: ../src/gui/studio/MidiDeviceListViewItem.cpp:55
+#: ../src/gui/studio/MidiKeyMapListViewItem.cpp:44
+msgid "Key Mapping"
+msgstr "Mapování tóniny"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:97
+msgid "Manage MIDI Banks and Programs"
+msgstr "Správa bank a programů MIDI"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:128
+msgid "MIDI Device"
+msgstr "Zařízení MIDI"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:130
+#: ../src/gui/studio/BankEditorDialog.cpp:219
+msgid "MSB"
+msgstr "MSB"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:131
+#: ../src/gui/studio/BankEditorDialog.cpp:218
+msgid "LSB"
+msgstr "LSB"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:140
+msgid "Add Bank"
+msgstr "Přidat banku"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:141
+msgid "Add Key Mapping"
+msgstr "Přidat mapování tóniny"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:153
+msgid "Add a Bank to the current device"
+msgstr "Přidat banku k aktuálnímu zařízení"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:157
+msgid "Add a Percussion Key Mapping to the current device"
+msgstr "Přidat mapování tóniny bicích k aktuálnímu zařízení"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:161
+msgid "Delete the current Bank or Key Mapping"
+msgstr "Odstranit aktuální banku nebo mapování tóniny"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:165
+msgid "Delete all Banks and Key Mappings from the current Device"
+msgstr "Odstranit všechny banky a mapování tóniny z aktuálního zařízení"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:167
+#: ../src/gui/studio/DeviceManagerDialog.cpp:117
+msgid "Import..."
+msgstr "Import..."
+
+#: ../src/gui/studio/BankEditorDialog.cpp:168
+#: ../src/gui/studio/DeviceManagerDialog.cpp:118
+msgid "Export..."
+msgstr "Export..."
+
+#: ../src/gui/studio/BankEditorDialog.cpp:176
+msgid ""
+"Import Bank and Program data from a Rosegarden file to the current Device"
+msgstr ""
+"Importovat data banky a programů ze souboru aplikace Rosegarden do "
+"aktuálního zařízení"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:179
+msgid ""
+"Export all Device and Bank information to a Rosegarden format interchange "
+"file"
+msgstr ""
+"Exportovat všechny informace o zařízení a bance ve formátu pro výměnu dat do "
+"souboru aplikace Rosegarden"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:190
+msgid "Copy all Program names from current Bank to clipboard"
+msgstr "Kopírovat všechny názvy programů z aktuální banky do schránky"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:194
+msgid "Paste Program names from clipboard to current Bank"
+msgstr "Vložit názvy programů ze schránky do aktuální banky"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:216
+msgid "Show Variation list based on "
+msgstr "Zobrazit seznam rozdílů podle "
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1010
+msgid "<new bank>"
+msgstr "<nová banka>"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1046
+msgid "<new mapping>"
+msgstr "<nové mapování>"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1048
+msgid "<new mapping %1>"
+msgstr "<nové mapování %1>"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1089
+msgid "Really delete this bank?"
+msgstr "Skutečně chcete odstranit tuto banku?"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1137
+msgid "Really delete this key mapping?"
+msgstr "Skutečně chcete odstranit toto mapování tóniny?"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1187
+msgid "Really delete all banks for "
+msgstr "Skutečně chcete odstranit všechny banky pro "
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1476
+msgid "Import Banks from Device in File"
+msgstr "Importovat banky ze zařízení v souboru"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1623
+#: ../src/gui/studio/DeviceManagerDialog.cpp:770
+msgid "Export Device as..."
+msgstr "Exportovat zařízení jako..."
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1694
+msgid ""
+"There are unsaved changes.\n"
+"Do you want to apply the changes before exiting the Bank Editor or discard "
+"the changes ?"
+msgstr ""
+"Existují neuložené změny.\n"
+"Chcete před ukončením editoru bank změny použít nebo chcete změny zahodit?"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1697
+msgid "Unsaved Changes"
+msgstr "Neuložené změny"
+
+#: ../src/gui/studio/NameSetEditor.cpp:68
+msgid "Librarian"
+msgstr "Knihovník"
+
+#: ../src/gui/studio/NameSetEditor.cpp:75
+msgid "Email"
+msgstr "E-mail"
+
+#: ../src/gui/studio/NameSetEditor.cpp:80
+msgid ""
+"The librarian maintains the Rosegarden device data for this device.\n"
+"If you've made modifications to suit your own device, it might be worth\n"
+"liaising with the librarian in order to publish your information for the "
+"benefit\n"
+"of others."
+msgstr ""
+"Knihovník udržuje data o zařízení aplikace Rosegarden pro toto zařízení.\n"
+"Pokud jste provedli úpravy dat tak, aby vyhovovala vašemu zařízení, bylo by "
+"dobré\n"
+"tyto úpravy sdělit knihovníkovi, aby je mohl publikovat pro využití\n"
+"dalšími uživateli."
+
+#: ../src/gui/studio/MidiBankListViewItem.cpp:51
+#: ../src/gui/studio/MidiDeviceListViewItem.cpp:48
+msgid "Percussion Bank"
+msgstr "Banka bicích"
+
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:84
+#: ../src/gui/studio/MidiBankListViewItem.cpp:51
+#: ../src/gui/studio/MidiDeviceListViewItem.cpp:48
+msgid "Bank"
+msgstr "Banka"
+
+#: ../src/gui/studio/ChangeRecordDeviceCommand.h:39
+msgid "Change Record Device"
+msgstr "Změnit záznamové zařízení"
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:61
+#: ../src/gui/studio/DeviceManagerDialog.cpp:96
+msgid "Manage MIDI Devices"
+msgstr "Správa zařízení MIDI"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:98
+msgid "Play devices"
+msgstr "Přehrávací zařízení"
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:76
+#: ../src/gui/studio/DeviceManagerDialog.cpp:106
+#: ../src/gui/studio/DeviceManagerDialog.cpp:165
+msgid "Connection"
+msgstr "Připojení"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:119
+msgid "Banks..."
+msgstr "Banky..."
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:120
+msgid "Control Events..."
+msgstr "Ovládací události..."
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:126
+msgid "Create a new Play device"
+msgstr "Vytvořit nové přehrávací zařízení"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:129
+#: ../src/gui/studio/DeviceManagerDialog.cpp:184
+msgid "Delete the selected device"
+msgstr "Odstranit vybrané zařízení"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:132
+msgid ""
+"Import Bank, Program and Controller data from a Rosegarden file to the "
+"selected device"
+msgstr ""
+"Importovat data banky, programů a ovládacích prvků ze souboru aplikace "
+"Rosegarden do vybraného zařízení"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:135
+msgid "Export Bank and Controller data to a Rosegarden interchange file"
+msgstr ""
+"Exportovat data banky a ovládacích prvků do formátu souboru pro výměnu dat "
+"aplikace Rosegarden"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:138
+msgid "View and edit Banks and Programs for the selected device"
+msgstr "Zobrazit a upravit banky a programy pro vybrané zařízení"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:141
+msgid ""
+"View and edit Control Events for the selected device - these are special "
+"Event types that you can define against your device and control through "
+"Control Rulers or the Instrument Parameter Box "
+msgstr ""
+"Zobrazit a upravit ovládací události pro vybrané zařízení - jedná se o "
+"speciální typy událostí, které můžete definovat proti svému zařízení a "
+"ovládat prostřednictvím pravítek ovládacích prvků nebo pole s parametry "
+"nástroje "
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:156
+msgid "Record devices"
+msgstr "Záznamová zařízení"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:164
+msgid "Current"
+msgstr "Aktuální"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:181
+msgid "Create a new Record device"
+msgstr "Vytvořit nové záznamové zařízení"
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:360
+#: ../src/gui/studio/DeviceEditorDialog.cpp:378
+#: ../src/gui/studio/DeviceManagerDialog.cpp:486
+#: ../src/gui/studio/DeviceManagerDialog.cpp:501
+msgid "New Device"
+msgstr "Nové zařízení"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:703
+msgid "Import from Device in File"
+msgstr "Importovat ze zařízení v souboru"
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:55
+msgid "Remap Instrument assigments..."
+msgstr "Přemapovat přidělení nástrojů..."
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:62
+msgid "Device or Instrument"
+msgstr "Zařízení nebo nástroj"
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:65
+msgid "Remap Tracks by all Instruments on a Device or by single Instrument"
+msgstr "Přemapovat stopy všemi nástroji zařízení nebo jediným nástrojem"
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:74
+msgid "Choose Source and Destination"
+msgstr "Vybrat zdroj a cílové umístění"
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:77
+msgid "From"
+msgstr "Od"
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:78
+msgid "To"
+msgstr "Do"
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:120
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:121
+msgid "<no devices>"
+msgstr "<žádná zařízení>"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:155
+msgid "Show Audio &Faders"
+msgstr "Zobrazit &zeslabovače zvuku"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:160
+msgid "Show Synth &Faders"
+msgstr "Zobrazit &zeslabovače syntetizéru"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:165
+msgid "Show &Submasters"
+msgstr "Zobrazit ří&zené sekvencery"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:170
+msgid "Show &Plugin Buttons"
+msgstr "Zobrazit tlačítka zásuvných &modulů"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:175
+msgid "Show &Unassigned Faders"
+msgstr "Zobrazit &nepřiřazené zeslabovače"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:184
+#, c-format
+msgid ""
+"_n: 1 Input\n"
+"%n Inputs"
+msgstr ""
+"_n: 1 Vstup\n"
+"%n Vstupy"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:194
+msgid "No Submasters"
+msgstr "Žádné řízené sekvencery"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:203
+#, c-format
+msgid ""
+"_n: 1 Submaster\n"
+"%n Submasters"
+msgstr ""
+"_n: 1 Řízený sek.\n"
+"%n Řízené sek."
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:279
+msgid "Audio Mixer"
+msgstr "Zvukový směšovač"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:311
+msgid "Record input source"
+msgstr "Záznamový vstupní zdroj"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:322
+msgid "Output destination"
+msgstr "Výstupní cílové zařízení"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:336
+#: ../src/gui/studio/AudioMixerWindow.cpp:495
+msgid "Pan"
+msgstr "Pan"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:355
+msgid "Mono or stereo"
+msgstr "Mono nebo stereo"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:364
+#: ../src/gui/studio/AudioMixerWindow.cpp:513
+msgid "Mute"
+msgstr "Ztlumit"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:373 rc.cpp:408
+#, no-c-format
+msgid "Solo"
+msgstr "Sólo"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:382
+msgid "Arm recording"
+msgstr "Připravit záznam"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:400
+#, c-format
+msgid "Audio %1"
+msgstr "Zvuk %1"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:404
+#, c-format
+msgid "Synth %1"
+msgstr "Syntetizér %1"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:578
+#: ../src/gui/studio/AudioMixerWindow.cpp:580
+msgid "Audio master output level"
+msgstr "Zvuková řídící výstupní úroveň"
+
+#: ../src/gui/studio/SynthPluginManagerDialog.cpp:71
+msgid "Manage Synth Plugins"
+msgstr "Správa zásuvných modulů syntetizérů"
+
+#: ../src/gui/studio/SynthPluginManagerDialog.cpp:78
+msgid "Synth plugins"
+msgstr "Zásuvné moduly syntetizérů"
+
+#: ../src/gui/studio/SynthPluginManagerDialog.cpp:145
+msgid "Controls"
+msgstr "Ovládací prvky"
+
+#: ../src/gui/studio/SynthPluginManagerDialog.cpp:152
+msgid "Editor >>"
+msgstr "Editor >>"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:66
+#: ../src/gui/studio/MidiProgramsEditor.cpp:169
+msgid "Bank and Program details"
+msgstr "Podrobnosti banky a programů"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:67
+msgid "Programs"
+msgstr "Programy"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2711
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:88
+#: ../src/gui/studio/MidiProgramsEditor.cpp:93
+msgid "Percussion"
+msgstr "Bicí"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:99
+msgid "MSB Value"
+msgstr "Hodnota MSB"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:107
+msgid ""
+"Selects a MSB controller Bank number (MSB/LSB pairs are always unique for "
+"any Device)"
+msgstr ""
+"Vybere číslo banky ovládacího prvku MSB (páry MSB/LSB jsou pro jakékoli "
+"zařízení vždy jednoznačné)"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:111
+msgid ""
+"Selects a LSB controller Bank number (MSB/LSB pairs are always unique for "
+"any Device)"
+msgstr ""
+"Vybere číslo banky ovládacího prvku LSB (páry MSB/LSB jsou pro jakékoli "
+"zařízení vždy jednoznačné)"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:116
+msgid "LSB Value"
+msgstr "Hodnota LSB"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:254
+#: ../src/gui/studio/MidiProgramsEditor.cpp:541
+#, c-format
+msgid "Key Mapping: %1"
+msgstr "Mapování tóniny: %1"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:476
+msgid "<no key mapping>"
+msgstr "<bez mapování tóniny>"
+
+#: ../src/gui/studio/MidiKeyMappingEditor.cpp:57
+#: ../src/gui/studio/MidiKeyMappingEditor.cpp:81
+msgid "Key Mapping details"
+msgstr "Podrobnosti o mapování tóniny"
+
+#: ../src/gui/studio/MidiKeyMappingEditor.cpp:58
+msgid "Pitches"
+msgstr "Výšky tónů"
+
+#: ../src/gui/studio/MidiMixerWindow.cpp:152
+msgid "MIDI Mixer"
+msgstr "Směšovač MIDI"
+
+#: ../src/gui/studio/MidiMixerWindow.cpp:199
+msgid "Volume"
+msgstr "Hlasitost"
+
+#: ../src/gui/studio/AudioPluginOSCGUIManager.cpp:444
+msgid "Rosegarden Plugin"
+msgstr "Zásuvný modul aplikace Rosegarden"
+
+#: ../src/gui/studio/AudioPluginOSCGUIManager.cpp:447
+#, c-format
+msgid "Rosegarden: %1"
+msgstr "Rosegarden: %1"
+
+#: ../src/gui/studio/AudioPluginOSCGUIManager.cpp:449
+msgid "Rosegarden: %1: %2"
+msgstr "Rosegarden: %1: %2"
+
+#: ../src/gui/studio/AudioPluginOSCGUIManager.cpp:450
+#, c-format
+msgid "Plugin slot %1"
+msgstr "Slot %1 zásuvného modulu"
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:92
+msgid "Add Play Device"
+msgstr "Přidat přehrávací zařízení"
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:93
+msgid "Add Record Device"
+msgstr "Přidat záznamové zařízení"
+
+#: ../src/commands/studio/CreateOrDeleteDeviceCommand.h:68
+#: ../src/gui/studio/DeviceEditorDialog.cpp:94
+msgid "Delete Device"
+msgstr "Odstranit zařízení"
+
+#: ../src/gui/editors/segment/PlayList.cpp:77
+#: ../src/gui/studio/DeviceEditorDialog.cpp:156
+#: ../src/gui/studio/DeviceEditorDialog.cpp:361
+msgid "Play"
+msgstr "Přehrát"
+
+#: ../src/commands/segment/SegmentRecordCommand.cpp:37
+#: ../src/gui/studio/DeviceEditorDialog.cpp:156
+#: ../src/gui/studio/DeviceEditorDialog.cpp:379 rc.cpp:394
+#, no-c-format
+msgid "Record"
+msgstr "Zaznamenat"
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:256
+msgid "Apply pending changes?"
+msgstr "Chcete použít dosud nezpracované změny?"
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:359
+#: ../src/gui/studio/DeviceEditorDialog.cpp:377
+msgid "<new device>"
+msgstr "<nové zařízení>"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentEraser.cpp:82
+msgid "Click on a segment to delete it"
+msgstr "Chcete-li segment odstranit, klepněte na něj"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSplitter.cpp:166
+msgid ""
+"Click on a segment to split it in two; hold Shift to avoid snapping to beat "
+"grid"
+msgstr ""
+"Chcete-li segment rozdělit na dva, klepněte na něj; podržte přitom tlačítko "
+"Shift, abyste se vyhnuli přichytávání na mřížku dob"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSplitter.cpp:168
+msgid "Click on a segment to split it in two"
+msgstr "Chcete-li segment rozdělit na dva, klepněte na něj"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:81
+msgid "Click and drag to select segments"
+msgstr "Klepnutím a tažením segmenty vyberete"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentMover.cpp:154
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:238
+msgid "Move Segment"
+msgstr "Přesunout segment"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentMover.cpp:154
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:239
+msgid "Move Segments"
+msgstr "Přesunout segmenty"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:217
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:169
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:141
+#: ../src/gui/editors/segment/segmentcanvas/SegmentMover.cpp:210
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:255
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:359
+msgid "Hold Shift to avoid snapping to beat grid"
+msgstr "Podržte tlačítko Shift, abyste se vyhnuli přichytávání na mřížku dob"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:485
+msgid ""
+"Click and drag to select segments; middle-click and drag to draw an empty "
+"segment"
+msgstr ""
+"Klepnutím a tažením segmenty vyberete; klepnutím prostředním tlačítkem a "
+"tažením nakreslíte prázdný segment"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:384
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:502
+msgid ""
+"Click and drag to resize a segment; hold Ctrl as well to rescale its contents"
+msgstr ""
+"Klepnutím a tažením změníte velikost segmentu; podržíte-li tlačítko Ctrl, "
+"změníte také délku jeho obsahu"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:386
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:504
+msgid "Click and drag to rescale segment"
+msgstr "Klepnutím a tažením změníte délku segmentu"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:509
+msgid "Click and drag to move segments; hold Ctrl as well to copy them"
+msgstr ""
+"Klepnutím a tažením přesunete segmenty; podržíte-li tlačítko Ctrl, můžete je "
+"také kopírovat"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:511
+msgid "Click and drag to copy segments"
+msgstr "Klepnutím a tažením zkopírujete segmenty"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:515
+msgid ""
+"Click and drag to move segment; hold Ctrl as well to copy it; double-click "
+"to edit"
+msgstr ""
+"Klepnutím a tažením přesunete segmenty; podržíte-li tlačítko Ctrl, můžete je "
+"také kopírovat; poklepáním je lze upravovat"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:517
+msgid "Click and drag to copy segment"
+msgstr "Klepnutím a tažením zkopírujete segment"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:157
+msgid ""
+"The audio file path does not exist or is not writable.\n"
+"You must set the audio file path to a valid directory in Document Properties "
+"before rescaling an audio file.\n"
+"Would you like to set it now?"
+msgstr ""
+"Cesta ke zvukovému souboru neexistuje nebo se do ní nedá zapisovat.\n"
+"Nastavte platný adresář jako cestu ke zvukovému souboru ve Vlastnostech "
+"dokumentu před změnou délky zvukového záznamu.\n"
+"Chcete cestu nastavit nyní?"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:261
+msgid ""
+"Hold Shift to avoid snapping to beat grid; hold Ctrl as well to rescale "
+"contents"
+msgstr ""
+"Podržením tlačítka Shift (přesmykače) se vyhnete přichytávání na mřížku dob; "
+"podržíte-li tlačítko Ctrl, můžete také měnit délku obsahu"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentMover.cpp:325
+msgid "Click and drag to move a segment"
+msgstr "Klepnutím a tažením přesunete segment"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentPencil.cpp:225
+msgid "Hold Shift to avoid snapping to bar lines"
+msgstr ""
+"Podržením tlačítka Shift (přesmykače) se vyhnete přichytávání na taktové čáry"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentPencil.cpp:283
+msgid "Record or drop audio here"
+msgstr "Sem přetáhněte nebo zde zaznamenejte zvuk"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentPencil.cpp:289
+msgid ""
+"Click and drag to draw an empty segment. Control+Alt click and drag to draw "
+"in overlap mode."
+msgstr ""
+"Klepnutím a tažením vytvoříte prázdný segment. Klepnutím a tažením se "
+"stisknutým CTRL+Alt budete pracovat v překryvném režimu."
+
+#: ../src/gui/editors/segment/TrackLabel.cpp:77
+msgid ""
+"Click and hold with left mouse button to assign this Track to an Instrument."
+msgstr ""
+"Klepnutím a podržením levého tlačítka myši přiřadíte tuto stopu nástroji."
+
+#: ../src/gui/editors/segment/TrackLabel.cpp:191
+msgid "Change track name"
+msgstr "Změnit název stopy"
+
+#: ../src/gui/editors/segment/TrackLabel.cpp:192
+msgid "Enter new track name"
+msgstr "Zadejte nový název stopy"
+
+#: ../src/gui/editors/segment/TrackEditor.cpp:648
+msgid "Turn Repeating Segment into Real Copies"
+msgstr "Převést opakující se segment na skutečné kopie"
+
+#: ../src/gui/editors/segment/TrackEditor.cpp:650
+msgid "Turn Repeating Segments into Real Copies"
+msgstr "Převést opakující se segmenty na skutečné kopie"
+
+#: ../src/gui/editors/segment/TrackEditor.cpp:814
+msgid ""
+"You can't drop files into Rosegarden from this client. Try using Konqueror "
+"instead."
+msgstr ""
+"Z tohoto klienta nelze do aplikace Rosegarden přetahovat soubory. Zkuste "
+"použít aplikaci Konqueror."
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:85
+msgid "Manage Triggered Segments"
+msgstr "Správa spouštěných segmentů"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:89
+msgid "ID"
+msgstr "ID"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:735
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:93
+msgid "Base velocity"
+msgstr "Základní rychlost:"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:94
+msgid "Triggers"
+msgstr "Spouštěcí značky"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:115
+msgid "Add a Triggered Segment"
+msgstr "Přidat spouštěný segment"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:119
+msgid "Delete a Triggered Segment"
+msgstr "Odstranit spouštěný segment"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:123
+msgid "Delete All Triggered Segments"
+msgstr "Odstranit všechny spouštěné segmenty"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:127
+msgid "Close the Triggered Segment Manager"
+msgstr "Zavřít správce spouštěných segmentů"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:169
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:245
+msgid "<no label>"
+msgstr "<bez popisku>"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:248
+msgid ""
+"_n: %1 on 1 track\n"
+"%1 on %n tracks"
+msgstr ""
+"%1 na 1 stopě\n"
+"%1 na %n stopách"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:284
+msgid ""
+"This will remove all triggered segments from the whole composition. Are you "
+"sure?"
+msgstr ""
+"Tímto dojde k odebrání všech spouštěných segmentů z celé skladby. Skutečně "
+"to chcete provést?"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:288
+msgid "Remove all triggered segments"
+msgstr "Odebrat všechny spouštěné segmenty"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:313
+msgid "Trigger Segment Duration"
+msgstr "Doba trvání spouštěcího segmentu"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:336
+#, c-format
+msgid ""
+"_n: This triggered segment is used 1 time in the current composition. Are "
+"you sure you want to remove it?\n"
+"This triggered segment is used %n times in the current composition. Are you "
+"sure you want to remove it?"
+msgstr ""
+"_n: Tento spouštěný segment je použit v aktuální skladbě %1 krát. Skutečně "
+"jej chcete odebrat?\n"
+"Tento spouštěný segment je použit v aktuální skladbě %n krát. Skutečně jej "
+"chcete odebrat?"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:400
+msgid "Pa&ste as New Triggered Segment"
+msgstr "&Vložit jako nový spouštěný segment"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1169
+#: ../src/gui/editors/segment/MarkerEditor.cpp:399
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:412
+#: ../src/gui/editors/tempo/TempoView.cpp:622
+msgid "&Musical Times"
+msgstr "&Hudební čas"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1179
+#: ../src/gui/editors/segment/MarkerEditor.cpp:409
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:422
+#: ../src/gui/editors/tempo/TempoView.cpp:632
+msgid "&Real Times"
+msgstr "&Skutečný čas"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1189
+#: ../src/gui/editors/segment/MarkerEditor.cpp:419
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:432
+#: ../src/gui/editors/tempo/TempoView.cpp:642
+msgid "Ra&w Times"
+msgstr "H&rubý čas"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:83
+msgid "Manage Markers"
+msgstr "Správa záložek"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:86
+msgid "Marker time "
+msgstr "Čas záložky "
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:87
+msgid "Marker text "
+msgstr "Text záložky "
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:88
+msgid "Marker description "
+msgstr "Popis záložky "
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:95
+msgid "Pointer position"
+msgstr "Pozice ukazatele"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:100
+msgid "Real time:"
+msgstr "Skutečný čas:"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:103
+msgid "In measure:"
+msgstr "V taktu:"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:121
+msgid "Add a Marker"
+msgstr "Přidat záložku"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:125
+msgid "Delete a Marker"
+msgstr "Odstranit záložku"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:129
+msgid "Delete All Markers"
+msgstr "Odstranit všechny záložky"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:133
+msgid "Close the Marker Editor"
+msgstr "Zavřít editor záložek"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:296
+msgid "Remove all markers"
+msgstr "Odstranit všechny záložky"
+
+#: ../src/gui/editors/segment/PlayList.cpp:76
+msgid "Add..."
+msgstr "Přidat..."
+
+#: ../src/gui/editors/segment/PlayList.cpp:78
+msgid "Move Up"
+msgstr "Posunout nahoru"
+
+#: ../src/gui/editors/segment/PlayList.cpp:79
+msgid "Move Down"
+msgstr "Posunout dolů"
+
+#: ../src/gui/editors/segment/PlayList.cpp:124
+msgid "Select one or more Rosegarden files"
+msgstr "Vybrat jeden nebo více souborů aplikace Rosegarden"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:73
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:55
+msgid "<not showing>"
+msgstr "<nezobrazuje se>"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:89
+msgid "Manage Control Events"
+msgstr "Správa ovládacích událostí"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:91
+msgid "<no device>"
+msgstr "<žádné zařízení>"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:99
+msgid " Control Events for %1 (device %2)"
+msgstr " Ovládací události pro %1 (zařízení %2)"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:104
+msgid "Control Event name "
+msgstr "Název ovládací události "
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:105
+msgid "Control Event type "
+msgstr "Typ ovládací události "
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:106
+msgid "Control Event value "
+msgstr "Hodnota ovládací události "
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:107
+msgid "Description "
+msgstr "Popis "
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:108
+msgid "Min "
+msgstr "Min "
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:109
+msgid "Max "
+msgstr "Max "
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:110
+msgid "Default "
+msgstr "Výchozí "
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:111
+msgid "Color "
+msgstr "Barva "
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:112
+msgid "Position on instrument panel"
+msgstr "Pozice na panelu nástrojů"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:136
+msgid "Add a Control Parameter to the Studio"
+msgstr "Přidat ovládací parametr do studia"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:140
+msgid "Delete a Control Parameter from the Studio"
+msgstr "Odstranit ovládací parametr ze studia"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:144
+msgid "Close the Control Parameter editor"
+msgstr "Zavřít editor ovládacích parametrů"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:221
+msgid "<default>"
+msgstr "<výchozí>"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:62
+msgid "Edit Control Parameter"
+msgstr "Upravit ovládací parametr"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:71
+msgid "Control Event Properties"
+msgstr "Vlastnosti ovládací události"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:77
+msgid "Name:"
+msgstr "Název:"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:93
+msgid "Control Event value:"
+msgstr "Hodnota ovládací události:"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:97
+msgid "Minimum value:"
+msgstr "Minimální hodnota:"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:101
+msgid "Maximum value:"
+msgstr "Maximální hodnota:"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:105
+msgid "Default value:"
+msgstr "Výchozí hodnota:"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:109
+msgid "Color:"
+msgstr "Barva:"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:113
+msgid "Instrument Parameter Box position:"
+msgstr "Pozice pole s parametry nástroje:"
+
+#: ../src/gui/editors/segment/TrackButtons.cpp:209
+#: ../src/gui/editors/segment/TrackButtons.cpp:585
+#: ../src/gui/editors/segment/TrackButtons.cpp:935
+#: ../src/gui/editors/segment/TrackButtons.cpp:1127
+msgid "<no instrument>"
+msgstr "<žádný nástroj>"
+
+#: ../src/gui/editors/segment/TrackButtons.cpp:352
+#: ../src/gui/editors/segment/TrackButtons.cpp:1094
+msgid "<untitled audio>"
+msgstr "<zvuk bez názvu>"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:130
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:662
+#: ../src/gui/editors/segment/TrackButtons.cpp:354
+#: ../src/gui/editors/segment/TrackButtons.cpp:1096
+msgid "<untitled>"
+msgstr "<bez názvu>"
+
+#: ../src/gui/editors/segment/TrackButtons.cpp:1058
+msgid "Mute track"
+msgstr "Ztlumit stopu"
+
+#: ../src/gui/editors/segment/TrackButtons.cpp:1063
+msgid "Record on this track"
+msgstr "Zaznamenat na tuto stopu"
+
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:88
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:1015
+msgid "Segment"
+msgstr "Segment"
+
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:89
+msgid "Segment Parameters"
+msgstr "Parametry segmentu"
+
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:366
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:697
+msgid "%1 ms"
+msgstr "%1 ms"
+
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:1031
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:910
+msgid "Highest playable note"
+msgstr "Nejvyšší hratelná nota"
+
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:1051
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:930
+msgid "Lowest playable note"
+msgstr "Nejnižší hratelná nota"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:93
+msgid "Track Parameters"
+msgstr "Parametry stopy"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:137
+msgid "Playback parameters"
+msgstr "Parametry přehrávání"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:172
+msgid "Recording filters"
+msgstr "Záznamové filtry"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:191
+msgid "Channel"
+msgstr "Kanál"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:203
+msgid "Staff export options"
+msgstr "Možnosti exportu osnovy"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:220
+msgid "Notation size:"
+msgstr "Velikost notace:"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:225
+msgid "Small"
+msgstr "Malá"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:226
+msgid "Tiny"
+msgstr "Drobná"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:233
+msgid "Bracket type:"
+msgstr "Typ závorky:"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:237
+msgid "-----"
+msgstr "-----"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:238
+msgid "[----"
+msgstr "[----"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:239
+msgid "----]"
+msgstr "----]"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:240
+msgid "[---]"
+msgstr "[---]"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:241
+msgid "{----"
+msgstr "{----"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:242
+msgid "----}"
+msgstr "----}"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:243
+msgid "{[---"
+msgstr "{[---"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:244
+msgid "---]}"
+msgstr "---]}"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:253
+msgid "Create segments with"
+msgstr "Vytvořit segmenty s"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:264
+msgid "Preset"
+msgstr "Přednastavit"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:272
+msgid "Load"
+msgstr "Načíst"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:282
+msgid "treble"
+msgstr "houslový"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:283
+msgid "bass"
+msgstr "basový"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:284
+msgid "crotales"
+msgstr "chrastítka"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:285
+msgid "xylophone"
+msgstr "xylofon"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:286
+msgid "guitar"
+msgstr "kytara"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:287
+msgid "contrabass"
+msgstr "kontrabas"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:288
+msgid "celesta"
+msgstr "celesta"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:289
+msgid "old celesta"
+msgstr "stará celesta"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:290
+msgid "french"
+msgstr "francouzský"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:291
+msgid "soprano"
+msgstr "sopránový"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:292
+msgid "mezzosoprano"
+msgstr "mezosopránový"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:293
+msgid "alto"
+msgstr "violový"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:294
+msgid "tenor"
+msgstr "tenorový"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:295
+msgid "baritone"
+msgstr "barytonový"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:296
+msgid "varbaritone"
+msgstr "varbarytonový"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:297
+msgid "subbass"
+msgstr "subbasový"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:327
+msgid "Lowest"
+msgstr "Nejnižší"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:329
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:336
+msgid "---"
+msgstr "---"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:331
+msgid "Choose the lowest suggested playable note, using a staff"
+msgstr "Pomocí osnovy vyberte nejnižší navrhovanou, hratelnou notu"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:334
+msgid "Highest"
+msgstr "Nejvyšší"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:338
+msgid "Choose the highest suggested playable note, using a staff"
+msgstr "Pomocí osnovy vyberte nejvyšší navrhovanou, hratelnou notu"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:666
+msgid "[ Track %1 - %2 ]"
+msgstr "[ Stopa %1 - %2 ]"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:985
+msgid "The instrument preset database is corrupt. Check your installation."
+msgstr ""
+"Databáze přednastavených nástrojů je porušená. Zkontrolujte instalaci."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:173
+#: ../src/gui/editors/parameters/InstrumentParameterBox.cpp:54
+msgid "Instrument Parameters"
+msgstr "Parametry nástroje"
+
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:85
+msgid "Variation"
+msgstr "Rozdíl"
+
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:86
+msgid "Program"
+msgstr "Program"
+
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:87
+msgid "Channel out"
+msgstr "Výstupní kanál"
+
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:215
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:221
+msgid "[ %1 ]"
+msgstr "[ %1 ]"
+
+#: ../src/gui/editors/matrix/MatrixEraser.cpp:58
+#: ../src/gui/editors/matrix/MatrixMover.cpp:71
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:67
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:77
+msgid "Switch to Draw Tool"
+msgstr "Přepnout na nástroj pro kreslení"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:75
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:69
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:71
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:81
+#: ../src/gui/editors/notation/ClefInserter.cpp:57
+#: ../src/gui/editors/notation/GuitarChordInserter.cpp:63
+#: ../src/gui/editors/notation/NotationSelector.cpp:87
+#: ../src/gui/editors/notation/NoteInserter.cpp:113
+#: ../src/gui/editors/notation/RestInserter.cpp:72
+#: ../src/gui/editors/notation/TextInserter.cpp:61
+msgid "Switch to Erase Tool"
+msgstr "Přepnout na nástroj pro mazání"
+
+#: ../src/gui/editors/matrix/MatrixEraser.cpp:62
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:73
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:75
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:85
+msgid "Switch to Move Tool"
+msgstr "Přepnout na nástroj pro přesun"
+
+#: ../src/gui/editors/matrix/MatrixEraser.cpp:68
+#: ../src/gui/editors/matrix/MatrixMover.cpp:81
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:79
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:93
+msgid "Switch to Resize Tool"
+msgstr "Přepnout na nástroj pro změnu velikosti"
+
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:446
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:579
+msgid "Click and drag to select; middle-click and drag to draw new note"
+msgstr ""
+"Klepnutím a tažením provedete výběr; klepnutím prostředním tlačítkem a "
+"tažením nakreslíte novou notu"
+
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:324
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:597
+msgid "Click and drag to resize selected notes"
+msgstr "Klepnutím a tažením změníte velikost vybraných not"
+
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:599
+msgid "Click and drag to resize note"
+msgstr "Klepnutím a tažením změníte velikost noty"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:471
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:604
+msgid "Click and drag to move selected notes; hold Ctrl as well to copy"
+msgstr ""
+"Klepnutím a tažením přesunete vybrané noty; podržíte-li tlačítko Ctrl, "
+"můžete noty také kopírovat"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:473
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:606
+msgid "Click and drag to copy selected notes"
+msgstr "Klepnutím a tažením zkopírujete vybrané noty"
+
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:610
+msgid "Click and drag to move note; hold Ctrl as well to copy"
+msgstr ""
+"Klepnutím a tažením přesunete notu; podržíte-li tlačítko Ctrl, můžete notu "
+"také kopírovat"
+
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:612
+msgid "Click and drag to copy note"
+msgstr "Klepnutím a tažením zkopírujete notu"
+
+#: ../src/gui/editors/matrix/MatrixEraser.cpp:54
+#: ../src/gui/editors/matrix/MatrixMover.cpp:67
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:65
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:63
+#: ../src/gui/editors/notation/ClefInserter.cpp:53
+#: ../src/gui/editors/notation/GuitarChordInserter.cpp:59
+#: ../src/gui/editors/notation/NotationEraser.cpp:67
+#: ../src/gui/editors/notation/NoteInserter.cpp:109
+#: ../src/gui/editors/notation/RestInserter.cpp:68
+#: ../src/gui/editors/notation/TextInserter.cpp:57
+msgid "Switch to Select Tool"
+msgstr "Přepnout na nástroj pro výběr"
+
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:218
+msgid "Resize Event"
+msgstr "Změnit velikost události"
+
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:221
+msgid "Resize Events"
+msgstr "Změnit velikost událostí"
+
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:326
+msgid "Click and drag to resize a note"
+msgstr "Klepnutím a tažením změníte velikost noty"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:328
+msgid "Copy and Move Event"
+msgstr "Kopírovat a přesunout událost"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:330
+msgid "Copy and Move Events"
+msgstr "Kopírovat a přesunout události"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:334
+msgid "Move Event"
+msgstr "Přesunout událost"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:336
+msgid "Move Events"
+msgstr "Přesunout události"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:465
+msgid "Click and drag to move a note; hold Ctrl as well to copy it"
+msgstr ""
+"Klepnutím a tažením přesunete notu; podržíte-li tlačítko Ctrl, můžete notu "
+"také kopírovat"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:467
+msgid "Click and drag to copy a note"
+msgstr "Klepnutím a tažením zkopírujete notu"
+
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:361
+msgid "Click and drag to draw a note; Shift to avoid snapping to grid"
+msgstr ""
+"Klepnutím a tažením nakreslíte notu; tlačítkem Shift (přesmykač) se vyhnete "
+"přichytávání na mřížku"
+
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:363
+msgid "Click and drag to draw a note"
+msgstr "Klepnutím a tažením nakreslíte notu"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:437
+#: ../src/gui/editors/matrix/MatrixView.cpp:3053
+msgid "Couldn't apply piano roll layout"
+msgstr "Nebylo možné použít rozložení klavírního válce"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:663
+msgid "Resi&ze"
+msgstr "&Změnit velikost"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:669
+#: ../src/gui/editors/notation/NotationView.cpp:1919
+msgid "C&hord Insert Mode"
+msgstr "Režim vkládání &akordů"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:676
+#: ../src/gui/editors/notation/NotationView.cpp:1778
+msgid "Ste&p Recording"
+msgstr "&Krokový záznam"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:694
+msgid "&Legato"
+msgstr "&Legato"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:708
+msgid "Set to Current Velocity"
+msgstr "Nastavit na aktuální rychlost"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:712
+msgid "Set Event &Velocities..."
+msgstr "Nastavit &rychlosti událostí..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:716
+msgid "Trigger Se&gment..."
+msgstr "&Spouštěcí segment..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:720
+msgid "Remove Triggers..."
+msgstr "Odebrat spouštěcí značky..."
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1153
+#: ../src/gui/editors/matrix/MatrixView.cpp:724
+#: ../src/gui/editors/tempo/TempoView.cpp:606
+msgid "Select &All"
+msgstr "Vybrat &vše"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:732
+#: ../src/gui/editors/notation/NotationView.cpp:2325
+msgid "Cursor &Back"
+msgstr "Kurzor &zpět"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:736
+#: ../src/gui/editors/notation/NotationView.cpp:2329
+msgid "Cursor &Forward"
+msgstr "Kurzor &vpřed"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:740
+#: ../src/gui/editors/notation/NotationView.cpp:2333
+msgid "Cursor Ba&ck Bar"
+msgstr "Kurzor na &předchozí taktovou čáru"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:744
+#: ../src/gui/editors/notation/NotationView.cpp:2337
+msgid "Cursor For&ward Bar"
+msgstr "Kurzor na &následující taktovou čáru"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:748
+#: ../src/gui/editors/notation/NotationView.cpp:2341
+msgid "Cursor Back and Se&lect"
+msgstr "Kurzor zpět a vy&brat"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:752
+#: ../src/gui/editors/notation/NotationView.cpp:2345
+msgid "Cursor Forward and &Select"
+msgstr "Kurzor vpřed a v&ybrat"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:756
+#: ../src/gui/editors/notation/NotationView.cpp:2349
+msgid "Cursor Back Bar and Select"
+msgstr "Kurzor na předchozí taktovou čáru a vybrat"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:760
+#: ../src/gui/editors/notation/NotationView.cpp:2353
+msgid "Cursor Forward Bar and Select"
+msgstr "Kurzor na následující taktovou čáru a vybrat"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:764
+#: ../src/gui/editors/notation/NotationView.cpp:2363
+msgid "Cursor to St&art"
+msgstr "Kurzor na z&ačátek"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:770
+#: ../src/gui/editors/notation/NotationView.cpp:2369
+msgid "Cursor to &End"
+msgstr "Kurzor na &konec"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:776
+#: ../src/gui/editors/notation/NotationView.cpp:2391
+msgid "Cursor to &Playback Pointer"
+msgstr "Kurzor na pozici &ukazatele přehrávání"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:820
+#: ../src/gui/editors/notation/NotationView.cpp:2435
+msgid "Playback Pointer to &Cursor"
+msgstr "Ukazatel přehrávání na pozici k&urzoru"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:826
+#: ../src/gui/editors/notation/NotationView.cpp:2441
+msgid "&Solo"
+msgstr "&Sólo"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:841
+#: ../src/gui/editors/notation/NotationView.cpp:2456
+msgid "Set Loop to Selection"
+msgstr "Nastavit opakování výběru"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:845
+#: ../src/gui/editors/notation/NotationView.cpp:2460
+msgid "Clear L&oop"
+msgstr "Vymazat &opakování"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1157
+#: ../src/gui/editors/matrix/MatrixView.cpp:849
+#: ../src/gui/editors/notation/NotationView.cpp:2464
+#: ../src/gui/editors/tempo/TempoView.cpp:610
+msgid "Clear Selection"
+msgstr "Vymazat výběr"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1149
+#: ../src/gui/editors/matrix/MatrixView.cpp:854
+#: ../src/gui/editors/notation/NotationView.cpp:2471
+msgid "&Filter Selection"
+msgstr "Výběr &filtru"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:879
+msgid "&No Snap"
+msgstr "&Bez přichytávání"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:884
+msgid "Snap to Bea&t"
+msgstr "Přichytávat se na &dobu"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:888
+msgid "Snap to &Bar"
+msgstr "Přichytávat se na &taktovou čáru"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:908
+#, c-format
+msgid "Snap to %1"
+msgstr "Přichytávat se na %1"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:917
+msgid "Show Instrument Parameters"
+msgstr "Zobrazit parametry nástroje"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:922
+#: ../src/gui/editors/notation/NotationView.cpp:1850
+msgid "Show Ch&ord Name Ruler"
+msgstr "Zobrazit pravítko názvů &akordů"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:926
+#: ../src/gui/editors/notation/NotationView.cpp:1858
+msgid "Show &Tempo Ruler"
+msgstr "Zobrazit pravítko &tempa"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1238
+#: ../src/gui/editors/notation/NotationView.cpp:3245
+#, c-format
+msgid ""
+"_n: 1 event selected \n"
+" %n events selected "
+msgstr ""
+"_n: je vybrána 1 událost \n"
+" je vybráno %n událostí(i)"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1241
+#: ../src/gui/editors/notation/NotationView.cpp:3247
+msgid " No selection "
+msgstr " Žádný výběr "
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1348
+#: ../src/gui/editors/matrix/MatrixView.cpp:1360
+#: ../src/gui/editors/matrix/MatrixView.cpp:2079
+#: ../src/gui/editors/notation/NotationView.cpp:5869
+msgid "Quantizing..."
+msgstr "Probíhá kvantizace..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1370
+#: ../src/gui/editors/notation/NotationView.cpp:5407
+msgid "Collapsing notes..."
+msgstr "Probíhá sjednocování not..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1381
+msgid "Making legato..."
+msgstr "Probíhá vytváření legata..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1476
+msgid "Note: %1 (%2.%3s)"
+msgstr "Nota: %1 (%2.%3s)"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1531
+#: ../src/gui/editors/notation/NotationView.cpp:7206
+msgid "Time: %1 (%2.%3s)"
+msgstr "Čas: %1 (%2.%3s)"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1604
+#: ../src/gui/editors/notation/NotationView.cpp:4744
+#: ../src/gui/editors/notation/NotationView.cpp:4773
+msgid "Cutting selection to clipboard..."
+msgstr "Probíhá vyjmutí výběru do schránky..."
+
+#: ../src/gui/editors/eventlist/EventView.cpp:912
+#: ../src/gui/editors/matrix/MatrixView.cpp:1636
+#: ../src/gui/editors/notation/NotationSelectionPaster.cpp:82
+msgid "Couldn't paste at this point"
+msgstr "Nebylo možné provést vložení na tomto místě"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1647
+#: ../src/gui/editors/notation/NotationView.cpp:4754
+msgid "Deleting selection..."
+msgstr "Probíhá odstranění výběru..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1833
+#: ../src/gui/editors/notation/NotationView.cpp:5617
+#, c-format
+msgid "Unknown note insert action %1"
+msgstr "Akce vložení neznámé noty %1"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1837
+#: ../src/gui/editors/matrix/MatrixView.cpp:2857
+#: ../src/gui/editors/notation/NotationView.cpp:5621
+msgid "Inserting note"
+msgstr "Probíhá vložení noty"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2091
+msgid "Unquantizing..."
+msgstr "Probíhá rušení kvantizace..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2120
+msgid " Grid: "
+msgstr " Rastr: "
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2134
+msgid "Unit"
+msgstr "Jednotka"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2136
+msgid "Beat"
+msgstr "Doba"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2138
+msgid "Bar"
+msgstr "Taktová čára"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2159
+msgid " Velocity: "
+msgstr " Rychlost:"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2170
+msgid " Quantize: "
+msgstr " Kvantizovat: "
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2584
+msgid "Raising velocities..."
+msgstr "Probíhá zvětšování rychlostí..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2596
+msgid "Lowering velocities..."
+msgstr "Probíhá zmenšování rychlostí..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2611
+msgid "Set Event Velocities"
+msgstr "Nastavit rychlosti událostí"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2616
+msgid "Setting Velocities..."
+msgstr "Probíhá nastavování rychlostí..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2665
+msgid "Remove Triggers"
+msgstr "Odebrat spouštěcí značky"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2723
+msgid "%1 - Segment Track #%2 - %3"
+msgstr "%1 - Stopa segmentu #%2 - %3"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2730
+msgid "%1 - All Segments - %2"
+msgstr "%1 - Všechny segmenty - %2"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2737
+msgid ""
+"_n: %1 - 1 Segment - %2\n"
+"%1 - %n Segments - %2"
+msgstr ""
+"_n: %1 - 1 Segment - %2\n"
+"%1 - %n Segmenty(ů) - %2"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2885
+msgid "Can't insert note: No grid duration selected"
+msgstr "Nelze vložit notu: nebyla vybrána doba trvání v rastru"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2935
+msgid " Chord "
+msgstr " Akord"
+
+#: ../src/gui/editors/matrix/MatrixEraser.cpp:105
+msgid "Click on a note to delete it"
+msgstr "Klepnutím na notu ji odstraníte"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:89
+msgid "Filter"
+msgstr "Filtr"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:245
+#: ../src/gui/editors/tempo/TempoView.cpp:117
+msgid "Time "
+msgstr "Čas "
+
+#: ../src/gui/editors/tempo/TempoView.cpp:118
+msgid "Type "
+msgstr "Typ "
+
+#: ../src/gui/editors/tempo/TempoView.cpp:119
+msgid "Value "
+msgstr "Hodnota "
+
+#: ../src/gui/editors/tempo/TempoView.cpp:120
+msgid "Properties "
+msgstr "Vlastnosti "
+
+#: ../src/gui/editors/tempo/TempoView.cpp:208
+msgid "Common, hidden"
+msgstr "Společné, skryté"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:210
+msgid "Hidden"
+msgstr "Skryté"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:213
+msgid "Common"
+msgstr "Společné"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:220
+msgid "Time Signature "
+msgstr "Taktové označení "
+
+#: ../src/gui/editors/tempo/TempoView.cpp:245
+msgid "%1.%2%3"
+msgstr "%1.%2%3"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:255
+msgid "%1.%2%3 qpm (%4.%5%6 bpm) "
+msgstr "%1.%2%3 qpm (%4.%5%6 bpm) "
+
+#: ../src/gui/editors/tempo/TempoView.cpp:264
+msgid "Tempo "
+msgstr "Tempo "
+
+#: ../src/gui/editors/tempo/TempoView.cpp:271
+msgid "<nothing at this filter level>"
+msgstr "<žádný výsledek na této úrovni filtru>"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:463
+msgid "Delete Tempo or Time Signature"
+msgstr "Odstranit tempo nebo taktové označení"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:602
+msgid "&Edit Item"
+msgstr "&Upravit položku"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:834
+msgid "%1 - Tempo and Time Signature Editor"
+msgstr "%1 - Editor tepma a taktového označení"
+
+#: ../src/gui/editors/guitar/GuitarChordEditorDialog.cpp:43
+msgid "Guitar Chord Editor"
+msgstr "Editor kytarových akordů"
+
+#: ../src/gui/editors/guitar/GuitarChordEditorDialog.cpp:51
+msgid "Start fret"
+msgstr "Počáteční pražec"
+
+#: ../src/gui/editors/guitar/GuitarChordEditorDialog.cpp:58
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:51
+msgid "Root"
+msgstr "Základní tón"
+
+#: ../src/gui/editors/guitar/GuitarChordEditorDialog.cpp:62
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:55
+msgid "Extension"
+msgstr "Zvětšení"
+
+#: ../src/gui/editors/guitar/Fingering.cpp:118
+msgid "couldn't parse fingering '%1' in '%2'"
+msgstr "nebylo možné určit prstoklad '%1' v '%2'"
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:45
+msgid "Guitar Chord Selector"
+msgstr "Selektor kytarových akordů"
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:64
+msgid "beginner"
+msgstr "začátečník"
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:65
+msgid "common"
+msgstr "společné"
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:66
+msgid "all"
+msgstr "vše"
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:86
+msgid "Fingerings"
+msgstr "Prstoklady"
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:419
+msgid "couldn't open file '%1'"
+msgstr "nebylo možné otevřít soubor '%1'"
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:428
+#, c-format
+msgid "couldn't parse chord dictionnary : %1"
+msgstr "nebylo možné analyzovat a určit akord : %1"
+
+#: ../src/gui/editors/notation/NoteFontViewer.cpp:87
+#, c-format
+msgid "Note Font Viewer: %1"
+msgstr "Prohlížeč notového písma: %1"
+
+#: ../src/gui/editors/notation/NoteFontViewer.cpp:93
+msgid " Component: "
+msgstr " Komponenta: "
+
+#: ../src/gui/editors/notation/NoteFontViewer.cpp:101
+msgid " View: "
+msgstr " Pohled: "
+
+#: ../src/gui/editors/notation/NoteFontViewer.cpp:104
+msgid "Glyphs"
+msgstr "Piktografy"
+
+#: ../src/gui/editors/notation/NoteFontViewer.cpp:105
+msgid "Codes"
+msgstr "Kódy"
+
+#: ../src/gui/editors/notation/NoteFontViewer.cpp:107
+msgid " Page: "
+msgstr " Strana: "
+
+#: ../src/gui/editors/notation/ClefInserter.cpp:64
+#: ../src/gui/editors/notation/GuitarChordInserter.cpp:71
+#: ../src/gui/editors/notation/RestInserter.cpp:79
+#: ../src/gui/editors/notation/TextInserter.cpp:68
+msgid "Switch to Inserting Notes"
+msgstr "Přepnout na vkládání not"
+
+#: ../src/gui/editors/notation/NotationView.cpp:522
+msgid "Close track headers"
+msgstr "Uzavřít hlavičky stop"
+
+#: ../src/gui/editors/notation/NotationView.cpp:917
+msgid "Preparing to print..."
+msgstr "Probíhá příprava tisku..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:1516
+msgid "Note &Font"
+msgstr "Notové &písmo"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1539
+msgid "Si&ze"
+msgstr "V&elikost"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1545
+msgid "Show Track Headers"
+msgstr "Zobrazit hlavičky stop"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1550
+msgid "S&pacing"
+msgstr "&Rozestupy"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1572
+msgid "Du&ration Factor"
+msgstr "Faktor doby &trvání"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1598
+msgid "Note &Style"
+msgstr "&Styl not"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1624
+msgid "Insert Rest"
+msgstr "Vložit pomlku"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1628
+msgid "Switch from Note to Rest"
+msgstr "Přepnout z noty na pomlku"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1633
+msgid "Switch from Rest to Note"
+msgstr "Přepnout z pomlky na notu"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1690
+msgid "No accidental"
+msgstr "Žádná posuvka"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1691
+msgid "Follow previous accidental"
+msgstr "Podle předchozí posuvky"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1692
+msgid "Sharp"
+msgstr "Křížek"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1693
+msgid "Flat"
+msgstr "Béčko"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1694
+msgid "Natural"
+msgstr "Přirozené"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1695
+msgid "Double sharp"
+msgstr "Dvojitý křížek"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1696
+msgid "Double flat"
+msgstr "Dvojité béčko"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1717
+msgid "&Treble Clef"
+msgstr "&Houslový klíč"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1724
+msgid "&Alto Clef"
+msgstr "&Violový klíč"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1731
+msgid "Te&nor Clef"
+msgstr "&Tenorový klíč"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1738
+msgid "&Bass Clef"
+msgstr "&Basový klíč"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1745
+msgid "&Text"
+msgstr "&Text"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1751
+msgid "&Guitar Chord"
+msgstr "&Kytarový akord"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1784
+msgid "Select from Sta&rt"
+msgstr "Vybrat od &začátku"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1788
+msgid "Select to &End"
+msgstr "Vybrat do &konce"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1792
+msgid "Select Whole St&aff"
+msgstr "Vybrat celou &osnovu"
+
+#: ../src/commands/edit/CutAndCloseCommand.h:53
+#: ../src/gui/editors/notation/NotationView.cpp:1796
+msgid "C&ut and Close"
+msgstr "Vyjmout a &zavřít"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1800
+msgid "Pa&ste..."
+msgstr "&Vložit..."
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:122
+#: ../src/gui/editors/notation/NotationView.cpp:1808
+msgid "Move to Staff Above"
+msgstr "Přesunout na osnovu výše"
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:126
+#: ../src/gui/editors/notation/NotationView.cpp:1812
+msgid "Move to Staff Below"
+msgstr "Přesunout na osnovu níže"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1826
+msgid "&Linear Layout"
+msgstr "&Lineární uspořádání"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1835
+msgid "&Continuous Page Layout"
+msgstr "&Nekonečná stránka"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1844
+msgid "&Multiple Page Layout"
+msgstr "&Stránkové uspořádání"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1854
+msgid "Show Ra&w Note Ruler"
+msgstr "Zobrazit pravítko z&drojových not"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1862
+msgid "Show &Annotations"
+msgstr "Zobrazit &anotace"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1866
+msgid "Show Lily&Pond Directives"
+msgstr "Zobrazit direktivy Lily&Pond"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1870
+msgid "Open L&yric Editor"
+msgstr "Otevřít editor te&xtu melodie"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1912
+msgid "Trip&let Insert Mode"
+msgstr "Režim vkládání &triol"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1926
+msgid "Grace Insert Mode"
+msgstr "Respektovat režim vkládání"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2180
+msgid "&Dump selected events to stderr"
+msgstr "&Vypsat vybrané události do stderr"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2248
+msgid "Ma&ke Ornament..."
+msgstr "&Vytvořit melodickou ozdobu..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:2252
+msgid "Trigger &Ornament..."
+msgstr "Spouštěcí melodická &ozdoba..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:2256
+msgid "Remove Ornament..."
+msgstr "Odstranit melodickou ozdobu..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:2261
+msgid "&None"
+msgstr "Žá&dná"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2289
+msgid "Convert Notation For..."
+msgstr "Konvertovat notaci pro..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:2298
+msgid "Show &Notes Toolbar"
+msgstr "Zobrazit nástrojovou lištu pro &noty"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2299
+msgid "Show &Rests Toolbar"
+msgstr "Zobrazit nástrojovou lištu pro po&mlky"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2300
+msgid "Show &Accidentals Toolbar"
+msgstr "Zobrazit nástrojovou lištu pro &posuvky"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2301
+msgid "Show Cle&fs Toolbar"
+msgstr "Zobrazit nástrojovou lištu pro notové &klíče"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2303
+msgid "Show &Marks Toolbar"
+msgstr "Zobrazit nástrojovou lištu pro &značky"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2305
+msgid "Show &Group Toolbar"
+msgstr "Zobrazit nástrojovou lištu pro &skupiny"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2307
+msgid "Show &Layout Toolbar"
+msgstr "Zobrazit nástrojovou lištu pro &uspořádání"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2311
+msgid "Show M&eta Toolbar"
+msgstr "Zobrazit nástrojovou lištu m&eta"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2373
+msgid "Cursor &Up Staff"
+msgstr "Posunout kurzor v osnově &nahoru"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2377
+msgid "Cursor &Down Staff"
+msgstr "Posunout kurzor v osnově &dolů"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2381
+msgid "Cursor Pre&vious Segment"
+msgstr "Kurzor na &předchozí segment"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2385
+msgid "Cursor Ne&xt Segment"
+msgstr "Kurzor na &následující segment"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2475
+msgid "Push &Left"
+msgstr "Odsunout v&levo"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2479
+msgid "Push &Right"
+msgstr "Odsunout v&pravo"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2483
+msgid "Push &Up"
+msgstr "Odsunout &nahoru"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2487
+msgid "Push &Down"
+msgstr "Odsunout &dolů"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2491
+msgid "&Restore Positions"
+msgstr "&Obnovit pozice"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2495
+msgid "Make &Invisible"
+msgstr "Z&neviditelnit"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2499
+msgid "Make &Visible"
+msgstr "Z&viditelnit"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2503
+msgid "Toggle Dot"
+msgstr "Přepnout tečku"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2507
+#: ../src/gui/editors/notation/NotationView.cpp:2511
+msgid "Add Dot"
+msgstr "Přidat tečku"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2570
+#, c-format
+msgid ""
+"_n: 1 pixel\n"
+"%n pixels"
+msgstr ""
+"_n: 1 pixel\n"
+"%n pixely(ů)"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2619
+msgid " Font: "
+msgstr " Písmo: "
+
+#: ../src/gui/editors/notation/NotationView.cpp:2647
+msgid "Unknown font \"%1\", using default"
+msgstr "Písmo \"%1\" je neznámé, použije se výchozí"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2655
+msgid " Size: "
+msgstr " Velikost: "
+
+#: ../src/gui/editors/notation/NotationView.cpp:2677
+msgid " Spacing: "
+msgstr " Rozestupy: "
+
+#: ../src/gui/editors/notation/NotationView.cpp:2993
+#: ../src/gui/editors/notation/NotationView.cpp:3818
+msgid " Ready."
+msgstr " Připraven."
+
+#: ../src/gui/editors/notation/NotationView.cpp:2998
+msgid "Laying out score..."
+msgstr "Probíhá uspořádání partitury..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:3011
+msgid "Laying out staff %1..."
+msgstr "Probíhá uspořádání osnovy %1..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:3020
+msgid "Reconciling staffs..."
+msgstr "Probíhá vyrovnání osnov..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:3885
+msgid "Sizing and allocating canvas..."
+msgstr "Probíhá nastavení velikosti a přidělení zobrazovací plochy..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:4050
+msgid "note"
+msgstr "nota"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4050
+msgid "rest"
+msgstr "pomlka"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4211
+msgid "%1 - Segment Track #%2 - Notation"
+msgstr "%1 - Stopa segmentu #%2 - Notový zápis"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4217
+msgid "%1 - All Segments - Notation"
+msgstr "%1 - Všechny segmenty - Notový zápis"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4222
+msgid ""
+"_n: %1 - Segment - Notation\n"
+"%1 - %n Segments - Notation"
+msgstr ""
+"_n: %1 - Segment - Notový zápis\n"
+"%1 - %n Segmenty(ů) - Notový zápis"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4243
+msgid "Grace"
+msgstr "Respektovat"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4247
+#: ../src/gui/editors/notation/NotationView.cpp:4251
+#: ../src/gui/editors/notation/NotationView.cpp:4255
+msgid "%1 %2"
+msgstr "%1 %2"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4271
+msgid "Hidden annotations"
+msgstr "Skryté anotace"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4293
+msgid "Hidden LilyPond directives"
+msgstr "Skryté direktivy aplikace LilyPond"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4326
+#, c-format
+msgid "Unknown spacing action %1"
+msgstr "Akce s neznámými rozestupy - %1"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4384
+#, c-format
+msgid "Unknown proportion action %1"
+msgstr "Akce s neznámými proporcemi - %1"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4431
+#, c-format
+msgid "Unknown font action %1"
+msgstr "Akce s neznámým písmem - %1"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4449
+#, c-format
+msgid "Unknown font size %1"
+msgstr "Neznámá velikost písma - %1"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4453
+#, c-format
+msgid "Unknown font size action %1"
+msgstr "Akce s neznámou velikostí písma - %1"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4780
+msgid ""
+"The Restricted paste type requires enough empty space (containing only "
+"rests) at the paste position to hold all of the events to be pasted.\n"
+"Not enough space was found.\n"
+"If you want to paste anyway, consider using one of the other paste types "
+"from the \"Paste...\" option on the Edit menu. You can also change the "
+"default paste type to something other than Restricted if you wish."
+msgstr ""
+"Omezený typ vkládání vyžaduje dostatek volného místa (obsahující pouze "
+"pomlky) na místě vložení, aby se do něj všechny události vešly.\n"
+"Nebylo nalezeno dost místa.\n"
+"Chcete-li i přesto provést vložení, zvažte použití jednoho z dalších typů "
+"vkládání pod možností \"Vložit\" v nabídce Upravit. Pokud chcete, můžete "
+"také změnit výchozí typ vkládání na jiný než Omezený."
+
+#: ../src/gui/editors/notation/NotationView.cpp:4800
+msgid "Can't paste multiple Segments into one"
+msgstr "Nelze vložit několik segmentů do jednoho"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4828
+#: ../src/gui/editors/notation/NotationView.cpp:4877
+msgid "Couldn't paste at this point."
+msgstr "Nebylo možné provést vložení na tomto místě."
+
+#: ../src/gui/editors/notation/NotationView.cpp:4896
+msgid "Move Events to Staff Above"
+msgstr "Přesunout události na osnovu výše"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4924
+msgid "Move Events to Staff Below"
+msgstr "Přesunout události na osnovu níže"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5036
+msgid "Pushing selection left..."
+msgstr "Probíhá odsunutí výběru doleva..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5047
+msgid "Pushing selection right..."
+msgstr "Probíhá odsunutí výběru doprava..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5058
+msgid "Pushing selection up..."
+msgstr "Probíhá odsunutí výběru nahoru..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5069
+msgid "Pushing selection down..."
+msgstr "Probíhá odsunutí výběru dolů..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5080
+msgid "Restoring computed positions..."
+msgstr "Probíhá obnova vypočtených pozic..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5089
+msgid "Making visible..."
+msgstr "Probíhá zviditelnění..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5098
+msgid "Making invisible..."
+msgstr "Probíhá zneviditelnění..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5185
+msgid "Beaming group..."
+msgstr "Probíhá spojování skupiny trámcem..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5195
+msgid "Auto-beaming selection..."
+msgstr "Probíhá automatické spojování výběru trámcem..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5205
+msgid "Breaking groups..."
+msgstr "Probíhá rozdělování skupin..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5293
+msgid "Untupleting..."
+msgstr "Probíhá rušení rytmických notových skupin..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5301
+msgid "Adding slur..."
+msgstr "Probíhá přidání legata..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5302
+msgid "slur"
+msgstr "legato"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5307
+msgid "Adding phrasing slur..."
+msgstr "Probíhá přidání frázovacího legata..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5308
+msgid "phrasing slur"
+msgstr "frázovací legato"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5313
+msgid "Adding glissando..."
+msgstr "Probíhá přidání glissanda..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5314
+msgid "glissando"
+msgstr "glissando"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5319
+msgid "Adding crescendo..."
+msgstr "Probíhá přidání crescenda..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5320
+#: ../src/gui/editors/notation/NotationView.cpp:5326
+msgid "dynamic"
+msgstr "dynamika"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5325
+msgid "Adding decrescendo..."
+msgstr "Probíhá přidání decrescenda..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5331
+#: ../src/gui/editors/notation/NotationView.cpp:5337
+#: ../src/gui/editors/notation/NotationView.cpp:5343
+#: ../src/gui/editors/notation/NotationView.cpp:5349
+msgid "Adding octave..."
+msgstr "Probíhá přidání oktávy..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5332
+#: ../src/gui/editors/notation/NotationView.cpp:5338
+#: ../src/gui/editors/notation/NotationView.cpp:5344
+#: ../src/gui/editors/notation/NotationView.cpp:5350
+msgid "ottava"
+msgstr "ottava"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5366
+msgid "Can't add overlapping %1 indications"
+msgstr "Nelze přidat překrývající se označení způsobu hry - %1"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5375
+msgid "Making chord..."
+msgstr "Probíhá vytváření akordu..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5387
+msgid "Normalizing rests..."
+msgstr "Probíhá normalizace pomlk..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5397
+msgid "Collapsing rests..."
+msgstr "Probíhá sjednocování pomlk..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5417
+msgid "Tying notes..."
+msgstr "Probíhá svazování not ligaturou..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5427
+msgid "Untying notes..."
+msgstr "Probíhá rušení vázání not ligaturou..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5437
+msgid "Making notes viable..."
+msgstr "Probíhá úprava not do realizovatelné podoby..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5447
+msgid "Removing counterpoint..."
+msgstr "Probíhá odstranění kontrapunktu..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5457
+msgid "Pointing stems up..."
+msgstr "Probíhá otáčení nožiček nahoru..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5467
+msgid "Pointing stems down..."
+msgstr "Probíhá otáčení nožiček dolů..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5478
+msgid "Restoring computed stem directions..."
+msgstr "Probíhá obnovení vypočtených směrů nožiček..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5488
+#: ../src/gui/editors/notation/NotationView.cpp:5498
+msgid "Positioning slurs..."
+msgstr "Probíhá umísťování legata..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5509
+msgid "Restoring slur positions..."
+msgstr "Probíhá obnova pozic legata..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5519
+#: ../src/gui/editors/notation/NotationView.cpp:5529
+msgid "Positioning ties..."
+msgstr "Probíhá umísťování ligatury..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5540
+msgid "Restoring tie positions..."
+msgstr "Probíhá obnova pozic ligatury..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5550
+msgid "Fixing notation quantization..."
+msgstr "Probíhá oprava kvantizace notace..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5560
+msgid "Removing notation quantization..."
+msgstr "Probíhá odstranění kvantizace notace..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5577
+msgid "Changing to %1 style..."
+msgstr "Probíhá změna na styl %1..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5585
+#, c-format
+msgid "Unknown style action %1"
+msgstr "Akce s neznámým stylem - %1"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5598
+#: ../src/gui/editors/notation/NotationView.cpp:5639
+#: ../src/gui/editors/notation/NotationView.cpp:5695
+msgid "No note duration selected"
+msgstr "Nebyla vybrána doba trvání noty"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5660
+msgid "No rest duration selected"
+msgstr "Nebyla vybrána doba trvání pomlky"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5746
+msgid "No note or rest duration selected"
+msgstr "Nebyla vybrána doba trvání noty nebo pomlky"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5757
+#: ../src/gui/editors/notation/NotationView.cpp:5768
+#: ../src/gui/editors/notation/NotationView.cpp:5779
+#: ../src/gui/editors/notation/NotationView.cpp:5790
+#: ../src/gui/editors/notation/NotationView.cpp:5801
+#: ../src/gui/editors/notation/NotationView.cpp:5812
+#: ../src/gui/editors/notation/NotationView.cpp:5823
+msgid "Forcing accidentals..."
+msgstr "Probíhá nucená úprava posuvek..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5834
+msgid "Restoring accidentals..."
+msgstr "Probíhá obnovení posuvek..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5845
+msgid "Showing cautionary accidentals..."
+msgstr "Probíhá zobrazení varovných posuvek..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5855
+msgid "Cancelling cautionary accidentals..."
+msgstr "Probíhá rušení varovných posuvek..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5884
+msgid "Interpreting selection..."
+msgstr "Probíhá interpretace výběru..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5896
+msgid "Setting note durations..."
+msgstr "Probíhá nastavení dob trvání not..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5904
+#: ../src/gui/editors/notation/NotationView.cpp:5912
+msgid "Adding dot..."
+msgstr "Probíhá přidání tečky..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5934
+msgid "Text: "
+msgstr "Text: "
+
+#: ../src/gui/editors/notation/NotationView.cpp:5948
+msgid "Fingering: "
+msgstr "Prstoklad: "
+
+#: ../src/gui/editors/notation/NotationView.cpp:6036
+msgid "Ornament track %1 bar %2"
+msgstr "Melodická ozdoba - stopa %1, taktová čára %2"
+
+#: ../src/gui/editors/notation/NotationView.cpp:6038
+#, c-format
+msgid "Ornament bar %1"
+msgstr "Taktová čára melodické ozdoby %1"
+
+#: ../src/gui/editors/notation/NotationView.cpp:6098
+msgid "Remove Ornaments"
+msgstr "Odstranit melodické ozdoby"
+
+#: ../src/gui/editors/notation/NotationView.cpp:6145
+msgid "Estimated key signature shown"
+msgstr "Zobrazené odhadované předznamenání"
+
+#: ../src/gui/editors/notation/NotationStaff.cpp:1249
+#: ../src/gui/editors/notation/NotationView.cpp:6202
+msgid "Sustain"
+msgstr "Držet tón"
+
+#: ../src/gui/editors/notation/NotationView.cpp:6218
+msgid ""
+"There is no sustain controller defined for this device.\n"
+"Please ensure the device is configured correctly in the Manage MIDI Devices "
+"dialog in the main window."
+msgstr ""
+"Pro toto zařízení není definován žádný ovládací prvek pro držení tónu.\n"
+"Ujistěte se, že je zařízení správně konfigurováno v dialogu Správa zařízení "
+"MIDI v hlavním okně."
+
+#: ../src/gui/editors/notation/NotationView.cpp:7250
+msgid "Can't insert note: No note duration selected"
+msgstr "Nelze vložit notu. Nebyla vybrána doba trvání noty"
+
+#: ../src/gui/editors/notation/NotationEraser.cpp:61
+#: ../src/gui/editors/notation/NotationSelector.cpp:83
+msgid "Switch to Insert Tool"
+msgstr "Přepnout na nástroj pro vkládání"
+
+#: ../src/gui/editors/notation/NotePixmapFactory.cpp:2303
+#: ../src/gui/editors/notation/NotePixmapFactory.cpp:2347
+msgid "..."
+msgstr "..."
+
+#: ../src/gui/editors/notation/NoteFontFactory.cpp:200
+msgid "Can't obtain a default font -- no fonts found"
+msgstr "Nelze získat výchozí písmo - nebylo nalezeno žádné písmo"
+
+#: ../src/gui/editors/notation/NoteFontMap.cpp:52
+#: ../src/gui/general/PresetGroup.cpp:49
+msgid "unknown error"
+msgstr "neznámá chyba"
+
+#: ../src/gui/editors/notation/NoteFontMap.cpp:78
+msgid "Can't open font mapping file %1 or %2"
+msgstr "Nelze otevřít soubor %1 nebo %2 pro mapování písma"
+
+#: ../src/gui/editors/notation/NoteFontMap.cpp:82
+#, c-format
+msgid "Can't open font mapping file %1"
+msgstr "Nelze otevřít soubor %1 pro mapování písma"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:52
+msgid "%1-dotted-%2"
+msgstr "%1-tečkovaná-%2"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:54
+msgid "%1-dotted %2"
+msgstr "%1-tečkovaná %2"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:57
+#, c-format
+msgid "dotted-%1"
+msgstr "tečkovaná-%1"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:59
+#, c-format
+msgid "dotted %1"
+msgstr "tečkovaná %1"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:83
+msgid "sixty-fourth note"
+msgstr "1/64 nota"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:83
+msgid "thirty-second note"
+msgstr "1/32 nota"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:84
+msgid "sixteenth note"
+msgstr "1/16 nota"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:84
+msgid "eighth note"
+msgstr "1/8 nota"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:85
+msgid "quarter note"
+msgstr "1/4 nota"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:85
+msgid "half note"
+msgstr "1/2 nota"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:86
+msgid "whole note"
+msgstr "celá nota"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:86
+msgid "double whole note"
+msgstr "dvoucelá nota"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:89
+msgid "sixty-fourth notes"
+msgstr "1/64 noty"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:89
+msgid "thirty-second notes"
+msgstr "1/32 noty"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:90
+msgid "sixteenth notes"
+msgstr "1/16 noty"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:90
+msgid "eighth notes"
+msgstr "1/8 noty"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:91
+msgid "quarter notes"
+msgstr "1/4 noty"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:91
+msgid "half notes"
+msgstr "1/2 noty"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:92
+msgid "whole notes"
+msgstr "celé noty"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:92
+msgid "double whole notes"
+msgstr "dvoucelé noty"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:96
+#: ../src/gui/editors/notation/NotationStrings.cpp:154
+msgid "%1 triplets"
+msgstr "%1 trioly"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:100
+#: ../src/gui/editors/notation/NotationStrings.cpp:158
+msgid "%1 triplet"
+msgstr "%1 triola"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:143
+msgid "64th"
+msgstr "1/64"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:143
+msgid "32nd"
+msgstr "1/32"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:143
+msgid "16th"
+msgstr "1/16"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:143
+msgid "8th"
+msgstr "1/8"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:144
+msgid "quarter"
+msgstr "1/4"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:144
+msgid "half"
+msgstr "1/2"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:144
+msgid "whole"
+msgstr "celá"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:145
+msgid "double whole"
+msgstr "dvoucelá"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:148
+msgid "64ths"
+msgstr "1/64"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:148
+msgid "32nds"
+msgstr "1/32"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:148
+msgid "16ths"
+msgstr "1/16"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:148
+msgid "8ths"
+msgstr "1/8"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:149
+msgid "quarters"
+msgstr "1/4"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:149
+msgid "halves"
+msgstr "1/2"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:149
+msgid "wholes"
+msgstr "celé"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:150
+msgid "double wholes"
+msgstr "dvoucelé"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:278
+msgid "%1 ticks"
+msgstr "%1 jednotek metronomu"
+
+#: ../src/gui/editors/notation/FontViewFrame.cpp:100
+#, c-format
+msgid "Error: Unable to match font name %1"
+msgstr "Chyba: nelze přiřadit název písma %1"
+
+#: ../src/gui/editors/notation/FontViewFrame.cpp:108
+msgid "Warning: No good match for font name %1 (best is %2)"
+msgstr "Varování: nesprávný odpovídající název písma %1 (nejlepší by byl %2)"
+
+#: ../src/gui/editors/notation/FontViewFrame.cpp:116
+#, c-format
+msgid "Error: Unable to open best-match font %1"
+msgstr "Chyba: nelze otevřít nejlépe odpovídající písmo %1"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:113
+msgid "Track %1 : \"%2\""
+msgstr "Stopa %1 : \"%2\""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:119
+#, c-format
+msgid ""
+"\n"
+"Notate for: %1"
+msgstr ""
+"\n"
+"Notace pro: %1"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:121
+msgid "normal"
+msgstr "normální"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:124
+msgid "small"
+msgstr "malé"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:127
+msgid "tiny"
+msgstr "drobné"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:131
+msgid "--"
+msgstr "--"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:156
+msgid ""
+"\n"
+"Size: %1, Bracket: %2 "
+msgstr ""
+"\n"
+"Velikost: %1, Závorka: %2 "
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:183
+msgid ""
+"\n"
+"bars [%1-%2] in %3 (tr=%4) : \"%5\""
+msgstr ""
+"\n"
+"taktové čáry [%1-%2] v %3 (st=%4) : \"%5\""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:190
+msgid ""
+"\n"
+"bars [%1-%2] (tr=%3) : \"%4\""
+msgstr ""
+"\n"
+"taktové čáry [%1-%2] (st=%3) : \"%4\""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:240
+msgid "C#"
+msgstr "C#"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:242
+msgid "Eb"
+msgstr "Eb"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:245
+msgid "F#"
+msgstr "F#"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:247
+msgid "G#"
+msgstr "G#"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:249
+msgid "Bb"
+msgstr "Bb"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:352
+msgid "%1: %2"
+msgstr "%1: %2"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:355
+#, c-format
+msgid " in %1"
+msgstr " v %1"
+
+#: ../src/gui/editors/notation/NotationStaff.cpp:452
+msgid "Rendering staff %1..."
+msgstr "Probíhá vykreslování osnovy %1..."
+
+#: ../src/gui/editors/notation/NotationStaff.cpp:515
+msgid "Rendering notes on staff %1..."
+msgstr "Probíhá vykreslování not na osnově %1..."
+
+#: ../src/gui/editors/notation/NotationStaff.cpp:583
+msgid "Positioning staff %1..."
+msgstr "Probíhá umísťování osnovy %1..."
+
+#: ../src/gui/editors/notation/NotationSelectionPaster.cpp:85
+msgid "Ready."
+msgstr "Připraven."
+
+#: ../src/gui/editors/notation/RestInserter.cpp:62
+msgid "Dotted rest"
+msgstr "Tečkovaná pomlka"
+
+#: ../src/gui/editors/notation/NoteStyleFileReader.cpp:57
+#, c-format
+msgid "Can't open style file %1"
+msgstr "Nelze otevřít soubor stylu %1"
+
+#: ../src/gui/editors/notation/NoteStyleFileReader.cpp:92
+msgid "type is a required attribute of note"
+msgstr "typ je nutně požadovaným atributem noty"
+
+#: ../src/gui/editors/notation/NoteStyleFileReader.cpp:101
+#, c-format
+msgid "Unrecognised note name %1"
+msgstr "Neznámý název písma %1"
+
+#: ../src/gui/editors/notation/NoteStyleFileReader.cpp:108
+msgid "global element must precede note elements"
+msgstr "globální prvek musí předcházet notovým prvkům"
+
+#: ../src/gui/editors/notation/NoteStyleFileReader.cpp:137
+msgid ""
+"global and note elements may have shape or charname attribute, but not both"
+msgstr ""
+"globální a notové prvky mohou mít atributy tvaru nebo názvu znaku, ale "
+"nemohou mít obojí"
+
+#: ../src/gui/editors/notation/NotationVLayout.cpp:493
+msgid ""
+"Spanned note at %1 has no HEIGHT_ON_STAFF property!\n"
+"This is a bug (the program would previously have crashed by now)"
+msgstr ""
+"Nota v místě %1 nemá vlastnost HEIGHT_ON_STAFF!\n"
+"Jedná se o chybu programu (program již pravděpodobně v této chvíli havaroval)"
+
+#: ../src/gui/editors/notation/NoteInserter.cpp:82
+msgid "Auto-Beam when appropriate"
+msgstr "Automatické trámce tam, kde je to vhodné"
+
+#: ../src/gui/editors/notation/NoteInserter.cpp:103
+msgid "Dotted note"
+msgstr "Tečkovaná nota"
+
+#: ../src/gui/editors/notation/NoteInserter.cpp:120
+msgid "Switch to Inserting Rests"
+msgstr "Přepnout na vkládání pomlk"
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:98
+msgid "Collapse Rests"
+msgstr "Sjednotit pomlky"
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:102
+msgid "Respell as Flat"
+msgstr "Provést enharmonickou záměnu s béčkem"
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:106
+msgid "Respell as Sharp"
+msgstr "Provést enharmonickou záměnu s křížkem"
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:110
+msgid "Respell as Natural"
+msgstr "Provést enharmonickou záměnu přirozeně"
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:114
+msgid "Collapse Notes"
+msgstr "Sjednotit noty"
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:130
+msgid "Make Invisible"
+msgstr "Zneviditelnit"
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:134
+msgid "Make Visible"
+msgstr "Zviditelnit"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:129
+msgid "Event filters"
+msgstr "Filtry událostí"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:138
+msgid "Rest"
+msgstr "Pomlka"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:139
+msgid "Indication"
+msgstr "Označení způsobu hry"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:141
+msgid "Other"
+msgstr "Jiné"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:161
+msgid "Triggered Segment Properties"
+msgstr "Vlastnosti spouštěného segmentu"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:166
+msgid "Label: "
+msgstr "Popisek: "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:176
+msgid "Base pitch: "
+msgstr "Základní výška tónu: "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:183
+msgid "Base velocity: "
+msgstr "Základní rychlost: "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:246
+msgid "Duration "
+msgstr "Doba trvání "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:247
+msgid "Event Type "
+msgstr "Typ události "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:248
+msgid "Pitch "
+msgstr "Výška tónu "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:249
+msgid "Velocity "
+msgstr "Rychlost "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:250
+msgid "Type (Data1) "
+msgstr "Typ (data1) "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:251
+msgid "Value (Data2) "
+msgstr "Hodnota (data2) "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:461
+msgid "(group %1) "
+msgstr "(skupina %1) "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:519
+msgid "<no events at this filter level>"
+msgstr "<žádné události na této úrovni filtru>"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:521
+msgid "<no events>"
+msgstr "<žádné události>"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:696
+msgid "Segment label"
+msgstr "Popisek segmentu"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:696
+msgid "Label:"
+msgstr "Popisek:"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1123
+msgid "&Insert Event"
+msgstr "&Vložit událost"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1130
+msgid "&Delete Event"
+msgstr "&Odstranit událost"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1137
+msgid "&Edit Event"
+msgstr "&Upravit událost"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1144
+msgid "&Advanced Event Editor"
+msgstr "&Rozšířené úpravy události"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1518
+msgid "Open in Event Editor"
+msgstr "Otevřít v editoru událostí"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1519
+msgid "Open in Expert Event Editor"
+msgstr "Otevřít v expertním režimu editoru událostí"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1577
+msgid "%1 - Triggered Segment: %2"
+msgstr "%1 - Spouštěný segment: %2"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1592
+msgid "%1 - Segment Track #%2 - Event List"
+msgstr "%1 - Stopa segmentu #%2 - Seznam událostí"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1598
+msgid "%1 - %2 Segments - Event List"
+msgstr "%1 - %2 Segmenty - Seznam událostí"
+
+#: ../src/gui/rulers/TempoRuler.cpp:131
+msgid "Insert Tempo Change at Playback Position"
+msgstr "Vložit změnu tempa na pozici přehrávání"
+
+#: ../src/gui/rulers/TempoRuler.cpp:136
+msgid "Delete Tempo Change"
+msgstr "Odstranit změnu tempa"
+
+#: ../src/gui/rulers/TempoRuler.cpp:140
+msgid "Ramp Tempo to Next Tempo"
+msgstr "Přejít z dosavadního na následující tempo"
+
+#: ../src/gui/rulers/TempoRuler.cpp:144
+msgid "Un-Ramp Tempo"
+msgstr "Zrušit změnu tempa"
+
+#: ../src/gui/rulers/TempoRuler.cpp:149
+msgid "Edit Tempo..."
+msgstr "Upravit tempo..."
+
+#: ../src/gui/rulers/TempoRuler.cpp:153
+msgid "Edit Time Signature..."
+msgstr "Upravit taktové označení..."
+
+#: ../src/gui/rulers/TempoRuler.cpp:588
+msgid "%1.%2%3 (%4.%5%6 bpm)"
+msgstr "%1.%2%3 (%4.%5%6 bpm)"
+
+#: ../src/gui/rulers/TempoRuler.cpp:596
+msgid "%1.%2%3 bpm"
+msgstr "%1.%2%3 bpm"
+
+#: ../src/gui/rulers/TempoRuler.cpp:604
+msgid "%1 - %2.%3%4"
+msgstr "%1 - %2.%3%4"
+
+#: ../src/gui/rulers/ControlRulerEventInsertCommand.cpp:36
+msgid "Insert Controller Event"
+msgstr "Vložit událost prvku ovládání"
+
+#: ../src/gui/rulers/ControlChangeCommand.cpp:35
+msgid "Control Change"
+msgstr "Změna ovládání"
+
+#: ../src/gui/rulers/PropertyViewRuler.cpp:72
+msgid "%1 controller"
+msgstr "Ovládací prvek %1"
+
+#: ../src/gui/rulers/RawNoteRuler.cpp:453
+msgid "Track #%1, Segment \"%2\" (runtime id %3)"
+msgstr "Stopa #%1, segment \"%2\" (runtime id %3)"
+
+#: ../src/gui/rulers/MarkerRuler.cpp:100
+msgid "Insert Marker"
+msgstr "Vložit záložku"
+
+#: ../src/gui/rulers/MarkerRuler.cpp:104
+msgid "Insert Marker at Playback Position"
+msgstr "Vložit záložku na pozici přehrávání"
+
+#: ../src/gui/rulers/MarkerRuler.cpp:109
+msgid "Delete Marker"
+msgstr "Odstranit záložku"
+
+#: ../src/gui/rulers/MarkerRuler.cpp:114
+msgid "Edit Marker..."
+msgstr "Upravit záložku..."
+
+#: ../src/gui/rulers/MarkerRuler.cpp:119
+msgid ""
+"Click on a marker to move the playback pointer.\n"
+"Shift-click to set a range between markers.\n"
+"Double-click to open the marker editor."
+msgstr ""
+"Klepnutím na záložku posunete ukazatel přehrávání.\n"
+"Shift + klepnutí nastaví rozsah mezi záložkami.\n"
+"Poklepáním otevřete editor záložek."
+
+#: ../src/gui/rulers/ChordNameRuler.cpp:97
+msgid ""
+"Chord name ruler.\n"
+"Turn it on and off from the Settings->Rulers menu."
+msgstr ""
+"Pravítko názvů akordů.\n"
+"Zapíná se a vypíná se v nabídce Nastavení->Pravítka."
+
+#: ../src/gui/rulers/ControlRulerEventEraseCommand.cpp:37
+msgid "Erase Controller Event(s)"
+msgstr "Vymazat událost(i) ovládacího prvku"
+
+#: ../src/gui/general/EditView.cpp:901
+#: ../src/gui/rulers/ControllerEventsRuler.cpp:188
+msgid "Unsupported Event Type"
+msgstr "Nepodporovaný typ události"
+
+#: ../src/gui/rulers/ControllerEventsRuler.cpp:203
+msgid "Controller Events"
+msgstr "Události ovládacího prvku"
+
+#: ../src/gui/rulers/ControllerEventsRuler.cpp:278
+msgid "Controller Event Number"
+msgstr "Číslo události ovládacího prvku"
+
+#: ../src/gui/rulers/ControllerEventsRuler.cpp:471
+msgid "Add line of controllers"
+msgstr "Přidat řadu ovládacích prvků"
+
+#: ../src/gui/rulers/LoopRuler.cpp:89
+msgid ""
+"Click and drag to move the playback pointer.\n"
+"Shift-click and drag to set a range for looping or editing.\n"
+"Shift-click to clear the loop or range.\n"
+"Double-click to start playback."
+msgstr ""
+"Klepnutím a tažením posunete ukazatel přehrávání.\n"
+"Shift + klepnutí a tažení nastaví úsek k opakování nebo k úpravám.\n"
+"Shift + klepnutí zruší nastavené opakování nebo úsek.\n"
+"Poklepání spustí přehrávání."
+
+#: ../src/gui/general/EditViewBase.cpp:228
+msgid "Set Segment Start Time..."
+msgstr "Nastavit počáteční čas segmentu..."
+
+#: ../src/gui/general/EditViewBase.cpp:232
+msgid "Set Segment Duration..."
+msgstr "Nastavit dobu trvání segmentu..."
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:56
+msgid "Load track parameters preset"
+msgstr "Načíst přednastavené parametry stopy"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:62
+msgid "Convert notation for..."
+msgstr "Konvertovat notaci pro..."
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:86
+msgid "Select preset track parameters for:"
+msgstr "Vybrat přednastavené parametry stopy pro:"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:87
+msgid "Create appropriate notation for:"
+msgstr "Vytvořit odpovídající notaci pro:"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:89
+msgid "Category"
+msgstr "Kategorie"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:95
+msgid "Player Ability"
+msgstr "Pokročilost hráče"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:97
+msgid "Amateur"
+msgstr "Amatér"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:98
+msgid "Professional"
+msgstr "Profesionál"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:104
+msgid "Only selected segments"
+msgstr "Pouze vybrané segmenty"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:106
+msgid "All segments in this track"
+msgstr "Všechny segmenty v této stopě"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:111
+msgid "Only for new segments"
+msgstr "Pouze pro nové segmenty"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:113
+msgid "Convert existing segments"
+msgstr "Konvertovat existující segmenty"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:39
+#, c-format
+msgid "C%1"
+msgstr "C%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:39
+#, c-format
+msgid "C#%1"
+msgstr "C#%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:39
+#, c-format
+msgid "D%1"
+msgstr "D%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:39
+#, c-format
+msgid "D#%1"
+msgstr "D#%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:40
+#, c-format
+msgid "E%1"
+msgstr "E%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:40
+#, c-format
+msgid "F%1"
+msgstr "F%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:40
+#, c-format
+msgid "F#%1"
+msgstr "F#%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:40
+#, c-format
+msgid "G%1"
+msgstr "G%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:41
+#, c-format
+msgid "G#%1"
+msgstr "G#%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:41
+#, c-format
+msgid "A%1"
+msgstr "A%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:41
+#, c-format
+msgid "A#%1"
+msgstr "A#%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:41
+#, c-format
+msgid "B%1"
+msgstr "H%1"
+
+#: ../src/gui/general/PresetGroup.cpp:95
+#, c-format
+msgid "Can't open preset file %1"
+msgstr "Nelze otevřít soubor přednastavení %1"
+
+#: ../src/gui/general/EditView.cpp:744
+msgid "&Halve Durations"
+msgstr "&Poloviční doby trvání"
+
+#: ../src/gui/general/EditView.cpp:748
+msgid "&Double Durations"
+msgstr "&Dvojité doby trvání"
+
+#: ../src/gui/general/EditView.cpp:806
+msgid "Show Velocity Property Ruler"
+msgstr "Zobrazit pravítko vlastnosti rychlosti"
+
+#: ../src/gui/general/EditView.cpp:825
+msgid "Insert item"
+msgstr "Vložit položku"
+
+#: ../src/gui/general/EditView.cpp:831
+msgid "Erase selected items"
+msgstr "Vymazat vybrané položky"
+
+#: ../src/gui/general/EditView.cpp:835
+msgid "Clear ruler"
+msgstr "Vymazat pravítko"
+
+#: ../src/gui/general/EditView.cpp:839
+msgid "Insert line of controllers"
+msgstr "Vložit řadu ovládacích prvků"
+
+#: ../src/gui/general/EditView.cpp:843
+msgid "Flip forward"
+msgstr "Listovat vpřed"
+
+#: ../src/gui/general/EditView.cpp:847
+msgid "Flip backwards"
+msgstr "Listovat vzad"
+
+#: ../src/gui/general/EditView.cpp:851
+msgid "Draw property line"
+msgstr "Nakreslit řádek vlastnosti"
+
+#: ../src/gui/general/EditView.cpp:855
+msgid "Select all property values"
+msgstr "Vybrat všechny hodnoty vlastnosti"
+
+#: ../src/gui/general/EditView.cpp:894
+msgid "%1 Controller %2 %3"
+msgstr "%1 Ovládací prvek %2 %3"
+
+#: ../src/gui/general/EditView.cpp:1066
+msgid "I"
+msgstr "I"
+
+#: ../src/gui/general/EditView.cpp:1066
+msgid "II"
+msgstr "II"
+
+#: ../src/gui/general/EditView.cpp:1066
+msgid "III"
+msgstr "III"
+
+#: ../src/gui/general/EditView.cpp:1066
+msgid "IV"
+msgstr "IV"
+
+#: ../src/gui/general/EditView.cpp:1067
+msgid "V"
+msgstr "V"
+
+#: ../src/gui/general/EditView.cpp:1067
+msgid "VI"
+msgstr "VI"
+
+#: ../src/gui/general/EditView.cpp:1067
+msgid "VII"
+msgstr "VII"
+
+#: ../src/gui/general/EditView.cpp:1067
+msgid "VIII"
+msgstr "VIII"
+
+#: ../src/gui/general/EditView.cpp:1069
+msgid "%1 flat"
+msgstr "%1 béčko"
+
+#: ../src/gui/general/EditView.cpp:1070
+msgid "%1 sharp"
+msgstr "%1 křížek"
+
+#: ../src/gui/general/EditView.cpp:1085
+msgid "&Insert Note"
+msgstr "&Vložit notu"
+
+#: ../src/gui/general/EditView.cpp:1091
+msgid "&Upper Octave"
+msgstr "&Vyšší oktáva"
+
+#: ../src/gui/general/EditView.cpp:1096
+msgid "&Lower Octave"
+msgstr "&Nižší oktáva"
+
+#: ../src/gui/general/EditView.cpp:1268
+msgid "Estimated time signature shown"
+msgstr "Zobrazené odhadované označení taktu"
+
+#: ../src/gui/general/EditView.cpp:1431
+msgid "Halving durations..."
+msgstr "Probíhá půlení dob trvání..."
+
+#: ../src/gui/general/EditView.cpp:1445
+msgid "Doubling durations..."
+msgstr "Probíhá násobení dob trvání dvěma..."
+
+#: ../src/gui/general/EditView.cpp:1469
+msgid "Rescaling..."
+msgstr "Probíhá změna délky..."
+
+#: ../src/gui/general/EditView.cpp:1489
+msgid "By number of semitones: "
+msgstr "Zadejte o kolik půltónů:"
+
+#: ../src/gui/general/EditView.cpp:1496 ../src/gui/general/EditView.cpp:1518
+msgid "Transposing..."
+msgstr "Probíhá transpozice..."
+
+#: ../src/gui/general/EditView.cpp:1536
+msgid "Transposing up one semitone..."
+msgstr "Probíhá transpozice o půl tónu výš..."
+
+#: ../src/gui/general/EditView.cpp:1545
+msgid "Transposing up one octave..."
+msgstr "Probíhá transpozice o oktávu výš..."
+
+#: ../src/gui/general/EditView.cpp:1554
+msgid "Transposing down one semitone..."
+msgstr "Probíhá transpozice o půl tónu níž..."
+
+#: ../src/gui/general/EditView.cpp:1563
+msgid "Transposing down one octave..."
+msgstr "Probíhá transpozice o oktávu níž..."
+
+#: ../src/gui/general/EditView.cpp:1575
+msgid "Inverting..."
+msgstr "Probíhá invertování..."
+
+#: ../src/gui/general/EditView.cpp:1587
+msgid "Retrograding..."
+msgstr "Probíhá návrat zpět..."
+
+#: ../src/gui/general/EditView.cpp:1599
+msgid "Retrograde inverting..."
+msgstr "Probíhá zpětné invertování..."
+
+#: ../src/gui/general/EditView.cpp:1608
+msgid "Jogging left..."
+msgstr "Probíhá krokový posun vlevo..."
+
+#: ../src/gui/general/EditView.cpp:1623
+msgid "Jogging right..."
+msgstr "Probíhá krokový posun vpravo..."
+
+#: ../src/sound/AudioFileManager.cpp:660
+#, c-format
+msgid "Downloading file %1"
+msgstr "Probíhá stahování souboru %1"
+
+#: ../src/sound/AudioFileManager.cpp:735
+msgid "Converting audio file..."
+msgstr "Probíhá konverze zvukového souboru..."
+
+#: ../src/sound/AudioFileManager.cpp:737
+msgid "Resampling audio file..."
+msgstr "Probíhá převzorkování zvukového souboru..."
+
+#: ../src/sound/AudioFileManager.cpp:739
+msgid "Converting and resampling audio file..."
+msgstr "Probíhá konverze a převzorkování zvukového souboru..."
+
+#: ../src/sound/AudioFileManager.cpp:741
+msgid "Importing audio file..."
+msgstr "Probíhá import zvukového souboru..."
+
+#: ../src/sound/AudioFileManager.cpp:794
+msgid "Failed to convert or resample audio file on import"
+msgstr "Nepodařilo se konvertovat nebo převzorkovat zvukový soubor při importu"
+
+#: ../src/sequencer/main.cpp:46 ../src/sequencer/main.cpp:86
+msgid "RosegardenSequencer"
+msgstr "Sekvencer Rosegarden"
+
+#: ../src/sequencer/main.cpp:54
+msgid "JACK playback and capture ports"
+msgstr "Porty přehrávání a zachytávání serveru JACK"
+
+#: ../src/commands/segment/SegmentSyncCommand.cpp:38
+#: ../src/commands/segment/SegmentSyncCommand.cpp:44
+#: ../src/commands/segment/SegmentSyncCommand.cpp:55
+#: ../src/commands/segment/SegmentSyncCommand.cpp:63
+msgid "Sync segment parameters"
+msgstr "Synchronizovat parametry segmentu"
+
+#: ../src/commands/segment/RenameTrackCommand.h:52
+msgid "Rename Track"
+msgstr "Přejmenovat stopu"
+
+#: ../src/commands/segment/SegmentRepeatToCopyCommand.cpp:39
+msgid "Turn Repeats into Copies"
+msgstr "Převést opakování na kopie"
+
+#: ../src/commands/segment/SegmentTransposeCommand.cpp:36
+#: ../src/commands/segment/SegmentTransposeCommand.cpp:42
+msgid "Change segment transposition"
+msgstr "Změnit transpozici segmentu"
+
+#: ../src/commands/edit/RescaleCommand.h:50
+#: ../src/commands/segment/AudioSegmentRescaleCommand.h:62
+#: ../src/commands/segment/SegmentRescaleCommand.h:58
+msgid "Stretch or S&quash..."
+msgstr "Prodloužit nebo &zkrátit..."
+
+#: ../src/commands/segment/SegmentLabelCommand.h:52
+msgid "Re&label..."
+msgstr "Změnit &popisek..."
+
+#: ../src/commands/segment/AudioSegmentResizeFromStartCommand.cpp:39
+#: ../src/commands/segment/SegmentResizeFromStartCommand.cpp:39
+msgid "Resize Segment"
+msgstr "Změnit velikost segmentu"
+
+#: ../src/commands/segment/RemoveTempoChangeCommand.h:58
+msgid "Remove &Tempo Change..."
+msgstr "Odstranit změnu &tempa..."
+
+#: ../src/commands/segment/SegmentEraseCommand.cpp:40
+#: ../src/commands/segment/SegmentEraseCommand.cpp:52
+msgid "Erase Segment"
+msgstr "Vymazat segment"
+
+#: ../src/commands/segment/AudioSegmentRescaleCommand.cpp:126
+#: ../src/commands/segment/SegmentRescaleCommand.cpp:102
+msgid "(rescaled)"
+msgstr "(změněna délka)"
+
+#: ../src/commands/segment/AudioSegmentRescaleCommand.cpp:127
+#: ../src/commands/segment/SegmentRescaleCommand.cpp:105
+msgid "%1 (rescaled)"
+msgstr "%1 (změněna délka)"
+
+#: ../src/commands/segment/PasteToTriggerSegmentCommand.cpp:47
+msgid "Paste as New Triggered Segment"
+msgstr "Vložit jako nový spouštěný segment"
+
+#: ../src/commands/segment/SegmentColourMapCommand.h:52
+msgid "Change Segment Color Map..."
+msgstr "Změnit barevnou mapu segmentu..."
+
+#: ../src/commands/segment/SegmentQuickCopyCommand.h:55
+msgid "Quick-Copy Segment"
+msgstr "Rychlé kopírování segmentu"
+
+#: ../src/commands/segment/AudioSegmentSplitCommand.cpp:42
+msgid "Split Audio Segment"
+msgstr "Rozdělit zvukový segment"
+
+#: ../src/commands/segment/AudioSegmentSplitCommand.cpp:103
+#: ../src/commands/segment/SegmentSplitCommand.cpp:135
+msgid " (split)"
+msgstr " (rozděleno)"
+
+#: ../src/commands/segment/AudioSegmentSplitCommand.cpp:104
+#: ../src/commands/segment/SegmentSplitByRecordingSrcCommand.cpp:120
+#: ../src/commands/segment/SegmentSplitByRecordingSrcCommand.cpp:122
+#: ../src/commands/segment/SegmentSplitCommand.cpp:136
+msgid "%1 (split)"
+msgstr "%1 (rozděleno)"
+
+#: ../src/commands/segment/SegmentLabelCommand.cpp:40
+msgid "Label Segments"
+msgstr "Označit segmenty popisky"
+
+#: ../src/commands/segment/OpenOrCloseRangeCommand.cpp:43
+msgid "Open or Close Range"
+msgstr "Otevřít nebo zavřít úsek"
+
+#: ../src/commands/edit/TransposeCommand.h:55
+#: ../src/commands/segment/SegmentTransposeCommand.h:54
+msgid "Transpose by &Interval..."
+msgstr "Transponovat o &interval..."
+
+#: ../src/commands/segment/SegmentAutoSplitCommand.cpp:148
+msgid "%1 (part)"
+msgstr "%1 (část)"
+
+#: ../src/commands/segment/AudioSegmentInsertCommand.cpp:51
+#: ../src/commands/segment/SegmentInsertCommand.cpp:43
+#: ../src/commands/segment/SegmentInsertCommand.cpp:56
+msgid "Create Segment"
+msgstr "Vytvořit segment"
+
+#: ../src/commands/segment/AudioSegmentInsertCommand.cpp:114
+msgid "%1 (inserted)"
+msgstr "%1 (vloženo)"
+
+#: ../src/commands/segment/AudioSegmentInsertCommand.cpp:117
+msgid "unknown audio file"
+msgstr "neznámý zvukový soubor"
+
+#: ../src/commands/segment/CreateTempoMapFromSegmentCommand.cpp:40
+msgid "Set Tempos from Beat Segment"
+msgstr "Nastavit tempa ze segmentu doby"
+
+#: ../src/commands/segment/SegmentSplitByRecordingSrcCommand.h:52
+msgid "Split by &Recording Source..."
+msgstr "Rozdělit podle záznamového zd&roje..."
+
+#: ../src/commands/segment/SegmentColourMapCommand.cpp:40
+msgid "Change Segment Color Map"
+msgstr "Změnit barevnou mapu segmentu"
+
+#: ../src/commands/edit/CopyCommand.cpp:64
+#: ../src/commands/segment/SegmentQuickCopyCommand.cpp:57
+msgid "%1 (copied)"
+msgstr "%1 (zkopírováno)"
+
+#: ../src/commands/segment/SegmentColourCommand.h:52
+msgid "Change Segment Color..."
+msgstr "Změnit barvu segmentu..."
+
+#: ../src/commands/segment/SegmentSplitByPitchCommand.cpp:170
+msgid "%1 (upper)"
+msgstr "%1 (horní)"
+
+#: ../src/commands/segment/SegmentSplitByPitchCommand.cpp:172
+msgid "%1 (lower)"
+msgstr "%1 (spodní)"
+
+#: ../src/commands/segment/SegmentSingleRepeatToCopyCommand.cpp:39
+msgid "Turn Single Repeat into Copy"
+msgstr "Převést jeden úsek opakování na kopii"
+
+#: ../src/commands/segment/AddTempoChangeCommand.h:58
+msgid "Add Te&mpo Change..."
+msgstr "Přidat změnu te&mpa..."
+
+#: ../src/commands/segment/AudioSegmentAutoSplitCommand.h:57
+#: ../src/commands/segment/SegmentAutoSplitCommand.h:53
+msgid "&Split on Silence"
+msgstr "&Rozdělit v pauzách"
+
+#: ../src/commands/segment/SetTriggerSegmentBaseVelocityCommand.cpp:39
+msgid "Set Base Velocity"
+msgstr "Nastavit základní rychlost"
+
+#: ../src/commands/segment/DeleteRangeCommand.cpp:43
+#: ../src/commands/segment/EraseSegmentsStartingInRangeCommand.cpp:39
+msgid "Delete Range"
+msgstr "Odstranit úsek"
+
+#: ../src/commands/segment/ChangeCompositionLengthCommand.h:53
+msgid "Change &Composition Start and End..."
+msgstr "Změnit začátek a konec &skladby..."
+
+#: ../src/commands/segment/MoveTracksCommand.h:51
+msgid "Move Tracks..."
+msgstr "Přesunout stopy..."
+
+#: ../src/commands/segment/SegmentColourCommand.cpp:39
+msgid "Change Segment Color"
+msgstr "Změnit barvu segmentu"
+
+#: ../src/commands/segment/AudioSegmentDistributeCommand.h:66
+msgid "Distribute Audio Segments over MIDI"
+msgstr "Distribuovat zvukové segmenty prostřednictvím MIDI"
+
+#: ../src/commands/segment/AudioSegmentAutoSplitCommand.cpp:147
+msgid "%1 (autosplit %2)"
+msgstr "%1 (automatické rozdělení %2)"
+
+#: ../src/commands/segment/SetTriggerSegmentDefaultRetuneCommand.cpp:39
+msgid "Set Default Retune"
+msgstr "Nastavit výchozí přeladění"
+
+#: ../src/commands/segment/AddTimeSignatureCommand.h:52
+msgid "Add Time Si&gnature Change..."
+msgstr "Přidat změnu &taktového označení..."
+
+#: ../src/commands/segment/AddTriggerSegmentCommand.cpp:42
+msgid "Add Triggered Segment"
+msgstr "Přidat spouštěný segment"
+
+#: ../src/commands/segment/SetTriggerSegmentDefaultTimeAdjustCommand.cpp:39
+msgid "Set Default Time Adjust"
+msgstr "Nastavit výchozí korekci času"
+
+#: ../src/commands/segment/RemoveTimeSignatureCommand.h:58
+msgid "Remove &Time Signature Change..."
+msgstr "Odstranit změnu ta&ktového označení..."
+
+#: ../src/commands/segment/SegmentCommandRepeat.cpp:39
+msgid "Repeat Segments"
+msgstr "Opakovat segmenty"
+
+#: ../src/commands/segment/AddTracksCommand.h:55
+msgid "Add Tracks..."
+msgstr "Přidat stopy..."
+
+#: ../src/commands/segment/ModifyDefaultTempoCommand.h:51
+msgid "Modify &Default Tempo..."
+msgstr "Upravit &výchozí tempo..."
+
+#: ../src/commands/segment/SegmentSplitByPitchCommand.h:61
+msgid "Split by &Pitch..."
+msgstr "Rozdělit podle &výšky tónu..."
+
+#: ../src/commands/segment/DeleteTriggerSegmentCommand.cpp:40
+msgid "Delete Triggered Segment"
+msgstr "Odstranit spouštěný segment"
+
+#: ../src/commands/segment/SegmentSplitCommand.cpp:42
+msgid "Split Segment"
+msgstr "Rozdělit segment"
+
+#: ../src/commands/segment/DeleteTracksCommand.h:51
+msgid "Delete Tracks..."
+msgstr "Odstranit stopy..."
+
+#: ../src/commands/segment/InsertRangeCommand.cpp:42
+msgid "Insert Range"
+msgstr "Vložit úsek"
+
+#: ../src/commands/segment/DeleteRangeCommand.h:62
+msgid "Rejoin Command"
+msgstr "Příkaz k opětovnému spojení"
+
+#: ../src/commands/segment/SetTriggerSegmentBasePitchCommand.cpp:39
+msgid "Set Base Pitch"
+msgstr "Nastavit základní výšku tónu"
+
+#: ../src/commands/segment/PasteConductorDataCommand.cpp:41
+msgid "Paste Tempos and Time Signatures"
+msgstr "Vložit tempa a taktová označení"
+
+#: ../src/commands/segment/SegmentSyncClefCommand.cpp:34
+msgid "Sync segment clef"
+msgstr "Synchronizovat klíč segmentu"
+
+#: ../src/commands/matrix/MatrixInsertionCommand.cpp:46
+#: ../src/commands/notation/NoteInsertionCommand.cpp:54
+msgid "Insert Note"
+msgstr "Vložit notu"
+
+#: ../src/commands/matrix/MatrixEraseCommand.cpp:41
+msgid "Erase Note"
+msgstr "Vymazat notu"
+
+#: ../src/commands/matrix/MatrixPercussionInsertionCommand.cpp:47
+msgid "Insert Percussion Note"
+msgstr "Vložit notu pro bicí"
+
+#: ../src/commands/matrix/MatrixModifyCommand.cpp:43
+msgid "Move Note"
+msgstr "Přesunout notu"
+
+#: ../src/commands/matrix/MatrixModifyCommand.cpp:43
+msgid "Modify Note"
+msgstr "Upravit notu"
+
+#: ../src/commands/edit/PasteEventsCommand.cpp:98
+msgid "Paste into an existing gap [\"restricted\"]"
+msgstr "Vložit do existující mezery [\"omezeno\"]"
+
+#: ../src/commands/edit/PasteEventsCommand.cpp:100
+msgid "Erase existing events to make room [\"simple\"]"
+msgstr "Vymazat existující události a uvolnit tak místo [\"jednoduché\"]"
+
+#: ../src/commands/edit/PasteEventsCommand.cpp:102
+msgid "Move existing events out of the way [\"open-n-paste\"]"
+msgstr "Odsunout existující události [\"otevřít a vložit\"]"
+
+#: ../src/commands/edit/PasteEventsCommand.cpp:104
+msgid "Overlay notes, tying against present notes [\"note-overlay\"]"
+msgstr "Překrýt noty a svázat s existujícími notami [\"notové překrytí\"]"
+
+#: ../src/commands/edit/PasteEventsCommand.cpp:106
+msgid "Overlay notes, ignoring present notes [\"matrix-overlay\"]"
+msgstr "Překrýt noty a ignorovat existující noty [\"maticové překrytí\"]"
+
+#: ../src/commands/edit/AddDotCommand.h:52
+msgid "&Add Dot"
+msgstr "&Přidat tečku"
+
+#: ../src/commands/edit/RemoveMarkerCommand.h:55
+msgid "&Remove Marker"
+msgstr "&Odstranit záložku"
+
+#: ../src/commands/edit/EventUnquantizeCommand.cpp:43
+#: ../src/commands/edit/EventUnquantizeCommand.cpp:54
+msgid "Unquantize Events"
+msgstr "Zrušit kvantizaci událostí"
+
+#: ../src/commands/edit/ChangeVelocityCommand.h:53
+msgid "&Increase Velocity"
+msgstr "Z&většit rychlost"
+
+#: ../src/commands/edit/ChangeVelocityCommand.h:54
+msgid "&Reduce Velocity"
+msgstr "Z&menšit rychlost"
+
+#: ../src/commands/edit/CopyCommand.cpp:46
+msgid "(excerpt)"
+msgstr "(výňatek)"
+
+#: ../src/commands/edit/CopyCommand.cpp:60
+msgid "(copied)"
+msgstr "(zkopírováno)"
+
+#: ../src/commands/edit/EventInsertionCommand.cpp:39
+msgid "Insert Event"
+msgstr "Vložit událost"
+
+#: ../src/commands/edit/InsertTriggerNoteCommand.cpp:55
+msgid "Insert Trigger Note"
+msgstr "Vložit spouštěcí notu"
+
+#: ../src/commands/edit/CollapseNotesCommand.h:50
+msgid "Collapse &Equal-Pitch Notes"
+msgstr "Sjednotit noty st&ejné tónové výšky"
+
+#: ../src/commands/edit/TransposeCommand.h:61
+msgid "&Up a Semitone"
+msgstr "O půl tónu &výš"
+
+#: ../src/commands/edit/TransposeCommand.h:62
+msgid "&Down a Semitone"
+msgstr "O půl tónu &níž"
+
+#: ../src/commands/edit/TransposeCommand.h:63
+msgid "Up an &Octave"
+msgstr "O &oktávu výš"
+
+#: ../src/commands/edit/TransposeCommand.h:64
+msgid "Down an Octa&ve"
+msgstr "O o&ktávu níž"
+
+#: ../src/commands/edit/TransposeCommand.h:65
+msgid "&Transpose by Semitones..."
+msgstr "Transponovat o &půltóny..."
+
+#: ../src/commands/edit/SetNoteTypeCommand.h:56
+msgid "&Set Note Type"
+msgstr "&Nastavit typ noty"
+
+#: ../src/commands/edit/EventEditCommand.h:55
+msgid "Edit E&vent"
+msgstr "Upravit u&dálost"
+
+#: ../src/commands/edit/AddMarkerCommand.h:54
+msgid "&Add Marker"
+msgstr "&Přidat záložku"
+
+#: ../src/commands/edit/SelectionPropertyCommand.h:66
+msgid "Set &Property"
+msgstr "Nastavit &vlastnost"
+
+#: ../src/commands/edit/CutCommand.h:55
+msgid "Cu&t"
+msgstr "Vyjmou&t"
+
+#: ../src/commands/edit/EventQuantizeCommand.cpp:114
+msgid "Heuristic Notation &Quantize"
+msgstr "Heuristická &kvantizace notace"
+
+#: ../src/commands/edit/EventQuantizeCommand.cpp:116
+msgid "Grid &Quantize"
+msgstr "Rastrová &kvantizace"
+
+#: ../src/commands/edit/ClearTriggersCommand.h:52
+msgid "&Clear Triggers"
+msgstr "&Vymazat spouštěcí značky"
+
+#: ../src/commands/edit/RetrogradeCommand.h:51
+msgid "&Retrograde"
+msgstr "&Zrcadlový"
+
+#: ../src/commands/edit/InvertCommand.h:51
+msgid "&Invert"
+msgstr "&Invertovat"
+
+#: ../src/commands/edit/SetTriggerCommand.h:64
+msgid "Tri&gger Segment"
+msgstr "&Spouštěcí segment"
+
+#: ../src/commands/edit/SetLyricsCommand.h:50
+msgid "Edit L&yrics"
+msgstr "Upravit &text melodie"
+
+#: ../src/commands/edit/MoveAcrossSegmentsCommand.cpp:73
+msgid "&Move Events to Other Segment"
+msgstr "&Přesunout události do jiného segmentu"
+
+#: ../src/commands/edit/RetrogradeInvertCommand.h:51
+msgid "Re&trograde Invert"
+msgstr "Inver&ovat zrcadlový"
+
+#: ../src/commands/edit/ModifyMarkerCommand.h:55
+msgid "&Modify Marker"
+msgstr "&Upravit záložku"
+
+#: ../src/commands/studio/AddControlParameterCommand.h:61
+msgid "&Add Control Parameter"
+msgstr "&Přidat ovládací parametr"
+
+#: ../src/commands/studio/ModifyInstrumentMappingCommand.h:55
+msgid "Modify &Instrument Mapping"
+msgstr "Upravit mapování &nástroje"
+
+#: ../src/commands/studio/RemoveControlParameterCommand.h:60
+msgid "&Remove Control Parameter"
+msgstr "&Odstranit ovládací parametr"
+
+#: ../src/commands/studio/ReconnectDeviceCommand.h:55
+msgid "Reconnect Device"
+msgstr "Znovu připojit zařízení"
+
+#: ../src/commands/studio/ModifyDeviceCommand.h:68
+msgid "Modify &MIDI Bank"
+msgstr "Upravit banku &MIDI"
+
+#: ../src/commands/studio/CreateOrDeleteDeviceCommand.h:68
+msgid "Create Device"
+msgstr "Vytvořit zařízení"
+
+#: ../src/commands/studio/ModifyDeviceMappingCommand.h:55
+msgid "Modify &Device Mapping"
+msgstr "Upravit mapování &zařízení"
+
+#: ../src/commands/studio/RenameDeviceCommand.h:55
+msgid "Rename Device"
+msgstr "Přejmenovat zařízení"
+
+#: ../src/commands/studio/ModifyControlParameterCommand.h:61
+msgid "&Modify Control Parameter"
+msgstr "&Upravit ovládací parametr"
+
+#: ../src/commands/notation/TieNotesCommand.h:49
+msgid "&Tie"
+msgstr "&Ligatura"
+
+#: ../src/commands/notation/ClefInsertionCommand.cpp:74
+msgid "Add Cle&f Change..."
+msgstr "Přidat změnu &klíče..."
+
+#: ../src/commands/notation/GuitarChordInsertionCommand.cpp:40
+msgid "Insert Guitar Chord"
+msgstr "Vložit kytarový akord"
+
+#: ../src/commands/notation/RespellCommand.cpp:47
+#, c-format
+msgid "Respell with %1"
+msgstr "Provést enharmonickou záměnu pomocí - %1"
+
+#: ../src/commands/notation/RespellCommand.cpp:50
+msgid "Do&uble Sharp"
+msgstr "dv&ojitý křížek"
+
+#: ../src/commands/notation/RespellCommand.cpp:52
+msgid "&Sharp"
+msgstr "&křížek"
+
+#: ../src/commands/notation/RespellCommand.cpp:54
+msgid "&Flat"
+msgstr "&béčko"
+
+#: ../src/commands/notation/RespellCommand.cpp:56
+msgid "Dou&ble Flat"
+msgstr "dvo&jité béčko"
+
+#: ../src/commands/notation/RespellCommand.cpp:58
+msgid "&Natural"
+msgstr "&přirozené"
+
+#: ../src/commands/notation/RespellCommand.cpp:60
+msgid "N&one"
+msgstr "žád&né"
+
+#: ../src/commands/notation/RespellCommand.cpp:66
+msgid "Respell Accidentals &Upward"
+msgstr "Opravit posuvky nahor&u"
+
+#: ../src/commands/notation/RespellCommand.cpp:69
+msgid "Respell Accidentals &Downward"
+msgstr "Opravit posuvky &dolů"
+
+#: ../src/commands/notation/RespellCommand.cpp:72
+msgid "&Restore Accidentals"
+msgstr "&Obnovit posuvky"
+
+#: ../src/commands/notation/RespellCommand.cpp:75
+msgid "Respell Accidentals"
+msgstr "Opravit posuvky"
+
+#: ../src/commands/notation/DeCounterpointCommand.h:55
+msgid "Split-and-Tie Overlapping &Chords"
+msgstr "Rozdělit-a-svázat ligaturou překrývající se &akordy"
+
+#: ../src/commands/notation/BeamCommand.h:49
+msgid "&Beam Group"
+msgstr "Skupina s &trámcem"
+
+#: ../src/commands/notation/AddTextMarkCommand.h:51
+msgid "Add Te&xt Mark..."
+msgstr "Přidat te&xtovou značku..."
+
+#: ../src/commands/notation/RestoreSlursCommand.h:49
+msgid "&Restore Slur Positions"
+msgstr "&Obnovit pozice legata"
+
+#: ../src/commands/notation/SustainInsertionCommand.h:56
+msgid "Add Pedal &Press"
+msgstr "Přidat &sešlápnutí pedálu"
+
+#: ../src/commands/notation/SustainInsertionCommand.h:58
+msgid "Add Pedal &Release"
+msgstr "Přidat &uvolnění pedálu"
+
+#: ../src/commands/notation/FixNotationQuantizeCommand.h:49
+msgid "Fi&x Notation Quantization"
+msgstr "O&pravit kvantizaci notace"
+
+#: ../src/commands/notation/ChangeStemsCommand.h:51
+msgid "Stems &Up"
+msgstr "Nožičky not &nahoru"
+
+#: ../src/commands/notation/ChangeStemsCommand.h:51
+msgid "Stems &Down"
+msgstr "Nožičky not &dolů"
+
+#: ../src/commands/notation/MakeAccidentalsCautionaryCommand.cpp:43
+msgid "Use &Cautionary Accidentals"
+msgstr "Použít &varovné posuvky"
+
+#: ../src/commands/notation/MakeAccidentalsCautionaryCommand.cpp:45
+msgid "Cancel C&autionary Accidentals"
+msgstr "Zrušit v&arovné posuvky"
+
+#: ../src/commands/notation/SetVisibilityCommand.h:50
+msgid "Set Visibility"
+msgstr "Nastavit viditelnost"
+
+#: ../src/commands/notation/ChangeStyleCommand.h:53
+msgid "Change &Note Style"
+msgstr "Změnit styl &not"
+
+#: ../src/commands/notation/TextInsertionCommand.cpp:41
+msgid "Insert Text"
+msgstr "Vložit text"
+
+#: ../src/commands/notation/InterpretCommand.h:70
+msgid "&Interpret..."
+msgstr "&Interpretace..."
+
+#: ../src/commands/notation/TupletCommand.h:53
+msgid "&Triplet"
+msgstr "&Triola"
+
+#: ../src/commands/notation/TupletCommand.h:54
+msgid "Tu&plet..."
+msgstr "Rytmická notová &skupina..."
+
+#: ../src/commands/notation/UnTupletCommand.h:50
+msgid "&Untuplet"
+msgstr "&Zrušit rytmickou notovou skupinu"
+
+#: ../src/commands/notation/CollapseRestsCommand.h:54
+msgid "&Collapse Rests"
+msgstr "&Sjednotit pomlky"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:145
+msgid "Add S&lur"
+msgstr "Přidat &legato"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:147
+msgid "Add &Phrasing Slur"
+msgstr "Přidat &frázovací legato"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:149
+msgid "Add Double-Octave Up"
+msgstr "Přidat dvojitou oktávu nahoru"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:151
+msgid "Add Octave &Up"
+msgstr "Přidat oktávu &nahoru"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:153
+msgid "Add Octave &Down"
+msgstr "Přidat oktávu &dolů"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:155
+msgid "Add Double Octave Down"
+msgstr "Přidat dvojitou oktávu dolů"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:160
+msgid "Add &Crescendo"
+msgstr "Přidat &crescendo"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:162
+msgid "Add &Decrescendo"
+msgstr "Přidat &decrescendo"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:164
+msgid "Add &Glissando"
+msgstr "Přidat &glissando"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:167
+msgid "Add &%1%2"
+msgstr "Přidat &%1%2"
+
+#: ../src/commands/notation/RemoveNotationQuantizeCommand.h:49
+msgid "Remo&ve Notation Quantization"
+msgstr "&Odstranit kvantizaci notace"
+
+#: ../src/commands/notation/MakeChordCommand.h:50
+msgid "Make &Chord"
+msgstr "Vytvořit &akord"
+
+#: ../src/commands/notation/MultiKeyInsertionCommand.h:63
+msgid "Change all to &Key %1..."
+msgstr "Změnit vše na &tóninu %1..."
+
+#: ../src/commands/notation/KeyInsertionCommand.h:67
+#: ../src/commands/notation/MultiKeyInsertionCommand.h:65
+msgid "Add &Key Change..."
+msgstr "Přidat změnu &tóniny..."
+
+#: ../src/commands/notation/RestoreStemsCommand.h:49
+msgid "&Restore Stems"
+msgstr "&Obnovit nožičky"
+
+#: ../src/commands/notation/MakeNotesViableCommand.h:55
+#: ../src/commands/notation/MakeRegionViableCommand.h:52
+msgid "Tie Notes at &Barlines"
+msgstr "Svázat noty ligaturou na &taktových čárách"
+
+#: ../src/commands/notation/AddSlashesCommand.h:46
+msgid "Slashes"
+msgstr "Tremolo"
+
+#: ../src/commands/notation/ChangeSlurPositionCommand.h:51
+msgid "Slur &Above"
+msgstr "Legato &nad"
+
+#: ../src/commands/notation/ChangeSlurPositionCommand.h:51
+msgid "Slur &Below"
+msgstr "Legato &pod"
+
+#: ../src/commands/notation/NormalizeRestsCommand.h:54
+msgid "&Normalize Rests"
+msgstr "&Normalizovat pomlky"
+
+#: ../src/commands/notation/TextChangeCommand.cpp:41
+msgid "Edit Text"
+msgstr "Upravit text"
+
+#: ../src/commands/notation/RemoveMarksCommand.h:49
+msgid "&Remove All Marks"
+msgstr "&Odstranit všechny značky"
+
+#: ../src/commands/notation/AutoBeamCommand.h:52
+msgid "&Auto-Beam"
+msgstr "&Automatické trámce"
+
+#: ../src/commands/notation/UntieNotesCommand.h:49
+msgid "&Untie"
+msgstr "&Zrušit ligaturu"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:48
+msgid "S&forzando"
+msgstr "S&forzando"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:50
+msgid "Sta&ccato"
+msgstr "Sta&ccato"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:52
+msgid "R&inforzando"
+msgstr "R&inforzando"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:54
+msgid "T&enuto"
+msgstr "T&enuto"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:56
+msgid "Tri&ll"
+msgstr "Try&lek"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:58
+msgid "Trill &with Line"
+msgstr "Trylek &s linkou"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:60
+msgid "Trill Line"
+msgstr "Trylková linka"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:62
+msgid "&Turn"
+msgstr "&Obal"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:64
+msgid "&Accent"
+msgstr "&Přízvuk"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:66
+msgid "&Staccatissimo"
+msgstr "&Staccatissimo"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:68
+msgid "&Marcato"
+msgstr "&Marcato"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:70
+msgid "&Pause"
+msgstr "&Korunka"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:72
+msgid "&Up-Bow"
+msgstr "Smyk &nahoru"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:74
+msgid "&Down-Bow"
+msgstr "Smyk &dolů"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:76
+msgid "Mo&rdent"
+msgstr "Mo&rdent"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:78
+msgid "Inverted Mordent"
+msgstr "Invertovaný mordent"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:80
+msgid "Long Mordent"
+msgstr "Dlouhý mordent"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:82
+msgid "Lon&g Inverted Mordent"
+msgstr "Dlou&hý invertovaný mordent"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:84
+msgid "&%1%2"
+msgstr "&%1%2"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:89
+#, c-format
+msgid "Add %1"
+msgstr "Přidat %1"
+
+#: ../src/commands/notation/ResetDisplacementsCommand.h:49
+msgid "Restore Positions"
+msgstr "Obnovit pozice"
+
+#: ../src/commands/notation/IncrementDisplacementsCommand.h:52
+msgid "Fine Reposition"
+msgstr "Jemná úprava pozice"
+
+#: ../src/commands/notation/RestoreTiesCommand.h:49
+msgid "&Restore Tie Positions"
+msgstr "&Obnovit pozice ligatury"
+
+#: ../src/commands/notation/ChangeTiePositionCommand.h:47
+msgid "Tie &Above"
+msgstr "Ligatura &nad"
+
+#: ../src/commands/notation/ChangeTiePositionCommand.h:47
+msgid "Tie &Below"
+msgstr "Ligatura &pod"
+
+#: ../src/commands/notation/KeyInsertionCommand.h:65
+msgid "Change to &Key %1..."
+msgstr "Změnit na &tóninu %1..."
+
+#: ../src/commands/notation/RemoveFingeringMarksCommand.h:49
+msgid "&Remove Fingerings"
+msgstr "&Odstranit prstoklady"
+
+#: ../src/commands/notation/BreakCommand.h:49
+msgid "&Unbeam"
+msgstr "&Zrušit trámce"
+
+#: ../src/commands/notation/UnGraceCommand.h:48
+msgid "Ung&race"
+msgstr "&Zrušit uhlazený vzhled"
+
+#: ../src/commands/notation/AddFingeringMarkCommand.cpp:45
+msgid "Add Other &Fingering..."
+msgstr "Přidat další &prstoklad..."
+
+#: ../src/commands/notation/AddFingeringMarkCommand.cpp:47
+msgid "Add Fingering &0 (Thumb)"
+msgstr "Přidat prstoklad &0 (palec)"
+
+#: ../src/commands/notation/AddFingeringMarkCommand.cpp:49
+#, c-format
+msgid "Add Fingering &%1"
+msgstr "Přidat prstoklad &%1"
+
+#: ../src/document/io/HydrogenXMLHandler.cpp:277
+msgid " imported from Hydrogen "
+msgstr " importováno z Hydrogen "
+
+#: ../src/document/io/LilyPondExporter.cpp:404
+msgid ""
+"LilyPond does not allow spaces or backslashes in filenames.\n"
+"\n"
+"Would you like to use\n"
+"\n"
+" %1\n"
+"\n"
+" instead?"
+msgstr ""
+"Aplikace LilyPond nedovoluje používat v názvech souborů mezery nebo zpětná "
+"lomítka.\n"
+"\n"
+"Chcete použít\n"
+"\n"
+" %1\n"
+"\n"
+" namísto těchto znaků?"
+
+#: ../src/document/io/LilyPondExporter.cpp:2054
+msgid "warning: overlong bar truncated here"
+msgstr "varování: příliš dlouhý takt byl zde zkrácen"
+
+#: ../src/document/io/LilyPondExporter.cpp:2060
+msgid "warning: bar too short, padding with rests"
+msgstr "varování: takt je příliš krátký, bude doplněn pomlkami"
+
+#: ../src/document/MultiViewCommandHistory.cpp:318
+msgid "Nothing to undo"
+msgstr "Neexistuje nic, co by se dalo vrátit zpět"
+
+#: ../src/document/MultiViewCommandHistory.cpp:320
+msgid "Nothing to redo"
+msgstr "Neexistuje nic, u čeho by šlo zrušit vrácení zpět"
+
+#: ../src/document/MultiViewCommandHistory.cpp:328
+#: ../src/document/MultiViewCommandHistory.cpp:372
+#, c-format
+msgid "Und&o %1"
+msgstr "&Vrátit akci zpět - %1"
+
+#: ../src/document/MultiViewCommandHistory.cpp:330
+#: ../src/document/MultiViewCommandHistory.cpp:374
+#, c-format
+msgid "Re&do %1"
+msgstr "&Zrušit vrácení akce zpět - %1"
+
+#: ../src/document/RosegardenGUIDoc.cpp:328
+msgid ""
+"The current file has been modified.\n"
+"Do you want to save it?"
+msgstr ""
+"Aktuální soubor byl změněn.\n"
+"Chcete jej uložit?"
+
+#: ../src/document/RosegardenGUIDoc.cpp:480
+#, c-format
+msgid ""
+"_n: Delete the 1 audio file recorded during the unsaved session?\n"
+"Delete the %n audio files recorded during the unsaved session?"
+msgstr ""
+"_n: Chcete odstranit 1 zvukový soubor nahraný během neuložené relace?\n"
+"Chcete odstranit %n zvukové(ých) soubory(ů) nahrané(ých) během neuložené "
+"relace?"
+
+#: ../src/document/RosegardenGUIDoc.cpp:501
+msgid ""
+"The following audio files were recorded during this session but have been "
+"unloaded\n"
+"from the audio file manager, and so are no longer in use in the document you "
+"are saving.\n"
+"\n"
+"You may want to clean up these files to save disk space.\n"
+"\n"
+"Please select any you wish to delete permanently from the hard disk.\n"
+msgstr ""
+"Následující zvukové soubory byly zaznamenány během této relace, ale byly\n"
+"vyřazeny ze správce zvukových souborů, takže již nejsou využívány "
+"dokumentem,\n"
+"který ukládáte.\n"
+"\n"
+"Možná budete chtít pro úsporu místa na disku tyto soubory smazat.\n"
+"\n"
+"Vyberte kterékoli z těch, které chcete z pevného disku trvale odstranit.\n"
+
+#: ../src/document/RosegardenGUIDoc.cpp:517
+#, c-format
+msgid ""
+"_n: <qt>About to delete 1 audio file permanently from the hard disk."
+"<br>There will be no way to recover this file.<br>Are you sure?</qt>\n"
+"\n"
+"<qt>About to delete %n audio files permanently from the hard disk.<br>There "
+"will be no way to recover these files.<br>Are you sure?</qt>"
+msgstr ""
+"_n: <qt>Chystáte se z pevného disku trvale odstranit 1 zvukový soubor. "
+"<br>Neexistuje způsob, jak tento soubor později obnovit.<br>Skutečně chcete "
+"pokračovat?</qt>\n"
+"\n"
+"<qt>Chystáte se z pevného disku trvale odstranit %n zvukové(ých) soubory(ů)."
+"<br>Neexistuje způsob, jak tyto soubory později obnovit.<br>Skutečně chcete "
+"pokračovat?</qt>"
+
+#: ../src/document/RosegardenGUIDoc.cpp:580
+msgid "Can't open file '%1'"
+msgstr "Nelze otevřít soubor '%1'"
+
+#: ../src/document/RosegardenGUIDoc.cpp:585
+msgid "Reading file..."
+msgstr "Probíhá čtení souboru..."
+
+#: ../src/document/RosegardenGUIDoc.cpp:603
+msgid "Could not open Rosegarden file"
+msgstr "Nebylo možné otevřít soubor aplikace Rosegarden"
+
+#: ../src/document/RosegardenGUIDoc.cpp:641
+msgid "Error when parsing file '%1': \"%2\""
+msgstr "Chyba při syntaktické analýze souboru '%1': \"%2\""
+
+#: ../src/document/RosegardenGUIDoc.cpp:689
+msgid "Generating audio previews..."
+msgstr "Probíhá vytváření zvukových ukázek..."
+
+#: ../src/document/RosegardenGUIDoc.cpp:721
+msgid "Merge"
+msgstr "Připojit"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1605
+msgid "File load cancelled"
+msgstr "Načítání souboru bylo zrušeno"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1625
+msgid ""
+"<h3>Audio and plugins not available</h3><p>This composition uses audio files "
+"or plugins, but Rosegarden is currently running without audio because the "
+"JACK audio server was not available on startup.</p><p>Please exit "
+"Rosegarden, start the JACK audio server and re-start Rosegarden if you wish "
+"to load this complete composition.</p><p><b>WARNING:</b> If you re-save this "
+"composition, all audio and plugin data and settings in it will be lost.</p>"
+msgstr ""
+"<h3>Zvuk a zásuvné moduly nejsou k dispozici</h3><p>Tato skladba používá "
+"zvukové soubory nebo zásuvné moduly, avšak aplikace Rosegarden je teď "
+"spuštěna bez podpory zvuku, protože při spuštění nebyl dostupný server JACK."
+"</p><p>Ukončete aplikaci Rosegarden, spusťte zvukový server JACK a "
+"restartujte Rosegarden, přejete-li si načíst tuto kompletní skladbu. </"
+"p><p><b>VAROVÁNÍ:</b> Pokud tuto skladbu znovu uložíte, bude ztracen veškerý "
+"zvukový obsah i data zásuvných modulů s nastaveními.</p>"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1628
+msgid ""
+"<h3>Audio and plugins not available</h3><p>This composition uses audio files "
+"or plugins, but you are running a version of Rosegarden that was compiled "
+"without audio support.</p><p><b>WARNING:</b> If you re-save this composition "
+"from this version of Rosegarden, all audio and plugin data and settings in "
+"it will be lost.</p>"
+msgstr ""
+"<h3>Zvuk a zásuvné moduly nejsou k dispozici</h3><p>Tato skladba používá "
+"zvukové soubory nebo zásuvné moduly, avšak vy používáte aplikaci Rosegarden, "
+"která byla zkompilovaná bez podpory zvuku.</p><p><b>VAROVÁNÍ:</b> Pokud tuto "
+"skladbu znovu uložíte, bude ztracen veškerý zvukový obsah i data zásuvných "
+"modulů s nastaveními.</p>"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1665
+msgid ""
+"<h3>Incorrect audio sample rate</h3><p>This composition contains audio files "
+"that were recorded or imported with the audio server running at a different "
+"sample rate (%1 Hz) from the current JACK server sample rate (%2 Hz).</"
+"p><p>Rosegarden will play this composition at the correct speed, but any "
+"audio files in it will probably sound awful.</p><p>Please consider re-"
+"starting the JACK server at the correct rate (%3 Hz) and re-loading this "
+"composition before you do any more work with it.</p>"
+msgstr ""
+"<h3>Nesprávná vzorkovací frekvence zvuku</h3><p>Tato skladba obsahuje "
+"zvukové soubory, které byly nahrány nebo importovány pomocí zvukového "
+"serveru nastaveného na jinou vzorkovací frekvenci (%1 Hz) - odlišnou od "
+"aktuální vzorkovací frekvence serveru JACK (%2 Hz).</p><p>Aplikace "
+"Rosegarden přehraje tuto skladbu správnou rychlostí, ale jakékoli zvukové "
+"soubory v ní budou pravděpodobně znít velmi nehezky.</p><p> Zvažte, zda "
+"nespustit server JACK se správnou frekvencí (%3 Hz) a nenačíst tuto skladbu "
+"před jakoukoli další prací s ní znovu.</p>"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1675
+msgid ""
+"<h3>Inconsistent audio sample rates</h3><p>This composition contains audio "
+"files at more than one sample rate.</p><p>Rosegarden will play them at the "
+"correct speed, but any audio files that were recorded or imported at rates "
+"different from the current JACK server sample rate (%1 Hz) will probably "
+"sound awful.</p><p>Please see the audio file manager dialog for more "
+"details, and consider resampling any files that are at the wrong rate.</p>"
+msgstr ""
+"<h3>Nekonzistentní vzorkovací frekvence zvuku</h3><p>Tato skladba obsahuje "
+"zvukové soubory, které mají více vzorkovacích frekvencí.</p><p>Aplikace "
+"Rosegarden je přehraje správnou rychlostí, ale jakékoli zvukové soubory "
+"nahrané nebo importované s odlišnými frekvencemi, než je aktuální vzorkovací "
+"frekvence serveru JACK (%1 Hz), budou pravděpodobně znít velmi nehezky.</"
+"p><p>Více informací naleznete v dialogu správce zvukových souborů. Zvažte "
+"také možnost převzorkování všech souborů, které mají nyní chybnou frekvenci."
+"</p>"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1676
+msgid "Inconsistent sample rates"
+msgstr "Nekonzistentní vzorkovací frekvence"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1690
+msgid ""
+"<h3>Plugins not found</h3><p>The following audio plugins could not be loaded:"
+"</p><ul>"
+msgstr ""
+"<h3>Zásuvné moduly nenalezeny</h3><p>Následující zásuvné moduly nebylo možné "
+"načíst: </p><ul>"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1698
+msgid "<li>%1 (from %2)</li>"
+msgstr "<li>%1 (od %2)</li>"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1712
+msgid ""
+"This file contains one or more old element types that are now deprecated.\n"
+"Support for these elements may disappear in future versions of Rosegarden.\n"
+"We recommend you re-save this file from this version of Rosegarden to ensure "
+"that it can still be re-loaded in future versions."
+msgstr ""
+"Tento soubor obsahuje jeden nebo několik starých typů prvků, které jsou nyní "
+"potlačeny.\n"
+"Podpora těchto prvků nemusí být v budoucích verzích aplikace Rosegarden "
+"dostupná.\n"
+"Doporučujeme, abyste znovu uložili tento soubor v této verzi aplikace "
+"Rosegarden a zajistili si tak možnost načíst jej v budoucích verzích."
+
+#: ../src/document/RosegardenGUIDoc.cpp:2207
+msgid "Insert Recorded MIDI"
+msgstr "Vložit zaznamenané MIDI"
+
+#: ../src/document/RosegardenGUIDoc.cpp:2560
+msgid "%1 (recorded)"
+msgstr "%1 (zaznamenáno)"
+
+#: ../src/document/RoseXmlHandler.cpp:442
+msgid ""
+"This file was written by Rosegarden %1, and it uses\n"
+"a different file format that cannot be read by this version."
+msgstr ""
+"Tento soubor byl napsán aplikací Rosegarden %1 a používá\n"
+"jiný formát souboru, který nelze přečíst v této verzi."
+
+#: ../src/document/RoseXmlHandler.cpp:452
+msgid ""
+"This file was written by Rosegarden %1, which is more recent than this "
+"version.\n"
+"There may be some incompatibilities with the file format."
+msgstr ""
+"Tento soubor byl napsán v aplikaci Rosegarden %1, která je novější než tato "
+"verze.\n"
+"Formáty souborů mohou být z tohoto důvodu nekompatibilní."
+
+#: ../src/document/RoseXmlHandler.cpp:1687
+msgid "Loading plugins..."
+msgstr "Probíhá načítání zásuvných modulů..."
+
+#: rc.cpp:6 rc.cpp:144
+#, no-c-format
+msgid "Se&gment"
+msgstr "Se&gment"
+
+#: rc.cpp:9 rc.cpp:84 rc.cpp:147 rc.cpp:303
+#, no-c-format
+msgid "Edit &With"
+msgstr "Upravit &pomocí"
+
+#: rc.cpp:12 rc.cpp:21 rc.cpp:30 rc.cpp:39 rc.cpp:345
+#, no-c-format
+msgid "Actions Toolbar"
+msgstr "Nástrojová lišta pro akce"
+
+#: rc.cpp:15 rc.cpp:33 rc.cpp:129 rc.cpp:285
+#, no-c-format
+msgid "Time Toolbar"
+msgstr "Nástrojová lišta pro čas"
+
+#: rc.cpp:18 rc.cpp:36 rc.cpp:57 rc.cpp:63 rc.cpp:120 rc.cpp:243 rc.cpp:342
+#, no-c-format
+msgid "Transport Toolbar"
+msgstr "Nástrojová lišta pro transport"
+
+#: rc.cpp:24 rc.cpp:42 rc.cpp:123 rc.cpp:348
+#, no-c-format
+msgid "Zoom Toolbar"
+msgstr "Nástrojová lišta pro zoom"
+
+#: rc.cpp:45 rc.cpp:60 rc.cpp:99 rc.cpp:228 rc.cpp:327
+#, no-c-format
+msgid "T&ransport"
+msgstr "T&ransport"
+
+#: rc.cpp:51
+#, no-c-format
+msgid "Number of Stereo &Inputs"
+msgstr "Počet stereo v&stupů"
+
+#: rc.cpp:54
+#, no-c-format
+msgid "&Number of Submasters"
+msgstr "&Počet řízených sekvencerů"
+
+#: rc.cpp:66
+#, no-c-format
+msgid "&Import"
+msgstr "&Importovat"
+
+#: rc.cpp:69
+#, no-c-format
+msgid "&Merge"
+msgstr "&Připojit"
+
+#: rc.cpp:72
+#, no-c-format
+msgid "&Export"
+msgstr "&Exportovat"
+
+#: rc.cpp:75 rc.cpp:141 rc.cpp:297
+#, no-c-format
+msgid "&Composition"
+msgstr "&Skladba"
+
+#: rc.cpp:78
+#, no-c-format
+msgid "&Studio"
+msgstr "&Studio"
+
+#: rc.cpp:81
+#, no-c-format
+msgid "Se&gments"
+msgstr "Se&gmenty"
+
+#: rc.cpp:90
+#, no-c-format
+msgid "Trac&ks"
+msgstr "S&topy"
+
+#: rc.cpp:93
+#, no-c-format
+msgid "Set &Instrument"
+msgstr "Nastavit &nástroj"
+
+#: rc.cpp:102 rc.cpp:234 rc.cpp:333
+#, no-c-format
+msgid "&Toolbars"
+msgstr "&Nástrojové lišty"
+
+#: rc.cpp:105 rc.cpp:237 rc.cpp:336
+#, no-c-format
+msgid "&Rulers"
+msgstr "&Pravítka"
+
+#: rc.cpp:111 rc.cpp:240 rc.cpp:339
+#, no-c-format
+msgid "Tools Toolbar"
+msgstr "Nástrojová lišta ovládacích nástrojů"
+
+#: rc.cpp:114
+#, no-c-format
+msgid "Tracks Toolbar"
+msgstr "Nástrojová lišta pro stopy"
+
+#: rc.cpp:117
+#, no-c-format
+msgid "Editors Toolbar"
+msgstr "Nástrojová lišta pro editory"
+
+#: rc.cpp:135
+#, no-c-format
+msgid "&Layout Mode"
+msgstr "Režim &uspořádání"
+
+#: rc.cpp:138 rc.cpp:294
+#, no-c-format
+msgid "Add Event Ruler"
+msgstr "Přidat pravítko událostí"
+
+#: rc.cpp:150
+#, no-c-format
+msgid "N&ote"
+msgstr "N&ota"
+
+#: rc.cpp:153
+#, no-c-format
+msgid "Mar&ks"
+msgstr "Znač&ky"
+
+#: rc.cpp:156
+#, no-c-format
+msgid "&Ornaments"
+msgstr "Melodické &ozdoby"
+
+#: rc.cpp:159
+#, no-c-format
+msgid "&Fingerings"
+msgstr "P&rstoklady"
+
+#: rc.cpp:162
+#, no-c-format
+msgid "S&lashes"
+msgstr "Tremo&la"
+
+#: rc.cpp:165 rc.cpp:219
+#, no-c-format
+msgid "&Accidentals"
+msgstr "Po&suvky"
+
+#: rc.cpp:168
+#, no-c-format
+msgid "&Phrase"
+msgstr "&Fráze"
+
+#: rc.cpp:171
+#, no-c-format
+msgid "Slur &Position"
+msgstr "&Pozice legata"
+
+#: rc.cpp:174
+#, no-c-format
+msgid "Tie &Position"
+msgstr "&Pozice ligatury"
+
+#: rc.cpp:177
+#, no-c-format
+msgid "&Octaves"
+msgstr "&Oktávy"
+
+#: rc.cpp:180 rc.cpp:306
+#, no-c-format
+msgid "Ad&just"
+msgstr "&Přizpůsobit"
+
+#: rc.cpp:183
+#, no-c-format
+msgid "R&ests"
+msgstr "P&omlky"
+
+#: rc.cpp:186 rc.cpp:213
+#, no-c-format
+msgid "&Notes"
+msgstr "&Noty"
+
+#: rc.cpp:189 rc.cpp:309
+#, no-c-format
+msgid "&Quantize"
+msgstr "&Kvantizovat"
+
+#: rc.cpp:195 rc.cpp:315
+#, no-c-format
+msgid "Trans&pose"
+msgstr "&Transponovat"
+
+#: rc.cpp:198 rc.cpp:318
+#, no-c-format
+msgid "Convert"
+msgstr "Konvertovat"
+
+#: rc.cpp:201
+#, no-c-format
+msgid "&Fine Positioning"
+msgstr "&Jemné doladění pozice"
+
+#: rc.cpp:204
+#, no-c-format
+msgid "Fine Ti&ming"
+msgstr "Je&mné časování"
+
+#: rc.cpp:207
+#, no-c-format
+msgid "&Visibility"
+msgstr "&Viditelnost"
+
+#: rc.cpp:216
+#, no-c-format
+msgid "&Rests"
+msgstr "P&omlky"
+
+#: rc.cpp:222
+#, no-c-format
+msgid "&Clefs"
+msgstr "Notové &klíče"
+
+#: rc.cpp:225 rc.cpp:324
+#, no-c-format
+msgid "Local &Cursor"
+msgstr "Lokální &kurzor"
+
+#: rc.cpp:246
+#, no-c-format
+msgid "Notes Toolbar"
+msgstr "Nástrojová lišta pro noty"
+
+#: rc.cpp:249
+#, no-c-format
+msgid "Rests Toolbar"
+msgstr "Nástrojová lišta pro pomlky"
+
+#: rc.cpp:252
+#, no-c-format
+msgid "Clefs Toolbar"
+msgstr "Nástrojová lišta pro notové klíče"
+
+#: rc.cpp:255
+#, no-c-format
+msgid "Accidentals Toolbar"
+msgstr "Nástrojová lišta pro posuvky"
+
+#: rc.cpp:258
+#, no-c-format
+msgid "Group Toolbar"
+msgstr "Nástrojová lišta pro skupinu"
+
+#: rc.cpp:261
+#, no-c-format
+msgid "Marks Toolbar"
+msgstr "Nástrojová lišta pro značky"
+
+#: rc.cpp:264
+#, no-c-format
+msgid "Meta Toolbar"
+msgstr "Nástrojová lišta meta"
+
+#: rc.cpp:267
+#, no-c-format
+msgid "Layout Toolbar"
+msgstr "Nástrojová lišta pro uspořádání"
+
+#: rc.cpp:270 rc.cpp:351
+#, no-c-format
+msgid "Control Ruler actions"
+msgstr "Akce ovládacího pravítka"
+
+#: rc.cpp:273 rc.cpp:354
+#, no-c-format
+msgid "Property Ruler actions"
+msgstr "Akce pravítka vlastností"
+
+#: rc.cpp:276
+#, no-c-format
+msgid "&Action"
+msgstr "&Akce"
+
+#: rc.cpp:279
+#, no-c-format
+msgid "General Toolbar"
+msgstr "Obecná nástrojová lišta"
+
+#: rc.cpp:291
+#, no-c-format
+msgid "&Grid"
+msgstr "&Rastr"
+
+#: rc.cpp:300
+#, no-c-format
+msgid "&Segment"
+msgstr "&Segment"
+
+#: rc.cpp:361
+#, no-c-format
+msgid "Hide additional controls"
+msgstr "Skrýt dodatečné ovládací prvky"
+
+#: rc.cpp:365
+#, no-c-format
+msgid "Panic Button"
+msgstr "Tlačítko nouzového zastavení v případě zaseknutí nástroje"
+
+#: rc.cpp:368
+#, no-c-format
+msgid "Resets all MIDI devices if you've got stuck notes"
+msgstr "Resetuje všechna zařízení MIDI, pokud došlo k zaseknutí not"
+
+#: rc.cpp:375
+#, no-c-format
+msgid "Provides a metronome click for you to play along with"
+msgstr "Poskytuje tikot metronomu pro hraní s metronomem"
+
+#: rc.cpp:378
+#, no-c-format
+msgid "Shows MIDI activity in and out of Rosegarden"
+msgstr "Zobrazuje vstupní a výstupní aktivity MIDI pro aplikaci Rosegarden"
+
+#: rc.cpp:381
+#, no-c-format
+msgid "IN"
+msgstr "VSTUP"
+
+#: rc.cpp:384
+#, no-c-format
+msgid "OUT"
+msgstr "VÝSTUP"
+
+#: rc.cpp:387 rc.cpp:390
+#, no-c-format
+msgid "NO EVENTS"
+msgstr "ŽÁDNÉ UDÁLOSTI"
+
+#: rc.cpp:397
+#, no-c-format
+msgid "Record either MIDI or audio"
+msgstr "Záznam MIDI nebo zvuku"
+
+#: rc.cpp:401
+#, no-c-format
+msgid "Loop"
+msgstr "Opakování"
+
+#: rc.cpp:404
+#, no-c-format
+msgid "Turn on and off the loop markers (if set)"
+msgstr "Zapínání a vypínání záložek opakování (jsou-li nastaveny)"
+
+#: rc.cpp:411
+#, no-c-format
+msgid "Mutes all but the currently selected track"
+msgstr "Ztlumení všech stop kromě aktuálně vybrané"
+
+#: rc.cpp:415
+#, no-c-format
+msgid "Start loop or range here"
+msgstr "Zde začít opakování nebo rozsah"
+
+#: rc.cpp:419
+#, no-c-format
+msgid "End loop or range here"
+msgstr "Zde ukončit opakování nebo rozsah"
+
+#: rc.cpp:422
+#, no-c-format
+msgid "SIG"
+msgstr "SIG"
+
+#: rc.cpp:425
+#, no-c-format
+msgid "DIV"
+msgstr "DIV"
+
+#: rc.cpp:428
+#, no-c-format
+msgid "/16"
+msgstr "/16"
+
+#: rc.cpp:431
+#, no-c-format
+msgid "TEMPO"
+msgstr "TEMPO"
+
+#: rc.cpp:434
+#, no-c-format
+msgid "END"
+msgstr "KONEC"
+
+#: rc.cpp:437
+#, no-c-format
+msgid "BAR"
+msgstr "TAKTOVÁ ČÁRA"
+
+#: rc.cpp:441
+#, no-c-format
+msgid "Switch between real time, musical time, and frame count"
+msgstr "Přepínání mezi skutečným časem, hudebním časem a počtem rámců"
+
+#: rc.cpp:445
+#, no-c-format
+msgid "Show additional controls"
+msgstr "Zobrazit dodatečné ovládací prvky"
+
+#: rc.cpp:449
+#, no-c-format
+msgid "Rewind"
+msgstr "Ukazatel přehrávání o takt zpět"
+
+#: rc.cpp:452
+#, no-c-format
+msgid "Moves the current pointer position back one bar."
+msgstr "Posune pozici aktuálního ukazatele o jednu taktovou čáru zpět."
+
+#: rc.cpp:456
+#, no-c-format
+msgid "Rewind to beginning"
+msgstr "Ukazatel přehrávání na začátek"
+
+#: rc.cpp:459
+#, no-c-format
+msgid ""
+"Moves the pointer position to the start of the composition. (This may mean "
+"going forwards if the pointer is currently before the start.)"
+msgstr ""
+"Posune pozici ukazatele na začátek skladby. (To může znamenat i posun "
+"směrem vpřed, pokud se ukazatel nachází před začátkem skladby.)"
+
+#: rc.cpp:463
+#, no-c-format
+msgid "Play/Pause"
+msgstr "Přehrát/pauza"
+
+#: rc.cpp:466
+#, no-c-format
+msgid ""
+"Plays from the current pointer position, or pauses playback if already in "
+"progress."
+msgstr ""
+"Přehrává od současné pozice ukazatele nebo pozastaví přehrávání, pokud již "
+"probíhá."
+
+#: rc.cpp:473
+#, no-c-format
+msgid "Stops playback or recording."
+msgstr "Zastaví přehrávání nebo záznam."
+
+#: rc.cpp:477
+#, no-c-format
+msgid "Fast forward"
+msgstr "Ukazatel přehrávání o takt dopředu"
+
+#: rc.cpp:480
+#, no-c-format
+msgid "Moves the current pointer position forwards one bar."
+msgstr "Posune pozici aktuálního ukazatele o jednu taktovou čáru dopředu."
+
+#: rc.cpp:484
+#, no-c-format
+msgid "Fast forward to end"
+msgstr "Ukazatel přehrávání na konec"
+
+#: rc.cpp:487
+#, no-c-format
+msgid ""
+"Moves the pointer position to the end of the composition. (This may mean "
+"going backwards if the pointer is already beyond the end.)"
+msgstr ""
+"Posune pozici ukazatele na konec skladby. (To může znamenat i posun směrem "
+"vzad, pokud se ukazatel nachází za koncem skladby.)"
+
+#: rc.cpp:491
+#, no-c-format
+msgid "Display time to end"
+msgstr "Zobrazit čas zbývající do konce"
+
+#: ../docs/en/tips.cpp:3
+msgid ""
+"<p>To configure a track to play using a particular instrument:</p>\n"
+"&nbsp;&nbsp;* click on the track label and hold a moment<br>\n"
+"&nbsp;&nbsp;* select an output device<br>\n"
+"&nbsp;&nbsp;* select one of that device's available instruments (#1 - #16)"
+"<br>\n"
+"&nbsp;&nbsp;* adjust that instrument's output channel, program, bank, and\n"
+"controllers via the instrument parameters box\n"
+msgstr ""
+"<p>Chcete-li konfigurovat stopu tak, aby byla přehrávána pomocí určitého "
+"nástroje:</p>\n"
+"&nbsp;&nbsp;* klepněte na popisek stopy a chvíli podržte stisknuté tlačítko "
+"myši<br>\n"
+"&nbsp;&nbsp;* vyberte výstupní zařízení<br>\n"
+"&nbsp;&nbsp;* vyberte jeden z nástrojů dostupných pro toto zařízení (#1 - "
+"#16)<br>\n"
+"&nbsp;&nbsp;* upravte výstupní kanál tohoto nástroje, program, banku a\n"
+"ovládací prvky pomocí okna s parametry nástroje\n"
+
+#: ../docs/en/tips.cpp:13
+msgid ""
+"<p>...that Rosegarden has an autosave feature?<br><br>\n"
+"You can select your autosave interval from <b>Settings->Configure\n"
+"Rosegarden</b>.<br><br>\n"
+"When something goes awry, such as a power outage or a Rosegarden crash\n"
+"(unfortunately, it happens...) simply load the file you were working on, and "
+"you'll be given the\n"
+"option to load the autosaved version, or the unmodified original.</p>\n"
+msgstr ""
+"<p>...že aplikace Rosegarden obsahuje funkci automatického ukládání?"
+"<br><br>\n"
+"Časový interval automatického ukládání lze vybrat z nabídky <b>Nastavení-"
+">Konfigurace aplikace\n"
+"Rosegarden</b>.<br><br>\n"
+"Pokud by se přihodilo něco nemilého jako např. výpadek napájení nebo "
+"zaseknutí aplikace Rosegarden\n"
+"(naneštěstí i takové věci se mohou stát...), jednoduše načtěte soubor, se "
+"kterým jste pracovali, a budou vám nabídnuty možnosti\n"
+"otevřít automaticky uloženou verzi nebo otevřít nezměněný originál.</p>\n"
+
+#: ../docs/en/tips.cpp:23
+msgid ""
+"<p>\n"
+"...that you can save the current document as your default studio by using\n"
+"<b>Composition -> Studio -> Save Current Document as Default Studio</b>?</"
+"p>\n"
+msgstr ""
+"<p>\n"
+"...že můžete uložit aktuální dokument jako výchozí studio pomocí nabídky\n"
+"<b>Skladba -> Studio -> Uložit aktuální dokument jako výchozí studio</b>.</"
+"p>\n"
+
+#: ../docs/en/tips.cpp:30
+msgid ""
+"<p>...that your default studio is a complete Rosegarden composition that "
+"gets\n"
+"loaded every time you create a new document or import a MIDI file?</p>\n"
+msgstr ""
+"<p>...že výchozí studio je kompletní skladbou aplikace Rosegarden, která se\n"
+"načítá pokaždé při vytváření nového dokumentu nebo při importu souboru MIDI?"
+"</p>\n"
+
+#: ../docs/en/tips.cpp:36
+msgid ""
+"<p>...that your default studio can contain instrument assignments, document "
+"properties, LilyPond headers,\n"
+"and many other things?<br><br>The default studio is a complete Rosegarden "
+"composition, so it can contain anything that you may wish to have available "
+"in each\n"
+"new document you create.</p>\n"
+msgstr ""
+"<p>...že vaše výchozí studio může obsahovat přiřazení nástrojů, vlastnosti "
+"dokumentu, hlavičky Lilypond\n"
+"a mnoho dalších věcí?<br><br>Výchozí studio je kompletní skladbou aplikace "
+"Rosegraden, takže může obsahovat vše, co byste si mohli přát mít dostupné\n"
+"při vytváření každého nového dokumentu.</p>\n"
+
+#: ../docs/en/tips.cpp:43
+msgid ""
+"<p>...that Rosegarden will detect and create a default connection for ALSA "
+"soft\n"
+"synth applications that are started after Rosegarden is already running?</"
+"p>\n"
+msgstr ""
+"<p>...že aplikace Rosegarden detekuje a vytváří výchozí připojení pro "
+"softwarové\n"
+"syntetizéry ALSA, které se spouští potom, co je již spuštěna aplikace "
+"Rosegarden?</p>\n"
+
+#: ../docs/en/tips.cpp:49
+msgid ""
+"<p>...that you can make your default studio override that in every "
+"Rosegarden composition you load?<br><br>If your studio setup does not change "
+"very often, and you would prefer for\n"
+"the settings in your default studio to take precedence over whatever\n"
+"studio is saved with any files you happen to load, you can make your studio "
+"the default for everything using <b>Settings -> Configure Rosegarden ->\n"
+"MIDI -> Always use default studio when loading files</b>.</p>\n"
+msgstr ""
+"<p>...že můžete přinutit vaše výchozí studio k tomu, aby nahradilo jakékoli "
+"jiné, obsažené u každé skladby Rosegarden, kterou načítáte?<br><br>Pokud se "
+"vaše nastavení studia nemění příliš často a pokud byste raději,\n"
+"aby mělo vaše výchozí studio přednost před jakýmkoli jiným studiem\n"
+"uloženým s jakýmkoli souborem, který otevíráte, můžete nastavit vybrané "
+"studio tak, aby bylo vaším výchozím nastavením pro všechno. Použijte "
+"<b>Nastavení ->\n"
+"Konfigurace aplikace Rosegarden - MIDI -> Při načítání souborů vždy používat "
+"výchozí studio</b>.</p>\n"
+
+#: ../docs/en/tips.cpp:57
+msgid ""
+"<p>If you have accidentally recorded a segment so short that it does not\n"
+"appear on the canvas, which you can only hear during subsequent recording\n"
+"sessions, you can gain access to it by using <b>Composition -> Change\n"
+"Composition Start and End</b> and then setting the composition to start at a "
+"negative number.</p>\n"
+msgstr ""
+"<p>Pokud jste náhodou zaznamenali tak krátký segment, že se neobjevuje\n"
+"na zobrazovací ploše, což uslyšíte pouze během následujících nahrávacích\n"
+"relací, můžete si tento segment zpřístupnit pomocí <b>Skladba -> Změnit\n"
+"začátek a konec skladby</b> a následného nastavení skladby tak, aby začínala "
+"záporným číslem.</p>\n"
+
+#: ../docs/en/tips.cpp:65
+msgid ""
+"<p>...that if you place a note at the wrong pitch using the notation or "
+"matrix editor, you can move it one semitone at a time with the up and down "
+"arrow keys on your keyboard?</p>\n"
+msgstr ""
+"<p>...že pokud umístíte notu s chybnou výškou tónu v notovém nebo maticovém "
+"editoru, můžete ji přesunout o půl tónu výš nebo níž pomocí kurzorových "
+"šipek na klávesnici?</p>\n"
+
+#: ../docs/en/tips.cpp:70
+msgid ""
+"<p>...that you can toggle stem directions in the notation editor by "
+"selecting\n"
+"one or more notes and using Ctrl-PageUp and Ctrl-PageDown?</p>\n"
+msgstr ""
+"<p>...že můžete přepínat směry nožiček v notovém editoru tak, že vyberete\n"
+"jednu nebo více not a použijete kombinaci kláves Ctrl-PageUp a Ctrl-PageDown?"
+"</p>\n"
+
+#: ../docs/en/tips.cpp:76
+msgid ""
+"<p>...that you can change the accidental used for a note in the notation "
+"editor (without changing the pitch of the note) by selecting\n"
+"it and using the up and down arrow keys with both Ctrl and Shift pressed?</"
+"p>\n"
+msgstr ""
+"<p>...že můžete změnit posuvku použitou pro notu v notovém editoru (beze "
+"změny výšky tónu noty) tak, že ji vyberete\n"
+"a použijete kurzorové šipky nahoru nebo dolů společně se stisknutými "
+"klávesami Ctrl a Shift?</p>\n"
+
+#: ../docs/en/tips.cpp:82 ../docs/en/tips.cpp:93
+msgid ""
+"<p>...that you can hold down the Shift key while repositioning segments on "
+"the\n"
+"segment canvas in order to avoid the \"snap-to\" effect and exert finer "
+"control?</p>\n"
+msgstr ""
+"<p>...že můžete podržet klávesu Shift při změně pozice segmentů na "
+"zobrazovací\n"
+"ploše segmentů, abyste se vyhnuli efektu \"přichytávání\" a mohli provést "
+"jemnější doladění pozice?</p>\n"
+
+#: ../docs/en/tips.cpp:88
+msgid ""
+"<p>...that you can use the arrow tool to draw, move, and resize segments and "
+"events as well as to select them?<br><br>Drag a segment or event block to "
+"move it, drag the right edge of a block to resize it, and drag with the "
+"middle mouse button pressed to draw a new segment or event.<br><br>(Of "
+"course, the dedicated draw, move and resize tools are still quicker for "
+"repeated operations.)</p>\n"
+msgstr ""
+"<p>...že můžete použít nástroj šipky k tažení, přesunování a změnám "
+"velikosti segmentů a událostí, stejně jako k jejich výběru?<br><br>Tažením "
+"bloku segmentu nebo události jej přesunete, tažením pravého okraje bloku "
+"změníte jeho velikost, tažením se stisknutým prostředním tlačítkem myši "
+"nakreslíte nový segment nebo událost.<br><br>(Samozřejmě, že nástroje určené "
+"výhradně na kreslení, přesunování nebo změnu velikosti budou vždy rychlejší "
+"při provádění opakovaných operací.)</p>\n"
+
+#: ../docs/en/tips.cpp:99
+msgid ""
+"<p>...that you can hold down the Shift key while repositioning or resizing "
+"events in the\n"
+"matrix view in order to avoid the \"snap-to\" effect and exert finer control?"
+"</p>\n"
+msgstr ""
+"<p>...že můžete podržet klávesu Shift při změně pozice nebo velikosti "
+"událostí\n"
+"v maticovém pohledu, abyste se vyhnuli efektu \"přichytávání\" a mohli "
+"provést jemnější doladění pozice či velikosti?</p>\n"
+
+#: ../docs/en/tips.cpp:105
+msgid ""
+"<p>...that you can edit multiple segments on multiple tracks simultaneously "
+"in\n"
+"the notation editor? Simply select the segments, then use <b>Edit -> Open "
+"in Notation Editor</b>.</p>\n"
+msgstr ""
+"<p>...že můžete v notovém editoru upravovat naráz několik segmentů z "
+"několika stop?\n"
+"Jednoduše vyberte segmenty a použijte možnost <b>Upravit -> Otevřít v "
+"notovém editoru</b>.</p>\n"
+
+#: ../docs/en/tips.cpp:111
+msgid ""
+"<p>...that Rosegarden can export files for use by LilyPond, the high-quality "
+"score typesetting system?<br><br>\n"
+"From the <b>File</b> menu, navigate to <b>Export -> Export LilyPond File</"
+"b></p>\n"
+msgstr ""
+"<p>...že aplikace Rosegarden může exportovat soubory pro použití v aplikaci "
+"Lilypond, špičkovém systému pro sazby partitur?<br><br>\n"
+"Z nabídky <b>Soubor</b> projděte k možnosti <b>Exportovat -> Exportovat "
+"soubor Lilypond</b></p>\n"
+
+#: ../docs/en/tips.cpp:117
+msgid ""
+"<p>...that Rosegarden can print via LilyPond, the high-quality score "
+"typesetting system?<br><br>\n"
+"From the <b>File</b> menu, navigate to <b>Preview with LilyPond</b>. The "
+"file\n"
+"will be exported, rendered, and a preview will appear in KPDF, or one of\n"
+"several other PDF viewers, where it can then be printed as well.</p>\n"
+msgstr ""
+"<p>...že aplikace Rosegarden může exportovat soubory pro použití v aplikaci "
+"Lilypond, špičkovém systému pro sazby partitur?<br><br>\n"
+"Z nabídky <b>Soubor</b> projděte k možnosti <b>Náhled s aplikací LilyPond</"
+"b>. Soubor\n"
+"bude vyexportován, vykreslen a zobrazen v náhledu v aplikaci KPDF nebo\n"
+"v některém jiném prohlížeči souborů PDF, odkud jej můžete také vytisknout.</"
+"p>\n"
+
+#: ../docs/en/tips.cpp:125
+msgid ""
+"<p>...that if you use the quantizer from within the notation view, you can "
+"tell it to quantize only the timing used for notation -- making it possible "
+"to have good looking notation <b>and</b> a human MIDI performance?</p>\n"
+msgstr ""
+"<p>...že pokud použijete kvantizér z notačního pohledu, můžete mu přikázat, "
+"aby kvantizoval pouze dělení dob použité v notaci -- čímž se dá dosáhnout "
+"hezkého vzhledu notového zápisu <b>a</b> a lidského výkonu MIDI?</p>\n"
+
+#: ../docs/en/tips.cpp:130
+msgid ""
+"<p>...that you can change segment labels using the controls on the Segment "
+"Parameters box\n"
+"in the main window?</p>\n"
+msgstr ""
+"<p>...že lze měnit popisky segmentů pomocí ovládacích prvků v dialogu "
+"Parametry segmentu\n"
+"v hlavním okně?</p>\n"
+
+#: ../docs/en/tips.cpp:136
+msgid ""
+"<p>...that the number of tracks in new documents is based on the contents "
+"of\n"
+"your autoload.rg file?\n"
+"<br><br>\n"
+"Whether you prefer to start with three tracks or 43, create a document that\n"
+"contains the desired number of tracks, plus any other studio or document "
+"properties settings\n"
+"you wish to configure, and use <b>Composition -> Studio -> Save Current "
+"Document as Default\n"
+"Studio</b> to make this your new default.</p>\n"
+msgstr ""
+"<p>...že počet stop v novém dokumentu je určen obsahem \n"
+"souboru autoload.rg?\n"
+"<br><br>\n"
+"Ať si již přejete začínat se třemi stopami nebo 43, vytvořte dokument, "
+"který\n"
+"bude obsahovat požadovaný počet stop a jakékoli další vlastnosti studia nebo "
+"nastavení dokumentu,\n"
+"které chcete konfigurovat, a pomocí možnosti <b>Skladba -> Studio -> Uložit "
+"aktuální dokument jako výchozí\n"
+"studio</b> toto nové nastavení určete jako výchozí.</p>\n"
+
+#: ../docs/en/tips.cpp:147
+msgid ""
+"<p>...that you can change the name of a track by double clicking on the "
+"label? (The\n"
+"label must be visible for this to work.)</p>\n"
+msgstr ""
+"<p>...že můžete změnit název stopy poklepáním na popisek? (Popisek\n"
+"musí být pro tuto operaci viditelný.)</p>\n"
+
+#: ../docs/en/tips.cpp:153
+msgid ""
+"<p>...that you can configure what happens when you double-click on a segment?"
+"<br><br>Go to <b>Settings -> Configure Rosegarden</b> and choose your "
+"preferred editing window under the <b>Behaviour</b> tab.</p>\n"
+msgstr ""
+"<p>...že lze konfigurovat akci, která se provede při poklepání na segment? "
+"<br><br>Přejděte na možnost <b>Nastavení -> Konfigurace aplikace Rosegarden</"
+"b> a vyberte svoje oblíbené editační okno na záložce <b>Chování</b>.</p>\n"
+
+#: ../docs/en/tips.cpp:158
+msgid ""
+"<p>...that Rosegarden is being developed as a community effort with\n"
+"contributions from around the world?<br><br>\n"
+"The four most active developers live in London (England), Cannes, "
+"Barcelona,\n"
+"and... Christiansburg? (Christiansburg is a town of about 50,000 in\n"
+"southwestern Virginia, USA.)<br><br>\n"
+"We have had contributors from elsewhere in the US, UK, Spain, Mexico, "
+"Argentina, Germany,\n"
+"Sweden, Russia, Japan, Finland, and Italy, just to name a few...</p>\n"
+msgstr ""
+"<p>...že aplikace Rosegarden je vyvíjena jako komunitní projekt,\n"
+"do kterého přispívají lidé z celého světa?<br><br>\n"
+"Čtyři nejaktivnější vývojáři žijí v Londýně (Anglie), Cannes, Barceloně,\n"
+"a... Christiansburg? (Christiansburg je město s asi 50 000 obyvateli\n"
+"v jihozápadní Virginii, USA.)<br><br>\n"
+"Měli jsme různé přispěvatele pocházející\n"
+"z USA, UK, Španělska, Mexika, Argentiny, Německa,\n"
+"Švédska, Ruska, Japonska, Finska a Itálie, abychom jmenovali alespoň několik "
+"z nich... </p>\n"
+
+#: ../docs/en/tips.cpp:169
+msgid ""
+"<p>...that Rosegarden is available in Spanish, French, German, Russian, "
+"Welsh, Swedish, Italian and Estonian\n"
+"translations? (Just to name a few.)<br><br>\n"
+"If you're interested in translating Rosegarden to another language, drop us "
+"a\n"
+"line at <b>[email protected]</b>.</p>\n"
+msgstr ""
+"<p>...že aplikace Rosegarden je dostupná ve španělštině, francouzštině, "
+"němčině, ruštině, welštině, švédštině, italštině a estonštině?\n"
+"(Abychom jmenovali alespoň některé jazyky.)<br><br>\n"
+"Máte-li zájem přeložit aplikaci Rosegarden do jiného jazyka, dejte nám vědět "
+"a\n"
+"na adresu <b>[email protected]</b>.</p>\n"
+
+#: ../docs/en/tips.cpp:177
+msgid ""
+"<p>...that you can change the total number of bars in the composition via\n"
+"<b>Composition -> Change Composition Start and End</b>?</p>\n"
+msgstr ""
+"<p>...že lze změnit celkový počet taktových čar ve skladbě přes možnost "
+"<b>Skladba -> Změnit začátek a konec skladby</b>?</p>\n"
+
+#: ../docs/en/tips.cpp:183
+msgid ""
+"<p>...that you can see the difference between performance and display "
+"duration\n"
+"of duration-quantized notes in the notation editor?<br><br>\n"
+"Use <b>Settings -> Show Raw Note Ruler</b> to turn on this handy\n"
+"feature.<br><br>\n"
+"<i>Note that this feature does not work in page layout view.</i></p>\n"
+msgstr ""
+"<p>...že můžete sledovat rozdíly mezi provedením a zobrazenou dobou trvání\n"
+"u not s provedenou kvantizací doby trvání v notovém editoru?<br><br>\n"
+"Pomocí možnosti <b>Nastavení -> Zobrazit pravítko zdrojových not</b> lze "
+"tuto šikovnou funkci\n"
+"zapnout.<br><br>\n"
+"<i>Tato funkce nefunguje v pohledu stránkového uspořádání.</i></p>\n"
+
+#: ../docs/en/tips.cpp:192
+msgid ""
+"<p>...that you can add tempo and time-signature changes by double-clicking "
+"on the values displayed in the transport window or tempo rulers?</p>\n"
+msgstr ""
+"<p>...že můžete přidat změny tempa a taktového označení poklepáním na "
+"hodnoty zobrazené v okně transportu nebo na pravítcích tempa?</p>\n"
+
+#: ../docs/en/tips.cpp:197
+msgid ""
+"<p>...that the transport window can display musical time, sample frame "
+"count, and a visual metronome as well as real time?<br><br>Just click on the "
+"small button at the extreme top left of the window.</p>\n"
+msgstr ""
+"<p>...že okno transportu může zobrazovat hudební čas, počet vzorkovacích "
+"rámců a vizuální metronom, stejně jako skutečný čas?<br><br>Stačí klepnout "
+"na malé tlačítko v okně úplně nahoře vlevo.</p>\n"
+
+#: ../docs/en/tips.cpp:202
+msgid ""
+"<p>...that you can select all notes of a particular pitch in the matrix "
+"view, by shift-clicking on that pitch on the piano keyboard at the left?"
+"<br><br>If you shift-click-drag, you can select whole ranges too.</p>\n"
+msgstr ""
+"<p>...že můžete vybrat všechny noty s určitou výškou tónu v maticovém "
+"pohledu klepnutím a současným podržením klávesy Shift na dané výšce na "
+"klaviatuře vlevo?<br><br>Chcete-li, můžete klepnutím, současným podržením "
+"klávesy Shift a tažením kurzoru vybírat také celé rozsahy.</p>\n"
+
+#: ../docs/en/tips.cpp:207
+msgid ""
+"<p>...that you can set a loop in the main window by clicking-and-dragging on "
+"the time ruler with Shift pressed?<br><br>(If the ruler isn't visible, use "
+"<b>Settings -> Show Rulers</b>.)</p>\n"
+msgstr ""
+"<p>...že můžete nastavit opakování v hlavním okně klepnutím a tažením na "
+"časovém pravítku při současném stisknutí klávesy Shift?<br><br>(Není-li "
+"pravítko viditelné, použijte možnost <b>Nastavení -> Zobrazit pravítka</b>.)"
+"</p>\n"
+
+#: ../docs/en/tips.cpp:212
+msgid ""
+"<p>...that if you're editing a section in the matrix or notation view, you "
+"can\n"
+"set that section to loop while you edit it?<br><br>Select it and use "
+"<b>Tools ->\n"
+"Local Cursor -> Set Loop to Selection</b>, then hit Play.</p><br><br>\n"
+"<i>This feature does not work quite as well for compositions that include "
+"sampled\n"
+"audio.</i>\n"
+msgstr ""
+"<p>...že pokud upravujete sekci v maticovém nebo notovém pohledu, můžete "
+"nastavit,\n"
+"aby se sekce opakovala i v průběhu, kdy provádíte její úpravu?"
+"<br><br>Vyberte ji, použijte možnost <b>Nástroje ->\n"
+"Lokální kurzor -> Nastavit opakování výběru</b> a potom stiskněte Přehrát.</"
+"p><br><br>\n"
+"<i>Tato funkce však nefunguje zcela správně pro skladby, které obsahují "
+"vzorkované\n"
+"audio.<i>\n"
+
+#: ../docs/en/tips.cpp:221
+msgid ""
+"<p>...if you have more than one note or controller event at the same time, "
+"you\n"
+"can use the [ and ] keys to flip the stack of events around on the "
+"controller\n"
+"and velocity rulers in order to bring the item you wish to adjust into\n"
+"focus.</p>\n"
+msgstr ""
+"<p>...že pokud máte více než jednu notovou událost nebo událost ovládacího "
+"prvku současně, lze\n"
+"použít klávesy [ and ] k přepínání zásobníku událostí okolo ovládacího "
+"prvku \n"
+"a pravítek rychlosti, abyste událost, kterou chcete upravit, mohli\n"
+"zaměřit.</p>\n"
+
+#: ../docs/en/tips.cpp:229
+msgid ""
+"<p>...that the notation view shows you notes using their display duration, "
+"while the\n"
+"matrix allows you to edit their performance duration?<br><br>\n"
+"<i>Be careful with tied notes in the matrix. It is not apparent that they "
+"are\n"
+"tied, and if you split up a pair of tied notes, subsequent notation views "
+"will\n"
+"be confused and unhappy. This is an old bug that has been on our TODO list\n"
+"for years. Sorry about that, folks. Patches welcome.</i>\n"
+"</p>\n"
+msgstr ""
+"<p>...že notační pohled zobrazuje noty s použitím jejich zobrazované délky, "
+"zatímco\n"
+"matice umožňuje editovat jejich délku trvání?</p><br><br>\n"
+"<i>Opatrně se svázanými notami v matici. Není to na první pohled zřejmé, že "
+"jsou\n"
+"svázané, a pokud rozpojíte pár svázaných not, následné notační pohledy "
+"budou\n"
+"zmatené a nebude se jim to líbit. Toto je stará chyba, která je v našem "
+"úkolníčku\n"
+"již léta. Omlouváme se. Opravy jsou vítané.</i>\n"
+"</p>\n"
+
+#: ../docs/en/tips.cpp:240
+msgid ""
+"<p>If you're working with a human performance and you need to insert some "
+"new\n"
+"notes, these new notes will sound for their entire written duration. To "
+"blend\n"
+"these new notes into a human performance, select them, then use <b>Adjust -> "
+"Interpret...</b> \n"
+"from the notation view to interpret any marks and massage their "
+"performance\n"
+"durations to something less mechanical.</p>\n"
+msgstr ""
+"<p>Pokud pracujete s lidským provedením a potřebujete vložit nějaké nové\n"
+"noty, budou tyto nové noty znít po celou dobu jejich zapsaného trvání. "
+"Chcete-li tyto\n"
+"nové noty přizpůsobit lidskému provedení, vyberte je a použijte možnost "
+"<b>Přizpůsobit -> Interpretace...</b>\n"
+"z notového pohledu. Tím lze interpretovat jakékoli značky a dodat době "
+"trvání jejich provedení\n"
+"poněkud méně mechanický výraz.</p>\n"
+
+#: ../docs/en/tips.cpp:249
+msgid ""
+"<p>...that Rosegarden can export certain things to LilyPond that it cannot "
+"yet\n"
+"display within its own native interface?<br><br>These new directives can be "
+"inserted\n"
+"via the <b>T</b> text insert tool in the notation view.<br><br>\n"
+"Load the example files\n"
+"<b>lilypond-alternative-endings.rg</b> and <b>lilypond-directives.rg</b> for "
+"a\n"
+"demonstration of how to use the new exportable directives.<br><br>\n"
+"Use <b>File -> Preview with\n"
+"LilyPond</b> to see what they look like on the exported page.<br><br>\n"
+"<i>Be sure to turn on\n"
+"<b>Settings -> Show LilyPond Directives</b> and <b>Show Annotations</b> "
+"within\n"
+"the notation view.</i></p>\n"
+msgstr ""
+"<p>...že aplikace Rosegarden může nyní jisté věci, které dosud neumí "
+"zobrazit ve svém rozhraní,\n"
+"exportovat do aplikace LilyPond?<br><br>Tyto nové direktivy lze vložit přes "
+"nástroj pro vkládání\n"
+"textu <b>T</b> v notačním pohledu.<br><br>\n"
+"Načtěte soubory s příkladem <b>lilypond-alternative-endings.rg</b> a "
+"<b>lilypond-directives.rg</b>,\n"
+"abyste si vyzkoušeli, jak používat nové exportovatelné direktivy.<br><br>\n"
+"Pomocí možnosti <b>Soubor -> Náhled s aplikací LilyPond</p> si prohlédněte, "
+"jak budou na exportované stránce vypadat.<br><br>\n"
+"<i>Zapněte při tom možnost\n"
+"<b>Nastavení -> Zobrazit direktivy LilyPond</b> a <b>Zobrazit anotace</b>\n"
+"v notačním pohledu.</i></p>\n"
+
+#: ../docs/en/tips.cpp:264
+msgid ""
+"<p>...that Rosegarden has track parameters allowing you to <b>Create "
+"segments with:</b> certain\n"
+"properties by default?<br><br>You can pre-select the clef, transposition, "
+"colour, and specify\n"
+"the highest and lowest playable notes (notes outside this range display in\n"
+"red by default). Then draw a segment with the pencil, or record one, and "
+"any\n"
+"new segments created on this track will take these properties as segment\n"
+"parameters.<br><br>\n"
+"<i>These parameters do not apply to audio tracks.</i></p>\n"
+msgstr ""
+"<p>...že aplikace Rosegarden obsahuje nyní parametry stop, aby bylo možné "
+"<b>Vytvářet segmenty s:</b> určitými\n"
+"vlastnostmi?<br><br>Lze předvolit klíč, transpozici, barvu a specifikovat\n"
+"nejvyšší a nejnižší hratelné noty (noty vně tohoto rozsahu se budou "
+"zobrazovat\n"
+"ve výchozím nastavení červeně). Potom pomocí tužky nakreslete nějaký segment "
+"nebo jej nahrajte.\n"
+"Jakékoli nové segmenty na této stopě budou mít potom tyto vlastnosti jako "
+"parametry\n"
+"segmentu.<br><br>\n"
+"<i>Tyto parametry se nevztahují na zvukové stopy.</i></p>\n"
+
+#: ../docs/en/tips.cpp:275
+msgid ""
+"<p>...that Rosegarden has a database of preset parameters describing more "
+"than 300\n"
+"musical instruments from the real world, grouped into several convenient\n"
+"categories?<br><br>Each preset contains a clef, transposition, and playable "
+"range\n"
+"suggestions for both amateur and professional players.<br><br>Click the\n"
+"<b>Load</b> button in the new track parameters box to get started! <i>(If "
+"you\n"
+"do not see a <b>Load</b> button, be sure your parameter panel is set for\n"
+"tabbed mode, rather than stacked mode.)</i> <br><br> <i>(Special thanks to "
+"Magnus\n"
+"Johansson for assembling this extraordinary database.)</i></p>\n"
+msgstr ""
+"<p>...že aplikace Rosegarden má nyní databází přednastavených parametrů, "
+"která popisuje více než 300\n"
+"skutečných hudebních nástrojů, seskupených do několika příhodných\n"
+"kategorií?<br><br>Každý přednastavený nástroj obsahuje klíč, transpozici a "
+"návrhy hratelných\n"
+"rozsahů pro amatérské i profesionální hráče.<br><br>Klepnutím na tlačítko\n"
+"<b>Načíst</b> v okénku nových parametrů stopy můžete začít! <i>(Pokud "
+"nevidíte\n"
+"tlačítko <b>Načíst</b>, ujistěte se, že panel parametrů je nastavený do "
+"záložkového\n"
+"režimu a ne do zarovnávacího režimu.)</i> <br><br> <i>(Zvláštní dík "
+"patříMagnusi\n"
+"Johanssonovi za sestavení této výjimečné databáze.)</i></p>\n"
+
+#: ../docs/en/tips.cpp:287
+msgid ""
+"<p>...that when exporting to Lilypond, you can merge tracks that have the "
+"same name onto a single staff?<br><br>For example, if there are three voices "
+"in a single part, write each\n"
+"voice as an independent segment/staff, each on a separate track. Give all\n"
+"three tracks the same name, and select <b>[x] Merge tracks that have the "
+"same\n"
+"name</b> from the options dialog that appears when you export to, or "
+"preview\n"
+"with LilyPond.<br><br>\n"
+"<i>The tracks must have a non-default name for this to work.</i></p>\n"
+msgstr ""
+"<p>...že stopy se stejným názvem můžete exportovat na jedinou, spojenou "
+"osnovu\n"
+"v aplikaci LilyPond?<br><br>Například, existují-li tři hlasy v jednom partu, "
+"zapište každý z nich\n"
+"jako nezávislý segment/osnovu, každý na samostatnou stopu. Všechny tyto tři "
+"stopy\n"
+"pojmenujte stejně a z dialogu možností, který se objeví při exportu do nebo "
+"při náhledu\n"
+"s aplikací LilyPond, vyberte možnost <b>[x] Spojit stopy se stejným názvem</"
+"b><br><br>\n"
+"<i>Stopy musí mít jiný než výchozí název, aby tato funkce fungovala správně."
+"</i></p>\n"
+
+#: ../docs/en/tips.cpp:297
+msgid ""
+" \t \n"
+"<p>...that you can use the mouse wheel to scroll up and down, scroll left "
+"and right, and zoom in and out?<br><br>Just roll the wheel to scroll up or "
+"down. Hold Alt as well to scroll left or right, or hold Ctrl to zoom in and "
+"out.</p> \t \n"
+msgstr ""
+"\t\n"
+"<p>...že můžete použít kolečko myši k procházení nahoru a dolů, vpravo i "
+"vlevo, a k přibližování a oddalování?<br><br>Jednoduše otáčejte kolečkem k "
+"procházení nahoru nebo dolů. Podržte tlačítko Alt, chcete-li procházet vlevo "
+"nebo vpravo, podržte tlačítko Ctrl k přibližování nebo oddalování.</p> \t \n"
+
+#: ../docs/en/tips.cpp:303
+msgid ""
+" \t \n"
+"<p>...that you can time-stretch an audio segment -- stretching or squashing "
+"a\n"
+"sample to a different duration without changing its pitch -- just by\n"
+"dragging its right edge with the Ctrl key pressed?</p>\n"
+msgstr ""
+"\t\n"
+"<p>...že můžete časově natáhnout zvukový segment - natahovat nebo zkracovat "
+"a\n"
+"vzorek na různou dobu trvání beze změny výšky tónů - pouhým tažením\n"
+"pravého okraje se stisknutým tlačítkem Ctrl?</p>\n"
+
+#: ../docs/en/tips.cpp:311
+msgid ""
+" \t \n"
+"<p>...that you can add audio to your Rosegarden composition just by dragging "
+"an audio file from your file manager and dropping it on the Rosegarden "
+"segment canvas? (Make sure you drop it on an audio track!)<br><br>You can "
+"also drop audio files from Rosegarden's audio file manager window onto the "
+"segment canvas, and from other programs onto the audio file manager.</p>\n"
+msgstr ""
+"\t\n"
+"<p>...že můžete přidat zvuk do své skladby v aplikaci Rosegarden pouhým "
+"přetažením zvukového souboru ze svého souborového manažeru a puštěním na "
+"segment v zobrazovací ploše aplikace Rosegarden? (Ujistěte se, že skutečně "
+"přetahujete zvukový soubor!)<br><br>Můžete také přetahovat zvukové soubory z "
+"okna správce zvukových souborů aplikace Rosegarden na segment v zobrazovací "
+"ploše a z jiných programů do správce zvukových souborů.</p>\n"
+
+#: ../docs/en/tips.cpp:317
+msgid ""
+" \t \n"
+"<p>...that you can set the tempo to match the duration of an audio segment "
+"if you know it's an exact number of bars or beats long?<br><br>Just select "
+"the audio segment and use <b>Composition -> Tempo and Time Signature -> Set "
+"Tempo to Audio Segment Duration</b>.</p>\n"
+msgstr ""
+"\t\n"
+"<p>...že můžete nastavit tempo tak, aby odpovídalo trvání zvukového "
+"segmentu, pokud víte, že reprezentuje přesný počet taktů nebo dob?<br><br> "
+"Jednoduše vyberte zvukový segment a použijte možnost <b>Skladba -> Tempo a "
+"taktové označení -> Nastavit tempo a dobu trvání zvukového segmentu</b>.</"
+"p>\n"
+
+#: ../data/fonts/mappings/fonts.cpp:1
+msgid "Feta Pixmaps"
+msgstr "Feta Pixmaps"
+
+#: ../data/fonts/mappings/fonts.cpp:2 ../data/fonts/mappings/fonts.cpp:7
+msgid "GNU Lilypond"
+msgstr "GNU Lilypond"
+
+#: ../data/fonts/mappings/fonts.cpp:3 ../data/fonts/mappings/fonts.cpp:8
+msgid "Copyright (c) 1997--2003 Han-Wen Nienhuys and Jan Nieuwenhuizen"
+msgstr "Copyright (c) 1997--2003 Han-Wen Nienhuys a Jan Nieuwenhuizen"
+
+#: ../data/fonts/mappings/fonts.cpp:4 ../data/fonts/mappings/fonts.cpp:9
+#: ../data/fonts/mappings/fonts.cpp:14 ../data/fonts/mappings/fonts.cpp:19
+#: ../data/fonts/mappings/fonts.cpp:24 ../data/fonts/mappings/fonts.cpp:29
+#: ../data/fonts/mappings/fonts.cpp:34 ../data/fonts/mappings/fonts.cpp:39
+#: ../data/fonts/mappings/fonts.cpp:44 ../data/fonts/mappings/fonts.cpp:49
+#: ../data/fonts/mappings/fonts.cpp:54
+msgid "Chris Cannam"
+msgstr "Chris Cannam"
+
+#: ../data/fonts/mappings/fonts.cpp:5 ../data/fonts/mappings/fonts.cpp:40
+msgid "pixmap"
+msgstr "pixmap"
+
+#: ../data/fonts/mappings/fonts.cpp:6
+msgid "Feta"
+msgstr "Feta"
+
+#: ../data/fonts/mappings/fonts.cpp:10 ../data/fonts/mappings/fonts.cpp:15
+#: ../data/fonts/mappings/fonts.cpp:20 ../data/fonts/mappings/fonts.cpp:25
+#: ../data/fonts/mappings/fonts.cpp:30 ../data/fonts/mappings/fonts.cpp:35
+#: ../data/fonts/mappings/fonts.cpp:45 ../data/fonts/mappings/fonts.cpp:50
+#: ../data/fonts/mappings/fonts.cpp:55
+msgid "scalable"
+msgstr "s možností změny velikosti"
+
+#: ../data/fonts/mappings/fonts.cpp:11
+msgid "Fughetta"
+msgstr "Fughetta"
+
+#: ../data/fonts/mappings/fonts.cpp:12
+msgid ""
+"Created by Blake Hodgetts; freely redistributable. See http://www.efn.org/"
+"~bch/aboutfonts.html"
+msgstr ""
+"Vytvořil Blake Hodgetts; volně šiřitelné. Viz http://www.efn.org/~bch/"
+"aboutfonts.html"
+
+#: ../data/fonts/mappings/fonts.cpp:13
+msgid "Copyright 1995-1999 Blake Hodgetts"
+msgstr "Copyright 1995-1999 Blake Hodgetts"
+
+#: ../data/fonts/mappings/fonts.cpp:16
+msgid "Inkpen"
+msgstr "Inkpen"
+
+#: ../data/fonts/mappings/fonts.cpp:17
+msgid "Inkpen is part of Sibelius, but other fonts may use the same mappings."
+msgstr ""
+"Inkpen je součástí aplikace Sibelius, ale ostatní písma mohou používat "
+"stejné mapování."
+
+#: ../data/fonts/mappings/fonts.cpp:18 ../data/fonts/mappings/fonts.cpp:28
+msgid "Copyright Sibelius Software Ltd"
+msgstr "Copyright Sibelius Software Ltd"
+
+#: ../data/fonts/mappings/fonts.cpp:21
+msgid "Maestro"
+msgstr "Maestro"
+
+#: ../data/fonts/mappings/fonts.cpp:22
+msgid "Maestro is part of Finale, but other fonts use the same mappings."
+msgstr ""
+"Maestro je součástí aplikace Finale, ale ostatní písma mohou používat stejné "
+"mapování."
+
+#: ../data/fonts/mappings/fonts.cpp:23 ../data/fonts/mappings/fonts.cpp:33
+msgid "Copyright Coda Inc"
+msgstr "Copyright Coda Inc"
+
+#: ../data/fonts/mappings/fonts.cpp:27
+msgid "Opus is part of Sibelius, but other fonts may use the same mappings."
+msgstr ""
+"Opus je součástí aplikace Sibelius, ale ostatní písma mohou používat stejné "
+"mapování."
+
+#: ../data/fonts/mappings/fonts.cpp:31
+msgid "Petrucci"
+msgstr "Petrucci"
+
+#: ../data/fonts/mappings/fonts.cpp:32
+msgid "Petrucci is part of Finale, but other fonts use the same mappings."
+msgstr ""
+"Petrucci je součástí aplikace Finale, ale ostatní písma mohou používat "
+"stejné mapování."
+
+#: ../data/fonts/mappings/fonts.cpp:36
+msgid "RG21"
+msgstr "RG21"
+
+#: ../data/fonts/mappings/fonts.cpp:37
+msgid "Rosegarden 2.1"
+msgstr "Rosegarden 2.1"
+
+#: ../data/fonts/mappings/fonts.cpp:38
+msgid "Copyright (c) 1994--2001 Chris Cannam"
+msgstr "Copyright (c) 1994--2001 Chris Cannam"
+
+#: ../data/fonts/mappings/fonts.cpp:41
+msgid "Sonata"
+msgstr "Sonata"
+
+#: ../data/fonts/mappings/fonts.cpp:42
+msgid "Adobe"
+msgstr "Adobe"
+
+#: ../data/fonts/mappings/fonts.cpp:43
+msgid "Copyright Adobe Inc"
+msgstr "Copyright Adobe Inc"
+
+#: ../data/fonts/mappings/fonts.cpp:46
+msgid "Steinberg"
+msgstr "Steinberg"
+
+#: ../data/fonts/mappings/fonts.cpp:47
+msgid "The Steinberg Notation font is part of Cubase."
+msgstr "Notační písmo Steinberg je součástí aplikace Cubase."
+
+#: ../data/fonts/mappings/fonts.cpp:48
+msgid "Copyright Steinberg Inc"
+msgstr "Copyright Steinberg Inc"
+
+#: ../data/fonts/mappings/fonts.cpp:51
+msgid "Xinfonia"
+msgstr "Xinfonia"
+
+#: ../data/fonts/mappings/fonts.cpp:52
+msgid "xemo.org"
+msgstr "xemo.org"
+
+#: ../data/fonts/mappings/fonts.cpp:53
+msgid "Copyright 2001-2003 Xemus Software LLC"
+msgstr "Copyright 2001-2003 Xemus Software LLC"
+
+#: ../data/styles/styles.cpp:1
+msgid "Classical"
+msgstr "Klasický"
+
+#: ../data/styles/styles.cpp:2
+msgid "Cross"
+msgstr "Křížový"
+
+#: ../data/styles/styles.cpp:3
+msgid "Mensural"
+msgstr "Menzurální"
+
+#: ../data/styles/styles.cpp:4
+msgid "Triangle"
+msgstr "Trojúhelníkový"
diff --git a/po/cy.po b/po/cy.po
new file mode 100644
index 0000000..0ab44b3
--- /dev/null
+++ b/po/cy.po
@@ -0,0 +1,13229 @@
+# translation of cy.po to Cymraeg
+# translation of rosegarden.po to Cymraeg
+# This file is distributed under the same license as the PACKAGE package.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER.
+# Kgyfieithu <[email protected]>, 2003.
+# KGyfieithu <[email protected]>, 2003.
+# KD at KGyfieithu <[email protected]>, 2003.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: cy\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-04-24 18:19-0400\n"
+"PO-Revision-Date: 2003-12-02 16:23+0000\n"
+"Last-Translator: KD at KGyfieithu <[email protected]>\n"
+"Language-Team: Cymraeg <[email protected]>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.2\n"
+
+#: ../src/gui/dialogs/RescaleDialog.cpp:51 rc.cpp:192 rc.cpp:312
+#, no-c-format
+msgid "Rescale"
+msgstr "Ail-raddu"
+
+#: ../src/gui/dialogs/RescaleDialog.cpp:56
+#, fuzzy
+msgid "Duration of selection"
+msgstr "Torri'r dewisiad..."
+
+#: ../src/gui/dialogs/RescaleDialog.cpp:62
+msgid "Adjust times of following events accordingly"
+msgstr ""
+
+#: ../src/gui/dialogs/PitchDialog.cpp:45
+#: ../src/gui/dialogs/RescaleDialog.cpp:72
+#: ../src/gui/dialogs/TimeDialog.cpp:51 ../src/gui/dialogs/TimeDialog.cpp:68
+#: ../src/gui/studio/BankEditorDialog.cpp:109
+msgid "Reset"
+msgstr "Ail-osod"
+
+#: ../src/commands/segment/SegmentSplitByPitchCommand.cpp:46
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:46
+msgid "Split by Pitch"
+msgstr "Hollti gan Draw"
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:54
+msgid "Starting split pitch"
+msgstr "Traw a holltwyd sy'n dechrau:"
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:57
+msgid "Range up and down to follow music"
+msgstr "Symud i fyny ac i lawr i ddilyn y cerdd"
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:63
+msgid "Duplicate non-note events"
+msgstr "Dyblygu digwyddiadau di-nodyn"
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:66
+msgid "Clef handling:"
+msgstr "Trin cleff:"
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:69
+msgid "Leave clefs alone"
+msgstr "Gadael i'r cleffau fod"
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:70
+msgid "Guess new clefs"
+msgstr "Amcangyfrif cleffau newydd"
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:71
+msgid "Use treble and bass clefs"
+msgstr "Defnyddio cleffau trebl a bas"
+
+#: ../src/gui/dialogs/DocumentConfigureDialog.cpp:64
+#, fuzzy
+msgid "Document Properties"
+msgstr "Golygu Priod&weddau'r Ddogfen..."
+
+#: ../src/gui/dialogs/MakeOrnamentDialog.cpp:45
+#: ../src/gui/editors/notation/NotationView.cpp:6048
+#, fuzzy
+msgid "Make Ornament"
+msgstr "Enw'r arwydd"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:183
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:179
+#: ../src/gui/dialogs/EventEditDialog.cpp:128
+#: ../src/gui/dialogs/MakeOrnamentDialog.cpp:49
+#: ../src/gui/studio/DeviceEditorDialog.cpp:74
+#: ../src/gui/studio/NameSetEditor.cpp:72
+#: ../src/gui/widgets/ColourTable.cpp:51
+msgid "Name"
+msgstr "Enw"
+
+#: ../src/gui/dialogs/MakeOrnamentDialog.cpp:51
+msgid ""
+"The name is used to identify both the ornament\n"
+"and the triggered segment that stores\n"
+"the ornament's notes."
+msgstr ""
+
+#: ../src/gui/dialogs/MakeOrnamentDialog.cpp:54
+#, fuzzy
+msgid "Name: "
+msgstr "Enw:"
+
+#: ../src/gui/dialogs/MakeOrnamentDialog.cpp:57
+#: ../src/gui/editors/eventlist/EventView.cpp:717
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:92
+#, fuzzy
+msgid "Base pitch"
+msgstr "Traw'r cywair:"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:57
+#: ../src/gui/editors/eventlist/EventView.cpp:140
+msgid "Text"
+msgstr "Testun"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:66
+msgid "Specification"
+msgstr "Penodiad"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:68
+msgid "Preview"
+msgstr "Rhagolygu"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:72
+msgid "Text: "
+msgstr "Testun:"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:79
+msgid "Style: "
+msgstr "Arddull:"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:90
+msgid "Dynamic"
+msgstr "Dinamig"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:93
+msgid "Direction"
+msgstr "Cyfeiriad"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:96
+msgid "Local Direction"
+msgstr "Cyfeiriad Lleol"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:63
+#: ../src/gui/dialogs/TextEventDialog.cpp:99
+#: ../src/gui/editors/tempo/TempoView.cpp:91
+msgid "Tempo"
+msgstr "Tempo"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:102
+msgid "Local Tempo"
+msgstr "Tempo Lleol"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:105
+msgid "Lyric"
+msgstr "Geiriau"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:108
+#: ../src/gui/editors/notation/NotationView.cpp:4242
+#, fuzzy
+msgid "Chord"
+msgstr "Cord"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:111
+msgid "Annotation"
+msgstr "Anodiad"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:114
+#, fuzzy
+msgid "LilyPond Directive"
+msgstr "Ffeiliau Lilypond"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:138
+msgid "Verse: "
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:148
+#, fuzzy
+msgid "Dynamic: "
+msgstr "Dinamig"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:152
+msgid "ppp"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:153
+msgid "pp"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:154
+msgid "p"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:155
+msgid "mp"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:156
+msgid "mf"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:157
+msgid "f"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:158
+#, fuzzy
+msgid "ff"
+msgstr "i ffwrdd"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:159
+#, fuzzy
+msgid "fff"
+msgstr "i ffwrdd"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:160
+msgid "rfz"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:161
+msgid "sf"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:165
+#, fuzzy
+msgid "Direction: "
+msgstr "Cyfeiriad"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:174
+msgid " ,"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:175
+msgid "D.C. al Fine"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:176
+msgid "D.S. al Fine"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:177
+#, fuzzy
+msgid "Fine"
+msgstr "Hidl"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:178
+msgid "D.S. al Coda"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:179
+#, fuzzy
+msgid "to Coda"
+msgstr "Cord"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:180
+#, fuzzy
+msgid "Coda"
+msgstr "Cleff"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:184
+#, fuzzy
+msgid "Local Direction: "
+msgstr "Cyfeiriad Lleol"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:188
+#, fuzzy
+msgid "accel."
+msgstr "Sianel"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:189
+msgid "ritard."
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:190
+msgid "ralletando"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:191
+#, fuzzy
+msgid "a tempo"
+msgstr "Tempo newydd"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:192
+#, fuzzy
+msgid "legato"
+msgstr "Cyfreithiol"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:193
+#, fuzzy
+msgid "simile"
+msgstr "Hidl"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:194
+msgid "pizz."
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:195
+#, fuzzy
+msgid "arco"
+msgstr "&Marcato"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:196
+msgid "non vib."
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:197
+msgid "sul pont."
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:198
+#: ../src/gui/dialogs/TextEventDialog.cpp:200
+msgid "sul tasto"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:199
+msgid "con legno"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:201
+msgid "sul G"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:202
+msgid "ordinario"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:203
+#, fuzzy
+msgid "Muta in "
+msgstr "Lleiafrif"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:204
+msgid "volti subito "
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:205
+msgid "soli"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:206
+msgid "div."
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:210
+#, fuzzy
+msgid "Tempo: "
+msgstr "Tempo"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:214
+#: ../src/gui/dialogs/TextEventDialog.cpp:238
+#, fuzzy
+msgid "Grave"
+msgstr "Gwyrdd"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:215
+#: ../src/gui/dialogs/TextEventDialog.cpp:239
+#, fuzzy
+msgid "Adagio"
+msgstr "Sain"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:216
+#: ../src/gui/dialogs/TextEventDialog.cpp:240
+msgid "Largo"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:217
+#: ../src/gui/dialogs/TextEventDialog.cpp:241
+#, fuzzy
+msgid "Lento"
+msgstr "Cyfreithiol"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:218
+#: ../src/gui/dialogs/TextEventDialog.cpp:242
+msgid "Andante"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:219
+#: ../src/gui/dialogs/TextEventDialog.cpp:243
+#, fuzzy
+msgid "Moderato"
+msgstr "Addasu A&rwydd"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:220
+#: ../src/gui/dialogs/TextEventDialog.cpp:244
+msgid "Allegretto"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:221
+#: ../src/gui/dialogs/TextEventDialog.cpp:245
+#, fuzzy
+msgid "Allegro"
+msgstr "Popeth"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:222
+#: ../src/gui/dialogs/TextEventDialog.cpp:246
+#, fuzzy
+msgid "Vivace"
+msgstr "Golygu"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:223
+#: ../src/gui/dialogs/TextEventDialog.cpp:247
+#, fuzzy
+msgid "Presto"
+msgstr "saib"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:224
+#: ../src/gui/dialogs/TextEventDialog.cpp:248
+#, fuzzy
+msgid "Prestissimo"
+msgstr "Cyflwyniad"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:225
+#: ../src/gui/dialogs/TextEventDialog.cpp:249
+#, fuzzy
+msgid "Maestoso"
+msgstr "Metronom"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:226
+#: ../src/gui/dialogs/TextEventDialog.cpp:250
+#, fuzzy
+msgid "Sostenuto"
+msgstr "T&enuto"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:227
+#: ../src/gui/dialogs/TextEventDialog.cpp:251
+#, fuzzy
+msgid "Tempo Primo"
+msgstr "Tempo wrth amser"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:234
+#, fuzzy
+msgid "Local Tempo: "
+msgstr "Tempo Lleol"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:255
+#, fuzzy
+msgid "Directive: "
+msgstr "Cyfeiriad"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:312
+msgid "Example"
+msgstr "Enghraifft"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:65
+msgid "Event Filter"
+msgstr "Hidlen Ddigwyddiadau"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:86
+#, fuzzy
+msgid "Note Events"
+msgstr "Symud Digwyddiadau"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:90
+msgid "lowest:"
+msgstr ""
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:93
+msgid "highest:"
+msgstr ""
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:96
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:141
+#: ../src/gui/widgets/PitchChooser.cpp:53
+msgid "Pitch:"
+msgstr "Traw:"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:99
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:163
+msgid "Velocity:"
+msgstr "Buanedd:"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:102
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:129
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:257
+msgid "Duration:"
+msgstr "Parhad:"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:107
+#: ../src/gui/dialogs/EventFilterDialog.cpp:114
+#: ../src/gui/dialogs/EventFilterDialog.cpp:121
+msgid "include"
+msgstr "cynnwys"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:108
+#: ../src/gui/dialogs/EventFilterDialog.cpp:115
+#: ../src/gui/dialogs/EventFilterDialog.cpp:122
+msgid "exclude"
+msgstr "gwahardd"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:136
+#: ../src/gui/dialogs/EventFilterDialog.cpp:155
+#: ../src/gui/editors/eventlist/EventView.cpp:172
+#: ../src/gui/editors/eventlist/EventView.cpp:179
+#: ../src/gui/editors/eventlist/EventView.cpp:186
+#, fuzzy
+msgid "edit"
+msgstr "Golygu"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:141
+#: ../src/gui/dialogs/EventFilterDialog.cpp:157
+msgid "choose a pitch using a staff"
+msgstr "dewis traw gan ddefnyddio erwydd"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:182
+#: ../src/gui/dialogs/EventFilterDialog.cpp:188
+msgid "longest"
+msgstr ""
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:200
+#, fuzzy
+msgid "Include all"
+msgstr "cynnwys"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:203
+msgid "Include entire range of values"
+msgstr ""
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:206
+#, fuzzy
+msgid "Exclude all"
+msgstr "gwahardd"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:209
+msgid "Exclude entire range of values"
+msgstr ""
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:233
+#: ../src/gui/dialogs/EventFilterDialog.cpp:234
+#, fuzzy
+msgid "shortest"
+msgstr "saib"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:333
+#, fuzzy
+msgid "Lowest pitch"
+msgstr "Traw'r nodyn:"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:343
+#, fuzzy
+msgid "Highest pitch"
+msgstr "Traw'r cywair:"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:56
+#: ../src/gui/editors/notation/NotationView.cpp:1619
+#: ../src/gui/editors/notation/NotationView.cpp:6088
+msgid "Use Ornament"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:260
+#: ../src/gui/configuration/NotationConfigurationPage.h:64
+#: ../src/gui/configuration/NotationConfigurationPage.h:65
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:63
+msgid "Notation"
+msgstr "Nodiant"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:68
+#, fuzzy
+msgid "Display as: "
+msgstr "Dangos fel amseriad cyffredin"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:84
+#, fuzzy
+msgid "Trill"
+msgstr "&Siglnod"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:84
+msgid "Trill with line"
+msgstr ""
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:84
+msgid "Trill line only"
+msgstr ""
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:85
+#, fuzzy
+msgid "Turn"
+msgstr "&Tro"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:85
+msgid "Mordent"
+msgstr ""
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:85
+#, fuzzy
+msgid "Inverted mordent"
+msgstr "Mewnosod Digwyddiad"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:86
+msgid "Long mordent"
+msgstr ""
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:86
+msgid "Long inverted mordent"
+msgstr ""
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:94
+#, fuzzy
+msgid "Text mark"
+msgstr "Testun:"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:98
+#, fuzzy
+msgid " Text: "
+msgstr "Testun:"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:104
+#, fuzzy
+msgid "Performance"
+msgstr "Newid Rhaglen"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:109
+msgid "Perform using triggered segment: "
+msgstr ""
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:75
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:123
+#, fuzzy
+msgid "Perform with timing: "
+msgstr "Cynnull efo amseriad newydd:"
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:81
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:129
+msgid "As stored"
+msgstr ""
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:82
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:130
+msgid "Truncate if longer than note"
+msgstr ""
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:83
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:131
+msgid "End at same time as note"
+msgstr ""
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:84
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:132
+msgid "Stretch or squash segment to note duration"
+msgstr ""
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:86
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:134
+msgid "Adjust pitch to note"
+msgstr ""
+
+#: ../src/gui/dialogs/PitchPickerDialog.cpp:40
+msgid "Pitch Selector"
+msgstr "Dewisydd Traw"
+
+#: ../src/gui/dialogs/BeatsBarsDialog.cpp:44
+#, fuzzy
+msgid "Audio Segment Duration"
+msgstr "Parhad"
+
+#: ../src/gui/dialogs/BeatsBarsDialog.cpp:50
+msgid "The selected audio segment contains:"
+msgstr ""
+
+#: ../src/gui/dialogs/BeatsBarsDialog.cpp:59
+#, fuzzy
+msgid "beat(s)"
+msgstr "Curiad"
+
+#: ../src/gui/dialogs/BeatsBarsDialog.cpp:60
+msgid "bar(s)"
+msgstr ""
+
+#: ../src/gui/dialogs/TupletDialog.cpp:51
+msgid "Tuplet"
+msgstr "Plygyn"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:58
+msgid "New timing for tuplet group"
+msgstr "Amseriad newydd i gasgliad plygau"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:76
+msgid "Play "
+msgstr "Chwarae"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:98
+msgid "in the time of "
+msgstr "yn amser"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:104
+msgid "Timing is already correct: update display only"
+msgstr ""
+
+#: ../src/gui/dialogs/TupletDialog.cpp:114
+msgid "Timing calculations"
+msgstr "Cyfrifiadau amseriad"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:120
+msgid "Selected region:"
+msgstr "Ardal dewisedig:"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:129
+msgid "Group with current timing:"
+msgstr "Cynnull efo amseriad cyfredol:"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:135
+msgid "Group with new timing:"
+msgstr "Cynnull efo amseriad newydd:"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:141
+msgid "Gap created by timing change:"
+msgstr "Bwlch a greuwyd gan newid amseriad:"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:149
+msgid "Unchanged at end of selection:"
+msgstr "Heb ei newid wrth ddiwedd y ddewisiad:"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:63 rc.cpp:372
+#, no-c-format
+msgid "Metronome"
+msgstr "Metronom"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:77
+#, fuzzy
+msgid "Metronome Instrument"
+msgstr "Gosod Offeryn"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:82
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:150
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:183
+#: ../src/gui/studio/DeviceEditorDialog.cpp:73
+#: ../src/gui/studio/DeviceManagerDialog.cpp:105
+#: ../src/gui/studio/DeviceManagerDialog.cpp:163
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:66
+msgid "Device"
+msgstr "Dyfais"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:101
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:89
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:215
+#: ../src/gui/studio/DeviceEditorDialog.cpp:195
+#: ../src/gui/studio/DeviceEditorDialog.cpp:218
+#: ../src/gui/studio/DeviceEditorDialog.cpp:230
+#: ../src/gui/studio/DeviceManagerDialog.cpp:196
+#: ../src/gui/studio/DeviceManagerDialog.cpp:440
+#: ../src/gui/studio/DeviceManagerDialog.cpp:452
+msgid "No connection"
+msgstr "Dim cysylltiad"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:112
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:111
+#: ../src/gui/editors/parameters/InstrumentParameterBox.cpp:53
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:1209
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:159
+#: ../src/gui/general/PresetHandlerDialog.cpp:92
+#: ../src/gui/studio/MidiMixerWindow.cpp:204
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:67
+msgid "Instrument"
+msgstr "Offeryn"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:118
+#, fuzzy
+msgid "Beats"
+msgstr "Curiad"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:184
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:123
+msgid "Resolution"
+msgstr "Cydraniad"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:309
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:139
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:205
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:125
+#: ../src/gui/editors/matrix/MatrixView.cpp:2132
+#: ../src/gui/editors/notation/NotationView.cpp:1582
+#: ../src/gui/widgets/QuantizeParameters.cpp:128
+#: ../src/gui/widgets/QuantizeParameters.cpp:301
+msgid "None"
+msgstr "Dim"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:126
+msgid "Bars only"
+msgstr ""
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:127
+#, fuzzy
+msgid "Bars and beats"
+msgstr "Pwysleisio curiadau"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:128
+msgid "Bars, beats, and divisions"
+msgstr ""
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:132
+#, fuzzy
+msgid "Bar velocity"
+msgstr "Buanedd y nodyn:"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:139
+#, fuzzy
+msgid "Beat velocity"
+msgstr "Buanedd y nodyn:"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:146
+#, fuzzy
+msgid "Sub-beat velocity"
+msgstr "Buanedd y nodyn:"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:155
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:324
+#, fuzzy
+msgid "Pitch"
+msgstr "Traw:"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:160
+#, fuzzy
+msgid "for Bar"
+msgstr "Bar Dechrau"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:161
+#, fuzzy
+msgid "for Beat"
+msgstr "Curiad"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:162
+msgid "for Sub-beat"
+msgstr ""
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:166
+#, fuzzy
+msgid "Metronome Activated"
+msgstr "Gosodiadau Metronôm"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:167
+#, fuzzy
+msgid "Playing"
+msgstr "Chwarae"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:168
+#, fuzzy
+msgid "Recording"
+msgstr "Ail-&raddu..."
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:46
+msgid "Choose Text Encoding"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:50
+msgid ""
+"\n"
+"This file contains text in an unknown language encoding.\n"
+"\n"
+"Please select one of the following estimated text encodings\n"
+"for use with the text in this file:\n"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:61
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:77
+msgid "Japanese Shift-JIS"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:62
+msgid "Unicode variable-width"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:63
+msgid "Western Europe"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:64
+msgid "Western Europe + Euro"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:65
+msgid "Eastern Europe"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:66
+msgid "Southern Europe"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:67
+msgid "Northern Europe"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:68
+#, fuzzy
+msgid "Cyrillic"
+msgstr "Geiriau"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:69
+msgid "Arabic"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:70
+#, fuzzy
+msgid "Greek"
+msgstr "Gwyrdd"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:71
+msgid "Hebrew"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:72
+msgid "Turkish"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:73
+msgid "Nordic"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:74
+msgid "Thai"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:75
+#, fuzzy
+msgid "Baltic"
+msgstr "Curiad"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:76
+msgid "Celtic"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:78
+msgid "Traditional Chinese"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:79
+#, fuzzy
+msgid "Simplified Chinese"
+msgstr "Cysoni"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:80
+msgid "Russian"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:81
+msgid "Ukrainian"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:82
+#, fuzzy
+msgid "Tamil"
+msgstr "&Siglnod"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:117
+#, c-format
+msgid "Microsoft Code Page %1"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:123
+#: ../src/gui/editors/matrix/MatrixView.cpp:1490
+#, fuzzy
+msgid "%1 (%2)"
+msgstr "&%1%2"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:142
+msgid ""
+"\n"
+"Example text from file:"
+msgstr ""
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:59
+#: ../src/gui/editors/tempo/TempoView.cpp:92
+msgid "Time Signature"
+msgstr "Arwydd Amseriad"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:82
+msgid "Time signature"
+msgstr "Arwydd amseriad"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:116
+msgid "Time where signature takes effect"
+msgstr ""
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:83
+#: ../src/gui/dialogs/TempoDialog.cpp:128
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:129
+#: ../src/gui/general/PresetHandlerDialog.cpp:101
+msgid "Scope"
+msgstr "Cwmpas"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:141
+#, c-format
+msgid "Insertion point is at start of measure %1."
+msgstr "Mae'r pwynt mewnosod wrth ddechrau'r measure %1."
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:145
+#, c-format
+msgid "Insertion point is in the middle of measure %1."
+msgstr "Mae'r pwynt mewnosod yng nghanol measure %1."
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:150
+msgid "Insertion point is at start of composition."
+msgstr "Mae'r pwynt mewnosod wrth ddechrau'r cyfansoddiad."
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:155
+msgid "Start measure %1 here"
+msgstr "Dechrau measure %1 yma"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:159
+#, fuzzy, c-format
+msgid "Change time from start of measure %1"
+msgstr "Newid amser o ddechrau measure %1"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:166
+#, c-format
+msgid "Time change will take effect at the start of measure %1."
+msgstr "Bydd y newid amser yn cymryd effaith o ddechrau measure %1."
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:176
+#, fuzzy
+msgid "Hide the time signature"
+msgstr "Gwneud yr arwydd amseriad newydd yn gudd."
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:181
+#, fuzzy
+msgid "Hide the affected bar lines"
+msgstr "Clymu nodau wrth linellau bar ayyb"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:186
+msgid "Show as common time"
+msgstr "Dangos fel amseriad cyffredin"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:191
+msgid "Correct the durations of following measures"
+msgstr ""
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:280
+msgid "Display as common time"
+msgstr "Dangos fel amseriad cyffredin"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:284
+msgid "Display as cut common time"
+msgstr "Dangos fel amseriad cyffredin wedi'i dorri"
+
+#: ../src/gui/dialogs/ConfigureDialog.cpp:66
+#, fuzzy
+msgid "Configure Rosegarden"
+msgstr "Rosegarden"
+
+#: ../src/gui/dialogs/MarkerModifyDialog.cpp:53
+#: ../src/gui/dialogs/MarkerModifyDialog.cpp:61
+msgid "Edit Marker"
+msgstr "Golygu Arwydd"
+
+#: ../src/gui/dialogs/MarkerModifyDialog.cpp:78
+#, fuzzy
+msgid "Marker Time"
+msgstr "Amser yr arwydd"
+
+#: ../src/gui/dialogs/MarkerModifyDialog.cpp:94
+msgid "Marker Properties"
+msgstr "Priodweddau Arwydd"
+
+#: ../src/gui/dialogs/MarkerModifyDialog.cpp:100
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:554
+msgid "Text:"
+msgstr "Testun:"
+
+#: ../src/gui/dialogs/MarkerModifyDialog.cpp:104
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:85
+msgid "Description:"
+msgstr "Disgrifiad:"
+
+#: ../src/gui/dialogs/FileMergeDialog.cpp:46
+msgid "Merge File"
+msgstr "Cyfuno Ffeil"
+
+#: ../src/gui/dialogs/FileMergeDialog.cpp:53
+msgid "Merge new file "
+msgstr "Cyfuno ffeil newydd"
+
+#: ../src/gui/dialogs/FileMergeDialog.cpp:56
+msgid "At start of existing composition"
+msgstr "Wrth ddechrau cyfansoddiad sy'n bodoli"
+
+#: ../src/gui/dialogs/FileMergeDialog.cpp:57
+msgid "From end of existing composition"
+msgstr "O ddiwedd cyfansoddiad sy'n bodoli"
+
+#: ../src/gui/dialogs/FileMergeDialog.cpp:61
+msgid "The file has different time signatures or tempos."
+msgstr "Mae'r ffeil efo arwyddion amseriad neu tempi gwahanol."
+
+#: ../src/gui/dialogs/FileMergeDialog.cpp:62
+msgid "Import these as well"
+msgstr "Mewnosod y rhain hefyd"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:171
+#: ../src/gui/dialogs/ShowSequencerStatusDialog.cpp:44
+msgid "Sequencer status"
+msgstr "Cyflwr y dilyniannydd"
+
+#: ../src/gui/dialogs/ShowSequencerStatusDialog.cpp:48
+msgid "Sequencer status:"
+msgstr "Cyflwr y dilyniannydd:"
+
+#: ../src/gui/dialogs/ShowSequencerStatusDialog.cpp:50
+msgid "Status not available."
+msgstr "Nid yw'r cyflwr ar gael."
+
+#: ../src/gui/dialogs/ShowSequencerStatusDialog.cpp:57
+msgid "Sequencer is not running or is not responding."
+msgstr "Nid yw'r dilyniannydd yn rhedeg, neu nid yw'n ymateb."
+
+#: ../src/gui/dialogs/ShowSequencerStatusDialog.cpp:64
+msgid "Sequencer is not returning a valid status report."
+msgstr "Nid yw'r dilyniannydd yn dychwelyd adroddiad cyflwr dilys."
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:46
+#, fuzzy
+msgid "Add Tracks"
+msgstr "Ychwanegu Traciau..."
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:54
+#, fuzzy
+msgid "How many tracks do you want to add?"
+msgstr "Faint o draciau yr ydych eisiau eu ychwanegu? (mwyaf 24)"
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:62
+#, fuzzy
+msgid "Add tracks"
+msgstr "Ymladd"
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:64
+msgid "At the top"
+msgstr ""
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:65
+#, fuzzy
+msgid "Above the current selected track"
+msgstr "Distewi pob un trac ond yr yn sydd wedi'i ddewis yn gyfredol"
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:66
+#, fuzzy
+msgid "Below the current selected track"
+msgstr "Distewi pob un trac ond yr yn sydd wedi'i ddewis yn gyfredol"
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:67
+msgid "At the bottom"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:75
+msgid "Event Properties"
+msgstr "Priodweddau Digwyddiadau"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:81
+msgid "Event type:"
+msgstr "Math y ddigwyddiad:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:117
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:251
+#: ../src/gui/editors/segment/MarkerEditor.cpp:97
+msgid "Absolute time:"
+msgstr "Amseriad llwyr:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:156
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:323
+msgid "Controller name:"
+msgstr "Enw'r rheolydd:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:157
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:530
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:562
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:563
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:602
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:631
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:267
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:269
+#: ../src/gui/editors/segment/MarkerEditor.cpp:279
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:272
+#: ../src/gui/studio/AudioMixerWindow.cpp:388
+#: ../src/gui/studio/AudioMixerWindow.cpp:519
+#: ../src/gui/studio/AudioMixerWindow.cpp:683
+#: ../src/gui/studio/AudioMixerWindow.cpp:722
+#: ../src/gui/studio/AudioMixerWindow.cpp:904
+#: ../src/gui/studio/SynthPluginManagerDialog.cpp:121
+msgid "<none>"
+msgstr "<dim>"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:174
+msgid "Meta string:"
+msgstr "Llinyn meta:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:179
+msgid "Load data"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:181
+#, fuzzy
+msgid "Save data"
+msgstr "Cadw fel..."
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:192
+#, fuzzy
+msgid "Notation Properties"
+msgstr "Paramedrau Nodiant"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:198
+msgid "Lock to changes in performed values"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:205
+#, fuzzy
+msgid "Notation time:"
+msgstr "Nodiad"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:217
+#, fuzzy
+msgid "Notation duration:"
+msgstr "Yn chwarae ffeil sain"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:283
+msgid "Note pitch:"
+msgstr "Traw'r nodyn:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:291
+msgid "Note velocity:"
+msgstr "Buanedd y nodyn:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:317
+msgid "Controller number:"
+msgstr "Rhif y rheolydd:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:326
+msgid "Controller value:"
+msgstr "Gwerth y rheolydd:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:354
+msgid "Key pitch:"
+msgstr "Traw'r cywair:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:362
+msgid "Key pressure:"
+msgstr "Gwasgedd yr allwedd:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:390
+msgid "Channel pressure:"
+msgstr "Gwasgedd y sianel:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:418
+msgid "Program change:"
+msgstr "Newid y rhaglen:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:461
+msgid "Data length:"
+msgstr "Hyd y data:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:462
+#, fuzzy
+msgid "Data:"
+msgstr "Curiad"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:480
+msgid "Pitchbend MSB:"
+msgstr "Plygu traw MSB:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:488
+msgid "Pitchbend LSB:"
+msgstr "Plygu traw LSB:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:523
+#, fuzzy
+msgid "Indication:"
+msgstr "Dangosiad"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:553
+msgid "Text type:"
+msgstr "Math y testun:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:596
+msgid "Clef type:"
+msgstr "Math y clef:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:625
+msgid "Key name:"
+msgstr "Enw'r cywair:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:674
+msgid "Unsupported event type:"
+msgstr "Math o ddigwyddiad na chynhelir:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:931
+#, fuzzy
+msgid "Edit Event Time"
+msgstr "Golygu Digwyddiad"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:943
+#, fuzzy
+msgid "Edit Event Notation Time"
+msgstr "Golygu Digwyddiad"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:955
+#, fuzzy
+msgid "Edit Duration"
+msgstr "Parhad"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:968
+#, fuzzy
+msgid "Edit Notation Duration"
+msgstr "Parhad"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:981
+#, fuzzy
+msgid "Edit Pitch"
+msgstr "%1 Traw"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:991
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:1016
+msgid "*.syx|System exclusive files (*.syx)"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:992
+#, fuzzy
+msgid "Load System Exclusive data in File"
+msgstr "Cyfyngedig i'r Cysawd"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:1017
+#, fuzzy
+msgid "Save System Exclusive data to..."
+msgstr "Cyfyngedig i'r Cysawd"
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:46
+msgid "Locate audio file"
+msgstr "Lleoli ffeil sain"
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:50
+msgid "&Skip"
+msgstr "&Osgoi"
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:51
+#, fuzzy
+msgid "Skip &All"
+msgstr "Dewis &Popeth"
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:52
+msgid "&Locate"
+msgstr "&Lleoli"
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:57
+msgid ""
+"Can't find file \"%1\".\n"
+"Would you like to try and locate this file or skip it?"
+msgstr ""
+"Methu canfod ffeil \"%1\". \n"
+"Ydych eisiau ceisio lleoli'r ffeil yma neu'i osgoi?"
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:71
+#, fuzzy
+msgid ""
+"%1|Requested file (%2)\n"
+"*.wav|WAV files (*.wav)"
+msgstr "ffeiliau *.wav|WAV (*.wav)"
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:74
+msgid "Select an Audio File"
+msgstr "Dewis Ffeil Sain"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:53 ../src/gui/dialogs/ClefDialog.cpp:62
+#: ../src/gui/dialogs/ClefDialog.cpp:79 ../src/gui/dialogs/ClefDialog.cpp:90
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:278
+msgid "Clef"
+msgstr "Cleff"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:65
+msgid "Existing notes following clef change"
+msgstr "Nodau mewn bod ar ol newid cleff"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:71
+msgid "Lower clef"
+msgstr "Clef is"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:77
+msgid "Up an Octave"
+msgstr "I Fyny Wythfed"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:84
+msgid "Down an Octave"
+msgstr "I lawr Wythfed"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:88
+msgid "Higher clef"
+msgstr "Cleff uwch"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:96
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:152
+msgid "Maintain current pitches"
+msgstr "Cynnal trawiau cyfredol"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:99
+msgid "Transpose into appropriate octave"
+msgstr "Trawsgyweirio i'r wythfed addas"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:231
+#, fuzzy
+msgid "%1 down an octave"
+msgstr "I lawr Wythfed"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:234
+#, fuzzy
+msgid "%1 down two octaves"
+msgstr "I lawr Wythfed"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:237
+#, fuzzy
+msgid "%1 up an octave"
+msgstr "I Fyny Wythfed"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:240
+msgid "%1 up two octaves"
+msgstr ""
+
+#: ../src/gui/dialogs/ClefDialog.cpp:249
+msgid "Treble"
+msgstr "Trebl"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:251
+#, fuzzy
+msgid "French violin"
+msgstr "Cysoni"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:253
+#, fuzzy
+msgid "Soprano"
+msgstr "S&forzando"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:255
+#, fuzzy
+msgid "Mezzo-soprano"
+msgstr "S&forzando"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:257
+msgid "Alto"
+msgstr "Alto"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:259
+msgid "Tenor"
+msgstr "Tenor"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:261
+#, fuzzy
+msgid "C-baritone"
+msgstr "Amrywiad"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:263
+#, fuzzy
+msgid "F-baritone"
+msgstr "Amrywiad"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:265
+msgid "Bass"
+msgstr "Bas"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:267
+#, fuzzy
+msgid "Sub-bass"
+msgstr "Bas"
+
+#: ../src/gui/dialogs/CountdownDialog.cpp:52
+#, fuzzy
+msgid "Recording..."
+msgstr "Ail-&raddu..."
+
+#: ../src/gui/dialogs/CountdownDialog.cpp:60
+#, fuzzy
+msgid "Recording time remaining: "
+msgstr "Amser recordio sain ar ol:"
+
+#: ../src/gui/dialogs/CountdownDialog.cpp:120
+msgid "Just how big is your hard disk?"
+msgstr "Faint mor fawr yn union yw'ch disg galed?"
+
+#: ../src/gui/dialogs/CountdownDialog.cpp:154
+#, fuzzy
+msgid "Recording beyond end of composition: "
+msgstr "Amser recordio sain ar ol:"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:52
+msgid "Specify Interval"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:58
+msgid "Reference note:"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:59
+#, fuzzy
+msgid "Target note:"
+msgstr "chwarter nodyn"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:68
+#: ../src/gui/dialogs/IntervalDialog.cpp:315
+msgid "a perfect unison"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:76
+msgid "Effect on Key"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:77
+#, fuzzy
+msgid "Transpose within key"
+msgstr "Trawsgyweirio i'r gywair yma"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:79
+#, fuzzy
+msgid "Change key for selection"
+msgstr "Heb ei newid wrth ddiwedd y ddewisiad:"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:89
+msgid ""
+"Adjust segment transposition in opposite direction (maintain audible pitch)"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:190
+#: ../src/gui/dialogs/IntervalDialog.cpp:220
+msgid "a diminished"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:192
+#: ../src/gui/dialogs/IntervalDialog.cpp:222
+msgid "an augmented"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:194
+#: ../src/gui/dialogs/IntervalDialog.cpp:224
+msgid "a doubly diminished"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:196
+#: ../src/gui/dialogs/IntervalDialog.cpp:226
+msgid "a doubly augmented"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:198
+#: ../src/gui/dialogs/IntervalDialog.cpp:228
+msgid "a triply diminished"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:200
+#: ../src/gui/dialogs/IntervalDialog.cpp:230
+msgid "a triply augmented"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:202
+msgid "a quadruply diminished"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:204
+#: ../src/gui/dialogs/IntervalDialog.cpp:232
+msgid "a quadruply augmented"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:206
+#: ../src/gui/dialogs/IntervalDialog.cpp:234
+msgid "a perfect"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:208
+#: ../src/gui/dialogs/IntervalDialog.cpp:236
+msgid "an (unknown, %1)"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:216
+#, fuzzy
+msgid "a minor"
+msgstr "Cyfuno"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:218
+msgid "a major"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:239
+#, fuzzy
+msgid "an (unknown)"
+msgstr "Anhysbys"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:248
+#: ../src/gui/dialogs/IntervalDialog.cpp:251
+#, fuzzy
+msgid "%1 octave"
+msgstr "I Fyny Wythfed"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:254
+#, fuzzy
+msgid "%1 unison"
+msgstr "Uned"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:258
+#, fuzzy
+msgid "%1 second"
+msgstr "Ail Werth"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:261
+#, fuzzy
+msgid "%1 third"
+msgstr "Arall"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:264
+#, fuzzy
+msgid "%1 fourth"
+msgstr "%1 lleddf"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:267
+#, fuzzy
+msgid "%1 fifth"
+msgstr "Traw:"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:270
+#, fuzzy
+msgid "%1 sixth"
+msgstr "Traw:"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:273
+#, fuzzy
+msgid "%1 seventh"
+msgstr "Ail-feintio Digwyddiad"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:276
+#: ../src/gui/studio/DeviceManagerDialog.cpp:329
+#: ../src/gui/studio/DeviceManagerDialog.cpp:363
+#, fuzzy, c-format
+msgid "%1"
+msgstr "%1%"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:287
+msgid ""
+"_n: up 1 octave and %1\n"
+"up %n octaves and %1"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:291
+#, c-format
+msgid ""
+"_n: up 1 octave\n"
+"up %n octaves"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:295
+#, fuzzy, c-format
+msgid "up %1"
+msgstr "Sain"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:303
+msgid ""
+"_n: down 1 octave and %1\n"
+"down %n octaves and %1"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:307
+#, fuzzy, c-format
+msgid ""
+"_n: down 1 octave\n"
+"down %n octaves"
+msgstr "I lawr Wythfed"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:311
+#, fuzzy, c-format
+msgid "down %1"
+msgstr "Ychwanegu %1"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:81
+msgid "Intrinsics"
+msgstr "Cynhenidion"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:85
+msgid "Event type: "
+msgstr "Math y ddigwyddiad:"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:91
+msgid "Absolute time: "
+msgstr "Amseriad llwyr:"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:101
+msgid "Duration: "
+msgstr "Parhad:"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:114
+msgid "Sub-ordering: "
+msgstr "Is-drefnu:"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:125
+msgid "Persistent properties"
+msgstr "Priodweddau parhaol"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:169
+#: ../src/gui/dialogs/EventEditDialog.cpp:133
+#: ../src/gui/studio/BankEditorDialog.cpp:129
+#: ../src/gui/studio/DeviceEditorDialog.cpp:75
+msgid "Type"
+msgstr "Math"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:184
+#: ../src/gui/dialogs/EventEditDialog.cpp:135
+#: ../src/gui/dialogs/EventParameterDialog.cpp:89
+#: ../src/gui/dialogs/EventParameterDialog.cpp:93
+#: ../src/gui/dialogs/EventParameterDialog.cpp:115
+msgid "Value"
+msgstr "Gwerth"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:155
+msgid "Non-persistent properties"
+msgstr "Priodweddau di-barhaol"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:156
+msgid "These are cached values, lost if the event is modified."
+msgstr "sMae rhain yn werthoedd o'r storfa, a gollir os addasir y digwyddiad."
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:170
+msgid "Name "
+msgstr "Enw"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:172
+msgid "Type "
+msgstr "Math"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:174
+msgid "Value "
+msgstr "Gwerth"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:188
+msgid "Make persistent"
+msgstr "Gwneud yn barhaol"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:292
+msgid "Delete this property"
+msgstr "Dileu'r priodwedd yma"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:433
+#, fuzzy
+msgid ""
+"Are you sure you want to delete the \"%1\" property?\n"
+"\n"
+"Removing necessary properties may cause unexpected behavior."
+msgstr ""
+"Ydych yn sicr yr ydych eisiau dileu'r priodwedd \"%1\"?\n"
+"\n"
+"Gall gwaredu priodweddau angenrheidiol achosi ymddygiad annisgwyl."
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:436
+#: ../src/gui/dialogs/EventEditDialog.cpp:469
+msgid "Edit Event"
+msgstr "Golygu Digwyddiad"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:465
+msgid ""
+"Are you sure you want to make the \"%1\" property persistent?\n"
+"\n"
+"This could cause problems if it overrides a different computed value later "
+"on."
+msgstr ""
+"Ydych yn sicr yr ydych eisiau gwneud y priodwedd \"%1\" yn barhaol?\n"
+"\n"
+"Gall hyn achosi problemau os mae'n newid gwerth gwahanol sydd wedi'i cyfrifo "
+"yn hwyrach."
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:470
+msgid "Make &Persistent"
+msgstr "Gwneud yn &Barhaol"
+
+#: ../src/gui/dialogs/PasteNotationDialog.cpp:52
+msgid "Paste type"
+msgstr "Math gludo"
+
+#: ../src/gui/dialogs/PasteNotationDialog.cpp:72
+msgid "Make this the default paste type"
+msgstr "Gwneud hwn yn fath gludo rhagosodedig"
+
+#: ../src/gui/dialogs/LyricEditDialog.cpp:53
+msgid "Edit Lyrics"
+msgstr "Golygu Geiriau"
+
+#: ../src/gui/dialogs/LyricEditDialog.cpp:62
+msgid "Lyrics for this segment"
+msgstr "Geiriau i'r cylchran yma"
+
+#: ../src/gui/dialogs/LyricEditDialog.cpp:70
+#, fuzzy
+msgid "Add Verse"
+msgstr "Ychwanegu decrescendo..."
+
+#: ../src/gui/dialogs/LyricEditDialog.cpp:84
+#: ../src/gui/dialogs/LyricEditDialog.cpp:106
+#, c-format
+msgid "Verse %1"
+msgstr ""
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:59
+#, fuzzy
+msgid "Import from Device..."
+msgstr "Mewnforio Rhengau oddiwrth Dyfais ..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2163
+#: ../src/gui/application/RosegardenGUIApp.cpp:2229
+#: ../src/gui/application/RosegardenGUIApp.cpp:7780
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:87
+#: ../src/sound/AudioFileManager.cpp:664
+#, c-format
+msgid "Cannot download file %1"
+msgstr "Methu lawrlwytho ffeil %1"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:99
+#, fuzzy, c-format
+msgid "Cannot open file %1"
+msgstr "Methu agor ffeil '%1'"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:106
+#, fuzzy, c-format
+msgid "No devices found in file %1"
+msgstr "Ni chanfuwyd Dyfais yn y ffeil"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:113
+msgid "Source device"
+msgstr "Dyfais tarddiad"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:118
+#, fuzzy
+msgid "Import from: "
+msgstr "Mewnforio Stiwdio o Ffeil"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:140
+#: ../src/gui/studio/DeviceEditorDialog.cpp:148
+#, c-format
+msgid "Device %1"
+msgstr "Dyfais %1"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:155
+#, fuzzy
+msgid "Import banks"
+msgstr "Mewnforio Rhengau"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:156
+#, fuzzy
+msgid "Import key mappings"
+msgstr "Allforio trawstiau"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:157
+#, fuzzy
+msgid "Import controllers"
+msgstr "rheolydd %1"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:160
+msgid "Import device name"
+msgstr "Mewnforio dyfais o'r enw"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:166
+#, fuzzy
+msgid "Bank import behavior"
+msgstr "Ymddygiad mewnforio"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:168
+#, fuzzy
+msgid "Merge banks"
+msgstr "Cyfuno Rhengau"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:169
+#, fuzzy
+msgid "Overwrite banks"
+msgstr "Ysgrifennu dros Rhengau"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:367
+msgid "Bank %1:%2"
+msgstr "Rheng %1:%2"
+
+#: ../src/commands/segment/SegmentSplitByRecordingSrcCommand.cpp:42
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:48
+#, fuzzy
+msgid "Split by Recording Source"
+msgstr "Nid oes offeryn Recordio wedi'i ddewis"
+
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:53
+#, fuzzy
+msgid "Recording Source"
+msgstr "Nid oes offeryn Recordio wedi'i ddewis"
+
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:57
+#, fuzzy
+msgid "Channel:"
+msgstr "Sianel"
+
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:64
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:75
+#, fuzzy
+msgid "any"
+msgstr "Unrhyw"
+
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:69
+#, fuzzy
+msgid "Device:"
+msgstr "Dyfais"
+
+#: ../src/gui/dialogs/UnusedAudioSelectionDialog.cpp:46
+#, fuzzy
+msgid "Select Unused Audio Files"
+msgstr "Dewis Ffeil Sain"
+
+#: ../src/gui/dialogs/UnusedAudioSelectionDialog.cpp:53
+#: ../src/gui/editors/segment/PlayListView.cpp:36
+#, fuzzy
+msgid "File name"
+msgstr "Enw ffeil:"
+
+#: ../src/gui/dialogs/UnusedAudioSelectionDialog.cpp:54
+#, fuzzy
+msgid "File size"
+msgstr "Enw ffeil:"
+
+#: ../src/gui/dialogs/UnusedAudioSelectionDialog.cpp:55
+msgid "Last modified date"
+msgstr ""
+
+#: ../src/gui/dialogs/UnusedAudioSelectionDialog.cpp:60
+msgid " (not found) "
+msgstr ""
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:105
+#, fuzzy
+msgid "Audio File Manager"
+msgstr "Rheolydd Ffeiliau Sain Rosegarden"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:126
+msgid ""
+"* Some audio files are encoded at a sample rate different from that of the "
+"JACK audio server.\n"
+"Rosegarden will play them at the correct speed, but they will sound "
+"terrible.\n"
+"Please consider resampling such files externally, or adjusting the sample "
+"rate of the JACK server."
+msgstr ""
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:132
+#, fuzzy
+msgid "&Add Audio File..."
+msgstr "Ychwanegu Ffeil Sain"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:135
+#, fuzzy
+msgid "&Unload Audio File"
+msgstr "Ychwanegu Ffeil Sain"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:140
+#, fuzzy
+msgid "&Play Preview"
+msgstr "Chwarae Rhagolwg"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:151
+msgid "&Insert into Selected Audio Track"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:155
+#, fuzzy
+msgid "Unload &all Audio Files"
+msgstr "Gwaredu Pob Ffeil Sain"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:159
+#, fuzzy
+msgid "Unload all &Unused Audio Files"
+msgstr "Gwaredu Pob Ffeil Sain"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:163
+#, fuzzy
+msgid "&Delete Unused Audio Files..."
+msgstr "Gwaredu Pob Ffeil Sain"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:167
+#, fuzzy
+msgid "&Export Audio File..."
+msgstr "Allforio Ffeil Sain"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:173
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:180
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:91
+msgid "Duration"
+msgstr "Parhad"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:181
+msgid "Envelope"
+msgstr "Amlen"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:182
+msgid "Sample rate"
+msgstr "Graddfa samplo"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:183
+msgid "Channels"
+msgstr "Sianeli"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:282
+msgid "<no audio files>"
+msgstr "<dim ffeil sain>"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:488
+msgid "*.wav|WAV files (*.wav)"
+msgstr "ffeiliau *.wav|WAV (*.wav)"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:489
+msgid "Choose a name to save this file as"
+msgstr "Dewis enw i gadw'r ffeil"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:499
+msgid "Exporting audio file..."
+msgstr "Allforio ffeil sain ..."
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:609
+#, fuzzy
+msgid ""
+"This will unload audio file \"%1\" and remove all associated segments. Are "
+"you sure?"
+msgstr "Wir ddileu ffeil sain \"%1\" a pob cylchran sain sy'n ymwneud a fo?"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:692
+#, fuzzy
+msgid ""
+"*.wav|WAV files (*.wav)\n"
+"*.*|All files"
+msgstr "ffeiliau *.wav|WAV (*.wav)"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:697
+msgid ""
+"*.wav *.flac *.ogg *.mp3|Audio files (*.wav *.flac *.ogg *.mp3)\n"
+"*.wav|WAV files (*.wav)\n"
+"*.flac|FLAC files (*.flac)\n"
+"*.ogg|Ogg files (*.ogg)\n"
+"*.mp3|MP3 files (*.mp3)\n"
+"*.*|All files"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:704
+#, fuzzy
+msgid "Select one or more audio files"
+msgstr "Dewis un neu mwy o Ffeiliau Sain"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:763
+msgid ""
+"This will unload all audio files and remove their associated segments.\n"
+"This action cannot be undone, and associations with these files will be "
+"lost.\n"
+"Files will not be removed from your disk.\n"
+"Are you sure?"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:800
+msgid ""
+"This will unload all audio files that are not associated with any segments "
+"in this composition.\n"
+"This action cannot be undone, and associations with these files will be "
+"lost.\n"
+"Files will not be removed from your disk.\n"
+"Are you sure?"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:865
+msgid ""
+"The following audio files are not used in the current composition.\n"
+"\n"
+"Please select the ones you wish to delete permanently from the hard disk.\n"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:875
+#, c-format
+msgid ""
+"_n: <qt>About to delete 1 audio file permanently from the hard disk.<br>This "
+"action cannot be undone, and there will be no way to recover this file."
+"<br>Are you sure?</qt>\n"
+"\n"
+"<qt>About to delete %n audio files permanently from the hard disk.<br>This "
+"action cannot be undone, and there will be no way to recover these files."
+"<br>Are you sure?</qt>"
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:525
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:888
+#, fuzzy
+msgid "File %1 could not be deleted."
+msgstr "Nid yw'r ffeil penodol mewn bod"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:921
+msgid "Change Audio File label"
+msgstr "Newid label y Ffeil Sain"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:6466
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:922
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:1099
+msgid "Enter new label"
+msgstr "Mewnosod label newydd"
+
+#: ../src/gui/application/RosegardenGUIView.cpp:1538
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:1086
+#, fuzzy
+msgid "Adding audio file..."
+msgstr "Allforio ffeil sain ..."
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:1107
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:1112
+#, fuzzy
+msgid "Failed to add audio file. "
+msgstr "Methodd y dilyniannydd ychwanegu ffeil sain %1"
+
+#: ../src/document/RosegardenGUIDoc.cpp:2789
+#: ../src/gui/application/RosegardenGUIApp.cpp:2736
+#: ../src/gui/application/RosegardenGUIView.cpp:1574
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:1122
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:180
+msgid "Generating audio preview..."
+msgstr "Creu rhagolwg sain ...."
+
+#: ../src/gui/application/RosegardenGUIView.cpp:1581
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:1130
+msgid ""
+"Try copying this file to a directory where you have write permission and re-"
+"add it"
+msgstr ""
+"Ceisiwch copio'r ffeil yma i gyfeiriadur lle mae ganddoch ganiatadau "
+"ysgrifennu, a'i ail-ychwanegu."
+
+#: ../src/gui/dialogs/TransportDialog.cpp:90 rc.cpp:357
+#, no-c-format
+msgid "Rosegarden Transport"
+msgstr "Cludiant Rosegarden"
+
+#: ../src/gui/dialogs/TransportDialog.cpp:925
+#: ../src/gui/dialogs/TransportDialog.cpp:985
+msgid "PITCH WHEEL"
+msgstr "OLWYN TRAW"
+
+#: ../src/gui/dialogs/TransportDialog.cpp:929
+#: ../src/gui/dialogs/TransportDialog.cpp:989
+msgid "CONTROLLER"
+msgstr "RHEOLYDD"
+
+#: ../src/gui/dialogs/TransportDialog.cpp:933
+#: ../src/gui/dialogs/TransportDialog.cpp:993
+msgid "PROG CHNGE"
+msgstr "NEWID RHAGLEN"
+
+#: ../src/gui/dialogs/TransportDialog.cpp:938
+#: ../src/gui/dialogs/TransportDialog.cpp:998
+msgid "PRESSURE"
+msgstr "GWASGEDD"
+
+#: ../src/gui/dialogs/TransportDialog.cpp:942
+#: ../src/gui/dialogs/TransportDialog.cpp:1002
+#, fuzzy
+msgid "SYS MESSAGE"
+msgstr "CYFYNG CYSAWD"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:177
+#: ../src/gui/dialogs/QuantizeDialog.cpp:40
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:127
+msgid "Quantize"
+msgstr "Cwanteiddio"
+
+#: ../src/gui/dialogs/QuantizeDialog.cpp:52
+msgid "Advanced"
+msgstr ""
+
+#: ../src/gui/dialogs/ExportDeviceDialog.cpp:42
+#, fuzzy
+msgid "Export Devices..."
+msgstr "Allforio Dyfais fel ..."
+
+#: ../src/gui/dialogs/ExportDeviceDialog.cpp:47
+#, fuzzy
+msgid "Export devices"
+msgstr "Allforio Dyfais fel ..."
+
+#: ../src/gui/dialogs/ExportDeviceDialog.cpp:49
+#, fuzzy
+msgid "Export all devices"
+msgstr "Allforio Dyfais fel ..."
+
+#: ../src/gui/dialogs/ExportDeviceDialog.cpp:50
+msgid "Export selected device only"
+msgstr ""
+
+#: ../src/gui/dialogs/ExportDeviceDialog.cpp:51
+msgid " (\"%1\")"
+msgstr ""
+
+#: ../src/gui/dialogs/CompositionLengthDialog.cpp:44
+msgid "Change Composition Length"
+msgstr "Newid Hyd y Cyfansoddiad"
+
+#: ../src/gui/dialogs/CompositionLengthDialog.cpp:50
+msgid "Set the Start and End bar markers for this Composition"
+msgstr "Gosod nodwyr Dechrau a Diwedd y bar am y Cyfansoddiad yma"
+
+#: ../src/gui/dialogs/CompositionLengthDialog.cpp:54
+msgid "Start Bar"
+msgstr "Bar Dechrau"
+
+#: ../src/gui/dialogs/CompositionLengthDialog.cpp:62
+msgid "End Bar"
+msgstr "Bar Diwedd"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:62
+#, fuzzy
+msgid "LilyPond Export/Preview"
+msgstr "Lilypond"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:85
+#, fuzzy
+msgid "General options"
+msgstr "Ffurfweddiad Cyffredinol"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:90
+#, fuzzy
+msgid "Advanced options"
+msgstr "Dangos &Anodiadau"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:112
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:95
+msgid "Headers"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:106
+msgid "Basic options"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:113
+msgid "Compatibility level"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:117
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:118
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:119
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:120
+#, fuzzy, c-format
+msgid "LilyPond %1"
+msgstr "Lilypond"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:125
+#, fuzzy
+msgid "Paper size"
+msgstr "Agor Ffeil"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:129
+msgid "A3"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:130
+msgid "A4"
+msgstr "A4"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:131
+msgid "A5"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:132
+msgid "A6"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:133
+msgid "Legal"
+msgstr "Cyfreithiol"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:134
+msgid "US Letter"
+msgstr "Llythyr UD"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:135
+msgid "Tabloid"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:136
+msgid "do not specify"
+msgstr "dim penodi"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:152
+#, fuzzy
+msgid "Font size"
+msgstr "Enw ffeil:"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:157
+#, fuzzy
+msgid "%1 pt"
+msgstr "%1 (rhan)"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:169
+#, fuzzy
+msgid "Staff level options"
+msgstr "Dangos &Anodiadau"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:176
+#, fuzzy
+msgid "Export content"
+msgstr "Allforio Dyfais fel ..."
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:179
+#, fuzzy
+msgid "All tracks"
+msgstr "Ymladd"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:180
+#, fuzzy
+msgid "Non-muted tracks"
+msgstr "Ymladd"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:181
+#, fuzzy
+msgid "Selected track"
+msgstr "Dewis Trac &Nesaf"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:182
+#, fuzzy
+msgid "Selected segments"
+msgstr "Dewis &Pob Cylchran"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:188
+msgid "Merge tracks that have the same name"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:198
+#, fuzzy
+msgid "Notation options"
+msgstr "Paramedrau Nodiant"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:206
+#, fuzzy
+msgid "First"
+msgstr "saib"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:207
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:538
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:557
+msgid "All"
+msgstr "Popeth"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:211
+msgid "Export tempo marks "
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:215
+#, fuzzy
+msgid "Export lyrics"
+msgstr "Allforio \\blociau geiriau"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:225
+msgid "Export beamings"
+msgstr "Allforio trawstiau"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:232
+msgid "Export track staff brackets"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:244
+#, fuzzy
+msgid "Layout options"
+msgstr "Maint ffont Lilypad"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:257
+#, fuzzy
+msgid "Lyrics alignment"
+msgstr "Geiriau i'r cylchran yma"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:261
+msgid "Ragged bottom (systems will not be spread vertically across the page)"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:267
+msgid "Miscellaneous options"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:274
+msgid "Enable \"point and click\" debugging"
+msgstr "Alluogi dat-namu \"pwytio a clicio\""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:279
+msgid "Export \\midi block"
+msgstr "Allforio \\bloc midi"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:284
+#, fuzzy
+msgid "No markers"
+msgstr "&Gwaredu Pob Arwydd"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:285
+#, fuzzy
+msgid "Rehearsal marks"
+msgstr "&Gwaredu Pob Arwydd"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:286
+#, fuzzy
+msgid "Marker text"
+msgstr "Amser yr arwydd"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:290
+#, fuzzy
+msgid "Export markers"
+msgstr "Allforio fel..."
+
+#: ../src/gui/dialogs/AudioSplitDialog.cpp:57
+msgid "Autosplit Audio Segment"
+msgstr "Hunan-hollti Cylchran Sain"
+
+#: ../src/gui/dialogs/AudioSplitDialog.cpp:70
+msgid "AutoSplit Segment \""
+msgstr "Hunan-Hollti Cylchran\""
+
+#: ../src/gui/dialogs/AudioSplitDialog.cpp:84
+msgid "Threshold"
+msgstr "Trothwy"
+
+#: ../src/gui/dialogs/AudioSplitDialog.cpp:142
+msgid "<no preview generated for this audio file>"
+msgstr "<ni chreuwyd rhagolwg i'r ffeil sain yma>"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:70
+msgid "Audio Plugin"
+msgstr "Ategyn Sain"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:94
+#: ../src/gui/widgets/AudioFaderBox.cpp:136
+#, fuzzy
+msgid "Editor"
+msgstr "Golygu"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:100
+msgid "Plugin"
+msgstr "Ategyn"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:105
+msgid "Category:"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:110
+#, fuzzy
+msgid "Plugin:"
+msgstr "Ategyn"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:114
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:398
+msgid "Select a plugin from this list."
+msgstr "Dewis ategyn o'r rhestr yma."
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:119
+msgid "Bypass"
+msgstr "Osgoi"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:121
+msgid "Bypass this plugin."
+msgstr "Osgoi'r ategyn yma."
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:127
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:390
+msgid "<ports>"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:130
+msgid "Input and output port counts."
+msgstr ""
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:132
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:391
+msgid "<id>"
+msgstr "<id>"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:135
+msgid "Unique ID of plugin."
+msgstr "ID unigryw yr ategyn."
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:149
+#, fuzzy
+msgid "Copy plugin parameters"
+msgstr "Paramedrau Nodiant"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:155
+#, fuzzy
+msgid "Paste plugin parameters"
+msgstr "Paramedrau Nodiant"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:161
+#, fuzzy
+msgid "Set to defaults"
+msgstr "Gosod Tempo Eang a Rhagosodedig"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:225
+msgid "(any)"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:226
+#, fuzzy
+msgid "(unclassified)"
+msgstr "di-derfyn"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:247
+msgid "(none)"
+msgstr "(dim)"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:389
+#: ../src/gui/editors/parameters/AudioInstrumentParameterPanel.cpp:132
+#: ../src/gui/editors/parameters/AudioInstrumentParameterPanel.cpp:361
+#: ../src/gui/studio/AudioMixerWindow.cpp:685
+#: ../src/gui/studio/AudioMixerWindow.cpp:724
+#: ../src/gui/studio/AudioMixerWindow.cpp:906
+#: ../src/gui/widgets/AudioFaderBox.cpp:79
+msgid "<no plugin>"
+msgstr "<dim ategyn>"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:427
+msgid "This plugin has too many controls to edit here."
+msgstr ""
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:438
+#, fuzzy, c-format
+msgid "Id: %1"
+msgstr "Ychwanegu %1"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:490
+msgid "mono"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:492
+msgid "stereo"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:494
+msgid "%1 in, %2 out"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:518
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:704
+#, fuzzy
+msgid "Program: "
+msgstr "Rhaglen"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:522
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:532
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:708
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:716
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:745
+#, fuzzy
+msgid "<none selected>"
+msgstr "<dim digwyddiadau>"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:56
+msgid "Set the %1 property of the event selection:"
+msgstr "Gosod priodwedd %1 y dewisiad digwyddiad:"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:61
+msgid "Pattern"
+msgstr "Patrwm"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:66
+msgid "Flat - set %1 to value"
+msgstr "Lleddf - gosod %1 i'r gwerth"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:70
+msgid "Alternating - set %1 to max and min on alternate events"
+msgstr "Eiledu - gosod %1 i'r mwyaf a'r lleiaf ar bob yn ail ddigwyddiad"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:74
+msgid "Crescendo - set %1 rising from min to max"
+msgstr "Crescendo - gosod %1 i godi o'r lleiaf i'r mwyaf"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:78
+msgid "Diminuendo - set %1 falling from max to min"
+msgstr "Diminuendo - gosod %1 i syrthio o'r mwyaf i'r lleiaf"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:82
+msgid "Ringing - set %1 alternating from max to min with both dying to zero"
+msgstr ""
+"Atseinio - gosod %1 i fynd bob yn ail o'r mwyaf i'r lleiaf, efo'r dau yn "
+"distewi i sero"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:123
+#: ../src/gui/dialogs/EventParameterDialog.cpp:150
+msgid "First Value"
+msgstr "Gwerth Cyntaf"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:124
+#: ../src/gui/dialogs/EventParameterDialog.cpp:151
+msgid "Second Value"
+msgstr "Ail Werth"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:132
+#: ../src/gui/dialogs/EventParameterDialog.cpp:142
+#, fuzzy
+msgid "Low Value"
+msgstr "Gwerth LSB"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:133
+#: ../src/gui/dialogs/EventParameterDialog.cpp:141
+#, fuzzy
+msgid "High Value"
+msgstr "Gwerth Cyntaf"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:56 ../src/gui/rulers/TempoRuler.cpp:127
+msgid "Insert Tempo Change"
+msgstr "Mewnosod Newid Tempo"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:69
+#, fuzzy
+msgid "New tempo:"
+msgstr "Tempo newydd"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:76
+msgid "Tap"
+msgstr ""
+
+#: ../src/gui/dialogs/TempoDialog.cpp:81
+#, fuzzy
+msgid "Tempo is fixed until the following tempo change"
+msgstr "Nodau mewn bod ar ol newid cywair"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:82
+#, fuzzy
+msgid "Tempo ramps to the following tempo"
+msgstr "Nodau mewn bod ar ol newid cywair"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:83
+#, fuzzy
+msgid "Tempo ramps to:"
+msgstr "Tempo wrth amser"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:120
+#, fuzzy
+msgid "Time of tempo change"
+msgstr "Nid oes newidiadau tempo eraill."
+
+#: ../src/gui/dialogs/TempoDialog.cpp:138
+msgid "The pointer is currently at "
+msgstr "Ar hyn o bryd mae'r pwyntydd wrth"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:154
+msgid "Apply this tempo from here onwards"
+msgstr "Gweithredu'r tempo yma o hyn ymlaen"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:158
+msgid "Replace the last tempo change"
+msgstr "Amnewid y newid tempo diwethaf"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:164
+msgid "Apply this tempo from the start of this bar"
+msgstr "Gweithredu'r tempo yma o ddechrau'r bar yma"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:167
+msgid "Apply this tempo to the whole composition"
+msgstr "Gweithredu'r tempo yma i'r holl gyfansoddiad"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:172
+msgid "Also make this the default tempo"
+msgstr "Hefyd, gwneud hyn yn dempo rhagosodedig"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:256
+msgid "%1.%2 s,"
+msgstr "%1.%2 s,"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:262
+#, c-format
+msgid "at the start of measure %1."
+msgstr "wrth ddechrau'r measure %1."
+
+#: ../src/gui/dialogs/TempoDialog.cpp:266
+#, c-format
+msgid "in the middle of measure %1."
+msgstr "yng nghanol measure %1."
+
+#: ../src/gui/dialogs/TempoDialog.cpp:285
+#, fuzzy
+msgid " (at %1.%2 s, in measure %3)"
+msgstr " (wrth %1.%2 s, mewn bar %3)"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:302
+msgid "There are no preceding tempo changes."
+msgstr "Nid oes newidiadau tempo cyn hyn."
+
+#: ../src/gui/dialogs/TempoDialog.cpp:310
+msgid "There are no other tempo changes."
+msgstr "Nid oes newidiadau tempo eraill."
+
+#: ../src/gui/dialogs/TempoDialog.cpp:328
+msgid " bpm"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioPlayingDialog.cpp:42
+msgid "Playing audio file"
+msgstr "Yn chwarae ffeil sain"
+
+#: ../src/gui/dialogs/AudioPlayingDialog.cpp:47
+msgid "Playing audio file \"%1\""
+msgstr "Yn chwarae ffeil sain \"%1\""
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:52
+#: ../src/gui/editors/matrix/MatrixView.cpp:2655
+#, fuzzy
+msgid "Trigger Segment"
+msgstr "Dileu Cylchran"
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:61
+#, fuzzy
+msgid "Trigger segment: "
+msgstr "Dileu Cylchran"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:59
+msgid "Key Change"
+msgstr "Newid Allwedd"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:77
+msgid "Key signature"
+msgstr "Arwydd cywair"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:80
+#, fuzzy
+msgid "Key transposition"
+msgstr "Cysoni"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:86
+msgid "Existing notes following key change"
+msgstr "Nodau mewn bod ar ol newid cywair"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:98
+msgid "Flatten"
+msgstr "Lleddfu"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:100
+msgid "Key"
+msgstr "Cywair"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:105
+msgid "Sharpen"
+msgstr "Meinhau"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:109
+msgid "Major"
+msgstr ""
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:110
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:369
+#, fuzzy
+msgid "Minor"
+msgstr "Cyfuno"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:123
+msgid "Transpose key according to segment transposition"
+msgstr ""
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:126
+msgid "Use specified key. Do not transpose"
+msgstr ""
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:134
+msgid "Apply to current segment only"
+msgstr "Gweithredu i'r cylchran gyfredol yn unig"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:137
+msgid "Apply to all segments at this time"
+msgstr "Gweithredu i bob cylchran wrth yr amser yma"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:141
+msgid "Exclude percussion segments"
+msgstr ""
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:155
+msgid "Maintain current accidentals"
+msgstr "Cynnal hapnodau cyfredol"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:158
+msgid "Transpose into this key"
+msgstr "Trawsgyweirio i'r gywair yma"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:331
+msgid "No such key"
+msgstr "Dim cywair o'r fath"
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:44
+#: ../src/gui/editors/notation/NotationSelector.cpp:118
+msgid "Interpret"
+msgstr "Dehongli"
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:50
+msgid "Interpretations to apply"
+msgstr "Dehongliadau i weithredu"
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:53
+msgid "Apply text dynamics (p, mf, ff etc)"
+msgstr "Gweithredu deinameg testun (p, mf, ff, ayyb)"
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:55
+msgid "Apply hairpin dynamics"
+msgstr "Gweithredu deinameg bachdro"
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:57
+msgid "Stress beats"
+msgstr "Pwysleisio curiadau"
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:59
+msgid "Articulate slurs, staccato, tenuto etc"
+msgstr "Seinio llithriadau, staccato, tenuto, ayyb"
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:61
+msgid "All available interpretations"
+msgstr "Pob dehongliad sydd ar gael"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:316
+#, fuzzy
+msgid ""
+"Attempted to launch JACK audio daemon failed. Audio will be disabled.\n"
+"Please check configuration (Settings -> Configure Rosegarden -> Audio -> "
+"Startup)\n"
+" and restart."
+msgstr ""
+"Methwyd cais i ymgychwyn yr ellyll sain JACK. Analluogir sain.\n"
+"Gwiriwch eich ffurfweddiad (Gosodiadau -> Ffurfweddu Rosegarden -> "
+"Dilyniannydd -> Rheoli JACK)\n"
+"ac ail-ddechreuwch."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:325
+msgid "Starting sequencer..."
+msgstr "Dechrau dilyniannydd..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:333
+#, fuzzy
+msgid "Initializing plugin manager..."
+msgstr "Ymgychwyn rheolydd ategynnau..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:338
+#, fuzzy
+msgid "Initializing view..."
+msgstr "Ymgychwyn golwg..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:354
+#, fuzzy
+msgid "Special Parameters"
+msgstr "Paramedrau Cylchrannau"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:430
+msgid "Starting sequence manager..."
+msgstr "Cychwyn rheolydd dilyniannydd..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:456
+msgid "Clearing studio data..."
+msgstr "Gwaredu data stiwdio..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:475
+#: ../src/gui/editors/notation/NotationView.cpp:558
+msgid "Starting..."
+msgstr "Dechrau..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:556
+#, fuzzy
+msgid "Import Rosegarden &Project file..."
+msgstr "Mewnforio ffeil &Rosegarden 2.1..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:560
+msgid "Import &MIDI file..."
+msgstr "Mewnforio ffeil &MIDI..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:564
+msgid "Import &Rosegarden 2.1 file..."
+msgstr "Mewnforio ffeil &Rosegarden 2.1..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:568
+#, fuzzy
+msgid "Import &Hydrogen file..."
+msgstr "Mewnforio ffeil &Rosegarden 2.1..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:572
+msgid "Merge &File..."
+msgstr "Cyfuno &Ffeil..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:576
+msgid "Merge &MIDI file..."
+msgstr "Cyfuno ffeil &MIDI..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:580
+msgid "Merge &Rosegarden 2.1 file..."
+msgstr "Cyfuno ffeil &Rosegarden 2.1..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:584
+#, fuzzy
+msgid "Merge &Hydrogen file..."
+msgstr "Mewnforio ffeil &Rosegarden 2.1..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:588
+#, fuzzy
+msgid "Export Rosegarden &Project file..."
+msgstr "Mewnforio ffeil &Rosegarden 2.1..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:592
+msgid "Export &MIDI file..."
+msgstr "Allforio ffeil &MIDI..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:596
+#, fuzzy
+msgid "Export &LilyPond file..."
+msgstr "Allforio ffeil &Lilypond..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:600
+msgid "Export Music&XML file..."
+msgstr "Allforio ffeil Music&XML..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:604
+msgid "Export &Csound score file..."
+msgstr "Allforio ffeil sgor &Csound..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:608
+msgid "Export M&up file..."
+msgstr "Allforio ffeil &Mup..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:612
+#: ../src/gui/editors/notation/NotationView.cpp:1500
+#, fuzzy
+msgid "Print &with LilyPond..."
+msgstr "Allforio ffeil Lilypond..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:616
+#: ../src/gui/editors/notation/NotationView.cpp:1504
+#, fuzzy
+msgid "Preview with Lil&yPond..."
+msgstr "Allforio ffeil Lilypond..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:620
+#, fuzzy
+msgid "Play&list"
+msgstr "Chwarae"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:627
+#, fuzzy
+msgid "Rosegarden &Tutorial"
+msgstr "Rosegarden"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:631
+msgid "&Bug Reporting Guidelines"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:645
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:348
+#: ../src/gui/editors/segment/MarkerEditor.cpp:378
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:388
+#: ../src/gui/general/EditViewBase.cpp:190
+#: ../src/gui/studio/BankEditorDialog.cpp:318
+#: ../src/gui/studio/DeviceManagerDialog.cpp:227
+msgid "Und&o"
+msgstr "Da&twneud"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:651
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:354
+#: ../src/gui/editors/segment/MarkerEditor.cpp:384
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:394
+#: ../src/gui/general/EditViewBase.cpp:196
+#: ../src/gui/studio/BankEditorDialog.cpp:324
+#: ../src/gui/studio/DeviceManagerDialog.cpp:233
+msgid "Re&do"
+msgstr "Ail&wneud"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:665
+#: ../src/gui/editors/notation/NotationView.cpp:2297
+msgid "Show T&ools Toolbar"
+msgstr "Dangos Bar &Offer"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:669
+msgid "Show Trac&ks Toolbar"
+msgstr "Dangos Bar Tra&ciau"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:673
+msgid "Show &Editors Toolbar"
+msgstr "Dangos Bar &Golygyddion"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:677
+#: ../src/gui/editors/notation/NotationView.cpp:2309
+msgid "Show Trans&port Toolbar"
+msgstr "Dangos Bar C&ludydd"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:681
+msgid "Show &Zoom Toolbar"
+msgstr "Dangos Bar Ch&wyddo"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:688
+msgid "Show Tra&nsport"
+msgstr "Dangos Clu&diant"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:693
+msgid "Show Track &Labels"
+msgstr "Dangos &Labeli Trac"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:698
+#, fuzzy
+msgid "Show Playback Position R&uler"
+msgstr "Pwyntydd Chwarae i'r &Cyrchydd"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:703
+msgid "Show Te&mpo Ruler"
+msgstr "Dangos Rhesydd Te&mpo"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:708
+msgid "Show Cho&rd Name Ruler"
+msgstr "Dangos Rhesydd Enwau Co&rdiau"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:714
+msgid "Show Segment Pre&views"
+msgstr "Dangos Rha&golygon Cylchrannau"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:719
+#, fuzzy
+msgid "Show Special &Parameters"
+msgstr "Dangos Paramedrau &Offerynnau"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:753
+#: ../src/gui/editors/matrix/MatrixView.cpp:641
+#: ../src/gui/editors/notation/NotationView.cpp:1772
+#, fuzzy
+msgid "&Select and Edit"
+msgstr "Dewis i Ddi&wedd"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:758
+#: ../src/gui/editors/matrix/MatrixView.cpp:646
+msgid "&Draw"
+msgstr "&Dylunio"
+
+#: ../src/commands/edit/EraseCommand.h:50
+#: ../src/gui/application/RosegardenGUIApp.cpp:763
+#: ../src/gui/editors/matrix/MatrixView.cpp:651
+#: ../src/gui/editors/notation/NotationView.cpp:1766
+msgid "&Erase"
+msgstr "&Dileu"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:768
+#: ../src/gui/editors/matrix/MatrixView.cpp:656
+msgid "&Move"
+msgstr "&Symud"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:775
+msgid "&Resize"
+msgstr "&Ail-feintio"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:782 rc.cpp:87
+#, no-c-format
+msgid "&Split"
+msgstr "&Hollti"
+
+#: ../src/commands/segment/SegmentJoinCommand.h:53
+#: ../src/gui/application/RosegardenGUIApp.cpp:789
+msgid "&Join"
+msgstr "&Uno"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:795
+msgid "&Harmonize"
+msgstr "&Cydgordio"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:806
+#: ../src/gui/rulers/TempoRuler.cpp:157
+#, fuzzy
+msgid "Open Tempo and Time Signature Editor"
+msgstr "Agor yn y Golygydd Digwyddiadau"
+
+#: ../src/commands/segment/CutRangeCommand.cpp:41
+#: ../src/gui/application/RosegardenGUIApp.cpp:812
+#, fuzzy
+msgid "Cut Range"
+msgstr "To&rri a Cau"
+
+#: ../src/commands/edit/CopyCommand.cpp:73
+#: ../src/gui/application/RosegardenGUIApp.cpp:816
+#, fuzzy
+msgid "Copy Range"
+msgstr "Newid Allwedd"
+
+#: ../src/commands/segment/PasteRangeCommand.cpp:45
+#: ../src/gui/application/RosegardenGUIApp.cpp:820
+#, fuzzy
+msgid "Paste Range"
+msgstr "Math gludo"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:828
+#, fuzzy
+msgid "Insert Range..."
+msgstr "Mewnosod Saib"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:832
+#: ../src/gui/editors/notation/NotationView.cpp:1804
+msgid "De&lete"
+msgstr "Di&leu"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:836
+msgid "Select &All Segments"
+msgstr "Dewis &Pob Cylchran"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:852
+#, fuzzy
+msgid "Edit Mar&kers..."
+msgstr "Golygu Arwyddion..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:856
+msgid "Edit Document P&roperties..."
+msgstr "Golygu Priod&weddau'r Ddogfen..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:864
+msgid "Open in &Default Editor"
+msgstr "Agor yn y &Golygydd Rhagosodedig"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:870
+#: ../src/gui/general/EditViewBase.cpp:206
+msgid "Open in Matri&x Editor"
+msgstr "Agor yn y Golygydd Matric&s"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:876
+#: ../src/gui/general/EditViewBase.cpp:212
+#, fuzzy
+msgid "Open in &Percussion Matrix Editor"
+msgstr "Agor yn y Golygydd Matric&s"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:882
+#: ../src/gui/general/EditViewBase.cpp:218
+msgid "Open in &Notation Editor"
+msgstr "Agor yn y Golygydd &Nodiant"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:888
+#: ../src/gui/general/EditViewBase.cpp:224
+msgid "Open in &Event List Editor"
+msgstr "Agor yn y Golygydd &Rhestr Digwyddiadau"
+
+#: ../src/commands/edit/EventQuantizeCommand.cpp:120
+#: ../src/commands/edit/EventUnquantizeCommand.cpp:87
+#: ../src/gui/application/RosegardenGUIApp.cpp:894
+msgid "&Quantize..."
+msgstr "Cw&anteiddio..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:908
+#: ../src/gui/editors/matrix/MatrixView.cpp:686
+msgid "Repeat Last Quantize"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:928
+#, fuzzy
+msgid "Split at Time..."
+msgstr "Dechrau..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:932
+#: ../src/gui/general/EditView.cpp:796
+msgid "Jog &Left"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:936
+#: ../src/gui/general/EditView.cpp:800
+msgid "Jog &Right"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:940
+#, fuzzy
+msgid "Set Start Time..."
+msgstr "Dechrau..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:944
+#, fuzzy
+msgid "Set Duration..."
+msgstr "Parhad"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:953
+msgid "Turn Re&peats into Copies"
+msgstr "Trosi Aila&droddion i mewn i Gopiau"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:958
+#, fuzzy
+msgid "Manage Tri&ggered Segments"
+msgstr "Rheoli Cylchrannau &Sain"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:962
+#, fuzzy
+msgid "Set Tempos from &Beat Segment"
+msgstr "Gosod &Tempo i Barhad Cylchran Sain"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:966
+msgid "Set &Tempo to Audio Segment Duration"
+msgstr "Gosod &Tempo i Barhad Cylchran Sain"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:972
+#, fuzzy
+msgid "Manage A&udio Files"
+msgstr "Newid label y Ffeil Sain"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:977
+#, fuzzy
+msgid "Show Segment Labels"
+msgstr "Addasu label Cylchran"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:986
+#, fuzzy
+msgid "Add &Track"
+msgstr "Ychwanegu Traciau..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:990
+#, fuzzy
+msgid "&Add Tracks..."
+msgstr "Ychwanegu Traciau..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:996
+#, fuzzy
+msgid "D&elete Track"
+msgstr "&Dileu Trac"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1002
+msgid "Move Track &Down"
+msgstr "Symud Trac i &Lawr"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1008
+msgid "Move Track &Up"
+msgstr "Symud Trac i &Fyny"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1012
+msgid "Select &Next Track"
+msgstr "Dewis Trac &Nesaf"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1017
+msgid "Select &Previous Track"
+msgstr "Dewis Trac &Blaenorol"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1022
+#, fuzzy
+msgid "Mute or Unmute Track"
+msgstr "Ymladd"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1027
+msgid "Arm or Un-arm Track for Record"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1034
+#, fuzzy
+msgid "&Mute all Tracks"
+msgstr "Ymladd"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1040
+msgid "&Unmute all Tracks"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1044
+msgid "&Remap Instruments..."
+msgstr "&Ail-fapio Offerynnau..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1053
+#, fuzzy
+msgid "&Audio Mixer"
+msgstr "Pylydd Sain"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1059
+#, fuzzy
+msgid "Midi Mi&xer"
+msgstr "Pylydd Sain"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1065
+#, fuzzy
+msgid "Manage MIDI &Devices"
+msgstr "Rheoli Dyfeisiau MIDI"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1071
+msgid "Manage S&ynth Plugins"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1075
+#, fuzzy
+msgid "Modify MIDI &Filters"
+msgstr "Addasu &Hidlau MIDI..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1079
+msgid "MIDI Thru Routing"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1085
+#, fuzzy
+msgid "Manage &Metronome"
+msgstr "Metronom"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1089
+msgid "&Save Current Document as Default Studio"
+msgstr "&Cadw'r Ddogfen Gyfredol fel Stiwdio Rhagosodedig"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1093
+msgid "&Import Default Studio"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1097
+#, fuzzy
+msgid "Im&port Studio from File..."
+msgstr "&Mewnforio Stiwdio o Ffeil..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1101
+msgid "&Reset MIDI Network"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1105
+#, fuzzy
+msgid "Set Quick Marker at Playback Position"
+msgstr "Mewnosod Newid Tempo"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1109
+msgid "Jump to Quick Marker"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1142
+#: ../src/gui/editors/matrix/MatrixView.cpp:782
+#: ../src/gui/editors/notation/NotationView.cpp:2397
+#: ../src/gui/studio/AudioMixerWindow.cpp:105
+#: ../src/gui/studio/MidiMixerWindow.cpp:81
+msgid "&Play"
+msgstr "&Chwarae"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1153
+#: ../src/gui/editors/matrix/MatrixView.cpp:791
+#: ../src/gui/editors/notation/NotationView.cpp:2406
+#: ../src/gui/studio/AudioMixerWindow.cpp:114
+#: ../src/gui/studio/MidiMixerWindow.cpp:90
+msgid "&Stop"
+msgstr "&Aros"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1160
+#: ../src/gui/editors/matrix/MatrixView.cpp:802
+#: ../src/gui/editors/notation/NotationView.cpp:2417
+#: ../src/gui/studio/AudioMixerWindow.cpp:125
+#: ../src/gui/studio/MidiMixerWindow.cpp:101
+msgid "&Fast Forward"
+msgstr "&Brys Ymlaen "
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1168
+#: ../src/gui/editors/matrix/MatrixView.cpp:796
+#: ../src/gui/editors/notation/NotationView.cpp:2411
+#: ../src/gui/studio/AudioMixerWindow.cpp:119
+#: ../src/gui/studio/MidiMixerWindow.cpp:95
+msgid "Re&wind"
+msgstr "Ail-&ddirwyn"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1175
+msgid "P&unch in Record"
+msgstr "Recordio gan Ddisg&yn i Mewn"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1182
+#: ../src/gui/studio/AudioMixerWindow.cpp:143
+#: ../src/gui/studio/MidiMixerWindow.cpp:119
+msgid "&Record"
+msgstr "&Recordio"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1189
+#: ../src/gui/editors/matrix/MatrixView.cpp:808
+#: ../src/gui/editors/notation/NotationView.cpp:2423
+#: ../src/gui/studio/AudioMixerWindow.cpp:131
+#: ../src/gui/studio/MidiMixerWindow.cpp:107
+msgid "Rewind to &Beginning"
+msgstr "Ail-ddirwyn i'r &Dechrau"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1196
+#: ../src/gui/editors/matrix/MatrixView.cpp:814
+#: ../src/gui/editors/notation/NotationView.cpp:2429
+#: ../src/gui/studio/AudioMixerWindow.cpp:137
+#: ../src/gui/studio/MidiMixerWindow.cpp:113
+msgid "Fast Forward to &End"
+msgstr "Brys Ymlaen i'r Diw&edd"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1203
+#: ../src/gui/editors/matrix/MatrixView.cpp:832
+#: ../src/gui/editors/notation/NotationView.cpp:2447
+msgid "Scro&ll to Follow Playback"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1209
+#: ../src/gui/editors/matrix/MatrixView.cpp:838
+#: ../src/gui/editors/notation/NotationView.cpp:2453
+#: ../src/gui/studio/AudioMixerWindow.cpp:149
+#: ../src/gui/studio/MidiMixerWindow.cpp:125
+#, fuzzy
+msgid "Panic"
+msgstr "Tremio"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1213
+msgid "Segment Debug Dump "
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1283
+msgid " Zoom: "
+msgstr "Chwyddo:"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1719
+#, fuzzy
+msgid "File \"%1\" does not exist"
+msgstr "Nid yw'r ffeil penodol mewn bod"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1725
+msgid "File \"%1\" is actually a directory"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1734
+msgid "You do not have read permission for \"%1\""
+msgstr "Nid oes ganddoch ganiatad i ddarllen \"%1\"."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1802
+msgid ""
+"An auto-save file for this document has been found\n"
+"Do you want to open it instead ?"
+msgstr ""
+"Canfuwyd ffeil hunan-gadw am y ddogfen yma.\n"
+"Ydych eisiau ei agor yn lle?"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1896
+#, fuzzy
+msgid "Example Files"
+msgstr "Enghraifft"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2100
+msgid "Opening a new application window..."
+msgstr "Agor ffenestr cymhwysiad newydd..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2110
+msgid "Creating new document..."
+msgstr "Creu dogfen newydd..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2154
+#, c-format
+msgid ""
+"Malformed URL\n"
+"%1"
+msgstr ""
+"URL annilys\n"
+"%1"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2179
+#: ../src/gui/application/RosegardenGUIApp.cpp:2240
+msgid "Opening file..."
+msgstr "Agor ffeil..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2201
+#: ../src/gui/application/RosegardenGUIApp.cpp:2220
+msgid "Open File"
+msgstr "Agor Ffeil"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1225
+#: ../src/gui/application/RosegardenGUIApp.cpp:2258
+msgid "Saving file..."
+msgstr "Cadw ffeil..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2330
+msgid "This is not a valid filename.\n"
+msgstr "Nid yw hwn yn enw dilys i'r ffeil.\n"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2335
+msgid "This is not a local file.\n"
+msgstr "Nid yw hwn yn ffeil lleol.\n"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2342
+#: ../src/gui/studio/BankEditorDialog.cpp:1640
+#: ../src/gui/studio/DeviceManagerDialog.cpp:787
+msgid "You have specified a directory"
+msgstr "Rydych wedi penodi cyfeiriadur"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2348
+#: ../src/gui/studio/BankEditorDialog.cpp:1646
+#: ../src/gui/studio/DeviceManagerDialog.cpp:793
+msgid "The specified file exists. Overwrite?"
+msgstr "Mae'r ffeil penodol mewn bod. Ysgrifennu drosto?"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2362
+msgid "Saving file with a new filename..."
+msgstr "Cadw'r ffeil efo enw ffeil newydd..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2364
+#, fuzzy
+msgid "Rosegarden files"
+msgstr "Ffeiliau Rosegarden-4"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2365
+#: ../src/gui/application/RosegardenGUIApp.cpp:4860
+#: ../src/gui/application/RosegardenGUIApp.cpp:4904
+#: ../src/gui/application/RosegardenGUIApp.cpp:4942
+#: ../src/gui/application/RosegardenGUIApp.cpp:4975
+#: ../src/gui/application/RosegardenGUIApp.cpp:5009
+#: ../src/gui/application/RosegardenGUIApp.cpp:5116
+msgid "All files"
+msgstr "Pob ffeil"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2366
+msgid "Save as..."
+msgstr "Cadw fel..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2404
+msgid "Closing file..."
+msgstr "Cau'r ffeil..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2421
+#: ../src/gui/editors/notation/NotationView.cpp:4618
+msgid "Printing..."
+msgstr "Argraffu..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2433
+#: ../src/gui/editors/notation/NotationView.cpp:4635
+msgid "Previewing..."
+msgstr "Rhagolygu..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2440
+msgid "Exiting..."
+msgstr "Terfynu..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2463
+msgid "Cutting selection..."
+msgstr "Torri'r dewisiad..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2474
+#: ../src/gui/editors/matrix/MatrixView.cpp:1614
+#: ../src/gui/editors/notation/NotationView.cpp:4763
+msgid "Copying selection to clipboard..."
+msgstr "Copio'r dewisiad i'r gludfwrdd..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2484
+#: ../src/gui/editors/eventlist/EventView.cpp:878
+#: ../src/gui/editors/matrix/MatrixView.cpp:1625
+#: ../src/gui/editors/notation/NotationView.cpp:4796
+#: ../src/gui/editors/notation/NotationView.cpp:4841
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:352
+msgid "Clipboard is empty"
+msgstr "Mae'r gludfwrdd yn wag"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2487
+#: ../src/gui/editors/eventlist/EventView.cpp:882
+#: ../src/gui/editors/matrix/MatrixView.cpp:1629
+#: ../src/gui/editors/notation/NotationView.cpp:4804
+#: ../src/gui/editors/notation/NotationView.cpp:4845
+msgid "Inserting clipboard contents..."
+msgstr "Mewnosod cynnyws y gludfwrdd..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2556
+#, fuzzy
+msgid "Duration of empty range to insert"
+msgstr "Torri'r dewisiad..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2631
+msgid "This function needs no more than one segment to be selected."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2654
+msgid "Can't join Audio segments"
+msgstr "Methu uno cylchrannau Sain"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2707
+#, fuzzy
+msgid "rescaling an audio file"
+msgstr "Yn chwarae ffeil sain"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2723
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:172
+#, fuzzy
+msgid "Rescaling audio file..."
+msgstr "Allforio ffeil sain ..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2767
+msgid ""
+"The audio file path does not exist or is not writable.\n"
+"You must set the audio file path to a valid directory in Document Properties "
+"before %1.\n"
+"Would you like to set it now?"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2769
+#: ../src/gui/application/RosegardenGUIApp.cpp:5291
+#: ../src/gui/application/RosegardenGUIApp.cpp:5339
+#: ../src/gui/editors/segment/TrackButtons.cpp:419
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:159
+#, fuzzy
+msgid "Set audio file path"
+msgstr "Llwybr ffeil sain:"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2833
+#, fuzzy
+msgid "Jog Selection"
+msgstr "Gwaredu'r Dewisiad"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2978
+#, fuzzy, c-format
+msgid ""
+"_n: Split Segment at Time\n"
+"Split %n Segments at Time"
+msgstr "Parhad"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3013
+#: ../src/gui/general/EditViewBase.cpp:619
+#, fuzzy
+msgid "Segment Start Time"
+msgstr "Paramedrau Cylchrannau"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3023
+#, fuzzy
+msgid "Set Segment Start Times"
+msgstr "Dangos Paramedrau &Cylchrannau"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3024
+#: ../src/gui/general/EditViewBase.cpp:626
+#, fuzzy
+msgid "Set Segment Start Time"
+msgstr "Dangos Paramedrau &Cylchrannau"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3056
+#: ../src/gui/general/EditViewBase.cpp:644
+#, fuzzy
+msgid "Segment Duration"
+msgstr "Parhad"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3068
+#, fuzzy
+msgid "Set Segment Durations"
+msgstr "Gosod &Tempo i Barhad Cylchran Sain"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3069
+#: ../src/gui/general/EditViewBase.cpp:652
+#, fuzzy
+msgid "Set Segment Duration"
+msgstr "Gosod &Tempo i Barhad Cylchran Sain"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3176
+#: ../src/gui/application/RosegardenGUIApp.cpp:5875
+msgid "Set Global Tempo"
+msgstr "Gosod Tempo Eang"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3234
+#: ../src/gui/general/EditViewBase.cpp:477
+msgid "Toggle the toolbar..."
+msgstr "Dangos/cuddio'r bar offer..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3244
+msgid "Toggle the tools toolbar..."
+msgstr "Dangos/cuddio'r bar offer..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3254
+msgid "Toggle the tracks toolbar..."
+msgstr "Dangos/cuddio'r bar traciau..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3264
+msgid "Toggle the editor toolbar..."
+msgstr "Dangos/cuddio'r bar golygydd..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3274
+msgid "Toggle the transport toolbar..."
+msgstr "Dangos/cuddio'r bar cludiant..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3284
+msgid "Toggle the zoom toolbar..."
+msgstr "Dangos/cuddio'r bar chwyddo..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3294
+msgid "Toggle the Transport"
+msgstr "Dangos/cuddio'r Cludiant"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3377
+#: ../src/gui/general/EditViewBase.cpp:487
+msgid "Toggle the statusbar..."
+msgstr "Dangos/cuddio'r bar cyflwr..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3434
+msgid ""
+"The join tool isn't implemented yet. Instead please highlight the segments "
+"you want to join and then use the menu option:\n"
+"\n"
+" Segments->Collapse Segments.\n"
+msgstr ""
+"Nid yw'r erfyn uno wedi'i gyflawni eto. Yn lle, amlygwch y cylchrannau yr "
+"ydych eisiau eu uno, ac wedyn defnyddiwch y dewisiad dewislen:\n"
+"\n"
+"Cylchrannau -> Dat-ehangu Cylchrannau.\n"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3437
+msgid "Join tool not yet implemented"
+msgstr "Nid yw'r erfyn uno wedi'i gyflawni eto."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3675
+msgid "Revert modified document to previous saved version?"
+msgstr "Cildroi'r ddogfen wedi'i haddasu i'r fersiwn wedi'i chadw o'r blaen?"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3691
+#, fuzzy
+msgid ""
+"*.rgp|Rosegarden Project files\n"
+"*|All files"
+msgstr ""
+"*.rose|Ffeiliau Rosegarden-2\n"
+"*|Pob ffeil"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3692
+#, fuzzy
+msgid "Import Rosegarden Project File"
+msgstr "Mewnforio ffeil &Rosegarden 2.1..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3717
+msgid "Failed to import project file \"%1\""
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3739
+msgid "Open MIDI File"
+msgstr "Agor Ffeil MIDI"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3756
+msgid "Merge MIDI File"
+msgstr "Cyfuno Ffeil MIDI"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3866
+msgid "Importing MIDI file..."
+msgstr "Mewnforio ffeil MIDI..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3903
+msgid "Calculating notation..."
+msgstr "Enrhifo nodiant..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3950
+msgid "Calculate Notation"
+msgstr "Enrhifo Nodiant"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3991
+#: ../src/gui/application/RosegardenGUIApp.cpp:4008
+msgid ""
+"*.rose|Rosegarden-2 files\n"
+"*|All files"
+msgstr ""
+"*.rose|Ffeiliau Rosegarden-2\n"
+"*|Pob ffeil"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3992
+#: ../src/gui/application/RosegardenGUIApp.cpp:4009
+msgid "Open Rosegarden 2.1 File"
+msgstr "Agor Ffeil Rosegarden 2.1"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4026
+msgid "Importing Rosegarden 2.1 file..."
+msgstr "Mewnforio ffeil Rosegarden 2.1..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4052
+msgid "Can't load Rosegarden 2.1 file. It appears to be corrupted."
+msgstr "Methu llwytho'r ffeil Rosegarden 2.1. Ymddengys ei fod yn llygredig."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4078
+#: ../src/gui/application/RosegardenGUIApp.cpp:4095
+#, fuzzy
+msgid ""
+"*.h2song|Hydrogen files\n"
+"*|All files"
+msgstr ""
+"*.rg|Ffeiliau Rosegarden-4\n"
+"*|Pob ffeil"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4079
+#: ../src/gui/application/RosegardenGUIApp.cpp:4096
+#, fuzzy
+msgid "Open Hydrogen File"
+msgstr "Agor Ffeil Rosegarden 2.1"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4113
+#, fuzzy
+msgid "Importing Hydrogen file..."
+msgstr "Mewnforio ffeil Rosegarden 2.1..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4139
+#, fuzzy
+msgid "Can't load Hydrogen file. It appears to be corrupted."
+msgstr "Methu llwytho'r ffeil Rosegarden 2.1. Ymddengys ei fod yn llygredig."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4527
+#, fuzzy
+msgid "Export and import of Rosegarden Project files"
+msgstr "Mewnforio ffeil Rosegarden 2.1..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4529
+#, fuzzy
+msgid "The Rosegarden Project Packager helper script"
+msgstr "Ffeiliau Rosegarden-4"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4533
+msgid "%1 - for project file support"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4550
+msgid "The Rosegarden LilyPondView helper script"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4554
+#, fuzzy
+msgid "%1 - for LilyPond preview support"
+msgstr "Maint ffont Lilypad"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4570
+msgid "The Rosegarden Audio File Importer helper script"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4574
+#, fuzzy
+msgid "%1 - for audio file import"
+msgstr "Llwybr ffeil sain:"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4585
+msgid ""
+"<h3>Helper programs not found</h3><p>Rosegarden could not find one or more "
+"helper programs which it needs to provide some features. The following "
+"features will not be available:</p>"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4586
+#: ../src/gui/application/RosegardenGUIApp.cpp:4592
+#, fuzzy
+msgid "<ul>"
+msgstr "(rhagosod)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4588
+#: ../src/gui/application/RosegardenGUIApp.cpp:4594
+msgid "<li>%1</li>"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4590
+#: ../src/gui/application/RosegardenGUIApp.cpp:4596
+msgid "</ul>"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4591
+msgid ""
+"<p>To fix this, you should install the following additional programs:</p>"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4603
+msgid "Helper programs not found"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4686
+msgid "Starting the sequencer..."
+msgstr "Cychwyn y dilyniannydd..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4712
+msgid "Couldn't start the sequencer"
+msgstr "Methu cychwyn y dilyniannydd"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4789
+msgid "Clearing down jackd..."
+msgstr "Gwaredu data jackd..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4803
+msgid "Starting jackd..."
+msgstr "Dechrau jackd..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4842
+msgid ""
+"The Rosegarden sequencer process has exited unexpectedly. Sound and "
+"recording will no longer be available for this session.\n"
+"Please exit and restart Rosegarden to restore sound capability."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4846
+msgid ""
+"The Rosegarden sequencer could not be started, so sound and recording will "
+"be unavailable for this session.\n"
+"For assistance with correct audio and MIDI configuration, go to http://"
+"rosegardenmusic.com."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4856
+#, fuzzy
+msgid "Exporting Rosegarden Project file..."
+msgstr "Mewnforio ffeil Rosegarden 2.1..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4859
+#, fuzzy
+msgid "Rosegarden Project files\n"
+msgstr "Ffeiliau Rosegarden-4"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4861
+#: ../src/gui/application/RosegardenGUIApp.cpp:4905
+#: ../src/gui/application/RosegardenGUIApp.cpp:4943
+#: ../src/gui/application/RosegardenGUIApp.cpp:4976
+#: ../src/gui/application/RosegardenGUIApp.cpp:5010
+#: ../src/gui/application/RosegardenGUIApp.cpp:5116
+msgid "Export as..."
+msgstr "Allforio fel..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4875
+#, c-format
+msgid "Saving Rosegarden file to package failed: %1"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4889
+msgid "Failed to export to project file \"%1\""
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4900
+#: ../src/gui/application/RosegardenGUIApp.cpp:4915
+msgid "Exporting MIDI file..."
+msgstr "Allforio ffeil MIDI..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4903
+msgid "Standard MIDI files\n"
+msgstr "Ffeiliau MIDI safonol\n"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4934
+#: ../src/gui/application/RosegardenGUIApp.cpp:4966
+#: ../src/gui/application/RosegardenGUIApp.cpp:4999
+#: ../src/gui/application/RosegardenGUIApp.cpp:5103
+#: ../src/gui/application/RosegardenGUIApp.cpp:5140
+#: ../src/gui/editors/notation/NotationView.cpp:4733
+msgid "Export failed. The file could not be opened for writing."
+msgstr "Methodd yr allforio. Methu agor y ffeil i ysgrifennu."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4940
+#: ../src/gui/application/RosegardenGUIApp.cpp:4952
+msgid "Exporting Csound score file..."
+msgstr "Allforio ffeil sgor Csound..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4972
+#: ../src/gui/application/RosegardenGUIApp.cpp:4985
+msgid "Exporting Mup file..."
+msgstr "Allforio ffeil Mup..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4975
+msgid "Mup files\n"
+msgstr "Ffeiliau Mup\n"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5005
+#: ../src/gui/application/RosegardenGUIApp.cpp:5089
+#: ../src/gui/editors/notation/NotationView.cpp:4719
+#, fuzzy
+msgid "Exporting LilyPond file..."
+msgstr "Allforio ffeil Lilypond..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5008
+#, fuzzy
+msgid "LilyPond files"
+msgstr "Ffeiliau Lilypond"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5023
+#: ../src/gui/editors/notation/NotationView.cpp:4653
+#, fuzzy
+msgid "Printing LilyPond file..."
+msgstr "Allforio ffeil Lilypond..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5028
+#: ../src/gui/application/RosegardenGUIApp.cpp:5052
+#: ../src/gui/editors/notation/NotationView.cpp:4658
+#: ../src/gui/editors/notation/NotationView.cpp:4682
+#, fuzzy
+msgid "Failed to open a temporary file for LilyPond export."
+msgstr "Dewis un neu mwy o Ffeiliau Sain"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5047
+#: ../src/gui/editors/notation/NotationView.cpp:4677
+#, fuzzy
+msgid "Previewing LilyPond file..."
+msgstr "Allforio ffeil Lilypond..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5080
+#: ../src/gui/editors/notation/NotationView.cpp:4710
+#, fuzzy
+msgid "LilyPond Preview Options"
+msgstr "Maint ffont Lilypad"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5081
+#: ../src/gui/editors/notation/NotationView.cpp:4711
+#, fuzzy
+msgid "LilyPond preview options"
+msgstr "Maint ffont Lilypad"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5112
+#: ../src/gui/application/RosegardenGUIApp.cpp:5126
+msgid "Exporting MusicXML file..."
+msgstr "Allforio ffeil MusicXML..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5115
+msgid "XML files"
+msgstr "Ffeiliau XML"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5289
+#: ../src/gui/editors/segment/TrackButtons.cpp:417
+msgid ""
+"The audio file path does not exist or is not writable.\n"
+"Please set the audio file path to a valid directory in Document Properties "
+"before recording audio.\n"
+"Would you like to set it now?"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5337
+msgid ""
+"The audio file path does not exist or is not writable.\n"
+"Please set the audio file path to a valid directory in Document Properties "
+"before you start to record audio.\n"
+"Would you like to set it now?"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5780
+#, fuzzy
+msgid "Move playback pointer to time"
+msgstr "Pwyntydd Chwarae i'r &Cyrchydd"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5793
+#: ../src/gui/editors/matrix/MatrixView.cpp:2240
+msgid "%1%"
+msgstr "%1%"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5861
+#, c-format
+msgid "Replace Tempo Change at %1"
+msgstr "Ailosod Newid Tempo wrth %1"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5891
+msgid "Set Global and Default Tempo"
+msgstr "Gosod Tempo Eang a Rhagosodedig"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5914
+#, fuzzy
+msgid "Move Tempo Change"
+msgstr "Gwaredu Newid &Tempo..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5949
+#, fuzzy
+msgid "new marker"
+msgstr "&Gwaredu Pob Arwydd"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5950
+#, fuzzy
+msgid "no description"
+msgstr "Disgrifiad"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:6363
+#, c-format
+msgid "Sequencer failed to add audio file %1"
+msgstr "Methodd y dilyniannydd ychwanegu ffeil sain %1"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:6388
+#, c-format
+msgid "Sequencer failed to remove audio file id %1"
+msgstr "Methodd y dilyniannydd waredu ffeil sain %1"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:6448
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:1086
+msgid "Modify Segment label"
+msgstr "Addasu label Cylchran"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:6450
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:1088
+msgid "Modify Segments label"
+msgstr "Addasu label Cylchrannau"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:6452
+msgid "Relabelling selection..."
+msgstr "Ail-labelu dewisiad..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7539
+#, fuzzy
+msgid "Play List"
+msgstr "Chwarae"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7567
+msgid "http://rosegarden.sourceforge.net/tutorial/en/chapter-0.html"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7574
+msgid "http://rosegarden.sourceforge.net/tutorial/bug-guidelines.html"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7650
+msgid "Queueing MIDI panic events for tranmission..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7708
+msgid "Are you sure you want to save this as your default studio?"
+msgstr "Ydych yn sicr yr ydych eisiau cadw hwn fel eich stiwdio rhagosodedig?"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7713
+msgid "Saving current document as default studio..."
+msgstr "Cadw'r ddogfen cyfredol fel stiwdio rhagosodedig..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7738
+#, fuzzy
+msgid ""
+"Are you sure you want to import your default studio and lose the current one?"
+msgstr "Ydych yn sicr yr ydych eisiau cadw hwn fel eich stiwdio rhagosodedig?"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7773
+msgid "Import Studio from File"
+msgstr "Mewnforio Stiwdio o Ffeil"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7807
+#, fuzzy
+msgid "Import Studio"
+msgstr "Mewnforio Stiwdio o Ffeil"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:8015
+msgid ""
+"<h3>Newer version available</h3><p>A newer version of Rosegarden may be "
+"available.<br>Please consult the <a href=\"http://www.rosegardenmusic.com/"
+"getting/\">Rosegarden website</a> for more information.</p>"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:8016
+#, fuzzy
+msgid "Newer version available"
+msgstr "Wedi ei leoli (lle ar gael)"
+
+#: ../src/gui/application/RosegardenApplication.cpp:104
+#, c-format
+msgid "Failed to load soundfont %1"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:311
+msgid "Rosegarden - A sequencer and musical notation editor"
+msgstr "Rosegarden - Dilyniannydd a golygydd nodiant cerddorol"
+
+#: ../src/gui/application/main.cpp:315
+msgid "Don't use the sequencer (support editing only)"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:316
+#, fuzzy
+msgid "Don't show the splash screen"
+msgstr "dim dangos sgrin-lluchio"
+
+#: ../src/gui/application/main.cpp:317
+msgid "Don't automatically run in the background"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:318
+msgid "Attach to a running sequencer process, if found"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:319
+msgid "Ignore installed version - for devs only"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:320
+msgid "file to open"
+msgstr "ffeil i agor"
+
+#: ../src/gui/application/main.cpp:370
+msgid "Installation contains the wrong version of Rosegarden."
+msgstr "Mae'r gosodiad yn cynnwys y fersiwn anghywir o Rosegarden."
+
+#: ../src/gui/application/main.cpp:371
+#, fuzzy
+msgid ""
+" The wrong versions of Rosegarden's data files were\n"
+" found in the standard KDE installation directories.\n"
+" (I am %1, but the installed files are for version %2.)\n"
+"\n"
+" This may mean one of the following:\n"
+"\n"
+" 1. This is a new upgrade of Rosegarden, and it has not yet been\n"
+" installed. If you compiled it yourself, check that you have\n"
+" run \"make install\" and that the procedure completed\n"
+" successfully.\n"
+"\n"
+" 2. The upgrade was installed in a non-standard directory,\n"
+" and an old version was found in a standard directory. If so,\n"
+" you will need to add the correct directory to your KDEDIRS\n"
+" environment variable before you can run it."
+msgstr ""
+"Canfuwyd y fersiynau anghywir o'r ffeiliau data Rosegarden\n"
+"yn y cyfeiriaduron gosodiad a ddefnyddir gan KDE yn arferol.\n"
+"(%1 ydw i, ond mae'r ffeiliau sydd wedi eu gosod i fersiwn %2.)\n"
+"\n"
+"Gall hyn olygu un o'r canlynol:\n"
+"\n"
+"1. Diweddariad newydd o Rosegarden yw hon, ac nid yw wedi\n"
+" ei gosod eto. Os ydych wedi ei crynhoi eich hunan, gwiriwch\n"
+" eich bod chi wedi rhedeg \"make install\", a bod y weithdrefn\n"
+" wedi cwblhau yn llwyddiannus.\n"
+"\n"
+"2. Gosodwyd y ddiweddariad mewn cyfeiriadur anarferol, \n"
+" a chanfuwyd hen fersiwn mewn cyfeiriadur arferol. Os felly, \n"
+" bydd rhaid i chi ychwanegu'r cyfeiriadur cywir i'ch newidyn\n"
+" amgylchedd KDEDIRS cyn i chi gael ei rhedeg."
+
+#: ../src/gui/application/main.cpp:383 ../src/gui/application/main.cpp:401
+msgid "Installation problem"
+msgstr "Problem gosodiad"
+
+#: ../src/gui/application/main.cpp:389
+msgid "Rosegarden does not appear to have been installed."
+msgstr "Ymddengys nad yw Rosegarden wedi cael ei osod."
+
+#: ../src/gui/application/main.cpp:390
+#, fuzzy
+msgid ""
+" One or more of Rosegarden's data files could not be\n"
+" found in the standard KDE installation directories.\n"
+"\n"
+" This may mean one of the following:\n"
+"\n"
+" 1. Rosegarden has not been correctly installed. If you compiled\n"
+" it yourself, check that you have run \"make install\" and that\n"
+" the procedure completed successfully.\n"
+"\n"
+" 2. Rosegarden has been installed in a non-standard directory,\n"
+" and you need to add this directory to your KDEDIRS environment\n"
+" variable before you can run it. This may be the case if you\n"
+" installed into $HOME or a local third-party package directory\n"
+" like /usr/local or /opt."
+msgstr ""
+"Roedd yn amhosibl canfod un neu fwy o'r ffeiliau data Rosegarden\n"
+"yn y cyfeiriaduron gosodiad a ddefnyddir gan KDE yn arferol.\n"
+"\n"
+"Gall hyn olygu un o'r canlynol:\n"
+"\n"
+"1. Nid yw Rosegarden wedi ei osod yn gywir. Os ydych wedi \n"
+" ei grynhoi eich hunan, gwiriwch\n"
+" eich bod chi wedi rhedeg \"make install\", a bod y weithdrefn\n"
+" wedi cwblhau yn llwyddiannus.\n"
+"\n"
+"2. Mae Rosegarden wedi cael ei osod mewn cyfeiriadur anarferol, \n"
+" a rhaid i chi ychwanegu'r cyfeiriadur yma i'ch newidyn\n"
+" amgylchedd KDEDIRS cyn i chi gael ei rhedeg. Gall hyn ddigwydd\n"
+" os rydych wedi gosod i mewn i $HOME neu cyfeiriadur pecyn\n"
+" trydydd-blaid lleol fel /usr/local neu /opt."
+
+#: ../src/gui/application/main.cpp:414
+msgid "Rosegarden"
+msgstr "Rosegarden"
+
+#: ../src/gui/application/main.cpp:416
+msgid ""
+"Copyright 2000 - 2008 Guillaume Laurent, Chris Cannam, Richard Bown\n"
+"Parts copyright 1994 - 2004 Chris Cannam, Andy Green, Richard Bown, "
+"Guillaume Laurent\n"
+"LilyPond fonts copyright 1997 - 2005 Han-Wen Nienhuys and Jan Nieuwenhuizen"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:428
+msgid "Chord labelling code"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:429
+msgid ""
+"LilyPond output\n"
+"assorted other patches\n"
+"i18n-ization"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:430
+msgid ""
+"UI improvements\n"
+"bug fixes"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:431
+msgid ""
+"Segment colours\n"
+"Other UI and bug fixes"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:432
+msgid ""
+"Russian translation\n"
+"i18n-ization"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:433 ../src/gui/application/main.cpp:434
+msgid "German translation"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:435
+msgid "Welsh translation"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:436
+#, fuzzy
+msgid "French translation"
+msgstr "Cysoni"
+
+#: ../src/gui/application/main.cpp:437
+#, fuzzy
+msgid ""
+"French translation\n"
+"Bug fixes"
+msgstr "Cysoni"
+
+#: ../src/gui/application/main.cpp:438 ../src/gui/application/main.cpp:439
+msgid "Italian translation"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:440 ../src/gui/application/main.cpp:441
+msgid "Swedish translation"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:442
+msgid "Estonian translation"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:443 ../src/gui/application/main.cpp:444
+#, fuzzy
+msgid "Dutch translation"
+msgstr "Cysoni"
+
+#: ../src/gui/application/main.cpp:445
+msgid "HSpinBox class"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:446
+msgid "Transposition by interval"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:447
+msgid "Original designs for rotary controllers"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:448
+#, fuzzy
+msgid "Japanese translation"
+msgstr "Cysoni"
+
+#: ../src/gui/application/main.cpp:449
+msgid ""
+"Auto-scroll deceleration\n"
+"Rests outside staves and other bug fixes"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:450
+#, fuzzy
+msgid "Simplified Chinese translation"
+msgstr "Cysoni"
+
+#: ../src/gui/application/main.cpp:451
+msgid "LIRC infrared remote-controller support"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:452
+msgid "MTC slave timing implementation"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:453
+#, fuzzy
+msgid "Czech translation"
+msgstr "Cysoni"
+
+#: ../src/gui/application/main.cpp:454
+msgid "SCons/bksys building system"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:455
+msgid "icons, icons, icons"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:456 ../src/gui/application/main.cpp:457
+#: ../src/gui/application/main.cpp:458 ../src/gui/application/main.cpp:459
+#, fuzzy
+msgid "Spanish translation"
+msgstr "Cysoni"
+
+#: ../src/gui/application/main.cpp:460 ../src/gui/application/main.cpp:461
+#, fuzzy
+msgid "Catalan translation"
+msgstr "Cysoni"
+
+#: ../src/gui/application/main.cpp:462
+msgid ""
+"1.2.3 splash screen photo\n"
+"Gave birth to D. Michael McIntyre, bought him a good flute once\n"
+"upon a time, and always humored him when he came over to play her\n"
+"some new instrument, even though she really hated his playing.\n"
+"Born October 19, 1951, died September 21, 2007, R. I. P."
+msgstr ""
+
+#: ../src/gui/application/main.cpp:463
+msgid "Initial guitar chord editing code"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:464
+#, fuzzy
+msgid "Polish translation"
+msgstr "Cysoni"
+
+#: ../src/gui/application/main.cpp:465
+#, fuzzy
+msgid "Basque translation"
+msgstr "Cysoni"
+
+#: ../src/gui/application/main.cpp:466
+msgid "Klearlook theme"
+msgstr ""
+
+#: ../src/_translatorinfo.cpp:1 ../src/gui/application/main.cpp:468
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr "Kevin Donnelly, ar ran KGyfieithu - meddalwedd rhydd yn Gymraeg"
+
+#: ../src/_translatorinfo.cpp:3 ../src/gui/application/main.cpp:468
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+
+#: ../src/gui/application/main.cpp:719
+msgid "Welcome!"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:731
+msgid ""
+"<h2>Welcome to Rosegarden!</h2><p>Welcome to the Rosegarden audio and MIDI "
+"sequencer and musical notation editor.</p><ul><li>If you have not already "
+"done so, you may wish to install some DSSI synth plugins, or a separate "
+"synth program such as QSynth. Rosegarden does not synthesize sounds from "
+"MIDI on its own, so without these you will hear nothing.</"
+"li><br><br><li>Rosegarden uses the JACK audio server for recording and "
+"playback of audio, and for playback from DSSI synth plugins. These features "
+"will only be available if the JACK server is running.</"
+"li><br><br><li>Rosegarden has comprehensive documentation: see the Help menu "
+"for the handbook, tutorials, and other information!</li></ul><p>Rosegarden "
+"was brought to you by a team of volunteers across the world. To learn more, "
+"go to <a href=\"http://www.rosegardenmusic.com/\">http://www.rosegardenmusic."
+"com/</a>.</p>"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIView.cpp:257
+msgid "No non-audio segments in composition"
+msgstr "Dim cylchrannau di-sain yn y cyfansoddiad"
+
+#: ../src/gui/application/RosegardenGUIView.cpp:333
+msgid "Selection must contain only audio or non-audio segments"
+msgstr "Rhaid i'r dewisiad gynnwys dim ond cylchrannau sain neu di-sain"
+
+#: ../src/gui/application/RosegardenGUIView.cpp:431
+#: ../src/gui/application/RosegardenGUIView.cpp:576
+#: ../src/gui/application/RosegardenGUIView.cpp:612
+#: ../src/gui/application/RosegardenGUIView.cpp:776
+msgid "No non-audio segments selected"
+msgstr "Dim cylchrannau di-sain wedi'w dewis"
+
+#: ../src/gui/application/RosegardenGUIView.cpp:851
+msgid ""
+"You've not yet defined an audio editor for Rosegarden to use.\n"
+"See Settings -> Configure Rosegarden -> Audio."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIView.cpp:1559
+#: ../src/gui/application/RosegardenGUIView.cpp:1564
+#, fuzzy
+msgid "Can't add dropped file. "
+msgstr "Methu agor ffeil '%1'"
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1014
+#: ../src/gui/seqmanager/SequenceManager.cpp:1150
+msgid ""
+"The JACK Audio subsystem has failed or it has stopped Rosegarden from "
+"processing audio.\n"
+"Please restart Rosegarden to continue working with audio.\n"
+"Quitting other running applications may improve Rosegarden's performance."
+msgstr ""
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1020
+#: ../src/gui/seqmanager/SequenceManager.cpp:1156
+msgid ""
+"The JACK Audio subsystem has stopped Rosegarden from processing audio, "
+"probably because of a processing overload.\n"
+"An attempt to restart the audio service has been made, but some problems may "
+"remain.\n"
+"Quitting other running applications may improve Rosegarden's performance."
+msgstr ""
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1031
+msgid ""
+"Run out of processor power for real-time audio processing. Cannot continue."
+msgstr ""
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1057
+msgid ""
+"A serious error has occurred in the ALSA MIDI subsystem. It may not be "
+"possible to continue sequencing. Please check console output for more "
+"information."
+msgstr ""
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1078
+#, fuzzy
+msgid "JACK Audio subsystem is losing sample frames."
+msgstr "Nid yw'r is-gysawd sain ar gael - methu recordio sain"
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1096
+msgid ""
+"Failed to read audio data from disc in time to service the audio subsystem."
+msgstr ""
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1100
+msgid ""
+"Failed to write audio data to disc fast enough to service the audio "
+"subsystem."
+msgstr ""
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1104
+#, fuzzy
+msgid "The audio mixing subsystem is failing to keep up."
+msgstr "Nid yw'r is-gysawd sain ar gael - methu recordio sain"
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1108
+#, fuzzy
+msgid "The audio subsystem is failing to keep up."
+msgstr "Nid yw'r is-gysawd sain ar gael - methu recordio sain"
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1112
+msgid "Unknown sequencer failure mode!"
+msgstr ""
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1170
+msgid ""
+"<h3>System timer resolution is too low</h3><p>Rosegarden was unable to find "
+"a high-resolution timing source for MIDI performance.</p><p>This may mean "
+"you are using a Linux system with the kernel timer resolution set too low. "
+"Please contact your Linux distributor for more information.</p><p>Some Linux "
+"distributors already provide low latency kernels, see <a href=\"http://"
+"rosegarden.wiki.sourceforge.net/Low+latency+kernels\">http://rosegarden.wiki."
+"sourceforge.net/Low+latency+kernels</a> for instructions.</p>"
+msgstr ""
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1188
+msgid ""
+"<h3>System timer resolution is too low</h3><p>Rosegarden was unable to find "
+"a high-resolution timing source for MIDI performance.</p><p>You may be able "
+"to solve this problem by loading the RTC timer kernel module. To do this, "
+"try running <b>sudo modprobe snd-rtctimer</b> in a terminal window and then "
+"restarting Rosegarden.</p><p>Alternatively, check whether your Linux "
+"distributor provides a multimedia-optimized kernel. See <a href=\"http://"
+"rosegarden.wiki.sourceforge.net/Low+latency+kernels\">http://rosegarden.wiki."
+"sourceforge.net/Low+latency+kernels</a> for notes about this.</p>"
+msgstr ""
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1312
+msgid ""
+"<p>Both MIDI and Audio subsystems have failed to initialize.</p><p>You may "
+"continue without the sequencer, but we suggest closing Rosegarden, running "
+"\"alsaconf\" as root, and starting Rosegarden again. If you wish to run "
+"with no sequencer by design, then use \"rosegarden --nosequencer\" to avoid "
+"seeing this error in the future.</p>"
+msgstr ""
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1314
+msgid ""
+"<p>The MIDI subsystem has failed to initialize.</p><p>You may continue "
+"without the sequencer, but we suggest closing Rosegarden, running \"modprobe "
+"snd-seq-midi\" as root, and starting Rosegarden again. If you wish to run "
+"with no sequencer by design, then use \"rosegarden --nosequencer\" to avoid "
+"seeing this error in the future.</p>"
+msgstr ""
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1316
+msgid ""
+"<p>The Rosegarden sequencer module version does not match the GUI module "
+"version.</p><p>You have probably mixed up files from two different versions "
+"of Rosegarden. Please check your installation.</p>"
+msgstr ""
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1322
+#, fuzzy, c-format
+msgid "<h3>Sequencer startup failed</h3>%1"
+msgstr "Cyflwr y dilyniannydd:"
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1330
+msgid ""
+"<h3>Failed to connect to JACK audio server.</h3><p>Rosegarden could not "
+"connect to the JACK audio server. This probably means the JACK server is "
+"not running.</p><p>If you want to be able to play or record audio files or "
+"use plugins, you should exit Rosegarden and start the JACK server before "
+"running Rosegarden again.</p>"
+msgstr ""
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1331
+msgid "Failed to connect to JACK"
+msgstr ""
+
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:46
+msgid "Modify MIDI filters..."
+msgstr "Addasu Hidlau MIDI..."
+
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:58
+msgid "THRU events to ignore"
+msgstr "Digwyddiadau Thru i anwybyddu"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:131
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:60
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:96
+msgid "Note"
+msgstr "Nodyn"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:132
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:61
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:97
+msgid "Program Change"
+msgstr "Newid Rhaglen"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:136
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:62
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:98
+msgid "Key Pressure"
+msgstr "Gwasgedd Allwedd"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:137
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:63
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:99
+msgid "Channel Pressure"
+msgstr "Gwasgedd Sianel"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:134
+#: ../src/gui/general/EditView.cpp:899
+#: ../src/gui/rulers/ControllerEventsRuler.cpp:198
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:64
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:100
+msgid "Pitch Bend"
+msgstr "Plygu Traw"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:133
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:65
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:101
+msgid "Controller"
+msgstr "Rheolydd"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:135
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:66
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:102
+msgid "System Exclusive"
+msgstr "Cyfyngedig i'r Cysawd"
+
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:94
+msgid "RECORD events to ignore"
+msgstr "Digwyddiadau RECORD i anwybyddu"
+
+#: ../src/gui/widgets/TimeWidget.cpp:101
+#, fuzzy
+msgid "Note:"
+msgstr "Nodyn"
+
+#: ../src/gui/widgets/TimeWidget.cpp:108 ../src/gui/widgets/TimeWidget.cpp:145
+msgid "<inexact>"
+msgstr ""
+
+#: ../src/gui/widgets/TimeWidget.cpp:151
+#, fuzzy
+msgid "Units:"
+msgstr "Uned"
+
+#: ../src/gui/widgets/TimeWidget.cpp:173
+#, fuzzy
+msgid "Time:"
+msgstr "Amser: %1"
+
+#: ../src/gui/widgets/TimeWidget.cpp:184
+#, fuzzy
+msgid "units"
+msgstr "Uned"
+
+#: ../src/gui/widgets/TimeWidget.cpp:193
+msgid "Measures:"
+msgstr "Bariau:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:193
+#, fuzzy
+msgid "Measure:"
+msgstr "Bariau:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:212
+#, fuzzy
+msgid "beats:"
+msgstr "Curiad"
+
+#: ../src/gui/widgets/TimeWidget.cpp:212
+#, fuzzy
+msgid "beat:"
+msgstr "Curiad"
+
+#: ../src/gui/widgets/TimeWidget.cpp:230
+#, fuzzy
+msgid "%1:"
+msgstr "B%1"
+
+#: ../src/gui/widgets/TimeWidget.cpp:254
+#, fuzzy
+msgid "Seconds:"
+msgstr "Ail Werth"
+
+#: ../src/gui/widgets/TimeWidget.cpp:273
+#, fuzzy
+msgid "msec:"
+msgstr "Enw:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:407 ../src/gui/widgets/TimeWidget.cpp:531
+msgid "(%1/%2 time)"
+msgstr ""
+
+#: ../src/gui/widgets/TimeWidget.cpp:452
+msgid "(starting %1.%2 qpm, %2.%3 bpm)"
+msgstr ""
+
+#: ../src/gui/widgets/TimeWidget.cpp:458
+msgid "(starting %1.%2 bpm)"
+msgstr ""
+
+#: ../src/gui/widgets/TimeWidget.cpp:464
+msgid "(%1.%2 qpm, %2.%3 bpm)"
+msgstr ""
+
+#: ../src/gui/widgets/TimeWidget.cpp:470
+#, fuzzy
+msgid "(%1.%2 bpm)"
+msgstr "%1.%2 s,"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:239
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:60
+msgid "C"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:241
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:61
+#, fuzzy
+msgid "D"
+msgstr "I"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:243
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:62
+msgid "E"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:244
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:63
+msgid "F"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:246
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:64
+msgid "G"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:248
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:65
+#, fuzzy
+msgid "A"
+msgstr "A4"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:250
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:66
+msgid "B"
+msgstr ""
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:70
+msgid "-2"
+msgstr ""
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:71
+msgid "-1"
+msgstr ""
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:72
+msgid "0"
+msgstr "0"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:73
+#, fuzzy
+msgid "1"
+msgstr "%1%"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:74
+msgid "2"
+msgstr ""
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:75
+msgid "3"
+msgstr ""
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:76
+#, fuzzy
+msgid "4"
+msgstr "A4"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:77
+msgid "5"
+msgstr ""
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:78
+msgid "6"
+msgstr ""
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:79
+msgid "7"
+msgstr ""
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:83
+#, fuzzy
+msgid "double flat"
+msgstr "Lleddf dwbl"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:84
+#, fuzzy
+msgid "flat"
+msgstr "Lleddf"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:85
+#, fuzzy
+msgid "natural"
+msgstr "Naturiol"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:86
+#, fuzzy
+msgid "sharp"
+msgstr "Llon"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:87
+#, fuzzy
+msgid "double sharp"
+msgstr "Llon dwbl"
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:234
+#, fuzzy, c-format
+msgid "In %1"
+msgstr "Dat-&wneud %1"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:587
+#: ../src/gui/widgets/AudioRouteMenu.cpp:236
+#: ../src/gui/widgets/AudioRouteMenu.cpp:259
+#, fuzzy
+msgid "Master"
+msgstr "Meistr MMC"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:528
+#: ../src/gui/widgets/AudioRouteMenu.cpp:238
+#: ../src/gui/widgets/AudioRouteMenu.cpp:261
+#, c-format
+msgid "Sub %1"
+msgstr ""
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:244
+#, fuzzy
+msgid "In %1 R"
+msgstr "[ %1 ]"
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:245
+#, fuzzy
+msgid "In %1 L"
+msgstr "[ %1 ]"
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:247
+#, fuzzy
+msgid "Master R"
+msgstr "Meistr MMC"
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:248
+#, fuzzy
+msgid "Master L"
+msgstr "Meistr MMC"
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:250
+msgid "Sub %1 R"
+msgstr ""
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:251
+msgid "Sub %1 L"
+msgstr ""
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:391
+#: ../src/gui/studio/AudioMixerWindow.cpp:522
+#: ../src/gui/widgets/AudioFaderBox.cpp:82
+msgid "Audio plugin button"
+msgstr "Botwm ategyn sain"
+
+#: ../src/gui/editors/parameters/AudioInstrumentParameterPanel.cpp:129
+#: ../src/gui/editors/parameters/AudioInstrumentParameterPanel.cpp:357
+#: ../src/gui/widgets/AudioFaderBox.cpp:91
+#, fuzzy
+msgid "<no synth>"
+msgstr "<dim digwyddiadau>"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:93
+#, fuzzy
+msgid "Synth plugin button"
+msgstr "Botwm ategyn sain"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:153
+msgid "Set the audio pan position in the stereo field"
+msgstr "Gosod lleoliad y panio sain yn y faes stereo"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:155
+#, fuzzy
+msgid "Open synth plugin's native editor"
+msgstr "Agor yn y Golygydd Matric&s"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:157
+#, fuzzy
+msgid "Mono or Stereo Instrument"
+msgstr "Offeryn Sain Mono neu Stereo"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:159
+#, fuzzy
+msgid "Record level"
+msgstr "Safon recordio ="
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:161
+#, fuzzy
+msgid "Playback level"
+msgstr "Safon chwarae ="
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:345
+#: ../src/gui/studio/AudioMixerWindow.cpp:347
+#: ../src/gui/studio/AudioMixerWindow.cpp:503
+#: ../src/gui/studio/AudioMixerWindow.cpp:505
+#: ../src/gui/widgets/AudioFaderBox.cpp:163
+#, fuzzy
+msgid "Audio level"
+msgstr "Ychwanegu Ffeil Sain"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:170
+msgid "In:"
+msgstr ""
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:173
+msgid "Out:"
+msgstr ""
+
+#: ../src/gui/widgets/ProgressDialog.cpp:48
+#: ../src/gui/widgets/ProgressDialog.cpp:53
+#: ../src/gui/widgets/ProgressDialog.cpp:76
+msgid "Processing..."
+msgstr "Prosesu..."
+
+#: ../src/gui/configuration/ColourConfigurationPage.h:60
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:130
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:346
+#: ../src/gui/widgets/ColourTable.cpp:52
+msgid "Color"
+msgstr "Lliw"
+
+#: ../src/gui/widgets/ColourTable.cpp:68
+msgid "Modify Color Name"
+msgstr "Addasu Enw'r Lliw"
+
+#: ../src/gui/configuration/ColourConfigurationPage.cpp:129
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:983
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:882
+#: ../src/gui/widgets/ColourTable.cpp:68
+msgid "Enter new name"
+msgstr "Mewnosod enw newydd"
+
+#: ../src/gui/widgets/ColourTable.cpp:107
+msgid "Default Color"
+msgstr "Lliw Rhagosod"
+
+#: ../src/gui/widgets/Rotary.cpp:108
+msgid ""
+"Click and drag up and down or left and right to modify.\n"
+"Double click to edit value directly."
+msgstr ""
+
+#: ../src/gui/widgets/Rotary.cpp:433
+#, fuzzy
+msgid "Select a new value"
+msgstr "Dileu'r priodwedd yma"
+
+#: ../src/gui/widgets/Rotary.cpp:434
+#, fuzzy
+msgid "Enter a new value"
+msgstr "Mewnosod enw newydd"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:80
+#, fuzzy
+msgid "Quantizer"
+msgstr "Cwanteiddio"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:86
+#, fuzzy
+msgid "Quantizer type:"
+msgstr "Math y Cwanteiddydd"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:88
+msgid "Grid quantizer"
+msgstr "Cwanteiddydd Rhwydell"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:89
+#, fuzzy
+msgid "Legato quantizer"
+msgstr "Cwanteiddydd Rhwydell"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:90
+msgid "Heuristic notation quantizer"
+msgstr "Cwanteiddydd nodiant darganfyddol"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:94
+msgid "Quantize for notation only (leave performance unchanged)"
+msgstr "Cwanteiddio am nodiant yn unig (dim newid i'r perfformiad)"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:104
+msgid "Notation parameters"
+msgstr "Paramedrau Nodiant"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:109
+#: ../src/gui/widgets/QuantizeParameters.cpp:150
+msgid "Base grid unit:"
+msgstr "Uned rhwydell sail:"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:114
+msgid "Complexity:"
+msgstr "Cymhlethder:"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:118
+msgid "Very high"
+msgstr "Uchel iawn"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:119
+msgid "High"
+msgstr "Uchel"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:224
+#: ../src/gui/widgets/QuantizeParameters.cpp:120
+msgid "Normal"
+msgstr "Arferol"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:121
+msgid "Low"
+msgstr "Isel"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:122
+msgid "Very low"
+msgstr "Isel iawn"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:125
+msgid "Tuplet level:"
+msgstr "Safon plygyn:"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:129
+msgid "2-in-the-time-of-3"
+msgstr "2-yn-amseriad-3"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4241
+#: ../src/gui/widgets/QuantizeParameters.cpp:130
+msgid "Triplet"
+msgstr "Tripled"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:138
+msgid "Any"
+msgstr "Unrhyw"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:141
+#, fuzzy
+msgid "Permit counterpoint"
+msgstr "Gwaredu gwrthpwynt"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:145
+msgid "Grid parameters"
+msgstr "Paramedrau Rhwydell"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:154
+msgid "Swing:"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:159
+msgid "Iterative amount:"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:165
+msgid "Quantize durations as well as start times"
+msgstr "Cwanteiddio parhadau wrth ymyl amserau dechrau"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:169
+msgid "After quantization"
+msgstr "Ar ol cwanteiddio"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:183
+#, fuzzy
+msgid "Show advanced options"
+msgstr "Dangos &Anodiadau"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:192
+msgid "Re-beam"
+msgstr "Ail-drawstio"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:194
+msgid "Add articulations (staccato, tenuto, slurs)"
+msgstr "Ychwanegu seiniadau (staccato, tenuto, llithriadau)"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:195
+msgid "Tie notes at barlines etc"
+msgstr "Clymu nodau wrth linellau bar ayyb"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:196
+msgid "Split-and-tie overlapping chords"
+msgstr "Hollti-a-clymu cordiau sy'n croesi"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:307
+#, fuzzy
+msgid "Full quantize"
+msgstr "Cwanteiddydd Rhwydell"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:450
+#, fuzzy
+msgid "Show Advanced Options"
+msgstr "Dangos &Anodiadau"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:454
+#, fuzzy
+msgid "Hide Advanced Options"
+msgstr "Anodiadau cudd"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:257
+#: ../src/gui/configuration/MatrixConfigurationPage.h:56
+#: ../src/gui/configuration/MatrixConfigurationPage.h:57
+#: ../src/gui/editors/matrix/MatrixView.cpp:2709
+msgid "Matrix"
+msgstr "Matrics"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:64
+msgid "Printable headers"
+msgstr ""
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:92
+#, fuzzy
+msgid "Dedication"
+msgstr "Dangosiad"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:96
+#: ../src/gui/editors/segment/PlayListView.cpp:35
+#, fuzzy
+msgid "Title"
+msgstr "Tripled"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:100
+#, fuzzy
+msgid "Subtitle"
+msgstr "<di-deitl>"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:104
+#, fuzzy
+msgid "Subsubtitle"
+msgstr "<di-deitl>"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:108
+#, fuzzy
+msgid "Poet"
+msgstr "saib"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:116
+#, fuzzy
+msgid "Composer"
+msgstr "Lliw"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:120
+#, fuzzy
+msgid "Meter"
+msgstr "Mesurydd VU Sain"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:124
+#, fuzzy
+msgid "Arranger"
+msgstr "Tripled"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:128
+#, fuzzy
+msgid "Piece"
+msgstr "Traw:"
+
+#: ../data/fonts/mappings/fonts.cpp:26
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:132
+msgid "Opus"
+msgstr ""
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:136
+#, fuzzy
+msgid "Copyright"
+msgstr "Hawlfraint:"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:140
+#, fuzzy
+msgid "Tagline"
+msgstr "Tripled"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:155
+#, fuzzy
+msgid "The composition comes here."
+msgstr "Newid Hyd y Cyfansoddiad"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:172
+msgid "Non-printable headers"
+msgstr ""
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:213
+msgid "Add New Property"
+msgstr "Ychwanegu Priodwedd Newydd"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:217
+msgid "Delete Property"
+msgstr "Dileu Priodwedd"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:236
+msgid "{new property %1}"
+msgstr "{priodwedd newydd %1}"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:236
+msgid "{new property}"
+msgstr "{priodwedd newydd}"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:243
+msgid "{undefined}"
+msgstr "{aniffiniedig}"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:87
+#, fuzzy
+msgid "Double-click opens segment in"
+msgstr "Golygydd rhagosodedig (am glic-dwbl ar gylchran)"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:91
+#, fuzzy
+msgid "Notation editor"
+msgstr "Nodiad"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:92
+#, fuzzy
+msgid "Matrix editor"
+msgstr "Gwaredu'r Dewisiad"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:93
+#, fuzzy
+msgid "Event List editor"
+msgstr "Agor yn y Golygydd &Rhestr Digwyddiadau"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:99
+msgid "Number of count-in measures when recording"
+msgstr "Nifer o fariau cyfrif-i-mewn wrth recordio"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:109
+#, fuzzy
+msgid "Auto-save interval"
+msgstr "Ysbaid hunan-gadw (mewn eiliadau)"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:112
+msgid "Every 30 seconds"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:113
+msgid "Every minute"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:114
+msgid "Every five minutes"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:115
+msgid "Every half an hour"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:116
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:277
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:157
+#, fuzzy
+msgid "Never"
+msgstr "Datsain"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:140
+#, fuzzy
+msgid "Use JACK transport"
+msgstr "Modd cludiant JACK"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:173
+msgid "Unknown"
+msgstr "Anhysbys"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:179
+msgid "No MIDI, audio OK"
+msgstr "Dim MIDI, sain iawn"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:182
+msgid "MIDI OK, no audio"
+msgstr "MIDI iawn, dim sain"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:185
+msgid "MIDI OK, audio OK"
+msgstr "MIDI iawn, sain iawn"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:188
+msgid "No driver"
+msgstr "Dim gyrrydd"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:195
+#, fuzzy
+msgid "Details..."
+msgstr "Dileu Traciau..."
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:204
+#, fuzzy
+msgid "Behavior"
+msgstr "Ymddygiad"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:219
+msgid "Side-bar parameter box layout"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:223
+msgid "Vertically stacked"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:225
+msgid "Tabbed"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:233
+msgid "Note name style"
+msgstr "Ardull enw nodyn"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:237
+msgid "Always use US names (e.g. quarter, 8th)"
+msgstr "Defnyddio enwau UD o hyd (ee chwarter, 8ed)"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:238
+#, fuzzy
+msgid "Localized (where available)"
+msgstr "Wedi ei leoli (lle ar gael)"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:252
+#, fuzzy
+msgid "Show textured background on"
+msgstr "Defnyddio cefndiroedd gweadog ar ardaloedd cynfas"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:254
+msgid "Main window"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:275
+msgid "Use bundled Klearlook theme"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:278
+msgid "When not running under KDE"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:279
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:159
+#, fuzzy
+msgid "Always"
+msgstr "Slaesau"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:287
+msgid "Presentation"
+msgstr "Cyflwyniad"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:423
+msgid ""
+"Changes to the textured background in the main window will not take effect "
+"until you restart Rosegarden."
+msgstr ""
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:168
+#: ../src/gui/configuration/GeneralConfigurationPage.h:78
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:207
+#: ../src/gui/configuration/MatrixConfigurationPage.cpp:59
+msgid "General"
+msgstr "Cyffredinol"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.h:79
+msgid "General Configuration"
+msgstr "Ffurfweddiad Cyffredinol"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:92
+msgid "Base octave number for MIDI pitch display"
+msgstr "Rhif wythfed y bas i ddangos traw MIDI"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:107
+msgid "Always use default studio when loading files"
+msgstr "Defnyddio'r stiwdio rhagosod o hyd wrth lwytho ffeiliau"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:119
+#, fuzzy
+msgid "Send all MIDI Controllers at start of each playback"
+msgstr ""
+"Anfon Rheolyddion MIDI wrth ddechrau chwarae\n"
+"(bydd yn achosi oedi cychwynnol sylweddol)"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:121
+msgid ""
+"Rosegarden can send all MIDI Controllers (Pan, Reverb etc) to all MIDI "
+"devices every\n"
+"time you hit play if you so wish. Please note that this option will usually "
+"incur a\n"
+"delay at the start of playback due to the amount of data being transmitted."
+msgstr ""
+"Gall Rosegarden anfon pob Rheolydd MIDI (Panio, Datsain, ayyb) i bob dyfais "
+"MIDI\n"
+"bob tro yr ydych yn gwasgu Chwarae, os ydych eisiau. Noder: bydd y dewisiad "
+"yma\n"
+"fel arfer yn achosi oedi wrth ddechrau'r chwarae o achos cymaint y ddata "
+"sy'n cael ei trosglwyddo."
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:138
+#, fuzzy
+msgid "Sequencer timing source"
+msgstr "Terfynodd y dilyniannydd"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:163
+msgid "Load SoundFont to SoundBlaster card at startup"
+msgstr ""
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:164
+msgid ""
+"Check this box to enable soundfont loading on EMU10K-based cards when "
+"Rosegarden is launched"
+msgstr ""
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:173
+msgid "Path to 'asfxload' or 'sfxload' command"
+msgstr ""
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:180
+msgid "SoundFont"
+msgstr ""
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:223
+#, fuzzy
+msgid "MIDI Clock and System messages"
+msgstr "Anfon negeseuon Cloc a Cysawd MIDI"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:229
+#, fuzzy
+msgid "Send MIDI Clock, Start and Stop"
+msgstr "Anfon negeseuon Cloc a Cysawd MIDI"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:230
+msgid "Accept Start, Stop and Continue"
+msgstr ""
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:241
+#, fuzzy
+msgid "MIDI Machine Control mode"
+msgstr "Trefnu Paramedrau Rheoli"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:248
+msgid "MMC Master"
+msgstr "Meistr MMC"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:249
+msgid "MMC Slave"
+msgstr "Gwas MMC"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:260
+msgid "MIDI Time Code mode"
+msgstr ""
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:267
+#, fuzzy
+msgid "MTC Master"
+msgstr "Meistr MMC"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:268
+#, fuzzy
+msgid "MTC Slave"
+msgstr "Gwas MMC"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:281
+msgid "Automatically connect sync output to all devices in use"
+msgstr ""
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:292
+#, fuzzy
+msgid "MIDI Sync"
+msgstr "Hwyrni MIDI"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:308
+msgid "sfxload path"
+msgstr ""
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:315
+msgid "Soundfont path"
+msgstr ""
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:67
+msgid "%1 minutes %2.%3%4 seconds (%5 units, %6 measures)"
+msgstr "%1 o funudau %2.%3%4 o eiliadau (%5 o unedau, %6 o fariau)"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:133
+msgid "Filename:"
+msgstr "Enw ffeil:"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:136
+msgid "Formal duration (to end marker):"
+msgstr ""
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:141
+#, fuzzy
+msgid "Playing duration:"
+msgstr "Yn chwarae ffeil sain"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:146
+#, fuzzy
+msgid "Tracks:"
+msgstr "Tra&ciau"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:147
+msgid "%1 used, %2 total"
+msgstr ""
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:152
+msgid "Segments:"
+msgstr "Cylchrannau"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:153
+msgid "%1 MIDI, %2 audio, %3 total"
+msgstr ""
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:161
+msgid "Statistics"
+msgstr "Ystadegau"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:170
+#: ../src/gui/editors/parameters/InstrumentParameterBox.cpp:155
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:92
+#, fuzzy
+msgid "Track"
+msgstr "Tra&ciau"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:171
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:125
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:90
+msgid "Label"
+msgstr "Labelu"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:172
+#, fuzzy
+msgid "Time"
+msgstr "Amser"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:174
+#, fuzzy
+msgid "Events"
+msgstr "Rhestr Digwyddiadau"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:175
+msgid "Polyphony"
+msgstr ""
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:176
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:126
+msgid "Repeat"
+msgstr "Ailadrodd"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:178
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:128
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:305
+#: ../src/gui/general/EditView.cpp:1488
+msgid "Transpose"
+msgstr "Trawsgyweirio"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:179
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:129
+msgid "Delay"
+msgstr "Oedi"
+
+#: ../src/gui/configuration/AudioConfigurationPage.h:61
+#: ../src/gui/configuration/AudioPropertiesPage.h:58
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:204
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:523
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:524
+msgid "Audio"
+msgstr "Sain"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:204
+#: ../src/gui/configuration/MIDIConfigurationPage.h:62
+#, fuzzy
+msgid "MIDI"
+msgstr "II"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:317
+#, fuzzy
+msgid "Segment Summary"
+msgstr "Cylchrannau"
+
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:63
+msgid "Audio file path:"
+msgstr "Llwybr ffeil sain:"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:137
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:68
+msgid "Choose..."
+msgstr "Dewis..."
+
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:73
+msgid "Disk space remaining:"
+msgstr "Lle ar ôl ar y ddisg:"
+
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:78
+msgid "Equivalent minutes of 16-bit stereo:"
+msgstr "Munudau cywerth o stereo 16-did:"
+
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:90
+msgid "Modify audio path"
+msgstr "Addasu llwybr sain"
+
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:113
+msgid "%1 out of %2 (%3% used)"
+msgstr ""
+
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:144
+msgid "minutes at"
+msgstr "munudau wrth"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.h:63
+#, fuzzy
+msgid "MIDI Settings"
+msgstr "Gosodiadau Lliw"
+
+#: ../src/gui/configuration/AudioConfigurationPage.h:62
+#: ../src/gui/configuration/AudioPropertiesPage.h:59
+msgid "Audio Settings"
+msgstr "Gosodiadau Sain"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:87
+msgid "Default layout mode"
+msgstr "Modd haenlun rhagosodedig"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:91
+msgid "Linear layout"
+msgstr "Haenlun llinellog"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:92
+msgid "Continuous page layout"
+msgstr "Haenlun tudalen parhaus"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:93
+msgid "Multiple page layout"
+msgstr "Haenlun tudalennau lluosol"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:101
+msgid "Default spacing"
+msgstr "Bylchu rhagosodedig"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:125
+#, fuzzy
+msgid "Default duration factor"
+msgstr "Parhad"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:141
+msgid "Full"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:152
+msgid "Show track headers (linear layout only)"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:158
+msgid "When needed"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:166
+msgid ""
+"\"Always\" and \"Never\" mean what they usually mean\n"
+"\"When needed\" means \"when staves are too many to all fit in the current "
+"window\""
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:178
+msgid "Show non-notation events as question marks"
+msgstr "Dangos digwyddiadau di-nodiant fel gofynnodau"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:188
+msgid "Show notation-quantized notes in a different color"
+msgstr "Dangos nodau wedi eu cwanteiddio yn y nodiant mewn lliw gwahanol"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:198
+msgid "Show \"invisible\" events in grey"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:208
+msgid "Show notes outside suggested playable range in red"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:218
+msgid "Highlight superimposed notes with a halo effect"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:231
+msgid "When recording MIDI, split-and-tie long notes at barlines"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:242
+msgid "Layout"
+msgstr "Haenlun"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:255
+msgid "Default note style for new notes"
+msgstr "Arddull nodyn rhagosodedig i nodau newydd"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:287
+msgid "When inserting notes..."
+msgstr "Wrth fewnosod nodau..."
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:294
+msgid "Split notes into ties to make durations match"
+msgstr "Hollti nodau i mewn i glymau i wneud i'r parhadau gydweddu"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:295
+msgid "Ignore existing durations"
+msgstr "Anwybyddu parhadau mewn bod"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:305
+msgid "Auto-beam on insert when appropriate"
+msgstr "Hunan-drawstio wrth mewnosod, lle addas"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:317
+#: ../src/gui/editors/notation/NotationEraser.cpp:54
+msgid "Collapse rests after erase"
+msgstr "Dat-ehangu seibiau ar ol dileu"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:328
+msgid "Default paste type"
+msgstr "Math gludo rhagosodedig"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:350
+msgid "Editing"
+msgstr "Golygu"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:362
+#, fuzzy
+msgid "Accidentals in one octave..."
+msgstr "Trawsgyweirio i fyny un wythfed..."
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:364
+msgid "Affect only that octave"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:365
+#, fuzzy
+msgid "Require cautionaries in other octaves"
+msgstr "Nid oes newidiadau tempo eraill."
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:366
+msgid "Affect all subsequent octaves"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:374
+#, fuzzy
+msgid "Accidentals in one bar..."
+msgstr "Bar Hapnodau"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:376
+msgid "Affect only that bar"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:377
+msgid "Require cautionary resets in following bar"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:378
+msgid "Require explicit resets in following bar"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:386
+msgid "Key signature cancellation style"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:388
+msgid "Cancel only when entering C major or A minor"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:389
+msgid "Cancel whenever removing sharps or flats"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:390
+msgid "Cancel always"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:400
+#, fuzzy
+msgid "Accidentals"
+msgstr "&Hapnodau"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:441
+msgid "Notation font"
+msgstr "Ffont Nodiant"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:467
+msgid "Origin:"
+msgstr "Tarddiad:"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:471
+msgid "Copyright:"
+msgstr "Hawlfraint:"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:475
+msgid "Mapped by:"
+msgstr "Wedi ei fapio gan:"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:479
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:81
+msgid "Type:"
+msgstr "Math:"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:508
+msgid "Font size for single-staff views"
+msgstr "Maint ffont i olygon erwydd sengl"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:516
+msgid "Font size for multi-staff views"
+msgstr "Maint ffont i olygon erwydd lluosol"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:524
+msgid "Font size for printing (pt)"
+msgstr "Maint wynebfath ar gyfer argraffu (pt)"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:541
+#, fuzzy
+msgid "Text font"
+msgstr "Testun:"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:549
+msgid "Sans-serif font"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:664
+#, fuzzy
+msgid "%1 (smooth)"
+msgstr "%1 (wedi'i hollti)"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:667
+#, fuzzy
+msgid "%1 (jaggy)"
+msgstr "%1 (rhan)"
+
+#: ../src/gui/configuration/LatencyConfigurationPage.cpp:58
+msgid "JACK latency"
+msgstr "Hwyrni JACK"
+
+#: ../src/gui/configuration/LatencyConfigurationPage.cpp:61
+msgid ""
+"Use the \"Fetch JACK latencies\" button to discover the latency values set "
+"at\n"
+"the sequencer. It's recommended that you use the returned values but it's "
+"also\n"
+"possible to override them manually using the sliders. Note that if you "
+"change\n"
+"your JACK server parameters you should always fetch the latency values "
+"again.\n"
+"The latency values will be stored by Rosegarden for use next time."
+msgstr ""
+"Defynyddiwch y botwm \"Nol hwyrnioedd JACK\" i ddarganfod y gwerthoedd "
+"hwyrni sydd wedi eu gosod\n"
+"wrth y dilyniannydd. Y peth gorau yw defnyddio'r gwerthoedd a ddangosir, "
+"ond mae'n bosibl hefyd\n"
+"i'w newid a llaw gan ddefnyddio'r llithryddion. Noder: ar ol i chi newid "
+"paramedrau eich\n"
+"gweinydd JACK, dylech nol y gwerthoedd hwyrni eto. Bydd Rosegarden yn "
+"cadw'r gwerthoedd\n"
+"hwyrni i ddeffnyddio'r tro nesaf."
+
+#: ../src/gui/configuration/LatencyConfigurationPage.cpp:65
+msgid "JACK playback latency (in ms)"
+msgstr "Hwyrni chwarae JACK (mewn ms)"
+
+#: ../src/gui/configuration/LatencyConfigurationPage.cpp:66
+msgid "JACK record latency (in ms)"
+msgstr "Hwyrni recordio JACK (mewn ms)"
+
+#: ../src/gui/configuration/LatencyConfigurationPage.cpp:68
+msgid "Fetch JACK latencies"
+msgstr "Nol hwyrnioedd JACK"
+
+#: ../src/gui/configuration/LatencyConfigurationPage.cpp:121
+msgid "JACK Latency"
+msgstr "Hwyrni JACK"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:92
+#, fuzzy
+msgid "Audio preview scale"
+msgstr "Ychwanegu Ffeil Sain"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:96
+msgid "Linear - easier to see loud peaks"
+msgstr ""
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:97
+msgid "Meter scaling - easier to see quiet activity"
+msgstr ""
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:105
+#, fuzzy
+msgid "Record audio files as"
+msgstr "<dim ffeil sain>"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:107
+msgid "16-bit PCM WAV format (smaller files)"
+msgstr ""
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:108
+msgid "32-bit float WAV format (higher quality)"
+msgstr ""
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:117
+msgid "External audio editor"
+msgstr "Golygydd sain allanol"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:145
+msgid "Create JACK outputs"
+msgstr ""
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:150
+#, fuzzy
+msgid "for individual audio instruments"
+msgstr "<dim offeryn>"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:157
+#, fuzzy
+msgid "for submasters"
+msgstr "Dangos Rhes&yddion"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:184
+#, fuzzy
+msgid ""
+"Rosegarden can start the JACK audio daemon (jackd) for you automatically if "
+"it isn't already running when Rosegarden starts.\n"
+"\n"
+"This is recommended for beginners and those who use Rosegarden as their main "
+"audio application, but it might not be to the liking of advanced users.\n"
+"\n"
+"If you want to start JACK automatically, make sure the command includes a "
+"full path where necessary as well as any command-line arguments you want to "
+"use.\n"
+"\n"
+"For example: /usr/local/bin/jackd -d alsa -d hw -r44100 -p 2048 -n 2\n"
+"\n"
+msgstr ""
+"Gall Rosegarden gychwyn yr ellyll sain JACK (jackd) i chi\n"
+"yn ymysgogol os nid yw'n rhedeg eisoes pan dechreua Rosegarden.\n"
+"\n"
+"Argymhellir hyn ar gyfer dechreuwyr a'r rhai sy'n defnyddio Rosegarden fel "
+"eu prif\n"
+"gymhwysiad sain, ond gall defnyddwyr uwch fod yn anfodlon efo fo.\n"
+"\n"
+"Os ydych eisiau cychwyn JACK yn ymysgogol, sicrhewch fod y gorchymyn yn "
+"cynnwys\n"
+"llwybr cyfan lle bo angen, ac unrhyw argymhellion llinell gorchymyn yr "
+"hoffech ddefnyddio.\n"
+"\n"
+"Er enghraifft: /usr/local/bin/jackd -d alsa -d hw -r44100 -p 2048 -n 2\n"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:196
+msgid "Start JACK when Rosegarden starts"
+msgstr "Cychwyn JACK pan dechreua Rosegarden"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:201
+msgid "JACK command"
+msgstr ""
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:214
+#, fuzzy
+msgid "JACK Startup"
+msgstr "Ymgychwyn"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:224
+#, fuzzy
+msgid "External audio editor path"
+msgstr "Golygydd sain allanol"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:262
+msgid "External audio editor \"%1\" not found or not executable"
+msgstr ""
+
+#: ../src/gui/configuration/ColourConfigurationPage.cpp:70
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:448
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:863
+msgid "Add New Color"
+msgstr "Ychwanegu Lliw Newydd"
+
+#: ../src/gui/configuration/ColourConfigurationPage.cpp:74
+msgid "Delete Color"
+msgstr "Dileu Lliw"
+
+#: ../src/gui/configuration/ColourConfigurationPage.cpp:93
+msgid "Color Map"
+msgstr "Map Lliw"
+
+#: ../src/gui/configuration/ColourConfigurationPage.cpp:128
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:983
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:882
+msgid "New Color Name"
+msgstr "Enw'r Lliw Newydd"
+
+#: ../src/gui/configuration/ColourConfigurationPage.cpp:130
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:59
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:984
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:883
+#: ../src/gui/studio/DeviceManagerDialog.cpp:115
+#: ../src/gui/studio/DeviceManagerDialog.cpp:174
+msgid "New"
+msgstr "Newydd"
+
+#: ../src/gui/configuration/LatencyConfigurationPage.h:62
+msgid "Latency"
+msgstr "Hwyrni"
+
+#: ../src/gui/configuration/LatencyConfigurationPage.h:63
+msgid "Sequencer Latency"
+msgstr "Hwyrni Dilyniannydd"
+
+#: ../src/gui/configuration/ColourConfigurationPage.h:61
+msgid "Color Settings"
+msgstr "Gosodiadau Lliw"
+
+#: ../src/gui/studio/MidiDeviceListViewItem.cpp:55
+#: ../src/gui/studio/MidiKeyMapListViewItem.cpp:44
+#, fuzzy
+msgid "Key Mapping"
+msgstr "Newid Allwedd"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:97
+msgid "Manage MIDI Banks and Programs"
+msgstr "Rheoli Rhengau MIDI a Rhaglenni"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:128
+msgid "MIDI Device"
+msgstr "Dyfais MIDI"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:130
+#: ../src/gui/studio/BankEditorDialog.cpp:219
+msgid "MSB"
+msgstr "MSB"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:131
+#: ../src/gui/studio/BankEditorDialog.cpp:218
+msgid "LSB"
+msgstr "LSB"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:140
+#, fuzzy
+msgid "Add Bank"
+msgstr "Ychwanegu Traciau..."
+
+#: ../src/gui/studio/BankEditorDialog.cpp:141
+#, fuzzy
+msgid "Add Key Mapping"
+msgstr "Ychwanegu &Newid Cywair..."
+
+#: ../src/gui/studio/BankEditorDialog.cpp:153
+msgid "Add a Bank to the current device"
+msgstr "Ychwanegu Rheng i'r dyfais cyfredol"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:157
+#, fuzzy
+msgid "Add a Percussion Key Mapping to the current device"
+msgstr "Ychwanegu Rheng i'r dyfais cyfredol"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:161
+#, fuzzy
+msgid "Delete the current Bank or Key Mapping"
+msgstr "Dileu y Rheng cyfredol"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:165
+#, fuzzy
+msgid "Delete all Banks and Key Mappings from the current Device"
+msgstr "Dileu pob Rheng o'r Dyfais cyfredol"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:167
+#: ../src/gui/studio/DeviceManagerDialog.cpp:117
+#, fuzzy
+msgid "Import..."
+msgstr "&Mewnforio"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:168
+#: ../src/gui/studio/DeviceManagerDialog.cpp:118
+#, fuzzy
+msgid "Export..."
+msgstr "Allforio fel..."
+
+#: ../src/gui/studio/BankEditorDialog.cpp:176
+msgid ""
+"Import Bank and Program data from a Rosegarden file to the current Device"
+msgstr ""
+"Mewnforio data Rheng a Rhaglen oddiwrth ffeil Rosegarden i'r Dyfais cyfredol"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:179
+msgid ""
+"Export all Device and Bank information to a Rosegarden format interchange "
+"file"
+msgstr ""
+"Allforio gwybodaeth pob Dyfais a Rheng i ffeil rhyngnewid fformat Rosegarden"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:190
+msgid "Copy all Program names from current Bank to clipboard"
+msgstr "Copio pob enw Rhaglen o'r Rheng cyfredol i'r gludfwrdd"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:194
+msgid "Paste Program names from clipboard to current Bank"
+msgstr "Gludo enwau Rhaglen o'r gludfwrdd i'r Rheng cyfredol"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:216
+msgid "Show Variation list based on "
+msgstr "Dangos rhestr Amrywiad wedi'i seilio ar"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1010
+msgid "<new bank>"
+msgstr "<rheng newydd>"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1046
+#, fuzzy
+msgid "<new mapping>"
+msgstr "<rheng newydd>"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1048
+#, fuzzy
+msgid "<new mapping %1>"
+msgstr "<rheng newydd>"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1089
+msgid "Really delete this bank?"
+msgstr "Wir dileu y rheng yma?"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1137
+#, fuzzy
+msgid "Really delete this key mapping?"
+msgstr "Wir dileu y rheng yma?"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1187
+msgid "Really delete all banks for "
+msgstr "Wir dileu pob rheng am"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1476
+msgid "Import Banks from Device in File"
+msgstr "Mewnforio Rhengau o Ddyfais mewn Ffeil"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1623
+#: ../src/gui/studio/DeviceManagerDialog.cpp:770
+msgid "Export Device as..."
+msgstr "Allforio Dyfais fel ..."
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1694
+msgid ""
+"There are unsaved changes.\n"
+"Do you want to apply the changes before exiting the Bank Editor or discard "
+"the changes ?"
+msgstr ""
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1697
+#, fuzzy
+msgid "Unsaved Changes"
+msgstr "Newid Allwedd"
+
+#: ../src/gui/studio/NameSetEditor.cpp:68
+msgid "Librarian"
+msgstr "Rhaglengellydd"
+
+#: ../src/gui/studio/NameSetEditor.cpp:75
+msgid "Email"
+msgstr "Ebost"
+
+#: ../src/gui/studio/NameSetEditor.cpp:80
+#, fuzzy
+msgid ""
+"The librarian maintains the Rosegarden device data for this device.\n"
+"If you've made modifications to suit your own device, it might be worth\n"
+"liaising with the librarian in order to publish your information for the "
+"benefit\n"
+"of others."
+msgstr ""
+"Mae'r rhaglengellydd yn cynnal y gwybodaeth generig Rheng a Rhaglen ar gyfer "
+"y ddyfais yma.\n"
+"Os ydych wedi gwneud addasiadau i Reng ar gyfer eich dyfais eich hun, "
+"efallai bydd hi'n werth\n"
+"cysylltu a'r rhaglengellydd er mwyn cyhoeddi eich gwybodaeth Rheng i fantais "
+"eraill."
+
+#: ../src/gui/studio/MidiBankListViewItem.cpp:51
+#: ../src/gui/studio/MidiDeviceListViewItem.cpp:48
+#, fuzzy
+msgid "Percussion Bank"
+msgstr "Trawiad"
+
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:84
+#: ../src/gui/studio/MidiBankListViewItem.cpp:51
+#: ../src/gui/studio/MidiDeviceListViewItem.cpp:48
+msgid "Bank"
+msgstr "Rheng"
+
+#: ../src/gui/studio/ChangeRecordDeviceCommand.h:39
+#, fuzzy
+msgid "Change Record Device"
+msgstr "Ychwanegu Dyfais Recordio"
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:61
+#: ../src/gui/studio/DeviceManagerDialog.cpp:96
+msgid "Manage MIDI Devices"
+msgstr "Rheoli Dyfeisiau MIDI"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:98
+#, fuzzy
+msgid "Play devices"
+msgstr "Chwarae Rhagolwg"
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:76
+#: ../src/gui/studio/DeviceManagerDialog.cpp:106
+#: ../src/gui/studio/DeviceManagerDialog.cpp:165
+msgid "Connection"
+msgstr "Cysylltiad"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:119
+#, fuzzy
+msgid "Banks..."
+msgstr "Rheoli Rhengau ...."
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:120
+#, fuzzy
+msgid "Control Events..."
+msgstr "Digwyddiadau Rheolydd"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:126
+#, fuzzy
+msgid "Create a new Play device"
+msgstr "Creu Dyfais"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:129
+#: ../src/gui/studio/DeviceManagerDialog.cpp:184
+#, fuzzy
+msgid "Delete the selected device"
+msgstr "Dileu Dyfais"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:132
+#, fuzzy
+msgid ""
+"Import Bank, Program and Controller data from a Rosegarden file to the "
+"selected device"
+msgstr ""
+"Mewnforio data Rheng a Rhaglen oddiwrth ffeil Rosegarden i'r Dyfais cyfredol"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:135
+#, fuzzy
+msgid "Export Bank and Controller data to a Rosegarden interchange file"
+msgstr ""
+"Allforio gwybodaeth pob Dyfais a Rheng i ffeil rhyngnewid fformat Rosegarden"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:138
+msgid "View and edit Banks and Programs for the selected device"
+msgstr ""
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:141
+msgid ""
+"View and edit Control Events for the selected device - these are special "
+"Event types that you can define against your device and control through "
+"Control Rulers or the Instrument Parameter Box "
+msgstr ""
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:156
+#, fuzzy
+msgid "Record devices"
+msgstr "<dim dyfeisiau recordio>"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:164
+#, fuzzy
+msgid "Current"
+msgstr "ar hyn o bryd"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:181
+#, fuzzy
+msgid "Create a new Record device"
+msgstr "<dim dyfeisiau recordio>"
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:360
+#: ../src/gui/studio/DeviceEditorDialog.cpp:378
+#: ../src/gui/studio/DeviceManagerDialog.cpp:486
+#: ../src/gui/studio/DeviceManagerDialog.cpp:501
+msgid "New Device"
+msgstr "Dyfais Newydd"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:703
+#, fuzzy
+msgid "Import from Device in File"
+msgstr "Mewnforio Rhengau o Ddyfais mewn Ffeil"
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:55
+msgid "Remap Instrument assigments..."
+msgstr "Ail-fapio gosodiadau'r Offerynnau ..."
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:62
+msgid "Device or Instrument"
+msgstr "Dyfais neu Offeryn"
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:65
+msgid "Remap Tracks by all Instruments on a Device or by single Instrument"
+msgstr "Ail-fapio Traciau gan pob Offeryn ar Ddyfais neu gan Offeryn sengl"
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:74
+msgid "Choose Source and Destination"
+msgstr "Dewis Tarddiad a Cyrchfan"
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:77
+msgid "From"
+msgstr "Oddiwrth"
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:78
+msgid "To"
+msgstr "I"
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:120
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:121
+msgid "<no devices>"
+msgstr "<dim dyfais>"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:155
+#, fuzzy
+msgid "Show Audio &Faders"
+msgstr "Dangos Rhes&yddion"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:160
+#, fuzzy
+msgid "Show Synth &Faders"
+msgstr "Dangos Rhes&yddion"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:165
+#, fuzzy
+msgid "Show &Submasters"
+msgstr "Dangos Rhes&yddion"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:170
+#, fuzzy
+msgid "Show &Plugin Buttons"
+msgstr "Botwm ategyn sain"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:175
+#, fuzzy
+msgid "Show &Unassigned Faders"
+msgstr "Dangos Rhes&yddion"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:184
+#, c-format
+msgid ""
+"_n: 1 Input\n"
+"%n Inputs"
+msgstr ""
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:194
+msgid "No Submasters"
+msgstr ""
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:203
+#, fuzzy, c-format
+msgid ""
+"_n: 1 Submaster\n"
+"%n Submasters"
+msgstr "Nifer o fewnbynnau sain JACK"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:279
+#, fuzzy
+msgid "Audio Mixer"
+msgstr "Pylydd Sain"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:311
+#, fuzzy
+msgid "Record input source"
+msgstr "Nid oes offeryn Recordio wedi'i ddewis"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:322
+msgid "Output destination"
+msgstr ""
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:336
+#: ../src/gui/studio/AudioMixerWindow.cpp:495
+msgid "Pan"
+msgstr "Tremio"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:355
+msgid "Mono or stereo"
+msgstr ""
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:364
+#: ../src/gui/studio/AudioMixerWindow.cpp:513
+msgid "Mute"
+msgstr ""
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:373 rc.cpp:408
+#, no-c-format
+msgid "Solo"
+msgstr "Unawd"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:382
+#, fuzzy
+msgid "Arm recording"
+msgstr "Recordio"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:400
+#, fuzzy, c-format
+msgid "Audio %1"
+msgstr "Sain"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:404
+#, fuzzy, c-format
+msgid "Synth %1"
+msgstr "Dat-&wneud %1"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:578
+#: ../src/gui/studio/AudioMixerWindow.cpp:580
+#, fuzzy
+msgid "Audio master output level"
+msgstr "Ychwanegu Ffeil Sain"
+
+#: ../src/gui/studio/SynthPluginManagerDialog.cpp:71
+msgid "Manage Synth Plugins"
+msgstr ""
+
+#: ../src/gui/studio/SynthPluginManagerDialog.cpp:78
+#, fuzzy
+msgid "Synth plugins"
+msgstr "Botwm ategyn sain"
+
+#: ../src/gui/studio/SynthPluginManagerDialog.cpp:145
+#, fuzzy
+msgid "Controls"
+msgstr "Rheolydd"
+
+#: ../src/gui/studio/SynthPluginManagerDialog.cpp:152
+#, fuzzy
+msgid "Editor >>"
+msgstr "Golygu"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:66
+#: ../src/gui/studio/MidiProgramsEditor.cpp:169
+msgid "Bank and Program details"
+msgstr "Manylion Rheng a Rhaglen"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:67
+#, fuzzy
+msgid "Programs"
+msgstr "Rhaglen"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2711
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:88
+#: ../src/gui/studio/MidiProgramsEditor.cpp:93
+msgid "Percussion"
+msgstr "Trawiad"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:99
+msgid "MSB Value"
+msgstr "Gwerth MSB"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:107
+msgid ""
+"Selects a MSB controller Bank number (MSB/LSB pairs are always unique for "
+"any Device)"
+msgstr ""
+"Dewis rhif Rheng y rheolydd MSB (mae parau MSB/LSB o hyd yn unigryw am "
+"unrhyw Dyfais)"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:111
+msgid ""
+"Selects a LSB controller Bank number (MSB/LSB pairs are always unique for "
+"any Device)"
+msgstr ""
+"Dewis rhif Rheng y rheolydd LSB (mae parau MSB/LSB o hyd yn unigryw am "
+"unrhyw Dyfais)"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:116
+msgid "LSB Value"
+msgstr "Gwerth LSB"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:254
+#: ../src/gui/studio/MidiProgramsEditor.cpp:541
+#, fuzzy, c-format
+msgid "Key Mapping: %1"
+msgstr "Newid Allwedd"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:476
+msgid "<no key mapping>"
+msgstr ""
+
+#: ../src/gui/studio/MidiKeyMappingEditor.cpp:57
+#: ../src/gui/studio/MidiKeyMappingEditor.cpp:81
+msgid "Key Mapping details"
+msgstr ""
+
+#: ../src/gui/studio/MidiKeyMappingEditor.cpp:58
+#, fuzzy
+msgid "Pitches"
+msgstr "Traw:"
+
+#: ../src/gui/studio/MidiMixerWindow.cpp:152
+#, fuzzy
+msgid "MIDI Mixer"
+msgstr "Cyfuno MIDI"
+
+#: ../src/gui/studio/MidiMixerWindow.cpp:199
+msgid "Volume"
+msgstr "Swn"
+
+#: ../src/gui/studio/AudioPluginOSCGUIManager.cpp:444
+#, fuzzy
+msgid "Rosegarden Plugin"
+msgstr "Rosegarden"
+
+#: ../src/gui/studio/AudioPluginOSCGUIManager.cpp:447
+#, fuzzy, c-format
+msgid "Rosegarden: %1"
+msgstr "Rosegarden"
+
+#: ../src/gui/studio/AudioPluginOSCGUIManager.cpp:449
+#, fuzzy
+msgid "Rosegarden: %1: %2"
+msgstr "Rosegarden"
+
+#: ../src/gui/studio/AudioPluginOSCGUIManager.cpp:450
+#, fuzzy, c-format
+msgid "Plugin slot %1"
+msgstr "Ategyn"
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:92
+msgid "Add Play Device"
+msgstr "Ychwanegu Dyfais Chwarae"
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:93
+msgid "Add Record Device"
+msgstr "Ychwanegu Dyfais Recordio"
+
+#: ../src/commands/studio/CreateOrDeleteDeviceCommand.h:68
+#: ../src/gui/studio/DeviceEditorDialog.cpp:94
+msgid "Delete Device"
+msgstr "Dileu Dyfais"
+
+#: ../src/gui/editors/segment/PlayList.cpp:77
+#: ../src/gui/studio/DeviceEditorDialog.cpp:156
+#: ../src/gui/studio/DeviceEditorDialog.cpp:361
+msgid "Play"
+msgstr "Chwarae"
+
+#: ../src/commands/segment/SegmentRecordCommand.cpp:37
+#: ../src/gui/studio/DeviceEditorDialog.cpp:156
+#: ../src/gui/studio/DeviceEditorDialog.cpp:379 rc.cpp:394
+#, no-c-format
+msgid "Record"
+msgstr "Recordio"
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:256
+msgid "Apply pending changes?"
+msgstr "Gweithredu newidiadau sy'n disgwyl? "
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:359
+#: ../src/gui/studio/DeviceEditorDialog.cpp:377
+msgid "<new device>"
+msgstr "<dyfais newydd>"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentEraser.cpp:82
+msgid "Click on a segment to delete it"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSplitter.cpp:166
+msgid ""
+"Click on a segment to split it in two; hold Shift to avoid snapping to beat "
+"grid"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSplitter.cpp:168
+msgid "Click on a segment to split it in two"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:81
+#, fuzzy
+msgid "Click and drag to select segments"
+msgstr "Newid i Erfyn Dewis"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentMover.cpp:154
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:238
+msgid "Move Segment"
+msgstr "Symud Cylchran"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentMover.cpp:154
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:239
+msgid "Move Segments"
+msgstr "Symud Cylchrannau"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:217
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:169
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:141
+#: ../src/gui/editors/segment/segmentcanvas/SegmentMover.cpp:210
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:255
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:359
+msgid "Hold Shift to avoid snapping to beat grid"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:485
+msgid ""
+"Click and drag to select segments; middle-click and drag to draw an empty "
+"segment"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:384
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:502
+msgid ""
+"Click and drag to resize a segment; hold Ctrl as well to rescale its contents"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:386
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:504
+msgid "Click and drag to rescale segment"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:509
+msgid "Click and drag to move segments; hold Ctrl as well to copy them"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:511
+msgid "Click and drag to copy segments"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:515
+msgid ""
+"Click and drag to move segment; hold Ctrl as well to copy it; double-click "
+"to edit"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:517
+msgid "Click and drag to copy segment"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:157
+msgid ""
+"The audio file path does not exist or is not writable.\n"
+"You must set the audio file path to a valid directory in Document Properties "
+"before rescaling an audio file.\n"
+"Would you like to set it now?"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:261
+msgid ""
+"Hold Shift to avoid snapping to beat grid; hold Ctrl as well to rescale "
+"contents"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentMover.cpp:325
+msgid "Click and drag to move a segment"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentPencil.cpp:225
+msgid "Hold Shift to avoid snapping to bar lines"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentPencil.cpp:283
+#, fuzzy
+msgid "Record or drop audio here"
+msgstr "Recordio ai MIDI neu sain"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentPencil.cpp:289
+msgid ""
+"Click and drag to draw an empty segment. Control+Alt click and drag to draw "
+"in overlap mode."
+msgstr ""
+
+#: ../src/gui/editors/segment/TrackLabel.cpp:77
+msgid ""
+"Click and hold with left mouse button to assign this Track to an Instrument."
+msgstr ""
+
+#: ../src/gui/editors/segment/TrackLabel.cpp:191
+msgid "Change track name"
+msgstr ""
+
+#: ../src/gui/editors/segment/TrackLabel.cpp:192
+#, fuzzy
+msgid "Enter new track name"
+msgstr "Mewnosod enw newydd"
+
+#: ../src/gui/editors/segment/TrackEditor.cpp:648
+msgid "Turn Repeating Segment into Real Copies"
+msgstr "Trosi Cylchran wedi ei Ailadrodd i mewn i Copiau go Iawn"
+
+#: ../src/gui/editors/segment/TrackEditor.cpp:650
+msgid "Turn Repeating Segments into Real Copies"
+msgstr "Trosi Cylchrannau wedi ei Ailadrodd i mewn i Copiau go Iawn"
+
+#: ../src/gui/editors/segment/TrackEditor.cpp:814
+msgid ""
+"You can't drop files into Rosegarden from this client. Try using Konqueror "
+"instead."
+msgstr ""
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:85
+#, fuzzy
+msgid "Manage Triggered Segments"
+msgstr "Rheoli Cylchrannau &Sain"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:89
+#, fuzzy
+msgid "ID"
+msgstr "I"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:735
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:93
+#, fuzzy
+msgid "Base velocity"
+msgstr "Buanedd y nodyn:"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:94
+#, fuzzy
+msgid "Triggers"
+msgstr "Tripled"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:115
+msgid "Add a Triggered Segment"
+msgstr ""
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:119
+msgid "Delete a Triggered Segment"
+msgstr ""
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:123
+#, fuzzy
+msgid "Delete All Triggered Segments"
+msgstr "Dewis &Pob Cylchran"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:127
+msgid "Close the Triggered Segment Manager"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:169
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:245
+#, fuzzy
+msgid "<no label>"
+msgstr "<dim>"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:248
+msgid ""
+"_n: %1 on 1 track\n"
+"%1 on %n tracks"
+msgstr ""
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:284
+msgid ""
+"This will remove all triggered segments from the whole composition. Are you "
+"sure?"
+msgstr ""
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:288
+#, fuzzy
+msgid "Remove all triggered segments"
+msgstr "&Gwaredu Pob Arwydd"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:313
+#, fuzzy
+msgid "Trigger Segment Duration"
+msgstr "Gosod &Tempo i Barhad Cylchran Sain"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:336
+#, c-format
+msgid ""
+"_n: This triggered segment is used 1 time in the current composition. Are "
+"you sure you want to remove it?\n"
+"This triggered segment is used %n times in the current composition. Are you "
+"sure you want to remove it?"
+msgstr ""
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:400
+msgid "Pa&ste as New Triggered Segment"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1169
+#: ../src/gui/editors/segment/MarkerEditor.cpp:399
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:412
+#: ../src/gui/editors/tempo/TempoView.cpp:622
+msgid "&Musical Times"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1179
+#: ../src/gui/editors/segment/MarkerEditor.cpp:409
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:422
+#: ../src/gui/editors/tempo/TempoView.cpp:632
+#, fuzzy
+msgid "&Real Times"
+msgstr "Gwir-amser:"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1189
+#: ../src/gui/editors/segment/MarkerEditor.cpp:419
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:432
+#: ../src/gui/editors/tempo/TempoView.cpp:642
+#, fuzzy
+msgid "Ra&w Times"
+msgstr "Gwir-amser:"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:83
+msgid "Manage Markers"
+msgstr "Rheoli Arwyddion"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:86
+msgid "Marker time "
+msgstr "Amser yr arwydd"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:87
+#, fuzzy
+msgid "Marker text "
+msgstr "Amser yr arwydd"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:88
+msgid "Marker description "
+msgstr "Disgrifiad yr arwydd"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:95
+msgid "Pointer position"
+msgstr "Lleoliad y cyrchydd"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:100
+msgid "Real time:"
+msgstr "Gwir-amser:"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:103
+msgid "In measure:"
+msgstr ""
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:121
+msgid "Add a Marker"
+msgstr "Ychwanegu Arwydd"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:125
+msgid "Delete a Marker"
+msgstr "Dileu Arwydd"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:129
+msgid "Delete All Markers"
+msgstr "Dileu Pob Arwydd"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:133
+msgid "Close the Marker Editor"
+msgstr "Cau'r Golygydd Arwyddion"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:296
+#, fuzzy
+msgid "Remove all markers"
+msgstr "&Gwaredu Pob Arwydd"
+
+#: ../src/gui/editors/segment/PlayList.cpp:76
+#, fuzzy
+msgid "Add..."
+msgstr "..."
+
+#: ../src/gui/editors/segment/PlayList.cpp:78
+#, fuzzy
+msgid "Move Up"
+msgstr "Symud Trac i &Fyny"
+
+#: ../src/gui/editors/segment/PlayList.cpp:79
+#, fuzzy
+msgid "Move Down"
+msgstr "Symud Trac i &Lawr"
+
+#: ../src/gui/editors/segment/PlayList.cpp:124
+#, fuzzy
+msgid "Select one or more Rosegarden files"
+msgstr "Dewis un neu mwy o Ffeiliau Sain"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:73
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:55
+msgid "<not showing>"
+msgstr ""
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:89
+#, fuzzy
+msgid "Manage Control Events"
+msgstr "Trefnu Paramedrau Rheoli"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:91
+#, fuzzy
+msgid "<no device>"
+msgstr "<dim dyfais>"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:99
+msgid " Control Events for %1 (device %2)"
+msgstr ""
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:104
+#, fuzzy
+msgid "Control Event name "
+msgstr "Enw'r rheolydd"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:105
+#, fuzzy
+msgid "Control Event type "
+msgstr "Math y rheolydd"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:106
+#, fuzzy
+msgid "Control Event value "
+msgstr "Gwerth y rheolydd"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:107
+msgid "Description "
+msgstr "Disgrifiad"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:108
+msgid "Min "
+msgstr "Lleiafrif"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:109
+msgid "Max "
+msgstr "Uchafrif"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:110
+msgid "Default "
+msgstr "Rhagosod"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:111
+msgid "Color "
+msgstr "Lliw"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:112
+#, fuzzy
+msgid "Position on instrument panel"
+msgstr "Wedi canfod math anhysbys o Offeryn"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:136
+msgid "Add a Control Parameter to the Studio"
+msgstr "Ychwanegu Paramedr Rheoli i'r Stiwdio"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:140
+msgid "Delete a Control Parameter from the Studio"
+msgstr "Dileu Paramedr Rheoli o'r Stiwdio"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:144
+msgid "Close the Control Parameter editor"
+msgstr "Cau'r golygydd Paramedr Rheoli"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:221
+#, fuzzy
+msgid "<default>"
+msgstr "(rhagosod)"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:62
+msgid "Edit Control Parameter"
+msgstr "Golygu Paramedr Rheoli"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:71
+#, fuzzy
+msgid "Control Event Properties"
+msgstr "Priodweddau'r Paramedr Rheoli"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:77
+msgid "Name:"
+msgstr "Enw:"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:93
+#, fuzzy
+msgid "Control Event value:"
+msgstr "Gwerth y rheolydd:"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:97
+msgid "Minimum value:"
+msgstr "Gwerth lleiaf:"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:101
+msgid "Maximum value:"
+msgstr "Gwerth uchaf:"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:105
+msgid "Default value:"
+msgstr "Gwerth rhagosod:"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:109
+msgid "Color:"
+msgstr "Lliw:"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:113
+#, fuzzy
+msgid "Instrument Parameter Box position:"
+msgstr "Paramedrau Offerynnau"
+
+#: ../src/gui/editors/segment/TrackButtons.cpp:209
+#: ../src/gui/editors/segment/TrackButtons.cpp:585
+#: ../src/gui/editors/segment/TrackButtons.cpp:935
+#: ../src/gui/editors/segment/TrackButtons.cpp:1127
+msgid "<no instrument>"
+msgstr "<dim offeryn>"
+
+#: ../src/gui/editors/segment/TrackButtons.cpp:352
+#: ../src/gui/editors/segment/TrackButtons.cpp:1094
+#, fuzzy
+msgid "<untitled audio>"
+msgstr "<di-deitl>"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:130
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:662
+#: ../src/gui/editors/segment/TrackButtons.cpp:354
+#: ../src/gui/editors/segment/TrackButtons.cpp:1096
+msgid "<untitled>"
+msgstr "<di-deitl>"
+
+#: ../src/gui/editors/segment/TrackButtons.cpp:1058
+#, fuzzy
+msgid "Mute track"
+msgstr "Ymladd"
+
+#: ../src/gui/editors/segment/TrackButtons.cpp:1063
+msgid "Record on this track"
+msgstr ""
+
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:88
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:1015
+#, fuzzy
+msgid "Segment"
+msgstr "Cylch&rannau"
+
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:89
+#, fuzzy
+msgid "Segment Parameters"
+msgstr "Paramedrau Cylchrannau"
+
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:366
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:697
+msgid "%1 ms"
+msgstr "%1 ms"
+
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:1031
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:910
+msgid "Highest playable note"
+msgstr ""
+
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:1051
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:930
+msgid "Lowest playable note"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:93
+#, fuzzy
+msgid "Track Parameters"
+msgstr "Paramedrau Rhwydell"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:137
+#, fuzzy
+msgid "Playback parameters"
+msgstr "Safon chwarae ="
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:172
+#, fuzzy
+msgid "Recording filters"
+msgstr "<dim dyfeisiau recordio>"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:191
+msgid "Channel"
+msgstr "Sianel"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:203
+#, fuzzy
+msgid "Staff export options"
+msgstr "Dangos &Anodiadau"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:220
+#, fuzzy
+msgid "Notation size:"
+msgstr "Nodiad"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:225
+#, fuzzy
+msgid "Small"
+msgstr "Popeth"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:226
+msgid "Tiny"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:233
+#, fuzzy
+msgid "Bracket type:"
+msgstr "Math y testun:"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:237
+msgid "-----"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:238
+msgid "[----"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:239
+msgid "----]"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:240
+msgid "[---]"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:241
+msgid "{----"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:242
+msgid "----}"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:243
+msgid "{[---"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:244
+msgid "---]}"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:253
+#, fuzzy
+msgid "Create segments with"
+msgstr "Creu Cylchran"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:264
+#, fuzzy
+msgid "Preset"
+msgstr "saib"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:272
+msgid "Load"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:282
+#, fuzzy
+msgid "treble"
+msgstr "Trebl"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:283
+#, fuzzy
+msgid "bass"
+msgstr "Bas"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:284
+#, fuzzy
+msgid "crotales"
+msgstr "Wythfed &Is"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:285
+msgid "xylophone"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:286
+msgid "guitar"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:287
+msgid "contrabass"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:288
+#, fuzzy
+msgid "celesta"
+msgstr "Di&leu"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:289
+msgid "old celesta"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:290
+msgid "french"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:291
+msgid "soprano"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:292
+#, fuzzy
+msgid "mezzosoprano"
+msgstr "S&forzando"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:293
+#, fuzzy
+msgid "alto"
+msgstr "Alto"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:294
+#, fuzzy
+msgid "tenor"
+msgstr "Tenor"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:295
+#, fuzzy
+msgid "baritone"
+msgstr "Amrywiad"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:296
+#, fuzzy
+msgid "varbaritone"
+msgstr "Amrywiad"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:297
+#, fuzzy
+msgid "subbass"
+msgstr "Bas"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:327
+#, fuzzy
+msgid "Lowest"
+msgstr "Isel"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:329
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:336
+msgid "---"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:331
+msgid "Choose the lowest suggested playable note, using a staff"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:334
+#, fuzzy
+msgid "Highest"
+msgstr "Uchel"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:338
+msgid "Choose the highest suggested playable note, using a staff"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:666
+#, fuzzy
+msgid "[ Track %1 - %2 ]"
+msgstr "Rhaglenni %1 - %2"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:985
+msgid "The instrument preset database is corrupt. Check your installation."
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:173
+#: ../src/gui/editors/parameters/InstrumentParameterBox.cpp:54
+msgid "Instrument Parameters"
+msgstr "Paramedrau Offerynnau"
+
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:85
+msgid "Variation"
+msgstr "Amrywiad"
+
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:86
+msgid "Program"
+msgstr "Rhaglen"
+
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:87
+#, fuzzy
+msgid "Channel out"
+msgstr "Sianel"
+
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:215
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:221
+msgid "[ %1 ]"
+msgstr "[ %1 ]"
+
+#: ../src/gui/editors/matrix/MatrixEraser.cpp:58
+#: ../src/gui/editors/matrix/MatrixMover.cpp:71
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:67
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:77
+#, fuzzy
+msgid "Switch to Draw Tool"
+msgstr "Newid i Erfyn Dileu"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:75
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:69
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:71
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:81
+#: ../src/gui/editors/notation/ClefInserter.cpp:57
+#: ../src/gui/editors/notation/GuitarChordInserter.cpp:63
+#: ../src/gui/editors/notation/NotationSelector.cpp:87
+#: ../src/gui/editors/notation/NoteInserter.cpp:113
+#: ../src/gui/editors/notation/RestInserter.cpp:72
+#: ../src/gui/editors/notation/TextInserter.cpp:61
+msgid "Switch to Erase Tool"
+msgstr "Newid i Erfyn Dileu"
+
+#: ../src/gui/editors/matrix/MatrixEraser.cpp:62
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:73
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:75
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:85
+#, fuzzy
+msgid "Switch to Move Tool"
+msgstr "Newid i Erfyn Dileu"
+
+#: ../src/gui/editors/matrix/MatrixEraser.cpp:68
+#: ../src/gui/editors/matrix/MatrixMover.cpp:81
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:79
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:93
+#, fuzzy
+msgid "Switch to Resize Tool"
+msgstr "Newid i Erfyn Dileu"
+
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:446
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:579
+msgid "Click and drag to select; middle-click and drag to draw new note"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:324
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:597
+msgid "Click and drag to resize selected notes"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:599
+msgid "Click and drag to resize note"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:471
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:604
+msgid "Click and drag to move selected notes; hold Ctrl as well to copy"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:473
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:606
+#, fuzzy
+msgid "Click and drag to copy selected notes"
+msgstr "Newid i Erfyn Dewis"
+
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:610
+msgid "Click and drag to move note; hold Ctrl as well to copy"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:612
+msgid "Click and drag to copy note"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixEraser.cpp:54
+#: ../src/gui/editors/matrix/MatrixMover.cpp:67
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:65
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:63
+#: ../src/gui/editors/notation/ClefInserter.cpp:53
+#: ../src/gui/editors/notation/GuitarChordInserter.cpp:59
+#: ../src/gui/editors/notation/NotationEraser.cpp:67
+#: ../src/gui/editors/notation/NoteInserter.cpp:109
+#: ../src/gui/editors/notation/RestInserter.cpp:68
+#: ../src/gui/editors/notation/TextInserter.cpp:57
+msgid "Switch to Select Tool"
+msgstr "Newid i Erfyn Dewis"
+
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:218
+msgid "Resize Event"
+msgstr "Ail-feintio Digwyddiad"
+
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:221
+msgid "Resize Events"
+msgstr "Ail-feintio Digwyddiadau"
+
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:326
+#, fuzzy
+msgid "Click and drag to resize a note"
+msgstr "Newid i Erfyn Dewis"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:328
+#, fuzzy
+msgid "Copy and Move Event"
+msgstr "Symud Digwyddiad"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:330
+#, fuzzy
+msgid "Copy and Move Events"
+msgstr "Symud Digwyddiadau"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:334
+msgid "Move Event"
+msgstr "Symud Digwyddiad"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:336
+msgid "Move Events"
+msgstr "Symud Digwyddiadau"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:465
+msgid "Click and drag to move a note; hold Ctrl as well to copy it"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:467
+msgid "Click and drag to copy a note"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:361
+msgid "Click and drag to draw a note; Shift to avoid snapping to grid"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:363
+msgid "Click and drag to draw a note"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:437
+#: ../src/gui/editors/matrix/MatrixView.cpp:3053
+msgid "Couldn't apply piano roll layout"
+msgstr "Methu gweithredu haenlun rholyn piano"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:663
+msgid "Resi&ze"
+msgstr "Ail-f&eintio"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:669
+#: ../src/gui/editors/notation/NotationView.cpp:1919
+msgid "C&hord Insert Mode"
+msgstr "Modd Mewnosod &Cord"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:676
+#: ../src/gui/editors/notation/NotationView.cpp:1778
+msgid "Ste&p Recording"
+msgstr "Recordio Cama&u"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:694
+#, fuzzy
+msgid "&Legato"
+msgstr "Cyfreithiol"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:708
+#, fuzzy
+msgid "Set to Current Velocity"
+msgstr "&Cynyddu Buanedd"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:712
+msgid "Set Event &Velocities..."
+msgstr "Gosod &Buaneddau Digwyddiadau"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:716
+#, fuzzy
+msgid "Trigger Se&gment..."
+msgstr "Dileu Cylchran"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:720
+#, fuzzy
+msgid "Remove Triggers..."
+msgstr "Gwaredu Newid &Tempo..."
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1153
+#: ../src/gui/editors/matrix/MatrixView.cpp:724
+#: ../src/gui/editors/tempo/TempoView.cpp:606
+msgid "Select &All"
+msgstr "Dewis &Popeth"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:732
+#: ../src/gui/editors/notation/NotationView.cpp:2325
+msgid "Cursor &Back"
+msgstr "Cyrchydd Yn &Ol"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:736
+#: ../src/gui/editors/notation/NotationView.cpp:2329
+msgid "Cursor &Forward"
+msgstr "Cyrchydd Ym&laen"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:740
+#: ../src/gui/editors/notation/NotationView.cpp:2333
+msgid "Cursor Ba&ck Bar"
+msgstr "Cyrchydd Y&n Ol Un Far"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:744
+#: ../src/gui/editors/notation/NotationView.cpp:2337
+msgid "Cursor For&ward Bar"
+msgstr "Cyrchydd Y&mlaen Un Far"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:748
+#: ../src/gui/editors/notation/NotationView.cpp:2341
+msgid "Cursor Back and Se&lect"
+msgstr "Cyrchydd Yn Ol a De&wis"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:752
+#: ../src/gui/editors/notation/NotationView.cpp:2345
+msgid "Cursor Forward and &Select"
+msgstr "Cyrchydd Ymlaen a D&ewis"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:756
+#: ../src/gui/editors/notation/NotationView.cpp:2349
+msgid "Cursor Back Bar and Select"
+msgstr "Cyrchydd Yn Ol Un Far a Dewis"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:760
+#: ../src/gui/editors/notation/NotationView.cpp:2353
+msgid "Cursor Forward Bar and Select"
+msgstr "Cyrchydd Ymlaen Un Far a Dewis"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:764
+#: ../src/gui/editors/notation/NotationView.cpp:2363
+msgid "Cursor to St&art"
+msgstr "Cyrchydd i'r De&chrau"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:770
+#: ../src/gui/editors/notation/NotationView.cpp:2369
+msgid "Cursor to &End"
+msgstr "Cyrchydd i'r Diwe&dd"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:776
+#: ../src/gui/editors/notation/NotationView.cpp:2391
+msgid "Cursor to &Playback Pointer"
+msgstr "Cyrchydd i'r &Pwyntydd Chwarae"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:820
+#: ../src/gui/editors/notation/NotationView.cpp:2435
+msgid "Playback Pointer to &Cursor"
+msgstr "Pwyntydd Chwarae i'r &Cyrchydd"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:826
+#: ../src/gui/editors/notation/NotationView.cpp:2441
+msgid "&Solo"
+msgstr "&Unawd"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:841
+#: ../src/gui/editors/notation/NotationView.cpp:2456
+msgid "Set Loop to Selection"
+msgstr "Gosod Dolen i'r Dewisiad"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:845
+#: ../src/gui/editors/notation/NotationView.cpp:2460
+msgid "Clear L&oop"
+msgstr "Gwaredu'r Dd&olen"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1157
+#: ../src/gui/editors/matrix/MatrixView.cpp:849
+#: ../src/gui/editors/notation/NotationView.cpp:2464
+#: ../src/gui/editors/tempo/TempoView.cpp:610
+msgid "Clear Selection"
+msgstr "Gwaredu'r Dewisiad"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1149
+#: ../src/gui/editors/matrix/MatrixView.cpp:854
+#: ../src/gui/editors/notation/NotationView.cpp:2471
+msgid "&Filter Selection"
+msgstr "Dewisiad &Hidlen"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:879
+msgid "&No Snap"
+msgstr "&Dim Cipio"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:884
+msgid "Snap to Bea&t"
+msgstr "Cipio at Curia&d"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:888
+msgid "Snap to &Bar"
+msgstr "Cipio at &Far"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:908
+#, fuzzy, c-format
+msgid "Snap to %1"
+msgstr "Cipio at 1/2"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:917
+#, fuzzy
+msgid "Show Instrument Parameters"
+msgstr "Dangos Paramedrau &Offerynnau"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:922
+#: ../src/gui/editors/notation/NotationView.cpp:1850
+msgid "Show Ch&ord Name Ruler"
+msgstr "Dangos Rhesydd Enwau C&ordiau"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:926
+#: ../src/gui/editors/notation/NotationView.cpp:1858
+msgid "Show &Tempo Ruler"
+msgstr "Dangos Rhesydd &Tempo"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1238
+#: ../src/gui/editors/notation/NotationView.cpp:3245
+#, c-format
+msgid ""
+"_n: 1 event selected \n"
+" %n events selected "
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1241
+#: ../src/gui/editors/notation/NotationView.cpp:3247
+msgid " No selection "
+msgstr " Dim dewisiad"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1348
+#: ../src/gui/editors/matrix/MatrixView.cpp:1360
+#: ../src/gui/editors/matrix/MatrixView.cpp:2079
+#: ../src/gui/editors/notation/NotationView.cpp:5869
+msgid "Quantizing..."
+msgstr "Cwanteiddio..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1370
+#: ../src/gui/editors/notation/NotationView.cpp:5407
+msgid "Collapsing notes..."
+msgstr "Dat-ehangu nodau..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1381
+#, fuzzy
+msgid "Making legato..."
+msgstr "Gwneud addurnodau..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1476
+#, fuzzy
+msgid "Note: %1 (%2.%3s)"
+msgstr "Amser: %1 (%2.%3s)"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1531
+#: ../src/gui/editors/notation/NotationView.cpp:7206
+msgid "Time: %1 (%2.%3s)"
+msgstr "Amser: %1 (%2.%3s)"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1604
+#: ../src/gui/editors/notation/NotationView.cpp:4744
+#: ../src/gui/editors/notation/NotationView.cpp:4773
+msgid "Cutting selection to clipboard..."
+msgstr "Torri'r dewisiad i'r gludfwrdd... "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:912
+#: ../src/gui/editors/matrix/MatrixView.cpp:1636
+#: ../src/gui/editors/notation/NotationSelectionPaster.cpp:82
+msgid "Couldn't paste at this point"
+msgstr "Methu gludo wrth y fan yma"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1647
+#: ../src/gui/editors/notation/NotationView.cpp:4754
+msgid "Deleting selection..."
+msgstr "Dileu'r dewisiad..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1833
+#: ../src/gui/editors/notation/NotationView.cpp:5617
+#, c-format
+msgid "Unknown note insert action %1"
+msgstr "Gweithrediad anhysbys %1 wrth fewnosod nodyn"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1837
+#: ../src/gui/editors/matrix/MatrixView.cpp:2857
+#: ../src/gui/editors/notation/NotationView.cpp:5621
+msgid "Inserting note"
+msgstr "Mewnosod nodyn"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2091
+msgid "Unquantizing..."
+msgstr "Dad-gwanteiddio..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2120
+msgid " Grid: "
+msgstr "Rhwydell:"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2134
+msgid "Unit"
+msgstr "Uned"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2136
+msgid "Beat"
+msgstr "Curiad"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2138
+msgid "Bar"
+msgstr "Bar"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2159
+#, fuzzy
+msgid " Velocity: "
+msgstr "Buanedd:"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2170
+msgid " Quantize: "
+msgstr "Cwanteiddio:"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2584
+msgid "Raising velocities..."
+msgstr "Codi buaneddau..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2596
+msgid "Lowering velocities..."
+msgstr "Iselhau buaneddau..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2611
+msgid "Set Event Velocities"
+msgstr "Gosod Buaneddau Digwyddiadau"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2616
+msgid "Setting Velocities..."
+msgstr "Gosod Buaneddau..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2665
+#, fuzzy
+msgid "Remove Triggers"
+msgstr "&Gwaredu Arwydd"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2723
+msgid "%1 - Segment Track #%2 - %3"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2730
+#, fuzzy
+msgid "%1 - All Segments - %2"
+msgstr "Parhad"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2737
+#, fuzzy
+msgid ""
+"_n: %1 - 1 Segment - %2\n"
+"%1 - %n Segments - %2"
+msgstr "Parhad"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2885
+#, fuzzy
+msgid "Can't insert note: No grid duration selected"
+msgstr "Dim parhad nodau wedi'i ddewis"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2935
+#, fuzzy
+msgid " Chord "
+msgstr "Cord"
+
+#: ../src/gui/editors/matrix/MatrixEraser.cpp:105
+#, fuzzy
+msgid "Click on a note to delete it"
+msgstr "Newid i Erfyn Dewis"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:89
+msgid "Filter"
+msgstr "Hidl"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:245
+#: ../src/gui/editors/tempo/TempoView.cpp:117
+msgid "Time "
+msgstr "Amser"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:118
+#, fuzzy
+msgid "Type "
+msgstr "Math"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:119
+#, fuzzy
+msgid "Value "
+msgstr "Gwerth"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:120
+#, fuzzy
+msgid "Properties "
+msgstr "Priodweddau Digwyddiadau"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:208
+msgid "Common, hidden"
+msgstr ""
+
+#: ../src/gui/editors/tempo/TempoView.cpp:210
+msgid "Hidden"
+msgstr ""
+
+#: ../src/gui/editors/tempo/TempoView.cpp:213
+msgid "Common"
+msgstr ""
+
+#: ../src/gui/editors/tempo/TempoView.cpp:220
+#, fuzzy
+msgid "Time Signature "
+msgstr "Arwydd Amseriad"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:245
+#, fuzzy
+msgid "%1.%2%3"
+msgstr "&%1%2"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:255
+msgid "%1.%2%3 qpm (%4.%5%6 bpm) "
+msgstr ""
+
+#: ../src/gui/editors/tempo/TempoView.cpp:264
+#, fuzzy
+msgid "Tempo "
+msgstr "Tempo"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:271
+#, fuzzy
+msgid "<nothing at this filter level>"
+msgstr "<dim digwyddiadau wrth y safon hidl yma>"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:463
+#, fuzzy
+msgid "Delete Tempo or Time Signature"
+msgstr "Arwydd Amseriad"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:602
+#, fuzzy
+msgid "&Edit Item"
+msgstr "Golygu Digw&yddiad"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:834
+msgid "%1 - Tempo and Time Signature Editor"
+msgstr ""
+
+#: ../src/gui/editors/guitar/GuitarChordEditorDialog.cpp:43
+msgid "Guitar Chord Editor"
+msgstr ""
+
+#: ../src/gui/editors/guitar/GuitarChordEditorDialog.cpp:51
+#, fuzzy
+msgid "Start fret"
+msgstr "Bar Dechrau"
+
+#: ../src/gui/editors/guitar/GuitarChordEditorDialog.cpp:58
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:51
+msgid "Root"
+msgstr ""
+
+#: ../src/gui/editors/guitar/GuitarChordEditorDialog.cpp:62
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:55
+#, fuzzy
+msgid "Extension"
+msgstr "Trawiad"
+
+#: ../src/gui/editors/guitar/Fingering.cpp:118
+msgid "couldn't parse fingering '%1' in '%2'"
+msgstr ""
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:45
+#, fuzzy
+msgid "Guitar Chord Selector"
+msgstr "Dewisydd Traw"
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:64
+msgid "beginner"
+msgstr ""
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:65
+msgid "common"
+msgstr ""
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:66
+#, fuzzy
+msgid "all"
+msgstr "Popeth"
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:86
+#, fuzzy
+msgid "Fingerings"
+msgstr "Ychwanegu llithriad..."
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:419
+#, fuzzy
+msgid "couldn't open file '%1'"
+msgstr "Methu agor ffeil '%1'"
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:428
+#, c-format
+msgid "couldn't parse chord dictionnary : %1"
+msgstr ""
+
+#: ../src/gui/editors/notation/NoteFontViewer.cpp:87
+#, fuzzy, c-format
+msgid "Note Font Viewer: %1"
+msgstr "&Ffont i'r Nodau"
+
+#: ../src/gui/editors/notation/NoteFontViewer.cpp:93
+#, fuzzy
+msgid " Component: "
+msgstr "Ffont:"
+
+#: ../src/gui/editors/notation/NoteFontViewer.cpp:101
+#, fuzzy
+msgid " View: "
+msgstr "Maint:"
+
+#: ../src/gui/editors/notation/NoteFontViewer.cpp:104
+msgid "Glyphs"
+msgstr ""
+
+#: ../src/gui/editors/notation/NoteFontViewer.cpp:105
+#, fuzzy
+msgid "Codes"
+msgstr "Cleff"
+
+#: ../src/gui/editors/notation/NoteFontViewer.cpp:107
+#, fuzzy
+msgid " Page: "
+msgstr "Bylchu:"
+
+#: ../src/gui/editors/notation/ClefInserter.cpp:64
+#: ../src/gui/editors/notation/GuitarChordInserter.cpp:71
+#: ../src/gui/editors/notation/RestInserter.cpp:79
+#: ../src/gui/editors/notation/TextInserter.cpp:68
+msgid "Switch to Inserting Notes"
+msgstr "Newid i Fewnosod Nodau"
+
+#: ../src/gui/editors/notation/NotationView.cpp:522
+msgid "Close track headers"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:917
+msgid "Preparing to print..."
+msgstr "Paratoi argraffu..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:1516
+msgid "Note &Font"
+msgstr "&Ffont i'r Nodau"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1539
+msgid "Si&ze"
+msgstr "Ma&int"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1545
+#, fuzzy
+msgid "Show Track Headers"
+msgstr "Dangos &Labeli Trac"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1550
+#, fuzzy
+msgid "S&pacing"
+msgstr "B&ylchu"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1572
+#, fuzzy
+msgid "Du&ration Factor"
+msgstr "Parhad"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1598
+msgid "Note &Style"
+msgstr "A&rddull y Nodau"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1624
+msgid "Insert Rest"
+msgstr "Mewnosod Saib"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1628
+msgid "Switch from Note to Rest"
+msgstr "Newid o Nodyn i Saib"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1633
+msgid "Switch from Rest to Note"
+msgstr "Newid o Saib i Nodyn"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1690
+msgid "No accidental"
+msgstr "Dim hapnod"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1691
+#, fuzzy
+msgid "Follow previous accidental"
+msgstr "Gorfod hapnodau..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:1692
+msgid "Sharp"
+msgstr "Llon"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1693
+msgid "Flat"
+msgstr "Lleddf"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1694
+msgid "Natural"
+msgstr "Naturiol"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1695
+msgid "Double sharp"
+msgstr "Llon dwbl"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1696
+msgid "Double flat"
+msgstr "Lleddf dwbl"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1717
+msgid "&Treble Clef"
+msgstr "Cleff y &Trebl"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1724
+msgid "&Alto Clef"
+msgstr "Cleff yr &Alto"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1731
+msgid "Te&nor Clef"
+msgstr "Cleff y Te&nor"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1738
+msgid "&Bass Clef"
+msgstr "Cleff y &Bas"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1745
+msgid "&Text"
+msgstr "&Testun"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1751
+#, fuzzy
+msgid "&Guitar Chord"
+msgstr "Dewisydd Traw"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1784
+msgid "Select from Sta&rt"
+msgstr "Dewis o Dech&rau"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1788
+msgid "Select to &End"
+msgstr "Dewis i Ddi&wedd"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1792
+msgid "Select Whole St&aff"
+msgstr "Dewis yr Holl E&rwydd"
+
+#: ../src/commands/edit/CutAndCloseCommand.h:53
+#: ../src/gui/editors/notation/NotationView.cpp:1796
+msgid "C&ut and Close"
+msgstr "To&rri a Cau"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1800
+msgid "Pa&ste..."
+msgstr "Gl&udo..."
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:122
+#: ../src/gui/editors/notation/NotationView.cpp:1808
+msgid "Move to Staff Above"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:126
+#: ../src/gui/editors/notation/NotationView.cpp:1812
+msgid "Move to Staff Below"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1826
+msgid "&Linear Layout"
+msgstr "&Haenlun Llinellol"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1835
+msgid "&Continuous Page Layout"
+msgstr "Haenlun &Tudalen Barhaus"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1844
+msgid "&Multiple Page Layout"
+msgstr "Haenlun &Tudalennau Lluosol"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1854
+msgid "Show Ra&w Note Ruler"
+msgstr "Dangos Rhesydd Nodau C&raidd"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1862
+msgid "Show &Annotations"
+msgstr "Dangos &Anodiadau"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1866
+msgid "Show Lily&Pond Directives"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1870
+msgid "Open L&yric Editor"
+msgstr "Agor Golygydd G&eiriau"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1912
+msgid "Trip&let Insert Mode"
+msgstr "Modd Mewnosod Tri&pled"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1926
+#, fuzzy
+msgid "Grace Insert Mode"
+msgstr "Modd Mewnosod Tri&pled"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2180
+msgid "&Dump selected events to stderr"
+msgstr "&Dadlwytho digwyddiadau dewisiedig i stderr"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2248
+#, fuzzy
+msgid "Ma&ke Ornament..."
+msgstr "Gwneud addurnodau..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:2252
+msgid "Trigger &Ornament..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2256
+#, fuzzy
+msgid "Remove Ornament..."
+msgstr "Gwaredu gwrthpwynt"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2261
+msgid "&None"
+msgstr "&Dim"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2289
+#, fuzzy
+msgid "Convert Notation For..."
+msgstr "Allforio ffeil sain ..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:2298
+msgid "Show &Notes Toolbar"
+msgstr "Dangos Bar &Nodau"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2299
+msgid "Show &Rests Toolbar"
+msgstr "Dangos Bar &Seibiau"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2300
+msgid "Show &Accidentals Toolbar"
+msgstr "Dangos Bar &Hapnodau"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2301
+msgid "Show Cle&fs Toolbar"
+msgstr "Dangos Bar &Cleffau"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2303
+msgid "Show &Marks Toolbar"
+msgstr "Dangos Bar &Arwyddion"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2305
+msgid "Show &Group Toolbar"
+msgstr "Dangos Bar &Casglu"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2307
+msgid "Show &Layout Toolbar"
+msgstr "Dangos Bar &Haenlunio"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2311
+msgid "Show M&eta Toolbar"
+msgstr "Dangos Bar &Meta"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2373
+msgid "Cursor &Up Staff"
+msgstr "Cyrchydd i &Fyny Un Erwydd"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2377
+msgid "Cursor &Down Staff"
+msgstr "Cyrchydd i &Lawr Un Erwydd"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2381
+msgid "Cursor Pre&vious Segment"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2385
+#, fuzzy
+msgid "Cursor Ne&xt Segment"
+msgstr "Creu Cylchran"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2475
+msgid "Push &Left"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2479
+msgid "Push &Right"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2483
+msgid "Push &Up"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2487
+#, fuzzy
+msgid "Push &Down"
+msgstr "Coesau I &Lawr"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2491
+#, fuzzy
+msgid "&Restore Positions"
+msgstr "&Adfer Coesau a Gyfrifwyd"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2495
+#, fuzzy
+msgid "Make &Invisible"
+msgstr "Gwneud Nodau yn Ddic&honol"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2499
+#, fuzzy
+msgid "Make &Visible"
+msgstr "Gwneud Nodau yn Ddic&honol"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2503
+#, fuzzy
+msgid "Toggle Dot"
+msgstr "nodyn cyfan"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2507
+#: ../src/gui/editors/notation/NotationView.cpp:2511
+#, fuzzy
+msgid "Add Dot"
+msgstr "Ychwanegu %1"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2570
+#, c-format
+msgid ""
+"_n: 1 pixel\n"
+"%n pixels"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2619
+msgid " Font: "
+msgstr "Ffont:"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2647
+msgid "Unknown font \"%1\", using default"
+msgstr "Ffont anhysbys \"%1\"; yn defnyddio'r rhagosod"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2655
+msgid " Size: "
+msgstr "Maint:"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2677
+msgid " Spacing: "
+msgstr "Bylchu:"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2993
+#: ../src/gui/editors/notation/NotationView.cpp:3818
+msgid " Ready."
+msgstr " Yn Barod."
+
+#: ../src/gui/editors/notation/NotationView.cpp:2998
+msgid "Laying out score..."
+msgstr "Haenlunio'r sgor..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:3011
+msgid "Laying out staff %1..."
+msgstr "Haenlunio erwydd %1..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:3020
+msgid "Reconciling staffs..."
+msgstr "Cysoni erwyddau..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:3885
+msgid "Sizing and allocating canvas..."
+msgstr "Meintio a dosrannu'r cynfas..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:4050
+msgid "note"
+msgstr "nodyn"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4050
+msgid "rest"
+msgstr "saib"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4211
+msgid "%1 - Segment Track #%2 - Notation"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:4217
+#, fuzzy
+msgid "%1 - All Segments - Notation"
+msgstr "Parhad"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4222
+#, fuzzy
+msgid ""
+"_n: %1 - Segment - Notation\n"
+"%1 - %n Segments - Notation"
+msgstr "Parhad"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4243
+#, fuzzy
+msgid "Grace"
+msgstr "Gwyrdd"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4247
+#: ../src/gui/editors/notation/NotationView.cpp:4251
+#: ../src/gui/editors/notation/NotationView.cpp:4255
+#, fuzzy
+msgid "%1 %2"
+msgstr "&%1%2"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4271
+msgid "Hidden annotations"
+msgstr "Anodiadau cudd"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4293
+msgid "Hidden LilyPond directives"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:4326
+#, c-format
+msgid "Unknown spacing action %1"
+msgstr "Gweithrediad bylchu anhysbys %1"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4384
+#, fuzzy, c-format
+msgid "Unknown proportion action %1"
+msgstr "Gweithrediad ffont anhysbys %1"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4431
+#, c-format
+msgid "Unknown font action %1"
+msgstr "Gweithrediad ffont anhysbys %1"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4449
+#, c-format
+msgid "Unknown font size %1"
+msgstr "Maint ffont anhysbys %1"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4453
+#, c-format
+msgid "Unknown font size action %1"
+msgstr "Gweithrediad maint ffont anhysbys %1"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4780
+#, fuzzy
+msgid ""
+"The Restricted paste type requires enough empty space (containing only "
+"rests) at the paste position to hold all of the events to be pasted.\n"
+"Not enough space was found.\n"
+"If you want to paste anyway, consider using one of the other paste types "
+"from the \"Paste...\" option on the Edit menu. You can also change the "
+"default paste type to something other than Restricted if you wish."
+msgstr ""
+"Mae angen ar y math gludo Cyfyngedig digon o le gwag\n"
+"(yn cynnwys dim ond seibiau) wrth y lleoliad gludo\n"
+"i gadw yr holl ddigwyddiadau i gael eu gludo.\n"
+"Doedd dim digon o le.\n"
+"Os ydych eisiau gludo beth bynnag, ystyriwch defnyddio\n"
+"un o'r mathau gludo eraill o'r dewisiad \"Gludo\" ar y\n"
+"ddewislen Golygu. Cewch hefyd newid y math gludo\n"
+"rhagosodedig i rhwybeth arall yn lle Cyfyngedig\n"
+"os hoffech chi."
+
+#: ../src/gui/editors/notation/NotationView.cpp:4800
+msgid "Can't paste multiple Segments into one"
+msgstr "Methu gludo Cylchrannau lluosol i mewn i un"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4828
+#: ../src/gui/editors/notation/NotationView.cpp:4877
+msgid "Couldn't paste at this point."
+msgstr "Methu gludo wrth y fan yma."
+
+#: ../src/gui/editors/notation/NotationView.cpp:4896
+#, fuzzy
+msgid "Move Events to Staff Above"
+msgstr "Wedi cael digwyddiad tu allan o Gylchran"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4924
+#, fuzzy
+msgid "Move Events to Staff Below"
+msgstr "Wedi cael digwyddiad tu allan o Gylchran"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5036
+#, fuzzy
+msgid "Pushing selection left..."
+msgstr "Torri'r dewisiad..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5047
+#, fuzzy
+msgid "Pushing selection right..."
+msgstr "Torri'r dewisiad..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5058
+#, fuzzy
+msgid "Pushing selection up..."
+msgstr "Torri'r dewisiad..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5069
+#, fuzzy
+msgid "Pushing selection down..."
+msgstr "Torri'r dewisiad..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5080
+#, fuzzy
+msgid "Restoring computed positions..."
+msgstr "Adfer cyfeiriadau coesau a gyfrifwyd..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5089
+#, fuzzy
+msgid "Making visible..."
+msgstr "Gwneud nodau yn ddichonol"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5098
+#, fuzzy
+msgid "Making invisible..."
+msgstr "Gwneud nodau yn ddichonol"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5185
+msgid "Beaming group..."
+msgstr "Trawstio'r casgliad..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5195
+msgid "Auto-beaming selection..."
+msgstr "Hunan-drawstio'r dewisiad..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5205
+msgid "Breaking groups..."
+msgstr "Torri casgliadau..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5293
+msgid "Untupleting..."
+msgstr "Dad-wneud plygyn..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5301
+msgid "Adding slur..."
+msgstr "Ychwanegu llithriad..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5302
+msgid "slur"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5307
+#, fuzzy
+msgid "Adding phrasing slur..."
+msgstr "Ychwanegu llithriad..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5308
+msgid "phrasing slur"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5313
+#, fuzzy
+msgid "Adding glissando..."
+msgstr "Ychwanegu crescendo..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5314
+#, fuzzy
+msgid "glissando"
+msgstr "Ychwanegu crescendo..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5319
+msgid "Adding crescendo..."
+msgstr "Ychwanegu crescendo..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5320
+#: ../src/gui/editors/notation/NotationView.cpp:5326
+#, fuzzy
+msgid "dynamic"
+msgstr "Dinamig"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5325
+msgid "Adding decrescendo..."
+msgstr "Ychwanegu decrescendo..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5331
+#: ../src/gui/editors/notation/NotationView.cpp:5337
+#: ../src/gui/editors/notation/NotationView.cpp:5343
+#: ../src/gui/editors/notation/NotationView.cpp:5349
+#, fuzzy
+msgid "Adding octave..."
+msgstr "Ychwanegu crescendo..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5332
+#: ../src/gui/editors/notation/NotationView.cpp:5338
+#: ../src/gui/editors/notation/NotationView.cpp:5344
+#: ../src/gui/editors/notation/NotationView.cpp:5350
+msgid "ottava"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5366
+msgid "Can't add overlapping %1 indications"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5375
+#, fuzzy
+msgid "Making chord..."
+msgstr "Gwneud addurnodau..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5387
+msgid "Normalizing rests..."
+msgstr "Normaleiddio seibiau"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5397
+msgid "Collapsing rests..."
+msgstr "Dat-ehangu seibiau..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5417
+msgid "Tying notes..."
+msgstr "Clymu nodau..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5427
+msgid "Untying notes..."
+msgstr "Dad-glymu nodau..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5437
+msgid "Making notes viable..."
+msgstr "Gwneud nodau yn ddichonol"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5447
+msgid "Removing counterpoint..."
+msgstr "Gwaredu gwrthpwynt"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5457
+msgid "Pointing stems up..."
+msgstr "Pwyntio coesau i fyny..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5467
+msgid "Pointing stems down..."
+msgstr "Pwyntio coesau i lawr..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5478
+msgid "Restoring computed stem directions..."
+msgstr "Adfer cyfeiriadau coesau a gyfrifwyd..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5488
+#: ../src/gui/editors/notation/NotationView.cpp:5498
+#, fuzzy
+msgid "Positioning slurs..."
+msgstr "Lleoli erwydd %1..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5509
+#, fuzzy
+msgid "Restoring slur positions..."
+msgstr "Adfer cyfeiriadau coesau a gyfrifwyd..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5519
+#: ../src/gui/editors/notation/NotationView.cpp:5529
+#, fuzzy
+msgid "Positioning ties..."
+msgstr "Lleoli erwydd %1..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5540
+#, fuzzy
+msgid "Restoring tie positions..."
+msgstr "Adfer cyfeiriadau coesau a gyfrifwyd..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5550
+msgid "Fixing notation quantization..."
+msgstr "Trwsio cwanteiddio'r nodiant..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5560
+#, fuzzy
+msgid "Removing notation quantization..."
+msgstr "Trwsio cwanteiddio'r nodiant..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5577
+msgid "Changing to %1 style..."
+msgstr "Newid i arddull %1..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5585
+#, c-format
+msgid "Unknown style action %1"
+msgstr "Gweithrediad arddull anhysbys %1"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5598
+#: ../src/gui/editors/notation/NotationView.cpp:5639
+#: ../src/gui/editors/notation/NotationView.cpp:5695
+msgid "No note duration selected"
+msgstr "Dim parhad nodau wedi'i ddewis"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5660
+msgid "No rest duration selected"
+msgstr "Dim parhad saib wedi'i ddewis"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5746
+#, fuzzy
+msgid "No note or rest duration selected"
+msgstr "Dim parhad saib wedi'i ddewis"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5757
+#: ../src/gui/editors/notation/NotationView.cpp:5768
+#: ../src/gui/editors/notation/NotationView.cpp:5779
+#: ../src/gui/editors/notation/NotationView.cpp:5790
+#: ../src/gui/editors/notation/NotationView.cpp:5801
+#: ../src/gui/editors/notation/NotationView.cpp:5812
+#: ../src/gui/editors/notation/NotationView.cpp:5823
+msgid "Forcing accidentals..."
+msgstr "Gorfod hapnodau..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5834
+msgid "Restoring accidentals..."
+msgstr "Adfer hapnodau..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5845
+#, fuzzy
+msgid "Showing cautionary accidentals..."
+msgstr "Gorfod hapnodau..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5855
+#, fuzzy
+msgid "Cancelling cautionary accidentals..."
+msgstr "Gorfod hapnodau..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5884
+msgid "Interpreting selection..."
+msgstr "Dehongli dewisiad..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5896
+#, fuzzy
+msgid "Setting note durations..."
+msgstr "Gosod &Tempo i Barhad Cylchran Sain"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5904
+#: ../src/gui/editors/notation/NotationView.cpp:5912
+#, fuzzy
+msgid "Adding dot..."
+msgstr "Ychwanegu crescendo..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5934
+msgid "Text: "
+msgstr "Testun:"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5948
+msgid "Fingering: "
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:6036
+msgid "Ornament track %1 bar %2"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:6038
+#, fuzzy, c-format
+msgid "Ornament bar %1"
+msgstr "Cylch&rannau"
+
+#: ../src/gui/editors/notation/NotationView.cpp:6098
+#, fuzzy
+msgid "Remove Ornaments"
+msgstr "&Gwaredu Pob Arwydd"
+
+#: ../src/gui/editors/notation/NotationView.cpp:6145
+msgid "Estimated key signature shown"
+msgstr "Dangos arwydd cywair wedi'i amcangyfrif"
+
+#: ../src/gui/editors/notation/NotationStaff.cpp:1249
+#: ../src/gui/editors/notation/NotationView.cpp:6202
+msgid "Sustain"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:6218
+msgid ""
+"There is no sustain controller defined for this device.\n"
+"Please ensure the device is configured correctly in the Manage MIDI Devices "
+"dialog in the main window."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:7250
+#, fuzzy
+msgid "Can't insert note: No note duration selected"
+msgstr "Dim parhad nodau wedi'i ddewis"
+
+#: ../src/gui/editors/notation/NotationEraser.cpp:61
+#: ../src/gui/editors/notation/NotationSelector.cpp:83
+msgid "Switch to Insert Tool"
+msgstr "Newid i Erfyn Mewnosod"
+
+#: ../src/gui/editors/notation/NotePixmapFactory.cpp:2303
+#: ../src/gui/editors/notation/NotePixmapFactory.cpp:2347
+msgid "..."
+msgstr "..."
+
+#: ../src/gui/editors/notation/NoteFontFactory.cpp:200
+msgid "Can't obtain a default font -- no fonts found"
+msgstr "Methu cael wynebfath rhagosod -- ni chanfuwyd wynebfathau"
+
+#: ../src/gui/editors/notation/NoteFontMap.cpp:52
+#: ../src/gui/general/PresetGroup.cpp:49
+#, fuzzy
+msgid "unknown error"
+msgstr "Anhysbys"
+
+#: ../src/gui/editors/notation/NoteFontMap.cpp:78
+msgid "Can't open font mapping file %1 or %2"
+msgstr "Methu agor ffeil mapio wynebfathau %1 neu %2"
+
+#: ../src/gui/editors/notation/NoteFontMap.cpp:82
+#, c-format
+msgid "Can't open font mapping file %1"
+msgstr "Methu agor ffeil mapio wynebfathau %1"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:52
+msgid "%1-dotted-%2"
+msgstr "%1-unpwynt-%2"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:54
+msgid "%1-dotted %2"
+msgstr "%1-unpwynt %2"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:57
+#, c-format
+msgid "dotted-%1"
+msgstr "unpwynt-%1"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:59
+#, c-format
+msgid "dotted %1"
+msgstr "unpwynt %1"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:83
+msgid "sixty-fourth note"
+msgstr "nodyn un rhan o chwech deg pedwar"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:83
+msgid "thirty-second note"
+msgstr "nodyn un rhan o tri deg dau"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:84
+msgid "sixteenth note"
+msgstr "nodyn un rhan o un deg chwech"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:84
+msgid "eighth note"
+msgstr "nodyn un rhan o wyth"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:85
+msgid "quarter note"
+msgstr "chwarter nodyn"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:85
+msgid "half note"
+msgstr "hanner nodyn"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:86
+msgid "whole note"
+msgstr "nodyn cyfan"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:86
+msgid "double whole note"
+msgstr "nodyn cyfan dwbl"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:89
+msgid "sixty-fourth notes"
+msgstr "nodau un rhan o chwech deg pedwar"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:89
+msgid "thirty-second notes"
+msgstr "nodau un rhan o tri deg dau"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:90
+msgid "sixteenth notes"
+msgstr "nodau un rhan o un deg chwech"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:90
+msgid "eighth notes"
+msgstr "nodau un rhan o wyth"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:91
+msgid "quarter notes"
+msgstr "chwarter nodau"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:91
+msgid "half notes"
+msgstr "hanner nodau"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:92
+msgid "whole notes"
+msgstr "nodau cyfan"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:92
+msgid "double whole notes"
+msgstr "nodau cyfan dwbl"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:96
+#: ../src/gui/editors/notation/NotationStrings.cpp:154
+msgid "%1 triplets"
+msgstr "%1 tripledi"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:100
+#: ../src/gui/editors/notation/NotationStrings.cpp:158
+msgid "%1 triplet"
+msgstr "%1 tripled"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:143
+msgid "64th"
+msgstr "64ydd"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:143
+msgid "32nd"
+msgstr "32il"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:143
+msgid "16th"
+msgstr "16ed"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:143
+msgid "8th"
+msgstr "8ed"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:144
+msgid "quarter"
+msgstr "chwarter"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:144
+msgid "half"
+msgstr "hanner"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:144
+msgid "whole"
+msgstr "cyfan"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:145
+msgid "double whole"
+msgstr "cyfan dwbl"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:148
+msgid "64ths"
+msgstr "64ydd-au"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:148
+msgid "32nds"
+msgstr "32il-au"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:148
+msgid "16ths"
+msgstr "16ed-au"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:148
+msgid "8ths"
+msgstr "8ed-au"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:149
+msgid "quarters"
+msgstr "chwarteri"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:149
+msgid "halves"
+msgstr "hanerau"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:149
+msgid "wholes"
+msgstr "cyfain"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:150
+msgid "double wholes"
+msgstr "cyfain dwbl"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:278
+msgid "%1 ticks"
+msgstr "%1 o diciau"
+
+#: ../src/gui/editors/notation/FontViewFrame.cpp:100
+#, c-format
+msgid "Error: Unable to match font name %1"
+msgstr ""
+
+#: ../src/gui/editors/notation/FontViewFrame.cpp:108
+msgid "Warning: No good match for font name %1 (best is %2)"
+msgstr ""
+
+#: ../src/gui/editors/notation/FontViewFrame.cpp:116
+#, c-format
+msgid "Error: Unable to open best-match font %1"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:113
+#, fuzzy
+msgid "Track %1 : \"%2\""
+msgstr "Rhaglenni %1 - %2"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:119
+#, fuzzy, c-format
+msgid ""
+"\n"
+"Notate for: %1"
+msgstr "&Ffont i'r Nodau"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:121
+#, fuzzy
+msgid "normal"
+msgstr "Arferol"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:124
+#, fuzzy
+msgid "small"
+msgstr "Popeth"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:127
+msgid "tiny"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:131
+msgid "--"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:156
+msgid ""
+"\n"
+"Size: %1, Bracket: %2 "
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:183
+msgid ""
+"\n"
+"bars [%1-%2] in %3 (tr=%4) : \"%5\""
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:190
+msgid ""
+"\n"
+"bars [%1-%2] (tr=%3) : \"%4\""
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:240
+#, fuzzy
+msgid "C#"
+msgstr "C#%1"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:242
+msgid "Eb"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:245
+#, fuzzy
+msgid "F#"
+msgstr "F#%1"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:247
+#, fuzzy
+msgid "G#"
+msgstr "G#%1"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:249
+msgid "Bb"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:352
+#, fuzzy
+msgid "%1: %2"
+msgstr "&%1%2"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:355
+#, fuzzy, c-format
+msgid " in %1"
+msgstr "Dat-&wneud %1"
+
+#: ../src/gui/editors/notation/NotationStaff.cpp:452
+msgid "Rendering staff %1..."
+msgstr "Trosi erwydd %1..."
+
+#: ../src/gui/editors/notation/NotationStaff.cpp:515
+#, fuzzy
+msgid "Rendering notes on staff %1..."
+msgstr "Trosi erwydd %1..."
+
+#: ../src/gui/editors/notation/NotationStaff.cpp:583
+msgid "Positioning staff %1..."
+msgstr "Lleoli erwydd %1..."
+
+#: ../src/gui/editors/notation/NotationSelectionPaster.cpp:85
+msgid "Ready."
+msgstr "Yn barod."
+
+#: ../src/gui/editors/notation/RestInserter.cpp:62
+msgid "Dotted rest"
+msgstr "Saib unpwynt"
+
+#: ../src/gui/editors/notation/NoteStyleFileReader.cpp:57
+#, c-format
+msgid "Can't open style file %1"
+msgstr "Methu agor ffeil arddull %1"
+
+#: ../src/gui/editors/notation/NoteStyleFileReader.cpp:92
+msgid "type is a required attribute of note"
+msgstr "priodoledd angenrheidiol o nodyn yw math"
+
+#: ../src/gui/editors/notation/NoteStyleFileReader.cpp:101
+#, c-format
+msgid "Unrecognised note name %1"
+msgstr "Enw nodyn %1 heb ei gydnabod"
+
+#: ../src/gui/editors/notation/NoteStyleFileReader.cpp:108
+msgid "global element must precede note elements"
+msgstr "rhaid i'r elfen eang ddod o flaen elfennau nodyn"
+
+#: ../src/gui/editors/notation/NoteStyleFileReader.cpp:137
+msgid ""
+"global and note elements may have shape or charname attribute, but not both"
+msgstr ""
+"gall elfennau eang a nodyn gael priodoledd siap neu nod-enw, ond dim y dau"
+
+#: ../src/gui/editors/notation/NotationVLayout.cpp:493
+msgid ""
+"Spanned note at %1 has no HEIGHT_ON_STAFF property!\n"
+"This is a bug (the program would previously have crashed by now)"
+msgstr ""
+"Does dim priodwedd HEIGHT_ON_STAFF gan y nodyn wedi'i bontio wrth %1!\n"
+"Nam yw hwn (o'r blaen, buasai'r rhaglen wedi chwalu erbyn rwan)."
+
+#: ../src/gui/editors/notation/NoteInserter.cpp:82
+msgid "Auto-Beam when appropriate"
+msgstr "Hunan-Drawstio lle mae'n addas"
+
+#: ../src/gui/editors/notation/NoteInserter.cpp:103
+msgid "Dotted note"
+msgstr "Nodyn unpwynt"
+
+#: ../src/gui/editors/notation/NoteInserter.cpp:120
+msgid "Switch to Inserting Rests"
+msgstr "Newid i Fewnosod Seibiau"
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:98
+#, fuzzy
+msgid "Collapse Rests"
+msgstr "&Dat-ehangu Seibiau"
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:102
+msgid "Respell as Flat"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:106
+#, fuzzy
+msgid "Respell as Sharp"
+msgstr "Gorfod Hapnodau i F&yny"
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:110
+msgid "Respell as Natural"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:114
+#, fuzzy
+msgid "Collapse Notes"
+msgstr "&Dat-ehangu Seibiau"
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:130
+#, fuzzy
+msgid "Make Invisible"
+msgstr "Gwneud Nodau yn Ddic&honol"
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:134
+#, fuzzy
+msgid "Make Visible"
+msgstr "Gwneud Nodau yn Ddic&honol"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:129
+msgid "Event filters"
+msgstr "Hidlau digwyddiadau"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:138
+msgid "Rest"
+msgstr "Saib"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:139
+msgid "Indication"
+msgstr "Dangosiad"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:141
+msgid "Other"
+msgstr "Arall"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:161
+#, fuzzy
+msgid "Triggered Segment Properties"
+msgstr "Priodweddau Digwyddiadau"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:166
+#, fuzzy
+msgid "Label: "
+msgstr "Labelu"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:176
+#, fuzzy
+msgid "Base pitch: "
+msgstr "Traw'r cywair:"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:183
+#, fuzzy
+msgid "Base velocity: "
+msgstr "Buanedd y nodyn:"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:246
+msgid "Duration "
+msgstr "Parhad"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:247
+msgid "Event Type "
+msgstr "Math Digwyddiad"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:248
+msgid "Pitch "
+msgstr "Traw"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:249
+msgid "Velocity "
+msgstr "Buanedd"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:250
+msgid "Type (Data1) "
+msgstr "Math (Data1)"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:251
+msgid "Value (Data2) "
+msgstr "Gwerth (Data2)"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:461
+msgid "(group %1) "
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:519
+msgid "<no events at this filter level>"
+msgstr "<dim digwyddiadau wrth y safon hidl yma>"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:521
+msgid "<no events>"
+msgstr "<dim digwyddiadau>"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:696
+#, fuzzy
+msgid "Segment label"
+msgstr "Addasu label Cylchran"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:696
+#, fuzzy
+msgid "Label:"
+msgstr "Labelu"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1123
+msgid "&Insert Event"
+msgstr "Mewnosod Di&gwyddiad"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1130
+msgid "&Delete Event"
+msgstr "Dileu Dig&wyddiad"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1137
+msgid "&Edit Event"
+msgstr "Golygu Digw&yddiad"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1144
+msgid "&Advanced Event Editor"
+msgstr "Golygu Digwyddiadau yn &Fanwl"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1518
+msgid "Open in Event Editor"
+msgstr "Agor yn y Golygydd Digwyddiadau"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1519
+msgid "Open in Expert Event Editor"
+msgstr "Agor yn y Golygydd Digwyddiadau am Arbenigwyr"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1577
+#, fuzzy
+msgid "%1 - Triggered Segment: %2"
+msgstr "Creu Cylchran"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1592
+msgid "%1 - Segment Track #%2 - Event List"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1598
+msgid "%1 - %2 Segments - Event List"
+msgstr ""
+
+#: ../src/gui/rulers/TempoRuler.cpp:131
+#, fuzzy
+msgid "Insert Tempo Change at Playback Position"
+msgstr "Mewnosod Newid Tempo"
+
+#: ../src/gui/rulers/TempoRuler.cpp:136
+#, fuzzy
+msgid "Delete Tempo Change"
+msgstr "Mewnosod Newid Tempo"
+
+#: ../src/gui/rulers/TempoRuler.cpp:140
+msgid "Ramp Tempo to Next Tempo"
+msgstr ""
+
+#: ../src/gui/rulers/TempoRuler.cpp:144
+msgid "Un-Ramp Tempo"
+msgstr ""
+
+#: ../src/gui/rulers/TempoRuler.cpp:149
+#, fuzzy
+msgid "Edit Tempo..."
+msgstr "Addasu Tempo Rhag&osodedig..."
+
+#: ../src/gui/rulers/TempoRuler.cpp:153
+#, fuzzy
+msgid "Edit Time Signature..."
+msgstr "Arwydd Amseriad"
+
+#: ../src/gui/rulers/TempoRuler.cpp:588
+#, fuzzy
+msgid "%1.%2%3 (%4.%5%6 bpm)"
+msgstr "%1.%2 s,"
+
+#: ../src/gui/rulers/TempoRuler.cpp:596
+#, fuzzy
+msgid "%1.%2%3 bpm"
+msgstr "%1.%2 s,"
+
+#: ../src/gui/rulers/TempoRuler.cpp:604
+#, fuzzy
+msgid "%1 - %2.%3%4"
+msgstr "&%1%2"
+
+#: ../src/gui/rulers/ControlRulerEventInsertCommand.cpp:36
+msgid "Insert Controller Event"
+msgstr "Mewnosod Digwyddiad Rheolydd"
+
+#: ../src/gui/rulers/ControlChangeCommand.cpp:35
+msgid "Control Change"
+msgstr "Newid Rheolydd"
+
+#: ../src/gui/rulers/PropertyViewRuler.cpp:72
+msgid "%1 controller"
+msgstr "rheolydd %1"
+
+#: ../src/gui/rulers/RawNoteRuler.cpp:453
+msgid "Track #%1, Segment \"%2\" (runtime id %3)"
+msgstr ""
+
+#: ../src/gui/rulers/MarkerRuler.cpp:100
+#, fuzzy
+msgid "Insert Marker"
+msgstr "Mewnosod Saib"
+
+#: ../src/gui/rulers/MarkerRuler.cpp:104
+#, fuzzy
+msgid "Insert Marker at Playback Position"
+msgstr "Mewnosod Newid Tempo"
+
+#: ../src/gui/rulers/MarkerRuler.cpp:109
+#, fuzzy
+msgid "Delete Marker"
+msgstr "Dileu Arwydd"
+
+#: ../src/gui/rulers/MarkerRuler.cpp:114
+#, fuzzy
+msgid "Edit Marker..."
+msgstr "Golygu Arwyddion..."
+
+#: ../src/gui/rulers/MarkerRuler.cpp:119
+msgid ""
+"Click on a marker to move the playback pointer.\n"
+"Shift-click to set a range between markers.\n"
+"Double-click to open the marker editor."
+msgstr ""
+
+#: ../src/gui/rulers/ChordNameRuler.cpp:97
+msgid ""
+"Chord name ruler.\n"
+"Turn it on and off from the Settings->Rulers menu."
+msgstr ""
+
+#: ../src/gui/rulers/ControlRulerEventEraseCommand.cpp:37
+msgid "Erase Controller Event(s)"
+msgstr "Dileu Digwyddiad(au) Rheolydd"
+
+#: ../src/gui/general/EditView.cpp:901
+#: ../src/gui/rulers/ControllerEventsRuler.cpp:188
+#, fuzzy
+msgid "Unsupported Event Type"
+msgstr "Math o ddigwyddiad na chynhelir:"
+
+#: ../src/gui/rulers/ControllerEventsRuler.cpp:203
+msgid "Controller Events"
+msgstr "Digwyddiadau Rheolydd"
+
+#: ../src/gui/rulers/ControllerEventsRuler.cpp:278
+msgid "Controller Event Number"
+msgstr "Rhif Digwyddiad Rheolydd"
+
+#: ../src/gui/rulers/ControllerEventsRuler.cpp:471
+#, fuzzy
+msgid "Add line of controllers"
+msgstr "rheolydd %1"
+
+#: ../src/gui/rulers/LoopRuler.cpp:89
+msgid ""
+"Click and drag to move the playback pointer.\n"
+"Shift-click and drag to set a range for looping or editing.\n"
+"Shift-click to clear the loop or range.\n"
+"Double-click to start playback."
+msgstr ""
+
+#: ../src/gui/general/EditViewBase.cpp:228
+#, fuzzy
+msgid "Set Segment Start Time..."
+msgstr "Dangos Paramedrau &Cylchrannau"
+
+#: ../src/gui/general/EditViewBase.cpp:232
+#, fuzzy
+msgid "Set Segment Duration..."
+msgstr "Gosod &Tempo i Barhad Cylchran Sain"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:56
+msgid "Load track parameters preset"
+msgstr ""
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:62
+#, fuzzy
+msgid "Convert notation for..."
+msgstr "Allforio ffeil sain ..."
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:86
+msgid "Select preset track parameters for:"
+msgstr ""
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:87
+msgid "Create appropriate notation for:"
+msgstr ""
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:89
+msgid "Category"
+msgstr ""
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:95
+#, fuzzy
+msgid "Player Ability"
+msgstr "Chwarae"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:97
+#, fuzzy
+msgid "Amateur"
+msgstr "Meistr MMC"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:98
+#, fuzzy
+msgid "Professional"
+msgstr "Prosesu..."
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:104
+#, fuzzy
+msgid "Only selected segments"
+msgstr "Dewis &Pob Cylchran"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:106
+#, fuzzy
+msgid "All segments in this track"
+msgstr "Gweithredu i bob cylchran wrth yr amser yma"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:111
+#, fuzzy
+msgid "Only for new segments"
+msgstr "Geiriau i'r cylchran yma"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:113
+#, fuzzy
+msgid "Convert existing segments"
+msgstr "Creu Cylchran"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:39
+#, c-format
+msgid "C%1"
+msgstr "C%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:39
+#, c-format
+msgid "C#%1"
+msgstr "C#%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:39
+#, c-format
+msgid "D%1"
+msgstr "D%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:39
+#, c-format
+msgid "D#%1"
+msgstr "D#%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:40
+#, c-format
+msgid "E%1"
+msgstr "E%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:40
+#, c-format
+msgid "F%1"
+msgstr "F%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:40
+#, c-format
+msgid "F#%1"
+msgstr "F#%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:40
+#, c-format
+msgid "G%1"
+msgstr "G%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:41
+#, c-format
+msgid "G#%1"
+msgstr "G#%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:41
+#, c-format
+msgid "A%1"
+msgstr "A%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:41
+#, c-format
+msgid "A#%1"
+msgstr "A#%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:41
+#, c-format
+msgid "B%1"
+msgstr "B%1"
+
+#: ../src/gui/general/PresetGroup.cpp:95
+#, fuzzy, c-format
+msgid "Can't open preset file %1"
+msgstr "Methu agor ffeil arddull %1"
+
+#: ../src/gui/general/EditView.cpp:744
+#, fuzzy
+msgid "&Halve Durations"
+msgstr "Parhad"
+
+#: ../src/gui/general/EditView.cpp:748
+#, fuzzy
+msgid "&Double Durations"
+msgstr "Lleddf dwbl"
+
+#: ../src/gui/general/EditView.cpp:806
+#, fuzzy
+msgid "Show Velocity Property Ruler"
+msgstr "Dangos Rhesydd Rheoli Buanedd"
+
+#: ../src/gui/general/EditView.cpp:825
+msgid "Insert item"
+msgstr "Mewnosod eitem"
+
+#: ../src/gui/general/EditView.cpp:831
+#, fuzzy
+msgid "Erase selected items"
+msgstr "Dileu eitem(au) dewisiedig"
+
+#: ../src/gui/general/EditView.cpp:835
+#, fuzzy
+msgid "Clear ruler"
+msgstr "Gwaredu'r Dewisiad"
+
+#: ../src/gui/general/EditView.cpp:839
+#, fuzzy
+msgid "Insert line of controllers"
+msgstr "Mewnosod Digwyddiad Rheolydd"
+
+#: ../src/gui/general/EditView.cpp:843
+#, fuzzy
+msgid "Flip forward"
+msgstr "Brys ymlaen"
+
+#: ../src/gui/general/EditView.cpp:847
+msgid "Flip backwards"
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:851
+#, fuzzy
+msgid "Draw property line"
+msgstr "{priodwedd newydd %1}"
+
+#: ../src/gui/general/EditView.cpp:855
+#, fuzzy
+msgid "Select all property values"
+msgstr "Dileu'r priodwedd yma"
+
+#: ../src/gui/general/EditView.cpp:894
+#, fuzzy
+msgid "%1 Controller %2 %3"
+msgstr "rheolydd %1"
+
+#: ../src/gui/general/EditView.cpp:1066
+msgid "I"
+msgstr "I"
+
+#: ../src/gui/general/EditView.cpp:1066
+msgid "II"
+msgstr "II"
+
+#: ../src/gui/general/EditView.cpp:1066
+msgid "III"
+msgstr "III"
+
+#: ../src/gui/general/EditView.cpp:1066
+msgid "IV"
+msgstr "IV"
+
+#: ../src/gui/general/EditView.cpp:1067
+msgid "V"
+msgstr "V"
+
+#: ../src/gui/general/EditView.cpp:1067
+msgid "VI"
+msgstr "VI"
+
+#: ../src/gui/general/EditView.cpp:1067
+msgid "VII"
+msgstr "VII"
+
+#: ../src/gui/general/EditView.cpp:1067
+msgid "VIII"
+msgstr "VIII"
+
+#: ../src/gui/general/EditView.cpp:1069
+msgid "%1 flat"
+msgstr "%1 lleddf"
+
+#: ../src/gui/general/EditView.cpp:1070
+msgid "%1 sharp"
+msgstr "%1 llon"
+
+#: ../src/gui/general/EditView.cpp:1085
+msgid "&Insert Note"
+msgstr "&Mewnosod nodyn"
+
+#: ../src/gui/general/EditView.cpp:1091
+msgid "&Upper Octave"
+msgstr "Wythfed &Uwch"
+
+#: ../src/gui/general/EditView.cpp:1096
+msgid "&Lower Octave"
+msgstr "Wythfed &Is"
+
+#: ../src/gui/general/EditView.cpp:1268
+msgid "Estimated time signature shown"
+msgstr "Dangos arwydd amseriad wedi'i amcangyfrif"
+
+#: ../src/gui/general/EditView.cpp:1431
+#, fuzzy
+msgid "Halving durations..."
+msgstr "Gosod &Tempo i Barhad Cylchran Sain"
+
+#: ../src/gui/general/EditView.cpp:1445
+#, fuzzy
+msgid "Doubling durations..."
+msgstr "Gosod &Tempo i Barhad Cylchran Sain"
+
+#: ../src/gui/general/EditView.cpp:1469
+#, fuzzy
+msgid "Rescaling..."
+msgstr "Ail-&raddu..."
+
+#: ../src/gui/general/EditView.cpp:1489
+#, fuzzy
+msgid "By number of semitones: "
+msgstr "Mewnosod faint o hanner-tonau i drawsgyweirio:"
+
+#: ../src/gui/general/EditView.cpp:1496 ../src/gui/general/EditView.cpp:1518
+msgid "Transposing..."
+msgstr "Trawsgyweirio..."
+
+#: ../src/gui/general/EditView.cpp:1536
+msgid "Transposing up one semitone..."
+msgstr "Trawsgyweirio i fyny un hanner-ton..."
+
+#: ../src/gui/general/EditView.cpp:1545
+msgid "Transposing up one octave..."
+msgstr "Trawsgyweirio i fyny un wythfed..."
+
+#: ../src/gui/general/EditView.cpp:1554
+msgid "Transposing down one semitone..."
+msgstr "Trawsgyweirio i lawr un hanner-ton..."
+
+#: ../src/gui/general/EditView.cpp:1563
+msgid "Transposing down one octave..."
+msgstr "Trawsgyweirio i lawr un wythfed..."
+
+#: ../src/gui/general/EditView.cpp:1575
+#, fuzzy
+msgid "Inverting..."
+msgstr "Dechrau..."
+
+#: ../src/gui/general/EditView.cpp:1587
+#, fuzzy
+msgid "Retrograding..."
+msgstr "Ail-&raddu..."
+
+#: ../src/gui/general/EditView.cpp:1599
+#, fuzzy
+msgid "Retrograde inverting..."
+msgstr "Ail-&raddu..."
+
+#: ../src/gui/general/EditView.cpp:1608
+#, fuzzy
+msgid "Jogging left..."
+msgstr "Cau'r ffeil..."
+
+#: ../src/gui/general/EditView.cpp:1623
+msgid "Jogging right..."
+msgstr ""
+
+#: ../src/sound/AudioFileManager.cpp:660
+#, fuzzy, c-format
+msgid "Downloading file %1"
+msgstr "Methu lawrlwytho ffeil %1"
+
+#: ../src/sound/AudioFileManager.cpp:735
+#, fuzzy
+msgid "Converting audio file..."
+msgstr "Allforio ffeil sain ..."
+
+#: ../src/sound/AudioFileManager.cpp:737
+#, fuzzy
+msgid "Resampling audio file..."
+msgstr "Allforio ffeil sain ..."
+
+#: ../src/sound/AudioFileManager.cpp:739
+#, fuzzy
+msgid "Converting and resampling audio file..."
+msgstr "Allforio ffeil sain ..."
+
+#: ../src/sound/AudioFileManager.cpp:741
+#, fuzzy
+msgid "Importing audio file..."
+msgstr "Allforio ffeil sain ..."
+
+#: ../src/sound/AudioFileManager.cpp:794
+#, fuzzy
+msgid "Failed to convert or resample audio file on import"
+msgstr "Dewis un neu mwy o Ffeiliau Sain"
+
+#: ../src/sequencer/main.cpp:46 ../src/sequencer/main.cpp:86
+#, fuzzy
+msgid "RosegardenSequencer"
+msgstr "Rheolydd Ffeiliau Sain Rosegarden"
+
+#: ../src/sequencer/main.cpp:54
+#, fuzzy
+msgid "JACK playback and capture ports"
+msgstr "Hwyrni chwarae JACK (mewn ms)"
+
+#: ../src/commands/segment/SegmentSyncCommand.cpp:38
+#: ../src/commands/segment/SegmentSyncCommand.cpp:44
+#: ../src/commands/segment/SegmentSyncCommand.cpp:55
+#: ../src/commands/segment/SegmentSyncCommand.cpp:63
+#, fuzzy
+msgid "Sync segment parameters"
+msgstr "Paramedrau Cylchrannau"
+
+#: ../src/commands/segment/RenameTrackCommand.h:52
+#, fuzzy
+msgid "Rename Track"
+msgstr "Ail-enwi Dyfais"
+
+#: ../src/commands/segment/SegmentRepeatToCopyCommand.cpp:39
+msgid "Turn Repeats into Copies"
+msgstr "Trosi Ailadroddion i mewn i Gopiau"
+
+#: ../src/commands/segment/SegmentTransposeCommand.cpp:36
+#: ../src/commands/segment/SegmentTransposeCommand.cpp:42
+#, fuzzy
+msgid "Change segment transposition"
+msgstr "Newid Lliw'r Gylchran"
+
+#: ../src/commands/edit/RescaleCommand.h:50
+#: ../src/commands/segment/AudioSegmentRescaleCommand.h:62
+#: ../src/commands/segment/SegmentRescaleCommand.h:58
+msgid "Stretch or S&quash..."
+msgstr ""
+
+#: ../src/commands/segment/SegmentLabelCommand.h:52
+msgid "Re&label..."
+msgstr "Ail-&labelu..."
+
+#: ../src/commands/segment/AudioSegmentResizeFromStartCommand.cpp:39
+#: ../src/commands/segment/SegmentResizeFromStartCommand.cpp:39
+#, fuzzy
+msgid "Resize Segment"
+msgstr "Ail-feintio Digwyddiad"
+
+#: ../src/commands/segment/RemoveTempoChangeCommand.h:58
+msgid "Remove &Tempo Change..."
+msgstr "Gwaredu Newid &Tempo..."
+
+#: ../src/commands/segment/SegmentEraseCommand.cpp:40
+#: ../src/commands/segment/SegmentEraseCommand.cpp:52
+msgid "Erase Segment"
+msgstr "Dileu Cylchran"
+
+#: ../src/commands/segment/AudioSegmentRescaleCommand.cpp:126
+#: ../src/commands/segment/SegmentRescaleCommand.cpp:102
+#, fuzzy
+msgid "(rescaled)"
+msgstr "%1 (wedi'i ail-raddu)"
+
+#: ../src/commands/segment/AudioSegmentRescaleCommand.cpp:127
+#: ../src/commands/segment/SegmentRescaleCommand.cpp:105
+msgid "%1 (rescaled)"
+msgstr "%1 (wedi'i ail-raddu)"
+
+#: ../src/commands/segment/PasteToTriggerSegmentCommand.cpp:47
+msgid "Paste as New Triggered Segment"
+msgstr ""
+
+#: ../src/commands/segment/SegmentColourMapCommand.h:52
+msgid "Change Segment Color Map..."
+msgstr "Newid Map Lliw'r Gylchran..."
+
+#: ../src/commands/segment/SegmentQuickCopyCommand.h:55
+msgid "Quick-Copy Segment"
+msgstr "Brys-gopio Cylchran"
+
+#: ../src/commands/segment/AudioSegmentSplitCommand.cpp:42
+msgid "Split Audio Segment"
+msgstr "Hollti Cylchran Sain"
+
+#: ../src/commands/segment/AudioSegmentSplitCommand.cpp:103
+#: ../src/commands/segment/SegmentSplitCommand.cpp:135
+#, fuzzy
+msgid " (split)"
+msgstr "%1 (wedi'i hollti)"
+
+#: ../src/commands/segment/AudioSegmentSplitCommand.cpp:104
+#: ../src/commands/segment/SegmentSplitByRecordingSrcCommand.cpp:120
+#: ../src/commands/segment/SegmentSplitByRecordingSrcCommand.cpp:122
+#: ../src/commands/segment/SegmentSplitCommand.cpp:136
+msgid "%1 (split)"
+msgstr "%1 (wedi'i hollti)"
+
+#: ../src/commands/segment/SegmentLabelCommand.cpp:40
+msgid "Label Segments"
+msgstr "Labelu Cylchrannau"
+
+#: ../src/commands/segment/OpenOrCloseRangeCommand.cpp:43
+msgid "Open or Close Range"
+msgstr ""
+
+#: ../src/commands/edit/TransposeCommand.h:55
+#: ../src/commands/segment/SegmentTransposeCommand.h:54
+#, fuzzy
+msgid "Transpose by &Interval..."
+msgstr "&Trawsgyweirio..."
+
+#: ../src/commands/segment/SegmentAutoSplitCommand.cpp:148
+msgid "%1 (part)"
+msgstr "%1 (rhan)"
+
+#: ../src/commands/segment/AudioSegmentInsertCommand.cpp:51
+#: ../src/commands/segment/SegmentInsertCommand.cpp:43
+#: ../src/commands/segment/SegmentInsertCommand.cpp:56
+msgid "Create Segment"
+msgstr "Creu Cylchran"
+
+#: ../src/commands/segment/AudioSegmentInsertCommand.cpp:114
+msgid "%1 (inserted)"
+msgstr "%1 (wedi ei rhyngosod)"
+
+#: ../src/commands/segment/AudioSegmentInsertCommand.cpp:117
+msgid "unknown audio file"
+msgstr "ffeil sain anhysbys"
+
+#: ../src/commands/segment/CreateTempoMapFromSegmentCommand.cpp:40
+#, fuzzy
+msgid "Set Tempos from Beat Segment"
+msgstr "Gosod &Tempo i Barhad Cylchran Sain"
+
+#: ../src/commands/segment/SegmentSplitByRecordingSrcCommand.h:52
+#, fuzzy
+msgid "Split by &Recording Source..."
+msgstr "Hollti gan &Draw..."
+
+#: ../src/commands/segment/SegmentColourMapCommand.cpp:40
+msgid "Change Segment Color Map"
+msgstr "Newid Map Lliw'r Gylchran"
+
+#: ../src/commands/edit/CopyCommand.cpp:64
+#: ../src/commands/segment/SegmentQuickCopyCommand.cpp:57
+msgid "%1 (copied)"
+msgstr "%1 (wedi'i gopio)"
+
+#: ../src/commands/segment/SegmentColourCommand.h:52
+msgid "Change Segment Color..."
+msgstr "Newid Lliw'r Gylchran..."
+
+#: ../src/commands/segment/SegmentSplitByPitchCommand.cpp:170
+msgid "%1 (upper)"
+msgstr "%1 (uwch)"
+
+#: ../src/commands/segment/SegmentSplitByPitchCommand.cpp:172
+msgid "%1 (lower)"
+msgstr "%1 (is)"
+
+#: ../src/commands/segment/SegmentSingleRepeatToCopyCommand.cpp:39
+msgid "Turn Single Repeat into Copy"
+msgstr "Trosi Ailadrodd Sengl i mewn i Gopi"
+
+#: ../src/commands/segment/AddTempoChangeCommand.h:58
+msgid "Add Te&mpo Change..."
+msgstr "Ychwanegu Newid Te&mpo..."
+
+#: ../src/commands/segment/AudioSegmentAutoSplitCommand.h:57
+#: ../src/commands/segment/SegmentAutoSplitCommand.h:53
+msgid "&Split on Silence"
+msgstr "&Hollti ar Ddistawrwydd"
+
+#: ../src/commands/segment/SetTriggerSegmentBaseVelocityCommand.cpp:39
+#, fuzzy
+msgid "Set Base Velocity"
+msgstr "&Cynyddu Buanedd"
+
+#: ../src/commands/segment/DeleteRangeCommand.cpp:43
+#: ../src/commands/segment/EraseSegmentsStartingInRangeCommand.cpp:39
+#, fuzzy
+msgid "Delete Range"
+msgstr "Di&leu"
+
+#: ../src/commands/segment/ChangeCompositionLengthCommand.h:53
+#, fuzzy
+msgid "Change &Composition Start and End..."
+msgstr "Newid Parhad y &Cyfansoddiad..."
+
+#: ../src/commands/segment/MoveTracksCommand.h:51
+msgid "Move Tracks..."
+msgstr "Symud Traciau..."
+
+#: ../src/commands/segment/SegmentColourCommand.cpp:39
+msgid "Change Segment Color"
+msgstr "Newid Lliw'r Gylchran"
+
+#: ../src/commands/segment/AudioSegmentDistributeCommand.h:66
+msgid "Distribute Audio Segments over MIDI"
+msgstr ""
+
+#: ../src/commands/segment/AudioSegmentAutoSplitCommand.cpp:147
+msgid "%1 (autosplit %2)"
+msgstr "%1 (hunan-hollti %2)"
+
+#: ../src/commands/segment/SetTriggerSegmentDefaultRetuneCommand.cpp:39
+#, fuzzy
+msgid "Set Default Retune"
+msgstr "Gwerth rhagosod:"
+
+#: ../src/commands/segment/AddTimeSignatureCommand.h:52
+msgid "Add Time Si&gnature Change..."
+msgstr "Ychwanegu Newid Ar&wydd Amseriad..."
+
+#: ../src/commands/segment/AddTriggerSegmentCommand.cpp:42
+#, fuzzy
+msgid "Add Triggered Segment"
+msgstr "Creu Cylchran"
+
+#: ../src/commands/segment/SetTriggerSegmentDefaultTimeAdjustCommand.cpp:39
+msgid "Set Default Time Adjust"
+msgstr ""
+
+#: ../src/commands/segment/RemoveTimeSignatureCommand.h:58
+#, fuzzy
+msgid "Remove &Time Signature Change..."
+msgstr "Ychwanegu Newid Ar&wydd Amseriad..."
+
+#: ../src/commands/segment/SegmentCommandRepeat.cpp:39
+msgid "Repeat Segments"
+msgstr "Ailadrodd Cylchrannau"
+
+#: ../src/commands/segment/AddTracksCommand.h:55
+msgid "Add Tracks..."
+msgstr "Ychwanegu Traciau..."
+
+#: ../src/commands/segment/ModifyDefaultTempoCommand.h:51
+msgid "Modify &Default Tempo..."
+msgstr "Addasu Tempo Rhag&osodedig..."
+
+#: ../src/commands/segment/SegmentSplitByPitchCommand.h:61
+msgid "Split by &Pitch..."
+msgstr "Hollti gan &Draw..."
+
+#: ../src/commands/segment/DeleteTriggerSegmentCommand.cpp:40
+msgid "Delete Triggered Segment"
+msgstr ""
+
+#: ../src/commands/segment/SegmentSplitCommand.cpp:42
+msgid "Split Segment"
+msgstr "Hollti Cylchran"
+
+#: ../src/commands/segment/DeleteTracksCommand.h:51
+msgid "Delete Tracks..."
+msgstr "Dileu Traciau..."
+
+#: ../src/commands/segment/InsertRangeCommand.cpp:42
+#, fuzzy
+msgid "Insert Range"
+msgstr "Mewnosod Saib"
+
+#: ../src/commands/segment/DeleteRangeCommand.h:62
+msgid "Rejoin Command"
+msgstr ""
+
+#: ../src/commands/segment/SetTriggerSegmentBasePitchCommand.cpp:39
+#, fuzzy
+msgid "Set Base Pitch"
+msgstr "Hollti gan Draw"
+
+#: ../src/commands/segment/PasteConductorDataCommand.cpp:41
+#, fuzzy
+msgid "Paste Tempos and Time Signatures"
+msgstr "Agor yn y Golygydd Digwyddiadau"
+
+#: ../src/commands/segment/SegmentSyncClefCommand.cpp:34
+#, fuzzy
+msgid "Sync segment clef"
+msgstr "Addasu label Cylchran"
+
+#: ../src/commands/matrix/MatrixInsertionCommand.cpp:46
+#: ../src/commands/notation/NoteInsertionCommand.cpp:54
+msgid "Insert Note"
+msgstr "Mewnosod Nodyn"
+
+#: ../src/commands/matrix/MatrixEraseCommand.cpp:41
+msgid "Erase Note"
+msgstr "Dileu Nodyn"
+
+#: ../src/commands/matrix/MatrixPercussionInsertionCommand.cpp:47
+#, fuzzy
+msgid "Insert Percussion Note"
+msgstr "Mewnosod Nodyn"
+
+#: ../src/commands/matrix/MatrixModifyCommand.cpp:43
+msgid "Move Note"
+msgstr "Symud Nodyn"
+
+#: ../src/commands/matrix/MatrixModifyCommand.cpp:43
+msgid "Modify Note"
+msgstr "Addasu Nodyn"
+
+#: ../src/commands/edit/PasteEventsCommand.cpp:98
+msgid "Paste into an existing gap [\"restricted\"]"
+msgstr "Gludo i mewn i fwlch sy'n bodoli [\"cyfyngedig\"]"
+
+#: ../src/commands/edit/PasteEventsCommand.cpp:100
+msgid "Erase existing events to make room [\"simple\"]"
+msgstr "Dileu digwyddiadau sy'n bodoli er mwyn creu lle [\"syml\"]"
+
+#: ../src/commands/edit/PasteEventsCommand.cpp:102
+msgid "Move existing events out of the way [\"open-n-paste\"]"
+msgstr "Symud digwyddiadau sy'n bodoli allan o'r ffordd [\"agor-a-gludo\"]"
+
+#: ../src/commands/edit/PasteEventsCommand.cpp:104
+msgid "Overlay notes, tying against present notes [\"note-overlay\"]"
+msgstr ""
+"Trosgaenu nodau, gan glymu yn erbyn nodau presennol [\"trosgaen-nodau\"]"
+
+#: ../src/commands/edit/PasteEventsCommand.cpp:106
+msgid "Overlay notes, ignoring present notes [\"matrix-overlay\"]"
+msgstr "Trosgaenu nodau, gan anywbyddu nodau presennol [\"trosgaen-matrics\"]"
+
+#: ../src/commands/edit/AddDotCommand.h:52
+#, fuzzy
+msgid "&Add Dot"
+msgstr "Ychwanegu %1"
+
+#: ../src/commands/edit/RemoveMarkerCommand.h:55
+msgid "&Remove Marker"
+msgstr "&Gwaredu Arwydd"
+
+#: ../src/commands/edit/EventUnquantizeCommand.cpp:43
+#: ../src/commands/edit/EventUnquantizeCommand.cpp:54
+msgid "Unquantize Events"
+msgstr "Dad-gwanteiddio Digwyddiadau"
+
+#: ../src/commands/edit/ChangeVelocityCommand.h:53
+msgid "&Increase Velocity"
+msgstr "&Cynyddu Buanedd"
+
+#: ../src/commands/edit/ChangeVelocityCommand.h:54
+msgid "&Reduce Velocity"
+msgstr "&Lleihau Buanedd"
+
+#: ../src/commands/edit/CopyCommand.cpp:46
+msgid "(excerpt)"
+msgstr "(dyfyniad)"
+
+#: ../src/commands/edit/CopyCommand.cpp:60
+msgid "(copied)"
+msgstr "(wedi'i gopio)"
+
+#: ../src/commands/edit/EventInsertionCommand.cpp:39
+msgid "Insert Event"
+msgstr "Mewnosod Digwyddiad"
+
+#: ../src/commands/edit/InsertTriggerNoteCommand.cpp:55
+#, fuzzy
+msgid "Insert Trigger Note"
+msgstr "Mewnosod Nodyn"
+
+#: ../src/commands/edit/CollapseNotesCommand.h:50
+msgid "Collapse &Equal-Pitch Notes"
+msgstr "Dat-ehangu &Nodau Hafal-Draw"
+
+#: ../src/commands/edit/TransposeCommand.h:61
+msgid "&Up a Semitone"
+msgstr "I &Fyny Hanner-ton"
+
+#: ../src/commands/edit/TransposeCommand.h:62
+msgid "&Down a Semitone"
+msgstr "I &Lawr Hanner-ton"
+
+#: ../src/commands/edit/TransposeCommand.h:63
+msgid "Up an &Octave"
+msgstr "I Fyny &Wythfed"
+
+#: ../src/commands/edit/TransposeCommand.h:64
+msgid "Down an Octa&ve"
+msgstr "I lawr Wyth&fed"
+
+#: ../src/commands/edit/TransposeCommand.h:65
+#, fuzzy
+msgid "&Transpose by Semitones..."
+msgstr "Trawsgyweirio i fyny un hanner-ton..."
+
+#: ../src/commands/edit/SetNoteTypeCommand.h:56
+#, fuzzy
+msgid "&Set Note Type"
+msgstr "&Mewnosod nodyn"
+
+#: ../src/commands/edit/EventEditCommand.h:55
+msgid "Edit E&vent"
+msgstr "Golygu Di&gwyddiad"
+
+#: ../src/commands/edit/AddMarkerCommand.h:54
+msgid "&Add Marker"
+msgstr "Ychwanegu &Arwydd"
+
+#: ../src/commands/edit/SelectionPropertyCommand.h:66
+msgid "Set &Property"
+msgstr "Gosod &Priodwedd"
+
+#: ../src/commands/edit/CutCommand.h:55
+msgid "Cu&t"
+msgstr "To&rri"
+
+#: ../src/commands/edit/EventQuantizeCommand.cpp:114
+msgid "Heuristic Notation &Quantize"
+msgstr "&Cwanteiddio Nodiant Darganfyddol"
+
+#: ../src/commands/edit/EventQuantizeCommand.cpp:116
+msgid "Grid &Quantize"
+msgstr "C&wanteiddio Rhwydell"
+
+#: ../src/commands/edit/ClearTriggersCommand.h:52
+#, fuzzy
+msgid "&Clear Triggers"
+msgstr "Gwaredu'r Dewisiad"
+
+#: ../src/commands/edit/RetrogradeCommand.h:51
+#, fuzzy
+msgid "&Retrograde"
+msgstr "&Recordio"
+
+#: ../src/commands/edit/InvertCommand.h:51
+#, fuzzy
+msgid "&Invert"
+msgstr "Cil&droi"
+
+#: ../src/commands/edit/SetTriggerCommand.h:64
+#, fuzzy
+msgid "Tri&gger Segment"
+msgstr "Dileu Cylchran"
+
+#: ../src/commands/edit/SetLyricsCommand.h:50
+msgid "Edit L&yrics"
+msgstr "Golygu &Geiriau"
+
+#: ../src/commands/edit/MoveAcrossSegmentsCommand.cpp:73
+#, fuzzy
+msgid "&Move Events to Other Segment"
+msgstr "Wedi cael digwyddiad tu allan o Gylchran"
+
+#: ../src/commands/edit/RetrogradeInvertCommand.h:51
+msgid "Re&trograde Invert"
+msgstr ""
+
+#: ../src/commands/edit/ModifyMarkerCommand.h:55
+msgid "&Modify Marker"
+msgstr "Addasu A&rwydd"
+
+#: ../src/commands/studio/AddControlParameterCommand.h:61
+msgid "&Add Control Parameter"
+msgstr "&Ychwanegu Paramedr Rheoli"
+
+#: ../src/commands/studio/ModifyInstrumentMappingCommand.h:55
+msgid "Modify &Instrument Mapping"
+msgstr "Addasu Mapio &Offeryn "
+
+#: ../src/commands/studio/RemoveControlParameterCommand.h:60
+msgid "&Remove Control Parameter"
+msgstr "Dil&eu Paramedr Rheoli"
+
+#: ../src/commands/studio/ReconnectDeviceCommand.h:55
+msgid "Reconnect Device"
+msgstr "Ail-gysylltu Dyfais"
+
+#: ../src/commands/studio/ModifyDeviceCommand.h:68
+msgid "Modify &MIDI Bank"
+msgstr "Addasu Rheng &MIDI"
+
+#: ../src/commands/studio/CreateOrDeleteDeviceCommand.h:68
+msgid "Create Device"
+msgstr "Creu Dyfais"
+
+#: ../src/commands/studio/ModifyDeviceMappingCommand.h:55
+msgid "Modify &Device Mapping"
+msgstr "Addasu Mapio &Dyfais"
+
+#: ../src/commands/studio/RenameDeviceCommand.h:55
+msgid "Rename Device"
+msgstr "Ail-enwi Dyfais"
+
+#: ../src/commands/studio/ModifyControlParameterCommand.h:61
+msgid "&Modify Control Parameter"
+msgstr "A&ddasu Paramedr Rheoli"
+
+#: ../src/commands/notation/TieNotesCommand.h:49
+#, fuzzy
+msgid "&Tie"
+msgstr "Amser"
+
+#: ../src/commands/notation/ClefInsertionCommand.cpp:74
+msgid "Add Cle&f Change..."
+msgstr "Ychwanegu Newid Cle&ff..."
+
+#: ../src/commands/notation/GuitarChordInsertionCommand.cpp:40
+#, fuzzy
+msgid "Insert Guitar Chord"
+msgstr "Mewnosod Saib"
+
+#: ../src/commands/notation/RespellCommand.cpp:47
+#, c-format
+msgid "Respell with %1"
+msgstr ""
+
+#: ../src/commands/notation/RespellCommand.cpp:50
+msgid "Do&uble Sharp"
+msgstr "Llon &Dwbl"
+
+#: ../src/commands/notation/RespellCommand.cpp:52
+msgid "&Sharp"
+msgstr "&Llon"
+
+#: ../src/commands/notation/RespellCommand.cpp:54
+msgid "&Flat"
+msgstr "Ll&eddf"
+
+#: ../src/commands/notation/RespellCommand.cpp:56
+msgid "Dou&ble Flat"
+msgstr "Lledd&f dwbl"
+
+#: ../src/commands/notation/RespellCommand.cpp:58
+msgid "&Natural"
+msgstr "&Naturiol"
+
+#: ../src/commands/notation/RespellCommand.cpp:60
+msgid "N&one"
+msgstr "D&im"
+
+#: ../src/commands/notation/RespellCommand.cpp:66
+#, fuzzy
+msgid "Respell Accidentals &Upward"
+msgstr "Gorfod Hapnodau i F&yny"
+
+#: ../src/commands/notation/RespellCommand.cpp:69
+#, fuzzy
+msgid "Respell Accidentals &Downward"
+msgstr "Gorfod Hapnodau i La&wr"
+
+#: ../src/commands/notation/RespellCommand.cpp:72
+#, fuzzy
+msgid "&Restore Accidentals"
+msgstr "&Hapnodau"
+
+#: ../src/commands/notation/RespellCommand.cpp:75
+#, fuzzy
+msgid "Respell Accidentals"
+msgstr "Gorfod Hapnodau"
+
+#: ../src/commands/notation/DeCounterpointCommand.h:55
+msgid "Split-and-Tie Overlapping &Chords"
+msgstr "Hollti-a-Chlymu &Cordiau sy'n Gorgyffwrdd"
+
+#: ../src/commands/notation/BeamCommand.h:49
+msgid "&Beam Group"
+msgstr "Casgliad &Trawst"
+
+#: ../src/commands/notation/AddTextMarkCommand.h:51
+msgid "Add Te&xt Mark..."
+msgstr "Ychwanegu Arwydd Te&stun..."
+
+#: ../src/commands/notation/RestoreSlursCommand.h:49
+#, fuzzy
+msgid "&Restore Slur Positions"
+msgstr "&Adfer Coesau a Gyfrifwyd"
+
+#: ../src/commands/notation/SustainInsertionCommand.h:56
+msgid "Add Pedal &Press"
+msgstr ""
+
+#: ../src/commands/notation/SustainInsertionCommand.h:58
+msgid "Add Pedal &Release"
+msgstr ""
+
+#: ../src/commands/notation/FixNotationQuantizeCommand.h:49
+msgid "Fi&x Notation Quantization"
+msgstr "Trwsio &Cwanteiddio Nodiant"
+
+#: ../src/commands/notation/ChangeStemsCommand.h:51
+msgid "Stems &Up"
+msgstr "Coesau I &Fyny"
+
+#: ../src/commands/notation/ChangeStemsCommand.h:51
+msgid "Stems &Down"
+msgstr "Coesau I &Lawr"
+
+#: ../src/commands/notation/MakeAccidentalsCautionaryCommand.cpp:43
+#, fuzzy
+msgid "Use &Cautionary Accidentals"
+msgstr "&Adfer Hapnodau a Enrhifwyd"
+
+#: ../src/commands/notation/MakeAccidentalsCautionaryCommand.cpp:45
+#, fuzzy
+msgid "Cancel C&autionary Accidentals"
+msgstr "Gorfod &Hapnodau"
+
+#: ../src/commands/notation/SetVisibilityCommand.h:50
+#, fuzzy
+msgid "Set Visibility"
+msgstr "&Buanedd"
+
+#: ../src/commands/notation/ChangeStyleCommand.h:53
+msgid "Change &Note Style"
+msgstr "Newid Arddull y &Nodau"
+
+#: ../src/commands/notation/TextInsertionCommand.cpp:41
+msgid "Insert Text"
+msgstr "Mewnosod Testun"
+
+#: ../src/commands/notation/InterpretCommand.h:70
+msgid "&Interpret..."
+msgstr "&Dehongli..."
+
+#: ../src/commands/notation/TupletCommand.h:53
+#, fuzzy
+msgid "&Triplet"
+msgstr "Tripled"
+
+#: ../src/commands/notation/TupletCommand.h:54
+#, fuzzy
+msgid "Tu&plet..."
+msgstr "&Plygyn..."
+
+#: ../src/commands/notation/UnTupletCommand.h:50
+msgid "&Untuplet"
+msgstr "&Dat-wneud plygyn"
+
+#: ../src/commands/notation/CollapseRestsCommand.h:54
+msgid "&Collapse Rests"
+msgstr "&Dat-ehangu Seibiau"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:145
+msgid "Add S&lur"
+msgstr "Ychwanegu &Llithriad"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:147
+#, fuzzy
+msgid "Add &Phrasing Slur"
+msgstr "Ychwanegu llithriad..."
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:149
+msgid "Add Double-Octave Up"
+msgstr ""
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:151
+msgid "Add Octave &Up"
+msgstr ""
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:153
+msgid "Add Octave &Down"
+msgstr ""
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:155
+msgid "Add Double Octave Down"
+msgstr ""
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:160
+#, fuzzy
+msgid "Add &Crescendo"
+msgstr "Ychwanegu crescendo..."
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:162
+#, fuzzy
+msgid "Add &Decrescendo"
+msgstr "Ychwanegu decrescendo..."
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:164
+#, fuzzy
+msgid "Add &Glissando"
+msgstr "Ychwanegu crescendo..."
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:167
+msgid "Add &%1%2"
+msgstr "Ychwanegu &%1%2"
+
+#: ../src/commands/notation/RemoveNotationQuantizeCommand.h:49
+#, fuzzy
+msgid "Remo&ve Notation Quantization"
+msgstr "Trwsio &Cwanteiddio Nodiant"
+
+#: ../src/commands/notation/MakeChordCommand.h:50
+#, fuzzy
+msgid "Make &Chord"
+msgstr "Cord"
+
+#: ../src/commands/notation/MultiKeyInsertionCommand.h:63
+msgid "Change all to &Key %1..."
+msgstr "Newid popeth i &Gywair %1..."
+
+#: ../src/commands/notation/KeyInsertionCommand.h:67
+#: ../src/commands/notation/MultiKeyInsertionCommand.h:65
+msgid "Add &Key Change..."
+msgstr "Ychwanegu &Newid Cywair..."
+
+#: ../src/commands/notation/RestoreStemsCommand.h:49
+#, fuzzy
+msgid "&Restore Stems"
+msgstr "&Adfer Coesau a Gyfrifwyd"
+
+#: ../src/commands/notation/MakeNotesViableCommand.h:55
+#: ../src/commands/notation/MakeRegionViableCommand.h:52
+msgid "Tie Notes at &Barlines"
+msgstr "Clymu Nodau wrth Li&nellau Bar"
+
+#: ../src/commands/notation/AddSlashesCommand.h:46
+msgid "Slashes"
+msgstr "Slaesau"
+
+#: ../src/commands/notation/ChangeSlurPositionCommand.h:51
+msgid "Slur &Above"
+msgstr ""
+
+#: ../src/commands/notation/ChangeSlurPositionCommand.h:51
+msgid "Slur &Below"
+msgstr ""
+
+#: ../src/commands/notation/NormalizeRestsCommand.h:54
+msgid "&Normalize Rests"
+msgstr "&Normaleiddio Seibiau"
+
+#: ../src/commands/notation/TextChangeCommand.cpp:41
+#, fuzzy
+msgid "Edit Text"
+msgstr "Golygu Digwyddiad"
+
+#: ../src/commands/notation/RemoveMarksCommand.h:49
+msgid "&Remove All Marks"
+msgstr "&Gwaredu Pob Arwydd"
+
+#: ../src/commands/notation/AutoBeamCommand.h:52
+msgid "&Auto-Beam"
+msgstr "&Hunan-Drawstio"
+
+#: ../src/commands/notation/UntieNotesCommand.h:49
+#, fuzzy
+msgid "&Untie"
+msgstr "Dad-&glymu Nodau"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:48
+msgid "S&forzando"
+msgstr "S&forzando"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:50
+msgid "Sta&ccato"
+msgstr "Sta&ccato"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:52
+msgid "R&inforzando"
+msgstr "R&inforzando"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:54
+msgid "T&enuto"
+msgstr "T&enuto"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:56
+msgid "Tri&ll"
+msgstr "&Siglnod"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:58
+msgid "Trill &with Line"
+msgstr ""
+
+#: ../src/commands/notation/AddMarkCommand.cpp:60
+#, fuzzy
+msgid "Trill Line"
+msgstr "&Siglnod"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:62
+msgid "&Turn"
+msgstr "&Tro"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:64
+msgid "&Accent"
+msgstr "&Acen"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:66
+msgid "&Staccatissimo"
+msgstr "&Staccatissimo"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:68
+msgid "&Marcato"
+msgstr "&Marcato"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:70
+msgid "&Pause"
+msgstr "&Saib"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:72
+msgid "&Up-Bow"
+msgstr "Bwa I &Fyny"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:74
+msgid "&Down-Bow"
+msgstr "Bwa I &Lawr"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:76
+msgid "Mo&rdent"
+msgstr ""
+
+#: ../src/commands/notation/AddMarkCommand.cpp:78
+#, fuzzy
+msgid "Inverted Mordent"
+msgstr "Mewnosod Digwyddiad"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:80
+msgid "Long Mordent"
+msgstr ""
+
+#: ../src/commands/notation/AddMarkCommand.cpp:82
+#, fuzzy
+msgid "Lon&g Inverted Mordent"
+msgstr "Modd Mewnosod &Cord"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:84
+msgid "&%1%2"
+msgstr "&%1%2"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:89
+#, c-format
+msgid "Add %1"
+msgstr "Ychwanegu %1"
+
+#: ../src/commands/notation/ResetDisplacementsCommand.h:49
+#, fuzzy
+msgid "Restore Positions"
+msgstr "&Adfer Coesau a Gyfrifwyd"
+
+#: ../src/commands/notation/IncrementDisplacementsCommand.h:52
+#, fuzzy
+msgid "Fine Reposition"
+msgstr "Lleoliad y cyrchydd"
+
+#: ../src/commands/notation/RestoreTiesCommand.h:49
+#, fuzzy
+msgid "&Restore Tie Positions"
+msgstr "&Adfer Coesau a Gyfrifwyd"
+
+#: ../src/commands/notation/ChangeTiePositionCommand.h:47
+msgid "Tie &Above"
+msgstr ""
+
+#: ../src/commands/notation/ChangeTiePositionCommand.h:47
+msgid "Tie &Below"
+msgstr ""
+
+#: ../src/commands/notation/KeyInsertionCommand.h:65
+msgid "Change to &Key %1..."
+msgstr "Newid i &Gywair %1..."
+
+#: ../src/commands/notation/RemoveFingeringMarksCommand.h:49
+#, fuzzy
+msgid "&Remove Fingerings"
+msgstr "&Gwaredu Arwydd"
+
+#: ../src/commands/notation/BreakCommand.h:49
+msgid "&Unbeam"
+msgstr "&Dad-drawstio"
+
+#: ../src/commands/notation/UnGraceCommand.h:48
+msgid "Ung&race"
+msgstr "Dat-wneud Addu&rnod"
+
+#: ../src/commands/notation/AddFingeringMarkCommand.cpp:45
+#, fuzzy
+msgid "Add Other &Fingering..."
+msgstr "Ychwanegu llithriad..."
+
+#: ../src/commands/notation/AddFingeringMarkCommand.cpp:47
+#, fuzzy
+msgid "Add Fingering &0 (Thumb)"
+msgstr "Ychwanegu llithriad..."
+
+#: ../src/commands/notation/AddFingeringMarkCommand.cpp:49
+#, fuzzy, c-format
+msgid "Add Fingering &%1"
+msgstr "Ychwanegu llithriad..."
+
+#: ../src/document/io/HydrogenXMLHandler.cpp:277
+msgid " imported from Hydrogen "
+msgstr ""
+
+#: ../src/document/io/LilyPondExporter.cpp:404
+#, fuzzy
+msgid ""
+"LilyPond does not allow spaces or backslashes in filenames.\n"
+"\n"
+"Would you like to use\n"
+"\n"
+" %1\n"
+"\n"
+" instead?"
+msgstr ""
+"Nid yw Lilypond yn caniatau gofodnodau neu slaesau ol mewn enwau ffeiliau. "
+"Fuasech chi'n hoffi defnyddio\n"
+"\n"
+"%1\n"
+"\n"
+"yn lle?"
+
+#: ../src/document/io/LilyPondExporter.cpp:2054
+msgid "warning: overlong bar truncated here"
+msgstr "rhybudd: bar sy'n or-hir wedi'i dorri yma"
+
+#: ../src/document/io/LilyPondExporter.cpp:2060
+msgid "warning: bar too short, padding with rests"
+msgstr "rhybudd: bar sy'n rhy gwta, wedi ei lenwi efo seibiau"
+
+#: ../src/document/MultiViewCommandHistory.cpp:318
+msgid "Nothing to undo"
+msgstr "Dim byd i ddat-wneud"
+
+#: ../src/document/MultiViewCommandHistory.cpp:320
+msgid "Nothing to redo"
+msgstr "Dim byd i ail-wneud"
+
+#: ../src/document/MultiViewCommandHistory.cpp:328
+#: ../src/document/MultiViewCommandHistory.cpp:372
+#, c-format
+msgid "Und&o %1"
+msgstr "Dat-&wneud %1"
+
+#: ../src/document/MultiViewCommandHistory.cpp:330
+#: ../src/document/MultiViewCommandHistory.cpp:374
+#, c-format
+msgid "Re&do %1"
+msgstr "Ail-w&neud %1"
+
+#: ../src/document/RosegardenGUIDoc.cpp:328
+msgid ""
+"The current file has been modified.\n"
+"Do you want to save it?"
+msgstr ""
+"Mae'r ffeil cyfredol wedi'i addasu.\n"
+"Ydych eisiau ei gadw?"
+
+#: ../src/document/RosegardenGUIDoc.cpp:480
+#, c-format
+msgid ""
+"_n: Delete the 1 audio file recorded during the unsaved session?\n"
+"Delete the %n audio files recorded during the unsaved session?"
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:501
+msgid ""
+"The following audio files were recorded during this session but have been "
+"unloaded\n"
+"from the audio file manager, and so are no longer in use in the document you "
+"are saving.\n"
+"\n"
+"You may want to clean up these files to save disk space.\n"
+"\n"
+"Please select any you wish to delete permanently from the hard disk.\n"
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:517
+#, c-format
+msgid ""
+"_n: <qt>About to delete 1 audio file permanently from the hard disk."
+"<br>There will be no way to recover this file.<br>Are you sure?</qt>\n"
+"\n"
+"<qt>About to delete %n audio files permanently from the hard disk.<br>There "
+"will be no way to recover these files.<br>Are you sure?</qt>"
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:580
+msgid "Can't open file '%1'"
+msgstr "Methu agor ffeil '%1'"
+
+#: ../src/document/RosegardenGUIDoc.cpp:585
+msgid "Reading file..."
+msgstr "Darllen ffeil..."
+
+#: ../src/document/RosegardenGUIDoc.cpp:603
+#, fuzzy
+msgid "Could not open Rosegarden file"
+msgstr "Dim ffeil Rosegarden-4"
+
+#: ../src/document/RosegardenGUIDoc.cpp:641
+msgid "Error when parsing file '%1': \"%2\""
+msgstr "Gwall wrth ddosrannu '%1': \"%2\""
+
+#: ../src/document/RosegardenGUIDoc.cpp:689
+msgid "Generating audio previews..."
+msgstr "Creu rhagolygon sain..."
+
+#: ../src/document/RosegardenGUIDoc.cpp:721
+msgid "Merge"
+msgstr "Cyfuno"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1605
+msgid "File load cancelled"
+msgstr "Diddymwyd Llwytho'r Ffeil"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1625
+msgid ""
+"<h3>Audio and plugins not available</h3><p>This composition uses audio files "
+"or plugins, but Rosegarden is currently running without audio because the "
+"JACK audio server was not available on startup.</p><p>Please exit "
+"Rosegarden, start the JACK audio server and re-start Rosegarden if you wish "
+"to load this complete composition.</p><p><b>WARNING:</b> If you re-save this "
+"composition, all audio and plugin data and settings in it will be lost.</p>"
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:1628
+msgid ""
+"<h3>Audio and plugins not available</h3><p>This composition uses audio files "
+"or plugins, but you are running a version of Rosegarden that was compiled "
+"without audio support.</p><p><b>WARNING:</b> If you re-save this composition "
+"from this version of Rosegarden, all audio and plugin data and settings in "
+"it will be lost.</p>"
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:1665
+msgid ""
+"<h3>Incorrect audio sample rate</h3><p>This composition contains audio files "
+"that were recorded or imported with the audio server running at a different "
+"sample rate (%1 Hz) from the current JACK server sample rate (%2 Hz).</"
+"p><p>Rosegarden will play this composition at the correct speed, but any "
+"audio files in it will probably sound awful.</p><p>Please consider re-"
+"starting the JACK server at the correct rate (%3 Hz) and re-loading this "
+"composition before you do any more work with it.</p>"
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:1675
+msgid ""
+"<h3>Inconsistent audio sample rates</h3><p>This composition contains audio "
+"files at more than one sample rate.</p><p>Rosegarden will play them at the "
+"correct speed, but any audio files that were recorded or imported at rates "
+"different from the current JACK server sample rate (%1 Hz) will probably "
+"sound awful.</p><p>Please see the audio file manager dialog for more "
+"details, and consider resampling any files that are at the wrong rate.</p>"
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:1676
+#, fuzzy
+msgid "Inconsistent sample rates"
+msgstr "Priodweddau di-barhaol"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1690
+msgid ""
+"<h3>Plugins not found</h3><p>The following audio plugins could not be loaded:"
+"</p><ul>"
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:1698
+msgid "<li>%1 (from %2)</li>"
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:1712
+#, fuzzy
+msgid ""
+"This file contains one or more old element types that are now deprecated.\n"
+"Support for these elements may disappear in future versions of Rosegarden.\n"
+"We recommend you re-save this file from this version of Rosegarden to ensure "
+"that it can still be re-loaded in future versions."
+msgstr ""
+"Mae'r ffeil yma yn cynnwys un neu mwy o fathau hen elfen sy'n cael eu "
+"dilorni rwan.\n"
+"Efallai bydd cynnal i'r elfennau yma yn diflannu mewn fersiynau dyfodol o "
+"Rosegarden.\n"
+"Y peth gorau yw ail-gadw'r ffeil yma oddiwrth y fersiwn yma o Rosegarden, \n"
+"er mwyn sicrhau y bydd o'n dal i gael ei ail-lwytho mewn fersiynau dyfodol."
+
+#: ../src/document/RosegardenGUIDoc.cpp:2207
+msgid "Insert Recorded MIDI"
+msgstr "Mewnosod MIDI a Recordiwyd"
+
+#: ../src/document/RosegardenGUIDoc.cpp:2560
+msgid "%1 (recorded)"
+msgstr "%1 (wedi'i recordio)"
+
+#: ../src/document/RoseXmlHandler.cpp:442
+msgid ""
+"This file was written by Rosegarden %1, and it uses\n"
+"a different file format that cannot be read by this version."
+msgstr ""
+
+#: ../src/document/RoseXmlHandler.cpp:452
+msgid ""
+"This file was written by Rosegarden %1, which is more recent than this "
+"version.\n"
+"There may be some incompatibilities with the file format."
+msgstr ""
+
+#: ../src/document/RoseXmlHandler.cpp:1687
+#, fuzzy
+msgid "Loading plugins..."
+msgstr "Rhifo ategynnau..."
+
+#: rc.cpp:6 rc.cpp:144
+#, fuzzy, no-c-format
+msgid "Se&gment"
+msgstr "Cylch&rannau"
+
+#: rc.cpp:9 rc.cpp:84 rc.cpp:147 rc.cpp:303
+#, fuzzy, no-c-format
+msgid "Edit &With"
+msgstr "%1 Traw"
+
+#: rc.cpp:12 rc.cpp:21 rc.cpp:30 rc.cpp:39 rc.cpp:345
+#, no-c-format
+msgid "Actions Toolbar"
+msgstr "Bar Gweithrediadau"
+
+#: rc.cpp:15 rc.cpp:33 rc.cpp:129 rc.cpp:285
+#, fuzzy, no-c-format
+msgid "Time Toolbar"
+msgstr "Bar Chwyddo"
+
+#: rc.cpp:18 rc.cpp:36 rc.cpp:57 rc.cpp:63 rc.cpp:120 rc.cpp:243 rc.cpp:342
+#, no-c-format
+msgid "Transport Toolbar"
+msgstr "Bar Cludydd"
+
+#: rc.cpp:24 rc.cpp:42 rc.cpp:123 rc.cpp:348
+#, no-c-format
+msgid "Zoom Toolbar"
+msgstr "Bar Chwyddo"
+
+#: rc.cpp:45 rc.cpp:60 rc.cpp:99 rc.cpp:228 rc.cpp:327
+#, no-c-format
+msgid "T&ransport"
+msgstr "C&ludydd"
+
+#: rc.cpp:51
+#, fuzzy, no-c-format
+msgid "Number of Stereo &Inputs"
+msgstr "Nifer o fewnbynnau sain JACK"
+
+#: rc.cpp:54
+#, fuzzy, no-c-format
+msgid "&Number of Submasters"
+msgstr "Nifer o fewnbynnau sain JACK"
+
+#: rc.cpp:66
+#, no-c-format
+msgid "&Import"
+msgstr "&Mewnforio"
+
+#: rc.cpp:69
+#, no-c-format
+msgid "&Merge"
+msgstr "&Cyfuno"
+
+#: rc.cpp:72
+#, no-c-format
+msgid "&Export"
+msgstr "&Allforio"
+
+#: rc.cpp:75 rc.cpp:141 rc.cpp:297
+#, fuzzy, no-c-format
+msgid "&Composition"
+msgstr "Lleoliad y cyrchydd"
+
+#: rc.cpp:78
+#, no-c-format
+msgid "&Studio"
+msgstr "&Stiwdio"
+
+#: rc.cpp:81
+#, fuzzy, no-c-format
+msgid "Se&gments"
+msgstr "Cylch&rannau"
+
+#: rc.cpp:90
+#, no-c-format
+msgid "Trac&ks"
+msgstr "Tra&ciau"
+
+#: rc.cpp:93
+#, fuzzy, no-c-format
+msgid "Set &Instrument"
+msgstr "Gosod Offeryn"
+
+#: rc.cpp:102 rc.cpp:234 rc.cpp:333
+#, fuzzy, no-c-format
+msgid "&Toolbars"
+msgstr "Bar Ffontiau"
+
+#: rc.cpp:105 rc.cpp:237 rc.cpp:336
+#, fuzzy, no-c-format
+msgid "&Rulers"
+msgstr "Dangos Rhes&yddion"
+
+#: rc.cpp:111 rc.cpp:240 rc.cpp:339
+#, no-c-format
+msgid "Tools Toolbar"
+msgstr "Bar Offer"
+
+#: rc.cpp:114
+#, no-c-format
+msgid "Tracks Toolbar"
+msgstr "Bar Traciau"
+
+#: rc.cpp:117
+#, no-c-format
+msgid "Editors Toolbar"
+msgstr "Bar Golygyddion"
+
+#: rc.cpp:135
+#, fuzzy, no-c-format
+msgid "&Layout Mode"
+msgstr "Haenlun"
+
+#: rc.cpp:138 rc.cpp:294
+#, fuzzy, no-c-format
+msgid "Add Event Ruler"
+msgstr "Hidlen Ddigwyddiadau"
+
+#: rc.cpp:150
+#, fuzzy, no-c-format
+msgid "N&ote"
+msgstr "&Nodau"
+
+#: rc.cpp:153
+#, no-c-format
+msgid "Mar&ks"
+msgstr "Ar&wyddion"
+
+#: rc.cpp:156
+#, fuzzy, no-c-format
+msgid "&Ornaments"
+msgstr "Cylch&rannau"
+
+#: rc.cpp:159
+#, fuzzy, no-c-format
+msgid "&Fingerings"
+msgstr "Ychwanegu llithriad..."
+
+#: rc.cpp:162
+#, no-c-format
+msgid "S&lashes"
+msgstr "S&laesau"
+
+#: rc.cpp:165 rc.cpp:219
+#, no-c-format
+msgid "&Accidentals"
+msgstr "&Hapnodau"
+
+#: rc.cpp:168
+#, fuzzy, no-c-format
+msgid "&Phrase"
+msgstr "&Dileu"
+
+#: rc.cpp:171
+#, fuzzy, no-c-format
+msgid "Slur &Position"
+msgstr "Lleoliad y cyrchydd"
+
+#: rc.cpp:174
+#, fuzzy, no-c-format
+msgid "Tie &Position"
+msgstr "Lleoliad y cyrchydd"
+
+#: rc.cpp:177
+#, fuzzy, no-c-format
+msgid "&Octaves"
+msgstr "Wythfed &Is"
+
+#: rc.cpp:180 rc.cpp:306
+#, no-c-format
+msgid "Ad&just"
+msgstr ""
+
+#: rc.cpp:183
+#, fuzzy, no-c-format
+msgid "R&ests"
+msgstr "&Seibiau"
+
+#: rc.cpp:186 rc.cpp:213
+#, no-c-format
+msgid "&Notes"
+msgstr "&Nodau"
+
+#: rc.cpp:189 rc.cpp:309
+#, fuzzy, no-c-format
+msgid "&Quantize"
+msgstr "Cwanteiddio"
+
+#: rc.cpp:195 rc.cpp:315
+#, no-c-format
+msgid "Trans&pose"
+msgstr "Traws&gyweirio"
+
+#: rc.cpp:198 rc.cpp:318
+#, no-c-format
+msgid "Convert"
+msgstr ""
+
+#: rc.cpp:201
+#, fuzzy, no-c-format
+msgid "&Fine Positioning"
+msgstr "Lleoliad y cyrchydd"
+
+#: rc.cpp:204
+#, fuzzy, no-c-format
+msgid "Fine Ti&ming"
+msgstr "Ychwanegu llithriad..."
+
+#: rc.cpp:207
+#, fuzzy, no-c-format
+msgid "&Visibility"
+msgstr "&Buanedd"
+
+#: rc.cpp:216
+#, no-c-format
+msgid "&Rests"
+msgstr "&Seibiau"
+
+#: rc.cpp:222
+#, no-c-format
+msgid "&Clefs"
+msgstr "&Cleffau"
+
+#: rc.cpp:225 rc.cpp:324
+#, no-c-format
+msgid "Local &Cursor"
+msgstr ""
+
+#: rc.cpp:246
+#, no-c-format
+msgid "Notes Toolbar"
+msgstr "Bar Nodau"
+
+#: rc.cpp:249
+#, no-c-format
+msgid "Rests Toolbar"
+msgstr "Bar Seibiau"
+
+#: rc.cpp:252
+#, no-c-format
+msgid "Clefs Toolbar"
+msgstr "Bar Cleffau"
+
+#: rc.cpp:255
+#, no-c-format
+msgid "Accidentals Toolbar"
+msgstr "Bar Hapnodau"
+
+#: rc.cpp:258
+#, no-c-format
+msgid "Group Toolbar"
+msgstr "Bar Casgliadau"
+
+#: rc.cpp:261
+#, no-c-format
+msgid "Marks Toolbar"
+msgstr "Bar Arwyddion"
+
+#: rc.cpp:264
+#, no-c-format
+msgid "Meta Toolbar"
+msgstr "Bar Meta"
+
+#: rc.cpp:267
+#, no-c-format
+msgid "Layout Toolbar"
+msgstr "Bar Offer &Haenlunio"
+
+#: rc.cpp:270 rc.cpp:351
+#, fuzzy, no-c-format
+msgid "Control Ruler actions"
+msgstr "Rheolydd"
+
+#: rc.cpp:273 rc.cpp:354
+#, fuzzy, no-c-format
+msgid "Property Ruler actions"
+msgstr "Rheolydd"
+
+#: rc.cpp:276
+#, fuzzy, no-c-format
+msgid "&Action"
+msgstr "Cyfeiriad"
+
+#: rc.cpp:279
+#, fuzzy, no-c-format
+msgid "General Toolbar"
+msgstr "Bar Meta"
+
+#: rc.cpp:291
+#, no-c-format
+msgid "&Grid"
+msgstr "&Rhwydell"
+
+#: rc.cpp:300
+#, fuzzy, no-c-format
+msgid "&Segment"
+msgstr "Cylch&rannau"
+
+#: rc.cpp:361
+#, no-c-format
+msgid "Hide additional controls"
+msgstr "Cuddio rheolau ychwanegol"
+
+#: rc.cpp:365
+#, no-c-format
+msgid "Panic Button"
+msgstr "Botwm Dychryn"
+
+#: rc.cpp:368
+#, no-c-format
+msgid "Resets all MIDI devices if you've got stuck notes"
+msgstr "Ail-osod pob dyfais MIDI os mae ganddoch nodau glynedig"
+
+#: rc.cpp:375
+#, no-c-format
+msgid "Provides a metronome click for you to play along with"
+msgstr "Darparu clic metronom i chi chwarae ynghyd a fo"
+
+#: rc.cpp:378
+#, no-c-format
+msgid "Shows MIDI activity in and out of Rosegarden"
+msgstr "Dangos gweithgarwch MIDI i mewn ac allan o Rosegarden"
+
+#: rc.cpp:381
+#, no-c-format
+msgid "IN"
+msgstr "I MEWN"
+
+#: rc.cpp:384
+#, no-c-format
+msgid "OUT"
+msgstr "ALLAN"
+
+#: rc.cpp:387 rc.cpp:390
+#, no-c-format
+msgid "NO EVENTS"
+msgstr "DIM DIGWYDDIADAU"
+
+#: rc.cpp:397
+#, no-c-format
+msgid "Record either MIDI or audio"
+msgstr "Recordio ai MIDI neu sain"
+
+#: rc.cpp:401
+#, no-c-format
+msgid "Loop"
+msgstr "Dolen"
+
+#: rc.cpp:404
+#, no-c-format
+msgid "Turn on and off the loop markers (if set)"
+msgstr "Dangos a cuddio'r nodwyr dolen (os ar osod)"
+
+#: rc.cpp:411
+#, no-c-format
+msgid "Mutes all but the currently selected track"
+msgstr "Distewi pob un trac ond yr yn sydd wedi'i ddewis yn gyfredol"
+
+#: rc.cpp:415
+#, no-c-format
+msgid "Start loop or range here"
+msgstr ""
+
+#: rc.cpp:419
+#, no-c-format
+msgid "End loop or range here"
+msgstr ""
+
+#: rc.cpp:422
+#, no-c-format
+msgid "SIG"
+msgstr "SIG"
+
+#: rc.cpp:425
+#, no-c-format
+msgid "DIV"
+msgstr "DIV"
+
+#: rc.cpp:428
+#, no-c-format
+msgid "/16"
+msgstr "/16"
+
+#: rc.cpp:431
+#, no-c-format
+msgid "TEMPO"
+msgstr "TEMPO"
+
+#: rc.cpp:434
+#, no-c-format
+msgid "END"
+msgstr "DIWEDD"
+
+#: rc.cpp:437
+#, no-c-format
+msgid "BAR"
+msgstr "BAR"
+
+#: rc.cpp:441
+#, fuzzy, no-c-format
+msgid "Switch between real time, musical time, and frame count"
+msgstr "Newid rhwng amser gwir, amser cerddorol, a fframiau SMPTE"
+
+#: rc.cpp:445
+#, no-c-format
+msgid "Show additional controls"
+msgstr "Dangos rheolau ychwanegol"
+
+#: rc.cpp:449
+#, no-c-format
+msgid "Rewind"
+msgstr "Ail-ddirwyn"
+
+#: rc.cpp:452
+#, no-c-format
+msgid "Moves the current pointer position back one bar."
+msgstr "Symud lle'r pwyntydd cyfredol yn ol un far."
+
+#: rc.cpp:456
+#, no-c-format
+msgid "Rewind to beginning"
+msgstr "Ail-ddirwyn i'r dechrau"
+
+#: rc.cpp:459
+#, no-c-format
+msgid ""
+"Moves the pointer position to the start of the composition. (This may mean "
+"going forwards if the pointer is currently before the start.)"
+msgstr ""
+"Symud lle y pwyntydd i ddechrau'r cyfansoddiad. (Gall hyn olygu symud "
+"ymlaen os mae'r pwyntydd cyn y dechreuad ar hyn o bryd.)"
+
+#: rc.cpp:463
+#, no-c-format
+msgid "Play/Pause"
+msgstr "Chwarae/Seibio"
+
+#: rc.cpp:466
+#, no-c-format
+msgid ""
+"Plays from the current pointer position, or pauses playback if already in "
+"progress."
+msgstr "Chwarae o le y pwyntydd cyfredol, neu seibio chwarae os ar fynd."
+
+#: rc.cpp:473
+#, no-c-format
+msgid "Stops playback or recording."
+msgstr "Aros chwarae neu recordio."
+
+#: rc.cpp:477
+#, no-c-format
+msgid "Fast forward"
+msgstr "Brys ymlaen"
+
+#: rc.cpp:480
+#, no-c-format
+msgid "Moves the current pointer position forwards one bar."
+msgstr "Symud lle y pwyntydd cyfredol ymlaen un far."
+
+#: rc.cpp:484
+#, no-c-format
+msgid "Fast forward to end"
+msgstr "Brys ymlaen i'r diwedd"
+
+#: rc.cpp:487
+#, no-c-format
+msgid ""
+"Moves the pointer position to the end of the composition. (This may mean "
+"going backwards if the pointer is already beyond the end.)"
+msgstr ""
+"Symud y pwyntydd i ddiwedd y cyfansoddiad. (Gall hyn olygu symud yn ol os "
+"mae'r pwyntydd tu hwnt i'r diwedd yn barod.)"
+
+#: rc.cpp:491
+#, no-c-format
+msgid "Display time to end"
+msgstr "Dangos amser i'r diwedd"
+
+#: ../docs/en/tips.cpp:3
+msgid ""
+"<p>To configure a track to play using a particular instrument:</p>\n"
+"&nbsp;&nbsp;* click on the track label and hold a moment<br>\n"
+"&nbsp;&nbsp;* select an output device<br>\n"
+"&nbsp;&nbsp;* select one of that device's available instruments (#1 - #16)"
+"<br>\n"
+"&nbsp;&nbsp;* adjust that instrument's output channel, program, bank, and\n"
+"controllers via the instrument parameters box\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:13
+msgid ""
+"<p>...that Rosegarden has an autosave feature?<br><br>\n"
+"You can select your autosave interval from <b>Settings->Configure\n"
+"Rosegarden</b>.<br><br>\n"
+"When something goes awry, such as a power outage or a Rosegarden crash\n"
+"(unfortunately, it happens...) simply load the file you were working on, and "
+"you'll be given the\n"
+"option to load the autosaved version, or the unmodified original.</p>\n"
+msgstr ""
+"<p>...bod Rosegarden efo nodwedd hunan-gadw?<br><br>\n"
+"Cewch ddewis eich ysbaid hunan-gadw oddiwrth <b>Gosodiadau -> Ffurfweddu\n"
+"Rosegarden</b>.<br><br>\n"
+"Pan mae rhywbeth yn mynd o'i le, fel diffyg trydan neu chwalfa Rosegarden\n"
+"(yn anffodus, mae'n digwydd...), 'sdim angen ond llwytho'r ffeil yr oeddwch "
+"yn gweithio arno\n"
+"ac mi fyddwch yn cael y dewisiad i lwytho'r fersiwn wedi'i hunan-gadw,\n"
+"neu'r ffeil gwreiddiol heb ei addasu.</p>\n"
+
+#: ../docs/en/tips.cpp:23
+msgid ""
+"<p>\n"
+"...that you can save the current document as your default studio by using\n"
+"<b>Composition -> Studio -> Save Current Document as Default Studio</b>?</"
+"p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:30
+msgid ""
+"<p>...that your default studio is a complete Rosegarden composition that "
+"gets\n"
+"loaded every time you create a new document or import a MIDI file?</p>\n"
+msgstr ""
+"<p>...bod eich stiwdio rhagosodedig yn gyfansoddiad cyfan Rosegarden "
+"composition sy'n cael\n"
+"ei lwytho bob tro yr ydych yn creu dogfen newydd neu yn mewnforio ffeil MIDI?"
+"</p>\n"
+
+#: ../docs/en/tips.cpp:36
+#, fuzzy
+msgid ""
+"<p>...that your default studio can contain instrument assignments, document "
+"properties, LilyPond headers,\n"
+"and many other things?<br><br>The default studio is a complete Rosegarden "
+"composition, so it can contain anything that you may wish to have available "
+"in each\n"
+"new document you create.</p>\n"
+msgstr ""
+"<p>Gan fod eich stiwdio rhagosodedig yn gyfansoddiad cyfan Rosegarden, mae'n "
+"gallu\n"
+"cynnwys neilltuadau offerynnau rhagosodedig, priodweddau dogfen, penodau "
+"Lilypond,\n"
+"a llawer o bethau eraill y byddwch eisiau fod ar gael o'r dechrau ym mhob\n"
+"dogfen newydd yr ydych yn ei chreu.</p>\n"
+
+#: ../docs/en/tips.cpp:43
+#, fuzzy
+msgid ""
+"<p>...that Rosegarden will detect and create a default connection for ALSA "
+"soft\n"
+"synth applications that are started after Rosegarden is already running?</"
+"p>\n"
+msgstr ""
+"<p>...bydd Rosegarden yn darganfod a chreu cysylltiad rhagosodedig am "
+"synthau-meddal ALSA\n"
+"sy'n cael eu cychwyn ar ôl i Rosegarden ei hun gychwyn?</p>\n"
+
+#: ../docs/en/tips.cpp:49
+msgid ""
+"<p>...that you can make your default studio override that in every "
+"Rosegarden composition you load?<br><br>If your studio setup does not change "
+"very often, and you would prefer for\n"
+"the settings in your default studio to take precedence over whatever\n"
+"studio is saved with any files you happen to load, you can make your studio "
+"the default for everything using <b>Settings -> Configure Rosegarden ->\n"
+"MIDI -> Always use default studio when loading files</b>.</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:57
+msgid ""
+"<p>If you have accidentally recorded a segment so short that it does not\n"
+"appear on the canvas, which you can only hear during subsequent recording\n"
+"sessions, you can gain access to it by using <b>Composition -> Change\n"
+"Composition Start and End</b> and then setting the composition to start at a "
+"negative number.</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:65
+#, fuzzy
+msgid ""
+"<p>...that if you place a note at the wrong pitch using the notation or "
+"matrix editor, you can move it one semitone at a time with the up and down "
+"arrow keys on your keyboard?</p>\n"
+msgstr ""
+"<p>...os byddwch yn gosod nodyn wrth y traw anghywir gan ddefnyddio'r "
+"golygydd nodiant, cewch ei symud un hanner-ton ar y pryd efo'r allweddau "
+"saeth i fyny ac i lawr ar eich bysellfwrdd?</p>\n"
+
+#: ../docs/en/tips.cpp:70
+msgid ""
+"<p>...that you can toggle stem directions in the notation editor by "
+"selecting\n"
+"one or more notes and using Ctrl-PageUp and Ctrl-PageDown?</p>\n"
+msgstr ""
+"<p>...y gallwch newid cyfeiriad coesau yn y golygydd nodiant gan ddewis\n"
+"un neu mwy o nodau gan ddefnyddio Ctrl-PageUp a Ctrl-PageDown?</p>\n"
+
+#: ../docs/en/tips.cpp:76
+msgid ""
+"<p>...that you can change the accidental used for a note in the notation "
+"editor (without changing the pitch of the note) by selecting\n"
+"it and using the up and down arrow keys with both Ctrl and Shift pressed?</"
+"p>\n"
+msgstr ""
+"<p>... y gallwch newid yr hapnod i'w ddefnyddio am nodyn yn y golygydd "
+"nodiant (heb newid traw y nodyn) gan ei ddewis \n"
+" a defnyddio'r allweddau saeth i fyny ac i lawr ar ôl gwasgu Ctrl a Shift "
+"efo'u gilydd?</p>\n"
+
+#: ../docs/en/tips.cpp:82 ../docs/en/tips.cpp:93
+msgid ""
+"<p>...that you can hold down the Shift key while repositioning segments on "
+"the\n"
+"segment canvas in order to avoid the \"snap-to\" effect and exert finer "
+"control?</p>\n"
+msgstr ""
+"<p>...y gallwch wasgu'r allwedd Shift i lawr wrth ail-leoli cylchrannau ar "
+"y\n"
+"cynfas cylchran er mwyn osgoi'r effaith \"cipio-i\" a cael rheolaeth fainach?"
+"</p>\n"
+
+#: ../docs/en/tips.cpp:88
+msgid ""
+"<p>...that you can use the arrow tool to draw, move, and resize segments and "
+"events as well as to select them?<br><br>Drag a segment or event block to "
+"move it, drag the right edge of a block to resize it, and drag with the "
+"middle mouse button pressed to draw a new segment or event.<br><br>(Of "
+"course, the dedicated draw, move and resize tools are still quicker for "
+"repeated operations.)</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:99
+#, fuzzy
+msgid ""
+"<p>...that you can hold down the Shift key while repositioning or resizing "
+"events in the\n"
+"matrix view in order to avoid the \"snap-to\" effect and exert finer control?"
+"</p>\n"
+msgstr ""
+"<p>...y gallwch wasgu'r allwedd Shift i lawr wrth ail-leoli cylchrannau ar "
+"y\n"
+"cynfas cylchran er mwyn osgoi'r effaith \"cipio-i\" a cael rheolaeth fainach?"
+"</p>\n"
+
+#: ../docs/en/tips.cpp:105
+msgid ""
+"<p>...that you can edit multiple segments on multiple tracks simultaneously "
+"in\n"
+"the notation editor? Simply select the segments, then use <b>Edit -> Open "
+"in Notation Editor</b>.</p>\n"
+msgstr ""
+"<p>...y gallwch olygu cylchrannau lluosol ar draciau lluosol ar yr un pryd "
+"yn\n"
+"y golygydd nodiant? 'Sdim angen ond dewis y cylchrannau, ac wedyn defnyddio "
+"<b>Golygu -> Agor yn y Golygydd Nodiad</b>.</p>\n"
+
+#: ../docs/en/tips.cpp:111
+#, fuzzy
+msgid ""
+"<p>...that Rosegarden can export files for use by LilyPond, the high-quality "
+"score typesetting system?<br><br>\n"
+"From the <b>File</b> menu, navigate to <b>Export -> Export LilyPond File</"
+"b></p>\n"
+msgstr ""
+"<p>...y gall Rosegarden allforio ffeiliau i'w cael eu defnyddio gan "
+"Lilypond, y cysawd\n"
+"ansawdd-uchel am gysodi sgoriau?\n"
+"\n"
+"O'r ddewislen <b>Ffeil</b>, ewch i <b>Allforio -> Allforio Ffeil Lilypond</"
+"b></p>\n"
+
+#: ../docs/en/tips.cpp:117
+#, fuzzy
+msgid ""
+"<p>...that Rosegarden can print via LilyPond, the high-quality score "
+"typesetting system?<br><br>\n"
+"From the <b>File</b> menu, navigate to <b>Preview with LilyPond</b>. The "
+"file\n"
+"will be exported, rendered, and a preview will appear in KPDF, or one of\n"
+"several other PDF viewers, where it can then be printed as well.</p>\n"
+msgstr ""
+"<p>...y gall Rosegarden allforio ffeiliau i'w cael eu defnyddio gan "
+"Lilypond, y cysawd\n"
+"ansawdd-uchel am gysodi sgoriau?\n"
+"\n"
+"O'r ddewislen <b>Ffeil</b>, ewch i <b>Allforio -> Allforio Ffeil Lilypond</"
+"b></p>\n"
+
+#: ../docs/en/tips.cpp:125
+#, fuzzy
+msgid ""
+"<p>...that if you use the quantizer from within the notation view, you can "
+"tell it to quantize only the timing used for notation -- making it possible "
+"to have good looking notation <b>and</b> a human MIDI performance?</p>\n"
+msgstr ""
+"<p>...os defnyddiwch y cwanteiddydd o tu mewn y golwg nodiant, gall "
+"gwanteiddio dim ond yr amseriad sy'n cael ei defnyddio am nodiad -- sy'n "
+"gwneud hi'n bosibl i gael nodiad sy'n edrych yn dda <b>a</b> perfformiad "
+"MIDI hollol ddynol?</p>\n"
+
+#: ../docs/en/tips.cpp:130
+msgid ""
+"<p>...that you can change segment labels using the controls on the Segment "
+"Parameters box\n"
+"in the main window?</p>\n"
+msgstr ""
+"<p>...y gallwch newid labeli cylchran gan ddefnyddio'r rheolaethau yn y "
+"blwch Paramedrau Cylchran\n"
+"yn y prif ffenestr?</p>\n"
+
+#: ../docs/en/tips.cpp:136
+#, fuzzy
+msgid ""
+"<p>...that the number of tracks in new documents is based on the contents "
+"of\n"
+"your autoload.rg file?\n"
+"<br><br>\n"
+"Whether you prefer to start with three tracks or 43, create a document that\n"
+"contains the desired number of tracks, plus any other studio or document "
+"properties settings\n"
+"you wish to configure, and use <b>Composition -> Studio -> Save Current "
+"Document as Default\n"
+"Studio</b> to make this your new default.</p>\n"
+msgstr ""
+"<p>...bod nifer y traciau mewn dogfennau newydd yn dibynnu ar gynnwys\n"
+"eich ffeil autoload.rg?\n"
+"\n"
+"Dim bwys os byddwch yn hoffiannu dechrau efo 3 thrac neu 43, creuwch ddogfen "
+"sy'n\n"
+"cynnwys y nifer penodol o draciau, a unrhyw gosodiadau eraill yr ydych "
+"eisiau\n"
+"eu ffurfweddu am y stiwdio neu'r ddogfen, a defnyddiwch\n"
+"<b>Stiwdio -> Cadw'r Ddogfen Gyfredol fel Stiwdio Rhagosodedig </b> er mwyn "
+"gwneud hyn eich rhagosodiad newydd.</p>\n"
+
+#: ../docs/en/tips.cpp:147
+msgid ""
+"<p>...that you can change the name of a track by double clicking on the "
+"label? (The\n"
+"label must be visible for this to work.)</p>\n"
+msgstr ""
+"<p>...y gallwch newid enw trac gan glicio dwywaith ar y label?\n"
+"(Rhaid i'r label fod yn weladwy i hyn weithio.)</p>\n"
+
+#: ../docs/en/tips.cpp:153
+#, fuzzy
+msgid ""
+"<p>...that you can configure what happens when you double-click on a segment?"
+"<br><br>Go to <b>Settings -> Configure Rosegarden</b> and choose your "
+"preferred editing window under the <b>Behaviour</b> tab.</p>\n"
+msgstr ""
+"<p>...y gallwch ffurfweddu be sy'n digwydd wrth ddwbl-glicio ar gylchran? "
+"Ewch i <b>Gosodiadau -> Ffurfweddu Rosegarden</b> a dewiswch eich ffenestr "
+"olygu ddymunol dan y tab <b>Ymddygiad</b>.</p>\n"
+
+#: ../docs/en/tips.cpp:158
+#, fuzzy
+msgid ""
+"<p>...that Rosegarden is being developed as a community effort with\n"
+"contributions from around the world?<br><br>\n"
+"The four most active developers live in London (England), Cannes, "
+"Barcelona,\n"
+"and... Christiansburg? (Christiansburg is a town of about 50,000 in\n"
+"southwestern Virginia, USA.)<br><br>\n"
+"We have had contributors from elsewhere in the US, UK, Spain, Mexico, "
+"Argentina, Germany,\n"
+"Sweden, Russia, Japan, Finland, and Italy, just to name a few...</p>\n"
+msgstr ""
+"<p>...bod Rosegarden yn cael ei ddatblygu fel ymdrech cymunedol\n"
+"efo cyfraniadau o gydol y byd?<br><br>\n"
+"Mae'r prif ddatblygwyr yn byw yn y Deynas unedig a Ffrainc, ac rydym wedi "
+"cael cyfrannwyr\n"
+"o'r UD, Sbaen, yr Almaen, Rwsia, a gwledydd eraill... </p>\n"
+
+#: ../docs/en/tips.cpp:169
+#, fuzzy
+msgid ""
+"<p>...that Rosegarden is available in Spanish, French, German, Russian, "
+"Welsh, Swedish, Italian and Estonian\n"
+"translations? (Just to name a few.)<br><br>\n"
+"If you're interested in translating Rosegarden to another language, drop us "
+"a\n"
+"line at <b>[email protected]</b>.</p>\n"
+msgstr ""
+"<p>...bod Rosegarden ar gael ynn nghyfieithiadau Sbaeneg, Ffrangeg, "
+"Almaeneg, Rwsieg, a Cymraeg?\n"
+"<br><br>\n"
+"Os oes ganddoch ddidordeb mewn cyfieithu Rosegarden i iaith arall, "
+"cysylltwch a ni wrth\n"
+"<b>[email protected]</b>.</p>\n"
+
+#: ../docs/en/tips.cpp:177
+#, fuzzy
+msgid ""
+"<p>...that you can change the total number of bars in the composition via\n"
+"<b>Composition -> Change Composition Start and End</b>?</p>\n"
+msgstr ""
+"<p>...y gallwch newid cyfanswm y bariau yn y cyfansoddiad drwy <b>Golygu -> "
+"Newid Parhad y Cyfansoddiad</b>?</p>\n"
+
+#: ../docs/en/tips.cpp:183
+msgid ""
+"<p>...that you can see the difference between performance and display "
+"duration\n"
+"of duration-quantized notes in the notation editor?<br><br>\n"
+"Use <b>Settings -> Show Raw Note Ruler</b> to turn on this handy\n"
+"feature.<br><br>\n"
+"<i>Note that this feature does not work in page layout view.</i></p>\n"
+msgstr ""
+"<p>...y gallwch weld y gwahaniaeth rhwng parhad perfformiad a parhad dangos "
+"am nodau\n"
+"sydd wedi cael cwanteiddio eu parhad yn y golygydd nodiant?<br><br>\n"
+"Defnyddiwch <b>Gosodiadau -> Dangos Rhesydd Nodau Craidd</b>\n"
+"i alluogi'r nodwedd cyfleus yma.<br><br>\n"
+"<i>Noder: nid yw'r nodwedd yma yn gweithio yn y golwg sy'n dangos haenlun y "
+"dudalen.</i></p>\n"
+
+#: ../docs/en/tips.cpp:192
+#, fuzzy
+msgid ""
+"<p>...that you can add tempo and time-signature changes by double-clicking "
+"on the values displayed in the transport window or tempo rulers?</p>\n"
+msgstr ""
+"<p>...y gallwch ychwanegu newidiadau tempo ac arwydd amseriad gan glicio "
+"dwywaith ar y gwerthoedd sy'n cael eu dangos yn y ffenestr cludiant?</p>\n"
+
+#: ../docs/en/tips.cpp:197
+#, fuzzy
+msgid ""
+"<p>...that the transport window can display musical time, sample frame "
+"count, and a visual metronome as well as real time?<br><br>Just click on the "
+"small button at the extreme top left of the window.</p>\n"
+msgstr ""
+"<p>...bod y ffenestr cludiant yn gallu dangos amser bar-a-curiad (amser "
+"cerddorol) a fframiau 24-fps SMPTE frames wrth ymyl amser go iawn? 'Sdim "
+"angen ond clicio ar y botwm bach wrth pen chwith y ffenestr.</p>\n"
+
+#: ../docs/en/tips.cpp:202
+#, fuzzy
+msgid ""
+"<p>...that you can select all notes of a particular pitch in the matrix "
+"view, by shift-clicking on that pitch on the piano keyboard at the left?"
+"<br><br>If you shift-click-drag, you can select whole ranges too.</p>\n"
+msgstr ""
+"<p>...y gallwch ddewis pob nodyn o draw penodol yn y golwg matrics, gan "
+"shift-glicio ar y traw yna ar y cyweirfwrdd piano wrth y chwith? Os byddwch "
+"yn shift-glicio a tynnu, gallwch dewis amrediadau cyfan hefyd.</p>\n"
+
+#: ../docs/en/tips.cpp:207
+#, fuzzy
+msgid ""
+"<p>...that you can set a loop in the main window by clicking-and-dragging on "
+"the time ruler with Shift pressed?<br><br>(If the ruler isn't visible, use "
+"<b>Settings -> Show Rulers</b>.)</p>\n"
+msgstr ""
+"<p>...y gallwch osod dolen yn y prif ffenestr gan glicio-a-llusgo ar y "
+"rhesydd amseriad wrth wasgu Shift? (Os nad yw'r rhesydd yn weladwy, "
+"defnyddiwch <b>Gosodiadau -> Dangos Rhesyddion</b>.)</p>\n"
+
+#: ../docs/en/tips.cpp:212
+#, fuzzy
+msgid ""
+"<p>...that if you're editing a section in the matrix or notation view, you "
+"can\n"
+"set that section to loop while you edit it?<br><br>Select it and use "
+"<b>Tools ->\n"
+"Local Cursor -> Set Loop to Selection</b>, then hit Play.</p><br><br>\n"
+"<i>This feature does not work quite as well for compositions that include "
+"sampled\n"
+"audio.</i>\n"
+msgstr ""
+"<p>...os rydych yn golygu rhan yn y golwg matrics neu nodiant, gallwch osod "
+"y rhan yna i ddolennu wrth i chi ei olygu? Dewis y rhan a defnyddiwch "
+"<b>Symud -> Gosod Dolen i Ddewisiad</b>, ac wedyn gwthio Chwarae.</p>\n"
+
+#: ../docs/en/tips.cpp:221
+msgid ""
+"<p>...if you have more than one note or controller event at the same time, "
+"you\n"
+"can use the [ and ] keys to flip the stack of events around on the "
+"controller\n"
+"and velocity rulers in order to bring the item you wish to adjust into\n"
+"focus.</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:229
+msgid ""
+"<p>...that the notation view shows you notes using their display duration, "
+"while the\n"
+"matrix allows you to edit their performance duration?<br><br>\n"
+"<i>Be careful with tied notes in the matrix. It is not apparent that they "
+"are\n"
+"tied, and if you split up a pair of tied notes, subsequent notation views "
+"will\n"
+"be confused and unhappy. This is an old bug that has been on our TODO list\n"
+"for years. Sorry about that, folks. Patches welcome.</i>\n"
+"</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:240
+msgid ""
+"<p>If you're working with a human performance and you need to insert some "
+"new\n"
+"notes, these new notes will sound for their entire written duration. To "
+"blend\n"
+"these new notes into a human performance, select them, then use <b>Adjust -> "
+"Interpret...</b> \n"
+"from the notation view to interpret any marks and massage their "
+"performance\n"
+"durations to something less mechanical.</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:249
+msgid ""
+"<p>...that Rosegarden can export certain things to LilyPond that it cannot "
+"yet\n"
+"display within its own native interface?<br><br>These new directives can be "
+"inserted\n"
+"via the <b>T</b> text insert tool in the notation view.<br><br>\n"
+"Load the example files\n"
+"<b>lilypond-alternative-endings.rg</b> and <b>lilypond-directives.rg</b> for "
+"a\n"
+"demonstration of how to use the new exportable directives.<br><br>\n"
+"Use <b>File -> Preview with\n"
+"LilyPond</b> to see what they look like on the exported page.<br><br>\n"
+"<i>Be sure to turn on\n"
+"<b>Settings -> Show LilyPond Directives</b> and <b>Show Annotations</b> "
+"within\n"
+"the notation view.</i></p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:264
+msgid ""
+"<p>...that Rosegarden has track parameters allowing you to <b>Create "
+"segments with:</b> certain\n"
+"properties by default?<br><br>You can pre-select the clef, transposition, "
+"colour, and specify\n"
+"the highest and lowest playable notes (notes outside this range display in\n"
+"red by default). Then draw a segment with the pencil, or record one, and "
+"any\n"
+"new segments created on this track will take these properties as segment\n"
+"parameters.<br><br>\n"
+"<i>These parameters do not apply to audio tracks.</i></p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:275
+msgid ""
+"<p>...that Rosegarden has a database of preset parameters describing more "
+"than 300\n"
+"musical instruments from the real world, grouped into several convenient\n"
+"categories?<br><br>Each preset contains a clef, transposition, and playable "
+"range\n"
+"suggestions for both amateur and professional players.<br><br>Click the\n"
+"<b>Load</b> button in the new track parameters box to get started! <i>(If "
+"you\n"
+"do not see a <b>Load</b> button, be sure your parameter panel is set for\n"
+"tabbed mode, rather than stacked mode.)</i> <br><br> <i>(Special thanks to "
+"Magnus\n"
+"Johansson for assembling this extraordinary database.)</i></p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:287
+msgid ""
+"<p>...that when exporting to Lilypond, you can merge tracks that have the "
+"same name onto a single staff?<br><br>For example, if there are three voices "
+"in a single part, write each\n"
+"voice as an independent segment/staff, each on a separate track. Give all\n"
+"three tracks the same name, and select <b>[x] Merge tracks that have the "
+"same\n"
+"name</b> from the options dialog that appears when you export to, or "
+"preview\n"
+"with LilyPond.<br><br>\n"
+"<i>The tracks must have a non-default name for this to work.</i></p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:297
+msgid ""
+" \t \n"
+"<p>...that you can use the mouse wheel to scroll up and down, scroll left "
+"and right, and zoom in and out?<br><br>Just roll the wheel to scroll up or "
+"down. Hold Alt as well to scroll left or right, or hold Ctrl to zoom in and "
+"out.</p> \t \n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:303
+msgid ""
+" \t \n"
+"<p>...that you can time-stretch an audio segment -- stretching or squashing "
+"a\n"
+"sample to a different duration without changing its pitch -- just by\n"
+"dragging its right edge with the Ctrl key pressed?</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:311
+msgid ""
+" \t \n"
+"<p>...that you can add audio to your Rosegarden composition just by dragging "
+"an audio file from your file manager and dropping it on the Rosegarden "
+"segment canvas? (Make sure you drop it on an audio track!)<br><br>You can "
+"also drop audio files from Rosegarden's audio file manager window onto the "
+"segment canvas, and from other programs onto the audio file manager.</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:317
+msgid ""
+" \t \n"
+"<p>...that you can set the tempo to match the duration of an audio segment "
+"if you know it's an exact number of bars or beats long?<br><br>Just select "
+"the audio segment and use <b>Composition -> Tempo and Time Signature -> Set "
+"Tempo to Audio Segment Duration</b>.</p>\n"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:1
+msgid "Feta Pixmaps"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:2 ../data/fonts/mappings/fonts.cpp:7
+#, fuzzy
+msgid "GNU Lilypond"
+msgstr "Lilypond"
+
+#: ../data/fonts/mappings/fonts.cpp:3 ../data/fonts/mappings/fonts.cpp:8
+msgid "Copyright (c) 1997--2003 Han-Wen Nienhuys and Jan Nieuwenhuizen"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:4 ../data/fonts/mappings/fonts.cpp:9
+#: ../data/fonts/mappings/fonts.cpp:14 ../data/fonts/mappings/fonts.cpp:19
+#: ../data/fonts/mappings/fonts.cpp:24 ../data/fonts/mappings/fonts.cpp:29
+#: ../data/fonts/mappings/fonts.cpp:34 ../data/fonts/mappings/fonts.cpp:39
+#: ../data/fonts/mappings/fonts.cpp:44 ../data/fonts/mappings/fonts.cpp:49
+#: ../data/fonts/mappings/fonts.cpp:54
+msgid "Chris Cannam"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:5 ../data/fonts/mappings/fonts.cpp:40
+msgid "pixmap"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:6
+msgid "Feta"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:10 ../data/fonts/mappings/fonts.cpp:15
+#: ../data/fonts/mappings/fonts.cpp:20 ../data/fonts/mappings/fonts.cpp:25
+#: ../data/fonts/mappings/fonts.cpp:30 ../data/fonts/mappings/fonts.cpp:35
+#: ../data/fonts/mappings/fonts.cpp:45 ../data/fonts/mappings/fonts.cpp:50
+#: ../data/fonts/mappings/fonts.cpp:55
+#, fuzzy
+msgid "scalable"
+msgstr "Ail-raddu"
+
+#: ../data/fonts/mappings/fonts.cpp:11
+msgid "Fughetta"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:12
+msgid ""
+"Created by Blake Hodgetts; freely redistributable. See http://www.efn.org/"
+"~bch/aboutfonts.html"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:13
+msgid "Copyright 1995-1999 Blake Hodgetts"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:16
+msgid "Inkpen"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:17
+msgid "Inkpen is part of Sibelius, but other fonts may use the same mappings."
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:18 ../data/fonts/mappings/fonts.cpp:28
+msgid "Copyright Sibelius Software Ltd"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:21
+#, fuzzy
+msgid "Maestro"
+msgstr "Metronom"
+
+#: ../data/fonts/mappings/fonts.cpp:22
+msgid "Maestro is part of Finale, but other fonts use the same mappings."
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:23 ../data/fonts/mappings/fonts.cpp:33
+#, fuzzy
+msgid "Copyright Coda Inc"
+msgstr "Hawlfraint:"
+
+#: ../data/fonts/mappings/fonts.cpp:27
+msgid "Opus is part of Sibelius, but other fonts may use the same mappings."
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:31
+msgid "Petrucci"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:32
+msgid "Petrucci is part of Finale, but other fonts use the same mappings."
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:36
+msgid "RG21"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:37
+#, fuzzy
+msgid "Rosegarden 2.1"
+msgstr "Rosegarden"
+
+#: ../data/fonts/mappings/fonts.cpp:38
+msgid "Copyright (c) 1994--2001 Chris Cannam"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:41
+#, fuzzy
+msgid "Sonata"
+msgstr "Ffont:"
+
+#: ../data/fonts/mappings/fonts.cpp:42
+#, fuzzy
+msgid "Adobe"
+msgstr "Sain"
+
+#: ../data/fonts/mappings/fonts.cpp:43
+#, fuzzy
+msgid "Copyright Adobe Inc"
+msgstr "Hawlfraint:"
+
+#: ../data/fonts/mappings/fonts.cpp:46
+msgid "Steinberg"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:47
+msgid "The Steinberg Notation font is part of Cubase."
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:48
+#, fuzzy
+msgid "Copyright Steinberg Inc"
+msgstr "Hawlfraint:"
+
+#: ../data/fonts/mappings/fonts.cpp:51
+msgid "Xinfonia"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:52
+msgid "xemo.org"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:53
+msgid "Copyright 2001-2003 Xemus Software LLC"
+msgstr ""
+
+#: ../data/styles/styles.cpp:1
+msgid "Classical"
+msgstr ""
+
+#: ../data/styles/styles.cpp:2
+#, fuzzy
+msgid "Cross"
+msgstr "Rheolydd"
+
+#: ../data/styles/styles.cpp:3
+#, fuzzy
+msgid "Mensural"
+msgstr "Cyffredinol"
+
+#: ../data/styles/styles.cpp:4
+#, fuzzy
+msgid "Triangle"
+msgstr "Tripled"
+
+#, fuzzy
+#~ msgid "Set Quick Marker"
+#~ msgstr "Dileu Arwydd"
+
+#, fuzzy
+#~ msgid "LilyPond previews not available"
+#~ msgstr "Maint ffont Lilypad"
+
+#, fuzzy
+#~ msgid "Audio file importer not available"
+#~ msgstr "<nid yw'r graddfa samplo ar gael>"
+
+#~ msgid " Triplet Chord"
+#~ msgstr "Cord Tripled"
+
+#~ msgid " Chord"
+#~ msgstr "Cord"
+
+#~ msgid " Triplet"
+#~ msgstr "Tripled"
+
+#~ msgid "Making grace notes..."
+#~ msgstr "Gwneud addurnodau..."
+
+#~ msgid "Making non-grace notes..."
+#~ msgstr "Gwneud nodau sydd ddim yn addurnodau..."
+
+#~ msgid "Marker name "
+#~ msgstr "Enw'r arwydd"
+
+#, fuzzy
+#~ msgid "Time Signature font"
+#~ msgstr "Arwydd Amseriad"
+
+#, fuzzy
+#~ msgid "&Double Speed"
+#~ msgstr "Llon &Dwbl"
+
+#, fuzzy
+#~ msgid "Halving speed..."
+#~ msgstr "Cadw ffeil..."
+
+#, fuzzy
+#~ msgid "Doubling speed..."
+#~ msgstr "Dileu'r dewisiad..."
+
+#~ msgid "Make &Grace Notes"
+#~ msgstr "Gwneud &Addurnodau"
+
+#, fuzzy
+#~ msgid "Change Te&mpo..."
+#~ msgstr "Newid Lliw'r Gylchran..."
+
+#, fuzzy
+#~ msgid "&Restore Computed Accidentals"
+#~ msgstr "&Adfer Hapnodau a Enrhifwyd"
+
+#, fuzzy
+#~ msgid "LilyPond export/preview options"
+#~ msgstr "Maint ffont Lilypad"
+
+#, fuzzy
+#~ msgid "LilyPond 2.6"
+#~ msgstr "Lilypond"
+
+#, fuzzy
+#~ msgid "LilyPond 2.8"
+#~ msgstr "Lilypond"
+
+#, fuzzy
+#~ msgid "LilyPond 2.12"
+#~ msgstr "Lilypond"
+
+#~ msgid "Export Document Properties as \\header block"
+#~ msgstr "Allforio Priodoleddau Dogfen fel \\ bloc pennawd"
+
+#, fuzzy
+#~ msgid "prime"
+#~ msgstr "Amser"
+
+#, fuzzy
+#~ msgid " and 1 octave"
+#~ msgstr "I Fyny Wythfed"
+
+#, fuzzy
+#~ msgid " and %1 octaves"
+#~ msgstr "I Fyny Wythfed"
+
+#, fuzzy
+#~ msgid "Transpose by Interval"
+#~ msgstr "Trawsgyweirio"
+
+#, fuzzy
+#~ msgid "Manage Files Associated with A&udio Segments"
+#~ msgstr "Rheoli Cylchrannau &Sain"
+
+#, fuzzy
+#~ msgid "&Add Multiple Tracks..."
+#~ msgstr "&Ychwanegu Traciau..."
+
+#, fuzzy
+#~ msgid "Split Segments at Time"
+#~ msgstr "Dangos Paramedrau &Cylchrannau"
+
+#, fuzzy
+#~ msgid "Split Segment at Time"
+#~ msgstr "Dangos Paramedrau &Cylchrannau"
+
+#, fuzzy
+#~ msgid "Add Multiple Tracks"
+#~ msgstr "Ymladd"
+
+#~ msgid "Event List"
+#~ msgstr "Rhestr Digwyddiadau"
+
+#~ msgid "External Editors"
+#~ msgstr "Golygyddion Allanol"
+
+#, fuzzy
+#~ msgid "Enable auto-save"
+#~ msgstr "Hunan-gadw"
+
+#~ msgid "Auto-save"
+#~ msgstr "Hunan-gadw"
+
+#~ msgid "Show detailed status"
+#~ msgstr "Dangos cyflwr manwl"
+
+#~ msgid "JACK command (including path as necessary)"
+#~ msgstr "Gorchymyn JACK (yn cynnwys y llwybr fel bo angen)"
+
+#, fuzzy
+#~ msgid "Event read-ahead"
+#~ msgstr "Darllen ymlaen (mewn ms)"
+
+#, fuzzy
+#~ msgid "Audio mix buffer"
+#~ msgstr "Pylydd Sain"
+
+#, fuzzy
+#~ msgid "Audio file read buffer"
+#~ msgstr "Llwybr ffeil sain:"
+
+#, fuzzy
+#~ msgid "Audio file write buffer"
+#~ msgstr "Llwybr ffeil sain:"
+
+#, fuzzy
+#~ msgid "20 msec"
+#~ msgstr "Enw:"
+
+#, fuzzy
+#~ msgid "5 sec"
+#~ msgstr "Enw:"
+
+#, fuzzy
+#~ msgid "per file"
+#~ msgstr "Agor Ffeil"
+
+#, fuzzy
+#~ msgid "Low latency"
+#~ msgstr "Hwyrni"
+
+#, fuzzy
+#~ msgid "Record and Mix"
+#~ msgstr "Recordio sain"
+
+#~ msgid "JACK transport mode"
+#~ msgstr "Modd cludiant JACK"
+
+#~ msgid "Synchronisation"
+#~ msgstr "Cysoni"
+
+#, fuzzy
+#~ msgid "%1 msec"
+#~ msgstr "%1 ms"
+
+#, fuzzy
+#~ msgid "%1 sec"
+#~ msgstr "%1 ms"
+
+#, fuzzy
+#~ msgid "%1 KB"
+#~ msgstr "%1 ms"
+
+#, fuzzy
+#~ msgid "%1 MB"
+#~ msgstr "%1 ms"
+
+#, fuzzy
+#~ msgid "Other fonts"
+#~ msgstr "Arall"
+
+#~ msgid ""
+#~ "Rosegarden can apply automatic quantization to recorded or imported MIDI "
+#~ "data for notation purposes only. This does not affect playback, and does "
+#~ "not affect editing in any of the views except notation."
+#~ msgstr ""
+#~ "Gall Rosegarden weithredu cwanteiddio awtomatig i ddata MIDI sydd wedi ei "
+#~ "recordio neu fewnforio i bwrpas nodiant yn unig. Nid yw hyn yn effeithio "
+#~ "chwarae yn ol, ac nid yw yn effeithio golygu mewn unrhyw golwg heblaw "
+#~ "nodiad."
+
+#~ msgid "Sequencer"
+#~ msgstr "Dilyniannydd"
+
+#~ msgid "Sequencer Settings"
+#~ msgstr "Gosodiadau Dilyniannydd"
+
+#, fuzzy
+#~ msgid "Range"
+#~ msgstr "Tripled"
+
+#, fuzzy
+#~ msgid "High: ---"
+#~ msgstr "Uchel"
+
+#, fuzzy
+#~ msgid " ms"
+#~ msgstr "%1 ms"
+
+#, fuzzy
+#~ msgid "&Fretboard"
+#~ msgstr "&Brys Ymlaen "
+
+#, fuzzy
+#~ msgid "Restore &Computed Positions"
+#~ msgstr "&Adfer Coesau a Gyfrifwyd"
+
+#, fuzzy
+#~ msgid "&Tempo and Time Signature"
+#~ msgstr "Agor yn y Golygydd Digwyddiadau"
+
+#, fuzzy
+#~ msgid "&Split..."
+#~ msgstr "&Hollti"
+
+#, fuzzy
+#~ msgid "&Editor Tools"
+#~ msgstr "Bar Golygyddion"
+
+#, fuzzy
+#~ msgid "&Beams"
+#~ msgstr "Curiad"
+
+#, fuzzy
+#~ msgid "&Indications"
+#~ msgstr "Dangosiad"
+
+#, fuzzy
+#~ msgid "Trip&lets and Tuplets"
+#~ msgstr "Plygyn &Syml"
+
+#~ msgid "S&tem Direction"
+#~ msgstr "Cyfeiriad y C&oes"
+
+#, fuzzy
+#~ msgid "&Clear"
+#~ msgstr "Cleff"
+
+#, fuzzy
+#~ msgid "C&ancel"
+#~ msgstr "Sianel"
+
+#, fuzzy
+#~ msgid "Toggle &Mode"
+#~ msgstr "nodyn cyfan"
+
+#, fuzzy
+#~ msgid "Scale"
+#~ msgstr "Ail-raddu"
+
+#, fuzzy
+#~ msgid "Modifier"
+#~ msgstr "Addasu A&rwydd"
+
+#, fuzzy
+#~ msgid "&New"
+#~ msgstr "Newydd"
+
+#, fuzzy
+#~ msgid "Fingering"
+#~ msgstr "Ychwanegu llithriad..."
+
+#, fuzzy
+#~ msgid "LilyPond 2.4"
+#~ msgstr "Lilypond"
+
+#~ msgid "Paper size to use in \\paper block"
+#~ msgstr "Maint papur i ddefnyddio yn y \\bloc papur"
+
+#, fuzzy
+#~ msgid "LilyPond font size"
+#~ msgstr "Maint ffont Lilypad"
+
+#~ msgid "Do not export muted tracks"
+#~ msgstr "Dim allforio traciau wedi'w distewi"
+
+#~ msgid "Write bar checks at end of measures"
+#~ msgstr "Ysgrifennu gwiriadau bar wrth ddiwedd mesurau"
+
+#, fuzzy
+#~ msgid "Double Speed"
+#~ msgstr "Llon &Dwbl"
+
+#~ msgid " (takes effect only from next restart)"
+#~ msgstr "(cymryd effaith dim ond ar ol ail-gychwyn)"
+
+#~ msgid "&Select"
+#~ msgstr "&Dewis"
+
+#~ msgid "Snap to 1/64"
+#~ msgstr "Cipio at 1/64"
+
+#, fuzzy
+#~ msgid "Snap to 1/48"
+#~ msgstr "Cipio at 1/8"
+
+#~ msgid "Snap to 1/32"
+#~ msgstr "Cipio at 1/32"
+
+#, fuzzy
+#~ msgid "Snap to 1/24"
+#~ msgstr "Cipio at 1/4"
+
+#~ msgid "Snap to 1/16"
+#~ msgstr "Cipio at 1/16"
+
+#, fuzzy
+#~ msgid "Snap to 1/12"
+#~ msgstr "Cipio at 1/2"
+
+#~ msgid "Snap to 1/8"
+#~ msgstr "Cipio at 1/8"
+
+#, fuzzy
+#~ msgid "Snap to 1/6"
+#~ msgstr "Cipio at 1/64"
+
+#~ msgid "Snap to 1/4"
+#~ msgstr "Cipio at 1/4"
+
+#~ msgid "Snap to &Unit"
+#~ msgstr "Cipio at &Uned"
+
+#, fuzzy
+#~ msgid "%1 (%2.%3s)"
+#~ msgstr "Amser: %1 (%2.%3s)"
+
+#, fuzzy
+#~ msgid "%1 (%2): %3"
+#~ msgstr "&%1%2"
+
+#~ msgid "Getting sound driver status..."
+#~ msgstr "Nol cyflwr y gyrrydd swn..."
+
+#, fuzzy
+#~ msgid "Cannot add file %1: %2"
+#~ msgstr "Methu lawrlwytho ffeil %1"
+
+#, fuzzy
+#~ msgid "Enable"
+#~ msgstr "Gwerth Diwedd"
+
+#~ msgid "from:"
+#~ msgstr "oddiwrth:"
+
+#~ msgid "to:"
+#~ msgstr "i:"
+
+#~ msgid "unlimited"
+#~ msgstr "di-derfyn"
+
+#~ msgid "Number:"
+#~ msgstr "Rhif:"
+
+#~ msgid "Value:"
+#~ msgstr "Gwerth:"
+
+#, fuzzy
+#~ msgid "Wheel Events"
+#~ msgstr "Ail-feintio Digwyddiadau"
+
+#~ msgid "Amount:"
+#~ msgstr "Maint:"
+
+#, fuzzy
+#~ msgid "Pitch from"
+#~ msgstr "Traw"
+
+#, fuzzy
+#~ msgid "Pitch to"
+#~ msgstr "Traw"
+
+#, fuzzy
+#~ msgid "High: %1"
+#~ msgstr "Uchel"
+
+#~ msgid "&Velocity"
+#~ msgstr "&Buanedd"
+
+#~ msgid "Time: %1"
+#~ msgstr "Amser: %1"
+
+#, fuzzy
+#~ msgid "Recording Channel:"
+#~ msgstr "Recordio sain"
+
+#, fuzzy
+#~ msgid "Finnish translation"
+#~ msgstr "Cysoni"
+
+#, fuzzy
+#~ msgid "Preview of the selected font"
+#~ msgstr "Clywed rhagolwg o'r ffeil sain penodol."
+
+#, fuzzy
+#~ msgid "Segment & Instrument Parameters"
+#~ msgstr "Dangos Paramedrau &Offerynnau"
+
+#, fuzzy
+#~ msgid "Pre&view Lilypond file..."
+#~ msgstr "Allforio ffeil Lilypond..."
+
+#, fuzzy
+#~ msgid "Show Se&gment and Instrument Parameters"
+#~ msgstr "Dangos Paramedrau &Offerynnau"
+
+#~ msgid "%1 Pitch"
+#~ msgstr "%1 Traw"
+
+#, fuzzy
+#~ msgid "&Split or Join"
+#~ msgstr "&Hollti ar Ddistawrwydd"
+
+#, fuzzy
+#~ msgid "Lilypond 2.0"
+#~ msgstr "Lilypond"
+
+#~ msgid "<timing has gone astray>"
+#~ msgstr "<mae'r amseriad wedi mynd yn anghywir>"
+
+#, fuzzy
+#~ msgid "You can't yet resize an audio segment!"
+#~ msgstr "Methu uno cylchrannau Sain"
+
+#~ msgid "Advanced Event Edit"
+#~ msgstr "Golygu Digwyddiad yn Fanwl"
+
+#~ msgid "Advanced Event Viewer"
+#~ msgstr "Gweld Digwyddiad yn Fanwl"
+
+#, fuzzy
+#~ msgid " 1 event selected "
+#~ msgstr "%1 digwyddiad %2 wedi'i ddewis"
+
+#, fuzzy
+#~ msgid "%1 - 1 Segment - %2"
+#~ msgstr "Parhad"
+
+#, fuzzy
+#~ msgid "1 Input"
+#~ msgstr "Mewnbwn Sain"
+
+#, fuzzy
+#~ msgid "1 Submaster"
+#~ msgstr "Dangos Rhes&yddion"
+
+#, fuzzy
+#~ msgid "1 pixel"
+#~ msgstr "%1 picsel"
+
+#, fuzzy
+#~ msgid "%1 - Segment - Notation"
+#~ msgstr "Parhad"
+
+#, fuzzy
+#~ msgid "%1 on 1 track"
+#~ msgstr "%1 o diciau"
+
+#~ msgid "Set Tempo"
+#~ msgstr "Gosod Tempo"
+
+#~ msgid "Modify Tempo"
+#~ msgstr "Addasu Tempo"
+
+#~ msgid "Change this tempo to"
+#~ msgstr "Newid y tempo yma i "
+
+#, fuzzy
+#~ msgid "is currently"
+#~ msgstr "ar hyn o bryd"
+
+#, fuzzy
+#~ msgid "PitchRuler"
+#~ msgstr "Traw:"
+
+#, fuzzy
+#~ msgid "Paste"
+#~ msgstr "Meistr MMC"
+
+#, fuzzy
+#~ msgid "&Delete"
+#~ msgstr "Di&leu"
+
+#, fuzzy
+#~ msgid "Stop"
+#~ msgstr "&Aros"
+
+#, fuzzy
+#~ msgid "Copy"
+#~ msgstr "Hawlfraint:"
+
+#, fuzzy
+#~ msgid "Default"
+#~ msgstr "Rhagosod"
+
+#, fuzzy
+#~ msgid "Delete All"
+#~ msgstr "Dewis &Popeth"
+
+#, fuzzy
+#~ msgid "Add"
+#~ msgstr "..."
+
+#, fuzzy
+#~ msgid "No"
+#~ msgstr "Nodyn"
+
+#, fuzzy
+#~ msgid "&Copy"
+#~ msgstr "&Aros"
+
+#, fuzzy
+#~ msgid "&Paste"
+#~ msgstr "&Saib"
+
+#, fuzzy
+#~ msgid "About"
+#~ msgstr "Maint:"
+
+#, fuzzy
+#~ msgid "Configure"
+#~ msgstr "Rosegarden"
+
+#, fuzzy
+#~ msgid "Untitled"
+#~ msgstr "<di-deitl>"
+
+#, fuzzy
+#~ msgid "&View"
+#~ msgstr "Amser"
+
+#, fuzzy
+#~ msgid "&Tools"
+#~ msgstr "Bar Ffontiau"
+
+#~ msgid "Tracks to add"
+#~ msgstr "Traciau i ychwanegu"
+
+#~ msgid "%1 pixels"
+#~ msgstr "%1 o bicseli"
+
+#, fuzzy
+#~ msgid "%1 Inputs"
+#~ msgstr "Mewnbwn Sain"
+
+#, fuzzy
+#~ msgid ""
+#~ "This will unload all audio files and remove their associated segments. "
+#~ "Are you sure?"
+#~ msgstr "Wir ddileu ffeil sain \"%1\" a pob cylchran sain sy'n ymwneud a fo?"
+
+#, fuzzy
+#~ msgid ""
+#~ "This will unload all audio files that have no segments used in this "
+#~ "composition. Are you sure?"
+#~ msgstr "Wir ddileu ffeil sain \"%1\" a pob cylchran sain sy'n ymwneud a fo?"
+
+#, fuzzy
+#~ msgid "Re&label"
+#~ msgstr "Ail-&labelu..."
+
+#~ msgid "Start Value"
+#~ msgstr "Gwerth Dechrau"
+
+#~ msgid "End Value"
+#~ msgstr "Gwerth Diwedd"
+
+#, fuzzy
+#~ msgid "Audio record level"
+#~ msgstr "Ychwanegu Ffeil Sain"
+
+#, fuzzy
+#~ msgid "Rec"
+#~ msgstr "Coch"
+
+#~ msgid "Segments Canvas - Create and manipulate your segments here"
+#~ msgstr "Cynfas Cylchrannau - Creu a trin eich cylchrannau yma"
+
+#, fuzzy
+#~ msgid "Default timing: "
+#~ msgstr "Rhagosod"
+
+#, fuzzy
+#~ msgid "Minutes of audio recording:"
+#~ msgstr "Munudau o recordio sain"
+
+#~ msgid "Show Tip of the &Day"
+#~ msgstr "Dangos Awgrym y &Diwrnod"
+
+#, fuzzy
+#~ msgid "&Quantize Notes"
+#~ msgstr "Dad-&glymu Nodau"
+
+#, fuzzy
+#~ msgid ""
+#~ "ERROR: Event in chord at %1 has no HEIGHT_ON_STAFF property!\n"
+#~ "This is a bug (the program would previously have crashed by now)"
+#~ msgstr ""
+#~ "Does dim priodwedd HEIGHT_ON_STAFF gan y digwyddiad yn y cord wrth %1!\n"
+#~ "Nam yw hwn (o'r blaen, buasai'r rhaglen wedi chwalu erbyn rwan)."
+
+#, fuzzy
+#~ msgid ""
+#~ "<p>...to assign a track to a new instrument, right-click on the track "
+#~ "label. You'll be presented with a menu listing the available MIDI and "
+#~ "audio devices, where you can select an instrument on one of those devices."
+#~ "</p>\n"
+#~ msgstr ""
+#~ "<p>...er mwyn neilltuo trac i offeryn newydd, cliciwch a gafael efo botwm "
+#~ "chwith y\n"
+#~ "llygoden ar label y trac. Byddwch yn cael dewislen efo rhestr o'r "
+#~ "dyfeisiau MIDI a sain\n"
+#~ "sydd ar gael, lle gallwch ddeiws offeryn ar un o'r dyfeisiau yna.</p>\n"
+
+#~ msgid ""
+#~ "<p>...that you can create a default studio by copying any<br>\n"
+#~ ".rg or .rgd file to\n"
+#~ "<b>~/.kde/share/apps/rosegarden/autoload.rg?</b><br><br>\n"
+#~ "You can also save the current document as an autoload.rg file by using\n"
+#~ "<b>Studio -> Save Current Document as Default Studio</b>.</p>\n"
+#~ msgstr ""
+#~ "<p>...y gallwch greu stiwdio rhagosodedig gan gopio unrhyw<br>\n"
+#~ "ffeil .rg or .rgd i\n"
+#~ "<b>~/.kde/share/apps/rosegarden/autoload.rg?</b><br><br>\n"
+#~ "Gallwch hefyd gadw'r ddogfen gyfredol fel ffeil autoload.rg file gan "
+#~ "ddefnyddio\n"
+#~ "<b>Stiwdio -> Cadw'r Ddogfen Gyfredol fel Stiwdio Rhagosodedig</b>.</p>\n"
+
+#~ msgid ""
+#~ "<p>...that you can toggle all the rulers, instrument parameters, and "
+#~ "several\n"
+#~ "other options simultaneously with <b>Settings -> Toggle All of the Above</"
+#~ "b>?</p>\n"
+#~ msgstr ""
+#~ "<p>...y gallwch dangos a cuddio pob un rhesydd, paramedr offeryn, a rhai "
+#~ "dewisiadau eraill\n"
+#~ "ar yr un pryd efo <b>Gosodiadau -> Dangos/Cuddio Rhain i Gyd</b>?</p>\n"
+
+#~ msgid ""
+#~ "<p>...that you can change various parameters controlling how Rosegarden\n"
+#~ "handles Lilypond export with <b>Settings -> Configure Rosegarden -> "
+#~ "Notation\n"
+#~ "-> Lilypond?</p>\n"
+#~ msgstr ""
+#~ "<p>...y gallwch newid nifer o baramedrau sy'n rheoli sut mae Rosegarden\n"
+#~ "yn trin allforio i Lilypond efo <b>Gosodiadau -> Ffurfweddu Rosegarden -> "
+#~ "Nodiant\n"
+#~ "-> Lilypond?</p>\n"
+
+#, fuzzy
+#~ msgid "Default proportion"
+#~ msgstr "Lliw Rhagosod"
+
+#~ msgid "Arm recording for this audio Instrument"
+#~ msgstr "Paratoi recordio am yr Offeryn sain yma"
+
+#~ msgid "Solo the Track to which this Instrument is attached."
+#~ msgstr "Unawdu'r Trac sydd ynghlwm a'r Offeryn yma"
+
+#~ msgid "Mute the Track to which this Instrument is attached."
+#~ msgstr "Distewi'r Trac sydd ynghlwm a'r Offeryn yma"
+
+#~ msgid "MMC transport mode"
+#~ msgstr "Modd cludiant MMC"
+
+#~ msgid "Audio record path \""
+#~ msgstr "Llwybr recordio sain \""
+
+#~ msgid ""
+#~ "Edit your audio path properties (Edit->Edit Document Properties->Audio)"
+#~ msgstr ""
+#~ "Golygu priodweddau eich llwybr sain (Golygu -> Golygu Priodweddau'r "
+#~ "Ddogfen -> Sain)"
+
+#~ msgid "Toggle &All of the Above"
+#~ msgstr "Dangos/Cuddio Rhain i &Gyd"
+
+#~ msgid "Sending MIDI panic..."
+#~ msgstr "Anfon dychryn MIDI..."
+
+#~ msgid "&Tie Equal-Pitch Notes"
+#~ msgstr "&Clymu Nodau Hafal-Draw"
+
+#~ msgid "Trans&forms"
+#~ msgstr "Traws&ffurfiau"
+
+#~ msgid "&Group"
+#~ msgstr "&Casgliad"
+
+#~ msgid "Can't determine free disk space."
+#~ msgstr "Methu penodi lle gwag ar y ddisg."
+
+#~ msgid "Couldn't extract disk space information."
+#~ msgstr "Methu alldynnu gwybodaeth am faint o le sydd ar y ddisg."
+
+#~ msgid "Audio File actions"
+#~ msgstr "Gweithrediadau Ffeil Sain"
+
+#~ msgid "Remove Audio File"
+#~ msgstr "Gwaredu Ffeil Sain"
+
+#~ msgid "Rename File"
+#~ msgstr "Ail-enwi Ffeil"
+
+#~ msgid "Add an audio file to this manager dialog."
+#~ msgstr "Ychwanegu ffeil sain i'r ymgom rheoli yma."
+
+#~ msgid "Remove an audio file from this manager dialog."
+#~ msgstr "Gwaredu ffeil sain oddiwrth yr ymgom rheoli yma."
+
+#~ msgid "Rename the currently selected audio file."
+#~ msgstr "Ail-enwi'r ffeil sain penodol."
+
+#, fuzzy
+#~ msgid ""
+#~ "Insert the current audio file in your composition, on the selected audio "
+#~ "track."
+#~ msgstr ""
+#~ "Mewnosod y ffeil sain cyfredol wrth waelod eich cyfansoddiad mewn trac "
+#~ "sain newydd."
+
+#~ msgid ""
+#~ "Remove all audio files (and any representations of them) from this dialog "
+#~ "and the composition."
+#~ msgstr ""
+#~ "Gwaredu pob ffeil sain (ac unrhyw cynrychioliad ohonynt) oddiwrth yr "
+#~ "ymgom yma a'r cyfansoddiad."
+
+#~ msgid "Export this audio file."
+#~ msgstr "Allforio'r ffeil sain yma."
+
+#~ msgid ""
+#~ "You can drag and drop .wav files here to insert them from Konqueror or "
+#~ "other KDE file browsers."
+#~ msgstr ""
+#~ "Gallwch dynnu a disgyn ffeiliau .wav yma i'w mewnosod oddiwrth Konqueror "
+#~ "neu poryddion ffeil KDE eraill."
+
+#~ msgid "Really remove all audio files and associated segments?"
+#~ msgstr "Wir waredu pob ffeil sain a cylchrannau sy'n ymwneud a nhw?"
+
+#, fuzzy
+#~ msgid "Can't add File. "
+#~ msgstr "Methu lawrlwytho ffeil %1"
+
+#~ msgid "Normalize subsequent rests"
+#~ msgstr "Normaleiddio seibiau canlynol"
+
+#~ msgid "Wheel"
+#~ msgstr "Olwyn"
+
+#, fuzzy
+#~ msgid "Number of stereo audio inputs:"
+#~ msgstr "Nifer o fewnbynnau sain JACK"
+
+#, fuzzy
+#~ msgid "S%1"
+#~ msgstr "B%1"
+
+#~ msgid "Sequencer exited"
+#~ msgstr "Terfynodd y dilyniannydd"
+
+#~ msgid "don't use an external sequencer"
+#~ msgstr "dim denbyddio dilyniannydd allanol"
+
+#~ msgid "Show Controllers Events Ruler"
+#~ msgstr "Dangos Rhesydd Enwau Cordiau"
+
+#~ msgid ""
+#~ "<p>...that when you insert audio segments into your composition, they "
+#~ "always\n"
+#~ "insert at the bottom of the track list?</p>\n"
+#~ msgstr ""
+#~ "<p>...pan yr ydych yn mewnosod cylchrannau sain i mewn i'ch cyfansoddiad, "
+#~ "mae nhw o hyd\n"
+#~ "yn cael eu mewnosod wrth waelod y rhestr traciau?</p>\n"
+
+#~ msgid ""
+#~ "<p>...that you can change the MIDI record device from the configuration "
+#~ "dialog? Go to <b>Settings -> Configure Rosegarden</b>, select the "
+#~ "Sequencer page and Recording tab, and then select the device you want "
+#~ "from the MIDI Record Device dropdown. Your selection will be remembered "
+#~ "for next time.</p>\n"
+#~ msgstr ""
+#~ "<p>...y gallwch newid y dyfais recordio MIDI oddiar yr ymgom ffurfweddu? "
+#~ "Ewch i <b>Gosodiadau -> Ffrufweddu Rosegarden</b>, dewiswch y dudalen "
+#~ "Dilyniannydda'r tab Recordio, ac wedyn dewiswch y dyfais yr ydych ei "
+#~ "eisiau oddiar y cwymplen Dyfais Recordio MIDI. Bydd eich dewisiad yn "
+#~ "cael ei gofio am y tro nesaf.</p>\n"
+
+#~ msgid "Manage MIDI &Devices..."
+#~ msgstr "Rheoli &Dyfeisiau MIDI..."
+
+#~ msgid "Manage MIDI &Banks and Programs..."
+#~ msgstr "Rheoli &Rhengau a Rhaglenni MIDI..."
+
+#~ msgid "Manage Control Parameters..."
+#~ msgstr "Ffurfweddu Paramedrau Rheoli..."
+
+#~ msgid ""
+#~ "*.mid *.midi|Standard MIDI files\n"
+#~ "*|All files"
+#~ msgstr ""
+#~ "*.mid *.midi|Ffeiliau MIDI safonol\n"
+#~ "*|Pob ffeil"
+
+#~ msgid "Rescale ratio"
+#~ msgstr "Cydrannedd ail-raddu"
+
+#~ msgid " beats in time of "
+#~ msgstr "curiadau yn yr amseriad o"
+
+#~ msgid "As percentage: "
+#~ msgstr "Fel canran:"
+
+#~ msgid "Force to %1"
+#~ msgstr "Gorfod i %1"
+
+#~ msgid "Chorus"
+#~ msgstr "Cytgan"
+
+#~ msgid "Release"
+#~ msgstr "Rhyddhad"
+
+#~ msgid "Resonance"
+#~ msgstr "Cyseiniant"
+
+#~ msgid ""
+#~ "Higher latency improves playback quality on slower systems but reduces\n"
+#~ "overall sequencer response. Modifications to these values take effect\n"
+#~ "from the next time playback or recording begins."
+#~ msgstr ""
+#~ "Mae hwyrni uwch yn gwella ansawdd chwarae ar gysodau arafach, ond mae'n "
+#~ "lleihau\n"
+#~ "ymateb cyfan y dilyniannydd. Mae addasiadau i'r gwerthoedd yma yn cymryd "
+#~ "effaith\n"
+#~ "o'r tro nesaf y mae chwarae neu recordio yn dechrau."
+
+#~ msgid "Playback (in ms)"
+#~ msgstr "Chwarae (mewn ms)"
+
+#~ msgid ""
+#~ "Sequencer command line options\n"
+#~ " (takes effect only from next restart)"
+#~ msgstr ""
+#~ "Dewisiadau llinell gorchymyn y dilyniannydd\n"
+#~ "(cymryd effaith dim ond ar ol y cychwyn nesaf)"
+
+#~ msgid "Clear down all Rosegarden sequencer processes at restart"
+#~ msgstr "Gwaredu data o bob proses dilyniannydd Rosegarden wrth ail-ddechrau"
+
+#~ msgid "MIDI Record Device"
+#~ msgstr "Dyfais recordio MIDI"
+
+#~ msgid "JACK Slave"
+#~ msgstr "Gwas Jack"
+
+#~ msgid "JACK Master"
+#~ msgstr "Meistr JACK"
+
+#~ msgid "Metronome Bar Velocity"
+#~ msgstr "Buanedd y Bar Metronôm"
+
+#~ msgid "Metronome Beat Velocity"
+#~ msgstr "Buanedd Curiad y Metronôm"
+
+#~ msgid "Modify Metronome settings"
+#~ msgstr "Newid gosodiadau'r Metronôm"
+
+#~ msgid "Insert into Composition"
+#~ msgstr "Mewnosod i mewn i'r cyfansoddiad"
+
+#~ msgid ""
+#~ "Can't add File. WAV file body invalid.\n"
+#~ "\""
+#~ msgstr ""
+#~ "Methu ychwanegu Ffeil. Mae corff y ffeil WAV yn annilys.\n"
+#~ "\""
+
+#~ msgid "Audio VU Meter"
+#~ msgstr "Mesurydd VU Sain"
+
+#~ msgid "Directory doesn't exist."
+#~ msgstr "Nid yw'r cyfeiriadur mewn bod."
+
+#~ msgid "include everything"
+#~ msgstr "cynnwys popeth "
+
+#~ msgid "zero the controls"
+#~ msgstr "rhoi'r rheolyddion yn ôl i sero"
+
+#~ msgid "Copy a Control Parameter"
+#~ msgstr "Copïo Paramedr Rheoli"
+
+#~ msgid "Paste a Control Parameter"
+#~ msgstr "Gludo Paramedr Rheoli"
+
+#~ msgid "Blue"
+#~ msgstr "Glas"
+
+#~ msgid "Absolute Time:"
+#~ msgstr "Amser Llwyr:"
+
+#~ msgid "Got grouped event outside of a segment"
+#~ msgstr "Wedi cael digwyddiad cynnulledig tu allan o gylchran"
+
+#~ msgid "Got group outside of a segment"
+#~ msgstr "Wedi cael cynulliad tu allan o gylchran"
+
+#~ msgid "Found Studio in another section"
+#~ msgstr "Wedi canfod Stiwdio mewn rhan arall"
+
+#~ msgid "TimeSignature object found outside Composition"
+#~ msgstr "Wedi canfod gwrthrych ArwyddAmseriad tu allan i'r Cyfansoddiad"
+
+#~ msgid "Found Composition in another section"
+#~ msgstr "Wedi canfod Cyfansoddiad mewn rhan arall"
+
+#~ msgid "Track object found outside Composition"
+#~ msgstr "Wedi canfod gwrthrych Trac tu allan o'r Cyfansoddiad"
+
+#~ msgid "Found Segment in another section"
+#~ msgstr "Wedi canfod Cylchran mewn rhan arall"
+
+#~ msgid "Audio object found outside Audio section"
+#~ msgstr "Wedi canfod gwrthrych Sain tu allan o'r rhan Sain"
+
+#~ msgid "Audio object has empty parameters"
+#~ msgstr "Mae paramedrau gwag gan y gwrthrych Sain"
+
+#~ msgid "Audiopath object found outside AudioFiles section"
+#~ msgstr "Wedi canfod gwrthrych LlwybrSain tu allan o'r rhan FfeiliauSain"
+
+#~ msgid "Audiopath has no value"
+#~ msgstr "Nid oes gwerth gan LwybrSain"
+
+#~ msgid "found audio begin index in non audio segment"
+#~ msgstr "wedi canfod mynegai dechrau sain mewn cylchran di-sain"
+
+#~ msgid "found audio end index in non audio segment"
+#~ msgstr "wedi canfod mynegai diwedd sain mewn cylchran di-sain"
+
+#~ msgid "audio end index before audio start marker"
+#~ msgstr "mynegai diwedd sain cyn nodydd dechrau sain"
+
+#~ msgid "Found Device outside Studio"
+#~ msgstr "Wedi canfod Dyfais tu allan o Stiwdio"
+
+#~ msgid "No ID on Device tag"
+#~ msgstr "Dim ID ar dag y Dyfais"
+
+#~ msgid "Found unknown Device type"
+#~ msgstr "Wedi canfod math anhysbys o Ddyfais"
+
+#~ msgid "Found Bank outside Studio or Instrument"
+#~ msgstr "Wedi canfod Rheng tu allan o Stiwdio neu Offeryn"
+
+#~ msgid "Found Program outside Studio and Instrument"
+#~ msgstr "Wedi canfod Rhaglen tu allan o Stiwdio ac Offeryn"
+
+#, fuzzy
+#~ msgid "Found ControlParameter outside Studio"
+#~ msgstr "Wedi canfod Offeryn tu allan o Stiwdio"
+
+#~ msgid "Found Reverb outside Instrument"
+#~ msgstr "Wedi canfod Datsain tu allan o Offeryn"
+
+#~ msgid "Found Chorus outside Instrument"
+#~ msgstr "Wedi canfod Cytgan tu allan o Offeryn"
+
+#~ msgid "Found Filter outside Instrument"
+#~ msgstr "Wedi canfod Hidl tu allan o Offeryn"
+
+#~ msgid "Found Resonance outside Instrument"
+#~ msgstr "Wedi canfod Cyseiniant tu allan o Offeryn"
+
+#~ msgid "Found Attack outside Instrument"
+#~ msgstr "Wedi canfod Ymladd tu allan o Offeryn"
+
+#~ msgid "Found Release outside Instrument"
+#~ msgstr "Wedi canfod Rhyddhad tu allan o Offeryn"
+
+#~ msgid "Found Pan outside Instrument"
+#~ msgstr "Wedi canfod Panio tu allan o Offeryn"
+
+#~ msgid "Found Volume outside Instrument"
+#~ msgstr "Wedi canfod Swn tu allan o Offeryn"
+
+#~ msgid "Found Plugin outside Instrument"
+#~ msgstr "Wedi canfod Ategyn tu allan o Offeryn"
+
+#~ msgid "Can't find Plugin"
+#~ msgstr "Methu canfod Ategyn"
+
+#~ msgid "Found Port outside Plugin"
+#~ msgstr "Wedi canfod Porth tu allan o Ategyn"
+
+#~ msgid "Found Metronome outside Studio"
+#~ msgstr "Wedi canfod Metronom tu allan o Stiwdio"
+
+#~ msgid "Found Instrument outside Studio"
+#~ msgstr "Wedi canfod Offeryn tu allan o Stiwdio"
+
+#~ msgid "Found AudioFiles inside another section"
+#~ msgstr "Wedi canfod FfeiliauSain tu mewn i ran arall"
+
+#~ msgid "Found Metadata outside Composition"
+#~ msgstr "Wedi canfod Metadata tu allan o Gyfansoddiad"
+
+#~ msgid "Found recordLevel outside Instrument"
+#~ msgstr "Wedi canfod SafonRecordio tu allan o Offeryn"
+
+#~ msgid "Found audioInput outside Instrument"
+#~ msgstr "Wedi canfod MewnbwnSain tu allan o Offeryn"
+
+#, fuzzy
+#~ msgid "Found colourmap outside Appearance"
+#~ msgstr "Wedi canfod Swn tu allan o Offeryn"
+
+#, fuzzy
+#~ msgid "Found colourpair outside ColourMap"
+#~ msgstr "Wedi canfod Porth tu allan o Ategyn"
+
+#, fuzzy
+#~ msgid "note-height is a required attribute of font-size"
+#~ msgstr "priodoledd angenrheidiol o pryd yw uchder y nodyn"
+
+#, fuzzy
+#~ msgid "font-height is a required attribute of font-scale"
+#~ msgstr "priodoledd angenrheidiol o pryd yw uchder y nodyn"
+
+#, fuzzy
+#~ msgid "base is a required attribute of codebase"
+#~ msgstr "priodoledd angenrheidiol o nodyn yw math"
+
+#, fuzzy
+#~ msgid "font-id is a required attribute of codebase"
+#~ msgstr "priodoledd angenrheidiol o nodyn yw math"
+
+#~ msgid "name is a required attribute of symbol"
+#~ msgstr "priodoledd angenrheidiol o symbol yw enw"
+
+#~ msgid "name is a required attribute of hotspot"
+#~ msgstr "priodoledd angenrheidiol o man-poeth yw enw"
+
+#, fuzzy
+#~ msgid "scaled-element must be in hotspot-element"
+#~ msgstr "rhaid i'r elfen-pryd fod yn yr elfen-manpoeth"
+
+#, fuzzy
+#~ msgid "y is a required attribute of scaled"
+#~ msgstr "priodoledd angenrheidiol o pryd yw y"
+
+#~ msgid "when-element must be in hotspot-element"
+#~ msgstr "rhaid i'r elfen-pryd fod yn yr elfen-manpoeth"
+
+#~ msgid "note-height is a required attribute of when"
+#~ msgstr "priodoledd angenrheidiol o pryd yw uchder y nodyn"
+
+#~ msgid "y is a required attribute of when"
+#~ msgstr "priodoledd angenrheidiol o pryd yw y"
+
+#, fuzzy
+#~ msgid "font-id is a required attribute of font-requirement"
+#~ msgstr "priodoledd angenrheidiol o nodyn yw math"
+
+#, fuzzy
+#~ msgid "font-requirement may have name or names attribute, but not both"
+#~ msgstr ""
+#~ "gall elfennau eang a nodyn gael priodoledd siap neu nod-enw, ond dim y dau"
+
+#, fuzzy
+#~ msgid "InstrumentLabel"
+#~ msgstr "Offeryn"
+
+#, fuzzy
+#~ msgid "MatrixView"
+#~ msgstr "Matrics"
+
+#, fuzzy
+#~ msgid "RosegardenGUIView"
+#~ msgstr "Rosegarden"
+
+#, fuzzy
+#~ msgid "RosegardenTristateCheckBox"
+#~ msgstr "Cludiant Rosegarden"
+
+#, fuzzy
+#~ msgid "RosegardenComboBox"
+#~ msgstr "Rosegarden"
+
+#, fuzzy
+#~ msgid "RosegardenLabel"
+#~ msgstr "Rosegarden"
+
+#, fuzzy
+#~ msgid "RosegardenSpinBox"
+#~ msgstr "Rosegarden"
+
+#, fuzzy
+#~ msgid "RosegardenParameterBox"
+#~ msgstr "Paramedrau Cylchrannau"
+
+#, fuzzy
+#~ msgid "RosegardenProgressBar"
+#~ msgstr "Rosegarden"
+
+#, fuzzy
+#~ msgid "RosegardenFader"
+#~ msgstr "Rosegarden"
+
+#, fuzzy
+#~ msgid "RosegardenRotary"
+#~ msgstr "Rosegarden"
+
+#, fuzzy
+#~ msgid "RosegardenQuantizeParameters"
+#~ msgstr "Paramedrau Cylchrannau"
+
+#, fuzzy
+#~ msgid "RosegardenPitchChooser"
+#~ msgstr "Rosegarden"
+
+#, fuzzy
+#~ msgid "RemapInstrumentDialog"
+#~ msgstr "&Ail-fapio Offerynnau..."
+
+#, fuzzy
+#~ msgid "PropertyBox"
+#~ msgstr "Gosod &Priodwedd"
+
+#, fuzzy
+#~ msgid "TimeSignatureDialog"
+#~ msgstr "Arwydd Amseriad"
+
+#, fuzzy
+#~ msgid "KeySignatureDialog"
+#~ msgstr "Arwydd cywair"
+
+#, fuzzy
+#~ msgid "TupletDialog"
+#~ msgstr "Plygyn"
+
+#, fuzzy
+#~ msgid "TempoDialog"
+#~ msgstr "Tempo"
+
+#, fuzzy
+#~ msgid "QuantizeDialog"
+#~ msgstr "Cwanteiddio"
+
+#, fuzzy
+#~ msgid "RescaleDialog"
+#~ msgstr "Ail-raddu"
+
+#, fuzzy
+#~ msgid "AudioPlayingDialog"
+#~ msgstr "Ategyn Sain"
+
+#, fuzzy
+#~ msgid "AudioSplitDialog"
+#~ msgstr "Gosodiadau Sain"
+
+#, fuzzy
+#~ msgid "LyricEditDialog"
+#~ msgstr "Agor Golygydd G&eiriau"
+
+#, fuzzy
+#~ msgid "EventParameterDialog"
+#~ msgstr "Paramedrau Cylchrannau"
+
+#, fuzzy
+#~ msgid "CompositionLengthDialog"
+#~ msgstr "Newid Hyd y Cyfansoddiad"
+
+#, fuzzy
+#~ msgid "SplitByPitchDialog"
+#~ msgstr "Hollti gan Draw"
+
+#, fuzzy
+#~ msgid "InterpretDialog"
+#~ msgstr "Dehongli"
+
+#, fuzzy
+#~ msgid "ShowSequencerStatusDialog"
+#~ msgstr "Cyflwr y dilyniannydd"
+
+#, fuzzy
+#~ msgid "RawNoteRuler"
+#~ msgstr "Dangos Rhesydd Nodau C&raidd"
+
+#, fuzzy
+#~ msgid "MatrixPainter"
+#~ msgstr "Matrics"
+
+#, fuzzy
+#~ msgid "EventFilterDialog"
+#~ msgstr "Hidlau digwyddiadau"
+
+#, fuzzy
+#~ msgid "TempoRuler"
+#~ msgstr "Dangos Rhesydd Te&mpo"
+
+#, fuzzy
+#~ msgid "NotationCanvasView"
+#~ msgstr "Nodiad"
+
+#, fuzzy
+#~ msgid "Rosegarden::ConfigurationPage"
+#~ msgstr "Ffurfweddiad Cyffredinol"
+
+#, fuzzy
+#~ msgid "Rosegarden::GeneralConfigurationPage"
+#~ msgstr "Ffurfweddiad Cyffredinol"
+
+#, fuzzy
+#~ msgid "Rosegarden::AudioConfigurationPage"
+#~ msgstr "Rheolydd Ffeiliau Sain Rosegarden"
+
+#, fuzzy
+#~ msgid "Rosegarden::AudioPluginDialog"
+#~ msgstr "Rheolydd Ffeiliau Sain Rosegarden"
+
+#, fuzzy
+#~ msgid "MatrixParameterBox"
+#~ msgstr "Paramedrau Rhwydell"
+
+#, fuzzy
+#~ msgid "TrackButtons"
+#~ msgstr "Botwm Dychryn"
+
+#, fuzzy
+#~ msgid "AudioFaderWidget"
+#~ msgstr "Pylydd Sain"
+
+#, fuzzy
+#~ msgid "SegmentTool"
+#~ msgstr "Cylch&rannau"
+
+#, fuzzy
+#~ msgid "SegmentPencil"
+#~ msgstr "Cylch&rannau"
+
+#, fuzzy
+#~ msgid "SegmentMover"
+#~ msgstr "Cylch&rannau"
+
+#, fuzzy
+#~ msgid "SegmentResizer"
+#~ msgstr "Cylch&rannau"
+
+#, fuzzy
+#~ msgid "SegmentSelector"
+#~ msgstr "Paramedrau Cylchrannau"
+
+#, fuzzy
+#~ msgid "SegmentJoiner"
+#~ msgstr "Cylch&rannau"
+
+#, fuzzy
+#~ msgid "Rosegarden::AudioManagerDialog"
+#~ msgstr "Rheolydd Ffeiliau Sain Rosegarden"
+
+#, fuzzy
+#~ msgid "SegmentCanvas"
+#~ msgstr "Cylchrannau"
+
+#, fuzzy
+#~ msgid "TextRuler"
+#~ msgstr "Testun"
+
+#, fuzzy
+#~ msgid "RosegardenGUIApp"
+#~ msgstr "Rosegarden"
+
+#, fuzzy
+#~ msgid "InstrumentParameterPanel"
+#~ msgstr "Paramedrau Offerynnau"
+
+#, fuzzy
+#~ msgid "AudioInstrumentParameterPanel"
+#~ msgstr "Paramedrau Offerynnau"
+
+#, fuzzy
+#~ msgid "MIDIInstrumentParameterPanel"
+#~ msgstr "Paramedrau Offerynnau"
+
+#, fuzzy
+#~ msgid "RosegardenColourTable"
+#~ msgstr "Rosegarden"
+
+#, fuzzy
+#~ msgid "RosegardenGUIDoc"
+#~ msgstr "Rosegarden"
+
+#, fuzzy
+#~ msgid "EventView"
+#~ msgstr "Hidlau digwyddiadau"
+
+#, fuzzy
+#~ msgid "TrackLabel"
+#~ msgstr "Dangos &Labeli Trac"
+
+#, fuzzy
+#~ msgid "ScrollBox"
+#~ msgstr "Unawd"
+
+#, fuzzy
+#~ msgid "RosegardenCanvasView"
+#~ msgstr "Rosegarden"
+
+#, fuzzy
+#~ msgid "Rosegarden::DiskSpace"
+#~ msgstr "Rosegarden"
+
+#, fuzzy
+#~ msgid "NoteInserter"
+#~ msgstr "Mewnosod Nodyn"
+
+#, fuzzy
+#~ msgid "RestInserter"
+#~ msgstr "Mewnosod Nodyn"
+
+#, fuzzy
+#~ msgid "NotationEraser"
+#~ msgstr "Nodiad"
+
+#, fuzzy
+#~ msgid "BarButtons"
+#~ msgstr "Botwm Dychryn"
+
+#, fuzzy
+#~ msgid "Rosegarden::RosegardenTransportDialog"
+#~ msgstr "Cludiant Rosegarden"
+
+#, fuzzy
+#~ msgid "ChordNameRuler"
+#~ msgstr "Dangos Rhesydd Enwau C&ordiau"
+
+#, fuzzy
+#~ msgid "LoopRuler"
+#~ msgstr "Dolen"
+
+#~ msgid "Programs 65 - 128"
+#~ msgstr "Rhaglenni 65 - 128"
+
+#~ msgid "Copy Programs"
+#~ msgstr "Copio Rhaglenni"
+
+#~ msgid "Paste Programs"
+#~ msgstr "Gludo Rhaglenni"
+
+#~ msgid "View Event"
+#~ msgstr "Gweld Digwyddiad"
+
+#~ msgid "Connection: %1"
+#~ msgstr "Cysylltiad: %1"
+
+#~ msgid "De-&Counterpoint"
+#~ msgstr "Dat-&wrthbwyntio"
+
+#~ msgid "note-height not found"
+#~ msgstr "methu canfod uchder y nodyn"
+
+#~ msgid ""
+#~ "src is a required attribute of symbol (until real font support is "
+#~ "implemented)"
+#~ msgstr ""
+#~ "priodoledd angenrheidiol o symbol yw src (tan gweithredir cynnal go iawn "
+#~ "i ffontiau)"
+
+#~ msgid "No note font names available, aborting"
+#~ msgstr "Dim enwau ffontiau ar gael, terfynu"
+
+#~ msgid "Summary"
+#~ msgstr "Crynodeb"
+
+#~ msgid ""
+#~ "This file contains tempo and/or time signature data.\n"
+#~ "\n"
+#~ "If you wish, I can append it to the composition instead\n"
+#~ "of merging it from the start, so as to avoid changing\n"
+#~ "the existing timing information in the composition."
+#~ msgstr ""
+#~ "Mae'r ffeil yma yn cynnwys data tempo a/neu arwydd amseriad.\n"
+#~ "\n"
+#~ "Os hoffech chi, gallaf ei hatodi i'r cyfansoddiad yn lle ei chyfuno\n"
+#~ "o'r dechrau, er mwyn osgoi newid y wybodaeth amseriad sydd\n"
+#~ "yn y cyfansoddiad yn barod."
+
+#~ msgid "Yes, append"
+#~ msgstr "Ie, atodi"
+
+#~ msgid "No, merge as normal"
+#~ msgstr "Nage, cyfuno fel arfer"
+
+#~ msgid "Playback failed to contact Rosegarden sequencer"
+#~ msgstr "Methodd y chwarae gysylltu efo'r dilyniannydd Rosegarden"
+
+#~ msgid "Failed to start playback"
+#~ msgstr "Methu dechrau chwarae"
+
+#~ msgid "Failed to contact Rosegarden sequencer"
+#~ msgstr "Methu cysylltu a'r dilyniannydd Rosegarden"
+
+#~ msgid ""
+#~ "Couldn't start recording audio. Ensure your audio record path is valid\n"
+#~ "in Document Properties (Edit->Edit Document Properties->Audio)"
+#~ msgstr ""
+#~ "Methu dechrau recordio sain. Sicrhewch fod eich llwybr sain yn ddilys\n"
+#~ "ym Mhriodweddau Sain(Golygu -> Golygu Priodweddau'r Ddogfen -> Sain)"
+
+#~ msgid "MIDI and Audio subsystems have failed to initialise"
+#~ msgstr "Mae'r is-gysodau MIDI a Sain wedi methu ymgychwyn"
+
+#~ msgid "MIDI subsystem has failed to initialise"
+#~ msgstr "Mae'r is-gysawd MIDI wedi methu ymgychwyn"
+
+#~ msgid "<p>No more tips...</p>\n"
+#~ msgstr "<p>Dim mwy o awgrymiadau</p>\n"
diff --git a/po/de.po b/po/de.po
new file mode 100644
index 0000000..911e4f6
--- /dev/null
+++ b/po/de.po
@@ -0,0 +1,12067 @@
+# translation of de.po to Deutsch
+# This file is distributed under the same license as the PACKAGE package.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER.
+#
+# Jörg Schumann <[email protected]>, 2003.
+# Eckhard Jokisch <[email protected]>, 2005.
+# Michael Gerdau <[email protected]>, 2006.
+# Emanuel Rumpf <em-rumpf _at_ gmx.de>, 2008-04-28.
+msgid ""
+msgstr ""
+"Project-Id-Version: de\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-04-24 18:19-0400\n"
+"PO-Revision-Date: 2008-04-28 22:25+0200\n"
+"Last-Translator: Emanuel Rumpf\n"
+"Language-Team: Deutsch <[email protected]>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.4\n"
+
+#: ../src/gui/dialogs/RescaleDialog.cpp:51 rc.cpp:192 rc.cpp:312
+#, no-c-format
+msgid "Rescale"
+msgstr "Skaliere new"
+
+#: ../src/gui/dialogs/RescaleDialog.cpp:56
+msgid "Duration of selection"
+msgstr "Dauer der Selektion"
+
+#: ../src/gui/dialogs/RescaleDialog.cpp:62
+msgid "Adjust times of following events accordingly"
+msgstr "Passe Zeiten der nachfolgenden Events entsprechend an"
+
+#: ../src/gui/dialogs/PitchDialog.cpp:45
+#: ../src/gui/dialogs/RescaleDialog.cpp:72
+#: ../src/gui/dialogs/TimeDialog.cpp:51 ../src/gui/dialogs/TimeDialog.cpp:68
+#: ../src/gui/studio/BankEditorDialog.cpp:109
+msgid "Reset"
+msgstr "Reset"
+
+#: ../src/commands/segment/SegmentSplitByPitchCommand.cpp:46
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:46
+msgid "Split by Pitch"
+msgstr "Nach Tonhöhe aufteilen"
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:54
+msgid "Starting split pitch"
+msgstr "Beginn der Tonhöhenaufteilung"
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:57
+msgid "Range up and down to follow music"
+msgstr ""
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:63
+msgid "Duplicate non-note events"
+msgstr "Doppelte nicht-Noten-Events"
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:66
+msgid "Clef handling:"
+msgstr "Schlüsselbehandlung:"
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:69
+msgid "Leave clefs alone"
+msgstr "Schlüssel nicht verändern"
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:70
+msgid "Guess new clefs"
+msgstr "Neue Schlüssel raten"
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:71
+msgid "Use treble and bass clefs"
+msgstr "Bass- und Violinschlüssel verwenden"
+
+#: ../src/gui/dialogs/DocumentConfigureDialog.cpp:64
+msgid "Document Properties"
+msgstr "Dokumenteigenschaften"
+
+#: ../src/gui/dialogs/MakeOrnamentDialog.cpp:45
+#: ../src/gui/editors/notation/NotationView.cpp:6048
+msgid "Make Ornament"
+msgstr "Verzierung hinzufügen"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:183
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:179
+#: ../src/gui/dialogs/EventEditDialog.cpp:128
+#: ../src/gui/dialogs/MakeOrnamentDialog.cpp:49
+#: ../src/gui/studio/DeviceEditorDialog.cpp:74
+#: ../src/gui/studio/NameSetEditor.cpp:72
+#: ../src/gui/widgets/ColourTable.cpp:51
+msgid "Name"
+msgstr "Name"
+
+#: ../src/gui/dialogs/MakeOrnamentDialog.cpp:51
+msgid ""
+"The name is used to identify both the ornament\n"
+"and the triggered segment that stores\n"
+"the ornament's notes."
+msgstr ""
+"Der Name dient sowohl der Identifikation der Verzierung, als auch\n"
+"des getriggerten Segments, das die Noten der verzierung enthält."
+
+#: ../src/gui/dialogs/MakeOrnamentDialog.cpp:54
+msgid "Name: "
+msgstr "Name: "
+
+#: ../src/gui/dialogs/MakeOrnamentDialog.cpp:57
+#: ../src/gui/editors/eventlist/EventView.cpp:717
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:92
+msgid "Base pitch"
+msgstr "Basistonhöhe"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:57
+#: ../src/gui/editors/eventlist/EventView.cpp:140
+msgid "Text"
+msgstr "text"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:66
+msgid "Specification"
+msgstr "Spezifikation"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:68
+msgid "Preview"
+msgstr "Vorschau"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:72
+msgid "Text: "
+msgstr "text: "
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:79
+msgid "Style: "
+msgstr "Stil: "
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:90
+msgid "Dynamic"
+msgstr "Dynamik"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:93
+msgid "Direction"
+msgstr "Richtung"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:96
+msgid "Local Direction"
+msgstr "Lokale Richtung"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:63
+#: ../src/gui/dialogs/TextEventDialog.cpp:99
+#: ../src/gui/editors/tempo/TempoView.cpp:91
+msgid "Tempo"
+msgstr "Tempo"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:102
+msgid "Local Tempo"
+msgstr "Lokales Tempo"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:105
+msgid "Lyric"
+msgstr "Text"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:108
+#: ../src/gui/editors/notation/NotationView.cpp:4242
+msgid "Chord"
+msgstr "Akkord"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:111
+msgid "Annotation"
+msgstr "Anmerkung"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:114
+msgid "LilyPond Directive"
+msgstr "LilyPond-Anweisung"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:138
+msgid "Verse: "
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:148
+msgid "Dynamic: "
+msgstr "Dynamik:"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:152
+msgid "ppp"
+msgstr "ppp"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:153
+msgid "pp"
+msgstr "pp"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:154
+msgid "p"
+msgstr "p"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:155
+msgid "mp"
+msgstr "mp"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:156
+msgid "mf"
+msgstr "mf"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:157
+msgid "f"
+msgstr "f"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:158
+msgid "ff"
+msgstr "ff"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:159
+msgid "fff"
+msgstr "fff"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:160
+msgid "rfz"
+msgstr "rfz"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:161
+msgid "sf"
+msgstr "sf"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:165
+msgid "Direction: "
+msgstr "Richtung:"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:174
+msgid " ,"
+msgstr ","
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:175
+msgid "D.C. al Fine"
+msgstr "D.C. al Fine"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:176
+msgid "D.S. al Fine"
+msgstr "D.S. al Fine"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:177
+msgid "Fine"
+msgstr "Fine"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:178
+msgid "D.S. al Coda"
+msgstr "D.S. al Coda"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:179
+msgid "to Coda"
+msgstr "zur Coda"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:180
+msgid "Coda"
+msgstr "Coda"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:184
+msgid "Local Direction: "
+msgstr "Lokale Richtung:"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:188
+msgid "accel."
+msgstr "accel."
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:189
+msgid "ritard."
+msgstr "ritard."
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:190
+msgid "ralletando"
+msgstr "ralletando"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:191
+msgid "a tempo"
+msgstr "a tempo"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:192
+msgid "legato"
+msgstr "legato"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:193
+msgid "simile"
+msgstr "simile"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:194
+msgid "pizz."
+msgstr "pizz."
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:195
+msgid "arco"
+msgstr "arco"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:196
+msgid "non vib."
+msgstr "non vib."
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:197
+msgid "sul pont."
+msgstr "sul pont."
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:198
+#: ../src/gui/dialogs/TextEventDialog.cpp:200
+msgid "sul tasto"
+msgstr "sul tasto"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:199
+msgid "con legno"
+msgstr "con legno"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:201
+msgid "sul G"
+msgstr "sul G"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:202
+msgid "ordinario"
+msgstr "ordinario"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:203
+msgid "Muta in "
+msgstr "Muta in "
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:204
+msgid "volti subito "
+msgstr "volti subito "
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:205
+msgid "soli"
+msgstr "soli"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:206
+msgid "div."
+msgstr "div."
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:210
+msgid "Tempo: "
+msgstr "Tempo: "
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:214
+#: ../src/gui/dialogs/TextEventDialog.cpp:238
+msgid "Grave"
+msgstr "Grave"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:215
+#: ../src/gui/dialogs/TextEventDialog.cpp:239
+msgid "Adagio"
+msgstr "Adagio"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:216
+#: ../src/gui/dialogs/TextEventDialog.cpp:240
+msgid "Largo"
+msgstr "Largo"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:217
+#: ../src/gui/dialogs/TextEventDialog.cpp:241
+msgid "Lento"
+msgstr "Lento"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:218
+#: ../src/gui/dialogs/TextEventDialog.cpp:242
+msgid "Andante"
+msgstr "Andante"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:219
+#: ../src/gui/dialogs/TextEventDialog.cpp:243
+msgid "Moderato"
+msgstr "Moderato"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:220
+#: ../src/gui/dialogs/TextEventDialog.cpp:244
+msgid "Allegretto"
+msgstr "Allegretto"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:221
+#: ../src/gui/dialogs/TextEventDialog.cpp:245
+msgid "Allegro"
+msgstr "Allegro"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:222
+#: ../src/gui/dialogs/TextEventDialog.cpp:246
+msgid "Vivace"
+msgstr "Vivace"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:223
+#: ../src/gui/dialogs/TextEventDialog.cpp:247
+msgid "Presto"
+msgstr "Presto"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:224
+#: ../src/gui/dialogs/TextEventDialog.cpp:248
+msgid "Prestissimo"
+msgstr "Prestissimo"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:225
+#: ../src/gui/dialogs/TextEventDialog.cpp:249
+msgid "Maestoso"
+msgstr "Maestoso"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:226
+#: ../src/gui/dialogs/TextEventDialog.cpp:250
+msgid "Sostenuto"
+msgstr "Sostenuto"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:227
+#: ../src/gui/dialogs/TextEventDialog.cpp:251
+msgid "Tempo Primo"
+msgstr "Tempo Primo"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:234
+msgid "Local Tempo: "
+msgstr "Lokales Tempo: "
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:255
+msgid "Directive: "
+msgstr "Anweisung:"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:312
+msgid "Example"
+msgstr "Beispiel"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:65
+msgid "Event Filter"
+msgstr "Eventfilter"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:86
+msgid "Note Events"
+msgstr "Noten Events"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:90
+msgid "lowest:"
+msgstr ""
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:93
+msgid "highest:"
+msgstr ""
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:96
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:141
+#: ../src/gui/widgets/PitchChooser.cpp:53
+msgid "Pitch:"
+msgstr "Tonhöhe:"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:99
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:163
+msgid "Velocity:"
+msgstr "Anschlagstärke:"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:102
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:129
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:257
+msgid "Duration:"
+msgstr "Dauer:Dauer:"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:107
+#: ../src/gui/dialogs/EventFilterDialog.cpp:114
+#: ../src/gui/dialogs/EventFilterDialog.cpp:121
+msgid "include"
+msgstr "einschließen"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:108
+#: ../src/gui/dialogs/EventFilterDialog.cpp:115
+#: ../src/gui/dialogs/EventFilterDialog.cpp:122
+msgid "exclude"
+msgstr "ausschließen"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:136
+#: ../src/gui/dialogs/EventFilterDialog.cpp:155
+#: ../src/gui/editors/eventlist/EventView.cpp:172
+#: ../src/gui/editors/eventlist/EventView.cpp:179
+#: ../src/gui/editors/eventlist/EventView.cpp:186
+msgid "edit"
+msgstr "bearbeiten"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:141
+#: ../src/gui/dialogs/EventFilterDialog.cpp:157
+msgid "choose a pitch using a staff"
+msgstr "Wählen Sie die Tonhöhe im Notensystem aus"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:182
+#: ../src/gui/dialogs/EventFilterDialog.cpp:188
+msgid "longest"
+msgstr ""
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:200
+msgid "Include all"
+msgstr "Alle einschließen"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:203
+msgid "Include entire range of values"
+msgstr "Gesamten Wertebereich einschließen"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:206
+msgid "Exclude all"
+msgstr "Alle ausschließen"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:209
+msgid "Exclude entire range of values"
+msgstr "Gesamten Wertebereich ausschließen"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:233
+#: ../src/gui/dialogs/EventFilterDialog.cpp:234
+#, fuzzy
+msgid "shortest"
+msgstr "Pause"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:333
+msgid "Lowest pitch"
+msgstr "Niedrigste Tonhöhe"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:343
+msgid "Highest pitch"
+msgstr "Höchste Tonhöhe"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:56
+#: ../src/gui/editors/notation/NotationView.cpp:1619
+#: ../src/gui/editors/notation/NotationView.cpp:6088
+msgid "Use Ornament"
+msgstr "Verzierung verwenden"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:260
+#: ../src/gui/configuration/NotationConfigurationPage.h:64
+#: ../src/gui/configuration/NotationConfigurationPage.h:65
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:63
+msgid "Notation"
+msgstr "Notation"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:68
+msgid "Display as: "
+msgstr "Zeige als:"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:84
+msgid "Trill"
+msgstr "Triller"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:84
+msgid "Trill with line"
+msgstr "Triller folgt der Linie"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:84
+msgid "Trill line only"
+msgstr ""
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:85
+msgid "Turn"
+msgstr "Doppelschlag"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:85
+msgid "Mordent"
+msgstr "Mordent"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:85
+msgid "Inverted mordent"
+msgstr "Mordent umkehren"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:86
+msgid "Long mordent"
+msgstr "Langer Mordent"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:86
+msgid "Long inverted mordent"
+msgstr "Langer umgekehrter Mordent"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:94
+msgid "Text mark"
+msgstr "Textmarke"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:98
+msgid " Text: "
+msgstr " Text: "
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:104
+msgid "Performance"
+msgstr ""
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:109
+msgid "Perform using triggered segment: "
+msgstr ""
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:75
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:123
+msgid "Perform with timing: "
+msgstr ""
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:81
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:129
+msgid "As stored"
+msgstr "Wie gespeichert"
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:82
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:130
+msgid "Truncate if longer than note"
+msgstr "Abschneiden, wenn länger als Note"
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:83
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:131
+msgid "End at same time as note"
+msgstr "Zusammen mit der Note beenden"
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:84
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:132
+msgid "Stretch or squash segment to note duration"
+msgstr "Strecke oder stauche Segment gemäß Notendauer"
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:86
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:134
+msgid "Adjust pitch to note"
+msgstr "Tonhöhe an Note anpassen"
+
+#: ../src/gui/dialogs/PitchPickerDialog.cpp:40
+msgid "Pitch Selector"
+msgstr "Tonhöhenauswahl"
+
+#: ../src/gui/dialogs/BeatsBarsDialog.cpp:44
+msgid "Audio Segment Duration"
+msgstr "Audio Segment Dauer"
+
+#: ../src/gui/dialogs/BeatsBarsDialog.cpp:50
+msgid "The selected audio segment contains:"
+msgstr "Das ausgewählte Audio Segment enthält:"
+
+#: ../src/gui/dialogs/BeatsBarsDialog.cpp:59
+msgid "beat(s)"
+msgstr "Taktschlag(äge)"
+
+#: ../src/gui/dialogs/BeatsBarsDialog.cpp:60
+msgid "bar(s)"
+msgstr "Takt(e)"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:51
+msgid "Tuplet"
+msgstr "Tuole"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:58
+msgid "New timing for tuplet group"
+msgstr "Neue Teilung für Tuole"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:76
+msgid "Play "
+msgstr "Abspielen "
+
+#: ../src/gui/dialogs/TupletDialog.cpp:98
+msgid "in the time of "
+msgstr "in der Zeit von "
+
+#: ../src/gui/dialogs/TupletDialog.cpp:104
+msgid "Timing is already correct: update display only"
+msgstr "Timing ist bereits korrigiert: aktualisiere Anzeige"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:114
+msgid "Timing calculations"
+msgstr "Timing-Berechnungen"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:120
+msgid "Selected region:"
+msgstr "Ausgewählte Region:"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:129
+msgid "Group with current timing:"
+msgstr "Gruppiere mit aktueller Aufteilung:"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:135
+msgid "Group with new timing:"
+msgstr "Gruppiere mit neuer Aufteilung:"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:141
+msgid "Gap created by timing change:"
+msgstr "Durch Veränderung der Aufteilung erzeugte Lücke:"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:149
+msgid "Unchanged at end of selection:"
+msgstr "Am Ende der Selektion unverändert:"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:63 rc.cpp:372
+#, no-c-format
+msgid "Metronome"
+msgstr "Metronom"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:77
+msgid "Metronome Instrument"
+msgstr "Metronom Instrument"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:82
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:150
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:183
+#: ../src/gui/studio/DeviceEditorDialog.cpp:73
+#: ../src/gui/studio/DeviceManagerDialog.cpp:105
+#: ../src/gui/studio/DeviceManagerDialog.cpp:163
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:66
+msgid "Device"
+msgstr "Gerät"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:101
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:89
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:215
+#: ../src/gui/studio/DeviceEditorDialog.cpp:195
+#: ../src/gui/studio/DeviceEditorDialog.cpp:218
+#: ../src/gui/studio/DeviceEditorDialog.cpp:230
+#: ../src/gui/studio/DeviceManagerDialog.cpp:196
+#: ../src/gui/studio/DeviceManagerDialog.cpp:440
+#: ../src/gui/studio/DeviceManagerDialog.cpp:452
+msgid "No connection"
+msgstr "Keine Verbindung"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:112
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:111
+#: ../src/gui/editors/parameters/InstrumentParameterBox.cpp:53
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:1209
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:159
+#: ../src/gui/general/PresetHandlerDialog.cpp:92
+#: ../src/gui/studio/MidiMixerWindow.cpp:204
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:67
+msgid "Instrument"
+msgstr "Instrument"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:118
+msgid "Beats"
+msgstr "Taktschläge"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:184
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:123
+msgid "Resolution"
+msgstr "Auflösung"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:309
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:139
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:205
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:125
+#: ../src/gui/editors/matrix/MatrixView.cpp:2132
+#: ../src/gui/editors/notation/NotationView.cpp:1582
+#: ../src/gui/widgets/QuantizeParameters.cpp:128
+#: ../src/gui/widgets/QuantizeParameters.cpp:301
+msgid "None"
+msgstr "Kein"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:126
+msgid "Bars only"
+msgstr "Nur Takte"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:127
+msgid "Bars and beats"
+msgstr "Takte und Schläge"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:128
+msgid "Bars, beats, and divisions"
+msgstr "Takte, Schläge und Unterteilungen"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:132
+msgid "Bar velocity"
+msgstr "Anschlagstärke des Taktes"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:139
+msgid "Beat velocity"
+msgstr "Anschlagstärke des Schlages"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:146
+msgid "Sub-beat velocity"
+msgstr "Stärke von Schlagteilungen"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:155
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:324
+msgid "Pitch"
+msgstr "Tonhöhe"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:160
+msgid "for Bar"
+msgstr "für Takt"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:161
+msgid "for Beat"
+msgstr "für Taktschlag"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:162
+msgid "for Sub-beat"
+msgstr ""
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:166
+msgid "Metronome Activated"
+msgstr "Metronom eingeschaltet"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:167
+msgid "Playing"
+msgstr "Wiedergabe"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:168
+msgid "Recording"
+msgstr "Aufnahme"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:46
+msgid "Choose Text Encoding"
+msgstr "Textkodierug wählen"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:50
+msgid ""
+"\n"
+"This file contains text in an unknown language encoding.\n"
+"\n"
+"Please select one of the following estimated text encodings\n"
+"for use with the text in this file:\n"
+msgstr ""
+"\n"
+"Diese Datei enthält Text in einer unbekannten Kodierung.\n"
+"\n"
+"Bitte wählen aus der Liste der folgenden Kodierungen eine\n"
+"zur Verwendung mit dieser Datei aus:\n"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:61
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:77
+msgid "Japanese Shift-JIS"
+msgstr "Japanisch Shift-JIS"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:62
+msgid "Unicode variable-width"
+msgstr "Unicode variable-Weite"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:63
+msgid "Western Europe"
+msgstr "Westeuropa"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:64
+msgid "Western Europe + Euro"
+msgstr "Westeuropa + Euro"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:65
+msgid "Eastern Europe"
+msgstr "Osteuropa"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:66
+msgid "Southern Europe"
+msgstr "Südeuropa"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:67
+msgid "Northern Europe"
+msgstr "Nordeuropa"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:68
+msgid "Cyrillic"
+msgstr "Kyrillisch"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:69
+msgid "Arabic"
+msgstr "Arabisch"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:70
+msgid "Greek"
+msgstr "Griechisch"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:71
+msgid "Hebrew"
+msgstr "Hebräisch"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:72
+msgid "Turkish"
+msgstr "Türkish"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:73
+msgid "Nordic"
+msgstr "Skandinavisch"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:74
+msgid "Thai"
+msgstr "Thailändisch"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:75
+msgid "Baltic"
+msgstr "Baltisch"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:76
+msgid "Celtic"
+msgstr "Keltisch"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:78
+msgid "Traditional Chinese"
+msgstr "Traditionelles Chinesisch"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:79
+msgid "Simplified Chinese"
+msgstr "Vereinfachtes Chinesisch"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:80
+msgid "Russian"
+msgstr "Russisch"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:81
+msgid "Ukrainian"
+msgstr "Ukrainisch"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:82
+msgid "Tamil"
+msgstr "Tamilisch"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:117
+#, c-format
+msgid "Microsoft Code Page %1"
+msgstr "Microsoft Code Page %1"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:123
+#: ../src/gui/editors/matrix/MatrixView.cpp:1490
+msgid "%1 (%2)"
+msgstr "%1 (%2)"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:142
+msgid ""
+"\n"
+"Example text from file:"
+msgstr ""
+"\n"
+"Beispieltext aus Datei:"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:59
+#: ../src/gui/editors/tempo/TempoView.cpp:92
+msgid "Time Signature"
+msgstr "Taktart"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:82
+msgid "Time signature"
+msgstr "Taktart"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:116
+msgid "Time where signature takes effect"
+msgstr "Zeitpunkt zu dem die Taktart angewandt wird"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:83
+#: ../src/gui/dialogs/TempoDialog.cpp:128
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:129
+#: ../src/gui/general/PresetHandlerDialog.cpp:101
+msgid "Scope"
+msgstr "Bereich"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:141
+#, c-format
+msgid "Insertion point is at start of measure %1."
+msgstr "Einfügepunkt ist am Beginn von Takt %1."
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:145
+#, c-format
+msgid "Insertion point is in the middle of measure %1."
+msgstr "Einfügepunkt ist in der Mitte von Takt %1"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:150
+msgid "Insertion point is at start of composition."
+msgstr "Einfügepunkt ist am Beginn des Stücks."
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:155
+msgid "Start measure %1 here"
+msgstr "Takt %1 hier beginnen"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:159
+#, c-format
+msgid "Change time from start of measure %1"
+msgstr "Ändere die Zeit vom Beginn des Taktes %1"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:166
+#, c-format
+msgid "Time change will take effect at the start of measure %1."
+msgstr "Die Änderung der Taktart wird zu Beginn des Takts %1 wirksam werden"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:176
+msgid "Hide the time signature"
+msgstr "Zeitstempel verbergen"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:181
+msgid "Hide the affected bar lines"
+msgstr "Verberge die beteiligten Tacktstriche"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:186
+msgid "Show as common time"
+msgstr "Zeige als 4/4-tel Takt"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:191
+msgid "Correct the durations of following measures"
+msgstr "Dauer nachfolgender Takte korrigieren"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:280
+msgid "Display as common time"
+msgstr "Als Viervierteltakt anzeigen"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:284
+msgid "Display as cut common time"
+msgstr "Als alla breve anzeigen"
+
+#: ../src/gui/dialogs/ConfigureDialog.cpp:66
+msgid "Configure Rosegarden"
+msgstr "Rosegarden konfigurieren"
+
+#: ../src/gui/dialogs/MarkerModifyDialog.cpp:53
+#: ../src/gui/dialogs/MarkerModifyDialog.cpp:61
+msgid "Edit Marker"
+msgstr "Marker editieren"
+
+#: ../src/gui/dialogs/MarkerModifyDialog.cpp:78
+msgid "Marker Time"
+msgstr "Marker Zeit"
+
+#: ../src/gui/dialogs/MarkerModifyDialog.cpp:94
+msgid "Marker Properties"
+msgstr "Marker Eigenschaften"
+
+#: ../src/gui/dialogs/MarkerModifyDialog.cpp:100
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:554
+msgid "Text:"
+msgstr "Text:"
+
+#: ../src/gui/dialogs/MarkerModifyDialog.cpp:104
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:85
+msgid "Description:"
+msgstr "Beschreibung"
+
+#: ../src/gui/dialogs/FileMergeDialog.cpp:46
+msgid "Merge File"
+msgstr "MIDI-Datei mischen"
+
+#: ../src/gui/dialogs/FileMergeDialog.cpp:53
+msgid "Merge new file "
+msgstr "Neue MIDI-Datei mischen"
+
+#: ../src/gui/dialogs/FileMergeDialog.cpp:56
+msgid "At start of existing composition"
+msgstr "Am Beginn der existierenden Komposition"
+
+#: ../src/gui/dialogs/FileMergeDialog.cpp:57
+msgid "From end of existing composition"
+msgstr "Vom Ende der existierenden Komposition"
+
+#: ../src/gui/dialogs/FileMergeDialog.cpp:61
+msgid "The file has different time signatures or tempos."
+msgstr "Die Datei hat andere Taktarten oder Tempi"
+
+#: ../src/gui/dialogs/FileMergeDialog.cpp:62
+msgid "Import these as well"
+msgstr "Diese auch importieren"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:171
+#: ../src/gui/dialogs/ShowSequencerStatusDialog.cpp:44
+msgid "Sequencer status"
+msgstr "Sequenzerstatus"
+
+#: ../src/gui/dialogs/ShowSequencerStatusDialog.cpp:48
+msgid "Sequencer status:"
+msgstr "Sequenzerstatus:"
+
+#: ../src/gui/dialogs/ShowSequencerStatusDialog.cpp:50
+msgid "Status not available."
+msgstr "Status nicht verfügbar."
+
+#: ../src/gui/dialogs/ShowSequencerStatusDialog.cpp:57
+msgid "Sequencer is not running or is not responding."
+msgstr "Der Sequenzer läuft oder antwortet nicht"
+
+#: ../src/gui/dialogs/ShowSequencerStatusDialog.cpp:64
+msgid "Sequencer is not returning a valid status report."
+msgstr "Kein brauchbarer Statusbericht vom Sequenzer"
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:46
+msgid "Add Tracks"
+msgstr "&Mehrere Spuren hinzufügen..."
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:54
+msgid "How many tracks do you want to add?"
+msgstr "Wie viele Spuren wollen Sie hinzufügen? (max. 24)"
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:62
+msgid "Add tracks"
+msgstr "&Mehrere Spuren hinzufügen"
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:64
+msgid "At the top"
+msgstr ""
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:65
+msgid "Above the current selected track"
+msgstr "Über die momentan gewählte Spur "
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:66
+msgid "Below the current selected track"
+msgstr "Unter die momentan gewählte Spur"
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:67
+msgid "At the bottom"
+msgstr "Unterhalb"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:75
+msgid "Event Properties"
+msgstr "Event-Eigenschaften"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:81
+msgid "Event type:"
+msgstr "Eventtyp: "
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:117
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:251
+#: ../src/gui/editors/segment/MarkerEditor.cpp:97
+msgid "Absolute time:"
+msgstr "Absolute Zeit: "
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:156
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:323
+msgid "Controller name:"
+msgstr "Controller Name"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:157
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:530
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:562
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:563
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:602
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:631
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:267
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:269
+#: ../src/gui/editors/segment/MarkerEditor.cpp:279
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:272
+#: ../src/gui/studio/AudioMixerWindow.cpp:388
+#: ../src/gui/studio/AudioMixerWindow.cpp:519
+#: ../src/gui/studio/AudioMixerWindow.cpp:683
+#: ../src/gui/studio/AudioMixerWindow.cpp:722
+#: ../src/gui/studio/AudioMixerWindow.cpp:904
+#: ../src/gui/studio/SynthPluginManagerDialog.cpp:121
+msgid "<none>"
+msgstr "<keine>"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:174
+msgid "Meta string:"
+msgstr "Meta string"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:179
+msgid "Load data"
+msgstr "Lade Daten"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:181
+msgid "Save data"
+msgstr "Speichern unter"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:192
+msgid "Notation Properties"
+msgstr "Notationsparameter"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:198
+msgid "Lock to changes in performed values"
+msgstr "Verknüpfe mit Änderungen an ausgeführten Werten"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:205
+msgid "Notation time:"
+msgstr "Notationszeit:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:217
+msgid "Notation duration:"
+msgstr "Notationsdauer:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:283
+msgid "Note pitch:"
+msgstr "Tonhöhe:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:291
+msgid "Note velocity:"
+msgstr "Anschlagstärke:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:317
+msgid "Controller number:"
+msgstr "Controller Nummer:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:326
+msgid "Controller value:"
+msgstr "Controller Wert:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:354
+msgid "Key pitch:"
+msgstr "Tonhöhe:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:362
+msgid "Key pressure:"
+msgstr "Key Pressure/Aftertouch:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:390
+msgid "Channel pressure:"
+msgstr "Kanal Pressure/Kanal Aftertouch:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:418
+msgid "Program change:"
+msgstr "Programmwechsel"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:461
+msgid "Data length:"
+msgstr "Datenlänge:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:462
+msgid "Data:"
+msgstr "Daten:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:480
+msgid "Pitchbend MSB:"
+msgstr "Pitch Bend MSB"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:488
+msgid "Pitchbend LSB:"
+msgstr "Pitch Bend LSB"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:523
+msgid "Indication:"
+msgstr "Indication"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:553
+msgid "Text type:"
+msgstr "Textart:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:596
+msgid "Clef type:"
+msgstr "Schlüsselart:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:625
+msgid "Key name:"
+msgstr "Tonartname:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:674
+msgid "Unsupported event type:"
+msgstr "Nicht unterstütztes Event:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:931
+msgid "Edit Event Time"
+msgstr "Event Zeit ändern"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:943
+msgid "Edit Event Notation Time"
+msgstr "Event Notationszeit ändern"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:955
+msgid "Edit Duration"
+msgstr "Dauer ändern"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:968
+msgid "Edit Notation Duration"
+msgstr "Notationsdauer ändern"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:981
+msgid "Edit Pitch"
+msgstr "Tonhöhe ändern"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:991
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:1016
+msgid "*.syx|System exclusive files (*.syx)"
+msgstr "*.syx|System exclusive Dateien (*.syx)"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:992
+msgid "Load System Exclusive data in File"
+msgstr "Lade System Exclusive Daten aus Datei"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:1017
+msgid "Save System Exclusive data to..."
+msgstr "Speichere System Exclusive Daten nach..."
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:46
+msgid "Locate audio file"
+msgstr "Audiodatei finden"
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:50
+msgid "&Skip"
+msgstr "&Überspringen"
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:51
+msgid "Skip &All"
+msgstr "&Alles überspringen"
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:52
+msgid "&Locate"
+msgstr "&Finden"
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:57
+msgid ""
+"Can't find file \"%1\".\n"
+"Would you like to try and locate this file or skip it?"
+msgstr ""
+"Die Datei \"%1\".\n"
+" wurde nicht gefunden. Wollen Sie diese Datei suchen oder überspringen?"
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:71
+msgid ""
+"%1|Requested file (%2)\n"
+"*.wav|WAV files (*.wav)"
+msgstr ""
+"%1|Angeforderte Dateien (%2)\n"
+"*.wav|WAV Dateien (*.wav)"
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:74
+msgid "Select an Audio File"
+msgstr "Audiodatei wählen"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:53 ../src/gui/dialogs/ClefDialog.cpp:62
+#: ../src/gui/dialogs/ClefDialog.cpp:79 ../src/gui/dialogs/ClefDialog.cpp:90
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:278
+msgid "Clef"
+msgstr "Schlüssel"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:65
+msgid "Existing notes following clef change"
+msgstr "Vorhandene Noten folgen Schlüsseländerung"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:71
+msgid "Lower clef"
+msgstr "Tieferer Schlüssel"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:77
+msgid "Up an Octave"
+msgstr "Oktave höher"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:84
+msgid "Down an Octave"
+msgstr "Oktave herunter"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:88
+msgid "Higher clef"
+msgstr "Höherer Schlüssel"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:96
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:152
+msgid "Maintain current pitches"
+msgstr "Aktuelle Tonhöhen beibehalten"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:99
+msgid "Transpose into appropriate octave"
+msgstr "In die richtige Oktave transponieren"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:231
+msgid "%1 down an octave"
+msgstr "%1 Oktave herunter"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:234
+msgid "%1 down two octaves"
+msgstr "%1 zwei Oktaven herunter"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:237
+msgid "%1 up an octave"
+msgstr "%1 Oktave höher"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:240
+msgid "%1 up two octaves"
+msgstr "%1 zwei Oktaven höher"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:249
+msgid "Treble"
+msgstr "Sopran"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:251
+msgid "French violin"
+msgstr "Französische Violine"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:253
+msgid "Soprano"
+msgstr "Sopran"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:255
+msgid "Mezzo-soprano"
+msgstr "Mezzo-Sopran"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:257
+msgid "Alto"
+msgstr "Alt"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:259
+msgid "Tenor"
+msgstr "Tenor"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:261
+msgid "C-baritone"
+msgstr "C-Bariton"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:263
+msgid "F-baritone"
+msgstr "F-Bariton"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:265
+msgid "Bass"
+msgstr "Baß"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:267
+#, fuzzy
+msgid "Sub-bass"
+msgstr "Baß"
+
+#: ../src/gui/dialogs/CountdownDialog.cpp:52
+msgid "Recording..."
+msgstr "Aufnahme läuft..."
+
+#: ../src/gui/dialogs/CountdownDialog.cpp:60
+msgid "Recording time remaining: "
+msgstr "Rest-Aufnahmezeit: "
+
+#: ../src/gui/dialogs/CountdownDialog.cpp:120
+msgid "Just how big is your hard disk?"
+msgstr "Wie groß ist denn Ihre Festplatte?"
+
+#: ../src/gui/dialogs/CountdownDialog.cpp:154
+msgid "Recording beyond end of composition: "
+msgstr "Aufnahme nach dem Ende der Komposition:"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:52
+msgid "Specify Interval"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:58
+msgid "Reference note:"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:59
+msgid "Target note:"
+msgstr "Zielnote:"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:68
+#: ../src/gui/dialogs/IntervalDialog.cpp:315
+msgid "a perfect unison"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:76
+msgid "Effect on Key"
+msgstr "Auswirkung auf den Schlüssel "
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:77
+msgid "Transpose within key"
+msgstr "Innerhalb der Tonart transponieren"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:79
+msgid "Change key for selection"
+msgstr "Wechsele die Tonart für die Auswahl"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:89
+msgid ""
+"Adjust segment transposition in opposite direction (maintain audible pitch)"
+msgstr "Passe die Transposition des Segmentes in entegengesetzter Richtung an (erhalte die hörbare Tonhöhe) "
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:190
+#: ../src/gui/dialogs/IntervalDialog.cpp:220
+msgid "a diminished"
+msgstr "ein Verminderter"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:192
+#: ../src/gui/dialogs/IntervalDialog.cpp:222
+msgid "an augmented"
+msgstr "ein Übermäßiger"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:194
+#: ../src/gui/dialogs/IntervalDialog.cpp:224
+msgid "a doubly diminished"
+msgstr "ein doppelt Verminderter"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:196
+#: ../src/gui/dialogs/IntervalDialog.cpp:226
+msgid "a doubly augmented"
+msgstr "ein doppelt Übermäßgier"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:198
+#: ../src/gui/dialogs/IntervalDialog.cpp:228
+msgid "a triply diminished"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:200
+#: ../src/gui/dialogs/IntervalDialog.cpp:230
+msgid "a triply augmented"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:202
+msgid "a quadruply diminished"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:204
+#: ../src/gui/dialogs/IntervalDialog.cpp:232
+msgid "a quadruply augmented"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:206
+#: ../src/gui/dialogs/IntervalDialog.cpp:234
+msgid "a perfect"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:208
+#: ../src/gui/dialogs/IntervalDialog.cpp:236
+msgid "an (unknown, %1)"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:216
+#, fuzzy
+msgid "a minor"
+msgstr "moll"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:218
+#, fuzzy
+msgid "a major"
+msgstr "dur"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:239
+#, fuzzy
+msgid "an (unknown)"
+msgstr "Unbekannt"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:248
+#: ../src/gui/dialogs/IntervalDialog.cpp:251
+#, fuzzy
+msgid "%1 octave"
+msgstr "%1 Oktave höher"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:254
+#, fuzzy
+msgid "%1 unison"
+msgstr "Einheiten"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:258
+#, fuzzy
+msgid "%1 second"
+msgstr "Sekunden:"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:261
+#, fuzzy
+msgid "%1 third"
+msgstr "Andere"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:264
+#, fuzzy
+msgid "%1 fourth"
+msgstr "%1 b"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:267
+#, fuzzy
+msgid "%1 fifth"
+msgstr "Tonhöhe"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:270
+#, fuzzy
+msgid "%1 sixth"
+msgstr "Tonhöhe"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:273
+#, fuzzy
+msgid "%1 seventh"
+msgstr "Eventgröße verändern"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:276
+#: ../src/gui/studio/DeviceManagerDialog.cpp:329
+#: ../src/gui/studio/DeviceManagerDialog.cpp:363
+#, c-format
+msgid "%1"
+msgstr "%1"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:287
+msgid ""
+"_n: up 1 octave and %1\n"
+"up %n octaves and %1"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:291
+#, c-format
+msgid ""
+"_n: up 1 octave\n"
+"up %n octaves"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:295
+#, fuzzy, c-format
+msgid "up %1"
+msgstr "Gruppe %1"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:303
+msgid ""
+"_n: down 1 octave and %1\n"
+"down %n octaves and %1"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:307
+#, fuzzy, c-format
+msgid ""
+"_n: down 1 octave\n"
+"down %n octaves"
+msgstr ""
+"_n: %1 auf 1 Spur\n"
+"%1 auf %n Spuren"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:311
+#, fuzzy, c-format
+msgid "down %1"
+msgstr "Tief: %1"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:81
+msgid "Intrinsics"
+msgstr "Interna"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:85
+msgid "Event type: "
+msgstr "Eventtyp: "
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:91
+msgid "Absolute time: "
+msgstr "Absolute Zeit: "
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:101
+msgid "Duration: "
+msgstr "Dauer: "
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:114
+msgid "Sub-ordering: "
+msgstr "Unter - Ordnung"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:125
+msgid "Persistent properties"
+msgstr "Dauerhafte Eigenschaften"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:169
+#: ../src/gui/dialogs/EventEditDialog.cpp:133
+#: ../src/gui/studio/BankEditorDialog.cpp:129
+#: ../src/gui/studio/DeviceEditorDialog.cpp:75
+msgid "Type"
+msgstr "Typ"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:184
+#: ../src/gui/dialogs/EventEditDialog.cpp:135
+#: ../src/gui/dialogs/EventParameterDialog.cpp:89
+#: ../src/gui/dialogs/EventParameterDialog.cpp:93
+#: ../src/gui/dialogs/EventParameterDialog.cpp:115
+msgid "Value"
+msgstr "Wert"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:155
+msgid "Non-persistent properties"
+msgstr "Nicht-dauerhafte Eigenschaften"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:156
+msgid "These are cached values, lost if the event is modified."
+msgstr ""
+"Diese Werte werden nur im Speicher gehalten und gehen verloren, wenn das "
+"Event verändert wird."
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:170
+msgid "Name "
+msgstr "Name "
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:172
+msgid "Type "
+msgstr "Typ "
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:174
+msgid "Value "
+msgstr "Wert "
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:188
+msgid "Make persistent"
+msgstr "Dauerhaft machen"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:292
+msgid "Delete this property"
+msgstr "Diese Eigenschaft löschen"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:433
+msgid ""
+"Are you sure you want to delete the \"%1\" property?\n"
+"\n"
+"Removing necessary properties may cause unexpected behavior."
+msgstr ""
+"Sind Sie sicher, dass Sie die Eigenschaft \"%1\" löschen wollen?\n"
+"\n"
+"Das Löschen benötigter Eigenschaften kann unerwartetes Verhalten hervorrufen."
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:436
+#: ../src/gui/dialogs/EventEditDialog.cpp:469
+msgid "Edit Event"
+msgstr "Event verändern"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:465
+msgid ""
+"Are you sure you want to make the \"%1\" property persistent?\n"
+"\n"
+"This could cause problems if it overrides a different computed value later "
+"on."
+msgstr ""
+"Sind Sie sicher, dass Sie die Eigenschaft \"%1\" dauerhaft machen wollen?\n"
+"\n"
+"Dies könnte Probleme verursachen, wenn so später ein berechneter Wert "
+"überschrieben wird."
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:470
+msgid "Make &Persistent"
+msgstr "&Dauerhaft machen"
+
+#: ../src/gui/dialogs/PasteNotationDialog.cpp:52
+msgid "Paste type"
+msgstr "Typ einfügen"
+
+#: ../src/gui/dialogs/PasteNotationDialog.cpp:72
+msgid "Make this the default paste type"
+msgstr "Dies zum Standard-Einfügemodus machen"
+
+#: ../src/gui/dialogs/LyricEditDialog.cpp:53
+msgid "Edit Lyrics"
+msgstr "Text editieren"
+
+#: ../src/gui/dialogs/LyricEditDialog.cpp:62
+msgid "Lyrics for this segment"
+msgstr "Text für dieses Segment"
+
+#: ../src/gui/dialogs/LyricEditDialog.cpp:70
+msgid "Add Verse"
+msgstr "Verse hinzufügen"
+
+#: ../src/gui/dialogs/LyricEditDialog.cpp:84
+#: ../src/gui/dialogs/LyricEditDialog.cpp:106
+#, c-format
+msgid "Verse %1"
+msgstr ""
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:59
+msgid "Import from Device..."
+msgstr "Importieren von Gerät..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2163
+#: ../src/gui/application/RosegardenGUIApp.cpp:2229
+#: ../src/gui/application/RosegardenGUIApp.cpp:7780
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:87
+#: ../src/sound/AudioFileManager.cpp:664
+#, c-format
+msgid "Cannot download file %1"
+msgstr "Kann Datei %1 nicht herunterladen"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:99
+#, c-format
+msgid "Cannot open file %1"
+msgstr "Datei %1 kann nicht geöfnet werden '"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:106
+#, c-format
+msgid "No devices found in file %1"
+msgstr "Keine Geräte in der Datei gefunden"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:113
+msgid "Source device"
+msgstr "Quell-Gerät"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:118
+msgid "Import from: "
+msgstr "Bänke importieren von Gerät..."
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:140
+#: ../src/gui/studio/DeviceEditorDialog.cpp:148
+#, c-format
+msgid "Device %1"
+msgstr "Gerät %1"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:155
+msgid "Import banks"
+msgstr "Bänke importieren"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:156
+msgid "Import key mappings"
+msgstr "Bänke exportieren"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:157
+msgid "Import controllers"
+msgstr "%1 Controller"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:160
+msgid "Import device name"
+msgstr "Name des Import-Geräts"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:166
+msgid "Bank import behavior"
+msgstr "Import-Verhalten"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:168
+msgid "Merge banks"
+msgstr "Bänke mischen"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:169
+msgid "Overwrite banks"
+msgstr "Bänke überschreiben"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:367
+msgid "Bank %1:%2"
+msgstr "Bank %1:%2"
+
+#: ../src/commands/segment/SegmentSplitByRecordingSrcCommand.cpp:42
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:48
+msgid "Split by Recording Source"
+msgstr "Nach Aufnahmequelle aufteilen"
+
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:53
+msgid "Recording Source"
+msgstr "Aufnahmequelle"
+
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:57
+msgid "Channel:"
+msgstr "Kanal:"
+
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:64
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:75
+msgid "any"
+msgstr "Irgendein"
+
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:69
+msgid "Device:"
+msgstr "Gerät:"
+
+#: ../src/gui/dialogs/UnusedAudioSelectionDialog.cpp:46
+msgid "Select Unused Audio Files"
+msgstr "Nicht verwendete Audiodateien auswählen"
+
+#: ../src/gui/dialogs/UnusedAudioSelectionDialog.cpp:53
+#: ../src/gui/editors/segment/PlayListView.cpp:36
+msgid "File name"
+msgstr "Dateiname"
+
+#: ../src/gui/dialogs/UnusedAudioSelectionDialog.cpp:54
+msgid "File size"
+msgstr "Dateigröße:"
+
+#: ../src/gui/dialogs/UnusedAudioSelectionDialog.cpp:55
+msgid "Last modified date"
+msgstr "Letztes Änderungsdatum"
+
+#: ../src/gui/dialogs/UnusedAudioSelectionDialog.cpp:60
+msgid " (not found) "
+msgstr "(nicht gefunden)"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:105
+msgid "Audio File Manager"
+msgstr "Audiodatei Manager"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:126
+msgid ""
+"* Some audio files are encoded at a sample rate different from that of the "
+"JACK audio server.\n"
+"Rosegarden will play them at the correct speed, but they will sound "
+"terrible.\n"
+"Please consider resampling such files externally, or adjusting the sample "
+"rate of the JACK server."
+msgstr ""
+"* Einige der Audio Dateien haben eine andere Samplefrequenz als der JACK "
+"Audio Server.\n"
+"Rosegarden wird sie zwar mit der richtigen Geschwindigkeit abspielen, aber "
+"der Klang wird vermutlich furchtbar sein.\n"
+"Sie sollten versuchen, die Samplerate dieser Dateien extern zu ändern, oder "
+"aber ggf. die Samplefrequenz des JACK Servers anpassen."
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:132
+msgid "&Add Audio File..."
+msgstr "Audiodatei hinzufügen..."
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:135
+msgid "&Unload Audio File"
+msgstr "Audiodatei herausnehmen"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:140
+msgid "&Play Preview"
+msgstr "Vorschau abspielen"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:151
+msgid "&Insert into Selected Audio Track"
+msgstr "&In ausgewählte Audiospur einfügen"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:155
+msgid "Unload &all Audio Files"
+msgstr "Alle Audiodateien herausnehmen"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:159
+msgid "Unload all &Unused Audio Files"
+msgstr "Alle unbenutzten Audiodateien herausnehmen"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:163
+msgid "&Delete Unused Audio Files..."
+msgstr "Nicht verwendete Audiodateien löschen"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:167
+msgid "&Export Audio File..."
+msgstr "Audiodatei exportieren..."
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:173
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:180
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:91
+msgid "Duration"
+msgstr "Dauer"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:181
+msgid "Envelope"
+msgstr "Hüllkurve"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:182
+msgid "Sample rate"
+msgstr "Abtastrate"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:183
+msgid "Channels"
+msgstr "Kanäle"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:282
+msgid "<no audio files>"
+msgstr "<keine Audiodateien>"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:488
+msgid "*.wav|WAV files (*.wav)"
+msgstr "*.wav|WAV-Dateien (*.wav)"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:489
+msgid "Choose a name to save this file as"
+msgstr "Einen Namen wählen, unter dem die Datei abgespeichert werden soll"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:499
+msgid "Exporting audio file..."
+msgstr "Audiodatei wird exportiert..."
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:609
+msgid ""
+"This will unload audio file \"%1\" and remove all associated segments. Are "
+"you sure?"
+msgstr ""
+"Wirklich die Audiodatei \"%1\" und alle zugehörigen Audiosegmente löschen?"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:692
+#, fuzzy
+msgid ""
+"*.wav|WAV files (*.wav)\n"
+"*.*|All files"
+msgstr "*.wav|WAV-Dateien (*.wav)"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:697
+msgid ""
+"*.wav *.flac *.ogg *.mp3|Audio files (*.wav *.flac *.ogg *.mp3)\n"
+"*.wav|WAV files (*.wav)\n"
+"*.flac|FLAC files (*.flac)\n"
+"*.ogg|Ogg files (*.ogg)\n"
+"*.mp3|MP3 files (*.mp3)\n"
+"*.*|All files"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:704
+msgid "Select one or more audio files"
+msgstr "Eine oder mehrere Audiodateien auswählen"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:763
+msgid ""
+"This will unload all audio files and remove their associated segments.\n"
+"This action cannot be undone, and associations with these files will be "
+"lost.\n"
+"Files will not be removed from your disk.\n"
+"Are you sure?"
+msgstr ""
+"Dies wird alle Audiodateien herausnehmen sowie die zugehörigen Segmente "
+"entfernen.\n"
+"Diese Aktion kann nicht rückgängig gemacht werden und alle "
+"Segmentzuordnungen sind unwiederbringlich verloren.\n"
+"Die Dateien bleiben jedoch auf der Festplatte erhalten.\n"
+"Wollen Sie das tun?"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:800
+msgid ""
+"This will unload all audio files that are not associated with any segments "
+"in this composition.\n"
+"This action cannot be undone, and associations with these files will be "
+"lost.\n"
+"Files will not be removed from your disk.\n"
+"Are you sure?"
+msgstr ""
+"Dies wird alle diejenigen Audiodateien aus der Komposition herausnehmen, die "
+"keinem Segment zugeordnet sind.\n"
+"Dies Aktion kann nicht rückgängig gemacht werden.\n"
+"Die Dateien bleiben jedoch auf der Festplatte erhalten.\n"
+"Wollen Sie das tun?"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:865
+msgid ""
+"The following audio files are not used in the current composition.\n"
+"\n"
+"Please select the ones you wish to delete permanently from the hard disk.\n"
+msgstr ""
+"Die folgenden Audiodateien werden in der Komposition nicht verwendet.\n"
+"\n"
+"Bitte wählen Sie diejenigen aus, die permanent von der Festplatte gelöscht "
+"werden sollen.\n"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:875
+#, c-format
+msgid ""
+"_n: <qt>About to delete 1 audio file permanently from the hard disk.<br>This "
+"action cannot be undone, and there will be no way to recover this file."
+"<br>Are you sure?</qt>\n"
+"\n"
+"<qt>About to delete %n audio files permanently from the hard disk.<br>This "
+"action cannot be undone, and there will be no way to recover these files."
+"<br>Are you sure?</qt>"
+msgstr ""
+"_n: Es soll 1 Audiodatei dauerhaft von der Festplatte gelöscht werden.\n"
+"Diese Aktion kann nicht rückgängig gemacht werden und die einmal gelöschte "
+"Datei kann danach nicht wieder hergestellt werden.\n"
+"Sind Sie sicher?\n"
+"Es sollen %1 Audiodateien dauerhaft von der Festplatte gelöscht werden.\n"
+"Diese Aktion kann nicht rückgängig gemacht werden und die einmal gelöschten "
+"Dateien können danach nicht wieder hergestellt werden.\n"
+"Sind Sie sicher?"
+
+#: ../src/document/RosegardenGUIDoc.cpp:525
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:888
+msgid "File %1 could not be deleted."
+msgstr "Die Datei %1 konnte nicht gelöscht werden."
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:921
+msgid "Change Audio File label"
+msgstr "Audiodateibezeichung ändern"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:6466
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:922
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:1099
+msgid "Enter new label"
+msgstr "Neue Bezeichnung eingeben"
+
+#: ../src/gui/application/RosegardenGUIView.cpp:1538
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:1086
+msgid "Adding audio file..."
+msgstr "Füge Audiodatei hinzu..."
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:1107
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:1112
+msgid "Failed to add audio file. "
+msgstr "Der Sequenzer konnte die Audio-Datei %1 nicht hinzufügen"
+
+#: ../src/document/RosegardenGUIDoc.cpp:2789
+#: ../src/gui/application/RosegardenGUIApp.cpp:2736
+#: ../src/gui/application/RosegardenGUIView.cpp:1574
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:1122
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:180
+msgid "Generating audio preview..."
+msgstr "Audio-Vorschau wird erzeugt..."
+
+#: ../src/gui/application/RosegardenGUIView.cpp:1581
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:1130
+msgid ""
+"Try copying this file to a directory where you have write permission and re-"
+"add it"
+msgstr ""
+"Versuchen Sie diese Datei in ein Verzeichnis zu kopieren, für das Sie "
+"Schreibberechtigung besitzen und fügen Sie sie erneut hinzu"
+
+#: ../src/gui/dialogs/TransportDialog.cpp:90 rc.cpp:357
+#, no-c-format
+msgid "Rosegarden Transport"
+msgstr "Rosegarden Bedienfeld"
+
+#: ../src/gui/dialogs/TransportDialog.cpp:925
+#: ../src/gui/dialogs/TransportDialog.cpp:985
+msgid "PITCH WHEEL"
+msgstr "PITCH WHEEL"
+
+#: ../src/gui/dialogs/TransportDialog.cpp:929
+#: ../src/gui/dialogs/TransportDialog.cpp:989
+msgid "CONTROLLER"
+msgstr "CONTROLLER"
+
+#: ../src/gui/dialogs/TransportDialog.cpp:933
+#: ../src/gui/dialogs/TransportDialog.cpp:993
+msgid "PROG CHNGE"
+msgstr "PROG CHNGE"
+
+#: ../src/gui/dialogs/TransportDialog.cpp:938
+#: ../src/gui/dialogs/TransportDialog.cpp:998
+msgid "PRESSURE"
+msgstr "PRESSURE"
+
+#: ../src/gui/dialogs/TransportDialog.cpp:942
+#: ../src/gui/dialogs/TransportDialog.cpp:1002
+msgid "SYS MESSAGE"
+msgstr "SYS MESSAGE"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:177
+#: ../src/gui/dialogs/QuantizeDialog.cpp:40
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:127
+msgid "Quantize"
+msgstr "Quantisieren"
+
+#: ../src/gui/dialogs/QuantizeDialog.cpp:52
+msgid "Advanced"
+msgstr "Fortgeschritten"
+
+#: ../src/gui/dialogs/ExportDeviceDialog.cpp:42
+msgid "Export Devices..."
+msgstr "Geräte exportieren als..."
+
+#: ../src/gui/dialogs/ExportDeviceDialog.cpp:47
+msgid "Export devices"
+msgstr "Geräte exportieren"
+
+#: ../src/gui/dialogs/ExportDeviceDialog.cpp:49
+msgid "Export all devices"
+msgstr "Alle Geräte exportieren"
+
+#: ../src/gui/dialogs/ExportDeviceDialog.cpp:50
+msgid "Export selected device only"
+msgstr "Nur ausgewählte Geräte exportieren"
+
+#: ../src/gui/dialogs/ExportDeviceDialog.cpp:51
+msgid " (\"%1\")"
+msgstr " (\"%1\")"
+
+#: ../src/gui/dialogs/CompositionLengthDialog.cpp:44
+msgid "Change Composition Length"
+msgstr "Länge des Stücks verändern"
+
+#: ../src/gui/dialogs/CompositionLengthDialog.cpp:50
+msgid "Set the Start and End bar markers for this Composition"
+msgstr "Anfangs- und Endtaktstriche für dieses Stück setzen"
+
+#: ../src/gui/dialogs/CompositionLengthDialog.cpp:54
+msgid "Start Bar"
+msgstr "Anfangstakt"
+
+#: ../src/gui/dialogs/CompositionLengthDialog.cpp:62
+msgid "End Bar"
+msgstr "Endtakt"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:62
+msgid "LilyPond Export/Preview"
+msgstr "LilyPond Export/Vorschau"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:85
+msgid "General options"
+msgstr "Allgemeine Konfiguration"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:90
+msgid "Advanced options"
+msgstr "Experteneinstellungen"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:112
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:95
+msgid "Headers"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:106
+msgid "Basic options"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:113
+#, fuzzy
+msgid "Compatibility level"
+msgstr "LilyPond Kompatibilität"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:117
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:118
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:119
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:120
+#, fuzzy, c-format
+msgid "LilyPond %1"
+msgstr "LilyPond 2.2"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:125
+#, fuzzy
+msgid "Paper size"
+msgstr "je Datei"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:129
+msgid "A3"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:130
+msgid "A4"
+msgstr "A4"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:131
+msgid "A5"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:132
+msgid "A6"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:133
+msgid "Legal"
+msgstr "Legal"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:134
+msgid "US Letter"
+msgstr "US Letter"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:135
+msgid "Tabloid"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:136
+msgid "do not specify"
+msgstr "keine Angabe"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:152
+#, fuzzy
+msgid "Font size"
+msgstr "Dateigröße:"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:157
+#, fuzzy
+msgid "%1 pt"
+msgstr "%1 (Teil)"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:169
+#, fuzzy
+msgid "Staff level options"
+msgstr "Experteneinstellungen"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:176
+#, fuzzy
+msgid "Export content"
+msgstr "Geräte exportieren"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:179
+msgid "All tracks"
+msgstr "Alle Spuren"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:180
+msgid "Non-muted tracks"
+msgstr "Nicht-stummgeschaltete Spuren"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:181
+msgid "Selected track"
+msgstr "&Ausgewählte Spur"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:182
+msgid "Selected segments"
+msgstr "&Ausgewählte Segmente"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:188
+msgid "Merge tracks that have the same name"
+msgstr "Zusammenführen gleichnamiger Spuren"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:198
+#, fuzzy
+msgid "Notation options"
+msgstr "Notationsparameter"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:206
+#, fuzzy
+msgid "First"
+msgstr "Pause"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:207
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:538
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:557
+msgid "All"
+msgstr "Alle"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:211
+msgid "Export tempo marks "
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:215
+#, fuzzy
+msgid "Export lyrics"
+msgstr "\\Text - Blöcke exportieren"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:225
+msgid "Export beamings"
+msgstr "Notenhälse exportieren"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:232
+msgid "Export track staff brackets"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:244
+#, fuzzy
+msgid "Layout options"
+msgstr "&Layout-Werkzeugleiste"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:257
+#, fuzzy
+msgid "Lyrics alignment"
+msgstr "Text für dieses Segment"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:261
+msgid "Ragged bottom (systems will not be spread vertically across the page)"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:267
+msgid "Miscellaneous options"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:274
+msgid "Enable \"point and click\" debugging"
+msgstr "\"point and click\" Debugging einschalten"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:279
+msgid "Export \\midi block"
+msgstr "\\midi-Block exportieren"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:284
+#, fuzzy
+msgid "No markers"
+msgstr "Keine Gruppenfader"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:285
+#, fuzzy
+msgid "Rehearsal marks"
+msgstr "Alle Marker entfernen"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:286
+#, fuzzy
+msgid "Marker text"
+msgstr "Marker Zeit"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:290
+#, fuzzy
+msgid "Export markers"
+msgstr "Exportieren als..."
+
+#: ../src/gui/dialogs/AudioSplitDialog.cpp:57
+msgid "Autosplit Audio Segment"
+msgstr "Audiosegment-Autosplit"
+
+#: ../src/gui/dialogs/AudioSplitDialog.cpp:70
+msgid "AutoSplit Segment \""
+msgstr "AutoSplit Segment \""
+
+#: ../src/gui/dialogs/AudioSplitDialog.cpp:84
+msgid "Threshold"
+msgstr "Schwelle"
+
+#: ../src/gui/dialogs/AudioSplitDialog.cpp:142
+msgid "<no preview generated for this audio file>"
+msgstr "<keine Vorschau für diese Audiodatei erzeugt>"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:70
+msgid "Audio Plugin"
+msgstr "Audio-Plugin"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:94
+#: ../src/gui/widgets/AudioFaderBox.cpp:136
+msgid "Editor"
+msgstr "Audio bearbeiten"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:100
+msgid "Plugin"
+msgstr "Plugin"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:105
+msgid "Category:"
+msgstr "Kategorie:"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:110
+msgid "Plugin:"
+msgstr "Plugin:"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:114
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:398
+msgid "Select a plugin from this list."
+msgstr "Ein Plugin aus der Liste wählen."
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:119
+msgid "Bypass"
+msgstr "Bypass"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:121
+msgid "Bypass this plugin."
+msgstr "Dieses Plugin umgehen."
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:127
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:390
+msgid "<ports>"
+msgstr "<Anschlüsse>"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:130
+msgid "Input and output port counts."
+msgstr "Anzahl Eingans- und Ausgangsanschlüsse."
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:132
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:391
+msgid "<id>"
+msgstr "<id>"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:135
+msgid "Unique ID of plugin."
+msgstr "Eindeutige ID des Plugin."
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:149
+msgid "Copy plugin parameters"
+msgstr "Plugin-Parameter kopieren"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:155
+msgid "Paste plugin parameters"
+msgstr "Plugin-Parameter einfügen"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:161
+msgid "Set to defaults"
+msgstr "Auf Standardeinstellungen setzen"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:225
+msgid "(any)"
+msgstr "(irgendwelche)"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:226
+msgid "(unclassified)"
+msgstr "(nicht näher bestimmt)"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:247
+msgid "(none)"
+msgstr "(keine)"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:389
+#: ../src/gui/editors/parameters/AudioInstrumentParameterPanel.cpp:132
+#: ../src/gui/editors/parameters/AudioInstrumentParameterPanel.cpp:361
+#: ../src/gui/studio/AudioMixerWindow.cpp:685
+#: ../src/gui/studio/AudioMixerWindow.cpp:724
+#: ../src/gui/studio/AudioMixerWindow.cpp:906
+#: ../src/gui/widgets/AudioFaderBox.cpp:79
+msgid "<no plugin>"
+msgstr "<kein Plugin>"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:427
+msgid "This plugin has too many controls to edit here."
+msgstr ""
+"Das Plugin verfügt über mehr Controls, als hier editiert werden können."
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:438
+#, c-format
+msgid "Id: %1"
+msgstr "Hinzufügen: %1"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:490
+msgid "mono"
+msgstr "mono"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:492
+msgid "stereo"
+msgstr "stereo"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:494
+msgid "%1 in, %2 out"
+msgstr "%1 in, %2 out"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:518
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:704
+msgid "Program: "
+msgstr "Programm:"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:522
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:532
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:708
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:716
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:745
+msgid "<none selected>"
+msgstr "<keine ausgewählt>"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:56
+msgid "Set the %1 property of the event selection:"
+msgstr "Die %1 - Eigenschaft für die Eventauswahl setzen:"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:61
+msgid "Pattern"
+msgstr "Muster"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:66
+msgid "Flat - set %1 to value"
+msgstr "Flach - %1 auf den Wert setzen"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:70
+msgid "Alternating - set %1 to max and min on alternate events"
+msgstr "Abwechselnd - %1 abwechselnd auf Max und Min setzen"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:74
+msgid "Crescendo - set %1 rising from min to max"
+msgstr "Crescendo - %1 von Min auf Max steigen lassen"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:78
+msgid "Diminuendo - set %1 falling from max to min"
+msgstr "Diminuendo - %1 von Max auf Min verringern"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:82
+msgid "Ringing - set %1 alternating from max to min with both dying to zero"
+msgstr ""
+"Ausklingen - %1 abwechselnd auf Max und Min setzen, dabei bis auf 0 "
+"verringern"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:123
+#: ../src/gui/dialogs/EventParameterDialog.cpp:150
+msgid "First Value"
+msgstr "Erster Wert"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:124
+#: ../src/gui/dialogs/EventParameterDialog.cpp:151
+msgid "Second Value"
+msgstr "Zweiter Wert"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:132
+#: ../src/gui/dialogs/EventParameterDialog.cpp:142
+msgid "Low Value"
+msgstr "LSB-Wert"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:133
+#: ../src/gui/dialogs/EventParameterDialog.cpp:141
+msgid "High Value"
+msgstr "Erster Wert"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:56 ../src/gui/rulers/TempoRuler.cpp:127
+msgid "Insert Tempo Change"
+msgstr "Te&mpoveränderung einfügen"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:69
+msgid "New tempo:"
+msgstr "Neues Tempo:"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:76
+msgid "Tap"
+msgstr ""
+
+#: ../src/gui/dialogs/TempoDialog.cpp:81
+msgid "Tempo is fixed until the following tempo change"
+msgstr "Tempo ist bis zur nächsten Tempoänderung fixiert"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:82
+msgid "Tempo ramps to the following tempo"
+msgstr "Tempo gleitet ins nächte Tempo über"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:83
+msgid "Tempo ramps to:"
+msgstr "Tempo gleitet über nach:"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:120
+msgid "Time of tempo change"
+msgstr "Zeit der Tempoänderung"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:138
+msgid "The pointer is currently at "
+msgstr "Der Zeiger ist zur Zeit bei "
+
+#: ../src/gui/dialogs/TempoDialog.cpp:154
+msgid "Apply this tempo from here onwards"
+msgstr "Dieses Tempo ab hier anwenden"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:158
+msgid "Replace the last tempo change"
+msgstr "Die letzte Tempoänderung ersetzen"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:164
+msgid "Apply this tempo from the start of this bar"
+msgstr "Dieses Tempo ab Beginn dieses Taktes anwenden"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:167
+msgid "Apply this tempo to the whole composition"
+msgstr "Dieses Tempo auf das ganze Stück anwenden"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:172
+msgid "Also make this the default tempo"
+msgstr "Dieses Tempo auch zum Standard machen"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:256
+msgid "%1.%2 s,"
+msgstr "%1.%2 s,"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:262
+#, c-format
+msgid "at the start of measure %1."
+msgstr "am Beginn von Takt %1."
+
+#: ../src/gui/dialogs/TempoDialog.cpp:266
+#, c-format
+msgid "in the middle of measure %1."
+msgstr "in der Mitte von Takt %1."
+
+#: ../src/gui/dialogs/TempoDialog.cpp:285
+msgid " (at %1.%2 s, in measure %3)"
+msgstr " (bei %1.%2 s, in Takt %3)"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:302
+msgid "There are no preceding tempo changes."
+msgstr "Es gibt keine vorherigen Tempoveränderungen"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:310
+msgid "There are no other tempo changes."
+msgstr "Es gibt keine anderen Tempoveränderungen."
+
+#: ../src/gui/dialogs/TempoDialog.cpp:328
+msgid " bpm"
+msgstr " bpm"
+
+#: ../src/gui/dialogs/AudioPlayingDialog.cpp:42
+msgid "Playing audio file"
+msgstr "Audiodatei wird abgespielt"
+
+#: ../src/gui/dialogs/AudioPlayingDialog.cpp:47
+msgid "Playing audio file \"%1\""
+msgstr "Audiodatei \"%1\" wird abgespielt"
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:52
+#: ../src/gui/editors/matrix/MatrixView.cpp:2655
+msgid "Trigger Segment"
+msgstr "Getriggertes Segment"
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:61
+msgid "Trigger segment: "
+msgstr "Getriggertes Segment"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:59
+msgid "Key Change"
+msgstr "Tonart-Veränderung"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:77
+msgid "Key signature"
+msgstr "Tonart"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:80
+msgid "Key transposition"
+msgstr "Tonart transponieren"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:86
+msgid "Existing notes following key change"
+msgstr "Vorhandene Noten folgen der Tonart-Veränderung"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:98
+msgid "Flatten"
+msgstr "Erniedrigen"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:100
+msgid "Key"
+msgstr "Tonart"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:105
+msgid "Sharpen"
+msgstr "Erhöhen"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:109
+msgid "Major"
+msgstr "dur"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:110
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:369
+msgid "Minor"
+msgstr "moll"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:123
+msgid "Transpose key according to segment transposition"
+msgstr "Transponiere die Tonart gemäß der Segment Transposition"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:126
+msgid "Use specified key. Do not transpose"
+msgstr "Verwende die angegebene Tonart. Transponiere nicht"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:134
+msgid "Apply to current segment only"
+msgstr "Nur auf aktuelles Segment anwenden"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:137
+msgid "Apply to all segments at this time"
+msgstr "Auf alle Segmente zu diesem Zeitpunkt anwenden"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:141
+msgid "Exclude percussion segments"
+msgstr ""
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:155
+msgid "Maintain current accidentals"
+msgstr "Aktuelle Vorzeichen beibehalten"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:158
+msgid "Transpose into this key"
+msgstr "In diese Tonart transponieren"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:331
+msgid "No such key"
+msgstr "Tonart nicht vorhanden"
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:44
+#: ../src/gui/editors/notation/NotationSelector.cpp:118
+msgid "Interpret"
+msgstr "Interpret"
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:50
+msgid "Interpretations to apply"
+msgstr "Anzuwendende Interpretationen"
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:53
+msgid "Apply text dynamics (p, mf, ff etc)"
+msgstr "Dynamik-Vortragszeichen anwenden (p, mf, ff etc.)"
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:55
+msgid "Apply hairpin dynamics"
+msgstr "Crescendo / Decrescendo anwenden"
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:57
+msgid "Stress beats"
+msgstr "Taktschläge betonen"
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:59
+msgid "Articulate slurs, staccato, tenuto etc"
+msgstr "Bögen, Staccato, Tenuto artikulieren"
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:61
+msgid "All available interpretations"
+msgstr "All verfübaren Interpretationen"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:316
+#, fuzzy
+msgid ""
+"Attempted to launch JACK audio daemon failed. Audio will be disabled.\n"
+"Please check configuration (Settings -> Configure Rosegarden -> Audio -> "
+"Startup)\n"
+" and restart."
+msgstr ""
+"Der Versuch, JACK zu starten,ist fehlgeschlagen. Audio wird abgeschaltet."
+"\\n\n"
+"Bitte prüfen Sie die Konfiguration (Einstellungen->Rosegarden einrichten-"
+">Sequncer->Jack Steuerung)\\n\n"
+" und starten Sie erneut."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:325
+msgid "Starting sequencer..."
+msgstr "Sequenzer wird gestartet..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:333
+msgid "Initializing plugin manager..."
+msgstr "Plugin Manager wird initialisiert..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:338
+msgid "Initializing view..."
+msgstr "Ansicht wird initialisiert..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:354
+msgid "Special Parameters"
+msgstr "Spezielle Parameter"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:430
+msgid "Starting sequence manager..."
+msgstr "Sequenz-Manager wird gestartet..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:456
+msgid "Clearing studio data..."
+msgstr "Studio-Daten werden gelöscht..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:475
+#: ../src/gui/editors/notation/NotationView.cpp:558
+msgid "Starting..."
+msgstr "Beginn..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:556
+msgid "Import Rosegarden &Project file..."
+msgstr "Rosegarden &Projekt-Datei importieren..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:560
+msgid "Import &MIDI file..."
+msgstr "&MIDI-Datei importieren..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:564
+msgid "Import &Rosegarden 2.1 file..."
+msgstr "&Rosegarden-2.1-Datei importieren..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:568
+msgid "Import &Hydrogen file..."
+msgstr "&Hydrogen-Datei importieren..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:572
+msgid "Merge &File..."
+msgstr "Datei mischen..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:576
+msgid "Merge &MIDI file..."
+msgstr "&MIDI-Datei mischen..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:580
+msgid "Merge &Rosegarden 2.1 file..."
+msgstr "&Rosegarden 2.1-Datei mischen..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:584
+msgid "Merge &Hydrogen file..."
+msgstr "&Hydrogen-Datei mischen..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:588
+msgid "Export Rosegarden &Project file..."
+msgstr "Rosegarden &Projekt-Datei exportieren..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:592
+msgid "Export &MIDI file..."
+msgstr "&MIDI-Datei exportieren..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:596
+#, fuzzy
+msgid "Export &LilyPond file..."
+msgstr "&Lilypond-Datei exportieren..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:600
+msgid "Export Music&XML file..."
+msgstr "Music&XML-Datei exportieren..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:604
+msgid "Export &Csound score file..."
+msgstr "&Csound-Datei exportieren..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:608
+msgid "Export M&up file..."
+msgstr "M&up-Datei exportieren..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:612
+#: ../src/gui/editors/notation/NotationView.cpp:1500
+#, fuzzy
+msgid "Print &with LilyPond..."
+msgstr "Vorschau mit Lil&yPond..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:616
+#: ../src/gui/editors/notation/NotationView.cpp:1504
+msgid "Preview with Lil&yPond..."
+msgstr "Vorschau mit Lil&yPond..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:620
+msgid "Play&list"
+msgstr "Wiedergabe Liste"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:627
+msgid "Rosegarden &Tutorial"
+msgstr "Rosegarden &Tutorial"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:631
+msgid "&Bug Reporting Guidelines"
+msgstr "Richtlinien für Fehlerberichte"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:645
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:348
+#: ../src/gui/editors/segment/MarkerEditor.cpp:378
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:388
+#: ../src/gui/general/EditViewBase.cpp:190
+#: ../src/gui/studio/BankEditorDialog.cpp:318
+#: ../src/gui/studio/DeviceManagerDialog.cpp:227
+msgid "Und&o"
+msgstr "&Rückgängig"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:651
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:354
+#: ../src/gui/editors/segment/MarkerEditor.cpp:384
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:394
+#: ../src/gui/general/EditViewBase.cpp:196
+#: ../src/gui/studio/BankEditorDialog.cpp:324
+#: ../src/gui/studio/DeviceManagerDialog.cpp:233
+msgid "Re&do"
+msgstr "&Wiederholen"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:665
+#: ../src/gui/editors/notation/NotationView.cpp:2297
+msgid "Show T&ools Toolbar"
+msgstr "&Werkzeug-Werkzeugleiste anzeigen"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:669
+msgid "Show Trac&ks Toolbar"
+msgstr "&Spuren-Werkzeugleiste anzeigen"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:673
+msgid "Show &Editors Toolbar"
+msgstr "&Editor-Werkzeugleiste anzeigen"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:677
+#: ../src/gui/editors/notation/NotationView.cpp:2309
+msgid "Show Trans&port Toolbar"
+msgstr "&Bedienfeld-Werkzeugleiste anzeigen"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:681
+msgid "Show &Zoom Toolbar"
+msgstr "&Zoom-Werkzeugleiste anzeigen"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:688
+msgid "Show Tra&nsport"
+msgstr "Bedienfeld anzeigen"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:693
+msgid "Show Track &Labels"
+msgstr "Tonspur-&Labels anzeigen"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:698
+msgid "Show Playback Position R&uler"
+msgstr "Wiedegabepositionslineal anzeigen"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:703
+msgid "Show Te&mpo Ruler"
+msgstr "Te&mpolineal anzeigen"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:708
+msgid "Show Cho&rd Name Ruler"
+msgstr "Ak&kordnamenlineal anzeigen"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:714
+msgid "Show Segment Pre&views"
+msgstr "Segment-&Vorschauen anzeigen"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:719
+msgid "Show Special &Parameters"
+msgstr "Spezielle Parameter anzeigen"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:753
+#: ../src/gui/editors/matrix/MatrixView.cpp:641
+#: ../src/gui/editors/notation/NotationView.cpp:1772
+msgid "&Select and Edit"
+msgstr "Aus&wählen und editieren"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:758
+#: ../src/gui/editors/matrix/MatrixView.cpp:646
+msgid "&Draw"
+msgstr "&Zeichnen"
+
+#: ../src/commands/edit/EraseCommand.h:50
+#: ../src/gui/application/RosegardenGUIApp.cpp:763
+#: ../src/gui/editors/matrix/MatrixView.cpp:651
+#: ../src/gui/editors/notation/NotationView.cpp:1766
+msgid "&Erase"
+msgstr "&Löschen"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:768
+#: ../src/gui/editors/matrix/MatrixView.cpp:656
+msgid "&Move"
+msgstr "&Bewegen"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:775
+msgid "&Resize"
+msgstr "&Größe verändern"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:782 rc.cpp:87
+#, no-c-format
+msgid "&Split"
+msgstr "Auf&teilen"
+
+#: ../src/commands/segment/SegmentJoinCommand.h:53
+#: ../src/gui/application/RosegardenGUIApp.cpp:789
+msgid "&Join"
+msgstr "&Verbinden"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:795
+msgid "&Harmonize"
+msgstr "&Harmonisieren"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:806
+#: ../src/gui/rulers/TempoRuler.cpp:157
+msgid "Open Tempo and Time Signature Editor"
+msgstr "Tempo- und Taktarteditor öffnen"
+
+#: ../src/commands/segment/CutRangeCommand.cpp:41
+#: ../src/gui/application/RosegardenGUIApp.cpp:812
+msgid "Cut Range"
+msgstr "Bereich schneiden"
+
+#: ../src/commands/edit/CopyCommand.cpp:73
+#: ../src/gui/application/RosegardenGUIApp.cpp:816
+msgid "Copy Range"
+msgstr "Bereich kopieren"
+
+#: ../src/commands/segment/PasteRangeCommand.cpp:45
+#: ../src/gui/application/RosegardenGUIApp.cpp:820
+msgid "Paste Range"
+msgstr "Bereich einfügen"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:828
+#, fuzzy
+msgid "Insert Range..."
+msgstr "Pause einfügen"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:832
+#: ../src/gui/editors/notation/NotationView.cpp:1804
+msgid "De&lete"
+msgstr "&Löschen"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:836
+msgid "Select &All Segments"
+msgstr "&Alle Segmente auswählen"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:852
+msgid "Edit Mar&kers..."
+msgstr "Mar&ker editieren..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:856
+msgid "Edit Document P&roperties..."
+msgstr "&Dokumenteigenschaften bearbeiten..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:864
+msgid "Open in &Default Editor"
+msgstr "Im &Standardeditor öffnen"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:870
+#: ../src/gui/general/EditViewBase.cpp:206
+msgid "Open in Matri&x Editor"
+msgstr "Im &Matrixeditor öffnen"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:876
+#: ../src/gui/general/EditViewBase.cpp:212
+msgid "Open in &Percussion Matrix Editor"
+msgstr "Im &Percussion Matrix Editor öffnen"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:882
+#: ../src/gui/general/EditViewBase.cpp:218
+msgid "Open in &Notation Editor"
+msgstr "Im &Notationseditor öffnen"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:888
+#: ../src/gui/general/EditViewBase.cpp:224
+msgid "Open in &Event List Editor"
+msgstr "Im &Evenlisteneditor öffnen"
+
+#: ../src/commands/edit/EventQuantizeCommand.cpp:120
+#: ../src/commands/edit/EventUnquantizeCommand.cpp:87
+#: ../src/gui/application/RosegardenGUIApp.cpp:894
+msgid "&Quantize..."
+msgstr "Quantisieren..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:908
+#: ../src/gui/editors/matrix/MatrixView.cpp:686
+msgid "Repeat Last Quantize"
+msgstr "Letzte Quantisierung wiederholen"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:928
+msgid "Split at Time..."
+msgstr "Am Zeitpunkt aufteilen..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:932
+#: ../src/gui/general/EditView.cpp:796
+msgid "Jog &Left"
+msgstr "Jog nach &links"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:936
+#: ../src/gui/general/EditView.cpp:800
+msgid "Jog &Right"
+msgstr "Jog nach &rechts"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:940
+msgid "Set Start Time..."
+msgstr "Anfangszeit setzen..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:944
+msgid "Set Duration..."
+msgstr "Dauer festlegen ..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:953
+msgid "Turn Re&peats into Copies"
+msgstr "&Wiederholungen in Kopien umwandeln"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:958
+msgid "Manage Tri&ggered Segments"
+msgstr "Getri&ggerte Segmente verwalten"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:962
+msgid "Set Tempos from &Beat Segment"
+msgstr "Tempi vom Beat-Segment setzen"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:966
+msgid "Set &Tempo to Audio Segment Duration"
+msgstr "&Tempo auf Audiosegmentdauer setzen"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:972
+msgid "Manage A&udio Files"
+msgstr "A&udiodateien verwalten"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:977
+msgid "Show Segment Labels"
+msgstr "Zeige Segment-Label"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:986
+msgid "Add &Track"
+msgstr "Spur hinzufügen..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:990
+msgid "&Add Tracks..."
+msgstr "Mehrere Spuren hinzufügen..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:996
+msgid "D&elete Track"
+msgstr "Spur &löschen"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1002
+msgid "Move Track &Down"
+msgstr "Spur nach &unten bewegen"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1008
+msgid "Move Track &Up"
+msgstr "Spur nach &oben bewegen"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1012
+msgid "Select &Next Track"
+msgstr "&Nächste Spur auswählen"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1017
+msgid "Select &Previous Track"
+msgstr "&Vorherige Spur auswählen"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1022
+msgid "Mute or Unmute Track"
+msgstr "Spur stummschalten oder lautschalten"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1027
+msgid "Arm or Un-arm Track for Record"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1034
+msgid "&Mute all Tracks"
+msgstr "Alle Spuren stumm"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1040
+msgid "&Unmute all Tracks"
+msgstr "Alle Spuren an"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1044
+msgid "&Remap Instruments..."
+msgstr "Instrumente &neu zuordnen..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1053
+msgid "&Audio Mixer"
+msgstr "&Audio Mixer"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1059
+msgid "Midi Mi&xer"
+msgstr "Midi Mi&xer"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1065
+msgid "Manage MIDI &Devices"
+msgstr "MIDI-Geräte verwalten... "
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1071
+msgid "Manage S&ynth Plugins"
+msgstr "S&ynth Plugins verwalten"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1075
+msgid "Modify MIDI &Filters"
+msgstr "MIDI-&Filter ändern..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1079
+msgid "MIDI Thru Routing"
+msgstr "MIDI Thru Routing"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1085
+msgid "Manage &Metronome"
+msgstr "Verwalte &Metronom"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1089
+msgid "&Save Current Document as Default Studio"
+msgstr "Aktuelles Dokument als &Standardstudio speichern"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1093
+msgid "&Import Default Studio"
+msgstr "&Importiere Standardstudio"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1097
+msgid "Im&port Studio from File..."
+msgstr "Im&portiereStudio aus Datei..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1101
+msgid "&Reset MIDI Network"
+msgstr "MIDI Netzwerk zu&rücksetzen"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1105
+msgid "Set Quick Marker at Playback Position"
+msgstr "Setze eine Markierung an der Wiedergabeposition"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1109
+msgid "Jump to Quick Marker"
+msgstr "Springe zur Markierung "
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1142
+#: ../src/gui/editors/matrix/MatrixView.cpp:782
+#: ../src/gui/editors/notation/NotationView.cpp:2397
+#: ../src/gui/studio/AudioMixerWindow.cpp:105
+#: ../src/gui/studio/MidiMixerWindow.cpp:81
+msgid "&Play"
+msgstr "&Wiedergabe"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1153
+#: ../src/gui/editors/matrix/MatrixView.cpp:791
+#: ../src/gui/editors/notation/NotationView.cpp:2406
+#: ../src/gui/studio/AudioMixerWindow.cpp:114
+#: ../src/gui/studio/MidiMixerWindow.cpp:90
+msgid "&Stop"
+msgstr "&Stop"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1160
+#: ../src/gui/editors/matrix/MatrixView.cpp:802
+#: ../src/gui/editors/notation/NotationView.cpp:2417
+#: ../src/gui/studio/AudioMixerWindow.cpp:125
+#: ../src/gui/studio/MidiMixerWindow.cpp:101
+msgid "&Fast Forward"
+msgstr "&Vorspulen"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1168
+#: ../src/gui/editors/matrix/MatrixView.cpp:796
+#: ../src/gui/editors/notation/NotationView.cpp:2411
+#: ../src/gui/studio/AudioMixerWindow.cpp:119
+#: ../src/gui/studio/MidiMixerWindow.cpp:95
+msgid "Re&wind"
+msgstr "&Zurückspulen"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1175
+msgid "P&unch in Record"
+msgstr "P&unch-In-Aufnahme"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1182
+#: ../src/gui/studio/AudioMixerWindow.cpp:143
+#: ../src/gui/studio/MidiMixerWindow.cpp:119
+msgid "&Record"
+msgstr "&Aufnehmen"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1189
+#: ../src/gui/editors/matrix/MatrixView.cpp:808
+#: ../src/gui/editors/notation/NotationView.cpp:2423
+#: ../src/gui/studio/AudioMixerWindow.cpp:131
+#: ../src/gui/studio/MidiMixerWindow.cpp:107
+msgid "Rewind to &Beginning"
+msgstr "Zum &Anfang spulen"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1196
+#: ../src/gui/editors/matrix/MatrixView.cpp:814
+#: ../src/gui/editors/notation/NotationView.cpp:2429
+#: ../src/gui/studio/AudioMixerWindow.cpp:137
+#: ../src/gui/studio/MidiMixerWindow.cpp:113
+msgid "Fast Forward to &End"
+msgstr "Zum &Ende spulen"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1203
+#: ../src/gui/editors/matrix/MatrixView.cpp:832
+#: ../src/gui/editors/notation/NotationView.cpp:2447
+msgid "Scro&ll to Follow Playback"
+msgstr "Ansicht fo&lgt der Wiedergabe"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1209
+#: ../src/gui/editors/matrix/MatrixView.cpp:838
+#: ../src/gui/editors/notation/NotationView.cpp:2453
+#: ../src/gui/studio/AudioMixerWindow.cpp:149
+#: ../src/gui/studio/MidiMixerWindow.cpp:125
+msgid "Panic"
+msgstr "Panik"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1213
+msgid "Segment Debug Dump "
+msgstr "Segment Debug Dump "
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1283
+msgid " Zoom: "
+msgstr " Zoom: "
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1719
+msgid "File \"%1\" does not exist"
+msgstr "Die Datei \"%1\" existiert nicht"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1725
+msgid "File \"%1\" is actually a directory"
+msgstr "Die Datei \"%1\" ist ein Verzeichnis"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1734
+msgid "You do not have read permission for \"%1\""
+msgstr "Sie haben für diese Datei keinen Lesezugriff."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1802
+msgid ""
+"An auto-save file for this document has been found\n"
+"Do you want to open it instead ?"
+msgstr ""
+"Es wurde eine automatische Sicherung für diese Datei gefunden.\n"
+"Wollen Sie diese stattdessen öffnen?"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1896
+msgid "Example Files"
+msgstr "Beispiel Dateien"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2100
+msgid "Opening a new application window..."
+msgstr "Neues Anwendungsfenster öffnen..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2110
+msgid "Creating new document..."
+msgstr "Neues Dokument erzeugen..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2154
+#, c-format
+msgid ""
+"Malformed URL\n"
+"%1"
+msgstr ""
+"Formal falsche URL\n"
+"%1"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2179
+#: ../src/gui/application/RosegardenGUIApp.cpp:2240
+msgid "Opening file..."
+msgstr "Datei öffnen..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2201
+#: ../src/gui/application/RosegardenGUIApp.cpp:2220
+msgid "Open File"
+msgstr "Datei öffnen"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1225
+#: ../src/gui/application/RosegardenGUIApp.cpp:2258
+msgid "Saving file..."
+msgstr "Datei speichern..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2330
+msgid "This is not a valid filename.\n"
+msgstr "Dies ist kein gültiger Dateiname.\n"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2335
+msgid "This is not a local file.\n"
+msgstr "Dies ist keine lokale Datei.\n"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2342
+#: ../src/gui/studio/BankEditorDialog.cpp:1640
+#: ../src/gui/studio/DeviceManagerDialog.cpp:787
+msgid "You have specified a directory"
+msgstr "Sie haben ein Verzeichnis angegeben "
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2348
+#: ../src/gui/studio/BankEditorDialog.cpp:1646
+#: ../src/gui/studio/DeviceManagerDialog.cpp:793
+msgid "The specified file exists. Overwrite?"
+msgstr "Die angegebene Datei existiert schon. Überschreiben?"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2362
+msgid "Saving file with a new filename..."
+msgstr "Datei wird mit neuem Namen gespeichert..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2364
+#, fuzzy
+msgid "Rosegarden files"
+msgstr "Rosegarde-4-Dateien"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2365
+#: ../src/gui/application/RosegardenGUIApp.cpp:4860
+#: ../src/gui/application/RosegardenGUIApp.cpp:4904
+#: ../src/gui/application/RosegardenGUIApp.cpp:4942
+#: ../src/gui/application/RosegardenGUIApp.cpp:4975
+#: ../src/gui/application/RosegardenGUIApp.cpp:5009
+#: ../src/gui/application/RosegardenGUIApp.cpp:5116
+msgid "All files"
+msgstr "Alle Dateien"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2366
+msgid "Save as..."
+msgstr "Speichern unter..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2404
+msgid "Closing file..."
+msgstr "Datei wird geschlossen..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2421
+#: ../src/gui/editors/notation/NotationView.cpp:4618
+msgid "Printing..."
+msgstr "Drucken..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2433
+#: ../src/gui/editors/notation/NotationView.cpp:4635
+msgid "Previewing..."
+msgstr "Vorschau..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2440
+msgid "Exiting..."
+msgstr "Programm wird beendet..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2463
+msgid "Cutting selection..."
+msgstr "Auswahl wird ausgeschnitten..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2474
+#: ../src/gui/editors/matrix/MatrixView.cpp:1614
+#: ../src/gui/editors/notation/NotationView.cpp:4763
+msgid "Copying selection to clipboard..."
+msgstr "Auswahl in die Zwischenablage kopieren..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2484
+#: ../src/gui/editors/eventlist/EventView.cpp:878
+#: ../src/gui/editors/matrix/MatrixView.cpp:1625
+#: ../src/gui/editors/notation/NotationView.cpp:4796
+#: ../src/gui/editors/notation/NotationView.cpp:4841
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:352
+msgid "Clipboard is empty"
+msgstr "Die Zwischenablage ist leer"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2487
+#: ../src/gui/editors/eventlist/EventView.cpp:882
+#: ../src/gui/editors/matrix/MatrixView.cpp:1629
+#: ../src/gui/editors/notation/NotationView.cpp:4804
+#: ../src/gui/editors/notation/NotationView.cpp:4845
+msgid "Inserting clipboard contents..."
+msgstr "Inhalt der Zwischenablage einfügen..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2556
+#, fuzzy
+msgid "Duration of empty range to insert"
+msgstr "Dauer der Selektion"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2631
+msgid "This function needs no more than one segment to be selected."
+msgstr "Für diese Funktion darf nur ein einziges Segment ausgewählt sein."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2654
+msgid "Can't join Audio segments"
+msgstr "Audio-Segmente können nicht zusammengefasst werden"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2707
+#, fuzzy
+msgid "rescaling an audio file"
+msgstr "Audiodatei wird abgespielt"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2723
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:172
+#, fuzzy
+msgid "Rescaling audio file..."
+msgstr "Audiodatei wird exportiert..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2767
+#, fuzzy
+msgid ""
+"The audio file path does not exist or is not writable.\n"
+"You must set the audio file path to a valid directory in Document Properties "
+"before %1.\n"
+"Would you like to set it now?"
+msgstr ""
+"Der angegebene Audio-Dateipfad existiert entweder nicht oder ist nicht "
+"schreibbar.\n"
+"Bitte setzen Sie den Audio-Dateipfad auf ein gültiges Verzeichnis in dem\n"
+"Dokumenteigenschaften bevor Sie Audio aufnehmen.\n"
+"Möchten Sie den Pfad jetzt setzen?"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2769
+#: ../src/gui/application/RosegardenGUIApp.cpp:5291
+#: ../src/gui/application/RosegardenGUIApp.cpp:5339
+#: ../src/gui/editors/segment/TrackButtons.cpp:419
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:159
+msgid "Set audio file path"
+msgstr "Pfad für Audiodateien"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2833
+msgid "Jog Selection"
+msgstr "Auswahl joggen"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2978
+#, fuzzy, c-format
+msgid ""
+"_n: Split Segment at Time\n"
+"Split %n Segments at Time"
+msgstr ""
+"%1 - Segment - Notation\n"
+"%1 - %n Segmente - Notation"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3013
+#: ../src/gui/general/EditViewBase.cpp:619
+msgid "Segment Start Time"
+msgstr "Segment Anfangszeit"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3023
+msgid "Set Segment Start Times"
+msgstr "Segment Anfangszeiten setzen"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3024
+#: ../src/gui/general/EditViewBase.cpp:626
+msgid "Set Segment Start Time"
+msgstr "Segment Anfangszeit setzen"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3056
+#: ../src/gui/general/EditViewBase.cpp:644
+msgid "Segment Duration"
+msgstr "Segment Dauer"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3068
+msgid "Set Segment Durations"
+msgstr "Segmentlängen setzen"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3069
+#: ../src/gui/general/EditViewBase.cpp:652
+msgid "Set Segment Duration"
+msgstr "Segment Dauer setzen"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3176
+#: ../src/gui/application/RosegardenGUIApp.cpp:5875
+msgid "Set Global Tempo"
+msgstr "Globales Tempe setzen"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3234
+#: ../src/gui/general/EditViewBase.cpp:477
+msgid "Toggle the toolbar..."
+msgstr "Toolbar umschalten..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3244
+msgid "Toggle the tools toolbar..."
+msgstr "Werkzeug-Werkzeugleiste umschalten..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3254
+msgid "Toggle the tracks toolbar..."
+msgstr "Spur-Toolbar umschalten..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3264
+msgid "Toggle the editor toolbar..."
+msgstr "Editor-Toolbar umschalten..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3274
+msgid "Toggle the transport toolbar..."
+msgstr "Bedienfeld-Werkzeugleiste umschalten..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3284
+msgid "Toggle the zoom toolbar..."
+msgstr "Zoom-Werkzeugleiste umschalten..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3294
+msgid "Toggle the Transport"
+msgstr "Bedienfeld umschalten"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3377
+#: ../src/gui/general/EditViewBase.cpp:487
+msgid "Toggle the statusbar..."
+msgstr "Statuszeile umschalten..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3434
+msgid ""
+"The join tool isn't implemented yet. Instead please highlight the segments "
+"you want to join and then use the menu option:\n"
+"\n"
+" Segments->Collapse Segments.\n"
+msgstr ""
+"Das Verbinden-Werkzeug ist noch nicht programmiert. Bitte markieren Sie "
+"stattdessen die Segmente,\n"
+" die Sie verbinden wollen und benutzen dann die Menüoption:\\n\n"
+"Segmente->Segmente zusammenfassen.\n"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3437
+msgid "Join tool not yet implemented"
+msgstr "Das Verbinden-Werkzeug ist noch nicht fertig."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3675
+msgid "Revert modified document to previous saved version?"
+msgstr "Geändertes Dokument auf vorher gespeicherte Version zurücksetzen?"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3691
+msgid ""
+"*.rgp|Rosegarden Project files\n"
+"*|All files"
+msgstr ""
+"*.rgp|Rosegarden Projekt Dateien\n"
+"*|Alle Dateien"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3692
+msgid "Import Rosegarden Project File"
+msgstr "Rosegarden Projekt-Datei importieren"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3717
+msgid "Failed to import project file \"%1\""
+msgstr "Import der Projektdatei \"%1\" fehlgeschlagen"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3739
+msgid "Open MIDI File"
+msgstr "MIDI-Datei öffnen"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3756
+msgid "Merge MIDI File"
+msgstr "MIDI-Datei mischen"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3866
+msgid "Importing MIDI file..."
+msgstr "MIDI-Datei wird importiert..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3903
+msgid "Calculating notation..."
+msgstr "Notation wird berechnet..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3950
+msgid "Calculate Notation"
+msgstr "Notation errechnen"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3991
+#: ../src/gui/application/RosegardenGUIApp.cpp:4008
+msgid ""
+"*.rose|Rosegarden-2 files\n"
+"*|All files"
+msgstr ""
+"*.rose|Rosegarden-2 Dateien\n"
+"*|Alle Dateien"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3992
+#: ../src/gui/application/RosegardenGUIApp.cpp:4009
+msgid "Open Rosegarden 2.1 File"
+msgstr "Rosegarden 2.1-Datei öffnen"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4026
+msgid "Importing Rosegarden 2.1 file..."
+msgstr "Rosegarden.2.1-Datei wird importiert..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4052
+msgid "Can't load Rosegarden 2.1 file. It appears to be corrupted."
+msgstr ""
+"Diese Rosegarden-2.1-Datei kann nicht geladen werden. Sie scheint beschädigt "
+"zu sein."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4078
+#: ../src/gui/application/RosegardenGUIApp.cpp:4095
+msgid ""
+"*.h2song|Hydrogen files\n"
+"*|All files"
+msgstr ""
+"*.h2song|Hydrogen Dateien\n"
+"*|Alle Dateien"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4079
+#: ../src/gui/application/RosegardenGUIApp.cpp:4096
+msgid "Open Hydrogen File"
+msgstr "Hydrogen Datei öffnen"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4113
+msgid "Importing Hydrogen file..."
+msgstr "Hydrogen Datei wird importiert..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4139
+msgid "Can't load Hydrogen file. It appears to be corrupted."
+msgstr ""
+"Diese Hydrogen Datei kann nicht geladen werden. Sie scheint beschädigt zu "
+"sein."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4527
+msgid "Export and import of Rosegarden Project files"
+msgstr "Export und Import von Rosegarden Projektdateien..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4529
+#, fuzzy
+msgid "The Rosegarden Project Packager helper script"
+msgstr "Rosegarde Projekt Dateien\n"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4533
+msgid "%1 - for project file support"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4550
+msgid "The Rosegarden LilyPondView helper script"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4554
+#, fuzzy
+msgid "%1 - for LilyPond preview support"
+msgstr "LilyPond-Vorschau Einstellungen"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4570
+msgid "The Rosegarden Audio File Importer helper script"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4574
+#, fuzzy
+msgid "%1 - for audio file import"
+msgstr "Pfad für Audiodateien"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4585
+msgid ""
+"<h3>Helper programs not found</h3><p>Rosegarden could not find one or more "
+"helper programs which it needs to provide some features. The following "
+"features will not be available:</p>"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4586
+#: ../src/gui/application/RosegardenGUIApp.cpp:4592
+#, fuzzy
+msgid "<ul>"
+msgstr "<Standard>"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4588
+#: ../src/gui/application/RosegardenGUIApp.cpp:4594
+#, fuzzy
+msgid "<li>%1</li>"
+msgstr "-- %1 (von %2)\n"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4590
+#: ../src/gui/application/RosegardenGUIApp.cpp:4596
+msgid "</ul>"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4591
+msgid ""
+"<p>To fix this, you should install the following additional programs:</p>"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4603
+msgid "Helper programs not found"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4686
+msgid "Starting the sequencer..."
+msgstr "Sequencer wird gestartet..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4712
+msgid "Couldn't start the sequencer"
+msgstr "Sequencer konnte nicht gestartet werden"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4789
+msgid "Clearing down jackd..."
+msgstr "jackd wird heruntergefahren..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4803
+msgid "Starting jackd..."
+msgstr "jackd wird gestartet..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4842
+msgid ""
+"The Rosegarden sequencer process has exited unexpectedly. Sound and "
+"recording will no longer be available for this session.\n"
+"Please exit and restart Rosegarden to restore sound capability."
+msgstr ""
+"Der Rosegarden Sequenzer Process ist unerwartet abgebrochen. Aufnahme und "
+"Wiedergabe stehen in dieser Sitzung nicht mehr zur Verfügung.\n"
+"Bitte Beenden und erneut Starten, damit der Ton wieder funktioniert."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4846
+msgid ""
+"The Rosegarden sequencer could not be started, so sound and recording will "
+"be unavailable for this session.\n"
+"For assistance with correct audio and MIDI configuration, go to http://"
+"rosegardenmusic.com."
+msgstr ""
+"Der Rosegarden Sequenzer konnte nicht gestartet werden. Damit stehen "
+"Aufnahme und Wiedergabe in dieser Sitzung nicht zur Verfügung.\n"
+"Für Hilfestellung bei den Audio und MIDI-Einstellungen gehe nach http://"
+"rosegardenmusic.com."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4856
+msgid "Exporting Rosegarden Project file..."
+msgstr "Rosegarden Projekt Datei wird importiert..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4859
+msgid "Rosegarden Project files\n"
+msgstr "Rosegarde Projekt Dateien\n"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4861
+#: ../src/gui/application/RosegardenGUIApp.cpp:4905
+#: ../src/gui/application/RosegardenGUIApp.cpp:4943
+#: ../src/gui/application/RosegardenGUIApp.cpp:4976
+#: ../src/gui/application/RosegardenGUIApp.cpp:5010
+#: ../src/gui/application/RosegardenGUIApp.cpp:5116
+msgid "Export as..."
+msgstr "Exportieren als..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4875
+#, c-format
+msgid "Saving Rosegarden file to package failed: %1"
+msgstr "Speichern der Rosegarden-Datei beim Komprimieren fehlgeschlagen: %1"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4889
+msgid "Failed to export to project file \"%1\""
+msgstr "Export der Projekt-Datei \"%1\" fehlgeschlagen"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4900
+#: ../src/gui/application/RosegardenGUIApp.cpp:4915
+msgid "Exporting MIDI file..."
+msgstr "MIDI-Datei wird exportiert..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4903
+msgid "Standard MIDI files\n"
+msgstr "Standard-MIDI-Dateien\n"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4934
+#: ../src/gui/application/RosegardenGUIApp.cpp:4966
+#: ../src/gui/application/RosegardenGUIApp.cpp:4999
+#: ../src/gui/application/RosegardenGUIApp.cpp:5103
+#: ../src/gui/application/RosegardenGUIApp.cpp:5140
+#: ../src/gui/editors/notation/NotationView.cpp:4733
+msgid "Export failed. The file could not be opened for writing."
+msgstr ""
+"Der Export ist fehlgeschlagen. Die Datei konnte nicht zum Schreiben geöffnet "
+"werden."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4940
+#: ../src/gui/application/RosegardenGUIApp.cpp:4952
+msgid "Exporting Csound score file..."
+msgstr "Csound-Partitur-Datei wird exportiert..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4972
+#: ../src/gui/application/RosegardenGUIApp.cpp:4985
+msgid "Exporting Mup file..."
+msgstr "Mup-Datei wird exportiert..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4975
+msgid "Mup files\n"
+msgstr "Mup-Dateien\n"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5005
+#: ../src/gui/application/RosegardenGUIApp.cpp:5089
+#: ../src/gui/editors/notation/NotationView.cpp:4719
+#, fuzzy
+msgid "Exporting LilyPond file..."
+msgstr "LilyPond-Datei wird exportiert..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5008
+#, fuzzy
+msgid "LilyPond files"
+msgstr "LilyPond-Dateien"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5023
+#: ../src/gui/editors/notation/NotationView.cpp:4653
+#, fuzzy
+msgid "Printing LilyPond file..."
+msgstr "Vorschau der LilyPond-Datei..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5028
+#: ../src/gui/application/RosegardenGUIApp.cpp:5052
+#: ../src/gui/editors/notation/NotationView.cpp:4658
+#: ../src/gui/editors/notation/NotationView.cpp:4682
+#, fuzzy
+msgid "Failed to open a temporary file for LilyPond export."
+msgstr "Anlegen der temporären Datei für den LilyPond-Export fehlgeschlagen."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5047
+#: ../src/gui/editors/notation/NotationView.cpp:4677
+#, fuzzy
+msgid "Previewing LilyPond file..."
+msgstr "Vorschau der LilyPond-Datei..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5080
+#: ../src/gui/editors/notation/NotationView.cpp:4710
+#, fuzzy
+msgid "LilyPond Preview Options"
+msgstr "LilyPond-Vorschau Einstellungen"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5081
+#: ../src/gui/editors/notation/NotationView.cpp:4711
+#, fuzzy
+msgid "LilyPond preview options"
+msgstr "LilyPond-Vorschau Einstellungen"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5112
+#: ../src/gui/application/RosegardenGUIApp.cpp:5126
+msgid "Exporting MusicXML file..."
+msgstr "MusicXML-Datei wird exportiert..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5115
+msgid "XML files"
+msgstr "XML-Dateien"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5289
+#: ../src/gui/editors/segment/TrackButtons.cpp:417
+msgid ""
+"The audio file path does not exist or is not writable.\n"
+"Please set the audio file path to a valid directory in Document Properties "
+"before recording audio.\n"
+"Would you like to set it now?"
+msgstr ""
+"Der angegebene Audio-Dateipfad existiert entweder nicht oder ist nicht "
+"schreibbar.\n"
+"Bitte setzen Sie den Audio-Dateipfad auf ein gültiges Verzeichnis in dem\n"
+"Dokumenteigenschaften bevor Sie Audio aufnehmen.\n"
+"Möchten Sie den Pfad jetzt setzen?"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5337
+msgid ""
+"The audio file path does not exist or is not writable.\n"
+"Please set the audio file path to a valid directory in Document Properties "
+"before you start to record audio.\n"
+"Would you like to set it now?"
+msgstr ""
+"Der angegebene Audio-Dateipfad existiert entweder nicht oder ist nicht "
+"schreibbar.\n"
+"Bitte setzen Sie den Audio-Dateipfad auf ein gültiges Verzeichnis in dem\n"
+"Dokumenteigenschaften bevor Sie Audio aufnehmen.\n"
+"Möchten Sie den Pfad jetzt setzen?"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5780
+msgid "Move playback pointer to time"
+msgstr "Wiedergabezeiger zu einer &Zeit bewegen"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5793
+#: ../src/gui/editors/matrix/MatrixView.cpp:2240
+msgid "%1%"
+msgstr "%1%"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5861
+#, c-format
+msgid "Replace Tempo Change at %1"
+msgstr "Tempoveränderung ersetzen bei %1"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5891
+msgid "Set Global and Default Tempo"
+msgstr "Globales und Standard-Tempo setzen"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5914
+msgid "Move Tempo Change"
+msgstr "&Tempoveränderung verschieben..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5949
+msgid "new marker"
+msgstr "Neue Markierung"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5950
+msgid "no description"
+msgstr "Keine Beschreibung"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:6363
+#, c-format
+msgid "Sequencer failed to add audio file %1"
+msgstr "Der Sequenzer konnte die Audio-Datei %1 nicht hinzufügen"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:6388
+#, c-format
+msgid "Sequencer failed to remove audio file id %1"
+msgstr "Der Sequenzer konnte die Audio-Datei %1 nicht entfernen"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:6448
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:1086
+msgid "Modify Segment label"
+msgstr "Segmentbezeichnung ändern"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:6450
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:1088
+msgid "Modify Segments label"
+msgstr "Segmentbezeichnungen ändern"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:6452
+msgid "Relabelling selection..."
+msgstr "Auswahl umbenennen..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7539
+msgid "Play List"
+msgstr "Liste Abspielen "
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7567
+msgid "http://rosegarden.sourceforge.net/tutorial/en/chapter-0.html"
+msgstr "http://rosegarden.sourceforge.net/tutorial/en/chapter-0.html"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7574
+msgid "http://rosegarden.sourceforge.net/tutorial/bug-guidelines.html"
+msgstr "http://rosegarden.sourceforge.net/tutorial/bug-guidelines.html"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7650
+msgid "Queueing MIDI panic events for tranmission..."
+msgstr "MIDI Oanik Event in Transmissionswarteschlange eingestellt...."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7708
+msgid "Are you sure you want to save this as your default studio?"
+msgstr ""
+"Sind Sie sicher, dass Sie dies als Ihr Standardstudio speichern wollen?"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7713
+msgid "Saving current document as default studio..."
+msgstr "Aktuelles Dokument wird als Standartstudio gespeichert..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7738
+msgid ""
+"Are you sure you want to import your default studio and lose the current one?"
+msgstr ""
+"Sind Sie sicher dass Sie Ihr Standardstudio importieren und dabei das "
+"Aktuelle überschreiben wollen?"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7773
+msgid "Import Studio from File"
+msgstr "Studio aus Datei importieren"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7807
+msgid "Import Studio"
+msgstr "Studio importieren"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:8015
+msgid ""
+"<h3>Newer version available</h3><p>A newer version of Rosegarden may be "
+"available.<br>Please consult the <a href=\"http://www.rosegardenmusic.com/"
+"getting/\">Rosegarden website</a> for more information.</p>"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:8016
+msgid "Newer version available"
+msgstr "Eine neuere Version ist verfügbar"
+
+#: ../src/gui/application/RosegardenApplication.cpp:104
+#, c-format
+msgid "Failed to load soundfont %1"
+msgstr "Laden von Soundfont nicht gelungen: %1"
+
+#: ../src/gui/application/main.cpp:311
+msgid "Rosegarden - A sequencer and musical notation editor"
+msgstr "Rosegarden - ein Sequenzer und Notationseditor"
+
+#: ../src/gui/application/main.cpp:315
+msgid "Don't use the sequencer (support editing only)"
+msgstr "Sequenzer nicht verwenden (nur editieren möglich)"
+
+#: ../src/gui/application/main.cpp:316
+msgid "Don't show the splash screen"
+msgstr "Kein Startbild"
+
+#: ../src/gui/application/main.cpp:317
+msgid "Don't automatically run in the background"
+msgstr "Laufe nicht automatisch im Hintergrund"
+
+#: ../src/gui/application/main.cpp:318
+msgid "Attach to a running sequencer process, if found"
+msgstr "In einen laufenden Sequenzer einklicken, falls vorhanden"
+
+#: ../src/gui/application/main.cpp:319
+msgid "Ignore installed version - for devs only"
+msgstr "Ignoriere installierte Version - nur für Entwickler"
+
+#: ../src/gui/application/main.cpp:320
+msgid "file to open"
+msgstr "zu öffnende Datei"
+
+#: ../src/gui/application/main.cpp:370
+msgid "Installation contains the wrong version of Rosegarden."
+msgstr "Die Installation enthält die falsche Rosegarden-Version."
+
+#: ../src/gui/application/main.cpp:371
+#, fuzzy
+msgid ""
+" The wrong versions of Rosegarden's data files were\n"
+" found in the standard KDE installation directories.\n"
+" (I am %1, but the installed files are for version %2.)\n"
+"\n"
+" This may mean one of the following:\n"
+"\n"
+" 1. This is a new upgrade of Rosegarden, and it has not yet been\n"
+" installed. If you compiled it yourself, check that you have\n"
+" run \"make install\" and that the procedure completed\n"
+" successfully.\n"
+"\n"
+" 2. The upgrade was installed in a non-standard directory,\n"
+" and an old version was found in a standard directory. If so,\n"
+" you will need to add the correct directory to your KDEDIRS\n"
+" environment variable before you can run it."
+msgstr ""
+" Es wurden falsche Versionen der Rosegarden-Dateien\n"
+" in den Standard-KDE-Verzeichnissen gefunden.\n"
+" (Dies ist Version %1, aber die installierten Dateien sind für Version %2.)\n"
+" Dies könnte folgendes bedeuten:\n"
+" \n"
+" 1. Dies ist eine neue Version von Rosegarden, die noch nicht \n"
+" installiert worden ist. Wenn Sie sie selbst kompiliert haben, prüfen \n"
+" Sie bitte, ob Sie \"scons install\" erfolgreich ausgeführt haben.\n"
+"\n"
+" 2. Die neue Version wurde nicht im Standardverzeichnis installiert,\n"
+" und eine alte Version wurde im Standardverzeichnis gefunden.\n"
+" In diesem Fall müssen Sie das korrekte Verzeichnis zur "
+"Umgebungsvariablen\n"
+" KDEDIRS hinzufügen, damit Rosegarden funktioniert."
+
+#: ../src/gui/application/main.cpp:383 ../src/gui/application/main.cpp:401
+msgid "Installation problem"
+msgstr "Installationsproblem"
+
+#: ../src/gui/application/main.cpp:389
+msgid "Rosegarden does not appear to have been installed."
+msgstr "Rosegarden scheint nicht installiert worden zu sein."
+
+#: ../src/gui/application/main.cpp:390
+#, fuzzy
+msgid ""
+" One or more of Rosegarden's data files could not be\n"
+" found in the standard KDE installation directories.\n"
+"\n"
+" This may mean one of the following:\n"
+"\n"
+" 1. Rosegarden has not been correctly installed. If you compiled\n"
+" it yourself, check that you have run \"make install\" and that\n"
+" the procedure completed successfully.\n"
+"\n"
+" 2. Rosegarden has been installed in a non-standard directory,\n"
+" and you need to add this directory to your KDEDIRS environment\n"
+" variable before you can run it. This may be the case if you\n"
+" installed into $HOME or a local third-party package directory\n"
+" like /usr/local or /opt."
+msgstr ""
+" Mindestens eine der Rosegarden-Dateien wurde nicht\n"
+" in den Standard-KDE-Verzeichnissen gefunden.\n"
+"\n"
+" Dies könnte folgendes bedeuten:\n"
+" \n"
+" 1. Rosegarden wurde nicht korrekt installiert. Wenn Sie es selbst "
+"kompiliert haben,\n"
+" prüfen Sie bitte, ob Sie \"scons install\" erfolgreich ausgeführt "
+"haben.\n"
+"\n"
+" 2. Die neue Version wurde nicht im Standardverzeichnis installiert,\n"
+" und Sie müssen das korrekte Verzeichnis zur Umgebungsvariablen\n"
+" KDEDIRS hinzufügen, damit Rosegarden funktioniert. Dies könnte der Fall "
+"sein,\n"
+" wenn Sie nach $HOME oder in ein lokales Verzeichnis für "
+"Anwenderprogramme\n"
+" wie /usr/local oder /opt installiert haben."
+
+#: ../src/gui/application/main.cpp:414
+msgid "Rosegarden"
+msgstr "Rosegarden"
+
+#: ../src/gui/application/main.cpp:416
+#, fuzzy
+msgid ""
+"Copyright 2000 - 2008 Guillaume Laurent, Chris Cannam, Richard Bown\n"
+"Parts copyright 1994 - 2004 Chris Cannam, Andy Green, Richard Bown, "
+"Guillaume Laurent\n"
+"LilyPond fonts copyright 1997 - 2005 Han-Wen Nienhuys and Jan Nieuwenhuizen"
+msgstr ""
+"Copyright 2000 - 2006 Guillaume Laurent, Chris Cannam, Richard Bown\n"
+"Teile Copyright 1994 - 2004 Chris Cannam, Andy Green, Richard Bown, "
+"Guillaume Laurent\n"
+"LilyPond Schriftarten Copyright 1997 - 2005 Han-Wen Nienhuys und Jan "
+"Nieuwenhuizen"
+
+#: ../src/gui/application/main.cpp:428
+msgid "Chord labelling code"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:429
+#, fuzzy
+msgid ""
+"LilyPond output\n"
+"assorted other patches\n"
+"i18n-ization"
+msgstr ""
+"LilyPond Ausgabe\n"
+"verschiedene andere Patches\n"
+"i18n-ization"
+
+#: ../src/gui/application/main.cpp:430
+msgid ""
+"UI improvements\n"
+"bug fixes"
+msgstr ""
+"UI Verbesserungen\n"
+"Fehlerbeseitigung"
+
+#: ../src/gui/application/main.cpp:431
+msgid ""
+"Segment colours\n"
+"Other UI and bug fixes"
+msgstr ""
+"Segmentfarben\n"
+"Andere UI und sonstige Fehler beseitigt"
+
+#: ../src/gui/application/main.cpp:432
+msgid ""
+"Russian translation\n"
+"i18n-ization"
+msgstr ""
+"Russische Übersetzung\n"
+"i18n-ization"
+
+#: ../src/gui/application/main.cpp:433 ../src/gui/application/main.cpp:434
+msgid "German translation"
+msgstr "Deutsche Übersetzung"
+
+#: ../src/gui/application/main.cpp:435
+msgid "Welsh translation"
+msgstr "Walisische Übersetzung"
+
+#: ../src/gui/application/main.cpp:436
+msgid "French translation"
+msgstr "Französische Übersetzung"
+
+#: ../src/gui/application/main.cpp:437
+#, fuzzy
+msgid ""
+"French translation\n"
+"Bug fixes"
+msgstr "Französische Übersetzung"
+
+#: ../src/gui/application/main.cpp:438 ../src/gui/application/main.cpp:439
+msgid "Italian translation"
+msgstr "Italienische Übersetzung"
+
+#: ../src/gui/application/main.cpp:440 ../src/gui/application/main.cpp:441
+msgid "Swedish translation"
+msgstr "Schwedische Übersetzung"
+
+#: ../src/gui/application/main.cpp:442
+msgid "Estonian translation"
+msgstr "Estnische Übersetzung"
+
+#: ../src/gui/application/main.cpp:443 ../src/gui/application/main.cpp:444
+msgid "Dutch translation"
+msgstr "Niederländische Übersetzung"
+
+#: ../src/gui/application/main.cpp:445
+msgid "HSpinBox class"
+msgstr "HSpinBox Class"
+
+#: ../src/gui/application/main.cpp:446
+msgid "Transposition by interval"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:447
+msgid "Original designs for rotary controllers"
+msgstr "Ursprüngliches Design der Drehknöfpe"
+
+#: ../src/gui/application/main.cpp:448
+msgid "Japanese translation"
+msgstr "Japanische Übersetzung"
+
+#: ../src/gui/application/main.cpp:449
+msgid ""
+"Auto-scroll deceleration\n"
+"Rests outside staves and other bug fixes"
+msgstr ""
+"Autoscroll Abbremsung\n"
+"Pausen ausserhalb von Systemen und andere Fehlerbeseitigung"
+
+#: ../src/gui/application/main.cpp:450
+msgid "Simplified Chinese translation"
+msgstr "Übersetzung in vereinfachtes Chinesisch"
+
+#: ../src/gui/application/main.cpp:451
+msgid "LIRC infrared remote-controller support"
+msgstr "Unterstützung für LIRC Infrarot Fernsteuerung"
+
+#: ../src/gui/application/main.cpp:452
+msgid "MTC slave timing implementation"
+msgstr "MTC-Slave Timing Implementierung"
+
+#: ../src/gui/application/main.cpp:453
+msgid "Czech translation"
+msgstr "Tschechische Übersetzung"
+
+#: ../src/gui/application/main.cpp:454
+msgid "SCons/bksys building system"
+msgstr "SCons/bksys Buildsystem"
+
+#: ../src/gui/application/main.cpp:455
+msgid "icons, icons, icons"
+msgstr "Icons, Icons, Icons"
+
+#: ../src/gui/application/main.cpp:456 ../src/gui/application/main.cpp:457
+#: ../src/gui/application/main.cpp:458 ../src/gui/application/main.cpp:459
+msgid "Spanish translation"
+msgstr "Spanische Übersetzung"
+
+#: ../src/gui/application/main.cpp:460 ../src/gui/application/main.cpp:461
+msgid "Catalan translation"
+msgstr "Katalanische Übersetzung"
+
+#: ../src/gui/application/main.cpp:462
+msgid ""
+"1.2.3 splash screen photo\n"
+"Gave birth to D. Michael McIntyre, bought him a good flute once\n"
+"upon a time, and always humored him when he came over to play her\n"
+"some new instrument, even though she really hated his playing.\n"
+"Born October 19, 1951, died September 21, 2007, R. I. P."
+msgstr ""
+
+#: ../src/gui/application/main.cpp:463
+#, fuzzy
+msgid "Initial guitar chord editing code"
+msgstr "Guitarrenakkord Editor"
+
+#: ../src/gui/application/main.cpp:464
+#, fuzzy
+msgid "Polish translation"
+msgstr "Walisische Übersetzung"
+
+#: ../src/gui/application/main.cpp:465
+#, fuzzy
+msgid "Basque translation"
+msgstr "Japanische Übersetzung"
+
+#: ../src/gui/application/main.cpp:466
+msgid "Klearlook theme"
+msgstr ""
+
+#: ../src/_translatorinfo.cpp:1 ../src/gui/application/main.cpp:468
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr ""
+"Eckhard Jokisch\n"
+"Michael Gerdau"
+
+#: ../src/_translatorinfo.cpp:3 ../src/gui/application/main.cpp:468
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:719
+msgid "Welcome!"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:731
+msgid ""
+"<h2>Welcome to Rosegarden!</h2><p>Welcome to the Rosegarden audio and MIDI "
+"sequencer and musical notation editor.</p><ul><li>If you have not already "
+"done so, you may wish to install some DSSI synth plugins, or a separate "
+"synth program such as QSynth. Rosegarden does not synthesize sounds from "
+"MIDI on its own, so without these you will hear nothing.</"
+"li><br><br><li>Rosegarden uses the JACK audio server for recording and "
+"playback of audio, and for playback from DSSI synth plugins. These features "
+"will only be available if the JACK server is running.</"
+"li><br><br><li>Rosegarden has comprehensive documentation: see the Help menu "
+"for the handbook, tutorials, and other information!</li></ul><p>Rosegarden "
+"was brought to you by a team of volunteers across the world. To learn more, "
+"go to <a href=\"http://www.rosegardenmusic.com/\">http://www.rosegardenmusic."
+"com/</a>.</p>"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIView.cpp:257
+msgid "No non-audio segments in composition"
+msgstr "Keine Nicht-Audiosegmente in diesem Stück."
+
+#: ../src/gui/application/RosegardenGUIView.cpp:333
+msgid "Selection must contain only audio or non-audio segments"
+msgstr "Die Auswahl darf nur Audio- oder Nichtaudiosegmente enthalten"
+
+#: ../src/gui/application/RosegardenGUIView.cpp:431
+#: ../src/gui/application/RosegardenGUIView.cpp:576
+#: ../src/gui/application/RosegardenGUIView.cpp:612
+#: ../src/gui/application/RosegardenGUIView.cpp:776
+msgid "No non-audio segments selected"
+msgstr "Keine Nichtaudiosegmente ausgeählt"
+
+#: ../src/gui/application/RosegardenGUIView.cpp:851
+#, fuzzy
+msgid ""
+"You've not yet defined an audio editor for Rosegarden to use.\n"
+"See Settings -> Configure Rosegarden -> Audio."
+msgstr ""
+"Sie haben bisher noch keinen Audioeditor für Rosegarden festgelegt.\n"
+"Siehe Einstellungen -> Konfiguriere Rosegarden -> Allgemein -> Externe "
+"Editoren."
+
+#: ../src/gui/application/RosegardenGUIView.cpp:1559
+#: ../src/gui/application/RosegardenGUIView.cpp:1564
+msgid "Can't add dropped file. "
+msgstr "Kann entfernte Datei nicht hinzufügen."
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1014
+#: ../src/gui/seqmanager/SequenceManager.cpp:1150
+msgid ""
+"The JACK Audio subsystem has failed or it has stopped Rosegarden from "
+"processing audio.\n"
+"Please restart Rosegarden to continue working with audio.\n"
+"Quitting other running applications may improve Rosegarden's performance."
+msgstr ""
+"Das JACK Audio Subsystem hat eine Fehler gemeldet oder Rosegarden "
+"anderweitig an der Verarbeitung von Audio gehindert.\n"
+"Bitte starten Sie Rosegarden erneut, wenn Sie mit Audio weiterarbeiten "
+"möchten.\n"
+"Das Beenden anderer laufender Anwendung könnte u.U. die Leistung von "
+"Rosegarden verbessern."
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1020
+#: ../src/gui/seqmanager/SequenceManager.cpp:1156
+msgid ""
+"The JACK Audio subsystem has stopped Rosegarden from processing audio, "
+"probably because of a processing overload.\n"
+"An attempt to restart the audio service has been made, but some problems may "
+"remain.\n"
+"Quitting other running applications may improve Rosegarden's performance."
+msgstr ""
+"Das JACK Audio Subsystem hat eine Fehler gemeldet oder Rosegarden "
+"anderweitig an der Verarbeitung von Audio gehindert, möglicherweise wegen "
+"Überlastung.\n"
+"Der Audiodienst wurde neu gestartet, aber ev. sind damit nicht alle Probleme "
+"behoben.\n"
+"Das Beenden anderer laufender Anwendung könnte u.U. die Leistung von "
+"Rosegarden verbessern."
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1031
+msgid ""
+"Run out of processor power for real-time audio processing. Cannot continue."
+msgstr ""
+"Es steht nicht geügend CPU-Leistung für die Echtzeit Audiobearbeitung zur "
+"Verfügung. Kann nicht fortfahren."
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1057
+msgid ""
+"A serious error has occurred in the ALSA MIDI subsystem. It may not be "
+"possible to continue sequencing. Please check console output for more "
+"information."
+msgstr ""
+"Im ALSA MIDI Subsystem ist ein schwerer Fehler aufgetreten. Es könnte sein, "
+"dass weiteres Sequenzing nicht möglich ist. Auf der Konsole finden Sie "
+"vielleicht weitergehende Informationen."
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1078
+msgid "JACK Audio subsystem is losing sample frames."
+msgstr "Das JACK Audio Subsystem verliert Sampleframes."
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1096
+msgid ""
+"Failed to read audio data from disc in time to service the audio subsystem."
+msgstr ""
+"Audiodaten konnten nicht an das Audio Subsystem weiterleitet werden, da sie "
+"nicht schnell genug von der Platte gelesen wurden."
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1100
+msgid ""
+"Failed to write audio data to disc fast enough to service the audio "
+"subsystem."
+msgstr ""
+"Audiodaten konnten nicht vom Audio Subsystem angenommen werden, da sie nicht "
+"schnell genug auf die Platte geschrieben wurden."
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1104
+msgid "The audio mixing subsystem is failing to keep up."
+msgstr "Das Audio Mixer Subsystem kommt nicht mit (ist zu langsam)."
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1108
+msgid "The audio subsystem is failing to keep up."
+msgstr "Das Audio Subsystem kommt nicht mit (ist zu langsam)."
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1112
+msgid "Unknown sequencer failure mode!"
+msgstr "Unbekannter Sequenzer Fehlermodus!"
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1170
+#, fuzzy
+msgid ""
+"<h3>System timer resolution is too low</h3><p>Rosegarden was unable to find "
+"a high-resolution timing source for MIDI performance.</p><p>This may mean "
+"you are using a Linux system with the kernel timer resolution set too low. "
+"Please contact your Linux distributor for more information.</p><p>Some Linux "
+"distributors already provide low latency kernels, see <a href=\"http://"
+"rosegarden.wiki.sourceforge.net/Low+latency+kernels\">http://rosegarden.wiki."
+"sourceforge.net/Low+latency+kernels</a> for instructions.</p>"
+msgstr ""
+"<h3>Die System-Timer Auflösung ist zu niedrig</h3><p>Rosegarden war nicht in "
+"der Lage eine hochauflösende Zeitquelle für die MIDI Performance zu finden.</"
+"p><p>Das kann bedeuten, dass bei Ihrem Linux System die \"Kernel timer "
+"resolution\" zu niedrig eingestellt ist. Bitte erfragen Sie nähere "
+"Informationen bei Ihrem Linux Distributor.</p>"
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1188
+#, fuzzy
+msgid ""
+"<h3>System timer resolution is too low</h3><p>Rosegarden was unable to find "
+"a high-resolution timing source for MIDI performance.</p><p>You may be able "
+"to solve this problem by loading the RTC timer kernel module. To do this, "
+"try running <b>sudo modprobe snd-rtctimer</b> in a terminal window and then "
+"restarting Rosegarden.</p><p>Alternatively, check whether your Linux "
+"distributor provides a multimedia-optimized kernel. See <a href=\"http://"
+"rosegarden.wiki.sourceforge.net/Low+latency+kernels\">http://rosegarden.wiki."
+"sourceforge.net/Low+latency+kernels</a> for notes about this.</p>"
+msgstr ""
+"<h3>Die System-Timer Auflösung ist zu niedrig</h3><p>Rosegarden war nicht in "
+"der Lage eine hochauflösende Zeitquelle für die MIDI Performance zu finden.</"
+"p><p>Das kann bedeuten, dass bei Ihrem Linux System die \"Kernel timer "
+"resolution\" zu niedrig eingestellt ist. Bitte erfragen Sie nähere "
+"Informationen bei Ihrem Linux Distributor.</p>"
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1312
+msgid ""
+"<p>Both MIDI and Audio subsystems have failed to initialize.</p><p>You may "
+"continue without the sequencer, but we suggest closing Rosegarden, running "
+"\"alsaconf\" as root, and starting Rosegarden again. If you wish to run "
+"with no sequencer by design, then use \"rosegarden --nosequencer\" to avoid "
+"seeing this error in the future.</p>"
+msgstr ""
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1314
+msgid ""
+"<p>The MIDI subsystem has failed to initialize.</p><p>You may continue "
+"without the sequencer, but we suggest closing Rosegarden, running \"modprobe "
+"snd-seq-midi\" as root, and starting Rosegarden again. If you wish to run "
+"with no sequencer by design, then use \"rosegarden --nosequencer\" to avoid "
+"seeing this error in the future.</p>"
+msgstr ""
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1316
+msgid ""
+"<p>The Rosegarden sequencer module version does not match the GUI module "
+"version.</p><p>You have probably mixed up files from two different versions "
+"of Rosegarden. Please check your installation.</p>"
+msgstr ""
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1322
+#, c-format
+msgid "<h3>Sequencer startup failed</h3>%1"
+msgstr "<h3>Sequenzerstart fehlgeschlagen:</h3> %1"
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1330
+msgid ""
+"<h3>Failed to connect to JACK audio server.</h3><p>Rosegarden could not "
+"connect to the JACK audio server. This probably means the JACK server is "
+"not running.</p><p>If you want to be able to play or record audio files or "
+"use plugins, you should exit Rosegarden and start the JACK server before "
+"running Rosegarden again.</p>"
+msgstr ""
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1331
+msgid "Failed to connect to JACK"
+msgstr ""
+
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:46
+msgid "Modify MIDI filters..."
+msgstr "MIDI-Filter ändern..."
+
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:58
+msgid "THRU events to ignore"
+msgstr "THRU-Events, die ignoriert werden sollen"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:131
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:60
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:96
+msgid "Note"
+msgstr "Note"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:132
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:61
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:97
+msgid "Program Change"
+msgstr "Programmwechsel"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:136
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:62
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:98
+msgid "Key Pressure"
+msgstr "Key Pressure"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:137
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:63
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:99
+msgid "Channel Pressure"
+msgstr "Channel Pressure"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:134
+#: ../src/gui/general/EditView.cpp:899
+#: ../src/gui/rulers/ControllerEventsRuler.cpp:198
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:64
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:100
+msgid "Pitch Bend"
+msgstr "Pitch Bend"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:133
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:65
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:101
+msgid "Controller"
+msgstr "Controller"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:135
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:66
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:102
+msgid "System Exclusive"
+msgstr "System Exclusive"
+
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:94
+msgid "RECORD events to ignore"
+msgstr "RECORD-Events, die ignoriert werden sollen"
+
+#: ../src/gui/widgets/TimeWidget.cpp:101
+msgid "Note:"
+msgstr "Notiz:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:108 ../src/gui/widgets/TimeWidget.cpp:145
+msgid "<inexact>"
+msgstr "<ungenau>"
+
+#: ../src/gui/widgets/TimeWidget.cpp:151
+msgid "Units:"
+msgstr "Einheiten:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:173
+msgid "Time:"
+msgstr "Zeit:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:184
+msgid "units"
+msgstr "Einheiten"
+
+#: ../src/gui/widgets/TimeWidget.cpp:193
+msgid "Measures:"
+msgstr "Takte:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:193
+msgid "Measure:"
+msgstr "Takt:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:212
+msgid "beats:"
+msgstr "Schläge:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:212
+msgid "beat:"
+msgstr "Schlag:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:230
+msgid "%1:"
+msgstr "%1:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:254
+msgid "Seconds:"
+msgstr "Sekunden:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:273
+msgid "msec:"
+msgstr "msec:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:407 ../src/gui/widgets/TimeWidget.cpp:531
+msgid "(%1/%2 time)"
+msgstr "(%1/%2 Zeit)"
+
+#: ../src/gui/widgets/TimeWidget.cpp:452
+msgid "(starting %1.%2 qpm, %2.%3 bpm)"
+msgstr "(beginnt bei %1.%2 qpm, %2.%3 bpm)"
+
+#: ../src/gui/widgets/TimeWidget.cpp:458
+msgid "(starting %1.%2 bpm)"
+msgstr "(beginnt bei %1.%2 bpm)"
+
+#: ../src/gui/widgets/TimeWidget.cpp:464
+msgid "(%1.%2 qpm, %2.%3 bpm)"
+msgstr "(%1.%2 qpm, %2.%3 bpm)"
+
+#: ../src/gui/widgets/TimeWidget.cpp:470
+msgid "(%1.%2 bpm)"
+msgstr "(%1.%2 bpm)"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:239
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:60
+msgid "C"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:241
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:61
+#, fuzzy
+msgid "D"
+msgstr "ID"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:243
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:62
+msgid "E"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:244
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:63
+msgid "F"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:246
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:64
+msgid "G"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:248
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:65
+#, fuzzy
+msgid "A"
+msgstr "A4"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:250
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:66
+msgid "B"
+msgstr ""
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:70
+msgid "-2"
+msgstr ""
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:71
+msgid "-1"
+msgstr ""
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:72
+msgid "0"
+msgstr "0"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:73
+#, fuzzy
+msgid "1"
+msgstr "%1"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:74
+msgid "2"
+msgstr ""
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:75
+msgid "3"
+msgstr ""
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:76
+#, fuzzy
+msgid "4"
+msgstr "A4"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:77
+msgid "5"
+msgstr ""
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:78
+msgid "6"
+msgstr ""
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:79
+msgid "7"
+msgstr ""
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:83
+#, fuzzy
+msgid "double flat"
+msgstr "Doppel-B"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:84
+#, fuzzy
+msgid "flat"
+msgstr "B"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:85
+#, fuzzy
+msgid "natural"
+msgstr "l"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:86
+#, fuzzy
+msgid "sharp"
+msgstr "Kreuz"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:87
+#, fuzzy
+msgid "double sharp"
+msgstr "Doppelkreuz"
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:234
+#, c-format
+msgid "In %1"
+msgstr "In %1"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:587
+#: ../src/gui/widgets/AudioRouteMenu.cpp:236
+#: ../src/gui/widgets/AudioRouteMenu.cpp:259
+msgid "Master"
+msgstr "Master"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:528
+#: ../src/gui/widgets/AudioRouteMenu.cpp:238
+#: ../src/gui/widgets/AudioRouteMenu.cpp:261
+#, c-format
+msgid "Sub %1"
+msgstr "Gruppe %1"
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:244
+msgid "In %1 R"
+msgstr "In %1 R"
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:245
+msgid "In %1 L"
+msgstr "In %1 L"
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:247
+msgid "Master R"
+msgstr "Master R"
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:248
+msgid "Master L"
+msgstr "Master L"
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:250
+msgid "Sub %1 R"
+msgstr "Gruppe %1 R"
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:251
+msgid "Sub %1 L"
+msgstr "Gruppe %1 L"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:391
+#: ../src/gui/studio/AudioMixerWindow.cpp:522
+#: ../src/gui/widgets/AudioFaderBox.cpp:82
+msgid "Audio plugin button"
+msgstr "Audio-Plugin-Knopf"
+
+#: ../src/gui/editors/parameters/AudioInstrumentParameterPanel.cpp:129
+#: ../src/gui/editors/parameters/AudioInstrumentParameterPanel.cpp:357
+#: ../src/gui/widgets/AudioFaderBox.cpp:91
+msgid "<no synth>"
+msgstr "<kein Synth>"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:93
+msgid "Synth plugin button"
+msgstr "Synth-Plugin Knopf"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:153
+msgid "Set the audio pan position in the stereo field"
+msgstr "Die Audio-Hörposition im Stereofeld setzen"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:155
+msgid "Open synth plugin's native editor"
+msgstr "Den eigenen Editor des Synth-Plugins öffnen"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:157
+msgid "Mono or Stereo Instrument"
+msgstr "Audio-Instrument in Mono oder Stereo"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:159
+msgid "Record level"
+msgstr "Aufnahmelautstärke = "
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:161
+msgid "Playback level"
+msgstr "Wiedergabelautstärke = "
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:345
+#: ../src/gui/studio/AudioMixerWindow.cpp:347
+#: ../src/gui/studio/AudioMixerWindow.cpp:503
+#: ../src/gui/studio/AudioMixerWindow.cpp:505
+#: ../src/gui/widgets/AudioFaderBox.cpp:163
+msgid "Audio level"
+msgstr "Audiodatei hinzufügen"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:170
+msgid "In:"
+msgstr "In:"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:173
+msgid "Out:"
+msgstr "Out:"
+
+#: ../src/gui/widgets/ProgressDialog.cpp:48
+#: ../src/gui/widgets/ProgressDialog.cpp:53
+#: ../src/gui/widgets/ProgressDialog.cpp:76
+msgid "Processing..."
+msgstr "Verarbeitung..."
+
+#: ../src/gui/configuration/ColourConfigurationPage.h:60
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:130
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:346
+#: ../src/gui/widgets/ColourTable.cpp:52
+msgid "Color"
+msgstr "Farbe"
+
+#: ../src/gui/widgets/ColourTable.cpp:68
+msgid "Modify Color Name"
+msgstr "Farbname verändern"
+
+#: ../src/gui/configuration/ColourConfigurationPage.cpp:129
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:983
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:882
+#: ../src/gui/widgets/ColourTable.cpp:68
+msgid "Enter new name"
+msgstr "Neuen Namen eingeben"
+
+#: ../src/gui/widgets/ColourTable.cpp:107
+msgid "Default Color"
+msgstr "Standardfarbe"
+
+#: ../src/gui/widgets/Rotary.cpp:108
+msgid ""
+"Click and drag up and down or left and right to modify.\n"
+"Double click to edit value directly."
+msgstr ""
+"Klicken und Ziehen. auf und ab oder von links nach rechts, um den Wert zu "
+"verändern."
+
+#: ../src/gui/widgets/Rotary.cpp:433
+msgid "Select a new value"
+msgstr "Neuen Wert wählen"
+
+#: ../src/gui/widgets/Rotary.cpp:434
+msgid "Enter a new value"
+msgstr "Neuen Wert eingeben"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:80
+msgid "Quantizer"
+msgstr "Quantisierer"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:86
+msgid "Quantizer type:"
+msgstr "Quantisiererungstyp"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:88
+msgid "Grid quantizer"
+msgstr "Raster-Quantisierer"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:89
+msgid "Legato quantizer"
+msgstr "Legato Quantisierer"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:90
+msgid "Heuristic notation quantizer"
+msgstr "Heuristischer Notationsquantisierer"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:94
+msgid "Quantize for notation only (leave performance unchanged)"
+msgstr "Quantisieren nur für die Notation (die Darbietung unverändert lassen)"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:104
+msgid "Notation parameters"
+msgstr "Notationsparameter"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:109
+#: ../src/gui/widgets/QuantizeParameters.cpp:150
+msgid "Base grid unit:"
+msgstr "Basis-Rastereinheit:"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:114
+msgid "Complexity:"
+msgstr "Komplexität:"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:118
+msgid "Very high"
+msgstr "Sehr hoch"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:119
+msgid "High"
+msgstr "Hoch"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:224
+#: ../src/gui/widgets/QuantizeParameters.cpp:120
+msgid "Normal"
+msgstr "Normal"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:121
+msgid "Low"
+msgstr "Niedrig"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:122
+msgid "Very low"
+msgstr "Sehr niedrig"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:125
+msgid "Tuplet level:"
+msgstr "Tuolenebene:"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:129
+msgid "2-in-the-time-of-3"
+msgstr "2-auf-3"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4241
+#: ../src/gui/widgets/QuantizeParameters.cpp:130
+msgid "Triplet"
+msgstr "Triole"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:138
+msgid "Any"
+msgstr "Irgendein"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:141
+msgid "Permit counterpoint"
+msgstr "Kontrapunkt erlauben"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:145
+msgid "Grid parameters"
+msgstr "Rasterparameter"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:154
+msgid "Swing:"
+msgstr "Swing:"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:159
+msgid "Iterative amount:"
+msgstr "Iterativer Anteil"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:165
+msgid "Quantize durations as well as start times"
+msgstr "Sowohl Dauern als auch Startzeiten quantisieren"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:169
+msgid "After quantization"
+msgstr "Nach Quantisierung"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:183
+msgid "Show advanced options"
+msgstr "Experteneinstellungen"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:192
+msgid "Re-beam"
+msgstr "Wieder Balken hinzufügen"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:194
+msgid "Add articulations (staccato, tenuto, slurs)"
+msgstr "Artikulation hinzufügen (staccato, tenuto, Bögen)"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:195
+msgid "Tie notes at barlines etc"
+msgstr "Noten an Taktstrichen verbinden etc."
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:196
+msgid "Split-and-tie overlapping chords"
+msgstr "Überlappende Akkorde aufteilen und verbinden"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:307
+msgid "Full quantize"
+msgstr "Vollständiges Quantisieren"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:450
+msgid "Show Advanced Options"
+msgstr "Experteneinstellungen"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:454
+msgid "Hide Advanced Options"
+msgstr "Experteneinstellungen verstecken"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:257
+#: ../src/gui/configuration/MatrixConfigurationPage.h:56
+#: ../src/gui/configuration/MatrixConfigurationPage.h:57
+#: ../src/gui/editors/matrix/MatrixView.cpp:2709
+msgid "Matrix"
+msgstr "Matrix"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:64
+msgid "Printable headers"
+msgstr ""
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:92
+#, fuzzy
+msgid "Dedication"
+msgstr "Indication"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:96
+#: ../src/gui/editors/segment/PlayListView.cpp:35
+msgid "Title"
+msgstr "Titel"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:100
+msgid "Subtitle"
+msgstr "Untertitel"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:104
+#, fuzzy
+msgid "Subsubtitle"
+msgstr "Untertitel"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:108
+#, fuzzy
+msgid "Poet"
+msgstr "Presto"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:116
+msgid "Composer"
+msgstr "Komponist"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:120
+#, fuzzy
+msgid "Meter"
+msgstr "Master"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:124
+msgid "Arranger"
+msgstr "Arrangiert"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:128
+#, fuzzy
+msgid "Piece"
+msgstr "Tonhöhen"
+
+#: ../data/fonts/mappings/fonts.cpp:26
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:132
+msgid "Opus"
+msgstr "Opus"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:136
+msgid "Copyright"
+msgstr "Copyright"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:140
+#, fuzzy
+msgid "Tagline"
+msgstr "Dreieck"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:155
+#, fuzzy
+msgid "The composition comes here."
+msgstr "Länge des Stücks verändern"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:172
+msgid "Non-printable headers"
+msgstr ""
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:213
+msgid "Add New Property"
+msgstr "Neue Eigenschaft hinzufügen"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:217
+msgid "Delete Property"
+msgstr "Eigenschaft löschen"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:236
+msgid "{new property %1}"
+msgstr "{neue Eigenschaft %1}"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:236
+msgid "{new property}"
+msgstr "{neue Eigenschaft}"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:243
+msgid "{undefined}"
+msgstr "{undefiniert}"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:87
+msgid "Double-click opens segment in"
+msgstr "Default-Editor (bei Doppelklick auf ein Segment)"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:91
+msgid "Notation editor"
+msgstr "im Notationseditor öffnen"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:92
+msgid "Matrix editor"
+msgstr "im Matrixeditor öffnen"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:93
+msgid "Event List editor"
+msgstr "im Evenlisteneditor öffnen"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:99
+msgid "Number of count-in measures when recording"
+msgstr "Anzahl vorzuzählender Takte bei Aufnahmen"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:109
+#, fuzzy
+msgid "Auto-save interval"
+msgstr "Abstand für automatisches Speichern (in Sekunden)"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:112
+msgid "Every 30 seconds"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:113
+msgid "Every minute"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:114
+msgid "Every five minutes"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:115
+msgid "Every half an hour"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:116
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:277
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:157
+msgid "Never"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:140
+msgid "Use JACK transport"
+msgstr "Verwende den JACK Transportmodus"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:173
+msgid "Unknown"
+msgstr "Unbekannt"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:179
+msgid "No MIDI, audio OK"
+msgstr "Kein MIDI, aber Audio"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:182
+msgid "MIDI OK, no audio"
+msgstr "MIDI, aber kein Audio"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:185
+msgid "MIDI OK, audio OK"
+msgstr "MID und Audio OK"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:188
+msgid "No driver"
+msgstr "Kein Treiber"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:195
+msgid "Details..."
+msgstr "Zeige Detailinformationen..."
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:204
+msgid "Behavior"
+msgstr "Verhalten"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:219
+msgid "Side-bar parameter box layout"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:223
+msgid "Vertically stacked"
+msgstr "Übereinander"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:225
+msgid "Tabbed"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:233
+msgid "Note name style"
+msgstr "Notennamenstil"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:237
+msgid "Always use US names (e.g. quarter, 8th)"
+msgstr "Always use US names (e.g. quarter, 8th)"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:238
+msgid "Localized (where available)"
+msgstr "Lokalisiert (soweit verfügbar, sonst UK)"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:252
+#, fuzzy
+msgid "Show textured background on"
+msgstr "Gemusterte Hintergründe auf freien Flächen"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:254
+msgid "Main window"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:275
+msgid "Use bundled Klearlook theme"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:278
+msgid "When not running under KDE"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:279
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:159
+msgid "Always"
+msgstr "Immer"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:287
+msgid "Presentation"
+msgstr "Aufbereitung"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:423
+msgid ""
+"Changes to the textured background in the main window will not take effect "
+"until you restart Rosegarden."
+msgstr ""
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:168
+#: ../src/gui/configuration/GeneralConfigurationPage.h:78
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:207
+#: ../src/gui/configuration/MatrixConfigurationPage.cpp:59
+msgid "General"
+msgstr "Allgemein"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.h:79
+msgid "General Configuration"
+msgstr "Allgemeine Konfiguration"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:92
+msgid "Base octave number for MIDI pitch display"
+msgstr "Basis-Oktavennummer für die MIDI-Tonhöhenanzeige"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:107
+msgid "Always use default studio when loading files"
+msgstr "Beim laden von Dateien immer \"default\"-Studio benutzen"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:119
+#, fuzzy
+msgid "Send all MIDI Controllers at start of each playback"
+msgstr ""
+"MIDI-Controller zum Start der Wiedergabe senden\\n\n"
+" (führt zu deutlicher Verzögerung am Beginn)"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:121
+msgid ""
+"Rosegarden can send all MIDI Controllers (Pan, Reverb etc) to all MIDI "
+"devices every\n"
+"time you hit play if you so wish. Please note that this option will usually "
+"incur a\n"
+"delay at the start of playback due to the amount of data being transmitted."
+msgstr ""
+"Rosegarden kann alle MIDI Steuernachrichten (Pan, Hall, etc.) jedesmal an "
+"alle MIDI Geräte senden,\n"
+"wenn Sie \"Wiedergabe\" drücken. Bitte beachten Sie, dass diese Option\n"
+"wegen der zu übertragenden Datenmenge normalerweise eine Verzögerung zum "
+"Beginn der Wiedergabe\n"
+"verursacht."
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:138
+msgid "Sequencer timing source"
+msgstr "Zeitgeber (-Quelle) des Sequencers"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:163
+msgid "Load SoundFont to SoundBlaster card at startup"
+msgstr "Beim Starten lade SoundFont in die SoundBlaster Karte"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:164
+msgid ""
+"Check this box to enable soundfont loading on EMU10K-based cards when "
+"Rosegarden is launched"
+msgstr ""
+"Mache einen Hacken um das Laden von SoundFont für EMU10K-basierte Karten "
+"beim Start von Rosegarden einzuschalten"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:173
+msgid "Path to 'asfxload' or 'sfxload' command"
+msgstr "Pfad zum 'asfxload' oder 'sfxload' Befehl"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:180
+msgid "SoundFont"
+msgstr "SoundFont"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:223
+msgid "MIDI Clock and System messages"
+msgstr "MIDI-Clock und -System-Nachrichten "
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:229
+msgid "Send MIDI Clock, Start and Stop"
+msgstr "MIDI-Clock, -Start und -Stop -Nachrichten senden"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:230
+msgid "Accept Start, Stop and Continue"
+msgstr "Reagiere auf Start, Stop und Continue"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:241
+msgid "MIDI Machine Control mode"
+msgstr "MIDI Machine Control Modus"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:248
+msgid "MMC Master"
+msgstr "MMC Master"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:249
+msgid "MMC Slave"
+msgstr "MMC Slave"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:260
+msgid "MIDI Time Code mode"
+msgstr "MIDI Time Code Modus"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:267
+msgid "MTC Master"
+msgstr "MTC Master"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:268
+msgid "MTC Slave"
+msgstr "MTC Slave"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:281
+msgid "Automatically connect sync output to all devices in use"
+msgstr "Verbinde Sync-Ausgang automatisch mit allen verwendeten Geräten"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:292
+msgid "MIDI Sync"
+msgstr "MIDI Sync"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:308
+msgid "sfxload path"
+msgstr "sfxload Pfad"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:315
+msgid "Soundfont path"
+msgstr "SoundFont Pfad"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:67
+msgid "%1 minutes %2.%3%4 seconds (%5 units, %6 measures)"
+msgstr "%1 Minuten %2.%3%4 Sekunden (%5 Einheiten, %6 Takte)"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:133
+msgid "Filename:"
+msgstr "Dateiname:"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:136
+msgid "Formal duration (to end marker):"
+msgstr "Formale Länge (bis zur Ende-Markierung):"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:141
+msgid "Playing duration:"
+msgstr "Spieldauer:"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:146
+msgid "Tracks:"
+msgstr "Spuren:"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:147
+msgid "%1 used, %2 total"
+msgstr "%1 verwendet, %2 Gesamt"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:152
+msgid "Segments:"
+msgstr "Segmente:"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:153
+msgid "%1 MIDI, %2 audio, %3 total"
+msgstr "%1 MIDI, %2 Audio, %3 Gesamt"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:161
+msgid "Statistics"
+msgstr "Statistiken"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:170
+#: ../src/gui/editors/parameters/InstrumentParameterBox.cpp:155
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:92
+msgid "Track"
+msgstr "Spur"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:171
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:125
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:90
+msgid "Label"
+msgstr "Bezeichnung"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:172
+msgid "Time"
+msgstr "Zeit"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:174
+msgid "Events"
+msgstr "Events"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:175
+msgid "Polyphony"
+msgstr "Polyphonie"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:176
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:126
+msgid "Repeat"
+msgstr "Wiederholen"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:178
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:128
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:305
+#: ../src/gui/general/EditView.cpp:1488
+msgid "Transpose"
+msgstr "Transponieren"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:179
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:129
+msgid "Delay"
+msgstr "Verzögerung"
+
+#: ../src/gui/configuration/AudioConfigurationPage.h:61
+#: ../src/gui/configuration/AudioPropertiesPage.h:58
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:204
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:523
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:524
+msgid "Audio"
+msgstr "Audio"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:204
+#: ../src/gui/configuration/MIDIConfigurationPage.h:62
+msgid "MIDI"
+msgstr "MIDI"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:317
+msgid "Segment Summary"
+msgstr "Segment Zusammenfassung"
+
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:63
+msgid "Audio file path:"
+msgstr "Pfad für Audiodateien"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:137
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:68
+msgid "Choose..."
+msgstr "Auswählen..."
+
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:73
+msgid "Disk space remaining:"
+msgstr "Verbleibender Plattenplatz:"
+
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:78
+msgid "Equivalent minutes of 16-bit stereo:"
+msgstr "Entsprechende Anzahl Minuten bei 16-bit-Stereo"
+
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:90
+msgid "Modify audio path"
+msgstr "Audiodateipfad ändern"
+
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:113
+msgid "%1 out of %2 (%3% used)"
+msgstr "%1 von %2 (%3% verwendet)"
+
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:144
+msgid "minutes at"
+msgstr "Minuten bei"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.h:63
+msgid "MIDI Settings"
+msgstr "MIDI Einstellungen"
+
+#: ../src/gui/configuration/AudioConfigurationPage.h:62
+#: ../src/gui/configuration/AudioPropertiesPage.h:59
+msgid "Audio Settings"
+msgstr "Audioeinstellungen"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:87
+msgid "Default layout mode"
+msgstr "Default Layout-Modus"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:91
+msgid "Linear layout"
+msgstr "Lineares Layout"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:92
+msgid "Continuous page layout"
+msgstr "Fortlaufende Seite Layout"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:93
+msgid "Multiple page layout"
+msgstr "Mehrere Seiten Layout"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:101
+msgid "Default spacing"
+msgstr "Standard-Abstände"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:125
+msgid "Default duration factor"
+msgstr "Standard Längen Faktor"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:141
+msgid "Full"
+msgstr "Ganz"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:152
+msgid "Show track headers (linear layout only)"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:158
+msgid "When needed"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:166
+msgid ""
+"\"Always\" and \"Never\" mean what they usually mean\n"
+"\"When needed\" means \"when staves are too many to all fit in the current "
+"window\""
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:178
+msgid "Show non-notation events as question marks"
+msgstr "Nicht-Notationsevents als Fragezeichen zeigen"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:188
+msgid "Show notation-quantized notes in a different color"
+msgstr "Notations-quantisierte Events in einer anderen Farbe anzeigen"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:198
+msgid "Show \"invisible\" events in grey"
+msgstr "\"unsichtbare\" Events in grau anzeigen"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:208
+msgid "Show notes outside suggested playable range in red"
+msgstr "Noten außerhalb des vorgeschlagenen spielbaren Bereiches in Rot zeigen"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:218
+msgid "Highlight superimposed notes with a halo effect"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:231
+msgid "When recording MIDI, split-and-tie long notes at barlines"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:242
+msgid "Layout"
+msgstr "Layout"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:255
+msgid "Default note style for new notes"
+msgstr "Standard Notenstil für neue Noten"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:287
+msgid "When inserting notes..."
+msgstr "Beim Einfügen neuer Noten..."
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:294
+msgid "Split notes into ties to make durations match"
+msgstr ""
+"Noten in \"verbundene\" aufbrechen, um Längen in Übereinstimmung zu bringen"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:295
+msgid "Ignore existing durations"
+msgstr "Vorhandene Längen ignorieren"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:305
+msgid "Auto-beam on insert when appropriate"
+msgstr "Balken automatisch hinzufügen, wenn angemessen"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:317
+#: ../src/gui/editors/notation/NotationEraser.cpp:54
+msgid "Collapse rests after erase"
+msgstr "Pausen nach Löschen zusammenfassen"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:328
+msgid "Default paste type"
+msgstr "Standard-Einfügetyp"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:350
+msgid "Editing"
+msgstr "Ändern"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:362
+msgid "Accidentals in one octave..."
+msgstr "Vorzeichen in einer Oktave..."
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:364
+msgid "Affect only that octave"
+msgstr "Betrifft nur diese Oktave"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:365
+msgid "Require cautionaries in other octaves"
+msgstr "Verlange Sicherheitsvorzeichen in anderen Oktaven"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:366
+msgid "Affect all subsequent octaves"
+msgstr "Betrifft alle folgenden Oktaven"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:374
+msgid "Accidentals in one bar..."
+msgstr "Vorzeichen innerhalb eines Taktes..."
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:376
+msgid "Affect only that bar"
+msgstr "Betrifft nur diesen Takt"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:377
+msgid "Require cautionary resets in following bar"
+msgstr "Verlange Sicherheitsauflösungszeichen im folgenden Takt"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:378
+msgid "Require explicit resets in following bar"
+msgstr "Verlange ausdrückliche Auflösungszeichen im folgenden Takt"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:386
+#, fuzzy
+msgid "Key signature cancellation style"
+msgstr "Tonart Auflösungsstil:"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:388
+msgid "Cancel only when entering C major or A minor"
+msgstr "Nur bei Eingabe von C-dur oder a-moll auflösen"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:389
+msgid "Cancel whenever removing sharps or flats"
+msgstr "Immer auflösen, wenn # oder b entfernt werden"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:390
+msgid "Cancel always"
+msgstr "Immer auflösen"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:400
+msgid "Accidentals"
+msgstr "Vorzeichen"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:441
+msgid "Notation font"
+msgstr "Notationsfont"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:467
+msgid "Origin:"
+msgstr "Ursprung:"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:471
+msgid "Copyright:"
+msgstr "Copyright:"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:475
+msgid "Mapped by:"
+msgstr "Zugeordnet von:"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:479
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:81
+msgid "Type:"
+msgstr "Typ:"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:508
+msgid "Font size for single-staff views"
+msgstr "Fontgröße für Ansichten mit einem System"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:516
+msgid "Font size for multi-staff views"
+msgstr "Fontgröße für Ansichten mit mehreren Systemen"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:524
+msgid "Font size for printing (pt)"
+msgstr "Fontgröße zum Drucken (in Punkten)"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:541
+msgid "Text font"
+msgstr "Schriftart für Text"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:549
+msgid "Sans-serif font"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:664
+msgid "%1 (smooth)"
+msgstr "%1 (sanft)"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:667
+msgid "%1 (jaggy)"
+msgstr "%1 (zackig)"
+
+#: ../src/gui/configuration/LatencyConfigurationPage.cpp:58
+msgid "JACK latency"
+msgstr "Jack-Verzögerung"
+
+#: ../src/gui/configuration/LatencyConfigurationPage.cpp:61
+msgid ""
+"Use the \"Fetch JACK latencies\" button to discover the latency values set "
+"at\n"
+"the sequencer. It's recommended that you use the returned values but it's "
+"also\n"
+"possible to override them manually using the sliders. Note that if you "
+"change\n"
+"your JACK server parameters you should always fetch the latency values "
+"again.\n"
+"The latency values will be stored by Rosegarden for use next time."
+msgstr ""
+"Benutzen Sie den Knopf \"JACK-Verzögerungen holen\" um auf die "
+"Verzögerungswerte\n"
+"des Sequncers zuzugreifen. Wir empfehlen Ihnen, die zurückgelieferten Werte "
+"zu verwenden,\n"
+"aber es ist auch möglich, diese Werte manuell mit den Stellbalken zu "
+"verändern.\n"
+"Denken Sie daran, immer die Verzögerungswerte erneut zu holen, wenn Sie die\n"
+"Jack-Serverparameter verändern. Rosegarden speichert die Verzögerungswerte "
+"für\n"
+"die nächste Verwendung."
+
+#: ../src/gui/configuration/LatencyConfigurationPage.cpp:65
+msgid "JACK playback latency (in ms)"
+msgstr "Wiedergabeverzögerung für JACK (in ms)"
+
+#: ../src/gui/configuration/LatencyConfigurationPage.cpp:66
+msgid "JACK record latency (in ms)"
+msgstr "Aufnahmeverzögerung für JACK (in ms)"
+
+#: ../src/gui/configuration/LatencyConfigurationPage.cpp:68
+msgid "Fetch JACK latencies"
+msgstr "JACK-Verzögerungen holen"
+
+#: ../src/gui/configuration/LatencyConfigurationPage.cpp:121
+msgid "JACK Latency"
+msgstr "Jack Verzögerung"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:92
+msgid "Audio preview scale"
+msgstr ""
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:96
+msgid "Linear - easier to see loud peaks"
+msgstr "Linear - einfacher, laute Stellen zu erkennen"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:97
+msgid "Meter scaling - easier to see quiet activity"
+msgstr ""
+"Meßgerät Skalierung - einfacher Aktivität bei ruhigen Stellen zu erkennen"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:105
+msgid "Record audio files as"
+msgstr "Speichere Audio-Aufnahmen als"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:107
+msgid "16-bit PCM WAV format (smaller files)"
+msgstr "16-bit PCM WAV Format (kleinere Dateien)"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:108
+msgid "32-bit float WAV format (higher quality)"
+msgstr "32-bit float WAV Format (höhere Qualität)"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:117
+msgid "External audio editor"
+msgstr "Erterner Audioeditor"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:145
+msgid "Create JACK outputs"
+msgstr ""
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:150
+#, fuzzy
+msgid "for individual audio instruments"
+msgstr "je Audio Instrument"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:157
+#, fuzzy
+msgid "for submasters"
+msgstr "Keine Gruppenfader"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:184
+#, fuzzy
+msgid ""
+"Rosegarden can start the JACK audio daemon (jackd) for you automatically if "
+"it isn't already running when Rosegarden starts.\n"
+"\n"
+"This is recommended for beginners and those who use Rosegarden as their main "
+"audio application, but it might not be to the liking of advanced users.\n"
+"\n"
+"If you want to start JACK automatically, make sure the command includes a "
+"full path where necessary as well as any command-line arguments you want to "
+"use.\n"
+"\n"
+"For example: /usr/local/bin/jackd -d alsa -d hw -r44100 -p 2048 -n 2\n"
+"\n"
+msgstr ""
+"Rosegarden kann prüfen, ob der JACK audio daemon (jackd) läuft, wenn "
+"Rosegarden startet und wenn nicht, ihn für die aktuelle Session zu starten.\n"
+"\n"
+"JACK so zu steuern wird Rosegarden-Neulingen und solchen Anwendern, die "
+"Rosegarden als Hauptanwendung für JACK nutzen, empfohlen; dies mag einigen "
+"fortgeschritteneren Benutzern nicht ausreichen.\n"
+"Wenn Sie JACK automatisch starten wollen, muss die Kommandozeile einen "
+"vollständigen Pfad (soweit notwendig) sowie die Argumente, die Sie übergeben "
+"wollen, enthalten, z. B.: /usr/local/bin/jackd -d alsa -d hw -r44100 -p 2048 "
+"-n 2\n"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:196
+msgid "Start JACK when Rosegarden starts"
+msgstr "JACK mit Rosegarden starten"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:201
+msgid "JACK command"
+msgstr ""
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:214
+#, fuzzy
+msgid "JACK Startup"
+msgstr "Start"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:224
+msgid "External audio editor path"
+msgstr "Erterner Audioeditor"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:262
+msgid "External audio editor \"%1\" not found or not executable"
+msgstr ""
+
+#: ../src/gui/configuration/ColourConfigurationPage.cpp:70
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:448
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:863
+msgid "Add New Color"
+msgstr "Neue Farbe hinzufügen"
+
+#: ../src/gui/configuration/ColourConfigurationPage.cpp:74
+msgid "Delete Color"
+msgstr "Farbe löschen"
+
+#: ../src/gui/configuration/ColourConfigurationPage.cpp:93
+msgid "Color Map"
+msgstr "Farbtabelle"
+
+#: ../src/gui/configuration/ColourConfigurationPage.cpp:128
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:983
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:882
+msgid "New Color Name"
+msgstr "Neuer Farbname"
+
+#: ../src/gui/configuration/ColourConfigurationPage.cpp:130
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:59
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:984
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:883
+#: ../src/gui/studio/DeviceManagerDialog.cpp:115
+#: ../src/gui/studio/DeviceManagerDialog.cpp:174
+msgid "New"
+msgstr "Neu"
+
+#: ../src/gui/configuration/LatencyConfigurationPage.h:62
+msgid "Latency"
+msgstr "Verzögerung"
+
+#: ../src/gui/configuration/LatencyConfigurationPage.h:63
+msgid "Sequencer Latency"
+msgstr "Sequencer-Verzögerung"
+
+#: ../src/gui/configuration/ColourConfigurationPage.h:61
+msgid "Color Settings"
+msgstr "Farbeinstellungen"
+
+#: ../src/gui/studio/MidiDeviceListViewItem.cpp:55
+#: ../src/gui/studio/MidiKeyMapListViewItem.cpp:44
+msgid "Key Mapping"
+msgstr "Tasten-Übersetzungstabelle"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:97
+msgid "Manage MIDI Banks and Programs"
+msgstr "MIDI-Bänke und -Programme verwalten"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:128
+msgid "MIDI Device"
+msgstr "MIDI-Gerät"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:130
+#: ../src/gui/studio/BankEditorDialog.cpp:219
+msgid "MSB"
+msgstr "MSB"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:131
+#: ../src/gui/studio/BankEditorDialog.cpp:218
+msgid "LSB"
+msgstr "LSB"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:140
+msgid "Add Bank"
+msgstr "Bank hinzufügen"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:141
+msgid "Add Key Mapping"
+msgstr "Tasten-Übersetzungstabelle hinzufügen"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:153
+msgid "Add a Bank to the current device"
+msgstr "Zum aktuellen Gerät eine Bank hinhzufügen"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:157
+msgid "Add a Percussion Key Mapping to the current device"
+msgstr "Füge Percussions-Tasten-Übersetzungstabelle zum aktuellen Gerät hinzu"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:161
+msgid "Delete the current Bank or Key Mapping"
+msgstr "Aktuelle Bank oder Tasten-Übersetzungstabelle löschen"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:165
+msgid "Delete all Banks and Key Mappings from the current Device"
+msgstr "Alle Bänke und Tasten-Übersetzungstabellen im aktuellen Gerät löschen"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:167
+#: ../src/gui/studio/DeviceManagerDialog.cpp:117
+msgid "Import..."
+msgstr "&Import"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:168
+#: ../src/gui/studio/DeviceManagerDialog.cpp:118
+msgid "Export..."
+msgstr "Exportieren als..."
+
+#: ../src/gui/studio/BankEditorDialog.cpp:176
+msgid ""
+"Import Bank and Program data from a Rosegarden file to the current Device"
+msgstr ""
+"Bank- und Programmdaten aus einer Rosegarden-Datei in das aktuelle Gerät "
+"importieren"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:179
+msgid ""
+"Export all Device and Bank information to a Rosegarden format interchange "
+"file"
+msgstr ""
+"Alle Geräte- und Bank-Informationen in ein Rosegarden-Datenaustauschformat "
+"exportieren"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:190
+msgid "Copy all Program names from current Bank to clipboard"
+msgstr "Alle Programmnamen der aktuellen Bank in die Zwischenablage kopieren"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:194
+msgid "Paste Program names from clipboard to current Bank"
+msgstr "Programmnamen von der Zwischenablage in die aktuelle Bank einfügen"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:216
+msgid "Show Variation list based on "
+msgstr "Abweichungsliste anzeigen basiert auf "
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1010
+msgid "<new bank>"
+msgstr "<Neue Bank>"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1046
+msgid "<new mapping>"
+msgstr "<Neue Bank>"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1048
+msgid "<new mapping %1>"
+msgstr "<Neue Bank>"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1089
+msgid "Really delete this bank?"
+msgstr "Diese Bank wirklich löschen?"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1137
+msgid "Really delete this key mapping?"
+msgstr "Diese Bank wirklich löschen?"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1187
+msgid "Really delete all banks for "
+msgstr "Wirklich alle Bänke löschen für "
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1476
+msgid "Import Banks from Device in File"
+msgstr "Bänke von einem Gerät in eine Datei importieren "
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1623
+#: ../src/gui/studio/DeviceManagerDialog.cpp:770
+msgid "Export Device as..."
+msgstr "Gerät exportieren als..."
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1694
+msgid ""
+"There are unsaved changes.\n"
+"Do you want to apply the changes before exiting the Bank Editor or discard "
+"the changes ?"
+msgstr ""
+"Ungesicherte Änderungen:\n"
+"Vor Verlassen des Bank-Editors Änderungen speichern oder verwerfen"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1697
+msgid "Unsaved Changes"
+msgstr "Tonart-Veränderung"
+
+#: ../src/gui/studio/NameSetEditor.cpp:68
+msgid "Librarian"
+msgstr "Bibliothekar"
+
+#: ../src/gui/studio/NameSetEditor.cpp:75
+msgid "Email"
+msgstr "Email"
+
+#: ../src/gui/studio/NameSetEditor.cpp:80
+msgid ""
+"The librarian maintains the Rosegarden device data for this device.\n"
+"If you've made modifications to suit your own device, it might be worth\n"
+"liaising with the librarian in order to publish your information for the "
+"benefit\n"
+"of others."
+msgstr ""
+"Der Bibliothekar verwaltet die Daten, die Rosegarden zu diesem Gerät kennt.\n"
+"Falls Sie hier Anpassungen vorgenommen haben, um Ihr eigenes Gerät besser\n"
+"zu unterstützen, sollten Sie überlegen den Bibliothekar zu kontaktieren, "
+"damit\n"
+"möglicherweise auch Andere von Ihren Anpassungen profitieren können."
+
+#: ../src/gui/studio/MidiBankListViewItem.cpp:51
+#: ../src/gui/studio/MidiDeviceListViewItem.cpp:48
+msgid "Percussion Bank"
+msgstr "Percussion Bank"
+
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:84
+#: ../src/gui/studio/MidiBankListViewItem.cpp:51
+#: ../src/gui/studio/MidiDeviceListViewItem.cpp:48
+msgid "Bank"
+msgstr "Bank"
+
+#: ../src/gui/studio/ChangeRecordDeviceCommand.h:39
+msgid "Change Record Device"
+msgstr "Aufnahmegerät wechseln"
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:61
+#: ../src/gui/studio/DeviceManagerDialog.cpp:96
+msgid "Manage MIDI Devices"
+msgstr "MIDI-Geräte verwalten... "
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:98
+msgid "Play devices"
+msgstr "Vorschau abspielen"
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:76
+#: ../src/gui/studio/DeviceManagerDialog.cpp:106
+#: ../src/gui/studio/DeviceManagerDialog.cpp:165
+msgid "Connection"
+msgstr "Verbindung"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:119
+msgid "Banks..."
+msgstr "Bänke verwalten..."
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:120
+msgid "Control Events..."
+msgstr "Kontroll-Events..."
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:126
+msgid "Create a new Play device"
+msgstr "Neues Abspielgerät anlegen"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:129
+#: ../src/gui/studio/DeviceManagerDialog.cpp:184
+msgid "Delete the selected device"
+msgstr "Gewähltes Gerät löschen"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:132
+msgid ""
+"Import Bank, Program and Controller data from a Rosegarden file to the "
+"selected device"
+msgstr ""
+"Bank- und Programmdaten aus einer Rosegarden-Datei in das aktuelle Gerät "
+"importieren"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:135
+msgid "Export Bank and Controller data to a Rosegarden interchange file"
+msgstr ""
+"Alle Geräte- und Bank-Informationen in ein Rosegarden-Datenaustauschformat "
+"exportieren"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:138
+msgid "View and edit Banks and Programs for the selected device"
+msgstr "Ansehen und ändern von Bänken und Programmen für das ausgewählte Gerät"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:141
+msgid ""
+"View and edit Control Events for the selected device - these are special "
+"Event types that you can define against your device and control through "
+"Control Rulers or the Instrument Parameter Box "
+msgstr ""
+"Ansehen und ändern der Kontrol-Events für das ausgewählte Gerät - es handelt "
+"sich hierbei um spezielle Event-Typen, die Sie für Ihr Gerät definieren und "
+"mittels der Kontrollineale der Instrument Parameter Box kontrollieren können."
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:156
+msgid "Record devices"
+msgstr "Aufnahmegeräte"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:164
+msgid "Current"
+msgstr "Aktuell"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:181
+msgid "Create a new Record device"
+msgstr "Erzeuge ein neues Aufnahmegerät"
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:360
+#: ../src/gui/studio/DeviceEditorDialog.cpp:378
+#: ../src/gui/studio/DeviceManagerDialog.cpp:486
+#: ../src/gui/studio/DeviceManagerDialog.cpp:501
+msgid "New Device"
+msgstr "Neues Gerät"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:703
+msgid "Import from Device in File"
+msgstr "Von Gerät in Datei importieren"
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:55
+msgid "Remap Instrument assigments..."
+msgstr "Instrumentzuordnungen neu verteilen..."
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:62
+msgid "Device or Instrument"
+msgstr "Gerät oder Instrument"
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:65
+msgid "Remap Tracks by all Instruments on a Device or by single Instrument"
+msgstr ""
+"Spuren für alle Instrumente eines Geräts oder für ein einzelnes Instrument "
+"neu verteilen"
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:74
+msgid "Choose Source and Destination"
+msgstr "Quelle und Ziel wählen"
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:77
+msgid "From"
+msgstr "Von"
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:78
+msgid "To"
+msgstr "Nach"
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:120
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:121
+msgid "<no devices>"
+msgstr "<keine Geräte>"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:155
+msgid "Show Audio &Faders"
+msgstr "Zeige Audio &Fader"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:160
+msgid "Show Synth &Faders"
+msgstr "Zeige Synth &Fader"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:165
+msgid "Show &Submasters"
+msgstr "Zeige Gruppenfader"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:170
+msgid "Show &Plugin Buttons"
+msgstr "Audio-Plugin-Knopf"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:175
+msgid "Show &Unassigned Faders"
+msgstr "Zeige nicht zugeordnete Fader"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:184
+#, c-format
+msgid ""
+"_n: 1 Input\n"
+"%n Inputs"
+msgstr ""
+"_n: 1 Eingang\n"
+"%n Eingänge"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:194
+msgid "No Submasters"
+msgstr "Keine Gruppenfader"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:203
+#, c-format
+msgid ""
+"_n: 1 Submaster\n"
+"%n Submasters"
+msgstr ""
+"_n: 1 Gruppenfader\n"
+"%n Gruppenfader"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:279
+msgid "Audio Mixer"
+msgstr "Audio Fader"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:311
+msgid "Record input source"
+msgstr "Aufnahmequelle"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:322
+msgid "Output destination"
+msgstr "Ausgabeziel"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:336
+#: ../src/gui/studio/AudioMixerWindow.cpp:495
+msgid "Pan"
+msgstr "Pan"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:355
+msgid "Mono or stereo"
+msgstr "Mono oder Stereo"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:364
+#: ../src/gui/studio/AudioMixerWindow.cpp:513
+msgid "Mute"
+msgstr "Stummschalten"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:373 rc.cpp:408
+#, no-c-format
+msgid "Solo"
+msgstr "Solo"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:382
+msgid "Arm recording"
+msgstr "Aufnahme vorbereiten"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:400
+#, c-format
+msgid "Audio %1"
+msgstr "Audio %1"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:404
+#, c-format
+msgid "Synth %1"
+msgstr "Synth %1"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:578
+#: ../src/gui/studio/AudioMixerWindow.cpp:580
+msgid "Audio master output level"
+msgstr "Audio Master Ausgangspegel"
+
+#: ../src/gui/studio/SynthPluginManagerDialog.cpp:71
+msgid "Manage Synth Plugins"
+msgstr "Synth Plugins verwalten"
+
+#: ../src/gui/studio/SynthPluginManagerDialog.cpp:78
+msgid "Synth plugins"
+msgstr "Synth Plugins"
+
+#: ../src/gui/studio/SynthPluginManagerDialog.cpp:145
+msgid "Controls"
+msgstr "Controls"
+
+#: ../src/gui/studio/SynthPluginManagerDialog.cpp:152
+msgid "Editor >>"
+msgstr "Editor >>"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:66
+#: ../src/gui/studio/MidiProgramsEditor.cpp:169
+msgid "Bank and Program details"
+msgstr "Bank- und Programm-Details"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:67
+msgid "Programs"
+msgstr "Programme"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2711
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:88
+#: ../src/gui/studio/MidiProgramsEditor.cpp:93
+msgid "Percussion"
+msgstr "Percussion"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:99
+msgid "MSB Value"
+msgstr "MSB-Wert"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:107
+msgid ""
+"Selects a MSB controller Bank number (MSB/LSB pairs are always unique for "
+"any Device)"
+msgstr ""
+"Wählt eine Banknummer des MSB-Controllers aus (MSB/LSB-Paare sind stets "
+"eindeutig für ein Gerät)"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:111
+msgid ""
+"Selects a LSB controller Bank number (MSB/LSB pairs are always unique for "
+"any Device)"
+msgstr ""
+"Wählt eine Banknummer des LSB-Controllers aus (MSB/LSB-Paare sind stets "
+"eindeutig für ein Gerät)"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:116
+msgid "LSB Value"
+msgstr "LSB-Wert"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:254
+#: ../src/gui/studio/MidiProgramsEditor.cpp:541
+#, c-format
+msgid "Key Mapping: %1"
+msgstr "Tasten-Übersetzungstabelle: %1"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:476
+msgid "<no key mapping>"
+msgstr "<keine Tasten-Übersetzungstabelle>"
+
+#: ../src/gui/studio/MidiKeyMappingEditor.cpp:57
+#: ../src/gui/studio/MidiKeyMappingEditor.cpp:81
+msgid "Key Mapping details"
+msgstr "Tasten-Übersetzungstabelle Details"
+
+#: ../src/gui/studio/MidiKeyMappingEditor.cpp:58
+msgid "Pitches"
+msgstr "Tonhöhen"
+
+#: ../src/gui/studio/MidiMixerWindow.cpp:152
+msgid "MIDI Mixer"
+msgstr "MIDI Mischer"
+
+#: ../src/gui/studio/MidiMixerWindow.cpp:199
+msgid "Volume"
+msgstr "Lautstärke"
+
+#: ../src/gui/studio/AudioPluginOSCGUIManager.cpp:444
+msgid "Rosegarden Plugin"
+msgstr "Rosegarden PLugin"
+
+#: ../src/gui/studio/AudioPluginOSCGUIManager.cpp:447
+#, c-format
+msgid "Rosegarden: %1"
+msgstr "Rosegarden: %1"
+
+#: ../src/gui/studio/AudioPluginOSCGUIManager.cpp:449
+msgid "Rosegarden: %1: %2"
+msgstr "Rosegarden: %1: %2"
+
+#: ../src/gui/studio/AudioPluginOSCGUIManager.cpp:450
+#, c-format
+msgid "Plugin slot %1"
+msgstr "Plugin %1"
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:92
+msgid "Add Play Device"
+msgstr "Wiedergabegerät hinzufügen"
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:93
+msgid "Add Record Device"
+msgstr "Aufnahmegerät hinzufügen"
+
+#: ../src/commands/studio/CreateOrDeleteDeviceCommand.h:68
+#: ../src/gui/studio/DeviceEditorDialog.cpp:94
+msgid "Delete Device"
+msgstr "Gerät löschen"
+
+#: ../src/gui/editors/segment/PlayList.cpp:77
+#: ../src/gui/studio/DeviceEditorDialog.cpp:156
+#: ../src/gui/studio/DeviceEditorDialog.cpp:361
+msgid "Play"
+msgstr "Wiedergabe"
+
+#: ../src/commands/segment/SegmentRecordCommand.cpp:37
+#: ../src/gui/studio/DeviceEditorDialog.cpp:156
+#: ../src/gui/studio/DeviceEditorDialog.cpp:379 rc.cpp:394
+#, no-c-format
+msgid "Record"
+msgstr "Aufnahme"
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:256
+msgid "Apply pending changes?"
+msgstr "Ausstehende Änderungen anwenden?"
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:359
+#: ../src/gui/studio/DeviceEditorDialog.cpp:377
+msgid "<new device>"
+msgstr "<Neues Gerät>"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentEraser.cpp:82
+msgid "Click on a segment to delete it"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSplitter.cpp:166
+msgid ""
+"Click on a segment to split it in two; hold Shift to avoid snapping to beat "
+"grid"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSplitter.cpp:168
+msgid "Click on a segment to split it in two"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:81
+msgid "Click and drag to select segments"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentMover.cpp:154
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:238
+msgid "Move Segment"
+msgstr "Segment bewegen"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentMover.cpp:154
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:239
+msgid "Move Segments"
+msgstr "Segmente bewegen"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:217
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:169
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:141
+#: ../src/gui/editors/segment/segmentcanvas/SegmentMover.cpp:210
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:255
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:359
+msgid "Hold Shift to avoid snapping to beat grid"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:485
+msgid ""
+"Click and drag to select segments; middle-click and drag to draw an empty "
+"segment"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:384
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:502
+msgid ""
+"Click and drag to resize a segment; hold Ctrl as well to rescale its contents"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:386
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:504
+msgid "Click and drag to rescale segment"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:509
+msgid "Click and drag to move segments; hold Ctrl as well to copy them"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:511
+msgid "Click and drag to copy segments"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:515
+msgid ""
+"Click and drag to move segment; hold Ctrl as well to copy it; double-click "
+"to edit"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:517
+msgid "Click and drag to copy segment"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:157
+#, fuzzy
+msgid ""
+"The audio file path does not exist or is not writable.\n"
+"You must set the audio file path to a valid directory in Document Properties "
+"before rescaling an audio file.\n"
+"Would you like to set it now?"
+msgstr ""
+"Der angegebene Audio-Dateipfad existiert entweder nicht oder ist nicht "
+"schreibbar.\n"
+"Bitte setzen Sie den Audio-Dateipfad auf ein gültiges Verzeichnis in dem\n"
+"Dokumenteigenschaften bevor Sie Audio aufnehmen.\n"
+"Möchten Sie den Pfad jetzt setzen?"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:261
+msgid ""
+"Hold Shift to avoid snapping to beat grid; hold Ctrl as well to rescale "
+"contents"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentMover.cpp:325
+msgid "Click and drag to move a segment"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentPencil.cpp:225
+msgid "Hold Shift to avoid snapping to bar lines"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentPencil.cpp:283
+#, fuzzy
+msgid "Record or drop audio here"
+msgstr "MIDI- oder Audio-Aufnahme"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentPencil.cpp:289
+msgid ""
+"Click and drag to draw an empty segment. Control+Alt click and drag to draw "
+"in overlap mode."
+msgstr ""
+
+#: ../src/gui/editors/segment/TrackLabel.cpp:77
+msgid ""
+"Click and hold with left mouse button to assign this Track to an Instrument."
+msgstr ""
+"Klicke und halte mit dem linken Mausknopf um diese Spur einem Instrument "
+"zuzuweisen."
+
+#: ../src/gui/editors/segment/TrackLabel.cpp:191
+msgid "Change track name"
+msgstr "Spurnamen ändern"
+
+#: ../src/gui/editors/segment/TrackLabel.cpp:192
+msgid "Enter new track name"
+msgstr "Neuen Spurnamen eingeben"
+
+#: ../src/gui/editors/segment/TrackEditor.cpp:648
+msgid "Turn Repeating Segment into Real Copies"
+msgstr "Wiederholungssegment in echte Kopien umwandeln"
+
+#: ../src/gui/editors/segment/TrackEditor.cpp:650
+msgid "Turn Repeating Segments into Real Copies"
+msgstr "Wiederholungssegmente in echte Kopien umwandeln"
+
+#: ../src/gui/editors/segment/TrackEditor.cpp:814
+msgid ""
+"You can't drop files into Rosegarden from this client. Try using Konqueror "
+"instead."
+msgstr ""
+"Von diesem Programm aus können Sie keine Dateien in Rosegarden "
+"\"hinüberziehen\". Probieren Sie es doch mit Konqueror."
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:85
+msgid "Manage Triggered Segments"
+msgstr "Verwalte getriggerte Segmente"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:89
+msgid "ID"
+msgstr "ID"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:735
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:93
+msgid "Base velocity"
+msgstr "Basis Anschlagstärke"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:94
+msgid "Triggers"
+msgstr "Trigger"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:115
+msgid "Add a Triggered Segment"
+msgstr "Füge getriggertes Segment hinzu"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:119
+msgid "Delete a Triggered Segment"
+msgstr "Lösche getriggertes Segment"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:123
+msgid "Delete All Triggered Segments"
+msgstr "Alle getriggerten Segemente löschen"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:127
+msgid "Close the Triggered Segment Manager"
+msgstr "Schleße den Getriggerte Segmente Manager"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:169
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:245
+msgid "<no label>"
+msgstr "(keine)"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:248
+msgid ""
+"_n: %1 on 1 track\n"
+"%1 on %n tracks"
+msgstr ""
+"_n: %1 auf 1 Spur\n"
+"%1 auf %n Spuren"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:284
+msgid ""
+"This will remove all triggered segments from the whole composition. Are you "
+"sure?"
+msgstr ""
+"Das wird alle getriggerten Segmente der gesamten Komposition entfernen. Sind "
+"Sie sicher?"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:288
+msgid "Remove all triggered segments"
+msgstr "Entferne alle getriggerten Segmente"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:313
+msgid "Trigger Segment Duration"
+msgstr "Länge des getriggerten Segments"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:336
+#, c-format
+msgid ""
+"_n: This triggered segment is used 1 time in the current composition. Are "
+"you sure you want to remove it?\n"
+"This triggered segment is used %n times in the current composition. Are you "
+"sure you want to remove it?"
+msgstr ""
+"_n: Dieses getriggerte Segment wird 1 mal in der aktuellen Komposition "
+"verwendet.Sind Sie sicher, daß Sie es entfernen möchten?\n"
+"Dieses getriggerte Segment wird %n mal in der aktuellen Komposition "
+"verwendet.Sind Sie sicher, daß Sie es entfernen möchten?"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:400
+msgid "Pa&ste as New Triggered Segment"
+msgstr "Als neues getriggertes Segment einfügen"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1169
+#: ../src/gui/editors/segment/MarkerEditor.cpp:399
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:412
+#: ../src/gui/editors/tempo/TempoView.cpp:622
+msgid "&Musical Times"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1179
+#: ../src/gui/editors/segment/MarkerEditor.cpp:409
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:422
+#: ../src/gui/editors/tempo/TempoView.cpp:632
+msgid "&Real Times"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1189
+#: ../src/gui/editors/segment/MarkerEditor.cpp:419
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:432
+#: ../src/gui/editors/tempo/TempoView.cpp:642
+msgid "Ra&w Times"
+msgstr ""
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:83
+msgid "Manage Markers"
+msgstr "Marker verwalten"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:86
+msgid "Marker time "
+msgstr "Marker Zeit"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:87
+#, fuzzy
+msgid "Marker text "
+msgstr "Marker Zeit"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:88
+msgid "Marker description "
+msgstr "Marker Beschreibung"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:95
+msgid "Pointer position"
+msgstr "Zeiger Position"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:100
+msgid "Real time:"
+msgstr ""
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:103
+msgid "In measure:"
+msgstr "In Takten:"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:121
+msgid "Add a Marker"
+msgstr "Marker hinzufügen"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:125
+msgid "Delete a Marker"
+msgstr "Marker löschen"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:129
+msgid "Delete All Markers"
+msgstr "Alle Marker löschen"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:133
+msgid "Close the Marker Editor"
+msgstr "Marker Editor schließen"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:296
+msgid "Remove all markers"
+msgstr "Alle Marker entfernen"
+
+#: ../src/gui/editors/segment/PlayList.cpp:76
+msgid "Add..."
+msgstr "Hinzufügen..."
+
+#: ../src/gui/editors/segment/PlayList.cpp:78
+msgid "Move Up"
+msgstr "Nach oben"
+
+#: ../src/gui/editors/segment/PlayList.cpp:79
+msgid "Move Down"
+msgstr "Nach unten"
+
+#: ../src/gui/editors/segment/PlayList.cpp:124
+msgid "Select one or more Rosegarden files"
+msgstr "Eine oder mehrere Rosegarden-Dateien auswählen"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:73
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:55
+msgid "<not showing>"
+msgstr "<nicht dargestellt>"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:89
+msgid "Manage Control Events"
+msgstr "Control Events verwalten"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:91
+msgid "<no device>"
+msgstr "<keine Geräte>"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:99
+msgid " Control Events for %1 (device %2)"
+msgstr " Control Events für %1 (Gerät %2)"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:104
+msgid "Control Event name "
+msgstr "Control Event Name "
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:105
+msgid "Control Event type "
+msgstr "Control Event-Art "
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:106
+msgid "Control Event value "
+msgstr "Control Event Wert "
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:107
+msgid "Description "
+msgstr "Beschreibung"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:108
+msgid "Min "
+msgstr "Min "
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:109
+msgid "Max "
+msgstr "Max "
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:110
+msgid "Default "
+msgstr "Standard-Einfügetyp"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:111
+msgid "Color "
+msgstr "Farbe"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:112
+msgid "Position on instrument panel"
+msgstr "Position in der Instrumentenansicht"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:136
+msgid "Add a Control Parameter to the Studio"
+msgstr "Control Parameter zum Studio hinzufügen"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:140
+msgid "Delete a Control Parameter from the Studio"
+msgstr "Control Parameter aus dem Studio löschen"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:144
+msgid "Close the Control Parameter editor"
+msgstr "Control Parameter Editor schließen"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:221
+msgid "<default>"
+msgstr "<Standard>"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:62
+msgid "Edit Control Parameter"
+msgstr "Control Parameter anpassen"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:71
+msgid "Control Event Properties"
+msgstr "Event-Eigenschaften"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:77
+msgid "Name:"
+msgstr "Name"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:93
+msgid "Control Event value:"
+msgstr "Controller"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:97
+msgid "Minimum value:"
+msgstr "Minimaler Wert:"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:101
+msgid "Maximum value:"
+msgstr "Maximaler Wert:"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:105
+msgid "Default value:"
+msgstr "Standardwert:"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:109
+msgid "Color:"
+msgstr "Farbe:"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:113
+msgid "Instrument Parameter Box position:"
+msgstr "Position der Instrument-Parameter-Box:"
+
+#: ../src/gui/editors/segment/TrackButtons.cpp:209
+#: ../src/gui/editors/segment/TrackButtons.cpp:585
+#: ../src/gui/editors/segment/TrackButtons.cpp:935
+#: ../src/gui/editors/segment/TrackButtons.cpp:1127
+msgid "<no instrument>"
+msgstr "<kein Instrument>"
+
+#: ../src/gui/editors/segment/TrackButtons.cpp:352
+#: ../src/gui/editors/segment/TrackButtons.cpp:1094
+msgid "<untitled audio>"
+msgstr "<unbenanntes Audio>"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:130
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:662
+#: ../src/gui/editors/segment/TrackButtons.cpp:354
+#: ../src/gui/editors/segment/TrackButtons.cpp:1096
+msgid "<untitled>"
+msgstr "<ohne Titel>"
+
+#: ../src/gui/editors/segment/TrackButtons.cpp:1058
+msgid "Mute track"
+msgstr "Spur stummschalten"
+
+#: ../src/gui/editors/segment/TrackButtons.cpp:1063
+msgid "Record on this track"
+msgstr "Auf dieser Spur aufnehmen"
+
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:88
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:1015
+msgid "Segment"
+msgstr "Segment"
+
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:89
+msgid "Segment Parameters"
+msgstr "Segment Parameter"
+
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:366
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:697
+msgid "%1 ms"
+msgstr "%1 ms"
+
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:1031
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:910
+msgid "Highest playable note"
+msgstr "Höchste spielbare Note"
+
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:1051
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:930
+msgid "Lowest playable note"
+msgstr "Tiefste spielbare Note"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:93
+msgid "Track Parameters"
+msgstr "Spurparameter"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:137
+msgid "Playback parameters"
+msgstr "Wiedergabeparameter"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:172
+msgid "Recording filters"
+msgstr "Aufnahmefilter"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:191
+msgid "Channel"
+msgstr "Kanal"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:203
+#, fuzzy
+msgid "Staff export options"
+msgstr "Experteneinstellungen"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:220
+msgid "Notation size:"
+msgstr "Notationsgröße:"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:225
+msgid "Small"
+msgstr "Klein"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:226
+msgid "Tiny"
+msgstr "Winzig"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:233
+msgid "Bracket type:"
+msgstr "Art der Klammern:"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:237
+msgid "-----"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:238
+msgid "[----"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:239
+msgid "----]"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:240
+msgid "[---]"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:241
+msgid "{----"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:242
+msgid "----}"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:243
+msgid "{[---"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:244
+msgid "---]}"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:253
+msgid "Create segments with"
+msgstr "Segmente erzeugen mit"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:264
+msgid "Preset"
+msgstr "Voreinstellung"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:272
+msgid "Load"
+msgstr "Laden"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:282
+msgid "treble"
+msgstr "Sopran"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:283
+msgid "bass"
+msgstr "Baß"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:284
+msgid "crotales"
+msgstr "Crotales"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:285
+msgid "xylophone"
+msgstr "Xylophone"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:286
+msgid "guitar"
+msgstr "Guitarre"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:287
+msgid "contrabass"
+msgstr "Kontrabaß"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:288
+msgid "celesta"
+msgstr "Celesta"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:289
+msgid "old celesta"
+msgstr "Alte Celesta"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:290
+msgid "french"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:291
+msgid "soprano"
+msgstr "Sopran"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:292
+#, fuzzy
+msgid "mezzosoprano"
+msgstr "Sopran"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:293
+msgid "alto"
+msgstr "Alt"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:294
+msgid "tenor"
+msgstr "Tenor"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:295
+#, fuzzy
+msgid "baritone"
+msgstr "Variation"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:296
+#, fuzzy
+msgid "varbaritone"
+msgstr "Variation"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:297
+#, fuzzy
+msgid "subbass"
+msgstr "Baß"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:327
+msgid "Lowest"
+msgstr "Niedrigste"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:329
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:336
+msgid "---"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:331
+msgid "Choose the lowest suggested playable note, using a staff"
+msgstr ""
+"Wählen Sie die tiefste vorgeschlagene spielbare Note, unter Verwendung des "
+"Notensystems"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:334
+msgid "Highest"
+msgstr "Höchste"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:338
+msgid "Choose the highest suggested playable note, using a staff"
+msgstr ""
+"Wählen Sie die höchste vorgeschlagene spielbare Note, unter Verwendung des "
+"Notensystems"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:666
+#, fuzzy
+msgid "[ Track %1 - %2 ]"
+msgstr "[ Spur#%1 - %2 ]"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:985
+msgid "The instrument preset database is corrupt. Check your installation."
+msgstr ""
+"Die Instrumentvoreinstellungen Datenbank ist korrupt. Überprüfen Sie Ihre "
+"Installation."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:173
+#: ../src/gui/editors/parameters/InstrumentParameterBox.cpp:54
+msgid "Instrument Parameters"
+msgstr "Instrumentenparameter"
+
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:85
+msgid "Variation"
+msgstr "Variation"
+
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:86
+msgid "Program"
+msgstr "Programm"
+
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:87
+msgid "Channel out"
+msgstr "Ausgabekanal"
+
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:215
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:221
+msgid "[ %1 ]"
+msgstr "[ %1 ]"
+
+#: ../src/gui/editors/matrix/MatrixEraser.cpp:58
+#: ../src/gui/editors/matrix/MatrixMover.cpp:71
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:67
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:77
+msgid "Switch to Draw Tool"
+msgstr "Zum Zeichenwerkzeug wechseln"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:75
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:69
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:71
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:81
+#: ../src/gui/editors/notation/ClefInserter.cpp:57
+#: ../src/gui/editors/notation/GuitarChordInserter.cpp:63
+#: ../src/gui/editors/notation/NotationSelector.cpp:87
+#: ../src/gui/editors/notation/NoteInserter.cpp:113
+#: ../src/gui/editors/notation/RestInserter.cpp:72
+#: ../src/gui/editors/notation/TextInserter.cpp:61
+msgid "Switch to Erase Tool"
+msgstr "Zum Löschwerkzeug wechseln"
+
+#: ../src/gui/editors/matrix/MatrixEraser.cpp:62
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:73
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:75
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:85
+msgid "Switch to Move Tool"
+msgstr "Zum Bewegungswerkzeug wechseln"
+
+#: ../src/gui/editors/matrix/MatrixEraser.cpp:68
+#: ../src/gui/editors/matrix/MatrixMover.cpp:81
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:79
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:93
+msgid "Switch to Resize Tool"
+msgstr "Zum Größenänderungswerkzeug wechseln"
+
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:446
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:579
+msgid "Click and drag to select; middle-click and drag to draw new note"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:324
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:597
+msgid "Click and drag to resize selected notes"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:599
+msgid "Click and drag to resize note"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:471
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:604
+msgid "Click and drag to move selected notes; hold Ctrl as well to copy"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:473
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:606
+msgid "Click and drag to copy selected notes"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:610
+msgid "Click and drag to move note; hold Ctrl as well to copy"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:612
+msgid "Click and drag to copy note"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixEraser.cpp:54
+#: ../src/gui/editors/matrix/MatrixMover.cpp:67
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:65
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:63
+#: ../src/gui/editors/notation/ClefInserter.cpp:53
+#: ../src/gui/editors/notation/GuitarChordInserter.cpp:59
+#: ../src/gui/editors/notation/NotationEraser.cpp:67
+#: ../src/gui/editors/notation/NoteInserter.cpp:109
+#: ../src/gui/editors/notation/RestInserter.cpp:68
+#: ../src/gui/editors/notation/TextInserter.cpp:57
+msgid "Switch to Select Tool"
+msgstr "Zum Auswahlwerkzeug wechseln"
+
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:218
+msgid "Resize Event"
+msgstr "Eventgröße verändern"
+
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:221
+msgid "Resize Events"
+msgstr "Eventgrößen verändern"
+
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:326
+msgid "Click and drag to resize a note"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:328
+msgid "Copy and Move Event"
+msgstr "Event kopieren und bewegen"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:330
+msgid "Copy and Move Events"
+msgstr "Mehrere Events kopieren und bewegen"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:334
+msgid "Move Event"
+msgstr "Event bewegen"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:336
+msgid "Move Events"
+msgstr "Events bewegen"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:465
+msgid "Click and drag to move a note; hold Ctrl as well to copy it"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:467
+msgid "Click and drag to copy a note"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:361
+msgid "Click and drag to draw a note; Shift to avoid snapping to grid"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:363
+msgid "Click and drag to draw a note"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:437
+#: ../src/gui/editors/matrix/MatrixView.cpp:3053
+msgid "Couldn't apply piano roll layout"
+msgstr "Klavierrollen-Layout konnte nicht angewandt werden"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:663
+msgid "Resi&ze"
+msgstr "Größe &ändern"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:669
+#: ../src/gui/editors/notation/NotationView.cpp:1919
+msgid "C&hord Insert Mode"
+msgstr "A&kkord-Einfügemodus"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:676
+#: ../src/gui/editors/notation/NotationView.cpp:1778
+msgid "Ste&p Recording"
+msgstr "Schritt&weise Aufnahme"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:694
+msgid "&Legato"
+msgstr "&Legato"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:708
+msgid "Set to Current Velocity"
+msgstr "Setze auf momentane Anschlagstärke"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:712
+msgid "Set Event &Velocities..."
+msgstr "Anschlagstärke der Events setzen..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:716
+msgid "Trigger Se&gment..."
+msgstr "Trigger Se&gment..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:720
+msgid "Remove Triggers..."
+msgstr "&Tempoveränderungen entfernen..."
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1153
+#: ../src/gui/editors/matrix/MatrixView.cpp:724
+#: ../src/gui/editors/tempo/TempoView.cpp:606
+msgid "Select &All"
+msgstr "&Alles auswählen"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:732
+#: ../src/gui/editors/notation/NotationView.cpp:2325
+msgid "Cursor &Back"
+msgstr "Cursor &zurück"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:736
+#: ../src/gui/editors/notation/NotationView.cpp:2329
+msgid "Cursor &Forward"
+msgstr "Cursor &vorwärts"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:740
+#: ../src/gui/editors/notation/NotationView.cpp:2333
+msgid "Cursor Ba&ck Bar"
+msgstr "Cursor &Takt zurück"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:744
+#: ../src/gui/editors/notation/NotationView.cpp:2337
+msgid "Cursor For&ward Bar"
+msgstr "Cursor Ta&kt vorwärts"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:748
+#: ../src/gui/editors/notation/NotationView.cpp:2341
+msgid "Cursor Back and Se&lect"
+msgstr "Cursor zurück und Aus&wählen"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:752
+#: ../src/gui/editors/notation/NotationView.cpp:2345
+msgid "Cursor Forward and &Select"
+msgstr "Cursor vorwärts und auswäh&len"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:756
+#: ../src/gui/editors/notation/NotationView.cpp:2349
+msgid "Cursor Back Bar and Select"
+msgstr "Cursor Takt zurück und auswählen"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:760
+#: ../src/gui/editors/notation/NotationView.cpp:2353
+msgid "Cursor Forward Bar and Select"
+msgstr "Cursor Takt vorwärts und auswählen"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:764
+#: ../src/gui/editors/notation/NotationView.cpp:2363
+msgid "Cursor to St&art"
+msgstr "Cursor zum &Anfang"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:770
+#: ../src/gui/editors/notation/NotationView.cpp:2369
+msgid "Cursor to &End"
+msgstr "Cursor zum &Ende"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:776
+#: ../src/gui/editors/notation/NotationView.cpp:2391
+msgid "Cursor to &Playback Pointer"
+msgstr "Cursor zum &Wiedergabezeiger"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:820
+#: ../src/gui/editors/notation/NotationView.cpp:2435
+msgid "Playback Pointer to &Cursor"
+msgstr "Wiedergabezeiger zum &Cursor"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:826
+#: ../src/gui/editors/notation/NotationView.cpp:2441
+msgid "&Solo"
+msgstr "&Solo"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:841
+#: ../src/gui/editors/notation/NotationView.cpp:2456
+msgid "Set Loop to Selection"
+msgstr "Auswahl als Schleife festlegen"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:845
+#: ../src/gui/editors/notation/NotationView.cpp:2460
+msgid "Clear L&oop"
+msgstr "Schleife l&öschen"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1157
+#: ../src/gui/editors/matrix/MatrixView.cpp:849
+#: ../src/gui/editors/notation/NotationView.cpp:2464
+#: ../src/gui/editors/tempo/TempoView.cpp:610
+msgid "Clear Selection"
+msgstr "Auswahl löschen"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1149
+#: ../src/gui/editors/matrix/MatrixView.cpp:854
+#: ../src/gui/editors/notation/NotationView.cpp:2471
+msgid "&Filter Selection"
+msgstr "&Filter-Auswahl"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:879
+msgid "&No Snap"
+msgstr "&Einrasten aus"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:884
+msgid "Snap to Bea&t"
+msgstr "Auf Schla&g einrasten"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:888
+msgid "Snap to &Bar"
+msgstr "Auf &Takt einrasten"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:908
+#, fuzzy, c-format
+msgid "Snap to %1"
+msgstr "Auf Halbe einrasten"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:917
+msgid "Show Instrument Parameters"
+msgstr "&Instrumentparameter anzeigen"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:922
+#: ../src/gui/editors/notation/NotationView.cpp:1850
+msgid "Show Ch&ord Name Ruler"
+msgstr "Ak&kordnamenlineal anzeigen"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:926
+#: ../src/gui/editors/notation/NotationView.cpp:1858
+msgid "Show &Tempo Ruler"
+msgstr "&Tempolineal anzeigen"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1238
+#: ../src/gui/editors/notation/NotationView.cpp:3245
+#, c-format
+msgid ""
+"_n: 1 event selected \n"
+" %n events selected "
+msgstr ""
+"_n: 1 Event ausgewählt \n"
+" %n Events ausgewählt "
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1241
+#: ../src/gui/editors/notation/NotationView.cpp:3247
+msgid " No selection "
+msgstr " Keine Auswahl "
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1348
+#: ../src/gui/editors/matrix/MatrixView.cpp:1360
+#: ../src/gui/editors/matrix/MatrixView.cpp:2079
+#: ../src/gui/editors/notation/NotationView.cpp:5869
+msgid "Quantizing..."
+msgstr "Quantisieren..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1370
+#: ../src/gui/editors/notation/NotationView.cpp:5407
+msgid "Collapsing notes..."
+msgstr "linkend=\\\"nv-rulers\\\">Rulers and Cursors</link>"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1381
+msgid "Making legato..."
+msgstr "Mache Legato..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1476
+#, fuzzy
+msgid "Note: %1 (%2.%3s)"
+msgstr "Zeit: %1 (%2.%3)"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1531
+#: ../src/gui/editors/notation/NotationView.cpp:7206
+msgid "Time: %1 (%2.%3s)"
+msgstr "Zeit: %1 (%2.%3)"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1604
+#: ../src/gui/editors/notation/NotationView.cpp:4744
+#: ../src/gui/editors/notation/NotationView.cpp:4773
+msgid "Cutting selection to clipboard..."
+msgstr "Auswahl in die Zwischenablage ausschneiden..."
+
+#: ../src/gui/editors/eventlist/EventView.cpp:912
+#: ../src/gui/editors/matrix/MatrixView.cpp:1636
+#: ../src/gui/editors/notation/NotationSelectionPaster.cpp:82
+msgid "Couldn't paste at this point"
+msgstr "An dieser Stelle kein Einfügen möglich"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1647
+#: ../src/gui/editors/notation/NotationView.cpp:4754
+msgid "Deleting selection..."
+msgstr "Auswahl löschen..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1833
+#: ../src/gui/editors/notation/NotationView.cpp:5617
+#, c-format
+msgid "Unknown note insert action %1"
+msgstr "Unbekannte Noten-Einfügeaktion %1"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1837
+#: ../src/gui/editors/matrix/MatrixView.cpp:2857
+#: ../src/gui/editors/notation/NotationView.cpp:5621
+msgid "Inserting note"
+msgstr "Note einfügen"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2091
+msgid "Unquantizing..."
+msgstr "Dequantisieren..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2120
+msgid " Grid: "
+msgstr "Raster: "
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2134
+msgid "Unit"
+msgstr "Einheit"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2136
+msgid "Beat"
+msgstr "Beat"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2138
+msgid "Bar"
+msgstr "Takt"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2159
+msgid " Velocity: "
+msgstr "Anschlagstärke: "
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2170
+msgid " Quantize: "
+msgstr "Quantisieren: "
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2584
+msgid "Raising velocities..."
+msgstr "Anschlagstärke erhöhen..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2596
+msgid "Lowering velocities..."
+msgstr "Anschlagstärke verringern..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2611
+msgid "Set Event Velocities"
+msgstr "Anschlagstärke der Events setzen"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2616
+msgid "Setting Velocities..."
+msgstr "Anschlagstärke setzen..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2665
+msgid "Remove Triggers"
+msgstr "Alle Ma&rken löschen"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2723
+msgid "%1 - Segment Track #%2 - %3"
+msgstr "%1 - Segment Spur #%2 - %3"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2730
+msgid "%1 - All Segments - %2"
+msgstr "%1 - Alle Segmente - %2"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2737
+msgid ""
+"_n: %1 - 1 Segment - %2\n"
+"%1 - %n Segments - %2"
+msgstr ""
+"_n: %1 - 1 Segment - %2\n"
+"%1 - %n Segmente - %2"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2885
+msgid "Can't insert note: No grid duration selected"
+msgstr "Kann Note nicht einfügen: Keine Rasterdauer gewählt"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2935
+#, fuzzy
+msgid " Chord "
+msgstr " Akkord"
+
+#: ../src/gui/editors/matrix/MatrixEraser.cpp:105
+msgid "Click on a note to delete it"
+msgstr ""
+
+#: ../src/gui/editors/tempo/TempoView.cpp:89
+msgid "Filter"
+msgstr "Filter"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:245
+#: ../src/gui/editors/tempo/TempoView.cpp:117
+msgid "Time "
+msgstr "Zeit "
+
+#: ../src/gui/editors/tempo/TempoView.cpp:118
+msgid "Type "
+msgstr "Typ"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:119
+msgid "Value "
+msgstr "Wert"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:120
+msgid "Properties "
+msgstr "Eigenschaften"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:208
+msgid "Common, hidden"
+msgstr "Allgemein, versteckt"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:210
+msgid "Hidden"
+msgstr "Versteckt"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:213
+msgid "Common"
+msgstr "Allgemein"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:220
+msgid "Time Signature "
+msgstr "Taktart"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:245
+msgid "%1.%2%3"
+msgstr "%1.%2%3"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:255
+msgid "%1.%2%3 qpm (%4.%5%6 bpm) "
+msgstr "%1.%2%3 qpm (%4.%5%6 bpm) "
+
+#: ../src/gui/editors/tempo/TempoView.cpp:264
+msgid "Tempo "
+msgstr "Tempo"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:271
+msgid "<nothing at this filter level>"
+msgstr "<nichts auf dieser Filterebene>"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:463
+msgid "Delete Tempo or Time Signature"
+msgstr "Tempo oder Taktart löschen"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:602
+msgid "&Edit Item"
+msgstr "Objekt b&earbeiten"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:834
+msgid "%1 - Tempo and Time Signature Editor"
+msgstr "%1 - Tempo- und Taktart-Editor"
+
+#: ../src/gui/editors/guitar/GuitarChordEditorDialog.cpp:43
+#, fuzzy
+msgid "Guitar Chord Editor"
+msgstr "Guitarrenakkord Editor"
+
+#: ../src/gui/editors/guitar/GuitarChordEditorDialog.cpp:51
+#, fuzzy
+msgid "Start fret"
+msgstr "Anfangstakt"
+
+#: ../src/gui/editors/guitar/GuitarChordEditorDialog.cpp:58
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:51
+msgid "Root"
+msgstr ""
+
+#: ../src/gui/editors/guitar/GuitarChordEditorDialog.cpp:62
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:55
+msgid "Extension"
+msgstr "Erweiterung"
+
+#: ../src/gui/editors/guitar/Fingering.cpp:118
+msgid "couldn't parse fingering '%1' in '%2'"
+msgstr ""
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:45
+#, fuzzy
+msgid "Guitar Chord Selector"
+msgstr "Akkord wählen"
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:64
+msgid "beginner"
+msgstr ""
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:65
+#, fuzzy
+msgid "common"
+msgstr "Allgemein"
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:66
+#, fuzzy
+msgid "all"
+msgstr "Alle"
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:86
+msgid "Fingerings"
+msgstr "&Fingersätze"
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:419
+msgid "couldn't open file '%1'"
+msgstr "Datei %1 kann nicht geöfnet werden '"
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:428
+#, c-format
+msgid "couldn't parse chord dictionnary : %1"
+msgstr ""
+
+#: ../src/gui/editors/notation/NoteFontViewer.cpp:87
+#, c-format
+msgid "Note Font Viewer: %1"
+msgstr "Noten Schriftart Anzeige: %1"
+
+#: ../src/gui/editors/notation/NoteFontViewer.cpp:93
+msgid " Component: "
+msgstr "Komponente"
+
+#: ../src/gui/editors/notation/NoteFontViewer.cpp:101
+msgid " View: "
+msgstr "Ansicht"
+
+#: ../src/gui/editors/notation/NoteFontViewer.cpp:104
+msgid "Glyphs"
+msgstr "Akzentuierungszeichen"
+
+#: ../src/gui/editors/notation/NoteFontViewer.cpp:105
+msgid "Codes"
+msgstr ""
+
+#: ../src/gui/editors/notation/NoteFontViewer.cpp:107
+msgid " Page: "
+msgstr "Seite:"
+
+#: ../src/gui/editors/notation/ClefInserter.cpp:64
+#: ../src/gui/editors/notation/GuitarChordInserter.cpp:71
+#: ../src/gui/editors/notation/RestInserter.cpp:79
+#: ../src/gui/editors/notation/TextInserter.cpp:68
+msgid "Switch to Inserting Notes"
+msgstr "Zum Einfügen von Noten wechseln"
+
+#: ../src/gui/editors/notation/NotationView.cpp:522
+#, fuzzy
+msgid "Close track headers"
+msgstr "Spurnamen ändern"
+
+#: ../src/gui/editors/notation/NotationView.cpp:917
+msgid "Preparing to print..."
+msgstr "Druck wird vorbereitet..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:1516
+msgid "Note &Font"
+msgstr "Noten&font"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1539
+msgid "Si&ze"
+msgstr "&Größe"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1545
+#, fuzzy
+msgid "Show Track Headers"
+msgstr "Tonspur-&Labels anzeigen"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1550
+msgid "S&pacing"
+msgstr "&Abstände"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1572
+msgid "Du&ration Factor"
+msgstr "Dauer: "
+
+#: ../src/gui/editors/notation/NotationView.cpp:1598
+msgid "Note &Style"
+msgstr "Noten&stil"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1624
+msgid "Insert Rest"
+msgstr "Pause einfügen"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1628
+msgid "Switch from Note to Rest"
+msgstr "Von Note auf Pause umschalten"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1633
+msgid "Switch from Rest to Note"
+msgstr "Von Pause auf Note umschalten"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1690
+msgid "No accidental"
+msgstr "Kein Vorzeichen"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1691
+msgid "Follow previous accidental"
+msgstr "Vorzeichen werden erzwungen..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:1692
+msgid "Sharp"
+msgstr "Kreuz"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1693
+msgid "Flat"
+msgstr "B"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1694
+msgid "Natural"
+msgstr "l"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1695
+msgid "Double sharp"
+msgstr "Doppelkreuz"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1696
+msgid "Double flat"
+msgstr "Doppel-B"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1717
+msgid "&Treble Clef"
+msgstr "&Violinschlüssel"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1724
+msgid "&Alto Clef"
+msgstr "&Altschlüssel"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1731
+msgid "Te&nor Clef"
+msgstr "&Tenorschlüssel"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1738
+msgid "&Bass Clef"
+msgstr "&Bassschlüssel"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1745
+msgid "&Text"
+msgstr "&Text"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1751
+#, fuzzy
+msgid "&Guitar Chord"
+msgstr "Guitarrenakkord Editor"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1784
+msgid "Select from Sta&rt"
+msgstr "Vom Sta&rt an auswählen"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1788
+msgid "Select to &End"
+msgstr "Bis zum &Ende auswählen"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1792
+msgid "Select Whole St&aff"
+msgstr "Das komplette S&ystem auswählen"
+
+#: ../src/commands/edit/CutAndCloseCommand.h:53
+#: ../src/gui/editors/notation/NotationView.cpp:1796
+msgid "C&ut and Close"
+msgstr "Sch&neiden und Schließen"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1800
+msgid "Pa&ste..."
+msgstr "Ein&fügen..."
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:122
+#: ../src/gui/editors/notation/NotationView.cpp:1808
+msgid "Move to Staff Above"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:126
+#: ../src/gui/editors/notation/NotationView.cpp:1812
+msgid "Move to Staff Below"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1826
+msgid "&Linear Layout"
+msgstr "&Lineares Layout"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1835
+msgid "&Continuous Page Layout"
+msgstr "&Seitenlayout"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1844
+msgid "&Multiple Page Layout"
+msgstr "&Seitenlayout"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1854
+msgid "Show Ra&w Note Ruler"
+msgstr "&Rohnotenlineal zeigen"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1862
+msgid "Show &Annotations"
+msgstr "&Bemerkungen zeigen"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1866
+msgid "Show Lily&Pond Directives"
+msgstr "Zeige Lily&Pond Anweisungen"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1870
+msgid "Open L&yric Editor"
+msgstr "&Texteditor öffnen"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1912
+msgid "Trip&let Insert Mode"
+msgstr "Tri&olen-Einfügemodus"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1926
+#, fuzzy
+msgid "Grace Insert Mode"
+msgstr "Tri&olen-Einfügemodus"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2180
+msgid "&Dump selected events to stderr"
+msgstr "&Ausgewählte Events nach stderr ausgeben"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2248
+msgid "Ma&ke Ornament..."
+msgstr "Verzierungen..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:2252
+msgid "Trigger &Ornament..."
+msgstr "Trigger Verzierung..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:2256
+msgid "Remove Ornament..."
+msgstr "Verzierung entfernen..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:2261
+msgid "&None"
+msgstr "&Kein"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2289
+#, fuzzy
+msgid "Convert Notation For..."
+msgstr "Audiodatei wird exportiert..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:2298
+msgid "Show &Notes Toolbar"
+msgstr "&Noten-Werkzeugleiste anzeigen"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2299
+msgid "Show &Rests Toolbar"
+msgstr "&Pausen-Werkzeugleiste anzeigen"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2300
+msgid "Show &Accidentals Toolbar"
+msgstr "&Vorzeichen-Werkzeugleiste anzeigen"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2301
+msgid "Show Cle&fs Toolbar"
+msgstr "&Schlüssel-Werkzeugleiste anzeigen"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2303
+msgid "Show &Marks Toolbar"
+msgstr "&Vortragszeichen-Werkzeugleiste anzeigen"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2305
+msgid "Show &Group Toolbar"
+msgstr "&Gruppen-Werkzeugleiste anzeigen"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2307
+msgid "Show &Layout Toolbar"
+msgstr "&Layout-Werkzeugleiste anzeigen"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2311
+msgid "Show M&eta Toolbar"
+msgstr "M&eta-Werkzeugleiste anzeigen"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2373
+msgid "Cursor &Up Staff"
+msgstr "Cursor ein System nach &oben"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2377
+msgid "Cursor &Down Staff"
+msgstr "Cursor ein System nach &unten"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2381
+msgid "Cursor Pre&vious Segment"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2385
+#, fuzzy
+msgid "Cursor Ne&xt Segment"
+msgstr "Segmente erzeugen"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2475
+msgid "Push &Left"
+msgstr "Nach &links schieben"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2479
+msgid "Push &Right"
+msgstr "Nach &rechts schieben"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2483
+msgid "Push &Up"
+msgstr "Nach oben schieben"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2487
+msgid "Push &Down"
+msgstr "Nach unten schieben"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2491
+msgid "&Restore Positions"
+msgstr "Be&rechnete Positionen wiederherstellen"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2495
+msgid "Make &Invisible"
+msgstr "Mache unsichtbar"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2499
+msgid "Make &Visible"
+msgstr "Mach sichtbar"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2503
+msgid "Toggle Dot"
+msgstr "Punktierung umschalten"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2507
+#: ../src/gui/editors/notation/NotationView.cpp:2511
+msgid "Add Dot"
+msgstr "Punktierung hinzufügen"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2570
+#, c-format
+msgid ""
+"_n: 1 pixel\n"
+"%n pixels"
+msgstr ""
+"_n: 1 Pixel\n"
+"%n Pixel"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2619
+msgid " Font: "
+msgstr " Font: "
+
+#: ../src/gui/editors/notation/NotationView.cpp:2647
+msgid "Unknown font \"%1\", using default"
+msgstr "Font \"%1\" ist unbekannt, stattdessen wird der Standardfont benutzt"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2655
+msgid " Size: "
+msgstr " Größe "
+
+#: ../src/gui/editors/notation/NotationView.cpp:2677
+msgid " Spacing: "
+msgstr " Abstände "
+
+#: ../src/gui/editors/notation/NotationView.cpp:2993
+#: ../src/gui/editors/notation/NotationView.cpp:3818
+msgid " Ready."
+msgstr " Fertig."
+
+#: ../src/gui/editors/notation/NotationView.cpp:2998
+msgid "Laying out score..."
+msgstr "Partitur wird angeordnet..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:3011
+msgid "Laying out staff %1..."
+msgstr "System %1 wird angeordnet..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:3020
+msgid "Reconciling staffs..."
+msgstr "Systeme werden ausgerichtet..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:3885
+msgid "Sizing and allocating canvas..."
+msgstr "Die Darstellungsfläche wird berechnet..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:4050
+msgid "note"
+msgstr "Note"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4050
+msgid "rest"
+msgstr "Pause"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4211
+msgid "%1 - Segment Track #%2 - Notation"
+msgstr "%1 - Segment Spur #%2 - Notation"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4217
+msgid "%1 - All Segments - Notation"
+msgstr "%1 - Alle Segmente - Notation"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4222
+msgid ""
+"_n: %1 - Segment - Notation\n"
+"%1 - %n Segments - Notation"
+msgstr ""
+"%1 - Segment - Notation\n"
+"%1 - %n Segmente - Notation"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4243
+#, fuzzy
+msgid "Grace"
+msgstr "Grave"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4247
+#: ../src/gui/editors/notation/NotationView.cpp:4251
+#: ../src/gui/editors/notation/NotationView.cpp:4255
+#, fuzzy
+msgid "%1 %2"
+msgstr "%1 (%2)"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4271
+msgid "Hidden annotations"
+msgstr "Verborgene Anmerkungen"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4293
+msgid "Hidden LilyPond directives"
+msgstr "Verborgene LilyPond Anweisungen"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4326
+#, c-format
+msgid "Unknown spacing action %1"
+msgstr "Abstandsaktion %1 ist unbekannt"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4384
+#, c-format
+msgid "Unknown proportion action %1"
+msgstr "Proportions-Aktion %1 ist unbekannt"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4431
+#, c-format
+msgid "Unknown font action %1"
+msgstr "Font-Aktion %1 ist unbekannt"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4449
+#, c-format
+msgid "Unknown font size %1"
+msgstr "Unbekannte Fontgröße: %1"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4453
+#, c-format
+msgid "Unknown font size action %1"
+msgstr "Unbekannte Fontgrößenaktion: %1"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4780
+#, fuzzy
+msgid ""
+"The Restricted paste type requires enough empty space (containing only "
+"rests) at the paste position to hold all of the events to be pasted.\n"
+"Not enough space was found.\n"
+"If you want to paste anyway, consider using one of the other paste types "
+"from the \"Paste...\" option on the Edit menu. You can also change the "
+"default paste type to something other than Restricted if you wish."
+msgstr ""
+"Das eingeschränkte Einfügen erfordert ausreichend leeren Platz (Pausen) an "
+"der \n"
+"Einfügeposition, um alle einzufügenden Events aufzunehmen.\n"
+"Es wurde nicht ausreichend Platz gefunden.\n"
+"Wenn Sie trotzdem einfügen wollen, sollten Sie einen der anderen Einfügemodi "
+"aus dem \n"
+"\"Einfügen...\"-Menü in Betracht ziehen. Sie können dort auch einen anderen "
+"Standard-Einfügemodus \n"
+"als den eingeschränkten wählen."
+
+#: ../src/gui/editors/notation/NotationView.cpp:4800
+msgid "Can't paste multiple Segments into one"
+msgstr "Mehrere Segments können nicht in eins eingefügt werden"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4828
+#: ../src/gui/editors/notation/NotationView.cpp:4877
+msgid "Couldn't paste at this point."
+msgstr "Kein Einfügen an diesem Punkt möglich"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4896
+#, fuzzy
+msgid "Move Events to Staff Above"
+msgstr "Event ausserhalb eines Segments"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4924
+#, fuzzy
+msgid "Move Events to Staff Below"
+msgstr "Event ausserhalb eines Segments"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5036
+msgid "Pushing selection left..."
+msgstr "Auswahl nach links verschieben..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5047
+msgid "Pushing selection right..."
+msgstr "Auswahl nach rechts verschieben..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5058
+msgid "Pushing selection up..."
+msgstr "Auswahl nach oben verschieben..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5069
+msgid "Pushing selection down..."
+msgstr "Auswahl nach unten verschieben..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5080
+msgid "Restoring computed positions..."
+msgstr "Berechnete Positionen wiederherstellen..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5089
+msgid "Making visible..."
+msgstr "Sichtbar machen..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5098
+msgid "Making invisible..."
+msgstr "Unsichtbar machen..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5185
+msgid "Beaming group..."
+msgstr "Gruppe bekommt Balken..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5195
+msgid "Auto-beaming selection..."
+msgstr "Auswahl wird automatisch mit Balken versehen..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5205
+msgid "Breaking groups..."
+msgstr "Gruppen werden aufgebrochen..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5293
+msgid "Untupleting..."
+msgstr "Tuolen werden aufgelöst..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5301
+msgid "Adding slur..."
+msgstr "Bogen hinzufügen..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5302
+msgid "slur"
+msgstr "Bogen"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5307
+msgid "Adding phrasing slur..."
+msgstr "Phrasierungsbogen hinzufügen..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5308
+msgid "phrasing slur"
+msgstr "Phrasierungsbogen"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5313
+msgid "Adding glissando..."
+msgstr "Glissando hinzufügen..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5314
+msgid "glissando"
+msgstr "Glissando"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5319
+msgid "Adding crescendo..."
+msgstr "Crescendo hinzufügen..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5320
+#: ../src/gui/editors/notation/NotationView.cpp:5326
+msgid "dynamic"
+msgstr "Dynamik"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5325
+msgid "Adding decrescendo..."
+msgstr "Decrescendo hinzufügen..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5331
+#: ../src/gui/editors/notation/NotationView.cpp:5337
+#: ../src/gui/editors/notation/NotationView.cpp:5343
+#: ../src/gui/editors/notation/NotationView.cpp:5349
+msgid "Adding octave..."
+msgstr "Oktave hinzufügen..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5332
+#: ../src/gui/editors/notation/NotationView.cpp:5338
+#: ../src/gui/editors/notation/NotationView.cpp:5344
+#: ../src/gui/editors/notation/NotationView.cpp:5350
+msgid "ottava"
+msgstr "8va"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5366
+msgid "Can't add overlapping %1 indications"
+msgstr "Kann überlappende %1 Bezeichnungen nicht hinzufügen"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5375
+msgid "Making chord..."
+msgstr "Erzeuge Akkord..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5387
+msgid "Normalizing rests..."
+msgstr "Pausen normalisieren..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5397
+msgid "Collapsing rests..."
+msgstr "Pausen zusammenfassen..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5417
+msgid "Tying notes..."
+msgstr "Noten verbinden..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5427
+msgid "Untying notes..."
+msgstr "Noten trennen..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5437
+msgid "Making notes viable..."
+msgstr "Noten werden in vernünftige Längen aufgebrochen..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5447
+msgid "Removing counterpoint..."
+msgstr "Kontrapunkt wird gelöscht..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5457
+msgid "Pointing stems up..."
+msgstr "Notenhälse nach oben..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5467
+msgid "Pointing stems down..."
+msgstr "Notenhälse nach unten..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5478
+msgid "Restoring computed stem directions..."
+msgstr "Errechnete Notenhälse werden wiederhergestellt..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5488
+#: ../src/gui/editors/notation/NotationView.cpp:5498
+msgid "Positioning slurs..."
+msgstr "Bögen positionieren..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5509
+msgid "Restoring slur positions..."
+msgstr "Bogenpositionen wiederherstellen..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5519
+#: ../src/gui/editors/notation/NotationView.cpp:5529
+#, fuzzy
+msgid "Positioning ties..."
+msgstr "Bögen positionieren..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5540
+#, fuzzy
+msgid "Restoring tie positions..."
+msgstr "Berechnete Positionen wiederherstellen..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5550
+msgid "Fixing notation quantization..."
+msgstr "Notations-Quantisierung wird korrigiert..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5560
+msgid "Removing notation quantization..."
+msgstr "Darstellungsquantisierung entfernen..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5577
+msgid "Changing to %1 style..."
+msgstr "Wechsel zu Stil %1..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5585
+#, c-format
+msgid "Unknown style action %1"
+msgstr "Unbekannte Stilaktion: %1"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5598
+#: ../src/gui/editors/notation/NotationView.cpp:5639
+#: ../src/gui/editors/notation/NotationView.cpp:5695
+msgid "No note duration selected"
+msgstr "Keine Dauer ausgewählt"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5660
+msgid "No rest duration selected"
+msgstr "Keine Pausendauer ausgewählt"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5746
+msgid "No note or rest duration selected"
+msgstr "Keine Noten- oder Pausenlänge gewählt"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5757
+#: ../src/gui/editors/notation/NotationView.cpp:5768
+#: ../src/gui/editors/notation/NotationView.cpp:5779
+#: ../src/gui/editors/notation/NotationView.cpp:5790
+#: ../src/gui/editors/notation/NotationView.cpp:5801
+#: ../src/gui/editors/notation/NotationView.cpp:5812
+#: ../src/gui/editors/notation/NotationView.cpp:5823
+msgid "Forcing accidentals..."
+msgstr "Vorzeichen werden erzwungen..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5834
+msgid "Restoring accidentals..."
+msgstr "Vorzeichen werden wiederhergestellt"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5845
+msgid "Showing cautionary accidentals..."
+msgstr "Zeige Sicherheitsvorzeichen..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5855
+msgid "Cancelling cautionary accidentals..."
+msgstr "Lösche Sicherheitsvorzeichen..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5884
+msgid "Interpreting selection..."
+msgstr "Auswahl wird interpretiert..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5896
+msgid "Setting note durations..."
+msgstr "Notenlänge setzen..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5904
+#: ../src/gui/editors/notation/NotationView.cpp:5912
+msgid "Adding dot..."
+msgstr "Punktierung hinzufügen..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5934
+msgid "Text: "
+msgstr "Text: "
+
+#: ../src/gui/editors/notation/NotationView.cpp:5948
+msgid "Fingering: "
+msgstr "Fingersatz:"
+
+#: ../src/gui/editors/notation/NotationView.cpp:6036
+msgid "Ornament track %1 bar %2"
+msgstr "Verzierung auf Spur %1 Takt %2"
+
+#: ../src/gui/editors/notation/NotationView.cpp:6038
+#, c-format
+msgid "Ornament bar %1"
+msgstr "Verzierung in Takt %1"
+
+#: ../src/gui/editors/notation/NotationView.cpp:6098
+msgid "Remove Ornaments"
+msgstr "Verzierungen entfernen"
+
+#: ../src/gui/editors/notation/NotationView.cpp:6145
+msgid "Estimated key signature shown"
+msgstr "Ermittelte Tonart wird angezeigt"
+
+#: ../src/gui/editors/notation/NotationStaff.cpp:1249
+#: ../src/gui/editors/notation/NotationView.cpp:6202
+msgid "Sustain"
+msgstr "Halten"
+
+#: ../src/gui/editors/notation/NotationView.cpp:6218
+msgid ""
+"There is no sustain controller defined for this device.\n"
+"Please ensure the device is configured correctly in the Manage MIDI Devices "
+"dialog in the main window."
+msgstr ""
+"Für dieses Gerät ist kein Sustain-Controller definiert.\n"
+"Bitte überprüfen Sie die Einstellungen im Verwalte MIDI Geräte Dialog im "
+"Hauptfenster."
+
+#: ../src/gui/editors/notation/NotationView.cpp:7250
+msgid "Can't insert note: No note duration selected"
+msgstr "Note kann nicht eingefügt werden: Keine Dauer ausgewählt"
+
+#: ../src/gui/editors/notation/NotationEraser.cpp:61
+#: ../src/gui/editors/notation/NotationSelector.cpp:83
+msgid "Switch to Insert Tool"
+msgstr "Zum Einfügewerkzeug wechseln"
+
+#: ../src/gui/editors/notation/NotePixmapFactory.cpp:2303
+#: ../src/gui/editors/notation/NotePixmapFactory.cpp:2347
+msgid "..."
+msgstr "..."
+
+#: ../src/gui/editors/notation/NoteFontFactory.cpp:200
+msgid "Can't obtain a default font -- no fonts found"
+msgstr "Kann keine Standardschriftart bestimmen - kein Schriftarten gefunden"
+
+#: ../src/gui/editors/notation/NoteFontMap.cpp:52
+#: ../src/gui/general/PresetGroup.cpp:49
+msgid "unknown error"
+msgstr "unbekannter Fehler"
+
+#: ../src/gui/editors/notation/NoteFontMap.cpp:78
+msgid "Can't open font mapping file %1 or %2"
+msgstr "Kann Schriftartenübersetzungsdatei %1 oder %2 nicht öffnen"
+
+#: ../src/gui/editors/notation/NoteFontMap.cpp:82
+#, c-format
+msgid "Can't open font mapping file %1"
+msgstr "Die Schriftartenübersetzungsdatei %1 kann nicht geöffnet werden"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:52
+msgid "%1-dotted-%2"
+msgstr "%1-punktiert-%2"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:54
+msgid "%1-dotted %2"
+msgstr "%1-punktiert %2"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:57
+#, c-format
+msgid "dotted-%1"
+msgstr "punktiert-%1"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:59
+#, c-format
+msgid "dotted %1"
+msgstr "Punktierte %1"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:83
+msgid "sixty-fourth note"
+msgstr "64tel-Note"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:83
+msgid "thirty-second note"
+msgstr "32tel-Note"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:84
+msgid "sixteenth note"
+msgstr "16tel-Note"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:84
+msgid "eighth note"
+msgstr "Achtelnote"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:85
+msgid "quarter note"
+msgstr "Viertelnote"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:85
+msgid "half note"
+msgstr "Halbe Note"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:86
+msgid "whole note"
+msgstr "Ganze Note"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:86
+msgid "double whole note"
+msgstr "Doppelte Ganze Note"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:89
+msgid "sixty-fourth notes"
+msgstr "64tel-Noten"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:89
+msgid "thirty-second notes"
+msgstr "32tel-Noten"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:90
+msgid "sixteenth notes"
+msgstr "16tel-Noten"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:90
+msgid "eighth notes"
+msgstr "Achtelnoten"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:91
+msgid "quarter notes"
+msgstr "Viertelnoten"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:91
+msgid "half notes"
+msgstr "Halbe Noten"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:92
+msgid "whole notes"
+msgstr "Ganze Noten"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:92
+msgid "double whole notes"
+msgstr "Doppelte Ganze Noten"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:96
+#: ../src/gui/editors/notation/NotationStrings.cpp:154
+msgid "%1 triplets"
+msgstr "%1 Triolen"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:100
+#: ../src/gui/editors/notation/NotationStrings.cpp:158
+msgid "%1 triplet"
+msgstr "%1 Triole"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:143
+msgid "64th"
+msgstr "64tel"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:143
+msgid "32nd"
+msgstr "32tel"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:143
+msgid "16th"
+msgstr "16tel"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:143
+msgid "8th"
+msgstr "Achtel"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:144
+msgid "quarter"
+msgstr "Viertel"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:144
+msgid "half"
+msgstr "Halbe"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:144
+msgid "whole"
+msgstr "Ganze"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:145
+msgid "double whole"
+msgstr "Doppelganze"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:148
+msgid "64ths"
+msgstr "64tel"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:148
+msgid "32nds"
+msgstr "32tel"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:148
+msgid "16ths"
+msgstr "16tel"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:148
+msgid "8ths"
+msgstr "Achtel"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:149
+msgid "quarters"
+msgstr "Viertel"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:149
+msgid "halves"
+msgstr "Halbe Noten"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:149
+msgid "wholes"
+msgstr "Ganze"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:150
+msgid "double wholes"
+msgstr "Doppelganze"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:278
+msgid "%1 ticks"
+msgstr "%1 ticks"
+
+#: ../src/gui/editors/notation/FontViewFrame.cpp:100
+#, c-format
+msgid "Error: Unable to match font name %1"
+msgstr "Fehler: Kann Schriftnamen %1 nicht zuordnen"
+
+#: ../src/gui/editors/notation/FontViewFrame.cpp:108
+msgid "Warning: No good match for font name %1 (best is %2)"
+msgstr ""
+"Warnung: Keine treffende Zuordnung für den Schriftnamen %1 (treffendste ist %"
+"2)"
+
+#: ../src/gui/editors/notation/FontViewFrame.cpp:116
+#, c-format
+msgid "Error: Unable to open best-match font %1"
+msgstr "Fehler: Kann die passendste Schriftart %1 nicht öffnen"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:113
+#, fuzzy
+msgid "Track %1 : \"%2\""
+msgstr "[ Spur#%1 - %2 ]"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:119
+#, fuzzy, c-format
+msgid ""
+"\n"
+"Notate for: %1"
+msgstr "Noten Schriftart Anzeige: %1"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:121
+#, fuzzy
+msgid "normal"
+msgstr "Normal"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:124
+#, fuzzy
+msgid "small"
+msgstr "Alle"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:127
+msgid "tiny"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:131
+msgid "--"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:156
+msgid ""
+"\n"
+"Size: %1, Bracket: %2 "
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:183
+msgid ""
+"\n"
+"bars [%1-%2] in %3 (tr=%4) : \"%5\""
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:190
+msgid ""
+"\n"
+"bars [%1-%2] (tr=%3) : \"%4\""
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:240
+#, fuzzy
+msgid "C#"
+msgstr "C#%1"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:242
+msgid "Eb"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:245
+#, fuzzy
+msgid "F#"
+msgstr "F#%1"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:247
+#, fuzzy
+msgid "G#"
+msgstr "G#%1"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:249
+msgid "Bb"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:352
+#, fuzzy
+msgid "%1: %2"
+msgstr "%1 (%2)"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:355
+#, fuzzy, c-format
+msgid " in %1"
+msgstr "In %1"
+
+#: ../src/gui/editors/notation/NotationStaff.cpp:452
+msgid "Rendering staff %1..."
+msgstr "System %1 wird dargestellt..."
+
+#: ../src/gui/editors/notation/NotationStaff.cpp:515
+msgid "Rendering notes on staff %1..."
+msgstr "System %1 wird dargestellt..."
+
+#: ../src/gui/editors/notation/NotationStaff.cpp:583
+msgid "Positioning staff %1..."
+msgstr "System %1 wird positioniert..."
+
+#: ../src/gui/editors/notation/NotationSelectionPaster.cpp:85
+msgid "Ready."
+msgstr "Fertig."
+
+#: ../src/gui/editors/notation/RestInserter.cpp:62
+msgid "Dotted rest"
+msgstr "Punktierte Pause"
+
+#: ../src/gui/editors/notation/NoteStyleFileReader.cpp:57
+#, c-format
+msgid "Can't open style file %1"
+msgstr "Stildatei %1 kann nicht geöffent werden"
+
+#: ../src/gui/editors/notation/NoteStyleFileReader.cpp:92
+msgid "type is a required attribute of note"
+msgstr "Das Typattribut wird für die Note benötigt "
+
+#: ../src/gui/editors/notation/NoteStyleFileReader.cpp:101
+#, c-format
+msgid "Unrecognised note name %1"
+msgstr "Unbekannter Notenname: %1"
+
+#: ../src/gui/editors/notation/NoteStyleFileReader.cpp:108
+msgid "global element must precede note elements"
+msgstr "Globale Elemente müssen vor Notenelementen kommen"
+
+#: ../src/gui/editors/notation/NoteStyleFileReader.cpp:137
+msgid ""
+"global and note elements may have shape or charname attribute, but not both"
+msgstr ""
+"global- und note-Elemente dürfen entweder das Attribut shape oder das "
+"Attribut charname haben"
+
+#: ../src/gui/editors/notation/NotationVLayout.cpp:493
+msgid ""
+"Spanned note at %1 has no HEIGHT_ON_STAFF property!\n"
+"This is a bug (the program would previously have crashed by now)"
+msgstr ""
+"Die Note bei %1 hat keine HEIGHT_ON_STAFF-Eigenschaft! \n"
+"Dies ist ein Fehler (das Programm ist vermutlich inzwischen abgestürzt)"
+
+#: ../src/gui/editors/notation/NoteInserter.cpp:82
+msgid "Auto-Beam when appropriate"
+msgstr "Automatisch mit Balken wo angemessen"
+
+#: ../src/gui/editors/notation/NoteInserter.cpp:103
+msgid "Dotted note"
+msgstr "Punktierte Note"
+
+#: ../src/gui/editors/notation/NoteInserter.cpp:120
+msgid "Switch to Inserting Rests"
+msgstr "Zum EInfügen von Pausen wechseln"
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:98
+msgid "Collapse Rests"
+msgstr "Pausen &zusammenfassen"
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:102
+msgid "Respell as Flat"
+msgstr "Enharmonisch nach b wechseln"
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:106
+msgid "Respell as Sharp"
+msgstr "Enharmonisch nach # wechseln"
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:110
+msgid "Respell as Natural"
+msgstr "Enharmonisch ohne Vorzeichen"
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:114
+msgid "Collapse Notes"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:130
+msgid "Make Invisible"
+msgstr "Mache unsichtbar"
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:134
+msgid "Make Visible"
+msgstr "Mache sichtbar"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:129
+msgid "Event filters"
+msgstr "Eventfilter"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:138
+msgid "Rest"
+msgstr "Pause"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:139
+msgid "Indication"
+msgstr "Indication"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:141
+msgid "Other"
+msgstr "Andere"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:161
+msgid "Triggered Segment Properties"
+msgstr "Getriggerte Event-Eigenschaften"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:166
+msgid "Label: "
+msgstr "Bezeichnung: "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:176
+msgid "Base pitch: "
+msgstr "Basis Tonhöhe:"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:183
+msgid "Base velocity: "
+msgstr "Basis Anschlagstärke:"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:246
+msgid "Duration "
+msgstr "Dauer "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:247
+msgid "Event Type "
+msgstr "Event-Art "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:248
+msgid "Pitch "
+msgstr "Tonhöhe "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:249
+msgid "Velocity "
+msgstr "Anschlagstärke"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:250
+msgid "Type (Data1) "
+msgstr "Typ (Data1) "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:251
+msgid "Value (Data2) "
+msgstr "Wert (Data2)"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:461
+msgid "(group %1) "
+msgstr "(Gruppe %1)"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:519
+msgid "<no events at this filter level>"
+msgstr "<keine Events auf diesem Filterlevel>"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:521
+msgid "<no events>"
+msgstr "<keine Events>"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:696
+msgid "Segment label"
+msgstr "Segmentbezeichnung ändern"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:696
+msgid "Label:"
+msgstr "Bezeichnung"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1123
+msgid "&Insert Event"
+msgstr "Event e&infügen"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1130
+msgid "&Delete Event"
+msgstr "Event löschen"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1137
+msgid "&Edit Event"
+msgstr "Event verändern"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1144
+msgid "&Advanced Event Editor"
+msgstr "Erweiterter Event-Editor"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1518
+msgid "Open in Event Editor"
+msgstr "Im Event-Editor öffnen"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1519
+msgid "Open in Expert Event Editor"
+msgstr "Im Experten-Event-Editor öffnen"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1577
+msgid "%1 - Triggered Segment: %2"
+msgstr "%1 - Getriggertes Segment: %2"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1592
+msgid "%1 - Segment Track #%2 - Event List"
+msgstr "%1 - Segment Spur #%2 - Event Liste"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1598
+msgid "%1 - %2 Segments - Event List"
+msgstr "%1 - %2 Segmente - Event Liste"
+
+#: ../src/gui/rulers/TempoRuler.cpp:131
+msgid "Insert Tempo Change at Playback Position"
+msgstr "Te&mpoveränderung an Wiedergabeposition einfügen"
+
+#: ../src/gui/rulers/TempoRuler.cpp:136
+msgid "Delete Tempo Change"
+msgstr "Te&mpoveränderung löschen"
+
+#: ../src/gui/rulers/TempoRuler.cpp:140
+msgid "Ramp Tempo to Next Tempo"
+msgstr "Gleichmäßiger Übergang zu nächstem Tempo"
+
+#: ../src/gui/rulers/TempoRuler.cpp:144
+msgid "Un-Ramp Tempo"
+msgstr "Tempoübergang entfernen"
+
+#: ../src/gui/rulers/TempoRuler.cpp:149
+msgid "Edit Tempo..."
+msgstr "Tempo.ändern..."
+
+#: ../src/gui/rulers/TempoRuler.cpp:153
+msgid "Edit Time Signature..."
+msgstr "Taktart ändern..."
+
+#: ../src/gui/rulers/TempoRuler.cpp:588
+msgid "%1.%2%3 (%4.%5%6 bpm)"
+msgstr "%1.%2%3 (%4.%5%6 bpm)"
+
+#: ../src/gui/rulers/TempoRuler.cpp:596
+msgid "%1.%2%3 bpm"
+msgstr "%1.%2%3 bpm"
+
+#: ../src/gui/rulers/TempoRuler.cpp:604
+msgid "%1 - %2.%3%4"
+msgstr "%1 - %2.%3%4"
+
+#: ../src/gui/rulers/ControlRulerEventInsertCommand.cpp:36
+msgid "Insert Controller Event"
+msgstr "Controller Event einfügen"
+
+#: ../src/gui/rulers/ControlChangeCommand.cpp:35
+msgid "Control Change"
+msgstr "Control Change"
+
+#: ../src/gui/rulers/PropertyViewRuler.cpp:72
+msgid "%1 controller"
+msgstr "%1 Controller"
+
+#: ../src/gui/rulers/RawNoteRuler.cpp:453
+msgid "Track #%1, Segment \"%2\" (runtime id %3)"
+msgstr ""
+
+#: ../src/gui/rulers/MarkerRuler.cpp:100
+msgid "Insert Marker"
+msgstr "Markierung einfügen"
+
+#: ../src/gui/rulers/MarkerRuler.cpp:104
+#, fuzzy
+msgid "Insert Marker at Playback Position"
+msgstr "Te&mpoveränderung an Wiedergabeposition einfügen"
+
+#: ../src/gui/rulers/MarkerRuler.cpp:109
+msgid "Delete Marker"
+msgstr "Markierung löschen"
+
+#: ../src/gui/rulers/MarkerRuler.cpp:114
+msgid "Edit Marker..."
+msgstr "Mar&kierung bearbeiten..."
+
+#: ../src/gui/rulers/MarkerRuler.cpp:119
+msgid ""
+"Click on a marker to move the playback pointer.\n"
+"Shift-click to set a range between markers.\n"
+"Double-click to open the marker editor."
+msgstr ""
+
+#: ../src/gui/rulers/ChordNameRuler.cpp:97
+msgid ""
+"Chord name ruler.\n"
+"Turn it on and off from the Settings->Rulers menu."
+msgstr ""
+"Akkordlineal.\n"
+"Wird im Menu unter Einstellungen -> Lineale ein- und ausgeschaltet."
+
+#: ../src/gui/rulers/ControlRulerEventEraseCommand.cpp:37
+msgid "Erase Controller Event(s)"
+msgstr "Controller Event(s) entfernen"
+
+#: ../src/gui/general/EditView.cpp:901
+#: ../src/gui/rulers/ControllerEventsRuler.cpp:188
+msgid "Unsupported Event Type"
+msgstr "Nicht unterstützter Eventtyp"
+
+#: ../src/gui/rulers/ControllerEventsRuler.cpp:203
+msgid "Controller Events"
+msgstr "Controller Events"
+
+#: ../src/gui/rulers/ControllerEventsRuler.cpp:278
+msgid "Controller Event Number"
+msgstr "Controller Event Nummer"
+
+#: ../src/gui/rulers/ControllerEventsRuler.cpp:471
+msgid "Add line of controllers"
+msgstr "Controller Linie hinzufügen"
+
+#: ../src/gui/rulers/LoopRuler.cpp:89
+#, fuzzy
+msgid ""
+"Click and drag to move the playback pointer.\n"
+"Shift-click and drag to set a range for looping or editing.\n"
+"Shift-click to clear the loop or range.\n"
+"Double-click to start playback."
+msgstr ""
+"Klicken mit der linken Maustaste positioniert den Wiedergabe.\n"
+"Umschalttaste + linke Maustaste + ziehen wählt einen Bereich als Loop oder "
+"zum Editieren aus.\n"
+"Umschalttaste + linke Maustaste löscht die Loop oder den Bereich."
+
+#: ../src/gui/general/EditViewBase.cpp:228
+msgid "Set Segment Start Time..."
+msgstr "Segment Anfangszeit setzen..."
+
+#: ../src/gui/general/EditViewBase.cpp:232
+msgid "Set Segment Duration..."
+msgstr "Segment Dauer setzen..."
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:56
+msgid "Load track parameters preset"
+msgstr "Lade Spurparameter Voreinstellungen"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:62
+#, fuzzy
+msgid "Convert notation for..."
+msgstr "Audiodatei wird exportiert..."
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:86
+msgid "Select preset track parameters for:"
+msgstr "Wähle Spurparameter Voreinstellungen für:"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:87
+msgid "Create appropriate notation for:"
+msgstr ""
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:89
+msgid "Category"
+msgstr "Kategorie"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:95
+msgid "Player Ability"
+msgstr "Spieler Fähigkeit"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:97
+msgid "Amateur"
+msgstr "Amateur"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:98
+msgid "Professional"
+msgstr "Professionell"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:104
+msgid "Only selected segments"
+msgstr "Nur a&usgewählte Segmente"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:106
+msgid "All segments in this track"
+msgstr "Auf alle Segmente auf dieser Spur"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:111
+msgid "Only for new segments"
+msgstr "Nur für neue Segmente"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:113
+#, fuzzy
+msgid "Convert existing segments"
+msgstr "Segmente erzeugen"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:39
+#, c-format
+msgid "C%1"
+msgstr "C%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:39
+#, c-format
+msgid "C#%1"
+msgstr "C#%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:39
+#, c-format
+msgid "D%1"
+msgstr "D%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:39
+#, c-format
+msgid "D#%1"
+msgstr "D#%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:40
+#, c-format
+msgid "E%1"
+msgstr "E%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:40
+#, c-format
+msgid "F%1"
+msgstr "F%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:40
+#, c-format
+msgid "F#%1"
+msgstr "F#%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:40
+#, c-format
+msgid "G%1"
+msgstr "G%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:41
+#, c-format
+msgid "G#%1"
+msgstr "G#%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:41
+#, c-format
+msgid "A%1"
+msgstr "A%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:41
+#, c-format
+msgid "A#%1"
+msgstr "A#%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:41
+#, c-format
+msgid "B%1"
+msgstr "H%1"
+
+#: ../src/gui/general/PresetGroup.cpp:95
+#, c-format
+msgid "Can't open preset file %1"
+msgstr "Voreinstellungsdatei %1 kann nicht geöffnet werden"
+
+#: ../src/gui/general/EditView.cpp:744
+#, fuzzy
+msgid "&Halve Durations"
+msgstr "Dauer"
+
+#: ../src/gui/general/EditView.cpp:748
+#, fuzzy
+msgid "&Double Durations"
+msgstr "Doppel-B"
+
+#: ../src/gui/general/EditView.cpp:806
+msgid "Show Velocity Property Ruler"
+msgstr "Leiste für Anschlagstärke zeigen"
+
+#: ../src/gui/general/EditView.cpp:825
+msgid "Insert item"
+msgstr "Note einfügen"
+
+#: ../src/gui/general/EditView.cpp:831
+msgid "Erase selected items"
+msgstr "Ausgewählte Objekte löschen"
+
+#: ../src/gui/general/EditView.cpp:835
+msgid "Clear ruler"
+msgstr "Lineal löschen"
+
+#: ../src/gui/general/EditView.cpp:839
+msgid "Insert line of controllers"
+msgstr "Controller-Linie einfügen"
+
+#: ../src/gui/general/EditView.cpp:843
+msgid "Flip forward"
+msgstr "Flippe vorwärts"
+
+#: ../src/gui/general/EditView.cpp:847
+msgid "Flip backwards"
+msgstr "Flippe rückwärts"
+
+#: ../src/gui/general/EditView.cpp:851
+msgid "Draw property line"
+msgstr "Eigenschaftenlinie zeichnen"
+
+#: ../src/gui/general/EditView.cpp:855
+msgid "Select all property values"
+msgstr "Alle Eigenschaften auswählen"
+
+#: ../src/gui/general/EditView.cpp:894
+msgid "%1 Controller %2 %3"
+msgstr "%1 Controller %2 %3"
+
+#: ../src/gui/general/EditView.cpp:1066
+msgid "I"
+msgstr "I"
+
+#: ../src/gui/general/EditView.cpp:1066
+msgid "II"
+msgstr "II"
+
+#: ../src/gui/general/EditView.cpp:1066
+msgid "III"
+msgstr "III"
+
+#: ../src/gui/general/EditView.cpp:1066
+msgid "IV"
+msgstr "IV"
+
+#: ../src/gui/general/EditView.cpp:1067
+msgid "V"
+msgstr "V"
+
+#: ../src/gui/general/EditView.cpp:1067
+msgid "VI"
+msgstr "VI"
+
+#: ../src/gui/general/EditView.cpp:1067
+msgid "VII"
+msgstr "VII"
+
+#: ../src/gui/general/EditView.cpp:1067
+msgid "VIII"
+msgstr "VIII"
+
+#: ../src/gui/general/EditView.cpp:1069
+msgid "%1 flat"
+msgstr "%1 b"
+
+#: ../src/gui/general/EditView.cpp:1070
+msgid "%1 sharp"
+msgstr "%1 #"
+
+#: ../src/gui/general/EditView.cpp:1085
+msgid "&Insert Note"
+msgstr "Note &einfügen"
+
+#: ../src/gui/general/EditView.cpp:1091
+msgid "&Upper Octave"
+msgstr "&Obere Oktave"
+
+#: ../src/gui/general/EditView.cpp:1096
+msgid "&Lower Octave"
+msgstr "&Untere Oktave"
+
+#: ../src/gui/general/EditView.cpp:1268
+msgid "Estimated time signature shown"
+msgstr "Ermittelte Taktart wird angezeigt"
+
+#: ../src/gui/general/EditView.cpp:1431
+#, fuzzy
+msgid "Halving durations..."
+msgstr "Notenlänge setzen..."
+
+#: ../src/gui/general/EditView.cpp:1445
+#, fuzzy
+msgid "Doubling durations..."
+msgstr "Notenlänge setzen..."
+
+#: ../src/gui/general/EditView.cpp:1469
+msgid "Rescaling..."
+msgstr "&Reskalieren..."
+
+#: ../src/gui/general/EditView.cpp:1489
+#, fuzzy
+msgid "By number of semitones: "
+msgstr "Anzahl der Halbtöne, um die transponiert werden soll:"
+
+#: ../src/gui/general/EditView.cpp:1496 ../src/gui/general/EditView.cpp:1518
+msgid "Transposing..."
+msgstr "Transponieren..."
+
+#: ../src/gui/general/EditView.cpp:1536
+msgid "Transposing up one semitone..."
+msgstr "Einen Halbton nach oben transponieren..."
+
+#: ../src/gui/general/EditView.cpp:1545
+msgid "Transposing up one octave..."
+msgstr "Eine Oktave nach oben transponieren..."
+
+#: ../src/gui/general/EditView.cpp:1554
+msgid "Transposing down one semitone..."
+msgstr "Einen Halbton nach unten transponieren..."
+
+#: ../src/gui/general/EditView.cpp:1563
+msgid "Transposing down one octave..."
+msgstr "Eine Oktave nach unten transponieren..."
+
+#: ../src/gui/general/EditView.cpp:1575
+msgid "Inverting..."
+msgstr "Spiegele Tonhöhenverlauf..."
+
+#: ../src/gui/general/EditView.cpp:1587
+#, fuzzy
+msgid "Retrograding..."
+msgstr "Spiegele zeitlich (retro)..."
+
+#: ../src/gui/general/EditView.cpp:1599
+msgid "Retrograde inverting..."
+msgstr "Spiegele zeitlich und tonhöhig..."
+
+#: ../src/gui/general/EditView.cpp:1608
+msgid "Jogging left..."
+msgstr "Nach links joggen..."
+
+#: ../src/gui/general/EditView.cpp:1623
+msgid "Jogging right..."
+msgstr "Nach rechts joggen..."
+
+#: ../src/sound/AudioFileManager.cpp:660
+#, fuzzy, c-format
+msgid "Downloading file %1"
+msgstr "Kann Datei %1 nicht herunterladen"
+
+#: ../src/sound/AudioFileManager.cpp:735
+#, fuzzy
+msgid "Converting audio file..."
+msgstr "Audiodatei wird exportiert..."
+
+#: ../src/sound/AudioFileManager.cpp:737
+#, fuzzy
+msgid "Resampling audio file..."
+msgstr "Audiodatei wird exportiert..."
+
+#: ../src/sound/AudioFileManager.cpp:739
+#, fuzzy
+msgid "Converting and resampling audio file..."
+msgstr "Audiodatei wird exportiert..."
+
+#: ../src/sound/AudioFileManager.cpp:741
+#, fuzzy
+msgid "Importing audio file..."
+msgstr "Audiodatei wird exportiert..."
+
+#: ../src/sound/AudioFileManager.cpp:794
+#, fuzzy
+msgid "Failed to convert or resample audio file on import"
+msgstr "Anlegen der temporären Datei für den LilyPond-Export fehlgeschlagen."
+
+#: ../src/sequencer/main.cpp:46 ../src/sequencer/main.cpp:86
+#, fuzzy
+msgid "RosegardenSequencer"
+msgstr "Rosegarden"
+
+#: ../src/sequencer/main.cpp:54
+#, fuzzy
+msgid "JACK playback and capture ports"
+msgstr "Wiedergabeverzögerung für JACK (in ms)"
+
+#: ../src/commands/segment/SegmentSyncCommand.cpp:38
+#: ../src/commands/segment/SegmentSyncCommand.cpp:44
+#: ../src/commands/segment/SegmentSyncCommand.cpp:55
+#: ../src/commands/segment/SegmentSyncCommand.cpp:63
+#, fuzzy
+msgid "Sync segment parameters"
+msgstr "Segment Parameter"
+
+#: ../src/commands/segment/RenameTrackCommand.h:52
+msgid "Rename Track"
+msgstr "Spur umbenennen"
+
+#: ../src/commands/segment/SegmentRepeatToCopyCommand.cpp:39
+msgid "Turn Repeats into Copies"
+msgstr "Wiederholungen in Kopien umwandeln"
+
+#: ../src/commands/segment/SegmentTransposeCommand.cpp:36
+#: ../src/commands/segment/SegmentTransposeCommand.cpp:42
+#, fuzzy
+msgid "Change segment transposition"
+msgstr "Segmentfarbe ändern"
+
+#: ../src/commands/edit/RescaleCommand.h:50
+#: ../src/commands/segment/AudioSegmentRescaleCommand.h:62
+#: ../src/commands/segment/SegmentRescaleCommand.h:58
+msgid "Stretch or S&quash..."
+msgstr "Strecken oder Stauchen..."
+
+#: ../src/commands/segment/SegmentLabelCommand.h:52
+msgid "Re&label..."
+msgstr "Um&benennen..."
+
+#: ../src/commands/segment/AudioSegmentResizeFromStartCommand.cpp:39
+#: ../src/commands/segment/SegmentResizeFromStartCommand.cpp:39
+msgid "Resize Segment"
+msgstr "Segmentgröße verändern"
+
+#: ../src/commands/segment/RemoveTempoChangeCommand.h:58
+msgid "Remove &Tempo Change..."
+msgstr "&Tempoveränderungen entfernen..."
+
+#: ../src/commands/segment/SegmentEraseCommand.cpp:40
+#: ../src/commands/segment/SegmentEraseCommand.cpp:52
+msgid "Erase Segment"
+msgstr "Segment löschen"
+
+#: ../src/commands/segment/AudioSegmentRescaleCommand.cpp:126
+#: ../src/commands/segment/SegmentRescaleCommand.cpp:102
+#, fuzzy
+msgid "(rescaled)"
+msgstr "%1 (reskaliert)"
+
+#: ../src/commands/segment/AudioSegmentRescaleCommand.cpp:127
+#: ../src/commands/segment/SegmentRescaleCommand.cpp:105
+msgid "%1 (rescaled)"
+msgstr "%1 (reskaliert)"
+
+#: ../src/commands/segment/PasteToTriggerSegmentCommand.cpp:47
+msgid "Paste as New Triggered Segment"
+msgstr "Als neues getriggertes Segment einfügen"
+
+#: ../src/commands/segment/SegmentColourMapCommand.h:52
+msgid "Change Segment Color Map..."
+msgstr "Segment Farbtabelle ändern..."
+
+#: ../src/commands/segment/SegmentQuickCopyCommand.h:55
+msgid "Quick-Copy Segment"
+msgstr "Schnelle Segmentkopie"
+
+#: ../src/commands/segment/AudioSegmentSplitCommand.cpp:42
+msgid "Split Audio Segment"
+msgstr "Audiosegment splitten"
+
+#: ../src/commands/segment/AudioSegmentSplitCommand.cpp:103
+#: ../src/commands/segment/SegmentSplitCommand.cpp:135
+msgid " (split)"
+msgstr "(aufgetrennt)"
+
+#: ../src/commands/segment/AudioSegmentSplitCommand.cpp:104
+#: ../src/commands/segment/SegmentSplitByRecordingSrcCommand.cpp:120
+#: ../src/commands/segment/SegmentSplitByRecordingSrcCommand.cpp:122
+#: ../src/commands/segment/SegmentSplitCommand.cpp:136
+msgid "%1 (split)"
+msgstr "%1 (aufgetrennt)"
+
+#: ../src/commands/segment/SegmentLabelCommand.cpp:40
+msgid "Label Segments"
+msgstr "Segmente kennzeichnen"
+
+#: ../src/commands/segment/OpenOrCloseRangeCommand.cpp:43
+msgid "Open or Close Range"
+msgstr "Bereich öffnen oder schließen"
+
+#: ../src/commands/edit/TransposeCommand.h:55
+#: ../src/commands/segment/SegmentTransposeCommand.h:54
+#, fuzzy
+msgid "Transpose by &Interval..."
+msgstr "&Transponieren.,."
+
+#: ../src/commands/segment/SegmentAutoSplitCommand.cpp:148
+msgid "%1 (part)"
+msgstr "%1 (Teil)"
+
+#: ../src/commands/segment/AudioSegmentInsertCommand.cpp:51
+#: ../src/commands/segment/SegmentInsertCommand.cpp:43
+#: ../src/commands/segment/SegmentInsertCommand.cpp:56
+msgid "Create Segment"
+msgstr "Segmente erzeugen"
+
+#: ../src/commands/segment/AudioSegmentInsertCommand.cpp:114
+msgid "%1 (inserted)"
+msgstr "%1 (eingefügt)"
+
+#: ../src/commands/segment/AudioSegmentInsertCommand.cpp:117
+msgid "unknown audio file"
+msgstr "unbekannte Audiodatei>"
+
+#: ../src/commands/segment/CreateTempoMapFromSegmentCommand.cpp:40
+msgid "Set Tempos from Beat Segment"
+msgstr ""
+
+#: ../src/commands/segment/SegmentSplitByRecordingSrcCommand.h:52
+msgid "Split by &Recording Source..."
+msgstr "Nach Aufnahmequelle aufteilen..."
+
+#: ../src/commands/segment/SegmentColourMapCommand.cpp:40
+msgid "Change Segment Color Map"
+msgstr "Segment Farbtabelle ändern"
+
+#: ../src/commands/edit/CopyCommand.cpp:64
+#: ../src/commands/segment/SegmentQuickCopyCommand.cpp:57
+msgid "%1 (copied)"
+msgstr "%1 (kopiert)"
+
+#: ../src/commands/segment/SegmentColourCommand.h:52
+msgid "Change Segment Color..."
+msgstr "Segmentfarbe ändern..."
+
+#: ../src/commands/segment/SegmentSplitByPitchCommand.cpp:170
+msgid "%1 (upper)"
+msgstr "%1 (oben)"
+
+#: ../src/commands/segment/SegmentSplitByPitchCommand.cpp:172
+msgid "%1 (lower)"
+msgstr "%1 (unten)"
+
+#: ../src/commands/segment/SegmentSingleRepeatToCopyCommand.cpp:39
+msgid "Turn Single Repeat into Copy"
+msgstr "Wiederholungen in Kopien umwandeln"
+
+#: ../src/commands/segment/AddTempoChangeCommand.h:58
+msgid "Add Te&mpo Change..."
+msgstr "Te&mpoänderung hinzufügen..."
+
+#: ../src/commands/segment/AudioSegmentAutoSplitCommand.h:57
+#: ../src/commands/segment/SegmentAutoSplitCommand.h:53
+msgid "&Split on Silence"
+msgstr "Bei Pause &splitten"
+
+#: ../src/commands/segment/SetTriggerSegmentBaseVelocityCommand.cpp:39
+msgid "Set Base Velocity"
+msgstr "Basis Anschlagstärke setzen"
+
+#: ../src/commands/segment/DeleteRangeCommand.cpp:43
+#: ../src/commands/segment/EraseSegmentsStartingInRangeCommand.cpp:39
+msgid "Delete Range"
+msgstr "Bereich löschen"
+
+#: ../src/commands/segment/ChangeCompositionLengthCommand.h:53
+msgid "Change &Composition Start and End..."
+msgstr "Anfang und Ende der Komposition ändern..."
+
+#: ../src/commands/segment/MoveTracksCommand.h:51
+msgid "Move Tracks..."
+msgstr "Spuren bewegen..."
+
+#: ../src/commands/segment/SegmentColourCommand.cpp:39
+msgid "Change Segment Color"
+msgstr "Segmentfarbe ändern"
+
+#: ../src/commands/segment/AudioSegmentDistributeCommand.h:66
+msgid "Distribute Audio Segments over MIDI"
+msgstr "Verteile Audio Segmente über MIDI"
+
+#: ../src/commands/segment/AudioSegmentAutoSplitCommand.cpp:147
+msgid "%1 (autosplit %2)"
+msgstr "%1 (autoteilen %2)"
+
+#: ../src/commands/segment/SetTriggerSegmentDefaultRetuneCommand.cpp:39
+msgid "Set Default Retune"
+msgstr ""
+
+#: ../src/commands/segment/AddTimeSignatureCommand.h:52
+msgid "Add Time Si&gnature Change..."
+msgstr "Änderung der &Taktart hinzufügen..."
+
+#: ../src/commands/segment/AddTriggerSegmentCommand.cpp:42
+msgid "Add Triggered Segment"
+msgstr "Getriggertes Segment hinzufügen"
+
+#: ../src/commands/segment/SetTriggerSegmentDefaultTimeAdjustCommand.cpp:39
+msgid "Set Default Time Adjust"
+msgstr "Standard Zeitadjustierung setzen"
+
+#: ../src/commands/segment/RemoveTimeSignatureCommand.h:58
+msgid "Remove &Time Signature Change..."
+msgstr "Taktartänderung entfernen..."
+
+#: ../src/commands/segment/SegmentCommandRepeat.cpp:39
+msgid "Repeat Segments"
+msgstr "Segmente wiederholen"
+
+#: ../src/commands/segment/AddTracksCommand.h:55
+msgid "Add Tracks..."
+msgstr "Spuren hinzufügen..."
+
+#: ../src/commands/segment/ModifyDefaultTempoCommand.h:51
+msgid "Modify &Default Tempo..."
+msgstr "&Standardtempo.ändern..."
+
+#: ../src/commands/segment/SegmentSplitByPitchCommand.h:61
+msgid "Split by &Pitch..."
+msgstr "Nach &Tonhöhe aufteilen..."
+
+#: ../src/commands/segment/DeleteTriggerSegmentCommand.cpp:40
+msgid "Delete Triggered Segment"
+msgstr "Getriggertes Segment löschen"
+
+#: ../src/commands/segment/SegmentSplitCommand.cpp:42
+msgid "Split Segment"
+msgstr "Segment teilen"
+
+#: ../src/commands/segment/DeleteTracksCommand.h:51
+msgid "Delete Tracks..."
+msgstr "Spuren löschen..."
+
+#: ../src/commands/segment/InsertRangeCommand.cpp:42
+#, fuzzy
+msgid "Insert Range"
+msgstr "Pause einfügen"
+
+#: ../src/commands/segment/DeleteRangeCommand.h:62
+msgid "Rejoin Command"
+msgstr "Ernerut verbinden Befehl"
+
+#: ../src/commands/segment/SetTriggerSegmentBasePitchCommand.cpp:39
+msgid "Set Base Pitch"
+msgstr "Grundstimmung setzen"
+
+#: ../src/commands/segment/PasteConductorDataCommand.cpp:41
+msgid "Paste Tempos and Time Signatures"
+msgstr "Tempi und Taktarten einfügen"
+
+#: ../src/commands/segment/SegmentSyncClefCommand.cpp:34
+#, fuzzy
+msgid "Sync segment clef"
+msgstr "Segmentbezeichnung ändern"
+
+#: ../src/commands/matrix/MatrixInsertionCommand.cpp:46
+#: ../src/commands/notation/NoteInsertionCommand.cpp:54
+msgid "Insert Note"
+msgstr "Note einfügen"
+
+#: ../src/commands/matrix/MatrixEraseCommand.cpp:41
+msgid "Erase Note"
+msgstr "Note löschen"
+
+#: ../src/commands/matrix/MatrixPercussionInsertionCommand.cpp:47
+msgid "Insert Percussion Note"
+msgstr "Percussionnote einfügen"
+
+#: ../src/commands/matrix/MatrixModifyCommand.cpp:43
+msgid "Move Note"
+msgstr "Note bewegen"
+
+#: ../src/commands/matrix/MatrixModifyCommand.cpp:43
+msgid "Modify Note"
+msgstr "Note ändern"
+
+#: ../src/commands/edit/PasteEventsCommand.cpp:98
+msgid "Paste into an existing gap [\"restricted\"]"
+msgstr "In vorhandene Lücke einfügen [\"eingeschränkt\"]"
+
+#: ../src/commands/edit/PasteEventsCommand.cpp:100
+msgid "Erase existing events to make room [\"simple\"]"
+msgstr "Vorhandene Events löschen, um Plazu zu machen [\"einfach\"]"
+
+#: ../src/commands/edit/PasteEventsCommand.cpp:102
+msgid "Move existing events out of the way [\"open-n-paste\"]"
+msgstr "Vorhandene Events wegschieben [\"öffnen + einfügen\"]"
+
+#: ../src/commands/edit/PasteEventsCommand.cpp:104
+msgid "Overlay notes, tying against present notes [\"note-overlay\"]"
+msgstr "Noten überlagern und an bestehende Noten binden [\"Noten-Überlagern\"]"
+
+#: ../src/commands/edit/PasteEventsCommand.cpp:106
+msgid "Overlay notes, ignoring present notes [\"matrix-overlay\"]"
+msgstr ""
+"Noten überlagern und bestehenden Noten ignorieren [\"Matrix-Überlagern\"]"
+
+#: ../src/commands/edit/AddDotCommand.h:52
+msgid "&Add Dot"
+msgstr "Punktierung hinzufügen"
+
+#: ../src/commands/edit/RemoveMarkerCommand.h:55
+msgid "&Remove Marker"
+msgstr "Ma&rker löschen"
+
+#: ../src/commands/edit/EventUnquantizeCommand.cpp:43
+#: ../src/commands/edit/EventUnquantizeCommand.cpp:54
+msgid "Unquantize Events"
+msgstr "Events entquantisieren"
+
+#: ../src/commands/edit/ChangeVelocityCommand.h:53
+msgid "&Increase Velocity"
+msgstr "Anschlagstärke er&höhen"
+
+#: ../src/commands/edit/ChangeVelocityCommand.h:54
+msgid "&Reduce Velocity"
+msgstr "Anschlagstärke &verringern "
+
+#: ../src/commands/edit/CopyCommand.cpp:46
+msgid "(excerpt)"
+msgstr "(Auszug)"
+
+#: ../src/commands/edit/CopyCommand.cpp:60
+msgid "(copied)"
+msgstr "(kopiert)"
+
+#: ../src/commands/edit/EventInsertionCommand.cpp:39
+msgid "Insert Event"
+msgstr "Event einfügen"
+
+#: ../src/commands/edit/InsertTriggerNoteCommand.cpp:55
+msgid "Insert Trigger Note"
+msgstr "Note einfügen"
+
+#: ../src/commands/edit/CollapseNotesCommand.h:50
+msgid "Collapse &Equal-Pitch Notes"
+msgstr "Gleich hohe Not&en zusammenfassen"
+
+#: ../src/commands/edit/TransposeCommand.h:61
+msgid "&Up a Semitone"
+msgstr "Halbton a&ufwärts"
+
+#: ../src/commands/edit/TransposeCommand.h:62
+msgid "&Down a Semitone"
+msgstr "Halbton a&bwärts"
+
+#: ../src/commands/edit/TransposeCommand.h:63
+msgid "Up an &Octave"
+msgstr "&Oktave höher"
+
+#: ../src/commands/edit/TransposeCommand.h:64
+msgid "Down an Octa&ve"
+msgstr "Oktave her&unter"
+
+#: ../src/commands/edit/TransposeCommand.h:65
+msgid "&Transpose by Semitones..."
+msgstr "&Transponiere um Halbtonschritte..."
+
+#: ../src/commands/edit/SetNoteTypeCommand.h:56
+msgid "&Set Note Type"
+msgstr "Notentyp &setzen"
+
+#: ../src/commands/edit/EventEditCommand.h:55
+msgid "Edit E&vent"
+msgstr "E&vent verändern"
+
+#: ../src/commands/edit/AddMarkerCommand.h:54
+msgid "&Add Marker"
+msgstr "Marker hinzufügen"
+
+#: ../src/commands/edit/SelectionPropertyCommand.h:66
+msgid "Set &Property"
+msgstr "&Eigenschaft setzen"
+
+#: ../src/commands/edit/CutCommand.h:55
+msgid "Cu&t"
+msgstr "Sch&neiden"
+
+#: ../src/commands/edit/EventQuantizeCommand.cpp:114
+msgid "Heuristic Notation &Quantize"
+msgstr "Heuristische Notenquantisierung"
+
+#: ../src/commands/edit/EventQuantizeCommand.cpp:116
+msgid "Grid &Quantize"
+msgstr "Raster-&Quantisierung"
+
+#: ../src/commands/edit/ClearTriggersCommand.h:52
+msgid "&Clear Triggers"
+msgstr "Trigger löschen"
+
+#: ../src/commands/edit/RetrogradeCommand.h:51
+msgid "&Retrograde"
+msgstr "&Zeitlich spiegeln (retro)"
+
+#: ../src/commands/edit/InvertCommand.h:51
+msgid "&Invert"
+msgstr "&Tonhöhenverlauf spiegeln"
+
+#: ../src/commands/edit/SetTriggerCommand.h:64
+msgid "Tri&gger Segment"
+msgstr "Getri&ggertes Segment"
+
+#: ../src/commands/edit/SetLyricsCommand.h:50
+msgid "Edit L&yrics"
+msgstr "Te&xt bearbeiten"
+
+#: ../src/commands/edit/MoveAcrossSegmentsCommand.cpp:73
+msgid "&Move Events to Other Segment"
+msgstr "Event ausserhalb eines Segments"
+
+#: ../src/commands/edit/RetrogradeInvertCommand.h:51
+msgid "Re&trograde Invert"
+msgstr "Zeitlich und tonhöhig &spiegeln"
+
+#: ../src/commands/edit/ModifyMarkerCommand.h:55
+msgid "&Modify Marker"
+msgstr "Marker verändern"
+
+#: ../src/commands/studio/AddControlParameterCommand.h:61
+msgid "&Add Control Parameter"
+msgstr "Control Parameter hinzufügen"
+
+#: ../src/commands/studio/ModifyInstrumentMappingCommand.h:55
+msgid "Modify &Instrument Mapping"
+msgstr "&Instrumentzuordnung ändern"
+
+#: ../src/commands/studio/RemoveControlParameterCommand.h:60
+msgid "&Remove Control Parameter"
+msgstr "Control Parameter entfernen"
+
+#: ../src/commands/studio/ReconnectDeviceCommand.h:55
+msgid "Reconnect Device"
+msgstr "Gerät wieder verbinden"
+
+#: ../src/commands/studio/ModifyDeviceCommand.h:68
+msgid "Modify &MIDI Bank"
+msgstr "&MIDI Bank ändern"
+
+#: ../src/commands/studio/CreateOrDeleteDeviceCommand.h:68
+msgid "Create Device"
+msgstr "Gerät erzeugen"
+
+#: ../src/commands/studio/ModifyDeviceMappingCommand.h:55
+msgid "Modify &Device Mapping"
+msgstr "&Gerätezuordnung ändern"
+
+#: ../src/commands/studio/RenameDeviceCommand.h:55
+msgid "Rename Device"
+msgstr "Gerät umbenennen"
+
+#: ../src/commands/studio/ModifyControlParameterCommand.h:61
+msgid "&Modify Control Parameter"
+msgstr "Control Parameter verändern"
+
+#: ../src/commands/notation/TieNotesCommand.h:49
+msgid "&Tie"
+msgstr "Verbinden"
+
+#: ../src/commands/notation/ClefInsertionCommand.cpp:74
+msgid "Add Cle&f Change..."
+msgstr "&Schlüsselveränderung hinzufügen..."
+
+#: ../src/commands/notation/GuitarChordInsertionCommand.cpp:40
+#, fuzzy
+msgid "Insert Guitar Chord"
+msgstr "Guitarrenakkord einfügen"
+
+#: ../src/commands/notation/RespellCommand.cpp:47
+#, c-format
+msgid "Respell with %1"
+msgstr "Enharmonisch verwechseln mit %1"
+
+#: ../src/commands/notation/RespellCommand.cpp:50
+msgid "Do&uble Sharp"
+msgstr "Do&ppelkreuz"
+
+#: ../src/commands/notation/RespellCommand.cpp:52
+msgid "&Sharp"
+msgstr "&Kreuz"
+
+#: ../src/commands/notation/RespellCommand.cpp:54
+msgid "&Flat"
+msgstr "&b"
+
+#: ../src/commands/notation/RespellCommand.cpp:56
+msgid "Dou&ble Flat"
+msgstr "Doppe&l-b"
+
+#: ../src/commands/notation/RespellCommand.cpp:58
+msgid "&Natural"
+msgstr "Auf&lösungszeichen"
+
+#: ../src/commands/notation/RespellCommand.cpp:60
+msgid "N&one"
+msgstr "&Kein"
+
+#: ../src/commands/notation/RespellCommand.cpp:66
+msgid "Respell Accidentals &Upward"
+msgstr "Enharmonisch nach oben"
+
+#: ../src/commands/notation/RespellCommand.cpp:69
+msgid "Respell Accidentals &Downward"
+msgstr "Enharmonisch nach unten"
+
+#: ../src/commands/notation/RespellCommand.cpp:72
+#, fuzzy
+msgid "&Restore Accidentals"
+msgstr "Enharmonisch verwechseln"
+
+#: ../src/commands/notation/RespellCommand.cpp:75
+msgid "Respell Accidentals"
+msgstr "Enharmonisch verwechseln"
+
+#: ../src/commands/notation/DeCounterpointCommand.h:55
+msgid "Split-and-Tie Overlapping &Chords"
+msgstr "Überlappende Akkorde aufteilen und verbinden"
+
+#: ../src/commands/notation/BeamCommand.h:49
+msgid "&Beam Group"
+msgstr "&Balkengruppe"
+
+#: ../src/commands/notation/AddTextMarkCommand.h:51
+msgid "Add Te&xt Mark..."
+msgstr "Te&xtmarke hinzufügen..."
+
+#: ../src/commands/notation/RestoreSlursCommand.h:49
+#, fuzzy
+msgid "&Restore Slur Positions"
+msgstr "Er&rechnete Notenhälse wiederherstellen"
+
+#: ../src/commands/notation/SustainInsertionCommand.h:56
+msgid "Add Pedal &Press"
+msgstr "Pedaldruck hinzufügen"
+
+#: ../src/commands/notation/SustainInsertionCommand.h:58
+msgid "Add Pedal &Release"
+msgstr "Pedalfreigabe hinzufügen"
+
+#: ../src/commands/notation/FixNotationQuantizeCommand.h:49
+msgid "Fi&x Notation Quantization"
+msgstr "Darstellungsquantisierung korrigieren"
+
+#: ../src/commands/notation/ChangeStemsCommand.h:51
+msgid "Stems &Up"
+msgstr "Notenhälse &aufwärts"
+
+#: ../src/commands/notation/ChangeStemsCommand.h:51
+msgid "Stems &Down"
+msgstr " &Notenhälse abwärts"
+
+#: ../src/commands/notation/MakeAccidentalsCautionaryCommand.cpp:43
+msgid "Use &Cautionary Accidentals"
+msgstr "Zeige Sicherheits-Vorzeichen"
+
+#: ../src/commands/notation/MakeAccidentalsCautionaryCommand.cpp:45
+msgid "Cancel C&autionary Accidentals"
+msgstr "Entferne Sicherheits-Vorzeichen"
+
+#: ../src/commands/notation/SetVisibilityCommand.h:50
+msgid "Set Visibility"
+msgstr "Sichtbarkeit setzen"
+
+#: ../src/commands/notation/ChangeStyleCommand.h:53
+msgid "Change &Note Style"
+msgstr "&Notenstil ändern"
+
+#: ../src/commands/notation/TextInsertionCommand.cpp:41
+msgid "Insert Text"
+msgstr "Text einfügen"
+
+#: ../src/commands/notation/InterpretCommand.h:70
+msgid "&Interpret..."
+msgstr "&Interpretieren..."
+
+#: ../src/commands/notation/TupletCommand.h:53
+msgid "&Triplet"
+msgstr "Triole"
+
+#: ../src/commands/notation/TupletCommand.h:54
+msgid "Tu&plet..."
+msgstr "&Tuole"
+
+#: ../src/commands/notation/UnTupletCommand.h:50
+msgid "&Untuplet"
+msgstr "Tuolen &auflösen"
+
+#: ../src/commands/notation/CollapseRestsCommand.h:54
+msgid "&Collapse Rests"
+msgstr "Pausen &zusammenfassen"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:145
+msgid "Add S&lur"
+msgstr "&Bogen hinzufügen"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:147
+msgid "Add &Phrasing Slur"
+msgstr "&Phrasierungsbogen einfügen"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:149
+msgid "Add Double-Octave Up"
+msgstr "2 Octaven höher einfügen"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:151
+msgid "Add Octave &Up"
+msgstr "Octave höher einfügen"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:153
+msgid "Add Octave &Down"
+msgstr "Octave tiefer einfügen"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:155
+msgid "Add Double Octave Down"
+msgstr "2 Octaven tiefer einfügen"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:160
+msgid "Add &Crescendo"
+msgstr "Crescendo einfügen"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:162
+msgid "Add &Decrescendo"
+msgstr "Decrescendo einfügen"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:164
+msgid "Add &Glissando"
+msgstr "Glissando einfügen"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:167
+msgid "Add &%1%2"
+msgstr "Hinzufügen: &%1%2"
+
+#: ../src/commands/notation/RemoveNotationQuantizeCommand.h:49
+msgid "Remo&ve Notation Quantization"
+msgstr "Darstellungsquantisierung entfernen"
+
+#: ../src/commands/notation/MakeChordCommand.h:50
+msgid "Make &Chord"
+msgstr " Akkord"
+
+#: ../src/commands/notation/MultiKeyInsertionCommand.h:63
+msgid "Change all to &Key %1..."
+msgstr "Alles ändern auf &Tonart %1..."
+
+#: ../src/commands/notation/KeyInsertionCommand.h:67
+#: ../src/commands/notation/MultiKeyInsertionCommand.h:65
+msgid "Add &Key Change..."
+msgstr "&Tonartveränderung hinzufügen..."
+
+#: ../src/commands/notation/RestoreStemsCommand.h:49
+#, fuzzy
+msgid "&Restore Stems"
+msgstr "Er&rechnete Notenhälse wiederherstellen"
+
+#: ../src/commands/notation/MakeNotesViableCommand.h:55
+#: ../src/commands/notation/MakeRegionViableCommand.h:52
+msgid "Tie Notes at &Barlines"
+msgstr "Noten an Taktstrichen verbinden etc."
+
+#: ../src/commands/notation/AddSlashesCommand.h:46
+msgid "Slashes"
+msgstr "Wiederholungsstriche"
+
+#: ../src/commands/notation/ChangeSlurPositionCommand.h:51
+msgid "Slur &Above"
+msgstr "Bogen oberhalb"
+
+#: ../src/commands/notation/ChangeSlurPositionCommand.h:51
+msgid "Slur &Below"
+msgstr "Bogen unterhalb"
+
+#: ../src/commands/notation/NormalizeRestsCommand.h:54
+msgid "&Normalize Rests"
+msgstr "Pausen &normalisieren..."
+
+#: ../src/commands/notation/TextChangeCommand.cpp:41
+msgid "Edit Text"
+msgstr "Event verändern"
+
+#: ../src/commands/notation/RemoveMarksCommand.h:49
+msgid "&Remove All Marks"
+msgstr "Alle Ma&rken löschen"
+
+#: ../src/commands/notation/AutoBeamCommand.h:52
+msgid "&Auto-Beam"
+msgstr "&Automatische Balken"
+
+#: ../src/commands/notation/UntieNotesCommand.h:49
+msgid "&Untie"
+msgstr "Lösen"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:48
+msgid "S&forzando"
+msgstr "S&forzando"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:50
+msgid "Sta&ccato"
+msgstr "Sta&ccato"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:52
+msgid "R&inforzando"
+msgstr "R&inforzando"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:54
+msgid "T&enuto"
+msgstr "T&enuto"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:56
+msgid "Tri&ll"
+msgstr "&Triller"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:58
+msgid "Trill &with Line"
+msgstr "Triller folgt der Linie"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:60
+msgid "Trill Line"
+msgstr "&Triller"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:62
+msgid "&Turn"
+msgstr "&Doppelschlag"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:64
+msgid "&Accent"
+msgstr "&Akzent"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:66
+msgid "&Staccatissimo"
+msgstr "&Staccatissimo"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:68
+msgid "&Marcato"
+msgstr "&Marcato"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:70
+msgid "&Pause"
+msgstr "&Pause"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:72
+msgid "&Up-Bow"
+msgstr "A&ufstrich"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:74
+msgid "&Down-Bow"
+msgstr "A&bstrich"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:76
+msgid "Mo&rdent"
+msgstr "Mo&rdent"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:78
+msgid "Inverted Mordent"
+msgstr "Umgekehrter Mordent"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:80
+msgid "Long Mordent"
+msgstr "Langer Mordent"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:82
+msgid "Lon&g Inverted Mordent"
+msgstr "Langer umgekehrter Mordent"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:84
+msgid "&%1%2"
+msgstr "&%1%2"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:89
+#, c-format
+msgid "Add %1"
+msgstr "Hinzufügen: %1"
+
+#: ../src/commands/notation/ResetDisplacementsCommand.h:49
+#, fuzzy
+msgid "Restore Positions"
+msgstr "Berechnete Positionen wiederherstellen"
+
+#: ../src/commands/notation/IncrementDisplacementsCommand.h:52
+msgid "Fine Reposition"
+msgstr "Feines Positionieren"
+
+#: ../src/commands/notation/RestoreTiesCommand.h:49
+#, fuzzy
+msgid "&Restore Tie Positions"
+msgstr "Berechnete Positionen wiederherstellen"
+
+#: ../src/commands/notation/ChangeTiePositionCommand.h:47
+#, fuzzy
+msgid "Tie &Above"
+msgstr "Bogen oberhalb"
+
+#: ../src/commands/notation/ChangeTiePositionCommand.h:47
+#, fuzzy
+msgid "Tie &Below"
+msgstr "Bogen unterhalb"
+
+#: ../src/commands/notation/KeyInsertionCommand.h:65
+msgid "Change to &Key %1..."
+msgstr "Wechsel zu Tonart %1..."
+
+#: ../src/commands/notation/RemoveFingeringMarksCommand.h:49
+msgid "&Remove Fingerings"
+msgstr "Alle Ma&rken löschen"
+
+#: ../src/commands/notation/BreakCommand.h:49
+msgid "&Unbeam"
+msgstr "Balken &entfernen"
+
+#: ../src/commands/notation/UnGraceCommand.h:48
+msgid "Ung&race"
+msgstr "Verzierung &entfernen"
+
+#: ../src/commands/notation/AddFingeringMarkCommand.cpp:45
+msgid "Add Other &Fingering..."
+msgstr "Andere & Fingersatz hinzufügen..."
+
+#: ../src/commands/notation/AddFingeringMarkCommand.cpp:47
+msgid "Add Fingering &0 (Thumb)"
+msgstr "Fingersatz &0 (Daumen) einfügen"
+
+#: ../src/commands/notation/AddFingeringMarkCommand.cpp:49
+#, c-format
+msgid "Add Fingering &%1"
+msgstr "Fingersatz &%1 einfügen"
+
+#: ../src/document/io/HydrogenXMLHandler.cpp:277
+msgid " imported from Hydrogen "
+msgstr " von Hydrogen importiert "
+
+#: ../src/document/io/LilyPondExporter.cpp:404
+#, fuzzy
+msgid ""
+"LilyPond does not allow spaces or backslashes in filenames.\n"
+"\n"
+"Would you like to use\n"
+"\n"
+" %1\n"
+"\n"
+" instead?"
+msgstr ""
+"Lilyond erlaubt weder Leerräume noch Backslashes in Dateinamen. Wollen Sie "
+"stattdessen\n"
+"\n"
+" %1\n"
+"benutzen?"
+
+#: ../src/document/io/LilyPondExporter.cpp:2054
+msgid "warning: overlong bar truncated here"
+msgstr "Warnung: Überlanger Takt hier abgeschnitten"
+
+#: ../src/document/io/LilyPondExporter.cpp:2060
+msgid "warning: bar too short, padding with rests"
+msgstr "Warnung: Takt zu kurz, wird mit Pausen aufgefüllt"
+
+#: ../src/document/MultiViewCommandHistory.cpp:318
+msgid "Nothing to undo"
+msgstr "Nichts rückgängig zu machen"
+
+#: ../src/document/MultiViewCommandHistory.cpp:320
+msgid "Nothing to redo"
+msgstr "Nichts zu wiederholen"
+
+#: ../src/document/MultiViewCommandHistory.cpp:328
+#: ../src/document/MultiViewCommandHistory.cpp:372
+#, c-format
+msgid "Und&o %1"
+msgstr "Rückgängig %1"
+
+#: ../src/document/MultiViewCommandHistory.cpp:330
+#: ../src/document/MultiViewCommandHistory.cpp:374
+#, c-format
+msgid "Re&do %1"
+msgstr "%1 &wiederholen"
+
+#: ../src/document/RosegardenGUIDoc.cpp:328
+msgid ""
+"The current file has been modified.\n"
+"Do you want to save it?"
+msgstr ""
+"Die aktuelle Datei wurde verändert.\n"
+"Wollen Sie sie speichern?"
+
+#: ../src/document/RosegardenGUIDoc.cpp:480
+#, c-format
+msgid ""
+"_n: Delete the 1 audio file recorded during the unsaved session?\n"
+"Delete the %n audio files recorded during the unsaved session?"
+msgstr ""
+"_n: Soll die 1 Audio Datei, die während der ungespeicherten Sitzung "
+"aufgenommen wurde, gelöscht werden?\n"
+"Sollen die %n Audio Dateien, die während der ungespeicherten Sitzung "
+"aufgenommen wurden, gelöscht werden?"
+
+#: ../src/document/RosegardenGUIDoc.cpp:501
+msgid ""
+"The following audio files were recorded during this session but have been "
+"unloaded\n"
+"from the audio file manager, and so are no longer in use in the document you "
+"are saving.\n"
+"\n"
+"You may want to clean up these files to save disk space.\n"
+"\n"
+"Please select any you wish to delete permanently from the hard disk.\n"
+msgstr ""
+"Die folgenden Audio Dateien wurden zwar während dieser Sitzung\n"
+"aufgenommen, sind aber nicht mehr im Audio Datei Manager geladen\n"
+"und werden daher vom zu speichernden Dokument nicht mehr verwendet.\n"
+"\n"
+"Sie können entscheiden diese Dateien zu löschen um Plattenplatz zu sparen.\n"
+"\n"
+"Bitte wählen diejenigen aus, die Sie permanent von der Festplatte entfernen "
+"möchten.\n"
+
+#: ../src/document/RosegardenGUIDoc.cpp:517
+#, fuzzy, c-format
+msgid ""
+"_n: <qt>About to delete 1 audio file permanently from the hard disk."
+"<br>There will be no way to recover this file.<br>Are you sure?</qt>\n"
+"\n"
+"<qt>About to delete %n audio files permanently from the hard disk.<br>There "
+"will be no way to recover these files.<br>Are you sure?</qt>"
+msgstr ""
+"_n: Gleich wird 1 Audio Datei permanent von der Festplatte gelöscht.\n"
+"Es gibt dann keine Möglichkeit, sie zu restaurieren.\n"
+"Sind Sie sicher?\n"
+"Gleich werden %n Audio Dateien permanent von der Festplatte gelöscht.\n"
+"Es gibt dann keine Möglichkeit, sie zu restaurieren.\n"
+"Sind Sie sicher?"
+
+#: ../src/document/RosegardenGUIDoc.cpp:580
+msgid "Can't open file '%1'"
+msgstr "Datei %1 kann nicht geöfnet werden '"
+
+#: ../src/document/RosegardenGUIDoc.cpp:585
+msgid "Reading file..."
+msgstr "Datei wird gelesen..."
+
+#: ../src/document/RosegardenGUIDoc.cpp:603
+#, fuzzy
+msgid "Could not open Rosegarden file"
+msgstr "Konnte Rosegarden-4-Datei nicht öffnen"
+
+#: ../src/document/RosegardenGUIDoc.cpp:641
+msgid "Error when parsing file '%1': \"%2\""
+msgstr "Fehler beim Parsen der Datei '%1': \"%2\""
+
+#: ../src/document/RosegardenGUIDoc.cpp:689
+msgid "Generating audio previews..."
+msgstr "Audio-Vorschau wird erzeugt..."
+
+#: ../src/document/RosegardenGUIDoc.cpp:721
+msgid "Merge"
+msgstr "Mischen"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1605
+msgid "File load cancelled"
+msgstr "Laden der Datei wurde abgebrochen"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1625
+msgid ""
+"<h3>Audio and plugins not available</h3><p>This composition uses audio files "
+"or plugins, but Rosegarden is currently running without audio because the "
+"JACK audio server was not available on startup.</p><p>Please exit "
+"Rosegarden, start the JACK audio server and re-start Rosegarden if you wish "
+"to load this complete composition.</p><p><b>WARNING:</b> If you re-save this "
+"composition, all audio and plugin data and settings in it will be lost.</p>"
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:1628
+msgid ""
+"<h3>Audio and plugins not available</h3><p>This composition uses audio files "
+"or plugins, but you are running a version of Rosegarden that was compiled "
+"without audio support.</p><p><b>WARNING:</b> If you re-save this composition "
+"from this version of Rosegarden, all audio and plugin data and settings in "
+"it will be lost.</p>"
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:1665
+msgid ""
+"<h3>Incorrect audio sample rate</h3><p>This composition contains audio files "
+"that were recorded or imported with the audio server running at a different "
+"sample rate (%1 Hz) from the current JACK server sample rate (%2 Hz).</"
+"p><p>Rosegarden will play this composition at the correct speed, but any "
+"audio files in it will probably sound awful.</p><p>Please consider re-"
+"starting the JACK server at the correct rate (%3 Hz) and re-loading this "
+"composition before you do any more work with it.</p>"
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:1675
+msgid ""
+"<h3>Inconsistent audio sample rates</h3><p>This composition contains audio "
+"files at more than one sample rate.</p><p>Rosegarden will play them at the "
+"correct speed, but any audio files that were recorded or imported at rates "
+"different from the current JACK server sample rate (%1 Hz) will probably "
+"sound awful.</p><p>Please see the audio file manager dialog for more "
+"details, and consider resampling any files that are at the wrong rate.</p>"
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:1676
+#, fuzzy
+msgid "Inconsistent sample rates"
+msgstr "Nicht-dauerhafte Eigenschaften"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1690
+#, fuzzy
+msgid ""
+"<h3>Plugins not found</h3><p>The following audio plugins could not be loaded:"
+"</p><ul>"
+msgstr ""
+"Die folgenden Plugins konnten nicht geladen werden:\n"
+"\n"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1698
+#, fuzzy
+msgid "<li>%1 (from %2)</li>"
+msgstr "-- %1 (von %2)\n"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1712
+msgid ""
+"This file contains one or more old element types that are now deprecated.\n"
+"Support for these elements may disappear in future versions of Rosegarden.\n"
+"We recommend you re-save this file from this version of Rosegarden to ensure "
+"that it can still be re-loaded in future versions."
+msgstr ""
+"Diese Datei enthält mindestens einen veralteten Elementtyp.\n"
+"In Zukunft wird dieser Elementtyp vielleicht nicht mehr unterstützt.\n"
+"Empfehlung: speichern Sie diese Datei aus dieser Version von Rosegarden "
+"heraus\n"
+"um sicherzustellen, daß sie auch in Zukunft gelesen werden kann."
+
+#: ../src/document/RosegardenGUIDoc.cpp:2207
+msgid "Insert Recorded MIDI"
+msgstr "MIDI-Aufnahme einfügen"
+
+#: ../src/document/RosegardenGUIDoc.cpp:2560
+msgid "%1 (recorded)"
+msgstr "%1 (aufgenommen)"
+
+#: ../src/document/RoseXmlHandler.cpp:442
+msgid ""
+"This file was written by Rosegarden %1, and it uses\n"
+"a different file format that cannot be read by this version."
+msgstr ""
+"Diese Datei wurde von Rosegarden %1 geschrieben und verwendet\n"
+"ein Dateiformat, daß von dieser Version nicht gelesen werden kann."
+
+#: ../src/document/RoseXmlHandler.cpp:452
+msgid ""
+"This file was written by Rosegarden %1, which is more recent than this "
+"version.\n"
+"There may be some incompatibilities with the file format."
+msgstr ""
+"Diese Datei wurde von Rosegarden %1 geschrieben. Das ist eine neuere "
+"Version, als Sie gerade verwenden.\n"
+"Möglicherweise gibt es Inkompatibilitäten zwischen den Dateiformaten."
+
+#: ../src/document/RoseXmlHandler.cpp:1687
+msgid "Loading plugins..."
+msgstr "Plugins werden geladen..."
+
+#: rc.cpp:6 rc.cpp:144
+#, no-c-format
+msgid "Se&gment"
+msgstr "Se&gment"
+
+#: rc.cpp:9 rc.cpp:84 rc.cpp:147 rc.cpp:303
+#, no-c-format
+msgid "Edit &With"
+msgstr "Editieren mit"
+
+#: rc.cpp:12 rc.cpp:21 rc.cpp:30 rc.cpp:39 rc.cpp:345
+#, no-c-format
+msgid "Actions Toolbar"
+msgstr "Aktion-Werkzeugleiste"
+
+#: rc.cpp:15 rc.cpp:33 rc.cpp:129 rc.cpp:285
+#, no-c-format
+msgid "Time Toolbar"
+msgstr "Zeit-Werkzeugleiste"
+
+#: rc.cpp:18 rc.cpp:36 rc.cpp:57 rc.cpp:63 rc.cpp:120 rc.cpp:243 rc.cpp:342
+#, no-c-format
+msgid "Transport Toolbar"
+msgstr "Bedienfeld-Werkzeugleiste "
+
+#: rc.cpp:24 rc.cpp:42 rc.cpp:123 rc.cpp:348
+#, no-c-format
+msgid "Zoom Toolbar"
+msgstr "Zoom-Werkzeugleiste"
+
+#: rc.cpp:45 rc.cpp:60 rc.cpp:99 rc.cpp:228 rc.cpp:327
+#, no-c-format
+msgid "T&ransport"
+msgstr "&Bedieneinheit"
+
+#: rc.cpp:51
+#, no-c-format
+msgid "Number of Stereo &Inputs"
+msgstr "Anzahl der Stereo E&ingänge"
+
+#: rc.cpp:54
+#, no-c-format
+msgid "&Number of Submasters"
+msgstr "A&nzahl Gruppen"
+
+#: rc.cpp:66
+#, no-c-format
+msgid "&Import"
+msgstr "&Import"
+
+#: rc.cpp:69
+#, no-c-format
+msgid "&Merge"
+msgstr "&Mischen"
+
+#: rc.cpp:72
+#, no-c-format
+msgid "&Export"
+msgstr "E&xport"
+
+#: rc.cpp:75 rc.cpp:141 rc.cpp:297
+#, no-c-format
+msgid "&Composition"
+msgstr "Komposition"
+
+#: rc.cpp:78
+#, no-c-format
+msgid "&Studio"
+msgstr "&Studio"
+
+#: rc.cpp:81
+#, no-c-format
+msgid "Se&gments"
+msgstr "Segmente"
+
+#: rc.cpp:90
+#, no-c-format
+msgid "Trac&ks"
+msgstr "S&puren"
+
+#: rc.cpp:93
+#, no-c-format
+msgid "Set &Instrument"
+msgstr "Instrument setzen"
+
+#: rc.cpp:102 rc.cpp:234 rc.cpp:333
+#, no-c-format
+msgid "&Toolbars"
+msgstr "&Werkzeugleisten"
+
+#: rc.cpp:105 rc.cpp:237 rc.cpp:336
+#, no-c-format
+msgid "&Rulers"
+msgstr "&Lineale anzeigen"
+
+#: rc.cpp:111 rc.cpp:240 rc.cpp:339
+#, no-c-format
+msgid "Tools Toolbar"
+msgstr "Werkzeug-Werkzeugleiste"
+
+#: rc.cpp:114
+#, no-c-format
+msgid "Tracks Toolbar"
+msgstr "Spuren-Werkzeugleiste"
+
+#: rc.cpp:117
+#, no-c-format
+msgid "Editors Toolbar"
+msgstr "Editor-Werkzeugleiste"
+
+#: rc.cpp:135
+#, no-c-format
+msgid "&Layout Mode"
+msgstr "&Layout Modus"
+
+#: rc.cpp:138 rc.cpp:294
+#, no-c-format
+msgid "Add Event Ruler"
+msgstr "Event-Lineal hinzufügen"
+
+#: rc.cpp:150
+#, fuzzy, no-c-format
+msgid "N&ote"
+msgstr "&Noten"
+
+#: rc.cpp:153
+#, no-c-format
+msgid "Mar&ks"
+msgstr "Mar&kierungen"
+
+#: rc.cpp:156
+#, no-c-format
+msgid "&Ornaments"
+msgstr "Verzierungen"
+
+#: rc.cpp:159
+#, no-c-format
+msgid "&Fingerings"
+msgstr "&Fingersätze"
+
+#: rc.cpp:162
+#, no-c-format
+msgid "S&lashes"
+msgstr "&Wiederholungsstriche"
+
+#: rc.cpp:165 rc.cpp:219
+#, no-c-format
+msgid "&Accidentals"
+msgstr "&Vorzeichen"
+
+#: rc.cpp:168
+#, fuzzy, no-c-format
+msgid "&Phrase"
+msgstr "&Löschen"
+
+#: rc.cpp:171
+#, no-c-format
+msgid "Slur &Position"
+msgstr "&Position des Bindebogen"
+
+#: rc.cpp:174
+#, fuzzy, no-c-format
+msgid "Tie &Position"
+msgstr "&Position des Bindebogen"
+
+#: rc.cpp:177
+#, no-c-format
+msgid "&Octaves"
+msgstr "&Oktaven"
+
+#: rc.cpp:180 rc.cpp:306
+#, no-c-format
+msgid "Ad&just"
+msgstr "Anpassen"
+
+#: rc.cpp:183
+#, no-c-format
+msgid "R&ests"
+msgstr "Pausen"
+
+#: rc.cpp:186 rc.cpp:213
+#, no-c-format
+msgid "&Notes"
+msgstr "&Noten"
+
+#: rc.cpp:189 rc.cpp:309
+#, no-c-format
+msgid "&Quantize"
+msgstr "&Quantisieren"
+
+#: rc.cpp:195 rc.cpp:315
+#, no-c-format
+msgid "Trans&pose"
+msgstr "Trans&ponieren"
+
+#: rc.cpp:198 rc.cpp:318
+#, no-c-format
+msgid "Convert"
+msgstr "Gewählte Events spie&geln"
+
+#: rc.cpp:201
+#, no-c-format
+msgid "&Fine Positioning"
+msgstr "&Feine Positionierung"
+
+#: rc.cpp:204
+#, no-c-format
+msgid "Fine Ti&ming"
+msgstr "Feines Ti&ming"
+
+#: rc.cpp:207
+#, no-c-format
+msgid "&Visibility"
+msgstr "Sichtbarkeit"
+
+#: rc.cpp:216
+#, no-c-format
+msgid "&Rests"
+msgstr "&Pausen"
+
+#: rc.cpp:222
+#, no-c-format
+msgid "&Clefs"
+msgstr "&Schlüssel"
+
+#: rc.cpp:225 rc.cpp:324
+#, no-c-format
+msgid "Local &Cursor"
+msgstr "Lokaler Zeiger"
+
+#: rc.cpp:246
+#, no-c-format
+msgid "Notes Toolbar"
+msgstr "Noten-Werkzeugleiste"
+
+#: rc.cpp:249
+#, no-c-format
+msgid "Rests Toolbar"
+msgstr "Pausen-Werkzeugleiste"
+
+#: rc.cpp:252
+#, no-c-format
+msgid "Clefs Toolbar"
+msgstr "Schlüssel-Werkzeugleiste"
+
+#: rc.cpp:255
+#, no-c-format
+msgid "Accidentals Toolbar"
+msgstr "Vorzeichen-Werkzeugleiste"
+
+#: rc.cpp:258
+#, no-c-format
+msgid "Group Toolbar"
+msgstr "Gruppen-Werkzeugleiste"
+
+#: rc.cpp:261
+#, no-c-format
+msgid "Marks Toolbar"
+msgstr "Vortragszeichen-Werkzeugleiste"
+
+#: rc.cpp:264
+#, no-c-format
+msgid "Meta Toolbar"
+msgstr "&Meta-Werkzeugleiste"
+
+#: rc.cpp:267
+#, no-c-format
+msgid "Layout Toolbar"
+msgstr "&Layout-Werkzeugleiste"
+
+#: rc.cpp:270 rc.cpp:351
+#, no-c-format
+msgid "Control Ruler actions"
+msgstr "Control-Lineal Aktionen"
+
+#: rc.cpp:273 rc.cpp:354
+#, no-c-format
+msgid "Property Ruler actions"
+msgstr "Eigenschaften-Lineal Aktionen"
+
+#: rc.cpp:276
+#, no-c-format
+msgid "&Action"
+msgstr "&Aktion"
+
+#: rc.cpp:279
+#, no-c-format
+msgid "General Toolbar"
+msgstr "e"
+
+#: rc.cpp:291
+#, no-c-format
+msgid "&Grid"
+msgstr "&Raster"
+
+#: rc.cpp:300
+#, no-c-format
+msgid "&Segment"
+msgstr "&Segment"
+
+#: rc.cpp:361
+#, no-c-format
+msgid "Hide additional controls"
+msgstr "Zusätzliche Kontrollelemente verbergen"
+
+#: rc.cpp:365
+#, no-c-format
+msgid "Panic Button"
+msgstr "Not-Halt"
+
+#: rc.cpp:368
+#, no-c-format
+msgid "Resets all MIDI devices if you've got stuck notes"
+msgstr "Setzt alle MIDI-Geräte zurück bei hängengebliebenen Tönen"
+
+#: rc.cpp:375
+#, no-c-format
+msgid "Provides a metronome click for you to play along with"
+msgstr "Stellt einen Metronom-Klick zur Verfügung"
+
+#: rc.cpp:378
+#, no-c-format
+msgid "Shows MIDI activity in and out of Rosegarden"
+msgstr ""
+"Zeigt MIDI-Aktivitäten aus Rosegarden heraus und nach Rosegarden hinein"
+
+#: rc.cpp:381
+#, no-c-format
+msgid "IN"
+msgstr "IN"
+
+#: rc.cpp:384
+#, no-c-format
+msgid "OUT"
+msgstr "OUT"
+
+#: rc.cpp:387 rc.cpp:390
+#, no-c-format
+msgid "NO EVENTS"
+msgstr "NO EVENTS"
+
+#: rc.cpp:397
+#, no-c-format
+msgid "Record either MIDI or audio"
+msgstr "MIDI- oder Audio-Aufnahme"
+
+#: rc.cpp:401
+#, no-c-format
+msgid "Loop"
+msgstr "Loop"
+
+#: rc.cpp:404
+#, no-c-format
+msgid "Turn on and off the loop markers (if set)"
+msgstr "Loop-Markierungen an- oder ausschalten (wenn gesetzt)"
+
+#: rc.cpp:411
+#, no-c-format
+msgid "Mutes all but the currently selected track"
+msgstr "Schaltet alle Spuren stumm bis auf die aktuell angewählte"
+
+#: rc.cpp:415
+#, no-c-format
+msgid "Start loop or range here"
+msgstr "Beginne Loop oder Bereich hier"
+
+#: rc.cpp:419
+#, no-c-format
+msgid "End loop or range here"
+msgstr "Beende Loop oder Bereich hier"
+
+#: rc.cpp:422
+#, no-c-format
+msgid "SIG"
+msgstr "SIG"
+
+#: rc.cpp:425
+#, no-c-format
+msgid "DIV"
+msgstr "DIV"
+
+#: rc.cpp:428
+#, no-c-format
+msgid "/16"
+msgstr "/16"
+
+#: rc.cpp:431
+#, no-c-format
+msgid "TEMPO"
+msgstr "TEMPO"
+
+#: rc.cpp:434
+#, no-c-format
+msgid "END"
+msgstr "END"
+
+#: rc.cpp:437
+#, no-c-format
+msgid "BAR"
+msgstr "BAR"
+
+#: rc.cpp:441
+#, no-c-format
+msgid "Switch between real time, musical time, and frame count"
+msgstr "Zwischen Echtzeit, Taktschlägen und SMPTE Frames umschalten"
+
+#: rc.cpp:445
+#, no-c-format
+msgid "Show additional controls"
+msgstr "Weitere Steuerelemente anzeigen"
+
+#: rc.cpp:449
+#, no-c-format
+msgid "Rewind"
+msgstr "Zurückspulen"
+
+#: rc.cpp:452
+#, no-c-format
+msgid "Moves the current pointer position back one bar."
+msgstr "Bewegt den aktuellen Zeiger einen Takt zurück."
+
+#: rc.cpp:456
+#, no-c-format
+msgid "Rewind to beginning"
+msgstr "Zum Beginn zurückspulen"
+
+#: rc.cpp:459
+#, no-c-format
+msgid ""
+"Moves the pointer position to the start of the composition. (This may mean "
+"going forwards if the pointer is currently before the start.)"
+msgstr ""
+"Bewegt den Zeiger zum Beginn des Stücks. (Wenn sich der Zeiger bereits vor "
+"dem Beginn des Stücks befindet, wird der Zeiger entsprechend vorwärts "
+"bewegt.)"
+
+#: rc.cpp:463
+#, no-c-format
+msgid "Play/Pause"
+msgstr "Wiedergabe/Pause"
+
+#: rc.cpp:466
+#, no-c-format
+msgid ""
+"Plays from the current pointer position, or pauses playback if already in "
+"progress."
+msgstr ""
+"Spielt von der aktuellen Cursorposition, oder hält die Wiedergabe an, wenn "
+"sie schon im Gang ist."
+
+#: rc.cpp:473
+#, no-c-format
+msgid "Stops playback or recording."
+msgstr "Beendet Wiedergabe bzw. Aufnahme"
+
+#: rc.cpp:477
+#, no-c-format
+msgid "Fast forward"
+msgstr "Schnell vorspulen"
+
+#: rc.cpp:480
+#, no-c-format
+msgid "Moves the current pointer position forwards one bar."
+msgstr "Bewegt die aktuelle Cursorposition einen Takt vorwärts."
+
+#: rc.cpp:484
+#, no-c-format
+msgid "Fast forward to end"
+msgstr "Schnell ans Ende vorspulen"
+
+#: rc.cpp:487
+#, no-c-format
+msgid ""
+"Moves the pointer position to the end of the composition. (This may mean "
+"going backwards if the pointer is already beyond the end.)"
+msgstr ""
+"Bewegt den Zeiger zum Ende des Stücks. (Wenn sich der Zeiger bereits hinter "
+"dem Ende des Stücks befindet, wird der Zeiger entsprechend zurück bewegt.)"
+
+#: rc.cpp:491
+#, no-c-format
+msgid "Display time to end"
+msgstr "Zeit bis zum Ende zeigen"
+
+#: ../docs/en/tips.cpp:3
+msgid ""
+"<p>To configure a track to play using a particular instrument:</p>\n"
+"&nbsp;&nbsp;* click on the track label and hold a moment<br>\n"
+"&nbsp;&nbsp;* select an output device<br>\n"
+"&nbsp;&nbsp;* select one of that device's available instruments (#1 - #16)"
+"<br>\n"
+"&nbsp;&nbsp;* adjust that instrument's output channel, program, bank, and\n"
+"controllers via the instrument parameters box\n"
+msgstr ""
+"<p>Um einer Spur ein bestimmtes Instrument zuzuweisen, gehe wie folgt vor:</"
+"p>\n"
+"&nbsp;&nbsp;* klicke für einen Moment auf den Spurnamen<br>\n"
+"&nbsp;&nbsp;* wähle ein Ausgabedevice<br>\n"
+"&nbsp;&nbsp;* wähle eines der verfügbaren Instrumente dieses Devices (#1 - "
+"#16)<br>\n"
+"&nbsp;&nbsp;* passe die Instrumentparameter (Ausgabekanal, Programm, Bank "
+"und Controller) über die Instrument Parameter Box an\n"
+
+#: ../docs/en/tips.cpp:13
+msgid ""
+"<p>...that Rosegarden has an autosave feature?<br><br>\n"
+"You can select your autosave interval from <b>Settings->Configure\n"
+"Rosegarden</b>.<br><br>\n"
+"When something goes awry, such as a power outage or a Rosegarden crash\n"
+"(unfortunately, it happens...) simply load the file you were working on, and "
+"you'll be given the\n"
+"option to load the autosaved version, or the unmodified original.</p>\n"
+msgstr ""
+"<p>...dass Rosegarden ein Autospeichern-Feature hat?<br><br>\n"
+"Sie können den Abstand zwischen zwei automatischen Speicherungen über \n"
+"<b>Einstellungen->Rosegarden</b> einrichten auswählen.<br><br>\n"
+"Wenn etwas schief geht, zum Beispiel ein Stromausfall oder ein Absturz von "
+"Rosegarden\n"
+" (das kommt leider vor...), laden Sie einfach die Datei an der Sie "
+"gearbeitet haben, und Sie\n"
+" haben dann die Auswahl, ob Sie die automatisch gespeicherte Version oder "
+"das unveränderte\n"
+" Original laden wollen.</p>\n"
+
+#: ../docs/en/tips.cpp:23
+#, fuzzy
+msgid ""
+"<p>\n"
+"...that you can save the current document as your default studio by using\n"
+"<b>Composition -> Studio -> Save Current Document as Default Studio</b>?</"
+"p>\n"
+msgstr ""
+"<p>\n"
+"Sie können das aktuelle Dokument als Ihr Standardstudio speichern. Wählen "
+"Sie Komposition -> Studio -> Speichere aktuelles Dokument als "
+"Standardstudio</b>.</p>\n"
+
+#: ../docs/en/tips.cpp:30
+msgid ""
+"<p>...that your default studio is a complete Rosegarden composition that "
+"gets\n"
+"loaded every time you create a new document or import a MIDI file?</p>\n"
+msgstr ""
+"<p>...dass ihr Standardstudio ein komplettes Rosegarden-Stück ist, das "
+"jedesmal geladen wird,\n"
+" wenn Sie ein neues Dokument erzeugen oder eine MIDI-Datei importieren?</p>\n"
+
+#: ../docs/en/tips.cpp:36
+#, fuzzy
+msgid ""
+"<p>...that your default studio can contain instrument assignments, document "
+"properties, LilyPond headers,\n"
+"and many other things?<br><br>The default studio is a complete Rosegarden "
+"composition, so it can contain anything that you may wish to have available "
+"in each\n"
+"new document you create.</p>\n"
+msgstr ""
+"<p>Weil Ihr Standardstudio ein komplettes Rosegarden-Stück ist, kann es\n"
+" Standard-Instrumentenzuordnungen, Dokumenteigenschaften, LilyPond-Header "
+"und viele\n"
+" andere Dinge enthalten, die Sie standardmäßig in jedem neuen von Ihnen "
+"erzeugten Dokument\n"
+" verfügbar haben möchten.</p>\n"
+
+#: ../docs/en/tips.cpp:43
+#, fuzzy
+msgid ""
+"<p>...that Rosegarden will detect and create a default connection for ALSA "
+"soft\n"
+"synth applications that are started after Rosegarden is already running?</"
+"p>\n"
+msgstr ""
+"<p>...dass Rosegarden eine Standardverbindung zu ALSA Software Synthesizern "
+"herstellt,\n"
+" die gestartet werden, während Rosegarden schon läuft?</p>\n"
+
+#: ../docs/en/tips.cpp:49
+#, fuzzy
+msgid ""
+"<p>...that you can make your default studio override that in every "
+"Rosegarden composition you load?<br><br>If your studio setup does not change "
+"very often, and you would prefer for\n"
+"the settings in your default studio to take precedence over whatever\n"
+"studio is saved with any files you happen to load, you can make your studio "
+"the default for everything using <b>Settings -> Configure Rosegarden ->\n"
+"MIDI -> Always use default studio when loading files</b>.</p>\n"
+msgstr ""
+"<p>Falls sich die Zusammensetzung Ihres Studios nur selten ändert und\n"
+"sie daher möchten, dass die Einstellungen in Ihrer <b>autoload.rg</b>\n"
+"Vorrang haben vor jenen, die lokal in jedem Song mit abgespeichert werden,\n"
+"so können Sie Ihr autoload<b>autoload.rg</b> zum Standard machen:\n"
+"Wählen Sie <b>Settings -> Einrichten Rosegarden -> Verhalten ->\n"
+"Beim Laden von Dateien immer Standardstudio verwenden</b>.</p>\n"
+
+#: ../docs/en/tips.cpp:57
+msgid ""
+"<p>If you have accidentally recorded a segment so short that it does not\n"
+"appear on the canvas, which you can only hear during subsequent recording\n"
+"sessions, you can gain access to it by using <b>Composition -> Change\n"
+"Composition Start and End</b> and then setting the composition to start at a "
+"negative number.</p>\n"
+msgstr ""
+"<p>Falls Sie versehentlich ein Segment aufgenommen haben, das zu kurz ist,\n"
+"als dass es auf dem Canvas dargestellt wird, das Sie also nur bei "
+"nachfolgenden\n"
+"Aufnahmen hören können, so erlangen Sie Zugriff auf dieses Segment, indem "
+"Sie\n"
+"<b>Komposition -> Ändern Anfang und Ende der Komposition</b> wählen und dann "
+"den Anfang auf einen negativen Wert setzen.</p>\n"
+
+#: ../docs/en/tips.cpp:65
+#, fuzzy
+msgid ""
+"<p>...that if you place a note at the wrong pitch using the notation or "
+"matrix editor, you can move it one semitone at a time with the up and down "
+"arrow keys on your keyboard?</p>\n"
+msgstr ""
+"<p>...dass Sie im Notationseditor Noten, die Sie auf die falsche Tonhöhe "
+"gesetzt haben,\n"
+" um jeweils einen Halbton mit den Pfeiltasten auf Ihrer Tastatur nach oben "
+"und unten\n"
+" verschieben können?</p>\n"
+
+#: ../docs/en/tips.cpp:70
+msgid ""
+"<p>...that you can toggle stem directions in the notation editor by "
+"selecting\n"
+"one or more notes and using Ctrl-PageUp and Ctrl-PageDown?</p>\n"
+msgstr ""
+"<p>...dass Sie die Richtung von Notenhälsen verändern können, indem Sie eine "
+"oder mehrere\n"
+" Noten auswählen und Strg-BildAuf und Strg-BildAb benutzen?</p>\n"
+
+#: ../docs/en/tips.cpp:76
+msgid ""
+"<p>...that you can change the accidental used for a note in the notation "
+"editor (without changing the pitch of the note) by selecting\n"
+"it and using the up and down arrow keys with both Ctrl and Shift pressed?</"
+"p>\n"
+msgstr ""
+"<p>...dass Sie im Notationseditor das Vorzeichen einer Note ändern können "
+"(ohne die Tonhöhe zu verändern)\\\n"
+"indem Sie sie auswählen und Strg-Shift-Pfeiltaste benutzen??</p>\n"
+
+#: ../docs/en/tips.cpp:82 ../docs/en/tips.cpp:93
+msgid ""
+"<p>...that you can hold down the Shift key while repositioning segments on "
+"the\n"
+"segment canvas in order to avoid the \"snap-to\" effect and exert finer "
+"control?</p>\n"
+msgstr ""
+"<p>...dass Sie beim Verschieben von Segmenten die Shift-Taste festhalten und "
+"so den\n"
+" \"Einschnapp-Effekt\" vermeiden und feinere Kontrolle ausüben können?</p>\n"
+
+#: ../docs/en/tips.cpp:88
+msgid ""
+"<p>...that you can use the arrow tool to draw, move, and resize segments and "
+"events as well as to select them?<br><br>Drag a segment or event block to "
+"move it, drag the right edge of a block to resize it, and drag with the "
+"middle mouse button pressed to draw a new segment or event.<br><br>(Of "
+"course, the dedicated draw, move and resize tools are still quicker for "
+"repeated operations.)</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:99
+msgid ""
+"<p>...that you can hold down the Shift key while repositioning or resizing "
+"events in the\n"
+"matrix view in order to avoid the \"snap-to\" effect and exert finer control?"
+"</p>\n"
+msgstr ""
+"<p>...dass Sie beim Verschieben von Segmenten die Shift-Taste festhalten und "
+"so den\n"
+" \"Einschnapp-Effekt\" vermeiden und feinere Kontrolle ausüben können?</p>\n"
+
+#: ../docs/en/tips.cpp:105
+msgid ""
+"<p>...that you can edit multiple segments on multiple tracks simultaneously "
+"in\n"
+"the notation editor? Simply select the segments, then use <b>Edit -> Open "
+"in Notation Editor</b>.</p>\n"
+msgstr ""
+"<p>...dass Sie mehrere Segmente auf mehreren Spuren gleichzeitig im "
+"Notationseditor\n"
+" bearbeiten können? Wählen Sie einfach die Segmente aus, und rufen Sie dann\n"
+" <b>Segmente -> Im Notationseditor öffnen</b> auf.</p>\n"
+
+#: ../docs/en/tips.cpp:111
+msgid ""
+"<p>...that Rosegarden can export files for use by LilyPond, the high-quality "
+"score typesetting system?<br><br>\n"
+"From the <b>File</b> menu, navigate to <b>Export -> Export LilyPond File</"
+"b></p>\n"
+msgstr ""
+"<p>...dass Rosegarden Dateien für die Verwendung mit Lilypond, dem System "
+"für anspruchsvollen\n"
+" Notensatz, exportieren kann? Öffnen Sie <b>Datei->Export->Lilypond-Datei "
+"exportieren</b></p>\n"
+
+#: ../docs/en/tips.cpp:117
+#, fuzzy
+msgid ""
+"<p>...that Rosegarden can print via LilyPond, the high-quality score "
+"typesetting system?<br><br>\n"
+"From the <b>File</b> menu, navigate to <b>Preview with LilyPond</b>. The "
+"file\n"
+"will be exported, rendered, and a preview will appear in KPDF, or one of\n"
+"several other PDF viewers, where it can then be printed as well.</p>\n"
+msgstr ""
+"<p>...dass Rosegarden auch über Lilypond, dem System für anspruchsvollen\n"
+" Notensatz, drucken kann?<br><br>\n"
+"Wählen Sie im <b>Datei</b>-Menu <b>Vorschau mit LilyPond</b>. Die Datei wird "
+"exportiert, gerendert und eine Vorschau über KGhostView oder einen der "
+"diversen anderen PDF-Viewer angezeigt. Von dort kann sie dann ausgedruckt "
+"werden.</p>\n"
+
+#: ../docs/en/tips.cpp:125
+msgid ""
+"<p>...that if you use the quantizer from within the notation view, you can "
+"tell it to quantize only the timing used for notation -- making it possible "
+"to have good looking notation <b>and</b> a human MIDI performance?</p>\n"
+msgstr ""
+"<p>...dass der Quantisierer, wenn er aus der Notationsansicht aus aufgerufen "
+"wird, nur das für\n"
+" die Notation notwendige Timing quantisieren kann -- und auf diese Weise "
+"eine gut aussehende\n"
+" Notation <b>und</b> eine vollständig menschliche MIDI-Darbeitung ermöglicht?"
+"</p>\n"
+
+#: ../docs/en/tips.cpp:130
+msgid ""
+"<p>...that you can change segment labels using the controls on the Segment "
+"Parameters box\n"
+"in the main window?</p>\n"
+msgstr ""
+"<p>...dass Sie Segmentbeschriftungen über die Segmentparameter-Dialogbox im "
+"Hauptfenster\n"
+" ändern können?</p>\n"
+
+#: ../docs/en/tips.cpp:136
+msgid ""
+"<p>...that the number of tracks in new documents is based on the contents "
+"of\n"
+"your autoload.rg file?\n"
+"<br><br>\n"
+"Whether you prefer to start with three tracks or 43, create a document that\n"
+"contains the desired number of tracks, plus any other studio or document "
+"properties settings\n"
+"you wish to configure, and use <b>Composition -> Studio -> Save Current "
+"Document as Default\n"
+"Studio</b> to make this your new default.</p>\n"
+msgstr ""
+"<p>...dass die Anzahl von Spuren in neuen Stücken vom Inhalt Ihrer autoload."
+"rg-Datei abhängt?\n"
+" Wenn Sie lieber mit 3 oder 43 Spuren anfangen wollen, erzeugen Sie einfach "
+"ein Dokument mit der\n"
+" gewünschten Anzahl von Spuren sowie der weiteren Sudio- oder "
+"Stückeigenschaften, die Sie\n"
+" konfigurieren möchten, und benutzen dann\n"
+" <b>Studio -> Aktuelles Studio als Standardstudio speichern</b>, um dies zu "
+"Ihren neuen\n"
+" Standardeinstellungen zu machen.</p>\n"
+
+#: ../docs/en/tips.cpp:147
+msgid ""
+"<p>...that you can change the name of a track by double clicking on the "
+"label? (The\n"
+"label must be visible for this to work.)</p>\n"
+msgstr ""
+"<p>...dass Sie den Namen einer Spur verändern können, indem Sie doppelt auf "
+"die Beschriftung\n"
+" klicken? (Damit das funktioniert, muss die Beschriftung sichtbar sein.)</"
+"p>\n"
+
+#: ../docs/en/tips.cpp:153
+#, fuzzy
+msgid ""
+"<p>...that you can configure what happens when you double-click on a segment?"
+"<br><br>Go to <b>Settings -> Configure Rosegarden</b> and choose your "
+"preferred editing window under the <b>Behaviour</b> tab.</p>\n"
+msgstr ""
+"<p>...daß Sie einstellen können, was bei einen Doppelklick auf ein Segment "
+"passieren soll? Gehen Sie nach <b>Einstellungen->Rosegarden einrichten</b> "
+"und wählen Sie ihr bevorzugtes Editorfenster unter dem <b>Verhalten</b> "
+"Reiter.</p>\n"
+
+#: ../docs/en/tips.cpp:158
+msgid ""
+"<p>...that Rosegarden is being developed as a community effort with\n"
+"contributions from around the world?<br><br>\n"
+"The four most active developers live in London (England), Cannes, "
+"Barcelona,\n"
+"and... Christiansburg? (Christiansburg is a town of about 50,000 in\n"
+"southwestern Virginia, USA.)<br><br>\n"
+"We have had contributors from elsewhere in the US, UK, Spain, Mexico, "
+"Argentina, Germany,\n"
+"Sweden, Russia, Japan, Finland, and Italy, just to name a few...</p>\n"
+msgstr ""
+"<p>...dass Rosegarden von Freiwilligen aus der ganzen Welt entwickelt wird?"
+"<br><br>\n"
+"Die vier zentralen Entwickler leben in London (Großbritannien), Cannes,\n"
+"Barcelona und Christiansburg? (Christiansburg ist eine Stadt mit ca. 50,000\n"
+"Einwohnern im Südwesten Virginias, USA)<br><br>\n"
+"Weitere Entwickler leben anderswo in den USA, Großbritanien, Spanien, "
+"Mexiko, Argentinien, Deutschland, Schweden, Russland, Japan, Finnland und "
+"Italien, um nur einige wenige zu nennen...</p>\n"
+
+#: ../docs/en/tips.cpp:169
+msgid ""
+"<p>...that Rosegarden is available in Spanish, French, German, Russian, "
+"Welsh, Swedish, Italian and Estonian\n"
+"translations? (Just to name a few.)<br><br>\n"
+"If you're interested in translating Rosegarden to another language, drop us "
+"a\n"
+"line at <b>[email protected]</b>.</p>\n"
+msgstr ""
+"<p>...dass es Rosegarden auf Spanisch, Französisch, Deutsch, Russisch, "
+"Walisisch, Schwedisch, Italienisch und Estisch gibt? (Um nur einige wenige "
+"zu nennen)<br><br>\n"
+"Wenn Sie daran interessiert sind, Rosegarden in eine andere Sprache\n"
+"zu übersetzen, schreiben Sie uns doch kurz eine Nachricht an\n"
+"<b>[email protected]</b>.</p>\n"
+
+#: ../docs/en/tips.cpp:177
+msgid ""
+"<p>...that you can change the total number of bars in the composition via\n"
+"<b>Composition -> Change Composition Start and End</b>?</p>\n"
+msgstr ""
+"<p>...dass Sie die Gesamtzahl der Takte eines Stücks über\n"
+" <b>Komposition -> Dauer des Stücks verändern</b> ändern können?</p>\n"
+
+#: ../docs/en/tips.cpp:183
+msgid ""
+"<p>...that you can see the difference between performance and display "
+"duration\n"
+"of duration-quantized notes in the notation editor?<br><br>\n"
+"Use <b>Settings -> Show Raw Note Ruler</b> to turn on this handy\n"
+"feature.<br><br>\n"
+"<i>Note that this feature does not work in page layout view.</i></p>\n"
+msgstr ""
+"<p>...dass Sie den Unterschied zwischen Länge der Wiedergabe und Länge der "
+"Notation für\n"
+" längen-quantisierte Noten im Notationseditor sehen können?<br><br>\n"
+"Rufen Sie <b>Einstellungen -> Rohnotenlineal zeigen</b> auf, um dieses "
+"nützliche Feature\n"
+" einzuschalten.<br><br>\n"
+"<i>Achtung: dieses Feature funktioniert nicht in der Seitenlayoutansicht.</"
+"i></p>\n"
+
+#: ../docs/en/tips.cpp:192
+msgid ""
+"<p>...that you can add tempo and time-signature changes by double-clicking "
+"on the values displayed in the transport window or tempo rulers?</p>\n"
+msgstr ""
+"<p>...dass Sie Veränderungen von Tempo und Taktart einfügen können, indem "
+"Sie auf die im\n"
+" Bedienfeld angezeigten Werte doppelt klicken?</p>\n"
+
+#: ../docs/en/tips.cpp:197
+#, fuzzy
+msgid ""
+"<p>...that the transport window can display musical time, sample frame "
+"count, and a visual metronome as well as real time?<br><br>Just click on the "
+"small button at the extreme top left of the window.</p>\n"
+msgstr ""
+"<p>...dass das Bedienfeld sowohl Taktschläge und 24-fps SMPTE-Frames als "
+"auch Echtzeit\n"
+" anzeigen kann? Klicken Sie einfach auf den kleinen Knopf an der äußersten "
+"linken oberen Ecke\n"
+" des Fensters.</p>\n"
+
+#: ../docs/en/tips.cpp:202
+#, fuzzy
+msgid ""
+"<p>...that you can select all notes of a particular pitch in the matrix "
+"view, by shift-clicking on that pitch on the piano keyboard at the left?"
+"<br><br>If you shift-click-drag, you can select whole ranges too.</p>\n"
+msgstr ""
+"<p>...dass Sie alle Noten einer bestimmten Höhe auswählen können, indem Sie "
+"auf diese\n"
+" Tonhöhe Umschalt-Klicken? Wenn Sie Umschalt-Klicken und Ziehen, können Sie "
+"sogar ganze\n"
+" Bereiche auswählen.</p>\n"
+
+#: ../docs/en/tips.cpp:207
+#, fuzzy
+msgid ""
+"<p>...that you can set a loop in the main window by clicking-and-dragging on "
+"the time ruler with Shift pressed?<br><br>(If the ruler isn't visible, use "
+"<b>Settings -> Show Rulers</b>.)</p>\n"
+msgstr ""
+"<p>...dass Sie eine Schleife im Hauptfenster erzeugen können, indem Sie auf "
+"die Zeitskala\n"
+" Klicken-und-Ziehen und dabei die Umschalttaste drücken? (Wenn die Zeitskala "
+"nicht sichtbar ist,\n"
+" rufen Sie <b>Einstellungen -> Lineale anzeigen</b> auf.)</p>\n"
+
+#: ../docs/en/tips.cpp:212
+#, fuzzy
+msgid ""
+"<p>...that if you're editing a section in the matrix or notation view, you "
+"can\n"
+"set that section to loop while you edit it?<br><br>Select it and use "
+"<b>Tools ->\n"
+"Local Cursor -> Set Loop to Selection</b>, then hit Play.</p><br><br>\n"
+"<i>This feature does not work quite as well for compositions that include "
+"sampled\n"
+"audio.</i>\n"
+msgstr ""
+"<p>...das Sie einen Bereich, den Sie in der Matrix- oder Notationsansicht "
+"berabeiten,\n"
+" als Loop definieren können während Sie ihn bearbeiten? Selektieren Sie ihn\n"
+"und wählen Sie <b>Werkzeuge -> Lokaler Cursor -> Auswahl als Schleife "
+"festlegen</b> aus,\n"
+" und drücken Sie Wiedergabe.</p><br>\n"
+"<i>Diese Funktion funktioniert nur eingeschränkt gut, sofern die "
+"Komposition\n"
+"Audio-samples enthält</i><br>\n"
+
+#: ../docs/en/tips.cpp:221
+msgid ""
+"<p>...if you have more than one note or controller event at the same time, "
+"you\n"
+"can use the [ and ] keys to flip the stack of events around on the "
+"controller\n"
+"and velocity rulers in order to bring the item you wish to adjust into\n"
+"focus.</p>\n"
+msgstr ""
+"<p>...falls Sie mehrere Noten- oder Controller-Events zum gleichen Zeitpunkt "
+"haben\n"
+"dann können Sie deren Darstellungsreihenfolge im Anschlagdynamik- und "
+"Controller-\n"
+"Lineal mit den Tasten [ und ] verändern und so das Ereignis, das Sie "
+"verändern\n"
+"möchten, aktivieren.</p>\n"
+
+#: ../docs/en/tips.cpp:229
+#, fuzzy
+msgid ""
+"<p>...that the notation view shows you notes using their display duration, "
+"while the\n"
+"matrix allows you to edit their performance duration?<br><br>\n"
+"<i>Be careful with tied notes in the matrix. It is not apparent that they "
+"are\n"
+"tied, and if you split up a pair of tied notes, subsequent notation views "
+"will\n"
+"be confused and unhappy. This is an old bug that has been on our TODO list\n"
+"for years. Sorry about that, folks. Patches welcome.</i>\n"
+"</p>\n"
+msgstr ""
+"<p>Die Notationsansicht stellt Noten in Ihrer Darstellungslänge dar, "
+"wogegen\n"
+"Sie im Matrixeditor die tatsächlich gespielte Länge anpassen können.</"
+"p><br><br>\n"
+"<i>Seien Sie bei gebundenen Noten im Matrixeditor besonders aufmerksam.\n"
+"Es ist ev. nicht offensichtlich, dass sie gebunden sind Sie können so "
+"gebundene\n"
+"Noten trennen, was wiederum die Notationsansicht \"verwirrt\".\n"
+"Dies ist ein alter Fehler und seine Beseitigung befindet sich schon seit "
+"Jahren\n"
+"auf unserer TODO-Liste\n"
+"Tut uns leid. Patches sind willkommen.</i>\n"
+
+#: ../docs/en/tips.cpp:240
+#, fuzzy
+msgid ""
+"<p>If you're working with a human performance and you need to insert some "
+"new\n"
+"notes, these new notes will sound for their entire written duration. To "
+"blend\n"
+"these new notes into a human performance, select them, then use <b>Adjust -> "
+"Interpret...</b> \n"
+"from the notation view to interpret any marks and massage their "
+"performance\n"
+"durations to something less mechanical.</p>\n"
+msgstr ""
+"<p>Falls Sie mit einer \"echten\" (gespielten MIDI-) Aufnahme arbeiten und "
+"eine Note\n"
+"einfügen wollen, so wird sie für die gesamte notierte Dauer erklingen. Um "
+"die eingefügte\n"
+"Note stilistisch in die Aufnahme einzupassen gehen Sie wie folgt vor:\n"
+"Wählen Sie in der Notationsansicht <b>Anpassen -> Noten -> interpretieren</"
+"b>. Nun wird die Spieldauer der markierten Noten derart angepasst, dass es "
+"weniger\n"
+"mechanisch klingt.</p>\n"
+
+#: ../docs/en/tips.cpp:249
+#, fuzzy
+msgid ""
+"<p>...that Rosegarden can export certain things to LilyPond that it cannot "
+"yet\n"
+"display within its own native interface?<br><br>These new directives can be "
+"inserted\n"
+"via the <b>T</b> text insert tool in the notation view.<br><br>\n"
+"Load the example files\n"
+"<b>lilypond-alternative-endings.rg</b> and <b>lilypond-directives.rg</b> for "
+"a\n"
+"demonstration of how to use the new exportable directives.<br><br>\n"
+"Use <b>File -> Preview with\n"
+"LilyPond</b> to see what they look like on the exported page.<br><br>\n"
+"<i>Be sure to turn on\n"
+"<b>Settings -> Show LilyPond Directives</b> and <b>Show Annotations</b> "
+"within\n"
+"the notation view.</i></p>\n"
+msgstr ""
+"<p>Rosegarden kann jetzt Dinge nach LilyPond exportieren,\n"
+"die es bisher noch nicht selbst darstellen kann. Die dafür zuständigen\n"
+"neuen Anweisungen werden mit dem <b>T</b> text Einfügewerkzeug\n"
+"in der Notationsansicht eingefügt.<br><br>\n"
+"Loaden Sie die Beispieldateien <b>lilypond-alternative-endings.rg</b>\n"
+"und <b>lilypond-directives.rg</b> um zu sehen, wie diese neuen\n"
+"exportierbaren Anweisungen verwendet werden.<br><br>\n"
+"Wählen Sie <b>Datei -> Vorschau mit LilyPond</b> um zu sehen,\n"
+"wie sie auf der exportierten Seite aussehen.<br><br>\n"
+"<i>Achten Sie darauf <b>Einstellungen -> Anzeige LilyPond Anweisungen</b>\n"
+"sowie <b>Zeige Ergänzugen</b> in der Notationsansicht einzuschalten.</i></"
+"p>\n"
+
+#: ../docs/en/tips.cpp:264
+#, fuzzy
+msgid ""
+"<p>...that Rosegarden has track parameters allowing you to <b>Create "
+"segments with:</b> certain\n"
+"properties by default?<br><br>You can pre-select the clef, transposition, "
+"colour, and specify\n"
+"the highest and lowest playable notes (notes outside this range display in\n"
+"red by default). Then draw a segment with the pencil, or record one, and "
+"any\n"
+"new segments created on this track will take these properties as segment\n"
+"parameters.<br><br>\n"
+"<i>These parameters do not apply to audio tracks.</i></p>\n"
+msgstr ""
+"<p>Rosegarden unterstützt jetzt die Vorauswahl von Spurparametern für\n"
+"<b>Erzeuge Segmente mit:</b> bestimmten Eigenschaften. Sie können\n"
+"den Schlüssel, Transposition, Farbe sowie höchste und tiefste spielbare\n"
+"Note (Noten ausserhalb dieses Bereiches werden standardmässig in rot\n"
+"dargestellt). Jedes neue Segment auf dieser Spur, sei es mit dem Stift\n"
+"gezeichtnet oder aufgenommen, hat dann diese Eigenschaften als\n"
+"Segmentparameter.<br><br>\n"
+"<i>Dies gilt nicht für Audiospuren.</i></p>\n"
+
+#: ../docs/en/tips.cpp:275
+#, fuzzy
+msgid ""
+"<p>...that Rosegarden has a database of preset parameters describing more "
+"than 300\n"
+"musical instruments from the real world, grouped into several convenient\n"
+"categories?<br><br>Each preset contains a clef, transposition, and playable "
+"range\n"
+"suggestions for both amateur and professional players.<br><br>Click the\n"
+"<b>Load</b> button in the new track parameters box to get started! <i>(If "
+"you\n"
+"do not see a <b>Load</b> button, be sure your parameter panel is set for\n"
+"tabbed mode, rather than stacked mode.)</i> <br><br> <i>(Special thanks to "
+"Magnus\n"
+"Johansson for assembling this extraordinary database.)</i></p>\n"
+msgstr ""
+"<p>Rosegarden verfügt jetzt über eine Datenbank mit mehr als 300\n"
+"Voreinstellungen (Presets) für reale Musikinstrumente, die in verschiedene\n"
+"praktische Kategorien gruppiert sind. Jede Voreinstellung umfasst den "
+"Schlüssel, ev. Transposition sowie Vorschläge für den spielbaren\n"
+"Bereich sowohl für Amateure als auch professionelle Spieler.<br><br>\n"
+"Klicken Sie auf den <b>Laden</b> Knopf in der neuen Spurparameterbox\n"
+"um sich damit vertraut zu machen.<i>(falls Sie keine <b>Laden</b> Knopf\n"
+"sehen überprüfen Sie bitte, ob sich die Parameter Schaltfläche im \"Tabbed "
+"Mode\"\n"
+"befindet und nicht im \"Stapelmodus\".)</i> <br><br> <i>(Besonderer Dank\n"
+"gilt Magnus Johansson, der diese außergeöhnliche Datenbank zusammengestellt\n"
+"hat.)</i></p>\n"
+
+#: ../docs/en/tips.cpp:287
+#, fuzzy
+msgid ""
+"<p>...that when exporting to Lilypond, you can merge tracks that have the "
+"same name onto a single staff?<br><br>For example, if there are three voices "
+"in a single part, write each\n"
+"voice as an independent segment/staff, each on a separate track. Give all\n"
+"three tracks the same name, and select <b>[x] Merge tracks that have the "
+"same\n"
+"name</b> from the options dialog that appears when you export to, or "
+"preview\n"
+"with LilyPond.<br><br>\n"
+"<i>The tracks must have a non-default name for this to work.</i></p>\n"
+msgstr ""
+"<p>Sie können mehrere gleichnamige Spuren in ein einziges zusammengefügtes\n"
+"System in LilyPond exportieren. Besteht z.B. ein Part aus drei einzelnen\n"
+"Stimmen, dann notieren Sie die einzelnen Stimmen in getrennten Segmenten\n"
+"auf getrennten Spuren. Benennen Sie alle Spuren gleich und wählen\n"
+"<b>[x] Zusammenführen gleichnamiger Spuren</b> im Auswahldialog,\n"
+"der beim Export nach oder der Vorschau in LilyPond erscheint.<br><br>\n"
+"<i>Damit das funktioniert dürfen die Spuren nicht die Standardnamen haben.</"
+"i></p>\n"
+
+#: ../docs/en/tips.cpp:297
+msgid ""
+" \t \n"
+"<p>...that you can use the mouse wheel to scroll up and down, scroll left "
+"and right, and zoom in and out?<br><br>Just roll the wheel to scroll up or "
+"down. Hold Alt as well to scroll left or right, or hold Ctrl to zoom in and "
+"out.</p> \t \n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:303
+msgid ""
+" \t \n"
+"<p>...that you can time-stretch an audio segment -- stretching or squashing "
+"a\n"
+"sample to a different duration without changing its pitch -- just by\n"
+"dragging its right edge with the Ctrl key pressed?</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:311
+msgid ""
+" \t \n"
+"<p>...that you can add audio to your Rosegarden composition just by dragging "
+"an audio file from your file manager and dropping it on the Rosegarden "
+"segment canvas? (Make sure you drop it on an audio track!)<br><br>You can "
+"also drop audio files from Rosegarden's audio file manager window onto the "
+"segment canvas, and from other programs onto the audio file manager.</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:317
+msgid ""
+" \t \n"
+"<p>...that you can set the tempo to match the duration of an audio segment "
+"if you know it's an exact number of bars or beats long?<br><br>Just select "
+"the audio segment and use <b>Composition -> Tempo and Time Signature -> Set "
+"Tempo to Audio Segment Duration</b>.</p>\n"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:1
+msgid "Feta Pixmaps"
+msgstr "Feta Bitmap"
+
+#: ../data/fonts/mappings/fonts.cpp:2 ../data/fonts/mappings/fonts.cpp:7
+msgid "GNU Lilypond"
+msgstr "GNU Lilypond"
+
+#: ../data/fonts/mappings/fonts.cpp:3 ../data/fonts/mappings/fonts.cpp:8
+msgid "Copyright (c) 1997--2003 Han-Wen Nienhuys and Jan Nieuwenhuizen"
+msgstr "Copyright (c) 1997--2003 Han-Wen Nienhuys und Jan Nieuwenhuizen"
+
+#: ../data/fonts/mappings/fonts.cpp:4 ../data/fonts/mappings/fonts.cpp:9
+#: ../data/fonts/mappings/fonts.cpp:14 ../data/fonts/mappings/fonts.cpp:19
+#: ../data/fonts/mappings/fonts.cpp:24 ../data/fonts/mappings/fonts.cpp:29
+#: ../data/fonts/mappings/fonts.cpp:34 ../data/fonts/mappings/fonts.cpp:39
+#: ../data/fonts/mappings/fonts.cpp:44 ../data/fonts/mappings/fonts.cpp:49
+#: ../data/fonts/mappings/fonts.cpp:54
+msgid "Chris Cannam"
+msgstr "Chris Cannam"
+
+#: ../data/fonts/mappings/fonts.cpp:5 ../data/fonts/mappings/fonts.cpp:40
+msgid "pixmap"
+msgstr "Bitmap"
+
+#: ../data/fonts/mappings/fonts.cpp:6
+msgid "Feta"
+msgstr "Feta"
+
+#: ../data/fonts/mappings/fonts.cpp:10 ../data/fonts/mappings/fonts.cpp:15
+#: ../data/fonts/mappings/fonts.cpp:20 ../data/fonts/mappings/fonts.cpp:25
+#: ../data/fonts/mappings/fonts.cpp:30 ../data/fonts/mappings/fonts.cpp:35
+#: ../data/fonts/mappings/fonts.cpp:45 ../data/fonts/mappings/fonts.cpp:50
+#: ../data/fonts/mappings/fonts.cpp:55
+msgid "scalable"
+msgstr "skalierbar"
+
+#: ../data/fonts/mappings/fonts.cpp:11
+msgid "Fughetta"
+msgstr "Fughetta"
+
+#: ../data/fonts/mappings/fonts.cpp:12
+#, fuzzy
+msgid ""
+"Created by Blake Hodgetts; freely redistributable. See http://www.efn.org/"
+"~bch/aboutfonts.html"
+msgstr ""
+"Created by Blake Hodgetts; freely redistributable. See http://www.efh.org/"
+"~bch/aboutfonts.html"
+
+#: ../data/fonts/mappings/fonts.cpp:13
+msgid "Copyright 1995-1999 Blake Hodgetts"
+msgstr "Copyright 1995-1999 Blake Hodgetts"
+
+#: ../data/fonts/mappings/fonts.cpp:16
+msgid "Inkpen"
+msgstr "Inkpen"
+
+#: ../data/fonts/mappings/fonts.cpp:17
+msgid "Inkpen is part of Sibelius, but other fonts may use the same mappings."
+msgstr ""
+"Inkpen gehört zu Sibelius, aber andere Schriftarten verwenden möglicherweise "
+"das gleiche Mapping."
+
+#: ../data/fonts/mappings/fonts.cpp:18 ../data/fonts/mappings/fonts.cpp:28
+msgid "Copyright Sibelius Software Ltd"
+msgstr "Copyright Sibelius Software Ltd"
+
+#: ../data/fonts/mappings/fonts.cpp:21
+msgid "Maestro"
+msgstr "Maestro"
+
+#: ../data/fonts/mappings/fonts.cpp:22
+msgid "Maestro is part of Finale, but other fonts use the same mappings."
+msgstr ""
+"Maestro gehört zu Finale, aber andere Schriftarten verwenden möglicherweise "
+"das gleiche Mapping."
+
+#: ../data/fonts/mappings/fonts.cpp:23 ../data/fonts/mappings/fonts.cpp:33
+msgid "Copyright Coda Inc"
+msgstr "Copyright Coda Inc"
+
+#: ../data/fonts/mappings/fonts.cpp:27
+msgid "Opus is part of Sibelius, but other fonts may use the same mappings."
+msgstr ""
+"Opus gehört zu Sibelius, aber andere Schriftarten verwenden möglicherweise "
+"das gleiche Mapping."
+
+#: ../data/fonts/mappings/fonts.cpp:31
+msgid "Petrucci"
+msgstr "Petrucci"
+
+#: ../data/fonts/mappings/fonts.cpp:32
+msgid "Petrucci is part of Finale, but other fonts use the same mappings."
+msgstr ""
+"Petrucci gehört zu Finale, aber andere Schriftarten verwenden möglicherweise "
+"das gleiche Mapping."
+
+#: ../data/fonts/mappings/fonts.cpp:36
+msgid "RG21"
+msgstr "RG21"
+
+#: ../data/fonts/mappings/fonts.cpp:37
+msgid "Rosegarden 2.1"
+msgstr "Rosegarden 2.1"
+
+#: ../data/fonts/mappings/fonts.cpp:38
+msgid "Copyright (c) 1994--2001 Chris Cannam"
+msgstr "Copyright (c) 1994--2001 Chris Cannam"
+
+#: ../data/fonts/mappings/fonts.cpp:41
+msgid "Sonata"
+msgstr "Sonata"
+
+#: ../data/fonts/mappings/fonts.cpp:42
+msgid "Adobe"
+msgstr "Adobe"
+
+#: ../data/fonts/mappings/fonts.cpp:43
+msgid "Copyright Adobe Inc"
+msgstr "Copyright Adobe Inc"
+
+#: ../data/fonts/mappings/fonts.cpp:46
+msgid "Steinberg"
+msgstr "Steinberg"
+
+#: ../data/fonts/mappings/fonts.cpp:47
+msgid "The Steinberg Notation font is part of Cubase."
+msgstr "Die Schriftart Steinberg Notation ist Teil von Cubase."
+
+#: ../data/fonts/mappings/fonts.cpp:48
+msgid "Copyright Steinberg Inc"
+msgstr "Copyright Steinberg Inc"
+
+#: ../data/fonts/mappings/fonts.cpp:51
+msgid "Xinfonia"
+msgstr "Xinfonia"
+
+#: ../data/fonts/mappings/fonts.cpp:52
+msgid "xemo.org"
+msgstr "xemo.org"
+
+#: ../data/fonts/mappings/fonts.cpp:53
+msgid "Copyright 2001-2003 Xemus Software LLC"
+msgstr "Copyright 2001-2003 Xemus Software LLC"
+
+#: ../data/styles/styles.cpp:1
+msgid "Classical"
+msgstr "Klassisch"
+
+#: ../data/styles/styles.cpp:2
+msgid "Cross"
+msgstr "Kreuz"
+
+#: ../data/styles/styles.cpp:3
+msgid "Mensural"
+msgstr "Mensurisch"
+
+#: ../data/styles/styles.cpp:4
+msgid "Triangle"
+msgstr "Dreieck"
+
+#, fuzzy
+#~ msgid "Set Quick Marker"
+#~ msgstr "Marker löschen"
+
+#~ msgid ""
+#~ "Finnish translation\n"
+#~ "LilyPond export fixes/improvements"
+#~ msgstr ""
+#~ "Finnische Übersetzung\n"
+#~ "\n"
+#~ "LilyPond Export Fehlerbeseitigung/Verbesserungen"
+
+#, fuzzy
+#~ msgid "LilyPond previews not available"
+#~ msgstr "LilyPond-Vorschau Einstellungen"
+
+#, fuzzy
+#~ msgid "Audio file importer not available"
+#~ msgstr "Schreib-Buffer für Audiodateien"
+
+#~ msgid " Triplet Chord"
+#~ msgstr " Triolen-Akkord"
+
+#~ msgid " Chord"
+#~ msgstr " Akkord"
+
+#~ msgid " Triplet"
+#~ msgstr " Triole"
+
+#~ msgid "Making grace notes..."
+#~ msgstr "Verzierungen..."
+
+#~ msgid "Making non-grace notes..."
+#~ msgstr "Noten ohne Verzierungen..."
+
+#~ msgid "Marker name "
+#~ msgstr "Marker Name"
+
+#~ msgid "Time Signature font"
+#~ msgstr "Schriftart für Taktart"
+
+#~ msgid "&Halve Speed"
+#~ msgstr "&Halbes Tempo"
+
+#~ msgid "&Double Speed"
+#~ msgstr "&Doppeltes Tempo"
+
+#~ msgid "Halving speed..."
+#~ msgstr "Halbiere Tempo..."
+
+#~ msgid "Doubling speed..."
+#~ msgstr "Verdoppele Tempo..."
+
+#~ msgid "Add staff group bracket"
+#~ msgstr "Füge Systemgruppierungsklammer hinzu"
+
+#~ msgid "Make subsequent bar lines hidden"
+#~ msgstr "Verstecke alle folgenden Taktstriche"
+
+#~ msgid "Make &Grace Notes"
+#~ msgstr "&Verzierungen einfügen"
+
+#~ msgid "Change Te&mpo..."
+#~ msgstr "Te&mpo ändern..."
+
+#~ msgid "Insert Fretboard"
+#~ msgstr "Griffbrett einfügen"
+
+#~ msgid "&Restore Computed Accidentals"
+#~ msgstr "Stelle berechnete Vorzeichen wieder her"
+
+#~ msgid "LilyPond export/preview options"
+#~ msgstr "Optionen für LilyPond Export/Vorschau"
+
+#~ msgid "LilyPond 2.6"
+#~ msgstr "LilyPond 2.6"
+
+#~ msgid "LilyPond 2.8"
+#~ msgstr "LilyPond 2.8"
+
+#, fuzzy
+#~ msgid "LilyPond 2.12"
+#~ msgstr "LilyPond 2.2"
+
+#~ msgid "Export Document Properties as \\header block"
+#~ msgstr "Dokumenteigenschaften als \\Header-Block exportieren"
+
+#, fuzzy
+#~ msgid "prime"
+#~ msgstr "Zeit"
+
+#, fuzzy
+#~ msgid " and 1 octave"
+#~ msgstr "Oktave höher"
+
+#, fuzzy
+#~ msgid " and %1 octaves"
+#~ msgstr "%1 Oktave höher"
+
+#, fuzzy
+#~ msgid "Transpose by Interval"
+#~ msgstr "Transponieren"
+
+#~ msgid "Manage Files Associated with A&udio Segments"
+#~ msgstr "Verwalte mit A&udio Segmenten verbundene Dateien"
+
+#~ msgid "&Add Multiple Tracks..."
+#~ msgstr "Spuren &hinzufügen..."
+
+#~ msgid "Split Segments at Time"
+#~ msgstr "Segmente am Zeitpunkt teilen"
+
+#~ msgid "Split Segment at Time"
+#~ msgstr "Segment am Zeitpunkt teilen"
+
+#~ msgid "Add Multiple Tracks"
+#~ msgstr "Mehrere Spuren hinzufügen"
+
+#~ msgid ""
+#~ "1.2.3 splash screen photo (of Michael's rose garden)\n"
+#~ "new splash screen photo (of Michael McIntyre's\n"
+#~ "instruments along with a rose from the garden of Hassell Arnold Hale, "
+#~ "1916-2006,\n"
+#~ "may he rest in peace)"
+#~ msgstr ""
+#~ "1.2.3 Splash Photo (von Michael's Rosengarten)\n"
+#~ "Neues Splash Photo (von Michael McIntyre's\n"
+#~ "Instruments zusammen mit einer Rose aus dem Garten von Hassell Arnold "
+#~ "Hale, 1916-2006,\n"
+#~ "möge er in Frieden ruhen)"
+
+#~ msgid "Event List"
+#~ msgstr "Eventliste"
+
+#~ msgid "External Editors"
+#~ msgstr "Externe Editoren"
+
+#~ msgid "Enable auto-save"
+#~ msgstr "Automatisches Speichern aktivieren"
+
+#~ msgid "Auto-save"
+#~ msgstr "Automatisches Speichern"
+
+#~ msgid "Show detailed status"
+#~ msgstr "Statusdetails zeigen"
+
+#~ msgid "JACK command (including path as necessary)"
+#~ msgstr "JACK Aufruf (inklusive Pfad, soweit notwendig)"
+
+#~ msgid ""
+#~ "Longer buffers usually improve playback quality, but use more memory and "
+#~ "slow response."
+#~ msgstr ""
+#~ "Größere Buffer verbessern für gewöhnlich die Wiedergabequalität, "
+#~ "benötigen aber mehr Hauptspeicher und verlängern die Reaktionszeit."
+
+#~ msgid "Event read-ahead"
+#~ msgstr "Event Vorauslesen"
+
+#~ msgid "Audio mix buffer"
+#~ msgstr "Audio-Mixbuffer"
+
+#~ msgid "Audio file read buffer"
+#~ msgstr "Lese-Buffer für Audiodateien"
+
+#~ msgid "Audio file write buffer"
+#~ msgstr "Schreib-Buffer für Audiodateien"
+
+#~ msgid "Per-file limit for cacheable audio files"
+#~ msgstr "Limit je Datei für cacheable Audio Dateien"
+
+#~ msgid "20 msec"
+#~ msgstr "20 msec"
+
+#~ msgid "5 sec"
+#~ msgstr "5 sec"
+
+#~ msgid "per file"
+#~ msgstr "je Datei"
+
+#~ msgid "32KB"
+#~ msgstr "32KB"
+
+#~ msgid "32MB"
+#~ msgstr "32MB"
+
+#~ msgid "Audio mix and monitor mode:"
+#~ msgstr "Audio Mix und Monitor Modus:"
+
+#~ msgid "Low latency"
+#~ msgstr "Geringe Latenz"
+
+#~ msgid "Buffered"
+#~ msgstr "Gepuffert"
+
+#~ msgid "Create post-fader outputs for audio instruments"
+#~ msgstr "Erzeuge Post-Fader Ausgänge für Audio Instrumente"
+
+#~ msgid "Create post-fader outputs for submasters"
+#~ msgstr "Erzeuge Post-Fader Ausgänge für Gruppen"
+
+#~ msgid "Record and Mix"
+#~ msgstr "Aufnahme und Mix"
+
+#~ msgid "JACK transport mode"
+#~ msgstr "JACK Transportmodus"
+
+#~ msgid "Sync"
+#~ msgstr "Sync"
+
+#~ msgid "Synchronisation"
+#~ msgstr "Synchronisation"
+
+#~ msgid "%1 msec / %2 KB %3"
+#~ msgstr "%1 msec / %2 KB %3"
+
+#~ msgid "%1 msec / %2 MB %3"
+#~ msgstr "%1 msec / %2 MB %3"
+
+#~ msgid "%1 sec / %2 KB %3"
+#~ msgstr "%1 sec / %2 KB %3"
+
+#~ msgid "%1 sec / %2 MB %3"
+#~ msgstr "%1 sec / %2 MB %3"
+
+#~ msgid "%1 msec"
+#~ msgstr "%1 msec"
+
+#~ msgid "%1 sec"
+#~ msgstr "%1 sec"
+
+#~ msgid "%1 KB"
+#~ msgstr "%1 KB"
+
+#~ msgid "%1 MB"
+#~ msgstr "%1 MB"
+
+#~ msgid "Other fonts"
+#~ msgstr "Andere Schriftarten"
+
+#~ msgid "Rescan available fonts"
+#~ msgstr "Verfügbare Schriftarten neu einlesen"
+
+#~ msgid ""
+#~ "Rosegarden can apply automatic quantization to recorded or imported MIDI "
+#~ "data for notation purposes only. This does not affect playback, and does "
+#~ "not affect editing in any of the views except notation."
+#~ msgstr ""
+#~ "Rosegarden kann automatische Quantisierung auf aufgenommene oder "
+#~ "importierte MIDI-Daten nur zum Zweck der Notation anwenden. Dies "
+#~ "beinflußt weder die Wiedergabe noch das Ändern in einer der Sichten "
+#~ "ausser bei Notation."
+
+#~ msgid "Sequencer"
+#~ msgstr "Sequencer"
+
+#~ msgid "Sequencer Settings"
+#~ msgstr "Sequencer-Einstellungen"
+
+#~ msgid "Audio auto-fade"
+#~ msgstr "Automatische Audio-Überblendung"
+
+#~ msgid "Fade in"
+#~ msgstr "Einblenden"
+
+#~ msgid "Fade out"
+#~ msgstr "Ausblenden"
+
+#~ msgid "Range"
+#~ msgstr "Bereich"
+
+#~ msgid ""
+#~ "_: used internally for spacing\n"
+#~ "High: ----"
+#~ msgstr ""
+#~ "_: intern als Zwischenraum verwendet\n"
+#~ "Hoch: ----"
+
+#~ msgid "High: ---"
+#~ msgstr "Hoch: ---"
+
+#~ msgid "Low: ----"
+#~ msgstr "Tief: ----"
+
+#~ msgid " ms"
+#~ msgstr " ms"
+
+#~ msgid "&Fretboard"
+#~ msgstr "&Griffbrett"
+
+#~ msgid "Restore &Computed Positions"
+#~ msgstr "Berechnete Positionen wiederherstellen"
+
+#~ msgid ""
+#~ "You encountered an enharmonic resolution bug somewhere during this "
+#~ "operation. You may wish to save a copy of your current composition and "
+#~ "email it to [email protected] for analysis.\n"
+#~ "\n"
+#~ "In the meantime, you will probably need to make manual adjustments to the "
+#~ "file you've just exported."
+#~ msgstr ""
+#~ "Während der letzten Operation trat ein \"enharmonic resolution\" Fehler "
+#~ "auf. Bitte speichern Sie eine Kopie des aktuellen Zustands Ihrer "
+#~ "Komposition und senden es per Email an [email protected] "
+#~ "zur weiteren Analyse.\n"
+#~ "\n"
+#~ "In der Zwischenzeit werden Sie wohl nicht umhinkommen, händische "
+#~ "Anpassungen an der Datei, die Sie gerade exportiert haben, vorzunehmen."
+
+#~ msgid "&Tempo and Time Signature"
+#~ msgstr "&Tempo und Taktart"
+
+#~ msgid "&Split..."
+#~ msgstr "Auf&teilen..."
+
+#~ msgid "&Editor Tools"
+#~ msgstr "Editor-Werkzeugleiste"
+
+#~ msgid "&Beams"
+#~ msgstr "&Balken"
+
+#~ msgid "&Indications"
+#~ msgstr "Bezeichnungen"
+
+#~ msgid "Trip&lets and Tuplets"
+#~ msgstr "Trio&len und n-Tolen"
+
+#~ msgid "S&tem Direction"
+#~ msgstr "Richtung des &Halses"
+
+#~ msgid "&Clear"
+#~ msgstr "Lös&chen"
+
+#~ msgid "A&dd Alias"
+#~ msgstr "Alias hinzufügen"
+
+#~ msgid "C&ancel"
+#~ msgstr "&Abbrechen"
+
+#~ msgid "&Ok"
+#~ msgstr "&Ok"
+
+#~ msgid "Toggle &Mode"
+#~ msgstr "&Modus wechseln"
+
+#~ msgid "Scale"
+#~ msgstr "Skala"
+
+#~ msgid "Modifier"
+#~ msgstr "Modifizierer"
+
+#~ msgid "Suffix"
+#~ msgstr "Endung"
+
+#~ msgid "&New"
+#~ msgstr "&Neu"
+
+#~ msgid "Additivies"
+#~ msgstr "Zusätze"
+
+#~ msgid "Fingering"
+#~ msgstr "Fingersatz"
+
+#~ msgid ""
+#~ "<p>When exporting to LilyPond, you will see extra empty bars if the "
+#~ "Rosegarden\n"
+#~ "composition is longer than the notation it contains. To cure this, "
+#~ "navigate\n"
+#~ "to <b>Composition -> Change Composition Start and End...</b> then set "
+#~ "<b>End\n"
+#~ "Bar</b> to the end of your notation.</p>\n"
+#~ msgstr ""
+#~ "<p>Beim Export nach LilyPond kann es vorkommen, dass Sie zusätzliche\n"
+#~ "leere Takte sehen, nämlich genau dann, wenn die Rosegarden Komposition\n"
+#~ "länger ist, als tatsächliche Notation vorhanden ist.\n"
+#~ "Um das zu bereinigen gehen Sie zu <b>Komposition -> Komposition Anfang "
+#~ "und Ende anpassen...</b>\n"
+#~ "und dann setzen Sie <b>Schlusstakt</b> auf das Notationsende.</p>\n"
+
+#~ msgid ""
+#~ "<p>You can use the mouse wheel to scroll up and down, or to scroll left "
+#~ "and right (by holding the Alt key at the same time), or to zoom in and "
+#~ "out (by holding the Control key).</p>\n"
+#~ msgstr ""
+#~ "<p>Mit dem Mausrad können hoch und runter scrollen, links und\n"
+#~ "rechts (wenn Sie gleichzeitig die ALT-Taste drücken), oder hinein bzw.\n"
+#~ "heraus Zoomen (gleichzeitig die STRG/CTRL-Taste drücken).</p>\n"
+
+#~ msgid "LilyPond 2.4"
+#~ msgstr "LilyPond 2.4"
+
+#~ msgid "Paper size to use in \\paper block"
+#~ msgstr "Zu benutzende Papiergrösse im \\paper-Block"
+
+#~ msgid "LilyPond font size"
+#~ msgstr "Fontgröße für LilyPond"
+
+#~ msgid "Do not export muted tracks"
+#~ msgstr "Stummgeschaltete Spuren nicht exportieren"
+
+#~ msgid "Write bar checks at end of measures"
+#~ msgstr "\"Bar Checks\" am Ende des Takts schreiben"
+
+#~ msgid "Half Speed"
+#~ msgstr "Halbes Tempo"
+
+#~ msgid "Double Speed"
+#~ msgstr "Doppeltes Tempo"
+
+#~ msgid " (takes effect only from next restart)"
+#~ msgstr " (wird erst nach dem nächsten Programmstart wirksam)"
+
+#~ msgid "&Select"
+#~ msgstr "&Auswählen"
+
+#~ msgid "Snap to 1/64"
+#~ msgstr "Auf 64tel einrasten"
+
+#~ msgid "Snap to 1/48"
+#~ msgstr "Auf Achtel einrasten"
+
+#~ msgid "Snap to 1/32"
+#~ msgstr "Auf 32tel einrasten"
+
+#~ msgid "Snap to 1/24"
+#~ msgstr "Auf Viertel einrasten"
+
+#~ msgid "Snap to 1/16"
+#~ msgstr "Auf 16tel einrasten"
+
+#~ msgid "Snap to 1/12"
+#~ msgstr "Auf Halbe einrasten"
+
+#~ msgid "Snap to 1/8"
+#~ msgstr "Auf Achtel einrasten"
+
+#~ msgid "Snap to 1/6"
+#~ msgstr "Auf Sechstel einrasten"
+
+#~ msgid "Snap to 1/4"
+#~ msgstr "Auf Viertel einrasten"
+
+#~ msgid "Snap to &Unit"
+#~ msgstr "Auf &Einheit einrasten"
+
+#~ msgid "%1 (%2.%3s)"
+#~ msgstr "%1 (%2.%3s)"
+
+#~ msgid "%1 (%2): %3"
+#~ msgstr "%1 (%2): %3"
+
+#~ msgid "Add Fretboard"
+#~ msgstr "Griffbrett hinzufügen"
+
+#~ msgid "Getting sound driver status..."
+#~ msgstr "Status des Soundtreibers wird geholt..."
+
+#~ msgid "Distribute Audio on &MIDI"
+#~ msgstr "Audio auf &MIDI verteilen"
+
+#~ msgid "Cannot add file %1: %2"
+#~ msgstr "Kann Datei %1 nicht hinzufügen: %2"
+
+#~ msgid "Enable"
+#~ msgstr "Aktivieren"
+
+#~ msgid "from:"
+#~ msgstr "Von:"
+
+#~ msgid "to:"
+#~ msgstr "Bis:"
+
+#~ msgid "unlimited"
+#~ msgstr "unbegrenzt"
+
+#~ msgid "Number:"
+#~ msgstr "Nummer"
+
+#~ msgid "Value:"
+#~ msgstr "Wert:"
+
+#~ msgid "Wheel Events"
+#~ msgstr "Modulationsrad Events"
+
+#~ msgid "Amount:"
+#~ msgstr "Betrag:"
+
+#~ msgid "Pitch from"
+#~ msgstr "Tonhöhe von"
+
+#~ msgid "Pitch to"
+#~ msgstr "Tonhöhe bin"
+
+#~ msgid "High: %1"
+#~ msgstr "Hoch: %1"
+
+#~ msgid "[+]"
+#~ msgstr "[+]"
+
+#~ msgid "&Velocity"
+#~ msgstr "Anschlagstärke"
diff --git a/po/en.po b/po/en.po
new file mode 100644
index 0000000..8c5523a
--- /dev/null
+++ b/po/en.po
@@ -0,0 +1,10792 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: en\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-04-24 18:19-0400\n"
+"PO-Revision-Date: 2003-04-26 11:55+0200\n"
+"Last-Translator: Richard Bown <[email protected]>\n"
+"Language-Team: none>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ../src/gui/dialogs/RescaleDialog.cpp:51 rc.cpp:192 rc.cpp:312
+#, no-c-format
+msgid "Rescale"
+msgstr ""
+
+#: ../src/gui/dialogs/RescaleDialog.cpp:56
+msgid "Duration of selection"
+msgstr ""
+
+#: ../src/gui/dialogs/RescaleDialog.cpp:62
+msgid "Adjust times of following events accordingly"
+msgstr ""
+
+#: ../src/gui/dialogs/PitchDialog.cpp:45
+#: ../src/gui/dialogs/RescaleDialog.cpp:72
+#: ../src/gui/dialogs/TimeDialog.cpp:51 ../src/gui/dialogs/TimeDialog.cpp:68
+#: ../src/gui/studio/BankEditorDialog.cpp:109
+msgid "Reset"
+msgstr ""
+
+#: ../src/commands/segment/SegmentSplitByPitchCommand.cpp:46
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:46
+msgid "Split by Pitch"
+msgstr ""
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:54
+msgid "Starting split pitch"
+msgstr ""
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:57
+msgid "Range up and down to follow music"
+msgstr ""
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:63
+msgid "Duplicate non-note events"
+msgstr ""
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:66
+msgid "Clef handling:"
+msgstr ""
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:69
+msgid "Leave clefs alone"
+msgstr ""
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:70
+msgid "Guess new clefs"
+msgstr ""
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:71
+msgid "Use treble and bass clefs"
+msgstr ""
+
+#: ../src/gui/dialogs/DocumentConfigureDialog.cpp:64
+msgid "Document Properties"
+msgstr ""
+
+#: ../src/gui/dialogs/MakeOrnamentDialog.cpp:45
+#: ../src/gui/editors/notation/NotationView.cpp:6048
+msgid "Make Ornament"
+msgstr ""
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:183
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:179
+#: ../src/gui/dialogs/EventEditDialog.cpp:128
+#: ../src/gui/dialogs/MakeOrnamentDialog.cpp:49
+#: ../src/gui/studio/DeviceEditorDialog.cpp:74
+#: ../src/gui/studio/NameSetEditor.cpp:72
+#: ../src/gui/widgets/ColourTable.cpp:51
+msgid "Name"
+msgstr ""
+
+#: ../src/gui/dialogs/MakeOrnamentDialog.cpp:51
+msgid ""
+"The name is used to identify both the ornament\n"
+"and the triggered segment that stores\n"
+"the ornament's notes."
+msgstr ""
+
+#: ../src/gui/dialogs/MakeOrnamentDialog.cpp:54
+msgid "Name: "
+msgstr ""
+
+#: ../src/gui/dialogs/MakeOrnamentDialog.cpp:57
+#: ../src/gui/editors/eventlist/EventView.cpp:717
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:92
+msgid "Base pitch"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:57
+#: ../src/gui/editors/eventlist/EventView.cpp:140
+msgid "Text"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:66
+msgid "Specification"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:68
+msgid "Preview"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:72
+msgid "Text: "
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:79
+msgid "Style: "
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:90
+msgid "Dynamic"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:93
+msgid "Direction"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:96
+msgid "Local Direction"
+msgstr ""
+
+#: ../src/gui/dialogs/TempoDialog.cpp:63
+#: ../src/gui/dialogs/TextEventDialog.cpp:99
+#: ../src/gui/editors/tempo/TempoView.cpp:91
+msgid "Tempo"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:102
+msgid "Local Tempo"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:105
+msgid "Lyric"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:108
+#: ../src/gui/editors/notation/NotationView.cpp:4242
+msgid "Chord"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:111
+msgid "Annotation"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:114
+msgid "LilyPond Directive"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:138
+msgid "Verse: "
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:148
+msgid "Dynamic: "
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:152
+msgid "ppp"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:153
+msgid "pp"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:154
+msgid "p"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:155
+msgid "mp"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:156
+msgid "mf"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:157
+msgid "f"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:158
+msgid "ff"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:159
+msgid "fff"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:160
+msgid "rfz"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:161
+msgid "sf"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:165
+msgid "Direction: "
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:174
+msgid " ,"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:175
+msgid "D.C. al Fine"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:176
+msgid "D.S. al Fine"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:177
+msgid "Fine"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:178
+msgid "D.S. al Coda"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:179
+msgid "to Coda"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:180
+msgid "Coda"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:184
+msgid "Local Direction: "
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:188
+msgid "accel."
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:189
+msgid "ritard."
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:190
+msgid "ralletando"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:191
+msgid "a tempo"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:192
+msgid "legato"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:193
+msgid "simile"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:194
+msgid "pizz."
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:195
+msgid "arco"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:196
+msgid "non vib."
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:197
+msgid "sul pont."
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:198
+#: ../src/gui/dialogs/TextEventDialog.cpp:200
+msgid "sul tasto"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:199
+msgid "con legno"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:201
+msgid "sul G"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:202
+msgid "ordinario"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:203
+msgid "Muta in "
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:204
+msgid "volti subito "
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:205
+msgid "soli"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:206
+msgid "div."
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:210
+msgid "Tempo: "
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:214
+#: ../src/gui/dialogs/TextEventDialog.cpp:238
+msgid "Grave"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:215
+#: ../src/gui/dialogs/TextEventDialog.cpp:239
+msgid "Adagio"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:216
+#: ../src/gui/dialogs/TextEventDialog.cpp:240
+msgid "Largo"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:217
+#: ../src/gui/dialogs/TextEventDialog.cpp:241
+msgid "Lento"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:218
+#: ../src/gui/dialogs/TextEventDialog.cpp:242
+msgid "Andante"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:219
+#: ../src/gui/dialogs/TextEventDialog.cpp:243
+msgid "Moderato"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:220
+#: ../src/gui/dialogs/TextEventDialog.cpp:244
+msgid "Allegretto"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:221
+#: ../src/gui/dialogs/TextEventDialog.cpp:245
+msgid "Allegro"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:222
+#: ../src/gui/dialogs/TextEventDialog.cpp:246
+msgid "Vivace"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:223
+#: ../src/gui/dialogs/TextEventDialog.cpp:247
+msgid "Presto"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:224
+#: ../src/gui/dialogs/TextEventDialog.cpp:248
+msgid "Prestissimo"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:225
+#: ../src/gui/dialogs/TextEventDialog.cpp:249
+msgid "Maestoso"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:226
+#: ../src/gui/dialogs/TextEventDialog.cpp:250
+msgid "Sostenuto"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:227
+#: ../src/gui/dialogs/TextEventDialog.cpp:251
+msgid "Tempo Primo"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:234
+msgid "Local Tempo: "
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:255
+msgid "Directive: "
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:312
+msgid "Example"
+msgstr ""
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:65
+msgid "Event Filter"
+msgstr ""
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:86
+msgid "Note Events"
+msgstr ""
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:90
+msgid "lowest:"
+msgstr ""
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:93
+msgid "highest:"
+msgstr ""
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:96
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:141
+#: ../src/gui/widgets/PitchChooser.cpp:53
+msgid "Pitch:"
+msgstr ""
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:99
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:163
+msgid "Velocity:"
+msgstr ""
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:102
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:129
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:257
+msgid "Duration:"
+msgstr ""
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:107
+#: ../src/gui/dialogs/EventFilterDialog.cpp:114
+#: ../src/gui/dialogs/EventFilterDialog.cpp:121
+msgid "include"
+msgstr ""
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:108
+#: ../src/gui/dialogs/EventFilterDialog.cpp:115
+#: ../src/gui/dialogs/EventFilterDialog.cpp:122
+msgid "exclude"
+msgstr ""
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:136
+#: ../src/gui/dialogs/EventFilterDialog.cpp:155
+#: ../src/gui/editors/eventlist/EventView.cpp:172
+#: ../src/gui/editors/eventlist/EventView.cpp:179
+#: ../src/gui/editors/eventlist/EventView.cpp:186
+msgid "edit"
+msgstr ""
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:141
+#: ../src/gui/dialogs/EventFilterDialog.cpp:157
+msgid "choose a pitch using a staff"
+msgstr ""
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:182
+#: ../src/gui/dialogs/EventFilterDialog.cpp:188
+msgid "longest"
+msgstr ""
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:200
+msgid "Include all"
+msgstr ""
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:203
+msgid "Include entire range of values"
+msgstr ""
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:206
+msgid "Exclude all"
+msgstr ""
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:209
+msgid "Exclude entire range of values"
+msgstr ""
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:233
+#: ../src/gui/dialogs/EventFilterDialog.cpp:234
+msgid "shortest"
+msgstr ""
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:333
+msgid "Lowest pitch"
+msgstr ""
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:343
+msgid "Highest pitch"
+msgstr ""
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:56
+#: ../src/gui/editors/notation/NotationView.cpp:1619
+#: ../src/gui/editors/notation/NotationView.cpp:6088
+msgid "Use Ornament"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:260
+#: ../src/gui/configuration/NotationConfigurationPage.h:64
+#: ../src/gui/configuration/NotationConfigurationPage.h:65
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:63
+msgid "Notation"
+msgstr ""
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:68
+msgid "Display as: "
+msgstr ""
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:84
+msgid "Trill"
+msgstr ""
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:84
+msgid "Trill with line"
+msgstr ""
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:84
+msgid "Trill line only"
+msgstr ""
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:85
+msgid "Turn"
+msgstr ""
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:85
+msgid "Mordent"
+msgstr ""
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:85
+msgid "Inverted mordent"
+msgstr ""
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:86
+msgid "Long mordent"
+msgstr ""
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:86
+msgid "Long inverted mordent"
+msgstr ""
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:94
+msgid "Text mark"
+msgstr ""
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:98
+msgid " Text: "
+msgstr ""
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:104
+msgid "Performance"
+msgstr ""
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:109
+msgid "Perform using triggered segment: "
+msgstr ""
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:75
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:123
+msgid "Perform with timing: "
+msgstr ""
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:81
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:129
+msgid "As stored"
+msgstr ""
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:82
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:130
+msgid "Truncate if longer than note"
+msgstr ""
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:83
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:131
+msgid "End at same time as note"
+msgstr ""
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:84
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:132
+msgid "Stretch or squash segment to note duration"
+msgstr ""
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:86
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:134
+msgid "Adjust pitch to note"
+msgstr ""
+
+#: ../src/gui/dialogs/PitchPickerDialog.cpp:40
+msgid "Pitch Selector"
+msgstr ""
+
+#: ../src/gui/dialogs/BeatsBarsDialog.cpp:44
+msgid "Audio Segment Duration"
+msgstr ""
+
+#: ../src/gui/dialogs/BeatsBarsDialog.cpp:50
+msgid "The selected audio segment contains:"
+msgstr ""
+
+#: ../src/gui/dialogs/BeatsBarsDialog.cpp:59
+msgid "beat(s)"
+msgstr ""
+
+#: ../src/gui/dialogs/BeatsBarsDialog.cpp:60
+msgid "bar(s)"
+msgstr ""
+
+#: ../src/gui/dialogs/TupletDialog.cpp:51
+msgid "Tuplet"
+msgstr ""
+
+#: ../src/gui/dialogs/TupletDialog.cpp:58
+msgid "New timing for tuplet group"
+msgstr ""
+
+#: ../src/gui/dialogs/TupletDialog.cpp:76
+msgid "Play "
+msgstr ""
+
+#: ../src/gui/dialogs/TupletDialog.cpp:98
+msgid "in the time of "
+msgstr ""
+
+#: ../src/gui/dialogs/TupletDialog.cpp:104
+msgid "Timing is already correct: update display only"
+msgstr ""
+
+#: ../src/gui/dialogs/TupletDialog.cpp:114
+msgid "Timing calculations"
+msgstr ""
+
+#: ../src/gui/dialogs/TupletDialog.cpp:120
+msgid "Selected region:"
+msgstr ""
+
+#: ../src/gui/dialogs/TupletDialog.cpp:129
+msgid "Group with current timing:"
+msgstr ""
+
+#: ../src/gui/dialogs/TupletDialog.cpp:135
+msgid "Group with new timing:"
+msgstr ""
+
+#: ../src/gui/dialogs/TupletDialog.cpp:141
+msgid "Gap created by timing change:"
+msgstr ""
+
+#: ../src/gui/dialogs/TupletDialog.cpp:149
+msgid "Unchanged at end of selection:"
+msgstr ""
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:63 rc.cpp:372
+#, no-c-format
+msgid "Metronome"
+msgstr ""
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:77
+msgid "Metronome Instrument"
+msgstr ""
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:82
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:150
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:183
+#: ../src/gui/studio/DeviceEditorDialog.cpp:73
+#: ../src/gui/studio/DeviceManagerDialog.cpp:105
+#: ../src/gui/studio/DeviceManagerDialog.cpp:163
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:66
+msgid "Device"
+msgstr ""
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:101
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:89
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:215
+#: ../src/gui/studio/DeviceEditorDialog.cpp:195
+#: ../src/gui/studio/DeviceEditorDialog.cpp:218
+#: ../src/gui/studio/DeviceEditorDialog.cpp:230
+#: ../src/gui/studio/DeviceManagerDialog.cpp:196
+#: ../src/gui/studio/DeviceManagerDialog.cpp:440
+#: ../src/gui/studio/DeviceManagerDialog.cpp:452
+msgid "No connection"
+msgstr ""
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:112
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:111
+#: ../src/gui/editors/parameters/InstrumentParameterBox.cpp:53
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:1209
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:159
+#: ../src/gui/general/PresetHandlerDialog.cpp:92
+#: ../src/gui/studio/MidiMixerWindow.cpp:204
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:67
+msgid "Instrument"
+msgstr ""
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:118
+msgid "Beats"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:184
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:123
+msgid "Resolution"
+msgstr ""
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:309
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:139
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:205
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:125
+#: ../src/gui/editors/matrix/MatrixView.cpp:2132
+#: ../src/gui/editors/notation/NotationView.cpp:1582
+#: ../src/gui/widgets/QuantizeParameters.cpp:128
+#: ../src/gui/widgets/QuantizeParameters.cpp:301
+msgid "None"
+msgstr ""
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:126
+msgid "Bars only"
+msgstr ""
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:127
+msgid "Bars and beats"
+msgstr ""
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:128
+msgid "Bars, beats, and divisions"
+msgstr ""
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:132
+msgid "Bar velocity"
+msgstr ""
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:139
+msgid "Beat velocity"
+msgstr ""
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:146
+msgid "Sub-beat velocity"
+msgstr ""
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:155
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:324
+msgid "Pitch"
+msgstr ""
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:160
+msgid "for Bar"
+msgstr ""
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:161
+msgid "for Beat"
+msgstr ""
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:162
+msgid "for Sub-beat"
+msgstr ""
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:166
+msgid "Metronome Activated"
+msgstr ""
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:167
+msgid "Playing"
+msgstr ""
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:168
+msgid "Recording"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:46
+msgid "Choose Text Encoding"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:50
+msgid ""
+"\n"
+"This file contains text in an unknown language encoding.\n"
+"\n"
+"Please select one of the following estimated text encodings\n"
+"for use with the text in this file:\n"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:61
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:77
+msgid "Japanese Shift-JIS"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:62
+msgid "Unicode variable-width"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:63
+msgid "Western Europe"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:64
+msgid "Western Europe + Euro"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:65
+msgid "Eastern Europe"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:66
+msgid "Southern Europe"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:67
+msgid "Northern Europe"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:68
+msgid "Cyrillic"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:69
+msgid "Arabic"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:70
+msgid "Greek"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:71
+msgid "Hebrew"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:72
+msgid "Turkish"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:73
+msgid "Nordic"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:74
+msgid "Thai"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:75
+msgid "Baltic"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:76
+msgid "Celtic"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:78
+msgid "Traditional Chinese"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:79
+msgid "Simplified Chinese"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:80
+msgid "Russian"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:81
+msgid "Ukrainian"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:82
+msgid "Tamil"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:117
+#, c-format
+msgid "Microsoft Code Page %1"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:123
+#: ../src/gui/editors/matrix/MatrixView.cpp:1490
+msgid "%1 (%2)"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:142
+msgid ""
+"\n"
+"Example text from file:"
+msgstr ""
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:59
+#: ../src/gui/editors/tempo/TempoView.cpp:92
+msgid "Time Signature"
+msgstr ""
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:82
+msgid "Time signature"
+msgstr ""
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:116
+msgid "Time where signature takes effect"
+msgstr ""
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:83
+#: ../src/gui/dialogs/TempoDialog.cpp:128
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:129
+#: ../src/gui/general/PresetHandlerDialog.cpp:101
+msgid "Scope"
+msgstr ""
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:141
+#, c-format
+msgid "Insertion point is at start of measure %1."
+msgstr ""
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:145
+#, c-format
+msgid "Insertion point is in the middle of measure %1."
+msgstr ""
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:150
+msgid "Insertion point is at start of composition."
+msgstr ""
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:155
+msgid "Start measure %1 here"
+msgstr ""
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:159
+#, c-format
+msgid "Change time from start of measure %1"
+msgstr ""
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:166
+#, c-format
+msgid "Time change will take effect at the start of measure %1."
+msgstr ""
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:176
+msgid "Hide the time signature"
+msgstr ""
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:181
+msgid "Hide the affected bar lines"
+msgstr ""
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:186
+msgid "Show as common time"
+msgstr ""
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:191
+msgid "Correct the durations of following measures"
+msgstr ""
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:280
+msgid "Display as common time"
+msgstr ""
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:284
+msgid "Display as cut common time"
+msgstr ""
+
+#: ../src/gui/dialogs/ConfigureDialog.cpp:66
+msgid "Configure Rosegarden"
+msgstr ""
+
+#: ../src/gui/dialogs/MarkerModifyDialog.cpp:53
+#: ../src/gui/dialogs/MarkerModifyDialog.cpp:61
+msgid "Edit Marker"
+msgstr ""
+
+#: ../src/gui/dialogs/MarkerModifyDialog.cpp:78
+msgid "Marker Time"
+msgstr ""
+
+#: ../src/gui/dialogs/MarkerModifyDialog.cpp:94
+msgid "Marker Properties"
+msgstr ""
+
+#: ../src/gui/dialogs/MarkerModifyDialog.cpp:100
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:554
+msgid "Text:"
+msgstr ""
+
+#: ../src/gui/dialogs/MarkerModifyDialog.cpp:104
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:85
+msgid "Description:"
+msgstr ""
+
+#: ../src/gui/dialogs/FileMergeDialog.cpp:46
+msgid "Merge File"
+msgstr ""
+
+#: ../src/gui/dialogs/FileMergeDialog.cpp:53
+msgid "Merge new file "
+msgstr ""
+
+#: ../src/gui/dialogs/FileMergeDialog.cpp:56
+msgid "At start of existing composition"
+msgstr ""
+
+#: ../src/gui/dialogs/FileMergeDialog.cpp:57
+msgid "From end of existing composition"
+msgstr ""
+
+#: ../src/gui/dialogs/FileMergeDialog.cpp:61
+msgid "The file has different time signatures or tempos."
+msgstr ""
+
+#: ../src/gui/dialogs/FileMergeDialog.cpp:62
+msgid "Import these as well"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:171
+#: ../src/gui/dialogs/ShowSequencerStatusDialog.cpp:44
+msgid "Sequencer status"
+msgstr ""
+
+#: ../src/gui/dialogs/ShowSequencerStatusDialog.cpp:48
+msgid "Sequencer status:"
+msgstr ""
+
+#: ../src/gui/dialogs/ShowSequencerStatusDialog.cpp:50
+msgid "Status not available."
+msgstr ""
+
+#: ../src/gui/dialogs/ShowSequencerStatusDialog.cpp:57
+msgid "Sequencer is not running or is not responding."
+msgstr ""
+
+#: ../src/gui/dialogs/ShowSequencerStatusDialog.cpp:64
+msgid "Sequencer is not returning a valid status report."
+msgstr ""
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:46
+msgid "Add Tracks"
+msgstr ""
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:54
+msgid "How many tracks do you want to add?"
+msgstr ""
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:62
+msgid "Add tracks"
+msgstr ""
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:64
+msgid "At the top"
+msgstr ""
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:65
+msgid "Above the current selected track"
+msgstr ""
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:66
+msgid "Below the current selected track"
+msgstr ""
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:67
+msgid "At the bottom"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:75
+msgid "Event Properties"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:81
+msgid "Event type:"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:117
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:251
+#: ../src/gui/editors/segment/MarkerEditor.cpp:97
+msgid "Absolute time:"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:156
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:323
+msgid "Controller name:"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:157
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:530
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:562
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:563
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:602
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:631
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:267
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:269
+#: ../src/gui/editors/segment/MarkerEditor.cpp:279
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:272
+#: ../src/gui/studio/AudioMixerWindow.cpp:388
+#: ../src/gui/studio/AudioMixerWindow.cpp:519
+#: ../src/gui/studio/AudioMixerWindow.cpp:683
+#: ../src/gui/studio/AudioMixerWindow.cpp:722
+#: ../src/gui/studio/AudioMixerWindow.cpp:904
+#: ../src/gui/studio/SynthPluginManagerDialog.cpp:121
+msgid "<none>"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:174
+msgid "Meta string:"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:179
+msgid "Load data"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:181
+msgid "Save data"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:192
+msgid "Notation Properties"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:198
+msgid "Lock to changes in performed values"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:205
+msgid "Notation time:"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:217
+msgid "Notation duration:"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:283
+msgid "Note pitch:"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:291
+msgid "Note velocity:"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:317
+msgid "Controller number:"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:326
+msgid "Controller value:"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:354
+msgid "Key pitch:"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:362
+msgid "Key pressure:"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:390
+msgid "Channel pressure:"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:418
+msgid "Program change:"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:461
+msgid "Data length:"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:462
+msgid "Data:"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:480
+msgid "Pitchbend MSB:"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:488
+msgid "Pitchbend LSB:"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:523
+msgid "Indication:"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:553
+msgid "Text type:"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:596
+msgid "Clef type:"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:625
+msgid "Key name:"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:674
+msgid "Unsupported event type:"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:931
+msgid "Edit Event Time"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:943
+msgid "Edit Event Notation Time"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:955
+msgid "Edit Duration"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:968
+msgid "Edit Notation Duration"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:981
+msgid "Edit Pitch"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:991
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:1016
+msgid "*.syx|System exclusive files (*.syx)"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:992
+msgid "Load System Exclusive data in File"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:1017
+msgid "Save System Exclusive data to..."
+msgstr ""
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:46
+msgid "Locate audio file"
+msgstr ""
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:50
+msgid "&Skip"
+msgstr ""
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:51
+msgid "Skip &All"
+msgstr ""
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:52
+msgid "&Locate"
+msgstr ""
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:57
+msgid ""
+"Can't find file \"%1\".\n"
+"Would you like to try and locate this file or skip it?"
+msgstr ""
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:71
+msgid ""
+"%1|Requested file (%2)\n"
+"*.wav|WAV files (*.wav)"
+msgstr ""
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:74
+msgid "Select an Audio File"
+msgstr ""
+
+#: ../src/gui/dialogs/ClefDialog.cpp:53 ../src/gui/dialogs/ClefDialog.cpp:62
+#: ../src/gui/dialogs/ClefDialog.cpp:79 ../src/gui/dialogs/ClefDialog.cpp:90
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:278
+msgid "Clef"
+msgstr ""
+
+#: ../src/gui/dialogs/ClefDialog.cpp:65
+msgid "Existing notes following clef change"
+msgstr ""
+
+#: ../src/gui/dialogs/ClefDialog.cpp:71
+msgid "Lower clef"
+msgstr ""
+
+#: ../src/gui/dialogs/ClefDialog.cpp:77
+msgid "Up an Octave"
+msgstr ""
+
+#: ../src/gui/dialogs/ClefDialog.cpp:84
+msgid "Down an Octave"
+msgstr ""
+
+#: ../src/gui/dialogs/ClefDialog.cpp:88
+msgid "Higher clef"
+msgstr ""
+
+#: ../src/gui/dialogs/ClefDialog.cpp:96
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:152
+msgid "Maintain current pitches"
+msgstr ""
+
+#: ../src/gui/dialogs/ClefDialog.cpp:99
+msgid "Transpose into appropriate octave"
+msgstr ""
+
+#: ../src/gui/dialogs/ClefDialog.cpp:231
+msgid "%1 down an octave"
+msgstr ""
+
+#: ../src/gui/dialogs/ClefDialog.cpp:234
+msgid "%1 down two octaves"
+msgstr ""
+
+#: ../src/gui/dialogs/ClefDialog.cpp:237
+msgid "%1 up an octave"
+msgstr ""
+
+#: ../src/gui/dialogs/ClefDialog.cpp:240
+msgid "%1 up two octaves"
+msgstr ""
+
+#: ../src/gui/dialogs/ClefDialog.cpp:249
+msgid "Treble"
+msgstr ""
+
+#: ../src/gui/dialogs/ClefDialog.cpp:251
+msgid "French violin"
+msgstr ""
+
+#: ../src/gui/dialogs/ClefDialog.cpp:253
+msgid "Soprano"
+msgstr ""
+
+#: ../src/gui/dialogs/ClefDialog.cpp:255
+msgid "Mezzo-soprano"
+msgstr ""
+
+#: ../src/gui/dialogs/ClefDialog.cpp:257
+msgid "Alto"
+msgstr ""
+
+#: ../src/gui/dialogs/ClefDialog.cpp:259
+msgid "Tenor"
+msgstr ""
+
+#: ../src/gui/dialogs/ClefDialog.cpp:261
+msgid "C-baritone"
+msgstr ""
+
+#: ../src/gui/dialogs/ClefDialog.cpp:263
+msgid "F-baritone"
+msgstr ""
+
+#: ../src/gui/dialogs/ClefDialog.cpp:265
+msgid "Bass"
+msgstr ""
+
+#: ../src/gui/dialogs/ClefDialog.cpp:267
+msgid "Sub-bass"
+msgstr ""
+
+#: ../src/gui/dialogs/CountdownDialog.cpp:52
+msgid "Recording..."
+msgstr ""
+
+#: ../src/gui/dialogs/CountdownDialog.cpp:60
+msgid "Recording time remaining: "
+msgstr ""
+
+#: ../src/gui/dialogs/CountdownDialog.cpp:120
+msgid "Just how big is your hard disk?"
+msgstr ""
+
+#: ../src/gui/dialogs/CountdownDialog.cpp:154
+msgid "Recording beyond end of composition: "
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:52
+msgid "Specify Interval"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:58
+msgid "Reference note:"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:59
+msgid "Target note:"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:68
+#: ../src/gui/dialogs/IntervalDialog.cpp:315
+msgid "a perfect unison"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:76
+msgid "Effect on Key"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:77
+msgid "Transpose within key"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:79
+msgid "Change key for selection"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:89
+msgid ""
+"Adjust segment transposition in opposite direction (maintain audible pitch)"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:190
+#: ../src/gui/dialogs/IntervalDialog.cpp:220
+msgid "a diminished"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:192
+#: ../src/gui/dialogs/IntervalDialog.cpp:222
+msgid "an augmented"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:194
+#: ../src/gui/dialogs/IntervalDialog.cpp:224
+msgid "a doubly diminished"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:196
+#: ../src/gui/dialogs/IntervalDialog.cpp:226
+msgid "a doubly augmented"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:198
+#: ../src/gui/dialogs/IntervalDialog.cpp:228
+msgid "a triply diminished"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:200
+#: ../src/gui/dialogs/IntervalDialog.cpp:230
+msgid "a triply augmented"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:202
+msgid "a quadruply diminished"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:204
+#: ../src/gui/dialogs/IntervalDialog.cpp:232
+msgid "a quadruply augmented"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:206
+#: ../src/gui/dialogs/IntervalDialog.cpp:234
+msgid "a perfect"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:208
+#: ../src/gui/dialogs/IntervalDialog.cpp:236
+msgid "an (unknown, %1)"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:216
+msgid "a minor"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:218
+msgid "a major"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:239
+msgid "an (unknown)"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:248
+#: ../src/gui/dialogs/IntervalDialog.cpp:251
+msgid "%1 octave"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:254
+msgid "%1 unison"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:258
+msgid "%1 second"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:261
+msgid "%1 third"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:264
+msgid "%1 fourth"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:267
+msgid "%1 fifth"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:270
+msgid "%1 sixth"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:273
+msgid "%1 seventh"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:276
+#: ../src/gui/studio/DeviceManagerDialog.cpp:329
+#: ../src/gui/studio/DeviceManagerDialog.cpp:363
+#, c-format
+msgid "%1"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:287
+msgid ""
+"_n: up 1 octave and %1\n"
+"up %n octaves and %1"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:291
+#, c-format
+msgid ""
+"_n: up 1 octave\n"
+"up %n octaves"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:295
+#, c-format
+msgid "up %1"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:303
+msgid ""
+"_n: down 1 octave and %1\n"
+"down %n octaves and %1"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:307
+#, c-format
+msgid ""
+"_n: down 1 octave\n"
+"down %n octaves"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:311
+#, c-format
+msgid "down %1"
+msgstr ""
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:81
+msgid "Intrinsics"
+msgstr ""
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:85
+msgid "Event type: "
+msgstr ""
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:91
+msgid "Absolute time: "
+msgstr ""
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:101
+msgid "Duration: "
+msgstr ""
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:114
+msgid "Sub-ordering: "
+msgstr ""
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:125
+msgid "Persistent properties"
+msgstr ""
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:169
+#: ../src/gui/dialogs/EventEditDialog.cpp:133
+#: ../src/gui/studio/BankEditorDialog.cpp:129
+#: ../src/gui/studio/DeviceEditorDialog.cpp:75
+msgid "Type"
+msgstr ""
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:184
+#: ../src/gui/dialogs/EventEditDialog.cpp:135
+#: ../src/gui/dialogs/EventParameterDialog.cpp:89
+#: ../src/gui/dialogs/EventParameterDialog.cpp:93
+#: ../src/gui/dialogs/EventParameterDialog.cpp:115
+msgid "Value"
+msgstr ""
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:155
+msgid "Non-persistent properties"
+msgstr ""
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:156
+msgid "These are cached values, lost if the event is modified."
+msgstr ""
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:170
+msgid "Name "
+msgstr ""
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:172
+msgid "Type "
+msgstr ""
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:174
+msgid "Value "
+msgstr ""
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:188
+msgid "Make persistent"
+msgstr ""
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:292
+msgid "Delete this property"
+msgstr ""
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:433
+msgid ""
+"Are you sure you want to delete the \"%1\" property?\n"
+"\n"
+"Removing necessary properties may cause unexpected behavior."
+msgstr ""
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:436
+#: ../src/gui/dialogs/EventEditDialog.cpp:469
+msgid "Edit Event"
+msgstr ""
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:465
+msgid ""
+"Are you sure you want to make the \"%1\" property persistent?\n"
+"\n"
+"This could cause problems if it overrides a different computed value later "
+"on."
+msgstr ""
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:470
+msgid "Make &Persistent"
+msgstr ""
+
+#: ../src/gui/dialogs/PasteNotationDialog.cpp:52
+msgid "Paste type"
+msgstr ""
+
+#: ../src/gui/dialogs/PasteNotationDialog.cpp:72
+msgid "Make this the default paste type"
+msgstr ""
+
+#: ../src/gui/dialogs/LyricEditDialog.cpp:53
+msgid "Edit Lyrics"
+msgstr ""
+
+#: ../src/gui/dialogs/LyricEditDialog.cpp:62
+msgid "Lyrics for this segment"
+msgstr ""
+
+#: ../src/gui/dialogs/LyricEditDialog.cpp:70
+msgid "Add Verse"
+msgstr ""
+
+#: ../src/gui/dialogs/LyricEditDialog.cpp:84
+#: ../src/gui/dialogs/LyricEditDialog.cpp:106
+#, c-format
+msgid "Verse %1"
+msgstr ""
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:59
+msgid "Import from Device..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2163
+#: ../src/gui/application/RosegardenGUIApp.cpp:2229
+#: ../src/gui/application/RosegardenGUIApp.cpp:7780
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:87
+#: ../src/sound/AudioFileManager.cpp:664
+#, c-format
+msgid "Cannot download file %1"
+msgstr ""
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:99
+#, c-format
+msgid "Cannot open file %1"
+msgstr ""
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:106
+#, c-format
+msgid "No devices found in file %1"
+msgstr ""
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:113
+msgid "Source device"
+msgstr ""
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:118
+msgid "Import from: "
+msgstr ""
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:140
+#: ../src/gui/studio/DeviceEditorDialog.cpp:148
+#, c-format
+msgid "Device %1"
+msgstr ""
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:155
+msgid "Import banks"
+msgstr ""
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:156
+msgid "Import key mappings"
+msgstr ""
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:157
+msgid "Import controllers"
+msgstr ""
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:160
+msgid "Import device name"
+msgstr ""
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:166
+msgid "Bank import behavior"
+msgstr ""
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:168
+msgid "Merge banks"
+msgstr ""
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:169
+msgid "Overwrite banks"
+msgstr ""
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:367
+msgid "Bank %1:%2"
+msgstr ""
+
+#: ../src/commands/segment/SegmentSplitByRecordingSrcCommand.cpp:42
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:48
+msgid "Split by Recording Source"
+msgstr ""
+
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:53
+msgid "Recording Source"
+msgstr ""
+
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:57
+msgid "Channel:"
+msgstr ""
+
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:64
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:75
+msgid "any"
+msgstr ""
+
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:69
+msgid "Device:"
+msgstr ""
+
+#: ../src/gui/dialogs/UnusedAudioSelectionDialog.cpp:46
+msgid "Select Unused Audio Files"
+msgstr ""
+
+#: ../src/gui/dialogs/UnusedAudioSelectionDialog.cpp:53
+#: ../src/gui/editors/segment/PlayListView.cpp:36
+msgid "File name"
+msgstr ""
+
+#: ../src/gui/dialogs/UnusedAudioSelectionDialog.cpp:54
+msgid "File size"
+msgstr ""
+
+#: ../src/gui/dialogs/UnusedAudioSelectionDialog.cpp:55
+msgid "Last modified date"
+msgstr ""
+
+#: ../src/gui/dialogs/UnusedAudioSelectionDialog.cpp:60
+msgid " (not found) "
+msgstr ""
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:105
+msgid "Audio File Manager"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:126
+msgid ""
+"* Some audio files are encoded at a sample rate different from that of the "
+"JACK audio server.\n"
+"Rosegarden will play them at the correct speed, but they will sound "
+"terrible.\n"
+"Please consider resampling such files externally, or adjusting the sample "
+"rate of the JACK server."
+msgstr ""
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:132
+msgid "&Add Audio File..."
+msgstr ""
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:135
+msgid "&Unload Audio File"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:140
+msgid "&Play Preview"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:151
+msgid "&Insert into Selected Audio Track"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:155
+msgid "Unload &all Audio Files"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:159
+msgid "Unload all &Unused Audio Files"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:163
+msgid "&Delete Unused Audio Files..."
+msgstr ""
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:167
+msgid "&Export Audio File..."
+msgstr ""
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:173
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:180
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:91
+msgid "Duration"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:181
+msgid "Envelope"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:182
+msgid "Sample rate"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:183
+msgid "Channels"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:282
+msgid "<no audio files>"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:488
+msgid "*.wav|WAV files (*.wav)"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:489
+msgid "Choose a name to save this file as"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:499
+msgid "Exporting audio file..."
+msgstr ""
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:609
+msgid ""
+"This will unload audio file \"%1\" and remove all associated segments. Are "
+"you sure?"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:692
+msgid ""
+"*.wav|WAV files (*.wav)\n"
+"*.*|All files"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:697
+msgid ""
+"*.wav *.flac *.ogg *.mp3|Audio files (*.wav *.flac *.ogg *.mp3)\n"
+"*.wav|WAV files (*.wav)\n"
+"*.flac|FLAC files (*.flac)\n"
+"*.ogg|Ogg files (*.ogg)\n"
+"*.mp3|MP3 files (*.mp3)\n"
+"*.*|All files"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:704
+msgid "Select one or more audio files"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:763
+msgid ""
+"This will unload all audio files and remove their associated segments.\n"
+"This action cannot be undone, and associations with these files will be "
+"lost.\n"
+"Files will not be removed from your disk.\n"
+"Are you sure?"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:800
+msgid ""
+"This will unload all audio files that are not associated with any segments "
+"in this composition.\n"
+"This action cannot be undone, and associations with these files will be "
+"lost.\n"
+"Files will not be removed from your disk.\n"
+"Are you sure?"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:865
+msgid ""
+"The following audio files are not used in the current composition.\n"
+"\n"
+"Please select the ones you wish to delete permanently from the hard disk.\n"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:875
+#, c-format
+msgid ""
+"_n: <qt>About to delete 1 audio file permanently from the hard disk.<br>This "
+"action cannot be undone, and there will be no way to recover this file."
+"<br>Are you sure?</qt>\n"
+"\n"
+"<qt>About to delete %n audio files permanently from the hard disk.<br>This "
+"action cannot be undone, and there will be no way to recover these files."
+"<br>Are you sure?</qt>"
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:525
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:888
+msgid "File %1 could not be deleted."
+msgstr ""
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:921
+msgid "Change Audio File label"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:6466
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:922
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:1099
+msgid "Enter new label"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIView.cpp:1538
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:1086
+msgid "Adding audio file..."
+msgstr ""
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:1107
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:1112
+msgid "Failed to add audio file. "
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:2789
+#: ../src/gui/application/RosegardenGUIApp.cpp:2736
+#: ../src/gui/application/RosegardenGUIView.cpp:1574
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:1122
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:180
+msgid "Generating audio preview..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIView.cpp:1581
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:1130
+msgid ""
+"Try copying this file to a directory where you have write permission and re-"
+"add it"
+msgstr ""
+
+#: ../src/gui/dialogs/TransportDialog.cpp:90 rc.cpp:357
+#, no-c-format
+msgid "Rosegarden Transport"
+msgstr ""
+
+#: ../src/gui/dialogs/TransportDialog.cpp:925
+#: ../src/gui/dialogs/TransportDialog.cpp:985
+msgid "PITCH WHEEL"
+msgstr ""
+
+#: ../src/gui/dialogs/TransportDialog.cpp:929
+#: ../src/gui/dialogs/TransportDialog.cpp:989
+msgid "CONTROLLER"
+msgstr ""
+
+#: ../src/gui/dialogs/TransportDialog.cpp:933
+#: ../src/gui/dialogs/TransportDialog.cpp:993
+msgid "PROG CHNGE"
+msgstr ""
+
+#: ../src/gui/dialogs/TransportDialog.cpp:938
+#: ../src/gui/dialogs/TransportDialog.cpp:998
+msgid "PRESSURE"
+msgstr ""
+
+#: ../src/gui/dialogs/TransportDialog.cpp:942
+#: ../src/gui/dialogs/TransportDialog.cpp:1002
+msgid "SYS MESSAGE"
+msgstr ""
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:177
+#: ../src/gui/dialogs/QuantizeDialog.cpp:40
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:127
+msgid "Quantize"
+msgstr ""
+
+#: ../src/gui/dialogs/QuantizeDialog.cpp:52
+msgid "Advanced"
+msgstr ""
+
+#: ../src/gui/dialogs/ExportDeviceDialog.cpp:42
+msgid "Export Devices..."
+msgstr ""
+
+#: ../src/gui/dialogs/ExportDeviceDialog.cpp:47
+msgid "Export devices"
+msgstr ""
+
+#: ../src/gui/dialogs/ExportDeviceDialog.cpp:49
+msgid "Export all devices"
+msgstr ""
+
+#: ../src/gui/dialogs/ExportDeviceDialog.cpp:50
+msgid "Export selected device only"
+msgstr ""
+
+#: ../src/gui/dialogs/ExportDeviceDialog.cpp:51
+msgid " (\"%1\")"
+msgstr ""
+
+#: ../src/gui/dialogs/CompositionLengthDialog.cpp:44
+msgid "Change Composition Length"
+msgstr ""
+
+#: ../src/gui/dialogs/CompositionLengthDialog.cpp:50
+msgid "Set the Start and End bar markers for this Composition"
+msgstr ""
+
+#: ../src/gui/dialogs/CompositionLengthDialog.cpp:54
+msgid "Start Bar"
+msgstr ""
+
+#: ../src/gui/dialogs/CompositionLengthDialog.cpp:62
+msgid "End Bar"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:62
+msgid "LilyPond Export/Preview"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:85
+msgid "General options"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:90
+msgid "Advanced options"
+msgstr ""
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:112
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:95
+msgid "Headers"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:106
+msgid "Basic options"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:113
+msgid "Compatibility level"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:117
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:118
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:119
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:120
+#, c-format
+msgid "LilyPond %1"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:125
+msgid "Paper size"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:129
+msgid "A3"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:130
+msgid "A4"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:131
+msgid "A5"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:132
+msgid "A6"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:133
+msgid "Legal"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:134
+msgid "US Letter"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:135
+msgid "Tabloid"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:136
+msgid "do not specify"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:152
+msgid "Font size"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:157
+msgid "%1 pt"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:169
+msgid "Staff level options"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:176
+msgid "Export content"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:179
+msgid "All tracks"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:180
+msgid "Non-muted tracks"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:181
+msgid "Selected track"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:182
+msgid "Selected segments"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:188
+msgid "Merge tracks that have the same name"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:198
+msgid "Notation options"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:206
+msgid "First"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:207
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:538
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:557
+msgid "All"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:211
+msgid "Export tempo marks "
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:215
+msgid "Export lyrics"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:225
+msgid "Export beamings"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:232
+msgid "Export track staff brackets"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:244
+msgid "Layout options"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:257
+msgid "Lyrics alignment"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:261
+msgid "Ragged bottom (systems will not be spread vertically across the page)"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:267
+msgid "Miscellaneous options"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:274
+msgid "Enable \"point and click\" debugging"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:279
+msgid "Export \\midi block"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:284
+msgid "No markers"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:285
+msgid "Rehearsal marks"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:286
+msgid "Marker text"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:290
+msgid "Export markers"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioSplitDialog.cpp:57
+msgid "Autosplit Audio Segment"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioSplitDialog.cpp:70
+msgid "AutoSplit Segment \""
+msgstr ""
+
+#: ../src/gui/dialogs/AudioSplitDialog.cpp:84
+msgid "Threshold"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioSplitDialog.cpp:142
+msgid "<no preview generated for this audio file>"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:70
+msgid "Audio Plugin"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:94
+#: ../src/gui/widgets/AudioFaderBox.cpp:136
+msgid "Editor"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:100
+msgid "Plugin"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:105
+msgid "Category:"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:110
+msgid "Plugin:"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:114
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:398
+msgid "Select a plugin from this list."
+msgstr ""
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:119
+msgid "Bypass"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:121
+msgid "Bypass this plugin."
+msgstr ""
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:127
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:390
+msgid "<ports>"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:130
+msgid "Input and output port counts."
+msgstr ""
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:132
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:391
+msgid "<id>"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:135
+msgid "Unique ID of plugin."
+msgstr ""
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:149
+msgid "Copy plugin parameters"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:155
+msgid "Paste plugin parameters"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:161
+msgid "Set to defaults"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:225
+msgid "(any)"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:226
+msgid "(unclassified)"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:247
+msgid "(none)"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:389
+#: ../src/gui/editors/parameters/AudioInstrumentParameterPanel.cpp:132
+#: ../src/gui/editors/parameters/AudioInstrumentParameterPanel.cpp:361
+#: ../src/gui/studio/AudioMixerWindow.cpp:685
+#: ../src/gui/studio/AudioMixerWindow.cpp:724
+#: ../src/gui/studio/AudioMixerWindow.cpp:906
+#: ../src/gui/widgets/AudioFaderBox.cpp:79
+msgid "<no plugin>"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:427
+msgid "This plugin has too many controls to edit here."
+msgstr ""
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:438
+#, c-format
+msgid "Id: %1"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:490
+msgid "mono"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:492
+msgid "stereo"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:494
+msgid "%1 in, %2 out"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:518
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:704
+msgid "Program: "
+msgstr ""
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:522
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:532
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:708
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:716
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:745
+msgid "<none selected>"
+msgstr ""
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:56
+msgid "Set the %1 property of the event selection:"
+msgstr ""
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:61
+msgid "Pattern"
+msgstr ""
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:66
+msgid "Flat - set %1 to value"
+msgstr ""
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:70
+msgid "Alternating - set %1 to max and min on alternate events"
+msgstr ""
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:74
+msgid "Crescendo - set %1 rising from min to max"
+msgstr ""
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:78
+msgid "Diminuendo - set %1 falling from max to min"
+msgstr ""
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:82
+msgid "Ringing - set %1 alternating from max to min with both dying to zero"
+msgstr ""
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:123
+#: ../src/gui/dialogs/EventParameterDialog.cpp:150
+msgid "First Value"
+msgstr ""
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:124
+#: ../src/gui/dialogs/EventParameterDialog.cpp:151
+msgid "Second Value"
+msgstr ""
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:132
+#: ../src/gui/dialogs/EventParameterDialog.cpp:142
+msgid "Low Value"
+msgstr ""
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:133
+#: ../src/gui/dialogs/EventParameterDialog.cpp:141
+msgid "High Value"
+msgstr ""
+
+#: ../src/gui/dialogs/TempoDialog.cpp:56 ../src/gui/rulers/TempoRuler.cpp:127
+msgid "Insert Tempo Change"
+msgstr ""
+
+#: ../src/gui/dialogs/TempoDialog.cpp:69
+msgid "New tempo:"
+msgstr ""
+
+#: ../src/gui/dialogs/TempoDialog.cpp:76
+msgid "Tap"
+msgstr ""
+
+#: ../src/gui/dialogs/TempoDialog.cpp:81
+msgid "Tempo is fixed until the following tempo change"
+msgstr ""
+
+#: ../src/gui/dialogs/TempoDialog.cpp:82
+msgid "Tempo ramps to the following tempo"
+msgstr ""
+
+#: ../src/gui/dialogs/TempoDialog.cpp:83
+msgid "Tempo ramps to:"
+msgstr ""
+
+#: ../src/gui/dialogs/TempoDialog.cpp:120
+msgid "Time of tempo change"
+msgstr ""
+
+#: ../src/gui/dialogs/TempoDialog.cpp:138
+msgid "The pointer is currently at "
+msgstr ""
+
+#: ../src/gui/dialogs/TempoDialog.cpp:154
+msgid "Apply this tempo from here onwards"
+msgstr ""
+
+#: ../src/gui/dialogs/TempoDialog.cpp:158
+msgid "Replace the last tempo change"
+msgstr ""
+
+#: ../src/gui/dialogs/TempoDialog.cpp:164
+msgid "Apply this tempo from the start of this bar"
+msgstr ""
+
+#: ../src/gui/dialogs/TempoDialog.cpp:167
+msgid "Apply this tempo to the whole composition"
+msgstr ""
+
+#: ../src/gui/dialogs/TempoDialog.cpp:172
+msgid "Also make this the default tempo"
+msgstr ""
+
+#: ../src/gui/dialogs/TempoDialog.cpp:256
+msgid "%1.%2 s,"
+msgstr ""
+
+#: ../src/gui/dialogs/TempoDialog.cpp:262
+#, c-format
+msgid "at the start of measure %1."
+msgstr ""
+
+#: ../src/gui/dialogs/TempoDialog.cpp:266
+#, c-format
+msgid "in the middle of measure %1."
+msgstr ""
+
+#: ../src/gui/dialogs/TempoDialog.cpp:285
+msgid " (at %1.%2 s, in measure %3)"
+msgstr ""
+
+#: ../src/gui/dialogs/TempoDialog.cpp:302
+msgid "There are no preceding tempo changes."
+msgstr ""
+
+#: ../src/gui/dialogs/TempoDialog.cpp:310
+msgid "There are no other tempo changes."
+msgstr ""
+
+#: ../src/gui/dialogs/TempoDialog.cpp:328
+msgid " bpm"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioPlayingDialog.cpp:42
+msgid "Playing audio file"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioPlayingDialog.cpp:47
+msgid "Playing audio file \"%1\""
+msgstr ""
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:52
+#: ../src/gui/editors/matrix/MatrixView.cpp:2655
+msgid "Trigger Segment"
+msgstr ""
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:61
+msgid "Trigger segment: "
+msgstr ""
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:59
+msgid "Key Change"
+msgstr ""
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:77
+msgid "Key signature"
+msgstr ""
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:80
+msgid "Key transposition"
+msgstr ""
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:86
+msgid "Existing notes following key change"
+msgstr ""
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:98
+msgid "Flatten"
+msgstr ""
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:100
+msgid "Key"
+msgstr ""
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:105
+msgid "Sharpen"
+msgstr ""
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:109
+msgid "Major"
+msgstr ""
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:110
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:369
+msgid "Minor"
+msgstr ""
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:123
+msgid "Transpose key according to segment transposition"
+msgstr ""
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:126
+msgid "Use specified key. Do not transpose"
+msgstr ""
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:134
+msgid "Apply to current segment only"
+msgstr ""
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:137
+msgid "Apply to all segments at this time"
+msgstr ""
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:141
+msgid "Exclude percussion segments"
+msgstr ""
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:155
+msgid "Maintain current accidentals"
+msgstr ""
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:158
+msgid "Transpose into this key"
+msgstr ""
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:331
+msgid "No such key"
+msgstr ""
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:44
+#: ../src/gui/editors/notation/NotationSelector.cpp:118
+msgid "Interpret"
+msgstr ""
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:50
+msgid "Interpretations to apply"
+msgstr ""
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:53
+msgid "Apply text dynamics (p, mf, ff etc)"
+msgstr ""
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:55
+msgid "Apply hairpin dynamics"
+msgstr ""
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:57
+msgid "Stress beats"
+msgstr ""
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:59
+msgid "Articulate slurs, staccato, tenuto etc"
+msgstr ""
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:61
+msgid "All available interpretations"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:316
+msgid ""
+"Attempted to launch JACK audio daemon failed. Audio will be disabled.\n"
+"Please check configuration (Settings -> Configure Rosegarden -> Audio -> "
+"Startup)\n"
+" and restart."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:325
+msgid "Starting sequencer..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:333
+msgid "Initializing plugin manager..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:338
+msgid "Initializing view..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:354
+msgid "Special Parameters"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:430
+msgid "Starting sequence manager..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:456
+msgid "Clearing studio data..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:475
+#: ../src/gui/editors/notation/NotationView.cpp:558
+msgid "Starting..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:556
+msgid "Import Rosegarden &Project file..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:560
+msgid "Import &MIDI file..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:564
+msgid "Import &Rosegarden 2.1 file..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:568
+msgid "Import &Hydrogen file..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:572
+msgid "Merge &File..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:576
+msgid "Merge &MIDI file..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:580
+msgid "Merge &Rosegarden 2.1 file..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:584
+msgid "Merge &Hydrogen file..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:588
+msgid "Export Rosegarden &Project file..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:592
+msgid "Export &MIDI file..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:596
+msgid "Export &LilyPond file..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:600
+msgid "Export Music&XML file..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:604
+msgid "Export &Csound score file..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:608
+msgid "Export M&up file..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:612
+#: ../src/gui/editors/notation/NotationView.cpp:1500
+msgid "Print &with LilyPond..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:616
+#: ../src/gui/editors/notation/NotationView.cpp:1504
+msgid "Preview with Lil&yPond..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:620
+msgid "Play&list"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:627
+msgid "Rosegarden &Tutorial"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:631
+msgid "&Bug Reporting Guidelines"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:645
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:348
+#: ../src/gui/editors/segment/MarkerEditor.cpp:378
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:388
+#: ../src/gui/general/EditViewBase.cpp:190
+#: ../src/gui/studio/BankEditorDialog.cpp:318
+#: ../src/gui/studio/DeviceManagerDialog.cpp:227
+msgid "Und&o"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:651
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:354
+#: ../src/gui/editors/segment/MarkerEditor.cpp:384
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:394
+#: ../src/gui/general/EditViewBase.cpp:196
+#: ../src/gui/studio/BankEditorDialog.cpp:324
+#: ../src/gui/studio/DeviceManagerDialog.cpp:233
+msgid "Re&do"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:665
+#: ../src/gui/editors/notation/NotationView.cpp:2297
+msgid "Show T&ools Toolbar"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:669
+msgid "Show Trac&ks Toolbar"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:673
+msgid "Show &Editors Toolbar"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:677
+#: ../src/gui/editors/notation/NotationView.cpp:2309
+msgid "Show Trans&port Toolbar"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:681
+msgid "Show &Zoom Toolbar"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:688
+msgid "Show Tra&nsport"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:693
+msgid "Show Track &Labels"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:698
+msgid "Show Playback Position R&uler"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:703
+msgid "Show Te&mpo Ruler"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:708
+msgid "Show Cho&rd Name Ruler"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:714
+msgid "Show Segment Pre&views"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:719
+msgid "Show Special &Parameters"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:753
+#: ../src/gui/editors/matrix/MatrixView.cpp:641
+#: ../src/gui/editors/notation/NotationView.cpp:1772
+msgid "&Select and Edit"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:758
+#: ../src/gui/editors/matrix/MatrixView.cpp:646
+msgid "&Draw"
+msgstr ""
+
+#: ../src/commands/edit/EraseCommand.h:50
+#: ../src/gui/application/RosegardenGUIApp.cpp:763
+#: ../src/gui/editors/matrix/MatrixView.cpp:651
+#: ../src/gui/editors/notation/NotationView.cpp:1766
+msgid "&Erase"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:768
+#: ../src/gui/editors/matrix/MatrixView.cpp:656
+msgid "&Move"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:775
+msgid "&Resize"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:782 rc.cpp:87
+#, no-c-format
+msgid "&Split"
+msgstr ""
+
+#: ../src/commands/segment/SegmentJoinCommand.h:53
+#: ../src/gui/application/RosegardenGUIApp.cpp:789
+msgid "&Join"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:795
+msgid "&Harmonize"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:806
+#: ../src/gui/rulers/TempoRuler.cpp:157
+msgid "Open Tempo and Time Signature Editor"
+msgstr ""
+
+#: ../src/commands/segment/CutRangeCommand.cpp:41
+#: ../src/gui/application/RosegardenGUIApp.cpp:812
+msgid "Cut Range"
+msgstr ""
+
+#: ../src/commands/edit/CopyCommand.cpp:73
+#: ../src/gui/application/RosegardenGUIApp.cpp:816
+msgid "Copy Range"
+msgstr ""
+
+#: ../src/commands/segment/PasteRangeCommand.cpp:45
+#: ../src/gui/application/RosegardenGUIApp.cpp:820
+msgid "Paste Range"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:828
+msgid "Insert Range..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:832
+#: ../src/gui/editors/notation/NotationView.cpp:1804
+msgid "De&lete"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:836
+msgid "Select &All Segments"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:852
+msgid "Edit Mar&kers..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:856
+msgid "Edit Document P&roperties..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:864
+msgid "Open in &Default Editor"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:870
+#: ../src/gui/general/EditViewBase.cpp:206
+msgid "Open in Matri&x Editor"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:876
+#: ../src/gui/general/EditViewBase.cpp:212
+msgid "Open in &Percussion Matrix Editor"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:882
+#: ../src/gui/general/EditViewBase.cpp:218
+msgid "Open in &Notation Editor"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:888
+#: ../src/gui/general/EditViewBase.cpp:224
+msgid "Open in &Event List Editor"
+msgstr ""
+
+#: ../src/commands/edit/EventQuantizeCommand.cpp:120
+#: ../src/commands/edit/EventUnquantizeCommand.cpp:87
+#: ../src/gui/application/RosegardenGUIApp.cpp:894
+msgid "&Quantize..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:908
+#: ../src/gui/editors/matrix/MatrixView.cpp:686
+msgid "Repeat Last Quantize"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:928
+msgid "Split at Time..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:932
+#: ../src/gui/general/EditView.cpp:796
+msgid "Jog &Left"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:936
+#: ../src/gui/general/EditView.cpp:800
+msgid "Jog &Right"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:940
+msgid "Set Start Time..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:944
+msgid "Set Duration..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:953
+msgid "Turn Re&peats into Copies"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:958
+msgid "Manage Tri&ggered Segments"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:962
+msgid "Set Tempos from &Beat Segment"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:966
+msgid "Set &Tempo to Audio Segment Duration"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:972
+msgid "Manage A&udio Files"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:977
+msgid "Show Segment Labels"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:986
+msgid "Add &Track"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:990
+msgid "&Add Tracks..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:996
+msgid "D&elete Track"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1002
+msgid "Move Track &Down"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1008
+msgid "Move Track &Up"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1012
+msgid "Select &Next Track"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1017
+msgid "Select &Previous Track"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1022
+msgid "Mute or Unmute Track"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1027
+msgid "Arm or Un-arm Track for Record"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1034
+msgid "&Mute all Tracks"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1040
+msgid "&Unmute all Tracks"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1044
+msgid "&Remap Instruments..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1053
+msgid "&Audio Mixer"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1059
+msgid "Midi Mi&xer"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1065
+msgid "Manage MIDI &Devices"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1071
+msgid "Manage S&ynth Plugins"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1075
+msgid "Modify MIDI &Filters"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1079
+msgid "MIDI Thru Routing"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1085
+msgid "Manage &Metronome"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1089
+msgid "&Save Current Document as Default Studio"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1093
+msgid "&Import Default Studio"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1097
+msgid "Im&port Studio from File..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1101
+msgid "&Reset MIDI Network"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1105
+msgid "Set Quick Marker at Playback Position"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1109
+msgid "Jump to Quick Marker"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1142
+#: ../src/gui/editors/matrix/MatrixView.cpp:782
+#: ../src/gui/editors/notation/NotationView.cpp:2397
+#: ../src/gui/studio/AudioMixerWindow.cpp:105
+#: ../src/gui/studio/MidiMixerWindow.cpp:81
+msgid "&Play"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1153
+#: ../src/gui/editors/matrix/MatrixView.cpp:791
+#: ../src/gui/editors/notation/NotationView.cpp:2406
+#: ../src/gui/studio/AudioMixerWindow.cpp:114
+#: ../src/gui/studio/MidiMixerWindow.cpp:90
+msgid "&Stop"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1160
+#: ../src/gui/editors/matrix/MatrixView.cpp:802
+#: ../src/gui/editors/notation/NotationView.cpp:2417
+#: ../src/gui/studio/AudioMixerWindow.cpp:125
+#: ../src/gui/studio/MidiMixerWindow.cpp:101
+msgid "&Fast Forward"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1168
+#: ../src/gui/editors/matrix/MatrixView.cpp:796
+#: ../src/gui/editors/notation/NotationView.cpp:2411
+#: ../src/gui/studio/AudioMixerWindow.cpp:119
+#: ../src/gui/studio/MidiMixerWindow.cpp:95
+msgid "Re&wind"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1175
+msgid "P&unch in Record"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1182
+#: ../src/gui/studio/AudioMixerWindow.cpp:143
+#: ../src/gui/studio/MidiMixerWindow.cpp:119
+msgid "&Record"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1189
+#: ../src/gui/editors/matrix/MatrixView.cpp:808
+#: ../src/gui/editors/notation/NotationView.cpp:2423
+#: ../src/gui/studio/AudioMixerWindow.cpp:131
+#: ../src/gui/studio/MidiMixerWindow.cpp:107
+msgid "Rewind to &Beginning"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1196
+#: ../src/gui/editors/matrix/MatrixView.cpp:814
+#: ../src/gui/editors/notation/NotationView.cpp:2429
+#: ../src/gui/studio/AudioMixerWindow.cpp:137
+#: ../src/gui/studio/MidiMixerWindow.cpp:113
+msgid "Fast Forward to &End"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1203
+#: ../src/gui/editors/matrix/MatrixView.cpp:832
+#: ../src/gui/editors/notation/NotationView.cpp:2447
+msgid "Scro&ll to Follow Playback"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1209
+#: ../src/gui/editors/matrix/MatrixView.cpp:838
+#: ../src/gui/editors/notation/NotationView.cpp:2453
+#: ../src/gui/studio/AudioMixerWindow.cpp:149
+#: ../src/gui/studio/MidiMixerWindow.cpp:125
+msgid "Panic"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1213
+msgid "Segment Debug Dump "
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1283
+msgid " Zoom: "
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1719
+msgid "File \"%1\" does not exist"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1725
+msgid "File \"%1\" is actually a directory"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1734
+msgid "You do not have read permission for \"%1\""
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1802
+msgid ""
+"An auto-save file for this document has been found\n"
+"Do you want to open it instead ?"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1896
+msgid "Example Files"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2100
+msgid "Opening a new application window..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2110
+msgid "Creating new document..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2154
+#, c-format
+msgid ""
+"Malformed URL\n"
+"%1"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2179
+#: ../src/gui/application/RosegardenGUIApp.cpp:2240
+msgid "Opening file..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2201
+#: ../src/gui/application/RosegardenGUIApp.cpp:2220
+msgid "Open File"
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:1225
+#: ../src/gui/application/RosegardenGUIApp.cpp:2258
+msgid "Saving file..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2330
+msgid "This is not a valid filename.\n"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2335
+msgid "This is not a local file.\n"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2342
+#: ../src/gui/studio/BankEditorDialog.cpp:1640
+#: ../src/gui/studio/DeviceManagerDialog.cpp:787
+msgid "You have specified a directory"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2348
+#: ../src/gui/studio/BankEditorDialog.cpp:1646
+#: ../src/gui/studio/DeviceManagerDialog.cpp:793
+msgid "The specified file exists. Overwrite?"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2362
+msgid "Saving file with a new filename..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2364
+msgid "Rosegarden files"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2365
+#: ../src/gui/application/RosegardenGUIApp.cpp:4860
+#: ../src/gui/application/RosegardenGUIApp.cpp:4904
+#: ../src/gui/application/RosegardenGUIApp.cpp:4942
+#: ../src/gui/application/RosegardenGUIApp.cpp:4975
+#: ../src/gui/application/RosegardenGUIApp.cpp:5009
+#: ../src/gui/application/RosegardenGUIApp.cpp:5116
+msgid "All files"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2366
+msgid "Save as..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2404
+msgid "Closing file..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2421
+#: ../src/gui/editors/notation/NotationView.cpp:4618
+msgid "Printing..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2433
+#: ../src/gui/editors/notation/NotationView.cpp:4635
+msgid "Previewing..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2440
+msgid "Exiting..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2463
+msgid "Cutting selection..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2474
+#: ../src/gui/editors/matrix/MatrixView.cpp:1614
+#: ../src/gui/editors/notation/NotationView.cpp:4763
+msgid "Copying selection to clipboard..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2484
+#: ../src/gui/editors/eventlist/EventView.cpp:878
+#: ../src/gui/editors/matrix/MatrixView.cpp:1625
+#: ../src/gui/editors/notation/NotationView.cpp:4796
+#: ../src/gui/editors/notation/NotationView.cpp:4841
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:352
+msgid "Clipboard is empty"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2487
+#: ../src/gui/editors/eventlist/EventView.cpp:882
+#: ../src/gui/editors/matrix/MatrixView.cpp:1629
+#: ../src/gui/editors/notation/NotationView.cpp:4804
+#: ../src/gui/editors/notation/NotationView.cpp:4845
+msgid "Inserting clipboard contents..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2556
+msgid "Duration of empty range to insert"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2631
+msgid "This function needs no more than one segment to be selected."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2654
+msgid "Can't join Audio segments"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2707
+msgid "rescaling an audio file"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2723
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:172
+msgid "Rescaling audio file..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2767
+msgid ""
+"The audio file path does not exist or is not writable.\n"
+"You must set the audio file path to a valid directory in Document Properties "
+"before %1.\n"
+"Would you like to set it now?"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2769
+#: ../src/gui/application/RosegardenGUIApp.cpp:5291
+#: ../src/gui/application/RosegardenGUIApp.cpp:5339
+#: ../src/gui/editors/segment/TrackButtons.cpp:419
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:159
+msgid "Set audio file path"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2833
+msgid "Jog Selection"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2978
+#, c-format
+msgid ""
+"_n: Split Segment at Time\n"
+"Split %n Segments at Time"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3013
+#: ../src/gui/general/EditViewBase.cpp:619
+msgid "Segment Start Time"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3023
+msgid "Set Segment Start Times"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3024
+#: ../src/gui/general/EditViewBase.cpp:626
+msgid "Set Segment Start Time"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3056
+#: ../src/gui/general/EditViewBase.cpp:644
+msgid "Segment Duration"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3068
+msgid "Set Segment Durations"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3069
+#: ../src/gui/general/EditViewBase.cpp:652
+msgid "Set Segment Duration"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3176
+#: ../src/gui/application/RosegardenGUIApp.cpp:5875
+msgid "Set Global Tempo"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3234
+#: ../src/gui/general/EditViewBase.cpp:477
+msgid "Toggle the toolbar..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3244
+msgid "Toggle the tools toolbar..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3254
+msgid "Toggle the tracks toolbar..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3264
+msgid "Toggle the editor toolbar..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3274
+msgid "Toggle the transport toolbar..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3284
+msgid "Toggle the zoom toolbar..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3294
+msgid "Toggle the Transport"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3377
+#: ../src/gui/general/EditViewBase.cpp:487
+msgid "Toggle the statusbar..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3434
+msgid ""
+"The join tool isn't implemented yet. Instead please highlight the segments "
+"you want to join and then use the menu option:\n"
+"\n"
+" Segments->Collapse Segments.\n"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3437
+msgid "Join tool not yet implemented"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3675
+msgid "Revert modified document to previous saved version?"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3691
+msgid ""
+"*.rgp|Rosegarden Project files\n"
+"*|All files"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3692
+msgid "Import Rosegarden Project File"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3717
+msgid "Failed to import project file \"%1\""
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3739
+msgid "Open MIDI File"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3756
+msgid "Merge MIDI File"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3866
+msgid "Importing MIDI file..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3903
+msgid "Calculating notation..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3950
+msgid "Calculate Notation"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3991
+#: ../src/gui/application/RosegardenGUIApp.cpp:4008
+msgid ""
+"*.rose|Rosegarden-2 files\n"
+"*|All files"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3992
+#: ../src/gui/application/RosegardenGUIApp.cpp:4009
+msgid "Open Rosegarden 2.1 File"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4026
+msgid "Importing Rosegarden 2.1 file..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4052
+msgid "Can't load Rosegarden 2.1 file. It appears to be corrupted."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4078
+#: ../src/gui/application/RosegardenGUIApp.cpp:4095
+msgid ""
+"*.h2song|Hydrogen files\n"
+"*|All files"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4079
+#: ../src/gui/application/RosegardenGUIApp.cpp:4096
+msgid "Open Hydrogen File"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4113
+msgid "Importing Hydrogen file..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4139
+msgid "Can't load Hydrogen file. It appears to be corrupted."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4527
+msgid "Export and import of Rosegarden Project files"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4529
+msgid "The Rosegarden Project Packager helper script"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4533
+msgid "%1 - for project file support"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4550
+msgid "The Rosegarden LilyPondView helper script"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4554
+msgid "%1 - for LilyPond preview support"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4570
+msgid "The Rosegarden Audio File Importer helper script"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4574
+msgid "%1 - for audio file import"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4585
+msgid ""
+"<h3>Helper programs not found</h3><p>Rosegarden could not find one or more "
+"helper programs which it needs to provide some features. The following "
+"features will not be available:</p>"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4586
+#: ../src/gui/application/RosegardenGUIApp.cpp:4592
+msgid "<ul>"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4588
+#: ../src/gui/application/RosegardenGUIApp.cpp:4594
+msgid "<li>%1</li>"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4590
+#: ../src/gui/application/RosegardenGUIApp.cpp:4596
+msgid "</ul>"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4591
+msgid ""
+"<p>To fix this, you should install the following additional programs:</p>"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4603
+msgid "Helper programs not found"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4686
+msgid "Starting the sequencer..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4712
+msgid "Couldn't start the sequencer"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4789
+msgid "Clearing down jackd..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4803
+msgid "Starting jackd..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4842
+msgid ""
+"The Rosegarden sequencer process has exited unexpectedly. Sound and "
+"recording will no longer be available for this session.\n"
+"Please exit and restart Rosegarden to restore sound capability."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4846
+msgid ""
+"The Rosegarden sequencer could not be started, so sound and recording will "
+"be unavailable for this session.\n"
+"For assistance with correct audio and MIDI configuration, go to http://"
+"rosegardenmusic.com."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4856
+msgid "Exporting Rosegarden Project file..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4859
+msgid "Rosegarden Project files\n"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4861
+#: ../src/gui/application/RosegardenGUIApp.cpp:4905
+#: ../src/gui/application/RosegardenGUIApp.cpp:4943
+#: ../src/gui/application/RosegardenGUIApp.cpp:4976
+#: ../src/gui/application/RosegardenGUIApp.cpp:5010
+#: ../src/gui/application/RosegardenGUIApp.cpp:5116
+msgid "Export as..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4875
+#, c-format
+msgid "Saving Rosegarden file to package failed: %1"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4889
+msgid "Failed to export to project file \"%1\""
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4900
+#: ../src/gui/application/RosegardenGUIApp.cpp:4915
+msgid "Exporting MIDI file..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4903
+msgid "Standard MIDI files\n"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4934
+#: ../src/gui/application/RosegardenGUIApp.cpp:4966
+#: ../src/gui/application/RosegardenGUIApp.cpp:4999
+#: ../src/gui/application/RosegardenGUIApp.cpp:5103
+#: ../src/gui/application/RosegardenGUIApp.cpp:5140
+#: ../src/gui/editors/notation/NotationView.cpp:4733
+msgid "Export failed. The file could not be opened for writing."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4940
+#: ../src/gui/application/RosegardenGUIApp.cpp:4952
+msgid "Exporting Csound score file..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4972
+#: ../src/gui/application/RosegardenGUIApp.cpp:4985
+msgid "Exporting Mup file..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4975
+msgid "Mup files\n"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5005
+#: ../src/gui/application/RosegardenGUIApp.cpp:5089
+#: ../src/gui/editors/notation/NotationView.cpp:4719
+msgid "Exporting LilyPond file..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5008
+msgid "LilyPond files"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5023
+#: ../src/gui/editors/notation/NotationView.cpp:4653
+msgid "Printing LilyPond file..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5028
+#: ../src/gui/application/RosegardenGUIApp.cpp:5052
+#: ../src/gui/editors/notation/NotationView.cpp:4658
+#: ../src/gui/editors/notation/NotationView.cpp:4682
+msgid "Failed to open a temporary file for LilyPond export."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5047
+#: ../src/gui/editors/notation/NotationView.cpp:4677
+msgid "Previewing LilyPond file..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5080
+#: ../src/gui/editors/notation/NotationView.cpp:4710
+msgid "LilyPond Preview Options"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5081
+#: ../src/gui/editors/notation/NotationView.cpp:4711
+msgid "LilyPond preview options"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5112
+#: ../src/gui/application/RosegardenGUIApp.cpp:5126
+msgid "Exporting MusicXML file..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5115
+msgid "XML files"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5289
+#: ../src/gui/editors/segment/TrackButtons.cpp:417
+msgid ""
+"The audio file path does not exist or is not writable.\n"
+"Please set the audio file path to a valid directory in Document Properties "
+"before recording audio.\n"
+"Would you like to set it now?"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5337
+msgid ""
+"The audio file path does not exist or is not writable.\n"
+"Please set the audio file path to a valid directory in Document Properties "
+"before you start to record audio.\n"
+"Would you like to set it now?"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5780
+msgid "Move playback pointer to time"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5793
+#: ../src/gui/editors/matrix/MatrixView.cpp:2240
+msgid "%1%"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5861
+#, c-format
+msgid "Replace Tempo Change at %1"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5891
+msgid "Set Global and Default Tempo"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5914
+msgid "Move Tempo Change"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5949
+msgid "new marker"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5950
+msgid "no description"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:6363
+#, c-format
+msgid "Sequencer failed to add audio file %1"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:6388
+#, c-format
+msgid "Sequencer failed to remove audio file id %1"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:6448
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:1086
+msgid "Modify Segment label"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:6450
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:1088
+msgid "Modify Segments label"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:6452
+msgid "Relabelling selection..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7539
+msgid "Play List"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7567
+msgid "http://rosegarden.sourceforge.net/tutorial/en/chapter-0.html"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7574
+msgid "http://rosegarden.sourceforge.net/tutorial/bug-guidelines.html"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7650
+msgid "Queueing MIDI panic events for tranmission..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7708
+msgid "Are you sure you want to save this as your default studio?"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7713
+msgid "Saving current document as default studio..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7738
+msgid ""
+"Are you sure you want to import your default studio and lose the current one?"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7773
+msgid "Import Studio from File"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7807
+msgid "Import Studio"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:8015
+msgid ""
+"<h3>Newer version available</h3><p>A newer version of Rosegarden may be "
+"available.<br>Please consult the <a href=\"http://www.rosegardenmusic.com/"
+"getting/\">Rosegarden website</a> for more information.</p>"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:8016
+msgid "Newer version available"
+msgstr ""
+
+#: ../src/gui/application/RosegardenApplication.cpp:104
+#, c-format
+msgid "Failed to load soundfont %1"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:311
+msgid "Rosegarden - A sequencer and musical notation editor"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:315
+msgid "Don't use the sequencer (support editing only)"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:316
+msgid "Don't show the splash screen"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:317
+msgid "Don't automatically run in the background"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:318
+msgid "Attach to a running sequencer process, if found"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:319
+msgid "Ignore installed version - for devs only"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:320
+msgid "file to open"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:370
+msgid "Installation contains the wrong version of Rosegarden."
+msgstr ""
+
+#: ../src/gui/application/main.cpp:371
+msgid ""
+" The wrong versions of Rosegarden's data files were\n"
+" found in the standard KDE installation directories.\n"
+" (I am %1, but the installed files are for version %2.)\n"
+"\n"
+" This may mean one of the following:\n"
+"\n"
+" 1. This is a new upgrade of Rosegarden, and it has not yet been\n"
+" installed. If you compiled it yourself, check that you have\n"
+" run \"make install\" and that the procedure completed\n"
+" successfully.\n"
+"\n"
+" 2. The upgrade was installed in a non-standard directory,\n"
+" and an old version was found in a standard directory. If so,\n"
+" you will need to add the correct directory to your KDEDIRS\n"
+" environment variable before you can run it."
+msgstr ""
+
+#: ../src/gui/application/main.cpp:383 ../src/gui/application/main.cpp:401
+msgid "Installation problem"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:389
+msgid "Rosegarden does not appear to have been installed."
+msgstr ""
+
+#: ../src/gui/application/main.cpp:390
+msgid ""
+" One or more of Rosegarden's data files could not be\n"
+" found in the standard KDE installation directories.\n"
+"\n"
+" This may mean one of the following:\n"
+"\n"
+" 1. Rosegarden has not been correctly installed. If you compiled\n"
+" it yourself, check that you have run \"make install\" and that\n"
+" the procedure completed successfully.\n"
+"\n"
+" 2. Rosegarden has been installed in a non-standard directory,\n"
+" and you need to add this directory to your KDEDIRS environment\n"
+" variable before you can run it. This may be the case if you\n"
+" installed into $HOME or a local third-party package directory\n"
+" like /usr/local or /opt."
+msgstr ""
+
+#: ../src/gui/application/main.cpp:414
+msgid "Rosegarden"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:416
+msgid ""
+"Copyright 2000 - 2008 Guillaume Laurent, Chris Cannam, Richard Bown\n"
+"Parts copyright 1994 - 2004 Chris Cannam, Andy Green, Richard Bown, "
+"Guillaume Laurent\n"
+"LilyPond fonts copyright 1997 - 2005 Han-Wen Nienhuys and Jan Nieuwenhuizen"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:428
+msgid "Chord labelling code"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:429
+msgid ""
+"LilyPond output\n"
+"assorted other patches\n"
+"i18n-ization"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:430
+msgid ""
+"UI improvements\n"
+"bug fixes"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:431
+msgid ""
+"Segment colours\n"
+"Other UI and bug fixes"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:432
+msgid ""
+"Russian translation\n"
+"i18n-ization"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:433 ../src/gui/application/main.cpp:434
+msgid "German translation"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:435
+msgid "Welsh translation"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:436
+msgid "French translation"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:437
+msgid ""
+"French translation\n"
+"Bug fixes"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:438 ../src/gui/application/main.cpp:439
+msgid "Italian translation"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:440 ../src/gui/application/main.cpp:441
+msgid "Swedish translation"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:442
+msgid "Estonian translation"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:443 ../src/gui/application/main.cpp:444
+msgid "Dutch translation"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:445
+msgid "HSpinBox class"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:446
+msgid "Transposition by interval"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:447
+msgid "Original designs for rotary controllers"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:448
+msgid "Japanese translation"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:449
+msgid ""
+"Auto-scroll deceleration\n"
+"Rests outside staves and other bug fixes"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:450
+msgid "Simplified Chinese translation"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:451
+msgid "LIRC infrared remote-controller support"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:452
+msgid "MTC slave timing implementation"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:453
+msgid "Czech translation"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:454
+msgid "SCons/bksys building system"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:455
+msgid "icons, icons, icons"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:456 ../src/gui/application/main.cpp:457
+#: ../src/gui/application/main.cpp:458 ../src/gui/application/main.cpp:459
+msgid "Spanish translation"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:460 ../src/gui/application/main.cpp:461
+msgid "Catalan translation"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:462
+msgid ""
+"1.2.3 splash screen photo\n"
+"Gave birth to D. Michael McIntyre, bought him a good flute once\n"
+"upon a time, and always humored him when he came over to play her\n"
+"some new instrument, even though she really hated his playing.\n"
+"Born October 19, 1951, died September 21, 2007, R. I. P."
+msgstr ""
+
+#: ../src/gui/application/main.cpp:463
+msgid "Initial guitar chord editing code"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:464
+msgid "Polish translation"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:465
+msgid "Basque translation"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:466
+msgid "Klearlook theme"
+msgstr ""
+
+#: ../src/_translatorinfo.cpp:1 ../src/gui/application/main.cpp:468
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr ""
+
+#: ../src/_translatorinfo.cpp:3 ../src/gui/application/main.cpp:468
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:719
+msgid "Welcome!"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:731
+msgid ""
+"<h2>Welcome to Rosegarden!</h2><p>Welcome to the Rosegarden audio and MIDI "
+"sequencer and musical notation editor.</p><ul><li>If you have not already "
+"done so, you may wish to install some DSSI synth plugins, or a separate "
+"synth program such as QSynth. Rosegarden does not synthesize sounds from "
+"MIDI on its own, so without these you will hear nothing.</"
+"li><br><br><li>Rosegarden uses the JACK audio server for recording and "
+"playback of audio, and for playback from DSSI synth plugins. These features "
+"will only be available if the JACK server is running.</"
+"li><br><br><li>Rosegarden has comprehensive documentation: see the Help menu "
+"for the handbook, tutorials, and other information!</li></ul><p>Rosegarden "
+"was brought to you by a team of volunteers across the world. To learn more, "
+"go to <a href=\"http://www.rosegardenmusic.com/\">http://www.rosegardenmusic."
+"com/</a>.</p>"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIView.cpp:257
+msgid "No non-audio segments in composition"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIView.cpp:333
+msgid "Selection must contain only audio or non-audio segments"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIView.cpp:431
+#: ../src/gui/application/RosegardenGUIView.cpp:576
+#: ../src/gui/application/RosegardenGUIView.cpp:612
+#: ../src/gui/application/RosegardenGUIView.cpp:776
+msgid "No non-audio segments selected"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIView.cpp:851
+msgid ""
+"You've not yet defined an audio editor for Rosegarden to use.\n"
+"See Settings -> Configure Rosegarden -> Audio."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIView.cpp:1559
+#: ../src/gui/application/RosegardenGUIView.cpp:1564
+msgid "Can't add dropped file. "
+msgstr ""
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1014
+#: ../src/gui/seqmanager/SequenceManager.cpp:1150
+msgid ""
+"The JACK Audio subsystem has failed or it has stopped Rosegarden from "
+"processing audio.\n"
+"Please restart Rosegarden to continue working with audio.\n"
+"Quitting other running applications may improve Rosegarden's performance."
+msgstr ""
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1020
+#: ../src/gui/seqmanager/SequenceManager.cpp:1156
+msgid ""
+"The JACK Audio subsystem has stopped Rosegarden from processing audio, "
+"probably because of a processing overload.\n"
+"An attempt to restart the audio service has been made, but some problems may "
+"remain.\n"
+"Quitting other running applications may improve Rosegarden's performance."
+msgstr ""
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1031
+msgid ""
+"Run out of processor power for real-time audio processing. Cannot continue."
+msgstr ""
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1057
+msgid ""
+"A serious error has occurred in the ALSA MIDI subsystem. It may not be "
+"possible to continue sequencing. Please check console output for more "
+"information."
+msgstr ""
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1078
+msgid "JACK Audio subsystem is losing sample frames."
+msgstr ""
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1096
+msgid ""
+"Failed to read audio data from disc in time to service the audio subsystem."
+msgstr ""
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1100
+msgid ""
+"Failed to write audio data to disc fast enough to service the audio "
+"subsystem."
+msgstr ""
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1104
+msgid "The audio mixing subsystem is failing to keep up."
+msgstr ""
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1108
+msgid "The audio subsystem is failing to keep up."
+msgstr ""
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1112
+msgid "Unknown sequencer failure mode!"
+msgstr ""
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1170
+msgid ""
+"<h3>System timer resolution is too low</h3><p>Rosegarden was unable to find "
+"a high-resolution timing source for MIDI performance.</p><p>This may mean "
+"you are using a Linux system with the kernel timer resolution set too low. "
+"Please contact your Linux distributor for more information.</p><p>Some Linux "
+"distributors already provide low latency kernels, see <a href=\"http://"
+"rosegarden.wiki.sourceforge.net/Low+latency+kernels\">http://rosegarden.wiki."
+"sourceforge.net/Low+latency+kernels</a> for instructions.</p>"
+msgstr ""
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1188
+msgid ""
+"<h3>System timer resolution is too low</h3><p>Rosegarden was unable to find "
+"a high-resolution timing source for MIDI performance.</p><p>You may be able "
+"to solve this problem by loading the RTC timer kernel module. To do this, "
+"try running <b>sudo modprobe snd-rtctimer</b> in a terminal window and then "
+"restarting Rosegarden.</p><p>Alternatively, check whether your Linux "
+"distributor provides a multimedia-optimized kernel. See <a href=\"http://"
+"rosegarden.wiki.sourceforge.net/Low+latency+kernels\">http://rosegarden.wiki."
+"sourceforge.net/Low+latency+kernels</a> for notes about this.</p>"
+msgstr ""
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1312
+msgid ""
+"<p>Both MIDI and Audio subsystems have failed to initialize.</p><p>You may "
+"continue without the sequencer, but we suggest closing Rosegarden, running "
+"\"alsaconf\" as root, and starting Rosegarden again. If you wish to run "
+"with no sequencer by design, then use \"rosegarden --nosequencer\" to avoid "
+"seeing this error in the future.</p>"
+msgstr ""
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1314
+msgid ""
+"<p>The MIDI subsystem has failed to initialize.</p><p>You may continue "
+"without the sequencer, but we suggest closing Rosegarden, running \"modprobe "
+"snd-seq-midi\" as root, and starting Rosegarden again. If you wish to run "
+"with no sequencer by design, then use \"rosegarden --nosequencer\" to avoid "
+"seeing this error in the future.</p>"
+msgstr ""
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1316
+msgid ""
+"<p>The Rosegarden sequencer module version does not match the GUI module "
+"version.</p><p>You have probably mixed up files from two different versions "
+"of Rosegarden. Please check your installation.</p>"
+msgstr ""
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1322
+#, c-format
+msgid "<h3>Sequencer startup failed</h3>%1"
+msgstr ""
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1330
+msgid ""
+"<h3>Failed to connect to JACK audio server.</h3><p>Rosegarden could not "
+"connect to the JACK audio server. This probably means the JACK server is "
+"not running.</p><p>If you want to be able to play or record audio files or "
+"use plugins, you should exit Rosegarden and start the JACK server before "
+"running Rosegarden again.</p>"
+msgstr ""
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1331
+msgid "Failed to connect to JACK"
+msgstr ""
+
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:46
+msgid "Modify MIDI filters..."
+msgstr ""
+
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:58
+msgid "THRU events to ignore"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:131
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:60
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:96
+msgid "Note"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:132
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:61
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:97
+msgid "Program Change"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:136
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:62
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:98
+msgid "Key Pressure"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:137
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:63
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:99
+msgid "Channel Pressure"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:134
+#: ../src/gui/general/EditView.cpp:899
+#: ../src/gui/rulers/ControllerEventsRuler.cpp:198
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:64
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:100
+msgid "Pitch Bend"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:133
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:65
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:101
+msgid "Controller"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:135
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:66
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:102
+msgid "System Exclusive"
+msgstr ""
+
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:94
+msgid "RECORD events to ignore"
+msgstr ""
+
+#: ../src/gui/widgets/TimeWidget.cpp:101
+msgid "Note:"
+msgstr ""
+
+#: ../src/gui/widgets/TimeWidget.cpp:108 ../src/gui/widgets/TimeWidget.cpp:145
+msgid "<inexact>"
+msgstr ""
+
+#: ../src/gui/widgets/TimeWidget.cpp:151
+msgid "Units:"
+msgstr ""
+
+#: ../src/gui/widgets/TimeWidget.cpp:173
+msgid "Time:"
+msgstr ""
+
+#: ../src/gui/widgets/TimeWidget.cpp:184
+msgid "units"
+msgstr ""
+
+#: ../src/gui/widgets/TimeWidget.cpp:193
+msgid "Measures:"
+msgstr ""
+
+#: ../src/gui/widgets/TimeWidget.cpp:193
+msgid "Measure:"
+msgstr ""
+
+#: ../src/gui/widgets/TimeWidget.cpp:212
+msgid "beats:"
+msgstr ""
+
+#: ../src/gui/widgets/TimeWidget.cpp:212
+msgid "beat:"
+msgstr ""
+
+#: ../src/gui/widgets/TimeWidget.cpp:230
+msgid "%1:"
+msgstr ""
+
+#: ../src/gui/widgets/TimeWidget.cpp:254
+msgid "Seconds:"
+msgstr ""
+
+#: ../src/gui/widgets/TimeWidget.cpp:273
+msgid "msec:"
+msgstr ""
+
+#: ../src/gui/widgets/TimeWidget.cpp:407 ../src/gui/widgets/TimeWidget.cpp:531
+msgid "(%1/%2 time)"
+msgstr ""
+
+#: ../src/gui/widgets/TimeWidget.cpp:452
+msgid "(starting %1.%2 qpm, %2.%3 bpm)"
+msgstr ""
+
+#: ../src/gui/widgets/TimeWidget.cpp:458
+msgid "(starting %1.%2 bpm)"
+msgstr ""
+
+#: ../src/gui/widgets/TimeWidget.cpp:464
+msgid "(%1.%2 qpm, %2.%3 bpm)"
+msgstr ""
+
+#: ../src/gui/widgets/TimeWidget.cpp:470
+msgid "(%1.%2 bpm)"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:239
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:60
+msgid "C"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:241
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:61
+msgid "D"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:243
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:62
+msgid "E"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:244
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:63
+msgid "F"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:246
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:64
+msgid "G"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:248
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:65
+msgid "A"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:250
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:66
+msgid "B"
+msgstr ""
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:70
+msgid "-2"
+msgstr ""
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:71
+msgid "-1"
+msgstr ""
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:72
+msgid "0"
+msgstr ""
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:73
+msgid "1"
+msgstr ""
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:74
+msgid "2"
+msgstr ""
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:75
+msgid "3"
+msgstr ""
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:76
+msgid "4"
+msgstr ""
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:77
+msgid "5"
+msgstr ""
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:78
+msgid "6"
+msgstr ""
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:79
+msgid "7"
+msgstr ""
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:83
+msgid "double flat"
+msgstr ""
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:84
+msgid "flat"
+msgstr ""
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:85
+msgid "natural"
+msgstr ""
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:86
+msgid "sharp"
+msgstr ""
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:87
+msgid "double sharp"
+msgstr ""
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:234
+#, c-format
+msgid "In %1"
+msgstr ""
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:587
+#: ../src/gui/widgets/AudioRouteMenu.cpp:236
+#: ../src/gui/widgets/AudioRouteMenu.cpp:259
+msgid "Master"
+msgstr ""
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:528
+#: ../src/gui/widgets/AudioRouteMenu.cpp:238
+#: ../src/gui/widgets/AudioRouteMenu.cpp:261
+#, c-format
+msgid "Sub %1"
+msgstr ""
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:244
+msgid "In %1 R"
+msgstr ""
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:245
+msgid "In %1 L"
+msgstr ""
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:247
+msgid "Master R"
+msgstr ""
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:248
+msgid "Master L"
+msgstr ""
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:250
+msgid "Sub %1 R"
+msgstr ""
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:251
+msgid "Sub %1 L"
+msgstr ""
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:391
+#: ../src/gui/studio/AudioMixerWindow.cpp:522
+#: ../src/gui/widgets/AudioFaderBox.cpp:82
+msgid "Audio plugin button"
+msgstr ""
+
+#: ../src/gui/editors/parameters/AudioInstrumentParameterPanel.cpp:129
+#: ../src/gui/editors/parameters/AudioInstrumentParameterPanel.cpp:357
+#: ../src/gui/widgets/AudioFaderBox.cpp:91
+msgid "<no synth>"
+msgstr ""
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:93
+msgid "Synth plugin button"
+msgstr ""
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:153
+msgid "Set the audio pan position in the stereo field"
+msgstr ""
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:155
+msgid "Open synth plugin's native editor"
+msgstr ""
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:157
+msgid "Mono or Stereo Instrument"
+msgstr ""
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:159
+msgid "Record level"
+msgstr ""
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:161
+msgid "Playback level"
+msgstr ""
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:345
+#: ../src/gui/studio/AudioMixerWindow.cpp:347
+#: ../src/gui/studio/AudioMixerWindow.cpp:503
+#: ../src/gui/studio/AudioMixerWindow.cpp:505
+#: ../src/gui/widgets/AudioFaderBox.cpp:163
+msgid "Audio level"
+msgstr ""
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:170
+msgid "In:"
+msgstr ""
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:173
+msgid "Out:"
+msgstr ""
+
+#: ../src/gui/widgets/ProgressDialog.cpp:48
+#: ../src/gui/widgets/ProgressDialog.cpp:53
+#: ../src/gui/widgets/ProgressDialog.cpp:76
+msgid "Processing..."
+msgstr ""
+
+#: ../src/gui/configuration/ColourConfigurationPage.h:60
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:130
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:346
+#: ../src/gui/widgets/ColourTable.cpp:52
+msgid "Color"
+msgstr ""
+
+#: ../src/gui/widgets/ColourTable.cpp:68
+msgid "Modify Color Name"
+msgstr ""
+
+#: ../src/gui/configuration/ColourConfigurationPage.cpp:129
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:983
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:882
+#: ../src/gui/widgets/ColourTable.cpp:68
+msgid "Enter new name"
+msgstr ""
+
+#: ../src/gui/widgets/ColourTable.cpp:107
+msgid "Default Color"
+msgstr ""
+
+#: ../src/gui/widgets/Rotary.cpp:108
+msgid ""
+"Click and drag up and down or left and right to modify.\n"
+"Double click to edit value directly."
+msgstr ""
+
+#: ../src/gui/widgets/Rotary.cpp:433
+msgid "Select a new value"
+msgstr ""
+
+#: ../src/gui/widgets/Rotary.cpp:434
+msgid "Enter a new value"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:80
+msgid "Quantizer"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:86
+msgid "Quantizer type:"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:88
+msgid "Grid quantizer"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:89
+msgid "Legato quantizer"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:90
+msgid "Heuristic notation quantizer"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:94
+msgid "Quantize for notation only (leave performance unchanged)"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:104
+msgid "Notation parameters"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:109
+#: ../src/gui/widgets/QuantizeParameters.cpp:150
+msgid "Base grid unit:"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:114
+msgid "Complexity:"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:118
+msgid "Very high"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:119
+msgid "High"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:224
+#: ../src/gui/widgets/QuantizeParameters.cpp:120
+msgid "Normal"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:121
+msgid "Low"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:122
+msgid "Very low"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:125
+msgid "Tuplet level:"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:129
+msgid "2-in-the-time-of-3"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:4241
+#: ../src/gui/widgets/QuantizeParameters.cpp:130
+msgid "Triplet"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:138
+msgid "Any"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:141
+msgid "Permit counterpoint"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:145
+msgid "Grid parameters"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:154
+msgid "Swing:"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:159
+msgid "Iterative amount:"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:165
+msgid "Quantize durations as well as start times"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:169
+msgid "After quantization"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:183
+msgid "Show advanced options"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:192
+msgid "Re-beam"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:194
+msgid "Add articulations (staccato, tenuto, slurs)"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:195
+msgid "Tie notes at barlines etc"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:196
+msgid "Split-and-tie overlapping chords"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:307
+msgid "Full quantize"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:450
+msgid "Show Advanced Options"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:454
+msgid "Hide Advanced Options"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:257
+#: ../src/gui/configuration/MatrixConfigurationPage.h:56
+#: ../src/gui/configuration/MatrixConfigurationPage.h:57
+#: ../src/gui/editors/matrix/MatrixView.cpp:2709
+msgid "Matrix"
+msgstr ""
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:64
+msgid "Printable headers"
+msgstr ""
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:92
+msgid "Dedication"
+msgstr ""
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:96
+#: ../src/gui/editors/segment/PlayListView.cpp:35
+msgid "Title"
+msgstr ""
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:100
+msgid "Subtitle"
+msgstr ""
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:104
+msgid "Subsubtitle"
+msgstr ""
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:108
+msgid "Poet"
+msgstr ""
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:116
+msgid "Composer"
+msgstr ""
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:120
+msgid "Meter"
+msgstr ""
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:124
+msgid "Arranger"
+msgstr ""
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:128
+msgid "Piece"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:26
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:132
+msgid "Opus"
+msgstr ""
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:136
+msgid "Copyright"
+msgstr ""
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:140
+msgid "Tagline"
+msgstr ""
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:155
+msgid "The composition comes here."
+msgstr ""
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:172
+msgid "Non-printable headers"
+msgstr ""
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:213
+msgid "Add New Property"
+msgstr ""
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:217
+msgid "Delete Property"
+msgstr ""
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:236
+msgid "{new property %1}"
+msgstr ""
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:236
+msgid "{new property}"
+msgstr ""
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:243
+msgid "{undefined}"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:87
+msgid "Double-click opens segment in"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:91
+msgid "Notation editor"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:92
+msgid "Matrix editor"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:93
+msgid "Event List editor"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:99
+msgid "Number of count-in measures when recording"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:109
+msgid "Auto-save interval"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:112
+msgid "Every 30 seconds"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:113
+msgid "Every minute"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:114
+msgid "Every five minutes"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:115
+msgid "Every half an hour"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:116
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:277
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:157
+msgid "Never"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:140
+msgid "Use JACK transport"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:173
+msgid "Unknown"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:179
+msgid "No MIDI, audio OK"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:182
+msgid "MIDI OK, no audio"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:185
+msgid "MIDI OK, audio OK"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:188
+msgid "No driver"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:195
+msgid "Details..."
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:204
+msgid "Behavior"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:219
+msgid "Side-bar parameter box layout"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:223
+msgid "Vertically stacked"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:225
+msgid "Tabbed"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:233
+msgid "Note name style"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:237
+msgid "Always use US names (e.g. quarter, 8th)"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:238
+msgid "Localized (where available)"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:252
+msgid "Show textured background on"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:254
+msgid "Main window"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:275
+msgid "Use bundled Klearlook theme"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:278
+msgid "When not running under KDE"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:279
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:159
+msgid "Always"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:287
+msgid "Presentation"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:423
+msgid ""
+"Changes to the textured background in the main window will not take effect "
+"until you restart Rosegarden."
+msgstr ""
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:168
+#: ../src/gui/configuration/GeneralConfigurationPage.h:78
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:207
+#: ../src/gui/configuration/MatrixConfigurationPage.cpp:59
+msgid "General"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.h:79
+msgid "General Configuration"
+msgstr ""
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:92
+msgid "Base octave number for MIDI pitch display"
+msgstr ""
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:107
+msgid "Always use default studio when loading files"
+msgstr ""
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:119
+msgid "Send all MIDI Controllers at start of each playback"
+msgstr ""
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:121
+msgid ""
+"Rosegarden can send all MIDI Controllers (Pan, Reverb etc) to all MIDI "
+"devices every\n"
+"time you hit play if you so wish. Please note that this option will usually "
+"incur a\n"
+"delay at the start of playback due to the amount of data being transmitted."
+msgstr ""
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:138
+msgid "Sequencer timing source"
+msgstr ""
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:163
+msgid "Load SoundFont to SoundBlaster card at startup"
+msgstr ""
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:164
+msgid ""
+"Check this box to enable soundfont loading on EMU10K-based cards when "
+"Rosegarden is launched"
+msgstr ""
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:173
+msgid "Path to 'asfxload' or 'sfxload' command"
+msgstr ""
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:180
+msgid "SoundFont"
+msgstr ""
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:223
+msgid "MIDI Clock and System messages"
+msgstr ""
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:229
+msgid "Send MIDI Clock, Start and Stop"
+msgstr ""
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:230
+msgid "Accept Start, Stop and Continue"
+msgstr ""
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:241
+msgid "MIDI Machine Control mode"
+msgstr ""
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:248
+msgid "MMC Master"
+msgstr ""
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:249
+msgid "MMC Slave"
+msgstr ""
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:260
+msgid "MIDI Time Code mode"
+msgstr ""
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:267
+msgid "MTC Master"
+msgstr ""
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:268
+msgid "MTC Slave"
+msgstr ""
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:281
+msgid "Automatically connect sync output to all devices in use"
+msgstr ""
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:292
+msgid "MIDI Sync"
+msgstr ""
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:308
+msgid "sfxload path"
+msgstr ""
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:315
+msgid "Soundfont path"
+msgstr ""
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:67
+msgid "%1 minutes %2.%3%4 seconds (%5 units, %6 measures)"
+msgstr ""
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:133
+msgid "Filename:"
+msgstr ""
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:136
+msgid "Formal duration (to end marker):"
+msgstr ""
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:141
+msgid "Playing duration:"
+msgstr ""
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:146
+msgid "Tracks:"
+msgstr ""
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:147
+msgid "%1 used, %2 total"
+msgstr ""
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:152
+msgid "Segments:"
+msgstr ""
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:153
+msgid "%1 MIDI, %2 audio, %3 total"
+msgstr ""
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:161
+msgid "Statistics"
+msgstr ""
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:170
+#: ../src/gui/editors/parameters/InstrumentParameterBox.cpp:155
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:92
+msgid "Track"
+msgstr ""
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:171
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:125
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:90
+msgid "Label"
+msgstr ""
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:172
+msgid "Time"
+msgstr ""
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:174
+msgid "Events"
+msgstr ""
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:175
+msgid "Polyphony"
+msgstr ""
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:176
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:126
+msgid "Repeat"
+msgstr ""
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:178
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:128
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:305
+#: ../src/gui/general/EditView.cpp:1488
+msgid "Transpose"
+msgstr ""
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:179
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:129
+msgid "Delay"
+msgstr ""
+
+#: ../src/gui/configuration/AudioConfigurationPage.h:61
+#: ../src/gui/configuration/AudioPropertiesPage.h:58
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:204
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:523
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:524
+msgid "Audio"
+msgstr ""
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:204
+#: ../src/gui/configuration/MIDIConfigurationPage.h:62
+msgid "MIDI"
+msgstr ""
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:317
+msgid "Segment Summary"
+msgstr ""
+
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:63
+msgid "Audio file path:"
+msgstr ""
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:137
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:68
+msgid "Choose..."
+msgstr ""
+
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:73
+msgid "Disk space remaining:"
+msgstr ""
+
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:78
+msgid "Equivalent minutes of 16-bit stereo:"
+msgstr ""
+
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:90
+msgid "Modify audio path"
+msgstr ""
+
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:113
+msgid "%1 out of %2 (%3% used)"
+msgstr ""
+
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:144
+msgid "minutes at"
+msgstr ""
+
+#: ../src/gui/configuration/MIDIConfigurationPage.h:63
+msgid "MIDI Settings"
+msgstr ""
+
+#: ../src/gui/configuration/AudioConfigurationPage.h:62
+#: ../src/gui/configuration/AudioPropertiesPage.h:59
+msgid "Audio Settings"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:87
+msgid "Default layout mode"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:91
+msgid "Linear layout"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:92
+msgid "Continuous page layout"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:93
+msgid "Multiple page layout"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:101
+msgid "Default spacing"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:125
+msgid "Default duration factor"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:141
+msgid "Full"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:152
+msgid "Show track headers (linear layout only)"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:158
+msgid "When needed"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:166
+msgid ""
+"\"Always\" and \"Never\" mean what they usually mean\n"
+"\"When needed\" means \"when staves are too many to all fit in the current "
+"window\""
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:178
+msgid "Show non-notation events as question marks"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:188
+msgid "Show notation-quantized notes in a different color"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:198
+msgid "Show \"invisible\" events in grey"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:208
+msgid "Show notes outside suggested playable range in red"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:218
+msgid "Highlight superimposed notes with a halo effect"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:231
+msgid "When recording MIDI, split-and-tie long notes at barlines"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:242
+msgid "Layout"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:255
+msgid "Default note style for new notes"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:287
+msgid "When inserting notes..."
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:294
+msgid "Split notes into ties to make durations match"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:295
+msgid "Ignore existing durations"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:305
+msgid "Auto-beam on insert when appropriate"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:317
+#: ../src/gui/editors/notation/NotationEraser.cpp:54
+msgid "Collapse rests after erase"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:328
+msgid "Default paste type"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:350
+msgid "Editing"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:362
+msgid "Accidentals in one octave..."
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:364
+msgid "Affect only that octave"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:365
+msgid "Require cautionaries in other octaves"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:366
+msgid "Affect all subsequent octaves"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:374
+msgid "Accidentals in one bar..."
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:376
+msgid "Affect only that bar"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:377
+msgid "Require cautionary resets in following bar"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:378
+msgid "Require explicit resets in following bar"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:386
+msgid "Key signature cancellation style"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:388
+msgid "Cancel only when entering C major or A minor"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:389
+msgid "Cancel whenever removing sharps or flats"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:390
+msgid "Cancel always"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:400
+msgid "Accidentals"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:441
+msgid "Notation font"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:467
+msgid "Origin:"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:471
+msgid "Copyright:"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:475
+msgid "Mapped by:"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:479
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:81
+msgid "Type:"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:508
+msgid "Font size for single-staff views"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:516
+msgid "Font size for multi-staff views"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:524
+msgid "Font size for printing (pt)"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:541
+msgid "Text font"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:549
+msgid "Sans-serif font"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:664
+msgid "%1 (smooth)"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:667
+msgid "%1 (jaggy)"
+msgstr ""
+
+#: ../src/gui/configuration/LatencyConfigurationPage.cpp:58
+msgid "JACK latency"
+msgstr ""
+
+#: ../src/gui/configuration/LatencyConfigurationPage.cpp:61
+msgid ""
+"Use the \"Fetch JACK latencies\" button to discover the latency values set "
+"at\n"
+"the sequencer. It's recommended that you use the returned values but it's "
+"also\n"
+"possible to override them manually using the sliders. Note that if you "
+"change\n"
+"your JACK server parameters you should always fetch the latency values "
+"again.\n"
+"The latency values will be stored by Rosegarden for use next time."
+msgstr ""
+
+#: ../src/gui/configuration/LatencyConfigurationPage.cpp:65
+msgid "JACK playback latency (in ms)"
+msgstr ""
+
+#: ../src/gui/configuration/LatencyConfigurationPage.cpp:66
+msgid "JACK record latency (in ms)"
+msgstr ""
+
+#: ../src/gui/configuration/LatencyConfigurationPage.cpp:68
+msgid "Fetch JACK latencies"
+msgstr ""
+
+#: ../src/gui/configuration/LatencyConfigurationPage.cpp:121
+msgid "JACK Latency"
+msgstr ""
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:92
+msgid "Audio preview scale"
+msgstr ""
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:96
+msgid "Linear - easier to see loud peaks"
+msgstr ""
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:97
+msgid "Meter scaling - easier to see quiet activity"
+msgstr ""
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:105
+msgid "Record audio files as"
+msgstr ""
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:107
+msgid "16-bit PCM WAV format (smaller files)"
+msgstr ""
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:108
+msgid "32-bit float WAV format (higher quality)"
+msgstr ""
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:117
+msgid "External audio editor"
+msgstr ""
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:145
+msgid "Create JACK outputs"
+msgstr ""
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:150
+msgid "for individual audio instruments"
+msgstr ""
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:157
+msgid "for submasters"
+msgstr ""
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:184
+msgid ""
+"Rosegarden can start the JACK audio daemon (jackd) for you automatically if "
+"it isn't already running when Rosegarden starts.\n"
+"\n"
+"This is recommended for beginners and those who use Rosegarden as their main "
+"audio application, but it might not be to the liking of advanced users.\n"
+"\n"
+"If you want to start JACK automatically, make sure the command includes a "
+"full path where necessary as well as any command-line arguments you want to "
+"use.\n"
+"\n"
+"For example: /usr/local/bin/jackd -d alsa -d hw -r44100 -p 2048 -n 2\n"
+"\n"
+msgstr ""
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:196
+msgid "Start JACK when Rosegarden starts"
+msgstr ""
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:201
+msgid "JACK command"
+msgstr ""
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:214
+msgid "JACK Startup"
+msgstr ""
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:224
+msgid "External audio editor path"
+msgstr ""
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:262
+msgid "External audio editor \"%1\" not found or not executable"
+msgstr ""
+
+#: ../src/gui/configuration/ColourConfigurationPage.cpp:70
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:448
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:863
+msgid "Add New Color"
+msgstr ""
+
+#: ../src/gui/configuration/ColourConfigurationPage.cpp:74
+msgid "Delete Color"
+msgstr ""
+
+#: ../src/gui/configuration/ColourConfigurationPage.cpp:93
+msgid "Color Map"
+msgstr ""
+
+#: ../src/gui/configuration/ColourConfigurationPage.cpp:128
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:983
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:882
+msgid "New Color Name"
+msgstr ""
+
+#: ../src/gui/configuration/ColourConfigurationPage.cpp:130
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:59
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:984
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:883
+#: ../src/gui/studio/DeviceManagerDialog.cpp:115
+#: ../src/gui/studio/DeviceManagerDialog.cpp:174
+msgid "New"
+msgstr ""
+
+#: ../src/gui/configuration/LatencyConfigurationPage.h:62
+msgid "Latency"
+msgstr ""
+
+#: ../src/gui/configuration/LatencyConfigurationPage.h:63
+msgid "Sequencer Latency"
+msgstr ""
+
+#: ../src/gui/configuration/ColourConfigurationPage.h:61
+msgid "Color Settings"
+msgstr ""
+
+#: ../src/gui/studio/MidiDeviceListViewItem.cpp:55
+#: ../src/gui/studio/MidiKeyMapListViewItem.cpp:44
+msgid "Key Mapping"
+msgstr ""
+
+#: ../src/gui/studio/BankEditorDialog.cpp:97
+msgid "Manage MIDI Banks and Programs"
+msgstr ""
+
+#: ../src/gui/studio/BankEditorDialog.cpp:128
+msgid "MIDI Device"
+msgstr ""
+
+#: ../src/gui/studio/BankEditorDialog.cpp:130
+#: ../src/gui/studio/BankEditorDialog.cpp:219
+msgid "MSB"
+msgstr ""
+
+#: ../src/gui/studio/BankEditorDialog.cpp:131
+#: ../src/gui/studio/BankEditorDialog.cpp:218
+msgid "LSB"
+msgstr ""
+
+#: ../src/gui/studio/BankEditorDialog.cpp:140
+msgid "Add Bank"
+msgstr ""
+
+#: ../src/gui/studio/BankEditorDialog.cpp:141
+msgid "Add Key Mapping"
+msgstr ""
+
+#: ../src/gui/studio/BankEditorDialog.cpp:153
+msgid "Add a Bank to the current device"
+msgstr ""
+
+#: ../src/gui/studio/BankEditorDialog.cpp:157
+msgid "Add a Percussion Key Mapping to the current device"
+msgstr ""
+
+#: ../src/gui/studio/BankEditorDialog.cpp:161
+msgid "Delete the current Bank or Key Mapping"
+msgstr ""
+
+#: ../src/gui/studio/BankEditorDialog.cpp:165
+msgid "Delete all Banks and Key Mappings from the current Device"
+msgstr ""
+
+#: ../src/gui/studio/BankEditorDialog.cpp:167
+#: ../src/gui/studio/DeviceManagerDialog.cpp:117
+msgid "Import..."
+msgstr ""
+
+#: ../src/gui/studio/BankEditorDialog.cpp:168
+#: ../src/gui/studio/DeviceManagerDialog.cpp:118
+msgid "Export..."
+msgstr ""
+
+#: ../src/gui/studio/BankEditorDialog.cpp:176
+msgid ""
+"Import Bank and Program data from a Rosegarden file to the current Device"
+msgstr ""
+
+#: ../src/gui/studio/BankEditorDialog.cpp:179
+msgid ""
+"Export all Device and Bank information to a Rosegarden format interchange "
+"file"
+msgstr ""
+
+#: ../src/gui/studio/BankEditorDialog.cpp:190
+msgid "Copy all Program names from current Bank to clipboard"
+msgstr ""
+
+#: ../src/gui/studio/BankEditorDialog.cpp:194
+msgid "Paste Program names from clipboard to current Bank"
+msgstr ""
+
+#: ../src/gui/studio/BankEditorDialog.cpp:216
+msgid "Show Variation list based on "
+msgstr ""
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1010
+msgid "<new bank>"
+msgstr ""
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1046
+msgid "<new mapping>"
+msgstr ""
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1048
+msgid "<new mapping %1>"
+msgstr ""
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1089
+msgid "Really delete this bank?"
+msgstr ""
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1137
+msgid "Really delete this key mapping?"
+msgstr ""
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1187
+msgid "Really delete all banks for "
+msgstr ""
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1476
+msgid "Import Banks from Device in File"
+msgstr ""
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1623
+#: ../src/gui/studio/DeviceManagerDialog.cpp:770
+msgid "Export Device as..."
+msgstr ""
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1694
+msgid ""
+"There are unsaved changes.\n"
+"Do you want to apply the changes before exiting the Bank Editor or discard "
+"the changes ?"
+msgstr ""
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1697
+msgid "Unsaved Changes"
+msgstr ""
+
+#: ../src/gui/studio/NameSetEditor.cpp:68
+msgid "Librarian"
+msgstr ""
+
+#: ../src/gui/studio/NameSetEditor.cpp:75
+msgid "Email"
+msgstr ""
+
+#: ../src/gui/studio/NameSetEditor.cpp:80
+msgid ""
+"The librarian maintains the Rosegarden device data for this device.\n"
+"If you've made modifications to suit your own device, it might be worth\n"
+"liaising with the librarian in order to publish your information for the "
+"benefit\n"
+"of others."
+msgstr ""
+
+#: ../src/gui/studio/MidiBankListViewItem.cpp:51
+#: ../src/gui/studio/MidiDeviceListViewItem.cpp:48
+msgid "Percussion Bank"
+msgstr ""
+
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:84
+#: ../src/gui/studio/MidiBankListViewItem.cpp:51
+#: ../src/gui/studio/MidiDeviceListViewItem.cpp:48
+msgid "Bank"
+msgstr ""
+
+#: ../src/gui/studio/ChangeRecordDeviceCommand.h:39
+msgid "Change Record Device"
+msgstr ""
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:61
+#: ../src/gui/studio/DeviceManagerDialog.cpp:96
+msgid "Manage MIDI Devices"
+msgstr ""
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:98
+msgid "Play devices"
+msgstr ""
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:76
+#: ../src/gui/studio/DeviceManagerDialog.cpp:106
+#: ../src/gui/studio/DeviceManagerDialog.cpp:165
+msgid "Connection"
+msgstr ""
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:119
+msgid "Banks..."
+msgstr ""
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:120
+msgid "Control Events..."
+msgstr ""
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:126
+msgid "Create a new Play device"
+msgstr ""
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:129
+#: ../src/gui/studio/DeviceManagerDialog.cpp:184
+msgid "Delete the selected device"
+msgstr ""
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:132
+msgid ""
+"Import Bank, Program and Controller data from a Rosegarden file to the "
+"selected device"
+msgstr ""
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:135
+msgid "Export Bank and Controller data to a Rosegarden interchange file"
+msgstr ""
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:138
+msgid "View and edit Banks and Programs for the selected device"
+msgstr ""
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:141
+msgid ""
+"View and edit Control Events for the selected device - these are special "
+"Event types that you can define against your device and control through "
+"Control Rulers or the Instrument Parameter Box "
+msgstr ""
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:156
+msgid "Record devices"
+msgstr ""
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:164
+msgid "Current"
+msgstr ""
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:181
+msgid "Create a new Record device"
+msgstr ""
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:360
+#: ../src/gui/studio/DeviceEditorDialog.cpp:378
+#: ../src/gui/studio/DeviceManagerDialog.cpp:486
+#: ../src/gui/studio/DeviceManagerDialog.cpp:501
+msgid "New Device"
+msgstr ""
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:703
+msgid "Import from Device in File"
+msgstr ""
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:55
+msgid "Remap Instrument assigments..."
+msgstr ""
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:62
+msgid "Device or Instrument"
+msgstr ""
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:65
+msgid "Remap Tracks by all Instruments on a Device or by single Instrument"
+msgstr ""
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:74
+msgid "Choose Source and Destination"
+msgstr ""
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:77
+msgid "From"
+msgstr ""
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:78
+msgid "To"
+msgstr ""
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:120
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:121
+msgid "<no devices>"
+msgstr ""
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:155
+msgid "Show Audio &Faders"
+msgstr ""
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:160
+msgid "Show Synth &Faders"
+msgstr ""
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:165
+msgid "Show &Submasters"
+msgstr ""
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:170
+msgid "Show &Plugin Buttons"
+msgstr ""
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:175
+msgid "Show &Unassigned Faders"
+msgstr ""
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:184
+#, c-format
+msgid ""
+"_n: 1 Input\n"
+"%n Inputs"
+msgstr ""
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:194
+msgid "No Submasters"
+msgstr ""
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:203
+#, c-format
+msgid ""
+"_n: 1 Submaster\n"
+"%n Submasters"
+msgstr ""
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:279
+msgid "Audio Mixer"
+msgstr ""
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:311
+msgid "Record input source"
+msgstr ""
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:322
+msgid "Output destination"
+msgstr ""
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:336
+#: ../src/gui/studio/AudioMixerWindow.cpp:495
+msgid "Pan"
+msgstr ""
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:355
+msgid "Mono or stereo"
+msgstr ""
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:364
+#: ../src/gui/studio/AudioMixerWindow.cpp:513
+msgid "Mute"
+msgstr ""
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:373 rc.cpp:408
+#, no-c-format
+msgid "Solo"
+msgstr ""
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:382
+msgid "Arm recording"
+msgstr ""
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:400
+#, c-format
+msgid "Audio %1"
+msgstr ""
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:404
+#, c-format
+msgid "Synth %1"
+msgstr ""
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:578
+#: ../src/gui/studio/AudioMixerWindow.cpp:580
+msgid "Audio master output level"
+msgstr ""
+
+#: ../src/gui/studio/SynthPluginManagerDialog.cpp:71
+msgid "Manage Synth Plugins"
+msgstr ""
+
+#: ../src/gui/studio/SynthPluginManagerDialog.cpp:78
+msgid "Synth plugins"
+msgstr ""
+
+#: ../src/gui/studio/SynthPluginManagerDialog.cpp:145
+msgid "Controls"
+msgstr ""
+
+#: ../src/gui/studio/SynthPluginManagerDialog.cpp:152
+msgid "Editor >>"
+msgstr ""
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:66
+#: ../src/gui/studio/MidiProgramsEditor.cpp:169
+msgid "Bank and Program details"
+msgstr ""
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:67
+msgid "Programs"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2711
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:88
+#: ../src/gui/studio/MidiProgramsEditor.cpp:93
+msgid "Percussion"
+msgstr ""
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:99
+msgid "MSB Value"
+msgstr ""
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:107
+msgid ""
+"Selects a MSB controller Bank number (MSB/LSB pairs are always unique for "
+"any Device)"
+msgstr ""
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:111
+msgid ""
+"Selects a LSB controller Bank number (MSB/LSB pairs are always unique for "
+"any Device)"
+msgstr ""
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:116
+msgid "LSB Value"
+msgstr ""
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:254
+#: ../src/gui/studio/MidiProgramsEditor.cpp:541
+#, c-format
+msgid "Key Mapping: %1"
+msgstr ""
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:476
+msgid "<no key mapping>"
+msgstr ""
+
+#: ../src/gui/studio/MidiKeyMappingEditor.cpp:57
+#: ../src/gui/studio/MidiKeyMappingEditor.cpp:81
+msgid "Key Mapping details"
+msgstr ""
+
+#: ../src/gui/studio/MidiKeyMappingEditor.cpp:58
+msgid "Pitches"
+msgstr ""
+
+#: ../src/gui/studio/MidiMixerWindow.cpp:152
+msgid "MIDI Mixer"
+msgstr ""
+
+#: ../src/gui/studio/MidiMixerWindow.cpp:199
+msgid "Volume"
+msgstr ""
+
+#: ../src/gui/studio/AudioPluginOSCGUIManager.cpp:444
+msgid "Rosegarden Plugin"
+msgstr ""
+
+#: ../src/gui/studio/AudioPluginOSCGUIManager.cpp:447
+#, c-format
+msgid "Rosegarden: %1"
+msgstr ""
+
+#: ../src/gui/studio/AudioPluginOSCGUIManager.cpp:449
+msgid "Rosegarden: %1: %2"
+msgstr ""
+
+#: ../src/gui/studio/AudioPluginOSCGUIManager.cpp:450
+#, c-format
+msgid "Plugin slot %1"
+msgstr ""
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:92
+msgid "Add Play Device"
+msgstr ""
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:93
+msgid "Add Record Device"
+msgstr ""
+
+#: ../src/commands/studio/CreateOrDeleteDeviceCommand.h:68
+#: ../src/gui/studio/DeviceEditorDialog.cpp:94
+msgid "Delete Device"
+msgstr ""
+
+#: ../src/gui/editors/segment/PlayList.cpp:77
+#: ../src/gui/studio/DeviceEditorDialog.cpp:156
+#: ../src/gui/studio/DeviceEditorDialog.cpp:361
+msgid "Play"
+msgstr ""
+
+#: ../src/commands/segment/SegmentRecordCommand.cpp:37
+#: ../src/gui/studio/DeviceEditorDialog.cpp:156
+#: ../src/gui/studio/DeviceEditorDialog.cpp:379 rc.cpp:394
+#, no-c-format
+msgid "Record"
+msgstr ""
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:256
+msgid "Apply pending changes?"
+msgstr ""
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:359
+#: ../src/gui/studio/DeviceEditorDialog.cpp:377
+msgid "<new device>"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentEraser.cpp:82
+msgid "Click on a segment to delete it"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSplitter.cpp:166
+msgid ""
+"Click on a segment to split it in two; hold Shift to avoid snapping to beat "
+"grid"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSplitter.cpp:168
+msgid "Click on a segment to split it in two"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:81
+msgid "Click and drag to select segments"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentMover.cpp:154
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:238
+msgid "Move Segment"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentMover.cpp:154
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:239
+msgid "Move Segments"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:217
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:169
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:141
+#: ../src/gui/editors/segment/segmentcanvas/SegmentMover.cpp:210
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:255
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:359
+msgid "Hold Shift to avoid snapping to beat grid"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:485
+msgid ""
+"Click and drag to select segments; middle-click and drag to draw an empty "
+"segment"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:384
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:502
+msgid ""
+"Click and drag to resize a segment; hold Ctrl as well to rescale its contents"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:386
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:504
+msgid "Click and drag to rescale segment"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:509
+msgid "Click and drag to move segments; hold Ctrl as well to copy them"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:511
+msgid "Click and drag to copy segments"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:515
+msgid ""
+"Click and drag to move segment; hold Ctrl as well to copy it; double-click "
+"to edit"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:517
+msgid "Click and drag to copy segment"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:157
+msgid ""
+"The audio file path does not exist or is not writable.\n"
+"You must set the audio file path to a valid directory in Document Properties "
+"before rescaling an audio file.\n"
+"Would you like to set it now?"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:261
+msgid ""
+"Hold Shift to avoid snapping to beat grid; hold Ctrl as well to rescale "
+"contents"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentMover.cpp:325
+msgid "Click and drag to move a segment"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentPencil.cpp:225
+msgid "Hold Shift to avoid snapping to bar lines"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentPencil.cpp:283
+msgid "Record or drop audio here"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentPencil.cpp:289
+msgid ""
+"Click and drag to draw an empty segment. Control+Alt click and drag to draw "
+"in overlap mode."
+msgstr ""
+
+#: ../src/gui/editors/segment/TrackLabel.cpp:77
+msgid ""
+"Click and hold with left mouse button to assign this Track to an Instrument."
+msgstr ""
+
+#: ../src/gui/editors/segment/TrackLabel.cpp:191
+msgid "Change track name"
+msgstr ""
+
+#: ../src/gui/editors/segment/TrackLabel.cpp:192
+msgid "Enter new track name"
+msgstr ""
+
+#: ../src/gui/editors/segment/TrackEditor.cpp:648
+msgid "Turn Repeating Segment into Real Copies"
+msgstr ""
+
+#: ../src/gui/editors/segment/TrackEditor.cpp:650
+msgid "Turn Repeating Segments into Real Copies"
+msgstr ""
+
+#: ../src/gui/editors/segment/TrackEditor.cpp:814
+msgid ""
+"You can't drop files into Rosegarden from this client. Try using Konqueror "
+"instead."
+msgstr ""
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:85
+msgid "Manage Triggered Segments"
+msgstr ""
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:89
+msgid "ID"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:735
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:93
+msgid "Base velocity"
+msgstr ""
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:94
+msgid "Triggers"
+msgstr ""
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:115
+msgid "Add a Triggered Segment"
+msgstr ""
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:119
+msgid "Delete a Triggered Segment"
+msgstr ""
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:123
+msgid "Delete All Triggered Segments"
+msgstr ""
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:127
+msgid "Close the Triggered Segment Manager"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:169
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:245
+msgid "<no label>"
+msgstr ""
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:248
+msgid ""
+"_n: %1 on 1 track\n"
+"%1 on %n tracks"
+msgstr ""
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:284
+msgid ""
+"This will remove all triggered segments from the whole composition. Are you "
+"sure?"
+msgstr ""
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:288
+msgid "Remove all triggered segments"
+msgstr ""
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:313
+msgid "Trigger Segment Duration"
+msgstr ""
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:336
+#, c-format
+msgid ""
+"_n: This triggered segment is used 1 time in the current composition. Are "
+"you sure you want to remove it?\n"
+"This triggered segment is used %n times in the current composition. Are you "
+"sure you want to remove it?"
+msgstr ""
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:400
+msgid "Pa&ste as New Triggered Segment"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1169
+#: ../src/gui/editors/segment/MarkerEditor.cpp:399
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:412
+#: ../src/gui/editors/tempo/TempoView.cpp:622
+msgid "&Musical Times"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1179
+#: ../src/gui/editors/segment/MarkerEditor.cpp:409
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:422
+#: ../src/gui/editors/tempo/TempoView.cpp:632
+msgid "&Real Times"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1189
+#: ../src/gui/editors/segment/MarkerEditor.cpp:419
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:432
+#: ../src/gui/editors/tempo/TempoView.cpp:642
+msgid "Ra&w Times"
+msgstr ""
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:83
+msgid "Manage Markers"
+msgstr ""
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:86
+msgid "Marker time "
+msgstr ""
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:87
+msgid "Marker text "
+msgstr ""
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:88
+msgid "Marker description "
+msgstr ""
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:95
+msgid "Pointer position"
+msgstr ""
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:100
+msgid "Real time:"
+msgstr ""
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:103
+msgid "In measure:"
+msgstr ""
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:121
+msgid "Add a Marker"
+msgstr ""
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:125
+msgid "Delete a Marker"
+msgstr ""
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:129
+msgid "Delete All Markers"
+msgstr ""
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:133
+msgid "Close the Marker Editor"
+msgstr ""
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:296
+msgid "Remove all markers"
+msgstr ""
+
+#: ../src/gui/editors/segment/PlayList.cpp:76
+msgid "Add..."
+msgstr ""
+
+#: ../src/gui/editors/segment/PlayList.cpp:78
+msgid "Move Up"
+msgstr ""
+
+#: ../src/gui/editors/segment/PlayList.cpp:79
+msgid "Move Down"
+msgstr ""
+
+#: ../src/gui/editors/segment/PlayList.cpp:124
+msgid "Select one or more Rosegarden files"
+msgstr ""
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:73
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:55
+msgid "<not showing>"
+msgstr ""
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:89
+msgid "Manage Control Events"
+msgstr ""
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:91
+msgid "<no device>"
+msgstr ""
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:99
+msgid " Control Events for %1 (device %2)"
+msgstr ""
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:104
+msgid "Control Event name "
+msgstr ""
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:105
+msgid "Control Event type "
+msgstr ""
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:106
+msgid "Control Event value "
+msgstr ""
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:107
+msgid "Description "
+msgstr ""
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:108
+msgid "Min "
+msgstr ""
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:109
+msgid "Max "
+msgstr ""
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:110
+msgid "Default "
+msgstr ""
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:111
+msgid "Color "
+msgstr ""
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:112
+msgid "Position on instrument panel"
+msgstr ""
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:136
+msgid "Add a Control Parameter to the Studio"
+msgstr ""
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:140
+msgid "Delete a Control Parameter from the Studio"
+msgstr ""
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:144
+msgid "Close the Control Parameter editor"
+msgstr ""
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:221
+msgid "<default>"
+msgstr ""
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:62
+msgid "Edit Control Parameter"
+msgstr ""
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:71
+msgid "Control Event Properties"
+msgstr ""
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:77
+msgid "Name:"
+msgstr ""
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:93
+msgid "Control Event value:"
+msgstr ""
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:97
+msgid "Minimum value:"
+msgstr ""
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:101
+msgid "Maximum value:"
+msgstr ""
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:105
+msgid "Default value:"
+msgstr ""
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:109
+msgid "Color:"
+msgstr ""
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:113
+msgid "Instrument Parameter Box position:"
+msgstr ""
+
+#: ../src/gui/editors/segment/TrackButtons.cpp:209
+#: ../src/gui/editors/segment/TrackButtons.cpp:585
+#: ../src/gui/editors/segment/TrackButtons.cpp:935
+#: ../src/gui/editors/segment/TrackButtons.cpp:1127
+msgid "<no instrument>"
+msgstr ""
+
+#: ../src/gui/editors/segment/TrackButtons.cpp:352
+#: ../src/gui/editors/segment/TrackButtons.cpp:1094
+msgid "<untitled audio>"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:130
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:662
+#: ../src/gui/editors/segment/TrackButtons.cpp:354
+#: ../src/gui/editors/segment/TrackButtons.cpp:1096
+msgid "<untitled>"
+msgstr ""
+
+#: ../src/gui/editors/segment/TrackButtons.cpp:1058
+msgid "Mute track"
+msgstr ""
+
+#: ../src/gui/editors/segment/TrackButtons.cpp:1063
+msgid "Record on this track"
+msgstr ""
+
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:88
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:1015
+msgid "Segment"
+msgstr ""
+
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:89
+msgid "Segment Parameters"
+msgstr ""
+
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:366
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:697
+msgid "%1 ms"
+msgstr ""
+
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:1031
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:910
+msgid "Highest playable note"
+msgstr ""
+
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:1051
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:930
+msgid "Lowest playable note"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:93
+msgid "Track Parameters"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:137
+msgid "Playback parameters"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:172
+msgid "Recording filters"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:191
+msgid "Channel"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:203
+msgid "Staff export options"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:220
+msgid "Notation size:"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:225
+msgid "Small"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:226
+msgid "Tiny"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:233
+msgid "Bracket type:"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:237
+msgid "-----"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:238
+msgid "[----"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:239
+msgid "----]"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:240
+msgid "[---]"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:241
+msgid "{----"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:242
+msgid "----}"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:243
+msgid "{[---"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:244
+msgid "---]}"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:253
+msgid "Create segments with"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:264
+msgid "Preset"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:272
+msgid "Load"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:282
+msgid "treble"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:283
+msgid "bass"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:284
+msgid "crotales"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:285
+msgid "xylophone"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:286
+msgid "guitar"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:287
+msgid "contrabass"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:288
+msgid "celesta"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:289
+msgid "old celesta"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:290
+msgid "french"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:291
+msgid "soprano"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:292
+msgid "mezzosoprano"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:293
+msgid "alto"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:294
+msgid "tenor"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:295
+msgid "baritone"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:296
+msgid "varbaritone"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:297
+msgid "subbass"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:327
+msgid "Lowest"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:329
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:336
+msgid "---"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:331
+msgid "Choose the lowest suggested playable note, using a staff"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:334
+msgid "Highest"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:338
+msgid "Choose the highest suggested playable note, using a staff"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:666
+msgid "[ Track %1 - %2 ]"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:985
+msgid "The instrument preset database is corrupt. Check your installation."
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:173
+#: ../src/gui/editors/parameters/InstrumentParameterBox.cpp:54
+msgid "Instrument Parameters"
+msgstr ""
+
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:85
+msgid "Variation"
+msgstr ""
+
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:86
+msgid "Program"
+msgstr ""
+
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:87
+msgid "Channel out"
+msgstr ""
+
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:215
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:221
+msgid "[ %1 ]"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixEraser.cpp:58
+#: ../src/gui/editors/matrix/MatrixMover.cpp:71
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:67
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:77
+msgid "Switch to Draw Tool"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:75
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:69
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:71
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:81
+#: ../src/gui/editors/notation/ClefInserter.cpp:57
+#: ../src/gui/editors/notation/GuitarChordInserter.cpp:63
+#: ../src/gui/editors/notation/NotationSelector.cpp:87
+#: ../src/gui/editors/notation/NoteInserter.cpp:113
+#: ../src/gui/editors/notation/RestInserter.cpp:72
+#: ../src/gui/editors/notation/TextInserter.cpp:61
+msgid "Switch to Erase Tool"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixEraser.cpp:62
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:73
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:75
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:85
+msgid "Switch to Move Tool"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixEraser.cpp:68
+#: ../src/gui/editors/matrix/MatrixMover.cpp:81
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:79
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:93
+msgid "Switch to Resize Tool"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:446
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:579
+msgid "Click and drag to select; middle-click and drag to draw new note"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:324
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:597
+msgid "Click and drag to resize selected notes"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:599
+msgid "Click and drag to resize note"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:471
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:604
+msgid "Click and drag to move selected notes; hold Ctrl as well to copy"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:473
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:606
+msgid "Click and drag to copy selected notes"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:610
+msgid "Click and drag to move note; hold Ctrl as well to copy"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:612
+msgid "Click and drag to copy note"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixEraser.cpp:54
+#: ../src/gui/editors/matrix/MatrixMover.cpp:67
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:65
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:63
+#: ../src/gui/editors/notation/ClefInserter.cpp:53
+#: ../src/gui/editors/notation/GuitarChordInserter.cpp:59
+#: ../src/gui/editors/notation/NotationEraser.cpp:67
+#: ../src/gui/editors/notation/NoteInserter.cpp:109
+#: ../src/gui/editors/notation/RestInserter.cpp:68
+#: ../src/gui/editors/notation/TextInserter.cpp:57
+msgid "Switch to Select Tool"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:218
+msgid "Resize Event"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:221
+msgid "Resize Events"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:326
+msgid "Click and drag to resize a note"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:328
+msgid "Copy and Move Event"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:330
+msgid "Copy and Move Events"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:334
+msgid "Move Event"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:336
+msgid "Move Events"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:465
+msgid "Click and drag to move a note; hold Ctrl as well to copy it"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:467
+msgid "Click and drag to copy a note"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:361
+msgid "Click and drag to draw a note; Shift to avoid snapping to grid"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:363
+msgid "Click and drag to draw a note"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:437
+#: ../src/gui/editors/matrix/MatrixView.cpp:3053
+msgid "Couldn't apply piano roll layout"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:663
+msgid "Resi&ze"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:669
+#: ../src/gui/editors/notation/NotationView.cpp:1919
+msgid "C&hord Insert Mode"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:676
+#: ../src/gui/editors/notation/NotationView.cpp:1778
+msgid "Ste&p Recording"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:694
+msgid "&Legato"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:708
+msgid "Set to Current Velocity"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:712
+msgid "Set Event &Velocities..."
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:716
+msgid "Trigger Se&gment..."
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:720
+msgid "Remove Triggers..."
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1153
+#: ../src/gui/editors/matrix/MatrixView.cpp:724
+#: ../src/gui/editors/tempo/TempoView.cpp:606
+msgid "Select &All"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:732
+#: ../src/gui/editors/notation/NotationView.cpp:2325
+msgid "Cursor &Back"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:736
+#: ../src/gui/editors/notation/NotationView.cpp:2329
+msgid "Cursor &Forward"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:740
+#: ../src/gui/editors/notation/NotationView.cpp:2333
+msgid "Cursor Ba&ck Bar"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:744
+#: ../src/gui/editors/notation/NotationView.cpp:2337
+msgid "Cursor For&ward Bar"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:748
+#: ../src/gui/editors/notation/NotationView.cpp:2341
+msgid "Cursor Back and Se&lect"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:752
+#: ../src/gui/editors/notation/NotationView.cpp:2345
+msgid "Cursor Forward and &Select"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:756
+#: ../src/gui/editors/notation/NotationView.cpp:2349
+msgid "Cursor Back Bar and Select"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:760
+#: ../src/gui/editors/notation/NotationView.cpp:2353
+msgid "Cursor Forward Bar and Select"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:764
+#: ../src/gui/editors/notation/NotationView.cpp:2363
+msgid "Cursor to St&art"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:770
+#: ../src/gui/editors/notation/NotationView.cpp:2369
+msgid "Cursor to &End"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:776
+#: ../src/gui/editors/notation/NotationView.cpp:2391
+msgid "Cursor to &Playback Pointer"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:820
+#: ../src/gui/editors/notation/NotationView.cpp:2435
+msgid "Playback Pointer to &Cursor"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:826
+#: ../src/gui/editors/notation/NotationView.cpp:2441
+msgid "&Solo"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:841
+#: ../src/gui/editors/notation/NotationView.cpp:2456
+msgid "Set Loop to Selection"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:845
+#: ../src/gui/editors/notation/NotationView.cpp:2460
+msgid "Clear L&oop"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1157
+#: ../src/gui/editors/matrix/MatrixView.cpp:849
+#: ../src/gui/editors/notation/NotationView.cpp:2464
+#: ../src/gui/editors/tempo/TempoView.cpp:610
+msgid "Clear Selection"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1149
+#: ../src/gui/editors/matrix/MatrixView.cpp:854
+#: ../src/gui/editors/notation/NotationView.cpp:2471
+msgid "&Filter Selection"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:879
+msgid "&No Snap"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:884
+msgid "Snap to Bea&t"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:888
+msgid "Snap to &Bar"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:908
+#, c-format
+msgid "Snap to %1"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:917
+msgid "Show Instrument Parameters"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:922
+#: ../src/gui/editors/notation/NotationView.cpp:1850
+msgid "Show Ch&ord Name Ruler"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:926
+#: ../src/gui/editors/notation/NotationView.cpp:1858
+msgid "Show &Tempo Ruler"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1238
+#: ../src/gui/editors/notation/NotationView.cpp:3245
+#, c-format
+msgid ""
+"_n: 1 event selected \n"
+" %n events selected "
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1241
+#: ../src/gui/editors/notation/NotationView.cpp:3247
+msgid " No selection "
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1348
+#: ../src/gui/editors/matrix/MatrixView.cpp:1360
+#: ../src/gui/editors/matrix/MatrixView.cpp:2079
+#: ../src/gui/editors/notation/NotationView.cpp:5869
+msgid "Quantizing..."
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1370
+#: ../src/gui/editors/notation/NotationView.cpp:5407
+msgid "Collapsing notes..."
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1381
+msgid "Making legato..."
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1476
+msgid "Note: %1 (%2.%3s)"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1531
+#: ../src/gui/editors/notation/NotationView.cpp:7206
+msgid "Time: %1 (%2.%3s)"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1604
+#: ../src/gui/editors/notation/NotationView.cpp:4744
+#: ../src/gui/editors/notation/NotationView.cpp:4773
+msgid "Cutting selection to clipboard..."
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:912
+#: ../src/gui/editors/matrix/MatrixView.cpp:1636
+#: ../src/gui/editors/notation/NotationSelectionPaster.cpp:82
+msgid "Couldn't paste at this point"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1647
+#: ../src/gui/editors/notation/NotationView.cpp:4754
+msgid "Deleting selection..."
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1833
+#: ../src/gui/editors/notation/NotationView.cpp:5617
+#, c-format
+msgid "Unknown note insert action %1"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1837
+#: ../src/gui/editors/matrix/MatrixView.cpp:2857
+#: ../src/gui/editors/notation/NotationView.cpp:5621
+msgid "Inserting note"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2091
+msgid "Unquantizing..."
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2120
+msgid " Grid: "
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2134
+msgid "Unit"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2136
+msgid "Beat"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2138
+msgid "Bar"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2159
+msgid " Velocity: "
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2170
+msgid " Quantize: "
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2584
+msgid "Raising velocities..."
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2596
+msgid "Lowering velocities..."
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2611
+msgid "Set Event Velocities"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2616
+msgid "Setting Velocities..."
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2665
+msgid "Remove Triggers"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2723
+msgid "%1 - Segment Track #%2 - %3"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2730
+msgid "%1 - All Segments - %2"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2737
+msgid ""
+"_n: %1 - 1 Segment - %2\n"
+"%1 - %n Segments - %2"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2885
+msgid "Can't insert note: No grid duration selected"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2935
+msgid " Chord "
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixEraser.cpp:105
+msgid "Click on a note to delete it"
+msgstr ""
+
+#: ../src/gui/editors/tempo/TempoView.cpp:89
+msgid "Filter"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:245
+#: ../src/gui/editors/tempo/TempoView.cpp:117
+msgid "Time "
+msgstr ""
+
+#: ../src/gui/editors/tempo/TempoView.cpp:118
+msgid "Type "
+msgstr ""
+
+#: ../src/gui/editors/tempo/TempoView.cpp:119
+msgid "Value "
+msgstr ""
+
+#: ../src/gui/editors/tempo/TempoView.cpp:120
+msgid "Properties "
+msgstr ""
+
+#: ../src/gui/editors/tempo/TempoView.cpp:208
+msgid "Common, hidden"
+msgstr ""
+
+#: ../src/gui/editors/tempo/TempoView.cpp:210
+msgid "Hidden"
+msgstr ""
+
+#: ../src/gui/editors/tempo/TempoView.cpp:213
+msgid "Common"
+msgstr ""
+
+#: ../src/gui/editors/tempo/TempoView.cpp:220
+msgid "Time Signature "
+msgstr ""
+
+#: ../src/gui/editors/tempo/TempoView.cpp:245
+msgid "%1.%2%3"
+msgstr ""
+
+#: ../src/gui/editors/tempo/TempoView.cpp:255
+msgid "%1.%2%3 qpm (%4.%5%6 bpm) "
+msgstr ""
+
+#: ../src/gui/editors/tempo/TempoView.cpp:264
+msgid "Tempo "
+msgstr ""
+
+#: ../src/gui/editors/tempo/TempoView.cpp:271
+msgid "<nothing at this filter level>"
+msgstr ""
+
+#: ../src/gui/editors/tempo/TempoView.cpp:463
+msgid "Delete Tempo or Time Signature"
+msgstr ""
+
+#: ../src/gui/editors/tempo/TempoView.cpp:602
+msgid "&Edit Item"
+msgstr ""
+
+#: ../src/gui/editors/tempo/TempoView.cpp:834
+msgid "%1 - Tempo and Time Signature Editor"
+msgstr ""
+
+#: ../src/gui/editors/guitar/GuitarChordEditorDialog.cpp:43
+msgid "Guitar Chord Editor"
+msgstr ""
+
+#: ../src/gui/editors/guitar/GuitarChordEditorDialog.cpp:51
+msgid "Start fret"
+msgstr ""
+
+#: ../src/gui/editors/guitar/GuitarChordEditorDialog.cpp:58
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:51
+msgid "Root"
+msgstr ""
+
+#: ../src/gui/editors/guitar/GuitarChordEditorDialog.cpp:62
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:55
+msgid "Extension"
+msgstr ""
+
+#: ../src/gui/editors/guitar/Fingering.cpp:118
+msgid "couldn't parse fingering '%1' in '%2'"
+msgstr ""
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:45
+msgid "Guitar Chord Selector"
+msgstr ""
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:64
+msgid "beginner"
+msgstr ""
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:65
+msgid "common"
+msgstr ""
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:66
+msgid "all"
+msgstr ""
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:86
+msgid "Fingerings"
+msgstr ""
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:419
+msgid "couldn't open file '%1'"
+msgstr ""
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:428
+#, c-format
+msgid "couldn't parse chord dictionnary : %1"
+msgstr ""
+
+#: ../src/gui/editors/notation/NoteFontViewer.cpp:87
+#, c-format
+msgid "Note Font Viewer: %1"
+msgstr ""
+
+#: ../src/gui/editors/notation/NoteFontViewer.cpp:93
+msgid " Component: "
+msgstr ""
+
+#: ../src/gui/editors/notation/NoteFontViewer.cpp:101
+msgid " View: "
+msgstr ""
+
+#: ../src/gui/editors/notation/NoteFontViewer.cpp:104
+msgid "Glyphs"
+msgstr ""
+
+#: ../src/gui/editors/notation/NoteFontViewer.cpp:105
+msgid "Codes"
+msgstr ""
+
+#: ../src/gui/editors/notation/NoteFontViewer.cpp:107
+msgid " Page: "
+msgstr ""
+
+#: ../src/gui/editors/notation/ClefInserter.cpp:64
+#: ../src/gui/editors/notation/GuitarChordInserter.cpp:71
+#: ../src/gui/editors/notation/RestInserter.cpp:79
+#: ../src/gui/editors/notation/TextInserter.cpp:68
+msgid "Switch to Inserting Notes"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:522
+msgid "Close track headers"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:917
+msgid "Preparing to print..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1516
+msgid "Note &Font"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1539
+msgid "Si&ze"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1545
+msgid "Show Track Headers"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1550
+msgid "S&pacing"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1572
+msgid "Du&ration Factor"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1598
+msgid "Note &Style"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1624
+msgid "Insert Rest"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1628
+msgid "Switch from Note to Rest"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1633
+msgid "Switch from Rest to Note"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1690
+msgid "No accidental"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1691
+msgid "Follow previous accidental"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1692
+msgid "Sharp"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1693
+msgid "Flat"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1694
+msgid "Natural"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1695
+msgid "Double sharp"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1696
+msgid "Double flat"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1717
+msgid "&Treble Clef"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1724
+msgid "&Alto Clef"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1731
+msgid "Te&nor Clef"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1738
+msgid "&Bass Clef"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1745
+msgid "&Text"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1751
+msgid "&Guitar Chord"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1784
+msgid "Select from Sta&rt"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1788
+msgid "Select to &End"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1792
+msgid "Select Whole St&aff"
+msgstr ""
+
+#: ../src/commands/edit/CutAndCloseCommand.h:53
+#: ../src/gui/editors/notation/NotationView.cpp:1796
+msgid "C&ut and Close"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1800
+msgid "Pa&ste..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:122
+#: ../src/gui/editors/notation/NotationView.cpp:1808
+msgid "Move to Staff Above"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:126
+#: ../src/gui/editors/notation/NotationView.cpp:1812
+msgid "Move to Staff Below"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1826
+msgid "&Linear Layout"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1835
+msgid "&Continuous Page Layout"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1844
+msgid "&Multiple Page Layout"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1854
+msgid "Show Ra&w Note Ruler"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1862
+msgid "Show &Annotations"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1866
+msgid "Show Lily&Pond Directives"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1870
+msgid "Open L&yric Editor"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1912
+msgid "Trip&let Insert Mode"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1926
+msgid "Grace Insert Mode"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2180
+msgid "&Dump selected events to stderr"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2248
+msgid "Ma&ke Ornament..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2252
+msgid "Trigger &Ornament..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2256
+msgid "Remove Ornament..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2261
+msgid "&None"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2289
+msgid "Convert Notation For..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2298
+msgid "Show &Notes Toolbar"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2299
+msgid "Show &Rests Toolbar"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2300
+msgid "Show &Accidentals Toolbar"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2301
+msgid "Show Cle&fs Toolbar"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2303
+msgid "Show &Marks Toolbar"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2305
+msgid "Show &Group Toolbar"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2307
+msgid "Show &Layout Toolbar"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2311
+msgid "Show M&eta Toolbar"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2373
+msgid "Cursor &Up Staff"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2377
+msgid "Cursor &Down Staff"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2381
+msgid "Cursor Pre&vious Segment"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2385
+msgid "Cursor Ne&xt Segment"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2475
+msgid "Push &Left"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2479
+msgid "Push &Right"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2483
+msgid "Push &Up"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2487
+msgid "Push &Down"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2491
+msgid "&Restore Positions"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2495
+msgid "Make &Invisible"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2499
+msgid "Make &Visible"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2503
+msgid "Toggle Dot"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2507
+#: ../src/gui/editors/notation/NotationView.cpp:2511
+msgid "Add Dot"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2570
+#, c-format
+msgid ""
+"_n: 1 pixel\n"
+"%n pixels"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2619
+msgid " Font: "
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2647
+msgid "Unknown font \"%1\", using default"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2655
+msgid " Size: "
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2677
+msgid " Spacing: "
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2993
+#: ../src/gui/editors/notation/NotationView.cpp:3818
+msgid " Ready."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2998
+msgid "Laying out score..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:3011
+msgid "Laying out staff %1..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:3020
+msgid "Reconciling staffs..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:3885
+msgid "Sizing and allocating canvas..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:4050
+msgid "note"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:4050
+msgid "rest"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:4211
+msgid "%1 - Segment Track #%2 - Notation"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:4217
+msgid "%1 - All Segments - Notation"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:4222
+msgid ""
+"_n: %1 - Segment - Notation\n"
+"%1 - %n Segments - Notation"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:4243
+msgid "Grace"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:4247
+#: ../src/gui/editors/notation/NotationView.cpp:4251
+#: ../src/gui/editors/notation/NotationView.cpp:4255
+msgid "%1 %2"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:4271
+msgid "Hidden annotations"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:4293
+msgid "Hidden LilyPond directives"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:4326
+#, c-format
+msgid "Unknown spacing action %1"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:4384
+#, c-format
+msgid "Unknown proportion action %1"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:4431
+#, c-format
+msgid "Unknown font action %1"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:4449
+#, c-format
+msgid "Unknown font size %1"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:4453
+#, c-format
+msgid "Unknown font size action %1"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:4780
+msgid ""
+"The Restricted paste type requires enough empty space (containing only "
+"rests) at the paste position to hold all of the events to be pasted.\n"
+"Not enough space was found.\n"
+"If you want to paste anyway, consider using one of the other paste types "
+"from the \"Paste...\" option on the Edit menu. You can also change the "
+"default paste type to something other than Restricted if you wish."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:4800
+msgid "Can't paste multiple Segments into one"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:4828
+#: ../src/gui/editors/notation/NotationView.cpp:4877
+msgid "Couldn't paste at this point."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:4896
+msgid "Move Events to Staff Above"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:4924
+msgid "Move Events to Staff Below"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5036
+msgid "Pushing selection left..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5047
+msgid "Pushing selection right..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5058
+msgid "Pushing selection up..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5069
+msgid "Pushing selection down..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5080
+msgid "Restoring computed positions..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5089
+msgid "Making visible..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5098
+msgid "Making invisible..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5185
+msgid "Beaming group..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5195
+msgid "Auto-beaming selection..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5205
+msgid "Breaking groups..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5293
+msgid "Untupleting..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5301
+msgid "Adding slur..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5302
+msgid "slur"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5307
+msgid "Adding phrasing slur..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5308
+msgid "phrasing slur"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5313
+msgid "Adding glissando..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5314
+msgid "glissando"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5319
+msgid "Adding crescendo..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5320
+#: ../src/gui/editors/notation/NotationView.cpp:5326
+msgid "dynamic"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5325
+msgid "Adding decrescendo..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5331
+#: ../src/gui/editors/notation/NotationView.cpp:5337
+#: ../src/gui/editors/notation/NotationView.cpp:5343
+#: ../src/gui/editors/notation/NotationView.cpp:5349
+msgid "Adding octave..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5332
+#: ../src/gui/editors/notation/NotationView.cpp:5338
+#: ../src/gui/editors/notation/NotationView.cpp:5344
+#: ../src/gui/editors/notation/NotationView.cpp:5350
+msgid "ottava"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5366
+msgid "Can't add overlapping %1 indications"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5375
+msgid "Making chord..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5387
+msgid "Normalizing rests..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5397
+msgid "Collapsing rests..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5417
+msgid "Tying notes..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5427
+msgid "Untying notes..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5437
+msgid "Making notes viable..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5447
+msgid "Removing counterpoint..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5457
+msgid "Pointing stems up..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5467
+msgid "Pointing stems down..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5478
+msgid "Restoring computed stem directions..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5488
+#: ../src/gui/editors/notation/NotationView.cpp:5498
+msgid "Positioning slurs..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5509
+msgid "Restoring slur positions..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5519
+#: ../src/gui/editors/notation/NotationView.cpp:5529
+msgid "Positioning ties..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5540
+msgid "Restoring tie positions..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5550
+msgid "Fixing notation quantization..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5560
+msgid "Removing notation quantization..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5577
+msgid "Changing to %1 style..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5585
+#, c-format
+msgid "Unknown style action %1"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5598
+#: ../src/gui/editors/notation/NotationView.cpp:5639
+#: ../src/gui/editors/notation/NotationView.cpp:5695
+msgid "No note duration selected"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5660
+msgid "No rest duration selected"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5746
+msgid "No note or rest duration selected"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5757
+#: ../src/gui/editors/notation/NotationView.cpp:5768
+#: ../src/gui/editors/notation/NotationView.cpp:5779
+#: ../src/gui/editors/notation/NotationView.cpp:5790
+#: ../src/gui/editors/notation/NotationView.cpp:5801
+#: ../src/gui/editors/notation/NotationView.cpp:5812
+#: ../src/gui/editors/notation/NotationView.cpp:5823
+msgid "Forcing accidentals..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5834
+msgid "Restoring accidentals..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5845
+msgid "Showing cautionary accidentals..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5855
+msgid "Cancelling cautionary accidentals..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5884
+msgid "Interpreting selection..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5896
+msgid "Setting note durations..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5904
+#: ../src/gui/editors/notation/NotationView.cpp:5912
+msgid "Adding dot..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5934
+msgid "Text: "
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5948
+msgid "Fingering: "
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:6036
+msgid "Ornament track %1 bar %2"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:6038
+#, c-format
+msgid "Ornament bar %1"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:6098
+msgid "Remove Ornaments"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:6145
+msgid "Estimated key signature shown"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStaff.cpp:1249
+#: ../src/gui/editors/notation/NotationView.cpp:6202
+msgid "Sustain"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:6218
+msgid ""
+"There is no sustain controller defined for this device.\n"
+"Please ensure the device is configured correctly in the Manage MIDI Devices "
+"dialog in the main window."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:7250
+msgid "Can't insert note: No note duration selected"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationEraser.cpp:61
+#: ../src/gui/editors/notation/NotationSelector.cpp:83
+msgid "Switch to Insert Tool"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotePixmapFactory.cpp:2303
+#: ../src/gui/editors/notation/NotePixmapFactory.cpp:2347
+msgid "..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NoteFontFactory.cpp:200
+msgid "Can't obtain a default font -- no fonts found"
+msgstr ""
+
+#: ../src/gui/editors/notation/NoteFontMap.cpp:52
+#: ../src/gui/general/PresetGroup.cpp:49
+msgid "unknown error"
+msgstr ""
+
+#: ../src/gui/editors/notation/NoteFontMap.cpp:78
+msgid "Can't open font mapping file %1 or %2"
+msgstr ""
+
+#: ../src/gui/editors/notation/NoteFontMap.cpp:82
+#, c-format
+msgid "Can't open font mapping file %1"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:52
+msgid "%1-dotted-%2"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:54
+msgid "%1-dotted %2"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:57
+#, c-format
+msgid "dotted-%1"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:59
+#, c-format
+msgid "dotted %1"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:83
+msgid "sixty-fourth note"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:83
+msgid "thirty-second note"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:84
+msgid "sixteenth note"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:84
+msgid "eighth note"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:85
+msgid "quarter note"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:85
+msgid "half note"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:86
+msgid "whole note"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:86
+msgid "double whole note"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:89
+msgid "sixty-fourth notes"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:89
+msgid "thirty-second notes"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:90
+msgid "sixteenth notes"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:90
+msgid "eighth notes"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:91
+msgid "quarter notes"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:91
+msgid "half notes"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:92
+msgid "whole notes"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:92
+msgid "double whole notes"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:96
+#: ../src/gui/editors/notation/NotationStrings.cpp:154
+msgid "%1 triplets"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:100
+#: ../src/gui/editors/notation/NotationStrings.cpp:158
+msgid "%1 triplet"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:143
+msgid "64th"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:143
+msgid "32nd"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:143
+msgid "16th"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:143
+msgid "8th"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:144
+msgid "quarter"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:144
+msgid "half"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:144
+msgid "whole"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:145
+msgid "double whole"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:148
+msgid "64ths"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:148
+msgid "32nds"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:148
+msgid "16ths"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:148
+msgid "8ths"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:149
+msgid "quarters"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:149
+msgid "halves"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:149
+msgid "wholes"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:150
+msgid "double wholes"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:278
+msgid "%1 ticks"
+msgstr ""
+
+#: ../src/gui/editors/notation/FontViewFrame.cpp:100
+#, c-format
+msgid "Error: Unable to match font name %1"
+msgstr ""
+
+#: ../src/gui/editors/notation/FontViewFrame.cpp:108
+msgid "Warning: No good match for font name %1 (best is %2)"
+msgstr ""
+
+#: ../src/gui/editors/notation/FontViewFrame.cpp:116
+#, c-format
+msgid "Error: Unable to open best-match font %1"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:113
+msgid "Track %1 : \"%2\""
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:119
+#, c-format
+msgid ""
+"\n"
+"Notate for: %1"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:121
+msgid "normal"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:124
+msgid "small"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:127
+msgid "tiny"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:131
+msgid "--"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:156
+msgid ""
+"\n"
+"Size: %1, Bracket: %2 "
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:183
+msgid ""
+"\n"
+"bars [%1-%2] in %3 (tr=%4) : \"%5\""
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:190
+msgid ""
+"\n"
+"bars [%1-%2] (tr=%3) : \"%4\""
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:240
+msgid "C#"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:242
+msgid "Eb"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:245
+msgid "F#"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:247
+msgid "G#"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:249
+msgid "Bb"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:352
+msgid "%1: %2"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:355
+#, c-format
+msgid " in %1"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStaff.cpp:452
+msgid "Rendering staff %1..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStaff.cpp:515
+msgid "Rendering notes on staff %1..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStaff.cpp:583
+msgid "Positioning staff %1..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationSelectionPaster.cpp:85
+msgid "Ready."
+msgstr ""
+
+#: ../src/gui/editors/notation/RestInserter.cpp:62
+msgid "Dotted rest"
+msgstr ""
+
+#: ../src/gui/editors/notation/NoteStyleFileReader.cpp:57
+#, c-format
+msgid "Can't open style file %1"
+msgstr ""
+
+#: ../src/gui/editors/notation/NoteStyleFileReader.cpp:92
+msgid "type is a required attribute of note"
+msgstr ""
+
+#: ../src/gui/editors/notation/NoteStyleFileReader.cpp:101
+#, c-format
+msgid "Unrecognised note name %1"
+msgstr ""
+
+#: ../src/gui/editors/notation/NoteStyleFileReader.cpp:108
+msgid "global element must precede note elements"
+msgstr ""
+
+#: ../src/gui/editors/notation/NoteStyleFileReader.cpp:137
+msgid ""
+"global and note elements may have shape or charname attribute, but not both"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationVLayout.cpp:493
+msgid ""
+"Spanned note at %1 has no HEIGHT_ON_STAFF property!\n"
+"This is a bug (the program would previously have crashed by now)"
+msgstr ""
+
+#: ../src/gui/editors/notation/NoteInserter.cpp:82
+msgid "Auto-Beam when appropriate"
+msgstr ""
+
+#: ../src/gui/editors/notation/NoteInserter.cpp:103
+msgid "Dotted note"
+msgstr ""
+
+#: ../src/gui/editors/notation/NoteInserter.cpp:120
+msgid "Switch to Inserting Rests"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:98
+msgid "Collapse Rests"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:102
+msgid "Respell as Flat"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:106
+msgid "Respell as Sharp"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:110
+msgid "Respell as Natural"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:114
+msgid "Collapse Notes"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:130
+msgid "Make Invisible"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:134
+msgid "Make Visible"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:129
+msgid "Event filters"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:138
+msgid "Rest"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:139
+msgid "Indication"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:141
+msgid "Other"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:161
+msgid "Triggered Segment Properties"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:166
+msgid "Label: "
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:176
+msgid "Base pitch: "
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:183
+msgid "Base velocity: "
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:246
+msgid "Duration "
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:247
+msgid "Event Type "
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:248
+msgid "Pitch "
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:249
+msgid "Velocity "
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:250
+msgid "Type (Data1) "
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:251
+msgid "Value (Data2) "
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:461
+msgid "(group %1) "
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:519
+msgid "<no events at this filter level>"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:521
+msgid "<no events>"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:696
+msgid "Segment label"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:696
+msgid "Label:"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1123
+msgid "&Insert Event"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1130
+msgid "&Delete Event"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1137
+msgid "&Edit Event"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1144
+msgid "&Advanced Event Editor"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1518
+msgid "Open in Event Editor"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1519
+msgid "Open in Expert Event Editor"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1577
+msgid "%1 - Triggered Segment: %2"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1592
+msgid "%1 - Segment Track #%2 - Event List"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1598
+msgid "%1 - %2 Segments - Event List"
+msgstr ""
+
+#: ../src/gui/rulers/TempoRuler.cpp:131
+msgid "Insert Tempo Change at Playback Position"
+msgstr ""
+
+#: ../src/gui/rulers/TempoRuler.cpp:136
+msgid "Delete Tempo Change"
+msgstr ""
+
+#: ../src/gui/rulers/TempoRuler.cpp:140
+msgid "Ramp Tempo to Next Tempo"
+msgstr ""
+
+#: ../src/gui/rulers/TempoRuler.cpp:144
+msgid "Un-Ramp Tempo"
+msgstr ""
+
+#: ../src/gui/rulers/TempoRuler.cpp:149
+msgid "Edit Tempo..."
+msgstr ""
+
+#: ../src/gui/rulers/TempoRuler.cpp:153
+msgid "Edit Time Signature..."
+msgstr ""
+
+#: ../src/gui/rulers/TempoRuler.cpp:588
+msgid "%1.%2%3 (%4.%5%6 bpm)"
+msgstr ""
+
+#: ../src/gui/rulers/TempoRuler.cpp:596
+msgid "%1.%2%3 bpm"
+msgstr ""
+
+#: ../src/gui/rulers/TempoRuler.cpp:604
+msgid "%1 - %2.%3%4"
+msgstr ""
+
+#: ../src/gui/rulers/ControlRulerEventInsertCommand.cpp:36
+msgid "Insert Controller Event"
+msgstr ""
+
+#: ../src/gui/rulers/ControlChangeCommand.cpp:35
+msgid "Control Change"
+msgstr ""
+
+#: ../src/gui/rulers/PropertyViewRuler.cpp:72
+msgid "%1 controller"
+msgstr ""
+
+#: ../src/gui/rulers/RawNoteRuler.cpp:453
+msgid "Track #%1, Segment \"%2\" (runtime id %3)"
+msgstr ""
+
+#: ../src/gui/rulers/MarkerRuler.cpp:100
+msgid "Insert Marker"
+msgstr ""
+
+#: ../src/gui/rulers/MarkerRuler.cpp:104
+msgid "Insert Marker at Playback Position"
+msgstr ""
+
+#: ../src/gui/rulers/MarkerRuler.cpp:109
+msgid "Delete Marker"
+msgstr ""
+
+#: ../src/gui/rulers/MarkerRuler.cpp:114
+msgid "Edit Marker..."
+msgstr ""
+
+#: ../src/gui/rulers/MarkerRuler.cpp:119
+msgid ""
+"Click on a marker to move the playback pointer.\n"
+"Shift-click to set a range between markers.\n"
+"Double-click to open the marker editor."
+msgstr ""
+
+#: ../src/gui/rulers/ChordNameRuler.cpp:97
+msgid ""
+"Chord name ruler.\n"
+"Turn it on and off from the Settings->Rulers menu."
+msgstr ""
+
+#: ../src/gui/rulers/ControlRulerEventEraseCommand.cpp:37
+msgid "Erase Controller Event(s)"
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:901
+#: ../src/gui/rulers/ControllerEventsRuler.cpp:188
+msgid "Unsupported Event Type"
+msgstr ""
+
+#: ../src/gui/rulers/ControllerEventsRuler.cpp:203
+msgid "Controller Events"
+msgstr ""
+
+#: ../src/gui/rulers/ControllerEventsRuler.cpp:278
+msgid "Controller Event Number"
+msgstr ""
+
+#: ../src/gui/rulers/ControllerEventsRuler.cpp:471
+msgid "Add line of controllers"
+msgstr ""
+
+#: ../src/gui/rulers/LoopRuler.cpp:89
+msgid ""
+"Click and drag to move the playback pointer.\n"
+"Shift-click and drag to set a range for looping or editing.\n"
+"Shift-click to clear the loop or range.\n"
+"Double-click to start playback."
+msgstr ""
+
+#: ../src/gui/general/EditViewBase.cpp:228
+msgid "Set Segment Start Time..."
+msgstr ""
+
+#: ../src/gui/general/EditViewBase.cpp:232
+msgid "Set Segment Duration..."
+msgstr ""
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:56
+msgid "Load track parameters preset"
+msgstr ""
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:62
+msgid "Convert notation for..."
+msgstr ""
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:86
+msgid "Select preset track parameters for:"
+msgstr ""
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:87
+msgid "Create appropriate notation for:"
+msgstr ""
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:89
+msgid "Category"
+msgstr ""
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:95
+msgid "Player Ability"
+msgstr ""
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:97
+msgid "Amateur"
+msgstr ""
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:98
+msgid "Professional"
+msgstr ""
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:104
+msgid "Only selected segments"
+msgstr ""
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:106
+msgid "All segments in this track"
+msgstr ""
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:111
+msgid "Only for new segments"
+msgstr ""
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:113
+msgid "Convert existing segments"
+msgstr ""
+
+#: ../src/gui/general/MidiPitchLabel.cpp:39
+#, c-format
+msgid "C%1"
+msgstr ""
+
+#: ../src/gui/general/MidiPitchLabel.cpp:39
+#, c-format
+msgid "C#%1"
+msgstr ""
+
+#: ../src/gui/general/MidiPitchLabel.cpp:39
+#, c-format
+msgid "D%1"
+msgstr ""
+
+#: ../src/gui/general/MidiPitchLabel.cpp:39
+#, c-format
+msgid "D#%1"
+msgstr ""
+
+#: ../src/gui/general/MidiPitchLabel.cpp:40
+#, c-format
+msgid "E%1"
+msgstr ""
+
+#: ../src/gui/general/MidiPitchLabel.cpp:40
+#, c-format
+msgid "F%1"
+msgstr ""
+
+#: ../src/gui/general/MidiPitchLabel.cpp:40
+#, c-format
+msgid "F#%1"
+msgstr ""
+
+#: ../src/gui/general/MidiPitchLabel.cpp:40
+#, c-format
+msgid "G%1"
+msgstr ""
+
+#: ../src/gui/general/MidiPitchLabel.cpp:41
+#, c-format
+msgid "G#%1"
+msgstr ""
+
+#: ../src/gui/general/MidiPitchLabel.cpp:41
+#, c-format
+msgid "A%1"
+msgstr ""
+
+#: ../src/gui/general/MidiPitchLabel.cpp:41
+#, c-format
+msgid "A#%1"
+msgstr ""
+
+#: ../src/gui/general/MidiPitchLabel.cpp:41
+#, c-format
+msgid "B%1"
+msgstr ""
+
+#: ../src/gui/general/PresetGroup.cpp:95
+#, c-format
+msgid "Can't open preset file %1"
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:744
+msgid "&Halve Durations"
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:748
+msgid "&Double Durations"
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:806
+msgid "Show Velocity Property Ruler"
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:825
+msgid "Insert item"
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:831
+msgid "Erase selected items"
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:835
+msgid "Clear ruler"
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:839
+msgid "Insert line of controllers"
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:843
+msgid "Flip forward"
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:847
+msgid "Flip backwards"
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:851
+msgid "Draw property line"
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:855
+msgid "Select all property values"
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:894
+msgid "%1 Controller %2 %3"
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:1066
+msgid "I"
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:1066
+msgid "II"
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:1066
+msgid "III"
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:1066
+msgid "IV"
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:1067
+msgid "V"
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:1067
+msgid "VI"
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:1067
+msgid "VII"
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:1067
+msgid "VIII"
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:1069
+msgid "%1 flat"
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:1070
+msgid "%1 sharp"
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:1085
+msgid "&Insert Note"
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:1091
+msgid "&Upper Octave"
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:1096
+msgid "&Lower Octave"
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:1268
+msgid "Estimated time signature shown"
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:1431
+msgid "Halving durations..."
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:1445
+msgid "Doubling durations..."
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:1469
+msgid "Rescaling..."
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:1489
+msgid "By number of semitones: "
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:1496 ../src/gui/general/EditView.cpp:1518
+msgid "Transposing..."
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:1536
+msgid "Transposing up one semitone..."
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:1545
+msgid "Transposing up one octave..."
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:1554
+msgid "Transposing down one semitone..."
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:1563
+msgid "Transposing down one octave..."
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:1575
+msgid "Inverting..."
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:1587
+msgid "Retrograding..."
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:1599
+msgid "Retrograde inverting..."
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:1608
+msgid "Jogging left..."
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:1623
+msgid "Jogging right..."
+msgstr ""
+
+#: ../src/sound/AudioFileManager.cpp:660
+#, c-format
+msgid "Downloading file %1"
+msgstr ""
+
+#: ../src/sound/AudioFileManager.cpp:735
+msgid "Converting audio file..."
+msgstr ""
+
+#: ../src/sound/AudioFileManager.cpp:737
+msgid "Resampling audio file..."
+msgstr ""
+
+#: ../src/sound/AudioFileManager.cpp:739
+msgid "Converting and resampling audio file..."
+msgstr ""
+
+#: ../src/sound/AudioFileManager.cpp:741
+msgid "Importing audio file..."
+msgstr ""
+
+#: ../src/sound/AudioFileManager.cpp:794
+msgid "Failed to convert or resample audio file on import"
+msgstr ""
+
+#: ../src/sequencer/main.cpp:46 ../src/sequencer/main.cpp:86
+msgid "RosegardenSequencer"
+msgstr ""
+
+#: ../src/sequencer/main.cpp:54
+msgid "JACK playback and capture ports"
+msgstr ""
+
+#: ../src/commands/segment/SegmentSyncCommand.cpp:38
+#: ../src/commands/segment/SegmentSyncCommand.cpp:44
+#: ../src/commands/segment/SegmentSyncCommand.cpp:55
+#: ../src/commands/segment/SegmentSyncCommand.cpp:63
+msgid "Sync segment parameters"
+msgstr ""
+
+#: ../src/commands/segment/RenameTrackCommand.h:52
+msgid "Rename Track"
+msgstr ""
+
+#: ../src/commands/segment/SegmentRepeatToCopyCommand.cpp:39
+msgid "Turn Repeats into Copies"
+msgstr ""
+
+#: ../src/commands/segment/SegmentTransposeCommand.cpp:36
+#: ../src/commands/segment/SegmentTransposeCommand.cpp:42
+msgid "Change segment transposition"
+msgstr ""
+
+#: ../src/commands/edit/RescaleCommand.h:50
+#: ../src/commands/segment/AudioSegmentRescaleCommand.h:62
+#: ../src/commands/segment/SegmentRescaleCommand.h:58
+msgid "Stretch or S&quash..."
+msgstr ""
+
+#: ../src/commands/segment/SegmentLabelCommand.h:52
+msgid "Re&label..."
+msgstr ""
+
+#: ../src/commands/segment/AudioSegmentResizeFromStartCommand.cpp:39
+#: ../src/commands/segment/SegmentResizeFromStartCommand.cpp:39
+msgid "Resize Segment"
+msgstr ""
+
+#: ../src/commands/segment/RemoveTempoChangeCommand.h:58
+msgid "Remove &Tempo Change..."
+msgstr ""
+
+#: ../src/commands/segment/SegmentEraseCommand.cpp:40
+#: ../src/commands/segment/SegmentEraseCommand.cpp:52
+msgid "Erase Segment"
+msgstr ""
+
+#: ../src/commands/segment/AudioSegmentRescaleCommand.cpp:126
+#: ../src/commands/segment/SegmentRescaleCommand.cpp:102
+msgid "(rescaled)"
+msgstr ""
+
+#: ../src/commands/segment/AudioSegmentRescaleCommand.cpp:127
+#: ../src/commands/segment/SegmentRescaleCommand.cpp:105
+msgid "%1 (rescaled)"
+msgstr ""
+
+#: ../src/commands/segment/PasteToTriggerSegmentCommand.cpp:47
+msgid "Paste as New Triggered Segment"
+msgstr ""
+
+#: ../src/commands/segment/SegmentColourMapCommand.h:52
+msgid "Change Segment Color Map..."
+msgstr ""
+
+#: ../src/commands/segment/SegmentQuickCopyCommand.h:55
+msgid "Quick-Copy Segment"
+msgstr ""
+
+#: ../src/commands/segment/AudioSegmentSplitCommand.cpp:42
+msgid "Split Audio Segment"
+msgstr ""
+
+#: ../src/commands/segment/AudioSegmentSplitCommand.cpp:103
+#: ../src/commands/segment/SegmentSplitCommand.cpp:135
+msgid " (split)"
+msgstr ""
+
+#: ../src/commands/segment/AudioSegmentSplitCommand.cpp:104
+#: ../src/commands/segment/SegmentSplitByRecordingSrcCommand.cpp:120
+#: ../src/commands/segment/SegmentSplitByRecordingSrcCommand.cpp:122
+#: ../src/commands/segment/SegmentSplitCommand.cpp:136
+msgid "%1 (split)"
+msgstr ""
+
+#: ../src/commands/segment/SegmentLabelCommand.cpp:40
+msgid "Label Segments"
+msgstr ""
+
+#: ../src/commands/segment/OpenOrCloseRangeCommand.cpp:43
+msgid "Open or Close Range"
+msgstr ""
+
+#: ../src/commands/edit/TransposeCommand.h:55
+#: ../src/commands/segment/SegmentTransposeCommand.h:54
+msgid "Transpose by &Interval..."
+msgstr ""
+
+#: ../src/commands/segment/SegmentAutoSplitCommand.cpp:148
+msgid "%1 (part)"
+msgstr ""
+
+#: ../src/commands/segment/AudioSegmentInsertCommand.cpp:51
+#: ../src/commands/segment/SegmentInsertCommand.cpp:43
+#: ../src/commands/segment/SegmentInsertCommand.cpp:56
+msgid "Create Segment"
+msgstr ""
+
+#: ../src/commands/segment/AudioSegmentInsertCommand.cpp:114
+msgid "%1 (inserted)"
+msgstr ""
+
+#: ../src/commands/segment/AudioSegmentInsertCommand.cpp:117
+msgid "unknown audio file"
+msgstr ""
+
+#: ../src/commands/segment/CreateTempoMapFromSegmentCommand.cpp:40
+msgid "Set Tempos from Beat Segment"
+msgstr ""
+
+#: ../src/commands/segment/SegmentSplitByRecordingSrcCommand.h:52
+msgid "Split by &Recording Source..."
+msgstr ""
+
+#: ../src/commands/segment/SegmentColourMapCommand.cpp:40
+msgid "Change Segment Color Map"
+msgstr ""
+
+#: ../src/commands/edit/CopyCommand.cpp:64
+#: ../src/commands/segment/SegmentQuickCopyCommand.cpp:57
+msgid "%1 (copied)"
+msgstr ""
+
+#: ../src/commands/segment/SegmentColourCommand.h:52
+msgid "Change Segment Color..."
+msgstr ""
+
+#: ../src/commands/segment/SegmentSplitByPitchCommand.cpp:170
+msgid "%1 (upper)"
+msgstr ""
+
+#: ../src/commands/segment/SegmentSplitByPitchCommand.cpp:172
+msgid "%1 (lower)"
+msgstr ""
+
+#: ../src/commands/segment/SegmentSingleRepeatToCopyCommand.cpp:39
+msgid "Turn Single Repeat into Copy"
+msgstr ""
+
+#: ../src/commands/segment/AddTempoChangeCommand.h:58
+msgid "Add Te&mpo Change..."
+msgstr ""
+
+#: ../src/commands/segment/AudioSegmentAutoSplitCommand.h:57
+#: ../src/commands/segment/SegmentAutoSplitCommand.h:53
+msgid "&Split on Silence"
+msgstr ""
+
+#: ../src/commands/segment/SetTriggerSegmentBaseVelocityCommand.cpp:39
+msgid "Set Base Velocity"
+msgstr ""
+
+#: ../src/commands/segment/DeleteRangeCommand.cpp:43
+#: ../src/commands/segment/EraseSegmentsStartingInRangeCommand.cpp:39
+msgid "Delete Range"
+msgstr ""
+
+#: ../src/commands/segment/ChangeCompositionLengthCommand.h:53
+msgid "Change &Composition Start and End..."
+msgstr ""
+
+#: ../src/commands/segment/MoveTracksCommand.h:51
+msgid "Move Tracks..."
+msgstr ""
+
+#: ../src/commands/segment/SegmentColourCommand.cpp:39
+msgid "Change Segment Color"
+msgstr ""
+
+#: ../src/commands/segment/AudioSegmentDistributeCommand.h:66
+msgid "Distribute Audio Segments over MIDI"
+msgstr ""
+
+#: ../src/commands/segment/AudioSegmentAutoSplitCommand.cpp:147
+msgid "%1 (autosplit %2)"
+msgstr ""
+
+#: ../src/commands/segment/SetTriggerSegmentDefaultRetuneCommand.cpp:39
+msgid "Set Default Retune"
+msgstr ""
+
+#: ../src/commands/segment/AddTimeSignatureCommand.h:52
+msgid "Add Time Si&gnature Change..."
+msgstr ""
+
+#: ../src/commands/segment/AddTriggerSegmentCommand.cpp:42
+msgid "Add Triggered Segment"
+msgstr ""
+
+#: ../src/commands/segment/SetTriggerSegmentDefaultTimeAdjustCommand.cpp:39
+msgid "Set Default Time Adjust"
+msgstr ""
+
+#: ../src/commands/segment/RemoveTimeSignatureCommand.h:58
+msgid "Remove &Time Signature Change..."
+msgstr ""
+
+#: ../src/commands/segment/SegmentCommandRepeat.cpp:39
+msgid "Repeat Segments"
+msgstr ""
+
+#: ../src/commands/segment/AddTracksCommand.h:55
+msgid "Add Tracks..."
+msgstr ""
+
+#: ../src/commands/segment/ModifyDefaultTempoCommand.h:51
+msgid "Modify &Default Tempo..."
+msgstr ""
+
+#: ../src/commands/segment/SegmentSplitByPitchCommand.h:61
+msgid "Split by &Pitch..."
+msgstr ""
+
+#: ../src/commands/segment/DeleteTriggerSegmentCommand.cpp:40
+msgid "Delete Triggered Segment"
+msgstr ""
+
+#: ../src/commands/segment/SegmentSplitCommand.cpp:42
+msgid "Split Segment"
+msgstr ""
+
+#: ../src/commands/segment/DeleteTracksCommand.h:51
+msgid "Delete Tracks..."
+msgstr ""
+
+#: ../src/commands/segment/InsertRangeCommand.cpp:42
+msgid "Insert Range"
+msgstr ""
+
+#: ../src/commands/segment/DeleteRangeCommand.h:62
+msgid "Rejoin Command"
+msgstr ""
+
+#: ../src/commands/segment/SetTriggerSegmentBasePitchCommand.cpp:39
+msgid "Set Base Pitch"
+msgstr ""
+
+#: ../src/commands/segment/PasteConductorDataCommand.cpp:41
+msgid "Paste Tempos and Time Signatures"
+msgstr ""
+
+#: ../src/commands/segment/SegmentSyncClefCommand.cpp:34
+msgid "Sync segment clef"
+msgstr ""
+
+#: ../src/commands/matrix/MatrixInsertionCommand.cpp:46
+#: ../src/commands/notation/NoteInsertionCommand.cpp:54
+msgid "Insert Note"
+msgstr ""
+
+#: ../src/commands/matrix/MatrixEraseCommand.cpp:41
+msgid "Erase Note"
+msgstr ""
+
+#: ../src/commands/matrix/MatrixPercussionInsertionCommand.cpp:47
+msgid "Insert Percussion Note"
+msgstr ""
+
+#: ../src/commands/matrix/MatrixModifyCommand.cpp:43
+msgid "Move Note"
+msgstr ""
+
+#: ../src/commands/matrix/MatrixModifyCommand.cpp:43
+msgid "Modify Note"
+msgstr ""
+
+#: ../src/commands/edit/PasteEventsCommand.cpp:98
+msgid "Paste into an existing gap [\"restricted\"]"
+msgstr ""
+
+#: ../src/commands/edit/PasteEventsCommand.cpp:100
+msgid "Erase existing events to make room [\"simple\"]"
+msgstr ""
+
+#: ../src/commands/edit/PasteEventsCommand.cpp:102
+msgid "Move existing events out of the way [\"open-n-paste\"]"
+msgstr ""
+
+#: ../src/commands/edit/PasteEventsCommand.cpp:104
+msgid "Overlay notes, tying against present notes [\"note-overlay\"]"
+msgstr ""
+
+#: ../src/commands/edit/PasteEventsCommand.cpp:106
+msgid "Overlay notes, ignoring present notes [\"matrix-overlay\"]"
+msgstr ""
+
+#: ../src/commands/edit/AddDotCommand.h:52
+msgid "&Add Dot"
+msgstr ""
+
+#: ../src/commands/edit/RemoveMarkerCommand.h:55
+msgid "&Remove Marker"
+msgstr ""
+
+#: ../src/commands/edit/EventUnquantizeCommand.cpp:43
+#: ../src/commands/edit/EventUnquantizeCommand.cpp:54
+msgid "Unquantize Events"
+msgstr ""
+
+#: ../src/commands/edit/ChangeVelocityCommand.h:53
+msgid "&Increase Velocity"
+msgstr ""
+
+#: ../src/commands/edit/ChangeVelocityCommand.h:54
+msgid "&Reduce Velocity"
+msgstr ""
+
+#: ../src/commands/edit/CopyCommand.cpp:46
+msgid "(excerpt)"
+msgstr ""
+
+#: ../src/commands/edit/CopyCommand.cpp:60
+msgid "(copied)"
+msgstr ""
+
+#: ../src/commands/edit/EventInsertionCommand.cpp:39
+msgid "Insert Event"
+msgstr ""
+
+#: ../src/commands/edit/InsertTriggerNoteCommand.cpp:55
+msgid "Insert Trigger Note"
+msgstr ""
+
+#: ../src/commands/edit/CollapseNotesCommand.h:50
+msgid "Collapse &Equal-Pitch Notes"
+msgstr ""
+
+#: ../src/commands/edit/TransposeCommand.h:61
+msgid "&Up a Semitone"
+msgstr ""
+
+#: ../src/commands/edit/TransposeCommand.h:62
+msgid "&Down a Semitone"
+msgstr ""
+
+#: ../src/commands/edit/TransposeCommand.h:63
+msgid "Up an &Octave"
+msgstr ""
+
+#: ../src/commands/edit/TransposeCommand.h:64
+msgid "Down an Octa&ve"
+msgstr ""
+
+#: ../src/commands/edit/TransposeCommand.h:65
+msgid "&Transpose by Semitones..."
+msgstr ""
+
+#: ../src/commands/edit/SetNoteTypeCommand.h:56
+msgid "&Set Note Type"
+msgstr ""
+
+#: ../src/commands/edit/EventEditCommand.h:55
+msgid "Edit E&vent"
+msgstr ""
+
+#: ../src/commands/edit/AddMarkerCommand.h:54
+msgid "&Add Marker"
+msgstr ""
+
+#: ../src/commands/edit/SelectionPropertyCommand.h:66
+msgid "Set &Property"
+msgstr ""
+
+#: ../src/commands/edit/CutCommand.h:55
+msgid "Cu&t"
+msgstr ""
+
+#: ../src/commands/edit/EventQuantizeCommand.cpp:114
+msgid "Heuristic Notation &Quantize"
+msgstr ""
+
+#: ../src/commands/edit/EventQuantizeCommand.cpp:116
+msgid "Grid &Quantize"
+msgstr ""
+
+#: ../src/commands/edit/ClearTriggersCommand.h:52
+msgid "&Clear Triggers"
+msgstr ""
+
+#: ../src/commands/edit/RetrogradeCommand.h:51
+msgid "&Retrograde"
+msgstr ""
+
+#: ../src/commands/edit/InvertCommand.h:51
+msgid "&Invert"
+msgstr ""
+
+#: ../src/commands/edit/SetTriggerCommand.h:64
+msgid "Tri&gger Segment"
+msgstr ""
+
+#: ../src/commands/edit/SetLyricsCommand.h:50
+msgid "Edit L&yrics"
+msgstr ""
+
+#: ../src/commands/edit/MoveAcrossSegmentsCommand.cpp:73
+msgid "&Move Events to Other Segment"
+msgstr ""
+
+#: ../src/commands/edit/RetrogradeInvertCommand.h:51
+msgid "Re&trograde Invert"
+msgstr ""
+
+#: ../src/commands/edit/ModifyMarkerCommand.h:55
+msgid "&Modify Marker"
+msgstr ""
+
+#: ../src/commands/studio/AddControlParameterCommand.h:61
+msgid "&Add Control Parameter"
+msgstr ""
+
+#: ../src/commands/studio/ModifyInstrumentMappingCommand.h:55
+msgid "Modify &Instrument Mapping"
+msgstr ""
+
+#: ../src/commands/studio/RemoveControlParameterCommand.h:60
+msgid "&Remove Control Parameter"
+msgstr ""
+
+#: ../src/commands/studio/ReconnectDeviceCommand.h:55
+msgid "Reconnect Device"
+msgstr ""
+
+#: ../src/commands/studio/ModifyDeviceCommand.h:68
+msgid "Modify &MIDI Bank"
+msgstr ""
+
+#: ../src/commands/studio/CreateOrDeleteDeviceCommand.h:68
+msgid "Create Device"
+msgstr ""
+
+#: ../src/commands/studio/ModifyDeviceMappingCommand.h:55
+msgid "Modify &Device Mapping"
+msgstr ""
+
+#: ../src/commands/studio/RenameDeviceCommand.h:55
+msgid "Rename Device"
+msgstr ""
+
+#: ../src/commands/studio/ModifyControlParameterCommand.h:61
+msgid "&Modify Control Parameter"
+msgstr ""
+
+#: ../src/commands/notation/TieNotesCommand.h:49
+msgid "&Tie"
+msgstr ""
+
+#: ../src/commands/notation/ClefInsertionCommand.cpp:74
+msgid "Add Cle&f Change..."
+msgstr ""
+
+#: ../src/commands/notation/GuitarChordInsertionCommand.cpp:40
+msgid "Insert Guitar Chord"
+msgstr ""
+
+#: ../src/commands/notation/RespellCommand.cpp:47
+#, c-format
+msgid "Respell with %1"
+msgstr ""
+
+#: ../src/commands/notation/RespellCommand.cpp:50
+msgid "Do&uble Sharp"
+msgstr ""
+
+#: ../src/commands/notation/RespellCommand.cpp:52
+msgid "&Sharp"
+msgstr ""
+
+#: ../src/commands/notation/RespellCommand.cpp:54
+msgid "&Flat"
+msgstr ""
+
+#: ../src/commands/notation/RespellCommand.cpp:56
+msgid "Dou&ble Flat"
+msgstr ""
+
+#: ../src/commands/notation/RespellCommand.cpp:58
+msgid "&Natural"
+msgstr ""
+
+#: ../src/commands/notation/RespellCommand.cpp:60
+msgid "N&one"
+msgstr ""
+
+#: ../src/commands/notation/RespellCommand.cpp:66
+msgid "Respell Accidentals &Upward"
+msgstr ""
+
+#: ../src/commands/notation/RespellCommand.cpp:69
+msgid "Respell Accidentals &Downward"
+msgstr ""
+
+#: ../src/commands/notation/RespellCommand.cpp:72
+msgid "&Restore Accidentals"
+msgstr ""
+
+#: ../src/commands/notation/RespellCommand.cpp:75
+msgid "Respell Accidentals"
+msgstr ""
+
+#: ../src/commands/notation/DeCounterpointCommand.h:55
+msgid "Split-and-Tie Overlapping &Chords"
+msgstr ""
+
+#: ../src/commands/notation/BeamCommand.h:49
+msgid "&Beam Group"
+msgstr ""
+
+#: ../src/commands/notation/AddTextMarkCommand.h:51
+msgid "Add Te&xt Mark..."
+msgstr ""
+
+#: ../src/commands/notation/RestoreSlursCommand.h:49
+msgid "&Restore Slur Positions"
+msgstr ""
+
+#: ../src/commands/notation/SustainInsertionCommand.h:56
+msgid "Add Pedal &Press"
+msgstr ""
+
+#: ../src/commands/notation/SustainInsertionCommand.h:58
+msgid "Add Pedal &Release"
+msgstr ""
+
+#: ../src/commands/notation/FixNotationQuantizeCommand.h:49
+msgid "Fi&x Notation Quantization"
+msgstr ""
+
+#: ../src/commands/notation/ChangeStemsCommand.h:51
+msgid "Stems &Up"
+msgstr ""
+
+#: ../src/commands/notation/ChangeStemsCommand.h:51
+msgid "Stems &Down"
+msgstr ""
+
+#: ../src/commands/notation/MakeAccidentalsCautionaryCommand.cpp:43
+msgid "Use &Cautionary Accidentals"
+msgstr ""
+
+#: ../src/commands/notation/MakeAccidentalsCautionaryCommand.cpp:45
+msgid "Cancel C&autionary Accidentals"
+msgstr ""
+
+#: ../src/commands/notation/SetVisibilityCommand.h:50
+msgid "Set Visibility"
+msgstr ""
+
+#: ../src/commands/notation/ChangeStyleCommand.h:53
+msgid "Change &Note Style"
+msgstr ""
+
+#: ../src/commands/notation/TextInsertionCommand.cpp:41
+msgid "Insert Text"
+msgstr ""
+
+#: ../src/commands/notation/InterpretCommand.h:70
+msgid "&Interpret..."
+msgstr ""
+
+#: ../src/commands/notation/TupletCommand.h:53
+msgid "&Triplet"
+msgstr ""
+
+#: ../src/commands/notation/TupletCommand.h:54
+msgid "Tu&plet..."
+msgstr ""
+
+#: ../src/commands/notation/UnTupletCommand.h:50
+msgid "&Untuplet"
+msgstr ""
+
+#: ../src/commands/notation/CollapseRestsCommand.h:54
+msgid "&Collapse Rests"
+msgstr ""
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:145
+msgid "Add S&lur"
+msgstr ""
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:147
+msgid "Add &Phrasing Slur"
+msgstr ""
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:149
+msgid "Add Double-Octave Up"
+msgstr ""
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:151
+msgid "Add Octave &Up"
+msgstr ""
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:153
+msgid "Add Octave &Down"
+msgstr ""
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:155
+msgid "Add Double Octave Down"
+msgstr ""
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:160
+msgid "Add &Crescendo"
+msgstr ""
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:162
+msgid "Add &Decrescendo"
+msgstr ""
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:164
+msgid "Add &Glissando"
+msgstr ""
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:167
+msgid "Add &%1%2"
+msgstr ""
+
+#: ../src/commands/notation/RemoveNotationQuantizeCommand.h:49
+msgid "Remo&ve Notation Quantization"
+msgstr ""
+
+#: ../src/commands/notation/MakeChordCommand.h:50
+msgid "Make &Chord"
+msgstr ""
+
+#: ../src/commands/notation/MultiKeyInsertionCommand.h:63
+msgid "Change all to &Key %1..."
+msgstr ""
+
+#: ../src/commands/notation/KeyInsertionCommand.h:67
+#: ../src/commands/notation/MultiKeyInsertionCommand.h:65
+msgid "Add &Key Change..."
+msgstr ""
+
+#: ../src/commands/notation/RestoreStemsCommand.h:49
+msgid "&Restore Stems"
+msgstr ""
+
+#: ../src/commands/notation/MakeNotesViableCommand.h:55
+#: ../src/commands/notation/MakeRegionViableCommand.h:52
+msgid "Tie Notes at &Barlines"
+msgstr ""
+
+#: ../src/commands/notation/AddSlashesCommand.h:46
+msgid "Slashes"
+msgstr ""
+
+#: ../src/commands/notation/ChangeSlurPositionCommand.h:51
+msgid "Slur &Above"
+msgstr ""
+
+#: ../src/commands/notation/ChangeSlurPositionCommand.h:51
+msgid "Slur &Below"
+msgstr ""
+
+#: ../src/commands/notation/NormalizeRestsCommand.h:54
+msgid "&Normalize Rests"
+msgstr ""
+
+#: ../src/commands/notation/TextChangeCommand.cpp:41
+msgid "Edit Text"
+msgstr ""
+
+#: ../src/commands/notation/RemoveMarksCommand.h:49
+msgid "&Remove All Marks"
+msgstr ""
+
+#: ../src/commands/notation/AutoBeamCommand.h:52
+msgid "&Auto-Beam"
+msgstr ""
+
+#: ../src/commands/notation/UntieNotesCommand.h:49
+msgid "&Untie"
+msgstr ""
+
+#: ../src/commands/notation/AddMarkCommand.cpp:48
+msgid "S&forzando"
+msgstr ""
+
+#: ../src/commands/notation/AddMarkCommand.cpp:50
+msgid "Sta&ccato"
+msgstr ""
+
+#: ../src/commands/notation/AddMarkCommand.cpp:52
+msgid "R&inforzando"
+msgstr ""
+
+#: ../src/commands/notation/AddMarkCommand.cpp:54
+msgid "T&enuto"
+msgstr ""
+
+#: ../src/commands/notation/AddMarkCommand.cpp:56
+msgid "Tri&ll"
+msgstr ""
+
+#: ../src/commands/notation/AddMarkCommand.cpp:58
+msgid "Trill &with Line"
+msgstr ""
+
+#: ../src/commands/notation/AddMarkCommand.cpp:60
+msgid "Trill Line"
+msgstr ""
+
+#: ../src/commands/notation/AddMarkCommand.cpp:62
+msgid "&Turn"
+msgstr ""
+
+#: ../src/commands/notation/AddMarkCommand.cpp:64
+msgid "&Accent"
+msgstr ""
+
+#: ../src/commands/notation/AddMarkCommand.cpp:66
+msgid "&Staccatissimo"
+msgstr ""
+
+#: ../src/commands/notation/AddMarkCommand.cpp:68
+msgid "&Marcato"
+msgstr ""
+
+#: ../src/commands/notation/AddMarkCommand.cpp:70
+msgid "&Pause"
+msgstr ""
+
+#: ../src/commands/notation/AddMarkCommand.cpp:72
+msgid "&Up-Bow"
+msgstr ""
+
+#: ../src/commands/notation/AddMarkCommand.cpp:74
+msgid "&Down-Bow"
+msgstr ""
+
+#: ../src/commands/notation/AddMarkCommand.cpp:76
+msgid "Mo&rdent"
+msgstr ""
+
+#: ../src/commands/notation/AddMarkCommand.cpp:78
+msgid "Inverted Mordent"
+msgstr ""
+
+#: ../src/commands/notation/AddMarkCommand.cpp:80
+msgid "Long Mordent"
+msgstr ""
+
+#: ../src/commands/notation/AddMarkCommand.cpp:82
+msgid "Lon&g Inverted Mordent"
+msgstr ""
+
+#: ../src/commands/notation/AddMarkCommand.cpp:84
+msgid "&%1%2"
+msgstr ""
+
+#: ../src/commands/notation/AddMarkCommand.cpp:89
+#, c-format
+msgid "Add %1"
+msgstr ""
+
+#: ../src/commands/notation/ResetDisplacementsCommand.h:49
+msgid "Restore Positions"
+msgstr ""
+
+#: ../src/commands/notation/IncrementDisplacementsCommand.h:52
+msgid "Fine Reposition"
+msgstr ""
+
+#: ../src/commands/notation/RestoreTiesCommand.h:49
+msgid "&Restore Tie Positions"
+msgstr ""
+
+#: ../src/commands/notation/ChangeTiePositionCommand.h:47
+msgid "Tie &Above"
+msgstr ""
+
+#: ../src/commands/notation/ChangeTiePositionCommand.h:47
+msgid "Tie &Below"
+msgstr ""
+
+#: ../src/commands/notation/KeyInsertionCommand.h:65
+msgid "Change to &Key %1..."
+msgstr ""
+
+#: ../src/commands/notation/RemoveFingeringMarksCommand.h:49
+msgid "&Remove Fingerings"
+msgstr ""
+
+#: ../src/commands/notation/BreakCommand.h:49
+msgid "&Unbeam"
+msgstr ""
+
+#: ../src/commands/notation/UnGraceCommand.h:48
+msgid "Ung&race"
+msgstr ""
+
+#: ../src/commands/notation/AddFingeringMarkCommand.cpp:45
+msgid "Add Other &Fingering..."
+msgstr ""
+
+#: ../src/commands/notation/AddFingeringMarkCommand.cpp:47
+msgid "Add Fingering &0 (Thumb)"
+msgstr ""
+
+#: ../src/commands/notation/AddFingeringMarkCommand.cpp:49
+#, c-format
+msgid "Add Fingering &%1"
+msgstr ""
+
+#: ../src/document/io/HydrogenXMLHandler.cpp:277
+msgid " imported from Hydrogen "
+msgstr ""
+
+#: ../src/document/io/LilyPondExporter.cpp:404
+msgid ""
+"LilyPond does not allow spaces or backslashes in filenames.\n"
+"\n"
+"Would you like to use\n"
+"\n"
+" %1\n"
+"\n"
+" instead?"
+msgstr ""
+
+#: ../src/document/io/LilyPondExporter.cpp:2054
+msgid "warning: overlong bar truncated here"
+msgstr ""
+
+#: ../src/document/io/LilyPondExporter.cpp:2060
+msgid "warning: bar too short, padding with rests"
+msgstr ""
+
+#: ../src/document/MultiViewCommandHistory.cpp:318
+msgid "Nothing to undo"
+msgstr ""
+
+#: ../src/document/MultiViewCommandHistory.cpp:320
+msgid "Nothing to redo"
+msgstr ""
+
+#: ../src/document/MultiViewCommandHistory.cpp:328
+#: ../src/document/MultiViewCommandHistory.cpp:372
+#, c-format
+msgid "Und&o %1"
+msgstr ""
+
+#: ../src/document/MultiViewCommandHistory.cpp:330
+#: ../src/document/MultiViewCommandHistory.cpp:374
+#, c-format
+msgid "Re&do %1"
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:328
+msgid ""
+"The current file has been modified.\n"
+"Do you want to save it?"
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:480
+#, c-format
+msgid ""
+"_n: Delete the 1 audio file recorded during the unsaved session?\n"
+"Delete the %n audio files recorded during the unsaved session?"
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:501
+msgid ""
+"The following audio files were recorded during this session but have been "
+"unloaded\n"
+"from the audio file manager, and so are no longer in use in the document you "
+"are saving.\n"
+"\n"
+"You may want to clean up these files to save disk space.\n"
+"\n"
+"Please select any you wish to delete permanently from the hard disk.\n"
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:517
+#, c-format
+msgid ""
+"_n: <qt>About to delete 1 audio file permanently from the hard disk."
+"<br>There will be no way to recover this file.<br>Are you sure?</qt>\n"
+"\n"
+"<qt>About to delete %n audio files permanently from the hard disk.<br>There "
+"will be no way to recover these files.<br>Are you sure?</qt>"
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:580
+msgid "Can't open file '%1'"
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:585
+msgid "Reading file..."
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:603
+msgid "Could not open Rosegarden file"
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:641
+msgid "Error when parsing file '%1': \"%2\""
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:689
+msgid "Generating audio previews..."
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:721
+msgid "Merge"
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:1605
+msgid "File load cancelled"
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:1625
+msgid ""
+"<h3>Audio and plugins not available</h3><p>This composition uses audio files "
+"or plugins, but Rosegarden is currently running without audio because the "
+"JACK audio server was not available on startup.</p><p>Please exit "
+"Rosegarden, start the JACK audio server and re-start Rosegarden if you wish "
+"to load this complete composition.</p><p><b>WARNING:</b> If you re-save this "
+"composition, all audio and plugin data and settings in it will be lost.</p>"
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:1628
+msgid ""
+"<h3>Audio and plugins not available</h3><p>This composition uses audio files "
+"or plugins, but you are running a version of Rosegarden that was compiled "
+"without audio support.</p><p><b>WARNING:</b> If you re-save this composition "
+"from this version of Rosegarden, all audio and plugin data and settings in "
+"it will be lost.</p>"
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:1665
+msgid ""
+"<h3>Incorrect audio sample rate</h3><p>This composition contains audio files "
+"that were recorded or imported with the audio server running at a different "
+"sample rate (%1 Hz) from the current JACK server sample rate (%2 Hz).</"
+"p><p>Rosegarden will play this composition at the correct speed, but any "
+"audio files in it will probably sound awful.</p><p>Please consider re-"
+"starting the JACK server at the correct rate (%3 Hz) and re-loading this "
+"composition before you do any more work with it.</p>"
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:1675
+msgid ""
+"<h3>Inconsistent audio sample rates</h3><p>This composition contains audio "
+"files at more than one sample rate.</p><p>Rosegarden will play them at the "
+"correct speed, but any audio files that were recorded or imported at rates "
+"different from the current JACK server sample rate (%1 Hz) will probably "
+"sound awful.</p><p>Please see the audio file manager dialog for more "
+"details, and consider resampling any files that are at the wrong rate.</p>"
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:1676
+msgid "Inconsistent sample rates"
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:1690
+msgid ""
+"<h3>Plugins not found</h3><p>The following audio plugins could not be loaded:"
+"</p><ul>"
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:1698
+msgid "<li>%1 (from %2)</li>"
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:1712
+msgid ""
+"This file contains one or more old element types that are now deprecated.\n"
+"Support for these elements may disappear in future versions of Rosegarden.\n"
+"We recommend you re-save this file from this version of Rosegarden to ensure "
+"that it can still be re-loaded in future versions."
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:2207
+msgid "Insert Recorded MIDI"
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:2560
+msgid "%1 (recorded)"
+msgstr ""
+
+#: ../src/document/RoseXmlHandler.cpp:442
+msgid ""
+"This file was written by Rosegarden %1, and it uses\n"
+"a different file format that cannot be read by this version."
+msgstr ""
+
+#: ../src/document/RoseXmlHandler.cpp:452
+msgid ""
+"This file was written by Rosegarden %1, which is more recent than this "
+"version.\n"
+"There may be some incompatibilities with the file format."
+msgstr ""
+
+#: ../src/document/RoseXmlHandler.cpp:1687
+msgid "Loading plugins..."
+msgstr ""
+
+#: rc.cpp:6 rc.cpp:144
+#, no-c-format
+msgid "Se&gment"
+msgstr ""
+
+#: rc.cpp:9 rc.cpp:84 rc.cpp:147 rc.cpp:303
+#, no-c-format
+msgid "Edit &With"
+msgstr ""
+
+#: rc.cpp:12 rc.cpp:21 rc.cpp:30 rc.cpp:39 rc.cpp:345
+#, no-c-format
+msgid "Actions Toolbar"
+msgstr ""
+
+#: rc.cpp:15 rc.cpp:33 rc.cpp:129 rc.cpp:285
+#, no-c-format
+msgid "Time Toolbar"
+msgstr ""
+
+#: rc.cpp:18 rc.cpp:36 rc.cpp:57 rc.cpp:63 rc.cpp:120 rc.cpp:243 rc.cpp:342
+#, no-c-format
+msgid "Transport Toolbar"
+msgstr ""
+
+#: rc.cpp:24 rc.cpp:42 rc.cpp:123 rc.cpp:348
+#, no-c-format
+msgid "Zoom Toolbar"
+msgstr ""
+
+#: rc.cpp:45 rc.cpp:60 rc.cpp:99 rc.cpp:228 rc.cpp:327
+#, no-c-format
+msgid "T&ransport"
+msgstr ""
+
+#: rc.cpp:51
+#, no-c-format
+msgid "Number of Stereo &Inputs"
+msgstr ""
+
+#: rc.cpp:54
+#, no-c-format
+msgid "&Number of Submasters"
+msgstr ""
+
+#: rc.cpp:66
+#, no-c-format
+msgid "&Import"
+msgstr ""
+
+#: rc.cpp:69
+#, no-c-format
+msgid "&Merge"
+msgstr ""
+
+#: rc.cpp:72
+#, no-c-format
+msgid "&Export"
+msgstr ""
+
+#: rc.cpp:75 rc.cpp:141 rc.cpp:297
+#, no-c-format
+msgid "&Composition"
+msgstr ""
+
+#: rc.cpp:78
+#, no-c-format
+msgid "&Studio"
+msgstr ""
+
+#: rc.cpp:81
+#, no-c-format
+msgid "Se&gments"
+msgstr ""
+
+#: rc.cpp:90
+#, no-c-format
+msgid "Trac&ks"
+msgstr ""
+
+#: rc.cpp:93
+#, no-c-format
+msgid "Set &Instrument"
+msgstr ""
+
+#: rc.cpp:102 rc.cpp:234 rc.cpp:333
+#, no-c-format
+msgid "&Toolbars"
+msgstr ""
+
+#: rc.cpp:105 rc.cpp:237 rc.cpp:336
+#, no-c-format
+msgid "&Rulers"
+msgstr ""
+
+#: rc.cpp:111 rc.cpp:240 rc.cpp:339
+#, no-c-format
+msgid "Tools Toolbar"
+msgstr ""
+
+#: rc.cpp:114
+#, no-c-format
+msgid "Tracks Toolbar"
+msgstr ""
+
+#: rc.cpp:117
+#, no-c-format
+msgid "Editors Toolbar"
+msgstr ""
+
+#: rc.cpp:135
+#, no-c-format
+msgid "&Layout Mode"
+msgstr ""
+
+#: rc.cpp:138 rc.cpp:294
+#, no-c-format
+msgid "Add Event Ruler"
+msgstr ""
+
+#: rc.cpp:150
+#, no-c-format
+msgid "N&ote"
+msgstr ""
+
+#: rc.cpp:153
+#, no-c-format
+msgid "Mar&ks"
+msgstr ""
+
+#: rc.cpp:156
+#, no-c-format
+msgid "&Ornaments"
+msgstr ""
+
+#: rc.cpp:159
+#, no-c-format
+msgid "&Fingerings"
+msgstr ""
+
+#: rc.cpp:162
+#, no-c-format
+msgid "S&lashes"
+msgstr ""
+
+#: rc.cpp:165 rc.cpp:219
+#, no-c-format
+msgid "&Accidentals"
+msgstr ""
+
+#: rc.cpp:168
+#, no-c-format
+msgid "&Phrase"
+msgstr ""
+
+#: rc.cpp:171
+#, no-c-format
+msgid "Slur &Position"
+msgstr ""
+
+#: rc.cpp:174
+#, no-c-format
+msgid "Tie &Position"
+msgstr ""
+
+#: rc.cpp:177
+#, no-c-format
+msgid "&Octaves"
+msgstr ""
+
+#: rc.cpp:180 rc.cpp:306
+#, no-c-format
+msgid "Ad&just"
+msgstr ""
+
+#: rc.cpp:183
+#, no-c-format
+msgid "R&ests"
+msgstr ""
+
+#: rc.cpp:186 rc.cpp:213
+#, no-c-format
+msgid "&Notes"
+msgstr ""
+
+#: rc.cpp:189 rc.cpp:309
+#, no-c-format
+msgid "&Quantize"
+msgstr ""
+
+#: rc.cpp:195 rc.cpp:315
+#, no-c-format
+msgid "Trans&pose"
+msgstr ""
+
+#: rc.cpp:198 rc.cpp:318
+#, no-c-format
+msgid "Convert"
+msgstr ""
+
+#: rc.cpp:201
+#, no-c-format
+msgid "&Fine Positioning"
+msgstr ""
+
+#: rc.cpp:204
+#, no-c-format
+msgid "Fine Ti&ming"
+msgstr ""
+
+#: rc.cpp:207
+#, no-c-format
+msgid "&Visibility"
+msgstr ""
+
+#: rc.cpp:216
+#, no-c-format
+msgid "&Rests"
+msgstr ""
+
+#: rc.cpp:222
+#, no-c-format
+msgid "&Clefs"
+msgstr ""
+
+#: rc.cpp:225 rc.cpp:324
+#, no-c-format
+msgid "Local &Cursor"
+msgstr ""
+
+#: rc.cpp:246
+#, no-c-format
+msgid "Notes Toolbar"
+msgstr ""
+
+#: rc.cpp:249
+#, no-c-format
+msgid "Rests Toolbar"
+msgstr ""
+
+#: rc.cpp:252
+#, no-c-format
+msgid "Clefs Toolbar"
+msgstr ""
+
+#: rc.cpp:255
+#, no-c-format
+msgid "Accidentals Toolbar"
+msgstr ""
+
+#: rc.cpp:258
+#, no-c-format
+msgid "Group Toolbar"
+msgstr ""
+
+#: rc.cpp:261
+#, no-c-format
+msgid "Marks Toolbar"
+msgstr ""
+
+#: rc.cpp:264
+#, no-c-format
+msgid "Meta Toolbar"
+msgstr ""
+
+#: rc.cpp:267
+#, no-c-format
+msgid "Layout Toolbar"
+msgstr ""
+
+#: rc.cpp:270 rc.cpp:351
+#, no-c-format
+msgid "Control Ruler actions"
+msgstr ""
+
+#: rc.cpp:273 rc.cpp:354
+#, no-c-format
+msgid "Property Ruler actions"
+msgstr ""
+
+#: rc.cpp:276
+#, no-c-format
+msgid "&Action"
+msgstr ""
+
+#: rc.cpp:279
+#, no-c-format
+msgid "General Toolbar"
+msgstr ""
+
+#: rc.cpp:291
+#, no-c-format
+msgid "&Grid"
+msgstr ""
+
+#: rc.cpp:300
+#, no-c-format
+msgid "&Segment"
+msgstr ""
+
+#: rc.cpp:361
+#, no-c-format
+msgid "Hide additional controls"
+msgstr ""
+
+#: rc.cpp:365
+#, no-c-format
+msgid "Panic Button"
+msgstr ""
+
+#: rc.cpp:368
+#, no-c-format
+msgid "Resets all MIDI devices if you've got stuck notes"
+msgstr ""
+
+#: rc.cpp:375
+#, no-c-format
+msgid "Provides a metronome click for you to play along with"
+msgstr ""
+
+#: rc.cpp:378
+#, no-c-format
+msgid "Shows MIDI activity in and out of Rosegarden"
+msgstr ""
+
+#: rc.cpp:381
+#, no-c-format
+msgid "IN"
+msgstr ""
+
+#: rc.cpp:384
+#, no-c-format
+msgid "OUT"
+msgstr ""
+
+#: rc.cpp:387 rc.cpp:390
+#, no-c-format
+msgid "NO EVENTS"
+msgstr ""
+
+#: rc.cpp:397
+#, no-c-format
+msgid "Record either MIDI or audio"
+msgstr ""
+
+#: rc.cpp:401
+#, no-c-format
+msgid "Loop"
+msgstr ""
+
+#: rc.cpp:404
+#, no-c-format
+msgid "Turn on and off the loop markers (if set)"
+msgstr ""
+
+#: rc.cpp:411
+#, no-c-format
+msgid "Mutes all but the currently selected track"
+msgstr ""
+
+#: rc.cpp:415
+#, no-c-format
+msgid "Start loop or range here"
+msgstr ""
+
+#: rc.cpp:419
+#, no-c-format
+msgid "End loop or range here"
+msgstr ""
+
+#: rc.cpp:422
+#, no-c-format
+msgid "SIG"
+msgstr ""
+
+#: rc.cpp:425
+#, no-c-format
+msgid "DIV"
+msgstr ""
+
+#: rc.cpp:428
+#, no-c-format
+msgid "/16"
+msgstr ""
+
+#: rc.cpp:431
+#, no-c-format
+msgid "TEMPO"
+msgstr ""
+
+#: rc.cpp:434
+#, no-c-format
+msgid "END"
+msgstr ""
+
+#: rc.cpp:437
+#, no-c-format
+msgid "BAR"
+msgstr ""
+
+#: rc.cpp:441
+#, no-c-format
+msgid "Switch between real time, musical time, and frame count"
+msgstr ""
+
+#: rc.cpp:445
+#, no-c-format
+msgid "Show additional controls"
+msgstr ""
+
+#: rc.cpp:449
+#, no-c-format
+msgid "Rewind"
+msgstr ""
+
+#: rc.cpp:452
+#, no-c-format
+msgid "Moves the current pointer position back one bar."
+msgstr ""
+
+#: rc.cpp:456
+#, no-c-format
+msgid "Rewind to beginning"
+msgstr ""
+
+#: rc.cpp:459
+#, no-c-format
+msgid ""
+"Moves the pointer position to the start of the composition. (This may mean "
+"going forwards if the pointer is currently before the start.)"
+msgstr ""
+
+#: rc.cpp:463
+#, no-c-format
+msgid "Play/Pause"
+msgstr ""
+
+#: rc.cpp:466
+#, no-c-format
+msgid ""
+"Plays from the current pointer position, or pauses playback if already in "
+"progress."
+msgstr ""
+
+#: rc.cpp:473
+#, no-c-format
+msgid "Stops playback or recording."
+msgstr ""
+
+#: rc.cpp:477
+#, no-c-format
+msgid "Fast forward"
+msgstr ""
+
+#: rc.cpp:480
+#, no-c-format
+msgid "Moves the current pointer position forwards one bar."
+msgstr ""
+
+#: rc.cpp:484
+#, no-c-format
+msgid "Fast forward to end"
+msgstr ""
+
+#: rc.cpp:487
+#, no-c-format
+msgid ""
+"Moves the pointer position to the end of the composition. (This may mean "
+"going backwards if the pointer is already beyond the end.)"
+msgstr ""
+
+#: rc.cpp:491
+#, no-c-format
+msgid "Display time to end"
+msgstr ""
+
+#: ../docs/en/tips.cpp:3
+msgid ""
+"<p>To configure a track to play using a particular instrument:</p>\n"
+"&nbsp;&nbsp;* click on the track label and hold a moment<br>\n"
+"&nbsp;&nbsp;* select an output device<br>\n"
+"&nbsp;&nbsp;* select one of that device's available instruments (#1 - #16)"
+"<br>\n"
+"&nbsp;&nbsp;* adjust that instrument's output channel, program, bank, and\n"
+"controllers via the instrument parameters box\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:13
+msgid ""
+"<p>...that Rosegarden has an autosave feature?<br><br>\n"
+"You can select your autosave interval from <b>Settings->Configure\n"
+"Rosegarden</b>.<br><br>\n"
+"When something goes awry, such as a power outage or a Rosegarden crash\n"
+"(unfortunately, it happens...) simply load the file you were working on, and "
+"you'll be given the\n"
+"option to load the autosaved version, or the unmodified original.</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:23
+msgid ""
+"<p>\n"
+"...that you can save the current document as your default studio by using\n"
+"<b>Composition -> Studio -> Save Current Document as Default Studio</b>?</"
+"p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:30
+msgid ""
+"<p>...that your default studio is a complete Rosegarden composition that "
+"gets\n"
+"loaded every time you create a new document or import a MIDI file?</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:36
+msgid ""
+"<p>...that your default studio can contain instrument assignments, document "
+"properties, LilyPond headers,\n"
+"and many other things?<br><br>The default studio is a complete Rosegarden "
+"composition, so it can contain anything that you may wish to have available "
+"in each\n"
+"new document you create.</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:43
+msgid ""
+"<p>...that Rosegarden will detect and create a default connection for ALSA "
+"soft\n"
+"synth applications that are started after Rosegarden is already running?</"
+"p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:49
+msgid ""
+"<p>...that you can make your default studio override that in every "
+"Rosegarden composition you load?<br><br>If your studio setup does not change "
+"very often, and you would prefer for\n"
+"the settings in your default studio to take precedence over whatever\n"
+"studio is saved with any files you happen to load, you can make your studio "
+"the default for everything using <b>Settings -> Configure Rosegarden ->\n"
+"MIDI -> Always use default studio when loading files</b>.</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:57
+msgid ""
+"<p>If you have accidentally recorded a segment so short that it does not\n"
+"appear on the canvas, which you can only hear during subsequent recording\n"
+"sessions, you can gain access to it by using <b>Composition -> Change\n"
+"Composition Start and End</b> and then setting the composition to start at a "
+"negative number.</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:65
+msgid ""
+"<p>...that if you place a note at the wrong pitch using the notation or "
+"matrix editor, you can move it one semitone at a time with the up and down "
+"arrow keys on your keyboard?</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:70
+msgid ""
+"<p>...that you can toggle stem directions in the notation editor by "
+"selecting\n"
+"one or more notes and using Ctrl-PageUp and Ctrl-PageDown?</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:76
+msgid ""
+"<p>...that you can change the accidental used for a note in the notation "
+"editor (without changing the pitch of the note) by selecting\n"
+"it and using the up and down arrow keys with both Ctrl and Shift pressed?</"
+"p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:82 ../docs/en/tips.cpp:93
+msgid ""
+"<p>...that you can hold down the Shift key while repositioning segments on "
+"the\n"
+"segment canvas in order to avoid the \"snap-to\" effect and exert finer "
+"control?</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:88
+msgid ""
+"<p>...that you can use the arrow tool to draw, move, and resize segments and "
+"events as well as to select them?<br><br>Drag a segment or event block to "
+"move it, drag the right edge of a block to resize it, and drag with the "
+"middle mouse button pressed to draw a new segment or event.<br><br>(Of "
+"course, the dedicated draw, move and resize tools are still quicker for "
+"repeated operations.)</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:99
+msgid ""
+"<p>...that you can hold down the Shift key while repositioning or resizing "
+"events in the\n"
+"matrix view in order to avoid the \"snap-to\" effect and exert finer control?"
+"</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:105
+msgid ""
+"<p>...that you can edit multiple segments on multiple tracks simultaneously "
+"in\n"
+"the notation editor? Simply select the segments, then use <b>Edit -> Open "
+"in Notation Editor</b>.</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:111
+msgid ""
+"<p>...that Rosegarden can export files for use by LilyPond, the high-quality "
+"score typesetting system?<br><br>\n"
+"From the <b>File</b> menu, navigate to <b>Export -> Export LilyPond File</"
+"b></p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:117
+msgid ""
+"<p>...that Rosegarden can print via LilyPond, the high-quality score "
+"typesetting system?<br><br>\n"
+"From the <b>File</b> menu, navigate to <b>Preview with LilyPond</b>. The "
+"file\n"
+"will be exported, rendered, and a preview will appear in KPDF, or one of\n"
+"several other PDF viewers, where it can then be printed as well.</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:125
+msgid ""
+"<p>...that if you use the quantizer from within the notation view, you can "
+"tell it to quantize only the timing used for notation -- making it possible "
+"to have good looking notation <b>and</b> a human MIDI performance?</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:130
+msgid ""
+"<p>...that you can change segment labels using the controls on the Segment "
+"Parameters box\n"
+"in the main window?</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:136
+msgid ""
+"<p>...that the number of tracks in new documents is based on the contents "
+"of\n"
+"your autoload.rg file?\n"
+"<br><br>\n"
+"Whether you prefer to start with three tracks or 43, create a document that\n"
+"contains the desired number of tracks, plus any other studio or document "
+"properties settings\n"
+"you wish to configure, and use <b>Composition -> Studio -> Save Current "
+"Document as Default\n"
+"Studio</b> to make this your new default.</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:147
+msgid ""
+"<p>...that you can change the name of a track by double clicking on the "
+"label? (The\n"
+"label must be visible for this to work.)</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:153
+msgid ""
+"<p>...that you can configure what happens when you double-click on a segment?"
+"<br><br>Go to <b>Settings -> Configure Rosegarden</b> and choose your "
+"preferred editing window under the <b>Behaviour</b> tab.</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:158
+msgid ""
+"<p>...that Rosegarden is being developed as a community effort with\n"
+"contributions from around the world?<br><br>\n"
+"The four most active developers live in London (England), Cannes, "
+"Barcelona,\n"
+"and... Christiansburg? (Christiansburg is a town of about 50,000 in\n"
+"southwestern Virginia, USA.)<br><br>\n"
+"We have had contributors from elsewhere in the US, UK, Spain, Mexico, "
+"Argentina, Germany,\n"
+"Sweden, Russia, Japan, Finland, and Italy, just to name a few...</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:169
+msgid ""
+"<p>...that Rosegarden is available in Spanish, French, German, Russian, "
+"Welsh, Swedish, Italian and Estonian\n"
+"translations? (Just to name a few.)<br><br>\n"
+"If you're interested in translating Rosegarden to another language, drop us "
+"a\n"
+"line at <b>[email protected]</b>.</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:177
+msgid ""
+"<p>...that you can change the total number of bars in the composition via\n"
+"<b>Composition -> Change Composition Start and End</b>?</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:183
+msgid ""
+"<p>...that you can see the difference between performance and display "
+"duration\n"
+"of duration-quantized notes in the notation editor?<br><br>\n"
+"Use <b>Settings -> Show Raw Note Ruler</b> to turn on this handy\n"
+"feature.<br><br>\n"
+"<i>Note that this feature does not work in page layout view.</i></p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:192
+msgid ""
+"<p>...that you can add tempo and time-signature changes by double-clicking "
+"on the values displayed in the transport window or tempo rulers?</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:197
+msgid ""
+"<p>...that the transport window can display musical time, sample frame "
+"count, and a visual metronome as well as real time?<br><br>Just click on the "
+"small button at the extreme top left of the window.</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:202
+msgid ""
+"<p>...that you can select all notes of a particular pitch in the matrix "
+"view, by shift-clicking on that pitch on the piano keyboard at the left?"
+"<br><br>If you shift-click-drag, you can select whole ranges too.</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:207
+msgid ""
+"<p>...that you can set a loop in the main window by clicking-and-dragging on "
+"the time ruler with Shift pressed?<br><br>(If the ruler isn't visible, use "
+"<b>Settings -> Show Rulers</b>.)</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:212
+msgid ""
+"<p>...that if you're editing a section in the matrix or notation view, you "
+"can\n"
+"set that section to loop while you edit it?<br><br>Select it and use "
+"<b>Tools ->\n"
+"Local Cursor -> Set Loop to Selection</b>, then hit Play.</p><br><br>\n"
+"<i>This feature does not work quite as well for compositions that include "
+"sampled\n"
+"audio.</i>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:221
+msgid ""
+"<p>...if you have more than one note or controller event at the same time, "
+"you\n"
+"can use the [ and ] keys to flip the stack of events around on the "
+"controller\n"
+"and velocity rulers in order to bring the item you wish to adjust into\n"
+"focus.</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:229
+msgid ""
+"<p>...that the notation view shows you notes using their display duration, "
+"while the\n"
+"matrix allows you to edit their performance duration?<br><br>\n"
+"<i>Be careful with tied notes in the matrix. It is not apparent that they "
+"are\n"
+"tied, and if you split up a pair of tied notes, subsequent notation views "
+"will\n"
+"be confused and unhappy. This is an old bug that has been on our TODO list\n"
+"for years. Sorry about that, folks. Patches welcome.</i>\n"
+"</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:240
+msgid ""
+"<p>If you're working with a human performance and you need to insert some "
+"new\n"
+"notes, these new notes will sound for their entire written duration. To "
+"blend\n"
+"these new notes into a human performance, select them, then use <b>Adjust -> "
+"Interpret...</b> \n"
+"from the notation view to interpret any marks and massage their "
+"performance\n"
+"durations to something less mechanical.</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:249
+msgid ""
+"<p>...that Rosegarden can export certain things to LilyPond that it cannot "
+"yet\n"
+"display within its own native interface?<br><br>These new directives can be "
+"inserted\n"
+"via the <b>T</b> text insert tool in the notation view.<br><br>\n"
+"Load the example files\n"
+"<b>lilypond-alternative-endings.rg</b> and <b>lilypond-directives.rg</b> for "
+"a\n"
+"demonstration of how to use the new exportable directives.<br><br>\n"
+"Use <b>File -> Preview with\n"
+"LilyPond</b> to see what they look like on the exported page.<br><br>\n"
+"<i>Be sure to turn on\n"
+"<b>Settings -> Show LilyPond Directives</b> and <b>Show Annotations</b> "
+"within\n"
+"the notation view.</i></p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:264
+msgid ""
+"<p>...that Rosegarden has track parameters allowing you to <b>Create "
+"segments with:</b> certain\n"
+"properties by default?<br><br>You can pre-select the clef, transposition, "
+"colour, and specify\n"
+"the highest and lowest playable notes (notes outside this range display in\n"
+"red by default). Then draw a segment with the pencil, or record one, and "
+"any\n"
+"new segments created on this track will take these properties as segment\n"
+"parameters.<br><br>\n"
+"<i>These parameters do not apply to audio tracks.</i></p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:275
+msgid ""
+"<p>...that Rosegarden has a database of preset parameters describing more "
+"than 300\n"
+"musical instruments from the real world, grouped into several convenient\n"
+"categories?<br><br>Each preset contains a clef, transposition, and playable "
+"range\n"
+"suggestions for both amateur and professional players.<br><br>Click the\n"
+"<b>Load</b> button in the new track parameters box to get started! <i>(If "
+"you\n"
+"do not see a <b>Load</b> button, be sure your parameter panel is set for\n"
+"tabbed mode, rather than stacked mode.)</i> <br><br> <i>(Special thanks to "
+"Magnus\n"
+"Johansson for assembling this extraordinary database.)</i></p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:287
+msgid ""
+"<p>...that when exporting to Lilypond, you can merge tracks that have the "
+"same name onto a single staff?<br><br>For example, if there are three voices "
+"in a single part, write each\n"
+"voice as an independent segment/staff, each on a separate track. Give all\n"
+"three tracks the same name, and select <b>[x] Merge tracks that have the "
+"same\n"
+"name</b> from the options dialog that appears when you export to, or "
+"preview\n"
+"with LilyPond.<br><br>\n"
+"<i>The tracks must have a non-default name for this to work.</i></p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:297
+msgid ""
+" \t \n"
+"<p>...that you can use the mouse wheel to scroll up and down, scroll left "
+"and right, and zoom in and out?<br><br>Just roll the wheel to scroll up or "
+"down. Hold Alt as well to scroll left or right, or hold Ctrl to zoom in and "
+"out.</p> \t \n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:303
+msgid ""
+" \t \n"
+"<p>...that you can time-stretch an audio segment -- stretching or squashing "
+"a\n"
+"sample to a different duration without changing its pitch -- just by\n"
+"dragging its right edge with the Ctrl key pressed?</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:311
+msgid ""
+" \t \n"
+"<p>...that you can add audio to your Rosegarden composition just by dragging "
+"an audio file from your file manager and dropping it on the Rosegarden "
+"segment canvas? (Make sure you drop it on an audio track!)<br><br>You can "
+"also drop audio files from Rosegarden's audio file manager window onto the "
+"segment canvas, and from other programs onto the audio file manager.</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:317
+msgid ""
+" \t \n"
+"<p>...that you can set the tempo to match the duration of an audio segment "
+"if you know it's an exact number of bars or beats long?<br><br>Just select "
+"the audio segment and use <b>Composition -> Tempo and Time Signature -> Set "
+"Tempo to Audio Segment Duration</b>.</p>\n"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:1
+msgid "Feta Pixmaps"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:2 ../data/fonts/mappings/fonts.cpp:7
+msgid "GNU Lilypond"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:3 ../data/fonts/mappings/fonts.cpp:8
+msgid "Copyright (c) 1997--2003 Han-Wen Nienhuys and Jan Nieuwenhuizen"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:4 ../data/fonts/mappings/fonts.cpp:9
+#: ../data/fonts/mappings/fonts.cpp:14 ../data/fonts/mappings/fonts.cpp:19
+#: ../data/fonts/mappings/fonts.cpp:24 ../data/fonts/mappings/fonts.cpp:29
+#: ../data/fonts/mappings/fonts.cpp:34 ../data/fonts/mappings/fonts.cpp:39
+#: ../data/fonts/mappings/fonts.cpp:44 ../data/fonts/mappings/fonts.cpp:49
+#: ../data/fonts/mappings/fonts.cpp:54
+msgid "Chris Cannam"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:5 ../data/fonts/mappings/fonts.cpp:40
+msgid "pixmap"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:6
+msgid "Feta"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:10 ../data/fonts/mappings/fonts.cpp:15
+#: ../data/fonts/mappings/fonts.cpp:20 ../data/fonts/mappings/fonts.cpp:25
+#: ../data/fonts/mappings/fonts.cpp:30 ../data/fonts/mappings/fonts.cpp:35
+#: ../data/fonts/mappings/fonts.cpp:45 ../data/fonts/mappings/fonts.cpp:50
+#: ../data/fonts/mappings/fonts.cpp:55
+msgid "scalable"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:11
+msgid "Fughetta"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:12
+msgid ""
+"Created by Blake Hodgetts; freely redistributable. See http://www.efn.org/"
+"~bch/aboutfonts.html"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:13
+msgid "Copyright 1995-1999 Blake Hodgetts"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:16
+msgid "Inkpen"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:17
+msgid "Inkpen is part of Sibelius, but other fonts may use the same mappings."
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:18 ../data/fonts/mappings/fonts.cpp:28
+msgid "Copyright Sibelius Software Ltd"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:21
+msgid "Maestro"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:22
+msgid "Maestro is part of Finale, but other fonts use the same mappings."
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:23 ../data/fonts/mappings/fonts.cpp:33
+msgid "Copyright Coda Inc"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:27
+msgid "Opus is part of Sibelius, but other fonts may use the same mappings."
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:31
+msgid "Petrucci"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:32
+msgid "Petrucci is part of Finale, but other fonts use the same mappings."
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:36
+msgid "RG21"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:37
+msgid "Rosegarden 2.1"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:38
+msgid "Copyright (c) 1994--2001 Chris Cannam"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:41
+msgid "Sonata"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:42
+msgid "Adobe"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:43
+msgid "Copyright Adobe Inc"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:46
+msgid "Steinberg"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:47
+msgid "The Steinberg Notation font is part of Cubase."
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:48
+msgid "Copyright Steinberg Inc"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:51
+msgid "Xinfonia"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:52
+msgid "xemo.org"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:53
+msgid "Copyright 2001-2003 Xemus Software LLC"
+msgstr ""
+
+#: ../data/styles/styles.cpp:1
+msgid "Classical"
+msgstr ""
+
+#: ../data/styles/styles.cpp:2
+msgid "Cross"
+msgstr ""
+
+#: ../data/styles/styles.cpp:3
+msgid "Mensural"
+msgstr ""
+
+#: ../data/styles/styles.cpp:4
+msgid "Triangle"
+msgstr ""
diff --git a/po/en_GB.po b/po/en_GB.po
new file mode 100644
index 0000000..925a031
--- /dev/null
+++ b/po/en_GB.po
@@ -0,0 +1,10812 @@
+# translation of en_GB.po to
+# This file is distributed under the same license as the PACKAGE package.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER.
+# Chris Cannam <[email protected]>, 2006.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: en_GB\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-04-24 18:19-0400\n"
+"PO-Revision-Date: 2006-01-13 20:22+0000\n"
+"Last-Translator: Chris Cannam <[email protected]>\n"
+"Language-Team: <[email protected]>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.9.1\n"
+
+#: ../src/gui/dialogs/RescaleDialog.cpp:51 rc.cpp:192 rc.cpp:312
+#, no-c-format
+msgid "Rescale"
+msgstr ""
+
+#: ../src/gui/dialogs/RescaleDialog.cpp:56
+msgid "Duration of selection"
+msgstr ""
+
+#: ../src/gui/dialogs/RescaleDialog.cpp:62
+msgid "Adjust times of following events accordingly"
+msgstr ""
+
+#: ../src/gui/dialogs/PitchDialog.cpp:45
+#: ../src/gui/dialogs/RescaleDialog.cpp:72
+#: ../src/gui/dialogs/TimeDialog.cpp:51 ../src/gui/dialogs/TimeDialog.cpp:68
+#: ../src/gui/studio/BankEditorDialog.cpp:109
+msgid "Reset"
+msgstr ""
+
+#: ../src/commands/segment/SegmentSplitByPitchCommand.cpp:46
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:46
+msgid "Split by Pitch"
+msgstr ""
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:54
+msgid "Starting split pitch"
+msgstr ""
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:57
+msgid "Range up and down to follow music"
+msgstr ""
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:63
+msgid "Duplicate non-note events"
+msgstr ""
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:66
+msgid "Clef handling:"
+msgstr ""
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:69
+msgid "Leave clefs alone"
+msgstr ""
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:70
+msgid "Guess new clefs"
+msgstr ""
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:71
+msgid "Use treble and bass clefs"
+msgstr ""
+
+#: ../src/gui/dialogs/DocumentConfigureDialog.cpp:64
+msgid "Document Properties"
+msgstr ""
+
+#: ../src/gui/dialogs/MakeOrnamentDialog.cpp:45
+#: ../src/gui/editors/notation/NotationView.cpp:6048
+msgid "Make Ornament"
+msgstr ""
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:183
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:179
+#: ../src/gui/dialogs/EventEditDialog.cpp:128
+#: ../src/gui/dialogs/MakeOrnamentDialog.cpp:49
+#: ../src/gui/studio/DeviceEditorDialog.cpp:74
+#: ../src/gui/studio/NameSetEditor.cpp:72
+#: ../src/gui/widgets/ColourTable.cpp:51
+msgid "Name"
+msgstr ""
+
+#: ../src/gui/dialogs/MakeOrnamentDialog.cpp:51
+msgid ""
+"The name is used to identify both the ornament\n"
+"and the triggered segment that stores\n"
+"the ornament's notes."
+msgstr ""
+
+#: ../src/gui/dialogs/MakeOrnamentDialog.cpp:54
+msgid "Name: "
+msgstr ""
+
+#: ../src/gui/dialogs/MakeOrnamentDialog.cpp:57
+#: ../src/gui/editors/eventlist/EventView.cpp:717
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:92
+msgid "Base pitch"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:57
+#: ../src/gui/editors/eventlist/EventView.cpp:140
+msgid "Text"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:66
+msgid "Specification"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:68
+msgid "Preview"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:72
+msgid "Text: "
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:79
+msgid "Style: "
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:90
+msgid "Dynamic"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:93
+msgid "Direction"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:96
+msgid "Local Direction"
+msgstr ""
+
+#: ../src/gui/dialogs/TempoDialog.cpp:63
+#: ../src/gui/dialogs/TextEventDialog.cpp:99
+#: ../src/gui/editors/tempo/TempoView.cpp:91
+msgid "Tempo"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:102
+msgid "Local Tempo"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:105
+msgid "Lyric"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:108
+#: ../src/gui/editors/notation/NotationView.cpp:4242
+msgid "Chord"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:111
+msgid "Annotation"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:114
+msgid "LilyPond Directive"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:138
+msgid "Verse: "
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:148
+msgid "Dynamic: "
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:152
+msgid "ppp"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:153
+msgid "pp"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:154
+msgid "p"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:155
+msgid "mp"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:156
+msgid "mf"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:157
+msgid "f"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:158
+msgid "ff"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:159
+msgid "fff"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:160
+msgid "rfz"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:161
+msgid "sf"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:165
+msgid "Direction: "
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:174
+msgid " ,"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:175
+msgid "D.C. al Fine"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:176
+msgid "D.S. al Fine"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:177
+msgid "Fine"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:178
+msgid "D.S. al Coda"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:179
+msgid "to Coda"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:180
+msgid "Coda"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:184
+msgid "Local Direction: "
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:188
+msgid "accel."
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:189
+msgid "ritard."
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:190
+msgid "ralletando"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:191
+msgid "a tempo"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:192
+msgid "legato"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:193
+msgid "simile"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:194
+msgid "pizz."
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:195
+msgid "arco"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:196
+msgid "non vib."
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:197
+msgid "sul pont."
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:198
+#: ../src/gui/dialogs/TextEventDialog.cpp:200
+msgid "sul tasto"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:199
+msgid "con legno"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:201
+msgid "sul G"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:202
+msgid "ordinario"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:203
+msgid "Muta in "
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:204
+msgid "volti subito "
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:205
+msgid "soli"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:206
+msgid "div."
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:210
+msgid "Tempo: "
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:214
+#: ../src/gui/dialogs/TextEventDialog.cpp:238
+msgid "Grave"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:215
+#: ../src/gui/dialogs/TextEventDialog.cpp:239
+msgid "Adagio"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:216
+#: ../src/gui/dialogs/TextEventDialog.cpp:240
+msgid "Largo"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:217
+#: ../src/gui/dialogs/TextEventDialog.cpp:241
+msgid "Lento"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:218
+#: ../src/gui/dialogs/TextEventDialog.cpp:242
+msgid "Andante"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:219
+#: ../src/gui/dialogs/TextEventDialog.cpp:243
+msgid "Moderato"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:220
+#: ../src/gui/dialogs/TextEventDialog.cpp:244
+msgid "Allegretto"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:221
+#: ../src/gui/dialogs/TextEventDialog.cpp:245
+msgid "Allegro"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:222
+#: ../src/gui/dialogs/TextEventDialog.cpp:246
+msgid "Vivace"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:223
+#: ../src/gui/dialogs/TextEventDialog.cpp:247
+msgid "Presto"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:224
+#: ../src/gui/dialogs/TextEventDialog.cpp:248
+msgid "Prestissimo"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:225
+#: ../src/gui/dialogs/TextEventDialog.cpp:249
+msgid "Maestoso"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:226
+#: ../src/gui/dialogs/TextEventDialog.cpp:250
+msgid "Sostenuto"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:227
+#: ../src/gui/dialogs/TextEventDialog.cpp:251
+msgid "Tempo Primo"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:234
+msgid "Local Tempo: "
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:255
+msgid "Directive: "
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:312
+msgid "Example"
+msgstr ""
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:65
+msgid "Event Filter"
+msgstr ""
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:86
+msgid "Note Events"
+msgstr ""
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:90
+msgid "lowest:"
+msgstr ""
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:93
+msgid "highest:"
+msgstr ""
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:96
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:141
+#: ../src/gui/widgets/PitchChooser.cpp:53
+msgid "Pitch:"
+msgstr ""
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:99
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:163
+msgid "Velocity:"
+msgstr ""
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:102
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:129
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:257
+msgid "Duration:"
+msgstr ""
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:107
+#: ../src/gui/dialogs/EventFilterDialog.cpp:114
+#: ../src/gui/dialogs/EventFilterDialog.cpp:121
+msgid "include"
+msgstr ""
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:108
+#: ../src/gui/dialogs/EventFilterDialog.cpp:115
+#: ../src/gui/dialogs/EventFilterDialog.cpp:122
+msgid "exclude"
+msgstr ""
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:136
+#: ../src/gui/dialogs/EventFilterDialog.cpp:155
+#: ../src/gui/editors/eventlist/EventView.cpp:172
+#: ../src/gui/editors/eventlist/EventView.cpp:179
+#: ../src/gui/editors/eventlist/EventView.cpp:186
+msgid "edit"
+msgstr ""
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:141
+#: ../src/gui/dialogs/EventFilterDialog.cpp:157
+msgid "choose a pitch using a staff"
+msgstr ""
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:182
+#: ../src/gui/dialogs/EventFilterDialog.cpp:188
+msgid "longest"
+msgstr ""
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:200
+msgid "Include all"
+msgstr ""
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:203
+msgid "Include entire range of values"
+msgstr ""
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:206
+msgid "Exclude all"
+msgstr ""
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:209
+msgid "Exclude entire range of values"
+msgstr ""
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:233
+#: ../src/gui/dialogs/EventFilterDialog.cpp:234
+msgid "shortest"
+msgstr ""
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:333
+msgid "Lowest pitch"
+msgstr ""
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:343
+msgid "Highest pitch"
+msgstr ""
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:56
+#: ../src/gui/editors/notation/NotationView.cpp:1619
+#: ../src/gui/editors/notation/NotationView.cpp:6088
+msgid "Use Ornament"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:260
+#: ../src/gui/configuration/NotationConfigurationPage.h:64
+#: ../src/gui/configuration/NotationConfigurationPage.h:65
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:63
+msgid "Notation"
+msgstr ""
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:68
+msgid "Display as: "
+msgstr ""
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:84
+msgid "Trill"
+msgstr ""
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:84
+msgid "Trill with line"
+msgstr ""
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:84
+msgid "Trill line only"
+msgstr ""
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:85
+msgid "Turn"
+msgstr ""
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:85
+msgid "Mordent"
+msgstr ""
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:85
+msgid "Inverted mordent"
+msgstr ""
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:86
+msgid "Long mordent"
+msgstr ""
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:86
+msgid "Long inverted mordent"
+msgstr ""
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:94
+msgid "Text mark"
+msgstr ""
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:98
+msgid " Text: "
+msgstr ""
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:104
+msgid "Performance"
+msgstr ""
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:109
+msgid "Perform using triggered segment: "
+msgstr ""
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:75
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:123
+msgid "Perform with timing: "
+msgstr ""
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:81
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:129
+msgid "As stored"
+msgstr ""
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:82
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:130
+msgid "Truncate if longer than note"
+msgstr ""
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:83
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:131
+msgid "End at same time as note"
+msgstr ""
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:84
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:132
+msgid "Stretch or squash segment to note duration"
+msgstr ""
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:86
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:134
+msgid "Adjust pitch to note"
+msgstr ""
+
+#: ../src/gui/dialogs/PitchPickerDialog.cpp:40
+msgid "Pitch Selector"
+msgstr ""
+
+#: ../src/gui/dialogs/BeatsBarsDialog.cpp:44
+msgid "Audio Segment Duration"
+msgstr ""
+
+#: ../src/gui/dialogs/BeatsBarsDialog.cpp:50
+msgid "The selected audio segment contains:"
+msgstr ""
+
+#: ../src/gui/dialogs/BeatsBarsDialog.cpp:59
+msgid "beat(s)"
+msgstr ""
+
+#: ../src/gui/dialogs/BeatsBarsDialog.cpp:60
+msgid "bar(s)"
+msgstr ""
+
+#: ../src/gui/dialogs/TupletDialog.cpp:51
+msgid "Tuplet"
+msgstr ""
+
+#: ../src/gui/dialogs/TupletDialog.cpp:58
+msgid "New timing for tuplet group"
+msgstr ""
+
+#: ../src/gui/dialogs/TupletDialog.cpp:76
+msgid "Play "
+msgstr ""
+
+#: ../src/gui/dialogs/TupletDialog.cpp:98
+msgid "in the time of "
+msgstr ""
+
+#: ../src/gui/dialogs/TupletDialog.cpp:104
+msgid "Timing is already correct: update display only"
+msgstr ""
+
+#: ../src/gui/dialogs/TupletDialog.cpp:114
+msgid "Timing calculations"
+msgstr ""
+
+#: ../src/gui/dialogs/TupletDialog.cpp:120
+msgid "Selected region:"
+msgstr ""
+
+#: ../src/gui/dialogs/TupletDialog.cpp:129
+msgid "Group with current timing:"
+msgstr ""
+
+#: ../src/gui/dialogs/TupletDialog.cpp:135
+msgid "Group with new timing:"
+msgstr ""
+
+#: ../src/gui/dialogs/TupletDialog.cpp:141
+msgid "Gap created by timing change:"
+msgstr ""
+
+#: ../src/gui/dialogs/TupletDialog.cpp:149
+msgid "Unchanged at end of selection:"
+msgstr ""
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:63 rc.cpp:372
+#, no-c-format
+msgid "Metronome"
+msgstr ""
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:77
+msgid "Metronome Instrument"
+msgstr ""
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:82
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:150
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:183
+#: ../src/gui/studio/DeviceEditorDialog.cpp:73
+#: ../src/gui/studio/DeviceManagerDialog.cpp:105
+#: ../src/gui/studio/DeviceManagerDialog.cpp:163
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:66
+msgid "Device"
+msgstr ""
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:101
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:89
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:215
+#: ../src/gui/studio/DeviceEditorDialog.cpp:195
+#: ../src/gui/studio/DeviceEditorDialog.cpp:218
+#: ../src/gui/studio/DeviceEditorDialog.cpp:230
+#: ../src/gui/studio/DeviceManagerDialog.cpp:196
+#: ../src/gui/studio/DeviceManagerDialog.cpp:440
+#: ../src/gui/studio/DeviceManagerDialog.cpp:452
+msgid "No connection"
+msgstr ""
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:112
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:111
+#: ../src/gui/editors/parameters/InstrumentParameterBox.cpp:53
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:1209
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:159
+#: ../src/gui/general/PresetHandlerDialog.cpp:92
+#: ../src/gui/studio/MidiMixerWindow.cpp:204
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:67
+msgid "Instrument"
+msgstr ""
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:118
+msgid "Beats"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:184
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:123
+msgid "Resolution"
+msgstr ""
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:309
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:139
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:205
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:125
+#: ../src/gui/editors/matrix/MatrixView.cpp:2132
+#: ../src/gui/editors/notation/NotationView.cpp:1582
+#: ../src/gui/widgets/QuantizeParameters.cpp:128
+#: ../src/gui/widgets/QuantizeParameters.cpp:301
+msgid "None"
+msgstr ""
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:126
+msgid "Bars only"
+msgstr ""
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:127
+msgid "Bars and beats"
+msgstr ""
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:128
+msgid "Bars, beats, and divisions"
+msgstr ""
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:132
+msgid "Bar velocity"
+msgstr ""
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:139
+msgid "Beat velocity"
+msgstr ""
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:146
+msgid "Sub-beat velocity"
+msgstr ""
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:155
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:324
+msgid "Pitch"
+msgstr ""
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:160
+msgid "for Bar"
+msgstr ""
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:161
+msgid "for Beat"
+msgstr ""
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:162
+msgid "for Sub-beat"
+msgstr ""
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:166
+msgid "Metronome Activated"
+msgstr ""
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:167
+msgid "Playing"
+msgstr ""
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:168
+msgid "Recording"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:46
+msgid "Choose Text Encoding"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:50
+msgid ""
+"\n"
+"This file contains text in an unknown language encoding.\n"
+"\n"
+"Please select one of the following estimated text encodings\n"
+"for use with the text in this file:\n"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:61
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:77
+msgid "Japanese Shift-JIS"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:62
+msgid "Unicode variable-width"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:63
+msgid "Western Europe"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:64
+msgid "Western Europe + Euro"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:65
+msgid "Eastern Europe"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:66
+msgid "Southern Europe"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:67
+msgid "Northern Europe"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:68
+msgid "Cyrillic"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:69
+msgid "Arabic"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:70
+msgid "Greek"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:71
+msgid "Hebrew"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:72
+msgid "Turkish"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:73
+msgid "Nordic"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:74
+msgid "Thai"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:75
+msgid "Baltic"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:76
+msgid "Celtic"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:78
+msgid "Traditional Chinese"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:79
+msgid "Simplified Chinese"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:80
+msgid "Russian"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:81
+msgid "Ukrainian"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:82
+msgid "Tamil"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:117
+#, c-format
+msgid "Microsoft Code Page %1"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:123
+#: ../src/gui/editors/matrix/MatrixView.cpp:1490
+msgid "%1 (%2)"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:142
+msgid ""
+"\n"
+"Example text from file:"
+msgstr ""
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:59
+#: ../src/gui/editors/tempo/TempoView.cpp:92
+msgid "Time Signature"
+msgstr ""
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:82
+msgid "Time signature"
+msgstr ""
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:116
+msgid "Time where signature takes effect"
+msgstr ""
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:83
+#: ../src/gui/dialogs/TempoDialog.cpp:128
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:129
+#: ../src/gui/general/PresetHandlerDialog.cpp:101
+msgid "Scope"
+msgstr ""
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:141
+#, c-format
+msgid "Insertion point is at start of measure %1."
+msgstr "Insertion point is at start of bar %1."
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:145
+#, c-format
+msgid "Insertion point is in the middle of measure %1."
+msgstr "Insertion point is in the middle of bar %1."
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:150
+msgid "Insertion point is at start of composition."
+msgstr ""
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:155
+msgid "Start measure %1 here"
+msgstr "Start bar %1 here"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:159
+#, c-format
+msgid "Change time from start of measure %1"
+msgstr "Change time from start of bar %1"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:166
+#, c-format
+msgid "Time change will take effect at the start of measure %1."
+msgstr "Time change will take effect at the start of bar %1."
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:176
+msgid "Hide the time signature"
+msgstr ""
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:181
+msgid "Hide the affected bar lines"
+msgstr ""
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:186
+msgid "Show as common time"
+msgstr ""
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:191
+msgid "Correct the durations of following measures"
+msgstr "Correct the durations of following bars"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:280
+msgid "Display as common time"
+msgstr ""
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:284
+msgid "Display as cut common time"
+msgstr ""
+
+#: ../src/gui/dialogs/ConfigureDialog.cpp:66
+msgid "Configure Rosegarden"
+msgstr ""
+
+#: ../src/gui/dialogs/MarkerModifyDialog.cpp:53
+#: ../src/gui/dialogs/MarkerModifyDialog.cpp:61
+msgid "Edit Marker"
+msgstr ""
+
+#: ../src/gui/dialogs/MarkerModifyDialog.cpp:78
+msgid "Marker Time"
+msgstr ""
+
+#: ../src/gui/dialogs/MarkerModifyDialog.cpp:94
+msgid "Marker Properties"
+msgstr ""
+
+#: ../src/gui/dialogs/MarkerModifyDialog.cpp:100
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:554
+msgid "Text:"
+msgstr ""
+
+#: ../src/gui/dialogs/MarkerModifyDialog.cpp:104
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:85
+msgid "Description:"
+msgstr ""
+
+#: ../src/gui/dialogs/FileMergeDialog.cpp:46
+msgid "Merge File"
+msgstr ""
+
+#: ../src/gui/dialogs/FileMergeDialog.cpp:53
+msgid "Merge new file "
+msgstr ""
+
+#: ../src/gui/dialogs/FileMergeDialog.cpp:56
+msgid "At start of existing composition"
+msgstr ""
+
+#: ../src/gui/dialogs/FileMergeDialog.cpp:57
+msgid "From end of existing composition"
+msgstr ""
+
+#: ../src/gui/dialogs/FileMergeDialog.cpp:61
+msgid "The file has different time signatures or tempos."
+msgstr ""
+
+#: ../src/gui/dialogs/FileMergeDialog.cpp:62
+msgid "Import these as well"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:171
+#: ../src/gui/dialogs/ShowSequencerStatusDialog.cpp:44
+msgid "Sequencer status"
+msgstr ""
+
+#: ../src/gui/dialogs/ShowSequencerStatusDialog.cpp:48
+msgid "Sequencer status:"
+msgstr ""
+
+#: ../src/gui/dialogs/ShowSequencerStatusDialog.cpp:50
+msgid "Status not available."
+msgstr ""
+
+#: ../src/gui/dialogs/ShowSequencerStatusDialog.cpp:57
+msgid "Sequencer is not running or is not responding."
+msgstr ""
+
+#: ../src/gui/dialogs/ShowSequencerStatusDialog.cpp:64
+msgid "Sequencer is not returning a valid status report."
+msgstr ""
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:46
+msgid "Add Tracks"
+msgstr ""
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:54
+msgid "How many tracks do you want to add?"
+msgstr ""
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:62
+msgid "Add tracks"
+msgstr ""
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:64
+msgid "At the top"
+msgstr ""
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:65
+msgid "Above the current selected track"
+msgstr ""
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:66
+msgid "Below the current selected track"
+msgstr ""
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:67
+msgid "At the bottom"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:75
+msgid "Event Properties"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:81
+msgid "Event type:"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:117
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:251
+#: ../src/gui/editors/segment/MarkerEditor.cpp:97
+msgid "Absolute time:"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:156
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:323
+msgid "Controller name:"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:157
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:530
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:562
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:563
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:602
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:631
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:267
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:269
+#: ../src/gui/editors/segment/MarkerEditor.cpp:279
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:272
+#: ../src/gui/studio/AudioMixerWindow.cpp:388
+#: ../src/gui/studio/AudioMixerWindow.cpp:519
+#: ../src/gui/studio/AudioMixerWindow.cpp:683
+#: ../src/gui/studio/AudioMixerWindow.cpp:722
+#: ../src/gui/studio/AudioMixerWindow.cpp:904
+#: ../src/gui/studio/SynthPluginManagerDialog.cpp:121
+msgid "<none>"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:174
+msgid "Meta string:"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:179
+msgid "Load data"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:181
+msgid "Save data"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:192
+msgid "Notation Properties"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:198
+msgid "Lock to changes in performed values"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:205
+msgid "Notation time:"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:217
+msgid "Notation duration:"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:283
+msgid "Note pitch:"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:291
+msgid "Note velocity:"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:317
+msgid "Controller number:"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:326
+msgid "Controller value:"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:354
+msgid "Key pitch:"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:362
+msgid "Key pressure:"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:390
+msgid "Channel pressure:"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:418
+msgid "Program change:"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:461
+msgid "Data length:"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:462
+msgid "Data:"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:480
+msgid "Pitchbend MSB:"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:488
+msgid "Pitchbend LSB:"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:523
+msgid "Indication:"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:553
+msgid "Text type:"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:596
+msgid "Clef type:"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:625
+msgid "Key name:"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:674
+msgid "Unsupported event type:"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:931
+msgid "Edit Event Time"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:943
+msgid "Edit Event Notation Time"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:955
+msgid "Edit Duration"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:968
+msgid "Edit Notation Duration"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:981
+msgid "Edit Pitch"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:991
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:1016
+msgid "*.syx|System exclusive files (*.syx)"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:992
+msgid "Load System Exclusive data in File"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:1017
+msgid "Save System Exclusive data to..."
+msgstr ""
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:46
+msgid "Locate audio file"
+msgstr ""
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:50
+msgid "&Skip"
+msgstr ""
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:51
+msgid "Skip &All"
+msgstr ""
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:52
+msgid "&Locate"
+msgstr ""
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:57
+msgid ""
+"Can't find file \"%1\".\n"
+"Would you like to try and locate this file or skip it?"
+msgstr ""
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:71
+msgid ""
+"%1|Requested file (%2)\n"
+"*.wav|WAV files (*.wav)"
+msgstr ""
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:74
+msgid "Select an Audio File"
+msgstr ""
+
+#: ../src/gui/dialogs/ClefDialog.cpp:53 ../src/gui/dialogs/ClefDialog.cpp:62
+#: ../src/gui/dialogs/ClefDialog.cpp:79 ../src/gui/dialogs/ClefDialog.cpp:90
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:278
+msgid "Clef"
+msgstr ""
+
+#: ../src/gui/dialogs/ClefDialog.cpp:65
+msgid "Existing notes following clef change"
+msgstr ""
+
+#: ../src/gui/dialogs/ClefDialog.cpp:71
+msgid "Lower clef"
+msgstr ""
+
+#: ../src/gui/dialogs/ClefDialog.cpp:77
+msgid "Up an Octave"
+msgstr ""
+
+#: ../src/gui/dialogs/ClefDialog.cpp:84
+msgid "Down an Octave"
+msgstr ""
+
+#: ../src/gui/dialogs/ClefDialog.cpp:88
+msgid "Higher clef"
+msgstr ""
+
+#: ../src/gui/dialogs/ClefDialog.cpp:96
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:152
+msgid "Maintain current pitches"
+msgstr ""
+
+#: ../src/gui/dialogs/ClefDialog.cpp:99
+msgid "Transpose into appropriate octave"
+msgstr ""
+
+#: ../src/gui/dialogs/ClefDialog.cpp:231
+msgid "%1 down an octave"
+msgstr ""
+
+#: ../src/gui/dialogs/ClefDialog.cpp:234
+msgid "%1 down two octaves"
+msgstr ""
+
+#: ../src/gui/dialogs/ClefDialog.cpp:237
+msgid "%1 up an octave"
+msgstr ""
+
+#: ../src/gui/dialogs/ClefDialog.cpp:240
+msgid "%1 up two octaves"
+msgstr ""
+
+#: ../src/gui/dialogs/ClefDialog.cpp:249
+msgid "Treble"
+msgstr ""
+
+#: ../src/gui/dialogs/ClefDialog.cpp:251
+msgid "French violin"
+msgstr ""
+
+#: ../src/gui/dialogs/ClefDialog.cpp:253
+msgid "Soprano"
+msgstr ""
+
+#: ../src/gui/dialogs/ClefDialog.cpp:255
+msgid "Mezzo-soprano"
+msgstr ""
+
+#: ../src/gui/dialogs/ClefDialog.cpp:257
+msgid "Alto"
+msgstr ""
+
+#: ../src/gui/dialogs/ClefDialog.cpp:259
+msgid "Tenor"
+msgstr ""
+
+#: ../src/gui/dialogs/ClefDialog.cpp:261
+msgid "C-baritone"
+msgstr ""
+
+#: ../src/gui/dialogs/ClefDialog.cpp:263
+msgid "F-baritone"
+msgstr ""
+
+#: ../src/gui/dialogs/ClefDialog.cpp:265
+msgid "Bass"
+msgstr ""
+
+#: ../src/gui/dialogs/ClefDialog.cpp:267
+msgid "Sub-bass"
+msgstr ""
+
+#: ../src/gui/dialogs/CountdownDialog.cpp:52
+msgid "Recording..."
+msgstr ""
+
+#: ../src/gui/dialogs/CountdownDialog.cpp:60
+msgid "Recording time remaining: "
+msgstr ""
+
+#: ../src/gui/dialogs/CountdownDialog.cpp:120
+msgid "Just how big is your hard disk?"
+msgstr ""
+
+#: ../src/gui/dialogs/CountdownDialog.cpp:154
+msgid "Recording beyond end of composition: "
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:52
+msgid "Specify Interval"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:58
+msgid "Reference note:"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:59
+#, fuzzy
+msgid "Target note:"
+msgstr "crotchet"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:68
+#: ../src/gui/dialogs/IntervalDialog.cpp:315
+msgid "a perfect unison"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:76
+msgid "Effect on Key"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:77
+msgid "Transpose within key"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:79
+msgid "Change key for selection"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:89
+msgid ""
+"Adjust segment transposition in opposite direction (maintain audible pitch)"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:190
+#: ../src/gui/dialogs/IntervalDialog.cpp:220
+msgid "a diminished"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:192
+#: ../src/gui/dialogs/IntervalDialog.cpp:222
+msgid "an augmented"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:194
+#: ../src/gui/dialogs/IntervalDialog.cpp:224
+msgid "a doubly diminished"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:196
+#: ../src/gui/dialogs/IntervalDialog.cpp:226
+msgid "a doubly augmented"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:198
+#: ../src/gui/dialogs/IntervalDialog.cpp:228
+msgid "a triply diminished"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:200
+#: ../src/gui/dialogs/IntervalDialog.cpp:230
+msgid "a triply augmented"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:202
+msgid "a quadruply diminished"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:204
+#: ../src/gui/dialogs/IntervalDialog.cpp:232
+msgid "a quadruply augmented"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:206
+#: ../src/gui/dialogs/IntervalDialog.cpp:234
+msgid "a perfect"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:208
+#: ../src/gui/dialogs/IntervalDialog.cpp:236
+msgid "an (unknown, %1)"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:216
+msgid "a minor"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:218
+msgid "a major"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:239
+msgid "an (unknown)"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:248
+#: ../src/gui/dialogs/IntervalDialog.cpp:251
+msgid "%1 octave"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:254
+msgid "%1 unison"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:258
+msgid "%1 second"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:261
+msgid "%1 third"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:264
+msgid "%1 fourth"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:267
+msgid "%1 fifth"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:270
+msgid "%1 sixth"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:273
+msgid "%1 seventh"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:276
+#: ../src/gui/studio/DeviceManagerDialog.cpp:329
+#: ../src/gui/studio/DeviceManagerDialog.cpp:363
+#, c-format
+msgid "%1"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:287
+msgid ""
+"_n: up 1 octave and %1\n"
+"up %n octaves and %1"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:291
+#, c-format
+msgid ""
+"_n: up 1 octave\n"
+"up %n octaves"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:295
+#, c-format
+msgid "up %1"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:303
+msgid ""
+"_n: down 1 octave and %1\n"
+"down %n octaves and %1"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:307
+#, c-format
+msgid ""
+"_n: down 1 octave\n"
+"down %n octaves"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:311
+#, c-format
+msgid "down %1"
+msgstr ""
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:81
+msgid "Intrinsics"
+msgstr ""
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:85
+msgid "Event type: "
+msgstr ""
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:91
+msgid "Absolute time: "
+msgstr ""
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:101
+msgid "Duration: "
+msgstr ""
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:114
+msgid "Sub-ordering: "
+msgstr ""
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:125
+msgid "Persistent properties"
+msgstr ""
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:169
+#: ../src/gui/dialogs/EventEditDialog.cpp:133
+#: ../src/gui/studio/BankEditorDialog.cpp:129
+#: ../src/gui/studio/DeviceEditorDialog.cpp:75
+msgid "Type"
+msgstr ""
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:184
+#: ../src/gui/dialogs/EventEditDialog.cpp:135
+#: ../src/gui/dialogs/EventParameterDialog.cpp:89
+#: ../src/gui/dialogs/EventParameterDialog.cpp:93
+#: ../src/gui/dialogs/EventParameterDialog.cpp:115
+msgid "Value"
+msgstr ""
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:155
+msgid "Non-persistent properties"
+msgstr ""
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:156
+msgid "These are cached values, lost if the event is modified."
+msgstr ""
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:170
+msgid "Name "
+msgstr ""
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:172
+msgid "Type "
+msgstr ""
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:174
+msgid "Value "
+msgstr ""
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:188
+msgid "Make persistent"
+msgstr ""
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:292
+msgid "Delete this property"
+msgstr ""
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:433
+msgid ""
+"Are you sure you want to delete the \"%1\" property?\n"
+"\n"
+"Removing necessary properties may cause unexpected behavior."
+msgstr ""
+"Are you sure you want to delete the \"%1\" property?\n"
+"\n"
+"Removing necessary properties may cause unexpected behaviour."
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:436
+#: ../src/gui/dialogs/EventEditDialog.cpp:469
+msgid "Edit Event"
+msgstr ""
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:465
+msgid ""
+"Are you sure you want to make the \"%1\" property persistent?\n"
+"\n"
+"This could cause problems if it overrides a different computed value later "
+"on."
+msgstr ""
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:470
+msgid "Make &Persistent"
+msgstr ""
+
+#: ../src/gui/dialogs/PasteNotationDialog.cpp:52
+msgid "Paste type"
+msgstr ""
+
+#: ../src/gui/dialogs/PasteNotationDialog.cpp:72
+msgid "Make this the default paste type"
+msgstr ""
+
+#: ../src/gui/dialogs/LyricEditDialog.cpp:53
+msgid "Edit Lyrics"
+msgstr ""
+
+#: ../src/gui/dialogs/LyricEditDialog.cpp:62
+msgid "Lyrics for this segment"
+msgstr ""
+
+#: ../src/gui/dialogs/LyricEditDialog.cpp:70
+msgid "Add Verse"
+msgstr ""
+
+#: ../src/gui/dialogs/LyricEditDialog.cpp:84
+#: ../src/gui/dialogs/LyricEditDialog.cpp:106
+#, c-format
+msgid "Verse %1"
+msgstr ""
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:59
+msgid "Import from Device..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2163
+#: ../src/gui/application/RosegardenGUIApp.cpp:2229
+#: ../src/gui/application/RosegardenGUIApp.cpp:7780
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:87
+#: ../src/sound/AudioFileManager.cpp:664
+#, c-format
+msgid "Cannot download file %1"
+msgstr ""
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:99
+#, c-format
+msgid "Cannot open file %1"
+msgstr ""
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:106
+#, c-format
+msgid "No devices found in file %1"
+msgstr ""
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:113
+msgid "Source device"
+msgstr ""
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:118
+msgid "Import from: "
+msgstr ""
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:140
+#: ../src/gui/studio/DeviceEditorDialog.cpp:148
+#, c-format
+msgid "Device %1"
+msgstr ""
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:155
+msgid "Import banks"
+msgstr ""
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:156
+msgid "Import key mappings"
+msgstr ""
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:157
+msgid "Import controllers"
+msgstr ""
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:160
+msgid "Import device name"
+msgstr ""
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:166
+msgid "Bank import behavior"
+msgstr "Bank import behaviour"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:168
+msgid "Merge banks"
+msgstr ""
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:169
+msgid "Overwrite banks"
+msgstr ""
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:367
+msgid "Bank %1:%2"
+msgstr ""
+
+#: ../src/commands/segment/SegmentSplitByRecordingSrcCommand.cpp:42
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:48
+msgid "Split by Recording Source"
+msgstr ""
+
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:53
+msgid "Recording Source"
+msgstr ""
+
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:57
+msgid "Channel:"
+msgstr ""
+
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:64
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:75
+msgid "any"
+msgstr ""
+
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:69
+msgid "Device:"
+msgstr ""
+
+#: ../src/gui/dialogs/UnusedAudioSelectionDialog.cpp:46
+msgid "Select Unused Audio Files"
+msgstr ""
+
+#: ../src/gui/dialogs/UnusedAudioSelectionDialog.cpp:53
+#: ../src/gui/editors/segment/PlayListView.cpp:36
+msgid "File name"
+msgstr ""
+
+#: ../src/gui/dialogs/UnusedAudioSelectionDialog.cpp:54
+msgid "File size"
+msgstr ""
+
+#: ../src/gui/dialogs/UnusedAudioSelectionDialog.cpp:55
+msgid "Last modified date"
+msgstr ""
+
+#: ../src/gui/dialogs/UnusedAudioSelectionDialog.cpp:60
+msgid " (not found) "
+msgstr ""
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:105
+msgid "Audio File Manager"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:126
+msgid ""
+"* Some audio files are encoded at a sample rate different from that of the "
+"JACK audio server.\n"
+"Rosegarden will play them at the correct speed, but they will sound "
+"terrible.\n"
+"Please consider resampling such files externally, or adjusting the sample "
+"rate of the JACK server."
+msgstr ""
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:132
+msgid "&Add Audio File..."
+msgstr ""
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:135
+msgid "&Unload Audio File"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:140
+msgid "&Play Preview"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:151
+msgid "&Insert into Selected Audio Track"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:155
+msgid "Unload &all Audio Files"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:159
+msgid "Unload all &Unused Audio Files"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:163
+msgid "&Delete Unused Audio Files..."
+msgstr ""
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:167
+msgid "&Export Audio File..."
+msgstr ""
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:173
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:180
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:91
+msgid "Duration"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:181
+msgid "Envelope"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:182
+msgid "Sample rate"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:183
+msgid "Channels"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:282
+msgid "<no audio files>"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:488
+msgid "*.wav|WAV files (*.wav)"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:489
+msgid "Choose a name to save this file as"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:499
+msgid "Exporting audio file..."
+msgstr ""
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:609
+msgid ""
+"This will unload audio file \"%1\" and remove all associated segments. Are "
+"you sure?"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:692
+msgid ""
+"*.wav|WAV files (*.wav)\n"
+"*.*|All files"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:697
+msgid ""
+"*.wav *.flac *.ogg *.mp3|Audio files (*.wav *.flac *.ogg *.mp3)\n"
+"*.wav|WAV files (*.wav)\n"
+"*.flac|FLAC files (*.flac)\n"
+"*.ogg|Ogg files (*.ogg)\n"
+"*.mp3|MP3 files (*.mp3)\n"
+"*.*|All files"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:704
+msgid "Select one or more audio files"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:763
+msgid ""
+"This will unload all audio files and remove their associated segments.\n"
+"This action cannot be undone, and associations with these files will be "
+"lost.\n"
+"Files will not be removed from your disk.\n"
+"Are you sure?"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:800
+msgid ""
+"This will unload all audio files that are not associated with any segments "
+"in this composition.\n"
+"This action cannot be undone, and associations with these files will be "
+"lost.\n"
+"Files will not be removed from your disk.\n"
+"Are you sure?"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:865
+msgid ""
+"The following audio files are not used in the current composition.\n"
+"\n"
+"Please select the ones you wish to delete permanently from the hard disk.\n"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:875
+#, c-format
+msgid ""
+"_n: <qt>About to delete 1 audio file permanently from the hard disk.<br>This "
+"action cannot be undone, and there will be no way to recover this file."
+"<br>Are you sure?</qt>\n"
+"\n"
+"<qt>About to delete %n audio files permanently from the hard disk.<br>This "
+"action cannot be undone, and there will be no way to recover these files."
+"<br>Are you sure?</qt>"
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:525
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:888
+msgid "File %1 could not be deleted."
+msgstr ""
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:921
+msgid "Change Audio File label"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:6466
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:922
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:1099
+msgid "Enter new label"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIView.cpp:1538
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:1086
+msgid "Adding audio file..."
+msgstr ""
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:1107
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:1112
+msgid "Failed to add audio file. "
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:2789
+#: ../src/gui/application/RosegardenGUIApp.cpp:2736
+#: ../src/gui/application/RosegardenGUIView.cpp:1574
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:1122
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:180
+msgid "Generating audio preview..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIView.cpp:1581
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:1130
+msgid ""
+"Try copying this file to a directory where you have write permission and re-"
+"add it"
+msgstr ""
+
+#: ../src/gui/dialogs/TransportDialog.cpp:90 rc.cpp:357
+#, no-c-format
+msgid "Rosegarden Transport"
+msgstr ""
+
+#: ../src/gui/dialogs/TransportDialog.cpp:925
+#: ../src/gui/dialogs/TransportDialog.cpp:985
+msgid "PITCH WHEEL"
+msgstr ""
+
+#: ../src/gui/dialogs/TransportDialog.cpp:929
+#: ../src/gui/dialogs/TransportDialog.cpp:989
+msgid "CONTROLLER"
+msgstr ""
+
+#: ../src/gui/dialogs/TransportDialog.cpp:933
+#: ../src/gui/dialogs/TransportDialog.cpp:993
+msgid "PROG CHNGE"
+msgstr ""
+
+#: ../src/gui/dialogs/TransportDialog.cpp:938
+#: ../src/gui/dialogs/TransportDialog.cpp:998
+msgid "PRESSURE"
+msgstr ""
+
+#: ../src/gui/dialogs/TransportDialog.cpp:942
+#: ../src/gui/dialogs/TransportDialog.cpp:1002
+msgid "SYS MESSAGE"
+msgstr ""
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:177
+#: ../src/gui/dialogs/QuantizeDialog.cpp:40
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:127
+msgid "Quantize"
+msgstr ""
+
+#: ../src/gui/dialogs/QuantizeDialog.cpp:52
+msgid "Advanced"
+msgstr ""
+
+#: ../src/gui/dialogs/ExportDeviceDialog.cpp:42
+msgid "Export Devices..."
+msgstr ""
+
+#: ../src/gui/dialogs/ExportDeviceDialog.cpp:47
+msgid "Export devices"
+msgstr ""
+
+#: ../src/gui/dialogs/ExportDeviceDialog.cpp:49
+msgid "Export all devices"
+msgstr ""
+
+#: ../src/gui/dialogs/ExportDeviceDialog.cpp:50
+msgid "Export selected device only"
+msgstr ""
+
+#: ../src/gui/dialogs/ExportDeviceDialog.cpp:51
+msgid " (\"%1\")"
+msgstr ""
+
+#: ../src/gui/dialogs/CompositionLengthDialog.cpp:44
+msgid "Change Composition Length"
+msgstr ""
+
+#: ../src/gui/dialogs/CompositionLengthDialog.cpp:50
+msgid "Set the Start and End bar markers for this Composition"
+msgstr ""
+
+#: ../src/gui/dialogs/CompositionLengthDialog.cpp:54
+msgid "Start Bar"
+msgstr ""
+
+#: ../src/gui/dialogs/CompositionLengthDialog.cpp:62
+msgid "End Bar"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:62
+msgid "LilyPond Export/Preview"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:85
+msgid "General options"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:90
+msgid "Advanced options"
+msgstr ""
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:112
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:95
+msgid "Headers"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:106
+msgid "Basic options"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:113
+msgid "Compatibility level"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:117
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:118
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:119
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:120
+#, c-format
+msgid "LilyPond %1"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:125
+msgid "Paper size"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:129
+msgid "A3"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:130
+msgid "A4"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:131
+msgid "A5"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:132
+msgid "A6"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:133
+msgid "Legal"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:134
+msgid "US Letter"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:135
+msgid "Tabloid"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:136
+msgid "do not specify"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:152
+msgid "Font size"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:157
+msgid "%1 pt"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:169
+msgid "Staff level options"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:176
+msgid "Export content"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:179
+msgid "All tracks"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:180
+msgid "Non-muted tracks"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:181
+msgid "Selected track"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:182
+msgid "Selected segments"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:188
+msgid "Merge tracks that have the same name"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:198
+msgid "Notation options"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:206
+msgid "First"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:207
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:538
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:557
+msgid "All"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:211
+msgid "Export tempo marks "
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:215
+msgid "Export lyrics"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:225
+msgid "Export beamings"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:232
+msgid "Export track staff brackets"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:244
+msgid "Layout options"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:257
+msgid "Lyrics alignment"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:261
+msgid "Ragged bottom (systems will not be spread vertically across the page)"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:267
+msgid "Miscellaneous options"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:274
+msgid "Enable \"point and click\" debugging"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:279
+msgid "Export \\midi block"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:284
+msgid "No markers"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:285
+msgid "Rehearsal marks"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:286
+#, fuzzy
+msgid "Marker text"
+msgstr "crotchet"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:290
+msgid "Export markers"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioSplitDialog.cpp:57
+msgid "Autosplit Audio Segment"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioSplitDialog.cpp:70
+msgid "AutoSplit Segment \""
+msgstr ""
+
+#: ../src/gui/dialogs/AudioSplitDialog.cpp:84
+msgid "Threshold"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioSplitDialog.cpp:142
+msgid "<no preview generated for this audio file>"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:70
+msgid "Audio Plugin"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:94
+#: ../src/gui/widgets/AudioFaderBox.cpp:136
+msgid "Editor"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:100
+msgid "Plugin"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:105
+msgid "Category:"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:110
+msgid "Plugin:"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:114
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:398
+msgid "Select a plugin from this list."
+msgstr ""
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:119
+msgid "Bypass"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:121
+msgid "Bypass this plugin."
+msgstr ""
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:127
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:390
+msgid "<ports>"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:130
+msgid "Input and output port counts."
+msgstr ""
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:132
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:391
+msgid "<id>"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:135
+msgid "Unique ID of plugin."
+msgstr ""
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:149
+msgid "Copy plugin parameters"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:155
+msgid "Paste plugin parameters"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:161
+msgid "Set to defaults"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:225
+msgid "(any)"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:226
+msgid "(unclassified)"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:247
+msgid "(none)"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:389
+#: ../src/gui/editors/parameters/AudioInstrumentParameterPanel.cpp:132
+#: ../src/gui/editors/parameters/AudioInstrumentParameterPanel.cpp:361
+#: ../src/gui/studio/AudioMixerWindow.cpp:685
+#: ../src/gui/studio/AudioMixerWindow.cpp:724
+#: ../src/gui/studio/AudioMixerWindow.cpp:906
+#: ../src/gui/widgets/AudioFaderBox.cpp:79
+msgid "<no plugin>"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:427
+msgid "This plugin has too many controls to edit here."
+msgstr ""
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:438
+#, c-format
+msgid "Id: %1"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:490
+msgid "mono"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:492
+msgid "stereo"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:494
+msgid "%1 in, %2 out"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:518
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:704
+msgid "Program: "
+msgstr ""
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:522
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:532
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:708
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:716
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:745
+msgid "<none selected>"
+msgstr ""
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:56
+msgid "Set the %1 property of the event selection:"
+msgstr ""
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:61
+msgid "Pattern"
+msgstr ""
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:66
+msgid "Flat - set %1 to value"
+msgstr ""
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:70
+msgid "Alternating - set %1 to max and min on alternate events"
+msgstr ""
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:74
+msgid "Crescendo - set %1 rising from min to max"
+msgstr ""
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:78
+msgid "Diminuendo - set %1 falling from max to min"
+msgstr ""
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:82
+msgid "Ringing - set %1 alternating from max to min with both dying to zero"
+msgstr ""
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:123
+#: ../src/gui/dialogs/EventParameterDialog.cpp:150
+msgid "First Value"
+msgstr ""
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:124
+#: ../src/gui/dialogs/EventParameterDialog.cpp:151
+msgid "Second Value"
+msgstr ""
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:132
+#: ../src/gui/dialogs/EventParameterDialog.cpp:142
+msgid "Low Value"
+msgstr ""
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:133
+#: ../src/gui/dialogs/EventParameterDialog.cpp:141
+msgid "High Value"
+msgstr ""
+
+#: ../src/gui/dialogs/TempoDialog.cpp:56 ../src/gui/rulers/TempoRuler.cpp:127
+msgid "Insert Tempo Change"
+msgstr ""
+
+#: ../src/gui/dialogs/TempoDialog.cpp:69
+msgid "New tempo:"
+msgstr ""
+
+#: ../src/gui/dialogs/TempoDialog.cpp:76
+msgid "Tap"
+msgstr ""
+
+#: ../src/gui/dialogs/TempoDialog.cpp:81
+msgid "Tempo is fixed until the following tempo change"
+msgstr ""
+
+#: ../src/gui/dialogs/TempoDialog.cpp:82
+msgid "Tempo ramps to the following tempo"
+msgstr ""
+
+#: ../src/gui/dialogs/TempoDialog.cpp:83
+msgid "Tempo ramps to:"
+msgstr ""
+
+#: ../src/gui/dialogs/TempoDialog.cpp:120
+msgid "Time of tempo change"
+msgstr ""
+
+#: ../src/gui/dialogs/TempoDialog.cpp:138
+msgid "The pointer is currently at "
+msgstr ""
+
+#: ../src/gui/dialogs/TempoDialog.cpp:154
+msgid "Apply this tempo from here onwards"
+msgstr ""
+
+#: ../src/gui/dialogs/TempoDialog.cpp:158
+msgid "Replace the last tempo change"
+msgstr ""
+
+#: ../src/gui/dialogs/TempoDialog.cpp:164
+msgid "Apply this tempo from the start of this bar"
+msgstr ""
+
+#: ../src/gui/dialogs/TempoDialog.cpp:167
+msgid "Apply this tempo to the whole composition"
+msgstr ""
+
+#: ../src/gui/dialogs/TempoDialog.cpp:172
+msgid "Also make this the default tempo"
+msgstr ""
+
+#: ../src/gui/dialogs/TempoDialog.cpp:256
+msgid "%1.%2 s,"
+msgstr ""
+
+#: ../src/gui/dialogs/TempoDialog.cpp:262
+#, c-format
+msgid "at the start of measure %1."
+msgstr "at the start of bar %1."
+
+#: ../src/gui/dialogs/TempoDialog.cpp:266
+#, c-format
+msgid "in the middle of measure %1."
+msgstr "in the middle of bar %1."
+
+#: ../src/gui/dialogs/TempoDialog.cpp:285
+msgid " (at %1.%2 s, in measure %3)"
+msgstr " (at %1.%2 s, in bar %3)"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:302
+msgid "There are no preceding tempo changes."
+msgstr ""
+
+#: ../src/gui/dialogs/TempoDialog.cpp:310
+msgid "There are no other tempo changes."
+msgstr ""
+
+#: ../src/gui/dialogs/TempoDialog.cpp:328
+msgid " bpm"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioPlayingDialog.cpp:42
+msgid "Playing audio file"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioPlayingDialog.cpp:47
+msgid "Playing audio file \"%1\""
+msgstr ""
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:52
+#: ../src/gui/editors/matrix/MatrixView.cpp:2655
+msgid "Trigger Segment"
+msgstr ""
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:61
+msgid "Trigger segment: "
+msgstr ""
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:59
+msgid "Key Change"
+msgstr ""
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:77
+msgid "Key signature"
+msgstr ""
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:80
+msgid "Key transposition"
+msgstr ""
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:86
+msgid "Existing notes following key change"
+msgstr ""
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:98
+msgid "Flatten"
+msgstr ""
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:100
+msgid "Key"
+msgstr ""
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:105
+msgid "Sharpen"
+msgstr ""
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:109
+msgid "Major"
+msgstr ""
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:110
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:369
+msgid "Minor"
+msgstr ""
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:123
+msgid "Transpose key according to segment transposition"
+msgstr ""
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:126
+msgid "Use specified key. Do not transpose"
+msgstr ""
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:134
+msgid "Apply to current segment only"
+msgstr ""
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:137
+msgid "Apply to all segments at this time"
+msgstr ""
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:141
+msgid "Exclude percussion segments"
+msgstr ""
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:155
+msgid "Maintain current accidentals"
+msgstr ""
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:158
+msgid "Transpose into this key"
+msgstr ""
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:331
+msgid "No such key"
+msgstr ""
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:44
+#: ../src/gui/editors/notation/NotationSelector.cpp:118
+msgid "Interpret"
+msgstr ""
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:50
+msgid "Interpretations to apply"
+msgstr ""
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:53
+msgid "Apply text dynamics (p, mf, ff etc)"
+msgstr ""
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:55
+msgid "Apply hairpin dynamics"
+msgstr ""
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:57
+msgid "Stress beats"
+msgstr ""
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:59
+msgid "Articulate slurs, staccato, tenuto etc"
+msgstr ""
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:61
+msgid "All available interpretations"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:316
+msgid ""
+"Attempted to launch JACK audio daemon failed. Audio will be disabled.\n"
+"Please check configuration (Settings -> Configure Rosegarden -> Audio -> "
+"Startup)\n"
+" and restart."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:325
+msgid "Starting sequencer..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:333
+msgid "Initializing plugin manager..."
+msgstr "Initialising plugin manager..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:338
+msgid "Initializing view..."
+msgstr "Initialising view..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:354
+msgid "Special Parameters"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:430
+msgid "Starting sequence manager..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:456
+msgid "Clearing studio data..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:475
+#: ../src/gui/editors/notation/NotationView.cpp:558
+msgid "Starting..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:556
+msgid "Import Rosegarden &Project file..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:560
+msgid "Import &MIDI file..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:564
+msgid "Import &Rosegarden 2.1 file..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:568
+msgid "Import &Hydrogen file..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:572
+msgid "Merge &File..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:576
+msgid "Merge &MIDI file..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:580
+msgid "Merge &Rosegarden 2.1 file..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:584
+msgid "Merge &Hydrogen file..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:588
+msgid "Export Rosegarden &Project file..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:592
+msgid "Export &MIDI file..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:596
+msgid "Export &LilyPond file..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:600
+msgid "Export Music&XML file..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:604
+msgid "Export &Csound score file..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:608
+msgid "Export M&up file..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:612
+#: ../src/gui/editors/notation/NotationView.cpp:1500
+msgid "Print &with LilyPond..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:616
+#: ../src/gui/editors/notation/NotationView.cpp:1504
+msgid "Preview with Lil&yPond..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:620
+msgid "Play&list"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:627
+msgid "Rosegarden &Tutorial"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:631
+msgid "&Bug Reporting Guidelines"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:645
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:348
+#: ../src/gui/editors/segment/MarkerEditor.cpp:378
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:388
+#: ../src/gui/general/EditViewBase.cpp:190
+#: ../src/gui/studio/BankEditorDialog.cpp:318
+#: ../src/gui/studio/DeviceManagerDialog.cpp:227
+msgid "Und&o"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:651
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:354
+#: ../src/gui/editors/segment/MarkerEditor.cpp:384
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:394
+#: ../src/gui/general/EditViewBase.cpp:196
+#: ../src/gui/studio/BankEditorDialog.cpp:324
+#: ../src/gui/studio/DeviceManagerDialog.cpp:233
+msgid "Re&do"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:665
+#: ../src/gui/editors/notation/NotationView.cpp:2297
+msgid "Show T&ools Toolbar"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:669
+msgid "Show Trac&ks Toolbar"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:673
+msgid "Show &Editors Toolbar"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:677
+#: ../src/gui/editors/notation/NotationView.cpp:2309
+msgid "Show Trans&port Toolbar"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:681
+msgid "Show &Zoom Toolbar"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:688
+msgid "Show Tra&nsport"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:693
+msgid "Show Track &Labels"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:698
+msgid "Show Playback Position R&uler"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:703
+msgid "Show Te&mpo Ruler"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:708
+msgid "Show Cho&rd Name Ruler"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:714
+msgid "Show Segment Pre&views"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:719
+msgid "Show Special &Parameters"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:753
+#: ../src/gui/editors/matrix/MatrixView.cpp:641
+#: ../src/gui/editors/notation/NotationView.cpp:1772
+msgid "&Select and Edit"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:758
+#: ../src/gui/editors/matrix/MatrixView.cpp:646
+msgid "&Draw"
+msgstr ""
+
+#: ../src/commands/edit/EraseCommand.h:50
+#: ../src/gui/application/RosegardenGUIApp.cpp:763
+#: ../src/gui/editors/matrix/MatrixView.cpp:651
+#: ../src/gui/editors/notation/NotationView.cpp:1766
+msgid "&Erase"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:768
+#: ../src/gui/editors/matrix/MatrixView.cpp:656
+msgid "&Move"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:775
+msgid "&Resize"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:782 rc.cpp:87
+#, no-c-format
+msgid "&Split"
+msgstr ""
+
+#: ../src/commands/segment/SegmentJoinCommand.h:53
+#: ../src/gui/application/RosegardenGUIApp.cpp:789
+msgid "&Join"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:795
+msgid "&Harmonize"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:806
+#: ../src/gui/rulers/TempoRuler.cpp:157
+msgid "Open Tempo and Time Signature Editor"
+msgstr ""
+
+#: ../src/commands/segment/CutRangeCommand.cpp:41
+#: ../src/gui/application/RosegardenGUIApp.cpp:812
+msgid "Cut Range"
+msgstr ""
+
+#: ../src/commands/edit/CopyCommand.cpp:73
+#: ../src/gui/application/RosegardenGUIApp.cpp:816
+msgid "Copy Range"
+msgstr ""
+
+#: ../src/commands/segment/PasteRangeCommand.cpp:45
+#: ../src/gui/application/RosegardenGUIApp.cpp:820
+msgid "Paste Range"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:828
+msgid "Insert Range..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:832
+#: ../src/gui/editors/notation/NotationView.cpp:1804
+msgid "De&lete"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:836
+msgid "Select &All Segments"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:852
+msgid "Edit Mar&kers..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:856
+msgid "Edit Document P&roperties..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:864
+msgid "Open in &Default Editor"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:870
+#: ../src/gui/general/EditViewBase.cpp:206
+msgid "Open in Matri&x Editor"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:876
+#: ../src/gui/general/EditViewBase.cpp:212
+msgid "Open in &Percussion Matrix Editor"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:882
+#: ../src/gui/general/EditViewBase.cpp:218
+msgid "Open in &Notation Editor"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:888
+#: ../src/gui/general/EditViewBase.cpp:224
+msgid "Open in &Event List Editor"
+msgstr ""
+
+#: ../src/commands/edit/EventQuantizeCommand.cpp:120
+#: ../src/commands/edit/EventUnquantizeCommand.cpp:87
+#: ../src/gui/application/RosegardenGUIApp.cpp:894
+msgid "&Quantize..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:908
+#: ../src/gui/editors/matrix/MatrixView.cpp:686
+msgid "Repeat Last Quantize"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:928
+msgid "Split at Time..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:932
+#: ../src/gui/general/EditView.cpp:796
+msgid "Jog &Left"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:936
+#: ../src/gui/general/EditView.cpp:800
+msgid "Jog &Right"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:940
+msgid "Set Start Time..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:944
+msgid "Set Duration..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:953
+msgid "Turn Re&peats into Copies"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:958
+msgid "Manage Tri&ggered Segments"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:962
+msgid "Set Tempos from &Beat Segment"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:966
+msgid "Set &Tempo to Audio Segment Duration"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:972
+msgid "Manage A&udio Files"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:977
+msgid "Show Segment Labels"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:986
+msgid "Add &Track"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:990
+msgid "&Add Tracks..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:996
+msgid "D&elete Track"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1002
+msgid "Move Track &Down"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1008
+msgid "Move Track &Up"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1012
+msgid "Select &Next Track"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1017
+msgid "Select &Previous Track"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1022
+msgid "Mute or Unmute Track"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1027
+msgid "Arm or Un-arm Track for Record"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1034
+msgid "&Mute all Tracks"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1040
+msgid "&Unmute all Tracks"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1044
+msgid "&Remap Instruments..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1053
+msgid "&Audio Mixer"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1059
+msgid "Midi Mi&xer"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1065
+msgid "Manage MIDI &Devices"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1071
+msgid "Manage S&ynth Plugins"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1075
+msgid "Modify MIDI &Filters"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1079
+msgid "MIDI Thru Routing"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1085
+msgid "Manage &Metronome"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1089
+msgid "&Save Current Document as Default Studio"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1093
+msgid "&Import Default Studio"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1097
+msgid "Im&port Studio from File..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1101
+msgid "&Reset MIDI Network"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1105
+#, fuzzy
+msgid "Set Quick Marker at Playback Position"
+msgstr "Delete Colour"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1109
+msgid "Jump to Quick Marker"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1142
+#: ../src/gui/editors/matrix/MatrixView.cpp:782
+#: ../src/gui/editors/notation/NotationView.cpp:2397
+#: ../src/gui/studio/AudioMixerWindow.cpp:105
+#: ../src/gui/studio/MidiMixerWindow.cpp:81
+msgid "&Play"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1153
+#: ../src/gui/editors/matrix/MatrixView.cpp:791
+#: ../src/gui/editors/notation/NotationView.cpp:2406
+#: ../src/gui/studio/AudioMixerWindow.cpp:114
+#: ../src/gui/studio/MidiMixerWindow.cpp:90
+msgid "&Stop"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1160
+#: ../src/gui/editors/matrix/MatrixView.cpp:802
+#: ../src/gui/editors/notation/NotationView.cpp:2417
+#: ../src/gui/studio/AudioMixerWindow.cpp:125
+#: ../src/gui/studio/MidiMixerWindow.cpp:101
+msgid "&Fast Forward"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1168
+#: ../src/gui/editors/matrix/MatrixView.cpp:796
+#: ../src/gui/editors/notation/NotationView.cpp:2411
+#: ../src/gui/studio/AudioMixerWindow.cpp:119
+#: ../src/gui/studio/MidiMixerWindow.cpp:95
+msgid "Re&wind"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1175
+msgid "P&unch in Record"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1182
+#: ../src/gui/studio/AudioMixerWindow.cpp:143
+#: ../src/gui/studio/MidiMixerWindow.cpp:119
+msgid "&Record"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1189
+#: ../src/gui/editors/matrix/MatrixView.cpp:808
+#: ../src/gui/editors/notation/NotationView.cpp:2423
+#: ../src/gui/studio/AudioMixerWindow.cpp:131
+#: ../src/gui/studio/MidiMixerWindow.cpp:107
+msgid "Rewind to &Beginning"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1196
+#: ../src/gui/editors/matrix/MatrixView.cpp:814
+#: ../src/gui/editors/notation/NotationView.cpp:2429
+#: ../src/gui/studio/AudioMixerWindow.cpp:137
+#: ../src/gui/studio/MidiMixerWindow.cpp:113
+msgid "Fast Forward to &End"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1203
+#: ../src/gui/editors/matrix/MatrixView.cpp:832
+#: ../src/gui/editors/notation/NotationView.cpp:2447
+msgid "Scro&ll to Follow Playback"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1209
+#: ../src/gui/editors/matrix/MatrixView.cpp:838
+#: ../src/gui/editors/notation/NotationView.cpp:2453
+#: ../src/gui/studio/AudioMixerWindow.cpp:149
+#: ../src/gui/studio/MidiMixerWindow.cpp:125
+msgid "Panic"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1213
+msgid "Segment Debug Dump "
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1283
+msgid " Zoom: "
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1719
+msgid "File \"%1\" does not exist"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1725
+msgid "File \"%1\" is actually a directory"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1734
+msgid "You do not have read permission for \"%1\""
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1802
+msgid ""
+"An auto-save file for this document has been found\n"
+"Do you want to open it instead ?"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1896
+msgid "Example Files"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2100
+msgid "Opening a new application window..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2110
+msgid "Creating new document..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2154
+#, c-format
+msgid ""
+"Malformed URL\n"
+"%1"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2179
+#: ../src/gui/application/RosegardenGUIApp.cpp:2240
+msgid "Opening file..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2201
+#: ../src/gui/application/RosegardenGUIApp.cpp:2220
+msgid "Open File"
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:1225
+#: ../src/gui/application/RosegardenGUIApp.cpp:2258
+msgid "Saving file..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2330
+msgid "This is not a valid filename.\n"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2335
+msgid "This is not a local file.\n"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2342
+#: ../src/gui/studio/BankEditorDialog.cpp:1640
+#: ../src/gui/studio/DeviceManagerDialog.cpp:787
+msgid "You have specified a directory"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2348
+#: ../src/gui/studio/BankEditorDialog.cpp:1646
+#: ../src/gui/studio/DeviceManagerDialog.cpp:793
+msgid "The specified file exists. Overwrite?"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2362
+msgid "Saving file with a new filename..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2364
+msgid "Rosegarden files"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2365
+#: ../src/gui/application/RosegardenGUIApp.cpp:4860
+#: ../src/gui/application/RosegardenGUIApp.cpp:4904
+#: ../src/gui/application/RosegardenGUIApp.cpp:4942
+#: ../src/gui/application/RosegardenGUIApp.cpp:4975
+#: ../src/gui/application/RosegardenGUIApp.cpp:5009
+#: ../src/gui/application/RosegardenGUIApp.cpp:5116
+msgid "All files"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2366
+msgid "Save as..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2404
+msgid "Closing file..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2421
+#: ../src/gui/editors/notation/NotationView.cpp:4618
+msgid "Printing..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2433
+#: ../src/gui/editors/notation/NotationView.cpp:4635
+msgid "Previewing..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2440
+msgid "Exiting..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2463
+msgid "Cutting selection..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2474
+#: ../src/gui/editors/matrix/MatrixView.cpp:1614
+#: ../src/gui/editors/notation/NotationView.cpp:4763
+msgid "Copying selection to clipboard..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2484
+#: ../src/gui/editors/eventlist/EventView.cpp:878
+#: ../src/gui/editors/matrix/MatrixView.cpp:1625
+#: ../src/gui/editors/notation/NotationView.cpp:4796
+#: ../src/gui/editors/notation/NotationView.cpp:4841
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:352
+msgid "Clipboard is empty"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2487
+#: ../src/gui/editors/eventlist/EventView.cpp:882
+#: ../src/gui/editors/matrix/MatrixView.cpp:1629
+#: ../src/gui/editors/notation/NotationView.cpp:4804
+#: ../src/gui/editors/notation/NotationView.cpp:4845
+msgid "Inserting clipboard contents..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2556
+msgid "Duration of empty range to insert"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2631
+msgid "This function needs no more than one segment to be selected."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2654
+msgid "Can't join Audio segments"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2707
+msgid "rescaling an audio file"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2723
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:172
+msgid "Rescaling audio file..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2767
+msgid ""
+"The audio file path does not exist or is not writable.\n"
+"You must set the audio file path to a valid directory in Document Properties "
+"before %1.\n"
+"Would you like to set it now?"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2769
+#: ../src/gui/application/RosegardenGUIApp.cpp:5291
+#: ../src/gui/application/RosegardenGUIApp.cpp:5339
+#: ../src/gui/editors/segment/TrackButtons.cpp:419
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:159
+msgid "Set audio file path"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2833
+msgid "Jog Selection"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2978
+#, c-format
+msgid ""
+"_n: Split Segment at Time\n"
+"Split %n Segments at Time"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3013
+#: ../src/gui/general/EditViewBase.cpp:619
+msgid "Segment Start Time"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3023
+msgid "Set Segment Start Times"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3024
+#: ../src/gui/general/EditViewBase.cpp:626
+msgid "Set Segment Start Time"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3056
+#: ../src/gui/general/EditViewBase.cpp:644
+msgid "Segment Duration"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3068
+msgid "Set Segment Durations"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3069
+#: ../src/gui/general/EditViewBase.cpp:652
+msgid "Set Segment Duration"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3176
+#: ../src/gui/application/RosegardenGUIApp.cpp:5875
+msgid "Set Global Tempo"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3234
+#: ../src/gui/general/EditViewBase.cpp:477
+msgid "Toggle the toolbar..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3244
+msgid "Toggle the tools toolbar..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3254
+msgid "Toggle the tracks toolbar..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3264
+msgid "Toggle the editor toolbar..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3274
+msgid "Toggle the transport toolbar..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3284
+msgid "Toggle the zoom toolbar..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3294
+msgid "Toggle the Transport"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3377
+#: ../src/gui/general/EditViewBase.cpp:487
+msgid "Toggle the statusbar..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3434
+msgid ""
+"The join tool isn't implemented yet. Instead please highlight the segments "
+"you want to join and then use the menu option:\n"
+"\n"
+" Segments->Collapse Segments.\n"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3437
+msgid "Join tool not yet implemented"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3675
+msgid "Revert modified document to previous saved version?"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3691
+msgid ""
+"*.rgp|Rosegarden Project files\n"
+"*|All files"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3692
+msgid "Import Rosegarden Project File"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3717
+msgid "Failed to import project file \"%1\""
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3739
+msgid "Open MIDI File"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3756
+msgid "Merge MIDI File"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3866
+msgid "Importing MIDI file..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3903
+msgid "Calculating notation..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3950
+msgid "Calculate Notation"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3991
+#: ../src/gui/application/RosegardenGUIApp.cpp:4008
+msgid ""
+"*.rose|Rosegarden-2 files\n"
+"*|All files"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3992
+#: ../src/gui/application/RosegardenGUIApp.cpp:4009
+msgid "Open Rosegarden 2.1 File"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4026
+msgid "Importing Rosegarden 2.1 file..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4052
+msgid "Can't load Rosegarden 2.1 file. It appears to be corrupted."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4078
+#: ../src/gui/application/RosegardenGUIApp.cpp:4095
+msgid ""
+"*.h2song|Hydrogen files\n"
+"*|All files"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4079
+#: ../src/gui/application/RosegardenGUIApp.cpp:4096
+msgid "Open Hydrogen File"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4113
+msgid "Importing Hydrogen file..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4139
+msgid "Can't load Hydrogen file. It appears to be corrupted."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4527
+msgid "Export and import of Rosegarden Project files"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4529
+msgid "The Rosegarden Project Packager helper script"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4533
+msgid "%1 - for project file support"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4550
+msgid "The Rosegarden LilyPondView helper script"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4554
+msgid "%1 - for LilyPond preview support"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4570
+msgid "The Rosegarden Audio File Importer helper script"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4574
+msgid "%1 - for audio file import"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4585
+msgid ""
+"<h3>Helper programs not found</h3><p>Rosegarden could not find one or more "
+"helper programs which it needs to provide some features. The following "
+"features will not be available:</p>"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4586
+#: ../src/gui/application/RosegardenGUIApp.cpp:4592
+msgid "<ul>"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4588
+#: ../src/gui/application/RosegardenGUIApp.cpp:4594
+msgid "<li>%1</li>"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4590
+#: ../src/gui/application/RosegardenGUIApp.cpp:4596
+msgid "</ul>"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4591
+msgid ""
+"<p>To fix this, you should install the following additional programs:</p>"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4603
+msgid "Helper programs not found"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4686
+msgid "Starting the sequencer..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4712
+msgid "Couldn't start the sequencer"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4789
+msgid "Clearing down jackd..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4803
+msgid "Starting jackd..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4842
+msgid ""
+"The Rosegarden sequencer process has exited unexpectedly. Sound and "
+"recording will no longer be available for this session.\n"
+"Please exit and restart Rosegarden to restore sound capability."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4846
+msgid ""
+"The Rosegarden sequencer could not be started, so sound and recording will "
+"be unavailable for this session.\n"
+"For assistance with correct audio and MIDI configuration, go to http://"
+"rosegardenmusic.com."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4856
+msgid "Exporting Rosegarden Project file..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4859
+msgid "Rosegarden Project files\n"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4861
+#: ../src/gui/application/RosegardenGUIApp.cpp:4905
+#: ../src/gui/application/RosegardenGUIApp.cpp:4943
+#: ../src/gui/application/RosegardenGUIApp.cpp:4976
+#: ../src/gui/application/RosegardenGUIApp.cpp:5010
+#: ../src/gui/application/RosegardenGUIApp.cpp:5116
+msgid "Export as..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4875
+#, c-format
+msgid "Saving Rosegarden file to package failed: %1"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4889
+msgid "Failed to export to project file \"%1\""
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4900
+#: ../src/gui/application/RosegardenGUIApp.cpp:4915
+msgid "Exporting MIDI file..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4903
+msgid "Standard MIDI files\n"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4934
+#: ../src/gui/application/RosegardenGUIApp.cpp:4966
+#: ../src/gui/application/RosegardenGUIApp.cpp:4999
+#: ../src/gui/application/RosegardenGUIApp.cpp:5103
+#: ../src/gui/application/RosegardenGUIApp.cpp:5140
+#: ../src/gui/editors/notation/NotationView.cpp:4733
+msgid "Export failed. The file could not be opened for writing."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4940
+#: ../src/gui/application/RosegardenGUIApp.cpp:4952
+msgid "Exporting Csound score file..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4972
+#: ../src/gui/application/RosegardenGUIApp.cpp:4985
+msgid "Exporting Mup file..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4975
+msgid "Mup files\n"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5005
+#: ../src/gui/application/RosegardenGUIApp.cpp:5089
+#: ../src/gui/editors/notation/NotationView.cpp:4719
+msgid "Exporting LilyPond file..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5008
+msgid "LilyPond files"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5023
+#: ../src/gui/editors/notation/NotationView.cpp:4653
+msgid "Printing LilyPond file..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5028
+#: ../src/gui/application/RosegardenGUIApp.cpp:5052
+#: ../src/gui/editors/notation/NotationView.cpp:4658
+#: ../src/gui/editors/notation/NotationView.cpp:4682
+msgid "Failed to open a temporary file for LilyPond export."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5047
+#: ../src/gui/editors/notation/NotationView.cpp:4677
+msgid "Previewing LilyPond file..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5080
+#: ../src/gui/editors/notation/NotationView.cpp:4710
+msgid "LilyPond Preview Options"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5081
+#: ../src/gui/editors/notation/NotationView.cpp:4711
+msgid "LilyPond preview options"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5112
+#: ../src/gui/application/RosegardenGUIApp.cpp:5126
+msgid "Exporting MusicXML file..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5115
+msgid "XML files"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5289
+#: ../src/gui/editors/segment/TrackButtons.cpp:417
+msgid ""
+"The audio file path does not exist or is not writable.\n"
+"Please set the audio file path to a valid directory in Document Properties "
+"before recording audio.\n"
+"Would you like to set it now?"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5337
+msgid ""
+"The audio file path does not exist or is not writable.\n"
+"Please set the audio file path to a valid directory in Document Properties "
+"before you start to record audio.\n"
+"Would you like to set it now?"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5780
+msgid "Move playback pointer to time"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5793
+#: ../src/gui/editors/matrix/MatrixView.cpp:2240
+msgid "%1%"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5861
+#, c-format
+msgid "Replace Tempo Change at %1"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5891
+msgid "Set Global and Default Tempo"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5914
+msgid "Move Tempo Change"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5949
+#, fuzzy
+msgid "new marker"
+msgstr "Delete Colour"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5950
+msgid "no description"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:6363
+#, c-format
+msgid "Sequencer failed to add audio file %1"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:6388
+#, c-format
+msgid "Sequencer failed to remove audio file id %1"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:6448
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:1086
+msgid "Modify Segment label"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:6450
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:1088
+msgid "Modify Segments label"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:6452
+msgid "Relabelling selection..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7539
+msgid "Play List"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7567
+msgid "http://rosegarden.sourceforge.net/tutorial/en/chapter-0.html"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7574
+msgid "http://rosegarden.sourceforge.net/tutorial/bug-guidelines.html"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7650
+msgid "Queueing MIDI panic events for tranmission..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7708
+msgid "Are you sure you want to save this as your default studio?"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7713
+msgid "Saving current document as default studio..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7738
+msgid ""
+"Are you sure you want to import your default studio and lose the current one?"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7773
+msgid "Import Studio from File"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7807
+msgid "Import Studio"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:8015
+msgid ""
+"<h3>Newer version available</h3><p>A newer version of Rosegarden may be "
+"available.<br>Please consult the <a href=\"http://www.rosegardenmusic.com/"
+"getting/\">Rosegarden website</a> for more information.</p>"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:8016
+msgid "Newer version available"
+msgstr ""
+
+#: ../src/gui/application/RosegardenApplication.cpp:104
+#, c-format
+msgid "Failed to load soundfont %1"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:311
+msgid "Rosegarden - A sequencer and musical notation editor"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:315
+msgid "Don't use the sequencer (support editing only)"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:316
+msgid "Don't show the splash screen"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:317
+msgid "Don't automatically run in the background"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:318
+msgid "Attach to a running sequencer process, if found"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:319
+msgid "Ignore installed version - for devs only"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:320
+msgid "file to open"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:370
+msgid "Installation contains the wrong version of Rosegarden."
+msgstr ""
+
+#: ../src/gui/application/main.cpp:371
+msgid ""
+" The wrong versions of Rosegarden's data files were\n"
+" found in the standard KDE installation directories.\n"
+" (I am %1, but the installed files are for version %2.)\n"
+"\n"
+" This may mean one of the following:\n"
+"\n"
+" 1. This is a new upgrade of Rosegarden, and it has not yet been\n"
+" installed. If you compiled it yourself, check that you have\n"
+" run \"make install\" and that the procedure completed\n"
+" successfully.\n"
+"\n"
+" 2. The upgrade was installed in a non-standard directory,\n"
+" and an old version was found in a standard directory. If so,\n"
+" you will need to add the correct directory to your KDEDIRS\n"
+" environment variable before you can run it."
+msgstr ""
+
+#: ../src/gui/application/main.cpp:383 ../src/gui/application/main.cpp:401
+msgid "Installation problem"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:389
+msgid "Rosegarden does not appear to have been installed."
+msgstr ""
+
+#: ../src/gui/application/main.cpp:390
+msgid ""
+" One or more of Rosegarden's data files could not be\n"
+" found in the standard KDE installation directories.\n"
+"\n"
+" This may mean one of the following:\n"
+"\n"
+" 1. Rosegarden has not been correctly installed. If you compiled\n"
+" it yourself, check that you have run \"make install\" and that\n"
+" the procedure completed successfully.\n"
+"\n"
+" 2. Rosegarden has been installed in a non-standard directory,\n"
+" and you need to add this directory to your KDEDIRS environment\n"
+" variable before you can run it. This may be the case if you\n"
+" installed into $HOME or a local third-party package directory\n"
+" like /usr/local or /opt."
+msgstr ""
+
+#: ../src/gui/application/main.cpp:414
+msgid "Rosegarden"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:416
+msgid ""
+"Copyright 2000 - 2008 Guillaume Laurent, Chris Cannam, Richard Bown\n"
+"Parts copyright 1994 - 2004 Chris Cannam, Andy Green, Richard Bown, "
+"Guillaume Laurent\n"
+"LilyPond fonts copyright 1997 - 2005 Han-Wen Nienhuys and Jan Nieuwenhuizen"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:428
+msgid "Chord labelling code"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:429
+msgid ""
+"LilyPond output\n"
+"assorted other patches\n"
+"i18n-ization"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:430
+msgid ""
+"UI improvements\n"
+"bug fixes"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:431
+msgid ""
+"Segment colours\n"
+"Other UI and bug fixes"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:432
+msgid ""
+"Russian translation\n"
+"i18n-ization"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:433 ../src/gui/application/main.cpp:434
+msgid "German translation"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:435
+msgid "Welsh translation"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:436
+msgid "French translation"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:437
+msgid ""
+"French translation\n"
+"Bug fixes"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:438 ../src/gui/application/main.cpp:439
+msgid "Italian translation"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:440 ../src/gui/application/main.cpp:441
+msgid "Swedish translation"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:442
+msgid "Estonian translation"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:443 ../src/gui/application/main.cpp:444
+msgid "Dutch translation"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:445
+msgid "HSpinBox class"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:446
+msgid "Transposition by interval"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:447
+msgid "Original designs for rotary controllers"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:448
+msgid "Japanese translation"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:449
+msgid ""
+"Auto-scroll deceleration\n"
+"Rests outside staves and other bug fixes"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:450
+msgid "Simplified Chinese translation"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:451
+msgid "LIRC infrared remote-controller support"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:452
+msgid "MTC slave timing implementation"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:453
+msgid "Czech translation"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:454
+msgid "SCons/bksys building system"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:455
+msgid "icons, icons, icons"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:456 ../src/gui/application/main.cpp:457
+#: ../src/gui/application/main.cpp:458 ../src/gui/application/main.cpp:459
+msgid "Spanish translation"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:460 ../src/gui/application/main.cpp:461
+msgid "Catalan translation"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:462
+msgid ""
+"1.2.3 splash screen photo\n"
+"Gave birth to D. Michael McIntyre, bought him a good flute once\n"
+"upon a time, and always humored him when he came over to play her\n"
+"some new instrument, even though she really hated his playing.\n"
+"Born October 19, 1951, died September 21, 2007, R. I. P."
+msgstr ""
+
+#: ../src/gui/application/main.cpp:463
+msgid "Initial guitar chord editing code"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:464
+msgid "Polish translation"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:465
+msgid "Basque translation"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:466
+msgid "Klearlook theme"
+msgstr ""
+
+#: ../src/_translatorinfo.cpp:1 ../src/gui/application/main.cpp:468
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr "Chris Cannam"
+
+#: ../src/_translatorinfo.cpp:3 ../src/gui/application/main.cpp:468
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+
+#: ../src/gui/application/main.cpp:719
+msgid "Welcome!"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:731
+msgid ""
+"<h2>Welcome to Rosegarden!</h2><p>Welcome to the Rosegarden audio and MIDI "
+"sequencer and musical notation editor.</p><ul><li>If you have not already "
+"done so, you may wish to install some DSSI synth plugins, or a separate "
+"synth program such as QSynth. Rosegarden does not synthesize sounds from "
+"MIDI on its own, so without these you will hear nothing.</"
+"li><br><br><li>Rosegarden uses the JACK audio server for recording and "
+"playback of audio, and for playback from DSSI synth plugins. These features "
+"will only be available if the JACK server is running.</"
+"li><br><br><li>Rosegarden has comprehensive documentation: see the Help menu "
+"for the handbook, tutorials, and other information!</li></ul><p>Rosegarden "
+"was brought to you by a team of volunteers across the world. To learn more, "
+"go to <a href=\"http://www.rosegardenmusic.com/\">http://www.rosegardenmusic."
+"com/</a>.</p>"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIView.cpp:257
+msgid "No non-audio segments in composition"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIView.cpp:333
+msgid "Selection must contain only audio or non-audio segments"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIView.cpp:431
+#: ../src/gui/application/RosegardenGUIView.cpp:576
+#: ../src/gui/application/RosegardenGUIView.cpp:612
+#: ../src/gui/application/RosegardenGUIView.cpp:776
+msgid "No non-audio segments selected"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIView.cpp:851
+msgid ""
+"You've not yet defined an audio editor for Rosegarden to use.\n"
+"See Settings -> Configure Rosegarden -> Audio."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIView.cpp:1559
+#: ../src/gui/application/RosegardenGUIView.cpp:1564
+msgid "Can't add dropped file. "
+msgstr ""
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1014
+#: ../src/gui/seqmanager/SequenceManager.cpp:1150
+msgid ""
+"The JACK Audio subsystem has failed or it has stopped Rosegarden from "
+"processing audio.\n"
+"Please restart Rosegarden to continue working with audio.\n"
+"Quitting other running applications may improve Rosegarden's performance."
+msgstr ""
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1020
+#: ../src/gui/seqmanager/SequenceManager.cpp:1156
+msgid ""
+"The JACK Audio subsystem has stopped Rosegarden from processing audio, "
+"probably because of a processing overload.\n"
+"An attempt to restart the audio service has been made, but some problems may "
+"remain.\n"
+"Quitting other running applications may improve Rosegarden's performance."
+msgstr ""
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1031
+msgid ""
+"Run out of processor power for real-time audio processing. Cannot continue."
+msgstr ""
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1057
+msgid ""
+"A serious error has occurred in the ALSA MIDI subsystem. It may not be "
+"possible to continue sequencing. Please check console output for more "
+"information."
+msgstr ""
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1078
+msgid "JACK Audio subsystem is losing sample frames."
+msgstr ""
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1096
+msgid ""
+"Failed to read audio data from disc in time to service the audio subsystem."
+msgstr ""
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1100
+msgid ""
+"Failed to write audio data to disc fast enough to service the audio "
+"subsystem."
+msgstr ""
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1104
+msgid "The audio mixing subsystem is failing to keep up."
+msgstr ""
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1108
+msgid "The audio subsystem is failing to keep up."
+msgstr ""
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1112
+msgid "Unknown sequencer failure mode!"
+msgstr ""
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1170
+msgid ""
+"<h3>System timer resolution is too low</h3><p>Rosegarden was unable to find "
+"a high-resolution timing source for MIDI performance.</p><p>This may mean "
+"you are using a Linux system with the kernel timer resolution set too low. "
+"Please contact your Linux distributor for more information.</p><p>Some Linux "
+"distributors already provide low latency kernels, see <a href=\"http://"
+"rosegarden.wiki.sourceforge.net/Low+latency+kernels\">http://rosegarden.wiki."
+"sourceforge.net/Low+latency+kernels</a> for instructions.</p>"
+msgstr ""
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1188
+msgid ""
+"<h3>System timer resolution is too low</h3><p>Rosegarden was unable to find "
+"a high-resolution timing source for MIDI performance.</p><p>You may be able "
+"to solve this problem by loading the RTC timer kernel module. To do this, "
+"try running <b>sudo modprobe snd-rtctimer</b> in a terminal window and then "
+"restarting Rosegarden.</p><p>Alternatively, check whether your Linux "
+"distributor provides a multimedia-optimized kernel. See <a href=\"http://"
+"rosegarden.wiki.sourceforge.net/Low+latency+kernels\">http://rosegarden.wiki."
+"sourceforge.net/Low+latency+kernels</a> for notes about this.</p>"
+msgstr ""
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1312
+msgid ""
+"<p>Both MIDI and Audio subsystems have failed to initialize.</p><p>You may "
+"continue without the sequencer, but we suggest closing Rosegarden, running "
+"\"alsaconf\" as root, and starting Rosegarden again. If you wish to run "
+"with no sequencer by design, then use \"rosegarden --nosequencer\" to avoid "
+"seeing this error in the future.</p>"
+msgstr ""
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1314
+msgid ""
+"<p>The MIDI subsystem has failed to initialize.</p><p>You may continue "
+"without the sequencer, but we suggest closing Rosegarden, running \"modprobe "
+"snd-seq-midi\" as root, and starting Rosegarden again. If you wish to run "
+"with no sequencer by design, then use \"rosegarden --nosequencer\" to avoid "
+"seeing this error in the future.</p>"
+msgstr ""
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1316
+msgid ""
+"<p>The Rosegarden sequencer module version does not match the GUI module "
+"version.</p><p>You have probably mixed up files from two different versions "
+"of Rosegarden. Please check your installation.</p>"
+msgstr ""
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1322
+#, c-format
+msgid "<h3>Sequencer startup failed</h3>%1"
+msgstr ""
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1330
+msgid ""
+"<h3>Failed to connect to JACK audio server.</h3><p>Rosegarden could not "
+"connect to the JACK audio server. This probably means the JACK server is "
+"not running.</p><p>If you want to be able to play or record audio files or "
+"use plugins, you should exit Rosegarden and start the JACK server before "
+"running Rosegarden again.</p>"
+msgstr ""
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1331
+msgid "Failed to connect to JACK"
+msgstr ""
+
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:46
+msgid "Modify MIDI filters..."
+msgstr ""
+
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:58
+msgid "THRU events to ignore"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:131
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:60
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:96
+msgid "Note"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:132
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:61
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:97
+msgid "Program Change"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:136
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:62
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:98
+msgid "Key Pressure"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:137
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:63
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:99
+msgid "Channel Pressure"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:134
+#: ../src/gui/general/EditView.cpp:899
+#: ../src/gui/rulers/ControllerEventsRuler.cpp:198
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:64
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:100
+msgid "Pitch Bend"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:133
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:65
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:101
+msgid "Controller"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:135
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:66
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:102
+msgid "System Exclusive"
+msgstr ""
+
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:94
+msgid "RECORD events to ignore"
+msgstr ""
+
+#: ../src/gui/widgets/TimeWidget.cpp:101
+msgid "Note:"
+msgstr ""
+
+#: ../src/gui/widgets/TimeWidget.cpp:108 ../src/gui/widgets/TimeWidget.cpp:145
+msgid "<inexact>"
+msgstr ""
+
+#: ../src/gui/widgets/TimeWidget.cpp:151
+msgid "Units:"
+msgstr ""
+
+#: ../src/gui/widgets/TimeWidget.cpp:173
+msgid "Time:"
+msgstr ""
+
+#: ../src/gui/widgets/TimeWidget.cpp:184
+msgid "units"
+msgstr ""
+
+#: ../src/gui/widgets/TimeWidget.cpp:193
+msgid "Measures:"
+msgstr "Bars"
+
+#: ../src/gui/widgets/TimeWidget.cpp:193
+msgid "Measure:"
+msgstr "Bar"
+
+#: ../src/gui/widgets/TimeWidget.cpp:212
+msgid "beats:"
+msgstr ""
+
+#: ../src/gui/widgets/TimeWidget.cpp:212
+msgid "beat:"
+msgstr ""
+
+#: ../src/gui/widgets/TimeWidget.cpp:230
+msgid "%1:"
+msgstr ""
+
+#: ../src/gui/widgets/TimeWidget.cpp:254
+msgid "Seconds:"
+msgstr ""
+
+#: ../src/gui/widgets/TimeWidget.cpp:273
+msgid "msec:"
+msgstr ""
+
+#: ../src/gui/widgets/TimeWidget.cpp:407 ../src/gui/widgets/TimeWidget.cpp:531
+msgid "(%1/%2 time)"
+msgstr ""
+
+#: ../src/gui/widgets/TimeWidget.cpp:452
+msgid "(starting %1.%2 qpm, %2.%3 bpm)"
+msgstr ""
+
+#: ../src/gui/widgets/TimeWidget.cpp:458
+msgid "(starting %1.%2 bpm)"
+msgstr ""
+
+#: ../src/gui/widgets/TimeWidget.cpp:464
+msgid "(%1.%2 qpm, %2.%3 bpm)"
+msgstr ""
+
+#: ../src/gui/widgets/TimeWidget.cpp:470
+msgid "(%1.%2 bpm)"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:239
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:60
+msgid "C"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:241
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:61
+msgid "D"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:243
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:62
+msgid "E"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:244
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:63
+msgid "F"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:246
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:64
+msgid "G"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:248
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:65
+msgid "A"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:250
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:66
+msgid "B"
+msgstr ""
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:70
+msgid "-2"
+msgstr ""
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:71
+msgid "-1"
+msgstr ""
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:72
+msgid "0"
+msgstr ""
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:73
+msgid "1"
+msgstr ""
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:74
+msgid "2"
+msgstr ""
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:75
+msgid "3"
+msgstr ""
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:76
+msgid "4"
+msgstr ""
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:77
+msgid "5"
+msgstr ""
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:78
+msgid "6"
+msgstr ""
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:79
+msgid "7"
+msgstr ""
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:83
+#, fuzzy
+msgid "double flat"
+msgstr "breve"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:84
+msgid "flat"
+msgstr ""
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:85
+msgid "natural"
+msgstr ""
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:86
+msgid "sharp"
+msgstr ""
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:87
+#, fuzzy
+msgid "double sharp"
+msgstr "breve"
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:234
+#, c-format
+msgid "In %1"
+msgstr ""
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:587
+#: ../src/gui/widgets/AudioRouteMenu.cpp:236
+#: ../src/gui/widgets/AudioRouteMenu.cpp:259
+msgid "Master"
+msgstr ""
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:528
+#: ../src/gui/widgets/AudioRouteMenu.cpp:238
+#: ../src/gui/widgets/AudioRouteMenu.cpp:261
+#, c-format
+msgid "Sub %1"
+msgstr ""
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:244
+msgid "In %1 R"
+msgstr ""
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:245
+msgid "In %1 L"
+msgstr ""
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:247
+msgid "Master R"
+msgstr ""
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:248
+msgid "Master L"
+msgstr ""
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:250
+msgid "Sub %1 R"
+msgstr ""
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:251
+msgid "Sub %1 L"
+msgstr ""
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:391
+#: ../src/gui/studio/AudioMixerWindow.cpp:522
+#: ../src/gui/widgets/AudioFaderBox.cpp:82
+msgid "Audio plugin button"
+msgstr ""
+
+#: ../src/gui/editors/parameters/AudioInstrumentParameterPanel.cpp:129
+#: ../src/gui/editors/parameters/AudioInstrumentParameterPanel.cpp:357
+#: ../src/gui/widgets/AudioFaderBox.cpp:91
+msgid "<no synth>"
+msgstr ""
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:93
+msgid "Synth plugin button"
+msgstr ""
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:153
+msgid "Set the audio pan position in the stereo field"
+msgstr ""
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:155
+msgid "Open synth plugin's native editor"
+msgstr ""
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:157
+msgid "Mono or Stereo Instrument"
+msgstr ""
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:159
+msgid "Record level"
+msgstr ""
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:161
+msgid "Playback level"
+msgstr ""
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:345
+#: ../src/gui/studio/AudioMixerWindow.cpp:347
+#: ../src/gui/studio/AudioMixerWindow.cpp:503
+#: ../src/gui/studio/AudioMixerWindow.cpp:505
+#: ../src/gui/widgets/AudioFaderBox.cpp:163
+msgid "Audio level"
+msgstr ""
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:170
+msgid "In:"
+msgstr ""
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:173
+msgid "Out:"
+msgstr ""
+
+#: ../src/gui/widgets/ProgressDialog.cpp:48
+#: ../src/gui/widgets/ProgressDialog.cpp:53
+#: ../src/gui/widgets/ProgressDialog.cpp:76
+msgid "Processing..."
+msgstr ""
+
+#: ../src/gui/configuration/ColourConfigurationPage.h:60
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:130
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:346
+#: ../src/gui/widgets/ColourTable.cpp:52
+msgid "Color"
+msgstr "Colour"
+
+#: ../src/gui/widgets/ColourTable.cpp:68
+msgid "Modify Color Name"
+msgstr "Modify Colour Name"
+
+#: ../src/gui/configuration/ColourConfigurationPage.cpp:129
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:983
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:882
+#: ../src/gui/widgets/ColourTable.cpp:68
+msgid "Enter new name"
+msgstr ""
+
+#: ../src/gui/widgets/ColourTable.cpp:107
+msgid "Default Color"
+msgstr "Default Colour"
+
+#: ../src/gui/widgets/Rotary.cpp:108
+msgid ""
+"Click and drag up and down or left and right to modify.\n"
+"Double click to edit value directly."
+msgstr ""
+
+#: ../src/gui/widgets/Rotary.cpp:433
+msgid "Select a new value"
+msgstr ""
+
+#: ../src/gui/widgets/Rotary.cpp:434
+msgid "Enter a new value"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:80
+msgid "Quantizer"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:86
+msgid "Quantizer type:"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:88
+msgid "Grid quantizer"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:89
+msgid "Legato quantizer"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:90
+msgid "Heuristic notation quantizer"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:94
+msgid "Quantize for notation only (leave performance unchanged)"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:104
+msgid "Notation parameters"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:109
+#: ../src/gui/widgets/QuantizeParameters.cpp:150
+msgid "Base grid unit:"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:114
+msgid "Complexity:"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:118
+msgid "Very high"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:119
+msgid "High"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:224
+#: ../src/gui/widgets/QuantizeParameters.cpp:120
+msgid "Normal"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:121
+msgid "Low"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:122
+msgid "Very low"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:125
+msgid "Tuplet level:"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:129
+msgid "2-in-the-time-of-3"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:4241
+#: ../src/gui/widgets/QuantizeParameters.cpp:130
+msgid "Triplet"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:138
+msgid "Any"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:141
+msgid "Permit counterpoint"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:145
+msgid "Grid parameters"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:154
+msgid "Swing:"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:159
+msgid "Iterative amount:"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:165
+msgid "Quantize durations as well as start times"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:169
+msgid "After quantization"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:183
+msgid "Show advanced options"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:192
+msgid "Re-beam"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:194
+msgid "Add articulations (staccato, tenuto, slurs)"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:195
+msgid "Tie notes at barlines etc"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:196
+msgid "Split-and-tie overlapping chords"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:307
+msgid "Full quantize"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:450
+msgid "Show Advanced Options"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:454
+msgid "Hide Advanced Options"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:257
+#: ../src/gui/configuration/MatrixConfigurationPage.h:56
+#: ../src/gui/configuration/MatrixConfigurationPage.h:57
+#: ../src/gui/editors/matrix/MatrixView.cpp:2709
+msgid "Matrix"
+msgstr ""
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:64
+msgid "Printable headers"
+msgstr ""
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:92
+msgid "Dedication"
+msgstr ""
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:96
+#: ../src/gui/editors/segment/PlayListView.cpp:35
+msgid "Title"
+msgstr ""
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:100
+msgid "Subtitle"
+msgstr ""
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:104
+msgid "Subsubtitle"
+msgstr ""
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:108
+msgid "Poet"
+msgstr ""
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:116
+msgid "Composer"
+msgstr ""
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:120
+msgid "Meter"
+msgstr ""
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:124
+msgid "Arranger"
+msgstr ""
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:128
+msgid "Piece"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:26
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:132
+msgid "Opus"
+msgstr ""
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:136
+msgid "Copyright"
+msgstr ""
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:140
+msgid "Tagline"
+msgstr ""
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:155
+msgid "The composition comes here."
+msgstr ""
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:172
+msgid "Non-printable headers"
+msgstr ""
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:213
+msgid "Add New Property"
+msgstr ""
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:217
+msgid "Delete Property"
+msgstr ""
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:236
+msgid "{new property %1}"
+msgstr ""
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:236
+msgid "{new property}"
+msgstr ""
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:243
+msgid "{undefined}"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:87
+msgid "Double-click opens segment in"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:91
+msgid "Notation editor"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:92
+msgid "Matrix editor"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:93
+msgid "Event List editor"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:99
+msgid "Number of count-in measures when recording"
+msgstr "Number of count-in bars when recording"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:109
+msgid "Auto-save interval"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:112
+msgid "Every 30 seconds"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:113
+msgid "Every minute"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:114
+msgid "Every five minutes"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:115
+msgid "Every half an hour"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:116
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:277
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:157
+msgid "Never"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:140
+msgid "Use JACK transport"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:173
+msgid "Unknown"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:179
+msgid "No MIDI, audio OK"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:182
+msgid "MIDI OK, no audio"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:185
+msgid "MIDI OK, audio OK"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:188
+msgid "No driver"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:195
+msgid "Details..."
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:204
+msgid "Behavior"
+msgstr "Behaviour"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:219
+msgid "Side-bar parameter box layout"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:223
+msgid "Vertically stacked"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:225
+msgid "Tabbed"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:233
+msgid "Note name style"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:237
+msgid "Always use US names (e.g. quarter, 8th)"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:238
+msgid "Localized (where available)"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:252
+msgid "Show textured background on"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:254
+msgid "Main window"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:275
+msgid "Use bundled Klearlook theme"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:278
+msgid "When not running under KDE"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:279
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:159
+msgid "Always"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:287
+msgid "Presentation"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:423
+msgid ""
+"Changes to the textured background in the main window will not take effect "
+"until you restart Rosegarden."
+msgstr ""
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:168
+#: ../src/gui/configuration/GeneralConfigurationPage.h:78
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:207
+#: ../src/gui/configuration/MatrixConfigurationPage.cpp:59
+msgid "General"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.h:79
+msgid "General Configuration"
+msgstr ""
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:92
+msgid "Base octave number for MIDI pitch display"
+msgstr ""
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:107
+msgid "Always use default studio when loading files"
+msgstr ""
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:119
+msgid "Send all MIDI Controllers at start of each playback"
+msgstr ""
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:121
+msgid ""
+"Rosegarden can send all MIDI Controllers (Pan, Reverb etc) to all MIDI "
+"devices every\n"
+"time you hit play if you so wish. Please note that this option will usually "
+"incur a\n"
+"delay at the start of playback due to the amount of data being transmitted."
+msgstr ""
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:138
+msgid "Sequencer timing source"
+msgstr ""
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:163
+msgid "Load SoundFont to SoundBlaster card at startup"
+msgstr ""
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:164
+msgid ""
+"Check this box to enable soundfont loading on EMU10K-based cards when "
+"Rosegarden is launched"
+msgstr ""
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:173
+msgid "Path to 'asfxload' or 'sfxload' command"
+msgstr ""
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:180
+msgid "SoundFont"
+msgstr ""
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:223
+msgid "MIDI Clock and System messages"
+msgstr ""
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:229
+msgid "Send MIDI Clock, Start and Stop"
+msgstr ""
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:230
+msgid "Accept Start, Stop and Continue"
+msgstr ""
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:241
+msgid "MIDI Machine Control mode"
+msgstr ""
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:248
+msgid "MMC Master"
+msgstr ""
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:249
+msgid "MMC Slave"
+msgstr ""
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:260
+msgid "MIDI Time Code mode"
+msgstr ""
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:267
+msgid "MTC Master"
+msgstr ""
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:268
+msgid "MTC Slave"
+msgstr ""
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:281
+msgid "Automatically connect sync output to all devices in use"
+msgstr ""
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:292
+msgid "MIDI Sync"
+msgstr ""
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:308
+msgid "sfxload path"
+msgstr ""
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:315
+msgid "Soundfont path"
+msgstr ""
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:67
+msgid "%1 minutes %2.%3%4 seconds (%5 units, %6 measures)"
+msgstr "%1 minutes %2.%3%4 seconds (%5 units, %6 bars)"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:133
+msgid "Filename:"
+msgstr ""
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:136
+msgid "Formal duration (to end marker):"
+msgstr ""
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:141
+msgid "Playing duration:"
+msgstr ""
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:146
+msgid "Tracks:"
+msgstr ""
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:147
+msgid "%1 used, %2 total"
+msgstr ""
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:152
+msgid "Segments:"
+msgstr ""
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:153
+msgid "%1 MIDI, %2 audio, %3 total"
+msgstr ""
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:161
+msgid "Statistics"
+msgstr ""
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:170
+#: ../src/gui/editors/parameters/InstrumentParameterBox.cpp:155
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:92
+msgid "Track"
+msgstr ""
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:171
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:125
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:90
+msgid "Label"
+msgstr ""
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:172
+msgid "Time"
+msgstr ""
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:174
+msgid "Events"
+msgstr ""
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:175
+msgid "Polyphony"
+msgstr ""
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:176
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:126
+msgid "Repeat"
+msgstr ""
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:178
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:128
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:305
+#: ../src/gui/general/EditView.cpp:1488
+msgid "Transpose"
+msgstr ""
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:179
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:129
+msgid "Delay"
+msgstr ""
+
+#: ../src/gui/configuration/AudioConfigurationPage.h:61
+#: ../src/gui/configuration/AudioPropertiesPage.h:58
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:204
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:523
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:524
+msgid "Audio"
+msgstr ""
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:204
+#: ../src/gui/configuration/MIDIConfigurationPage.h:62
+msgid "MIDI"
+msgstr ""
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:317
+msgid "Segment Summary"
+msgstr ""
+
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:63
+msgid "Audio file path:"
+msgstr ""
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:137
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:68
+msgid "Choose..."
+msgstr ""
+
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:73
+msgid "Disk space remaining:"
+msgstr ""
+
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:78
+msgid "Equivalent minutes of 16-bit stereo:"
+msgstr ""
+
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:90
+msgid "Modify audio path"
+msgstr ""
+
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:113
+msgid "%1 out of %2 (%3% used)"
+msgstr ""
+
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:144
+msgid "minutes at"
+msgstr ""
+
+#: ../src/gui/configuration/MIDIConfigurationPage.h:63
+#, fuzzy
+msgid "MIDI Settings"
+msgstr "Colour Settings"
+
+#: ../src/gui/configuration/AudioConfigurationPage.h:62
+#: ../src/gui/configuration/AudioPropertiesPage.h:59
+msgid "Audio Settings"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:87
+msgid "Default layout mode"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:91
+msgid "Linear layout"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:92
+msgid "Continuous page layout"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:93
+msgid "Multiple page layout"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:101
+msgid "Default spacing"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:125
+msgid "Default duration factor"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:141
+msgid "Full"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:152
+msgid "Show track headers (linear layout only)"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:158
+msgid "When needed"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:166
+msgid ""
+"\"Always\" and \"Never\" mean what they usually mean\n"
+"\"When needed\" means \"when staves are too many to all fit in the current "
+"window\""
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:178
+msgid "Show non-notation events as question marks"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:188
+msgid "Show notation-quantized notes in a different color"
+msgstr "Show notation-quantized notes in a different colour"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:198
+msgid "Show \"invisible\" events in grey"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:208
+msgid "Show notes outside suggested playable range in red"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:218
+msgid "Highlight superimposed notes with a halo effect"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:231
+msgid "When recording MIDI, split-and-tie long notes at barlines"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:242
+msgid "Layout"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:255
+msgid "Default note style for new notes"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:287
+msgid "When inserting notes..."
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:294
+msgid "Split notes into ties to make durations match"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:295
+msgid "Ignore existing durations"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:305
+msgid "Auto-beam on insert when appropriate"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:317
+#: ../src/gui/editors/notation/NotationEraser.cpp:54
+msgid "Collapse rests after erase"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:328
+msgid "Default paste type"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:350
+msgid "Editing"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:362
+msgid "Accidentals in one octave..."
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:364
+msgid "Affect only that octave"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:365
+msgid "Require cautionaries in other octaves"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:366
+msgid "Affect all subsequent octaves"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:374
+msgid "Accidentals in one bar..."
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:376
+msgid "Affect only that bar"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:377
+msgid "Require cautionary resets in following bar"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:378
+msgid "Require explicit resets in following bar"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:386
+msgid "Key signature cancellation style"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:388
+msgid "Cancel only when entering C major or A minor"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:389
+msgid "Cancel whenever removing sharps or flats"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:390
+msgid "Cancel always"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:400
+msgid "Accidentals"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:441
+msgid "Notation font"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:467
+msgid "Origin:"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:471
+msgid "Copyright:"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:475
+msgid "Mapped by:"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:479
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:81
+msgid "Type:"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:508
+msgid "Font size for single-staff views"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:516
+msgid "Font size for multi-staff views"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:524
+msgid "Font size for printing (pt)"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:541
+msgid "Text font"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:549
+msgid "Sans-serif font"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:664
+msgid "%1 (smooth)"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:667
+msgid "%1 (jaggy)"
+msgstr ""
+
+#: ../src/gui/configuration/LatencyConfigurationPage.cpp:58
+msgid "JACK latency"
+msgstr ""
+
+#: ../src/gui/configuration/LatencyConfigurationPage.cpp:61
+msgid ""
+"Use the \"Fetch JACK latencies\" button to discover the latency values set "
+"at\n"
+"the sequencer. It's recommended that you use the returned values but it's "
+"also\n"
+"possible to override them manually using the sliders. Note that if you "
+"change\n"
+"your JACK server parameters you should always fetch the latency values "
+"again.\n"
+"The latency values will be stored by Rosegarden for use next time."
+msgstr ""
+
+#: ../src/gui/configuration/LatencyConfigurationPage.cpp:65
+msgid "JACK playback latency (in ms)"
+msgstr ""
+
+#: ../src/gui/configuration/LatencyConfigurationPage.cpp:66
+msgid "JACK record latency (in ms)"
+msgstr ""
+
+#: ../src/gui/configuration/LatencyConfigurationPage.cpp:68
+msgid "Fetch JACK latencies"
+msgstr ""
+
+#: ../src/gui/configuration/LatencyConfigurationPage.cpp:121
+msgid "JACK Latency"
+msgstr ""
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:92
+msgid "Audio preview scale"
+msgstr ""
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:96
+msgid "Linear - easier to see loud peaks"
+msgstr ""
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:97
+msgid "Meter scaling - easier to see quiet activity"
+msgstr ""
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:105
+msgid "Record audio files as"
+msgstr ""
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:107
+msgid "16-bit PCM WAV format (smaller files)"
+msgstr ""
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:108
+msgid "32-bit float WAV format (higher quality)"
+msgstr ""
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:117
+msgid "External audio editor"
+msgstr ""
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:145
+msgid "Create JACK outputs"
+msgstr ""
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:150
+msgid "for individual audio instruments"
+msgstr ""
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:157
+msgid "for submasters"
+msgstr ""
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:184
+msgid ""
+"Rosegarden can start the JACK audio daemon (jackd) for you automatically if "
+"it isn't already running when Rosegarden starts.\n"
+"\n"
+"This is recommended for beginners and those who use Rosegarden as their main "
+"audio application, but it might not be to the liking of advanced users.\n"
+"\n"
+"If you want to start JACK automatically, make sure the command includes a "
+"full path where necessary as well as any command-line arguments you want to "
+"use.\n"
+"\n"
+"For example: /usr/local/bin/jackd -d alsa -d hw -r44100 -p 2048 -n 2\n"
+"\n"
+msgstr ""
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:196
+msgid "Start JACK when Rosegarden starts"
+msgstr ""
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:201
+msgid "JACK command"
+msgstr ""
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:214
+msgid "JACK Startup"
+msgstr ""
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:224
+msgid "External audio editor path"
+msgstr ""
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:262
+msgid "External audio editor \"%1\" not found or not executable"
+msgstr ""
+
+#: ../src/gui/configuration/ColourConfigurationPage.cpp:70
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:448
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:863
+msgid "Add New Color"
+msgstr "Add New Colour"
+
+#: ../src/gui/configuration/ColourConfigurationPage.cpp:74
+msgid "Delete Color"
+msgstr "Delete Colour"
+
+#: ../src/gui/configuration/ColourConfigurationPage.cpp:93
+msgid "Color Map"
+msgstr "Colour Map"
+
+#: ../src/gui/configuration/ColourConfigurationPage.cpp:128
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:983
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:882
+msgid "New Color Name"
+msgstr "New Colour Name"
+
+#: ../src/gui/configuration/ColourConfigurationPage.cpp:130
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:59
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:984
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:883
+#: ../src/gui/studio/DeviceManagerDialog.cpp:115
+#: ../src/gui/studio/DeviceManagerDialog.cpp:174
+msgid "New"
+msgstr ""
+
+#: ../src/gui/configuration/LatencyConfigurationPage.h:62
+msgid "Latency"
+msgstr ""
+
+#: ../src/gui/configuration/LatencyConfigurationPage.h:63
+msgid "Sequencer Latency"
+msgstr ""
+
+#: ../src/gui/configuration/ColourConfigurationPage.h:61
+msgid "Color Settings"
+msgstr "Colour Settings"
+
+#: ../src/gui/studio/MidiDeviceListViewItem.cpp:55
+#: ../src/gui/studio/MidiKeyMapListViewItem.cpp:44
+msgid "Key Mapping"
+msgstr ""
+
+#: ../src/gui/studio/BankEditorDialog.cpp:97
+msgid "Manage MIDI Banks and Programs"
+msgstr ""
+
+#: ../src/gui/studio/BankEditorDialog.cpp:128
+msgid "MIDI Device"
+msgstr ""
+
+#: ../src/gui/studio/BankEditorDialog.cpp:130
+#: ../src/gui/studio/BankEditorDialog.cpp:219
+msgid "MSB"
+msgstr ""
+
+#: ../src/gui/studio/BankEditorDialog.cpp:131
+#: ../src/gui/studio/BankEditorDialog.cpp:218
+msgid "LSB"
+msgstr ""
+
+#: ../src/gui/studio/BankEditorDialog.cpp:140
+msgid "Add Bank"
+msgstr ""
+
+#: ../src/gui/studio/BankEditorDialog.cpp:141
+msgid "Add Key Mapping"
+msgstr ""
+
+#: ../src/gui/studio/BankEditorDialog.cpp:153
+msgid "Add a Bank to the current device"
+msgstr ""
+
+#: ../src/gui/studio/BankEditorDialog.cpp:157
+msgid "Add a Percussion Key Mapping to the current device"
+msgstr ""
+
+#: ../src/gui/studio/BankEditorDialog.cpp:161
+msgid "Delete the current Bank or Key Mapping"
+msgstr ""
+
+#: ../src/gui/studio/BankEditorDialog.cpp:165
+msgid "Delete all Banks and Key Mappings from the current Device"
+msgstr ""
+
+#: ../src/gui/studio/BankEditorDialog.cpp:167
+#: ../src/gui/studio/DeviceManagerDialog.cpp:117
+msgid "Import..."
+msgstr ""
+
+#: ../src/gui/studio/BankEditorDialog.cpp:168
+#: ../src/gui/studio/DeviceManagerDialog.cpp:118
+msgid "Export..."
+msgstr ""
+
+#: ../src/gui/studio/BankEditorDialog.cpp:176
+msgid ""
+"Import Bank and Program data from a Rosegarden file to the current Device"
+msgstr ""
+
+#: ../src/gui/studio/BankEditorDialog.cpp:179
+msgid ""
+"Export all Device and Bank information to a Rosegarden format interchange "
+"file"
+msgstr ""
+
+#: ../src/gui/studio/BankEditorDialog.cpp:190
+msgid "Copy all Program names from current Bank to clipboard"
+msgstr ""
+
+#: ../src/gui/studio/BankEditorDialog.cpp:194
+msgid "Paste Program names from clipboard to current Bank"
+msgstr ""
+
+#: ../src/gui/studio/BankEditorDialog.cpp:216
+msgid "Show Variation list based on "
+msgstr ""
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1010
+msgid "<new bank>"
+msgstr ""
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1046
+msgid "<new mapping>"
+msgstr ""
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1048
+msgid "<new mapping %1>"
+msgstr ""
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1089
+msgid "Really delete this bank?"
+msgstr ""
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1137
+msgid "Really delete this key mapping?"
+msgstr ""
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1187
+msgid "Really delete all banks for "
+msgstr ""
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1476
+msgid "Import Banks from Device in File"
+msgstr ""
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1623
+#: ../src/gui/studio/DeviceManagerDialog.cpp:770
+msgid "Export Device as..."
+msgstr ""
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1694
+msgid ""
+"There are unsaved changes.\n"
+"Do you want to apply the changes before exiting the Bank Editor or discard "
+"the changes ?"
+msgstr ""
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1697
+msgid "Unsaved Changes"
+msgstr ""
+
+#: ../src/gui/studio/NameSetEditor.cpp:68
+msgid "Librarian"
+msgstr ""
+
+#: ../src/gui/studio/NameSetEditor.cpp:75
+msgid "Email"
+msgstr ""
+
+#: ../src/gui/studio/NameSetEditor.cpp:80
+msgid ""
+"The librarian maintains the Rosegarden device data for this device.\n"
+"If you've made modifications to suit your own device, it might be worth\n"
+"liaising with the librarian in order to publish your information for the "
+"benefit\n"
+"of others."
+msgstr ""
+
+#: ../src/gui/studio/MidiBankListViewItem.cpp:51
+#: ../src/gui/studio/MidiDeviceListViewItem.cpp:48
+msgid "Percussion Bank"
+msgstr ""
+
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:84
+#: ../src/gui/studio/MidiBankListViewItem.cpp:51
+#: ../src/gui/studio/MidiDeviceListViewItem.cpp:48
+msgid "Bank"
+msgstr ""
+
+#: ../src/gui/studio/ChangeRecordDeviceCommand.h:39
+msgid "Change Record Device"
+msgstr ""
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:61
+#: ../src/gui/studio/DeviceManagerDialog.cpp:96
+msgid "Manage MIDI Devices"
+msgstr ""
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:98
+msgid "Play devices"
+msgstr ""
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:76
+#: ../src/gui/studio/DeviceManagerDialog.cpp:106
+#: ../src/gui/studio/DeviceManagerDialog.cpp:165
+msgid "Connection"
+msgstr ""
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:119
+msgid "Banks..."
+msgstr ""
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:120
+msgid "Control Events..."
+msgstr ""
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:126
+msgid "Create a new Play device"
+msgstr ""
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:129
+#: ../src/gui/studio/DeviceManagerDialog.cpp:184
+msgid "Delete the selected device"
+msgstr ""
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:132
+msgid ""
+"Import Bank, Program and Controller data from a Rosegarden file to the "
+"selected device"
+msgstr ""
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:135
+msgid "Export Bank and Controller data to a Rosegarden interchange file"
+msgstr ""
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:138
+msgid "View and edit Banks and Programs for the selected device"
+msgstr ""
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:141
+msgid ""
+"View and edit Control Events for the selected device - these are special "
+"Event types that you can define against your device and control through "
+"Control Rulers or the Instrument Parameter Box "
+msgstr ""
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:156
+msgid "Record devices"
+msgstr ""
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:164
+msgid "Current"
+msgstr ""
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:181
+msgid "Create a new Record device"
+msgstr ""
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:360
+#: ../src/gui/studio/DeviceEditorDialog.cpp:378
+#: ../src/gui/studio/DeviceManagerDialog.cpp:486
+#: ../src/gui/studio/DeviceManagerDialog.cpp:501
+msgid "New Device"
+msgstr ""
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:703
+msgid "Import from Device in File"
+msgstr ""
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:55
+msgid "Remap Instrument assigments..."
+msgstr ""
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:62
+msgid "Device or Instrument"
+msgstr ""
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:65
+msgid "Remap Tracks by all Instruments on a Device or by single Instrument"
+msgstr ""
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:74
+msgid "Choose Source and Destination"
+msgstr ""
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:77
+msgid "From"
+msgstr ""
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:78
+msgid "To"
+msgstr ""
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:120
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:121
+msgid "<no devices>"
+msgstr ""
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:155
+msgid "Show Audio &Faders"
+msgstr ""
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:160
+msgid "Show Synth &Faders"
+msgstr ""
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:165
+msgid "Show &Submasters"
+msgstr ""
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:170
+msgid "Show &Plugin Buttons"
+msgstr ""
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:175
+msgid "Show &Unassigned Faders"
+msgstr ""
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:184
+#, c-format
+msgid ""
+"_n: 1 Input\n"
+"%n Inputs"
+msgstr ""
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:194
+msgid "No Submasters"
+msgstr ""
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:203
+#, c-format
+msgid ""
+"_n: 1 Submaster\n"
+"%n Submasters"
+msgstr ""
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:279
+msgid "Audio Mixer"
+msgstr ""
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:311
+msgid "Record input source"
+msgstr ""
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:322
+msgid "Output destination"
+msgstr ""
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:336
+#: ../src/gui/studio/AudioMixerWindow.cpp:495
+msgid "Pan"
+msgstr ""
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:355
+msgid "Mono or stereo"
+msgstr ""
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:364
+#: ../src/gui/studio/AudioMixerWindow.cpp:513
+msgid "Mute"
+msgstr ""
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:373 rc.cpp:408
+#, no-c-format
+msgid "Solo"
+msgstr ""
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:382
+msgid "Arm recording"
+msgstr ""
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:400
+#, c-format
+msgid "Audio %1"
+msgstr ""
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:404
+#, c-format
+msgid "Synth %1"
+msgstr ""
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:578
+#: ../src/gui/studio/AudioMixerWindow.cpp:580
+msgid "Audio master output level"
+msgstr ""
+
+#: ../src/gui/studio/SynthPluginManagerDialog.cpp:71
+msgid "Manage Synth Plugins"
+msgstr ""
+
+#: ../src/gui/studio/SynthPluginManagerDialog.cpp:78
+msgid "Synth plugins"
+msgstr ""
+
+#: ../src/gui/studio/SynthPluginManagerDialog.cpp:145
+msgid "Controls"
+msgstr ""
+
+#: ../src/gui/studio/SynthPluginManagerDialog.cpp:152
+msgid "Editor >>"
+msgstr ""
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:66
+#: ../src/gui/studio/MidiProgramsEditor.cpp:169
+msgid "Bank and Program details"
+msgstr ""
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:67
+msgid "Programs"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2711
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:88
+#: ../src/gui/studio/MidiProgramsEditor.cpp:93
+msgid "Percussion"
+msgstr ""
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:99
+msgid "MSB Value"
+msgstr ""
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:107
+msgid ""
+"Selects a MSB controller Bank number (MSB/LSB pairs are always unique for "
+"any Device)"
+msgstr ""
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:111
+msgid ""
+"Selects a LSB controller Bank number (MSB/LSB pairs are always unique for "
+"any Device)"
+msgstr ""
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:116
+msgid "LSB Value"
+msgstr ""
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:254
+#: ../src/gui/studio/MidiProgramsEditor.cpp:541
+#, c-format
+msgid "Key Mapping: %1"
+msgstr ""
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:476
+msgid "<no key mapping>"
+msgstr ""
+
+#: ../src/gui/studio/MidiKeyMappingEditor.cpp:57
+#: ../src/gui/studio/MidiKeyMappingEditor.cpp:81
+msgid "Key Mapping details"
+msgstr ""
+
+#: ../src/gui/studio/MidiKeyMappingEditor.cpp:58
+msgid "Pitches"
+msgstr ""
+
+#: ../src/gui/studio/MidiMixerWindow.cpp:152
+msgid "MIDI Mixer"
+msgstr ""
+
+#: ../src/gui/studio/MidiMixerWindow.cpp:199
+msgid "Volume"
+msgstr ""
+
+#: ../src/gui/studio/AudioPluginOSCGUIManager.cpp:444
+msgid "Rosegarden Plugin"
+msgstr ""
+
+#: ../src/gui/studio/AudioPluginOSCGUIManager.cpp:447
+#, c-format
+msgid "Rosegarden: %1"
+msgstr ""
+
+#: ../src/gui/studio/AudioPluginOSCGUIManager.cpp:449
+msgid "Rosegarden: %1: %2"
+msgstr ""
+
+#: ../src/gui/studio/AudioPluginOSCGUIManager.cpp:450
+#, c-format
+msgid "Plugin slot %1"
+msgstr ""
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:92
+msgid "Add Play Device"
+msgstr ""
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:93
+msgid "Add Record Device"
+msgstr ""
+
+#: ../src/commands/studio/CreateOrDeleteDeviceCommand.h:68
+#: ../src/gui/studio/DeviceEditorDialog.cpp:94
+msgid "Delete Device"
+msgstr ""
+
+#: ../src/gui/editors/segment/PlayList.cpp:77
+#: ../src/gui/studio/DeviceEditorDialog.cpp:156
+#: ../src/gui/studio/DeviceEditorDialog.cpp:361
+msgid "Play"
+msgstr ""
+
+#: ../src/commands/segment/SegmentRecordCommand.cpp:37
+#: ../src/gui/studio/DeviceEditorDialog.cpp:156
+#: ../src/gui/studio/DeviceEditorDialog.cpp:379 rc.cpp:394
+#, no-c-format
+msgid "Record"
+msgstr ""
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:256
+msgid "Apply pending changes?"
+msgstr ""
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:359
+#: ../src/gui/studio/DeviceEditorDialog.cpp:377
+msgid "<new device>"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentEraser.cpp:82
+msgid "Click on a segment to delete it"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSplitter.cpp:166
+msgid ""
+"Click on a segment to split it in two; hold Shift to avoid snapping to beat "
+"grid"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSplitter.cpp:168
+msgid "Click on a segment to split it in two"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:81
+msgid "Click and drag to select segments"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentMover.cpp:154
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:238
+msgid "Move Segment"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentMover.cpp:154
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:239
+msgid "Move Segments"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:217
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:169
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:141
+#: ../src/gui/editors/segment/segmentcanvas/SegmentMover.cpp:210
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:255
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:359
+msgid "Hold Shift to avoid snapping to beat grid"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:485
+msgid ""
+"Click and drag to select segments; middle-click and drag to draw an empty "
+"segment"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:384
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:502
+msgid ""
+"Click and drag to resize a segment; hold Ctrl as well to rescale its contents"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:386
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:504
+msgid "Click and drag to rescale segment"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:509
+msgid "Click and drag to move segments; hold Ctrl as well to copy them"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:511
+msgid "Click and drag to copy segments"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:515
+msgid ""
+"Click and drag to move segment; hold Ctrl as well to copy it; double-click "
+"to edit"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:517
+msgid "Click and drag to copy segment"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:157
+msgid ""
+"The audio file path does not exist or is not writable.\n"
+"You must set the audio file path to a valid directory in Document Properties "
+"before rescaling an audio file.\n"
+"Would you like to set it now?"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:261
+msgid ""
+"Hold Shift to avoid snapping to beat grid; hold Ctrl as well to rescale "
+"contents"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentMover.cpp:325
+msgid "Click and drag to move a segment"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentPencil.cpp:225
+msgid "Hold Shift to avoid snapping to bar lines"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentPencil.cpp:283
+msgid "Record or drop audio here"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentPencil.cpp:289
+msgid ""
+"Click and drag to draw an empty segment. Control+Alt click and drag to draw "
+"in overlap mode."
+msgstr ""
+
+#: ../src/gui/editors/segment/TrackLabel.cpp:77
+msgid ""
+"Click and hold with left mouse button to assign this Track to an Instrument."
+msgstr ""
+
+#: ../src/gui/editors/segment/TrackLabel.cpp:191
+msgid "Change track name"
+msgstr ""
+
+#: ../src/gui/editors/segment/TrackLabel.cpp:192
+msgid "Enter new track name"
+msgstr ""
+
+#: ../src/gui/editors/segment/TrackEditor.cpp:648
+msgid "Turn Repeating Segment into Real Copies"
+msgstr ""
+
+#: ../src/gui/editors/segment/TrackEditor.cpp:650
+msgid "Turn Repeating Segments into Real Copies"
+msgstr ""
+
+#: ../src/gui/editors/segment/TrackEditor.cpp:814
+msgid ""
+"You can't drop files into Rosegarden from this client. Try using Konqueror "
+"instead."
+msgstr ""
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:85
+msgid "Manage Triggered Segments"
+msgstr ""
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:89
+msgid "ID"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:735
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:93
+msgid "Base velocity"
+msgstr ""
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:94
+msgid "Triggers"
+msgstr ""
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:115
+msgid "Add a Triggered Segment"
+msgstr ""
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:119
+msgid "Delete a Triggered Segment"
+msgstr ""
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:123
+msgid "Delete All Triggered Segments"
+msgstr ""
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:127
+msgid "Close the Triggered Segment Manager"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:169
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:245
+msgid "<no label>"
+msgstr ""
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:248
+msgid ""
+"_n: %1 on 1 track\n"
+"%1 on %n tracks"
+msgstr ""
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:284
+msgid ""
+"This will remove all triggered segments from the whole composition. Are you "
+"sure?"
+msgstr ""
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:288
+msgid "Remove all triggered segments"
+msgstr ""
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:313
+msgid "Trigger Segment Duration"
+msgstr ""
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:336
+#, c-format
+msgid ""
+"_n: This triggered segment is used 1 time in the current composition. Are "
+"you sure you want to remove it?\n"
+"This triggered segment is used %n times in the current composition. Are you "
+"sure you want to remove it?"
+msgstr ""
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:400
+msgid "Pa&ste as New Triggered Segment"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1169
+#: ../src/gui/editors/segment/MarkerEditor.cpp:399
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:412
+#: ../src/gui/editors/tempo/TempoView.cpp:622
+msgid "&Musical Times"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1179
+#: ../src/gui/editors/segment/MarkerEditor.cpp:409
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:422
+#: ../src/gui/editors/tempo/TempoView.cpp:632
+msgid "&Real Times"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1189
+#: ../src/gui/editors/segment/MarkerEditor.cpp:419
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:432
+#: ../src/gui/editors/tempo/TempoView.cpp:642
+msgid "Ra&w Times"
+msgstr ""
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:83
+msgid "Manage Markers"
+msgstr ""
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:86
+msgid "Marker time "
+msgstr ""
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:87
+msgid "Marker text "
+msgstr ""
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:88
+msgid "Marker description "
+msgstr ""
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:95
+msgid "Pointer position"
+msgstr ""
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:100
+msgid "Real time:"
+msgstr ""
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:103
+msgid "In measure:"
+msgstr "In bar:"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:121
+msgid "Add a Marker"
+msgstr ""
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:125
+msgid "Delete a Marker"
+msgstr ""
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:129
+msgid "Delete All Markers"
+msgstr ""
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:133
+msgid "Close the Marker Editor"
+msgstr ""
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:296
+msgid "Remove all markers"
+msgstr ""
+
+#: ../src/gui/editors/segment/PlayList.cpp:76
+msgid "Add..."
+msgstr ""
+
+#: ../src/gui/editors/segment/PlayList.cpp:78
+msgid "Move Up"
+msgstr ""
+
+#: ../src/gui/editors/segment/PlayList.cpp:79
+msgid "Move Down"
+msgstr ""
+
+#: ../src/gui/editors/segment/PlayList.cpp:124
+msgid "Select one or more Rosegarden files"
+msgstr ""
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:73
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:55
+msgid "<not showing>"
+msgstr ""
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:89
+msgid "Manage Control Events"
+msgstr ""
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:91
+msgid "<no device>"
+msgstr ""
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:99
+msgid " Control Events for %1 (device %2)"
+msgstr ""
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:104
+msgid "Control Event name "
+msgstr ""
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:105
+msgid "Control Event type "
+msgstr ""
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:106
+msgid "Control Event value "
+msgstr ""
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:107
+msgid "Description "
+msgstr ""
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:108
+msgid "Min "
+msgstr ""
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:109
+msgid "Max "
+msgstr ""
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:110
+msgid "Default "
+msgstr ""
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:111
+msgid "Color "
+msgstr "Colour "
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:112
+msgid "Position on instrument panel"
+msgstr ""
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:136
+msgid "Add a Control Parameter to the Studio"
+msgstr ""
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:140
+msgid "Delete a Control Parameter from the Studio"
+msgstr ""
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:144
+msgid "Close the Control Parameter editor"
+msgstr ""
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:221
+msgid "<default>"
+msgstr ""
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:62
+msgid "Edit Control Parameter"
+msgstr ""
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:71
+msgid "Control Event Properties"
+msgstr ""
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:77
+msgid "Name:"
+msgstr ""
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:93
+msgid "Control Event value:"
+msgstr ""
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:97
+msgid "Minimum value:"
+msgstr ""
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:101
+msgid "Maximum value:"
+msgstr ""
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:105
+msgid "Default value:"
+msgstr ""
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:109
+msgid "Color:"
+msgstr "Colour:"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:113
+msgid "Instrument Parameter Box position:"
+msgstr ""
+
+#: ../src/gui/editors/segment/TrackButtons.cpp:209
+#: ../src/gui/editors/segment/TrackButtons.cpp:585
+#: ../src/gui/editors/segment/TrackButtons.cpp:935
+#: ../src/gui/editors/segment/TrackButtons.cpp:1127
+msgid "<no instrument>"
+msgstr ""
+
+#: ../src/gui/editors/segment/TrackButtons.cpp:352
+#: ../src/gui/editors/segment/TrackButtons.cpp:1094
+msgid "<untitled audio>"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:130
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:662
+#: ../src/gui/editors/segment/TrackButtons.cpp:354
+#: ../src/gui/editors/segment/TrackButtons.cpp:1096
+msgid "<untitled>"
+msgstr ""
+
+#: ../src/gui/editors/segment/TrackButtons.cpp:1058
+msgid "Mute track"
+msgstr ""
+
+#: ../src/gui/editors/segment/TrackButtons.cpp:1063
+msgid "Record on this track"
+msgstr ""
+
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:88
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:1015
+msgid "Segment"
+msgstr ""
+
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:89
+msgid "Segment Parameters"
+msgstr ""
+
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:366
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:697
+msgid "%1 ms"
+msgstr ""
+
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:1031
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:910
+msgid "Highest playable note"
+msgstr ""
+
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:1051
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:930
+msgid "Lowest playable note"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:93
+msgid "Track Parameters"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:137
+msgid "Playback parameters"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:172
+msgid "Recording filters"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:191
+msgid "Channel"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:203
+msgid "Staff export options"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:220
+msgid "Notation size:"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:225
+msgid "Small"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:226
+msgid "Tiny"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:233
+msgid "Bracket type:"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:237
+msgid "-----"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:238
+msgid "[----"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:239
+msgid "----]"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:240
+msgid "[---]"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:241
+msgid "{----"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:242
+msgid "----}"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:243
+msgid "{[---"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:244
+msgid "---]}"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:253
+msgid "Create segments with"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:264
+msgid "Preset"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:272
+msgid "Load"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:282
+msgid "treble"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:283
+msgid "bass"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:284
+msgid "crotales"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:285
+msgid "xylophone"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:286
+msgid "guitar"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:287
+msgid "contrabass"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:288
+msgid "celesta"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:289
+msgid "old celesta"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:290
+msgid "french"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:291
+msgid "soprano"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:292
+msgid "mezzosoprano"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:293
+msgid "alto"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:294
+msgid "tenor"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:295
+msgid "baritone"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:296
+msgid "varbaritone"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:297
+msgid "subbass"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:327
+msgid "Lowest"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:329
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:336
+msgid "---"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:331
+msgid "Choose the lowest suggested playable note, using a staff"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:334
+msgid "Highest"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:338
+msgid "Choose the highest suggested playable note, using a staff"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:666
+msgid "[ Track %1 - %2 ]"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:985
+msgid "The instrument preset database is corrupt. Check your installation."
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:173
+#: ../src/gui/editors/parameters/InstrumentParameterBox.cpp:54
+msgid "Instrument Parameters"
+msgstr ""
+
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:85
+msgid "Variation"
+msgstr ""
+
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:86
+msgid "Program"
+msgstr ""
+
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:87
+msgid "Channel out"
+msgstr ""
+
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:215
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:221
+msgid "[ %1 ]"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixEraser.cpp:58
+#: ../src/gui/editors/matrix/MatrixMover.cpp:71
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:67
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:77
+msgid "Switch to Draw Tool"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:75
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:69
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:71
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:81
+#: ../src/gui/editors/notation/ClefInserter.cpp:57
+#: ../src/gui/editors/notation/GuitarChordInserter.cpp:63
+#: ../src/gui/editors/notation/NotationSelector.cpp:87
+#: ../src/gui/editors/notation/NoteInserter.cpp:113
+#: ../src/gui/editors/notation/RestInserter.cpp:72
+#: ../src/gui/editors/notation/TextInserter.cpp:61
+msgid "Switch to Erase Tool"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixEraser.cpp:62
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:73
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:75
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:85
+msgid "Switch to Move Tool"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixEraser.cpp:68
+#: ../src/gui/editors/matrix/MatrixMover.cpp:81
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:79
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:93
+msgid "Switch to Resize Tool"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:446
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:579
+msgid "Click and drag to select; middle-click and drag to draw new note"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:324
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:597
+msgid "Click and drag to resize selected notes"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:599
+msgid "Click and drag to resize note"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:471
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:604
+msgid "Click and drag to move selected notes; hold Ctrl as well to copy"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:473
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:606
+msgid "Click and drag to copy selected notes"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:610
+msgid "Click and drag to move note; hold Ctrl as well to copy"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:612
+msgid "Click and drag to copy note"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixEraser.cpp:54
+#: ../src/gui/editors/matrix/MatrixMover.cpp:67
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:65
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:63
+#: ../src/gui/editors/notation/ClefInserter.cpp:53
+#: ../src/gui/editors/notation/GuitarChordInserter.cpp:59
+#: ../src/gui/editors/notation/NotationEraser.cpp:67
+#: ../src/gui/editors/notation/NoteInserter.cpp:109
+#: ../src/gui/editors/notation/RestInserter.cpp:68
+#: ../src/gui/editors/notation/TextInserter.cpp:57
+msgid "Switch to Select Tool"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:218
+msgid "Resize Event"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:221
+msgid "Resize Events"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:326
+msgid "Click and drag to resize a note"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:328
+msgid "Copy and Move Event"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:330
+msgid "Copy and Move Events"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:334
+msgid "Move Event"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:336
+msgid "Move Events"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:465
+msgid "Click and drag to move a note; hold Ctrl as well to copy it"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:467
+msgid "Click and drag to copy a note"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:361
+msgid "Click and drag to draw a note; Shift to avoid snapping to grid"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:363
+msgid "Click and drag to draw a note"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:437
+#: ../src/gui/editors/matrix/MatrixView.cpp:3053
+msgid "Couldn't apply piano roll layout"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:663
+msgid "Resi&ze"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:669
+#: ../src/gui/editors/notation/NotationView.cpp:1919
+msgid "C&hord Insert Mode"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:676
+#: ../src/gui/editors/notation/NotationView.cpp:1778
+msgid "Ste&p Recording"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:694
+msgid "&Legato"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:708
+msgid "Set to Current Velocity"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:712
+msgid "Set Event &Velocities..."
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:716
+msgid "Trigger Se&gment..."
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:720
+msgid "Remove Triggers..."
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1153
+#: ../src/gui/editors/matrix/MatrixView.cpp:724
+#: ../src/gui/editors/tempo/TempoView.cpp:606
+msgid "Select &All"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:732
+#: ../src/gui/editors/notation/NotationView.cpp:2325
+msgid "Cursor &Back"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:736
+#: ../src/gui/editors/notation/NotationView.cpp:2329
+msgid "Cursor &Forward"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:740
+#: ../src/gui/editors/notation/NotationView.cpp:2333
+msgid "Cursor Ba&ck Bar"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:744
+#: ../src/gui/editors/notation/NotationView.cpp:2337
+msgid "Cursor For&ward Bar"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:748
+#: ../src/gui/editors/notation/NotationView.cpp:2341
+msgid "Cursor Back and Se&lect"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:752
+#: ../src/gui/editors/notation/NotationView.cpp:2345
+msgid "Cursor Forward and &Select"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:756
+#: ../src/gui/editors/notation/NotationView.cpp:2349
+msgid "Cursor Back Bar and Select"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:760
+#: ../src/gui/editors/notation/NotationView.cpp:2353
+msgid "Cursor Forward Bar and Select"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:764
+#: ../src/gui/editors/notation/NotationView.cpp:2363
+msgid "Cursor to St&art"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:770
+#: ../src/gui/editors/notation/NotationView.cpp:2369
+msgid "Cursor to &End"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:776
+#: ../src/gui/editors/notation/NotationView.cpp:2391
+msgid "Cursor to &Playback Pointer"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:820
+#: ../src/gui/editors/notation/NotationView.cpp:2435
+msgid "Playback Pointer to &Cursor"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:826
+#: ../src/gui/editors/notation/NotationView.cpp:2441
+msgid "&Solo"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:841
+#: ../src/gui/editors/notation/NotationView.cpp:2456
+msgid "Set Loop to Selection"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:845
+#: ../src/gui/editors/notation/NotationView.cpp:2460
+msgid "Clear L&oop"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1157
+#: ../src/gui/editors/matrix/MatrixView.cpp:849
+#: ../src/gui/editors/notation/NotationView.cpp:2464
+#: ../src/gui/editors/tempo/TempoView.cpp:610
+msgid "Clear Selection"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1149
+#: ../src/gui/editors/matrix/MatrixView.cpp:854
+#: ../src/gui/editors/notation/NotationView.cpp:2471
+msgid "&Filter Selection"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:879
+msgid "&No Snap"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:884
+msgid "Snap to Bea&t"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:888
+msgid "Snap to &Bar"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:908
+#, c-format
+msgid "Snap to %1"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:917
+msgid "Show Instrument Parameters"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:922
+#: ../src/gui/editors/notation/NotationView.cpp:1850
+msgid "Show Ch&ord Name Ruler"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:926
+#: ../src/gui/editors/notation/NotationView.cpp:1858
+msgid "Show &Tempo Ruler"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1238
+#: ../src/gui/editors/notation/NotationView.cpp:3245
+#, c-format
+msgid ""
+"_n: 1 event selected \n"
+" %n events selected "
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1241
+#: ../src/gui/editors/notation/NotationView.cpp:3247
+msgid " No selection "
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1348
+#: ../src/gui/editors/matrix/MatrixView.cpp:1360
+#: ../src/gui/editors/matrix/MatrixView.cpp:2079
+#: ../src/gui/editors/notation/NotationView.cpp:5869
+msgid "Quantizing..."
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1370
+#: ../src/gui/editors/notation/NotationView.cpp:5407
+msgid "Collapsing notes..."
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1381
+msgid "Making legato..."
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1476
+msgid "Note: %1 (%2.%3s)"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1531
+#: ../src/gui/editors/notation/NotationView.cpp:7206
+msgid "Time: %1 (%2.%3s)"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1604
+#: ../src/gui/editors/notation/NotationView.cpp:4744
+#: ../src/gui/editors/notation/NotationView.cpp:4773
+msgid "Cutting selection to clipboard..."
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:912
+#: ../src/gui/editors/matrix/MatrixView.cpp:1636
+#: ../src/gui/editors/notation/NotationSelectionPaster.cpp:82
+msgid "Couldn't paste at this point"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1647
+#: ../src/gui/editors/notation/NotationView.cpp:4754
+msgid "Deleting selection..."
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1833
+#: ../src/gui/editors/notation/NotationView.cpp:5617
+#, c-format
+msgid "Unknown note insert action %1"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1837
+#: ../src/gui/editors/matrix/MatrixView.cpp:2857
+#: ../src/gui/editors/notation/NotationView.cpp:5621
+msgid "Inserting note"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2091
+msgid "Unquantizing..."
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2120
+msgid " Grid: "
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2134
+msgid "Unit"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2136
+msgid "Beat"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2138
+msgid "Bar"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2159
+msgid " Velocity: "
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2170
+msgid " Quantize: "
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2584
+msgid "Raising velocities..."
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2596
+msgid "Lowering velocities..."
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2611
+msgid "Set Event Velocities"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2616
+msgid "Setting Velocities..."
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2665
+msgid "Remove Triggers"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2723
+msgid "%1 - Segment Track #%2 - %3"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2730
+msgid "%1 - All Segments - %2"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2737
+msgid ""
+"_n: %1 - 1 Segment - %2\n"
+"%1 - %n Segments - %2"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2885
+msgid "Can't insert note: No grid duration selected"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2935
+msgid " Chord "
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixEraser.cpp:105
+msgid "Click on a note to delete it"
+msgstr ""
+
+#: ../src/gui/editors/tempo/TempoView.cpp:89
+msgid "Filter"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:245
+#: ../src/gui/editors/tempo/TempoView.cpp:117
+msgid "Time "
+msgstr ""
+
+#: ../src/gui/editors/tempo/TempoView.cpp:118
+msgid "Type "
+msgstr ""
+
+#: ../src/gui/editors/tempo/TempoView.cpp:119
+msgid "Value "
+msgstr ""
+
+#: ../src/gui/editors/tempo/TempoView.cpp:120
+msgid "Properties "
+msgstr ""
+
+#: ../src/gui/editors/tempo/TempoView.cpp:208
+msgid "Common, hidden"
+msgstr ""
+
+#: ../src/gui/editors/tempo/TempoView.cpp:210
+msgid "Hidden"
+msgstr ""
+
+#: ../src/gui/editors/tempo/TempoView.cpp:213
+msgid "Common"
+msgstr ""
+
+#: ../src/gui/editors/tempo/TempoView.cpp:220
+msgid "Time Signature "
+msgstr ""
+
+#: ../src/gui/editors/tempo/TempoView.cpp:245
+msgid "%1.%2%3"
+msgstr ""
+
+#: ../src/gui/editors/tempo/TempoView.cpp:255
+msgid "%1.%2%3 qpm (%4.%5%6 bpm) "
+msgstr ""
+
+#: ../src/gui/editors/tempo/TempoView.cpp:264
+msgid "Tempo "
+msgstr ""
+
+#: ../src/gui/editors/tempo/TempoView.cpp:271
+msgid "<nothing at this filter level>"
+msgstr ""
+
+#: ../src/gui/editors/tempo/TempoView.cpp:463
+msgid "Delete Tempo or Time Signature"
+msgstr ""
+
+#: ../src/gui/editors/tempo/TempoView.cpp:602
+msgid "&Edit Item"
+msgstr ""
+
+#: ../src/gui/editors/tempo/TempoView.cpp:834
+msgid "%1 - Tempo and Time Signature Editor"
+msgstr ""
+
+#: ../src/gui/editors/guitar/GuitarChordEditorDialog.cpp:43
+msgid "Guitar Chord Editor"
+msgstr ""
+
+#: ../src/gui/editors/guitar/GuitarChordEditorDialog.cpp:51
+msgid "Start fret"
+msgstr ""
+
+#: ../src/gui/editors/guitar/GuitarChordEditorDialog.cpp:58
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:51
+msgid "Root"
+msgstr ""
+
+#: ../src/gui/editors/guitar/GuitarChordEditorDialog.cpp:62
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:55
+msgid "Extension"
+msgstr ""
+
+#: ../src/gui/editors/guitar/Fingering.cpp:118
+msgid "couldn't parse fingering '%1' in '%2'"
+msgstr ""
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:45
+msgid "Guitar Chord Selector"
+msgstr ""
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:64
+msgid "beginner"
+msgstr ""
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:65
+msgid "common"
+msgstr ""
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:66
+msgid "all"
+msgstr ""
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:86
+msgid "Fingerings"
+msgstr ""
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:419
+msgid "couldn't open file '%1'"
+msgstr ""
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:428
+#, c-format
+msgid "couldn't parse chord dictionnary : %1"
+msgstr ""
+
+#: ../src/gui/editors/notation/NoteFontViewer.cpp:87
+#, c-format
+msgid "Note Font Viewer: %1"
+msgstr ""
+
+#: ../src/gui/editors/notation/NoteFontViewer.cpp:93
+msgid " Component: "
+msgstr ""
+
+#: ../src/gui/editors/notation/NoteFontViewer.cpp:101
+msgid " View: "
+msgstr ""
+
+#: ../src/gui/editors/notation/NoteFontViewer.cpp:104
+msgid "Glyphs"
+msgstr ""
+
+#: ../src/gui/editors/notation/NoteFontViewer.cpp:105
+msgid "Codes"
+msgstr ""
+
+#: ../src/gui/editors/notation/NoteFontViewer.cpp:107
+msgid " Page: "
+msgstr ""
+
+#: ../src/gui/editors/notation/ClefInserter.cpp:64
+#: ../src/gui/editors/notation/GuitarChordInserter.cpp:71
+#: ../src/gui/editors/notation/RestInserter.cpp:79
+#: ../src/gui/editors/notation/TextInserter.cpp:68
+msgid "Switch to Inserting Notes"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:522
+msgid "Close track headers"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:917
+msgid "Preparing to print..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1516
+msgid "Note &Font"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1539
+msgid "Si&ze"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1545
+msgid "Show Track Headers"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1550
+msgid "S&pacing"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1572
+msgid "Du&ration Factor"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1598
+msgid "Note &Style"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1624
+msgid "Insert Rest"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1628
+msgid "Switch from Note to Rest"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1633
+msgid "Switch from Rest to Note"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1690
+msgid "No accidental"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1691
+msgid "Follow previous accidental"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1692
+msgid "Sharp"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1693
+msgid "Flat"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1694
+msgid "Natural"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1695
+msgid "Double sharp"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1696
+msgid "Double flat"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1717
+msgid "&Treble Clef"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1724
+msgid "&Alto Clef"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1731
+msgid "Te&nor Clef"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1738
+msgid "&Bass Clef"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1745
+msgid "&Text"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1751
+msgid "&Guitar Chord"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1784
+msgid "Select from Sta&rt"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1788
+msgid "Select to &End"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1792
+msgid "Select Whole St&aff"
+msgstr ""
+
+#: ../src/commands/edit/CutAndCloseCommand.h:53
+#: ../src/gui/editors/notation/NotationView.cpp:1796
+msgid "C&ut and Close"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1800
+msgid "Pa&ste..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:122
+#: ../src/gui/editors/notation/NotationView.cpp:1808
+msgid "Move to Staff Above"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:126
+#: ../src/gui/editors/notation/NotationView.cpp:1812
+msgid "Move to Staff Below"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1826
+msgid "&Linear Layout"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1835
+msgid "&Continuous Page Layout"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1844
+msgid "&Multiple Page Layout"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1854
+msgid "Show Ra&w Note Ruler"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1862
+msgid "Show &Annotations"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1866
+msgid "Show Lily&Pond Directives"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1870
+msgid "Open L&yric Editor"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1912
+msgid "Trip&let Insert Mode"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1926
+msgid "Grace Insert Mode"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2180
+msgid "&Dump selected events to stderr"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2248
+msgid "Ma&ke Ornament..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2252
+msgid "Trigger &Ornament..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2256
+msgid "Remove Ornament..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2261
+msgid "&None"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2289
+msgid "Convert Notation For..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2298
+msgid "Show &Notes Toolbar"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2299
+msgid "Show &Rests Toolbar"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2300
+msgid "Show &Accidentals Toolbar"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2301
+msgid "Show Cle&fs Toolbar"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2303
+msgid "Show &Marks Toolbar"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2305
+msgid "Show &Group Toolbar"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2307
+msgid "Show &Layout Toolbar"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2311
+msgid "Show M&eta Toolbar"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2373
+msgid "Cursor &Up Staff"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2377
+msgid "Cursor &Down Staff"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2381
+msgid "Cursor Pre&vious Segment"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2385
+msgid "Cursor Ne&xt Segment"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2475
+msgid "Push &Left"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2479
+msgid "Push &Right"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2483
+msgid "Push &Up"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2487
+msgid "Push &Down"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2491
+msgid "&Restore Positions"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2495
+msgid "Make &Invisible"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2499
+msgid "Make &Visible"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2503
+msgid "Toggle Dot"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2507
+#: ../src/gui/editors/notation/NotationView.cpp:2511
+msgid "Add Dot"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2570
+#, c-format
+msgid ""
+"_n: 1 pixel\n"
+"%n pixels"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2619
+msgid " Font: "
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2647
+msgid "Unknown font \"%1\", using default"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2655
+msgid " Size: "
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2677
+msgid " Spacing: "
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2993
+#: ../src/gui/editors/notation/NotationView.cpp:3818
+msgid " Ready."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2998
+msgid "Laying out score..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:3011
+msgid "Laying out staff %1..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:3020
+msgid "Reconciling staffs..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:3885
+msgid "Sizing and allocating canvas..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:4050
+msgid "note"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:4050
+msgid "rest"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:4211
+msgid "%1 - Segment Track #%2 - Notation"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:4217
+msgid "%1 - All Segments - Notation"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:4222
+msgid ""
+"_n: %1 - Segment - Notation\n"
+"%1 - %n Segments - Notation"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:4243
+msgid "Grace"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:4247
+#: ../src/gui/editors/notation/NotationView.cpp:4251
+#: ../src/gui/editors/notation/NotationView.cpp:4255
+msgid "%1 %2"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:4271
+msgid "Hidden annotations"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:4293
+msgid "Hidden LilyPond directives"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:4326
+#, c-format
+msgid "Unknown spacing action %1"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:4384
+#, c-format
+msgid "Unknown proportion action %1"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:4431
+#, c-format
+msgid "Unknown font action %1"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:4449
+#, c-format
+msgid "Unknown font size %1"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:4453
+#, c-format
+msgid "Unknown font size action %1"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:4780
+msgid ""
+"The Restricted paste type requires enough empty space (containing only "
+"rests) at the paste position to hold all of the events to be pasted.\n"
+"Not enough space was found.\n"
+"If you want to paste anyway, consider using one of the other paste types "
+"from the \"Paste...\" option on the Edit menu. You can also change the "
+"default paste type to something other than Restricted if you wish."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:4800
+msgid "Can't paste multiple Segments into one"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:4828
+#: ../src/gui/editors/notation/NotationView.cpp:4877
+msgid "Couldn't paste at this point."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:4896
+msgid "Move Events to Staff Above"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:4924
+msgid "Move Events to Staff Below"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5036
+msgid "Pushing selection left..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5047
+msgid "Pushing selection right..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5058
+msgid "Pushing selection up..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5069
+msgid "Pushing selection down..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5080
+msgid "Restoring computed positions..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5089
+msgid "Making visible..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5098
+msgid "Making invisible..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5185
+msgid "Beaming group..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5195
+msgid "Auto-beaming selection..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5205
+msgid "Breaking groups..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5293
+msgid "Untupleting..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5301
+msgid "Adding slur..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5302
+msgid "slur"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5307
+msgid "Adding phrasing slur..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5308
+msgid "phrasing slur"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5313
+msgid "Adding glissando..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5314
+msgid "glissando"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5319
+msgid "Adding crescendo..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5320
+#: ../src/gui/editors/notation/NotationView.cpp:5326
+msgid "dynamic"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5325
+msgid "Adding decrescendo..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5331
+#: ../src/gui/editors/notation/NotationView.cpp:5337
+#: ../src/gui/editors/notation/NotationView.cpp:5343
+#: ../src/gui/editors/notation/NotationView.cpp:5349
+msgid "Adding octave..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5332
+#: ../src/gui/editors/notation/NotationView.cpp:5338
+#: ../src/gui/editors/notation/NotationView.cpp:5344
+#: ../src/gui/editors/notation/NotationView.cpp:5350
+msgid "ottava"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5366
+msgid "Can't add overlapping %1 indications"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5375
+msgid "Making chord..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5387
+msgid "Normalizing rests..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5397
+msgid "Collapsing rests..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5417
+msgid "Tying notes..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5427
+msgid "Untying notes..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5437
+msgid "Making notes viable..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5447
+msgid "Removing counterpoint..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5457
+msgid "Pointing stems up..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5467
+msgid "Pointing stems down..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5478
+msgid "Restoring computed stem directions..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5488
+#: ../src/gui/editors/notation/NotationView.cpp:5498
+msgid "Positioning slurs..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5509
+msgid "Restoring slur positions..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5519
+#: ../src/gui/editors/notation/NotationView.cpp:5529
+#, fuzzy
+msgid "Positioning ties..."
+msgstr "Initialising view..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5540
+msgid "Restoring tie positions..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5550
+msgid "Fixing notation quantization..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5560
+msgid "Removing notation quantization..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5577
+msgid "Changing to %1 style..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5585
+#, c-format
+msgid "Unknown style action %1"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5598
+#: ../src/gui/editors/notation/NotationView.cpp:5639
+#: ../src/gui/editors/notation/NotationView.cpp:5695
+msgid "No note duration selected"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5660
+msgid "No rest duration selected"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5746
+msgid "No note or rest duration selected"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5757
+#: ../src/gui/editors/notation/NotationView.cpp:5768
+#: ../src/gui/editors/notation/NotationView.cpp:5779
+#: ../src/gui/editors/notation/NotationView.cpp:5790
+#: ../src/gui/editors/notation/NotationView.cpp:5801
+#: ../src/gui/editors/notation/NotationView.cpp:5812
+#: ../src/gui/editors/notation/NotationView.cpp:5823
+msgid "Forcing accidentals..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5834
+msgid "Restoring accidentals..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5845
+msgid "Showing cautionary accidentals..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5855
+msgid "Cancelling cautionary accidentals..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5884
+msgid "Interpreting selection..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5896
+msgid "Setting note durations..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5904
+#: ../src/gui/editors/notation/NotationView.cpp:5912
+msgid "Adding dot..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5934
+msgid "Text: "
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5948
+msgid "Fingering: "
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:6036
+msgid "Ornament track %1 bar %2"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:6038
+#, c-format
+msgid "Ornament bar %1"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:6098
+msgid "Remove Ornaments"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:6145
+msgid "Estimated key signature shown"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStaff.cpp:1249
+#: ../src/gui/editors/notation/NotationView.cpp:6202
+msgid "Sustain"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:6218
+msgid ""
+"There is no sustain controller defined for this device.\n"
+"Please ensure the device is configured correctly in the Manage MIDI Devices "
+"dialog in the main window."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:7250
+msgid "Can't insert note: No note duration selected"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationEraser.cpp:61
+#: ../src/gui/editors/notation/NotationSelector.cpp:83
+msgid "Switch to Insert Tool"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotePixmapFactory.cpp:2303
+#: ../src/gui/editors/notation/NotePixmapFactory.cpp:2347
+msgid "..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NoteFontFactory.cpp:200
+msgid "Can't obtain a default font -- no fonts found"
+msgstr ""
+
+#: ../src/gui/editors/notation/NoteFontMap.cpp:52
+#: ../src/gui/general/PresetGroup.cpp:49
+msgid "unknown error"
+msgstr ""
+
+#: ../src/gui/editors/notation/NoteFontMap.cpp:78
+msgid "Can't open font mapping file %1 or %2"
+msgstr ""
+
+#: ../src/gui/editors/notation/NoteFontMap.cpp:82
+#, c-format
+msgid "Can't open font mapping file %1"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:52
+msgid "%1-dotted-%2"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:54
+msgid "%1-dotted %2"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:57
+#, c-format
+msgid "dotted-%1"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:59
+#, c-format
+msgid "dotted %1"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:83
+msgid "sixty-fourth note"
+msgstr "hemidemisemiquaver"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:83
+msgid "thirty-second note"
+msgstr "demisemiquaver"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:84
+msgid "sixteenth note"
+msgstr "semiquaver"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:84
+msgid "eighth note"
+msgstr "quaver"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:85
+msgid "quarter note"
+msgstr "crotchet"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:85
+msgid "half note"
+msgstr "minim"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:86
+msgid "whole note"
+msgstr "semibreve"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:86
+msgid "double whole note"
+msgstr "breve"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:89
+msgid "sixty-fourth notes"
+msgstr "hemidemisemiquavers"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:89
+msgid "thirty-second notes"
+msgstr "demisemiquavers"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:90
+msgid "sixteenth notes"
+msgstr "semiquavers"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:90
+msgid "eighth notes"
+msgstr "quavers"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:91
+msgid "quarter notes"
+msgstr "crotchets"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:91
+msgid "half notes"
+msgstr "minims"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:92
+msgid "whole notes"
+msgstr "semibreves"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:92
+msgid "double whole notes"
+msgstr "breves"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:96
+#: ../src/gui/editors/notation/NotationStrings.cpp:154
+msgid "%1 triplets"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:100
+#: ../src/gui/editors/notation/NotationStrings.cpp:158
+msgid "%1 triplet"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:143
+msgid "64th"
+msgstr "hemi"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:143
+msgid "32nd"
+msgstr "demi"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:143
+msgid "16th"
+msgstr "semi"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:143
+msgid "8th"
+msgstr "quaver"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:144
+msgid "quarter"
+msgstr "crotchet"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:144
+msgid "half"
+msgstr "minim"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:144
+msgid "whole"
+msgstr "semibreve"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:145
+msgid "double whole"
+msgstr "breve"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:148
+msgid "64ths"
+msgstr "hemis"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:148
+msgid "32nds"
+msgstr "demis"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:148
+msgid "16ths"
+msgstr "semis"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:148
+msgid "8ths"
+msgstr "quavers"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:149
+msgid "quarters"
+msgstr "crotchets"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:149
+msgid "halves"
+msgstr "minims"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:149
+msgid "wholes"
+msgstr "semibreves"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:150
+msgid "double wholes"
+msgstr "breves"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:278
+msgid "%1 ticks"
+msgstr ""
+
+#: ../src/gui/editors/notation/FontViewFrame.cpp:100
+#, c-format
+msgid "Error: Unable to match font name %1"
+msgstr ""
+
+#: ../src/gui/editors/notation/FontViewFrame.cpp:108
+msgid "Warning: No good match for font name %1 (best is %2)"
+msgstr ""
+
+#: ../src/gui/editors/notation/FontViewFrame.cpp:116
+#, c-format
+msgid "Error: Unable to open best-match font %1"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:113
+msgid "Track %1 : \"%2\""
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:119
+#, c-format
+msgid ""
+"\n"
+"Notate for: %1"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:121
+msgid "normal"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:124
+msgid "small"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:127
+msgid "tiny"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:131
+msgid "--"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:156
+msgid ""
+"\n"
+"Size: %1, Bracket: %2 "
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:183
+msgid ""
+"\n"
+"bars [%1-%2] in %3 (tr=%4) : \"%5\""
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:190
+msgid ""
+"\n"
+"bars [%1-%2] (tr=%3) : \"%4\""
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:240
+msgid "C#"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:242
+msgid "Eb"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:245
+msgid "F#"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:247
+msgid "G#"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:249
+msgid "Bb"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:352
+msgid "%1: %2"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:355
+#, c-format
+msgid " in %1"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStaff.cpp:452
+msgid "Rendering staff %1..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStaff.cpp:515
+msgid "Rendering notes on staff %1..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStaff.cpp:583
+msgid "Positioning staff %1..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationSelectionPaster.cpp:85
+msgid "Ready."
+msgstr ""
+
+#: ../src/gui/editors/notation/RestInserter.cpp:62
+msgid "Dotted rest"
+msgstr ""
+
+#: ../src/gui/editors/notation/NoteStyleFileReader.cpp:57
+#, c-format
+msgid "Can't open style file %1"
+msgstr ""
+
+#: ../src/gui/editors/notation/NoteStyleFileReader.cpp:92
+msgid "type is a required attribute of note"
+msgstr ""
+
+#: ../src/gui/editors/notation/NoteStyleFileReader.cpp:101
+#, c-format
+msgid "Unrecognised note name %1"
+msgstr ""
+
+#: ../src/gui/editors/notation/NoteStyleFileReader.cpp:108
+msgid "global element must precede note elements"
+msgstr ""
+
+#: ../src/gui/editors/notation/NoteStyleFileReader.cpp:137
+msgid ""
+"global and note elements may have shape or charname attribute, but not both"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationVLayout.cpp:493
+msgid ""
+"Spanned note at %1 has no HEIGHT_ON_STAFF property!\n"
+"This is a bug (the program would previously have crashed by now)"
+msgstr ""
+
+#: ../src/gui/editors/notation/NoteInserter.cpp:82
+msgid "Auto-Beam when appropriate"
+msgstr ""
+
+#: ../src/gui/editors/notation/NoteInserter.cpp:103
+msgid "Dotted note"
+msgstr ""
+
+#: ../src/gui/editors/notation/NoteInserter.cpp:120
+msgid "Switch to Inserting Rests"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:98
+msgid "Collapse Rests"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:102
+msgid "Respell as Flat"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:106
+msgid "Respell as Sharp"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:110
+msgid "Respell as Natural"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:114
+msgid "Collapse Notes"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:130
+msgid "Make Invisible"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:134
+msgid "Make Visible"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:129
+msgid "Event filters"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:138
+msgid "Rest"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:139
+msgid "Indication"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:141
+msgid "Other"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:161
+msgid "Triggered Segment Properties"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:166
+msgid "Label: "
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:176
+msgid "Base pitch: "
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:183
+msgid "Base velocity: "
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:246
+msgid "Duration "
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:247
+msgid "Event Type "
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:248
+msgid "Pitch "
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:249
+msgid "Velocity "
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:250
+msgid "Type (Data1) "
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:251
+msgid "Value (Data2) "
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:461
+msgid "(group %1) "
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:519
+msgid "<no events at this filter level>"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:521
+msgid "<no events>"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:696
+msgid "Segment label"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:696
+msgid "Label:"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1123
+msgid "&Insert Event"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1130
+msgid "&Delete Event"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1137
+msgid "&Edit Event"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1144
+msgid "&Advanced Event Editor"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1518
+msgid "Open in Event Editor"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1519
+msgid "Open in Expert Event Editor"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1577
+msgid "%1 - Triggered Segment: %2"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1592
+msgid "%1 - Segment Track #%2 - Event List"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1598
+msgid "%1 - %2 Segments - Event List"
+msgstr ""
+
+#: ../src/gui/rulers/TempoRuler.cpp:131
+msgid "Insert Tempo Change at Playback Position"
+msgstr ""
+
+#: ../src/gui/rulers/TempoRuler.cpp:136
+msgid "Delete Tempo Change"
+msgstr ""
+
+#: ../src/gui/rulers/TempoRuler.cpp:140
+msgid "Ramp Tempo to Next Tempo"
+msgstr ""
+
+#: ../src/gui/rulers/TempoRuler.cpp:144
+msgid "Un-Ramp Tempo"
+msgstr ""
+
+#: ../src/gui/rulers/TempoRuler.cpp:149
+msgid "Edit Tempo..."
+msgstr ""
+
+#: ../src/gui/rulers/TempoRuler.cpp:153
+msgid "Edit Time Signature..."
+msgstr ""
+
+#: ../src/gui/rulers/TempoRuler.cpp:588
+msgid "%1.%2%3 (%4.%5%6 bpm)"
+msgstr ""
+
+#: ../src/gui/rulers/TempoRuler.cpp:596
+msgid "%1.%2%3 bpm"
+msgstr ""
+
+#: ../src/gui/rulers/TempoRuler.cpp:604
+msgid "%1 - %2.%3%4"
+msgstr ""
+
+#: ../src/gui/rulers/ControlRulerEventInsertCommand.cpp:36
+msgid "Insert Controller Event"
+msgstr ""
+
+#: ../src/gui/rulers/ControlChangeCommand.cpp:35
+msgid "Control Change"
+msgstr ""
+
+#: ../src/gui/rulers/PropertyViewRuler.cpp:72
+msgid "%1 controller"
+msgstr ""
+
+#: ../src/gui/rulers/RawNoteRuler.cpp:453
+msgid "Track #%1, Segment \"%2\" (runtime id %3)"
+msgstr ""
+
+#: ../src/gui/rulers/MarkerRuler.cpp:100
+msgid "Insert Marker"
+msgstr ""
+
+#: ../src/gui/rulers/MarkerRuler.cpp:104
+msgid "Insert Marker at Playback Position"
+msgstr ""
+
+#: ../src/gui/rulers/MarkerRuler.cpp:109
+#, fuzzy
+msgid "Delete Marker"
+msgstr "Delete Colour"
+
+#: ../src/gui/rulers/MarkerRuler.cpp:114
+msgid "Edit Marker..."
+msgstr ""
+
+#: ../src/gui/rulers/MarkerRuler.cpp:119
+msgid ""
+"Click on a marker to move the playback pointer.\n"
+"Shift-click to set a range between markers.\n"
+"Double-click to open the marker editor."
+msgstr ""
+
+#: ../src/gui/rulers/ChordNameRuler.cpp:97
+msgid ""
+"Chord name ruler.\n"
+"Turn it on and off from the Settings->Rulers menu."
+msgstr ""
+
+#: ../src/gui/rulers/ControlRulerEventEraseCommand.cpp:37
+msgid "Erase Controller Event(s)"
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:901
+#: ../src/gui/rulers/ControllerEventsRuler.cpp:188
+msgid "Unsupported Event Type"
+msgstr ""
+
+#: ../src/gui/rulers/ControllerEventsRuler.cpp:203
+msgid "Controller Events"
+msgstr ""
+
+#: ../src/gui/rulers/ControllerEventsRuler.cpp:278
+msgid "Controller Event Number"
+msgstr ""
+
+#: ../src/gui/rulers/ControllerEventsRuler.cpp:471
+msgid "Add line of controllers"
+msgstr ""
+
+#: ../src/gui/rulers/LoopRuler.cpp:89
+msgid ""
+"Click and drag to move the playback pointer.\n"
+"Shift-click and drag to set a range for looping or editing.\n"
+"Shift-click to clear the loop or range.\n"
+"Double-click to start playback."
+msgstr ""
+
+#: ../src/gui/general/EditViewBase.cpp:228
+msgid "Set Segment Start Time..."
+msgstr ""
+
+#: ../src/gui/general/EditViewBase.cpp:232
+msgid "Set Segment Duration..."
+msgstr ""
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:56
+msgid "Load track parameters preset"
+msgstr ""
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:62
+msgid "Convert notation for..."
+msgstr ""
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:86
+msgid "Select preset track parameters for:"
+msgstr ""
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:87
+msgid "Create appropriate notation for:"
+msgstr ""
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:89
+msgid "Category"
+msgstr ""
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:95
+msgid "Player Ability"
+msgstr ""
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:97
+msgid "Amateur"
+msgstr ""
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:98
+msgid "Professional"
+msgstr ""
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:104
+msgid "Only selected segments"
+msgstr ""
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:106
+msgid "All segments in this track"
+msgstr ""
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:111
+msgid "Only for new segments"
+msgstr ""
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:113
+msgid "Convert existing segments"
+msgstr ""
+
+#: ../src/gui/general/MidiPitchLabel.cpp:39
+#, c-format
+msgid "C%1"
+msgstr ""
+
+#: ../src/gui/general/MidiPitchLabel.cpp:39
+#, c-format
+msgid "C#%1"
+msgstr ""
+
+#: ../src/gui/general/MidiPitchLabel.cpp:39
+#, c-format
+msgid "D%1"
+msgstr ""
+
+#: ../src/gui/general/MidiPitchLabel.cpp:39
+#, c-format
+msgid "D#%1"
+msgstr ""
+
+#: ../src/gui/general/MidiPitchLabel.cpp:40
+#, c-format
+msgid "E%1"
+msgstr ""
+
+#: ../src/gui/general/MidiPitchLabel.cpp:40
+#, c-format
+msgid "F%1"
+msgstr ""
+
+#: ../src/gui/general/MidiPitchLabel.cpp:40
+#, c-format
+msgid "F#%1"
+msgstr ""
+
+#: ../src/gui/general/MidiPitchLabel.cpp:40
+#, c-format
+msgid "G%1"
+msgstr ""
+
+#: ../src/gui/general/MidiPitchLabel.cpp:41
+#, c-format
+msgid "G#%1"
+msgstr ""
+
+#: ../src/gui/general/MidiPitchLabel.cpp:41
+#, c-format
+msgid "A%1"
+msgstr ""
+
+#: ../src/gui/general/MidiPitchLabel.cpp:41
+#, c-format
+msgid "A#%1"
+msgstr ""
+
+#: ../src/gui/general/MidiPitchLabel.cpp:41
+#, c-format
+msgid "B%1"
+msgstr ""
+
+#: ../src/gui/general/PresetGroup.cpp:95
+#, c-format
+msgid "Can't open preset file %1"
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:744
+msgid "&Halve Durations"
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:748
+msgid "&Double Durations"
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:806
+msgid "Show Velocity Property Ruler"
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:825
+msgid "Insert item"
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:831
+msgid "Erase selected items"
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:835
+msgid "Clear ruler"
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:839
+msgid "Insert line of controllers"
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:843
+msgid "Flip forward"
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:847
+msgid "Flip backwards"
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:851
+msgid "Draw property line"
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:855
+msgid "Select all property values"
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:894
+msgid "%1 Controller %2 %3"
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:1066
+msgid "I"
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:1066
+msgid "II"
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:1066
+msgid "III"
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:1066
+msgid "IV"
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:1067
+msgid "V"
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:1067
+msgid "VI"
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:1067
+msgid "VII"
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:1067
+msgid "VIII"
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:1069
+msgid "%1 flat"
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:1070
+msgid "%1 sharp"
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:1085
+msgid "&Insert Note"
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:1091
+msgid "&Upper Octave"
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:1096
+msgid "&Lower Octave"
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:1268
+msgid "Estimated time signature shown"
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:1431
+msgid "Halving durations..."
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:1445
+msgid "Doubling durations..."
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:1469
+msgid "Rescaling..."
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:1489
+msgid "By number of semitones: "
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:1496 ../src/gui/general/EditView.cpp:1518
+msgid "Transposing..."
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:1536
+msgid "Transposing up one semitone..."
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:1545
+msgid "Transposing up one octave..."
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:1554
+msgid "Transposing down one semitone..."
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:1563
+msgid "Transposing down one octave..."
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:1575
+msgid "Inverting..."
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:1587
+msgid "Retrograding..."
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:1599
+msgid "Retrograde inverting..."
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:1608
+msgid "Jogging left..."
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:1623
+msgid "Jogging right..."
+msgstr ""
+
+#: ../src/sound/AudioFileManager.cpp:660
+#, c-format
+msgid "Downloading file %1"
+msgstr ""
+
+#: ../src/sound/AudioFileManager.cpp:735
+msgid "Converting audio file..."
+msgstr ""
+
+#: ../src/sound/AudioFileManager.cpp:737
+msgid "Resampling audio file..."
+msgstr ""
+
+#: ../src/sound/AudioFileManager.cpp:739
+msgid "Converting and resampling audio file..."
+msgstr ""
+
+#: ../src/sound/AudioFileManager.cpp:741
+msgid "Importing audio file..."
+msgstr ""
+
+#: ../src/sound/AudioFileManager.cpp:794
+msgid "Failed to convert or resample audio file on import"
+msgstr ""
+
+#: ../src/sequencer/main.cpp:46 ../src/sequencer/main.cpp:86
+msgid "RosegardenSequencer"
+msgstr ""
+
+#: ../src/sequencer/main.cpp:54
+msgid "JACK playback and capture ports"
+msgstr ""
+
+#: ../src/commands/segment/SegmentSyncCommand.cpp:38
+#: ../src/commands/segment/SegmentSyncCommand.cpp:44
+#: ../src/commands/segment/SegmentSyncCommand.cpp:55
+#: ../src/commands/segment/SegmentSyncCommand.cpp:63
+msgid "Sync segment parameters"
+msgstr ""
+
+#: ../src/commands/segment/RenameTrackCommand.h:52
+msgid "Rename Track"
+msgstr ""
+
+#: ../src/commands/segment/SegmentRepeatToCopyCommand.cpp:39
+msgid "Turn Repeats into Copies"
+msgstr ""
+
+#: ../src/commands/segment/SegmentTransposeCommand.cpp:36
+#: ../src/commands/segment/SegmentTransposeCommand.cpp:42
+#, fuzzy
+msgid "Change segment transposition"
+msgstr "Change Segment Colour"
+
+#: ../src/commands/edit/RescaleCommand.h:50
+#: ../src/commands/segment/AudioSegmentRescaleCommand.h:62
+#: ../src/commands/segment/SegmentRescaleCommand.h:58
+msgid "Stretch or S&quash..."
+msgstr ""
+
+#: ../src/commands/segment/SegmentLabelCommand.h:52
+msgid "Re&label..."
+msgstr ""
+
+#: ../src/commands/segment/AudioSegmentResizeFromStartCommand.cpp:39
+#: ../src/commands/segment/SegmentResizeFromStartCommand.cpp:39
+msgid "Resize Segment"
+msgstr ""
+
+#: ../src/commands/segment/RemoveTempoChangeCommand.h:58
+msgid "Remove &Tempo Change..."
+msgstr ""
+
+#: ../src/commands/segment/SegmentEraseCommand.cpp:40
+#: ../src/commands/segment/SegmentEraseCommand.cpp:52
+msgid "Erase Segment"
+msgstr ""
+
+#: ../src/commands/segment/AudioSegmentRescaleCommand.cpp:126
+#: ../src/commands/segment/SegmentRescaleCommand.cpp:102
+msgid "(rescaled)"
+msgstr ""
+
+#: ../src/commands/segment/AudioSegmentRescaleCommand.cpp:127
+#: ../src/commands/segment/SegmentRescaleCommand.cpp:105
+msgid "%1 (rescaled)"
+msgstr ""
+
+#: ../src/commands/segment/PasteToTriggerSegmentCommand.cpp:47
+msgid "Paste as New Triggered Segment"
+msgstr ""
+
+#: ../src/commands/segment/SegmentColourMapCommand.h:52
+msgid "Change Segment Color Map..."
+msgstr "Change Segment Colour Map..."
+
+#: ../src/commands/segment/SegmentQuickCopyCommand.h:55
+msgid "Quick-Copy Segment"
+msgstr ""
+
+#: ../src/commands/segment/AudioSegmentSplitCommand.cpp:42
+msgid "Split Audio Segment"
+msgstr ""
+
+#: ../src/commands/segment/AudioSegmentSplitCommand.cpp:103
+#: ../src/commands/segment/SegmentSplitCommand.cpp:135
+msgid " (split)"
+msgstr ""
+
+#: ../src/commands/segment/AudioSegmentSplitCommand.cpp:104
+#: ../src/commands/segment/SegmentSplitByRecordingSrcCommand.cpp:120
+#: ../src/commands/segment/SegmentSplitByRecordingSrcCommand.cpp:122
+#: ../src/commands/segment/SegmentSplitCommand.cpp:136
+msgid "%1 (split)"
+msgstr ""
+
+#: ../src/commands/segment/SegmentLabelCommand.cpp:40
+msgid "Label Segments"
+msgstr ""
+
+#: ../src/commands/segment/OpenOrCloseRangeCommand.cpp:43
+msgid "Open or Close Range"
+msgstr ""
+
+#: ../src/commands/edit/TransposeCommand.h:55
+#: ../src/commands/segment/SegmentTransposeCommand.h:54
+msgid "Transpose by &Interval..."
+msgstr ""
+
+#: ../src/commands/segment/SegmentAutoSplitCommand.cpp:148
+msgid "%1 (part)"
+msgstr ""
+
+#: ../src/commands/segment/AudioSegmentInsertCommand.cpp:51
+#: ../src/commands/segment/SegmentInsertCommand.cpp:43
+#: ../src/commands/segment/SegmentInsertCommand.cpp:56
+msgid "Create Segment"
+msgstr ""
+
+#: ../src/commands/segment/AudioSegmentInsertCommand.cpp:114
+msgid "%1 (inserted)"
+msgstr ""
+
+#: ../src/commands/segment/AudioSegmentInsertCommand.cpp:117
+msgid "unknown audio file"
+msgstr ""
+
+#: ../src/commands/segment/CreateTempoMapFromSegmentCommand.cpp:40
+msgid "Set Tempos from Beat Segment"
+msgstr ""
+
+#: ../src/commands/segment/SegmentSplitByRecordingSrcCommand.h:52
+msgid "Split by &Recording Source..."
+msgstr ""
+
+#: ../src/commands/segment/SegmentColourMapCommand.cpp:40
+msgid "Change Segment Color Map"
+msgstr "Change Segment Colour Map"
+
+#: ../src/commands/edit/CopyCommand.cpp:64
+#: ../src/commands/segment/SegmentQuickCopyCommand.cpp:57
+msgid "%1 (copied)"
+msgstr ""
+
+#: ../src/commands/segment/SegmentColourCommand.h:52
+msgid "Change Segment Color..."
+msgstr "Change Segment Colour..."
+
+#: ../src/commands/segment/SegmentSplitByPitchCommand.cpp:170
+msgid "%1 (upper)"
+msgstr ""
+
+#: ../src/commands/segment/SegmentSplitByPitchCommand.cpp:172
+msgid "%1 (lower)"
+msgstr ""
+
+#: ../src/commands/segment/SegmentSingleRepeatToCopyCommand.cpp:39
+msgid "Turn Single Repeat into Copy"
+msgstr ""
+
+#: ../src/commands/segment/AddTempoChangeCommand.h:58
+msgid "Add Te&mpo Change..."
+msgstr ""
+
+#: ../src/commands/segment/AudioSegmentAutoSplitCommand.h:57
+#: ../src/commands/segment/SegmentAutoSplitCommand.h:53
+msgid "&Split on Silence"
+msgstr ""
+
+#: ../src/commands/segment/SetTriggerSegmentBaseVelocityCommand.cpp:39
+msgid "Set Base Velocity"
+msgstr ""
+
+#: ../src/commands/segment/DeleteRangeCommand.cpp:43
+#: ../src/commands/segment/EraseSegmentsStartingInRangeCommand.cpp:39
+msgid "Delete Range"
+msgstr ""
+
+#: ../src/commands/segment/ChangeCompositionLengthCommand.h:53
+msgid "Change &Composition Start and End..."
+msgstr ""
+
+#: ../src/commands/segment/MoveTracksCommand.h:51
+msgid "Move Tracks..."
+msgstr ""
+
+#: ../src/commands/segment/SegmentColourCommand.cpp:39
+msgid "Change Segment Color"
+msgstr "Change Segment Colour"
+
+#: ../src/commands/segment/AudioSegmentDistributeCommand.h:66
+msgid "Distribute Audio Segments over MIDI"
+msgstr ""
+
+#: ../src/commands/segment/AudioSegmentAutoSplitCommand.cpp:147
+msgid "%1 (autosplit %2)"
+msgstr ""
+
+#: ../src/commands/segment/SetTriggerSegmentDefaultRetuneCommand.cpp:39
+msgid "Set Default Retune"
+msgstr ""
+
+#: ../src/commands/segment/AddTimeSignatureCommand.h:52
+msgid "Add Time Si&gnature Change..."
+msgstr ""
+
+#: ../src/commands/segment/AddTriggerSegmentCommand.cpp:42
+msgid "Add Triggered Segment"
+msgstr ""
+
+#: ../src/commands/segment/SetTriggerSegmentDefaultTimeAdjustCommand.cpp:39
+msgid "Set Default Time Adjust"
+msgstr ""
+
+#: ../src/commands/segment/RemoveTimeSignatureCommand.h:58
+msgid "Remove &Time Signature Change..."
+msgstr ""
+
+#: ../src/commands/segment/SegmentCommandRepeat.cpp:39
+msgid "Repeat Segments"
+msgstr ""
+
+#: ../src/commands/segment/AddTracksCommand.h:55
+msgid "Add Tracks..."
+msgstr ""
+
+#: ../src/commands/segment/ModifyDefaultTempoCommand.h:51
+msgid "Modify &Default Tempo..."
+msgstr ""
+
+#: ../src/commands/segment/SegmentSplitByPitchCommand.h:61
+msgid "Split by &Pitch..."
+msgstr ""
+
+#: ../src/commands/segment/DeleteTriggerSegmentCommand.cpp:40
+msgid "Delete Triggered Segment"
+msgstr ""
+
+#: ../src/commands/segment/SegmentSplitCommand.cpp:42
+msgid "Split Segment"
+msgstr ""
+
+#: ../src/commands/segment/DeleteTracksCommand.h:51
+msgid "Delete Tracks..."
+msgstr ""
+
+#: ../src/commands/segment/InsertRangeCommand.cpp:42
+msgid "Insert Range"
+msgstr ""
+
+#: ../src/commands/segment/DeleteRangeCommand.h:62
+msgid "Rejoin Command"
+msgstr ""
+
+#: ../src/commands/segment/SetTriggerSegmentBasePitchCommand.cpp:39
+msgid "Set Base Pitch"
+msgstr ""
+
+#: ../src/commands/segment/PasteConductorDataCommand.cpp:41
+msgid "Paste Tempos and Time Signatures"
+msgstr ""
+
+#: ../src/commands/segment/SegmentSyncClefCommand.cpp:34
+msgid "Sync segment clef"
+msgstr ""
+
+#: ../src/commands/matrix/MatrixInsertionCommand.cpp:46
+#: ../src/commands/notation/NoteInsertionCommand.cpp:54
+msgid "Insert Note"
+msgstr ""
+
+#: ../src/commands/matrix/MatrixEraseCommand.cpp:41
+msgid "Erase Note"
+msgstr ""
+
+#: ../src/commands/matrix/MatrixPercussionInsertionCommand.cpp:47
+msgid "Insert Percussion Note"
+msgstr ""
+
+#: ../src/commands/matrix/MatrixModifyCommand.cpp:43
+msgid "Move Note"
+msgstr ""
+
+#: ../src/commands/matrix/MatrixModifyCommand.cpp:43
+msgid "Modify Note"
+msgstr ""
+
+#: ../src/commands/edit/PasteEventsCommand.cpp:98
+msgid "Paste into an existing gap [\"restricted\"]"
+msgstr ""
+
+#: ../src/commands/edit/PasteEventsCommand.cpp:100
+msgid "Erase existing events to make room [\"simple\"]"
+msgstr ""
+
+#: ../src/commands/edit/PasteEventsCommand.cpp:102
+msgid "Move existing events out of the way [\"open-n-paste\"]"
+msgstr ""
+
+#: ../src/commands/edit/PasteEventsCommand.cpp:104
+msgid "Overlay notes, tying against present notes [\"note-overlay\"]"
+msgstr ""
+
+#: ../src/commands/edit/PasteEventsCommand.cpp:106
+msgid "Overlay notes, ignoring present notes [\"matrix-overlay\"]"
+msgstr ""
+
+#: ../src/commands/edit/AddDotCommand.h:52
+msgid "&Add Dot"
+msgstr ""
+
+#: ../src/commands/edit/RemoveMarkerCommand.h:55
+msgid "&Remove Marker"
+msgstr ""
+
+#: ../src/commands/edit/EventUnquantizeCommand.cpp:43
+#: ../src/commands/edit/EventUnquantizeCommand.cpp:54
+msgid "Unquantize Events"
+msgstr ""
+
+#: ../src/commands/edit/ChangeVelocityCommand.h:53
+msgid "&Increase Velocity"
+msgstr ""
+
+#: ../src/commands/edit/ChangeVelocityCommand.h:54
+msgid "&Reduce Velocity"
+msgstr ""
+
+#: ../src/commands/edit/CopyCommand.cpp:46
+msgid "(excerpt)"
+msgstr ""
+
+#: ../src/commands/edit/CopyCommand.cpp:60
+msgid "(copied)"
+msgstr ""
+
+#: ../src/commands/edit/EventInsertionCommand.cpp:39
+msgid "Insert Event"
+msgstr ""
+
+#: ../src/commands/edit/InsertTriggerNoteCommand.cpp:55
+msgid "Insert Trigger Note"
+msgstr ""
+
+#: ../src/commands/edit/CollapseNotesCommand.h:50
+msgid "Collapse &Equal-Pitch Notes"
+msgstr ""
+
+#: ../src/commands/edit/TransposeCommand.h:61
+msgid "&Up a Semitone"
+msgstr ""
+
+#: ../src/commands/edit/TransposeCommand.h:62
+msgid "&Down a Semitone"
+msgstr ""
+
+#: ../src/commands/edit/TransposeCommand.h:63
+msgid "Up an &Octave"
+msgstr ""
+
+#: ../src/commands/edit/TransposeCommand.h:64
+msgid "Down an Octa&ve"
+msgstr ""
+
+#: ../src/commands/edit/TransposeCommand.h:65
+msgid "&Transpose by Semitones..."
+msgstr ""
+
+#: ../src/commands/edit/SetNoteTypeCommand.h:56
+msgid "&Set Note Type"
+msgstr ""
+
+#: ../src/commands/edit/EventEditCommand.h:55
+msgid "Edit E&vent"
+msgstr ""
+
+#: ../src/commands/edit/AddMarkerCommand.h:54
+msgid "&Add Marker"
+msgstr ""
+
+#: ../src/commands/edit/SelectionPropertyCommand.h:66
+msgid "Set &Property"
+msgstr ""
+
+#: ../src/commands/edit/CutCommand.h:55
+msgid "Cu&t"
+msgstr ""
+
+#: ../src/commands/edit/EventQuantizeCommand.cpp:114
+msgid "Heuristic Notation &Quantize"
+msgstr ""
+
+#: ../src/commands/edit/EventQuantizeCommand.cpp:116
+msgid "Grid &Quantize"
+msgstr ""
+
+#: ../src/commands/edit/ClearTriggersCommand.h:52
+msgid "&Clear Triggers"
+msgstr ""
+
+#: ../src/commands/edit/RetrogradeCommand.h:51
+msgid "&Retrograde"
+msgstr ""
+
+#: ../src/commands/edit/InvertCommand.h:51
+msgid "&Invert"
+msgstr ""
+
+#: ../src/commands/edit/SetTriggerCommand.h:64
+msgid "Tri&gger Segment"
+msgstr ""
+
+#: ../src/commands/edit/SetLyricsCommand.h:50
+msgid "Edit L&yrics"
+msgstr ""
+
+#: ../src/commands/edit/MoveAcrossSegmentsCommand.cpp:73
+msgid "&Move Events to Other Segment"
+msgstr ""
+
+#: ../src/commands/edit/RetrogradeInvertCommand.h:51
+msgid "Re&trograde Invert"
+msgstr ""
+
+#: ../src/commands/edit/ModifyMarkerCommand.h:55
+msgid "&Modify Marker"
+msgstr ""
+
+#: ../src/commands/studio/AddControlParameterCommand.h:61
+msgid "&Add Control Parameter"
+msgstr ""
+
+#: ../src/commands/studio/ModifyInstrumentMappingCommand.h:55
+msgid "Modify &Instrument Mapping"
+msgstr ""
+
+#: ../src/commands/studio/RemoveControlParameterCommand.h:60
+msgid "&Remove Control Parameter"
+msgstr ""
+
+#: ../src/commands/studio/ReconnectDeviceCommand.h:55
+msgid "Reconnect Device"
+msgstr ""
+
+#: ../src/commands/studio/ModifyDeviceCommand.h:68
+msgid "Modify &MIDI Bank"
+msgstr ""
+
+#: ../src/commands/studio/CreateOrDeleteDeviceCommand.h:68
+msgid "Create Device"
+msgstr ""
+
+#: ../src/commands/studio/ModifyDeviceMappingCommand.h:55
+msgid "Modify &Device Mapping"
+msgstr ""
+
+#: ../src/commands/studio/RenameDeviceCommand.h:55
+msgid "Rename Device"
+msgstr ""
+
+#: ../src/commands/studio/ModifyControlParameterCommand.h:61
+msgid "&Modify Control Parameter"
+msgstr ""
+
+#: ../src/commands/notation/TieNotesCommand.h:49
+msgid "&Tie"
+msgstr ""
+
+#: ../src/commands/notation/ClefInsertionCommand.cpp:74
+msgid "Add Cle&f Change..."
+msgstr ""
+
+#: ../src/commands/notation/GuitarChordInsertionCommand.cpp:40
+msgid "Insert Guitar Chord"
+msgstr ""
+
+#: ../src/commands/notation/RespellCommand.cpp:47
+#, c-format
+msgid "Respell with %1"
+msgstr ""
+
+#: ../src/commands/notation/RespellCommand.cpp:50
+msgid "Do&uble Sharp"
+msgstr ""
+
+#: ../src/commands/notation/RespellCommand.cpp:52
+msgid "&Sharp"
+msgstr ""
+
+#: ../src/commands/notation/RespellCommand.cpp:54
+msgid "&Flat"
+msgstr ""
+
+#: ../src/commands/notation/RespellCommand.cpp:56
+msgid "Dou&ble Flat"
+msgstr ""
+
+#: ../src/commands/notation/RespellCommand.cpp:58
+msgid "&Natural"
+msgstr ""
+
+#: ../src/commands/notation/RespellCommand.cpp:60
+msgid "N&one"
+msgstr ""
+
+#: ../src/commands/notation/RespellCommand.cpp:66
+msgid "Respell Accidentals &Upward"
+msgstr ""
+
+#: ../src/commands/notation/RespellCommand.cpp:69
+msgid "Respell Accidentals &Downward"
+msgstr ""
+
+#: ../src/commands/notation/RespellCommand.cpp:72
+msgid "&Restore Accidentals"
+msgstr ""
+
+#: ../src/commands/notation/RespellCommand.cpp:75
+msgid "Respell Accidentals"
+msgstr ""
+
+#: ../src/commands/notation/DeCounterpointCommand.h:55
+msgid "Split-and-Tie Overlapping &Chords"
+msgstr ""
+
+#: ../src/commands/notation/BeamCommand.h:49
+msgid "&Beam Group"
+msgstr ""
+
+#: ../src/commands/notation/AddTextMarkCommand.h:51
+msgid "Add Te&xt Mark..."
+msgstr ""
+
+#: ../src/commands/notation/RestoreSlursCommand.h:49
+msgid "&Restore Slur Positions"
+msgstr ""
+
+#: ../src/commands/notation/SustainInsertionCommand.h:56
+msgid "Add Pedal &Press"
+msgstr ""
+
+#: ../src/commands/notation/SustainInsertionCommand.h:58
+msgid "Add Pedal &Release"
+msgstr ""
+
+#: ../src/commands/notation/FixNotationQuantizeCommand.h:49
+msgid "Fi&x Notation Quantization"
+msgstr ""
+
+#: ../src/commands/notation/ChangeStemsCommand.h:51
+msgid "Stems &Up"
+msgstr ""
+
+#: ../src/commands/notation/ChangeStemsCommand.h:51
+msgid "Stems &Down"
+msgstr ""
+
+#: ../src/commands/notation/MakeAccidentalsCautionaryCommand.cpp:43
+msgid "Use &Cautionary Accidentals"
+msgstr ""
+
+#: ../src/commands/notation/MakeAccidentalsCautionaryCommand.cpp:45
+msgid "Cancel C&autionary Accidentals"
+msgstr ""
+
+#: ../src/commands/notation/SetVisibilityCommand.h:50
+msgid "Set Visibility"
+msgstr ""
+
+#: ../src/commands/notation/ChangeStyleCommand.h:53
+msgid "Change &Note Style"
+msgstr ""
+
+#: ../src/commands/notation/TextInsertionCommand.cpp:41
+msgid "Insert Text"
+msgstr ""
+
+#: ../src/commands/notation/InterpretCommand.h:70
+msgid "&Interpret..."
+msgstr ""
+
+#: ../src/commands/notation/TupletCommand.h:53
+msgid "&Triplet"
+msgstr ""
+
+#: ../src/commands/notation/TupletCommand.h:54
+msgid "Tu&plet..."
+msgstr ""
+
+#: ../src/commands/notation/UnTupletCommand.h:50
+msgid "&Untuplet"
+msgstr ""
+
+#: ../src/commands/notation/CollapseRestsCommand.h:54
+msgid "&Collapse Rests"
+msgstr ""
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:145
+msgid "Add S&lur"
+msgstr ""
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:147
+msgid "Add &Phrasing Slur"
+msgstr ""
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:149
+msgid "Add Double-Octave Up"
+msgstr ""
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:151
+msgid "Add Octave &Up"
+msgstr ""
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:153
+msgid "Add Octave &Down"
+msgstr ""
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:155
+msgid "Add Double Octave Down"
+msgstr ""
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:160
+msgid "Add &Crescendo"
+msgstr ""
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:162
+msgid "Add &Decrescendo"
+msgstr ""
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:164
+msgid "Add &Glissando"
+msgstr ""
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:167
+msgid "Add &%1%2"
+msgstr ""
+
+#: ../src/commands/notation/RemoveNotationQuantizeCommand.h:49
+msgid "Remo&ve Notation Quantization"
+msgstr ""
+
+#: ../src/commands/notation/MakeChordCommand.h:50
+msgid "Make &Chord"
+msgstr ""
+
+#: ../src/commands/notation/MultiKeyInsertionCommand.h:63
+msgid "Change all to &Key %1..."
+msgstr ""
+
+#: ../src/commands/notation/KeyInsertionCommand.h:67
+#: ../src/commands/notation/MultiKeyInsertionCommand.h:65
+msgid "Add &Key Change..."
+msgstr ""
+
+#: ../src/commands/notation/RestoreStemsCommand.h:49
+msgid "&Restore Stems"
+msgstr ""
+
+#: ../src/commands/notation/MakeNotesViableCommand.h:55
+#: ../src/commands/notation/MakeRegionViableCommand.h:52
+msgid "Tie Notes at &Barlines"
+msgstr ""
+
+#: ../src/commands/notation/AddSlashesCommand.h:46
+msgid "Slashes"
+msgstr ""
+
+#: ../src/commands/notation/ChangeSlurPositionCommand.h:51
+msgid "Slur &Above"
+msgstr ""
+
+#: ../src/commands/notation/ChangeSlurPositionCommand.h:51
+msgid "Slur &Below"
+msgstr ""
+
+#: ../src/commands/notation/NormalizeRestsCommand.h:54
+msgid "&Normalize Rests"
+msgstr ""
+
+#: ../src/commands/notation/TextChangeCommand.cpp:41
+msgid "Edit Text"
+msgstr ""
+
+#: ../src/commands/notation/RemoveMarksCommand.h:49
+msgid "&Remove All Marks"
+msgstr ""
+
+#: ../src/commands/notation/AutoBeamCommand.h:52
+msgid "&Auto-Beam"
+msgstr ""
+
+#: ../src/commands/notation/UntieNotesCommand.h:49
+msgid "&Untie"
+msgstr ""
+
+#: ../src/commands/notation/AddMarkCommand.cpp:48
+msgid "S&forzando"
+msgstr ""
+
+#: ../src/commands/notation/AddMarkCommand.cpp:50
+msgid "Sta&ccato"
+msgstr ""
+
+#: ../src/commands/notation/AddMarkCommand.cpp:52
+msgid "R&inforzando"
+msgstr ""
+
+#: ../src/commands/notation/AddMarkCommand.cpp:54
+msgid "T&enuto"
+msgstr ""
+
+#: ../src/commands/notation/AddMarkCommand.cpp:56
+msgid "Tri&ll"
+msgstr ""
+
+#: ../src/commands/notation/AddMarkCommand.cpp:58
+msgid "Trill &with Line"
+msgstr ""
+
+#: ../src/commands/notation/AddMarkCommand.cpp:60
+msgid "Trill Line"
+msgstr ""
+
+#: ../src/commands/notation/AddMarkCommand.cpp:62
+msgid "&Turn"
+msgstr ""
+
+#: ../src/commands/notation/AddMarkCommand.cpp:64
+msgid "&Accent"
+msgstr ""
+
+#: ../src/commands/notation/AddMarkCommand.cpp:66
+msgid "&Staccatissimo"
+msgstr ""
+
+#: ../src/commands/notation/AddMarkCommand.cpp:68
+msgid "&Marcato"
+msgstr ""
+
+#: ../src/commands/notation/AddMarkCommand.cpp:70
+msgid "&Pause"
+msgstr ""
+
+#: ../src/commands/notation/AddMarkCommand.cpp:72
+msgid "&Up-Bow"
+msgstr ""
+
+#: ../src/commands/notation/AddMarkCommand.cpp:74
+msgid "&Down-Bow"
+msgstr ""
+
+#: ../src/commands/notation/AddMarkCommand.cpp:76
+msgid "Mo&rdent"
+msgstr ""
+
+#: ../src/commands/notation/AddMarkCommand.cpp:78
+msgid "Inverted Mordent"
+msgstr ""
+
+#: ../src/commands/notation/AddMarkCommand.cpp:80
+msgid "Long Mordent"
+msgstr ""
+
+#: ../src/commands/notation/AddMarkCommand.cpp:82
+msgid "Lon&g Inverted Mordent"
+msgstr ""
+
+#: ../src/commands/notation/AddMarkCommand.cpp:84
+msgid "&%1%2"
+msgstr ""
+
+#: ../src/commands/notation/AddMarkCommand.cpp:89
+#, c-format
+msgid "Add %1"
+msgstr ""
+
+#: ../src/commands/notation/ResetDisplacementsCommand.h:49
+msgid "Restore Positions"
+msgstr ""
+
+#: ../src/commands/notation/IncrementDisplacementsCommand.h:52
+msgid "Fine Reposition"
+msgstr ""
+
+#: ../src/commands/notation/RestoreTiesCommand.h:49
+msgid "&Restore Tie Positions"
+msgstr ""
+
+#: ../src/commands/notation/ChangeTiePositionCommand.h:47
+msgid "Tie &Above"
+msgstr ""
+
+#: ../src/commands/notation/ChangeTiePositionCommand.h:47
+msgid "Tie &Below"
+msgstr ""
+
+#: ../src/commands/notation/KeyInsertionCommand.h:65
+msgid "Change to &Key %1..."
+msgstr ""
+
+#: ../src/commands/notation/RemoveFingeringMarksCommand.h:49
+msgid "&Remove Fingerings"
+msgstr ""
+
+#: ../src/commands/notation/BreakCommand.h:49
+msgid "&Unbeam"
+msgstr ""
+
+#: ../src/commands/notation/UnGraceCommand.h:48
+msgid "Ung&race"
+msgstr ""
+
+#: ../src/commands/notation/AddFingeringMarkCommand.cpp:45
+msgid "Add Other &Fingering..."
+msgstr ""
+
+#: ../src/commands/notation/AddFingeringMarkCommand.cpp:47
+msgid "Add Fingering &0 (Thumb)"
+msgstr ""
+
+#: ../src/commands/notation/AddFingeringMarkCommand.cpp:49
+#, c-format
+msgid "Add Fingering &%1"
+msgstr ""
+
+#: ../src/document/io/HydrogenXMLHandler.cpp:277
+msgid " imported from Hydrogen "
+msgstr ""
+
+#: ../src/document/io/LilyPondExporter.cpp:404
+msgid ""
+"LilyPond does not allow spaces or backslashes in filenames.\n"
+"\n"
+"Would you like to use\n"
+"\n"
+" %1\n"
+"\n"
+" instead?"
+msgstr ""
+
+#: ../src/document/io/LilyPondExporter.cpp:2054
+msgid "warning: overlong bar truncated here"
+msgstr ""
+
+#: ../src/document/io/LilyPondExporter.cpp:2060
+msgid "warning: bar too short, padding with rests"
+msgstr ""
+
+#: ../src/document/MultiViewCommandHistory.cpp:318
+msgid "Nothing to undo"
+msgstr ""
+
+#: ../src/document/MultiViewCommandHistory.cpp:320
+msgid "Nothing to redo"
+msgstr ""
+
+#: ../src/document/MultiViewCommandHistory.cpp:328
+#: ../src/document/MultiViewCommandHistory.cpp:372
+#, c-format
+msgid "Und&o %1"
+msgstr ""
+
+#: ../src/document/MultiViewCommandHistory.cpp:330
+#: ../src/document/MultiViewCommandHistory.cpp:374
+#, c-format
+msgid "Re&do %1"
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:328
+msgid ""
+"The current file has been modified.\n"
+"Do you want to save it?"
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:480
+#, c-format
+msgid ""
+"_n: Delete the 1 audio file recorded during the unsaved session?\n"
+"Delete the %n audio files recorded during the unsaved session?"
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:501
+msgid ""
+"The following audio files were recorded during this session but have been "
+"unloaded\n"
+"from the audio file manager, and so are no longer in use in the document you "
+"are saving.\n"
+"\n"
+"You may want to clean up these files to save disk space.\n"
+"\n"
+"Please select any you wish to delete permanently from the hard disk.\n"
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:517
+#, c-format
+msgid ""
+"_n: <qt>About to delete 1 audio file permanently from the hard disk."
+"<br>There will be no way to recover this file.<br>Are you sure?</qt>\n"
+"\n"
+"<qt>About to delete %n audio files permanently from the hard disk.<br>There "
+"will be no way to recover these files.<br>Are you sure?</qt>"
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:580
+msgid "Can't open file '%1'"
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:585
+msgid "Reading file..."
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:603
+msgid "Could not open Rosegarden file"
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:641
+msgid "Error when parsing file '%1': \"%2\""
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:689
+msgid "Generating audio previews..."
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:721
+msgid "Merge"
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:1605
+msgid "File load cancelled"
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:1625
+msgid ""
+"<h3>Audio and plugins not available</h3><p>This composition uses audio files "
+"or plugins, but Rosegarden is currently running without audio because the "
+"JACK audio server was not available on startup.</p><p>Please exit "
+"Rosegarden, start the JACK audio server and re-start Rosegarden if you wish "
+"to load this complete composition.</p><p><b>WARNING:</b> If you re-save this "
+"composition, all audio and plugin data and settings in it will be lost.</p>"
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:1628
+msgid ""
+"<h3>Audio and plugins not available</h3><p>This composition uses audio files "
+"or plugins, but you are running a version of Rosegarden that was compiled "
+"without audio support.</p><p><b>WARNING:</b> If you re-save this composition "
+"from this version of Rosegarden, all audio and plugin data and settings in "
+"it will be lost.</p>"
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:1665
+msgid ""
+"<h3>Incorrect audio sample rate</h3><p>This composition contains audio files "
+"that were recorded or imported with the audio server running at a different "
+"sample rate (%1 Hz) from the current JACK server sample rate (%2 Hz).</"
+"p><p>Rosegarden will play this composition at the correct speed, but any "
+"audio files in it will probably sound awful.</p><p>Please consider re-"
+"starting the JACK server at the correct rate (%3 Hz) and re-loading this "
+"composition before you do any more work with it.</p>"
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:1675
+msgid ""
+"<h3>Inconsistent audio sample rates</h3><p>This composition contains audio "
+"files at more than one sample rate.</p><p>Rosegarden will play them at the "
+"correct speed, but any audio files that were recorded or imported at rates "
+"different from the current JACK server sample rate (%1 Hz) will probably "
+"sound awful.</p><p>Please see the audio file manager dialog for more "
+"details, and consider resampling any files that are at the wrong rate.</p>"
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:1676
+msgid "Inconsistent sample rates"
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:1690
+msgid ""
+"<h3>Plugins not found</h3><p>The following audio plugins could not be loaded:"
+"</p><ul>"
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:1698
+msgid "<li>%1 (from %2)</li>"
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:1712
+msgid ""
+"This file contains one or more old element types that are now deprecated.\n"
+"Support for these elements may disappear in future versions of Rosegarden.\n"
+"We recommend you re-save this file from this version of Rosegarden to ensure "
+"that it can still be re-loaded in future versions."
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:2207
+msgid "Insert Recorded MIDI"
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:2560
+msgid "%1 (recorded)"
+msgstr ""
+
+#: ../src/document/RoseXmlHandler.cpp:442
+msgid ""
+"This file was written by Rosegarden %1, and it uses\n"
+"a different file format that cannot be read by this version."
+msgstr ""
+
+#: ../src/document/RoseXmlHandler.cpp:452
+msgid ""
+"This file was written by Rosegarden %1, which is more recent than this "
+"version.\n"
+"There may be some incompatibilities with the file format."
+msgstr ""
+
+#: ../src/document/RoseXmlHandler.cpp:1687
+msgid "Loading plugins..."
+msgstr ""
+
+#: rc.cpp:6 rc.cpp:144
+#, no-c-format
+msgid "Se&gment"
+msgstr ""
+
+#: rc.cpp:9 rc.cpp:84 rc.cpp:147 rc.cpp:303
+#, no-c-format
+msgid "Edit &With"
+msgstr ""
+
+#: rc.cpp:12 rc.cpp:21 rc.cpp:30 rc.cpp:39 rc.cpp:345
+#, no-c-format
+msgid "Actions Toolbar"
+msgstr ""
+
+#: rc.cpp:15 rc.cpp:33 rc.cpp:129 rc.cpp:285
+#, no-c-format
+msgid "Time Toolbar"
+msgstr ""
+
+#: rc.cpp:18 rc.cpp:36 rc.cpp:57 rc.cpp:63 rc.cpp:120 rc.cpp:243 rc.cpp:342
+#, no-c-format
+msgid "Transport Toolbar"
+msgstr ""
+
+#: rc.cpp:24 rc.cpp:42 rc.cpp:123 rc.cpp:348
+#, no-c-format
+msgid "Zoom Toolbar"
+msgstr ""
+
+#: rc.cpp:45 rc.cpp:60 rc.cpp:99 rc.cpp:228 rc.cpp:327
+#, no-c-format
+msgid "T&ransport"
+msgstr ""
+
+#: rc.cpp:51
+#, no-c-format
+msgid "Number of Stereo &Inputs"
+msgstr ""
+
+#: rc.cpp:54
+#, no-c-format
+msgid "&Number of Submasters"
+msgstr ""
+
+#: rc.cpp:66
+#, no-c-format
+msgid "&Import"
+msgstr ""
+
+#: rc.cpp:69
+#, no-c-format
+msgid "&Merge"
+msgstr ""
+
+#: rc.cpp:72
+#, no-c-format
+msgid "&Export"
+msgstr ""
+
+#: rc.cpp:75 rc.cpp:141 rc.cpp:297
+#, no-c-format
+msgid "&Composition"
+msgstr ""
+
+#: rc.cpp:78
+#, no-c-format
+msgid "&Studio"
+msgstr ""
+
+#: rc.cpp:81
+#, no-c-format
+msgid "Se&gments"
+msgstr ""
+
+#: rc.cpp:90
+#, no-c-format
+msgid "Trac&ks"
+msgstr ""
+
+#: rc.cpp:93
+#, no-c-format
+msgid "Set &Instrument"
+msgstr ""
+
+#: rc.cpp:102 rc.cpp:234 rc.cpp:333
+#, no-c-format
+msgid "&Toolbars"
+msgstr ""
+
+#: rc.cpp:105 rc.cpp:237 rc.cpp:336
+#, no-c-format
+msgid "&Rulers"
+msgstr ""
+
+#: rc.cpp:111 rc.cpp:240 rc.cpp:339
+#, no-c-format
+msgid "Tools Toolbar"
+msgstr ""
+
+#: rc.cpp:114
+#, no-c-format
+msgid "Tracks Toolbar"
+msgstr ""
+
+#: rc.cpp:117
+#, no-c-format
+msgid "Editors Toolbar"
+msgstr ""
+
+#: rc.cpp:135
+#, no-c-format
+msgid "&Layout Mode"
+msgstr ""
+
+#: rc.cpp:138 rc.cpp:294
+#, no-c-format
+msgid "Add Event Ruler"
+msgstr ""
+
+#: rc.cpp:150
+#, no-c-format
+msgid "N&ote"
+msgstr ""
+
+#: rc.cpp:153
+#, no-c-format
+msgid "Mar&ks"
+msgstr ""
+
+#: rc.cpp:156
+#, no-c-format
+msgid "&Ornaments"
+msgstr ""
+
+#: rc.cpp:159
+#, no-c-format
+msgid "&Fingerings"
+msgstr ""
+
+#: rc.cpp:162
+#, no-c-format
+msgid "S&lashes"
+msgstr ""
+
+#: rc.cpp:165 rc.cpp:219
+#, no-c-format
+msgid "&Accidentals"
+msgstr ""
+
+#: rc.cpp:168
+#, no-c-format
+msgid "&Phrase"
+msgstr ""
+
+#: rc.cpp:171
+#, no-c-format
+msgid "Slur &Position"
+msgstr ""
+
+#: rc.cpp:174
+#, no-c-format
+msgid "Tie &Position"
+msgstr ""
+
+#: rc.cpp:177
+#, no-c-format
+msgid "&Octaves"
+msgstr ""
+
+#: rc.cpp:180 rc.cpp:306
+#, no-c-format
+msgid "Ad&just"
+msgstr ""
+
+#: rc.cpp:183
+#, no-c-format
+msgid "R&ests"
+msgstr ""
+
+#: rc.cpp:186 rc.cpp:213
+#, no-c-format
+msgid "&Notes"
+msgstr ""
+
+#: rc.cpp:189 rc.cpp:309
+#, no-c-format
+msgid "&Quantize"
+msgstr ""
+
+#: rc.cpp:195 rc.cpp:315
+#, no-c-format
+msgid "Trans&pose"
+msgstr ""
+
+#: rc.cpp:198 rc.cpp:318
+#, no-c-format
+msgid "Convert"
+msgstr ""
+
+#: rc.cpp:201
+#, no-c-format
+msgid "&Fine Positioning"
+msgstr ""
+
+#: rc.cpp:204
+#, no-c-format
+msgid "Fine Ti&ming"
+msgstr ""
+
+#: rc.cpp:207
+#, no-c-format
+msgid "&Visibility"
+msgstr ""
+
+#: rc.cpp:216
+#, no-c-format
+msgid "&Rests"
+msgstr ""
+
+#: rc.cpp:222
+#, no-c-format
+msgid "&Clefs"
+msgstr ""
+
+#: rc.cpp:225 rc.cpp:324
+#, no-c-format
+msgid "Local &Cursor"
+msgstr ""
+
+#: rc.cpp:246
+#, no-c-format
+msgid "Notes Toolbar"
+msgstr ""
+
+#: rc.cpp:249
+#, no-c-format
+msgid "Rests Toolbar"
+msgstr ""
+
+#: rc.cpp:252
+#, no-c-format
+msgid "Clefs Toolbar"
+msgstr ""
+
+#: rc.cpp:255
+#, no-c-format
+msgid "Accidentals Toolbar"
+msgstr ""
+
+#: rc.cpp:258
+#, no-c-format
+msgid "Group Toolbar"
+msgstr ""
+
+#: rc.cpp:261
+#, no-c-format
+msgid "Marks Toolbar"
+msgstr ""
+
+#: rc.cpp:264
+#, no-c-format
+msgid "Meta Toolbar"
+msgstr ""
+
+#: rc.cpp:267
+#, no-c-format
+msgid "Layout Toolbar"
+msgstr ""
+
+#: rc.cpp:270 rc.cpp:351
+#, no-c-format
+msgid "Control Ruler actions"
+msgstr ""
+
+#: rc.cpp:273 rc.cpp:354
+#, no-c-format
+msgid "Property Ruler actions"
+msgstr ""
+
+#: rc.cpp:276
+#, no-c-format
+msgid "&Action"
+msgstr ""
+
+#: rc.cpp:279
+#, no-c-format
+msgid "General Toolbar"
+msgstr ""
+
+#: rc.cpp:291
+#, no-c-format
+msgid "&Grid"
+msgstr ""
+
+#: rc.cpp:300
+#, no-c-format
+msgid "&Segment"
+msgstr ""
+
+#: rc.cpp:361
+#, no-c-format
+msgid "Hide additional controls"
+msgstr ""
+
+#: rc.cpp:365
+#, no-c-format
+msgid "Panic Button"
+msgstr ""
+
+#: rc.cpp:368
+#, no-c-format
+msgid "Resets all MIDI devices if you've got stuck notes"
+msgstr ""
+
+#: rc.cpp:375
+#, no-c-format
+msgid "Provides a metronome click for you to play along with"
+msgstr ""
+
+#: rc.cpp:378
+#, no-c-format
+msgid "Shows MIDI activity in and out of Rosegarden"
+msgstr ""
+
+#: rc.cpp:381
+#, no-c-format
+msgid "IN"
+msgstr ""
+
+#: rc.cpp:384
+#, no-c-format
+msgid "OUT"
+msgstr ""
+
+#: rc.cpp:387 rc.cpp:390
+#, no-c-format
+msgid "NO EVENTS"
+msgstr ""
+
+#: rc.cpp:397
+#, no-c-format
+msgid "Record either MIDI or audio"
+msgstr ""
+
+#: rc.cpp:401
+#, no-c-format
+msgid "Loop"
+msgstr ""
+
+#: rc.cpp:404
+#, no-c-format
+msgid "Turn on and off the loop markers (if set)"
+msgstr ""
+
+#: rc.cpp:411
+#, no-c-format
+msgid "Mutes all but the currently selected track"
+msgstr ""
+
+#: rc.cpp:415
+#, no-c-format
+msgid "Start loop or range here"
+msgstr ""
+
+#: rc.cpp:419
+#, no-c-format
+msgid "End loop or range here"
+msgstr ""
+
+#: rc.cpp:422
+#, no-c-format
+msgid "SIG"
+msgstr ""
+
+#: rc.cpp:425
+#, no-c-format
+msgid "DIV"
+msgstr ""
+
+#: rc.cpp:428
+#, no-c-format
+msgid "/16"
+msgstr ""
+
+#: rc.cpp:431
+#, no-c-format
+msgid "TEMPO"
+msgstr ""
+
+#: rc.cpp:434
+#, no-c-format
+msgid "END"
+msgstr ""
+
+#: rc.cpp:437
+#, no-c-format
+msgid "BAR"
+msgstr ""
+
+#: rc.cpp:441
+#, no-c-format
+msgid "Switch between real time, musical time, and frame count"
+msgstr ""
+
+#: rc.cpp:445
+#, no-c-format
+msgid "Show additional controls"
+msgstr ""
+
+#: rc.cpp:449
+#, no-c-format
+msgid "Rewind"
+msgstr ""
+
+#: rc.cpp:452
+#, no-c-format
+msgid "Moves the current pointer position back one bar."
+msgstr ""
+
+#: rc.cpp:456
+#, no-c-format
+msgid "Rewind to beginning"
+msgstr ""
+
+#: rc.cpp:459
+#, no-c-format
+msgid ""
+"Moves the pointer position to the start of the composition. (This may mean "
+"going forwards if the pointer is currently before the start.)"
+msgstr ""
+
+#: rc.cpp:463
+#, no-c-format
+msgid "Play/Pause"
+msgstr ""
+
+#: rc.cpp:466
+#, no-c-format
+msgid ""
+"Plays from the current pointer position, or pauses playback if already in "
+"progress."
+msgstr ""
+
+#: rc.cpp:473
+#, no-c-format
+msgid "Stops playback or recording."
+msgstr ""
+
+#: rc.cpp:477
+#, no-c-format
+msgid "Fast forward"
+msgstr ""
+
+#: rc.cpp:480
+#, no-c-format
+msgid "Moves the current pointer position forwards one bar."
+msgstr ""
+
+#: rc.cpp:484
+#, no-c-format
+msgid "Fast forward to end"
+msgstr ""
+
+#: rc.cpp:487
+#, no-c-format
+msgid ""
+"Moves the pointer position to the end of the composition. (This may mean "
+"going backwards if the pointer is already beyond the end.)"
+msgstr ""
+
+#: rc.cpp:491
+#, no-c-format
+msgid "Display time to end"
+msgstr ""
+
+#: ../docs/en/tips.cpp:3
+msgid ""
+"<p>To configure a track to play using a particular instrument:</p>\n"
+"&nbsp;&nbsp;* click on the track label and hold a moment<br>\n"
+"&nbsp;&nbsp;* select an output device<br>\n"
+"&nbsp;&nbsp;* select one of that device's available instruments (#1 - #16)"
+"<br>\n"
+"&nbsp;&nbsp;* adjust that instrument's output channel, program, bank, and\n"
+"controllers via the instrument parameters box\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:13
+msgid ""
+"<p>...that Rosegarden has an autosave feature?<br><br>\n"
+"You can select your autosave interval from <b>Settings->Configure\n"
+"Rosegarden</b>.<br><br>\n"
+"When something goes awry, such as a power outage or a Rosegarden crash\n"
+"(unfortunately, it happens...) simply load the file you were working on, and "
+"you'll be given the\n"
+"option to load the autosaved version, or the unmodified original.</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:23
+msgid ""
+"<p>\n"
+"...that you can save the current document as your default studio by using\n"
+"<b>Composition -> Studio -> Save Current Document as Default Studio</b>?</"
+"p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:30
+msgid ""
+"<p>...that your default studio is a complete Rosegarden composition that "
+"gets\n"
+"loaded every time you create a new document or import a MIDI file?</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:36
+msgid ""
+"<p>...that your default studio can contain instrument assignments, document "
+"properties, LilyPond headers,\n"
+"and many other things?<br><br>The default studio is a complete Rosegarden "
+"composition, so it can contain anything that you may wish to have available "
+"in each\n"
+"new document you create.</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:43
+msgid ""
+"<p>...that Rosegarden will detect and create a default connection for ALSA "
+"soft\n"
+"synth applications that are started after Rosegarden is already running?</"
+"p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:49
+msgid ""
+"<p>...that you can make your default studio override that in every "
+"Rosegarden composition you load?<br><br>If your studio setup does not change "
+"very often, and you would prefer for\n"
+"the settings in your default studio to take precedence over whatever\n"
+"studio is saved with any files you happen to load, you can make your studio "
+"the default for everything using <b>Settings -> Configure Rosegarden ->\n"
+"MIDI -> Always use default studio when loading files</b>.</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:57
+msgid ""
+"<p>If you have accidentally recorded a segment so short that it does not\n"
+"appear on the canvas, which you can only hear during subsequent recording\n"
+"sessions, you can gain access to it by using <b>Composition -> Change\n"
+"Composition Start and End</b> and then setting the composition to start at a "
+"negative number.</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:65
+msgid ""
+"<p>...that if you place a note at the wrong pitch using the notation or "
+"matrix editor, you can move it one semitone at a time with the up and down "
+"arrow keys on your keyboard?</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:70
+msgid ""
+"<p>...that you can toggle stem directions in the notation editor by "
+"selecting\n"
+"one or more notes and using Ctrl-PageUp and Ctrl-PageDown?</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:76
+msgid ""
+"<p>...that you can change the accidental used for a note in the notation "
+"editor (without changing the pitch of the note) by selecting\n"
+"it and using the up and down arrow keys with both Ctrl and Shift pressed?</"
+"p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:82 ../docs/en/tips.cpp:93
+msgid ""
+"<p>...that you can hold down the Shift key while repositioning segments on "
+"the\n"
+"segment canvas in order to avoid the \"snap-to\" effect and exert finer "
+"control?</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:88
+msgid ""
+"<p>...that you can use the arrow tool to draw, move, and resize segments and "
+"events as well as to select them?<br><br>Drag a segment or event block to "
+"move it, drag the right edge of a block to resize it, and drag with the "
+"middle mouse button pressed to draw a new segment or event.<br><br>(Of "
+"course, the dedicated draw, move and resize tools are still quicker for "
+"repeated operations.)</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:99
+msgid ""
+"<p>...that you can hold down the Shift key while repositioning or resizing "
+"events in the\n"
+"matrix view in order to avoid the \"snap-to\" effect and exert finer control?"
+"</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:105
+msgid ""
+"<p>...that you can edit multiple segments on multiple tracks simultaneously "
+"in\n"
+"the notation editor? Simply select the segments, then use <b>Edit -> Open "
+"in Notation Editor</b>.</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:111
+msgid ""
+"<p>...that Rosegarden can export files for use by LilyPond, the high-quality "
+"score typesetting system?<br><br>\n"
+"From the <b>File</b> menu, navigate to <b>Export -> Export LilyPond File</"
+"b></p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:117
+msgid ""
+"<p>...that Rosegarden can print via LilyPond, the high-quality score "
+"typesetting system?<br><br>\n"
+"From the <b>File</b> menu, navigate to <b>Preview with LilyPond</b>. The "
+"file\n"
+"will be exported, rendered, and a preview will appear in KPDF, or one of\n"
+"several other PDF viewers, where it can then be printed as well.</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:125
+msgid ""
+"<p>...that if you use the quantizer from within the notation view, you can "
+"tell it to quantize only the timing used for notation -- making it possible "
+"to have good looking notation <b>and</b> a human MIDI performance?</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:130
+msgid ""
+"<p>...that you can change segment labels using the controls on the Segment "
+"Parameters box\n"
+"in the main window?</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:136
+msgid ""
+"<p>...that the number of tracks in new documents is based on the contents "
+"of\n"
+"your autoload.rg file?\n"
+"<br><br>\n"
+"Whether you prefer to start with three tracks or 43, create a document that\n"
+"contains the desired number of tracks, plus any other studio or document "
+"properties settings\n"
+"you wish to configure, and use <b>Composition -> Studio -> Save Current "
+"Document as Default\n"
+"Studio</b> to make this your new default.</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:147
+msgid ""
+"<p>...that you can change the name of a track by double clicking on the "
+"label? (The\n"
+"label must be visible for this to work.)</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:153
+msgid ""
+"<p>...that you can configure what happens when you double-click on a segment?"
+"<br><br>Go to <b>Settings -> Configure Rosegarden</b> and choose your "
+"preferred editing window under the <b>Behaviour</b> tab.</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:158
+msgid ""
+"<p>...that Rosegarden is being developed as a community effort with\n"
+"contributions from around the world?<br><br>\n"
+"The four most active developers live in London (England), Cannes, "
+"Barcelona,\n"
+"and... Christiansburg? (Christiansburg is a town of about 50,000 in\n"
+"southwestern Virginia, USA.)<br><br>\n"
+"We have had contributors from elsewhere in the US, UK, Spain, Mexico, "
+"Argentina, Germany,\n"
+"Sweden, Russia, Japan, Finland, and Italy, just to name a few...</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:169
+msgid ""
+"<p>...that Rosegarden is available in Spanish, French, German, Russian, "
+"Welsh, Swedish, Italian and Estonian\n"
+"translations? (Just to name a few.)<br><br>\n"
+"If you're interested in translating Rosegarden to another language, drop us "
+"a\n"
+"line at <b>[email protected]</b>.</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:177
+msgid ""
+"<p>...that you can change the total number of bars in the composition via\n"
+"<b>Composition -> Change Composition Start and End</b>?</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:183
+msgid ""
+"<p>...that you can see the difference between performance and display "
+"duration\n"
+"of duration-quantized notes in the notation editor?<br><br>\n"
+"Use <b>Settings -> Show Raw Note Ruler</b> to turn on this handy\n"
+"feature.<br><br>\n"
+"<i>Note that this feature does not work in page layout view.</i></p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:192
+msgid ""
+"<p>...that you can add tempo and time-signature changes by double-clicking "
+"on the values displayed in the transport window or tempo rulers?</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:197
+msgid ""
+"<p>...that the transport window can display musical time, sample frame "
+"count, and a visual metronome as well as real time?<br><br>Just click on the "
+"small button at the extreme top left of the window.</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:202
+msgid ""
+"<p>...that you can select all notes of a particular pitch in the matrix "
+"view, by shift-clicking on that pitch on the piano keyboard at the left?"
+"<br><br>If you shift-click-drag, you can select whole ranges too.</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:207
+msgid ""
+"<p>...that you can set a loop in the main window by clicking-and-dragging on "
+"the time ruler with Shift pressed?<br><br>(If the ruler isn't visible, use "
+"<b>Settings -> Show Rulers</b>.)</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:212
+msgid ""
+"<p>...that if you're editing a section in the matrix or notation view, you "
+"can\n"
+"set that section to loop while you edit it?<br><br>Select it and use "
+"<b>Tools ->\n"
+"Local Cursor -> Set Loop to Selection</b>, then hit Play.</p><br><br>\n"
+"<i>This feature does not work quite as well for compositions that include "
+"sampled\n"
+"audio.</i>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:221
+msgid ""
+"<p>...if you have more than one note or controller event at the same time, "
+"you\n"
+"can use the [ and ] keys to flip the stack of events around on the "
+"controller\n"
+"and velocity rulers in order to bring the item you wish to adjust into\n"
+"focus.</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:229
+msgid ""
+"<p>...that the notation view shows you notes using their display duration, "
+"while the\n"
+"matrix allows you to edit their performance duration?<br><br>\n"
+"<i>Be careful with tied notes in the matrix. It is not apparent that they "
+"are\n"
+"tied, and if you split up a pair of tied notes, subsequent notation views "
+"will\n"
+"be confused and unhappy. This is an old bug that has been on our TODO list\n"
+"for years. Sorry about that, folks. Patches welcome.</i>\n"
+"</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:240
+msgid ""
+"<p>If you're working with a human performance and you need to insert some "
+"new\n"
+"notes, these new notes will sound for their entire written duration. To "
+"blend\n"
+"these new notes into a human performance, select them, then use <b>Adjust -> "
+"Interpret...</b> \n"
+"from the notation view to interpret any marks and massage their "
+"performance\n"
+"durations to something less mechanical.</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:249
+msgid ""
+"<p>...that Rosegarden can export certain things to LilyPond that it cannot "
+"yet\n"
+"display within its own native interface?<br><br>These new directives can be "
+"inserted\n"
+"via the <b>T</b> text insert tool in the notation view.<br><br>\n"
+"Load the example files\n"
+"<b>lilypond-alternative-endings.rg</b> and <b>lilypond-directives.rg</b> for "
+"a\n"
+"demonstration of how to use the new exportable directives.<br><br>\n"
+"Use <b>File -> Preview with\n"
+"LilyPond</b> to see what they look like on the exported page.<br><br>\n"
+"<i>Be sure to turn on\n"
+"<b>Settings -> Show LilyPond Directives</b> and <b>Show Annotations</b> "
+"within\n"
+"the notation view.</i></p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:264
+msgid ""
+"<p>...that Rosegarden has track parameters allowing you to <b>Create "
+"segments with:</b> certain\n"
+"properties by default?<br><br>You can pre-select the clef, transposition, "
+"colour, and specify\n"
+"the highest and lowest playable notes (notes outside this range display in\n"
+"red by default). Then draw a segment with the pencil, or record one, and "
+"any\n"
+"new segments created on this track will take these properties as segment\n"
+"parameters.<br><br>\n"
+"<i>These parameters do not apply to audio tracks.</i></p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:275
+msgid ""
+"<p>...that Rosegarden has a database of preset parameters describing more "
+"than 300\n"
+"musical instruments from the real world, grouped into several convenient\n"
+"categories?<br><br>Each preset contains a clef, transposition, and playable "
+"range\n"
+"suggestions for both amateur and professional players.<br><br>Click the\n"
+"<b>Load</b> button in the new track parameters box to get started! <i>(If "
+"you\n"
+"do not see a <b>Load</b> button, be sure your parameter panel is set for\n"
+"tabbed mode, rather than stacked mode.)</i> <br><br> <i>(Special thanks to "
+"Magnus\n"
+"Johansson for assembling this extraordinary database.)</i></p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:287
+msgid ""
+"<p>...that when exporting to Lilypond, you can merge tracks that have the "
+"same name onto a single staff?<br><br>For example, if there are three voices "
+"in a single part, write each\n"
+"voice as an independent segment/staff, each on a separate track. Give all\n"
+"three tracks the same name, and select <b>[x] Merge tracks that have the "
+"same\n"
+"name</b> from the options dialog that appears when you export to, or "
+"preview\n"
+"with LilyPond.<br><br>\n"
+"<i>The tracks must have a non-default name for this to work.</i></p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:297
+msgid ""
+" \t \n"
+"<p>...that you can use the mouse wheel to scroll up and down, scroll left "
+"and right, and zoom in and out?<br><br>Just roll the wheel to scroll up or "
+"down. Hold Alt as well to scroll left or right, or hold Ctrl to zoom in and "
+"out.</p> \t \n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:303
+msgid ""
+" \t \n"
+"<p>...that you can time-stretch an audio segment -- stretching or squashing "
+"a\n"
+"sample to a different duration without changing its pitch -- just by\n"
+"dragging its right edge with the Ctrl key pressed?</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:311
+msgid ""
+" \t \n"
+"<p>...that you can add audio to your Rosegarden composition just by dragging "
+"an audio file from your file manager and dropping it on the Rosegarden "
+"segment canvas? (Make sure you drop it on an audio track!)<br><br>You can "
+"also drop audio files from Rosegarden's audio file manager window onto the "
+"segment canvas, and from other programs onto the audio file manager.</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:317
+msgid ""
+" \t \n"
+"<p>...that you can set the tempo to match the duration of an audio segment "
+"if you know it's an exact number of bars or beats long?<br><br>Just select "
+"the audio segment and use <b>Composition -> Tempo and Time Signature -> Set "
+"Tempo to Audio Segment Duration</b>.</p>\n"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:1
+msgid "Feta Pixmaps"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:2 ../data/fonts/mappings/fonts.cpp:7
+msgid "GNU Lilypond"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:3 ../data/fonts/mappings/fonts.cpp:8
+msgid "Copyright (c) 1997--2003 Han-Wen Nienhuys and Jan Nieuwenhuizen"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:4 ../data/fonts/mappings/fonts.cpp:9
+#: ../data/fonts/mappings/fonts.cpp:14 ../data/fonts/mappings/fonts.cpp:19
+#: ../data/fonts/mappings/fonts.cpp:24 ../data/fonts/mappings/fonts.cpp:29
+#: ../data/fonts/mappings/fonts.cpp:34 ../data/fonts/mappings/fonts.cpp:39
+#: ../data/fonts/mappings/fonts.cpp:44 ../data/fonts/mappings/fonts.cpp:49
+#: ../data/fonts/mappings/fonts.cpp:54
+msgid "Chris Cannam"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:5 ../data/fonts/mappings/fonts.cpp:40
+msgid "pixmap"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:6
+msgid "Feta"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:10 ../data/fonts/mappings/fonts.cpp:15
+#: ../data/fonts/mappings/fonts.cpp:20 ../data/fonts/mappings/fonts.cpp:25
+#: ../data/fonts/mappings/fonts.cpp:30 ../data/fonts/mappings/fonts.cpp:35
+#: ../data/fonts/mappings/fonts.cpp:45 ../data/fonts/mappings/fonts.cpp:50
+#: ../data/fonts/mappings/fonts.cpp:55
+msgid "scalable"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:11
+msgid "Fughetta"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:12
+msgid ""
+"Created by Blake Hodgetts; freely redistributable. See http://www.efn.org/"
+"~bch/aboutfonts.html"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:13
+msgid "Copyright 1995-1999 Blake Hodgetts"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:16
+msgid "Inkpen"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:17
+msgid "Inkpen is part of Sibelius, but other fonts may use the same mappings."
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:18 ../data/fonts/mappings/fonts.cpp:28
+msgid "Copyright Sibelius Software Ltd"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:21
+msgid "Maestro"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:22
+msgid "Maestro is part of Finale, but other fonts use the same mappings."
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:23 ../data/fonts/mappings/fonts.cpp:33
+msgid "Copyright Coda Inc"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:27
+msgid "Opus is part of Sibelius, but other fonts may use the same mappings."
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:31
+msgid "Petrucci"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:32
+msgid "Petrucci is part of Finale, but other fonts use the same mappings."
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:36
+msgid "RG21"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:37
+msgid "Rosegarden 2.1"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:38
+msgid "Copyright (c) 1994--2001 Chris Cannam"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:41
+msgid "Sonata"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:42
+msgid "Adobe"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:43
+msgid "Copyright Adobe Inc"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:46
+msgid "Steinberg"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:47
+msgid "The Steinberg Notation font is part of Cubase."
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:48
+msgid "Copyright Steinberg Inc"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:51
+msgid "Xinfonia"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:52
+msgid "xemo.org"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:53
+msgid "Copyright 2001-2003 Xemus Software LLC"
+msgstr ""
+
+#: ../data/styles/styles.cpp:1
+msgid "Classical"
+msgstr ""
+
+#: ../data/styles/styles.cpp:2
+msgid "Cross"
+msgstr ""
+
+#: ../data/styles/styles.cpp:3
+msgid "Mensural"
+msgstr ""
+
+#: ../data/styles/styles.cpp:4
+msgid "Triangle"
+msgstr ""
+
+#~ msgid "In a different color"
+#~ msgstr "In a different colour"
+
+#~ msgid "Write bar checks at end of measures"
+#~ msgstr "Write bar check at the end of each bar"
diff --git a/po/es.po b/po/es.po
new file mode 100644
index 0000000..810c8b0
--- /dev/null
+++ b/po/es.po
@@ -0,0 +1,11539 @@
+# translation of es.po to
+# This file is distributed under the same license as the PACKAGE package.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER.
+#
+# Pedro Lopez-Cabanillas <[email protected]>, 2003, 2004, 2007.
+# D. Michael McIntyre <[email protected]>, 2003, 2004, 2006.
+# Marcos Guglielmetti <[email protected]>, 2005.
+# D. Michael McIntyre <[email protected]>, 2008.
+msgid ""
+msgstr ""
+"Project-Id-Version: es\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-04-24 18:19-0400\n"
+"PO-Revision-Date: 2008-04-21 11:59-0400\n"
+"Last-Translator: D. Michael McIntyre <[email protected]>\n"
+"Language-Team: <[email protected]>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.4\n"
+
+#: ../src/gui/dialogs/RescaleDialog.cpp:51 rc.cpp:192 rc.cpp:312
+#, no-c-format
+msgid "Rescale"
+msgstr "Cambiar de escala"
+
+#: ../src/gui/dialogs/RescaleDialog.cpp:56
+msgid "Duration of selection"
+msgstr "Duración de la selección"
+
+#: ../src/gui/dialogs/RescaleDialog.cpp:62
+msgid "Adjust times of following events accordingly"
+msgstr ""
+"Ajustar los tiempos de los siguientes eventos sin crear superposiciones ni "
+"vacíos "
+
+#: ../src/gui/dialogs/PitchDialog.cpp:45
+#: ../src/gui/dialogs/RescaleDialog.cpp:72
+#: ../src/gui/dialogs/TimeDialog.cpp:51 ../src/gui/dialogs/TimeDialog.cpp:68
+#: ../src/gui/studio/BankEditorDialog.cpp:109
+msgid "Reset"
+msgstr "Reiniciar"
+
+#: ../src/commands/segment/SegmentSplitByPitchCommand.cpp:46
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:46
+msgid "Split by Pitch"
+msgstr "Dividir por tono"
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:54
+msgid "Starting split pitch"
+msgstr "Tono de inicio de división"
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:57
+msgid "Range up and down to follow music"
+msgstr "Rango superior e inferior para seguir la música"
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:63
+msgid "Duplicate non-note events"
+msgstr "Duplicar eventos distintos a notas"
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:66
+msgid "Clef handling:"
+msgstr "Gestión de claves:"
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:69
+msgid "Leave clefs alone"
+msgstr "Dejar las claves como están"
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:70
+msgid "Guess new clefs"
+msgstr "Adivinar nuevas claves"
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:71
+msgid "Use treble and bass clefs"
+msgstr "Usar claves de Soprano y Bajo"
+
+#: ../src/gui/dialogs/DocumentConfigureDialog.cpp:64
+msgid "Document Properties"
+msgstr "Propiedades del Documento"
+
+#: ../src/gui/dialogs/MakeOrnamentDialog.cpp:45
+#: ../src/gui/editors/notation/NotationView.cpp:6048
+msgid "Make Ornament"
+msgstr "Crear Ornamento"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:183
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:179
+#: ../src/gui/dialogs/EventEditDialog.cpp:128
+#: ../src/gui/dialogs/MakeOrnamentDialog.cpp:49
+#: ../src/gui/studio/DeviceEditorDialog.cpp:74
+#: ../src/gui/studio/NameSetEditor.cpp:72
+#: ../src/gui/widgets/ColourTable.cpp:51
+msgid "Name"
+msgstr "Nombre"
+
+#: ../src/gui/dialogs/MakeOrnamentDialog.cpp:51
+msgid ""
+"The name is used to identify both the ornament\n"
+"and the triggered segment that stores\n"
+"the ornament's notes."
+msgstr ""
+"El nombre se utiliza para identificar tanto el ornamento\n"
+"como el segmento activado que almacena\n"
+"las notas del ornamento."
+
+#: ../src/gui/dialogs/MakeOrnamentDialog.cpp:54
+msgid "Name: "
+msgstr "Nombre: "
+
+#: ../src/gui/dialogs/MakeOrnamentDialog.cpp:57
+#: ../src/gui/editors/eventlist/EventView.cpp:717
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:92
+msgid "Base pitch"
+msgstr "Altura base"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:57
+#: ../src/gui/editors/eventlist/EventView.cpp:140
+msgid "Text"
+msgstr "Texto"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:66
+msgid "Specification"
+msgstr "Especificación"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:68
+msgid "Preview"
+msgstr "Previsualización"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:72
+msgid "Text: "
+msgstr "Texto "
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:79
+msgid "Style: "
+msgstr "Estilo: "
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:90
+msgid "Dynamic"
+msgstr "Dinámica"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:93
+msgid "Direction"
+msgstr "Dirección"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:96
+msgid "Local Direction"
+msgstr "Dirección Local"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:63
+#: ../src/gui/dialogs/TextEventDialog.cpp:99
+#: ../src/gui/editors/tempo/TempoView.cpp:91
+msgid "Tempo"
+msgstr "Tempo"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:102
+msgid "Local Tempo"
+msgstr "Tempo Local"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:105
+msgid "Lyric"
+msgstr "Letra"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:108
+#: ../src/gui/editors/notation/NotationView.cpp:4242
+msgid "Chord"
+msgstr " Acorde"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:111
+msgid "Annotation"
+msgstr "Anotación"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:114
+msgid "LilyPond Directive"
+msgstr "Directriz para LilyPond"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:138
+msgid "Verse: "
+msgstr "Estrofa: "
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:148
+msgid "Dynamic: "
+msgstr "Dinámica: "
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:152
+msgid "ppp"
+msgstr "ppp"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:153
+msgid "pp"
+msgstr "pp"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:154
+msgid "p"
+msgstr "p"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:155
+msgid "mp"
+msgstr "mp"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:156
+msgid "mf"
+msgstr "mf"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:157
+msgid "f"
+msgstr "f"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:158
+msgid "ff"
+msgstr "ff"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:159
+msgid "fff"
+msgstr "fff"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:160
+msgid "rfz"
+msgstr "rfz"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:161
+msgid "sf"
+msgstr "sf"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:165
+msgid "Direction: "
+msgstr "Dirección:"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:174
+msgid " ,"
+msgstr " ,"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:175
+msgid "D.C. al Fine"
+msgstr "D.C. al Fine"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:176
+msgid "D.S. al Fine"
+msgstr "D.S. al Fine"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:177
+msgid "Fine"
+msgstr "Fine"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:178
+msgid "D.S. al Coda"
+msgstr "D.S. al Coda"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:179
+msgid "to Coda"
+msgstr "al Coda"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:180
+msgid "Coda"
+msgstr "Coda"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:184
+msgid "Local Direction: "
+msgstr "Dirección Local: "
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:188
+msgid "accel."
+msgstr "accel."
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:189
+msgid "ritard."
+msgstr "ritard."
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:190
+msgid "ralletando"
+msgstr "ralletando"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:191
+msgid "a tempo"
+msgstr "a tempo"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:192
+msgid "legato"
+msgstr "legato"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:193
+msgid "simile"
+msgstr "simile"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:194
+msgid "pizz."
+msgstr "pizz."
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:195
+msgid "arco"
+msgstr "arco"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:196
+msgid "non vib."
+msgstr "non vib."
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:197
+msgid "sul pont."
+msgstr "sul pont."
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:198
+#: ../src/gui/dialogs/TextEventDialog.cpp:200
+msgid "sul tasto"
+msgstr "sul tasto"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:199
+msgid "con legno"
+msgstr "con legno"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:201
+msgid "sul G"
+msgstr "sul G"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:202
+msgid "ordinario"
+msgstr "ordinario"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:203
+msgid "Muta in "
+msgstr "Muta in "
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:204
+msgid "volti subito "
+msgstr "volti subito "
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:205
+msgid "soli"
+msgstr "soli"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:206
+msgid "div."
+msgstr "div."
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:210
+msgid "Tempo: "
+msgstr "Tempo: "
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:214
+#: ../src/gui/dialogs/TextEventDialog.cpp:238
+msgid "Grave"
+msgstr "Grave"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:215
+#: ../src/gui/dialogs/TextEventDialog.cpp:239
+msgid "Adagio"
+msgstr "Adagio"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:216
+#: ../src/gui/dialogs/TextEventDialog.cpp:240
+msgid "Largo"
+msgstr "Largo"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:217
+#: ../src/gui/dialogs/TextEventDialog.cpp:241
+msgid "Lento"
+msgstr "Lento"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:218
+#: ../src/gui/dialogs/TextEventDialog.cpp:242
+msgid "Andante"
+msgstr "Andante"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:219
+#: ../src/gui/dialogs/TextEventDialog.cpp:243
+msgid "Moderato"
+msgstr "Moderato"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:220
+#: ../src/gui/dialogs/TextEventDialog.cpp:244
+msgid "Allegretto"
+msgstr "Allegretto"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:221
+#: ../src/gui/dialogs/TextEventDialog.cpp:245
+msgid "Allegro"
+msgstr "Allegro"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:222
+#: ../src/gui/dialogs/TextEventDialog.cpp:246
+msgid "Vivace"
+msgstr "Vivace"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:223
+#: ../src/gui/dialogs/TextEventDialog.cpp:247
+msgid "Presto"
+msgstr "Presto"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:224
+#: ../src/gui/dialogs/TextEventDialog.cpp:248
+msgid "Prestissimo"
+msgstr "Prestissimo"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:225
+#: ../src/gui/dialogs/TextEventDialog.cpp:249
+msgid "Maestoso"
+msgstr "Maestoso"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:226
+#: ../src/gui/dialogs/TextEventDialog.cpp:250
+msgid "Sostenuto"
+msgstr "Sostenuto"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:227
+#: ../src/gui/dialogs/TextEventDialog.cpp:251
+msgid "Tempo Primo"
+msgstr "Tempo Primo"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:234
+msgid "Local Tempo: "
+msgstr "Tempo Local: "
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:255
+msgid "Directive: "
+msgstr "Directriz: "
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:312
+msgid "Example"
+msgstr "Ejemplo"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:65
+msgid "Event Filter"
+msgstr "Filtro de Eventos"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:86
+msgid "Note Events"
+msgstr "Eventos de Nota"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:90
+msgid "lowest:"
+msgstr "inferior:"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:93
+msgid "highest:"
+msgstr "superior:"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:96
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:141
+#: ../src/gui/widgets/PitchChooser.cpp:53
+msgid "Pitch:"
+msgstr "Altura:"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:99
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:163
+msgid "Velocity:"
+msgstr "Velocidad:"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:102
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:129
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:257
+msgid "Duration:"
+msgstr "Duración:"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:107
+#: ../src/gui/dialogs/EventFilterDialog.cpp:114
+#: ../src/gui/dialogs/EventFilterDialog.cpp:121
+msgid "include"
+msgstr "incluir"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:108
+#: ../src/gui/dialogs/EventFilterDialog.cpp:115
+#: ../src/gui/dialogs/EventFilterDialog.cpp:122
+msgid "exclude"
+msgstr "excluir"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:136
+#: ../src/gui/dialogs/EventFilterDialog.cpp:155
+#: ../src/gui/editors/eventlist/EventView.cpp:172
+#: ../src/gui/editors/eventlist/EventView.cpp:179
+#: ../src/gui/editors/eventlist/EventView.cpp:186
+msgid "edit"
+msgstr "editar"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:141
+#: ../src/gui/dialogs/EventFilterDialog.cpp:157
+msgid "choose a pitch using a staff"
+msgstr "elegir una altura de nota usando un pentagrama"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:182
+#: ../src/gui/dialogs/EventFilterDialog.cpp:188
+msgid "longest"
+msgstr "más larga"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:200
+msgid "Include all"
+msgstr "Incluir todo"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:203
+msgid "Include entire range of values"
+msgstr "Incluir el rango de valores completo"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:206
+msgid "Exclude all"
+msgstr "Excluir todo"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:209
+msgid "Exclude entire range of values"
+msgstr "Excluir el rango de valores completo"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:233
+#: ../src/gui/dialogs/EventFilterDialog.cpp:234
+msgid "shortest"
+msgstr "más corta"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:333
+msgid "Lowest pitch"
+msgstr "Nota más grave"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:343
+msgid "Highest pitch"
+msgstr "Nota más aguda"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:56
+#: ../src/gui/editors/notation/NotationView.cpp:1619
+#: ../src/gui/editors/notation/NotationView.cpp:6088
+msgid "Use Ornament"
+msgstr "Usar Ornamento"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:260
+#: ../src/gui/configuration/NotationConfigurationPage.h:64
+#: ../src/gui/configuration/NotationConfigurationPage.h:65
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:63
+msgid "Notation"
+msgstr "Partitura"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:68
+msgid "Display as: "
+msgstr "Mostrar como: "
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:84
+msgid "Trill"
+msgstr "Trino"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:84
+msgid "Trill with line"
+msgstr "Trino con línea"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:84
+msgid "Trill line only"
+msgstr "Línea de trino sólamente"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:85
+msgid "Turn"
+msgstr "Grupeto"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:85
+msgid "Mordent"
+msgstr "Mordente"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:85
+msgid "Inverted mordent"
+msgstr "Mordente Invertido"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:86
+msgid "Long mordent"
+msgstr "Mordente largo"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:86
+msgid "Long inverted mordent"
+msgstr "Mordente largo invertido"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:94
+msgid "Text mark"
+msgstr "Marca de texto"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:98
+msgid " Text: "
+msgstr " Texto: "
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:104
+msgid "Performance"
+msgstr "Interpretación"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:109
+msgid "Perform using triggered segment: "
+msgstr "Interpretar usando segmento activado: "
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:75
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:123
+msgid "Perform with timing: "
+msgstr "Interpretar con tiempo: "
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:81
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:129
+msgid "As stored"
+msgstr "Como se almacenó"
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:82
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:130
+msgid "Truncate if longer than note"
+msgstr "Truncar si es más largo que la nota"
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:83
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:131
+msgid "End at same time as note"
+msgstr "Finalizar al mismo tiempo que la nota"
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:84
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:132
+msgid "Stretch or squash segment to note duration"
+msgstr "Estirar o comprimir el segmento a la duración de la nota"
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:86
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:134
+msgid "Adjust pitch to note"
+msgstr "Ajustar altura de nota"
+
+#: ../src/gui/dialogs/PitchPickerDialog.cpp:40
+msgid "Pitch Selector"
+msgstr "Selector de Altura de Nota"
+
+#: ../src/gui/dialogs/BeatsBarsDialog.cpp:44
+msgid "Audio Segment Duration"
+msgstr "Duración del Segmento de Audio"
+
+#: ../src/gui/dialogs/BeatsBarsDialog.cpp:50
+msgid "The selected audio segment contains:"
+msgstr "El segmento de audio seleccionado contiene:"
+
+#: ../src/gui/dialogs/BeatsBarsDialog.cpp:59
+msgid "beat(s)"
+msgstr "golpe(s)"
+
+#: ../src/gui/dialogs/BeatsBarsDialog.cpp:60
+msgid "bar(s)"
+msgstr "compas(es)"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:51
+msgid "Tuplet"
+msgstr "Grupo irregular"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:58
+msgid "New timing for tuplet group"
+msgstr "Nuevo tiempo para grupo irregular"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:76
+msgid "Play "
+msgstr "Ejecutar"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:98
+msgid "in the time of "
+msgstr "en el tiempo de "
+
+#: ../src/gui/dialogs/TupletDialog.cpp:104
+msgid "Timing is already correct: update display only"
+msgstr "El tiempo ya es correcto: actualizar sólo representación"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:114
+msgid "Timing calculations"
+msgstr "Calculos de tiempo"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:120
+msgid "Selected region:"
+msgstr "Región seleccionada:"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:129
+msgid "Group with current timing:"
+msgstr "Agrupar con el tiempo actual:"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:135
+msgid "Group with new timing:"
+msgstr "Agrupar con nuevo tiempo:"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:141
+msgid "Gap created by timing change:"
+msgstr "Hueco creado por cambio de tiempo:"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:149
+msgid "Unchanged at end of selection:"
+msgstr "Sin cambio al final de la selección:"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:63 rc.cpp:372
+#, no-c-format
+msgid "Metronome"
+msgstr "Metrónomo"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:77
+msgid "Metronome Instrument"
+msgstr "Instrumento del Metrónomo"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:82
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:150
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:183
+#: ../src/gui/studio/DeviceEditorDialog.cpp:73
+#: ../src/gui/studio/DeviceManagerDialog.cpp:105
+#: ../src/gui/studio/DeviceManagerDialog.cpp:163
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:66
+msgid "Device"
+msgstr "Dispositivo"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:101
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:89
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:215
+#: ../src/gui/studio/DeviceEditorDialog.cpp:195
+#: ../src/gui/studio/DeviceEditorDialog.cpp:218
+#: ../src/gui/studio/DeviceEditorDialog.cpp:230
+#: ../src/gui/studio/DeviceManagerDialog.cpp:196
+#: ../src/gui/studio/DeviceManagerDialog.cpp:440
+#: ../src/gui/studio/DeviceManagerDialog.cpp:452
+msgid "No connection"
+msgstr "Sin conexión"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:112
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:111
+#: ../src/gui/editors/parameters/InstrumentParameterBox.cpp:53
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:1209
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:159
+#: ../src/gui/general/PresetHandlerDialog.cpp:92
+#: ../src/gui/studio/MidiMixerWindow.cpp:204
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:67
+msgid "Instrument"
+msgstr "Instrumento"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:118
+msgid "Beats"
+msgstr "Golpes"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:184
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:123
+msgid "Resolution"
+msgstr "Resolución"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:309
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:139
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:205
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:125
+#: ../src/gui/editors/matrix/MatrixView.cpp:2132
+#: ../src/gui/editors/notation/NotationView.cpp:1582
+#: ../src/gui/widgets/QuantizeParameters.cpp:128
+#: ../src/gui/widgets/QuantizeParameters.cpp:301
+msgid "None"
+msgstr "Nada"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:126
+msgid "Bars only"
+msgstr "Compases sólamente"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:127
+msgid "Bars and beats"
+msgstr "Compases y partes"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:128
+msgid "Bars, beats, and divisions"
+msgstr "Compases, partes y divisiones"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:132
+msgid "Bar velocity"
+msgstr "Velocidad de Compás"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:139
+msgid "Beat velocity"
+msgstr "Velocidad de Parte"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:146
+msgid "Sub-beat velocity"
+msgstr "Velocidad de sub-parte"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:155
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:324
+msgid "Pitch"
+msgstr "Altura"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:160
+msgid "for Bar"
+msgstr "por cada Compás "
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:161
+msgid "for Beat"
+msgstr "por cada División"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:162
+msgid "for Sub-beat"
+msgstr "por cada Subdivisión"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:166
+msgid "Metronome Activated"
+msgstr "Metrónomo Activado"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:167
+msgid "Playing"
+msgstr "Tocando"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:168
+msgid "Recording"
+msgstr "Grabando"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:46
+msgid "Choose Text Encoding"
+msgstr "Seleccione un tipo de Codificación de Texto"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:50
+msgid ""
+"\n"
+"This file contains text in an unknown language encoding.\n"
+"\n"
+"Please select one of the following estimated text encodings\n"
+"for use with the text in this file:\n"
+msgstr ""
+"\n"
+"Este archivo contiene texto en un lenguaje de condificación desconocido.\n"
+"\n"
+"Por favor, seleccione una de las siguientes codificaciones de texto "
+"estimadas\n"
+"para usar con el texto en este archivo\n"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:61
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:77
+msgid "Japanese Shift-JIS"
+msgstr "Japanese Shift-JIS"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:62
+msgid "Unicode variable-width"
+msgstr "Unicode variable-width"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:63
+msgid "Western Europe"
+msgstr "Western Europe"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:64
+msgid "Western Europe + Euro"
+msgstr "Western Europe + Euro"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:65
+msgid "Eastern Europe"
+msgstr "Eastern Europe"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:66
+msgid "Southern Europe"
+msgstr "Southern Europe"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:67
+msgid "Northern Europe"
+msgstr "Northern Europe"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:68
+msgid "Cyrillic"
+msgstr "Cirílico"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:69
+msgid "Arabic"
+msgstr "Arabic"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:70
+msgid "Greek"
+msgstr "Greek"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:71
+msgid "Hebrew"
+msgstr "Hebrew"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:72
+msgid "Turkish"
+msgstr "Turkish"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:73
+msgid "Nordic"
+msgstr "Nordic"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:74
+msgid "Thai"
+msgstr "Thai"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:75
+msgid "Baltic"
+msgstr "Báltico"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:76
+msgid "Celtic"
+msgstr "Celtic"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:78
+msgid "Traditional Chinese"
+msgstr "Traditional Chinese"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:79
+msgid "Simplified Chinese"
+msgstr "Simplified Chinese"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:80
+msgid "Russian"
+msgstr "Russian"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:81
+msgid "Ukrainian"
+msgstr "Ukrainian"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:82
+msgid "Tamil"
+msgstr "Tamil"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:117
+#, c-format
+msgid "Microsoft Code Page %1"
+msgstr "Microsoft Code Page %1"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:123
+#: ../src/gui/editors/matrix/MatrixView.cpp:1490
+msgid "%1 (%2)"
+msgstr "%1 (%2)"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:142
+msgid ""
+"\n"
+"Example text from file:"
+msgstr ""
+"\n"
+"Ejemplo de texto perteneciente del archivo:"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:59
+#: ../src/gui/editors/tempo/TempoView.cpp:92
+msgid "Time Signature"
+msgstr "Medida del Compás"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:82
+msgid "Time signature"
+msgstr "Medida del compás"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:116
+msgid "Time where signature takes effect"
+msgstr "Tiempo donde hace efecto el cambio"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:83
+#: ../src/gui/dialogs/TempoDialog.cpp:128
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:129
+#: ../src/gui/general/PresetHandlerDialog.cpp:101
+msgid "Scope"
+msgstr "Ámbito"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:141
+#, c-format
+msgid "Insertion point is at start of measure %1."
+msgstr "El punto de inserción está al comienzo del compás %1"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:145
+#, c-format
+msgid "Insertion point is in the middle of measure %1."
+msgstr "El punto de inserción está en medio del compás %1."
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:150
+msgid "Insertion point is at start of composition."
+msgstr "El punto de inserción está al comienzo de la composición"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:155
+msgid "Start measure %1 here"
+msgstr "Iniciar compás %1 aquí"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:159
+#, c-format
+msgid "Change time from start of measure %1"
+msgstr "Cambiar tiempo desde el comienzo del compás %1"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:166
+#, c-format
+msgid "Time change will take effect at the start of measure %1."
+msgstr "El cambio de tiempo tendrá efecto al comienzo del compás %1."
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:176
+msgid "Hide the time signature"
+msgstr "Ocultar la medida del compás"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:181
+msgid "Hide the affected bar lines"
+msgstr "Ocultar las barras de compás afectadas"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:186
+msgid "Show as common time"
+msgstr "Mostrar como tiempo común"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:191
+msgid "Correct the durations of following measures"
+msgstr "Corregir la duración de los siguientes compases"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:280
+msgid "Display as common time"
+msgstr "Mostrar como tiempo común"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:284
+msgid "Display as cut common time"
+msgstr "Mostrar como tiempo común"
+
+#: ../src/gui/dialogs/ConfigureDialog.cpp:66
+msgid "Configure Rosegarden"
+msgstr "Configurar Rosegarden"
+
+#: ../src/gui/dialogs/MarkerModifyDialog.cpp:53
+#: ../src/gui/dialogs/MarkerModifyDialog.cpp:61
+msgid "Edit Marker"
+msgstr "Editar Marcador"
+
+#: ../src/gui/dialogs/MarkerModifyDialog.cpp:78
+msgid "Marker Time"
+msgstr "Tiempo del Marcador"
+
+#: ../src/gui/dialogs/MarkerModifyDialog.cpp:94
+msgid "Marker Properties"
+msgstr "Propiedades del Marcador"
+
+#: ../src/gui/dialogs/MarkerModifyDialog.cpp:100
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:554
+msgid "Text:"
+msgstr "Texto:"
+
+#: ../src/gui/dialogs/MarkerModifyDialog.cpp:104
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:85
+msgid "Description:"
+msgstr "Descripción:"
+
+#: ../src/gui/dialogs/FileMergeDialog.cpp:46
+msgid "Merge File"
+msgstr "Mezclar archivo"
+
+#: ../src/gui/dialogs/FileMergeDialog.cpp:53
+msgid "Merge new file "
+msgstr "Mezclar nuevo Archivo "
+
+#: ../src/gui/dialogs/FileMergeDialog.cpp:56
+msgid "At start of existing composition"
+msgstr "Al comienzo de una composición existente"
+
+#: ../src/gui/dialogs/FileMergeDialog.cpp:57
+msgid "From end of existing composition"
+msgstr "Desde el final de una composición existente"
+
+#: ../src/gui/dialogs/FileMergeDialog.cpp:61
+msgid "The file has different time signatures or tempos."
+msgstr "El archivo tiene diferentes medidas de compás o tempos."
+
+#: ../src/gui/dialogs/FileMergeDialog.cpp:62
+msgid "Import these as well"
+msgstr "Importar estos también"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:171
+#: ../src/gui/dialogs/ShowSequencerStatusDialog.cpp:44
+msgid "Sequencer status"
+msgstr "Estado del Secuenciador"
+
+#: ../src/gui/dialogs/ShowSequencerStatusDialog.cpp:48
+msgid "Sequencer status:"
+msgstr "Estado del Secuenciador:"
+
+#: ../src/gui/dialogs/ShowSequencerStatusDialog.cpp:50
+msgid "Status not available."
+msgstr "Estado no disponible."
+
+#: ../src/gui/dialogs/ShowSequencerStatusDialog.cpp:57
+msgid "Sequencer is not running or is not responding."
+msgstr "El Secuenciador no está corriendo o no responde."
+
+#: ../src/gui/dialogs/ShowSequencerStatusDialog.cpp:64
+msgid "Sequencer is not returning a valid status report."
+msgstr "El Secuenciador no devuelve un informe de estado válido."
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:46
+msgid "Add Tracks"
+msgstr "Añadir &Pistas"
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:54
+msgid "How many tracks do you want to add?"
+msgstr "¿Cuántas pistas desea añadir?"
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:62
+msgid "Add tracks"
+msgstr "añadir pistas"
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:64
+msgid "At the top"
+msgstr "Hacia arriba"
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:65
+msgid "Above the current selected track"
+msgstr "Arriba de la pista actual"
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:66
+msgid "Below the current selected track"
+msgstr "Abajo de la pista actual"
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:67
+msgid "At the bottom"
+msgstr "Al fondo"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:75
+msgid "Event Properties"
+msgstr "Propiedades del Evento"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:81
+msgid "Event type:"
+msgstr "Tipo de Evento"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:117
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:251
+#: ../src/gui/editors/segment/MarkerEditor.cpp:97
+msgid "Absolute time:"
+msgstr "Tiempo absoluto:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:156
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:323
+msgid "Controller name:"
+msgstr "Nombre del Controlador:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:157
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:530
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:562
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:563
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:602
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:631
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:267
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:269
+#: ../src/gui/editors/segment/MarkerEditor.cpp:279
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:272
+#: ../src/gui/studio/AudioMixerWindow.cpp:388
+#: ../src/gui/studio/AudioMixerWindow.cpp:519
+#: ../src/gui/studio/AudioMixerWindow.cpp:683
+#: ../src/gui/studio/AudioMixerWindow.cpp:722
+#: ../src/gui/studio/AudioMixerWindow.cpp:904
+#: ../src/gui/studio/SynthPluginManagerDialog.cpp:121
+msgid "<none>"
+msgstr "<nada>"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:174
+msgid "Meta string:"
+msgstr "Cadena Meta:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:179
+msgid "Load data"
+msgstr "Cargar datos"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:181
+msgid "Save data"
+msgstr "Guardar datos"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:192
+msgid "Notation Properties"
+msgstr "Propiedades de edición de partitura"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:198
+msgid "Lock to changes in performed values"
+msgstr "Atenerse a cambios en los valores interpretados"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:205
+msgid "Notation time:"
+msgstr "Tiempo de notación:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:217
+msgid "Notation duration:"
+msgstr "Duración de notación:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:283
+msgid "Note pitch:"
+msgstr "Altura de Nota:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:291
+msgid "Note velocity:"
+msgstr "Velocidad de Nota:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:317
+msgid "Controller number:"
+msgstr "Número de Controlador:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:326
+msgid "Controller value:"
+msgstr "Valor de Controlador:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:354
+msgid "Key pitch:"
+msgstr "Altura de Nota:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:362
+msgid "Key pressure:"
+msgstr "Presión de Tecla:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:390
+msgid "Channel pressure:"
+msgstr "Presión de Canal:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:418
+msgid "Program change:"
+msgstr "Cambio de Programa:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:461
+msgid "Data length:"
+msgstr "Tamaño de Datos:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:462
+msgid "Data:"
+msgstr "Datos:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:480
+msgid "Pitchbend MSB:"
+msgstr "Inflexión de Tono MSB:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:488
+msgid "Pitchbend LSB:"
+msgstr "Inflexión de Tono LSB:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:523
+msgid "Indication:"
+msgstr "Indicación:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:553
+msgid "Text type:"
+msgstr "Tipo de Texto:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:596
+msgid "Clef type:"
+msgstr "Tipo de Clave:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:625
+msgid "Key name:"
+msgstr "Nombre de clave:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:674
+msgid "Unsupported event type:"
+msgstr "Tipo de evento no soportado:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:931
+msgid "Edit Event Time"
+msgstr "Editar Tiempo del Evento"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:943
+msgid "Edit Event Notation Time"
+msgstr "Editar Tiempo de Notación del Evento"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:955
+msgid "Edit Duration"
+msgstr "Editar Duración"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:968
+msgid "Edit Notation Duration"
+msgstr "Editar Duración de Notación"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:981
+msgid "Edit Pitch"
+msgstr "Editar Altura"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:991
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:1016
+msgid "*.syx|System exclusive files (*.syx)"
+msgstr "*.syx|Archivos de Sistema Exclusivo (*.syx)"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:992
+msgid "Load System Exclusive data in File"
+msgstr "Cargar datos de Sistema Exclusivo en el Archivo"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:1017
+msgid "Save System Exclusive data to..."
+msgstr "Guardar datos de Sistema Exclusivo a..."
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:46
+msgid "Locate audio file"
+msgstr "Buscar archivo de audio"
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:50
+msgid "&Skip"
+msgstr "&Saltar"
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:51
+msgid "Skip &All"
+msgstr "S&altar todo"
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:52
+msgid "&Locate"
+msgstr "&Localizar"
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:57
+msgid ""
+"Can't find file \"%1\".\n"
+"Would you like to try and locate this file or skip it?"
+msgstr ""
+"No se puede encontrar el archivo \"%1\".\n"
+"¿Quiere intentar buscar y localizar este archivo o saltarlo?"
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:71
+msgid ""
+"%1|Requested file (%2)\n"
+"*.wav|WAV files (*.wav)"
+msgstr ""
+"%1|Archivo solicitado (%2)\n"
+"*.wav|archivos WAV (*.wav) "
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:74
+msgid "Select an Audio File"
+msgstr "Seleccionar un Archivo de Audio"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:53 ../src/gui/dialogs/ClefDialog.cpp:62
+#: ../src/gui/dialogs/ClefDialog.cpp:79 ../src/gui/dialogs/ClefDialog.cpp:90
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:278
+msgid "Clef"
+msgstr "Clave"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:65
+msgid "Existing notes following clef change"
+msgstr "Existen notas a continuación del cambio de clave"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:71
+msgid "Lower clef"
+msgstr "Clave más grave"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:77
+msgid "Up an Octave"
+msgstr "Subir una Octava"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:84
+msgid "Down an Octave"
+msgstr "Bajar una Octava"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:88
+msgid "Higher clef"
+msgstr "Clave más aguda"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:96
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:152
+msgid "Maintain current pitches"
+msgstr "Mantener los tonos actuales"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:99
+msgid "Transpose into appropriate octave"
+msgstr "Transporte a la octava apropiada"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:231
+msgid "%1 down an octave"
+msgstr "%1 una octava inferior"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:234
+msgid "%1 down two octaves"
+msgstr "%1 dos octavas abajo"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:237
+msgid "%1 up an octave"
+msgstr "%1 una octava superior"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:240
+msgid "%1 up two octaves"
+msgstr "%1 dos octabas arriba"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:249
+msgid "Treble"
+msgstr "Soprano"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:251
+msgid "French violin"
+msgstr "Violín francés"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:253
+msgid "Soprano"
+msgstr "Soprano"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:255
+msgid "Mezzo-soprano"
+msgstr "Mezzo soprano"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:257
+msgid "Alto"
+msgstr "Alto"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:259
+msgid "Tenor"
+msgstr "Tenor"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:261
+msgid "C-baritone"
+msgstr "Do barítono"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:263
+msgid "F-baritone"
+msgstr "Fa barítono"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:265
+msgid "Bass"
+msgstr "Bajo"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:267
+msgid "Sub-bass"
+msgstr "Sub-bajo"
+
+#: ../src/gui/dialogs/CountdownDialog.cpp:52
+msgid "Recording..."
+msgstr "Grabando..."
+
+#: ../src/gui/dialogs/CountdownDialog.cpp:60
+msgid "Recording time remaining: "
+msgstr "Tiempo restante de grabación: "
+
+#: ../src/gui/dialogs/CountdownDialog.cpp:120
+msgid "Just how big is your hard disk?"
+msgstr "¿Cómo es de grande su disco duro?"
+
+#: ../src/gui/dialogs/CountdownDialog.cpp:154
+msgid "Recording beyond end of composition: "
+msgstr "Aumentando la composición:"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:52
+msgid "Specify Interval"
+msgstr "Especificar intervalo"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:58
+msgid "Reference note:"
+msgstr "Nota de referencia:"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:59
+msgid "Target note:"
+msgstr "Nota objetivo:"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:68
+#: ../src/gui/dialogs/IntervalDialog.cpp:315
+msgid "a perfect unison"
+msgstr "unísono perfecto"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:76
+msgid "Effect on Key"
+msgstr "Efecto sobre la clave"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:77
+msgid "Transpose within key"
+msgstr "Trasportar dentro de la clave"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:79
+msgid "Change key for selection"
+msgstr "Cambio de clave para la selección"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:89
+msgid ""
+"Adjust segment transposition in opposite direction (maintain audible pitch)"
+msgstr ""
+"Ajustar transposición del segmento en sentido opuesto (mantener tono audible)"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:190
+#: ../src/gui/dialogs/IntervalDialog.cpp:220
+msgid "a diminished"
+msgstr "disminuida"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:192
+#: ../src/gui/dialogs/IntervalDialog.cpp:222
+msgid "an augmented"
+msgstr "aumentada"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:194
+#: ../src/gui/dialogs/IntervalDialog.cpp:224
+msgid "a doubly diminished"
+msgstr "doble disminuida"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:196
+#: ../src/gui/dialogs/IntervalDialog.cpp:226
+msgid "a doubly augmented"
+msgstr "doble aumentada"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:198
+#: ../src/gui/dialogs/IntervalDialog.cpp:228
+msgid "a triply diminished"
+msgstr "triple disminuida"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:200
+#: ../src/gui/dialogs/IntervalDialog.cpp:230
+msgid "a triply augmented"
+msgstr "triple aumentada"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:202
+msgid "a quadruply diminished"
+msgstr "cuádruple disminuida"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:204
+#: ../src/gui/dialogs/IntervalDialog.cpp:232
+msgid "a quadruply augmented"
+msgstr "cuádruple aumentada"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:206
+#: ../src/gui/dialogs/IntervalDialog.cpp:234
+msgid "a perfect"
+msgstr "perfecta"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:208
+#: ../src/gui/dialogs/IntervalDialog.cpp:236
+msgid "an (unknown, %1)"
+msgstr "(desconocida, %1)"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:216
+msgid "a minor"
+msgstr "menor"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:218
+msgid "a major"
+msgstr "mayor"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:239
+msgid "an (unknown)"
+msgstr "(desconocida)"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:248
+#: ../src/gui/dialogs/IntervalDialog.cpp:251
+msgid "%1 octave"
+msgstr "una octava %1"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:254
+msgid "%1 unison"
+msgstr "unísono %1"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:258
+msgid "%1 second"
+msgstr "una segunda %1"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:261
+msgid "%1 third"
+msgstr "una tercera %1"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:264
+msgid "%1 fourth"
+msgstr "una cuarta %1"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:267
+msgid "%1 fifth"
+msgstr "una quinta %1"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:270
+msgid "%1 sixth"
+msgstr "una sexta %1"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:273
+msgid "%1 seventh"
+msgstr "una séptima %1"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:276
+#: ../src/gui/studio/DeviceManagerDialog.cpp:329
+#: ../src/gui/studio/DeviceManagerDialog.cpp:363
+#, c-format
+msgid "%1"
+msgstr "%1"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:287
+msgid ""
+"_n: up 1 octave and %1\n"
+"up %n octaves and %1"
+msgstr ""
+"1 octava y %1 ascendente\n"
+"%n octavas y %1 ascendente"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:291
+#, c-format
+msgid ""
+"_n: up 1 octave\n"
+"up %n octaves"
+msgstr ""
+"1 octava ascendente\n"
+"%n octavas ascendentes"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:295
+#, c-format
+msgid "up %1"
+msgstr "%1 ascendente"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:303
+msgid ""
+"_n: down 1 octave and %1\n"
+"down %n octaves and %1"
+msgstr ""
+" 1 octava y %1 descendente\n"
+"%n octavas y %1 descendente"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:307
+#, c-format
+msgid ""
+"_n: down 1 octave\n"
+"down %n octaves"
+msgstr ""
+"1 octava descendente\n"
+"%n octavas descendentes"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:311
+#, c-format
+msgid "down %1"
+msgstr "%1 descendente"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:81
+msgid "Intrinsics"
+msgstr "Intrínsecas"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:85
+msgid "Event type: "
+msgstr "Tipo de Evento"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:91
+msgid "Absolute time: "
+msgstr "Tiempo absoluto: "
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:101
+msgid "Duration: "
+msgstr "Duración: "
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:114
+msgid "Sub-ordering: "
+msgstr "Sub-ordenación: "
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:125
+msgid "Persistent properties"
+msgstr "Propiedades persistentes"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:169
+#: ../src/gui/dialogs/EventEditDialog.cpp:133
+#: ../src/gui/studio/BankEditorDialog.cpp:129
+#: ../src/gui/studio/DeviceEditorDialog.cpp:75
+msgid "Type"
+msgstr "Tipo"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:184
+#: ../src/gui/dialogs/EventEditDialog.cpp:135
+#: ../src/gui/dialogs/EventParameterDialog.cpp:89
+#: ../src/gui/dialogs/EventParameterDialog.cpp:93
+#: ../src/gui/dialogs/EventParameterDialog.cpp:115
+msgid "Value"
+msgstr "Valor"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:155
+msgid "Non-persistent properties"
+msgstr "Propiedades no persistentes"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:156
+msgid "These are cached values, lost if the event is modified."
+msgstr "Estos valores están en caché, y se perderán al modificar el evento"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:170
+msgid "Name "
+msgstr "Nombre "
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:172
+msgid "Type "
+msgstr "Tipo "
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:174
+msgid "Value "
+msgstr "Valor "
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:188
+msgid "Make persistent"
+msgstr "Hacer persistente"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:292
+msgid "Delete this property"
+msgstr "Borrar esta propiedad"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:433
+msgid ""
+"Are you sure you want to delete the \"%1\" property?\n"
+"\n"
+"Removing necessary properties may cause unexpected behavior."
+msgstr ""
+"¿Está usted. seguro de querer borrar la propiedad \"%1\"?\n"
+"\n"
+"Eliminar propiedades necesarias puede causar un comportamiento inesperado."
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:436
+#: ../src/gui/dialogs/EventEditDialog.cpp:469
+msgid "Edit Event"
+msgstr "Editar Evento"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:465
+msgid ""
+"Are you sure you want to make the \"%1\" property persistent?\n"
+"\n"
+"This could cause problems if it overrides a different computed value later "
+"on."
+msgstr ""
+"Está usted seguro de querer hacer persistente la propiedad \"%1\"?\n"
+"\n"
+"Esto puede causar problemas si se sobreescribe más adelante con un valor "
+"calculado diferente."
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:470
+msgid "Make &Persistent"
+msgstr "Hacer &Persistente"
+
+#: ../src/gui/dialogs/PasteNotationDialog.cpp:52
+msgid "Paste type"
+msgstr "Pegar tipo"
+
+#: ../src/gui/dialogs/PasteNotationDialog.cpp:72
+msgid "Make this the default paste type"
+msgstr "Hacer este el tipo predeterminado de pegada"
+
+#: ../src/gui/dialogs/LyricEditDialog.cpp:53
+msgid "Edit Lyrics"
+msgstr "Editar letra"
+
+#: ../src/gui/dialogs/LyricEditDialog.cpp:62
+msgid "Lyrics for this segment"
+msgstr "Letra para este segmento"
+
+#: ../src/gui/dialogs/LyricEditDialog.cpp:70
+msgid "Add Verse"
+msgstr "Añadir Estrofa"
+
+#: ../src/gui/dialogs/LyricEditDialog.cpp:84
+#: ../src/gui/dialogs/LyricEditDialog.cpp:106
+#, c-format
+msgid "Verse %1"
+msgstr "Estrofa %1"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:59
+msgid "Import from Device..."
+msgstr "Importar desde el Dispositivo..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2163
+#: ../src/gui/application/RosegardenGUIApp.cpp:2229
+#: ../src/gui/application/RosegardenGUIApp.cpp:7780
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:87
+#: ../src/sound/AudioFileManager.cpp:664
+#, c-format
+msgid "Cannot download file %1"
+msgstr "No puedo descargar archivo %1"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:99
+#, c-format
+msgid "Cannot open file %1"
+msgstr "No se puede abrir el archivo %1"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:106
+#, c-format
+msgid "No devices found in file %1"
+msgstr "No hay dispositivos en el archivo %1"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:113
+msgid "Source device"
+msgstr "Dispositivo origen"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:118
+msgid "Import from: "
+msgstr "Importar desde: "
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:140
+#: ../src/gui/studio/DeviceEditorDialog.cpp:148
+#, c-format
+msgid "Device %1"
+msgstr "Dispositivo %1"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:155
+msgid "Import banks"
+msgstr "Importar bancos"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:156
+msgid "Import key mappings"
+msgstr "Importar mapas de teclado"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:157
+msgid "Import controllers"
+msgstr "Importar controladores"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:160
+msgid "Import device name"
+msgstr "Nombre de dispositivo importado"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:166
+msgid "Bank import behavior"
+msgstr "Comportamiento de importación de bancos "
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:168
+msgid "Merge banks"
+msgstr "Mezclar bancos"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:169
+msgid "Overwrite banks"
+msgstr "Sobreescribir bancos"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:367
+msgid "Bank %1:%2"
+msgstr "Banco %1 %2"
+
+#: ../src/commands/segment/SegmentSplitByRecordingSrcCommand.cpp:42
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:48
+msgid "Split by Recording Source"
+msgstr "Dividir según la fuente de grabación"
+
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:53
+msgid "Recording Source"
+msgstr "Fuente de grabación"
+
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:57
+msgid "Channel:"
+msgstr "Canal:"
+
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:64
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:75
+msgid "any"
+msgstr "(cualquiera) "
+
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:69
+msgid "Device:"
+msgstr "Dispositivo "
+
+#: ../src/gui/dialogs/UnusedAudioSelectionDialog.cpp:46
+msgid "Select Unused Audio Files"
+msgstr "Seleccionar Archivo de Audio no Usados"
+
+#: ../src/gui/dialogs/UnusedAudioSelectionDialog.cpp:53
+#: ../src/gui/editors/segment/PlayListView.cpp:36
+msgid "File name"
+msgstr "Nombre de archivo"
+
+#: ../src/gui/dialogs/UnusedAudioSelectionDialog.cpp:54
+msgid "File size"
+msgstr "Tamaño del archivo"
+
+#: ../src/gui/dialogs/UnusedAudioSelectionDialog.cpp:55
+msgid "Last modified date"
+msgstr "Fecha de última modificación"
+
+#: ../src/gui/dialogs/UnusedAudioSelectionDialog.cpp:60
+msgid " (not found) "
+msgstr "(no encontrado)"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:105
+msgid "Audio File Manager"
+msgstr "Gestor de Archivos de Audio"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:126
+msgid ""
+"* Some audio files are encoded at a sample rate different from that of the "
+"JACK audio server.\n"
+"Rosegarden will play them at the correct speed, but they will sound "
+"terrible.\n"
+"Please consider resampling such files externally, or adjusting the sample "
+"rate of the JACK server."
+msgstr ""
+"* Algunos archivos de audio están codificados en un muestreo diferente al de "
+"el servidor de audio JACK.\n"
+"Rosegarden los reproducirá en la velocidad correcta, pero sonarán "
+"terriblemente mal.\n"
+"Por favor, considere resamplear estos archivos externamente, o ajustar el "
+"muestreo del servidor de audio JACK."
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:132
+msgid "&Add Audio File..."
+msgstr "&Añadir archivo de audio "
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:135
+msgid "&Unload Audio File"
+msgstr "&Descargar Archivo de Audio"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:140
+msgid "&Play Preview"
+msgstr "Reproducción &Preliminar"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:151
+msgid "&Insert into Selected Audio Track"
+msgstr "&Insertar en la Pista de Audio Seleccionada"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:155
+msgid "Unload &all Audio Files"
+msgstr "Descargar todos los &archivos de Audio"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:159
+msgid "Unload all &Unused Audio Files"
+msgstr "Descargar todos los &archivos de Audio no usados"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:163
+msgid "&Delete Unused Audio Files..."
+msgstr "Borrar todos los &archivos de Audio no usados"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:167
+msgid "&Export Audio File..."
+msgstr "&Exportar Archivo de Audio "
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:173
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:180
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:91
+msgid "Duration"
+msgstr "Duración"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:181
+msgid "Envelope"
+msgstr "Envolvente"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:182
+msgid "Sample rate"
+msgstr "Frecuencia de muestreo"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:183
+msgid "Channels"
+msgstr "Canales"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:282
+msgid "<no audio files>"
+msgstr "<sin archivos de audio>"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:488
+msgid "*.wav|WAV files (*.wav)"
+msgstr "*.wav|archivos WAV (*.wav)"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:489
+msgid "Choose a name to save this file as"
+msgstr "Escoja un nombre para guardar este archivo"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:499
+msgid "Exporting audio file..."
+msgstr "Exportando archivo de audio..."
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:609
+msgid ""
+"This will unload audio file \"%1\" and remove all associated segments. Are "
+"you sure?"
+msgstr ""
+"Se va a descargar el archivo de audio \"%1\" y se borrarán todos los "
+"segmentos asociados. ¿Está seguro?"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:692
+msgid ""
+"*.wav|WAV files (*.wav)\n"
+"*.*|All files"
+msgstr ""
+"*.wav|archivos WAV (*.wav)\n"
+"*.*|Todos los archivos"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:697
+msgid ""
+"*.wav *.flac *.ogg *.mp3|Audio files (*.wav *.flac *.ogg *.mp3)\n"
+"*.wav|WAV files (*.wav)\n"
+"*.flac|FLAC files (*.flac)\n"
+"*.ogg|Ogg files (*.ogg)\n"
+"*.mp3|MP3 files (*.mp3)\n"
+"*.*|All files"
+msgstr ""
+"*.wav *.flac *.ogg *.mp3|Archivos de audio (*.wav *.flac *.ogg *.mp3)\n"
+"*.wav|Archivos WAV (*.wav)\n"
+"*.flac|Archivos FLAC (*.flac)\n"
+"*.ogg|Archivos Ogg (*.ogg)\n"
+"*.mp3|Archivos MP3 (*.mp3)\n"
+"*.*|Todos los archivos"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:704
+msgid "Select one or more audio files"
+msgstr "Seleccionar uno o más archivos de audio"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:763
+msgid ""
+"This will unload all audio files and remove their associated segments.\n"
+"This action cannot be undone, and associations with these files will be "
+"lost.\n"
+"Files will not be removed from your disk.\n"
+"Are you sure?"
+msgstr ""
+"Esto descargará todos los archivos de audio que no estén asociados con "
+"segmento alguno dentro de esta composición. Esta acción no puede ser "
+"deshecha, y las asociaciones con esos archivos serán perdidas. Los archivos "
+"no serán removidos de su disco.\n"
+"¿Está usted seguro?"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:800
+msgid ""
+"This will unload all audio files that are not associated with any segments "
+"in this composition.\n"
+"This action cannot be undone, and associations with these files will be "
+"lost.\n"
+"Files will not be removed from your disk.\n"
+"Are you sure?"
+msgstr ""
+"Esto descargará todos los archivos de audio que no estén asociados con "
+"segmento alguno dentro de esta composición. Esta acción no puede ser "
+"deshecha, y las asociaciones con esos archivos serán perdidas. Los archivos "
+"no serán removidos de su disco.\n"
+"¿Está usted seguro?"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:865
+msgid ""
+"The following audio files are not used in the current composition.\n"
+"\n"
+"Please select the ones you wish to delete permanently from the hard disk.\n"
+msgstr ""
+"Los siguientes archivos de audio no son utilizados en la composición "
+"actual.\n"
+"\n"
+"Por favor, seleccione cuáles de ellos quiere borrar permanentemente del "
+"disco duro.\n"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:875
+#, c-format
+msgid ""
+"_n: <qt>About to delete 1 audio file permanently from the hard disk.<br>This "
+"action cannot be undone, and there will be no way to recover this file."
+"<br>Are you sure?</qt>\n"
+"\n"
+"<qt>About to delete %n audio files permanently from the hard disk.<br>This "
+"action cannot be undone, and there will be no way to recover these files."
+"<br>Are you sure?</qt>"
+msgstr ""
+"_n:<qt>Se borrará un archivo de audio del disco duro de modo permanente."
+"<br>Esta acción no se puede deshacer y no habrá modo de recuperar este "
+"archivo.<br>¿Está seguro?</qt>\n"
+"\n"
+"<qt>Se borrarán %n archivos de audio del disco duro de modo permanente."
+"<br>Esta acción no se puede deshacer y no habrá modo de recuperar estos "
+"archivos.<br>¿Está seguro?</qt> "
+
+#: ../src/document/RosegardenGUIDoc.cpp:525
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:888
+msgid "File %1 could not be deleted."
+msgstr "El archivo %1 no pudo ser borrado"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:921
+msgid "Change Audio File label"
+msgstr "Cambiar etiqueta del archivo de audio"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:6466
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:922
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:1099
+msgid "Enter new label"
+msgstr "Introducir nueva etiqueta"
+
+#: ../src/gui/application/RosegardenGUIView.cpp:1538
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:1086
+msgid "Adding audio file..."
+msgstr "Añadiendo archivo de audio..."
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:1107
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:1112
+msgid "Failed to add audio file. "
+msgstr "Fallo al añadir archivo de audio "
+
+#: ../src/document/RosegardenGUIDoc.cpp:2789
+#: ../src/gui/application/RosegardenGUIApp.cpp:2736
+#: ../src/gui/application/RosegardenGUIView.cpp:1574
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:1122
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:180
+msgid "Generating audio preview..."
+msgstr "Generando vista preliminar.de audio"
+
+#: ../src/gui/application/RosegardenGUIView.cpp:1581
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:1130
+msgid ""
+"Try copying this file to a directory where you have write permission and re-"
+"add it"
+msgstr ""
+"Intente copiar este archivo a un directorio en el que tenga permiso de "
+"escritura y vuelva a añadirlo"
+
+#: ../src/gui/dialogs/TransportDialog.cpp:90 rc.cpp:357
+#, no-c-format
+msgid "Rosegarden Transport"
+msgstr "Transporte de Rosegarden"
+
+#: ../src/gui/dialogs/TransportDialog.cpp:925
+#: ../src/gui/dialogs/TransportDialog.cpp:985
+msgid "PITCH WHEEL"
+msgstr "RUEDA TONAL"
+
+#: ../src/gui/dialogs/TransportDialog.cpp:929
+#: ../src/gui/dialogs/TransportDialog.cpp:989
+msgid "CONTROLLER"
+msgstr "CONTROL"
+
+#: ../src/gui/dialogs/TransportDialog.cpp:933
+#: ../src/gui/dialogs/TransportDialog.cpp:993
+msgid "PROG CHNGE"
+msgstr "CAMBIO DE PR."
+
+#: ../src/gui/dialogs/TransportDialog.cpp:938
+#: ../src/gui/dialogs/TransportDialog.cpp:998
+msgid "PRESSURE"
+msgstr "PRESIÓN"
+
+#: ../src/gui/dialogs/TransportDialog.cpp:942
+#: ../src/gui/dialogs/TransportDialog.cpp:1002
+msgid "SYS MESSAGE"
+msgstr "MENSAJE SIST."
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:177
+#: ../src/gui/dialogs/QuantizeDialog.cpp:40
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:127
+msgid "Quantize"
+msgstr "Cuantificación"
+
+#: ../src/gui/dialogs/QuantizeDialog.cpp:52
+msgid "Advanced"
+msgstr "Avanzado"
+
+#: ../src/gui/dialogs/ExportDeviceDialog.cpp:42
+msgid "Export Devices..."
+msgstr "Exportar Dispositivos..."
+
+#: ../src/gui/dialogs/ExportDeviceDialog.cpp:47
+msgid "Export devices"
+msgstr "Exportar dispositivos"
+
+#: ../src/gui/dialogs/ExportDeviceDialog.cpp:49
+msgid "Export all devices"
+msgstr "Exportar todos los dispositivos"
+
+#: ../src/gui/dialogs/ExportDeviceDialog.cpp:50
+msgid "Export selected device only"
+msgstr "Exportar solamente el dispositivo seleccionado"
+
+#: ../src/gui/dialogs/ExportDeviceDialog.cpp:51
+msgid " (\"%1\")"
+msgstr " (\"%1\")"
+
+#: ../src/gui/dialogs/CompositionLengthDialog.cpp:44
+msgid "Change Composition Length"
+msgstr "Cambiar Duración de la Composición"
+
+#: ../src/gui/dialogs/CompositionLengthDialog.cpp:50
+msgid "Set the Start and End bar markers for this Composition"
+msgstr ""
+"Establecer los marcadores de compás Inicial y Final para esta Composición"
+
+#: ../src/gui/dialogs/CompositionLengthDialog.cpp:54
+msgid "Start Bar"
+msgstr "Compás Inicial"
+
+#: ../src/gui/dialogs/CompositionLengthDialog.cpp:62
+msgid "End Bar"
+msgstr "Compás Final"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:62
+msgid "LilyPond Export/Preview"
+msgstr "Exportación/Previsualización con LilyPond"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:85
+msgid "General options"
+msgstr "Opciones generales"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:90
+msgid "Advanced options"
+msgstr "Opciones avanzadas"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:112
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:95
+msgid "Headers"
+msgstr "Cabeceras"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:106
+msgid "Basic options"
+msgstr "Opciones básicas"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:113
+msgid "Compatibility level"
+msgstr "Nivel de compatibilidad"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:117
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:118
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:119
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:120
+#, c-format
+msgid "LilyPond %1"
+msgstr "LilyPond %1"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:125
+msgid "Paper size"
+msgstr "Tamaño de papel"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:129
+msgid "A3"
+msgstr "A3"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:130
+msgid "A4"
+msgstr "A4"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:131
+msgid "A5"
+msgstr "A5"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:132
+msgid "A6"
+msgstr "A6"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:133
+msgid "Legal"
+msgstr "Legal"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:134
+msgid "US Letter"
+msgstr "Carta de EEUU"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:135
+msgid "Tabloid"
+msgstr "Tabloide"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:136
+msgid "do not specify"
+msgstr "no especificar"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:152
+msgid "Font size"
+msgstr "Tamaño de fuente"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:157
+msgid "%1 pt"
+msgstr "%1 pt"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:169
+msgid "Staff level options"
+msgstr "Opciones a nivel de pentagrama"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:176
+msgid "Export content"
+msgstr "Exportar contenido"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:179
+msgid "All tracks"
+msgstr "Todas las pistas"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:180
+msgid "Non-muted tracks"
+msgstr "Pistas no silenciadas"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:181
+msgid "Selected track"
+msgstr "Pista seleccionada"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:182
+msgid "Selected segments"
+msgstr "Segmentos seleccionados"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:188
+msgid "Merge tracks that have the same name"
+msgstr "Fusionar pistas con el mismo nombre"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:198
+msgid "Notation options"
+msgstr "Opciones de transcripción"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:206
+msgid "First"
+msgstr "Primera"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:207
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:538
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:557
+msgid "All"
+msgstr "Todas"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:211
+msgid "Export tempo marks "
+msgstr "Exportar indicaciones de tempo"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:215
+msgid "Export lyrics"
+msgstr "Exportar letra"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:225
+msgid "Export beamings"
+msgstr "Exportar agrupaciones"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:232
+msgid "Export track staff brackets"
+msgstr "Exportar paréntesis "
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:244
+msgid "Layout options"
+msgstr "Opciones de formato"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:257
+msgid "Lyrics alignment"
+msgstr "Alineación de las letras"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:261
+msgid "Ragged bottom (systems will not be spread vertically across the page)"
+msgstr "Pié irregular (sistemas no repartidos verticalmente en la página)"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:267
+msgid "Miscellaneous options"
+msgstr "Opciones variadas"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:274
+msgid "Enable \"point and click\" debugging"
+msgstr "Activar depuración \"apuntar y hacer clic\""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:279
+msgid "Export \\midi block"
+msgstr "Exportar bloque \\midi"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:284
+msgid "No markers"
+msgstr "Sin marcadores"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:285
+msgid "Rehearsal marks"
+msgstr "Marcos de ensayo"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:286
+msgid "Marker text"
+msgstr "Texto del marcador"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:290
+msgid "Export markers"
+msgstr "Exportar marcadores"
+
+#: ../src/gui/dialogs/AudioSplitDialog.cpp:57
+msgid "Autosplit Audio Segment"
+msgstr "Dividir automáticamente segmento de audio"
+
+#: ../src/gui/dialogs/AudioSplitDialog.cpp:70
+msgid "AutoSplit Segment \""
+msgstr "Dividir automáticamente segmento \" "
+
+#: ../src/gui/dialogs/AudioSplitDialog.cpp:84
+msgid "Threshold"
+msgstr "Umbral"
+
+#: ../src/gui/dialogs/AudioSplitDialog.cpp:142
+msgid "<no preview generated for this audio file>"
+msgstr "<no se ha generado previsualización para este archivo de audio>"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:70
+msgid "Audio Plugin"
+msgstr "Plugin de audio"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:94
+#: ../src/gui/widgets/AudioFaderBox.cpp:136
+msgid "Editor"
+msgstr "Editor"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:100
+msgid "Plugin"
+msgstr "Plugin"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:105
+msgid "Category:"
+msgstr "Categoría:"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:110
+msgid "Plugin:"
+msgstr "Plugin:"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:114
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:398
+msgid "Select a plugin from this list."
+msgstr "Seleccionar un \"plugin\" de esta lista."
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:119
+msgid "Bypass"
+msgstr "Desviación"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:121
+msgid "Bypass this plugin."
+msgstr "Evitar este plugin."
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:127
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:390
+msgid "<ports>"
+msgstr "<puertos>"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:130
+msgid "Input and output port counts."
+msgstr "Cuenta de puertos de entrada y salida."
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:132
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:391
+msgid "<id>"
+msgstr "<id>"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:135
+msgid "Unique ID of plugin."
+msgstr "ID único del \"plugin\"."
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:149
+msgid "Copy plugin parameters"
+msgstr "Copiar parámetros del \"plugin\""
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:155
+msgid "Paste plugin parameters"
+msgstr "Pegar parámetros del \"plugin\""
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:161
+msgid "Set to defaults"
+msgstr "Establecer valores predeterminados"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:225
+msgid "(any)"
+msgstr "(cualquiera)"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:226
+msgid "(unclassified)"
+msgstr "(sin clasificar)"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:247
+msgid "(none)"
+msgstr "(nada)"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:389
+#: ../src/gui/editors/parameters/AudioInstrumentParameterPanel.cpp:132
+#: ../src/gui/editors/parameters/AudioInstrumentParameterPanel.cpp:361
+#: ../src/gui/studio/AudioMixerWindow.cpp:685
+#: ../src/gui/studio/AudioMixerWindow.cpp:724
+#: ../src/gui/studio/AudioMixerWindow.cpp:906
+#: ../src/gui/widgets/AudioFaderBox.cpp:79
+msgid "<no plugin>"
+msgstr "<sin plugin>"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:427
+msgid "This plugin has too many controls to edit here."
+msgstr "Este plugin tiene demasiados controles para editar aquí."
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:438
+#, c-format
+msgid "Id: %1"
+msgstr "Id: %1"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:490
+msgid "mono"
+msgstr "mono"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:492
+msgid "stereo"
+msgstr "estéreo"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:494
+msgid "%1 in, %2 out"
+msgstr "%1 entradas, %2 salidas"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:518
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:704
+msgid "Program: "
+msgstr "Programa: "
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:522
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:532
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:708
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:716
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:745
+msgid "<none selected>"
+msgstr "<sin selección>"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:56
+msgid "Set the %1 property of the event selection:"
+msgstr "Establecer la propiedad %1 de la selección del evento:"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:61
+msgid "Pattern"
+msgstr "Patrón"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:66
+msgid "Flat - set %1 to value"
+msgstr "Bemol - establecer %1 al valor"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:70
+msgid "Alternating - set %1 to max and min on alternate events"
+msgstr "Alternar - establecer %1 al máximo y mínimo en eventos alternos"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:74
+msgid "Crescendo - set %1 rising from min to max"
+msgstr "Crescendo - establecer %1 creciendo desde el mínimo al máximo"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:78
+msgid "Diminuendo - set %1 falling from max to min"
+msgstr ""
+"Diminuendo - establecer %1 descendiendo desde el máximo hasta el mínimo"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:82
+msgid "Ringing - set %1 alternating from max to min with both dying to zero"
+msgstr ""
+"Repique - establecer %1 alternando desde el máximo al mínimo con ambos "
+"cayendo hacia cero"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:123
+#: ../src/gui/dialogs/EventParameterDialog.cpp:150
+msgid "First Value"
+msgstr "Velocidad primera"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:124
+#: ../src/gui/dialogs/EventParameterDialog.cpp:151
+msgid "Second Value"
+msgstr "Velocidad segunda"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:132
+#: ../src/gui/dialogs/EventParameterDialog.cpp:142
+msgid "Low Value"
+msgstr "Velocidad baja"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:133
+#: ../src/gui/dialogs/EventParameterDialog.cpp:141
+msgid "High Value"
+msgstr "Velocidad alta"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:56 ../src/gui/rulers/TempoRuler.cpp:127
+msgid "Insert Tempo Change"
+msgstr "Insertar Cambio de Tempo"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:69
+msgid "New tempo:"
+msgstr "Nuevo tempo "
+
+#: ../src/gui/dialogs/TempoDialog.cpp:76
+msgid "Tap"
+msgstr "Pulso"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:81
+msgid "Tempo is fixed until the following tempo change"
+msgstr "Tempo se mantiene hasta el cambio de tempo que sigue"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:82
+msgid "Tempo ramps to the following tempo"
+msgstr "Tempo cambia de manera gradual por el tempo que sigue"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:83
+msgid "Tempo ramps to:"
+msgstr "Tempo cambia de manera gradual por"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:120
+msgid "Time of tempo change"
+msgstr "Tiempo del cambio de tempo"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:138
+msgid "The pointer is currently at "
+msgstr "El cursor está actualmente en el "
+
+#: ../src/gui/dialogs/TempoDialog.cpp:154
+msgid "Apply this tempo from here onwards"
+msgstr "Aplicar este tempo desde aquí hacia adelante"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:158
+msgid "Replace the last tempo change"
+msgstr "Reemplazar el último cambio de tempo"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:164
+msgid "Apply this tempo from the start of this bar"
+msgstr "Aplicar este tempo desde el principio de este compás"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:167
+msgid "Apply this tempo to the whole composition"
+msgstr "Aplicar este tempo a toda la composición"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:172
+msgid "Also make this the default tempo"
+msgstr "Hacer también este tempo el predeterminado"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:256
+msgid "%1.%2 s,"
+msgstr "%1.%2 s,"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:262
+#, c-format
+msgid "at the start of measure %1."
+msgstr "al principio del compás %1."
+
+#: ../src/gui/dialogs/TempoDialog.cpp:266
+#, c-format
+msgid "in the middle of measure %1."
+msgstr "en medio del compás %1."
+
+#: ../src/gui/dialogs/TempoDialog.cpp:285
+msgid " (at %1.%2 s, in measure %3)"
+msgstr " (en %1.%2 s, compás %3) "
+
+#: ../src/gui/dialogs/TempoDialog.cpp:302
+msgid "There are no preceding tempo changes."
+msgstr "No hay cambios de tempo precedentes"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:310
+msgid "There are no other tempo changes."
+msgstr "No hay otros cambios de tempo."
+
+#: ../src/gui/dialogs/TempoDialog.cpp:328
+msgid " bpm"
+msgstr " tpm"
+
+#: ../src/gui/dialogs/AudioPlayingDialog.cpp:42
+msgid "Playing audio file"
+msgstr "Reproduciendo archivo de audio"
+
+#: ../src/gui/dialogs/AudioPlayingDialog.cpp:47
+msgid "Playing audio file \"%1\""
+msgstr "Reproduciendo archivo de audio \"%1\""
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:52
+#: ../src/gui/editors/matrix/MatrixView.cpp:2655
+msgid "Trigger Segment"
+msgstr "Activar Segmento"
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:61
+msgid "Trigger segment: "
+msgstr "Activar segmento: "
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:59
+msgid "Key Change"
+msgstr "Cambio de Tono"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:77
+msgid "Key signature"
+msgstr "Armadura"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:80
+msgid "Key transposition"
+msgstr "Transporte de la tonalidad"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:86
+msgid "Existing notes following key change"
+msgstr "Notas existentes a continuación de la armadura"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:98
+msgid "Flatten"
+msgstr "Alterar con Bemol"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:100
+msgid "Key"
+msgstr "Clave"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:105
+msgid "Sharpen"
+msgstr "Alterar con Sostenido"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:109
+msgid "Major"
+msgstr "Mayor"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:110
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:369
+msgid "Minor"
+msgstr "Menor"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:123
+msgid "Transpose key according to segment transposition"
+msgstr "Transportar la tonalidad según la tonalidad del segmento"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:126
+msgid "Use specified key. Do not transpose"
+msgstr "Usar tonalidad especificada. No transportar."
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:134
+msgid "Apply to current segment only"
+msgstr "Aplicar al segmento actual solamente"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:137
+msgid "Apply to all segments at this time"
+msgstr "Aplicar a todos los segmentos en este momento"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:141
+msgid "Exclude percussion segments"
+msgstr "Excluir segmentos de percusión"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:155
+msgid "Maintain current accidentals"
+msgstr "Mantener las alteraciones actuales"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:158
+msgid "Transpose into this key"
+msgstr "Trasportar a este tono"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:331
+msgid "No such key"
+msgstr "No hay tal tono"
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:44
+#: ../src/gui/editors/notation/NotationSelector.cpp:118
+msgid "Interpret"
+msgstr "Interpretación"
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:50
+msgid "Interpretations to apply"
+msgstr "Interpretaciones a aplicar"
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:53
+msgid "Apply text dynamics (p, mf, ff etc)"
+msgstr "Aplicar matices de texto (p, mf, ff, etc)"
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:55
+msgid "Apply hairpin dynamics"
+msgstr "Aplicar matizaciones graduales"
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:57
+msgid "Stress beats"
+msgstr "Reforzar las notas a tiempo"
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:59
+msgid "Articulate slurs, staccato, tenuto etc"
+msgstr "Articular ligaduras, staccato, tenuto, etc"
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:61
+msgid "All available interpretations"
+msgstr "Todas las interpretaciones disponibles"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:316
+msgid ""
+"Attempted to launch JACK audio daemon failed. Audio will be disabled.\n"
+"Please check configuration (Settings -> Configure Rosegarden -> Audio -> "
+"Startup)\n"
+" and restart."
+msgstr ""
+"El intento de lanzar el demonio JACK ha fallado. El audio será "
+"deshabilitado.\n"
+"Por favor, compruebe la configuración (Preferencias->Configurar Rosegarden-"
+">Audio->Inicio)\n"
+" y reinicie."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:325
+msgid "Starting sequencer..."
+msgstr "Iniciando secuenciador..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:333
+msgid "Initializing plugin manager..."
+msgstr "Inicializando gestor de plugins..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:338
+msgid "Initializing view..."
+msgstr "Inicializando vista..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:354
+msgid "Special Parameters"
+msgstr "Parámetros Especiales"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:430
+msgid "Starting sequence manager..."
+msgstr "Iniciando gestor del secuenciador..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:456
+msgid "Clearing studio data..."
+msgstr "Limpiando datos del estudio..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:475
+#: ../src/gui/editors/notation/NotationView.cpp:558
+msgid "Starting..."
+msgstr "Iniciando..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:556
+msgid "Import Rosegarden &Project file..."
+msgstr "Importar archivo de &Proyecto de Rosegarden..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:560
+msgid "Import &MIDI file..."
+msgstr "Importar archivo &MIDI..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:564
+msgid "Import &Rosegarden 2.1 file..."
+msgstr "Importar archivo de &Rosegarden 2.1..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:568
+msgid "Import &Hydrogen file..."
+msgstr "Importar archivo de &Hydrogen..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:572
+msgid "Merge &File..."
+msgstr "Me&zclar archivo..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:576
+msgid "Merge &MIDI file..."
+msgstr "Mezclar archivo &MIDI..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:580
+msgid "Merge &Rosegarden 2.1 file..."
+msgstr "Mezclar archivo de &Rosegarden 2.1..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:584
+msgid "Merge &Hydrogen file..."
+msgstr "Mezclar archivo de &Hydrogen..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:588
+msgid "Export Rosegarden &Project file..."
+msgstr "Exportar archivo de &Proyecto de Rosegarden 2.1..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:592
+msgid "Export &MIDI file..."
+msgstr "Exportar archivo &MIDI..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:596
+msgid "Export &LilyPond file..."
+msgstr "Exportar archivo &LilyPond..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:600
+msgid "Export Music&XML file..."
+msgstr "Exportar archivo Music&XML..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:604
+msgid "Export &Csound score file..."
+msgstr "Exportar archivo &Csound..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:608
+msgid "Export M&up file..."
+msgstr "Exportar archivo M&up..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:612
+#: ../src/gui/editors/notation/NotationView.cpp:1500
+msgid "Print &with LilyPond..."
+msgstr "Imprimir con LilyPond..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:616
+#: ../src/gui/editors/notation/NotationView.cpp:1504
+msgid "Preview with Lil&yPond..."
+msgstr "Previsualización con LilyPond..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:620
+msgid "Play&list"
+msgstr "&Lista de reproducción"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:627
+msgid "Rosegarden &Tutorial"
+msgstr "&Tutorial de Rosegarden"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:631
+msgid "&Bug Reporting Guidelines"
+msgstr "&Directivas de Reporte de Errores"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:645
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:348
+#: ../src/gui/editors/segment/MarkerEditor.cpp:378
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:388
+#: ../src/gui/general/EditViewBase.cpp:190
+#: ../src/gui/studio/BankEditorDialog.cpp:318
+#: ../src/gui/studio/DeviceManagerDialog.cpp:227
+msgid "Und&o"
+msgstr "&Deshacer"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:651
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:354
+#: ../src/gui/editors/segment/MarkerEditor.cpp:384
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:394
+#: ../src/gui/general/EditViewBase.cpp:196
+#: ../src/gui/studio/BankEditorDialog.cpp:324
+#: ../src/gui/studio/DeviceManagerDialog.cpp:233
+msgid "Re&do"
+msgstr "Re&hacer"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:665
+#: ../src/gui/editors/notation/NotationView.cpp:2297
+msgid "Show T&ools Toolbar"
+msgstr "M&ostrar barra de herramientas de Herramientas"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:669
+msgid "Show Trac&ks Toolbar"
+msgstr "Mostrar barra de herramientas de &Pistas"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:673
+msgid "Show &Editors Toolbar"
+msgstr "Mostrar barra de herramientas de &Edición"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:677
+#: ../src/gui/editors/notation/NotationView.cpp:2309
+msgid "Show Trans&port Toolbar"
+msgstr "Mostrar barra de herramientas de &Transporte"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:681
+msgid "Show &Zoom Toolbar"
+msgstr "Mostrar barra de herramientas de &Ampliación"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:688
+msgid "Show Tra&nsport"
+msgstr "Mostrar &Transporte"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:693
+msgid "Show Track &Labels"
+msgstr "Mostrar &Etiquetas de Pista"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:698
+msgid "Show Playback Position R&uler"
+msgstr "Mostrar regla de Posición de Ejec&ución"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:703
+msgid "Show Te&mpo Ruler"
+msgstr "Mostrar regla de Te&mpo"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:708
+msgid "Show Cho&rd Name Ruler"
+msgstr "Mostrar regla de Nombres de Aco&rde"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:714
+msgid "Show Segment Pre&views"
+msgstr "Mostrar Pre&visualización de Segmentos"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:719
+msgid "Show Special &Parameters"
+msgstr "Mostrar Parámetros especiales"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:753
+#: ../src/gui/editors/matrix/MatrixView.cpp:641
+#: ../src/gui/editors/notation/NotationView.cpp:1772
+msgid "&Select and Edit"
+msgstr "S&eleccionar y Editar"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:758
+#: ../src/gui/editors/matrix/MatrixView.cpp:646
+msgid "&Draw"
+msgstr "&Dibujar"
+
+#: ../src/commands/edit/EraseCommand.h:50
+#: ../src/gui/application/RosegardenGUIApp.cpp:763
+#: ../src/gui/editors/matrix/MatrixView.cpp:651
+#: ../src/gui/editors/notation/NotationView.cpp:1766
+msgid "&Erase"
+msgstr "&Eliminar"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:768
+#: ../src/gui/editors/matrix/MatrixView.cpp:656
+msgid "&Move"
+msgstr "&Mover"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:775
+msgid "&Resize"
+msgstr "&Cambiar tamaño"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:782 rc.cpp:87
+#, no-c-format
+msgid "&Split"
+msgstr "Di&vidir"
+
+#: ../src/commands/segment/SegmentJoinCommand.h:53
+#: ../src/gui/application/RosegardenGUIApp.cpp:789
+msgid "&Join"
+msgstr "&Unir"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:795
+msgid "&Harmonize"
+msgstr "&Armonizar"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:806
+#: ../src/gui/rulers/TempoRuler.cpp:157
+msgid "Open Tempo and Time Signature Editor"
+msgstr "Abrir Editor de Tempo y Medida"
+
+#: ../src/commands/segment/CutRangeCommand.cpp:41
+#: ../src/gui/application/RosegardenGUIApp.cpp:812
+msgid "Cut Range"
+msgstr "C&ortar ámbito"
+
+#: ../src/commands/edit/CopyCommand.cpp:73
+#: ../src/gui/application/RosegardenGUIApp.cpp:816
+msgid "Copy Range"
+msgstr "Copiar ámbito"
+
+#: ../src/commands/segment/PasteRangeCommand.cpp:45
+#: ../src/gui/application/RosegardenGUIApp.cpp:820
+msgid "Paste Range"
+msgstr "Pegar ámbito"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:828
+msgid "Insert Range..."
+msgstr "Insertar Rango..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:832
+#: ../src/gui/editors/notation/NotationView.cpp:1804
+msgid "De&lete"
+msgstr "E&liminar "
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:836
+msgid "Select &All Segments"
+msgstr "Seleccion&ar Todos los Segmentos"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:852
+msgid "Edit Mar&kers..."
+msgstr "Editar Mar&cadores..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:856
+msgid "Edit Document P&roperties..."
+msgstr "Editar P&ropiedades del Documento..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:864
+msgid "Open in &Default Editor"
+msgstr "Abrir en el Editor Pre&determinado"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:870
+#: ../src/gui/general/EditViewBase.cpp:206
+msgid "Open in Matri&x Editor"
+msgstr "Abrir en el Editor de Matri&z"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:876
+#: ../src/gui/general/EditViewBase.cpp:212
+msgid "Open in &Percussion Matrix Editor"
+msgstr "Abrir en el Editor de Matri&z de Percusión"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:882
+#: ../src/gui/general/EditViewBase.cpp:218
+msgid "Open in &Notation Editor"
+msgstr "Abrir en el Editor de &Partitura"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:888
+#: ../src/gui/general/EditViewBase.cpp:224
+msgid "Open in &Event List Editor"
+msgstr "Abrir en el Editor de Lista de &Eventos"
+
+#: ../src/commands/edit/EventQuantizeCommand.cpp:120
+#: ../src/commands/edit/EventUnquantizeCommand.cpp:87
+#: ../src/gui/application/RosegardenGUIApp.cpp:894
+msgid "&Quantize..."
+msgstr "Cuanti&ficar..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:908
+#: ../src/gui/editors/matrix/MatrixView.cpp:686
+msgid "Repeat Last Quantize"
+msgstr "Repetir la Última Cuantificación"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:928
+msgid "Split at Time..."
+msgstr "Dividir por Tiempo..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:932
+#: ../src/gui/general/EditView.cpp:796
+msgid "Jog &Left"
+msgstr "Correr a la &Izquierda"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:936
+#: ../src/gui/general/EditView.cpp:800
+msgid "Jog &Right"
+msgstr "Correr a la De&recha"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:940
+msgid "Set Start Time..."
+msgstr "Establecer Tiempo Inicial..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:944
+msgid "Set Duration..."
+msgstr "Establecer Duración..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:953
+msgid "Turn Re&peats into Copies"
+msgstr "Convertir Re&peticiones en Copias"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:958
+msgid "Manage Tri&ggered Segments"
+msgstr "Gestionar Se&gmentos Activados"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:962
+msgid "Set Tempos from &Beat Segment"
+msgstr "Esta&blecer Tempos desde segmento de pulsos"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:966
+msgid "Set &Tempo to Audio Segment Duration"
+msgstr "Establecer &Tempo a la duración del Segmento de Audio"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:972
+msgid "Manage A&udio Files"
+msgstr "Gestionar archivos a&udio"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:977
+msgid "Show Segment Labels"
+msgstr "Mostrar Etiquetas de Segmento"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:986
+msgid "Add &Track"
+msgstr "Añadir &Pista"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:990
+msgid "&Add Tracks..."
+msgstr "Añadir Pistas..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:996
+msgid "D&elete Track"
+msgstr "&Borrar Pista"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1002
+msgid "Move Track &Down"
+msgstr "Mover Pista &Abajo"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1008
+msgid "Move Track &Up"
+msgstr "Mover Pista &Arriba"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1012
+msgid "Select &Next Track"
+msgstr "Seleccio&nar Siguiente Pista"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1017
+msgid "Select &Previous Track"
+msgstr "Seleccionar &Pista Anterior"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1022
+msgid "Mute or Unmute Track"
+msgstr "Silenciar o no silenciar pista"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1027
+msgid "Arm or Un-arm Track for Record"
+msgstr "Armar o no armar pista para grabar"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1034
+msgid "&Mute all Tracks"
+msgstr "&Silenciar todas las Pistas"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1040
+msgid "&Unmute all Tracks"
+msgstr "&No silenciar ninguna Pista"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1044
+msgid "&Remap Instruments..."
+msgstr "&Remapear Instrumentos..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1053
+msgid "&Audio Mixer"
+msgstr "Me&zclador de Audio"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1059
+msgid "Midi Mi&xer"
+msgstr "Me&zclador MIDI"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1065
+msgid "Manage MIDI &Devices"
+msgstr "Gestionar &Dispositivos MIDI"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1071
+msgid "Manage S&ynth Plugins"
+msgstr "Gestionar Plugins de Sinteti&zador"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1075
+msgid "Modify MIDI &Filters"
+msgstr "Modificar &Filtros MIDI"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1079
+msgid "MIDI Thru Routing"
+msgstr "Encaminamiento MIDI Thru"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1085
+msgid "Manage &Metronome"
+msgstr "Gestionar &Metrónomo"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1089
+msgid "&Save Current Document as Default Studio"
+msgstr "Guardar documento actual como E&studio predeterminado"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1093
+msgid "&Import Default Studio"
+msgstr "&Importar Estudio por Omisión"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1097
+msgid "Im&port Studio from File..."
+msgstr "Im&portar Estudio desde Archivo..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1101
+msgid "&Reset MIDI Network"
+msgstr "&Reiniciar red MIDI"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1105
+msgid "Set Quick Marker at Playback Position"
+msgstr "Insertar marcador rápido en la posición de reproducción"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1109
+msgid "Jump to Quick Marker"
+msgstr "Saltar al marcador rápido"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1142
+#: ../src/gui/editors/matrix/MatrixView.cpp:782
+#: ../src/gui/editors/notation/NotationView.cpp:2397
+#: ../src/gui/studio/AudioMixerWindow.cpp:105
+#: ../src/gui/studio/MidiMixerWindow.cpp:81
+msgid "&Play"
+msgstr "&Reproducir"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1153
+#: ../src/gui/editors/matrix/MatrixView.cpp:791
+#: ../src/gui/editors/notation/NotationView.cpp:2406
+#: ../src/gui/studio/AudioMixerWindow.cpp:114
+#: ../src/gui/studio/MidiMixerWindow.cpp:90
+msgid "&Stop"
+msgstr "&Parar"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1160
+#: ../src/gui/editors/matrix/MatrixView.cpp:802
+#: ../src/gui/editors/notation/NotationView.cpp:2417
+#: ../src/gui/studio/AudioMixerWindow.cpp:125
+#: ../src/gui/studio/MidiMixerWindow.cpp:101
+msgid "&Fast Forward"
+msgstr "Avance &Rápido"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1168
+#: ../src/gui/editors/matrix/MatrixView.cpp:796
+#: ../src/gui/editors/notation/NotationView.cpp:2411
+#: ../src/gui/studio/AudioMixerWindow.cpp:119
+#: ../src/gui/studio/MidiMixerWindow.cpp:95
+msgid "Re&wind"
+msgstr "Re&bobinar"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1175
+msgid "P&unch in Record"
+msgstr "&Grabar Durante Ejecución"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1182
+#: ../src/gui/studio/AudioMixerWindow.cpp:143
+#: ../src/gui/studio/MidiMixerWindow.cpp:119
+msgid "&Record"
+msgstr "G&rabar"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1189
+#: ../src/gui/editors/matrix/MatrixView.cpp:808
+#: ../src/gui/editors/notation/NotationView.cpp:2423
+#: ../src/gui/studio/AudioMixerWindow.cpp:131
+#: ../src/gui/studio/MidiMixerWindow.cpp:107
+msgid "Rewind to &Beginning"
+msgstr "Re&bobinar al principio"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1196
+#: ../src/gui/editors/matrix/MatrixView.cpp:814
+#: ../src/gui/editors/notation/NotationView.cpp:2429
+#: ../src/gui/studio/AudioMixerWindow.cpp:137
+#: ../src/gui/studio/MidiMixerWindow.cpp:113
+msgid "Fast Forward to &End"
+msgstr "Avance Rá&pido al Final"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1203
+#: ../src/gui/editors/matrix/MatrixView.cpp:832
+#: ../src/gui/editors/notation/NotationView.cpp:2447
+msgid "Scro&ll to Follow Playback"
+msgstr "Desp&lazamiento para Seguir la Reproducción"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1209
+#: ../src/gui/editors/matrix/MatrixView.cpp:838
+#: ../src/gui/editors/notation/NotationView.cpp:2453
+#: ../src/gui/studio/AudioMixerWindow.cpp:149
+#: ../src/gui/studio/MidiMixerWindow.cpp:125
+msgid "Panic"
+msgstr "Pánico"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1213
+msgid "Segment Debug Dump "
+msgstr "Vertedero de Depuración de Segmentos "
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1283
+msgid " Zoom: "
+msgstr " Ampliar: "
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1719
+msgid "File \"%1\" does not exist"
+msgstr "El archivo \"%1\" no existe"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1725
+msgid "File \"%1\" is actually a directory"
+msgstr "El archivo \"%1\" es un directorio"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1734
+msgid "You do not have read permission for \"%1\""
+msgstr "No tiene permiso de lectura para \"%1\""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1802
+msgid ""
+"An auto-save file for this document has been found\n"
+"Do you want to open it instead ?"
+msgstr ""
+"Se ha encontrado un archivo auto-guardado para este documento\n"
+"¿Quiere abrirlo en lugar del original?"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1896
+msgid "Example Files"
+msgstr "Archivos de Ejemplo"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2100
+msgid "Opening a new application window..."
+msgstr "Abriendo una nueva ventana de la aplicación..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2110
+msgid "Creating new document..."
+msgstr "Creando nuevo documento..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2154
+#, c-format
+msgid ""
+"Malformed URL\n"
+"%1"
+msgstr ""
+"Formato erróneo de URL\n"
+"%1"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2179
+#: ../src/gui/application/RosegardenGUIApp.cpp:2240
+msgid "Opening file..."
+msgstr "Abriendo archivo..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2201
+#: ../src/gui/application/RosegardenGUIApp.cpp:2220
+msgid "Open File"
+msgstr "Abrir Archivo"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1225
+#: ../src/gui/application/RosegardenGUIApp.cpp:2258
+msgid "Saving file..."
+msgstr "Guardando archivo..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2330
+msgid "This is not a valid filename.\n"
+msgstr "Este Nombre de Archivo no es válido.\n"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2335
+msgid "This is not a local file.\n"
+msgstr "Este no es un archivo local.\n"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2342
+#: ../src/gui/studio/BankEditorDialog.cpp:1640
+#: ../src/gui/studio/DeviceManagerDialog.cpp:787
+msgid "You have specified a directory"
+msgstr "Ha especificado un directorio"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2348
+#: ../src/gui/studio/BankEditorDialog.cpp:1646
+#: ../src/gui/studio/DeviceManagerDialog.cpp:793
+msgid "The specified file exists. Overwrite?"
+msgstr "El archivo especificado ya existe. ¿Sobreescribir?"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2362
+msgid "Saving file with a new filename..."
+msgstr "Guardando archivo con un nuevo nombre..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2364
+msgid "Rosegarden files"
+msgstr "Archivos de Rosegarden"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2365
+#: ../src/gui/application/RosegardenGUIApp.cpp:4860
+#: ../src/gui/application/RosegardenGUIApp.cpp:4904
+#: ../src/gui/application/RosegardenGUIApp.cpp:4942
+#: ../src/gui/application/RosegardenGUIApp.cpp:4975
+#: ../src/gui/application/RosegardenGUIApp.cpp:5009
+#: ../src/gui/application/RosegardenGUIApp.cpp:5116
+msgid "All files"
+msgstr "Todos los archivos"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2366
+msgid "Save as..."
+msgstr "Guardar como..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2404
+msgid "Closing file..."
+msgstr "Cerrando archivo..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2421
+#: ../src/gui/editors/notation/NotationView.cpp:4618
+msgid "Printing..."
+msgstr "Imprimiendo..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2433
+#: ../src/gui/editors/notation/NotationView.cpp:4635
+msgid "Previewing..."
+msgstr "Pre-visualización..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2440
+msgid "Exiting..."
+msgstr "Saliendo..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2463
+msgid "Cutting selection..."
+msgstr "Cortando selección..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2474
+#: ../src/gui/editors/matrix/MatrixView.cpp:1614
+#: ../src/gui/editors/notation/NotationView.cpp:4763
+msgid "Copying selection to clipboard..."
+msgstr "Copiando la selección al portapapeles..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2484
+#: ../src/gui/editors/eventlist/EventView.cpp:878
+#: ../src/gui/editors/matrix/MatrixView.cpp:1625
+#: ../src/gui/editors/notation/NotationView.cpp:4796
+#: ../src/gui/editors/notation/NotationView.cpp:4841
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:352
+msgid "Clipboard is empty"
+msgstr "Portapapeles vacío"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2487
+#: ../src/gui/editors/eventlist/EventView.cpp:882
+#: ../src/gui/editors/matrix/MatrixView.cpp:1629
+#: ../src/gui/editors/notation/NotationView.cpp:4804
+#: ../src/gui/editors/notation/NotationView.cpp:4845
+msgid "Inserting clipboard contents..."
+msgstr "Insertando el contenido del portapapeles..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2556
+msgid "Duration of empty range to insert"
+msgstr "Duración del rango vacío para insertar"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2631
+msgid "This function needs no more than one segment to be selected."
+msgstr "Esta función necesita no más de un segmento seleccionado"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2654
+msgid "Can't join Audio segments"
+msgstr "No se pueden unir segmentos de Audio"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2707
+msgid "rescaling an audio file"
+msgstr "Re-escalado de un archivo de audio"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2723
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:172
+msgid "Rescaling audio file..."
+msgstr "Re-escalando archivo de audio..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2767
+msgid ""
+"The audio file path does not exist or is not writable.\n"
+"You must set the audio file path to a valid directory in Document Properties "
+"before %1.\n"
+"Would you like to set it now?"
+msgstr ""
+"El directorio de archivos de audio no existe o no se puede escribir.\n"
+"Usted debe establecer el directorio de archivos de audio en un directorio "
+"válido desde Propiedades del Documento antes de %1.\n"
+"¿Quiere usted configurarlo ahora?"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2769
+#: ../src/gui/application/RosegardenGUIApp.cpp:5291
+#: ../src/gui/application/RosegardenGUIApp.cpp:5339
+#: ../src/gui/editors/segment/TrackButtons.cpp:419
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:159
+msgid "Set audio file path"
+msgstr "Directorio de los archivos de audio "
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2833
+msgid "Jog Selection"
+msgstr "Correr Selección"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2978
+#, c-format
+msgid ""
+"_n: Split Segment at Time\n"
+"Split %n Segments at Time"
+msgstr ""
+"Dividir Segmento por Tiempo\n"
+"Dividir %n Segmentos por Tiempo"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3013
+#: ../src/gui/general/EditViewBase.cpp:619
+msgid "Segment Start Time"
+msgstr "Tiempo de Comienzo de Segmento"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3023
+msgid "Set Segment Start Times"
+msgstr "Establecer Tiempos de Comienzo de Segmento"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3024
+#: ../src/gui/general/EditViewBase.cpp:626
+msgid "Set Segment Start Time"
+msgstr "Establecer Tiempo de Comienzo de Segmento"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3056
+#: ../src/gui/general/EditViewBase.cpp:644
+msgid "Segment Duration"
+msgstr "Duración del Segmento"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3068
+msgid "Set Segment Durations"
+msgstr "Establecer Duraciones de Segmento"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3069
+#: ../src/gui/general/EditViewBase.cpp:652
+msgid "Set Segment Duration"
+msgstr "Establecer Duración de Segmento"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3176
+#: ../src/gui/application/RosegardenGUIApp.cpp:5875
+msgid "Set Global Tempo"
+msgstr "Establecer Tempo global"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3234
+#: ../src/gui/general/EditViewBase.cpp:477
+msgid "Toggle the toolbar..."
+msgstr "Conmuta la barra de herramientas..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3244
+msgid "Toggle the tools toolbar..."
+msgstr "Conmutar la barra de herramientas de herramientas..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3254
+msgid "Toggle the tracks toolbar..."
+msgstr "Conmutar la barra de herramientas de pistas"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3264
+msgid "Toggle the editor toolbar..."
+msgstr "Conmutar la barra de herramientas del editor..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3274
+msgid "Toggle the transport toolbar..."
+msgstr "Conmutar la barra de herramientas de transporte..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3284
+msgid "Toggle the zoom toolbar..."
+msgstr "Conmutar la barra de herramientas de ampliación..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3294
+msgid "Toggle the Transport"
+msgstr "Conmutar el transporte"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3377
+#: ../src/gui/general/EditViewBase.cpp:487
+msgid "Toggle the statusbar..."
+msgstr "Conmutar la barra de estado..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3434
+msgid ""
+"The join tool isn't implemented yet. Instead please highlight the segments "
+"you want to join and then use the menu option:\n"
+"\n"
+" Segments->Collapse Segments.\n"
+msgstr ""
+"la herramienta de unión no está implementada todavía. En su lugar, por favor "
+"seleccione los segmentos que desea unir y use la opción de menú:\n"
+"\n"
+" Segmentos->Fusionar Segmentos.\n"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3437
+msgid "Join tool not yet implemented"
+msgstr "Herramienta de Unión no implementada todavía"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3675
+msgid "Revert modified document to previous saved version?"
+msgstr "¿Volver a la versión anterior del documento modificado?"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3691
+msgid ""
+"*.rgp|Rosegarden Project files\n"
+"*|All files"
+msgstr ""
+"*.rgp|Archivos de Proyecto de Rosegarden\n"
+"*|Todos los archivos"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3692
+msgid "Import Rosegarden Project File"
+msgstr "Importar archivo de Proyecto de Rosegarden"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3717
+msgid "Failed to import project file \"%1\""
+msgstr "Fallo al importar archivo de proyecto \"%1\""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3739
+msgid "Open MIDI File"
+msgstr "Abrir Archivo MIDI"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3756
+msgid "Merge MIDI File"
+msgstr "Mezclar archivo MIDI"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3866
+msgid "Importing MIDI file..."
+msgstr "Importando archivo MIDI..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3903
+msgid "Calculating notation..."
+msgstr "Calculando partitura..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3950
+msgid "Calculate Notation"
+msgstr "Calcular Partitura"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3991
+#: ../src/gui/application/RosegardenGUIApp.cpp:4008
+msgid ""
+"*.rose|Rosegarden-2 files\n"
+"*|All files"
+msgstr ""
+"*.rose|Archivos de Rosegarden-2\n"
+"*|Todos los archivos"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3992
+#: ../src/gui/application/RosegardenGUIApp.cpp:4009
+msgid "Open Rosegarden 2.1 File"
+msgstr "Abrir Archivo de Rosegarden 2.1"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4026
+msgid "Importing Rosegarden 2.1 file..."
+msgstr "Importando archivo.de Rosegarden 2.1 ..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4052
+msgid "Can't load Rosegarden 2.1 file. It appears to be corrupted."
+msgstr "No se puede cargar archivo de Rosegarden 2.1. Parece estar corrompido."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4078
+#: ../src/gui/application/RosegardenGUIApp.cpp:4095
+msgid ""
+"*.h2song|Hydrogen files\n"
+"*|All files"
+msgstr ""
+"*.h2song|Archivos de Hydrogen\n"
+"*|Todos los archivos"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4079
+#: ../src/gui/application/RosegardenGUIApp.cpp:4096
+msgid "Open Hydrogen File"
+msgstr "Abrir Archivo de Hydrogen"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4113
+msgid "Importing Hydrogen file..."
+msgstr "Importando archivo.de Hydrogen..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4139
+msgid "Can't load Hydrogen file. It appears to be corrupted."
+msgstr "No se puede cargar archivo de Hydrogen. Parece estar corrompido."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4527
+msgid "Export and import of Rosegarden Project files"
+msgstr "Exportación e importación de archivos de Proyecto de Rosegarden..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4529
+msgid "The Rosegarden Project Packager helper script"
+msgstr "El empaquetador de Proyectos de Rosegarden"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4533
+msgid "%1 - for project file support"
+msgstr "%1 - para apoyo de archivos de Proyecto de Rosegarden"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4550
+msgid "The Rosegarden LilyPondView helper script"
+msgstr "El guión ayudante Rosegarden LilyPondView"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4554
+msgid "%1 - for LilyPond preview support"
+msgstr "%1 - para previsualización con LilyPond"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4570
+msgid "The Rosegarden Audio File Importer helper script"
+msgstr "El guión ayudante Rosegarden Audio File Importer"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4574
+msgid "%1 - for audio file import"
+msgstr " %1 - para importación de archivos de audio "
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4585
+msgid ""
+"<h3>Helper programs not found</h3><p>Rosegarden could not find one or more "
+"helper programs which it needs to provide some features. The following "
+"features will not be available:</p>"
+msgstr ""
+"<h3>Guiones ayudantes no se hallaron </h3><p>Rosegarden buscó pero no halló "
+"uno u más de los guiones ayudantes que se requieren para activar unas "
+"características especiales. Las características siguientes no estarán "
+"disponibles:</p>"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4586
+#: ../src/gui/application/RosegardenGUIApp.cpp:4592
+msgid "<ul>"
+msgstr "<ul>"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4588
+#: ../src/gui/application/RosegardenGUIApp.cpp:4594
+msgid "<li>%1</li>"
+msgstr "<li>%1</li>"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4590
+#: ../src/gui/application/RosegardenGUIApp.cpp:4596
+msgid "</ul>"
+msgstr "</ul>"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4591
+msgid ""
+"<p>To fix this, you should install the following additional programs:</p>"
+msgstr ""
+"<p>Para arreglar esto, debes instalar los siguientes programas adicionales:</"
+"p>"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4603
+msgid "Helper programs not found"
+msgstr "Guilones ayudandes no encontrados"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4686
+msgid "Starting the sequencer..."
+msgstr "Iniciando el secuenciador..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4712
+msgid "Couldn't start the sequencer"
+msgstr "No se ha podido iniciar el secuenciador"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4789
+msgid "Clearing down jackd..."
+msgstr "Despejando jackd..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4803
+msgid "Starting jackd..."
+msgstr "Iniciando jackd..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4842
+msgid ""
+"The Rosegarden sequencer process has exited unexpectedly. Sound and "
+"recording will no longer be available for this session.\n"
+"Please exit and restart Rosegarden to restore sound capability."
+msgstr ""
+"El proceso del secuenciador de Rosegarden ha finalizado de forma inesperada. "
+"Sonido y grabación ya no van a estar disponibles para esta sesión.\n"
+"Por favor, finalice y reinicie Rosegarden para restaurar las funcionalidades "
+"de sonido."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4846
+msgid ""
+"The Rosegarden sequencer could not be started, so sound and recording will "
+"be unavailable for this session.\n"
+"For assistance with correct audio and MIDI configuration, go to http://"
+"rosegardenmusic.com."
+msgstr ""
+"El secuenciador de Rosegarden no pudo ser iniciado, por lo tanto no "
+"estarándisponibles en esta sesión ni sonido ni grabación.\n"
+"Para asistencia acerca de una correcta configuración de audio y MIDI, vaya "
+"ahttp://rosegardenmusic.com."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4856
+msgid "Exporting Rosegarden Project file..."
+msgstr "Exportanto archivo de Proyecto de Rosegarden..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4859
+msgid "Rosegarden Project files\n"
+msgstr "Archivos de Proyecto de Rosegarden\n"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4861
+#: ../src/gui/application/RosegardenGUIApp.cpp:4905
+#: ../src/gui/application/RosegardenGUIApp.cpp:4943
+#: ../src/gui/application/RosegardenGUIApp.cpp:4976
+#: ../src/gui/application/RosegardenGUIApp.cpp:5010
+#: ../src/gui/application/RosegardenGUIApp.cpp:5116
+msgid "Export as..."
+msgstr "Exportar como..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4875
+#, c-format
+msgid "Saving Rosegarden file to package failed: %1"
+msgstr "Fallo al intentar grabar el archivo de Rosegarden en un paquete: %1"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4889
+msgid "Failed to export to project file \"%1\""
+msgstr "Fallo al exportar hacia el archivo de proyecto \"%1\""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4900
+#: ../src/gui/application/RosegardenGUIApp.cpp:4915
+msgid "Exporting MIDI file..."
+msgstr "Exportando archivo MIDI..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4903
+msgid "Standard MIDI files\n"
+msgstr "Archivos MIDI Estándar\n"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4934
+#: ../src/gui/application/RosegardenGUIApp.cpp:4966
+#: ../src/gui/application/RosegardenGUIApp.cpp:4999
+#: ../src/gui/application/RosegardenGUIApp.cpp:5103
+#: ../src/gui/application/RosegardenGUIApp.cpp:5140
+#: ../src/gui/editors/notation/NotationView.cpp:4733
+msgid "Export failed. The file could not be opened for writing."
+msgstr ""
+"Ha fallado la exportación. El archivo no se ha podido abrir para escritura."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4940
+#: ../src/gui/application/RosegardenGUIApp.cpp:4952
+msgid "Exporting Csound score file..."
+msgstr "Exportando archivo.Csound..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4972
+#: ../src/gui/application/RosegardenGUIApp.cpp:4985
+msgid "Exporting Mup file..."
+msgstr "Exportando archivo Mup..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4975
+msgid "Mup files\n"
+msgstr "Archivos Mup\n"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5005
+#: ../src/gui/application/RosegardenGUIApp.cpp:5089
+#: ../src/gui/editors/notation/NotationView.cpp:4719
+msgid "Exporting LilyPond file..."
+msgstr "Exportando archivo.LilyPond... "
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5008
+msgid "LilyPond files"
+msgstr "Archivos de LilyPond "
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5023
+#: ../src/gui/editors/notation/NotationView.cpp:4653
+msgid "Printing LilyPond file..."
+msgstr "Imprimiendo archivo.LilyPond..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5028
+#: ../src/gui/application/RosegardenGUIApp.cpp:5052
+#: ../src/gui/editors/notation/NotationView.cpp:4658
+#: ../src/gui/editors/notation/NotationView.cpp:4682
+msgid "Failed to open a temporary file for LilyPond export."
+msgstr "Fallo al abrir un archivo temporario para exportar a LilyPond. "
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5047
+#: ../src/gui/editors/notation/NotationView.cpp:4677
+msgid "Previewing LilyPond file..."
+msgstr "Previsualizando archivo.LilyPond..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5080
+#: ../src/gui/editors/notation/NotationView.cpp:4710
+msgid "LilyPond Preview Options"
+msgstr "Opciones de previsualización con LilyPond "
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5081
+#: ../src/gui/editors/notation/NotationView.cpp:4711
+msgid "LilyPond preview options"
+msgstr "Opciones de previsualización con LilyPond "
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5112
+#: ../src/gui/application/RosegardenGUIApp.cpp:5126
+msgid "Exporting MusicXML file..."
+msgstr "Exportando archivo.MusicXML..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5115
+msgid "XML files"
+msgstr "Archivos XML"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5289
+#: ../src/gui/editors/segment/TrackButtons.cpp:417
+msgid ""
+"The audio file path does not exist or is not writable.\n"
+"Please set the audio file path to a valid directory in Document Properties "
+"before recording audio.\n"
+"Would you like to set it now?"
+msgstr ""
+"El directorio de archivos de audio no existe o no es escribible.\n"
+"Por favor, configura el directorio de archivos de audio hacia un directorio "
+"válido desde Propiedades del Documento antes de grabar audio.\n"
+"¿Quieres configurarlo ahora?"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5337
+msgid ""
+"The audio file path does not exist or is not writable.\n"
+"Please set the audio file path to a valid directory in Document Properties "
+"before you start to record audio.\n"
+"Would you like to set it now?"
+msgstr ""
+"El directorio de archivos de audio no existe o no es escribible.\n"
+"Por favor, configura el directorio de archivos de audio hacia un directorio "
+"válido desde Propiedades del Documento antes de grabar audio.\n"
+"¿Quieres configurarlo ahora? "
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5780
+msgid "Move playback pointer to time"
+msgstr "Mover el apuntador de reproducción al tiempo"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5793
+#: ../src/gui/editors/matrix/MatrixView.cpp:2240
+msgid "%1%"
+msgstr "%1%"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5861
+#, c-format
+msgid "Replace Tempo Change at %1"
+msgstr "Reemplazar Cambio de Tempo en %1"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5891
+msgid "Set Global and Default Tempo"
+msgstr "Establecer Tempo Global y Predeterminado"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5914
+msgid "Move Tempo Change"
+msgstr "Mover Cambio de Tempo"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5949
+msgid "new marker"
+msgstr "marcador nuevo"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5950
+msgid "no description"
+msgstr "no descripción"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:6363
+#, c-format
+msgid "Sequencer failed to add audio file %1"
+msgstr "El secuenciador ha fallado al añadir el archivo de audio %1"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:6388
+#, c-format
+msgid "Sequencer failed to remove audio file id %1"
+msgstr ""
+"El secuenciador ha fallado al eliminar el identificador de archivo de audio %"
+"1"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:6448
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:1086
+msgid "Modify Segment label"
+msgstr "Modificar etiqueta del Segmento"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:6450
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:1088
+msgid "Modify Segments label"
+msgstr "Modificar etiquetas de Segmentos"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:6452
+msgid "Relabelling selection..."
+msgstr "Reetiquetando selección..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7539
+msgid "Play List"
+msgstr "Lista de Ejecución"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7567
+msgid "http://rosegarden.sourceforge.net/tutorial/en/chapter-0.html"
+msgstr "http://rosegarden.sourceforge.net/tutorial/en/chapter-0.html"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7574
+msgid "http://rosegarden.sourceforge.net/tutorial/bug-guidelines.html"
+msgstr "http://rosegarden.sourceforge.net/tutorial/bug-guidelines.html"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7650
+msgid "Queueing MIDI panic events for tranmission..."
+msgstr "Encolando eventos MIDI de pánico para transmisión..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7708
+msgid "Are you sure you want to save this as your default studio?"
+msgstr "¿Está seguro de querer guardar esto como el Estudio predeterminado?"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7713
+msgid "Saving current document as default studio..."
+msgstr "Guardando el documento actual como Estudio predeterminado..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7738
+msgid ""
+"Are you sure you want to import your default studio and lose the current one?"
+msgstr ""
+"¿Está seguro de querer importar el estudio por omisión y perder el actual?"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7773
+msgid "Import Studio from File"
+msgstr "Importar Estudio desde Archivo"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7807
+msgid "Import Studio"
+msgstr "Importar Estudio"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:8015
+msgid ""
+"<h3>Newer version available</h3><p>A newer version of Rosegarden may be "
+"available.<br>Please consult the <a href=\"http://www.rosegardenmusic.com/"
+"getting/\">Rosegarden website</a> for more information.</p>"
+msgstr ""
+"<h3>Versión más actualizada disponible</h3><p>Puede que una versión más "
+"actualizada de Rosegarden esté disponible.<br>Favor de consultar el <a href="
+"\"http://www.rosegardenmusic.com/getting/\">web de Rosegarden</a> para ver "
+"más información.</p>"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:8016
+msgid "Newer version available"
+msgstr "Versión más actualizada disponible"
+
+#: ../src/gui/application/RosegardenApplication.cpp:104
+#, c-format
+msgid "Failed to load soundfont %1"
+msgstr "Fallo al cargar SoundFont %1"
+
+#: ../src/gui/application/main.cpp:311
+msgid "Rosegarden - A sequencer and musical notation editor"
+msgstr "Rosegarden - Un secuenciador y editor de partituras"
+
+#: ../src/gui/application/main.cpp:315
+msgid "Don't use the sequencer (support editing only)"
+msgstr "No utilizar el secuenciador (soportar edición sólamente)"
+
+#: ../src/gui/application/main.cpp:316
+msgid "Don't show the splash screen"
+msgstr "No mostrar el panel de bienvenida"
+
+#: ../src/gui/application/main.cpp:317
+msgid "Don't automatically run in the background"
+msgstr "No ejecutar automáticamente en segundo plano"
+
+#: ../src/gui/application/main.cpp:318
+msgid "Attach to a running sequencer process, if found"
+msgstr "Adjuntar a un proceso activo del secuenciador, si se encuentra"
+
+#: ../src/gui/application/main.cpp:319
+msgid "Ignore installed version - for devs only"
+msgstr "Ignorar versión instalada - solamente para desarrolladores"
+
+#: ../src/gui/application/main.cpp:320
+msgid "file to open"
+msgstr "archivo a abrir"
+
+#: ../src/gui/application/main.cpp:370
+msgid "Installation contains the wrong version of Rosegarden."
+msgstr "La instalación contiene una versión.incorrecta de Rosegarden"
+
+#: ../src/gui/application/main.cpp:371
+msgid ""
+" The wrong versions of Rosegarden's data files were\n"
+" found in the standard KDE installation directories.\n"
+" (I am %1, but the installed files are for version %2.)\n"
+"\n"
+" This may mean one of the following:\n"
+"\n"
+" 1. This is a new upgrade of Rosegarden, and it has not yet been\n"
+" installed. If you compiled it yourself, check that you have\n"
+" run \"make install\" and that the procedure completed\n"
+" successfully.\n"
+"\n"
+" 2. The upgrade was installed in a non-standard directory,\n"
+" and an old version was found in a standard directory. If so,\n"
+" you will need to add the correct directory to your KDEDIRS\n"
+" environment variable before you can run it."
+msgstr ""
+" Las versiones incorrectas de los archivos de datos de\n"
+" Rosegarden se han encontrado en los directorios\n"
+" estándar de instalación de KDE.\n"
+" (Este programa es %1, pero los archivos instalados son\n"
+" para la versión %2.)\n"
+"\n"
+" Esto puede ser debido a una de las siguientes razones:\n"
+"\n"
+" 1. Esta es una nueva actualización de Rosegarden, que no ha sido\n"
+" instalada todavía. Si la ha compilado usted mismo, compruebe\n"
+" que ha ejecutado \"make install\" y que el procedimiento se\n"
+" ha completado satisfactoriamente.\n"
+"\n"
+" 2. La actualización se ha instalado en un directorio no estándar,\n"
+" y una versión anterior se ha encontrado en el directorio estándar.\n"
+" Si es así, usted necesita añadir el directorio correcto a la variable\n"
+" de entorno KDEDIRS antes de ejecutar el programa. "
+
+#: ../src/gui/application/main.cpp:383 ../src/gui/application/main.cpp:401
+msgid "Installation problem"
+msgstr "Problema de instalación"
+
+#: ../src/gui/application/main.cpp:389
+msgid "Rosegarden does not appear to have been installed."
+msgstr "Rosegarden no parece haber sido instalado"
+
+#: ../src/gui/application/main.cpp:390
+msgid ""
+" One or more of Rosegarden's data files could not be\n"
+" found in the standard KDE installation directories.\n"
+"\n"
+" This may mean one of the following:\n"
+"\n"
+" 1. Rosegarden has not been correctly installed. If you compiled\n"
+" it yourself, check that you have run \"make install\" and that\n"
+" the procedure completed successfully.\n"
+"\n"
+" 2. Rosegarden has been installed in a non-standard directory,\n"
+" and you need to add this directory to your KDEDIRS environment\n"
+" variable before you can run it. This may be the case if you\n"
+" installed into $HOME or a local third-party package directory\n"
+" like /usr/local or /opt."
+msgstr ""
+" Uno o más archivos de datos de Rosegarden no se han\n"
+" encontrado en los directorios estándar de instalación de KDE.\n"
+"\n"
+" Esto puede ser debido a una de las siguientes razones:\n"
+"\n"
+" 1. Rosegarden no ha sido instalado correctamente. Si usted ha\n"
+" compilado el programa, compruebe que ha ejecutado\n"
+" \"make install\" y que el procedimiento ha concluido de\n"
+" forma satisfactoria.\n"
+"\n"
+" 2. Rosegarden ha sido instalado en un directorio no estándar,\n"
+" y se necesita añadir este directorio a la variable de entorno\n"
+" KDEDIRS antes de ejecutar el programa. Esto puede ser debido\n"
+" a la instalación en el directorio $HOME o en un directorio local\n"
+" de paquetes de terceros, como /usr/local o /opt. "
+
+#: ../src/gui/application/main.cpp:414
+msgid "Rosegarden"
+msgstr "Rosegarden"
+
+#: ../src/gui/application/main.cpp:416
+msgid ""
+"Copyright 2000 - 2008 Guillaume Laurent, Chris Cannam, Richard Bown\n"
+"Parts copyright 1994 - 2004 Chris Cannam, Andy Green, Richard Bown, "
+"Guillaume Laurent\n"
+"LilyPond fonts copyright 1997 - 2005 Han-Wen Nienhuys and Jan Nieuwenhuizen"
+msgstr ""
+"Copyright 2000 - 2008 Guillaume Laurent, Chris Cannam, Richard Bown\n"
+"Porciones copyright 1994 - 2004 Chris Cannam, Andy Green, Richard Bown, "
+"Guillaume Laurent\n"
+"Tipografías de LilyPond copyright 1997 - 2005 Han-Wen Nienhuys y Jan "
+"Nieuwenhuizen"
+
+#: ../src/gui/application/main.cpp:428
+msgid "Chord labelling code"
+msgstr "código de representación textual de acordes "
+
+#: ../src/gui/application/main.cpp:429
+msgid ""
+"LilyPond output\n"
+"assorted other patches\n"
+"i18n-ization"
+msgstr ""
+"exportación a LilyPond\n"
+"otros parches surtidos\n"
+"internacionalización "
+
+#: ../src/gui/application/main.cpp:430
+msgid ""
+"UI improvements\n"
+"bug fixes"
+msgstr ""
+"mejoras del Interfaz de Usuario\n"
+"correcciones de errores"
+
+#: ../src/gui/application/main.cpp:431
+msgid ""
+"Segment colours\n"
+"Other UI and bug fixes"
+msgstr ""
+"colores de los segmentos\n"
+"otros cambios en la Interfaz de Usuario y correcciones de errores"
+
+#: ../src/gui/application/main.cpp:432
+msgid ""
+"Russian translation\n"
+"i18n-ization"
+msgstr ""
+"traducción al ruso\n"
+"internacionalización"
+
+#: ../src/gui/application/main.cpp:433 ../src/gui/application/main.cpp:434
+msgid "German translation"
+msgstr "traducción al alemán"
+
+#: ../src/gui/application/main.cpp:435
+msgid "Welsh translation"
+msgstr "traducción al galés"
+
+#: ../src/gui/application/main.cpp:436
+msgid "French translation"
+msgstr "traducción al francés"
+
+#: ../src/gui/application/main.cpp:437
+msgid ""
+"French translation\n"
+"Bug fixes"
+msgstr ""
+"traducción al francés \n"
+"arreglo de fallos"
+
+#: ../src/gui/application/main.cpp:438 ../src/gui/application/main.cpp:439
+msgid "Italian translation"
+msgstr "traducción al italiano"
+
+#: ../src/gui/application/main.cpp:440 ../src/gui/application/main.cpp:441
+msgid "Swedish translation"
+msgstr "traducción al sueco"
+
+#: ../src/gui/application/main.cpp:442
+msgid "Estonian translation"
+msgstr "traducción al estonio"
+
+#: ../src/gui/application/main.cpp:443 ../src/gui/application/main.cpp:444
+msgid "Dutch translation"
+msgstr "traducción al holandés"
+
+#: ../src/gui/application/main.cpp:445
+msgid "HSpinBox class"
+msgstr "clase HSpinBox"
+
+#: ../src/gui/application/main.cpp:446
+msgid "Transposition by interval"
+msgstr "transporte por intervalo"
+
+#: ../src/gui/application/main.cpp:447
+msgid "Original designs for rotary controllers"
+msgstr "diseños originales para controles rotatorios"
+
+#: ../src/gui/application/main.cpp:448
+msgid "Japanese translation"
+msgstr "traducción al japonés"
+
+#: ../src/gui/application/main.cpp:449
+msgid ""
+"Auto-scroll deceleration\n"
+"Rests outside staves and other bug fixes"
+msgstr ""
+"desaceleración del desplazamiento automático\n"
+"silencios fuera del pentagrama y otras correcciones de errores"
+
+#: ../src/gui/application/main.cpp:450
+msgid "Simplified Chinese translation"
+msgstr "traducción al chino simplificado "
+
+#: ../src/gui/application/main.cpp:451
+msgid "LIRC infrared remote-controller support"
+msgstr "soporte para control remoto por infrarrojos LIRC"
+
+#: ../src/gui/application/main.cpp:452
+msgid "MTC slave timing implementation"
+msgstr "Implementación de tiempo MTC esclavo"
+
+#: ../src/gui/application/main.cpp:453
+msgid "Czech translation"
+msgstr "traducción al checo "
+
+#: ../src/gui/application/main.cpp:454
+msgid "SCons/bksys building system"
+msgstr "Sistema de construcción SCons/bksys"
+
+#: ../src/gui/application/main.cpp:455
+msgid "icons, icons, icons"
+msgstr "iconos, iconos, iconos"
+
+#: ../src/gui/application/main.cpp:456 ../src/gui/application/main.cpp:457
+#: ../src/gui/application/main.cpp:458 ../src/gui/application/main.cpp:459
+msgid "Spanish translation"
+msgstr "traducción al español "
+
+#: ../src/gui/application/main.cpp:460 ../src/gui/application/main.cpp:461
+msgid "Catalan translation"
+msgstr "traducción al catalán"
+
+#: ../src/gui/application/main.cpp:462
+msgid ""
+"1.2.3 splash screen photo\n"
+"Gave birth to D. Michael McIntyre, bought him a good flute once\n"
+"upon a time, and always humored him when he came over to play her\n"
+"some new instrument, even though she really hated his playing.\n"
+"Born October 19, 1951, died September 21, 2007, R. I. P."
+msgstr ""
+"1.2.3 fotografía splash\n"
+"Dió a luz a D. Michael McIntyre, lo compró una flauta eráse una vez\n"
+"y se murio el 21 de septiembre 2007, requiescat in pace"
+
+#: ../src/gui/application/main.cpp:463
+msgid "Initial guitar chord editing code"
+msgstr "Código fuente incial de acordes de guitarra"
+
+#: ../src/gui/application/main.cpp:464
+msgid "Polish translation"
+msgstr "traducción al polaco"
+
+#: ../src/gui/application/main.cpp:465
+msgid "Basque translation"
+msgstr "traducción al euskera"
+
+#: ../src/gui/application/main.cpp:466
+msgid "Klearlook theme"
+msgstr "tema Klearlook"
+
+#: ../src/_translatorinfo.cpp:1 ../src/gui/application/main.cpp:468
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr "Pedro López-Cabanillas,D. Michael McIntyre,Marcos Guglielmetti"
+
+#: ../src/_translatorinfo.cpp:3 ../src/gui/application/main.cpp:468
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:719
+msgid "Welcome!"
+msgstr "¡Bienvenido!"
+
+#: ../src/gui/application/main.cpp:731
+msgid ""
+"<h2>Welcome to Rosegarden!</h2><p>Welcome to the Rosegarden audio and MIDI "
+"sequencer and musical notation editor.</p><ul><li>If you have not already "
+"done so, you may wish to install some DSSI synth plugins, or a separate "
+"synth program such as QSynth. Rosegarden does not synthesize sounds from "
+"MIDI on its own, so without these you will hear nothing.</"
+"li><br><br><li>Rosegarden uses the JACK audio server for recording and "
+"playback of audio, and for playback from DSSI synth plugins. These features "
+"will only be available if the JACK server is running.</"
+"li><br><br><li>Rosegarden has comprehensive documentation: see the Help menu "
+"for the handbook, tutorials, and other information!</li></ul><p>Rosegarden "
+"was brought to you by a team of volunteers across the world. To learn more, "
+"go to <a href=\"http://www.rosegardenmusic.com/\">http://www.rosegardenmusic."
+"com/</a>.</p>"
+msgstr ""
+"<h2>¡Bienvenido a Rosegarden!</h2><p>Rosegarden es un secuenciador de audio "
+"y MIDI y un editor de partitura.</p><ul><li>Si usted ya no ha hecho esto, "
+"puede que quiere instalar algunos plugins DSSI o un softsynth como QSynth. "
+"Rosegarden no puede tocar MIDI sin ayudo de hardware (como un Sound Canvas "
+"p. ej.) o software como QSynth, o un plugin DSSI como Fluidsynth-DSSI. Sin "
+"alguno de estos (recomendamos QSynth), usted no va a oír nada de MIDI.</"
+"li><br><br><li>Rosegarden requiere el servidor de audio JACK para grabar y "
+"tocar audio, y para tocar un plugin DSSI. Estas características no estarán "
+"disponibles si Rosegarden no puede encontrar un servidor JACK.</"
+"li><br><br><li>Hay mucha documentación sobre Rosegarden, que se encuentra el "
+"menú Ayuda. Desafortunadamente, la documentacón sólo se encuentra en inglés "
+"actualmente.</li></ul><p>Rosegarden es el producto de un equipo de "
+"voluntarios en muchos paises. Para aprender más, vea<a href=\"http://www."
+"rosegardenmusic.com/\">http://www.rosegardenmusic.com/</a></p>"
+
+#: ../src/gui/application/RosegardenGUIView.cpp:257
+msgid "No non-audio segments in composition"
+msgstr "No hay segmentos no-audio en la composición"
+
+#: ../src/gui/application/RosegardenGUIView.cpp:333
+msgid "Selection must contain only audio or non-audio segments"
+msgstr "La selección sólo puede contener segmentos de Audio o de No-audio"
+
+#: ../src/gui/application/RosegardenGUIView.cpp:431
+#: ../src/gui/application/RosegardenGUIView.cpp:576
+#: ../src/gui/application/RosegardenGUIView.cpp:612
+#: ../src/gui/application/RosegardenGUIView.cpp:776
+msgid "No non-audio segments selected"
+msgstr "No hay segmentos no-audio seleccionados"
+
+#: ../src/gui/application/RosegardenGUIView.cpp:851
+msgid ""
+"You've not yet defined an audio editor for Rosegarden to use.\n"
+"See Settings -> Configure Rosegarden -> Audio."
+msgstr ""
+"No ha definido un editor de audio para que lo utilice Rosegarden.\n"
+"Vea Preferencias -> Configurar Rosegarden -> Audio"
+
+#: ../src/gui/application/RosegardenGUIView.cpp:1559
+#: ../src/gui/application/RosegardenGUIView.cpp:1564
+msgid "Can't add dropped file. "
+msgstr "No es posible añadir el archivo soltado. "
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1014
+#: ../src/gui/seqmanager/SequenceManager.cpp:1150
+msgid ""
+"The JACK Audio subsystem has failed or it has stopped Rosegarden from "
+"processing audio.\n"
+"Please restart Rosegarden to continue working with audio.\n"
+"Quitting other running applications may improve Rosegarden's performance."
+msgstr ""
+"El subsistema de Audio JACK ha muerto o ha dejado de procesar audio para "
+"Rosegarden.\n"
+"Por favor, reinicie Rosegarden para continuar trabajando con audio.\n"
+"Cierre otras aplicaciones en ejecución para mejorar el rendimiento de "
+"Rosegarden. "
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1020
+#: ../src/gui/seqmanager/SequenceManager.cpp:1156
+msgid ""
+"The JACK Audio subsystem has stopped Rosegarden from processing audio, "
+"probably because of a processing overload.\n"
+"An attempt to restart the audio service has been made, but some problems may "
+"remain.\n"
+"Quitting other running applications may improve Rosegarden's performance."
+msgstr ""
+"El subsistema de Audio JACK ha dejado de procesar audio para Rosegarden, "
+"probablemente debido a una sobrecarga de trabajo.\n"
+"Se ha realizado un intento de reiniciar el servicio, pero pueden quedar "
+"algunos problemas.\n"
+"Cerrando otras aplicaciones en ejecución puede mejorar el rendimiento de "
+"Rosegarden."
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1031
+msgid ""
+"Run out of processor power for real-time audio processing. Cannot continue."
+msgstr ""
+"Se ha sobrepasado la capacidad de proceso para audio en tiempo real. No es "
+"posible continuar."
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1057
+msgid ""
+"A serious error has occurred in the ALSA MIDI subsystem. It may not be "
+"possible to continue sequencing. Please check console output for more "
+"information."
+msgstr ""
+"Un error serio ha ocurrido en el subsistema ALSA MIDI. Puede no serposible "
+"continuar secuenciando. Por favor revisa la salida de consola para "
+"másinformación."
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1078
+msgid "JACK Audio subsystem is losing sample frames."
+msgstr "Subsistema de audio JACK está perdiendo muestras."
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1096
+msgid ""
+"Failed to read audio data from disc in time to service the audio subsystem."
+msgstr ""
+"Fallo leyendo datos de audio desde disco a tiempo para servir el subsistema "
+"de audio."
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1100
+msgid ""
+"Failed to write audio data to disc fast enough to service the audio "
+"subsystem."
+msgstr ""
+"Fallo escribiendo datos de audio en disco suficientemente rápido para servir "
+"el subsistema de audio."
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1104
+msgid "The audio mixing subsystem is failing to keep up."
+msgstr "El subsistema de mezclador de audio está fallando."
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1108
+msgid "The audio subsystem is failing to keep up."
+msgstr "El subsistema de audio está fallando"
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1112
+msgid "Unknown sequencer failure mode!"
+msgstr "Fallo desconocido del secuenciador!"
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1170
+msgid ""
+"<h3>System timer resolution is too low</h3><p>Rosegarden was unable to find "
+"a high-resolution timing source for MIDI performance.</p><p>This may mean "
+"you are using a Linux system with the kernel timer resolution set too low. "
+"Please contact your Linux distributor for more information.</p><p>Some Linux "
+"distributors already provide low latency kernels, see <a href=\"http://"
+"rosegarden.wiki.sourceforge.net/Low+latency+kernels\">http://rosegarden.wiki."
+"sourceforge.net/Low+latency+kernels</a> for instructions.</p>"
+msgstr ""
+"<h3>La resolución del temporizador del sistema es muy baja</h3><p>Rosegarden "
+"no ha sido capaz de encontrar una fuente de alta resolución para una "
+"temporización de alto rendimiento.</p><p>Esto puede significar que usted "
+"está usando un sistema Linux con la resolución del temporizador muy baja. "
+"Por favor, contacte a su distribuidor para mayor información.</p> <p>Algunas "
+"distribuciones Linux proporcionan núcleos de baja latencia, vea http://"
+"rosegarden.wiki.sourceforge.net/Low+latency+kernels para más instrucciones.</"
+"p> "
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1188
+msgid ""
+"<h3>System timer resolution is too low</h3><p>Rosegarden was unable to find "
+"a high-resolution timing source for MIDI performance.</p><p>You may be able "
+"to solve this problem by loading the RTC timer kernel module. To do this, "
+"try running <b>sudo modprobe snd-rtctimer</b> in a terminal window and then "
+"restarting Rosegarden.</p><p>Alternatively, check whether your Linux "
+"distributor provides a multimedia-optimized kernel. See <a href=\"http://"
+"rosegarden.wiki.sourceforge.net/Low+latency+kernels\">http://rosegarden.wiki."
+"sourceforge.net/Low+latency+kernels</a> for notes about this.</p>"
+msgstr ""
+"<h3>La resolución del temporizador del sistema es muy baja</h3><p>Rosegarden "
+"no ha sido capaz de encontrar una fuente de alta resolución para una "
+"temporización de alto rendimiento.</p><p>Esto puede significar que usted "
+"está usando un sistema Linux con la resolución del temporizador muy baja. "
+"Por favor, contacte a su distribuidor para mayor información.</p> <p>Algunas "
+"distribuciones Linux proporcionan núcleos de baja latencia, vea http://"
+"rosegarden.wiki.sourceforge.net/Low+latency+kernels para más instrucciones.</"
+"p>"
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1312
+msgid ""
+"<p>Both MIDI and Audio subsystems have failed to initialize.</p><p>You may "
+"continue without the sequencer, but we suggest closing Rosegarden, running "
+"\"alsaconf\" as root, and starting Rosegarden again. If you wish to run "
+"with no sequencer by design, then use \"rosegarden --nosequencer\" to avoid "
+"seeing this error in the future.</p>"
+msgstr ""
+"<p>Los subsistemas MIDI y Audio han fallado en su inicialización.</p> "
+"<p>Usted puede continuar sin el secuenciador, pero sugerimos que cierre "
+"Rosegarden, y ejecute \"alsaconf\" como usuario administrador, reiniciando "
+"Rosegarden de nuevo. Si desea utilizar Rosegarden sin secuenciador, entonces "
+"puede ejecutar \"rosegarden --nosequencer\" para evitar la aparición de "
+"este mensaje de error en el futuro.</p>"
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1314
+msgid ""
+"<p>The MIDI subsystem has failed to initialize.</p><p>You may continue "
+"without the sequencer, but we suggest closing Rosegarden, running \"modprobe "
+"snd-seq-midi\" as root, and starting Rosegarden again. If you wish to run "
+"with no sequencer by design, then use \"rosegarden --nosequencer\" to avoid "
+"seeing this error in the future.</p>"
+msgstr ""
+"<p>El subsistema MIDI ha fallado en su inicialización.</p><p> Usted puede "
+"continuar sin el secuenciador, pero sugerimos que cierre Rosegarden, ejecute "
+"\"modprobe snd-seq-midi\" como usuario administrador, y reinicie Rosegarden "
+"de nuevo. Si desea utilizar Rosegarden sin el secuenciador, entonces ejecute "
+"\"rosegarden --nosequencer\" para evitar la aparición de este mensaje de "
+"error en el futuro.</p>"
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1316
+msgid ""
+"<p>The Rosegarden sequencer module version does not match the GUI module "
+"version.</p><p>You have probably mixed up files from two different versions "
+"of Rosegarden. Please check your installation.</p>"
+msgstr ""
+"<p> La versión del módulo secuenciador de Rosegarden no coincide con la "
+"versión del módulo IGU.</p> <p> Usted probablemente ha mezclado archivos "
+"procedentes de dos versiones diferentes de Rosegarden. Por favor, compruebe "
+"su instalación.</p>"
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1322
+#, c-format
+msgid "<h3>Sequencer startup failed</h3>%1"
+msgstr "<h3>La inicialización del secuenciador ha fallado</h3> %1"
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1330
+msgid ""
+"<h3>Failed to connect to JACK audio server.</h3><p>Rosegarden could not "
+"connect to the JACK audio server. This probably means the JACK server is "
+"not running.</p><p>If you want to be able to play or record audio files or "
+"use plugins, you should exit Rosegarden and start the JACK server before "
+"running Rosegarden again.</p>"
+msgstr ""
+"<h3> Ha fallado la conexión al servidor de audio JACK</h3> <p> Rosegarden no "
+"ha podido conectar con el servidor de audio JACK. Esto significa "
+"probablemente que el servidor JACK no está funcionando.</p><p> Si usted "
+"quiere ser capaz de reproducir o grabar archivos de audio o utilizar "
+"\"plugins\", debería cerrar Rosegarden e iniciar el servidor JACK antes de "
+"ejecutar Rosegarden de nuevo.</p> "
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1331
+msgid "Failed to connect to JACK"
+msgstr "La conexión a JACK ha fallado"
+
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:46
+msgid "Modify MIDI filters..."
+msgstr "Modificar filtros MIDI..."
+
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:58
+msgid "THRU events to ignore"
+msgstr "Eventos THRU para ignorar"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:131
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:60
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:96
+msgid "Note"
+msgstr "Nota"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:132
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:61
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:97
+msgid "Program Change"
+msgstr "Cambio de Programa"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:136
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:62
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:98
+msgid "Key Pressure"
+msgstr "Presión de Tecla"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:137
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:63
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:99
+msgid "Channel Pressure"
+msgstr "Presión de Canal"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:134
+#: ../src/gui/general/EditView.cpp:899
+#: ../src/gui/rulers/ControllerEventsRuler.cpp:198
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:64
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:100
+msgid "Pitch Bend"
+msgstr "Inflexión de Tono"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:133
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:65
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:101
+msgid "Controller"
+msgstr "Controlador"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:135
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:66
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:102
+msgid "System Exclusive"
+msgstr "Sistema Exclusivo"
+
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:94
+msgid "RECORD events to ignore"
+msgstr "Eventos RECORD para ignorar"
+
+#: ../src/gui/widgets/TimeWidget.cpp:101
+msgid "Note:"
+msgstr "Nota:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:108 ../src/gui/widgets/TimeWidget.cpp:145
+msgid "<inexact>"
+msgstr "<inexacto>"
+
+#: ../src/gui/widgets/TimeWidget.cpp:151
+msgid "Units:"
+msgstr "Unidades:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:173
+msgid "Time:"
+msgstr "Tiempo:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:184
+msgid "units"
+msgstr "unidades"
+
+#: ../src/gui/widgets/TimeWidget.cpp:193
+msgid "Measures:"
+msgstr "Compases:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:193
+msgid "Measure:"
+msgstr "Compás:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:212
+msgid "beats:"
+msgstr "partes"
+
+#: ../src/gui/widgets/TimeWidget.cpp:212
+msgid "beat:"
+msgstr "parte:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:230
+msgid "%1:"
+msgstr "%1:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:254
+msgid "Seconds:"
+msgstr "Segundos:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:273
+msgid "msec:"
+msgstr "milisegundos:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:407 ../src/gui/widgets/TimeWidget.cpp:531
+msgid "(%1/%2 time)"
+msgstr "(ritmo %1/%2)"
+
+#: ../src/gui/widgets/TimeWidget.cpp:452
+msgid "(starting %1.%2 qpm, %2.%3 bpm)"
+msgstr "(empezando %1.%2 npm, %2.%3 ppm)"
+
+#: ../src/gui/widgets/TimeWidget.cpp:458
+msgid "(starting %1.%2 bpm)"
+msgstr "(empezando %1.%2 npm)"
+
+#: ../src/gui/widgets/TimeWidget.cpp:464
+msgid "(%1.%2 qpm, %2.%3 bpm)"
+msgstr "(%1.%2 npm, %2.%3 ppm)"
+
+#: ../src/gui/widgets/TimeWidget.cpp:470
+msgid "(%1.%2 bpm)"
+msgstr "(%1.%2 npm)"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:239
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:60
+msgid "C"
+msgstr "Do"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:241
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:61
+msgid "D"
+msgstr "Re"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:243
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:62
+msgid "E"
+msgstr "Mi"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:244
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:63
+msgid "F"
+msgstr "Fa"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:246
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:64
+msgid "G"
+msgstr "Sol"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:248
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:65
+msgid "A"
+msgstr "La"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:250
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:66
+msgid "B"
+msgstr "Si"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:70
+msgid "-2"
+msgstr "-2"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:71
+msgid "-1"
+msgstr "-1"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:72
+msgid "0"
+msgstr "0"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:73
+msgid "1"
+msgstr "1"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:74
+msgid "2"
+msgstr "2"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:75
+msgid "3"
+msgstr "3"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:76
+msgid "4"
+msgstr "4"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:77
+msgid "5"
+msgstr "5"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:78
+msgid "6"
+msgstr "6"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:79
+msgid "7"
+msgstr "7"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:83
+msgid "double flat"
+msgstr "doble bemol"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:84
+msgid "flat"
+msgstr "bemol"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:85
+msgid "natural"
+msgstr "natural"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:86
+msgid "sharp"
+msgstr "sostenido"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:87
+msgid "double sharp"
+msgstr "doble sostenido"
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:234
+#, c-format
+msgid "In %1"
+msgstr "E.%1"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:587
+#: ../src/gui/widgets/AudioRouteMenu.cpp:236
+#: ../src/gui/widgets/AudioRouteMenu.cpp:259
+msgid "Master"
+msgstr "Master"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:528
+#: ../src/gui/widgets/AudioRouteMenu.cpp:238
+#: ../src/gui/widgets/AudioRouteMenu.cpp:261
+#, c-format
+msgid "Sub %1"
+msgstr "Sub %1"
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:244
+msgid "In %1 R"
+msgstr "Entrada %1 R"
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:245
+msgid "In %1 L"
+msgstr "Entrada %1 L"
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:247
+msgid "Master R"
+msgstr "Maestro R"
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:248
+msgid "Master L"
+msgstr "Maestro L"
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:250
+msgid "Sub %1 R"
+msgstr "Sub %1 R"
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:251
+msgid "Sub %1 L"
+msgstr "Sub %1 L"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:391
+#: ../src/gui/studio/AudioMixerWindow.cpp:522
+#: ../src/gui/widgets/AudioFaderBox.cpp:82
+msgid "Audio plugin button"
+msgstr "Botón de plugin de Audio"
+
+#: ../src/gui/editors/parameters/AudioInstrumentParameterPanel.cpp:129
+#: ../src/gui/editors/parameters/AudioInstrumentParameterPanel.cpp:357
+#: ../src/gui/widgets/AudioFaderBox.cpp:91
+msgid "<no synth>"
+msgstr "<sin sinte>"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:93
+msgid "Synth plugin button"
+msgstr "Botón de plugin de Sintetizador"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:153
+msgid "Set the audio pan position in the stereo field"
+msgstr "Establecer la posición de panorama de audio en el campo estéreo"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:155
+msgid "Open synth plugin's native editor"
+msgstr "Abrir el editor nativo del plugin de sintetizador"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:157
+msgid "Mono or Stereo Instrument"
+msgstr "Instrumento Mono o Estéreo"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:159
+msgid "Record level"
+msgstr "Nivel de grabación"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:161
+msgid "Playback level"
+msgstr "Nivel de reproducción"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:345
+#: ../src/gui/studio/AudioMixerWindow.cpp:347
+#: ../src/gui/studio/AudioMixerWindow.cpp:503
+#: ../src/gui/studio/AudioMixerWindow.cpp:505
+#: ../src/gui/widgets/AudioFaderBox.cpp:163
+msgid "Audio level"
+msgstr "Nivel de Audio"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:170
+msgid "In:"
+msgstr "Entrada:"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:173
+msgid "Out:"
+msgstr "Salida:"
+
+#: ../src/gui/widgets/ProgressDialog.cpp:48
+#: ../src/gui/widgets/ProgressDialog.cpp:53
+#: ../src/gui/widgets/ProgressDialog.cpp:76
+msgid "Processing..."
+msgstr "Procesando..."
+
+#: ../src/gui/configuration/ColourConfigurationPage.h:60
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:130
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:346
+#: ../src/gui/widgets/ColourTable.cpp:52
+msgid "Color"
+msgstr "Color"
+
+#: ../src/gui/widgets/ColourTable.cpp:68
+msgid "Modify Color Name"
+msgstr "Modificar Nombre de Color"
+
+#: ../src/gui/configuration/ColourConfigurationPage.cpp:129
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:983
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:882
+#: ../src/gui/widgets/ColourTable.cpp:68
+msgid "Enter new name"
+msgstr "Introducir nuevo nombre"
+
+#: ../src/gui/widgets/ColourTable.cpp:107
+msgid "Default Color"
+msgstr "Color por Omisión"
+
+#: ../src/gui/widgets/Rotary.cpp:108
+msgid ""
+"Click and drag up and down or left and right to modify.\n"
+"Double click to edit value directly."
+msgstr ""
+"Hacer clic y arrastrar arriba y abajo o a izquierda y derecha para "
+"modificar.\n"
+"Doble clic para editar el valor directamente."
+
+#: ../src/gui/widgets/Rotary.cpp:433
+msgid "Select a new value"
+msgstr "Seleccionar un nuevo valor"
+
+#: ../src/gui/widgets/Rotary.cpp:434
+msgid "Enter a new value"
+msgstr "Introducir nuevo valor"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:80
+msgid "Quantizer"
+msgstr "Cuantificación"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:86
+msgid "Quantizer type:"
+msgstr "Tipo de cuantificación:"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:88
+msgid "Grid quantizer"
+msgstr "Cuantificador de rejilla"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:89
+msgid "Legato quantizer"
+msgstr "Cuantificador de ligadura"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:90
+msgid "Heuristic notation quantizer"
+msgstr "Cuantificador heurístico de partitura"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:94
+msgid "Quantize for notation only (leave performance unchanged)"
+msgstr ""
+"Cuantificar para la partitura solamente (dejar la interpretación intacta)"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:104
+msgid "Notation parameters"
+msgstr "Parámetros de edición de partitura"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:109
+#: ../src/gui/widgets/QuantizeParameters.cpp:150
+msgid "Base grid unit:"
+msgstr "Unidad base de la rejilla:"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:114
+msgid "Complexity:"
+msgstr "Complejidad:"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:118
+msgid "Very high"
+msgstr "Muy alta"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:119
+msgid "High"
+msgstr "Alta"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:224
+#: ../src/gui/widgets/QuantizeParameters.cpp:120
+msgid "Normal"
+msgstr "Normal"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:121
+msgid "Low"
+msgstr "Baja"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:122
+msgid "Very low"
+msgstr "Muy baja"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:125
+msgid "Tuplet level:"
+msgstr "Nivel de grupo irregular"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:129
+msgid "2-in-the-time-of-3"
+msgstr "Dosillo"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4241
+#: ../src/gui/widgets/QuantizeParameters.cpp:130
+msgid "Triplet"
+msgstr "Tresillo"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:138
+msgid "Any"
+msgstr "Cualquiera"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:141
+msgid "Permit counterpoint"
+msgstr "Permitir contrapunto"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:145
+msgid "Grid parameters"
+msgstr "Parámetros de rejilla"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:154
+msgid "Swing:"
+msgstr "Swing:"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:159
+msgid "Iterative amount:"
+msgstr "Cantidad de iteración:"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:165
+msgid "Quantize durations as well as start times"
+msgstr "Cuantificar duraciones y momentos de inicio"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:169
+msgid "After quantization"
+msgstr "Después de cuantificar"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:183
+msgid "Show advanced options"
+msgstr "Mostrar opciones avanzadas"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:192
+msgid "Re-beam"
+msgstr "volver a unir plicas"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:194
+msgid "Add articulations (staccato, tenuto, slurs)"
+msgstr "Añadir articulaciones (staccato, tenuto, ligaduras)"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:195
+msgid "Tie notes at barlines etc"
+msgstr "Ligar notas en las barras de compás, etc."
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:196
+msgid "Split-and-tie overlapping chords"
+msgstr "Dividir-y-ligar acordes solapados"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:307
+msgid "Full quantize"
+msgstr "Cuantificador completo"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:450
+msgid "Show Advanced Options"
+msgstr "Mostrar Opciones Avanzadas"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:454
+msgid "Hide Advanced Options"
+msgstr "Ocultar Opciones Avanzadas"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:257
+#: ../src/gui/configuration/MatrixConfigurationPage.h:56
+#: ../src/gui/configuration/MatrixConfigurationPage.h:57
+#: ../src/gui/editors/matrix/MatrixView.cpp:2709
+msgid "Matrix"
+msgstr "Matriz"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:64
+msgid "Printable headers"
+msgstr "Cabeceras imprimibles"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:92
+msgid "Dedication"
+msgstr "Dedicatoria"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:96
+#: ../src/gui/editors/segment/PlayListView.cpp:35
+msgid "Title"
+msgstr "Título"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:100
+msgid "Subtitle"
+msgstr "Subtítulo"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:104
+msgid "Subsubtitle"
+msgstr "Sub-subtítulo"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:108
+msgid "Poet"
+msgstr "Letrista"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:116
+msgid "Composer"
+msgstr "Compositor"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:120
+msgid "Meter"
+msgstr "Compás"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:124
+msgid "Arranger"
+msgstr "Arreglista"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:128
+msgid "Piece"
+msgstr "Pieza"
+
+#: ../data/fonts/mappings/fonts.cpp:26
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:132
+msgid "Opus"
+msgstr "Opus"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:136
+msgid "Copyright"
+msgstr "Copyright"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:140
+msgid "Tagline"
+msgstr "Lema"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:155
+msgid "The composition comes here."
+msgstr "La composición comienza aquí"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:172
+msgid "Non-printable headers"
+msgstr "Cabeceras imprimibles"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:213
+msgid "Add New Property"
+msgstr "Añadir nueva propiedad"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:217
+msgid "Delete Property"
+msgstr "Borrar Propiedad"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:236
+msgid "{new property %1}"
+msgstr "{nueva propiedad %1}"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:236
+msgid "{new property}"
+msgstr "{nueva propiedad}"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:243
+msgid "{undefined}"
+msgstr "{indefinido}"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:87
+msgid "Double-click opens segment in"
+msgstr "Doble-clic abre el segmento en el"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:91
+msgid "Notation editor"
+msgstr "Editor de partitura"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:92
+msgid "Matrix editor"
+msgstr "Editor de matriz"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:93
+msgid "Event List editor"
+msgstr "Editor de lista de eventos"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:99
+msgid "Number of count-in measures when recording"
+msgstr "Número de compases previos a la grabación"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:109
+msgid "Auto-save interval"
+msgstr "Intervalo de archivado automático"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:112
+msgid "Every 30 seconds"
+msgstr "Cada 30 segundos"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:113
+msgid "Every minute"
+msgstr "Cada minuto"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:114
+msgid "Every five minutes"
+msgstr "Cada cinco minutos"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:115
+msgid "Every half an hour"
+msgstr "Cada media hora"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:116
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:277
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:157
+msgid "Never"
+msgstr "Nunca"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:140
+msgid "Use JACK transport"
+msgstr "Utilizar transporte de JACK"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:173
+msgid "Unknown"
+msgstr "Desconocida"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:179
+msgid "No MIDI, audio OK"
+msgstr "No MIDI, audio OK"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:182
+msgid "MIDI OK, no audio"
+msgstr "MIDI OK, no audio"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:185
+msgid "MIDI OK, audio OK"
+msgstr "MIDI OK, audio OK"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:188
+msgid "No driver"
+msgstr "No interprete"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:195
+msgid "Details..."
+msgstr "Detalles..."
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:204
+msgid "Behavior"
+msgstr "Comportamiento "
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:219
+msgid "Side-bar parameter box layout"
+msgstr "Estilo del área lateral de cajas de parámetros"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:223
+msgid "Vertically stacked"
+msgstr "Apilado verticalmente"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:225
+msgid "Tabbed"
+msgstr "Pestañas"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:233
+msgid "Note name style"
+msgstr "Estilo de nombres de notas"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:237
+msgid "Always use US names (e.g. quarter, 8th)"
+msgstr "Usar siempre nombres americanos (ej. quarter, 8th)"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:238
+msgid "Localized (where available)"
+msgstr "Traducido (si está disponible) "
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:252
+msgid "Show textured background on"
+msgstr "Mostrar fondo con textura en"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:254
+msgid "Main window"
+msgstr "Ventana principal"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:275
+msgid "Use bundled Klearlook theme"
+msgstr "Utilizar el tema Klearlook interno"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:278
+msgid "When not running under KDE"
+msgstr "Cuando no se ejecute bajo KDE"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:279
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:159
+msgid "Always"
+msgstr "Siempre"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:287
+msgid "Presentation"
+msgstr "Presentación "
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:423
+msgid ""
+"Changes to the textured background in the main window will not take effect "
+"until you restart Rosegarden."
+msgstr ""
+"Los cambios a la textura de fondo en la ventana principal no hacen efecto "
+"hasta que usted reinicie Rosegarden"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:168
+#: ../src/gui/configuration/GeneralConfigurationPage.h:78
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:207
+#: ../src/gui/configuration/MatrixConfigurationPage.cpp:59
+msgid "General"
+msgstr "General"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.h:79
+msgid "General Configuration"
+msgstr "Configuración General"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:92
+msgid "Base octave number for MIDI pitch display"
+msgstr "Número de octava base para mostrar tono MIDI"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:107
+msgid "Always use default studio when loading files"
+msgstr "Usar siempre estudio por omisión al cargar archivos"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:119
+msgid "Send all MIDI Controllers at start of each playback"
+msgstr "Enviar todos los controles MIDI al principio de la reproducción"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:121
+msgid ""
+"Rosegarden can send all MIDI Controllers (Pan, Reverb etc) to all MIDI "
+"devices every\n"
+"time you hit play if you so wish. Please note that this option will usually "
+"incur a\n"
+"delay at the start of playback due to the amount of data being transmitted."
+msgstr ""
+"Rosegarden puede enviar todos los Controladores MIDI (Pan, Reverberación, "
+"etc) a todos los dispositivos MIDI cada vez que usted pulse reproducción si "
+"así lo desea. Por favor, tenga en cuenta que esta opción retrasará el "
+"comienzode la reproducción debido a la cantidad de información transmitida."
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:138
+msgid "Sequencer timing source"
+msgstr "Temporizador del secuenciador"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:163
+msgid "Load SoundFont to SoundBlaster card at startup"
+msgstr "Cargar fuente de sonidos en la tarjeta SoundBlaster al inicio"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:164
+msgid ""
+"Check this box to enable soundfont loading on EMU10K-based cards when "
+"Rosegarden is launched"
+msgstr ""
+"Seleccionar esta opción para habilitar la carga de un SoundFont en tarjetas "
+"basadas en EMU10K al iniciar Rosegarden"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:173
+msgid "Path to 'asfxload' or 'sfxload' command"
+msgstr "Camino al mandato 'asfxload' o bien 'sfxload'"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:180
+msgid "SoundFont"
+msgstr "SoundFont"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:223
+msgid "MIDI Clock and System messages"
+msgstr "Mensajes de Reloj MIDI y Sistema"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:229
+msgid "Send MIDI Clock, Start and Stop"
+msgstr "Enviar mensajes de Start y Stop"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:230
+msgid "Accept Start, Stop and Continue"
+msgstr "Aceptar Start, Stop y Continue "
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:241
+msgid "MIDI Machine Control mode"
+msgstr "Modo de MIDI Machine Control"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:248
+msgid "MMC Master"
+msgstr "MMC Mestro"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:249
+msgid "MMC Slave"
+msgstr "MMC Esclavo"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:260
+msgid "MIDI Time Code mode"
+msgstr "Modo MIDI Time Code"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:267
+msgid "MTC Master"
+msgstr "Maestro MTC"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:268
+msgid "MTC Slave"
+msgstr "MTC Esclavo"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:281
+msgid "Automatically connect sync output to all devices in use"
+msgstr ""
+"Conectar automáticamente la salida de sincronización a todos los "
+"dispositivos en uso"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:292
+msgid "MIDI Sync"
+msgstr "Sincronización MIDI"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:308
+msgid "sfxload path"
+msgstr "camino de sfxload"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:315
+msgid "Soundfont path"
+msgstr "Camino de SoundFont"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:67
+msgid "%1 minutes %2.%3%4 seconds (%5 units, %6 measures)"
+msgstr "%1 minutos %2.%3%4 segundos (%5 unidades, %6 compases)"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:133
+msgid "Filename:"
+msgstr "Nombre de archivo:"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:136
+msgid "Formal duration (to end marker):"
+msgstr "Duración formal (hasta el marcador final)"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:141
+msgid "Playing duration:"
+msgstr "Duración de la reproducción:"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:146
+msgid "Tracks:"
+msgstr "Pistas:"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:147
+msgid "%1 used, %2 total"
+msgstr "%1 usado, %2 total"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:152
+msgid "Segments:"
+msgstr "Segmentos:"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:153
+msgid "%1 MIDI, %2 audio, %3 total"
+msgstr "%1 MIDI, %2 audio, %3 total"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:161
+msgid "Statistics"
+msgstr "Estadísticas"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:170
+#: ../src/gui/editors/parameters/InstrumentParameterBox.cpp:155
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:92
+msgid "Track"
+msgstr "Pista"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:171
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:125
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:90
+msgid "Label"
+msgstr "Etiqueta"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:172
+msgid "Time"
+msgstr "Tiempo"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:174
+msgid "Events"
+msgstr "Eventos"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:175
+msgid "Polyphony"
+msgstr "Polifonía"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:176
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:126
+msgid "Repeat"
+msgstr "Repetir"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:178
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:128
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:305
+#: ../src/gui/general/EditView.cpp:1488
+msgid "Transpose"
+msgstr "Transportar"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:179
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:129
+msgid "Delay"
+msgstr "Retardo"
+
+#: ../src/gui/configuration/AudioConfigurationPage.h:61
+#: ../src/gui/configuration/AudioPropertiesPage.h:58
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:204
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:523
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:524
+msgid "Audio"
+msgstr "Audio "
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:204
+#: ../src/gui/configuration/MIDIConfigurationPage.h:62
+msgid "MIDI"
+msgstr "MIDI"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:317
+msgid "Segment Summary"
+msgstr "Resumen del Segmento"
+
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:63
+msgid "Audio file path:"
+msgstr "Camino de los archivos de audio"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:137
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:68
+msgid "Choose..."
+msgstr "Elegir... "
+
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:73
+msgid "Disk space remaining:"
+msgstr "Espacio libre en disco disponible:"
+
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:78
+msgid "Equivalent minutes of 16-bit stereo:"
+msgstr "Equivalencia en minutos de sonido estéreo a 16 bits:"
+
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:90
+msgid "Modify audio path"
+msgstr "Modificar camino de archivos de audio"
+
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:113
+msgid "%1 out of %2 (%3% used)"
+msgstr "%1 de %2 (%3% usado)"
+
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:144
+msgid "minutes at"
+msgstr "minutos en"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.h:63
+msgid "MIDI Settings"
+msgstr "Preferencias de MIDI"
+
+#: ../src/gui/configuration/AudioConfigurationPage.h:62
+#: ../src/gui/configuration/AudioPropertiesPage.h:59
+msgid "Audio Settings"
+msgstr "Opciones de Audio"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:87
+msgid "Default layout mode"
+msgstr "Modo de formato predeterminado"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:91
+msgid "Linear layout"
+msgstr "Formato lineal"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:92
+msgid "Continuous page layout"
+msgstr "Distribución de página continuo"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:93
+msgid "Multiple page layout"
+msgstr "Distribución de página múltiple"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:101
+msgid "Default spacing"
+msgstr "Espaciado predeterminado"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:125
+msgid "Default duration factor"
+msgstr "Factor de duración predeterminado"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:141
+msgid "Full"
+msgstr "Lleno"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:152
+msgid "Show track headers (linear layout only)"
+msgstr "Mostrar cabeceras de pista (formato linear únicamente)"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:158
+msgid "When needed"
+msgstr "Si sea necesario"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:166
+msgid ""
+"\"Always\" and \"Never\" mean what they usually mean\n"
+"\"When needed\" means \"when staves are too many to all fit in the current "
+"window\""
+msgstr ""
+"«Siempre» y «Nunca» significan lo normal\n"
+"«Si sea necesario» significa «cuando hayan demasiados pentagramas y no caban "
+"en la ventana corriente»"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:178
+msgid "Show non-notation events as question marks"
+msgstr "Mostrar eventos no representables como signos de interrogación"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:188
+msgid "Show notation-quantized notes in a different color"
+msgstr "Mostrar notas cuantificadas en un color diferente"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:198
+msgid "Show \"invisible\" events in grey"
+msgstr "Mostrar eventos \"invisibles\" en gris"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:208
+msgid "Show notes outside suggested playable range in red"
+msgstr "Mostrar notas afuera del ámbito sugerido en rojo"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:218
+msgid "Highlight superimposed notes with a halo effect"
+msgstr "Destacar notas superpuestas con un efecto de halo"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:231
+msgid "When recording MIDI, split-and-tie long notes at barlines"
+msgstr "Al grabar MIDI, dividir y ligar notas largas en divisiones de compás"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:242
+msgid "Layout"
+msgstr "Formato"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:255
+msgid "Default note style for new notes"
+msgstr "Estilo de nota predeterminado para nuevas notas"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:287
+msgid "When inserting notes..."
+msgstr "Al insertar notas..."
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:294
+msgid "Split notes into ties to make durations match"
+msgstr "Dividir notas en ligaduras para hacer coincidir la duración"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:295
+msgid "Ignore existing durations"
+msgstr "Ignorar duraciones existentes"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:305
+msgid "Auto-beam on insert when appropriate"
+msgstr "Unión automática de plicas al insertar cuando sea apropiado"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:317
+#: ../src/gui/editors/notation/NotationEraser.cpp:54
+msgid "Collapse rests after erase"
+msgstr "Fusionar silencios tras el borrado"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:328
+msgid "Default paste type"
+msgstr "Tipo de pegado predeterminado"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:350
+msgid "Editing"
+msgstr "Edición"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:362
+msgid "Accidentals in one octave..."
+msgstr "Alteraciones en una octava..."
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:364
+msgid "Affect only that octave"
+msgstr "Afectar únicamente esa octava"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:365
+msgid "Require cautionaries in other octaves"
+msgstr "Requerir precautorias en otras octavas"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:366
+msgid "Affect all subsequent octaves"
+msgstr "Afectar a todas las octavas siguientes"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:374
+msgid "Accidentals in one bar..."
+msgstr "Alteraciones en un compás..."
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:376
+msgid "Affect only that bar"
+msgstr "Afectar sólamente ese compás"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:377
+msgid "Require cautionary resets in following bar"
+msgstr "Requerir anulaciones precautorias en el compás siguiente"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:378
+msgid "Require explicit resets in following bar"
+msgstr "Requerir anulaciones explícitas en el compás siguiente"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:386
+msgid "Key signature cancellation style"
+msgstr "Estilo de cancellación de la armadura"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:388
+msgid "Cancel only when entering C major or A minor"
+msgstr "Cancelar sólamente al entrar en Do mayor o La menor"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:389
+msgid "Cancel whenever removing sharps or flats"
+msgstr "Cancelar al reducir sostenidos o bemoles"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:390
+msgid "Cancel always"
+msgstr "Cancelar siempre"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:400
+msgid "Accidentals"
+msgstr "Alteraciones"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:441
+msgid "Notation font"
+msgstr "Tipografía de partitura"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:467
+msgid "Origin:"
+msgstr "Origen: "
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:471
+msgid "Copyright:"
+msgstr "Copyright: "
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:475
+msgid "Mapped by:"
+msgstr "Mapeado por:"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:479
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:81
+msgid "Type:"
+msgstr "Tipo: "
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:508
+msgid "Font size for single-staff views"
+msgstr "Tamaño de tipografía para la vista de un solo pentagrama"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:516
+msgid "Font size for multi-staff views"
+msgstr "Tamaño de tipografía para la vista de varios pentagramas"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:524
+msgid "Font size for printing (pt)"
+msgstr "Tamaño de tipografía para imprimir (pt)"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:541
+msgid "Text font"
+msgstr "Tipografía de texto"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:549
+msgid "Sans-serif font"
+msgstr "Tipografía sans-serif"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:664
+msgid "%1 (smooth)"
+msgstr "%1 (suave)"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:667
+msgid "%1 (jaggy)"
+msgstr "%1 (dentado)"
+
+#: ../src/gui/configuration/LatencyConfigurationPage.cpp:58
+msgid "JACK latency"
+msgstr "latencia de JACK"
+
+#: ../src/gui/configuration/LatencyConfigurationPage.cpp:61
+msgid ""
+"Use the \"Fetch JACK latencies\" button to discover the latency values set "
+"at\n"
+"the sequencer. It's recommended that you use the returned values but it's "
+"also\n"
+"possible to override them manually using the sliders. Note that if you "
+"change\n"
+"your JACK server parameters you should always fetch the latency values "
+"again.\n"
+"The latency values will be stored by Rosegarden for use next time."
+msgstr ""
+"Utilice el botón \"Obtener latencias de JACK\" para descubrir los valores "
+"establecidos\n"
+"en el secuenciador. Es recomendable utilizar los valores devueltos, pero "
+"también es\n"
+"posible establecerlos manualmente usando los deslizadores. Observe que si "
+"modifica\n"
+"los parámetros de su servidor JACK debería siempre recuperar los valores de "
+"latencia\n"
+"otra vez. Los valores de latencia se almacenarán por Rosegarden para su uso "
+"futuro."
+
+#: ../src/gui/configuration/LatencyConfigurationPage.cpp:65
+msgid "JACK playback latency (in ms)"
+msgstr "Latencia de reproducción de JACK (en ms)"
+
+#: ../src/gui/configuration/LatencyConfigurationPage.cpp:66
+msgid "JACK record latency (in ms)"
+msgstr "Latencia de grabación de JACK (en ms)"
+
+#: ../src/gui/configuration/LatencyConfigurationPage.cpp:68
+msgid "Fetch JACK latencies"
+msgstr "Obtener latencias de JACK"
+
+#: ../src/gui/configuration/LatencyConfigurationPage.cpp:121
+msgid "JACK Latency"
+msgstr "Latencia de JACK"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:92
+msgid "Audio preview scale"
+msgstr "Escala de pre-visualización de audio"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:96
+msgid "Linear - easier to see loud peaks"
+msgstr "Lineal - se ven más fácilmente los máximos de volumen"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:97
+msgid "Meter scaling - easier to see quiet activity"
+msgstr "Medida a escala - se ven más fácilmente los momentos tranquilos"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:105
+msgid "Record audio files as"
+msgstr "Grabar archivos de audio como "
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:107
+msgid "16-bit PCM WAV format (smaller files)"
+msgstr "formato WAV 16-bit PCM (archivos más pequeños)"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:108
+msgid "32-bit float WAV format (higher quality)"
+msgstr "formato WAV 32-bit flotante (mayor calidad)"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:117
+msgid "External audio editor"
+msgstr "Editor externo de audio"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:145
+msgid "Create JACK outputs"
+msgstr "Crear salidas de JACK"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:150
+msgid "for individual audio instruments"
+msgstr "para instrumentos de audio individuales"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:157
+msgid "for submasters"
+msgstr "para submasters"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:184
+msgid ""
+"Rosegarden can start the JACK audio daemon (jackd) for you automatically if "
+"it isn't already running when Rosegarden starts.\n"
+"\n"
+"This is recommended for beginners and those who use Rosegarden as their main "
+"audio application, but it might not be to the liking of advanced users.\n"
+"\n"
+"If you want to start JACK automatically, make sure the command includes a "
+"full path where necessary as well as any command-line arguments you want to "
+"use.\n"
+"\n"
+"For example: /usr/local/bin/jackd -d alsa -d hw -r44100 -p 2048 -n 2\n"
+"\n"
+msgstr ""
+"Rosegarden puede iniciar automáticamente el demonio de audio JACK (jackd)\n"
+" si todavía no está corriendo cuando se inicia Rosegarden.\n"
+"\n"
+"Esto es recomendable para usuarios noveles y para quienes usan Rosegarden "
+"como su aplicación principal de audio, pero puede no ser adecuado para "
+"usuarios avanzados.\n"
+"\n"
+"Si usted quiere iniciar JACK automáticamente, asegúrese de que el mandato "
+"incluye un camino completo cuando sea necesario, así como los argumentos de "
+"línea de mandatos que desee usar.\n"
+"\n"
+"Por ejemplo: /usr/local/bin/jackd -d alsa -d hw -r 44100 -p 2048 -n 2\n"
+"\n"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:196
+msgid "Start JACK when Rosegarden starts"
+msgstr "Iniciar JACK al iniciar Rosegarden"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:201
+msgid "JACK command"
+msgstr "Mandato JACK"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:214
+msgid "JACK Startup"
+msgstr "Inicio de JACK"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:224
+msgid "External audio editor path"
+msgstr "Camino del editor externo de audio"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:262
+msgid "External audio editor \"%1\" not found or not executable"
+msgstr "Editor externo de audio \"%1\" no encontrado o no ejecutable"
+
+#: ../src/gui/configuration/ColourConfigurationPage.cpp:70
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:448
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:863
+msgid "Add New Color"
+msgstr "Añadir Nuevo Color"
+
+#: ../src/gui/configuration/ColourConfigurationPage.cpp:74
+msgid "Delete Color"
+msgstr "Borrar Color"
+
+#: ../src/gui/configuration/ColourConfigurationPage.cpp:93
+msgid "Color Map"
+msgstr "Mapa de Color"
+
+#: ../src/gui/configuration/ColourConfigurationPage.cpp:128
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:983
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:882
+msgid "New Color Name"
+msgstr "Nombre del Nuevo Color"
+
+#: ../src/gui/configuration/ColourConfigurationPage.cpp:130
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:59
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:984
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:883
+#: ../src/gui/studio/DeviceManagerDialog.cpp:115
+#: ../src/gui/studio/DeviceManagerDialog.cpp:174
+msgid "New"
+msgstr "Nuevo"
+
+#: ../src/gui/configuration/LatencyConfigurationPage.h:62
+msgid "Latency"
+msgstr "Latencia "
+
+#: ../src/gui/configuration/LatencyConfigurationPage.h:63
+msgid "Sequencer Latency"
+msgstr "Latencia del secuenciador"
+
+#: ../src/gui/configuration/ColourConfigurationPage.h:61
+msgid "Color Settings"
+msgstr "Opciones de Color"
+
+#: ../src/gui/studio/MidiDeviceListViewItem.cpp:55
+#: ../src/gui/studio/MidiKeyMapListViewItem.cpp:44
+msgid "Key Mapping"
+msgstr "Mapa del teclado"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:97
+msgid "Manage MIDI Banks and Programs"
+msgstr "Gestionar Bancos y Programas MIDI"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:128
+msgid "MIDI Device"
+msgstr "Dispositivo MIDI"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:130
+#: ../src/gui/studio/BankEditorDialog.cpp:219
+msgid "MSB"
+msgstr "MSB"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:131
+#: ../src/gui/studio/BankEditorDialog.cpp:218
+msgid "LSB"
+msgstr "LSB"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:140
+msgid "Add Bank"
+msgstr "Añadir &Banco"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:141
+msgid "Add Key Mapping"
+msgstr "Añadir Cambio de &Tonalidad"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:153
+msgid "Add a Bank to the current device"
+msgstr "Añadir un Banco al dispositivo actual"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:157
+msgid "Add a Percussion Key Mapping to the current device"
+msgstr "Añadir un mapa de las teclas de percusión al dispositivo corriente"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:161
+msgid "Delete the current Bank or Key Mapping"
+msgstr "Borrar el Banco o Mapa de teclado Corriente"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:165
+msgid "Delete all Banks and Key Mappings from the current Device"
+msgstr "Borrar todos los bancos y las mapas de teclado del dispositivo actual"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:167
+#: ../src/gui/studio/DeviceManagerDialog.cpp:117
+msgid "Import..."
+msgstr "Importar..."
+
+#: ../src/gui/studio/BankEditorDialog.cpp:168
+#: ../src/gui/studio/DeviceManagerDialog.cpp:118
+msgid "Export..."
+msgstr "Exportar..."
+
+#: ../src/gui/studio/BankEditorDialog.cpp:176
+msgid ""
+"Import Bank and Program data from a Rosegarden file to the current Device"
+msgstr ""
+"Importar datos de Banco y Programa desde un archivo de Rosegarden para el "
+"dispositivo actual"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:179
+msgid ""
+"Export all Device and Bank information to a Rosegarden format interchange "
+"file"
+msgstr ""
+"Exportar toda la información del dispositivo y Bancos a un archivo de "
+"Rosegarden con formato de intercambio"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:190
+msgid "Copy all Program names from current Bank to clipboard"
+msgstr "Copiar todos los nombres de Programa del Banco actual al portapapeles"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:194
+msgid "Paste Program names from clipboard to current Bank"
+msgstr "Pegar nombres de Programa desde el portapapeles al Banco actual"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:216
+msgid "Show Variation list based on "
+msgstr "Mostrar lista de Variaciones basadas en "
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1010
+msgid "<new bank>"
+msgstr "<banco nuevo>"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1046
+msgid "<new mapping>"
+msgstr "<mapa nuevo>"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1048
+msgid "<new mapping %1>"
+msgstr "<mapa nuevo %1>"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1089
+msgid "Really delete this bank?"
+msgstr "¿Confirma la eliminación de este banco?"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1137
+msgid "Really delete this key mapping?"
+msgstr "¿Confirmar la eliminación de este banco?"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1187
+msgid "Really delete all banks for "
+msgstr "Confirma la eliminación de todos los bancos para "
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1476
+msgid "Import Banks from Device in File"
+msgstr "Importar bancos del dispositivo en el archivo"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1623
+#: ../src/gui/studio/DeviceManagerDialog.cpp:770
+msgid "Export Device as..."
+msgstr "Exportar dispositivo como..."
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1694
+msgid ""
+"There are unsaved changes.\n"
+"Do you want to apply the changes before exiting the Bank Editor or discard "
+"the changes ?"
+msgstr ""
+"Hay cambios no guardados.\n"
+"¿ Quiere aplicar los cambios antes de salir del Editor de Bancos, o "
+"descargar los cambios ?"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1697
+msgid "Unsaved Changes"
+msgstr "Cambios no Guardados"
+
+#: ../src/gui/studio/NameSetEditor.cpp:68
+msgid "Librarian"
+msgstr "Bibliotecario"
+
+#: ../src/gui/studio/NameSetEditor.cpp:75
+msgid "Email"
+msgstr "Correo electrónico"
+
+#: ../src/gui/studio/NameSetEditor.cpp:80
+msgid ""
+"The librarian maintains the Rosegarden device data for this device.\n"
+"If you've made modifications to suit your own device, it might be worth\n"
+"liaising with the librarian in order to publish your information for the "
+"benefit\n"
+"of others."
+msgstr ""
+"El bibliotecario mantiene la información de Bancos y Programas para este "
+"dispositivo.\n"
+"Si hace modificaciones a un Banco para adecuarlo a su propio dispositivo, \n"
+"puede ser valioso comunicarlo al bibliotecario para beneficio de otros."
+
+#: ../src/gui/studio/MidiBankListViewItem.cpp:51
+#: ../src/gui/studio/MidiDeviceListViewItem.cpp:48
+msgid "Percussion Bank"
+msgstr "Banco de Percusión"
+
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:84
+#: ../src/gui/studio/MidiBankListViewItem.cpp:51
+#: ../src/gui/studio/MidiDeviceListViewItem.cpp:48
+msgid "Bank"
+msgstr "Banco"
+
+#: ../src/gui/studio/ChangeRecordDeviceCommand.h:39
+msgid "Change Record Device"
+msgstr "Cambiar Dispositivo de Grabación"
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:61
+#: ../src/gui/studio/DeviceManagerDialog.cpp:96
+msgid "Manage MIDI Devices"
+msgstr "Gestionar Dispositivos MIDI"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:98
+msgid "Play devices"
+msgstr "Dispositivos de reproducción"
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:76
+#: ../src/gui/studio/DeviceManagerDialog.cpp:106
+#: ../src/gui/studio/DeviceManagerDialog.cpp:165
+msgid "Connection"
+msgstr "Conexión"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:119
+msgid "Banks..."
+msgstr "Bancos..."
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:120
+msgid "Control Events..."
+msgstr "Eventos de Controlador"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:126
+msgid "Create a new Play device"
+msgstr "Crear nuevo Dispositivo de Reproducción"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:129
+#: ../src/gui/studio/DeviceManagerDialog.cpp:184
+msgid "Delete the selected device"
+msgstr "Borrar Dispositivo seleccionado"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:132
+msgid ""
+"Import Bank, Program and Controller data from a Rosegarden file to the "
+"selected device"
+msgstr ""
+"Importar datos de Banco, Programa y Controladores desde un archivo de "
+"Rosegarden para el dispositivo actual"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:135
+msgid "Export Bank and Controller data to a Rosegarden interchange file"
+msgstr ""
+"Exportar datos de Bancos y Controladores a un archivo de intercambio de "
+"Rosegarden"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:138
+msgid "View and edit Banks and Programs for the selected device"
+msgstr "Ver y editar Bancos y Programas para el dispositivo seleccionado"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:141
+msgid ""
+"View and edit Control Events for the selected device - these are special "
+"Event types that you can define against your device and control through "
+"Control Rulers or the Instrument Parameter Box "
+msgstr ""
+"Ver y editar Eventos de Controlador para el dispositivo seleccionado - estos "
+"son tipos especiales de Eventos que puede definir contra su dispositivo y "
+"controlar mediante Reglas de Controladores o la Caja de Parámetros de "
+"Instrumento"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:156
+msgid "Record devices"
+msgstr "Dispositivos de grabación"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:164
+msgid "Current"
+msgstr "Actual"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:181
+msgid "Create a new Record device"
+msgstr "Crear un nuevo dispositivo de Grabación"
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:360
+#: ../src/gui/studio/DeviceEditorDialog.cpp:378
+#: ../src/gui/studio/DeviceManagerDialog.cpp:486
+#: ../src/gui/studio/DeviceManagerDialog.cpp:501
+msgid "New Device"
+msgstr "Nuevo Dispositivo"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:703
+msgid "Import from Device in File"
+msgstr "Importar desde Dispositivo en Archivo"
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:55
+msgid "Remap Instrument assigments..."
+msgstr "Remapear asignación de instrumentos"
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:62
+msgid "Device or Instrument"
+msgstr "Dispositivo o Instrumento"
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:65
+msgid "Remap Tracks by all Instruments on a Device or by single Instrument"
+msgstr ""
+"Remapear pistas para todos los instrumentos en un dispositivo o para un solo "
+"instrumento"
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:74
+msgid "Choose Source and Destination"
+msgstr "Elegir Origen y Destino"
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:77
+msgid "From"
+msgstr "Desde"
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:78
+msgid "To"
+msgstr "Hacia"
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:120
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:121
+msgid "<no devices>"
+msgstr "<sin dispositivos>"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:155
+msgid "Show Audio &Faders"
+msgstr "Mostrar &Deslizadores de Audio"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:160
+msgid "Show Synth &Faders"
+msgstr "Mostrar &Deslizadores de Sintetizador"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:165
+msgid "Show &Submasters"
+msgstr "Mostrar &Submasters"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:170
+msgid "Show &Plugin Buttons"
+msgstr "Mostrar Botones de &Plugin"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:175
+msgid "Show &Unassigned Faders"
+msgstr "Mostrar Deslizadores n&o Asignados"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:184
+#, c-format
+msgid ""
+"_n: 1 Input\n"
+"%n Inputs"
+msgstr ""
+"1 Entrada\n"
+"%n Entradas"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:194
+msgid "No Submasters"
+msgstr "Sin Submasters"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:203
+#, c-format
+msgid ""
+"_n: 1 Submaster\n"
+"%n Submasters"
+msgstr ""
+"1 Submaestro\n"
+"%n Submaestros"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:279
+msgid "Audio Mixer"
+msgstr "Mezclador de Audio"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:311
+msgid "Record input source"
+msgstr "Origen de entrada de grabación"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:322
+msgid "Output destination"
+msgstr "Destino de salida"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:336
+#: ../src/gui/studio/AudioMixerWindow.cpp:495
+msgid "Pan"
+msgstr "Panorama"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:355
+msgid "Mono or stereo"
+msgstr "Mono o Estéreo"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:364
+#: ../src/gui/studio/AudioMixerWindow.cpp:513
+msgid "Mute"
+msgstr "Silenciar"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:373 rc.cpp:408
+#, no-c-format
+msgid "Solo"
+msgstr "Solo"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:382
+msgid "Arm recording"
+msgstr "Armar Grabación"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:400
+#, c-format
+msgid "Audio %1"
+msgstr "Audio %1"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:404
+#, c-format
+msgid "Synth %1"
+msgstr "Sint.%1"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:578
+#: ../src/gui/studio/AudioMixerWindow.cpp:580
+msgid "Audio master output level"
+msgstr "Nivel principal de salida de Audio"
+
+#: ../src/gui/studio/SynthPluginManagerDialog.cpp:71
+msgid "Manage Synth Plugins"
+msgstr "Gestionar plugins sintetizadores"
+
+#: ../src/gui/studio/SynthPluginManagerDialog.cpp:78
+msgid "Synth plugins"
+msgstr "Plugins de Sintetizador"
+
+#: ../src/gui/studio/SynthPluginManagerDialog.cpp:145
+msgid "Controls"
+msgstr "Controles"
+
+#: ../src/gui/studio/SynthPluginManagerDialog.cpp:152
+msgid "Editor >>"
+msgstr "Editor >>"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:66
+#: ../src/gui/studio/MidiProgramsEditor.cpp:169
+msgid "Bank and Program details"
+msgstr "Detalles de Bancos y Programas"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:67
+msgid "Programs"
+msgstr "Programas"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2711
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:88
+#: ../src/gui/studio/MidiProgramsEditor.cpp:93
+msgid "Percussion"
+msgstr "Percusión"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:99
+msgid "MSB Value"
+msgstr "Valor MSB"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:107
+msgid ""
+"Selects a MSB controller Bank number (MSB/LSB pairs are always unique for "
+"any Device)"
+msgstr ""
+"Selecciona un número MSB de controlador (los pares MSB/LSB son siempre "
+"únicos para cualquier dispositivo)"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:111
+msgid ""
+"Selects a LSB controller Bank number (MSB/LSB pairs are always unique for "
+"any Device)"
+msgstr ""
+"Selecciona un número LSB de controlador (los pares MSB/LSB son siempre "
+"únicos para cualquier dispositivo)"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:116
+msgid "LSB Value"
+msgstr "Valor LSB"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:254
+#: ../src/gui/studio/MidiProgramsEditor.cpp:541
+#, c-format
+msgid "Key Mapping: %1"
+msgstr "Mapa del teclado: %1 "
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:476
+msgid "<no key mapping>"
+msgstr "<sin Mapa del Teclado>"
+
+#: ../src/gui/studio/MidiKeyMappingEditor.cpp:57
+#: ../src/gui/studio/MidiKeyMappingEditor.cpp:81
+msgid "Key Mapping details"
+msgstr "Detalles de Mapa del Teclado"
+
+#: ../src/gui/studio/MidiKeyMappingEditor.cpp:58
+msgid "Pitches"
+msgstr "Tonos"
+
+#: ../src/gui/studio/MidiMixerWindow.cpp:152
+msgid "MIDI Mixer"
+msgstr "Mezclador MIDI"
+
+#: ../src/gui/studio/MidiMixerWindow.cpp:199
+msgid "Volume"
+msgstr "Volumen"
+
+#: ../src/gui/studio/AudioPluginOSCGUIManager.cpp:444
+msgid "Rosegarden Plugin"
+msgstr "Plugin de Rosegarden"
+
+#: ../src/gui/studio/AudioPluginOSCGUIManager.cpp:447
+#, c-format
+msgid "Rosegarden: %1"
+msgstr "Rosegarden: %1"
+
+#: ../src/gui/studio/AudioPluginOSCGUIManager.cpp:449
+msgid "Rosegarden: %1: %2"
+msgstr "Rosegarden: %1: %2"
+
+#: ../src/gui/studio/AudioPluginOSCGUIManager.cpp:450
+#, c-format
+msgid "Plugin slot %1"
+msgstr "Zócalo de Plugin %1"
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:92
+msgid "Add Play Device"
+msgstr "Añadir Dispositivo de Reproducción"
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:93
+msgid "Add Record Device"
+msgstr "Añadir Dispositivo de Grabación"
+
+#: ../src/commands/studio/CreateOrDeleteDeviceCommand.h:68
+#: ../src/gui/studio/DeviceEditorDialog.cpp:94
+msgid "Delete Device"
+msgstr "Borrar Dispositivo"
+
+#: ../src/gui/editors/segment/PlayList.cpp:77
+#: ../src/gui/studio/DeviceEditorDialog.cpp:156
+#: ../src/gui/studio/DeviceEditorDialog.cpp:361
+msgid "Play"
+msgstr "Reproducir"
+
+#: ../src/commands/segment/SegmentRecordCommand.cpp:37
+#: ../src/gui/studio/DeviceEditorDialog.cpp:156
+#: ../src/gui/studio/DeviceEditorDialog.cpp:379 rc.cpp:394
+#, no-c-format
+msgid "Record"
+msgstr "Grabación"
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:256
+msgid "Apply pending changes?"
+msgstr "¿Aplicar los cambios pendientes?"
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:359
+#: ../src/gui/studio/DeviceEditorDialog.cpp:377
+msgid "<new device>"
+msgstr "<nuevo dispositivo>"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentEraser.cpp:82
+msgid "Click on a segment to delete it"
+msgstr "Hacer clic en un segmento para borrarlo"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSplitter.cpp:166
+msgid ""
+"Click on a segment to split it in two; hold Shift to avoid snapping to beat "
+"grid"
+msgstr ""
+"Hacer clic en un segmento para dividirlo en dos; pulsar mayúsculas para "
+"evitar ajuste de tiempo"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSplitter.cpp:168
+msgid "Click on a segment to split it in two"
+msgstr "hacer clic en un segmento para dividirlo en dos"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:81
+msgid "Click and drag to select segments"
+msgstr "hacer clic y arrastrar para seleccionar segmentos"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentMover.cpp:154
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:238
+msgid "Move Segment"
+msgstr "Mover Segmento"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentMover.cpp:154
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:239
+msgid "Move Segments"
+msgstr "Mover Segmentos"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:217
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:169
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:141
+#: ../src/gui/editors/segment/segmentcanvas/SegmentMover.cpp:210
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:255
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:359
+msgid "Hold Shift to avoid snapping to beat grid"
+msgstr ""
+"Pulsar mayúsculas para evitar ajustar el tiempo a la cuadrícula de ritmo"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:485
+msgid ""
+"Click and drag to select segments; middle-click and drag to draw an empty "
+"segment"
+msgstr ""
+"Hacer clic y arrastrar para seleccionar segmentos; botón medio del ratón y "
+"arrastrar para dibujar un segmento vacío"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:384
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:502
+msgid ""
+"Click and drag to resize a segment; hold Ctrl as well to rescale its contents"
+msgstr ""
+"Hacer clic y arrastrar para cambiar tamaño de un segmento; pulsar Ctrl para "
+"escalar el contenido"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:386
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:504
+msgid "Click and drag to rescale segment"
+msgstr "Hacer clic y arrastrar para escalar un segmento"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:509
+msgid "Click and drag to move segments; hold Ctrl as well to copy them"
+msgstr ""
+"Hacer clic y arrastrar para mover segmentos; pulsar Ctrl a la vez para "
+"copiarlos"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:511
+msgid "Click and drag to copy segments"
+msgstr "Hacer clic y arrastrar para copiar segmentos"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:515
+msgid ""
+"Click and drag to move segment; hold Ctrl as well to copy it; double-click "
+"to edit"
+msgstr ""
+"Hacer clic y arrastrar para mover segmentos; pulsar Ctrl a la vez para "
+"copiar; doble clic para editar"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:517
+msgid "Click and drag to copy segment"
+msgstr "Hacer clic y arrastrar para copiar segmentos"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:157
+msgid ""
+"The audio file path does not exist or is not writable.\n"
+"You must set the audio file path to a valid directory in Document Properties "
+"before rescaling an audio file.\n"
+"Would you like to set it now?"
+msgstr ""
+"El directorio de archivos de audio no existe o no se puede escribir.\n"
+"Por favor, configure el directorio de archivos de audio hacia un directorio "
+"válido desde Propiedades del Documento antes de grabar audio.\n"
+"¿Quiere usted configurarlo ahora?"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:261
+msgid ""
+"Hold Shift to avoid snapping to beat grid; hold Ctrl as well to rescale "
+"contents"
+msgstr ""
+"Pulsar mayúsculas para evitar ajuste de tiempo a la cuadrícula rítmica; "
+"pulsar Ctrl a la vez para escalar contenido"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentMover.cpp:325
+msgid "Click and drag to move a segment"
+msgstr "Hacer clic y arrastrar para mover un segmento"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentPencil.cpp:225
+msgid "Hold Shift to avoid snapping to bar lines"
+msgstr "Pulsar mayúsculas para evitar el ajuste a los límites de compás"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentPencil.cpp:283
+msgid "Record or drop audio here"
+msgstr "Grabar o soltar archivos de audio aquí"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentPencil.cpp:289
+msgid ""
+"Click and drag to draw an empty segment. Control+Alt click and drag to draw "
+"in overlap mode."
+msgstr ""
+"Hacer clic y arrastrar para para dibujar un segmento vacío; hacer Ctrl+Alt"
+"+clic y arrastrar para dibujar sobre un segmento que ya existe"
+
+#: ../src/gui/editors/segment/TrackLabel.cpp:77
+msgid ""
+"Click and hold with left mouse button to assign this Track to an Instrument."
+msgstr ""
+"Pulsar y mantener el botón izquierdo del ratón para asignar esta pista a un "
+"instrumento"
+
+#: ../src/gui/editors/segment/TrackLabel.cpp:191
+msgid "Change track name"
+msgstr "Cambiar nombre de pista"
+
+#: ../src/gui/editors/segment/TrackLabel.cpp:192
+msgid "Enter new track name"
+msgstr "Introducir nuevo nombre de la pista"
+
+#: ../src/gui/editors/segment/TrackEditor.cpp:648
+msgid "Turn Repeating Segment into Real Copies"
+msgstr "Convertir repeticiones de segmento en copias reales"
+
+#: ../src/gui/editors/segment/TrackEditor.cpp:650
+msgid "Turn Repeating Segments into Real Copies"
+msgstr "Convertir repeticiones de segmentos en copias reales"
+
+#: ../src/gui/editors/segment/TrackEditor.cpp:814
+msgid ""
+"You can't drop files into Rosegarden from this client. Try using Konqueror "
+"instead."
+msgstr ""
+"No es posible arrastrar y soltar archivos en Rosegarden desde este cliente. "
+"Utilice un administrador de archivos como Konqueror."
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:85
+msgid "Manage Triggered Segments"
+msgstr "Gestionar Segmentos Activados"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:89
+msgid "ID"
+msgstr "ID"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:735
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:93
+msgid "Base velocity"
+msgstr "Velocidad base"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:94
+msgid "Triggers"
+msgstr "Activadores"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:115
+msgid "Add a Triggered Segment"
+msgstr "Añadir un Segmento Activado"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:119
+msgid "Delete a Triggered Segment"
+msgstr "Borrar un Segmento Activado"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:123
+msgid "Delete All Triggered Segments"
+msgstr "Borrar Todos los Segmentos Activados"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:127
+msgid "Close the Triggered Segment Manager"
+msgstr "Cerrar el Gestor de Segmentos Activados"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:169
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:245
+msgid "<no label>"
+msgstr "<sin etiqueta>"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:248
+msgid ""
+"_n: %1 on 1 track\n"
+"%1 on %n tracks"
+msgstr ""
+"%1 en 1 pista\n"
+"%1 en %n pistas"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:284
+msgid ""
+"This will remove all triggered segments from the whole composition. Are you "
+"sure?"
+msgstr ""
+"Esto borrará todos los segmentos activados de toda la composición. ¿Está "
+"seguro?"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:288
+msgid "Remove all triggered segments"
+msgstr "Eliminar todos los segmentos activados"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:313
+msgid "Trigger Segment Duration"
+msgstr "Duración de Segmento Activado"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:336
+#, c-format
+msgid ""
+"_n: This triggered segment is used 1 time in the current composition. Are "
+"you sure you want to remove it?\n"
+"This triggered segment is used %n times in the current composition. Are you "
+"sure you want to remove it?"
+msgstr ""
+"Este segmento activado se utiliza 1 vez en la composición actual. ¿Está "
+"seguro de querer borrarlo?\n"
+"Este segmento activado se utiliza %n veces en la composición actual. ¿Está "
+"seguro de querer borrarlo? "
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:400
+msgid "Pa&ste as New Triggered Segment"
+msgstr "Pegar como Nuevo &Segmento Activado"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1169
+#: ../src/gui/editors/segment/MarkerEditor.cpp:399
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:412
+#: ../src/gui/editors/tempo/TempoView.cpp:622
+msgid "&Musical Times"
+msgstr "Tiempos &Musicales"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1179
+#: ../src/gui/editors/segment/MarkerEditor.cpp:409
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:422
+#: ../src/gui/editors/tempo/TempoView.cpp:632
+msgid "&Real Times"
+msgstr "Tiempos &Reales"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1189
+#: ../src/gui/editors/segment/MarkerEditor.cpp:419
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:432
+#: ../src/gui/editors/tempo/TempoView.cpp:642
+msgid "Ra&w Times"
+msgstr "Tiempos Cr&udos"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:83
+msgid "Manage Markers"
+msgstr "Gestionar Marcadores"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:86
+msgid "Marker time "
+msgstr "Tiempo del Marcador "
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:87
+msgid "Marker text "
+msgstr "Texto de marcador"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:88
+msgid "Marker description "
+msgstr "Descripción de Marcador "
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:95
+msgid "Pointer position"
+msgstr "Posición del puntero"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:100
+msgid "Real time:"
+msgstr "Tiempo real:"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:103
+msgid "In measure:"
+msgstr "En compás:"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:121
+msgid "Add a Marker"
+msgstr "Añadir un Marcador"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:125
+msgid "Delete a Marker"
+msgstr "Borrar un Marcador"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:129
+msgid "Delete All Markers"
+msgstr "Borrar Todos los Marcadores"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:133
+msgid "Close the Marker Editor"
+msgstr "Cerrar el editor de Marcadores"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:296
+msgid "Remove all markers"
+msgstr "Eliminar todos los marcadores"
+
+#: ../src/gui/editors/segment/PlayList.cpp:76
+msgid "Add..."
+msgstr "Añadir..."
+
+#: ../src/gui/editors/segment/PlayList.cpp:78
+msgid "Move Up"
+msgstr "Mover Arriba"
+
+#: ../src/gui/editors/segment/PlayList.cpp:79
+msgid "Move Down"
+msgstr "Mover Abajo"
+
+#: ../src/gui/editors/segment/PlayList.cpp:124
+msgid "Select one or more Rosegarden files"
+msgstr "Seleccionar uno o más archivos de Rosegarden"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:73
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:55
+msgid "<not showing>"
+msgstr "<no mostrado>"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:89
+msgid "Manage Control Events"
+msgstr "Gestionar Eventos de Controladores"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:91
+msgid "<no device>"
+msgstr "<sin dispositivo>"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:99
+msgid " Control Events for %1 (device %2)"
+msgstr " Eventos de Control para %1 (dispositivo %2)"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:104
+msgid "Control Event name "
+msgstr "Nombre de Controlador "
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:105
+msgid "Control Event type "
+msgstr "Tipo de Controlador "
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:106
+msgid "Control Event value "
+msgstr "Valor de Controlador "
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:107
+msgid "Description "
+msgstr "Descripción "
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:108
+msgid "Min "
+msgstr "Mín "
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:109
+msgid "Max "
+msgstr "Máx "
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:110
+msgid "Default "
+msgstr "Por omisión "
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:111
+msgid "Color "
+msgstr "Color "
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:112
+msgid "Position on instrument panel"
+msgstr "Posición en el panel del instrumento"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:136
+msgid "Add a Control Parameter to the Studio"
+msgstr "Añadir un Parámetro de Control al Estudio"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:140
+msgid "Delete a Control Parameter from the Studio"
+msgstr "Eliminar un Parámetro de Control del Estudio"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:144
+msgid "Close the Control Parameter editor"
+msgstr "Cerrar el editor de Parámetros de Control"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:221
+msgid "<default>"
+msgstr "<por omisión>"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:62
+msgid "Edit Control Parameter"
+msgstr "Editar Parámetro de Control"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:71
+msgid "Control Event Properties"
+msgstr "Propiedades del Evento de Control"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:77
+msgid "Name:"
+msgstr "Nombre:"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:93
+msgid "Control Event value:"
+msgstr "Valor de Controlador:"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:97
+msgid "Minimum value:"
+msgstr "Valor mínimo:"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:101
+msgid "Maximum value:"
+msgstr "Valor máximo:"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:105
+msgid "Default value:"
+msgstr "Valor por omisión:"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:109
+msgid "Color:"
+msgstr "Color:"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:113
+msgid "Instrument Parameter Box position:"
+msgstr "Posición de la Caja de Parámetros de Instrumento"
+
+#: ../src/gui/editors/segment/TrackButtons.cpp:209
+#: ../src/gui/editors/segment/TrackButtons.cpp:585
+#: ../src/gui/editors/segment/TrackButtons.cpp:935
+#: ../src/gui/editors/segment/TrackButtons.cpp:1127
+msgid "<no instrument>"
+msgstr "<sin instrumento>"
+
+#: ../src/gui/editors/segment/TrackButtons.cpp:352
+#: ../src/gui/editors/segment/TrackButtons.cpp:1094
+msgid "<untitled audio>"
+msgstr "<audio sin título>"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:130
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:662
+#: ../src/gui/editors/segment/TrackButtons.cpp:354
+#: ../src/gui/editors/segment/TrackButtons.cpp:1096
+msgid "<untitled>"
+msgstr "<sin título>"
+
+#: ../src/gui/editors/segment/TrackButtons.cpp:1058
+msgid "Mute track"
+msgstr "Silenciar Pista"
+
+#: ../src/gui/editors/segment/TrackButtons.cpp:1063
+msgid "Record on this track"
+msgstr "Grabar en esta pista"
+
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:88
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:1015
+msgid "Segment"
+msgstr "Segmento"
+
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:89
+msgid "Segment Parameters"
+msgstr "Parámetros de Segmento"
+
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:366
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:697
+msgid "%1 ms"
+msgstr "%1 ms"
+
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:1031
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:910
+msgid "Highest playable note"
+msgstr "La nota más alta que se puede tocar"
+
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:1051
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:930
+msgid "Lowest playable note"
+msgstr "La nota más baja que se puede tocar"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:93
+msgid "Track Parameters"
+msgstr "Parámetros de Pista"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:137
+msgid "Playback parameters"
+msgstr "Parámetros de reproducción"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:172
+msgid "Recording filters"
+msgstr "Filtros de grabación"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:191
+msgid "Channel"
+msgstr "Canal"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:203
+msgid "Staff export options"
+msgstr "Exportación de pentagrama"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:220
+msgid "Notation size:"
+msgstr "Tamaño de notación:"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:225
+msgid "Small"
+msgstr "Pequeño"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:226
+msgid "Tiny"
+msgstr "Pequeñito"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:233
+msgid "Bracket type:"
+msgstr "Tipo de paréntesis:"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:237
+msgid "-----"
+msgstr "-----"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:238
+msgid "[----"
+msgstr "[----"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:239
+msgid "----]"
+msgstr "----]"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:240
+msgid "[---]"
+msgstr "[---]"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:241
+msgid "{----"
+msgstr "{----"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:242
+msgid "----}"
+msgstr "----}"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:243
+msgid "{[---"
+msgstr "{[---"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:244
+msgid "---]}"
+msgstr "---]}"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:253
+msgid "Create segments with"
+msgstr "Crear segmentos con:"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:264
+msgid "Preset"
+msgstr "Preprograma"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:272
+msgid "Load"
+msgstr "Cargar"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:282
+msgid "treble"
+msgstr "sol"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:283
+msgid "bass"
+msgstr "fa"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:284
+msgid "crotales"
+msgstr "sol +15"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:285
+msgid "xylophone"
+msgstr "sol +8"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:286
+msgid "guitar"
+msgstr "sol -15"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:287
+msgid "contrabass"
+msgstr "fa -8"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:288
+msgid "celesta"
+msgstr "fa +15"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:289
+msgid "old celesta"
+msgstr "fa +8"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:290
+msgid "french"
+msgstr "francés"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:291
+msgid "soprano"
+msgstr "do para soprano"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:292
+msgid "mezzosoprano"
+msgstr "mezzosoprano"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:293
+msgid "alto"
+msgstr "do para alto"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:294
+msgid "tenor"
+msgstr "do para tenor"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:295
+msgid "baritone"
+msgstr "barítono"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:296
+msgid "varbaritone"
+msgstr "barítono bajo"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:297
+msgid "subbass"
+msgstr "bajo profundo"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:327
+msgid "Lowest"
+msgstr "Desde"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:329
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:336
+msgid "---"
+msgstr "---"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:331
+msgid "Choose the lowest suggested playable note, using a staff"
+msgstr "Escoger la nota más baja sugerida empleando un pentagrama"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:334
+msgid "Highest"
+msgstr "Hasta"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:338
+msgid "Choose the highest suggested playable note, using a staff"
+msgstr "Escoger la nota más alta sugerida empleando un pentagrama"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:666
+msgid "[ Track %1 - %2 ]"
+msgstr "[ Pista %1 - %2 ]"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:985
+msgid "The instrument preset database is corrupt. Check your installation."
+msgstr "Hay un problema catastrófico con los parametros preprogramados."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:173
+#: ../src/gui/editors/parameters/InstrumentParameterBox.cpp:54
+msgid "Instrument Parameters"
+msgstr "Parámetros de Instrumento"
+
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:85
+msgid "Variation"
+msgstr "Variación"
+
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:86
+msgid "Program"
+msgstr "Programa"
+
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:87
+msgid "Channel out"
+msgstr "Canal de salida"
+
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:215
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:221
+msgid "[ %1 ]"
+msgstr "[ %1 ]"
+
+#: ../src/gui/editors/matrix/MatrixEraser.cpp:58
+#: ../src/gui/editors/matrix/MatrixMover.cpp:71
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:67
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:77
+msgid "Switch to Draw Tool"
+msgstr "Cambiar a Herramienta de Dibujo"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:75
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:69
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:71
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:81
+#: ../src/gui/editors/notation/ClefInserter.cpp:57
+#: ../src/gui/editors/notation/GuitarChordInserter.cpp:63
+#: ../src/gui/editors/notation/NotationSelector.cpp:87
+#: ../src/gui/editors/notation/NoteInserter.cpp:113
+#: ../src/gui/editors/notation/RestInserter.cpp:72
+#: ../src/gui/editors/notation/TextInserter.cpp:61
+msgid "Switch to Erase Tool"
+msgstr "Cambiar a herramienta de borrado"
+
+#: ../src/gui/editors/matrix/MatrixEraser.cpp:62
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:73
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:75
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:85
+msgid "Switch to Move Tool"
+msgstr "Cambiar a Herramienta de Movimiento"
+
+#: ../src/gui/editors/matrix/MatrixEraser.cpp:68
+#: ../src/gui/editors/matrix/MatrixMover.cpp:81
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:79
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:93
+msgid "Switch to Resize Tool"
+msgstr "Cambiar a Herramienta de Redimensionamiento"
+
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:446
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:579
+msgid "Click and drag to select; middle-click and drag to draw new note"
+msgstr ""
+"Hacer clic y arrastrar para seleccionar; botón medio del ratón y arrastrar "
+"para dibujar una nueva nota"
+
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:324
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:597
+msgid "Click and drag to resize selected notes"
+msgstr ""
+"Hacer clic y arrastrar para ajustar el tamaño de las notas seleccionadas"
+
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:599
+msgid "Click and drag to resize note"
+msgstr "Hacer clic y arrastrar para redimensionar nota"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:471
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:604
+msgid "Click and drag to move selected notes; hold Ctrl as well to copy"
+msgstr ""
+"Hacer clic y arrastrar para mover las notas seleccionadas; pulsar Ctrl a la "
+"vez para copiar"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:473
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:606
+msgid "Click and drag to copy selected notes"
+msgstr "Hacer clic y arrastrar para copiar las notas seleccionadas"
+
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:610
+msgid "Click and drag to move note; hold Ctrl as well to copy"
+msgstr ""
+"Hacer clic y arrastrar para mover notas; pulsar Ctrl a la vez para copiar"
+
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:612
+msgid "Click and drag to copy note"
+msgstr "Hacer clic y arrastrar para copiar notas"
+
+#: ../src/gui/editors/matrix/MatrixEraser.cpp:54
+#: ../src/gui/editors/matrix/MatrixMover.cpp:67
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:65
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:63
+#: ../src/gui/editors/notation/ClefInserter.cpp:53
+#: ../src/gui/editors/notation/GuitarChordInserter.cpp:59
+#: ../src/gui/editors/notation/NotationEraser.cpp:67
+#: ../src/gui/editors/notation/NoteInserter.cpp:109
+#: ../src/gui/editors/notation/RestInserter.cpp:68
+#: ../src/gui/editors/notation/TextInserter.cpp:57
+msgid "Switch to Select Tool"
+msgstr "Cambiar a herramienta de selección"
+
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:218
+msgid "Resize Event"
+msgstr "Redimensionar Evento"
+
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:221
+msgid "Resize Events"
+msgstr "Redimensionar Eventos"
+
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:326
+msgid "Click and drag to resize a note"
+msgstr "Hacer clic y arrastrar para redimensionar notas"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:328
+msgid "Copy and Move Event"
+msgstr "Copiar y Mover Evento"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:330
+msgid "Copy and Move Events"
+msgstr "Copiar y Mover Eventos"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:334
+msgid "Move Event"
+msgstr "Mover Evento"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:336
+msgid "Move Events"
+msgstr "Mover Eventos"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:465
+msgid "Click and drag to move a note; hold Ctrl as well to copy it"
+msgstr ""
+"Hacer clic y arrastrar para mover una nota; pulsar Ctrl a la vez para "
+"copiarla"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:467
+msgid "Click and drag to copy a note"
+msgstr "Hacer clic y arrastrar para copiar una nota"
+
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:361
+msgid "Click and drag to draw a note; Shift to avoid snapping to grid"
+msgstr ""
+"Hacer clic y arrastrar para dibujar una nota; pulsar mayúsculas a la vez "
+"para evitar ajuste a la rejilla"
+
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:363
+msgid "Click and drag to draw a note"
+msgstr "Hacer clic y arrastrar para dibujar una nota"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:437
+#: ../src/gui/editors/matrix/MatrixView.cpp:3053
+msgid "Couldn't apply piano roll layout"
+msgstr "No se ha podido aplicar el formato de rollo de pianola"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:663
+msgid "Resi&ze"
+msgstr "Redimensi&onar"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:669
+#: ../src/gui/editors/notation/NotationView.cpp:1919
+msgid "C&hord Insert Mode"
+msgstr "Modo de Inserción de &Acordes"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:676
+#: ../src/gui/editors/notation/NotationView.cpp:1778
+msgid "Ste&p Recording"
+msgstr "Grabación &Paso a Paso"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:694
+msgid "&Legato"
+msgstr "&Ligado"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:708
+msgid "Set to Current Velocity"
+msgstr "Establecer a la velocidad actual"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:712
+msgid "Set Event &Velocities..."
+msgstr "Establecer &Velocidad de los Eventos..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:716
+msgid "Trigger Se&gment..."
+msgstr "Activar &Segmento..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:720
+msgid "Remove Triggers..."
+msgstr "Eliminar Activadores..."
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1153
+#: ../src/gui/editors/matrix/MatrixView.cpp:724
+#: ../src/gui/editors/tempo/TempoView.cpp:606
+msgid "Select &All"
+msgstr "Seleccionar &todo"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:732
+#: ../src/gui/editors/notation/NotationView.cpp:2325
+msgid "Cursor &Back"
+msgstr "Cursor &Atrás"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:736
+#: ../src/gui/editors/notation/NotationView.cpp:2329
+msgid "Cursor &Forward"
+msgstr "Cursor A&delante"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:740
+#: ../src/gui/editors/notation/NotationView.cpp:2333
+msgid "Cursor Ba&ck Bar"
+msgstr "&Cursor al Compás anterior"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:744
+#: ../src/gui/editors/notation/NotationView.cpp:2337
+msgid "Cursor For&ward Bar"
+msgstr "Cursor Siguiente &Compás"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:748
+#: ../src/gui/editors/notation/NotationView.cpp:2341
+msgid "Cursor Back and Se&lect"
+msgstr "Cursor Atrás y &Seleccionar"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:752
+#: ../src/gui/editors/notation/NotationView.cpp:2345
+msgid "Cursor Forward and &Select"
+msgstr "Avanzar Cursor y &Seleccionar"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:756
+#: ../src/gui/editors/notation/NotationView.cpp:2349
+msgid "Cursor Back Bar and Select"
+msgstr "Cursor al compás anterior y Seleccionar"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:760
+#: ../src/gui/editors/notation/NotationView.cpp:2353
+msgid "Cursor Forward Bar and Select"
+msgstr "Cursor al compás siguiente y Seleccionar"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:764
+#: ../src/gui/editors/notation/NotationView.cpp:2363
+msgid "Cursor to St&art"
+msgstr "Cursor &al Comienzo"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:770
+#: ../src/gui/editors/notation/NotationView.cpp:2369
+msgid "Cursor to &End"
+msgstr "Cursor al &Final"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:776
+#: ../src/gui/editors/notation/NotationView.cpp:2391
+msgid "Cursor to &Playback Pointer"
+msgstr "Cursor al Punto de &Ejecución"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:820
+#: ../src/gui/editors/notation/NotationView.cpp:2435
+msgid "Playback Pointer to &Cursor"
+msgstr "Posición de Ejecución al &Cursor"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:826
+#: ../src/gui/editors/notation/NotationView.cpp:2441
+msgid "&Solo"
+msgstr "&Solo"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:841
+#: ../src/gui/editors/notation/NotationView.cpp:2456
+msgid "Set Loop to Selection"
+msgstr "Establecer repetición en la Selección"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:845
+#: ../src/gui/editors/notation/NotationView.cpp:2460
+msgid "Clear L&oop"
+msgstr "Limpiar &Repetición"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1157
+#: ../src/gui/editors/matrix/MatrixView.cpp:849
+#: ../src/gui/editors/notation/NotationView.cpp:2464
+#: ../src/gui/editors/tempo/TempoView.cpp:610
+msgid "Clear Selection"
+msgstr "Limpiar selección"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1149
+#: ../src/gui/editors/matrix/MatrixView.cpp:854
+#: ../src/gui/editors/notation/NotationView.cpp:2471
+msgid "&Filter Selection"
+msgstr "&Filtrar Selección"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:879
+msgid "&No Snap"
+msgstr "&No Ajustar"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:884
+msgid "Snap to Bea&t"
+msgstr "Ajuste a la Par&te"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:888
+msgid "Snap to &Bar"
+msgstr "Ajuste al &Compás"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:908
+#, c-format
+msgid "Snap to %1"
+msgstr "Ajuste a %1"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:917
+msgid "Show Instrument Parameters"
+msgstr "Mostrar Parámetros de Instrumento"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:922
+#: ../src/gui/editors/notation/NotationView.cpp:1850
+msgid "Show Ch&ord Name Ruler"
+msgstr "M&ostrar regla de Nombres de Acorde"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:926
+#: ../src/gui/editors/notation/NotationView.cpp:1858
+msgid "Show &Tempo Ruler"
+msgstr "Mostrar regla de &Tempo"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1238
+#: ../src/gui/editors/notation/NotationView.cpp:3245
+#, c-format
+msgid ""
+"_n: 1 event selected \n"
+" %n events selected "
+msgstr ""
+" 1 evento seleccionado \n"
+" %n eventos seleccionados "
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1241
+#: ../src/gui/editors/notation/NotationView.cpp:3247
+msgid " No selection "
+msgstr " Sin selección "
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1348
+#: ../src/gui/editors/matrix/MatrixView.cpp:1360
+#: ../src/gui/editors/matrix/MatrixView.cpp:2079
+#: ../src/gui/editors/notation/NotationView.cpp:5869
+msgid "Quantizing..."
+msgstr "Cuantificando "
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1370
+#: ../src/gui/editors/notation/NotationView.cpp:5407
+msgid "Collapsing notes..."
+msgstr "Fusionando notas..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1381
+msgid "Making legato..."
+msgstr "Haciendo legato..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1476
+msgid "Note: %1 (%2.%3s)"
+msgstr "Nota: %1 (%2,%3s)"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1531
+#: ../src/gui/editors/notation/NotationView.cpp:7206
+msgid "Time: %1 (%2.%3s)"
+msgstr "Tiempo: %1 (%2.%3s)"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1604
+#: ../src/gui/editors/notation/NotationView.cpp:4744
+#: ../src/gui/editors/notation/NotationView.cpp:4773
+msgid "Cutting selection to clipboard..."
+msgstr "Cortando la selección al portapapeles..."
+
+#: ../src/gui/editors/eventlist/EventView.cpp:912
+#: ../src/gui/editors/matrix/MatrixView.cpp:1636
+#: ../src/gui/editors/notation/NotationSelectionPaster.cpp:82
+msgid "Couldn't paste at this point"
+msgstr "No se puede pegar en este punto"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1647
+#: ../src/gui/editors/notation/NotationView.cpp:4754
+msgid "Deleting selection..."
+msgstr "Eliminando selección..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1833
+#: ../src/gui/editors/notation/NotationView.cpp:5617
+#, c-format
+msgid "Unknown note insert action %1"
+msgstr "Acción de insertar nota desconocida: %1"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1837
+#: ../src/gui/editors/matrix/MatrixView.cpp:2857
+#: ../src/gui/editors/notation/NotationView.cpp:5621
+msgid "Inserting note"
+msgstr "Insertando nota"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2091
+msgid "Unquantizing..."
+msgstr "Descuantificando..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2120
+msgid " Grid: "
+msgstr " Rejilla: "
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2134
+msgid "Unit"
+msgstr "Unidad"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2136
+msgid "Beat"
+msgstr "Parte"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2138
+msgid "Bar"
+msgstr "Compás"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2159
+msgid " Velocity: "
+msgstr " Velocidad: "
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2170
+msgid " Quantize: "
+msgstr " Cuantificación: "
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2584
+msgid "Raising velocities..."
+msgstr "Subiendo velocidades..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2596
+msgid "Lowering velocities..."
+msgstr "Bajando velocidades..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2611
+msgid "Set Event Velocities"
+msgstr "Establecer Velocidades de los Eventos"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2616
+msgid "Setting Velocities..."
+msgstr "Estableciendo Velocidades..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2665
+msgid "Remove Triggers"
+msgstr "Eliminar Activadores"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2723
+msgid "%1 - Segment Track #%2 - %3"
+msgstr "%1 - Segmento Pista #%2 - %3"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2730
+msgid "%1 - All Segments - %2"
+msgstr "%1 - Todos los segmentos - %2"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2737
+msgid ""
+"_n: %1 - 1 Segment - %2\n"
+"%1 - %n Segments - %2"
+msgstr ""
+"%1 - 1 Segmento - %2\n"
+"%1 - %n Segmentos - %2"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2885
+msgid "Can't insert note: No grid duration selected"
+msgstr ""
+"No es posible insertar nota: No hay una duración de rejilla seleccionada"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2935
+msgid " Chord "
+msgstr " Acorde "
+
+#: ../src/gui/editors/matrix/MatrixEraser.cpp:105
+msgid "Click on a note to delete it"
+msgstr "Hacer clic en una nota para borrarla"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:89
+msgid "Filter"
+msgstr "Filtro"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:245
+#: ../src/gui/editors/tempo/TempoView.cpp:117
+msgid "Time "
+msgstr "Tiempo "
+
+#: ../src/gui/editors/tempo/TempoView.cpp:118
+msgid "Type "
+msgstr "Tipo "
+
+#: ../src/gui/editors/tempo/TempoView.cpp:119
+msgid "Value "
+msgstr "Valor "
+
+#: ../src/gui/editors/tempo/TempoView.cpp:120
+msgid "Properties "
+msgstr "Propiedades "
+
+#: ../src/gui/editors/tempo/TempoView.cpp:208
+msgid "Common, hidden"
+msgstr "Común, oculto"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:210
+msgid "Hidden"
+msgstr "Oculto"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:213
+msgid "Common"
+msgstr "Común"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:220
+msgid "Time Signature "
+msgstr "Medida del Compás "
+
+#: ../src/gui/editors/tempo/TempoView.cpp:245
+msgid "%1.%2%3"
+msgstr "%1.%2%3"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:255
+msgid "%1.%2%3 qpm (%4.%5%6 bpm) "
+msgstr "%1.%2%3 qpm (%4.%5%6 bpm) "
+
+#: ../src/gui/editors/tempo/TempoView.cpp:264
+msgid "Tempo "
+msgstr "Tempo "
+
+#: ../src/gui/editors/tempo/TempoView.cpp:271
+msgid "<nothing at this filter level>"
+msgstr "<nada en este nivel de filtrado>"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:463
+msgid "Delete Tempo or Time Signature"
+msgstr "Borrar Tempo o Medida del Compás"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:602
+msgid "&Edit Item"
+msgstr "&Editar Elemento"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:834
+msgid "%1 - Tempo and Time Signature Editor"
+msgstr "%1 - Editor de Tempo y Medida de Compás"
+
+#: ../src/gui/editors/guitar/GuitarChordEditorDialog.cpp:43
+msgid "Guitar Chord Editor"
+msgstr "Editor de acordes de guitarra"
+
+#: ../src/gui/editors/guitar/GuitarChordEditorDialog.cpp:51
+msgid "Start fret"
+msgstr "Traste Inicial"
+
+#: ../src/gui/editors/guitar/GuitarChordEditorDialog.cpp:58
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:51
+msgid "Root"
+msgstr "Raíz"
+
+#: ../src/gui/editors/guitar/GuitarChordEditorDialog.cpp:62
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:55
+msgid "Extension"
+msgstr "Extensión"
+
+#: ../src/gui/editors/guitar/Fingering.cpp:118
+msgid "couldn't parse fingering '%1' in '%2'"
+msgstr "no se ha podido interpretar la digitación de '%1' en '%2'"
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:45
+msgid "Guitar Chord Selector"
+msgstr "Selector de acorde de guitarra"
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:64
+msgid "beginner"
+msgstr "principiante"
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:65
+msgid "common"
+msgstr "normal"
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:66
+msgid "all"
+msgstr "todos"
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:86
+msgid "Fingerings"
+msgstr "Digitaciones"
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:419
+msgid "couldn't open file '%1'"
+msgstr "no se ha podido abrir el archivo '%1'"
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:428
+#, c-format
+msgid "couldn't parse chord dictionnary : %1"
+msgstr "no se ha podido interpretar el diccionario de acordes : '%1'"
+
+#: ../src/gui/editors/notation/NoteFontViewer.cpp:87
+#, c-format
+msgid "Note Font Viewer: %1"
+msgstr "Visor de tipografía de partitura: %1"
+
+#: ../src/gui/editors/notation/NoteFontViewer.cpp:93
+msgid " Component: "
+msgstr " Componente: "
+
+#: ../src/gui/editors/notation/NoteFontViewer.cpp:101
+msgid " View: "
+msgstr " Vista: "
+
+#: ../src/gui/editors/notation/NoteFontViewer.cpp:104
+msgid "Glyphs"
+msgstr "Glifos"
+
+#: ../src/gui/editors/notation/NoteFontViewer.cpp:105
+msgid "Codes"
+msgstr "Códigos"
+
+#: ../src/gui/editors/notation/NoteFontViewer.cpp:107
+msgid " Page: "
+msgstr " Página: "
+
+#: ../src/gui/editors/notation/ClefInserter.cpp:64
+#: ../src/gui/editors/notation/GuitarChordInserter.cpp:71
+#: ../src/gui/editors/notation/RestInserter.cpp:79
+#: ../src/gui/editors/notation/TextInserter.cpp:68
+msgid "Switch to Inserting Notes"
+msgstr "Cambiar a inserción de notas"
+
+#: ../src/gui/editors/notation/NotationView.cpp:522
+msgid "Close track headers"
+msgstr "Cerrar cabeceras de pista"
+
+#: ../src/gui/editors/notation/NotationView.cpp:917
+msgid "Preparing to print..."
+msgstr "Preparación para imprimir..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:1516
+msgid "Note &Font"
+msgstr "&Fuente tipográfica de Nota"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1539
+msgid "Si&ze"
+msgstr "&Tamaño"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1545
+msgid "Show Track Headers"
+msgstr "Mostrar &Cabeceras de Pista"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1550
+msgid "S&pacing"
+msgstr "Espa&ciado"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1572
+msgid "Du&ration Factor"
+msgstr "Factor de Du&ración"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1598
+msgid "Note &Style"
+msgstr "&Estilo de Nota"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1624
+msgid "Insert Rest"
+msgstr "Insertar Silencio"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1628
+msgid "Switch from Note to Rest"
+msgstr "Cambiar de nota a Silencio"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1633
+msgid "Switch from Rest to Note"
+msgstr "Cambiar de Silencio a Nota"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1690
+msgid "No accidental"
+msgstr "Sin alteraciones"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1691
+msgid "Follow previous accidental"
+msgstr "Seguir alteración anterior"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1692
+msgid "Sharp"
+msgstr "Sostenido"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1693
+msgid "Flat"
+msgstr "Bemol"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1694
+msgid "Natural"
+msgstr "Becuadro"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1695
+msgid "Double sharp"
+msgstr "Doble sostenido"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1696
+msgid "Double flat"
+msgstr "Doble bemol"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1717
+msgid "&Treble Clef"
+msgstr "Clave de &Soprano"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1724
+msgid "&Alto Clef"
+msgstr "Clave de &Contralto"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1731
+msgid "Te&nor Clef"
+msgstr "Clave de &Tenor"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1738
+msgid "&Bass Clef"
+msgstr "Clave de &Bajo"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1745
+msgid "&Text"
+msgstr "&Texto"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1751
+msgid "&Guitar Chord"
+msgstr "Acorde de guitarra"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1784
+msgid "Select from Sta&rt"
+msgstr "Selecciona&r desde el Comienzo"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1788
+msgid "Select to &End"
+msgstr "S&eleccionar hasta el final"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1792
+msgid "Select Whole St&aff"
+msgstr "Seleccion&ar todo el pentagrama"
+
+#: ../src/commands/edit/CutAndCloseCommand.h:53
+#: ../src/gui/editors/notation/NotationView.cpp:1796
+msgid "C&ut and Close"
+msgstr "C&ortar y cerrar"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1800
+msgid "Pa&ste..."
+msgstr "&Pegar..."
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:122
+#: ../src/gui/editors/notation/NotationView.cpp:1808
+msgid "Move to Staff Above"
+msgstr "Mudar hacia pentagrama arriba"
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:126
+#: ../src/gui/editors/notation/NotationView.cpp:1812
+msgid "Move to Staff Below"
+msgstr "Mudar hacia pentagrama abajo"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1826
+msgid "&Linear Layout"
+msgstr "Formato &Lineal"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1835
+msgid "&Continuous Page Layout"
+msgstr "Formato de Página &Continuo"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1844
+msgid "&Multiple Page Layout"
+msgstr "Formato de Página &Múltiple"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1854
+msgid "Show Ra&w Note Ruler"
+msgstr "Mostrar &regla de Nota Cruda"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1862
+msgid "Show &Annotations"
+msgstr "Mostrar &Anotaciones"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1866
+msgid "Show Lily&Pond Directives"
+msgstr "Mostrar Directivos para &LilyPond"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1870
+msgid "Open L&yric Editor"
+msgstr "Abrir Editor de &Letra"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1912
+msgid "Trip&let Insert Mode"
+msgstr "Modo de Inserción de &Tresillos"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1926
+msgid "Grace Insert Mode"
+msgstr "Modo de Inserción de &Apoyatura"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2180
+msgid "&Dump selected events to stderr"
+msgstr "&Volcar eventos seleccionados a stderr"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2248
+msgid "Ma&ke Ornament..."
+msgstr "&Hacer Ornamento..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:2252
+msgid "Trigger &Ornament..."
+msgstr "&Ornamento activador..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:2256
+msgid "Remove Ornament..."
+msgstr "Eliminar Ornamento..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:2261
+msgid "&None"
+msgstr "&Nada"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2289
+msgid "Convert Notation For..."
+msgstr "Convertir partitura para..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:2298
+msgid "Show &Notes Toolbar"
+msgstr "Mostrar barra de herramientas de &Notas"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2299
+msgid "Show &Rests Toolbar"
+msgstr "Mostrar barra de herramientas de &Silencios"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2300
+msgid "Show &Accidentals Toolbar"
+msgstr "Mostrar barra de herramientas de &Alteraciones"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2301
+msgid "Show Cle&fs Toolbar"
+msgstr "Mostrar barra de herramientas de Cla&ves"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2303
+msgid "Show &Marks Toolbar"
+msgstr "Mostrar barra de herramientas de &Marcadores"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2305
+msgid "Show &Group Toolbar"
+msgstr "Mostrar barra de herramientas de &Grupo"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2307
+msgid "Show &Layout Toolbar"
+msgstr "Mostrar barra de herramientas de &Formato"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2311
+msgid "Show M&eta Toolbar"
+msgstr "Mostrar barra de herramientas M&eta"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2373
+msgid "Cursor &Up Staff"
+msgstr "Subir C&ursor un pentagrama"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2377
+msgid "Cursor &Down Staff"
+msgstr "Cursor &Pentagrama Abajo"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2381
+msgid "Cursor Pre&vious Segment"
+msgstr "Cursor al segmento anterior"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2385
+msgid "Cursor Ne&xt Segment"
+msgstr "Cursor al siguiente segmento"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2475
+msgid "Push &Left"
+msgstr "Empujar a la &Izquierda"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2479
+msgid "Push &Right"
+msgstr "Empujar a la De&recha"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2483
+msgid "Push &Up"
+msgstr "Empujar hacia &Arriba"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2487
+msgid "Push &Down"
+msgstr "Empujar hacia A&bajo"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2491
+msgid "&Restore Positions"
+msgstr "Restablecer posiciones"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2495
+msgid "Make &Invisible"
+msgstr "Hacer &Invisible"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2499
+msgid "Make &Visible"
+msgstr "Hacer &Visible"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2503
+msgid "Toggle Dot"
+msgstr "Conmutar puntillo"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2507
+#: ../src/gui/editors/notation/NotationView.cpp:2511
+msgid "Add Dot"
+msgstr "Añadir Puntillo"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2570
+#, c-format
+msgid ""
+"_n: 1 pixel\n"
+"%n pixels"
+msgstr ""
+"1 pixel\n"
+"%n pixeles"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2619
+msgid " Font: "
+msgstr " Tipografía: "
+
+#: ../src/gui/editors/notation/NotationView.cpp:2647
+msgid "Unknown font \"%1\", using default"
+msgstr "Tipografía \"%1\" desconocida, usando predeterminada"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2655
+msgid " Size: "
+msgstr " Tamaño: "
+
+#: ../src/gui/editors/notation/NotationView.cpp:2677
+msgid " Spacing: "
+msgstr " Espaciado: "
+
+#: ../src/gui/editors/notation/NotationView.cpp:2993
+#: ../src/gui/editors/notation/NotationView.cpp:3818
+msgid " Ready."
+msgstr " Listo."
+
+#: ../src/gui/editors/notation/NotationView.cpp:2998
+msgid "Laying out score..."
+msgstr "Dando formato a la partitura..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:3011
+msgid "Laying out staff %1..."
+msgstr "Dando formato al pentagrama %1..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:3020
+msgid "Reconciling staffs..."
+msgstr "Reconciliando pentagramas..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:3885
+msgid "Sizing and allocating canvas..."
+msgstr "Creando y dimensionando lienzo..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:4050
+msgid "note"
+msgstr "nota"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4050
+msgid "rest"
+msgstr "silencio"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4211
+msgid "%1 - Segment Track #%2 - Notation"
+msgstr "%1 - Segmento Pista #%2 - Partitura"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4217
+msgid "%1 - All Segments - Notation"
+msgstr "%1 - Todos los segmentos - Partitura"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4222
+msgid ""
+"_n: %1 - Segment - Notation\n"
+"%1 - %n Segments - Notation"
+msgstr ""
+"%1 - Segmento - Notación\n"
+"%1 - %n Segmentos - Notación"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4243
+msgid "Grace"
+msgstr "Apoyatura"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4247
+#: ../src/gui/editors/notation/NotationView.cpp:4251
+#: ../src/gui/editors/notation/NotationView.cpp:4255
+msgid "%1 %2"
+msgstr "%1 %2"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4271
+msgid "Hidden annotations"
+msgstr "Anotaciones ocultas"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4293
+msgid "Hidden LilyPond directives"
+msgstr "Directivas LilyPond ocultas"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4326
+#, c-format
+msgid "Unknown spacing action %1"
+msgstr "Acción de espaciado desconocida %1"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4384
+#, c-format
+msgid "Unknown proportion action %1"
+msgstr "Acción de proporción desconocida %1"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4431
+#, c-format
+msgid "Unknown font action %1"
+msgstr "Acción de tipografía desconocida %1"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4449
+#, c-format
+msgid "Unknown font size %1"
+msgstr "Tamaño de tipografía desconocido %1"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4453
+#, c-format
+msgid "Unknown font size action %1"
+msgstr "Acción de tamaño de tipografía desconocido %1"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4780
+msgid ""
+"The Restricted paste type requires enough empty space (containing only "
+"rests) at the paste position to hold all of the events to be pasted.\n"
+"Not enough space was found.\n"
+"If you want to paste anyway, consider using one of the other paste types "
+"from the \"Paste...\" option on the Edit menu. You can also change the "
+"default paste type to something other than Restricted if you wish."
+msgstr ""
+"El tipo de pegado Restringido requiere suficiente\n"
+"espacio en la posición de pegado (conteniendo\n"
+"únicamente silencios) para albergar todos los eventos \n"
+"que van a ser pegados.\n"
+"No se ha encontrado espacio suficiente.\n"
+"Si quiere pegar de todas formas, considere el uso de\n"
+"uno de los otros tipos de pegado en la opción \"Pegar...\"\n"
+"del menú edición. También puede cambiar el tipo de\n"
+"pegado por defecto a otro distinto del Restringido si\n"
+"así lo desea."
+
+#: ../src/gui/editors/notation/NotationView.cpp:4800
+msgid "Can't paste multiple Segments into one"
+msgstr "No es posible pegar múltiples segmentos en uno"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4828
+#: ../src/gui/editors/notation/NotationView.cpp:4877
+msgid "Couldn't paste at this point."
+msgstr "No se puede pegar en este punto."
+
+#: ../src/gui/editors/notation/NotationView.cpp:4896
+msgid "Move Events to Staff Above"
+msgstr "&Mover eventos hacia pentagrama arriba"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4924
+msgid "Move Events to Staff Below"
+msgstr "&Mover Eventos hacia pentagrama abajo"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5036
+msgid "Pushing selection left..."
+msgstr "Empujando selección a la izquierda..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5047
+msgid "Pushing selection right..."
+msgstr "Empujando selección a la derecha..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5058
+msgid "Pushing selection up..."
+msgstr "Empujando selección hacia arriba..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5069
+msgid "Pushing selection down..."
+msgstr "Empujando selección hacia abajo..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5080
+msgid "Restoring computed positions..."
+msgstr "Restaurando las posiciones calculadas..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5089
+msgid "Making visible..."
+msgstr "Haciendo visible..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5098
+msgid "Making invisible..."
+msgstr "Haciendo invisible..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5185
+msgid "Beaming group..."
+msgstr "Uniendo plicas..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5195
+msgid "Auto-beaming selection..."
+msgstr "Uniendo automáticamente las plicas de la selección..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5205
+msgid "Breaking groups..."
+msgstr "Desagrupando..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5293
+msgid "Untupleting..."
+msgstr "Dividiendo grupos irregulares..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5301
+msgid "Adding slur..."
+msgstr "Añadiendo ligadura..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5302
+msgid "slur"
+msgstr "ligadura"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5307
+msgid "Adding phrasing slur..."
+msgstr "Añadiendo ligadura de fraseo..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5308
+msgid "phrasing slur"
+msgstr "ligadura de fraseo"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5313
+msgid "Adding glissando..."
+msgstr "Añadiendo glissando..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5314
+msgid "glissando"
+msgstr "glissando"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5319
+msgid "Adding crescendo..."
+msgstr "Añadiendo crescendo..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5320
+#: ../src/gui/editors/notation/NotationView.cpp:5326
+msgid "dynamic"
+msgstr "dinámica"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5325
+msgid "Adding decrescendo..."
+msgstr "Añadiendo decrescendo..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5331
+#: ../src/gui/editors/notation/NotationView.cpp:5337
+#: ../src/gui/editors/notation/NotationView.cpp:5343
+#: ../src/gui/editors/notation/NotationView.cpp:5349
+msgid "Adding octave..."
+msgstr "Añadiendo octava..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5332
+#: ../src/gui/editors/notation/NotationView.cpp:5338
+#: ../src/gui/editors/notation/NotationView.cpp:5344
+#: ../src/gui/editors/notation/NotationView.cpp:5350
+msgid "ottava"
+msgstr "octava"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5366
+msgid "Can't add overlapping %1 indications"
+msgstr "No se pueden añadir %1 indicaciones superpuestas"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5375
+msgid "Making chord..."
+msgstr "Creando acorde..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5387
+msgid "Normalizing rests..."
+msgstr "Normalizando silencios..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5397
+msgid "Collapsing rests..."
+msgstr "Fusionando silencios..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5417
+msgid "Tying notes..."
+msgstr "Enlazando notas..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5427
+msgid "Untying notes..."
+msgstr "Desenlazando notas..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5437
+msgid "Making notes viable..."
+msgstr "Haciendo notas viables..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5447
+msgid "Removing counterpoint..."
+msgstr "eliminando contrapunto..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5457
+msgid "Pointing stems up..."
+msgstr "Apuntando plicas hacia arriba..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5467
+msgid "Pointing stems down..."
+msgstr "Apuntando plicas hacia abajo..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5478
+msgid "Restoring computed stem directions..."
+msgstr "Restaurando la dirección calculada de las plicas..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5488
+#: ../src/gui/editors/notation/NotationView.cpp:5498
+msgid "Positioning slurs..."
+msgstr "Posicionando ligaduras..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5509
+msgid "Restoring slur positions..."
+msgstr "Restaurando las posiciones de las ligaduras..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5519
+#: ../src/gui/editors/notation/NotationView.cpp:5529
+msgid "Positioning ties..."
+msgstr "Posicionando ligaduras..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5540
+msgid "Restoring tie positions..."
+msgstr "Restaurando las posiciones calculadas..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5550
+msgid "Fixing notation quantization..."
+msgstr "Fijando cuantificación de partitura..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5560
+msgid "Removing notation quantization..."
+msgstr "Eliminando cuantificación de partitura..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5577
+msgid "Changing to %1 style..."
+msgstr "Cambiando al estilo %1..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5585
+#, c-format
+msgid "Unknown style action %1"
+msgstr "Acción de estilo desconocida: %1"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5598
+#: ../src/gui/editors/notation/NotationView.cpp:5639
+#: ../src/gui/editors/notation/NotationView.cpp:5695
+msgid "No note duration selected"
+msgstr "No se ha seleccionado duración de la nota"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5660
+msgid "No rest duration selected"
+msgstr "No se ha seleccionado duración del silencio"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5746
+msgid "No note or rest duration selected"
+msgstr "No se ha seleccionado duración de nota o silencio"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5757
+#: ../src/gui/editors/notation/NotationView.cpp:5768
+#: ../src/gui/editors/notation/NotationView.cpp:5779
+#: ../src/gui/editors/notation/NotationView.cpp:5790
+#: ../src/gui/editors/notation/NotationView.cpp:5801
+#: ../src/gui/editors/notation/NotationView.cpp:5812
+#: ../src/gui/editors/notation/NotationView.cpp:5823
+msgid "Forcing accidentals..."
+msgstr "Forzando alteraciones"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5834
+msgid "Restoring accidentals..."
+msgstr "Restaurando alteraciones"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5845
+msgid "Showing cautionary accidentals..."
+msgstr "Mostrando alteraciones precautorias..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5855
+msgid "Cancelling cautionary accidentals..."
+msgstr "Cancelando alteraciones precautorias..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5884
+msgid "Interpreting selection..."
+msgstr "Interpretando selección..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5896
+msgid "Setting note durations..."
+msgstr "Estableciendo duración de notas..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5904
+#: ../src/gui/editors/notation/NotationView.cpp:5912
+msgid "Adding dot..."
+msgstr "Añadiendo puntillo..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5934
+msgid "Text: "
+msgstr "Texto: "
+
+#: ../src/gui/editors/notation/NotationView.cpp:5948
+msgid "Fingering: "
+msgstr "Digitación: "
+
+#: ../src/gui/editors/notation/NotationView.cpp:6036
+msgid "Ornament track %1 bar %2"
+msgstr "Pista de ornamento %1 compás %2"
+
+#: ../src/gui/editors/notation/NotationView.cpp:6038
+#, c-format
+msgid "Ornament bar %1"
+msgstr "Ornamento compás %1"
+
+#: ../src/gui/editors/notation/NotationView.cpp:6098
+msgid "Remove Ornaments"
+msgstr "Eliminar Ornamentos"
+
+#: ../src/gui/editors/notation/NotationView.cpp:6145
+msgid "Estimated key signature shown"
+msgstr "Se muestra la armadura estimada"
+
+#: ../src/gui/editors/notation/NotationStaff.cpp:1249
+#: ../src/gui/editors/notation/NotationView.cpp:6202
+msgid "Sustain"
+msgstr "Sostenido"
+
+#: ../src/gui/editors/notation/NotationView.cpp:6218
+msgid ""
+"There is no sustain controller defined for this device.\n"
+"Please ensure the device is configured correctly in the Manage MIDI Devices "
+"dialog in the main window."
+msgstr ""
+"No hay un controlador de Sustain definido para este dispositivo.\n"
+"Por favor, asegúrese de que está correctamente configurado en el cuadro de "
+"diálogo \"Gestionar Dispositivos MIDI\". "
+
+#: ../src/gui/editors/notation/NotationView.cpp:7250
+msgid "Can't insert note: No note duration selected"
+msgstr "No es posible insertar nota: No hay una duración seleccionada"
+
+#: ../src/gui/editors/notation/NotationEraser.cpp:61
+#: ../src/gui/editors/notation/NotationSelector.cpp:83
+msgid "Switch to Insert Tool"
+msgstr "Cambiar a herramienta de inserción"
+
+#: ../src/gui/editors/notation/NotePixmapFactory.cpp:2303
+#: ../src/gui/editors/notation/NotePixmapFactory.cpp:2347
+msgid "..."
+msgstr "..."
+
+#: ../src/gui/editors/notation/NoteFontFactory.cpp:200
+msgid "Can't obtain a default font -- no fonts found"
+msgstr ""
+"No se puede obtener una tipografía por omisión -- no se han encontrado "
+"tipografías"
+
+#: ../src/gui/editors/notation/NoteFontMap.cpp:52
+#: ../src/gui/general/PresetGroup.cpp:49
+msgid "unknown error"
+msgstr "error desconocido"
+
+#: ../src/gui/editors/notation/NoteFontMap.cpp:78
+msgid "Can't open font mapping file %1 or %2"
+msgstr "No se puede abrir el archivo de mapeado de tipografías %1 o %2"
+
+#: ../src/gui/editors/notation/NoteFontMap.cpp:82
+#, c-format
+msgid "Can't open font mapping file %1"
+msgstr "No se puede abrir el archivo de mapeado de tipografía %1"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:52
+msgid "%1-dotted-%2"
+msgstr "%1-con puntillo-%2"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:54
+msgid "%1-dotted %2"
+msgstr "%1-con puntillo %2"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:57
+#, c-format
+msgid "dotted-%1"
+msgstr "%1-con puntillo"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:59
+#, c-format
+msgid "dotted %1"
+msgstr "%1 con puntillo"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:83
+msgid "sixty-fourth note"
+msgstr "semifusa"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:83
+msgid "thirty-second note"
+msgstr "fusa"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:84
+msgid "sixteenth note"
+msgstr "semicorchea"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:84
+msgid "eighth note"
+msgstr "corchea"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:85
+msgid "quarter note"
+msgstr "negra"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:85
+msgid "half note"
+msgstr "blanca"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:86
+msgid "whole note"
+msgstr "redonda"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:86
+msgid "double whole note"
+msgstr "cuadrada"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:89
+msgid "sixty-fourth notes"
+msgstr "semifusas"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:89
+msgid "thirty-second notes"
+msgstr "fusas"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:90
+msgid "sixteenth notes"
+msgstr "semicorcheas"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:90
+msgid "eighth notes"
+msgstr "corcheas"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:91
+msgid "quarter notes"
+msgstr "negras"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:91
+msgid "half notes"
+msgstr "blancas"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:92
+msgid "whole notes"
+msgstr "redondas"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:92
+msgid "double whole notes"
+msgstr "cuadradas"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:96
+#: ../src/gui/editors/notation/NotationStrings.cpp:154
+msgid "%1 triplets"
+msgstr "%1 tresillos"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:100
+#: ../src/gui/editors/notation/NotationStrings.cpp:158
+msgid "%1 triplet"
+msgstr "tresillo de %1"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:143
+msgid "64th"
+msgstr "semifusa"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:143
+msgid "32nd"
+msgstr "fusa"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:143
+msgid "16th"
+msgstr "semicorchea"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:143
+msgid "8th"
+msgstr "corchea"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:144
+msgid "quarter"
+msgstr "negra"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:144
+msgid "half"
+msgstr "blanca"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:144
+msgid "whole"
+msgstr "redonda"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:145
+msgid "double whole"
+msgstr "cuadrada"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:148
+msgid "64ths"
+msgstr "semifusas"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:148
+msgid "32nds"
+msgstr "fusas"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:148
+msgid "16ths"
+msgstr "semicorcheas"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:148
+msgid "8ths"
+msgstr "corcheas"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:149
+msgid "quarters"
+msgstr "negras"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:149
+msgid "halves"
+msgstr "blancas"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:149
+msgid "wholes"
+msgstr "redondas"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:150
+msgid "double wholes"
+msgstr "cuadradas"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:278
+msgid "%1 ticks"
+msgstr "%1 tics"
+
+#: ../src/gui/editors/notation/FontViewFrame.cpp:100
+#, c-format
+msgid "Error: Unable to match font name %1"
+msgstr "Error: Incapaz de emparejar el nombre de tipografía %1"
+
+#: ../src/gui/editors/notation/FontViewFrame.cpp:108
+msgid "Warning: No good match for font name %1 (best is %2)"
+msgstr ""
+"Aviso: No hay buena correspondencia para nombre de tipografía %1 (el mejor "
+"es %2)"
+
+#: ../src/gui/editors/notation/FontViewFrame.cpp:116
+#, c-format
+msgid "Error: Unable to open best-match font %1"
+msgstr "Error: Incapaz de abrir la mejor correspondencia para tipografía %1"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:113
+msgid "Track %1 : \"%2\""
+msgstr "Pista %1 : \"%2\""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:119
+#, c-format
+msgid ""
+"\n"
+"Notate for: %1"
+msgstr ""
+"\n"
+"Hacer notación para: %1"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:121
+msgid "normal"
+msgstr "normal"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:124
+msgid "small"
+msgstr "pequeño"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:127
+msgid "tiny"
+msgstr "pequeñito"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:131
+msgid "--"
+msgstr "--"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:156
+msgid ""
+"\n"
+"Size: %1, Bracket: %2 "
+msgstr ""
+"\n"
+"Tamaño: %1, Paréntesis: %2 "
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:183
+msgid ""
+"\n"
+"bars [%1-%2] in %3 (tr=%4) : \"%5\""
+msgstr ""
+"\n"
+"compases [%1-%2] en %3 (tr=%4) : \"%5\""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:190
+msgid ""
+"\n"
+"bars [%1-%2] (tr=%3) : \"%4\""
+msgstr ""
+"\n"
+"compases [%1-%2] (tr=%3) : \"%4\""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:240
+msgid "C#"
+msgstr "Do sostenido"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:242
+msgid "Eb"
+msgstr "Mi bemol"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:245
+msgid "F#"
+msgstr "Fa sostenido"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:247
+msgid "G#"
+msgstr "Sol sostenido"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:249
+msgid "Bb"
+msgstr "Si bemol"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:352
+msgid "%1: %2"
+msgstr "%1: %2"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:355
+#, c-format
+msgid " in %1"
+msgstr " en %1"
+
+#: ../src/gui/editors/notation/NotationStaff.cpp:452
+msgid "Rendering staff %1..."
+msgstr "Procesado pentagrama %1..."
+
+#: ../src/gui/editors/notation/NotationStaff.cpp:515
+msgid "Rendering notes on staff %1..."
+msgstr "Representando notas en el pentagrama %1..."
+
+#: ../src/gui/editors/notation/NotationStaff.cpp:583
+msgid "Positioning staff %1..."
+msgstr "Colocando pentagrama %1..."
+
+#: ../src/gui/editors/notation/NotationSelectionPaster.cpp:85
+msgid "Ready."
+msgstr "Listo."
+
+#: ../src/gui/editors/notation/RestInserter.cpp:62
+msgid "Dotted rest"
+msgstr "Nota con puntillo"
+
+#: ../src/gui/editors/notation/NoteStyleFileReader.cpp:57
+#, c-format
+msgid "Can't open style file %1"
+msgstr "No se puede abrir archivo de estilo %1"
+
+#: ../src/gui/editors/notation/NoteStyleFileReader.cpp:92
+msgid "type is a required attribute of note"
+msgstr "el tipo es un atributo requerido de la nota"
+
+#: ../src/gui/editors/notation/NoteStyleFileReader.cpp:101
+#, c-format
+msgid "Unrecognised note name %1"
+msgstr "Nombre de nota no reconocida %1"
+
+#: ../src/gui/editors/notation/NoteStyleFileReader.cpp:108
+msgid "global element must precede note elements"
+msgstr "elemento global debe preceder a elementos de nota"
+
+#: ../src/gui/editors/notation/NoteStyleFileReader.cpp:137
+msgid ""
+"global and note elements may have shape or charname attribute, but not both"
+msgstr ""
+"elementos globales y notas pueden tener forma o nombre de carácter, pero no "
+"ambos"
+
+#: ../src/gui/editors/notation/NotationVLayout.cpp:493
+msgid ""
+"Spanned note at %1 has no HEIGHT_ON_STAFF property!\n"
+"This is a bug (the program would previously have crashed by now)"
+msgstr ""
+"La nota espaciada en %1 no tiene la propiedad HEIGHT_ON_STAFF!\n"
+"Esto es un bug (el programa debería haber fallado ya)"
+
+#: ../src/gui/editors/notation/NoteInserter.cpp:82
+msgid "Auto-Beam when appropriate"
+msgstr "Ligadura automática donde sea apropiado"
+
+#: ../src/gui/editors/notation/NoteInserter.cpp:103
+msgid "Dotted note"
+msgstr "Nota con puntillo"
+
+#: ../src/gui/editors/notation/NoteInserter.cpp:120
+msgid "Switch to Inserting Rests"
+msgstr "Cambiar a inserción de silencios"
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:98
+msgid "Collapse Rests"
+msgstr "Colapsar Silencios"
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:102
+msgid "Respell as Flat"
+msgstr "Forzar alteraciones como bemoles"
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:106
+msgid "Respell as Sharp"
+msgstr "Forzar alteraciones como sostenidos"
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:110
+msgid "Respell as Natural"
+msgstr "Forzar alteraciones como natural"
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:114
+msgid "Collapse Notes"
+msgstr "Fusionar notas"
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:130
+msgid "Make Invisible"
+msgstr "Hacer invisible"
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:134
+msgid "Make Visible"
+msgstr "Hacer visible"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:129
+msgid "Event filters"
+msgstr "Filtros de Evento"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:138
+msgid "Rest"
+msgstr "Silencio"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:139
+msgid "Indication"
+msgstr "Indicación"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:141
+msgid "Other"
+msgstr "Otro "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:161
+msgid "Triggered Segment Properties"
+msgstr "Propiedades del Segmento activado"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:166
+msgid "Label: "
+msgstr "Etiqueta: "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:176
+msgid "Base pitch: "
+msgstr "Altura base: "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:183
+msgid "Base velocity: "
+msgstr "Velocidad base: "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:246
+msgid "Duration "
+msgstr "Duración "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:247
+msgid "Event Type "
+msgstr "Tipo de Evento "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:248
+msgid "Pitch "
+msgstr "Altura "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:249
+msgid "Velocity "
+msgstr "Velocidad "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:250
+msgid "Type (Data1) "
+msgstr "Tipo (Dato 1) "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:251
+msgid "Value (Data2) "
+msgstr "Valor (Dato 2) "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:461
+msgid "(group %1) "
+msgstr "(grupo %1) "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:519
+msgid "<no events at this filter level>"
+msgstr "<no hay eventos en este nivel de filtrado>"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:521
+msgid "<no events>"
+msgstr "<no hay eventos>"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:696
+msgid "Segment label"
+msgstr "Etiqueta del segmento"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:696
+msgid "Label:"
+msgstr "Etiqueta:"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1123
+msgid "&Insert Event"
+msgstr "&Insertar Evento"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1130
+msgid "&Delete Event"
+msgstr "&Borrar Evento"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1137
+msgid "&Edit Event"
+msgstr "&Editar Evento"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1144
+msgid "&Advanced Event Editor"
+msgstr "Editor &Avanzado de Eventos"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1518
+msgid "Open in Event Editor"
+msgstr "Abrir en el Editor de Eventos"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1519
+msgid "Open in Expert Event Editor"
+msgstr "Abrir en el Editor Avanzado de Eventos"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1577
+msgid "%1 - Triggered Segment: %2"
+msgstr "%1 - Segmento activado: %2"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1592
+msgid "%1 - Segment Track #%2 - Event List"
+msgstr "%1 - Segmento Pista #%2 - Lista de eventos"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1598
+msgid "%1 - %2 Segments - Event List"
+msgstr "%1 - %2 Segmentos - Lista de Eventos"
+
+#: ../src/gui/rulers/TempoRuler.cpp:131
+msgid "Insert Tempo Change at Playback Position"
+msgstr "Insertar Cambio de Tempo en posición de reproducción "
+
+#: ../src/gui/rulers/TempoRuler.cpp:136
+msgid "Delete Tempo Change"
+msgstr "Borrar Cambio de Tempo"
+
+#: ../src/gui/rulers/TempoRuler.cpp:140
+msgid "Ramp Tempo to Next Tempo"
+msgstr "Hacer un cambio de tempo gradual hasta el tempo siguiente"
+
+#: ../src/gui/rulers/TempoRuler.cpp:144
+msgid "Un-Ramp Tempo"
+msgstr "Deshacer el cambio de tempo gradual"
+
+#: ../src/gui/rulers/TempoRuler.cpp:149
+msgid "Edit Tempo..."
+msgstr "Mo&dificar Tempo "
+
+#: ../src/gui/rulers/TempoRuler.cpp:153
+msgid "Edit Time Signature..."
+msgstr "Modificar el Compás"
+
+#: ../src/gui/rulers/TempoRuler.cpp:588
+msgid "%1.%2%3 (%4.%5%6 bpm)"
+msgstr "%1.%2%3 (%4.%5%6 tpm)"
+
+#: ../src/gui/rulers/TempoRuler.cpp:596
+msgid "%1.%2%3 bpm"
+msgstr "%1.%2%3 tpm"
+
+#: ../src/gui/rulers/TempoRuler.cpp:604
+msgid "%1 - %2.%3%4"
+msgstr "%1 - %2.%3%4"
+
+#: ../src/gui/rulers/ControlRulerEventInsertCommand.cpp:36
+msgid "Insert Controller Event"
+msgstr "Insertar Evento Controlador"
+
+#: ../src/gui/rulers/ControlChangeCommand.cpp:35
+msgid "Control Change"
+msgstr "Controlador"
+
+#: ../src/gui/rulers/PropertyViewRuler.cpp:72
+msgid "%1 controller"
+msgstr "controlador %1"
+
+#: ../src/gui/rulers/RawNoteRuler.cpp:453
+msgid "Track #%1, Segment \"%2\" (runtime id %3)"
+msgstr "Pista #%1, Segmento \"%2\" (identificador %3)"
+
+#: ../src/gui/rulers/MarkerRuler.cpp:100
+msgid "Insert Marker"
+msgstr "Insertar marcador"
+
+#: ../src/gui/rulers/MarkerRuler.cpp:104
+msgid "Insert Marker at Playback Position"
+msgstr "Insertar marcador en la posición de reproducción"
+
+#: ../src/gui/rulers/MarkerRuler.cpp:109
+msgid "Delete Marker"
+msgstr "Borrar un marcador"
+
+#: ../src/gui/rulers/MarkerRuler.cpp:114
+msgid "Edit Marker..."
+msgstr "Editar marcadores..."
+
+#: ../src/gui/rulers/MarkerRuler.cpp:119
+msgid ""
+"Click on a marker to move the playback pointer.\n"
+"Shift-click to set a range between markers.\n"
+"Double-click to open the marker editor."
+msgstr ""
+"Hacer clic en un marcador para mover la posición de reproducción.\n"
+"Mayúsculas+clic para establecer un rango entre marcadores.\n"
+"Doble clic para abrir el editor de marcadores."
+
+#: ../src/gui/rulers/ChordNameRuler.cpp:97
+msgid ""
+"Chord name ruler.\n"
+"Turn it on and off from the Settings->Rulers menu."
+msgstr ""
+"Regla de nombres de acordes.\n"
+"Muéstrelo u ocúltelo desde el menú Preferencias -> Reglas."
+
+#: ../src/gui/rulers/ControlRulerEventEraseCommand.cpp:37
+msgid "Erase Controller Event(s)"
+msgstr "Borrar Evento(s) de Controlador(es)"
+
+#: ../src/gui/general/EditView.cpp:901
+#: ../src/gui/rulers/ControllerEventsRuler.cpp:188
+msgid "Unsupported Event Type"
+msgstr "Tipo de Evento no Soportado"
+
+#: ../src/gui/rulers/ControllerEventsRuler.cpp:203
+msgid "Controller Events"
+msgstr "Eventos de Controlador"
+
+#: ../src/gui/rulers/ControllerEventsRuler.cpp:278
+msgid "Controller Event Number"
+msgstr "Numero de Evento de Controlador"
+
+#: ../src/gui/rulers/ControllerEventsRuler.cpp:471
+msgid "Add line of controllers"
+msgstr "Añadir línea de controladores"
+
+#: ../src/gui/rulers/LoopRuler.cpp:89
+msgid ""
+"Click and drag to move the playback pointer.\n"
+"Shift-click and drag to set a range for looping or editing.\n"
+"Shift-click to clear the loop or range.\n"
+"Double-click to start playback."
+msgstr ""
+"Clic y arrastrar para establecer puntero de reproducción.\n"
+"Mayúsculas + clic + arrastrar para establecer un bucle de repetición o "
+"edición.\n"
+"Mayúsculas + clic para deshacer bucle o rango.Doble clic para iniciar "
+"reproducción."
+
+#: ../src/gui/general/EditViewBase.cpp:228
+msgid "Set Segment Start Time..."
+msgstr "Establecer Tiempo de comienzo de Segmento..."
+
+#: ../src/gui/general/EditViewBase.cpp:232
+msgid "Set Segment Duration..."
+msgstr "Establecer Duración de Segmento..."
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:56
+msgid "Load track parameters preset"
+msgstr "Cargar parámetros de pista preprogramados"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:62
+msgid "Convert notation for..."
+msgstr "Convertir partitura en..."
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:86
+msgid "Select preset track parameters for:"
+msgstr "Seleccionar parámetros de pista preprogramados por:"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:87
+msgid "Create appropriate notation for:"
+msgstr "Crear partitura para:"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:89
+msgid "Category"
+msgstr "Categoría"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:95
+msgid "Player Ability"
+msgstr "Nivel"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:97
+msgid "Amateur"
+msgstr "Amateur"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:98
+msgid "Professional"
+msgstr "Profesional"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:104
+msgid "Only selected segments"
+msgstr "Segmentos seleccionados solamente"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:106
+msgid "All segments in this track"
+msgstr "Todos los segmentos en esta pista"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:111
+msgid "Only for new segments"
+msgstr "Sólo para segmentos nuevos"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:113
+msgid "Convert existing segments"
+msgstr "Convertir segmentos existentes"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:39
+#, c-format
+msgid "C%1"
+msgstr "Do%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:39
+#, c-format
+msgid "C#%1"
+msgstr "Do#%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:39
+#, c-format
+msgid "D%1"
+msgstr "Re%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:39
+#, c-format
+msgid "D#%1"
+msgstr "Re#%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:40
+#, c-format
+msgid "E%1"
+msgstr "Mi%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:40
+#, c-format
+msgid "F%1"
+msgstr "Fa%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:40
+#, c-format
+msgid "F#%1"
+msgstr "Fa#%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:40
+#, c-format
+msgid "G%1"
+msgstr "Sol%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:41
+#, c-format
+msgid "G#%1"
+msgstr "Sol#%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:41
+#, c-format
+msgid "A%1"
+msgstr "La%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:41
+#, c-format
+msgid "A#%1"
+msgstr "La#%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:41
+#, c-format
+msgid "B%1"
+msgstr "Si%1"
+
+#: ../src/gui/general/PresetGroup.cpp:95
+#, c-format
+msgid "Can't open preset file %1"
+msgstr "No se puede abrir archivo de preprogramas %1"
+
+#: ../src/gui/general/EditView.cpp:744
+msgid "&Halve Durations"
+msgstr "&Partir duraciones por la mitad"
+
+#: ../src/gui/general/EditView.cpp:748
+msgid "&Double Durations"
+msgstr "Doblar duraciones"
+
+#: ../src/gui/general/EditView.cpp:806
+msgid "Show Velocity Property Ruler"
+msgstr "Mostrar regla de Propiedad de Velocidad"
+
+#: ../src/gui/general/EditView.cpp:825
+msgid "Insert item"
+msgstr "Insertar Elemento"
+
+#: ../src/gui/general/EditView.cpp:831
+msgid "Erase selected items"
+msgstr "Borrar elementos seleccionados"
+
+#: ../src/gui/general/EditView.cpp:835
+msgid "Clear ruler"
+msgstr "Limpiar regla"
+
+#: ../src/gui/general/EditView.cpp:839
+msgid "Insert line of controllers"
+msgstr "Insertar linea de controladores"
+
+#: ../src/gui/general/EditView.cpp:843
+msgid "Flip forward"
+msgstr "Voltear adelante"
+
+#: ../src/gui/general/EditView.cpp:847
+msgid "Flip backwards"
+msgstr "Voltear atrás"
+
+#: ../src/gui/general/EditView.cpp:851
+msgid "Draw property line"
+msgstr "Dibujar línea de propiedad"
+
+#: ../src/gui/general/EditView.cpp:855
+msgid "Select all property values"
+msgstr "Seleccionar todos los valores de propiedad"
+
+#: ../src/gui/general/EditView.cpp:894
+msgid "%1 Controller %2 %3"
+msgstr "%1 controlador %2 %3"
+
+#: ../src/gui/general/EditView.cpp:1066
+msgid "I"
+msgstr "I"
+
+#: ../src/gui/general/EditView.cpp:1066
+msgid "II"
+msgstr "II"
+
+#: ../src/gui/general/EditView.cpp:1066
+msgid "III"
+msgstr "III"
+
+#: ../src/gui/general/EditView.cpp:1066
+msgid "IV"
+msgstr "IV"
+
+#: ../src/gui/general/EditView.cpp:1067
+msgid "V"
+msgstr "V"
+
+#: ../src/gui/general/EditView.cpp:1067
+msgid "VI"
+msgstr "VI"
+
+#: ../src/gui/general/EditView.cpp:1067
+msgid "VII"
+msgstr "VII"
+
+#: ../src/gui/general/EditView.cpp:1067
+msgid "VIII"
+msgstr "VIII"
+
+#: ../src/gui/general/EditView.cpp:1069
+msgid "%1 flat"
+msgstr "%1 bemol"
+
+#: ../src/gui/general/EditView.cpp:1070
+msgid "%1 sharp"
+msgstr "%1 sostenido"
+
+#: ../src/gui/general/EditView.cpp:1085
+msgid "&Insert Note"
+msgstr "&Insertar Nota"
+
+#: ../src/gui/general/EditView.cpp:1091
+msgid "&Upper Octave"
+msgstr "Octava S&uperior"
+
+#: ../src/gui/general/EditView.cpp:1096
+msgid "&Lower Octave"
+msgstr "Octava &Inferior"
+
+#: ../src/gui/general/EditView.cpp:1268
+msgid "Estimated time signature shown"
+msgstr "Se muestra la estimación de la medida del compás"
+
+#: ../src/gui/general/EditView.cpp:1431
+msgid "Halving durations..."
+msgstr "Partiendo duraciones por la mitad..."
+
+#: ../src/gui/general/EditView.cpp:1445
+msgid "Doubling durations..."
+msgstr "Doblando duraciones..."
+
+#: ../src/gui/general/EditView.cpp:1469
+msgid "Rescaling..."
+msgstr "Reescalando..."
+
+#: ../src/gui/general/EditView.cpp:1489
+msgid "By number of semitones: "
+msgstr "Por número de semitonos: "
+
+#: ../src/gui/general/EditView.cpp:1496 ../src/gui/general/EditView.cpp:1518
+msgid "Transposing..."
+msgstr "Transportando..."
+
+#: ../src/gui/general/EditView.cpp:1536
+msgid "Transposing up one semitone..."
+msgstr "Transportando hacia arriba un semitono..."
+
+#: ../src/gui/general/EditView.cpp:1545
+msgid "Transposing up one octave..."
+msgstr "Transportando hacia arriba una octava..."
+
+#: ../src/gui/general/EditView.cpp:1554
+msgid "Transposing down one semitone..."
+msgstr "Transportando hacia abajo un semitono...."
+
+#: ../src/gui/general/EditView.cpp:1563
+msgid "Transposing down one octave..."
+msgstr "Transportando hacia abajo una octava..."
+
+#: ../src/gui/general/EditView.cpp:1575
+msgid "Inverting..."
+msgstr "Inversion en curso..."
+
+#: ../src/gui/general/EditView.cpp:1587
+msgid "Retrograding..."
+msgstr "Conversión retrógrada en curso..."
+
+#: ../src/gui/general/EditView.cpp:1599
+msgid "Retrograde inverting..."
+msgstr "Conversión retrógrada con inversión en curso..."
+
+#: ../src/gui/general/EditView.cpp:1608
+msgid "Jogging left..."
+msgstr "Corriendo a la izquierda..."
+
+#: ../src/gui/general/EditView.cpp:1623
+msgid "Jogging right..."
+msgstr "Corriendo a la derecha..."
+
+#: ../src/sound/AudioFileManager.cpp:660
+#, c-format
+msgid "Downloading file %1"
+msgstr "Descargando el archivo %1"
+
+#: ../src/sound/AudioFileManager.cpp:735
+msgid "Converting audio file..."
+msgstr "Convirtiendo archivo de audio..."
+
+#: ../src/sound/AudioFileManager.cpp:737
+msgid "Resampling audio file..."
+msgstr "Convirtiendo frecuencia de muestreo en archivo de audio..."
+
+#: ../src/sound/AudioFileManager.cpp:739
+msgid "Converting and resampling audio file..."
+msgstr "Convirtiendo formato y frecuencia de muestreo de archivo de audio..."
+
+#: ../src/sound/AudioFileManager.cpp:741
+msgid "Importing audio file..."
+msgstr "Importando archivo de audio..."
+
+#: ../src/sound/AudioFileManager.cpp:794
+msgid "Failed to convert or resample audio file on import"
+msgstr ""
+"Ha fallado la conversión o cambio de frecuencia de muestreo de archivo de "
+"audio en la importación"
+
+#: ../src/sequencer/main.cpp:46 ../src/sequencer/main.cpp:86
+msgid "RosegardenSequencer"
+msgstr "RosegardenSequencer"
+
+#: ../src/sequencer/main.cpp:54
+msgid "JACK playback and capture ports"
+msgstr "Puertos de captura y reproducción de JACK"
+
+#: ../src/commands/segment/SegmentSyncCommand.cpp:38
+#: ../src/commands/segment/SegmentSyncCommand.cpp:44
+#: ../src/commands/segment/SegmentSyncCommand.cpp:55
+#: ../src/commands/segment/SegmentSyncCommand.cpp:63
+msgid "Sync segment parameters"
+msgstr "Sincronizar parámetros de segmento"
+
+#: ../src/commands/segment/RenameTrackCommand.h:52
+msgid "Rename Track"
+msgstr "Renombrar Pista"
+
+#: ../src/commands/segment/SegmentRepeatToCopyCommand.cpp:39
+msgid "Turn Repeats into Copies"
+msgstr "Convertir Repeticiones en Copias"
+
+#: ../src/commands/segment/SegmentTransposeCommand.cpp:36
+#: ../src/commands/segment/SegmentTransposeCommand.cpp:42
+msgid "Change segment transposition"
+msgstr "Cambiar transporte de segmento"
+
+#: ../src/commands/edit/RescaleCommand.h:50
+#: ../src/commands/segment/AudioSegmentRescaleCommand.h:62
+#: ../src/commands/segment/SegmentRescaleCommand.h:58
+msgid "Stretch or S&quash..."
+msgstr "Estirar o Enco&ger..."
+
+#: ../src/commands/segment/SegmentLabelCommand.h:52
+msgid "Re&label..."
+msgstr "Ree&tiquetado"
+
+#: ../src/commands/segment/AudioSegmentResizeFromStartCommand.cpp:39
+#: ../src/commands/segment/SegmentResizeFromStartCommand.cpp:39
+msgid "Resize Segment"
+msgstr "Redimensionar Segmento"
+
+#: ../src/commands/segment/RemoveTempoChangeCommand.h:58
+msgid "Remove &Tempo Change..."
+msgstr "Eliminar Cambio de &Tempo"
+
+#: ../src/commands/segment/SegmentEraseCommand.cpp:40
+#: ../src/commands/segment/SegmentEraseCommand.cpp:52
+msgid "Erase Segment"
+msgstr "Borrar Segmento"
+
+#: ../src/commands/segment/AudioSegmentRescaleCommand.cpp:126
+#: ../src/commands/segment/SegmentRescaleCommand.cpp:102
+msgid "(rescaled)"
+msgstr "(escalado)"
+
+#: ../src/commands/segment/AudioSegmentRescaleCommand.cpp:127
+#: ../src/commands/segment/SegmentRescaleCommand.cpp:105
+msgid "%1 (rescaled)"
+msgstr "%1 (reescalado)"
+
+#: ../src/commands/segment/PasteToTriggerSegmentCommand.cpp:47
+msgid "Paste as New Triggered Segment"
+msgstr "Pegar como nuevo segmento actrivado"
+
+#: ../src/commands/segment/SegmentColourMapCommand.h:52
+msgid "Change Segment Color Map..."
+msgstr "Cambiar Mapa de Color de Segmento..."
+
+#: ../src/commands/segment/SegmentQuickCopyCommand.h:55
+msgid "Quick-Copy Segment"
+msgstr "Copia Rápida de Segmento"
+
+#: ../src/commands/segment/AudioSegmentSplitCommand.cpp:42
+msgid "Split Audio Segment"
+msgstr "Dividir Segmento de Audio"
+
+#: ../src/commands/segment/AudioSegmentSplitCommand.cpp:103
+#: ../src/commands/segment/SegmentSplitCommand.cpp:135
+msgid " (split)"
+msgstr " (dividido)"
+
+#: ../src/commands/segment/AudioSegmentSplitCommand.cpp:104
+#: ../src/commands/segment/SegmentSplitByRecordingSrcCommand.cpp:120
+#: ../src/commands/segment/SegmentSplitByRecordingSrcCommand.cpp:122
+#: ../src/commands/segment/SegmentSplitCommand.cpp:136
+msgid "%1 (split)"
+msgstr "%1 (dividido)"
+
+#: ../src/commands/segment/SegmentLabelCommand.cpp:40
+msgid "Label Segments"
+msgstr "Etiquetar Segmentos"
+
+#: ../src/commands/segment/OpenOrCloseRangeCommand.cpp:43
+msgid "Open or Close Range"
+msgstr "Abrir o cerrar ámbito"
+
+#: ../src/commands/edit/TransposeCommand.h:55
+#: ../src/commands/segment/SegmentTransposeCommand.h:54
+msgid "Transpose by &Interval..."
+msgstr "Transporte por intervalo..."
+
+#: ../src/commands/segment/SegmentAutoSplitCommand.cpp:148
+msgid "%1 (part)"
+msgstr "%1 (parte)"
+
+#: ../src/commands/segment/AudioSegmentInsertCommand.cpp:51
+#: ../src/commands/segment/SegmentInsertCommand.cpp:43
+#: ../src/commands/segment/SegmentInsertCommand.cpp:56
+msgid "Create Segment"
+msgstr "Crear Segmento"
+
+#: ../src/commands/segment/AudioSegmentInsertCommand.cpp:114
+msgid "%1 (inserted)"
+msgstr "%1 (insertado)"
+
+#: ../src/commands/segment/AudioSegmentInsertCommand.cpp:117
+msgid "unknown audio file"
+msgstr "archivo de audio desconocido"
+
+#: ../src/commands/segment/CreateTempoMapFromSegmentCommand.cpp:40
+msgid "Set Tempos from Beat Segment"
+msgstr "Establecer Tempos a partir de Segmento Rítmico"
+
+#: ../src/commands/segment/SegmentSplitByRecordingSrcCommand.h:52
+msgid "Split by &Recording Source..."
+msgstr "Dividir por Fuente de Grabación"
+
+#: ../src/commands/segment/SegmentColourMapCommand.cpp:40
+msgid "Change Segment Color Map"
+msgstr "Cambiar Mapa de Color de Segmento"
+
+#: ../src/commands/edit/CopyCommand.cpp:64
+#: ../src/commands/segment/SegmentQuickCopyCommand.cpp:57
+msgid "%1 (copied)"
+msgstr "%1 (copiado)"
+
+#: ../src/commands/segment/SegmentColourCommand.h:52
+msgid "Change Segment Color..."
+msgstr "Cambiar Color de Segmento..."
+
+#: ../src/commands/segment/SegmentSplitByPitchCommand.cpp:170
+msgid "%1 (upper)"
+msgstr "%1 (superior)"
+
+#: ../src/commands/segment/SegmentSplitByPitchCommand.cpp:172
+msgid "%1 (lower)"
+msgstr "%1 (inferior)"
+
+#: ../src/commands/segment/SegmentSingleRepeatToCopyCommand.cpp:39
+msgid "Turn Single Repeat into Copy"
+msgstr "Convertir Repetición Simple en Copia"
+
+#: ../src/commands/segment/AddTempoChangeCommand.h:58
+msgid "Add Te&mpo Change..."
+msgstr "Añadir cambio de tempo..."
+
+#: ../src/commands/segment/AudioSegmentAutoSplitCommand.h:57
+#: ../src/commands/segment/SegmentAutoSplitCommand.h:53
+msgid "&Split on Silence"
+msgstr "Dividir por &Silencio"
+
+#: ../src/commands/segment/SetTriggerSegmentBaseVelocityCommand.cpp:39
+msgid "Set Base Velocity"
+msgstr "Establecer Velocidad Base"
+
+#: ../src/commands/segment/DeleteRangeCommand.cpp:43
+#: ../src/commands/segment/EraseSegmentsStartingInRangeCommand.cpp:39
+msgid "Delete Range"
+msgstr "Borrar ámbito"
+
+#: ../src/commands/segment/ChangeCompositionLengthCommand.h:53
+msgid "Change &Composition Start and End..."
+msgstr "&Cambiar Comienzo y Final de la Composición"
+
+#: ../src/commands/segment/MoveTracksCommand.h:51
+msgid "Move Tracks..."
+msgstr "Mover Pistas..."
+
+#: ../src/commands/segment/SegmentColourCommand.cpp:39
+msgid "Change Segment Color"
+msgstr "Cambiar Color de Segmento"
+
+#: ../src/commands/segment/AudioSegmentDistributeCommand.h:66
+msgid "Distribute Audio Segments over MIDI"
+msgstr "Distribuir Segmentos de Audio sobre MIDI"
+
+#: ../src/commands/segment/AudioSegmentAutoSplitCommand.cpp:147
+msgid "%1 (autosplit %2)"
+msgstr "%1 (autodivisión %2)"
+
+#: ../src/commands/segment/SetTriggerSegmentDefaultRetuneCommand.cpp:39
+msgid "Set Default Retune"
+msgstr "Establecer Transposición Predeterminada"
+
+#: ../src/commands/segment/AddTimeSignatureCommand.h:52
+msgid "Add Time Si&gnature Change..."
+msgstr "Añadir Cambio de M&edida del Compás"
+
+#: ../src/commands/segment/AddTriggerSegmentCommand.cpp:42
+msgid "Add Triggered Segment"
+msgstr "Crear Segmento Activado"
+
+#: ../src/commands/segment/SetTriggerSegmentDefaultTimeAdjustCommand.cpp:39
+msgid "Set Default Time Adjust"
+msgstr "Establecer Ajuste de Tiempo Predeterminado"
+
+#: ../src/commands/segment/RemoveTimeSignatureCommand.h:58
+msgid "Remove &Time Signature Change..."
+msgstr "&Quitar Cambio de Medida de Compás..."
+
+#: ../src/commands/segment/SegmentCommandRepeat.cpp:39
+msgid "Repeat Segments"
+msgstr "Repetir Segmentos"
+
+#: ../src/commands/segment/AddTracksCommand.h:55
+msgid "Add Tracks..."
+msgstr "Añadir Pistas..."
+
+#: ../src/commands/segment/ModifyDefaultTempoCommand.h:51
+msgid "Modify &Default Tempo..."
+msgstr "Mo&dificar Tempo Predeterminado..."
+
+#: ../src/commands/segment/SegmentSplitByPitchCommand.h:61
+msgid "Split by &Pitch..."
+msgstr "Dividir por &Tono"
+
+#: ../src/commands/segment/DeleteTriggerSegmentCommand.cpp:40
+msgid "Delete Triggered Segment"
+msgstr "Borrar Segmento Activado"
+
+#: ../src/commands/segment/SegmentSplitCommand.cpp:42
+msgid "Split Segment"
+msgstr "Dividir Segmento"
+
+#: ../src/commands/segment/DeleteTracksCommand.h:51
+msgid "Delete Tracks..."
+msgstr "Borrar Pistas..."
+
+#: ../src/commands/segment/InsertRangeCommand.cpp:42
+msgid "Insert Range"
+msgstr "Insertar rango"
+
+#: ../src/commands/segment/DeleteRangeCommand.h:62
+msgid "Rejoin Command"
+msgstr "Orden Reunir"
+
+#: ../src/commands/segment/SetTriggerSegmentBasePitchCommand.cpp:39
+msgid "Set Base Pitch"
+msgstr "Establecer nota base"
+
+#: ../src/commands/segment/PasteConductorDataCommand.cpp:41
+msgid "Paste Tempos and Time Signatures"
+msgstr "Pegar tempos y compases"
+
+#: ../src/commands/segment/SegmentSyncClefCommand.cpp:34
+msgid "Sync segment clef"
+msgstr "Sincronizar clave del segmento"
+
+#: ../src/commands/matrix/MatrixInsertionCommand.cpp:46
+#: ../src/commands/notation/NoteInsertionCommand.cpp:54
+msgid "Insert Note"
+msgstr "Insertar Nota"
+
+#: ../src/commands/matrix/MatrixEraseCommand.cpp:41
+msgid "Erase Note"
+msgstr "Borrar Nota"
+
+#: ../src/commands/matrix/MatrixPercussionInsertionCommand.cpp:47
+msgid "Insert Percussion Note"
+msgstr "Insertar Nota de percusión"
+
+#: ../src/commands/matrix/MatrixModifyCommand.cpp:43
+msgid "Move Note"
+msgstr "Mover Nota"
+
+#: ../src/commands/matrix/MatrixModifyCommand.cpp:43
+msgid "Modify Note"
+msgstr "Modificar Nota"
+
+#: ../src/commands/edit/PasteEventsCommand.cpp:98
+msgid "Paste into an existing gap [\"restricted\"]"
+msgstr "Pegar en una ranura existente [\"restringido\"]"
+
+#: ../src/commands/edit/PasteEventsCommand.cpp:100
+msgid "Erase existing events to make room [\"simple\"]"
+msgstr "Borrar eventos existentes para hacer sitio [\"simple\"]"
+
+#: ../src/commands/edit/PasteEventsCommand.cpp:102
+msgid "Move existing events out of the way [\"open-n-paste\"]"
+msgstr "Mover eventos existentes fuera de su sitio [\"abrir-y-pegar\"]"
+
+#: ../src/commands/edit/PasteEventsCommand.cpp:104
+msgid "Overlay notes, tying against present notes [\"note-overlay\"]"
+msgstr "Solapar notas, enlazando con las preexistentes [\"solapamiento\"]"
+
+#: ../src/commands/edit/PasteEventsCommand.cpp:106
+msgid "Overlay notes, ignoring present notes [\"matrix-overlay\"]"
+msgstr ""
+"Solapar notas, ignorando notas preexistentes [\"solapamiento en matriz\"]"
+
+#: ../src/commands/edit/AddDotCommand.h:52
+msgid "&Add Dot"
+msgstr "&Añadir Puntillo"
+
+#: ../src/commands/edit/RemoveMarkerCommand.h:55
+msgid "&Remove Marker"
+msgstr "Elimina&r Marcador"
+
+#: ../src/commands/edit/EventUnquantizeCommand.cpp:43
+#: ../src/commands/edit/EventUnquantizeCommand.cpp:54
+msgid "Unquantize Events"
+msgstr "Descuantificar eventos"
+
+#: ../src/commands/edit/ChangeVelocityCommand.h:53
+msgid "&Increase Velocity"
+msgstr "&Incrementar Velocidad"
+
+#: ../src/commands/edit/ChangeVelocityCommand.h:54
+msgid "&Reduce Velocity"
+msgstr "&Reducir Velocidad"
+
+#: ../src/commands/edit/CopyCommand.cpp:46
+msgid "(excerpt)"
+msgstr "(extracto)"
+
+#: ../src/commands/edit/CopyCommand.cpp:60
+msgid "(copied)"
+msgstr "(copiado)"
+
+#: ../src/commands/edit/EventInsertionCommand.cpp:39
+msgid "Insert Event"
+msgstr "Insertar Evento"
+
+#: ../src/commands/edit/InsertTriggerNoteCommand.cpp:55
+msgid "Insert Trigger Note"
+msgstr "Insertar Nota activadora"
+
+#: ../src/commands/edit/CollapseNotesCommand.h:50
+msgid "Collapse &Equal-Pitch Notes"
+msgstr "Fusionar Notas d&e Igual Altura"
+
+#: ../src/commands/edit/TransposeCommand.h:61
+msgid "&Up a Semitone"
+msgstr "S&ubir un Semitono"
+
+#: ../src/commands/edit/TransposeCommand.h:62
+msgid "&Down a Semitone"
+msgstr "&Bajar un Semitono"
+
+#: ../src/commands/edit/TransposeCommand.h:63
+msgid "Up an &Octave"
+msgstr "Subir una &Octava"
+
+#: ../src/commands/edit/TransposeCommand.h:64
+msgid "Down an Octa&ve"
+msgstr "Bajar una Octa&va"
+
+#: ../src/commands/edit/TransposeCommand.h:65
+msgid "&Transpose by Semitones..."
+msgstr "Transporte por semitonos..."
+
+#: ../src/commands/edit/SetNoteTypeCommand.h:56
+msgid "&Set Note Type"
+msgstr "E&stablecer Tipo de Nota"
+
+#: ../src/commands/edit/EventEditCommand.h:55
+msgid "Edit E&vent"
+msgstr "Editar E&vento"
+
+#: ../src/commands/edit/AddMarkerCommand.h:54
+msgid "&Add Marker"
+msgstr "&Añadir Marcador"
+
+#: ../src/commands/edit/SelectionPropertyCommand.h:66
+msgid "Set &Property"
+msgstr "Establecer &Propiedad"
+
+#: ../src/commands/edit/CutCommand.h:55
+msgid "Cu&t"
+msgstr "Cor&tar"
+
+#: ../src/commands/edit/EventQuantizeCommand.cpp:114
+msgid "Heuristic Notation &Quantize"
+msgstr "Cuanti&ficación heurística para partitura"
+
+#: ../src/commands/edit/EventQuantizeCommand.cpp:116
+msgid "Grid &Quantize"
+msgstr "Rejilla de &Cuantificación"
+
+#: ../src/commands/edit/ClearTriggersCommand.h:52
+msgid "&Clear Triggers"
+msgstr "&Limpiar Activadores"
+
+#: ../src/commands/edit/RetrogradeCommand.h:51
+msgid "&Retrograde"
+msgstr "Retrógrada"
+
+#: ../src/commands/edit/InvertCommand.h:51
+msgid "&Invert"
+msgstr "Inversión"
+
+#: ../src/commands/edit/SetTriggerCommand.h:64
+msgid "Tri&gger Segment"
+msgstr "Acti&var Segmento"
+
+#: ../src/commands/edit/SetLyricsCommand.h:50
+msgid "Edit L&yrics"
+msgstr "Editar &Letra"
+
+#: ../src/commands/edit/MoveAcrossSegmentsCommand.cpp:73
+msgid "&Move Events to Other Segment"
+msgstr "&Mover Eventos a Otro Segmento"
+
+#: ../src/commands/edit/RetrogradeInvertCommand.h:51
+msgid "Re&trograde Invert"
+msgstr "Inversión retrógrada"
+
+#: ../src/commands/edit/ModifyMarkerCommand.h:55
+msgid "&Modify Marker"
+msgstr "&Modificar marcador"
+
+#: ../src/commands/studio/AddControlParameterCommand.h:61
+msgid "&Add Control Parameter"
+msgstr "&Añadir parámetro de control"
+
+#: ../src/commands/studio/ModifyInstrumentMappingCommand.h:55
+msgid "Modify &Instrument Mapping"
+msgstr "Mod&ificar mapeado del instrumento"
+
+#: ../src/commands/studio/RemoveControlParameterCommand.h:60
+msgid "&Remove Control Parameter"
+msgstr "&Eliminar parámetro de control"
+
+#: ../src/commands/studio/ReconnectDeviceCommand.h:55
+msgid "Reconnect Device"
+msgstr "Reconectar dispositivo"
+
+#: ../src/commands/studio/ModifyDeviceCommand.h:68
+msgid "Modify &MIDI Bank"
+msgstr "&Modificar Banco MIDI"
+
+#: ../src/commands/studio/CreateOrDeleteDeviceCommand.h:68
+msgid "Create Device"
+msgstr "Crear Dispositivo"
+
+#: ../src/commands/studio/ModifyDeviceMappingCommand.h:55
+msgid "Modify &Device Mapping"
+msgstr "Mo&dificar Mapeado del Dispositivo"
+
+#: ../src/commands/studio/RenameDeviceCommand.h:55
+msgid "Rename Device"
+msgstr "Renombrar Dispositivo"
+
+#: ../src/commands/studio/ModifyControlParameterCommand.h:61
+msgid "&Modify Control Parameter"
+msgstr "&Modificar Parámetro de Control"
+
+#: ../src/commands/notation/TieNotesCommand.h:49
+msgid "&Tie"
+msgstr "L&igadura"
+
+#: ../src/commands/notation/ClefInsertionCommand.cpp:74
+msgid "Add Cle&f Change..."
+msgstr "Añadir Ca&mbio de Clave..."
+
+#: ../src/commands/notation/GuitarChordInsertionCommand.cpp:40
+msgid "Insert Guitar Chord"
+msgstr "Insertar acorde de guitarra"
+
+#: ../src/commands/notation/RespellCommand.cpp:47
+#, c-format
+msgid "Respell with %1"
+msgstr "Forzar alteraciones con %1"
+
+#: ../src/commands/notation/RespellCommand.cpp:50
+msgid "Do&uble Sharp"
+msgstr "Doble sos&tenido"
+
+#: ../src/commands/notation/RespellCommand.cpp:52
+msgid "&Sharp"
+msgstr "&Sostenido"
+
+#: ../src/commands/notation/RespellCommand.cpp:54
+msgid "&Flat"
+msgstr "&Bemol"
+
+#: ../src/commands/notation/RespellCommand.cpp:56
+msgid "Dou&ble Flat"
+msgstr "Do&ble Bemol"
+
+#: ../src/commands/notation/RespellCommand.cpp:58
+msgid "&Natural"
+msgstr "B&ecuadro"
+
+#: ../src/commands/notation/RespellCommand.cpp:60
+msgid "N&one"
+msgstr "Ningun&o"
+
+#: ../src/commands/notation/RespellCommand.cpp:66
+msgid "Respell Accidentals &Upward"
+msgstr "Forzar Alteraciones &hacia arriba"
+
+#: ../src/commands/notation/RespellCommand.cpp:69
+msgid "Respell Accidentals &Downward"
+msgstr "Forzar Alteraciones hacia A&bajo"
+
+#: ../src/commands/notation/RespellCommand.cpp:72
+msgid "&Restore Accidentals"
+msgstr "Restablecer alteraciones"
+
+#: ../src/commands/notation/RespellCommand.cpp:75
+msgid "Respell Accidentals"
+msgstr "Forzar alteraciones"
+
+#: ../src/commands/notation/DeCounterpointCommand.h:55
+msgid "Split-and-Tie Overlapping &Chords"
+msgstr "Dividir-y-Ligar A&cordes Solapados"
+
+#: ../src/commands/notation/BeamCommand.h:49
+msgid "&Beam Group"
+msgstr "A&grupar Plicas"
+
+#: ../src/commands/notation/AddTextMarkCommand.h:51
+msgid "Add Te&xt Mark..."
+msgstr "Añadir Marcador de Te&xto..."
+
+#: ../src/commands/notation/RestoreSlursCommand.h:49
+msgid "&Restore Slur Positions"
+msgstr "&Restablecer posición calculada de ligaduras"
+
+#: ../src/commands/notation/SustainInsertionCommand.h:56
+msgid "Add Pedal &Press"
+msgstr "Añadir Pedal &Pulsado"
+
+#: ../src/commands/notation/SustainInsertionCommand.h:58
+msgid "Add Pedal &Release"
+msgstr "Añadir Pedal Libe&rado"
+
+#: ../src/commands/notation/FixNotationQuantizeCommand.h:49
+msgid "Fi&x Notation Quantization"
+msgstr "Fi&jar Cuantificación de Partitura"
+
+#: ../src/commands/notation/ChangeStemsCommand.h:51
+msgid "Stems &Up"
+msgstr "Plicas hacia &Arriba"
+
+#: ../src/commands/notation/ChangeStemsCommand.h:51
+msgid "Stems &Down"
+msgstr "Plicas hacia A&bajo"
+
+#: ../src/commands/notation/MakeAccidentalsCautionaryCommand.cpp:43
+msgid "Use &Cautionary Accidentals"
+msgstr "Utilizar Alteraciones Pre&cautorias"
+
+#: ../src/commands/notation/MakeAccidentalsCautionaryCommand.cpp:45
+msgid "Cancel C&autionary Accidentals"
+msgstr "Cancelar &Alteraciones Precautorias"
+
+#: ../src/commands/notation/SetVisibilityCommand.h:50
+msgid "Set Visibility"
+msgstr "Establecer Visibilidad"
+
+#: ../src/commands/notation/ChangeStyleCommand.h:53
+msgid "Change &Note Style"
+msgstr "Cambiar Estilo de &Nota"
+
+#: ../src/commands/notation/TextInsertionCommand.cpp:41
+msgid "Insert Text"
+msgstr "Insertar Texto"
+
+#: ../src/commands/notation/InterpretCommand.h:70
+msgid "&Interpret..."
+msgstr "&Interpretar..."
+
+#: ../src/commands/notation/TupletCommand.h:53
+msgid "&Triplet"
+msgstr "&Tresillo"
+
+#: ../src/commands/notation/TupletCommand.h:54
+msgid "Tu&plet..."
+msgstr "Grupo &Irregular..."
+
+#: ../src/commands/notation/UnTupletCommand.h:50
+msgid "&Untuplet"
+msgstr "&Dividir Grupos Irregulares..."
+
+#: ../src/commands/notation/CollapseRestsCommand.h:54
+msgid "&Collapse Rests"
+msgstr "&Fusionar Silencios"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:145
+msgid "Add S&lur"
+msgstr "Añadir &Ligadura"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:147
+msgid "Add &Phrasing Slur"
+msgstr "Añadir ligadura de &fraseo..."
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:149
+msgid "Add Double-Octave Up"
+msgstr "Añadir Doble Octava superior"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:151
+msgid "Add Octave &Up"
+msgstr "Añadir Octava S&uperior"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:153
+msgid "Add Octave &Down"
+msgstr "Añadir Octava &Inferior"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:155
+msgid "Add Double Octave Down"
+msgstr "Añadir Doble Octava Inferior"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:160
+msgid "Add &Crescendo"
+msgstr "Añadidir &crescendo..."
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:162
+msgid "Add &Decrescendo"
+msgstr "Añadir decrescendo..."
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:164
+msgid "Add &Glissando"
+msgstr "Añadir glissando..."
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:167
+msgid "Add &%1%2"
+msgstr "Añadir &%1%2"
+
+#: ../src/commands/notation/RemoveNotationQuantizeCommand.h:49
+msgid "Remo&ve Notation Quantization"
+msgstr "Elimina&r Cuantificación de Partitura"
+
+#: ../src/commands/notation/MakeChordCommand.h:50
+msgid "Make &Chord"
+msgstr "Crear A&corde"
+
+#: ../src/commands/notation/MultiKeyInsertionCommand.h:63
+msgid "Change all to &Key %1..."
+msgstr "Cambiar todo al &Tono %1..."
+
+#: ../src/commands/notation/KeyInsertionCommand.h:67
+#: ../src/commands/notation/MultiKeyInsertionCommand.h:65
+msgid "Add &Key Change..."
+msgstr "Añadir Cambio de &Tono..."
+
+#: ../src/commands/notation/RestoreStemsCommand.h:49
+msgid "&Restore Stems"
+msgstr "&Restablecer plicas"
+
+#: ../src/commands/notation/MakeNotesViableCommand.h:55
+#: ../src/commands/notation/MakeRegionViableCommand.h:52
+msgid "Tie Notes at &Barlines"
+msgstr "Ligar Notas en las &Barras de Compás"
+
+#: ../src/commands/notation/AddSlashesCommand.h:46
+msgid "Slashes"
+msgstr "Corchetes"
+
+#: ../src/commands/notation/ChangeSlurPositionCommand.h:51
+msgid "Slur &Above"
+msgstr "Ligadura &Arriba"
+
+#: ../src/commands/notation/ChangeSlurPositionCommand.h:51
+msgid "Slur &Below"
+msgstr "Ligadura A&bajo"
+
+#: ../src/commands/notation/NormalizeRestsCommand.h:54
+msgid "&Normalize Rests"
+msgstr "&Normalizar Silencios"
+
+#: ../src/commands/notation/TextChangeCommand.cpp:41
+msgid "Edit Text"
+msgstr "Editar Texto"
+
+#: ../src/commands/notation/RemoveMarksCommand.h:49
+msgid "&Remove All Marks"
+msgstr "&Eliminar Todos los Marcadores"
+
+#: ../src/commands/notation/AutoBeamCommand.h:52
+msgid "&Auto-Beam"
+msgstr "&Agrupar Plicas Automáticamente"
+
+#: ../src/commands/notation/UntieNotesCommand.h:49
+msgid "&Untie"
+msgstr "&Desligar Notas"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:48
+msgid "S&forzando"
+msgstr "S&forzando"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:50
+msgid "Sta&ccato"
+msgstr "Sta&ccato"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:52
+msgid "R&inforzando"
+msgstr "R&inforzando"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:54
+msgid "T&enuto"
+msgstr "T&enuto"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:56
+msgid "Tri&ll"
+msgstr "Tri&no"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:58
+msgid "Trill &with Line"
+msgstr "Trino &con Línea"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:60
+msgid "Trill Line"
+msgstr "Línea de Trino"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:62
+msgid "&Turn"
+msgstr "Grupe&to"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:64
+msgid "&Accent"
+msgstr "&Acento"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:66
+msgid "&Staccatissimo"
+msgstr "&Staccatissimo"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:68
+msgid "&Marcato"
+msgstr "&Marcato"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:70
+msgid "&Pause"
+msgstr "&Calderón"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:72
+msgid "&Up-Bow"
+msgstr "P&unta"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:74
+msgid "&Down-Bow"
+msgstr "&Talón"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:76
+msgid "Mo&rdent"
+msgstr "Mo&rdente"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:78
+msgid "Inverted Mordent"
+msgstr "Mordente Invertido"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:80
+msgid "Long Mordent"
+msgstr "Mordente Largo"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:82
+msgid "Lon&g Inverted Mordent"
+msgstr "Mordente Lar&go Invertido"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:84
+msgid "&%1%2"
+msgstr "&%1%2"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:89
+#, c-format
+msgid "Add %1"
+msgstr "Añadir %1"
+
+#: ../src/commands/notation/ResetDisplacementsCommand.h:49
+msgid "Restore Positions"
+msgstr "Restablecer posiciones"
+
+#: ../src/commands/notation/IncrementDisplacementsCommand.h:52
+msgid "Fine Reposition"
+msgstr "Reposicionamiento fino"
+
+#: ../src/commands/notation/RestoreTiesCommand.h:49
+msgid "&Restore Tie Positions"
+msgstr "Restablecer &ligadura automática"
+
+#: ../src/commands/notation/ChangeTiePositionCommand.h:47
+msgid "Tie &Above"
+msgstr "Ligadura &Arriba"
+
+#: ../src/commands/notation/ChangeTiePositionCommand.h:47
+msgid "Tie &Below"
+msgstr "Ligadura A&bajo"
+
+#: ../src/commands/notation/KeyInsertionCommand.h:65
+msgid "Change to &Key %1..."
+msgstr "Cambiar al &Tono %1..."
+
+#: ../src/commands/notation/RemoveFingeringMarksCommand.h:49
+msgid "&Remove Fingerings"
+msgstr "Elimina&r Digitaciones"
+
+#: ../src/commands/notation/BreakCommand.h:49
+msgid "&Unbeam"
+msgstr "De&sagrupar Plicas"
+
+#: ../src/commands/notation/UnGraceCommand.h:48
+msgid "Ung&race"
+msgstr "&Quitar Notas de Adorno"
+
+#: ../src/commands/notation/AddFingeringMarkCommand.cpp:45
+msgid "Add Other &Fingering..."
+msgstr "Añadir Otra &Digitación..."
+
+#: ../src/commands/notation/AddFingeringMarkCommand.cpp:47
+msgid "Add Fingering &0 (Thumb)"
+msgstr "Añadir Digitación &0 (Pulgar)..."
+
+#: ../src/commands/notation/AddFingeringMarkCommand.cpp:49
+#, c-format
+msgid "Add Fingering &%1"
+msgstr "Añadir Digitación &%1"
+
+#: ../src/document/io/HydrogenXMLHandler.cpp:277
+msgid " imported from Hydrogen "
+msgstr " importado desde Hydrogen "
+
+#: ../src/document/io/LilyPondExporter.cpp:404
+msgid ""
+"LilyPond does not allow spaces or backslashes in filenames.\n"
+"\n"
+"Would you like to use\n"
+"\n"
+" %1\n"
+"\n"
+" instead?"
+msgstr ""
+"LilyPond no permite espacios o barras invertidas en los nombres de archivo.\n"
+"\n"
+"¿Quiere usar\n"
+"\n"
+" %1\n"
+"\n"
+"en su lugar? "
+
+#: ../src/document/io/LilyPondExporter.cpp:2054
+msgid "warning: overlong bar truncated here"
+msgstr "aviso: compás demasiado largo truncado aquí"
+
+#: ../src/document/io/LilyPondExporter.cpp:2060
+msgid "warning: bar too short, padding with rests"
+msgstr "aviso: compás demasiado corto, rellenado con silencios"
+
+#: ../src/document/MultiViewCommandHistory.cpp:318
+msgid "Nothing to undo"
+msgstr "Nada que deshacer"
+
+#: ../src/document/MultiViewCommandHistory.cpp:320
+msgid "Nothing to redo"
+msgstr "Nada que rehacer"
+
+#: ../src/document/MultiViewCommandHistory.cpp:328
+#: ../src/document/MultiViewCommandHistory.cpp:372
+#, c-format
+msgid "Und&o %1"
+msgstr "&Deshacer %1"
+
+#: ../src/document/MultiViewCommandHistory.cpp:330
+#: ../src/document/MultiViewCommandHistory.cpp:374
+#, c-format
+msgid "Re&do %1"
+msgstr "Re&hacer %1"
+
+#: ../src/document/RosegardenGUIDoc.cpp:328
+msgid ""
+"The current file has been modified.\n"
+"Do you want to save it?"
+msgstr ""
+"El archivo actual ha sido modificado.\n"
+"¿Desea guardarlo?"
+
+#: ../src/document/RosegardenGUIDoc.cpp:480
+#, c-format
+msgid ""
+"_n: Delete the 1 audio file recorded during the unsaved session?\n"
+"Delete the %n audio files recorded during the unsaved session?"
+msgstr ""
+"¿Borrar el archivo de audio grabado durante la sesión no guardada?\n"
+"¿Borrar los %n archivos de audio grabados durante la sesión no guardada?"
+
+#: ../src/document/RosegardenGUIDoc.cpp:501
+msgid ""
+"The following audio files were recorded during this session but have been "
+"unloaded\n"
+"from the audio file manager, and so are no longer in use in the document you "
+"are saving.\n"
+"\n"
+"You may want to clean up these files to save disk space.\n"
+"\n"
+"Please select any you wish to delete permanently from the hard disk.\n"
+msgstr ""
+"Los siguientes archivos de audio fueron grabados en esta sesión pero han "
+"sido descargados\n"
+"desde Gestionar segmentos de Audio, y por lo tanto no están en uso ahora en "
+"el documento que está grabando.\n"
+" \n"
+"Quizá quiera limpiar estos archivos para ahorrar espacio en disco.\n"
+"\n"
+"Por favor, decida si quiere borrarlos permanentemente del disco duro.\n"
+
+#: ../src/document/RosegardenGUIDoc.cpp:517
+#, c-format
+msgid ""
+"_n: <qt>About to delete 1 audio file permanently from the hard disk."
+"<br>There will be no way to recover this file.<br>Are you sure?</qt>\n"
+"\n"
+"<qt>About to delete %n audio files permanently from the hard disk.<br>There "
+"will be no way to recover these files.<br>Are you sure?</qt>"
+msgstr ""
+"_n: <qt>Se borrará un archivo de audio de modo permanente.<br>No habrá modo "
+"de recuperar este archivo.<br>¿Está seguro?</qt>\n"
+"<qt>Se borrarán %n archivos de audio de modo permanente<br>.No habrá modo de "
+"recuperar estos archivos.<br>¿Está seguro?</qt>"
+
+#: ../src/document/RosegardenGUIDoc.cpp:580
+msgid "Can't open file '%1'"
+msgstr "No se puede abrir el archivo '%1'"
+
+#: ../src/document/RosegardenGUIDoc.cpp:585
+msgid "Reading file..."
+msgstr "Leyendo archivo..."
+
+#: ../src/document/RosegardenGUIDoc.cpp:603
+msgid "Could not open Rosegarden file"
+msgstr "No se ha podido abrir archivo de Rosegarden"
+
+#: ../src/document/RosegardenGUIDoc.cpp:641
+msgid "Error when parsing file '%1': \"%2\""
+msgstr "Error al interpretar el archivo '%1': \"%2\""
+
+#: ../src/document/RosegardenGUIDoc.cpp:689
+msgid "Generating audio previews..."
+msgstr "Generando previsualizaciones de audio..."
+
+#: ../src/document/RosegardenGUIDoc.cpp:721
+msgid "Merge"
+msgstr "Mezclar"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1605
+msgid "File load cancelled"
+msgstr "Carga de Archivo Cancelada"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1625
+msgid ""
+"<h3>Audio and plugins not available</h3><p>This composition uses audio files "
+"or plugins, but Rosegarden is currently running without audio because the "
+"JACK audio server was not available on startup.</p><p>Please exit "
+"Rosegarden, start the JACK audio server and re-start Rosegarden if you wish "
+"to load this complete composition.</p><p><b>WARNING:</b> If you re-save this "
+"composition, all audio and plugin data and settings in it will be lost.</p>"
+msgstr ""
+"<h3>Audio y \"plugins\" no disponibles</h3><p> Esta composición utiliza "
+"archivos de audio o plugins, pero Rosegarden está funcionando actualmente "
+"sin audio porque el servidor JACK no estaba disponible al comienzo.</p><p> "
+"Por favor, termine Rosegarden, inicie el servidor de audio JACK y reinicie "
+"Rosegarden si desea cargar esta composición por completo.</p><p> <b>AVISO:</"
+"b> Si usted guarda esta composición, todos los datos de audio y \"plugins\" "
+"se perderán.</p>"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1628
+msgid ""
+"<h3>Audio and plugins not available</h3><p>This composition uses audio files "
+"or plugins, but you are running a version of Rosegarden that was compiled "
+"without audio support.</p><p><b>WARNING:</b> If you re-save this composition "
+"from this version of Rosegarden, all audio and plugin data and settings in "
+"it will be lost.</p>"
+msgstr ""
+"<h3>Audio y \"plugins\" no disponibles</h3> <p> Esta composición utiliza "
+"archivos de audio o plugins, pero usted está usando una versión de "
+"Rosegarden que ha sido compilada sin soporte de audio. </p><p><b>AVISO:</b> "
+"Si usted guarda esta composición desde esta versión de Rosegarden, todos los "
+"datos de audio y \"plugins\" se perderán.</p>"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1665
+msgid ""
+"<h3>Incorrect audio sample rate</h3><p>This composition contains audio files "
+"that were recorded or imported with the audio server running at a different "
+"sample rate (%1 Hz) from the current JACK server sample rate (%2 Hz).</"
+"p><p>Rosegarden will play this composition at the correct speed, but any "
+"audio files in it will probably sound awful.</p><p>Please consider re-"
+"starting the JACK server at the correct rate (%3 Hz) and re-loading this "
+"composition before you do any more work with it.</p>"
+msgstr ""
+"<h3>Frecuencia de muestreo de audio incorrecta</h3> <p> Esta composición "
+"contiene archivos de audio que han sido grabados o importados con el "
+"servidor de audiocorriendo a una frecuencia de muestreo diferente (%1 Hz) de "
+"la actual frecuencia de muestreo de JACK (%2 Hz)</p><p> Rosegarden "
+"interpretará esta composición a la velocidad correcta, pero los archivos de "
+"audio utilizados probablemente suenen horriblemente.</p><p> Por favor, "
+"considere reiniciar el servidor JACK con la frecuencia correcta (%3 Hz) y "
+"recargue esta composición antes de seguir trabajando con ella.</p>"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1675
+msgid ""
+"<h3>Inconsistent audio sample rates</h3><p>This composition contains audio "
+"files at more than one sample rate.</p><p>Rosegarden will play them at the "
+"correct speed, but any audio files that were recorded or imported at rates "
+"different from the current JACK server sample rate (%1 Hz) will probably "
+"sound awful.</p><p>Please see the audio file manager dialog for more "
+"details, and consider resampling any files that are at the wrong rate.</p>"
+msgstr ""
+"<h3>Frecuencias de muestreo inconsistentes</h3> <p> Esta composición "
+"contiene archivos de audio con mas de una frecuencia de muestreo.</p> <p> "
+"Rosegarden los interpretará a la velocidad correcta, pero cualquier archivo "
+"de audio grabado o importado con frecuencias de muestreo diferentes de la "
+"frecuencia actual de JACK (%1 Hz) probablemente sonarán horriblemente.</"
+"p><p> Por favor, vea el diálogo de gestión de segmentos de audio para mas "
+"detalles, y considere convertir la frecuencia de muestreo de los archivos "
+"con la frecuencia incorrecta.</p>"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1676
+msgid "Inconsistent sample rates"
+msgstr "Frecuencias de muestreo inconsistentes"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1690
+msgid ""
+"<h3>Plugins not found</h3><p>The following audio plugins could not be loaded:"
+"</p><ul>"
+msgstr ""
+"<h3>\"Plugins\" no encontrados</h3> <p>Los siguientes \"plugins\" de audio "
+"no han podido ser cargados: </p><ul>"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1698
+msgid "<li>%1 (from %2)</li>"
+msgstr "<li>%1 (desde %2)</li>"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1712
+msgid ""
+"This file contains one or more old element types that are now deprecated.\n"
+"Support for these elements may disappear in future versions of Rosegarden.\n"
+"We recommend you re-save this file from this version of Rosegarden to ensure "
+"that it can still be re-loaded in future versions."
+msgstr ""
+"Este archivo contiene uno o más tipos de elementos que ahora están "
+"obsoletos.\n"
+"El soporte para estos elementos puede desaparecer en versiones futuras de\n"
+"Rosegarden. Se recomienda guardar este archivo con la versión actual de\n"
+"Rosegarden para garantizar que podrá ser reconocida por futuras versiones."
+
+#: ../src/document/RosegardenGUIDoc.cpp:2207
+msgid "Insert Recorded MIDI"
+msgstr "Insertar MIDI Grabado"
+
+#: ../src/document/RosegardenGUIDoc.cpp:2560
+msgid "%1 (recorded)"
+msgstr "%1 (grabado)"
+
+#: ../src/document/RoseXmlHandler.cpp:442
+msgid ""
+"This file was written by Rosegarden %1, and it uses\n"
+"a different file format that cannot be read by this version."
+msgstr ""
+"Este archivo fué escrito por Rosegarden %1 y utiliza\n"
+"un formato de archivo diferente que no se puede leer con esta versión."
+
+#: ../src/document/RoseXmlHandler.cpp:452
+msgid ""
+"This file was written by Rosegarden %1, which is more recent than this "
+"version.\n"
+"There may be some incompatibilities with the file format."
+msgstr ""
+"Este archivo fué escrito por Rosegarden %1, que es una versión más reciente "
+"que esta.\n"
+"Pueden haber incompatibilidades con el formato del archivo."
+
+#: ../src/document/RoseXmlHandler.cpp:1687
+msgid "Loading plugins..."
+msgstr "Enumerando plugins... "
+
+#: rc.cpp:6 rc.cpp:144
+#, no-c-format
+msgid "Se&gment"
+msgstr "Seg&mento"
+
+#: rc.cpp:9 rc.cpp:84 rc.cpp:147 rc.cpp:303
+#, no-c-format
+msgid "Edit &With"
+msgstr "Editar &Con"
+
+#: rc.cpp:12 rc.cpp:21 rc.cpp:30 rc.cpp:39 rc.cpp:345
+#, no-c-format
+msgid "Actions Toolbar"
+msgstr "Barra de Herramientas de Acciones"
+
+#: rc.cpp:15 rc.cpp:33 rc.cpp:129 rc.cpp:285
+#, no-c-format
+msgid "Time Toolbar"
+msgstr "Barra de Herramientas de Tiempo"
+
+#: rc.cpp:18 rc.cpp:36 rc.cpp:57 rc.cpp:63 rc.cpp:120 rc.cpp:243 rc.cpp:342
+#, no-c-format
+msgid "Transport Toolbar"
+msgstr "Barra de Herramientas de Transporte"
+
+#: rc.cpp:24 rc.cpp:42 rc.cpp:123 rc.cpp:348
+#, no-c-format
+msgid "Zoom Toolbar"
+msgstr "Barra de Herramientas de Ampliación"
+
+#: rc.cpp:45 rc.cpp:60 rc.cpp:99 rc.cpp:228 rc.cpp:327
+#, no-c-format
+msgid "T&ransport"
+msgstr "T&ransporte"
+
+#: rc.cpp:51
+#, no-c-format
+msgid "Number of Stereo &Inputs"
+msgstr "Número de &Entradas Estereofónicas"
+
+#: rc.cpp:54
+#, no-c-format
+msgid "&Number of Submasters"
+msgstr "&Número de Submasters"
+
+#: rc.cpp:66
+#, no-c-format
+msgid "&Import"
+msgstr "&Importar"
+
+#: rc.cpp:69
+#, no-c-format
+msgid "&Merge"
+msgstr "&Mezclar"
+
+#: rc.cpp:72
+#, no-c-format
+msgid "&Export"
+msgstr "&Exportar"
+
+#: rc.cpp:75 rc.cpp:141 rc.cpp:297
+#, no-c-format
+msgid "&Composition"
+msgstr "&Composición"
+
+#: rc.cpp:78
+#, no-c-format
+msgid "&Studio"
+msgstr "E&studio"
+
+#: rc.cpp:81
+#, no-c-format
+msgid "Se&gments"
+msgstr "Se&gmentos"
+
+#: rc.cpp:90
+#, no-c-format
+msgid "Trac&ks"
+msgstr "Pis&tas"
+
+#: rc.cpp:93
+#, no-c-format
+msgid "Set &Instrument"
+msgstr "Establecer &Instrumento"
+
+#: rc.cpp:102 rc.cpp:234 rc.cpp:333
+#, no-c-format
+msgid "&Toolbars"
+msgstr "Barras de &Herramientas"
+
+#: rc.cpp:105 rc.cpp:237 rc.cpp:336
+#, no-c-format
+msgid "&Rulers"
+msgstr "&Reglas"
+
+#: rc.cpp:111 rc.cpp:240 rc.cpp:339
+#, no-c-format
+msgid "Tools Toolbar"
+msgstr "Barra de Herramientas de Herramientas"
+
+#: rc.cpp:114
+#, no-c-format
+msgid "Tracks Toolbar"
+msgstr "Barra de Herramientas de Pistas"
+
+#: rc.cpp:117
+#, no-c-format
+msgid "Editors Toolbar"
+msgstr "Barra de Herramientas de Edición"
+
+#: rc.cpp:135
+#, no-c-format
+msgid "&Layout Mode"
+msgstr "Modo de &Formato"
+
+#: rc.cpp:138 rc.cpp:294
+#, no-c-format
+msgid "Add Event Ruler"
+msgstr "Añadir Regla de Eventos"
+
+#: rc.cpp:150
+#, no-c-format
+msgid "N&ote"
+msgstr "N&ota"
+
+#: rc.cpp:153
+#, no-c-format
+msgid "Mar&ks"
+msgstr "Mar&cadores"
+
+#: rc.cpp:156
+#, no-c-format
+msgid "&Ornaments"
+msgstr "&Ornamentos"
+
+#: rc.cpp:159
+#, no-c-format
+msgid "&Fingerings"
+msgstr "&Digitaciones"
+
+#: rc.cpp:162
+#, no-c-format
+msgid "S&lashes"
+msgstr "Co&rchetes"
+
+#: rc.cpp:165 rc.cpp:219
+#, no-c-format
+msgid "&Accidentals"
+msgstr "&Alteraciones"
+
+#: rc.cpp:168
+#, no-c-format
+msgid "&Phrase"
+msgstr "&Frase"
+
+#: rc.cpp:171
+#, no-c-format
+msgid "Slur &Position"
+msgstr "&Posición de la Ligadura"
+
+#: rc.cpp:174
+#, no-c-format
+msgid "Tie &Position"
+msgstr "&Posición de la ligadura"
+
+#: rc.cpp:177
+#, no-c-format
+msgid "&Octaves"
+msgstr "&Octavas"
+
+#: rc.cpp:180 rc.cpp:306
+#, no-c-format
+msgid "Ad&just"
+msgstr "A&juste"
+
+#: rc.cpp:183
+#, no-c-format
+msgid "R&ests"
+msgstr "Sil&encios"
+
+#: rc.cpp:186 rc.cpp:213
+#, no-c-format
+msgid "&Notes"
+msgstr "&Notas"
+
+#: rc.cpp:189 rc.cpp:309
+#, no-c-format
+msgid "&Quantize"
+msgstr "&Cuantificación"
+
+#: rc.cpp:195 rc.cpp:315
+#, no-c-format
+msgid "Trans&pose"
+msgstr "Trans&portar"
+
+#: rc.cpp:198 rc.cpp:318
+#, no-c-format
+msgid "Convert"
+msgstr "Convertir"
+
+#: rc.cpp:201
+#, no-c-format
+msgid "&Fine Positioning"
+msgstr "Posicionamiento &Fino"
+
+#: rc.cpp:204
+#, no-c-format
+msgid "Fine Ti&ming"
+msgstr "Te&mporización fina"
+
+#: rc.cpp:207
+#, no-c-format
+msgid "&Visibility"
+msgstr "&Visibilidad"
+
+#: rc.cpp:216
+#, no-c-format
+msgid "&Rests"
+msgstr "&Silencios"
+
+#: rc.cpp:222
+#, no-c-format
+msgid "&Clefs"
+msgstr "&Claves"
+
+#: rc.cpp:225 rc.cpp:324
+#, no-c-format
+msgid "Local &Cursor"
+msgstr "&Cursor Local"
+
+#: rc.cpp:246
+#, no-c-format
+msgid "Notes Toolbar"
+msgstr "Barra de Herramientas de Notas"
+
+#: rc.cpp:249
+#, no-c-format
+msgid "Rests Toolbar"
+msgstr "Barra de Herramientas de Silencios"
+
+#: rc.cpp:252
+#, no-c-format
+msgid "Clefs Toolbar"
+msgstr "Barra de Herramientas de Claves"
+
+#: rc.cpp:255
+#, no-c-format
+msgid "Accidentals Toolbar"
+msgstr "Barra de Herramientas de Alteraciones"
+
+#: rc.cpp:258
+#, no-c-format
+msgid "Group Toolbar"
+msgstr "Barra de Herramientas de Grupo"
+
+#: rc.cpp:261
+#, no-c-format
+msgid "Marks Toolbar"
+msgstr "Barra de Herramientas de Marcadores"
+
+#: rc.cpp:264
+#, no-c-format
+msgid "Meta Toolbar"
+msgstr "Meta-Barra de Herramientas"
+
+#: rc.cpp:267
+#, no-c-format
+msgid "Layout Toolbar"
+msgstr "Barra de Herramientas de Formato"
+
+#: rc.cpp:270 rc.cpp:351
+#, no-c-format
+msgid "Control Ruler actions"
+msgstr "Acciones de Regla de Controlador"
+
+#: rc.cpp:273 rc.cpp:354
+#, no-c-format
+msgid "Property Ruler actions"
+msgstr "Acciones de Regla de Propiedad"
+
+#: rc.cpp:276
+#, no-c-format
+msgid "&Action"
+msgstr "&Acción"
+
+#: rc.cpp:279
+#, no-c-format
+msgid "General Toolbar"
+msgstr "Barra de Herramientas General"
+
+#: rc.cpp:291
+#, no-c-format
+msgid "&Grid"
+msgstr "&Rejilla"
+
+#: rc.cpp:300
+#, no-c-format
+msgid "&Segment"
+msgstr "&Segmento"
+
+#: rc.cpp:361
+#, no-c-format
+msgid "Hide additional controls"
+msgstr "Ocultar controles adicionales"
+
+#: rc.cpp:365
+#, no-c-format
+msgid "Panic Button"
+msgstr "Botón de Pánico"
+
+#: rc.cpp:368
+#, no-c-format
+msgid "Resets all MIDI devices if you've got stuck notes"
+msgstr "Restablece todos los dispositivos MIDI cuando hay notas colgadas"
+
+#: rc.cpp:375
+#, no-c-format
+msgid "Provides a metronome click for you to play along with"
+msgstr "Proporciona una señal de metrónomo para tocar con ella"
+
+#: rc.cpp:378
+#, no-c-format
+msgid "Shows MIDI activity in and out of Rosegarden"
+msgstr "Muestra actividad de entrada y salida MIDI en Rosegarden"
+
+#: rc.cpp:381
+#, no-c-format
+msgid "IN"
+msgstr "IN"
+
+#: rc.cpp:384
+#, no-c-format
+msgid "OUT"
+msgstr "OUT"
+
+#: rc.cpp:387 rc.cpp:390
+#, no-c-format
+msgid "NO EVENTS"
+msgstr "SIN EVENTOS"
+
+#: rc.cpp:397
+#, no-c-format
+msgid "Record either MIDI or audio"
+msgstr "Grabar tanto MIDI como audio"
+
+#: rc.cpp:401
+#, no-c-format
+msgid "Loop"
+msgstr "Repetir"
+
+#: rc.cpp:404
+#, no-c-format
+msgid "Turn on and off the loop markers (if set)"
+msgstr "Activa y desactiva las marcas de repetición (si hay)"
+
+#: rc.cpp:411
+#, no-c-format
+msgid "Mutes all but the currently selected track"
+msgstr "Silencia todas las pistas excepto la seleccionada"
+
+#: rc.cpp:415
+#, no-c-format
+msgid "Start loop or range here"
+msgstr "Comenzar bucle o ámbito ahí"
+
+#: rc.cpp:419
+#, no-c-format
+msgid "End loop or range here"
+msgstr "Terminar bucle o ámbito ahí"
+
+#: rc.cpp:422
+#, no-c-format
+msgid "SIG"
+msgstr "SIG"
+
+#: rc.cpp:425
+#, no-c-format
+msgid "DIV"
+msgstr "DIV"
+
+#: rc.cpp:428
+#, no-c-format
+msgid "/16"
+msgstr "/16"
+
+#: rc.cpp:431
+#, no-c-format
+msgid "TEMPO"
+msgstr "TEMPO"
+
+#: rc.cpp:434
+#, no-c-format
+msgid "END"
+msgstr "FIN"
+
+#: rc.cpp:437
+#, no-c-format
+msgid "BAR"
+msgstr "COMPÁS"
+
+#: rc.cpp:441
+#, no-c-format
+msgid "Switch between real time, musical time, and frame count"
+msgstr "Conmutar entre tiempo real, tiempo musical y cuadros"
+
+#: rc.cpp:445
+#, no-c-format
+msgid "Show additional controls"
+msgstr "Mostrar controles adicionales"
+
+#: rc.cpp:449
+#, no-c-format
+msgid "Rewind"
+msgstr "Rebobinar"
+
+#: rc.cpp:452
+#, no-c-format
+msgid "Moves the current pointer position back one bar."
+msgstr "Mueve la posición actual del cursor un compás hacia atrás"
+
+#: rc.cpp:456
+#, no-c-format
+msgid "Rewind to beginning"
+msgstr "Rebobinar al principio"
+
+#: rc.cpp:459
+#, no-c-format
+msgid ""
+"Moves the pointer position to the start of the composition. (This may mean "
+"going forwards if the pointer is currently before the start.)"
+msgstr ""
+"Mueve la posición del cursor al comienzo de la composición (esto puede "
+"significar adelantarlo si el cursor está actualmente antes del comienzo)"
+
+#: rc.cpp:463
+#, no-c-format
+msgid "Play/Pause"
+msgstr "Reproducción/Pausa"
+
+#: rc.cpp:466
+#, no-c-format
+msgid ""
+"Plays from the current pointer position, or pauses playback if already in "
+"progress."
+msgstr ""
+"Toca desde la posición actual del cursor, o para la reproducción si ya está "
+"tocando."
+
+#: rc.cpp:473
+#, no-c-format
+msgid "Stops playback or recording."
+msgstr "Para la grabación o reproducción"
+
+#: rc.cpp:477
+#, no-c-format
+msgid "Fast forward"
+msgstr "Avance rápido"
+
+#: rc.cpp:480
+#, no-c-format
+msgid "Moves the current pointer position forwards one bar."
+msgstr "Mueve la posición actual del cursor un compás hacia delante"
+
+#: rc.cpp:484
+#, no-c-format
+msgid "Fast forward to end"
+msgstr "Avance rápido hacia el final"
+
+#: rc.cpp:487
+#, no-c-format
+msgid ""
+"Moves the pointer position to the end of the composition. (This may mean "
+"going backwards if the pointer is already beyond the end.)"
+msgstr ""
+"Mueve la posición del cursor al final de la composición. (Esto puede "
+"significar rebobinado si la posición ya está más allá del final.)"
+
+#: rc.cpp:491
+#, no-c-format
+msgid "Display time to end"
+msgstr "Muestra tiempo restante"
+
+#: ../docs/en/tips.cpp:3
+msgid ""
+"<p>To configure a track to play using a particular instrument:</p>\n"
+"&nbsp;&nbsp;* click on the track label and hold a moment<br>\n"
+"&nbsp;&nbsp;* select an output device<br>\n"
+"&nbsp;&nbsp;* select one of that device's available instruments (#1 - #16)"
+"<br>\n"
+"&nbsp;&nbsp;* adjust that instrument's output channel, program, bank, and\n"
+"controllers via the instrument parameters box\n"
+msgstr ""
+"<p>Para configurar una pista para tocar con un determinado instrumento:</p>\n"
+"&nbsp;&nbsp;* haga clic en la etiqueta de la pista y mantenga pulsado el "
+"botón un momento<br> \n"
+"&nbsp;&nbsp;* seleccione un dispositivo de salida<br>\n"
+"&nbsp;&nbsp;* seleccione uno de los instrumentos disponibles del dispositivo "
+"(#1 - #16)<br>\n"
+"&nbsp;&nbsp;* ajuste el canal, banco, programa, y controladores del "
+"instrumento usando\n"
+"los controles del cuadro de parámetros del instrumento\n"
+
+#: ../docs/en/tips.cpp:13
+msgid ""
+"<p>...that Rosegarden has an autosave feature?<br><br>\n"
+"You can select your autosave interval from <b>Settings->Configure\n"
+"Rosegarden</b>.<br><br>\n"
+"When something goes awry, such as a power outage or a Rosegarden crash\n"
+"(unfortunately, it happens...) simply load the file you were working on, and "
+"you'll be given the\n"
+"option to load the autosaved version, or the unmodified original.</p>\n"
+msgstr ""
+"<p>...que Rosegarden tiene una característica de auto-guardar?<br><br> \n"
+"Puede seleccionar el intervalo de tiempo en <b>Preferencias->Configurar \n"
+" Rosegarden</b><br><br>\n"
+"Cuando algo va mal, como un corte de corriente o un fallo de Rosegarden \n"
+"(desgraciadamente, ocurre...) simplemente recupere el archivo con el que "
+"estaba trabajando, \n"
+"y se le presentará la \n"
+"opción de abrir la versión auto-guardada, o bien la original sin modificar.</"
+"p>\n"
+
+#: ../docs/en/tips.cpp:23
+msgid ""
+"<p>\n"
+"...that you can save the current document as your default studio by using\n"
+"<b>Composition -> Studio -> Save Current Document as Default Studio</b>?</"
+"p>\n"
+msgstr ""
+"<p> \n"
+"... que usted puede guardar el documento actual como el estudio "
+"predeterminado usando\n"
+"<b>Composición -> Estudio -> Guardar documento actual como Estudio "
+"predeterminado</b>?</p>\n"
+
+#: ../docs/en/tips.cpp:30
+msgid ""
+"<p>...that your default studio is a complete Rosegarden composition that "
+"gets\n"
+"loaded every time you create a new document or import a MIDI file?</p>\n"
+msgstr ""
+"<p>...que su estudio predeterminado es una composición completa de "
+"Rosegarden que se\n"
+"carga cada vez que usted crea un nuevo documento o importa un archivo MIDI?</"
+"p>\n"
+
+#: ../docs/en/tips.cpp:36
+msgid ""
+"<p>...that your default studio can contain instrument assignments, document "
+"properties, LilyPond headers,\n"
+"and many other things?<br><br>The default studio is a complete Rosegarden "
+"composition, so it can contain anything that you may wish to have available "
+"in each\n"
+"new document you create.</p>\n"
+msgstr ""
+"<p>...que su estudio predeterminado puede\n"
+"contener asignaciones de instrumentos predeterminadas, propiedades del "
+"documento, cabeceras de LilyPond, \n"
+"y muchas otras cosas?<br><br> El estudio predeterminado es una composición "
+"completa de Rosegarden, así que puede contener cualquier cosa que usted "
+"puede desear tener disponible en cada nuevo documento creado.</p>\n"
+
+#: ../docs/en/tips.cpp:43
+msgid ""
+"<p>...that Rosegarden will detect and create a default connection for ALSA "
+"soft\n"
+"synth applications that are started after Rosegarden is already running?</"
+"p>\n"
+msgstr ""
+"<p>...que Rosegarden detectará y creará una conexión para los sintetizadores "
+"software de ALSA que se inicien después de que Rosegarden ya esté en "
+"ejecución?</p>\n"
+
+#: ../docs/en/tips.cpp:49
+msgid ""
+"<p>...that you can make your default studio override that in every "
+"Rosegarden composition you load?<br><br>If your studio setup does not change "
+"very often, and you would prefer for\n"
+"the settings in your default studio to take precedence over whatever\n"
+"studio is saved with any files you happen to load, you can make your studio "
+"the default for everything using <b>Settings -> Configure Rosegarden ->\n"
+"MIDI -> Always use default studio when loading files</b>.</p>\n"
+msgstr ""
+"<p>... que usted puede hacer que su estudio por omisión prevalezca sobre "
+"cualquier composición de Rosegarden que cargue?<br><br>Si la configuración "
+"de su estudio no cambia muy a menudo, y usted prefiere que\n"
+"las configuraciones en su estudio por omisión tengan prioridad sobre "
+"cualquier\n"
+"estudio almacenado con cualquier archivo que esté cargando, puede hacer de "
+"su estudio el estudio predeterminado para todo, usando <b>Preferencias -> "
+"Configurar Rosegarden ->MIDI -> Usar siempre estudio por omisión al cargar\n"
+" archivos</b>.</p>\n"
+
+#: ../docs/en/tips.cpp:57
+msgid ""
+"<p>If you have accidentally recorded a segment so short that it does not\n"
+"appear on the canvas, which you can only hear during subsequent recording\n"
+"sessions, you can gain access to it by using <b>Composition -> Change\n"
+"Composition Start and End</b> and then setting the composition to start at a "
+"negative number.</p>\n"
+msgstr ""
+"<p>Si usted ha grabado accidentalmente un segmento tan corto que no\n"
+"aparece en el lienzo, y el cual solo puede escucharlo durante las "
+"siguientes\n"
+"sesiones de grabación, puede obtener acceso a éste usando <b>Composición -"
+"> \n"
+"Cambiar Comienzo y Final de la Composición</b> y luego configurar la "
+"composición\n"
+"para que empiece en un número negativo.</p>\n"
+
+#: ../docs/en/tips.cpp:65
+msgid ""
+"<p>...that if you place a note at the wrong pitch using the notation or "
+"matrix editor, you can move it one semitone at a time with the up and down "
+"arrow keys on your keyboard?</p>\n"
+msgstr ""
+"<p>...que si coloca una nota a una altura incorrecta usando el editor de "
+"partituras o de matriz, puede moverla un semitono cada vez con las teclas de "
+"flecha arriba y abajo del teclado?</p>\n"
+
+#: ../docs/en/tips.cpp:70
+msgid ""
+"<p>...that you can toggle stem directions in the notation editor by "
+"selecting\n"
+"one or more notes and using Ctrl-PageUp and Ctrl-PageDown?</p>\n"
+msgstr ""
+"<p>...que puede cambiar la dirección de las plicas en el editor de "
+"partituras seleccionando\n"
+"una o mas notas y usando Ctrl-RePag y Ctrl-AvPag?</p>\n"
+
+#: ../docs/en/tips.cpp:76
+msgid ""
+"<p>...that you can change the accidental used for a note in the notation "
+"editor (without changing the pitch of the note) by selecting\n"
+"it and using the up and down arrow keys with both Ctrl and Shift pressed?</"
+"p>\n"
+msgstr ""
+"<p>...que puede cambiar el signo de alteración usado para una nota en el "
+"editor de partitura (sin cambiar la altura de la nota) seleccionándola\n"
+"y usando las teclas de flecha arriba y abajo del teclado con Ctrl y "
+"Mayúsculas pulsadas simultáneamente?</p>\n"
+
+#: ../docs/en/tips.cpp:82 ../docs/en/tips.cpp:93
+msgid ""
+"<p>...that you can hold down the Shift key while repositioning segments on "
+"the\n"
+"segment canvas in order to avoid the \"snap-to\" effect and exert finer "
+"control?</p>\n"
+msgstr ""
+"<p>...que puede mantener pulsada la tecla de cambio a mayúsculas mientras "
+"reposiciona segmentos en el lienzo\n"
+"de segmentos para evitar el efecto \"auto-posicionamiento\" y ejercer un "
+"control más fino?</p>\n"
+
+#: ../docs/en/tips.cpp:88
+msgid ""
+"<p>...that you can use the arrow tool to draw, move, and resize segments and "
+"events as well as to select them?<br><br>Drag a segment or event block to "
+"move it, drag the right edge of a block to resize it, and drag with the "
+"middle mouse button pressed to draw a new segment or event.<br><br>(Of "
+"course, the dedicated draw, move and resize tools are still quicker for "
+"repeated operations.)</p>\n"
+msgstr ""
+"<p>...que puede usar la herramienta \"flecha\" para dibujar, mover y "
+"redimensionar segmentos además de seleccionarlos?<br><br>Arrastre un "
+"segmento o un bloque de eventos para moverlo, arrastre el margen derecho de "
+"un bloque para redimensionarlo, y arrastre con el botón medio del ratón "
+"pulsado para dibujar un nuevo segmento o evento.<br><br> (Por supuesto, las "
+"herramientas dedicadas 'mover' y 'redimensionar' son más eficaces para "
+"operaciones reiteradas.)</p>\n"
+
+#: ../docs/en/tips.cpp:99
+msgid ""
+"<p>...that you can hold down the Shift key while repositioning or resizing "
+"events in the\n"
+"matrix view in order to avoid the \"snap-to\" effect and exert finer control?"
+"</p>\n"
+msgstr ""
+"<p>...que puede mantener pulsada la tecla de cambio a mayúsculas mientras "
+"reposiciona o redimensiona eventos en la vista del editor de matriz \n"
+"para evitar el efecto de \"auto-posicionamiento\" y ejercer un control más "
+"fino?</p>\n"
+
+#: ../docs/en/tips.cpp:105
+msgid ""
+"<p>...that you can edit multiple segments on multiple tracks simultaneously "
+"in\n"
+"the notation editor? Simply select the segments, then use <b>Edit -> Open "
+"in Notation Editor</b>.</p>\n"
+msgstr ""
+"<p>...que puede editar múltiples segmentos en múltiples pistas "
+"simultáneamente en\n"
+"el editor de partituras? Simplemente seleccione los segmentos, entonces "
+"utilice <b>Editar->Abrir en el editor de partituras</b></p>\n"
+
+#: ../docs/en/tips.cpp:111
+msgid ""
+"<p>...that Rosegarden can export files for use by LilyPond, the high-quality "
+"score typesetting system?<br><br>\n"
+"From the <b>File</b> menu, navigate to <b>Export -> Export LilyPond File</"
+"b></p>\n"
+msgstr ""
+"<p>...que Rosegarden puede exportar archivos para su uso con LilyPond, el "
+"sistema de\n"
+"edición de partituras de alta calidad?\n"
+"Desde el menú <b>Archivo</b>, navegue a <b>Exportar -> Exportar archivo "
+"LilyPond</b></p>\n"
+
+#: ../docs/en/tips.cpp:117
+msgid ""
+"<p>...that Rosegarden can print via LilyPond, the high-quality score "
+"typesetting system?<br><br>\n"
+"From the <b>File</b> menu, navigate to <b>Preview with LilyPond</b>. The "
+"file\n"
+"will be exported, rendered, and a preview will appear in KPDF, or one of\n"
+"several other PDF viewers, where it can then be printed as well.</p>\n"
+msgstr ""
+"<p>...que Rosegarden puede imprimir vía LilyPond, el sistema de edición de "
+"partituras de alta calidad?<br><br>\n"
+"Desde el menú <b>Archivo</b>, navegue a <b>Previsualizar con LilyPond</b> El "
+"archivo será exportado, representado y previsualizado con KPDF u otro "
+"programa visor de archivos PDF, desde el cual también puede ser impreso.</"
+"p>\n"
+
+#: ../docs/en/tips.cpp:125
+msgid ""
+"<p>...that if you use the quantizer from within the notation view, you can "
+"tell it to quantize only the timing used for notation -- making it possible "
+"to have good looking notation <b>and</b> a human MIDI performance?</p>\n"
+msgstr ""
+"<p>...que si usted usa la cuantificación desde la vista de edición de "
+"partitura, puede decirle que cuantifique solamente los tiempos usados para "
+"la notación de partitura -- haciendo posible tener una partitura elegante "
+"<b>y a la vez</b> una interpretación MIDI humana?</p>\n"
+
+#: ../docs/en/tips.cpp:130
+msgid ""
+"<p>...that you can change segment labels using the controls on the Segment "
+"Parameters box\n"
+"in the main window?</p>\n"
+msgstr ""
+"<p>...que usted puede cambiar las etiquetas de los segmentos utilizando los "
+"controles en la caja Parámetros de Segmento de la ventana principal?</p>\n"
+
+#: ../docs/en/tips.cpp:136
+msgid ""
+"<p>...that the number of tracks in new documents is based on the contents "
+"of\n"
+"your autoload.rg file?\n"
+"<br><br>\n"
+"Whether you prefer to start with three tracks or 43, create a document that\n"
+"contains the desired number of tracks, plus any other studio or document "
+"properties settings\n"
+"you wish to configure, and use <b>Composition -> Studio -> Save Current "
+"Document as Default\n"
+"Studio</b> to make this your new default.</p>\n"
+msgstr ""
+"<p>...que el número de pistas en los nuevos documentos está basado en el "
+"contenido de su archivo autoload.rg?\n"
+"Si prefiere comenzar con tres pistas o con 43, cree un documento que\n"
+"contenga el número de pistas deseado, mas cualesquiera otras preferencias de "
+"estudio\n"
+"o de documento que desee configurar, y utilice <b>Composición -> Estudio -> "
+"Guardar documento actual como \n"
+"Estudio predeterminado</b> para que esta configuración se active por omisión."
+"</p>\n"
+
+#: ../docs/en/tips.cpp:147
+msgid ""
+"<p>...that you can change the name of a track by double clicking on the "
+"label? (The\n"
+"label must be visible for this to work.)</p>\n"
+msgstr ""
+"<p>...que puede cambiar el nombre de una pista haciendo doble clic en su "
+"etiqueta? (La\n"
+"etiqueta debe estar visible para que esto funcione.)</p>\n"
+
+#: ../docs/en/tips.cpp:153
+msgid ""
+"<p>...that you can configure what happens when you double-click on a segment?"
+"<br><br>Go to <b>Settings -> Configure Rosegarden</b> and choose your "
+"preferred editing window under the <b>Behaviour</b> tab.</p>\n"
+msgstr ""
+"<p>...que puede configurar lo que ocurre cuando hace doble clic en un "
+"segmento? Seleccione <b>Preferencias -> Configurar Rosegarden</b> y elija "
+"la opción que prefiera bajo la pestaña <b>Comportamiento</b>.</p>\n"
+
+#: ../docs/en/tips.cpp:158
+msgid ""
+"<p>...that Rosegarden is being developed as a community effort with\n"
+"contributions from around the world?<br><br>\n"
+"The four most active developers live in London (England), Cannes, "
+"Barcelona,\n"
+"and... Christiansburg? (Christiansburg is a town of about 50,000 in\n"
+"southwestern Virginia, USA.)<br><br>\n"
+"We have had contributors from elsewhere in the US, UK, Spain, Mexico, "
+"Argentina, Germany,\n"
+"Sweden, Russia, Japan, Finland, and Italy, just to name a few...</p>\n"
+msgstr ""
+"<p>...que Rosegarden está siendo desarrollado como un esfuerzo comunitario "
+"con contribuciones procedentes de todas partes del mundo?<br><br>\n"
+"Los cuatro desarrolladores más activos viven en Londres (Inglaterra), "
+"Cannes, Barcelona, y... Christiansburg (Christiansburg es una ciudad de "
+"50.000 habitantes en el suroeste de Virginia, EEUU.)<br><br>Hemos tenido "
+"colaboradores de todas partes en los EEUU, España, Mexico, Argentina, "
+"Alemania, Suecia, Rusia, Japón, Finlandia e Italia, por nombrar algunos...</"
+"p>\n"
+
+#: ../docs/en/tips.cpp:169
+msgid ""
+"<p>...that Rosegarden is available in Spanish, French, German, Russian, "
+"Welsh, Swedish, Italian and Estonian\n"
+"translations? (Just to name a few.)<br><br>\n"
+"If you're interested in translating Rosegarden to another language, drop us "
+"a\n"
+"line at <b>[email protected]</b>.</p>\n"
+msgstr ""
+"<p>...que Rosegarden tiene disponibles traducciones al español, francés, "
+"alemán, ruso, galés, sueco, italiano y estonio?<br><br>\n"
+"Si usted está interesado en traducir Rosegarden a otro idioma, envíenos un "
+"mensaje a\n"
+"<b>[email protected]</b>.</p>\n"
+
+#: ../docs/en/tips.cpp:177
+msgid ""
+"<p>...that you can change the total number of bars in the composition via\n"
+"<b>Composition -> Change Composition Start and End</b>?</p>\n"
+msgstr ""
+"<p>...que se puede cambiar el número total de compases en la composición por "
+"medio de\n"
+"<b>Editar -> Cambiar Comienzo y Final de la Composición</b>?</p>\n"
+
+#: ../docs/en/tips.cpp:183
+msgid ""
+"<p>...that you can see the difference between performance and display "
+"duration\n"
+"of duration-quantized notes in the notation editor?<br><br>\n"
+"Use <b>Settings -> Show Raw Note Ruler</b> to turn on this handy\n"
+"feature.<br><br>\n"
+"<i>Note that this feature does not work in page layout view.</i></p>\n"
+msgstr ""
+"<p>...que puede ver la diferencia entre la interpretación y la duración "
+"representada\n"
+"de las notas cuya duración ha sido cuantificada en el editor de partitura?"
+"<br><br>\n"
+"Utilice <b>Preferencias -> Mostrar regla de Nota Cruda</b> para activar esta "
+"práctica característica.<br><br>\n"
+"<i>Fíjese que esta característica no funciona en el la vista de formato de "
+"página.</i></p>\n"
+
+#: ../docs/en/tips.cpp:192
+msgid ""
+"<p>...that you can add tempo and time-signature changes by double-clicking "
+"on the values displayed in the transport window or tempo rulers?</p>\n"
+msgstr ""
+"<p>...que puede añadir cambios de tempo y de medida del compás haciendo "
+"doble clic en los valores mostrados en la ventana de transporte o regla de "
+"tempo?</p>\n"
+
+#: ../docs/en/tips.cpp:197
+msgid ""
+"<p>...that the transport window can display musical time, sample frame "
+"count, and a visual metronome as well as real time?<br><br>Just click on the "
+"small button at the extreme top left of the window.</p>\n"
+msgstr ""
+"<p>...que la ventana de transporte puede mostrar tiempo musical, contador de "
+"cuadros y un metrónomo visual además de tiempo real?<br><br> Pulse el "
+"pequeño botón de la esquina superior izquierda de la ventana.</p>\n"
+
+#: ../docs/en/tips.cpp:202
+msgid ""
+"<p>...that you can select all notes of a particular pitch in the matrix "
+"view, by shift-clicking on that pitch on the piano keyboard at the left?"
+"<br><br>If you shift-click-drag, you can select whole ranges too.</p>\n"
+msgstr ""
+"<p>...que puede seleccionar todas las notas de una determinada altura en la "
+"vista de matriz, pulsando mayúsculas y haciendo clic en la nota del teclado "
+"de piano de la izquierda? <br><br>También puede seleccionar rangos completos "
+"pulsando mayúsculas + clic + arrastrar.</p>\n"
+
+#: ../docs/en/tips.cpp:207
+msgid ""
+"<p>...that you can set a loop in the main window by clicking-and-dragging on "
+"the time ruler with Shift pressed?<br><br>(If the ruler isn't visible, use "
+"<b>Settings -> Show Rulers</b>.)</p>\n"
+msgstr ""
+"<p>...que puede establecer una repetición en la ventana principal, pulsando "
+"y arrastrando en la regla de tiempo con la tecla de mayúsculas pulsada? "
+"<br><br> (Si la regla no está visible, utilice <b>Preferencias -> Mostrar "
+"reglas</b>.)</p>\n"
+
+#: ../docs/en/tips.cpp:212
+msgid ""
+"<p>...that if you're editing a section in the matrix or notation view, you "
+"can\n"
+"set that section to loop while you edit it?<br><br>Select it and use "
+"<b>Tools ->\n"
+"Local Cursor -> Set Loop to Selection</b>, then hit Play.</p><br><br>\n"
+"<i>This feature does not work quite as well for compositions that include "
+"sampled\n"
+"audio.</i>\n"
+msgstr ""
+"<p>...que si usted está editando una sección en las vistas de matriz o "
+"partitura, puede establecer dicha sección como repetición mientras la está "
+"editando? <br><bt> Seleccione y utilice <b>Herramientas -> Cursor Local -> "
+"Establecer repetición en la Selección</b>, luego pulse Reproducir.</"
+"p><br><br>\n"
+"<i>Esta caracteristica no funciona demasiado bien en composiciones que "
+"incluyen audio digital.</i>\n"
+
+#: ../docs/en/tips.cpp:221
+msgid ""
+"<p>...if you have more than one note or controller event at the same time, "
+"you\n"
+"can use the [ and ] keys to flip the stack of events around on the "
+"controller\n"
+"and velocity rulers in order to bring the item you wish to adjust into\n"
+"focus.</p>\n"
+msgstr ""
+"<p>...si usted tiene más de una nota o evento de controlador en el mismo "
+"tiempo, puede usar\n"
+"las teclas [ y ] para intercambiar el orden en la pila de eventos, en la "
+"barra de controladores\n"
+"y de velocidad para traer al frente el ítem que desea ajustar.</p>\n"
+
+#: ../docs/en/tips.cpp:229
+msgid ""
+"<p>...that the notation view shows you notes using their display duration, "
+"while the\n"
+"matrix allows you to edit their performance duration?<br><br>\n"
+"<i>Be careful with tied notes in the matrix. It is not apparent that they "
+"are\n"
+"tied, and if you split up a pair of tied notes, subsequent notation views "
+"will\n"
+"be confused and unhappy. This is an old bug that has been on our TODO list\n"
+"for years. Sorry about that, folks. Patches welcome.</i>\n"
+"</p>\n"
+msgstr ""
+"<p>...que la vista de partitura le muestra las notas utilizando las "
+"duraciones de representación, mientras que la vista de matriz le permite "
+"editar sus duraciones de interpretación?<br><br>\n"
+"<i>Tenga cuidado con las notas ligadas en la matriz. No es evidente que "
+"están ligadas\n"
+"y si usted divide un par de notas ligadas, la vista de partitura estará "
+"confundida e infeliz.\n"
+"Este es un viejo defecto que ha estado en nuestra lista de tareas pendientes "
+"durante años.\n"
+"Lo sentimos, amigos. Parches serán bienvenidos.</i></p>\n"
+
+#: ../docs/en/tips.cpp:240
+msgid ""
+"<p>If you're working with a human performance and you need to insert some "
+"new\n"
+"notes, these new notes will sound for their entire written duration. To "
+"blend\n"
+"these new notes into a human performance, select them, then use <b>Adjust -> "
+"Interpret...</b> \n"
+"from the notation view to interpret any marks and massage their "
+"performance\n"
+"durations to something less mechanical.</p>\n"
+msgstr ""
+"<p>si usted está trabajando con una interpretación humana y necesita "
+"insertar algunas\n"
+"notas nuevas, dichas nuevas notas sonarán durante tanto tiempo como indica "
+"su duración\n"
+"escrita. Para fusionar estas notas con una interpretación humana, "
+"selecciónelas y utilice \n"
+"<b>Ajuste -> Notas -> Interpretar...</b> desde la ventana del editor de "
+"partitura, para\n"
+"interpretar cualesquiera marcadores y masajear su interpretación en algo "
+"menos mecánico</p>\n"
+
+#: ../docs/en/tips.cpp:249
+msgid ""
+"<p>...that Rosegarden can export certain things to LilyPond that it cannot "
+"yet\n"
+"display within its own native interface?<br><br>These new directives can be "
+"inserted\n"
+"via the <b>T</b> text insert tool in the notation view.<br><br>\n"
+"Load the example files\n"
+"<b>lilypond-alternative-endings.rg</b> and <b>lilypond-directives.rg</b> for "
+"a\n"
+"demonstration of how to use the new exportable directives.<br><br>\n"
+"Use <b>File -> Preview with\n"
+"LilyPond</b> to see what they look like on the exported page.<br><br>\n"
+"<i>Be sure to turn on\n"
+"<b>Settings -> Show LilyPond Directives</b> and <b>Show Annotations</b> "
+"within\n"
+"the notation view.</i></p>\n"
+msgstr ""
+"<p>...que Rosegarden puede exportar ciertas cosas a LilyPond que no puede "
+"mostrar con su interfáz propio? <br><br> Estas directrices nuevas pueden "
+"insertarse desde la vista de partitura con la herramienta <b>T</b> de "
+"inserción de Texto. <br><br>Cargue los archivos de ejemplo <b>lilypond-"
+"alternative-endings.rg</b> y <b>lilypond-directives.rg</b> para una "
+"demostración de como usar las nuevas \n"
+"directrices exportables.<br><br>\n"
+"Utilice <b>Archivo -> Previsualizar con LilyPond</b> para ver como quedan en "
+"la página exportada.<br><br>\n"
+"Asegúrese de habilitar <b>Preferencias ->Mostrar Directrices para LilyPond</"
+"b> y <b>Mostrar Anotaciones</b> en la vista de partitura.</i></p>\n"
+
+#: ../docs/en/tips.cpp:264
+msgid ""
+"<p>...that Rosegarden has track parameters allowing you to <b>Create "
+"segments with:</b> certain\n"
+"properties by default?<br><br>You can pre-select the clef, transposition, "
+"colour, and specify\n"
+"the highest and lowest playable notes (notes outside this range display in\n"
+"red by default). Then draw a segment with the pencil, or record one, and "
+"any\n"
+"new segments created on this track will take these properties as segment\n"
+"parameters.<br><br>\n"
+"<i>These parameters do not apply to audio tracks.</i></p>\n"
+msgstr ""
+"<p>... que Rosegarden tiene parámetros de pista que se pueden utilizar para "
+"<b>Crear nuevos segmentos con:</b> ciertas propiedades por defecto?"
+"<br><br>Usted puede seleccionar la clave, la transposición, el color, y "
+"especificar las notas más altas y más bajas que pueden ser tocadas en un "
+"instrumento de un cierto tipo (notas afuera de este ámbito se muestran en "
+"rojo). Luego puede dibujar o grabar un segmento, y todos los segmentos "
+"creados en esa pista tomarán estas propiedades como parámetros de segmento. "
+"<br><br>\n"
+"<i>Estos parámetros no tienen nada que ver con segmentos audio.</i></p>\n"
+
+#: ../docs/en/tips.cpp:275
+msgid ""
+"<p>...that Rosegarden has a database of preset parameters describing more "
+"than 300\n"
+"musical instruments from the real world, grouped into several convenient\n"
+"categories?<br><br>Each preset contains a clef, transposition, and playable "
+"range\n"
+"suggestions for both amateur and professional players.<br><br>Click the\n"
+"<b>Load</b> button in the new track parameters box to get started! <i>(If "
+"you\n"
+"do not see a <b>Load</b> button, be sure your parameter panel is set for\n"
+"tabbed mode, rather than stacked mode.)</i> <br><br> <i>(Special thanks to "
+"Magnus\n"
+"Johansson for assembling this extraordinary database.)</i></p>\n"
+msgstr ""
+"<p>... que Rosegarden tiene una nueva base de datos de parámetros "
+"preprogramados que describe más de 300 instrumentos musicales del mundo "
+"real, agrupados en varias categorías convenientes?<br><br> Cada instrumento "
+"preprogramado contiene una clave, una transposición, y una tesitura adecuada "
+"para un músico aficionado y uno profesional.<br><br>Pulse el botón "
+"<b>Cargar</b> en la nueva caja de parámetros de pista para comenzar! <i>(Si "
+"no puede ver un botón <b>Cargar</b>, asegúrese de que el panel se muestra "
+"con pestañas en lugar de apilado.)</i><br><br><i>(Gracias especiales a "
+"Magnus Johansson por reunir esta extraordinaria base de datos.)</i></p>\n"
+
+#: ../docs/en/tips.cpp:287
+msgid ""
+"<p>...that when exporting to Lilypond, you can merge tracks that have the "
+"same name onto a single staff?<br><br>For example, if there are three voices "
+"in a single part, write each\n"
+"voice as an independent segment/staff, each on a separate track. Give all\n"
+"three tracks the same name, and select <b>[x] Merge tracks that have the "
+"same\n"
+"name</b> from the options dialog that appears when you export to, or "
+"preview\n"
+"with LilyPond.<br><br>\n"
+"<i>The tracks must have a non-default name for this to work.</i></p>\n"
+msgstr ""
+"<p>...que al exportar a LilyPond usted puede fusionar las pistas que tienen "
+"el mismo nombre en el mismo pentagrama?<br><br>Por ejemplo, si hay tres "
+"voces en una misma parte, escriba cada voz como un segmento independiente, y "
+"seleccione <b>[x] Fusionar pistas con el mismo nombre</b> en el diálogo de "
+"opciones que aparece cuando exporta o previsualiza con LilyPond.<br><br>\n"
+"<i>Las pistas no pueden tener el nombre por defecto, para que esta técnica "
+"funcione.</i></p>\n"
+
+#: ../docs/en/tips.cpp:297
+msgid ""
+" \t \n"
+"<p>...that you can use the mouse wheel to scroll up and down, scroll left "
+"and right, and zoom in and out?<br><br>Just roll the wheel to scroll up or "
+"down. Hold Alt as well to scroll left or right, or hold Ctrl to zoom in and "
+"out.</p> \t \n"
+msgstr ""
+" \t \n"
+"<p>...que puede usar la rueda del ratón para desplazar arriba y abajo, "
+"izquierda y derecha, y ampliar o reducir?<br><br> Utilice simplemente la "
+"rueda del ratón para realizar desplazamiento vertical. Pulse la tecla Alt "
+"al mismo tiempo que gira la rueda para el desplazamiento horizontal, o pulse "
+"Ctrl para ampliar y reducir.</p> \t \n"
+
+#: ../docs/en/tips.cpp:303
+msgid ""
+" \t \n"
+"<p>...that you can time-stretch an audio segment -- stretching or squashing "
+"a\n"
+"sample to a different duration without changing its pitch -- just by\n"
+"dragging its right edge with the Ctrl key pressed?</p>\n"
+msgstr ""
+" \t \n"
+"<p>... que puede estirar en el tiempo un segmento de audio --estirar o "
+"encoger\n"
+"una muestra hasta una duración diferente sin cambiar su afinación -- "
+"arrastrando el margen derecho del segmento mientras pulsa la tecka Ctrl?</"
+"p>\n"
+
+#: ../docs/en/tips.cpp:311
+msgid ""
+" \t \n"
+"<p>...that you can add audio to your Rosegarden composition just by dragging "
+"an audio file from your file manager and dropping it on the Rosegarden "
+"segment canvas? (Make sure you drop it on an audio track!)<br><br>You can "
+"also drop audio files from Rosegarden's audio file manager window onto the "
+"segment canvas, and from other programs onto the audio file manager.</p>\n"
+msgstr ""
+" \t \n"
+"<p>...que usted puede añadir audio a su composición de Rosegarden "
+"simplementearastrando y soltando un archivo de audio desde su administrador "
+"de archivos hasta el lienzo de segmentos de Rosegarden? (¡asegúrese de "
+"soltarlo en una pista de audio!)<br><br>\n"
+"También puede soltar archivos de audio desde el administrador de segmentos "
+"de audio de Rosegarden hacia el lienzo de segmentos, y desde otros programas "
+"hasta el administrador de segmentos de audio.</p>\n"
+
+#: ../docs/en/tips.cpp:317
+msgid ""
+" \t \n"
+"<p>...that you can set the tempo to match the duration of an audio segment "
+"if you know it's an exact number of bars or beats long?<br><br>Just select "
+"the audio segment and use <b>Composition -> Tempo and Time Signature -> Set "
+"Tempo to Audio Segment Duration</b>.</p>\n"
+msgstr ""
+" \t \n"
+"<p>...que usted puede establecer el tempo para que coincida con la duración "
+"de un segmento de audio si conoce exactamente su longitud en número de "
+"compases? <br><br>Simplemente seleccione el segmento de audio y utilice "
+"<b>Composición -> Tempo y medida del compás -> Establecer tempo a la "
+"duración del segmento de audio</b>.</p>\n"
+
+#: ../data/fonts/mappings/fonts.cpp:1
+msgid "Feta Pixmaps"
+msgstr "Mapas de pixels Feta"
+
+#: ../data/fonts/mappings/fonts.cpp:2 ../data/fonts/mappings/fonts.cpp:7
+msgid "GNU Lilypond"
+msgstr "GNU LilyPond"
+
+#: ../data/fonts/mappings/fonts.cpp:3 ../data/fonts/mappings/fonts.cpp:8
+msgid "Copyright (c) 1997--2003 Han-Wen Nienhuys and Jan Nieuwenhuizen"
+msgstr "Copyright (c) 1997--2003 Han-Wen Nienhuys y Jan Nieuwenhuizen"
+
+#: ../data/fonts/mappings/fonts.cpp:4 ../data/fonts/mappings/fonts.cpp:9
+#: ../data/fonts/mappings/fonts.cpp:14 ../data/fonts/mappings/fonts.cpp:19
+#: ../data/fonts/mappings/fonts.cpp:24 ../data/fonts/mappings/fonts.cpp:29
+#: ../data/fonts/mappings/fonts.cpp:34 ../data/fonts/mappings/fonts.cpp:39
+#: ../data/fonts/mappings/fonts.cpp:44 ../data/fonts/mappings/fonts.cpp:49
+#: ../data/fonts/mappings/fonts.cpp:54
+msgid "Chris Cannam"
+msgstr "Chris Cannam"
+
+#: ../data/fonts/mappings/fonts.cpp:5 ../data/fonts/mappings/fonts.cpp:40
+msgid "pixmap"
+msgstr "mapa de pixels"
+
+#: ../data/fonts/mappings/fonts.cpp:6
+msgid "Feta"
+msgstr "Feta"
+
+#: ../data/fonts/mappings/fonts.cpp:10 ../data/fonts/mappings/fonts.cpp:15
+#: ../data/fonts/mappings/fonts.cpp:20 ../data/fonts/mappings/fonts.cpp:25
+#: ../data/fonts/mappings/fonts.cpp:30 ../data/fonts/mappings/fonts.cpp:35
+#: ../data/fonts/mappings/fonts.cpp:45 ../data/fonts/mappings/fonts.cpp:50
+#: ../data/fonts/mappings/fonts.cpp:55
+msgid "scalable"
+msgstr "escalable"
+
+#: ../data/fonts/mappings/fonts.cpp:11
+msgid "Fughetta"
+msgstr "Fughetta"
+
+#: ../data/fonts/mappings/fonts.cpp:12
+msgid ""
+"Created by Blake Hodgetts; freely redistributable. See http://www.efn.org/"
+"~bch/aboutfonts.html"
+msgstr ""
+"Creada por Blake Hodgetts; libremente redistribuible. Ver http://www.efn."
+"org/~bch/aboutfonts.html "
+
+#: ../data/fonts/mappings/fonts.cpp:13
+msgid "Copyright 1995-1999 Blake Hodgetts"
+msgstr "Copyright 1995-1999 Blake Hodgetts"
+
+#: ../data/fonts/mappings/fonts.cpp:16
+msgid "Inkpen"
+msgstr "Inkpen"
+
+#: ../data/fonts/mappings/fonts.cpp:17
+msgid "Inkpen is part of Sibelius, but other fonts may use the same mappings."
+msgstr ""
+"Inkpen es parte de Sibelius, pero otras tipografías pueden usar el mismo "
+"mapa."
+
+#: ../data/fonts/mappings/fonts.cpp:18 ../data/fonts/mappings/fonts.cpp:28
+msgid "Copyright Sibelius Software Ltd"
+msgstr "Copyright Sibelius Software Ltd"
+
+#: ../data/fonts/mappings/fonts.cpp:21
+msgid "Maestro"
+msgstr "Maestro"
+
+#: ../data/fonts/mappings/fonts.cpp:22
+msgid "Maestro is part of Finale, but other fonts use the same mappings."
+msgstr ""
+"Maestro es parte de Finale, pero otras tipografías pueden usar el mismo mapa."
+
+#: ../data/fonts/mappings/fonts.cpp:23 ../data/fonts/mappings/fonts.cpp:33
+msgid "Copyright Coda Inc"
+msgstr "Copyright Coda Inc"
+
+#: ../data/fonts/mappings/fonts.cpp:27
+msgid "Opus is part of Sibelius, but other fonts may use the same mappings."
+msgstr ""
+"Opus es parte de Sibelius, pero otras tipografías pueden usar el mismo mapa."
+
+#: ../data/fonts/mappings/fonts.cpp:31
+msgid "Petrucci"
+msgstr "Petrucci"
+
+#: ../data/fonts/mappings/fonts.cpp:32
+msgid "Petrucci is part of Finale, but other fonts use the same mappings."
+msgstr "Petrucci es parte de Finale, pero otras tipografías usan el mismo mapa"
+
+#: ../data/fonts/mappings/fonts.cpp:36
+msgid "RG21"
+msgstr "RG21"
+
+#: ../data/fonts/mappings/fonts.cpp:37
+msgid "Rosegarden 2.1"
+msgstr "Rosegarden 2.1"
+
+#: ../data/fonts/mappings/fonts.cpp:38
+msgid "Copyright (c) 1994--2001 Chris Cannam"
+msgstr "Copyright (c) 1994--2001 Chris Cannam"
+
+#: ../data/fonts/mappings/fonts.cpp:41
+msgid "Sonata"
+msgstr "Sonata"
+
+#: ../data/fonts/mappings/fonts.cpp:42
+msgid "Adobe"
+msgstr "Adobe"
+
+#: ../data/fonts/mappings/fonts.cpp:43
+msgid "Copyright Adobe Inc"
+msgstr "Copyright Adobe Inc"
+
+#: ../data/fonts/mappings/fonts.cpp:46
+msgid "Steinberg"
+msgstr "Steinberg"
+
+#: ../data/fonts/mappings/fonts.cpp:47
+msgid "The Steinberg Notation font is part of Cubase."
+msgstr "La tipografía de partitura de Steinberg es parte de Cubase."
+
+#: ../data/fonts/mappings/fonts.cpp:48
+msgid "Copyright Steinberg Inc"
+msgstr "Copyright Steinberg Inc"
+
+#: ../data/fonts/mappings/fonts.cpp:51
+msgid "Xinfonia"
+msgstr "Xinfonia"
+
+#: ../data/fonts/mappings/fonts.cpp:52
+msgid "xemo.org"
+msgstr "xemo.org"
+
+#: ../data/fonts/mappings/fonts.cpp:53
+msgid "Copyright 2001-2003 Xemus Software LLC"
+msgstr "Copyright 2001-2003 Xemus Software LLC"
+
+#: ../data/styles/styles.cpp:1
+msgid "Classical"
+msgstr "Classical"
+
+#: ../data/styles/styles.cpp:2
+msgid "Cross"
+msgstr "Cross"
+
+#: ../data/styles/styles.cpp:3
+msgid "Mensural"
+msgstr "Mensural"
+
+#: ../data/styles/styles.cpp:4
+msgid "Triangle"
+msgstr "Triangle"
diff --git a/po/et.po b/po/et.po
new file mode 100644
index 0000000..60ef0df
--- /dev/null
+++ b/po/et.po
@@ -0,0 +1,11992 @@
+# translation of et.po to Estonian
+# This file is distributed under the same license as the PACKAGE package.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER.
+# Hasso Tepper <[email protected]>, 2004.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: et\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-04-24 18:19-0400\n"
+"PO-Revision-Date: 2004-01-04 17:27+0200\n"
+"Last-Translator: Hasso Tepper <[email protected]>\n"
+"Language-Team: Estonian <[email protected]>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.3\n"
+
+#: ../src/gui/dialogs/RescaleDialog.cpp:51 rc.cpp:192 rc.cpp:312
+#, no-c-format
+msgid "Rescale"
+msgstr ""
+
+#: ../src/gui/dialogs/RescaleDialog.cpp:56
+#, fuzzy
+msgid "Duration of selection"
+msgstr "Valiku lõikamine..."
+
+#: ../src/gui/dialogs/RescaleDialog.cpp:62
+msgid "Adjust times of following events accordingly"
+msgstr ""
+
+#: ../src/gui/dialogs/PitchDialog.cpp:45
+#: ../src/gui/dialogs/RescaleDialog.cpp:72
+#: ../src/gui/dialogs/TimeDialog.cpp:51 ../src/gui/dialogs/TimeDialog.cpp:68
+#: ../src/gui/studio/BankEditorDialog.cpp:109
+msgid "Reset"
+msgstr "Lähtesta"
+
+#: ../src/commands/segment/SegmentSplitByPitchCommand.cpp:46
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:46
+msgid "Split by Pitch"
+msgstr "Tükeldamine helikõrguse järgi"
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:54
+msgid "Starting split pitch"
+msgstr ""
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:57
+msgid "Range up and down to follow music"
+msgstr ""
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:63
+msgid "Duplicate non-note events"
+msgstr ""
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:66
+msgid "Clef handling:"
+msgstr "Noodivõtmed:"
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:69
+msgid "Leave clefs alone"
+msgstr "Jäta noodivõtmed rahule"
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:70
+msgid "Guess new clefs"
+msgstr "Uute noodivõtmete arvamine"
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:71
+msgid "Use treble and bass clefs"
+msgstr "Viiulivõtme ja bassivõtme kasutamine"
+
+#: ../src/gui/dialogs/DocumentConfigureDialog.cpp:64
+#, fuzzy
+msgid "Document Properties"
+msgstr "&Redigeeri dokumendi omadusi..."
+
+#: ../src/gui/dialogs/MakeOrnamentDialog.cpp:45
+#: ../src/gui/editors/notation/NotationView.cpp:6048
+#, fuzzy
+msgid "Make Ornament"
+msgstr "Märgise nimi "
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:183
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:179
+#: ../src/gui/dialogs/EventEditDialog.cpp:128
+#: ../src/gui/dialogs/MakeOrnamentDialog.cpp:49
+#: ../src/gui/studio/DeviceEditorDialog.cpp:74
+#: ../src/gui/studio/NameSetEditor.cpp:72
+#: ../src/gui/widgets/ColourTable.cpp:51
+msgid "Name"
+msgstr "Nimi"
+
+#: ../src/gui/dialogs/MakeOrnamentDialog.cpp:51
+msgid ""
+"The name is used to identify both the ornament\n"
+"and the triggered segment that stores\n"
+"the ornament's notes."
+msgstr ""
+
+#: ../src/gui/dialogs/MakeOrnamentDialog.cpp:54
+#, fuzzy
+msgid "Name: "
+msgstr "Nimi:"
+
+#: ../src/gui/dialogs/MakeOrnamentDialog.cpp:57
+#: ../src/gui/editors/eventlist/EventView.cpp:717
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:92
+#, fuzzy
+msgid "Base pitch"
+msgstr "Noodi helikõrgus:"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:57
+#: ../src/gui/editors/eventlist/EventView.cpp:140
+msgid "Text"
+msgstr "Tekst"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:66
+msgid "Specification"
+msgstr "Spetsifikatsioon"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:68
+msgid "Preview"
+msgstr "Eelvaatlus"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:72
+msgid "Text: "
+msgstr "Tekst. "
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:79
+msgid "Style: "
+msgstr "Stiil. "
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:90
+msgid "Dynamic"
+msgstr "Dünaamiline"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:93
+msgid "Direction"
+msgstr "Suund"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:96
+msgid "Local Direction"
+msgstr "Kohalik suund"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:63
+#: ../src/gui/dialogs/TextEventDialog.cpp:99
+#: ../src/gui/editors/tempo/TempoView.cpp:91
+msgid "Tempo"
+msgstr "Tempo"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:102
+msgid "Local Tempo"
+msgstr "Kohalik tempo"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:105
+msgid "Lyric"
+msgstr "Sõnad"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:108
+#: ../src/gui/editors/notation/NotationView.cpp:4242
+#, fuzzy
+msgid "Chord"
+msgstr "Tekita a&kord"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:111
+msgid "Annotation"
+msgstr "Annotatsioon"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:114
+#, fuzzy
+msgid "LilyPond Directive"
+msgstr "Lilypond failid"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:138
+msgid "Verse: "
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:148
+#, fuzzy
+msgid "Dynamic: "
+msgstr "Dünaamiline"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:152
+msgid "ppp"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:153
+msgid "pp"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:154
+msgid "p"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:155
+msgid "mp"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:156
+msgid "mf"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:157
+msgid "f"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:158
+#, fuzzy
+msgid "ff"
+msgstr "väljas"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:159
+#, fuzzy
+msgid "fff"
+msgstr "väljas"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:160
+msgid "rfz"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:161
+msgid "sf"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:165
+#, fuzzy
+msgid "Direction: "
+msgstr "Suund"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:174
+msgid " ,"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:175
+msgid "D.C. al Fine"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:176
+msgid "D.S. al Fine"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:177
+#, fuzzy
+msgid "Fine"
+msgstr "Sündmuste filter"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:178
+msgid "D.S. al Coda"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:179
+msgid "to Coda"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:180
+#, fuzzy
+msgid "Coda"
+msgstr "Noodivõti"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:184
+#, fuzzy
+msgid "Local Direction: "
+msgstr "Kohalik suund"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:188
+#, fuzzy
+msgid "accel."
+msgstr "Kanal"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:189
+msgid "ritard."
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:190
+msgid "ralletando"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:191
+#, fuzzy
+msgid "a tempo"
+msgstr "Uus tempo"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:192
+#, fuzzy
+msgid "legato"
+msgstr "Legal"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:193
+#, fuzzy
+msgid "simile"
+msgstr "Sündmuste filter"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:194
+msgid "pizz."
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:195
+#, fuzzy
+msgid "arco"
+msgstr "&Marcato"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:196
+msgid "non vib."
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:197
+msgid "sul pont."
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:198
+#: ../src/gui/dialogs/TextEventDialog.cpp:200
+msgid "sul tasto"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:199
+msgid "con legno"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:201
+msgid "sul G"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:202
+msgid "ordinario"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:203
+#, fuzzy
+msgid "Muta in "
+msgstr "Metastring:"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:204
+msgid "volti subito "
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:205
+msgid "soli"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:206
+msgid "div."
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:210
+#, fuzzy
+msgid "Tempo: "
+msgstr "Tempo"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:214
+#: ../src/gui/dialogs/TextEventDialog.cpp:238
+msgid "Grave"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:215
+#: ../src/gui/dialogs/TextEventDialog.cpp:239
+#, fuzzy
+msgid "Adagio"
+msgstr "Audio"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:216
+#: ../src/gui/dialogs/TextEventDialog.cpp:240
+msgid "Largo"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:217
+#: ../src/gui/dialogs/TextEventDialog.cpp:241
+#, fuzzy
+msgid "Lento"
+msgstr "Legal"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:218
+#: ../src/gui/dialogs/TextEventDialog.cpp:242
+msgid "Andante"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:219
+#: ../src/gui/dialogs/TextEventDialog.cpp:243
+#, fuzzy
+msgid "Moderato"
+msgstr "&Muuda märgist"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:220
+#: ../src/gui/dialogs/TextEventDialog.cpp:244
+msgid "Allegretto"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:221
+#: ../src/gui/dialogs/TextEventDialog.cpp:245
+msgid "Allegro"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:222
+#: ../src/gui/dialogs/TextEventDialog.cpp:246
+#, fuzzy
+msgid "Vivace"
+msgstr " Vaade: "
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:223
+#: ../src/gui/dialogs/TextEventDialog.cpp:247
+#, fuzzy
+msgid "Presto"
+msgstr "paus"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:224
+#: ../src/gui/dialogs/TextEventDialog.cpp:248
+#, fuzzy
+msgid "Prestissimo"
+msgstr "Esitlus"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:225
+#: ../src/gui/dialogs/TextEventDialog.cpp:249
+#, fuzzy
+msgid "Maestoso"
+msgstr "Metronoom"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:226
+#: ../src/gui/dialogs/TextEventDialog.cpp:250
+#, fuzzy
+msgid "Sostenuto"
+msgstr "T&enuto"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:227
+#: ../src/gui/dialogs/TextEventDialog.cpp:251
+#, fuzzy
+msgid "Tempo Primo"
+msgstr "Tempo"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:234
+#, fuzzy
+msgid "Local Tempo: "
+msgstr "Kohalik tempo"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:255
+#, fuzzy
+msgid "Directive: "
+msgstr "Suund"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:312
+msgid "Example"
+msgstr "Näide"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:65
+msgid "Event Filter"
+msgstr "Sündmuste filter"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:86
+#, fuzzy
+msgid "Note Events"
+msgstr "Liiguta sündmuseid"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:90
+msgid "lowest:"
+msgstr ""
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:93
+msgid "highest:"
+msgstr ""
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:96
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:141
+#: ../src/gui/widgets/PitchChooser.cpp:53
+msgid "Pitch:"
+msgstr "Helikõrgus:"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:99
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:163
+msgid "Velocity:"
+msgstr "Kiirus:"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:102
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:129
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:257
+msgid "Duration:"
+msgstr "Kestvus:"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:107
+#: ../src/gui/dialogs/EventFilterDialog.cpp:114
+#: ../src/gui/dialogs/EventFilterDialog.cpp:121
+msgid "include"
+msgstr "kaasaarvatud"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:108
+#: ../src/gui/dialogs/EventFilterDialog.cpp:115
+#: ../src/gui/dialogs/EventFilterDialog.cpp:122
+msgid "exclude"
+msgstr "väljaarvatud"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:136
+#: ../src/gui/dialogs/EventFilterDialog.cpp:155
+#: ../src/gui/editors/eventlist/EventView.cpp:172
+#: ../src/gui/editors/eventlist/EventView.cpp:179
+#: ../src/gui/editors/eventlist/EventView.cpp:186
+#, fuzzy
+msgid "edit"
+msgstr "Redigeerimine"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:141
+#: ../src/gui/dialogs/EventFilterDialog.cpp:157
+msgid "choose a pitch using a staff"
+msgstr ""
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:182
+#: ../src/gui/dialogs/EventFilterDialog.cpp:188
+msgid "longest"
+msgstr ""
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:200
+msgid "Include all"
+msgstr "Kaasa kõik"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:203
+msgid "Include entire range of values"
+msgstr "Kaasa terve väärtuste piirkond"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:206
+msgid "Exclude all"
+msgstr ""
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:209
+msgid "Exclude entire range of values"
+msgstr ""
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:233
+#: ../src/gui/dialogs/EventFilterDialog.cpp:234
+#, fuzzy
+msgid "shortest"
+msgstr "paus"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:333
+#, fuzzy
+msgid "Lowest pitch"
+msgstr "Noodi helikõrgus:"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:343
+#, fuzzy
+msgid "Highest pitch"
+msgstr "Sõnade redigeerimine"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:56
+#: ../src/gui/editors/notation/NotationView.cpp:1619
+#: ../src/gui/editors/notation/NotationView.cpp:6088
+msgid "Use Ornament"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:260
+#: ../src/gui/configuration/NotationConfigurationPage.h:64
+#: ../src/gui/configuration/NotationConfigurationPage.h:65
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:63
+msgid "Notation"
+msgstr "Noodikiri"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:68
+#, fuzzy
+msgid "Display as: "
+msgstr "Näita aega lõpuni"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:84
+#, fuzzy
+msgid "Trill"
+msgstr "Tri&ller"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:84
+msgid "Trill with line"
+msgstr ""
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:84
+msgid "Trill line only"
+msgstr ""
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:85
+msgid "Turn"
+msgstr ""
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:85
+msgid "Mordent"
+msgstr ""
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:85
+#, fuzzy
+msgid "Inverted mordent"
+msgstr "Lisa sündmus"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:86
+msgid "Long mordent"
+msgstr ""
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:86
+msgid "Long inverted mordent"
+msgstr ""
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:94
+#, fuzzy
+msgid "Text mark"
+msgstr "Tekst: "
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:98
+#, fuzzy
+msgid " Text: "
+msgstr "Tekst. "
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:104
+#, fuzzy
+msgid "Performance"
+msgstr "Programmi muutus"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:109
+msgid "Perform using triggered segment: "
+msgstr ""
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:75
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:123
+msgid "Perform with timing: "
+msgstr ""
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:81
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:129
+msgid "As stored"
+msgstr ""
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:82
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:130
+msgid "Truncate if longer than note"
+msgstr ""
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:83
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:131
+msgid "End at same time as note"
+msgstr ""
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:84
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:132
+msgid "Stretch or squash segment to note duration"
+msgstr ""
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:86
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:134
+msgid "Adjust pitch to note"
+msgstr ""
+
+#: ../src/gui/dialogs/PitchPickerDialog.cpp:40
+msgid "Pitch Selector"
+msgstr ""
+
+#: ../src/gui/dialogs/BeatsBarsDialog.cpp:44
+#, fuzzy
+msgid "Audio Segment Duration"
+msgstr "Kestvus"
+
+#: ../src/gui/dialogs/BeatsBarsDialog.cpp:50
+msgid "The selected audio segment contains:"
+msgstr ""
+
+#: ../src/gui/dialogs/BeatsBarsDialog.cpp:59
+#, fuzzy
+msgid "beat(s)"
+msgstr "löögid:"
+
+#: ../src/gui/dialogs/BeatsBarsDialog.cpp:60
+msgid "bar(s)"
+msgstr ""
+
+#: ../src/gui/dialogs/TupletDialog.cpp:51
+msgid "Tuplet"
+msgstr ""
+
+#: ../src/gui/dialogs/TupletDialog.cpp:58
+msgid "New timing for tuplet group"
+msgstr ""
+
+#: ../src/gui/dialogs/TupletDialog.cpp:76
+msgid "Play "
+msgstr "Mängitakse "
+
+#: ../src/gui/dialogs/TupletDialog.cpp:98
+msgid "in the time of "
+msgstr ""
+
+#: ../src/gui/dialogs/TupletDialog.cpp:104
+msgid "Timing is already correct: update display only"
+msgstr ""
+
+#: ../src/gui/dialogs/TupletDialog.cpp:114
+msgid "Timing calculations"
+msgstr ""
+
+#: ../src/gui/dialogs/TupletDialog.cpp:120
+msgid "Selected region:"
+msgstr "Valitud ala:"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:129
+msgid "Group with current timing:"
+msgstr ""
+
+#: ../src/gui/dialogs/TupletDialog.cpp:135
+msgid "Group with new timing:"
+msgstr ""
+
+#: ../src/gui/dialogs/TupletDialog.cpp:141
+msgid "Gap created by timing change:"
+msgstr ""
+
+#: ../src/gui/dialogs/TupletDialog.cpp:149
+msgid "Unchanged at end of selection:"
+msgstr ""
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:63 rc.cpp:372
+#, no-c-format
+msgid "Metronome"
+msgstr "Metronoom"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:77
+msgid "Metronome Instrument"
+msgstr "Metronoomi instrument"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:82
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:150
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:183
+#: ../src/gui/studio/DeviceEditorDialog.cpp:73
+#: ../src/gui/studio/DeviceManagerDialog.cpp:105
+#: ../src/gui/studio/DeviceManagerDialog.cpp:163
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:66
+msgid "Device"
+msgstr "Seade"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:101
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:89
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:215
+#: ../src/gui/studio/DeviceEditorDialog.cpp:195
+#: ../src/gui/studio/DeviceEditorDialog.cpp:218
+#: ../src/gui/studio/DeviceEditorDialog.cpp:230
+#: ../src/gui/studio/DeviceManagerDialog.cpp:196
+#: ../src/gui/studio/DeviceManagerDialog.cpp:440
+#: ../src/gui/studio/DeviceManagerDialog.cpp:452
+msgid "No connection"
+msgstr "Ühendus puudub"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:112
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:111
+#: ../src/gui/editors/parameters/InstrumentParameterBox.cpp:53
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:1209
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:159
+#: ../src/gui/general/PresetHandlerDialog.cpp:92
+#: ../src/gui/studio/MidiMixerWindow.cpp:204
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:67
+msgid "Instrument"
+msgstr "Instrument"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:118
+#, fuzzy
+msgid "Beats"
+msgstr "Biit"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:184
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:123
+msgid "Resolution"
+msgstr "Resolutsioon"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:309
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:139
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:205
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:125
+#: ../src/gui/editors/matrix/MatrixView.cpp:2132
+#: ../src/gui/editors/notation/NotationView.cpp:1582
+#: ../src/gui/widgets/QuantizeParameters.cpp:128
+#: ../src/gui/widgets/QuantizeParameters.cpp:301
+msgid "None"
+msgstr "Puudub"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:126
+msgid "Bars only"
+msgstr ""
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:127
+msgid "Bars and beats"
+msgstr ""
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:128
+msgid "Bars, beats, and divisions"
+msgstr ""
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:132
+#, fuzzy
+msgid "Bar velocity"
+msgstr "Noodi kiirus:"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:139
+#, fuzzy
+msgid "Beat velocity"
+msgstr "Noodi kiirus:"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:146
+#, fuzzy
+msgid "Sub-beat velocity"
+msgstr "Noodi kiirus:"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:155
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:324
+msgid "Pitch"
+msgstr "Helikõrgus"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:160
+#, fuzzy
+msgid "for Bar"
+msgstr "Alguse takt"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:161
+#, fuzzy
+msgid "for Beat"
+msgstr "Löök"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:162
+msgid "for Sub-beat"
+msgstr ""
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:166
+#, fuzzy
+msgid "Metronome Activated"
+msgstr "Metronoom"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:167
+#, fuzzy
+msgid "Playing"
+msgstr "Mängi maha"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:168
+#, fuzzy
+msgid "Recording"
+msgstr "Faili lugemine..."
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:46
+msgid "Choose Text Encoding"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:50
+msgid ""
+"\n"
+"This file contains text in an unknown language encoding.\n"
+"\n"
+"Please select one of the following estimated text encodings\n"
+"for use with the text in this file:\n"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:61
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:77
+msgid "Japanese Shift-JIS"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:62
+msgid "Unicode variable-width"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:63
+msgid "Western Europe"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:64
+msgid "Western Europe + Euro"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:65
+msgid "Eastern Europe"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:66
+msgid "Southern Europe"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:67
+msgid "Northern Europe"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:68
+#, fuzzy
+msgid "Cyrillic"
+msgstr "Sõnad"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:69
+msgid "Arabic"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:70
+msgid "Greek"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:71
+msgid "Hebrew"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:72
+msgid "Turkish"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:73
+msgid "Nordic"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:74
+msgid "Thai"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:75
+#, fuzzy
+msgid "Baltic"
+msgstr "Löök"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:76
+msgid "Celtic"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:78
+msgid "Traditional Chinese"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:79
+#, fuzzy
+msgid "Simplified Chinese"
+msgstr "Sünkroniseerimine"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:80
+msgid "Russian"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:81
+msgid "Ukrainian"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:82
+#, fuzzy
+msgid "Tamil"
+msgstr "Tri&ller"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:117
+#, c-format
+msgid "Microsoft Code Page %1"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:123
+#: ../src/gui/editors/matrix/MatrixView.cpp:1490
+#, fuzzy
+msgid "%1 (%2)"
+msgstr "&%1%2"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:142
+msgid ""
+"\n"
+"Example text from file:"
+msgstr ""
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:59
+#: ../src/gui/editors/tempo/TempoView.cpp:92
+msgid "Time Signature"
+msgstr "Taktimõõt"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:82
+msgid "Time signature"
+msgstr "Taktimõõt"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:116
+msgid "Time where signature takes effect"
+msgstr ""
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:83
+#: ../src/gui/dialogs/TempoDialog.cpp:128
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:129
+#: ../src/gui/general/PresetHandlerDialog.cpp:101
+#, fuzzy
+msgid "Scope"
+msgstr "Ulatus"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:141
+#, c-format
+msgid "Insertion point is at start of measure %1."
+msgstr ""
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:145
+#, c-format
+msgid "Insertion point is in the middle of measure %1."
+msgstr ""
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:150
+msgid "Insertion point is at start of composition."
+msgstr ""
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:155
+msgid "Start measure %1 here"
+msgstr ""
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:159
+#, fuzzy, c-format
+msgid "Change time from start of measure %1"
+msgstr "takti %1 alguses."
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:166
+#, c-format
+msgid "Time change will take effect at the start of measure %1."
+msgstr ""
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:176
+#, fuzzy
+msgid "Hide the time signature"
+msgstr "Taktimõõt"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:181
+msgid "Hide the affected bar lines"
+msgstr ""
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:186
+msgid "Show as common time"
+msgstr ""
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:191
+msgid "Correct the durations of following measures"
+msgstr ""
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:280
+msgid "Display as common time"
+msgstr ""
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:284
+msgid "Display as cut common time"
+msgstr ""
+
+#: ../src/gui/dialogs/ConfigureDialog.cpp:66
+#, fuzzy
+msgid "Configure Rosegarden"
+msgstr "Rosegarden"
+
+#: ../src/gui/dialogs/MarkerModifyDialog.cpp:53
+#: ../src/gui/dialogs/MarkerModifyDialog.cpp:61
+msgid "Edit Marker"
+msgstr "Redigeeri märgist"
+
+#: ../src/gui/dialogs/MarkerModifyDialog.cpp:78
+msgid "Marker Time"
+msgstr "Märgise aeg"
+
+#: ../src/gui/dialogs/MarkerModifyDialog.cpp:94
+msgid "Marker Properties"
+msgstr "Märgise omadused"
+
+#: ../src/gui/dialogs/MarkerModifyDialog.cpp:100
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:554
+msgid "Text:"
+msgstr "Tekst:"
+
+#: ../src/gui/dialogs/MarkerModifyDialog.cpp:104
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:85
+msgid "Description:"
+msgstr "Kirjeldus:"
+
+#: ../src/gui/dialogs/FileMergeDialog.cpp:46
+msgid "Merge File"
+msgstr "Faili liitmine"
+
+#: ../src/gui/dialogs/FileMergeDialog.cpp:53
+msgid "Merge new file "
+msgstr "Liida uus fail "
+
+#: ../src/gui/dialogs/FileMergeDialog.cpp:56
+msgid "At start of existing composition"
+msgstr "Olemasoleva kompositsiooni algusesse"
+
+#: ../src/gui/dialogs/FileMergeDialog.cpp:57
+msgid "From end of existing composition"
+msgstr "Olemasoleva kompostsiooni lõppu"
+
+#: ../src/gui/dialogs/FileMergeDialog.cpp:61
+msgid "The file has different time signatures or tempos."
+msgstr "Failil on erinevad taktimõõdud või tempod."
+
+#: ../src/gui/dialogs/FileMergeDialog.cpp:62
+msgid "Import these as well"
+msgstr "Impordi ka need failid"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:171
+#: ../src/gui/dialogs/ShowSequencerStatusDialog.cpp:44
+msgid "Sequencer status"
+msgstr "Sekventseri staatus"
+
+#: ../src/gui/dialogs/ShowSequencerStatusDialog.cpp:48
+msgid "Sequencer status:"
+msgstr "Sekventseri staatus:"
+
+#: ../src/gui/dialogs/ShowSequencerStatusDialog.cpp:50
+msgid "Status not available."
+msgstr "Staatuse kohta pole võimalik infot hankida."
+
+#: ../src/gui/dialogs/ShowSequencerStatusDialog.cpp:57
+msgid "Sequencer is not running or is not responding."
+msgstr ""
+
+#: ../src/gui/dialogs/ShowSequencerStatusDialog.cpp:64
+msgid "Sequencer is not returning a valid status report."
+msgstr ""
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:46
+#, fuzzy
+msgid "Add Tracks"
+msgstr "Lisa rajad..."
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:54
+#, fuzzy
+msgid "How many tracks do you want to add?"
+msgstr "Kui palju radasid sa soovid lisada? (maks. 24)"
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:62
+#, fuzzy
+msgid "Add tracks"
+msgstr "&Kustuta rada"
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:64
+msgid "At the top"
+msgstr ""
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:65
+#, fuzzy
+msgid "Above the current selected track"
+msgstr "Vaigistab kõik rajad peale aktiivse"
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:66
+#, fuzzy
+msgid "Below the current selected track"
+msgstr "Vaigistab kõik rajad peale aktiivse"
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:67
+msgid "At the bottom"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:75
+msgid "Event Properties"
+msgstr "Sündmuse omadused"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:81
+msgid "Event type:"
+msgstr "Sündmuse tüüp:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:117
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:251
+#: ../src/gui/editors/segment/MarkerEditor.cpp:97
+msgid "Absolute time:"
+msgstr "Absoluutne aeg:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:156
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:323
+msgid "Controller name:"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:157
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:530
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:562
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:563
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:602
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:631
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:267
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:269
+#: ../src/gui/editors/segment/MarkerEditor.cpp:279
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:272
+#: ../src/gui/studio/AudioMixerWindow.cpp:388
+#: ../src/gui/studio/AudioMixerWindow.cpp:519
+#: ../src/gui/studio/AudioMixerWindow.cpp:683
+#: ../src/gui/studio/AudioMixerWindow.cpp:722
+#: ../src/gui/studio/AudioMixerWindow.cpp:904
+#: ../src/gui/studio/SynthPluginManagerDialog.cpp:121
+msgid "<none>"
+msgstr "<puudub>"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:174
+msgid "Meta string:"
+msgstr "Metastring:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:179
+msgid "Load data"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:181
+#, fuzzy
+msgid "Save data"
+msgstr "Salvesta kui..."
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:192
+#, fuzzy
+msgid "Notation Properties"
+msgstr "Sündmuse omadused"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:198
+msgid "Lock to changes in performed values"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:205
+#, fuzzy
+msgid "Notation time:"
+msgstr "Noodikirja font"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:217
+#, fuzzy
+msgid "Notation duration:"
+msgstr "Audiofaili mängimine"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:283
+msgid "Note pitch:"
+msgstr "Noodi helikõrgus:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:291
+msgid "Note velocity:"
+msgstr "Noodi kiirus:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:317
+msgid "Controller number:"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:326
+msgid "Controller value:"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:354
+msgid "Key pitch:"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:362
+msgid "Key pressure:"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:390
+msgid "Channel pressure:"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:418
+msgid "Program change:"
+msgstr "Programmi muutus:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:461
+msgid "Data length:"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:462
+#, fuzzy
+msgid "Data:"
+msgstr "löök:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:480
+msgid "Pitchbend MSB:"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:488
+msgid "Pitchbend LSB:"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:523
+#, fuzzy
+msgid "Indication:"
+msgstr "Suund"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:553
+msgid "Text type:"
+msgstr "Teksti tüüp:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:596
+msgid "Clef type:"
+msgstr "Noodivõtme tüüp:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:625
+msgid "Key name:"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:674
+msgid "Unsupported event type:"
+msgstr "Toetuseta sündmuse tüüp:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:931
+#, fuzzy
+msgid "Edit Event Time"
+msgstr "Sündmuse redigeerimine"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:943
+#, fuzzy
+msgid "Edit Event Notation Time"
+msgstr "Sündmuse redigeerimine"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:955
+#, fuzzy
+msgid "Edit Duration"
+msgstr "Kestvus"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:968
+#, fuzzy
+msgid "Edit Notation Duration"
+msgstr "Kestvus"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:981
+#, fuzzy
+msgid "Edit Pitch"
+msgstr "Sõnade redigeerimine"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:991
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:1016
+msgid "*.syx|System exclusive files (*.syx)"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:992
+msgid "Load System Exclusive data in File"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:1017
+msgid "Save System Exclusive data to..."
+msgstr ""
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:46
+msgid "Locate audio file"
+msgstr ""
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:50
+#, fuzzy
+msgid "&Skip"
+msgstr "&Jäta vahele"
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:51
+#, fuzzy
+msgid "Skip &All"
+msgstr "Vali &kõik"
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:52
+msgid "&Locate"
+msgstr ""
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:57
+msgid ""
+"Can't find file \"%1\".\n"
+"Would you like to try and locate this file or skip it?"
+msgstr ""
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:71
+#, fuzzy
+msgid ""
+"%1|Requested file (%2)\n"
+"*.wav|WAV files (*.wav)"
+msgstr "*.wav|WAV failid (*.wav)"
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:74
+msgid "Select an Audio File"
+msgstr "Audiofaili valimine"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:53 ../src/gui/dialogs/ClefDialog.cpp:62
+#: ../src/gui/dialogs/ClefDialog.cpp:79 ../src/gui/dialogs/ClefDialog.cpp:90
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:278
+msgid "Clef"
+msgstr "Noodivõti"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:65
+msgid "Existing notes following clef change"
+msgstr "Olemasolevad noodid järgivad noodivõtme muutust"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:71
+msgid "Lower clef"
+msgstr ""
+
+#: ../src/gui/dialogs/ClefDialog.cpp:77
+msgid "Up an Octave"
+msgstr "Oktavi võrra üles"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:84
+msgid "Down an Octave"
+msgstr "Oktavi võrra alla"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:88
+msgid "Higher clef"
+msgstr ""
+
+#: ../src/gui/dialogs/ClefDialog.cpp:96
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:152
+msgid "Maintain current pitches"
+msgstr ""
+
+#: ../src/gui/dialogs/ClefDialog.cpp:99
+msgid "Transpose into appropriate octave"
+msgstr "Transponeeritakse vastavasse oktavisse"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:231
+#, fuzzy
+msgid "%1 down an octave"
+msgstr "Oktavi võrra alla"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:234
+#, fuzzy
+msgid "%1 down two octaves"
+msgstr "Oktavi võrra alla"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:237
+#, fuzzy
+msgid "%1 up an octave"
+msgstr "Oktavi võrra üles"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:240
+msgid "%1 up two octaves"
+msgstr ""
+
+#: ../src/gui/dialogs/ClefDialog.cpp:249
+msgid "Treble"
+msgstr "Viiulivõti"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:251
+#, fuzzy
+msgid "French violin"
+msgstr "Sünkroniseerimine"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:253
+#, fuzzy
+msgid "Soprano"
+msgstr "S&forzando"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:255
+#, fuzzy
+msgid "Mezzo-soprano"
+msgstr "S&forzando"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:257
+msgid "Alto"
+msgstr "Aldivõti"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:259
+msgid "Tenor"
+msgstr "Tenorivõti"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:261
+#, fuzzy
+msgid "C-baritone"
+msgstr "Variatsioon"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:263
+#, fuzzy
+msgid "F-baritone"
+msgstr "Variatsioon"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:265
+msgid "Bass"
+msgstr "Bassivõti"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:267
+#, fuzzy
+msgid "Sub-bass"
+msgstr "Bassivõti"
+
+#: ../src/gui/dialogs/CountdownDialog.cpp:52
+#, fuzzy
+msgid "Recording..."
+msgstr "Faili lugemine..."
+
+#: ../src/gui/dialogs/CountdownDialog.cpp:60
+msgid "Recording time remaining: "
+msgstr ""
+
+#: ../src/gui/dialogs/CountdownDialog.cpp:120
+msgid "Just how big is your hard disk?"
+msgstr ""
+
+#: ../src/gui/dialogs/CountdownDialog.cpp:154
+#, fuzzy
+msgid "Recording beyond end of composition: "
+msgstr "Olemasoleva kompostsiooni lõppu"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:52
+msgid "Specify Interval"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:58
+msgid "Reference note:"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:59
+#, fuzzy
+msgid "Target note:"
+msgstr "veerandnoot"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:68
+#: ../src/gui/dialogs/IntervalDialog.cpp:315
+msgid "a perfect unison"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:76
+msgid "Effect on Key"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:77
+#, fuzzy
+msgid "Transpose within key"
+msgstr "Transponeerimine"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:79
+#, fuzzy
+msgid "Change key for selection"
+msgstr " Valik puudub "
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:89
+msgid ""
+"Adjust segment transposition in opposite direction (maintain audible pitch)"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:190
+#: ../src/gui/dialogs/IntervalDialog.cpp:220
+msgid "a diminished"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:192
+#: ../src/gui/dialogs/IntervalDialog.cpp:222
+msgid "an augmented"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:194
+#: ../src/gui/dialogs/IntervalDialog.cpp:224
+msgid "a doubly diminished"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:196
+#: ../src/gui/dialogs/IntervalDialog.cpp:226
+msgid "a doubly augmented"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:198
+#: ../src/gui/dialogs/IntervalDialog.cpp:228
+msgid "a triply diminished"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:200
+#: ../src/gui/dialogs/IntervalDialog.cpp:230
+msgid "a triply augmented"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:202
+msgid "a quadruply diminished"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:204
+#: ../src/gui/dialogs/IntervalDialog.cpp:232
+msgid "a quadruply augmented"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:206
+#: ../src/gui/dialogs/IntervalDialog.cpp:234
+msgid "a perfect"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:208
+#: ../src/gui/dialogs/IntervalDialog.cpp:236
+msgid "an (unknown, %1)"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:216
+#, fuzzy
+msgid "a minor"
+msgstr "Tenorivõti"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:218
+msgid "a major"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:239
+#, fuzzy
+msgid "an (unknown)"
+msgstr "Tundmatu"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:248
+#: ../src/gui/dialogs/IntervalDialog.cpp:251
+#, fuzzy
+msgid "%1 octave"
+msgstr "Oktavi võrra üles"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:254
+#, fuzzy
+msgid "%1 unison"
+msgstr "ühikut"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:258
+#, fuzzy
+msgid "%1 second"
+msgstr "Sekundit:"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:261
+#, fuzzy
+msgid "%1 third"
+msgstr "Muu"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:264
+#, fuzzy
+msgid "%1 fourth"
+msgstr "%1 bemoll"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:267
+#, fuzzy
+msgid "%1 fifth"
+msgstr "Helikõrgus"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:270
+#, fuzzy
+msgid "%1 sixth"
+msgstr "Helikõrgus"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:273
+#, fuzzy
+msgid "%1 seventh"
+msgstr "Muuda sündmuse suurust"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:276
+#: ../src/gui/studio/DeviceManagerDialog.cpp:329
+#: ../src/gui/studio/DeviceManagerDialog.cpp:363
+#, c-format
+msgid "%1"
+msgstr "%1"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:287
+msgid ""
+"_n: up 1 octave and %1\n"
+"up %n octaves and %1"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:291
+#, c-format
+msgid ""
+"_n: up 1 octave\n"
+"up %n octaves"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:295
+#, fuzzy, c-format
+msgid "up %1"
+msgstr "Audio"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:303
+msgid ""
+"_n: down 1 octave and %1\n"
+"down %n octaves and %1"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:307
+#, fuzzy, c-format
+msgid ""
+"_n: down 1 octave\n"
+"down %n octaves"
+msgstr "Oktavi võrra alla"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:311
+#, fuzzy, c-format
+msgid "down %1"
+msgstr "Lisa %1"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:81
+msgid "Intrinsics"
+msgstr ""
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:85
+msgid "Event type: "
+msgstr "Sündmuse tüüp. "
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:91
+msgid "Absolute time: "
+msgstr "Absoluutne aeg: "
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:101
+msgid "Duration: "
+msgstr "Kestvus: "
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:114
+msgid "Sub-ordering: "
+msgstr ""
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:125
+msgid "Persistent properties"
+msgstr ""
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:169
+#: ../src/gui/dialogs/EventEditDialog.cpp:133
+#: ../src/gui/studio/BankEditorDialog.cpp:129
+#: ../src/gui/studio/DeviceEditorDialog.cpp:75
+msgid "Type"
+msgstr "Tüüp"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:184
+#: ../src/gui/dialogs/EventEditDialog.cpp:135
+#: ../src/gui/dialogs/EventParameterDialog.cpp:89
+#: ../src/gui/dialogs/EventParameterDialog.cpp:93
+#: ../src/gui/dialogs/EventParameterDialog.cpp:115
+msgid "Value"
+msgstr "Väärtus"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:155
+msgid "Non-persistent properties"
+msgstr ""
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:156
+msgid "These are cached values, lost if the event is modified."
+msgstr ""
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:170
+msgid "Name "
+msgstr "Nimi "
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:172
+msgid "Type "
+msgstr "Tüüp "
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:174
+msgid "Value "
+msgstr "Väärtus "
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:188
+msgid "Make persistent"
+msgstr ""
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:292
+msgid "Delete this property"
+msgstr "Kustuta see omadus"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:433
+msgid ""
+"Are you sure you want to delete the \"%1\" property?\n"
+"\n"
+"Removing necessary properties may cause unexpected behavior."
+msgstr ""
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:436
+#: ../src/gui/dialogs/EventEditDialog.cpp:469
+msgid "Edit Event"
+msgstr "Sündmuse redigeerimine"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:465
+msgid ""
+"Are you sure you want to make the \"%1\" property persistent?\n"
+"\n"
+"This could cause problems if it overrides a different computed value later "
+"on."
+msgstr ""
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:470
+msgid "Make &Persistent"
+msgstr ""
+
+#: ../src/gui/dialogs/PasteNotationDialog.cpp:52
+msgid "Paste type"
+msgstr ""
+
+#: ../src/gui/dialogs/PasteNotationDialog.cpp:72
+msgid "Make this the default paste type"
+msgstr ""
+
+#: ../src/gui/dialogs/LyricEditDialog.cpp:53
+msgid "Edit Lyrics"
+msgstr "Sõnade redigeerimine"
+
+#: ../src/gui/dialogs/LyricEditDialog.cpp:62
+msgid "Lyrics for this segment"
+msgstr "Selle segmendi sõnad"
+
+#: ../src/gui/dialogs/LyricEditDialog.cpp:70
+#, fuzzy
+msgid "Add Verse"
+msgstr "Decrescendo lisamine..."
+
+#: ../src/gui/dialogs/LyricEditDialog.cpp:84
+#: ../src/gui/dialogs/LyricEditDialog.cpp:106
+#, c-format
+msgid "Verse %1"
+msgstr ""
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:59
+msgid "Import from Device..."
+msgstr "Import seadmest..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2163
+#: ../src/gui/application/RosegardenGUIApp.cpp:2229
+#: ../src/gui/application/RosegardenGUIApp.cpp:7780
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:87
+#: ../src/sound/AudioFileManager.cpp:664
+#, c-format
+msgid "Cannot download file %1"
+msgstr ""
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:99
+#, c-format
+msgid "Cannot open file %1"
+msgstr "Faili %1 pole võimalik avada"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:106
+#, c-format
+msgid "No devices found in file %1"
+msgstr "Failist %1 ei leitud ühtegi seadet"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:113
+msgid "Source device"
+msgstr "Lähteseade"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:118
+msgid "Import from: "
+msgstr "Import asukohast: "
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:140
+#: ../src/gui/studio/DeviceEditorDialog.cpp:148
+#, c-format
+msgid "Device %1"
+msgstr "Seade %1"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:155
+msgid "Import banks"
+msgstr "Pankade import"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:156
+#, fuzzy
+msgid "Import key mappings"
+msgstr "Pankade import"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:157
+msgid "Import controllers"
+msgstr ""
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:160
+msgid "Import device name"
+msgstr ""
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:166
+#, fuzzy
+msgid "Bank import behavior"
+msgstr "Panga impordi käitumine"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:168
+msgid "Merge banks"
+msgstr "Pankade liitmine"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:169
+msgid "Overwrite banks"
+msgstr "Pankade ülekirjutamine"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:367
+msgid "Bank %1:%2"
+msgstr "Pank %1:%2"
+
+#: ../src/commands/segment/SegmentSplitByRecordingSrcCommand.cpp:42
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:48
+#, fuzzy
+msgid "Split by Recording Source"
+msgstr "Salvestavad seadmed"
+
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:53
+#, fuzzy
+msgid "Recording Source"
+msgstr "Salvestavad seadmed"
+
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:57
+#, fuzzy
+msgid "Channel:"
+msgstr "Kanal"
+
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:64
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:75
+#, fuzzy
+msgid "any"
+msgstr "Suvaline"
+
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:69
+#, fuzzy
+msgid "Device:"
+msgstr "Seade"
+
+#: ../src/gui/dialogs/UnusedAudioSelectionDialog.cpp:46
+#, fuzzy
+msgid "Select Unused Audio Files"
+msgstr "Audiofaili valimine"
+
+#: ../src/gui/dialogs/UnusedAudioSelectionDialog.cpp:53
+#: ../src/gui/editors/segment/PlayListView.cpp:36
+#, fuzzy
+msgid "File name"
+msgstr "Failinimi:"
+
+#: ../src/gui/dialogs/UnusedAudioSelectionDialog.cpp:54
+#, fuzzy
+msgid "File size"
+msgstr "Failinimi:"
+
+#: ../src/gui/dialogs/UnusedAudioSelectionDialog.cpp:55
+msgid "Last modified date"
+msgstr ""
+
+#: ../src/gui/dialogs/UnusedAudioSelectionDialog.cpp:60
+msgid " (not found) "
+msgstr ""
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:105
+#, fuzzy
+msgid "Audio File Manager"
+msgstr "Rosegardeni audiofailide haldur"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:126
+msgid ""
+"* Some audio files are encoded at a sample rate different from that of the "
+"JACK audio server.\n"
+"Rosegarden will play them at the correct speed, but they will sound "
+"terrible.\n"
+"Please consider resampling such files externally, or adjusting the sample "
+"rate of the JACK server."
+msgstr ""
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:132
+#, fuzzy
+msgid "&Add Audio File..."
+msgstr "Lisa audiofail"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:135
+#, fuzzy
+msgid "&Unload Audio File"
+msgstr "Lisa audiofail"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:140
+#, fuzzy
+msgid "&Play Preview"
+msgstr "Mahamängivad seadmed"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:151
+msgid "&Insert into Selected Audio Track"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:155
+#, fuzzy
+msgid "Unload &all Audio Files"
+msgstr "Eemalda kõik audiofailid"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:159
+#, fuzzy
+msgid "Unload all &Unused Audio Files"
+msgstr "Eemalda kõik audiofailid"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:163
+#, fuzzy
+msgid "&Delete Unused Audio Files..."
+msgstr "Eemalda kõik audiofailid"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:167
+#, fuzzy
+msgid "&Export Audio File..."
+msgstr "Ekspordi audiofail"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:173
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:180
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:91
+msgid "Duration"
+msgstr "Kestvus"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:181
+msgid "Envelope"
+msgstr "Ümbrik"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:182
+msgid "Sample rate"
+msgstr "Diskreetimissagedus"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:183
+msgid "Channels"
+msgstr "Kanalid"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:282
+msgid "<no audio files>"
+msgstr "<audiofailid puuduvad>"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:488
+msgid "*.wav|WAV files (*.wav)"
+msgstr "*.wav|WAV failid (*.wav)"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:489
+msgid "Choose a name to save this file as"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:499
+msgid "Exporting audio file..."
+msgstr ""
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:609
+msgid ""
+"This will unload audio file \"%1\" and remove all associated segments. Are "
+"you sure?"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:692
+#, fuzzy
+msgid ""
+"*.wav|WAV files (*.wav)\n"
+"*.*|All files"
+msgstr "*.wav|WAV failid (*.wav)"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:697
+msgid ""
+"*.wav *.flac *.ogg *.mp3|Audio files (*.wav *.flac *.ogg *.mp3)\n"
+"*.wav|WAV files (*.wav)\n"
+"*.flac|FLAC files (*.flac)\n"
+"*.ogg|Ogg files (*.ogg)\n"
+"*.mp3|MP3 files (*.mp3)\n"
+"*.*|All files"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:704
+#, fuzzy
+msgid "Select one or more audio files"
+msgstr "Audiofaili valimine"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:763
+msgid ""
+"This will unload all audio files and remove their associated segments.\n"
+"This action cannot be undone, and associations with these files will be "
+"lost.\n"
+"Files will not be removed from your disk.\n"
+"Are you sure?"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:800
+msgid ""
+"This will unload all audio files that are not associated with any segments "
+"in this composition.\n"
+"This action cannot be undone, and associations with these files will be "
+"lost.\n"
+"Files will not be removed from your disk.\n"
+"Are you sure?"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:865
+msgid ""
+"The following audio files are not used in the current composition.\n"
+"\n"
+"Please select the ones you wish to delete permanently from the hard disk.\n"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:875
+#, c-format
+msgid ""
+"_n: <qt>About to delete 1 audio file permanently from the hard disk.<br>This "
+"action cannot be undone, and there will be no way to recover this file."
+"<br>Are you sure?</qt>\n"
+"\n"
+"<qt>About to delete %n audio files permanently from the hard disk.<br>This "
+"action cannot be undone, and there will be no way to recover these files."
+"<br>Are you sure?</qt>"
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:525
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:888
+#, fuzzy
+msgid "File %1 could not be deleted."
+msgstr "Faili \"%1\" ei eksisteeri"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:921
+msgid "Change Audio File label"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:6466
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:922
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:1099
+msgid "Enter new label"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIView.cpp:1538
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:1086
+#, fuzzy
+msgid "Adding audio file..."
+msgstr "Lisa audiofail"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:1107
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:1112
+#, fuzzy
+msgid "Failed to add audio file. "
+msgstr "Kukutatud faili pole võimalik lisada."
+
+#: ../src/document/RosegardenGUIDoc.cpp:2789
+#: ../src/gui/application/RosegardenGUIApp.cpp:2736
+#: ../src/gui/application/RosegardenGUIView.cpp:1574
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:1122
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:180
+msgid "Generating audio preview..."
+msgstr "Audio eelvaatluse genereerimine..."
+
+#: ../src/gui/application/RosegardenGUIView.cpp:1581
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:1130
+msgid ""
+"Try copying this file to a directory where you have write permission and re-"
+"add it"
+msgstr ""
+
+#: ../src/gui/dialogs/TransportDialog.cpp:90 rc.cpp:357
+#, no-c-format
+msgid "Rosegarden Transport"
+msgstr "Rosegardeni transport"
+
+#: ../src/gui/dialogs/TransportDialog.cpp:925
+#: ../src/gui/dialogs/TransportDialog.cpp:985
+msgid "PITCH WHEEL"
+msgstr "PITCH WHEEL"
+
+#: ../src/gui/dialogs/TransportDialog.cpp:929
+#: ../src/gui/dialogs/TransportDialog.cpp:989
+msgid "CONTROLLER"
+msgstr "CONTROLLER"
+
+#: ../src/gui/dialogs/TransportDialog.cpp:933
+#: ../src/gui/dialogs/TransportDialog.cpp:993
+msgid "PROG CHNGE"
+msgstr "PROG CHNGE"
+
+#: ../src/gui/dialogs/TransportDialog.cpp:938
+#: ../src/gui/dialogs/TransportDialog.cpp:998
+msgid "PRESSURE"
+msgstr "PRESSURE"
+
+#: ../src/gui/dialogs/TransportDialog.cpp:942
+#: ../src/gui/dialogs/TransportDialog.cpp:1002
+#, fuzzy
+msgid "SYS MESSAGE"
+msgstr "SYS EXCLSVE"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:177
+#: ../src/gui/dialogs/QuantizeDialog.cpp:40
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:127
+msgid "Quantize"
+msgstr "Kvantimine"
+
+#: ../src/gui/dialogs/QuantizeDialog.cpp:52
+msgid "Advanced"
+msgstr ""
+
+#: ../src/gui/dialogs/ExportDeviceDialog.cpp:42
+msgid "Export Devices..."
+msgstr "Ekspordi seadmed..."
+
+#: ../src/gui/dialogs/ExportDeviceDialog.cpp:47
+msgid "Export devices"
+msgstr "Seadmete eksport"
+
+#: ../src/gui/dialogs/ExportDeviceDialog.cpp:49
+msgid "Export all devices"
+msgstr "Kõiki seadmete eksport"
+
+#: ../src/gui/dialogs/ExportDeviceDialog.cpp:50
+msgid "Export selected device only"
+msgstr "Eksporditakse ainult valitud seadmed"
+
+#: ../src/gui/dialogs/ExportDeviceDialog.cpp:51
+msgid " (\"%1\")"
+msgstr " (\"%1\")"
+
+#: ../src/gui/dialogs/CompositionLengthDialog.cpp:44
+msgid "Change Composition Length"
+msgstr "Kompositsiooni pikkuse muutmine"
+
+#: ../src/gui/dialogs/CompositionLengthDialog.cpp:50
+msgid "Set the Start and End bar markers for this Composition"
+msgstr ""
+
+#: ../src/gui/dialogs/CompositionLengthDialog.cpp:54
+msgid "Start Bar"
+msgstr "Alguse takt"
+
+#: ../src/gui/dialogs/CompositionLengthDialog.cpp:62
+msgid "End Bar"
+msgstr "Lõpu takt"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:62
+#, fuzzy
+msgid "LilyPond Export/Preview"
+msgstr "Lilypond ekport"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:85
+#, fuzzy
+msgid "General options"
+msgstr "Üldised seadistused"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:90
+msgid "Advanced options"
+msgstr ""
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:112
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:95
+msgid "Headers"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:106
+msgid "Basic options"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:113
+#, fuzzy
+msgid "Compatibility level"
+msgstr "Lilypond'i kompatiiblus"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:117
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:118
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:119
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:120
+#, fuzzy, c-format
+msgid "LilyPond %1"
+msgstr "Lilypond 2.0+"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:125
+#, fuzzy
+msgid "Paper size"
+msgstr "Faili avamine"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:129
+msgid "A3"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:130
+msgid "A4"
+msgstr "A4"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:131
+msgid "A5"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:132
+msgid "A6"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:133
+msgid "Legal"
+msgstr "Legal"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:134
+msgid "US Letter"
+msgstr "US Letter"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:135
+msgid "Tabloid"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:136
+msgid "do not specify"
+msgstr "määramata"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:152
+#, fuzzy
+msgid "Font size"
+msgstr "Failinimi:"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:157
+#, fuzzy
+msgid "%1 pt"
+msgstr "%1 (tükeldatud)"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:169
+msgid "Staff level options"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:176
+#, fuzzy
+msgid "Export content"
+msgstr "Seadmete eksport"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:179
+#, fuzzy
+msgid "All tracks"
+msgstr "&Kustuta rada"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:180
+#, fuzzy
+msgid "Non-muted tracks"
+msgstr "&Kustuta rada"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:181
+#, fuzzy
+msgid "Selected track"
+msgstr "&Vali uus rada"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:182
+#, fuzzy
+msgid "Selected segments"
+msgstr "V&ali kõik segmendid"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:188
+msgid "Merge tracks that have the same name"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:198
+#, fuzzy
+msgid "Notation options"
+msgstr "Sündmuse omadused"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:206
+#, fuzzy
+msgid "First"
+msgstr "paus"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:207
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:538
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:557
+msgid "All"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:211
+msgid "Export tempo marks "
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:215
+#, fuzzy
+msgid "Export lyrics"
+msgstr "\\lyric ploki eksport"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:225
+msgid "Export beamings"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:232
+msgid "Export track staff brackets"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:244
+#, fuzzy
+msgid "Layout options"
+msgstr "Lilypond'i ekpordi seadistused"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:257
+#, fuzzy
+msgid "Lyrics alignment"
+msgstr "Selle segmendi sõnad"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:261
+msgid "Ragged bottom (systems will not be spread vertically across the page)"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:267
+msgid "Miscellaneous options"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:274
+msgid "Enable \"point and click\" debugging"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:279
+msgid "Export \\midi block"
+msgstr "\\midi ploki eksport"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:284
+#, fuzzy
+msgid "No markers"
+msgstr "Eemalda kõik märgised"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:285
+#, fuzzy
+msgid "Rehearsal marks"
+msgstr "Eemalda kõik märgised"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:286
+#, fuzzy
+msgid "Marker text"
+msgstr "Märgise aeg "
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:290
+#, fuzzy
+msgid "Export markers"
+msgstr "Eksport kui..."
+
+#: ../src/gui/dialogs/AudioSplitDialog.cpp:57
+msgid "Autosplit Audio Segment"
+msgstr "Audio segmendi tükeldamine"
+
+#: ../src/gui/dialogs/AudioSplitDialog.cpp:70
+msgid "AutoSplit Segment \""
+msgstr ""
+
+#: ../src/gui/dialogs/AudioSplitDialog.cpp:84
+msgid "Threshold"
+msgstr "Lävi"
+
+#: ../src/gui/dialogs/AudioSplitDialog.cpp:142
+msgid "<no preview generated for this audio file>"
+msgstr "<audiofaili eelvaatlust ei genereeritud>"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:70
+msgid "Audio Plugin"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:94
+#: ../src/gui/widgets/AudioFaderBox.cpp:136
+#, fuzzy
+msgid "Editor"
+msgstr "Redigeerimine"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:100
+#, fuzzy
+msgid "Plugin"
+msgstr "Plugin"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:105
+msgid "Category:"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:110
+#, fuzzy
+msgid "Plugin:"
+msgstr "Plugin"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:114
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:398
+msgid "Select a plugin from this list."
+msgstr ""
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:119
+#, fuzzy
+msgid "Bypass"
+msgstr "Läbiv"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:121
+msgid "Bypass this plugin."
+msgstr ""
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:127
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:390
+msgid "<ports>"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:130
+msgid "Input and output port counts."
+msgstr ""
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:132
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:391
+msgid "<id>"
+msgstr "<id>"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:135
+msgid "Unique ID of plugin."
+msgstr ""
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:149
+#, fuzzy
+msgid "Copy plugin parameters"
+msgstr "Segmendi parameetrid"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:155
+#, fuzzy
+msgid "Paste plugin parameters"
+msgstr "Instrumendi parameetrid"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:161
+msgid "Set to defaults"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:225
+msgid "(any)"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:226
+#, fuzzy
+msgid "(unclassified)"
+msgstr "piiramatu"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:247
+msgid "(none)"
+msgstr "(puudub)"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:389
+#: ../src/gui/editors/parameters/AudioInstrumentParameterPanel.cpp:132
+#: ../src/gui/editors/parameters/AudioInstrumentParameterPanel.cpp:361
+#: ../src/gui/studio/AudioMixerWindow.cpp:685
+#: ../src/gui/studio/AudioMixerWindow.cpp:724
+#: ../src/gui/studio/AudioMixerWindow.cpp:906
+#: ../src/gui/widgets/AudioFaderBox.cpp:79
+msgid "<no plugin>"
+msgstr "<plugin puudub>"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:427
+msgid "This plugin has too many controls to edit here."
+msgstr ""
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:438
+#, fuzzy, c-format
+msgid "Id: %1"
+msgstr "Lisa %1"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:490
+msgid "mono"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:492
+msgid "stereo"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:494
+msgid "%1 in, %2 out"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:518
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:704
+#, fuzzy
+msgid "Program: "
+msgstr "Programm"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:522
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:532
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:708
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:716
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:745
+#, fuzzy
+msgid "<none selected>"
+msgstr "<sündmused puuduvad>"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:56
+msgid "Set the %1 property of the event selection:"
+msgstr ""
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:61
+msgid "Pattern"
+msgstr "Pattern"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:66
+msgid "Flat - set %1 to value"
+msgstr ""
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:70
+msgid "Alternating - set %1 to max and min on alternate events"
+msgstr ""
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:74
+msgid "Crescendo - set %1 rising from min to max"
+msgstr ""
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:78
+msgid "Diminuendo - set %1 falling from max to min"
+msgstr ""
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:82
+msgid "Ringing - set %1 alternating from max to min with both dying to zero"
+msgstr ""
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:123
+#: ../src/gui/dialogs/EventParameterDialog.cpp:150
+msgid "First Value"
+msgstr "Esimene väärtus"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:124
+#: ../src/gui/dialogs/EventParameterDialog.cpp:151
+msgid "Second Value"
+msgstr "Teine väärtus"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:132
+#: ../src/gui/dialogs/EventParameterDialog.cpp:142
+#, fuzzy
+msgid "Low Value"
+msgstr "Väärtus"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:133
+#: ../src/gui/dialogs/EventParameterDialog.cpp:141
+#, fuzzy
+msgid "High Value"
+msgstr "Esimene väärtus"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:56 ../src/gui/rulers/TempoRuler.cpp:127
+msgid "Insert Tempo Change"
+msgstr "Lisa tempo muudatus"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:69
+#, fuzzy
+msgid "New tempo:"
+msgstr "Uus tempo"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:76
+msgid "Tap"
+msgstr ""
+
+#: ../src/gui/dialogs/TempoDialog.cpp:81
+#, fuzzy
+msgid "Tempo is fixed until the following tempo change"
+msgstr "Olemasolevad noodid järgivad noodivõtme muutust"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:82
+#, fuzzy
+msgid "Tempo ramps to the following tempo"
+msgstr "Olemasolevad noodid järgivad noodivõtme muutust"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:83
+#, fuzzy
+msgid "Tempo ramps to:"
+msgstr "Tempo"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:120
+#, fuzzy
+msgid "Time of tempo change"
+msgstr "Teised tempo muudatused puuduvad."
+
+#: ../src/gui/dialogs/TempoDialog.cpp:138
+msgid "The pointer is currently at "
+msgstr "Kursor on praegu asukohas "
+
+#: ../src/gui/dialogs/TempoDialog.cpp:154
+msgid "Apply this tempo from here onwards"
+msgstr "Rakenda seda tempot siit edasi"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:158
+msgid "Replace the last tempo change"
+msgstr "Asenda viimane tempo muudatus"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:164
+msgid "Apply this tempo from the start of this bar"
+msgstr "Rakenda seda tempot selle takti algusest"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:167
+msgid "Apply this tempo to the whole composition"
+msgstr "Rakenda seda tempot kogu kompositsioonile"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:172
+msgid "Also make this the default tempo"
+msgstr "Ning tee see vaiketempoks"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:256
+msgid "%1.%2 s,"
+msgstr "%1.%2 s,"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:262
+#, c-format
+msgid "at the start of measure %1."
+msgstr "takti %1 alguses."
+
+#: ../src/gui/dialogs/TempoDialog.cpp:266
+#, c-format
+msgid "in the middle of measure %1."
+msgstr "takti %1 keskel."
+
+#: ../src/gui/dialogs/TempoDialog.cpp:285
+#, fuzzy
+msgid " (at %1.%2 s, in measure %3)"
+msgstr " (asukohas %1.%2 s, taktis %3)"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:302
+msgid "There are no preceding tempo changes."
+msgstr ""
+
+#: ../src/gui/dialogs/TempoDialog.cpp:310
+msgid "There are no other tempo changes."
+msgstr "Teised tempo muudatused puuduvad."
+
+#: ../src/gui/dialogs/TempoDialog.cpp:328
+msgid " bpm"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioPlayingDialog.cpp:42
+msgid "Playing audio file"
+msgstr "Audiofaili mängimine"
+
+#: ../src/gui/dialogs/AudioPlayingDialog.cpp:47
+msgid "Playing audio file \"%1\""
+msgstr "Audiofaili \"%1\" mängimine"
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:52
+#: ../src/gui/editors/matrix/MatrixView.cpp:2655
+#, fuzzy
+msgid "Trigger Segment"
+msgstr "Kustuta segment"
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:61
+#, fuzzy
+msgid "Trigger segment: "
+msgstr "Kustuta segment"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:59
+msgid "Key Change"
+msgstr ""
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:77
+msgid "Key signature"
+msgstr ""
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:80
+#, fuzzy
+msgid "Key transposition"
+msgstr "Sünkroniseerimine"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:86
+msgid "Existing notes following key change"
+msgstr ""
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:98
+#, fuzzy
+msgid "Flatten"
+msgstr "Ühtlustamine"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:100
+#, fuzzy
+msgid "Key"
+msgstr "Klahv"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:105
+#, fuzzy
+msgid "Sharpen"
+msgstr "Teravdus"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:109
+msgid "Major"
+msgstr ""
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:110
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:369
+#, fuzzy
+msgid "Minor"
+msgstr "Tenorivõti"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:123
+msgid "Transpose key according to segment transposition"
+msgstr ""
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:126
+msgid "Use specified key. Do not transpose"
+msgstr ""
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:134
+msgid "Apply to current segment only"
+msgstr ""
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:137
+msgid "Apply to all segments at this time"
+msgstr ""
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:141
+msgid "Exclude percussion segments"
+msgstr ""
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:155
+msgid "Maintain current accidentals"
+msgstr ""
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:158
+msgid "Transpose into this key"
+msgstr ""
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:331
+msgid "No such key"
+msgstr ""
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:44
+#: ../src/gui/editors/notation/NotationSelector.cpp:118
+msgid "Interpret"
+msgstr ""
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:50
+msgid "Interpretations to apply"
+msgstr ""
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:53
+msgid "Apply text dynamics (p, mf, ff etc)"
+msgstr ""
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:55
+msgid "Apply hairpin dynamics"
+msgstr ""
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:57
+msgid "Stress beats"
+msgstr ""
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:59
+msgid "Articulate slurs, staccato, tenuto etc"
+msgstr ""
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:61
+msgid "All available interpretations"
+msgstr "Kõikvõimalikud interpretatsioonid"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:316
+msgid ""
+"Attempted to launch JACK audio daemon failed. Audio will be disabled.\n"
+"Please check configuration (Settings -> Configure Rosegarden -> Audio -> "
+"Startup)\n"
+" and restart."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:325
+msgid "Starting sequencer..."
+msgstr "Sekventseri käivitamine..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:333
+#, fuzzy
+msgid "Initializing plugin manager..."
+msgstr "Pluginate halduri initsialiseerimine..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:338
+#, fuzzy
+msgid "Initializing view..."
+msgstr "Vaate initsialiseerimine..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:354
+#, fuzzy
+msgid "Special Parameters"
+msgstr "Segmendi parameetrid"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:430
+msgid "Starting sequence manager..."
+msgstr "Sekventseri halduri käivitamine..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:456
+msgid "Clearing studio data..."
+msgstr "Stuudio andmete puhastamine..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:475
+#: ../src/gui/editors/notation/NotationView.cpp:558
+msgid "Starting..."
+msgstr "Käivitamine..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:556
+#, fuzzy
+msgid "Import Rosegarden &Project file..."
+msgstr "Impordi &Rosegarden 2.1 fail..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:560
+msgid "Import &MIDI file..."
+msgstr "Impordi &MIDI fail..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:564
+msgid "Import &Rosegarden 2.1 file..."
+msgstr "Impordi &Rosegarden 2.1 fail..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:568
+#, fuzzy
+msgid "Import &Hydrogen file..."
+msgstr "Impordi &Rosegarden 2.1 fail..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:572
+msgid "Merge &File..."
+msgstr "Liida &fail..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:576
+msgid "Merge &MIDI file..."
+msgstr "Liida &MIDI fail..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:580
+msgid "Merge &Rosegarden 2.1 file..."
+msgstr "Liida &Rosegarden 2.1 fail..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:584
+#, fuzzy
+msgid "Merge &Hydrogen file..."
+msgstr "Impordi &Rosegarden 2.1 fail..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:588
+#, fuzzy
+msgid "Export Rosegarden &Project file..."
+msgstr "Impordi &Rosegarden 2.1 fail..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:592
+msgid "Export &MIDI file..."
+msgstr "Ekspordi &MIDI fail..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:596
+#, fuzzy
+msgid "Export &LilyPond file..."
+msgstr "Ekspordi &Lilypond fail..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:600
+msgid "Export Music&XML file..."
+msgstr "Ekspordi Music&XML fail..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:604
+msgid "Export &Csound score file..."
+msgstr "Expordi &Csound noodikirja fail..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:608
+msgid "Export M&up file..."
+msgstr "Ekspordi M&up fail..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:612
+#: ../src/gui/editors/notation/NotationView.cpp:1500
+#, fuzzy
+msgid "Print &with LilyPond..."
+msgstr "Lilypond faili eksport..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:616
+#: ../src/gui/editors/notation/NotationView.cpp:1504
+#, fuzzy
+msgid "Preview with Lil&yPond..."
+msgstr "Lilypond faili eksport..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:620
+#, fuzzy
+msgid "Play&list"
+msgstr "Mängi maha"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:627
+#, fuzzy
+msgid "Rosegarden &Tutorial"
+msgstr "Rosegarden"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:631
+msgid "&Bug Reporting Guidelines"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:645
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:348
+#: ../src/gui/editors/segment/MarkerEditor.cpp:378
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:388
+#: ../src/gui/general/EditViewBase.cpp:190
+#: ../src/gui/studio/BankEditorDialog.cpp:318
+#: ../src/gui/studio/DeviceManagerDialog.cpp:227
+msgid "Und&o"
+msgstr "Tühista tegev&us"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:651
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:354
+#: ../src/gui/editors/segment/MarkerEditor.cpp:384
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:394
+#: ../src/gui/general/EditViewBase.cpp:196
+#: ../src/gui/studio/BankEditorDialog.cpp:324
+#: ../src/gui/studio/DeviceManagerDialog.cpp:233
+msgid "Re&do"
+msgstr "&Tee uuesti"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:665
+#: ../src/gui/editors/notation/NotationView.cpp:2297
+msgid "Show T&ools Toolbar"
+msgstr "Näita t&ööriistade tööriistariba"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:669
+msgid "Show Trac&ks Toolbar"
+msgstr "Näita &radade tööriistariba"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:673
+msgid "Show &Editors Toolbar"
+msgstr "Näita r&edaktori tööriistariba"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:677
+#: ../src/gui/editors/notation/NotationView.cpp:2309
+msgid "Show Trans&port Toolbar"
+msgstr "Näita trans&pordi tööristariba"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:681
+msgid "Show &Zoom Toolbar"
+msgstr "Näita &suurenduse tööriistariba"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:688
+msgid "Show Tra&nsport"
+msgstr "Näita tra&nspordi akent"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:693
+msgid "Show Track &Labels"
+msgstr "Näita radade &nimesid"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:698
+#, fuzzy
+msgid "Show Playback Position R&uler"
+msgstr "Mahamängimise kursor &kursori juurde"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:703
+msgid "Show Te&mpo Ruler"
+msgstr "Näita te&mpo joonlauda"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:708
+msgid "Show Cho&rd Name Ruler"
+msgstr "Näita ako&rdi nimede joonlauda"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:714
+msgid "Show Segment Pre&views"
+msgstr "Näita segmentide eel&vaatlusi"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:719
+#, fuzzy
+msgid "Show Special &Parameters"
+msgstr "Näita &instrumentide parameetreid"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:753
+#: ../src/gui/editors/matrix/MatrixView.cpp:641
+#: ../src/gui/editors/notation/NotationView.cpp:1772
+#, fuzzy
+msgid "&Select and Edit"
+msgstr "Vali l&õpuni"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:758
+#: ../src/gui/editors/matrix/MatrixView.cpp:646
+msgid "&Draw"
+msgstr "&Joonista"
+
+#: ../src/commands/edit/EraseCommand.h:50
+#: ../src/gui/application/RosegardenGUIApp.cpp:763
+#: ../src/gui/editors/matrix/MatrixView.cpp:651
+#: ../src/gui/editors/notation/NotationView.cpp:1766
+msgid "&Erase"
+msgstr "&Kustuta"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:768
+#: ../src/gui/editors/matrix/MatrixView.cpp:656
+msgid "&Move"
+msgstr "&Liikumine"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:775
+msgid "&Resize"
+msgstr "Muuda suu&rust"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:782 rc.cpp:87
+#, no-c-format
+msgid "&Split"
+msgstr "&Tükelda"
+
+#: ../src/commands/segment/SegmentJoinCommand.h:53
+#: ../src/gui/application/RosegardenGUIApp.cpp:789
+msgid "&Join"
+msgstr "Üh&enda"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:795
+msgid "&Harmonize"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:806
+#: ../src/gui/rulers/TempoRuler.cpp:157
+#, fuzzy
+msgid "Open Tempo and Time Signature Editor"
+msgstr "Ava sündmuse redaktoris"
+
+#: ../src/commands/segment/CutRangeCommand.cpp:41
+#: ../src/gui/application/RosegardenGUIApp.cpp:812
+#, fuzzy
+msgid "Cut Range"
+msgstr "Lõika ja s&ulge"
+
+#: ../src/commands/edit/CopyCommand.cpp:73
+#: ../src/gui/application/RosegardenGUIApp.cpp:816
+msgid "Copy Range"
+msgstr ""
+
+#: ../src/commands/segment/PasteRangeCommand.cpp:45
+#: ../src/gui/application/RosegardenGUIApp.cpp:820
+#, fuzzy
+msgid "Paste Range"
+msgstr "Maatriks"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:828
+#, fuzzy
+msgid "Insert Range..."
+msgstr "Lisa paus"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:832
+#: ../src/gui/editors/notation/NotationView.cpp:1804
+msgid "De&lete"
+msgstr "&Kustuta"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:836
+msgid "Select &All Segments"
+msgstr "V&ali kõik segmendid"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:852
+#, fuzzy
+msgid "Edit Mar&kers..."
+msgstr "Redigeeri märgist"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:856
+msgid "Edit Document P&roperties..."
+msgstr "&Redigeeri dokumendi omadusi..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:864
+msgid "Open in &Default Editor"
+msgstr "Ava vaikere&daktoris"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:870
+#: ../src/gui/general/EditViewBase.cpp:206
+msgid "Open in Matri&x Editor"
+msgstr "Ava maatri&ksredaktoris"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:876
+#: ../src/gui/general/EditViewBase.cpp:212
+#, fuzzy
+msgid "Open in &Percussion Matrix Editor"
+msgstr "Ava maatri&ksredaktoris"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:882
+#: ../src/gui/general/EditViewBase.cpp:218
+msgid "Open in &Notation Editor"
+msgstr "Ava &noodikirja redaktoris"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:888
+#: ../src/gui/general/EditViewBase.cpp:224
+msgid "Open in &Event List Editor"
+msgstr "Ava sündmuste nim&ekirja redaktoris"
+
+#: ../src/commands/edit/EventQuantizeCommand.cpp:120
+#: ../src/commands/edit/EventUnquantizeCommand.cpp:87
+#: ../src/gui/application/RosegardenGUIApp.cpp:894
+msgid "&Quantize..."
+msgstr "&Kvandi..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:908
+#: ../src/gui/editors/matrix/MatrixView.cpp:686
+msgid "Repeat Last Quantize"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:928
+#, fuzzy
+msgid "Split at Time..."
+msgstr "Käivitamine..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:932
+#: ../src/gui/general/EditView.cpp:796
+msgid "Jog &Left"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:936
+#: ../src/gui/general/EditView.cpp:800
+msgid "Jog &Right"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:940
+#, fuzzy
+msgid "Set Start Time..."
+msgstr "Käivitamine..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:944
+#, fuzzy
+msgid "Set Duration..."
+msgstr "Kestvus"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:953
+msgid "Turn Re&peats into Copies"
+msgstr "Muuda kordused koo&piateks"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:958
+#, fuzzy
+msgid "Manage Tri&ggered Segments"
+msgstr "A&udiosegmentide manageerimine"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:962
+msgid "Set Tempos from &Beat Segment"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:966
+msgid "Set &Tempo to Audio Segment Duration"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:972
+#, fuzzy
+msgid "Manage A&udio Files"
+msgstr "Lisa audiofail"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:977
+#, fuzzy
+msgid "Show Segment Labels"
+msgstr "Segmendi nime muutmine"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:986
+#, fuzzy
+msgid "Add &Track"
+msgstr "Lisa rajad..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:990
+#, fuzzy
+msgid "&Add Tracks..."
+msgstr "Lisa rajad..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:996
+#, fuzzy
+msgid "D&elete Track"
+msgstr "&Kustuta rada"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1002
+msgid "Move Track &Down"
+msgstr "Liiguta ra&da alla"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1008
+msgid "Move Track &Up"
+msgstr "Liig&uta rada üles"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1012
+msgid "Select &Next Track"
+msgstr "&Vali uus rada"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1017
+msgid "Select &Previous Track"
+msgstr "Vali eelmine &rada"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1022
+#, fuzzy
+msgid "Mute or Unmute Track"
+msgstr "&Kustuta rada"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1027
+msgid "Arm or Un-arm Track for Record"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1034
+#, fuzzy
+msgid "&Mute all Tracks"
+msgstr "&Kustuta rada"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1040
+msgid "&Unmute all Tracks"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1044
+msgid "&Remap Instruments..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1053
+#, fuzzy
+msgid "&Audio Mixer"
+msgstr "Lisa audiofail"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1059
+msgid "Midi Mi&xer"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1065
+#, fuzzy
+msgid "Manage MIDI &Devices"
+msgstr "MIDI seadmete haldamine"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1071
+msgid "Manage S&ynth Plugins"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1075
+#, fuzzy
+msgid "Modify MIDI &Filters"
+msgstr "MIDI &filtrite muutmine..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1079
+msgid "MIDI Thru Routing"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1085
+#, fuzzy
+msgid "Manage &Metronome"
+msgstr "&Metronoomi haldamine..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1089
+msgid "&Save Current Document as Default Studio"
+msgstr "&Salvesta aktiivne dokument vaikestuudioks"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1093
+msgid "&Import Default Studio"
+msgstr "&Impordi vaikestuudio"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1097
+#, fuzzy
+msgid "Im&port Studio from File..."
+msgstr "&Impordi stuudio failist..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1101
+msgid "&Reset MIDI Network"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1105
+#, fuzzy
+msgid "Set Quick Marker at Playback Position"
+msgstr "Lisa tempo muudatus"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1109
+msgid "Jump to Quick Marker"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1142
+#: ../src/gui/editors/matrix/MatrixView.cpp:782
+#: ../src/gui/editors/notation/NotationView.cpp:2397
+#: ../src/gui/studio/AudioMixerWindow.cpp:105
+#: ../src/gui/studio/MidiMixerWindow.cpp:81
+msgid "&Play"
+msgstr "&Mahamängimine"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1153
+#: ../src/gui/editors/matrix/MatrixView.cpp:791
+#: ../src/gui/editors/notation/NotationView.cpp:2406
+#: ../src/gui/studio/AudioMixerWindow.cpp:114
+#: ../src/gui/studio/MidiMixerWindow.cpp:90
+msgid "&Stop"
+msgstr "&Stopp"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1160
+#: ../src/gui/editors/matrix/MatrixView.cpp:802
+#: ../src/gui/editors/notation/NotationView.cpp:2417
+#: ../src/gui/studio/AudioMixerWindow.cpp:125
+#: ../src/gui/studio/MidiMixerWindow.cpp:101
+msgid "&Fast Forward"
+msgstr "Keri &edasi"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1168
+#: ../src/gui/editors/matrix/MatrixView.cpp:796
+#: ../src/gui/editors/notation/NotationView.cpp:2411
+#: ../src/gui/studio/AudioMixerWindow.cpp:119
+#: ../src/gui/studio/MidiMixerWindow.cpp:95
+msgid "Re&wind"
+msgstr "&Keri tagasi"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1175
+msgid "P&unch in Record"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1182
+#: ../src/gui/studio/AudioMixerWindow.cpp:143
+#: ../src/gui/studio/MidiMixerWindow.cpp:119
+msgid "&Record"
+msgstr "Sa&lvestus"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1189
+#: ../src/gui/editors/matrix/MatrixView.cpp:808
+#: ../src/gui/editors/notation/NotationView.cpp:2423
+#: ../src/gui/studio/AudioMixerWindow.cpp:131
+#: ../src/gui/studio/MidiMixerWindow.cpp:107
+msgid "Rewind to &Beginning"
+msgstr "Keri tagasi &algusesse"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1196
+#: ../src/gui/editors/matrix/MatrixView.cpp:814
+#: ../src/gui/editors/notation/NotationView.cpp:2429
+#: ../src/gui/studio/AudioMixerWindow.cpp:137
+#: ../src/gui/studio/MidiMixerWindow.cpp:113
+msgid "Fast Forward to &End"
+msgstr "Keri &edasi lõppu"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1203
+#: ../src/gui/editors/matrix/MatrixView.cpp:832
+#: ../src/gui/editors/notation/NotationView.cpp:2447
+msgid "Scro&ll to Follow Playback"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1209
+#: ../src/gui/editors/matrix/MatrixView.cpp:838
+#: ../src/gui/editors/notation/NotationView.cpp:2453
+#: ../src/gui/studio/AudioMixerWindow.cpp:149
+#: ../src/gui/studio/MidiMixerWindow.cpp:125
+#, fuzzy
+msgid "Panic"
+msgstr "Panoraam"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1213
+msgid "Segment Debug Dump "
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1283
+msgid " Zoom: "
+msgstr " Suurendus: "
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1719
+msgid "File \"%1\" does not exist"
+msgstr "Faili \"%1\" ei eksisteeri"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1725
+msgid "File \"%1\" is actually a directory"
+msgstr "Fail \"%1\" on tegelikult kataloog"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1734
+msgid "You do not have read permission for \"%1\""
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1802
+msgid ""
+"An auto-save file for this document has been found\n"
+"Do you want to open it instead ?"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1896
+#, fuzzy
+msgid "Example Files"
+msgstr "Näide"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2100
+msgid "Opening a new application window..."
+msgstr "Uue rakenduse akna avamine..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2110
+msgid "Creating new document..."
+msgstr "Uue dokumendi loomine..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2154
+#, c-format
+msgid ""
+"Malformed URL\n"
+"%1"
+msgstr ""
+"Vigane URL\n"
+"%1"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2179
+#: ../src/gui/application/RosegardenGUIApp.cpp:2240
+msgid "Opening file..."
+msgstr "Faili avamine..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2201
+#: ../src/gui/application/RosegardenGUIApp.cpp:2220
+msgid "Open File"
+msgstr "Faili avamine"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1225
+#: ../src/gui/application/RosegardenGUIApp.cpp:2258
+msgid "Saving file..."
+msgstr "Faili salvestamine..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2330
+msgid "This is not a valid filename.\n"
+msgstr "See ei ole korrektne faili nimi.\n"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2335
+msgid "This is not a local file.\n"
+msgstr "See ei ole kohalik fail.\n"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2342
+#: ../src/gui/studio/BankEditorDialog.cpp:1640
+#: ../src/gui/studio/DeviceManagerDialog.cpp:787
+msgid "You have specified a directory"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2348
+#: ../src/gui/studio/BankEditorDialog.cpp:1646
+#: ../src/gui/studio/DeviceManagerDialog.cpp:793
+msgid "The specified file exists. Overwrite?"
+msgstr "Määratud fail eksisteerib juba. Kas kirjutada üle?"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2362
+msgid "Saving file with a new filename..."
+msgstr "Faili salvestamine uue nimega..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2364
+#, fuzzy
+msgid "Rosegarden files"
+msgstr "Rosegarden-4 failid"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2365
+#: ../src/gui/application/RosegardenGUIApp.cpp:4860
+#: ../src/gui/application/RosegardenGUIApp.cpp:4904
+#: ../src/gui/application/RosegardenGUIApp.cpp:4942
+#: ../src/gui/application/RosegardenGUIApp.cpp:4975
+#: ../src/gui/application/RosegardenGUIApp.cpp:5009
+#: ../src/gui/application/RosegardenGUIApp.cpp:5116
+msgid "All files"
+msgstr "Kõik failid"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2366
+msgid "Save as..."
+msgstr "Salvesta kui..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2404
+msgid "Closing file..."
+msgstr "Faili sulgemine..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2421
+#: ../src/gui/editors/notation/NotationView.cpp:4618
+msgid "Printing..."
+msgstr "Trükkimine..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2433
+#: ../src/gui/editors/notation/NotationView.cpp:4635
+msgid "Previewing..."
+msgstr "Eelvaatlus..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2440
+msgid "Exiting..."
+msgstr "Väljumine..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2463
+msgid "Cutting selection..."
+msgstr "Valiku lõikamine..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2474
+#: ../src/gui/editors/matrix/MatrixView.cpp:1614
+#: ../src/gui/editors/notation/NotationView.cpp:4763
+msgid "Copying selection to clipboard..."
+msgstr "Valiku kopeerimine lõikepuhvrisse..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2484
+#: ../src/gui/editors/eventlist/EventView.cpp:878
+#: ../src/gui/editors/matrix/MatrixView.cpp:1625
+#: ../src/gui/editors/notation/NotationView.cpp:4796
+#: ../src/gui/editors/notation/NotationView.cpp:4841
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:352
+msgid "Clipboard is empty"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2487
+#: ../src/gui/editors/eventlist/EventView.cpp:882
+#: ../src/gui/editors/matrix/MatrixView.cpp:1629
+#: ../src/gui/editors/notation/NotationView.cpp:4804
+#: ../src/gui/editors/notation/NotationView.cpp:4845
+msgid "Inserting clipboard contents..."
+msgstr "Lõikelaua sisu lisamine..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2556
+#, fuzzy
+msgid "Duration of empty range to insert"
+msgstr "Valiku lõikamine..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2631
+msgid "This function needs no more than one segment to be selected."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2654
+msgid "Can't join Audio segments"
+msgstr "Audiosegmente ei saa ühendada"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2707
+#, fuzzy
+msgid "rescaling an audio file"
+msgstr "Audiofaili mängimine"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2723
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:172
+#, fuzzy
+msgid "Rescaling audio file..."
+msgstr "Faili lugemine..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2767
+msgid ""
+"The audio file path does not exist or is not writable.\n"
+"You must set the audio file path to a valid directory in Document Properties "
+"before %1.\n"
+"Would you like to set it now?"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2769
+#: ../src/gui/application/RosegardenGUIApp.cpp:5291
+#: ../src/gui/application/RosegardenGUIApp.cpp:5339
+#: ../src/gui/editors/segment/TrackButtons.cpp:419
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:159
+#, fuzzy
+msgid "Set audio file path"
+msgstr "Audiofailide asukoht:"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2833
+#, fuzzy
+msgid "Jog Selection"
+msgstr "Puhasta valik"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2978
+#, fuzzy, c-format
+msgid ""
+"_n: Split Segment at Time\n"
+"Split %n Segments at Time"
+msgstr "Kestvus"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3013
+#: ../src/gui/general/EditViewBase.cpp:619
+#, fuzzy
+msgid "Segment Start Time"
+msgstr "Segmendi parameetrid"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3023
+#, fuzzy
+msgid "Set Segment Start Times"
+msgstr "Näita &segmentide parameetreid"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3024
+#: ../src/gui/general/EditViewBase.cpp:626
+#, fuzzy
+msgid "Set Segment Start Time"
+msgstr "Näita &segmentide parameetreid"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3056
+#: ../src/gui/general/EditViewBase.cpp:644
+#, fuzzy
+msgid "Segment Duration"
+msgstr "Kestvus"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3068
+#, fuzzy
+msgid "Set Segment Durations"
+msgstr "Näita &segmentide parameetreid"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3069
+#: ../src/gui/general/EditViewBase.cpp:652
+#, fuzzy
+msgid "Set Segment Duration"
+msgstr "Noodivar&te suund"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3176
+#: ../src/gui/application/RosegardenGUIApp.cpp:5875
+msgid "Set Global Tempo"
+msgstr "Globaalse tempo seadmine"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3234
+#: ../src/gui/general/EditViewBase.cpp:477
+msgid "Toggle the toolbar..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3244
+msgid "Toggle the tools toolbar..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3254
+msgid "Toggle the tracks toolbar..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3264
+msgid "Toggle the editor toolbar..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3274
+msgid "Toggle the transport toolbar..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3284
+msgid "Toggle the zoom toolbar..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3294
+msgid "Toggle the Transport"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3377
+#: ../src/gui/general/EditViewBase.cpp:487
+msgid "Toggle the statusbar..."
+msgstr "Olekuriba lülitamine..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3434
+msgid ""
+"The join tool isn't implemented yet. Instead please highlight the segments "
+"you want to join and then use the menu option:\n"
+"\n"
+" Segments->Collapse Segments.\n"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3437
+msgid "Join tool not yet implemented"
+msgstr "Ühendamine ei tööta veel"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3675
+msgid "Revert modified document to previous saved version?"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3691
+#, fuzzy
+msgid ""
+"*.rgp|Rosegarden Project files\n"
+"*|All files"
+msgstr ""
+"*.rose|Rosegarden-2 failid\n"
+"*|Kõik failid"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3692
+#, fuzzy
+msgid "Import Rosegarden Project File"
+msgstr "Impordi &Rosegarden 2.1 fail..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3717
+msgid "Failed to import project file \"%1\""
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3739
+msgid "Open MIDI File"
+msgstr "MIDI faili avamine"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3756
+msgid "Merge MIDI File"
+msgstr "MIDI faili liitmine"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3866
+msgid "Importing MIDI file..."
+msgstr "MIDI faili import..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3903
+msgid "Calculating notation..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3950
+msgid "Calculate Notation"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3991
+#: ../src/gui/application/RosegardenGUIApp.cpp:4008
+msgid ""
+"*.rose|Rosegarden-2 files\n"
+"*|All files"
+msgstr ""
+"*.rose|Rosegarden-2 failid\n"
+"*|Kõik failid"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3992
+#: ../src/gui/application/RosegardenGUIApp.cpp:4009
+msgid "Open Rosegarden 2.1 File"
+msgstr "Rosegarden 2.1 faili avamine"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4026
+msgid "Importing Rosegarden 2.1 file..."
+msgstr "Rosegarden 2.1 faili import..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4052
+msgid "Can't load Rosegarden 2.1 file. It appears to be corrupted."
+msgstr "Rosegarden 2.1 faili ei õnnestu avada. See paistab olevat vigane."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4078
+#: ../src/gui/application/RosegardenGUIApp.cpp:4095
+#, fuzzy
+msgid ""
+"*.h2song|Hydrogen files\n"
+"*|All files"
+msgstr ""
+"*.rg|Rosegarden-4 failid\n"
+"*|Kõik failid"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4079
+#: ../src/gui/application/RosegardenGUIApp.cpp:4096
+#, fuzzy
+msgid "Open Hydrogen File"
+msgstr "Rosegarden 2.1 faili avamine"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4113
+#, fuzzy
+msgid "Importing Hydrogen file..."
+msgstr "Rosegarden 2.1 faili import..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4139
+#, fuzzy
+msgid "Can't load Hydrogen file. It appears to be corrupted."
+msgstr "Rosegarden 2.1 faili ei õnnestu avada. See paistab olevat vigane."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4527
+#, fuzzy
+msgid "Export and import of Rosegarden Project files"
+msgstr "Rosegarden 2.1 faili import..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4529
+#, fuzzy
+msgid "The Rosegarden Project Packager helper script"
+msgstr "Rosegarden-4 failid"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4533
+msgid "%1 - for project file support"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4550
+msgid "The Rosegarden LilyPondView helper script"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4554
+#, fuzzy
+msgid "%1 - for LilyPond preview support"
+msgstr "Lilypond'i ekpordi seadistused"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4570
+msgid "The Rosegarden Audio File Importer helper script"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4574
+#, fuzzy
+msgid "%1 - for audio file import"
+msgstr "Audiofailide asukoht:"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4585
+msgid ""
+"<h3>Helper programs not found</h3><p>Rosegarden could not find one or more "
+"helper programs which it needs to provide some features. The following "
+"features will not be available:</p>"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4586
+#: ../src/gui/application/RosegardenGUIApp.cpp:4592
+#, fuzzy
+msgid "<ul>"
+msgstr "<vaikeväärtus>"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4588
+#: ../src/gui/application/RosegardenGUIApp.cpp:4594
+msgid "<li>%1</li>"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4590
+#: ../src/gui/application/RosegardenGUIApp.cpp:4596
+msgid "</ul>"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4591
+msgid ""
+"<p>To fix this, you should install the following additional programs:</p>"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4603
+msgid "Helper programs not found"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4686
+msgid "Starting the sequencer..."
+msgstr "Sekventseri käivitamine..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4712
+msgid "Couldn't start the sequencer"
+msgstr "Sekventserit ei õnnestunud käivitada"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4789
+msgid "Clearing down jackd..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4803
+msgid "Starting jackd..."
+msgstr "Jackd käivitamine..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4842
+msgid ""
+"The Rosegarden sequencer process has exited unexpectedly. Sound and "
+"recording will no longer be available for this session.\n"
+"Please exit and restart Rosegarden to restore sound capability."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4846
+msgid ""
+"The Rosegarden sequencer could not be started, so sound and recording will "
+"be unavailable for this session.\n"
+"For assistance with correct audio and MIDI configuration, go to http://"
+"rosegardenmusic.com."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4856
+#, fuzzy
+msgid "Exporting Rosegarden Project file..."
+msgstr "Rosegarden 2.1 faili import..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4859
+#, fuzzy
+msgid "Rosegarden Project files\n"
+msgstr "Rosegarden-4 failid"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4861
+#: ../src/gui/application/RosegardenGUIApp.cpp:4905
+#: ../src/gui/application/RosegardenGUIApp.cpp:4943
+#: ../src/gui/application/RosegardenGUIApp.cpp:4976
+#: ../src/gui/application/RosegardenGUIApp.cpp:5010
+#: ../src/gui/application/RosegardenGUIApp.cpp:5116
+msgid "Export as..."
+msgstr "Eksport kui..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4875
+#, c-format
+msgid "Saving Rosegarden file to package failed: %1"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4889
+msgid "Failed to export to project file \"%1\""
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4900
+#: ../src/gui/application/RosegardenGUIApp.cpp:4915
+msgid "Exporting MIDI file..."
+msgstr "MIDI faili eksport..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4903
+msgid "Standard MIDI files\n"
+msgstr "Standard MIDI failid\n"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4934
+#: ../src/gui/application/RosegardenGUIApp.cpp:4966
+#: ../src/gui/application/RosegardenGUIApp.cpp:4999
+#: ../src/gui/application/RosegardenGUIApp.cpp:5103
+#: ../src/gui/application/RosegardenGUIApp.cpp:5140
+#: ../src/gui/editors/notation/NotationView.cpp:4733
+msgid "Export failed. The file could not be opened for writing."
+msgstr "Eksport ebaõnnestus. Faili ei õnnestunud kirjutamiseks avada."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4940
+#: ../src/gui/application/RosegardenGUIApp.cpp:4952
+msgid "Exporting Csound score file..."
+msgstr "Csound noodikirja faili eksport..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4972
+#: ../src/gui/application/RosegardenGUIApp.cpp:4985
+msgid "Exporting Mup file..."
+msgstr "Mup faili eksport..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4975
+msgid "Mup files\n"
+msgstr "Mup failid\n"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5005
+#: ../src/gui/application/RosegardenGUIApp.cpp:5089
+#: ../src/gui/editors/notation/NotationView.cpp:4719
+#, fuzzy
+msgid "Exporting LilyPond file..."
+msgstr "Lilypond faili eksport..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5008
+#, fuzzy
+msgid "LilyPond files"
+msgstr "Lilypond failid"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5023
+#: ../src/gui/editors/notation/NotationView.cpp:4653
+#, fuzzy
+msgid "Printing LilyPond file..."
+msgstr "Lilypond faili eksport..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5028
+#: ../src/gui/application/RosegardenGUIApp.cpp:5052
+#: ../src/gui/editors/notation/NotationView.cpp:4658
+#: ../src/gui/editors/notation/NotationView.cpp:4682
+#, fuzzy
+msgid "Failed to open a temporary file for LilyPond export."
+msgstr "Audiofaili valimine"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5047
+#: ../src/gui/editors/notation/NotationView.cpp:4677
+#, fuzzy
+msgid "Previewing LilyPond file..."
+msgstr "Lilypond faili eksport..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5080
+#: ../src/gui/editors/notation/NotationView.cpp:4710
+#, fuzzy
+msgid "LilyPond Preview Options"
+msgstr "Lilypond'i ekpordi seadistused"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5081
+#: ../src/gui/editors/notation/NotationView.cpp:4711
+#, fuzzy
+msgid "LilyPond preview options"
+msgstr "Lilypond'i ekpordi seadistused"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5112
+#: ../src/gui/application/RosegardenGUIApp.cpp:5126
+msgid "Exporting MusicXML file..."
+msgstr "MusicXML faili eksport..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5115
+msgid "XML files"
+msgstr "XML failid"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5289
+#: ../src/gui/editors/segment/TrackButtons.cpp:417
+msgid ""
+"The audio file path does not exist or is not writable.\n"
+"Please set the audio file path to a valid directory in Document Properties "
+"before recording audio.\n"
+"Would you like to set it now?"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5337
+msgid ""
+"The audio file path does not exist or is not writable.\n"
+"Please set the audio file path to a valid directory in Document Properties "
+"before you start to record audio.\n"
+"Would you like to set it now?"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5780
+#, fuzzy
+msgid "Move playback pointer to time"
+msgstr "Mahamängimise kursor &kursori juurde"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5793
+#: ../src/gui/editors/matrix/MatrixView.cpp:2240
+msgid "%1%"
+msgstr "%1%"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5861
+#, c-format
+msgid "Replace Tempo Change at %1"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5891
+msgid "Set Global and Default Tempo"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5914
+#, fuzzy
+msgid "Move Tempo Change"
+msgstr "Eemalda &tempo muutus..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5949
+#, fuzzy
+msgid "new marker"
+msgstr "Eemalda kõik märgised"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5950
+#, fuzzy
+msgid "no description"
+msgstr "Kirjeldus"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:6363
+#, c-format
+msgid "Sequencer failed to add audio file %1"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:6388
+#, c-format
+msgid "Sequencer failed to remove audio file id %1"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:6448
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:1086
+msgid "Modify Segment label"
+msgstr "Segmendi nime muutmine"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:6450
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:1088
+msgid "Modify Segments label"
+msgstr "Segmentide nime muutmine"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:6452
+msgid "Relabelling selection..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7539
+#, fuzzy
+msgid "Play List"
+msgstr "Mängitakse "
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7567
+msgid "http://rosegarden.sourceforge.net/tutorial/en/chapter-0.html"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7574
+msgid "http://rosegarden.sourceforge.net/tutorial/bug-guidelines.html"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7650
+msgid "Queueing MIDI panic events for tranmission..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7708
+msgid "Are you sure you want to save this as your default studio?"
+msgstr "Oled sa kindel, et soovid salvestada selle oma vaikestuudioks?"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7713
+msgid "Saving current document as default studio..."
+msgstr "Aktiivse dokumendi salvestamine vaikestuudioks..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7738
+msgid ""
+"Are you sure you want to import your default studio and lose the current one?"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7773
+msgid "Import Studio from File"
+msgstr "Stuudio import failist"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7807
+msgid "Import Studio"
+msgstr "Stuudio import"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:8015
+msgid ""
+"<h3>Newer version available</h3><p>A newer version of Rosegarden may be "
+"available.<br>Please consult the <a href=\"http://www.rosegardenmusic.com/"
+"getting/\">Rosegarden website</a> for more information.</p>"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:8016
+#, fuzzy
+msgid "Newer version available"
+msgstr "Lokaliseeritud (kui võimalik)"
+
+#: ../src/gui/application/RosegardenApplication.cpp:104
+#, c-format
+msgid "Failed to load soundfont %1"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:311
+msgid "Rosegarden - A sequencer and musical notation editor"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:315
+msgid "Don't use the sequencer (support editing only)"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:316
+msgid "Don't show the splash screen"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:317
+msgid "Don't automatically run in the background"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:318
+msgid "Attach to a running sequencer process, if found"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:319
+msgid "Ignore installed version - for devs only"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:320
+msgid "file to open"
+msgstr "avatav fail"
+
+#: ../src/gui/application/main.cpp:370
+msgid "Installation contains the wrong version of Rosegarden."
+msgstr "Paigaldus sisaldab valet Rosegardeni versiooni."
+
+#: ../src/gui/application/main.cpp:371
+msgid ""
+" The wrong versions of Rosegarden's data files were\n"
+" found in the standard KDE installation directories.\n"
+" (I am %1, but the installed files are for version %2.)\n"
+"\n"
+" This may mean one of the following:\n"
+"\n"
+" 1. This is a new upgrade of Rosegarden, and it has not yet been\n"
+" installed. If you compiled it yourself, check that you have\n"
+" run \"make install\" and that the procedure completed\n"
+" successfully.\n"
+"\n"
+" 2. The upgrade was installed in a non-standard directory,\n"
+" and an old version was found in a standard directory. If so,\n"
+" you will need to add the correct directory to your KDEDIRS\n"
+" environment variable before you can run it."
+msgstr ""
+
+#: ../src/gui/application/main.cpp:383 ../src/gui/application/main.cpp:401
+msgid "Installation problem"
+msgstr "Probleem paigaldusega"
+
+#: ../src/gui/application/main.cpp:389
+msgid "Rosegarden does not appear to have been installed."
+msgstr "Paistab, et Rosegarden pole paigaldatud."
+
+#: ../src/gui/application/main.cpp:390
+msgid ""
+" One or more of Rosegarden's data files could not be\n"
+" found in the standard KDE installation directories.\n"
+"\n"
+" This may mean one of the following:\n"
+"\n"
+" 1. Rosegarden has not been correctly installed. If you compiled\n"
+" it yourself, check that you have run \"make install\" and that\n"
+" the procedure completed successfully.\n"
+"\n"
+" 2. Rosegarden has been installed in a non-standard directory,\n"
+" and you need to add this directory to your KDEDIRS environment\n"
+" variable before you can run it. This may be the case if you\n"
+" installed into $HOME or a local third-party package directory\n"
+" like /usr/local or /opt."
+msgstr ""
+
+#: ../src/gui/application/main.cpp:414
+msgid "Rosegarden"
+msgstr "Rosegarden"
+
+#: ../src/gui/application/main.cpp:416
+msgid ""
+"Copyright 2000 - 2008 Guillaume Laurent, Chris Cannam, Richard Bown\n"
+"Parts copyright 1994 - 2004 Chris Cannam, Andy Green, Richard Bown, "
+"Guillaume Laurent\n"
+"LilyPond fonts copyright 1997 - 2005 Han-Wen Nienhuys and Jan Nieuwenhuizen"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:428
+msgid "Chord labelling code"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:429
+msgid ""
+"LilyPond output\n"
+"assorted other patches\n"
+"i18n-ization"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:430
+msgid ""
+"UI improvements\n"
+"bug fixes"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:431
+msgid ""
+"Segment colours\n"
+"Other UI and bug fixes"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:432
+msgid ""
+"Russian translation\n"
+"i18n-ization"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:433 ../src/gui/application/main.cpp:434
+msgid "German translation"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:435
+msgid "Welsh translation"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:436
+#, fuzzy
+msgid "French translation"
+msgstr "Sünkroniseerimine"
+
+#: ../src/gui/application/main.cpp:437
+#, fuzzy
+msgid ""
+"French translation\n"
+"Bug fixes"
+msgstr "Sünkroniseerimine"
+
+#: ../src/gui/application/main.cpp:438 ../src/gui/application/main.cpp:439
+msgid "Italian translation"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:440 ../src/gui/application/main.cpp:441
+msgid "Swedish translation"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:442
+msgid "Estonian translation"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:443 ../src/gui/application/main.cpp:444
+#, fuzzy
+msgid "Dutch translation"
+msgstr "Kestvus"
+
+#: ../src/gui/application/main.cpp:445
+msgid "HSpinBox class"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:446
+msgid "Transposition by interval"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:447
+msgid "Original designs for rotary controllers"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:448
+#, fuzzy
+msgid "Japanese translation"
+msgstr "Sünkroniseerimine"
+
+#: ../src/gui/application/main.cpp:449
+msgid ""
+"Auto-scroll deceleration\n"
+"Rests outside staves and other bug fixes"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:450
+#, fuzzy
+msgid "Simplified Chinese translation"
+msgstr "Sünkroniseerimine"
+
+#: ../src/gui/application/main.cpp:451
+msgid "LIRC infrared remote-controller support"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:452
+msgid "MTC slave timing implementation"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:453
+#, fuzzy
+msgid "Czech translation"
+msgstr "Sünkroniseerimine"
+
+#: ../src/gui/application/main.cpp:454
+msgid "SCons/bksys building system"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:455
+msgid "icons, icons, icons"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:456 ../src/gui/application/main.cpp:457
+#: ../src/gui/application/main.cpp:458 ../src/gui/application/main.cpp:459
+#, fuzzy
+msgid "Spanish translation"
+msgstr "Sünkroniseerimine"
+
+#: ../src/gui/application/main.cpp:460 ../src/gui/application/main.cpp:461
+#, fuzzy
+msgid "Catalan translation"
+msgstr "Sünkroniseerimine"
+
+#: ../src/gui/application/main.cpp:462
+msgid ""
+"1.2.3 splash screen photo\n"
+"Gave birth to D. Michael McIntyre, bought him a good flute once\n"
+"upon a time, and always humored him when he came over to play her\n"
+"some new instrument, even though she really hated his playing.\n"
+"Born October 19, 1951, died September 21, 2007, R. I. P."
+msgstr ""
+
+#: ../src/gui/application/main.cpp:463
+msgid "Initial guitar chord editing code"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:464
+#, fuzzy
+msgid "Polish translation"
+msgstr "Sünkroniseerimine"
+
+#: ../src/gui/application/main.cpp:465
+#, fuzzy
+msgid "Basque translation"
+msgstr "Sünkroniseerimine"
+
+#: ../src/gui/application/main.cpp:466
+msgid "Klearlook theme"
+msgstr ""
+
+#: ../src/_translatorinfo.cpp:1 ../src/gui/application/main.cpp:468
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr "Hasso Tepper"
+
+#: ../src/_translatorinfo.cpp:3 ../src/gui/application/main.cpp:468
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+
+#: ../src/gui/application/main.cpp:719
+msgid "Welcome!"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:731
+msgid ""
+"<h2>Welcome to Rosegarden!</h2><p>Welcome to the Rosegarden audio and MIDI "
+"sequencer and musical notation editor.</p><ul><li>If you have not already "
+"done so, you may wish to install some DSSI synth plugins, or a separate "
+"synth program such as QSynth. Rosegarden does not synthesize sounds from "
+"MIDI on its own, so without these you will hear nothing.</"
+"li><br><br><li>Rosegarden uses the JACK audio server for recording and "
+"playback of audio, and for playback from DSSI synth plugins. These features "
+"will only be available if the JACK server is running.</"
+"li><br><br><li>Rosegarden has comprehensive documentation: see the Help menu "
+"for the handbook, tutorials, and other information!</li></ul><p>Rosegarden "
+"was brought to you by a team of volunteers across the world. To learn more, "
+"go to <a href=\"http://www.rosegardenmusic.com/\">http://www.rosegardenmusic."
+"com/</a>.</p>"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIView.cpp:257
+msgid "No non-audio segments in composition"
+msgstr "Kompostsioonis pole mitte-audio segmente"
+
+#: ../src/gui/application/RosegardenGUIView.cpp:333
+msgid "Selection must contain only audio or non-audio segments"
+msgstr ""
+"Valik peab sisldama kas ainult audiosegmente või ainult mitte audiosegmente."
+
+#: ../src/gui/application/RosegardenGUIView.cpp:431
+#: ../src/gui/application/RosegardenGUIView.cpp:576
+#: ../src/gui/application/RosegardenGUIView.cpp:612
+#: ../src/gui/application/RosegardenGUIView.cpp:776
+msgid "No non-audio segments selected"
+msgstr "Ühtegi mitte-audio segmenti pole valitud"
+
+#: ../src/gui/application/RosegardenGUIView.cpp:851
+msgid ""
+"You've not yet defined an audio editor for Rosegarden to use.\n"
+"See Settings -> Configure Rosegarden -> Audio."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIView.cpp:1559
+#: ../src/gui/application/RosegardenGUIView.cpp:1564
+msgid "Can't add dropped file. "
+msgstr "Kukutatud faili pole võimalik lisada."
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1014
+#: ../src/gui/seqmanager/SequenceManager.cpp:1150
+msgid ""
+"The JACK Audio subsystem has failed or it has stopped Rosegarden from "
+"processing audio.\n"
+"Please restart Rosegarden to continue working with audio.\n"
+"Quitting other running applications may improve Rosegarden's performance."
+msgstr ""
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1020
+#: ../src/gui/seqmanager/SequenceManager.cpp:1156
+msgid ""
+"The JACK Audio subsystem has stopped Rosegarden from processing audio, "
+"probably because of a processing overload.\n"
+"An attempt to restart the audio service has been made, but some problems may "
+"remain.\n"
+"Quitting other running applications may improve Rosegarden's performance."
+msgstr ""
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1031
+msgid ""
+"Run out of processor power for real-time audio processing. Cannot continue."
+msgstr ""
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1057
+msgid ""
+"A serious error has occurred in the ALSA MIDI subsystem. It may not be "
+"possible to continue sequencing. Please check console output for more "
+"information."
+msgstr ""
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1078
+msgid "JACK Audio subsystem is losing sample frames."
+msgstr ""
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1096
+msgid ""
+"Failed to read audio data from disc in time to service the audio subsystem."
+msgstr ""
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1100
+msgid ""
+"Failed to write audio data to disc fast enough to service the audio "
+"subsystem."
+msgstr ""
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1104
+msgid "The audio mixing subsystem is failing to keep up."
+msgstr ""
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1108
+msgid "The audio subsystem is failing to keep up."
+msgstr ""
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1112
+msgid "Unknown sequencer failure mode!"
+msgstr ""
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1170
+msgid ""
+"<h3>System timer resolution is too low</h3><p>Rosegarden was unable to find "
+"a high-resolution timing source for MIDI performance.</p><p>This may mean "
+"you are using a Linux system with the kernel timer resolution set too low. "
+"Please contact your Linux distributor for more information.</p><p>Some Linux "
+"distributors already provide low latency kernels, see <a href=\"http://"
+"rosegarden.wiki.sourceforge.net/Low+latency+kernels\">http://rosegarden.wiki."
+"sourceforge.net/Low+latency+kernels</a> for instructions.</p>"
+msgstr ""
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1188
+msgid ""
+"<h3>System timer resolution is too low</h3><p>Rosegarden was unable to find "
+"a high-resolution timing source for MIDI performance.</p><p>You may be able "
+"to solve this problem by loading the RTC timer kernel module. To do this, "
+"try running <b>sudo modprobe snd-rtctimer</b> in a terminal window and then "
+"restarting Rosegarden.</p><p>Alternatively, check whether your Linux "
+"distributor provides a multimedia-optimized kernel. See <a href=\"http://"
+"rosegarden.wiki.sourceforge.net/Low+latency+kernels\">http://rosegarden.wiki."
+"sourceforge.net/Low+latency+kernels</a> for notes about this.</p>"
+msgstr ""
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1312
+msgid ""
+"<p>Both MIDI and Audio subsystems have failed to initialize.</p><p>You may "
+"continue without the sequencer, but we suggest closing Rosegarden, running "
+"\"alsaconf\" as root, and starting Rosegarden again. If you wish to run "
+"with no sequencer by design, then use \"rosegarden --nosequencer\" to avoid "
+"seeing this error in the future.</p>"
+msgstr ""
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1314
+msgid ""
+"<p>The MIDI subsystem has failed to initialize.</p><p>You may continue "
+"without the sequencer, but we suggest closing Rosegarden, running \"modprobe "
+"snd-seq-midi\" as root, and starting Rosegarden again. If you wish to run "
+"with no sequencer by design, then use \"rosegarden --nosequencer\" to avoid "
+"seeing this error in the future.</p>"
+msgstr ""
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1316
+msgid ""
+"<p>The Rosegarden sequencer module version does not match the GUI module "
+"version.</p><p>You have probably mixed up files from two different versions "
+"of Rosegarden. Please check your installation.</p>"
+msgstr ""
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1322
+#, fuzzy, c-format
+msgid "<h3>Sequencer startup failed</h3>%1"
+msgstr "Sekventseri staatus:"
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1330
+msgid ""
+"<h3>Failed to connect to JACK audio server.</h3><p>Rosegarden could not "
+"connect to the JACK audio server. This probably means the JACK server is "
+"not running.</p><p>If you want to be able to play or record audio files or "
+"use plugins, you should exit Rosegarden and start the JACK server before "
+"running Rosegarden again.</p>"
+msgstr ""
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1331
+msgid "Failed to connect to JACK"
+msgstr ""
+
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:46
+msgid "Modify MIDI filters..."
+msgstr "MIDI filtrite muutmine..."
+
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:58
+msgid "THRU events to ignore"
+msgstr "Ignoreeritavad THRU sündmused"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:131
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:60
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:96
+msgid "Note"
+msgstr "Noot"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:132
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:61
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:97
+msgid "Program Change"
+msgstr "Programmi muutus"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:136
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:62
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:98
+msgid "Key Pressure"
+msgstr "Klahvivajutus"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:137
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:63
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:99
+msgid "Channel Pressure"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:134
+#: ../src/gui/general/EditView.cpp:899
+#: ../src/gui/rulers/ControllerEventsRuler.cpp:198
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:64
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:100
+msgid "Pitch Bend"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:133
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:65
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:101
+msgid "Controller"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:135
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:66
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:102
+msgid "System Exclusive"
+msgstr ""
+
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:94
+msgid "RECORD events to ignore"
+msgstr "Ignoreeritavad RECORD sündmused"
+
+#: ../src/gui/widgets/TimeWidget.cpp:101
+msgid "Note:"
+msgstr "Noot:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:108 ../src/gui/widgets/TimeWidget.cpp:145
+msgid "<inexact>"
+msgstr ""
+
+#: ../src/gui/widgets/TimeWidget.cpp:151
+msgid "Units:"
+msgstr "Ühikud:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:173
+msgid "Time:"
+msgstr "Aeg:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:184
+msgid "units"
+msgstr "ühikut"
+
+#: ../src/gui/widgets/TimeWidget.cpp:193
+msgid "Measures:"
+msgstr "Taktid:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:193
+msgid "Measure:"
+msgstr "Takt:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:212
+msgid "beats:"
+msgstr "löögid:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:212
+msgid "beat:"
+msgstr "löök:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:230
+msgid "%1:"
+msgstr "%1:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:254
+msgid "Seconds:"
+msgstr "Sekundit:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:273
+msgid "msec:"
+msgstr "msek:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:407 ../src/gui/widgets/TimeWidget.cpp:531
+msgid "(%1/%2 time)"
+msgstr "(%1/%2 aeg)"
+
+#: ../src/gui/widgets/TimeWidget.cpp:452
+msgid "(starting %1.%2 qpm, %2.%3 bpm)"
+msgstr ""
+
+#: ../src/gui/widgets/TimeWidget.cpp:458
+msgid "(starting %1.%2 bpm)"
+msgstr ""
+
+#: ../src/gui/widgets/TimeWidget.cpp:464
+msgid "(%1.%2 qpm, %2.%3 bpm)"
+msgstr ""
+
+#: ../src/gui/widgets/TimeWidget.cpp:470
+#, fuzzy
+msgid "(%1.%2 bpm)"
+msgstr "%1.%2 s,"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:239
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:60
+msgid "C"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:241
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:61
+#, fuzzy
+msgid "D"
+msgstr "I"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:243
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:62
+msgid "E"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:244
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:63
+msgid "F"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:246
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:64
+msgid "G"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:248
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:65
+#, fuzzy
+msgid "A"
+msgstr "A4"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:250
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:66
+msgid "B"
+msgstr ""
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:70
+msgid "-2"
+msgstr ""
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:71
+msgid "-1"
+msgstr ""
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:72
+msgid "0"
+msgstr "0"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:73
+#, fuzzy
+msgid "1"
+msgstr "%1"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:74
+msgid "2"
+msgstr ""
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:75
+msgid "3"
+msgstr ""
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:76
+#, fuzzy
+msgid "4"
+msgstr "A4"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:77
+msgid "5"
+msgstr ""
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:78
+msgid "6"
+msgstr ""
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:79
+msgid "7"
+msgstr ""
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:83
+#, fuzzy
+msgid "double flat"
+msgstr "topelttäis"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:84
+#, fuzzy
+msgid "flat"
+msgstr "Bemoll"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:85
+#, fuzzy
+msgid "natural"
+msgstr "Üldine"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:86
+#, fuzzy
+msgid "sharp"
+msgstr "Diees"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:87
+#, fuzzy
+msgid "double sharp"
+msgstr "topelttäis"
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:234
+#, fuzzy, c-format
+msgid "In %1"
+msgstr "V&õta tagasi %1"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:587
+#: ../src/gui/widgets/AudioRouteMenu.cpp:236
+#: ../src/gui/widgets/AudioRouteMenu.cpp:259
+#, fuzzy
+msgid "Master"
+msgstr "Maatriks"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:528
+#: ../src/gui/widgets/AudioRouteMenu.cpp:238
+#: ../src/gui/widgets/AudioRouteMenu.cpp:261
+#, c-format
+msgid "Sub %1"
+msgstr ""
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:244
+#, fuzzy
+msgid "In %1 R"
+msgstr "[ %1 ]"
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:245
+#, fuzzy
+msgid "In %1 L"
+msgstr "[ %1 ]"
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:247
+msgid "Master R"
+msgstr ""
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:248
+msgid "Master L"
+msgstr ""
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:250
+msgid "Sub %1 R"
+msgstr ""
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:251
+msgid "Sub %1 L"
+msgstr ""
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:391
+#: ../src/gui/studio/AudioMixerWindow.cpp:522
+#: ../src/gui/widgets/AudioFaderBox.cpp:82
+msgid "Audio plugin button"
+msgstr ""
+
+#: ../src/gui/editors/parameters/AudioInstrumentParameterPanel.cpp:129
+#: ../src/gui/editors/parameters/AudioInstrumentParameterPanel.cpp:357
+#: ../src/gui/widgets/AudioFaderBox.cpp:91
+#, fuzzy
+msgid "<no synth>"
+msgstr "<sündmused puuduvad>"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:93
+#, fuzzy
+msgid "Synth plugin button"
+msgstr "Näita &annotatsioone"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:153
+msgid "Set the audio pan position in the stereo field"
+msgstr ""
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:155
+#, fuzzy
+msgid "Open synth plugin's native editor"
+msgstr "Ava maatri&ksredaktoris"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:157
+#, fuzzy
+msgid "Mono or Stereo Instrument"
+msgstr "Metronoomi instrument"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:159
+#, fuzzy
+msgid "Record level"
+msgstr "Salvestavad seadmed"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:161
+#, fuzzy
+msgid "Playback level"
+msgstr "Mahamängivad seadmed"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:345
+#: ../src/gui/studio/AudioMixerWindow.cpp:347
+#: ../src/gui/studio/AudioMixerWindow.cpp:503
+#: ../src/gui/studio/AudioMixerWindow.cpp:505
+#: ../src/gui/widgets/AudioFaderBox.cpp:163
+#, fuzzy
+msgid "Audio level"
+msgstr "Lisa audiofail"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:170
+#, fuzzy
+msgid "In:"
+msgstr "Taktis:"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:173
+msgid "Out:"
+msgstr ""
+
+#: ../src/gui/widgets/ProgressDialog.cpp:48
+#: ../src/gui/widgets/ProgressDialog.cpp:53
+#: ../src/gui/widgets/ProgressDialog.cpp:76
+msgid "Processing..."
+msgstr "Töötlemine..."
+
+#: ../src/gui/configuration/ColourConfigurationPage.h:60
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:130
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:346
+#: ../src/gui/widgets/ColourTable.cpp:52
+msgid "Color"
+msgstr "Värv"
+
+#: ../src/gui/widgets/ColourTable.cpp:68
+msgid "Modify Color Name"
+msgstr ""
+
+#: ../src/gui/configuration/ColourConfigurationPage.cpp:129
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:983
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:882
+#: ../src/gui/widgets/ColourTable.cpp:68
+msgid "Enter new name"
+msgstr "Sisesta uus nimi"
+
+#: ../src/gui/widgets/ColourTable.cpp:107
+msgid "Default Color"
+msgstr "Vaikevärv"
+
+#: ../src/gui/widgets/Rotary.cpp:108
+msgid ""
+"Click and drag up and down or left and right to modify.\n"
+"Double click to edit value directly."
+msgstr ""
+
+#: ../src/gui/widgets/Rotary.cpp:433
+#, fuzzy
+msgid "Select a new value"
+msgstr "Kustuta see omadus"
+
+#: ../src/gui/widgets/Rotary.cpp:434
+#, fuzzy
+msgid "Enter a new value"
+msgstr "Sisesta uus nimi"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:80
+msgid "Quantizer"
+msgstr "Kvantimine"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:86
+msgid "Quantizer type:"
+msgstr "Kvantimise tüüp:"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:88
+msgid "Grid quantizer"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:89
+#, fuzzy
+msgid "Legato quantizer"
+msgstr "Kvantimine"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:90
+msgid "Heuristic notation quantizer"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:94
+msgid "Quantize for notation only (leave performance unchanged)"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:104
+msgid "Notation parameters"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:109
+#: ../src/gui/widgets/QuantizeParameters.cpp:150
+msgid "Base grid unit:"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:114
+msgid "Complexity:"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:118
+msgid "Very high"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:119
+msgid "High"
+msgstr "Kõrge"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:224
+#: ../src/gui/widgets/QuantizeParameters.cpp:120
+msgid "Normal"
+msgstr "Normaalne"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:121
+msgid "Low"
+msgstr "Madal"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:122
+msgid "Very low"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:125
+msgid "Tuplet level:"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:129
+msgid "2-in-the-time-of-3"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:4241
+#: ../src/gui/widgets/QuantizeParameters.cpp:130
+msgid "Triplet"
+msgstr "Triool"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:138
+msgid "Any"
+msgstr "Suvaline"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:141
+msgid "Permit counterpoint"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:145
+msgid "Grid parameters"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:154
+msgid "Swing:"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:159
+msgid "Iterative amount:"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:165
+msgid "Quantize durations as well as start times"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:169
+msgid "After quantization"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:183
+msgid "Show advanced options"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:192
+msgid "Re-beam"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:194
+msgid "Add articulations (staccato, tenuto, slurs)"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:195
+msgid "Tie notes at barlines etc"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:196
+msgid "Split-and-tie overlapping chords"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:307
+#, fuzzy
+msgid "Full quantize"
+msgstr " Kvantimine: "
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:450
+msgid "Show Advanced Options"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:454
+msgid "Hide Advanced Options"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:257
+#: ../src/gui/configuration/MatrixConfigurationPage.h:56
+#: ../src/gui/configuration/MatrixConfigurationPage.h:57
+#: ../src/gui/editors/matrix/MatrixView.cpp:2709
+msgid "Matrix"
+msgstr "Maatriks"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:64
+msgid "Printable headers"
+msgstr ""
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:92
+#, fuzzy
+msgid "Dedication"
+msgstr "Suund"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:96
+#: ../src/gui/editors/segment/PlayListView.cpp:35
+#, fuzzy
+msgid "Title"
+msgstr "Triool"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:100
+#, fuzzy
+msgid "Subtitle"
+msgstr "<nimetu>"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:104
+#, fuzzy
+msgid "Subsubtitle"
+msgstr "<nimetu>"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:108
+#, fuzzy
+msgid "Poet"
+msgstr "paus"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:116
+#, fuzzy
+msgid "Composer"
+msgstr "Värv"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:120
+#, fuzzy
+msgid "Meter"
+msgstr "Maatriks"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:124
+#, fuzzy
+msgid "Arranger"
+msgstr "Triool"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:128
+#, fuzzy
+msgid "Piece"
+msgstr "Helikõrgus"
+
+#: ../data/fonts/mappings/fonts.cpp:26
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:132
+msgid "Opus"
+msgstr ""
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:136
+#, fuzzy
+msgid "Copyright"
+msgstr "Autoriõigus:"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:140
+#, fuzzy
+msgid "Tagline"
+msgstr "Triool"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:155
+#, fuzzy
+msgid "The composition comes here."
+msgstr "Kompositsiooni pikkuse muutmine"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:172
+msgid "Non-printable headers"
+msgstr ""
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:213
+msgid "Add New Property"
+msgstr ""
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:217
+msgid "Delete Property"
+msgstr ""
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:236
+msgid "{new property %1}"
+msgstr ""
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:236
+msgid "{new property}"
+msgstr ""
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:243
+msgid "{undefined}"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:87
+#, fuzzy
+msgid "Double-click opens segment in"
+msgstr "Vaikeredaktor (topeltklõpsu jaoks segmendil)"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:91
+#, fuzzy
+msgid "Notation editor"
+msgstr "Audiofaili mängimine"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:92
+#, fuzzy
+msgid "Matrix editor"
+msgstr "Ava maatri&ksredaktoris"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:93
+#, fuzzy
+msgid "Event List editor"
+msgstr "Ava sündmuste nim&ekirja redaktoris"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:99
+msgid "Number of count-in measures when recording"
+msgstr "Sissejuhatavate taktide arv salvestamisel"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:109
+#, fuzzy
+msgid "Auto-save interval"
+msgstr "Automaatse salvestamise intervall (sekundites)"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:112
+msgid "Every 30 seconds"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:113
+msgid "Every minute"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:114
+msgid "Every five minutes"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:115
+msgid "Every half an hour"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:116
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:277
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:157
+msgid "Never"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:140
+#, fuzzy
+msgid "Use JACK transport"
+msgstr "JACK transpordi režiim"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:173
+msgid "Unknown"
+msgstr "Tundmatu"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:179
+msgid "No MIDI, audio OK"
+msgstr "MIDI puudub, audio OK"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:182
+msgid "MIDI OK, no audio"
+msgstr "MIDI OK, audio puudub"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:185
+msgid "MIDI OK, audio OK"
+msgstr "MIDI OK, audio OK"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:188
+msgid "No driver"
+msgstr "Draiver puudub"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:195
+#, fuzzy
+msgid "Details..."
+msgstr "Kustuta rajad..."
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:204
+#, fuzzy
+msgid "Behavior"
+msgstr "Käitumine"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:219
+msgid "Side-bar parameter box layout"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:223
+msgid "Vertically stacked"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:225
+msgid "Tabbed"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:233
+msgid "Note name style"
+msgstr "Noodi nimede stiil"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:237
+msgid "Always use US names (e.g. quarter, 8th)"
+msgstr "Kasutatakse alati ameerika nimesid (so. quarter, 8th)"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:238
+#, fuzzy
+msgid "Localized (where available)"
+msgstr "Lokaliseeritud (kui võimalik)"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:252
+msgid "Show textured background on"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:254
+msgid "Main window"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:275
+msgid "Use bundled Klearlook theme"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:278
+msgid "When not running under KDE"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:279
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:159
+#, fuzzy
+msgid "Always"
+msgstr "Kõik failid"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:287
+msgid "Presentation"
+msgstr "Esitlus"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:423
+msgid ""
+"Changes to the textured background in the main window will not take effect "
+"until you restart Rosegarden."
+msgstr ""
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:168
+#: ../src/gui/configuration/GeneralConfigurationPage.h:78
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:207
+#: ../src/gui/configuration/MatrixConfigurationPage.cpp:59
+msgid "General"
+msgstr "Üldine"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.h:79
+msgid "General Configuration"
+msgstr "Üldised seadistused"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:92
+msgid "Base octave number for MIDI pitch display"
+msgstr ""
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:107
+msgid "Always use default studio when loading files"
+msgstr "Failide laadimisel kasutatakse alati vaikestuudiot"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:119
+msgid "Send all MIDI Controllers at start of each playback"
+msgstr ""
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:121
+msgid ""
+"Rosegarden can send all MIDI Controllers (Pan, Reverb etc) to all MIDI "
+"devices every\n"
+"time you hit play if you so wish. Please note that this option will usually "
+"incur a\n"
+"delay at the start of playback due to the amount of data being transmitted."
+msgstr ""
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:138
+#, fuzzy
+msgid "Sequencer timing source"
+msgstr "Sekventser lõpetas töö"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:163
+msgid "Load SoundFont to SoundBlaster card at startup"
+msgstr ""
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:164
+msgid ""
+"Check this box to enable soundfont loading on EMU10K-based cards when "
+"Rosegarden is launched"
+msgstr ""
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:173
+msgid "Path to 'asfxload' or 'sfxload' command"
+msgstr ""
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:180
+msgid "SoundFont"
+msgstr ""
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:223
+#, fuzzy
+msgid "MIDI Clock and System messages"
+msgstr "MIDI sünkro ja süsteemsete teadete saatmine"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:229
+#, fuzzy
+msgid "Send MIDI Clock, Start and Stop"
+msgstr "MIDI sünkro ja süsteemsete teadete saatmine"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:230
+msgid "Accept Start, Stop and Continue"
+msgstr ""
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:241
+#, fuzzy
+msgid "MIDI Machine Control mode"
+msgstr "A&udiosegmentide manageerimine"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:248
+#, fuzzy
+msgid "MMC Master"
+msgstr "Maatriks"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:249
+msgid "MMC Slave"
+msgstr ""
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:260
+msgid "MIDI Time Code mode"
+msgstr ""
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:267
+#, fuzzy
+msgid "MTC Master"
+msgstr "Maatriks"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:268
+msgid "MTC Slave"
+msgstr ""
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:281
+msgid "Automatically connect sync output to all devices in use"
+msgstr ""
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:292
+#, fuzzy
+msgid "MIDI Sync"
+msgstr "MIDI latents"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:308
+msgid "sfxload path"
+msgstr ""
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:315
+msgid "Soundfont path"
+msgstr ""
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:67
+msgid "%1 minutes %2.%3%4 seconds (%5 units, %6 measures)"
+msgstr ""
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:133
+msgid "Filename:"
+msgstr "Failinimi:"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:136
+msgid "Formal duration (to end marker):"
+msgstr ""
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:141
+#, fuzzy
+msgid "Playing duration:"
+msgstr "Audiofaili mängimine"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:146
+#, fuzzy
+msgid "Tracks:"
+msgstr "&Rajad"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:147
+msgid "%1 used, %2 total"
+msgstr ""
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:152
+msgid "Segments:"
+msgstr "Segmente:"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:153
+msgid "%1 MIDI, %2 audio, %3 total"
+msgstr ""
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:161
+msgid "Statistics"
+msgstr "Statistika"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:170
+#: ../src/gui/editors/parameters/InstrumentParameterBox.cpp:155
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:92
+#, fuzzy
+msgid "Track"
+msgstr "&Rajad"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:171
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:125
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:90
+msgid "Label"
+msgstr "Nimi"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:172
+#, fuzzy
+msgid "Time"
+msgstr "Aeg:"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:174
+#, fuzzy
+msgid "Events"
+msgstr "S&ündmus"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:175
+msgid "Polyphony"
+msgstr ""
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:176
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:126
+msgid "Repeat"
+msgstr "Kordus"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:178
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:128
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:305
+#: ../src/gui/general/EditView.cpp:1488
+msgid "Transpose"
+msgstr "Transponeerimine"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:179
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:129
+msgid "Delay"
+msgstr "Viivitus"
+
+#: ../src/gui/configuration/AudioConfigurationPage.h:61
+#: ../src/gui/configuration/AudioPropertiesPage.h:58
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:204
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:523
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:524
+msgid "Audio"
+msgstr "Audio"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:204
+#: ../src/gui/configuration/MIDIConfigurationPage.h:62
+#, fuzzy
+msgid "MIDI"
+msgstr "II"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:317
+#, fuzzy
+msgid "Segment Summary"
+msgstr "Segmendi parameetrid"
+
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:63
+msgid "Audio file path:"
+msgstr "Audiofailide asukoht:"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:137
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:68
+msgid "Choose..."
+msgstr "Vali..."
+
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:73
+msgid "Disk space remaining:"
+msgstr "Vaba kettaruumi:"
+
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:78
+msgid "Equivalent minutes of 16-bit stereo:"
+msgstr "16 bitist stereo audiot minutites:"
+
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:90
+msgid "Modify audio path"
+msgstr "Audiofailide otsingutee"
+
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:113
+msgid "%1 out of %2 (%3% used)"
+msgstr ""
+
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:144
+msgid "minutes at"
+msgstr ""
+
+#: ../src/gui/configuration/MIDIConfigurationPage.h:63
+#, fuzzy
+msgid "MIDI Settings"
+msgstr "Värviseadistused"
+
+#: ../src/gui/configuration/AudioConfigurationPage.h:62
+#: ../src/gui/configuration/AudioPropertiesPage.h:59
+msgid "Audio Settings"
+msgstr "Audio seadistused"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:87
+msgid "Default layout mode"
+msgstr "Vaikimisi paigutuse režiim"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:91
+msgid "Linear layout"
+msgstr "Lineaarne paigutus"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:92
+msgid "Continuous page layout"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:93
+msgid "Multiple page layout"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:101
+msgid "Default spacing"
+msgstr "Vaikesamm"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:125
+#, fuzzy
+msgid "Default duration factor"
+msgstr "Kestvus "
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:141
+msgid "Full"
+msgstr "Täis"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:152
+msgid "Show track headers (linear layout only)"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:158
+msgid "When needed"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:166
+msgid ""
+"\"Always\" and \"Never\" mean what they usually mean\n"
+"\"When needed\" means \"when staves are too many to all fit in the current "
+"window\""
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:178
+msgid "Show non-notation events as question marks"
+msgstr "Mitte-noodikirja sündmused küsimärkidena"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:188
+msgid "Show notation-quantized notes in a different color"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:198
+msgid "Show \"invisible\" events in grey"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:208
+msgid "Show notes outside suggested playable range in red"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:218
+msgid "Highlight superimposed notes with a halo effect"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:231
+msgid "When recording MIDI, split-and-tie long notes at barlines"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:242
+msgid "Layout"
+msgstr "Paigutus"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:255
+msgid "Default note style for new notes"
+msgstr "Uute nootide vaikestiil"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:287
+msgid "When inserting notes..."
+msgstr "Nootide lisamisel..."
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:294
+msgid "Split notes into ties to make durations match"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:295
+msgid "Ignore existing durations"
+msgstr "Ignoreeritakse olemasolevaid pikkuseid"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:305
+msgid "Auto-beam on insert when appropriate"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:317
+#: ../src/gui/editors/notation/NotationEraser.cpp:54
+msgid "Collapse rests after erase"
+msgstr "Pärast kustutamist tõmmatakse pausid kokku"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:328
+msgid "Default paste type"
+msgstr "Asetamise tüüp vaikimisi"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:350
+msgid "Editing"
+msgstr "Redigeerimine"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:362
+#, fuzzy
+msgid "Accidentals in one octave..."
+msgstr "Juhuslike märkide tööriistriba"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:364
+msgid "Affect only that octave"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:365
+#, fuzzy
+msgid "Require cautionaries in other octaves"
+msgstr "Teised tempo muudatused puuduvad."
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:366
+msgid "Affect all subsequent octaves"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:374
+#, fuzzy
+msgid "Accidentals in one bar..."
+msgstr "Juhuslike märkide tööriistriba"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:376
+msgid "Affect only that bar"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:377
+msgid "Require cautionary resets in following bar"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:378
+msgid "Require explicit resets in following bar"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:386
+msgid "Key signature cancellation style"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:388
+msgid "Cancel only when entering C major or A minor"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:389
+msgid "Cancel whenever removing sharps or flats"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:390
+msgid "Cancel always"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:400
+#, fuzzy
+msgid "Accidentals"
+msgstr "&Juhuslikud märgid"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:441
+msgid "Notation font"
+msgstr "Noodikirja font"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:467
+msgid "Origin:"
+msgstr "Algupära:"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:471
+msgid "Copyright:"
+msgstr "Autoriõigus:"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:475
+msgid "Mapped by:"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:479
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:81
+msgid "Type:"
+msgstr "Tüüp:"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:508
+msgid "Font size for single-staff views"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:516
+msgid "Font size for multi-staff views"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:524
+msgid "Font size for printing (pt)"
+msgstr "Fondi suurus trükkimisel (punktides)"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:541
+#, fuzzy
+msgid "Text font"
+msgstr "Tekst: "
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:549
+msgid "Sans-serif font"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:664
+#, fuzzy
+msgid "%1 (smooth)"
+msgstr "%1 (tükeldatud)"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:667
+msgid "%1 (jaggy)"
+msgstr ""
+
+#: ../src/gui/configuration/LatencyConfigurationPage.cpp:58
+msgid "JACK latency"
+msgstr "JACK latents"
+
+#: ../src/gui/configuration/LatencyConfigurationPage.cpp:61
+msgid ""
+"Use the \"Fetch JACK latencies\" button to discover the latency values set "
+"at\n"
+"the sequencer. It's recommended that you use the returned values but it's "
+"also\n"
+"possible to override them manually using the sliders. Note that if you "
+"change\n"
+"your JACK server parameters you should always fetch the latency values "
+"again.\n"
+"The latency values will be stored by Rosegarden for use next time."
+msgstr ""
+
+#: ../src/gui/configuration/LatencyConfigurationPage.cpp:65
+msgid "JACK playback latency (in ms)"
+msgstr "JACK'i mahamängimise latents (millisekundites)"
+
+#: ../src/gui/configuration/LatencyConfigurationPage.cpp:66
+msgid "JACK record latency (in ms)"
+msgstr "JACK'i salvestamise latents (millisekundites)"
+
+#: ../src/gui/configuration/LatencyConfigurationPage.cpp:68
+msgid "Fetch JACK latencies"
+msgstr ""
+
+#: ../src/gui/configuration/LatencyConfigurationPage.cpp:121
+msgid "JACK Latency"
+msgstr "JACK'i latents"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:92
+#, fuzzy
+msgid "Audio preview scale"
+msgstr "Lisa audiofail"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:96
+msgid "Linear - easier to see loud peaks"
+msgstr ""
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:97
+msgid "Meter scaling - easier to see quiet activity"
+msgstr ""
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:105
+#, fuzzy
+msgid "Record audio files as"
+msgstr "<audiofailid puuduvad>"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:107
+msgid "16-bit PCM WAV format (smaller files)"
+msgstr ""
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:108
+msgid "32-bit float WAV format (higher quality)"
+msgstr ""
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:117
+msgid "External audio editor"
+msgstr "Väline audiofailide redaktor"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:145
+msgid "Create JACK outputs"
+msgstr ""
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:150
+#, fuzzy
+msgid "for individual audio instruments"
+msgstr "<instrument puudub>"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:157
+#, fuzzy
+msgid "for submasters"
+msgstr "Näita &joonlaudu"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:184
+msgid ""
+"Rosegarden can start the JACK audio daemon (jackd) for you automatically if "
+"it isn't already running when Rosegarden starts.\n"
+"\n"
+"This is recommended for beginners and those who use Rosegarden as their main "
+"audio application, but it might not be to the liking of advanced users.\n"
+"\n"
+"If you want to start JACK automatically, make sure the command includes a "
+"full path where necessary as well as any command-line arguments you want to "
+"use.\n"
+"\n"
+"For example: /usr/local/bin/jackd -d alsa -d hw -r44100 -p 2048 -n 2\n"
+"\n"
+msgstr ""
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:196
+msgid "Start JACK when Rosegarden starts"
+msgstr "Rosegardeni käivitamisel käivitatakse JACK"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:201
+msgid "JACK command"
+msgstr ""
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:214
+#, fuzzy
+msgid "JACK Startup"
+msgstr "Käivitamine"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:224
+#, fuzzy
+msgid "External audio editor path"
+msgstr "Väline audiofailide redaktor"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:262
+msgid "External audio editor \"%1\" not found or not executable"
+msgstr ""
+
+#: ../src/gui/configuration/ColourConfigurationPage.cpp:70
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:448
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:863
+msgid "Add New Color"
+msgstr "Lisa uus värv"
+
+#: ../src/gui/configuration/ColourConfigurationPage.cpp:74
+msgid "Delete Color"
+msgstr "Kustuta värv"
+
+#: ../src/gui/configuration/ColourConfigurationPage.cpp:93
+msgid "Color Map"
+msgstr "Värvikaart"
+
+#: ../src/gui/configuration/ColourConfigurationPage.cpp:128
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:983
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:882
+msgid "New Color Name"
+msgstr "Uue värvi nimi"
+
+#: ../src/gui/configuration/ColourConfigurationPage.cpp:130
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:59
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:984
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:883
+#: ../src/gui/studio/DeviceManagerDialog.cpp:115
+#: ../src/gui/studio/DeviceManagerDialog.cpp:174
+msgid "New"
+msgstr "Uus"
+
+#: ../src/gui/configuration/LatencyConfigurationPage.h:62
+msgid "Latency"
+msgstr "Latents"
+
+#: ../src/gui/configuration/LatencyConfigurationPage.h:63
+msgid "Sequencer Latency"
+msgstr "Sekventseri latents"
+
+#: ../src/gui/configuration/ColourConfigurationPage.h:61
+msgid "Color Settings"
+msgstr "Värviseadistused"
+
+#: ../src/gui/studio/MidiDeviceListViewItem.cpp:55
+#: ../src/gui/studio/MidiKeyMapListViewItem.cpp:44
+msgid "Key Mapping"
+msgstr ""
+
+#: ../src/gui/studio/BankEditorDialog.cpp:97
+msgid "Manage MIDI Banks and Programs"
+msgstr ""
+
+#: ../src/gui/studio/BankEditorDialog.cpp:128
+msgid "MIDI Device"
+msgstr "MIDI seade"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:130
+#: ../src/gui/studio/BankEditorDialog.cpp:219
+msgid "MSB"
+msgstr ""
+
+#: ../src/gui/studio/BankEditorDialog.cpp:131
+#: ../src/gui/studio/BankEditorDialog.cpp:218
+msgid "LSB"
+msgstr ""
+
+#: ../src/gui/studio/BankEditorDialog.cpp:140
+#, fuzzy
+msgid "Add Bank"
+msgstr "Lisa rajad..."
+
+#: ../src/gui/studio/BankEditorDialog.cpp:141
+#, fuzzy
+msgid "Add Key Mapping"
+msgstr "Lisa helisti&ku muutus..."
+
+#: ../src/gui/studio/BankEditorDialog.cpp:153
+msgid "Add a Bank to the current device"
+msgstr ""
+
+#: ../src/gui/studio/BankEditorDialog.cpp:157
+msgid "Add a Percussion Key Mapping to the current device"
+msgstr ""
+
+#: ../src/gui/studio/BankEditorDialog.cpp:161
+msgid "Delete the current Bank or Key Mapping"
+msgstr ""
+
+#: ../src/gui/studio/BankEditorDialog.cpp:165
+msgid "Delete all Banks and Key Mappings from the current Device"
+msgstr ""
+
+#: ../src/gui/studio/BankEditorDialog.cpp:167
+#: ../src/gui/studio/DeviceManagerDialog.cpp:117
+#, fuzzy
+msgid "Import..."
+msgstr "&Impordi"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:168
+#: ../src/gui/studio/DeviceManagerDialog.cpp:118
+#, fuzzy
+msgid "Export..."
+msgstr "&Ekspordi"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:176
+msgid ""
+"Import Bank and Program data from a Rosegarden file to the current Device"
+msgstr ""
+
+#: ../src/gui/studio/BankEditorDialog.cpp:179
+msgid ""
+"Export all Device and Bank information to a Rosegarden format interchange "
+"file"
+msgstr ""
+
+#: ../src/gui/studio/BankEditorDialog.cpp:190
+msgid "Copy all Program names from current Bank to clipboard"
+msgstr ""
+
+#: ../src/gui/studio/BankEditorDialog.cpp:194
+msgid "Paste Program names from clipboard to current Bank"
+msgstr ""
+
+#: ../src/gui/studio/BankEditorDialog.cpp:216
+msgid "Show Variation list based on "
+msgstr ""
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1010
+msgid "<new bank>"
+msgstr ""
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1046
+msgid "<new mapping>"
+msgstr ""
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1048
+msgid "<new mapping %1>"
+msgstr ""
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1089
+msgid "Really delete this bank?"
+msgstr ""
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1137
+msgid "Really delete this key mapping?"
+msgstr ""
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1187
+msgid "Really delete all banks for "
+msgstr ""
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1476
+msgid "Import Banks from Device in File"
+msgstr ""
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1623
+#: ../src/gui/studio/DeviceManagerDialog.cpp:770
+msgid "Export Device as..."
+msgstr ""
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1694
+msgid ""
+"There are unsaved changes.\n"
+"Do you want to apply the changes before exiting the Bank Editor or discard "
+"the changes ?"
+msgstr ""
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1697
+msgid "Unsaved Changes"
+msgstr ""
+
+#: ../src/gui/studio/NameSetEditor.cpp:68
+msgid "Librarian"
+msgstr ""
+
+#: ../src/gui/studio/NameSetEditor.cpp:75
+msgid "Email"
+msgstr "E-posti aadress"
+
+#: ../src/gui/studio/NameSetEditor.cpp:80
+msgid ""
+"The librarian maintains the Rosegarden device data for this device.\n"
+"If you've made modifications to suit your own device, it might be worth\n"
+"liaising with the librarian in order to publish your information for the "
+"benefit\n"
+"of others."
+msgstr ""
+
+#: ../src/gui/studio/MidiBankListViewItem.cpp:51
+#: ../src/gui/studio/MidiDeviceListViewItem.cpp:48
+#, fuzzy
+msgid "Percussion Bank"
+msgstr "Löökriistad"
+
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:84
+#: ../src/gui/studio/MidiBankListViewItem.cpp:51
+#: ../src/gui/studio/MidiDeviceListViewItem.cpp:48
+msgid "Bank"
+msgstr "Pank"
+
+#: ../src/gui/studio/ChangeRecordDeviceCommand.h:39
+msgid "Change Record Device"
+msgstr "Muuda salvestavat seadet"
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:61
+#: ../src/gui/studio/DeviceManagerDialog.cpp:96
+msgid "Manage MIDI Devices"
+msgstr "MIDI seadmete haldamine"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:98
+msgid "Play devices"
+msgstr "Mahamängivad seadmed"
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:76
+#: ../src/gui/studio/DeviceManagerDialog.cpp:106
+#: ../src/gui/studio/DeviceManagerDialog.cpp:165
+msgid "Connection"
+msgstr "Ühendus"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:119
+msgid "Banks..."
+msgstr "Pangad..."
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:120
+#, fuzzy
+msgid "Control Events..."
+msgstr "Vali..."
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:126
+msgid "Create a new Play device"
+msgstr "Uue mahamängiva seadme loomine"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:129
+#: ../src/gui/studio/DeviceManagerDialog.cpp:184
+msgid "Delete the selected device"
+msgstr "Valitud seadme kustutamine"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:132
+msgid ""
+"Import Bank, Program and Controller data from a Rosegarden file to the "
+"selected device"
+msgstr ""
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:135
+msgid "Export Bank and Controller data to a Rosegarden interchange file"
+msgstr ""
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:138
+msgid "View and edit Banks and Programs for the selected device"
+msgstr ""
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:141
+msgid ""
+"View and edit Control Events for the selected device - these are special "
+"Event types that you can define against your device and control through "
+"Control Rulers or the Instrument Parameter Box "
+msgstr ""
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:156
+msgid "Record devices"
+msgstr "Salvestavad seadmed"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:164
+msgid "Current"
+msgstr "Aktiivne"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:181
+msgid "Create a new Record device"
+msgstr "Uue salvestava seadme loomine"
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:360
+#: ../src/gui/studio/DeviceEditorDialog.cpp:378
+#: ../src/gui/studio/DeviceManagerDialog.cpp:486
+#: ../src/gui/studio/DeviceManagerDialog.cpp:501
+msgid "New Device"
+msgstr "Uus seade"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:703
+msgid "Import from Device in File"
+msgstr "Import seadmest failis"
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:55
+msgid "Remap Instrument assigments..."
+msgstr ""
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:62
+msgid "Device or Instrument"
+msgstr "Seade või instrument"
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:65
+msgid "Remap Tracks by all Instruments on a Device or by single Instrument"
+msgstr ""
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:74
+msgid "Choose Source and Destination"
+msgstr ""
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:77
+msgid "From"
+msgstr "Kust"
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:78
+msgid "To"
+msgstr "Kuhu"
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:120
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:121
+msgid "<no devices>"
+msgstr "<seadmed puuduvad>"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:155
+#, fuzzy
+msgid "Show Audio &Faders"
+msgstr "Näita &joonlaudu"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:160
+#, fuzzy
+msgid "Show Synth &Faders"
+msgstr "Näita &joonlaudu"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:165
+#, fuzzy
+msgid "Show &Submasters"
+msgstr "Näita &joonlaudu"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:170
+#, fuzzy
+msgid "Show &Plugin Buttons"
+msgstr "Näita &annotatsioone"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:175
+msgid "Show &Unassigned Faders"
+msgstr ""
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:184
+#, c-format
+msgid ""
+"_n: 1 Input\n"
+"%n Inputs"
+msgstr ""
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:194
+msgid "No Submasters"
+msgstr ""
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:203
+#, fuzzy, c-format
+msgid ""
+"_n: 1 Submaster\n"
+"%n Submasters"
+msgstr "JACK audio sisendite arv"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:279
+#, fuzzy
+msgid "Audio Mixer"
+msgstr "Lisa audiofail"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:311
+#, fuzzy
+msgid "Record input source"
+msgstr "Salvestavad seadmed"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:322
+msgid "Output destination"
+msgstr ""
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:336
+#: ../src/gui/studio/AudioMixerWindow.cpp:495
+msgid "Pan"
+msgstr "Panoraam"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:355
+msgid "Mono or stereo"
+msgstr ""
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:364
+#: ../src/gui/studio/AudioMixerWindow.cpp:513
+msgid "Mute"
+msgstr ""
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:373 rc.cpp:408
+#, no-c-format
+msgid "Solo"
+msgstr "Soolo"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:382
+#, fuzzy
+msgid "Arm recording"
+msgstr "Salvestamine"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:400
+#, fuzzy, c-format
+msgid "Audio %1"
+msgstr "Audio"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:404
+#, fuzzy, c-format
+msgid "Synth %1"
+msgstr "V&õta tagasi %1"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:578
+#: ../src/gui/studio/AudioMixerWindow.cpp:580
+msgid "Audio master output level"
+msgstr ""
+
+#: ../src/gui/studio/SynthPluginManagerDialog.cpp:71
+msgid "Manage Synth Plugins"
+msgstr ""
+
+#: ../src/gui/studio/SynthPluginManagerDialog.cpp:78
+#, fuzzy
+msgid "Synth plugins"
+msgstr "Näita &annotatsioone"
+
+#: ../src/gui/studio/SynthPluginManagerDialog.cpp:145
+#, fuzzy
+msgid "Controls"
+msgstr "Vali..."
+
+#: ../src/gui/studio/SynthPluginManagerDialog.cpp:152
+#, fuzzy
+msgid "Editor >>"
+msgstr "Redigeerimine"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:66
+#: ../src/gui/studio/MidiProgramsEditor.cpp:169
+msgid "Bank and Program details"
+msgstr ""
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:67
+#, fuzzy
+msgid "Programs"
+msgstr "Programm"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2711
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:88
+#: ../src/gui/studio/MidiProgramsEditor.cpp:93
+msgid "Percussion"
+msgstr "Löökriistad"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:99
+msgid "MSB Value"
+msgstr ""
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:107
+msgid ""
+"Selects a MSB controller Bank number (MSB/LSB pairs are always unique for "
+"any Device)"
+msgstr ""
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:111
+msgid ""
+"Selects a LSB controller Bank number (MSB/LSB pairs are always unique for "
+"any Device)"
+msgstr ""
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:116
+msgid "LSB Value"
+msgstr ""
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:254
+#: ../src/gui/studio/MidiProgramsEditor.cpp:541
+#, fuzzy, c-format
+msgid "Key Mapping: %1"
+msgstr "Lisa helisti&ku muutus..."
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:476
+msgid "<no key mapping>"
+msgstr ""
+
+#: ../src/gui/studio/MidiKeyMappingEditor.cpp:57
+#: ../src/gui/studio/MidiKeyMappingEditor.cpp:81
+msgid "Key Mapping details"
+msgstr ""
+
+#: ../src/gui/studio/MidiKeyMappingEditor.cpp:58
+#, fuzzy
+msgid "Pitches"
+msgstr "Helikõrgus"
+
+#: ../src/gui/studio/MidiMixerWindow.cpp:152
+#, fuzzy
+msgid "MIDI Mixer"
+msgstr "MIDI seade"
+
+#: ../src/gui/studio/MidiMixerWindow.cpp:199
+#, fuzzy
+msgid "Volume"
+msgstr "Väärtus"
+
+#: ../src/gui/studio/AudioPluginOSCGUIManager.cpp:444
+#, fuzzy
+msgid "Rosegarden Plugin"
+msgstr "Rosegarden"
+
+#: ../src/gui/studio/AudioPluginOSCGUIManager.cpp:447
+#, fuzzy, c-format
+msgid "Rosegarden: %1"
+msgstr "Rosegarden"
+
+#: ../src/gui/studio/AudioPluginOSCGUIManager.cpp:449
+#, fuzzy
+msgid "Rosegarden: %1: %2"
+msgstr "Rosegarden"
+
+#: ../src/gui/studio/AudioPluginOSCGUIManager.cpp:450
+#, fuzzy, c-format
+msgid "Plugin slot %1"
+msgstr "Plugin"
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:92
+msgid "Add Play Device"
+msgstr "Lisa mahamängiv seade"
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:93
+msgid "Add Record Device"
+msgstr "Lisa salvestav seade"
+
+#: ../src/commands/studio/CreateOrDeleteDeviceCommand.h:68
+#: ../src/gui/studio/DeviceEditorDialog.cpp:94
+msgid "Delete Device"
+msgstr "Kustuta seade"
+
+#: ../src/gui/editors/segment/PlayList.cpp:77
+#: ../src/gui/studio/DeviceEditorDialog.cpp:156
+#: ../src/gui/studio/DeviceEditorDialog.cpp:361
+msgid "Play"
+msgstr "Mängi maha"
+
+#: ../src/commands/segment/SegmentRecordCommand.cpp:37
+#: ../src/gui/studio/DeviceEditorDialog.cpp:156
+#: ../src/gui/studio/DeviceEditorDialog.cpp:379 rc.cpp:394
+#, no-c-format
+msgid "Record"
+msgstr "Salvesta"
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:256
+msgid "Apply pending changes?"
+msgstr "Rakendada tehtud muudatused?"
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:359
+#: ../src/gui/studio/DeviceEditorDialog.cpp:377
+msgid "<new device>"
+msgstr "<uus seade>"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentEraser.cpp:82
+msgid "Click on a segment to delete it"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSplitter.cpp:166
+msgid ""
+"Click on a segment to split it in two; hold Shift to avoid snapping to beat "
+"grid"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSplitter.cpp:168
+msgid "Click on a segment to split it in two"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:81
+msgid "Click and drag to select segments"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentMover.cpp:154
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:238
+msgid "Move Segment"
+msgstr "Liiguta segmenti"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentMover.cpp:154
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:239
+msgid "Move Segments"
+msgstr "Liiguta segmente"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:217
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:169
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:141
+#: ../src/gui/editors/segment/segmentcanvas/SegmentMover.cpp:210
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:255
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:359
+msgid "Hold Shift to avoid snapping to beat grid"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:485
+msgid ""
+"Click and drag to select segments; middle-click and drag to draw an empty "
+"segment"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:384
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:502
+msgid ""
+"Click and drag to resize a segment; hold Ctrl as well to rescale its contents"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:386
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:504
+msgid "Click and drag to rescale segment"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:509
+msgid "Click and drag to move segments; hold Ctrl as well to copy them"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:511
+msgid "Click and drag to copy segments"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:515
+msgid ""
+"Click and drag to move segment; hold Ctrl as well to copy it; double-click "
+"to edit"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:517
+msgid "Click and drag to copy segment"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:157
+msgid ""
+"The audio file path does not exist or is not writable.\n"
+"You must set the audio file path to a valid directory in Document Properties "
+"before rescaling an audio file.\n"
+"Would you like to set it now?"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:261
+msgid ""
+"Hold Shift to avoid snapping to beat grid; hold Ctrl as well to rescale "
+"contents"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentMover.cpp:325
+msgid "Click and drag to move a segment"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentPencil.cpp:225
+msgid "Hold Shift to avoid snapping to bar lines"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentPencil.cpp:283
+#, fuzzy
+msgid "Record or drop audio here"
+msgstr "MIDI või audio salvestamine"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentPencil.cpp:289
+msgid ""
+"Click and drag to draw an empty segment. Control+Alt click and drag to draw "
+"in overlap mode."
+msgstr ""
+
+#: ../src/gui/editors/segment/TrackLabel.cpp:77
+msgid ""
+"Click and hold with left mouse button to assign this Track to an Instrument."
+msgstr ""
+
+#: ../src/gui/editors/segment/TrackLabel.cpp:191
+msgid "Change track name"
+msgstr ""
+
+#: ../src/gui/editors/segment/TrackLabel.cpp:192
+#, fuzzy
+msgid "Enter new track name"
+msgstr "Sisesta uus nimi"
+
+#: ../src/gui/editors/segment/TrackEditor.cpp:648
+msgid "Turn Repeating Segment into Real Copies"
+msgstr ""
+
+#: ../src/gui/editors/segment/TrackEditor.cpp:650
+msgid "Turn Repeating Segments into Real Copies"
+msgstr ""
+
+#: ../src/gui/editors/segment/TrackEditor.cpp:814
+msgid ""
+"You can't drop files into Rosegarden from this client. Try using Konqueror "
+"instead."
+msgstr ""
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:85
+#, fuzzy
+msgid "Manage Triggered Segments"
+msgstr "A&udiosegmentide manageerimine"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:89
+#, fuzzy
+msgid "ID"
+msgstr "I"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:735
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:93
+#, fuzzy
+msgid "Base velocity"
+msgstr "Noodi kiirus:"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:94
+#, fuzzy
+msgid "Triggers"
+msgstr "Triool"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:115
+msgid "Add a Triggered Segment"
+msgstr ""
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:119
+msgid "Delete a Triggered Segment"
+msgstr ""
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:123
+#, fuzzy
+msgid "Delete All Triggered Segments"
+msgstr "V&ali kõik segmendid"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:127
+msgid "Close the Triggered Segment Manager"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:169
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:245
+#, fuzzy
+msgid "<no label>"
+msgstr "<puudub>"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:248
+msgid ""
+"_n: %1 on 1 track\n"
+"%1 on %n tracks"
+msgstr ""
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:284
+msgid ""
+"This will remove all triggered segments from the whole composition. Are you "
+"sure?"
+msgstr ""
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:288
+#, fuzzy
+msgid "Remove all triggered segments"
+msgstr "Eemalda kõik märgised"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:313
+#, fuzzy
+msgid "Trigger Segment Duration"
+msgstr "Noodivar&te suund"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:336
+#, c-format
+msgid ""
+"_n: This triggered segment is used 1 time in the current composition. Are "
+"you sure you want to remove it?\n"
+"This triggered segment is used %n times in the current composition. Are you "
+"sure you want to remove it?"
+msgstr ""
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:400
+msgid "Pa&ste as New Triggered Segment"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1169
+#: ../src/gui/editors/segment/MarkerEditor.cpp:399
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:412
+#: ../src/gui/editors/tempo/TempoView.cpp:622
+msgid "&Musical Times"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1179
+#: ../src/gui/editors/segment/MarkerEditor.cpp:409
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:422
+#: ../src/gui/editors/tempo/TempoView.cpp:632
+#, fuzzy
+msgid "&Real Times"
+msgstr "Reaalajas:"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1189
+#: ../src/gui/editors/segment/MarkerEditor.cpp:419
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:432
+#: ../src/gui/editors/tempo/TempoView.cpp:642
+#, fuzzy
+msgid "Ra&w Times"
+msgstr "Reaalajas:"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:83
+msgid "Manage Markers"
+msgstr "Märgiste haldamine"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:86
+msgid "Marker time "
+msgstr "Märgise aeg "
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:87
+#, fuzzy
+msgid "Marker text "
+msgstr "Märgise aeg "
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:88
+msgid "Marker description "
+msgstr "Märgise kirjeldus "
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:95
+msgid "Pointer position"
+msgstr "Kursori asukoht"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:100
+msgid "Real time:"
+msgstr "Reaalajas:"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:103
+msgid "In measure:"
+msgstr "Taktis:"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:121
+msgid "Add a Marker"
+msgstr "Lisa märgis"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:125
+msgid "Delete a Marker"
+msgstr "Kustuta märgis"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:129
+msgid "Delete All Markers"
+msgstr "Kustuta kõik märgised"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:133
+msgid "Close the Marker Editor"
+msgstr "Sulge märgiste haldur"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:296
+msgid "Remove all markers"
+msgstr "Eemalda kõik märgised"
+
+#: ../src/gui/editors/segment/PlayList.cpp:76
+#, fuzzy
+msgid "Add..."
+msgstr "..."
+
+#: ../src/gui/editors/segment/PlayList.cpp:78
+#, fuzzy
+msgid "Move Up"
+msgstr "Liig&uta rada üles"
+
+#: ../src/gui/editors/segment/PlayList.cpp:79
+#, fuzzy
+msgid "Move Down"
+msgstr "Liiguta ra&da alla"
+
+#: ../src/gui/editors/segment/PlayList.cpp:124
+#, fuzzy
+msgid "Select one or more Rosegarden files"
+msgstr "Audiofaili valimine"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:73
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:55
+msgid "<not showing>"
+msgstr ""
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:89
+#, fuzzy
+msgid "Manage Control Events"
+msgstr "A&udiosegmentide manageerimine"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:91
+msgid "<no device>"
+msgstr "<seadmed puuduvad>"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:99
+msgid " Control Events for %1 (device %2)"
+msgstr ""
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:104
+msgid "Control Event name "
+msgstr ""
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:105
+#, fuzzy
+msgid "Control Event type "
+msgstr "Sündmuse tüüp. "
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:106
+msgid "Control Event value "
+msgstr ""
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:107
+msgid "Description "
+msgstr ""
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:108
+msgid "Min "
+msgstr ""
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:109
+msgid "Max "
+msgstr ""
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:110
+msgid "Default "
+msgstr ""
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:111
+msgid "Color "
+msgstr ""
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:112
+msgid "Position on instrument panel"
+msgstr "Asukoht instrumentide paneelil"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:136
+msgid "Add a Control Parameter to the Studio"
+msgstr ""
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:140
+msgid "Delete a Control Parameter from the Studio"
+msgstr ""
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:144
+msgid "Close the Control Parameter editor"
+msgstr ""
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:221
+msgid "<default>"
+msgstr "<vaikeväärtus>"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:62
+msgid "Edit Control Parameter"
+msgstr ""
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:71
+#, fuzzy
+msgid "Control Event Properties"
+msgstr "Sündmuse omadused"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:77
+msgid "Name:"
+msgstr "Nimi:"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:93
+msgid "Control Event value:"
+msgstr ""
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:97
+msgid "Minimum value:"
+msgstr "Minimaalne väärtus:"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:101
+msgid "Maximum value:"
+msgstr "Maksimaalne väärtus:"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:105
+msgid "Default value:"
+msgstr "Vaikeväärtus:"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:109
+msgid "Color:"
+msgstr "Värv:"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:113
+msgid "Instrument Parameter Box position:"
+msgstr "Instrumendi parameetrite kasti asukoht:"
+
+#: ../src/gui/editors/segment/TrackButtons.cpp:209
+#: ../src/gui/editors/segment/TrackButtons.cpp:585
+#: ../src/gui/editors/segment/TrackButtons.cpp:935
+#: ../src/gui/editors/segment/TrackButtons.cpp:1127
+msgid "<no instrument>"
+msgstr "<instrument puudub>"
+
+#: ../src/gui/editors/segment/TrackButtons.cpp:352
+#: ../src/gui/editors/segment/TrackButtons.cpp:1094
+msgid "<untitled audio>"
+msgstr "<nimetu audio>"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:130
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:662
+#: ../src/gui/editors/segment/TrackButtons.cpp:354
+#: ../src/gui/editors/segment/TrackButtons.cpp:1096
+msgid "<untitled>"
+msgstr "<nimetu>"
+
+#: ../src/gui/editors/segment/TrackButtons.cpp:1058
+#, fuzzy
+msgid "Mute track"
+msgstr "&Kustuta rada"
+
+#: ../src/gui/editors/segment/TrackButtons.cpp:1063
+msgid "Record on this track"
+msgstr ""
+
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:88
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:1015
+#, fuzzy
+msgid "Segment"
+msgstr "Seg&mendid"
+
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:89
+#, fuzzy
+msgid "Segment Parameters"
+msgstr "Instrumendi parameetrid"
+
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:366
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:697
+msgid "%1 ms"
+msgstr "%1 ms"
+
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:1031
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:910
+msgid "Highest playable note"
+msgstr ""
+
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:1051
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:930
+msgid "Lowest playable note"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:93
+#, fuzzy
+msgid "Track Parameters"
+msgstr "Segmendi parameetrid"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:137
+#, fuzzy
+msgid "Playback parameters"
+msgstr "Mahamängivad seadmed"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:172
+#, fuzzy
+msgid "Recording filters"
+msgstr "Salvestavad seadmed"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:191
+msgid "Channel"
+msgstr "Kanal"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:203
+#, fuzzy
+msgid "Staff export options"
+msgstr "Lilypond'i ekpordi seadistused"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:220
+#, fuzzy
+msgid "Notation size:"
+msgstr "Noodikirja font"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:225
+#, fuzzy
+msgid "Small"
+msgstr "E-posti aadress"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:226
+msgid "Tiny"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:233
+#, fuzzy
+msgid "Bracket type:"
+msgstr "Teksti tüüp:"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:237
+msgid "-----"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:238
+msgid "[----"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:239
+msgid "----]"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:240
+msgid "[---]"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:241
+msgid "{----"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:242
+msgid "----}"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:243
+msgid "{[---"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:244
+msgid "---]}"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:253
+#, fuzzy
+msgid "Create segments with"
+msgstr "Loo segment"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:264
+#, fuzzy
+msgid "Preset"
+msgstr "paus"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:272
+msgid "Load"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:282
+#, fuzzy
+msgid "treble"
+msgstr "Viiulivõti"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:283
+#, fuzzy
+msgid "bass"
+msgstr "Bassivõti"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:284
+#, fuzzy
+msgid "crotales"
+msgstr "Oktav &alla"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:285
+msgid "xylophone"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:286
+msgid "guitar"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:287
+msgid "contrabass"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:288
+#, fuzzy
+msgid "celesta"
+msgstr "&Kustuta"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:289
+msgid "old celesta"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:290
+msgid "french"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:291
+msgid "soprano"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:292
+#, fuzzy
+msgid "mezzosoprano"
+msgstr "S&forzando"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:293
+#, fuzzy
+msgid "alto"
+msgstr "Aldivõti"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:294
+#, fuzzy
+msgid "tenor"
+msgstr "Tenorivõti"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:295
+#, fuzzy
+msgid "baritone"
+msgstr "Variatsioon"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:296
+#, fuzzy
+msgid "varbaritone"
+msgstr "Variatsioon"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:297
+#, fuzzy
+msgid "subbass"
+msgstr "Bassivõti"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:327
+#, fuzzy
+msgid "Lowest"
+msgstr "Madal"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:329
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:336
+msgid "---"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:331
+msgid "Choose the lowest suggested playable note, using a staff"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:334
+#, fuzzy
+msgid "Highest"
+msgstr "Kõrge"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:338
+msgid "Choose the highest suggested playable note, using a staff"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:666
+msgid "[ Track %1 - %2 ]"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:985
+msgid "The instrument preset database is corrupt. Check your installation."
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:173
+#: ../src/gui/editors/parameters/InstrumentParameterBox.cpp:54
+msgid "Instrument Parameters"
+msgstr "Instrumendi parameetrid"
+
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:85
+msgid "Variation"
+msgstr "Variatsioon"
+
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:86
+msgid "Program"
+msgstr "Programm"
+
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:87
+#, fuzzy
+msgid "Channel out"
+msgstr "Kanal"
+
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:215
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:221
+msgid "[ %1 ]"
+msgstr "[ %1 ]"
+
+#: ../src/gui/editors/matrix/MatrixEraser.cpp:58
+#: ../src/gui/editors/matrix/MatrixMover.cpp:71
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:67
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:77
+msgid "Switch to Draw Tool"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:75
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:69
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:71
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:81
+#: ../src/gui/editors/notation/ClefInserter.cpp:57
+#: ../src/gui/editors/notation/GuitarChordInserter.cpp:63
+#: ../src/gui/editors/notation/NotationSelector.cpp:87
+#: ../src/gui/editors/notation/NoteInserter.cpp:113
+#: ../src/gui/editors/notation/RestInserter.cpp:72
+#: ../src/gui/editors/notation/TextInserter.cpp:61
+msgid "Switch to Erase Tool"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixEraser.cpp:62
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:73
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:75
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:85
+msgid "Switch to Move Tool"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixEraser.cpp:68
+#: ../src/gui/editors/matrix/MatrixMover.cpp:81
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:79
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:93
+#, fuzzy
+msgid "Switch to Resize Tool"
+msgstr "Näita &pauside tööriistariba"
+
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:446
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:579
+msgid "Click and drag to select; middle-click and drag to draw new note"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:324
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:597
+msgid "Click and drag to resize selected notes"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:599
+msgid "Click and drag to resize note"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:471
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:604
+msgid "Click and drag to move selected notes; hold Ctrl as well to copy"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:473
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:606
+msgid "Click and drag to copy selected notes"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:610
+msgid "Click and drag to move note; hold Ctrl as well to copy"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:612
+msgid "Click and drag to copy note"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixEraser.cpp:54
+#: ../src/gui/editors/matrix/MatrixMover.cpp:67
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:65
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:63
+#: ../src/gui/editors/notation/ClefInserter.cpp:53
+#: ../src/gui/editors/notation/GuitarChordInserter.cpp:59
+#: ../src/gui/editors/notation/NotationEraser.cpp:67
+#: ../src/gui/editors/notation/NoteInserter.cpp:109
+#: ../src/gui/editors/notation/RestInserter.cpp:68
+#: ../src/gui/editors/notation/TextInserter.cpp:57
+msgid "Switch to Select Tool"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:218
+msgid "Resize Event"
+msgstr "Muuda sündmuse suurust"
+
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:221
+msgid "Resize Events"
+msgstr "Muuda sündmuste suurust"
+
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:326
+msgid "Click and drag to resize a note"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:328
+#, fuzzy
+msgid "Copy and Move Event"
+msgstr "Liiguta sündmust"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:330
+#, fuzzy
+msgid "Copy and Move Events"
+msgstr "Liiguta sündmuseid"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:334
+msgid "Move Event"
+msgstr "Liiguta sündmust"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:336
+msgid "Move Events"
+msgstr "Liiguta sündmuseid"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:465
+msgid "Click and drag to move a note; hold Ctrl as well to copy it"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:467
+msgid "Click and drag to copy a note"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:361
+msgid "Click and drag to draw a note; Shift to avoid snapping to grid"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:363
+msgid "Click and drag to draw a note"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:437
+#: ../src/gui/editors/matrix/MatrixView.cpp:3053
+msgid "Couldn't apply piano roll layout"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:663
+msgid "Resi&ze"
+msgstr "Muuda &suurust"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:669
+#: ../src/gui/editors/notation/NotationView.cpp:1919
+msgid "C&hord Insert Mode"
+msgstr "A&kordi lisamise režiim"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:676
+#: ../src/gui/editors/notation/NotationView.cpp:1778
+msgid "Ste&p Recording"
+msgstr "&Sammhaaval salvestamine"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:694
+#, fuzzy
+msgid "&Legato"
+msgstr "Legal"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:708
+#, fuzzy
+msgid "Set to Current Velocity"
+msgstr "Noodi kiirus:"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:712
+msgid "Set Event &Velocities..."
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:716
+#, fuzzy
+msgid "Trigger Se&gment..."
+msgstr "Kustuta segment"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:720
+#, fuzzy
+msgid "Remove Triggers..."
+msgstr "Eemalda &tempo muutus..."
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1153
+#: ../src/gui/editors/matrix/MatrixView.cpp:724
+#: ../src/gui/editors/tempo/TempoView.cpp:606
+msgid "Select &All"
+msgstr "Vali &kõik"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:732
+#: ../src/gui/editors/notation/NotationView.cpp:2325
+msgid "Cursor &Back"
+msgstr "Kursor &tagasi"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:736
+#: ../src/gui/editors/notation/NotationView.cpp:2329
+msgid "Cursor &Forward"
+msgstr "Kursor &edasi"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:740
+#: ../src/gui/editors/notation/NotationView.cpp:2333
+msgid "Cursor Ba&ck Bar"
+msgstr "Kursor takti &võrra tagasi"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:744
+#: ../src/gui/editors/notation/NotationView.cpp:2337
+msgid "Cursor For&ward Bar"
+msgstr "Kursor takti v&õrra edasi"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:748
+#: ../src/gui/editors/notation/NotationView.cpp:2341
+msgid "Cursor Back and Se&lect"
+msgstr "Kursor tagasi ja va&limine"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:752
+#: ../src/gui/editors/notation/NotationView.cpp:2345
+msgid "Cursor Forward and &Select"
+msgstr "Kursor eda&si ja valimine"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:756
+#: ../src/gui/editors/notation/NotationView.cpp:2349
+msgid "Cursor Back Bar and Select"
+msgstr "Kursor takti võrra tagasi ja valimine"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:760
+#: ../src/gui/editors/notation/NotationView.cpp:2353
+msgid "Cursor Forward Bar and Select"
+msgstr "Kursor takti võrra edasi ja valimine"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:764
+#: ../src/gui/editors/notation/NotationView.cpp:2363
+msgid "Cursor to St&art"
+msgstr "Kursor &algusesse"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:770
+#: ../src/gui/editors/notation/NotationView.cpp:2369
+msgid "Cursor to &End"
+msgstr "Kursor &lõppu"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:776
+#: ../src/gui/editors/notation/NotationView.cpp:2391
+msgid "Cursor to &Playback Pointer"
+msgstr "Kursor &mahamängimise kursori juurde"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:820
+#: ../src/gui/editors/notation/NotationView.cpp:2435
+msgid "Playback Pointer to &Cursor"
+msgstr "Mahamängimise kursor &kursori juurde"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:826
+#: ../src/gui/editors/notation/NotationView.cpp:2441
+msgid "&Solo"
+msgstr "&Soolo"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:841
+#: ../src/gui/editors/notation/NotationView.cpp:2456
+msgid "Set Loop to Selection"
+msgstr "Korduse seadmine valikule"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:845
+#: ../src/gui/editors/notation/NotationView.cpp:2460
+msgid "Clear L&oop"
+msgstr "Kustuta k&ordus"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1157
+#: ../src/gui/editors/matrix/MatrixView.cpp:849
+#: ../src/gui/editors/notation/NotationView.cpp:2464
+#: ../src/gui/editors/tempo/TempoView.cpp:610
+msgid "Clear Selection"
+msgstr "Puhasta valik"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1149
+#: ../src/gui/editors/matrix/MatrixView.cpp:854
+#: ../src/gui/editors/notation/NotationView.cpp:2471
+msgid "&Filter Selection"
+msgstr "&Filtri valimine"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:879
+msgid "&No Snap"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:884
+msgid "Snap to Bea&t"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:888
+msgid "Snap to &Bar"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:908
+#, fuzzy, c-format
+msgid "Snap to %1"
+msgstr "V&õta tagasi %1"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:917
+#, fuzzy
+msgid "Show Instrument Parameters"
+msgstr "Näita &instrumentide parameetreid"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:922
+#: ../src/gui/editors/notation/NotationView.cpp:1850
+msgid "Show Ch&ord Name Ruler"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:926
+#: ../src/gui/editors/notation/NotationView.cpp:1858
+msgid "Show &Tempo Ruler"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1238
+#: ../src/gui/editors/notation/NotationView.cpp:3245
+#, c-format
+msgid ""
+"_n: 1 event selected \n"
+" %n events selected "
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1241
+#: ../src/gui/editors/notation/NotationView.cpp:3247
+msgid " No selection "
+msgstr " Valik puudub "
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1348
+#: ../src/gui/editors/matrix/MatrixView.cpp:1360
+#: ../src/gui/editors/matrix/MatrixView.cpp:2079
+#: ../src/gui/editors/notation/NotationView.cpp:5869
+msgid "Quantizing..."
+msgstr "Kvantimine..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1370
+#: ../src/gui/editors/notation/NotationView.cpp:5407
+msgid "Collapsing notes..."
+msgstr "Nootide kokkutõmbamine..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1381
+#, fuzzy
+msgid "Making legato..."
+msgstr "Akordi loomine..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1476
+#, fuzzy
+msgid "Note: %1 (%2.%3s)"
+msgstr "Aeg: %1 (%2.%3s)"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1531
+#: ../src/gui/editors/notation/NotationView.cpp:7206
+msgid "Time: %1 (%2.%3s)"
+msgstr "Aeg: %1 (%2.%3s)"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1604
+#: ../src/gui/editors/notation/NotationView.cpp:4744
+#: ../src/gui/editors/notation/NotationView.cpp:4773
+msgid "Cutting selection to clipboard..."
+msgstr "Valiku lõikamine lõikepuhvrisse..."
+
+#: ../src/gui/editors/eventlist/EventView.cpp:912
+#: ../src/gui/editors/matrix/MatrixView.cpp:1636
+#: ../src/gui/editors/notation/NotationSelectionPaster.cpp:82
+msgid "Couldn't paste at this point"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1647
+#: ../src/gui/editors/notation/NotationView.cpp:4754
+msgid "Deleting selection..."
+msgstr "Valiku kustutamine..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1833
+#: ../src/gui/editors/notation/NotationView.cpp:5617
+#, c-format
+msgid "Unknown note insert action %1"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1837
+#: ../src/gui/editors/matrix/MatrixView.cpp:2857
+#: ../src/gui/editors/notation/NotationView.cpp:5621
+msgid "Inserting note"
+msgstr "Noodi lisamine"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2091
+msgid "Unquantizing..."
+msgstr "Kvantimise eemaldamine..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2120
+msgid " Grid: "
+msgstr " Võre: "
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2134
+msgid "Unit"
+msgstr " Üksus"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2136
+msgid "Beat"
+msgstr "Löök"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2138
+msgid "Bar"
+msgstr "Takt"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2159
+#, fuzzy
+msgid " Velocity: "
+msgstr "Kiirus:"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2170
+msgid " Quantize: "
+msgstr " Kvantimine: "
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2584
+msgid "Raising velocities..."
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2596
+msgid "Lowering velocities..."
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2611
+msgid "Set Event Velocities"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2616
+msgid "Setting Velocities..."
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2665
+#, fuzzy
+msgid "Remove Triggers"
+msgstr "&Eemalda märgis"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2723
+msgid "%1 - Segment Track #%2 - %3"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2730
+#, fuzzy
+msgid "%1 - All Segments - %2"
+msgstr "Kestvus"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2737
+#, fuzzy
+msgid ""
+"_n: %1 - 1 Segment - %2\n"
+"%1 - %n Segments - %2"
+msgstr "Kestvus"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2885
+#, fuzzy
+msgid "Can't insert note: No grid duration selected"
+msgstr "Nooti pole võimalik lisada: noodi pikkust pole valitud"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2935
+#, fuzzy
+msgid " Chord "
+msgstr "Tekita a&kord"
+
+#: ../src/gui/editors/matrix/MatrixEraser.cpp:105
+msgid "Click on a note to delete it"
+msgstr ""
+
+#: ../src/gui/editors/tempo/TempoView.cpp:89
+#, fuzzy
+msgid "Filter"
+msgstr "Sündmuste filter"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:245
+#: ../src/gui/editors/tempo/TempoView.cpp:117
+msgid "Time "
+msgstr "Aeg "
+
+#: ../src/gui/editors/tempo/TempoView.cpp:118
+#, fuzzy
+msgid "Type "
+msgstr "Tüüp"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:119
+#, fuzzy
+msgid "Value "
+msgstr "Väärtus"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:120
+#, fuzzy
+msgid "Properties "
+msgstr "Sündmuse omadused"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:208
+msgid "Common, hidden"
+msgstr ""
+
+#: ../src/gui/editors/tempo/TempoView.cpp:210
+msgid "Hidden"
+msgstr ""
+
+#: ../src/gui/editors/tempo/TempoView.cpp:213
+msgid "Common"
+msgstr ""
+
+#: ../src/gui/editors/tempo/TempoView.cpp:220
+#, fuzzy
+msgid "Time Signature "
+msgstr "Taktimõõt"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:245
+#, fuzzy
+msgid "%1.%2%3"
+msgstr "&%1%2"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:255
+msgid "%1.%2%3 qpm (%4.%5%6 bpm) "
+msgstr ""
+
+#: ../src/gui/editors/tempo/TempoView.cpp:264
+#, fuzzy
+msgid "Tempo "
+msgstr "Tempo"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:271
+#, fuzzy
+msgid "<nothing at this filter level>"
+msgstr "<sellel filtri tasemel puuduvad sündmused>"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:463
+#, fuzzy
+msgid "Delete Tempo or Time Signature"
+msgstr "Taktimõõt"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:602
+#, fuzzy
+msgid "&Edit Item"
+msgstr "R&edigeeri sündmust"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:834
+msgid "%1 - Tempo and Time Signature Editor"
+msgstr ""
+
+#: ../src/gui/editors/guitar/GuitarChordEditorDialog.cpp:43
+msgid "Guitar Chord Editor"
+msgstr ""
+
+#: ../src/gui/editors/guitar/GuitarChordEditorDialog.cpp:51
+#, fuzzy
+msgid "Start fret"
+msgstr "Alguse takt"
+
+#: ../src/gui/editors/guitar/GuitarChordEditorDialog.cpp:58
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:51
+msgid "Root"
+msgstr ""
+
+#: ../src/gui/editors/guitar/GuitarChordEditorDialog.cpp:62
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:55
+#, fuzzy
+msgid "Extension"
+msgstr "Löökriistad"
+
+#: ../src/gui/editors/guitar/Fingering.cpp:118
+msgid "couldn't parse fingering '%1' in '%2'"
+msgstr ""
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:45
+#, fuzzy
+msgid "Guitar Chord Selector"
+msgstr "Puhasta valik"
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:64
+msgid "beginner"
+msgstr ""
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:65
+msgid "common"
+msgstr ""
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:66
+msgid "all"
+msgstr ""
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:86
+#, fuzzy
+msgid "Fingerings"
+msgstr "Decrescendo lisamine..."
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:419
+#, fuzzy
+msgid "couldn't open file '%1'"
+msgstr "Faili '%1' pole võimalik avada."
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:428
+#, c-format
+msgid "couldn't parse chord dictionnary : %1"
+msgstr ""
+
+#: ../src/gui/editors/notation/NoteFontViewer.cpp:87
+#, c-format
+msgid "Note Font Viewer: %1"
+msgstr ""
+
+#: ../src/gui/editors/notation/NoteFontViewer.cpp:93
+msgid " Component: "
+msgstr " Komponent: "
+
+#: ../src/gui/editors/notation/NoteFontViewer.cpp:101
+msgid " View: "
+msgstr " Vaade: "
+
+#: ../src/gui/editors/notation/NoteFontViewer.cpp:104
+msgid "Glyphs"
+msgstr ""
+
+#: ../src/gui/editors/notation/NoteFontViewer.cpp:105
+#, fuzzy
+msgid "Codes"
+msgstr "Noodivõti"
+
+#: ../src/gui/editors/notation/NoteFontViewer.cpp:107
+msgid " Page: "
+msgstr " Lehekülg: "
+
+#: ../src/gui/editors/notation/ClefInserter.cpp:64
+#: ../src/gui/editors/notation/GuitarChordInserter.cpp:71
+#: ../src/gui/editors/notation/RestInserter.cpp:79
+#: ../src/gui/editors/notation/TextInserter.cpp:68
+msgid "Switch to Inserting Notes"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:522
+msgid "Close track headers"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:917
+msgid "Preparing to print..."
+msgstr "Ettevalmistus trükkimiseks..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:1516
+msgid "Note &Font"
+msgstr "Noodikirja &font"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1539
+msgid "Si&ze"
+msgstr "Suu&rus"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1545
+#, fuzzy
+msgid "Show Track Headers"
+msgstr "Näita radade &nimesid"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1550
+msgid "S&pacing"
+msgstr "Sa&mm"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1572
+#, fuzzy
+msgid "Du&ration Factor"
+msgstr "Kestvus "
+
+#: ../src/gui/editors/notation/NotationView.cpp:1598
+msgid "Note &Style"
+msgstr "Nootikirja &stiil"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1624
+msgid "Insert Rest"
+msgstr "Lisa paus"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1628
+msgid "Switch from Note to Rest"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1633
+msgid "Switch from Rest to Note"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1690
+msgid "No accidental"
+msgstr "Juhuslikud märgid puuduvad"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1691
+#, fuzzy
+msgid "Follow previous accidental"
+msgstr "Juhuslikud märgid puuduvad"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1692
+msgid "Sharp"
+msgstr "Diees"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1693
+msgid "Flat"
+msgstr "Bemoll"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1694
+msgid "Natural"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1695
+msgid "Double sharp"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1696
+msgid "Double flat"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1717
+msgid "&Treble Clef"
+msgstr "&Viiulivõti"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1724
+msgid "&Alto Clef"
+msgstr "&Aldivõti"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1731
+msgid "Te&nor Clef"
+msgstr "Te&norivõti"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1738
+msgid "&Bass Clef"
+msgstr "&Bassivõti"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1745
+msgid "&Text"
+msgstr "&Tekst"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1751
+#, fuzzy
+msgid "&Guitar Chord"
+msgstr "Puhasta valik"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1784
+msgid "Select from Sta&rt"
+msgstr "Vali al&gusest"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1788
+msgid "Select to &End"
+msgstr "Vali l&õpuni"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1792
+msgid "Select Whole St&aff"
+msgstr "V&ali kogu lõik"
+
+#: ../src/commands/edit/CutAndCloseCommand.h:53
+#: ../src/gui/editors/notation/NotationView.cpp:1796
+msgid "C&ut and Close"
+msgstr "Lõika ja s&ulge"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1800
+msgid "Pa&ste..."
+msgstr "A&seta..."
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:122
+#: ../src/gui/editors/notation/NotationView.cpp:1808
+msgid "Move to Staff Above"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:126
+#: ../src/gui/editors/notation/NotationView.cpp:1812
+msgid "Move to Staff Below"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1826
+msgid "&Linear Layout"
+msgstr "&Lineaarne paigutus"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1835
+msgid "&Continuous Page Layout"
+msgstr "&Pideva leheküljega paigutus"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1844
+msgid "&Multiple Page Layout"
+msgstr "&Mitme leheküljega paigutus"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1854
+msgid "Show Ra&w Note Ruler"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1862
+msgid "Show &Annotations"
+msgstr "Näita &annotatsioone"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1866
+msgid "Show Lily&Pond Directives"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1870
+msgid "Open L&yric Editor"
+msgstr "Ava s&õnade redaktor"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1912
+msgid "Trip&let Insert Mode"
+msgstr "Trioo&li lisamise režiim"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1926
+#, fuzzy
+msgid "Grace Insert Mode"
+msgstr "Trioo&li lisamise režiim"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2180
+msgid "&Dump selected events to stderr"
+msgstr "Valitud sündmused väljastatakse standardsesse veaväljundisse"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2248
+#, fuzzy
+msgid "Ma&ke Ornament..."
+msgstr "Märgise nimi "
+
+#: ../src/gui/editors/notation/NotationView.cpp:2252
+msgid "Trigger &Ornament..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2256
+#, fuzzy
+msgid "Remove Ornament..."
+msgstr "Kontrapunkti eemaldamine..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:2261
+msgid "&None"
+msgstr "&Puudub"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2289
+#, fuzzy
+msgid "Convert Notation For..."
+msgstr "Audio eelvaatluse genereerimine..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:2298
+msgid "Show &Notes Toolbar"
+msgstr "Näita &nootide tööriistariba"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2299
+msgid "Show &Rests Toolbar"
+msgstr "Näita &pauside tööriistariba"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2300
+msgid "Show &Accidentals Toolbar"
+msgstr "Näita &juhuslike märkide tööristariba"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2301
+msgid "Show Cle&fs Toolbar"
+msgstr "Näita v&õtmete tööristariba"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2303
+msgid "Show &Marks Toolbar"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2305
+msgid "Show &Group Toolbar"
+msgstr "Näita &grupeerimise tööriistariba"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2307
+msgid "Show &Layout Toolbar"
+msgstr "Näita &paigutuse tööriistariba"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2311
+msgid "Show M&eta Toolbar"
+msgstr "Näita m&eta tööriistariba"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2373
+msgid "Cursor &Up Staff"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2377
+msgid "Cursor &Down Staff"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2381
+msgid "Cursor Pre&vious Segment"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2385
+#, fuzzy
+msgid "Cursor Ne&xt Segment"
+msgstr "Loo segment"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2475
+msgid "Push &Left"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2479
+msgid "Push &Right"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2483
+msgid "Push &Up"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2487
+#, fuzzy
+msgid "Push &Down"
+msgstr "Noodivarred &alla"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2491
+#, fuzzy
+msgid "&Restore Positions"
+msgstr "Taasta a&rvutatud noodivarred"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2495
+msgid "Make &Invisible"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2499
+msgid "Make &Visible"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2503
+#, fuzzy
+msgid "Toggle Dot"
+msgstr "täisnoot"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2507
+#: ../src/gui/editors/notation/NotationView.cpp:2511
+#, fuzzy
+msgid "Add Dot"
+msgstr "Lisa %1"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2570
+#, c-format
+msgid ""
+"_n: 1 pixel\n"
+"%n pixels"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2619
+msgid " Font: "
+msgstr " Font: "
+
+#: ../src/gui/editors/notation/NotationView.cpp:2647
+msgid "Unknown font \"%1\", using default"
+msgstr "Tundmatu font \"%1\", kasutatakse vaikeväärtust"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2655
+msgid " Size: "
+msgstr " Suurus: "
+
+#: ../src/gui/editors/notation/NotationView.cpp:2677
+msgid " Spacing: "
+msgstr " Samm: "
+
+#: ../src/gui/editors/notation/NotationView.cpp:2993
+#: ../src/gui/editors/notation/NotationView.cpp:3818
+msgid " Ready."
+msgstr " Valmis."
+
+#: ../src/gui/editors/notation/NotationView.cpp:2998
+msgid "Laying out score..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:3011
+msgid "Laying out staff %1..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:3020
+msgid "Reconciling staffs..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:3885
+msgid "Sizing and allocating canvas..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:4050
+msgid "note"
+msgstr "noot"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4050
+msgid "rest"
+msgstr "paus"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4211
+msgid "%1 - Segment Track #%2 - Notation"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:4217
+#, fuzzy
+msgid "%1 - All Segments - Notation"
+msgstr "Kestvus"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4222
+#, fuzzy
+msgid ""
+"_n: %1 - Segment - Notation\n"
+"%1 - %n Segments - Notation"
+msgstr "Kestvus"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4243
+#, fuzzy
+msgid "Grace"
+msgstr "&Rajad"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4247
+#: ../src/gui/editors/notation/NotationView.cpp:4251
+#: ../src/gui/editors/notation/NotationView.cpp:4255
+#, fuzzy
+msgid "%1 %2"
+msgstr "&%1%2"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4271
+msgid "Hidden annotations"
+msgstr "Peidetud annotatsioonid"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4293
+msgid "Hidden LilyPond directives"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:4326
+#, c-format
+msgid "Unknown spacing action %1"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:4384
+#, c-format
+msgid "Unknown proportion action %1"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:4431
+#, c-format
+msgid "Unknown font action %1"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:4449
+#, c-format
+msgid "Unknown font size %1"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:4453
+#, c-format
+msgid "Unknown font size action %1"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:4780
+msgid ""
+"The Restricted paste type requires enough empty space (containing only "
+"rests) at the paste position to hold all of the events to be pasted.\n"
+"Not enough space was found.\n"
+"If you want to paste anyway, consider using one of the other paste types "
+"from the \"Paste...\" option on the Edit menu. You can also change the "
+"default paste type to something other than Restricted if you wish."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:4800
+msgid "Can't paste multiple Segments into one"
+msgstr "Mitut segmenti ei saa ühte asetada"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4828
+#: ../src/gui/editors/notation/NotationView.cpp:4877
+msgid "Couldn't paste at this point."
+msgstr "Sellesse kohta ei saa asetada."
+
+#: ../src/gui/editors/notation/NotationView.cpp:4896
+msgid "Move Events to Staff Above"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:4924
+msgid "Move Events to Staff Below"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5036
+#, fuzzy
+msgid "Pushing selection left..."
+msgstr "Valiku lõikamine..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5047
+#, fuzzy
+msgid "Pushing selection right..."
+msgstr "Valiku lõikamine..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5058
+#, fuzzy
+msgid "Pushing selection up..."
+msgstr "Valiku lõikamine..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5069
+#, fuzzy
+msgid "Pushing selection down..."
+msgstr "Valiku lõikamine..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5080
+#, fuzzy
+msgid "Restoring computed positions..."
+msgstr "Noodivarte arvutatud suuna taastamine..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5089
+#, fuzzy
+msgid "Making visible..."
+msgstr "Akordi loomine..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5098
+#, fuzzy
+msgid "Making invisible..."
+msgstr "Akordi loomine..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5185
+msgid "Beaming group..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5195
+msgid "Auto-beaming selection..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5205
+msgid "Breaking groups..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5293
+msgid "Untupleting..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5301
+msgid "Adding slur..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5302
+msgid "slur"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5307
+#, fuzzy
+msgid "Adding phrasing slur..."
+msgstr "Decrescendo lisamine..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5308
+msgid "phrasing slur"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5313
+#, fuzzy
+msgid "Adding glissando..."
+msgstr "Crescendo lisamine..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5314
+#, fuzzy
+msgid "glissando"
+msgstr "Crescendo lisamine..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5319
+msgid "Adding crescendo..."
+msgstr "Crescendo lisamine..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5320
+#: ../src/gui/editors/notation/NotationView.cpp:5326
+#, fuzzy
+msgid "dynamic"
+msgstr "Dünaamiline"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5325
+msgid "Adding decrescendo..."
+msgstr "Decrescendo lisamine..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5331
+#: ../src/gui/editors/notation/NotationView.cpp:5337
+#: ../src/gui/editors/notation/NotationView.cpp:5343
+#: ../src/gui/editors/notation/NotationView.cpp:5349
+#, fuzzy
+msgid "Adding octave..."
+msgstr "Crescendo lisamine..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5332
+#: ../src/gui/editors/notation/NotationView.cpp:5338
+#: ../src/gui/editors/notation/NotationView.cpp:5344
+#: ../src/gui/editors/notation/NotationView.cpp:5350
+msgid "ottava"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5366
+msgid "Can't add overlapping %1 indications"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5375
+msgid "Making chord..."
+msgstr "Akordi loomine..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5387
+msgid "Normalizing rests..."
+msgstr "Pauside normaliseerimine..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5397
+msgid "Collapsing rests..."
+msgstr "Pauside kokkutõmbamine..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5417
+msgid "Tying notes..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5427
+msgid "Untying notes..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5437
+msgid "Making notes viable..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5447
+msgid "Removing counterpoint..."
+msgstr "Kontrapunkti eemaldamine..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5457
+msgid "Pointing stems up..."
+msgstr "Noodivarte üles suunamine..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5467
+msgid "Pointing stems down..."
+msgstr "Noodivarte alla suunamine..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5478
+msgid "Restoring computed stem directions..."
+msgstr "Noodivarte arvutatud suuna taastamine..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5488
+#: ../src/gui/editors/notation/NotationView.cpp:5498
+#, fuzzy
+msgid "Positioning slurs..."
+msgstr "Noodivarte üles suunamine..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5509
+#, fuzzy
+msgid "Restoring slur positions..."
+msgstr "Noodivarte arvutatud suuna taastamine..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5519
+#: ../src/gui/editors/notation/NotationView.cpp:5529
+#, fuzzy
+msgid "Positioning ties..."
+msgstr "Noodivarte üles suunamine..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5540
+#, fuzzy
+msgid "Restoring tie positions..."
+msgstr "Noodivarte arvutatud suuna taastamine..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5550
+msgid "Fixing notation quantization..."
+msgstr "Nootide kvantimise parandamine..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5560
+#, fuzzy
+msgid "Removing notation quantization..."
+msgstr "Nootide kvantimise parandamine..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5577
+msgid "Changing to %1 style..."
+msgstr "%1 stiili muutmine..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5585
+#, c-format
+msgid "Unknown style action %1"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5598
+#: ../src/gui/editors/notation/NotationView.cpp:5639
+#: ../src/gui/editors/notation/NotationView.cpp:5695
+msgid "No note duration selected"
+msgstr "Noodi pikkust pole valitud"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5660
+msgid "No rest duration selected"
+msgstr "Pausi pikkust pole valitud"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5746
+#, fuzzy
+msgid "No note or rest duration selected"
+msgstr "Pausi pikkust pole valitud"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5757
+#: ../src/gui/editors/notation/NotationView.cpp:5768
+#: ../src/gui/editors/notation/NotationView.cpp:5779
+#: ../src/gui/editors/notation/NotationView.cpp:5790
+#: ../src/gui/editors/notation/NotationView.cpp:5801
+#: ../src/gui/editors/notation/NotationView.cpp:5812
+#: ../src/gui/editors/notation/NotationView.cpp:5823
+msgid "Forcing accidentals..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5834
+msgid "Restoring accidentals..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5845
+msgid "Showing cautionary accidentals..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5855
+msgid "Cancelling cautionary accidentals..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5884
+msgid "Interpreting selection..."
+msgstr "Valiku interpreteerimine..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5896
+#, fuzzy
+msgid "Setting note durations..."
+msgstr "Noodivar&te suund"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5904
+#: ../src/gui/editors/notation/NotationView.cpp:5912
+#, fuzzy
+msgid "Adding dot..."
+msgstr "Crescendo lisamine..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5934
+msgid "Text: "
+msgstr "Tekst: "
+
+#: ../src/gui/editors/notation/NotationView.cpp:5948
+msgid "Fingering: "
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:6036
+msgid "Ornament track %1 bar %2"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:6038
+#, fuzzy, c-format
+msgid "Ornament bar %1"
+msgstr "Seg&mendid"
+
+#: ../src/gui/editors/notation/NotationView.cpp:6098
+#, fuzzy
+msgid "Remove Ornaments"
+msgstr "Eemalda kõik märgised"
+
+#: ../src/gui/editors/notation/NotationView.cpp:6145
+msgid "Estimated key signature shown"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStaff.cpp:1249
+#: ../src/gui/editors/notation/NotationView.cpp:6202
+msgid "Sustain"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:6218
+msgid ""
+"There is no sustain controller defined for this device.\n"
+"Please ensure the device is configured correctly in the Manage MIDI Devices "
+"dialog in the main window."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:7250
+msgid "Can't insert note: No note duration selected"
+msgstr "Nooti pole võimalik lisada: noodi pikkust pole valitud"
+
+#: ../src/gui/editors/notation/NotationEraser.cpp:61
+#: ../src/gui/editors/notation/NotationSelector.cpp:83
+msgid "Switch to Insert Tool"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotePixmapFactory.cpp:2303
+#: ../src/gui/editors/notation/NotePixmapFactory.cpp:2347
+msgid "..."
+msgstr "..."
+
+#: ../src/gui/editors/notation/NoteFontFactory.cpp:200
+msgid "Can't obtain a default font -- no fonts found"
+msgstr ""
+
+#: ../src/gui/editors/notation/NoteFontMap.cpp:52
+#: ../src/gui/general/PresetGroup.cpp:49
+#, fuzzy
+msgid "unknown error"
+msgstr "Tundmatu"
+
+#: ../src/gui/editors/notation/NoteFontMap.cpp:78
+msgid "Can't open font mapping file %1 or %2"
+msgstr ""
+
+#: ../src/gui/editors/notation/NoteFontMap.cpp:82
+#, c-format
+msgid "Can't open font mapping file %1"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:52
+msgid "%1-dotted-%2"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:54
+msgid "%1-dotted %2"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:57
+#, c-format
+msgid "dotted-%1"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:59
+#, c-format
+msgid "dotted %1"
+msgstr "punktiga %1"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:83
+msgid "sixty-fourth note"
+msgstr "kuuekümneneljandiknoot"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:83
+msgid "thirty-second note"
+msgstr "kolmekümnekahendiknoot"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:84
+msgid "sixteenth note"
+msgstr "kuueteistkümnendiknoot"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:84
+msgid "eighth note"
+msgstr "kaheksandiknoot"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:85
+msgid "quarter note"
+msgstr "veerandnoot"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:85
+msgid "half note"
+msgstr "poolnoot"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:86
+msgid "whole note"
+msgstr "täisnoot"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:86
+msgid "double whole note"
+msgstr "topelt täisnoot"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:89
+msgid "sixty-fourth notes"
+msgstr "kuuekümneneljandiknoodid"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:89
+msgid "thirty-second notes"
+msgstr "kolmekümnekahendiknoodid"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:90
+msgid "sixteenth notes"
+msgstr "kuueteiskümnendiknoodid"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:90
+msgid "eighth notes"
+msgstr "kaheksandiknoodid"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:91
+msgid "quarter notes"
+msgstr "veerandnoodid"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:91
+msgid "half notes"
+msgstr "poolnoodid"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:92
+msgid "whole notes"
+msgstr "täisnoodid"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:92
+msgid "double whole notes"
+msgstr "topelt täisnoodid"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:96
+#: ../src/gui/editors/notation/NotationStrings.cpp:154
+msgid "%1 triplets"
+msgstr "%1 trioolid"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:100
+#: ../src/gui/editors/notation/NotationStrings.cpp:158
+msgid "%1 triplet"
+msgstr "%1 triool"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:143
+msgid "64th"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:143
+msgid "32nd"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:143
+#, fuzzy
+msgid "16th"
+msgstr "16."
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:143
+#, fuzzy
+msgid "8th"
+msgstr "8."
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:144
+msgid "quarter"
+msgstr "veerand"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:144
+msgid "half"
+msgstr "pool"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:144
+msgid "whole"
+msgstr "täis"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:145
+msgid "double whole"
+msgstr "topelttäis"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:148
+msgid "64ths"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:148
+msgid "32nds"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:148
+msgid "16ths"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:148
+msgid "8ths"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:149
+msgid "quarters"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:149
+msgid "halves"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:149
+msgid "wholes"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:150
+msgid "double wholes"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:278
+msgid "%1 ticks"
+msgstr ""
+
+#: ../src/gui/editors/notation/FontViewFrame.cpp:100
+#, c-format
+msgid "Error: Unable to match font name %1"
+msgstr ""
+
+#: ../src/gui/editors/notation/FontViewFrame.cpp:108
+msgid "Warning: No good match for font name %1 (best is %2)"
+msgstr ""
+
+#: ../src/gui/editors/notation/FontViewFrame.cpp:116
+#, c-format
+msgid "Error: Unable to open best-match font %1"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:113
+#, fuzzy
+msgid "Track %1 : \"%2\""
+msgstr "Pank %1:%2"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:119
+#, c-format
+msgid ""
+"\n"
+"Notate for: %1"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:121
+#, fuzzy
+msgid "normal"
+msgstr "Normaalne"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:124
+#, fuzzy
+msgid "small"
+msgstr "Väärtus"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:127
+msgid "tiny"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:131
+msgid "--"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:156
+msgid ""
+"\n"
+"Size: %1, Bracket: %2 "
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:183
+msgid ""
+"\n"
+"bars [%1-%2] in %3 (tr=%4) : \"%5\""
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:190
+msgid ""
+"\n"
+"bars [%1-%2] (tr=%3) : \"%4\""
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:240
+#, fuzzy
+msgid "C#"
+msgstr "C#%1"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:242
+msgid "Eb"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:245
+#, fuzzy
+msgid "F#"
+msgstr "F#%1"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:247
+#, fuzzy
+msgid "G#"
+msgstr "G#%1"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:249
+msgid "Bb"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:352
+#, fuzzy
+msgid "%1: %2"
+msgstr "&%1%2"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:355
+#, fuzzy, c-format
+msgid " in %1"
+msgstr "V&õta tagasi %1"
+
+#: ../src/gui/editors/notation/NotationStaff.cpp:452
+msgid "Rendering staff %1..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStaff.cpp:515
+#, fuzzy
+msgid "Rendering notes on staff %1..."
+msgstr "Nootide lisamisel..."
+
+#: ../src/gui/editors/notation/NotationStaff.cpp:583
+msgid "Positioning staff %1..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationSelectionPaster.cpp:85
+msgid "Ready."
+msgstr "Valmis."
+
+#: ../src/gui/editors/notation/RestInserter.cpp:62
+msgid "Dotted rest"
+msgstr "Punktiga paus"
+
+#: ../src/gui/editors/notation/NoteStyleFileReader.cpp:57
+#, c-format
+msgid "Can't open style file %1"
+msgstr ""
+
+#: ../src/gui/editors/notation/NoteStyleFileReader.cpp:92
+msgid "type is a required attribute of note"
+msgstr ""
+
+#: ../src/gui/editors/notation/NoteStyleFileReader.cpp:101
+#, c-format
+msgid "Unrecognised note name %1"
+msgstr ""
+
+#: ../src/gui/editors/notation/NoteStyleFileReader.cpp:108
+msgid "global element must precede note elements"
+msgstr ""
+
+#: ../src/gui/editors/notation/NoteStyleFileReader.cpp:137
+msgid ""
+"global and note elements may have shape or charname attribute, but not both"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationVLayout.cpp:493
+msgid ""
+"Spanned note at %1 has no HEIGHT_ON_STAFF property!\n"
+"This is a bug (the program would previously have crashed by now)"
+msgstr ""
+
+#: ../src/gui/editors/notation/NoteInserter.cpp:82
+msgid "Auto-Beam when appropriate"
+msgstr ""
+
+#: ../src/gui/editors/notation/NoteInserter.cpp:103
+msgid "Dotted note"
+msgstr "Punktiga noot"
+
+#: ../src/gui/editors/notation/NoteInserter.cpp:120
+msgid "Switch to Inserting Rests"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:98
+#, fuzzy
+msgid "Collapse Rests"
+msgstr "&Tõmba pausid kokku"
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:102
+msgid "Respell as Flat"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:106
+#, fuzzy
+msgid "Respell as Sharp"
+msgstr "Juhuslike märkide tööriistriba"
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:110
+msgid "Respell as Natural"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:114
+#, fuzzy
+msgid "Collapse Notes"
+msgstr "&Tõmba pausid kokku"
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:130
+#, fuzzy
+msgid "Make Invisible"
+msgstr "Akordi loomine..."
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:134
+#, fuzzy
+msgid "Make Visible"
+msgstr "Akordi loomine..."
+
+#: ../src/gui/editors/eventlist/EventView.cpp:129
+msgid "Event filters"
+msgstr "Sündmuse filtrid"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:138
+msgid "Rest"
+msgstr "Paus"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:139
+msgid "Indication"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:141
+msgid "Other"
+msgstr "Muu"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:161
+#, fuzzy
+msgid "Triggered Segment Properties"
+msgstr "Sündmuse omadused"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:166
+#, fuzzy
+msgid "Label: "
+msgstr "Nimi"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:176
+#, fuzzy
+msgid "Base pitch: "
+msgstr "Noodi helikõrgus:"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:183
+#, fuzzy
+msgid "Base velocity: "
+msgstr "Noodi kiirus:"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:246
+msgid "Duration "
+msgstr "Kestvus "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:247
+msgid "Event Type "
+msgstr "Sündmuse tüüp "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:248
+msgid "Pitch "
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:249
+msgid "Velocity "
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:250
+msgid "Type (Data1) "
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:251
+msgid "Value (Data2) "
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:461
+msgid "(group %1) "
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:519
+msgid "<no events at this filter level>"
+msgstr "<sellel filtri tasemel puuduvad sündmused>"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:521
+msgid "<no events>"
+msgstr "<sündmused puuduvad>"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:696
+#, fuzzy
+msgid "Segment label"
+msgstr "Segmendi nime muutmine"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:696
+#, fuzzy
+msgid "Label:"
+msgstr "Nimi"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1123
+msgid "&Insert Event"
+msgstr "&Lisa sündmus"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1130
+msgid "&Delete Event"
+msgstr "&Kustuta sündmus"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1137
+msgid "&Edit Event"
+msgstr "R&edigeeri sündmust"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1144
+msgid "&Advanced Event Editor"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1518
+msgid "Open in Event Editor"
+msgstr "Ava sündmuse redaktoris"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1519
+msgid "Open in Expert Event Editor"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1577
+#, fuzzy
+msgid "%1 - Triggered Segment: %2"
+msgstr "Loo segment"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1592
+msgid "%1 - Segment Track #%2 - Event List"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1598
+msgid "%1 - %2 Segments - Event List"
+msgstr ""
+
+#: ../src/gui/rulers/TempoRuler.cpp:131
+#, fuzzy
+msgid "Insert Tempo Change at Playback Position"
+msgstr "Lisa tempo muudatus"
+
+#: ../src/gui/rulers/TempoRuler.cpp:136
+#, fuzzy
+msgid "Delete Tempo Change"
+msgstr "Lisa tempo muudatus"
+
+#: ../src/gui/rulers/TempoRuler.cpp:140
+msgid "Ramp Tempo to Next Tempo"
+msgstr ""
+
+#: ../src/gui/rulers/TempoRuler.cpp:144
+msgid "Un-Ramp Tempo"
+msgstr ""
+
+#: ../src/gui/rulers/TempoRuler.cpp:149
+#, fuzzy
+msgid "Edit Tempo..."
+msgstr "Muuda &vaiketempot..."
+
+#: ../src/gui/rulers/TempoRuler.cpp:153
+#, fuzzy
+msgid "Edit Time Signature..."
+msgstr "Taktimõõt"
+
+#: ../src/gui/rulers/TempoRuler.cpp:588
+#, fuzzy
+msgid "%1.%2%3 (%4.%5%6 bpm)"
+msgstr "%1.%2 s,"
+
+#: ../src/gui/rulers/TempoRuler.cpp:596
+#, fuzzy
+msgid "%1.%2%3 bpm"
+msgstr "%1.%2 s,"
+
+#: ../src/gui/rulers/TempoRuler.cpp:604
+#, fuzzy
+msgid "%1 - %2.%3%4"
+msgstr "&%1%2"
+
+#: ../src/gui/rulers/ControlRulerEventInsertCommand.cpp:36
+msgid "Insert Controller Event"
+msgstr ""
+
+#: ../src/gui/rulers/ControlChangeCommand.cpp:35
+msgid "Control Change"
+msgstr ""
+
+#: ../src/gui/rulers/PropertyViewRuler.cpp:72
+msgid "%1 controller"
+msgstr ""
+
+#: ../src/gui/rulers/RawNoteRuler.cpp:453
+msgid "Track #%1, Segment \"%2\" (runtime id %3)"
+msgstr ""
+
+#: ../src/gui/rulers/MarkerRuler.cpp:100
+#, fuzzy
+msgid "Insert Marker"
+msgstr "Lisa paus"
+
+#: ../src/gui/rulers/MarkerRuler.cpp:104
+#, fuzzy
+msgid "Insert Marker at Playback Position"
+msgstr "Lisa tempo muudatus"
+
+#: ../src/gui/rulers/MarkerRuler.cpp:109
+#, fuzzy
+msgid "Delete Marker"
+msgstr "Kustuta märgis"
+
+#: ../src/gui/rulers/MarkerRuler.cpp:114
+#, fuzzy
+msgid "Edit Marker..."
+msgstr "Redigeeri märgist"
+
+#: ../src/gui/rulers/MarkerRuler.cpp:119
+msgid ""
+"Click on a marker to move the playback pointer.\n"
+"Shift-click to set a range between markers.\n"
+"Double-click to open the marker editor."
+msgstr ""
+
+#: ../src/gui/rulers/ChordNameRuler.cpp:97
+msgid ""
+"Chord name ruler.\n"
+"Turn it on and off from the Settings->Rulers menu."
+msgstr ""
+
+#: ../src/gui/rulers/ControlRulerEventEraseCommand.cpp:37
+msgid "Erase Controller Event(s)"
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:901
+#: ../src/gui/rulers/ControllerEventsRuler.cpp:188
+#, fuzzy
+msgid "Unsupported Event Type"
+msgstr "Toetuseta sündmuse tüüp:"
+
+#: ../src/gui/rulers/ControllerEventsRuler.cpp:203
+msgid "Controller Events"
+msgstr ""
+
+#: ../src/gui/rulers/ControllerEventsRuler.cpp:278
+msgid "Controller Event Number"
+msgstr ""
+
+#: ../src/gui/rulers/ControllerEventsRuler.cpp:471
+msgid "Add line of controllers"
+msgstr ""
+
+#: ../src/gui/rulers/LoopRuler.cpp:89
+msgid ""
+"Click and drag to move the playback pointer.\n"
+"Shift-click and drag to set a range for looping or editing.\n"
+"Shift-click to clear the loop or range.\n"
+"Double-click to start playback."
+msgstr ""
+
+#: ../src/gui/general/EditViewBase.cpp:228
+#, fuzzy
+msgid "Set Segment Start Time..."
+msgstr "Näita &segmentide parameetreid"
+
+#: ../src/gui/general/EditViewBase.cpp:232
+#, fuzzy
+msgid "Set Segment Duration..."
+msgstr "Noodivar&te suund"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:56
+msgid "Load track parameters preset"
+msgstr ""
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:62
+#, fuzzy
+msgid "Convert notation for..."
+msgstr "Audio eelvaatluse genereerimine..."
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:86
+msgid "Select preset track parameters for:"
+msgstr ""
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:87
+msgid "Create appropriate notation for:"
+msgstr ""
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:89
+msgid "Category"
+msgstr ""
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:95
+#, fuzzy
+msgid "Player Ability"
+msgstr "Mängi maha"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:97
+#, fuzzy
+msgid "Amateur"
+msgstr "Maatriks"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:98
+#, fuzzy
+msgid "Professional"
+msgstr "Töötlemine..."
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:104
+#, fuzzy
+msgid "Only selected segments"
+msgstr "V&ali kõik segmendid"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:106
+msgid "All segments in this track"
+msgstr ""
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:111
+#, fuzzy
+msgid "Only for new segments"
+msgstr "Selle segmendi sõnad"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:113
+#, fuzzy
+msgid "Convert existing segments"
+msgstr "Loo segment"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:39
+#, c-format
+msgid "C%1"
+msgstr "C%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:39
+#, c-format
+msgid "C#%1"
+msgstr "C#%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:39
+#, c-format
+msgid "D%1"
+msgstr "D%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:39
+#, c-format
+msgid "D#%1"
+msgstr "D#%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:40
+#, c-format
+msgid "E%1"
+msgstr "E%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:40
+#, c-format
+msgid "F%1"
+msgstr "F%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:40
+#, c-format
+msgid "F#%1"
+msgstr "F#%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:40
+#, c-format
+msgid "G%1"
+msgstr "G%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:41
+#, c-format
+msgid "G#%1"
+msgstr "G#%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:41
+#, c-format
+msgid "A%1"
+msgstr "A%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:41
+#, c-format
+msgid "A#%1"
+msgstr "A#%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:41
+#, c-format
+msgid "B%1"
+msgstr "B%1"
+
+#: ../src/gui/general/PresetGroup.cpp:95
+#, fuzzy, c-format
+msgid "Can't open preset file %1"
+msgstr "Faili '%1' pole võimalik avada."
+
+#: ../src/gui/general/EditView.cpp:744
+#, fuzzy
+msgid "&Halve Durations"
+msgstr "Kestvus"
+
+#: ../src/gui/general/EditView.cpp:748
+#, fuzzy
+msgid "&Double Durations"
+msgstr "Kestvus"
+
+#: ../src/gui/general/EditView.cpp:806
+msgid "Show Velocity Property Ruler"
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:825
+msgid "Insert item"
+msgstr "Lisa element"
+
+#: ../src/gui/general/EditView.cpp:831
+msgid "Erase selected items"
+msgstr "Kustuta valitud elemendid"
+
+#: ../src/gui/general/EditView.cpp:835
+msgid "Clear ruler"
+msgstr "Puhasta joonlaud"
+
+#: ../src/gui/general/EditView.cpp:839
+msgid "Insert line of controllers"
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:843
+#, fuzzy
+msgid "Flip forward"
+msgstr "Edasi kerimine"
+
+#: ../src/gui/general/EditView.cpp:847
+msgid "Flip backwards"
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:851
+#, fuzzy
+msgid "Draw property line"
+msgstr "Vaikeproportsioonid"
+
+#: ../src/gui/general/EditView.cpp:855
+#, fuzzy
+msgid "Select all property values"
+msgstr "Kustuta see omadus"
+
+#: ../src/gui/general/EditView.cpp:894
+#, fuzzy
+msgid "%1 Controller %2 %3"
+msgstr "Vali..."
+
+#: ../src/gui/general/EditView.cpp:1066
+msgid "I"
+msgstr "I"
+
+#: ../src/gui/general/EditView.cpp:1066
+msgid "II"
+msgstr "II"
+
+#: ../src/gui/general/EditView.cpp:1066
+msgid "III"
+msgstr "III"
+
+#: ../src/gui/general/EditView.cpp:1066
+msgid "IV"
+msgstr "IV"
+
+#: ../src/gui/general/EditView.cpp:1067
+msgid "V"
+msgstr "V"
+
+#: ../src/gui/general/EditView.cpp:1067
+msgid "VI"
+msgstr "VI"
+
+#: ../src/gui/general/EditView.cpp:1067
+msgid "VII"
+msgstr "VII"
+
+#: ../src/gui/general/EditView.cpp:1067
+msgid "VIII"
+msgstr "VIII"
+
+#: ../src/gui/general/EditView.cpp:1069
+msgid "%1 flat"
+msgstr "%1 bemoll"
+
+#: ../src/gui/general/EditView.cpp:1070
+msgid "%1 sharp"
+msgstr "%1 diees"
+
+#: ../src/gui/general/EditView.cpp:1085
+msgid "&Insert Note"
+msgstr "L&isa noot"
+
+#: ../src/gui/general/EditView.cpp:1091
+msgid "&Upper Octave"
+msgstr "Oktav &üles"
+
+#: ../src/gui/general/EditView.cpp:1096
+msgid "&Lower Octave"
+msgstr "Oktav &alla"
+
+#: ../src/gui/general/EditView.cpp:1268
+msgid "Estimated time signature shown"
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:1431
+#, fuzzy
+msgid "Halving durations..."
+msgstr "Noodivar&te suund"
+
+#: ../src/gui/general/EditView.cpp:1445
+#, fuzzy
+msgid "Doubling durations..."
+msgstr "Noodivar&te suund"
+
+#: ../src/gui/general/EditView.cpp:1469
+#, fuzzy
+msgid "Rescaling..."
+msgstr "Faili lugemine..."
+
+#: ../src/gui/general/EditView.cpp:1489
+msgid "By number of semitones: "
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:1496 ../src/gui/general/EditView.cpp:1518
+msgid "Transposing..."
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:1536
+msgid "Transposing up one semitone..."
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:1545
+msgid "Transposing up one octave..."
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:1554
+msgid "Transposing down one semitone..."
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:1563
+msgid "Transposing down one octave..."
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:1575
+#, fuzzy
+msgid "Inverting..."
+msgstr "Käivitamine..."
+
+#: ../src/gui/general/EditView.cpp:1587
+#, fuzzy
+msgid "Retrograding..."
+msgstr "Faili lugemine..."
+
+#: ../src/gui/general/EditView.cpp:1599
+#, fuzzy
+msgid "Retrograde inverting..."
+msgstr "Faili lugemine..."
+
+#: ../src/gui/general/EditView.cpp:1608
+#, fuzzy
+msgid "Jogging left..."
+msgstr "Faili sulgemine..."
+
+#: ../src/gui/general/EditView.cpp:1623
+msgid "Jogging right..."
+msgstr ""
+
+#: ../src/sound/AudioFileManager.cpp:660
+#, fuzzy, c-format
+msgid "Downloading file %1"
+msgstr "Audiofaili \"%1\" mängimine"
+
+#: ../src/sound/AudioFileManager.cpp:735
+#, fuzzy
+msgid "Converting audio file..."
+msgstr "Audio eelvaatluse genereerimine..."
+
+#: ../src/sound/AudioFileManager.cpp:737
+#, fuzzy
+msgid "Resampling audio file..."
+msgstr "Faili lugemine..."
+
+#: ../src/sound/AudioFileManager.cpp:739
+msgid "Converting and resampling audio file..."
+msgstr ""
+
+#: ../src/sound/AudioFileManager.cpp:741
+#, fuzzy
+msgid "Importing audio file..."
+msgstr "Rosegarden 2.1 faili import..."
+
+#: ../src/sound/AudioFileManager.cpp:794
+#, fuzzy
+msgid "Failed to convert or resample audio file on import"
+msgstr "Audiofaili valimine"
+
+#: ../src/sequencer/main.cpp:46 ../src/sequencer/main.cpp:86
+#, fuzzy
+msgid "RosegardenSequencer"
+msgstr "Rosegarden"
+
+#: ../src/sequencer/main.cpp:54
+#, fuzzy
+msgid "JACK playback and capture ports"
+msgstr "JACK'i mahamängimise latents (millisekundites)"
+
+#: ../src/commands/segment/SegmentSyncCommand.cpp:38
+#: ../src/commands/segment/SegmentSyncCommand.cpp:44
+#: ../src/commands/segment/SegmentSyncCommand.cpp:55
+#: ../src/commands/segment/SegmentSyncCommand.cpp:63
+#, fuzzy
+msgid "Sync segment parameters"
+msgstr "Instrumendi parameetrid"
+
+#: ../src/commands/segment/RenameTrackCommand.h:52
+#, fuzzy
+msgid "Rename Track"
+msgstr "&Kustuta rada"
+
+#: ../src/commands/segment/SegmentRepeatToCopyCommand.cpp:39
+msgid "Turn Repeats into Copies"
+msgstr "Muuda kordused koopiateks"
+
+#: ../src/commands/segment/SegmentTransposeCommand.cpp:36
+#: ../src/commands/segment/SegmentTransposeCommand.cpp:42
+#, fuzzy
+msgid "Change segment transposition"
+msgstr "Muuda segmendi värvi"
+
+#: ../src/commands/edit/RescaleCommand.h:50
+#: ../src/commands/segment/AudioSegmentRescaleCommand.h:62
+#: ../src/commands/segment/SegmentRescaleCommand.h:58
+msgid "Stretch or S&quash..."
+msgstr ""
+
+#: ../src/commands/segment/SegmentLabelCommand.h:52
+msgid "Re&label..."
+msgstr "&Nimeta ümber..."
+
+#: ../src/commands/segment/AudioSegmentResizeFromStartCommand.cpp:39
+#: ../src/commands/segment/SegmentResizeFromStartCommand.cpp:39
+#, fuzzy
+msgid "Resize Segment"
+msgstr "Muuda sündmuse suurust"
+
+#: ../src/commands/segment/RemoveTempoChangeCommand.h:58
+msgid "Remove &Tempo Change..."
+msgstr "Eemalda &tempo muutus..."
+
+#: ../src/commands/segment/SegmentEraseCommand.cpp:40
+#: ../src/commands/segment/SegmentEraseCommand.cpp:52
+msgid "Erase Segment"
+msgstr "Kustuta segment"
+
+#: ../src/commands/segment/AudioSegmentRescaleCommand.cpp:126
+#: ../src/commands/segment/SegmentRescaleCommand.cpp:102
+msgid "(rescaled)"
+msgstr ""
+
+#: ../src/commands/segment/AudioSegmentRescaleCommand.cpp:127
+#: ../src/commands/segment/SegmentRescaleCommand.cpp:105
+msgid "%1 (rescaled)"
+msgstr ""
+
+#: ../src/commands/segment/PasteToTriggerSegmentCommand.cpp:47
+msgid "Paste as New Triggered Segment"
+msgstr ""
+
+#: ../src/commands/segment/SegmentColourMapCommand.h:52
+msgid "Change Segment Color Map..."
+msgstr "Muuda segmendi värvikaarti..."
+
+#: ../src/commands/segment/SegmentQuickCopyCommand.h:55
+#, fuzzy
+msgid "Quick-Copy Segment"
+msgstr "Liiguta segmenti"
+
+#: ../src/commands/segment/AudioSegmentSplitCommand.cpp:42
+msgid "Split Audio Segment"
+msgstr "Audiofaili tükeldamine"
+
+#: ../src/commands/segment/AudioSegmentSplitCommand.cpp:103
+#: ../src/commands/segment/SegmentSplitCommand.cpp:135
+#, fuzzy
+msgid " (split)"
+msgstr "%1 (tükeldatud)"
+
+#: ../src/commands/segment/AudioSegmentSplitCommand.cpp:104
+#: ../src/commands/segment/SegmentSplitByRecordingSrcCommand.cpp:120
+#: ../src/commands/segment/SegmentSplitByRecordingSrcCommand.cpp:122
+#: ../src/commands/segment/SegmentSplitCommand.cpp:136
+msgid "%1 (split)"
+msgstr "%1 (tükeldatud)"
+
+#: ../src/commands/segment/SegmentLabelCommand.cpp:40
+msgid "Label Segments"
+msgstr "Segmentide nimetamine"
+
+#: ../src/commands/segment/OpenOrCloseRangeCommand.cpp:43
+msgid "Open or Close Range"
+msgstr ""
+
+#: ../src/commands/edit/TransposeCommand.h:55
+#: ../src/commands/segment/SegmentTransposeCommand.h:54
+#, fuzzy
+msgid "Transpose by &Interval..."
+msgstr "&Transponeeri..."
+
+#: ../src/commands/segment/SegmentAutoSplitCommand.cpp:148
+msgid "%1 (part)"
+msgstr ""
+
+#: ../src/commands/segment/AudioSegmentInsertCommand.cpp:51
+#: ../src/commands/segment/SegmentInsertCommand.cpp:43
+#: ../src/commands/segment/SegmentInsertCommand.cpp:56
+msgid "Create Segment"
+msgstr "Loo segment"
+
+#: ../src/commands/segment/AudioSegmentInsertCommand.cpp:114
+msgid "%1 (inserted)"
+msgstr "%1 (lisatud)"
+
+#: ../src/commands/segment/AudioSegmentInsertCommand.cpp:117
+msgid "unknown audio file"
+msgstr "tundmatu audiofail"
+
+#: ../src/commands/segment/CreateTempoMapFromSegmentCommand.cpp:40
+#, fuzzy
+msgid "Set Tempos from Beat Segment"
+msgstr "Korda segmenti"
+
+#: ../src/commands/segment/SegmentSplitByRecordingSrcCommand.h:52
+#, fuzzy
+msgid "Split by &Recording Source..."
+msgstr "Tükeldamine helikõrguse järgi"
+
+#: ../src/commands/segment/SegmentColourMapCommand.cpp:40
+msgid "Change Segment Color Map"
+msgstr "Muuda segmendi värvikaarti"
+
+#: ../src/commands/edit/CopyCommand.cpp:64
+#: ../src/commands/segment/SegmentQuickCopyCommand.cpp:57
+msgid "%1 (copied)"
+msgstr "%1 (kopeeritud)"
+
+#: ../src/commands/segment/SegmentColourCommand.h:52
+msgid "Change Segment Color..."
+msgstr "Muuda segmendi värvi..."
+
+#: ../src/commands/segment/SegmentSplitByPitchCommand.cpp:170
+msgid "%1 (upper)"
+msgstr ""
+
+#: ../src/commands/segment/SegmentSplitByPitchCommand.cpp:172
+msgid "%1 (lower)"
+msgstr ""
+
+#: ../src/commands/segment/SegmentSingleRepeatToCopyCommand.cpp:39
+msgid "Turn Single Repeat into Copy"
+msgstr "Muuda üksik kordus koopiaks"
+
+#: ../src/commands/segment/AddTempoChangeCommand.h:58
+msgid "Add Te&mpo Change..."
+msgstr "Lisa te&mpo muutus..."
+
+#: ../src/commands/segment/AudioSegmentAutoSplitCommand.h:57
+#: ../src/commands/segment/SegmentAutoSplitCommand.h:53
+msgid "&Split on Silence"
+msgstr "&Tükeldamine vaikuse kohalt"
+
+#: ../src/commands/segment/SetTriggerSegmentBaseVelocityCommand.cpp:39
+#, fuzzy
+msgid "Set Base Velocity"
+msgstr "Noodi kiirus:"
+
+#: ../src/commands/segment/DeleteRangeCommand.cpp:43
+#: ../src/commands/segment/EraseSegmentsStartingInRangeCommand.cpp:39
+#, fuzzy
+msgid "Delete Range"
+msgstr "&Kustuta"
+
+#: ../src/commands/segment/ChangeCompositionLengthCommand.h:53
+#, fuzzy
+msgid "Change &Composition Start and End..."
+msgstr "Muuda &kompositsiooni pikkust..."
+
+#: ../src/commands/segment/MoveTracksCommand.h:51
+msgid "Move Tracks..."
+msgstr "Liiguta radasid..."
+
+#: ../src/commands/segment/SegmentColourCommand.cpp:39
+msgid "Change Segment Color"
+msgstr "Muuda segmendi värvi"
+
+#: ../src/commands/segment/AudioSegmentDistributeCommand.h:66
+msgid "Distribute Audio Segments over MIDI"
+msgstr ""
+
+#: ../src/commands/segment/AudioSegmentAutoSplitCommand.cpp:147
+msgid "%1 (autosplit %2)"
+msgstr ""
+
+#: ../src/commands/segment/SetTriggerSegmentDefaultRetuneCommand.cpp:39
+#, fuzzy
+msgid "Set Default Retune"
+msgstr "Vaikeväärtus:"
+
+#: ../src/commands/segment/AddTimeSignatureCommand.h:52
+msgid "Add Time Si&gnature Change..."
+msgstr "Lisa &taktimõõdu muutus..."
+
+#: ../src/commands/segment/AddTriggerSegmentCommand.cpp:42
+#, fuzzy
+msgid "Add Triggered Segment"
+msgstr "Loo segment"
+
+#: ../src/commands/segment/SetTriggerSegmentDefaultTimeAdjustCommand.cpp:39
+msgid "Set Default Time Adjust"
+msgstr ""
+
+#: ../src/commands/segment/RemoveTimeSignatureCommand.h:58
+#, fuzzy
+msgid "Remove &Time Signature Change..."
+msgstr "Lisa &taktimõõdu muutus..."
+
+#: ../src/commands/segment/SegmentCommandRepeat.cpp:39
+msgid "Repeat Segments"
+msgstr "Korda segmenti"
+
+#: ../src/commands/segment/AddTracksCommand.h:55
+msgid "Add Tracks..."
+msgstr "Lisa rajad..."
+
+#: ../src/commands/segment/ModifyDefaultTempoCommand.h:51
+msgid "Modify &Default Tempo..."
+msgstr "Muuda &vaiketempot..."
+
+#: ../src/commands/segment/SegmentSplitByPitchCommand.h:61
+#, fuzzy
+msgid "Split by &Pitch..."
+msgstr "Tükeldamine helikõrguse järgi"
+
+#: ../src/commands/segment/DeleteTriggerSegmentCommand.cpp:40
+msgid "Delete Triggered Segment"
+msgstr ""
+
+#: ../src/commands/segment/SegmentSplitCommand.cpp:42
+msgid "Split Segment"
+msgstr "Segmendi tükeldamine"
+
+#: ../src/commands/segment/DeleteTracksCommand.h:51
+msgid "Delete Tracks..."
+msgstr "Kustuta rajad..."
+
+#: ../src/commands/segment/InsertRangeCommand.cpp:42
+#, fuzzy
+msgid "Insert Range"
+msgstr "Lisa paus"
+
+#: ../src/commands/segment/DeleteRangeCommand.h:62
+msgid "Rejoin Command"
+msgstr ""
+
+#: ../src/commands/segment/SetTriggerSegmentBasePitchCommand.cpp:39
+#, fuzzy
+msgid "Set Base Pitch"
+msgstr "Tükeldamine helikõrguse järgi"
+
+#: ../src/commands/segment/PasteConductorDataCommand.cpp:41
+#, fuzzy
+msgid "Paste Tempos and Time Signatures"
+msgstr "Ava sündmuse redaktoris"
+
+#: ../src/commands/segment/SegmentSyncClefCommand.cpp:34
+#, fuzzy
+msgid "Sync segment clef"
+msgstr "Segmendi nime muutmine"
+
+#: ../src/commands/matrix/MatrixInsertionCommand.cpp:46
+#: ../src/commands/notation/NoteInsertionCommand.cpp:54
+msgid "Insert Note"
+msgstr "Noodi lisamine"
+
+#: ../src/commands/matrix/MatrixEraseCommand.cpp:41
+msgid "Erase Note"
+msgstr "Kustuta noot"
+
+#: ../src/commands/matrix/MatrixPercussionInsertionCommand.cpp:47
+#, fuzzy
+msgid "Insert Percussion Note"
+msgstr "Noodi lisamine"
+
+#: ../src/commands/matrix/MatrixModifyCommand.cpp:43
+msgid "Move Note"
+msgstr "Liiguta nooti"
+
+#: ../src/commands/matrix/MatrixModifyCommand.cpp:43
+msgid "Modify Note"
+msgstr "Muuda nooti"
+
+#: ../src/commands/edit/PasteEventsCommand.cpp:98
+msgid "Paste into an existing gap [\"restricted\"]"
+msgstr ""
+
+#: ../src/commands/edit/PasteEventsCommand.cpp:100
+msgid "Erase existing events to make room [\"simple\"]"
+msgstr ""
+
+#: ../src/commands/edit/PasteEventsCommand.cpp:102
+msgid "Move existing events out of the way [\"open-n-paste\"]"
+msgstr ""
+
+#: ../src/commands/edit/PasteEventsCommand.cpp:104
+msgid "Overlay notes, tying against present notes [\"note-overlay\"]"
+msgstr ""
+
+#: ../src/commands/edit/PasteEventsCommand.cpp:106
+msgid "Overlay notes, ignoring present notes [\"matrix-overlay\"]"
+msgstr ""
+
+#: ../src/commands/edit/AddDotCommand.h:52
+#, fuzzy
+msgid "&Add Dot"
+msgstr "Lisa %1"
+
+#: ../src/commands/edit/RemoveMarkerCommand.h:55
+msgid "&Remove Marker"
+msgstr "&Eemalda märgis"
+
+#: ../src/commands/edit/EventUnquantizeCommand.cpp:43
+#: ../src/commands/edit/EventUnquantizeCommand.cpp:54
+msgid "Unquantize Events"
+msgstr "Eemalda sündmustelt kvantimine"
+
+#: ../src/commands/edit/ChangeVelocityCommand.h:53
+#, fuzzy
+msgid "&Increase Velocity"
+msgstr "Noodi kiirus:"
+
+#: ../src/commands/edit/ChangeVelocityCommand.h:54
+#, fuzzy
+msgid "&Reduce Velocity"
+msgstr "Noodi kiirus:"
+
+#: ../src/commands/edit/CopyCommand.cpp:46
+msgid "(excerpt)"
+msgstr ""
+
+#: ../src/commands/edit/CopyCommand.cpp:60
+msgid "(copied)"
+msgstr "(kopeeritud)"
+
+#: ../src/commands/edit/EventInsertionCommand.cpp:39
+msgid "Insert Event"
+msgstr "Lisa sündmus"
+
+#: ../src/commands/edit/InsertTriggerNoteCommand.cpp:55
+#, fuzzy
+msgid "Insert Trigger Note"
+msgstr "Noodi lisamine"
+
+#: ../src/commands/edit/CollapseNotesCommand.h:50
+msgid "Collapse &Equal-Pitch Notes"
+msgstr "Tõmba üh&ekõrgused noodid kokku"
+
+#: ../src/commands/edit/TransposeCommand.h:61
+msgid "&Up a Semitone"
+msgstr "Pooltoon &üles"
+
+#: ../src/commands/edit/TransposeCommand.h:62
+msgid "&Down a Semitone"
+msgstr "Pooltoon &alla"
+
+#: ../src/commands/edit/TransposeCommand.h:63
+msgid "Up an &Octave"
+msgstr "Oktav ü&les"
+
+#: ../src/commands/edit/TransposeCommand.h:64
+msgid "Down an Octa&ve"
+msgstr "Oktav &alla"
+
+#: ../src/commands/edit/TransposeCommand.h:65
+#, fuzzy
+msgid "&Transpose by Semitones..."
+msgstr "&Transponeeri..."
+
+#: ../src/commands/edit/SetNoteTypeCommand.h:56
+#, fuzzy
+msgid "&Set Note Type"
+msgstr "L&isa noot"
+
+#: ../src/commands/edit/EventEditCommand.h:55
+msgid "Edit E&vent"
+msgstr "Redigeeri s&ündmust"
+
+#: ../src/commands/edit/AddMarkerCommand.h:54
+msgid "&Add Marker"
+msgstr "&Lisa märgis"
+
+#: ../src/commands/edit/SelectionPropertyCommand.h:66
+#, fuzzy
+msgid "Set &Property"
+msgstr "Sündmuse omadused"
+
+#: ../src/commands/edit/CutCommand.h:55
+msgid "Cu&t"
+msgstr "&Lõika"
+
+#: ../src/commands/edit/EventQuantizeCommand.cpp:114
+msgid "Heuristic Notation &Quantize"
+msgstr "Heuristiline noodikirja &kvantimine"
+
+#: ../src/commands/edit/EventQuantizeCommand.cpp:116
+msgid "Grid &Quantize"
+msgstr ""
+
+#: ../src/commands/edit/ClearTriggersCommand.h:52
+#, fuzzy
+msgid "&Clear Triggers"
+msgstr "Puhasta joonlaud"
+
+#: ../src/commands/edit/RetrogradeCommand.h:51
+#, fuzzy
+msgid "&Retrograde"
+msgstr "Sa&lvestus"
+
+#: ../src/commands/edit/InvertCommand.h:51
+#, fuzzy
+msgid "&Invert"
+msgstr "L&isa noot"
+
+#: ../src/commands/edit/SetTriggerCommand.h:64
+#, fuzzy
+msgid "Tri&gger Segment"
+msgstr "Kustuta segment"
+
+#: ../src/commands/edit/SetLyricsCommand.h:50
+msgid "Edit L&yrics"
+msgstr "Redigeeri s&õnu"
+
+#: ../src/commands/edit/MoveAcrossSegmentsCommand.cpp:73
+msgid "&Move Events to Other Segment"
+msgstr ""
+
+#: ../src/commands/edit/RetrogradeInvertCommand.h:51
+msgid "Re&trograde Invert"
+msgstr ""
+
+#: ../src/commands/edit/ModifyMarkerCommand.h:55
+msgid "&Modify Marker"
+msgstr "&Muuda märgist"
+
+#: ../src/commands/studio/AddControlParameterCommand.h:61
+#, fuzzy
+msgid "&Add Control Parameter"
+msgstr "Instrumendi parameetrid"
+
+#: ../src/commands/studio/ModifyInstrumentMappingCommand.h:55
+msgid "Modify &Instrument Mapping"
+msgstr ""
+
+#: ../src/commands/studio/RemoveControlParameterCommand.h:60
+#, fuzzy
+msgid "&Remove Control Parameter"
+msgstr "Segmendi parameetrid"
+
+#: ../src/commands/studio/ReconnectDeviceCommand.h:55
+#, fuzzy
+msgid "Reconnect Device"
+msgstr "Kustuta seade"
+
+#: ../src/commands/studio/ModifyDeviceCommand.h:68
+#, fuzzy
+msgid "Modify &MIDI Bank"
+msgstr "MIDI &filtrite muutmine..."
+
+#: ../src/commands/studio/CreateOrDeleteDeviceCommand.h:68
+#, fuzzy
+msgid "Create Device"
+msgstr "Kustuta seade"
+
+#: ../src/commands/studio/ModifyDeviceMappingCommand.h:55
+msgid "Modify &Device Mapping"
+msgstr ""
+
+#: ../src/commands/studio/RenameDeviceCommand.h:55
+#, fuzzy
+msgid "Rename Device"
+msgstr "Nimeta fail ümber"
+
+#: ../src/commands/studio/ModifyControlParameterCommand.h:61
+#, fuzzy
+msgid "&Modify Control Parameter"
+msgstr "&Muuda märgist"
+
+#: ../src/commands/notation/TieNotesCommand.h:49
+#, fuzzy
+msgid "&Tie"
+msgstr "Aeg:"
+
+#: ../src/commands/notation/ClefInsertionCommand.cpp:74
+msgid "Add Cle&f Change..."
+msgstr "Lisa noodiv&õtme muutus..."
+
+#: ../src/commands/notation/GuitarChordInsertionCommand.cpp:40
+#, fuzzy
+msgid "Insert Guitar Chord"
+msgstr "Lisa paus"
+
+#: ../src/commands/notation/RespellCommand.cpp:47
+#, c-format
+msgid "Respell with %1"
+msgstr ""
+
+#: ../src/commands/notation/RespellCommand.cpp:50
+msgid "Do&uble Sharp"
+msgstr ""
+
+#: ../src/commands/notation/RespellCommand.cpp:52
+msgid "&Sharp"
+msgstr "&Diees"
+
+#: ../src/commands/notation/RespellCommand.cpp:54
+msgid "&Flat"
+msgstr "&Bemoll"
+
+#: ../src/commands/notation/RespellCommand.cpp:56
+msgid "Dou&ble Flat"
+msgstr ""
+
+#: ../src/commands/notation/RespellCommand.cpp:58
+msgid "&Natural"
+msgstr ""
+
+#: ../src/commands/notation/RespellCommand.cpp:60
+msgid "N&one"
+msgstr "&Puudub"
+
+#: ../src/commands/notation/RespellCommand.cpp:66
+#, fuzzy
+msgid "Respell Accidentals &Upward"
+msgstr "Juhuslike märkide tööriistriba"
+
+#: ../src/commands/notation/RespellCommand.cpp:69
+#, fuzzy
+msgid "Respell Accidentals &Downward"
+msgstr "Juhuslike märkide tööriistriba"
+
+#: ../src/commands/notation/RespellCommand.cpp:72
+#, fuzzy
+msgid "&Restore Accidentals"
+msgstr "&Juhuslikud märgid"
+
+#: ../src/commands/notation/RespellCommand.cpp:75
+#, fuzzy
+msgid "Respell Accidentals"
+msgstr "&Juhuslikud märgid"
+
+#: ../src/commands/notation/DeCounterpointCommand.h:55
+msgid "Split-and-Tie Overlapping &Chords"
+msgstr ""
+
+#: ../src/commands/notation/BeamCommand.h:49
+#, fuzzy
+msgid "&Beam Group"
+msgstr "&Grupeerimine"
+
+#: ../src/commands/notation/AddTextMarkCommand.h:51
+#, fuzzy
+msgid "Add Te&xt Mark..."
+msgstr "Lisa rajad..."
+
+#: ../src/commands/notation/RestoreSlursCommand.h:49
+#, fuzzy
+msgid "&Restore Slur Positions"
+msgstr "Taasta a&rvutatud noodivarred"
+
+#: ../src/commands/notation/SustainInsertionCommand.h:56
+msgid "Add Pedal &Press"
+msgstr ""
+
+#: ../src/commands/notation/SustainInsertionCommand.h:58
+msgid "Add Pedal &Release"
+msgstr ""
+
+#: ../src/commands/notation/FixNotationQuantizeCommand.h:49
+#, fuzzy
+msgid "Fi&x Notation Quantization"
+msgstr "Nootide kvantimise parandamine..."
+
+#: ../src/commands/notation/ChangeStemsCommand.h:51
+msgid "Stems &Up"
+msgstr "Noodivarred &üles"
+
+#: ../src/commands/notation/ChangeStemsCommand.h:51
+msgid "Stems &Down"
+msgstr "Noodivarred &alla"
+
+#: ../src/commands/notation/MakeAccidentalsCautionaryCommand.cpp:43
+#, fuzzy
+msgid "Use &Cautionary Accidentals"
+msgstr "&Juhuslikud märgid"
+
+#: ../src/commands/notation/MakeAccidentalsCautionaryCommand.cpp:45
+msgid "Cancel C&autionary Accidentals"
+msgstr ""
+
+#: ../src/commands/notation/SetVisibilityCommand.h:50
+msgid "Set Visibility"
+msgstr ""
+
+#: ../src/commands/notation/ChangeStyleCommand.h:53
+msgid "Change &Note Style"
+msgstr "Muuda &noodi stiili"
+
+#: ../src/commands/notation/TextInsertionCommand.cpp:41
+msgid "Insert Text"
+msgstr "Teksti lisamine"
+
+#: ../src/commands/notation/InterpretCommand.h:70
+msgid "&Interpret..."
+msgstr "&Interpreet..."
+
+#: ../src/commands/notation/TupletCommand.h:53
+#, fuzzy
+msgid "&Triplet"
+msgstr "Triool"
+
+#: ../src/commands/notation/TupletCommand.h:54
+#, fuzzy
+msgid "Tu&plet..."
+msgstr "&Interpreet..."
+
+#: ../src/commands/notation/UnTupletCommand.h:50
+#, fuzzy
+msgid "&Untuplet"
+msgstr " Üksus"
+
+#: ../src/commands/notation/CollapseRestsCommand.h:54
+msgid "&Collapse Rests"
+msgstr "&Tõmba pausid kokku"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:145
+msgid "Add S&lur"
+msgstr ""
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:147
+msgid "Add &Phrasing Slur"
+msgstr ""
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:149
+msgid "Add Double-Octave Up"
+msgstr ""
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:151
+msgid "Add Octave &Up"
+msgstr ""
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:153
+msgid "Add Octave &Down"
+msgstr ""
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:155
+msgid "Add Double Octave Down"
+msgstr ""
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:160
+#, fuzzy
+msgid "Add &Crescendo"
+msgstr "Crescendo lisamine..."
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:162
+#, fuzzy
+msgid "Add &Decrescendo"
+msgstr "Decrescendo lisamine..."
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:164
+#, fuzzy
+msgid "Add &Glissando"
+msgstr "Crescendo lisamine..."
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:167
+msgid "Add &%1%2"
+msgstr "Lisa &%1%2"
+
+#: ../src/commands/notation/RemoveNotationQuantizeCommand.h:49
+#, fuzzy
+msgid "Remo&ve Notation Quantization"
+msgstr "Nootide kvantimise parandamine..."
+
+#: ../src/commands/notation/MakeChordCommand.h:50
+msgid "Make &Chord"
+msgstr "Tekita a&kord"
+
+#: ../src/commands/notation/MultiKeyInsertionCommand.h:63
+#, fuzzy
+msgid "Change all to &Key %1..."
+msgstr "Muuda helisti&kuks %1..."
+
+#: ../src/commands/notation/KeyInsertionCommand.h:67
+#: ../src/commands/notation/MultiKeyInsertionCommand.h:65
+msgid "Add &Key Change..."
+msgstr "Lisa helisti&ku muutus..."
+
+#: ../src/commands/notation/RestoreStemsCommand.h:49
+#, fuzzy
+msgid "&Restore Stems"
+msgstr "Taasta a&rvutatud noodivarred"
+
+#: ../src/commands/notation/MakeNotesViableCommand.h:55
+#: ../src/commands/notation/MakeRegionViableCommand.h:52
+msgid "Tie Notes at &Barlines"
+msgstr ""
+
+#: ../src/commands/notation/AddSlashesCommand.h:46
+msgid "Slashes"
+msgstr ""
+
+#: ../src/commands/notation/ChangeSlurPositionCommand.h:51
+msgid "Slur &Above"
+msgstr ""
+
+#: ../src/commands/notation/ChangeSlurPositionCommand.h:51
+msgid "Slur &Below"
+msgstr ""
+
+#: ../src/commands/notation/NormalizeRestsCommand.h:54
+msgid "&Normalize Rests"
+msgstr "&Normaliseeri pausid"
+
+#: ../src/commands/notation/TextChangeCommand.cpp:41
+#, fuzzy
+msgid "Edit Text"
+msgstr "Sündmuse redigeerimine"
+
+#: ../src/commands/notation/RemoveMarksCommand.h:49
+#, fuzzy
+msgid "&Remove All Marks"
+msgstr "Eemalda kõik märgised"
+
+#: ../src/commands/notation/AutoBeamCommand.h:52
+#, fuzzy
+msgid "&Auto-Beam"
+msgstr "Automaatne salvestamine"
+
+#: ../src/commands/notation/UntieNotesCommand.h:49
+#, fuzzy
+msgid "&Untie"
+msgstr " Üksus"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:48
+msgid "S&forzando"
+msgstr "S&forzando"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:50
+msgid "Sta&ccato"
+msgstr "Sta&ccato"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:52
+msgid "R&inforzando"
+msgstr "R&inforzando"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:54
+msgid "T&enuto"
+msgstr "T&enuto"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:56
+msgid "Tri&ll"
+msgstr "Tri&ller"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:58
+msgid "Trill &with Line"
+msgstr ""
+
+#: ../src/commands/notation/AddMarkCommand.cpp:60
+#, fuzzy
+msgid "Trill Line"
+msgstr "Tri&ller"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:62
+msgid "&Turn"
+msgstr ""
+
+#: ../src/commands/notation/AddMarkCommand.cpp:64
+msgid "&Accent"
+msgstr "&Aktsent"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:66
+msgid "&Staccatissimo"
+msgstr "&Staccatissimo"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:68
+msgid "&Marcato"
+msgstr "&Marcato"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:70
+msgid "&Pause"
+msgstr "&Paus"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:72
+msgid "&Up-Bow"
+msgstr ""
+
+#: ../src/commands/notation/AddMarkCommand.cpp:74
+msgid "&Down-Bow"
+msgstr ""
+
+#: ../src/commands/notation/AddMarkCommand.cpp:76
+msgid "Mo&rdent"
+msgstr ""
+
+#: ../src/commands/notation/AddMarkCommand.cpp:78
+#, fuzzy
+msgid "Inverted Mordent"
+msgstr "Lisa sündmus"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:80
+msgid "Long Mordent"
+msgstr ""
+
+#: ../src/commands/notation/AddMarkCommand.cpp:82
+#, fuzzy
+msgid "Lon&g Inverted Mordent"
+msgstr "A&kordi lisamise režiim"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:84
+msgid "&%1%2"
+msgstr "&%1%2"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:89
+#, c-format
+msgid "Add %1"
+msgstr "Lisa %1"
+
+#: ../src/commands/notation/ResetDisplacementsCommand.h:49
+#, fuzzy
+msgid "Restore Positions"
+msgstr "Taasta a&rvutatud noodivarred"
+
+#: ../src/commands/notation/IncrementDisplacementsCommand.h:52
+#, fuzzy
+msgid "Fine Reposition"
+msgstr "Kursori asukoht"
+
+#: ../src/commands/notation/RestoreTiesCommand.h:49
+#, fuzzy
+msgid "&Restore Tie Positions"
+msgstr "Taasta a&rvutatud noodivarred"
+
+#: ../src/commands/notation/ChangeTiePositionCommand.h:47
+msgid "Tie &Above"
+msgstr ""
+
+#: ../src/commands/notation/ChangeTiePositionCommand.h:47
+msgid "Tie &Below"
+msgstr ""
+
+#: ../src/commands/notation/KeyInsertionCommand.h:65
+msgid "Change to &Key %1..."
+msgstr "Muuda helisti&kuks %1..."
+
+#: ../src/commands/notation/RemoveFingeringMarksCommand.h:49
+#, fuzzy
+msgid "&Remove Fingerings"
+msgstr "&Eemalda märgis"
+
+#: ../src/commands/notation/BreakCommand.h:49
+#, fuzzy
+msgid "&Unbeam"
+msgstr " Üksus"
+
+#: ../src/commands/notation/UnGraceCommand.h:48
+msgid "Ung&race"
+msgstr ""
+
+#: ../src/commands/notation/AddFingeringMarkCommand.cpp:45
+#, fuzzy
+msgid "Add Other &Fingering..."
+msgstr "Decrescendo lisamine..."
+
+#: ../src/commands/notation/AddFingeringMarkCommand.cpp:47
+#, fuzzy
+msgid "Add Fingering &0 (Thumb)"
+msgstr "Decrescendo lisamine..."
+
+#: ../src/commands/notation/AddFingeringMarkCommand.cpp:49
+#, fuzzy, c-format
+msgid "Add Fingering &%1"
+msgstr "Decrescendo lisamine..."
+
+#: ../src/document/io/HydrogenXMLHandler.cpp:277
+msgid " imported from Hydrogen "
+msgstr ""
+
+#: ../src/document/io/LilyPondExporter.cpp:404
+msgid ""
+"LilyPond does not allow spaces or backslashes in filenames.\n"
+"\n"
+"Would you like to use\n"
+"\n"
+" %1\n"
+"\n"
+" instead?"
+msgstr ""
+
+#: ../src/document/io/LilyPondExporter.cpp:2054
+msgid "warning: overlong bar truncated here"
+msgstr ""
+
+#: ../src/document/io/LilyPondExporter.cpp:2060
+msgid "warning: bar too short, padding with rests"
+msgstr ""
+
+#: ../src/document/MultiViewCommandHistory.cpp:318
+msgid "Nothing to undo"
+msgstr "Pole midagi tagasi võtta"
+
+#: ../src/document/MultiViewCommandHistory.cpp:320
+msgid "Nothing to redo"
+msgstr "Pole midagi uuesti teha"
+
+#: ../src/document/MultiViewCommandHistory.cpp:328
+#: ../src/document/MultiViewCommandHistory.cpp:372
+#, c-format
+msgid "Und&o %1"
+msgstr "V&õta tagasi %1"
+
+#: ../src/document/MultiViewCommandHistory.cpp:330
+#: ../src/document/MultiViewCommandHistory.cpp:374
+#, c-format
+msgid "Re&do %1"
+msgstr "&Tee uuesti %1"
+
+#: ../src/document/RosegardenGUIDoc.cpp:328
+msgid ""
+"The current file has been modified.\n"
+"Do you want to save it?"
+msgstr ""
+"Käesolevat faili on muudetud.\n"
+"Kas salvestada see?"
+
+#: ../src/document/RosegardenGUIDoc.cpp:480
+#, c-format
+msgid ""
+"_n: Delete the 1 audio file recorded during the unsaved session?\n"
+"Delete the %n audio files recorded during the unsaved session?"
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:501
+msgid ""
+"The following audio files were recorded during this session but have been "
+"unloaded\n"
+"from the audio file manager, and so are no longer in use in the document you "
+"are saving.\n"
+"\n"
+"You may want to clean up these files to save disk space.\n"
+"\n"
+"Please select any you wish to delete permanently from the hard disk.\n"
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:517
+#, c-format
+msgid ""
+"_n: <qt>About to delete 1 audio file permanently from the hard disk."
+"<br>There will be no way to recover this file.<br>Are you sure?</qt>\n"
+"\n"
+"<qt>About to delete %n audio files permanently from the hard disk.<br>There "
+"will be no way to recover these files.<br>Are you sure?</qt>"
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:580
+msgid "Can't open file '%1'"
+msgstr "Faili '%1' pole võimalik avada."
+
+#: ../src/document/RosegardenGUIDoc.cpp:585
+msgid "Reading file..."
+msgstr "Faili lugemine..."
+
+#: ../src/document/RosegardenGUIDoc.cpp:603
+#, fuzzy
+msgid "Could not open Rosegarden file"
+msgstr "See pole Rosegarden-4 fail"
+
+#: ../src/document/RosegardenGUIDoc.cpp:641
+msgid "Error when parsing file '%1': \"%2\""
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:689
+msgid "Generating audio previews..."
+msgstr "Audio eelvaatluste genereerimine..."
+
+#: ../src/document/RosegardenGUIDoc.cpp:721
+msgid "Merge"
+msgstr "Liida"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1605
+msgid "File load cancelled"
+msgstr "Faili laadimine katkestatud"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1625
+msgid ""
+"<h3>Audio and plugins not available</h3><p>This composition uses audio files "
+"or plugins, but Rosegarden is currently running without audio because the "
+"JACK audio server was not available on startup.</p><p>Please exit "
+"Rosegarden, start the JACK audio server and re-start Rosegarden if you wish "
+"to load this complete composition.</p><p><b>WARNING:</b> If you re-save this "
+"composition, all audio and plugin data and settings in it will be lost.</p>"
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:1628
+msgid ""
+"<h3>Audio and plugins not available</h3><p>This composition uses audio files "
+"or plugins, but you are running a version of Rosegarden that was compiled "
+"without audio support.</p><p><b>WARNING:</b> If you re-save this composition "
+"from this version of Rosegarden, all audio and plugin data and settings in "
+"it will be lost.</p>"
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:1665
+msgid ""
+"<h3>Incorrect audio sample rate</h3><p>This composition contains audio files "
+"that were recorded or imported with the audio server running at a different "
+"sample rate (%1 Hz) from the current JACK server sample rate (%2 Hz).</"
+"p><p>Rosegarden will play this composition at the correct speed, but any "
+"audio files in it will probably sound awful.</p><p>Please consider re-"
+"starting the JACK server at the correct rate (%3 Hz) and re-loading this "
+"composition before you do any more work with it.</p>"
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:1675
+msgid ""
+"<h3>Inconsistent audio sample rates</h3><p>This composition contains audio "
+"files at more than one sample rate.</p><p>Rosegarden will play them at the "
+"correct speed, but any audio files that were recorded or imported at rates "
+"different from the current JACK server sample rate (%1 Hz) will probably "
+"sound awful.</p><p>Please see the audio file manager dialog for more "
+"details, and consider resampling any files that are at the wrong rate.</p>"
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:1676
+#, fuzzy
+msgid "Inconsistent sample rates"
+msgstr "Instrumendi parameetrid"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1690
+msgid ""
+"<h3>Plugins not found</h3><p>The following audio plugins could not be loaded:"
+"</p><ul>"
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:1698
+msgid "<li>%1 (from %2)</li>"
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:1712
+msgid ""
+"This file contains one or more old element types that are now deprecated.\n"
+"Support for these elements may disappear in future versions of Rosegarden.\n"
+"We recommend you re-save this file from this version of Rosegarden to ensure "
+"that it can still be re-loaded in future versions."
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:2207
+msgid "Insert Recorded MIDI"
+msgstr "Lisa salvestatud MIDI"
+
+#: ../src/document/RosegardenGUIDoc.cpp:2560
+msgid "%1 (recorded)"
+msgstr ""
+
+#: ../src/document/RoseXmlHandler.cpp:442
+msgid ""
+"This file was written by Rosegarden %1, and it uses\n"
+"a different file format that cannot be read by this version."
+msgstr ""
+
+#: ../src/document/RoseXmlHandler.cpp:452
+msgid ""
+"This file was written by Rosegarden %1, which is more recent than this "
+"version.\n"
+"There may be some incompatibilities with the file format."
+msgstr ""
+
+#: ../src/document/RoseXmlHandler.cpp:1687
+#, fuzzy
+msgid "Loading plugins..."
+msgstr "Pluginate nummerdamine..."
+
+#: rc.cpp:6 rc.cpp:144
+#, fuzzy, no-c-format
+msgid "Se&gment"
+msgstr "Seg&mendid"
+
+#: rc.cpp:9 rc.cpp:84 rc.cpp:147 rc.cpp:303
+#, fuzzy, no-c-format
+msgid "Edit &With"
+msgstr "Sõnade redigeerimine"
+
+#: rc.cpp:12 rc.cpp:21 rc.cpp:30 rc.cpp:39 rc.cpp:345
+#, no-c-format
+msgid "Actions Toolbar"
+msgstr "Tegevuste tööriistariba"
+
+#: rc.cpp:15 rc.cpp:33 rc.cpp:129 rc.cpp:285
+#, fuzzy, no-c-format
+msgid "Time Toolbar"
+msgstr "Noodivõtmete tööriistariba"
+
+#: rc.cpp:18 rc.cpp:36 rc.cpp:57 rc.cpp:63 rc.cpp:120 rc.cpp:243 rc.cpp:342
+#, no-c-format
+msgid "Transport Toolbar"
+msgstr "Transpordi tööriistariba"
+
+#: rc.cpp:24 rc.cpp:42 rc.cpp:123 rc.cpp:348
+#, fuzzy, no-c-format
+msgid "Zoom Toolbar"
+msgstr "Näita &suurenduse tööriistariba"
+
+#: rc.cpp:45 rc.cpp:60 rc.cpp:99 rc.cpp:228 rc.cpp:327
+#, fuzzy, no-c-format
+msgid "T&ransport"
+msgstr "Transponeerimine"
+
+#: rc.cpp:51
+#, fuzzy, no-c-format
+msgid "Number of Stereo &Inputs"
+msgstr "JACK audio sisendite arv"
+
+#: rc.cpp:54
+#, fuzzy, no-c-format
+msgid "&Number of Submasters"
+msgstr "JACK audio sisendite arv"
+
+#: rc.cpp:66
+#, no-c-format
+msgid "&Import"
+msgstr "&Impordi"
+
+#: rc.cpp:69
+#, no-c-format
+msgid "&Merge"
+msgstr "Ü&henda"
+
+#: rc.cpp:72
+#, no-c-format
+msgid "&Export"
+msgstr "&Ekspordi"
+
+#: rc.cpp:75 rc.cpp:141 rc.cpp:297
+#, fuzzy, no-c-format
+msgid "&Composition"
+msgstr "Kursori asukoht"
+
+#: rc.cpp:78
+#, no-c-format
+msgid "&Studio"
+msgstr "&Stuudio"
+
+#: rc.cpp:81
+#, fuzzy, no-c-format
+msgid "Se&gments"
+msgstr "Seg&mendid"
+
+#: rc.cpp:90
+#, no-c-format
+msgid "Trac&ks"
+msgstr "&Rajad"
+
+#: rc.cpp:93
+#, fuzzy, no-c-format
+msgid "Set &Instrument"
+msgstr "Sea instrument"
+
+#: rc.cpp:102 rc.cpp:234 rc.cpp:333
+#, fuzzy, no-c-format
+msgid "&Toolbars"
+msgstr "Noodivõtmete tööriistariba"
+
+#: rc.cpp:105 rc.cpp:237 rc.cpp:336
+#, fuzzy, no-c-format
+msgid "&Rulers"
+msgstr "Näita &joonlaudu"
+
+#: rc.cpp:111 rc.cpp:240 rc.cpp:339
+#, no-c-format
+msgid "Tools Toolbar"
+msgstr "Tööriistade tööriistariba"
+
+#: rc.cpp:114
+#, no-c-format
+msgid "Tracks Toolbar"
+msgstr "Radade tööriistariba"
+
+#: rc.cpp:117
+#, no-c-format
+msgid "Editors Toolbar"
+msgstr "Redaktori tööriistariba"
+
+#: rc.cpp:135
+#, fuzzy, no-c-format
+msgid "&Layout Mode"
+msgstr "Paigutus"
+
+#: rc.cpp:138 rc.cpp:294
+#, fuzzy, no-c-format
+msgid "Add Event Ruler"
+msgstr "Sündmuste filter"
+
+#: rc.cpp:150
+#, fuzzy, no-c-format
+msgid "N&ote"
+msgstr "&Noodid"
+
+#: rc.cpp:153
+#, fuzzy, no-c-format
+msgid "Mar&ks"
+msgstr "&Rajad"
+
+#: rc.cpp:156
+#, fuzzy, no-c-format
+msgid "&Ornaments"
+msgstr "Seg&mendid"
+
+#: rc.cpp:159
+#, fuzzy, no-c-format
+msgid "&Fingerings"
+msgstr "Decrescendo lisamine..."
+
+#: rc.cpp:162
+#, fuzzy, no-c-format
+msgid "S&lashes"
+msgstr "Kõik failid"
+
+#: rc.cpp:165 rc.cpp:219
+#, no-c-format
+msgid "&Accidentals"
+msgstr "&Juhuslikud märgid"
+
+#: rc.cpp:168
+#, fuzzy, no-c-format
+msgid "&Phrase"
+msgstr "&Kustuta"
+
+#: rc.cpp:171
+#, fuzzy, no-c-format
+msgid "Slur &Position"
+msgstr "Kursori asukoht"
+
+#: rc.cpp:174
+#, fuzzy, no-c-format
+msgid "Tie &Position"
+msgstr "Kursori asukoht"
+
+#: rc.cpp:177
+#, fuzzy, no-c-format
+msgid "&Octaves"
+msgstr "Oktav &alla"
+
+#: rc.cpp:180 rc.cpp:306
+#, no-c-format
+msgid "Ad&just"
+msgstr ""
+
+#: rc.cpp:183
+#, fuzzy, no-c-format
+msgid "R&ests"
+msgstr "&Pausid"
+
+#: rc.cpp:186 rc.cpp:213
+#, no-c-format
+msgid "&Notes"
+msgstr "&Noodid"
+
+#: rc.cpp:189 rc.cpp:309
+#, fuzzy, no-c-format
+msgid "&Quantize"
+msgstr "Kvantimine"
+
+#: rc.cpp:195 rc.cpp:315
+#, fuzzy, no-c-format
+msgid "Trans&pose"
+msgstr "Transponeerimine"
+
+#: rc.cpp:198 rc.cpp:318
+#, no-c-format
+msgid "Convert"
+msgstr ""
+
+#: rc.cpp:201
+#, fuzzy, no-c-format
+msgid "&Fine Positioning"
+msgstr "Kursori asukoht"
+
+#: rc.cpp:204
+#, fuzzy, no-c-format
+msgid "Fine Ti&ming"
+msgstr "Decrescendo lisamine..."
+
+#: rc.cpp:207
+#, fuzzy, no-c-format
+msgid "&Visibility"
+msgstr "Kiirus:"
+
+#: rc.cpp:216
+#, no-c-format
+msgid "&Rests"
+msgstr "&Pausid"
+
+#: rc.cpp:222
+#, no-c-format
+msgid "&Clefs"
+msgstr "&Võtmed"
+
+#: rc.cpp:225 rc.cpp:324
+#, no-c-format
+msgid "Local &Cursor"
+msgstr ""
+
+#: rc.cpp:246
+#, no-c-format
+msgid "Notes Toolbar"
+msgstr "Nootide tööriistariba"
+
+#: rc.cpp:249
+#, no-c-format
+msgid "Rests Toolbar"
+msgstr "Pauside tööriistariba"
+
+#: rc.cpp:252
+#, no-c-format
+msgid "Clefs Toolbar"
+msgstr "Noodivõtmete tööriistariba"
+
+#: rc.cpp:255
+#, no-c-format
+msgid "Accidentals Toolbar"
+msgstr "Juhuslike märkide tööriistriba"
+
+#: rc.cpp:258
+#, no-c-format
+msgid "Group Toolbar"
+msgstr "Gruppide tööriistariba"
+
+#: rc.cpp:261
+#, fuzzy, no-c-format
+msgid "Marks Toolbar"
+msgstr "Radade tööriistariba"
+
+#: rc.cpp:264
+#, fuzzy, no-c-format
+msgid "Meta Toolbar"
+msgstr "Näita m&eta tööriistariba"
+
+#: rc.cpp:267
+#, fuzzy, no-c-format
+msgid "Layout Toolbar"
+msgstr "Näita &paigutuse tööriistariba"
+
+#: rc.cpp:270 rc.cpp:351
+#, fuzzy, no-c-format
+msgid "Control Ruler actions"
+msgstr "Audiofailide tegevused"
+
+#: rc.cpp:273 rc.cpp:354
+#, fuzzy, no-c-format
+msgid "Property Ruler actions"
+msgstr "Audiofailide tegevused"
+
+#: rc.cpp:276
+#, fuzzy, no-c-format
+msgid "&Action"
+msgstr "Suund"
+
+#: rc.cpp:279
+#, fuzzy, no-c-format
+msgid "General Toolbar"
+msgstr "Gruppide tööriistariba"
+
+#: rc.cpp:291
+#, fuzzy, no-c-format
+msgid "&Grid"
+msgstr " Võre: "
+
+#: rc.cpp:300
+#, fuzzy, no-c-format
+msgid "&Segment"
+msgstr "Seg&mendid"
+
+#: rc.cpp:361
+#, no-c-format
+msgid "Hide additional controls"
+msgstr ""
+
+#: rc.cpp:365
+#, no-c-format
+msgid "Panic Button"
+msgstr "Paanika nupp"
+
+#: rc.cpp:368
+#, no-c-format
+msgid "Resets all MIDI devices if you've got stuck notes"
+msgstr "Lähtestab kõik MIDI seadmed kui mõni noot on hangunud"
+
+#: rc.cpp:375
+#, no-c-format
+msgid "Provides a metronome click for you to play along with"
+msgstr ""
+
+#: rc.cpp:378
+#, no-c-format
+msgid "Shows MIDI activity in and out of Rosegarden"
+msgstr ""
+
+#: rc.cpp:381
+#, no-c-format
+msgid "IN"
+msgstr "IN"
+
+#: rc.cpp:384
+#, no-c-format
+msgid "OUT"
+msgstr "OUT"
+
+#: rc.cpp:387 rc.cpp:390
+#, no-c-format
+msgid "NO EVENTS"
+msgstr "NO EVENTS"
+
+#: rc.cpp:397
+#, no-c-format
+msgid "Record either MIDI or audio"
+msgstr "MIDI või audio salvestamine"
+
+#: rc.cpp:401
+#, no-c-format
+msgid "Loop"
+msgstr "Kordus"
+
+#: rc.cpp:404
+#, no-c-format
+msgid "Turn on and off the loop markers (if set)"
+msgstr ""
+
+#: rc.cpp:411
+#, no-c-format
+msgid "Mutes all but the currently selected track"
+msgstr "Vaigistab kõik rajad peale aktiivse"
+
+#: rc.cpp:415
+#, no-c-format
+msgid "Start loop or range here"
+msgstr ""
+
+#: rc.cpp:419
+#, no-c-format
+msgid "End loop or range here"
+msgstr ""
+
+#: rc.cpp:422
+#, no-c-format
+msgid "SIG"
+msgstr ""
+
+#: rc.cpp:425
+#, fuzzy, no-c-format
+msgid "DIV"
+msgstr "IV"
+
+#: rc.cpp:428
+#, no-c-format
+msgid "/16"
+msgstr ""
+
+#: rc.cpp:431
+#, no-c-format
+msgid "TEMPO"
+msgstr ""
+
+#: rc.cpp:434
+#, no-c-format
+msgid "END"
+msgstr ""
+
+#: rc.cpp:437
+#, no-c-format
+msgid "BAR"
+msgstr ""
+
+#: rc.cpp:441
+#, no-c-format
+msgid "Switch between real time, musical time, and frame count"
+msgstr ""
+
+#: rc.cpp:445
+#, no-c-format
+msgid "Show additional controls"
+msgstr ""
+
+#: rc.cpp:449
+#, no-c-format
+msgid "Rewind"
+msgstr "Tagasi kerimine"
+
+#: rc.cpp:452
+#, no-c-format
+msgid "Moves the current pointer position back one bar."
+msgstr "Liigutab kursori asukoha ühe takti võrra tagasi."
+
+#: rc.cpp:456
+#, no-c-format
+msgid "Rewind to beginning"
+msgstr "Tagasikerimine algusesse"
+
+#: rc.cpp:459
+#, no-c-format
+msgid ""
+"Moves the pointer position to the start of the composition. (This may mean "
+"going forwards if the pointer is currently before the start.)"
+msgstr ""
+"Liigutab kursori kompositsiooni algusese. (See võib tähendada edasi "
+"liigutamist kui kursor asub eespool algust.)"
+
+#: rc.cpp:463
+#, no-c-format
+msgid "Play/Pause"
+msgstr "Esita/paus"
+
+#: rc.cpp:466
+#, no-c-format
+msgid ""
+"Plays from the current pointer position, or pauses playback if already in "
+"progress."
+msgstr ""
+"Mahamängimine alates kursori asukohast või paus kui mahamängimine on "
+"aktiivne."
+
+#: rc.cpp:473
+#, no-c-format
+msgid "Stops playback or recording."
+msgstr "Peatab mahamängimise või salvestamise."
+
+#: rc.cpp:477
+#, no-c-format
+msgid "Fast forward"
+msgstr "Edasi kerimine"
+
+#: rc.cpp:480
+#, no-c-format
+msgid "Moves the current pointer position forwards one bar."
+msgstr "Liigutab aktiivse kursori ühe takti võrra edasi."
+
+#: rc.cpp:484
+#, no-c-format
+msgid "Fast forward to end"
+msgstr "Kiire kerimine lõppu"
+
+#: rc.cpp:487
+#, no-c-format
+msgid ""
+"Moves the pointer position to the end of the composition. (This may mean "
+"going backwards if the pointer is already beyond the end.)"
+msgstr ""
+"Liigutab kursori kompositsiooni lõppu. (See võib tähendada tagasi liikumist "
+"kui kursor on juba lõpust üle.)"
+
+#: rc.cpp:491
+#, no-c-format
+msgid "Display time to end"
+msgstr "Näita aega lõpuni"
+
+#: ../docs/en/tips.cpp:3
+msgid ""
+"<p>To configure a track to play using a particular instrument:</p>\n"
+"&nbsp;&nbsp;* click on the track label and hold a moment<br>\n"
+"&nbsp;&nbsp;* select an output device<br>\n"
+"&nbsp;&nbsp;* select one of that device's available instruments (#1 - #16)"
+"<br>\n"
+"&nbsp;&nbsp;* adjust that instrument's output channel, program, bank, and\n"
+"controllers via the instrument parameters box\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:13
+msgid ""
+"<p>...that Rosegarden has an autosave feature?<br><br>\n"
+"You can select your autosave interval from <b>Settings->Configure\n"
+"Rosegarden</b>.<br><br>\n"
+"When something goes awry, such as a power outage or a Rosegarden crash\n"
+"(unfortunately, it happens...) simply load the file you were working on, and "
+"you'll be given the\n"
+"option to load the autosaved version, or the unmodified original.</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:23
+msgid ""
+"<p>\n"
+"...that you can save the current document as your default studio by using\n"
+"<b>Composition -> Studio -> Save Current Document as Default Studio</b>?</"
+"p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:30
+msgid ""
+"<p>...that your default studio is a complete Rosegarden composition that "
+"gets\n"
+"loaded every time you create a new document or import a MIDI file?</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:36
+msgid ""
+"<p>...that your default studio can contain instrument assignments, document "
+"properties, LilyPond headers,\n"
+"and many other things?<br><br>The default studio is a complete Rosegarden "
+"composition, so it can contain anything that you may wish to have available "
+"in each\n"
+"new document you create.</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:43
+msgid ""
+"<p>...that Rosegarden will detect and create a default connection for ALSA "
+"soft\n"
+"synth applications that are started after Rosegarden is already running?</"
+"p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:49
+msgid ""
+"<p>...that you can make your default studio override that in every "
+"Rosegarden composition you load?<br><br>If your studio setup does not change "
+"very often, and you would prefer for\n"
+"the settings in your default studio to take precedence over whatever\n"
+"studio is saved with any files you happen to load, you can make your studio "
+"the default for everything using <b>Settings -> Configure Rosegarden ->\n"
+"MIDI -> Always use default studio when loading files</b>.</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:57
+msgid ""
+"<p>If you have accidentally recorded a segment so short that it does not\n"
+"appear on the canvas, which you can only hear during subsequent recording\n"
+"sessions, you can gain access to it by using <b>Composition -> Change\n"
+"Composition Start and End</b> and then setting the composition to start at a "
+"negative number.</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:65
+msgid ""
+"<p>...that if you place a note at the wrong pitch using the notation or "
+"matrix editor, you can move it one semitone at a time with the up and down "
+"arrow keys on your keyboard?</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:70
+msgid ""
+"<p>...that you can toggle stem directions in the notation editor by "
+"selecting\n"
+"one or more notes and using Ctrl-PageUp and Ctrl-PageDown?</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:76
+msgid ""
+"<p>...that you can change the accidental used for a note in the notation "
+"editor (without changing the pitch of the note) by selecting\n"
+"it and using the up and down arrow keys with both Ctrl and Shift pressed?</"
+"p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:82 ../docs/en/tips.cpp:93
+msgid ""
+"<p>...that you can hold down the Shift key while repositioning segments on "
+"the\n"
+"segment canvas in order to avoid the \"snap-to\" effect and exert finer "
+"control?</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:88
+msgid ""
+"<p>...that you can use the arrow tool to draw, move, and resize segments and "
+"events as well as to select them?<br><br>Drag a segment or event block to "
+"move it, drag the right edge of a block to resize it, and drag with the "
+"middle mouse button pressed to draw a new segment or event.<br><br>(Of "
+"course, the dedicated draw, move and resize tools are still quicker for "
+"repeated operations.)</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:99
+msgid ""
+"<p>...that you can hold down the Shift key while repositioning or resizing "
+"events in the\n"
+"matrix view in order to avoid the \"snap-to\" effect and exert finer control?"
+"</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:105
+msgid ""
+"<p>...that you can edit multiple segments on multiple tracks simultaneously "
+"in\n"
+"the notation editor? Simply select the segments, then use <b>Edit -> Open "
+"in Notation Editor</b>.</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:111
+msgid ""
+"<p>...that Rosegarden can export files for use by LilyPond, the high-quality "
+"score typesetting system?<br><br>\n"
+"From the <b>File</b> menu, navigate to <b>Export -> Export LilyPond File</"
+"b></p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:117
+msgid ""
+"<p>...that Rosegarden can print via LilyPond, the high-quality score "
+"typesetting system?<br><br>\n"
+"From the <b>File</b> menu, navigate to <b>Preview with LilyPond</b>. The "
+"file\n"
+"will be exported, rendered, and a preview will appear in KPDF, or one of\n"
+"several other PDF viewers, where it can then be printed as well.</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:125
+msgid ""
+"<p>...that if you use the quantizer from within the notation view, you can "
+"tell it to quantize only the timing used for notation -- making it possible "
+"to have good looking notation <b>and</b> a human MIDI performance?</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:130
+msgid ""
+"<p>...that you can change segment labels using the controls on the Segment "
+"Parameters box\n"
+"in the main window?</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:136
+msgid ""
+"<p>...that the number of tracks in new documents is based on the contents "
+"of\n"
+"your autoload.rg file?\n"
+"<br><br>\n"
+"Whether you prefer to start with three tracks or 43, create a document that\n"
+"contains the desired number of tracks, plus any other studio or document "
+"properties settings\n"
+"you wish to configure, and use <b>Composition -> Studio -> Save Current "
+"Document as Default\n"
+"Studio</b> to make this your new default.</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:147
+msgid ""
+"<p>...that you can change the name of a track by double clicking on the "
+"label? (The\n"
+"label must be visible for this to work.)</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:153
+msgid ""
+"<p>...that you can configure what happens when you double-click on a segment?"
+"<br><br>Go to <b>Settings -> Configure Rosegarden</b> and choose your "
+"preferred editing window under the <b>Behaviour</b> tab.</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:158
+msgid ""
+"<p>...that Rosegarden is being developed as a community effort with\n"
+"contributions from around the world?<br><br>\n"
+"The four most active developers live in London (England), Cannes, "
+"Barcelona,\n"
+"and... Christiansburg? (Christiansburg is a town of about 50,000 in\n"
+"southwestern Virginia, USA.)<br><br>\n"
+"We have had contributors from elsewhere in the US, UK, Spain, Mexico, "
+"Argentina, Germany,\n"
+"Sweden, Russia, Japan, Finland, and Italy, just to name a few...</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:169
+msgid ""
+"<p>...that Rosegarden is available in Spanish, French, German, Russian, "
+"Welsh, Swedish, Italian and Estonian\n"
+"translations? (Just to name a few.)<br><br>\n"
+"If you're interested in translating Rosegarden to another language, drop us "
+"a\n"
+"line at <b>[email protected]</b>.</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:177
+msgid ""
+"<p>...that you can change the total number of bars in the composition via\n"
+"<b>Composition -> Change Composition Start and End</b>?</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:183
+msgid ""
+"<p>...that you can see the difference between performance and display "
+"duration\n"
+"of duration-quantized notes in the notation editor?<br><br>\n"
+"Use <b>Settings -> Show Raw Note Ruler</b> to turn on this handy\n"
+"feature.<br><br>\n"
+"<i>Note that this feature does not work in page layout view.</i></p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:192
+msgid ""
+"<p>...that you can add tempo and time-signature changes by double-clicking "
+"on the values displayed in the transport window or tempo rulers?</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:197
+msgid ""
+"<p>...that the transport window can display musical time, sample frame "
+"count, and a visual metronome as well as real time?<br><br>Just click on the "
+"small button at the extreme top left of the window.</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:202
+msgid ""
+"<p>...that you can select all notes of a particular pitch in the matrix "
+"view, by shift-clicking on that pitch on the piano keyboard at the left?"
+"<br><br>If you shift-click-drag, you can select whole ranges too.</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:207
+msgid ""
+"<p>...that you can set a loop in the main window by clicking-and-dragging on "
+"the time ruler with Shift pressed?<br><br>(If the ruler isn't visible, use "
+"<b>Settings -> Show Rulers</b>.)</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:212
+msgid ""
+"<p>...that if you're editing a section in the matrix or notation view, you "
+"can\n"
+"set that section to loop while you edit it?<br><br>Select it and use "
+"<b>Tools ->\n"
+"Local Cursor -> Set Loop to Selection</b>, then hit Play.</p><br><br>\n"
+"<i>This feature does not work quite as well for compositions that include "
+"sampled\n"
+"audio.</i>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:221
+msgid ""
+"<p>...if you have more than one note or controller event at the same time, "
+"you\n"
+"can use the [ and ] keys to flip the stack of events around on the "
+"controller\n"
+"and velocity rulers in order to bring the item you wish to adjust into\n"
+"focus.</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:229
+msgid ""
+"<p>...that the notation view shows you notes using their display duration, "
+"while the\n"
+"matrix allows you to edit their performance duration?<br><br>\n"
+"<i>Be careful with tied notes in the matrix. It is not apparent that they "
+"are\n"
+"tied, and if you split up a pair of tied notes, subsequent notation views "
+"will\n"
+"be confused and unhappy. This is an old bug that has been on our TODO list\n"
+"for years. Sorry about that, folks. Patches welcome.</i>\n"
+"</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:240
+msgid ""
+"<p>If you're working with a human performance and you need to insert some "
+"new\n"
+"notes, these new notes will sound for their entire written duration. To "
+"blend\n"
+"these new notes into a human performance, select them, then use <b>Adjust -> "
+"Interpret...</b> \n"
+"from the notation view to interpret any marks and massage their "
+"performance\n"
+"durations to something less mechanical.</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:249
+msgid ""
+"<p>...that Rosegarden can export certain things to LilyPond that it cannot "
+"yet\n"
+"display within its own native interface?<br><br>These new directives can be "
+"inserted\n"
+"via the <b>T</b> text insert tool in the notation view.<br><br>\n"
+"Load the example files\n"
+"<b>lilypond-alternative-endings.rg</b> and <b>lilypond-directives.rg</b> for "
+"a\n"
+"demonstration of how to use the new exportable directives.<br><br>\n"
+"Use <b>File -> Preview with\n"
+"LilyPond</b> to see what they look like on the exported page.<br><br>\n"
+"<i>Be sure to turn on\n"
+"<b>Settings -> Show LilyPond Directives</b> and <b>Show Annotations</b> "
+"within\n"
+"the notation view.</i></p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:264
+msgid ""
+"<p>...that Rosegarden has track parameters allowing you to <b>Create "
+"segments with:</b> certain\n"
+"properties by default?<br><br>You can pre-select the clef, transposition, "
+"colour, and specify\n"
+"the highest and lowest playable notes (notes outside this range display in\n"
+"red by default). Then draw a segment with the pencil, or record one, and "
+"any\n"
+"new segments created on this track will take these properties as segment\n"
+"parameters.<br><br>\n"
+"<i>These parameters do not apply to audio tracks.</i></p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:275
+msgid ""
+"<p>...that Rosegarden has a database of preset parameters describing more "
+"than 300\n"
+"musical instruments from the real world, grouped into several convenient\n"
+"categories?<br><br>Each preset contains a clef, transposition, and playable "
+"range\n"
+"suggestions for both amateur and professional players.<br><br>Click the\n"
+"<b>Load</b> button in the new track parameters box to get started! <i>(If "
+"you\n"
+"do not see a <b>Load</b> button, be sure your parameter panel is set for\n"
+"tabbed mode, rather than stacked mode.)</i> <br><br> <i>(Special thanks to "
+"Magnus\n"
+"Johansson for assembling this extraordinary database.)</i></p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:287
+msgid ""
+"<p>...that when exporting to Lilypond, you can merge tracks that have the "
+"same name onto a single staff?<br><br>For example, if there are three voices "
+"in a single part, write each\n"
+"voice as an independent segment/staff, each on a separate track. Give all\n"
+"three tracks the same name, and select <b>[x] Merge tracks that have the "
+"same\n"
+"name</b> from the options dialog that appears when you export to, or "
+"preview\n"
+"with LilyPond.<br><br>\n"
+"<i>The tracks must have a non-default name for this to work.</i></p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:297
+msgid ""
+" \t \n"
+"<p>...that you can use the mouse wheel to scroll up and down, scroll left "
+"and right, and zoom in and out?<br><br>Just roll the wheel to scroll up or "
+"down. Hold Alt as well to scroll left or right, or hold Ctrl to zoom in and "
+"out.</p> \t \n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:303
+msgid ""
+" \t \n"
+"<p>...that you can time-stretch an audio segment -- stretching or squashing "
+"a\n"
+"sample to a different duration without changing its pitch -- just by\n"
+"dragging its right edge with the Ctrl key pressed?</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:311
+msgid ""
+" \t \n"
+"<p>...that you can add audio to your Rosegarden composition just by dragging "
+"an audio file from your file manager and dropping it on the Rosegarden "
+"segment canvas? (Make sure you drop it on an audio track!)<br><br>You can "
+"also drop audio files from Rosegarden's audio file manager window onto the "
+"segment canvas, and from other programs onto the audio file manager.</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:317
+msgid ""
+" \t \n"
+"<p>...that you can set the tempo to match the duration of an audio segment "
+"if you know it's an exact number of bars or beats long?<br><br>Just select "
+"the audio segment and use <b>Composition -> Tempo and Time Signature -> Set "
+"Tempo to Audio Segment Duration</b>.</p>\n"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:1
+msgid "Feta Pixmaps"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:2 ../data/fonts/mappings/fonts.cpp:7
+#, fuzzy
+msgid "GNU Lilypond"
+msgstr "Lilypond 2.0+"
+
+#: ../data/fonts/mappings/fonts.cpp:3 ../data/fonts/mappings/fonts.cpp:8
+msgid "Copyright (c) 1997--2003 Han-Wen Nienhuys and Jan Nieuwenhuizen"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:4 ../data/fonts/mappings/fonts.cpp:9
+#: ../data/fonts/mappings/fonts.cpp:14 ../data/fonts/mappings/fonts.cpp:19
+#: ../data/fonts/mappings/fonts.cpp:24 ../data/fonts/mappings/fonts.cpp:29
+#: ../data/fonts/mappings/fonts.cpp:34 ../data/fonts/mappings/fonts.cpp:39
+#: ../data/fonts/mappings/fonts.cpp:44 ../data/fonts/mappings/fonts.cpp:49
+#: ../data/fonts/mappings/fonts.cpp:54
+msgid "Chris Cannam"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:5 ../data/fonts/mappings/fonts.cpp:40
+msgid "pixmap"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:6
+msgid "Feta"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:10 ../data/fonts/mappings/fonts.cpp:15
+#: ../data/fonts/mappings/fonts.cpp:20 ../data/fonts/mappings/fonts.cpp:25
+#: ../data/fonts/mappings/fonts.cpp:30 ../data/fonts/mappings/fonts.cpp:35
+#: ../data/fonts/mappings/fonts.cpp:45 ../data/fonts/mappings/fonts.cpp:50
+#: ../data/fonts/mappings/fonts.cpp:55
+#, fuzzy
+msgid "scalable"
+msgstr "Väärtus"
+
+#: ../data/fonts/mappings/fonts.cpp:11
+msgid "Fughetta"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:12
+msgid ""
+"Created by Blake Hodgetts; freely redistributable. See http://www.efn.org/"
+"~bch/aboutfonts.html"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:13
+msgid "Copyright 1995-1999 Blake Hodgetts"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:16
+msgid "Inkpen"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:17
+msgid "Inkpen is part of Sibelius, but other fonts may use the same mappings."
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:18 ../data/fonts/mappings/fonts.cpp:28
+msgid "Copyright Sibelius Software Ltd"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:21
+#, fuzzy
+msgid "Maestro"
+msgstr "Metronoom"
+
+#: ../data/fonts/mappings/fonts.cpp:22
+msgid "Maestro is part of Finale, but other fonts use the same mappings."
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:23 ../data/fonts/mappings/fonts.cpp:33
+#, fuzzy
+msgid "Copyright Coda Inc"
+msgstr "Autoriõigus:"
+
+#: ../data/fonts/mappings/fonts.cpp:27
+msgid "Opus is part of Sibelius, but other fonts may use the same mappings."
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:31
+msgid "Petrucci"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:32
+msgid "Petrucci is part of Finale, but other fonts use the same mappings."
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:36
+msgid "RG21"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:37
+#, fuzzy
+msgid "Rosegarden 2.1"
+msgstr "Rosegarden"
+
+#: ../data/fonts/mappings/fonts.cpp:38
+msgid "Copyright (c) 1994--2001 Chris Cannam"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:41
+#, fuzzy
+msgid "Sonata"
+msgstr " Font: "
+
+#: ../data/fonts/mappings/fonts.cpp:42
+#, fuzzy
+msgid "Adobe"
+msgstr "Audio"
+
+#: ../data/fonts/mappings/fonts.cpp:43
+#, fuzzy
+msgid "Copyright Adobe Inc"
+msgstr "Autoriõigus:"
+
+#: ../data/fonts/mappings/fonts.cpp:46
+msgid "Steinberg"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:47
+msgid "The Steinberg Notation font is part of Cubase."
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:48
+#, fuzzy
+msgid "Copyright Steinberg Inc"
+msgstr "Autoriõigus:"
+
+#: ../data/fonts/mappings/fonts.cpp:51
+msgid "Xinfonia"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:52
+msgid "xemo.org"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:53
+msgid "Copyright 2001-2003 Xemus Software LLC"
+msgstr ""
+
+#: ../data/styles/styles.cpp:1
+msgid "Classical"
+msgstr ""
+
+#: ../data/styles/styles.cpp:2
+#, fuzzy
+msgid "Cross"
+msgstr "Vali..."
+
+#: ../data/styles/styles.cpp:3
+#, fuzzy
+msgid "Mensural"
+msgstr "Üldine"
+
+#: ../data/styles/styles.cpp:4
+#, fuzzy
+msgid "Triangle"
+msgstr "Triool"
+
+#, fuzzy
+#~ msgid "Set Quick Marker"
+#~ msgstr "Kustuta märgis"
+
+#, fuzzy
+#~ msgid "LilyPond previews not available"
+#~ msgstr "Lilypond'i ekpordi seadistused"
+
+#, fuzzy
+#~ msgid "Audio file importer not available"
+#~ msgstr "Audiofailide asukoht:"
+
+#~ msgid " Triplet"
+#~ msgstr " Triool"
+
+#~ msgid "Marker name "
+#~ msgstr "Märgise nimi "
+
+#, fuzzy
+#~ msgid "Time Signature font"
+#~ msgstr "Taktimõõt"
+
+#, fuzzy
+#~ msgid "Halving speed..."
+#~ msgstr "Faili salvestamine..."
+
+#, fuzzy
+#~ msgid "Doubling speed..."
+#~ msgstr "Valiku kustutamine..."
+
+#, fuzzy
+#~ msgid "Make &Grace Notes"
+#~ msgstr "Märgise nimi "
+
+#, fuzzy
+#~ msgid "Change Te&mpo..."
+#~ msgstr "Muuda segmendi värvi..."
+
+#, fuzzy
+#~ msgid "&Restore Computed Accidentals"
+#~ msgstr "Taasta a&rvutatud noodivarred"
+
+#, fuzzy
+#~ msgid "LilyPond export/preview options"
+#~ msgstr "Lilypond'i ekpordi seadistused"
+
+#, fuzzy
+#~ msgid "LilyPond 2.6"
+#~ msgstr "Lilypond 2.0+"
+
+#, fuzzy
+#~ msgid "LilyPond 2.8"
+#~ msgstr "Lilypond 2.0+"
+
+#, fuzzy
+#~ msgid "LilyPond 2.12"
+#~ msgstr "Lilypond 2.0+"
+
+#~ msgid "Export Document Properties as \\header block"
+#~ msgstr "Dokumendi omadused eksporditakse \\header plokiks"
+
+#, fuzzy
+#~ msgid "prime"
+#~ msgstr "Aeg:"
+
+#, fuzzy
+#~ msgid " and 1 octave"
+#~ msgstr "Oktavi võrra üles"
+
+#, fuzzy
+#~ msgid " and %1 octaves"
+#~ msgstr "Oktavi võrra üles"
+
+#, fuzzy
+#~ msgid "Transpose by Interval"
+#~ msgstr "Transponeerimine"
+
+#, fuzzy
+#~ msgid "Manage Files Associated with A&udio Segments"
+#~ msgstr "A&udiosegmentide manageerimine"
+
+#, fuzzy
+#~ msgid "&Add Multiple Tracks..."
+#~ msgstr "Lis&a rajad..."
+
+#, fuzzy
+#~ msgid "Split Segments at Time"
+#~ msgstr "Näita &segmentide parameetreid"
+
+#, fuzzy
+#~ msgid "Split Segment at Time"
+#~ msgstr "Näita &segmentide parameetreid"
+
+#, fuzzy
+#~ msgid "Add Multiple Tracks"
+#~ msgstr "&Kustuta rada"
+
+#~ msgid "Event List"
+#~ msgstr "Sündmuste nimekiri"
+
+#~ msgid "External Editors"
+#~ msgstr "Välised redaktorid"
+
+#, fuzzy
+#~ msgid "Enable auto-save"
+#~ msgstr "Automaatne salvestamine"
+
+#~ msgid "Auto-save"
+#~ msgstr "Automaatne salvestamine"
+
+#~ msgid "Show detailed status"
+#~ msgstr "Näita detailset staatust"
+
+#~ msgid "JACK command (including path as necessary)"
+#~ msgstr "JACK käsk (ka rada, kui vajalik)"
+
+#, fuzzy
+#~ msgid "Audio file read buffer"
+#~ msgstr "Audiofailide asukoht:"
+
+#, fuzzy
+#~ msgid "Audio file write buffer"
+#~ msgstr "Audiofailide asukoht:"
+
+#, fuzzy
+#~ msgid "Per-file limit for cacheable audio files"
+#~ msgstr "Audiofaili valimine"
+
+#, fuzzy
+#~ msgid "20 msec"
+#~ msgstr "msek:"
+
+#, fuzzy
+#~ msgid "5 sec"
+#~ msgstr "msek:"
+
+#, fuzzy
+#~ msgid "per file"
+#~ msgstr "Faili avamine"
+
+#, fuzzy
+#~ msgid "Low latency"
+#~ msgstr "Latents"
+
+#, fuzzy
+#~ msgid "Record and Mix"
+#~ msgstr "Salvestavad seadmed"
+
+#~ msgid "JACK transport mode"
+#~ msgstr "JACK transpordi režiim"
+
+#~ msgid "Synchronisation"
+#~ msgstr "Sünkroniseerimine"
+
+#, fuzzy
+#~ msgid "%1 msec"
+#~ msgstr "%1 ms"
+
+#, fuzzy
+#~ msgid "%1 sec"
+#~ msgstr "%1 ms"
+
+#, fuzzy
+#~ msgid "%1 KB"
+#~ msgstr "%1 ms"
+
+#, fuzzy
+#~ msgid "%1 MB"
+#~ msgstr "%1 ms"
+
+#, fuzzy
+#~ msgid "Other fonts"
+#~ msgstr "Muu"
+
+#~ msgid "Sequencer"
+#~ msgstr "Sekventser"
+
+#~ msgid "Sequencer Settings"
+#~ msgstr "Sekventseri seadistused"
+
+#, fuzzy
+#~ msgid "Fade in"
+#~ msgstr "Eestpoolt lugemine (millisekundites)"
+
+#, fuzzy
+#~ msgid "Range"
+#~ msgstr "Triool"
+
+#, fuzzy
+#~ msgid "High: ---"
+#~ msgstr "Kõrge"
+
+#, fuzzy
+#~ msgid " ms"
+#~ msgstr "%1 ms"
+
+#, fuzzy
+#~ msgid "&Fretboard"
+#~ msgstr "Keri &edasi"
+
+#, fuzzy
+#~ msgid "Restore &Computed Positions"
+#~ msgstr "Taasta a&rvutatud noodivarred"
+
+#, fuzzy
+#~ msgid "&Tempo and Time Signature"
+#~ msgstr "Ava sündmuse redaktoris"
+
+#, fuzzy
+#~ msgid "&Split..."
+#~ msgstr "&Tükelda"
+
+#, fuzzy
+#~ msgid "&Editor Tools"
+#~ msgstr "Redaktori tööriistariba"
+
+#, fuzzy
+#~ msgid "&Beams"
+#~ msgstr "Biit"
+
+#, fuzzy
+#~ msgid "&Indications"
+#~ msgstr "Suund"
+
+#~ msgid "S&tem Direction"
+#~ msgstr "Noodivar&te suund"
+
+#, fuzzy
+#~ msgid "&Clear"
+#~ msgstr "Noodivõti"
+
+#, fuzzy
+#~ msgid "C&ancel"
+#~ msgstr "Kanal"
+
+#, fuzzy
+#~ msgid "Toggle &Mode"
+#~ msgstr "täisnoot"
+
+#, fuzzy
+#~ msgid "Scale"
+#~ msgstr "Väärtus"
+
+#, fuzzy
+#~ msgid "Modifier"
+#~ msgstr "&Muuda märgist"
+
+#, fuzzy
+#~ msgid "&New"
+#~ msgstr "Uus"
+
+#, fuzzy
+#~ msgid "Fingering"
+#~ msgstr "Decrescendo lisamine..."
+
+#, fuzzy
+#~ msgid "LilyPond 2.4"
+#~ msgstr "Lilypond 2.0+"
+
+#~ msgid "Paper size to use in \\paper block"
+#~ msgstr "Paberi suurus (kasutatakse plokis \\paper)"
+
+#, fuzzy
+#~ msgid "LilyPond font size"
+#~ msgstr "Lilypondi fondi suurus"
+
+#~ msgid "Do not export muted tracks"
+#~ msgstr "Vaigistatud radasid ei ekspordita"
+
+#~ msgid "&Select"
+#~ msgstr "&Vali"
+
+#, fuzzy
+#~ msgid "%1 (%2.%3s)"
+#~ msgstr "Aeg: %1 (%2.%3s)"
+
+#, fuzzy
+#~ msgid "%1 (%2): %3"
+#~ msgstr "&%1%2"
+
+#~ msgid "Getting sound driver status..."
+#~ msgstr "Helidraiveri staatuse info hankimine..."
+
+#, fuzzy
+#~ msgid "Cannot add file %1: %2"
+#~ msgstr "Faili %1 pole võimalik avada"
+
+#, fuzzy
+#~ msgid "Enable"
+#~ msgstr "Lõppväärtus"
+
+#~ msgid "from:"
+#~ msgstr "kust:"
+
+#~ msgid "to:"
+#~ msgstr "kuhu:"
+
+#~ msgid "unlimited"
+#~ msgstr "piiramatu"
+
+#~ msgid "Number:"
+#~ msgstr "Number:"
+
+#~ msgid "Value:"
+#~ msgstr "Väärtus:"
+
+#, fuzzy
+#~ msgid "Wheel Events"
+#~ msgstr "Muuda sündmuste suurust"
+
+#~ msgid "Amount:"
+#~ msgstr "Kogus:"
+
+#, fuzzy
+#~ msgid "Pitch from"
+#~ msgstr "Helikõrgus"
+
+#, fuzzy
+#~ msgid "Pitch to"
+#~ msgstr "Helikõrgus"
+
+#, fuzzy
+#~ msgid "High: %1"
+#~ msgstr "Kõrge"
+
+#, fuzzy
+#~ msgid "&Velocity"
+#~ msgstr "Kiirus:"
+
+#~ msgid "Time: %1"
+#~ msgstr "Aeg: %1"
+
+#, fuzzy
+#~ msgid "Recording Channel:"
+#~ msgstr "Faili lugemine..."
+
+#, fuzzy
+#~ msgid "Finnish translation"
+#~ msgstr "Sünkroniseerimine"
+
+#, fuzzy
+#~ msgid "Segment & Instrument Parameters"
+#~ msgstr "Näita &instrumentide parameetreid"
+
+#, fuzzy
+#~ msgid "Pre&view Lilypond file..."
+#~ msgstr "Lilypond faili eksport..."
+
+#, fuzzy
+#~ msgid "Show Se&gment and Instrument Parameters"
+#~ msgstr "Näita &instrumentide parameetreid"
+
+#, fuzzy
+#~ msgid "&Split or Join"
+#~ msgstr "&Tükeldamine vaikuse kohalt"
+
+#~ msgid "Lilypond 1.6 or 1.8"
+#~ msgstr "Lilypond 1.6 või 1.8"
+
+#, fuzzy
+#~ msgid "Lilypond 2.0"
+#~ msgstr "Lilypond 2.0+"
+
+#, fuzzy
+#~ msgid "You can't yet resize an audio segment!"
+#~ msgstr "Audiosegmente ei saa ühendada"
+
+#, fuzzy
+#~ msgid " 1 event selected "
+#~ msgstr " %1 sündmus%2 valitud "
+
+#, fuzzy
+#~ msgid "%1 - 1 Segment - %2"
+#~ msgstr "Kestvus"
+
+#, fuzzy
+#~ msgid "1 Input"
+#~ msgstr "%1 trioolid"
+
+#, fuzzy
+#~ msgid "1 Submaster"
+#~ msgstr "Näita &joonlaudu"
+
+#, fuzzy
+#~ msgid "1 pixel"
+#~ msgstr "%1 piksel"
+
+#, fuzzy
+#~ msgid "%1 - Segment - Notation"
+#~ msgstr "Kestvus"
+
+#, fuzzy
+#~ msgid "%1 on 1 track"
+#~ msgstr "Oktavi võrra alla"
+
+#, fuzzy
+#~ msgid "Set Tempo"
+#~ msgstr "Globaalse tempo seadmine"
+
+#, fuzzy
+#~ msgid "Modify Tempo"
+#~ msgstr "Muuda nooti"
+
+#, fuzzy
+#~ msgid "is currently"
+#~ msgstr "Aktiivne"
+
+#, fuzzy
+#~ msgid "PitchRuler"
+#~ msgstr "Helikõrgus"
+
+#, fuzzy
+#~ msgid "&Delete"
+#~ msgstr "&Kustuta"
+
+#, fuzzy
+#~ msgid "Stop"
+#~ msgstr "&Stopp"
+
+#, fuzzy
+#~ msgid "Copy"
+#~ msgstr "Autoriõigus:"
+
+#, fuzzy
+#~ msgid "Default"
+#~ msgstr "<vaikeväärtus>"
+
+#, fuzzy
+#~ msgid "Delete All"
+#~ msgstr "Vali &kõik"
+
+#, fuzzy
+#~ msgid "Add"
+#~ msgstr "..."
+
+#, fuzzy
+#~ msgid "No"
+#~ msgstr "Noot"
+
+#, fuzzy
+#~ msgid "&Copy"
+#~ msgstr "&Stopp"
+
+#, fuzzy
+#~ msgid "&Paste"
+#~ msgstr "&Paus"
+
+#, fuzzy
+#~ msgid "About"
+#~ msgstr "Kogus:"
+
+#, fuzzy
+#~ msgid "Configure"
+#~ msgstr "Rosegarden"
+
+#, fuzzy
+#~ msgid "Untitled"
+#~ msgstr "<nimetu>"
+
+#, fuzzy
+#~ msgid "&View"
+#~ msgstr "Aeg:"
+
+#, fuzzy
+#~ msgid "&Tools"
+#~ msgstr "Noodivõtmete tööriistariba"
+
+#~ msgid "Tracks to add"
+#~ msgstr "Lisatavate radade arv"
+
+#~ msgid "%1 pixels"
+#~ msgstr "%1 pikslit"
+
+#, fuzzy
+#~ msgid "Re&label"
+#~ msgstr "&Nimeta ümber..."
+
+#~ msgid "Start Value"
+#~ msgstr "Algväärtus"
+
+#~ msgid "End Value"
+#~ msgstr "Lõppväärtus"
+
+#, fuzzy
+#~ msgid "Audio record level"
+#~ msgstr "Lisa salvestav seade"
+
+#, fuzzy
+#~ msgid "Rec"
+#~ msgstr "Salvesta"
+
+#, fuzzy
+#~ msgid "Default timing: "
+#~ msgstr "Vaikesamm"
+
+#, fuzzy
+#~ msgid "Minutes of audio recording:"
+#~ msgstr "Audio salvestamise aeg minutites"
+
+#~ msgid "Show Tip of the &Day"
+#~ msgstr "Näita &päeva nõuandeid"
+
+#, fuzzy
+#~ msgid "&Quantize Notes"
+#~ msgstr "Kvantimise tüüp:"
+
+#~ msgid "Default proportion"
+#~ msgstr "Vaikeproportsioonid"
+
+#~ msgid "MMC transport mode"
+#~ msgstr "MMC transpordi režiim"
+
+#~ msgid "Sending MIDI panic..."
+#~ msgstr "MIDI paanika saatmine..."
+
+#~ msgid "Can't determine free disk space."
+#~ msgstr "Vaba kettaruumi pole võimalik kindlaks teha."
+
+#~ msgid "Couldn't extract disk space information."
+#~ msgstr "Ketta kasutuse kohta pole võimalik infot hankida."
+
+#~ msgid "Audio File actions"
+#~ msgstr "Audiofailide tegevused"
+
+#~ msgid "Remove Audio File"
+#~ msgstr "Eemalda audiofail"
+
+#~ msgid "Directory doesn't exist."
+#~ msgstr "Kataloogi ei eksisteeri."
+
+#, fuzzy
+#~ msgid "Wheel"
+#~ msgstr "Ratas"
+
+#~ msgid "Playback (in ms)"
+#~ msgstr "Mahamängimine (millisekundites)"
+
+#~ msgid ""
+#~ "Sequencer command line options\n"
+#~ " (takes effect only from next restart)"
+#~ msgstr ""
+#~ "Sekventseri käsurea võtmed\n"
+#~ " (rakendatakse järgmisel käivitamisel)"
+
+#~ msgid "Clear down all Rosegarden sequencer processes at restart"
+#~ msgstr "Käivitamisel puhastatakse kõik Rosegardeni sekventseri protsessid"
+
+#~ msgid "Manage MIDI Devices..."
+#~ msgstr "MIDI seadmete haldamine..."
+
+#~ msgid ""
+#~ "*.mid *.midi|Standard MIDI files\n"
+#~ "*|All files"
+#~ msgstr ""
+#~ "*.mid *.midi|Standard MIDI failid\n"
+#~ "*|Kõik failid"
diff --git a/po/eu.po b/po/eu.po
new file mode 100644
index 0000000..be24229
--- /dev/null
+++ b/po/eu.po
@@ -0,0 +1,12021 @@
+# translation of en.po to basque
+# This file is distributed under the same license as the PACKAGE package.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER.
+#
+#
+# David Garc�a-Abad, 2007.
+msgid ""
+msgstr ""
+"Project-Id-Version: eu\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-04-24 18:19-0400\n"
+"PO-Revision-Date: 2007-07-21 00:06+0100\n"
+"Last-Translator: David Garc�a-Abad\n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=iso-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ../src/gui/dialogs/RescaleDialog.cpp:51 rc.cpp:192 rc.cpp:312
+#, no-c-format
+msgid "Rescale"
+msgstr "Eskala Aldatu"
+
+#: ../src/gui/dialogs/RescaleDialog.cpp:56
+msgid "Duration of selection"
+msgstr "Selekzioaren iraupena"
+
+#: ../src/gui/dialogs/RescaleDialog.cpp:62
+msgid "Adjust times of following events accordingly"
+msgstr "Doitu gertaeren denborak gainjartzeak eta hutsuneak sortu gabe"
+
+#: ../src/gui/dialogs/PitchDialog.cpp:45
+#: ../src/gui/dialogs/RescaleDialog.cpp:72
+#: ../src/gui/dialogs/TimeDialog.cpp:51 ../src/gui/dialogs/TimeDialog.cpp:68
+#: ../src/gui/studio/BankEditorDialog.cpp:109
+msgid "Reset"
+msgstr "Hasieratu"
+
+#: ../src/commands/segment/SegmentSplitByPitchCommand.cpp:46
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:46
+msgid "Split by Pitch"
+msgstr "Zatitu tonuaren arabera"
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:54
+msgid "Starting split pitch"
+msgstr "Zatiketaren Hasierako Tonua"
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:57
+msgid "Range up and down to follow music"
+msgstr "Mugitu gora eta behera musika jarraitzeko"
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:63
+msgid "Duplicate non-note events"
+msgstr "Bikoiztu notak ez diren gertaerak"
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:66
+msgid "Clef handling:"
+msgstr "Klabeen kudeaketa:"
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:69
+msgid "Leave clefs alone"
+msgstr "Klabeak dauden bezala utzi"
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:70
+msgid "Guess new clefs"
+msgstr "Klabe berriak asmatu"
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:71
+msgid "Use treble and bass clefs"
+msgstr "Soprano eta Baxu klabeak erabili"
+
+#: ../src/gui/dialogs/DocumentConfigureDialog.cpp:64
+msgid "Document Properties"
+msgstr "Dokumentuaren Propietateak"
+
+#: ../src/gui/dialogs/MakeOrnamentDialog.cpp:45
+#: ../src/gui/editors/notation/NotationView.cpp:6048
+msgid "Make Ornament"
+msgstr "Apaindura Sortu"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:183
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:179
+#: ../src/gui/dialogs/EventEditDialog.cpp:128
+#: ../src/gui/dialogs/MakeOrnamentDialog.cpp:49
+#: ../src/gui/studio/DeviceEditorDialog.cpp:74
+#: ../src/gui/studio/NameSetEditor.cpp:72
+#: ../src/gui/widgets/ColourTable.cpp:51
+msgid "Name"
+msgstr "Izena"
+
+#: ../src/gui/dialogs/MakeOrnamentDialog.cpp:51
+msgid ""
+"The name is used to identify both the ornament\n"
+"and the triggered segment that stores\n"
+"the ornament's notes."
+msgstr ""
+"Bai apaindura eta baita apainduraren notak ere\n"
+"dauzkan aktibatutako segmentua identifikatzeko\n"
+"erabiltzen da izena."
+
+#: ../src/gui/dialogs/MakeOrnamentDialog.cpp:54
+msgid "Name: "
+msgstr "Izena: "
+
+#: ../src/gui/dialogs/MakeOrnamentDialog.cpp:57
+#: ../src/gui/editors/eventlist/EventView.cpp:717
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:92
+msgid "Base pitch"
+msgstr "Oinarrizko altuera(tonua)"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:57
+#: ../src/gui/editors/eventlist/EventView.cpp:140
+msgid "Text"
+msgstr "Testua"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:66
+msgid "Specification"
+msgstr "Espezifikazioa"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:68
+msgid "Preview"
+msgstr "Aurrebista"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:72
+msgid "Text: "
+msgstr "Testua: "
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:79
+msgid "Style: "
+msgstr "Estiloa: "
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:90
+msgid "Dynamic"
+msgstr "Dinamika"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:93
+msgid "Direction"
+msgstr "Norabidea"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:96
+msgid "Local Direction"
+msgstr "Norabide Lokala"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:63
+#: ../src/gui/dialogs/TextEventDialog.cpp:99
+#: ../src/gui/editors/tempo/TempoView.cpp:91
+msgid "Tempo"
+msgstr "Tenpoa"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:102
+msgid "Local Tempo"
+msgstr "Tenpo Lokala"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:105
+msgid "Lyric"
+msgstr "Letra"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:108
+#: ../src/gui/editors/notation/NotationView.cpp:4242
+msgid "Chord"
+msgstr "Akordea"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:111
+msgid "Annotation"
+msgstr "Anotazioa"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:114
+msgid "LilyPond Directive"
+msgstr "LilyPonderako jarraibidea"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:138
+msgid "Verse: "
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:148
+msgid "Dynamic: "
+msgstr "Dinamika: "
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:152
+msgid "ppp"
+msgstr "ppp"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:153
+msgid "pp"
+msgstr "pp"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:154
+msgid "p"
+msgstr "p"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:155
+msgid "mp"
+msgstr "mp"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:156
+msgid "mf"
+msgstr "mf"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:157
+msgid "f"
+msgstr "f"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:158
+msgid "ff"
+msgstr "ff"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:159
+msgid "fff"
+msgstr "fff"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:160
+msgid "rfz"
+msgstr "rfz"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:161
+msgid "sf"
+msgstr "sf"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:165
+msgid "Direction: "
+msgstr "Norabidea:"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:174
+msgid " ,"
+msgstr " ,"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:175
+msgid "D.C. al Fine"
+msgstr "D.C. al Fine"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:176
+msgid "D.S. al Fine"
+msgstr "D.S. al Fine"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:177
+msgid "Fine"
+msgstr "Fine"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:178
+msgid "D.S. al Coda"
+msgstr "D.S. al Coda"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:179
+msgid "to Coda"
+msgstr "to Coda"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:180
+msgid "Coda"
+msgstr "Coda"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:184
+msgid "Local Direction: "
+msgstr "Norabide Lokala: "
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:188
+msgid "accel."
+msgstr "accel."
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:189
+msgid "ritard."
+msgstr "ritard."
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:190
+msgid "ralletando"
+msgstr "ralletando"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:191
+msgid "a tempo"
+msgstr "a tempo"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:192
+msgid "legato"
+msgstr "legato"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:193
+msgid "simile"
+msgstr "simile"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:194
+msgid "pizz."
+msgstr "pizz."
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:195
+msgid "arco"
+msgstr "arco"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:196
+msgid "non vib."
+msgstr "non vib."
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:197
+msgid "sul pont."
+msgstr "sul pont."
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:198
+#: ../src/gui/dialogs/TextEventDialog.cpp:200
+msgid "sul tasto"
+msgstr "sul tasto"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:199
+msgid "con legno"
+msgstr "con legno"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:201
+msgid "sul G"
+msgstr "sul G"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:202
+msgid "ordinario"
+msgstr "arrunta"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:203
+msgid "Muta in "
+msgstr "Muta in "
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:204
+msgid "volti subito "
+msgstr "volti subito "
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:205
+msgid "soli"
+msgstr "soli"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:206
+msgid "div."
+msgstr "div."
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:210
+msgid "Tempo: "
+msgstr "Tenpoa: "
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:214
+#: ../src/gui/dialogs/TextEventDialog.cpp:238
+msgid "Grave"
+msgstr "Grave"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:215
+#: ../src/gui/dialogs/TextEventDialog.cpp:239
+msgid "Adagio"
+msgstr "Adagio"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:216
+#: ../src/gui/dialogs/TextEventDialog.cpp:240
+msgid "Largo"
+msgstr "Largo"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:217
+#: ../src/gui/dialogs/TextEventDialog.cpp:241
+msgid "Lento"
+msgstr "Lento"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:218
+#: ../src/gui/dialogs/TextEventDialog.cpp:242
+msgid "Andante"
+msgstr "Andante"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:219
+#: ../src/gui/dialogs/TextEventDialog.cpp:243
+msgid "Moderato"
+msgstr "Moderato"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:220
+#: ../src/gui/dialogs/TextEventDialog.cpp:244
+msgid "Allegretto"
+msgstr "Allegretto"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:221
+#: ../src/gui/dialogs/TextEventDialog.cpp:245
+msgid "Allegro"
+msgstr "Allegro"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:222
+#: ../src/gui/dialogs/TextEventDialog.cpp:246
+msgid "Vivace"
+msgstr "Vivace"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:223
+#: ../src/gui/dialogs/TextEventDialog.cpp:247
+msgid "Presto"
+msgstr "Presto"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:224
+#: ../src/gui/dialogs/TextEventDialog.cpp:248
+msgid "Prestissimo"
+msgstr "Prestissimo"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:225
+#: ../src/gui/dialogs/TextEventDialog.cpp:249
+msgid "Maestoso"
+msgstr "Maestoso"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:226
+#: ../src/gui/dialogs/TextEventDialog.cpp:250
+msgid "Sostenuto"
+msgstr "Sostenuto"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:227
+#: ../src/gui/dialogs/TextEventDialog.cpp:251
+msgid "Tempo Primo"
+msgstr "Tempo Primo"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:234
+msgid "Local Tempo: "
+msgstr "Tenpo Lokala: "
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:255
+msgid "Directive: "
+msgstr "Norabidea: "
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:312
+msgid "Example"
+msgstr "Adibidea"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:65
+msgid "Event Filter"
+msgstr "Gertaeren Iragazkia"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:86
+msgid "Note Events"
+msgstr "Nota Gertaerak"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:90
+msgid "lowest:"
+msgstr "Baxuena"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:93
+msgid "highest:"
+msgstr "Altuena"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:96
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:141
+#: ../src/gui/widgets/PitchChooser.cpp:53
+msgid "Pitch:"
+msgstr "Altuera:"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:99
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:163
+msgid "Velocity:"
+msgstr "Abiadura:"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:102
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:129
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:257
+msgid "Duration:"
+msgstr "Iraupena:"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:107
+#: ../src/gui/dialogs/EventFilterDialog.cpp:114
+#: ../src/gui/dialogs/EventFilterDialog.cpp:121
+msgid "include"
+msgstr "barne hartu"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:108
+#: ../src/gui/dialogs/EventFilterDialog.cpp:115
+#: ../src/gui/dialogs/EventFilterDialog.cpp:122
+msgid "exclude"
+msgstr "kanpoan utzi"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:136
+#: ../src/gui/dialogs/EventFilterDialog.cpp:155
+#: ../src/gui/editors/eventlist/EventView.cpp:172
+#: ../src/gui/editors/eventlist/EventView.cpp:179
+#: ../src/gui/editors/eventlist/EventView.cpp:186
+msgid "edit"
+msgstr "editatu"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:141
+#: ../src/gui/dialogs/EventFilterDialog.cpp:157
+msgid "choose a pitch using a staff"
+msgstr "elegir una altura de nota usando partitura"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:182
+#: ../src/gui/dialogs/EventFilterDialog.cpp:188
+msgid "longest"
+msgstr "luzeena"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:200
+msgid "Include all"
+msgstr "Dena barne hartu"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:203
+msgid "Include entire range of values"
+msgstr "Barne hartu balioen tarde osoa"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:206
+msgid "Exclude all"
+msgstr "Dena kanpoan utzi"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:209
+msgid "Exclude entire range of values"
+msgstr "Balioen tarte osoa kanpoan utzi"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:233
+#: ../src/gui/dialogs/EventFilterDialog.cpp:234
+#, fuzzy
+msgid "shortest"
+msgstr "motzena"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:333
+#, fuzzy
+msgid "Lowest pitch"
+msgstr "Altuerarik txikiena:"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:343
+#, fuzzy
+msgid "Highest pitch"
+msgstr "Altuerarik handiena:"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:56
+#: ../src/gui/editors/notation/NotationView.cpp:1619
+#: ../src/gui/editors/notation/NotationView.cpp:6088
+msgid "Use Ornament"
+msgstr "Apaindura Erabili"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:260
+#: ../src/gui/configuration/NotationConfigurationPage.h:64
+#: ../src/gui/configuration/NotationConfigurationPage.h:65
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:63
+msgid "Notation"
+msgstr "Partitura"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:68
+msgid "Display as: "
+msgstr "Honela erakutsi: "
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:84
+msgid "Trill"
+msgstr "Trinoa"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:84
+msgid "Trill with line"
+msgstr "Trinoa lerroarekin"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:84
+msgid "Trill line only"
+msgstr "Trinoaren lerroa bakarrik"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:85
+msgid "Turn"
+msgstr "Grupeto"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:85
+msgid "Mordent"
+msgstr "Mordente"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:85
+msgid "Inverted mordent"
+msgstr "Mordente Inbertitua"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:86
+msgid "Long mordent"
+msgstr "Mordente luzea"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:86
+msgid "Long inverted mordent"
+msgstr "Mordente luze inbertitua"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:94
+msgid "Text mark"
+msgstr "Testuaren marka"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:98
+msgid " Text: "
+msgstr " Testua: "
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:104
+msgid "Performance"
+msgstr "Interpretazioa"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:109
+msgid "Perform using triggered segment: "
+msgstr "Interpretatu aktibatutako segmentua erabiliz: "
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:75
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:123
+msgid "Perform with timing: "
+msgstr "Ondoko konpas-neurriarekin interpretatu: "
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:81
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:129
+msgid "As stored"
+msgstr "Gordetzen den bezala"
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:82
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:130
+msgid "Truncate if longer than note"
+msgstr "Moztu nota baino luzeago baldin bada"
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:83
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:131
+msgid "End at same time as note"
+msgstr "Bukatu notaren aldi berean"
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:84
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:132
+msgid "Stretch or squash segment to note duration"
+msgstr "Tenkatu edo konprimitu segmentua notaren iraupenaren arabera"
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:86
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:134
+msgid "Adjust pitch to note"
+msgstr "Doitu tonua notaren arabera"
+
+#: ../src/gui/dialogs/PitchPickerDialog.cpp:40
+msgid "Pitch Selector"
+msgstr "Notaren Altueraren Aukeratzailea"
+
+#: ../src/gui/dialogs/BeatsBarsDialog.cpp:44
+msgid "Audio Segment Duration"
+msgstr "Audio Segmentuaren Iraupena"
+
+#: ../src/gui/dialogs/BeatsBarsDialog.cpp:50
+msgid "The selected audio segment contains:"
+msgstr "Hautatutako audio segmentuak ondokoa dauka barruan:"
+
+#: ../src/gui/dialogs/BeatsBarsDialog.cpp:59
+msgid "beat(s)"
+msgstr "Pultsua(k)"
+
+#: ../src/gui/dialogs/BeatsBarsDialog.cpp:60
+msgid "bar(s)"
+msgstr "konpasa(k)"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:51
+msgid "Tuplet"
+msgstr "Multzo Irregularra"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:58
+msgid "New timing for tuplet group"
+msgstr "Konpas-neurri berria multzo irregularrerako"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:76
+msgid "Play "
+msgstr "Jo"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:98
+msgid "in the time of "
+msgstr "Ondokoaren denboran "
+
+#: ../src/gui/dialogs/TupletDialog.cpp:104
+msgid "Timing is already correct: update display only"
+msgstr "Konpas-neurria zuzena da dagoeneko: irudikapena eguneratu"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:114
+msgid "Timing calculations"
+msgstr "Konpas-neurriaren kalkuluak"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:120
+msgid "Selected region:"
+msgstr "Hautatutako eremua:"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:129
+msgid "Group with current timing:"
+msgstr "Taldekatu oraingo konpas-neurriarekin:"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:135
+msgid "Group with new timing:"
+msgstr "Taldekatu konpas-neurri berriarekin:"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:141
+msgid "Gap created by timing change:"
+msgstr "Konpas-neurriaren aldaketak sortutako hutsunea:"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:149
+msgid "Unchanged at end of selection:"
+msgstr "Hautatutakoaren bukaeran aldaketarik gabe:"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:63 rc.cpp:372
+#, no-c-format
+msgid "Metronome"
+msgstr "Metronomoa"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:77
+msgid "Metronome Instrument"
+msgstr "Metronomoaren Instrumentoa"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:82
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:150
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:183
+#: ../src/gui/studio/DeviceEditorDialog.cpp:73
+#: ../src/gui/studio/DeviceManagerDialog.cpp:105
+#: ../src/gui/studio/DeviceManagerDialog.cpp:163
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:66
+msgid "Device"
+msgstr "dispositiboa"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:101
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:89
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:215
+#: ../src/gui/studio/DeviceEditorDialog.cpp:195
+#: ../src/gui/studio/DeviceEditorDialog.cpp:218
+#: ../src/gui/studio/DeviceEditorDialog.cpp:230
+#: ../src/gui/studio/DeviceManagerDialog.cpp:196
+#: ../src/gui/studio/DeviceManagerDialog.cpp:440
+#: ../src/gui/studio/DeviceManagerDialog.cpp:452
+msgid "No connection"
+msgstr "Konexiorik gabe"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:112
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:111
+#: ../src/gui/editors/parameters/InstrumentParameterBox.cpp:53
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:1209
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:159
+#: ../src/gui/general/PresetHandlerDialog.cpp:92
+#: ../src/gui/studio/MidiMixerWindow.cpp:204
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:67
+msgid "Instrument"
+msgstr "Instrumentoa"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:118
+msgid "Beats"
+msgstr "Pultsuak"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:184
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:123
+msgid "Resolution"
+msgstr "Bereizmena"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:309
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:139
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:205
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:125
+#: ../src/gui/editors/matrix/MatrixView.cpp:2132
+#: ../src/gui/editors/notation/NotationView.cpp:1582
+#: ../src/gui/widgets/QuantizeParameters.cpp:128
+#: ../src/gui/widgets/QuantizeParameters.cpp:301
+msgid "None"
+msgstr "Ezer Ez"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:126
+msgid "Bars only"
+msgstr "Konpasak bakarrik"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:127
+msgid "Bars and beats"
+msgstr "Konpasak eta pultsuak"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:128
+msgid "Bars, beats, and divisions"
+msgstr "Konpasak, pultsuak eta zatiketak"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:132
+msgid "Bar velocity"
+msgstr "Konpasaren abiadura"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:139
+msgid "Beat velocity"
+msgstr "Pultsuaren abiadura"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:146
+msgid "Sub-beat velocity"
+msgstr "Azpi-pultsuaren abiadura"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:155
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:324
+msgid "Pitch"
+msgstr "Altuera"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:160
+msgid "for Bar"
+msgstr "Konpas bakoitzeko"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:161
+msgid "for Beat"
+msgstr "Pultsu bakoitzeko"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:162
+msgid "for Sub-beat"
+msgstr "Azpi-pultsu bakoitzeko"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:166
+msgid "Metronome Activated"
+msgstr "Metronomoa Aktibatuta"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:167
+msgid "Playing"
+msgstr "Jotzen"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:168
+msgid "Recording"
+msgstr "Grabatzen"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:46
+msgid "Choose Text Encoding"
+msgstr "Hautatu Testu Kodifikatzaile bat"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:50
+msgid ""
+"\n"
+"This file contains text in an unknown language encoding.\n"
+"\n"
+"Please select one of the following estimated text encodings\n"
+"for use with the text in this file:\n"
+msgstr ""
+"\n"
+"Artxibo honek kodifikazio hizkuntza ezezagun bateko testua dauka.\n"
+"\n"
+"Mesedez, hautatu ondoko testu kodifikazio estimatuetako bat artxibo honetan "
+"dagoen testuarekin erabiltzeko\n"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:61
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:77
+msgid "Japanese Shift-JIS"
+msgstr "Japanese Shift-JIS"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:62
+msgid "Unicode variable-width"
+msgstr "Unicode variable-width"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:63
+msgid "Western Europe"
+msgstr "Western Europe"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:64
+msgid "Western Europe + Euro"
+msgstr "Western Europe + Euro"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:65
+msgid "Eastern Europe"
+msgstr "Eastern Europe"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:66
+msgid "Southern Europe"
+msgstr "Southern Europe"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:67
+msgid "Northern Europe"
+msgstr "Northern Europe"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:68
+msgid "Cyrillic"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:69
+msgid "Arabic"
+msgstr "Arabic"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:70
+msgid "Greek"
+msgstr "Greek"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:71
+msgid "Hebrew"
+msgstr "Hebrew"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:72
+msgid "Turkish"
+msgstr "Turkish"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:73
+msgid "Nordic"
+msgstr "Nordic"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:74
+msgid "Thai"
+msgstr "Thai"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:75
+msgid "Baltic"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:76
+msgid "Celtic"
+msgstr "Celtic"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:78
+msgid "Traditional Chinese"
+msgstr "Traditional Chinese"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:79
+msgid "Simplified Chinese"
+msgstr "Simplified Chinese"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:80
+msgid "Russian"
+msgstr "Russian"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:81
+msgid "Ukrainian"
+msgstr "Ukrainian"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:82
+msgid "Tamil"
+msgstr "Tamil"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:117
+#, c-format
+msgid "Microsoft Code Page %1"
+msgstr "Microsoft Code Page %1"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:123
+#: ../src/gui/editors/matrix/MatrixView.cpp:1490
+msgid "%1 (%2)"
+msgstr "%1 (%2)"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:142
+msgid ""
+"\n"
+"Example text from file:"
+msgstr ""
+"\n"
+"Artxiboan dagoen testuaren adibidea:"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:59
+#: ../src/gui/editors/tempo/TempoView.cpp:92
+msgid "Time Signature"
+msgstr "Konpasaren neurria"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:82
+msgid "Time signature"
+msgstr "Konpasaren neurria"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:116
+msgid "Time where signature takes effect"
+msgstr "Aldaketak eragina daukan denbora"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:83
+#: ../src/gui/dialogs/TempoDialog.cpp:128
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:129
+#: ../src/gui/general/PresetHandlerDialog.cpp:101
+msgid "Scope"
+msgstr "Esparrua"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:141
+#, c-format
+msgid "Insertion point is at start of measure %1."
+msgstr "Txertatze puntua %1 konpasaren hasieran dago"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:145
+#, c-format
+msgid "Insertion point is in the middle of measure %1."
+msgstr "Txertatze puntua %1 konpasaren erdian dago."
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:150
+msgid "Insertion point is at start of composition."
+msgstr "Txertatze puntu konposizioaren hasieran dago"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:155
+msgid "Start measure %1 here"
+msgstr "Hasi %1 konpasa hemen�"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:159
+#, fuzzy, c-format
+msgid "Change time from start of measure %1"
+msgstr "Denbora aldatu %1 konpasaren hasieratik"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:166
+#, c-format
+msgid "Time change will take effect at the start of measure %1."
+msgstr "Denbora aldaketak eragina edukiko du %1 konpasaren hasieran."
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:176
+#, fuzzy
+msgid "Hide the time signature"
+msgstr "Konpasaren neurria ezkutatu"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:181
+#, fuzzy
+msgid "Hide the affected bar lines"
+msgstr "Konpasen barretan notak gehitu, etab."
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:186
+msgid "Show as common time"
+msgstr "Denbora orokor gisa erakutsi"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:191
+msgid "Correct the durations of following measures"
+msgstr "Ondoko konpasen iraupena zuzendu"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:280
+msgid "Display as common time"
+msgstr "Denbora orokor gisa erakutsi"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:284
+msgid "Display as cut common time"
+msgstr "Ebaketa denbora orokor gisa erakutsi"
+
+#: ../src/gui/dialogs/ConfigureDialog.cpp:66
+msgid "Configure Rosegarden"
+msgstr "Rosegarden Konfiguratu"
+
+#: ../src/gui/dialogs/MarkerModifyDialog.cpp:53
+#: ../src/gui/dialogs/MarkerModifyDialog.cpp:61
+#, fuzzy
+msgid "Edit Marker"
+msgstr "Mar&katzaileak Editatu..."
+
+#: ../src/gui/dialogs/MarkerModifyDialog.cpp:78
+msgid "Marker Time"
+msgstr "Markatzailearen Denbora"
+
+#: ../src/gui/dialogs/MarkerModifyDialog.cpp:94
+msgid "Marker Properties"
+msgstr "Markatzailearen Propietateak"
+
+#: ../src/gui/dialogs/MarkerModifyDialog.cpp:100
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:554
+msgid "Text:"
+msgstr "Testua:"
+
+#: ../src/gui/dialogs/MarkerModifyDialog.cpp:104
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:85
+msgid "Description:"
+msgstr "Deskribapena:"
+
+#: ../src/gui/dialogs/FileMergeDialog.cpp:46
+msgid "Merge File"
+msgstr "Artxiboa Nahastu"
+
+#: ../src/gui/dialogs/FileMergeDialog.cpp:53
+msgid "Merge new file "
+msgstr "Artxibo berria nahastu "
+
+#: ../src/gui/dialogs/FileMergeDialog.cpp:56
+msgid "At start of existing composition"
+msgstr "Existitzen den konposizio baten hasieran"
+
+#: ../src/gui/dialogs/FileMergeDialog.cpp:57
+msgid "From end of existing composition"
+msgstr "Existitzen den konposizio baten bukaeratik"
+
+#: ../src/gui/dialogs/FileMergeDialog.cpp:61
+msgid "The file has different time signatures or tempos."
+msgstr "Artxiboak konpas-neurri edo tenpo ezberdinak dauzka."
+
+#: ../src/gui/dialogs/FileMergeDialog.cpp:62
+msgid "Import these as well"
+msgstr "Hauek ere inportatu"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:171
+#: ../src/gui/dialogs/ShowSequencerStatusDialog.cpp:44
+msgid "Sequencer status"
+msgstr "Sekuenziadorearen egoera"
+
+#: ../src/gui/dialogs/ShowSequencerStatusDialog.cpp:48
+msgid "Sequencer status:"
+msgstr "Sekuenziadorearen egoera:"
+
+#: ../src/gui/dialogs/ShowSequencerStatusDialog.cpp:50
+msgid "Status not available."
+msgstr "Ez dago egoera jakiterik."
+
+#: ../src/gui/dialogs/ShowSequencerStatusDialog.cpp:57
+msgid "Sequencer is not running or is not responding."
+msgstr "Sekuenziadorea ez dago martxan edo ez du erantzuten."
+
+#: ../src/gui/dialogs/ShowSequencerStatusDialog.cpp:64
+msgid "Sequencer is not returning a valid status report."
+msgstr "Sekuenziadoreak ez du bueltatzen egoera-txosten baliozko bat."
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:46
+#, fuzzy
+msgid "Add Tracks"
+msgstr "&Pista Gehitu"
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:54
+msgid "How many tracks do you want to add?"
+msgstr "Zenbat pista nahi dituzu gehitu?"
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:62
+#, fuzzy
+msgid "Add tracks"
+msgstr "Pista guztiak"
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:64
+msgid "At the top"
+msgstr ""
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:65
+#, fuzzy
+msgid "Above the current selected track"
+msgstr "Hautatutakoa izan ezik, gainerako pistak mututzen ditu"
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:66
+#, fuzzy
+msgid "Below the current selected track"
+msgstr "Hautatutakoa izan ezik, gainerako pistak mututzen ditu"
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:67
+msgid "At the bottom"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:75
+msgid "Event Properties"
+msgstr "Gertaeraren Propietateak"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:81
+msgid "Event type:"
+msgstr "Gertaera Mota"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:117
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:251
+#: ../src/gui/editors/segment/MarkerEditor.cpp:97
+msgid "Absolute time:"
+msgstr "Denbora Absolutua:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:156
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:323
+msgid "Controller name:"
+msgstr "Kontroladorearen izena:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:157
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:530
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:562
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:563
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:602
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:631
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:267
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:269
+#: ../src/gui/editors/segment/MarkerEditor.cpp:279
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:272
+#: ../src/gui/studio/AudioMixerWindow.cpp:388
+#: ../src/gui/studio/AudioMixerWindow.cpp:519
+#: ../src/gui/studio/AudioMixerWindow.cpp:683
+#: ../src/gui/studio/AudioMixerWindow.cpp:722
+#: ../src/gui/studio/AudioMixerWindow.cpp:904
+#: ../src/gui/studio/SynthPluginManagerDialog.cpp:121
+msgid "<none>"
+msgstr "<ezer ez>"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:174
+msgid "Meta string:"
+msgstr "Meta Katea:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:179
+msgid "Load data"
+msgstr "Datuak kargatu"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:181
+msgid "Save data"
+msgstr "Datuak gorde"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:192
+msgid "Notation Properties"
+msgstr "Partituraren edizioaren propietateak"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:198
+msgid "Lock to changes in performed values"
+msgstr "Interpretatutako baloreen aldaketen arabera jokatu"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:205
+msgid "Notation time:"
+msgstr "Notazioaren denbora:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:217
+msgid "Notation duration:"
+msgstr "Notazioaren iraupena:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:283
+msgid "Note pitch:"
+msgstr "Notaren altuera:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:291
+msgid "Note velocity:"
+msgstr "Notaren Abiadura:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:317
+msgid "Controller number:"
+msgstr "Kontroladorearen zenbakia:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:326
+msgid "Controller value:"
+msgstr "Kontroladorearen balorea:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:354
+msgid "Key pitch:"
+msgstr "Notaren altuera:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:362
+msgid "Key pressure:"
+msgstr "Teklaren presioa:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:390
+msgid "Channel pressure:"
+msgstr "Kanalaren presioa:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:418
+msgid "Program change:"
+msgstr "Programa aldaketa:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:461
+msgid "Data length:"
+msgstr "Datuen tamaina:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:462
+msgid "Data:"
+msgstr "Datuak:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:480
+msgid "Pitchbend MSB:"
+msgstr "MSB Tonu inflexioa:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:488
+msgid "Pitchbend LSB:"
+msgstr "LSB Tonu inflexioa:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:523
+msgid "Indication:"
+msgstr "Adierazpena:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:553
+msgid "Text type:"
+msgstr "Testu mota:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:596
+msgid "Clef type:"
+msgstr "Klabe mota:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:625
+msgid "Key name:"
+msgstr "Klabearen izena:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:674
+msgid "Unsupported event type:"
+msgstr "Jasota ez dagoen gertaera mota:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:931
+msgid "Edit Event Time"
+msgstr "Editatu Gertaeraren Denbora"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:943
+msgid "Edit Event Notation Time"
+msgstr "Editatu Gertaeraren Notazio Denbora"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:955
+msgid "Edit Duration"
+msgstr "Iraupena Editatu"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:968
+msgid "Edit Notation Duration"
+msgstr "Notazioaren Iraupena Editatu"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:981
+msgid "Edit Pitch"
+msgstr "Altuera Editatu"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:991
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:1016
+msgid "*.syx|System exclusive files (*.syx)"
+msgstr "*.syx|Sistemaren artxibo esklusiboak (*.syx)"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:992
+msgid "Load System Exclusive data in File"
+msgstr "Sistema Esklusiboaren datuak Artxibora Kargatu"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:1017
+msgid "Save System Exclusive data to..."
+msgstr "(Non) Gorde Sistema Esklusiboaren Datuak..."
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:46
+msgid "Locate audio file"
+msgstr "Audio artxiboa bilatu"
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:50
+msgid "&Skip"
+msgstr "&Jauzi Egin"
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:51
+msgid "Skip &All"
+msgstr "Jauzi Egin &Guztietan"
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:52
+msgid "&Locate"
+msgstr "&Kokatu"
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:57
+msgid ""
+"Can't find file \"%1\".\n"
+"Would you like to try and locate this file or skip it?"
+msgstr ""
+"Ezin da \"%1\" artxiboa aurkitu.\n"
+"Nahi duzu artxibo hau bilatzen saiatu edo aurrera jarraitu?"
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:71
+msgid ""
+"%1|Requested file (%2)\n"
+"*.wav|WAV files (*.wav)"
+msgstr ""
+"%1|Eskatutako artxiboa (%2)\n"
+"*.wav|WAV artxiboak (*.wav) "
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:74
+msgid "Select an Audio File"
+msgstr "Hautatu Audio Artxibo bat"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:53 ../src/gui/dialogs/ClefDialog.cpp:62
+#: ../src/gui/dialogs/ClefDialog.cpp:79 ../src/gui/dialogs/ClefDialog.cpp:90
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:278
+msgid "Clef"
+msgstr "Klabea"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:65
+msgid "Existing notes following clef change"
+msgstr "Klabe aldaketa baten ondoren dauden notak"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:71
+msgid "Lower clef"
+msgstr "Klabe baxuagoa"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:77
+msgid "Up an Octave"
+msgstr "Oktaba bat Igo"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:84
+msgid "Down an Octave"
+msgstr "Oktaba bat Jaitsi"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:88
+msgid "Higher clef"
+msgstr "Klabe zorrotzagoa"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:96
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:152
+msgid "Maintain current pitches"
+msgstr "Oraingo tonuak mantendu"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:99
+msgid "Transpose into appropriate octave"
+msgstr "Transposatu dagokion oktabara"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:231
+msgid "%1 down an octave"
+msgstr "%1 beheko oktaba batera"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:234
+msgid "%1 down two octaves"
+msgstr "%1 bi oktaba behera"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:237
+msgid "%1 up an octave"
+msgstr "%1 goiko oktaba batera"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:240
+msgid "%1 up two octaves"
+msgstr "%1 bi oktaba gora"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:249
+msgid "Treble"
+msgstr "Sopranoa"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:251
+msgid "French violin"
+msgstr ""
+
+#: ../src/gui/dialogs/ClefDialog.cpp:253
+msgid "Soprano"
+msgstr "Sopranoa"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:255
+#, fuzzy
+msgid "Mezzo-soprano"
+msgstr "Sopranoa"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:257
+msgid "Alto"
+msgstr "Altoa"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:259
+msgid "Tenor"
+msgstr "Tenorra"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:261
+#, fuzzy
+msgid "C-baritone"
+msgstr "Aldaketa"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:263
+#, fuzzy
+msgid "F-baritone"
+msgstr "Aldaketa"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:265
+msgid "Bass"
+msgstr "Baxua"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:267
+#, fuzzy
+msgid "Sub-bass"
+msgstr "fa"
+
+#: ../src/gui/dialogs/CountdownDialog.cpp:52
+msgid "Recording..."
+msgstr "Grabatzen..."
+
+#: ../src/gui/dialogs/CountdownDialog.cpp:60
+msgid "Recording time remaining: "
+msgstr "Grabaketari gelditzen zaion denbora: "
+
+#: ../src/gui/dialogs/CountdownDialog.cpp:120
+msgid "Just how big is your hard disk?"
+msgstr "Zein da zure disko gogorraren tamaina?"
+
+#: ../src/gui/dialogs/CountdownDialog.cpp:154
+msgid "Recording beyond end of composition: "
+msgstr "Grabatzen konposizioaren bukaeraz haraindi:"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:52
+msgid "Specify Interval"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:58
+msgid "Reference note:"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:59
+#, fuzzy
+msgid "Target note:"
+msgstr "beltza"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:68
+#: ../src/gui/dialogs/IntervalDialog.cpp:315
+msgid "a perfect unison"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:76
+msgid "Effect on Key"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:77
+#, fuzzy
+msgid "Transpose within key"
+msgstr "Tonalitate honetara transposatu"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:79
+#, fuzzy
+msgid "Change key for selection"
+msgstr "Hautatutakoaren bukaeran aldaketarik gabe:"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:89
+msgid ""
+"Adjust segment transposition in opposite direction (maintain audible pitch)"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:190
+#: ../src/gui/dialogs/IntervalDialog.cpp:220
+msgid "a diminished"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:192
+#: ../src/gui/dialogs/IntervalDialog.cpp:222
+msgid "an augmented"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:194
+#: ../src/gui/dialogs/IntervalDialog.cpp:224
+msgid "a doubly diminished"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:196
+#: ../src/gui/dialogs/IntervalDialog.cpp:226
+msgid "a doubly augmented"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:198
+#: ../src/gui/dialogs/IntervalDialog.cpp:228
+msgid "a triply diminished"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:200
+#: ../src/gui/dialogs/IntervalDialog.cpp:230
+msgid "a triply augmented"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:202
+msgid "a quadruply diminished"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:204
+#: ../src/gui/dialogs/IntervalDialog.cpp:232
+msgid "a quadruply augmented"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:206
+#: ../src/gui/dialogs/IntervalDialog.cpp:234
+msgid "a perfect"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:208
+#: ../src/gui/dialogs/IntervalDialog.cpp:236
+msgid "an (unknown, %1)"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:216
+#, fuzzy
+msgid "a minor"
+msgstr "Menor"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:218
+#, fuzzy
+msgid "a major"
+msgstr "Maior"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:239
+#, fuzzy
+msgid "an (unknown)"
+msgstr "Ezezaguna"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:248
+#: ../src/gui/dialogs/IntervalDialog.cpp:251
+#, fuzzy
+msgid "%1 octave"
+msgstr "%1 goiko oktaba batera"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:254
+msgid "%1 unison"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:258
+#, fuzzy
+msgid "%1 second"
+msgstr "%1 seg"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:261
+#, fuzzy
+msgid "%1 third"
+msgstr "%1 tick"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:264
+#, fuzzy
+msgid "%1 fourth"
+msgstr "%1 bemol"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:267
+#, fuzzy
+msgid "%1 fifth"
+msgstr "%1 bemol"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:270
+#, fuzzy
+msgid "%1 sixth"
+msgstr "%1 (zatituta)"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:273
+#, fuzzy
+msgid "%1 seventh"
+msgstr "%1 seg"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:276
+#: ../src/gui/studio/DeviceManagerDialog.cpp:329
+#: ../src/gui/studio/DeviceManagerDialog.cpp:363
+#, c-format
+msgid "%1"
+msgstr "%1"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:287
+msgid ""
+"_n: up 1 octave and %1\n"
+"up %n octaves and %1"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:291
+#, c-format
+msgid ""
+"_n: up 1 octave\n"
+"up %n octaves"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:295
+#, fuzzy, c-format
+msgid "up %1"
+msgstr "Sub %1"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:303
+msgid ""
+"_n: down 1 octave and %1\n"
+"down %n octaves and %1"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:307
+#, fuzzy, c-format
+msgid ""
+"_n: down 1 octave\n"
+"down %n octaves"
+msgstr ""
+"_n: %1 pista batean\n"
+"%1 %n pista -tan"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:311
+#, fuzzy, c-format
+msgid "down %1"
+msgstr "Baxua: %1"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:81
+msgid "Intrinsics"
+msgstr "Intrintsekoak"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:85
+msgid "Event type: "
+msgstr "Gertaera mota"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:91
+msgid "Absolute time: "
+msgstr "Denbora absolutua: "
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:101
+msgid "Duration: "
+msgstr "Iraupena: "
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:114
+msgid "Sub-ordering: "
+msgstr "Azpi-antolamendua: "
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:125
+msgid "Persistent properties"
+msgstr "Propietate iraunkorrak"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:169
+#: ../src/gui/dialogs/EventEditDialog.cpp:133
+#: ../src/gui/studio/BankEditorDialog.cpp:129
+#: ../src/gui/studio/DeviceEditorDialog.cpp:75
+msgid "Type"
+msgstr "Mota"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:184
+#: ../src/gui/dialogs/EventEditDialog.cpp:135
+#: ../src/gui/dialogs/EventParameterDialog.cpp:89
+#: ../src/gui/dialogs/EventParameterDialog.cpp:93
+#: ../src/gui/dialogs/EventParameterDialog.cpp:115
+msgid "Value"
+msgstr "Baloreak"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:155
+msgid "Non-persistent properties"
+msgstr "Propietate ez iraunkorrak"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:156
+msgid "These are cached values, lost if the event is modified."
+msgstr "Balore hauek katxean daude eta "
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:170
+msgid "Name "
+msgstr "Izena "
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:172
+msgid "Type "
+msgstr "Mota "
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:174
+msgid "Value "
+msgstr "Balorea "
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:188
+msgid "Make persistent"
+msgstr "Iraunkorra bihurtu"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:292
+msgid "Delete this property"
+msgstr "Propietate hau ezabatu"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:433
+msgid ""
+"Are you sure you want to delete the \"%1\" property?\n"
+"\n"
+"Removing necessary properties may cause unexpected behavior."
+msgstr ""
+"Ziur zaude \"%1\" propietatea ezabatu nahi izateaz?\n"
+"\n"
+"Beharrezkoak diren propietateak ezabatzeak ustekabeko ondorioak eduki "
+"ditzake."
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:436
+#: ../src/gui/dialogs/EventEditDialog.cpp:469
+msgid "Edit Event"
+msgstr "Gertaera Editatu"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:465
+msgid ""
+"Are you sure you want to make the \"%1\" property persistent?\n"
+"\n"
+"This could cause problems if it overrides a different computed value later "
+"on."
+msgstr ""
+"Ziur zaude \"%1\" propietatea iraunkor bihurtu nahi izateaz?\n"
+"\n"
+"Honek arazoak sortu ditzake aurrerago modu ezberdin batean kalkulatutako "
+"balore batekin ordezkatzen bada."
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:470
+msgid "Make &Persistent"
+msgstr "&Iraunkorra Bihurtu"
+
+#: ../src/gui/dialogs/PasteNotationDialog.cpp:52
+msgid "Paste type"
+msgstr "Mota itsatsi"
+
+#: ../src/gui/dialogs/PasteNotationDialog.cpp:72
+msgid "Make this the default paste type"
+msgstr "Bihurtu hau itsasteko modu lehenetsia"
+
+#: ../src/gui/dialogs/LyricEditDialog.cpp:53
+msgid "Edit Lyrics"
+msgstr "Letra Editatu"
+
+#: ../src/gui/dialogs/LyricEditDialog.cpp:62
+msgid "Lyrics for this segment"
+msgstr "Letra segmentu honetarako"
+
+#: ../src/gui/dialogs/LyricEditDialog.cpp:70
+#, fuzzy
+msgid "Add Verse"
+msgstr "&Decrescendoa Gehitu..."
+
+#: ../src/gui/dialogs/LyricEditDialog.cpp:84
+#: ../src/gui/dialogs/LyricEditDialog.cpp:106
+#, c-format
+msgid "Verse %1"
+msgstr ""
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:59
+msgid "Import from Device..."
+msgstr "Dispositibotik Inportatu..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2163
+#: ../src/gui/application/RosegardenGUIApp.cpp:2229
+#: ../src/gui/application/RosegardenGUIApp.cpp:7780
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:87
+#: ../src/sound/AudioFileManager.cpp:664
+#, c-format
+msgid "Cannot download file %1"
+msgstr "Ezin da %1 artxiboa jaitsi"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:99
+#, c-format
+msgid "Cannot open file %1"
+msgstr "Ezin da %1 artxiboa ireki"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:106
+#, c-format
+msgid "No devices found in file %1"
+msgstr "Ez dago dispositiborik %1 artxiboan"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:113
+msgid "Source device"
+msgstr "Iturri-dispositiboa"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:118
+msgid "Import from: "
+msgstr "(Nondik) Inportatu: "
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:140
+#: ../src/gui/studio/DeviceEditorDialog.cpp:148
+#, c-format
+msgid "Device %1"
+msgstr "%1 Dispositiboa"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:155
+msgid "Import banks"
+msgstr "Bankuak inportatu"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:156
+msgid "Import key mappings"
+msgstr "Teklatuaren mapak inportatu"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:157
+msgid "Import controllers"
+msgstr "Kontroladoreak inportatu"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:160
+msgid "Import device name"
+msgstr "Inportatutako dispositiboaren izena"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:166
+msgid "Bank import behavior"
+msgstr "Bankuen inportazio-jokabidea"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:168
+msgid "Merge banks"
+msgstr "Bankuak nahasi"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:169
+msgid "Overwrite banks"
+msgstr "Bankuak gainidatzi"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:367
+msgid "Bank %1:%2"
+msgstr "%1 %2 bankua"
+
+#: ../src/commands/segment/SegmentSplitByRecordingSrcCommand.cpp:42
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:48
+msgid "Split by Recording Source"
+msgstr "Zatitu Grabaketa Iturriaren Arabera"
+
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:53
+msgid "Recording Source"
+msgstr "Grabaketa Iturria"
+
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:57
+msgid "Channel:"
+msgstr "Kanala:"
+
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:64
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:75
+msgid "any"
+msgstr "(edozein) "
+
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:69
+msgid "Device:"
+msgstr "Dispositiboa "
+
+#: ../src/gui/dialogs/UnusedAudioSelectionDialog.cpp:46
+msgid "Select Unused Audio Files"
+msgstr "Hautatu Audio Artxibo Ez Erabiliak"
+
+#: ../src/gui/dialogs/UnusedAudioSelectionDialog.cpp:53
+#: ../src/gui/editors/segment/PlayListView.cpp:36
+msgid "File name"
+msgstr "Artxiboaren izena"
+
+#: ../src/gui/dialogs/UnusedAudioSelectionDialog.cpp:54
+msgid "File size"
+msgstr "Artxiboaren tamaina"
+
+#: ../src/gui/dialogs/UnusedAudioSelectionDialog.cpp:55
+msgid "Last modified date"
+msgstr "Azkenengo aldaketaren data"
+
+#: ../src/gui/dialogs/UnusedAudioSelectionDialog.cpp:60
+msgid " (not found) "
+msgstr "(ez aurkitua)"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:105
+msgid "Audio File Manager"
+msgstr "Audio Artxiboen Kudeatzailea"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:126
+msgid ""
+"* Some audio files are encoded at a sample rate different from that of the "
+"JACK audio server.\n"
+"Rosegarden will play them at the correct speed, but they will sound "
+"terrible.\n"
+"Please consider resampling such files externally, or adjusting the sample "
+"rate of the JACK server."
+msgstr ""
+"* Audio artxibo batzuk JACK audio zerbitzariaren laginketa-maiztasuna ez "
+"denbatean kodifikatuta daude.\n"
+"Rosegardenek abiadura egokian joko ditu, baina oso gaizki entzungodira.\n"
+"Mesedez, kontsideratu ezazu horrelako artxiboak kanpotik birsanpleatzea "
+"edoJACK zerbitzariaren laginketa-maiztasuna doitzea."
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:132
+msgid "&Add Audio File..."
+msgstr "Audio Artxiboa &Gehitu "
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:135
+msgid "&Unload Audio File"
+msgstr "Audio Artxiboa &Deskargatu"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:140
+msgid "&Play Preview"
+msgstr "Aurrebista &Jo"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:151
+msgid "&Insert into Selected Audio Track"
+msgstr "&Txertatu Hautatutako Audio Pistan"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:155
+msgid "Unload &all Audio Files"
+msgstr "Audio Artxibo g&uztiak Deskargatu"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:159
+msgid "Unload all &Unused Audio Files"
+msgstr "Ez erabilitako Audio Artxibo guztiak D&eskargatu"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:163
+msgid "&Delete Unused Audio Files..."
+msgstr "Ez Erabilitako Audio Artxibo Guztiak E&zabatu"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:167
+msgid "&Export Audio File..."
+msgstr "Audio Artxiboa E&sportatu... "
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:173
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:180
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:91
+msgid "Duration"
+msgstr "Iraupena"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:181
+msgid "Envelope"
+msgstr "Inguratzailea"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:182
+msgid "Sample rate"
+msgstr "Laginketa-maiztasuna"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:183
+msgid "Channels"
+msgstr "Kanalak"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:282
+msgid "<no audio files>"
+msgstr "<audio artxiborik gabe>"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:488
+msgid "*.wav|WAV files (*.wav)"
+msgstr "*.wav|WAV artxiboak (*.wav)"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:489
+msgid "Choose a name to save this file as"
+msgstr "Artxibo hau gordetzeko izen bat hautatu"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:499
+msgid "Exporting audio file..."
+msgstr "Audio artxiboa esportatzen..."
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:609
+msgid ""
+"This will unload audio file \"%1\" and remove all associated segments. Are "
+"you sure?"
+msgstr ""
+"Honek \"%1\" audio artxiboa deskargatuko du eta dagozkion segmendu guztiak "
+"ezabatukoditu. Ziur zaude?"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:692
+#, fuzzy
+msgid ""
+"*.wav|WAV files (*.wav)\n"
+"*.*|All files"
+msgstr "*.wav|WAV artxiboak (*.wav)"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:697
+msgid ""
+"*.wav *.flac *.ogg *.mp3|Audio files (*.wav *.flac *.ogg *.mp3)\n"
+"*.wav|WAV files (*.wav)\n"
+"*.flac|FLAC files (*.flac)\n"
+"*.ogg|Ogg files (*.ogg)\n"
+"*.mp3|MP3 files (*.mp3)\n"
+"*.*|All files"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:704
+msgid "Select one or more audio files"
+msgstr "Hautatu audio artxibo bat edo gehiago"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:763
+msgid ""
+"This will unload all audio files and remove their associated segments.\n"
+"This action cannot be undone, and associations with these files will be "
+"lost.\n"
+"Files will not be removed from your disk.\n"
+"Are you sure?"
+msgstr ""
+"Honek audio artxibo guztiak eta dagozkien segmentuak ezabatuko ditu.\n"
+"Eragiketa hau ezin da desegin, eta artxibo hauekiko loturak galdukodira.\n"
+"Artxiboak ez dira zure disko gogorretik ezabatu.\n"
+"Ziur zaude?"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:800
+msgid ""
+"This will unload all audio files that are not associated with any segments "
+"in this composition.\n"
+"This action cannot be undone, and associations with these files will be "
+"lost.\n"
+"Files will not be removed from your disk.\n"
+"Are you sure?"
+msgstr ""
+"Honek konposizio honetan segmentu batekin ere loututa ez dauden "
+"audioartxiboak deskargatuko ditu.\n"
+"Eragiketa hau ezin da desegin, eta artxibo hauekiko loturak galdukodira.\n"
+"Ziur zaude?"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:865
+msgid ""
+"The following audio files are not used in the current composition.\n"
+"\n"
+"Please select the ones you wish to delete permanently from the hard disk.\n"
+msgstr ""
+"Ondoko artxibo hauek ez dira erabiltzen oraingo konposizioan.\n"
+"\n"
+"Mesedez, aukera itzazu disko gogorretik betiko ezabatu nahi dituzunak.\n"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:875
+#, fuzzy, c-format
+msgid ""
+"_n: <qt>About to delete 1 audio file permanently from the hard disk.<br>This "
+"action cannot be undone, and there will be no way to recover this file."
+"<br>Are you sure?</qt>\n"
+"\n"
+"<qt>About to delete %n audio files permanently from the hard disk.<br>This "
+"action cannot be undone, and there will be no way to recover these files."
+"<br>Are you sure?</qt>"
+msgstr ""
+"_n: Audio artxibo 1 betiko ezabatuko da.\n"
+"Eragiketa hau ezin da desegin, eta ez da egongo artxibo hauek "
+"berreskuratzeko.\n"
+"modurik.\n"
+"Ziur zaude?\n"
+"%n audio artxibo ezabatuko duzu/dituzu disko gogorretik.\n"
+"Eragiketa hau ezin da desegin, eta ez da egongo artxibo hauek "
+"berreskuratzeko.\n"
+"modurik.\n"
+"Ziur zaude?"
+
+#: ../src/document/RosegardenGUIDoc.cpp:525
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:888
+msgid "File %1 could not be deleted."
+msgstr "%1 artxiboa ezin izan da ezabatu."
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:921
+msgid "Change Audio File label"
+msgstr "Audio artxiboaren etiketa aldatu"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:6466
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:922
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:1099
+msgid "Enter new label"
+msgstr "Etiketa berria sartu"
+
+#: ../src/gui/application/RosegardenGUIView.cpp:1538
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:1086
+#, fuzzy
+msgid "Adding audio file..."
+msgstr "Audio artxiboa esportatzen..."
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:1107
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:1112
+#, fuzzy
+msgid "Failed to add audio file. "
+msgstr "Sekuentziadoreak huts egin du audio artxiboa gehitzerakoan"
+
+#: ../src/document/RosegardenGUIDoc.cpp:2789
+#: ../src/gui/application/RosegardenGUIApp.cpp:2736
+#: ../src/gui/application/RosegardenGUIView.cpp:1574
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:1122
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:180
+msgid "Generating audio preview..."
+msgstr "Sortzen audioaren aurrebista..."
+
+#: ../src/gui/application/RosegardenGUIView.cpp:1581
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:1130
+msgid ""
+"Try copying this file to a directory where you have write permission and re-"
+"add it"
+msgstr ""
+"Saiatu idazteko baimena daukazun direktorio batera artxibo hau kopiatzeneta "
+"berriro gehitu"
+
+#: ../src/gui/dialogs/TransportDialog.cpp:90 rc.cpp:357
+#, no-c-format
+msgid "Rosegarden Transport"
+msgstr "Rosegardenen Transportea"
+
+#: ../src/gui/dialogs/TransportDialog.cpp:925
+#: ../src/gui/dialogs/TransportDialog.cpp:985
+msgid "PITCH WHEEL"
+msgstr "TONU-GURPILA"
+
+#: ../src/gui/dialogs/TransportDialog.cpp:929
+#: ../src/gui/dialogs/TransportDialog.cpp:989
+msgid "CONTROLLER"
+msgstr "KONTROLADOREA"
+
+#: ../src/gui/dialogs/TransportDialog.cpp:933
+#: ../src/gui/dialogs/TransportDialog.cpp:993
+msgid "PROG CHNGE"
+msgstr "PROG. ALDAKETA"
+
+#: ../src/gui/dialogs/TransportDialog.cpp:938
+#: ../src/gui/dialogs/TransportDialog.cpp:998
+msgid "PRESSURE"
+msgstr "PRESIOA"
+
+#: ../src/gui/dialogs/TransportDialog.cpp:942
+#: ../src/gui/dialogs/TransportDialog.cpp:1002
+msgid "SYS MESSAGE"
+msgstr "SIST. MEZUA"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:177
+#: ../src/gui/dialogs/QuantizeDialog.cpp:40
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:127
+msgid "Quantize"
+msgstr "Kuantifikazioa"
+
+#: ../src/gui/dialogs/QuantizeDialog.cpp:52
+msgid "Advanced"
+msgstr "Aurreratua"
+
+#: ../src/gui/dialogs/ExportDeviceDialog.cpp:42
+msgid "Export Devices..."
+msgstr "Dispositiboak Esportatu..."
+
+#: ../src/gui/dialogs/ExportDeviceDialog.cpp:47
+msgid "Export devices"
+msgstr "Exportar dispositivos"
+
+#: ../src/gui/dialogs/ExportDeviceDialog.cpp:49
+msgid "Export all devices"
+msgstr "Dispositibo guztiak esportatu"
+
+#: ../src/gui/dialogs/ExportDeviceDialog.cpp:50
+msgid "Export selected device only"
+msgstr "Esportatu bakarrik hautatutako dispositiboa"
+
+#: ../src/gui/dialogs/ExportDeviceDialog.cpp:51
+msgid " (\"%1\")"
+msgstr " (\"%1\")"
+
+#: ../src/gui/dialogs/CompositionLengthDialog.cpp:44
+msgid "Change Composition Length"
+msgstr "Konposizioaren Luzera Aldatu"
+
+#: ../src/gui/dialogs/CompositionLengthDialog.cpp:50
+msgid "Set the Start and End bar markers for this Composition"
+msgstr ""
+"Ezarri Hasierako eta Bukerako konpasaren Markatzaileak Konposizio honetarako"
+
+#: ../src/gui/dialogs/CompositionLengthDialog.cpp:54
+msgid "Start Bar"
+msgstr "Hasierako Konpasa"
+
+#: ../src/gui/dialogs/CompositionLengthDialog.cpp:62
+msgid "End Bar"
+msgstr "Bukaerako Konpasa"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:62
+msgid "LilyPond Export/Preview"
+msgstr "LilyPond Esportatze/Aurrebista"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:85
+#, fuzzy
+msgid "General options"
+msgstr "Konfigurazio Orokorra"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:90
+#, fuzzy
+msgid "Advanced options"
+msgstr "Opzio aurreratuak erakutsi"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:112
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:95
+msgid "Headers"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:106
+msgid "Basic options"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:113
+#, fuzzy
+msgid "Compatibility level"
+msgstr "Bateragarritasun maila"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:117
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:118
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:119
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:120
+#, fuzzy, c-format
+msgid "LilyPond %1"
+msgstr "LilyPond 2.2 "
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:125
+#, fuzzy
+msgid "Paper size"
+msgstr "Paperaren tamaina"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:129
+msgid "A3"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:130
+msgid "A4"
+msgstr "A4"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:131
+msgid "A5"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:132
+msgid "A6"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:133
+msgid "Legal"
+msgstr "Legal"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:134
+msgid "US Letter"
+msgstr "EEBB-ko eskutitza"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:135
+msgid "Tabloid"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:136
+msgid "do not specify"
+msgstr "ez zehaztu"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:152
+#, fuzzy
+msgid "Font size"
+msgstr "Letraren neurria"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:157
+#, fuzzy
+msgid "%1 pt"
+msgstr "%1 (zatia)"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:169
+#, fuzzy
+msgid "Staff level options"
+msgstr "Opzio aurreratuak erakutsi"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:176
+#, fuzzy
+msgid "Export content"
+msgstr "Edukia esportatu"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:179
+#, fuzzy
+msgid "All tracks"
+msgstr "Pista guztiak"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:180
+#, fuzzy
+msgid "Non-muted tracks"
+msgstr "Pista ez-mututuak"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:181
+#, fuzzy
+msgid "Selected track"
+msgstr "Hautatutako pista"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:182
+#, fuzzy
+msgid "Selected segments"
+msgstr "Hautatutako segmentuak"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:188
+msgid "Merge tracks that have the same name"
+msgstr "Izen bereko pistak batu"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:198
+#, fuzzy
+msgid "Notation options"
+msgstr "Partituraren edizioaren propietateak"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:206
+#, fuzzy
+msgid "First"
+msgstr "Lehenengoa"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:207
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:538
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:557
+msgid "All"
+msgstr "Denak"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:211
+msgid "Export tempo marks "
+msgstr "Esportatu tenpo markatzailea"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:215
+#, fuzzy
+msgid "Export lyrics"
+msgstr "Esportatu \\lyric blokeak (letrak)"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:225
+msgid "Export beamings"
+msgstr "Multzoak esportatu"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:232
+msgid "Export track staff brackets"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:244
+#, fuzzy
+msgid "Layout options"
+msgstr "Formatoaren Tresna-Barra"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:257
+#, fuzzy
+msgid "Lyrics alignment"
+msgstr "Letra segmentu honetarako"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:261
+msgid "Ragged bottom (systems will not be spread vertically across the page)"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:267
+msgid "Miscellaneous options"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:274
+msgid "Enable \"point and click\" debugging"
+msgstr "Aktibatu \"apuntatu eta click egin\" arazketa"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:279
+msgid "Export \\midi block"
+msgstr "\\midi blokea esportatu"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:284
+#, fuzzy
+msgid "No markers"
+msgstr "Submasterrik gabe"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:285
+#, fuzzy
+msgid "Rehearsal marks"
+msgstr "Markatzaile Guztiak Ezabatu"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:286
+#, fuzzy
+msgid "Marker text"
+msgstr "Markatzailearen denbora "
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:290
+#, fuzzy
+msgid "Export markers"
+msgstr "Esportatu tenpo markatzailea"
+
+#: ../src/gui/dialogs/AudioSplitDialog.cpp:57
+msgid "Autosplit Audio Segment"
+msgstr "Audio Segmentua Automatikoki Zatitu"
+
+#: ../src/gui/dialogs/AudioSplitDialog.cpp:70
+msgid "AutoSplit Segment \""
+msgstr "Segmentua Automatikoki Zatitu \""
+
+#: ../src/gui/dialogs/AudioSplitDialog.cpp:84
+msgid "Threshold"
+msgstr "Muga"
+
+#: ../src/gui/dialogs/AudioSplitDialog.cpp:142
+msgid "<no preview generated for this audio file>"
+msgstr "<ez da aurribistarik sortu audio artxibo honentzat>"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:70
+msgid "Audio Plugin"
+msgstr "Audio Plugin-a"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:94
+#: ../src/gui/widgets/AudioFaderBox.cpp:136
+msgid "Editor"
+msgstr "Editorea"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:100
+msgid "Plugin"
+msgstr "Plugina"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:105
+msgid "Category:"
+msgstr "Saila:"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:110
+msgid "Plugin:"
+msgstr "Plugina:"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:114
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:398
+msgid "Select a plugin from this list."
+msgstr "Plugin bat hautatu zerrendatik."
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:119
+msgid "Bypass"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:121
+msgid "Bypass this plugin."
+msgstr "Plugin hau bypass-en jarri."
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:127
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:390
+msgid "<ports>"
+msgstr "<portuak>"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:130
+msgid "Input and output port counts."
+msgstr "Sarrera eta irteera portuen zenbaketa."
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:132
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:391
+msgid "<id>"
+msgstr "<id>"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:135
+msgid "Unique ID of plugin."
+msgstr "Pluginaren ID bakarra"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:149
+msgid "Copy plugin parameters"
+msgstr "Pluginaren parametroak kopiatu"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:155
+msgid "Paste plugin parameters"
+msgstr "Pluginaren parametroak itsatsi"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:161
+msgid "Set to defaults"
+msgstr "Ezarri balore lehenetsiak"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:225
+msgid "(any)"
+msgstr "(edozein)"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:226
+msgid "(unclassified)"
+msgstr "(sailkatu gabe)"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:247
+msgid "(none)"
+msgstr "(ezer ez)"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:389
+#: ../src/gui/editors/parameters/AudioInstrumentParameterPanel.cpp:132
+#: ../src/gui/editors/parameters/AudioInstrumentParameterPanel.cpp:361
+#: ../src/gui/studio/AudioMixerWindow.cpp:685
+#: ../src/gui/studio/AudioMixerWindow.cpp:724
+#: ../src/gui/studio/AudioMixerWindow.cpp:906
+#: ../src/gui/widgets/AudioFaderBox.cpp:79
+msgid "<no plugin>"
+msgstr "<pluginik gabe>"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:427
+msgid "This plugin has too many controls to edit here."
+msgstr "Plugin honek kontrol gehiegi dauzka hemen editatzeko�."
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:438
+#, c-format
+msgid "Id: %1"
+msgstr "Id: %1"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:490
+msgid "mono"
+msgstr "mono"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:492
+msgid "stereo"
+msgstr "estereo"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:494
+msgid "%1 in, %2 out"
+msgstr "%1 sarrea, %2 irteera"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:518
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:704
+msgid "Program: "
+msgstr "Programa: "
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:522
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:532
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:708
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:716
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:745
+msgid "<none selected>"
+msgstr "<bat ere ez hautatua>"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:56
+msgid "Set the %1 property of the event selection:"
+msgstr "Ezarri gertaeraren selekzioaren %1 propietatea:"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:61
+msgid "Pattern"
+msgstr "Patroia"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:66
+msgid "Flat - set %1 to value"
+msgstr "Bemol - ezarri %1 baliora"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:70
+msgid "Alternating - set %1 to max and min on alternate events"
+msgstr "Txandakatu - jarri %1 maximoan eta minimoan txandakako gertaeretan"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:74
+msgid "Crescendo - set %1 rising from min to max"
+msgstr "Crescendo - Jarri %1 hazten minimotik maximorantz"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:78
+msgid "Diminuendo - set %1 falling from max to min"
+msgstr "Diminuendo - Jarri %1 jaisten maximotik minimorantz"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:82
+msgid "Ringing - set %1 alternating from max to min with both dying to zero"
+msgstr ""
+"Errepika - jarri %1 txandakatzen maximotik minimorantz, biakzerorantz doazela"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:123
+#: ../src/gui/dialogs/EventParameterDialog.cpp:150
+msgid "First Value"
+msgstr "Lehenengo Balorea"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:124
+#: ../src/gui/dialogs/EventParameterDialog.cpp:151
+msgid "Second Value"
+msgstr "Bigarren Balorea"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:132
+#: ../src/gui/dialogs/EventParameterDialog.cpp:142
+msgid "Low Value"
+msgstr "Balore Baxua"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:133
+#: ../src/gui/dialogs/EventParameterDialog.cpp:141
+msgid "High Value"
+msgstr "Balore Altua"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:56 ../src/gui/rulers/TempoRuler.cpp:127
+msgid "Insert Tempo Change"
+msgstr "Tenpo Aldaketa Txertatu"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:69
+msgid "New tempo:"
+msgstr "Tenpo Berria:"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:76
+msgid "Tap"
+msgstr ""
+
+#: ../src/gui/dialogs/TempoDialog.cpp:81
+msgid "Tempo is fixed until the following tempo change"
+msgstr "Tenpoa hurrengo tenpo aldaketa egon arte mantenduko da"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:82
+msgid "Tempo ramps to the following tempo"
+msgstr "Tenpoa mailaka aldatzen da datorren tenporaren arabera"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:83
+msgid "Tempo ramps to:"
+msgstr "Tenpoa mailaka aldatzen da ondokaren arabera:"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:120
+msgid "Time of tempo change"
+msgstr "Tenpoa aldatzeko denbora"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:138
+msgid "The pointer is currently at "
+msgstr "Kurtsorea orain ondokoan dago "
+
+#: ../src/gui/dialogs/TempoDialog.cpp:154
+msgid "Apply this tempo from here onwards"
+msgstr "Ezarri tengo hau hemendik aurrera"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:158
+msgid "Replace the last tempo change"
+msgstr "Ordezkatu azkenengo tenpo aldaketa"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:164
+msgid "Apply this tempo from the start of this bar"
+msgstr "Tenpo hau ezarri konpas honen hasieratik"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:167
+msgid "Apply this tempo to the whole composition"
+msgstr "Tenpo hau ezarri konposizio osorako"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:172
+msgid "Also make this the default tempo"
+msgstr "Gainera tenpo hau lehenetsi"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:256
+msgid "%1.%2 s,"
+msgstr "%1.%2 s,"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:262
+#, c-format
+msgid "at the start of measure %1."
+msgstr "%1 konpasaren hasiera."
+
+#: ../src/gui/dialogs/TempoDialog.cpp:266
+#, c-format
+msgid "in the middle of measure %1."
+msgstr "%1 konpasaren erdian."
+
+#: ../src/gui/dialogs/TempoDialog.cpp:285
+msgid " (at %1.%2 s, in measure %3)"
+msgstr " ( %1.%2 s -tan, konpas %3) "
+
+#: ../src/gui/dialogs/TempoDialog.cpp:302
+msgid "There are no preceding tempo changes."
+msgstr "Ez dago aurreko tenpo aldaketarik"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:310
+msgid "There are no other tempo changes."
+msgstr "Ez dago beste tenpo aldaketarik."
+
+#: ../src/gui/dialogs/TempoDialog.cpp:328
+msgid " bpm"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioPlayingDialog.cpp:42
+msgid "Playing audio file"
+msgstr "Audio artxiboa jotzen"
+
+#: ../src/gui/dialogs/AudioPlayingDialog.cpp:47
+msgid "Playing audio file \"%1\""
+msgstr "\"%1\" audio artxiboa jotzen"
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:52
+#: ../src/gui/editors/matrix/MatrixView.cpp:2655
+msgid "Trigger Segment"
+msgstr "Segmentua Aktibatu"
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:61
+msgid "Trigger segment: "
+msgstr "Ondoko segmentua aktibatu: "
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:59
+msgid "Key Change"
+msgstr "Tonu aldaketa"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:77
+msgid "Key signature"
+msgstr "Armadura"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:80
+msgid "Key transposition"
+msgstr "Tonalitatearen transposizioa"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:86
+msgid "Existing notes following key change"
+msgstr "Tonalitate aldaketa baten ondoren dauden notak"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:98
+msgid "Flatten"
+msgstr "Aldatu Bemola erabiliz"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:100
+msgid "Key"
+msgstr "Klabea"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:105
+msgid "Sharpen"
+msgstr "Aldatu diesearekin"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:109
+msgid "Major"
+msgstr "Maior"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:110
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:369
+msgid "Minor"
+msgstr "Menor"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:123
+msgid "Transpose key according to segment transposition"
+msgstr "Tonalitatea transposatu segmentuaren transposizioaren arabera"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:126
+msgid "Use specified key. Do not transpose"
+msgstr "Erabili adieraziatako tonalitatea. Ez transposatu."
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:134
+msgid "Apply to current segment only"
+msgstr "Bakarrik aplikatu oraingo segmentuari"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:137
+msgid "Apply to all segments at this time"
+msgstr "Aplikatu denbora puntu honetan dauden segmentu guztiei"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:141
+msgid "Exclude percussion segments"
+msgstr ""
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:155
+msgid "Maintain current accidentals"
+msgstr "Mantendu oraingo alterazioak"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:158
+msgid "Transpose into this key"
+msgstr "Tonalitate honetara transposatu"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:331
+msgid "No such key"
+msgstr "Ez dago horrelako tonalitaterik"
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:44
+#: ../src/gui/editors/notation/NotationSelector.cpp:118
+msgid "Interpret"
+msgstr "Interpretazioa"
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:50
+msgid "Interpretations to apply"
+msgstr "Aplikatu beharreko interpretazioak"
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:53
+msgid "Apply text dynamics (p, mf, ff etc)"
+msgstr "Testu �abardurak aplikatu (p, mf, ff, etab)"
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:55
+msgid "Apply hairpin dynamics"
+msgstr "Mailakako �abardurak aplikatu"
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:57
+msgid "Stress beats"
+msgstr "Indartu notak denborarekin batera"
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:59
+msgid "Articulate slurs, staccato, tenuto etc"
+msgstr "Artikulatu ligaturak, staccato, tenuto, etab"
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:61
+msgid "All available interpretations"
+msgstr "Eskuragarri dauden interpretazio guztiak"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:316
+#, fuzzy
+msgid ""
+"Attempted to launch JACK audio daemon failed. Audio will be disabled.\n"
+"Please check configuration (Settings -> Configure Rosegarden -> Audio -> "
+"Startup)\n"
+" and restart."
+msgstr ""
+"JACK daemona egikaratzeko saioak huts egin du. Audioa indargabetuko da.\n"
+"Mesedez, egiaztatu konfigurazioa (Ezarpenak->Rosegarden Konfiguratu-"
+">Sekuenziadorea->JACK(control)\n"
+"eta hasieratu."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:325
+msgid "Starting sequencer..."
+msgstr "Sekuentziadorea hasieratzen..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:333
+msgid "Initializing plugin manager..."
+msgstr "Pluginen kudeatzailea hasieratzen..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:338
+msgid "Initializing view..."
+msgstr "Bista hasieratzen..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:354
+msgid "Special Parameters"
+msgstr "Parametro bereziak"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:430
+msgid "Starting sequence manager..."
+msgstr "Sekuentziadorearen kudeatzailea hasieratzen..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:456
+msgid "Clearing studio data..."
+msgstr "Estudioaren datuak garbitzen..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:475
+#: ../src/gui/editors/notation/NotationView.cpp:558
+msgid "Starting..."
+msgstr "Hasieratzen..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:556
+msgid "Import Rosegarden &Project file..."
+msgstr "Rosegarden &proiektu artxiboa Inportatu..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:560
+msgid "Import &MIDI file..."
+msgstr "&MIDI artxiboa inportatu..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:564
+msgid "Import &Rosegarden 2.1 file..."
+msgstr "&Rosegarden 2.1 artxiboa inportatu..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:568
+msgid "Import &Hydrogen file..."
+msgstr "&Hydrogen artxiboa inportatu..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:572
+msgid "Merge &File..."
+msgstr "Artxiboa Na&hasi..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:576
+msgid "Merge &MIDI file..."
+msgstr "&MIDI artxiboa nahasi..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:580
+msgid "Merge &Rosegarden 2.1 file..."
+msgstr "&Rosegarden 2.1 artxbiboa nahasi..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:584
+msgid "Merge &Hydrogen file..."
+msgstr "&Hydrogen artxiboa nahasi..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:588
+msgid "Export Rosegarden &Project file..."
+msgstr "&Rosegarden 2.1 proiektu artxiboa esportatu..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:592
+msgid "Export &MIDI file..."
+msgstr "&MIDI artxiboa esportatu..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:596
+#, fuzzy
+msgid "Export &LilyPond file..."
+msgstr "&LilyPond artxiboa esportatu..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:600
+msgid "Export Music&XML file..."
+msgstr "Music&XML artxiboa esportatu..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:604
+msgid "Export &Csound score file..."
+msgstr "&Csound artxiboae esportatu..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:608
+msgid "Export M&up file..."
+msgstr "M&up artxiboa esportatu..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:612
+#: ../src/gui/editors/notation/NotationView.cpp:1500
+#, fuzzy
+msgid "Print &with LilyPond..."
+msgstr "Aurrebista Lil&ypondekin..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:616
+#: ../src/gui/editors/notation/NotationView.cpp:1504
+msgid "Preview with Lil&yPond..."
+msgstr "Aurrebista Lil&ypondekin..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:620
+msgid "Play&list"
+msgstr "&Erreprodukzio zerrenda"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:627
+msgid "Rosegarden &Tutorial"
+msgstr "Rosegardenen &Tutoriala"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:631
+msgid "&Bug Reporting Guidelines"
+msgstr "Akatsak Jakinarazteko Direktibak"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:645
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:348
+#: ../src/gui/editors/segment/MarkerEditor.cpp:378
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:388
+#: ../src/gui/general/EditViewBase.cpp:190
+#: ../src/gui/studio/BankEditorDialog.cpp:318
+#: ../src/gui/studio/DeviceManagerDialog.cpp:227
+msgid "Und&o"
+msgstr "&Desegin"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:651
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:354
+#: ../src/gui/editors/segment/MarkerEditor.cpp:384
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:394
+#: ../src/gui/general/EditViewBase.cpp:196
+#: ../src/gui/studio/BankEditorDialog.cpp:324
+#: ../src/gui/studio/DeviceManagerDialog.cpp:233
+msgid "Re&do"
+msgstr "Ber&regin"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:665
+#: ../src/gui/editors/notation/NotationView.cpp:2297
+msgid "Show T&ools Toolbar"
+msgstr "&Lanabesen Barra Erakutsi"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:669
+msgid "Show Trac&ks Toolbar"
+msgstr "&Pisten Tresna-Barra Erakutsi"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:673
+msgid "Show &Editors Toolbar"
+msgstr "&Edizioaren Tresna-Barra Erakutsi"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:677
+#: ../src/gui/editors/notation/NotationView.cpp:2309
+msgid "Show Trans&port Toolbar"
+msgstr "&Transportearen Tresna-Barra Erakutsi"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:681
+msgid "Show &Zoom Toolbar"
+msgstr "&Zoomaren Tresna-Barra Erakutsi"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:688
+msgid "Show Tra&nsport"
+msgstr "&Transportea Erakutsi"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:693
+msgid "Show Track &Labels"
+msgstr "Pistaren &Etiketak Erakutsi"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:698
+msgid "Show Playback Position R&uler"
+msgstr "Erreprodukziorako Kokapen-Erregela Erakutsi"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:703
+msgid "Show Te&mpo Ruler"
+msgstr "Te&npo Erregela Erakutsi"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:708
+msgid "Show Cho&rd Name Ruler"
+msgstr "A&korde Izenen Erregela Erakutsi"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:714
+msgid "Show Segment Pre&views"
+msgstr "Segmentuen &Aurrebistak Erakutsi"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:719
+msgid "Show Special &Parameters"
+msgstr "&Parametro Bereziak Erakutsi"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:753
+#: ../src/gui/editors/matrix/MatrixView.cpp:641
+#: ../src/gui/editors/notation/NotationView.cpp:1772
+#, fuzzy
+msgid "&Select and Edit"
+msgstr "A&ukeratu eta Editatu"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:758
+#: ../src/gui/editors/matrix/MatrixView.cpp:646
+msgid "&Draw"
+msgstr "&Marraztu"
+
+#: ../src/commands/edit/EraseCommand.h:50
+#: ../src/gui/application/RosegardenGUIApp.cpp:763
+#: ../src/gui/editors/matrix/MatrixView.cpp:651
+#: ../src/gui/editors/notation/NotationView.cpp:1766
+msgid "&Erase"
+msgstr "E&zabatu"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:768
+#: ../src/gui/editors/matrix/MatrixView.cpp:656
+msgid "&Move"
+msgstr "&Mugitu"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:775
+msgid "&Resize"
+msgstr "&Tamaina Aldatu"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:782 rc.cpp:87
+#, no-c-format
+msgid "&Split"
+msgstr "&Zatitu"
+
+#: ../src/commands/segment/SegmentJoinCommand.h:53
+#: ../src/gui/application/RosegardenGUIApp.cpp:789
+msgid "&Join"
+msgstr "&Batu"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:795
+msgid "&Harmonize"
+msgstr "&Armonizatu"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:806
+#: ../src/gui/rulers/TempoRuler.cpp:157
+msgid "Open Tempo and Time Signature Editor"
+msgstr "Tenpo eta Konpas-Neurriaren Editorea Ireki"
+
+#: ../src/commands/segment/CutRangeCommand.cpp:41
+#: ../src/gui/application/RosegardenGUIApp.cpp:812
+msgid "Cut Range"
+msgstr "Tartea Moztu"
+
+#: ../src/commands/edit/CopyCommand.cpp:73
+#: ../src/gui/application/RosegardenGUIApp.cpp:816
+msgid "Copy Range"
+msgstr "Tartea Kopiatu"
+
+#: ../src/commands/segment/PasteRangeCommand.cpp:45
+#: ../src/gui/application/RosegardenGUIApp.cpp:820
+msgid "Paste Range"
+msgstr "Tartea Itsatsi"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:828
+#, fuzzy
+msgid "Insert Range..."
+msgstr "Tartea Txertatu..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:832
+#: ../src/gui/editors/notation/NotationView.cpp:1804
+msgid "De&lete"
+msgstr "E&zabatu "
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:836
+msgid "Select &All Segments"
+msgstr "Segmentu &Guztiak Hautatu"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:852
+msgid "Edit Mar&kers..."
+msgstr "Mar&katzaileak Editatu..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:856
+msgid "Edit Document P&roperties..."
+msgstr "Dokumentuaren P&ropietateak Editatu..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:864
+msgid "Open in &Default Editor"
+msgstr "&Lehenetsitako Editorean Ireki"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:870
+#: ../src/gui/general/EditViewBase.cpp:206
+msgid "Open in Matri&x Editor"
+msgstr "Matri&z Editorean Ireki"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:876
+#: ../src/gui/general/EditViewBase.cpp:212
+msgid "Open in &Percussion Matrix Editor"
+msgstr "&Perkusiorako Matriz Editorean Ireki"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:882
+#: ../src/gui/general/EditViewBase.cpp:218
+msgid "Open in &Notation Editor"
+msgstr "&Notazio Editorean Ireki"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:888
+#: ../src/gui/general/EditViewBase.cpp:224
+msgid "Open in &Event List Editor"
+msgstr "&Gertaeren Zerrenda Editorean Irekin"
+
+#: ../src/commands/edit/EventQuantizeCommand.cpp:120
+#: ../src/commands/edit/EventUnquantizeCommand.cpp:87
+#: ../src/gui/application/RosegardenGUIApp.cpp:894
+msgid "&Quantize..."
+msgstr "&Kuantifikatu..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:908
+#: ../src/gui/editors/matrix/MatrixView.cpp:686
+msgid "Repeat Last Quantize"
+msgstr "Azkenengo Kuantifikazioa Errepikatu"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:928
+msgid "Split at Time..."
+msgstr "Zaitu ondoko Denboran..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:932
+#: ../src/gui/general/EditView.cpp:796
+msgid "Jog &Left"
+msgstr "Ez&kerrerantz Mugitu"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:936
+#: ../src/gui/general/EditView.cpp:800
+msgid "Jog &Right"
+msgstr "Esk&uinerantz Mugitu"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:940
+msgid "Set Start Time..."
+msgstr "Hasierako Denbora Ezarri..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:944
+msgid "Set Duration..."
+msgstr "Iraupena Ezarri..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:953
+msgid "Turn Re&peats into Copies"
+msgstr "E&rrepikapenak Kopia Bihurtu"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:958
+msgid "Manage Tri&ggered Segments"
+msgstr "&Aktibatutako Segmentuak Kudeatu"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:962
+msgid "Set Tempos from &Beat Segment"
+msgstr "Tenpoak &Pultsuen Segmentutik Ezarri"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:966
+msgid "Set &Tempo to Audio Segment Duration"
+msgstr "&Tenpoa Audio Segmentuaren Iraupenaren Arabera Ezarri"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:972
+#, fuzzy
+msgid "Manage A&udio Files"
+msgstr "Audio artxiboaren etiketa aldatu"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:977
+msgid "Show Segment Labels"
+msgstr "Segmentuaren Etiketak Erakutsi"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:986
+msgid "Add &Track"
+msgstr "&Pista Gehitu"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:990
+#, fuzzy
+msgid "&Add Tracks..."
+msgstr "Pistak Gehitu..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:996
+msgid "D&elete Track"
+msgstr "P&ista Ezabatu"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1002
+msgid "Move Track &Down"
+msgstr "Pista &Behera Mugitu"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1008
+msgid "Move Track &Up"
+msgstr "Pista G&ora Mugitu"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1012
+msgid "Select &Next Track"
+msgstr "Hautatu &Hurrengo Pista"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1017
+msgid "Select &Previous Track"
+msgstr "&Lehengo Pista Hautatu"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1022
+#, fuzzy
+msgid "Mute or Unmute Track"
+msgstr "Pista Mututu"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1027
+msgid "Arm or Un-arm Track for Record"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1034
+msgid "&Mute all Tracks"
+msgstr "&Mututu Pista guztiak"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1040
+msgid "&Unmute all Tracks"
+msgstr "Pista bat ere &Ez Mututu"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1044
+msgid "&Remap Instruments..."
+msgstr "&Instrumentuak Birmapeatu..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1053
+msgid "&Audio Mixer"
+msgstr "Audio &Nahastailea"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1059
+msgid "Midi Mi&xer"
+msgstr "MIDI Na&hastailea"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1065
+msgid "Manage MIDI &Devices"
+msgstr "MIDI &Dispositiboak Kudeatu"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1071
+msgid "Manage S&ynth Plugins"
+msgstr "&Sintetizagailu Pluginak Kudeatu"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1075
+msgid "Modify MIDI &Filters"
+msgstr "MIDI I&ragazkiak Aldatu"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1079
+msgid "MIDI Thru Routing"
+msgstr "MIDI Thru Bideen Hautaketa"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1085
+msgid "Manage &Metronome"
+msgstr "&Metronomoa Kudeatu"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1089
+msgid "&Save Current Document as Default Studio"
+msgstr "Oraingo Dokumentua Lehenetsitako Estudio gisa &Gorde"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1093
+msgid "&Import Default Studio"
+msgstr "&Lehenetsitako Estudioa Inportatu"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1097
+msgid "Im&port Studio from File..."
+msgstr "Artxibotik Estudioa Inpor&tatu..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1101
+msgid "&Reset MIDI Network"
+msgstr "MIDI Sarea &Berrasi"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1105
+#, fuzzy
+msgid "Set Quick Marker at Playback Position"
+msgstr "Tenpo Aldaketa Txertatu Erreprodukzioaren Posizioan "
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1109
+msgid "Jump to Quick Marker"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1142
+#: ../src/gui/editors/matrix/MatrixView.cpp:782
+#: ../src/gui/editors/notation/NotationView.cpp:2397
+#: ../src/gui/studio/AudioMixerWindow.cpp:105
+#: ../src/gui/studio/MidiMixerWindow.cpp:81
+msgid "&Play"
+msgstr "&Jo"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1153
+#: ../src/gui/editors/matrix/MatrixView.cpp:791
+#: ../src/gui/editors/notation/NotationView.cpp:2406
+#: ../src/gui/studio/AudioMixerWindow.cpp:114
+#: ../src/gui/studio/MidiMixerWindow.cpp:90
+msgid "&Stop"
+msgstr "&Gelditu"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1160
+#: ../src/gui/editors/matrix/MatrixView.cpp:802
+#: ../src/gui/editors/notation/NotationView.cpp:2417
+#: ../src/gui/studio/AudioMixerWindow.cpp:125
+#: ../src/gui/studio/MidiMixerWindow.cpp:101
+msgid "&Fast Forward"
+msgstr "&Bizkor Aurreratu"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1168
+#: ../src/gui/editors/matrix/MatrixView.cpp:796
+#: ../src/gui/editors/notation/NotationView.cpp:2411
+#: ../src/gui/studio/AudioMixerWindow.cpp:119
+#: ../src/gui/studio/MidiMixerWindow.cpp:95
+msgid "Re&wind"
+msgstr "Bi&rbobinatu"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1175
+msgid "P&unch in Record"
+msgstr "P&unch in Grabaketa"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1182
+#: ../src/gui/studio/AudioMixerWindow.cpp:143
+#: ../src/gui/studio/MidiMixerWindow.cpp:119
+msgid "&Record"
+msgstr "G&rabatu"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1189
+#: ../src/gui/editors/matrix/MatrixView.cpp:808
+#: ../src/gui/editors/notation/NotationView.cpp:2423
+#: ../src/gui/studio/AudioMixerWindow.cpp:131
+#: ../src/gui/studio/MidiMixerWindow.cpp:107
+msgid "Rewind to &Beginning"
+msgstr "Birbobinatu &Hasierara"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1196
+#: ../src/gui/editors/matrix/MatrixView.cpp:814
+#: ../src/gui/editors/notation/NotationView.cpp:2429
+#: ../src/gui/studio/AudioMixerWindow.cpp:137
+#: ../src/gui/studio/MidiMixerWindow.cpp:113
+msgid "Fast Forward to &End"
+msgstr "Bizkor Aurreratu &Bukaerara"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1203
+#: ../src/gui/editors/matrix/MatrixView.cpp:832
+#: ../src/gui/editors/notation/NotationView.cpp:2447
+msgid "Scro&ll to Follow Playback"
+msgstr "Erreprodukzioarekin Batera &Mugitu"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1209
+#: ../src/gui/editors/matrix/MatrixView.cpp:838
+#: ../src/gui/editors/notation/NotationView.cpp:2453
+#: ../src/gui/studio/AudioMixerWindow.cpp:149
+#: ../src/gui/studio/MidiMixerWindow.cpp:125
+msgid "Panic"
+msgstr "Izua"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1213
+msgid "Segment Debug Dump "
+msgstr "Segmentuak Arazteko Zabortegia"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1283
+msgid " Zoom: "
+msgstr " Handitu: "
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1719
+msgid "File \"%1\" does not exist"
+msgstr "\"%1\" artxiboa ez da existitzen"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1725
+msgid "File \"%1\" is actually a directory"
+msgstr "\"%1\" artxiboa direktorio bat da"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1734
+msgid "You do not have read permission for \"%1\""
+msgstr "Ez daukazu \"%1\" artxiborako irakurketa baimenik"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1802
+msgid ""
+"An auto-save file for this document has been found\n"
+"Do you want to open it instead ?"
+msgstr ""
+"Dokumentu honetarako auto-gordea izan den artxiboa bat aurkitu da\n"
+"Ireki nahi duzu artxibo hori?"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1896
+msgid "Example Files"
+msgstr "Adibide-artxiboak"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2100
+msgid "Opening a new application window..."
+msgstr "Aplikazioaren leiho berri bat irekitzen..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2110
+msgid "Creating new document..."
+msgstr "Dokumentu berri bat sortzen..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2154
+#, c-format
+msgid ""
+"Malformed URL\n"
+"%1"
+msgstr ""
+"URL formato okerra\n"
+"%1"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2179
+#: ../src/gui/application/RosegardenGUIApp.cpp:2240
+msgid "Opening file..."
+msgstr "Artxiboa irekitzen..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2201
+#: ../src/gui/application/RosegardenGUIApp.cpp:2220
+msgid "Open File"
+msgstr "Artxiboa Ireki"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1225
+#: ../src/gui/application/RosegardenGUIApp.cpp:2258
+msgid "Saving file..."
+msgstr "Artxiboa gordetzen..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2330
+msgid "This is not a valid filename.\n"
+msgstr "Artxibo izen hau ez da baliozkoa.\n"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2335
+msgid "This is not a local file.\n"
+msgstr "Hau ez da artxibo lokal bat.\n"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2342
+#: ../src/gui/studio/BankEditorDialog.cpp:1640
+#: ../src/gui/studio/DeviceManagerDialog.cpp:787
+msgid "You have specified a directory"
+msgstr "Direktorio bat adierazi duzu"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2348
+#: ../src/gui/studio/BankEditorDialog.cpp:1646
+#: ../src/gui/studio/DeviceManagerDialog.cpp:793
+msgid "The specified file exists. Overwrite?"
+msgstr "Adierazitako artxiboa existitzen da. Gainidatzi?"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2362
+msgid "Saving file with a new filename..."
+msgstr "Artxiboa gordetzen izen berri batekin..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2364
+#, fuzzy
+msgid "Rosegarden files"
+msgstr "Rosegarden artxiboak"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2365
+#: ../src/gui/application/RosegardenGUIApp.cpp:4860
+#: ../src/gui/application/RosegardenGUIApp.cpp:4904
+#: ../src/gui/application/RosegardenGUIApp.cpp:4942
+#: ../src/gui/application/RosegardenGUIApp.cpp:4975
+#: ../src/gui/application/RosegardenGUIApp.cpp:5009
+#: ../src/gui/application/RosegardenGUIApp.cpp:5116
+msgid "All files"
+msgstr "Artxibo Guztiak"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2366
+msgid "Save as..."
+msgstr "Honela gorde..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2404
+msgid "Closing file..."
+msgstr "Artxiboa ixten..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2421
+#: ../src/gui/editors/notation/NotationView.cpp:4618
+msgid "Printing..."
+msgstr "Inprimatzen..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2433
+#: ../src/gui/editors/notation/NotationView.cpp:4635
+msgid "Previewing..."
+msgstr "Aurrebista egiten..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2440
+msgid "Exiting..."
+msgstr "Irteten..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2463
+msgid "Cutting selection..."
+msgstr "Hautatutakoa ebakitzen..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2474
+#: ../src/gui/editors/matrix/MatrixView.cpp:1614
+#: ../src/gui/editors/notation/NotationView.cpp:4763
+msgid "Copying selection to clipboard..."
+msgstr "Hautatutakoa arbelera kopiatzen..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2484
+#: ../src/gui/editors/eventlist/EventView.cpp:878
+#: ../src/gui/editors/matrix/MatrixView.cpp:1625
+#: ../src/gui/editors/notation/NotationView.cpp:4796
+#: ../src/gui/editors/notation/NotationView.cpp:4841
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:352
+msgid "Clipboard is empty"
+msgstr "Arbela hutsik"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2487
+#: ../src/gui/editors/eventlist/EventView.cpp:882
+#: ../src/gui/editors/matrix/MatrixView.cpp:1629
+#: ../src/gui/editors/notation/NotationView.cpp:4804
+#: ../src/gui/editors/notation/NotationView.cpp:4845
+msgid "Inserting clipboard contents..."
+msgstr "Arbelaren edukia txertatzen..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2556
+#, fuzzy
+msgid "Duration of empty range to insert"
+msgstr "Txertatu beharreko tarte hutsaren iraupena"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2631
+msgid "This function needs no more than one segment to be selected."
+msgstr "Funtzio honek hautatuta dagoen segmentu bat behar du bakarrik"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2654
+msgid "Can't join Audio segments"
+msgstr "Ezin dira Audio segmentuak batu"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2707
+#, fuzzy
+msgid "rescaling an audio file"
+msgstr "audio artxibo bat birreskalatzen"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2723
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:172
+#, fuzzy
+msgid "Rescaling audio file..."
+msgstr "Audio artxiboa birreskalatzen..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2767
+#, fuzzy
+msgid ""
+"The audio file path does not exist or is not writable.\n"
+"You must set the audio file path to a valid directory in Document Properties "
+"before %1.\n"
+"Would you like to set it now?"
+msgstr ""
+"Audio artxiboen bidea ez da existitzen edo ez da idazgarria.\n"
+"Mesedez, jarri artxiboen bidean direktorio baliozko bat "
+"DokumentuarenPropietateetan %1 baino lehenago.\n"
+"Konfiguratu nahi duzu orain?"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2769
+#: ../src/gui/application/RosegardenGUIApp.cpp:5291
+#: ../src/gui/application/RosegardenGUIApp.cpp:5339
+#: ../src/gui/editors/segment/TrackButtons.cpp:419
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:159
+msgid "Set audio file path"
+msgstr "Audio artxiboen direktorioa ezarri"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2833
+msgid "Jog Selection"
+msgstr "Hautatutakoa Mugitu"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2978
+#, fuzzy, c-format
+msgid ""
+"_n: Split Segment at Time\n"
+"Split %n Segments at Time"
+msgstr ""
+"_n: %1 - 1 Segmentu - %2\n"
+"%1 - %n Segmentu - %2"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3013
+#: ../src/gui/general/EditViewBase.cpp:619
+msgid "Segment Start Time"
+msgstr "Segmentuaren Hasiera Denbora"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3023
+msgid "Set Segment Start Times"
+msgstr "Segmentuaren Hasiera Denborak Ezarri"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3024
+#: ../src/gui/general/EditViewBase.cpp:626
+msgid "Set Segment Start Time"
+msgstr "Segmentuaren Hasiera Denbora Ezarri"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3056
+#: ../src/gui/general/EditViewBase.cpp:644
+msgid "Segment Duration"
+msgstr "Segmentuaren Iraupena"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3068
+msgid "Set Segment Durations"
+msgstr "Segmentuaren Iraupenak Ezarri"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3069
+#: ../src/gui/general/EditViewBase.cpp:652
+msgid "Set Segment Duration"
+msgstr "Segmentuaren Iraupena Ezarri"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3176
+#: ../src/gui/application/RosegardenGUIApp.cpp:5875
+msgid "Set Global Tempo"
+msgstr "Tenpo Globala Ezarri"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3234
+#: ../src/gui/general/EditViewBase.cpp:477
+msgid "Toggle the toolbar..."
+msgstr "Tresna-Barra Jarri-Kendu..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3244
+msgid "Toggle the tools toolbar..."
+msgstr "Lanabesen Tresna-Barra Jarri edo Kendu..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3254
+msgid "Toggle the tracks toolbar..."
+msgstr "Pisten Tresna-Barra Jarri edo Kendu"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3264
+msgid "Toggle the editor toolbar..."
+msgstr "Editorearen Tresna-Barra Jarri edo Kendu..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3274
+msgid "Toggle the transport toolbar..."
+msgstr "Transportearen Tresna-Barra Jarri edo Kendu..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3284
+msgid "Toggle the zoom toolbar..."
+msgstr "Zoom lanabesen Tresna-Barra Jarri edo Kendu..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3294
+msgid "Toggle the Transport"
+msgstr "Transportea Jarri edo Kendu"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3377
+#: ../src/gui/general/EditViewBase.cpp:487
+msgid "Toggle the statusbar..."
+msgstr "Egoera barra Jarri edo Kendu..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3434
+msgid ""
+"The join tool isn't implemented yet. Instead please highlight the segments "
+"you want to join and then use the menu option:\n"
+"\n"
+" Segments->Collapse Segments.\n"
+msgstr ""
+"Batzeko tresna ez dago inplementatuta oraindik. Horren ordez, mesedez, "
+"hautatubatu nahi dituzun segmentuak eta erabili menuaren opzioa:\n"
+"\n"
+" Segmentuak->Segmentuak Batu.\n"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3437
+msgid "Join tool not yet implemented"
+msgstr "Batzeko tresna ez dago inplementatuta oraindik"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3675
+msgid "Revert modified document to previous saved version?"
+msgstr "Bueltatu aldatutako dokumentuaren aurreko bertsiora?"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3691
+msgid ""
+"*.rgp|Rosegarden Project files\n"
+"*|All files"
+msgstr ""
+"*.rgp|Rosegarden Proiektu Artxiboak\n"
+"*|Artxibo Guztiak"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3692
+msgid "Import Rosegarden Project File"
+msgstr "Rosegarden Proiektu Artxiboa Inportatu"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3717
+msgid "Failed to import project file \"%1\""
+msgstr "Proiektu artxiboa inportatzerakoan errorea\"%1\""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3739
+msgid "Open MIDI File"
+msgstr "MIDI Artxiboa Ireki"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3756
+msgid "Merge MIDI File"
+msgstr "MIDI Artxiboa Nahasi"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3866
+msgid "Importing MIDI file..."
+msgstr "MIDI Artxiboa Inportatzen..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3903
+msgid "Calculating notation..."
+msgstr "Partitura kalkulatzen..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3950
+msgid "Calculate Notation"
+msgstr "Partitura Kalkulatu"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3991
+#: ../src/gui/application/RosegardenGUIApp.cpp:4008
+msgid ""
+"*.rose|Rosegarden-2 files\n"
+"*|All files"
+msgstr ""
+"*.rose|Rosegarden-2 Artxiboak\n"
+"*|Artxibo Guztiak"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3992
+#: ../src/gui/application/RosegardenGUIApp.cpp:4009
+msgid "Open Rosegarden 2.1 File"
+msgstr "Rosegarden 2.1 artxiboa ireki"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4026
+msgid "Importing Rosegarden 2.1 file..."
+msgstr "Rosegarden 2.1 Artxiboa Inportatzen ..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4052
+msgid "Can't load Rosegarden 2.1 file. It appears to be corrupted."
+msgstr "Rosegarden 2.1 artxiboa ezin da kargatu. Hondatuta dirudi."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4078
+#: ../src/gui/application/RosegardenGUIApp.cpp:4095
+msgid ""
+"*.h2song|Hydrogen files\n"
+"*|All files"
+msgstr ""
+"*.h2song|Hydrogen Artxiboak\n"
+"*|Artxibo Guztiak"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4079
+#: ../src/gui/application/RosegardenGUIApp.cpp:4096
+msgid "Open Hydrogen File"
+msgstr "Hydrogen Artxiboa Ireki"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4113
+msgid "Importing Hydrogen file..."
+msgstr "Hydrogen Artxiboa Inportatzen..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4139
+msgid "Can't load Hydrogen file. It appears to be corrupted."
+msgstr "Ezin da Hydrogen artxiboa kargatu. Hondatuta dirudi."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4527
+#, fuzzy
+msgid "Export and import of Rosegarden Project files"
+msgstr "Rosegarden Proiektu Artxiboa esportatzen..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4529
+#, fuzzy
+msgid "The Rosegarden Project Packager helper script"
+msgstr "Rosegarden Proiektuaren Enpaketatzailea ez dago eskuragarri\n"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4533
+msgid "%1 - for project file support"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4550
+msgid "The Rosegarden LilyPondView helper script"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4554
+#, fuzzy
+msgid "%1 - for LilyPond preview support"
+msgstr "Lilypond aurrebista opzioak"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4570
+msgid "The Rosegarden Audio File Importer helper script"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4574
+#, fuzzy
+msgid "%1 - for audio file import"
+msgstr "Audio artxiboen direktorioa ezarri"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4585
+msgid ""
+"<h3>Helper programs not found</h3><p>Rosegarden could not find one or more "
+"helper programs which it needs to provide some features. The following "
+"features will not be available:</p>"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4586
+#: ../src/gui/application/RosegardenGUIApp.cpp:4592
+#, fuzzy
+msgid "<ul>"
+msgstr "<lehenetsia>"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4588
+#: ../src/gui/application/RosegardenGUIApp.cpp:4594
+#, fuzzy
+msgid "<li>%1</li>"
+msgstr "<li> %1 %2 -tik)</li>"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4590
+#: ../src/gui/application/RosegardenGUIApp.cpp:4596
+msgid "</ul>"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4591
+msgid ""
+"<p>To fix this, you should install the following additional programs:</p>"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4603
+msgid "Helper programs not found"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4686
+msgid "Starting the sequencer..."
+msgstr "Sekuentziadorea hasieratzen..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4712
+msgid "Couldn't start the sequencer"
+msgstr "Ezin izan da sekuentziadorea hasieratu"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4789
+msgid "Clearing down jackd..."
+msgstr "Jack garbitzen..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4803
+msgid "Starting jackd..."
+msgstr "Jackd hasieratzen..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4842
+msgid ""
+"The Rosegarden sequencer process has exited unexpectedly. Sound and "
+"recording will no longer be available for this session.\n"
+"Please exit and restart Rosegarden to restore sound capability."
+msgstr ""
+"Rosegardenen sekuentziazio prozesua bukatu da ustekabean. Soinua eta. "
+"grabaketa ez dira eskuragarri egongo saio honetarako\n"
+"Mesedez, irten eta berrasi Rosegarden soinurako gaitasuna berreskuratzeko."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4846
+msgid ""
+"The Rosegarden sequencer could not be started, so sound and recording will "
+"be unavailable for this session.\n"
+"For assistance with correct audio and MIDI configuration, go to http://"
+"rosegardenmusic.com."
+msgstr ""
+"Rosegardenen sekuentziadorea ezin izan da hasieratu, beraz ez da "
+"egongosoinurik edo grabatzeko aukerarik saio honetan.\n"
+"Audio eta MIDI konfigurazio zuzen bati buruzko laguntza eskuratzeko, "
+"joahttp://rosegardenmusic.com. web orrira"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4856
+msgid "Exporting Rosegarden Project file..."
+msgstr "Rosegarden Proiektu Artxiboa esportatzen..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4859
+msgid "Rosegarden Project files\n"
+msgstr "Rosegarden Proiektu Artxiboak\n"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4861
+#: ../src/gui/application/RosegardenGUIApp.cpp:4905
+#: ../src/gui/application/RosegardenGUIApp.cpp:4943
+#: ../src/gui/application/RosegardenGUIApp.cpp:4976
+#: ../src/gui/application/RosegardenGUIApp.cpp:5010
+#: ../src/gui/application/RosegardenGUIApp.cpp:5116
+msgid "Export as..."
+msgstr "Honela esportatu..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4875
+#, c-format
+msgid "Saving Rosegarden file to package failed: %1"
+msgstr "Rosegarden artxiboa pakete batera grabatzeak huts egin du: %1"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4889
+msgid "Failed to export to project file \"%1\""
+msgstr "Proiektu artxibora esportatzerakoan errorea \"%1\""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4900
+#: ../src/gui/application/RosegardenGUIApp.cpp:4915
+msgid "Exporting MIDI file..."
+msgstr "MIDI Artxiboa Esportatzen..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4903
+msgid "Standard MIDI files\n"
+msgstr "Standard MIDI artxiboak\n"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4934
+#: ../src/gui/application/RosegardenGUIApp.cpp:4966
+#: ../src/gui/application/RosegardenGUIApp.cpp:4999
+#: ../src/gui/application/RosegardenGUIApp.cpp:5103
+#: ../src/gui/application/RosegardenGUIApp.cpp:5140
+#: ../src/gui/editors/notation/NotationView.cpp:4733
+msgid "Export failed. The file could not be opened for writing."
+msgstr "Esportatzeak huts egin du. Artxiboa ezin izan da ireki idazteko."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4940
+#: ../src/gui/application/RosegardenGUIApp.cpp:4952
+msgid "Exporting Csound score file..."
+msgstr "Csound partitura artxiboa esportatzen..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4972
+#: ../src/gui/application/RosegardenGUIApp.cpp:4985
+msgid "Exporting Mup file..."
+msgstr "Mup artxiboa esportatzen..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4975
+msgid "Mup files\n"
+msgstr "Mup artxiboak\n"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5005
+#: ../src/gui/application/RosegardenGUIApp.cpp:5089
+#: ../src/gui/editors/notation/NotationView.cpp:4719
+#, fuzzy
+msgid "Exporting LilyPond file..."
+msgstr "Lilypond artxiboa esportatzen..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5008
+#, fuzzy
+msgid "LilyPond files"
+msgstr "LilyPond artxiboak"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5023
+#: ../src/gui/editors/notation/NotationView.cpp:4653
+#, fuzzy
+msgid "Printing LilyPond file..."
+msgstr "Lilypond artxiboaren aurrebista..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5028
+#: ../src/gui/application/RosegardenGUIApp.cpp:5052
+#: ../src/gui/editors/notation/NotationView.cpp:4658
+#: ../src/gui/editors/notation/NotationView.cpp:4682
+#, fuzzy
+msgid "Failed to open a temporary file for LilyPond export."
+msgstr ""
+"Lilypondera esportatzeko behin-behineko artxibo bat irekitzerakoan errorea."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5047
+#: ../src/gui/editors/notation/NotationView.cpp:4677
+#, fuzzy
+msgid "Previewing LilyPond file..."
+msgstr "Lilypond artxiboaren aurrebista..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5080
+#: ../src/gui/editors/notation/NotationView.cpp:4710
+#, fuzzy
+msgid "LilyPond Preview Options"
+msgstr "Lilypond Aurrebista Opzioak"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5081
+#: ../src/gui/editors/notation/NotationView.cpp:4711
+#, fuzzy
+msgid "LilyPond preview options"
+msgstr "Lilypond aurrebista opzioak"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5112
+#: ../src/gui/application/RosegardenGUIApp.cpp:5126
+msgid "Exporting MusicXML file..."
+msgstr "MusicXML artxiboa esportatzen..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5115
+msgid "XML files"
+msgstr "XML artxiboak"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5289
+#: ../src/gui/editors/segment/TrackButtons.cpp:417
+msgid ""
+"The audio file path does not exist or is not writable.\n"
+"Please set the audio file path to a valid directory in Document Properties "
+"before recording audio.\n"
+"Would you like to set it now?"
+msgstr ""
+"Audio artxiboen direktorioa ez da existitzen edo ez da idazgarria.\n"
+"Mesedez, jarri audio artxiboen bide baliozko bat Dokumentuaren "
+"Propietateetanaudio grabatu baino lehenago.\n"
+"Konfiguratu nahi duzu orain?"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5337
+msgid ""
+"The audio file path does not exist or is not writable.\n"
+"Please set the audio file path to a valid directory in Document Properties "
+"before you start to record audio.\n"
+"Would you like to set it now?"
+msgstr ""
+"Audio artxiboen direktorioa ez da existitzen edo ez da idazgarria.\n"
+"Mesedez, jarri audio artxiboen bide baliozko bat Dokumentuaren "
+"Propietateetanaudio grabatu baino lehenago.\n"
+"Konfiguratu nahi duzu orain?"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5780
+msgid "Move playback pointer to time"
+msgstr "Mugitu erreprodukzioaren punteroa denborara"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5793
+#: ../src/gui/editors/matrix/MatrixView.cpp:2240
+msgid "%1%"
+msgstr "%1%"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5861
+#, c-format
+msgid "Replace Tempo Change at %1"
+msgstr "Tenpo aldaketa ordezkatu %1 (e)an"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5891
+msgid "Set Global and Default Tempo"
+msgstr "Ezarri Tenpo Globala eta Lehenetsia"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5914
+msgid "Move Tempo Change"
+msgstr "Mugitu Tenpoaren Aldaketa"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5949
+#, fuzzy
+msgid "new marker"
+msgstr "Submasterrik gabe"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5950
+#, fuzzy
+msgid "no description"
+msgstr "Deskribapena"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:6363
+#, c-format
+msgid "Sequencer failed to add audio file %1"
+msgstr "Sekuentziadoreak huts egin du %1 audio artxiboa gehitzerakoan"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:6388
+#, c-format
+msgid "Sequencer failed to remove audio file id %1"
+msgstr "Sekuentziadoreak huts egin du %1 id audio artxiboaezabatzean"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:6448
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:1086
+msgid "Modify Segment label"
+msgstr "Aldatu Segmentuaren Etiketa"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:6450
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:1088
+msgid "Modify Segments label"
+msgstr "Segmentuen Etiketak Aldatu"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:6452
+msgid "Relabelling selection..."
+msgstr "Hautatutakoa berretiketatzen..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7539
+msgid "Play List"
+msgstr "Erreprodukzio Zerrenda"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7567
+msgid "http://rosegarden.sourceforge.net/tutorial/en/chapter-0.html"
+msgstr "http://rosegarden.sourceforge.net/tutorial/en/chapter-0.html"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7574
+msgid "http://rosegarden.sourceforge.net/tutorial/bug-guidelines.html"
+msgstr "http://rosegarden.sourceforge.net/tutorial/bug-guidelines.html"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7650
+msgid "Queueing MIDI panic events for tranmission..."
+msgstr "MIDI izu-gertaerak itxaron-zerrendan sartzen, igortzeko..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7708
+msgid "Are you sure you want to save this as your default studio?"
+msgstr "Ziur zaude hau zure estudio lehenetsi bezala gordetzeko"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7713
+msgid "Saving current document as default studio..."
+msgstr "Oraingo dokumentua gordetzeko estudio lehenetsi bezala..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7738
+msgid ""
+"Are you sure you want to import your default studio and lose the current one?"
+msgstr "Ziur zaude zure estudio lehenetsia inportatzeko eta oraingoa galtzeko?"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7773
+msgid "Import Studio from File"
+msgstr "Inportatu Estudioa Artxibotik"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7807
+msgid "Import Studio"
+msgstr "Estudioa Inportatu"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:8015
+msgid ""
+"<h3>Newer version available</h3><p>A newer version of Rosegarden may be "
+"available.<br>Please consult the <a href=\"http://www.rosegardenmusic.com/"
+"getting/\">Rosegarden website</a> for more information.</p>"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:8016
+#, fuzzy
+msgid "Newer version available"
+msgstr "Itzulita (eskuragarri baldin badago) "
+
+#: ../src/gui/application/RosegardenApplication.cpp:104
+#, c-format
+msgid "Failed to load soundfont %1"
+msgstr "%1 soundfounta kargatzerakoan errorera"
+
+#: ../src/gui/application/main.cpp:311
+msgid "Rosegarden - A sequencer and musical notation editor"
+msgstr "Rosegarden - Sekuentziadorea eta partitura editorea"
+
+#: ../src/gui/application/main.cpp:315
+msgid "Don't use the sequencer (support editing only)"
+msgstr "Sekuentziadorea ez erabili (bakarrik editatzea jaso)"
+
+#: ../src/gui/application/main.cpp:316
+msgid "Don't show the splash screen"
+msgstr "Ongietorri pantaila ez erakutsi"
+
+#: ../src/gui/application/main.cpp:317
+msgid "Don't automatically run in the background"
+msgstr "Ez egikaritu automatikoki atzeko planoan"
+
+#: ../src/gui/application/main.cpp:318
+msgid "Attach to a running sequencer process, if found"
+msgstr "Lotu sekuentziadorearen prozesu aktibo bati, aurkitzen bada"
+
+#: ../src/gui/application/main.cpp:319
+msgid "Ignore installed version - for devs only"
+msgstr "Ignoratu instalatutako bertsioa - programatzaileentzat bakarrik"
+
+#: ../src/gui/application/main.cpp:320
+msgid "file to open"
+msgstr "ireki beharreko artxiboa"
+
+#: ../src/gui/application/main.cpp:370
+msgid "Installation contains the wrong version of Rosegarden."
+msgstr "Instalazioak Rosegardenen bertsio oker bat dauka"
+
+#: ../src/gui/application/main.cpp:371
+#, fuzzy
+msgid ""
+" The wrong versions of Rosegarden's data files were\n"
+" found in the standard KDE installation directories.\n"
+" (I am %1, but the installed files are for version %2.)\n"
+"\n"
+" This may mean one of the following:\n"
+"\n"
+" 1. This is a new upgrade of Rosegarden, and it has not yet been\n"
+" installed. If you compiled it yourself, check that you have\n"
+" run \"make install\" and that the procedure completed\n"
+" successfully.\n"
+"\n"
+" 2. The upgrade was installed in a non-standard directory,\n"
+" and an old version was found in a standard directory. If so,\n"
+" you will need to add the correct directory to your KDEDIRS\n"
+" environment variable before you can run it."
+msgstr ""
+" Las versiones incorrectas de los archivos de datos de\n"
+" Rosegarden se han encontrado en los directorios\n"
+" estándar de instalación de KDE.\n"
+" (Este programa es %1, pero los archivos instalados son\n"
+" para la versión %2.)\n"
+"\n"
+" Esto puede ser debido a una de las siguientes razones:\n"
+"\n"
+" 1. Esta es una actualización de Rosegarden, que no ha sido\n"
+" instalada todavía. Si la ha compilado usted mismo, compruebe\n"
+" que ha ejecutado \"make install\" y que el procedimiento se\n"
+" ha completado satisfactoriamente.\n"
+"\n"
+" 2. La actualización se ha instalado en un directorio no estándar,\n"
+" y una versión anterior se ha encontrado en el directorio estándar.\n"
+" Si es así, usted necesita añadir el directorio correcto a la variable\n"
+" de entorno KDEDIRS antes de ejecutar el programa. "
+
+#: ../src/gui/application/main.cpp:383 ../src/gui/application/main.cpp:401
+msgid "Installation problem"
+msgstr "Instalazio arazoa"
+
+#: ../src/gui/application/main.cpp:389
+msgid "Rosegarden does not appear to have been installed."
+msgstr "Ez dirudi Rosegarden instalatu denik"
+
+#: ../src/gui/application/main.cpp:390
+#, fuzzy
+msgid ""
+" One or more of Rosegarden's data files could not be\n"
+" found in the standard KDE installation directories.\n"
+"\n"
+" This may mean one of the following:\n"
+"\n"
+" 1. Rosegarden has not been correctly installed. If you compiled\n"
+" it yourself, check that you have run \"make install\" and that\n"
+" the procedure completed successfully.\n"
+"\n"
+" 2. Rosegarden has been installed in a non-standard directory,\n"
+" and you need to add this directory to your KDEDIRS environment\n"
+" variable before you can run it. This may be the case if you\n"
+" installed into $HOME or a local third-party package directory\n"
+" like /usr/local or /opt."
+msgstr ""
+" Rosegardenen datu artxibo bat edo gehiago ezin izan dira\n"
+" aurkitu KDE instalazio direktorio ohikoetan.\n"
+"\n"
+" Hau izan daieteke ondoko arrazoiengatik:\n"
+"\n"
+" 1. Rosegarden ez da instalatu modu egokian. Zure kabuz konpilatu\n"
+" baduzu, egiaztatu \"scons install\" exekutatu duzula eta prozedura\n"
+" modu egokian burutu dela\n"
+"\n"
+" 2. Rosegarden direktorio ezohiko batean instalatu da, eta KDEDIRS \n"
+" inguru-aldagaian sartu behar duzu exekutatu ahal izan baino lehenago\n"
+" Hau izan daiteke arrazoia $HOME-n edo beste pakete lokal batean "
+"instalatu\n"
+" baduzu, /usr/local edo /opt bezala"
+
+#: ../src/gui/application/main.cpp:414
+msgid "Rosegarden"
+msgstr "Rosegarden"
+
+#: ../src/gui/application/main.cpp:416
+#, fuzzy
+msgid ""
+"Copyright 2000 - 2008 Guillaume Laurent, Chris Cannam, Richard Bown\n"
+"Parts copyright 1994 - 2004 Chris Cannam, Andy Green, Richard Bown, "
+"Guillaume Laurent\n"
+"LilyPond fonts copyright 1997 - 2005 Han-Wen Nienhuys and Jan Nieuwenhuizen"
+msgstr ""
+"Copyright 2000 - 2006 Guillaume Laurent, Chris Cannam, Richard Bown\n"
+"Zatiak: copyright 1994 - 2006 Chris Cannam, Andy Green, Richard Bown, "
+"Guillaume Laurent\n"
+"LilyPonden tipografiak copyright 1997 - 2006 Han-Wen Nienhuys y Jan "
+"Nieuwenhuizen"
+
+#: ../src/gui/application/main.cpp:428
+msgid "Chord labelling code"
+msgstr "Akordeak irudikatzeko kodea"
+
+#: ../src/gui/application/main.cpp:429
+#, fuzzy
+msgid ""
+"LilyPond output\n"
+"assorted other patches\n"
+"i18n-ization"
+msgstr ""
+"Lilypond irteera\n"
+"beste adabaki hornituak\n"
+"internazionalizazioa"
+
+#: ../src/gui/application/main.cpp:430
+msgid ""
+"UI improvements\n"
+"bug fixes"
+msgstr ""
+"UIaren hobekuntzak\n"
+"akatsen zuzenketak"
+
+#: ../src/gui/application/main.cpp:431
+msgid ""
+"Segment colours\n"
+"Other UI and bug fixes"
+msgstr ""
+"Segmentuen koloreak\n"
+"UI-aren beste aldaketa batzuk eta akatsen zuzenketa"
+
+#: ../src/gui/application/main.cpp:432
+msgid ""
+"Russian translation\n"
+"i18n-ization"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:433 ../src/gui/application/main.cpp:434
+msgid "German translation"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:435
+msgid "Welsh translation"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:436
+msgid "French translation"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:437
+msgid ""
+"French translation\n"
+"Bug fixes"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:438 ../src/gui/application/main.cpp:439
+msgid "Italian translation"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:440 ../src/gui/application/main.cpp:441
+msgid "Swedish translation"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:442
+msgid "Estonian translation"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:443 ../src/gui/application/main.cpp:444
+msgid "Dutch translation"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:445
+msgid "HSpinBox class"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:446
+msgid "Transposition by interval"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:447
+msgid "Original designs for rotary controllers"
+msgstr "Kontrol birakarien jatorrizko diseinua"
+
+#: ../src/gui/application/main.cpp:448
+msgid "Japanese translation"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:449
+msgid ""
+"Auto-scroll deceleration\n"
+"Rests outside staves and other bug fixes"
+msgstr ""
+"Auto-scroll azelerazioa\n"
+"Pentagramaz kanpoko isiluneak eta beste akats batzuen zuzenketa"
+
+#: ../src/gui/application/main.cpp:450
+msgid "Simplified Chinese translation"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:451
+msgid "LIRC infrared remote-controller support"
+msgstr "LIRC azpigorri urrutiko-kontroladorerako euskarria"
+
+#: ../src/gui/application/main.cpp:452
+msgid "MTC slave timing implementation"
+msgstr "MTC denbora esklabuaren inplementatzea"
+
+#: ../src/gui/application/main.cpp:453
+msgid "Czech translation"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:454
+msgid "SCons/bksys building system"
+msgstr "Scons/bksys eraikutza sistema"
+
+#: ../src/gui/application/main.cpp:455
+msgid "icons, icons, icons"
+msgstr "ikonoak, ikonoak, ikonoak"
+
+#: ../src/gui/application/main.cpp:456 ../src/gui/application/main.cpp:457
+#: ../src/gui/application/main.cpp:458 ../src/gui/application/main.cpp:459
+msgid "Spanish translation"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:460 ../src/gui/application/main.cpp:461
+msgid "Catalan translation"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:462
+msgid ""
+"1.2.3 splash screen photo\n"
+"Gave birth to D. Michael McIntyre, bought him a good flute once\n"
+"upon a time, and always humored him when he came over to play her\n"
+"some new instrument, even though she really hated his playing.\n"
+"Born October 19, 1951, died September 21, 2007, R. I. P."
+msgstr ""
+
+#: ../src/gui/application/main.cpp:463
+#, fuzzy
+msgid "Initial guitar chord editing code"
+msgstr "Gitarra akordeen editorea"
+
+#: ../src/gui/application/main.cpp:464
+msgid "Polish translation"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:465
+#, fuzzy
+msgid "Basque translation"
+msgstr "Tonalitatearen transposizioa"
+
+#: ../src/gui/application/main.cpp:466
+msgid "Klearlook theme"
+msgstr ""
+
+#: ../src/_translatorinfo.cpp:1 ../src/gui/application/main.cpp:468
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr "David Garc�a-Abad"
+
+#: ../src/_translatorinfo.cpp:3 ../src/gui/application/main.cpp:468
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:719
+msgid "Welcome!"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:731
+msgid ""
+"<h2>Welcome to Rosegarden!</h2><p>Welcome to the Rosegarden audio and MIDI "
+"sequencer and musical notation editor.</p><ul><li>If you have not already "
+"done so, you may wish to install some DSSI synth plugins, or a separate "
+"synth program such as QSynth. Rosegarden does not synthesize sounds from "
+"MIDI on its own, so without these you will hear nothing.</"
+"li><br><br><li>Rosegarden uses the JACK audio server for recording and "
+"playback of audio, and for playback from DSSI synth plugins. These features "
+"will only be available if the JACK server is running.</"
+"li><br><br><li>Rosegarden has comprehensive documentation: see the Help menu "
+"for the handbook, tutorials, and other information!</li></ul><p>Rosegarden "
+"was brought to you by a team of volunteers across the world. To learn more, "
+"go to <a href=\"http://www.rosegardenmusic.com/\">http://www.rosegardenmusic."
+"com/</a>.</p>"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIView.cpp:257
+msgid "No non-audio segments in composition"
+msgstr "Ez dago ez-audio segmenturik konposizioan"
+
+#: ../src/gui/application/RosegardenGUIView.cpp:333
+msgid "Selection must contain only audio or non-audio segments"
+msgstr "Hautatutakoak bakarrik audio edo ez-audio segmentuak eduki ditzake"
+
+#: ../src/gui/application/RosegardenGUIView.cpp:431
+#: ../src/gui/application/RosegardenGUIView.cpp:576
+#: ../src/gui/application/RosegardenGUIView.cpp:612
+#: ../src/gui/application/RosegardenGUIView.cpp:776
+msgid "No non-audio segments selected"
+msgstr "Ez dago ez-audio segmenturik hautatuta"
+
+#: ../src/gui/application/RosegardenGUIView.cpp:851
+#, fuzzy
+msgid ""
+"You've not yet defined an audio editor for Rosegarden to use.\n"
+"See Settings -> Configure Rosegarden -> Audio."
+msgstr ""
+"Oraindik ez duzu definitu audio editore bat Rosegardenekin erabiltzeko.\n"
+"Ikusi Hobespenak-> Rosegarden Konfiguratu -> Orokorra -> Kanpoko Editoreak."
+
+#: ../src/gui/application/RosegardenGUIView.cpp:1559
+#: ../src/gui/application/RosegardenGUIView.cpp:1564
+msgid "Can't add dropped file. "
+msgstr "Ezin da askatutako artxiboa gehitu. "
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1014
+#: ../src/gui/seqmanager/SequenceManager.cpp:1150
+msgid ""
+"The JACK Audio subsystem has failed or it has stopped Rosegarden from "
+"processing audio.\n"
+"Please restart Rosegarden to continue working with audio.\n"
+"Quitting other running applications may improve Rosegarden's performance."
+msgstr ""
+"JACK Audio azpisistemak huts egin du edo gelditu du Rosergardenen audioa "
+"prozesatzekogaitasuna.\n"
+"Mesedez, Rosegarden berrasi audioarekin lan egiteko.\n"
+"Beste programa batzuk ixteak hobetu dezake Rosegardenen errendimendua."
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1020
+#: ../src/gui/seqmanager/SequenceManager.cpp:1156
+msgid ""
+"The JACK Audio subsystem has stopped Rosegarden from processing audio, "
+"probably because of a processing overload.\n"
+"An attempt to restart the audio service has been made, but some problems may "
+"remain.\n"
+"Quitting other running applications may improve Rosegarden's performance."
+msgstr ""
+"JACK Audio azpisistemak utzi dio Rosegardenentzat audioa prozesatzeari, ziur "
+"aski prozesatzeko lan zama handia dagoelako.\n"
+"Audio zerbitzua berpizteko saio bat egin da, baina oraindik egon "
+"daitezkearazo batzuk.\n"
+"Beste programa batzuk ixteak hobetu dezake Rosegardenen errendimendua."
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1031
+msgid ""
+"Run out of processor power for real-time audio processing. Cannot continue."
+msgstr ""
+"Denbora errealeko audio prozesurako gaitasuna gainditu da. Ezin da jarraitu"
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1057
+msgid ""
+"A serious error has occurred in the ALSA MIDI subsystem. It may not be "
+"possible to continue sequencing. Please check console output for more "
+"information."
+msgstr ""
+"Errore larri bat izan da ALSA MIDI azpisisteman. Izan daiteke "
+"sekuentziazioarekin aurrera ezin jarraitzea. Mesedez, egiaztatu kontsolaren "
+"irteera informazio gehiagorako."
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1078
+msgid "JACK Audio subsystem is losing sample frames."
+msgstr "JACK Audio azpisistema laginak galtzen ari da."
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1096
+msgid ""
+"Failed to read audio data from disc in time to service the audio subsystem."
+msgstr ""
+"Ezin izan dira audio datuak diskotik irakurri audio azpisistema garaiz "
+"elikatzeko"
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1100
+msgid ""
+"Failed to write audio data to disc fast enough to service the audio "
+"subsystem."
+msgstr ""
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1104
+msgid "The audio mixing subsystem is failing to keep up."
+msgstr "Audio nahastailearen azpisitema huts egiten ari da."
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1108
+msgid "The audio subsystem is failing to keep up."
+msgstr "Audio azpisitema huts egiten ari da"
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1112
+msgid "Unknown sequencer failure mode!"
+msgstr "Sekuentziadorearen huts egite ezezaguna!"
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1170
+#, fuzzy
+msgid ""
+"<h3>System timer resolution is too low</h3><p>Rosegarden was unable to find "
+"a high-resolution timing source for MIDI performance.</p><p>This may mean "
+"you are using a Linux system with the kernel timer resolution set too low. "
+"Please contact your Linux distributor for more information.</p><p>Some Linux "
+"distributors already provide low latency kernels, see <a href=\"http://"
+"rosegarden.wiki.sourceforge.net/Low+latency+kernels\">http://rosegarden.wiki."
+"sourceforge.net/Low+latency+kernels</a> for instructions.</p>"
+msgstr ""
+"<h3>Sistemaren timerraren erresoluzioa baxuegia da</h3><p>Rosegarden ez da "
+"gai izan MIDI errendimendurako erresoluzio handiko timing iturri "
+"bataurkitzeko</p><p>Izan daiteke kernelaren timerraren erresoluzio baxuegiko "
+"Linux sistema bat erabiltzea. Mesedez, harremanetan jarri zure "
+"banatzailearekin informazio gehiagorako.</p>"
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1188
+#, fuzzy
+msgid ""
+"<h3>System timer resolution is too low</h3><p>Rosegarden was unable to find "
+"a high-resolution timing source for MIDI performance.</p><p>You may be able "
+"to solve this problem by loading the RTC timer kernel module. To do this, "
+"try running <b>sudo modprobe snd-rtctimer</b> in a terminal window and then "
+"restarting Rosegarden.</p><p>Alternatively, check whether your Linux "
+"distributor provides a multimedia-optimized kernel. See <a href=\"http://"
+"rosegarden.wiki.sourceforge.net/Low+latency+kernels\">http://rosegarden.wiki."
+"sourceforge.net/Low+latency+kernels</a> for notes about this.</p>"
+msgstr ""
+"<h3>Sistemaren timerraren erresoluzioa baxuegia da</h3><p>Rosegarden ez da "
+"gai izan MIDI errendimendurako erresoluzio handiko timing iturri "
+"bataurkitzeko</p><p>Izan daiteke kernelaren timerraren erresoluzio baxuegiko "
+"Linux sistema bat erabiltzea. Mesedez, harremanetan jarri zure "
+"banatzailearekin informazio gehiagorako.</p>"
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1312
+msgid ""
+"<p>Both MIDI and Audio subsystems have failed to initialize.</p><p>You may "
+"continue without the sequencer, but we suggest closing Rosegarden, running "
+"\"alsaconf\" as root, and starting Rosegarden again. If you wish to run "
+"with no sequencer by design, then use \"rosegarden --nosequencer\" to avoid "
+"seeing this error in the future.</p>"
+msgstr ""
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1314
+msgid ""
+"<p>The MIDI subsystem has failed to initialize.</p><p>You may continue "
+"without the sequencer, but we suggest closing Rosegarden, running \"modprobe "
+"snd-seq-midi\" as root, and starting Rosegarden again. If you wish to run "
+"with no sequencer by design, then use \"rosegarden --nosequencer\" to avoid "
+"seeing this error in the future.</p>"
+msgstr ""
+"<p>MIDI azpisistemak huts egin du hasieratzeko.</p><p>Jarraitu dezakezu "
+"sekuentziadorerik gabe, baina gomendatzen dugu Rosegarden ixtea, \"modprobe "
+"snd-seq-midi\" root bezala exekutatzea eta Rosegarden berriro hasieratzea. "
+"Ez baldin baduzu sekuentziadorerik erabili nahi, orduan erabilil "
+"\"rosegarden--nosequencer\" errore hau etorkizunean ez ikusteko.</p>"
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1316
+msgid ""
+"<p>The Rosegarden sequencer module version does not match the GUI module "
+"version.</p><p>You have probably mixed up files from two different versions "
+"of Rosegarden. Please check your installation.</p>"
+msgstr ""
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1322
+#, fuzzy, c-format
+msgid "<h3>Sequencer startup failed</h3>%1"
+msgstr "<h3>Sekuentziadorearen hasieratzeak huts egin du</h3> %1"
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1330
+msgid ""
+"<h3>Failed to connect to JACK audio server.</h3><p>Rosegarden could not "
+"connect to the JACK audio server. This probably means the JACK server is "
+"not running.</p><p>If you want to be able to play or record audio files or "
+"use plugins, you should exit Rosegarden and start the JACK server before "
+"running Rosegarden again.</p>"
+msgstr "Errorea"
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1331
+msgid "Failed to connect to JACK"
+msgstr "Ezin izan da JACKekin konektatu"
+
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:46
+msgid "Modify MIDI filters..."
+msgstr "MIDI iragazkiak aldatu..."
+
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:58
+msgid "THRU events to ignore"
+msgstr "Kontuan hartu behar ez diren THRU gertaerak"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:131
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:60
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:96
+msgid "Note"
+msgstr "Nota"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:132
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:61
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:97
+msgid "Program Change"
+msgstr "Programa Aldaketa"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:136
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:62
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:98
+msgid "Key Pressure"
+msgstr "Teklaren Presioa"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:137
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:63
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:99
+msgid "Channel Pressure"
+msgstr "Kanalaren Presioa"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:134
+#: ../src/gui/general/EditView.cpp:899
+#: ../src/gui/rulers/ControllerEventsRuler.cpp:198
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:64
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:100
+msgid "Pitch Bend"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:133
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:65
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:101
+msgid "Controller"
+msgstr "Kontroladorea"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:135
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:66
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:102
+msgid "System Exclusive"
+msgstr "Sistema Esklusiboa"
+
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:94
+msgid "RECORD events to ignore"
+msgstr "Kontuan hartu behar ez diren RECORD gertaerak"
+
+#: ../src/gui/widgets/TimeWidget.cpp:101
+msgid "Note:"
+msgstr "Nota:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:108 ../src/gui/widgets/TimeWidget.cpp:145
+msgid "<inexact>"
+msgstr "<ez zehatza>"
+
+#: ../src/gui/widgets/TimeWidget.cpp:151
+msgid "Units:"
+msgstr "Unitateak:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:173
+msgid "Time:"
+msgstr "Denbora:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:184
+msgid "units"
+msgstr "unitateak"
+
+#: ../src/gui/widgets/TimeWidget.cpp:193
+msgid "Measures:"
+msgstr "Konpasak:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:193
+msgid "Measure:"
+msgstr "Konpasa:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:212
+msgid "beats:"
+msgstr "pultsuak:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:212
+msgid "beat:"
+msgstr "pultsua:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:230
+msgid "%1:"
+msgstr "%1:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:254
+msgid "Seconds:"
+msgstr "Segundu:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:273
+msgid "msec:"
+msgstr "milisegundu:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:407 ../src/gui/widgets/TimeWidget.cpp:531
+msgid "(%1/%2 time)"
+msgstr "(%1/%2 erritmoa)"
+
+#: ../src/gui/widgets/TimeWidget.cpp:452
+msgid "(starting %1.%2 qpm, %2.%3 bpm)"
+msgstr "(hasten %1.%2 npm, %2.%3 ppm)"
+
+#: ../src/gui/widgets/TimeWidget.cpp:458
+msgid "(starting %1.%2 bpm)"
+msgstr "(hasten %1.%2 npm)"
+
+#: ../src/gui/widgets/TimeWidget.cpp:464
+msgid "(%1.%2 qpm, %2.%3 bpm)"
+msgstr "(%1.%2 npm, %2.%3 ppm)"
+
+#: ../src/gui/widgets/TimeWidget.cpp:470
+msgid "(%1.%2 bpm)"
+msgstr "(%1.%2 npm)"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:239
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:60
+msgid "C"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:241
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:61
+#, fuzzy
+msgid "D"
+msgstr "ID"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:243
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:62
+msgid "E"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:244
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:63
+msgid "F"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:246
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:64
+msgid "G"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:248
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:65
+#, fuzzy
+msgid "A"
+msgstr "A4"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:250
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:66
+msgid "B"
+msgstr ""
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:70
+msgid "-2"
+msgstr ""
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:71
+msgid "-1"
+msgstr ""
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:72
+msgid "0"
+msgstr "0"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:73
+#, fuzzy
+msgid "1"
+msgstr "%1"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:74
+msgid "2"
+msgstr ""
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:75
+msgid "3"
+msgstr ""
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:76
+#, fuzzy
+msgid "4"
+msgstr "A4"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:77
+msgid "5"
+msgstr ""
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:78
+msgid "6"
+msgstr ""
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:79
+msgid "7"
+msgstr ""
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:83
+#, fuzzy
+msgid "double flat"
+msgstr "Bemol bikoitza"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:84
+#, fuzzy
+msgid "flat"
+msgstr "Bemola"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:85
+#, fuzzy
+msgid "natural"
+msgstr "Bekoadroa"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:86
+#, fuzzy
+msgid "sharp"
+msgstr "Diesea"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:87
+#, fuzzy
+msgid "double sharp"
+msgstr "Diese bikoitza"
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:234
+#, c-format
+msgid "In %1"
+msgstr "Sarrera %1"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:587
+#: ../src/gui/widgets/AudioRouteMenu.cpp:236
+#: ../src/gui/widgets/AudioRouteMenu.cpp:259
+msgid "Master"
+msgstr "Master"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:528
+#: ../src/gui/widgets/AudioRouteMenu.cpp:238
+#: ../src/gui/widgets/AudioRouteMenu.cpp:261
+#, c-format
+msgid "Sub %1"
+msgstr "Sub %1"
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:244
+msgid "In %1 R"
+msgstr "Sarrera %1 R"
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:245
+msgid "In %1 L"
+msgstr "Sarrera %1 L"
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:247
+msgid "Master R"
+msgstr "Master R"
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:248
+msgid "Master L"
+msgstr "Master L"
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:250
+msgid "Sub %1 R"
+msgstr "Sub %1 R"
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:251
+msgid "Sub %1 L"
+msgstr "Sub %1 L"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:391
+#: ../src/gui/studio/AudioMixerWindow.cpp:522
+#: ../src/gui/widgets/AudioFaderBox.cpp:82
+msgid "Audio plugin button"
+msgstr "Audio pluginaren botoia"
+
+#: ../src/gui/editors/parameters/AudioInstrumentParameterPanel.cpp:129
+#: ../src/gui/editors/parameters/AudioInstrumentParameterPanel.cpp:357
+#: ../src/gui/widgets/AudioFaderBox.cpp:91
+msgid "<no synth>"
+msgstr "<sinterik gabe>"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:93
+msgid "Synth plugin button"
+msgstr "Sintetizagailu pluginaren botoia"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:153
+msgid "Set the audio pan position in the stereo field"
+msgstr "Audio panoramaren posizioa esteremo eremuan kokatu"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:155
+msgid "Open synth plugin's native editor"
+msgstr "Sintetizagailu pluginaren jatorrizko editorea ireki"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:157
+msgid "Mono or Stereo Instrument"
+msgstr "Mono edo Estereo Instrumentua"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:159
+msgid "Record level"
+msgstr "Grabaketa maila"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:161
+msgid "Playback level"
+msgstr "Erreprodukzio maila"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:345
+#: ../src/gui/studio/AudioMixerWindow.cpp:347
+#: ../src/gui/studio/AudioMixerWindow.cpp:503
+#: ../src/gui/studio/AudioMixerWindow.cpp:505
+#: ../src/gui/widgets/AudioFaderBox.cpp:163
+msgid "Audio level"
+msgstr "Audioaren maila"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:170
+msgid "In:"
+msgstr "Sarrera:"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:173
+msgid "Out:"
+msgstr "Irteera:"
+
+#: ../src/gui/widgets/ProgressDialog.cpp:48
+#: ../src/gui/widgets/ProgressDialog.cpp:53
+#: ../src/gui/widgets/ProgressDialog.cpp:76
+msgid "Processing..."
+msgstr "Prozesatzen..."
+
+#: ../src/gui/configuration/ColourConfigurationPage.h:60
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:130
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:346
+#: ../src/gui/widgets/ColourTable.cpp:52
+msgid "Color"
+msgstr "Kolorea"
+
+#: ../src/gui/widgets/ColourTable.cpp:68
+msgid "Modify Color Name"
+msgstr "Kolorearen Izena Aldatu"
+
+#: ../src/gui/configuration/ColourConfigurationPage.cpp:129
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:983
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:882
+#: ../src/gui/widgets/ColourTable.cpp:68
+msgid "Enter new name"
+msgstr "Izen berria sartu"
+
+#: ../src/gui/widgets/ColourTable.cpp:107
+msgid "Default Color"
+msgstr "Kolore Lehenetsia"
+
+#: ../src/gui/widgets/Rotary.cpp:108
+msgid ""
+"Click and drag up and down or left and right to modify.\n"
+"Double click to edit value directly."
+msgstr ""
+"Klik egin eta errestatu gora eta behera edo ezkerrera etaeskuinera "
+"aldatzeko.\n"
+"Klik bikoitza balorea zuzenean editatzeko."
+
+#: ../src/gui/widgets/Rotary.cpp:433
+msgid "Select a new value"
+msgstr "Balore berri bat hautatu"
+
+#: ../src/gui/widgets/Rotary.cpp:434
+msgid "Enter a new value"
+msgstr "Balore berri bat sartu"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:80
+msgid "Quantizer"
+msgstr "Kuantifikatzailea"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:86
+msgid "Quantizer type:"
+msgstr "Kuantifikatzaile mota:"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:88
+msgid "Grid quantizer"
+msgstr "Sareta kuantifikatzailea"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:89
+msgid "Legato quantizer"
+msgstr "Ligatura kuantifikatzailea"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:90
+msgid "Heuristic notation quantizer"
+msgstr "Partituraren kuantifikatzailea heuristikoa"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:94
+msgid "Quantize for notation only (leave performance unchanged)"
+msgstr "Kuantifikatu partiturarako bakarrik (utzi interpretazioa aldatu gabe)"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:104
+msgid "Notation parameters"
+msgstr "Partituraren ediziorako parametroak"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:109
+#: ../src/gui/widgets/QuantizeParameters.cpp:150
+msgid "Base grid unit:"
+msgstr "Saretaren oinarrizko unitatea:"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:114
+msgid "Complexity:"
+msgstr "Konplexutasuna:"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:118
+msgid "Very high"
+msgstr "Oso altua"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:119
+msgid "High"
+msgstr "Altua"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:224
+#: ../src/gui/widgets/QuantizeParameters.cpp:120
+msgid "Normal"
+msgstr "Normala"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:121
+msgid "Low"
+msgstr "Baxua"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:122
+msgid "Very low"
+msgstr "Oso baxua"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:125
+msgid "Tuplet level:"
+msgstr "Multzo ezregularraren maila:"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:129
+msgid "2-in-the-time-of-3"
+msgstr "2-3ren-denboran"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4241
+#: ../src/gui/widgets/QuantizeParameters.cpp:130
+msgid "Triplet"
+msgstr "Hirukotxoa"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:138
+msgid "Any"
+msgstr "Edozein"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:141
+msgid "Permit counterpoint"
+msgstr "Kontrapuntua onartu"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:145
+msgid "Grid parameters"
+msgstr "Saretaren parametroak"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:154
+msgid "Swing:"
+msgstr "Swing:"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:159
+msgid "Iterative amount:"
+msgstr "Iterazioaren neurria:"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:165
+msgid "Quantize durations as well as start times"
+msgstr "Kuantifikatu iraupenak eta hasiera denborak"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:169
+msgid "After quantization"
+msgstr "Kuantifikatu ondoren"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:183
+msgid "Show advanced options"
+msgstr "Opzio aurreratuak erakutsi"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:192
+msgid "Re-beam"
+msgstr "Plikak batu berriro"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:194
+msgid "Add articulations (staccato, tenuto, slurs)"
+msgstr "Artikulazioak gehitu(staccato, tenuto, ligaturas)"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:195
+msgid "Tie notes at barlines etc"
+msgstr "Konpasen barretan notak gehitu, etab."
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:196
+msgid "Split-and-tie overlapping chords"
+msgstr "Zatitu-eta-lotu gainjarrita dauden akordeak"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:307
+msgid "Full quantize"
+msgstr "Kuantifikatzaile osoa"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:450
+msgid "Show Advanced Options"
+msgstr "Opzio Aurreratuak Erakutsi"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:454
+msgid "Hide Advanced Options"
+msgstr "Opzio Aurreratuak Ezkutatu"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:257
+#: ../src/gui/configuration/MatrixConfigurationPage.h:56
+#: ../src/gui/configuration/MatrixConfigurationPage.h:57
+#: ../src/gui/editors/matrix/MatrixView.cpp:2709
+msgid "Matrix"
+msgstr "Matriza"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:64
+msgid "Printable headers"
+msgstr ""
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:92
+#, fuzzy
+msgid "Dedication"
+msgstr "Adierazpena"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:96
+#: ../src/gui/editors/segment/PlayListView.cpp:35
+msgid "Title"
+msgstr "Izenburua"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:100
+msgid "Subtitle"
+msgstr "Azpititulua"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:104
+#, fuzzy
+msgid "Subsubtitle"
+msgstr "Azpititulua"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:108
+#, fuzzy
+msgid "Poet"
+msgstr "Presto"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:116
+msgid "Composer"
+msgstr "Konposatzailea"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:120
+#, fuzzy
+msgid "Meter"
+msgstr "Master"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:124
+msgid "Arranger"
+msgstr "Arreglista"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:128
+#, fuzzy
+msgid "Piece"
+msgstr "Tonuak"
+
+#: ../data/fonts/mappings/fonts.cpp:26
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:132
+msgid "Opus"
+msgstr "Opus"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:136
+msgid "Copyright"
+msgstr "Copyright"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:140
+#, fuzzy
+msgid "Tagline"
+msgstr "Triangle"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:155
+#, fuzzy
+msgid "The composition comes here."
+msgstr "Konposizioaren Luzera Aldatu"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:172
+msgid "Non-printable headers"
+msgstr ""
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:213
+msgid "Add New Property"
+msgstr "Propietate Berria Gehitu"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:217
+msgid "Delete Property"
+msgstr "Propietatea Ezabatu"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:236
+msgid "{new property %1}"
+msgstr "{propietate berria %1}"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:236
+msgid "{new property}"
+msgstr "{propietate berria}"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:243
+msgid "{undefined}"
+msgstr "{definitu gabe}"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:87
+#, fuzzy
+msgid "Double-click opens segment in"
+msgstr "Editore Lehenetsia (segmentuan klik bikoitza egiten denean)"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:91
+#, fuzzy
+msgid "Notation editor"
+msgstr "Notazioaren iraupena:"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:92
+#, fuzzy
+msgid "Matrix editor"
+msgstr "Matri&z Editorean Ireki"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:93
+#, fuzzy
+msgid "Event List editor"
+msgstr "&Gertaeren Zerrenda Editorean Irekin"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:99
+msgid "Number of count-in measures when recording"
+msgstr "Grabaketa hasi aurretiko konpas-zenbakia"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:109
+#, fuzzy
+msgid "Auto-save interval"
+msgstr "Auto-gorderako denbora-tartea(segundutan)"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:112
+msgid "Every 30 seconds"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:113
+msgid "Every minute"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:114
+msgid "Every five minutes"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:115
+msgid "Every half an hour"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:116
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:277
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:157
+msgid "Never"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:140
+#, fuzzy
+msgid "Use JACK transport"
+msgstr "JACK transportea kontuan ez hartu"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:173
+msgid "Unknown"
+msgstr "Ezezaguna"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:179
+msgid "No MIDI, audio OK"
+msgstr "Ez dago MIDIrik, audioa OK"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:182
+msgid "MIDI OK, no audio"
+msgstr "MIDIa OK, ez dago audiorik"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:185
+msgid "MIDI OK, audio OK"
+msgstr "MIDI OK, audio OK"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:188
+msgid "No driver"
+msgstr "Ez dago driberrik"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:195
+#, fuzzy
+msgid "Details..."
+msgstr "Pistak Ezabatu..."
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:204
+msgid "Behavior"
+msgstr "Jokabidea "
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:219
+msgid "Side-bar parameter box layout"
+msgstr "Parametro kutxaren estiloa"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:223
+msgid "Vertically stacked"
+msgstr "Bertikalki pilatuta"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:225
+msgid "Tabbed"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:233
+msgid "Note name style"
+msgstr "Noten izenen estiloa"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:237
+msgid "Always use US names (e.g. quarter, 8th)"
+msgstr "Beti izen amerikarrak erabili (adib. quarter, 8th)"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:238
+msgid "Localized (where available)"
+msgstr "Itzulita (eskuragarri baldin badago) "
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:252
+#, fuzzy
+msgid "Show textured background on"
+msgstr "Testuradun hondoa erabili oihala dagoen guneetan"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:254
+msgid "Main window"
+msgstr "Leiho nagusia"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:275
+msgid "Use bundled Klearlook theme"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:278
+msgid "When not running under KDE"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:279
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:159
+#, fuzzy
+msgid "Always"
+msgstr "Aliasak"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:287
+msgid "Presentation"
+msgstr "Aurkezpena"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:423
+msgid ""
+"Changes to the textured background in the main window will not take effect "
+"until you restart Rosegarden."
+msgstr ""
+"Leiho nagusiko testuradun hondoari egindako aldaketek ez dute eraginik "
+"edukiko Rosegarden berrasi arte."
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:168
+#: ../src/gui/configuration/GeneralConfigurationPage.h:78
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:207
+#: ../src/gui/configuration/MatrixConfigurationPage.cpp:59
+msgid "General"
+msgstr "Orokorra"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.h:79
+msgid "General Configuration"
+msgstr "Konfigurazio Orokorra"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:92
+msgid "Base octave number for MIDI pitch display"
+msgstr "MIDI nota erakusteko oinarrizko oktaba zenbakia"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:107
+msgid "Always use default studio when loading files"
+msgstr "Beti erabili estudio lehenetsia artxiboak kargatzen direnean"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:119
+#, fuzzy
+msgid "Send all MIDI Controllers at start of each playback"
+msgstr ""
+"MIDI Kontroladore guztiak erreprodukzioaren hasierara bidali\n"
+" (atzerapen nabari bat sortuko du)"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:121
+msgid ""
+"Rosegarden can send all MIDI Controllers (Pan, Reverb etc) to all MIDI "
+"devices every\n"
+"time you hit play if you so wish. Please note that this option will usually "
+"incur a\n"
+"delay at the start of playback due to the amount of data being transmitted."
+msgstr ""
+"Rosegardenek MIDI kontroladore guztiak(Pan, Reverb,etab) MIDI dispositibo "
+"guztietara bidali ditzake\n"
+"play jotzen duzun bakoitzean, nahi baduzu. Mesedez, kontuan hartu opzio "
+"honek atzerapen bat \n"
+"sortuko duela erreprodukzioaren hasieran, igortzen den datuen kopurua dela "
+"eta"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:138
+#, fuzzy
+msgid "Sequencer timing source"
+msgstr "Sekuentziadorearen timerra"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:163
+msgid "Load SoundFont to SoundBlaster card at startup"
+msgstr "Soundfonta SoundBlaster txartelera kargatu hasieratzean"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:164
+msgid ""
+"Check this box to enable soundfont loading on EMU10K-based cards when "
+"Rosegarden is launched"
+msgstr ""
+"Hautatu opzio hau EMU10K-n oinarritutako txarteletan soundfountak kargatzen "
+"ahalbidetzeko, Rosegarden exekutatzen denean"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:173
+msgid "Path to 'asfxload' or 'sfxload' command"
+msgstr "'asfxload' edo 'sfxload'-rako bidea"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:180
+msgid "SoundFont"
+msgstr "SoundFont"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:223
+msgid "MIDI Clock and System messages"
+msgstr "MIDI Erloju eta Sistema mezuak"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:229
+msgid "Send MIDI Clock, Start and Stop"
+msgstr "Start eta Stop mezuak bidali"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:230
+msgid "Accept Start, Stop and Continue"
+msgstr "Start, Stop eta Continue onartu "
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:241
+msgid "MIDI Machine Control mode"
+msgstr "MIDI Machine Control modua"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:248
+msgid "MMC Master"
+msgstr "MMC Master"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:249
+msgid "MMC Slave"
+msgstr "MMC Esklabu"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:260
+msgid "MIDI Time Code mode"
+msgstr "MIDI Time Code modua"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:267
+msgid "MTC Master"
+msgstr ""
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:268
+msgid "MTC Slave"
+msgstr "MTC Esklabu"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:281
+msgid "Automatically connect sync output to all devices in use"
+msgstr ""
+"Irteerako sinkronizazioa automatikoki konektatu erabiltzen direndispositibo "
+"guztiekin"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:292
+#, fuzzy
+msgid "MIDI Sync"
+msgstr "MIDI"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:308
+msgid "sfxload path"
+msgstr "sfxload-erako bidea"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:315
+msgid "Soundfont path"
+msgstr "SoundFont bidea"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:67
+msgid "%1 minutes %2.%3%4 seconds (%5 units, %6 measures)"
+msgstr "%1 minutu %2.%3%4 segundu (%5 unitate, %6 konpas)"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:133
+msgid "Filename:"
+msgstr "Artxiboaren izena:"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:136
+msgid "Formal duration (to end marker):"
+msgstr "Irapen formala(bukaerako markatzailera arte)"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:141
+msgid "Playing duration:"
+msgstr "Erreprodukzioaren iraupena:"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:146
+msgid "Tracks:"
+msgstr "Pistak:"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:147
+msgid "%1 used, %2 total"
+msgstr "%1 erabilia, %2 guztira"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:152
+msgid "Segments:"
+msgstr "Segmentuak:"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:153
+msgid "%1 MIDI, %2 audio, %3 total"
+msgstr "%1 MIDI, %2 audio, %3 guztira"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:161
+msgid "Statistics"
+msgstr "Estatistikak"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:170
+#: ../src/gui/editors/parameters/InstrumentParameterBox.cpp:155
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:92
+msgid "Track"
+msgstr "Pista"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:171
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:125
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:90
+msgid "Label"
+msgstr "Etiketa"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:172
+msgid "Time"
+msgstr "Denbora"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:174
+msgid "Events"
+msgstr "Gertaerak"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:175
+msgid "Polyphony"
+msgstr "Polifonia"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:176
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:126
+msgid "Repeat"
+msgstr "Errepikatu"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:178
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:128
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:305
+#: ../src/gui/general/EditView.cpp:1488
+msgid "Transpose"
+msgstr "Transposatu"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:179
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:129
+msgid "Delay"
+msgstr "Atzerapena"
+
+#: ../src/gui/configuration/AudioConfigurationPage.h:61
+#: ../src/gui/configuration/AudioPropertiesPage.h:58
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:204
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:523
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:524
+msgid "Audio"
+msgstr "Audioa "
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:204
+#: ../src/gui/configuration/MIDIConfigurationPage.h:62
+msgid "MIDI"
+msgstr "MIDI"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:317
+msgid "Segment Summary"
+msgstr "Segmentuaren Laburpena"
+
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:63
+msgid "Audio file path:"
+msgstr "Audio artxiboen bidea:"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:137
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:68
+msgid "Choose..."
+msgstr "Aukeratu... "
+
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:73
+msgid "Disk space remaining:"
+msgstr "Diskoan libre dagoen lekua:"
+
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:78
+msgid "Equivalent minutes of 16-bit stereo:"
+msgstr "16-bit estereo soinuaren baliokidea minututan:"
+
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:90
+msgid "Modify audio path"
+msgstr "Audio artxiboen bidea aldatu"
+
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:113
+msgid "%1 out of %2 (%3% used)"
+msgstr "%2 -tik %1 (%3% erabilia)"
+
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:144
+msgid "minutes at"
+msgstr "minutuak (non)"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.h:63
+#, fuzzy
+msgid "MIDI Settings"
+msgstr "Audioaren Ezarpenak"
+
+#: ../src/gui/configuration/AudioConfigurationPage.h:62
+#: ../src/gui/configuration/AudioPropertiesPage.h:59
+msgid "Audio Settings"
+msgstr "Audioaren Ezarpenak"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:87
+msgid "Default layout mode"
+msgstr "Formato lehenetsiaren modua"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:91
+msgid "Linear layout"
+msgstr "Formato Lineala"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:92
+msgid "Continuous page layout"
+msgstr "Orri jarraiaren banaketa"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:93
+msgid "Multiple page layout"
+msgstr "Orri anitzaren banaketa"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:101
+msgid "Default spacing"
+msgstr "Hutsuneen tartekatze Lehenetsia"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:125
+msgid "Default duration factor"
+msgstr "Iraupen faktore lehenetsia"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:141
+msgid "Full"
+msgstr "Beteta"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:152
+msgid "Show track headers (linear layout only)"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:158
+msgid "When needed"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:166
+msgid ""
+"\"Always\" and \"Never\" mean what they usually mean\n"
+"\"When needed\" means \"when staves are too many to all fit in the current "
+"window\""
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:178
+msgid "Show non-notation events as question marks"
+msgstr ""
+"Irudikatu ezin daitezkeen ez-notazio gertaerak galdera ikur bezala irudikatu"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:188
+msgid "Show notation-quantized notes in a different color"
+msgstr "Kuantifikatutako notak kolore ezberdin batean erakutsi"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:198
+msgid "Show \"invisible\" events in grey"
+msgstr "Gertaera \"ikustezinak\" grisez erakutsi"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:208
+msgid "Show notes outside suggested playable range in red"
+msgstr "Erreproduzitu daitekeen tartetik kanpo dauden notak gorriz erakutsi"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:218
+msgid "Highlight superimposed notes with a halo effect"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:231
+msgid "When recording MIDI, split-and-tie long notes at barlines"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:242
+msgid "Layout"
+msgstr "Formatoa"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:255
+msgid "Default note style for new notes"
+msgstr "Nota berrietarako nota estilo lehenetsia"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:287
+msgid "When inserting notes..."
+msgstr "Notak txertatzerakoan..."
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:294
+msgid "Split notes into ties to make durations match"
+msgstr "Zatitu notak ligutaretan iraupenak bat etorri daitezen"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:295
+msgid "Ignore existing durations"
+msgstr "Aurretik dauden iraupenak kontuan ez hartu"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:305
+msgid "Auto-beam on insert when appropriate"
+msgstr "Txertatzean, plikak automatikoki zatitu egokia denean"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:317
+#: ../src/gui/editors/notation/NotationEraser.cpp:54
+msgid "Collapse rests after erase"
+msgstr "Ezabatu ondoren, isiluneak batu"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:328
+msgid "Default paste type"
+msgstr "Itsasteko mota lehenetsia"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:350
+msgid "Editing"
+msgstr "Edizioa"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:362
+msgid "Accidentals in one octave..."
+msgstr "Oktaba baten alterazioak..."
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:364
+msgid "Affect only that octave"
+msgstr "Eragin bakarri oktaba horri"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:365
+msgid "Require cautionaries in other octaves"
+msgstr "Zuhurtziazkoak eskatu beste oktabetan"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:366
+msgid "Affect all subsequent octaves"
+msgstr "Datozen oktaba guztiei eragin"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:374
+msgid "Accidentals in one bar..."
+msgstr "Konpas baten alterazioak..."
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:376
+msgid "Affect only that bar"
+msgstr "Eragin bakarrik konpas horri"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:377
+msgid "Require cautionary resets in following bar"
+msgstr "Zuhurtziazko ezeztapenak eskatu hurrengo konpasean"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:378
+msgid "Require explicit resets in following bar"
+msgstr "Ezeztapen esplizituak eskatu hurrengo konpasean"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:386
+#, fuzzy
+msgid "Key signature cancellation style"
+msgstr "Armaduraren eta ezeztapenaren estiloa:"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:388
+msgid "Cancel only when entering C major or A minor"
+msgstr "Ezeztatu bakarrik Do Maior edo La Menor sartzerakoan"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:389
+msgid "Cancel whenever removing sharps or flats"
+msgstr "Dieseak edo bemolak ezabatzean ezeztatu"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:390
+msgid "Cancel always"
+msgstr "Ezeztatu beti"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:400
+msgid "Accidentals"
+msgstr "Alterazioak"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:441
+msgid "Notation font"
+msgstr "Partituraren tipografia"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:467
+msgid "Origin:"
+msgstr "Jatorria: "
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:471
+msgid "Copyright:"
+msgstr "Copyright: "
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:475
+msgid "Mapped by:"
+msgstr "Mapeatu duena:"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:479
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:81
+msgid "Type:"
+msgstr "Mota: "
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:508
+msgid "Font size for single-staff views"
+msgstr "Tipografiaren tamaina pentagrama bakar batentzat"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:516
+msgid "Font size for multi-staff views"
+msgstr "Tipografiaren tamaina pentagrama asko ikusteko"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:524
+msgid "Font size for printing (pt)"
+msgstr "Tipografiaren tamaina inprimatzeko(pt)"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:541
+msgid "Text font"
+msgstr "Testuaren tipografia"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:549
+msgid "Sans-serif font"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:664
+msgid "%1 (smooth)"
+msgstr "%1 (leuna)"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:667
+msgid "%1 (jaggy)"
+msgstr "%1 (hortz modukoa)"
+
+#: ../src/gui/configuration/LatencyConfigurationPage.cpp:58
+msgid "JACK latency"
+msgstr "JACK-aren latentzia"
+
+#: ../src/gui/configuration/LatencyConfigurationPage.cpp:61
+msgid ""
+"Use the \"Fetch JACK latencies\" button to discover the latency values set "
+"at\n"
+"the sequencer. It's recommended that you use the returned values but it's "
+"also\n"
+"possible to override them manually using the sliders. Note that if you "
+"change\n"
+"your JACK server parameters you should always fetch the latency values "
+"again.\n"
+"The latency values will be stored by Rosegarden for use next time."
+msgstr ""
+"Erabili \"JACK latentziak lortu\" botoia sekuentziadorean ezarritako "
+"baloreakikusi ahal izateko\n"
+"Gomendatzen da ikusten diren baloreak erabiltzea, baina izan daiteke "
+"bestebatzuk\n"
+"jartzea kontroleak erabiliz. Kontuan izan JACK zerbitzariaren "
+"parametroakaldatuz gero\n"
+"latentzia baloreak beti berreskuratu beharko zenukeelaberriro\n"
+"Latentzia baloreak Rosegardenen gordeko dira etorkizunean erabiltzeko"
+
+#: ../src/gui/configuration/LatencyConfigurationPage.cpp:65
+msgid "JACK playback latency (in ms)"
+msgstr "JACK-en erreprodukzio latentzia (ms-tan)"
+
+#: ../src/gui/configuration/LatencyConfigurationPage.cpp:66
+msgid "JACK record latency (in ms)"
+msgstr "JACK-en grabaketa latentzia (ms-tan)"
+
+#: ../src/gui/configuration/LatencyConfigurationPage.cpp:68
+msgid "Fetch JACK latencies"
+msgstr "JACK-en latentziak lortu"
+
+#: ../src/gui/configuration/LatencyConfigurationPage.cpp:121
+msgid "JACK Latency"
+msgstr "JACK-en Latentzia"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:92
+msgid "Audio preview scale"
+msgstr "Audio aurrebistaren eskala"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:96
+msgid "Linear - easier to see loud peaks"
+msgstr "Linearra - tontor ozenak errazago ikusten dira"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:97
+msgid "Meter scaling - easier to see quiet activity"
+msgstr "Neurgailuaren arabera eskalatu - errazago ikusten da aktibitate lasaia"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:105
+#, fuzzy
+msgid "Record audio files as"
+msgstr "Audio artxiboak honela gorde "
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:107
+msgid "16-bit PCM WAV format (smaller files)"
+msgstr "16-bit PCM WAV formatoa (artxibo txikiagoak)"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:108
+msgid "32-bit float WAV format (higher quality)"
+msgstr "32-bit float WAV artxiboak (kalitate hobea)"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:117
+msgid "External audio editor"
+msgstr "Kanpoko Audio Editorea"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:145
+msgid "Create JACK outputs"
+msgstr ""
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:150
+#, fuzzy
+msgid "for individual audio instruments"
+msgstr "audio instrumentu bakoitzeko"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:157
+#, fuzzy
+msgid "for submasters"
+msgstr "Submasterrik gabe"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:184
+#, fuzzy
+msgid ""
+"Rosegarden can start the JACK audio daemon (jackd) for you automatically if "
+"it isn't already running when Rosegarden starts.\n"
+"\n"
+"This is recommended for beginners and those who use Rosegarden as their main "
+"audio application, but it might not be to the liking of advanced users.\n"
+"\n"
+"If you want to start JACK automatically, make sure the command includes a "
+"full path where necessary as well as any command-line arguments you want to "
+"use.\n"
+"\n"
+"For example: /usr/local/bin/jackd -d alsa -d hw -r44100 -p 2048 -n 2\n"
+"\n"
+msgstr ""
+"Rosegardenek JACK Audio daemon-a (jackd) hasieratu dezake automatikoki\n"
+"ez baldin badago martxan Rosegarden exekutatu orduko\n"
+"\n"
+"Hau gomendagarria da Rosegarden Audio aplikazio nagusi bezala erabiltzen "
+"duten\n"
+"erabiltzaile berrientzat, baina agian ez zaie gustatuko erabiltzaile\n"
+"aurreratuei\n"
+"JACK automatikoki hasi nahi baduzu, ziurtatu zaitez komandoak bidearen "
+"izenosoa\n"
+"eta erabili nahi dituzun argumento guztiak dauzkala beharrezkoa "
+"deneanAdibidez:\n"
+"/usr/local/bin/jackd -d alsa -d hw -r 44100 -p 2048 -n 2\n"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:196
+msgid "Start JACK when Rosegarden starts"
+msgstr "JACK exekutatu Rosegarden hasieratzen denean"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:201
+msgid "JACK command"
+msgstr ""
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:214
+#, fuzzy
+msgid "JACK Startup"
+msgstr "Hasiera"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:224
+msgid "External audio editor path"
+msgstr "Kanpoko audio editorearen bidea"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:262
+msgid "External audio editor \"%1\" not found or not executable"
+msgstr ""
+
+#: ../src/gui/configuration/ColourConfigurationPage.cpp:70
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:448
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:863
+msgid "Add New Color"
+msgstr "Kolore Berria Gehitu"
+
+#: ../src/gui/configuration/ColourConfigurationPage.cpp:74
+msgid "Delete Color"
+msgstr "Kolorea Ezabatu"
+
+#: ../src/gui/configuration/ColourConfigurationPage.cpp:93
+msgid "Color Map"
+msgstr "Kolorearen Mapa"
+
+#: ../src/gui/configuration/ColourConfigurationPage.cpp:128
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:983
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:882
+msgid "New Color Name"
+msgstr "Kolore Berriaren Izena"
+
+#: ../src/gui/configuration/ColourConfigurationPage.cpp:130
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:59
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:984
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:883
+#: ../src/gui/studio/DeviceManagerDialog.cpp:115
+#: ../src/gui/studio/DeviceManagerDialog.cpp:174
+msgid "New"
+msgstr "Berria"
+
+#: ../src/gui/configuration/LatencyConfigurationPage.h:62
+msgid "Latency"
+msgstr "Latentzia "
+
+#: ../src/gui/configuration/LatencyConfigurationPage.h:63
+msgid "Sequencer Latency"
+msgstr "Sekuentziadorearen Latentzia"
+
+#: ../src/gui/configuration/ColourConfigurationPage.h:61
+msgid "Color Settings"
+msgstr "Kolorearen Opzioak"
+
+#: ../src/gui/studio/MidiDeviceListViewItem.cpp:55
+#: ../src/gui/studio/MidiKeyMapListViewItem.cpp:44
+msgid "Key Mapping"
+msgstr "Teklatuaren Mapaketa"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:97
+msgid "Manage MIDI Banks and Programs"
+msgstr "MIDI Bankuak eta Programak kudeatu"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:128
+msgid "MIDI Device"
+msgstr "MIDI Dispositiboa"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:130
+#: ../src/gui/studio/BankEditorDialog.cpp:219
+msgid "MSB"
+msgstr "MSB"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:131
+#: ../src/gui/studio/BankEditorDialog.cpp:218
+msgid "LSB"
+msgstr "LSB"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:140
+msgid "Add Bank"
+msgstr "&Bankua Gehitu"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:141
+msgid "Add Key Mapping"
+msgstr "Teklatuaren Mapaketa Gehitu"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:153
+msgid "Add a Bank to the current device"
+msgstr "Banku bat Gehitu oraingo dispositiboari"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:157
+msgid "Add a Percussion Key Mapping to the current device"
+msgstr "Gehitu Perkusiorako Teklatuaren Mapaketa bat oraingo dispositiboari"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:161
+msgid "Delete the current Bank or Key Mapping"
+msgstr "Ezabatu oraingo Banku edo Teklatuaren Mapaketa"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:165
+msgid "Delete all Banks and Key Mappings from the current Device"
+msgstr "Ezabatu oraingo dispositiboaren Teklatu Mapa eta Banku guztiak"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:167
+#: ../src/gui/studio/DeviceManagerDialog.cpp:117
+msgid "Import..."
+msgstr "Inportatu..."
+
+#: ../src/gui/studio/BankEditorDialog.cpp:168
+#: ../src/gui/studio/DeviceManagerDialog.cpp:118
+msgid "Export..."
+msgstr "Esportatu..."
+
+#: ../src/gui/studio/BankEditorDialog.cpp:176
+msgid ""
+"Import Bank and Program data from a Rosegarden file to the current Device"
+msgstr ""
+"Inportatu Rosegarden artxibo batetik Banku eta Programaren datuak oraingo "
+"dispositibora "
+
+#: ../src/gui/studio/BankEditorDialog.cpp:179
+msgid ""
+"Export all Device and Bank information to a Rosegarden format interchange "
+"file"
+msgstr ""
+"Esportatu Dispositiboen eta Bankuen informazio guztia trukaketa "
+"formatoadaukan Rosegarden artxibo batera"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:190
+msgid "Copy all Program names from current Bank to clipboard"
+msgstr "Oraingo Bankuaren Programa izen guztiak arbelera kopiatu"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:194
+msgid "Paste Program names from clipboard to current Bank"
+msgstr "Itsatsi Programen izena arbeletik oraingo Bankura"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:216
+msgid "Show Variation list based on "
+msgstr "Aldaketa-zerrenda erakutsi oinarrituta ondokoan "
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1010
+msgid "<new bank>"
+msgstr "<banku berria>"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1046
+msgid "<new mapping>"
+msgstr "<mapa berria>"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1048
+msgid "<new mapping %1>"
+msgstr "<mapa berria %1>"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1089
+msgid "Really delete this bank?"
+msgstr "Benetan nahi duzu banku hau ezabatu?"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1137
+msgid "Really delete this key mapping?"
+msgstr "Benetan ezabatu nahi duzu teklatuaren mapaketa hau?"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1187
+msgid "Really delete all banks for "
+msgstr "Benetan ezabatu nahi duzu banku guztiak ondokoarentzat "
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1476
+msgid "Import Banks from Device in File"
+msgstr "Inportatu Dispositiboaren Bankuak Artxibora"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1623
+#: ../src/gui/studio/DeviceManagerDialog.cpp:770
+msgid "Export Device as..."
+msgstr "Honela Esportatu Dispositiboa..."
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1694
+msgid ""
+"There are unsaved changes.\n"
+"Do you want to apply the changes before exiting the Bank Editor or discard "
+"the changes ?"
+msgstr ""
+"Badaude gorde ez diren aldaketak.\n"
+"Aplikatu nahi dituzu aldaketak Bankuen Editoretik irten baino lehenago "
+"edobaztertu aldaketak?"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1697
+msgid "Unsaved Changes"
+msgstr "Gorde ez diren Aldaketak"
+
+#: ../src/gui/studio/NameSetEditor.cpp:68
+msgid "Librarian"
+msgstr "Liburuzaina"
+
+#: ../src/gui/studio/NameSetEditor.cpp:75
+msgid "Email"
+msgstr "Posta Elektronikoa"
+
+#: ../src/gui/studio/NameSetEditor.cpp:80
+msgid ""
+"The librarian maintains the Rosegarden device data for this device.\n"
+"If you've made modifications to suit your own device, it might be worth\n"
+"liaising with the librarian in order to publish your information for the "
+"benefit\n"
+"of others."
+msgstr ""
+"Liburuzainak dispositibo honetarako informazioa gordetzen du.\n"
+"Aldaketarik egin baduzu zure dispositiboarekin bat etorri dadin, "
+"probetxuzkoa\n"
+"izan daiteke liburuzainari esatea, zure informazioa argitara dadin besteen\n"
+"onerako."
+
+#: ../src/gui/studio/MidiBankListViewItem.cpp:51
+#: ../src/gui/studio/MidiDeviceListViewItem.cpp:48
+msgid "Percussion Bank"
+msgstr "Perkusio Bankua"
+
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:84
+#: ../src/gui/studio/MidiBankListViewItem.cpp:51
+#: ../src/gui/studio/MidiDeviceListViewItem.cpp:48
+msgid "Bank"
+msgstr "Bankua"
+
+#: ../src/gui/studio/ChangeRecordDeviceCommand.h:39
+msgid "Change Record Device"
+msgstr "Grabaketa Dispositiboa Aldatu"
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:61
+#: ../src/gui/studio/DeviceManagerDialog.cpp:96
+msgid "Manage MIDI Devices"
+msgstr "MIDI Dispositiboak Kudeatu"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:98
+msgid "Play devices"
+msgstr "Erreprodukziorako Dispositiboak"
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:76
+#: ../src/gui/studio/DeviceManagerDialog.cpp:106
+#: ../src/gui/studio/DeviceManagerDialog.cpp:165
+msgid "Connection"
+msgstr "Konexioa"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:119
+msgid "Banks..."
+msgstr "Bankuak..."
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:120
+msgid "Control Events..."
+msgstr "Kontroladorearen Gertaerak..."
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:126
+msgid "Create a new Play device"
+msgstr "Erreprodukziorako Dispositibo berri bat sortu"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:129
+#: ../src/gui/studio/DeviceManagerDialog.cpp:184
+msgid "Delete the selected device"
+msgstr "Hautatutako dispositiboa ezabatu"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:132
+msgid ""
+"Import Bank, Program and Controller data from a Rosegarden file to the "
+"selected device"
+msgstr ""
+"Banku, Programa eta Kontroladorearen datuak inportatu Rosegarden artxibo "
+"batetik hautatutako dispositibora"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:135
+msgid "Export Bank and Controller data to a Rosegarden interchange file"
+msgstr ""
+"Bankuen eta Kontroladoreen Datuak Esportatu Rosegarden trukaketa "
+"artxibobatera"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:138
+msgid "View and edit Banks and Programs for the selected device"
+msgstr "Bankuak eta Programak ikusi hautatutako dispositiborako"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:141
+msgid ""
+"View and edit Control Events for the selected device - these are special "
+"Event types that you can define against your device and control through "
+"Control Rulers or the Instrument Parameter Box "
+msgstr ""
+"Hautatutako dispositiborako Kontrol Ebentuak ikusi eta editatu - hauekzure "
+"dispositobarekiko definitu ditzakezun eta Kontrol Gurpilenbitartez edo "
+"Intrumentuaren Parametroen Kutxaren bitartez kontrolatu ditzakezun gertaera "
+"mota bereziak dira"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:156
+msgid "Record devices"
+msgstr "Grabaketa Dispositiboak"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:164
+msgid "Current"
+msgstr "Oraingoa"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:181
+msgid "Create a new Record device"
+msgstr "Grabaketa dispositibo berri bat sortu"
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:360
+#: ../src/gui/studio/DeviceEditorDialog.cpp:378
+#: ../src/gui/studio/DeviceManagerDialog.cpp:486
+#: ../src/gui/studio/DeviceManagerDialog.cpp:501
+msgid "New Device"
+msgstr "Dispositibo Berria"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:703
+msgid "Import from Device in File"
+msgstr "Dispositibo batetik Artxibora Inportatu"
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:55
+msgid "Remap Instrument assigments..."
+msgstr "Instrumentuen esleipenak birmapatu"
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:62
+msgid "Device or Instrument"
+msgstr "Dispositiboa edo Instrumentua"
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:65
+msgid "Remap Tracks by all Instruments on a Device or by single Instrument"
+msgstr ""
+"Birmapeatu Pistak Dispositibo baten Instrumentu guztien arabera edo "
+"Instrumentubakar baten arabera"
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:74
+msgid "Choose Source and Destination"
+msgstr "Jatorria eta Helmuga Aukeratu"
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:77
+msgid "From"
+msgstr "Nondik"
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:78
+msgid "To"
+msgstr "Norantz"
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:120
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:121
+msgid "<no devices>"
+msgstr "<dispositiborik gabe>"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:155
+msgid "Show Audio &Faders"
+msgstr "Audio &Faderrak Erakutsi"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:160
+msgid "Show Synth &Faders"
+msgstr "Sintetizagailu &Faderrak Erakutsi"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:165
+msgid "Show &Submasters"
+msgstr "&Submasterrak erakutsi"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:170
+msgid "Show &Plugin Buttons"
+msgstr "&Plugin Botoiak Erakutsi"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:175
+msgid "Show &Unassigned Faders"
+msgstr "&Esleitu ez diren Faderrak Erakutsi"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:184
+#, c-format
+msgid ""
+"_n: 1 Input\n"
+"%n Inputs"
+msgstr ""
+"_n: Sarrera bat\n"
+"%n Sarrera"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:194
+msgid "No Submasters"
+msgstr "Submasterrik gabe"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:203
+#, c-format
+msgid ""
+"_n: 1 Submaster\n"
+"%n Submasters"
+msgstr ""
+"_n: 1 Submaster\n"
+"%n Submaster"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:279
+msgid "Audio Mixer"
+msgstr "Audioaren Nahastailea"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:311
+msgid "Record input source"
+msgstr "Grabaketar sarreraren jatorria"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:322
+msgid "Output destination"
+msgstr "Irteeraren helmuga"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:336
+#: ../src/gui/studio/AudioMixerWindow.cpp:495
+msgid "Pan"
+msgstr "Panorama"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:355
+msgid "Mono or stereo"
+msgstr "Mono edo Estereo"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:364
+#: ../src/gui/studio/AudioMixerWindow.cpp:513
+msgid "Mute"
+msgstr "Mututu"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:373 rc.cpp:408
+#, no-c-format
+msgid "Solo"
+msgstr "Solo"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:382
+msgid "Arm recording"
+msgstr "Grabaketa armatu"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:400
+#, c-format
+msgid "Audio %1"
+msgstr "Audio %1"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:404
+#, c-format
+msgid "Synth %1"
+msgstr "Sint.%1"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:578
+#: ../src/gui/studio/AudioMixerWindow.cpp:580
+msgid "Audio master output level"
+msgstr "Audio irteeraren maila nagusia"
+
+#: ../src/gui/studio/SynthPluginManagerDialog.cpp:71
+msgid "Manage Synth Plugins"
+msgstr "Sintetizagailu Pluginak Kudeatu"
+
+#: ../src/gui/studio/SynthPluginManagerDialog.cpp:78
+msgid "Synth plugins"
+msgstr "Sintetizagailu pluginak"
+
+#: ../src/gui/studio/SynthPluginManagerDialog.cpp:145
+msgid "Controls"
+msgstr "Kontrolak"
+
+#: ../src/gui/studio/SynthPluginManagerDialog.cpp:152
+msgid "Editor >>"
+msgstr "Editorea >>"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:66
+#: ../src/gui/studio/MidiProgramsEditor.cpp:169
+msgid "Bank and Program details"
+msgstr "Bankuen eta Programen xehetasunak"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:67
+msgid "Programs"
+msgstr "Programak"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2711
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:88
+#: ../src/gui/studio/MidiProgramsEditor.cpp:93
+msgid "Percussion"
+msgstr "Perkusioa"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:99
+msgid "MSB Value"
+msgstr "MSB Balorea"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:107
+msgid ""
+"Selects a MSB controller Bank number (MSB/LSB pairs are always unique for "
+"any Device)"
+msgstr ""
+"MSB kontroladore Banku zenbaki bat hautatzen du (MSB/LSB bikoteak "
+"bakarrakdira edozein dispositibotarako)"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:111
+msgid ""
+"Selects a LSB controller Bank number (MSB/LSB pairs are always unique for "
+"any Device)"
+msgstr ""
+"LSB kontroladore Banku zenbaki bat hautatzen du (MSB/LSB bikoteak "
+"bakarrakdira edozein dispositibotarako)"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:116
+msgid "LSB Value"
+msgstr "LSB Balorea"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:254
+#: ../src/gui/studio/MidiProgramsEditor.cpp:541
+#, c-format
+msgid "Key Mapping: %1"
+msgstr "Teklatuaren Mapa: %1 "
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:476
+msgid "<no key mapping>"
+msgstr "<Teklatuaren maparik gabe>"
+
+#: ../src/gui/studio/MidiKeyMappingEditor.cpp:57
+#: ../src/gui/studio/MidiKeyMappingEditor.cpp:81
+msgid "Key Mapping details"
+msgstr "Teklatuaren mapari buruzko xehetasunak"
+
+#: ../src/gui/studio/MidiKeyMappingEditor.cpp:58
+msgid "Pitches"
+msgstr "Tonuak"
+
+#: ../src/gui/studio/MidiMixerWindow.cpp:152
+msgid "MIDI Mixer"
+msgstr "MIDI Nahastailea"
+
+#: ../src/gui/studio/MidiMixerWindow.cpp:199
+msgid "Volume"
+msgstr "Ozentasuna"
+
+#: ../src/gui/studio/AudioPluginOSCGUIManager.cpp:444
+msgid "Rosegarden Plugin"
+msgstr "Rosegardenen Plugina"
+
+#: ../src/gui/studio/AudioPluginOSCGUIManager.cpp:447
+#, c-format
+msgid "Rosegarden: %1"
+msgstr "Rosegarden: %1"
+
+#: ../src/gui/studio/AudioPluginOSCGUIManager.cpp:449
+msgid "Rosegarden: %1: %2"
+msgstr "Rosegarden: %1: %2"
+
+#: ../src/gui/studio/AudioPluginOSCGUIManager.cpp:450
+#, c-format
+msgid "Plugin slot %1"
+msgstr "Pluginaren zokaloa %1"
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:92
+msgid "Add Play Device"
+msgstr "Erreprodukziorako Dispositiboa Gehitu"
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:93
+msgid "Add Record Device"
+msgstr "Grabaketarako Dispositiboa Gehitu"
+
+#: ../src/commands/studio/CreateOrDeleteDeviceCommand.h:68
+#: ../src/gui/studio/DeviceEditorDialog.cpp:94
+msgid "Delete Device"
+msgstr "Dispositiboa Ezabatu"
+
+#: ../src/gui/editors/segment/PlayList.cpp:77
+#: ../src/gui/studio/DeviceEditorDialog.cpp:156
+#: ../src/gui/studio/DeviceEditorDialog.cpp:361
+msgid "Play"
+msgstr "Jo"
+
+#: ../src/commands/segment/SegmentRecordCommand.cpp:37
+#: ../src/gui/studio/DeviceEditorDialog.cpp:156
+#: ../src/gui/studio/DeviceEditorDialog.cpp:379 rc.cpp:394
+#, no-c-format
+msgid "Record"
+msgstr "Grabaketa"
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:256
+msgid "Apply pending changes?"
+msgstr "Aplikatu falta diren aldaketak?"
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:359
+#: ../src/gui/studio/DeviceEditorDialog.cpp:377
+msgid "<new device>"
+msgstr "<dispositibo berria>"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentEraser.cpp:82
+msgid "Click on a segment to delete it"
+msgstr "Klik egin segmentu batean ezabatzeko"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSplitter.cpp:166
+msgid ""
+"Click on a segment to split it in two; hold Shift to avoid snapping to beat "
+"grid"
+msgstr ""
+"Klik egin segmentu batean bitan zatitzeko; Shift sakatuta mantendu "
+"saretarekin doitzea ekiditzeko."
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSplitter.cpp:168
+msgid "Click on a segment to split it in two"
+msgstr "Klik egin segmentu batean bitan zatitzeko."
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:81
+msgid "Click and drag to select segments"
+msgstr "Klik egin eta arrastatu segmentuak hautatzeko"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentMover.cpp:154
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:238
+msgid "Move Segment"
+msgstr "Segmentua Mugitu"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentMover.cpp:154
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:239
+msgid "Move Segments"
+msgstr "Segmentuak Mugitu"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:217
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:169
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:141
+#: ../src/gui/editors/segment/segmentcanvas/SegmentMover.cpp:210
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:255
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:359
+msgid "Hold Shift to avoid snapping to beat grid"
+msgstr "Shift sakatuta mantendu pultsoaren saretarekin lotzea ekiditeko"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:485
+msgid ""
+"Click and drag to select segments; middle-click and drag to draw an empty "
+"segment"
+msgstr ""
+"Klik eta arrastatu segmentuak hautatzeko; erdiko klika eta arrasatatuhutsik "
+"dagoen segmentu bat marrazteko"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:384
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:502
+msgid ""
+"Click and drag to resize a segment; hold Ctrl as well to rescale its contents"
+msgstr ""
+"Klik egin eta arrastatu segmentu baten tamaina aldatzeko; Ctrl sakatuta "
+"mantendu bere edukiak birreskalatzeko"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:386
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:504
+msgid "Click and drag to rescale segment"
+msgstr "Klk eta arrastatu segmentua birreskalatzeko"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:509
+msgid "Click and drag to move segments; hold Ctrl as well to copy them"
+msgstr ""
+"Klik eta arrastatu segmentuak mugitzeko; Ctrl sakatuta mantendu kopiatzeko"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:511
+msgid "Click and drag to copy segments"
+msgstr "Klik eta arrastatu segmentuak kopiatzeko"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:515
+msgid ""
+"Click and drag to move segment; hold Ctrl as well to copy it; double-click "
+"to edit"
+msgstr ""
+"Klik eta arrastatu segmentuak mugitzeko; Ctrl sakatuta mantendu kopiatzeko;"
+"klik-bikoitza editatzeko"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:517
+msgid "Click and drag to copy segment"
+msgstr "Klik egin eta arrastatu segmentua kopiatzeko"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:157
+#, fuzzy
+msgid ""
+"The audio file path does not exist or is not writable.\n"
+"You must set the audio file path to a valid directory in Document Properties "
+"before rescaling an audio file.\n"
+"Would you like to set it now?"
+msgstr ""
+"Audio artxiboen direktorioa ez da existitzen edo ez da idazgarria.\n"
+"Mesedez, jarri audio artxiboen bide baliozko bat Dokumentuaren "
+"Propietateetanaudioa birreskalatu baino lehenago.\n"
+"Konfiguratu nahi duzu orain?"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:261
+msgid ""
+"Hold Shift to avoid snapping to beat grid; hold Ctrl as well to rescale "
+"contents"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentMover.cpp:325
+msgid "Click and drag to move a segment"
+msgstr "Klik egin eta arrastatu segmentu bat mugitzeko"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentPencil.cpp:225
+msgid "Hold Shift to avoid snapping to bar lines"
+msgstr "Shift sakatuta mantendu konpasaren marrekin doitzea ekiditzeko"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentPencil.cpp:283
+#, fuzzy
+msgid "Record or drop audio here"
+msgstr "Grabatu edo arrastatu audioa hona"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentPencil.cpp:289
+#, fuzzy
+msgid ""
+"Click and drag to draw an empty segment. Control+Alt click and drag to draw "
+"in overlap mode."
+msgstr ""
+"Klik eta arrastatu segmentuak hautatzeko; erdiko klika eta arrasatatuhutsik "
+"dagoen segmentu bat marrazteko"
+
+#: ../src/gui/editors/segment/TrackLabel.cpp:77
+msgid ""
+"Click and hold with left mouse button to assign this Track to an Instrument."
+msgstr ""
+"Sakatu eta mantendu ezkerreko botoia Pista hau Instrumentu bati esleitzeko"
+
+#: ../src/gui/editors/segment/TrackLabel.cpp:191
+msgid "Change track name"
+msgstr "Pistaren izena aldatu"
+
+#: ../src/gui/editors/segment/TrackLabel.cpp:192
+msgid "Enter new track name"
+msgstr "Pistaren izen berria sartu"
+
+#: ../src/gui/editors/segment/TrackEditor.cpp:648
+msgid "Turn Repeating Segment into Real Copies"
+msgstr "Segmentuaren Errepikaneak Benetako Kopiak Bihurtu"
+
+#: ../src/gui/editors/segment/TrackEditor.cpp:650
+msgid "Turn Repeating Segments into Real Copies"
+msgstr "Segmentuen Errepikapenak Benetako Kopiak Bihurtu"
+
+#: ../src/gui/editors/segment/TrackEditor.cpp:814
+msgid ""
+"You can't drop files into Rosegarden from this client. Try using Konqueror "
+"instead."
+msgstr ""
+"Ezin dira Rosegardenen artxiboak askatu bezero honetatik. Saiatu Konqueror "
+"erabiltzen."
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:85
+msgid "Manage Triggered Segments"
+msgstr "Aktibatutako Segmentuak Kudeatu"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:89
+msgid "ID"
+msgstr "ID"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:735
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:93
+msgid "Base velocity"
+msgstr "Oinarrizko abiadura"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:94
+msgid "Triggers"
+msgstr "Aktibatzaileak"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:115
+msgid "Add a Triggered Segment"
+msgstr "Segmentu Aktibatu bat Gehitu"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:119
+msgid "Delete a Triggered Segment"
+msgstr "Segmentu Aktibatu bat Ezabatu"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:123
+msgid "Delete All Triggered Segments"
+msgstr "Segmentu Aktibatu Guztiak Ezabatu"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:127
+msgid "Close the Triggered Segment Manager"
+msgstr "Segmentu Aktibatuen Kudeatzailea Itxi"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:169
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:245
+msgid "<no label>"
+msgstr "<etiketarik gabe>"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:248
+msgid ""
+"_n: %1 on 1 track\n"
+"%1 on %n tracks"
+msgstr ""
+"_n: %1 pista batean\n"
+"%1 %n pista -tan"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:284
+msgid ""
+"This will remove all triggered segments from the whole composition. Are you "
+"sure?"
+msgstr ""
+"Honek konposizio osoko segmentu aktibatu guztiak ezabatuko ditu. Ziurzaude?"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:288
+msgid "Remove all triggered segments"
+msgstr "Segmentu aktibatu guztiak ezabatu"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:313
+msgid "Trigger Segment Duration"
+msgstr "Segmentu Aktibatuaren Iraupena"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:336
+#, c-format
+msgid ""
+"_n: This triggered segment is used 1 time in the current composition. Are "
+"you sure you want to remove it?\n"
+"This triggered segment is used %n times in the current composition. Are you "
+"sure you want to remove it?"
+msgstr ""
+"_n: Segmentu aktibatu hau behin erabiltzen da oraingo konposizioan. Ziur "
+"zaude ezabatu nahi izateaz?\n"
+"Segmentu aktibatu hau %n aldiz erabiltzen da oraingo konposizioan. Ziur "
+"zaude ezabatu nahi izateaz?"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:400
+msgid "Pa&ste as New Triggered Segment"
+msgstr "&Segmentu Aktibatu Berri gisa Itsatsi"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1169
+#: ../src/gui/editors/segment/MarkerEditor.cpp:399
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:412
+#: ../src/gui/editors/tempo/TempoView.cpp:622
+msgid "&Musical Times"
+msgstr "&Musika Denborak"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1179
+#: ../src/gui/editors/segment/MarkerEditor.cpp:409
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:422
+#: ../src/gui/editors/tempo/TempoView.cpp:632
+msgid "&Real Times"
+msgstr "Denbora E&rrealak"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1189
+#: ../src/gui/editors/segment/MarkerEditor.cpp:419
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:432
+#: ../src/gui/editors/tempo/TempoView.cpp:642
+msgid "Ra&w Times"
+msgstr "Denbora &Gordinak"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:83
+msgid "Manage Markers"
+msgstr "Markatzaileak Kudeatu"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:86
+msgid "Marker time "
+msgstr "Markatzailearen denbora "
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:87
+#, fuzzy
+msgid "Marker text "
+msgstr "Markatzailearen denbora "
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:88
+msgid "Marker description "
+msgstr "Markadoraren deskribapena "
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:95
+msgid "Pointer position"
+msgstr "Punteroaren posizioa"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:100
+msgid "Real time:"
+msgstr "Denbora erreala:"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:103
+msgid "In measure:"
+msgstr "(Ondoko) konpasean:"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:121
+msgid "Add a Marker"
+msgstr "Markadore bat Gehitu"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:125
+msgid "Delete a Marker"
+msgstr "Markadore bat Ezabatu"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:129
+msgid "Delete All Markers"
+msgstr "Markadore Guztiak Ezabatu"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:133
+msgid "Close the Marker Editor"
+msgstr "Markatzaileen Editorea Itxi"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:296
+msgid "Remove all markers"
+msgstr "Markatzaile Guztiak Ezabatu"
+
+#: ../src/gui/editors/segment/PlayList.cpp:76
+msgid "Add..."
+msgstr "Gehitu..."
+
+#: ../src/gui/editors/segment/PlayList.cpp:78
+msgid "Move Up"
+msgstr "Mugitu Gorantz"
+
+#: ../src/gui/editors/segment/PlayList.cpp:79
+msgid "Move Down"
+msgstr "Mugitu Beherantz"
+
+#: ../src/gui/editors/segment/PlayList.cpp:124
+msgid "Select one or more Rosegarden files"
+msgstr "Rosegarden artxibo bat edo gehiago hautatu"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:73
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:55
+msgid "<not showing>"
+msgstr "<ez erakutsita>"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:89
+msgid "Manage Control Events"
+msgstr "Kontroladoreen Gertaerak Kudeatu"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:91
+msgid "<no device>"
+msgstr "<dispositiborik gabe>"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:99
+msgid " Control Events for %1 (device %2)"
+msgstr " %1 -erako Kontrol Gertaerak (%2 Dispositiboa)"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:104
+msgid "Control Event name "
+msgstr "Kontrol Gertaeraren izena "
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:105
+msgid "Control Event type "
+msgstr "Kontrol Gertaera mota "
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:106
+msgid "Control Event value "
+msgstr "Kontrol Gertaeraren balorea "
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:107
+msgid "Description "
+msgstr "Deskribapena "
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:108
+msgid "Min "
+msgstr "Min "
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:109
+msgid "Max "
+msgstr "Max "
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:110
+msgid "Default "
+msgstr "Lehenetsia "
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:111
+msgid "Color "
+msgstr "Kolorea "
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:112
+msgid "Position on instrument panel"
+msgstr "Instrumentu paneleko posizioa"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:136
+msgid "Add a Control Parameter to the Studio"
+msgstr "Estudioari Kontrol Parametro bat Gehitu"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:140
+msgid "Delete a Control Parameter from the Studio"
+msgstr "Estudiotik Kontrol Parametro bat Ezabatu"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:144
+msgid "Close the Control Parameter editor"
+msgstr "Kontrol Parametroen Editorea Itxi"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:221
+msgid "<default>"
+msgstr "<lehenetsia>"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:62
+msgid "Edit Control Parameter"
+msgstr "Kontrol Parametroak Editatu"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:71
+msgid "Control Event Properties"
+msgstr "Kontrol Gertaeraren Propietateak"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:77
+msgid "Name:"
+msgstr "Izena:"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:93
+msgid "Control Event value:"
+msgstr "Kontroladorearen Balorea:"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:97
+msgid "Minimum value:"
+msgstr "Gutxienezko balorea:"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:101
+msgid "Maximum value:"
+msgstr "Gehienezko balorea:"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:105
+msgid "Default value:"
+msgstr "Balore lehenetsia:"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:109
+msgid "Color:"
+msgstr "Kolorea:"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:113
+msgid "Instrument Parameter Box position:"
+msgstr "Instrumentuaren Parametro-Kutxaren kokapena"
+
+#: ../src/gui/editors/segment/TrackButtons.cpp:209
+#: ../src/gui/editors/segment/TrackButtons.cpp:585
+#: ../src/gui/editors/segment/TrackButtons.cpp:935
+#: ../src/gui/editors/segment/TrackButtons.cpp:1127
+msgid "<no instrument>"
+msgstr "<instrumenturik gabe>"
+
+#: ../src/gui/editors/segment/TrackButtons.cpp:352
+#: ../src/gui/editors/segment/TrackButtons.cpp:1094
+msgid "<untitled audio>"
+msgstr "<izenbururik gabeko audioa>"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:130
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:662
+#: ../src/gui/editors/segment/TrackButtons.cpp:354
+#: ../src/gui/editors/segment/TrackButtons.cpp:1096
+msgid "<untitled>"
+msgstr "<izenbururik gabe>"
+
+#: ../src/gui/editors/segment/TrackButtons.cpp:1058
+msgid "Mute track"
+msgstr "Pista Mututu"
+
+#: ../src/gui/editors/segment/TrackButtons.cpp:1063
+msgid "Record on this track"
+msgstr "Pista honetan grabatu"
+
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:88
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:1015
+msgid "Segment"
+msgstr "Segmentua"
+
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:89
+msgid "Segment Parameters"
+msgstr "Segmentuaren Parametroak"
+
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:366
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:697
+msgid "%1 ms"
+msgstr "%1 ms"
+
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:1031
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:910
+msgid "Highest playable note"
+msgstr "Jo daitekeen notarik altuena"
+
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:1051
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:930
+msgid "Lowest playable note"
+msgstr "Jo daitekeen notarik baxuena"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:93
+msgid "Track Parameters"
+msgstr "Pistaren Parametroak"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:137
+msgid "Playback parameters"
+msgstr "Erreprodukzioaren parametroak"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:172
+msgid "Recording filters"
+msgstr "Grabaketarako iragazkiak"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:191
+msgid "Channel"
+msgstr "Kanala"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:203
+#, fuzzy
+msgid "Staff export options"
+msgstr "Opzio aurreratuak erakutsi"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:220
+#, fuzzy
+msgid "Notation size:"
+msgstr "Notazioaren denbora:"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:225
+#, fuzzy
+msgid "Small"
+msgstr "Denak"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:226
+msgid "Tiny"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:233
+#, fuzzy
+msgid "Bracket type:"
+msgstr "Testu mota:"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:237
+msgid "-----"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:238
+msgid "[----"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:239
+msgid "----]"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:240
+msgid "[---]"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:241
+msgid "{----"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:242
+msgid "----}"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:243
+msgid "{[---"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:244
+msgid "---]}"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:253
+#, fuzzy
+msgid "Create segments with"
+msgstr "(Ondokoarekin) segmentuak sortu:"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:264
+msgid "Preset"
+msgstr "Preprograma"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:272
+msgid "Load"
+msgstr "Kargatu"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:282
+msgid "treble"
+msgstr "sol"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:283
+msgid "bass"
+msgstr "fa"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:284
+msgid "crotales"
+msgstr "sol +15"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:285
+msgid "xylophone"
+msgstr "sol +8"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:286
+msgid "guitar"
+msgstr "sol -15"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:287
+msgid "contrabass"
+msgstr "fa -8"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:288
+msgid "celesta"
+msgstr "fa +15"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:289
+msgid "old celesta"
+msgstr "fa +8"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:290
+msgid "french"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:291
+msgid "soprano"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:292
+#, fuzzy
+msgid "mezzosoprano"
+msgstr "Sopranoa"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:293
+msgid "alto"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:294
+msgid "tenor"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:295
+#, fuzzy
+msgid "baritone"
+msgstr "Aldaketa"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:296
+#, fuzzy
+msgid "varbaritone"
+msgstr "Aldaketa"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:297
+#, fuzzy
+msgid "subbass"
+msgstr "fa"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:327
+#, fuzzy
+msgid "Lowest"
+msgstr "Baxuena"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:329
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:336
+msgid "---"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:331
+msgid "Choose the lowest suggested playable note, using a staff"
+msgstr "Hautatu zure ustez jo daitekeen notarik baxuena, pentagrama erabiliz"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:334
+#, fuzzy
+msgid "Highest"
+msgstr "Altuena"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:338
+msgid "Choose the highest suggested playable note, using a staff"
+msgstr "Hautatu zure ustez jo daitekeen notarik altuena, pentagrama erabiliz"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:666
+#, fuzzy
+msgid "[ Track %1 - %2 ]"
+msgstr "[ Pista#%1 - %2 ]"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:985
+msgid "The instrument preset database is corrupt. Check your installation."
+msgstr ""
+"Instrumentuaren preset-en datubasea hondatuta dago Egiaztatu zure "
+"instalazioa."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:173
+#: ../src/gui/editors/parameters/InstrumentParameterBox.cpp:54
+msgid "Instrument Parameters"
+msgstr "Instrumentuaren Parametroak"
+
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:85
+msgid "Variation"
+msgstr "Aldaketa"
+
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:86
+msgid "Program"
+msgstr "Programa"
+
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:87
+msgid "Channel out"
+msgstr "Irteera Kanala"
+
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:215
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:221
+msgid "[ %1 ]"
+msgstr "[ %1 ]"
+
+#: ../src/gui/editors/matrix/MatrixEraser.cpp:58
+#: ../src/gui/editors/matrix/MatrixMover.cpp:71
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:67
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:77
+msgid "Switch to Draw Tool"
+msgstr "Marrazketa Lanabesera Aldatu"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:75
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:69
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:71
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:81
+#: ../src/gui/editors/notation/ClefInserter.cpp:57
+#: ../src/gui/editors/notation/GuitarChordInserter.cpp:63
+#: ../src/gui/editors/notation/NotationSelector.cpp:87
+#: ../src/gui/editors/notation/NoteInserter.cpp:113
+#: ../src/gui/editors/notation/RestInserter.cpp:72
+#: ../src/gui/editors/notation/TextInserter.cpp:61
+msgid "Switch to Erase Tool"
+msgstr "Ezabaketa Lanabesera Aldatu"
+
+#: ../src/gui/editors/matrix/MatrixEraser.cpp:62
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:73
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:75
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:85
+msgid "Switch to Move Tool"
+msgstr "Mugimendu Lanabesera Aldatu"
+
+#: ../src/gui/editors/matrix/MatrixEraser.cpp:68
+#: ../src/gui/editors/matrix/MatrixMover.cpp:81
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:79
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:93
+msgid "Switch to Resize Tool"
+msgstr "Tamaina Aldatzeko Lanabesera Aldatu"
+
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:446
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:579
+msgid "Click and drag to select; middle-click and drag to draw new note"
+msgstr ""
+"Klik egin eta arrastatu hautatzeko; erdiko-klika eta arrastatu nota berri "
+"bat marrazteko"
+
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:324
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:597
+msgid "Click and drag to resize selected notes"
+msgstr "Klik egin eta arrastatu hautatutako noten tamaina aldatzeko"
+
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:599
+msgid "Click and drag to resize note"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:471
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:604
+msgid "Click and drag to move selected notes; hold Ctrl as well to copy"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:473
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:606
+msgid "Click and drag to copy selected notes"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:610
+msgid "Click and drag to move note; hold Ctrl as well to copy"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:612
+msgid "Click and drag to copy note"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixEraser.cpp:54
+#: ../src/gui/editors/matrix/MatrixMover.cpp:67
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:65
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:63
+#: ../src/gui/editors/notation/ClefInserter.cpp:53
+#: ../src/gui/editors/notation/GuitarChordInserter.cpp:59
+#: ../src/gui/editors/notation/NotationEraser.cpp:67
+#: ../src/gui/editors/notation/NoteInserter.cpp:109
+#: ../src/gui/editors/notation/RestInserter.cpp:68
+#: ../src/gui/editors/notation/TextInserter.cpp:57
+msgid "Switch to Select Tool"
+msgstr "Hautatzeko Lanabesera Aldatu"
+
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:218
+msgid "Resize Event"
+msgstr "Gertaeraren Tamaina Aldatu"
+
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:221
+msgid "Resize Events"
+msgstr "Gertaeraren Tamaina Aldatu"
+
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:326
+msgid "Click and drag to resize a note"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:328
+#, fuzzy
+msgid "Copy and Move Event"
+msgstr "Gertaera Kopiatu eta Mugitu"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:330
+#, fuzzy
+msgid "Copy and Move Events"
+msgstr "Gertaerak Kopiatu eta Mugitu"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:334
+msgid "Move Event"
+msgstr "Gertaera Mugitu"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:336
+msgid "Move Events"
+msgstr "Gertaerak Mugitu"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:465
+msgid "Click and drag to move a note; hold Ctrl as well to copy it"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:467
+msgid "Click and drag to copy a note"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:361
+msgid "Click and drag to draw a note; Shift to avoid snapping to grid"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:363
+msgid "Click and drag to draw a note"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:437
+#: ../src/gui/editors/matrix/MatrixView.cpp:3053
+msgid "Couldn't apply piano roll layout"
+msgstr "Ezin izan da piano-roll formatoa aplikatu"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:663
+msgid "Resi&ze"
+msgstr "&Tamaina Aldatu"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:669
+#: ../src/gui/editors/notation/NotationView.cpp:1919
+msgid "C&hord Insert Mode"
+msgstr "&Akordeak Txertatzeko Modua"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:676
+#: ../src/gui/editors/notation/NotationView.cpp:1778
+msgid "Ste&p Recording"
+msgstr "&Pausuz pausuko Grabaketa"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:694
+msgid "&Legato"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:708
+#, fuzzy
+msgid "Set to Current Velocity"
+msgstr "Oinarrizko Abiadura Ezarri"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:712
+msgid "Set Event &Velocities..."
+msgstr "Gertaeren &Abiadurak Ezarri..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:716
+msgid "Trigger Se&gment..."
+msgstr "&Segmentua Aktibatu..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:720
+msgid "Remove Triggers..."
+msgstr "Aktibatzaileak Ezabatu..."
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1153
+#: ../src/gui/editors/matrix/MatrixView.cpp:724
+#: ../src/gui/editors/tempo/TempoView.cpp:606
+msgid "Select &All"
+msgstr "&Dena Hautatu"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:732
+#: ../src/gui/editors/notation/NotationView.cpp:2325
+msgid "Cursor &Back"
+msgstr "Kurtsorea &Atzera"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:736
+#: ../src/gui/editors/notation/NotationView.cpp:2329
+msgid "Cursor &Forward"
+msgstr "Kurtsorea A&urrera"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:740
+#: ../src/gui/editors/notation/NotationView.cpp:2333
+msgid "Cursor Ba&ck Bar"
+msgstr "Kurtsorea Au&rreko Konpasera"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:744
+#: ../src/gui/editors/notation/NotationView.cpp:2337
+msgid "Cursor For&ward Bar"
+msgstr "Kurtsorea &Hurrengo Konpasera"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:748
+#: ../src/gui/editors/notation/NotationView.cpp:2341
+msgid "Cursor Back and Se&lect"
+msgstr "Kurtsorea Atzera eta Hau&tatu"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:752
+#: ../src/gui/editors/notation/NotationView.cpp:2345
+msgid "Cursor Forward and &Select"
+msgstr "Kurtsorea Aurrera eta &Hautatu"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:756
+#: ../src/gui/editors/notation/NotationView.cpp:2349
+msgid "Cursor Back Bar and Select"
+msgstr "Kurtsorea Aurreko Konpasera eta Hautatu"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:760
+#: ../src/gui/editors/notation/NotationView.cpp:2353
+msgid "Cursor Forward Bar and Select"
+msgstr "Kurtsorea Hurrengo Konpasera eta Hautatu"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:764
+#: ../src/gui/editors/notation/NotationView.cpp:2363
+msgid "Cursor to St&art"
+msgstr "&Kurtsoera Hasierara"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:770
+#: ../src/gui/editors/notation/NotationView.cpp:2369
+msgid "Cursor to &End"
+msgstr "Kurtsorea &Bukaerara"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:776
+#: ../src/gui/editors/notation/NotationView.cpp:2391
+msgid "Cursor to &Playback Pointer"
+msgstr "Kurtsorea &Erreprodukzio Puntura"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:820
+#: ../src/gui/editors/notation/NotationView.cpp:2435
+msgid "Playback Pointer to &Cursor"
+msgstr "Erreprodukzio Puntua &Kurtsorera"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:826
+#: ../src/gui/editors/notation/NotationView.cpp:2441
+msgid "&Solo"
+msgstr "&Solo"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:841
+#: ../src/gui/editors/notation/NotationView.cpp:2456
+msgid "Set Loop to Selection"
+msgstr "Hautatutakoan Errepikapena Ezarri"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:845
+#: ../src/gui/editors/notation/NotationView.cpp:2460
+msgid "Clear L&oop"
+msgstr "Errepikapena &Kendu"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1157
+#: ../src/gui/editors/matrix/MatrixView.cpp:849
+#: ../src/gui/editors/notation/NotationView.cpp:2464
+#: ../src/gui/editors/tempo/TempoView.cpp:610
+msgid "Clear Selection"
+msgstr "Hautatutakoa Ezabatu"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1149
+#: ../src/gui/editors/matrix/MatrixView.cpp:854
+#: ../src/gui/editors/notation/NotationView.cpp:2471
+msgid "&Filter Selection"
+msgstr "Hautatutakoa &Iragazi"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:879
+msgid "&No Snap"
+msgstr "&Ez Doitu"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:884
+msgid "Snap to Bea&t"
+msgstr "&Pultsora Doitu"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:888
+msgid "Snap to &Bar"
+msgstr "&Konpasera Doitu"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:908
+#, fuzzy, c-format
+msgid "Snap to %1"
+msgstr "%1 era doitu"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:917
+msgid "Show Instrument Parameters"
+msgstr "Instrumentuaren Parametroak Erakutsi"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:922
+#: ../src/gui/editors/notation/NotationView.cpp:1850
+msgid "Show Ch&ord Name Ruler"
+msgstr "A&korde Izenen Erregela Erakutsi"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:926
+#: ../src/gui/editors/notation/NotationView.cpp:1858
+msgid "Show &Tempo Ruler"
+msgstr "&Tenpoaren Erregela Erakutsi"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1238
+#: ../src/gui/editors/notation/NotationView.cpp:3245
+#, c-format
+msgid ""
+"_n: 1 event selected \n"
+" %n events selected "
+msgstr ""
+"_n: gertaera 1 hautatua \n"
+" %n gertaera hautatua(k) "
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1241
+#: ../src/gui/editors/notation/NotationView.cpp:3247
+msgid " No selection "
+msgstr " Hautaketarik ez "
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1348
+#: ../src/gui/editors/matrix/MatrixView.cpp:1360
+#: ../src/gui/editors/matrix/MatrixView.cpp:2079
+#: ../src/gui/editors/notation/NotationView.cpp:5869
+msgid "Quantizing..."
+msgstr "Kuantifikatzen "
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1370
+#: ../src/gui/editors/notation/NotationView.cpp:5407
+msgid "Collapsing notes..."
+msgstr "Notak batzen..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1381
+msgid "Making legato..."
+msgstr "Legatoa egiten..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1476
+#, fuzzy
+msgid "Note: %1 (%2.%3s)"
+msgstr "Nota: %1 (%2.%3s)"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1531
+#: ../src/gui/editors/notation/NotationView.cpp:7206
+msgid "Time: %1 (%2.%3s)"
+msgstr "Denbora: %1 (%2.%3s)"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1604
+#: ../src/gui/editors/notation/NotationView.cpp:4744
+#: ../src/gui/editors/notation/NotationView.cpp:4773
+msgid "Cutting selection to clipboard..."
+msgstr "Hautatutakoa arbelera mozten..."
+
+#: ../src/gui/editors/eventlist/EventView.cpp:912
+#: ../src/gui/editors/matrix/MatrixView.cpp:1636
+#: ../src/gui/editors/notation/NotationSelectionPaster.cpp:82
+msgid "Couldn't paste at this point"
+msgstr "Ezin da itsatsi puntu honetan"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1647
+#: ../src/gui/editors/notation/NotationView.cpp:4754
+msgid "Deleting selection..."
+msgstr "Hautatutakoa ezabatzen..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1833
+#: ../src/gui/editors/notation/NotationView.cpp:5617
+#, c-format
+msgid "Unknown note insert action %1"
+msgstr "Nota ezezaguna txertatzeko eragiketa: %1"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1837
+#: ../src/gui/editors/matrix/MatrixView.cpp:2857
+#: ../src/gui/editors/notation/NotationView.cpp:5621
+msgid "Inserting note"
+msgstr "Nota txertatzen"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2091
+msgid "Unquantizing..."
+msgstr "Deskuantifikatzen..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2120
+msgid " Grid: "
+msgstr " Sareta: "
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2134
+msgid "Unit"
+msgstr "Unitatea"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2136
+msgid "Beat"
+msgstr "Pultsua"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2138
+msgid "Bar"
+msgstr "Konpasa"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2159
+#, fuzzy
+msgid " Velocity: "
+msgstr "Abiadura:"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2170
+msgid " Quantize: "
+msgstr " Kuantifikazioa: "
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2584
+msgid "Raising velocities..."
+msgstr "Abiadurak igotzen..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2596
+msgid "Lowering velocities..."
+msgstr "Abiadurak jaisten..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2611
+msgid "Set Event Velocities"
+msgstr "Gertaeren Abiadurak Ezarri"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2616
+msgid "Setting Velocities..."
+msgstr "Abiadurak Ezartzen..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2665
+msgid "Remove Triggers"
+msgstr "Aktibatzaileak Ezabatu"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2723
+msgid "%1 - Segment Track #%2 - %3"
+msgstr "%1 - Segmentu Pista #%2 - %3"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2730
+msgid "%1 - All Segments - %2"
+msgstr "%1 - Segmentu Guztiak - %2"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2737
+msgid ""
+"_n: %1 - 1 Segment - %2\n"
+"%1 - %n Segments - %2"
+msgstr ""
+"_n: %1 - 1 Segmentu - %2\n"
+"%1 - %n Segmentu - %2"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2885
+msgid "Can't insert note: No grid duration selected"
+msgstr "Ezin da nota txertatu: ez da hautatu saretaren iraupena"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2935
+#, fuzzy
+msgid " Chord "
+msgstr " Akordea"
+
+#: ../src/gui/editors/matrix/MatrixEraser.cpp:105
+msgid "Click on a note to delete it"
+msgstr ""
+
+#: ../src/gui/editors/tempo/TempoView.cpp:89
+msgid "Filter"
+msgstr "Iragazkia"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:245
+#: ../src/gui/editors/tempo/TempoView.cpp:117
+msgid "Time "
+msgstr "Denbora "
+
+#: ../src/gui/editors/tempo/TempoView.cpp:118
+msgid "Type "
+msgstr "Mota "
+
+#: ../src/gui/editors/tempo/TempoView.cpp:119
+msgid "Value "
+msgstr "Balorea "
+
+#: ../src/gui/editors/tempo/TempoView.cpp:120
+msgid "Properties "
+msgstr "Propietateak "
+
+#: ../src/gui/editors/tempo/TempoView.cpp:208
+msgid "Common, hidden"
+msgstr "Arrunta, ezkutua"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:210
+msgid "Hidden"
+msgstr "Ezkutua"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:213
+msgid "Common"
+msgstr "Arrunta"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:220
+msgid "Time Signature "
+msgstr "Konpasaren neurria "
+
+#: ../src/gui/editors/tempo/TempoView.cpp:245
+msgid "%1.%2%3"
+msgstr "%1.%2%3"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:255
+msgid "%1.%2%3 qpm (%4.%5%6 bpm) "
+msgstr "%1.%2%3 qpm (%4.%5%6 bpm) "
+
+#: ../src/gui/editors/tempo/TempoView.cpp:264
+msgid "Tempo "
+msgstr "Tenpoa "
+
+#: ../src/gui/editors/tempo/TempoView.cpp:271
+msgid "<nothing at this filter level>"
+msgstr "<ezer ez iragazte maila honetan>"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:463
+msgid "Delete Tempo or Time Signature"
+msgstr "Tenpoa edo konpasaren neurria ezabatu"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:602
+msgid "&Edit Item"
+msgstr "&Elementua Editatu"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:834
+msgid "%1 - Tempo and Time Signature Editor"
+msgstr "%1 - Tenpo eta Konpas-Neurriaren Editorea"
+
+#: ../src/gui/editors/guitar/GuitarChordEditorDialog.cpp:43
+#, fuzzy
+msgid "Guitar Chord Editor"
+msgstr "Gitarra akordeen editorea"
+
+#: ../src/gui/editors/guitar/GuitarChordEditorDialog.cpp:51
+#, fuzzy
+msgid "Start fret"
+msgstr "Hasierako Konpasa"
+
+#: ../src/gui/editors/guitar/GuitarChordEditorDialog.cpp:58
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:51
+msgid "Root"
+msgstr ""
+
+#: ../src/gui/editors/guitar/GuitarChordEditorDialog.cpp:62
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:55
+#, fuzzy
+msgid "Extension"
+msgstr "Bertsioa"
+
+#: ../src/gui/editors/guitar/Fingering.cpp:118
+msgid "couldn't parse fingering '%1' in '%2'"
+msgstr ""
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:45
+#, fuzzy
+msgid "Guitar Chord Selector"
+msgstr "Akordeen Hautatzailea"
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:64
+msgid "beginner"
+msgstr ""
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:65
+#, fuzzy
+msgid "common"
+msgstr "Arrunta"
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:66
+#, fuzzy
+msgid "all"
+msgstr "Denak"
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:86
+#, fuzzy
+msgid "Fingerings"
+msgstr "Ha&tz Jokoak"
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:419
+#, fuzzy
+msgid "couldn't open file '%1'"
+msgstr "Ezin da '%1' artxiboa ireki"
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:428
+#, c-format
+msgid "couldn't parse chord dictionnary : %1"
+msgstr ""
+
+#: ../src/gui/editors/notation/NoteFontViewer.cpp:87
+#, c-format
+msgid "Note Font Viewer: %1"
+msgstr "Partituraren tipografiarako bisorea: %1"
+
+#: ../src/gui/editors/notation/NoteFontViewer.cpp:93
+msgid " Component: "
+msgstr " Osagaia: "
+
+#: ../src/gui/editors/notation/NoteFontViewer.cpp:101
+msgid " View: "
+msgstr " Bista: "
+
+#: ../src/gui/editors/notation/NoteFontViewer.cpp:104
+msgid "Glyphs"
+msgstr "Glifoak"
+
+#: ../src/gui/editors/notation/NoteFontViewer.cpp:105
+msgid "Codes"
+msgstr "Kodeak"
+
+#: ../src/gui/editors/notation/NoteFontViewer.cpp:107
+msgid " Page: "
+msgstr " Orria: "
+
+#: ../src/gui/editors/notation/ClefInserter.cpp:64
+#: ../src/gui/editors/notation/GuitarChordInserter.cpp:71
+#: ../src/gui/editors/notation/RestInserter.cpp:79
+#: ../src/gui/editors/notation/TextInserter.cpp:68
+msgid "Switch to Inserting Notes"
+msgstr "Notak Txertatzera Aldatu"
+
+#: ../src/gui/editors/notation/NotationView.cpp:522
+#, fuzzy
+msgid "Close track headers"
+msgstr "Pistaren izena aldatu"
+
+#: ../src/gui/editors/notation/NotationView.cpp:917
+msgid "Preparing to print..."
+msgstr "Inprimatzeko prestatzen..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:1516
+msgid "Note &Font"
+msgstr "Notaren &Letra-Tipoa"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1539
+msgid "Si&ze"
+msgstr "&Tamaina"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1545
+#, fuzzy
+msgid "Show Track Headers"
+msgstr "Pistaren &Etiketak Erakutsi"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1550
+msgid "S&pacing"
+msgstr "&Hutsuneen Tartekatzea"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1572
+msgid "Du&ration Factor"
+msgstr "&Iraupen Faktorea"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1598
+msgid "Note &Style"
+msgstr "Notaren &Estiloa"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1624
+msgid "Insert Rest"
+msgstr "Isilunea Txertatu"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1628
+msgid "Switch from Note to Rest"
+msgstr "Notatik isilunera Aldatu"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1633
+msgid "Switch from Rest to Note"
+msgstr "Isilunetik Notara Aldatu"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1690
+msgid "No accidental"
+msgstr "Alteraziorik gabe"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1691
+msgid "Follow previous accidental"
+msgstr "Jarraitu aurreko alterazioa"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1692
+msgid "Sharp"
+msgstr "Diesea"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1693
+msgid "Flat"
+msgstr "Bemola"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1694
+msgid "Natural"
+msgstr "Bekoadroa"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1695
+msgid "Double sharp"
+msgstr "Diese bikoitza"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1696
+msgid "Double flat"
+msgstr "Bemol bikoitza"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1717
+msgid "&Treble Clef"
+msgstr "&Soprano Klabea"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1724
+msgid "&Alto Clef"
+msgstr "&Alto Klabea"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1731
+msgid "Te&nor Clef"
+msgstr "&Tenore Klabea"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1738
+msgid "&Bass Clef"
+msgstr "&Baxu Klabea"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1745
+msgid "&Text"
+msgstr "&Testua"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1751
+#, fuzzy
+msgid "&Guitar Chord"
+msgstr " Akordea"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1784
+msgid "Select from Sta&rt"
+msgstr "&Hasieratik Hautatu"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1788
+msgid "Select to &End"
+msgstr "B&ukaeraraino Hautatu"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1792
+msgid "Select Whole St&aff"
+msgstr "&Pentagrama Osoa Hautatu"
+
+#: ../src/commands/edit/CutAndCloseCommand.h:53
+#: ../src/gui/editors/notation/NotationView.cpp:1796
+msgid "C&ut and Close"
+msgstr "E&baki eta Itxi"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1800
+msgid "Pa&ste..."
+msgstr "&Itsatsi..."
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:122
+#: ../src/gui/editors/notation/NotationView.cpp:1808
+msgid "Move to Staff Above"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:126
+#: ../src/gui/editors/notation/NotationView.cpp:1812
+msgid "Move to Staff Below"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1826
+msgid "&Linear Layout"
+msgstr "Formato &Lineala"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1835
+msgid "&Continuous Page Layout"
+msgstr "Orri &Jarraiaren Formatoa"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1844
+msgid "&Multiple Page Layout"
+msgstr "Orri &Anitzaren Formatoa"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1854
+msgid "Show Ra&w Note Ruler"
+msgstr "Nota G&ordinaren Erregela Erakutsi"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1862
+msgid "Show &Annotations"
+msgstr "Oharrak &Erakutsi"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1866
+msgid "Show Lily&Pond Directives"
+msgstr "&LilyPonderako Direktibak Erakutsi"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1870
+msgid "Open L&yric Editor"
+msgstr "L&etraren Editorea Ireki"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1912
+msgid "Trip&let Insert Mode"
+msgstr "&Hirukotxoak Txertatzeko Modua"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1926
+#, fuzzy
+msgid "Grace Insert Mode"
+msgstr "&Hirukotxoak Txertatzeko Modua"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2180
+msgid "&Dump selected events to stderr"
+msgstr "Hautatutako gertaerak stderrera irauli"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2248
+msgid "Ma&ke Ornament..."
+msgstr "Apaindura &Egin..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:2252
+msgid "Trigger &Ornament..."
+msgstr "&Apaindura aktibatzailea..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:2256
+msgid "Remove Ornament..."
+msgstr "Apaindura Ezabatu..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:2261
+msgid "&None"
+msgstr "&Ezer ez"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2289
+#, fuzzy
+msgid "Convert Notation For..."
+msgstr "Audio artxiboa bihurtzen..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:2298
+msgid "Show &Notes Toolbar"
+msgstr "Erakutsi &Noten Tresna-Barra"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2299
+msgid "Show &Rests Toolbar"
+msgstr "Erakutsi &Isiluneen Tresna-Barra"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2300
+msgid "Show &Accidentals Toolbar"
+msgstr "Erakutsi &Alterazioen Tresna-Barra"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2301
+msgid "Show Cle&fs Toolbar"
+msgstr "Erakutsi &Klabeen Tresna-Barra"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2303
+msgid "Show &Marks Toolbar"
+msgstr "Erakutsi &Markatzaileen Tresna-Barra"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2305
+msgid "Show &Group Toolbar"
+msgstr "Erakutsi M&ultzoen Tresna-Barra"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2307
+msgid "Show &Layout Toolbar"
+msgstr "Erakutsi &Formatoaren Tresna-Barra"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2311
+msgid "Show M&eta Toolbar"
+msgstr "Erakutsi M&eta Tresna-Barra"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2373
+msgid "Cursor &Up Staff"
+msgstr "Kurtsorea Pentagrama bat I&go"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2377
+msgid "Cursor &Down Staff"
+msgstr "Kurtsorea Pentagrama bat Jai&tsi"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2381
+msgid "Cursor Pre&vious Segment"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2385
+#, fuzzy
+msgid "Cursor Ne&xt Segment"
+msgstr "Sortu segmentua"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2475
+msgid "Push &Left"
+msgstr "E&zkerrera Bultzatu"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2479
+msgid "Push &Right"
+msgstr "E&skuinera Bultzatu"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2483
+msgid "Push &Up"
+msgstr "&Gora Bultzatu"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2487
+msgid "Push &Down"
+msgstr "&Behera Bultzatu"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2491
+#, fuzzy
+msgid "&Restore Positions"
+msgstr "Berjarri Kalkulatutako Kokapenak"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2495
+msgid "Make &Invisible"
+msgstr "&Ikustezina Bihurtu"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2499
+msgid "Make &Visible"
+msgstr "Ikusga&rria Bihurtu"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2503
+msgid "Toggle Dot"
+msgstr "Puntutxoa Jarri/Kendu"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2507
+#: ../src/gui/editors/notation/NotationView.cpp:2511
+msgid "Add Dot"
+msgstr "Puntutxoa Gehitu"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2570
+#, c-format
+msgid ""
+"_n: 1 pixel\n"
+"%n pixels"
+msgstr ""
+"_n: pixel 1\n"
+"%n pixel"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2619
+msgid " Font: "
+msgstr " Letra-Tipoa: "
+
+#: ../src/gui/editors/notation/NotationView.cpp:2647
+msgid "Unknown font \"%1\", using default"
+msgstr "\"%1\" Letra-Tipo ezezaguna, lehenetsia erabiliko da"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2655
+msgid " Size: "
+msgstr " Tamaina: "
+
+#: ../src/gui/editors/notation/NotationView.cpp:2677
+msgid " Spacing: "
+msgstr " Hutsuneen Tartekatzea: "
+
+#: ../src/gui/editors/notation/NotationView.cpp:2993
+#: ../src/gui/editors/notation/NotationView.cpp:3818
+msgid " Ready."
+msgstr " Prest."
+
+#: ../src/gui/editors/notation/NotationView.cpp:2998
+msgid "Laying out score..."
+msgstr "Formato ematen partiturari..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:3011
+msgid "Laying out staff %1..."
+msgstr "%1 pentagramari formatoa ematen..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:3020
+msgid "Reconciling staffs..."
+msgstr "Pentagramak adosten..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:3885
+msgid "Sizing and allocating canvas..."
+msgstr "Mihiseari tamaina aldatzen eta kokatzen..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:4050
+msgid "note"
+msgstr "nota"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4050
+msgid "rest"
+msgstr "isilunea"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4211
+msgid "%1 - Segment Track #%2 - Notation"
+msgstr "%1 - Segmentu Pista #%2 - Partitura"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4217
+msgid "%1 - All Segments - Notation"
+msgstr "%1 - Segmentu Guztiak - Partitura"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4222
+#, fuzzy
+msgid ""
+"_n: %1 - Segment - Notation\n"
+"%1 - %n Segments - Notation"
+msgstr ""
+"_n: %1 - Segmentu - Notazioa\n"
+"%1 - %n Segmentu - Notazioa"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4243
+#, fuzzy
+msgid "Grace"
+msgstr "Grave"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4247
+#: ../src/gui/editors/notation/NotationView.cpp:4251
+#: ../src/gui/editors/notation/NotationView.cpp:4255
+#, fuzzy
+msgid "%1 %2"
+msgstr "%1 (%2)"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4271
+msgid "Hidden annotations"
+msgstr "Ezkutuko oharrak"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4293
+msgid "Hidden LilyPond directives"
+msgstr "Ezkutuko LilyPond Direktibak"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4326
+#, c-format
+msgid "Unknown spacing action %1"
+msgstr "Hutsuneak tartekatzeko eragiketa ezezaguna %1"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4384
+#, c-format
+msgid "Unknown proportion action %1"
+msgstr "Proporzio eragiketa ezezaguna %1"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4431
+#, c-format
+msgid "Unknown font action %1"
+msgstr "Letra tiporako akzio ezezaguna %1"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4449
+#, c-format
+msgid "Unknown font size %1"
+msgstr "Letra tipoaren tamaina ezezaguna %1"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4453
+#, c-format
+msgid "Unknown font size action %1"
+msgstr "Letra-Tiporako tamaina eragiketa ezezaguna %1"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4780
+#, fuzzy
+msgid ""
+"The Restricted paste type requires enough empty space (containing only "
+"rests) at the paste position to hold all of the events to be pasted.\n"
+"Not enough space was found.\n"
+"If you want to paste anyway, consider using one of the other paste types "
+"from the \"Paste...\" option on the Edit menu. You can also change the "
+"default paste type to something other than Restricted if you wish."
+msgstr ""
+"Mugatutako itsasteko motak leku nahikoa (bakarrik\n"
+"isiluneak dauzkala) behar du itsatsi behar den lekuan\n"
+"itsatsi behar diren gertaera guztiak edukitzeko.\n"
+"Ez da aurkitu leku nahikorik.\n"
+"Hala ere, itsatsi nahi baduzu, pentsatu beste itsasketa\n"
+"motetako bat erabiltzeaz (\"Itsasi...\" aukera Editatu\n"
+"menuan. Era berean, lehenetsitako itsasketa mota Mugatutakoa\n"
+"ez den beste batera alda dezakezu, nahi baduzu"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4800
+msgid "Can't paste multiple Segments into one"
+msgstr "Ezin dira segmentu asko batean itsatsi"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4828
+#: ../src/gui/editors/notation/NotationView.cpp:4877
+msgid "Couldn't paste at this point."
+msgstr "Ezin da puntu honetan itsatsi."
+
+#: ../src/gui/editors/notation/NotationView.cpp:4896
+#, fuzzy
+msgid "Move Events to Staff Above"
+msgstr "Gertaerak &Mugitu Beste Segmentu Batera"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4924
+#, fuzzy
+msgid "Move Events to Staff Below"
+msgstr "Gertaerak &Mugitu Beste Segmentu Batera"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5036
+msgid "Pushing selection left..."
+msgstr "Hautatutakoa ezkerrerantz bultzatzen..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5047
+msgid "Pushing selection right..."
+msgstr "Hautatutakoa eskuinerantz bultzatzen..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5058
+msgid "Pushing selection up..."
+msgstr "Hautatutakoa gorantz bultzatzen..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5069
+msgid "Pushing selection down..."
+msgstr "Hautatutakoa beherantz bultzatzen..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5080
+msgid "Restoring computed positions..."
+msgstr "Kalkulatutako posizioak berjartzen..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5089
+msgid "Making visible..."
+msgstr "Ikusgarri bihurtzen..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5098
+msgid "Making invisible..."
+msgstr "Ikustezin bihurtzen..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5185
+msgid "Beaming group..."
+msgstr "Plikak batzen..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5195
+msgid "Auto-beaming selection..."
+msgstr "Hautatutakoaren pliak automatikoki batzen..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5205
+msgid "Breaking groups..."
+msgstr "Multzoak apurtzen..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5293
+msgid "Untupleting..."
+msgstr "Multzo irregularrak zatitzen..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5301
+msgid "Adding slur..."
+msgstr "Ligatura gehitzen..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5302
+msgid "slur"
+msgstr "ligatura"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5307
+msgid "Adding phrasing slur..."
+msgstr "Fraseatze-ligatura gehitzen..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5308
+msgid "phrasing slur"
+msgstr "fraseatze-ligatura"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5313
+msgid "Adding glissando..."
+msgstr "Glissandoa gehitzen..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5314
+msgid "glissando"
+msgstr "glissandoa"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5319
+msgid "Adding crescendo..."
+msgstr "Crescendoa gehitzen..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5320
+#: ../src/gui/editors/notation/NotationView.cpp:5326
+msgid "dynamic"
+msgstr "dinamika"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5325
+msgid "Adding decrescendo..."
+msgstr "Decrescendoa gehitzen..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5331
+#: ../src/gui/editors/notation/NotationView.cpp:5337
+#: ../src/gui/editors/notation/NotationView.cpp:5343
+#: ../src/gui/editors/notation/NotationView.cpp:5349
+msgid "Adding octave..."
+msgstr "Oktaba gehitzen..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5332
+#: ../src/gui/editors/notation/NotationView.cpp:5338
+#: ../src/gui/editors/notation/NotationView.cpp:5344
+#: ../src/gui/editors/notation/NotationView.cpp:5350
+msgid "ottava"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5366
+msgid "Can't add overlapping %1 indications"
+msgstr "Ezin dira %1 adierazpen gainjarri gehitu"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5375
+msgid "Making chord..."
+msgstr "Akordea sortzen..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5387
+msgid "Normalizing rests..."
+msgstr "Isiluneak normalizatzen..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5397
+msgid "Collapsing rests..."
+msgstr "Isiluneak batzen..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5417
+msgid "Tying notes..."
+msgstr "Notak lotzen..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5427
+msgid "Untying notes..."
+msgstr "Notak askatzen..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5437
+msgid "Making notes viable..."
+msgstr "Notak ikusgarri bihurtzen..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5447
+msgid "Removing counterpoint..."
+msgstr "Kontrapuntua ezabatzen..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5457
+msgid "Pointing stems up..."
+msgstr "Plikak gora begira..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5467
+msgid "Pointing stems down..."
+msgstr "Plikak behera begira..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5478
+msgid "Restoring computed stem directions..."
+msgstr "Pliken kalkulatutako norabidea berjartzen..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5488
+#: ../src/gui/editors/notation/NotationView.cpp:5498
+msgid "Positioning slurs..."
+msgstr "Ligaturak kokatzen..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5509
+msgid "Restoring slur positions..."
+msgstr "Ligaturen kokapenak berjartzen..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5519
+#: ../src/gui/editors/notation/NotationView.cpp:5529
+#, fuzzy
+msgid "Positioning ties..."
+msgstr "Ligaturak kokatzen..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5540
+#, fuzzy
+msgid "Restoring tie positions..."
+msgstr "Kalkulatutako posizioak berjartzen..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5550
+msgid "Fixing notation quantization..."
+msgstr "Partituraren kuantifikazioa finkatzen..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5560
+msgid "Removing notation quantization..."
+msgstr "Partituraren kuantifikazioa ezabatzen..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5577
+msgid "Changing to %1 style..."
+msgstr "%1 estilora aldatzen..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5585
+#, c-format
+msgid "Unknown style action %1"
+msgstr "Estilo eragiketa ezezaguna: %1"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5598
+#: ../src/gui/editors/notation/NotationView.cpp:5639
+#: ../src/gui/editors/notation/NotationView.cpp:5695
+msgid "No note duration selected"
+msgstr "Ez da hautatu notaren iraupena"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5660
+msgid "No rest duration selected"
+msgstr "Ez da hautatu isilunearen iraupena"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5746
+msgid "No note or rest duration selected"
+msgstr "Ez da hautatu notaren edo isilunearen iraupena"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5757
+#: ../src/gui/editors/notation/NotationView.cpp:5768
+#: ../src/gui/editors/notation/NotationView.cpp:5779
+#: ../src/gui/editors/notation/NotationView.cpp:5790
+#: ../src/gui/editors/notation/NotationView.cpp:5801
+#: ../src/gui/editors/notation/NotationView.cpp:5812
+#: ../src/gui/editors/notation/NotationView.cpp:5823
+msgid "Forcing accidentals..."
+msgstr "Alterazioak derrigortzen"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5834
+msgid "Restoring accidentals..."
+msgstr "Alterazioak berjartzen"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5845
+msgid "Showing cautionary accidentals..."
+msgstr "Zuhurtziazko alterazioak erakusten..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5855
+msgid "Cancelling cautionary accidentals..."
+msgstr "Zuhurtziazko alterazioak ezeztatzen..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5884
+msgid "Interpreting selection..."
+msgstr "Hautatutakoa interpretatzen..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5896
+msgid "Setting note durations..."
+msgstr "Noten iraupena ezartzen..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5904
+#: ../src/gui/editors/notation/NotationView.cpp:5912
+msgid "Adding dot..."
+msgstr "Puntutxoa gehitzen..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5934
+msgid "Text: "
+msgstr "Testua: "
+
+#: ../src/gui/editors/notation/NotationView.cpp:5948
+msgid "Fingering: "
+msgstr "Hatz-jokoa: "
+
+#: ../src/gui/editors/notation/NotationView.cpp:6036
+msgid "Ornament track %1 bar %2"
+msgstr "%1 Apaindura Pista konpas %2"
+
+#: ../src/gui/editors/notation/NotationView.cpp:6038
+#, c-format
+msgid "Ornament bar %1"
+msgstr "Apaindura konpasa %1"
+
+#: ../src/gui/editors/notation/NotationView.cpp:6098
+msgid "Remove Ornaments"
+msgstr "Apaindurak Ezabatu"
+
+#: ../src/gui/editors/notation/NotationView.cpp:6145
+msgid "Estimated key signature shown"
+msgstr "Estimatutako armadura erakusten da"
+
+#: ../src/gui/editors/notation/NotationStaff.cpp:1249
+#: ../src/gui/editors/notation/NotationView.cpp:6202
+msgid "Sustain"
+msgstr "Diesea"
+
+#: ../src/gui/editors/notation/NotationView.cpp:6218
+msgid ""
+"There is no sustain controller defined for this device.\n"
+"Please ensure the device is configured correctly in the Manage MIDI Devices "
+"dialog in the main window."
+msgstr ""
+"Ez dago sustain kontroladore definitu bat dispositibo honetarako.\n"
+"Mesdez, egiaztatu dispositiboa modu egokian konfiguratuta dagoela \"MIDI "
+"Dispositiboak Kudeatu\" dialogoan, leiho nagusian. "
+
+#: ../src/gui/editors/notation/NotationView.cpp:7250
+msgid "Can't insert note: No note duration selected"
+msgstr "Ezin da nota txertatu: notaren iraupena ez dago hautatuta"
+
+#: ../src/gui/editors/notation/NotationEraser.cpp:61
+#: ../src/gui/editors/notation/NotationSelector.cpp:83
+msgid "Switch to Insert Tool"
+msgstr "Txertatzeko Lanabesera Aldatu"
+
+#: ../src/gui/editors/notation/NotePixmapFactory.cpp:2303
+#: ../src/gui/editors/notation/NotePixmapFactory.cpp:2347
+msgid "..."
+msgstr "..."
+
+#: ../src/gui/editors/notation/NoteFontFactory.cpp:200
+msgid "Can't obtain a default font -- no fonts found"
+msgstr "Ezin da lortu letra-tipo lehenetsi bat -- ez dira letra-tipoak aurkitu"
+
+#: ../src/gui/editors/notation/NoteFontMap.cpp:52
+#: ../src/gui/general/PresetGroup.cpp:49
+msgid "unknown error"
+msgstr "errore ezezaguna"
+
+#: ../src/gui/editors/notation/NoteFontMap.cpp:78
+msgid "Can't open font mapping file %1 or %2"
+msgstr "Ezin da ireki %1 edo %2 letra-tipoen mapaketa artxiboa"
+
+#: ../src/gui/editors/notation/NoteFontMap.cpp:82
+#, c-format
+msgid "Can't open font mapping file %1"
+msgstr "Ezin da ireki %1 letra-tipoen mapaketa artxiboa"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:52
+msgid "%1-dotted-%2"
+msgstr "%1-puntutxoarekin-%2"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:54
+msgid "%1-dotted %2"
+msgstr "%1-puntutxoarekin %2"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:57
+#, c-format
+msgid "dotted-%1"
+msgstr "%1-puntutxoarekin"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:59
+#, c-format
+msgid "dotted %1"
+msgstr "%1 puntutxoarekin"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:83
+msgid "sixty-fourth note"
+msgstr "fusaerdi"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:83
+msgid "thirty-second note"
+msgstr "fusa"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:84
+msgid "sixteenth note"
+msgstr "kortxeaerdi"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:84
+msgid "eighth note"
+msgstr "kortxea"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:85
+msgid "quarter note"
+msgstr "beltza"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:85
+msgid "half note"
+msgstr "zuria"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:86
+msgid "whole note"
+msgstr "biribila"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:86
+msgid "double whole note"
+msgstr "koadratua"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:89
+msgid "sixty-fourth notes"
+msgstr "fusaerdiak"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:89
+msgid "thirty-second notes"
+msgstr "fusak"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:90
+msgid "sixteenth notes"
+msgstr "kortxeaerdiak"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:90
+msgid "eighth notes"
+msgstr "kortxeak"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:91
+msgid "quarter notes"
+msgstr "beltzak"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:91
+msgid "half notes"
+msgstr "zuriak"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:92
+msgid "whole notes"
+msgstr "biribilak"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:92
+msgid "double whole notes"
+msgstr "koadratuak"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:96
+#: ../src/gui/editors/notation/NotationStrings.cpp:154
+msgid "%1 triplets"
+msgstr "%1 hirukotxoa"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:100
+#: ../src/gui/editors/notation/NotationStrings.cpp:158
+msgid "%1 triplet"
+msgstr "%1 eko hirukotxoa"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:143
+msgid "64th"
+msgstr "fusaerdi"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:143
+msgid "32nd"
+msgstr "fusa"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:143
+msgid "16th"
+msgstr "kortxeaerdi"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:143
+msgid "8th"
+msgstr "kortxea"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:144
+msgid "quarter"
+msgstr "beltza"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:144
+msgid "half"
+msgstr "zuria"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:144
+msgid "whole"
+msgstr "biribila"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:145
+msgid "double whole"
+msgstr "koadratua"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:148
+msgid "64ths"
+msgstr "fusaerdiak"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:148
+msgid "32nds"
+msgstr "fusak"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:148
+msgid "16ths"
+msgstr "kortxeaerdiak"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:148
+msgid "8ths"
+msgstr "kortxeak"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:149
+msgid "quarters"
+msgstr "beltzak"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:149
+msgid "halves"
+msgstr "zuriak"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:149
+msgid "wholes"
+msgstr "biribilak"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:150
+msgid "double wholes"
+msgstr "koadratuak"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:278
+msgid "%1 ticks"
+msgstr "%1 tick"
+
+#: ../src/gui/editors/notation/FontViewFrame.cpp:100
+#, c-format
+msgid "Error: Unable to match font name %1"
+msgstr "Errorea: Ezgai letra-tipoaren izenarekin uztartzeko %1"
+
+#: ../src/gui/editors/notation/FontViewFrame.cpp:108
+msgid "Warning: No good match for font name %1 (best is %2)"
+msgstr ""
+"Oharra: Ez dago korrespondentzia onik %1 letra-tipoaren izenerako(onena %2 "
+"da)"
+
+#: ../src/gui/editors/notation/FontViewFrame.cpp:116
+#, c-format
+msgid "Error: Unable to open best-match font %1"
+msgstr ""
+"Errorea: Ezgai %1 letra-tipoarentzako korrespondentziarik onena irekitzeko"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:113
+#, fuzzy
+msgid "Track %1 : \"%2\""
+msgstr "[ Pista#%1 - %2 ]"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:119
+#, fuzzy, c-format
+msgid ""
+"\n"
+"Notate for: %1"
+msgstr "Partituraren tipografiarako bisorea: %1"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:121
+#, fuzzy
+msgid "normal"
+msgstr "Normala"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:124
+#, fuzzy
+msgid "small"
+msgstr "Denak"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:127
+msgid "tiny"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:131
+msgid "--"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:156
+msgid ""
+"\n"
+"Size: %1, Bracket: %2 "
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:183
+msgid ""
+"\n"
+"bars [%1-%2] in %3 (tr=%4) : \"%5\""
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:190
+msgid ""
+"\n"
+"bars [%1-%2] (tr=%3) : \"%4\""
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:240
+#, fuzzy
+msgid "C#"
+msgstr "Do#%1"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:242
+msgid "Eb"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:245
+#, fuzzy
+msgid "F#"
+msgstr "Fa#%1"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:247
+#, fuzzy
+msgid "G#"
+msgstr "Sol#%1"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:249
+msgid "Bb"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:352
+#, fuzzy
+msgid "%1: %2"
+msgstr "%1 (%2)"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:355
+#, fuzzy, c-format
+msgid " in %1"
+msgstr "Sarrera %1"
+
+#: ../src/gui/editors/notation/NotationStaff.cpp:452
+msgid "Rendering staff %1..."
+msgstr "%1 pentagrama prozesatzen..."
+
+#: ../src/gui/editors/notation/NotationStaff.cpp:515
+msgid "Rendering notes on staff %1..."
+msgstr "%1 pentagraman nota irudikatzen..."
+
+#: ../src/gui/editors/notation/NotationStaff.cpp:583
+msgid "Positioning staff %1..."
+msgstr "%1 pentagrama kokatzen..."
+
+#: ../src/gui/editors/notation/NotationSelectionPaster.cpp:85
+msgid "Ready."
+msgstr "Prest."
+
+#: ../src/gui/editors/notation/RestInserter.cpp:62
+msgid "Dotted rest"
+msgstr "Puntutxodun isilunea"
+
+#: ../src/gui/editors/notation/NoteStyleFileReader.cpp:57
+#, c-format
+msgid "Can't open style file %1"
+msgstr "Ezin da ireki %1 estilo artxiboa"
+
+#: ../src/gui/editors/notation/NoteStyleFileReader.cpp:92
+msgid "type is a required attribute of note"
+msgstr "mota notaren beharrezko ezaugarri bat da"
+
+#: ../src/gui/editors/notation/NoteStyleFileReader.cpp:101
+#, c-format
+msgid "Unrecognised note name %1"
+msgstr "Nota izen ezezaguna %1 (e)an"
+
+#: ../src/gui/editors/notation/NoteStyleFileReader.cpp:108
+msgid "global element must precede note elements"
+msgstr "elementu orokorra noten elementuak baino lehenago egon behar da"
+
+#: ../src/gui/editors/notation/NoteStyleFileReader.cpp:137
+msgid ""
+"global and note elements may have shape or charname attribute, but not both"
+msgstr ""
+"elementos globales y notas pueden tener forma o nombre de carácter, pero no "
+"ambos"
+
+#: ../src/gui/editors/notation/NotationVLayout.cpp:493
+msgid ""
+"Spanned note at %1 has no HEIGHT_ON_STAFF property!\n"
+"This is a bug (the program would previously have crashed by now)"
+msgstr ""
+"%1 -ean hedatutako notak ez dauka HEIGHT_ON_STAFF propietatea\n"
+"Hau bug bat da (programak krask egin beharko zukeen dagoeneko)"
+
+#: ../src/gui/editors/notation/NoteInserter.cpp:82
+msgid "Auto-Beam when appropriate"
+msgstr "Ligatura automatikoa dagokion lekuan"
+
+#: ../src/gui/editors/notation/NoteInserter.cpp:103
+msgid "Dotted note"
+msgstr "Puntutxodun nota"
+
+#: ../src/gui/editors/notation/NoteInserter.cpp:120
+msgid "Switch to Inserting Rests"
+msgstr "Isiluneak txertatzera aldatu"
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:98
+msgid "Collapse Rests"
+msgstr "Isiluneak Batu"
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:102
+msgid "Respell as Flat"
+msgstr "Alterazioak bemol izatera derrigortu"
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:106
+msgid "Respell as Sharp"
+msgstr "Alterazioak diesea izatera derrigortu"
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:110
+msgid "Respell as Natural"
+msgstr "Alterazioak naturala izatera derrigortu"
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:114
+msgid "Collapse Notes"
+msgstr "Notak batu"
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:130
+msgid "Make Invisible"
+msgstr "Ikustezin bihurtu"
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:134
+msgid "Make Visible"
+msgstr "Ikusgarri bihurtu"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:129
+msgid "Event filters"
+msgstr "Gertaeraren iragazkiak"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:138
+msgid "Rest"
+msgstr "Isilunea"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:139
+msgid "Indication"
+msgstr "Adierazpena"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:141
+msgid "Other"
+msgstr "Bestelakoa "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:161
+msgid "Triggered Segment Properties"
+msgstr "Segmentu aktibatuaren propietateak"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:166
+msgid "Label: "
+msgstr "Etiketa: "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:176
+msgid "Base pitch: "
+msgstr "Oinarrizko altuera: "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:183
+msgid "Base velocity: "
+msgstr "Oinarrizko abiadura: "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:246
+msgid "Duration "
+msgstr "Iraupena "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:247
+msgid "Event Type "
+msgstr "Gertaera Mota "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:248
+msgid "Pitch "
+msgstr "Altuera "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:249
+msgid "Velocity "
+msgstr "Abiadura "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:250
+msgid "Type (Data1) "
+msgstr "Mota (Datu 1) "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:251
+msgid "Value (Data2) "
+msgstr "Balorea (Datu 2) "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:461
+msgid "(group %1) "
+msgstr "(multzoa %1) "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:519
+msgid "<no events at this filter level>"
+msgstr "<iragazte maila honetan ez dago gertaerarik>"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:521
+msgid "<no events>"
+msgstr "<ez dago gertaerarik>"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:696
+msgid "Segment label"
+msgstr "Segmentuaren etiketa"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:696
+msgid "Label:"
+msgstr "Etiketa:"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1123
+msgid "&Insert Event"
+msgstr "Gertaera &Txertatu"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1130
+msgid "&Delete Event"
+msgstr "&Gertaera Ezabatu"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1137
+msgid "&Edit Event"
+msgstr "Gertaera &Editatu"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1144
+msgid "&Advanced Event Editor"
+msgstr "Gertaeren Iragazki &Aurreratua"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1518
+msgid "Open in Event Editor"
+msgstr "Gertaeren Editorean Ireki"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1519
+msgid "Open in Expert Event Editor"
+msgstr "Gertaeren Editore Aurreratuan Ireki"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1577
+msgid "%1 - Triggered Segment: %2"
+msgstr "%1 - Segmentu Aktibatua: %2"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1592
+msgid "%1 - Segment Track #%2 - Event List"
+msgstr "%1 - Segmentu Pista #%2 - Gertaeren Zerrenda"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1598
+msgid "%1 - %2 Segments - Event List"
+msgstr "%1 - %2 Segmentu - Gertaeren Zerrenda"
+
+#: ../src/gui/rulers/TempoRuler.cpp:131
+msgid "Insert Tempo Change at Playback Position"
+msgstr "Tenpo Aldaketa Txertatu Erreprodukzioaren Posizioan "
+
+#: ../src/gui/rulers/TempoRuler.cpp:136
+msgid "Delete Tempo Change"
+msgstr "Tenpo Aldaketa Ezabatu"
+
+#: ../src/gui/rulers/TempoRuler.cpp:140
+msgid "Ramp Tempo to Next Tempo"
+msgstr ""
+"Pixkanakako tenpo aldaketa bat egin oraingoaren eta hurrengoaren artean"
+
+#: ../src/gui/rulers/TempoRuler.cpp:144
+msgid "Un-Ramp Tempo"
+msgstr "Pixkanakako tenpo aldaketa desegin"
+
+#: ../src/gui/rulers/TempoRuler.cpp:149
+msgid "Edit Tempo..."
+msgstr "Tenpoa &Editatu "
+
+#: ../src/gui/rulers/TempoRuler.cpp:153
+msgid "Edit Time Signature..."
+msgstr "Konpasa Aldatu"
+
+#: ../src/gui/rulers/TempoRuler.cpp:588
+msgid "%1.%2%3 (%4.%5%6 bpm)"
+msgstr "%1.%2%3 (%4.%5%6 tpm) "
+
+#: ../src/gui/rulers/TempoRuler.cpp:596
+msgid "%1.%2%3 bpm"
+msgstr "(%1.%2 tpm)"
+
+#: ../src/gui/rulers/TempoRuler.cpp:604
+msgid "%1 - %2.%3%4"
+msgstr "%1 - %2.%3%4"
+
+#: ../src/gui/rulers/ControlRulerEventInsertCommand.cpp:36
+msgid "Insert Controller Event"
+msgstr "Kontroladorearen Ebentoa Txertatu"
+
+#: ../src/gui/rulers/ControlChangeCommand.cpp:35
+msgid "Control Change"
+msgstr "Kontroladorearen Aldaketa"
+
+#: ../src/gui/rulers/PropertyViewRuler.cpp:72
+msgid "%1 controller"
+msgstr "%1 kontroladorea"
+
+#: ../src/gui/rulers/RawNoteRuler.cpp:453
+msgid "Track #%1, Segment \"%2\" (runtime id %3)"
+msgstr ""
+
+#: ../src/gui/rulers/MarkerRuler.cpp:100
+#, fuzzy
+msgid "Insert Marker"
+msgstr "Tartea Txertatu"
+
+#: ../src/gui/rulers/MarkerRuler.cpp:104
+#, fuzzy
+msgid "Insert Marker at Playback Position"
+msgstr "Tenpo Aldaketa Txertatu Erreprodukzioaren Posizioan "
+
+#: ../src/gui/rulers/MarkerRuler.cpp:109
+#, fuzzy
+msgid "Delete Marker"
+msgstr "Markadore bat Ezabatu"
+
+#: ../src/gui/rulers/MarkerRuler.cpp:114
+#, fuzzy
+msgid "Edit Marker..."
+msgstr "Mar&katzaileak Editatu..."
+
+#: ../src/gui/rulers/MarkerRuler.cpp:119
+msgid ""
+"Click on a marker to move the playback pointer.\n"
+"Shift-click to set a range between markers.\n"
+"Double-click to open the marker editor."
+msgstr ""
+
+#: ../src/gui/rulers/ChordNameRuler.cpp:97
+msgid ""
+"Chord name ruler.\n"
+"Turn it on and off from the Settings->Rulers menu."
+msgstr ""
+"Akorde izenen erregela.\n"
+"Erakusteko edo ezkutatzeko: Konfigurazioa -> Erregelak"
+
+#: ../src/gui/rulers/ControlRulerEventEraseCommand.cpp:37
+msgid "Erase Controller Event(s)"
+msgstr "Kontroladorearen Gertaerak Ezabatu"
+
+#: ../src/gui/general/EditView.cpp:901
+#: ../src/gui/rulers/ControllerEventsRuler.cpp:188
+msgid "Unsupported Event Type"
+msgstr "Kontroladorearen Gertaera ez jasota"
+
+#: ../src/gui/rulers/ControllerEventsRuler.cpp:203
+msgid "Controller Events"
+msgstr "Kontroladorearen Gertaerak"
+
+#: ../src/gui/rulers/ControllerEventsRuler.cpp:278
+msgid "Controller Event Number"
+msgstr "Kontroladorearen Gertaera Zenbakia"
+
+#: ../src/gui/rulers/ControllerEventsRuler.cpp:471
+msgid "Add line of controllers"
+msgstr "Gehitu Kontroladoreen Lerroa"
+
+#: ../src/gui/rulers/LoopRuler.cpp:89
+#, fuzzy
+msgid ""
+"Click and drag to move the playback pointer.\n"
+"Shift-click and drag to set a range for looping or editing.\n"
+"Shift-click to clear the loop or range.\n"
+"Double-click to start playback."
+msgstr ""
+"Ezkerreko Klika erreprodukzio punteroa kokatzeko.\n"
+"Shift + Ezkerreko Klika + Arrastatu editatu edo errepikatu beharreko tarte "
+"bat hautatzeko.\n"
+"Shift + Ezkerreko Klika errepikapena edo tartea ezabatzeko"
+
+#: ../src/gui/general/EditViewBase.cpp:228
+msgid "Set Segment Start Time..."
+msgstr "Ezarri Segmentuaren Hasiera Denbora..."
+
+#: ../src/gui/general/EditViewBase.cpp:232
+msgid "Set Segment Duration..."
+msgstr "Segmentuaren Iraupena Ezarri..."
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:56
+msgid "Load track parameters preset"
+msgstr "Kargatu aurrez programatutako pista parametroak"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:62
+#, fuzzy
+msgid "Convert notation for..."
+msgstr "Audio artxiboa bihurtzen..."
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:86
+msgid "Select preset track parameters for:"
+msgstr "Hautatu aurrez programatutako pista parametroak ondokoarentzat:"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:87
+msgid "Create appropriate notation for:"
+msgstr ""
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:89
+msgid "Category"
+msgstr "Saila"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:95
+msgid "Player Ability"
+msgstr "Maila"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:97
+msgid "Amateur"
+msgstr "Amateur"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:98
+msgid "Professional"
+msgstr "Profesionala"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:104
+#, fuzzy
+msgid "Only selected segments"
+msgstr "Hautatutako segmentuak"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:106
+#, fuzzy
+msgid "All segments in this track"
+msgstr "Aplikatu denbora puntu honetan dauden segmentu guztiei"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:111
+#, fuzzy
+msgid "Only for new segments"
+msgstr "Letra segmentu honetarako"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:113
+#, fuzzy
+msgid "Convert existing segments"
+msgstr "Sortu segmentua"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:39
+#, c-format
+msgid "C%1"
+msgstr "Do%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:39
+#, c-format
+msgid "C#%1"
+msgstr "Do#%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:39
+#, c-format
+msgid "D%1"
+msgstr "Re%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:39
+#, c-format
+msgid "D#%1"
+msgstr "Re#%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:40
+#, c-format
+msgid "E%1"
+msgstr "Mi%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:40
+#, c-format
+msgid "F%1"
+msgstr "Fa%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:40
+#, c-format
+msgid "F#%1"
+msgstr "Fa#%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:40
+#, c-format
+msgid "G%1"
+msgstr "Sol%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:41
+#, c-format
+msgid "G#%1"
+msgstr "Sol#%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:41
+#, c-format
+msgid "A%1"
+msgstr "La%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:41
+#, c-format
+msgid "A#%1"
+msgstr "La#%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:41
+#, c-format
+msgid "B%1"
+msgstr "Si%1"
+
+#: ../src/gui/general/PresetGroup.cpp:95
+#, c-format
+msgid "Can't open preset file %1"
+msgstr "Ezin da %1 preset artxiboa ireki"
+
+#: ../src/gui/general/EditView.cpp:744
+#, fuzzy
+msgid "&Halve Durations"
+msgstr "Iraupena"
+
+#: ../src/gui/general/EditView.cpp:748
+#, fuzzy
+msgid "&Double Durations"
+msgstr "Bemol bikoitza"
+
+#: ../src/gui/general/EditView.cpp:806
+msgid "Show Velocity Property Ruler"
+msgstr "Abiaduraren Propietate Erregela Erakutsi"
+
+#: ../src/gui/general/EditView.cpp:825
+msgid "Insert item"
+msgstr "Elementua Txertatu"
+
+#: ../src/gui/general/EditView.cpp:831
+msgid "Erase selected items"
+msgstr "Ezabatu Hautatutako Elementuak"
+
+#: ../src/gui/general/EditView.cpp:835
+msgid "Clear ruler"
+msgstr "Erregela Garbitu"
+
+#: ../src/gui/general/EditView.cpp:839
+msgid "Insert line of controllers"
+msgstr "Kontroladoreen Lerroa Txertatu"
+
+#: ../src/gui/general/EditView.cpp:843
+msgid "Flip forward"
+msgstr "Aurrera irauli"
+
+#: ../src/gui/general/EditView.cpp:847
+msgid "Flip backwards"
+msgstr "Atzera irauli"
+
+#: ../src/gui/general/EditView.cpp:851
+msgid "Draw property line"
+msgstr "Marraztu propietatearen lerroa"
+
+#: ../src/gui/general/EditView.cpp:855
+msgid "Select all property values"
+msgstr "Propietatearen balore guztiak hautatu"
+
+#: ../src/gui/general/EditView.cpp:894
+msgid "%1 Controller %2 %3"
+msgstr "%1 kontroladore%2 %3"
+
+#: ../src/gui/general/EditView.cpp:1066
+msgid "I"
+msgstr "I"
+
+#: ../src/gui/general/EditView.cpp:1066
+msgid "II"
+msgstr "II"
+
+#: ../src/gui/general/EditView.cpp:1066
+msgid "III"
+msgstr "III"
+
+#: ../src/gui/general/EditView.cpp:1066
+msgid "IV"
+msgstr "IV"
+
+#: ../src/gui/general/EditView.cpp:1067
+msgid "V"
+msgstr "V"
+
+#: ../src/gui/general/EditView.cpp:1067
+msgid "VI"
+msgstr "VI"
+
+#: ../src/gui/general/EditView.cpp:1067
+msgid "VII"
+msgstr "VII"
+
+#: ../src/gui/general/EditView.cpp:1067
+msgid "VIII"
+msgstr "VIII"
+
+#: ../src/gui/general/EditView.cpp:1069
+msgid "%1 flat"
+msgstr "%1 bemol"
+
+#: ../src/gui/general/EditView.cpp:1070
+msgid "%1 sharp"
+msgstr "%1 diese"
+
+#: ../src/gui/general/EditView.cpp:1085
+msgid "&Insert Note"
+msgstr "Nota &Txertatu"
+
+#: ../src/gui/general/EditView.cpp:1091
+msgid "&Upper Octave"
+msgstr "&Goiko Oktaba"
+
+#: ../src/gui/general/EditView.cpp:1096
+msgid "&Lower Octave"
+msgstr "&Beheko Oktaba"
+
+#: ../src/gui/general/EditView.cpp:1268
+msgid "Estimated time signature shown"
+msgstr "Konpasaren iraupen estimatua erakusten da"
+
+#: ../src/gui/general/EditView.cpp:1431
+#, fuzzy
+msgid "Halving durations..."
+msgstr "Noten iraupena ezartzen..."
+
+#: ../src/gui/general/EditView.cpp:1445
+#, fuzzy
+msgid "Doubling durations..."
+msgstr "Noten iraupena ezartzen..."
+
+#: ../src/gui/general/EditView.cpp:1469
+msgid "Rescaling..."
+msgstr "Birreskalatzen..."
+
+#: ../src/gui/general/EditView.cpp:1489
+#, fuzzy
+msgid "By number of semitones: "
+msgstr "Sartu transposatu beharreko tonuerdien kopurua:"
+
+#: ../src/gui/general/EditView.cpp:1496 ../src/gui/general/EditView.cpp:1518
+msgid "Transposing..."
+msgstr "Transposatzen..."
+
+#: ../src/gui/general/EditView.cpp:1536
+msgid "Transposing up one semitone..."
+msgstr "Transposatzen tonuerdi bat gora..."
+
+#: ../src/gui/general/EditView.cpp:1545
+msgid "Transposing up one octave..."
+msgstr "Transposatzen oktaba bat gora..."
+
+#: ../src/gui/general/EditView.cpp:1554
+msgid "Transposing down one semitone..."
+msgstr "Transposatzen tonuerdi bat behera..."
+
+#: ../src/gui/general/EditView.cpp:1563
+msgid "Transposing down one octave..."
+msgstr "Transposatzen oktaba bat behera..."
+
+#: ../src/gui/general/EditView.cpp:1575
+msgid "Inverting..."
+msgstr "Inbertitzen"
+
+#: ../src/gui/general/EditView.cpp:1587
+msgid "Retrograding..."
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:1599
+msgid "Retrograde inverting..."
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:1608
+msgid "Jogging left..."
+msgstr "Ezkerrera mugitzen..."
+
+#: ../src/gui/general/EditView.cpp:1623
+msgid "Jogging right..."
+msgstr "Eskuinera mugitzen..."
+
+#: ../src/sound/AudioFileManager.cpp:660
+#, c-format
+msgid "Downloading file %1"
+msgstr "%1 artxiboa jaisten"
+
+#: ../src/sound/AudioFileManager.cpp:735
+msgid "Converting audio file..."
+msgstr "Audio artxiboa bihurtzen..."
+
+#: ../src/sound/AudioFileManager.cpp:737
+msgid "Resampling audio file..."
+msgstr "Audio artxiboa birsanpleatzen..."
+
+#: ../src/sound/AudioFileManager.cpp:739
+msgid "Converting and resampling audio file..."
+msgstr "Audio artxiboa bihurten eta birsanpleatzen..."
+
+#: ../src/sound/AudioFileManager.cpp:741
+msgid "Importing audio file..."
+msgstr "Audio artxiboa inportatzen..."
+
+#: ../src/sound/AudioFileManager.cpp:794
+msgid "Failed to convert or resample audio file on import"
+msgstr ""
+" Audio artxiboa bihurtzeko edo birsanpleatzeko errorea inportatzerakoan"
+
+#: ../src/sequencer/main.cpp:46 ../src/sequencer/main.cpp:86
+#, fuzzy
+msgid "RosegardenSequencer"
+msgstr "Rosegarden"
+
+#: ../src/sequencer/main.cpp:54
+msgid "JACK playback and capture ports"
+msgstr "JACK erreprodukzio eta kaptura portuak"
+
+#: ../src/commands/segment/SegmentSyncCommand.cpp:38
+#: ../src/commands/segment/SegmentSyncCommand.cpp:44
+#: ../src/commands/segment/SegmentSyncCommand.cpp:55
+#: ../src/commands/segment/SegmentSyncCommand.cpp:63
+#, fuzzy
+msgid "Sync segment parameters"
+msgstr "Segmentuaren Parametroak"
+
+#: ../src/commands/segment/RenameTrackCommand.h:52
+msgid "Rename Track"
+msgstr "Pista berrizendatu"
+
+#: ../src/commands/segment/SegmentRepeatToCopyCommand.cpp:39
+msgid "Turn Repeats into Copies"
+msgstr "Errepikapenak kopia bihurtu"
+
+#: ../src/commands/segment/SegmentTransposeCommand.cpp:36
+#: ../src/commands/segment/SegmentTransposeCommand.cpp:42
+#, fuzzy
+msgid "Change segment transposition"
+msgstr "Aldatu Segmentuaren Kolorea"
+
+#: ../src/commands/edit/RescaleCommand.h:50
+#: ../src/commands/segment/AudioSegmentRescaleCommand.h:62
+#: ../src/commands/segment/SegmentRescaleCommand.h:58
+msgid "Stretch or S&quash..."
+msgstr "Tenkatu edo T&xikitu..."
+
+#: ../src/commands/segment/SegmentLabelCommand.h:52
+msgid "Re&label..."
+msgstr "Berr&etiketatu"
+
+#: ../src/commands/segment/AudioSegmentResizeFromStartCommand.cpp:39
+#: ../src/commands/segment/SegmentResizeFromStartCommand.cpp:39
+msgid "Resize Segment"
+msgstr "Segmentuaren tamaina aldatu"
+
+#: ../src/commands/segment/RemoveTempoChangeCommand.h:58
+msgid "Remove &Tempo Change..."
+msgstr "&Tenpo aldaketa ezabatu"
+
+#: ../src/commands/segment/SegmentEraseCommand.cpp:40
+#: ../src/commands/segment/SegmentEraseCommand.cpp:52
+msgid "Erase Segment"
+msgstr "Segmentua ezabatu"
+
+#: ../src/commands/segment/AudioSegmentRescaleCommand.cpp:126
+#: ../src/commands/segment/SegmentRescaleCommand.cpp:102
+#, fuzzy
+msgid "(rescaled)"
+msgstr "%1 (birreskalatuta)"
+
+#: ../src/commands/segment/AudioSegmentRescaleCommand.cpp:127
+#: ../src/commands/segment/SegmentRescaleCommand.cpp:105
+msgid "%1 (rescaled)"
+msgstr "%1 (birreskalatuta)"
+
+#: ../src/commands/segment/PasteToTriggerSegmentCommand.cpp:47
+msgid "Paste as New Triggered Segment"
+msgstr "Itsatsi segmentu aktibatu berri bat bezala"
+
+#: ../src/commands/segment/SegmentColourMapCommand.h:52
+msgid "Change Segment Color Map..."
+msgstr "Aldatu segmentuaren kolore-mapa..."
+
+#: ../src/commands/segment/SegmentQuickCopyCommand.h:55
+msgid "Quick-Copy Segment"
+msgstr "Segmentuaren kopia arina"
+
+#: ../src/commands/segment/AudioSegmentSplitCommand.cpp:42
+msgid "Split Audio Segment"
+msgstr "Audio segmentua zatitu"
+
+#: ../src/commands/segment/AudioSegmentSplitCommand.cpp:103
+#: ../src/commands/segment/SegmentSplitCommand.cpp:135
+msgid " (split)"
+msgstr " (zatituta)"
+
+#: ../src/commands/segment/AudioSegmentSplitCommand.cpp:104
+#: ../src/commands/segment/SegmentSplitByRecordingSrcCommand.cpp:120
+#: ../src/commands/segment/SegmentSplitByRecordingSrcCommand.cpp:122
+#: ../src/commands/segment/SegmentSplitCommand.cpp:136
+msgid "%1 (split)"
+msgstr "%1 (zatituta)"
+
+#: ../src/commands/segment/SegmentLabelCommand.cpp:40
+msgid "Label Segments"
+msgstr "Segmentuak etiketatu"
+
+#: ../src/commands/segment/OpenOrCloseRangeCommand.cpp:43
+msgid "Open or Close Range"
+msgstr "Ireki edo itxi tartea"
+
+#: ../src/commands/edit/TransposeCommand.h:55
+#: ../src/commands/segment/SegmentTransposeCommand.h:54
+#, fuzzy
+msgid "Transpose by &Interval..."
+msgstr "&Transposatu..."
+
+#: ../src/commands/segment/SegmentAutoSplitCommand.cpp:148
+msgid "%1 (part)"
+msgstr "%1 (zatia)"
+
+#: ../src/commands/segment/AudioSegmentInsertCommand.cpp:51
+#: ../src/commands/segment/SegmentInsertCommand.cpp:43
+#: ../src/commands/segment/SegmentInsertCommand.cpp:56
+msgid "Create Segment"
+msgstr "Sortu segmentua"
+
+#: ../src/commands/segment/AudioSegmentInsertCommand.cpp:114
+msgid "%1 (inserted)"
+msgstr "%1 (txertatua)"
+
+#: ../src/commands/segment/AudioSegmentInsertCommand.cpp:117
+msgid "unknown audio file"
+msgstr "audio artxibo ezezaguna"
+
+#: ../src/commands/segment/CreateTempoMapFromSegmentCommand.cpp:40
+msgid "Set Tempos from Beat Segment"
+msgstr "Ezarri tenpoak erritmo segmentu batetik"
+
+#: ../src/commands/segment/SegmentSplitByRecordingSrcCommand.h:52
+msgid "Split by &Recording Source..."
+msgstr "Zatitu &Grabaketa Iturriaren arabera"
+
+#: ../src/commands/segment/SegmentColourMapCommand.cpp:40
+msgid "Change Segment Color Map"
+msgstr "Aldatu segmentuaren kolore-mapa"
+
+#: ../src/commands/edit/CopyCommand.cpp:64
+#: ../src/commands/segment/SegmentQuickCopyCommand.cpp:57
+msgid "%1 (copied)"
+msgstr "%1 (kopiatua)"
+
+#: ../src/commands/segment/SegmentColourCommand.h:52
+msgid "Change Segment Color..."
+msgstr "Aldatu segmentuaren kolorea..."
+
+#: ../src/commands/segment/SegmentSplitByPitchCommand.cpp:170
+msgid "%1 (upper)"
+msgstr "%1 (goikoa)"
+
+#: ../src/commands/segment/SegmentSplitByPitchCommand.cpp:172
+msgid "%1 (lower)"
+msgstr "%1 (behekoa)"
+
+#: ../src/commands/segment/SegmentSingleRepeatToCopyCommand.cpp:39
+msgid "Turn Single Repeat into Copy"
+msgstr "Errepikapen Soila Kopia Bihurtu"
+
+#: ../src/commands/segment/AddTempoChangeCommand.h:58
+#, fuzzy
+msgid "Add Te&mpo Change..."
+msgstr "&Klabearen Aldaketa Gehitu..."
+
+#: ../src/commands/segment/AudioSegmentAutoSplitCommand.h:57
+#: ../src/commands/segment/SegmentAutoSplitCommand.h:53
+msgid "&Split on Silence"
+msgstr "Zatitu &Isiluneen Arabera"
+
+#: ../src/commands/segment/SetTriggerSegmentBaseVelocityCommand.cpp:39
+msgid "Set Base Velocity"
+msgstr "Ezarri Oinarrikzo Abiadura"
+
+#: ../src/commands/segment/DeleteRangeCommand.cpp:43
+#: ../src/commands/segment/EraseSegmentsStartingInRangeCommand.cpp:39
+msgid "Delete Range"
+msgstr "Ezabatu tartea"
+
+#: ../src/commands/segment/ChangeCompositionLengthCommand.h:53
+msgid "Change &Composition Start and End..."
+msgstr "&Aldatu Konposizioaren Hasiera eta Bukaera"
+
+#: ../src/commands/segment/MoveTracksCommand.h:51
+msgid "Move Tracks..."
+msgstr "Pistak Mugitu..."
+
+#: ../src/commands/segment/SegmentColourCommand.cpp:39
+msgid "Change Segment Color"
+msgstr "Aldatu Segmentuaren Kolorea"
+
+#: ../src/commands/segment/AudioSegmentDistributeCommand.h:66
+msgid "Distribute Audio Segments over MIDI"
+msgstr "Banatu Audio Segmentuak MIDI-aren gainean"
+
+#: ../src/commands/segment/AudioSegmentAutoSplitCommand.cpp:147
+msgid "%1 (autosplit %2)"
+msgstr "%1 (autozatiketa)"
+
+#: ../src/commands/segment/SetTriggerSegmentDefaultRetuneCommand.cpp:39
+msgid "Set Default Retune"
+msgstr "Ezarri transposizio lehenetsia"
+
+#: ../src/commands/segment/AddTimeSignatureCommand.h:52
+msgid "Add Time Si&gnature Change..."
+msgstr "Gehitu &Konpasaren Neurriaren Aldaketa"
+
+#: ../src/commands/segment/AddTriggerSegmentCommand.cpp:42
+msgid "Add Triggered Segment"
+msgstr "Sortu Aktibatutako Segmentua"
+
+#: ../src/commands/segment/SetTriggerSegmentDefaultTimeAdjustCommand.cpp:39
+msgid "Set Default Time Adjust"
+msgstr "Ezarri Lehenetsitako Denboraren Doiketa"
+
+#: ../src/commands/segment/RemoveTimeSignatureCommand.h:58
+msgid "Remove &Time Signature Change..."
+msgstr "&Ezabatu Konpas Neurriaren Aldaketa..."
+
+#: ../src/commands/segment/SegmentCommandRepeat.cpp:39
+msgid "Repeat Segments"
+msgstr "Errepikatu Segmentuak"
+
+#: ../src/commands/segment/AddTracksCommand.h:55
+msgid "Add Tracks..."
+msgstr "Pistak Gehitu..."
+
+#: ../src/commands/segment/ModifyDefaultTempoCommand.h:51
+msgid "Modify &Default Tempo..."
+msgstr "Aldatu &Lehenetsitako Tenpoa..."
+
+#: ../src/commands/segment/SegmentSplitByPitchCommand.h:61
+msgid "Split by &Pitch..."
+msgstr "Zatitu &Tonuaren Arabera"
+
+#: ../src/commands/segment/DeleteTriggerSegmentCommand.cpp:40
+msgid "Delete Triggered Segment"
+msgstr "Ezabatu Aktibatutako Segmentua"
+
+#: ../src/commands/segment/SegmentSplitCommand.cpp:42
+msgid "Split Segment"
+msgstr "Zatitu Segmentua"
+
+#: ../src/commands/segment/DeleteTracksCommand.h:51
+msgid "Delete Tracks..."
+msgstr "Pistak Ezabatu..."
+
+#: ../src/commands/segment/InsertRangeCommand.cpp:42
+msgid "Insert Range"
+msgstr "Tartea Txertatu"
+
+#: ../src/commands/segment/DeleteRangeCommand.h:62
+msgid "Rejoin Command"
+msgstr "Birbatu Komandoa"
+
+#: ../src/commands/segment/SetTriggerSegmentBasePitchCommand.cpp:39
+msgid "Set Base Pitch"
+msgstr "Oinarrizko Nota Ezarri"
+
+#: ../src/commands/segment/PasteConductorDataCommand.cpp:41
+msgid "Paste Tempos and Time Signatures"
+msgstr "Tenpoak eta Konpasak Itsatsi"
+
+#: ../src/commands/segment/SegmentSyncClefCommand.cpp:34
+#, fuzzy
+msgid "Sync segment clef"
+msgstr "Segmentuaren etiketa"
+
+#: ../src/commands/matrix/MatrixInsertionCommand.cpp:46
+#: ../src/commands/notation/NoteInsertionCommand.cpp:54
+msgid "Insert Note"
+msgstr "Nota Txertatu"
+
+#: ../src/commands/matrix/MatrixEraseCommand.cpp:41
+msgid "Erase Note"
+msgstr "Nota Ezabatu"
+
+#: ../src/commands/matrix/MatrixPercussionInsertionCommand.cpp:47
+msgid "Insert Percussion Note"
+msgstr "Perkusio Nota Txertatu"
+
+#: ../src/commands/matrix/MatrixModifyCommand.cpp:43
+msgid "Move Note"
+msgstr "Nota Mugitu"
+
+#: ../src/commands/matrix/MatrixModifyCommand.cpp:43
+msgid "Modify Note"
+msgstr "Nota Aldatu"
+
+#: ../src/commands/edit/PasteEventsCommand.cpp:98
+msgid "Paste into an existing gap [\"restricted\"]"
+msgstr "Itsatsi existitzen den erreten batean [\"mugatuta\"]"
+
+#: ../src/commands/edit/PasteEventsCommand.cpp:100
+msgid "Erase existing events to make room [\"simple\"]"
+msgstr "Ezabatu existitzen diren elementuak lekua egiteko [\"arrunta\"]"
+
+#: ../src/commands/edit/PasteEventsCommand.cpp:102
+msgid "Move existing events out of the way [\"open-n-paste\"]"
+msgstr "Mugitu existitzen diren elementuak lekutik [\"ireki-eta-itsatsi\"]"
+
+#: ../src/commands/edit/PasteEventsCommand.cpp:104
+msgid "Overlay notes, tying against present notes [\"note-overlay\"]"
+msgstr "Notak gainjarri, aurretik daudenekin lotuz [\"gainjartzea\"]"
+
+#: ../src/commands/edit/PasteEventsCommand.cpp:106
+msgid "Overlay notes, ignoring present notes [\"matrix-overlay\"]"
+msgstr ""
+"Notak gainjarri, aurretik daudenak kontuan ez hartuz [\"matriz-gainjartzea\"]"
+
+#: ../src/commands/edit/AddDotCommand.h:52
+msgid "&Add Dot"
+msgstr "Punttua &Gehitu"
+
+#: ../src/commands/edit/RemoveMarkerCommand.h:55
+msgid "&Remove Marker"
+msgstr "Markatzailea &Ezabatu"
+
+#: ../src/commands/edit/EventUnquantizeCommand.cpp:43
+#: ../src/commands/edit/EventUnquantizeCommand.cpp:54
+msgid "Unquantize Events"
+msgstr "Gertaerak deskuantifikatzea"
+
+#: ../src/commands/edit/ChangeVelocityCommand.h:53
+msgid "&Increase Velocity"
+msgstr "Abiadura &Gehitu"
+
+#: ../src/commands/edit/ChangeVelocityCommand.h:54
+msgid "&Reduce Velocity"
+msgstr "Abiadura G&utxitu"
+
+#: ../src/commands/edit/CopyCommand.cpp:46
+msgid "(excerpt)"
+msgstr "(laburpena)"
+
+#: ../src/commands/edit/CopyCommand.cpp:60
+msgid "(copied)"
+msgstr "(kopiatuta)"
+
+#: ../src/commands/edit/EventInsertionCommand.cpp:39
+msgid "Insert Event"
+msgstr "Txertatu gertaera"
+
+#: ../src/commands/edit/InsertTriggerNoteCommand.cpp:55
+msgid "Insert Trigger Note"
+msgstr "Nota Aktibatzailea Txertatu"
+
+#: ../src/commands/edit/CollapseNotesCommand.h:50
+msgid "Collapse &Equal-Pitch Notes"
+msgstr "Altuera &Bereko Notak Batu"
+
+#: ../src/commands/edit/TransposeCommand.h:61
+msgid "&Up a Semitone"
+msgstr "Tonuerdi bat &Igo"
+
+#: ../src/commands/edit/TransposeCommand.h:62
+msgid "&Down a Semitone"
+msgstr "Tonuerdi bat &Jaitsi"
+
+#: ../src/commands/edit/TransposeCommand.h:63
+msgid "Up an &Octave"
+msgstr "&Oktaba bat Igo"
+
+#: ../src/commands/edit/TransposeCommand.h:64
+msgid "Down an Octa&ve"
+msgstr "Ok&taba bat Jaitsi"
+
+#: ../src/commands/edit/TransposeCommand.h:65
+#, fuzzy
+msgid "&Transpose by Semitones..."
+msgstr "Transposatzen tonuerdi bat gora..."
+
+#: ../src/commands/edit/SetNoteTypeCommand.h:56
+msgid "&Set Note Type"
+msgstr "Nota Mota &Ezarri"
+
+#: ../src/commands/edit/EventEditCommand.h:55
+msgid "Edit E&vent"
+msgstr "&Gertaera Editatu"
+
+#: ../src/commands/edit/AddMarkerCommand.h:54
+msgid "&Add Marker"
+msgstr "Markatzailea &Gehitu"
+
+#: ../src/commands/edit/SelectionPropertyCommand.h:66
+msgid "Set &Property"
+msgstr "&Propietateak Ezarri"
+
+#: ../src/commands/edit/CutCommand.h:55
+msgid "Cu&t"
+msgstr "Ebak&i"
+
+#: ../src/commands/edit/EventQuantizeCommand.cpp:114
+msgid "Heuristic Notation &Quantize"
+msgstr "Notazioaren &Kuantizatze Heuristikoa"
+
+#: ../src/commands/edit/EventQuantizeCommand.cpp:116
+msgid "Grid &Quantize"
+msgstr "Kuantifikazio-&sarea"
+
+#: ../src/commands/edit/ClearTriggersCommand.h:52
+msgid "&Clear Triggers"
+msgstr "&Aktibatzaileak Garbitu"
+
+#: ../src/commands/edit/RetrogradeCommand.h:51
+#, fuzzy
+msgid "&Retrograde"
+msgstr "A&tzerakaria"
+
+#: ../src/commands/edit/InvertCommand.h:51
+#, fuzzy
+msgid "&Invert"
+msgstr "Inb&ertitu"
+
+#: ../src/commands/edit/SetTriggerCommand.h:64
+msgid "Tri&gger Segment"
+msgstr "&Segmentua Aktibatu"
+
+#: ../src/commands/edit/SetLyricsCommand.h:50
+msgid "Edit L&yrics"
+msgstr "&Letra Editatu"
+
+#: ../src/commands/edit/MoveAcrossSegmentsCommand.cpp:73
+msgid "&Move Events to Other Segment"
+msgstr "Gertaerak &Mugitu Beste Segmentu Batera"
+
+#: ../src/commands/edit/RetrogradeInvertCommand.h:51
+msgid "Re&trograde Invert"
+msgstr "Atze&rako Inbertsioa"
+
+#: ../src/commands/edit/ModifyMarkerCommand.h:55
+msgid "&Modify Marker"
+msgstr "Markatzailea Al&datu"
+
+#: ../src/commands/studio/AddControlParameterCommand.h:61
+msgid "&Add Control Parameter"
+msgstr "Kontrol Parametroa Ge&hitu"
+
+#: ../src/commands/studio/ModifyInstrumentMappingCommand.h:55
+msgid "Modify &Instrument Mapping"
+msgstr "I&nstrumentoaren Mapping-a Aldatu "
+
+#: ../src/commands/studio/RemoveControlParameterCommand.h:60
+msgid "&Remove Control Parameter"
+msgstr "Kontrol Parametroa &Ezabatu"
+
+#: ../src/commands/studio/ReconnectDeviceCommand.h:55
+msgid "Reconnect Device"
+msgstr "Dispositiboa Birkonektatu"
+
+#: ../src/commands/studio/ModifyDeviceCommand.h:68
+msgid "Modify &MIDI Bank"
+msgstr "&MIDI Bankua Aldatu"
+
+#: ../src/commands/studio/CreateOrDeleteDeviceCommand.h:68
+msgid "Create Device"
+msgstr "Dispositiboa Sortu"
+
+#: ../src/commands/studio/ModifyDeviceMappingCommand.h:55
+msgid "Modify &Device Mapping"
+msgstr "&Dispositiboaren Mapping-a Aldatu"
+
+#: ../src/commands/studio/RenameDeviceCommand.h:55
+msgid "Rename Device"
+msgstr "Dispositiboa Berrizendatu"
+
+#: ../src/commands/studio/ModifyControlParameterCommand.h:61
+msgid "&Modify Control Parameter"
+msgstr "Kontrol Parametroa &Aldatu"
+
+#: ../src/commands/notation/TieNotesCommand.h:49
+msgid "&Tie"
+msgstr "&Ligatura"
+
+#: ../src/commands/notation/ClefInsertionCommand.cpp:74
+msgid "Add Cle&f Change..."
+msgstr "&Klabearen Aldaketa Gehitu..."
+
+#: ../src/commands/notation/GuitarChordInsertionCommand.cpp:40
+#, fuzzy
+msgid "Insert Guitar Chord"
+msgstr "Giderra Txertatu"
+
+#: ../src/commands/notation/RespellCommand.cpp:47
+#, c-format
+msgid "Respell with %1"
+msgstr "%1 -kin aldaketak indarrez egin"
+
+#: ../src/commands/notation/RespellCommand.cpp:50
+msgid "Do&uble Sharp"
+msgstr "Sostenitu B&ikoitza"
+
+#: ../src/commands/notation/RespellCommand.cpp:52
+msgid "&Sharp"
+msgstr "&Sostenitua"
+
+#: ../src/commands/notation/RespellCommand.cpp:54
+msgid "&Flat"
+msgstr "&Bemol"
+
+#: ../src/commands/notation/RespellCommand.cpp:56
+msgid "Dou&ble Flat"
+msgstr "Bemol &Bikoitza"
+
+#: ../src/commands/notation/RespellCommand.cpp:58
+msgid "&Natural"
+msgstr "B&ekoadroa"
+
+#: ../src/commands/notation/RespellCommand.cpp:60
+msgid "N&one"
+msgstr "Bat ere &ez"
+
+#: ../src/commands/notation/RespellCommand.cpp:66
+msgid "Respell Accidentals &Upward"
+msgstr "Derrigortu &Goranzko Asaldurak"
+
+#: ../src/commands/notation/RespellCommand.cpp:69
+msgid "Respell Accidentals &Downward"
+msgstr "Derrigortu &Beheranzko Asaldurak"
+
+#: ../src/commands/notation/RespellCommand.cpp:72
+#, fuzzy
+msgid "&Restore Accidentals"
+msgstr "Derrigortu Asaldurak"
+
+#: ../src/commands/notation/RespellCommand.cpp:75
+msgid "Respell Accidentals"
+msgstr "Derrigortu Asaldurak"
+
+#: ../src/commands/notation/DeCounterpointCommand.h:55
+msgid "Split-and-Tie Overlapping &Chords"
+msgstr "Zatitu-eta-Ligatu A&korde Gainjarriak"
+
+#: ../src/commands/notation/BeamCommand.h:49
+msgid "&Beam Group"
+msgstr "&Plikak Batu"
+
+#: ../src/commands/notation/AddTextMarkCommand.h:51
+msgid "Add Te&xt Mark..."
+msgstr "&Testu Markatzailea Gehitu..."
+
+#: ../src/commands/notation/RestoreSlursCommand.h:49
+#, fuzzy
+msgid "&Restore Slur Positions"
+msgstr "Berjarri Kalkulatutako Ligaturen Kokapenak"
+
+#: ../src/commands/notation/SustainInsertionCommand.h:56
+msgid "Add Pedal &Press"
+msgstr "Gehitu Pedalaren &Zapaltzea"
+
+#: ../src/commands/notation/SustainInsertionCommand.h:58
+msgid "Add Pedal &Release"
+msgstr "Gehitu Pedalaren &Askapena"
+
+#: ../src/commands/notation/FixNotationQuantizeCommand.h:49
+msgid "Fi&x Notation Quantization"
+msgstr "Partituraren Kuantifikazioa Ze&haztu"
+
+#: ../src/commands/notation/ChangeStemsCommand.h:51
+msgid "Stems &Up"
+msgstr "Plikak &Gorantz"
+
+#: ../src/commands/notation/ChangeStemsCommand.h:51
+msgid "Stems &Down"
+msgstr "Plikak &Beherantz"
+
+#: ../src/commands/notation/MakeAccidentalsCautionaryCommand.cpp:43
+msgid "Use &Cautionary Accidentals"
+msgstr "Erabili &Zuhurtziazko Asaldurak"
+
+#: ../src/commands/notation/MakeAccidentalsCautionaryCommand.cpp:45
+msgid "Cancel C&autionary Accidentals"
+msgstr "Ezeztatu Z&uhurtziazko Asaldurak"
+
+#: ../src/commands/notation/SetVisibilityCommand.h:50
+msgid "Set Visibility"
+msgstr "Ikuspena Ezarri"
+
+#: ../src/commands/notation/ChangeStyleCommand.h:53
+msgid "Change &Note Style"
+msgstr "Aldatu &Notaren Estiloa"
+
+#: ../src/commands/notation/TextInsertionCommand.cpp:41
+msgid "Insert Text"
+msgstr "Testua Txertatu"
+
+#: ../src/commands/notation/InterpretCommand.h:70
+msgid "&Interpret..."
+msgstr "&Interpretatu..."
+
+#: ../src/commands/notation/TupletCommand.h:53
+msgid "&Triplet"
+msgstr "&Hirukotxoa"
+
+#: ../src/commands/notation/TupletCommand.h:54
+msgid "Tu&plet..."
+msgstr "&Multzo irregularra..."
+
+#: ../src/commands/notation/UnTupletCommand.h:50
+msgid "&Untuplet"
+msgstr "M&ultzo Irregularrak Zatitu..."
+
+#: ../src/commands/notation/CollapseRestsCommand.h:54
+msgid "&Collapse Rests"
+msgstr "&Isiluneak Batu"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:145
+msgid "Add S&lur"
+msgstr "&Ligatura Gehitu"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:147
+msgid "Add &Phrasing Slur"
+msgstr "&Esaldikapen-Ligatura Gehitu..."
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:149
+msgid "Add Double-Octave Up"
+msgstr "Goiko Oktaba-Bikoitza Gehitu"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:151
+msgid "Add Octave &Up"
+msgstr "Goiko O&ktaba Gehitu"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:153
+msgid "Add Octave &Down"
+msgstr "&Beheko Oktaba Gehitu"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:155
+msgid "Add Double Octave Down"
+msgstr "Beheko Oktaba-Bikoitza Gehitu"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:160
+msgid "Add &Crescendo"
+msgstr "&Crescendoa Gehitu..."
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:162
+msgid "Add &Decrescendo"
+msgstr "&Decrescendoa Gehitu..."
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:164
+msgid "Add &Glissando"
+msgstr "Gli&ssandoa Gehitu..."
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:167
+msgid "Add &%1%2"
+msgstr "&%1%2 gehitu"
+
+#: ../src/commands/notation/RemoveNotationQuantizeCommand.h:49
+msgid "Remo&ve Notation Quantization"
+msgstr "&Partituraren Kuantifikazioa Kendu"
+
+#: ../src/commands/notation/MakeChordCommand.h:50
+msgid "Make &Chord"
+msgstr "Akordea &Sortu"
+
+#: ../src/commands/notation/MultiKeyInsertionCommand.h:63
+msgid "Change all to &Key %1..."
+msgstr "Dena %1 &Tonura Aldatu ..."
+
+#: ../src/commands/notation/KeyInsertionCommand.h:67
+#: ../src/commands/notation/MultiKeyInsertionCommand.h:65
+msgid "Add &Key Change..."
+msgstr "T&ono Aldaketa Gehitu..."
+
+#: ../src/commands/notation/RestoreStemsCommand.h:49
+#, fuzzy
+msgid "&Restore Stems"
+msgstr "P&liken Kalkulatutako Norabidea Berjarri"
+
+#: ../src/commands/notation/MakeNotesViableCommand.h:55
+#: ../src/commands/notation/MakeRegionViableCommand.h:52
+msgid "Tie Notes at &Barlines"
+msgstr "Konpasaren Ba&rretan Notak Ligatu"
+
+#: ../src/commands/notation/AddSlashesCommand.h:46
+msgid "Slashes"
+msgstr "Kortxeteak"
+
+#: ../src/commands/notation/ChangeSlurPositionCommand.h:51
+msgid "Slur &Above"
+msgstr "Ligatura &Goian"
+
+#: ../src/commands/notation/ChangeSlurPositionCommand.h:51
+msgid "Slur &Below"
+msgstr "Ligatura Be&hean"
+
+#: ../src/commands/notation/NormalizeRestsCommand.h:54
+msgid "&Normalize Rests"
+msgstr "Isiluneak &Normalizatu"
+
+#: ../src/commands/notation/TextChangeCommand.cpp:41
+msgid "Edit Text"
+msgstr "Testua Editatu"
+
+#: ../src/commands/notation/RemoveMarksCommand.h:49
+msgid "&Remove All Marks"
+msgstr "&Markatzaile Guztiak Ezabatu"
+
+#: ../src/commands/notation/AutoBeamCommand.h:52
+msgid "&Auto-Beam"
+msgstr "Metatu Plikak A&utomatikoki"
+
+#: ../src/commands/notation/UntieNotesCommand.h:49
+msgid "&Untie"
+msgstr "Notak &Desligatu"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:48
+msgid "S&forzando"
+msgstr "S&forzando"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:50
+msgid "Sta&ccato"
+msgstr "Sta&ccato"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:52
+msgid "R&inforzando"
+msgstr "R&inforzando"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:54
+msgid "T&enuto"
+msgstr "T&enuto"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:56
+msgid "Tri&ll"
+msgstr "Tri&no"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:58
+msgid "Trill &with Line"
+msgstr "Trino &Lerroarekin"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:60
+msgid "Trill Line"
+msgstr "Trino Lerro"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:62
+msgid "&Turn"
+msgstr "Grupe&to"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:64
+msgid "&Accent"
+msgstr "&Azentua"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:66
+msgid "&Staccatissimo"
+msgstr "&Staccatissimo"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:68
+msgid "&Marcato"
+msgstr "&Marcato"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:70
+msgid "&Pause"
+msgstr "&Kalderoia"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:72
+msgid "&Up-Bow"
+msgstr "P&unta"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:74
+msgid "&Down-Bow"
+msgstr "&Orpoa"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:76
+msgid "Mo&rdent"
+msgstr "Mo&rdente"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:78
+msgid "Inverted Mordent"
+msgstr "Inbertutako Mordentea"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:80
+msgid "Long Mordent"
+msgstr "Mordente Luzea"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:82
+msgid "Lon&g Inverted Mordent"
+msgstr "Mordente &Luze Inbertitua"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:84
+msgid "&%1%2"
+msgstr "&%1%2"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:89
+#, c-format
+msgid "Add %1"
+msgstr "%1 Gehitu"
+
+#: ../src/commands/notation/ResetDisplacementsCommand.h:49
+#, fuzzy
+msgid "Restore Positions"
+msgstr "Berjarri Kalkulatutako Kokapenak"
+
+#: ../src/commands/notation/IncrementDisplacementsCommand.h:52
+msgid "Fine Reposition"
+msgstr "Birkokatze Fina"
+
+#: ../src/commands/notation/RestoreTiesCommand.h:49
+#, fuzzy
+msgid "&Restore Tie Positions"
+msgstr "Berjarri Kalkulatutako Kokapenak"
+
+#: ../src/commands/notation/ChangeTiePositionCommand.h:47
+#, fuzzy
+msgid "Tie &Above"
+msgstr "Ligatura &Goian"
+
+#: ../src/commands/notation/ChangeTiePositionCommand.h:47
+#, fuzzy
+msgid "Tie &Below"
+msgstr "Ligatura Be&hean"
+
+#: ../src/commands/notation/KeyInsertionCommand.h:65
+msgid "Change to &Key %1..."
+msgstr "%1 &Tonura Aldatu ..."
+
+#: ../src/commands/notation/RemoveFingeringMarksCommand.h:49
+msgid "&Remove Fingerings"
+msgstr "&Hatz-Jokoak Kendu"
+
+#: ../src/commands/notation/BreakCommand.h:49
+msgid "&Unbeam"
+msgstr "&Plikak Banandu"
+
+#: ../src/commands/notation/UnGraceCommand.h:48
+msgid "Ung&race"
+msgstr "Apai&ndura Notak Kendu"
+
+#: ../src/commands/notation/AddFingeringMarkCommand.cpp:45
+msgid "Add Other &Fingering..."
+msgstr "Beste &Hatz-Joko bat Gehitu..."
+
+#: ../src/commands/notation/AddFingeringMarkCommand.cpp:47
+msgid "Add Fingering &0 (Thumb)"
+msgstr "&0 Hatz-Jokoa Gehitu (Erpurua)..."
+
+#: ../src/commands/notation/AddFingeringMarkCommand.cpp:49
+#, c-format
+msgid "Add Fingering &%1"
+msgstr "&%1 Hatz-Jokoa Gehitu"
+
+#: ../src/document/io/HydrogenXMLHandler.cpp:277
+msgid " imported from Hydrogen "
+msgstr "hydrogenetik inportatua"
+
+#: ../src/document/io/LilyPondExporter.cpp:404
+#, fuzzy
+msgid ""
+"LilyPond does not allow spaces or backslashes in filenames.\n"
+"\n"
+"Would you like to use\n"
+"\n"
+" %1\n"
+"\n"
+" instead?"
+msgstr ""
+"LilyPondek ez ditu onoartzen hutsuneak edo backslashak artxiboen.\n"
+"izenetan\n"
+"%1\n"
+"erabili nahi duzu\n"
+"\n"
+"\n"
+"bere ordezr? "
+
+#: ../src/document/io/LilyPondExporter.cpp:2054
+msgid "warning: overlong bar truncated here"
+msgstr "oharra: konpas luzeegia, hemen moztua"
+
+#: ../src/document/io/LilyPondExporter.cpp:2060
+msgid "warning: bar too short, padding with rests"
+msgstr "oharra: konpas laburregia, isiluneekin betea"
+
+#: ../src/document/MultiViewCommandHistory.cpp:318
+msgid "Nothing to undo"
+msgstr "Ez dago ezer desegiteko"
+
+#: ../src/document/MultiViewCommandHistory.cpp:320
+msgid "Nothing to redo"
+msgstr "Ez dago ezer berregiteko"
+
+#: ../src/document/MultiViewCommandHistory.cpp:328
+#: ../src/document/MultiViewCommandHistory.cpp:372
+#, c-format
+msgid "Und&o %1"
+msgstr "%1 &Desegin"
+
+#: ../src/document/MultiViewCommandHistory.cpp:330
+#: ../src/document/MultiViewCommandHistory.cpp:374
+#, c-format
+msgid "Re&do %1"
+msgstr "%1 &Berregin"
+
+#: ../src/document/RosegardenGUIDoc.cpp:328
+msgid ""
+"The current file has been modified.\n"
+"Do you want to save it?"
+msgstr ""
+"Oraingo artxiboa aldatua izan da.\n"
+"Gorde nahi duzu?"
+
+#: ../src/document/RosegardenGUIDoc.cpp:480
+#, c-format
+msgid ""
+"_n: Delete the 1 audio file recorded during the unsaved session?\n"
+"Delete the %n audio files recorded during the unsaved session?"
+msgstr ""
+"_n: Ezabatu gorde ez den saioan zehar grabatutako audio artxiboa?\n"
+"Ezabatu gorde ez den saioan zehar grabatutako %n audio artxiboak?"
+
+#: ../src/document/RosegardenGUIDoc.cpp:501
+msgid ""
+"The following audio files were recorded during this session but have been "
+"unloaded\n"
+"from the audio file manager, and so are no longer in use in the document you "
+"are saving.\n"
+"\n"
+"You may want to clean up these files to save disk space.\n"
+"\n"
+"Please select any you wish to delete permanently from the hard disk.\n"
+msgstr ""
+"Ondoko audio artxiboak grabatu dira saio honetan zehar, baina audio\n"
+"artxiboen kudeatzailetik deskargatuak izan dira eta ez dira erabiltzen "
+"gordetzen ari zaren dokumentuan.\n"
+" \n"
+"Agian artxibo hauek garbitu nahiko dituzu, diskoan lekua aurrezteko.\n"
+"\n"
+"Mesedez, erabaki ea betiko ezabatu nahi dituzun disko gogorretik.\n"
+
+#: ../src/document/RosegardenGUIDoc.cpp:517
+#, fuzzy, c-format
+msgid ""
+"_n: <qt>About to delete 1 audio file permanently from the hard disk."
+"<br>There will be no way to recover this file.<br>Are you sure?</qt>\n"
+"\n"
+"<qt>About to delete %n audio files permanently from the hard disk.<br>There "
+"will be no way to recover these files.<br>Are you sure?</qt>"
+msgstr ""
+"_n: Audio artxibo bat betiko ezabatuko da disko gogorretik.\n"
+"Ez da egongo artxibo hau berreskuratzeko modurik.\n"
+"Ziur zaude?\n"
+"%n audio artxibo ezabatuko dira disko gogorretik.\n"
+"Ez da egongo artxibo hauek berreskuratzeko modurk.\n"
+"Ziur zaude?"
+
+#: ../src/document/RosegardenGUIDoc.cpp:580
+msgid "Can't open file '%1'"
+msgstr "Ezin da '%1' artxiboa ireki"
+
+#: ../src/document/RosegardenGUIDoc.cpp:585
+msgid "Reading file..."
+msgstr "Artxiboa irakurtzen..."
+
+#: ../src/document/RosegardenGUIDoc.cpp:603
+msgid "Could not open Rosegarden file"
+msgstr "Ezin izan da Rosegarden artxiboa ireki"
+
+#: ../src/document/RosegardenGUIDoc.cpp:641
+msgid "Error when parsing file '%1': \"%2\""
+msgstr " '%1' artxiboa interpretatzerakoan errorea: \"%2\" "
+
+#: ../src/document/RosegardenGUIDoc.cpp:689
+msgid "Generating audio previews..."
+msgstr "Audio aurrebistak sortzen..."
+
+#: ../src/document/RosegardenGUIDoc.cpp:721
+msgid "Merge"
+msgstr "Nahasi"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1605
+msgid "File load cancelled"
+msgstr "Artxiboaren karga ezezatatua"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1625
+msgid ""
+"<h3>Audio and plugins not available</h3><p>This composition uses audio files "
+"or plugins, but Rosegarden is currently running without audio because the "
+"JACK audio server was not available on startup.</p><p>Please exit "
+"Rosegarden, start the JACK audio server and re-start Rosegarden if you wish "
+"to load this complete composition.</p><p><b>WARNING:</b> If you re-save this "
+"composition, all audio and plugin data and settings in it will be lost.</p>"
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:1628
+msgid ""
+"<h3>Audio and plugins not available</h3><p>This composition uses audio files "
+"or plugins, but you are running a version of Rosegarden that was compiled "
+"without audio support.</p><p><b>WARNING:</b> If you re-save this composition "
+"from this version of Rosegarden, all audio and plugin data and settings in "
+"it will be lost.</p>"
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:1665
+msgid ""
+"<h3>Incorrect audio sample rate</h3><p>This composition contains audio files "
+"that were recorded or imported with the audio server running at a different "
+"sample rate (%1 Hz) from the current JACK server sample rate (%2 Hz).</"
+"p><p>Rosegarden will play this composition at the correct speed, but any "
+"audio files in it will probably sound awful.</p><p>Please consider re-"
+"starting the JACK server at the correct rate (%3 Hz) and re-loading this "
+"composition before you do any more work with it.</p>"
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:1675
+msgid ""
+"<h3>Inconsistent audio sample rates</h3><p>This composition contains audio "
+"files at more than one sample rate.</p><p>Rosegarden will play them at the "
+"correct speed, but any audio files that were recorded or imported at rates "
+"different from the current JACK server sample rate (%1 Hz) will probably "
+"sound awful.</p><p>Please see the audio file manager dialog for more "
+"details, and consider resampling any files that are at the wrong rate.</p>"
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:1676
+msgid "Inconsistent sample rates"
+msgstr "Laginketa maiztasun ez-iraunkorrak"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1690
+msgid ""
+"<h3>Plugins not found</h3><p>The following audio plugins could not be loaded:"
+"</p><ul>"
+msgstr ""
+"<h3>Puglin ez aurkituak</h3><p>Ondoko audio pluginak ezin izan dira kargatu:"
+"</p><ul>"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1698
+msgid "<li>%1 (from %2)</li>"
+msgstr "<li> %1 %2 -tik)</li>"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1712
+msgid ""
+"This file contains one or more old element types that are now deprecated.\n"
+"Support for these elements may disappear in future versions of Rosegarden.\n"
+"We recommend you re-save this file from this version of Rosegarden to ensure "
+"that it can still be re-loaded in future versions."
+msgstr ""
+"Artxibo honek zaharkituta dagoen elementu mota bat edo gehiago dauka.\n"
+"Elementu honentzako euskarria desagertu daiteke Rosegardenen etorkizuneko "
+"bertsioetan.\n"
+"Gomendatzen dugu Rosegarden bertsio honen artxibo hau birgrabatzea, "
+"etorkizuneko bertsioetan kargatu ahal izango dela ziurtatzeko."
+
+#: ../src/document/RosegardenGUIDoc.cpp:2207
+msgid "Insert Recorded MIDI"
+msgstr "Grabatutako MIDIa txertatu"
+
+#: ../src/document/RosegardenGUIDoc.cpp:2560
+msgid "%1 (recorded)"
+msgstr "%1 (grabatua)"
+
+#: ../src/document/RoseXmlHandler.cpp:442
+msgid ""
+"This file was written by Rosegarden %1, and it uses\n"
+"a different file format that cannot be read by this version."
+msgstr ""
+"Artxibo hau Rosegarden %1 -k idatzi du eta bertsio honek irakurri\n"
+"ezin dezakeen artxibo formato bat erabiltzen du."
+
+#: ../src/document/RoseXmlHandler.cpp:452
+msgid ""
+"This file was written by Rosegarden %1, which is more recent than this "
+"version.\n"
+"There may be some incompatibilities with the file format."
+msgstr ""
+"Artxibo hau Rosegarden %1 -ek idatzi du. Bertsio hori hau baino berriagoa "
+"da.\n"
+"Bateragarritasun arazoak izan daitezke artxibo formatoarekin."
+
+#: ../src/document/RoseXmlHandler.cpp:1687
+msgid "Loading plugins..."
+msgstr "Pluginak kargatzen... "
+
+#: rc.cpp:6 rc.cpp:144
+#, no-c-format
+msgid "Se&gment"
+msgstr "Seg&mentua"
+
+#: rc.cpp:9 rc.cpp:84 rc.cpp:147 rc.cpp:303
+#, no-c-format
+msgid "Edit &With"
+msgstr "(Ondokoarekin) &Editatu"
+
+#: rc.cpp:12 rc.cpp:21 rc.cpp:30 rc.cpp:39 rc.cpp:345
+#, no-c-format
+msgid "Actions Toolbar"
+msgstr "Eragiketen Tresna-Barra"
+
+#: rc.cpp:15 rc.cpp:33 rc.cpp:129 rc.cpp:285
+#, no-c-format
+msgid "Time Toolbar"
+msgstr "Denboraren Tresna-Barra"
+
+#: rc.cpp:18 rc.cpp:36 rc.cpp:57 rc.cpp:63 rc.cpp:120 rc.cpp:243 rc.cpp:342
+#, no-c-format
+msgid "Transport Toolbar"
+msgstr "Transporterako Tresna-Barra"
+
+#: rc.cpp:24 rc.cpp:42 rc.cpp:123 rc.cpp:348
+#, no-c-format
+msgid "Zoom Toolbar"
+msgstr "Zoomerako Tresna-Barra"
+
+#: rc.cpp:45 rc.cpp:60 rc.cpp:99 rc.cpp:228 rc.cpp:327
+#, no-c-format
+msgid "T&ransport"
+msgstr "T&ransportea"
+
+#: rc.cpp:51
+#, no-c-format
+msgid "Number of Stereo &Inputs"
+msgstr "Estereo sarreren kopurua"
+
+#: rc.cpp:54
+#, no-c-format
+msgid "&Number of Submasters"
+msgstr "Submasterren &Kopurua"
+
+#: rc.cpp:66
+#, no-c-format
+msgid "&Import"
+msgstr "&Inportatu"
+
+#: rc.cpp:69
+#, no-c-format
+msgid "&Merge"
+msgstr "&Nahasi"
+
+#: rc.cpp:72
+#, no-c-format
+msgid "&Export"
+msgstr "E&sportatu"
+
+#: rc.cpp:75 rc.cpp:141 rc.cpp:297
+#, no-c-format
+msgid "&Composition"
+msgstr "&Konposizioa"
+
+#: rc.cpp:78
+#, no-c-format
+msgid "&Studio"
+msgstr "&Estudioa"
+
+#: rc.cpp:81
+#, no-c-format
+msgid "Se&gments"
+msgstr "&Segmentuak"
+
+#: rc.cpp:90
+#, no-c-format
+msgid "Trac&ks"
+msgstr "&Pistak"
+
+#: rc.cpp:93
+#, no-c-format
+msgid "Set &Instrument"
+msgstr "&Instrumentua Ezarri"
+
+#: rc.cpp:102 rc.cpp:234 rc.cpp:333
+#, no-c-format
+msgid "&Toolbars"
+msgstr "&Tresna-Barrak"
+
+#: rc.cpp:105 rc.cpp:237 rc.cpp:336
+#, no-c-format
+msgid "&Rulers"
+msgstr "&Erregelak"
+
+#: rc.cpp:111 rc.cpp:240 rc.cpp:339
+#, no-c-format
+msgid "Tools Toolbar"
+msgstr "Lanabesen Tresna-Barra"
+
+#: rc.cpp:114
+#, no-c-format
+msgid "Tracks Toolbar"
+msgstr "Pisten Tresna-Barra"
+
+#: rc.cpp:117
+#, no-c-format
+msgid "Editors Toolbar"
+msgstr "Ediziorako Tresna-Barra"
+
+#: rc.cpp:135
+#, no-c-format
+msgid "&Layout Mode"
+msgstr "&Formatoaren Modua"
+
+#: rc.cpp:138 rc.cpp:294
+#, no-c-format
+msgid "Add Event Ruler"
+msgstr "Gertaeren Erregela Gehitu"
+
+#: rc.cpp:150
+#, fuzzy, no-c-format
+msgid "N&ote"
+msgstr "N&otak"
+
+#: rc.cpp:153
+#, no-c-format
+msgid "Mar&ks"
+msgstr "&Markatzaileak"
+
+#: rc.cpp:156
+#, no-c-format
+msgid "&Ornaments"
+msgstr "&Apaindurak"
+
+#: rc.cpp:159
+#, no-c-format
+msgid "&Fingerings"
+msgstr "Ha&tz Jokoak"
+
+#: rc.cpp:162
+#, no-c-format
+msgid "S&lashes"
+msgstr "K&ortxeteak"
+
+#: rc.cpp:165 rc.cpp:219
+#, no-c-format
+msgid "&Accidentals"
+msgstr "&Alterazioak"
+
+#: rc.cpp:168
+#, fuzzy, no-c-format
+msgid "&Phrase"
+msgstr "E&zabatu"
+
+#: rc.cpp:171
+#, no-c-format
+msgid "Slur &Position"
+msgstr "Ligaturaren &Kokapena"
+
+#: rc.cpp:174
+#, fuzzy, no-c-format
+msgid "Tie &Position"
+msgstr "Ligaturaren &Kokapena"
+
+#: rc.cpp:177
+#, no-c-format
+msgid "&Octaves"
+msgstr "&Oktabak"
+
+#: rc.cpp:180 rc.cpp:306
+#, no-c-format
+msgid "Ad&just"
+msgstr "&Doitu"
+
+#: rc.cpp:183
+#, no-c-format
+msgid "R&ests"
+msgstr "Isilun&eak"
+
+#: rc.cpp:186 rc.cpp:213
+#, no-c-format
+msgid "&Notes"
+msgstr "&Notak"
+
+#: rc.cpp:189 rc.cpp:309
+#, no-c-format
+msgid "&Quantize"
+msgstr "&Kuantizatu"
+
+#: rc.cpp:195 rc.cpp:315
+#, no-c-format
+msgid "Trans&pose"
+msgstr "Trans&posatu"
+
+#: rc.cpp:198 rc.cpp:318
+#, no-c-format
+msgid "Convert"
+msgstr ""
+
+#: rc.cpp:201
+#, no-c-format
+msgid "&Fine Positioning"
+msgstr "Kokapen Fi&na"
+
+#: rc.cpp:204
+#, no-c-format
+msgid "Fine Ti&ming"
+msgstr "&Temporizazio fina"
+
+#: rc.cpp:207
+#, no-c-format
+msgid "&Visibility"
+msgstr "&Ikusgarritasuna"
+
+#: rc.cpp:216
+#, no-c-format
+msgid "&Rests"
+msgstr "&Isiluneak"
+
+#: rc.cpp:222
+#, no-c-format
+msgid "&Clefs"
+msgstr "&Klabeak"
+
+#: rc.cpp:225 rc.cpp:324
+#, no-c-format
+msgid "Local &Cursor"
+msgstr "&Kurtsore Lokala"
+
+#: rc.cpp:246
+#, no-c-format
+msgid "Notes Toolbar"
+msgstr "Noten Tresna-Barra"
+
+#: rc.cpp:249
+#, no-c-format
+msgid "Rests Toolbar"
+msgstr "Isiluneen Tresna-Barra"
+
+#: rc.cpp:252
+#, no-c-format
+msgid "Clefs Toolbar"
+msgstr "Klabeen Tresna-Barra"
+
+#: rc.cpp:255
+#, no-c-format
+msgid "Accidentals Toolbar"
+msgstr "Alterazioen Tresna-Barra"
+
+#: rc.cpp:258
+#, no-c-format
+msgid "Group Toolbar"
+msgstr "Multzoaren Tresna-Barra"
+
+#: rc.cpp:261
+#, no-c-format
+msgid "Marks Toolbar"
+msgstr "Markatzaileen Tresna-Barra"
+
+#: rc.cpp:264
+#, no-c-format
+msgid "Meta Toolbar"
+msgstr "Lanabesen Meta-Barra"
+
+#: rc.cpp:267
+#, no-c-format
+msgid "Layout Toolbar"
+msgstr "Formatoaren Tresna-Barra"
+
+#: rc.cpp:270 rc.cpp:351
+#, no-c-format
+msgid "Control Ruler actions"
+msgstr "Kontroladorearen Erregelaren eragiketak"
+
+#: rc.cpp:273 rc.cpp:354
+#, no-c-format
+msgid "Property Ruler actions"
+msgstr "Propietate Erregelaren Eragiketak"
+
+#: rc.cpp:276
+#, no-c-format
+msgid "&Action"
+msgstr "&Eragiketa"
+
+#: rc.cpp:279
+#, no-c-format
+msgid "General Toolbar"
+msgstr "Trena-Barra Orokorra"
+
+#: rc.cpp:291
+#, no-c-format
+msgid "&Grid"
+msgstr "Sa&reta"
+
+#: rc.cpp:300
+#, no-c-format
+msgid "&Segment"
+msgstr "&Segmentua"
+
+#: rc.cpp:361
+#, no-c-format
+msgid "Hide additional controls"
+msgstr "Kontrol gehigarriak ezkutatu"
+
+#: rc.cpp:365
+#, no-c-format
+msgid "Panic Button"
+msgstr "Izuaren Botoia"
+
+#: rc.cpp:368
+#, no-c-format
+msgid "Resets all MIDI devices if you've got stuck notes"
+msgstr ""
+"MIDI dispositibo guztiak berrasten ditu, nota blokeatuak baldin badauzkazu"
+
+#: rc.cpp:375
+#, no-c-format
+msgid "Provides a metronome click for you to play along with"
+msgstr "Metronomo seinale bat ematen du, berarekin batera jotzeko"
+
+#: rc.cpp:378
+#, no-c-format
+msgid "Shows MIDI activity in and out of Rosegarden"
+msgstr "Rosegardenen kanpoko eta barruko MIDI aktibitatea erakusten du"
+
+#: rc.cpp:381
+#, no-c-format
+msgid "IN"
+msgstr "IN"
+
+#: rc.cpp:384
+#, no-c-format
+msgid "OUT"
+msgstr "OUT"
+
+#: rc.cpp:387 rc.cpp:390
+#, no-c-format
+msgid "NO EVENTS"
+msgstr "GERTAERARIK GABE"
+
+#: rc.cpp:397
+#, no-c-format
+msgid "Record either MIDI or audio"
+msgstr "Bai MIDI eta baita audioa ere grabatu"
+
+#: rc.cpp:401
+#, no-c-format
+msgid "Loop"
+msgstr "Errepikatu"
+
+#: rc.cpp:404
+#, no-c-format
+msgid "Turn on and off the loop markers (if set)"
+msgstr ""
+"Errepikapen markatzaileak aktibatu eta desaktibatu egiten ditu (baldin "
+"badaude)"
+
+#: rc.cpp:411
+#, no-c-format
+msgid "Mutes all but the currently selected track"
+msgstr "Hautatutakoa izan ezik, gainerako pistak mututzen ditu"
+
+#: rc.cpp:415
+#, no-c-format
+msgid "Start loop or range here"
+msgstr "Buklea edo esparrua hemen hasi"
+
+#: rc.cpp:419
+#, no-c-format
+msgid "End loop or range here"
+msgstr "Buklea edo esparrua hemen bukatu"
+
+#: rc.cpp:422
+#, no-c-format
+msgid "SIG"
+msgstr "SIG"
+
+#: rc.cpp:425
+#, no-c-format
+msgid "DIV"
+msgstr "DIV"
+
+#: rc.cpp:428
+#, no-c-format
+msgid "/16"
+msgstr "/16"
+
+#: rc.cpp:431
+#, no-c-format
+msgid "TEMPO"
+msgstr "TENPOA"
+
+#: rc.cpp:434
+#, no-c-format
+msgid "END"
+msgstr "BUKAERA"
+
+#: rc.cpp:437
+#, no-c-format
+msgid "BAR"
+msgstr "KONPASA"
+
+#: rc.cpp:441
+#, no-c-format
+msgid "Switch between real time, musical time, and frame count"
+msgstr ""
+"Denbora errealaren, denbora musikalaren eta koadroen kontaketaren artean "
+"aldatu."
+
+#: rc.cpp:445
+#, no-c-format
+msgid "Show additional controls"
+msgstr "Kontrol gehigarriak erakutsi."
+
+#: rc.cpp:449
+#, no-c-format
+msgid "Rewind"
+msgstr "Birbobinatu"
+
+#: rc.cpp:452
+#, no-c-format
+msgid "Moves the current pointer position back one bar."
+msgstr "Punteroaren oraingo posizioa konpas bat atzera mugitzen du"
+
+#: rc.cpp:456
+#, no-c-format
+msgid "Rewind to beginning"
+msgstr "Hasierara birbobinatu"
+
+#: rc.cpp:459
+#, no-c-format
+msgid ""
+"Moves the pointer position to the start of the composition. (This may mean "
+"going forwards if the pointer is currently before the start.)"
+msgstr ""
+"Kurtsorearen posizioa konposizoaren hasieraramugitzen du. (Hau izan daiteke "
+"aurrera joatea punteroa hasiera baino lehenago baldin badago)"
+
+#: rc.cpp:463
+#, no-c-format
+msgid "Play/Pause"
+msgstr "Jo/Pausa"
+
+#: rc.cpp:466
+#, no-c-format
+msgid ""
+"Plays from the current pointer position, or pauses playback if already in "
+"progress."
+msgstr ""
+"Punteroaren oraingo posiziotik jotzen du, edo jotzen badabil erreprodukzioa "
+"gelditzen du."
+
+#: rc.cpp:473
+#, no-c-format
+msgid "Stops playback or recording."
+msgstr "Grabaketa edo erreprodukzioa gelditu."
+
+#: rc.cpp:477
+#, no-c-format
+msgid "Fast forward"
+msgstr "Aurreratze arina"
+
+#: rc.cpp:480
+#, no-c-format
+msgid "Moves the current pointer position forwards one bar."
+msgstr "Kurtsorearen oraingo posizioa konpas bat aurrera mugitzen du."
+
+#: rc.cpp:484
+#, no-c-format
+msgid "Fast forward to end"
+msgstr "Aurreratze arina bukaerarantz"
+
+#: rc.cpp:487
+#, no-c-format
+msgid ""
+"Moves the pointer position to the end of the composition. (This may mean "
+"going backwards if the pointer is already beyond the end.)"
+msgstr ""
+"Kurtsorearen posizioa konposizoaren bukaerara mugitzen du. (Hau izan daiteke "
+"birbobinatzea punteroa bukaeraz haraindi baldin badago)"
+
+#: rc.cpp:491
+#, no-c-format
+msgid "Display time to end"
+msgstr "Falta den denbora erakusten du"
+
+#: ../docs/en/tips.cpp:3
+msgid ""
+"<p>To configure a track to play using a particular instrument:</p>\n"
+"&nbsp;&nbsp;* click on the track label and hold a moment<br>\n"
+"&nbsp;&nbsp;* select an output device<br>\n"
+"&nbsp;&nbsp;* select one of that device's available instruments (#1 - #16)"
+"<br>\n"
+"&nbsp;&nbsp;* adjust that instrument's output channel, program, bank, and\n"
+"controllers via the instrument parameters box\n"
+msgstr ""
+"<p>Pista bat konfiguratzeko instrumentu jakin batekin jo dezan:</p>\n"
+"&nbsp;&nbsp;* klik egin pistaren etiketan eta eutsi botoiari momentu "
+"bat<br>\n"
+"&nbsp;&nbsp;* irteera dispositibo bat aukeratu<br>\n"
+"&nbsp;&nbsp;* dispositiboan eskuragarri dauden dispositiboetako bat aukeratu "
+"(#1 - #16)<br>\n"
+"&nbsp;&nbsp;* doitu instrumentuaren irteera kanala, programa, bankua, eta\n"
+"kontroladoreak instrumentuaren parametro kutxako parametroak erabiliz\n"
+
+#: ../docs/en/tips.cpp:13
+msgid ""
+"<p>...that Rosegarden has an autosave feature?<br><br>\n"
+"You can select your autosave interval from <b>Settings->Configure\n"
+"Rosegarden</b>.<br><br>\n"
+"When something goes awry, such as a power outage or a Rosegarden crash\n"
+"(unfortunately, it happens...) simply load the file you were working on, and "
+"you'll be given the\n"
+"option to load the autosaved version, or the unmodified original.</p>\n"
+msgstr ""
+"<p>...Rosegardenek auto-gordetzeko aukera daukala?<br><br> \n"
+"Denbora-tartea aukeratzeko: <b>Hobespenak->Rosegarden \n"
+" Konfiguratu</b><br><br>\n"
+"Zerbait gaizki doanean, hala nola korronte mozketa bat edo Rosegardenen "
+"errore\n"
+"larri bat izaten denean (zoritxarrez gertatzen da) besterik gabe kargatu "
+"artxiboa eta auto-gordetako bertsioa edo aldatu gabeko jatorrizkoa "
+"kargatzeko aukera emango zaizu.</p>\n"
+
+#: ../docs/en/tips.cpp:23
+msgid ""
+"<p>\n"
+"...that you can save the current document as your default studio by using\n"
+"<b>Composition -> Studio -> Save Current Document as Default Studio</b>?</"
+"p>\n"
+msgstr ""
+"<p> \n"
+"Oraingo dokumentua estudio lehenetsi bat bezala gorde dezakezu\n"
+"<b>Konposizioa -> Estudioa -> Oraingo Dokumentua EstudioBezala Gorde</b> "
+"aukera erabiliz </p>\n"
+
+#: ../docs/en/tips.cpp:30
+msgid ""
+"<p>...that your default studio is a complete Rosegarden composition that "
+"gets\n"
+"loaded every time you create a new document or import a MIDI file?</p>\n"
+msgstr ""
+"<p>...zure estudio lehenetsia Rosegardenen konposizio oso bat dela,\n"
+"dokumentu berri bat sortu edo MIDI artxibo bat inportatzen duzun bakoitzean "
+"kargatzen dena?</p>\n"
+
+#: ../docs/en/tips.cpp:36
+#, fuzzy
+msgid ""
+"<p>...that your default studio can contain instrument assignments, document "
+"properties, LilyPond headers,\n"
+"and many other things?<br><br>The default studio is a complete Rosegarden "
+"composition, so it can contain anything that you may wish to have available "
+"in each\n"
+"new document you create.</p>\n"
+msgstr ""
+"<p>Como su estudio predeterminado es una composición completa de "
+"Rosegarden, puede\n"
+"contener asignaciones de instrumentos predeterminadas, propiedades del "
+"documento, cabeceras de LilyPond, \n"
+"y muchas otras cosas que usted puede desear tener disponibles por omisión "
+"en cada\n"
+"nuevo documento creado.</p>\n"
+
+#: ../docs/en/tips.cpp:43
+#, fuzzy
+msgid ""
+"<p>...that Rosegarden will detect and create a default connection for ALSA "
+"soft\n"
+"synth applications that are started after Rosegarden is already running?</"
+"p>\n"
+msgstr ""
+"<p>...que Rosegarden detectará y creará una conexión para los "
+"sintetizadores software de ALSA que se inicien después de que Rosegarden ya "
+"esté en ejecución?</p>\n"
+
+#: ../docs/en/tips.cpp:49
+#, fuzzy
+msgid ""
+"<p>...that you can make your default studio override that in every "
+"Rosegarden composition you load?<br><br>If your studio setup does not change "
+"very often, and you would prefer for\n"
+"the settings in your default studio to take precedence over whatever\n"
+"studio is saved with any files you happen to load, you can make your studio "
+"the default for everything using <b>Settings -> Configure Rosegarden ->\n"
+"MIDI -> Always use default studio when loading files</b>.</p>\n"
+msgstr ""
+"<p>Si la configuración de tu estudio no cambia muy a menudo, y tú preferirí"
+"as que\n"
+"las configuraciones en tu <b>autoload.rg</b> tengan prioridad sobre "
+"cualquier\n"
+"estudio que grabes con cualquier archivo que estés cargando, puedes hacer "
+"de tuautoload\n"
+"el estudio predeterminado para todo, usando <b>Preferencias -> Configurar "
+"Rosegarden ->\n"
+"Comportamiento -> Usar siempre estudio por omisión al cargar archivos</b>.</"
+"p>\n"
+
+#: ../docs/en/tips.cpp:57
+msgid ""
+"<p>If you have accidentally recorded a segment so short that it does not\n"
+"appear on the canvas, which you can only hear during subsequent recording\n"
+"sessions, you can gain access to it by using <b>Composition -> Change\n"
+"Composition Start and End</b> and then setting the composition to start at a "
+"negative number.</p>\n"
+msgstr ""
+"<p>Istripuz mihisean ez agertzeko bezain txikia den segmentu bat\n"
+"grabatu baduzu, bakarrik geroko grabaketetan entzun dezakezuna, berori "
+"hautatzeko ondokoa egin behar da: <b>Konposizioa-> Aldatu Konposizioaren "
+"Hasiera eta Bukaera</b> eta gero konposizioaren konfigurazioa aldatu, "
+"zenbaki negatibo batean hasi dadin.</p>\n"
+
+#: ../docs/en/tips.cpp:65
+#, fuzzy
+msgid ""
+"<p>...that if you place a note at the wrong pitch using the notation or "
+"matrix editor, you can move it one semitone at a time with the up and down "
+"arrow keys on your keyboard?</p>\n"
+msgstr ""
+"<p>...que si coloca una nota a una altura incorrecta usando el editor de "
+"partituras, puede moverla un semitono cada vez con las teclas de flecha "
+"arriba y abajo del teclado?</p>\n"
+
+#: ../docs/en/tips.cpp:70
+msgid ""
+"<p>...that you can toggle stem directions in the notation editor by "
+"selecting\n"
+"one or more notes and using Ctrl-PageUp and Ctrl-PageDown?</p>\n"
+msgstr ""
+"<p>...plikaen norabidea alda dezakezula notazio editorean nota bat edo "
+"gehiago\n"
+"hautatuz eta Ctrl-Pgup eta Ctrl-PgDown erabiliz?</p>\n"
+
+#: ../docs/en/tips.cpp:76
+msgid ""
+"<p>...that you can change the accidental used for a note in the notation "
+"editor (without changing the pitch of the note) by selecting\n"
+"it and using the up and down arrow keys with both Ctrl and Shift pressed?</"
+"p>\n"
+msgstr ""
+"<p>...nota batentzat erabiltzen den alterazioa notazio editorean alda "
+"dezakezula (notaren altuera aldatu gabe) aipatutako nota\n"
+"hautatuz eta gorako eta beherako kutsoreak erabiliz, Ctrl eta Shift batera "
+"sakatuta dauzkazula?</p>\n"
+
+#: ../docs/en/tips.cpp:82 ../docs/en/tips.cpp:93
+msgid ""
+"<p>...that you can hold down the Shift key while repositioning segments on "
+"the\n"
+"segment canvas in order to avoid the \"snap-to\" effect and exert finer "
+"control?</p>\n"
+msgstr ""
+"<p>...shift tekla sakatuta eduki dezakezula mihisean segmentuak birkokatzen\n"
+"ari zarela \"auto-kokatze\" efektua ekiditeko eta kontrol finago bat "
+"lortzeko</p>\n"
+
+#: ../docs/en/tips.cpp:88
+msgid ""
+"<p>...that you can use the arrow tool to draw, move, and resize segments and "
+"events as well as to select them?<br><br>Drag a segment or event block to "
+"move it, drag the right edge of a block to resize it, and drag with the "
+"middle mouse button pressed to draw a new segment or event.<br><br>(Of "
+"course, the dedicated draw, move and resize tools are still quicker for "
+"repeated operations.)</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:99
+msgid ""
+"<p>...that you can hold down the Shift key while repositioning or resizing "
+"events in the\n"
+"matrix view in order to avoid the \"snap-to\" effect and exert finer control?"
+"</p>\n"
+msgstr ""
+"<p>...shift tekla sakatuta eduki dezakezula gertaerak birkokatzen edo berain "
+"tamaina aldatzen\n"
+" ari zarela \"auto-kokatze\" efektua ekiditeko eta kontrol finago bat "
+"lortzeko</p>\n"
+
+#: ../docs/en/tips.cpp:105
+msgid ""
+"<p>...that you can edit multiple segments on multiple tracks simultaneously "
+"in\n"
+"the notation editor? Simply select the segments, then use <b>Edit -> Open "
+"in Notation Editor</b>.</p>\n"
+msgstr ""
+"<p>...notazio editorean segmentu asko pista desberdin askotan une berean\n"
+"edita ditzakezula? Besterik gabe, hautatu segmentuak eta erabili<b>Editatu-"
+">Partituren editorean ireki</b></p>\n"
+
+#: ../docs/en/tips.cpp:111
+msgid ""
+"<p>...that Rosegarden can export files for use by LilyPond, the high-quality "
+"score typesetting system?<br><br>\n"
+"From the <b>File</b> menu, navigate to <b>Export -> Export LilyPond File</"
+"b></p>\n"
+msgstr ""
+"<p>...Rosegardenek LilyPondekin (partiturak editatzeko kalitate handiko "
+"sistema) erabili daitezkeen artxiboak esporta ditzakeela. Horretarako: \n"
+"<b>Artxiboa</b>-> <b>LilyPond Artxiboa Esportatu</b></p>\n"
+
+#: ../docs/en/tips.cpp:117
+#, fuzzy
+msgid ""
+"<p>...that Rosegarden can print via LilyPond, the high-quality score "
+"typesetting system?<br><br>\n"
+"From the <b>File</b> menu, navigate to <b>Preview with LilyPond</b>. The "
+"file\n"
+"will be exported, rendered, and a preview will appear in KPDF, or one of\n"
+"several other PDF viewers, where it can then be printed as well.</p>\n"
+msgstr ""
+"<p>...Rosegardenek LilyPondekin (partiturak editatzeko kalitate handiko "
+"sistema) erabili daitezkeen artxiboak inprima ditzakeela. Horretarako: \n"
+"<b>Artxiboa</b>-> <b>Aurrebista LilyPondekin</b></p>\n"
+"Artxiboa\n"
+"esportatuko da eta errenderizatuko da, eta aurrebista KGhostView-en edo "
+"beste\n"
+"PDF ikusteko programa askotan agertuko da. Bertatik ere inprima daiteke.</"
+"p>\n"
+
+#: ../docs/en/tips.cpp:125
+msgid ""
+"<p>...that if you use the quantizer from within the notation view, you can "
+"tell it to quantize only the timing used for notation -- making it possible "
+"to have good looking notation <b>and</b> a human MIDI performance?</p>\n"
+msgstr ""
+"<p>...notazio bistatik kuantifikatzailea erabiltzen baduzu, esan "
+"diezaiokezula notaziorako erabiltzen den tenporizazioa kuantifikatzeko "
+"bakarrik -- horrela ahalbidetzen da notazio dotore bat <b>eta era berean</b> "
+"MIDI intepretazio gizatiar bat edukitzea?</p>\n"
+
+#: ../docs/en/tips.cpp:130
+msgid ""
+"<p>...that you can change segment labels using the controls on the Segment "
+"Parameters box\n"
+"in the main window?</p>\n"
+msgstr ""
+"<p>...segmentuen etiketak Segmentuen Parametroen kutxan (leiho nagusian) "
+"dauden kontrolak erabiliz alda ditzakezula?</p>\n"
+
+#: ../docs/en/tips.cpp:136
+msgid ""
+"<p>...that the number of tracks in new documents is based on the contents "
+"of\n"
+"your autoload.rg file?\n"
+"<br><br>\n"
+"Whether you prefer to start with three tracks or 43, create a document that\n"
+"contains the desired number of tracks, plus any other studio or document "
+"properties settings\n"
+"you wish to configure, and use <b>Composition -> Studio -> Save Current "
+"Document as Default\n"
+"Studio</b> to make this your new default.</p>\n"
+msgstr ""
+"<p>...Dokumentu berrien pista kopurua zure autoload.rg artxiboaren "
+"edukietan\n"
+"oinarrituta dagoela?\n"
+"<br><br>\n"
+"Sortu zuk nahi duzun pisten kopurua daukan dokumentu bat, beste estudio edo "
+"dokumentu\n"
+"propietateekin batera eta erabili <b>Konposizioa -> Estudioa -> Oraingo "
+"Dokumentua Estudio\n"
+"Lehenetsi gisa Gorde</b> konfigurazio hau automatikoki aktiba dadin.</p>\n"
+
+#: ../docs/en/tips.cpp:147
+msgid ""
+"<p>...that you can change the name of a track by double clicking on the "
+"label? (The\n"
+"label must be visible for this to work.)</p>\n"
+msgstr ""
+"<p>...pista baten izena alda dezakezula etiketaren gainean klik bikoitza "
+"eginez? (La\n"
+"Egiketa ikusgarri egon behar da honek funtziona dezan.)</p>\n"
+
+#: ../docs/en/tips.cpp:153
+#, fuzzy
+msgid ""
+"<p>...that you can configure what happens when you double-click on a segment?"
+"<br><br>Go to <b>Settings -> Configure Rosegarden</b> and choose your "
+"preferred editing window under the <b>Behaviour</b> tab.</p>\n"
+msgstr ""
+"<p>...que puede configurar lo que ocurre cuando hace doble clic en un "
+"segmento? Seleccione <b>Preferencias -> Configurar Rosegarden</b> y elija "
+"la opción que prefiera bajo la pestaña <b>Comportamiento</b>.</p>\n"
+
+#: ../docs/en/tips.cpp:158
+msgid ""
+"<p>...that Rosegarden is being developed as a community effort with\n"
+"contributions from around the world?<br><br>\n"
+"The four most active developers live in London (England), Cannes, "
+"Barcelona,\n"
+"and... Christiansburg? (Christiansburg is a town of about 50,000 in\n"
+"southwestern Virginia, USA.)<br><br>\n"
+"We have had contributors from elsewhere in the US, UK, Spain, Mexico, "
+"Argentina, Germany,\n"
+"Sweden, Russia, Japan, Finland, and Italy, just to name a few...</p>\n"
+msgstr ""
+"<p>...Rosegardenen garapena komunitatea ahalegin bat dela\n"
+"mundu osoko ekarpenekin<br><br>\n"
+"Lau garatzaile nagusiak Londresen, Cannesen, Bartzelonan\n"
+"eta... Christianburgen bizi ( dira</p>\n"
+"Beste leku askotako laguntzaileak eduki ditugu: EEBB-n, UK-n, Espainian, "
+"Mexikon, Argentinan, Alemanian,\n"
+"Suezian, Errusian, Japonen, Finlandian, eta Italian, bakarrik batzuk "
+"aipatzeko.</p>\n"
+
+#: ../docs/en/tips.cpp:169
+msgid ""
+"<p>...that Rosegarden is available in Spanish, French, German, Russian, "
+"Welsh, Swedish, Italian and Estonian\n"
+"translations? (Just to name a few.)<br><br>\n"
+"If you're interested in translating Rosegarden to another language, drop us "
+"a\n"
+"line at <b>[email protected]</b>.</p>\n"
+msgstr ""
+"<p>...ondoko itzulpenak eskuragarri dauzkala: frantsea, alemana,errusiera, "
+"galesa, suediera, italiera eta estoniera?<br><br>\n"
+"Beste hizkuntza batera itzuli nahi baduzu, bidali iezaguzu mezu bat:\n"
+"<b>[email protected]</b>.</p>\n"
+
+#: ../docs/en/tips.cpp:177
+msgid ""
+"<p>...that you can change the total number of bars in the composition via\n"
+"<b>Composition -> Change Composition Start and End</b>?</p>\n"
+msgstr ""
+"<p>...konposizioaren konpas kopurua aldadatu daitekeela ondokoa erabiliz:\n"
+"<b>Editatu->Aldatu konposizioaren hasiera eta bukaera</b>?</p>\n"
+
+#: ../docs/en/tips.cpp:183
+msgid ""
+"<p>...that you can see the difference between performance and display "
+"duration\n"
+"of duration-quantized notes in the notation editor?<br><br>\n"
+"Use <b>Settings -> Show Raw Note Ruler</b> to turn on this handy\n"
+"feature.<br><br>\n"
+"<i>Note that this feature does not work in page layout view.</i></p>\n"
+msgstr ""
+"<p>...notazioaren editorean ikus dezakezula iraupen-kuantizazioa daukaten "
+"noten\n"
+" interpretazioaren eta iraupenaren arteko aldea?<br><br>\n"
+"Erabili <b>Hobespenak ->Nota Gordinaren Erregela Erakutsi</b> ezaugarri "
+"praktiko hau aktibatzeko.<br><br>\n"
+"<i>Kontuan hartu honek ez duela funtzionatzen orri-formatoaren bistan.</i></"
+"p>\n"
+
+#: ../docs/en/tips.cpp:192
+msgid ""
+"<p>...that you can add tempo and time-signature changes by double-clicking "
+"on the values displayed in the transport window or tempo rulers?</p>\n"
+msgstr ""
+"<p>...tenpo aldaketak eta konpas-neurriaren aldaketak gehitu ditzakezula "
+"transporte leihoan agertzen diren balioetan edo tenpo erregeletan klik-"
+"bikoitza eginez?</p>\n"
+
+#: ../docs/en/tips.cpp:197
+#, fuzzy
+msgid ""
+"<p>...that the transport window can display musical time, sample frame "
+"count, and a visual metronome as well as real time?<br><br>Just click on the "
+"small button at the extreme top left of the window.</p>\n"
+msgstr ""
+"<p>...que la ventana de transporte puede mostrar tiempo musical, contador de "
+"cuadros y un metrónomo visual? Pulse el pequeño botón de la esquina "
+"superior izquierda de la ventana.</p>\n"
+
+#: ../docs/en/tips.cpp:202
+#, fuzzy
+msgid ""
+"<p>...that you can select all notes of a particular pitch in the matrix "
+"view, by shift-clicking on that pitch on the piano keyboard at the left?"
+"<br><br>If you shift-click-drag, you can select whole ranges too.</p>\n"
+msgstr ""
+"<p>...que puede seleccionar todas las notas de una determinada altura en la "
+"vista de matriz, pulsando mayúsculas y haciendo clic en la nota del teclado "
+"de piano de la izquierda? También puede arrastrar el ratón para "
+"seleccionar rangos completos.</p>\n"
+
+#: ../docs/en/tips.cpp:207
+#, fuzzy
+msgid ""
+"<p>...that you can set a loop in the main window by clicking-and-dragging on "
+"the time ruler with Shift pressed?<br><br>(If the ruler isn't visible, use "
+"<b>Settings -> Show Rulers</b>.)</p>\n"
+msgstr ""
+"<p>...que puede establecer una repetición en la ventana principal, pulsando "
+"y arrastrando en la regla de tiempo con la tecla de mayúsculas pulsada? "
+"(si la regla no está visible, utilice <b>Preferencias -> Mostrar reglas</"
+"b>.)</p>\n"
+
+#: ../docs/en/tips.cpp:212
+#, fuzzy
+msgid ""
+"<p>...that if you're editing a section in the matrix or notation view, you "
+"can\n"
+"set that section to loop while you edit it?<br><br>Select it and use "
+"<b>Tools ->\n"
+"Local Cursor -> Set Loop to Selection</b>, then hit Play.</p><br><br>\n"
+"<i>This feature does not work quite as well for compositions that include "
+"sampled\n"
+"audio.</i>\n"
+msgstr ""
+"<p>...que si usted está editando una sección en las vistas de matriz o "
+"partitura, puede establecer dicha sección como repetición mientras la "
+"está editando? Seleccione y utilice <b>Mover -> Establecer repetición en "
+"la Selección</b>, luego pulse Reproducir.</p>\n"
+
+#: ../docs/en/tips.cpp:221
+msgid ""
+"<p>...if you have more than one note or controller event at the same time, "
+"you\n"
+"can use the [ and ] keys to flip the stack of events around on the "
+"controller\n"
+"and velocity rulers in order to bring the item you wish to adjust into\n"
+"focus.</p>\n"
+msgstr ""
+"<p>...kontroladore edo nota gertaera bat baino gehiago baldin badaukazu une "
+"berean\n"
+"[and] teklak erabili ditzekezu ebentoen multzoa kontroladoreareneta\n"
+"abiaduraren gurpilen inguruan nahi duzun elementua doitu ahal \n"
+"izateko.</p>\n"
+
+#: ../docs/en/tips.cpp:229
+#, fuzzy
+msgid ""
+"<p>...that the notation view shows you notes using their display duration, "
+"while the\n"
+"matrix allows you to edit their performance duration?<br><br>\n"
+"<i>Be careful with tied notes in the matrix. It is not apparent that they "
+"are\n"
+"tied, and if you split up a pair of tied notes, subsequent notation views "
+"will\n"
+"be confused and unhappy. This is an old bug that has been on our TODO list\n"
+"for years. Sorry about that, folks. Patches welcome.</i>\n"
+"</p>\n"
+msgstr ""
+"<p>La vista de notación te muestra las notas con su duración visual, y la "
+"vista de la matriz te permite editar sus duraciones audibles.</p>\n"
+
+#: ../docs/en/tips.cpp:240
+#, fuzzy
+msgid ""
+"<p>If you're working with a human performance and you need to insert some "
+"new\n"
+"notes, these new notes will sound for their entire written duration. To "
+"blend\n"
+"these new notes into a human performance, select them, then use <b>Adjust -> "
+"Interpret...</b> \n"
+"from the notation view to interpret any marks and massage their "
+"performance\n"
+"durations to something less mechanical.</p>\n"
+msgstr ""
+"<p>Interpretazio gizatiar batekin lanean baldin bazabiltza eta nota\n"
+"berri batzuk txertatu behar baldin badituzu, nota hauek entzungo dira "
+"beraien irapen osoan\n"
+"Nota berri hauek interpretazio gizatiarrarekin nahasteko, erabili <b>Doitu -"
+"> Notak ->Interpretea</b>markak interpretatzeko eta noten iraupenak horren\n"
+" mekanikoa ez den zerbaitekin egokitzeko.</p>\n"
+
+#: ../docs/en/tips.cpp:249
+#, fuzzy
+msgid ""
+"<p>...that Rosegarden can export certain things to LilyPond that it cannot "
+"yet\n"
+"display within its own native interface?<br><br>These new directives can be "
+"inserted\n"
+"via the <b>T</b> text insert tool in the notation view.<br><br>\n"
+"Load the example files\n"
+"<b>lilypond-alternative-endings.rg</b> and <b>lilypond-directives.rg</b> for "
+"a\n"
+"demonstration of how to use the new exportable directives.<br><br>\n"
+"Use <b>File -> Preview with\n"
+"LilyPond</b> to see what they look like on the exported page.<br><br>\n"
+"<i>Be sure to turn on\n"
+"<b>Settings -> Show LilyPond Directives</b> and <b>Show Annotations</b> "
+"within\n"
+"the notation view.</i></p>\n"
+msgstr ""
+"<p>Ahora Rosegarden puede exportar algunas cosas a LilyPond que no puede "
+"mostrar con su interfáz propio. Estos directivos nuevos pueden insertarse "
+"desde la vista de notación con el herramiento Texto. Cargue los archivos "
+"lilypond-alternative-endings.rg y lilypond-directives.rg para ver ejemplos.</"
+"p><p>Asegúrese de que sean visibles los directivos para LilyPond con "
+"Preferencias ->Mostrar Directivos para LilyPond</p>\n"
+
+#: ../docs/en/tips.cpp:264
+#, fuzzy
+msgid ""
+"<p>...that Rosegarden has track parameters allowing you to <b>Create "
+"segments with:</b> certain\n"
+"properties by default?<br><br>You can pre-select the clef, transposition, "
+"colour, and specify\n"
+"the highest and lowest playable notes (notes outside this range display in\n"
+"red by default). Then draw a segment with the pencil, or record one, and "
+"any\n"
+"new segments created on this track will take these properties as segment\n"
+"parameters.<br><br>\n"
+"<i>These parameters do not apply to audio tracks.</i></p>\n"
+msgstr ""
+"<p>Ahora existen nuevos parámetros de pista que se puede utilizar para "
+"crear segmentos nuevos con ciertos propiedades. Usted puede seleccionar el "
+"clave, la transposición, el color, y especificar las notas más altas y "
+"más bajas que pueden ser tocados en un instrumento de un cierto tipo (notas "
+"afuera de este ámbito de muestran en rojo). Trás puede dibujar o grabar "
+"un segmento, y todos los segmentos que cree en este pista se dibujarán con "
+"estas propiedades. (Estos parámetros no tienen nada que ver con segmentos "
+"audio.)</p>\n"
+
+#: ../docs/en/tips.cpp:275
+#, fuzzy
+msgid ""
+"<p>...that Rosegarden has a database of preset parameters describing more "
+"than 300\n"
+"musical instruments from the real world, grouped into several convenient\n"
+"categories?<br><br>Each preset contains a clef, transposition, and playable "
+"range\n"
+"suggestions for both amateur and professional players.<br><br>Click the\n"
+"<b>Load</b> button in the new track parameters box to get started! <i>(If "
+"you\n"
+"do not see a <b>Load</b> button, be sure your parameter panel is set for\n"
+"tabbed mode, rather than stacked mode.)</i> <br><br> <i>(Special thanks to "
+"Magnus\n"
+"Johansson for assembling this extraordinary database.)</i></p>\n"
+msgstr ""
+"<p>Rosegardenek badaukala preset parametroen datubase bat, 300 instrumentu\n"
+"baino gehiago deskribatuz, hainbat kategoriatan sailkatuta? transposición, "
+"y un ámbito de notas tocables por un músico amateur y un profesional.</p>\n"
+
+#: ../docs/en/tips.cpp:287
+msgid ""
+"<p>...that when exporting to Lilypond, you can merge tracks that have the "
+"same name onto a single staff?<br><br>For example, if there are three voices "
+"in a single part, write each\n"
+"voice as an independent segment/staff, each on a separate track. Give all\n"
+"three tracks the same name, and select <b>[x] Merge tracks that have the "
+"same\n"
+"name</b> from the options dialog that appears when you export to, or "
+"preview\n"
+"with LilyPond.<br><br>\n"
+"<i>The tracks must have a non-default name for this to work.</i></p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:297
+msgid ""
+" \t \n"
+"<p>...that you can use the mouse wheel to scroll up and down, scroll left "
+"and right, and zoom in and out?<br><br>Just roll the wheel to scroll up or "
+"down. Hold Alt as well to scroll left or right, or hold Ctrl to zoom in and "
+"out.</p> \t \n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:303
+msgid ""
+" \t \n"
+"<p>...that you can time-stretch an audio segment -- stretching or squashing "
+"a\n"
+"sample to a different duration without changing its pitch -- just by\n"
+"dragging its right edge with the Ctrl key pressed?</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:311
+msgid ""
+" \t \n"
+"<p>...that you can add audio to your Rosegarden composition just by dragging "
+"an audio file from your file manager and dropping it on the Rosegarden "
+"segment canvas? (Make sure you drop it on an audio track!)<br><br>You can "
+"also drop audio files from Rosegarden's audio file manager window onto the "
+"segment canvas, and from other programs onto the audio file manager.</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:317
+msgid ""
+" \t \n"
+"<p>...that you can set the tempo to match the duration of an audio segment "
+"if you know it's an exact number of bars or beats long?<br><br>Just select "
+"the audio segment and use <b>Composition -> Tempo and Time Signature -> Set "
+"Tempo to Audio Segment Duration</b>.</p>\n"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:1
+msgid "Feta Pixmaps"
+msgstr "Feta Pixel Mapak"
+
+#: ../data/fonts/mappings/fonts.cpp:2 ../data/fonts/mappings/fonts.cpp:7
+msgid "GNU Lilypond"
+msgstr "GNU LilyPond"
+
+#: ../data/fonts/mappings/fonts.cpp:3 ../data/fonts/mappings/fonts.cpp:8
+msgid "Copyright (c) 1997--2003 Han-Wen Nienhuys and Jan Nieuwenhuizen"
+msgstr "Copyright (c) 1997--2003 Han-Wen Nienhuys y Jan Nieuwenhuizen"
+
+#: ../data/fonts/mappings/fonts.cpp:4 ../data/fonts/mappings/fonts.cpp:9
+#: ../data/fonts/mappings/fonts.cpp:14 ../data/fonts/mappings/fonts.cpp:19
+#: ../data/fonts/mappings/fonts.cpp:24 ../data/fonts/mappings/fonts.cpp:29
+#: ../data/fonts/mappings/fonts.cpp:34 ../data/fonts/mappings/fonts.cpp:39
+#: ../data/fonts/mappings/fonts.cpp:44 ../data/fonts/mappings/fonts.cpp:49
+#: ../data/fonts/mappings/fonts.cpp:54
+msgid "Chris Cannam"
+msgstr "Chris Cannam"
+
+#: ../data/fonts/mappings/fonts.cpp:5 ../data/fonts/mappings/fonts.cpp:40
+msgid "pixmap"
+msgstr "pixel mapa"
+
+#: ../data/fonts/mappings/fonts.cpp:6
+msgid "Feta"
+msgstr "Feta"
+
+#: ../data/fonts/mappings/fonts.cpp:10 ../data/fonts/mappings/fonts.cpp:15
+#: ../data/fonts/mappings/fonts.cpp:20 ../data/fonts/mappings/fonts.cpp:25
+#: ../data/fonts/mappings/fonts.cpp:30 ../data/fonts/mappings/fonts.cpp:35
+#: ../data/fonts/mappings/fonts.cpp:45 ../data/fonts/mappings/fonts.cpp:50
+#: ../data/fonts/mappings/fonts.cpp:55
+msgid "scalable"
+msgstr "eskalagarria"
+
+#: ../data/fonts/mappings/fonts.cpp:11
+msgid "Fughetta"
+msgstr "Fughetta"
+
+#: ../data/fonts/mappings/fonts.cpp:12
+#, fuzzy
+msgid ""
+"Created by Blake Hodgetts; freely redistributable. See http://www.efn.org/"
+"~bch/aboutfonts.html"
+msgstr ""
+"Creada por Blake Hodgetts; libremente redistribuible. Ver http://www.efn."
+
+#: ../data/fonts/mappings/fonts.cpp:13
+msgid "Copyright 1995-1999 Blake Hodgetts"
+msgstr "Copyright 1995-1999 Blake Hodgetts"
+
+#: ../data/fonts/mappings/fonts.cpp:16
+msgid "Inkpen"
+msgstr "Inkpen"
+
+#: ../data/fonts/mappings/fonts.cpp:17
+msgid "Inkpen is part of Sibelius, but other fonts may use the same mappings."
+msgstr ""
+"Opus Sibeliusen zatia da, baina beste letra tipo batzuek mapaketa "
+"berakerabili ditzakete."
+
+#: ../data/fonts/mappings/fonts.cpp:18 ../data/fonts/mappings/fonts.cpp:28
+msgid "Copyright Sibelius Software Ltd"
+msgstr "Copyright Sibelius Software Ltd"
+
+#: ../data/fonts/mappings/fonts.cpp:21
+msgid "Maestro"
+msgstr "Maestro"
+
+#: ../data/fonts/mappings/fonts.cpp:22
+msgid "Maestro is part of Finale, but other fonts use the same mappings."
+msgstr ""
+"Maestro Finaleren zatia da, baina beste letra-tipo batzuek mapaketa "
+"berakerabiltzen dituzte"
+
+#: ../data/fonts/mappings/fonts.cpp:23 ../data/fonts/mappings/fonts.cpp:33
+msgid "Copyright Coda Inc"
+msgstr "Copyright Coda Inc"
+
+#: ../data/fonts/mappings/fonts.cpp:27
+msgid "Opus is part of Sibelius, but other fonts may use the same mappings."
+msgstr ""
+"Opus Sibeliusen zatia da, baina beste letra tipo batzuek mapaketa "
+"berakerabili ditzakete."
+
+#: ../data/fonts/mappings/fonts.cpp:31
+msgid "Petrucci"
+msgstr "Petrucci"
+
+#: ../data/fonts/mappings/fonts.cpp:32
+msgid "Petrucci is part of Finale, but other fonts use the same mappings."
+msgstr ""
+"Petrucci Finaleren zatia da, baina beste letra-tipo batzuek mapaketa berak "
+"erabiltzen dituzte"
+
+#: ../data/fonts/mappings/fonts.cpp:36
+msgid "RG21"
+msgstr "RG21"
+
+#: ../data/fonts/mappings/fonts.cpp:37
+msgid "Rosegarden 2.1"
+msgstr "Rosegarden 2.1"
+
+#: ../data/fonts/mappings/fonts.cpp:38
+msgid "Copyright (c) 1994--2001 Chris Cannam"
+msgstr "Copyright (c) 1994--2001 Chris Cannam"
+
+#: ../data/fonts/mappings/fonts.cpp:41
+msgid "Sonata"
+msgstr "Sonata"
+
+#: ../data/fonts/mappings/fonts.cpp:42
+msgid "Adobe"
+msgstr "Adobe"
+
+#: ../data/fonts/mappings/fonts.cpp:43
+msgid "Copyright Adobe Inc"
+msgstr "Copyright Adobe Inc"
+
+#: ../data/fonts/mappings/fonts.cpp:46
+msgid "Steinberg"
+msgstr "Steinberg"
+
+#: ../data/fonts/mappings/fonts.cpp:47
+msgid "The Steinberg Notation font is part of Cubase."
+msgstr "La tipografía de partitura de Steinberg es parte de Cubase."
+
+#: ../data/fonts/mappings/fonts.cpp:48
+msgid "Copyright Steinberg Inc"
+msgstr "Copyright Steinberg Inc"
+
+#: ../data/fonts/mappings/fonts.cpp:51
+msgid "Xinfonia"
+msgstr "Xinfonia"
+
+#: ../data/fonts/mappings/fonts.cpp:52
+msgid "xemo.org"
+msgstr "xemo.org"
+
+#: ../data/fonts/mappings/fonts.cpp:53
+msgid "Copyright 2001-2003 Xemus Software LLC"
+msgstr "Copyright 2001-2003 Xemus Software LLC"
+
+#: ../data/styles/styles.cpp:1
+msgid "Classical"
+msgstr "Classical"
+
+#: ../data/styles/styles.cpp:2
+msgid "Cross"
+msgstr "Cross"
+
+#: ../data/styles/styles.cpp:3
+msgid "Mensural"
+msgstr "Mensural"
+
+#: ../data/styles/styles.cpp:4
+msgid "Triangle"
+msgstr "Triangle"
+
+#, fuzzy
+#~ msgid "Set Quick Marker"
+#~ msgstr "Markadore bat Ezabatu"
+
+#, fuzzy
+#~ msgid "LilyPond previews not available"
+#~ msgstr "LilyPond aurrebistak ez eskuragarri"
+
+#, fuzzy
+#~ msgid "Audio file importer not available"
+#~ msgstr "Audio artxiboaren inportatzailea ez dago eskuragarri"
+
+#~ msgid " Triplet Chord"
+#~ msgstr " Akorde Triada"
+
+#~ msgid " Chord"
+#~ msgstr " Akordea"
+
+#~ msgid " Triplet"
+#~ msgstr " Hirukotxoa"
+
+#~ msgid "Making grace notes..."
+#~ msgstr "Apaindura notak sortzen..."
+
+#~ msgid "Making non-grace notes..."
+#~ msgstr "Ez-apaindura notak sortzen..."
+
+#~ msgid "Click and drag to draw an empty segment"
+#~ msgstr "Klik egin eta arrastatu hutsik dagoen segmentu bat marrazteko"
+
+#~ msgid "Marker name "
+#~ msgstr "Markatzailearen izena "
+
+#~ msgid "Time Signature font"
+#~ msgstr "Konpasaren neurrirako tipografia"
+
+#~ msgid "&Halve Speed"
+#~ msgstr "&Abiaduraren Erdia"
+
+#~ msgid "&Double Speed"
+#~ msgstr "A&biadura Bikoitza"
+
+#~ msgid "Halving speed..."
+#~ msgstr "Abiadura erdira gutxitzen..."
+
+#~ msgid "Doubling speed..."
+#~ msgstr "Abiadura bikoizten..."
+
+#~ msgid "Add staff group bracket"
+#~ msgstr "Gehitu partitura multzoaren kortxetea"
+
+#~ msgid "Make subsequent bar lines hidden"
+#~ msgstr "Ezkutatu ondoko konpas-lerroak"
+
+#~ msgid "Make &Grace Notes"
+#~ msgstr "A&paindura Notak Sortu"
+
+#~ msgid "Change Te&mpo..."
+#~ msgstr "Te&npoa Aldatu"
+
+#~ msgid "&Restore Computed Accidentals"
+#~ msgstr "&Berjarri Kalkulatutako Asaldurak"
+
+#~ msgid "LilyPond export/preview options"
+#~ msgstr "LilyPond Esportatze/Aurrebistaren opzioak"
+
+#~ msgid "LilyPond 2.6"
+#~ msgstr "LilyPond 2.6"
+
+#~ msgid "LilyPond 2.8"
+#~ msgstr "LilyPond 2.8"
+
+#~ msgid "Export Document Properties as \\header block"
+#~ msgstr "Esportatu Dokumentuaren Propietateak \\heder block bezala"
+
+#~ msgid "Manage Files Associated with A&udio Segments"
+#~ msgstr "&Audio Segmentuekin Lotuta Dauden Artxiboak Kudeatu"
+
+#~ msgid "&Add Multiple Tracks..."
+#~ msgstr "Pista Anitz &Gehitu... "
+
+#~ msgid "Split Segments at Time"
+#~ msgstr "Segmentuak Denboran Zatitu"
+
+#~ msgid "Split Segment at Time"
+#~ msgstr "Segmentua Denboran Zatitu"
+
+#~ msgid "Add Multiple Tracks"
+#~ msgstr "Pista Anitz Gehitu"
+
+#~ msgid ""
+#~ "1.2.3 splash screen photo (of Michael's rose garden)\n"
+#~ "new splash screen photo (of Michael McIntyre's\n"
+#~ "instruments along with a rose from the garden of Hassell Arnold Hale, "
+#~ "1916-2006,\n"
+#~ "may he rest in peace)"
+#~ msgstr ""
+#~ "1.2.3 splash pantailaren argazkia (Michaelen arrosa lorategia)\n"
+#~ "splash pantaila berriaren argazkia (Michal McIntyreren instrumentuak "
+#~ "Hassell\n"
+#~ "Arnold Hale-n [1916-2006, goian bego] lorategiko arrosa batekin batera)"
+
+#~ msgid "Show tool context help in status bar"
+#~ msgstr "Erakutsi lanabesen testuinguru-laguntza egoera barran"
+
+#~ msgid "Event List"
+#~ msgstr "Gertaeren Zerrenda"
+
+#~ msgid "External Editors"
+#~ msgstr "Kanpoko Editoreak"
+
+#~ msgid "Enable auto-save"
+#~ msgstr "Auto-gorde aktibatu"
+
+#~ msgid "Auto-save"
+#~ msgstr "Auto-gorde"
+
+#~ msgid "Show detailed status"
+#~ msgstr "Egoera zehaztuta erakutsi"
+
+#~ msgid "JACK command (including path as necessary)"
+#~ msgstr "JACK komandoa(bidea daukalarik, beharrezkoa bada)"
+
+#~ msgid ""
+#~ "Longer buffers usually improve playback quality, but use more memory and "
+#~ "slow response."
+#~ msgstr ""
+#~ "Buffer handiagoek normalean erreprodukzioaren kalitatea hobetzen dute, "
+#~ "bainamemoria gehiago erabiltzen dute eta konputagailua moteltzen dute."
+
+#~ msgid "Event read-ahead"
+#~ msgstr "Gertaeraren irakurketa aurreratua"
+
+#~ msgid "Audio mix buffer"
+#~ msgstr "Audio nahasketaren bufferra"
+
+#~ msgid "Audio file read buffer"
+#~ msgstr "Audio artxiboaren irakurketa bufferra"
+
+#~ msgid "Audio file write buffer"
+#~ msgstr "Audio bufferraren idazketa bufferra"
+
+#~ msgid "Per-file limit for cacheable audio files"
+#~ msgstr "Artxiboko tamaina muga katxean sartu daitezken audio artxiboentzat"
+
+#~ msgid "20 msec"
+#~ msgstr "20 milisegundu"
+
+#~ msgid "5 sec"
+#~ msgstr "5 segundu"
+
+#~ msgid "per file"
+#~ msgstr "artxiboko"
+
+#~ msgid "32KB"
+#~ msgstr "32KB"
+
+#~ msgid "32MB"
+#~ msgstr "32MB"
+
+#~ msgid "Audio mix and monitor mode:"
+#~ msgstr "Monitore eta audio nahasketa modua:"
+
+#~ msgid "Low latency"
+#~ msgstr "Latentzia baxua"
+
+#~ msgid "Buffered"
+#~ msgstr "Buffered"
+
+#~ msgid "Create post-fader outputs for audio instruments"
+#~ msgstr "fader osteko irteerak sortu audio instrumentuentzat"
+
+#~ msgid "Create post-fader outputs for submasters"
+#~ msgstr "fader osteko irteerak sortu submasterrentzat"
+
+#~ msgid "Record and Mix"
+#~ msgstr "Grabaketa eta Nahasketa"
+
+#~ msgid "JACK transport mode"
+#~ msgstr "JACK transporte modua"
+
+#~ msgid "Sync"
+#~ msgstr "Sinkronizazioa"
+
+#~ msgid "Synchronisation"
+#~ msgstr "Sinkronizazioa"
+
+#~ msgid "%1 msec / %2 KB %3"
+#~ msgstr "%1 mseg / %2 KB %3"
+
+#~ msgid "%1 msec / %2 MB %3"
+#~ msgstr "%1 mseg / %2 MB %3"
+
+#~ msgid "%1 sec / %2 KB %3"
+#~ msgstr "%1 seg / %2 KB %3"
+
+#~ msgid "%1 sec / %2 MB %3"
+#~ msgstr "%1 seg / %2 MB %3"
+
+#~ msgid "%1 msec"
+#~ msgstr "%1 mseg"
+
+#~ msgid "%1 KB"
+#~ msgstr "%1 KB"
+
+#~ msgid "%1 MB"
+#~ msgstr "%1 MB"
+
+#~ msgid "Other fonts"
+#~ msgstr "Beste font batzuk"
+
+#~ msgid "Rescan available fonts"
+#~ msgstr "Eskuragarri dauden font-ak berriro bilatu"
+
+#~ msgid ""
+#~ "Rosegarden can apply automatic quantization to recorded or imported MIDI "
+#~ "data for notation purposes only. This does not affect playback, and does "
+#~ "not affect editing in any of the views except notation."
+#~ msgstr ""
+#~ "Rosegardenek grabatutako edo inportatutako MIDI datuei kuantizazio "
+#~ "automatikoa aplikatu diezaieke bakarrik notaziorako. Honek ez dio "
+#~ "eragiten interpretazioari, eta bakarrik aldatzen du edizioa notazioaren "
+#~ "bistan."
+
+#~ msgid "Sequencer"
+#~ msgstr "Sekuentziadorea"
+
+#~ msgid "Sequencer Settings"
+#~ msgstr "Sekuentziadorearen Opzioak"
+
+#~ msgid "Markatzailea Editatu"
+#~ msgstr "Editar Marcador"
+
+#~ msgid "Audio auto-fade"
+#~ msgstr "Audioaren auto-iraungipena"
+
+#~ msgid "Fade in"
+#~ msgstr "Pixkanakako igoera"
+
+#~ msgid "Range"
+#~ msgstr "Esparrua"
+
+#~ msgid ""
+#~ "_: used internally for spacing\n"
+#~ "High: ----"
+#~ msgstr "Altua: ----"
+
+#~ msgid "High: ---"
+#~ msgstr "Altua: ---"
+
+#~ msgid "Low: ----"
+#~ msgstr "Baxua: ----"
+
+#~ msgid " ms"
+#~ msgstr " ms"
+
+#~ msgid "&Clear"
+#~ msgstr "&Ezabatu"
+
+#~ msgid "A&dd Alias"
+#~ msgstr "Alias &Gehitu"
+
+#~ msgid "C&ancel"
+#~ msgstr "E&zeztatu"
+
+#~ msgid "&Ok"
+#~ msgstr "&Ok"
+
+#~ msgid "Toggle &Mode"
+#~ msgstr "Modua &Aldatu"
+
+#~ msgid "Scale"
+#~ msgstr "Eskala"
+
+#~ msgid "Modifier"
+#~ msgstr "Modifikatzailea"
+
+#~ msgid "Suffix"
+#~ msgstr "Atzizkia"
+
+#~ msgid "&New"
+#~ msgstr "&Berria"
+
+#~ msgid "Additivies"
+#~ msgstr "Gehigarriak"
+
+#~ msgid "Fingering"
+#~ msgstr "Hatz-jokoa"
+
+#~ msgid "&Fretboard"
+#~ msgstr "&Giderra"
+
+#~ msgid "Restore &Computed Positions"
+#~ msgstr "Berjarri &Kalkulatutako Posizioak"
+
+#~ msgid ""
+#~ "You encountered an enharmonic resolution bug somewhere during this "
+#~ "operation. You may wish to save a copy of your current composition and "
+#~ "email it to [email protected] for analysis.\n"
+#~ "\n"
+#~ "In the meantime, you will probably need to make manual adjustments to the "
+#~ "file you've just exported."
+#~ msgstr ""
+#~ "Erresoluzio armonikoaren akats bat aurkitu duzu nonbait eragiketa honetan "
+#~ "zehar. Agian gorde nahiko duzu zure konposizioaren kopia bat eta bidali "
+#~ "emailez [email protected] analisi bat egin dakion.\n"
+#~ "\n"
+#~ "Bitartean, ziur aski eskuz aldatu beharko duzu esportatu berri duzun "
+#~ "artxiboa. "
+
+#~ msgid "&Tempo and Time Signature"
+#~ msgstr "&Tenpoa eta Konpas-Neurria"
+
+#~ msgid "&Split..."
+#~ msgstr "&Zatitu"
+
+#~ msgid "&Editor Tools"
+#~ msgstr "Editatzeko &Lanabesak"
+
+#~ msgid "&Beams"
+#~ msgstr "&Plkak"
+
+#~ msgid "&Indications"
+#~ msgstr "&Adierazpenak"
+
+#~ msgid "Trip&lets and Tuplets"
+#~ msgstr "&Hirukotxoak eta Multzo Irregularrak"
+
+#~ msgid "S&tem Direction"
+#~ msgstr "&Pliken Norabidea"
+
+#~ msgid ""
+#~ "<p>When exporting to LilyPond, you will see extra empty bars if the "
+#~ "Rosegarden\n"
+#~ "composition is longer than the notation it contains. To cure this, "
+#~ "navigate\n"
+#~ "to <b>Composition -> Change Composition Start and End...</b> then set "
+#~ "<b>End\n"
+#~ "Bar</b> to the end of your notation.</p>\n"
+#~ msgstr ""
+#~ "<p>Cuando exportando una composición a LilyPond, se pueden ver compases "
+#~ "extras si la composición Rosegarden sea más largo que la notación que "
+#~ "contiene. Para evitar, utilize <b>Composición -> Cambiar el Empiezo y "
+#~ "Final de la Composición...</b> y haga que la composición sea menos "
+#~ "largo.<p>\n"
+
+#~ msgid ""
+#~ "<p>You can use the mouse wheel to scroll up and down, or to scroll left "
+#~ "and right (by holding the Alt key at the same time), or to zoom in and "
+#~ "out (by holding the Control key).</p>\n"
+#~ msgstr ""
+#~ "<p>Saguaren gurpila pantailan gora eta behera mugitzeko erabili "
+#~ "dezakezuedo ezkerrera eta eskuinera mugitzeko (Alt tekla une berean "
+#~ "sakatuz) edoedo zoom-a handitzeko edo txikitzeko (Control tekla une "
+#~ "berean sakatuz).</p>\n"
+
+#~ msgid "LilyPond 2.4"
+#~ msgstr "LilyPond 2.4"
+
+#~ msgid "Paper size to use in \\paper block"
+#~ msgstr "\\paper blokean erabili beharreko paper tamaina"
+
+#~ msgid "LilyPond font size"
+#~ msgstr "LilyPond letra-tipoaren tamaina"
+
+#~ msgid "Do not export muted tracks"
+#~ msgstr "Ez esportatu pista mututuak"
+
+#~ msgid "Write bar checks at end of measures"
+#~ msgstr "Grabatu egiaztaze-barra konpasen bukaeran"
+
+#~ msgid "Half Speed"
+#~ msgstr "Abiadura Ertaina"
+
+#~ msgid "Double Speed"
+#~ msgstr "Abiadura Bikoitza"
+
+#~ msgid " (takes effect only from next restart)"
+#~ msgstr " (eragina dauka bakarrik hasieratu ondoren)"
+
+#~ msgid "&Select"
+#~ msgstr "&Hautatu"
+
+#~ msgid "Snap to 1/64"
+#~ msgstr "1/64-ra doitu"
+
+#~ msgid "Snap to 1/48"
+#~ msgstr "1/48-ra doitu"
+
+#~ msgid "Snap to 1/32"
+#~ msgstr "1/32-ra doitu"
+
+#~ msgid "Snap to 1/24"
+#~ msgstr "1/24-ra doitu"
+
+#~ msgid "Snap to 1/16"
+#~ msgstr "1/16-ra doitu"
+
+#~ msgid "Snap to 1/12"
+#~ msgstr "1/12-ra doitu"
+
+#~ msgid "Snap to 1/8"
+#~ msgstr "1/8-ra doitu"
+
+#~ msgid "Snap to 1/6"
+#~ msgstr "1/6-ra doitu"
+
+#~ msgid "Snap to 1/4"
+#~ msgstr "1/4-ra doitu"
+
+#~ msgid "Snap to &Unit"
+#~ msgstr "&Unitatera doitu"
+
+#~ msgid "%1 (%2.%3s)"
+#~ msgstr "%1 (%2.%3s)"
+
+#~ msgid "%1 (%2): %3"
+#~ msgstr "%1 (%2): %3"
+
+#~ msgid "Add Fretboard"
+#~ msgstr "Giderra Gehitu"
+
+#~ msgid "Getting sound driver status..."
+#~ msgstr "Soinu driberraren egoera eskuratzen..."
+
+#~ msgid "Distribute Audio on &MIDI"
+#~ msgstr "Audio &MIDIan banatu"
+
+#~ msgid "Cannot add file %1: %2"
+#~ msgstr "Ezin du %1 artxiboa gehitu: %2"
+
+#~ msgid "Enable"
+#~ msgstr "Indartu"
+
+#~ msgid "from:"
+#~ msgstr "nondik:"
+
+#~ msgid "to:"
+#~ msgstr "noraino:"
+
+#~ msgid "unlimited"
+#~ msgstr "mugagabea"
+
+#~ msgid "Number:"
+#~ msgstr "Zenbakia:"
+
+#~ msgid "Value:"
+#~ msgstr "Balorea:"
+
+#~ msgid "Wheel Events"
+#~ msgstr "Gurpilaren Gertaerak"
+
+#~ msgid "Amount:"
+#~ msgstr "Kopurua:"
+
+#~ msgid "Pitch from"
+#~ msgstr "Tonua (nondik)"
+
+#~ msgid "Pitch to"
+#~ msgstr "Tonua (norantz)"
+
+#~ msgid "High: %1"
+#~ msgstr "Altua: %1"
+
+#~ msgid "[+]"
+#~ msgstr "[+]"
+
+#~ msgid "&Velocity"
+#~ msgstr "&Abiadura"
diff --git a/po/fi.po b/po/fi.po
new file mode 100644
index 0000000..0118aa6
--- /dev/null
+++ b/po/fi.po
@@ -0,0 +1,11490 @@
+# translation of fi.po to
+# Finnish translation of Rosegarden.
+# This file is put in the public domain.
+#
+#
+# Heikki Johannes Junes <[email protected]>, 2006.
+# Asmo Koskinen <[email protected]>, 2006.
+# Heikki Junes <[email protected]>, 2007.
+msgid ""
+msgstr ""
+"Project-Id-Version: fi\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-04-24 18:19-0400\n"
+"PO-Revision-Date: 2008-04-02 09:51+0300\n"
+"Last-Translator: Heikki Junes\n"
+"Language-Team: <[email protected]>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.4\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: ../src/gui/dialogs/RescaleDialog.cpp:51 rc.cpp:192 rc.cpp:312
+#, no-c-format
+msgid "Rescale"
+msgstr "Uudelleenmitoita"
+
+#: ../src/gui/dialogs/RescaleDialog.cpp:56
+msgid "Duration of selection"
+msgstr "Valinnan kesto"
+
+#: ../src/gui/dialogs/RescaleDialog.cpp:62
+msgid "Adjust times of following events accordingly"
+msgstr "Sovita seuraavien tapahtumien ajat vastaavasti"
+
+#: ../src/gui/dialogs/PitchDialog.cpp:45
+#: ../src/gui/dialogs/RescaleDialog.cpp:72
+#: ../src/gui/dialogs/TimeDialog.cpp:51 ../src/gui/dialogs/TimeDialog.cpp:68
+#: ../src/gui/studio/BankEditorDialog.cpp:109
+msgid "Reset"
+msgstr "Nollaa"
+
+#: ../src/commands/segment/SegmentSplitByPitchCommand.cpp:46
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:46
+msgid "Split by Pitch"
+msgstr "Jaa sävelkorkeuden mukaan"
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:54
+msgid "Starting split pitch"
+msgstr "Aloita sävelkorkeuden jakaminen"
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:57
+msgid "Range up and down to follow music"
+msgstr "Vaihtelu ylös ja alas seuraa musiikkia"
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:63
+msgid "Duplicate non-note events"
+msgstr "Toisinna ei-nuotti -tapahtumat"
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:66
+msgid "Clef handling:"
+msgstr "Avaimen käsittely:"
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:69
+msgid "Leave clefs alone"
+msgstr "Jätä avaimet käsittelemättä"
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:70
+msgid "Guess new clefs"
+msgstr "Arvaa uudet avaimet"
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:71
+msgid "Use treble and bass clefs"
+msgstr "Käytä diskantti- ja bassoavaimia"
+
+#: ../src/gui/dialogs/DocumentConfigureDialog.cpp:64
+msgid "Document Properties"
+msgstr "Dokumentin ominaisuudet"
+
+#: ../src/gui/dialogs/MakeOrnamentDialog.cpp:45
+#: ../src/gui/editors/notation/NotationView.cpp:6048
+msgid "Make Ornament"
+msgstr "Tee koru"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:183
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:179
+#: ../src/gui/dialogs/EventEditDialog.cpp:128
+#: ../src/gui/dialogs/MakeOrnamentDialog.cpp:49
+#: ../src/gui/studio/DeviceEditorDialog.cpp:74
+#: ../src/gui/studio/NameSetEditor.cpp:72
+#: ../src/gui/widgets/ColourTable.cpp:51
+msgid "Name"
+msgstr "Nimi"
+
+#: ../src/gui/dialogs/MakeOrnamentDialog.cpp:51
+msgid ""
+"The name is used to identify both the ornament\n"
+"and the triggered segment that stores\n"
+"the ornament's notes."
+msgstr ""
+"Nimeä käytetään tunnistettaessa sekä korua\n"
+"että korun sysännyttä osaa, joka tallettaa\n"
+"korun nuotit."
+
+#: ../src/gui/dialogs/MakeOrnamentDialog.cpp:54
+msgid "Name: "
+msgstr "Nimi: "
+
+#: ../src/gui/dialogs/MakeOrnamentDialog.cpp:57
+#: ../src/gui/editors/eventlist/EventView.cpp:717
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:92
+msgid "Base pitch"
+msgstr "Perussävelkorkeus"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:57
+#: ../src/gui/editors/eventlist/EventView.cpp:140
+msgid "Text"
+msgstr "Teksti"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:66
+msgid "Specification"
+msgstr "Määritys"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:68
+msgid "Preview"
+msgstr "Esikatselu"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:72
+msgid "Text: "
+msgstr "Teksti: "
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:79
+msgid "Style: "
+msgstr "Tyyli: "
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:90
+msgid "Dynamic"
+msgstr "Voimakkuusmerkintä"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:93
+msgid "Direction"
+msgstr "Suunta"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:96
+msgid "Local Direction"
+msgstr "Paikallinen suunta"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:63
+#: ../src/gui/dialogs/TextEventDialog.cpp:99
+#: ../src/gui/editors/tempo/TempoView.cpp:91
+msgid "Tempo"
+msgstr "Tempo"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:102
+msgid "Local Tempo"
+msgstr "Paikallinen temp"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:105
+msgid "Lyric"
+msgstr "Sanoitus"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:108
+#: ../src/gui/editors/notation/NotationView.cpp:4242
+msgid "Chord"
+msgstr "Sointu"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:111
+msgid "Annotation"
+msgstr "Huomautus"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:114
+msgid "LilyPond Directive"
+msgstr "LilyPond-käsky"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:138
+msgid "Verse: "
+msgstr "Säkeistö: "
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:148
+msgid "Dynamic: "
+msgstr "Voimakkuusmerkintä: "
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:152
+msgid "ppp"
+msgstr "ppp"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:153
+msgid "pp"
+msgstr "pp"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:154
+msgid "p"
+msgstr "p"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:155
+msgid "mp"
+msgstr "mp"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:156
+msgid "mf"
+msgstr "mf"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:157
+msgid "f"
+msgstr "f"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:158
+msgid "ff"
+msgstr "ff"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:159
+msgid "fff"
+msgstr "fff"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:160
+msgid "rfz"
+msgstr "rfz"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:161
+msgid "sf"
+msgstr "sf"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:165
+msgid "Direction: "
+msgstr "Suunta: "
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:174
+msgid " ,"
+msgstr " ,"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:175
+msgid "D.C. al Fine"
+msgstr "D.C. al Fine"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:176
+msgid "D.S. al Fine"
+msgstr "D.S. al Fine"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:177
+msgid "Fine"
+msgstr "Fine"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:178
+msgid "D.S. al Coda"
+msgstr "D.S. al Coda"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:179
+msgid "to Coda"
+msgstr "Codaan asti"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:180
+msgid "Coda"
+msgstr "Coda"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:184
+msgid "Local Direction: "
+msgstr "Paikallinen suunta: "
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:188
+msgid "accel."
+msgstr "accel."
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:189
+msgid "ritard."
+msgstr "ritard."
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:190
+msgid "ralletando"
+msgstr "ralletando"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:191
+msgid "a tempo"
+msgstr "a tempo"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:192
+msgid "legato"
+msgstr "legato"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:193
+msgid "simile"
+msgstr "simile"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:194
+msgid "pizz."
+msgstr "pizz."
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:195
+msgid "arco"
+msgstr "arco"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:196
+msgid "non vib."
+msgstr "non vib."
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:197
+msgid "sul pont."
+msgstr "sul pont."
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:198
+#: ../src/gui/dialogs/TextEventDialog.cpp:200
+msgid "sul tasto"
+msgstr "sul tasto"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:199
+msgid "con legno"
+msgstr "con legno"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:201
+msgid "sul G"
+msgstr "sul G"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:202
+msgid "ordinario"
+msgstr "ordinario"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:203
+msgid "Muta in "
+msgstr "Muta in "
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:204
+msgid "volti subito "
+msgstr "volti subito "
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:205
+msgid "soli"
+msgstr "soli"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:206
+msgid "div."
+msgstr "div."
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:210
+msgid "Tempo: "
+msgstr "Temmpo: "
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:214
+#: ../src/gui/dialogs/TextEventDialog.cpp:238
+msgid "Grave"
+msgstr "Grave"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:215
+#: ../src/gui/dialogs/TextEventDialog.cpp:239
+msgid "Adagio"
+msgstr "Adagio"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:216
+#: ../src/gui/dialogs/TextEventDialog.cpp:240
+msgid "Largo"
+msgstr "Largo"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:217
+#: ../src/gui/dialogs/TextEventDialog.cpp:241
+msgid "Lento"
+msgstr "Lento"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:218
+#: ../src/gui/dialogs/TextEventDialog.cpp:242
+msgid "Andante"
+msgstr "Andante"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:219
+#: ../src/gui/dialogs/TextEventDialog.cpp:243
+msgid "Moderato"
+msgstr "Moderato"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:220
+#: ../src/gui/dialogs/TextEventDialog.cpp:244
+msgid "Allegretto"
+msgstr "Allegretto"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:221
+#: ../src/gui/dialogs/TextEventDialog.cpp:245
+msgid "Allegro"
+msgstr "Allegro"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:222
+#: ../src/gui/dialogs/TextEventDialog.cpp:246
+msgid "Vivace"
+msgstr "Vivace"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:223
+#: ../src/gui/dialogs/TextEventDialog.cpp:247
+msgid "Presto"
+msgstr "Presto"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:224
+#: ../src/gui/dialogs/TextEventDialog.cpp:248
+msgid "Prestissimo"
+msgstr "Prestissimo"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:225
+#: ../src/gui/dialogs/TextEventDialog.cpp:249
+msgid "Maestoso"
+msgstr "Maestoso"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:226
+#: ../src/gui/dialogs/TextEventDialog.cpp:250
+msgid "Sostenuto"
+msgstr "Sostenuto"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:227
+#: ../src/gui/dialogs/TextEventDialog.cpp:251
+msgid "Tempo Primo"
+msgstr "Tempo Primo"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:234
+msgid "Local Tempo: "
+msgstr "Paikallinen tempo: "
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:255
+msgid "Directive: "
+msgstr "Käsky: "
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:312
+msgid "Example"
+msgstr "Esimerkki"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:65
+msgid "Event Filter"
+msgstr "Tapahtumasuodation"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:86
+msgid "Note Events"
+msgstr "Nuottitapahtumat"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:90
+msgid "lowest:"
+msgstr "alin:"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:93
+msgid "highest:"
+msgstr "ylin:"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:96
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:141
+#: ../src/gui/widgets/PitchChooser.cpp:53
+msgid "Pitch:"
+msgstr "Sävelkorkeus:"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:99
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:163
+msgid "Velocity:"
+msgstr "Nopeus:"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:102
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:129
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:257
+msgid "Duration:"
+msgstr "Kesto:"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:107
+#: ../src/gui/dialogs/EventFilterDialog.cpp:114
+#: ../src/gui/dialogs/EventFilterDialog.cpp:121
+msgid "include"
+msgstr "sisällytä"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:108
+#: ../src/gui/dialogs/EventFilterDialog.cpp:115
+#: ../src/gui/dialogs/EventFilterDialog.cpp:122
+msgid "exclude"
+msgstr "poissulje"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:136
+#: ../src/gui/dialogs/EventFilterDialog.cpp:155
+#: ../src/gui/editors/eventlist/EventView.cpp:172
+#: ../src/gui/editors/eventlist/EventView.cpp:179
+#: ../src/gui/editors/eventlist/EventView.cpp:186
+msgid "edit"
+msgstr "muokkaa"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:141
+#: ../src/gui/dialogs/EventFilterDialog.cpp:157
+msgid "choose a pitch using a staff"
+msgstr "valitse äänenkorkeus käyttäen viivastoa"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:182
+#: ../src/gui/dialogs/EventFilterDialog.cpp:188
+msgid "longest"
+msgstr "pisin"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:200
+msgid "Include all"
+msgstr "Sisällytä kaikki"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:203
+msgid "Include entire range of values"
+msgstr "Sisällytä koko arvoalue"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:206
+msgid "Exclude all"
+msgstr "Poissulje kaikki"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:209
+msgid "Exclude entire range of values"
+msgstr "Poissulje koko arvoalue"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:233
+#: ../src/gui/dialogs/EventFilterDialog.cpp:234
+msgid "shortest"
+msgstr "lyhin"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:333
+msgid "Lowest pitch"
+msgstr "Alin sävelkorkeus"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:343
+msgid "Highest pitch"
+msgstr "korkein sävelkorkeus"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:56
+#: ../src/gui/editors/notation/NotationView.cpp:1619
+#: ../src/gui/editors/notation/NotationView.cpp:6088
+msgid "Use Ornament"
+msgstr "Käytä korua"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:260
+#: ../src/gui/configuration/NotationConfigurationPage.h:64
+#: ../src/gui/configuration/NotationConfigurationPage.h:65
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:63
+msgid "Notation"
+msgstr "Nuotinnus"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:68
+msgid "Display as: "
+msgstr "Näytä kohteena: "
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:84
+msgid "Trill"
+msgstr "Liverre"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:84
+msgid "Trill with line"
+msgstr "Liverre viivalla"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:84
+msgid "Trill line only"
+msgstr "Vain liverreviiva"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:85
+msgid "Turn"
+msgstr "Kierros"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:85
+msgid "Mordent"
+msgstr "Pureutuminen"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:85
+msgid "Inverted mordent"
+msgstr "Käänteispureutuminen"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:86
+msgid "Long mordent"
+msgstr "Pitkä pureutuminen"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:86
+msgid "Long inverted mordent"
+msgstr "Pitkä käänteispureutuminen"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:94
+msgid "Text mark"
+msgstr "Tekstimerkintä"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:98
+msgid " Text: "
+msgstr " Teksti: "
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:104
+msgid "Performance"
+msgstr "Esitys"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:109
+msgid "Perform using triggered segment: "
+msgstr "Esitä käyttäen sysättävää osaa: "
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:75
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:123
+msgid "Perform with timing: "
+msgstr "Esitä aikana: "
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:81
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:129
+msgid "As stored"
+msgstr "Kuten tallennettu"
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:82
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:130
+msgid "Truncate if longer than note"
+msgstr "Katkaise, jos on pidempi kuin nuotti"
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:83
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:131
+msgid "End at same time as note"
+msgstr "Lopeta samaan aikaan kuin nuotti"
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:84
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:132
+msgid "Stretch or squash segment to note duration"
+msgstr "Venytä tai litistä osa nuottipituuteen"
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:86
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:134
+msgid "Adjust pitch to note"
+msgstr "Sovita sävelkorkeus nuottiin"
+
+#: ../src/gui/dialogs/PitchPickerDialog.cpp:40
+msgid "Pitch Selector"
+msgstr "Sävelkorkeuden valitsin"
+
+#: ../src/gui/dialogs/BeatsBarsDialog.cpp:44
+msgid "Audio Segment Duration"
+msgstr "Ääniosan kesto"
+
+#: ../src/gui/dialogs/BeatsBarsDialog.cpp:50
+msgid "The selected audio segment contains:"
+msgstr "Valittu ääniosa sisältää:"
+
+#: ../src/gui/dialogs/BeatsBarsDialog.cpp:59
+msgid "beat(s)"
+msgstr "isku(t)"
+
+#: ../src/gui/dialogs/BeatsBarsDialog.cpp:60
+msgid "bar(s)"
+msgstr "tahti/tahdit"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:51
+msgid "Tuplet"
+msgstr "Tupletti"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:58
+msgid "New timing for tuplet group"
+msgstr "Uusi ajoitus tuplettiryhmälle"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:76
+msgid "Play "
+msgstr "Toista "
+
+#: ../src/gui/dialogs/TupletDialog.cpp:98
+msgid "in the time of "
+msgstr "ajassa "
+
+#: ../src/gui/dialogs/TupletDialog.cpp:104
+msgid "Timing is already correct: update display only"
+msgstr "Ajoitus on jo oikea: päivitä vain näyttö"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:114
+msgid "Timing calculations"
+msgstr "Ajoituksen laskemiset"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:120
+msgid "Selected region:"
+msgstr "Valittu alue:"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:129
+msgid "Group with current timing:"
+msgstr "Ryhmitä nykyisenä aikana:"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:135
+msgid "Group with new timing:"
+msgstr "Ryhmitä uutena aikana:"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:141
+msgid "Gap created by timing change:"
+msgstr "Ajan muutoksen luoma väli:"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:149
+msgid "Unchanged at end of selection:"
+msgstr "Muuttumaton valinnan lopussa:"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:63 rc.cpp:372
+#, no-c-format
+msgid "Metronome"
+msgstr "Metronomi"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:77
+msgid "Metronome Instrument"
+msgstr "Metronomi-instrumentti"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:82
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:150
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:183
+#: ../src/gui/studio/DeviceEditorDialog.cpp:73
+#: ../src/gui/studio/DeviceManagerDialog.cpp:105
+#: ../src/gui/studio/DeviceManagerDialog.cpp:163
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:66
+msgid "Device"
+msgstr "Laite"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:101
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:89
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:215
+#: ../src/gui/studio/DeviceEditorDialog.cpp:195
+#: ../src/gui/studio/DeviceEditorDialog.cpp:218
+#: ../src/gui/studio/DeviceEditorDialog.cpp:230
+#: ../src/gui/studio/DeviceManagerDialog.cpp:196
+#: ../src/gui/studio/DeviceManagerDialog.cpp:440
+#: ../src/gui/studio/DeviceManagerDialog.cpp:452
+msgid "No connection"
+msgstr "Ei yhteyttä"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:112
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:111
+#: ../src/gui/editors/parameters/InstrumentParameterBox.cpp:53
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:1209
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:159
+#: ../src/gui/general/PresetHandlerDialog.cpp:92
+#: ../src/gui/studio/MidiMixerWindow.cpp:204
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:67
+msgid "Instrument"
+msgstr "Instrumentti"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:118
+msgid "Beats"
+msgstr "Iskut"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:184
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:123
+msgid "Resolution"
+msgstr "Tarkkuus"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:309
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:139
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:205
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:125
+#: ../src/gui/editors/matrix/MatrixView.cpp:2132
+#: ../src/gui/editors/notation/NotationView.cpp:1582
+#: ../src/gui/widgets/QuantizeParameters.cpp:128
+#: ../src/gui/widgets/QuantizeParameters.cpp:301
+msgid "None"
+msgstr "Ei mitään"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:126
+msgid "Bars only"
+msgstr "Vain tahdit"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:127
+msgid "Bars and beats"
+msgstr "Tahdit ja lyönnit"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:128
+msgid "Bars, beats, and divisions"
+msgstr "Tahdit, lyönnit ja jaot"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:132
+msgid "Bar velocity"
+msgstr "Tahtinopeus"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:139
+msgid "Beat velocity"
+msgstr "Lyöntinopeus"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:146
+msgid "Sub-beat velocity"
+msgstr "Lyönninsisäinen nopeus"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:155
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:324
+msgid "Pitch"
+msgstr "Sävelkorkeus"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:160
+msgid "for Bar"
+msgstr "tahdille"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:161
+msgid "for Beat"
+msgstr "lyönnille"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:162
+msgid "for Sub-beat"
+msgstr "lyönnin väliselle osalle"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:166
+msgid "Metronome Activated"
+msgstr "Metronomi käynnistetty"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:167
+msgid "Playing"
+msgstr "Soitetaan"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:168
+msgid "Recording"
+msgstr "Nauhoitetaan"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:46
+msgid "Choose Text Encoding"
+msgstr "Valitse tekstin koodiaus"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:50
+msgid ""
+"\n"
+"This file contains text in an unknown language encoding.\n"
+"\n"
+"Please select one of the following estimated text encodings\n"
+"for use with the text in this file:\n"
+msgstr ""
+"\n"
+"Tässä tiedostossa on tuntemattomassa kielikoodauksessa olevaa tekstiä.\n"
+"\n"
+"Ole hyvä, ja valitse yksi seuraavista arvioiduista koodauksista\n"
+"tätä tekstiä varten käytettäväksi:\n"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:61
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:77
+msgid "Japanese Shift-JIS"
+msgstr "Japanilainen Shift-JIS"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:62
+msgid "Unicode variable-width"
+msgstr "Unicode-muuttuva leveys"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:63
+msgid "Western Europe"
+msgstr "Länsieurooppalainen"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:64
+msgid "Western Europe + Euro"
+msgstr "Länsieurooppalainen + Euro"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:65
+msgid "Eastern Europe"
+msgstr "Itäeurooppalainen"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:66
+msgid "Southern Europe"
+msgstr "Eteläeurooppalainen"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:67
+msgid "Northern Europe"
+msgstr "Pohjoiseurooppalainen"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:68
+msgid "Cyrillic"
+msgstr "Kyrillinen"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:69
+msgid "Arabic"
+msgstr "Arabialainen"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:70
+msgid "Greek"
+msgstr "Kreikkalainen"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:71
+msgid "Hebrew"
+msgstr "Heprealainen"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:72
+msgid "Turkish"
+msgstr "Turkkilainen"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:73
+msgid "Nordic"
+msgstr "Pohjoismainen"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:74
+msgid "Thai"
+msgstr "Thaimaalainen"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:75
+msgid "Baltic"
+msgstr "Balttilainen"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:76
+msgid "Celtic"
+msgstr "Kelttiläinen"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:78
+msgid "Traditional Chinese"
+msgstr "Perinnekiinalainen"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:79
+msgid "Simplified Chinese"
+msgstr "Yksinkertaistettu kiina"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:80
+msgid "Russian"
+msgstr "Venäläinen"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:81
+msgid "Ukrainian"
+msgstr "Ukrainalainen"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:82
+msgid "Tamil"
+msgstr "Tamililainen"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:117
+#, c-format
+msgid "Microsoft Code Page %1"
+msgstr "Microsoft-koodisivu %1"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:123
+#: ../src/gui/editors/matrix/MatrixView.cpp:1490
+msgid "%1 (%2)"
+msgstr "%1 (%2)"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:142
+msgid ""
+"\n"
+"Example text from file:"
+msgstr ""
+"\n"
+"Esimerkki teksti tiedostosta:"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:59
+#: ../src/gui/editors/tempo/TempoView.cpp:92
+msgid "Time Signature"
+msgstr "Tahtilajimerkintä"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:82
+msgid "Time signature"
+msgstr "Tahtilajimerkintä"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:116
+msgid "Time where signature takes effect"
+msgstr "Aika minä merkintä tulee voimaan"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:83
+#: ../src/gui/dialogs/TempoDialog.cpp:128
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:129
+#: ../src/gui/general/PresetHandlerDialog.cpp:101
+msgid "Scope"
+msgstr "Laajuus"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:141
+#, c-format
+msgid "Insertion point is at start of measure %1."
+msgstr "Syöttöpiste alkaa tahdista %1."
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:145
+#, c-format
+msgid "Insertion point is in the middle of measure %1."
+msgstr "Syöttökohdan on tahdin %1 keskellä."
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:150
+msgid "Insertion point is at start of composition."
+msgstr "Syöttöpiste on sävellyksen alussa."
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:155
+msgid "Start measure %1 here"
+msgstr "Aloita tahti %1 tästä"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:159
+#, c-format
+msgid "Change time from start of measure %1"
+msgstr "Vaihda aika tahdin %1 alusta"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:166
+#, c-format
+msgid "Time change will take effect at the start of measure %1."
+msgstr "Ajanmuutos tulee voimaan tahdin %1 alussa."
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:176
+msgid "Hide the time signature"
+msgstr "Piilota tahtilajimerkintä"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:181
+msgid "Hide the affected bar lines"
+msgstr "Piilota altistetut tahtiviivat"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:186
+msgid "Show as common time"
+msgstr "Näytä yhteisenä aikana"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:191
+msgid "Correct the durations of following measures"
+msgstr "Korjaa seuraavien tahtien kestot"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:280
+msgid "Display as common time"
+msgstr "Näytä yhteisenä aikana"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:284
+msgid "Display as cut common time"
+msgstr "Näytä leikkauksen yhteisenä aikana"
+
+#: ../src/gui/dialogs/ConfigureDialog.cpp:66
+msgid "Configure Rosegarden"
+msgstr "Valitse Rosegardenin asetukset"
+
+#: ../src/gui/dialogs/MarkerModifyDialog.cpp:53
+#: ../src/gui/dialogs/MarkerModifyDialog.cpp:61
+msgid "Edit Marker"
+msgstr "Muokkaa kirjanmerkkiä"
+
+#: ../src/gui/dialogs/MarkerModifyDialog.cpp:78
+msgid "Marker Time"
+msgstr "Kirjanmerkin aika"
+
+#: ../src/gui/dialogs/MarkerModifyDialog.cpp:94
+msgid "Marker Properties"
+msgstr "Kirjanmerkin ominaisuudet"
+
+#: ../src/gui/dialogs/MarkerModifyDialog.cpp:100
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:554
+msgid "Text:"
+msgstr "Teksti:"
+
+#: ../src/gui/dialogs/MarkerModifyDialog.cpp:104
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:85
+msgid "Description:"
+msgstr "Kuvaus:"
+
+#: ../src/gui/dialogs/FileMergeDialog.cpp:46
+msgid "Merge File"
+msgstr "Sulauta tiedosto"
+
+#: ../src/gui/dialogs/FileMergeDialog.cpp:53
+msgid "Merge new file "
+msgstr "Sulauta uusi tiedosto "
+
+#: ../src/gui/dialogs/FileMergeDialog.cpp:56
+msgid "At start of existing composition"
+msgstr "Olemassa olevan sävellyksen alussa"
+
+#: ../src/gui/dialogs/FileMergeDialog.cpp:57
+msgid "From end of existing composition"
+msgstr "Olemassa olevan sävellyksen lopusta"
+
+#: ../src/gui/dialogs/FileMergeDialog.cpp:61
+msgid "The file has different time signatures or tempos."
+msgstr "Tiedostolla on eri tahtilajimerkinnät tai tempot."
+
+#: ../src/gui/dialogs/FileMergeDialog.cpp:62
+msgid "Import these as well"
+msgstr "Tuo myös nämä"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:171
+#: ../src/gui/dialogs/ShowSequencerStatusDialog.cpp:44
+msgid "Sequencer status"
+msgstr "Sekvensserin tila"
+
+#: ../src/gui/dialogs/ShowSequencerStatusDialog.cpp:48
+msgid "Sequencer status:"
+msgstr "Sekvensserin tila:"
+
+#: ../src/gui/dialogs/ShowSequencerStatusDialog.cpp:50
+msgid "Status not available."
+msgstr "Tila ei ole saatavilla."
+
+#: ../src/gui/dialogs/ShowSequencerStatusDialog.cpp:57
+msgid "Sequencer is not running or is not responding."
+msgstr "Sekvensseri ei ole käynnissä tai se ei vastaa."
+
+#: ../src/gui/dialogs/ShowSequencerStatusDialog.cpp:64
+msgid "Sequencer is not returning a valid status report."
+msgstr "Sekvensseri ei vastaa kelpoa tilatietoa."
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:46
+msgid "Add Tracks"
+msgstr "Lisää raitoja"
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:54
+msgid "How many tracks do you want to add?"
+msgstr "Kuinka monta raitaa haluat lisätä?"
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:62
+msgid "Add tracks"
+msgstr "Lisää raitoja"
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:64
+msgid "At the top"
+msgstr ""
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:65
+#, fuzzy
+msgid "Above the current selected track"
+msgstr "Vaimentaa kaikki muut paitsi valitut raidat"
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:66
+#, fuzzy
+msgid "Below the current selected track"
+msgstr "Vaimentaa kaikki muut paitsi valitut raidat"
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:67
+msgid "At the bottom"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:75
+msgid "Event Properties"
+msgstr "Tapahtuman ominaisuudet"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:81
+msgid "Event type:"
+msgstr "Tapahtumatyyppi:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:117
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:251
+#: ../src/gui/editors/segment/MarkerEditor.cpp:97
+msgid "Absolute time:"
+msgstr "Täysi aika:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:156
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:323
+msgid "Controller name:"
+msgstr "Ohjaimen nimi:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:157
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:530
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:562
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:563
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:602
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:631
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:267
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:269
+#: ../src/gui/editors/segment/MarkerEditor.cpp:279
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:272
+#: ../src/gui/studio/AudioMixerWindow.cpp:388
+#: ../src/gui/studio/AudioMixerWindow.cpp:519
+#: ../src/gui/studio/AudioMixerWindow.cpp:683
+#: ../src/gui/studio/AudioMixerWindow.cpp:722
+#: ../src/gui/studio/AudioMixerWindow.cpp:904
+#: ../src/gui/studio/SynthPluginManagerDialog.cpp:121
+msgid "<none>"
+msgstr "<tyhjä>"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:174
+msgid "Meta string:"
+msgstr "Meta-merkkijono:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:179
+msgid "Load data"
+msgstr "Lataa tiedot"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:181
+msgid "Save data"
+msgstr "Tallenna tiedot"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:192
+msgid "Notation Properties"
+msgstr "Nuotinnuksen ominaisuudet"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:198
+msgid "Lock to changes in performed values"
+msgstr "Lukitset muutokset esitetyissä arvoissa"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:205
+msgid "Notation time:"
+msgstr "Nuotinnuksen aika:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:217
+msgid "Notation duration:"
+msgstr "Nuotinnuksen kesto:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:283
+msgid "Note pitch:"
+msgstr "Nuotin sävelkorkeus:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:291
+msgid "Note velocity:"
+msgstr "Nuotin nopeus:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:317
+msgid "Controller number:"
+msgstr "Ohjaimen numero:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:326
+msgid "Controller value:"
+msgstr "Ohjaimen arvo:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:354
+msgid "Key pitch:"
+msgstr "Koskettimen sävelkorkeus:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:362
+msgid "Key pressure:"
+msgstr "Koskettimen paine:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:390
+msgid "Channel pressure:"
+msgstr "Kanavan paine:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:418
+msgid "Program change:"
+msgstr "Ohjelman muutos:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:461
+msgid "Data length:"
+msgstr "Tietojen pituus:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:462
+msgid "Data:"
+msgstr "Tiedot:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:480
+msgid "Pitchbend MSB:"
+msgstr "Sävelkorkeustaivutin MSB:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:488
+msgid "Pitchbend LSB:"
+msgstr "Sävelkorkeustaivutin LSB:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:523
+msgid "Indication:"
+msgstr "Osoitus:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:553
+msgid "Text type:"
+msgstr "Tekstityyppi:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:596
+msgid "Clef type:"
+msgstr "Avaintyyppi:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:625
+msgid "Key name:"
+msgstr "Sävellajin nimi:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:674
+msgid "Unsupported event type:"
+msgstr "Ei-tuettu tapahtumatyyppi:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:931
+msgid "Edit Event Time"
+msgstr "Muokkaa tapahtuma-aikaa"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:943
+msgid "Edit Event Notation Time"
+msgstr "Muokkaa tapahtuman nuotinnusaikaa"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:955
+msgid "Edit Duration"
+msgstr "Muokkaa kestoa"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:968
+msgid "Edit Notation Duration"
+msgstr "Muokkaa nuotinnuksen kestoa"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:981
+msgid "Edit Pitch"
+msgstr "Muokkaa sävelkorkeutta"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:991
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:1016
+msgid "*.syx|System exclusive files (*.syx)"
+msgstr "*.syx|Vain järjestelmää koskevat tiedostot (*.syx)"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:992
+msgid "Load System Exclusive data in File"
+msgstr "Lataa vain järjestelmää koskevat tiedot tiedostosta"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:1017
+msgid "Save System Exclusive data to..."
+msgstr "Tallenna vain järjestelmää koskevat tiedot..."
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:46
+msgid "Locate audio file"
+msgstr "Paikallista äänitiedosto"
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:50
+msgid "&Skip"
+msgstr "&Ohita"
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:51
+msgid "Skip &All"
+msgstr "Ohita &kaikki"
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:52
+msgid "&Locate"
+msgstr "&Paikallista"
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:57
+msgid ""
+"Can't find file \"%1\".\n"
+"Would you like to try and locate this file or skip it?"
+msgstr ""
+"Ei voitu löytää tiedostoa \"%1\".\n"
+"Haluaisitko yrittää paikallistaa tiedoston vai ohittaa sen?"
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:71
+msgid ""
+"%1|Requested file (%2)\n"
+"*.wav|WAV files (*.wav)"
+msgstr ""
+"%1|Vaaditut tiedostot (%2)\n"
+"*.wav|WAV-tiedostot (*.wav)"
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:74
+msgid "Select an Audio File"
+msgstr "Valitse äänitiedosto"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:53 ../src/gui/dialogs/ClefDialog.cpp:62
+#: ../src/gui/dialogs/ClefDialog.cpp:79 ../src/gui/dialogs/ClefDialog.cpp:90
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:278
+msgid "Clef"
+msgstr "Avain"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:65
+msgid "Existing notes following clef change"
+msgstr "Olemassa olevat nuotit seuraavat avaimen muutosta"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:71
+msgid "Lower clef"
+msgstr "Alempi avain"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:77
+msgid "Up an Octave"
+msgstr "Oktaavi ylös"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:84
+msgid "Down an Octave"
+msgstr "Oktaavi alas"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:88
+msgid "Higher clef"
+msgstr "Ylempi avain"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:96
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:152
+msgid "Maintain current pitches"
+msgstr "Säilytä nykyiset äänenkorkeudet"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:99
+msgid "Transpose into appropriate octave"
+msgstr "Siirrä sopivaan oktaaviin"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:231
+msgid "%1 down an octave"
+msgstr "%1 alas ja oktaavi"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:234
+msgid "%1 down two octaves"
+msgstr "%1 alas ja kaksi oktaavia"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:237
+msgid "%1 up an octave"
+msgstr "%1 ylös ja oktaavi"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:240
+msgid "%1 up two octaves"
+msgstr "%1 ylös ja kaksi oktaavia"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:249
+msgid "Treble"
+msgstr "Diskantti"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:251
+msgid "French violin"
+msgstr "Ranskalainen viulu"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:253
+msgid "Soprano"
+msgstr "Soprano"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:255
+msgid "Mezzo-soprano"
+msgstr "Mezzosopraano"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:257
+msgid "Alto"
+msgstr "Altto"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:259
+msgid "Tenor"
+msgstr "Tenori"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:261
+msgid "C-baritone"
+msgstr "C-baritoni"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:263
+msgid "F-baritone"
+msgstr "F-baritoni"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:265
+msgid "Bass"
+msgstr "Basso"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:267
+msgid "Sub-bass"
+msgstr "Alabasso"
+
+#: ../src/gui/dialogs/CountdownDialog.cpp:52
+msgid "Recording..."
+msgstr "Nauhoitetaan..."
+
+#: ../src/gui/dialogs/CountdownDialog.cpp:60
+msgid "Recording time remaining: "
+msgstr "Nauhoitusaikaa jäljellä: "
+
+#: ../src/gui/dialogs/CountdownDialog.cpp:120
+msgid "Just how big is your hard disk?"
+msgstr "Minkäkokoinen kiintolevysi olikaan?"
+
+#: ../src/gui/dialogs/CountdownDialog.cpp:154
+msgid "Recording beyond end of composition: "
+msgstr "Nauhoitetaan sävellyksen jälkeiseen osaan: "
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:52
+msgid "Specify Interval"
+msgstr "Määritä intervalli"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:58
+msgid "Reference note:"
+msgstr "Viittausnuotti:"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:59
+msgid "Target note:"
+msgstr "Kohdenuotti:"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:68
+#: ../src/gui/dialogs/IntervalDialog.cpp:315
+msgid "a perfect unison"
+msgstr "puhdas priimi"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:76
+msgid "Effect on Key"
+msgstr "Vaikutus sävellajiin"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:77
+msgid "Transpose within key"
+msgstr "Siirrä sävellajin sisällä"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:79
+msgid "Change key for selection"
+msgstr "Vaihda sävellajia valinnalle"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:89
+msgid ""
+"Adjust segment transposition in opposite direction (maintain audible pitch)"
+msgstr ""
+"Tee osan siirrot vastakkaiseen suuntaan (säilyttäen nuottien soittokorkeudet)"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:190
+#: ../src/gui/dialogs/IntervalDialog.cpp:220
+msgid "a diminished"
+msgstr "vähennetty"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:192
+#: ../src/gui/dialogs/IntervalDialog.cpp:222
+msgid "an augmented"
+msgstr "ylinouseva"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:194
+#: ../src/gui/dialogs/IntervalDialog.cpp:224
+msgid "a doubly diminished"
+msgstr "kaksoisvähennetty"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:196
+#: ../src/gui/dialogs/IntervalDialog.cpp:226
+msgid "a doubly augmented"
+msgstr "kaksoisylinouseva"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:198
+#: ../src/gui/dialogs/IntervalDialog.cpp:228
+msgid "a triply diminished"
+msgstr "kolmoisvähennetty"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:200
+#: ../src/gui/dialogs/IntervalDialog.cpp:230
+msgid "a triply augmented"
+msgstr "kolmoisvähennetty"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:202
+msgid "a quadruply diminished"
+msgstr "neloisvähennetty"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:204
+#: ../src/gui/dialogs/IntervalDialog.cpp:232
+msgid "a quadruply augmented"
+msgstr "neloisylinouseva"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:206
+#: ../src/gui/dialogs/IntervalDialog.cpp:234
+msgid "a perfect"
+msgstr "puhdas"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:208
+#: ../src/gui/dialogs/IntervalDialog.cpp:236
+msgid "an (unknown, %1)"
+msgstr "(tuntematon, %1)"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:216
+msgid "a minor"
+msgstr "pieni"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:218
+msgid "a major"
+msgstr "suuri"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:239
+msgid "an (unknown)"
+msgstr "(tuntematon)"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:248
+#: ../src/gui/dialogs/IntervalDialog.cpp:251
+msgid "%1 octave"
+msgstr "%1 oktaavi"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:254
+msgid "%1 unison"
+msgstr "%1 priimi"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:258
+msgid "%1 second"
+msgstr "%1 sekunti"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:261
+msgid "%1 third"
+msgstr "%1 terssi"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:264
+msgid "%1 fourth"
+msgstr "%1 kvartti"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:267
+msgid "%1 fifth"
+msgstr "%1 kvintti"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:270
+msgid "%1 sixth"
+msgstr "%1 seksti"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:273
+msgid "%1 seventh"
+msgstr "%1 septimi"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:276
+#: ../src/gui/studio/DeviceManagerDialog.cpp:329
+#: ../src/gui/studio/DeviceManagerDialog.cpp:363
+#, c-format
+msgid "%1"
+msgstr "%1"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:287
+msgid ""
+"_n: up 1 octave and %1\n"
+"up %n octaves and %1"
+msgstr ""
+"1 oktaavi ja %1 ylös\n"
+"%n oktaavia ja %1 ylös"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:291
+#, c-format
+msgid ""
+"_n: up 1 octave\n"
+"up %n octaves"
+msgstr ""
+"1 oktaavi ylös\n"
+"%n oktaavia ylös"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:295
+#, c-format
+msgid "up %1"
+msgstr "%1 ylös"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:303
+msgid ""
+"_n: down 1 octave and %1\n"
+"down %n octaves and %1"
+msgstr ""
+"1 oktaavi ja %1 alas\n"
+"%n oktaavia ja %1 alas"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:307
+#, c-format
+msgid ""
+"_n: down 1 octave\n"
+"down %n octaves"
+msgstr ""
+"1 oktaavi alas\n"
+"%n oktaavia alas"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:311
+#, c-format
+msgid "down %1"
+msgstr "%1 alas"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:81
+msgid "Intrinsics"
+msgstr "Ominaiset"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:85
+msgid "Event type: "
+msgstr "Tapahtumatyyppi: "
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:91
+msgid "Absolute time: "
+msgstr "Täysi aika: "
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:101
+msgid "Duration: "
+msgstr "Kesto: "
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:114
+msgid "Sub-ordering: "
+msgstr "Alijärjestys: "
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:125
+msgid "Persistent properties"
+msgstr "Pysyvät ominaisuudet"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:169
+#: ../src/gui/dialogs/EventEditDialog.cpp:133
+#: ../src/gui/studio/BankEditorDialog.cpp:129
+#: ../src/gui/studio/DeviceEditorDialog.cpp:75
+msgid "Type"
+msgstr "Tyyppi"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:184
+#: ../src/gui/dialogs/EventEditDialog.cpp:135
+#: ../src/gui/dialogs/EventParameterDialog.cpp:89
+#: ../src/gui/dialogs/EventParameterDialog.cpp:93
+#: ../src/gui/dialogs/EventParameterDialog.cpp:115
+msgid "Value"
+msgstr "Arvo"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:155
+msgid "Non-persistent properties"
+msgstr "Ei-pysyvät ominaisuudet"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:156
+msgid "These are cached values, lost if the event is modified."
+msgstr "Tämä ovat siepattuja arvoja, jotka häviävät tapahtumaa muokattaessa."
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:170
+msgid "Name "
+msgstr "Nimi "
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:172
+msgid "Type "
+msgstr "Tyyppi "
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:174
+msgid "Value "
+msgstr "Arvo "
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:188
+msgid "Make persistent"
+msgstr "Tee pysyväksi"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:292
+msgid "Delete this property"
+msgstr "Poista tämä ominaisuus"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:433
+msgid ""
+"Are you sure you want to delete the \"%1\" property?\n"
+"\n"
+"Removing necessary properties may cause unexpected behavior."
+msgstr ""
+"Haluatko varmasti poistaa \"%1\" ominaisuuden?\n"
+"\n"
+"Tarpeellisten ominaisuuksien poistaminen voi aiheuttaa odottamatonta "
+"käytöstä."
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:436
+#: ../src/gui/dialogs/EventEditDialog.cpp:469
+msgid "Edit Event"
+msgstr "Muokkaa tapahtumaa"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:465
+msgid ""
+"Are you sure you want to make the \"%1\" property persistent?\n"
+"\n"
+"This could cause problems if it overrides a different computed value later "
+"on."
+msgstr ""
+"Haluatko varmasti tehdä ominaisuudesta \"%1\" pysyvän?\n"
+"Tämä voi aiheuttaa ongelmia, jos se korvaa toisen, lasketun arvon myöhemmin."
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:470
+msgid "Make &Persistent"
+msgstr "Tee &pysyväksi"
+
+#: ../src/gui/dialogs/PasteNotationDialog.cpp:52
+msgid "Paste type"
+msgstr "Liittämistyyppi"
+
+#: ../src/gui/dialogs/PasteNotationDialog.cpp:72
+msgid "Make this the default paste type"
+msgstr "Tee tästä oletus-liittämistyyppi"
+
+#: ../src/gui/dialogs/LyricEditDialog.cpp:53
+msgid "Edit Lyrics"
+msgstr "Muokkaa sanoituksia"
+
+#: ../src/gui/dialogs/LyricEditDialog.cpp:62
+msgid "Lyrics for this segment"
+msgstr "Sanoitukset tälle osalle"
+
+#: ../src/gui/dialogs/LyricEditDialog.cpp:70
+msgid "Add Verse"
+msgstr "Lisää &säkeistö"
+
+#: ../src/gui/dialogs/LyricEditDialog.cpp:84
+#: ../src/gui/dialogs/LyricEditDialog.cpp:106
+#, c-format
+msgid "Verse %1"
+msgstr "Säkeistö %1"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:59
+msgid "Import from Device..."
+msgstr "Tuo laitteelta..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2163
+#: ../src/gui/application/RosegardenGUIApp.cpp:2229
+#: ../src/gui/application/RosegardenGUIApp.cpp:7780
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:87
+#: ../src/sound/AudioFileManager.cpp:664
+#, c-format
+msgid "Cannot download file %1"
+msgstr "Ei voitu poimia tiedostoa %1"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:99
+#, c-format
+msgid "Cannot open file %1"
+msgstr "Ei voitu avata tiedostoa %1"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:106
+#, c-format
+msgid "No devices found in file %1"
+msgstr "Tiedostosta %1 ei löytynyt laitteita"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:113
+msgid "Source device"
+msgstr "Lähdelaite"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:118
+msgid "Import from: "
+msgstr "Tuo lähteestä: "
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:140
+#: ../src/gui/studio/DeviceEditorDialog.cpp:148
+#, c-format
+msgid "Device %1"
+msgstr "Laite %1"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:155
+msgid "Import banks"
+msgstr "Tuo pankit"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:156
+msgid "Import key mappings"
+msgstr "Tuo näppäimistökartoitukset"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:157
+msgid "Import controllers"
+msgstr "Tuo ohjaimet"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:160
+msgid "Import device name"
+msgstr "Tuo laitenimi"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:166
+msgid "Bank import behavior"
+msgstr "Pankin tuonnin käytös"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:168
+msgid "Merge banks"
+msgstr "Sulauta pankit"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:169
+msgid "Overwrite banks"
+msgstr "Kirjoita pankkien päälle"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:367
+msgid "Bank %1:%2"
+msgstr "Pankki %1:%2"
+
+#: ../src/commands/segment/SegmentSplitByRecordingSrcCommand.cpp:42
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:48
+msgid "Split by Recording Source"
+msgstr "Jaa nauhoituslähteen mukaan"
+
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:53
+msgid "Recording Source"
+msgstr "Nauhoittava lähde"
+
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:57
+msgid "Channel:"
+msgstr "Kanava:"
+
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:64
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:75
+msgid "any"
+msgstr "vapaa"
+
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:69
+msgid "Device:"
+msgstr "Laite:"
+
+#: ../src/gui/dialogs/UnusedAudioSelectionDialog.cpp:46
+msgid "Select Unused Audio Files"
+msgstr "Valitse käyttämättömät äänitiedosto"
+
+#: ../src/gui/dialogs/UnusedAudioSelectionDialog.cpp:53
+#: ../src/gui/editors/segment/PlayListView.cpp:36
+msgid "File name"
+msgstr "Tiedoston nimi"
+
+#: ../src/gui/dialogs/UnusedAudioSelectionDialog.cpp:54
+msgid "File size"
+msgstr "Tiedoston koko"
+
+#: ../src/gui/dialogs/UnusedAudioSelectionDialog.cpp:55
+msgid "Last modified date"
+msgstr "Viimeisin muokkauspäivä"
+
+#: ../src/gui/dialogs/UnusedAudioSelectionDialog.cpp:60
+msgid " (not found) "
+msgstr " (ei löydy) "
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:105
+msgid "Audio File Manager"
+msgstr "Äänitiedostojen hallinta"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:126
+msgid ""
+"* Some audio files are encoded at a sample rate different from that of the "
+"JACK audio server.\n"
+"Rosegarden will play them at the correct speed, but they will sound "
+"terrible.\n"
+"Please consider resampling such files externally, or adjusting the sample "
+"rate of the JACK server."
+msgstr ""
+"* Jotkin äänitiedostot on koodattu eri näytetaajuudella kuin mitä JACK-"
+"äänipalvelin käyttää.\n"
+"Rosegarden soittaa ne oikealla nopeudella, mutta ne kuulostavat kauhealta.\n"
+"Ole hyvä, ja harkitse sellaisten tiedostoja ulkoista uudistettua "
+"näytteenottoa, tai sovita JACK-palvelimen näytteenottotaajuus."
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:132
+msgid "&Add Audio File..."
+msgstr "&Lisää äänitiedosto..."
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:135
+msgid "&Unload Audio File"
+msgstr "&Vapauta äänitiedosto"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:140
+msgid "&Play Preview"
+msgstr "&Toiston esikatselu"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:151
+msgid "&Insert into Selected Audio Track"
+msgstr "&Syötä valitulle ääniraidalle"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:155
+msgid "Unload &all Audio Files"
+msgstr "Vapauta &kaikki äänitiedostot"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:159
+msgid "Unload all &Unused Audio Files"
+msgstr "Vapauta kaikki käy&ttämättömät äänitiedostot"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:163
+msgid "&Delete Unused Audio Files..."
+msgstr "Poista &käyttämättömät äänitiedostot..."
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:167
+msgid "&Export Audio File..."
+msgstr "&Vie äänitiedosto..."
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:173
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:180
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:91
+msgid "Duration"
+msgstr "Kesto"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:181
+msgid "Envelope"
+msgstr "Kirje"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:182
+msgid "Sample rate"
+msgstr "Näytetaajuus"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:183
+msgid "Channels"
+msgstr "Kanavat"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:282
+msgid "<no audio files>"
+msgstr "<ei äänitiedostoja>"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:488
+msgid "*.wav|WAV files (*.wav)"
+msgstr "*.wav|WAV-tiedosto (*.wav)"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:489
+msgid "Choose a name to save this file as"
+msgstr "Valitse nimi tälle tallennettavalle tiedostolle"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:499
+msgid "Exporting audio file..."
+msgstr "Viedään äänitiedosto..."
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:609
+msgid ""
+"This will unload audio file \"%1\" and remove all associated segments. Are "
+"you sure?"
+msgstr ""
+"Tämä vapauttaa äänitiedoston \"%1\" ja poistaa kaikki siihen liitetyt osat. "
+"Oletko varma?"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:692
+msgid ""
+"*.wav|WAV files (*.wav)\n"
+"*.*|All files"
+msgstr ""
+"*.wav|WAV-tiedostot (*.wav)\n"
+"*.*|Kaikki tiedostot"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:697
+msgid ""
+"*.wav *.flac *.ogg *.mp3|Audio files (*.wav *.flac *.ogg *.mp3)\n"
+"*.wav|WAV files (*.wav)\n"
+"*.flac|FLAC files (*.flac)\n"
+"*.ogg|Ogg files (*.ogg)\n"
+"*.mp3|MP3 files (*.mp3)\n"
+"*.*|All files"
+msgstr ""
+"*.wav *.flac *.ogg *.mp3|Äänitiedostot (*.wav *.flac *.ogg *.mp3)\n"
+"*.wav|WAV tiedostot (*.wav)\n"
+"*.flac|FLAC tiedostot (*.flac)\n"
+"*.ogg|Ogg tiedostot (*.ogg)\n"
+"*.mp3|MP3 tiedostot (*.mp3)\n"
+"*.*|Kaikki tiedostot"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:704
+msgid "Select one or more audio files"
+msgstr "Valitse yksi tai useampia äänitiedostoja"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:763
+msgid ""
+"This will unload all audio files and remove their associated segments.\n"
+"This action cannot be undone, and associations with these files will be "
+"lost.\n"
+"Files will not be removed from your disk.\n"
+"Are you sure?"
+msgstr ""
+"Tämä vapauttaa kaikki äänitiedostot ja poistaa niihin liitetyt osat.\n"
+"Tätä toimintoa ei voida perua, ja liitännät näihin tiedostoihin menetetään.\n"
+"Tiedostoja ei poisteta kovalevyltäsi.\n"
+"Oletko varma?"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:800
+msgid ""
+"This will unload all audio files that are not associated with any segments "
+"in this composition.\n"
+"This action cannot be undone, and associations with these files will be "
+"lost.\n"
+"Files will not be removed from your disk.\n"
+"Are you sure?"
+msgstr ""
+"Tämä vapauttaa kaikki äänitiedostot, joita ei ole liitetty yhteenkään osaan "
+"tässä sävellyksessä.\n"
+"Tätä toimintoa ei voida perua, ja liitännät näihin tiedostoihin menetetään.\n"
+"Tiedostoja ei poisteta kovalevyltäsi.\n"
+"Oletko varma?"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:865
+msgid ""
+"The following audio files are not used in the current composition.\n"
+"\n"
+"Please select the ones you wish to delete permanently from the hard disk.\n"
+msgstr ""
+"Seuraavia äänitiedostoja ei ole käytetty nykyisessä sävellyksessä.\n"
+"\n"
+"Ole hyvä, ja valitse halutessasi niistä joitakin poistaaksesi ne pysyvästi "
+"kovalevyltäsi.\n"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:875
+#, c-format
+msgid ""
+"_n: <qt>About to delete 1 audio file permanently from the hard disk.<br>This "
+"action cannot be undone, and there will be no way to recover this file."
+"<br>Are you sure?</qt>\n"
+"\n"
+"<qt>About to delete %n audio files permanently from the hard disk.<br>This "
+"action cannot be undone, and there will be no way to recover these files."
+"<br>Are you sure?</qt>"
+msgstr ""
+"Ollaan poistamassa pysyvästi 1 äänitiedosto kovalevyltä.<br>Tätä toimintoa "
+"ei voida perua, ja eikä tapoja palauttaa tätä tiedostoa ole. <br>Oletko "
+"varma?<br>\n"
+"\n"
+"<qt>Ollaan poistamassa pysyvästi %n äänitiedostoa kovalevyltä.<br>Tätä "
+"toimintoa ei voida perua, eikä tapoja palauttaa näitä tiedostoja ole. "
+"<br>Oletko varma?</qt>"
+
+#: ../src/document/RosegardenGUIDoc.cpp:525
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:888
+msgid "File %1 could not be deleted."
+msgstr "Tiedostoa %1 ei voitu poistaa."
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:921
+msgid "Change Audio File label"
+msgstr "Vaihda äänitiedoston otsake"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:6466
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:922
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:1099
+msgid "Enter new label"
+msgstr "Syötä uusi nimi"
+
+#: ../src/gui/application/RosegardenGUIView.cpp:1538
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:1086
+msgid "Adding audio file..."
+msgstr "Lisätään äänitiedosto..."
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:1107
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:1112
+msgid "Failed to add audio file. "
+msgstr "Äänitiedoston lisääminen epäonnistui. "
+
+#: ../src/document/RosegardenGUIDoc.cpp:2789
+#: ../src/gui/application/RosegardenGUIApp.cpp:2736
+#: ../src/gui/application/RosegardenGUIView.cpp:1574
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:1122
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:180
+msgid "Generating audio preview..."
+msgstr "Luodaan äänen esikatselua..."
+
+#: ../src/gui/application/RosegardenGUIView.cpp:1581
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:1130
+msgid ""
+"Try copying this file to a directory where you have write permission and re-"
+"add it"
+msgstr ""
+"Yritä kopioida tämä tiedosto hakemistoon, jonne sinulla on kirjoitusoikeus "
+"ja lisää se uudelleen"
+
+#: ../src/gui/dialogs/TransportDialog.cpp:90 rc.cpp:357
+#, no-c-format
+msgid "Rosegarden Transport"
+msgstr "Rosegarden Kuljetin"
+
+#: ../src/gui/dialogs/TransportDialog.cpp:925
+#: ../src/gui/dialogs/TransportDialog.cpp:985
+msgid "PITCH WHEEL"
+msgstr "SÄVELKORKEUDEN RULLA"
+
+#: ../src/gui/dialogs/TransportDialog.cpp:929
+#: ../src/gui/dialogs/TransportDialog.cpp:989
+msgid "CONTROLLER"
+msgstr "OHJAIN"
+
+#: ../src/gui/dialogs/TransportDialog.cpp:933
+#: ../src/gui/dialogs/TransportDialog.cpp:993
+msgid "PROG CHNGE"
+msgstr "OHJELMAN MUUTOS"
+
+#: ../src/gui/dialogs/TransportDialog.cpp:938
+#: ../src/gui/dialogs/TransportDialog.cpp:998
+msgid "PRESSURE"
+msgstr "PAINE"
+
+#: ../src/gui/dialogs/TransportDialog.cpp:942
+#: ../src/gui/dialogs/TransportDialog.cpp:1002
+msgid "SYS MESSAGE"
+msgstr "JÄRJESTELMÄN VIESTI"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:177
+#: ../src/gui/dialogs/QuantizeDialog.cpp:40
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:127
+msgid "Quantize"
+msgstr "Yksiköi"
+
+#: ../src/gui/dialogs/QuantizeDialog.cpp:52
+msgid "Advanced"
+msgstr "Edistynyt"
+
+#: ../src/gui/dialogs/ExportDeviceDialog.cpp:42
+msgid "Export Devices..."
+msgstr "Vie laitteet..."
+
+#: ../src/gui/dialogs/ExportDeviceDialog.cpp:47
+msgid "Export devices"
+msgstr "Vie laitteet"
+
+#: ../src/gui/dialogs/ExportDeviceDialog.cpp:49
+msgid "Export all devices"
+msgstr "Vie kaikki laitteet"
+
+#: ../src/gui/dialogs/ExportDeviceDialog.cpp:50
+msgid "Export selected device only"
+msgstr "Vie vain valitut laitteet"
+
+#: ../src/gui/dialogs/ExportDeviceDialog.cpp:51
+msgid " (\"%1\")"
+msgstr " (\"%1\")"
+
+#: ../src/gui/dialogs/CompositionLengthDialog.cpp:44
+msgid "Change Composition Length"
+msgstr "Muuta sävellyksen pituus"
+
+#: ../src/gui/dialogs/CompositionLengthDialog.cpp:50
+msgid "Set the Start and End bar markers for this Composition"
+msgstr "Aseta alku- ja lopputahtien kirjanmerkit tälle sävellykselle"
+
+#: ../src/gui/dialogs/CompositionLengthDialog.cpp:54
+msgid "Start Bar"
+msgstr "Alkutahti"
+
+#: ../src/gui/dialogs/CompositionLengthDialog.cpp:62
+msgid "End Bar"
+msgstr "Lopputahti"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:62
+msgid "LilyPond Export/Preview"
+msgstr "LilyPond -vienti/esikatselu"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:85
+msgid "General options"
+msgstr "Yleisvalinnat"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:90
+msgid "Advanced options"
+msgstr "Lisävalinnat"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:112
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:95
+msgid "Headers"
+msgstr "Otsikot"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:106
+msgid "Basic options"
+msgstr "Perusasetukset"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:113
+msgid "Compatibility level"
+msgstr "Yhteensopivuustaso"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:117
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:118
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:119
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:120
+#, c-format
+msgid "LilyPond %1"
+msgstr "LilyPond %1"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:125
+msgid "Paper size"
+msgstr "Paperikoko"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:129
+msgid "A3"
+msgstr "A3"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:130
+msgid "A4"
+msgstr "A4"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:131
+msgid "A5"
+msgstr "A5"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:132
+msgid "A6"
+msgstr "A6"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:133
+msgid "Legal"
+msgstr "Legal"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:134
+msgid "US Letter"
+msgstr "US Letter"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:135
+msgid "Tabloid"
+msgstr "Tabloid"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:136
+msgid "do not specify"
+msgstr "ei määritelty"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:152
+msgid "Font size"
+msgstr "Kirjasinkoko"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:157
+msgid "%1 pt"
+msgstr "%1 pt"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:169
+msgid "Staff level options"
+msgstr "Viivastotason asetukset"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:176
+msgid "Export content"
+msgstr "Vie sisältö"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:179
+msgid "All tracks"
+msgstr "Kaikki raidat"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:180
+msgid "Non-muted tracks"
+msgstr "Vaimentamattomat raidat"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:181
+msgid "Selected track"
+msgstr "Valittu raita"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:182
+msgid "Selected segments"
+msgstr "Valitut osat"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:188
+msgid "Merge tracks that have the same name"
+msgstr "Yhdistä raidat joilla on sama nimi"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:198
+msgid "Notation options"
+msgstr "Nuotinnusasetukset"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:206
+msgid "First"
+msgstr "Ensimmäinen"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:207
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:538
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:557
+msgid "All"
+msgstr "Kaikki"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:211
+msgid "Export tempo marks "
+msgstr "Vie tempomerkinnät"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:215
+msgid "Export lyrics"
+msgstr "Vie sanoitukset"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:225
+msgid "Export beamings"
+msgstr "Vie palkitukset"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:232
+msgid "Export track staff brackets"
+msgstr "Vie viivastoja yhdistävät kaaret"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:244
+msgid "Layout options"
+msgstr "Asettelun valinnat"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:257
+msgid "Lyrics alignment"
+msgstr "Sanoituksien sijainti"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:261
+msgid "Ragged bottom (systems will not be spread vertically across the page)"
+msgstr "Liehuna ladottu alalaita (viivastoja ei levitetä koko sivun poikki)"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:267
+msgid "Miscellaneous options"
+msgstr "Sekalaiset valinnat"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:274
+msgid "Enable \"point and click\" debugging"
+msgstr "Salli \"osoita-ja-klikkaa\" -korjailu"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:279
+msgid "Export \\midi block"
+msgstr "Vie \\midi-lohko"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:284
+msgid "No markers"
+msgstr "Ei merkintöjä"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:285
+msgid "Rehearsal marks"
+msgstr "Hengitysmerkit"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:286
+msgid "Marker text"
+msgstr "Merkintäteksti"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:290
+msgid "Export markers"
+msgstr "Vie merkinnät"
+
+#: ../src/gui/dialogs/AudioSplitDialog.cpp:57
+msgid "Autosplit Audio Segment"
+msgstr "Jaa ääniosa oletusarvoisesti"
+
+#: ../src/gui/dialogs/AudioSplitDialog.cpp:70
+msgid "AutoSplit Segment \""
+msgstr "Jaa oletusarvoisesti osa \""
+
+#: ../src/gui/dialogs/AudioSplitDialog.cpp:84
+msgid "Threshold"
+msgstr "Kynnys"
+
+#: ../src/gui/dialogs/AudioSplitDialog.cpp:142
+msgid "<no preview generated for this audio file>"
+msgstr "<esikatselua ei tehty tälle äänitiedostolle>"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:70
+msgid "Audio Plugin"
+msgstr "Ääni -lisäosa"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:94
+#: ../src/gui/widgets/AudioFaderBox.cpp:136
+msgid "Editor"
+msgstr "Muokkain"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:100
+msgid "Plugin"
+msgstr "Lisäosa"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:105
+msgid "Category:"
+msgstr "Luokka:"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:110
+msgid "Plugin:"
+msgstr "Lisäosa:"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:114
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:398
+msgid "Select a plugin from this list."
+msgstr "Valitse lisäosa tästä listasta."
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:119
+msgid "Bypass"
+msgstr "Ohita"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:121
+msgid "Bypass this plugin."
+msgstr "Ohita tämä lisäosa."
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:127
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:390
+msgid "<ports>"
+msgstr "<portit>"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:130
+msgid "Input and output port counts."
+msgstr "Sisään- ja ulostuloporttien määrä."
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:132
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:391
+msgid "<id>"
+msgstr "<id>"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:135
+msgid "Unique ID of plugin."
+msgstr "Lisäosan uniikki ID."
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:149
+msgid "Copy plugin parameters"
+msgstr "Kopioi lisäosan ominaisuudet"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:155
+msgid "Paste plugin parameters"
+msgstr "Liitä lisäosan ominaisuudet"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:161
+msgid "Set to defaults"
+msgstr "Aseta oletuksiksi"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:225
+msgid "(any)"
+msgstr "(mikä tahansa)"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:226
+msgid "(unclassified)"
+msgstr "(luokittelematon)"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:247
+msgid "(none)"
+msgstr "(ei mikään)"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:389
+#: ../src/gui/editors/parameters/AudioInstrumentParameterPanel.cpp:132
+#: ../src/gui/editors/parameters/AudioInstrumentParameterPanel.cpp:361
+#: ../src/gui/studio/AudioMixerWindow.cpp:685
+#: ../src/gui/studio/AudioMixerWindow.cpp:724
+#: ../src/gui/studio/AudioMixerWindow.cpp:906
+#: ../src/gui/widgets/AudioFaderBox.cpp:79
+msgid "<no plugin>"
+msgstr "<ei lisäosaa>"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:427
+msgid "This plugin has too many controls to edit here."
+msgstr "Tällä lisäosalla on liian monta ohjainta tässä muokattavaksi."
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:438
+#, c-format
+msgid "Id: %1"
+msgstr "Id: %1"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:490
+msgid "mono"
+msgstr "mono"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:492
+msgid "stereo"
+msgstr "stereo"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:494
+msgid "%1 in, %2 out"
+msgstr "%1 sisään, %2 ulos"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:518
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:704
+msgid "Program: "
+msgstr "Ohjelma: "
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:522
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:532
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:708
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:716
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:745
+msgid "<none selected>"
+msgstr "<ei valintaa>"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:56
+msgid "Set the %1 property of the event selection:"
+msgstr "Aseta valitun tapahtuman ominaisuus %1:"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:61
+msgid "Pattern"
+msgstr "Kaava"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:66
+msgid "Flat - set %1 to value"
+msgstr "Alennus - aseta %1 arvoksi"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:70
+msgid "Alternating - set %1 to max and min on alternate events"
+msgstr ""
+"Vaihteleva - aseta %1 suurimmaksi ja pienimmäksi vaihtelevissa tapahtumissa"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:74
+msgid "Crescendo - set %1 rising from min to max"
+msgstr "Crescendo - aseta %1 kasvatettaessa pienimmästä suurimpaan"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:78
+msgid "Diminuendo - set %1 falling from max to min"
+msgstr "Diminuendo - aseta %1 hiljennettäessä suurimmasta pienimpään"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:82
+msgid "Ringing - set %1 alternating from max to min with both dying to zero"
+msgstr ""
+"Värähtelevä - aseta %1 vaihteluväliksi vaimenevan värähtelyn suurimman ja "
+"pienimmän arvon välillä"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:123
+#: ../src/gui/dialogs/EventParameterDialog.cpp:150
+msgid "First Value"
+msgstr "Ensimmäinen arvo"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:124
+#: ../src/gui/dialogs/EventParameterDialog.cpp:151
+msgid "Second Value"
+msgstr "Toinen arvo"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:132
+#: ../src/gui/dialogs/EventParameterDialog.cpp:142
+msgid "Low Value"
+msgstr "Matala arvo"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:133
+#: ../src/gui/dialogs/EventParameterDialog.cpp:141
+msgid "High Value"
+msgstr "Korkea arvo"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:56 ../src/gui/rulers/TempoRuler.cpp:127
+msgid "Insert Tempo Change"
+msgstr "Syötä tempon muutos"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:69
+msgid "New tempo:"
+msgstr "Uusi tempo:"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:76
+msgid "Tap"
+msgstr "Napauta"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:81
+msgid "Tempo is fixed until the following tempo change"
+msgstr "Tempo kiinnitettään seuraavaan tempon muutokseen asti"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:82
+msgid "Tempo ramps to the following tempo"
+msgstr "Tempo viettyy seuraavaan tempoon"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:83
+msgid "Tempo ramps to:"
+msgstr "Tempo viettyy:"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:120
+msgid "Time of tempo change"
+msgstr "Aika jona tempo vaihtuu"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:138
+msgid "The pointer is currently at "
+msgstr "Osoitin on nyt kohdassa "
+
+#: ../src/gui/dialogs/TempoDialog.cpp:154
+msgid "Apply this tempo from here onwards"
+msgstr "Sovella tästedes tätä tempoa"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:158
+msgid "Replace the last tempo change"
+msgstr "Korvaa viimeinen tempomuutos"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:164
+msgid "Apply this tempo from the start of this bar"
+msgstr "Sovella tämän tahdin alusta tätä tempoa"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:167
+msgid "Apply this tempo to the whole composition"
+msgstr "Sovella koko sävellyksen alusta tätä tempoa"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:172
+msgid "Also make this the default tempo"
+msgstr "Aseta tämä tempo myös oletustempoksi"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:256
+msgid "%1.%2 s,"
+msgstr "%1.%2 s,"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:262
+#, c-format
+msgid "at the start of measure %1."
+msgstr "tahdin %1 alussa."
+
+#: ../src/gui/dialogs/TempoDialog.cpp:266
+#, c-format
+msgid "in the middle of measure %1."
+msgstr "keskellä tahtia %1."
+
+#: ../src/gui/dialogs/TempoDialog.cpp:285
+msgid " (at %1.%2 s, in measure %3)"
+msgstr " (kohdassa %1.%2 s, tahdissa %3)"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:302
+msgid "There are no preceding tempo changes."
+msgstr "Edeltäviä tempon muutoksia ei ole."
+
+#: ../src/gui/dialogs/TempoDialog.cpp:310
+msgid "There are no other tempo changes."
+msgstr "Muita tempon muutoksia ei ole."
+
+#: ../src/gui/dialogs/TempoDialog.cpp:328
+msgid " bpm"
+msgstr "bpm"
+
+#: ../src/gui/dialogs/AudioPlayingDialog.cpp:42
+msgid "Playing audio file"
+msgstr "Soitetaan äänitiedosto"
+
+#: ../src/gui/dialogs/AudioPlayingDialog.cpp:47
+msgid "Playing audio file \"%1\""
+msgstr "Soitetaan äänitiedosto \"%1\""
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:52
+#: ../src/gui/editors/matrix/MatrixView.cpp:2655
+msgid "Trigger Segment"
+msgstr "Sysäävä osa"
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:61
+msgid "Trigger segment: "
+msgstr "Sysäävä osa: "
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:59
+msgid "Key Change"
+msgstr "Sävellajin muutos"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:77
+msgid "Key signature"
+msgstr "Sävellajimerkintä"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:80
+msgid "Key transposition"
+msgstr "Avaimen muutos"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:86
+msgid "Existing notes following key change"
+msgstr "Olemassa olevat nuotit seuraavat sävellajin muutosta"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:98
+msgid "Flatten"
+msgstr "Alenna"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:100
+msgid "Key"
+msgstr "Sävellaji"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:105
+msgid "Sharpen"
+msgstr "Korota"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:109
+msgid "Major"
+msgstr "Duuri"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:110
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:369
+msgid "Minor"
+msgstr "Molli"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:123
+msgid "Transpose key according to segment transposition"
+msgstr "Muuta avain osan sävelkorkeusmuutoksen mukaan"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:126
+msgid "Use specified key. Do not transpose"
+msgstr "Käytä tiettyä avainta. Älä muuta avainta"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:134
+msgid "Apply to current segment only"
+msgstr "Sovella vain nykyiseen osaan"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:137
+msgid "Apply to all segments at this time"
+msgstr "Sovella tämän ajan kaikkiin osiin"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:141
+msgid "Exclude percussion segments"
+msgstr "Sivuuta rumpuosat"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:155
+msgid "Maintain current accidentals"
+msgstr "Säilytä nykyiset korotusmerkit"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:158
+msgid "Transpose into this key"
+msgstr "Siirrä tähän sävellajiin"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:331
+msgid "No such key"
+msgstr "Ei sellaista sävellajia"
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:44
+#: ../src/gui/editors/notation/NotationSelector.cpp:118
+msgid "Interpret"
+msgstr "Tulkitse"
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:50
+msgid "Interpretations to apply"
+msgstr "Sovellettavat tulkinnat"
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:53
+msgid "Apply text dynamics (p, mf, ff etc)"
+msgstr "Käytä tekstimuotoisia voimakkuusmerkintöjä (p, mf, ff jne)"
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:55
+msgid "Apply hairpin dynamics"
+msgstr "Käytä hiuspinnin muotoisia voimakkuusmerkintöjä"
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:57
+msgid "Stress beats"
+msgstr "Painota iskuja"
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:59
+msgid "Articulate slurs, staccato, tenuto etc"
+msgstr "Ilmaise kaaret, katkomiset, pidätykset jne"
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:61
+msgid "All available interpretations"
+msgstr "Kaikki käytössä olevat tulkinnat"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:316
+msgid ""
+"Attempted to launch JACK audio daemon failed. Audio will be disabled.\n"
+"Please check configuration (Settings -> Configure Rosegarden -> Audio -> "
+"Startup)\n"
+" and restart."
+msgstr ""
+"Yritys käynnistää JACK-ääni -taustaprosessi epäonnistui. Ääni on pois "
+"käytöstä.\n"
+"Tarkista asetukset (Asetukset -> Määritä Rosegarden -> Ääni -> Aloitus)\n"
+" ja käynnistä uudelleen."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:325
+msgid "Starting sequencer..."
+msgstr "Käynnistetään sekvensseriä..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:333
+msgid "Initializing plugin manager..."
+msgstr "Alustetaan lisäosien hallintaa..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:338
+msgid "Initializing view..."
+msgstr "Alustetaan näkymää..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:354
+msgid "Special Parameters"
+msgstr "Erikoisominaisuudet"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:430
+msgid "Starting sequence manager..."
+msgstr "Aloitetaan sekvensserinhallintaa..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:456
+msgid "Clearing studio data..."
+msgstr "Tyhjennetään studiotietoja..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:475
+#: ../src/gui/editors/notation/NotationView.cpp:558
+msgid "Starting..."
+msgstr "Aloitetaan..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:556
+msgid "Import Rosegarden &Project file..."
+msgstr "Tuo Rosegarden-&projekti -tiedosto..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:560
+msgid "Import &MIDI file..."
+msgstr "Tuo &MIDI tiedosto..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:564
+msgid "Import &Rosegarden 2.1 file..."
+msgstr "Tuo &Rosegarden 2.1 -tiedosto..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:568
+msgid "Import &Hydrogen file..."
+msgstr "Tuo &Hydrogen-tiedosto..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:572
+msgid "Merge &File..."
+msgstr "Sulauta &tiedosto..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:576
+msgid "Merge &MIDI file..."
+msgstr "Sulauta &MIDI-tiedosto..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:580
+msgid "Merge &Rosegarden 2.1 file..."
+msgstr "Sulauta &Rosegarden 2.1 -tiedosto..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:584
+msgid "Merge &Hydrogen file..."
+msgstr "Sulauta &Hydrogen-tiedosto..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:588
+msgid "Export Rosegarden &Project file..."
+msgstr "Vie Rosegarden-&projekti -tiedosto..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:592
+msgid "Export &MIDI file..."
+msgstr "Vie &MIDI-tiedosto..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:596
+msgid "Export &LilyPond file..."
+msgstr "Vie &LilyPond-tiedosto..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:600
+msgid "Export Music&XML file..."
+msgstr "Vie Music&XML-tiedosto..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:604
+msgid "Export &Csound score file..."
+msgstr "Vie &Csound-nuottitiedosto..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:608
+msgid "Export M&up file..."
+msgstr "Vie M&up-tiedosto..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:612
+#: ../src/gui/editors/notation/NotationView.cpp:1500
+msgid "Print &with LilyPond..."
+msgstr "Tulosta &LilyPondilla..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:616
+#: ../src/gui/editors/notation/NotationView.cpp:1504
+msgid "Preview with Lil&yPond..."
+msgstr "Esikatsele &LilyPondilla..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:620
+msgid "Play&list"
+msgstr "S&oittolista"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:627
+msgid "Rosegarden &Tutorial"
+msgstr "Rosegardenin &opetusohjelma"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:631
+msgid "&Bug Reporting Guidelines"
+msgstr "&Virheenraportointiohjeet"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:645
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:348
+#: ../src/gui/editors/segment/MarkerEditor.cpp:378
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:388
+#: ../src/gui/general/EditViewBase.cpp:190
+#: ../src/gui/studio/BankEditorDialog.cpp:318
+#: ../src/gui/studio/DeviceManagerDialog.cpp:227
+msgid "Und&o"
+msgstr "Per&u"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:651
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:354
+#: ../src/gui/editors/segment/MarkerEditor.cpp:384
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:394
+#: ../src/gui/general/EditViewBase.cpp:196
+#: ../src/gui/studio/BankEditorDialog.cpp:324
+#: ../src/gui/studio/DeviceManagerDialog.cpp:233
+msgid "Re&do"
+msgstr "Palau&ta"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:665
+#: ../src/gui/editors/notation/NotationView.cpp:2297
+msgid "Show T&ools Toolbar"
+msgstr "Näytä T&yökalut -työkalupalkki"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:669
+msgid "Show Trac&ks Toolbar"
+msgstr "Näytä Rai&dat -työkalupalkki"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:673
+msgid "Show &Editors Toolbar"
+msgstr "Näytä &Editorit -työkalupalkki"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:677
+#: ../src/gui/editors/notation/NotationView.cpp:2309
+msgid "Show Trans&port Toolbar"
+msgstr "Näytä &Kuljetin -työkalupalkki"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:681
+msgid "Show &Zoom Toolbar"
+msgstr "Näytä &Suurennos -työkalupalkki"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:688
+msgid "Show Tra&nsport"
+msgstr "Näytä Kul&jetin"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:693
+msgid "Show Track &Labels"
+msgstr "Näytä &raitojen nimet"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:698
+msgid "Show Playback Position R&uler"
+msgstr "Näytä Toisto-osoitin -&viivain"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:703
+msgid "Show Te&mpo Ruler"
+msgstr "Näytä Te&mpo-viivain"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:708
+msgid "Show Cho&rd Name Ruler"
+msgstr "Näytä Soi&ntunimi-viivain"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:714
+msgid "Show Segment Pre&views"
+msgstr "Näytä osien &esikatselu"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:719
+msgid "Show Special &Parameters"
+msgstr "Näytä erikois&ominaisuudet"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:753
+#: ../src/gui/editors/matrix/MatrixView.cpp:641
+#: ../src/gui/editors/notation/NotationView.cpp:1772
+msgid "&Select and Edit"
+msgstr "&Valitse ja muokkaa"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:758
+#: ../src/gui/editors/matrix/MatrixView.cpp:646
+msgid "&Draw"
+msgstr "P&iirrä"
+
+#: ../src/commands/edit/EraseCommand.h:50
+#: ../src/gui/application/RosegardenGUIApp.cpp:763
+#: ../src/gui/editors/matrix/MatrixView.cpp:651
+#: ../src/gui/editors/notation/NotationView.cpp:1766
+msgid "&Erase"
+msgstr "&Poista"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:768
+#: ../src/gui/editors/matrix/MatrixView.cpp:656
+msgid "&Move"
+msgstr "&Siirrä"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:775
+msgid "&Resize"
+msgstr "Muuta &kokoa"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:782 rc.cpp:87
+#, no-c-format
+msgid "&Split"
+msgstr "&Jaa"
+
+#: ../src/commands/segment/SegmentJoinCommand.h:53
+#: ../src/gui/application/RosegardenGUIApp.cpp:789
+msgid "&Join"
+msgstr "&Yhdistä"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:795
+msgid "&Harmonize"
+msgstr "&Harmonisoi"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:806
+#: ../src/gui/rulers/TempoRuler.cpp:157
+msgid "Open Tempo and Time Signature Editor"
+msgstr "Avaa tempo- ja tahtilajimerkinnän muokkain"
+
+#: ../src/commands/segment/CutRangeCommand.cpp:41
+#: ../src/gui/application/RosegardenGUIApp.cpp:812
+msgid "Cut Range"
+msgstr "Leikkaa alue"
+
+#: ../src/commands/edit/CopyCommand.cpp:73
+#: ../src/gui/application/RosegardenGUIApp.cpp:816
+msgid "Copy Range"
+msgstr "Kopioi alue"
+
+#: ../src/commands/segment/PasteRangeCommand.cpp:45
+#: ../src/gui/application/RosegardenGUIApp.cpp:820
+msgid "Paste Range"
+msgstr "Liitä alue"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:828
+msgid "Insert Range..."
+msgstr "Syötä alue..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:832
+#: ../src/gui/editors/notation/NotationView.cpp:1804
+msgid "De&lete"
+msgstr "&Poista"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:836
+msgid "Select &All Segments"
+msgstr "Valitse &kaikki osat"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:852
+msgid "Edit Mar&kers..."
+msgstr "Muokkaa mer&kintöjä..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:856
+msgid "Edit Document P&roperties..."
+msgstr "Muuta dokumentin o&minaisuuksia..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:864
+msgid "Open in &Default Editor"
+msgstr "Avaa &oletusmuokkaimessa"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:870
+#: ../src/gui/general/EditViewBase.cpp:206
+msgid "Open in Matri&x Editor"
+msgstr "Avaa matrii&simuokkaimessa"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:876
+#: ../src/gui/general/EditViewBase.cpp:212
+msgid "Open in &Percussion Matrix Editor"
+msgstr "Avaa &rumpumatriisimuokkaimessa"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:882
+#: ../src/gui/general/EditViewBase.cpp:218
+msgid "Open in &Notation Editor"
+msgstr "Avaa &nuotintajassa"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:888
+#: ../src/gui/general/EditViewBase.cpp:224
+msgid "Open in &Event List Editor"
+msgstr "Avaa &tapahtumalistamuokkaimessa"
+
+#: ../src/commands/edit/EventQuantizeCommand.cpp:120
+#: ../src/commands/edit/EventUnquantizeCommand.cpp:87
+#: ../src/gui/application/RosegardenGUIApp.cpp:894
+msgid "&Quantize..."
+msgstr "&Yksiköi..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:908
+#: ../src/gui/editors/matrix/MatrixView.cpp:686
+msgid "Repeat Last Quantize"
+msgstr "Uusi viimeinen yksiköinti"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:928
+msgid "Split at Time..."
+msgstr "Jaa ajan kohdalla..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:932
+#: ../src/gui/general/EditView.cpp:796
+msgid "Jog &Left"
+msgstr "Tönäise &vasemmalle"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:936
+#: ../src/gui/general/EditView.cpp:800
+msgid "Jog &Right"
+msgstr "Tönäise &oikealle"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:940
+msgid "Set Start Time..."
+msgstr "Aseta alkuaika..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:944
+msgid "Set Duration..."
+msgstr "Aseta kesto..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:953
+msgid "Turn Re&peats into Copies"
+msgstr "Muuta tois&tomerkinnät jäljennöksiksi"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:958
+msgid "Manage Tri&ggered Segments"
+msgstr "Hallitse &liipaistuja osia"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:962
+msgid "Set Tempos from &Beat Segment"
+msgstr "Aseta &tempot iskualaosasta"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:966
+msgid "Set &Tempo to Audio Segment Duration"
+msgstr "Aseta &tempo ääniosakestoksi"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:972
+msgid "Manage A&udio Files"
+msgstr "Hallitse ää&nitiedostoja"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:977
+msgid "Show Segment Labels"
+msgstr "Näytä osien nimet"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:986
+msgid "Add &Track"
+msgstr "Lisää &raita"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:990
+msgid "&Add Tracks..."
+msgstr "Lisää rai&toja..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:996
+msgid "D&elete Track"
+msgstr "P&oista raita"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1002
+msgid "Move Track &Down"
+msgstr "Siirrä raita &alas"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1008
+msgid "Move Track &Up"
+msgstr "Siirrä raita &ylös"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1012
+msgid "Select &Next Track"
+msgstr "Valitse &seuraava raita"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1017
+msgid "Select &Previous Track"
+msgstr "Valitse &edellinen raita"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1022
+msgid "Mute or Unmute Track"
+msgstr "Kytke raidan vaimennus päälle tai pois"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1027
+msgid "Arm or Un-arm Track for Record"
+msgstr "Kytke raidalle nauhoitus päälle tai pois"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1034
+msgid "&Mute all Tracks"
+msgstr "&Vaimenna kaikki raidat"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1040
+msgid "&Unmute all Tracks"
+msgstr "Poista vai&mennus kaikista raidoista"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1044
+msgid "&Remap Instruments..."
+msgstr "Kartoita instrumentit &uudelleen..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1053
+msgid "&Audio Mixer"
+msgstr "Ääni&sekoitin"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1059
+msgid "Midi Mi&xer"
+msgstr "&MIDI-sekoitin"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1065
+msgid "Manage MIDI &Devices"
+msgstr "Hallitse MIDI-&laitteita"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1071
+msgid "Manage S&ynth Plugins"
+msgstr "Hallitse S&ynth lisäosia"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1075
+msgid "Modify MIDI &Filters"
+msgstr "Muuta MIDI-&suodattimia"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1079
+msgid "MIDI Thru Routing"
+msgstr "MIDI Thru -reititys"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1085
+msgid "Manage &Metronome"
+msgstr "Hallitse &Metronomia"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1089
+msgid "&Save Current Document as Default Studio"
+msgstr "&Tallenna nykyinen dokumentti oletusstudioksi"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1093
+msgid "&Import Default Studio"
+msgstr "Tuo &oletusstudio"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1097
+msgid "Im&port Studio from File..."
+msgstr "Tuo &studio tiedostosta..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1101
+msgid "&Reset MIDI Network"
+msgstr "&Palauta MIDI-verkko alkutilaan"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1105
+#, fuzzy
+msgid "Set Quick Marker at Playback Position"
+msgstr "Syötä merkintä toisto-osoittimen kohdalle"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1109
+msgid "Jump to Quick Marker"
+msgstr "Hyppää pikamerkintään"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1142
+#: ../src/gui/editors/matrix/MatrixView.cpp:782
+#: ../src/gui/editors/notation/NotationView.cpp:2397
+#: ../src/gui/studio/AudioMixerWindow.cpp:105
+#: ../src/gui/studio/MidiMixerWindow.cpp:81
+msgid "&Play"
+msgstr "&Toista"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1153
+#: ../src/gui/editors/matrix/MatrixView.cpp:791
+#: ../src/gui/editors/notation/NotationView.cpp:2406
+#: ../src/gui/studio/AudioMixerWindow.cpp:114
+#: ../src/gui/studio/MidiMixerWindow.cpp:90
+msgid "&Stop"
+msgstr "&Pysäytä"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1160
+#: ../src/gui/editors/matrix/MatrixView.cpp:802
+#: ../src/gui/editors/notation/NotationView.cpp:2417
+#: ../src/gui/studio/AudioMixerWindow.cpp:125
+#: ../src/gui/studio/MidiMixerWindow.cpp:101
+msgid "&Fast Forward"
+msgstr "&Kelaa eteenpäin"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1168
+#: ../src/gui/editors/matrix/MatrixView.cpp:796
+#: ../src/gui/editors/notation/NotationView.cpp:2411
+#: ../src/gui/studio/AudioMixerWindow.cpp:119
+#: ../src/gui/studio/MidiMixerWindow.cpp:95
+msgid "Re&wind"
+msgstr "&Kelaa taaksepäin"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1175
+msgid "P&unch in Record"
+msgstr "L&yö sisään nauhoitus"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1182
+#: ../src/gui/studio/AudioMixerWindow.cpp:143
+#: ../src/gui/studio/MidiMixerWindow.cpp:119
+msgid "&Record"
+msgstr "&Nauhoita"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1189
+#: ../src/gui/editors/matrix/MatrixView.cpp:808
+#: ../src/gui/editors/notation/NotationView.cpp:2423
+#: ../src/gui/studio/AudioMixerWindow.cpp:131
+#: ../src/gui/studio/MidiMixerWindow.cpp:107
+msgid "Rewind to &Beginning"
+msgstr "Kelaa &alkuun"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1196
+#: ../src/gui/editors/matrix/MatrixView.cpp:814
+#: ../src/gui/editors/notation/NotationView.cpp:2429
+#: ../src/gui/studio/AudioMixerWindow.cpp:137
+#: ../src/gui/studio/MidiMixerWindow.cpp:113
+msgid "Fast Forward to &End"
+msgstr "Kelaa &loppuun"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1203
+#: ../src/gui/editors/matrix/MatrixView.cpp:832
+#: ../src/gui/editors/notation/NotationView.cpp:2447
+msgid "Scro&ll to Follow Playback"
+msgstr "Vi&eritä toiston mukana"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1209
+#: ../src/gui/editors/matrix/MatrixView.cpp:838
+#: ../src/gui/editors/notation/NotationView.cpp:2453
+#: ../src/gui/studio/AudioMixerWindow.cpp:149
+#: ../src/gui/studio/MidiMixerWindow.cpp:125
+msgid "Panic"
+msgstr "Paniikki"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1213
+msgid "Segment Debug Dump "
+msgstr "Osan virheiden kippaus korjausta varten"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1283
+msgid " Zoom: "
+msgstr " Suurennos: "
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1719
+msgid "File \"%1\" does not exist"
+msgstr "Tiedosta \"%1\" ei ole olemassa"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1725
+msgid "File \"%1\" is actually a directory"
+msgstr "Tiedosto \"%1\" onkin tiedosto"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1734
+msgid "You do not have read permission for \"%1\""
+msgstr "Sinulla ei ole lukuoikeuksia kohteeseen \"%1\""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1802
+msgid ""
+"An auto-save file for this document has been found\n"
+"Do you want to open it instead ?"
+msgstr ""
+"Löydettiin tämän dokumentin ajonaikainen tallenne.\n"
+"Haluatko avata sen tämän asemesta?"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1896
+msgid "Example Files"
+msgstr "Esimerkkitiedostot"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2100
+msgid "Opening a new application window..."
+msgstr "Avataan uutta sovellusikkunaa..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2110
+msgid "Creating new document..."
+msgstr "Luodaan uutta dokumenttia..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2154
+#, c-format
+msgid ""
+"Malformed URL\n"
+"%1"
+msgstr ""
+"Huonosti muotoiltu Web-osoite\n"
+"%1"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2179
+#: ../src/gui/application/RosegardenGUIApp.cpp:2240
+msgid "Opening file..."
+msgstr "Tiedoston avaus..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2201
+#: ../src/gui/application/RosegardenGUIApp.cpp:2220
+msgid "Open File"
+msgstr "Avaa tiedosto"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1225
+#: ../src/gui/application/RosegardenGUIApp.cpp:2258
+msgid "Saving file..."
+msgstr "Tiedoston tallennus..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2330
+msgid "This is not a valid filename.\n"
+msgstr "Tämä ei ole kelpo tiedostonnimi.\n"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2335
+msgid "This is not a local file.\n"
+msgstr "Tämä ei ole paikallinen tiedosto.\n"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2342
+#: ../src/gui/studio/BankEditorDialog.cpp:1640
+#: ../src/gui/studio/DeviceManagerDialog.cpp:787
+msgid "You have specified a directory"
+msgstr "Olet määrittänyt tiedoston"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2348
+#: ../src/gui/studio/BankEditorDialog.cpp:1646
+#: ../src/gui/studio/DeviceManagerDialog.cpp:793
+msgid "The specified file exists. Overwrite?"
+msgstr "Määritetty tiedosto on jo olemassa. Kirjoitetaanko päälle?"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2362
+msgid "Saving file with a new filename..."
+msgstr "Tallennetaan tiedosto uudella nimellä..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2364
+msgid "Rosegarden files"
+msgstr "Rosegarden-tiedostot"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2365
+#: ../src/gui/application/RosegardenGUIApp.cpp:4860
+#: ../src/gui/application/RosegardenGUIApp.cpp:4904
+#: ../src/gui/application/RosegardenGUIApp.cpp:4942
+#: ../src/gui/application/RosegardenGUIApp.cpp:4975
+#: ../src/gui/application/RosegardenGUIApp.cpp:5009
+#: ../src/gui/application/RosegardenGUIApp.cpp:5116
+msgid "All files"
+msgstr "Kaikki tiedostot"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2366
+msgid "Save as..."
+msgstr "Tallenna nimellä..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2404
+msgid "Closing file..."
+msgstr "Suljetaan tiedosto..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2421
+#: ../src/gui/editors/notation/NotationView.cpp:4618
+msgid "Printing..."
+msgstr "Tulostetaan..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2433
+#: ../src/gui/editors/notation/NotationView.cpp:4635
+msgid "Previewing..."
+msgstr "Esikatsellaan..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2440
+msgid "Exiting..."
+msgstr "Lopetetaan..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2463
+msgid "Cutting selection..."
+msgstr "Leikataan valintaa..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2474
+#: ../src/gui/editors/matrix/MatrixView.cpp:1614
+#: ../src/gui/editors/notation/NotationView.cpp:4763
+msgid "Copying selection to clipboard..."
+msgstr "Kopioidaan valintaa leikepöydälle..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2484
+#: ../src/gui/editors/eventlist/EventView.cpp:878
+#: ../src/gui/editors/matrix/MatrixView.cpp:1625
+#: ../src/gui/editors/notation/NotationView.cpp:4796
+#: ../src/gui/editors/notation/NotationView.cpp:4841
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:352
+msgid "Clipboard is empty"
+msgstr "Leikepöytä on tyhjä"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2487
+#: ../src/gui/editors/eventlist/EventView.cpp:882
+#: ../src/gui/editors/matrix/MatrixView.cpp:1629
+#: ../src/gui/editors/notation/NotationView.cpp:4804
+#: ../src/gui/editors/notation/NotationView.cpp:4845
+msgid "Inserting clipboard contents..."
+msgstr "Syötetään leikepöydän tietoja..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2556
+msgid "Duration of empty range to insert"
+msgstr "Syötettävän tyhjän alueen kesto"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2631
+msgid "This function needs no more than one segment to be selected."
+msgstr "Tämä toiminto ei tarvitse kuin yhden valitun osan."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2654
+msgid "Can't join Audio segments"
+msgstr "Ei voitu liittää ääniosia"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2707
+msgid "rescaling an audio file"
+msgstr "uudelleenmitoitetaan äänitiedosto"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2723
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:172
+msgid "Rescaling audio file..."
+msgstr "Uudelleenmitoitetaan äänitiedosto..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2767
+msgid ""
+"The audio file path does not exist or is not writable.\n"
+"You must set the audio file path to a valid directory in Document Properties "
+"before %1.\n"
+"Would you like to set it now?"
+msgstr ""
+"Äänitiedostopolkua ei ole tai siihen kirjoittaminen ei onnistu.\n"
+"Aseta äänitiedostopoluksi kelpo hakemisto Dokumentin ominaisuuksista ennen %"
+"1.\n"
+"Haluatko asettaa sen nyt?"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2769
+#: ../src/gui/application/RosegardenGUIApp.cpp:5291
+#: ../src/gui/application/RosegardenGUIApp.cpp:5339
+#: ../src/gui/editors/segment/TrackButtons.cpp:419
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:159
+msgid "Set audio file path"
+msgstr "Aseta äänitiedostopolku"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2833
+msgid "Jog Selection"
+msgstr "Askella valinta"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2978
+#, c-format
+msgid ""
+"_n: Split Segment at Time\n"
+"Split %n Segments at Time"
+msgstr ""
+"Jaa osa ajankohdasta\n"
+"Jaa %n osaa ajankohdasta"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3013
+#: ../src/gui/general/EditViewBase.cpp:619
+msgid "Segment Start Time"
+msgstr "Osan alkuaika"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3023
+msgid "Set Segment Start Times"
+msgstr "Aseta osan alkuajat"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3024
+#: ../src/gui/general/EditViewBase.cpp:626
+msgid "Set Segment Start Time"
+msgstr "Aseta osan alkuaika"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3056
+#: ../src/gui/general/EditViewBase.cpp:644
+msgid "Segment Duration"
+msgstr "Osan kesto"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3068
+msgid "Set Segment Durations"
+msgstr "Aseta osan kestot"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3069
+#: ../src/gui/general/EditViewBase.cpp:652
+msgid "Set Segment Duration"
+msgstr "Aseta osan kesto"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3176
+#: ../src/gui/application/RosegardenGUIApp.cpp:5875
+msgid "Set Global Tempo"
+msgstr "Aseta yleistempo"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3234
+#: ../src/gui/general/EditViewBase.cpp:477
+msgid "Toggle the toolbar..."
+msgstr "Kytke työkalupalkki..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3244
+msgid "Toggle the tools toolbar..."
+msgstr "Kytke Työkalut -työkalupalkki..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3254
+msgid "Toggle the tracks toolbar..."
+msgstr "Kytke Raidat - työkalupalkki..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3264
+msgid "Toggle the editor toolbar..."
+msgstr "Kytke Muokkain -työkalupalkki..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3274
+msgid "Toggle the transport toolbar..."
+msgstr "Kytke Kuljetin -työkalupalkki..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3284
+msgid "Toggle the zoom toolbar..."
+msgstr "Kytke Suurennos -työkalupalkki..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3294
+msgid "Toggle the Transport"
+msgstr "Kytke Kuljetin"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3377
+#: ../src/gui/general/EditViewBase.cpp:487
+msgid "Toggle the statusbar..."
+msgstr "Kytke tilapalkki..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3434
+msgid ""
+"The join tool isn't implemented yet. Instead please highlight the segments "
+"you want to join and then use the menu option:\n"
+"\n"
+" Segments->Collapse Segments.\n"
+msgstr ""
+"Liitäntätyökalua ei ole vielä toteutettu. Ole hyvä, ja valitse osat jotka "
+"halua liittää yhteen ja käytä sitten valikon kohtaa:\n"
+"\n"
+" Osat -> Taita osat kokoon.\n"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3437
+msgid "Join tool not yet implemented"
+msgstr "Liitäntätyökalua ei ole toteutettu vielä"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3675
+msgid "Revert modified document to previous saved version?"
+msgstr "Palauta muutettu dokumentti aikaisemmaksi tallennetuksi versioksi?"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3691
+msgid ""
+"*.rgp|Rosegarden Project files\n"
+"*|All files"
+msgstr ""
+"*.rgp|Rosegarden-projekti -tiedostot\n"
+"*|Kaikki tiedostot"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3692
+msgid "Import Rosegarden Project File"
+msgstr "Tuo Rosegarden-projekti -tiedosto"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3717
+msgid "Failed to import project file \"%1\""
+msgstr "Projektitiedoston \"%1\" tuonti epäonnistui"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3739
+msgid "Open MIDI File"
+msgstr "Avaa MIDI-tiedosto"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3756
+msgid "Merge MIDI File"
+msgstr "Sulauta MIDI-tiedosto"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3866
+msgid "Importing MIDI file..."
+msgstr "Tuo MIDI-tiedosto..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3903
+msgid "Calculating notation..."
+msgstr "Lasketaan nuotinnusta..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3950
+msgid "Calculate Notation"
+msgstr "Laske nuotinnus"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3991
+#: ../src/gui/application/RosegardenGUIApp.cpp:4008
+msgid ""
+"*.rose|Rosegarden-2 files\n"
+"*|All files"
+msgstr ""
+"*.rose|Rosegarden-2 -tiedostot\n"
+"*|Kaikki tiedostot"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3992
+#: ../src/gui/application/RosegardenGUIApp.cpp:4009
+msgid "Open Rosegarden 2.1 File"
+msgstr "Avaa Rosegarden 2.1 -tiedosto"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4026
+msgid "Importing Rosegarden 2.1 file..."
+msgstr "Tuo Rosegarden 2.1 -tiedosto..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4052
+msgid "Can't load Rosegarden 2.1 file. It appears to be corrupted."
+msgstr ""
+"Ei voitu ladata Rosegarden 2.1 -tiedostoa. Se näyttää olevan viallinen."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4078
+#: ../src/gui/application/RosegardenGUIApp.cpp:4095
+msgid ""
+"*.h2song|Hydrogen files\n"
+"*|All files"
+msgstr ""
+"*.h2song|Hydrogen-tiedostot\n"
+"*|Kaikki tiedostot"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4079
+#: ../src/gui/application/RosegardenGUIApp.cpp:4096
+msgid "Open Hydrogen File"
+msgstr "Avaa Hydrogen-tiedosto"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4113
+msgid "Importing Hydrogen file..."
+msgstr "Tuo Hydrogen-tiedosto..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4139
+msgid "Can't load Hydrogen file. It appears to be corrupted."
+msgstr "Ei voitu ladata Hydrogen-tiedostoa. Se näyttää olevan viallinen."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4527
+msgid "Export and import of Rosegarden Project files"
+msgstr "Vie ja tuo Rosegarden-projekti -tiedostoja"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4529
+msgid "The Rosegarden Project Packager helper script"
+msgstr "Rosegarden-projekti -pakkaajan apuohjelma"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4533
+msgid "%1 - for project file support"
+msgstr "%1 - projektitiedoston tukea varten"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4550
+msgid "The Rosegarden LilyPondView helper script"
+msgstr "Rosegardenin LilyPondView apuohjelma"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4554
+msgid "%1 - for LilyPond preview support"
+msgstr "%1 - LilyPond-esikatselutuki"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4570
+msgid "The Rosegarden Audio File Importer helper script"
+msgstr "Rosegardenin äänitiedostotuonnien apuohjelma"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4574
+msgid "%1 - for audio file import"
+msgstr "%1- äänitiedostojen tuotia varten"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4585
+msgid ""
+"<h3>Helper programs not found</h3><p>Rosegarden could not find one or more "
+"helper programs which it needs to provide some features. The following "
+"features will not be available:</p>"
+msgstr ""
+"<h3>Apuohjelmia ei löytynyt</h3><p>Rosegarden ei voinut löytää yhtä tai "
+"useampaa apuohjelmaa mitä tarvitaan joidenkin toimintojen käyttöä varten. "
+"Seuraavat toiminnot eivät ole käytössä:</p>"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4586
+#: ../src/gui/application/RosegardenGUIApp.cpp:4592
+msgid "<ul>"
+msgstr "<ul>"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4588
+#: ../src/gui/application/RosegardenGUIApp.cpp:4594
+msgid "<li>%1</li>"
+msgstr "<li>%1</li>"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4590
+#: ../src/gui/application/RosegardenGUIApp.cpp:4596
+msgid "</ul>"
+msgstr "</ul>"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4591
+msgid ""
+"<p>To fix this, you should install the following additional programs:</p>"
+msgstr "<p>Korjataksesi tämän sinun täytyy asentaa seuraavat lisäohjelmat:</p>"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4603
+msgid "Helper programs not found"
+msgstr "Apuohjelmia ei löytynyt"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4686
+msgid "Starting the sequencer..."
+msgstr "Avataan sekvensseriä..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4712
+msgid "Couldn't start the sequencer"
+msgstr "Ei voitu aloittaa sekvensseriä"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4789
+msgid "Clearing down jackd..."
+msgstr "Ajetaan alas jackd..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4803
+msgid "Starting jackd..."
+msgstr "Aloitetaan jackd..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4842
+msgid ""
+"The Rosegarden sequencer process has exited unexpectedly. Sound and "
+"recording will no longer be available for this session.\n"
+"Please exit and restart Rosegarden to restore sound capability."
+msgstr ""
+"Rosegardenin sekvensseriprosessi keskeytyi odottamatta. Ääni ja tallennus "
+"ei ole enää käytössä tässä istunnossa.\n"
+"Ole hyvä, sulje ja käynnistä uudelleen Rosegarden palauttaaksesi "
+"äänitoiminnot."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4846
+msgid ""
+"The Rosegarden sequencer could not be started, so sound and recording will "
+"be unavailable for this session.\n"
+"For assistance with correct audio and MIDI configuration, go to http://"
+"rosegardenmusic.com."
+msgstr ""
+"Rosegardenin sekvensseriprosessi keskeytyi odottamatta. Ääni ja tallennus "
+"ei ole enää käytössä tässä istunnossa.\n"
+"Saadaksesi apua korjaamaan ääni- ja MIDI-asetukset, mene sivulle http://"
+"rosegardenmusic.com."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4856
+msgid "Exporting Rosegarden Project file..."
+msgstr "Viedään Rosegarden-projekti -tiedosto..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4859
+msgid "Rosegarden Project files\n"
+msgstr "Rosegarden-projekti -tiedostot\n"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4861
+#: ../src/gui/application/RosegardenGUIApp.cpp:4905
+#: ../src/gui/application/RosegardenGUIApp.cpp:4943
+#: ../src/gui/application/RosegardenGUIApp.cpp:4976
+#: ../src/gui/application/RosegardenGUIApp.cpp:5010
+#: ../src/gui/application/RosegardenGUIApp.cpp:5116
+msgid "Export as..."
+msgstr "Vie..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4875
+#, c-format
+msgid "Saving Rosegarden file to package failed: %1"
+msgstr "Tallennetaan Rosegarden-tiedosto pakkaukseen epäonnistui: %1"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4889
+msgid "Failed to export to project file \"%1\""
+msgstr "Projektitiedoston \"%1\" vienti epäonnistui"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4900
+#: ../src/gui/application/RosegardenGUIApp.cpp:4915
+msgid "Exporting MIDI file..."
+msgstr "Viedään MIDI-tiedosto..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4903
+msgid "Standard MIDI files\n"
+msgstr "Vakiomuotoiset MIDI-tiedostot\n"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4934
+#: ../src/gui/application/RosegardenGUIApp.cpp:4966
+#: ../src/gui/application/RosegardenGUIApp.cpp:4999
+#: ../src/gui/application/RosegardenGUIApp.cpp:5103
+#: ../src/gui/application/RosegardenGUIApp.cpp:5140
+#: ../src/gui/editors/notation/NotationView.cpp:4733
+msgid "Export failed. The file could not be opened for writing."
+msgstr "Vienti epäonnistui. Tiedostoa ei voitu avata kirjoittamista varten."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4940
+#: ../src/gui/application/RosegardenGUIApp.cpp:4952
+msgid "Exporting Csound score file..."
+msgstr "Viedään Csound-nuotti -tiedosto..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4972
+#: ../src/gui/application/RosegardenGUIApp.cpp:4985
+msgid "Exporting Mup file..."
+msgstr "Viedään Mup-tiedosto..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4975
+msgid "Mup files\n"
+msgstr "Mup-tiedostot\n"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5005
+#: ../src/gui/application/RosegardenGUIApp.cpp:5089
+#: ../src/gui/editors/notation/NotationView.cpp:4719
+msgid "Exporting LilyPond file..."
+msgstr "Viedään LilyPond-tiedosto..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5008
+msgid "LilyPond files"
+msgstr "LilyPond-tiedostot"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5023
+#: ../src/gui/editors/notation/NotationView.cpp:4653
+msgid "Printing LilyPond file..."
+msgstr "Tulostetaan LilyPond-tiedosto..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5028
+#: ../src/gui/application/RosegardenGUIApp.cpp:5052
+#: ../src/gui/editors/notation/NotationView.cpp:4658
+#: ../src/gui/editors/notation/NotationView.cpp:4682
+msgid "Failed to open a temporary file for LilyPond export."
+msgstr "LilyPond-viennin väliaikaisen tiedoston lataaminen epäonnistui."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5047
+#: ../src/gui/editors/notation/NotationView.cpp:4677
+msgid "Previewing LilyPond file..."
+msgstr "Esikatsellaan LilyPond-tiedostoa..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5080
+#: ../src/gui/editors/notation/NotationView.cpp:4710
+msgid "LilyPond Preview Options"
+msgstr "LilyPond-esikatselun ominaisuudet"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5081
+#: ../src/gui/editors/notation/NotationView.cpp:4711
+msgid "LilyPond preview options"
+msgstr "LilyPond-esikatselun ominaisuudet"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5112
+#: ../src/gui/application/RosegardenGUIApp.cpp:5126
+msgid "Exporting MusicXML file..."
+msgstr "Viedään MusicXML-tiedosto..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5115
+msgid "XML files"
+msgstr "XML-tiedostot"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5289
+#: ../src/gui/editors/segment/TrackButtons.cpp:417
+msgid ""
+"The audio file path does not exist or is not writable.\n"
+"Please set the audio file path to a valid directory in Document Properties "
+"before recording audio.\n"
+"Would you like to set it now?"
+msgstr ""
+"Äänitiedostopolkua ei ole tai kirjoitus siihen ei onnistu.\n"
+"Ole hyvä ja aseta äänitiedostopoluksi kelpo hakemisto Dokumentin "
+"ominaisuuksista ennen nauhoittamista.\n"
+"Haluatko asettaa sen nyt?"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5337
+msgid ""
+"The audio file path does not exist or is not writable.\n"
+"Please set the audio file path to a valid directory in Document Properties "
+"before you start to record audio.\n"
+"Would you like to set it now?"
+msgstr ""
+"Äänitiedostopolkua ei ole tai kirjoitus siihen ei onnistu.\n"
+"Ole hyvä ja aseta äänitiedostopoluksi kelpo hakemisto Dokumentin "
+"ominaisuuksista ennen nauhoittamista.\n"
+"Haluatko asettaa sen nyt?"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5780
+msgid "Move playback pointer to time"
+msgstr "Sirrä toisto-osoitin ajan kohdalle"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5793
+#: ../src/gui/editors/matrix/MatrixView.cpp:2240
+msgid "%1%"
+msgstr "%1%"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5861
+#, c-format
+msgid "Replace Tempo Change at %1"
+msgstr "Korvaa tempon vaihto kohdassa %1"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5891
+msgid "Set Global and Default Tempo"
+msgstr "Aseta yleinen ja oletustempo"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5914
+msgid "Move Tempo Change"
+msgstr "Siirrä tempomuutos"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5949
+#, fuzzy
+msgid "new marker"
+msgstr "Ei merkintöjä"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5950
+#, fuzzy
+msgid "no description"
+msgstr "Kuvaus:"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:6363
+#, c-format
+msgid "Sequencer failed to add audio file %1"
+msgstr "Sekvensseri epäonnistui yrittäessään lisätä äänitiedoston %1"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:6388
+#, c-format
+msgid "Sequencer failed to remove audio file id %1"
+msgstr "Sekvensseri epäonnistui yrittäessään poistaa äänitiedoston %1"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:6448
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:1086
+msgid "Modify Segment label"
+msgstr "Muuta osan nimeä"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:6450
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:1088
+msgid "Modify Segments label"
+msgstr "Muuta osien nimiä"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:6452
+msgid "Relabelling selection..."
+msgstr "Nimeä uudelleen valinta..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7539
+msgid "Play List"
+msgstr "Soittolista"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7567
+msgid "http://rosegarden.sourceforge.net/tutorial/en/chapter-0.html"
+msgstr "http://rosegarden.sourceforge.net/tutorial/en/chapter-0.html"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7574
+msgid "http://rosegarden.sourceforge.net/tutorial/bug-guidelines.html"
+msgstr "http://rosegarden.sourceforge.net/tutorial/bug-guidelines.html"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7650
+msgid "Queueing MIDI panic events for tranmission..."
+msgstr "Jonotetaan MIDI:n paniikkitapahtumat lähettämistä varten..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7708
+msgid "Are you sure you want to save this as your default studio?"
+msgstr "Haluatko todella tallentaa tämän oletusstudioksesi?"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7713
+msgid "Saving current document as default studio..."
+msgstr "Tallennetaan nykyinen dokumentti oletusstudioksi..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7738
+msgid ""
+"Are you sure you want to import your default studio and lose the current one?"
+msgstr ""
+"Haluatko todella tuoda oletusstudiosi ja hävittää tämänhetkisen studion?"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7773
+msgid "Import Studio from File"
+msgstr "Tuo studio tiedostosta"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7807
+msgid "Import Studio"
+msgstr "Tuo studio"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:8015
+msgid ""
+"<h3>Newer version available</h3><p>A newer version of Rosegarden may be "
+"available.<br>Please consult the <a href=\"http://www.rosegardenmusic.com/"
+"getting/\">Rosegarden website</a> for more information.</p>"
+msgstr ""
+"<h3>Uudempi versio saatavilla</h3><p>Uudempi Rosegardenin versio voi olla "
+"saatavilla.<br>Ole hyvä ja katso lisätietoja <a href=\"http://www."
+"rosegardenmusic.com/getting/\">Rosegardenin nettisivulta</a>."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:8016
+msgid "Newer version available"
+msgstr "Uudempi versio saatavilla"
+
+#: ../src/gui/application/RosegardenApplication.cpp:104
+#, c-format
+msgid "Failed to load soundfont %1"
+msgstr "Äänikirjasimen %1 lataaminen epäonnistui"
+
+#: ../src/gui/application/main.cpp:311
+msgid "Rosegarden - A sequencer and musical notation editor"
+msgstr "Rosegarden - Sekvensseri ja nuotintaja"
+
+#: ../src/gui/application/main.cpp:315
+msgid "Don't use the sequencer (support editing only)"
+msgstr "Älä käytä sekvensseriä (vain muokkaustuki)"
+
+#: ../src/gui/application/main.cpp:316
+msgid "Don't show the splash screen"
+msgstr "Älä näytä alun roiskeruutua"
+
+#: ../src/gui/application/main.cpp:317
+msgid "Don't automatically run in the background"
+msgstr "Älä aja automaatisesti taustalla"
+
+#: ../src/gui/application/main.cpp:318
+msgid "Attach to a running sequencer process, if found"
+msgstr "Kiinnitä ajossa olevaan sekvensseriprosessiin, jos sellainen on"
+
+#: ../src/gui/application/main.cpp:319
+msgid "Ignore installed version - for devs only"
+msgstr "Sivuuta asennettu versio - vain kehittäjille"
+
+#: ../src/gui/application/main.cpp:320
+msgid "file to open"
+msgstr "avattava tiedosto"
+
+#: ../src/gui/application/main.cpp:370
+msgid "Installation contains the wrong version of Rosegarden."
+msgstr "Asennus sisältää väärän Rosegarden-version."
+
+#: ../src/gui/application/main.cpp:371
+msgid ""
+" The wrong versions of Rosegarden's data files were\n"
+" found in the standard KDE installation directories.\n"
+" (I am %1, but the installed files are for version %2.)\n"
+"\n"
+" This may mean one of the following:\n"
+"\n"
+" 1. This is a new upgrade of Rosegarden, and it has not yet been\n"
+" installed. If you compiled it yourself, check that you have\n"
+" run \"make install\" and that the procedure completed\n"
+" successfully.\n"
+"\n"
+" 2. The upgrade was installed in a non-standard directory,\n"
+" and an old version was found in a standard directory. If so,\n"
+" you will need to add the correct directory to your KDEDIRS\n"
+" environment variable before you can run it."
+msgstr ""
+" Oletetusta KDE:n asennushakemmistosta löytyvät väärät \n"
+" versiot Rosegardenin datatiedostoista.\n"
+" (Olen %1, mutta asennetut tiedostot ovat versiolle %2.)\n"
+"\n"
+" Tämä voi tarkoittaa seuraavaa:\n"
+"\n"
+" 1. Tämä on uusi Rosegarden-päivitys, ja sitä ei ole vielä\n"
+" asennettu. Jos käänsit sen itse, tarkista että olet\n"
+" ajanut \"make install\" ja että käskyn suoritus on päättynyt\n"
+" onnistuneesti.\n"
+"\n"
+" 2. Päivitystä ei asennettu oletushakemistoon,\n"
+" ja vanha versio löytyi oletushakemistosta. Mikäli näin on,\n"
+" sinun täytyy lisätä oikea hakemisto KDEDIRS\n"
+" -ympäristömuuttujaan ennen kuin voit ajaa sen."
+
+#: ../src/gui/application/main.cpp:383 ../src/gui/application/main.cpp:401
+msgid "Installation problem"
+msgstr "Asennusongelma"
+
+#: ../src/gui/application/main.cpp:389
+msgid "Rosegarden does not appear to have been installed."
+msgstr "Rosegardenia ei nähtävästi ole asennettu."
+
+#: ../src/gui/application/main.cpp:390
+msgid ""
+" One or more of Rosegarden's data files could not be\n"
+" found in the standard KDE installation directories.\n"
+"\n"
+" This may mean one of the following:\n"
+"\n"
+" 1. Rosegarden has not been correctly installed. If you compiled\n"
+" it yourself, check that you have run \"make install\" and that\n"
+" the procedure completed successfully.\n"
+"\n"
+" 2. Rosegarden has been installed in a non-standard directory,\n"
+" and you need to add this directory to your KDEDIRS environment\n"
+" variable before you can run it. This may be the case if you\n"
+" installed into $HOME or a local third-party package directory\n"
+" like /usr/local or /opt."
+msgstr ""
+" Yhtä tai useampaa Rosegardenin datatiedostoa ei voitu\n"
+" löytää oletetusta KDE:n asennushakemistoista.\n"
+"\n"
+" Tämä voi tarkoittaa jotain seuraavista:\n"
+"\n"
+" 1. Rosegarden ei asentunut kunnolla. Jos käänsit sen itse,\n"
+" tarkista että olet ajanut \"make install\" ja että\n"
+" käskyn suoritus päättyi onnistuneesti.\n"
+"\n"
+" 2. Rosegardenia ei asennettu oletushakemistoon, \n"
+" ja sinun täytyy lisätä tämä hakemisto KDEDIRS -ympäristömuutujaan\n"
+" ennen kuin voit ajaa sen. Näin saattaa olla, jos asennuspaikkana oli\n"
+" $HOME tai paikallinen kolmannen osapuolen pakettihakemisto,\n"
+" kuten /usr/local tai /opt."
+
+#: ../src/gui/application/main.cpp:414
+msgid "Rosegarden"
+msgstr "Rosegarden"
+
+#: ../src/gui/application/main.cpp:416
+msgid ""
+"Copyright 2000 - 2008 Guillaume Laurent, Chris Cannam, Richard Bown\n"
+"Parts copyright 1994 - 2004 Chris Cannam, Andy Green, Richard Bown, "
+"Guillaume Laurent\n"
+"LilyPond fonts copyright 1997 - 2005 Han-Wen Nienhuys and Jan Nieuwenhuizen"
+msgstr ""
+"Copyright 2000 - 2008 Guillaume Laurent, Chris Cannam, Richard Bown\n"
+"Parts copyright 1994 - 2004 Chris Cannam, Andy Green, Richard Bown, "
+"Guillaume Laurent\n"
+"LilyPond-kirjasimet copyright 1997 - 2005 Han-Wen Nienhuys ja Jan "
+"Nieuwenhuizen"
+
+#: ../src/gui/application/main.cpp:428
+msgid "Chord labelling code"
+msgstr "Sointujen nimeämiskoodi"
+
+#: ../src/gui/application/main.cpp:429
+msgid ""
+"LilyPond output\n"
+"assorted other patches\n"
+"i18n-ization"
+msgstr ""
+"LilyPond-tuotos\n"
+"valikoima muita muutoksia\n"
+"i18n-ization"
+
+#: ../src/gui/application/main.cpp:430
+msgid ""
+"UI improvements\n"
+"bug fixes"
+msgstr ""
+"UI parannuksia\n"
+"Bugien korjauksia"
+
+#: ../src/gui/application/main.cpp:431
+msgid ""
+"Segment colours\n"
+"Other UI and bug fixes"
+msgstr ""
+"Osan värit\n"
+"Muut käyttöliittymä- ja bugikorjaukset"
+
+#: ../src/gui/application/main.cpp:432
+msgid ""
+"Russian translation\n"
+"i18n-ization"
+msgstr ""
+"Venäläinen käännös\n"
+"i18n-ization"
+
+#: ../src/gui/application/main.cpp:433 ../src/gui/application/main.cpp:434
+msgid "German translation"
+msgstr "Saksalainen käännös"
+
+#: ../src/gui/application/main.cpp:435
+msgid "Welsh translation"
+msgstr "Walesilainen käännös"
+
+#: ../src/gui/application/main.cpp:436
+msgid "French translation"
+msgstr "Ranskalainen käännös"
+
+#: ../src/gui/application/main.cpp:437
+msgid ""
+"French translation\n"
+"Bug fixes"
+msgstr ""
+"Ranskalainen käännös\n"
+"Bugikorjauksia"
+
+#: ../src/gui/application/main.cpp:438 ../src/gui/application/main.cpp:439
+msgid "Italian translation"
+msgstr "Italialainen käännös"
+
+#: ../src/gui/application/main.cpp:440 ../src/gui/application/main.cpp:441
+msgid "Swedish translation"
+msgstr "Ruotsalainen käännös"
+
+#: ../src/gui/application/main.cpp:442
+msgid "Estonian translation"
+msgstr "Virolainen käännös"
+
+#: ../src/gui/application/main.cpp:443 ../src/gui/application/main.cpp:444
+msgid "Dutch translation"
+msgstr "Tanskalainen käännös"
+
+#: ../src/gui/application/main.cpp:445
+msgid "HSpinBox class"
+msgstr "HSpinBox-luokka"
+
+#: ../src/gui/application/main.cpp:446
+msgid "Transposition by interval"
+msgstr "Siirrä intervallilla"
+
+#: ../src/gui/application/main.cpp:447
+msgid "Original designs for rotary controllers"
+msgstr "Alkuperäiset mallit kierto-ohjaimiin"
+
+#: ../src/gui/application/main.cpp:448
+msgid "Japanese translation"
+msgstr "Japanilainen käännös"
+
+#: ../src/gui/application/main.cpp:449
+msgid ""
+"Auto-scroll deceleration\n"
+"Rests outside staves and other bug fixes"
+msgstr ""
+"Automaattinen vierityksen hidastus\n"
+"Tauot viivaston ulkopuolella ja muita bugien korjauksia"
+
+#: ../src/gui/application/main.cpp:450
+msgid "Simplified Chinese translation"
+msgstr "Yksinkertaistettu kiinalainen käännös"
+
+#: ../src/gui/application/main.cpp:451
+msgid "LIRC infrared remote-controller support"
+msgstr "LIRC-infrapuna-kaukosäätimen tuki"
+
+#: ../src/gui/application/main.cpp:452
+msgid "MTC slave timing implementation"
+msgstr "MTC-seuraimen aikatoteutus"
+
+#: ../src/gui/application/main.cpp:453
+msgid "Czech translation"
+msgstr "Tsekkiläinen käännös"
+
+#: ../src/gui/application/main.cpp:454
+msgid "SCons/bksys building system"
+msgstr "SCons/bksys käännösjärjestelmä"
+
+#: ../src/gui/application/main.cpp:455
+msgid "icons, icons, icons"
+msgstr "ikonit, ikonit, ikonit"
+
+#: ../src/gui/application/main.cpp:456 ../src/gui/application/main.cpp:457
+#: ../src/gui/application/main.cpp:458 ../src/gui/application/main.cpp:459
+msgid "Spanish translation"
+msgstr "Espanjalainen käännös"
+
+#: ../src/gui/application/main.cpp:460 ../src/gui/application/main.cpp:461
+msgid "Catalan translation"
+msgstr "Katalonialainen käännös"
+
+#: ../src/gui/application/main.cpp:462
+msgid ""
+"1.2.3 splash screen photo\n"
+"Gave birth to D. Michael McIntyre, bought him a good flute once\n"
+"upon a time, and always humored him when he came over to play her\n"
+"some new instrument, even though she really hated his playing.\n"
+"Born October 19, 1951, died September 21, 2007, R. I. P."
+msgstr ""
+"1.2.3 roiskeruutukuva\n"
+"Synnytti D. Michael McIntyre:n, osti hänelle kerran hyvän huilun,\n"
+"ja aina viihdytti häntä tulemalla soittamaan jotain uutta intsrumenttia,\n"
+"huolimatta siitä, että hän vihasi tätä soittoa.\n"
+"Syntyi 19. lokakuuta 1951, kuoli 21. syyskuuta 2007, levätköön rauhassa."
+
+#: ../src/gui/application/main.cpp:463
+msgid "Initial guitar chord editing code"
+msgstr "Alun kitarasointueditorikoodi"
+
+#: ../src/gui/application/main.cpp:464
+msgid "Polish translation"
+msgstr "Puolalainen käännös"
+
+#: ../src/gui/application/main.cpp:465
+msgid "Basque translation"
+msgstr "Baskilainen käännös"
+
+#: ../src/gui/application/main.cpp:466
+msgid "Klearlook theme"
+msgstr "Klearlook-teema"
+
+#: ../src/_translatorinfo.cpp:1 ../src/gui/application/main.cpp:468
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr "Heikki Junes"
+
+#: ../src/_translatorinfo.cpp:3 ../src/gui/application/main.cpp:468
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+
+#: ../src/gui/application/main.cpp:719
+msgid "Welcome!"
+msgstr "Tervetuloa!"
+
+#: ../src/gui/application/main.cpp:731
+msgid ""
+"<h2>Welcome to Rosegarden!</h2><p>Welcome to the Rosegarden audio and MIDI "
+"sequencer and musical notation editor.</p><ul><li>If you have not already "
+"done so, you may wish to install some DSSI synth plugins, or a separate "
+"synth program such as QSynth. Rosegarden does not synthesize sounds from "
+"MIDI on its own, so without these you will hear nothing.</"
+"li><br><br><li>Rosegarden uses the JACK audio server for recording and "
+"playback of audio, and for playback from DSSI synth plugins. These features "
+"will only be available if the JACK server is running.</"
+"li><br><br><li>Rosegarden has comprehensive documentation: see the Help menu "
+"for the handbook, tutorials, and other information!</li></ul><p>Rosegarden "
+"was brought to you by a team of volunteers across the world. To learn more, "
+"go to <a href=\"http://www.rosegardenmusic.com/\">http://www.rosegardenmusic."
+"com/</a>.</p>"
+msgstr ""
+"<h2>Tervetuloa käyttämään Rosegardenia!</h2><p>Tervetuloa käyttämään "
+"Rosegarden ääni- ja MIDI-sekvensseriä ja nuotinnuseditoria.</p><ul><li>Jos "
+"et ole vielä aiemmin tehnyt niin, voit haluta asentaa joitain DSSI synth-"
+"lisäosia, tai erillisen synth-ohjelman, kuten QSynth. Rosegarden ei "
+"syntetisoi ääniä MIDI:stä, joten ilman synteisoijaa et kuule mitään.</"
+"li><br><br><li>Rosegarden käyttää JACK-äänipalvelinta nauhoittaakseen ja "
+"toistaakseen ääntä, ja toistaakseen DSSI-synth lisäosia. Nämä ominaisuudet "
+"ovat käytössä vain jos JACK-palvelin on ajossa.</"
+"li><br><br><li>Rosegardelilla on kattava ohjekirja: katse Ohje-valikosta "
+"käsikirja, oppaat ja muu informaatio!</li></ul><p>Rosegardenin toi käyttöösi "
+"ryhmä vapaaehtoisiä ympäri maailman. Oppiaksesi lisää, käy sivulla <a href="
+"\"http://www.rosegardenmusic.com/\">http://www.rosegardenmusic.com/</a>.</p>"
+
+#: ../src/gui/application/RosegardenGUIView.cpp:257
+msgid "No non-audio segments in composition"
+msgstr "Ei muita kuin ääniosia sävellyksessä"
+
+#: ../src/gui/application/RosegardenGUIView.cpp:333
+msgid "Selection must contain only audio or non-audio segments"
+msgstr "Valinnan täytyy sisältää vain yksi ääni- tai muu kuin ääniosio"
+
+#: ../src/gui/application/RosegardenGUIView.cpp:431
+#: ../src/gui/application/RosegardenGUIView.cpp:576
+#: ../src/gui/application/RosegardenGUIView.cpp:612
+#: ../src/gui/application/RosegardenGUIView.cpp:776
+msgid "No non-audio segments selected"
+msgstr "Muita kuin ääniosia ei valittuna"
+
+#: ../src/gui/application/RosegardenGUIView.cpp:851
+msgid ""
+"You've not yet defined an audio editor for Rosegarden to use.\n"
+"See Settings -> Configure Rosegarden -> Audio."
+msgstr ""
+"Et ole vielä määritellyt Rosegardenin käyttämää äänimuokkainta.\n"
+"Katso Asetukset -> Määritä Rosegarden -> Ääni."
+
+#: ../src/gui/application/RosegardenGUIView.cpp:1559
+#: ../src/gui/application/RosegardenGUIView.cpp:1564
+msgid "Can't add dropped file. "
+msgstr "Ei voitu lisätä tiputettua tiedostoa. "
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1014
+#: ../src/gui/seqmanager/SequenceManager.cpp:1150
+msgid ""
+"The JACK Audio subsystem has failed or it has stopped Rosegarden from "
+"processing audio.\n"
+"Please restart Rosegarden to continue working with audio.\n"
+"Quitting other running applications may improve Rosegarden's performance."
+msgstr ""
+"JACK ääni -alijärjestelmän käyttö epäonnistui tai se on keskeyttänyt "
+"Rosegarden äänen käsittelyn.\n"
+"Ole hyvä, ja käynnistä Rosegarden uudelleen jatkaaksesi äänen kanssa "
+"työskentelyä.\n"
+"Toisten ohjelmien lopettaminen saattaa parantaa Rosegardenin suorituskykyä."
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1020
+#: ../src/gui/seqmanager/SequenceManager.cpp:1156
+msgid ""
+"The JACK Audio subsystem has stopped Rosegarden from processing audio, "
+"probably because of a processing overload.\n"
+"An attempt to restart the audio service has been made, but some problems may "
+"remain.\n"
+"Quitting other running applications may improve Rosegarden's performance."
+msgstr ""
+"JACK ääni -alijärjestelmä on keskeyttänyt Rosegarden äänen käsittelyn, "
+"todennäköisesti käsittelyn ylikuormituksen takia.\n"
+"Äänipalvelua yritettiin käynnistää uudelleen, mutta joitain ongelmia saattaa "
+"vielä olla jäänyt.\n"
+"Toisten ohjelmien lopettaminen saattaa parantaa Rosegardenin suorituskykyä."
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1031
+msgid ""
+"Run out of processor power for real-time audio processing. Cannot continue."
+msgstr ""
+"Prosessorin teho ei riittänyt reaaliaikaiseen äänenkäsittelyyn. Ei voida "
+"jatkaa."
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1057
+msgid ""
+"A serious error has occurred in the ALSA MIDI subsystem. It may not be "
+"possible to continue sequencing. Please check console output for more "
+"information."
+msgstr ""
+"Vakava virhe tapahtui ALSA MIDI -alijärjestelmässä. Sekvenssointia ei "
+"voitane jatkaa. Ole hyvä, ja tarkista komentorivin tuloste saadaksesi lisää "
+"tietoa."
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1078
+msgid "JACK Audio subsystem is losing sample frames."
+msgstr "JACK ääni -alijärjestelmä hukkaa näytteiden kehyksiä."
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1096
+msgid ""
+"Failed to read audio data from disc in time to service the audio subsystem."
+msgstr ""
+"Äänitietojen lukeminen ajallaan ääni-alijärjestelmää varten epäonnistui."
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1100
+msgid ""
+"Failed to write audio data to disc fast enough to service the audio "
+"subsystem."
+msgstr ""
+"Ääni-alijärjestelmän antamien äänitietojen kirjoittaminen levylle riittävän "
+"nopeasti epäonnistui."
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1104
+msgid "The audio mixing subsystem is failing to keep up."
+msgstr "Äänisekoitin -alijärjestelmä ei pysy pystyssä."
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1108
+msgid "The audio subsystem is failing to keep up."
+msgstr "Ääni-alijärjestelmä ei pysy pystyssä."
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1112
+msgid "Unknown sequencer failure mode!"
+msgstr "Tuntematon sekvensserin virhetila!"
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1170
+msgid ""
+"<h3>System timer resolution is too low</h3><p>Rosegarden was unable to find "
+"a high-resolution timing source for MIDI performance.</p><p>This may mean "
+"you are using a Linux system with the kernel timer resolution set too low. "
+"Please contact your Linux distributor for more information.</p><p>Some Linux "
+"distributors already provide low latency kernels, see <a href=\"http://"
+"rosegarden.wiki.sourceforge.net/Low+latency+kernels\">http://rosegarden.wiki."
+"sourceforge.net/Low+latency+kernels</a> for instructions.</p>"
+msgstr ""
+"<h3>Järjestelmän aikaerottelukyky on liian matala</h3><p>Rosegarden ei "
+"löytänyt korkeaerottelukykyistä aikalähdettä MIDI-esitystä varten.</"
+"p><p>Tämä voi tarkoittaa sitä, että käytät Linux-järjestelmää, jossa ytimen "
+"aikaerottelukyky on asetettu liian alhaiseksi. Ole hyvä ja ota yhteyttä "
+"Linux-jakelijaasi saadaksesi lisää informaatiota.</p><p>Jotkut Linux-"
+"jakelijat tukevat jo pienen viiveen ydintä, katso lisäohjeita sivulta <a "
+"href=\"http://rosegarden.wiki.sourceforge.net/Low+latency+kernels\">http://"
+"rosegarden.wiki.sourceforge.net/Low+latency+kernels</a>.</p>"
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1188
+msgid ""
+"<h3>System timer resolution is too low</h3><p>Rosegarden was unable to find "
+"a high-resolution timing source for MIDI performance.</p><p>You may be able "
+"to solve this problem by loading the RTC timer kernel module. To do this, "
+"try running <b>sudo modprobe snd-rtctimer</b> in a terminal window and then "
+"restarting Rosegarden.</p><p>Alternatively, check whether your Linux "
+"distributor provides a multimedia-optimized kernel. See <a href=\"http://"
+"rosegarden.wiki.sourceforge.net/Low+latency+kernels\">http://rosegarden.wiki."
+"sourceforge.net/Low+latency+kernels</a> for notes about this.</p>"
+msgstr ""
+"<h3>Järjestelmän aikaerottelukyky on liian matala</h3><p>Rosegarden ei "
+"löytänyt korkeaerottelukykyistä aikalähdettä MIDI-esitystä varten.</"
+"p><p>Saatat voida ratkaista tämän ongelman lataamalla RTC-kernelimoduulin. "
+"Tehdäksesi tämän, yritä ajaa <b>sudo modprobe snd-rtctimer</b> komentorivi-"
+"ikkunassa ja käynnistämällä Rosegarden uudelleen</p><p>Vaihtoehtoisesti, "
+"tarkista tarjoaako Linux-jakelijasi multimedialle optimoitua kerneliä. "
+"Sivulle <a href=\"http://rosegarden.wiki.sourceforge.net/Low+latency+kernels"
+"\">http://rosegarden.wiki.sourceforge.net/Low+latency+kernels</a> on kerätty "
+"tietoja tästä.</p>"
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1312
+msgid ""
+"<p>Both MIDI and Audio subsystems have failed to initialize.</p><p>You may "
+"continue without the sequencer, but we suggest closing Rosegarden, running "
+"\"alsaconf\" as root, and starting Rosegarden again. If you wish to run "
+"with no sequencer by design, then use \"rosegarden --nosequencer\" to avoid "
+"seeing this error in the future.</p>"
+msgstr ""
+"<p>Sekä MIDI, että Ääni -alijärjestelmien alustaminen epäonnistui.</"
+"p><p>Voit jatkaa ilman sekvensseriä, mutta suosittelen Rosegardenin "
+"sulkemista, käskyn\"alsaconf\" ajamista pääkäyttäjänä, ja Rosegardenin "
+"käynnistämistä uudelleen. Jos haluat nimenomaan olla käyttämättä "
+"sekvensseriä, käytä \"rosegarden --nosequencer\" välttääksesi jatkossa tämän "
+"virheilmoituksen näkemisen.</p>"
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1314
+msgid ""
+"<p>The MIDI subsystem has failed to initialize.</p><p>You may continue "
+"without the sequencer, but we suggest closing Rosegarden, running \"modprobe "
+"snd-seq-midi\" as root, and starting Rosegarden again. If you wish to run "
+"with no sequencer by design, then use \"rosegarden --nosequencer\" to avoid "
+"seeing this error in the future.</p>"
+msgstr ""
+"<p>MIDI-alijärjestelmän alustaminen epäonnistui.</p><p>Voit jatkaa ilman "
+"sekvensseriä, mutta suosittelen Rosegardenin sulkemista, käskyn\"modprobe "
+"snd-seq-midi\" ajamista pääkäyttäjänä, ja Rosegardenin käynnistämistä "
+"uudelleen. Jos haluat nimenomaan olla käyttämättä sekvensseriä, käytä "
+"\"rosegarden --nosequencer\" välttääksesi jatkossa tämän virheilmoituksen "
+"näkemisen.</p>"
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1316
+msgid ""
+"<p>The Rosegarden sequencer module version does not match the GUI module "
+"version.</p><p>You have probably mixed up files from two different versions "
+"of Rosegarden. Please check your installation.</p>"
+msgstr ""
+"<p>Rosegardenin sekvensserimoduulin versio ei sovi yhteen "
+"käyttöliittymämoduulin version kanssa.</p><p>Olet todennäköisesti "
+"sekoittanut tiedostot kahdesta Rosegardenin versiosta. Ole hyvä ja tarkista "
+"asennus.</p>"
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1322
+#, c-format
+msgid "<h3>Sequencer startup failed</h3>%1"
+msgstr "<h3>Sekvensserin aloitus epäonnistui</h3> %1"
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1330
+msgid ""
+"<h3>Failed to connect to JACK audio server.</h3><p>Rosegarden could not "
+"connect to the JACK audio server. This probably means the JACK server is "
+"not running.</p><p>If you want to be able to play or record audio files or "
+"use plugins, you should exit Rosegarden and start the JACK server before "
+"running Rosegarden again.</p>"
+msgstr ""
+"<h3>Yhdistäminen JACK-äänipalvelimeen epäonnistui.</h3><p>Rosegarden ei "
+"voinut yhdistää JACK-äänipalvelimelle. Tämä todennäköisesti tarkoittaa, "
+"että JACK-palvelin ei ole käynnissä.</p><p>Jos haluat voida toistaa tai "
+"nauhoittaa äänitiedostoja tai käyttää lisäosia, sinun tulee sulkea "
+"Rosegarden ja käynnistää JACK-palvelin ennen Rosegardenin käynnistämistä "
+"uudelleen.</p>"
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1331
+msgid "Failed to connect to JACK"
+msgstr "Yhdistäminen JACK-palvelimeen epäonnistui"
+
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:46
+msgid "Modify MIDI filters..."
+msgstr "Muuta MIDI-suodattimia..."
+
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:58
+msgid "THRU events to ignore"
+msgstr "Sivuutettavat THRU-tapahtumat"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:131
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:60
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:96
+msgid "Note"
+msgstr "Nuotti"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:132
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:61
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:97
+msgid "Program Change"
+msgstr "Ohjelmamuutos"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:136
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:62
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:98
+msgid "Key Pressure"
+msgstr "Koskettimen paine"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:137
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:63
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:99
+msgid "Channel Pressure"
+msgstr "Kanavan paine"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:134
+#: ../src/gui/general/EditView.cpp:899
+#: ../src/gui/rulers/ControllerEventsRuler.cpp:198
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:64
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:100
+msgid "Pitch Bend"
+msgstr "Virityksen taivutus"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:133
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:65
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:101
+msgid "Controller"
+msgstr "Hallitsija"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:135
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:66
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:102
+msgid "System Exclusive"
+msgstr "Ainoastaan järjestelmä"
+
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:94
+msgid "RECORD events to ignore"
+msgstr "Sivuutettavat RECORD-tapahtumat"
+
+#: ../src/gui/widgets/TimeWidget.cpp:101
+msgid "Note:"
+msgstr "Nuotti:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:108 ../src/gui/widgets/TimeWidget.cpp:145
+msgid "<inexact>"
+msgstr "<epätarkka>"
+
+#: ../src/gui/widgets/TimeWidget.cpp:151
+msgid "Units:"
+msgstr "Yksiköt:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:173
+msgid "Time:"
+msgstr "Aika:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:184
+msgid "units"
+msgstr "yksikköä"
+
+#: ../src/gui/widgets/TimeWidget.cpp:193
+msgid "Measures:"
+msgstr "Tahdit:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:193
+msgid "Measure:"
+msgstr "Tahti:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:212
+msgid "beats:"
+msgstr "iskut:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:212
+msgid "beat:"
+msgstr "isku:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:230
+msgid "%1:"
+msgstr "%1:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:254
+msgid "Seconds:"
+msgstr "Sekunnit:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:273
+msgid "msec:"
+msgstr "ms:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:407 ../src/gui/widgets/TimeWidget.cpp:531
+msgid "(%1/%2 time)"
+msgstr "(%1/%2 ajasta)"
+
+#: ../src/gui/widgets/TimeWidget.cpp:452
+msgid "(starting %1.%2 qpm, %2.%3 bpm)"
+msgstr "(aloittaessa %1.%2 qpm, %2.%3 bpm)"
+
+#: ../src/gui/widgets/TimeWidget.cpp:458
+msgid "(starting %1.%2 bpm)"
+msgstr "(aloittaessa %1.%2 bpm)"
+
+#: ../src/gui/widgets/TimeWidget.cpp:464
+msgid "(%1.%2 qpm, %2.%3 bpm)"
+msgstr "(%1.%2 qpm, %2.%3 bpm)"
+
+#: ../src/gui/widgets/TimeWidget.cpp:470
+msgid "(%1.%2 bpm)"
+msgstr "(%1.%2 bpm)"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:239
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:60
+msgid "C"
+msgstr "C"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:241
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:61
+msgid "D"
+msgstr "D"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:243
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:62
+msgid "E"
+msgstr "E"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:244
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:63
+msgid "F"
+msgstr "F"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:246
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:64
+msgid "G"
+msgstr "G"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:248
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:65
+msgid "A"
+msgstr "A"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:250
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:66
+msgid "B"
+msgstr "H"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:70
+msgid "-2"
+msgstr "-2"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:71
+msgid "-1"
+msgstr "-1"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:72
+msgid "0"
+msgstr "0"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:73
+msgid "1"
+msgstr "1"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:74
+msgid "2"
+msgstr "2"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:75
+msgid "3"
+msgstr "3"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:76
+msgid "4"
+msgstr "4"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:77
+msgid "5"
+msgstr "5"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:78
+msgid "6"
+msgstr "6"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:79
+msgid "7"
+msgstr "7"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:83
+msgid "double flat"
+msgstr "kaksoisalennettu"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:84
+msgid "flat"
+msgstr "alennettu"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:85
+msgid "natural"
+msgstr "palautettu"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:86
+msgid "sharp"
+msgstr "ylennetty"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:87
+msgid "double sharp"
+msgstr "kaksoisylennetty"
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:234
+#, c-format
+msgid "In %1"
+msgstr "Tulo %1"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:587
+#: ../src/gui/widgets/AudioRouteMenu.cpp:236
+#: ../src/gui/widgets/AudioRouteMenu.cpp:259
+msgid "Master"
+msgstr "Keskus"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:528
+#: ../src/gui/widgets/AudioRouteMenu.cpp:238
+#: ../src/gui/widgets/AudioRouteMenu.cpp:261
+#, c-format
+msgid "Sub %1"
+msgstr "Ala %1"
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:244
+msgid "In %1 R"
+msgstr "Tulo O%1"
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:245
+msgid "In %1 L"
+msgstr "Tulo V%1"
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:247
+msgid "Master R"
+msgstr "Keskus O"
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:248
+msgid "Master L"
+msgstr "Keskus V"
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:250
+msgid "Sub %1 R"
+msgstr "Ala %1 O"
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:251
+msgid "Sub %1 L"
+msgstr "Ala %1 V"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:391
+#: ../src/gui/studio/AudioMixerWindow.cpp:522
+#: ../src/gui/widgets/AudioFaderBox.cpp:82
+msgid "Audio plugin button"
+msgstr "Ääni-lisäosa -painike"
+
+#: ../src/gui/editors/parameters/AudioInstrumentParameterPanel.cpp:129
+#: ../src/gui/editors/parameters/AudioInstrumentParameterPanel.cpp:357
+#: ../src/gui/widgets/AudioFaderBox.cpp:91
+msgid "<no synth>"
+msgstr "<synth puuttuu>"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:93
+msgid "Synth plugin button"
+msgstr "Synth-lisäosa -painike"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:153
+msgid "Set the audio pan position in the stereo field"
+msgstr "Aseta äänen jakaantuminen stereokenttään"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:155
+msgid "Open synth plugin's native editor"
+msgstr "Avaa synth-lisäosan oma muokkain"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:157
+msgid "Mono or Stereo Instrument"
+msgstr "Mono- tai stereoinstrumentti"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:159
+msgid "Record level"
+msgstr "Nauhoitustaso"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:161
+msgid "Playback level"
+msgstr "Toistotaso"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:345
+#: ../src/gui/studio/AudioMixerWindow.cpp:347
+#: ../src/gui/studio/AudioMixerWindow.cpp:503
+#: ../src/gui/studio/AudioMixerWindow.cpp:505
+#: ../src/gui/widgets/AudioFaderBox.cpp:163
+msgid "Audio level"
+msgstr "Äänen taso"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:170
+msgid "In:"
+msgstr "Paikassa:"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:173
+msgid "Out:"
+msgstr "Ulos:"
+
+#: ../src/gui/widgets/ProgressDialog.cpp:48
+#: ../src/gui/widgets/ProgressDialog.cpp:53
+#: ../src/gui/widgets/ProgressDialog.cpp:76
+msgid "Processing..."
+msgstr "Käsitellään..."
+
+#: ../src/gui/configuration/ColourConfigurationPage.h:60
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:130
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:346
+#: ../src/gui/widgets/ColourTable.cpp:52
+msgid "Color"
+msgstr "Väri"
+
+#: ../src/gui/widgets/ColourTable.cpp:68
+msgid "Modify Color Name"
+msgstr "Muuta värin nimeä"
+
+#: ../src/gui/configuration/ColourConfigurationPage.cpp:129
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:983
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:882
+#: ../src/gui/widgets/ColourTable.cpp:68
+msgid "Enter new name"
+msgstr "Syötä uusi nimi"
+
+#: ../src/gui/widgets/ColourTable.cpp:107
+msgid "Default Color"
+msgstr "Oletusväri"
+
+#: ../src/gui/widgets/Rotary.cpp:108
+msgid ""
+"Click and drag up and down or left and right to modify.\n"
+"Double click to edit value directly."
+msgstr ""
+"Klikkaa ja vedä ylös ja alas tai vasemmelle ja oikealle muuttaaksesi arvoa.\n"
+"Kaksoisklikkauksella voit muokata arvoa suoraan."
+
+#: ../src/gui/widgets/Rotary.cpp:433
+msgid "Select a new value"
+msgstr "Valitse uusi arvo"
+
+#: ../src/gui/widgets/Rotary.cpp:434
+msgid "Enter a new value"
+msgstr "Syötä uusi arvo"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:80
+msgid "Quantizer"
+msgstr "Yksiköijä"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:86
+msgid "Quantizer type:"
+msgstr "Yksikkötyyppi:"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:88
+msgid "Grid quantizer"
+msgstr "Pisteverkkoon yksiköinti"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:89
+msgid "Legato quantizer"
+msgstr "Legato-yksiköijä"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:90
+msgid "Heuristic notation quantizer"
+msgstr "Kokemusperäinen nuotinnuksen yksiköijä"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:94
+msgid "Quantize for notation only (leave performance unchanged)"
+msgstr "Yksiköi vain nuotinnus (jätä esitys koskemattomaksi)"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:104
+msgid "Notation parameters"
+msgstr "Nuottinnuksen ominaisuudet"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:109
+#: ../src/gui/widgets/QuantizeParameters.cpp:150
+msgid "Base grid unit:"
+msgstr "Perusristikko ja yksikkö:"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:114
+msgid "Complexity:"
+msgstr "Monimutkaisuus:"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:118
+msgid "Very high"
+msgstr "Hyvin korkea"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:119
+msgid "High"
+msgstr "Korkea"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:224
+#: ../src/gui/widgets/QuantizeParameters.cpp:120
+msgid "Normal"
+msgstr "Normaali"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:121
+msgid "Low"
+msgstr "Matala"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:122
+msgid "Very low"
+msgstr "Hyvin matala"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:125
+msgid "Tuplet level:"
+msgstr "Tuplettitaso:"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:129
+msgid "2-in-the-time-of-3"
+msgstr "2 ajassa 3"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4241
+#: ../src/gui/widgets/QuantizeParameters.cpp:130
+msgid "Triplet"
+msgstr "Tripletti"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:138
+msgid "Any"
+msgstr "Mikä tahansa"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:141
+msgid "Permit counterpoint"
+msgstr "Salli vastakohta"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:145
+msgid "Grid parameters"
+msgstr "Ruudukon ominaisuudet"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:154
+msgid "Swing:"
+msgstr "Heilahdus:"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:159
+msgid "Iterative amount:"
+msgstr "Toistava määrä:"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:165
+msgid "Quantize durations as well as start times"
+msgstr "Yksiköi sekä kestot että alkuajat"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:169
+msgid "After quantization"
+msgstr "Kvantisoinnin jälkeen"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:183
+msgid "Show advanced options"
+msgstr "Näytä edistyneet ominaisuudet"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:192
+msgid "Re-beam"
+msgstr "Palkita uudelleen"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:194
+msgid "Add articulations (staccato, tenuto, slurs)"
+msgstr "Lisää ilmaisut (katkoen, pidättäen, kaaret)"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:195
+msgid "Tie notes at barlines etc"
+msgstr "Sido nuotit tahtiviivoilla jne"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:196
+msgid "Split-and-tie overlapping chords"
+msgstr "Jaa-ja-sido päällekkäiset soinnut"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:307
+msgid "Full quantize"
+msgstr "Täysi yksiköinti"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:450
+msgid "Show Advanced Options"
+msgstr "Näytä edistyneet ominaisuudet"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:454
+msgid "Hide Advanced Options"
+msgstr "Piilota edistyneet ominaisuudet"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:257
+#: ../src/gui/configuration/MatrixConfigurationPage.h:56
+#: ../src/gui/configuration/MatrixConfigurationPage.h:57
+#: ../src/gui/editors/matrix/MatrixView.cpp:2709
+msgid "Matrix"
+msgstr "Matriisi"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:64
+msgid "Printable headers"
+msgstr "Tulostuvat otsikot"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:92
+msgid "Dedication"
+msgstr "Omistus"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:96
+#: ../src/gui/editors/segment/PlayListView.cpp:35
+msgid "Title"
+msgstr "Otsikko"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:100
+msgid "Subtitle"
+msgstr "Alaotsikko"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:104
+msgid "Subsubtitle"
+msgstr "Ala-alaotsikko"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:108
+msgid "Poet"
+msgstr "Runoilija"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:116
+msgid "Composer"
+msgstr "Säveltäjä"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:120
+msgid "Meter"
+msgstr "Nopeuslaji"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:124
+msgid "Arranger"
+msgstr "Sovittaja"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:128
+msgid "Piece"
+msgstr "Kappale"
+
+#: ../data/fonts/mappings/fonts.cpp:26
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:132
+msgid "Opus"
+msgstr "Opus"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:136
+msgid "Copyright"
+msgstr "Tekijänoikeus"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:140
+msgid "Tagline"
+msgstr "Tagirivi"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:155
+msgid "The composition comes here."
+msgstr "Sävellys tulee tähän."
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:172
+msgid "Non-printable headers"
+msgstr "Tulostumattomat otsikot"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:213
+msgid "Add New Property"
+msgstr "Lisää uusi ominaisuus"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:217
+msgid "Delete Property"
+msgstr "Poista ominaisuus"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:236
+msgid "{new property %1}"
+msgstr "{uusi ominaisuus %1}"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:236
+msgid "{new property}"
+msgstr "{uusi ominaisuus}"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:243
+msgid "{undefined}"
+msgstr "{määrittämätön}"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:87
+msgid "Double-click opens segment in"
+msgstr "Kaksoisklikkaus avaa osan"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:91
+msgid "Notation editor"
+msgstr "Nuotinnusmuokkaimessa"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:92
+msgid "Matrix editor"
+msgstr "Matriisimuokkaimessa"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:93
+msgid "Event List editor"
+msgstr "Tapahtumalistamuokkaimessa"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:99
+msgid "Number of count-in measures when recording"
+msgstr "Laskennan lukumäärä tahteina nauhoitettaessa"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:109
+msgid "Auto-save interval"
+msgstr "Ajonaikaisen tallennuksen aikaväli"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:112
+msgid "Every 30 seconds"
+msgstr "Joka 30 sekunti"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:113
+msgid "Every minute"
+msgstr "Joka minuutti"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:114
+msgid "Every five minutes"
+msgstr "Joka viides minuutti"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:115
+msgid "Every half an hour"
+msgstr "Puolen tunnin välein"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:116
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:277
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:157
+msgid "Never"
+msgstr "Ei koskaan"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:140
+msgid "Use JACK transport"
+msgstr "Käytä JACK-kuljetinta"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:173
+msgid "Unknown"
+msgstr "Tuntematon"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:179
+msgid "No MIDI, audio OK"
+msgstr "Ei MIDIä, ääni ok"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:182
+msgid "MIDI OK, no audio"
+msgstr "MIDI ok, ei ääntä"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:185
+msgid "MIDI OK, audio OK"
+msgstr "MIDI ok, ääni ok"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:188
+msgid "No driver"
+msgstr "Ei ajuria"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:195
+msgid "Details..."
+msgstr "Yksityiskohdat..."
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:204
+msgid "Behavior"
+msgstr "Käytös"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:219
+msgid "Side-bar parameter box layout"
+msgstr "Sivupalkin ominaisuuslaatikon asettelu"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:223
+msgid "Vertically stacked"
+msgstr "Pystysuoraan pinottu"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:225
+msgid "Tabbed"
+msgstr "Välilehdet"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:233
+msgid "Note name style"
+msgstr "Nuottinimen tyyli"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:237
+msgid "Always use US names (e.g. quarter, 8th)"
+msgstr "Käytä aina US-nimiä (esim. quarter, 8th)"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:238
+msgid "Localized (where available)"
+msgstr "Paikallistettu (mahdollisuuksien mukaan)"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:252
+msgid "Show textured background on"
+msgstr "Näytä teksturoitu tausta"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:254
+msgid "Main window"
+msgstr "Pääikkuna"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:275
+msgid "Use bundled Klearlook theme"
+msgstr "Käytä mukana tulevaa Klearklook-teemaa"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:278
+msgid "When not running under KDE"
+msgstr "Kun KDE:tä ei ajeta"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:279
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:159
+msgid "Always"
+msgstr "Aina"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:287
+msgid "Presentation"
+msgstr "Esitys"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:423
+msgid ""
+"Changes to the textured background in the main window will not take effect "
+"until you restart Rosegarden."
+msgstr ""
+"Muutokset taustan tekstuuriin pääikkunassa eivät tule voimaan ennen "
+"Rosegardenin käynnistämistä uudelleen."
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:168
+#: ../src/gui/configuration/GeneralConfigurationPage.h:78
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:207
+#: ../src/gui/configuration/MatrixConfigurationPage.cpp:59
+msgid "General"
+msgstr "Yleinen"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.h:79
+msgid "General Configuration"
+msgstr "Yleinen kokoonpano"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:92
+msgid "Base octave number for MIDI pitch display"
+msgstr "Perusoktaaviluku MIDI-sävelkorkeuden näytölle"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:107
+msgid "Always use default studio when loading files"
+msgstr "Käytä aina oletusstudiota kun avataan tiedostoja"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:119
+msgid "Send all MIDI Controllers at start of each playback"
+msgstr "Lähetä kaikki MIDI-ohjaimet jokaisen toiston alussa"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:121
+msgid ""
+"Rosegarden can send all MIDI Controllers (Pan, Reverb etc) to all MIDI "
+"devices every\n"
+"time you hit play if you so wish. Please note that this option will usually "
+"incur a\n"
+"delay at the start of playback due to the amount of data being transmitted."
+msgstr ""
+"Rosegarden voi lähettää kaikki MIDI-ohjaimet (Jako, kaiku jne.) kaikkiin "
+"MIDI-laitteisiin joka\n"
+"kerta kun toista, jos niin haluat. Huomaa, että tämä valinta aiheuttaa "
+"tavallisesti viiveen\n"
+"toiston alussa siirrettävän tiedon määrän takia."
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:138
+msgid "Sequencer timing source"
+msgstr "Sekvensserin aikalähde"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:163
+msgid "Load SoundFont to SoundBlaster card at startup"
+msgstr "Lataa äänikirjasin SoundBlaster-äänikortille aloitettaessa"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:164
+msgid ""
+"Check this box to enable soundfont loading on EMU10K-based cards when "
+"Rosegarden is launched"
+msgstr ""
+"Tarkista tämä laatikko salliaksesi äänikirjasimen lataamisen EMU10K-"
+"perusteisissa äänikorteissa kun Rosegarden käynnistetään"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:173
+msgid "Path to 'asfxload' or 'sfxload' command"
+msgstr "Reitti 'asfxload' tai 'sfxload' -käskylle"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:180
+msgid "SoundFont"
+msgstr "Äänikirjasin"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:223
+msgid "MIDI Clock and System messages"
+msgstr "MIDI-kello ja järjestelmä-viestit"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:229
+msgid "Send MIDI Clock, Start and Stop"
+msgstr "Lähetä MIDI-kello, Aloitus ja Lopetus"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:230
+msgid "Accept Start, Stop and Continue"
+msgstr "Hyväksy Aloita, Lopeta ja Jatka"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:241
+msgid "MIDI Machine Control mode"
+msgstr "MIDI-koneen hallintatila"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:248
+msgid "MMC Master"
+msgstr "MMC Keskus"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:249
+msgid "MMC Slave"
+msgstr "MMC seurain"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:260
+msgid "MIDI Time Code mode"
+msgstr "MIDI-aikakoodi -tila"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:267
+msgid "MTC Master"
+msgstr "MTC mestari"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:268
+msgid "MTC Slave"
+msgstr "MTC seurain"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:281
+msgid "Automatically connect sync output to all devices in use"
+msgstr ""
+"Yhdistä automaattisesti sync-ulostulo kaikkiin käytössä oleviin laitteisiin"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:292
+msgid "MIDI Sync"
+msgstr "MIDI-sync"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:308
+msgid "sfxload path"
+msgstr "sfxload-polku"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:315
+msgid "Soundfont path"
+msgstr "Äänikirjasin-polku"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:67
+msgid "%1 minutes %2.%3%4 seconds (%5 units, %6 measures)"
+msgstr "%1 minuuttia %2.%3%4 sekuntia (%5 yksikköä, %6 tahtia)"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:133
+msgid "Filename:"
+msgstr "Tiedostonimi:"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:136
+msgid "Formal duration (to end marker):"
+msgstr "Muodollinen kesto (kirjanmerkin loppuun):"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:141
+msgid "Playing duration:"
+msgstr "Soittokesto:"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:146
+msgid "Tracks:"
+msgstr "Raidat:"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:147
+msgid "%1 used, %2 total"
+msgstr "%1 käytössä, %2 yhteensä"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:152
+msgid "Segments:"
+msgstr "Osat:"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:153
+msgid "%1 MIDI, %2 audio, %3 total"
+msgstr "%1 MIDI, %2 ääni, %3 yhteensä"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:161
+msgid "Statistics"
+msgstr "Tilasto"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:170
+#: ../src/gui/editors/parameters/InstrumentParameterBox.cpp:155
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:92
+msgid "Track"
+msgstr "Raita"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:171
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:125
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:90
+msgid "Label"
+msgstr "Otsake"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:172
+msgid "Time"
+msgstr "Aika"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:174
+msgid "Events"
+msgstr "Tapahtumat"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:175
+msgid "Polyphony"
+msgstr "Moniäänisyys"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:176
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:126
+msgid "Repeat"
+msgstr "Kertaus"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:178
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:128
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:305
+#: ../src/gui/general/EditView.cpp:1488
+msgid "Transpose"
+msgstr "Siirrä"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:179
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:129
+msgid "Delay"
+msgstr "Viive"
+
+#: ../src/gui/configuration/AudioConfigurationPage.h:61
+#: ../src/gui/configuration/AudioPropertiesPage.h:58
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:204
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:523
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:524
+msgid "Audio"
+msgstr "Ääni"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:204
+#: ../src/gui/configuration/MIDIConfigurationPage.h:62
+msgid "MIDI"
+msgstr "MIDI"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:317
+msgid "Segment Summary"
+msgstr "Osan yhteenveto"
+
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:63
+msgid "Audio file path:"
+msgstr "Äänitiedostopolku:"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:137
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:68
+msgid "Choose..."
+msgstr "Valitse..."
+
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:73
+msgid "Disk space remaining:"
+msgstr "Jäljellä oleva levytila:"
+
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:78
+msgid "Equivalent minutes of 16-bit stereo:"
+msgstr "Vastaava minuuttimäärä 16-bittisenä stereona:"
+
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:90
+msgid "Modify audio path"
+msgstr "Muokkaa äänipolkua"
+
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:113
+msgid "%1 out of %2 (%3% used)"
+msgstr "%1 %2:sta (%3% käytetty)"
+
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:144
+msgid "minutes at"
+msgstr "minuuttia kohdassa"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.h:63
+msgid "MIDI Settings"
+msgstr "MIDI-asetukset"
+
+#: ../src/gui/configuration/AudioConfigurationPage.h:62
+#: ../src/gui/configuration/AudioPropertiesPage.h:59
+msgid "Audio Settings"
+msgstr "Ääniasetukset"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:87
+msgid "Default layout mode"
+msgstr "Oletustaittotila"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:91
+msgid "Linear layout"
+msgstr "Suoraviivainen taitto"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:92
+msgid "Continuous page layout"
+msgstr "Jatkuva sivutaitto"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:93
+msgid "Multiple page layout"
+msgstr "Usean sivun taitto"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:101
+msgid "Default spacing"
+msgstr "Oletusvälistys"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:125
+msgid "Default duration factor"
+msgstr "Oletus kestokerroin"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:141
+msgid "Full"
+msgstr "Täysi"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:152
+msgid "Show track headers (linear layout only)"
+msgstr "Näytä raidan otsikot (vain lineaarinen asettelu)"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:158
+msgid "When needed"
+msgstr "Tarvittaessa"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:166
+msgid ""
+"\"Always\" and \"Never\" mean what they usually mean\n"
+"\"When needed\" means \"when staves are too many to all fit in the current "
+"window\""
+msgstr ""
+"\"Aina\" ja \"Ei koskaan\" tarkoittavat mitä ne yleensä tarkoittavat\n"
+"\"Tarvittaessa\" tarkoitta \"kun nuottirivejä on enemmän kuin mitä nykyiseen "
+"ikkunaan mahtuu\""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:178
+msgid "Show non-notation events as question marks"
+msgstr "Näytä ei-nuotitustapahtumat kysymysmerkein"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:188
+msgid "Show notation-quantized notes in a different color"
+msgstr "Näytä nuotinnus-yksiköidyt nuotit eri värillä"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:198
+msgid "Show \"invisible\" events in grey"
+msgstr "Näytä \"näkymättömät\" tapahtumat harmaalla"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:208
+msgid "Show notes outside suggested playable range in red"
+msgstr "Näytä nuotit ehdotetun soittoalueen ulkopuolelta punaisina"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:218
+msgid "Highlight superimposed notes with a halo effect"
+msgstr "Väritä päällekkäiset nuotit halo-efektillä"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:231
+msgid "When recording MIDI, split-and-tie long notes at barlines"
+msgstr "MIDI-nauhoituksessa jaa-ja-sido pitkät nuotit tahtiviivojen kohdalla"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:242
+msgid "Layout"
+msgstr "Taitto"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:255
+msgid "Default note style for new notes"
+msgstr "Oletusnuotinnustyyli uusille nuoteille"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:287
+msgid "When inserting notes..."
+msgstr "Kun syötetään nuotteja..."
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:294
+msgid "Split notes into ties to make durations match"
+msgstr "Jaa nuotit sidottuina, jotta kestot sopivat yhteen"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:295
+msgid "Ignore existing durations"
+msgstr "Sivuuta olemassa olevat kestot"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:305
+msgid "Auto-beam on insert when appropriate"
+msgstr "Palkita syötettävät nuotit automaattisesti, kun se on sopivaa"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:317
+#: ../src/gui/editors/notation/NotationEraser.cpp:54
+msgid "Collapse rests after erase"
+msgstr "Litistä tauot poiston jälkeen"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:328
+msgid "Default paste type"
+msgstr "Oletettu liittämistyyppi"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:350
+msgid "Editing"
+msgstr "Muokkaus"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:362
+msgid "Accidentals in one octave..."
+msgstr "Etumerkit yhdessä oktaavissa..."
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:364
+msgid "Affect only that octave"
+msgstr "Vaikuta vain tähän oktaaviin"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:365
+msgid "Require cautionaries in other octaves"
+msgstr "Vaadi varoitusetumerkit muissa oktaaveissa"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:366
+msgid "Affect all subsequent octaves"
+msgstr "Vaikuta kaikissa seuraavissa oktaaveissa"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:374
+msgid "Accidentals in one bar..."
+msgstr "Etumerkit yhdessä tahdissa..."
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:376
+msgid "Affect only that bar"
+msgstr "Vaikuta vain tässä tahdissa"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:377
+msgid "Require cautionary resets in following bar"
+msgstr "Vaadi varoitusetumerkkien nollaus seuraavissa tahdeissa"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:378
+msgid "Require explicit resets in following bar"
+msgstr "Vaadi yksikäsiteinen nollaus seuraavassa tahdissa"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:386
+msgid "Key signature cancellation style"
+msgstr "Avainmerkinnän perumisen tyyli"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:388
+msgid "Cancel only when entering C major or A minor"
+msgstr "Peru vain kun syötetään C-duuri tai A-molli"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:389
+msgid "Cancel whenever removing sharps or flats"
+msgstr "Peru aina kun poistetaan korotuksia tai alennuksia"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:390
+msgid "Cancel always"
+msgstr "Peru aina"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:400
+msgid "Accidentals"
+msgstr "Etumerkit"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:441
+msgid "Notation font"
+msgstr "Nuotinnuskirjasin"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:467
+msgid "Origin:"
+msgstr "Lähde:"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:471
+msgid "Copyright:"
+msgstr "Copyright:"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:475
+msgid "Mapped by:"
+msgstr "Kartoittanut:"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:479
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:81
+msgid "Type:"
+msgstr "Tyyppi:"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:508
+msgid "Font size for single-staff views"
+msgstr "Kirjasinkoko yhden viivaston näkymässä"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:516
+msgid "Font size for multi-staff views"
+msgstr "Kirjasinkoko usean viivaston näkymässä"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:524
+msgid "Font size for printing (pt)"
+msgstr "Kirjasinkoko tulostuksessa (pt)"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:541
+msgid "Text font"
+msgstr "Tekstikirjasin"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:549
+msgid "Sans-serif font"
+msgstr "Sans-serif kirjasin"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:664
+msgid "%1 (smooth)"
+msgstr "%1 (tasainen)"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:667
+msgid "%1 (jaggy)"
+msgstr "%1 (pykälletty)"
+
+#: ../src/gui/configuration/LatencyConfigurationPage.cpp:58
+msgid "JACK latency"
+msgstr "JACK vasteaika"
+
+#: ../src/gui/configuration/LatencyConfigurationPage.cpp:61
+msgid ""
+"Use the \"Fetch JACK latencies\" button to discover the latency values set "
+"at\n"
+"the sequencer. It's recommended that you use the returned values but it's "
+"also\n"
+"possible to override them manually using the sliders. Note that if you "
+"change\n"
+"your JACK server parameters you should always fetch the latency values "
+"again.\n"
+"The latency values will be stored by Rosegarden for use next time."
+msgstr ""
+"Käytä \"Nouda JACK vasteajat\"-painiketta löytääksesi sekvensseriin "
+"asetettavat viivearvot. On suositeltavaa että käytät palautettua arvoa, "
+"mutta on myös\n"
+"mahdollista kirjoittaa ne yli käsin käyttämällä viivaimia. Huomaa, että jos "
+"muutat\n"
+"JACK-serverin ominaisuuksia, sinun täytyy noutaa aina vasteaika-arvot "
+"uudelleen.\n"
+"Rosegarden tallentaa vasteaika-arvot seuraavaa käyttökertaa varten."
+
+#: ../src/gui/configuration/LatencyConfigurationPage.cpp:65
+msgid "JACK playback latency (in ms)"
+msgstr "JACK-toiston vasteaika (ms)"
+
+#: ../src/gui/configuration/LatencyConfigurationPage.cpp:66
+msgid "JACK record latency (in ms)"
+msgstr "JACK-nauhoituksen vasteaika (ms)"
+
+#: ../src/gui/configuration/LatencyConfigurationPage.cpp:68
+msgid "Fetch JACK latencies"
+msgstr "Nouda JACK-viiveet"
+
+#: ../src/gui/configuration/LatencyConfigurationPage.cpp:121
+msgid "JACK Latency"
+msgstr "JACK-vasteaika"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:92
+msgid "Audio preview scale"
+msgstr "Ääniesikatselun asteikko"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:96
+msgid "Linear - easier to see loud peaks"
+msgstr "Lineaarinen - helpompi nähdä melupiikit"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:97
+msgid "Meter scaling - easier to see quiet activity"
+msgstr "Metrijakoinen mitta - helpompi nähdä hiljaisuustoiminta"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:105
+msgid "Record audio files as"
+msgstr "Nauhoita äänitiedostot nimellä"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:107
+msgid "16-bit PCM WAV format (smaller files)"
+msgstr "16-bittinen PCM WAV-muoto (pienemmät tiedostot)"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:108
+msgid "32-bit float WAV format (higher quality)"
+msgstr "32-bittinen liukuluku WAV-muoto (korkeampi laatu)"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:117
+msgid "External audio editor"
+msgstr "Ulkoinen äänenmuokkain"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:145
+msgid "Create JACK outputs"
+msgstr "Luo JACK-ulostulo"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:150
+msgid "for individual audio instruments"
+msgstr "ääni-instrumenteille"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:157
+msgid "for submasters"
+msgstr "alakeskuksille"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:184
+msgid ""
+"Rosegarden can start the JACK audio daemon (jackd) for you automatically if "
+"it isn't already running when Rosegarden starts.\n"
+"\n"
+"This is recommended for beginners and those who use Rosegarden as their main "
+"audio application, but it might not be to the liking of advanced users.\n"
+"\n"
+"If you want to start JACK automatically, make sure the command includes a "
+"full path where necessary as well as any command-line arguments you want to "
+"use.\n"
+"\n"
+"For example: /usr/local/bin/jackd -d alsa -d hw -r44100 -p 2048 -n 2\n"
+"\n"
+msgstr ""
+"Rosegarden voi käynnistää JACK-äänipalvelimen (jackd) automaattisesti,\n"
+"jos sitä ei vielä ajeta Rosegardenin käynnistyessä.\n"
+"\n"
+"Tätä käytäntöä suositellaan aloitteleville ja niille, jotka haluavat käyttää "
+"Rosegardenia\n"
+"pääasiallisena äänisovelluksena, mutta se ei välttämättä miellytä "
+"edistyneitä käyttäjiä.\n"
+"\n"
+"Jos haluat aloittaa JACK:in automaattisesti, varmista, että komento sisältää "
+"tarvittavan\n"
+"polun, sekä tarvittavat komentorivi-argumentit, joita haluat käyttää.\n"
+"Esimerkiksi: /usr/local/bin/jackd -d alsa -d hw -r44100 -p 2048 -n 2\n"
+"\n"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:196
+msgid "Start JACK when Rosegarden starts"
+msgstr "Aloita JACK kun Rosegarden käynnistyy"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:201
+msgid "JACK command"
+msgstr "JACK-komento"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:214
+msgid "JACK Startup"
+msgstr "JACK-aloitus"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:224
+msgid "External audio editor path"
+msgstr "Ulkoisen äänenmuokkaimen polku"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:262
+msgid "External audio editor \"%1\" not found or not executable"
+msgstr "Ulkoista äänieditoria \"%1\" ei löytynyt tai se ei ole suoritettavissa"
+
+#: ../src/gui/configuration/ColourConfigurationPage.cpp:70
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:448
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:863
+msgid "Add New Color"
+msgstr "Lisää uusi väri"
+
+#: ../src/gui/configuration/ColourConfigurationPage.cpp:74
+msgid "Delete Color"
+msgstr "Poista väri"
+
+#: ../src/gui/configuration/ColourConfigurationPage.cpp:93
+msgid "Color Map"
+msgstr "Värikartta"
+
+#: ../src/gui/configuration/ColourConfigurationPage.cpp:128
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:983
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:882
+msgid "New Color Name"
+msgstr "Uusi värinimi"
+
+#: ../src/gui/configuration/ColourConfigurationPage.cpp:130
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:59
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:984
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:883
+#: ../src/gui/studio/DeviceManagerDialog.cpp:115
+#: ../src/gui/studio/DeviceManagerDialog.cpp:174
+msgid "New"
+msgstr "Uusi"
+
+#: ../src/gui/configuration/LatencyConfigurationPage.h:62
+msgid "Latency"
+msgstr "Vasteaika"
+
+#: ../src/gui/configuration/LatencyConfigurationPage.h:63
+msgid "Sequencer Latency"
+msgstr "Sekvensserin vasteaika"
+
+#: ../src/gui/configuration/ColourConfigurationPage.h:61
+msgid "Color Settings"
+msgstr "Väriasetukset"
+
+#: ../src/gui/studio/MidiDeviceListViewItem.cpp:55
+#: ../src/gui/studio/MidiKeyMapListViewItem.cpp:44
+msgid "Key Mapping"
+msgstr "Näppäimien kartoitus"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:97
+msgid "Manage MIDI Banks and Programs"
+msgstr "Hallitse MIDI-pankkeja ja ohjelmia"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:128
+msgid "MIDI Device"
+msgstr "MIDI-laite"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:130
+#: ../src/gui/studio/BankEditorDialog.cpp:219
+msgid "MSB"
+msgstr "MSB"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:131
+#: ../src/gui/studio/BankEditorDialog.cpp:218
+msgid "LSB"
+msgstr "LSB"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:140
+msgid "Add Bank"
+msgstr "Lisää pankki"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:141
+msgid "Add Key Mapping"
+msgstr "Lisää näppäinyhdistelmä"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:153
+msgid "Add a Bank to the current device"
+msgstr "Lisää pankki nykyiselle laitteelle"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:157
+msgid "Add a Percussion Key Mapping to the current device"
+msgstr "Lisää lyömäsoitinnäppäinyhdistelmä nykyiselle laitteelle"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:161
+msgid "Delete the current Bank or Key Mapping"
+msgstr "Poista nykyinen pankki tai näppäinyhdistelmä"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:165
+msgid "Delete all Banks and Key Mappings from the current Device"
+msgstr "Poista kaikkia pankit ja näppäinyhdistelmät nykyiseltä laitteelta"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:167
+#: ../src/gui/studio/DeviceManagerDialog.cpp:117
+msgid "Import..."
+msgstr "Tuo..."
+
+#: ../src/gui/studio/BankEditorDialog.cpp:168
+#: ../src/gui/studio/DeviceManagerDialog.cpp:118
+msgid "Export..."
+msgstr "Vie..."
+
+#: ../src/gui/studio/BankEditorDialog.cpp:176
+msgid ""
+"Import Bank and Program data from a Rosegarden file to the current Device"
+msgstr ""
+"Tuo pankki- ja ohjelmadataa Rosegarden-tiedostosta nykyiselle laitteelle"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:179
+msgid ""
+"Export all Device and Bank information to a Rosegarden format interchange "
+"file"
+msgstr ""
+"Vie kaikki laite- ja pankkitieto Rosegardenin formaattivaihto-tiedostoon"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:190
+msgid "Copy all Program names from current Bank to clipboard"
+msgstr "Kopioi kaikki ohjelmien nimet nykyisestä pankista leikepöydälle"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:194
+msgid "Paste Program names from clipboard to current Bank"
+msgstr "Liitä ohjelmanimiä leikepöydältä nykyiselle pankille"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:216
+msgid "Show Variation list based on "
+msgstr "Näytä muunnoslista, jonka perustana on"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1010
+msgid "<new bank>"
+msgstr "<uusi pankki>"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1046
+msgid "<new mapping>"
+msgstr "<uusi kartoitus>"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1048
+msgid "<new mapping %1>"
+msgstr "<uusi kartoitus %1>"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1089
+msgid "Really delete this bank?"
+msgstr "Poistetaanko todella tämä pankki?"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1137
+msgid "Really delete this key mapping?"
+msgstr "Poistetaanko todella tämä näppäinyhdistelmä?"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1187
+msgid "Really delete all banks for "
+msgstr "Poistetaanko todella kaikki pankit"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1476
+msgid "Import Banks from Device in File"
+msgstr "Tuo pankit laitteesta tiedostoon"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1623
+#: ../src/gui/studio/DeviceManagerDialog.cpp:770
+msgid "Export Device as..."
+msgstr "Vie Laite nimellä..."
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1694
+msgid ""
+"There are unsaved changes.\n"
+"Do you want to apply the changes before exiting the Bank Editor or discard "
+"the changes ?"
+msgstr ""
+"Löytyi tallentamattomia muutoksia.\n"
+"Haluatko tehdä muutokset ennen pankkimuokkaimen sulkemista vai hylätä "
+"muutokset ?"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1697
+msgid "Unsaved Changes"
+msgstr "Tallentamattomia muutoksia"
+
+#: ../src/gui/studio/NameSetEditor.cpp:68
+msgid "Librarian"
+msgstr "Kirjastonhoitaja"
+
+#: ../src/gui/studio/NameSetEditor.cpp:75
+msgid "Email"
+msgstr "Sähköposti"
+
+#: ../src/gui/studio/NameSetEditor.cpp:80
+msgid ""
+"The librarian maintains the Rosegarden device data for this device.\n"
+"If you've made modifications to suit your own device, it might be worth\n"
+"liaising with the librarian in order to publish your information for the "
+"benefit\n"
+"of others."
+msgstr ""
+"Kirjastonhoitaja ylläpitää Rosegardenin laitadata tätä laitetta varten.\n"
+"Jos olet tehnyt oman laitteesi vaatimia muutoksia, saataa olla\n"
+"arvokasta tehdä yhteistyötä kirjastonhoitajan kanssa julkaistaksesi tietosi\n"
+"hyödyttämään muita."
+
+#: ../src/gui/studio/MidiBankListViewItem.cpp:51
+#: ../src/gui/studio/MidiDeviceListViewItem.cpp:48
+msgid "Percussion Bank"
+msgstr "Lyömäsoitinpankki"
+
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:84
+#: ../src/gui/studio/MidiBankListViewItem.cpp:51
+#: ../src/gui/studio/MidiDeviceListViewItem.cpp:48
+msgid "Bank"
+msgstr "Pankki"
+
+#: ../src/gui/studio/ChangeRecordDeviceCommand.h:39
+msgid "Change Record Device"
+msgstr "Vaihda nauhoituslaite"
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:61
+#: ../src/gui/studio/DeviceManagerDialog.cpp:96
+msgid "Manage MIDI Devices"
+msgstr "Hallitse MIDI-laitteita"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:98
+msgid "Play devices"
+msgstr "Toistolaitteet"
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:76
+#: ../src/gui/studio/DeviceManagerDialog.cpp:106
+#: ../src/gui/studio/DeviceManagerDialog.cpp:165
+msgid "Connection"
+msgstr "Yhteys"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:119
+msgid "Banks..."
+msgstr "Pankit..."
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:120
+msgid "Control Events..."
+msgstr "Hallintatapahtumat..."
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:126
+msgid "Create a new Play device"
+msgstr "Luo uusi toistolaite"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:129
+#: ../src/gui/studio/DeviceManagerDialog.cpp:184
+msgid "Delete the selected device"
+msgstr "Poista tämä valittu laite"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:132
+msgid ""
+"Import Bank, Program and Controller data from a Rosegarden file to the "
+"selected device"
+msgstr ""
+"Tuo pankki, ohjelma ja hallintadata Rosegarden-tiedostosta valittuun "
+"laitteeseen"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:135
+msgid "Export Bank and Controller data to a Rosegarden interchange file"
+msgstr "Vie pankki- ja ohjaintiedot Rosegradenin vaihtotiedostoon"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:138
+msgid "View and edit Banks and Programs for the selected device"
+msgstr "Katso ja muokkaa valitun laitteen pankkia ja ohjelmia"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:141
+msgid ""
+"View and edit Control Events for the selected device - these are special "
+"Event types that you can define against your device and control through "
+"Control Rulers or the Instrument Parameter Box "
+msgstr ""
+"Katso ja muokkaa valitun laitteen hallintatapahtumia - nämä ovat "
+"erikoistapahtumatyyppejä, jotka voit määrittää laitekohtaisesti ja joita "
+"voit hallita Hallinta-viivaimista tai Instrumenttimuuttujat-laatikosta"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:156
+msgid "Record devices"
+msgstr "Nauhoituslaitteet"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:164
+msgid "Current"
+msgstr "Nykyinen"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:181
+msgid "Create a new Record device"
+msgstr "Luo uusi nauhoituslaite"
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:360
+#: ../src/gui/studio/DeviceEditorDialog.cpp:378
+#: ../src/gui/studio/DeviceManagerDialog.cpp:486
+#: ../src/gui/studio/DeviceManagerDialog.cpp:501
+msgid "New Device"
+msgstr "Uusi laite"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:703
+msgid "Import from Device in File"
+msgstr "Tuo laitetiedostosta"
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:55
+msgid "Remap Instrument assigments..."
+msgstr "Merkitse instrumentit uudelleen..."
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:62
+msgid "Device or Instrument"
+msgstr "Laite tai instrumentti"
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:65
+msgid "Remap Tracks by all Instruments on a Device or by single Instrument"
+msgstr ""
+"Merkitse raidat laitteen kaikilla instrumenteilla tai yhdellä instrumentilla"
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:74
+msgid "Choose Source and Destination"
+msgstr "Valitse lähde ja kohde"
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:77
+msgid "From"
+msgstr "Lähteestä"
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:78
+msgid "To"
+msgstr "Kohteeseen"
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:120
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:121
+msgid "<no devices>"
+msgstr "<ei laitteita>"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:155
+msgid "Show Audio &Faders"
+msgstr "Näytä äänen &häivyttimet"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:160
+msgid "Show Synth &Faders"
+msgstr "Näytä Synth -häi&vyttimet"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:165
+msgid "Show &Submasters"
+msgstr "Näytä &alakeskukset"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:170
+msgid "Show &Plugin Buttons"
+msgstr "Näytä &lisäosa-painikkeet"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:175
+msgid "Show &Unassigned Faders"
+msgstr "Näytä &liittämättömät häivytykset"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:184
+#, c-format
+msgid ""
+"_n: 1 Input\n"
+"%n Inputs"
+msgstr ""
+"1 Sisääntulo\n"
+"%n Sisääntuloa"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:194
+msgid "No Submasters"
+msgstr "Ei alakeskuksia"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:203
+#, c-format
+msgid ""
+"_n: 1 Submaster\n"
+"%n Submasters"
+msgstr ""
+"1 alakeskus\n"
+"%n alakeskusta"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:279
+msgid "Audio Mixer"
+msgstr "Äänisekoitin"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:311
+msgid "Record input source"
+msgstr "Nauhoitussisääntulon lähde"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:322
+msgid "Output destination"
+msgstr "Ulostulos kohde"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:336
+#: ../src/gui/studio/AudioMixerWindow.cpp:495
+msgid "Pan"
+msgstr "Jako"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:355
+msgid "Mono or stereo"
+msgstr "Yksi- tai kaksikanavainen"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:364
+#: ../src/gui/studio/AudioMixerWindow.cpp:513
+msgid "Mute"
+msgstr "Vaimennettu"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:373 rc.cpp:408
+#, no-c-format
+msgid "Solo"
+msgstr "Soolo"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:382
+msgid "Arm recording"
+msgstr "Käsivarainen nauhoitus"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:400
+#, c-format
+msgid "Audio %1"
+msgstr "Ääni %1"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:404
+#, c-format
+msgid "Synth %1"
+msgstr "Synth %1"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:578
+#: ../src/gui/studio/AudioMixerWindow.cpp:580
+msgid "Audio master output level"
+msgstr "Äänen pääulostulotaso"
+
+#: ../src/gui/studio/SynthPluginManagerDialog.cpp:71
+msgid "Manage Synth Plugins"
+msgstr "Hallitse Synth-lisäosia"
+
+#: ../src/gui/studio/SynthPluginManagerDialog.cpp:78
+msgid "Synth plugins"
+msgstr "Synth-lisäosat"
+
+#: ../src/gui/studio/SynthPluginManagerDialog.cpp:145
+msgid "Controls"
+msgstr "Hallitsimet"
+
+#: ../src/gui/studio/SynthPluginManagerDialog.cpp:152
+msgid "Editor >>"
+msgstr "Muokkain >>"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:66
+#: ../src/gui/studio/MidiProgramsEditor.cpp:169
+msgid "Bank and Program details"
+msgstr "Pankin ja ohjelman yksityiskohdat"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:67
+msgid "Programs"
+msgstr "Ohjelmat"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2711
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:88
+#: ../src/gui/studio/MidiProgramsEditor.cpp:93
+msgid "Percussion"
+msgstr "Lyömäsoittimet"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:99
+msgid "MSB Value"
+msgstr "MSB:n arvo"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:107
+msgid ""
+"Selects a MSB controller Bank number (MSB/LSB pairs are always unique for "
+"any Device)"
+msgstr ""
+"Valitsee MSB-ohjaimen pankkiluvun (MSB/LSB -parit ovat aina ainutkertaisia "
+"kullekin laitteelle)"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:111
+msgid ""
+"Selects a LSB controller Bank number (MSB/LSB pairs are always unique for "
+"any Device)"
+msgstr ""
+"Valitsee LSB-ohjaimen pankkiluvun (MSB/LSB -parit ovat aina ainutkertaisia "
+"kullekin laitteelle)"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:116
+msgid "LSB Value"
+msgstr "LSB-arvo"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:254
+#: ../src/gui/studio/MidiProgramsEditor.cpp:541
+#, c-format
+msgid "Key Mapping: %1"
+msgstr "Näppäinkartta: %1"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:476
+msgid "<no key mapping>"
+msgstr "<ei näppäinyhdistelmää>"
+
+#: ../src/gui/studio/MidiKeyMappingEditor.cpp:57
+#: ../src/gui/studio/MidiKeyMappingEditor.cpp:81
+msgid "Key Mapping details"
+msgstr "Näppäinyhdistelmän yksityiskohdat"
+
+#: ../src/gui/studio/MidiKeyMappingEditor.cpp:58
+msgid "Pitches"
+msgstr "Äänenkorkeudet"
+
+#: ../src/gui/studio/MidiMixerWindow.cpp:152
+msgid "MIDI Mixer"
+msgstr "MIDI-sekoitin"
+
+#: ../src/gui/studio/MidiMixerWindow.cpp:199
+msgid "Volume"
+msgstr "Äänenvoimakkuus"
+
+#: ../src/gui/studio/AudioPluginOSCGUIManager.cpp:444
+msgid "Rosegarden Plugin"
+msgstr "Rosegardenin lisäosa"
+
+#: ../src/gui/studio/AudioPluginOSCGUIManager.cpp:447
+#, c-format
+msgid "Rosegarden: %1"
+msgstr "Rosegarden: %1"
+
+#: ../src/gui/studio/AudioPluginOSCGUIManager.cpp:449
+msgid "Rosegarden: %1: %2"
+msgstr "Rosegarden: %1: %2"
+
+#: ../src/gui/studio/AudioPluginOSCGUIManager.cpp:450
+#, c-format
+msgid "Plugin slot %1"
+msgstr "Lisäosan kiinnityspaikka %1"
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:92
+msgid "Add Play Device"
+msgstr "Lisää toistolaite"
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:93
+msgid "Add Record Device"
+msgstr "Lisää nauhoituslaite"
+
+#: ../src/commands/studio/CreateOrDeleteDeviceCommand.h:68
+#: ../src/gui/studio/DeviceEditorDialog.cpp:94
+msgid "Delete Device"
+msgstr "Poista laite"
+
+#: ../src/gui/editors/segment/PlayList.cpp:77
+#: ../src/gui/studio/DeviceEditorDialog.cpp:156
+#: ../src/gui/studio/DeviceEditorDialog.cpp:361
+msgid "Play"
+msgstr "Toista"
+
+#: ../src/commands/segment/SegmentRecordCommand.cpp:37
+#: ../src/gui/studio/DeviceEditorDialog.cpp:156
+#: ../src/gui/studio/DeviceEditorDialog.cpp:379 rc.cpp:394
+#, no-c-format
+msgid "Record"
+msgstr "Nauhoita"
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:256
+msgid "Apply pending changes?"
+msgstr "Pane toimeen odottavat muutokset?"
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:359
+#: ../src/gui/studio/DeviceEditorDialog.cpp:377
+msgid "<new device>"
+msgstr "<uusi laite>"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentEraser.cpp:82
+msgid "Click on a segment to delete it"
+msgstr "Klikkaa osan päällä poistaaksesi sen"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSplitter.cpp:166
+msgid ""
+"Click on a segment to split it in two; hold Shift to avoid snapping to beat "
+"grid"
+msgstr ""
+"Klikkaa osan päällä halkaistaksesi sen kahtia, pidä Shift pohjassa "
+"välttääksesi iskuruudukkoon lukkiutumisen"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSplitter.cpp:168
+msgid "Click on a segment to split it in two"
+msgstr "Klikkaa osaa halkaistaksesi sen kahtia"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:81
+msgid "Click and drag to select segments"
+msgstr "Klikkaa ja vedä valitaksesi osia"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentMover.cpp:154
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:238
+msgid "Move Segment"
+msgstr "Siirrä osaa"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentMover.cpp:154
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:239
+msgid "Move Segments"
+msgstr "Siirrä osia"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:217
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:169
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:141
+#: ../src/gui/editors/segment/segmentcanvas/SegmentMover.cpp:210
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:255
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:359
+msgid "Hold Shift to avoid snapping to beat grid"
+msgstr "Klikkaa Shift välttääksesi iskuruudukkoon lukkiutumisen"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:485
+msgid ""
+"Click and drag to select segments; middle-click and drag to draw an empty "
+"segment"
+msgstr ""
+"Klikkaa ja vedä valittuja osia; klikkaa keskimmäisellä näppäimellä ja vedä "
+"piirtääksesi tyhjän osan"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:384
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:502
+msgid ""
+"Click and drag to resize a segment; hold Ctrl as well to rescale its contents"
+msgstr ""
+"Klikkaa ja vedä muuttaaksesi osan kokoa, pidä myös Ctrl pohjassa "
+"mitoittaaksesi uudelleen myös sisällön"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:386
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:504
+msgid "Click and drag to rescale segment"
+msgstr "Klikkaa ja vedä mitoittaaksesi osan uudelleen"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:509
+msgid "Click and drag to move segments; hold Ctrl as well to copy them"
+msgstr ""
+"Klikkaa ja vedä siirtääksesi osia; pidä myös Ctrl pohjassa kopioidaksesi "
+"niitä"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:511
+msgid "Click and drag to copy segments"
+msgstr "Klikkaa ja vedä kopioidaksesi osia"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:515
+msgid ""
+"Click and drag to move segment; hold Ctrl as well to copy it; double-click "
+"to edit"
+msgstr ""
+"Klikkaa ja vedä siirtääksesi osan; pidä myös Ctrl pohjassa kopioidaksesi sen;"
+"tuplaklikkaa muokataksesi"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:517
+msgid "Click and drag to copy segment"
+msgstr "Klikkaa ja vedä kopioidaksesi osan"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:157
+msgid ""
+"The audio file path does not exist or is not writable.\n"
+"You must set the audio file path to a valid directory in Document Properties "
+"before rescaling an audio file.\n"
+"Would you like to set it now?"
+msgstr ""
+"Äänitiedostopolkua ei ole tai siihen kirjoittaminen ei onnistu.\n"
+"Aseta äänitiedostopoluksi kelpo hakemisto Dokumentin ominaisuuksista ennen "
+"äänitiedoston mitoittamista uudelleen.\n"
+"Haluatko asettaa sen nyt?"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:261
+msgid ""
+"Hold Shift to avoid snapping to beat grid; hold Ctrl as well to rescale "
+"contents"
+msgstr ""
+"Pidä Shift pohjassa välttääksesi iskuruudukkoon lukkiutumisen; pidä myös "
+"Ctrl pohjassa mitoittaaksesi sisällön uudelleen"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentMover.cpp:325
+msgid "Click and drag to move a segment"
+msgstr "Klikkaa ja vedä siirtääksesi osan"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentPencil.cpp:225
+msgid "Hold Shift to avoid snapping to bar lines"
+msgstr "Pidä Shift pohjassa välttääksesi tahtiviivoihin lukkiutumisen"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentPencil.cpp:283
+msgid "Record or drop audio here"
+msgstr "Nauhoita tai pudoa ääntä tähän"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentPencil.cpp:289
+msgid ""
+"Click and drag to draw an empty segment. Control+Alt click and drag to draw "
+"in overlap mode."
+msgstr ""
+"Klikkaa ja vedä tyhjä osa. Ctrl+Alt -klikkaa ja vedä päällekkäistilassa."
+
+#: ../src/gui/editors/segment/TrackLabel.cpp:77
+msgid ""
+"Click and hold with left mouse button to assign this Track to an Instrument."
+msgstr ""
+"Napauta ja pidä vasenta hiiren korvaa pohjassa liittääksesi instrumentin "
+"tälle raidalle."
+
+#: ../src/gui/editors/segment/TrackLabel.cpp:191
+msgid "Change track name"
+msgstr "Vaihda raidan nimeä"
+
+#: ../src/gui/editors/segment/TrackLabel.cpp:192
+msgid "Enter new track name"
+msgstr "Syötä uusi raidan nimi"
+
+#: ../src/gui/editors/segment/TrackEditor.cpp:648
+msgid "Turn Repeating Segment into Real Copies"
+msgstr "Muuta kertautuva osa todellisiksi kopioiksi"
+
+#: ../src/gui/editors/segment/TrackEditor.cpp:650
+msgid "Turn Repeating Segments into Real Copies"
+msgstr "Muuta kertautuvat osat todellisiksi kopioiksi"
+
+#: ../src/gui/editors/segment/TrackEditor.cpp:814
+msgid ""
+"You can't drop files into Rosegarden from this client. Try using Konqueror "
+"instead."
+msgstr ""
+"Et voi pudottaa tiedostoja Rosegardenille tältä asiakasohjelmalta. Yritä "
+"Konqueror:in käyttöä sen sijaan."
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:85
+msgid "Manage Triggered Segments"
+msgstr "Hallitse sysäistäviä osia"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:89
+msgid "ID"
+msgstr "ID"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:735
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:93
+msgid "Base velocity"
+msgstr "Perusnopeus"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:94
+msgid "Triggers"
+msgstr "Sysääjät"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:115
+msgid "Add a Triggered Segment"
+msgstr "Lisää sysäistävä osa"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:119
+msgid "Delete a Triggered Segment"
+msgstr "Poista sysäistävä osa"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:123
+msgid "Delete All Triggered Segments"
+msgstr "Poista kaikki sysäistävät osat"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:127
+msgid "Close the Triggered Segment Manager"
+msgstr "Sulje sysäistävien osien hallitsin"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:169
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:245
+msgid "<no label>"
+msgstr "<ei otsaketta>"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:248
+msgid ""
+"_n: %1 on 1 track\n"
+"%1 on %n tracks"
+msgstr ""
+"%1 1:llä raidalla\n"
+"%1 %n:lla raidalla"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:284
+msgid ""
+"This will remove all triggered segments from the whole composition. Are you "
+"sure?"
+msgstr ""
+"Tämä poistaa kaikki sysäistävät osat koko sävellyksestä. Oletko varma?"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:288
+msgid "Remove all triggered segments"
+msgstr "Poista kaikki sysäistävät osat"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:313
+msgid "Trigger Segment Duration"
+msgstr "Sysäävän osan kesto"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:336
+#, c-format
+msgid ""
+"_n: This triggered segment is used 1 time in the current composition. Are "
+"you sure you want to remove it?\n"
+"This triggered segment is used %n times in the current composition. Are you "
+"sure you want to remove it?"
+msgstr ""
+"Tätä sysättävää osaa on käytetty 1:n kerran nykyisessä sävellyksessä. "
+"Haluatko varmasti poistaa sen?\n"
+"Tätä sysättävää osaa on käytetty %n kerran nykyisessä sävellyksessä. "
+"Haluatko varmasti poistaa sen?"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:400
+msgid "Pa&ste as New Triggered Segment"
+msgstr "Li&itä uutena sysättävänä osana"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1169
+#: ../src/gui/editors/segment/MarkerEditor.cpp:399
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:412
+#: ../src/gui/editors/tempo/TempoView.cpp:622
+msgid "&Musical Times"
+msgstr "&Musiikkiajat"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1179
+#: ../src/gui/editors/segment/MarkerEditor.cpp:409
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:422
+#: ../src/gui/editors/tempo/TempoView.cpp:632
+msgid "&Real Times"
+msgstr "&Tosiajat"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1189
+#: ../src/gui/editors/segment/MarkerEditor.cpp:419
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:432
+#: ../src/gui/editors/tempo/TempoView.cpp:642
+msgid "Ra&w Times"
+msgstr "Kä&sittelemättömät ajat"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:83
+msgid "Manage Markers"
+msgstr "Hallitse kirjanmerkkejä"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:86
+msgid "Marker time "
+msgstr "Kirjanmerkin aika "
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:87
+msgid "Marker text "
+msgstr "Merkintäteksti "
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:88
+msgid "Marker description "
+msgstr "Kirjanmerkin kuvaus "
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:95
+msgid "Pointer position"
+msgstr "Osoittimen sijainti"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:100
+msgid "Real time:"
+msgstr "Tosiaika:"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:103
+msgid "In measure:"
+msgstr "Tahdissa:"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:121
+msgid "Add a Marker"
+msgstr "Lisää kirjanmerkki"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:125
+msgid "Delete a Marker"
+msgstr "Poista kirjanmerkki"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:129
+msgid "Delete All Markers"
+msgstr "Poista kaikki kirjanmerkit"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:133
+msgid "Close the Marker Editor"
+msgstr "Sulje kirjanmerkkie muokkain"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:296
+msgid "Remove all markers"
+msgstr "Poista kaikki kirjanmerkit"
+
+#: ../src/gui/editors/segment/PlayList.cpp:76
+msgid "Add..."
+msgstr "Lisää..."
+
+#: ../src/gui/editors/segment/PlayList.cpp:78
+msgid "Move Up"
+msgstr "Siirrä ylös"
+
+#: ../src/gui/editors/segment/PlayList.cpp:79
+msgid "Move Down"
+msgstr "Siirrä alas"
+
+#: ../src/gui/editors/segment/PlayList.cpp:124
+msgid "Select one or more Rosegarden files"
+msgstr "Valitse yksi tai useampia Rosegarden-tiedostoja"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:73
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:55
+msgid "<not showing>"
+msgstr "<ei näyte>"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:89
+msgid "Manage Control Events"
+msgstr "Hallitse Hallintatapahtumia"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:91
+msgid "<no device>"
+msgstr "<ei laitetta>"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:99
+msgid " Control Events for %1 (device %2)"
+msgstr " Kohteen %1 tapahtumien hallinta (laite %2)"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:104
+msgid "Control Event name "
+msgstr "Hallintatapahtuman nimi "
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:105
+msgid "Control Event type "
+msgstr "Hallintatapahtuman tyyppi "
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:106
+msgid "Control Event value "
+msgstr "Hallintatapahtuman arvo "
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:107
+msgid "Description "
+msgstr "Kuvaus "
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:108
+msgid "Min "
+msgstr "Alin "
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:109
+msgid "Max "
+msgstr "Ylin "
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:110
+msgid "Default "
+msgstr "Oletus "
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:111
+msgid "Color "
+msgstr "Väri "
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:112
+msgid "Position on instrument panel"
+msgstr "Sijainti instrumenttitaulussa"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:136
+msgid "Add a Control Parameter to the Studio"
+msgstr "Lisää studion hallintamuuttuja"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:140
+msgid "Delete a Control Parameter from the Studio"
+msgstr "Poista studion hallintamuuttuja"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:144
+msgid "Close the Control Parameter editor"
+msgstr "Sulje hallintamuuttujien muokkain"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:221
+msgid "<default>"
+msgstr "<oletus>"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:62
+msgid "Edit Control Parameter"
+msgstr "Muokkaa Hallintamuuttujia"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:71
+msgid "Control Event Properties"
+msgstr "Hallitse tapahtuman ominaisuuksia"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:77
+msgid "Name:"
+msgstr "Nimi:"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:93
+msgid "Control Event value:"
+msgstr "Hallintatapahtuman arvo:"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:97
+msgid "Minimum value:"
+msgstr "Alin arvo:"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:101
+msgid "Maximum value:"
+msgstr "Ylin arvo:"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:105
+msgid "Default value:"
+msgstr "Oletusarvo:"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:109
+msgid "Color:"
+msgstr "Väri:"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:113
+msgid "Instrument Parameter Box position:"
+msgstr "Instrumenttimuuttujalaatikon sijainti:"
+
+#: ../src/gui/editors/segment/TrackButtons.cpp:209
+#: ../src/gui/editors/segment/TrackButtons.cpp:585
+#: ../src/gui/editors/segment/TrackButtons.cpp:935
+#: ../src/gui/editors/segment/TrackButtons.cpp:1127
+msgid "<no instrument>"
+msgstr "<ei instrumenttia>"
+
+#: ../src/gui/editors/segment/TrackButtons.cpp:352
+#: ../src/gui/editors/segment/TrackButtons.cpp:1094
+msgid "<untitled audio>"
+msgstr "<nimeämätön ääni>"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:130
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:662
+#: ../src/gui/editors/segment/TrackButtons.cpp:354
+#: ../src/gui/editors/segment/TrackButtons.cpp:1096
+msgid "<untitled>"
+msgstr "<ei nimeä>"
+
+#: ../src/gui/editors/segment/TrackButtons.cpp:1058
+msgid "Mute track"
+msgstr "Vaienna raita"
+
+#: ../src/gui/editors/segment/TrackButtons.cpp:1063
+msgid "Record on this track"
+msgstr "Nauhoita tälle raidalle"
+
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:88
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:1015
+msgid "Segment"
+msgstr "Osa"
+
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:89
+msgid "Segment Parameters"
+msgstr "Osan ominaisuudet"
+
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:366
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:697
+msgid "%1 ms"
+msgstr "%1 ms"
+
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:1031
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:910
+msgid "Highest playable note"
+msgstr "Korkein soiva nuotti"
+
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:1051
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:930
+msgid "Lowest playable note"
+msgstr "Alin soiva nuotti"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:93
+msgid "Track Parameters"
+msgstr "Raidan ominaisuudet"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:137
+msgid "Playback parameters"
+msgstr "Toiston ominaisuudet"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:172
+msgid "Recording filters"
+msgstr "Nauhoitussuodattimet"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:191
+msgid "Channel"
+msgstr "Kanava"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:203
+msgid "Staff export options"
+msgstr "Viivastoviennin asetukset"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:220
+msgid "Notation size:"
+msgstr "Nuotinnuksen koko:"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:225
+msgid "Small"
+msgstr "Pieni"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:226
+msgid "Tiny"
+msgstr "Pikkuruinen"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:233
+msgid "Bracket type:"
+msgstr "Sulkumerkin tyyppi:"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:237
+msgid "-----"
+msgstr "-----"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:238
+msgid "[----"
+msgstr "[----"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:239
+msgid "----]"
+msgstr "----]"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:240
+msgid "[---]"
+msgstr "[---]"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:241
+msgid "{----"
+msgstr "{----"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:242
+msgid "----}"
+msgstr "----}"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:243
+msgid "{[---"
+msgstr "{[---"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:244
+msgid "---]}"
+msgstr "---]}"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:253
+msgid "Create segments with"
+msgstr "Luo osat "
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:264
+msgid "Preset"
+msgstr "Esiasetus"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:272
+msgid "Load"
+msgstr "Lataa"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:282
+msgid "treble"
+msgstr "diskantti"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:283
+msgid "bass"
+msgstr "basso"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:284
+msgid "crotales"
+msgstr "crotales"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:285
+msgid "xylophone"
+msgstr "ksylofoni"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:286
+msgid "guitar"
+msgstr "kitarakitara"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:287
+msgid "contrabass"
+msgstr "kontrabasso"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:288
+msgid "celesta"
+msgstr "celesta"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:289
+msgid "old celesta"
+msgstr "vanha celesta"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:290
+msgid "french"
+msgstr "ranskalainen"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:291
+msgid "soprano"
+msgstr "sopraano"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:292
+msgid "mezzosoprano"
+msgstr "mezzosopraano"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:293
+msgid "alto"
+msgstr "altto"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:294
+msgid "tenor"
+msgstr "tenori"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:295
+msgid "baritone"
+msgstr "baritoni"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:296
+msgid "varbaritone"
+msgstr "varbaritoni"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:297
+msgid "subbass"
+msgstr "alibasso"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:327
+msgid "Lowest"
+msgstr "Matalin"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:329
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:336
+msgid "---"
+msgstr "---"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:331
+msgid "Choose the lowest suggested playable note, using a staff"
+msgstr "Valitse alin ehdotettu soiva nuotti, joka on viivastolla"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:334
+msgid "Highest"
+msgstr "Korkein"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:338
+msgid "Choose the highest suggested playable note, using a staff"
+msgstr "Valitse korkein ehdotettu soiva nuotti, joka on viivastolla"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:666
+msgid "[ Track %1 - %2 ]"
+msgstr "[ Raita %1 - %2 ]"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:985
+msgid "The instrument preset database is corrupt. Check your installation."
+msgstr ""
+"Instrumentin esiasetus-tietokanta on turmeltunut. Tarkista asennuksesi."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:173
+#: ../src/gui/editors/parameters/InstrumentParameterBox.cpp:54
+msgid "Instrument Parameters"
+msgstr "Instrumentin ominaisuudet"
+
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:85
+msgid "Variation"
+msgstr "Muunnelma"
+
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:86
+msgid "Program"
+msgstr "Ohjelma"
+
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:87
+msgid "Channel out"
+msgstr "Kanava ulos"
+
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:215
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:221
+msgid "[ %1 ]"
+msgstr "[ %1 ]"
+
+#: ../src/gui/editors/matrix/MatrixEraser.cpp:58
+#: ../src/gui/editors/matrix/MatrixMover.cpp:71
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:67
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:77
+msgid "Switch to Draw Tool"
+msgstr "Vaihda Piirrä-työkaluun"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:75
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:69
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:71
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:81
+#: ../src/gui/editors/notation/ClefInserter.cpp:57
+#: ../src/gui/editors/notation/GuitarChordInserter.cpp:63
+#: ../src/gui/editors/notation/NotationSelector.cpp:87
+#: ../src/gui/editors/notation/NoteInserter.cpp:113
+#: ../src/gui/editors/notation/RestInserter.cpp:72
+#: ../src/gui/editors/notation/TextInserter.cpp:61
+msgid "Switch to Erase Tool"
+msgstr "Vaihda Poista-työkaluun"
+
+#: ../src/gui/editors/matrix/MatrixEraser.cpp:62
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:73
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:75
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:85
+msgid "Switch to Move Tool"
+msgstr "Vaihda Siirrä-työkaluun"
+
+#: ../src/gui/editors/matrix/MatrixEraser.cpp:68
+#: ../src/gui/editors/matrix/MatrixMover.cpp:81
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:79
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:93
+msgid "Switch to Resize Tool"
+msgstr "Vaihda Muuta kokoa -työkaluun"
+
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:446
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:579
+msgid "Click and drag to select; middle-click and drag to draw new note"
+msgstr ""
+"Klikkaa ja vedä valitaksesi; klikkaa keskimmäisellä näppäimellä piirtääksesi "
+"uuden nuotin"
+
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:324
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:597
+msgid "Click and drag to resize selected notes"
+msgstr "Klikkaa ja vedä mitoittaaksesi valitut nuotit uudelleen"
+
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:599
+msgid "Click and drag to resize note"
+msgstr "Klikkaa ja vedä mitoittaaksesi nuotin uudelleen"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:471
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:604
+msgid "Click and drag to move selected notes; hold Ctrl as well to copy"
+msgstr ""
+"Klikkaa ja vedä siirtääksesi valitut nuotit; pidä myös Ctrl pohjassa "
+"kopioidaksesi ne"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:473
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:606
+msgid "Click and drag to copy selected notes"
+msgstr "Klikkaa ja vedä kopioidaksesi valitut nuotit"
+
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:610
+msgid "Click and drag to move note; hold Ctrl as well to copy"
+msgstr ""
+"Klikkaa ja vedä siirtääksesi nuotin; pidä myös Ctrl pohjassa kopioidaksesi "
+"sen"
+
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:612
+msgid "Click and drag to copy note"
+msgstr "Klikkaa ja vedä kopioidaksesi nuotion"
+
+#: ../src/gui/editors/matrix/MatrixEraser.cpp:54
+#: ../src/gui/editors/matrix/MatrixMover.cpp:67
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:65
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:63
+#: ../src/gui/editors/notation/ClefInserter.cpp:53
+#: ../src/gui/editors/notation/GuitarChordInserter.cpp:59
+#: ../src/gui/editors/notation/NotationEraser.cpp:67
+#: ../src/gui/editors/notation/NoteInserter.cpp:109
+#: ../src/gui/editors/notation/RestInserter.cpp:68
+#: ../src/gui/editors/notation/TextInserter.cpp:57
+msgid "Switch to Select Tool"
+msgstr "Vaihda Valitse-työkaluun"
+
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:218
+msgid "Resize Event"
+msgstr "Muuta tapahtuman kokoa"
+
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:221
+msgid "Resize Events"
+msgstr "Muuta tapahtumien kokoa"
+
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:326
+msgid "Click and drag to resize a note"
+msgstr "Klikkaa ja vedä mitoittaaksesi nuotin uudelleen"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:328
+msgid "Copy and Move Event"
+msgstr "Kopioi ja siirrä tapahtuma"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:330
+msgid "Copy and Move Events"
+msgstr "Kopioi ja siirrä tapahtumia"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:334
+msgid "Move Event"
+msgstr "Siirrä tapahtuma"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:336
+msgid "Move Events"
+msgstr "Siirrä tapahtumia"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:465
+msgid "Click and drag to move a note; hold Ctrl as well to copy it"
+msgstr ""
+"Klikkaa ja vedä siirtääksesi nuotin, pidä myös Ctrl pohjassa kopioidaksesi "
+"sen"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:467
+msgid "Click and drag to copy a note"
+msgstr "Klikkaa ja vedä kopioidaksesi nuotin"
+
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:361
+msgid "Click and drag to draw a note; Shift to avoid snapping to grid"
+msgstr ""
+"Klikkaa ja vedä piirtääksesi nuotin; käytä Shift:iä välttääksesi "
+"iskuruudukkoon lukkiutumisen"
+
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:363
+msgid "Click and drag to draw a note"
+msgstr "Klikkaa ja vedä piirtääksesi nuotin"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:437
+#: ../src/gui/editors/matrix/MatrixView.cpp:3053
+msgid "Couldn't apply piano roll layout"
+msgstr "Ei voitu soveltaa pianorulla-taittoa"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:663
+msgid "Resi&ze"
+msgstr "Määritä &koko uudelleen"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:669
+#: ../src/gui/editors/notation/NotationView.cpp:1919
+msgid "C&hord Insert Mode"
+msgstr "&Sointujen syöttötila"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:676
+#: ../src/gui/editors/notation/NotationView.cpp:1778
+msgid "Ste&p Recording"
+msgstr "&Askelnauhoitus"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:694
+msgid "&Legato"
+msgstr "&Sitoen"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:708
+msgid "Set to Current Velocity"
+msgstr "Aseta nykyiseksi nopeudeksi"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:712
+msgid "Set Event &Velocities..."
+msgstr "Aseta tapahtuman &nopeudet..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:716
+msgid "Trigger Se&gment..."
+msgstr "Sysäävä &osa..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:720
+msgid "Remove Triggers..."
+msgstr "Poista liipasimet..."
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1153
+#: ../src/gui/editors/matrix/MatrixView.cpp:724
+#: ../src/gui/editors/tempo/TempoView.cpp:606
+msgid "Select &All"
+msgstr "Valitse &kaikki"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:732
+#: ../src/gui/editors/notation/NotationView.cpp:2325
+msgid "Cursor &Back"
+msgstr "Kursori &taaksepäin"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:736
+#: ../src/gui/editors/notation/NotationView.cpp:2329
+msgid "Cursor &Forward"
+msgstr "Kursori &eteenpäin"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:740
+#: ../src/gui/editors/notation/NotationView.cpp:2333
+msgid "Cursor Ba&ck Bar"
+msgstr "Kursori e&delliselle tahdille"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:744
+#: ../src/gui/editors/notation/NotationView.cpp:2337
+msgid "Cursor For&ward Bar"
+msgstr "Kursori s&euraavalle tahdille"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:748
+#: ../src/gui/editors/notation/NotationView.cpp:2341
+msgid "Cursor Back and Se&lect"
+msgstr "Kursori taaksepäin ja va&litse"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:752
+#: ../src/gui/editors/notation/NotationView.cpp:2345
+msgid "Cursor Forward and &Select"
+msgstr "Kursori eteenpäin ja &valitse"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:756
+#: ../src/gui/editors/notation/NotationView.cpp:2349
+msgid "Cursor Back Bar and Select"
+msgstr "Kursori edelliselle tahdille ja valitse"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:760
+#: ../src/gui/editors/notation/NotationView.cpp:2353
+msgid "Cursor Forward Bar and Select"
+msgstr "Kursori seuraavalle tahdille ja valitse"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:764
+#: ../src/gui/editors/notation/NotationView.cpp:2363
+msgid "Cursor to St&art"
+msgstr "Kursori &alkuun"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:770
+#: ../src/gui/editors/notation/NotationView.cpp:2369
+msgid "Cursor to &End"
+msgstr "Kursori loppuu&n"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:776
+#: ../src/gui/editors/notation/NotationView.cpp:2391
+msgid "Cursor to &Playback Pointer"
+msgstr "Kursori &toisto-osoittimen kohdalle"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:820
+#: ../src/gui/editors/notation/NotationView.cpp:2435
+msgid "Playback Pointer to &Cursor"
+msgstr "Toisto-osoitin &kursorin kohdalle"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:826
+#: ../src/gui/editors/notation/NotationView.cpp:2441
+msgid "&Solo"
+msgstr "&Soolo"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:841
+#: ../src/gui/editors/notation/NotationView.cpp:2456
+msgid "Set Loop to Selection"
+msgstr "Aseta valinta silmukaksi"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:845
+#: ../src/gui/editors/notation/NotationView.cpp:2460
+msgid "Clear L&oop"
+msgstr "Tyhjää s&ilmukka"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1157
+#: ../src/gui/editors/matrix/MatrixView.cpp:849
+#: ../src/gui/editors/notation/NotationView.cpp:2464
+#: ../src/gui/editors/tempo/TempoView.cpp:610
+msgid "Clear Selection"
+msgstr "Tyhjää valinta"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1149
+#: ../src/gui/editors/matrix/MatrixView.cpp:854
+#: ../src/gui/editors/notation/NotationView.cpp:2471
+msgid "&Filter Selection"
+msgstr "S&uodata valinta"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:879
+msgid "&No Snap"
+msgstr "&Ei lukkiutumista"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:884
+msgid "Snap to Bea&t"
+msgstr "Lukkiudu &iskuun"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:888
+msgid "Snap to &Bar"
+msgstr "Lukkiudu &tahtiin"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:908
+#, c-format
+msgid "Snap to %1"
+msgstr "Lukkiudu yksikköön %1"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:917
+msgid "Show Instrument Parameters"
+msgstr "Näytä instrumentin ominaisuudet"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:922
+#: ../src/gui/editors/notation/NotationView.cpp:1850
+msgid "Show Ch&ord Name Ruler"
+msgstr "Näytä S&ointunimi-viivain"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:926
+#: ../src/gui/editors/notation/NotationView.cpp:1858
+msgid "Show &Tempo Ruler"
+msgstr "Näytä &Tempo-viivain"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1238
+#: ../src/gui/editors/notation/NotationView.cpp:3245
+#, c-format
+msgid ""
+"_n: 1 event selected \n"
+" %n events selected "
+msgstr ""
+"1 tapahtuma valittu \n"
+" %n tapahtumaa valittu "
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1241
+#: ../src/gui/editors/notation/NotationView.cpp:3247
+msgid " No selection "
+msgstr " Ei valintaa "
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1348
+#: ../src/gui/editors/matrix/MatrixView.cpp:1360
+#: ../src/gui/editors/matrix/MatrixView.cpp:2079
+#: ../src/gui/editors/notation/NotationView.cpp:5869
+msgid "Quantizing..."
+msgstr "Yksiköidään..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1370
+#: ../src/gui/editors/notation/NotationView.cpp:5407
+msgid "Collapsing notes..."
+msgstr "Luhista kasaan nuotit..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1381
+msgid "Making legato..."
+msgstr "Tehdään Sitoen..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1476
+msgid "Note: %1 (%2.%3s)"
+msgstr "Nuotti: %1 (%2.%3s)"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1531
+#: ../src/gui/editors/notation/NotationView.cpp:7206
+msgid "Time: %1 (%2.%3s)"
+msgstr "Aika: %1 (%2.%3s)"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1604
+#: ../src/gui/editors/notation/NotationView.cpp:4744
+#: ../src/gui/editors/notation/NotationView.cpp:4773
+msgid "Cutting selection to clipboard..."
+msgstr "Leikataan valinta leikepöydälle..."
+
+#: ../src/gui/editors/eventlist/EventView.cpp:912
+#: ../src/gui/editors/matrix/MatrixView.cpp:1636
+#: ../src/gui/editors/notation/NotationSelectionPaster.cpp:82
+msgid "Couldn't paste at this point"
+msgstr "Ei voitu liittää tähän kohtaan"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1647
+#: ../src/gui/editors/notation/NotationView.cpp:4754
+msgid "Deleting selection..."
+msgstr "Poistetaan valinta..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1833
+#: ../src/gui/editors/notation/NotationView.cpp:5617
+#, c-format
+msgid "Unknown note insert action %1"
+msgstr "Tuntematon nuotinsyöttötoiminto %1"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1837
+#: ../src/gui/editors/matrix/MatrixView.cpp:2857
+#: ../src/gui/editors/notation/NotationView.cpp:5621
+msgid "Inserting note"
+msgstr "Nuotin syöttö"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2091
+msgid "Unquantizing..."
+msgstr "Poistetaan yksiköinti..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2120
+msgid " Grid: "
+msgstr " Ruudukko: "
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2134
+msgid "Unit"
+msgstr "Yksikkö"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2136
+msgid "Beat"
+msgstr "Isku"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2138
+msgid "Bar"
+msgstr "Tahti"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2159
+msgid " Velocity: "
+msgstr " Nopeus: "
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2170
+msgid " Quantize: "
+msgstr " Yksiköi: "
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2584
+msgid "Raising velocities..."
+msgstr "Nopeuksien nosto..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2596
+msgid "Lowering velocities..."
+msgstr "Nopeuksien lasku..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2611
+msgid "Set Event Velocities"
+msgstr "Aseta tapahtuman nopeudet"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2616
+msgid "Setting Velocities..."
+msgstr "Aseta nopeudet..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2665
+msgid "Remove Triggers"
+msgstr "Poista sysääjät"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2723
+msgid "%1 - Segment Track #%2 - %3"
+msgstr "%1 - osan raita #%2 - %3"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2730
+msgid "%1 - All Segments - %2"
+msgstr "%1 - kaikki osat - %2"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2737
+msgid ""
+"_n: %1 - 1 Segment - %2\n"
+"%1 - %n Segments - %2"
+msgstr ""
+"%1 - 1 osa - %2\n"
+"%1 - %2 osaa - %2"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2885
+msgid "Can't insert note: No grid duration selected"
+msgstr "Ei voitu syöttää nuotti: Ruudukon kestoa ei oltu valittu"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2935
+msgid " Chord "
+msgstr " Sointu "
+
+#: ../src/gui/editors/matrix/MatrixEraser.cpp:105
+msgid "Click on a note to delete it"
+msgstr "Klikkaa nuotin päällä poistaaksesi sen"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:89
+msgid "Filter"
+msgstr "Suodatin"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:245
+#: ../src/gui/editors/tempo/TempoView.cpp:117
+msgid "Time "
+msgstr "Aika "
+
+#: ../src/gui/editors/tempo/TempoView.cpp:118
+msgid "Type "
+msgstr "Tyyppi "
+
+#: ../src/gui/editors/tempo/TempoView.cpp:119
+msgid "Value "
+msgstr "Arvo "
+
+#: ../src/gui/editors/tempo/TempoView.cpp:120
+msgid "Properties "
+msgstr "Ominaisuudet "
+
+#: ../src/gui/editors/tempo/TempoView.cpp:208
+msgid "Common, hidden"
+msgstr "Yhteinen, piilotettu"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:210
+msgid "Hidden"
+msgstr "Piilotettu"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:213
+msgid "Common"
+msgstr "Yhteinen"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:220
+msgid "Time Signature "
+msgstr "Tahtilajimerkintä "
+
+#: ../src/gui/editors/tempo/TempoView.cpp:245
+msgid "%1.%2%3"
+msgstr "%1.%2%3"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:255
+msgid "%1.%2%3 qpm (%4.%5%6 bpm) "
+msgstr "%1.%2%3 qpm (%4.%5%6 bpm) "
+
+#: ../src/gui/editors/tempo/TempoView.cpp:264
+msgid "Tempo "
+msgstr "Tempo "
+
+#: ../src/gui/editors/tempo/TempoView.cpp:271
+msgid "<nothing at this filter level>"
+msgstr "<ei mitään tällä suodatintasolla>"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:463
+msgid "Delete Tempo or Time Signature"
+msgstr "Poista tempo- tai tahtilajimerkintä"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:602
+msgid "&Edit Item"
+msgstr "&Muokkaa nimikettä"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:834
+msgid "%1 - Tempo and Time Signature Editor"
+msgstr "%1 - tempo- tahtilajimerkinnän muokkain"
+
+#: ../src/gui/editors/guitar/GuitarChordEditorDialog.cpp:43
+msgid "Guitar Chord Editor"
+msgstr "Kitarasointueditori"
+
+#: ../src/gui/editors/guitar/GuitarChordEditorDialog.cpp:51
+msgid "Start fret"
+msgstr "Alkunauha"
+
+#: ../src/gui/editors/guitar/GuitarChordEditorDialog.cpp:58
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:51
+msgid "Root"
+msgstr "Juuri"
+
+#: ../src/gui/editors/guitar/GuitarChordEditorDialog.cpp:62
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:55
+msgid "Extension"
+msgstr "Laajennos"
+
+#: ../src/gui/editors/guitar/Fingering.cpp:118
+msgid "couldn't parse fingering '%1' in '%2'"
+msgstr "Ei voitu selvittää sormitusta '%1' paikassa '%2'"
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:45
+msgid "Guitar Chord Selector"
+msgstr "Kitarasoinnun valitsin"
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:64
+msgid "beginner"
+msgstr "aloittelija"
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:65
+msgid "common"
+msgstr "yleinen"
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:66
+msgid "all"
+msgstr "kaikki"
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:86
+msgid "Fingerings"
+msgstr "Sormitukset"
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:419
+msgid "couldn't open file '%1'"
+msgstr "tiedostoa '%1' ei voitu avata"
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:428
+#, c-format
+msgid "couldn't parse chord dictionnary : %1"
+msgstr "ei voitu jäsentää sointukirjastoa : %1"
+
+#: ../src/gui/editors/notation/NoteFontViewer.cpp:87
+#, c-format
+msgid "Note Font Viewer: %1"
+msgstr "Nuottikirjasimen katselin: %1"
+
+#: ../src/gui/editors/notation/NoteFontViewer.cpp:93
+msgid " Component: "
+msgstr " Ainesosa: "
+
+#: ../src/gui/editors/notation/NoteFontViewer.cpp:101
+msgid " View: "
+msgstr " Näkymä: "
+
+#: ../src/gui/editors/notation/NoteFontViewer.cpp:104
+msgid "Glyphs"
+msgstr "Kuviot"
+
+#: ../src/gui/editors/notation/NoteFontViewer.cpp:105
+msgid "Codes"
+msgstr "Koodit"
+
+#: ../src/gui/editors/notation/NoteFontViewer.cpp:107
+msgid " Page: "
+msgstr " Sivu: "
+
+#: ../src/gui/editors/notation/ClefInserter.cpp:64
+#: ../src/gui/editors/notation/GuitarChordInserter.cpp:71
+#: ../src/gui/editors/notation/RestInserter.cpp:79
+#: ../src/gui/editors/notation/TextInserter.cpp:68
+msgid "Switch to Inserting Notes"
+msgstr "Vaihda nuottien lisäämiseen"
+
+#: ../src/gui/editors/notation/NotationView.cpp:522
+msgid "Close track headers"
+msgstr "Sulje raidan otsikot"
+
+#: ../src/gui/editors/notation/NotationView.cpp:917
+msgid "Preparing to print..."
+msgstr "Valmistetaan tulostusta..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:1516
+msgid "Note &Font"
+msgstr "Nuotin &kirjasin"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1539
+msgid "Si&ze"
+msgstr "Ko&ko"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1545
+msgid "Show Track Headers"
+msgstr "Näytä raitojen otsikot"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1550
+msgid "S&pacing"
+msgstr "Vä&lit"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1572
+msgid "Du&ration Factor"
+msgstr "Kes&tokerroin"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1598
+msgid "Note &Style"
+msgstr "Nuotin t&yyli"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1624
+msgid "Insert Rest"
+msgstr "Syötä tauko"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1628
+msgid "Switch from Note to Rest"
+msgstr "Vaihda nuotista tauoksi"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1633
+msgid "Switch from Rest to Note"
+msgstr "Vaihda tauosta nuotiksi"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1690
+msgid "No accidental"
+msgstr "Ei etumerkkiä"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1691
+msgid "Follow previous accidental"
+msgstr "Seuraa edellistä etumerkkiä"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1692
+msgid "Sharp"
+msgstr "Ylennys"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1693
+msgid "Flat"
+msgstr "Alennus"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1694
+msgid "Natural"
+msgstr "Palautus"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1695
+msgid "Double sharp"
+msgstr "Kaksoisylennys"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1696
+msgid "Double flat"
+msgstr "Kaksoisalennus"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1717
+msgid "&Treble Clef"
+msgstr "&Diskanttiavain"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1724
+msgid "&Alto Clef"
+msgstr "&Alttoavain"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1731
+msgid "Te&nor Clef"
+msgstr "&Tenoriavain"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1738
+msgid "&Bass Clef"
+msgstr "&Bassoavain"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1745
+msgid "&Text"
+msgstr "&Teksti"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1751
+msgid "&Guitar Chord"
+msgstr "&Kitarasointu"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1784
+msgid "Select from Sta&rt"
+msgstr "Valitse &alusta"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1788
+msgid "Select to &End"
+msgstr "Valitse &loppuun"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1792
+msgid "Select Whole St&aff"
+msgstr "Valitse koko n&uottiviivasto"
+
+#: ../src/commands/edit/CutAndCloseCommand.h:53
+#: ../src/gui/editors/notation/NotationView.cpp:1796
+msgid "C&ut and Close"
+msgstr "&Leikkaa ja sulje"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1800
+msgid "Pa&ste..."
+msgstr "L&iitä..."
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:122
+#: ../src/gui/editors/notation/NotationView.cpp:1808
+msgid "Move to Staff Above"
+msgstr "Siirrä ylläolevaan viivastoon"
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:126
+#: ../src/gui/editors/notation/NotationView.cpp:1812
+msgid "Move to Staff Below"
+msgstr "Siirrä allaolevaan viivastoon"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1826
+msgid "&Linear Layout"
+msgstr "&Lineaarinen taitto"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1835
+msgid "&Continuous Page Layout"
+msgstr "&Jatkuva sivutaitto"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1844
+msgid "&Multiple Page Layout"
+msgstr "&Usean sivun taitto"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1854
+msgid "Show Ra&w Note Ruler"
+msgstr "Näytä Käsittele&mättömät nuotit -viivain"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1862
+msgid "Show &Annotations"
+msgstr "Näytä &huomatukset"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1866
+msgid "Show Lily&Pond Directives"
+msgstr "Näytä Lily&Pond-käskyt"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1870
+msgid "Open L&yric Editor"
+msgstr "Avaa &Sanoittaja"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1912
+msgid "Trip&let Insert Mode"
+msgstr "Trip&lettien syöttötila"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1926
+msgid "Grace Insert Mode"
+msgstr "Korujen syöttötila"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2180
+msgid "&Dump selected events to stderr"
+msgstr "&Kippaa valitut nuottitapahtumat paikkaan stderr"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2248
+msgid "Ma&ke Ornament..."
+msgstr "T&ee koru..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:2252
+msgid "Trigger &Ornament..."
+msgstr "Synnytä &koru..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:2256
+msgid "Remove Ornament..."
+msgstr "Poista koru..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:2261
+msgid "&None"
+msgstr "&Ei mikään"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2289
+msgid "Convert Notation For..."
+msgstr "Muunna nuotinnus ..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:2298
+msgid "Show &Notes Toolbar"
+msgstr "Näytä &Nuotit -työkalupalkki"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2299
+msgid "Show &Rests Toolbar"
+msgstr "Näytä &Tauot -työkalupalkki"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2300
+msgid "Show &Accidentals Toolbar"
+msgstr "Näytä &Etumerkit -työkalupalkki"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2301
+msgid "Show Cle&fs Toolbar"
+msgstr "Näytä A&vaimet -työkalupalkki"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2303
+msgid "Show &Marks Toolbar"
+msgstr "Näytä &Merkit -työkalupalkki"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2305
+msgid "Show &Group Toolbar"
+msgstr "Näytä &Ryhmät -työkalupalkki"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2307
+msgid "Show &Layout Toolbar"
+msgstr "Näytä &Asettelu -työkalupalkki"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2311
+msgid "Show M&eta Toolbar"
+msgstr "Näytä &Muutos -työkalut"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2373
+msgid "Cursor &Up Staff"
+msgstr "Kursori viivaston verran &ylös"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2377
+msgid "Cursor &Down Staff"
+msgstr "Kursori viivaston verran a&las"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2381
+msgid "Cursor Pre&vious Segment"
+msgstr "Kursori edelliseen osaan"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2385
+msgid "Cursor Ne&xt Segment"
+msgstr "Kursori seuraavaan osaan"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2475
+msgid "Push &Left"
+msgstr "Työnnä &vasemmalle"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2479
+msgid "Push &Right"
+msgstr "Työnnä &oikealle"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2483
+msgid "Push &Up"
+msgstr "Työnnä &ylös"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2487
+msgid "Push &Down"
+msgstr "Työnnä &alas"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2491
+msgid "&Restore Positions"
+msgstr "Palauta sijainnit"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2495
+msgid "Make &Invisible"
+msgstr "Tee &näkymättömäksi"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2499
+msgid "Make &Visible"
+msgstr "Tee nä&kyväksi"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2503
+msgid "Toggle Dot"
+msgstr "Kytke piste"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2507
+#: ../src/gui/editors/notation/NotationView.cpp:2511
+msgid "Add Dot"
+msgstr "Lisää piste"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2570
+#, c-format
+msgid ""
+"_n: 1 pixel\n"
+"%n pixels"
+msgstr ""
+"1 kuvapiste\n"
+"%n kuvapistettä"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2619
+msgid " Font: "
+msgstr " Kirjasin: "
+
+#: ../src/gui/editors/notation/NotationView.cpp:2647
+msgid "Unknown font \"%1\", using default"
+msgstr "Tuntematon kirjasin \"%1\", käytetään oletusta"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2655
+msgid " Size: "
+msgstr " Koko: "
+
+#: ../src/gui/editors/notation/NotationView.cpp:2677
+msgid " Spacing: "
+msgstr " Väli(stys): "
+
+#: ../src/gui/editors/notation/NotationView.cpp:2993
+#: ../src/gui/editors/notation/NotationView.cpp:3818
+msgid " Ready."
+msgstr " Valmis."
+
+#: ../src/gui/editors/notation/NotationView.cpp:2998
+msgid "Laying out score..."
+msgstr "Taitetaan nuottia..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:3011
+msgid "Laying out staff %1..."
+msgstr "Taitetaan viviastoa %1..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:3020
+msgid "Reconciling staffs..."
+msgstr "Sovitellaan viivastoja..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:3885
+msgid "Sizing and allocating canvas..."
+msgstr "Mitoitetaan ja jaksotetaan kangasta..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:4050
+msgid "note"
+msgstr "nuotti"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4050
+msgid "rest"
+msgstr "tauko"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4211
+msgid "%1 - Segment Track #%2 - Notation"
+msgstr "%1 - Osan raita #%2 - Nuotinnus"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4217
+msgid "%1 - All Segments - Notation"
+msgstr "%1 - Kaikki osat - Nuotinnus"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4222
+msgid ""
+"_n: %1 - Segment - Notation\n"
+"%1 - %n Segments - Notation"
+msgstr ""
+"%1 - osa - nuotinnus\n"
+"%1 - %2 osaa - nuotinnus"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4243
+msgid "Grace"
+msgstr "Grave"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4247
+#: ../src/gui/editors/notation/NotationView.cpp:4251
+#: ../src/gui/editors/notation/NotationView.cpp:4255
+msgid "%1 %2"
+msgstr "%1 %2"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4271
+msgid "Hidden annotations"
+msgstr "Piiloitetut huomautukset"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4293
+msgid "Hidden LilyPond directives"
+msgstr "Piilota LilyPond-käskyt"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4326
+#, c-format
+msgid "Unknown spacing action %1"
+msgstr "Tuntematon välistystoiminto %1"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4384
+#, c-format
+msgid "Unknown proportion action %1"
+msgstr "Tuntematon mittasuhdetoiminto %1"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4431
+#, c-format
+msgid "Unknown font action %1"
+msgstr "Tuntematon kirjasintoiminto %1"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4449
+#, c-format
+msgid "Unknown font size %1"
+msgstr "Tuntomaton kirjasinkoko %1"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4453
+#, c-format
+msgid "Unknown font size action %1"
+msgstr "Tuntematon kirjasinkokotoiminto %1"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4780
+msgid ""
+"The Restricted paste type requires enough empty space (containing only "
+"rests) at the paste position to hold all of the events to be pasted.\n"
+"Not enough space was found.\n"
+"If you want to paste anyway, consider using one of the other paste types "
+"from the \"Paste...\" option on the Edit menu. You can also change the "
+"default paste type to something other than Restricted if you wish."
+msgstr ""
+"Rajoitettu liittämistyyppi vaatii riittävästi tyhjää tilaa (jossa on vain "
+"taukoja) liitäntäpaikassa, jotta kaikki tapahtumat voitaisiin liittää.\n"
+"Tyhjää tilaa ei löytynyt riittävästi.\n"
+" Jos haluat littää tästä huolimatta, harkitse toisen liitäntätyypin käyttöä "
+"\"Muokkaa\"-valikon \"Liitä...\"-valinnasta. Voit myös vaihtaa "
+"oletusliitäntätyypin joksikin muuksi kuin Rajoitettu, jos haluat."
+
+#: ../src/gui/editors/notation/NotationView.cpp:4800
+msgid "Can't paste multiple Segments into one"
+msgstr "Ei voitu liittää useita osia yhteen"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4828
+#: ../src/gui/editors/notation/NotationView.cpp:4877
+msgid "Couldn't paste at this point."
+msgstr "Ei voitu liittää tähän paikkaan."
+
+#: ../src/gui/editors/notation/NotationView.cpp:4896
+msgid "Move Events to Staff Above"
+msgstr "Siirrä tapahtumat ylläolevaan viivastoon"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4924
+msgid "Move Events to Staff Below"
+msgstr "Siirrä tapahtumat allaolevaan viivastoon"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5036
+msgid "Pushing selection left..."
+msgstr "Työnnetään valintaa vasemmalle..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5047
+msgid "Pushing selection right..."
+msgstr "Työnnetään valintaa oikealle..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5058
+msgid "Pushing selection up..."
+msgstr "Työnnetään valintaa ylös..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5069
+msgid "Pushing selection down..."
+msgstr "Työnnetään valintaa alas..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5080
+msgid "Restoring computed positions..."
+msgstr "Palautetaan lasketut sijainnit..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5089
+msgid "Making visible..."
+msgstr "Tehdään näkyväksi..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5098
+msgid "Making invisible..."
+msgstr "Tehdään näkymättömäksi..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5185
+msgid "Beaming group..."
+msgstr "Palkkiryhmä..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5195
+msgid "Auto-beaming selection..."
+msgstr "Valinnan automaattinen palkitus..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5205
+msgid "Breaking groups..."
+msgstr "Murretaan ryhmät..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5293
+msgid "Untupleting..."
+msgstr "Irroitetaan tupletti..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5301
+msgid "Adding slur..."
+msgstr "Lisätään kaari..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5302
+msgid "slur"
+msgstr "kaari"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5307
+msgid "Adding phrasing slur..."
+msgstr "Lisätään muotoilukaari..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5308
+msgid "phrasing slur"
+msgstr "muotoilukaari"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5313
+msgid "Adding glissando..."
+msgstr "Lisää liukuen..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5314
+msgid "glissando"
+msgstr "liukuen"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5319
+msgid "Adding crescendo..."
+msgstr "Lisää kasvaen..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5320
+#: ../src/gui/editors/notation/NotationView.cpp:5326
+msgid "dynamic"
+msgstr "voimakkuusmerkintä"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5325
+msgid "Adding decrescendo..."
+msgstr "Lisää heikentyen..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5331
+#: ../src/gui/editors/notation/NotationView.cpp:5337
+#: ../src/gui/editors/notation/NotationView.cpp:5343
+#: ../src/gui/editors/notation/NotationView.cpp:5349
+msgid "Adding octave..."
+msgstr "Lisätään oktaavimerkintä..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5332
+#: ../src/gui/editors/notation/NotationView.cpp:5338
+#: ../src/gui/editors/notation/NotationView.cpp:5344
+#: ../src/gui/editors/notation/NotationView.cpp:5350
+msgid "ottava"
+msgstr "ottava"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5366
+msgid "Can't add overlapping %1 indications"
+msgstr "Ei voitu lisätä limittyviä %1 merkintöjä"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5375
+msgid "Making chord..."
+msgstr "Tehdään sointu..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5387
+msgid "Normalizing rests..."
+msgstr "Normalisoidaan tauot..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5397
+msgid "Collapsing rests..."
+msgstr "Luhistetaan yhteen tauot..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5417
+msgid "Tying notes..."
+msgstr "Sidotaan nuotit..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5427
+msgid "Untying notes..."
+msgstr "Puretaan nuottien siteet..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5437
+msgid "Making notes viable..."
+msgstr "Tehdään nuotit toimiviksi..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5447
+msgid "Removing counterpoint..."
+msgstr "Poistetaan vastaääni..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5457
+msgid "Pointing stems up..."
+msgstr "Käännetään varret ylös..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5467
+msgid "Pointing stems down..."
+msgstr "Käännetään varret alas..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5478
+msgid "Restoring computed stem directions..."
+msgstr "Palautetaan lasketut varsisuunnat..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5488
+#: ../src/gui/editors/notation/NotationView.cpp:5498
+msgid "Positioning slurs..."
+msgstr "Sijoitetaan kaaret..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5509
+msgid "Restoring slur positions..."
+msgstr "Palautetaan kaarten sijainnit..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5519
+#: ../src/gui/editors/notation/NotationView.cpp:5529
+msgid "Positioning ties..."
+msgstr "Sijoitetaan sidontoja..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5540
+msgid "Restoring tie positions..."
+msgstr "Palautetaan sidontoja sijainnit..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5550
+msgid "Fixing notation quantization..."
+msgstr "Korjataan nuottien yksiköintiä..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5560
+msgid "Removing notation quantization..."
+msgstr "Poistetaan nuottien yksiköinti..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5577
+msgid "Changing to %1 style..."
+msgstr "Vaihdetaan %1-tyyliin..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5585
+#, c-format
+msgid "Unknown style action %1"
+msgstr "Tuntematon tyylitoiminto %1"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5598
+#: ../src/gui/editors/notation/NotationView.cpp:5639
+#: ../src/gui/editors/notation/NotationView.cpp:5695
+msgid "No note duration selected"
+msgstr "Nuotin kestoa ei oltu valittu"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5660
+msgid "No rest duration selected"
+msgstr "Tauon kestoa ei oltu valittu"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5746
+msgid "No note or rest duration selected"
+msgstr "Nuotin tai tauon kestoa ei oltu valittu"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5757
+#: ../src/gui/editors/notation/NotationView.cpp:5768
+#: ../src/gui/editors/notation/NotationView.cpp:5779
+#: ../src/gui/editors/notation/NotationView.cpp:5790
+#: ../src/gui/editors/notation/NotationView.cpp:5801
+#: ../src/gui/editors/notation/NotationView.cpp:5812
+#: ../src/gui/editors/notation/NotationView.cpp:5823
+msgid "Forcing accidentals..."
+msgstr "Pakotetaan etumerkit..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5834
+msgid "Restoring accidentals..."
+msgstr "Palautetaan etumerkit..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5845
+msgid "Showing cautionary accidentals..."
+msgstr "Näytetään varoitusetumerkit..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5855
+msgid "Cancelling cautionary accidentals..."
+msgstr "Peruutetaan varoitusetumerkit..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5884
+msgid "Interpreting selection..."
+msgstr "Tulkitaan valintaa..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5896
+msgid "Setting note durations..."
+msgstr "Asetaan nuottien kestot..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5904
+#: ../src/gui/editors/notation/NotationView.cpp:5912
+msgid "Adding dot..."
+msgstr "Lisätään piste..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5934
+msgid "Text: "
+msgstr "Teksti: "
+
+#: ../src/gui/editors/notation/NotationView.cpp:5948
+msgid "Fingering: "
+msgstr "Sormitus: "
+
+#: ../src/gui/editors/notation/NotationView.cpp:6036
+msgid "Ornament track %1 bar %2"
+msgstr "Koru raidalla %1 tahdissa %2"
+
+#: ../src/gui/editors/notation/NotationView.cpp:6038
+#, c-format
+msgid "Ornament bar %1"
+msgstr "Koru tahdissa %1"
+
+#: ../src/gui/editors/notation/NotationView.cpp:6098
+msgid "Remove Ornaments"
+msgstr "Poista korukuviot"
+
+#: ../src/gui/editors/notation/NotationView.cpp:6145
+msgid "Estimated key signature shown"
+msgstr "Näytetty arvioitu sävellajimerkintä"
+
+#: ../src/gui/editors/notation/NotationStaff.cpp:1249
+#: ../src/gui/editors/notation/NotationView.cpp:6202
+msgid "Sustain"
+msgstr "Pedaali"
+
+#: ../src/gui/editors/notation/NotationView.cpp:6218
+msgid ""
+"There is no sustain controller defined for this device.\n"
+"Please ensure the device is configured correctly in the Manage MIDI Devices "
+"dialog in the main window."
+msgstr ""
+"Tälle laitteelle ei oltu määritelty pedaalin ohjainta.\n"
+"Ole hyvä, ja varmista että laite on määritetty oikein pääikkunan Hallitse "
+"MIDI-laitteita -valikossa."
+
+#: ../src/gui/editors/notation/NotationView.cpp:7250
+msgid "Can't insert note: No note duration selected"
+msgstr "Ei voitu lisätä nuottia: Kestoa ei oltu valittu"
+
+#: ../src/gui/editors/notation/NotationEraser.cpp:61
+#: ../src/gui/editors/notation/NotationSelector.cpp:83
+msgid "Switch to Insert Tool"
+msgstr "Vaihda Syötä-työkaluun"
+
+#: ../src/gui/editors/notation/NotePixmapFactory.cpp:2303
+#: ../src/gui/editors/notation/NotePixmapFactory.cpp:2347
+msgid "..."
+msgstr "..."
+
+#: ../src/gui/editors/notation/NoteFontFactory.cpp:200
+msgid "Can't obtain a default font -- no fonts found"
+msgstr "Ei voitu saada oletuskirjasinta -- ei löydetty kirjasimia"
+
+#: ../src/gui/editors/notation/NoteFontMap.cpp:52
+#: ../src/gui/general/PresetGroup.cpp:49
+msgid "unknown error"
+msgstr "tuntematon virhe"
+
+#: ../src/gui/editors/notation/NoteFontMap.cpp:78
+msgid "Can't open font mapping file %1 or %2"
+msgstr "Ei voitu avata kirjasinkarttatiedostoa %1 tai %2"
+
+#: ../src/gui/editors/notation/NoteFontMap.cpp:82
+#, c-format
+msgid "Can't open font mapping file %1"
+msgstr "Ei voitu avata kirjasinkarttatiedostoa %1"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:52
+msgid "%1-dotted-%2"
+msgstr "%1 -pisteellinen-%2"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:54
+msgid "%1-dotted %2"
+msgstr "%1 -pisteellinen %2"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:57
+#, c-format
+msgid "dotted-%1"
+msgstr "pisteellinen-%1"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:59
+#, c-format
+msgid "dotted %1"
+msgstr "pisteellinen %1"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:83
+msgid "sixty-fourth note"
+msgstr "64.-osanuotti"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:83
+msgid "thirty-second note"
+msgstr "32.-osanuotti"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:84
+msgid "sixteenth note"
+msgstr "16.-osanuotti"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:84
+msgid "eighth note"
+msgstr "kahdeksasosanuotti"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:85
+msgid "quarter note"
+msgstr "neljäsosanuotti"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:85
+msgid "half note"
+msgstr "puolinuotti"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:86
+msgid "whole note"
+msgstr "kokonuotti"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:86
+msgid "double whole note"
+msgstr "kaksoiskokonuotti"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:89
+msgid "sixty-fourth notes"
+msgstr "kuudeskymmenesneljäsosanuotit"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:89
+msgid "thirty-second notes"
+msgstr "kolmaskymmeneskahdesosanuotit"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:90
+msgid "sixteenth notes"
+msgstr "kuudestoistaosanuotit"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:90
+msgid "eighth notes"
+msgstr "kahdeksasosanuotit"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:91
+msgid "quarter notes"
+msgstr "neljäsosanuotit"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:91
+msgid "half notes"
+msgstr "puolinuotit"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:92
+msgid "whole notes"
+msgstr "kokonuotit"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:92
+msgid "double whole notes"
+msgstr "kaksoiskokonuotit"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:96
+#: ../src/gui/editors/notation/NotationStrings.cpp:154
+msgid "%1 triplets"
+msgstr "%1 triplettiä"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:100
+#: ../src/gui/editors/notation/NotationStrings.cpp:158
+msgid "%1 triplet"
+msgstr "%1 tripletti"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:143
+msgid "64th"
+msgstr "64."
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:143
+msgid "32nd"
+msgstr "32."
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:143
+msgid "16th"
+msgstr "16."
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:143
+msgid "8th"
+msgstr "8."
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:144
+msgid "quarter"
+msgstr "neljännes"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:144
+msgid "half"
+msgstr "puoli"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:144
+msgid "whole"
+msgstr "koko"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:145
+msgid "double whole"
+msgstr "kaksois-koko"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:148
+msgid "64ths"
+msgstr "64.-osat"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:148
+msgid "32nds"
+msgstr "32.-osat"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:148
+msgid "16ths"
+msgstr "16.-osat"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:148
+msgid "8ths"
+msgstr "8.-osat"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:149
+msgid "quarters"
+msgstr "4.-osat"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:149
+msgid "halves"
+msgstr "puolet"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:149
+msgid "wholes"
+msgstr "kokot"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:150
+msgid "double wholes"
+msgstr "kaksois-kokot"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:278
+msgid "%1 ticks"
+msgstr "%1 pientä merkkiä"
+
+#: ../src/gui/editors/notation/FontViewFrame.cpp:100
+#, c-format
+msgid "Error: Unable to match font name %1"
+msgstr "Virhe: Ei voitu yhdistää kirjasinnimeä %1"
+
+#: ../src/gui/editors/notation/FontViewFrame.cpp:108
+msgid "Warning: No good match for font name %1 (best is %2)"
+msgstr "Varoitus: Ei hyvää yhdistelmää kirjasinnimelle %1 (paras on %2)"
+
+#: ../src/gui/editors/notation/FontViewFrame.cpp:116
+#, c-format
+msgid "Error: Unable to open best-match font %1"
+msgstr "Virhe: Ei voitu avata parasta sopivaa kirjasinta %1"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:113
+msgid "Track %1 : \"%2\""
+msgstr "Raita %1 : \"%2\""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:119
+#, c-format
+msgid ""
+"\n"
+"Notate for: %1"
+msgstr ""
+"\n"
+"Nuotinnus :%1"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:121
+msgid "normal"
+msgstr "normaali"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:124
+msgid "small"
+msgstr "pieni"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:127
+msgid "tiny"
+msgstr "pikkuruinen"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:131
+msgid "--"
+msgstr "--"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:156
+msgid ""
+"\n"
+"Size: %1, Bracket: %2 "
+msgstr ""
+"\n"
+"Koko: %1, Sulkumerkki: %2 "
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:183
+msgid ""
+"\n"
+"bars [%1-%2] in %3 (tr=%4) : \"%5\""
+msgstr ""
+"\n"
+"tahdit [%1-%2] osa %3 (tr=%4) : \"%5\""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:190
+msgid ""
+"\n"
+"bars [%1-%2] (tr=%3) : \"%4\""
+msgstr ""
+"\n"
+"tahdit [%1-%2] (tr=%3) : \"%4\""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:240
+msgid "C#"
+msgstr "C#"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:242
+msgid "Eb"
+msgstr "Eb"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:245
+msgid "F#"
+msgstr "F#"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:247
+msgid "G#"
+msgstr "G#"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:249
+msgid "Bb"
+msgstr "Bb"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:352
+msgid "%1: %2"
+msgstr "%1: %2"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:355
+#, c-format
+msgid " in %1"
+msgstr " kohdassa %1"
+
+#: ../src/gui/editors/notation/NotationStaff.cpp:452
+msgid "Rendering staff %1..."
+msgstr "Hahmonnetaan viivastoa %1..."
+
+#: ../src/gui/editors/notation/NotationStaff.cpp:515
+msgid "Rendering notes on staff %1..."
+msgstr "Hahmonnetaan nuotteja viivastolle %1..."
+
+#: ../src/gui/editors/notation/NotationStaff.cpp:583
+msgid "Positioning staff %1..."
+msgstr "Asetellaan viivastoa %1..."
+
+#: ../src/gui/editors/notation/NotationSelectionPaster.cpp:85
+msgid "Ready."
+msgstr "Valmis."
+
+#: ../src/gui/editors/notation/RestInserter.cpp:62
+msgid "Dotted rest"
+msgstr "Pisteellinen tauko"
+
+#: ../src/gui/editors/notation/NoteStyleFileReader.cpp:57
+#, c-format
+msgid "Can't open style file %1"
+msgstr "Ei voitu avata tyylitiedostoa %1"
+
+#: ../src/gui/editors/notation/NoteStyleFileReader.cpp:92
+msgid "type is a required attribute of note"
+msgstr "tyyppi on nuotin vaadittu ominaisuus"
+
+#: ../src/gui/editors/notation/NoteStyleFileReader.cpp:101
+#, c-format
+msgid "Unrecognised note name %1"
+msgstr "Tunnistamaton nuottinimi %1"
+
+#: ../src/gui/editors/notation/NoteStyleFileReader.cpp:108
+msgid "global element must precede note elements"
+msgstr "kaiken kattavien elementtien täytyy edeltää nuottielementtejä"
+
+#: ../src/gui/editors/notation/NoteStyleFileReader.cpp:137
+msgid ""
+"global and note elements may have shape or charname attribute, but not both"
+msgstr ""
+"kaikenkattavilla ja nuottielementeillä voi olla muoto- tai merkkinimi-"
+"ominaisuus, mutta ei molempia"
+
+#: ../src/gui/editors/notation/NotationVLayout.cpp:493
+msgid ""
+"Spanned note at %1 has no HEIGHT_ON_STAFF property!\n"
+"This is a bug (the program would previously have crashed by now)"
+msgstr ""
+"Aika-arvollisella nuotilla kohdassa %1 ei ole HEIGHT_ON_STAFF ominaisuutta!\n"
+"Tämä on bugi (ohjelma olisi aiemmin kaatunut juuri nyt)"
+
+#: ../src/gui/editors/notation/NoteInserter.cpp:82
+msgid "Auto-Beam when appropriate"
+msgstr "Palkita nuotit kun se on soveliasta"
+
+#: ../src/gui/editors/notation/NoteInserter.cpp:103
+msgid "Dotted note"
+msgstr "Pisteellinen nuotti"
+
+#: ../src/gui/editors/notation/NoteInserter.cpp:120
+msgid "Switch to Inserting Rests"
+msgstr "Vaihda taukojen syöttöön"
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:98
+msgid "Collapse Rests"
+msgstr "Luhista tauot"
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:102
+msgid "Respell as Flat"
+msgstr "Kirjoita alennettuna"
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:106
+msgid "Respell as Sharp"
+msgstr "Kirjoita korotettuna"
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:110
+msgid "Respell as Natural"
+msgstr "Vaihda palautusmerkiksi"
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:114
+msgid "Collapse Notes"
+msgstr "Luhista nuotit"
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:130
+msgid "Make Invisible"
+msgstr "Tee näkymättömäksi"
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:134
+msgid "Make Visible"
+msgstr "Tee näkyväksi"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:129
+msgid "Event filters"
+msgstr "Tapahtumasuodattimet"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:138
+msgid "Rest"
+msgstr "Tauko"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:139
+msgid "Indication"
+msgstr "Osoitus"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:141
+msgid "Other"
+msgstr "Muu"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:161
+msgid "Triggered Segment Properties"
+msgstr "Sysäistävän osan ominaisuudet"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:166
+msgid "Label: "
+msgstr "Otsake: "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:176
+msgid "Base pitch: "
+msgstr "Perussävelkorkeus: "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:183
+msgid "Base velocity: "
+msgstr "Perusnopeus: "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:246
+msgid "Duration "
+msgstr "Kesto "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:247
+msgid "Event Type "
+msgstr "Tapahtumatyyppi "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:248
+msgid "Pitch "
+msgstr "Sävelkorkeus "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:249
+msgid "Velocity "
+msgstr "Nopeus "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:250
+msgid "Type (Data1) "
+msgstr "Tyyppi (Data1) "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:251
+msgid "Value (Data2) "
+msgstr "Arvo (Data2) "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:461
+msgid "(group %1) "
+msgstr "(ryhmä %1) "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:519
+msgid "<no events at this filter level>"
+msgstr "<ei tapahtumia tällä suodatustasolla>"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:521
+msgid "<no events>"
+msgstr "<ei tapahtumia>"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:696
+msgid "Segment label"
+msgstr "Osan otsake"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:696
+msgid "Label:"
+msgstr "Otsake:"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1123
+msgid "&Insert Event"
+msgstr "&Syötä tapahtuma"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1130
+msgid "&Delete Event"
+msgstr "&Poista tapahtuma"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1137
+msgid "&Edit Event"
+msgstr "&Muokkaa tapahtumaa"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1144
+msgid "&Advanced Event Editor"
+msgstr "&Edistynyt tapahtumamuokkain"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1518
+msgid "Open in Event Editor"
+msgstr "Avaa Tapahtumamuokkain"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1519
+msgid "Open in Expert Event Editor"
+msgstr "Avaa Asiantuntijan tapahtumamuokkaimessa"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1577
+msgid "%1 - Triggered Segment: %2"
+msgstr "%1 - sysäistävä osa: %2"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1592
+msgid "%1 - Segment Track #%2 - Event List"
+msgstr "%1 - osan raita #%2 - tapahtumalista"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1598
+msgid "%1 - %2 Segments - Event List"
+msgstr "%1 - %2 osaa - tapahtumalista"
+
+#: ../src/gui/rulers/TempoRuler.cpp:131
+msgid "Insert Tempo Change at Playback Position"
+msgstr "Syötä tempomuutos toisto-osoittimen kohdalle"
+
+#: ../src/gui/rulers/TempoRuler.cpp:136
+msgid "Delete Tempo Change"
+msgstr "Poista tempomuutos"
+
+#: ../src/gui/rulers/TempoRuler.cpp:140
+msgid "Ramp Tempo to Next Tempo"
+msgstr "Vietä tempo seuraavaan tempoon"
+
+#: ../src/gui/rulers/TempoRuler.cpp:144
+msgid "Un-Ramp Tempo"
+msgstr "Poista tempon viettäminen"
+
+#: ../src/gui/rulers/TempoRuler.cpp:149
+msgid "Edit Tempo..."
+msgstr "Muuta tempoa..."
+
+#: ../src/gui/rulers/TempoRuler.cpp:153
+msgid "Edit Time Signature..."
+msgstr "Muuta Tahtilajimerkintää..."
+
+#: ../src/gui/rulers/TempoRuler.cpp:588
+msgid "%1.%2%3 (%4.%5%6 bpm)"
+msgstr "%1.%2%3 (%4.%5%6 bpm)"
+
+#: ../src/gui/rulers/TempoRuler.cpp:596
+msgid "%1.%2%3 bpm"
+msgstr "%1.%2%3 bpm"
+
+#: ../src/gui/rulers/TempoRuler.cpp:604
+msgid "%1 - %2.%3%4"
+msgstr "%1 - %2.%3%4"
+
+#: ../src/gui/rulers/ControlRulerEventInsertCommand.cpp:36
+msgid "Insert Controller Event"
+msgstr "Syötä ohjaintapahtuma"
+
+#: ../src/gui/rulers/ControlChangeCommand.cpp:35
+msgid "Control Change"
+msgstr "Hallintamuutos"
+
+#: ../src/gui/rulers/PropertyViewRuler.cpp:72
+msgid "%1 controller"
+msgstr "%1 -ohjain"
+
+#: ../src/gui/rulers/RawNoteRuler.cpp:453
+msgid "Track #%1, Segment \"%2\" (runtime id %3)"
+msgstr "Raita #%1, Osa \"%2\" (ajo-id %3)"
+
+#: ../src/gui/rulers/MarkerRuler.cpp:100
+msgid "Insert Marker"
+msgstr "Syötä merkintä"
+
+#: ../src/gui/rulers/MarkerRuler.cpp:104
+msgid "Insert Marker at Playback Position"
+msgstr "Syötä merkintä toisto-osoittimen kohdalle"
+
+#: ../src/gui/rulers/MarkerRuler.cpp:109
+msgid "Delete Marker"
+msgstr "Poista merkintä"
+
+#: ../src/gui/rulers/MarkerRuler.cpp:114
+msgid "Edit Marker..."
+msgstr "Muokkaa merkintää..."
+
+#: ../src/gui/rulers/MarkerRuler.cpp:119
+msgid ""
+"Click on a marker to move the playback pointer.\n"
+"Shift-click to set a range between markers.\n"
+"Double-click to open the marker editor."
+msgstr ""
+"Klikkaa merkinnän kohdalla siirtääksesi toisto-osoitinta.\n"
+"Shift-klikkaa asettaaksesi alueen merkintöjen väliin.\n"
+"Tupla-klikkaa avataksesi merkitöjen muokkaimen."
+
+#: ../src/gui/rulers/ChordNameRuler.cpp:97
+msgid ""
+"Chord name ruler.\n"
+"Turn it on and off from the Settings->Rulers menu."
+msgstr ""
+"Sointunimi-viivain.\n"
+"Kytke se päälle ja pois kohdasta Asetukset->Viivaimet -valikko."
+
+#: ../src/gui/rulers/ControlRulerEventEraseCommand.cpp:37
+msgid "Erase Controller Event(s)"
+msgstr "Poista ohjaintapahtum(i)a"
+
+#: ../src/gui/general/EditView.cpp:901
+#: ../src/gui/rulers/ControllerEventsRuler.cpp:188
+msgid "Unsupported Event Type"
+msgstr "Tukematon tapahtumatyyppi"
+
+#: ../src/gui/rulers/ControllerEventsRuler.cpp:203
+msgid "Controller Events"
+msgstr "Ohjaintapahtumia"
+
+#: ../src/gui/rulers/ControllerEventsRuler.cpp:278
+msgid "Controller Event Number"
+msgstr "Ohjaintapahtumien määrä"
+
+#: ../src/gui/rulers/ControllerEventsRuler.cpp:471
+msgid "Add line of controllers"
+msgstr "Lisää ohjainrivi"
+
+#: ../src/gui/rulers/LoopRuler.cpp:89
+msgid ""
+"Click and drag to move the playback pointer.\n"
+"Shift-click and drag to set a range for looping or editing.\n"
+"Shift-click to clear the loop or range.\n"
+"Double-click to start playback."
+msgstr ""
+"Klikkaa ja vedä siirtääksesi toisto-osoittimen.\n"
+"Shift-klikkaa ja vedä asettaaksesi alueen silmukaksi tai muokattavaksi.\n"
+"Shift-klikkaa poistaaksesi silmukan tai alueen.\n"
+"Tupla-klikkaa aloittaaksesi toiston."
+
+#: ../src/gui/general/EditViewBase.cpp:228
+msgid "Set Segment Start Time..."
+msgstr "Aseta osan alkuaika..."
+
+#: ../src/gui/general/EditViewBase.cpp:232
+msgid "Set Segment Duration..."
+msgstr "Aseta osan kesto..."
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:56
+msgid "Load track parameters preset"
+msgstr "Lataa osan esiasetetut ominaisuudet"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:62
+msgid "Convert notation for..."
+msgstr "Muunna nuotinnus..."
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:86
+msgid "Select preset track parameters for:"
+msgstr "Valitse esiasetetut raidan ominaisuudet:"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:87
+msgid "Create appropriate notation for:"
+msgstr "Luo sopiva nuotinnus:"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:89
+msgid "Category"
+msgstr "Luokka"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:95
+msgid "Player Ability"
+msgstr "Soittokyky"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:97
+msgid "Amateur"
+msgstr "Harrastaja"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:98
+msgid "Professional"
+msgstr "Ammattilainen"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:104
+msgid "Only selected segments"
+msgstr "Vain valitut osat"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:106
+msgid "All segments in this track"
+msgstr "Kaikki osat tässä raidassa"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:111
+msgid "Only for new segments"
+msgstr "Vain uudet osat"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:113
+msgid "Convert existing segments"
+msgstr "Muunna olemassa olevat osat"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:39
+#, c-format
+msgid "C%1"
+msgstr "C%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:39
+#, c-format
+msgid "C#%1"
+msgstr "C#%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:39
+#, c-format
+msgid "D%1"
+msgstr "D%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:39
+#, c-format
+msgid "D#%1"
+msgstr "D#%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:40
+#, c-format
+msgid "E%1"
+msgstr "E%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:40
+#, c-format
+msgid "F%1"
+msgstr "F%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:40
+#, c-format
+msgid "F#%1"
+msgstr "F#%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:40
+#, c-format
+msgid "G%1"
+msgstr "G%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:41
+#, c-format
+msgid "G#%1"
+msgstr "G#%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:41
+#, c-format
+msgid "A%1"
+msgstr "A%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:41
+#, c-format
+msgid "A#%1"
+msgstr "A#%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:41
+#, c-format
+msgid "B%1"
+msgstr "B%1"
+
+#: ../src/gui/general/PresetGroup.cpp:95
+#, c-format
+msgid "Can't open preset file %1"
+msgstr "Ei voitu avata esiasetustiedostoa %1"
+
+#: ../src/gui/general/EditView.cpp:744
+msgid "&Halve Durations"
+msgstr "&Puolita kestot"
+
+#: ../src/gui/general/EditView.cpp:748
+msgid "&Double Durations"
+msgstr "Kahdenna kestot"
+
+#: ../src/gui/general/EditView.cpp:806
+msgid "Show Velocity Property Ruler"
+msgstr "Näytä Nopeusmuuttujat-viivain"
+
+#: ../src/gui/general/EditView.cpp:825
+msgid "Insert item"
+msgstr "Lisää yksikkö"
+
+#: ../src/gui/general/EditView.cpp:831
+msgid "Erase selected items"
+msgstr "Poista valitut yksiköt"
+
+#: ../src/gui/general/EditView.cpp:835
+msgid "Clear ruler"
+msgstr "Tyhjää viivain"
+
+#: ../src/gui/general/EditView.cpp:839
+msgid "Insert line of controllers"
+msgstr "Lisää ohjainrivi"
+
+#: ../src/gui/general/EditView.cpp:843
+msgid "Flip forward"
+msgstr "Toimita eteenpäin"
+
+#: ../src/gui/general/EditView.cpp:847
+msgid "Flip backwards"
+msgstr "Toimita taaksepäin"
+
+#: ../src/gui/general/EditView.cpp:851
+msgid "Draw property line"
+msgstr "Piirrä ominaisuusviiva"
+
+#: ../src/gui/general/EditView.cpp:855
+msgid "Select all property values"
+msgstr "Valitse kaikki ominaisuuksien arvot"
+
+#: ../src/gui/general/EditView.cpp:894
+msgid "%1 Controller %2 %3"
+msgstr "%1 -ohjain %2 %3"
+
+#: ../src/gui/general/EditView.cpp:1066
+msgid "I"
+msgstr "I"
+
+#: ../src/gui/general/EditView.cpp:1066
+msgid "II"
+msgstr "II"
+
+#: ../src/gui/general/EditView.cpp:1066
+msgid "III"
+msgstr "III"
+
+#: ../src/gui/general/EditView.cpp:1066
+msgid "IV"
+msgstr "IV"
+
+#: ../src/gui/general/EditView.cpp:1067
+msgid "V"
+msgstr "V"
+
+#: ../src/gui/general/EditView.cpp:1067
+msgid "VI"
+msgstr "VI"
+
+#: ../src/gui/general/EditView.cpp:1067
+msgid "VII"
+msgstr "VII"
+
+#: ../src/gui/general/EditView.cpp:1067
+msgid "VIII"
+msgstr "VIII"
+
+#: ../src/gui/general/EditView.cpp:1069
+msgid "%1 flat"
+msgstr "%1 alennettu"
+
+#: ../src/gui/general/EditView.cpp:1070
+msgid "%1 sharp"
+msgstr "%1 korotettu"
+
+#: ../src/gui/general/EditView.cpp:1085
+msgid "&Insert Note"
+msgstr "&Syötä nuotti"
+
+#: ../src/gui/general/EditView.cpp:1091
+msgid "&Upper Octave"
+msgstr "&Ylempi oktaavi"
+
+#: ../src/gui/general/EditView.cpp:1096
+msgid "&Lower Octave"
+msgstr "&Alempi oktaavi"
+
+#: ../src/gui/general/EditView.cpp:1268
+msgid "Estimated time signature shown"
+msgstr "Näytetään arvioitu tahtilaji"
+
+#: ../src/gui/general/EditView.cpp:1431
+msgid "Halving durations..."
+msgstr "Puolita kestot..."
+
+#: ../src/gui/general/EditView.cpp:1445
+msgid "Doubling durations..."
+msgstr "Tuplaa kestot..."
+
+#: ../src/gui/general/EditView.cpp:1469
+msgid "Rescaling..."
+msgstr "Määritetään koko uudelleen..."
+
+#: ../src/gui/general/EditView.cpp:1489
+msgid "By number of semitones: "
+msgstr "Puolisävelten määrällä: "
+
+#: ../src/gui/general/EditView.cpp:1496 ../src/gui/general/EditView.cpp:1518
+msgid "Transposing..."
+msgstr "Siirretään..."
+
+#: ../src/gui/general/EditView.cpp:1536
+msgid "Transposing up one semitone..."
+msgstr "Siirrä ylös yksi puolisävelaskel..."
+
+#: ../src/gui/general/EditView.cpp:1545
+msgid "Transposing up one octave..."
+msgstr "Siirrä ylös yksi oktaavi..."
+
+#: ../src/gui/general/EditView.cpp:1554
+msgid "Transposing down one semitone..."
+msgstr "Siirrä alas yksi puolisävelaskel..."
+
+#: ../src/gui/general/EditView.cpp:1563
+msgid "Transposing down one octave..."
+msgstr "Siirretään alas yksi oktaavi..."
+
+#: ../src/gui/general/EditView.cpp:1575
+msgid "Inverting..."
+msgstr "Käännetään ylösalaisin..."
+
+#: ../src/gui/general/EditView.cpp:1587
+msgid "Retrograding..."
+msgstr "Käännetään edestakaisin..."
+
+#: ../src/gui/general/EditView.cpp:1599
+msgid "Retrograde inverting..."
+msgstr "Käännetään edestakaisin ja ylösalaisin..."
+
+#: ../src/gui/general/EditView.cpp:1608
+msgid "Jogging left..."
+msgstr "Hypätään vasemmalle..."
+
+#: ../src/gui/general/EditView.cpp:1623
+msgid "Jogging right..."
+msgstr "Hypätään oikealle..."
+
+#: ../src/sound/AudioFileManager.cpp:660
+#, c-format
+msgid "Downloading file %1"
+msgstr "Ladataan tiedostoa %1"
+
+#: ../src/sound/AudioFileManager.cpp:735
+msgid "Converting audio file..."
+msgstr "Muunnetaan äänitiedostoa..."
+
+#: ../src/sound/AudioFileManager.cpp:737
+msgid "Resampling audio file..."
+msgstr "Muutetaan äänitiedoston näytteenottotaajuutta..."
+
+#: ../src/sound/AudioFileManager.cpp:739
+msgid "Converting and resampling audio file..."
+msgstr "Muunnetaan ja mitoitetaan uudelleen äänitiedostoa..."
+
+#: ../src/sound/AudioFileManager.cpp:741
+msgid "Importing audio file..."
+msgstr "Tuodaan äänitiedostoa..."
+
+#: ../src/sound/AudioFileManager.cpp:794
+msgid "Failed to convert or resample audio file on import"
+msgstr ""
+"Äänitiedoston muuntaminen tai sen näytteenottotaajuuden muuttaminen "
+"epäonnistui tuonnissa"
+
+#: ../src/sequencer/main.cpp:46 ../src/sequencer/main.cpp:86
+msgid "RosegardenSequencer"
+msgstr "RosegardenSekvensseri"
+
+#: ../src/sequencer/main.cpp:54
+msgid "JACK playback and capture ports"
+msgstr "JACK-toisto ja kaappausportit"
+
+#: ../src/commands/segment/SegmentSyncCommand.cpp:38
+#: ../src/commands/segment/SegmentSyncCommand.cpp:44
+#: ../src/commands/segment/SegmentSyncCommand.cpp:55
+#: ../src/commands/segment/SegmentSyncCommand.cpp:63
+msgid "Sync segment parameters"
+msgstr "Synronoi osan ominaisuudet"
+
+#: ../src/commands/segment/RenameTrackCommand.h:52
+msgid "Rename Track"
+msgstr "Nimeä raita uudelleen"
+
+#: ../src/commands/segment/SegmentRepeatToCopyCommand.cpp:39
+msgid "Turn Repeats into Copies"
+msgstr "Muuta kertaukset kopioiksi"
+
+#: ../src/commands/segment/SegmentTransposeCommand.cpp:36
+#: ../src/commands/segment/SegmentTransposeCommand.cpp:42
+msgid "Change segment transposition"
+msgstr "Vaihda osan sävelkorkeutta"
+
+#: ../src/commands/edit/RescaleCommand.h:50
+#: ../src/commands/segment/AudioSegmentRescaleCommand.h:62
+#: ../src/commands/segment/SegmentRescaleCommand.h:58
+msgid "Stretch or S&quash..."
+msgstr "Ven&ytä tai litistä..."
+
+#: ../src/commands/segment/SegmentLabelCommand.h:52
+msgid "Re&label..."
+msgstr "Ni&meä uudelleen..."
+
+#: ../src/commands/segment/AudioSegmentResizeFromStartCommand.cpp:39
+#: ../src/commands/segment/SegmentResizeFromStartCommand.cpp:39
+msgid "Resize Segment"
+msgstr "Muuta osan kokoa"
+
+#: ../src/commands/segment/RemoveTempoChangeCommand.h:58
+msgid "Remove &Tempo Change..."
+msgstr "Poista &temponmuutos..."
+
+#: ../src/commands/segment/SegmentEraseCommand.cpp:40
+#: ../src/commands/segment/SegmentEraseCommand.cpp:52
+msgid "Erase Segment"
+msgstr "Poista osat"
+
+#: ../src/commands/segment/AudioSegmentRescaleCommand.cpp:126
+#: ../src/commands/segment/SegmentRescaleCommand.cpp:102
+msgid "(rescaled)"
+msgstr "(muutettu koko)"
+
+#: ../src/commands/segment/AudioSegmentRescaleCommand.cpp:127
+#: ../src/commands/segment/SegmentRescaleCommand.cpp:105
+msgid "%1 (rescaled)"
+msgstr "%1 (muutettu koko)"
+
+#: ../src/commands/segment/PasteToTriggerSegmentCommand.cpp:47
+msgid "Paste as New Triggered Segment"
+msgstr "Liitä uutena sysättävä osana"
+
+#: ../src/commands/segment/SegmentColourMapCommand.h:52
+msgid "Change Segment Color Map..."
+msgstr "Muuta osan värikarttaa..."
+
+#: ../src/commands/segment/SegmentQuickCopyCommand.h:55
+msgid "Quick-Copy Segment"
+msgstr "Pikakopioi osa"
+
+#: ../src/commands/segment/AudioSegmentSplitCommand.cpp:42
+msgid "Split Audio Segment"
+msgstr "Jaa ääniosa"
+
+#: ../src/commands/segment/AudioSegmentSplitCommand.cpp:103
+#: ../src/commands/segment/SegmentSplitCommand.cpp:135
+msgid " (split)"
+msgstr " (jaettu)"
+
+#: ../src/commands/segment/AudioSegmentSplitCommand.cpp:104
+#: ../src/commands/segment/SegmentSplitByRecordingSrcCommand.cpp:120
+#: ../src/commands/segment/SegmentSplitByRecordingSrcCommand.cpp:122
+#: ../src/commands/segment/SegmentSplitCommand.cpp:136
+msgid "%1 (split)"
+msgstr "%1 (jaettu)"
+
+#: ../src/commands/segment/SegmentLabelCommand.cpp:40
+msgid "Label Segments"
+msgstr "Nimeä osiot uudelleen"
+
+#: ../src/commands/segment/OpenOrCloseRangeCommand.cpp:43
+msgid "Open or Close Range"
+msgstr "Avaa tai sulje alue"
+
+#: ../src/commands/edit/TransposeCommand.h:55
+#: ../src/commands/segment/SegmentTransposeCommand.h:54
+msgid "Transpose by &Interval..."
+msgstr "Siirrä &intervallilla..."
+
+#: ../src/commands/segment/SegmentAutoSplitCommand.cpp:148
+msgid "%1 (part)"
+msgstr "%1 (osio)"
+
+#: ../src/commands/segment/AudioSegmentInsertCommand.cpp:51
+#: ../src/commands/segment/SegmentInsertCommand.cpp:43
+#: ../src/commands/segment/SegmentInsertCommand.cpp:56
+msgid "Create Segment"
+msgstr "Luo osa"
+
+#: ../src/commands/segment/AudioSegmentInsertCommand.cpp:114
+msgid "%1 (inserted)"
+msgstr "%1 (syötetty)"
+
+#: ../src/commands/segment/AudioSegmentInsertCommand.cpp:117
+msgid "unknown audio file"
+msgstr "tuntematon äänitiedosto"
+
+#: ../src/commands/segment/CreateTempoMapFromSegmentCommand.cpp:40
+msgid "Set Tempos from Beat Segment"
+msgstr "Aseta tempot iskuosista"
+
+#: ../src/commands/segment/SegmentSplitByRecordingSrcCommand.h:52
+msgid "Split by &Recording Source..."
+msgstr "Jaa &nauhoituslähteen mukaan..."
+
+#: ../src/commands/segment/SegmentColourMapCommand.cpp:40
+msgid "Change Segment Color Map"
+msgstr "Vaihda osan värikarttaa"
+
+#: ../src/commands/edit/CopyCommand.cpp:64
+#: ../src/commands/segment/SegmentQuickCopyCommand.cpp:57
+msgid "%1 (copied)"
+msgstr "%1 (kopioitu)"
+
+#: ../src/commands/segment/SegmentColourCommand.h:52
+msgid "Change Segment Color..."
+msgstr "Muuta osan väriä..."
+
+#: ../src/commands/segment/SegmentSplitByPitchCommand.cpp:170
+msgid "%1 (upper)"
+msgstr "%1 (ylempi)"
+
+#: ../src/commands/segment/SegmentSplitByPitchCommand.cpp:172
+msgid "%1 (lower)"
+msgstr "%1 (alempi)"
+
+#: ../src/commands/segment/SegmentSingleRepeatToCopyCommand.cpp:39
+msgid "Turn Single Repeat into Copy"
+msgstr "Muuta yksi kertaus kopioksi"
+
+#: ../src/commands/segment/AddTempoChangeCommand.h:58
+msgid "Add Te&mpo Change..."
+msgstr "Lisää tempon vaihto..."
+
+#: ../src/commands/segment/AudioSegmentAutoSplitCommand.h:57
+#: ../src/commands/segment/SegmentAutoSplitCommand.h:53
+msgid "&Split on Silence"
+msgstr "&Jaa hiljaisuuden kohdalla"
+
+#: ../src/commands/segment/SetTriggerSegmentBaseVelocityCommand.cpp:39
+msgid "Set Base Velocity"
+msgstr "Aseta perusnopeus"
+
+#: ../src/commands/segment/DeleteRangeCommand.cpp:43
+#: ../src/commands/segment/EraseSegmentsStartingInRangeCommand.cpp:39
+msgid "Delete Range"
+msgstr "Poista alue"
+
+#: ../src/commands/segment/ChangeCompositionLengthCommand.h:53
+msgid "Change &Composition Start and End..."
+msgstr "Muuta sä&vellyksen alku- ja lopputahti..."
+
+#: ../src/commands/segment/MoveTracksCommand.h:51
+msgid "Move Tracks..."
+msgstr "Siirrä raitoja..."
+
+#: ../src/commands/segment/SegmentColourCommand.cpp:39
+msgid "Change Segment Color"
+msgstr "Vaihda osan väriä"
+
+#: ../src/commands/segment/AudioSegmentDistributeCommand.h:66
+msgid "Distribute Audio Segments over MIDI"
+msgstr "Hajauta ääniosat MIDI:lle"
+
+#: ../src/commands/segment/AudioSegmentAutoSplitCommand.cpp:147
+msgid "%1 (autosplit %2)"
+msgstr "%1 (jaa automaattisesti %2)"
+
+#: ../src/commands/segment/SetTriggerSegmentDefaultRetuneCommand.cpp:39
+msgid "Set Default Retune"
+msgstr "Aseta oletusarvoinen viritys"
+
+#: ../src/commands/segment/AddTimeSignatureCommand.h:52
+msgid "Add Time Si&gnature Change..."
+msgstr "Lisää ta&htilajin muutos..."
+
+#: ../src/commands/segment/AddTriggerSegmentCommand.cpp:42
+msgid "Add Triggered Segment"
+msgstr "Lisää sysättävä osa"
+
+#: ../src/commands/segment/SetTriggerSegmentDefaultTimeAdjustCommand.cpp:39
+msgid "Set Default Time Adjust"
+msgstr "Aseta oletusarvoinen ajanmukautus"
+
+#: ../src/commands/segment/RemoveTimeSignatureCommand.h:58
+msgid "Remove &Time Signature Change..."
+msgstr "Poista &tahtilajin muutos..."
+
+#: ../src/commands/segment/SegmentCommandRepeat.cpp:39
+msgid "Repeat Segments"
+msgstr "Kertaa osat"
+
+#: ../src/commands/segment/AddTracksCommand.h:55
+msgid "Add Tracks..."
+msgstr "Lisää raitoja..."
+
+#: ../src/commands/segment/ModifyDefaultTempoCommand.h:51
+msgid "Modify &Default Tempo..."
+msgstr "Muuta &oletustempoa..."
+
+#: ../src/commands/segment/SegmentSplitByPitchCommand.h:61
+msgid "Split by &Pitch..."
+msgstr "Jaa &sävelkorkeuden mukaan..."
+
+#: ../src/commands/segment/DeleteTriggerSegmentCommand.cpp:40
+msgid "Delete Triggered Segment"
+msgstr "Poista sysättävä osa"
+
+#: ../src/commands/segment/SegmentSplitCommand.cpp:42
+msgid "Split Segment"
+msgstr "Jaa osa"
+
+#: ../src/commands/segment/DeleteTracksCommand.h:51
+msgid "Delete Tracks..."
+msgstr "Poista raitoja..."
+
+#: ../src/commands/segment/InsertRangeCommand.cpp:42
+msgid "Insert Range"
+msgstr "Syötä alue"
+
+#: ../src/commands/segment/DeleteRangeCommand.h:62
+msgid "Rejoin Command"
+msgstr "Uudelleenliittämiskomento"
+
+#: ../src/commands/segment/SetTriggerSegmentBasePitchCommand.cpp:39
+msgid "Set Base Pitch"
+msgstr "Aseta perussävelkorkeus"
+
+#: ../src/commands/segment/PasteConductorDataCommand.cpp:41
+msgid "Paste Tempos and Time Signatures"
+msgstr "Liitä Tempo- ja tahtilajimerkinnät"
+
+#: ../src/commands/segment/SegmentSyncClefCommand.cpp:34
+msgid "Sync segment clef"
+msgstr "Synkronoi osan avain"
+
+#: ../src/commands/matrix/MatrixInsertionCommand.cpp:46
+#: ../src/commands/notation/NoteInsertionCommand.cpp:54
+msgid "Insert Note"
+msgstr "Syötä nuotti"
+
+#: ../src/commands/matrix/MatrixEraseCommand.cpp:41
+msgid "Erase Note"
+msgstr "Poista nuotti"
+
+#: ../src/commands/matrix/MatrixPercussionInsertionCommand.cpp:47
+msgid "Insert Percussion Note"
+msgstr "Lisää rumpunuotti"
+
+#: ../src/commands/matrix/MatrixModifyCommand.cpp:43
+msgid "Move Note"
+msgstr "Siirrä nuotti"
+
+#: ../src/commands/matrix/MatrixModifyCommand.cpp:43
+msgid "Modify Note"
+msgstr "Muokkaa nuottia"
+
+#: ../src/commands/edit/PasteEventsCommand.cpp:98
+msgid "Paste into an existing gap [\"restricted\"]"
+msgstr "Liitä olemassaolevaan väliin [\"rajoitettu\"]"
+
+#: ../src/commands/edit/PasteEventsCommand.cpp:100
+msgid "Erase existing events to make room [\"simple\"]"
+msgstr ""
+"Poista olemassa olevat tapahtumat tilan lisäämiseksi [\"yksinkertainen\"]"
+
+#: ../src/commands/edit/PasteEventsCommand.cpp:102
+msgid "Move existing events out of the way [\"open-n-paste\"]"
+msgstr "Siirrä olemassa olevat tapahtumat pois tieltä [\"avaa-ja-liitä\"]"
+
+#: ../src/commands/edit/PasteEventsCommand.cpp:104
+msgid "Overlay notes, tying against present notes [\"note-overlay\"]"
+msgstr "Peitä nuotit, sitoen nykyisiä nuotteja vasten [\"nuottien peitto\"]"
+
+#: ../src/commands/edit/PasteEventsCommand.cpp:106
+msgid "Overlay notes, ignoring present notes [\"matrix-overlay\"]"
+msgstr "Peitä nuotit, sivuuttaen nykyiset nuotit [\"matriisipeitto\"]"
+
+#: ../src/commands/edit/AddDotCommand.h:52
+msgid "&Add Dot"
+msgstr "&Lisää piste"
+
+#: ../src/commands/edit/RemoveMarkerCommand.h:55
+msgid "&Remove Marker"
+msgstr "&Poista kirjanmerkki"
+
+#: ../src/commands/edit/EventUnquantizeCommand.cpp:43
+#: ../src/commands/edit/EventUnquantizeCommand.cpp:54
+msgid "Unquantize Events"
+msgstr "Peruuta tapahtumien yksiköinti"
+
+#: ../src/commands/edit/ChangeVelocityCommand.h:53
+msgid "&Increase Velocity"
+msgstr "&Lisää nopeutta"
+
+#: ../src/commands/edit/ChangeVelocityCommand.h:54
+msgid "&Reduce Velocity"
+msgstr "&Vähennä nopeutta"
+
+#: ../src/commands/edit/CopyCommand.cpp:46
+msgid "(excerpt)"
+msgstr "(ote)"
+
+#: ../src/commands/edit/CopyCommand.cpp:60
+msgid "(copied)"
+msgstr "(kopioitu)"
+
+#: ../src/commands/edit/EventInsertionCommand.cpp:39
+msgid "Insert Event"
+msgstr "Lisää tapahtuma"
+
+#: ../src/commands/edit/InsertTriggerNoteCommand.cpp:55
+msgid "Insert Trigger Note"
+msgstr "Syötä sysäävä nuotti"
+
+#: ../src/commands/edit/CollapseNotesCommand.h:50
+msgid "Collapse &Equal-Pitch Notes"
+msgstr "Kasaa &nuotit, joilla on sama sävelkorkeus"
+
+#: ../src/commands/edit/TransposeCommand.h:61
+msgid "&Up a Semitone"
+msgstr "Puolisävelaskel &ylös"
+
+#: ../src/commands/edit/TransposeCommand.h:62
+msgid "&Down a Semitone"
+msgstr "Puolisävelaskel &alas"
+
+#: ../src/commands/edit/TransposeCommand.h:63
+msgid "Up an &Octave"
+msgstr "&Oktaavi ylös"
+
+#: ../src/commands/edit/TransposeCommand.h:64
+msgid "Down an Octa&ve"
+msgstr "Oktaa&vi alas"
+
+#: ../src/commands/edit/TransposeCommand.h:65
+msgid "&Transpose by Semitones..."
+msgstr "Siirrä &puolisävelaskelilla..."
+
+#: ../src/commands/edit/SetNoteTypeCommand.h:56
+msgid "&Set Note Type"
+msgstr "&Aseta nuottityyppi"
+
+#: ../src/commands/edit/EventEditCommand.h:55
+msgid "Edit E&vent"
+msgstr "Muokkaa ta&pahtumaa"
+
+#: ../src/commands/edit/AddMarkerCommand.h:54
+msgid "&Add Marker"
+msgstr "&Lisää kirjanmerkki"
+
+#: ../src/commands/edit/SelectionPropertyCommand.h:66
+msgid "Set &Property"
+msgstr "Aseta &ominaisuus"
+
+#: ../src/commands/edit/CutCommand.h:55
+msgid "Cu&t"
+msgstr "&Leikkaa"
+
+#: ../src/commands/edit/EventQuantizeCommand.cpp:114
+msgid "Heuristic Notation &Quantize"
+msgstr "Kokemusperäinen nuotinnuksen &yksiköinti"
+
+#: ../src/commands/edit/EventQuantizeCommand.cpp:116
+msgid "Grid &Quantize"
+msgstr "Ruudukkoon &yksiköinti"
+
+#: ../src/commands/edit/ClearTriggersCommand.h:52
+msgid "&Clear Triggers"
+msgstr "&Tyhjennä sysääjät"
+
+#: ../src/commands/edit/RetrogradeCommand.h:51
+msgid "&Retrograde"
+msgstr "&Edestakaisin"
+
+#: ../src/commands/edit/InvertCommand.h:51
+msgid "&Invert"
+msgstr "&Ylösalaisin"
+
+#: ../src/commands/edit/SetTriggerCommand.h:64
+msgid "Tri&gger Segment"
+msgstr "Lii&paise osa"
+
+#: ../src/commands/edit/SetLyricsCommand.h:50
+msgid "Edit L&yrics"
+msgstr "Muokkaa &sanoituksia"
+
+#: ../src/commands/edit/MoveAcrossSegmentsCommand.cpp:73
+msgid "&Move Events to Other Segment"
+msgstr "&Siirrä tapahtumat toiseen osaan"
+
+#: ../src/commands/edit/RetrogradeInvertCommand.h:51
+msgid "Re&trograde Invert"
+msgstr "Edestakaisin &ja ylösalaisin"
+
+#: ../src/commands/edit/ModifyMarkerCommand.h:55
+msgid "&Modify Marker"
+msgstr "&Muokkaa kirjanmerkkiä"
+
+#: ../src/commands/studio/AddControlParameterCommand.h:61
+msgid "&Add Control Parameter"
+msgstr "&Lisää hallintamuuttuja"
+
+#: ../src/commands/studio/ModifyInstrumentMappingCommand.h:55
+msgid "Modify &Instrument Mapping"
+msgstr "Muokkaa &instrumenttikarttaa"
+
+#: ../src/commands/studio/RemoveControlParameterCommand.h:60
+msgid "&Remove Control Parameter"
+msgstr "&Poista hallintamuuttuja"
+
+#: ../src/commands/studio/ReconnectDeviceCommand.h:55
+msgid "Reconnect Device"
+msgstr "Yhdistä laite uudelleen"
+
+#: ../src/commands/studio/ModifyDeviceCommand.h:68
+msgid "Modify &MIDI Bank"
+msgstr "Muokkaa &MIDI-pankkia"
+
+#: ../src/commands/studio/CreateOrDeleteDeviceCommand.h:68
+msgid "Create Device"
+msgstr "Luo laite"
+
+#: ../src/commands/studio/ModifyDeviceMappingCommand.h:55
+msgid "Modify &Device Mapping"
+msgstr "Muokkaa &laitekarttaa"
+
+#: ../src/commands/studio/RenameDeviceCommand.h:55
+msgid "Rename Device"
+msgstr "Nimeä laite uudelleen"
+
+#: ../src/commands/studio/ModifyControlParameterCommand.h:61
+msgid "&Modify Control Parameter"
+msgstr "&Muokkaa hallintamuuttujaa"
+
+#: ../src/commands/notation/TieNotesCommand.h:49
+msgid "&Tie"
+msgstr "Si&do"
+
+#: ../src/commands/notation/ClefInsertionCommand.cpp:74
+msgid "Add Cle&f Change..."
+msgstr "Lisää a&vaimen vaihto..."
+
+#: ../src/commands/notation/GuitarChordInsertionCommand.cpp:40
+msgid "Insert Guitar Chord"
+msgstr "Lisää kitarasointu"
+
+#: ../src/commands/notation/RespellCommand.cpp:47
+#, c-format
+msgid "Respell with %1"
+msgstr "Kirjoita %1"
+
+#: ../src/commands/notation/RespellCommand.cpp:50
+msgid "Do&uble Sharp"
+msgstr "Kak&soisylennys"
+
+#: ../src/commands/notation/RespellCommand.cpp:52
+msgid "&Sharp"
+msgstr "&Ylennys"
+
+#: ../src/commands/notation/RespellCommand.cpp:54
+msgid "&Flat"
+msgstr "&Alennus"
+
+#: ../src/commands/notation/RespellCommand.cpp:56
+msgid "Dou&ble Flat"
+msgstr "Kaks&oisalennus"
+
+#: ../src/commands/notation/RespellCommand.cpp:58
+msgid "&Natural"
+msgstr "&Palautus"
+
+#: ../src/commands/notation/RespellCommand.cpp:60
+msgid "N&one"
+msgstr "Ei m&ikään"
+
+#: ../src/commands/notation/RespellCommand.cpp:66
+msgid "Respell Accidentals &Upward"
+msgstr "Kirjoita etumerkit &ylöspäisinä"
+
+#: ../src/commands/notation/RespellCommand.cpp:69
+msgid "Respell Accidentals &Downward"
+msgstr "Kirjoita etumerkit &alaspäisinä"
+
+#: ../src/commands/notation/RespellCommand.cpp:72
+msgid "&Restore Accidentals"
+msgstr "Palauta etumerkit"
+
+#: ../src/commands/notation/RespellCommand.cpp:75
+msgid "Respell Accidentals"
+msgstr "Kirjoita uudelleen etumerkit"
+
+#: ../src/commands/notation/DeCounterpointCommand.h:55
+msgid "Split-and-Tie Overlapping &Chords"
+msgstr "Jaa -ja- sido päällekkäiset &soinnut"
+
+#: ../src/commands/notation/BeamCommand.h:49
+msgid "&Beam Group"
+msgstr "&Palkkiryhmä"
+
+#: ../src/commands/notation/AddTextMarkCommand.h:51
+msgid "Add Te&xt Mark..."
+msgstr "Lisää Te&kstimerkintä..."
+
+#: ../src/commands/notation/RestoreSlursCommand.h:49
+msgid "&Restore Slur Positions"
+msgstr "&Palauta kaarien sijainnit"
+
+#: ../src/commands/notation/SustainInsertionCommand.h:56
+msgid "Add Pedal &Press"
+msgstr "Lisää pe&daalin paino"
+
+#: ../src/commands/notation/SustainInsertionCommand.h:58
+msgid "Add Pedal &Release"
+msgstr "Lisää pe&daalin nosto"
+
+#: ../src/commands/notation/FixNotationQuantizeCommand.h:49
+msgid "Fi&x Notation Quantization"
+msgstr "&Kiinnitä nuottien yksiköinti"
+
+#: ../src/commands/notation/ChangeStemsCommand.h:51
+msgid "Stems &Up"
+msgstr "Varret &ylös"
+
+#: ../src/commands/notation/ChangeStemsCommand.h:51
+msgid "Stems &Down"
+msgstr "Varret &alas"
+
+#: ../src/commands/notation/MakeAccidentalsCautionaryCommand.cpp:43
+msgid "Use &Cautionary Accidentals"
+msgstr "Käytä &varoitusetumerkkejä"
+
+#: ../src/commands/notation/MakeAccidentalsCautionaryCommand.cpp:45
+msgid "Cancel C&autionary Accidentals"
+msgstr "Lopeta v&aroitusetumerkkien käyttö"
+
+#: ../src/commands/notation/SetVisibilityCommand.h:50
+msgid "Set Visibility"
+msgstr "Aseta näkyvyys"
+
+#: ../src/commands/notation/ChangeStyleCommand.h:53
+msgid "Change &Note Style"
+msgstr "Vaihda &nuottityyliä"
+
+#: ../src/commands/notation/TextInsertionCommand.cpp:41
+msgid "Insert Text"
+msgstr "Lisää teksti"
+
+#: ../src/commands/notation/InterpretCommand.h:70
+msgid "&Interpret..."
+msgstr "&Tulkitse..."
+
+#: ../src/commands/notation/TupletCommand.h:53
+msgid "&Triplet"
+msgstr "&Tripletti"
+
+#: ../src/commands/notation/TupletCommand.h:54
+msgid "Tu&plet..."
+msgstr "Tu&pletti..."
+
+#: ../src/commands/notation/UnTupletCommand.h:50
+msgid "&Untuplet"
+msgstr "Poista &tupletti"
+
+#: ../src/commands/notation/CollapseRestsCommand.h:54
+msgid "&Collapse Rests"
+msgstr "&Luhista tauot"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:145
+msgid "Add S&lur"
+msgstr "Lisää &kaari"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:147
+msgid "Add &Phrasing Slur"
+msgstr "Lisää &muotoilukaari"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:149
+msgid "Add Double-Octave Up"
+msgstr "Lisää kaksoisoktaavi ylös"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:151
+msgid "Add Octave &Up"
+msgstr "Lisää oktaavi &ylös"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:153
+msgid "Add Octave &Down"
+msgstr "Lisää oktaavi &alas"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:155
+msgid "Add Double Octave Down"
+msgstr "Lisää kaksoisoktaavi alas"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:160
+msgid "Add &Crescendo"
+msgstr "Lisää &voimistuen"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:162
+msgid "Add &Decrescendo"
+msgstr "Lisää &heikentyen"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:164
+msgid "Add &Glissando"
+msgstr "Lisää &Liukuen"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:167
+msgid "Add &%1%2"
+msgstr "Lisää &%1%2"
+
+#: ../src/commands/notation/RemoveNotationQuantizeCommand.h:49
+msgid "Remo&ve Notation Quantization"
+msgstr "&Poista nuottien yksiköinti"
+
+#: ../src/commands/notation/MakeChordCommand.h:50
+msgid "Make &Chord"
+msgstr "Tee &sointu"
+
+#: ../src/commands/notation/MultiKeyInsertionCommand.h:63
+msgid "Change all to &Key %1..."
+msgstr "Vaihda kaikki sävella&jiin %1..."
+
+#: ../src/commands/notation/KeyInsertionCommand.h:67
+#: ../src/commands/notation/MultiKeyInsertionCommand.h:65
+msgid "Add &Key Change..."
+msgstr "Lisää &sävellajinvaihdos..."
+
+#: ../src/commands/notation/RestoreStemsCommand.h:49
+msgid "&Restore Stems"
+msgstr "Pa&lauta varret"
+
+#: ../src/commands/notation/MakeNotesViableCommand.h:55
+#: ../src/commands/notation/MakeRegionViableCommand.h:52
+msgid "Tie Notes at &Barlines"
+msgstr "Sidotut nuotit &tahtiviivoilla"
+
+#: ../src/commands/notation/AddSlashesCommand.h:46
+msgid "Slashes"
+msgstr "Vinoviivat"
+
+#: ../src/commands/notation/ChangeSlurPositionCommand.h:51
+msgid "Slur &Above"
+msgstr "Kaari &yllä"
+
+#: ../src/commands/notation/ChangeSlurPositionCommand.h:51
+msgid "Slur &Below"
+msgstr "Kaari &alla"
+
+#: ../src/commands/notation/NormalizeRestsCommand.h:54
+msgid "&Normalize Rests"
+msgstr "&Tasaa tauot"
+
+#: ../src/commands/notation/TextChangeCommand.cpp:41
+msgid "Edit Text"
+msgstr "Muokkaa tekstiä"
+
+#: ../src/commands/notation/RemoveMarksCommand.h:49
+msgid "&Remove All Marks"
+msgstr "&Poista kaikki merkinnät"
+
+#: ../src/commands/notation/AutoBeamCommand.h:52
+msgid "&Auto-Beam"
+msgstr "&Automaattinen palkitus"
+
+#: ../src/commands/notation/UntieNotesCommand.h:49
+msgid "&Untie"
+msgstr "&Pura side"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:48
+msgid "S&forzando"
+msgstr "V&oimakkaasti"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:50
+msgid "Sta&ccato"
+msgstr "&Katkoen"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:52
+msgid "R&inforzando"
+msgstr "V&ahvasti"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:54
+msgid "T&enuto"
+msgstr "P&idättäen"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:56
+msgid "Tri&ll"
+msgstr "Li&verre"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:58
+msgid "Trill &with Line"
+msgstr "Liverre &viivalla"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:60
+msgid "Trill Line"
+msgstr "Liverreviiva"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:62
+msgid "&Turn"
+msgstr "&Kierros"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:64
+msgid "&Accent"
+msgstr "&Korostus"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:66
+msgid "&Staccatissimo"
+msgstr "&Hyvin katkoen"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:68
+msgid "&Marcato"
+msgstr "&Merkaten"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:70
+msgid "&Pause"
+msgstr "&Paussi"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:72
+msgid "&Up-Bow"
+msgstr "Jousi &ylös"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:74
+msgid "&Down-Bow"
+msgstr "Jousi &alas"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:76
+msgid "Mo&rdent"
+msgstr "Pu&reutuminen"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:78
+msgid "Inverted Mordent"
+msgstr "Käänteispureutuminen"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:80
+msgid "Long Mordent"
+msgstr "Pitkä pureutuminen"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:82
+msgid "Lon&g Inverted Mordent"
+msgstr "Pit&kä käänteispureutuminen"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:84
+msgid "&%1%2"
+msgstr "&%1%2"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:89
+#, c-format
+msgid "Add %1"
+msgstr "Lisää %1"
+
+#: ../src/commands/notation/ResetDisplacementsCommand.h:49
+msgid "Restore Positions"
+msgstr "Palauta sijainnit"
+
+#: ../src/commands/notation/IncrementDisplacementsCommand.h:52
+msgid "Fine Reposition"
+msgstr "Hienosijoitus"
+
+#: ../src/commands/notation/RestoreTiesCommand.h:49
+msgid "&Restore Tie Positions"
+msgstr "Palauta sidontojen sijainnit"
+
+#: ../src/commands/notation/ChangeTiePositionCommand.h:47
+msgid "Tie &Above"
+msgstr "Sidonta &yllä"
+
+#: ../src/commands/notation/ChangeTiePositionCommand.h:47
+msgid "Tie &Below"
+msgstr "Sidonta &alla"
+
+#: ../src/commands/notation/KeyInsertionCommand.h:65
+msgid "Change to &Key %1..."
+msgstr "Vaihda sä&vellajiin %1..."
+
+#: ../src/commands/notation/RemoveFingeringMarksCommand.h:49
+msgid "&Remove Fingerings"
+msgstr "&Poista sormitukset"
+
+#: ../src/commands/notation/BreakCommand.h:49
+msgid "&Unbeam"
+msgstr "&Poista palkki"
+
+#: ../src/commands/notation/UnGraceCommand.h:48
+msgid "Ung&race"
+msgstr "Poista kor&unuotit"
+
+#: ../src/commands/notation/AddFingeringMarkCommand.cpp:45
+msgid "Add Other &Fingering..."
+msgstr "Lisää muu &sormitus..."
+
+#: ../src/commands/notation/AddFingeringMarkCommand.cpp:47
+msgid "Add Fingering &0 (Thumb)"
+msgstr "Lisää sormitus &0 (peukalo)"
+
+#: ../src/commands/notation/AddFingeringMarkCommand.cpp:49
+#, c-format
+msgid "Add Fingering &%1"
+msgstr "Lisää sormitus &%1"
+
+#: ../src/document/io/HydrogenXMLHandler.cpp:277
+msgid " imported from Hydrogen "
+msgstr " tuotu Hydrogen:ista "
+
+#: ../src/document/io/LilyPondExporter.cpp:404
+msgid ""
+"LilyPond does not allow spaces or backslashes in filenames.\n"
+"\n"
+"Would you like to use\n"
+"\n"
+" %1\n"
+"\n"
+" instead?"
+msgstr ""
+"LilyPond ei salli välilyöntejä tai kenoviivoja tiedostonnimissä.\n"
+"\n"
+"Haluatko käyttää nimeä\n"
+"\n"
+" %1\n"
+"\n"
+" sen sijaan?"
+
+#: ../src/document/io/LilyPondExporter.cpp:2054
+msgid "warning: overlong bar truncated here"
+msgstr "varoitus: ylipitkä tahti katkaistiin tässä"
+
+#: ../src/document/io/LilyPondExporter.cpp:2060
+msgid "warning: bar too short, padding with rests"
+msgstr "varoitus: liian lyhyt tahti, täytetään tauoilla"
+
+#: ../src/document/MultiViewCommandHistory.cpp:318
+msgid "Nothing to undo"
+msgstr "Kumoamishistoria on tyhjä"
+
+#: ../src/document/MultiViewCommandHistory.cpp:320
+msgid "Nothing to redo"
+msgstr "Palautushistoria on tyhjä"
+
+#: ../src/document/MultiViewCommandHistory.cpp:328
+#: ../src/document/MultiViewCommandHistory.cpp:372
+#, c-format
+msgid "Und&o %1"
+msgstr "Ku&moa %1"
+
+#: ../src/document/MultiViewCommandHistory.cpp:330
+#: ../src/document/MultiViewCommandHistory.cpp:374
+#, c-format
+msgid "Re&do %1"
+msgstr "Pa&lauta %1"
+
+#: ../src/document/RosegardenGUIDoc.cpp:328
+msgid ""
+"The current file has been modified.\n"
+"Do you want to save it?"
+msgstr ""
+"Nykyistä tiedostoa on muokattu.\n"
+"Haluatko tallentaa sen?"
+
+#: ../src/document/RosegardenGUIDoc.cpp:480
+#, c-format
+msgid ""
+"_n: Delete the 1 audio file recorded during the unsaved session?\n"
+"Delete the %n audio files recorded during the unsaved session?"
+msgstr ""
+"Poista äänitiedosto, joka nauhoitettiin tallentamattoman session "
+"yhteydessä?\n"
+"Poista %n äänitiedostoa, jotka nauhoitettiin tallentamattoman session "
+"yhteydessä?"
+
+#: ../src/document/RosegardenGUIDoc.cpp:501
+msgid ""
+"The following audio files were recorded during this session but have been "
+"unloaded\n"
+"from the audio file manager, and so are no longer in use in the document you "
+"are saving.\n"
+"\n"
+"You may want to clean up these files to save disk space.\n"
+"\n"
+"Please select any you wish to delete permanently from the hard disk.\n"
+msgstr ""
+"Seuraavat äänitiedostot najuhoitettiin tämän session aikana, mutta ne "
+"vapautettiin\n"
+"äänitiedoston hallitsijasta, ja niin ne eivät ole enää käytössä "
+"dokumentissa, jota juuri tallennat.\n"
+"\n"
+"Haluanet siivot nämä tiedostot säästääksesi levytilaa.\n"
+"\n"
+"Ole hyvä, ja valitse halutessasi mikä tahansa niistä poistaaksesi sen "
+"pysyvästi kovalevyltä.\n"
+
+#: ../src/document/RosegardenGUIDoc.cpp:517
+#, c-format
+msgid ""
+"_n: <qt>About to delete 1 audio file permanently from the hard disk."
+"<br>There will be no way to recover this file.<br>Are you sure?</qt>\n"
+"\n"
+"<qt>About to delete %n audio files permanently from the hard disk.<br>There "
+"will be no way to recover these files.<br>Are you sure?</qt>"
+msgstr ""
+"<qt>Ollaan poistamassa pysyvästi 1 äänitiedosto kovalevyltä.<br>Tapoja "
+"palauttaa tiedosto takaisin ei ole<br>Oletko varma?<br></qt>\n"
+"\n"
+"<qt>Ollaan poistamassa %n äänitiedostoa pysyvästi kovalevyltä.<br>Tapoja "
+"palauttaa näitä tiedostoja takaisin ei ole.<br>Oletko varma?</qt>"
+
+#: ../src/document/RosegardenGUIDoc.cpp:580
+msgid "Can't open file '%1'"
+msgstr "Ei voitu avata tiedostoa '%1'"
+
+#: ../src/document/RosegardenGUIDoc.cpp:585
+msgid "Reading file..."
+msgstr "Luetaan tiedostoa..."
+
+#: ../src/document/RosegardenGUIDoc.cpp:603
+msgid "Could not open Rosegarden file"
+msgstr "Ei voitu avata Rosegarden-tiedostoa"
+
+#: ../src/document/RosegardenGUIDoc.cpp:641
+msgid "Error when parsing file '%1': \"%2\""
+msgstr "Virhe jäsennettäessä tiedostoa '%1': \"%2\""
+
+#: ../src/document/RosegardenGUIDoc.cpp:689
+msgid "Generating audio previews..."
+msgstr "Luodaan ääniesikatseluita..."
+
+#: ../src/document/RosegardenGUIDoc.cpp:721
+msgid "Merge"
+msgstr "Sulauta"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1605
+msgid "File load cancelled"
+msgstr "Tiedoston lataaminen keskeytettiin"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1625
+msgid ""
+"<h3>Audio and plugins not available</h3><p>This composition uses audio files "
+"or plugins, but Rosegarden is currently running without audio because the "
+"JACK audio server was not available on startup.</p><p>Please exit "
+"Rosegarden, start the JACK audio server and re-start Rosegarden if you wish "
+"to load this complete composition.</p><p><b>WARNING:</b> If you re-save this "
+"composition, all audio and plugin data and settings in it will be lost.</p>"
+msgstr ""
+"<h3>Ääni ja lisäosat eivät ole saatavilla</h3><p>Tämä sävellys käyttää "
+"äänitiedostoja tai lisäosia, mutta Rosegarden on nyt käynnissä ilman ääntä, "
+"koska JACK-äänipalvelin ei ollut saatavilla käynnistyksen yhteydessä.</"
+"p><p>Ole hyvä ja suljeRosegarden, käynnistä JACK-äänipalvelin ja käynnistä "
+"Rosegarden uudelleen, jos haluat ladata sävellyksen kokonaan.</"
+"p><p><b>VAROITUS:</b> Jos tallennat tämän sävellyksen uudelleen, sen kaikki "
+"ääni- ja lisäosatiedot ja asetukset häviävät.</p>"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1628
+msgid ""
+"<h3>Audio and plugins not available</h3><p>This composition uses audio files "
+"or plugins, but you are running a version of Rosegarden that was compiled "
+"without audio support.</p><p><b>WARNING:</b> If you re-save this composition "
+"from this version of Rosegarden, all audio and plugin data and settings in "
+"it will be lost.</p>"
+msgstr ""
+"<h3>Ääni ja lisäosat eivät ole saatavilla</h3><p>Tämä sävellys käyttää "
+"äänitiedostoja tai lisäosia, mutta käytät Rosegardenin versiota, joka "
+"käännettiin ilman äänitukea.</p><p><b>VAROITUS:</b> Jos tallennat tämän "
+"sävellyksen uudelleen tällä Rosegardenin versiolla, sen kaikki ääni- ja "
+"lisäosatiedot ja asetukset häviävät.</p>"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1665
+msgid ""
+"<h3>Incorrect audio sample rate</h3><p>This composition contains audio files "
+"that were recorded or imported with the audio server running at a different "
+"sample rate (%1 Hz) from the current JACK server sample rate (%2 Hz).</"
+"p><p>Rosegarden will play this composition at the correct speed, but any "
+"audio files in it will probably sound awful.</p><p>Please consider re-"
+"starting the JACK server at the correct rate (%3 Hz) and re-loading this "
+"composition before you do any more work with it.</p>"
+msgstr ""
+"<h3>Epäkelpo äänen näytteenottotaajuus</h3><p>Tämä sävellys sisältää "
+"äänitiedostoja, jotka nauhoitettiin tai tuotiin äänipalvelimella, "
+"jonkanäytteenottotaajuus (%1 Hz) poikkesi nykyisen JACK-palvelimen "
+"näytteenottotaajuudesta (%2 Hz).</p><p>Rosegarden soittaa tämän kappaleen "
+"oikealla nopeudella, mutta sen äänitiedostot kuulostavat todennäköisesti "
+"kauhealta.</p><p>Ole hyvä ja harkitse JACK-palvelimen käynnistämistä "
+"uudelleen oikealla taajuudella (%3 Hz) ja lataa tämä sävellys uudelleen "
+"ennen kuin teet mitään lisätyötä sen kanssa.</p>"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1675
+msgid ""
+"<h3>Inconsistent audio sample rates</h3><p>This composition contains audio "
+"files at more than one sample rate.</p><p>Rosegarden will play them at the "
+"correct speed, but any audio files that were recorded or imported at rates "
+"different from the current JACK server sample rate (%1 Hz) will probably "
+"sound awful.</p><p>Please see the audio file manager dialog for more "
+"details, and consider resampling any files that are at the wrong rate.</p>"
+msgstr ""
+"<h3>Yhteensopimattomia äänen näytteenottotaajuksia</h3><p>Tämä sävellys "
+"sisältää äänitiedostoja useammalla kuin yhdellä näytteenottotaajuudella.</"
+"p><p>Rosegarden soittaa ne oikealla nopeudella, mutta äänitiedostot, jotka "
+"nauhoitettiin tai tuotiin eri taajuuksilla kuin mikä on nykyisen JACK-"
+"palvelimen näytteenottotaajuus (%1 Hz) kuulostavat todennäköisesti kauheilta."
+"</p><p>Ole hyvä ja katso äänitiedostojen hallintaikkunasta lisätietoja, ja "
+"harkitse niiden tiedostojen näytteenottotaajuuden muuttamista, jotka ovat "
+"väärällä taajuudella.</p>"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1676
+msgid "Inconsistent sample rates"
+msgstr "Yhteensopimattomia näytteenottotaajuuksia"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1690
+msgid ""
+"<h3>Plugins not found</h3><p>The following audio plugins could not be loaded:"
+"</p><ul>"
+msgstr ""
+"<h3>Lisäosia ei löytynyt</h3><p>Seuraavaa ääni-lisäosaa ei ladattu:</p><ul>"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1698
+msgid "<li>%1 (from %2)</li>"
+msgstr "<li>%1 (paikasta %2)</li>"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1712
+msgid ""
+"This file contains one or more old element types that are now deprecated.\n"
+"Support for these elements may disappear in future versions of Rosegarden.\n"
+"We recommend you re-save this file from this version of Rosegarden to ensure "
+"that it can still be re-loaded in future versions."
+msgstr ""
+"Tämä tiedosto sisältää yhden tai useampia vanhoja ainesosatyyppejä, jota "
+"ovat nyt vanhentuneita.\n"
+"Tuki näille ainesosille voi kadota tulevissa Rosegardenin versioissa.\n"
+"Suosittelemme, että talletat tämän tiedoston tällä Rosegarden-versiolla "
+"varmistaaksesi, että se voidaan ladata vielä tulevissa versioissa."
+
+#: ../src/document/RosegardenGUIDoc.cpp:2207
+msgid "Insert Recorded MIDI"
+msgstr "Syötä nauhoitettu MIDI"
+
+#: ../src/document/RosegardenGUIDoc.cpp:2560
+msgid "%1 (recorded)"
+msgstr "%1 (nauhoitettu)"
+
+#: ../src/document/RoseXmlHandler.cpp:442
+msgid ""
+"This file was written by Rosegarden %1, and it uses\n"
+"a different file format that cannot be read by this version."
+msgstr ""
+"Tämän tiedoston on kirjoittanut Rosegarden %1, joka käyttää\n"
+"eir tiedostomuotoa, jota tämä versio ei voi lukea."
+
+#: ../src/document/RoseXmlHandler.cpp:452
+msgid ""
+"This file was written by Rosegarden %1, which is more recent than this "
+"version.\n"
+"There may be some incompatibilities with the file format."
+msgstr ""
+"Tämän tiedoston on kirjoittanut Rosegarden %1, joka on uudempi kuin tämä "
+"versio.\n"
+"Esiin saattaa tulla joitain yhteensopimattomuuksia tiedostomuodossa."
+
+#: ../src/document/RoseXmlHandler.cpp:1687
+msgid "Loading plugins..."
+msgstr "Ladataan lisäosat..."
+
+#: rc.cpp:6 rc.cpp:144
+#, no-c-format
+msgid "Se&gment"
+msgstr "&Osa"
+
+#: rc.cpp:9 rc.cpp:84 rc.cpp:147 rc.cpp:303
+#, no-c-format
+msgid "Edit &With"
+msgstr "Muokkaa &työkalulla"
+
+#: rc.cpp:12 rc.cpp:21 rc.cpp:30 rc.cpp:39 rc.cpp:345
+#, no-c-format
+msgid "Actions Toolbar"
+msgstr "Toiminnot -työkalupalkki"
+
+#: rc.cpp:15 rc.cpp:33 rc.cpp:129 rc.cpp:285
+#, no-c-format
+msgid "Time Toolbar"
+msgstr "Aika -työkalupalkki"
+
+#: rc.cpp:18 rc.cpp:36 rc.cpp:57 rc.cpp:63 rc.cpp:120 rc.cpp:243 rc.cpp:342
+#, no-c-format
+msgid "Transport Toolbar"
+msgstr "Kuljetin -työkalupalkki"
+
+#: rc.cpp:24 rc.cpp:42 rc.cpp:123 rc.cpp:348
+#, no-c-format
+msgid "Zoom Toolbar"
+msgstr "Suurennos -työkalupalkki"
+
+#: rc.cpp:45 rc.cpp:60 rc.cpp:99 rc.cpp:228 rc.cpp:327
+#, no-c-format
+msgid "T&ransport"
+msgstr "&Kuljetin"
+
+#: rc.cpp:51
+#, no-c-format
+msgid "Number of Stereo &Inputs"
+msgstr "Stereo-&sisääntulojen lukumäärä"
+
+#: rc.cpp:54
+#, no-c-format
+msgid "&Number of Submasters"
+msgstr "Alakeskusten &lukumäärä"
+
+#: rc.cpp:66
+#, no-c-format
+msgid "&Import"
+msgstr "&Tuo"
+
+#: rc.cpp:69
+#, no-c-format
+msgid "&Merge"
+msgstr "&Sulauta"
+
+#: rc.cpp:72
+#, no-c-format
+msgid "&Export"
+msgstr "&Vie"
+
+#: rc.cpp:75 rc.cpp:141 rc.cpp:297
+#, no-c-format
+msgid "&Composition"
+msgstr "&Sävellys"
+
+#: rc.cpp:78
+#, no-c-format
+msgid "&Studio"
+msgstr "&Studio"
+
+#: rc.cpp:81
+#, no-c-format
+msgid "Se&gments"
+msgstr "&Osat"
+
+#: rc.cpp:90
+#, no-c-format
+msgid "Trac&ks"
+msgstr "&Raidat"
+
+#: rc.cpp:93
+#, no-c-format
+msgid "Set &Instrument"
+msgstr "Aseta &instrumentti"
+
+#: rc.cpp:102 rc.cpp:234 rc.cpp:333
+#, no-c-format
+msgid "&Toolbars"
+msgstr "Työ&kalut"
+
+#: rc.cpp:105 rc.cpp:237 rc.cpp:336
+#, no-c-format
+msgid "&Rulers"
+msgstr "&Viivaimet"
+
+#: rc.cpp:111 rc.cpp:240 rc.cpp:339
+#, no-c-format
+msgid "Tools Toolbar"
+msgstr "Työkalut -työkalupalkki"
+
+#: rc.cpp:114
+#, no-c-format
+msgid "Tracks Toolbar"
+msgstr "Raidat -työkalupalkki"
+
+#: rc.cpp:117
+#, no-c-format
+msgid "Editors Toolbar"
+msgstr "Muokkaus -työkalupalkki"
+
+#: rc.cpp:135
+#, no-c-format
+msgid "&Layout Mode"
+msgstr "&Taittotila"
+
+#: rc.cpp:138 rc.cpp:294
+#, no-c-format
+msgid "Add Event Ruler"
+msgstr "Lisää Tapahtuma-viivain"
+
+#: rc.cpp:150
+#, no-c-format
+msgid "N&ote"
+msgstr "N&uotti"
+
+#: rc.cpp:153
+#, no-c-format
+msgid "Mar&ks"
+msgstr "Mer&kinnät"
+
+#: rc.cpp:156
+#, no-c-format
+msgid "&Ornaments"
+msgstr "&Korut"
+
+#: rc.cpp:159
+#, no-c-format
+msgid "&Fingerings"
+msgstr "&Sormitukset"
+
+#: rc.cpp:162
+#, no-c-format
+msgid "S&lashes"
+msgstr "&Vinoviivat"
+
+#: rc.cpp:165 rc.cpp:219
+#, no-c-format
+msgid "&Accidentals"
+msgstr "&Etumerkit"
+
+#: rc.cpp:168
+#, no-c-format
+msgid "&Phrase"
+msgstr "&Fraasi"
+
+#: rc.cpp:171
+#, no-c-format
+msgid "Slur &Position"
+msgstr "Kaarien &sijainnit"
+
+#: rc.cpp:174
+#, no-c-format
+msgid "Tie &Position"
+msgstr "Sidontojen &sijainti"
+
+#: rc.cpp:177
+#, no-c-format
+msgid "&Octaves"
+msgstr "&Oktaavit"
+
+#: rc.cpp:180 rc.cpp:306
+#, no-c-format
+msgid "Ad&just"
+msgstr "M&ukauta"
+
+#: rc.cpp:183
+#, no-c-format
+msgid "R&ests"
+msgstr "&Tauot"
+
+#: rc.cpp:186 rc.cpp:213
+#, no-c-format
+msgid "&Notes"
+msgstr "&Nuotit"
+
+#: rc.cpp:189 rc.cpp:309
+#, no-c-format
+msgid "&Quantize"
+msgstr "&Yksiköi"
+
+#: rc.cpp:195 rc.cpp:315
+#, no-c-format
+msgid "Trans&pose"
+msgstr "Trans&ponoi"
+
+#: rc.cpp:198 rc.cpp:318
+#, no-c-format
+msgid "Convert"
+msgstr "Muunna"
+
+#: rc.cpp:201
+#, no-c-format
+msgid "&Fine Positioning"
+msgstr "&Hienoasettelu"
+
+#: rc.cpp:204
+#, no-c-format
+msgid "Fine Ti&ming"
+msgstr "Hienoa&joitus"
+
+#: rc.cpp:207
+#, no-c-format
+msgid "&Visibility"
+msgstr "Näk&yvyys"
+
+#: rc.cpp:216
+#, no-c-format
+msgid "&Rests"
+msgstr "&Tauot"
+
+#: rc.cpp:222
+#, no-c-format
+msgid "&Clefs"
+msgstr "&Avaimet"
+
+#: rc.cpp:225 rc.cpp:324
+#, no-c-format
+msgid "Local &Cursor"
+msgstr "Paikallinen &osoitin"
+
+#: rc.cpp:246
+#, no-c-format
+msgid "Notes Toolbar"
+msgstr "Nuotit -työkalupalkki"
+
+#: rc.cpp:249
+#, no-c-format
+msgid "Rests Toolbar"
+msgstr "Tauot -työkalupalkki"
+
+#: rc.cpp:252
+#, no-c-format
+msgid "Clefs Toolbar"
+msgstr "Avaimet -työkalupalkki"
+
+#: rc.cpp:255
+#, no-c-format
+msgid "Accidentals Toolbar"
+msgstr "Etumerkit -työkalupalkki"
+
+#: rc.cpp:258
+#, no-c-format
+msgid "Group Toolbar"
+msgstr "Ryhmitys -työkalupalkki"
+
+#: rc.cpp:261
+#, no-c-format
+msgid "Marks Toolbar"
+msgstr "Merkinnät -työkalupalkki"
+
+#: rc.cpp:264
+#, no-c-format
+msgid "Meta Toolbar"
+msgstr "Meta -työkalupalkki"
+
+#: rc.cpp:267
+#, no-c-format
+msgid "Layout Toolbar"
+msgstr "Taitto -työkalupalkki"
+
+#: rc.cpp:270 rc.cpp:351
+#, no-c-format
+msgid "Control Ruler actions"
+msgstr "Hallitse Viivaimien toimintoja"
+
+#: rc.cpp:273 rc.cpp:354
+#, no-c-format
+msgid "Property Ruler actions"
+msgstr "Ominaisuus-viivaimen toiminnot"
+
+#: rc.cpp:276
+#, no-c-format
+msgid "&Action"
+msgstr "&Toiminto"
+
+#: rc.cpp:279
+#, no-c-format
+msgid "General Toolbar"
+msgstr "Yleiset -työkalupalkki"
+
+#: rc.cpp:291
+#, no-c-format
+msgid "&Grid"
+msgstr "&Ruudukko"
+
+#: rc.cpp:300
+#, no-c-format
+msgid "&Segment"
+msgstr "&Osa"
+
+#: rc.cpp:361
+#, no-c-format
+msgid "Hide additional controls"
+msgstr "Piilota lisäohjaimet"
+
+#: rc.cpp:365
+#, no-c-format
+msgid "Panic Button"
+msgstr "Paniikkinappula"
+
+#: rc.cpp:368
+#, no-c-format
+msgid "Resets all MIDI devices if you've got stuck notes"
+msgstr "Nollaa kaikki MIDI-laitteet, jos sait lukkiutuneita nuotteja"
+
+#: rc.cpp:375
+#, no-c-format
+msgid "Provides a metronome click for you to play along with"
+msgstr "Voit soittaa metronomin lyöntien mukana"
+
+#: rc.cpp:378
+#, no-c-format
+msgid "Shows MIDI activity in and out of Rosegarden"
+msgstr "Näyttää MIDI-toiminnan Rosegardenista sisään ja ulos"
+
+#: rc.cpp:381
+#, no-c-format
+msgid "IN"
+msgstr "SISÄÄN"
+
+#: rc.cpp:384
+#, no-c-format
+msgid "OUT"
+msgstr "ULOS"
+
+#: rc.cpp:387 rc.cpp:390
+#, no-c-format
+msgid "NO EVENTS"
+msgstr "EI TAPAHTUMIA"
+
+#: rc.cpp:397
+#, no-c-format
+msgid "Record either MIDI or audio"
+msgstr "Nauhoita joko MIDI tai ääni"
+
+#: rc.cpp:401
+#, no-c-format
+msgid "Loop"
+msgstr "Silmukka"
+
+#: rc.cpp:404
+#, no-c-format
+msgid "Turn on and off the loop markers (if set)"
+msgstr "Kytke päälle ja pois silmukan kirjanmerkit (jos ne on asetettu)"
+
+#: rc.cpp:411
+#, no-c-format
+msgid "Mutes all but the currently selected track"
+msgstr "Vaimentaa kaikki muut paitsi valitut raidat"
+
+#: rc.cpp:415
+#, no-c-format
+msgid "Start loop or range here"
+msgstr "Aloita silmukka tai alue täältä"
+
+#: rc.cpp:419
+#, no-c-format
+msgid "End loop or range here"
+msgstr "Lopeta silmukka tai alue tänne"
+
+#: rc.cpp:422
+#, no-c-format
+msgid "SIG"
+msgstr "SIG"
+
+#: rc.cpp:425
+#, no-c-format
+msgid "DIV"
+msgstr "DIV"
+
+#: rc.cpp:428
+#, no-c-format
+msgid "/16"
+msgstr "/16"
+
+#: rc.cpp:431
+#, no-c-format
+msgid "TEMPO"
+msgstr "TEMPO"
+
+#: rc.cpp:434
+#, no-c-format
+msgid "END"
+msgstr "LOPPU"
+
+#: rc.cpp:437
+#, no-c-format
+msgid "BAR"
+msgstr "TAHTI"
+
+#: rc.cpp:441
+#, no-c-format
+msgid "Switch between real time, musical time, and frame count"
+msgstr "Vaihda tosiajan, musiikkiajan, ja kehysmäärän välillä"
+
+#: rc.cpp:445
+#, no-c-format
+msgid "Show additional controls"
+msgstr "Näytä lisähallinnat"
+
+#: rc.cpp:449
+#, no-c-format
+msgid "Rewind"
+msgstr "Kelaa taaksepäin"
+
+#: rc.cpp:452
+#, no-c-format
+msgid "Moves the current pointer position back one bar."
+msgstr "Siirtää nykyisen osoittimen sijainnin yhden tahdin taaksepäin."
+
+#: rc.cpp:456
+#, no-c-format
+msgid "Rewind to beginning"
+msgstr "Kelaa alkuun"
+
+#: rc.cpp:459
+#, no-c-format
+msgid ""
+"Moves the pointer position to the start of the composition. (This may mean "
+"going forwards if the pointer is currently before the start.)"
+msgstr ""
+"Siirtää osoittimen sijainnin sävellyksen alkuun. (Tämä saattaa merkitä "
+"eteenpäin siirtymistä, jos osoitin sattuu olemaan alkua ennen.)"
+
+#: rc.cpp:463
+#, no-c-format
+msgid "Play/Pause"
+msgstr "Toista/Pysäytä"
+
+#: rc.cpp:466
+#, no-c-format
+msgid ""
+"Plays from the current pointer position, or pauses playback if already in "
+"progress."
+msgstr ""
+"Soittaa nykyisestä osoittimen kohdasta, tai pysäyttää toiston, jos se on jo "
+"etenemässä."
+
+#: rc.cpp:473
+#, no-c-format
+msgid "Stops playback or recording."
+msgstr "Lopettaa toisto tai nauhoituksen."
+
+#: rc.cpp:477
+#, no-c-format
+msgid "Fast forward"
+msgstr "Pikakelaus"
+
+#: rc.cpp:480
+#, no-c-format
+msgid "Moves the current pointer position forwards one bar."
+msgstr "Siirtää nykyisen osoittimen sijainnin yhden tahdin eteenpäin."
+
+#: rc.cpp:484
+#, no-c-format
+msgid "Fast forward to end"
+msgstr "Pikakelaa loppuun"
+
+#: rc.cpp:487
+#, no-c-format
+msgid ""
+"Moves the pointer position to the end of the composition. (This may mean "
+"going backwards if the pointer is already beyond the end.)"
+msgstr ""
+"Siirtää osoittimen sijainnin sävellyksen loppuun. (Tämä voi tarkoittaa "
+"siirtymistä taaksepäin, jos osoitin sattuu olemaan loppua myöhemmin.)"
+
+#: rc.cpp:491
+#, no-c-format
+msgid "Display time to end"
+msgstr "Näytä lopun kestoaika"
+
+#: ../docs/en/tips.cpp:3
+msgid ""
+"<p>To configure a track to play using a particular instrument:</p>\n"
+"&nbsp;&nbsp;* click on the track label and hold a moment<br>\n"
+"&nbsp;&nbsp;* select an output device<br>\n"
+"&nbsp;&nbsp;* select one of that device's available instruments (#1 - #16)"
+"<br>\n"
+"&nbsp;&nbsp;* adjust that instrument's output channel, program, bank, and\n"
+"controllers via the instrument parameters box\n"
+msgstr ""
+"<p>Määritelläksesi raidan soittamaan tiettyä instrumenttia:</p>\n"
+"&nbsp;&nbsp;* paina kohdistimella raidan nimen kohdalta ja odota hetki<br>\n"
+"&nbsp;&nbsp;* valitse ulostulolaite<br>\n"
+"&nbsp;&nbsp;* valitse yksi laitteen vapaista instrumenteista (#1 - #16)<br>\n"
+"&nbsp;&nbsp;* aseta instrumentin ulostulokanava, ohjelma, pankki, ja \n"
+"ohjaimet instrumentin ominaisuuslaatikosta\n"
+
+#: ../docs/en/tips.cpp:13
+msgid ""
+"<p>...that Rosegarden has an autosave feature?<br><br>\n"
+"You can select your autosave interval from <b>Settings->Configure\n"
+"Rosegarden</b>.<br><br>\n"
+"When something goes awry, such as a power outage or a Rosegarden crash\n"
+"(unfortunately, it happens...) simply load the file you were working on, and "
+"you'll be given the\n"
+"option to load the autosaved version, or the unmodified original.</p>\n"
+msgstr ""
+"<p>...että Rosegardenilla käytönaikainen varmennusominaisuus?<br><br>\n"
+"Voit valita varmennusaikavälin: <b>Asetukset->Konfiguroi\n"
+"Rosegarden</b>.<br><br>\n"
+"Kun jokin menee vinoon, kuten virrat katkeavat tai Rosegarden kaatuu\n"
+"(valitettavasti, sitä tapahtuu...) lataa vain tiedosto jonka parissa "
+"työskentelit, ja sinulle annetaan\n"
+"valinta ladata varmistettu versio tai aiempi tallennos.</p>\n"
+
+#: ../docs/en/tips.cpp:23
+msgid ""
+"<p>\n"
+"...that you can save the current document as your default studio by using\n"
+"<b>Composition -> Studio -> Save Current Document as Default Studio</b>?</"
+"p>\n"
+msgstr ""
+"<p>\n"
+"...että voit tallettaa nykyisen dokumentin oletusstudioksi käyttämällä\n"
+"<b>Sävellys -> Studio -> Tallenna nykyinen dokumentti oletusstudioksi</b>.</"
+"p>\n"
+
+#: ../docs/en/tips.cpp:30
+msgid ""
+"<p>...that your default studio is a complete Rosegarden composition that "
+"gets\n"
+"loaded every time you create a new document or import a MIDI file?</p>\n"
+msgstr ""
+"<p>...että oletusstudiosi on täydellinen Rosegarden sävellys, joka\n"
+"ladataan aina kun luot uuden dokumentin tai tuot MIDI tiedoston?</p>\n"
+
+#: ../docs/en/tips.cpp:36
+msgid ""
+"<p>...that your default studio can contain instrument assignments, document "
+"properties, LilyPond headers,\n"
+"and many other things?<br><br>The default studio is a complete Rosegarden "
+"composition, so it can contain anything that you may wish to have available "
+"in each\n"
+"new document you create.</p>\n"
+msgstr ""
+"<p>...että oletusstudiosi voi sisältää soitinliitoksia, "
+"asiakirjaominaisuuksia, LilyPond otsakkeita,\n"
+"ja monia muita asioita?<br><br>Oletusstudio on täydellinen Rosegarden "
+"sävelly, joten se voi sisältää mitä tahansa, jota haluaisit kunkin uuden "
+"asiakirjan sisältävän luontivaiheessa.</p>\n"
+
+#: ../docs/en/tips.cpp:43
+msgid ""
+"<p>...that Rosegarden will detect and create a default connection for ALSA "
+"soft\n"
+"synth applications that are started after Rosegarden is already running?</"
+"p>\n"
+msgstr ""
+"<p>...että Rosegarden havaitsee ja luo oletusyhteyden ALSA:n ohjelmallisiin\n"
+"syntetisaattoreihin, jotka käynnistetään Rosegarden käynnistyttyä?</p>\n"
+
+#: ../docs/en/tips.cpp:49
+msgid ""
+"<p>...that you can make your default studio override that in every "
+"Rosegarden composition you load?<br><br>If your studio setup does not change "
+"very often, and you would prefer for\n"
+"the settings in your default studio to take precedence over whatever\n"
+"studio is saved with any files you happen to load, you can make your studio "
+"the default for everything using <b>Settings -> Configure Rosegarden ->\n"
+"MIDI -> Always use default studio when loading files</b>.</p>\n"
+msgstr ""
+"<p>...että voit pakottaa oletusstudion käytettäväksi kaikissa Rosegarden-"
+"sävellyksissä latauksen yhteydessä?<br><br>Jos studioasetuksesi ei muutu "
+"kovin usein, ja haluat\n"
+"oletusstudiosi asetusten ohittavan minkä tahansa\n"
+"tallennetun tiedoston sisältämän studion asetukset latauksen yhteydessä, "
+"voit asettaa\n"
+"oletusstudion kaikelle käyttämällä <b>Asetukset -> Aseta Rosegarden ->\n"
+"MIDI -> Käytä aina oletusstudiota tiedostoja ladatessa</b>.</p>\n"
+
+#: ../docs/en/tips.cpp:57
+msgid ""
+"<p>If you have accidentally recorded a segment so short that it does not\n"
+"appear on the canvas, which you can only hear during subsequent recording\n"
+"sessions, you can gain access to it by using <b>Composition -> Change\n"
+"Composition Start and End</b> and then setting the composition to start at a "
+"negative number.</p>\n"
+msgstr ""
+"<p>Jos olet vahingossa nauhoittanut niin lyhyen osan, että sitä ei tahdo\n"
+"näkyä kankaalla, ja jonka kuulet vain seuraavilla nauhoituskerroilla,\n"
+"pääset käsiksi siihen asettamalla <b>Sävellys -> Muuta dokumentin\n"
+"alku ja loppu</b> ja määrittämällä sävellyksen alkukohdaksi negatiivisen "
+"luvun.</p>\n"
+
+#: ../docs/en/tips.cpp:65
+msgid ""
+"<p>...that if you place a note at the wrong pitch using the notation or "
+"matrix editor, you can move it one semitone at a time with the up and down "
+"arrow keys on your keyboard?</p>\n"
+msgstr ""
+"<p>...että jos sijoitat nuotin väärälle korkeudelle nuotintajassa tai "
+"matriisieditorissa, voit siirtää sitä puolisävelaskeleen kerrallaan "
+"näppäimistösi ylös- ja alas-painikkeilla?</p>\n"
+
+#: ../docs/en/tips.cpp:70
+msgid ""
+"<p>...that you can toggle stem directions in the notation editor by "
+"selecting\n"
+"one or more notes and using Ctrl-PageUp and Ctrl-PageDown?</p>\n"
+msgstr ""
+"<p>...että voit kytkeä palkkisuunnat nuotintajassa tai valitsemalla\n"
+"yhden tai useamman nuotin ja käyttämällä painikkeita Ctrl-Edellinen ja Ctrl-"
+"Seuraava?</p>\n"
+
+#: ../docs/en/tips.cpp:76
+msgid ""
+"<p>...that you can change the accidental used for a note in the notation "
+"editor (without changing the pitch of the note) by selecting\n"
+"it and using the up and down arrow keys with both Ctrl and Shift pressed?</"
+"p>\n"
+msgstr ""
+"<p>...että voit muuttaa nuotin käyttämän etumerkin nuotintajassa "
+"(muuttamatta nuotin sävelkorkeutta) valitsemalla\n"
+"sen ja painalla ylös ja alas näppäimiä sekä Ctrl että Shift pohjassa?</p>\n"
+
+#: ../docs/en/tips.cpp:82 ../docs/en/tips.cpp:93
+msgid ""
+"<p>...that you can hold down the Shift key while repositioning segments on "
+"the\n"
+"segment canvas in order to avoid the \"snap-to\" effect and exert finer "
+"control?</p>\n"
+msgstr ""
+"<p>...että voit pitää pohjassa Shift-näppäintä sijoittaessasi uudelleen "
+"osia\n"
+"osakankaalle välttääksesi \"lukkiutumis\"-efektin ja käyttääksesi hienompaa "
+"hallintaa?</p>\n"
+
+#: ../docs/en/tips.cpp:88
+msgid ""
+"<p>...that you can use the arrow tool to draw, move, and resize segments and "
+"events as well as to select them?<br><br>Drag a segment or event block to "
+"move it, drag the right edge of a block to resize it, and drag with the "
+"middle mouse button pressed to draw a new segment or event.<br><br>(Of "
+"course, the dedicated draw, move and resize tools are still quicker for "
+"repeated operations.)</p>\n"
+msgstr ""
+"<p>...että voit käyttää nuolityökalua piirtääksesi, siirtääksesi, ja "
+"uudelleenmitoittaaksesi osia ja tapahtumia, kuten myös valitaksesi niitä?"
+"<br><br>Piirrä osa tai tapahtumalohko siirtääksesi sitä, vedä lohkon "
+"oikeasta reunasta mitoittaaksesi sen koon uudelleen, ja vedä keskimmäinen "
+"nappi pohjaan painettuna piirtääksesi uuden osan tai tapahtuman.<br><br> "
+"(Varsinaisten piirto-, kuljetin- ja uudelleenmitoitustyökalujen käyttö on "
+"tietyssti yhä nopeampaa toistuvissa operaatioissa.)</p>\n"
+
+#: ../docs/en/tips.cpp:99
+msgid ""
+"<p>...that you can hold down the Shift key while repositioning or resizing "
+"events in the\n"
+"matrix view in order to avoid the \"snap-to\" effect and exert finer control?"
+"</p>\n"
+msgstr ""
+"<p>...että voi pitää Shift-painiketta pohjassa sijoittaessasi uudelleen "
+"jaksoja ja muutaessasi jaksojen pituuksia\n"
+"matriisinäkymässä välttääksesi \"lukkiutumis\"-efektin ja käyttääksesi "
+"hienompaa hallintaa?</p>\n"
+
+#: ../docs/en/tips.cpp:105
+msgid ""
+"<p>...that you can edit multiple segments on multiple tracks simultaneously "
+"in\n"
+"the notation editor? Simply select the segments, then use <b>Edit -> Open "
+"in Notation Editor</b>.</p>\n"
+msgstr ""
+"<p>...että voit muokata useampia osia useammilla raidoilla samanaikaisesti\n"
+"nuotintajassa? Valitse vain osat, ja käytä <b>Muokkaa -> Avaa nuotintaja</"
+"b>.</p>\n"
+
+#: ../docs/en/tips.cpp:111
+msgid ""
+"<p>...that Rosegarden can export files for use by LilyPond, the high-quality "
+"score typesetting system?<br><br>\n"
+"From the <b>File</b> menu, navigate to <b>Export -> Export LilyPond File</"
+"b></p>\n"
+msgstr ""
+"<p>...että Rosegarden voi viedä tiedostoja LilyPond-ohjelmalle, joka on "
+"korkealaatuinen nuottien ladontaohjelma?\n"
+"Suunnista <b>Tiedosto</b>-valikosta <b>Vie -> Vie LilyPond-tiedosto</b></p>\n"
+
+#: ../docs/en/tips.cpp:117
+msgid ""
+"<p>...that Rosegarden can print via LilyPond, the high-quality score "
+"typesetting system?<br><br>\n"
+"From the <b>File</b> menu, navigate to <b>Preview with LilyPond</b>. The "
+"file\n"
+"will be exported, rendered, and a preview will appear in KPDF, or one of\n"
+"several other PDF viewers, where it can then be printed as well.</p>\n"
+msgstr ""
+"<p>...että Rosegarden voi tulostaa käyttäen LilyPond-ohjelmaa, joka on "
+"korkealaatuinen nuottien ladontaohjelma?<br><br>\n"
+"Suunnista <b>Tiedosto</b>-valikosta <b>Esikatsele LilyPondilla</b>. \n"
+"Tiedosto viedään, hahmonnetaan, ja esikatsellaan KPDF-ohjelmalla tai yhdellä "
+"monista muista PDF-katselijoilla, joissa se voidaan sitten myös tulostaa.</"
+"p>\n"
+
+#: ../docs/en/tips.cpp:125
+msgid ""
+"<p>...that if you use the quantizer from within the notation view, you can "
+"tell it to quantize only the timing used for notation -- making it possible "
+"to have good looking notation <b>and</b> a human MIDI performance?</p>\n"
+msgstr ""
+"<p>...että jos käytät yksiköijää nuotinnosnäkymässä, voit kertoa sen "
+"yksiköimään vain nuottien käyttämät ajat -- mikä tekee mahdolliseksi "
+"hyvännäköisen nuotinnoksen <b>ja</b> inhimillisen MIDI esityksen?</p>\n"
+
+#: ../docs/en/tips.cpp:130
+msgid ""
+"<p>...that you can change segment labels using the controls on the Segment "
+"Parameters box\n"
+"in the main window?</p>\n"
+msgstr ""
+"<p>...että voit vaihtaa osien otsakkeita käyttämällä ohjaimia, jotka ovat "
+"osan parametrilaatikossa\n"
+"pääikkunassa?</p>\n"
+
+#: ../docs/en/tips.cpp:136
+msgid ""
+"<p>...that the number of tracks in new documents is based on the contents "
+"of\n"
+"your autoload.rg file?\n"
+"<br><br>\n"
+"Whether you prefer to start with three tracks or 43, create a document that\n"
+"contains the desired number of tracks, plus any other studio or document "
+"properties settings\n"
+"you wish to configure, and use <b>Composition -> Studio -> Save Current "
+"Document as Default\n"
+"Studio</b> to make this your new default.</p>\n"
+msgstr ""
+"<p>...että raitojen lukumäärä uudessa dokumentissa perustuu\n"
+"autoload.rg-tiedostosi sisältöön?\n"
+"Jos aloitat mieluummin kolmella tai 43:lla raidalla, lue uusi dokumentti "
+"jossa\n"
+"on haluttu raitamäärä, sekä mitkä tahansa studion tai dokumentin "
+"ominaisuuksia,\n"
+"jotka haluat määrittää, ja aseta <b>Sävellys -> Studio -> Tallenne nykyinen "
+"dokumentti\n"
+"oletusstudioksi</b> tehdäksesi tämän uudeksi oletukseksi.</p>\n"
+
+#: ../docs/en/tips.cpp:147
+msgid ""
+"<p>...that you can change the name of a track by double clicking on the "
+"label? (The\n"
+"label must be visible for this to work.)</p>\n"
+msgstr ""
+"<p>...että voit vaihtaa raidan nimeä kaksoisklikkaamalla otsaketta? "
+"(Otsakkeen\n"
+"täytyy olla näkyvissä, jotta tämä toimisi.)</p>\n"
+
+#: ../docs/en/tips.cpp:153
+msgid ""
+"<p>...that you can configure what happens when you double-click on a segment?"
+"<br><br>Go to <b>Settings -> Configure Rosegarden</b> and choose your "
+"preferred editing window under the <b>Behaviour</b> tab.</p>\n"
+msgstr ""
+"<p>...että voit määrittää mitä tapahtuu kun kaksoisklikkaat osaa? "
+"<br><br>Mene kohtaan <b>Asetukset -> Konfiguroi Rosegarden</b> ja valitse "
+"haluamasi muokkausikkuna <b>Käytös</b> liuskasta.</p>\n"
+
+#: ../docs/en/tips.cpp:158
+msgid ""
+"<p>...that Rosegarden is being developed as a community effort with\n"
+"contributions from around the world?<br><br>\n"
+"The four most active developers live in London (England), Cannes, "
+"Barcelona,\n"
+"and... Christiansburg? (Christiansburg is a town of about 50,000 in\n"
+"southwestern Virginia, USA.)<br><br>\n"
+"We have had contributors from elsewhere in the US, UK, Spain, Mexico, "
+"Argentina, Germany,\n"
+"Sweden, Russia, Japan, Finland, and Italy, just to name a few...</p>\n"
+msgstr ""
+"<p>...että Rosegardenia kehitetään yhteistyössä, jossa\n"
+"panokset tulevat ympäri maailmaa?<br><br>\n"
+"Pääkehittäjät asuvat Lontoossa (Iso-Britanniassa), Cannesissa, "
+"Barseloonassa,\n"
+"ja ... Christiansburgissa? (Christainsburg on 50 000 asukkaan kaupunki\n"
+"lounais-Virginiassa, Yhdysvalloissa.)<br><br>\n"
+"Olemme saaneet panoksia myös muualta Yhdysvalloista, Iso-Britanniasta, "
+"Espanjasta, Meksikosta, Argentiinasta, Saksasta,\n"
+"Ruotsista, Venäjältä, Japanista, Suomesta, ja Italiasta, vain muutamia "
+"mainitakseni..</p>\n"
+
+#: ../docs/en/tips.cpp:169
+msgid ""
+"<p>...that Rosegarden is available in Spanish, French, German, Russian, "
+"Welsh, Swedish, Italian and Estonian\n"
+"translations? (Just to name a few.)<br><br>\n"
+"If you're interested in translating Rosegarden to another language, drop us "
+"a\n"
+"line at <b>[email protected]</b>.</p>\n"
+msgstr ""
+"<p>...että Rosegarden on saatavilla espanjaksi, ranskaksi, saksaksi, "
+"venäjäksi, walesiksi, ruotsiksi, italiaksi ja viroksi? (vain muutamia "
+"mainitakseni.)<br><br>\n"
+"Jos olet kiinnostunut kääntämään Rosegardenin toiselle kielelle, tipauta "
+"meille\n"
+"rivi osoitteeseen <b>[email protected]</b>.</p>\n"
+
+#: ../docs/en/tips.cpp:177
+msgid ""
+"<p>...that you can change the total number of bars in the composition via\n"
+"<b>Composition -> Change Composition Start and End</b>?</p>\n"
+msgstr ""
+"<p>...että voit vaihtaa sävellyksen tahtien kokonaismäärää valitsemalla "
+"<b>Muokkaa \n"
+"-> Muuta sävellyksen alku ja loppu</b>?</p>\n"
+
+#: ../docs/en/tips.cpp:183
+msgid ""
+"<p>...that you can see the difference between performance and display "
+"duration\n"
+"of duration-quantized notes in the notation editor?<br><br>\n"
+"Use <b>Settings -> Show Raw Note Ruler</b> to turn on this handy\n"
+"feature.<br><br>\n"
+"<i>Note that this feature does not work in page layout view.</i></p>\n"
+msgstr ""
+"<p>...että voit nähdä eron esitetyn ja näytetyn keston välillä\n"
+"aika-yksiköidyillä nuoteilla nuotintajassa?<br><br>\n"
+"Aseta <b>Asetukset -> Näytä käsittelemätön nuottiviivain</b> kytkeäksesi "
+"tämän kätevän\n"
+"ominaisuuden.<br><br>\n"
+"<i>Huomaa, että tämä ominaisuus ei toimi sivuntaitto-näkymässä.</i></p>\n"
+
+#: ../docs/en/tips.cpp:192
+msgid ""
+"<p>...that you can add tempo and time-signature changes by double-clicking "
+"on the values displayed in the transport window or tempo rulers?</p>\n"
+msgstr ""
+"<p>...että voit lisätä tempo- ja tahtilajimerkintämuutokset "
+"kaksoisklikkaamalla näytettyjä arvoja kuljetinikkunassa tai tempoviivaimessa?"
+"</p>\n"
+
+#: ../docs/en/tips.cpp:197
+msgid ""
+"<p>...that the transport window can display musical time, sample frame "
+"count, and a visual metronome as well as real time?<br><br>Just click on the "
+"small button at the extreme top left of the window.</p>\n"
+msgstr ""
+"<p>...että kuljetinikkuna voi näyttää musiikin ajan, näytteen kehysluvun, ja "
+"näkyvän metronomin, kuten myös oikean ajan? <br><br>Klikkaan vain pientä "
+"painiketta, joka on äärimmäisenä ikkunan vasemmassa yläkulmassa.</p>\n"
+
+#: ../docs/en/tips.cpp:202
+msgid ""
+"<p>...that you can select all notes of a particular pitch in the matrix "
+"view, by shift-clicking on that pitch on the piano keyboard at the left?"
+"<br><br>If you shift-click-drag, you can select whole ranges too.</p>\n"
+msgstr ""
+"<p>...että voit valita kaikki tietynkorkuiset nuotit matriisinäkymässä "
+"klikkaamalla Shift pohjassa tätä nuottikorkeutta vasemmalla olevasta "
+"pianonäppäimistöstä? <br><br>Jos vielä vedät Shift-pohjassa, voit myös "
+"valita kokonaisia nuottikorkeusvälejä.</p>\n"
+
+#: ../docs/en/tips.cpp:207
+msgid ""
+"<p>...that you can set a loop in the main window by clicking-and-dragging on "
+"the time ruler with Shift pressed?<br><br>(If the ruler isn't visible, use "
+"<b>Settings -> Show Rulers</b>.)</p>\n"
+msgstr ""
+"<p>...että voit asettaa silmukan pääikkunassa klikkaamalla ja vetämällä "
+"aikaviivaimessa Shift painettuna?<br><br>(Jos viivain ei ole näkyvissä, "
+"aseta <b>Asetukset -> Näytä viivaimet</b>.)</p>\n"
+
+#: ../docs/en/tips.cpp:212
+msgid ""
+"<p>...that if you're editing a section in the matrix or notation view, you "
+"can\n"
+"set that section to loop while you edit it?<br><br>Select it and use "
+"<b>Tools ->\n"
+"Local Cursor -> Set Loop to Selection</b>, then hit Play.</p><br><br>\n"
+"<i>This feature does not work quite as well for compositions that include "
+"sampled\n"
+"audio.</i>\n"
+msgstr ""
+"<p>...että jos olet muokkaamassa osaa matriisi- tai nuottinäkymässä, voit "
+"asettaa sen osan silmukaksi muokatessasi sitä? <br><br>Valitse se ja aseta "
+"<b>Työkalut -> Paikallinen osoitin -> Aseta silmukka valinnalle</b>, ja "
+"napauta Toista.</p><br><br>\n"
+"<i>Tämä ominaisuus ei toimi aivan yhtä hyvin sävellyksissä, joissa on "
+"ääninäytteitä.</i>\n"
+
+#: ../docs/en/tips.cpp:221
+msgid ""
+"<p>...if you have more than one note or controller event at the same time, "
+"you\n"
+"can use the [ and ] keys to flip the stack of events around on the "
+"controller\n"
+"and velocity rulers in order to bring the item you wish to adjust into\n"
+"focus.</p>\n"
+msgstr ""
+"<p>...että jos sinulla on enemmän kuin yksi nuotti tai ohjaintapahtuma "
+"samanaikaisesti, voit\n"
+"käyttää myös näppäimiä käydessäsi läpi ohjaimella olevan tapahtumapinon ja "
+"nopeusviivainta tuodessasi esiin haluamasi osion.</p>\n"
+
+#: ../docs/en/tips.cpp:229
+msgid ""
+"<p>...that the notation view shows you notes using their display duration, "
+"while the\n"
+"matrix allows you to edit their performance duration?<br><br>\n"
+"<i>Be careful with tied notes in the matrix. It is not apparent that they "
+"are\n"
+"tied, and if you split up a pair of tied notes, subsequent notation views "
+"will\n"
+"be confused and unhappy. This is an old bug that has been on our TODO list\n"
+"for years. Sorry about that, folks. Patches welcome.</i>\n"
+"</p>\n"
+msgstr ""
+"<p>... että nuotinnusnäkymä näyttää nuotit käyttäen niiden näyttökestoa, kun "
+"matriisinäkymä puolestaan sallii niiden soittokeston muuttamisen.<br><br>\n"
+"<i>Ole varovainen sidottujen nuottien kanssa matriisissa. Ei ole ilmeistä "
+"että ne ovat sidottuja, ja jos katkaiset nuottiparin sidoksen, seuraava "
+"nuottinäkymä voi mennä onnettomasti sekaisin. Tämä on vanha "
+"ohjelmointivirhe, joka on ollut meidän TODO (tehtävänä) -listallamme "
+"vuosia. Pahoittelut siitä. Korjaukset ovat tervetulleita.</i>\n"
+"</p>\n"
+
+#: ../docs/en/tips.cpp:240
+msgid ""
+"<p>If you're working with a human performance and you need to insert some "
+"new\n"
+"notes, these new notes will sound for their entire written duration. To "
+"blend\n"
+"these new notes into a human performance, select them, then use <b>Adjust -> "
+"Interpret...</b> \n"
+"from the notation view to interpret any marks and massage their "
+"performance\n"
+"durations to something less mechanical.</p>\n"
+msgstr ""
+"<p>Jos työskentelet ihmisesityksen parissa ja sinun tarvitsee syöttää uusia "
+"nuotteja,\n"
+"nämä uudet nuotit soivat koko niiden kirjoitetun keston verran. "
+"Sekoittaaksesi\n"
+"nämä uudet nuotit ihmisesitykseen, valitse ne, ja aseta <b>Sovita -> "
+"Tulkitse...</b>\n"
+" nuottinäkymästä tulkitaksesi minkä tahansa merkin ja hieroaksesi niiden\n"
+"esityskestoa hieman vähemmän mekaaniseksi.</p>\n"
+
+#: ../docs/en/tips.cpp:249
+msgid ""
+"<p>...that Rosegarden can export certain things to LilyPond that it cannot "
+"yet\n"
+"display within its own native interface?<br><br>These new directives can be "
+"inserted\n"
+"via the <b>T</b> text insert tool in the notation view.<br><br>\n"
+"Load the example files\n"
+"<b>lilypond-alternative-endings.rg</b> and <b>lilypond-directives.rg</b> for "
+"a\n"
+"demonstration of how to use the new exportable directives.<br><br>\n"
+"Use <b>File -> Preview with\n"
+"LilyPond</b> to see what they look like on the exported page.<br><br>\n"
+"<i>Be sure to turn on\n"
+"<b>Settings -> Show LilyPond Directives</b> and <b>Show Annotations</b> "
+"within\n"
+"the notation view.</i></p>\n"
+msgstr ""
+"<p>...että Rosegarden voi viedä tiettyjä asioita LilyPondiin, joita se ei "
+"voi vielä\n"
+"näyttää sen omassa käyttöliittymässään.<br><br>Nämä uudet käskyt voidaan "
+"syöttää käyttäen <b>T</b> tekstinsyöttö-työkalua nuottinäkymässä.<br><br>\n"
+"Avaa esimerkkitiedostot\n"
+"<b>lilypond-alternative-endings.rg</b> ja <b>lilypond-directives.rg</b> "
+"nähdäksesi\n"
+"havaintoesityksen kuinka käyttää uusia vietäviä käskyjä.<br><br>\n"
+"Käytä <b>Tiedosto -> Esikatsele LilyPondilla</b>\n"
+"nähdäksesi miltä ne näyttävät viedyllä sivulla.<br><br>\n"
+"<i>Varmista että\n"
+"<b>Asetukset -> Näytä LilyPond-käskyt</b> ja <b>Näytä muistiinpanot</b> ovat "
+"asetettuina nuottinäkymässä.</i></p>\n"
+
+#: ../docs/en/tips.cpp:264
+msgid ""
+"<p>...that Rosegarden has track parameters allowing you to <b>Create "
+"segments with:</b> certain\n"
+"properties by default?<br><br>You can pre-select the clef, transposition, "
+"colour, and specify\n"
+"the highest and lowest playable notes (notes outside this range display in\n"
+"red by default). Then draw a segment with the pencil, or record one, and "
+"any\n"
+"new segments created on this track will take these properties as segment\n"
+"parameters.<br><br>\n"
+"<i>These parameters do not apply to audio tracks.</i></p>\n"
+msgstr ""
+"<p>...että Rosegardenissa on nyt raidan ominaisuudet kun <b>Luodaan osa:</b> "
+"tietyillä\n"
+"ominaisuuksilla.<br><br>Voita esivalita avaimen, sävelkorkeuden, värin, ja "
+"määritellä\n"
+"korkeimmat ja alimmat soitettavat nuotit (nuotit tämän alueen ulkopuolella "
+"näkyvät\n"
+"oletuksena punaisella). Sitten kun piirrät osia kynällä, tai nauhoitat "
+"osan, kukin tälle raidalle luotu osa saa nämä ominaisuudet osan\n"
+"ominaisuuksina.<br><br>\n"
+"<i>Näitä ominaisuuksia ei sovelleta ääniraidoille.</i></p>\n"
+
+#: ../docs/en/tips.cpp:275
+msgid ""
+"<p>...that Rosegarden has a database of preset parameters describing more "
+"than 300\n"
+"musical instruments from the real world, grouped into several convenient\n"
+"categories?<br><br>Each preset contains a clef, transposition, and playable "
+"range\n"
+"suggestions for both amateur and professional players.<br><br>Click the\n"
+"<b>Load</b> button in the new track parameters box to get started! <i>(If "
+"you\n"
+"do not see a <b>Load</b> button, be sure your parameter panel is set for\n"
+"tabbed mode, rather than stacked mode.)</i> <br><br> <i>(Special thanks to "
+"Magnus\n"
+"Johansson for assembling this extraordinary database.)</i></p>\n"
+msgstr ""
+"<p>...että Rosegardenilla on tietokanta etukäteen asetetuista "
+"ominaisuuksista, jotka kuvaavat yli 300\n"
+"maailmalta löytyvää musiikki-instrumenttia, ryhmiteltyinä muutamaan "
+"sopivaan\n"
+"luokkaan.<br><br>Kukin esiasetus sisältää avaimen, sävelkorkeuden, ja "
+"soittoääniala-\n"
+"ehdotuksen sekä harrastelija- että ammattilaissoittajille.<br><br>Napauta \n"
+"<b>Lataa</b>-painiketta uuden raidan ominaisuuslaatikossa aloittaaksesi! <i> "
+"(Jos et\n"
+"näe <b>Lataa</b>-painiketta, varmista että ominaisuus-sivupalkkisi on "
+"asetettu\n"
+"lehtiömuotoon, kasamuodon asemesta.)</i> <br><br> <i>(Erityiskiitokset "
+"Magnus\n"
+"Johanssonille tämän ainutlaatuisen tietokannan kokoamisesta.)</i></p>\n"
+
+#: ../docs/en/tips.cpp:287
+msgid ""
+"<p>...that when exporting to Lilypond, you can merge tracks that have the "
+"same name onto a single staff?<br><br>For example, if there are three voices "
+"in a single part, write each\n"
+"voice as an independent segment/staff, each on a separate track. Give all\n"
+"three tracks the same name, and select <b>[x] Merge tracks that have the "
+"same\n"
+"name</b> from the options dialog that appears when you export to, or "
+"preview\n"
+"with LilyPond.<br><br>\n"
+"<i>The tracks must have a non-default name for this to work.</i></p>\n"
+msgstr ""
+"<p>...että viedessäsi LilyPondiin, voi yhdistää raitoija joilla on saman "
+"nimi yhteen viivastoon?<br><br>Jos esimerkiksi yhdessä osassa on kolme "
+"ääntä, kirjoita kukin ääni riippumattomaan osaan/viivastoon, kukin eri "
+"raidalle. Anna kaikille\n"
+"kolmelle raidalle sama nimi, ja valitse <b>[x] Yhdistä raidat joilla on sama "
+"nimi<b>\n"
+"valintaikkunasta, joka ilmestyy kun viet tai esikatselet LilyPondilla."
+"<br><br>\n"
+"<i>Raidan oletusnimeä on muutettava, jotta tämä toimisi.</i>\n"
+
+#: ../docs/en/tips.cpp:297
+msgid ""
+" \t \n"
+"<p>...that you can use the mouse wheel to scroll up and down, scroll left "
+"and right, and zoom in and out?<br><br>Just roll the wheel to scroll up or "
+"down. Hold Alt as well to scroll left or right, or hold Ctrl to zoom in and "
+"out.</p> \t \n"
+msgstr ""
+" \t \n"
+"<p>...että voit käyttää hiiren rullaa vierittääksesi ylös ja alas, "
+"vasemmalle ja oikealle, ja lähentääksesi ja loitontaaksesi?<br><br>Pyöritä "
+"vain rullaa vierittääksesi ylös tai alas. PIdä myös Alt pohjassa "
+"vierittääksesi vasemmalle tai oikealle, tai pidä Ctrl pohjassa lähentääksesi "
+"tai loitontaaksesi.</p> \t \n"
+
+#: ../docs/en/tips.cpp:303
+msgid ""
+" \t \n"
+"<p>...that you can time-stretch an audio segment -- stretching or squashing "
+"a\n"
+"sample to a different duration without changing its pitch -- just by\n"
+"dragging its right edge with the Ctrl key pressed?</p>\n"
+msgstr ""
+" \t \n"
+"<p>...että voit venyttää ääniosaa ajallista pituutta -- venyttäen tai "
+"kutistaen näytteen\n"
+"eri kestoiseksi muuttamatta sen sävelkorkeutta -- vain vetämällä sen\n"
+"oikeasta reunasta pitäen Ctrl pohjassa?</p>\n"
+
+#: ../docs/en/tips.cpp:311
+msgid ""
+" \t \n"
+"<p>...that you can add audio to your Rosegarden composition just by dragging "
+"an audio file from your file manager and dropping it on the Rosegarden "
+"segment canvas? (Make sure you drop it on an audio track!)<br><br>You can "
+"also drop audio files from Rosegarden's audio file manager window onto the "
+"segment canvas, and from other programs onto the audio file manager.</p>\n"
+msgstr ""
+" \t \n"
+"<p>...että voi lisätä ääntä Rosegarden sävellykseen vain vetämällä "
+"äänitiedoston hallinnasta ja pudottamalla sen Rosegarden-osien kankaaseen? "
+"(Tarkista että pudotit sen ääniraidalle!)<br><br>Voit myös pudottaa "
+"äänitiedostot Rosegardenin äänitiedostojen hallintaikkunasta osien "
+"kankaaseen, ja muista ohjelmista äänitiedojen hallintaan</p>\n"
+
+#: ../docs/en/tips.cpp:317
+msgid ""
+" \t \n"
+"<p>...that you can set the tempo to match the duration of an audio segment "
+"if you know it's an exact number of bars or beats long?<br><br>Just select "
+"the audio segment and use <b>Composition -> Tempo and Time Signature -> Set "
+"Tempo to Audio Segment Duration</b>.</p>\n"
+msgstr ""
+" \t \n"
+"<p>...että voit asettaa tempon siten, että se sopii yhteen ääniosan kanssa, "
+"jos tiedät sen olevan tahtien tai iskujen kokonaisluku?<br><br>Valitse vain "
+"ääniosa ja käytä <b>Sävellys -> Tempo- ja aikamerkintä -> aseta Tempo "
+"ääniosan kestoon</b>.</p>\n"
+
+#: ../data/fonts/mappings/fonts.cpp:1
+msgid "Feta Pixmaps"
+msgstr "Feta-pikselikartat"
+
+#: ../data/fonts/mappings/fonts.cpp:2 ../data/fonts/mappings/fonts.cpp:7
+msgid "GNU Lilypond"
+msgstr "GNU LilyPond"
+
+#: ../data/fonts/mappings/fonts.cpp:3 ../data/fonts/mappings/fonts.cpp:8
+msgid "Copyright (c) 1997--2003 Han-Wen Nienhuys and Jan Nieuwenhuizen"
+msgstr "Copyright (c) 1997--2003 Han-Wen Nienhuys ja Jan Nieuwenhuizen"
+
+#: ../data/fonts/mappings/fonts.cpp:4 ../data/fonts/mappings/fonts.cpp:9
+#: ../data/fonts/mappings/fonts.cpp:14 ../data/fonts/mappings/fonts.cpp:19
+#: ../data/fonts/mappings/fonts.cpp:24 ../data/fonts/mappings/fonts.cpp:29
+#: ../data/fonts/mappings/fonts.cpp:34 ../data/fonts/mappings/fonts.cpp:39
+#: ../data/fonts/mappings/fonts.cpp:44 ../data/fonts/mappings/fonts.cpp:49
+#: ../data/fonts/mappings/fonts.cpp:54
+msgid "Chris Cannam"
+msgstr "Chris Cannam"
+
+#: ../data/fonts/mappings/fonts.cpp:5 ../data/fonts/mappings/fonts.cpp:40
+msgid "pixmap"
+msgstr "pikselikartta"
+
+#: ../data/fonts/mappings/fonts.cpp:6
+msgid "Feta"
+msgstr "Feta"
+
+#: ../data/fonts/mappings/fonts.cpp:10 ../data/fonts/mappings/fonts.cpp:15
+#: ../data/fonts/mappings/fonts.cpp:20 ../data/fonts/mappings/fonts.cpp:25
+#: ../data/fonts/mappings/fonts.cpp:30 ../data/fonts/mappings/fonts.cpp:35
+#: ../data/fonts/mappings/fonts.cpp:45 ../data/fonts/mappings/fonts.cpp:50
+#: ../data/fonts/mappings/fonts.cpp:55
+msgid "scalable"
+msgstr "skaalattava"
+
+#: ../data/fonts/mappings/fonts.cpp:11
+msgid "Fughetta"
+msgstr "Fughetta"
+
+#: ../data/fonts/mappings/fonts.cpp:12
+msgid ""
+"Created by Blake Hodgetts; freely redistributable. See http://www.efn.org/"
+"~bch/aboutfonts.html"
+msgstr ""
+"Luonut Blake Hodgetts; vapaasti levitettävissä. Katso http://www.efn.org/"
+"~bch/aboutfonts.html"
+
+#: ../data/fonts/mappings/fonts.cpp:13
+msgid "Copyright 1995-1999 Blake Hodgetts"
+msgstr "Copyright 1995-1999 Blake Hodgetts"
+
+#: ../data/fonts/mappings/fonts.cpp:16
+msgid "Inkpen"
+msgstr "Inkpen"
+
+#: ../data/fonts/mappings/fonts.cpp:17
+msgid "Inkpen is part of Sibelius, but other fonts may use the same mappings."
+msgstr ""
+"Inkpen on osa Sibelius:ta, mutta muut kirjasimet voivat käyttää sen karttaa."
+
+#: ../data/fonts/mappings/fonts.cpp:18 ../data/fonts/mappings/fonts.cpp:28
+msgid "Copyright Sibelius Software Ltd"
+msgstr "Copyright Sibelius Software Ltd"
+
+#: ../data/fonts/mappings/fonts.cpp:21
+msgid "Maestro"
+msgstr "Maestro"
+
+#: ../data/fonts/mappings/fonts.cpp:22
+msgid "Maestro is part of Finale, but other fonts use the same mappings."
+msgstr ""
+"Maestro on osa Finale:a, mutta muut kirjasimet voivat käyttää sen karttaa."
+
+#: ../data/fonts/mappings/fonts.cpp:23 ../data/fonts/mappings/fonts.cpp:33
+msgid "Copyright Coda Inc"
+msgstr "Copyright Coda Inc"
+
+#: ../data/fonts/mappings/fonts.cpp:27
+msgid "Opus is part of Sibelius, but other fonts may use the same mappings."
+msgstr ""
+"Opus on osa Sibelius:ta, mutta muut kirjasimet voivat käyttää sen karttaa."
+
+#: ../data/fonts/mappings/fonts.cpp:31
+msgid "Petrucci"
+msgstr "Petrucci"
+
+#: ../data/fonts/mappings/fonts.cpp:32
+msgid "Petrucci is part of Finale, but other fonts use the same mappings."
+msgstr ""
+"Petrucci on osa Finale:a, mutta muut kirjasimet voivat käyttää sen karttaa."
+
+#: ../data/fonts/mappings/fonts.cpp:36
+msgid "RG21"
+msgstr "RG21"
+
+#: ../data/fonts/mappings/fonts.cpp:37
+msgid "Rosegarden 2.1"
+msgstr "Rosegarden 2.1"
+
+#: ../data/fonts/mappings/fonts.cpp:38
+msgid "Copyright (c) 1994--2001 Chris Cannam"
+msgstr "Copyright (c) 1994--2001 Chris Cannam"
+
+#: ../data/fonts/mappings/fonts.cpp:41
+msgid "Sonata"
+msgstr "Sonata"
+
+#: ../data/fonts/mappings/fonts.cpp:42
+msgid "Adobe"
+msgstr "Adobe"
+
+#: ../data/fonts/mappings/fonts.cpp:43
+msgid "Copyright Adobe Inc"
+msgstr "Copyright Adobe Inc"
+
+#: ../data/fonts/mappings/fonts.cpp:46
+msgid "Steinberg"
+msgstr "Steinberg"
+
+#: ../data/fonts/mappings/fonts.cpp:47
+msgid "The Steinberg Notation font is part of Cubase."
+msgstr "Steinberg nuotinnuskirjasin on osa Cubase:a."
+
+#: ../data/fonts/mappings/fonts.cpp:48
+msgid "Copyright Steinberg Inc"
+msgstr "Copyright Steinberg Inc"
+
+#: ../data/fonts/mappings/fonts.cpp:51
+msgid "Xinfonia"
+msgstr "Xinfonia"
+
+#: ../data/fonts/mappings/fonts.cpp:52
+msgid "xemo.org"
+msgstr "xemo.org"
+
+#: ../data/fonts/mappings/fonts.cpp:53
+msgid "Copyright 2001-2003 Xemus Software LLC"
+msgstr "Copyright 2001-2003 Xemus Software LLC"
+
+#: ../data/styles/styles.cpp:1
+msgid "Classical"
+msgstr "Klassinen"
+
+#: ../data/styles/styles.cpp:2
+msgid "Cross"
+msgstr "Risti"
+
+#: ../data/styles/styles.cpp:3
+msgid "Mensural"
+msgstr "Mensuraali"
+
+#: ../data/styles/styles.cpp:4
+msgid "Triangle"
+msgstr "Kolmio"
+
+#~ msgid "Set Quick Marker"
+#~ msgstr "Aseta pikamerkintä"
diff --git a/po/fr.po b/po/fr.po
new file mode 100644
index 0000000..9d78f45
--- /dev/null
+++ b/po/fr.po
@@ -0,0 +1,11600 @@
+# translation of new-new-fr.po to français
+# This file is distributed under the same license as the PACKAGE package.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+#
+# Guillaume Laurent <[email protected]>, 2003.
+# Burli <[email protected]>, 2003,2004.
+# Yves Guillemot <[email protected]>, 2007, 2008.
+msgid ""
+msgstr ""
+"Project-Id-Version: new-new-fr\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-04-24 18:19-0400\n"
+"PO-Revision-Date: 2008-04-13 16:58+0200\n"
+"Last-Translator: Yves Guillemot <[email protected]>\n"
+"Language-Team: français <[email protected]>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.4\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+
+#: ../src/gui/dialogs/RescaleDialog.cpp:51 rc.cpp:192 rc.cpp:312
+#, no-c-format
+msgid "Rescale"
+msgstr "Redimensionner"
+
+#: ../src/gui/dialogs/RescaleDialog.cpp:56
+msgid "Duration of selection"
+msgstr "Durée de la sélection"
+
+#: ../src/gui/dialogs/RescaleDialog.cpp:62
+msgid "Adjust times of following events accordingly"
+msgstr "Ajuster les dates des événements suivants"
+
+#: ../src/gui/dialogs/PitchDialog.cpp:45
+#: ../src/gui/dialogs/RescaleDialog.cpp:72
+#: ../src/gui/dialogs/TimeDialog.cpp:51 ../src/gui/dialogs/TimeDialog.cpp:68
+#: ../src/gui/studio/BankEditorDialog.cpp:109
+msgid "Reset"
+msgstr "Remise à zéro"
+
+#: ../src/commands/segment/SegmentSplitByPitchCommand.cpp:46
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:46
+msgid "Split by Pitch"
+msgstr "Séparation par ton"
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:54
+msgid "Starting split pitch"
+msgstr "Démarrage de la séparation par ton"
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:57
+msgid "Range up and down to follow music"
+msgstr "Faire varier la séparation pour suivre la musique"
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:63
+msgid "Duplicate non-note events"
+msgstr "Dupliquer les événements autres que les notes"
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:66
+msgid "Clef handling:"
+msgstr "Traitement des clefs:"
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:69
+msgid "Leave clefs alone"
+msgstr "Conserver les clefs"
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:70
+msgid "Guess new clefs"
+msgstr "Deviner les nouvelles clefs"
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:71
+msgid "Use treble and bass clefs"
+msgstr "Utiliser les clefs de sol et de fa"
+
+#: ../src/gui/dialogs/DocumentConfigureDialog.cpp:64
+msgid "Document Properties"
+msgstr "Propriétés du document"
+
+#: ../src/gui/dialogs/MakeOrnamentDialog.cpp:45
+#: ../src/gui/editors/notation/NotationView.cpp:6048
+msgid "Make Ornament"
+msgstr "Réaliser un ornement"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:183
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:179
+#: ../src/gui/dialogs/EventEditDialog.cpp:128
+#: ../src/gui/dialogs/MakeOrnamentDialog.cpp:49
+#: ../src/gui/studio/DeviceEditorDialog.cpp:74
+#: ../src/gui/studio/NameSetEditor.cpp:72
+#: ../src/gui/widgets/ColourTable.cpp:51
+msgid "Name"
+msgstr "Nom"
+
+#: ../src/gui/dialogs/MakeOrnamentDialog.cpp:51
+msgid ""
+"The name is used to identify both the ornament\n"
+"and the triggered segment that stores\n"
+"the ornament's notes."
+msgstr ""
+"Le même nom est utilisé pour identifier à la fois\n"
+"l'ornement et le segment déclenché qui contient\n"
+"les notes de l'ornement."
+
+#: ../src/gui/dialogs/MakeOrnamentDialog.cpp:54
+msgid "Name: "
+msgstr "Nom: "
+
+#: ../src/gui/dialogs/MakeOrnamentDialog.cpp:57
+#: ../src/gui/editors/eventlist/EventView.cpp:717
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:92
+msgid "Base pitch"
+msgstr "Ton de base"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:57
+#: ../src/gui/editors/eventlist/EventView.cpp:140
+msgid "Text"
+msgstr "Texte"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:66
+msgid "Specification"
+msgstr "Spécification"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:68
+msgid "Preview"
+msgstr "Prévisualisation"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:72
+msgid "Text: "
+msgstr "Texte : "
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:79
+msgid "Style: "
+msgstr "Style : "
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:90
+msgid "Dynamic"
+msgstr "Dynamique"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:93
+msgid "Direction"
+msgstr "Direction"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:96
+msgid "Local Direction"
+msgstr "Direction locale"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:63
+#: ../src/gui/dialogs/TextEventDialog.cpp:99
+#: ../src/gui/editors/tempo/TempoView.cpp:91
+msgid "Tempo"
+msgstr "Tempo"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:102
+msgid "Local Tempo"
+msgstr "Tempo local"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:105
+msgid "Lyric"
+msgstr "Paroles"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:108
+#: ../src/gui/editors/notation/NotationView.cpp:4242
+msgid "Chord"
+msgstr "Accord"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:111
+msgid "Annotation"
+msgstr "Annotation"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:114
+msgid "LilyPond Directive"
+msgstr "Directive Lilypond"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:138
+msgid "Verse: "
+msgstr "Vers:"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:148
+msgid "Dynamic: "
+msgstr "Dynamique: "
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:152
+msgid "ppp"
+msgstr "ppp"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:153
+msgid "pp"
+msgstr "pp"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:154
+msgid "p"
+msgstr "p"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:155
+msgid "mp"
+msgstr "mp"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:156
+msgid "mf"
+msgstr "mf"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:157
+msgid "f"
+msgstr "f"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:158
+msgid "ff"
+msgstr "ff"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:159
+msgid "fff"
+msgstr "fff"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:160
+msgid "rfz"
+msgstr "rfz"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:161
+msgid "sf"
+msgstr "sf"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:165
+msgid "Direction: "
+msgstr "Direction: "
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:174
+msgid " ,"
+msgstr " ,"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:175
+msgid "D.C. al Fine"
+msgstr "D.C. al Fine"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:176
+msgid "D.S. al Fine"
+msgstr "D.S. al Fine"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:177
+msgid "Fine"
+msgstr "Fine"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:178
+msgid "D.S. al Coda"
+msgstr "D.S. al Coda"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:179
+msgid "to Coda"
+msgstr "alla Coda"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:180
+msgid "Coda"
+msgstr "Coda"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:184
+msgid "Local Direction: "
+msgstr "Direction locale: "
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:188
+msgid "accel."
+msgstr "accel."
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:189
+msgid "ritard."
+msgstr "ritard."
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:190
+msgid "ralletando"
+msgstr "ralletando"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:191
+msgid "a tempo"
+msgstr "a tempo"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:192
+msgid "legato"
+msgstr "legato"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:193
+msgid "simile"
+msgstr "simile"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:194
+msgid "pizz."
+msgstr "pizz."
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:195
+msgid "arco"
+msgstr "arco"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:196
+msgid "non vib."
+msgstr "non vib."
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:197
+msgid "sul pont."
+msgstr "sul pont."
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:198
+#: ../src/gui/dialogs/TextEventDialog.cpp:200
+msgid "sul tasto"
+msgstr "sul tasto"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:199
+msgid "con legno"
+msgstr "con legno"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:201
+msgid "sul G"
+msgstr "sul G"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:202
+msgid "ordinario"
+msgstr "ordinario"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:203
+msgid "Muta in "
+msgstr "Muta in "
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:204
+msgid "volti subito "
+msgstr "volti subito "
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:205
+msgid "soli"
+msgstr "soli"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:206
+msgid "div."
+msgstr "div."
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:210
+msgid "Tempo: "
+msgstr "Tempo: "
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:214
+#: ../src/gui/dialogs/TextEventDialog.cpp:238
+msgid "Grave"
+msgstr "Grave"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:215
+#: ../src/gui/dialogs/TextEventDialog.cpp:239
+msgid "Adagio"
+msgstr "Adagio"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:216
+#: ../src/gui/dialogs/TextEventDialog.cpp:240
+msgid "Largo"
+msgstr "Largo"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:217
+#: ../src/gui/dialogs/TextEventDialog.cpp:241
+msgid "Lento"
+msgstr "lento"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:218
+#: ../src/gui/dialogs/TextEventDialog.cpp:242
+msgid "Andante"
+msgstr "Andante"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:219
+#: ../src/gui/dialogs/TextEventDialog.cpp:243
+msgid "Moderato"
+msgstr "Moderato"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:220
+#: ../src/gui/dialogs/TextEventDialog.cpp:244
+msgid "Allegretto"
+msgstr "Allegretto"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:221
+#: ../src/gui/dialogs/TextEventDialog.cpp:245
+msgid "Allegro"
+msgstr "Allegro"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:222
+#: ../src/gui/dialogs/TextEventDialog.cpp:246
+msgid "Vivace"
+msgstr "Vivace"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:223
+#: ../src/gui/dialogs/TextEventDialog.cpp:247
+msgid "Presto"
+msgstr "Presto"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:224
+#: ../src/gui/dialogs/TextEventDialog.cpp:248
+msgid "Prestissimo"
+msgstr "Prestissimo"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:225
+#: ../src/gui/dialogs/TextEventDialog.cpp:249
+msgid "Maestoso"
+msgstr "Maestoso"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:226
+#: ../src/gui/dialogs/TextEventDialog.cpp:250
+msgid "Sostenuto"
+msgstr "Sostenuto"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:227
+#: ../src/gui/dialogs/TextEventDialog.cpp:251
+msgid "Tempo Primo"
+msgstr "Tempo Primo"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:234
+msgid "Local Tempo: "
+msgstr "Tempo local: "
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:255
+msgid "Directive: "
+msgstr "Directive: "
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:312
+msgid "Example"
+msgstr "Exemple"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:65
+msgid "Event Filter"
+msgstr "Filtre d'événement"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:86
+msgid "Note Events"
+msgstr "Evénements associés à des notes"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:90
+msgid "lowest:"
+msgstr "le plus bas:"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:93
+msgid "highest:"
+msgstr "le plus haut:"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:96
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:141
+#: ../src/gui/widgets/PitchChooser.cpp:53
+msgid "Pitch:"
+msgstr "Ton:"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:99
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:163
+msgid "Velocity:"
+msgstr "Vélocité:"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:102
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:129
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:257
+msgid "Duration:"
+msgstr "Durée:"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:107
+#: ../src/gui/dialogs/EventFilterDialog.cpp:114
+#: ../src/gui/dialogs/EventFilterDialog.cpp:121
+msgid "include"
+msgstr "inclure"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:108
+#: ../src/gui/dialogs/EventFilterDialog.cpp:115
+#: ../src/gui/dialogs/EventFilterDialog.cpp:122
+msgid "exclude"
+msgstr "exclure"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:136
+#: ../src/gui/dialogs/EventFilterDialog.cpp:155
+#: ../src/gui/editors/eventlist/EventView.cpp:172
+#: ../src/gui/editors/eventlist/EventView.cpp:179
+#: ../src/gui/editors/eventlist/EventView.cpp:186
+msgid "edit"
+msgstr "Éditer"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:141
+#: ../src/gui/dialogs/EventFilterDialog.cpp:157
+msgid "choose a pitch using a staff"
+msgstr "Choisir un ton en utilisant une portée"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:182
+#: ../src/gui/dialogs/EventFilterDialog.cpp:188
+msgid "longest"
+msgstr "plus long"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:200
+msgid "Include all"
+msgstr "tout inclure"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:203
+msgid "Include entire range of values"
+msgstr "Inclure plage entière de valeurs"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:206
+msgid "Exclude all"
+msgstr "Tout exclure"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:209
+msgid "Exclude entire range of values"
+msgstr "Exclure plage entière de valeurs"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:233
+#: ../src/gui/dialogs/EventFilterDialog.cpp:234
+msgid "shortest"
+msgstr "plus court"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:333
+msgid "Lowest pitch"
+msgstr "Plus faible hauteur"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:343
+msgid "Highest pitch"
+msgstr "Plus grande hauteur"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:56
+#: ../src/gui/editors/notation/NotationView.cpp:1619
+#: ../src/gui/editors/notation/NotationView.cpp:6088
+msgid "Use Ornament"
+msgstr "Utiliser un ornement"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:260
+#: ../src/gui/configuration/NotationConfigurationPage.h:64
+#: ../src/gui/configuration/NotationConfigurationPage.h:65
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:63
+msgid "Notation"
+msgstr "la partition"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:68
+msgid "Display as: "
+msgstr "Afficher en tant que: "
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:84
+msgid "Trill"
+msgstr "Trille"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:84
+msgid "Trill with line"
+msgstr "Trille avec ligne"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:84
+msgid "Trill line only"
+msgstr "Trait de trille seulement"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:85
+msgid "Turn"
+msgstr "Tourner"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:85
+msgid "Mordent"
+msgstr "Mordant"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:85
+msgid "Inverted mordent"
+msgstr "Mordant inversé"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:86
+msgid "Long mordent"
+msgstr "Long mordant"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:86
+msgid "Long inverted mordent"
+msgstr "Long mordant inversé"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:94
+msgid "Text mark"
+msgstr "Marque de texte"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:98
+msgid " Text: "
+msgstr " Texte: "
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:104
+msgid "Performance"
+msgstr "Performance"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:109
+msgid "Perform using triggered segment: "
+msgstr "Exécuter en utilisant un segment déclenché: "
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:75
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:123
+msgid "Perform with timing: "
+msgstr "Jouer avec le nouveau timing: "
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:81
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:129
+msgid "As stored"
+msgstr "Comme stocké"
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:82
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:130
+msgid "Truncate if longer than note"
+msgstr "Tronquer si plus long que la note"
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:83
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:131
+msgid "End at same time as note"
+msgstr "Finir en même temps que la note"
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:84
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:132
+msgid "Stretch or squash segment to note duration"
+msgstr "Etirer ou comprimer le segment à la durée de la note"
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:86
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:134
+msgid "Adjust pitch to note"
+msgstr "Ajuster le ton à la note"
+
+#: ../src/gui/dialogs/PitchPickerDialog.cpp:40
+msgid "Pitch Selector"
+msgstr "Sélecteur de ton"
+
+#: ../src/gui/dialogs/BeatsBarsDialog.cpp:44
+msgid "Audio Segment Duration"
+msgstr "Durée du segment audio"
+
+#: ../src/gui/dialogs/BeatsBarsDialog.cpp:50
+msgid "The selected audio segment contains:"
+msgstr "Le segment audio sélectionné contient:"
+
+#: ../src/gui/dialogs/BeatsBarsDialog.cpp:59
+msgid "beat(s)"
+msgstr "Pulsation(s)"
+
+#: ../src/gui/dialogs/BeatsBarsDialog.cpp:60
+msgid "bar(s)"
+msgstr "mesure(s)"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:51
+msgid "Tuplet"
+msgstr "N-olet"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:58
+msgid "New timing for tuplet group"
+msgstr "Nouvelle durée pour N-olet"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:76
+msgid "Play "
+msgstr "Jouer "
+
+#: ../src/gui/dialogs/TupletDialog.cpp:98
+msgid "in the time of "
+msgstr "dans le temps de "
+
+#: ../src/gui/dialogs/TupletDialog.cpp:104
+msgid "Timing is already correct: update display only"
+msgstr "Le timing est déjà correct : mise à jour de l'affichage uniquement"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:114
+msgid "Timing calculations"
+msgstr "Calculs de Timing"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:120
+msgid "Selected region:"
+msgstr "Région sélectionnée :"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:129
+msgid "Group with current timing:"
+msgstr "Grouper avec timing actuel :"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:135
+msgid "Group with new timing:"
+msgstr "Grouper avec nouveau timing :"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:141
+msgid "Gap created by timing change:"
+msgstr "Trou créé par le changement de temps :"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:149
+msgid "Unchanged at end of selection:"
+msgstr "Non changé à la fin de la sélection :"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:63 rc.cpp:372
+#, no-c-format
+msgid "Metronome"
+msgstr "Métronome"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:77
+msgid "Metronome Instrument"
+msgstr "Définir l'instrument"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:82
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:150
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:183
+#: ../src/gui/studio/DeviceEditorDialog.cpp:73
+#: ../src/gui/studio/DeviceManagerDialog.cpp:105
+#: ../src/gui/studio/DeviceManagerDialog.cpp:163
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:66
+msgid "Device"
+msgstr "Périphérique"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:101
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:89
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:215
+#: ../src/gui/studio/DeviceEditorDialog.cpp:195
+#: ../src/gui/studio/DeviceEditorDialog.cpp:218
+#: ../src/gui/studio/DeviceEditorDialog.cpp:230
+#: ../src/gui/studio/DeviceManagerDialog.cpp:196
+#: ../src/gui/studio/DeviceManagerDialog.cpp:440
+#: ../src/gui/studio/DeviceManagerDialog.cpp:452
+msgid "No connection"
+msgstr "Pas de connexion"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:112
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:111
+#: ../src/gui/editors/parameters/InstrumentParameterBox.cpp:53
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:1209
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:159
+#: ../src/gui/general/PresetHandlerDialog.cpp:92
+#: ../src/gui/studio/MidiMixerWindow.cpp:204
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:67
+msgid "Instrument"
+msgstr "Instrument"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:118
+msgid "Beats"
+msgstr "Pulsation"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:184
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:123
+msgid "Resolution"
+msgstr "Résolution"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:309
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:139
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:205
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:125
+#: ../src/gui/editors/matrix/MatrixView.cpp:2132
+#: ../src/gui/editors/notation/NotationView.cpp:1582
+#: ../src/gui/widgets/QuantizeParameters.cpp:128
+#: ../src/gui/widgets/QuantizeParameters.cpp:301
+msgid "None"
+msgstr "Aucun"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:126
+msgid "Bars only"
+msgstr "Mesures seulement"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:127
+msgid "Bars and beats"
+msgstr "Mesures et temps"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:128
+msgid "Bars, beats, and divisions"
+msgstr "Mesures, temps et subdivisions"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:132
+msgid "Bar velocity"
+msgstr "Vélocité de la mesure"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:139
+msgid "Beat velocity"
+msgstr "Vélocité des temps"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:146
+msgid "Sub-beat velocity"
+msgstr "Vélocité des subdivisions"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:155
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:324
+msgid "Pitch"
+msgstr "Tessiture"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:160
+msgid "for Bar"
+msgstr "Pour les mesures"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:161
+msgid "for Beat"
+msgstr "pour les temps"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:162
+msgid "for Sub-beat"
+msgstr "pour les subdivisions"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:166
+msgid "Metronome Activated"
+msgstr "Métronome activé"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:167
+msgid "Playing"
+msgstr "Exécution"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:168
+msgid "Recording"
+msgstr "Enregistrement"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:46
+msgid "Choose Text Encoding"
+msgstr "Choisir le codage du texte"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:50
+msgid ""
+"\n"
+"This file contains text in an unknown language encoding.\n"
+"\n"
+"Please select one of the following estimated text encodings\n"
+"for use with the text in this file:\n"
+msgstr ""
+"\n"
+"Ce fichier contient du texte dont le codage est inconnu.\n"
+"\n"
+"Veuillez choisir l'un des codages proposés ci-après\n"
+"pour traiter ce fichier:\n"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:61
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:77
+msgid "Japanese Shift-JIS"
+msgstr "japonais (Shift-JIS)"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:62
+msgid "Unicode variable-width"
+msgstr "Unicode à largeur variable"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:63
+msgid "Western Europe"
+msgstr "Europe de l'Ouest"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:64
+msgid "Western Europe + Euro"
+msgstr "Europe de l'Ouest + Euro"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:65
+msgid "Eastern Europe"
+msgstr "Europe de l'Est"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:66
+msgid "Southern Europe"
+msgstr "Europe du Sud"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:67
+msgid "Northern Europe"
+msgstr "Europe du Nord"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:68
+msgid "Cyrillic"
+msgstr "Cyrillique"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:69
+msgid "Arabic"
+msgstr "Arabe"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:70
+msgid "Greek"
+msgstr "Grec"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:71
+msgid "Hebrew"
+msgstr "Hébreux"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:72
+msgid "Turkish"
+msgstr "Turc"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:73
+msgid "Nordic"
+msgstr "Scandinave"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:74
+msgid "Thai"
+msgstr "Thaï"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:75
+msgid "Baltic"
+msgstr "Balte"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:76
+msgid "Celtic"
+msgstr "Celte"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:78
+msgid "Traditional Chinese"
+msgstr "Chinois traditionnel"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:79
+msgid "Simplified Chinese"
+msgstr "Chinois simplifié"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:80
+msgid "Russian"
+msgstr "Russe"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:81
+msgid "Ukrainian"
+msgstr "Ukrainien"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:82
+msgid "Tamil"
+msgstr "Tamil"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:117
+#, c-format
+msgid "Microsoft Code Page %1"
+msgstr "Code Microsoft page %1"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:123
+#: ../src/gui/editors/matrix/MatrixView.cpp:1490
+msgid "%1 (%2)"
+msgstr "%1 (%2)"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:142
+msgid ""
+"\n"
+"Example text from file:"
+msgstr ""
+"\n"
+"Texte d'exemple depuis le fichier:"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:59
+#: ../src/gui/editors/tempo/TempoView.cpp:92
+msgid "Time Signature"
+msgstr "Chiffrage de la mesure"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:82
+msgid "Time signature"
+msgstr "Chiffrage de la mesure"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:116
+msgid "Time where signature takes effect"
+msgstr "Temps où le chiffrage prend effet"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:83
+#: ../src/gui/dialogs/TempoDialog.cpp:128
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:129
+#: ../src/gui/general/PresetHandlerDialog.cpp:101
+msgid "Scope"
+msgstr "Portée"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:141
+#, c-format
+msgid "Insertion point is at start of measure %1."
+msgstr "Le point d'insertion est au début de la mesure %1."
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:145
+#, c-format
+msgid "Insertion point is in the middle of measure %1."
+msgstr "Le point d'insertion est au milieu de la mesure %1."
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:150
+msgid "Insertion point is at start of composition."
+msgstr "Le point d'insertion se situe au début de la composition."
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:155
+msgid "Start measure %1 here"
+msgstr "Changer à partir du début de la mesure %1"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:159
+#, c-format
+msgid "Change time from start of measure %1"
+msgstr "Changer à partir du début de la mesure %1"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:166
+#, c-format
+msgid "Time change will take effect at the start of measure %1."
+msgstr "Le changement de temps prendra effet au début de la mesure %1."
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:176
+msgid "Hide the time signature"
+msgstr "Cacher le chiffrage de la mesure"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:181
+msgid "Hide the affected bar lines"
+msgstr "Cacher les barres des mesures concernées"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:186
+msgid "Show as common time"
+msgstr "Afficher comme temps commun"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:191
+msgid "Correct the durations of following measures"
+msgstr "Corriger la durée des mesures suivantes"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:280
+msgid "Display as common time"
+msgstr "Afficher comme temps commun"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:284
+msgid "Display as cut common time"
+msgstr "Afficher comme temps commun barré"
+
+#: ../src/gui/dialogs/ConfigureDialog.cpp:66
+msgid "Configure Rosegarden"
+msgstr "Configurer Rosegarden"
+
+#: ../src/gui/dialogs/MarkerModifyDialog.cpp:53
+#: ../src/gui/dialogs/MarkerModifyDialog.cpp:61
+msgid "Edit Marker"
+msgstr "Éditer un marqueur"
+
+#: ../src/gui/dialogs/MarkerModifyDialog.cpp:78
+msgid "Marker Time"
+msgstr "Temps du marqueur"
+
+#: ../src/gui/dialogs/MarkerModifyDialog.cpp:94
+msgid "Marker Properties"
+msgstr "Propriétés du marqueur"
+
+#: ../src/gui/dialogs/MarkerModifyDialog.cpp:100
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:554
+msgid "Text:"
+msgstr "Texte:"
+
+#: ../src/gui/dialogs/MarkerModifyDialog.cpp:104
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:85
+msgid "Description:"
+msgstr "Description :"
+
+#: ../src/gui/dialogs/FileMergeDialog.cpp:46
+msgid "Merge File"
+msgstr "Fusionner le fichier"
+
+#: ../src/gui/dialogs/FileMergeDialog.cpp:53
+msgid "Merge new file "
+msgstr "Fusionner un nouveau fichier"
+
+#: ../src/gui/dialogs/FileMergeDialog.cpp:56
+msgid "At start of existing composition"
+msgstr "Au début de la composition existante"
+
+#: ../src/gui/dialogs/FileMergeDialog.cpp:57
+msgid "From end of existing composition"
+msgstr "Depuis la fin de la composition"
+
+#: ../src/gui/dialogs/FileMergeDialog.cpp:61
+msgid "The file has different time signatures or tempos."
+msgstr "Le fichier a des chiffrages de mesures ou tempos différents."
+
+#: ../src/gui/dialogs/FileMergeDialog.cpp:62
+msgid "Import these as well"
+msgstr "Importer également ceux-ci"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:171
+#: ../src/gui/dialogs/ShowSequencerStatusDialog.cpp:44
+msgid "Sequencer status"
+msgstr "Statut du séquenceur"
+
+#: ../src/gui/dialogs/ShowSequencerStatusDialog.cpp:48
+msgid "Sequencer status:"
+msgstr "Statut du séquenceur:"
+
+#: ../src/gui/dialogs/ShowSequencerStatusDialog.cpp:50
+msgid "Status not available."
+msgstr "Statut indisponible."
+
+#: ../src/gui/dialogs/ShowSequencerStatusDialog.cpp:57
+msgid "Sequencer is not running or is not responding."
+msgstr "Le Séquenceur n'est pas lancé ou ne répond pas."
+
+#: ../src/gui/dialogs/ShowSequencerStatusDialog.cpp:64
+msgid "Sequencer is not returning a valid status report."
+msgstr "Le Séquenceur ne retourne pas un statut valide."
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:46
+msgid "Add Tracks"
+msgstr "Ajouter &Pistes"
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:54
+msgid "How many tracks do you want to add?"
+msgstr "Combien de pistes désirez-vous ajouter?"
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:62
+msgid "Add tracks"
+msgstr "Ajouter pistes"
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:64
+msgid "At the top"
+msgstr "En haut"
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:65
+msgid "Above the current selected track"
+msgstr "Au dessus de la piste actuellement sélectionnée"
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:66
+msgid "Below the current selected track"
+msgstr "Au dessous de la piste actuellement sélectionnée"
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:67
+msgid "At the bottom"
+msgstr "En bas"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:75
+msgid "Event Properties"
+msgstr "Propriétés de l'événement"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:81
+msgid "Event type:"
+msgstr "Type d'événement:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:117
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:251
+#: ../src/gui/editors/segment/MarkerEditor.cpp:97
+msgid "Absolute time:"
+msgstr "Temps absolu:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:156
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:323
+msgid "Controller name:"
+msgstr "Nom du contrôleur:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:157
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:530
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:562
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:563
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:602
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:631
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:267
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:269
+#: ../src/gui/editors/segment/MarkerEditor.cpp:279
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:272
+#: ../src/gui/studio/AudioMixerWindow.cpp:388
+#: ../src/gui/studio/AudioMixerWindow.cpp:519
+#: ../src/gui/studio/AudioMixerWindow.cpp:683
+#: ../src/gui/studio/AudioMixerWindow.cpp:722
+#: ../src/gui/studio/AudioMixerWindow.cpp:904
+#: ../src/gui/studio/SynthPluginManagerDialog.cpp:121
+msgid "<none>"
+msgstr "<Aucun>"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:174
+msgid "Meta string:"
+msgstr "Chaîne méta:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:179
+msgid "Load data"
+msgstr "Charger donnée"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:181
+msgid "Save data"
+msgstr "Enregistrer les données"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:192
+msgid "Notation Properties"
+msgstr "Paramètres de l'édition de partition"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:198
+msgid "Lock to changes in performed values"
+msgstr "Identiques aux paramètres d'exécution"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:205
+msgid "Notation time:"
+msgstr "Temps partition:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:217
+msgid "Notation duration:"
+msgstr "Durée partition:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:283
+msgid "Note pitch:"
+msgstr "Hauteur tonale de la note:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:291
+msgid "Note velocity:"
+msgstr "Vélocité:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:317
+msgid "Controller number:"
+msgstr "Numéro du contrôleur:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:326
+msgid "Controller value:"
+msgstr "Valeur du contrôleur:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:354
+msgid "Key pitch:"
+msgstr "Hauteur tonale de la clef:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:362
+msgid "Key pressure:"
+msgstr "Pression de touche:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:390
+msgid "Channel pressure:"
+msgstr "Pression canaux:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:418
+msgid "Program change:"
+msgstr "Changement de programme:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:461
+msgid "Data length:"
+msgstr "Longueur des données:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:462
+msgid "Data:"
+msgstr "Données:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:480
+msgid "Pitchbend MSB:"
+msgstr "Modification de la hauteur MSB:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:488
+msgid "Pitchbend LSB:"
+msgstr "Modification de la hauteur LSB:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:523
+msgid "Indication:"
+msgstr "Indication:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:553
+msgid "Text type:"
+msgstr "Type de texte:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:596
+msgid "Clef type:"
+msgstr "Type de clef:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:625
+msgid "Key name:"
+msgstr "Nom de la clef:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:674
+msgid "Unsupported event type:"
+msgstr "Type d'événement non supporté:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:931
+msgid "Edit Event Time"
+msgstr "Éditer l'événement"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:943
+msgid "Edit Event Notation Time"
+msgstr "Éditer l'événement"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:955
+msgid "Edit Duration"
+msgstr "Définir la durée"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:968
+msgid "Edit Notation Duration"
+msgstr "Définir la durée (partition)"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:981
+msgid "Edit Pitch"
+msgstr "Éditer le ton"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:991
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:1016
+msgid "*.syx|System exclusive files (*.syx)"
+msgstr "*.syx|System exclusive files (*.syx)"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:992
+msgid "Load System Exclusive data in File"
+msgstr "Chargement des données système exclusives du fichier"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:1017
+msgid "Save System Exclusive data to..."
+msgstr "Sauver les données système exclusives vers..."
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:46
+msgid "Locate audio file"
+msgstr "Localiser un fichier audio"
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:50
+msgid "&Skip"
+msgstr "&Sauter"
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:51
+msgid "Skip &All"
+msgstr "Sauter &tout"
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:52
+msgid "&Locate"
+msgstr "&Localiser"
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:57
+msgid ""
+"Can't find file \"%1\".\n"
+"Would you like to try and locate this file or skip it?"
+msgstr ""
+"Ne trouve pas \"%1\".\n"
+"Voulez-vous essayer de localiser ce fichier?"
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:71
+msgid ""
+"%1|Requested file (%2)\n"
+"*.wav|WAV files (*.wav)"
+msgstr ""
+"%1|Fihier demandé (%2)\n"
+"*.wav|fichiers WAV (*.wav)"
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:74
+msgid "Select an Audio File"
+msgstr "Choisir un fichier Audio"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:53 ../src/gui/dialogs/ClefDialog.cpp:62
+#: ../src/gui/dialogs/ClefDialog.cpp:79 ../src/gui/dialogs/ClefDialog.cpp:90
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:278
+msgid "Clef"
+msgstr "Clef"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:65
+msgid "Existing notes following clef change"
+msgstr "Les notes existantes suivent le changement de clef"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:71
+msgid "Lower clef"
+msgstr "Clef inférieure"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:77
+msgid "Up an Octave"
+msgstr "Octave supérieure"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:84
+msgid "Down an Octave"
+msgstr "Octave inférieure"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:88
+msgid "Higher clef"
+msgstr "Clef supérieure"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:96
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:152
+msgid "Maintain current pitches"
+msgstr "Maintenir le ton courant"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:99
+msgid "Transpose into appropriate octave"
+msgstr "Transposer dans l'octave appropriée"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:231
+msgid "%1 down an octave"
+msgstr "%1 une octave plus bas"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:234
+msgid "%1 down two octaves"
+msgstr "%1 deux octaves plus bas"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:237
+msgid "%1 up an octave"
+msgstr "%1 une octave plus haut"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:240
+msgid "%1 up two octaves"
+msgstr "%1 deux octaves plus haut"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:249
+msgid "Treble"
+msgstr "Sol"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:251
+msgid "French violin"
+msgstr "Sol 1ère"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:253
+msgid "Soprano"
+msgstr "Ut 1ère"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:255
+msgid "Mezzo-soprano"
+msgstr "Ut 2ème"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:257
+msgid "Alto"
+msgstr "Ut 3ème"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:259
+msgid "Tenor"
+msgstr "Ut 4ème"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:261
+msgid "C-baritone"
+msgstr "Ut 5ème"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:263
+msgid "F-baritone"
+msgstr "Fa 3ème"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:265
+msgid "Bass"
+msgstr "Fa"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:267
+msgid "Sub-bass"
+msgstr "Fa 5ème"
+
+#: ../src/gui/dialogs/CountdownDialog.cpp:52
+msgid "Recording..."
+msgstr "&Enregistrement..."
+
+#: ../src/gui/dialogs/CountdownDialog.cpp:60
+msgid "Recording time remaining: "
+msgstr "Temps d'enregistrement restant: "
+
+#: ../src/gui/dialogs/CountdownDialog.cpp:120
+msgid "Just how big is your hard disk?"
+msgstr "De quelle taille est votre disque dur ?"
+
+#: ../src/gui/dialogs/CountdownDialog.cpp:154
+msgid "Recording beyond end of composition: "
+msgstr "Enregistrement au delà de la fin de la composition: "
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:52
+msgid "Specify Interval"
+msgstr "Spécifier l'intervalle"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:58
+msgid "Reference note:"
+msgstr "Note initiale :"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:59
+msgid "Target note:"
+msgstr "Note finale :"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:68
+#: ../src/gui/dialogs/IntervalDialog.cpp:315
+msgid "a perfect unison"
+msgstr "unisson"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:76
+msgid "Effect on Key"
+msgstr "Interaction avec l'armature"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:77
+msgid "Transpose within key"
+msgstr "Transposer en conservant l'armature"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:79
+msgid "Change key for selection"
+msgstr "Modifier l'armature"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:89
+msgid ""
+"Adjust segment transposition in opposite direction (maintain audible pitch)"
+msgstr ""
+"Ajuster en sens inverse la transposition du segment (conserver la hauteur "
+"des notes entendues)"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:190
+#: ../src/gui/dialogs/IntervalDialog.cpp:220
+msgid "a diminished"
+msgstr "diminuée"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:192
+#: ../src/gui/dialogs/IntervalDialog.cpp:222
+msgid "an augmented"
+msgstr "augmentée"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:194
+#: ../src/gui/dialogs/IntervalDialog.cpp:224
+msgid "a doubly diminished"
+msgstr "deux fois diminuée"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:196
+#: ../src/gui/dialogs/IntervalDialog.cpp:226
+msgid "a doubly augmented"
+msgstr "deux fois augmentée"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:198
+#: ../src/gui/dialogs/IntervalDialog.cpp:228
+msgid "a triply diminished"
+msgstr "trois fois diminuée"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:200
+#: ../src/gui/dialogs/IntervalDialog.cpp:230
+msgid "a triply augmented"
+msgstr "trois fois augmentée"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:202
+msgid "a quadruply diminished"
+msgstr "quatre fois diminuée"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:204
+#: ../src/gui/dialogs/IntervalDialog.cpp:232
+msgid "a quadruply augmented"
+msgstr "quatre fois augmentée"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:206
+#: ../src/gui/dialogs/IntervalDialog.cpp:234
+msgid "a perfect"
+msgstr "parfaite"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:208
+#: ../src/gui/dialogs/IntervalDialog.cpp:236
+msgid "an (unknown, %1)"
+msgstr "un (inconnu, %1)"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:216
+msgid "a minor"
+msgstr "mineure"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:218
+msgid "a major"
+msgstr "majeure"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:239
+msgid "an (unknown)"
+msgstr "(inconnu)"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:248
+#: ../src/gui/dialogs/IntervalDialog.cpp:251
+msgid "%1 octave"
+msgstr "octave %1"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:254
+msgid "%1 unison"
+msgstr "unisson %1"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:258
+msgid "%1 second"
+msgstr "une seconde %1"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:261
+msgid "%1 third"
+msgstr "une tierce %1"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:264
+msgid "%1 fourth"
+msgstr "une quarte %1"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:267
+msgid "%1 fifth"
+msgstr "une quinte %1"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:270
+msgid "%1 sixth"
+msgstr "une sixte %1"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:273
+msgid "%1 seventh"
+msgstr "une septième %1"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:276
+#: ../src/gui/studio/DeviceManagerDialog.cpp:329
+#: ../src/gui/studio/DeviceManagerDialog.cpp:363
+#, c-format
+msgid "%1"
+msgstr "%1"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:287
+msgid ""
+"_n: up 1 octave and %1\n"
+"up %n octaves and %1"
+msgstr ""
+"1 octave vers le haut et %1\n"
+" %n octaves vers le haut et %1"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:291
+#, c-format
+msgid ""
+"_n: up 1 octave\n"
+"up %n octaves"
+msgstr ""
+"1 octave vers le haut\n"
+"%n octaves vers le haut"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:295
+#, c-format
+msgid "up %1"
+msgstr "%1 vers le haut"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:303
+msgid ""
+"_n: down 1 octave and %1\n"
+"down %n octaves and %1"
+msgstr ""
+"1 octave vers le bas et %1\n"
+"%n octaves vers le bas et %1"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:307
+#, c-format
+msgid ""
+"_n: down 1 octave\n"
+"down %n octaves"
+msgstr ""
+"1 octave vers le bas\n"
+"%n octaves vers le bas"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:311
+#, c-format
+msgid "down %1"
+msgstr "%1 vers le bas"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:81
+msgid "Intrinsics"
+msgstr "Eléments intrinsèques"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:85
+msgid "Event type: "
+msgstr "Type d'événement : "
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:91
+msgid "Absolute time: "
+msgstr "Temps Absolu : "
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:101
+msgid "Duration: "
+msgstr "Durée : "
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:114
+msgid "Sub-ordering: "
+msgstr "Sous-ordonnancement"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:125
+msgid "Persistent properties"
+msgstr "Propriétés persistantes"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:169
+#: ../src/gui/dialogs/EventEditDialog.cpp:133
+#: ../src/gui/studio/BankEditorDialog.cpp:129
+#: ../src/gui/studio/DeviceEditorDialog.cpp:75
+msgid "Type"
+msgstr "Type"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:184
+#: ../src/gui/dialogs/EventEditDialog.cpp:135
+#: ../src/gui/dialogs/EventParameterDialog.cpp:89
+#: ../src/gui/dialogs/EventParameterDialog.cpp:93
+#: ../src/gui/dialogs/EventParameterDialog.cpp:115
+msgid "Value"
+msgstr "Valeur"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:155
+msgid "Non-persistent properties"
+msgstr "Propriétés non persistantes"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:156
+msgid "These are cached values, lost if the event is modified."
+msgstr ""
+"Ce sont des valeurs misent en cache, celles-ci seront perdues si l'événement "
+"est modifié."
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:170
+msgid "Name "
+msgstr "Nom "
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:172
+msgid "Type "
+msgstr "Type "
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:174
+msgid "Value "
+msgstr "Valeur "
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:188
+msgid "Make persistent"
+msgstr "Rendre persistant"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:292
+msgid "Delete this property"
+msgstr "Effacer cette propriété"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:433
+msgid ""
+"Are you sure you want to delete the \"%1\" property?\n"
+"\n"
+"Removing necessary properties may cause unexpected behavior."
+msgstr ""
+"Êtes-vous sûr(e) de vouloir effacer la propriété \"%1\"?\n"
+"\n"
+"Enlever des propriétés nécessaires peut créer des problèmes inattendus."
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:436
+#: ../src/gui/dialogs/EventEditDialog.cpp:469
+msgid "Edit Event"
+msgstr "Éditer Événement"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:465
+msgid ""
+"Are you sure you want to make the \"%1\" property persistent?\n"
+"\n"
+"This could cause problems if it overrides a different computed value later "
+"on."
+msgstr ""
+"Êtes-vous sûr(e) de vouloir rendre la propriété \"%1\" persistante?\n"
+"\n"
+"Cela peut causer des problèmes si elle écrase une valeur différente par la "
+"suite."
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:470
+msgid "Make &Persistent"
+msgstr "Rendre &persistant"
+
+#: ../src/gui/dialogs/PasteNotationDialog.cpp:52
+msgid "Paste type"
+msgstr "Type de collage"
+
+#: ../src/gui/dialogs/PasteNotationDialog.cpp:72
+msgid "Make this the default paste type"
+msgstr "En faire le type de collage par défaut"
+
+#: ../src/gui/dialogs/LyricEditDialog.cpp:53
+msgid "Edit Lyrics"
+msgstr "Éditer les paroles"
+
+#: ../src/gui/dialogs/LyricEditDialog.cpp:62
+msgid "Lyrics for this segment"
+msgstr "Paroles pour ce segment"
+
+#: ../src/gui/dialogs/LyricEditDialog.cpp:70
+msgid "Add Verse"
+msgstr "Ajouter un vers"
+
+#: ../src/gui/dialogs/LyricEditDialog.cpp:84
+#: ../src/gui/dialogs/LyricEditDialog.cpp:106
+#, c-format
+msgid "Verse %1"
+msgstr "Vers %1"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:59
+msgid "Import from Device..."
+msgstr "Importer depuis le périphérique..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2163
+#: ../src/gui/application/RosegardenGUIApp.cpp:2229
+#: ../src/gui/application/RosegardenGUIApp.cpp:7780
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:87
+#: ../src/sound/AudioFileManager.cpp:664
+#, c-format
+msgid "Cannot download file %1"
+msgstr "Impossible de charger le fichier %1"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:99
+#, c-format
+msgid "Cannot open file %1"
+msgstr "Impossible d'ouvrir le fichier %1"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:106
+#, c-format
+msgid "No devices found in file %1"
+msgstr "Aucun périphérique trouvé dans le fichier %1"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:113
+msgid "Source device"
+msgstr "Périphérique source"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:118
+msgid "Import from: "
+msgstr "Importer depuis: "
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:140
+#: ../src/gui/studio/DeviceEditorDialog.cpp:148
+#, c-format
+msgid "Device %1"
+msgstr "Périphérique %1"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:155
+msgid "Import banks"
+msgstr "Importer les banques"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:156
+msgid "Import key mappings"
+msgstr "Importer des listes de percussions"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:157
+msgid "Import controllers"
+msgstr "Importer les contrôleurs"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:160
+msgid "Import device name"
+msgstr "Importer le nom du périphérique"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:166
+msgid "Bank import behavior"
+msgstr "Comportement de l'importation des banques"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:168
+msgid "Merge banks"
+msgstr "Fusionner les banques"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:169
+msgid "Overwrite banks"
+msgstr "Écraser les banques"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:367
+msgid "Bank %1:%2"
+msgstr "Banque %1:%2"
+
+#: ../src/commands/segment/SegmentSplitByRecordingSrcCommand.cpp:42
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:48
+msgid "Split by Recording Source"
+msgstr "Séparer par source d'entrée"
+
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:53
+msgid "Recording Source"
+msgstr "Source d'enregistrement"
+
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:57
+msgid "Channel:"
+msgstr "Canal:"
+
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:64
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:75
+msgid "any"
+msgstr "quelconque"
+
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:69
+msgid "Device:"
+msgstr "Périphérique:"
+
+#: ../src/gui/dialogs/UnusedAudioSelectionDialog.cpp:46
+msgid "Select Unused Audio Files"
+msgstr "Selectionner des fichiers Audio inutilisés"
+
+#: ../src/gui/dialogs/UnusedAudioSelectionDialog.cpp:53
+#: ../src/gui/editors/segment/PlayListView.cpp:36
+msgid "File name"
+msgstr "Nom de fichier"
+
+#: ../src/gui/dialogs/UnusedAudioSelectionDialog.cpp:54
+msgid "File size"
+msgstr "Taille du fichier"
+
+#: ../src/gui/dialogs/UnusedAudioSelectionDialog.cpp:55
+msgid "Last modified date"
+msgstr "Date de dernière modification"
+
+#: ../src/gui/dialogs/UnusedAudioSelectionDialog.cpp:60
+msgid " (not found) "
+msgstr " (non trouvé) "
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:105
+msgid "Audio File Manager"
+msgstr "Gestionnaire des fichiers Audio"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:126
+msgid ""
+"* Some audio files are encoded at a sample rate different from that of the "
+"JACK audio server.\n"
+"Rosegarden will play them at the correct speed, but they will sound "
+"terrible.\n"
+"Please consider resampling such files externally, or adjusting the sample "
+"rate of the JACK server."
+msgstr ""
+"* Certains fichiers audio utilisent une fréquence d'échantillonnage "
+"différente de celle du serveur audio JACK.\n"
+"Rosegarden va les jouer à la vitesse correcte, mais cela donnera un mauvais "
+"résultat.\n"
+"Veuillez envisager de rééchantilonner ces fichiers en utilisant un logiciel "
+"approprié, ou de modifier la fréquence d'échantillonnage du serveur JACK."
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:132
+msgid "&Add Audio File..."
+msgstr "&Ajouter un fichier Audio..."
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:135
+msgid "&Unload Audio File"
+msgstr "&Fermer le fichier Audio"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:140
+msgid "&Play Preview"
+msgstr "&Jouer la préversion"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:151
+msgid "&Insert into Selected Audio Track"
+msgstr "&Insérer dans la piste audio sélectionnée"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:155
+msgid "Unload &all Audio Files"
+msgstr "Fermer &tous les fichiers audio"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:159
+msgid "Unload all &Unused Audio Files"
+msgstr "&Décharger les fichiers audio inutilisés"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:163
+msgid "&Delete Unused Audio Files..."
+msgstr "&Effacer les fichiers audio inutilisés..."
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:167
+msgid "&Export Audio File..."
+msgstr "&Exporter un fichier audio..."
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:173
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:180
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:91
+msgid "Duration"
+msgstr "Durée"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:181
+msgid "Envelope"
+msgstr "Enveloppe"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:182
+msgid "Sample rate"
+msgstr "Fréquence d'échantillonage"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:183
+msgid "Channels"
+msgstr "Canaux"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:282
+msgid "<no audio files>"
+msgstr "<Aucun fichier audio>"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:488
+msgid "*.wav|WAV files (*.wav)"
+msgstr "*.wav|Fichiers WAV (*.wav)"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:489
+msgid "Choose a name to save this file as"
+msgstr "Choisir un nom pour le fichier"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:499
+msgid "Exporting audio file..."
+msgstr "Exportation d'un fichier audio..."
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:609
+msgid ""
+"This will unload audio file \"%1\" and remove all associated segments. Are "
+"you sure?"
+msgstr ""
+"Confirmez-vous la fermeture du fichier audio « %1 », ainsi que de tous les "
+"segments associés ?"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:692
+msgid ""
+"*.wav|WAV files (*.wav)\n"
+"*.*|All files"
+msgstr ""
+"*.wav|Fichiers WAV (*.wav)\n"
+"*.*|Tous les fichiers"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:697
+msgid ""
+"*.wav *.flac *.ogg *.mp3|Audio files (*.wav *.flac *.ogg *.mp3)\n"
+"*.wav|WAV files (*.wav)\n"
+"*.flac|FLAC files (*.flac)\n"
+"*.ogg|Ogg files (*.ogg)\n"
+"*.mp3|MP3 files (*.mp3)\n"
+"*.*|All files"
+msgstr ""
+"*.wav *.flac *.ogg *.mp3|Fichiers audio (*.wav *.flac *.ogg *.mp3)\n"
+"*.wav|Fichiers WAV (*.wav)\n"
+"*.flac|Fichiers FLAC (*.flac)\n"
+"*.ogg|Fichiers Ogg (*.ogg)\n"
+"*.mp3|Fichiers MP3 (*.mp3)\n"
+"*.*|Tous les fichiers"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:704
+msgid "Select one or more audio files"
+msgstr "Sélectionner un ou plusieurs fichier(s) audio"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:763
+msgid ""
+"This will unload all audio files and remove their associated segments.\n"
+"This action cannot be undone, and associations with these files will be "
+"lost.\n"
+"Files will not be removed from your disk.\n"
+"Are you sure?"
+msgstr ""
+"Tous les fichiers audio vont être déchargés et les segments associés "
+"supprimés.\n"
+"Cette action ne pourra pas être annulée et les associations avec ces "
+"fichiers seront perdues.\n"
+"Les fichiers ne seront pas effacés du disque.\n"
+"Voulez vous vraiment continuer?"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:800
+msgid ""
+"This will unload all audio files that are not associated with any segments "
+"in this composition.\n"
+"This action cannot be undone, and associations with these files will be "
+"lost.\n"
+"Files will not be removed from your disk.\n"
+"Are you sure?"
+msgstr ""
+"Tous les fichiers audio qui ne sont associés à aucun segment dans cette "
+"composition vont être déchargés.\n"
+"Cette action ne pourra pas être annulée et les associations avec ces "
+"fichiers seront perdues.\n"
+"Les fichiers ne seront pas effacés du disque.\n"
+"Voulez vous vraiment continuer?"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:865
+msgid ""
+"The following audio files are not used in the current composition.\n"
+"\n"
+"Please select the ones you wish to delete permanently from the hard disk.\n"
+msgstr ""
+"Les fichiers audio suivants ne sont pas utilisés dans la composition "
+"courante.\n"
+"\n"
+"Veuillez sélectionner ceux que vous souhaitez effacer définitivement du "
+"disque dur.\n"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:875
+#, c-format
+msgid ""
+"_n: <qt>About to delete 1 audio file permanently from the hard disk.<br>This "
+"action cannot be undone, and there will be no way to recover this file."
+"<br>Are you sure?</qt>\n"
+"\n"
+"<qt>About to delete %n audio files permanently from the hard disk.<br>This "
+"action cannot be undone, and there will be no way to recover these files."
+"<br>Are you sure?</qt>"
+msgstr ""
+"<qt>1 fichier audio audio va être définitivement effacé du disque dur. "
+"<br><br>Cette action ne pourra pas être annulée et il ne sera plus possible "
+"de récupérer ce fichier. <br><br>Voulez vous vraiment continuer ?</qt>\n"
+"<qt>%n fichiers audio audio vont être définitivement effacés du disque dur. "
+"<br><br>Cette action ne pourra pas être annulée et il ne sera plus possible "
+"de récupérer ces fichiers.<br><br>Voulez vous vraiment continuer ?</qt>"
+
+#: ../src/document/RosegardenGUIDoc.cpp:525
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:888
+msgid "File %1 could not be deleted."
+msgstr "Le fichier \"%1\" ne peut pas être effacé."
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:921
+msgid "Change Audio File label"
+msgstr "Changer l'étiquette du fichier audio"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:6466
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:922
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:1099
+msgid "Enter new label"
+msgstr "Entrer la nouvelle étiquette"
+
+#: ../src/gui/application/RosegardenGUIView.cpp:1538
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:1086
+msgid "Adding audio file..."
+msgstr "Ajout d'un fichier audio..."
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:1107
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:1112
+msgid "Failed to add audio file. "
+msgstr "Échec de l'ajout d'un fichier audio. "
+
+#: ../src/document/RosegardenGUIDoc.cpp:2789
+#: ../src/gui/application/RosegardenGUIApp.cpp:2736
+#: ../src/gui/application/RosegardenGUIView.cpp:1574
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:1122
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:180
+msgid "Generating audio preview..."
+msgstr "Génération des pré-versions audio..."
+
+#: ../src/gui/application/RosegardenGUIView.cpp:1581
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:1130
+msgid ""
+"Try copying this file to a directory where you have write permission and re-"
+"add it"
+msgstr ""
+"Essayer de copier ce fichier dans un répertoire où vous disposez des droits "
+"d'écriture et rajoutez-le"
+
+#: ../src/gui/dialogs/TransportDialog.cpp:90 rc.cpp:357
+#, no-c-format
+msgid "Rosegarden Transport"
+msgstr "Transport"
+
+#: ../src/gui/dialogs/TransportDialog.cpp:925
+#: ../src/gui/dialogs/TransportDialog.cpp:985
+msgid "PITCH WHEEL"
+msgstr "ROUE DE TON"
+
+#: ../src/gui/dialogs/TransportDialog.cpp:929
+#: ../src/gui/dialogs/TransportDialog.cpp:989
+msgid "CONTROLLER"
+msgstr "CONTRÔLEUR"
+
+#: ../src/gui/dialogs/TransportDialog.cpp:933
+#: ../src/gui/dialogs/TransportDialog.cpp:993
+msgid "PROG CHNGE"
+msgstr "PROG CHNGE"
+
+#: ../src/gui/dialogs/TransportDialog.cpp:938
+#: ../src/gui/dialogs/TransportDialog.cpp:998
+msgid "PRESSURE"
+msgstr "PRESSION"
+
+#: ../src/gui/dialogs/TransportDialog.cpp:942
+#: ../src/gui/dialogs/TransportDialog.cpp:1002
+msgid "SYS MESSAGE"
+msgstr "MESSAGE SYS"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:177
+#: ../src/gui/dialogs/QuantizeDialog.cpp:40
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:127
+msgid "Quantize"
+msgstr "Quantifieur"
+
+#: ../src/gui/dialogs/QuantizeDialog.cpp:52
+msgid "Advanced"
+msgstr "Avancé"
+
+#: ../src/gui/dialogs/ExportDeviceDialog.cpp:42
+msgid "Export Devices..."
+msgstr "Exporter le périphérique. en tant que..."
+
+#: ../src/gui/dialogs/ExportDeviceDialog.cpp:47
+msgid "Export devices"
+msgstr "Exporter les Périphériques"
+
+#: ../src/gui/dialogs/ExportDeviceDialog.cpp:49
+msgid "Export all devices"
+msgstr "Exporter tous les Périphériques"
+
+#: ../src/gui/dialogs/ExportDeviceDialog.cpp:50
+msgid "Export selected device only"
+msgstr "Exporter le périphérique sélectionné uniquement"
+
+#: ../src/gui/dialogs/ExportDeviceDialog.cpp:51
+msgid " (\"%1\")"
+msgstr " (\"%1\")"
+
+#: ../src/gui/dialogs/CompositionLengthDialog.cpp:44
+msgid "Change Composition Length"
+msgstr "Changer la durée de la composition"
+
+#: ../src/gui/dialogs/CompositionLengthDialog.cpp:50
+msgid "Set the Start and End bar markers for this Composition"
+msgstr ""
+"Définition des numéros des première et dernière mesures de cette composition"
+
+#: ../src/gui/dialogs/CompositionLengthDialog.cpp:54
+msgid "Start Bar"
+msgstr "Mesure de départ"
+
+#: ../src/gui/dialogs/CompositionLengthDialog.cpp:62
+msgid "End Bar"
+msgstr "Mesure de fin"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:62
+msgid "LilyPond Export/Preview"
+msgstr "Exporter/prévisualiser vers Lilypond"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:85
+msgid "General options"
+msgstr "Options générales"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:90
+msgid "Advanced options"
+msgstr "Options avancées"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:112
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:95
+msgid "Headers"
+msgstr "En-têtes"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:106
+msgid "Basic options"
+msgstr "Options de base"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:113
+msgid "Compatibility level"
+msgstr "Niveau de compatibilité"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:117
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:118
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:119
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:120
+#, c-format
+msgid "LilyPond %1"
+msgstr "Lilypond %1"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:125
+msgid "Paper size"
+msgstr "Taille du papier"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:129
+msgid "A3"
+msgstr "A3"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:130
+msgid "A4"
+msgstr "A4"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:131
+msgid "A5"
+msgstr "A5"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:132
+msgid "A6"
+msgstr "A6"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:133
+msgid "Legal"
+msgstr "Légal"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:134
+msgid "US Letter"
+msgstr "US Letter"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:135
+msgid "Tabloid"
+msgstr "Tabloïd"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:136
+msgid "do not specify"
+msgstr "Ne pas spécifier"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:152
+msgid "Font size"
+msgstr "Taille de police"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:157
+msgid "%1 pt"
+msgstr "%1 pt"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:169
+msgid "Staff level options"
+msgstr "Options des portées"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:176
+msgid "Export content"
+msgstr "Exporter le contenu"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:179
+msgid "All tracks"
+msgstr "de toutes les pistes"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:180
+msgid "Non-muted tracks"
+msgstr "des pistes non assourdies"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:181
+msgid "Selected track"
+msgstr "de la piste sélectionnée"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:182
+msgid "Selected segments"
+msgstr "des segments sélectionnés"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:188
+msgid "Merge tracks that have the same name"
+msgstr "Fusionner les pistes de même nom"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:198
+msgid "Notation options"
+msgstr "Options de la partition"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:206
+msgid "First"
+msgstr "Premier"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:207
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:538
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:557
+msgid "All"
+msgstr "Tout"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:211
+msgid "Export tempo marks "
+msgstr "Exporter les indications de tempo"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:215
+msgid "Export lyrics"
+msgstr "Exporter les paroles"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:225
+msgid "Export beamings"
+msgstr "Exporter les liaisons"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:232
+msgid "Export track staff brackets"
+msgstr "Exporter les accolades"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:244
+msgid "Layout options"
+msgstr "Options de mise en page"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:257
+msgid "Lyrics alignment"
+msgstr "Alignement des paroles"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:261
+msgid "Ragged bottom (systems will not be spread vertically across the page)"
+msgstr ""
+"Bas de page inutilisé (les systèmes ne seront pas\n"
+"répartis verticalement sur la page)"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:267
+msgid "Miscellaneous options"
+msgstr "Options diverses"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:274
+msgid "Enable \"point and click\" debugging"
+msgstr "Activer le déboggage \"point and click\""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:279
+msgid "Export \\midi block"
+msgstr "Exporter \\Bloc MIDI "
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:284
+msgid "No markers"
+msgstr "Pas de marqueur"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:285
+msgid "Rehearsal marks"
+msgstr "Marqueurs de répétition"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:286
+msgid "Marker text"
+msgstr "Texte du marqueur"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:290
+msgid "Export markers"
+msgstr "Exporter les marqueurs"
+
+#: ../src/gui/dialogs/AudioSplitDialog.cpp:57
+msgid "Autosplit Audio Segment"
+msgstr "Auto-séparation de segment audio"
+
+#: ../src/gui/dialogs/AudioSplitDialog.cpp:70
+msgid "AutoSplit Segment \""
+msgstr "Auto-séparation de segment \""
+
+#: ../src/gui/dialogs/AudioSplitDialog.cpp:84
+msgid "Threshold"
+msgstr "Niveau de déclenchement"
+
+#: ../src/gui/dialogs/AudioSplitDialog.cpp:142
+msgid "<no preview generated for this audio file>"
+msgstr "<pas de prévisualisation générée pour ce fichier audio>"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:70
+msgid "Audio Plugin"
+msgstr "Module externe audio"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:94
+#: ../src/gui/widgets/AudioFaderBox.cpp:136
+msgid "Editor"
+msgstr "Éditeur"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:100
+msgid "Plugin"
+msgstr "Module externe"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:105
+msgid "Category:"
+msgstr "Catégorie :"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:110
+msgid "Plugin:"
+msgstr "Plugin :"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:114
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:398
+msgid "Select a plugin from this list."
+msgstr "Sélectionner un module externe de cette liste."
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:119
+msgid "Bypass"
+msgstr "Contourner"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:121
+msgid "Bypass this plugin."
+msgstr "Contourner ce module externe."
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:127
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:390
+msgid "<ports>"
+msgstr "<ports>"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:130
+msgid "Input and output port counts."
+msgstr "Compteur de ports d'entrée/sortie."
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:132
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:391
+msgid "<id>"
+msgstr "<id>"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:135
+msgid "Unique ID of plugin."
+msgstr "ID unique du module externe."
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:149
+msgid "Copy plugin parameters"
+msgstr "Copier les paramètres de plugin"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:155
+msgid "Paste plugin parameters"
+msgstr "Coller les paramètres de plugin"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:161
+msgid "Set to defaults"
+msgstr "Définir par défaut"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:225
+msgid "(any)"
+msgstr "(n'importe)"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:226
+msgid "(unclassified)"
+msgstr "(non classifié)"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:247
+msgid "(none)"
+msgstr "(rien)"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:389
+#: ../src/gui/editors/parameters/AudioInstrumentParameterPanel.cpp:132
+#: ../src/gui/editors/parameters/AudioInstrumentParameterPanel.cpp:361
+#: ../src/gui/studio/AudioMixerWindow.cpp:685
+#: ../src/gui/studio/AudioMixerWindow.cpp:724
+#: ../src/gui/studio/AudioMixerWindow.cpp:906
+#: ../src/gui/widgets/AudioFaderBox.cpp:79
+msgid "<no plugin>"
+msgstr "<pas de module externe>"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:427
+msgid "This plugin has too many controls to edit here."
+msgstr ""
+"Ce greffon a trop de paramètres pour qu'il soit possible de les modifier ici."
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:438
+#, c-format
+msgid "Id: %1"
+msgstr "Id: %1"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:490
+msgid "mono"
+msgstr "mono"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:492
+msgid "stereo"
+msgstr "stéréo"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:494
+msgid "%1 in, %2 out"
+msgstr "%1 in, %2 out"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:518
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:704
+msgid "Program: "
+msgstr "Programme : "
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:522
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:532
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:708
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:716
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:745
+msgid "<none selected>"
+msgstr "<aucun sélectionné>"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:56
+msgid "Set the %1 property of the event selection:"
+msgstr "Définissez la %1 propriété de cette sélection d'événement:"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:61
+msgid "Pattern"
+msgstr "Motif"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:66
+msgid "Flat - set %1 to value"
+msgstr "Bémol - valeur à %1"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:70
+msgid "Alternating - set %1 to max and min on alternate events"
+msgstr ""
+"Alternance - alterner %1 entre max et min à chacun des événements successifs"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:74
+msgid "Crescendo - set %1 rising from min to max"
+msgstr "Crescendo - %1 du min au max"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:78
+msgid "Diminuendo - set %1 falling from max to min"
+msgstr "Diminuendo - %1 du min au max"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:82
+msgid "Ringing - set %1 alternating from max to min with both dying to zero"
+msgstr ""
+"Oscillations amorties - Varier %1 alternativement du max au min, avec max et "
+"min tendant tous deux vers 0"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:123
+#: ../src/gui/dialogs/EventParameterDialog.cpp:150
+msgid "First Value"
+msgstr "1ère valeur"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:124
+#: ../src/gui/dialogs/EventParameterDialog.cpp:151
+msgid "Second Value"
+msgstr "2ème valeur"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:132
+#: ../src/gui/dialogs/EventParameterDialog.cpp:142
+msgid "Low Value"
+msgstr "Valeur faible"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:133
+#: ../src/gui/dialogs/EventParameterDialog.cpp:141
+msgid "High Value"
+msgstr "Valeur élevée"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:56 ../src/gui/rulers/TempoRuler.cpp:127
+msgid "Insert Tempo Change"
+msgstr "Insérer un changement de tempo"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:69
+msgid "New tempo:"
+msgstr "Nouveau tempo:"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:76
+msgid "Tap"
+msgstr "Battre ici"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:81
+msgid "Tempo is fixed until the following tempo change"
+msgstr "Tempo constant jusqu'au prochain changement"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:82
+msgid "Tempo ramps to the following tempo"
+msgstr "Variation linéaire du tempo jusqu'au prochain changement"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:83
+msgid "Tempo ramps to:"
+msgstr "Variation linéaire du tempo jusqu'à:"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:120
+msgid "Time of tempo change"
+msgstr "Insérer un changement de tempo"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:138
+msgid "The pointer is currently at "
+msgstr "Le pointeur est à "
+
+#: ../src/gui/dialogs/TempoDialog.cpp:154
+msgid "Apply this tempo from here onwards"
+msgstr "Appliquer le tempo actuel à partir d'ici"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:158
+msgid "Replace the last tempo change"
+msgstr "Remettre Dernier Changement de Tempo"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:164
+msgid "Apply this tempo from the start of this bar"
+msgstr "Appliquer le tempo actuel à partir du début de cette mesure"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:167
+msgid "Apply this tempo to the whole composition"
+msgstr "Appliquer le tempo actuel à toute la composition"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:172
+msgid "Also make this the default tempo"
+msgstr "Faire du tempo actuel le tempo par défaut"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:256
+msgid "%1.%2 s,"
+msgstr "%1.%2 s,"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:262
+#, c-format
+msgid "at the start of measure %1."
+msgstr "à partir de la mesure %1."
+
+#: ../src/gui/dialogs/TempoDialog.cpp:266
+#, c-format
+msgid "in the middle of measure %1."
+msgstr "à la moitié de la mesure %1."
+
+#: ../src/gui/dialogs/TempoDialog.cpp:285
+msgid " (at %1.%2 s, in measure %3)"
+msgstr " (à %1.%2 s, mesure %3)"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:302
+msgid "There are no preceding tempo changes."
+msgstr "Il n'y a pas de changement de tempo précédent."
+
+#: ../src/gui/dialogs/TempoDialog.cpp:310
+msgid "There are no other tempo changes."
+msgstr "Il n'y a pas d'autres changements de tempo."
+
+#: ../src/gui/dialogs/TempoDialog.cpp:328
+msgid " bpm"
+msgstr " bpm"
+
+#: ../src/gui/dialogs/AudioPlayingDialog.cpp:42
+msgid "Playing audio file"
+msgstr "Joue un fichier audio"
+
+#: ../src/gui/dialogs/AudioPlayingDialog.cpp:47
+msgid "Playing audio file \"%1\""
+msgstr "Joue le fichier audio \"%1\" "
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:52
+#: ../src/gui/editors/matrix/MatrixView.cpp:2655
+msgid "Trigger Segment"
+msgstr "Segment déclenché"
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:61
+msgid "Trigger segment: "
+msgstr "Segment déclenché: "
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:59
+msgid "Key Change"
+msgstr "Changement de clef"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:77
+msgid "Key signature"
+msgstr "Armature"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:80
+msgid "Key transposition"
+msgstr "Transposition de l'armature"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:86
+msgid "Existing notes following key change"
+msgstr "Les notes existantes suivent le changement de clef"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:98
+msgid "Flatten"
+msgstr "Bémoliser"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:100
+msgid "Key"
+msgstr "Clef"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:105
+msgid "Sharpen"
+msgstr "Dièser"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:109
+msgid "Major"
+msgstr "Majeur"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:110
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:369
+msgid "Minor"
+msgstr "Mineur"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:123
+msgid "Transpose key according to segment transposition"
+msgstr "Modifier l'armature en fonction de la transposition du segment"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:126
+msgid "Use specified key. Do not transpose"
+msgstr "Utiliser l'armature spécifiée. Ne pas la transposer"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:134
+msgid "Apply to current segment only"
+msgstr "Appliquer uniquement au segment courant"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:137
+msgid "Apply to all segments at this time"
+msgstr "Appliquer à tous les segments"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:141
+msgid "Exclude percussion segments"
+msgstr "Exclure les segments de percussion"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:155
+msgid "Maintain current accidentals"
+msgstr "Conserver les altérations courantes"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:158
+msgid "Transpose into this key"
+msgstr "Transposer dans cette clef"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:331
+msgid "No such key"
+msgstr "Clef inconnue"
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:44
+#: ../src/gui/editors/notation/NotationSelector.cpp:118
+msgid "Interpret"
+msgstr "Interprêter"
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:50
+msgid "Interpretations to apply"
+msgstr "Interprétations à appliquer"
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:53
+msgid "Apply text dynamics (p, mf, ff etc)"
+msgstr "Appliquer les nuances (p, mf, ff, etc)"
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:55
+msgid "Apply hairpin dynamics"
+msgstr "Appliquer les nuances indiquées par des \"épingles à cheveux\""
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:57
+msgid "Stress beats"
+msgstr "Accentuer la pulsation"
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:59
+msgid "Articulate slurs, staccato, tenuto etc"
+msgstr "Articuler liés, staccato, tenuto, etc"
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:61
+msgid "All available interpretations"
+msgstr "Toutes les interprétations disponibles"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:316
+msgid ""
+"Attempted to launch JACK audio daemon failed. Audio will be disabled.\n"
+"Please check configuration (Settings -> Configure Rosegarden -> Audio -> "
+"Startup)\n"
+" and restart."
+msgstr ""
+"Le lancement du daemon JACK audio a échoué. L'audio sera désactivé.\n"
+"Veuillez vérifier votre configuration (Configuration->Configurer Rosegarden-"
+">Audio->Démarrage de JACK)\n"
+" et redémarrez."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:325
+msgid "Starting sequencer..."
+msgstr "Démarrage du séquenceur..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:333
+msgid "Initializing plugin manager..."
+msgstr "Initialisation du gestionnaire des plugins..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:338
+msgid "Initializing view..."
+msgstr "Initialisation vue..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:354
+msgid "Special Parameters"
+msgstr "Paramètres spéciaux"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:430
+msgid "Starting sequence manager..."
+msgstr "Démarrage du gestionnaire de séquence..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:456
+msgid "Clearing studio data..."
+msgstr "Nettoyage des données du studio..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:475
+#: ../src/gui/editors/notation/NotationView.cpp:558
+msgid "Starting..."
+msgstr "Démarrage..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:556
+msgid "Import Rosegarden &Project file..."
+msgstr "Importer un fichier &Projet Rosegarden..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:560
+msgid "Import &MIDI file..."
+msgstr "Importer un fichier &MIDI..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:564
+msgid "Import &Rosegarden 2.1 file..."
+msgstr "Importer un fichier &Rosegarden 2.1..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:568
+msgid "Import &Hydrogen file..."
+msgstr "Importer un fichier &Hydrogen..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:572
+msgid "Merge &File..."
+msgstr "&Fusionner un fichier..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:576
+msgid "Merge &MIDI file..."
+msgstr "Fusionner un fichier &MIDI..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:580
+msgid "Merge &Rosegarden 2.1 file..."
+msgstr "Fusionner un fichier &Rosegarden 2.1..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:584
+msgid "Merge &Hydrogen file..."
+msgstr "Fusionner un fichier &Hydrogen..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:588
+msgid "Export Rosegarden &Project file..."
+msgstr "Exporter un fichier &Projet Rosegarden..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:592
+msgid "Export &MIDI file..."
+msgstr "Exporter en fichier &MIDI..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:596
+msgid "Export &LilyPond file..."
+msgstr "Exporter en fichier &Lilypond..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:600
+msgid "Export Music&XML file..."
+msgstr "Exporter en fichier Music&XML..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:604
+msgid "Export &Csound score file..."
+msgstr "Exporter en fichier partition &Csound..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:608
+msgid "Export M&up file..."
+msgstr "Exporter en fichier M&up..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:612
+#: ../src/gui/editors/notation/NotationView.cpp:1500
+msgid "Print &with LilyPond..."
+msgstr "Imprimer avec Lilypond..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:616
+#: ../src/gui/editors/notation/NotationView.cpp:1504
+msgid "Preview with Lil&yPond..."
+msgstr "Aperçu avec Lil&ypond..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:620
+msgid "Play&list"
+msgstr "&Liste à jouer"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:627
+msgid "Rosegarden &Tutorial"
+msgstr "&Turoriel de Rosegarden"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:631
+msgid "&Bug Reporting Guidelines"
+msgstr "Comment signaler un &bogue"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:645
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:348
+#: ../src/gui/editors/segment/MarkerEditor.cpp:378
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:388
+#: ../src/gui/general/EditViewBase.cpp:190
+#: ../src/gui/studio/BankEditorDialog.cpp:318
+#: ../src/gui/studio/DeviceManagerDialog.cpp:227
+msgid "Und&o"
+msgstr "Annu&ler"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:651
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:354
+#: ../src/gui/editors/segment/MarkerEditor.cpp:384
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:394
+#: ../src/gui/general/EditViewBase.cpp:196
+#: ../src/gui/studio/BankEditorDialog.cpp:324
+#: ../src/gui/studio/DeviceManagerDialog.cpp:233
+msgid "Re&do"
+msgstr "Re&faire"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:665
+#: ../src/gui/editors/notation/NotationView.cpp:2297
+msgid "Show T&ools Toolbar"
+msgstr "Afficher la barre d'outils des &outils"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:669
+msgid "Show Trac&ks Toolbar"
+msgstr "Afficher la barre d'outils &pistes"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:673
+msgid "Show &Editors Toolbar"
+msgstr "Afficher la barre d'outils édit&eurs"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:677
+#: ../src/gui/editors/notation/NotationView.cpp:2309
+msgid "Show Trans&port Toolbar"
+msgstr "Afficher la barre d'outils trans&port"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:681
+msgid "Show &Zoom Toolbar"
+msgstr "Afficher la barre d'outils &zoom"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:688
+msgid "Show Tra&nsport"
+msgstr "Afficher tra&nsport"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:693
+msgid "Show Track &Labels"
+msgstr "Afficher pistes et &étiquettes"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:698
+msgid "Show Playback Position R&uler"
+msgstr "Afficher réglette de position du curseur d'exécution"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:703
+msgid "Show Te&mpo Ruler"
+msgstr "Afficher règlette de te&mpo"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:708
+msgid "Show Cho&rd Name Ruler"
+msgstr "Afficher règlette du nom des acco&rds"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:714
+msgid "Show Segment Pre&views"
+msgstr "Afficher les pré&visualisations de segment"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:719
+msgid "Show Special &Parameters"
+msgstr "Afficher les &paramètres spéciaux"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:753
+#: ../src/gui/editors/matrix/MatrixView.cpp:641
+#: ../src/gui/editors/notation/NotationView.cpp:1772
+msgid "&Select and Edit"
+msgstr "&Sélectionner et Editer"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:758
+#: ../src/gui/editors/matrix/MatrixView.cpp:646
+msgid "&Draw"
+msgstr "&Dessiner"
+
+#: ../src/commands/edit/EraseCommand.h:50
+#: ../src/gui/application/RosegardenGUIApp.cpp:763
+#: ../src/gui/editors/matrix/MatrixView.cpp:651
+#: ../src/gui/editors/notation/NotationView.cpp:1766
+msgid "&Erase"
+msgstr "&Effacer"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:768
+#: ../src/gui/editors/matrix/MatrixView.cpp:656
+msgid "&Move"
+msgstr "&Bouger"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:775
+msgid "&Resize"
+msgstr "&Redimensionner"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:782 rc.cpp:87
+#, no-c-format
+msgid "&Split"
+msgstr "&Séparer"
+
+#: ../src/commands/segment/SegmentJoinCommand.h:53
+#: ../src/gui/application/RosegardenGUIApp.cpp:789
+msgid "&Join"
+msgstr "&Joindre"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:795
+msgid "&Harmonize"
+msgstr "&Harmoniser"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:806
+#: ../src/gui/rulers/TempoRuler.cpp:157
+msgid "Open Tempo and Time Signature Editor"
+msgstr "Ouvrir l'éditeur de tempo et de chiffrage de la mesure"
+
+#: ../src/commands/segment/CutRangeCommand.cpp:41
+#: ../src/gui/application/RosegardenGUIApp.cpp:812
+msgid "Cut Range"
+msgstr "Couper une plage"
+
+#: ../src/commands/edit/CopyCommand.cpp:73
+#: ../src/gui/application/RosegardenGUIApp.cpp:816
+msgid "Copy Range"
+msgstr "Copier une plage"
+
+#: ../src/commands/segment/PasteRangeCommand.cpp:45
+#: ../src/gui/application/RosegardenGUIApp.cpp:820
+msgid "Paste Range"
+msgstr "Coller une plage"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:828
+msgid "Insert Range..."
+msgstr "Insérer une plage..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:832
+#: ../src/gui/editors/notation/NotationView.cpp:1804
+msgid "De&lete"
+msgstr "&Effacer"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:836
+msgid "Select &All Segments"
+msgstr "Sélectionner &tout les segments"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:852
+msgid "Edit Mar&kers..."
+msgstr "Éditer les mar&queurs..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:856
+msgid "Edit Document P&roperties..."
+msgstr "Éditer les p&ropriétés du document..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:864
+msgid "Open in &Default Editor"
+msgstr "Ouvrir dans l'é&diteur par défaut"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:870
+#: ../src/gui/general/EditViewBase.cpp:206
+msgid "Open in Matri&x Editor"
+msgstr "Ouvrir l'éditeur &matriciel"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:876
+#: ../src/gui/general/EditViewBase.cpp:212
+msgid "Open in &Percussion Matrix Editor"
+msgstr "Ouvrir dans l'éditeur de &percussions matriciel"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:882
+#: ../src/gui/general/EditViewBase.cpp:218
+msgid "Open in &Notation Editor"
+msgstr "Ouvrir l'éditeur de &partition"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:888
+#: ../src/gui/general/EditViewBase.cpp:224
+msgid "Open in &Event List Editor"
+msgstr "Ouvrir la liste des &événements"
+
+#: ../src/commands/edit/EventQuantizeCommand.cpp:120
+#: ../src/commands/edit/EventUnquantizeCommand.cpp:87
+#: ../src/gui/application/RosegardenGUIApp.cpp:894
+msgid "&Quantize..."
+msgstr "&Quantifier..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:908
+#: ../src/gui/editors/matrix/MatrixView.cpp:686
+msgid "Repeat Last Quantize"
+msgstr "Répéter la dernière quantification"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:928
+msgid "Split at Time..."
+msgstr "Séparer à un instant donné..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:932
+#: ../src/gui/general/EditView.cpp:796
+msgid "Jog &Left"
+msgstr "Aller à &gauche"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:936
+#: ../src/gui/general/EditView.cpp:800
+msgid "Jog &Right"
+msgstr "Aller à &droite"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:940
+msgid "Set Start Time..."
+msgstr "Définir le démarrage..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:944
+msgid "Set Duration..."
+msgstr "Définir la durée..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:953
+msgid "Turn Re&peats into Copies"
+msgstr "Ré&pétitions dans copies"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:958
+msgid "Manage Tri&ggered Segments"
+msgstr "Gérer les Se&gments déclenchés"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:962
+msgid "Set Tempos from &Beat Segment"
+msgstr "Ajuster le tempo à la &pulsation du segment"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:966
+msgid "Set &Tempo to Audio Segment Duration"
+msgstr "Fixer le &tempo sur la durée du segment audio"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:972
+msgid "Manage A&udio Files"
+msgstr "Gérer les fichier a&udio"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:977
+msgid "Show Segment Labels"
+msgstr "Montrer les étiquette des segments"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:986
+msgid "Add &Track"
+msgstr "Ajouter &piste"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:990
+msgid "&Add Tracks..."
+msgstr "&Ajouter pistes..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:996
+msgid "D&elete Track"
+msgstr "E&ffacer piste"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1002
+msgid "Move Track &Down"
+msgstr "&Descendre piste"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1008
+msgid "Move Track &Up"
+msgstr "&Monter piste"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1012
+msgid "Select &Next Track"
+msgstr "Sélectionner piste &suivante"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1017
+msgid "Select &Previous Track"
+msgstr "Sélectionner piste &précédente"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1022
+msgid "Mute or Unmute Track"
+msgstr "Assourdir ou non la piste"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1027
+msgid "Arm or Un-arm Track for Record"
+msgstr "Armer ou non l'enregistrement sur cette piste"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1034
+msgid "&Mute all Tracks"
+msgstr "&Assourdir toutes les pistes"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1040
+msgid "&Unmute all Tracks"
+msgstr "&Rendre sonore les pistes"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1044
+msgid "&Remap Instruments..."
+msgstr "&Redéfinir Instruments..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1053
+msgid "&Audio Mixer"
+msgstr "Mixeur &Audio"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1059
+msgid "Midi Mi&xer"
+msgstr "Mi&xeur Midi"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1065
+msgid "Manage MIDI &Devices"
+msgstr "Gérer les &périphériques MIDI"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1071
+msgid "Manage S&ynth Plugins"
+msgstr "&Gérer les greffons synthétiseurs"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1075
+msgid "Modify MIDI &Filters"
+msgstr "Modifier &filtres MIDI... "
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1079
+msgid "MIDI Thru Routing"
+msgstr "Router les messages MIDI (MIDI thru)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1085
+msgid "Manage &Metronome"
+msgstr "&Métronome"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1089
+msgid "&Save Current Document as Default Studio"
+msgstr "&Enregistrer le document courant comme studio par défaut"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1093
+msgid "&Import Default Studio"
+msgstr "&Importer le studio par défaut"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1097
+msgid "Im&port Studio from File..."
+msgstr "&Importer le studio depuis un fichier..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1101
+msgid "&Reset MIDI Network"
+msgstr "&Remettre à zéro le réseau Midi"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1105
+msgid "Set Quick Marker at Playback Position"
+msgstr "Placer le marqueur rapide sur le curseur d'exécution"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1109
+msgid "Jump to Quick Marker"
+msgstr "Sauter au Marqueur Rapide"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1142
+#: ../src/gui/editors/matrix/MatrixView.cpp:782
+#: ../src/gui/editors/notation/NotationView.cpp:2397
+#: ../src/gui/studio/AudioMixerWindow.cpp:105
+#: ../src/gui/studio/MidiMixerWindow.cpp:81
+msgid "&Play"
+msgstr "&Jouer"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1153
+#: ../src/gui/editors/matrix/MatrixView.cpp:791
+#: ../src/gui/editors/notation/NotationView.cpp:2406
+#: ../src/gui/studio/AudioMixerWindow.cpp:114
+#: ../src/gui/studio/MidiMixerWindow.cpp:90
+msgid "&Stop"
+msgstr "&Stop"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1160
+#: ../src/gui/editors/matrix/MatrixView.cpp:802
+#: ../src/gui/editors/notation/NotationView.cpp:2417
+#: ../src/gui/studio/AudioMixerWindow.cpp:125
+#: ../src/gui/studio/MidiMixerWindow.cpp:101
+msgid "&Fast Forward"
+msgstr "&Avance rapide"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1168
+#: ../src/gui/editors/matrix/MatrixView.cpp:796
+#: ../src/gui/editors/notation/NotationView.cpp:2411
+#: ../src/gui/studio/AudioMixerWindow.cpp:119
+#: ../src/gui/studio/MidiMixerWindow.cpp:95
+msgid "Re&wind"
+msgstr "&Retour"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1175
+msgid "P&unch in Record"
+msgstr "&Pointer enregistrement"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1182
+#: ../src/gui/studio/AudioMixerWindow.cpp:143
+#: ../src/gui/studio/MidiMixerWindow.cpp:119
+msgid "&Record"
+msgstr "En&registrer"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1189
+#: ../src/gui/editors/matrix/MatrixView.cpp:808
+#: ../src/gui/editors/notation/NotationView.cpp:2423
+#: ../src/gui/studio/AudioMixerWindow.cpp:131
+#: ../src/gui/studio/MidiMixerWindow.cpp:107
+msgid "Rewind to &Beginning"
+msgstr "Revenir au &début"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1196
+#: ../src/gui/editors/matrix/MatrixView.cpp:814
+#: ../src/gui/editors/notation/NotationView.cpp:2429
+#: ../src/gui/studio/AudioMixerWindow.cpp:137
+#: ../src/gui/studio/MidiMixerWindow.cpp:113
+msgid "Fast Forward to &End"
+msgstr "Aller à la &fin"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1203
+#: ../src/gui/editors/matrix/MatrixView.cpp:832
+#: ../src/gui/editors/notation/NotationView.cpp:2447
+msgid "Scro&ll to Follow Playback"
+msgstr "Faire défiler en suivant l'exécution"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1209
+#: ../src/gui/editors/matrix/MatrixView.cpp:838
+#: ../src/gui/editors/notation/NotationView.cpp:2453
+#: ../src/gui/studio/AudioMixerWindow.cpp:149
+#: ../src/gui/studio/MidiMixerWindow.cpp:125
+msgid "Panic"
+msgstr "Panique"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1213
+msgid "Segment Debug Dump "
+msgstr "Segment Debug Dump "
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1283
+msgid " Zoom: "
+msgstr " Zoom: "
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1719
+msgid "File \"%1\" does not exist"
+msgstr "Le fichier \"%1\" n'existe pas"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1725
+msgid "File \"%1\" is actually a directory"
+msgstr "\"%1\" est un répertoire"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1734
+msgid "You do not have read permission for \"%1\""
+msgstr "Vous n'avez pas la permission d'écrire dans \"%1\""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1802
+msgid ""
+"An auto-save file for this document has been found\n"
+"Do you want to open it instead ?"
+msgstr ""
+"Un fichier de sauvegarde automatique a été trouvé\n"
+"Voulez-vous l'ouvrir à la place ?"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1896
+msgid "Example Files"
+msgstr "Fichiers d'exemple"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2100
+msgid "Opening a new application window..."
+msgstr "Ouverture d'une nouvelle fenêtre d'application..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2110
+msgid "Creating new document..."
+msgstr "Création d'un nouveau document..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2154
+#, c-format
+msgid ""
+"Malformed URL\n"
+"%1"
+msgstr ""
+"Mauvaise URL\n"
+"%1"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2179
+#: ../src/gui/application/RosegardenGUIApp.cpp:2240
+msgid "Opening file..."
+msgstr "Ouverture du fichier..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2201
+#: ../src/gui/application/RosegardenGUIApp.cpp:2220
+msgid "Open File"
+msgstr "Ouvrir Fichier"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1225
+#: ../src/gui/application/RosegardenGUIApp.cpp:2258
+msgid "Saving file..."
+msgstr "Enregistrement du fichier..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2330
+msgid "This is not a valid filename.\n"
+msgstr "Ce n'est pas un nom de fichier valide.\n"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2335
+msgid "This is not a local file.\n"
+msgstr "Ce n'est pas un fichier local.\n"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2342
+#: ../src/gui/studio/BankEditorDialog.cpp:1640
+#: ../src/gui/studio/DeviceManagerDialog.cpp:787
+msgid "You have specified a directory"
+msgstr "Vous avez spécifié un dossier"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2348
+#: ../src/gui/studio/BankEditorDialog.cpp:1646
+#: ../src/gui/studio/DeviceManagerDialog.cpp:793
+msgid "The specified file exists. Overwrite?"
+msgstr "Le fichier spécifié existe. L'écraser ?"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2362
+msgid "Saving file with a new filename..."
+msgstr "Enregistrement du fichier sous un nouveau nom..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2364
+msgid "Rosegarden files"
+msgstr "Fichiers Rosegarden"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2365
+#: ../src/gui/application/RosegardenGUIApp.cpp:4860
+#: ../src/gui/application/RosegardenGUIApp.cpp:4904
+#: ../src/gui/application/RosegardenGUIApp.cpp:4942
+#: ../src/gui/application/RosegardenGUIApp.cpp:4975
+#: ../src/gui/application/RosegardenGUIApp.cpp:5009
+#: ../src/gui/application/RosegardenGUIApp.cpp:5116
+msgid "All files"
+msgstr "Tous les fichiers"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2366
+msgid "Save as..."
+msgstr "Enregistrer sous..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2404
+msgid "Closing file..."
+msgstr "Fermeture du fichier..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2421
+#: ../src/gui/editors/notation/NotationView.cpp:4618
+msgid "Printing..."
+msgstr "Impression..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2433
+#: ../src/gui/editors/notation/NotationView.cpp:4635
+msgid "Previewing..."
+msgstr "Prévisualisation..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2440
+msgid "Exiting..."
+msgstr "Sortie..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2463
+msgid "Cutting selection..."
+msgstr "Découpage de la sélection..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2474
+#: ../src/gui/editors/matrix/MatrixView.cpp:1614
+#: ../src/gui/editors/notation/NotationView.cpp:4763
+msgid "Copying selection to clipboard..."
+msgstr "Copie la sélection dans le presse-papiers..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2484
+#: ../src/gui/editors/eventlist/EventView.cpp:878
+#: ../src/gui/editors/matrix/MatrixView.cpp:1625
+#: ../src/gui/editors/notation/NotationView.cpp:4796
+#: ../src/gui/editors/notation/NotationView.cpp:4841
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:352
+msgid "Clipboard is empty"
+msgstr "Le presse-papiers est vide"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2487
+#: ../src/gui/editors/eventlist/EventView.cpp:882
+#: ../src/gui/editors/matrix/MatrixView.cpp:1629
+#: ../src/gui/editors/notation/NotationView.cpp:4804
+#: ../src/gui/editors/notation/NotationView.cpp:4845
+msgid "Inserting clipboard contents..."
+msgstr "Insertion du contenu presse-papiers..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2556
+msgid "Duration of empty range to insert"
+msgstr "Durée de la plage vide à insérer"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2631
+msgid "This function needs no more than one segment to be selected."
+msgstr "Cette fonction n'a besoin que d'un seul segment sélectionné."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2654
+msgid "Can't join Audio segments"
+msgstr "Ne peut pas joindre les segments Audio"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2707
+msgid "rescaling an audio file"
+msgstr "redimensionner un fichier audio"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2723
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:172
+msgid "Rescaling audio file..."
+msgstr "Redimensionner fichier audio..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2767
+msgid ""
+"The audio file path does not exist or is not writable.\n"
+"You must set the audio file path to a valid directory in Document Properties "
+"before %1.\n"
+"Would you like to set it now?"
+msgstr ""
+"Le chemin des fichiers audio n'existe pas ou ne peut pas être écrit.\n"
+"Vous devez définir un chemin des fichiers audio pointant vers un répertoire "
+"valide (en utilisant le menu \"Composition -> Propriété du document\") avant "
+"de %1.\n"
+"Souhaitez vous le faire maintenant ?"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2769
+#: ../src/gui/application/RosegardenGUIApp.cpp:5291
+#: ../src/gui/application/RosegardenGUIApp.cpp:5339
+#: ../src/gui/editors/segment/TrackButtons.cpp:419
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:159
+msgid "Set audio file path"
+msgstr "Définition du chemin des fichiers audio"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2833
+msgid "Jog Selection"
+msgstr "Jog Selection"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2978
+#, c-format
+msgid ""
+"_n: Split Segment at Time\n"
+"Split %n Segments at Time"
+msgstr ""
+"Diviser un segment au temps indiqué\n"
+"Diviser %n segments au temps indiqué"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3013
+#: ../src/gui/general/EditViewBase.cpp:619
+msgid "Segment Start Time"
+msgstr "Temps de début du segment"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3023
+msgid "Set Segment Start Times"
+msgstr "Définir le temps de début du segment"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3024
+#: ../src/gui/general/EditViewBase.cpp:626
+msgid "Set Segment Start Time"
+msgstr "Définir le temps de début du segment"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3056
+#: ../src/gui/general/EditViewBase.cpp:644
+msgid "Segment Duration"
+msgstr "Durée du segment"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3068
+msgid "Set Segment Durations"
+msgstr "Définir la durée du segment"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3069
+#: ../src/gui/general/EditViewBase.cpp:652
+msgid "Set Segment Duration"
+msgstr "Définir la durée du segment"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3176
+#: ../src/gui/application/RosegardenGUIApp.cpp:5875
+msgid "Set Global Tempo"
+msgstr "Régler le tempo global"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3234
+#: ../src/gui/general/EditViewBase.cpp:477
+msgid "Toggle the toolbar..."
+msgstr "(Dés)Activer la barre d'outils..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3244
+msgid "Toggle the tools toolbar..."
+msgstr "(Dés)Activer les outils barre d'outils..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3254
+msgid "Toggle the tracks toolbar..."
+msgstr "(Dés)Activer la barre d'outils pistes..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3264
+msgid "Toggle the editor toolbar..."
+msgstr "(Dés)Activer la barre d'outils éditeur..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3274
+msgid "Toggle the transport toolbar..."
+msgstr "(Dés)Activer la barre d'outils commandes de contrôle..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3284
+msgid "Toggle the zoom toolbar..."
+msgstr "(Dés)Activer la barre d'outils zoom..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3294
+msgid "Toggle the Transport"
+msgstr "(Dés)Activer Commandes de Contrôle"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3377
+#: ../src/gui/general/EditViewBase.cpp:487
+msgid "Toggle the statusbar..."
+msgstr "(Dés)Activer Barre d'état..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3434
+msgid ""
+"The join tool isn't implemented yet. Instead please highlight the segments "
+"you want to join and then use the menu option:\n"
+"\n"
+" Segments->Collapse Segments.\n"
+msgstr ""
+"L'outil de jointure n'est pas implémenté. Veuillez sélectionner les "
+"segments à joindre et utiliser l'option du menu:\n"
+"\n"
+" Segments->Appondre Segments.\n"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3437
+msgid "Join tool not yet implemented"
+msgstr "L'outil de jointure n'est pas implémenté"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3675
+msgid "Revert modified document to previous saved version?"
+msgstr "Revenir à la version du document précédemment enregistrée?"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3691
+msgid ""
+"*.rgp|Rosegarden Project files\n"
+"*|All files"
+msgstr ""
+"*.rgp|Fichiers Projet Rosegarden\n"
+"*|Tous les fichiers"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3692
+msgid "Import Rosegarden Project File"
+msgstr "Importer un fichier Projet Rosegarden"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3717
+msgid "Failed to import project file \"%1\""
+msgstr "L'importation du fichier projet \"%1\" a échouée"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3739
+msgid "Open MIDI File"
+msgstr "Ouvrir un fichier MIDI"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3756
+msgid "Merge MIDI File"
+msgstr "Fusionner un fichier MIDI"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3866
+msgid "Importing MIDI file..."
+msgstr "Importer un fichier MIDI..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3903
+msgid "Calculating notation..."
+msgstr "Évaluation de la partition..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3950
+msgid "Calculate Notation"
+msgstr "Évaluer la partition"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3991
+#: ../src/gui/application/RosegardenGUIApp.cpp:4008
+msgid ""
+"*.rose|Rosegarden-2 files\n"
+"*|All files"
+msgstr ""
+"*.rose|Fichiers Rosegarden-2\n"
+"*|Tous les fichiers"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3992
+#: ../src/gui/application/RosegardenGUIApp.cpp:4009
+msgid "Open Rosegarden 2.1 File"
+msgstr "Ouvrir fichier Rosegarden 2.1"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4026
+msgid "Importing Rosegarden 2.1 file..."
+msgstr "Importation fichier Rosegarden 2.1..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4052
+msgid "Can't load Rosegarden 2.1 file. It appears to be corrupted."
+msgstr "Échec d'ouverture du fichier Rosegarden 2.1. Il semble corrompu."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4078
+#: ../src/gui/application/RosegardenGUIApp.cpp:4095
+msgid ""
+"*.h2song|Hydrogen files\n"
+"*|All files"
+msgstr ""
+"*.h2song|Hydrogen files\n"
+"*|All files"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4079
+#: ../src/gui/application/RosegardenGUIApp.cpp:4096
+msgid "Open Hydrogen File"
+msgstr "Ouvrir un fichier Hydrogen"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4113
+msgid "Importing Hydrogen file..."
+msgstr "Importer un fichier Hydrogen..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4139
+msgid "Can't load Hydrogen file. It appears to be corrupted."
+msgstr "Échec d'ouverture du fichier Rosegarden 2.1. Il semble corrompu."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4527
+msgid "Export and import of Rosegarden Project files"
+msgstr "Exportation et importation de fichiers projet Rosegarden"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4529
+msgid "The Rosegarden Project Packager helper script"
+msgstr "Le script Rosegarden de gestion des paquetages projet"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4533
+msgid "%1 - for project file support"
+msgstr "%1 - pour le support des fichiers projet"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4550
+msgid "The Rosegarden LilyPondView helper script"
+msgstr "Le script Rosegarden de visualisation avec LilyPond"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4554
+msgid "%1 - for LilyPond preview support"
+msgstr "%1 - pour le support de la prévisualisation avec LilyPond"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4570
+msgid "The Rosegarden Audio File Importer helper script"
+msgstr "Le script Rosegarden d'importation de fichiers audio"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4574
+msgid "%1 - for audio file import"
+msgstr "%1 - pour l'importation de fichiers audio"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4585
+msgid ""
+"<h3>Helper programs not found</h3><p>Rosegarden could not find one or more "
+"helper programs which it needs to provide some features. The following "
+"features will not be available:</p>"
+msgstr ""
+"<h3>Utilitaire absent</h3><p>Rosegarden n'a pas pu trouver un ou plusieurs "
+"programmes utilitaires qui sont indispensables à certaines fonctionnalités. "
+"Les fonctionnalités suivantes ne seront pas disponibles:</p>"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4586
+#: ../src/gui/application/RosegardenGUIApp.cpp:4592
+msgid "<ul>"
+msgstr "<ul>"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4588
+#: ../src/gui/application/RosegardenGUIApp.cpp:4594
+msgid "<li>%1</li>"
+msgstr "<li>%1</li>"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4590
+#: ../src/gui/application/RosegardenGUIApp.cpp:4596
+msgid "</ul>"
+msgstr "</ul>"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4591
+msgid ""
+"<p>To fix this, you should install the following additional programs:</p>"
+msgstr ""
+"<p>Pour corriger ceci, vous devriez installer les programmes supplémentaires "
+"suivants:</p>"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4603
+msgid "Helper programs not found"
+msgstr "Programme utilitaire non trouvé"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4686
+msgid "Starting the sequencer..."
+msgstr "Démarrage du Séquenceur..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4712
+msgid "Couldn't start the sequencer"
+msgstr "Échec d'ouverture du séquenceur"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4789
+msgid "Clearing down jackd..."
+msgstr "Fermeture de Jackd..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4803
+msgid "Starting jackd..."
+msgstr "Démarrage de Jackd..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4842
+msgid ""
+"The Rosegarden sequencer process has exited unexpectedly. Sound and "
+"recording will no longer be available for this session.\n"
+"Please exit and restart Rosegarden to restore sound capability."
+msgstr ""
+"Le processus séquenceur de Rosegarden s'est achevé de façon inattendue. Le "
+"son et l'enregistrement ne seront plus utilisables pendant cette session.\n"
+"Veuillez quitter puis relancer Rosegarden pour rétablir ces fonctionnalités."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4846
+msgid ""
+"The Rosegarden sequencer could not be started, so sound and recording will "
+"be unavailable for this session.\n"
+"For assistance with correct audio and MIDI configuration, go to http://"
+"rosegardenmusic.com."
+msgstr ""
+"Le séquenceur de Rosegarden n'a pas pu démarrer, le son et l'enregistrement "
+"ne seront pas pris en charge lors de cette session.\n"
+"Afin de recevoir de l'assistance pour configurer correctement votre audio et "
+"Midi, allez sur http://rosegardenmusic.com."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4856
+msgid "Exporting Rosegarden Project file..."
+msgstr "Exportation d'un fichier Projet Rosegarden..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4859
+msgid "Rosegarden Project files\n"
+msgstr "Fichiers Projet Rosegarden\n"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4861
+#: ../src/gui/application/RosegardenGUIApp.cpp:4905
+#: ../src/gui/application/RosegardenGUIApp.cpp:4943
+#: ../src/gui/application/RosegardenGUIApp.cpp:4976
+#: ../src/gui/application/RosegardenGUIApp.cpp:5010
+#: ../src/gui/application/RosegardenGUIApp.cpp:5116
+msgid "Export as..."
+msgstr "Exporter..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4875
+#, c-format
+msgid "Saving Rosegarden file to package failed: %1"
+msgstr "Échec de la sauvegarde d'un fichier Rosegarden dans un paquetage: %1"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4889
+msgid "Failed to export to project file \"%1\""
+msgstr "Échec de l'exportation du fichier projet \"%1\""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4900
+#: ../src/gui/application/RosegardenGUIApp.cpp:4915
+msgid "Exporting MIDI file..."
+msgstr "Exporter en Fichier MIDI..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4903
+msgid "Standard MIDI files\n"
+msgstr "Fichiers MIDI Standard\n"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4934
+#: ../src/gui/application/RosegardenGUIApp.cpp:4966
+#: ../src/gui/application/RosegardenGUIApp.cpp:4999
+#: ../src/gui/application/RosegardenGUIApp.cpp:5103
+#: ../src/gui/application/RosegardenGUIApp.cpp:5140
+#: ../src/gui/editors/notation/NotationView.cpp:4733
+msgid "Export failed. The file could not be opened for writing."
+msgstr "Échec d'exportation. Le fichier n'a pas put être ouvert en écriture."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4940
+#: ../src/gui/application/RosegardenGUIApp.cpp:4952
+msgid "Exporting Csound score file..."
+msgstr "Exportation en partition Csound..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4972
+#: ../src/gui/application/RosegardenGUIApp.cpp:4985
+msgid "Exporting Mup file..."
+msgstr "Exportation en Fichier MUP..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4975
+msgid "Mup files\n"
+msgstr "Fichiers MUP\n"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5005
+#: ../src/gui/application/RosegardenGUIApp.cpp:5089
+#: ../src/gui/editors/notation/NotationView.cpp:4719
+msgid "Exporting LilyPond file..."
+msgstr "Exportation en Fichier Lilypond..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5008
+msgid "LilyPond files"
+msgstr "Fichiers Lilypond"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5023
+#: ../src/gui/editors/notation/NotationView.cpp:4653
+msgid "Printing LilyPond file..."
+msgstr "Impression d'un Fichier Lilypond..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5028
+#: ../src/gui/application/RosegardenGUIApp.cpp:5052
+#: ../src/gui/editors/notation/NotationView.cpp:4658
+#: ../src/gui/editors/notation/NotationView.cpp:4682
+msgid "Failed to open a temporary file for LilyPond export."
+msgstr ""
+"Échec de l'ouverture d'un fichier temporaire pour l'exportation vers "
+"LilyPond."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5047
+#: ../src/gui/editors/notation/NotationView.cpp:4677
+msgid "Previewing LilyPond file..."
+msgstr "Prévisualisation d'un Fichier Lilypond..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5080
+#: ../src/gui/editors/notation/NotationView.cpp:4710
+msgid "LilyPond Preview Options"
+msgstr "Options de Prévisualisation Lilypond"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5081
+#: ../src/gui/editors/notation/NotationView.cpp:4711
+msgid "LilyPond preview options"
+msgstr "Options de prévisualisation Lilypond"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5112
+#: ../src/gui/application/RosegardenGUIApp.cpp:5126
+msgid "Exporting MusicXML file..."
+msgstr "Exportation en fichier MusicXML..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5115
+msgid "XML files"
+msgstr "Fichiers XML"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5289
+#: ../src/gui/editors/segment/TrackButtons.cpp:417
+msgid ""
+"The audio file path does not exist or is not writable.\n"
+"Please set the audio file path to a valid directory in Document Properties "
+"before recording audio.\n"
+"Would you like to set it now?"
+msgstr ""
+"Le chemin du fichier audio n'existe pas ou ne peut pas être écrit.\n"
+"Veuillez déclarer un répertoire valide comme chemin du fichier audio dans "
+"les Paramètres du Document avant d'enregistrer en audio.\n"
+"Souhaitez vous le faire tout de suite ?"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5337
+msgid ""
+"The audio file path does not exist or is not writable.\n"
+"Please set the audio file path to a valid directory in Document Properties "
+"before you start to record audio.\n"
+"Would you like to set it now?"
+msgstr ""
+"Le chemin du fichier audio n'existe pas ou ne peut pas être écrit.\n"
+"Veuillez déclarer un répertoire valide comme chemin du fichier audio dans "
+"les Paramètres du Document avant d'enregistrer en audio.\n"
+"Souhaitez vous le faire tout de suite ?"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5780
+msgid "Move playback pointer to time"
+msgstr "Mettre le pointeur d'exécution à un temps donné"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5793
+#: ../src/gui/editors/matrix/MatrixView.cpp:2240
+msgid "%1%"
+msgstr "%1%"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5861
+#, c-format
+msgid "Replace Tempo Change at %1"
+msgstr "Remplacer le changement de tempo à %1"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5891
+msgid "Set Global and Default Tempo"
+msgstr "Régler les tempos global et par défaut"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5914
+msgid "Move Tempo Change"
+msgstr "Déplacer un changement de tempo"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5949
+msgid "new marker"
+msgstr "nouveau marqueur"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5950
+msgid "no description"
+msgstr "pas de description"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:6363
+#, c-format
+msgid "Sequencer failed to add audio file %1"
+msgstr "Échec du séquenceur pour l'ajout du fichier audio %1"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:6388
+#, c-format
+msgid "Sequencer failed to remove audio file id %1"
+msgstr "Échec du séquenceur pour enlever l'identification du fichier audio %1"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:6448
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:1086
+msgid "Modify Segment label"
+msgstr "Modifier l'étiquette de segment"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:6450
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:1088
+msgid "Modify Segments label"
+msgstr "Modifier les étiquettes de segment"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:6452
+msgid "Relabelling selection..."
+msgstr "Étiqueter la sélection..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7539
+msgid "Play List"
+msgstr "Jouer la liste"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7567
+msgid "http://rosegarden.sourceforge.net/tutorial/en/chapter-0.html"
+msgstr "http://rosegarden.sourceforge.net/tutorial/en/chapter-0.html"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7574
+msgid "http://rosegarden.sourceforge.net/tutorial/bug-guidelines.html"
+msgstr "http://rosegarden.sourceforge.net/tutorial/bug-guidelines.html"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7650
+msgid "Queueing MIDI panic events for tranmission..."
+msgstr "Insertion d'événements MIDI \"panique\" pour transmission..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7708
+msgid "Are you sure you want to save this as your default studio?"
+msgstr ""
+"Confirmez-vous l'enregistrement de ceci en tant que studio par défaut ?"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7713
+msgid "Saving current document as default studio..."
+msgstr "Enregistrement du Studio par défaut..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7738
+msgid ""
+"Are you sure you want to import your default studio and lose the current one?"
+msgstr ""
+"Confirmez-vous l'importation du studio par défaut et la perte du studio "
+"courant?"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7773
+msgid "Import Studio from File"
+msgstr "Importer le studio depuis un fichier"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7807
+msgid "Import Studio"
+msgstr "Importer un studio"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:8015
+msgid ""
+"<h3>Newer version available</h3><p>A newer version of Rosegarden may be "
+"available.<br>Please consult the <a href=\"http://www.rosegardenmusic.com/"
+"getting/\">Rosegarden website</a> for more information.</p>"
+msgstr ""
+"<h3>Nouvelle version disponible </h3><p>Une version plus récente de "
+"Rosegarden est peut-être disponible. <br>Pour plus d'information, veuillez "
+"consulter le site WEB de Rosegarden <a href=\"http://www.rosegardenmusic.com/"
+"getting/\">Rosegarden website</a>.</p>"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:8016
+msgid "Newer version available"
+msgstr "Nouvelle version disponible"
+
+#: ../src/gui/application/RosegardenApplication.cpp:104
+#, c-format
+msgid "Failed to load soundfont %1"
+msgstr "Échec lors du chargement de la soundfont %1"
+
+#: ../src/gui/application/main.cpp:311
+msgid "Rosegarden - A sequencer and musical notation editor"
+msgstr "Rosegarden - Un éditeur de partitions et séquenceur"
+
+#: ../src/gui/application/main.cpp:315
+msgid "Don't use the sequencer (support editing only)"
+msgstr "Ne pas utiliser le séquenceur"
+
+#: ../src/gui/application/main.cpp:316
+msgid "Don't show the splash screen"
+msgstr "Ne pas afficher le splash screen"
+
+#: ../src/gui/application/main.cpp:317
+msgid "Don't automatically run in the background"
+msgstr "Ne pas s'exécuter automatiquement en arrière-plan"
+
+#: ../src/gui/application/main.cpp:318
+msgid "Attach to a running sequencer process, if found"
+msgstr "Attacher au processus du séquenceur, si celui-ci est trouvé"
+
+#: ../src/gui/application/main.cpp:319
+msgid "Ignore installed version - for devs only"
+msgstr "Ignorer la version installée - pour les développeurs seulement"
+
+#: ../src/gui/application/main.cpp:320
+msgid "file to open"
+msgstr "Fichier à ouvrir"
+
+#: ../src/gui/application/main.cpp:370
+msgid "Installation contains the wrong version of Rosegarden."
+msgstr "La version installée de Rosegarden ne correspond pas."
+
+#: ../src/gui/application/main.cpp:371
+msgid ""
+" The wrong versions of Rosegarden's data files were\n"
+" found in the standard KDE installation directories.\n"
+" (I am %1, but the installed files are for version %2.)\n"
+"\n"
+" This may mean one of the following:\n"
+"\n"
+" 1. This is a new upgrade of Rosegarden, and it has not yet been\n"
+" installed. If you compiled it yourself, check that you have\n"
+" run \"make install\" and that the procedure completed\n"
+" successfully.\n"
+"\n"
+" 2. The upgrade was installed in a non-standard directory,\n"
+" and an old version was found in a standard directory. If so,\n"
+" you will need to add the correct directory to your KDEDIRS\n"
+" environment variable before you can run it."
+msgstr ""
+" Des versions incorrectes des fichiers auxiliaires \n"
+" de Rosegarden ont été trouvées dans les répertoires\n"
+" d'installation standards de KDE.\n"
+" (Je suis %1, mais les fichiers installés sont pour la version %2.)\n"
+"\n"
+"Ceci peut avoir l'une des causes suivantes :\n"
+" \n"
+" 1. Ceci est une nouvelle mise à jour de Rosegarden, et\n"
+" elle n'a pas encore été installée. Si vous l'avez compilée\n"
+" vous-même, vérifiez que vous avec bien exécuté \"make install\"\n"
+" et que cette procédure s'est terminée correctement.\n"
+"\n"
+" 2. La mise à jour a été installée dans un répertoire non\n"
+" standard, et une ancienne version a été trouvée dans\n"
+" le répertoire standard. Si c'est le cas, vous devrez ajouter\n"
+" le chemin de ce répertoire non standard dans la variable\n"
+" d'environnement KDEDIRS avant de pouvoir exécuter Rosegarden."
+
+#: ../src/gui/application/main.cpp:383 ../src/gui/application/main.cpp:401
+msgid "Installation problem"
+msgstr "Problème d'installation"
+
+#: ../src/gui/application/main.cpp:389
+msgid "Rosegarden does not appear to have been installed."
+msgstr "Rosegarden ne semble pas être installé."
+
+#: ../src/gui/application/main.cpp:390
+msgid ""
+" One or more of Rosegarden's data files could not be\n"
+" found in the standard KDE installation directories.\n"
+"\n"
+" This may mean one of the following:\n"
+"\n"
+" 1. Rosegarden has not been correctly installed. If you compiled\n"
+" it yourself, check that you have run \"make install\" and that\n"
+" the procedure completed successfully.\n"
+"\n"
+" 2. Rosegarden has been installed in a non-standard directory,\n"
+" and you need to add this directory to your KDEDIRS environment\n"
+" variable before you can run it. This may be the case if you\n"
+" installed into $HOME or a local third-party package directory\n"
+" like /usr/local or /opt."
+msgstr ""
+"Un ou plusieurs fichiers auxiliaires de Rosegarden\n"
+"n'ont pas été trouvés dans les répertoires d'installation\n"
+"standards de KDE.\n"
+"\n"
+"Ceci peut avoir l'une des causes suivantes :\n"
+"\n"
+" 1. Rosegarden n'a pas été correctement installé.\n"
+" Si vous l'avez compilé vous-même, vérifiez que\n"
+" vous avec bien exécuté la commande \"make install\"\n"
+" et que cette commande s'est terminée correctement.\n"
+"\n"
+" 2. Rosegarden a été installé dans un répertoire non standard,\n"
+" et vous devez alors ajouter ce répertoire dans votre variable\n"
+" d'environnement KDEDIRS. C'est peut-être le cas si vous\n"
+" avez effectué l'installation dans $HOME ou dans un répertoire\n"
+" local pour applications tierces, comme /usr/local ou /opt."
+
+#: ../src/gui/application/main.cpp:414
+msgid "Rosegarden"
+msgstr "Rosegarden"
+
+#: ../src/gui/application/main.cpp:416
+msgid ""
+"Copyright 2000 - 2008 Guillaume Laurent, Chris Cannam, Richard Bown\n"
+"Parts copyright 1994 - 2004 Chris Cannam, Andy Green, Richard Bown, "
+"Guillaume Laurent\n"
+"LilyPond fonts copyright 1997 - 2005 Han-Wen Nienhuys and Jan Nieuwenhuizen"
+msgstr ""
+"Copyright 2000 - 2008 Guillaume Laurent, Chris Cannam, Richard Bown\n"
+"Parts copyright 1994 - 2004 Chris Cannam, Andy Green, Richard Bown, "
+"Guillaume Laurent\n"
+"Lilypond fonts copyright 1997 - 2005 Han-Wen Nienhuys and Jan Nieuwenhuizen"
+
+#: ../src/gui/application/main.cpp:428
+msgid "Chord labelling code"
+msgstr "Nom des accords"
+
+#: ../src/gui/application/main.cpp:429
+msgid ""
+"LilyPond output\n"
+"assorted other patches\n"
+"i18n-ization"
+msgstr ""
+"sortie Lilypond\n"
+"assortiment d'autres patches\n"
+"i18n-ization"
+
+#: ../src/gui/application/main.cpp:430
+msgid ""
+"UI improvements\n"
+"bug fixes"
+msgstr ""
+"améliorations de l'interface utilisateur\n"
+"corrections de bogues"
+
+#: ../src/gui/application/main.cpp:431
+msgid ""
+"Segment colours\n"
+"Other UI and bug fixes"
+msgstr ""
+"Coloration des segments\n"
+"Autre interface utilisateur et correction de bogues"
+
+#: ../src/gui/application/main.cpp:432
+msgid ""
+"Russian translation\n"
+"i18n-ization"
+msgstr ""
+"traduction russe\n"
+"i18n-ization"
+
+#: ../src/gui/application/main.cpp:433 ../src/gui/application/main.cpp:434
+msgid "German translation"
+msgstr "Traduction allemande"
+
+#: ../src/gui/application/main.cpp:435
+msgid "Welsh translation"
+msgstr "traduction en gallois"
+
+#: ../src/gui/application/main.cpp:436
+msgid "French translation"
+msgstr "Traduction française"
+
+#: ../src/gui/application/main.cpp:437
+msgid ""
+"French translation\n"
+"Bug fixes"
+msgstr ""
+"Traduction française\n"
+"Correction de bogues"
+
+#: ../src/gui/application/main.cpp:438 ../src/gui/application/main.cpp:439
+msgid "Italian translation"
+msgstr "Traduction italienne"
+
+#: ../src/gui/application/main.cpp:440 ../src/gui/application/main.cpp:441
+msgid "Swedish translation"
+msgstr "Traduction suédoise"
+
+#: ../src/gui/application/main.cpp:442
+msgid "Estonian translation"
+msgstr "Traduction estonienne"
+
+#: ../src/gui/application/main.cpp:443 ../src/gui/application/main.cpp:444
+msgid "Dutch translation"
+msgstr "traduction hollandaise"
+
+#: ../src/gui/application/main.cpp:445
+msgid "HSpinBox class"
+msgstr "HSpinBox class"
+
+#: ../src/gui/application/main.cpp:446
+msgid "Transposition by interval"
+msgstr "Transposition par intervalle"
+
+#: ../src/gui/application/main.cpp:447
+msgid "Original designs for rotary controllers"
+msgstr "Design original des potentiomètres"
+
+#: ../src/gui/application/main.cpp:448
+msgid "Japanese translation"
+msgstr "Traduction japonaise"
+
+#: ../src/gui/application/main.cpp:449
+msgid ""
+"Auto-scroll deceleration\n"
+"Rests outside staves and other bug fixes"
+msgstr ""
+"Décélération du défilement automatique\n"
+"Silences en dehors des portées et autres corrections de bogues"
+
+#: ../src/gui/application/main.cpp:450
+msgid "Simplified Chinese translation"
+msgstr "Traduction en chinois simplifié"
+
+#: ../src/gui/application/main.cpp:451
+msgid "LIRC infrared remote-controller support"
+msgstr "Support de la télécommande infra-rouge LIRC"
+
+#: ../src/gui/application/main.cpp:452
+msgid "MTC slave timing implementation"
+msgstr "Synchronisation MTC (MIDI Time Code) esclave"
+
+#: ../src/gui/application/main.cpp:453
+msgid "Czech translation"
+msgstr "Traduction tchèque"
+
+#: ../src/gui/application/main.cpp:454
+msgid "SCons/bksys building system"
+msgstr "Système de génération SCons/bksys"
+
+#: ../src/gui/application/main.cpp:455
+msgid "icons, icons, icons"
+msgstr "icônes, icônes, icônes"
+
+#: ../src/gui/application/main.cpp:456 ../src/gui/application/main.cpp:457
+#: ../src/gui/application/main.cpp:458 ../src/gui/application/main.cpp:459
+msgid "Spanish translation"
+msgstr "Traduction espagnole"
+
+#: ../src/gui/application/main.cpp:460 ../src/gui/application/main.cpp:461
+msgid "Catalan translation"
+msgstr "Traduction catalane"
+
+#: ../src/gui/application/main.cpp:462
+msgid ""
+"1.2.3 splash screen photo\n"
+"Gave birth to D. Michael McIntyre, bought him a good flute once\n"
+"upon a time, and always humored him when he came over to play her\n"
+"some new instrument, even though she really hated his playing.\n"
+"Born October 19, 1951, died September 21, 2007, R. I. P."
+msgstr ""
+"Photo de l'écran d'accueil 1.2.3\n"
+"Elle donna la vie à D. Michael McIntyre, lui acheta une fois une bonne\n"
+"flûte, et a toujours montré du plaisir quand il lui jouait de quelque\n"
+"nouvel instrument, même si, en réalité, elle ne supportait pas sa\n"
+"façon de jouer.\n"
+"Née le 19 octobre 1951, décédée le 21 septembre 2007,\n"
+"qu'elle repose en paix."
+
+#: ../src/gui/application/main.cpp:463
+msgid "Initial guitar chord editing code"
+msgstr "Code initial de l'éditeur d'accords pour guitare"
+
+#: ../src/gui/application/main.cpp:464
+msgid "Polish translation"
+msgstr "Traduction polonaise"
+
+#: ../src/gui/application/main.cpp:465
+msgid "Basque translation"
+msgstr "Traduction basque"
+
+#: ../src/gui/application/main.cpp:466
+msgid "Klearlook theme"
+msgstr "thème Klearlook"
+
+#: ../src/_translatorinfo.cpp:1 ../src/gui/application/main.cpp:468
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr "Guillaume Laurent - Didier Burli"
+
+#: ../src/_translatorinfo.cpp:3 ../src/gui/application/main.cpp:468
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+
+#: ../src/gui/application/main.cpp:719
+msgid "Welcome!"
+msgstr "Bienvenue !"
+
+#: ../src/gui/application/main.cpp:731
+msgid ""
+"<h2>Welcome to Rosegarden!</h2><p>Welcome to the Rosegarden audio and MIDI "
+"sequencer and musical notation editor.</p><ul><li>If you have not already "
+"done so, you may wish to install some DSSI synth plugins, or a separate "
+"synth program such as QSynth. Rosegarden does not synthesize sounds from "
+"MIDI on its own, so without these you will hear nothing.</"
+"li><br><br><li>Rosegarden uses the JACK audio server for recording and "
+"playback of audio, and for playback from DSSI synth plugins. These features "
+"will only be available if the JACK server is running.</"
+"li><br><br><li>Rosegarden has comprehensive documentation: see the Help menu "
+"for the handbook, tutorials, and other information!</li></ul><p>Rosegarden "
+"was brought to you by a team of volunteers across the world. To learn more, "
+"go to <a href=\"http://www.rosegardenmusic.com/\">http://www.rosegardenmusic."
+"com/</a>.</p>"
+msgstr ""
+"<h2>Bienvenue dans Rosegarden!</h2><p>Bienvenue dans le séquenceur audio et "
+"MIDI et dans l'éditeur de notation musicale Rosegarden.</p><ul><li>Si vous "
+"ne l'avez pas déjà fait, vous devriez installer un greffon synthétiseur DSSI "
+"ou un logiciel synthétiseur autonome comme QSynth. Rosegarden seul ne peut "
+"pas faire la synthèse d'un son à partir d'une donnée MIDI. Sans ces "
+"logiciels additionnels, vous ne pourrez donc rien entendre.</"
+"li><br><br><li>Rosegarden utilise le serveur audio JACK pour "
+"l'enregistrement et la reproduction sonore et pour transmettre les sons "
+"issus des greffons synthétiseurs DSSI. Ces fonctionnalités ne seront "
+"disponibles que si le serveur JACK est actif.</li><br><br><li>Rosegarden "
+"dispose d'une documentation générale: utiliser le menu \"Aide\" pour "
+"consulter le\"handbook\", le tutoriel et d'autres informations!</li></"
+"ul><p>Rosegarden a été développé pour vous par une équipe de volontaires "
+"venant du monde entier. Pour en savoir plus, aller sur <a href=\"http://www."
+"rosegardenmusic.com/\">http://www.rosegardenmusic.com/</a>.</p>"
+
+#: ../src/gui/application/RosegardenGUIView.cpp:257
+msgid "No non-audio segments in composition"
+msgstr "Aucun segment non-audio dans la composition"
+
+#: ../src/gui/application/RosegardenGUIView.cpp:333
+msgid "Selection must contain only audio or non-audio segments"
+msgstr ""
+"La sélection ne doit contenir que des segments audio ou que des segments non-"
+"audio"
+
+#: ../src/gui/application/RosegardenGUIView.cpp:431
+#: ../src/gui/application/RosegardenGUIView.cpp:576
+#: ../src/gui/application/RosegardenGUIView.cpp:612
+#: ../src/gui/application/RosegardenGUIView.cpp:776
+msgid "No non-audio segments selected"
+msgstr "Aucun segment non-audio sélectionné"
+
+#: ../src/gui/application/RosegardenGUIView.cpp:851
+msgid ""
+"You've not yet defined an audio editor for Rosegarden to use.\n"
+"See Settings -> Configure Rosegarden -> Audio."
+msgstr ""
+"Vous n'avez pas encore défini un éditeur audio pour Rosegarden.\n"
+"Voir : Configuration -> Configurer Rosegarden -> Audio."
+
+#: ../src/gui/application/RosegardenGUIView.cpp:1559
+#: ../src/gui/application/RosegardenGUIView.cpp:1564
+msgid "Can't add dropped file. "
+msgstr "Ne peut pas ajouter le fichier. "
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1014
+#: ../src/gui/seqmanager/SequenceManager.cpp:1150
+msgid ""
+"The JACK Audio subsystem has failed or it has stopped Rosegarden from "
+"processing audio.\n"
+"Please restart Rosegarden to continue working with audio.\n"
+"Quitting other running applications may improve Rosegarden's performance."
+msgstr ""
+"Le sous-système JACK audio s'est arrêté où empêche Rosegarden de traiter "
+"l'audio.\n"
+"Veuillez redémarrer Rosegarden pour continuer à travailler avec l'audio.\n"
+"Si d'autres applications sont actuellement en fonctionnement, les arrêter "
+"peut améliorer les performances de Rosegarden."
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1020
+#: ../src/gui/seqmanager/SequenceManager.cpp:1156
+msgid ""
+"The JACK Audio subsystem has stopped Rosegarden from processing audio, "
+"probably because of a processing overload.\n"
+"An attempt to restart the audio service has been made, but some problems may "
+"remain.\n"
+"Quitting other running applications may improve Rosegarden's performance."
+msgstr ""
+"Le sous-système JACK audio à cessé de traiter l'audio pour Rosegarden, "
+"vraisemblablement en raison d'une surcharge du processeur.\n"
+"Une tentative pur redémarrer le service audio a été faite, mais certains "
+"problèmes peuvent subsister.\n"
+"Si d'autres applications sont actuellement en fonctionnement, les arrêter "
+"peut améliorer les performances de Rosegarden."
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1031
+msgid ""
+"Run out of processor power for real-time audio processing. Cannot continue."
+msgstr ""
+"Le processeur ne dispose plus d'assez de puissance pour effectuer en temps "
+"réel le traitement audio demandé. Impossible de continuer."
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1057
+msgid ""
+"A serious error has occurred in the ALSA MIDI subsystem. It may not be "
+"possible to continue sequencing. Please check console output for more "
+"information."
+msgstr ""
+"Une erreur importante s'est produite dans le sous-système MIDI d'ALSA. Il "
+"se peut que le fonctionnement du séquenceur ne soit plus possible. Veuillez "
+"consulter la sortie console pour obtenir davantage d'information."
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1078
+msgid "JACK Audio subsystem is losing sample frames."
+msgstr "Le sous-système JACK audio perd des samples."
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1096
+msgid ""
+"Failed to read audio data from disc in time to service the audio subsystem."
+msgstr ""
+"La lecture des données audio depuis le disque n'est pas assez rapide pour le "
+"sous-système audio."
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1100
+msgid ""
+"Failed to write audio data to disc fast enough to service the audio "
+"subsystem."
+msgstr ""
+"L'écriture des données audio du disque n'est pas assez rapide pour le sous-"
+"système audio."
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1104
+msgid "The audio mixing subsystem is failing to keep up."
+msgstr "Le sous-système mélangeur audio a subi une défaillance."
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1108
+msgid "The audio subsystem is failing to keep up."
+msgstr "Le sous-système audio a subi une défaillance."
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1112
+msgid "Unknown sequencer failure mode!"
+msgstr "Mode d'erreur du séquenceur inconnu!"
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1170
+msgid ""
+"<h3>System timer resolution is too low</h3><p>Rosegarden was unable to find "
+"a high-resolution timing source for MIDI performance.</p><p>This may mean "
+"you are using a Linux system with the kernel timer resolution set too low. "
+"Please contact your Linux distributor for more information.</p><p>Some Linux "
+"distributors already provide low latency kernels, see <a href=\"http://"
+"rosegarden.wiki.sourceforge.net/Low+latency+kernels\">http://rosegarden.wiki."
+"sourceforge.net/Low+latency+kernels</a> for instructions.</p>"
+msgstr ""
+"<h3>La résolution de l'horloge système est trop basse</h3><p>Rosegarden n'a "
+"pas pu trouver d'horloge haute résolution pour l'interprétation MIDI.</p><p> "
+"Ceci peut être dû à l'utilisation d'un système Linux dont le timer noyau est "
+"paramétré avec une résolution trop faible. Veuillez contacter votre "
+"distributeur Linux pour davantage d'information. </p><p>Certains "
+"distributeurs Linux fournissent déjà des noyaux à faible latence, voir <a "
+"href=\"http://rosegarden.wiki.sourceforge.net/Low+latency+kernels\">http://"
+"rosegarden.wiki.sourceforge.net/Low+latency+kernels</a>.</p>"
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1188
+msgid ""
+"<h3>System timer resolution is too low</h3><p>Rosegarden was unable to find "
+"a high-resolution timing source for MIDI performance.</p><p>You may be able "
+"to solve this problem by loading the RTC timer kernel module. To do this, "
+"try running <b>sudo modprobe snd-rtctimer</b> in a terminal window and then "
+"restarting Rosegarden.</p><p>Alternatively, check whether your Linux "
+"distributor provides a multimedia-optimized kernel. See <a href=\"http://"
+"rosegarden.wiki.sourceforge.net/Low+latency+kernels\">http://rosegarden.wiki."
+"sourceforge.net/Low+latency+kernels</a> for notes about this.</p>"
+msgstr ""
+"<h3>La résolution de l'horloge système est trop basse</h3><p>Rosegarden n'a "
+"pas pu trouver d'horloge haute résolution pour l'interprétation MIDI.</p><p> "
+"Vous pouvez peut-être résoudre ce problème en chargeant le module noyau RTC "
+"timer. Pour faire ceci, essayez d'exécuter dans la fenêtre d'un terminal la "
+"commande <b>sudo modprobe snd-rtctimer</b>, puis relancez Rosegarden.</"
+"p><p>Alternativement, regardez si votre distributeur Linux fournit un noyau "
+"optimisé pour le multimedia. Quelques informations sur ce sujet peuvent "
+"être trouvées à <a href=\"http://rosegarden.wiki.sourceforge.net/Low+latency"
+"+kernels\">http://rosegarden.wiki.sourceforge.net/Low+latency+kernels</a>.</"
+"p> http://rosegarden.wiki.sourceforge.net/Low+latency+kernels</a>.</p>"
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1312
+msgid ""
+"<p>Both MIDI and Audio subsystems have failed to initialize.</p><p>You may "
+"continue without the sequencer, but we suggest closing Rosegarden, running "
+"\"alsaconf\" as root, and starting Rosegarden again. If you wish to run "
+"with no sequencer by design, then use \"rosegarden --nosequencer\" to avoid "
+"seeing this error in the future.</p>"
+msgstr ""
+"<p>Aucun des deux sous-systèmes MIDI et Audio n'a réussi à s'initialiser.</"
+"p><p>Vous pouvez continuer sans le séquenceur , mais nous vous suggérons "
+"plutôt d'arrêter Rosegarden, d'exécuter \"alsaconf\" en tant que root, puis "
+"de redémarrer Rosegarden. Si, pour éviter cette erreur, vous souhaitez "
+"faire fonctionner Rosegarden sans séquenceur, utilisez alors la commande "
+"\"rosegarden --nosequencer\".</p>"
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1314
+msgid ""
+"<p>The MIDI subsystem has failed to initialize.</p><p>You may continue "
+"without the sequencer, but we suggest closing Rosegarden, running \"modprobe "
+"snd-seq-midi\" as root, and starting Rosegarden again. If you wish to run "
+"with no sequencer by design, then use \"rosegarden --nosequencer\" to avoid "
+"seeing this error in the future.</p>"
+msgstr ""
+"<p>Le sous-système MIDI n'a pas réussi à s'initialiser.</p><p>Vous pouvez "
+"continuer sans le séquenceur , mais nous vous suggérons plutôt d'arrêter "
+"Rosegarden, d'exécuter \"modprobe snd-seq-midi\" en tant que root, puis de "
+"redémarrer Rosegarden. Si, pour éviter cette erreur, vous souhaitez faire "
+"fonctionner Rosegarden sans séquenceur, utilisez alors la commande "
+"\"rosegarden --nosequencer\".</p>"
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1316
+msgid ""
+"<p>The Rosegarden sequencer module version does not match the GUI module "
+"version.</p><p>You have probably mixed up files from two different versions "
+"of Rosegarden. Please check your installation.</p>"
+msgstr ""
+"<p>La version du module séquenceur de Rosegarden ne correspond pas à celle "
+"du module interface utilisateur.</p><p>Vous avez sans doute mélangé des "
+"fichiers provenant de deux versions différentes de Rosegarden. Veuillez "
+"vérifier votre installation.</p>"
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1322
+#, c-format
+msgid "<h3>Sequencer startup failed</h3>%1"
+msgstr "<h3>Le démarrage du séquenceur a échoué</h3>%1"
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1330
+msgid ""
+"<h3>Failed to connect to JACK audio server.</h3><p>Rosegarden could not "
+"connect to the JACK audio server. This probably means the JACK server is "
+"not running.</p><p>If you want to be able to play or record audio files or "
+"use plugins, you should exit Rosegarden and start the JACK server before "
+"running Rosegarden again.</p>"
+msgstr ""
+"<h3>La connexion au serveur audio JACK a échouée.</h3><p>Rosegarden ne peut "
+"pas se connecter au serveur audio JACK. Ceci signifie vraisemblablement que "
+"le serveur JACK n'est pas en fonctionnement.</p><p>Si vous souhaitez jouer "
+"ou enregistrer des fichiers audio ou utiliser des greffons (plugins), vous "
+"devriez arrêter Rosegarden puis démarrer le serveur audio JACK avant de "
+"relancer Rosegarden.</p>"
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1331
+msgid "Failed to connect to JACK"
+msgstr "La connexion à JACK a échoué"
+
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:46
+msgid "Modify MIDI filters..."
+msgstr "Modifier Filtres MIDI..."
+
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:58
+msgid "THRU events to ignore"
+msgstr "Événements THRU à ignorer"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:131
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:60
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:96
+msgid "Note"
+msgstr "Note"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:132
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:61
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:97
+msgid "Program Change"
+msgstr "Changement de programme"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:136
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:62
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:98
+msgid "Key Pressure"
+msgstr "Pression de touche"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:137
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:63
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:99
+msgid "Channel Pressure"
+msgstr "Pression de canal"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:134
+#: ../src/gui/general/EditView.cpp:899
+#: ../src/gui/rulers/ControllerEventsRuler.cpp:198
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:64
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:100
+msgid "Pitch Bend"
+msgstr "Modifier la hauteur"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:133
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:65
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:101
+msgid "Controller"
+msgstr "Contrôleur"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:135
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:66
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:102
+msgid "System Exclusive"
+msgstr "Sytem exclusif"
+
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:94
+msgid "RECORD events to ignore"
+msgstr "Évènements d'enregistrement à ignorer"
+
+#: ../src/gui/widgets/TimeWidget.cpp:101
+msgid "Note:"
+msgstr "Note:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:108 ../src/gui/widgets/TimeWidget.cpp:145
+msgid "<inexact>"
+msgstr "<inexacte>"
+
+#: ../src/gui/widgets/TimeWidget.cpp:151
+msgid "Units:"
+msgstr "Unités:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:173
+msgid "Time:"
+msgstr "Temps:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:184
+msgid "units"
+msgstr "unités"
+
+#: ../src/gui/widgets/TimeWidget.cpp:193
+msgid "Measures:"
+msgstr "Mesures:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:193
+msgid "Measure:"
+msgstr "Mesure:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:212
+msgid "beats:"
+msgstr "pulsations:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:212
+msgid "beat:"
+msgstr "pulsation:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:230
+msgid "%1:"
+msgstr "%1:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:254
+msgid "Seconds:"
+msgstr "Secondes:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:273
+msgid "msec:"
+msgstr "msec:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:407 ../src/gui/widgets/TimeWidget.cpp:531
+msgid "(%1/%2 time)"
+msgstr "(%1/%2 temps)"
+
+#: ../src/gui/widgets/TimeWidget.cpp:452
+msgid "(starting %1.%2 qpm, %2.%3 bpm)"
+msgstr "(début %1.%2 qpm, %2.%3 bpm)"
+
+#: ../src/gui/widgets/TimeWidget.cpp:458
+msgid "(starting %1.%2 bpm)"
+msgstr "(début %1.%2 bpm)"
+
+#: ../src/gui/widgets/TimeWidget.cpp:464
+msgid "(%1.%2 qpm, %2.%3 bpm)"
+msgstr "(%1.%2 qpm, %2.%3 bpm)"
+
+#: ../src/gui/widgets/TimeWidget.cpp:470
+msgid "(%1.%2 bpm)"
+msgstr "(%1.%2 bpm)"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:239
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:60
+msgid "C"
+msgstr "Do"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:241
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:61
+msgid "D"
+msgstr "Ré"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:243
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:62
+msgid "E"
+msgstr "Mi"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:244
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:63
+msgid "F"
+msgstr "Fa"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:246
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:64
+msgid "G"
+msgstr "Sol"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:248
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:65
+msgid "A"
+msgstr "La"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:250
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:66
+msgid "B"
+msgstr "Si"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:70
+msgid "-2"
+msgstr "-2"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:71
+msgid "-1"
+msgstr "-1"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:72
+msgid "0"
+msgstr "0"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:73
+msgid "1"
+msgstr "1"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:74
+msgid "2"
+msgstr "2"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:75
+msgid "3"
+msgstr "3"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:76
+msgid "4"
+msgstr "4"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:77
+msgid "5"
+msgstr "5"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:78
+msgid "6"
+msgstr "6"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:79
+msgid "7"
+msgstr "7"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:83
+msgid "double flat"
+msgstr "double bémol"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:84
+msgid "flat"
+msgstr "bémol"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:85
+msgid "natural"
+msgstr "naturel"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:86
+msgid "sharp"
+msgstr "dièse"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:87
+msgid "double sharp"
+msgstr "double dièse"
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:234
+#, c-format
+msgid "In %1"
+msgstr "E %1"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:587
+#: ../src/gui/widgets/AudioRouteMenu.cpp:236
+#: ../src/gui/widgets/AudioRouteMenu.cpp:259
+msgid "Master"
+msgstr "Maître"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:528
+#: ../src/gui/widgets/AudioRouteMenu.cpp:238
+#: ../src/gui/widgets/AudioRouteMenu.cpp:261
+#, c-format
+msgid "Sub %1"
+msgstr "Sous %1"
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:244
+msgid "In %1 R"
+msgstr "E %1 D"
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:245
+msgid "In %1 L"
+msgstr "E %1 G"
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:247
+msgid "Master R"
+msgstr "Maître D"
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:248
+msgid "Master L"
+msgstr "Maître G"
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:250
+msgid "Sub %1 R"
+msgstr "Sous %1 D"
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:251
+msgid "Sub %1 L"
+msgstr "Sous %1 G"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:391
+#: ../src/gui/studio/AudioMixerWindow.cpp:522
+#: ../src/gui/widgets/AudioFaderBox.cpp:82
+msgid "Audio plugin button"
+msgstr "Bouton de module externe audio"
+
+#: ../src/gui/editors/parameters/AudioInstrumentParameterPanel.cpp:129
+#: ../src/gui/editors/parameters/AudioInstrumentParameterPanel.cpp:357
+#: ../src/gui/widgets/AudioFaderBox.cpp:91
+msgid "<no synth>"
+msgstr "<pas de synthétiseur>"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:93
+msgid "Synth plugin button"
+msgstr "Bouton de greffon synthétiseur"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:153
+msgid "Set the audio pan position in the stereo field"
+msgstr "Choisir la position de la balance Stéréo"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:155
+msgid "Open synth plugin's native editor"
+msgstr "Ouvrir l'éditeur natif de plugin synth"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:157
+msgid "Mono or Stereo Instrument"
+msgstr "Instrument mono ou stéréo"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:159
+msgid "Record level"
+msgstr "Niveau d'enregistrement"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:161
+msgid "Playback level"
+msgstr "Volume de sortie"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:345
+#: ../src/gui/studio/AudioMixerWindow.cpp:347
+#: ../src/gui/studio/AudioMixerWindow.cpp:503
+#: ../src/gui/studio/AudioMixerWindow.cpp:505
+#: ../src/gui/widgets/AudioFaderBox.cpp:163
+msgid "Audio level"
+msgstr "Niveau de l'audio"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:170
+msgid "In:"
+msgstr "Entrée:"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:173
+msgid "Out:"
+msgstr "Sortie:"
+
+#: ../src/gui/widgets/ProgressDialog.cpp:48
+#: ../src/gui/widgets/ProgressDialog.cpp:53
+#: ../src/gui/widgets/ProgressDialog.cpp:76
+msgid "Processing..."
+msgstr "Occupé..."
+
+#: ../src/gui/configuration/ColourConfigurationPage.h:60
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:130
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:346
+#: ../src/gui/widgets/ColourTable.cpp:52
+msgid "Color"
+msgstr "Couleur"
+
+#: ../src/gui/widgets/ColourTable.cpp:68
+msgid "Modify Color Name"
+msgstr "Modifier le nom de la couleur"
+
+#: ../src/gui/configuration/ColourConfigurationPage.cpp:129
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:983
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:882
+#: ../src/gui/widgets/ColourTable.cpp:68
+msgid "Enter new name"
+msgstr "Entrer le nouveau nom"
+
+#: ../src/gui/widgets/ColourTable.cpp:107
+msgid "Default Color"
+msgstr "Couleur par défaut"
+
+#: ../src/gui/widgets/Rotary.cpp:108
+msgid ""
+"Click and drag up and down or left and right to modify.\n"
+"Double click to edit value directly."
+msgstr ""
+"Cliquer et glisser de haut en bas ou de droite à gauche pour modifier.\n"
+"Doublecliquer pour éditer la valeur directement."
+
+#: ../src/gui/widgets/Rotary.cpp:433
+msgid "Select a new value"
+msgstr "Sélectionner une nouvelle valeur"
+
+#: ../src/gui/widgets/Rotary.cpp:434
+msgid "Enter a new value"
+msgstr "Entrer une nouvelle valeur"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:80
+msgid "Quantizer"
+msgstr "Quantifieur"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:86
+msgid "Quantizer type:"
+msgstr "Type de quantifieur:"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:88
+msgid "Grid quantizer"
+msgstr "Quantifieur grille"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:89
+msgid "Legato quantizer"
+msgstr "Quantifieur legato"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:90
+msgid "Heuristic notation quantizer"
+msgstr "Quantifieur de partition heuristique"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:94
+msgid "Quantize for notation only (leave performance unchanged)"
+msgstr "Quantifier pour la partition seulement (l'exécution reste inchangée)"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:104
+msgid "Notation parameters"
+msgstr "Paramètres de l'édition de partition"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:109
+#: ../src/gui/widgets/QuantizeParameters.cpp:150
+msgid "Base grid unit:"
+msgstr "Unité de base de la grille:"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:114
+msgid "Complexity:"
+msgstr "Complexité:"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:118
+msgid "Very high"
+msgstr "Très élevée"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:119
+msgid "High"
+msgstr "Élevée"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:224
+#: ../src/gui/widgets/QuantizeParameters.cpp:120
+msgid "Normal"
+msgstr "Normale"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:121
+msgid "Low"
+msgstr "Basse"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:122
+msgid "Very low"
+msgstr "Très basse"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:125
+msgid "Tuplet level:"
+msgstr "Niveau de groupement (N-olets):"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:129
+msgid "2-in-the-time-of-3"
+msgstr "2 sur le temps de 3"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4241
+#: ../src/gui/widgets/QuantizeParameters.cpp:130
+msgid "Triplet"
+msgstr "Triolet"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:138
+msgid "Any"
+msgstr "N'importe lequel"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:141
+msgid "Permit counterpoint"
+msgstr "Permettre le contrepoint"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:145
+msgid "Grid parameters"
+msgstr "Paramètres de la grille"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:154
+msgid "Swing:"
+msgstr "Swing:"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:159
+msgid "Iterative amount:"
+msgstr "Taux d'itérations:"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:165
+msgid "Quantize durations as well as start times"
+msgstr "Quantifier les durées ainsi que les instants de départ"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:169
+msgid "After quantization"
+msgstr "Après quantification"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:183
+msgid "Show advanced options"
+msgstr "Afficher les options avancées"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:192
+msgid "Re-beam"
+msgstr "Regrouper les croches"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:194
+msgid "Add articulations (staccato, tenuto, slurs)"
+msgstr "Ajouter des articulations (staccato, tenuto, liés)"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:195
+msgid "Tie notes at barlines etc"
+msgstr "Lier les notes entre les mesures etc"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:196
+msgid "Split-and-tie overlapping chords"
+msgstr "Séparer et lier les notes des accords qui se chevauchent"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:307
+msgid "Full quantize"
+msgstr "Quantification complète"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:450
+msgid "Show Advanced Options"
+msgstr "Afficher les options avancées"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:454
+msgid "Hide Advanced Options"
+msgstr "Cacher les options avancées"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:257
+#: ../src/gui/configuration/MatrixConfigurationPage.h:56
+#: ../src/gui/configuration/MatrixConfigurationPage.h:57
+#: ../src/gui/editors/matrix/MatrixView.cpp:2709
+msgid "Matrix"
+msgstr "la matrice"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:64
+msgid "Printable headers"
+msgstr "En-têtes imprimables"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:92
+msgid "Dedication"
+msgstr "Dédicace"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:96
+#: ../src/gui/editors/segment/PlayListView.cpp:35
+msgid "Title"
+msgstr "Titre"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:100
+msgid "Subtitle"
+msgstr "Sous-titre"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:104
+msgid "Subsubtitle"
+msgstr "Sous-sous-titre"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:108
+msgid "Poet"
+msgstr "Poète"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:116
+msgid "Composer"
+msgstr "Compositeur"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:120
+msgid "Meter"
+msgstr "Prosodie"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:124
+msgid "Arranger"
+msgstr "Arrangeur"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:128
+msgid "Piece"
+msgstr "Morceau"
+
+#: ../data/fonts/mappings/fonts.cpp:26
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:132
+msgid "Opus"
+msgstr "Opus"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:136
+msgid "Copyright"
+msgstr "Copyright"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:140
+msgid "Tagline"
+msgstr "Pied de page final"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:155
+msgid "The composition comes here."
+msgstr "La composition est placée ici."
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:172
+msgid "Non-printable headers"
+msgstr "En-têtes non imprimables"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:213
+msgid "Add New Property"
+msgstr "Nouvelle propriété"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:217
+msgid "Delete Property"
+msgstr "Effacer propriété"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:236
+msgid "{new property %1}"
+msgstr "{nouvelle propriété %1}"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:236
+msgid "{new property}"
+msgstr "{nouvelle propriété}"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:243
+msgid "{undefined}"
+msgstr "{indéfini}"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:87
+msgid "Double-click opens segment in"
+msgstr "Un double clic ouvre les segments avec"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:91
+msgid "Notation editor"
+msgstr "l'éditeur de partition"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:92
+msgid "Matrix editor"
+msgstr "l'éditeur matriciel"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:93
+msgid "Event List editor"
+msgstr "l'éditeur de liste d'événements"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:99
+msgid "Number of count-in measures when recording"
+msgstr "Nombre de mesures \"pour rien\" avant d'enregistrer"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:109
+msgid "Auto-save interval"
+msgstr "Fréquence des sauvegardes automatiques"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:112
+msgid "Every 30 seconds"
+msgstr "Toutes les 30 secondes"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:113
+msgid "Every minute"
+msgstr "Toutes les minutes"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:114
+msgid "Every five minutes"
+msgstr "Toutes les cinq minutes"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:115
+msgid "Every half an hour"
+msgstr "Toutes les demi-heures"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:116
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:277
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:157
+msgid "Never"
+msgstr "Jamais"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:140
+msgid "Use JACK transport"
+msgstr "Utiliser le \"transport\" JACK"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:173
+msgid "Unknown"
+msgstr "Inconnu"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:179
+msgid "No MIDI, audio OK"
+msgstr "Pas de MIDI, Audio OK"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:182
+msgid "MIDI OK, no audio"
+msgstr "MIDI OK, pas d'Audio"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:185
+msgid "MIDI OK, audio OK"
+msgstr "MIDI OK, audio OK"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:188
+msgid "No driver"
+msgstr "Pas de Driver"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:195
+msgid "Details..."
+msgstr "Détails..."
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:204
+msgid "Behavior"
+msgstr "Comportement"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:219
+msgid "Side-bar parameter box layout"
+msgstr "Disposition de la boîte des paramètres"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:223
+msgid "Vertically stacked"
+msgstr "Empilés verticalement"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:225
+msgid "Tabbed"
+msgstr "Utilisation d'onglets"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:233
+msgid "Note name style"
+msgstr "Style de nom des notes"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:237
+msgid "Always use US names (e.g. quarter, 8th)"
+msgstr "Utiliser toujours des noms US (ex. quarter, 8th)"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:238
+msgid "Localized (where available)"
+msgstr "Localisé (si disponible)"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:252
+msgid "Show textured background on"
+msgstr "Placer des textures sur le fond de"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:254
+msgid "Main window"
+msgstr "la fenêtre principale"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:275
+msgid "Use bundled Klearlook theme"
+msgstr "Utiliser le thème \"Klearlook\" incorporé"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:278
+msgid "When not running under KDE"
+msgstr "Quand KDE n'est pas utilisé"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:279
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:159
+msgid "Always"
+msgstr "Toujours"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:287
+msgid "Presentation"
+msgstr "Présentation"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:423
+msgid ""
+"Changes to the textured background in the main window will not take effect "
+"until you restart Rosegarden."
+msgstr ""
+"L'affichage d'une texture de fond dans la fenêtre principale ne sera "
+"effectif qu'au prochain redémarrage de Rosegarden."
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:168
+#: ../src/gui/configuration/GeneralConfigurationPage.h:78
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:207
+#: ../src/gui/configuration/MatrixConfigurationPage.cpp:59
+msgid "General"
+msgstr "Général"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.h:79
+msgid "General Configuration"
+msgstr "Configuration générale"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:92
+msgid "Base octave number for MIDI pitch display"
+msgstr "Numéro de l'octave de base pour l'affichage de la hauteur MIDI"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:107
+msgid "Always use default studio when loading files"
+msgstr ""
+"Toujours utiliser le studio par défaut lors de l'ouverture d'un fichier"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:119
+msgid "Send all MIDI Controllers at start of each playback"
+msgstr "Émettre tous les contrôleurs MIDI au début de chaque exécution"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:121
+msgid ""
+"Rosegarden can send all MIDI Controllers (Pan, Reverb etc) to all MIDI "
+"devices every\n"
+"time you hit play if you so wish. Please note that this option will usually "
+"incur a\n"
+"delay at the start of playback due to the amount of data being transmitted."
+msgstr ""
+"Rosegarden peut envoyer les contrôleurs MIDI(Balance, Réverbe, etc.) à tous "
+"les périphériques MIDI chaque\n"
+"fois que vous appuyez sur Jouer. Veuillez noter que cette option "
+"provoquera\n"
+"un peu d'attente au début de l'exécution à cause du volume de données "
+"transmises."
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:138
+msgid "Sequencer timing source"
+msgstr "Horloge utilisée par le séquenceur"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:163
+msgid "Load SoundFont to SoundBlaster card at startup"
+msgstr "Charger la soundfont vers la carte Soundblaster au démarrage"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:164
+msgid ""
+"Check this box to enable soundfont loading on EMU10K-based cards when "
+"Rosegarden is launched"
+msgstr ""
+"Cochez cette case permet le chargement des soundfonts, lors du démarrage de "
+"Rosegarden, pour les cartes sons utilisant le chipset EMU10k"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:173
+msgid "Path to 'asfxload' or 'sfxload' command"
+msgstr "Chemin vers la commande 'asfxload' ou 'sfxload'"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:180
+msgid "SoundFont"
+msgstr "SoundFont"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:223
+msgid "MIDI Clock and System messages"
+msgstr "Horloge MIDI et messages système"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:229
+msgid "Send MIDI Clock, Start and Stop"
+msgstr "Envoi de l'horloge MIDI et des messages \"Start\" et \"Stop\""
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:230
+msgid "Accept Start, Stop and Continue"
+msgstr "Accepte les messages \"Start\", \"Stop\" et \"Continue\""
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:241
+msgid "MIDI Machine Control mode"
+msgstr "Mode MMC (MIDI Machine Control)"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:248
+msgid "MMC Master"
+msgstr "Maître MMC"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:249
+msgid "MMC Slave"
+msgstr "Esclave MMC"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:260
+msgid "MIDI Time Code mode"
+msgstr "Mode MTC (MIDI Time Code)"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:267
+msgid "MTC Master"
+msgstr "Maître MTC"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:268
+msgid "MTC Slave"
+msgstr "Esclave MTC"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:281
+msgid "Automatically connect sync output to all devices in use"
+msgstr ""
+"Connexion automatique de la sortie synchro à tous les périphériques utilisés"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:292
+msgid "MIDI Sync"
+msgstr "Synchronisation MIDI"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:308
+msgid "sfxload path"
+msgstr "chemin vers sfxload"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:315
+msgid "Soundfont path"
+msgstr "Répertoire des soundfonts"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:67
+msgid "%1 minutes %2.%3%4 seconds (%5 units, %6 measures)"
+msgstr "%1 minutes %2.%3%4 secondes (%5 unités, %6 mesures)"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:133
+msgid "Filename:"
+msgstr "Nom de fichier:"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:136
+msgid "Formal duration (to end marker):"
+msgstr "Durée formelle (jusqu'au marqueur de fin):"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:141
+msgid "Playing duration:"
+msgstr "Durée de lecture:"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:146
+msgid "Tracks:"
+msgstr "Pistes:"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:147
+msgid "%1 used, %2 total"
+msgstr "%1 utilisé, %2 total"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:152
+msgid "Segments:"
+msgstr "Segments:"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:153
+msgid "%1 MIDI, %2 audio, %3 total"
+msgstr "%1 MIDI, %2 audio, %3 total"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:161
+msgid "Statistics"
+msgstr "Statistiques"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:170
+#: ../src/gui/editors/parameters/InstrumentParameterBox.cpp:155
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:92
+msgid "Track"
+msgstr "Piste"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:171
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:125
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:90
+msgid "Label"
+msgstr "Nom"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:172
+msgid "Time"
+msgstr "Temps"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:174
+msgid "Events"
+msgstr "Événements"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:175
+msgid "Polyphony"
+msgstr "Polyphonie"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:176
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:126
+msgid "Repeat"
+msgstr "Répéter"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:178
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:128
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:305
+#: ../src/gui/general/EditView.cpp:1488
+msgid "Transpose"
+msgstr "Transposer"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:179
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:129
+msgid "Delay"
+msgstr "Retard"
+
+#: ../src/gui/configuration/AudioConfigurationPage.h:61
+#: ../src/gui/configuration/AudioPropertiesPage.h:58
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:204
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:523
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:524
+msgid "Audio"
+msgstr "Audio"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:204
+#: ../src/gui/configuration/MIDIConfigurationPage.h:62
+msgid "MIDI"
+msgstr "MIDI"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:317
+msgid "Segment Summary"
+msgstr "Résumé du segment"
+
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:63
+msgid "Audio file path:"
+msgstr "Chemin des fichiers audio:"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:137
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:68
+msgid "Choose..."
+msgstr "Choisir..."
+
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:73
+msgid "Disk space remaining:"
+msgstr "Espace disque restant:"
+
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:78
+msgid "Equivalent minutes of 16-bit stereo:"
+msgstr "Minutes équivalentes en 16-bit stereo:"
+
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:90
+msgid "Modify audio path"
+msgstr "Modifier le chemin audio"
+
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:113
+msgid "%1 out of %2 (%3% used)"
+msgstr "%1 sur %2 (%3% utilisé)"
+
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:144
+msgid "minutes at"
+msgstr "Minutes à"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.h:63
+msgid "MIDI Settings"
+msgstr "Préférences MIDI"
+
+#: ../src/gui/configuration/AudioConfigurationPage.h:62
+#: ../src/gui/configuration/AudioPropertiesPage.h:59
+msgid "Audio Settings"
+msgstr "Préférences audio"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:87
+msgid "Default layout mode"
+msgstr "Mise en page par défaut"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:91
+msgid "Linear layout"
+msgstr "Mise en page linéaire"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:92
+msgid "Continuous page layout"
+msgstr "Mise en page continue"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:93
+msgid "Multiple page layout"
+msgstr "Mise en page multiple"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:101
+msgid "Default spacing"
+msgstr "Espacement par défaut"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:125
+msgid "Default duration factor"
+msgstr "Facteur de durée par défaut"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:141
+msgid "Full"
+msgstr "Plein"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:152
+msgid "Show track headers (linear layout only)"
+msgstr "Afficher les en-têtes des pistes (mise en page linéaire uniquement)"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:158
+msgid "When needed"
+msgstr "Si nécessaire"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:166
+msgid ""
+"\"Always\" and \"Never\" mean what they usually mean\n"
+"\"When needed\" means \"when staves are too many to all fit in the current "
+"window\""
+msgstr ""
+"\"Toujours\" et \"Jamais\" ont leur signification habituelle\n"
+"\"Si nécessaire\" signifie \"Si les portées sont trop nombreuses pour tenir "
+"toutes dans la fenêtre courante\""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:178
+msgid "Show non-notation events as question marks"
+msgstr ""
+"Afficher sous forme de points d'interrogation les événements non "
+"représentables sur une partition"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:188
+msgid "Show notation-quantized notes in a different color"
+msgstr "Afficher les notes quantifiées dans une couleur différente"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:198
+msgid "Show \"invisible\" events in grey"
+msgstr "Voir \"invisible\" les événements grisés"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:208
+msgid "Show notes outside suggested playable range in red"
+msgstr ""
+"Afficher en rouge les notes qui sortent de l'étendue proposée comme \"jouable"
+"\""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:218
+msgid "Highlight superimposed notes with a halo effect"
+msgstr "Entourer d'un halo les notes superposées"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:231
+msgid "When recording MIDI, split-and-tie long notes at barlines"
+msgstr ""
+"Pendant les enregistrements MIDI, couper-et-lier les notes longues aux "
+"barres de mesure"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:242
+msgid "Layout"
+msgstr "Mise en page"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:255
+msgid "Default note style for new notes"
+msgstr "Style par défaut pour les nouvelles notes"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:287
+msgid "When inserting notes..."
+msgstr "Quand on insère des notes..."
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:294
+msgid "Split notes into ties to make durations match"
+msgstr ""
+"Séparer les notes et les lier pour les rendre compatibles avec la mesure"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:295
+msgid "Ignore existing durations"
+msgstr "Ignorer les durées existantes"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:305
+msgid "Auto-beam on insert when appropriate"
+msgstr "Regrouper automatiquement les croches à leur insertion"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:317
+#: ../src/gui/editors/notation/NotationEraser.cpp:54
+msgid "Collapse rests after erase"
+msgstr "Fusionner les silences après effacement"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:328
+msgid "Default paste type"
+msgstr "Type de collage par défaut"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:350
+msgid "Editing"
+msgstr "Édition"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:362
+msgid "Accidentals in one octave..."
+msgstr "altérations dans une octave..."
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:364
+msgid "Affect only that octave"
+msgstr "Affecter uniquement cette octave"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:365
+msgid "Require cautionaries in other octaves"
+msgstr "Imposer les altérations prudentes dans les autres octaves"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:366
+msgid "Affect all subsequent octaves"
+msgstr "Affecter toutes les octaves suivantes"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:374
+msgid "Accidentals in one bar..."
+msgstr "altérations dans une mesure..."
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:376
+msgid "Affect only that bar"
+msgstr "Affecter seulement cette mesure"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:377
+msgid "Require cautionary resets in following bar"
+msgstr "Imposer des altérations prudentes aux changements de mesures"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:378
+msgid "Require explicit resets in following bar"
+msgstr "Requière un remise à zéro explicite dans la mesure suivante"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:386
+msgid "Key signature cancellation style"
+msgstr "Style d'annulation d'une armature"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:388
+msgid "Cancel only when entering C major or A minor"
+msgstr "Annuler en cas de passage en do majeur ou la mineur"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:389
+msgid "Cancel whenever removing sharps or flats"
+msgstr "Annuler en cas de suppression de dièses ou de bémols"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:390
+msgid "Cancel always"
+msgstr "Toujours annuler explicitement"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:400
+msgid "Accidentals"
+msgstr "Altérations"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:441
+msgid "Notation font"
+msgstr "Police de Partition"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:467
+msgid "Origin:"
+msgstr "Origine:"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:471
+msgid "Copyright:"
+msgstr "Copyright:"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:475
+msgid "Mapped by:"
+msgstr "Mappé par:"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:479
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:81
+msgid "Type:"
+msgstr "Type :"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:508
+msgid "Font size for single-staff views"
+msgstr "Taille de la police pour voir une portée"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:516
+msgid "Font size for multi-staff views"
+msgstr "Taille de la police pour voir des portées multiples"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:524
+msgid "Font size for printing (pt)"
+msgstr "Taille de police pour l'impression (en pt)"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:541
+msgid "Text font"
+msgstr "Police de texte"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:549
+msgid "Sans-serif font"
+msgstr "Police sans serif"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:664
+msgid "%1 (smooth)"
+msgstr "%1 (arrondies)"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:667
+msgid "%1 (jaggy)"
+msgstr "%1 (anguleuses)"
+
+#: ../src/gui/configuration/LatencyConfigurationPage.cpp:58
+msgid "JACK latency"
+msgstr "Latence JACK"
+
+#: ../src/gui/configuration/LatencyConfigurationPage.cpp:61
+msgid ""
+"Use the \"Fetch JACK latencies\" button to discover the latency values set "
+"at\n"
+"the sequencer. It's recommended that you use the returned values but it's "
+"also\n"
+"possible to override them manually using the sliders. Note that if you "
+"change\n"
+"your JACK server parameters you should always fetch the latency values "
+"again.\n"
+"The latency values will be stored by Rosegarden for use next time."
+msgstr ""
+"Utilisez le bouton \"Récupérer les latences JACK\" pour apprendre quelles "
+"sont les valeurs\n"
+"de latence définies pour le séquenceur. Il est recommandé d'utiliser les "
+"valeurs\n"
+"ainsi obtenues, mais il est aussi possible de les modifier en utilisant les "
+"glissières.\n"
+" Notez bien que si vous modifiez les paramètres du serveur JACK, vous\n"
+"devrez de nouveau récupérer les valeurs de latence.\n"
+"Les valeurs de latence sont mémorisées par Rosegarden de façon à pouvoir "
+"être utilisées\n"
+"de nouveau la prochaine fois."
+
+#: ../src/gui/configuration/LatencyConfigurationPage.cpp:65
+msgid "JACK playback latency (in ms)"
+msgstr "Latence JACK de Play-back (en ms)"
+
+#: ../src/gui/configuration/LatencyConfigurationPage.cpp:66
+msgid "JACK record latency (in ms)"
+msgstr "Latence JACK d'enregistrement (en ms)"
+
+#: ../src/gui/configuration/LatencyConfigurationPage.cpp:68
+msgid "Fetch JACK latencies"
+msgstr "Chercher les latences JACK"
+
+#: ../src/gui/configuration/LatencyConfigurationPage.cpp:121
+msgid "JACK Latency"
+msgstr "Latence JACK"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:92
+msgid "Audio preview scale"
+msgstr "Echelle de prévisualisation audio"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:96
+msgid "Linear - easier to see loud peaks"
+msgstr "Linéaire - met en évidence les pics sonores"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:97
+msgid "Meter scaling - easier to see quiet activity"
+msgstr "Echelle logarithmique - permet de voir les niveaux faibles"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:105
+msgid "Record audio files as"
+msgstr "Enregistrer les fichiers audio comme"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:107
+msgid "16-bit PCM WAV format (smaller files)"
+msgstr "Format WAV PCM 16 bits (fichiers plus petits)"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:108
+msgid "32-bit float WAV format (higher quality)"
+msgstr "Format WAV flottants 32 bits (meilleure qualité)"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:117
+msgid "External audio editor"
+msgstr "Éditeur audio externe"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:145
+msgid "Create JACK outputs"
+msgstr "Créer des sorties JACK"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:150
+msgid "for individual audio instruments"
+msgstr "pour les instruments audio individuels"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:157
+msgid "for submasters"
+msgstr "pour les sous-maîtres"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:184
+msgid ""
+"Rosegarden can start the JACK audio daemon (jackd) for you automatically if "
+"it isn't already running when Rosegarden starts.\n"
+"\n"
+"This is recommended for beginners and those who use Rosegarden as their main "
+"audio application, but it might not be to the liking of advanced users.\n"
+"\n"
+"If you want to start JACK automatically, make sure the command includes a "
+"full path where necessary as well as any command-line arguments you want to "
+"use.\n"
+"\n"
+"For example: /usr/local/bin/jackd -d alsa -d hw -r44100 -p 2048 -n 2\n"
+"\n"
+msgstr ""
+"Si le démon audio JACK (jackd) n'est pas en route lorsque Rosegarden\n"
+" démarre, Rosegarden peut le lancer automatiquement à votre place.\n"
+"\n"
+"Ce comportement est recommandé aux débutants et à tous ceux qui\n"
+"utilisent Rosegarden comme application audio principale, mais peut ne\n"
+"pas convenir aux utilisateurs plus expérimentés.\n"
+"\n"
+"Si vous souhaitez lancer JACK automatiquement, assurez vous que la\n"
+"commande inclut le chemin complet nécessaire ainsi que les arguments\n"
+"que vous désirez utiliser.\n"
+"\n"
+"Par exemple : /usr/local/bin/Jackd -d alsa -d hw -r44100 -p 2048 -n 2\n"
+"\n"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:196
+msgid "Start JACK when Rosegarden starts"
+msgstr "Démarrer JACK en même temps que Rosegarden"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:201
+msgid "JACK command"
+msgstr "Commande JACK à utiliser"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:214
+msgid "JACK Startup"
+msgstr "Démarrage de JACK"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:224
+msgid "External audio editor path"
+msgstr "Chemin de l'éditeur audio externe"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:262
+msgid "External audio editor \"%1\" not found or not executable"
+msgstr "L'éditeur audio \"%1\" non trouvé ou non exécutable"
+
+#: ../src/gui/configuration/ColourConfigurationPage.cpp:70
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:448
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:863
+msgid "Add New Color"
+msgstr "Ajouter une nouvelle couleur"
+
+#: ../src/gui/configuration/ColourConfigurationPage.cpp:74
+msgid "Delete Color"
+msgstr "Effacer la couleur"
+
+#: ../src/gui/configuration/ColourConfigurationPage.cpp:93
+msgid "Color Map"
+msgstr "Carte des couleurs"
+
+#: ../src/gui/configuration/ColourConfigurationPage.cpp:128
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:983
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:882
+msgid "New Color Name"
+msgstr "Nom de la nouvelle couleur"
+
+#: ../src/gui/configuration/ColourConfigurationPage.cpp:130
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:59
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:984
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:883
+#: ../src/gui/studio/DeviceManagerDialog.cpp:115
+#: ../src/gui/studio/DeviceManagerDialog.cpp:174
+msgid "New"
+msgstr "Nouveau"
+
+#: ../src/gui/configuration/LatencyConfigurationPage.h:62
+msgid "Latency"
+msgstr "Latence"
+
+#: ../src/gui/configuration/LatencyConfigurationPage.h:63
+msgid "Sequencer Latency"
+msgstr "Latence du séquenceur"
+
+#: ../src/gui/configuration/ColourConfigurationPage.h:61
+msgid "Color Settings"
+msgstr "Préférences des couleurs"
+
+#: ../src/gui/studio/MidiDeviceListViewItem.cpp:55
+#: ../src/gui/studio/MidiKeyMapListViewItem.cpp:44
+msgid "Key Mapping"
+msgstr "Liste de percussions"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:97
+msgid "Manage MIDI Banks and Programs"
+msgstr "Gestion des programmes et banques MIDI"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:128
+msgid "MIDI Device"
+msgstr "Périphérique MIDI"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:130
+#: ../src/gui/studio/BankEditorDialog.cpp:219
+msgid "MSB"
+msgstr "MSB"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:131
+#: ../src/gui/studio/BankEditorDialog.cpp:218
+msgid "LSB"
+msgstr "LSB"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:140
+msgid "Add Bank"
+msgstr "Ajouter une banque"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:141
+msgid "Add Key Mapping"
+msgstr "Ajouter liste de percussions"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:153
+msgid "Add a Bank to the current device"
+msgstr "Ajouter une banque au périphérique courant"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:157
+msgid "Add a Percussion Key Mapping to the current device"
+msgstr "Ajouter une liste de percussions au périphérique courant"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:161
+msgid "Delete the current Bank or Key Mapping"
+msgstr "Effacer la banque (ou liste de percussions) courante"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:165
+msgid "Delete all Banks and Key Mappings from the current Device"
+msgstr "Effacer toutes les banques du périphérique courant"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:167
+#: ../src/gui/studio/DeviceManagerDialog.cpp:117
+msgid "Import..."
+msgstr "Importer..."
+
+#: ../src/gui/studio/BankEditorDialog.cpp:168
+#: ../src/gui/studio/DeviceManagerDialog.cpp:118
+msgid "Export..."
+msgstr "Exporter..."
+
+#: ../src/gui/studio/BankEditorDialog.cpp:176
+msgid ""
+"Import Bank and Program data from a Rosegarden file to the current Device"
+msgstr ""
+"Importer les banques et programmes d'un fichier Rosegarden vers le "
+"périphérique courant"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:179
+msgid ""
+"Export all Device and Bank information to a Rosegarden format interchange "
+"file"
+msgstr ""
+"Exporter les informations des banques et des périphériques vers un fichier "
+"d'échange Rosegarden"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:190
+msgid "Copy all Program names from current Bank to clipboard"
+msgstr ""
+"Copier les noms des programmes de la banque courante vers le presse-papiers"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:194
+msgid "Paste Program names from clipboard to current Bank"
+msgstr ""
+"Coller les noms de programmes du presse-papiers vers la banque courante"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:216
+msgid "Show Variation list based on "
+msgstr "Montrer la liste de variation basée sur "
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1010
+msgid "<new bank>"
+msgstr "<nouvelle banque>"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1046
+msgid "<new mapping>"
+msgstr "<nouvelle projection>"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1048
+msgid "<new mapping %1>"
+msgstr "<nouvelle projection %1>"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1089
+msgid "Really delete this bank?"
+msgstr "Confirmez-vous l'effacement de cette banque ?"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1137
+msgid "Really delete this key mapping?"
+msgstr "Confirmez-vous l'effacement de cette liste de percussions ?"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1187
+msgid "Really delete all banks for "
+msgstr "Confirmez-vous l'effacement de toutes les banques pour "
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1476
+msgid "Import Banks from Device in File"
+msgstr "Importer les banques d'un périphérique défini dans un fichier"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1623
+#: ../src/gui/studio/DeviceManagerDialog.cpp:770
+msgid "Export Device as..."
+msgstr "Exporter le périphérique en tant que..."
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1694
+msgid ""
+"There are unsaved changes.\n"
+"Do you want to apply the changes before exiting the Bank Editor or discard "
+"the changes ?"
+msgstr ""
+"Les modifications ne sont actuellement pas sauvegardées.\n"
+"Voulez-vous appliquer les changements avant de quitter l'éditeur de banque ?"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1697
+msgid "Unsaved Changes"
+msgstr "Modifications non sauvegardées"
+
+#: ../src/gui/studio/NameSetEditor.cpp:68
+msgid "Librarian"
+msgstr "Bibliothécaire"
+
+#: ../src/gui/studio/NameSetEditor.cpp:75
+msgid "Email"
+msgstr "Adresse électronique"
+
+#: ../src/gui/studio/NameSetEditor.cpp:80
+msgid ""
+"The librarian maintains the Rosegarden device data for this device.\n"
+"If you've made modifications to suit your own device, it might be worth\n"
+"liaising with the librarian in order to publish your information for the "
+"benefit\n"
+"of others."
+msgstr ""
+"Le bibliothécaire assure la maintenance des informations concernant ce "
+"périphérique.\n"
+"Si vous avez fait des modifications pour pouvoir faire fonctionner votre "
+"propre\n"
+"périphérique, une bonne idée serait de le signaler au bibliothécaire afin "
+"que\n"
+"d'autres puissent aussi en bénéficier."
+
+#: ../src/gui/studio/MidiBankListViewItem.cpp:51
+#: ../src/gui/studio/MidiDeviceListViewItem.cpp:48
+msgid "Percussion Bank"
+msgstr "Liste de Percussions"
+
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:84
+#: ../src/gui/studio/MidiBankListViewItem.cpp:51
+#: ../src/gui/studio/MidiDeviceListViewItem.cpp:48
+msgid "Bank"
+msgstr "Banque"
+
+#: ../src/gui/studio/ChangeRecordDeviceCommand.h:39
+msgid "Change Record Device"
+msgstr "Changer le péripérique d'enregistrement"
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:61
+#: ../src/gui/studio/DeviceManagerDialog.cpp:96
+msgid "Manage MIDI Devices"
+msgstr "Gestion des périphériques MIDI"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:98
+msgid "Play devices"
+msgstr "Périphériques de lecture"
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:76
+#: ../src/gui/studio/DeviceManagerDialog.cpp:106
+#: ../src/gui/studio/DeviceManagerDialog.cpp:165
+msgid "Connection"
+msgstr "Connexion"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:119
+msgid "Banks..."
+msgstr "Banques..."
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:120
+msgid "Control Events..."
+msgstr "Contrôle des événements..."
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:126
+msgid "Create a new Play device"
+msgstr "Créer un nouveau périphérique de lecture"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:129
+#: ../src/gui/studio/DeviceManagerDialog.cpp:184
+msgid "Delete the selected device"
+msgstr "Effacer le périphérique sélectionné"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:132
+msgid ""
+"Import Bank, Program and Controller data from a Rosegarden file to the "
+"selected device"
+msgstr ""
+"Importer les banques, programmes et contrôleurs depuis un fichier\n"
+"d'échange Rosegarden vers le périphérique sélectionné"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:135
+msgid "Export Bank and Controller data to a Rosegarden interchange file"
+msgstr ""
+"Exporter les banques et les contrôleurs vers un fichier d'échange Rosegarden"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:138
+msgid "View and edit Banks and Programs for the selected device"
+msgstr "Voir et éditer des banques et programmes du périphérique sélectionné"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:141
+msgid ""
+"View and edit Control Events for the selected device - these are special "
+"Event types that you can define against your device and control through "
+"Control Rulers or the Instrument Parameter Box "
+msgstr ""
+"Voir et éditer des événements de contrôle pour le périphérique sélectionné - "
+"ce sont\n"
+"des types d'événements spéciaux que vous pouvez définir et contrôler à "
+"l'aide des\n"
+"réglettes de contrôles ou de la boîte de dialogue des paramètres "
+"d'instruments "
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:156
+msgid "Record devices"
+msgstr "Périphériques d'enregistrement"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:164
+msgid "Current"
+msgstr "Courant"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:181
+msgid "Create a new Record device"
+msgstr "Créer un nouveau périphérique d'enregistrement"
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:360
+#: ../src/gui/studio/DeviceEditorDialog.cpp:378
+#: ../src/gui/studio/DeviceManagerDialog.cpp:486
+#: ../src/gui/studio/DeviceManagerDialog.cpp:501
+msgid "New Device"
+msgstr "Nouveau périphérique"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:703
+msgid "Import from Device in File"
+msgstr "Importer depuis un péripérique dans un fichier"
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:55
+msgid "Remap Instrument assigments..."
+msgstr "Redéfinir les affectations des instruments..."
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:62
+msgid "Device or Instrument"
+msgstr "Périphérique ou instrument"
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:65
+msgid "Remap Tracks by all Instruments on a Device or by single Instrument"
+msgstr ""
+"Redéfinir les pistes par tous les instruments d'un périphérique ou par un "
+"seul instrument"
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:74
+msgid "Choose Source and Destination"
+msgstr "Choisir la source et la destination"
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:77
+msgid "From"
+msgstr "Depuis"
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:78
+msgid "To"
+msgstr "Jusqu'à"
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:120
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:121
+msgid "<no devices>"
+msgstr "<pas de périphériques>"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:155
+msgid "Show Audio &Faders"
+msgstr "Afficher les &faders audio"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:160
+msgid "Show Synth &Faders"
+msgstr "Afficher synth et &faders"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:165
+msgid "Show &Submasters"
+msgstr "Afficher les &sous-maîtres"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:170
+msgid "Show &Plugin Buttons"
+msgstr "Afficher les boutons des &Plugins"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:175
+msgid "Show &Unassigned Faders"
+msgstr "Voir les Faders non assignés"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:184
+#, c-format
+msgid ""
+"_n: 1 Input\n"
+"%n Inputs"
+msgstr ""
+"1 entrée\n"
+"%n entrées"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:194
+msgid "No Submasters"
+msgstr "Pas de sous-maîtres"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:203
+#, c-format
+msgid ""
+"_n: 1 Submaster\n"
+"%n Submasters"
+msgstr ""
+"1 sous-maître\n"
+"%n sous-maîtres"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:279
+msgid "Audio Mixer"
+msgstr "Mixeur audio"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:311
+msgid "Record input source"
+msgstr "Enregistrer la source d'entrée"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:322
+msgid "Output destination"
+msgstr "Destination de sortie"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:336
+#: ../src/gui/studio/AudioMixerWindow.cpp:495
+msgid "Pan"
+msgstr "Balance"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:355
+msgid "Mono or stereo"
+msgstr "Mono ou stereo"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:364
+#: ../src/gui/studio/AudioMixerWindow.cpp:513
+msgid "Mute"
+msgstr "Assourdir"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:373 rc.cpp:408
+#, no-c-format
+msgid "Solo"
+msgstr "Solo"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:382
+msgid "Arm recording"
+msgstr "Armer l'enregistrement"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:400
+#, c-format
+msgid "Audio %1"
+msgstr "Audio %1"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:404
+#, c-format
+msgid "Synth %1"
+msgstr "Synth %1"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:578
+#: ../src/gui/studio/AudioMixerWindow.cpp:580
+msgid "Audio master output level"
+msgstr "Niveau maître de sortie audio"
+
+#: ../src/gui/studio/SynthPluginManagerDialog.cpp:71
+msgid "Manage Synth Plugins"
+msgstr "Gérer les greffons de synthétiseurs"
+
+#: ../src/gui/studio/SynthPluginManagerDialog.cpp:78
+msgid "Synth plugins"
+msgstr "Greffons de synthétiseurs"
+
+#: ../src/gui/studio/SynthPluginManagerDialog.cpp:145
+msgid "Controls"
+msgstr "Contrôles"
+
+#: ../src/gui/studio/SynthPluginManagerDialog.cpp:152
+msgid "Editor >>"
+msgstr "Éditeur >>"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:66
+#: ../src/gui/studio/MidiProgramsEditor.cpp:169
+msgid "Bank and Program details"
+msgstr "Détails des banques et programmes"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:67
+msgid "Programs"
+msgstr "Programmes"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2711
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:88
+#: ../src/gui/studio/MidiProgramsEditor.cpp:93
+msgid "Percussion"
+msgstr "Percussion"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:99
+msgid "MSB Value"
+msgstr "Valeur MSB"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:107
+msgid ""
+"Selects a MSB controller Bank number (MSB/LSB pairs are always unique for "
+"any Device)"
+msgstr ""
+"Sélectionne le numéro MSB de banque d'un contrôleur (les paires\n"
+"MSB/LSB sont toujours uniques pour tout périphérique)"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:111
+msgid ""
+"Selects a LSB controller Bank number (MSB/LSB pairs are always unique for "
+"any Device)"
+msgstr ""
+"Sélectionne un numéro LSB de banque d'un contrôleur (les paires\n"
+"MSB/LSB sont toujours uniques pour tout périphérique)"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:116
+msgid "LSB Value"
+msgstr "Valeur LSB"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:254
+#: ../src/gui/studio/MidiProgramsEditor.cpp:541
+#, c-format
+msgid "Key Mapping: %1"
+msgstr "Liste de percussions: %1"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:476
+msgid "<no key mapping>"
+msgstr "<pas de liste de percussions>"
+
+#: ../src/gui/studio/MidiKeyMappingEditor.cpp:57
+#: ../src/gui/studio/MidiKeyMappingEditor.cpp:81
+msgid "Key Mapping details"
+msgstr "Détails de la liste de percussions"
+
+#: ../src/gui/studio/MidiKeyMappingEditor.cpp:58
+msgid "Pitches"
+msgstr "Hauteurs"
+
+#: ../src/gui/studio/MidiMixerWindow.cpp:152
+msgid "MIDI Mixer"
+msgstr "Mixeur MIDI"
+
+#: ../src/gui/studio/MidiMixerWindow.cpp:199
+msgid "Volume"
+msgstr "Volume"
+
+#: ../src/gui/studio/AudioPluginOSCGUIManager.cpp:444
+msgid "Rosegarden Plugin"
+msgstr "Plugin Rosegarden"
+
+#: ../src/gui/studio/AudioPluginOSCGUIManager.cpp:447
+#, c-format
+msgid "Rosegarden: %1"
+msgstr "Rosegarden : %1"
+
+#: ../src/gui/studio/AudioPluginOSCGUIManager.cpp:449
+msgid "Rosegarden: %1: %2"
+msgstr "Rosegarden : %1 : %2"
+
+#: ../src/gui/studio/AudioPluginOSCGUIManager.cpp:450
+#, c-format
+msgid "Plugin slot %1"
+msgstr "Plugin slot %1"
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:92
+msgid "Add Play Device"
+msgstr "Ajouter un périphérique de lecture"
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:93
+msgid "Add Record Device"
+msgstr "Ajouter un périphérique d'enregistrement"
+
+#: ../src/commands/studio/CreateOrDeleteDeviceCommand.h:68
+#: ../src/gui/studio/DeviceEditorDialog.cpp:94
+msgid "Delete Device"
+msgstr "Effacer périphérique"
+
+#: ../src/gui/editors/segment/PlayList.cpp:77
+#: ../src/gui/studio/DeviceEditorDialog.cpp:156
+#: ../src/gui/studio/DeviceEditorDialog.cpp:361
+msgid "Play"
+msgstr "Jouer"
+
+#: ../src/commands/segment/SegmentRecordCommand.cpp:37
+#: ../src/gui/studio/DeviceEditorDialog.cpp:156
+#: ../src/gui/studio/DeviceEditorDialog.cpp:379 rc.cpp:394
+#, no-c-format
+msgid "Record"
+msgstr "Enregistrer"
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:256
+msgid "Apply pending changes?"
+msgstr "Appliquer les changements en cours ?"
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:359
+#: ../src/gui/studio/DeviceEditorDialog.cpp:377
+msgid "<new device>"
+msgstr "<Nouveau périphérique>"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentEraser.cpp:82
+msgid "Click on a segment to delete it"
+msgstr "Cliquer suer un segment pour l'effacer"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSplitter.cpp:166
+msgid ""
+"Click on a segment to split it in two; hold Shift to avoid snapping to beat "
+"grid"
+msgstr ""
+"Cliquer sur un segment pour le séparer en deux; Maintenez la touche "
+"\"Majuscules\" pour qu'il ne reste pas accroché à la grille des temps"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSplitter.cpp:168
+msgid "Click on a segment to split it in two"
+msgstr "Cliquer sur un segment pour le séparer en deux"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:81
+msgid "Click and drag to select segments"
+msgstr "Cliquer et glisser pour sélectionner des segments"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentMover.cpp:154
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:238
+msgid "Move Segment"
+msgstr "Bouger le Segment"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentMover.cpp:154
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:239
+msgid "Move Segments"
+msgstr "Bouger les segments"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:217
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:169
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:141
+#: ../src/gui/editors/segment/segmentcanvas/SegmentMover.cpp:210
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:255
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:359
+msgid "Hold Shift to avoid snapping to beat grid"
+msgstr ""
+"Maintenez enfoncé la touche \"Majuscules\" pour ne pas rester accroché à la "
+"grille des temps"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:485
+msgid ""
+"Click and drag to select segments; middle-click and drag to draw an empty "
+"segment"
+msgstr ""
+"Cliquer et glisser pour sélectionner des segments; cliquer avec le bouton du "
+"milieu et glisser pour tracer un segment vide"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:384
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:502
+msgid ""
+"Click and drag to resize a segment; hold Ctrl as well to rescale its contents"
+msgstr ""
+"Cliquer et glisser pour modifier la taille d'un segment; si la touche Ctrl "
+"est maintenue enfoncé, le contenu du segment sera également redimensionné"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:386
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:504
+msgid "Click and drag to rescale segment"
+msgstr "Cliquer et glisser pour redimensionner le segment"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:509
+msgid "Click and drag to move segments; hold Ctrl as well to copy them"
+msgstr ""
+"Cliquer et glisser pour déplacer des segments; si la touche Ctrl est "
+"maintenue enfoncée, ils seront copiés"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:511
+msgid "Click and drag to copy segments"
+msgstr "Cliquer et glisser pour copier des segments"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:515
+msgid ""
+"Click and drag to move segment; hold Ctrl as well to copy it; double-click "
+"to edit"
+msgstr ""
+"Cliquer et glisser pour déplacer un segments; si la touche Ctrl est "
+"maintenue enfoncée, ils sera copié; double-cliquer pour l'éditer"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:517
+msgid "Click and drag to copy segment"
+msgstr "Cliquer et glisser pour copier un segment"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:157
+msgid ""
+"The audio file path does not exist or is not writable.\n"
+"You must set the audio file path to a valid directory in Document Properties "
+"before rescaling an audio file.\n"
+"Would you like to set it now?"
+msgstr ""
+"Le chemin du fichier audio n'existe pas ou ne peut pas être écrit.\n"
+"Veuillez déclarer un répertoire valide comme chemin du fichier audio dans "
+"les Propriétés du Document avant de redimensionner un fichier audio.\n"
+"Souhaitez vous le faire tout de suite ?"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:261
+msgid ""
+"Hold Shift to avoid snapping to beat grid; hold Ctrl as well to rescale "
+"contents"
+msgstr ""
+"Maintenir la touche \"Majuscules\" enfoncée pour ne pas s'accrocher à la "
+"grille de la mesure; maintenir de même la touche \"Ctrl\" pour "
+"redimensionner le contenu"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentMover.cpp:325
+msgid "Click and drag to move a segment"
+msgstr "Cliquer et glisser pour déplacer un segment"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentPencil.cpp:225
+msgid "Hold Shift to avoid snapping to bar lines"
+msgstr ""
+"Maintenir la touche \"Majuscules\" enfoncée pour ne pas accrocher aux lignes "
+"des mesures"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentPencil.cpp:283
+msgid "Record or drop audio here"
+msgstr "Enregistrer ou déposer l'audio ici"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentPencil.cpp:289
+msgid ""
+"Click and drag to draw an empty segment. Control+Alt click and drag to draw "
+"in overlap mode."
+msgstr ""
+"Cliquer et glisser pour créer un segment vide. Ctrl+Alt+clic et glisser "
+"pour créer un segment en mode superposition."
+
+#: ../src/gui/editors/segment/TrackLabel.cpp:77
+msgid ""
+"Click and hold with left mouse button to assign this Track to an Instrument."
+msgstr ""
+"Cliquer avec le bouton gauche et le maintenir enfoncé pour assigner cette "
+"piste à un instrument."
+
+#: ../src/gui/editors/segment/TrackLabel.cpp:191
+msgid "Change track name"
+msgstr "Renommer une piste"
+
+#: ../src/gui/editors/segment/TrackLabel.cpp:192
+msgid "Enter new track name"
+msgstr "Entrer le nouveau nom de la piste"
+
+#: ../src/gui/editors/segment/TrackEditor.cpp:648
+msgid "Turn Repeating Segment into Real Copies"
+msgstr "Transformer les répétitions du segment en véritables copies"
+
+#: ../src/gui/editors/segment/TrackEditor.cpp:650
+msgid "Turn Repeating Segments into Real Copies"
+msgstr "Transformer les répétitions des segments en véritables copies"
+
+#: ../src/gui/editors/segment/TrackEditor.cpp:814
+msgid ""
+"You can't drop files into Rosegarden from this client. Try using Konqueror "
+"instead."
+msgstr ""
+"Vous ne pouvez pas déposer de fichiers dans Rosegarden à partir de ce "
+"client. À la place, essayez plutôt d'utiliser Konqueror."
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:85
+msgid "Manage Triggered Segments"
+msgstr "Gérer les segments déclenché"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:89
+msgid "ID"
+msgstr "ID"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:735
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:93
+msgid "Base velocity"
+msgstr "Vélocité"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:94
+msgid "Triggers"
+msgstr "Déclencheurs"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:115
+msgid "Add a Triggered Segment"
+msgstr "Ajouter un segment déclenché"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:119
+msgid "Delete a Triggered Segment"
+msgstr "Effacer un segment déclenché"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:123
+msgid "Delete All Triggered Segments"
+msgstr "Effacer tous les segments déclenchés"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:127
+msgid "Close the Triggered Segment Manager"
+msgstr "Fermer le gestionnaire de segments déclenchés"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:169
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:245
+msgid "<no label>"
+msgstr "<Aucune étiquette>"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:248
+msgid ""
+"_n: %1 on 1 track\n"
+"%1 on %n tracks"
+msgstr ""
+"%1 sur 1 piste\n"
+"%1 sur %n pistes"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:284
+msgid ""
+"This will remove all triggered segments from the whole composition. Are you "
+"sure?"
+msgstr ""
+"Tous les segments déclenchés vont être supprimés de l'ensemble de la "
+"composition. Souhaitez vous vraiment continuer?"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:288
+msgid "Remove all triggered segments"
+msgstr "Enlever tous les segments déclenchés"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:313
+msgid "Trigger Segment Duration"
+msgstr "Durée du segment déclenché"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:336
+#, c-format
+msgid ""
+"_n: This triggered segment is used 1 time in the current composition. Are "
+"you sure you want to remove it?\n"
+"This triggered segment is used %n times in the current composition. Are you "
+"sure you want to remove it?"
+msgstr ""
+"Ce segment déclenché est utilisé 1 fois dans la composition courante. Êtes "
+"vous bien sûr de vouloir le supprimer?\n"
+"Ce segment déclenché est utilisé %n fois dans la composition courante. Êtes "
+"vous bien sûr de vouloir le supprimer?"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:400
+msgid "Pa&ste as New Triggered Segment"
+msgstr "Coller en tant que nouveau segment déclenché"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1169
+#: ../src/gui/editors/segment/MarkerEditor.cpp:399
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:412
+#: ../src/gui/editors/tempo/TempoView.cpp:622
+msgid "&Musical Times"
+msgstr "&Temps musicaux"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1179
+#: ../src/gui/editors/segment/MarkerEditor.cpp:409
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:422
+#: ../src/gui/editors/tempo/TempoView.cpp:632
+msgid "&Real Times"
+msgstr "Temps &réel"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1189
+#: ../src/gui/editors/segment/MarkerEditor.cpp:419
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:432
+#: ../src/gui/editors/tempo/TempoView.cpp:642
+msgid "Ra&w Times"
+msgstr "Temps &brut"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:83
+msgid "Manage Markers"
+msgstr "Gérer les marqueurs"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:86
+msgid "Marker time "
+msgstr "Marqueur de temps"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:87
+msgid "Marker text "
+msgstr "Texte du marqueur"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:88
+msgid "Marker description "
+msgstr "Description du marqueur"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:95
+msgid "Pointer position"
+msgstr "Position du pointeur"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:100
+msgid "Real time:"
+msgstr "Temps Réel:"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:103
+msgid "In measure:"
+msgstr "À la mesure:"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:121
+msgid "Add a Marker"
+msgstr "Ajouter un marqueur"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:125
+msgid "Delete a Marker"
+msgstr "Supprimer un marqueur"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:129
+msgid "Delete All Markers"
+msgstr "Supprimer tout les repères"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:133
+msgid "Close the Marker Editor"
+msgstr "Fermer l'éditeur de marqueur"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:296
+msgid "Remove all markers"
+msgstr "&Enlever tous les marqueurs"
+
+#: ../src/gui/editors/segment/PlayList.cpp:76
+msgid "Add..."
+msgstr "Ajouter..."
+
+#: ../src/gui/editors/segment/PlayList.cpp:78
+msgid "Move Up"
+msgstr "Monter"
+
+#: ../src/gui/editors/segment/PlayList.cpp:79
+msgid "Move Down"
+msgstr "Descendre"
+
+#: ../src/gui/editors/segment/PlayList.cpp:124
+msgid "Select one or more Rosegarden files"
+msgstr "Sélectionner un ou plusieurs fichier(s) Rosegarden"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:73
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:55
+msgid "<not showing>"
+msgstr "<non affiché>"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:89
+msgid "Manage Control Events"
+msgstr "Gérer les contrôles d'événement"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:91
+msgid "<no device>"
+msgstr "<pas de périphérique>"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:99
+msgid " Control Events for %1 (device %2)"
+msgstr " Événement de contrôle pour %1 (périphérique %2)"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:104
+msgid "Control Event name "
+msgstr "Nom de contrôle de l'événement"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:105
+msgid "Control Event type "
+msgstr "Type de contrôle de l'événement"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:106
+msgid "Control Event value "
+msgstr "Valeur de contrôle de l'événement"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:107
+msgid "Description "
+msgstr "Description "
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:108
+msgid "Min "
+msgstr "Min "
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:109
+msgid "Max "
+msgstr "Max "
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:110
+msgid "Default "
+msgstr "Défaut "
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:111
+msgid "Color "
+msgstr "Couleur "
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:112
+msgid "Position on instrument panel"
+msgstr "Position sur le panneau instrument"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:136
+msgid "Add a Control Parameter to the Studio"
+msgstr "Ajouter un paramètre de contrôle au studio"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:140
+msgid "Delete a Control Parameter from the Studio"
+msgstr "Enlever un paramètre de contrôle au studio"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:144
+msgid "Close the Control Parameter editor"
+msgstr "Fermer l'éditeur de paramètre de contrôle"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:221
+msgid "<default>"
+msgstr "<par defaut>"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:62
+msgid "Edit Control Parameter"
+msgstr "Éditer paramètre de contrôle"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:71
+msgid "Control Event Properties"
+msgstr "Propriétés de contrôle de l'événement"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:77
+msgid "Name:"
+msgstr "Nom :"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:93
+msgid "Control Event value:"
+msgstr "Valeur de contrôle de l'événement :"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:97
+msgid "Minimum value:"
+msgstr "Valeur minimum :"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:101
+msgid "Maximum value:"
+msgstr "Valeur maximum :"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:105
+msgid "Default value:"
+msgstr "Valeur par défaut :"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:109
+msgid "Color:"
+msgstr "Couleur :"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:113
+msgid "Instrument Parameter Box position:"
+msgstr "Paramètres de positionnement des instruments :"
+
+#: ../src/gui/editors/segment/TrackButtons.cpp:209
+#: ../src/gui/editors/segment/TrackButtons.cpp:585
+#: ../src/gui/editors/segment/TrackButtons.cpp:935
+#: ../src/gui/editors/segment/TrackButtons.cpp:1127
+msgid "<no instrument>"
+msgstr "<Sans instrument>"
+
+#: ../src/gui/editors/segment/TrackButtons.cpp:352
+#: ../src/gui/editors/segment/TrackButtons.cpp:1094
+msgid "<untitled audio>"
+msgstr "<Fichier audio sans titre>"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:130
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:662
+#: ../src/gui/editors/segment/TrackButtons.cpp:354
+#: ../src/gui/editors/segment/TrackButtons.cpp:1096
+msgid "<untitled>"
+msgstr "<Sans titre>"
+
+#: ../src/gui/editors/segment/TrackButtons.cpp:1058
+msgid "Mute track"
+msgstr "Assourdir la piste"
+
+#: ../src/gui/editors/segment/TrackButtons.cpp:1063
+msgid "Record on this track"
+msgstr "Enregistrer sur cette piste"
+
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:88
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:1015
+msgid "Segment"
+msgstr "Segment"
+
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:89
+msgid "Segment Parameters"
+msgstr "Paramètres de segment"
+
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:366
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:697
+msgid "%1 ms"
+msgstr "%1 ms"
+
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:1031
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:910
+msgid "Highest playable note"
+msgstr "Plus haute note jouable"
+
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:1051
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:930
+msgid "Lowest playable note"
+msgstr "Plus basse note jouable"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:93
+msgid "Track Parameters"
+msgstr "Paramètres de la Piste"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:137
+msgid "Playback parameters"
+msgstr "Paramètres d'exécution"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:172
+msgid "Recording filters"
+msgstr "Filtres d'enregistrement"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:191
+msgid "Channel"
+msgstr "Canal"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:203
+msgid "Staff export options"
+msgstr "Options d'exportation des portées"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:220
+msgid "Notation size:"
+msgstr "Taille des notes:"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:225
+msgid "Small"
+msgstr "Petit"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:226
+msgid "Tiny"
+msgstr "Minuscule"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:233
+msgid "Bracket type:"
+msgstr "Type d'accolade:"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:237
+msgid "-----"
+msgstr "-----"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:238
+msgid "[----"
+msgstr "[----"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:239
+msgid "----]"
+msgstr "----]"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:240
+msgid "[---]"
+msgstr "[---]"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:241
+msgid "{----"
+msgstr "{----"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:242
+msgid "----}"
+msgstr "----}"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:243
+msgid "{[---"
+msgstr "{[---"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:244
+msgid "---]}"
+msgstr "---]}"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:253
+msgid "Create segments with"
+msgstr "Créer segments avec"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:264
+msgid "Preset"
+msgstr "Préselection"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:272
+msgid "Load"
+msgstr "Charger"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:282
+msgid "treble"
+msgstr "Sol"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:283
+msgid "bass"
+msgstr "Fa"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:284
+msgid "crotales"
+msgstr "Sol +15va"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:285
+msgid "xylophone"
+msgstr "Sol +8va"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:286
+msgid "guitar"
+msgstr "Sol -15va"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:287
+msgid "contrabass"
+msgstr "Fa -8va"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:288
+msgid "celesta"
+msgstr "Fa +15va"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:289
+msgid "old celesta"
+msgstr "Fa +8va"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:290
+msgid "french"
+msgstr "Sol 1ère"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:291
+msgid "soprano"
+msgstr "Ut 1ère"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:292
+msgid "mezzosoprano"
+msgstr "Ut 2ème"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:293
+msgid "alto"
+msgstr "Ut 3ème"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:294
+msgid "tenor"
+msgstr "Ut 4ème"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:295
+msgid "baritone"
+msgstr "Ut 5ème"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:296
+msgid "varbaritone"
+msgstr "Fa 3ème"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:297
+msgid "subbass"
+msgstr "Fa 5ème"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:327
+msgid "Lowest"
+msgstr "+Grave"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:329
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:336
+msgid "---"
+msgstr "---"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:331
+msgid "Choose the lowest suggested playable note, using a staff"
+msgstr "Choisissez la note jouable la plus basse"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:334
+msgid "Highest"
+msgstr "+Aigu"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:338
+msgid "Choose the highest suggested playable note, using a staff"
+msgstr "Choisissez la note jouable la plus haute"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:666
+msgid "[ Track %1 - %2 ]"
+msgstr "[ Piste %1 - %2 ]"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:985
+msgid "The instrument preset database is corrupt. Check your installation."
+msgstr ""
+"La base des données de préselection des instruments est corrompue. Vérifiez "
+"votre installation."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:173
+#: ../src/gui/editors/parameters/InstrumentParameterBox.cpp:54
+msgid "Instrument Parameters"
+msgstr "Paramètres d'instrument"
+
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:85
+msgid "Variation"
+msgstr "Variation"
+
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:86
+msgid "Program"
+msgstr "Programme"
+
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:87
+msgid "Channel out"
+msgstr "Canal de sortie"
+
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:215
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:221
+msgid "[ %1 ]"
+msgstr "[ %1 ]"
+
+#: ../src/gui/editors/matrix/MatrixEraser.cpp:58
+#: ../src/gui/editors/matrix/MatrixMover.cpp:71
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:67
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:77
+msgid "Switch to Draw Tool"
+msgstr "Dessiner"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:75
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:69
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:71
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:81
+#: ../src/gui/editors/notation/ClefInserter.cpp:57
+#: ../src/gui/editors/notation/GuitarChordInserter.cpp:63
+#: ../src/gui/editors/notation/NotationSelector.cpp:87
+#: ../src/gui/editors/notation/NoteInserter.cpp:113
+#: ../src/gui/editors/notation/RestInserter.cpp:72
+#: ../src/gui/editors/notation/TextInserter.cpp:61
+msgid "Switch to Erase Tool"
+msgstr "Gomme"
+
+#: ../src/gui/editors/matrix/MatrixEraser.cpp:62
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:73
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:75
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:85
+msgid "Switch to Move Tool"
+msgstr "Déplacement"
+
+#: ../src/gui/editors/matrix/MatrixEraser.cpp:68
+#: ../src/gui/editors/matrix/MatrixMover.cpp:81
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:79
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:93
+msgid "Switch to Resize Tool"
+msgstr "Redimensionnement"
+
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:446
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:579
+msgid "Click and drag to select; middle-click and drag to draw new note"
+msgstr ""
+"Cliquer et glisser pour sélectionner; utiliser le bouton du milieu et "
+"glisser pour tracer une nouvelle note"
+
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:324
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:597
+msgid "Click and drag to resize selected notes"
+msgstr "Cliquer et glisser pour redimensionner les notes sélectionnées"
+
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:599
+msgid "Click and drag to resize note"
+msgstr "Cliquer et glisser pour redimensionner une note"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:471
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:604
+msgid "Click and drag to move selected notes; hold Ctrl as well to copy"
+msgstr ""
+"Cliquer et glisser pour déplacer les notes sélectionnées; maintenir Ctrl "
+"pressé pour les copier"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:473
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:606
+msgid "Click and drag to copy selected notes"
+msgstr "Cliquer et glisser pour copier les notes sélectionnées"
+
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:610
+msgid "Click and drag to move note; hold Ctrl as well to copy"
+msgstr ""
+"Cliquer et glisser pour déplacer une note; maintenir Ctrl pressé pour copier"
+
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:612
+msgid "Click and drag to copy note"
+msgstr "Cliquer et glisser pour copier une note"
+
+#: ../src/gui/editors/matrix/MatrixEraser.cpp:54
+#: ../src/gui/editors/matrix/MatrixMover.cpp:67
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:65
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:63
+#: ../src/gui/editors/notation/ClefInserter.cpp:53
+#: ../src/gui/editors/notation/GuitarChordInserter.cpp:59
+#: ../src/gui/editors/notation/NotationEraser.cpp:67
+#: ../src/gui/editors/notation/NoteInserter.cpp:109
+#: ../src/gui/editors/notation/RestInserter.cpp:68
+#: ../src/gui/editors/notation/TextInserter.cpp:57
+msgid "Switch to Select Tool"
+msgstr "Sélecteur"
+
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:218
+msgid "Resize Event"
+msgstr "Redimensionner les événements"
+
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:221
+msgid "Resize Events"
+msgstr "Redimensionner les événements"
+
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:326
+msgid "Click and drag to resize a note"
+msgstr "Cliquer et glisser pour redimensionner une note"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:328
+msgid "Copy and Move Event"
+msgstr "Copier et déplacer l'événement"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:330
+msgid "Copy and Move Events"
+msgstr "Copier et déplacer les événements"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:334
+msgid "Move Event"
+msgstr "Bouger les événement"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:336
+msgid "Move Events"
+msgstr "Bouger les événements"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:465
+msgid "Click and drag to move a note; hold Ctrl as well to copy it"
+msgstr ""
+"Cliquer et glisser pour déplacer une note; maintenir Ctrl pressé pour la "
+"copier"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:467
+msgid "Click and drag to copy a note"
+msgstr "Cliquer et glisser pour copier une note"
+
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:361
+msgid "Click and drag to draw a note; Shift to avoid snapping to grid"
+msgstr ""
+"Cliquer et glisser pour dessiner une note; maintenir Maj. pressé pour ne pas "
+"l'accrocher à la grille"
+
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:363
+msgid "Click and drag to draw a note"
+msgstr "Cliquer et glisser pour dessiner une note"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:437
+#: ../src/gui/editors/matrix/MatrixView.cpp:3053
+msgid "Couldn't apply piano roll layout"
+msgstr "L'affichage de la matrice a échoué"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:663
+msgid "Resi&ze"
+msgstr "Re&dimensionner"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:669
+#: ../src/gui/editors/notation/NotationView.cpp:1919
+msgid "C&hord Insert Mode"
+msgstr "Mode insertion d'&accords"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:676
+#: ../src/gui/editors/notation/NotationView.cpp:1778
+msgid "Ste&p Recording"
+msgstr "Enregistrement &pas à pas"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:694
+msgid "&Legato"
+msgstr "&Legato"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:708
+msgid "Set to Current Velocity"
+msgstr "Règler la vélocité à la valeur courante"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:712
+msgid "Set Event &Velocities..."
+msgstr "Régler l'événement de &vélocité..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:716
+msgid "Trigger Se&gment..."
+msgstr "Segment déclenché..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:720
+msgid "Remove Triggers..."
+msgstr "Enlever les déclencheurs..."
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1153
+#: ../src/gui/editors/matrix/MatrixView.cpp:724
+#: ../src/gui/editors/tempo/TempoView.cpp:606
+msgid "Select &All"
+msgstr "Sélectionner &tout"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:732
+#: ../src/gui/editors/notation/NotationView.cpp:2325
+msgid "Cursor &Back"
+msgstr "&Reculer le curseur"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:736
+#: ../src/gui/editors/notation/NotationView.cpp:2329
+msgid "Cursor &Forward"
+msgstr "&Avancer le curseur"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:740
+#: ../src/gui/editors/notation/NotationView.cpp:2333
+msgid "Cursor Ba&ck Bar"
+msgstr "Retour curseur d'une mesure"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:744
+#: ../src/gui/editors/notation/NotationView.cpp:2337
+msgid "Cursor For&ward Bar"
+msgstr "Avance curseur d'une mesure"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:748
+#: ../src/gui/editors/notation/NotationView.cpp:2341
+msgid "Cursor Back and Se&lect"
+msgstr "Reculer le curseur et sé&lectionner"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:752
+#: ../src/gui/editors/notation/NotationView.cpp:2345
+msgid "Cursor Forward and &Select"
+msgstr "Avancer le curseur et &sélectionner"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:756
+#: ../src/gui/editors/notation/NotationView.cpp:2349
+msgid "Cursor Back Bar and Select"
+msgstr "Retour curseur d'une mesure et sélectionne"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:760
+#: ../src/gui/editors/notation/NotationView.cpp:2353
+msgid "Cursor Forward Bar and Select"
+msgstr "Avance curseur d'une mesure et sélectionne"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:764
+#: ../src/gui/editors/notation/NotationView.cpp:2363
+msgid "Cursor to St&art"
+msgstr "Curseur au &début"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:770
+#: ../src/gui/editors/notation/NotationView.cpp:2369
+msgid "Cursor to &End"
+msgstr "Curseur à la &fin"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:776
+#: ../src/gui/editors/notation/NotationView.cpp:2391
+msgid "Cursor to &Playback Pointer"
+msgstr "Curseur sur le pointeur d'exécution"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:820
+#: ../src/gui/editors/notation/NotationView.cpp:2435
+msgid "Playback Pointer to &Cursor"
+msgstr "Pointeur d'exécution au &curseur"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:826
+#: ../src/gui/editors/notation/NotationView.cpp:2441
+msgid "&Solo"
+msgstr "&Solo"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:841
+#: ../src/gui/editors/notation/NotationView.cpp:2456
+msgid "Set Loop to Selection"
+msgstr "Créer une boucle avec la sélection"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:845
+#: ../src/gui/editors/notation/NotationView.cpp:2460
+msgid "Clear L&oop"
+msgstr "Enlever la &boucle"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1157
+#: ../src/gui/editors/matrix/MatrixView.cpp:849
+#: ../src/gui/editors/notation/NotationView.cpp:2464
+#: ../src/gui/editors/tempo/TempoView.cpp:610
+msgid "Clear Selection"
+msgstr "Enlever la sélection"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1149
+#: ../src/gui/editors/matrix/MatrixView.cpp:854
+#: ../src/gui/editors/notation/NotationView.cpp:2471
+msgid "&Filter Selection"
+msgstr "&Filtrer la sélection"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:879
+msgid "&No Snap"
+msgstr "&Pas d'accrochage"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:884
+msgid "Snap to Bea&t"
+msgstr "Accrocher au &temps"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:888
+msgid "Snap to &Bar"
+msgstr "Accrocher à la &mesure"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:908
+#, c-format
+msgid "Snap to %1"
+msgstr "Accrocher à %1"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:917
+msgid "Show Instrument Parameters"
+msgstr "Afficher les paramètres de l'instrument"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:922
+#: ../src/gui/editors/notation/NotationView.cpp:1850
+msgid "Show Ch&ord Name Ruler"
+msgstr "Afficher la règlette &noms des accords"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:926
+#: ../src/gui/editors/notation/NotationView.cpp:1858
+msgid "Show &Tempo Ruler"
+msgstr "Afficher la règlette &tempo"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1238
+#: ../src/gui/editors/notation/NotationView.cpp:3245
+#, c-format
+msgid ""
+"_n: 1 event selected \n"
+" %n events selected "
+msgstr ""
+" 1 événement sélectionné \n"
+" %n événements sélectionnés "
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1241
+#: ../src/gui/editors/notation/NotationView.cpp:3247
+msgid " No selection "
+msgstr " Pas de sélection "
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1348
+#: ../src/gui/editors/matrix/MatrixView.cpp:1360
+#: ../src/gui/editors/matrix/MatrixView.cpp:2079
+#: ../src/gui/editors/notation/NotationView.cpp:5869
+msgid "Quantizing..."
+msgstr "Quantifie..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1370
+#: ../src/gui/editors/notation/NotationView.cpp:5407
+msgid "Collapsing notes..."
+msgstr "Fusion des notes..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1381
+msgid "Making legato..."
+msgstr "Réaliser un legato..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1476
+msgid "Note: %1 (%2.%3s)"
+msgstr "Note: %1 (%2.%3s)"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1531
+#: ../src/gui/editors/notation/NotationView.cpp:7206
+msgid "Time: %1 (%2.%3s)"
+msgstr "Temps: %1 (%2.%3s)"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1604
+#: ../src/gui/editors/notation/NotationView.cpp:4744
+#: ../src/gui/editors/notation/NotationView.cpp:4773
+msgid "Cutting selection to clipboard..."
+msgstr "Couper la sélection..."
+
+#: ../src/gui/editors/eventlist/EventView.cpp:912
+#: ../src/gui/editors/matrix/MatrixView.cpp:1636
+#: ../src/gui/editors/notation/NotationSelectionPaster.cpp:82
+msgid "Couldn't paste at this point"
+msgstr "Impossible de coller à cet endroit"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1647
+#: ../src/gui/editors/notation/NotationView.cpp:4754
+msgid "Deleting selection..."
+msgstr "Effacer Sélection..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1833
+#: ../src/gui/editors/notation/NotationView.cpp:5617
+#, c-format
+msgid "Unknown note insert action %1"
+msgstr "Action d'insertion de note %1 inconnue"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1837
+#: ../src/gui/editors/matrix/MatrixView.cpp:2857
+#: ../src/gui/editors/notation/NotationView.cpp:5621
+msgid "Inserting note"
+msgstr "Insérer Note"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2091
+msgid "Unquantizing..."
+msgstr "Dé-quantifier..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2120
+msgid " Grid: "
+msgstr " Grille: "
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2134
+msgid "Unit"
+msgstr "Unité"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2136
+msgid "Beat"
+msgstr "Temps"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2138
+msgid "Bar"
+msgstr "Mesure"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2159
+msgid " Velocity: "
+msgstr " Vélocité: "
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2170
+msgid " Quantize: "
+msgstr " Quantifie: "
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2584
+msgid "Raising velocities..."
+msgstr "Augmentation de la vélocité..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2596
+msgid "Lowering velocities..."
+msgstr "Diminution de la vélocité..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2611
+msgid "Set Event Velocities"
+msgstr "Régler l'événement de vélocité"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2616
+msgid "Setting Velocities..."
+msgstr "Réglages Vélocités..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2665
+msgid "Remove Triggers"
+msgstr "Enlever les déclencheurs"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2723
+msgid "%1 - Segment Track #%2 - %3"
+msgstr "%1 - Segment Piste #%2 - %3"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2730
+msgid "%1 - All Segments - %2"
+msgstr "%1 - Tous Segments - %2"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2737
+msgid ""
+"_n: %1 - 1 Segment - %2\n"
+"%1 - %n Segments - %2"
+msgstr ""
+"%1 - 1 Segment - %2\n"
+"%1 - %n Segments - %2"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2885
+msgid "Can't insert note: No grid duration selected"
+msgstr "Impossible d'insérer la note: Pas de grille de durée sélectionnée"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2935
+msgid " Chord "
+msgstr " Accord"
+
+#: ../src/gui/editors/matrix/MatrixEraser.cpp:105
+msgid "Click on a note to delete it"
+msgstr "Cliquer sur une note pour la supprimer"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:89
+msgid "Filter"
+msgstr "Filtre"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:245
+#: ../src/gui/editors/tempo/TempoView.cpp:117
+msgid "Time "
+msgstr "Temps "
+
+#: ../src/gui/editors/tempo/TempoView.cpp:118
+msgid "Type "
+msgstr "Type "
+
+#: ../src/gui/editors/tempo/TempoView.cpp:119
+msgid "Value "
+msgstr "Valeur "
+
+#: ../src/gui/editors/tempo/TempoView.cpp:120
+msgid "Properties "
+msgstr "Propriétés"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:208
+msgid "Common, hidden"
+msgstr "Commun, caché"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:210
+msgid "Hidden"
+msgstr "Caché"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:213
+msgid "Common"
+msgstr "Commun"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:220
+msgid "Time Signature "
+msgstr "Chiffrage de la mesure"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:245
+msgid "%1.%2%3"
+msgstr "%1.%2%3"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:255
+msgid "%1.%2%3 qpm (%4.%5%6 bpm) "
+msgstr "%1.%2%3 qpm (%4.%5%6 bpm) "
+
+#: ../src/gui/editors/tempo/TempoView.cpp:264
+msgid "Tempo "
+msgstr "Tempo "
+
+#: ../src/gui/editors/tempo/TempoView.cpp:271
+msgid "<nothing at this filter level>"
+msgstr "<rien dans ce niveau de filtre>"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:463
+msgid "Delete Tempo or Time Signature"
+msgstr "Effacer le tempo ou le chiffrage de la mesure"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:602
+msgid "&Edit Item"
+msgstr "Édit&er l'objet"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:834
+msgid "%1 - Tempo and Time Signature Editor"
+msgstr "%1 - Éditeur de tempo et de chiffrage de la mesure"
+
+#: ../src/gui/editors/guitar/GuitarChordEditorDialog.cpp:43
+msgid "Guitar Chord Editor"
+msgstr "Éditeur d'accords pour guitare"
+
+#: ../src/gui/editors/guitar/GuitarChordEditorDialog.cpp:51
+msgid "Start fret"
+msgstr "Frette initiale"
+
+#: ../src/gui/editors/guitar/GuitarChordEditorDialog.cpp:58
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:51
+msgid "Root"
+msgstr "Fondamentale"
+
+#: ../src/gui/editors/guitar/GuitarChordEditorDialog.cpp:62
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:55
+msgid "Extension"
+msgstr "Code"
+
+#: ../src/gui/editors/guitar/Fingering.cpp:118
+msgid "couldn't parse fingering '%1' in '%2'"
+msgstr "Échec de l'analyse du doigté '%1' dans '%2'"
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:45
+msgid "Guitar Chord Selector"
+msgstr "Sélecteur d'accords pour guitare"
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:64
+msgid "beginner"
+msgstr "Pour débutant"
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:65
+msgid "common"
+msgstr "Communs"
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:66
+msgid "all"
+msgstr "Tous"
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:86
+msgid "Fingerings"
+msgstr "Doigtés"
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:419
+msgid "couldn't open file '%1'"
+msgstr "Impossible d'ouvrir le fichier '%1'"
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:428
+#, c-format
+msgid "couldn't parse chord dictionnary : %1"
+msgstr "Échec de l'analyse du dictionnaire d'accords : %1"
+
+#: ../src/gui/editors/notation/NoteFontViewer.cpp:87
+#, c-format
+msgid "Note Font Viewer: %1"
+msgstr "Afficheur de police musicale: %1"
+
+#: ../src/gui/editors/notation/NoteFontViewer.cpp:93
+msgid " Component: "
+msgstr " Composant: "
+
+#: ../src/gui/editors/notation/NoteFontViewer.cpp:101
+msgid " View: "
+msgstr " Vue: "
+
+#: ../src/gui/editors/notation/NoteFontViewer.cpp:104
+msgid "Glyphs"
+msgstr "Glyphes"
+
+#: ../src/gui/editors/notation/NoteFontViewer.cpp:105
+msgid "Codes"
+msgstr "Codes"
+
+#: ../src/gui/editors/notation/NoteFontViewer.cpp:107
+msgid " Page: "
+msgstr " Page: "
+
+#: ../src/gui/editors/notation/ClefInserter.cpp:64
+#: ../src/gui/editors/notation/GuitarChordInserter.cpp:71
+#: ../src/gui/editors/notation/RestInserter.cpp:79
+#: ../src/gui/editors/notation/TextInserter.cpp:68
+msgid "Switch to Inserting Notes"
+msgstr "Insérer notes"
+
+#: ../src/gui/editors/notation/NotationView.cpp:522
+msgid "Close track headers"
+msgstr "Cacher les en-têtes des pistes"
+
+#: ../src/gui/editors/notation/NotationView.cpp:917
+msgid "Preparing to print..."
+msgstr "Préparation pour l'impression..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:1516
+msgid "Note &Font"
+msgstr "&Police des Notes"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1539
+msgid "Si&ze"
+msgstr "&Taille"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1545
+msgid "Show Track Headers"
+msgstr "Afficher les En-têtes des Pistes"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1550
+msgid "S&pacing"
+msgstr "Es&pacement"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1572
+msgid "Du&ration Factor"
+msgstr "Facteur de du&rée"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1598
+msgid "Note &Style"
+msgstr "&Style des notes"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1624
+msgid "Insert Rest"
+msgstr "Insérer un silence"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1628
+msgid "Switch from Note to Rest"
+msgstr "Transformer en silences"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1633
+msgid "Switch from Rest to Note"
+msgstr "Transformer en notes"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1690
+msgid "No accidental"
+msgstr "Pas d'altération"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1691
+msgid "Follow previous accidental"
+msgstr "Suivre l'altération précédente"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1692
+msgid "Sharp"
+msgstr "Dièse"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1693
+msgid "Flat"
+msgstr "Bémol"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1694
+msgid "Natural"
+msgstr "Bécarre"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1695
+msgid "Double sharp"
+msgstr "Double dièse"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1696
+msgid "Double flat"
+msgstr "Double bémol"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1717
+msgid "&Treble Clef"
+msgstr "Clef de &sol"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1724
+msgid "&Alto Clef"
+msgstr "Clef d'&ut 3ème"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1731
+msgid "Te&nor Clef"
+msgstr "Clef d'u&t 4ème"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1738
+msgid "&Bass Clef"
+msgstr "Clef de &fa"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1745
+msgid "&Text"
+msgstr "&Texte"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1751
+msgid "&Guitar Chord"
+msgstr "Accords pour &guitare"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1784
+msgid "Select from Sta&rt"
+msgstr "Sélectionner depuis le &début"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1788
+msgid "Select to &End"
+msgstr "Sélectionner depuis la &fin"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1792
+msgid "Select Whole St&aff"
+msgstr "Sélectionner &tout"
+
+#: ../src/commands/edit/CutAndCloseCommand.h:53
+#: ../src/gui/editors/notation/NotationView.cpp:1796
+msgid "C&ut and Close"
+msgstr "Co&uper et fermer"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1800
+msgid "Pa&ste..."
+msgstr "Co&ller..."
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:122
+#: ../src/gui/editors/notation/NotationView.cpp:1808
+msgid "Move to Staff Above"
+msgstr "Déplacer vers la portée du dessus"
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:126
+#: ../src/gui/editors/notation/NotationView.cpp:1812
+msgid "Move to Staff Below"
+msgstr "Déplacer vers la portée du dessous"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1826
+msgid "&Linear Layout"
+msgstr "Layout &linéaire"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1835
+msgid "&Continuous Page Layout"
+msgstr "Layout &continu"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1844
+msgid "&Multiple Page Layout"
+msgstr "Mise en page &multiple"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1854
+msgid "Show Ra&w Note Ruler"
+msgstr "Afficher la règlette note &brute"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1862
+msgid "Show &Annotations"
+msgstr "Afficher les &annotations"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1866
+msgid "Show Lily&Pond Directives"
+msgstr "Afficher les directives Lily&Pond"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1870
+msgid "Open L&yric Editor"
+msgstr "Ouvrir l'éditeur de &paroles"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1912
+msgid "Trip&let Insert Mode"
+msgstr "Mode insertion de &triolet"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1926
+msgid "Grace Insert Mode"
+msgstr "Mode insertion d'ornement"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2180
+msgid "&Dump selected events to stderr"
+msgstr "&Vider les événements sélectionnés vers stderr"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2248
+msgid "Ma&ke Ornament..."
+msgstr "Réaliser un &ornement..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:2252
+msgid "Trigger &Ornament..."
+msgstr "&Ornement déclencheur..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:2256
+msgid "Remove Ornament..."
+msgstr "Enlever l'ornement..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:2261
+msgid "&None"
+msgstr "&Aucun"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2289
+msgid "Convert Notation For..."
+msgstr "Convertir la partition vers..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:2298
+msgid "Show &Notes Toolbar"
+msgstr "Afficher la barre d'outils des &notes"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2299
+msgid "Show &Rests Toolbar"
+msgstr "Afficher la barre d'outils des &silences"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2300
+msgid "Show &Accidentals Toolbar"
+msgstr "Afficher la barre d'outils des &altérations"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2301
+msgid "Show Cle&fs Toolbar"
+msgstr "Afficher la barre d'outils des &clefs"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2303
+msgid "Show &Marks Toolbar"
+msgstr "Afficher la barre d'outils des &marques"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2305
+msgid "Show &Group Toolbar"
+msgstr "Afficher la barre d'outils des &groupes"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2307
+msgid "Show &Layout Toolbar"
+msgstr "Afficher la barre d'outils &mise en Page"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2311
+msgid "Show M&eta Toolbar"
+msgstr "Afficher la barre d'outils m&éta"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2373
+msgid "Cursor &Up Staff"
+msgstr "Curseur en &haut de portée"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2377
+msgid "Cursor &Down Staff"
+msgstr "Curseur en &bas de portée"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2381
+msgid "Cursor Pre&vious Segment"
+msgstr "Curseur sur le segment précéden&t"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2385
+msgid "Cursor Ne&xt Segment"
+msgstr "Curseur sur le segment &suivant"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2475
+msgid "Push &Left"
+msgstr "Pousser à &gauche"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2479
+msgid "Push &Right"
+msgstr "Pousser à &droite"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2483
+msgid "Push &Up"
+msgstr "Pousser en &haut"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2487
+msgid "Push &Down"
+msgstr "Pousser en &bas"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2491
+msgid "&Restore Positions"
+msgstr "&Rétablir"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2495
+msgid "Make &Invisible"
+msgstr "Rendre &invisible"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2499
+msgid "Make &Visible"
+msgstr "Rendre &visible"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2503
+msgid "Toggle Dot"
+msgstr "Changer point"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2507
+#: ../src/gui/editors/notation/NotationView.cpp:2511
+msgid "Add Dot"
+msgstr "Ajouter point"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2570
+#, c-format
+msgid ""
+"_n: 1 pixel\n"
+"%n pixels"
+msgstr ""
+"1 pixel\n"
+"%n pixels"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2619
+msgid " Font: "
+msgstr " Police: "
+
+#: ../src/gui/editors/notation/NotationView.cpp:2647
+msgid "Unknown font \"%1\", using default"
+msgstr "Police inconnue \"%1\", utilisation de la police par défaut"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2655
+msgid " Size: "
+msgstr " Taille: "
+
+#: ../src/gui/editors/notation/NotationView.cpp:2677
+msgid " Spacing: "
+msgstr " Espacement: "
+
+#: ../src/gui/editors/notation/NotationView.cpp:2993
+#: ../src/gui/editors/notation/NotationView.cpp:3818
+msgid " Ready."
+msgstr " Prêt."
+
+#: ../src/gui/editors/notation/NotationView.cpp:2998
+msgid "Laying out score..."
+msgstr "Mise en page de la partition..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:3011
+msgid "Laying out staff %1..."
+msgstr "Mise en page de la portée %1..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:3020
+msgid "Reconciling staffs..."
+msgstr "Réconciliant les portées..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:3885
+msgid "Sizing and allocating canvas..."
+msgstr "Dimensionnement et allocation du canvas..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:4050
+msgid "note"
+msgstr "note"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4050
+msgid "rest"
+msgstr "silence"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4211
+msgid "%1 - Segment Track #%2 - Notation"
+msgstr "%1 - Segment Piste #%2 - Notation"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4217
+msgid "%1 - All Segments - Notation"
+msgstr "%1 - Tous les segments - Notation"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4222
+msgid ""
+"_n: %1 - Segment - Notation\n"
+"%1 - %n Segments - Notation"
+msgstr ""
+"%1 - Segment - Notation\n"
+"%1 - %n Segments - Notation"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4243
+msgid "Grace"
+msgstr "Ornement"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4247
+#: ../src/gui/editors/notation/NotationView.cpp:4251
+#: ../src/gui/editors/notation/NotationView.cpp:4255
+msgid "%1 %2"
+msgstr "%1 %2"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4271
+msgid "Hidden annotations"
+msgstr "Cacher les annotations"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4293
+msgid "Hidden LilyPond directives"
+msgstr "Directives LilyPond cachées"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4326
+#, c-format
+msgid "Unknown spacing action %1"
+msgstr "Action d'espacement inconnue %1"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4384
+#, c-format
+msgid "Unknown proportion action %1"
+msgstr "Action de proportion inconnue %1"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4431
+#, c-format
+msgid "Unknown font action %1"
+msgstr "Action de police inconnue %1"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4449
+#, c-format
+msgid "Unknown font size %1"
+msgstr "Taille de police inconnue %1"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4453
+#, c-format
+msgid "Unknown font size action %1"
+msgstr "Action de taille de police inconnue %1"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4780
+msgid ""
+"The Restricted paste type requires enough empty space (containing only "
+"rests) at the paste position to hold all of the events to be pasted.\n"
+"Not enough space was found.\n"
+"If you want to paste anyway, consider using one of the other paste types "
+"from the \"Paste...\" option on the Edit menu. You can also change the "
+"default paste type to something other than Restricted if you wish."
+msgstr ""
+"Le mode de collage dans un silence existant [restricted] nécessite "
+"suffisamment d'espace (ne contenant que des silences) à l'emplacement de "
+"destination pour contenir tous les événements à coller.\n"
+"L'espace disponible est insuffisant.\n"
+"Si vous souhaitez néanmoins effectuer cette opération, envisagez de "
+"sélectionner un autre mode de collage en utilisant les options \"Coller...\" "
+"du menu \"dÉition\". Vous pouvez également, si vous le désirez, remplacer "
+"le mode de collage par défaut par autre chose que \"dans un silence existant"
+"\" [restricted]."
+
+#: ../src/gui/editors/notation/NotationView.cpp:4800
+msgid "Can't paste multiple Segments into one"
+msgstr "Ne peut pas coller plusieurs segments dans un seul"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4828
+#: ../src/gui/editors/notation/NotationView.cpp:4877
+msgid "Couldn't paste at this point."
+msgstr "Ne peut pas coller ici."
+
+#: ../src/gui/editors/notation/NotationView.cpp:4896
+msgid "Move Events to Staff Above"
+msgstr "Déplacer les événements vers la portée de dessus"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4924
+msgid "Move Events to Staff Below"
+msgstr "Déplacer les événements vers la portée de dessous"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5036
+msgid "Pushing selection left..."
+msgstr "Déplacement de la sélection à gauche..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5047
+msgid "Pushing selection right..."
+msgstr "Déplacement de la sélection à droite..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5058
+msgid "Pushing selection up..."
+msgstr "Déplacement de la sélection en haut..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5069
+msgid "Pushing selection down..."
+msgstr "Déplacement de la sélection en bas..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5080
+msgid "Restoring computed positions..."
+msgstr "Restauration des positions calculées..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5089
+msgid "Making visible..."
+msgstr "Rendre visible..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5098
+msgid "Making invisible..."
+msgstr "Rendre invisible..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5185
+msgid "Beaming group..."
+msgstr "Ligature des groupes..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5195
+msgid "Auto-beaming selection..."
+msgstr "Ligature automatique dans la sélection..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5205
+msgid "Breaking groups..."
+msgstr "Dégrouper..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5293
+msgid "Untupleting..."
+msgstr "Suppression de N-olets..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5301
+msgid "Adding slur..."
+msgstr "Ajout d'un lié..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5302
+msgid "slur"
+msgstr "liaison"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5307
+msgid "Adding phrasing slur..."
+msgstr "Ajout de liaisons d'expression..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5308
+msgid "phrasing slur"
+msgstr "liaison d'expression"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5313
+msgid "Adding glissando..."
+msgstr "Ajouter un glissando..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5314
+msgid "glissando"
+msgstr "glissando"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5319
+msgid "Adding crescendo..."
+msgstr "Ajouter un crescendo..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5320
+#: ../src/gui/editors/notation/NotationView.cpp:5326
+msgid "dynamic"
+msgstr "dynamique"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5325
+msgid "Adding decrescendo..."
+msgstr "Ajouter un decrescendo..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5331
+#: ../src/gui/editors/notation/NotationView.cpp:5337
+#: ../src/gui/editors/notation/NotationView.cpp:5343
+#: ../src/gui/editors/notation/NotationView.cpp:5349
+msgid "Adding octave..."
+msgstr "Ajout d'une octave..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5332
+#: ../src/gui/editors/notation/NotationView.cpp:5338
+#: ../src/gui/editors/notation/NotationView.cpp:5344
+#: ../src/gui/editors/notation/NotationView.cpp:5350
+msgid "ottava"
+msgstr "octave"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5366
+msgid "Can't add overlapping %1 indications"
+msgstr "Impossible d'ajouter des indications %1 qui se chevauchent"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5375
+msgid "Making chord..."
+msgstr "Réalisation de l'accord..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5387
+msgid "Normalizing rests..."
+msgstr "Normaliser silences..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5397
+msgid "Collapsing rests..."
+msgstr "Fusion des silences..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5417
+msgid "Tying notes..."
+msgstr "Rattacher les notes..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5427
+msgid "Untying notes..."
+msgstr "Détacher les notes..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5437
+msgid "Making notes viable..."
+msgstr "Rendre les notes viables..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5447
+msgid "Removing counterpoint..."
+msgstr "Enlever le contrepoint..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5457
+msgid "Pointing stems up..."
+msgstr "Queues en haut..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5467
+msgid "Pointing stems down..."
+msgstr "Queues en bas..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5478
+msgid "Restoring computed stem directions..."
+msgstr "Restauration des directions de queues calculées..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5488
+#: ../src/gui/editors/notation/NotationView.cpp:5498
+msgid "Positioning slurs..."
+msgstr "Positionnement des liés..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5509
+msgid "Restoring slur positions..."
+msgstr "Restauration de la position des liés..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5519
+#: ../src/gui/editors/notation/NotationView.cpp:5529
+msgid "Positioning ties..."
+msgstr "Positionnement des liaisons..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5540
+msgid "Restoring tie positions..."
+msgstr "Restauration des positions des liaisons..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5550
+msgid "Fixing notation quantization..."
+msgstr "Quantifieur de partition heuristique..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5560
+msgid "Removing notation quantization..."
+msgstr "Suppression de la quantification de la partition..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5577
+msgid "Changing to %1 style..."
+msgstr "Appliquer le style %1..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5585
+#, c-format
+msgid "Unknown style action %1"
+msgstr "Action de style inconnue %1"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5598
+#: ../src/gui/editors/notation/NotationView.cpp:5639
+#: ../src/gui/editors/notation/NotationView.cpp:5695
+msgid "No note duration selected"
+msgstr "Pas de durée de note sélectionnée"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5660
+msgid "No rest duration selected"
+msgstr "Pas de durée de silence sélectionné"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5746
+msgid "No note or rest duration selected"
+msgstr "Pas de durée de silence ou de note sélectionnée"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5757
+#: ../src/gui/editors/notation/NotationView.cpp:5768
+#: ../src/gui/editors/notation/NotationView.cpp:5779
+#: ../src/gui/editors/notation/NotationView.cpp:5790
+#: ../src/gui/editors/notation/NotationView.cpp:5801
+#: ../src/gui/editors/notation/NotationView.cpp:5812
+#: ../src/gui/editors/notation/NotationView.cpp:5823
+msgid "Forcing accidentals..."
+msgstr "Création des altérations imposées..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5834
+msgid "Restoring accidentals..."
+msgstr "Restauration des altérations..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5845
+msgid "Showing cautionary accidentals..."
+msgstr "Affichage des altérations prudentes..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5855
+msgid "Cancelling cautionary accidentals..."
+msgstr "Suppression des altérations prudentes..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5884
+msgid "Interpreting selection..."
+msgstr "Interprétation de la sélection..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5896
+msgid "Setting note durations..."
+msgstr "Définir la durée des notes..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5904
+#: ../src/gui/editors/notation/NotationView.cpp:5912
+msgid "Adding dot..."
+msgstr "Ajouter point..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5934
+msgid "Text: "
+msgstr "Texte: "
+
+#: ../src/gui/editors/notation/NotationView.cpp:5948
+msgid "Fingering: "
+msgstr "Doigté: "
+
+#: ../src/gui/editors/notation/NotationView.cpp:6036
+msgid "Ornament track %1 bar %2"
+msgstr "Ornement piste %1 mesure %2"
+
+#: ../src/gui/editors/notation/NotationView.cpp:6038
+#, c-format
+msgid "Ornament bar %1"
+msgstr "Ornement mesure %1"
+
+#: ../src/gui/editors/notation/NotationView.cpp:6098
+msgid "Remove Ornaments"
+msgstr "Enlever les ornements"
+
+#: ../src/gui/editors/notation/NotationView.cpp:6145
+msgid "Estimated key signature shown"
+msgstr "Montre l'armature estimée"
+
+#: ../src/gui/editors/notation/NotationStaff.cpp:1249
+#: ../src/gui/editors/notation/NotationView.cpp:6202
+msgid "Sustain"
+msgstr "Sustain"
+
+#: ../src/gui/editors/notation/NotationView.cpp:6218
+msgid ""
+"There is no sustain controller defined for this device.\n"
+"Please ensure the device is configured correctly in the Manage MIDI Devices "
+"dialog in the main window."
+msgstr ""
+"Il n'y a pas de contrôleur de maintien (sustain) défini pour ce "
+"périphérique.\n"
+"Veuillez vérifier que le périphérique est configuré correctement dans le "
+"dialogue \"Gestion des périphériques MIDI\" de la fenêtre principale."
+
+#: ../src/gui/editors/notation/NotationView.cpp:7250
+msgid "Can't insert note: No note duration selected"
+msgstr "Impossible d'insérer la note: Pas de durée de note sélectionnée"
+
+#: ../src/gui/editors/notation/NotationEraser.cpp:61
+#: ../src/gui/editors/notation/NotationSelector.cpp:83
+msgid "Switch to Insert Tool"
+msgstr "Insérer"
+
+#: ../src/gui/editors/notation/NotePixmapFactory.cpp:2303
+#: ../src/gui/editors/notation/NotePixmapFactory.cpp:2347
+msgid "..."
+msgstr "..."
+
+#: ../src/gui/editors/notation/NoteFontFactory.cpp:200
+msgid "Can't obtain a default font -- no fonts found"
+msgstr "Ne peut pas obtenir une police par défaut -- Aucune police trouvée"
+
+#: ../src/gui/editors/notation/NoteFontMap.cpp:52
+#: ../src/gui/general/PresetGroup.cpp:49
+msgid "unknown error"
+msgstr "erreur inconnue"
+
+#: ../src/gui/editors/notation/NoteFontMap.cpp:78
+msgid "Can't open font mapping file %1 or %2"
+msgstr "Impossible d'ouvrir le fichier de correspondances %1 or %2"
+
+#: ../src/gui/editors/notation/NoteFontMap.cpp:82
+#, c-format
+msgid "Can't open font mapping file %1"
+msgstr "Impossible d'ouvrir le fichier de correspondances %1"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:52
+msgid "%1-dotted-%2"
+msgstr "%1-pointée-%2"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:54
+msgid "%1-dotted %2"
+msgstr "%1-pointée-%2"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:57
+#, c-format
+msgid "dotted-%1"
+msgstr "pointée-%1"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:59
+#, c-format
+msgid "dotted %1"
+msgstr "%1 pointée"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:83
+msgid "sixty-fourth note"
+msgstr "quadruple croche"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:83
+msgid "thirty-second note"
+msgstr "triple croche"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:84
+msgid "sixteenth note"
+msgstr "double croche"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:84
+msgid "eighth note"
+msgstr "croche"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:85
+msgid "quarter note"
+msgstr "noire"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:85
+msgid "half note"
+msgstr "blanche"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:86
+msgid "whole note"
+msgstr "ronde"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:86
+msgid "double whole note"
+msgstr "double ronde"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:89
+msgid "sixty-fourth notes"
+msgstr "quadruples croches"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:89
+msgid "thirty-second notes"
+msgstr "triples croches"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:90
+msgid "sixteenth notes"
+msgstr "doubles croches"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:90
+msgid "eighth notes"
+msgstr "croches"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:91
+msgid "quarter notes"
+msgstr "noires"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:91
+msgid "half notes"
+msgstr "blanches"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:92
+msgid "whole notes"
+msgstr "rondes"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:92
+msgid "double whole notes"
+msgstr "doubles rondes"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:96
+#: ../src/gui/editors/notation/NotationStrings.cpp:154
+msgid "%1 triplets"
+msgstr "%1 triolets"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:100
+#: ../src/gui/editors/notation/NotationStrings.cpp:158
+msgid "%1 triplet"
+msgstr "%1 triolet"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:143
+msgid "64th"
+msgstr "quadruple croche"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:143
+msgid "32nd"
+msgstr "triple croche"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:143
+msgid "16th"
+msgstr "double croche"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:143
+msgid "8th"
+msgstr "croche"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:144
+msgid "quarter"
+msgstr "noire"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:144
+msgid "half"
+msgstr "blanche"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:144
+msgid "whole"
+msgstr "ronde"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:145
+msgid "double whole"
+msgstr "double ronde"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:148
+msgid "64ths"
+msgstr "quadruples croches"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:148
+msgid "32nds"
+msgstr "triples croches"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:148
+msgid "16ths"
+msgstr "doubles croches"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:148
+msgid "8ths"
+msgstr "croches"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:149
+msgid "quarters"
+msgstr "noires"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:149
+msgid "halves"
+msgstr "blanches"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:149
+msgid "wholes"
+msgstr "rondes"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:150
+msgid "double wholes"
+msgstr "double rondes"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:278
+msgid "%1 ticks"
+msgstr "%1 ticks"
+
+#: ../src/gui/editors/notation/FontViewFrame.cpp:100
+#, c-format
+msgid "Error: Unable to match font name %1"
+msgstr "Erreur: Nom introuvable %1"
+
+#: ../src/gui/editors/notation/FontViewFrame.cpp:108
+msgid "Warning: No good match for font name %1 (best is %2)"
+msgstr ""
+"Avertissement: Pas de résultat pour ce nom de police %1 (le meilleur est %2)"
+
+#: ../src/gui/editors/notation/FontViewFrame.cpp:116
+#, c-format
+msgid "Error: Unable to open best-match font %1"
+msgstr "Erreur: Impossible d'ouvrir la police adéquate %1"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:113
+msgid "Track %1 : \"%2\""
+msgstr "Piste %1 : \"%2\""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:119
+#, c-format
+msgid ""
+"\n"
+"Notate for: %1"
+msgstr ""
+"\n"
+"Ecrit pour: %1"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:121
+msgid "normal"
+msgstr "normale"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:124
+msgid "small"
+msgstr "petite"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:127
+msgid "tiny"
+msgstr "minuscule"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:131
+msgid "--"
+msgstr "--"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:156
+msgid ""
+"\n"
+"Size: %1, Bracket: %2 "
+msgstr ""
+"\n"
+"Taille: %1, Accolade: %2"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:183
+msgid ""
+"\n"
+"bars [%1-%2] in %3 (tr=%4) : \"%5\""
+msgstr ""
+"\n"
+"mesures [%1-%2] en %3 (tr=%4) : \"%5\""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:190
+msgid ""
+"\n"
+"bars [%1-%2] (tr=%3) : \"%4\""
+msgstr ""
+"\n"
+"mesures [%1-%2] (tr=%3) : \"%4\""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:240
+msgid "C#"
+msgstr "Do#"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:242
+msgid "Eb"
+msgstr "Mib"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:245
+msgid "F#"
+msgstr "Fa#"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:247
+msgid "G#"
+msgstr "Sol#"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:249
+msgid "Bb"
+msgstr "Sib"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:352
+msgid "%1: %2"
+msgstr "%1: %2"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:355
+#, c-format
+msgid " in %1"
+msgstr " en %1"
+
+#: ../src/gui/editors/notation/NotationStaff.cpp:452
+msgid "Rendering staff %1..."
+msgstr "Rendu de la portée %1..."
+
+#: ../src/gui/editors/notation/NotationStaff.cpp:515
+msgid "Rendering notes on staff %1..."
+msgstr "Rendu des notes sur la portée %1..."
+
+#: ../src/gui/editors/notation/NotationStaff.cpp:583
+msgid "Positioning staff %1..."
+msgstr "Positionnement de la portée %1..."
+
+#: ../src/gui/editors/notation/NotationSelectionPaster.cpp:85
+msgid "Ready."
+msgstr "Prêt."
+
+#: ../src/gui/editors/notation/RestInserter.cpp:62
+msgid "Dotted rest"
+msgstr "Silence pointé"
+
+#: ../src/gui/editors/notation/NoteStyleFileReader.cpp:57
+#, c-format
+msgid "Can't open style file %1"
+msgstr "Ne peut pas ouvrir le fichier de style %1"
+
+#: ../src/gui/editors/notation/NoteStyleFileReader.cpp:92
+msgid "type is a required attribute of note"
+msgstr "le type est un attribut de note nécessaire"
+
+#: ../src/gui/editors/notation/NoteStyleFileReader.cpp:101
+#, c-format
+msgid "Unrecognised note name %1"
+msgstr "Nom de note non reconnu %1"
+
+#: ../src/gui/editors/notation/NoteStyleFileReader.cpp:108
+msgid "global element must precede note elements"
+msgstr "L'élément global doit précéder les éléments de note"
+
+#: ../src/gui/editors/notation/NoteStyleFileReader.cpp:137
+msgid ""
+"global and note elements may have shape or charname attribute, but not both"
+msgstr ""
+"Les éléments globaux et note peuvent avoir soit un attribut \"shape\", soit "
+"un attribut \"charname\", mais pas les deux"
+
+#: ../src/gui/editors/notation/NotationVLayout.cpp:493
+msgid ""
+"Spanned note at %1 has no HEIGHT_ON_STAFF property!\n"
+"This is a bug (the program would previously have crashed by now)"
+msgstr ""
+"La note à %1 n'a pas de propriété HEIGHT_ON_STAFF!\n"
+"Ceci est un bogue (le programme aurait dû s'arrêter anormalement)"
+
+#: ../src/gui/editors/notation/NoteInserter.cpp:82
+msgid "Auto-Beam when appropriate"
+msgstr "Ligatures automatiques quand approprié"
+
+#: ../src/gui/editors/notation/NoteInserter.cpp:103
+msgid "Dotted note"
+msgstr "Note pointée"
+
+#: ../src/gui/editors/notation/NoteInserter.cpp:120
+msgid "Switch to Inserting Rests"
+msgstr "Insérer silences"
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:98
+msgid "Collapse Rests"
+msgstr "Fusionner les silences"
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:102
+msgid "Respell as Flat"
+msgstr "Redéfinir avec un bémol"
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:106
+msgid "Respell as Sharp"
+msgstr "Redéfinir avec un dièse"
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:110
+msgid "Respell as Natural"
+msgstr "Redéfinir avec un bécarre"
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:114
+msgid "Collapse Notes"
+msgstr "Fusionner les Notes"
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:130
+msgid "Make Invisible"
+msgstr "Rendre invisible"
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:134
+msgid "Make Visible"
+msgstr "Rendre visible"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:129
+msgid "Event filters"
+msgstr "Filtres d'événement"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:138
+msgid "Rest"
+msgstr "Silence"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:139
+msgid "Indication"
+msgstr "Indication"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:141
+msgid "Other"
+msgstr "Autre"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:161
+msgid "Triggered Segment Properties"
+msgstr "Propriétés du segment déclenché"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:166
+msgid "Label: "
+msgstr "Étiquette: "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:176
+msgid "Base pitch: "
+msgstr "Ton: "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:183
+msgid "Base velocity: "
+msgstr "Vélocité: "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:246
+msgid "Duration "
+msgstr "Durée "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:247
+msgid "Event Type "
+msgstr "Type d'événement "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:248
+msgid "Pitch "
+msgstr "Ton "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:249
+msgid "Velocity "
+msgstr "Vélocité "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:250
+msgid "Type (Data1) "
+msgstr "Type (Data1) "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:251
+msgid "Value (Data2) "
+msgstr "Valeur (Data2) "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:461
+msgid "(group %1) "
+msgstr "(groupe %1) "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:519
+msgid "<no events at this filter level>"
+msgstr "<pas d'événement dans ce niveau de filtre>"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:521
+msgid "<no events>"
+msgstr "<pas d'événement>"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:696
+msgid "Segment label"
+msgstr "Étiquette du segment"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:696
+msgid "Label:"
+msgstr "Étiquette:"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1123
+msgid "&Insert Event"
+msgstr "&Insérer événement"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1130
+msgid "&Delete Event"
+msgstr "&Effacer événement"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1137
+msgid "&Edit Event"
+msgstr "Édit&er événement"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1144
+msgid "&Advanced Event Editor"
+msgstr "Éditeur &avancé d'événement"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1518
+msgid "Open in Event Editor"
+msgstr "Ouvrir dans éditeur d'événement"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1519
+msgid "Open in Expert Event Editor"
+msgstr "Ouvrir dans l'éditeur expert d'événement"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1577
+msgid "%1 - Triggered Segment: %2"
+msgstr "%1 - segment déclenché: %2"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1592
+msgid "%1 - Segment Track #%2 - Event List"
+msgstr "%1 - Segment Piste #%2 - Liste d'événements"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1598
+msgid "%1 - %2 Segments - Event List"
+msgstr "%1 - %2 Segments - Liste d'événements"
+
+#: ../src/gui/rulers/TempoRuler.cpp:131
+msgid "Insert Tempo Change at Playback Position"
+msgstr "Insérer un changement de tempo au pointeur d'exécution"
+
+#: ../src/gui/rulers/TempoRuler.cpp:136
+msgid "Delete Tempo Change"
+msgstr "Effacer un changement de tempo"
+
+#: ../src/gui/rulers/TempoRuler.cpp:140
+msgid "Ramp Tempo to Next Tempo"
+msgstr "Varier linéairement le tempo jusqu'à sa prochaine valeur définie"
+
+#: ../src/gui/rulers/TempoRuler.cpp:144
+msgid "Un-Ramp Tempo"
+msgstr "Supprimer la variation linéaire du tempo"
+
+#: ../src/gui/rulers/TempoRuler.cpp:149
+msgid "Edit Tempo..."
+msgstr "Editer le tempo..."
+
+#: ../src/gui/rulers/TempoRuler.cpp:153
+msgid "Edit Time Signature..."
+msgstr "Editer le chiffrage de la mesure..."
+
+#: ../src/gui/rulers/TempoRuler.cpp:588
+msgid "%1.%2%3 (%4.%5%6 bpm)"
+msgstr "%1.%2%3 (%4.%5%6 bpm)"
+
+#: ../src/gui/rulers/TempoRuler.cpp:596
+msgid "%1.%2%3 bpm"
+msgstr "%1.%2%3 bpm"
+
+#: ../src/gui/rulers/TempoRuler.cpp:604
+msgid "%1 - %2.%3%4"
+msgstr "%1 - %2.%3%4"
+
+#: ../src/gui/rulers/ControlRulerEventInsertCommand.cpp:36
+msgid "Insert Controller Event"
+msgstr "Insérer un événement contrôleur"
+
+#: ../src/gui/rulers/ControlChangeCommand.cpp:35
+msgid "Control Change"
+msgstr "Changement de contrôle"
+
+#: ../src/gui/rulers/PropertyViewRuler.cpp:72
+msgid "%1 controller"
+msgstr "%1 contrôleur"
+
+#: ../src/gui/rulers/RawNoteRuler.cpp:453
+msgid "Track #%1, Segment \"%2\" (runtime id %3)"
+msgstr "Piste #%1, Segment \"%2\" (id %3)"
+
+#: ../src/gui/rulers/MarkerRuler.cpp:100
+msgid "Insert Marker"
+msgstr "Insérer un marqueur"
+
+#: ../src/gui/rulers/MarkerRuler.cpp:104
+msgid "Insert Marker at Playback Position"
+msgstr "Insérer un marqueur au pointeur d'exécution"
+
+#: ../src/gui/rulers/MarkerRuler.cpp:109
+msgid "Delete Marker"
+msgstr "Supprimer ce marqueur"
+
+#: ../src/gui/rulers/MarkerRuler.cpp:114
+msgid "Edit Marker..."
+msgstr "Éditer ce marqueur..."
+
+#: ../src/gui/rulers/MarkerRuler.cpp:119
+msgid ""
+"Click on a marker to move the playback pointer.\n"
+"Shift-click to set a range between markers.\n"
+"Double-click to open the marker editor."
+msgstr ""
+"Cliquer sur un marqueur pour y placer le pointeur d'exécution.\n"
+"Majuscules + cliquer pour définir une plage entre deux marqueurs.\n"
+"Double-cliquer pour ouvrir l'éditeur de marqueur."
+
+#: ../src/gui/rulers/ChordNameRuler.cpp:97
+msgid ""
+"Chord name ruler.\n"
+"Turn it on and off from the Settings->Rulers menu."
+msgstr ""
+"Règlette du nom des accords.\n"
+"Peut être activée ou désactivée depuis le menu Configuration->règlettes."
+
+#: ../src/gui/rulers/ControlRulerEventEraseCommand.cpp:37
+msgid "Erase Controller Event(s)"
+msgstr "Effacer le(s) événement(s) contrôleur(s)"
+
+#: ../src/gui/general/EditView.cpp:901
+#: ../src/gui/rulers/ControllerEventsRuler.cpp:188
+msgid "Unsupported Event Type"
+msgstr "Type d'événement non supporté"
+
+#: ../src/gui/rulers/ControllerEventsRuler.cpp:203
+msgid "Controller Events"
+msgstr "Événements contrôleurs"
+
+#: ../src/gui/rulers/ControllerEventsRuler.cpp:278
+msgid "Controller Event Number"
+msgstr "Numéro de l'événement contrôleur"
+
+#: ../src/gui/rulers/ControllerEventsRuler.cpp:471
+msgid "Add line of controllers"
+msgstr "Ajouter une ligne de contrôleurs"
+
+#: ../src/gui/rulers/LoopRuler.cpp:89
+msgid ""
+"Click and drag to move the playback pointer.\n"
+"Shift-click and drag to set a range for looping or editing.\n"
+"Shift-click to clear the loop or range.\n"
+"Double-click to start playback."
+msgstr ""
+"Cliquer et glisser pour positionner le pointeur d'exécution.\n"
+"Majuscules + Cliquer et Glisser pour sélectionner une plage pour boucler ou "
+"éditer.\n"
+"Majuscules + Cliquer pour supprimer la plage ou la boucle.\n"
+"Double-cliquer pour commencer à jouer."
+
+#: ../src/gui/general/EditViewBase.cpp:228
+msgid "Set Segment Start Time..."
+msgstr "Définir le temps de début du segment..."
+
+#: ../src/gui/general/EditViewBase.cpp:232
+msgid "Set Segment Duration..."
+msgstr "Définir la durée du segment..."
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:56
+msgid "Load track parameters preset"
+msgstr "Chargement des paramètres préselectionnés de la piste"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:62
+msgid "Convert notation for..."
+msgstr "Convertir la partition en..."
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:86
+msgid "Select preset track parameters for:"
+msgstr "Sélectionner des paramètres de piste préselectionnés pour:"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:87
+msgid "Create appropriate notation for:"
+msgstr "Créer un portée appropriée à:"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:89
+msgid "Category"
+msgstr "Catégorie"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:95
+msgid "Player Ability"
+msgstr "Capacités du musicien"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:97
+msgid "Amateur"
+msgstr "Amateur"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:98
+msgid "Professional"
+msgstr "Professionnel"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:104
+msgid "Only selected segments"
+msgstr "Segments sélectionnés uniquement"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:106
+msgid "All segments in this track"
+msgstr "Tous les segments sur cette piste"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:111
+msgid "Only for new segments"
+msgstr "Aux nouveaux segments uniquement"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:113
+msgid "Convert existing segments"
+msgstr "Convertir les segments existants"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:39
+#, c-format
+msgid "C%1"
+msgstr "C%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:39
+#, c-format
+msgid "C#%1"
+msgstr "C#%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:39
+#, c-format
+msgid "D%1"
+msgstr "D%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:39
+#, c-format
+msgid "D#%1"
+msgstr "D#%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:40
+#, c-format
+msgid "E%1"
+msgstr "E%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:40
+#, c-format
+msgid "F%1"
+msgstr "F%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:40
+#, c-format
+msgid "F#%1"
+msgstr "F#%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:40
+#, c-format
+msgid "G%1"
+msgstr "G%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:41
+#, c-format
+msgid "G#%1"
+msgstr "G#%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:41
+#, c-format
+msgid "A%1"
+msgstr "A%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:41
+#, c-format
+msgid "A#%1"
+msgstr "A#%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:41
+#, c-format
+msgid "B%1"
+msgstr "B%1"
+
+#: ../src/gui/general/PresetGroup.cpp:95
+#, c-format
+msgid "Can't open preset file %1"
+msgstr "Impossible d'ouvrir le fichier de préselection %1"
+
+#: ../src/gui/general/EditView.cpp:744
+msgid "&Halve Durations"
+msgstr "Diviser par 2 les durées"
+
+#: ../src/gui/general/EditView.cpp:748
+msgid "&Double Durations"
+msgstr "&Doubler les durées"
+
+#: ../src/gui/general/EditView.cpp:806
+msgid "Show Velocity Property Ruler"
+msgstr "Éditer la vélocité des notes"
+
+#: ../src/gui/general/EditView.cpp:825
+msgid "Insert item"
+msgstr "Insérer un élément"
+
+#: ../src/gui/general/EditView.cpp:831
+msgid "Erase selected items"
+msgstr "Effacer les éléments sélectionnés"
+
+#: ../src/gui/general/EditView.cpp:835
+msgid "Clear ruler"
+msgstr "Effacer la règlette"
+
+#: ../src/gui/general/EditView.cpp:839
+msgid "Insert line of controllers"
+msgstr "Insérer une ligne de contrôleurs"
+
+#: ../src/gui/general/EditView.cpp:843
+msgid "Flip forward"
+msgstr "Permuter en avant"
+
+#: ../src/gui/general/EditView.cpp:847
+msgid "Flip backwards"
+msgstr "Permuter en arrière"
+
+#: ../src/gui/general/EditView.cpp:851
+msgid "Draw property line"
+msgstr "Dessiner une ligne de propriété"
+
+#: ../src/gui/general/EditView.cpp:855
+msgid "Select all property values"
+msgstr "Sélectionner toutes les propriétés"
+
+#: ../src/gui/general/EditView.cpp:894
+msgid "%1 Controller %2 %3"
+msgstr "%1 Contrôleur %2 %3"
+
+#: ../src/gui/general/EditView.cpp:1066
+msgid "I"
+msgstr "I"
+
+#: ../src/gui/general/EditView.cpp:1066
+msgid "II"
+msgstr "II"
+
+#: ../src/gui/general/EditView.cpp:1066
+msgid "III"
+msgstr "III"
+
+#: ../src/gui/general/EditView.cpp:1066
+msgid "IV"
+msgstr "IV"
+
+#: ../src/gui/general/EditView.cpp:1067
+msgid "V"
+msgstr "V"
+
+#: ../src/gui/general/EditView.cpp:1067
+msgid "VI"
+msgstr "VI"
+
+#: ../src/gui/general/EditView.cpp:1067
+msgid "VII"
+msgstr "VII"
+
+#: ../src/gui/general/EditView.cpp:1067
+msgid "VIII"
+msgstr "VIII"
+
+#: ../src/gui/general/EditView.cpp:1069
+msgid "%1 flat"
+msgstr "%1 bémol"
+
+#: ../src/gui/general/EditView.cpp:1070
+msgid "%1 sharp"
+msgstr "%1 dièse"
+
+#: ../src/gui/general/EditView.cpp:1085
+msgid "&Insert Note"
+msgstr "&Insérer une note"
+
+#: ../src/gui/general/EditView.cpp:1091
+msgid "&Upper Octave"
+msgstr "Octave &supérieur"
+
+#: ../src/gui/general/EditView.cpp:1096
+msgid "&Lower Octave"
+msgstr "Octave &inférieur"
+
+#: ../src/gui/general/EditView.cpp:1268
+msgid "Estimated time signature shown"
+msgstr "Afficher le chiffrage de la mesure estimé"
+
+#: ../src/gui/general/EditView.cpp:1431
+msgid "Halving durations..."
+msgstr "Division par 2 des durées..."
+
+#: ../src/gui/general/EditView.cpp:1445
+msgid "Doubling durations..."
+msgstr "Doublement des durées..."
+
+#: ../src/gui/general/EditView.cpp:1469
+msgid "Rescaling..."
+msgstr "Redimensionnement..."
+
+#: ../src/gui/general/EditView.cpp:1489
+msgid "By number of semitones: "
+msgstr "Par nombre de demi-tons :"
+
+#: ../src/gui/general/EditView.cpp:1496 ../src/gui/general/EditView.cpp:1518
+msgid "Transposing..."
+msgstr "Transposition..."
+
+#: ../src/gui/general/EditView.cpp:1536
+msgid "Transposing up one semitone..."
+msgstr "Transposer d'un demi-ton vers le haut..."
+
+#: ../src/gui/general/EditView.cpp:1545
+msgid "Transposing up one octave..."
+msgstr "Transposer vers l'octave supérieure..."
+
+#: ../src/gui/general/EditView.cpp:1554
+msgid "Transposing down one semitone..."
+msgstr "Transposer d'un demi-ton vers le bas..."
+
+#: ../src/gui/general/EditView.cpp:1563
+msgid "Transposing down one octave..."
+msgstr "Transposer vers l'octave inférieure..."
+
+#: ../src/gui/general/EditView.cpp:1575
+msgid "Inverting..."
+msgstr "Inversion..."
+
+#: ../src/gui/general/EditView.cpp:1587
+msgid "Retrograding..."
+msgstr "Mise en sens rétrograde..."
+
+#: ../src/gui/general/EditView.cpp:1599
+msgid "Retrograde inverting..."
+msgstr "Inversion et mise en sens rétrograde..."
+
+#: ../src/gui/general/EditView.cpp:1608
+msgid "Jogging left..."
+msgstr "Aller à gauche..."
+
+#: ../src/gui/general/EditView.cpp:1623
+msgid "Jogging right..."
+msgstr "Aller à droite..."
+
+#: ../src/sound/AudioFileManager.cpp:660
+#, c-format
+msgid "Downloading file %1"
+msgstr "Chargement du fichier %1"
+
+#: ../src/sound/AudioFileManager.cpp:735
+msgid "Converting audio file..."
+msgstr "Conversion d'un fichier audio..."
+
+#: ../src/sound/AudioFileManager.cpp:737
+msgid "Resampling audio file..."
+msgstr "Rééchantillonnage d'un fichier audio..."
+
+#: ../src/sound/AudioFileManager.cpp:739
+msgid "Converting and resampling audio file..."
+msgstr "Conversionet rééchantillonnage d'un fichier audio..."
+
+#: ../src/sound/AudioFileManager.cpp:741
+msgid "Importing audio file..."
+msgstr "Importation d'un fichier audio..."
+
+#: ../src/sound/AudioFileManager.cpp:794
+msgid "Failed to convert or resample audio file on import"
+msgstr ""
+"Echec de la conversion ou du rééchantillonnage du fichier audio importé"
+
+#: ../src/sequencer/main.cpp:46 ../src/sequencer/main.cpp:86
+msgid "RosegardenSequencer"
+msgstr "RosegardenSequencer"
+
+#: ../src/sequencer/main.cpp:54
+msgid "JACK playback and capture ports"
+msgstr "Ports JACK d'entrée et de sortie"
+
+#: ../src/commands/segment/SegmentSyncCommand.cpp:38
+#: ../src/commands/segment/SegmentSyncCommand.cpp:44
+#: ../src/commands/segment/SegmentSyncCommand.cpp:55
+#: ../src/commands/segment/SegmentSyncCommand.cpp:63
+msgid "Sync segment parameters"
+msgstr "Synchroniser les paramètres de segment"
+
+#: ../src/commands/segment/RenameTrackCommand.h:52
+msgid "Rename Track"
+msgstr "Renommer la piste"
+
+#: ../src/commands/segment/SegmentRepeatToCopyCommand.cpp:39
+msgid "Turn Repeats into Copies"
+msgstr "Transformer les répétitions en copies"
+
+#: ../src/commands/segment/SegmentTransposeCommand.cpp:36
+#: ../src/commands/segment/SegmentTransposeCommand.cpp:42
+msgid "Change segment transposition"
+msgstr "Modifier la transposition du segment"
+
+#: ../src/commands/edit/RescaleCommand.h:50
+#: ../src/commands/segment/AudioSegmentRescaleCommand.h:62
+#: ../src/commands/segment/SegmentRescaleCommand.h:58
+msgid "Stretch or S&quash..."
+msgstr "&Allonger ou rétrécir..."
+
+#: ../src/commands/segment/SegmentLabelCommand.h:52
+msgid "Re&label..."
+msgstr "Re&nommer..."
+
+#: ../src/commands/segment/AudioSegmentResizeFromStartCommand.cpp:39
+#: ../src/commands/segment/SegmentResizeFromStartCommand.cpp:39
+msgid "Resize Segment"
+msgstr "Redimensionner le segment"
+
+#: ../src/commands/segment/RemoveTempoChangeCommand.h:58
+msgid "Remove &Tempo Change..."
+msgstr "Enlever les changements de &tempo..."
+
+#: ../src/commands/segment/SegmentEraseCommand.cpp:40
+#: ../src/commands/segment/SegmentEraseCommand.cpp:52
+msgid "Erase Segment"
+msgstr "Effacer le segment"
+
+#: ../src/commands/segment/AudioSegmentRescaleCommand.cpp:126
+#: ../src/commands/segment/SegmentRescaleCommand.cpp:102
+msgid "(rescaled)"
+msgstr "(redimensionné)"
+
+#: ../src/commands/segment/AudioSegmentRescaleCommand.cpp:127
+#: ../src/commands/segment/SegmentRescaleCommand.cpp:105
+msgid "%1 (rescaled)"
+msgstr "%1 (redimensionné)"
+
+#: ../src/commands/segment/PasteToTriggerSegmentCommand.cpp:47
+msgid "Paste as New Triggered Segment"
+msgstr "Coller en tant que nouveau segment déclenché"
+
+#: ../src/commands/segment/SegmentColourMapCommand.h:52
+msgid "Change Segment Color Map..."
+msgstr "Changer la carte de couleur du segment..."
+
+#: ../src/commands/segment/SegmentQuickCopyCommand.h:55
+msgid "Quick-Copy Segment"
+msgstr "Copie rapide de segment"
+
+#: ../src/commands/segment/AudioSegmentSplitCommand.cpp:42
+msgid "Split Audio Segment"
+msgstr "Séparer le segment audio"
+
+#: ../src/commands/segment/AudioSegmentSplitCommand.cpp:103
+#: ../src/commands/segment/SegmentSplitCommand.cpp:135
+msgid " (split)"
+msgstr ".(séparé)"
+
+#: ../src/commands/segment/AudioSegmentSplitCommand.cpp:104
+#: ../src/commands/segment/SegmentSplitByRecordingSrcCommand.cpp:120
+#: ../src/commands/segment/SegmentSplitByRecordingSrcCommand.cpp:122
+#: ../src/commands/segment/SegmentSplitCommand.cpp:136
+msgid "%1 (split)"
+msgstr "%1 (coupé)"
+
+#: ../src/commands/segment/SegmentLabelCommand.cpp:40
+msgid "Label Segments"
+msgstr "Etiquetter segments"
+
+#: ../src/commands/segment/OpenOrCloseRangeCommand.cpp:43
+msgid "Open or Close Range"
+msgstr "Ouvrir ou fermer une plage"
+
+#: ../src/commands/edit/TransposeCommand.h:55
+#: ../src/commands/segment/SegmentTransposeCommand.h:54
+msgid "Transpose by &Interval..."
+msgstr "Transposer par &intervalle..."
+
+#: ../src/commands/segment/SegmentAutoSplitCommand.cpp:148
+msgid "%1 (part)"
+msgstr "%1 (partie)"
+
+#: ../src/commands/segment/AudioSegmentInsertCommand.cpp:51
+#: ../src/commands/segment/SegmentInsertCommand.cpp:43
+#: ../src/commands/segment/SegmentInsertCommand.cpp:56
+msgid "Create Segment"
+msgstr "Créer Segment"
+
+#: ../src/commands/segment/AudioSegmentInsertCommand.cpp:114
+msgid "%1 (inserted)"
+msgstr "%1 (inséré)"
+
+#: ../src/commands/segment/AudioSegmentInsertCommand.cpp:117
+msgid "unknown audio file"
+msgstr "fichiers audio inconnu"
+
+#: ../src/commands/segment/CreateTempoMapFromSegmentCommand.cpp:40
+msgid "Set Tempos from Beat Segment"
+msgstr "Fixer le tempos sur la pulsation"
+
+#: ../src/commands/segment/SegmentSplitByRecordingSrcCommand.h:52
+msgid "Split by &Recording Source..."
+msgstr "Séparer par source d'&enregistrement..."
+
+#: ../src/commands/segment/SegmentColourMapCommand.cpp:40
+msgid "Change Segment Color Map"
+msgstr "Changer la carte de couleur du segment"
+
+#: ../src/commands/edit/CopyCommand.cpp:64
+#: ../src/commands/segment/SegmentQuickCopyCommand.cpp:57
+msgid "%1 (copied)"
+msgstr "%1 (copié)"
+
+#: ../src/commands/segment/SegmentColourCommand.h:52
+msgid "Change Segment Color..."
+msgstr "Changer la couleur du segment..."
+
+#: ../src/commands/segment/SegmentSplitByPitchCommand.cpp:170
+msgid "%1 (upper)"
+msgstr "%1 (plus haut)"
+
+#: ../src/commands/segment/SegmentSplitByPitchCommand.cpp:172
+msgid "%1 (lower)"
+msgstr "%1 (plus bas)"
+
+#: ../src/commands/segment/SegmentSingleRepeatToCopyCommand.cpp:39
+msgid "Turn Single Repeat into Copy"
+msgstr "Transformer une seule répétition en copie"
+
+#: ../src/commands/segment/AddTempoChangeCommand.h:58
+msgid "Add Te&mpo Change..."
+msgstr "Ajouter un changement de te&mpo..."
+
+#: ../src/commands/segment/AudioSegmentAutoSplitCommand.h:57
+#: ../src/commands/segment/SegmentAutoSplitCommand.h:53
+msgid "&Split on Silence"
+msgstr "&Séparer au silence"
+
+#: ../src/commands/segment/SetTriggerSegmentBaseVelocityCommand.cpp:39
+msgid "Set Base Velocity"
+msgstr "Définir la vélocité"
+
+#: ../src/commands/segment/DeleteRangeCommand.cpp:43
+#: ../src/commands/segment/EraseSegmentsStartingInRangeCommand.cpp:39
+msgid "Delete Range"
+msgstr "Effacer une plage"
+
+#: ../src/commands/segment/ChangeCompositionLengthCommand.h:53
+msgid "Change &Composition Start and End..."
+msgstr "Changer la durée de la &composition..."
+
+#: ../src/commands/segment/MoveTracksCommand.h:51
+msgid "Move Tracks..."
+msgstr "Bouger pistes..."
+
+#: ../src/commands/segment/SegmentColourCommand.cpp:39
+msgid "Change Segment Color"
+msgstr "Changer la couleur du segment"
+
+#: ../src/commands/segment/AudioSegmentDistributeCommand.h:66
+msgid "Distribute Audio Segments over MIDI"
+msgstr "Distribuer les segments audio par Midi"
+
+#: ../src/commands/segment/AudioSegmentAutoSplitCommand.cpp:147
+msgid "%1 (autosplit %2)"
+msgstr "%1 (sépar. auto %2)"
+
+#: ../src/commands/segment/SetTriggerSegmentDefaultRetuneCommand.cpp:39
+msgid "Set Default Retune"
+msgstr "Définir le réaccord par défaut"
+
+#: ../src/commands/segment/AddTimeSignatureCommand.h:52
+msgid "Add Time Si&gnature Change..."
+msgstr "Changer le chiffra&ge de la mesure..."
+
+#: ../src/commands/segment/AddTriggerSegmentCommand.cpp:42
+msgid "Add Triggered Segment"
+msgstr "Ajouter un segment déclenché"
+
+#: ../src/commands/segment/SetTriggerSegmentDefaultTimeAdjustCommand.cpp:39
+msgid "Set Default Time Adjust"
+msgstr "Ajuster le temps par défaut"
+
+#: ../src/commands/segment/RemoveTimeSignatureCommand.h:58
+msgid "Remove &Time Signature Change..."
+msgstr "Enlever le chiffrage de la &mesure..."
+
+#: ../src/commands/segment/SegmentCommandRepeat.cpp:39
+msgid "Repeat Segments"
+msgstr "Répéter les segments"
+
+#: ../src/commands/segment/AddTracksCommand.h:55
+msgid "Add Tracks..."
+msgstr "Ajouter pistes..."
+
+#: ../src/commands/segment/ModifyDefaultTempoCommand.h:51
+msgid "Modify &Default Tempo..."
+msgstr "Modifier le tempo par &défaut..."
+
+#: ../src/commands/segment/SegmentSplitByPitchCommand.h:61
+msgid "Split by &Pitch..."
+msgstr "Séparer par &tonalité..."
+
+#: ../src/commands/segment/DeleteTriggerSegmentCommand.cpp:40
+msgid "Delete Triggered Segment"
+msgstr "Supprimer un segment déclenché"
+
+#: ../src/commands/segment/SegmentSplitCommand.cpp:42
+msgid "Split Segment"
+msgstr "Séparer le segment"
+
+#: ../src/commands/segment/DeleteTracksCommand.h:51
+msgid "Delete Tracks..."
+msgstr "Effacer pistes..."
+
+#: ../src/commands/segment/InsertRangeCommand.cpp:42
+msgid "Insert Range"
+msgstr "Insérer une plage"
+
+#: ../src/commands/segment/DeleteRangeCommand.h:62
+msgid "Rejoin Command"
+msgstr "Commande joindre à nouveau"
+
+#: ../src/commands/segment/SetTriggerSegmentBasePitchCommand.cpp:39
+msgid "Set Base Pitch"
+msgstr "Définir ton de base"
+
+#: ../src/commands/segment/PasteConductorDataCommand.cpp:41
+msgid "Paste Tempos and Time Signatures"
+msgstr "Tempo et chiffrage de la mesure"
+
+#: ../src/commands/segment/SegmentSyncClefCommand.cpp:34
+msgid "Sync segment clef"
+msgstr "Synchroniser la clef du segment"
+
+#: ../src/commands/matrix/MatrixInsertionCommand.cpp:46
+#: ../src/commands/notation/NoteInsertionCommand.cpp:54
+msgid "Insert Note"
+msgstr "Insérer une note"
+
+#: ../src/commands/matrix/MatrixEraseCommand.cpp:41
+msgid "Erase Note"
+msgstr "Effacer note"
+
+#: ../src/commands/matrix/MatrixPercussionInsertionCommand.cpp:47
+msgid "Insert Percussion Note"
+msgstr "Insérer une percussion"
+
+#: ../src/commands/matrix/MatrixModifyCommand.cpp:43
+msgid "Move Note"
+msgstr "Déplacer note"
+
+#: ../src/commands/matrix/MatrixModifyCommand.cpp:43
+msgid "Modify Note"
+msgstr "Modifier note"
+
+#: ../src/commands/edit/PasteEventsCommand.cpp:98
+msgid "Paste into an existing gap [\"restricted\"]"
+msgstr "Coller dans un silence existant [\"restricted\"]"
+
+#: ../src/commands/edit/PasteEventsCommand.cpp:100
+msgid "Erase existing events to make room [\"simple\"]"
+msgstr "Effacer des événements existants pour faire de la place [\"simple\"]"
+
+#: ../src/commands/edit/PasteEventsCommand.cpp:102
+msgid "Move existing events out of the way [\"open-n-paste\"]"
+msgstr ""
+"Pousser les événements existants pour faire de la place [\"open-n-paste\"]"
+
+#: ../src/commands/edit/PasteEventsCommand.cpp:104
+msgid "Overlay notes, tying against present notes [\"note-overlay\"]"
+msgstr ""
+"Laisser les notes se chevaucher, les lier aux autres notes [\"note-overlay\"]"
+
+#: ../src/commands/edit/PasteEventsCommand.cpp:106
+msgid "Overlay notes, ignoring present notes [\"matrix-overlay\"]"
+msgstr ""
+"Laisser les notes se chevaucher, ignorer les autres notes [\"matrix-overlay"
+"\"]"
+
+#: ../src/commands/edit/AddDotCommand.h:52
+msgid "&Add Dot"
+msgstr "&Ajouter pointée"
+
+#: ../src/commands/edit/RemoveMarkerCommand.h:55
+msgid "&Remove Marker"
+msgstr "&Enlever marqueur"
+
+#: ../src/commands/edit/EventUnquantizeCommand.cpp:43
+#: ../src/commands/edit/EventUnquantizeCommand.cpp:54
+msgid "Unquantize Events"
+msgstr "Dé-quantifier les événements"
+
+#: ../src/commands/edit/ChangeVelocityCommand.h:53
+msgid "&Increase Velocity"
+msgstr "&Augmenter Vélocité"
+
+#: ../src/commands/edit/ChangeVelocityCommand.h:54
+msgid "&Reduce Velocity"
+msgstr "&Diminuer Vélocité"
+
+#: ../src/commands/edit/CopyCommand.cpp:46
+msgid "(excerpt)"
+msgstr "(extrait)"
+
+#: ../src/commands/edit/CopyCommand.cpp:60
+msgid "(copied)"
+msgstr "(copié)"
+
+#: ../src/commands/edit/EventInsertionCommand.cpp:39
+msgid "Insert Event"
+msgstr "Insérer un événement"
+
+#: ../src/commands/edit/InsertTriggerNoteCommand.cpp:55
+msgid "Insert Trigger Note"
+msgstr "Insérer une note déclencheuse"
+
+#: ../src/commands/edit/CollapseNotesCommand.h:50
+msgid "Collapse &Equal-Pitch Notes"
+msgstr "Fusionner les notes de &hauteur égale"
+
+#: ../src/commands/edit/TransposeCommand.h:61
+msgid "&Up a Semitone"
+msgstr "&Monter d'un demi-ton"
+
+#: ../src/commands/edit/TransposeCommand.h:62
+msgid "&Down a Semitone"
+msgstr "&Descendre d'un demi-ton"
+
+#: ../src/commands/edit/TransposeCommand.h:63
+msgid "Up an &Octave"
+msgstr "Monter d'une &octave"
+
+#: ../src/commands/edit/TransposeCommand.h:64
+msgid "Down an Octa&ve"
+msgstr "Descendre d'une octa&ve"
+
+#: ../src/commands/edit/TransposeCommand.h:65
+msgid "&Transpose by Semitones..."
+msgstr "Transposer par demi-tons..."
+
+#: ../src/commands/edit/SetNoteTypeCommand.h:56
+msgid "&Set Note Type"
+msgstr "&Définir le type de note"
+
+#: ../src/commands/edit/EventEditCommand.h:55
+msgid "Edit E&vent"
+msgstr "Éditer l'&événement"
+
+#: ../src/commands/edit/AddMarkerCommand.h:54
+msgid "&Add Marker"
+msgstr "&Ajouter marqueur"
+
+#: ../src/commands/edit/SelectionPropertyCommand.h:66
+msgid "Set &Property"
+msgstr "Régler la p&ropriété"
+
+#: ../src/commands/edit/CutCommand.h:55
+msgid "Cu&t"
+msgstr "Cou&per"
+
+#: ../src/commands/edit/EventQuantizeCommand.cpp:114
+msgid "Heuristic Notation &Quantize"
+msgstr "&Quantifieur de notation heuristique"
+
+#: ../src/commands/edit/EventQuantizeCommand.cpp:116
+msgid "Grid &Quantize"
+msgstr "&Quantifieur Grille"
+
+#: ../src/commands/edit/ClearTriggersCommand.h:52
+msgid "&Clear Triggers"
+msgstr "&Effacer les déclencheurs "
+
+#: ../src/commands/edit/RetrogradeCommand.h:51
+msgid "&Retrograde"
+msgstr "&Rétrograde"
+
+#: ../src/commands/edit/InvertCommand.h:51
+msgid "&Invert"
+msgstr "&Inverse"
+
+#: ../src/commands/edit/SetTriggerCommand.h:64
+msgid "Tri&gger Segment"
+msgstr "&Déclencher segment"
+
+#: ../src/commands/edit/SetLyricsCommand.h:50
+msgid "Edit L&yrics"
+msgstr "Éditer les &paroles"
+
+#: ../src/commands/edit/MoveAcrossSegmentsCommand.cpp:73
+msgid "&Move Events to Other Segment"
+msgstr "&Déplacer les événements sur un autre segment"
+
+#: ../src/commands/edit/RetrogradeInvertCommand.h:51
+msgid "Re&trograde Invert"
+msgstr "Ré&trograde inverse"
+
+#: ../src/commands/edit/ModifyMarkerCommand.h:55
+msgid "&Modify Marker"
+msgstr "&Modifier marqueur"
+
+#: ../src/commands/studio/AddControlParameterCommand.h:61
+msgid "&Add Control Parameter"
+msgstr "&Ajouter un paramètre de contrôle"
+
+#: ../src/commands/studio/ModifyInstrumentMappingCommand.h:55
+msgid "Modify &Instrument Mapping"
+msgstr "Modifier le mappage de l'&instrument"
+
+#: ../src/commands/studio/RemoveControlParameterCommand.h:60
+msgid "&Remove Control Parameter"
+msgstr "&Enlever un paramètre de contrôle"
+
+#: ../src/commands/studio/ReconnectDeviceCommand.h:55
+msgid "Reconnect Device"
+msgstr "Reconnecter le périphérique"
+
+#: ../src/commands/studio/ModifyDeviceCommand.h:68
+msgid "Modify &MIDI Bank"
+msgstr "Modifier la banque &Midi"
+
+#: ../src/commands/studio/CreateOrDeleteDeviceCommand.h:68
+msgid "Create Device"
+msgstr "Créer périphérique"
+
+#: ../src/commands/studio/ModifyDeviceMappingCommand.h:55
+msgid "Modify &Device Mapping"
+msgstr "Modifier le mappage du &périphérique"
+
+#: ../src/commands/studio/RenameDeviceCommand.h:55
+msgid "Rename Device"
+msgstr "Renommer périphérique"
+
+#: ../src/commands/studio/ModifyControlParameterCommand.h:61
+msgid "&Modify Control Parameter"
+msgstr "&Modifier un paramètre de contrôle"
+
+#: ../src/commands/notation/TieNotesCommand.h:49
+msgid "&Tie"
+msgstr "&Lier"
+
+#: ../src/commands/notation/ClefInsertionCommand.cpp:74
+msgid "Add Cle&f Change..."
+msgstr "Ajouter un changement de cle&f..."
+
+#: ../src/commands/notation/GuitarChordInsertionCommand.cpp:40
+msgid "Insert Guitar Chord"
+msgstr "Insérer un accord pour guitare"
+
+#: ../src/commands/notation/RespellCommand.cpp:47
+#, c-format
+msgid "Respell with %1"
+msgstr "Redéfinir avec %1"
+
+#: ../src/commands/notation/RespellCommand.cpp:50
+msgid "Do&uble Sharp"
+msgstr "Do&uble dièse"
+
+#: ../src/commands/notation/RespellCommand.cpp:52
+msgid "&Sharp"
+msgstr "&Dièse"
+
+#: ../src/commands/notation/RespellCommand.cpp:54
+msgid "&Flat"
+msgstr "&Bémol"
+
+#: ../src/commands/notation/RespellCommand.cpp:56
+msgid "Dou&ble Flat"
+msgstr "Double &bémol"
+
+#: ../src/commands/notation/RespellCommand.cpp:58
+msgid "&Natural"
+msgstr "Bé&carre"
+
+#: ../src/commands/notation/RespellCommand.cpp:60
+msgid "N&one"
+msgstr "&Aucun"
+
+#: ../src/commands/notation/RespellCommand.cpp:66
+msgid "Respell Accidentals &Upward"
+msgstr "Redéfinir altérations &vers le haut "
+
+#: ../src/commands/notation/RespellCommand.cpp:69
+msgid "Respell Accidentals &Downward"
+msgstr "Redéfinir altérations &vers le bas "
+
+#: ../src/commands/notation/RespellCommand.cpp:72
+msgid "&Restore Accidentals"
+msgstr "&Rétablir les altérations"
+
+#: ../src/commands/notation/RespellCommand.cpp:75
+msgid "Respell Accidentals"
+msgstr "Redéfinir les altérations"
+
+#: ../src/commands/notation/DeCounterpointCommand.h:55
+msgid "Split-and-Tie Overlapping &Chords"
+msgstr "&Diviser et lier les accords qui se chevauchent"
+
+#: ../src/commands/notation/BeamCommand.h:49
+msgid "&Beam Group"
+msgstr "Ligatu&rer le groupe"
+
+#: ../src/commands/notation/AddTextMarkCommand.h:51
+msgid "Add Te&xt Mark..."
+msgstr "Ajouter marque de te&xte..."
+
+#: ../src/commands/notation/RestoreSlursCommand.h:49
+msgid "&Restore Slur Positions"
+msgstr "&Rétablir les liaisons"
+
+#: ../src/commands/notation/SustainInsertionCommand.h:56
+msgid "Add Pedal &Press"
+msgstr "Ajouter une &pression sur la pédale"
+
+#: ../src/commands/notation/SustainInsertionCommand.h:58
+msgid "Add Pedal &Release"
+msgstr "&Relâcher la pédale"
+
+#: ../src/commands/notation/FixNotationQuantizeCommand.h:49
+msgid "Fi&x Notation Quantization"
+msgstr "Fi&xer la quantification de la notation"
+
+#: ../src/commands/notation/ChangeStemsCommand.h:51
+msgid "Stems &Up"
+msgstr "Queues en &haut"
+
+#: ../src/commands/notation/ChangeStemsCommand.h:51
+msgid "Stems &Down"
+msgstr "Queues en &bas"
+
+#: ../src/commands/notation/MakeAccidentalsCautionaryCommand.cpp:43
+msgid "Use &Cautionary Accidentals"
+msgstr "Utiliser des altérations &prudentes"
+
+#: ../src/commands/notation/MakeAccidentalsCautionaryCommand.cpp:45
+msgid "Cancel C&autionary Accidentals"
+msgstr "Annuler les altérations &prudentes"
+
+#: ../src/commands/notation/SetVisibilityCommand.h:50
+msgid "Set Visibility"
+msgstr "Ajuster la visibilité"
+
+#: ../src/commands/notation/ChangeStyleCommand.h:53
+msgid "Change &Note Style"
+msgstr "Changer le style de &note"
+
+#: ../src/commands/notation/TextInsertionCommand.cpp:41
+msgid "Insert Text"
+msgstr "Insérer un texte"
+
+#: ../src/commands/notation/InterpretCommand.h:70
+msgid "&Interpret..."
+msgstr "&Interprêter..."
+
+#: ../src/commands/notation/TupletCommand.h:53
+msgid "&Triplet"
+msgstr "&Triolet"
+
+#: ../src/commands/notation/TupletCommand.h:54
+msgid "Tu&plet..."
+msgstr "&N-olet..."
+
+#: ../src/commands/notation/UnTupletCommand.h:50
+msgid "&Untuplet"
+msgstr "&Enlever le N-olet"
+
+#: ../src/commands/notation/CollapseRestsCommand.h:54
+msgid "&Collapse Rests"
+msgstr "&Fusionner les silences"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:145
+msgid "Add S&lur"
+msgstr "Ajouter un &lié"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:147
+msgid "Add &Phrasing Slur"
+msgstr "Ajouter un &phrasé"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:149
+msgid "Add Double-Octave Up"
+msgstr "Ajouter une octave double en haut"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:151
+msgid "Add Octave &Up"
+msgstr "Ajouter une octave en ha&ut"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:153
+msgid "Add Octave &Down"
+msgstr "Ajouter une octave vers le &bas"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:155
+msgid "Add Double Octave Down"
+msgstr "Ajouter une octave double vers le bas"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:160
+msgid "Add &Crescendo"
+msgstr "Ajouter un &Crescendo"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:162
+msgid "Add &Decrescendo"
+msgstr "Ajouter un D&ecrescendo"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:164
+msgid "Add &Glissando"
+msgstr "Ajouter un &Glissando"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:167
+msgid "Add &%1%2"
+msgstr "Ajouter &%1%2"
+
+#: ../src/commands/notation/RemoveNotationQuantizeCommand.h:49
+msgid "Remo&ve Notation Quantization"
+msgstr "&Enlever la quantification de la notation"
+
+#: ../src/commands/notation/MakeChordCommand.h:50
+msgid "Make &Chord"
+msgstr "Faire un &accord"
+
+#: ../src/commands/notation/MultiKeyInsertionCommand.h:63
+msgid "Change all to &Key %1..."
+msgstr "Changer toutes les &tonalités en %1..."
+
+#: ../src/commands/notation/KeyInsertionCommand.h:67
+#: ../src/commands/notation/MultiKeyInsertionCommand.h:65
+msgid "Add &Key Change..."
+msgstr "Ajouter un changement de &tonalité..."
+
+#: ../src/commands/notation/RestoreStemsCommand.h:49
+msgid "&Restore Stems"
+msgstr "&Rétablir les queues"
+
+#: ../src/commands/notation/MakeNotesViableCommand.h:55
+#: ../src/commands/notation/MakeRegionViableCommand.h:52
+msgid "Tie Notes at &Barlines"
+msgstr "Lier les notes aux &barres de mesures"
+
+#: ../src/commands/notation/AddSlashesCommand.h:46
+msgid "Slashes"
+msgstr "Barres obliques"
+
+#: ../src/commands/notation/ChangeSlurPositionCommand.h:51
+msgid "Slur &Above"
+msgstr "Liaison &au dessus"
+
+#: ../src/commands/notation/ChangeSlurPositionCommand.h:51
+msgid "Slur &Below"
+msgstr "Liaison au &dessous"
+
+#: ../src/commands/notation/NormalizeRestsCommand.h:54
+msgid "&Normalize Rests"
+msgstr "&Normaliser les silences"
+
+#: ../src/commands/notation/TextChangeCommand.cpp:41
+msgid "Edit Text"
+msgstr "Éditer le texte"
+
+#: ../src/commands/notation/RemoveMarksCommand.h:49
+msgid "&Remove All Marks"
+msgstr "&Enlever toutes les marques"
+
+#: ../src/commands/notation/AutoBeamCommand.h:52
+msgid "&Auto-Beam"
+msgstr "Ligature &automatique"
+
+#: ../src/commands/notation/UntieNotesCommand.h:49
+msgid "&Untie"
+msgstr "&Délier"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:48
+msgid "S&forzando"
+msgstr "S&forzando"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:50
+msgid "Sta&ccato"
+msgstr "Sta&ccato"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:52
+msgid "R&inforzando"
+msgstr "R&inforzando"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:54
+msgid "T&enuto"
+msgstr "T&enuto"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:56
+msgid "Tri&ll"
+msgstr "Tri&lle"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:58
+msgid "Trill &with Line"
+msgstr "Trille a&vec ligne"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:60
+msgid "Trill Line"
+msgstr "Trille"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:62
+msgid "&Turn"
+msgstr "&Tournant"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:64
+msgid "&Accent"
+msgstr "&Accent"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:66
+msgid "&Staccatissimo"
+msgstr "&Staccatissimo"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:68
+msgid "&Marcato"
+msgstr "&Marcato"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:70
+msgid "&Pause"
+msgstr "&Pause"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:72
+msgid "&Up-Bow"
+msgstr "&Poussé"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:74
+msgid "&Down-Bow"
+msgstr "&Tiré"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:76
+msgid "Mo&rdent"
+msgstr "Mo&rdant"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:78
+msgid "Inverted Mordent"
+msgstr "Mordant inversé"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:80
+msgid "Long Mordent"
+msgstr "Long Mordant"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:82
+msgid "Lon&g Inverted Mordent"
+msgstr "Lon&g mordant inversé"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:84
+msgid "&%1%2"
+msgstr "&%1%2"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:89
+#, c-format
+msgid "Add %1"
+msgstr "Ajouter %1"
+
+#: ../src/commands/notation/ResetDisplacementsCommand.h:49
+msgid "Restore Positions"
+msgstr "Rétablir les positions"
+
+#: ../src/commands/notation/IncrementDisplacementsCommand.h:52
+msgid "Fine Reposition"
+msgstr "Re-positionnement fin"
+
+#: ../src/commands/notation/RestoreTiesCommand.h:49
+msgid "&Restore Tie Positions"
+msgstr "&Rétablir la position des liaisons"
+
+#: ../src/commands/notation/ChangeTiePositionCommand.h:47
+msgid "Tie &Above"
+msgstr "Liaison &au dessus"
+
+#: ../src/commands/notation/ChangeTiePositionCommand.h:47
+msgid "Tie &Below"
+msgstr "Liaison au &dessous"
+
+#: ../src/commands/notation/KeyInsertionCommand.h:65
+msgid "Change to &Key %1..."
+msgstr "Changer la &tonalité en %1..."
+
+#: ../src/commands/notation/RemoveFingeringMarksCommand.h:49
+msgid "&Remove Fingerings"
+msgstr "Enleve&r les doigtés"
+
+#: ../src/commands/notation/BreakCommand.h:49
+msgid "&Unbeam"
+msgstr "Ann&uler la ligature"
+
+#: ../src/commands/notation/UnGraceCommand.h:48
+msgid "Ung&race"
+msgstr "Supp&ression fioritures"
+
+#: ../src/commands/notation/AddFingeringMarkCommand.cpp:45
+msgid "Add Other &Fingering..."
+msgstr "Ajouter un autre &doigté..."
+
+#: ../src/commands/notation/AddFingeringMarkCommand.cpp:47
+msgid "Add Fingering &0 (Thumb)"
+msgstr "Ajouter doigté &0 (pouce)"
+
+#: ../src/commands/notation/AddFingeringMarkCommand.cpp:49
+#, c-format
+msgid "Add Fingering &%1"
+msgstr "Ajouter doigté &%1"
+
+#: ../src/document/io/HydrogenXMLHandler.cpp:277
+msgid " imported from Hydrogen "
+msgstr " importé d'Hydrogen"
+
+#: ../src/document/io/LilyPondExporter.cpp:404
+msgid ""
+"LilyPond does not allow spaces or backslashes in filenames.\n"
+"\n"
+"Would you like to use\n"
+"\n"
+" %1\n"
+"\n"
+" instead?"
+msgstr ""
+"Lilypond n'accepte pas d'espaces ou de backslashes dans les noms de "
+"fichiers.\n"
+"\n"
+"Voulez-vous utiliser\n"
+"\n"
+" %1\n"
+"\n"
+" à la place?"
+
+#: ../src/document/io/LilyPondExporter.cpp:2054
+msgid "warning: overlong bar truncated here"
+msgstr "avertissement: une mesure anormalement longue a été tronquée"
+
+#: ../src/document/io/LilyPondExporter.cpp:2060
+msgid "warning: bar too short, padding with rests"
+msgstr "avertissement: mesure trop courte, complétée avec des silences"
+
+#: ../src/document/MultiViewCommandHistory.cpp:318
+msgid "Nothing to undo"
+msgstr "Rien à Annuler"
+
+#: ../src/document/MultiViewCommandHistory.cpp:320
+msgid "Nothing to redo"
+msgstr "Rien à Refaire"
+
+#: ../src/document/MultiViewCommandHistory.cpp:328
+#: ../src/document/MultiViewCommandHistory.cpp:372
+#, c-format
+msgid "Und&o %1"
+msgstr "&Annuler %1"
+
+#: ../src/document/MultiViewCommandHistory.cpp:330
+#: ../src/document/MultiViewCommandHistory.cpp:374
+#, c-format
+msgid "Re&do %1"
+msgstr "&Refaire %1"
+
+#: ../src/document/RosegardenGUIDoc.cpp:328
+msgid ""
+"The current file has been modified.\n"
+"Do you want to save it?"
+msgstr ""
+"Le fichier a été modifié.\n"
+"Voulez-vous le sauver?"
+
+#: ../src/document/RosegardenGUIDoc.cpp:480
+#, c-format
+msgid ""
+"_n: Delete the 1 audio file recorded during the unsaved session?\n"
+"Delete the %n audio files recorded during the unsaved session?"
+msgstr ""
+"Effacer l'unique fichier audio enregistré pendant cette session non "
+"sauvegardée?\n"
+"Effacer les %n fichiers audio enregistrés pendant cette session non "
+"sauvegardée?"
+
+#: ../src/document/RosegardenGUIDoc.cpp:501
+msgid ""
+"The following audio files were recorded during this session but have been "
+"unloaded\n"
+"from the audio file manager, and so are no longer in use in the document you "
+"are saving.\n"
+"\n"
+"You may want to clean up these files to save disk space.\n"
+"\n"
+"Please select any you wish to delete permanently from the hard disk.\n"
+msgstr ""
+"Les fichiers audio suivants ont été enregistrés au cours de cette session "
+"mais ont ensuite été déchargés à partir du gestionnaire de fichiers audio. "
+"Ils ne sont donc plus utilisés dans le document en cours de sauvegarde.\n"
+"\n"
+"Vous pouvez souhaiter effacer ces fichiers pour libérer de l'espace disque.\n"
+"\n"
+"Veuillez sélectionner ceux que vous souhaitez effacer définitivement du "
+"disque dur.\n"
+
+#: ../src/document/RosegardenGUIDoc.cpp:517
+#, c-format
+msgid ""
+"_n: <qt>About to delete 1 audio file permanently from the hard disk."
+"<br>There will be no way to recover this file.<br>Are you sure?</qt>\n"
+"\n"
+"<qt>About to delete %n audio files permanently from the hard disk.<br>There "
+"will be no way to recover these files.<br>Are you sure?</qt>"
+msgstr ""
+"<qt>1 fichier audio va être effacé définitivement du disque dur. <br><br>Ce "
+"fichier ne pourra plus être récupéré ensuite. <br><br>Voulez vous vraiment "
+"continuer ?</qt>\n"
+"<qt>%n fichiers audio vont être effacés définitivement du disque dur. "
+"<br><br>Ces fichiers ne pourront plus être récupérés ensuite. <br><br>Voulez "
+"vous vraiment continuer ?</qt>"
+
+#: ../src/document/RosegardenGUIDoc.cpp:580
+msgid "Can't open file '%1'"
+msgstr "Impossible d'ouvrir le fichier '%1'"
+
+#: ../src/document/RosegardenGUIDoc.cpp:585
+msgid "Reading file..."
+msgstr "Lecture du fichier..."
+
+#: ../src/document/RosegardenGUIDoc.cpp:603
+msgid "Could not open Rosegarden file"
+msgstr "Impossible d'ouvrir le fichier Rosegarden"
+
+#: ../src/document/RosegardenGUIDoc.cpp:641
+msgid "Error when parsing file '%1': \"%2\""
+msgstr "Erreur lors de l'analyse du fichier '%1': \"%2\""
+
+#: ../src/document/RosegardenGUIDoc.cpp:689
+msgid "Generating audio previews..."
+msgstr "Génération des pré-versions audio..."
+
+#: ../src/document/RosegardenGUIDoc.cpp:721
+msgid "Merge"
+msgstr "Fusionner"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1605
+msgid "File load cancelled"
+msgstr "Lecture du fichier annulée"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1625
+msgid ""
+"<h3>Audio and plugins not available</h3><p>This composition uses audio files "
+"or plugins, but Rosegarden is currently running without audio because the "
+"JACK audio server was not available on startup.</p><p>Please exit "
+"Rosegarden, start the JACK audio server and re-start Rosegarden if you wish "
+"to load this complete composition.</p><p><b>WARNING:</b> If you re-save this "
+"composition, all audio and plugin data and settings in it will be lost.</p>"
+msgstr ""
+"<h3>Audio and greffons indisponibles</h3><p>Cette composition fait appel à "
+"des fichiers audio ou à des greffons (plugins), mais Rosegarden fonctionne "
+"actuellement sans audio parce que le serveur audio JACK n'était pas "
+"disponible au démarrage.</p><p>Veuillez arrêter Rosegarden, démarrer le "
+"serveur audio JACK puis redémarrer Rosegarden si vous souhaitez charger la "
+"totalité de cette composition.<b>AVERTISSEMENT:</b> Si vous sauvegardez de "
+"nouveau cette composition, toutes les données et paramètres relatifs à "
+"l'audio et aux greffons seront perdus.</p>"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1628
+msgid ""
+"<h3>Audio and plugins not available</h3><p>This composition uses audio files "
+"or plugins, but you are running a version of Rosegarden that was compiled "
+"without audio support.</p><p><b>WARNING:</b> If you re-save this composition "
+"from this version of Rosegarden, all audio and plugin data and settings in "
+"it will be lost.</p>"
+msgstr ""
+"<h3>Audio and greffons indisponibles</h3><p>Cette composition fait appel à "
+"des fichiers audio ou à des greffons (plugins), mais vous êtes en train "
+"d'utiliser une version de Rosegarden compilée sans les fonctionnalités audio."
+"</p><p><b>AVERTISSEMENT:</b> Si vous sauvegardez à nouveau cette composition "
+"depuis cette version de Rosegarden, toutes les données et paramètres "
+"relatifs à l'audio et aux greffons seront perdus.</p>"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1665
+msgid ""
+"<h3>Incorrect audio sample rate</h3><p>This composition contains audio files "
+"that were recorded or imported with the audio server running at a different "
+"sample rate (%1 Hz) from the current JACK server sample rate (%2 Hz).</"
+"p><p>Rosegarden will play this composition at the correct speed, but any "
+"audio files in it will probably sound awful.</p><p>Please consider re-"
+"starting the JACK server at the correct rate (%3 Hz) and re-loading this "
+"composition before you do any more work with it.</p>"
+msgstr ""
+"<h3>Fréquence d'échantillonnage incorrecte</h3><p>Cette composition contient "
+"des fichiers audio qui ont été enregistrés ou importés avec le serveur audio "
+"fonctionnant avec une fréquence d'échantillonnage différente (%1 Hz) de "
+"celle du serveur JACK courant (%2 Hz).</p><p>Rosegarden jouera cette "
+"composition à la vitesse correcte, mais les fichiers audio qu'elle contient "
+"auront sans doute un son de très mauvaise qualité.</p><p>Veuillez envisager "
+"de redémarrer le serveur JACK avec la fréquence correcte (%3 Hz) puis de "
+"recharger cette composition avant d'y avoir fait la moindre modification.</p>"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1675
+msgid ""
+"<h3>Inconsistent audio sample rates</h3><p>This composition contains audio "
+"files at more than one sample rate.</p><p>Rosegarden will play them at the "
+"correct speed, but any audio files that were recorded or imported at rates "
+"different from the current JACK server sample rate (%1 Hz) will probably "
+"sound awful.</p><p>Please see the audio file manager dialog for more "
+"details, and consider resampling any files that are at the wrong rate.</p>"
+msgstr ""
+"<h3>Fréquences d'échantillonnage audio incohérentes</h3><p>Cette composition "
+"contient des fichiers audio utilisant des fréquences d'échantillonnage "
+"différentes.</p><p>Rosegarden les jouera à la vitesse correcte, mais tous "
+"les fichiers audio qui ont été enregistrés ou importés avec une fréquence "
+"différente de celle du serveur JACK actuel (%1 Hz) donneront probablement "
+"des sons de très mauvaise qualité.</p><p>Pour plus d'information, veuillez "
+"examiner le dialogue du gestionnaire de fichiers audio et veuillez envisager "
+"de rééchantillonner tous les fichiers qui n'utilisent pas la bonne fréquence."
+"</p>"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1676
+msgid "Inconsistent sample rates"
+msgstr "Taux d'échantillonnages incohérents"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1690
+msgid ""
+"<h3>Plugins not found</h3><p>The following audio plugins could not be loaded:"
+"</p><ul>"
+msgstr ""
+"<h3>Greffons (plugins) non trouvés</h3><p>Les greffons audio suivants ne "
+"peuvent pas être chargés:</p><ul>"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1698
+msgid "<li>%1 (from %2)</li>"
+msgstr "<li>%1 (de %2)</li>"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1712
+msgid ""
+"This file contains one or more old element types that are now deprecated.\n"
+"Support for these elements may disappear in future versions of Rosegarden.\n"
+"We recommend you re-save this file from this version of Rosegarden to ensure "
+"that it can still be re-loaded in future versions."
+msgstr ""
+"Ce fichier contient un ou plusieurs éléments anciens dont les types sont "
+"maintenant dépréciés.\n"
+"Ces éléments risquent de ne plus être supportés dans les versions futures de "
+"Rosegarden.\n"
+"Nous vous recommandons de sauver à nouveau ce fichier en utilisant la "
+"version courante de Rosegarden pour être certain qu'il sera encore "
+"utilisable avec les versions futures."
+
+#: ../src/document/RosegardenGUIDoc.cpp:2207
+msgid "Insert Recorded MIDI"
+msgstr "Insérer un enregistrement Midi"
+
+#: ../src/document/RosegardenGUIDoc.cpp:2560
+msgid "%1 (recorded)"
+msgstr "%1 (enregistré)"
+
+#: ../src/document/RoseXmlHandler.cpp:442
+msgid ""
+"This file was written by Rosegarden %1, and it uses\n"
+"a different file format that cannot be read by this version."
+msgstr ""
+"Ce fichier a été créé avec Rosegarden %1, et utilise\n"
+"un format de fichier qui n'est pas compatible avec cette version."
+
+#: ../src/document/RoseXmlHandler.cpp:452
+msgid ""
+"This file was written by Rosegarden %1, which is more recent than this "
+"version.\n"
+"There may be some incompatibilities with the file format."
+msgstr ""
+"Ce fichier a été créé avec Rosegarden %1, qui est une version plus récente "
+"de Rosegarden.\n"
+"Il peut y avoir des incompatibilités avec ce format de fichier."
+
+#: ../src/document/RoseXmlHandler.cpp:1687
+msgid "Loading plugins..."
+msgstr "Chargement des greffons..."
+
+#: rc.cpp:6 rc.cpp:144
+#, no-c-format
+msgid "Se&gment"
+msgstr "Se&gment"
+
+#: rc.cpp:9 rc.cpp:84 rc.cpp:147 rc.cpp:303
+#, no-c-format
+msgid "Edit &With"
+msgstr "Éditer"
+
+#: rc.cpp:12 rc.cpp:21 rc.cpp:30 rc.cpp:39 rc.cpp:345
+#, no-c-format
+msgid "Actions Toolbar"
+msgstr "Barre d'outils Actions"
+
+#: rc.cpp:15 rc.cpp:33 rc.cpp:129 rc.cpp:285
+#, no-c-format
+msgid "Time Toolbar"
+msgstr "Barre d'outils temps"
+
+#: rc.cpp:18 rc.cpp:36 rc.cpp:57 rc.cpp:63 rc.cpp:120 rc.cpp:243 rc.cpp:342
+#, no-c-format
+msgid "Transport Toolbar"
+msgstr "Barre d'outils bloc de commande"
+
+#: rc.cpp:24 rc.cpp:42 rc.cpp:123 rc.cpp:348
+#, no-c-format
+msgid "Zoom Toolbar"
+msgstr "Barre d'outils zoom"
+
+#: rc.cpp:45 rc.cpp:60 rc.cpp:99 rc.cpp:228 rc.cpp:327
+#, no-c-format
+msgid "T&ransport"
+msgstr "&Bloc de commande"
+
+#: rc.cpp:51
+#, no-c-format
+msgid "Number of Stereo &Inputs"
+msgstr "Nombre d'&entrées stéréo"
+
+#: rc.cpp:54
+#, no-c-format
+msgid "&Number of Submasters"
+msgstr "&Nombre de sous-maîtres"
+
+#: rc.cpp:66
+#, no-c-format
+msgid "&Import"
+msgstr "&Importer"
+
+#: rc.cpp:69
+#, no-c-format
+msgid "&Merge"
+msgstr "&Fusionner"
+
+#: rc.cpp:72
+#, no-c-format
+msgid "&Export"
+msgstr "&Exporter"
+
+#: rc.cpp:75 rc.cpp:141 rc.cpp:297
+#, no-c-format
+msgid "&Composition"
+msgstr "&Composition"
+
+#: rc.cpp:78
+#, no-c-format
+msgid "&Studio"
+msgstr "&Studio"
+
+#: rc.cpp:81
+#, no-c-format
+msgid "Se&gments"
+msgstr "Se&gments"
+
+#: rc.cpp:90
+#, no-c-format
+msgid "Trac&ks"
+msgstr "&Pistes"
+
+#: rc.cpp:93
+#, no-c-format
+msgid "Set &Instrument"
+msgstr "Définir l'&instrument"
+
+#: rc.cpp:102 rc.cpp:234 rc.cpp:333
+#, no-c-format
+msgid "&Toolbars"
+msgstr "Barre d'outils méta"
+
+#: rc.cpp:105 rc.cpp:237 rc.cpp:336
+#, no-c-format
+msgid "&Rulers"
+msgstr "&Règlettes"
+
+#: rc.cpp:111 rc.cpp:240 rc.cpp:339
+#, no-c-format
+msgid "Tools Toolbar"
+msgstr "Barre d'outils outils"
+
+#: rc.cpp:114
+#, no-c-format
+msgid "Tracks Toolbar"
+msgstr "Barre d'outils pistes"
+
+#: rc.cpp:117
+#, no-c-format
+msgid "Editors Toolbar"
+msgstr "Barre d'outils éditeurs"
+
+#: rc.cpp:135
+#, no-c-format
+msgid "&Layout Mode"
+msgstr "Mode de mise en &page"
+
+#: rc.cpp:138 rc.cpp:294
+#, no-c-format
+msgid "Add Event Ruler"
+msgstr "Filtre d'événement"
+
+#: rc.cpp:150
+#, no-c-format
+msgid "N&ote"
+msgstr "N&otes"
+
+#: rc.cpp:153
+#, no-c-format
+msgid "Mar&ks"
+msgstr "M&arques"
+
+#: rc.cpp:156
+#, no-c-format
+msgid "&Ornaments"
+msgstr "&Ornements"
+
+#: rc.cpp:159
+#, no-c-format
+msgid "&Fingerings"
+msgstr "&Doigtés"
+
+#: rc.cpp:162
+#, no-c-format
+msgid "S&lashes"
+msgstr "B&arres"
+
+#: rc.cpp:165 rc.cpp:219
+#, no-c-format
+msgid "&Accidentals"
+msgstr "&Altérations"
+
+#: rc.cpp:168
+#, no-c-format
+msgid "&Phrase"
+msgstr "&Phrase"
+
+#: rc.cpp:171
+#, no-c-format
+msgid "Slur &Position"
+msgstr "&Position de la liaison"
+
+#: rc.cpp:174
+#, no-c-format
+msgid "Tie &Position"
+msgstr "&Position de la liaison"
+
+#: rc.cpp:177
+#, no-c-format
+msgid "&Octaves"
+msgstr "&Octaves"
+
+#: rc.cpp:180 rc.cpp:306
+#, no-c-format
+msgid "Ad&just"
+msgstr "A&juster"
+
+#: rc.cpp:183
+#, no-c-format
+msgid "R&ests"
+msgstr "&Silences"
+
+#: rc.cpp:186 rc.cpp:213
+#, no-c-format
+msgid "&Notes"
+msgstr "&Notes"
+
+#: rc.cpp:189 rc.cpp:309
+#, no-c-format
+msgid "&Quantize"
+msgstr "&Quantifier"
+
+#: rc.cpp:195 rc.cpp:315
+#, no-c-format
+msgid "Trans&pose"
+msgstr "Trans&poser"
+
+#: rc.cpp:198 rc.cpp:318
+#, no-c-format
+msgid "Convert"
+msgstr "Convertir"
+
+#: rc.cpp:201
+#, no-c-format
+msgid "&Fine Positioning"
+msgstr "Positionnement &précis"
+
+#: rc.cpp:204
+#, no-c-format
+msgid "Fine Ti&ming"
+msgstr "Timing &précis"
+
+#: rc.cpp:207
+#, no-c-format
+msgid "&Visibility"
+msgstr "&Visibilité"
+
+#: rc.cpp:216
+#, no-c-format
+msgid "&Rests"
+msgstr "&Silences"
+
+#: rc.cpp:222
+#, no-c-format
+msgid "&Clefs"
+msgstr "&Clefs"
+
+#: rc.cpp:225 rc.cpp:324
+#, no-c-format
+msgid "Local &Cursor"
+msgstr "&Curseur local"
+
+#: rc.cpp:246
+#, no-c-format
+msgid "Notes Toolbar"
+msgstr "Barre d'outils notes"
+
+#: rc.cpp:249
+#, no-c-format
+msgid "Rests Toolbar"
+msgstr "Barre d'outils silences"
+
+#: rc.cpp:252
+#, no-c-format
+msgid "Clefs Toolbar"
+msgstr "Barre d'outils clefs"
+
+#: rc.cpp:255
+#, no-c-format
+msgid "Accidentals Toolbar"
+msgstr "Barre d'outils altérations"
+
+#: rc.cpp:258
+#, no-c-format
+msgid "Group Toolbar"
+msgstr "Barre d'outils groupes"
+
+#: rc.cpp:261
+#, no-c-format
+msgid "Marks Toolbar"
+msgstr "Barre d'outils marques"
+
+#: rc.cpp:264
+#, no-c-format
+msgid "Meta Toolbar"
+msgstr "Barre d'outils méta"
+
+#: rc.cpp:267
+#, no-c-format
+msgid "Layout Toolbar"
+msgstr "Barre d'outils mise en page"
+
+#: rc.cpp:270 rc.cpp:351
+#, no-c-format
+msgid "Control Ruler actions"
+msgstr "Règlette de contrôle des actions"
+
+#: rc.cpp:273 rc.cpp:354
+#, no-c-format
+msgid "Property Ruler actions"
+msgstr "Opérations sur les fichiers Audio"
+
+#: rc.cpp:276
+#, no-c-format
+msgid "&Action"
+msgstr "&Action"
+
+#: rc.cpp:279
+#, no-c-format
+msgid "General Toolbar"
+msgstr "Barre d'outils méta"
+
+#: rc.cpp:291
+#, no-c-format
+msgid "&Grid"
+msgstr "&Grille"
+
+#: rc.cpp:300
+#, no-c-format
+msgid "&Segment"
+msgstr "&Segment"
+
+#: rc.cpp:361
+#, no-c-format
+msgid "Hide additional controls"
+msgstr "Cacher Autres Contrôles"
+
+#: rc.cpp:365
+#, no-c-format
+msgid "Panic Button"
+msgstr "Panique"
+
+#: rc.cpp:368
+#, no-c-format
+msgid "Resets all MIDI devices if you've got stuck notes"
+msgstr ""
+"Mise à zèro de tous les périphériques. MIDI si vous avez des notes bloquées"
+
+#: rc.cpp:375
+#, no-c-format
+msgid "Provides a metronome click for you to play along with"
+msgstr "Vous fournit un clic de métronome"
+
+#: rc.cpp:378
+#, no-c-format
+msgid "Shows MIDI activity in and out of Rosegarden"
+msgstr "Affiche l'activité MIDI, au sein de Rosegarden, ou en dehors"
+
+#: rc.cpp:381
+#, no-c-format
+msgid "IN"
+msgstr "IN"
+
+#: rc.cpp:384
+#, no-c-format
+msgid "OUT"
+msgstr "OUT"
+
+#: rc.cpp:387 rc.cpp:390
+#, no-c-format
+msgid "NO EVENTS"
+msgstr "PAS D'ÉVÉNEMENT"
+
+#: rc.cpp:397
+#, no-c-format
+msgid "Record either MIDI or audio"
+msgstr "Enregistrer audio ou MIDI"
+
+#: rc.cpp:401
+#, no-c-format
+msgid "Loop"
+msgstr "Boucle"
+
+#: rc.cpp:404
+#, no-c-format
+msgid "Turn on and off the loop markers (if set)"
+msgstr "Activer ou non les marqueurs de boucle (si existants)"
+
+#: rc.cpp:411
+#, no-c-format
+msgid "Mutes all but the currently selected track"
+msgstr "Assourdir les autres pistes"
+
+#: rc.cpp:415
+#, no-c-format
+msgid "Start loop or range here"
+msgstr "Commencer ici la plage ou la boucle"
+
+#: rc.cpp:419
+#, no-c-format
+msgid "End loop or range here"
+msgstr "Terminer ici la plage ou la boucle"
+
+#: rc.cpp:422
+#, no-c-format
+msgid "SIG"
+msgstr "SIG"
+
+#: rc.cpp:425
+#, no-c-format
+msgid "DIV"
+msgstr "DIV"
+
+#: rc.cpp:428
+#, no-c-format
+msgid "/16"
+msgstr "/16"
+
+#: rc.cpp:431
+#, no-c-format
+msgid "TEMPO"
+msgstr "TEMPO"
+
+#: rc.cpp:434
+#, no-c-format
+msgid "END"
+msgstr "FIN"
+
+#: rc.cpp:437
+#, no-c-format
+msgid "BAR"
+msgstr "MESURE"
+
+#: rc.cpp:441
+#, no-c-format
+msgid "Switch between real time, musical time, and frame count"
+msgstr "Choisir entre temps réel, temps musical et compteur de trame"
+
+#: rc.cpp:445
+#, no-c-format
+msgid "Show additional controls"
+msgstr "Afficher autres contrôles"
+
+#: rc.cpp:449
+#, no-c-format
+msgid "Rewind"
+msgstr "Retour"
+
+#: rc.cpp:452
+#, no-c-format
+msgid "Moves the current pointer position back one bar."
+msgstr "Déplace le pointeur d'une mesure vers l'arrière."
+
+#: rc.cpp:456
+#, no-c-format
+msgid "Rewind to beginning"
+msgstr "Revenir au Début"
+
+#: rc.cpp:459
+#, no-c-format
+msgid ""
+"Moves the pointer position to the start of the composition. (This may mean "
+"going forwards if the pointer is currently before the start.)"
+msgstr ""
+"Déplace le pointeur au début de la composition (cela peut le déplacer vers "
+"l'avant si le pointeur est actuellement placé avant le début de la "
+"composition)"
+
+#: rc.cpp:463
+#, no-c-format
+msgid "Play/Pause"
+msgstr "Jouer/Pause"
+
+#: rc.cpp:466
+#, no-c-format
+msgid ""
+"Plays from the current pointer position, or pauses playback if already in "
+"progress."
+msgstr ""
+"Joue à partir de la position actuelle du pointeur, ou met en pause si le "
+"séquenceur est déjà en train de jouer."
+
+#: rc.cpp:473
+#, no-c-format
+msgid "Stops playback or recording."
+msgstr "Arrêter l'exécution ou l'enregistrement."
+
+#: rc.cpp:477
+#, no-c-format
+msgid "Fast forward"
+msgstr "Avance rapide"
+
+#: rc.cpp:480
+#, no-c-format
+msgid "Moves the current pointer position forwards one bar."
+msgstr "Avance le pointeur d'une mesure."
+
+#: rc.cpp:484
+#, no-c-format
+msgid "Fast forward to end"
+msgstr "Aller à la fin"
+
+#: rc.cpp:487
+#, no-c-format
+msgid ""
+"Moves the pointer position to the end of the composition. (This may mean "
+"going backwards if the pointer is already beyond the end.)"
+msgstr ""
+"Déplace le pointeur à la fin de la composition (cela peut le déplacer vers "
+"l'arrière si le pointeur est déjà au delà de la fin de la composition)"
+
+#: rc.cpp:491
+#, no-c-format
+msgid "Display time to end"
+msgstr "Montrer le temps restant"
+
+#: ../docs/en/tips.cpp:3
+msgid ""
+"<p>To configure a track to play using a particular instrument:</p>\n"
+"&nbsp;&nbsp;* click on the track label and hold a moment<br>\n"
+"&nbsp;&nbsp;* select an output device<br>\n"
+"&nbsp;&nbsp;* select one of that device's available instruments (#1 - #16)"
+"<br>\n"
+"&nbsp;&nbsp;* adjust that instrument's output channel, program, bank, and\n"
+"controllers via the instrument parameters box\n"
+msgstr ""
+"<p>Pour configurer une piste à jouer avec l'instrument de votre choix:</p>\n"
+"&nbsp;&nbsp;* cliquer sur l'étiquette de piste et attendez un cours "
+"instant<br>\n"
+"&nbsp;&nbsp;* sélectionnez un péripérique de sortie<br>\n"
+"&nbsp;&nbsp;* sélectionnez un instrument disponible (#1 - #16)<br>\n"
+"&nbsp;&nbsp;* ajuster le canal de sortie, le programme, la banque, et\n"
+"le contrôleur via la boîte de dialogue des paramètres d'instrument\n"
+
+#: ../docs/en/tips.cpp:13
+msgid ""
+"<p>...that Rosegarden has an autosave feature?<br><br>\n"
+"You can select your autosave interval from <b>Settings->Configure\n"
+"Rosegarden</b>.<br><br>\n"
+"When something goes awry, such as a power outage or a Rosegarden crash\n"
+"(unfortunately, it happens...) simply load the file you were working on, and "
+"you'll be given the\n"
+"option to load the autosaved version, or the unmodified original.</p>\n"
+msgstr ""
+"<p>...que Rosegarden permet de faire des sauvegardes automatiques?<br><br>\n"
+"Vous pouvez sélectionner l'intervalle depuis <b>Configuration->Configurer\n"
+"Rosegarden</b>.<br><br>\n"
+"Quand quelque chose de grave arrive, comme une coupure d'électricité ou un "
+"crash\n"
+"de Rosegarden(malheureusement, ça arrive...), chargez simplement le fichier "
+"sur lequel\n"
+" vous étiez en train de travailler. On vous proposera alors une option "
+"permettant de\n"
+"charger la version sauvegardée automatiquement, ou la version originale.</"
+"p>\n"
+
+#: ../docs/en/tips.cpp:23
+msgid ""
+"<p>\n"
+"...that you can save the current document as your default studio by using\n"
+"<b>Composition -> Studio -> Save Current Document as Default Studio</b>?</"
+"p>\n"
+msgstr ""
+"<p>\n"
+"...que vous pouvez enregistrer le document courant en tant que studio par "
+"défaut en utilisant\n"
+"<b>Composition -> Studio -> Enregistrer le document courant comme studio par "
+"défaut</b>?</p>\n"
+
+#: ../docs/en/tips.cpp:30
+msgid ""
+"<p>...that your default studio is a complete Rosegarden composition that "
+"gets\n"
+"loaded every time you create a new document or import a MIDI file?</p>\n"
+msgstr ""
+"<p>...que votre studio par défaut est une composition Rosegarden à part "
+"entière\n"
+"qui se charge à chaque fois que vous créez un nouveau document ou lorsque\n"
+"que vous importez un fichier MIDI?</p>\n"
+
+#: ../docs/en/tips.cpp:36
+msgid ""
+"<p>...that your default studio can contain instrument assignments, document "
+"properties, LilyPond headers,\n"
+"and many other things?<br><br>The default studio is a complete Rosegarden "
+"composition, so it can contain anything that you may wish to have available "
+"in each\n"
+"new document you create.</p>\n"
+msgstr ""
+"<p>...que votre studio par défaut est une composition Rosegarden à part\n"
+"entière?<br><br>Il peut contenir les attributions des instruments, les "
+"propriétés\n"
+"du document, les entêtes Lilypond, et beaucoup d'autres choses dont vous "
+"pouvez\n"
+"souhaiter disposer \"par défaut\" dans chaque nouveau document que vous "
+"créez.</p>\n"
+
+#: ../docs/en/tips.cpp:43
+msgid ""
+"<p>...that Rosegarden will detect and create a default connection for ALSA "
+"soft\n"
+"synth applications that are started after Rosegarden is already running?</"
+"p>\n"
+msgstr ""
+"<p>...que Rosegarden détecte et crée une connexion par défaut pour\n"
+"les synthétiseurs logiciels ALSA qui sont démarrés après lui?</p>\n"
+
+#: ../docs/en/tips.cpp:49
+msgid ""
+"<p>...that you can make your default studio override that in every "
+"Rosegarden composition you load?<br><br>If your studio setup does not change "
+"very often, and you would prefer for\n"
+"the settings in your default studio to take precedence over whatever\n"
+"studio is saved with any files you happen to load, you can make your studio "
+"the default for everything using <b>Settings -> Configure Rosegarden ->\n"
+"MIDI -> Always use default studio when loading files</b>.</p>\n"
+msgstr ""
+"<p>...que vous pouvez utiliser votre studio par défaut plutôt que les "
+"configurations définies dans chaque fichier Rosegarden que vous chargez?"
+"<br><br>Si la configuration de votre studio ne change que rarement et si "
+"vous préférez\n"
+"que la configuration qu'il contient soit utilisée de préférence\n"
+"au studio sauvegardé avec les fichiers que vous chargez, vous pouvez\n"
+"forcer son utilisation \"par défaut\" en utilisant\n"
+" <b>Configuration -> Configurer Rosegarden -> MIDI ->\n"
+"Toujours utiliser le studio par défaut lors de l'ouverture d'un fichier</b>."
+"</p>\n"
+
+#: ../docs/en/tips.cpp:57
+msgid ""
+"<p>If you have accidentally recorded a segment so short that it does not\n"
+"appear on the canvas, which you can only hear during subsequent recording\n"
+"sessions, you can gain access to it by using <b>Composition -> Change\n"
+"Composition Start and End</b> and then setting the composition to start at a "
+"negative number.</p>\n"
+msgstr ""
+"<p>...que si vous avez accidentellement enregistré un segment si court\n"
+"qu'il n'apparaît pas sur le canevas mais que vous pouvez l'entendre pendant "
+"les \n"
+"séances d'enregistrement suivantes, vous pouvez y accéder en utilisant\n"
+"<b>Composition -> Changer la durée de la Composition</b> et en ajustant le\n"
+"début de la composition à une valeur négative?</p>\n"
+
+#: ../docs/en/tips.cpp:65
+msgid ""
+"<p>...that if you place a note at the wrong pitch using the notation or "
+"matrix editor, you can move it one semitone at a time with the up and down "
+"arrow keys on your keyboard?</p>\n"
+msgstr ""
+"<p>...que si vous placez une note à la mauvaise place avec l'éditeur de "
+"partitions ou l'éditeur matriciel, vous pouvez la déplacer par demi-ton, "
+"avec les flèches haut et bas de votre clavier?</p>\n"
+
+#: ../docs/en/tips.cpp:70
+msgid ""
+"<p>...that you can toggle stem directions in the notation editor by "
+"selecting\n"
+"one or more notes and using Ctrl-PageUp and Ctrl-PageDown?</p>\n"
+msgstr ""
+"<p>...que vous pouvez changer l'orientation des queues dans l'éditeur de "
+"partitions\n"
+"en sélectionnant une ou plusieurs notes, et en utilisant Ctrl-PageUp et Ctrl-"
+"PageDown?</p>\n"
+
+#: ../docs/en/tips.cpp:76
+msgid ""
+"<p>...that you can change the accidental used for a note in the notation "
+"editor (without changing the pitch of the note) by selecting\n"
+"it and using the up and down arrow keys with both Ctrl and Shift pressed?</"
+"p>\n"
+msgstr ""
+"<p>...que vous pouvez changer l'octave d'une note dans l'éditeur de "
+"partitions \n"
+"en la sélectionnant et en utilisant les flèches haut et bas de votre "
+"clavier, avec \n"
+"les touches Ctrl et Shift enfoncées?</p>\n"
+
+#: ../docs/en/tips.cpp:82 ../docs/en/tips.cpp:93
+msgid ""
+"<p>...that you can hold down the Shift key while repositioning segments on "
+"the\n"
+"segment canvas in order to avoid the \"snap-to\" effect and exert finer "
+"control?</p>\n"
+msgstr ""
+"<p>...que vous pouvez maintenir la touche Shift enfoncée, pendant que vous "
+"positionnez\n"
+"des segments, afin de désactivez l'effet de la grille, et d'exercer un "
+"contrôle plus fin?</p>\n"
+
+#: ../docs/en/tips.cpp:88
+msgid ""
+"<p>...that you can use the arrow tool to draw, move, and resize segments and "
+"events as well as to select them?<br><br>Drag a segment or event block to "
+"move it, drag the right edge of a block to resize it, and drag with the "
+"middle mouse button pressed to draw a new segment or event.<br><br>(Of "
+"course, the dedicated draw, move and resize tools are still quicker for "
+"repeated operations.)</p>\n"
+msgstr ""
+"<p>...que vous pouvez utiliser l'outil flèche pour dessiner, déplacer et "
+"redimensionner des segments et des événements aussi bien que pour les "
+"sélectionner?<br><br>Faites glisser un bloc de segments ou d'événements pour "
+"le déplacer, faites glisser le bord droit d'un bloc pour le redimensionner "
+"et utilisez le bouton du milieu de la souris pour dessiner un nouveau "
+"segment ou événement.<br><br>(Bien sûr, les outil dédiés de dessin, "
+"déplacement et redimensionnement sont encore plus rapide dans le cas "
+"d'opérations répétitives.)</p>\n"
+
+#: ../docs/en/tips.cpp:99
+msgid ""
+"<p>...that you can hold down the Shift key while repositioning or resizing "
+"events in the\n"
+"matrix view in order to avoid the \"snap-to\" effect and exert finer control?"
+"</p>\n"
+msgstr ""
+"<p>...que vous pouvez maintenir la touche Shift enfoncée, pendant que vous "
+"repositionnez ou redimensionnez des événements\n"
+"dans la vue matricielle afin de désactivez l'effet de la grille, et "
+"d'exercer un contrôle plus fin?</p>\n"
+
+#: ../docs/en/tips.cpp:105
+msgid ""
+"<p>...that you can edit multiple segments on multiple tracks simultaneously "
+"in\n"
+"the notation editor? Simply select the segments, then use <b>Edit -> Open "
+"in Notation Editor</b>.</p>\n"
+msgstr ""
+"<p>...que vous pouvez éditer plusieurs segments sur plusieurs pistes "
+"simultanément\n"
+"dans l'éditeur de partitions? Sélectionnez simplement les segments, et "
+"utilisez <b>Édition-> Ouvrir dans l'éditeur de partitions</b>.</p>\n"
+
+#: ../docs/en/tips.cpp:111
+msgid ""
+"<p>...that Rosegarden can export files for use by LilyPond, the high-quality "
+"score typesetting system?<br><br>\n"
+"From the <b>File</b> menu, navigate to <b>Export -> Export LilyPond File</"
+"b></p>\n"
+msgstr ""
+"<p>...que Rosegarden peut exporter des fichiers, afin que ceux-ci puissent "
+"être utilisés avec Lilypond, un logiciel de typographie musicale de haute "
+"qualité?<br><br>\n"
+"Depuis le menu <b>Fichier</b>, allez sur <b>Exporter->Exporter un fichier "
+"Lilypond</b></p>\n"
+
+#: ../docs/en/tips.cpp:117
+msgid ""
+"<p>...that Rosegarden can print via LilyPond, the high-quality score "
+"typesetting system?<br><br>\n"
+"From the <b>File</b> menu, navigate to <b>Preview with LilyPond</b>. The "
+"file\n"
+"will be exported, rendered, and a preview will appear in KPDF, or one of\n"
+"several other PDF viewers, where it can then be printed as well.</p>\n"
+msgstr ""
+"<p>...que Rosegarden peut imprimer directement en utilisant Lilypond, un "
+"logiciel de typographie musicale de haute qualité?<br><br>\n"
+"Depuis le menu <b>Fichier</b>, allez sur <b>Aperçu avec LilyPond</b>.\n"
+"Le fichier sera exporté, traité et visualisé en utilisant KPDF ou un autre "
+"afficheur de fichiers PDF, d'où il sera ensuite possible de l'imprimer.</p>\n"
+
+#: ../docs/en/tips.cpp:125
+msgid ""
+"<p>...that if you use the quantizer from within the notation view, you can "
+"tell it to quantize only the timing used for notation -- making it possible "
+"to have good looking notation <b>and</b> a human MIDI performance?</p>\n"
+msgstr ""
+"<p>...que si vous utilisez le quantifieur depuis le menu transformations de "
+"l'éditeur de partitions,\n"
+"celui-ci peut quantifier seulement le timing utilisé pour la partition -- "
+"permettant d'avoir une très jolie notation <b>et</b> une performance MIDI "
+"plus humaine?</p>\n"
+
+#: ../docs/en/tips.cpp:130
+msgid ""
+"<p>...that you can change segment labels using the controls on the Segment "
+"Parameters box\n"
+"in the main window?</p>\n"
+msgstr ""
+"<p>...que vous pouvez changer les étiquettes de segment depuis la fenêtre "
+"principale,\n"
+"en cliquant avec le bouton droit sur un segment?</p>\n"
+
+#: ../docs/en/tips.cpp:136
+msgid ""
+"<p>...that the number of tracks in new documents is based on the contents "
+"of\n"
+"your autoload.rg file?\n"
+"<br><br>\n"
+"Whether you prefer to start with three tracks or 43, create a document that\n"
+"contains the desired number of tracks, plus any other studio or document "
+"properties settings\n"
+"you wish to configure, and use <b>Composition -> Studio -> Save Current "
+"Document as Default\n"
+"Studio</b> to make this your new default.</p>\n"
+msgstr ""
+"<p>...que le nombre de pistes dans les nouveaux documents est basé sur\n"
+"le contenu de votre fichier autoload.rg ?\n"
+"<br><br>\n"
+"Selon que vous désirez commencer avec une ou plusieurs pistes,\n"
+"créez un document qui contient le nombre désiré de pistes. Plus n'importe "
+"quelles autres propriétés, du document ou du studio,\n"
+"que vous désirez configurer et utilisez <b>Composition -> Studio -> "
+"Enregistrer le document courant comme studio par\n"
+"défaut</b> pour faire de celui-ci votre nouveau modèle.</p>\n"
+
+#: ../docs/en/tips.cpp:147
+msgid ""
+"<p>...that you can change the name of a track by double clicking on the "
+"label? (The\n"
+"label must be visible for this to work.)</p>\n"
+msgstr ""
+"<p>...que vous pouvez changer le nom d'une piste en double-cliquant sur "
+"l'étiquette? (l'\n"
+"étiquette doit être visible pour que cela marche.)</p>\n"
+
+#: ../docs/en/tips.cpp:153
+msgid ""
+"<p>...that you can configure what happens when you double-click on a segment?"
+"<br><br>Go to <b>Settings -> Configure Rosegarden</b> and choose your "
+"preferred editing window under the <b>Behaviour</b> tab.</p>\n"
+msgstr ""
+"<p>...que vous pouvez configurer ce qui se passe quand vous effectuez un "
+"double-clic sur un segment?<br><br>Allez dans <b>Configuration -> Configurer "
+"Rosegarden </b> et choisissez votre éditeur par défaut sous l'onglet<b> "
+"Comportement</b>.</p>\n"
+
+#: ../docs/en/tips.cpp:158
+msgid ""
+"<p>...that Rosegarden is being developed as a community effort with\n"
+"contributions from around the world?<br><br>\n"
+"The four most active developers live in London (England), Cannes, "
+"Barcelona,\n"
+"and... Christiansburg? (Christiansburg is a town of about 50,000 in\n"
+"southwestern Virginia, USA.)<br><br>\n"
+"We have had contributors from elsewhere in the US, UK, Spain, Mexico, "
+"Argentina, Germany,\n"
+"Sweden, Russia, Japan, Finland, and Italy, just to name a few...</p>\n"
+msgstr ""
+"<p>...que Rosegarden est développé par un travail communautaire auquel\n"
+"contribuent des gens du monde entier?<br><br>\n"
+"Les principaux développeurs habitent à Londres, Cannes, Barcelone,\n"
+"et... Christiansburg? (Christiansburg est une ville d'environ 50 000 "
+"habitants\n"
+"dans le sud ouest de la Virginie, USA.)<br><br>\n"
+"Nous avons eu des contributeurs d'ailleurs aux USA, UK, Espagne, Mexique, "
+"Argentine, Allemagne,\n"
+"Suède, Russie, Japon, Finlande et Italie, juste pour en nommer quelques "
+"uns...</p>\n"
+
+#: ../docs/en/tips.cpp:169
+msgid ""
+"<p>...that Rosegarden is available in Spanish, French, German, Russian, "
+"Welsh, Swedish, Italian and Estonian\n"
+"translations? (Just to name a few.)<br><br>\n"
+"If you're interested in translating Rosegarden to another language, drop us "
+"a\n"
+"line at <b>[email protected]</b>.</p>\n"
+msgstr ""
+"<p>...que Rosegarden est disponible en espagnol, français, allemand, russe, "
+"gallois, suédois, italien, ainsi qu'en estonien ?\n"
+"<br><br>\n"
+"Si vous êtes intéressé par la traduction de Rosegarden dans une autre "
+"langue, laissez-nous un message à \n"
+"<b>[email protected]</b>.</p>\n"
+
+#: ../docs/en/tips.cpp:177
+msgid ""
+"<p>...that you can change the total number of bars in the composition via\n"
+"<b>Composition -> Change Composition Start and End</b>?</p>\n"
+msgstr ""
+"<p>...que vous pouvez changer le nombre total de mesures de votre "
+"composition via \n"
+"<b>Édition-> Changer la durée de la composition</b>?</p>\n"
+
+#: ../docs/en/tips.cpp:183
+msgid ""
+"<p>...that you can see the difference between performance and display "
+"duration\n"
+"of duration-quantized notes in the notation editor?<br><br>\n"
+"Use <b>Settings -> Show Raw Note Ruler</b> to turn on this handy\n"
+"feature.<br><br>\n"
+"<i>Note that this feature does not work in page layout view.</i></p>\n"
+msgstr ""
+"<p>...que vous pouvez voir la différence entre la performance et la durée "
+"d'affichage\n"
+"des notes quantifiées dans l'éditeur de partitions?<br><br>\n"
+"Utilisez <b>Configuration -> Afficher la règle des notes brutes</b> pour "
+"activer\n"
+"cette option<br><br>\n"
+"<i>Notez que cette option n'est pas visible lors de la mise en page.</i></"
+"p>\n"
+
+#: ../docs/en/tips.cpp:192
+msgid ""
+"<p>...that you can add tempo and time-signature changes by double-clicking "
+"on the values displayed in the transport window or tempo rulers?</p>\n"
+msgstr ""
+"<p>...que vous pouvez modifier le tempo et le chiffrage de la mesure en "
+"double-cliquant sur les valeurs affichées dans la fenêtre de transport?</p>\n"
+
+#: ../docs/en/tips.cpp:197
+msgid ""
+"<p>...that the transport window can display musical time, sample frame "
+"count, and a visual metronome as well as real time?<br><br>Just click on the "
+"small button at the extreme top left of the window.</p>\n"
+msgstr ""
+"<p>...que la fenêtre de transport peut afficher le temps musical ou le "
+"nombre de trames d'échantillonnage audio aussi bien que le temps réel et un "
+"métronome visuel?<br><br>Il suffit de cliquer sur le petit bouton situé en "
+"haut à gauche de la fenêtre.</p>\n"
+
+#: ../docs/en/tips.cpp:202
+msgid ""
+"<p>...that you can select all notes of a particular pitch in the matrix "
+"view, by shift-clicking on that pitch on the piano keyboard at the left?"
+"<br><br>If you shift-click-drag, you can select whole ranges too.</p>\n"
+msgstr ""
+"<p>...que vous pouvez sélectionner toutes les notes d'une certaine hauteur "
+"dans la vue matricielle, en maintenant la touche \"Majuscules\" enfoncée et "
+"en cliquant sur le clavier de piano affiché sur la gauche? <br><br>Si vous "
+"maintenez le bouton pressé et déplacez la souris, vous pouvez sélectionner "
+"plusieurs rangées entières.</p>\n"
+
+#: ../docs/en/tips.cpp:207
+msgid ""
+"<p>...that you can set a loop in the main window by clicking-and-dragging on "
+"the time ruler with Shift pressed?<br><br>(If the ruler isn't visible, use "
+"<b>Settings -> Show Rulers</b>.)</p>\n"
+msgstr ""
+"<p>...que vous pouvez définir une boucle dans la fenêtre principale, en "
+"cliquant et en vous déplaçant sur la réglette de temps avec la touche "
+"\"Majuscules\" enfoncée?<br><br>(Si la réglette n'est pas visible, utilisez "
+"<b>Configuration -> Afficher les règlettes</b>.)</p>\n"
+
+#: ../docs/en/tips.cpp:212
+msgid ""
+"<p>...that if you're editing a section in the matrix or notation view, you "
+"can\n"
+"set that section to loop while you edit it?<br><br>Select it and use "
+"<b>Tools ->\n"
+"Local Cursor -> Set Loop to Selection</b>, then hit Play.</p><br><br>\n"
+"<i>This feature does not work quite as well for compositions that include "
+"sampled\n"
+"audio.</i>\n"
+msgstr ""
+"<p>...que si vous êtes en train d'éditer une section dans la vue matricielle "
+"ou dans l'éditeur de partitions, vous pouvez créer une boucle avec la "
+"section que vous éditez?<br><br>Sélectionnez-la et utilisez le menu "
+"<b>Outils -> Curseur local -> créer une boucle avec la sélection</b>, "
+"cliquez ensuite sur l'icône \"Jouer\".</p><br><br>\n"
+"<i>Cette possibilité ne fonctionne pas encore parfaitement avec les "
+"compositions qui contiennent des segments audio.</i>\n"
+
+#: ../docs/en/tips.cpp:221
+msgid ""
+"<p>...if you have more than one note or controller event at the same time, "
+"you\n"
+"can use the [ and ] keys to flip the stack of events around on the "
+"controller\n"
+"and velocity rulers in order to bring the item you wish to adjust into\n"
+"focus.</p>\n"
+msgstr ""
+"<p>...si plus d'un événement note ou contrôleur sont associés à un même "
+"instant et que\n"
+"vous souhaitez ajuster l'un d'entre eux sur la règle des contrôleurs ou de "
+"la vélocité, \n"
+"vous pouvez utiliser les touches [ et ] pour permuter l'ordre des événements "
+"superposés\n"
+"et rendre accessible celui qui doit être modifié.</p>\n"
+
+#: ../docs/en/tips.cpp:229
+msgid ""
+"<p>...that the notation view shows you notes using their display duration, "
+"while the\n"
+"matrix allows you to edit their performance duration?<br><br>\n"
+"<i>Be careful with tied notes in the matrix. It is not apparent that they "
+"are\n"
+"tied, and if you split up a pair of tied notes, subsequent notation views "
+"will\n"
+"be confused and unhappy. This is an old bug that has been on our TODO list\n"
+"for years. Sorry about that, folks. Patches welcome.</i>\n"
+"</p>\n"
+msgstr ""
+"<p>...que l'éditeur de partition montre la durée écrite des notes tandis que "
+"la vue matricielle\n"
+"permet d'éditer leur durée d'exécution effective?<br><br>\n"
+"<i>Dans la vue matricielle, prenez garde aux notes liées avec l'éditeur de "
+"partition. Leur liaison\n"
+"n'est pas apparente, et, si vous séparez des notes liées, la partition "
+"éditée ultérieurement\n"
+"aura une apparence confuse et peu lisible. C'est un vieux bogue figurant sur "
+"notre liste des \"TODO\"\n"
+"depuis des années. Nous en sommes désolés.\n"
+" Tout correctif (patch) sera le bienvenu.</i>\n"
+"</p>\n"
+
+#: ../docs/en/tips.cpp:240
+msgid ""
+"<p>If you're working with a human performance and you need to insert some "
+"new\n"
+"notes, these new notes will sound for their entire written duration. To "
+"blend\n"
+"these new notes into a human performance, select them, then use <b>Adjust -> "
+"Interpret...</b> \n"
+"from the notation view to interpret any marks and massage their "
+"performance\n"
+"durations to something less mechanical.</p>\n"
+msgstr ""
+"<p>Si vous travailler sur une interprétation et que vous avez besoin "
+"d'insérer de nouvelles\n"
+"notes, celles-ci seront jouées avec précisément la durée écrite. Pour "
+"modifier légèrement\n"
+"ces nouvelles notes et rendre la musique plus humaine, sélectionnez-les, et "
+"utilisez <b>Ajuster -> Interpréter...</b>\n"
+"depuis l'éditeur de partition pour tenir compte d'éventuelles indications et "
+"rendre votre musique moins mécanique.</p>\n"
+
+#: ../docs/en/tips.cpp:249
+msgid ""
+"<p>...that Rosegarden can export certain things to LilyPond that it cannot "
+"yet\n"
+"display within its own native interface?<br><br>These new directives can be "
+"inserted\n"
+"via the <b>T</b> text insert tool in the notation view.<br><br>\n"
+"Load the example files\n"
+"<b>lilypond-alternative-endings.rg</b> and <b>lilypond-directives.rg</b> for "
+"a\n"
+"demonstration of how to use the new exportable directives.<br><br>\n"
+"Use <b>File -> Preview with\n"
+"LilyPond</b> to see what they look like on the exported page.<br><br>\n"
+"<i>Be sure to turn on\n"
+"<b>Settings -> Show LilyPond Directives</b> and <b>Show Annotations</b> "
+"within\n"
+"the notation view.</i></p>\n"
+msgstr ""
+"<p>...qu'il est maintenant possible d'exporter vers LilyPond des éléments de "
+"partition que\n"
+"Rosegarden ne sait pas encore afficher?<br><br>Pour ceci, il faut placer les "
+"directives LilyPond appropriées, dans l'éditeur de partition,\n"
+" en utilisant l'outil d'insertion de texte (icône <b>T</b>)<br><br>\n"
+"Les fichiers d'exemple <b>lilypond-alternative-endings.rg</b> et\n"
+" <b>lilypond-directives.rg</b> sont une démonstration de la façon d'utiliser "
+"ces directives LilyPond.<br><br>\n"
+"Utiliser <b>Fichier -> Aperçu avec LilyPond</b> pour voir à quoi ressemblera "
+"la partition exportée.<br><br>\n"
+"<i>Pour que ceci fonctionne, les cases <b>Configuration -> Afficher les "
+"directives LilyPond</b> \n"
+"et <b>Configuration -> Afficher les annotations</b> doivent avoir été "
+"cochées dans l'éditeur de partition.</i></p>\n"
+
+#: ../docs/en/tips.cpp:264
+msgid ""
+"<p>...that Rosegarden has track parameters allowing you to <b>Create "
+"segments with:</b> certain\n"
+"properties by default?<br><br>You can pre-select the clef, transposition, "
+"colour, and specify\n"
+"the highest and lowest playable notes (notes outside this range display in\n"
+"red by default). Then draw a segment with the pencil, or record one, and "
+"any\n"
+"new segments created on this track will take these properties as segment\n"
+"parameters.<br><br>\n"
+"<i>These parameters do not apply to audio tracks.</i></p>\n"
+msgstr ""
+"<p>...que Rosegarden dispose maintenant de paramètres de piste pour <b>Créer "
+"segments avec:</b> certaines propriétés. par défaut? \n"
+"Vous pouvez présélectionner la clef, la transposition, la couleur et "
+"spécifier la plus haute \n"
+"et la plus basse note jouable (en dehors de cette étendue, les notes seront "
+"affichées en rouge par défaut),\n"
+"puis créer un segment avec le crayon, ou en enregistrer un : tous les "
+"nouveaux segments\n"
+"créés sur cette piste auront les propriétés préalablement définies comme "
+"paramètres de segment.<br><br>\n"
+"<i>Ces paramètres ne sont pas applicables avec les pistes audio.</i></p>\n"
+
+#: ../docs/en/tips.cpp:275
+msgid ""
+"<p>...that Rosegarden has a database of preset parameters describing more "
+"than 300\n"
+"musical instruments from the real world, grouped into several convenient\n"
+"categories?<br><br>Each preset contains a clef, transposition, and playable "
+"range\n"
+"suggestions for both amateur and professional players.<br><br>Click the\n"
+"<b>Load</b> button in the new track parameters box to get started! <i>(If "
+"you\n"
+"do not see a <b>Load</b> button, be sure your parameter panel is set for\n"
+"tabbed mode, rather than stacked mode.)</i> <br><br> <i>(Special thanks to "
+"Magnus\n"
+"Johansson for assembling this extraordinary database.)</i></p>\n"
+msgstr ""
+"<p>...que Rosegarden dispose maintenant d'une base de données de paramètres\n"
+"présélectionnés qui décrit plus de 300 instruments de musique du monde "
+"réel,\n"
+"répartis en plusieurs catégories?<br><br>Chaque présélection contient la "
+"clef,\n"
+"la transposition éventuelle et l'étendue de l'instrument joué par un\n"
+"amateur ou par un professionnel.<br><br>Cliquer le bouton <b>Charger</b>\n"
+"dans la boîte de paramètres de piste pour commencer! <i>(Si vous ne voyez\n"
+"pas le bouton <b>Charger</b>, assurez vous que votre panneau de paramètres\n"
+"est en mode onglets plutôt qu'en mode pile.)</i> <br><br> <i>(Tous nos\n"
+"remerciements à Magnus Johansson pour avoir constitué cette extraordinaire\n"
+"base de données.)</i></p>\n"
+
+#: ../docs/en/tips.cpp:287
+msgid ""
+"<p>...that when exporting to Lilypond, you can merge tracks that have the "
+"same name onto a single staff?<br><br>For example, if there are three voices "
+"in a single part, write each\n"
+"voice as an independent segment/staff, each on a separate track. Give all\n"
+"three tracks the same name, and select <b>[x] Merge tracks that have the "
+"same\n"
+"name</b> from the options dialog that appears when you export to, or "
+"preview\n"
+"with LilyPond.<br><br>\n"
+"<i>The tracks must have a non-default name for this to work.</i></p>\n"
+msgstr ""
+"<p>...qu'en exportant vers Lilypond, il est possible de fusionner les pistes "
+"de même nom sur une seule portée?<br><br>Par exemple, pour faire figurer "
+"trois voix sur une seule portée, écrivez\n"
+"chaque voix dans un segment indépendant, chacun sur une piste séparée. "
+"Donnez le même nom à chacune\n"
+"des trois pistes et sélectionnez <b>[x] Fusionner les pistes de même nom </"
+"b> dans les options du dialogue qui apparaît quand vous exportez ou "
+"prévisualisez\n"
+" avec LilyPond.<br><br>\n"
+"<i>Pour que ceci fonctionne, les pistes ne doivent pas avoir un nom \"par "
+"défaut\".</i></p>\n"
+
+#: ../docs/en/tips.cpp:297
+msgid ""
+" \t \n"
+"<p>...that you can use the mouse wheel to scroll up and down, scroll left "
+"and right, and zoom in and out?<br><br>Just roll the wheel to scroll up or "
+"down. Hold Alt as well to scroll left or right, or hold Ctrl to zoom in and "
+"out.</p> \t \n"
+msgstr ""
+" \t \n"
+"<p>...que vous pouvez utiliser la roulette de la souris pour obtenir un "
+"défilement de haut en bas, de droite à gauche ou un zoom?<br><br>La molette "
+"seule suffit pour faire défiler vers le haut ou le bas, un défilement vers "
+"la droite ou la gauche est obtenu en pressant simultanément la touche \"Alt"
+"\" et un zoom avant ou arrière en utilisant la touche \"Ctrl\".</p> \t \n"
+
+#: ../docs/en/tips.cpp:303
+msgid ""
+" \t \n"
+"<p>...that you can time-stretch an audio segment -- stretching or squashing "
+"a\n"
+"sample to a different duration without changing its pitch -- just by\n"
+"dragging its right edge with the Ctrl key pressed?</p>\n"
+msgstr ""
+" \t \n"
+"<p>...que vous pouvez modifier la durée d'un segment audio -- l'étirer ou\n"
+"le comprimer sans changer sa tonalité -- en faisant glisser son extrémité\n"
+"droite tout en maintenant pressée la touche \"Ctrl\"?</p>\n"
+
+#: ../docs/en/tips.cpp:311
+msgid ""
+" \t \n"
+"<p>...that you can add audio to your Rosegarden composition just by dragging "
+"an audio file from your file manager and dropping it on the Rosegarden "
+"segment canvas? (Make sure you drop it on an audio track!)<br><br>You can "
+"also drop audio files from Rosegarden's audio file manager window onto the "
+"segment canvas, and from other programs onto the audio file manager.</p>\n"
+msgstr ""
+" \t \n"
+"<p>...que vous pouvez ajouter un enregistrement audio à votre composition "
+"Rosegarden en faisant glisser un fichier audio depuis le gestionnaire de "
+"fichiers et en le déposant sur canevas des segments? (Déposez le bien sur "
+"une piste audio!)<br><br>Vous pouvez aussi glisser/déposer des fichiers "
+"depuis la fenêtre du gestionnaire de fichiers audio de Rosegarden vers le "
+"canevas des segments et depuis d'autres programmes vers le gestionnaire des "
+"fichiers audio.</p>\n"
+
+#: ../docs/en/tips.cpp:317
+msgid ""
+" \t \n"
+"<p>...that you can set the tempo to match the duration of an audio segment "
+"if you know it's an exact number of bars or beats long?<br><br>Just select "
+"the audio segment and use <b>Composition -> Tempo and Time Signature -> Set "
+"Tempo to Audio Segment Duration</b>.</p>\n"
+msgstr ""
+" \t \n"
+"<p>...qu'il est possible de régler le tempo pour s'ajuster à la durée d'un "
+"segment audio si le nombre exacte de mesures ou temps qu'il contient est "
+"connu?<br><br>Sélectionnez le segment audio et utilisez le menu "
+"<b>Composition -> Fixer le tempo sur la durée du segment audio</b>.</p>\n"
+
+#: ../data/fonts/mappings/fonts.cpp:1
+msgid "Feta Pixmaps"
+msgstr "Feta Pixmaps"
+
+#: ../data/fonts/mappings/fonts.cpp:2 ../data/fonts/mappings/fonts.cpp:7
+msgid "GNU Lilypond"
+msgstr "GNU Lilypond"
+
+#: ../data/fonts/mappings/fonts.cpp:3 ../data/fonts/mappings/fonts.cpp:8
+msgid "Copyright (c) 1997--2003 Han-Wen Nienhuys and Jan Nieuwenhuizen"
+msgstr "Copyright (c) 1997--2003 Han-Wen Nienhuys et Jan Nieuwenhuizen"
+
+#: ../data/fonts/mappings/fonts.cpp:4 ../data/fonts/mappings/fonts.cpp:9
+#: ../data/fonts/mappings/fonts.cpp:14 ../data/fonts/mappings/fonts.cpp:19
+#: ../data/fonts/mappings/fonts.cpp:24 ../data/fonts/mappings/fonts.cpp:29
+#: ../data/fonts/mappings/fonts.cpp:34 ../data/fonts/mappings/fonts.cpp:39
+#: ../data/fonts/mappings/fonts.cpp:44 ../data/fonts/mappings/fonts.cpp:49
+#: ../data/fonts/mappings/fonts.cpp:54
+msgid "Chris Cannam"
+msgstr "Chris Cannam"
+
+#: ../data/fonts/mappings/fonts.cpp:5 ../data/fonts/mappings/fonts.cpp:40
+msgid "pixmap"
+msgstr "pixmap"
+
+#: ../data/fonts/mappings/fonts.cpp:6
+msgid "Feta"
+msgstr "Feta"
+
+#: ../data/fonts/mappings/fonts.cpp:10 ../data/fonts/mappings/fonts.cpp:15
+#: ../data/fonts/mappings/fonts.cpp:20 ../data/fonts/mappings/fonts.cpp:25
+#: ../data/fonts/mappings/fonts.cpp:30 ../data/fonts/mappings/fonts.cpp:35
+#: ../data/fonts/mappings/fonts.cpp:45 ../data/fonts/mappings/fonts.cpp:50
+#: ../data/fonts/mappings/fonts.cpp:55
+msgid "scalable"
+msgstr "dimensionable"
+
+#: ../data/fonts/mappings/fonts.cpp:11
+msgid "Fughetta"
+msgstr "Fughetta"
+
+#: ../data/fonts/mappings/fonts.cpp:12
+msgid ""
+"Created by Blake Hodgetts; freely redistributable. See http://www.efn.org/"
+"~bch/aboutfonts.html"
+msgstr ""
+"Créé par Blake Hodgetts; librement redistribuable. Voir http://www.efn.org/"
+"~bch/aboutfonts.html"
+
+#: ../data/fonts/mappings/fonts.cpp:13
+msgid "Copyright 1995-1999 Blake Hodgetts"
+msgstr "Copyright 1995-1999 Blake Hodgetts"
+
+#: ../data/fonts/mappings/fonts.cpp:16
+msgid "Inkpen"
+msgstr "Inkpen"
+
+#: ../data/fonts/mappings/fonts.cpp:17
+msgid "Inkpen is part of Sibelius, but other fonts may use the same mappings."
+msgstr ""
+"Inkpen fait partie de Sibelius, mais d'autres polices peuvent utiliser les "
+"mêmes mappages."
+
+#: ../data/fonts/mappings/fonts.cpp:18 ../data/fonts/mappings/fonts.cpp:28
+msgid "Copyright Sibelius Software Ltd"
+msgstr "Copyright Sibelius Software Ltd"
+
+#: ../data/fonts/mappings/fonts.cpp:21
+msgid "Maestro"
+msgstr "Maestro"
+
+#: ../data/fonts/mappings/fonts.cpp:22
+msgid "Maestro is part of Finale, but other fonts use the same mappings."
+msgstr ""
+"Maestro fait partie de Finale, mais d'autres polices peuvent utiliser les "
+"mêmes mappages."
+
+#: ../data/fonts/mappings/fonts.cpp:23 ../data/fonts/mappings/fonts.cpp:33
+msgid "Copyright Coda Inc"
+msgstr "Copyright Coda Inc"
+
+#: ../data/fonts/mappings/fonts.cpp:27
+msgid "Opus is part of Sibelius, but other fonts may use the same mappings."
+msgstr ""
+"Opus fait partie de Sibelius, mais d'autres polices peuvent utiliser les "
+"mêmes mappages."
+
+#: ../data/fonts/mappings/fonts.cpp:31
+msgid "Petrucci"
+msgstr "Petrucci"
+
+#: ../data/fonts/mappings/fonts.cpp:32
+msgid "Petrucci is part of Finale, but other fonts use the same mappings."
+msgstr ""
+"Petrucci fait partie de Finale, mais d'autres polices utilisent les mêmes "
+"mappages."
+
+#: ../data/fonts/mappings/fonts.cpp:36
+msgid "RG21"
+msgstr "RG21"
+
+#: ../data/fonts/mappings/fonts.cpp:37
+msgid "Rosegarden 2.1"
+msgstr "Rosegarden 2.1"
+
+#: ../data/fonts/mappings/fonts.cpp:38
+msgid "Copyright (c) 1994--2001 Chris Cannam"
+msgstr "Copyright (c) 1994--2001 Chris Cannam"
+
+#: ../data/fonts/mappings/fonts.cpp:41
+msgid "Sonata"
+msgstr "Sonate"
+
+#: ../data/fonts/mappings/fonts.cpp:42
+msgid "Adobe"
+msgstr "Adobe"
+
+#: ../data/fonts/mappings/fonts.cpp:43
+msgid "Copyright Adobe Inc"
+msgstr "Copyright Adobe Inc"
+
+#: ../data/fonts/mappings/fonts.cpp:46
+msgid "Steinberg"
+msgstr "Steinberg"
+
+#: ../data/fonts/mappings/fonts.cpp:47
+msgid "The Steinberg Notation font is part of Cubase."
+msgstr "La police de partition Steinberg fait partie de Cubase."
+
+#: ../data/fonts/mappings/fonts.cpp:48
+msgid "Copyright Steinberg Inc"
+msgstr "Copyright Steinberg Inc"
+
+#: ../data/fonts/mappings/fonts.cpp:51
+msgid "Xinfonia"
+msgstr "Xinfonia"
+
+#: ../data/fonts/mappings/fonts.cpp:52
+msgid "xemo.org"
+msgstr "xemo.org"
+
+#: ../data/fonts/mappings/fonts.cpp:53
+msgid "Copyright 2001-2003 Xemus Software LLC"
+msgstr "Copyright 2001-2003 Xemus Software LLC"
+
+#: ../data/styles/styles.cpp:1
+msgid "Classical"
+msgstr "Classique"
+
+#: ../data/styles/styles.cpp:2
+msgid "Cross"
+msgstr "Barrée"
+
+#: ../data/styles/styles.cpp:3
+msgid "Mensural"
+msgstr "Mensurale"
+
+#: ../data/styles/styles.cpp:4
+msgid "Triangle"
+msgstr "Triangle"
diff --git a/po/it.po b/po/it.po
new file mode 100644
index 0000000..ca1df9e
--- /dev/null
+++ b/po/it.po
@@ -0,0 +1,11473 @@
+# translation of it.po to Italian
+# This file is distributed under the same license as the PACKAGE package.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER.
+#
+# Alessandro Musesti <[email protected]>, 2005, 2006, 2007, 2008.
+msgid ""
+msgstr ""
+"Project-Id-Version: it\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-04-24 18:19-0400\n"
+"PO-Revision-Date: 2008-04-21 11:03+0200\n"
+"Last-Translator: Alessandro Musesti <[email protected]>\n"
+"Language-Team: Italian <[email protected]>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.4\n"
+
+#: ../src/gui/dialogs/RescaleDialog.cpp:51 rc.cpp:192 rc.cpp:312
+#, no-c-format
+msgid "Rescale"
+msgstr "Riscala"
+
+#: ../src/gui/dialogs/RescaleDialog.cpp:56
+msgid "Duration of selection"
+msgstr "Durata della selezione"
+
+#: ../src/gui/dialogs/RescaleDialog.cpp:62
+msgid "Adjust times of following events accordingly"
+msgstr "Aggiusta in accordo i tempi dei seguenti eventi"
+
+#: ../src/gui/dialogs/PitchDialog.cpp:45
+#: ../src/gui/dialogs/RescaleDialog.cpp:72
+#: ../src/gui/dialogs/TimeDialog.cpp:51 ../src/gui/dialogs/TimeDialog.cpp:68
+#: ../src/gui/studio/BankEditorDialog.cpp:109
+msgid "Reset"
+msgstr "Ripristina"
+
+#: ../src/commands/segment/SegmentSplitByPitchCommand.cpp:46
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:46
+msgid "Split by Pitch"
+msgstr "Dividi per altezza"
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:54
+msgid "Starting split pitch"
+msgstr "Comincio la divisione dell'altezza"
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:57
+msgid "Range up and down to follow music"
+msgstr "Muoviti su e giù per seguire la musica"
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:63
+msgid "Duplicate non-note events"
+msgstr "Duplica gli eventi che non sono note"
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:66
+msgid "Clef handling:"
+msgstr "Muovere la chiave:"
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:69
+msgid "Leave clefs alone"
+msgstr "Lasciare le chiavi da sole"
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:70
+msgid "Guess new clefs"
+msgstr "Indovina nuove chiavi"
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:71
+msgid "Use treble and bass clefs"
+msgstr "Usa chiavi di basso e violino"
+
+#: ../src/gui/dialogs/DocumentConfigureDialog.cpp:64
+msgid "Document Properties"
+msgstr "Proprietà documento"
+
+#: ../src/gui/dialogs/MakeOrnamentDialog.cpp:45
+#: ../src/gui/editors/notation/NotationView.cpp:6048
+msgid "Make Ornament"
+msgstr "Fai ornamento"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:183
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:179
+#: ../src/gui/dialogs/EventEditDialog.cpp:128
+#: ../src/gui/dialogs/MakeOrnamentDialog.cpp:49
+#: ../src/gui/studio/DeviceEditorDialog.cpp:74
+#: ../src/gui/studio/NameSetEditor.cpp:72
+#: ../src/gui/widgets/ColourTable.cpp:51
+msgid "Name"
+msgstr "Nome"
+
+#: ../src/gui/dialogs/MakeOrnamentDialog.cpp:51
+msgid ""
+"The name is used to identify both the ornament\n"
+"and the triggered segment that stores\n"
+"the ornament's notes."
+msgstr ""
+"Il nome è usato per identificare sia gli ornamenti\n"
+"che i segmenti attivi che contengono le note dell'ornamento."
+
+#: ../src/gui/dialogs/MakeOrnamentDialog.cpp:54
+msgid "Name: "
+msgstr "Nome: "
+
+#: ../src/gui/dialogs/MakeOrnamentDialog.cpp:57
+#: ../src/gui/editors/eventlist/EventView.cpp:717
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:92
+msgid "Base pitch"
+msgstr "Altezza di base"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:57
+#: ../src/gui/editors/eventlist/EventView.cpp:140
+msgid "Text"
+msgstr "Testo"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:66
+msgid "Specification"
+msgstr "Specificazione"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:68
+msgid "Preview"
+msgstr "Anteprime"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:72
+msgid "Text: "
+msgstr "Testo: "
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:79
+msgid "Style: "
+msgstr "Stile: "
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:90
+msgid "Dynamic"
+msgstr "Dinamica"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:93
+msgid "Direction"
+msgstr "Direzione"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:96
+msgid "Local Direction"
+msgstr "Direzione locale"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:63
+#: ../src/gui/dialogs/TextEventDialog.cpp:99
+#: ../src/gui/editors/tempo/TempoView.cpp:91
+msgid "Tempo"
+msgstr "Ritmo"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:102
+msgid "Local Tempo"
+msgstr "Ritmo locale"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:105
+msgid "Lyric"
+msgstr "Parola"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:108
+#: ../src/gui/editors/notation/NotationView.cpp:4242
+msgid "Chord"
+msgstr "Accordo"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:111
+msgid "Annotation"
+msgstr "Annotazione"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:114
+msgid "LilyPond Directive"
+msgstr "Direttiva di Lilypond"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:138
+msgid "Verse: "
+msgstr "Verso: "
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:148
+msgid "Dynamic: "
+msgstr "Dinamica: "
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:152
+msgid "ppp"
+msgstr "ppp"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:153
+msgid "pp"
+msgstr "pp"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:154
+msgid "p"
+msgstr "p"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:155
+msgid "mp"
+msgstr "mp"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:156
+msgid "mf"
+msgstr "mf"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:157
+msgid "f"
+msgstr "f"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:158
+msgid "ff"
+msgstr "ff"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:159
+msgid "fff"
+msgstr "fff"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:160
+msgid "rfz"
+msgstr "rfz"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:161
+msgid "sf"
+msgstr "sf"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:165
+msgid "Direction: "
+msgstr "Direzione: "
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:174
+msgid " ,"
+msgstr " ,"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:175
+msgid "D.C. al Fine"
+msgstr "D.C. alla Fine"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:176
+msgid "D.S. al Fine"
+msgstr "D.S. alla Fine"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:177
+msgid "Fine"
+msgstr "Fine"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:178
+msgid "D.S. al Coda"
+msgstr "D.S. alla Coda"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:179
+msgid "to Coda"
+msgstr "alla Coda"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:180
+msgid "Coda"
+msgstr "Coda"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:184
+msgid "Local Direction: "
+msgstr "Direzione locale: "
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:188
+msgid "accel."
+msgstr "accel."
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:189
+msgid "ritard."
+msgstr "ritard."
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:190
+msgid "ralletando"
+msgstr "rallentando"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:191
+msgid "a tempo"
+msgstr "a tempo"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:192
+msgid "legato"
+msgstr "legato"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:193
+msgid "simile"
+msgstr "simile"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:194
+msgid "pizz."
+msgstr "pizz."
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:195
+msgid "arco"
+msgstr "arco"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:196
+msgid "non vib."
+msgstr "non vib."
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:197
+msgid "sul pont."
+msgstr "sul pont."
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:198
+#: ../src/gui/dialogs/TextEventDialog.cpp:200
+msgid "sul tasto"
+msgstr "sul tasto"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:199
+msgid "con legno"
+msgstr "con legno"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:201
+msgid "sul G"
+msgstr "sul G"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:202
+msgid "ordinario"
+msgstr "ordinario"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:203
+msgid "Muta in "
+msgstr "Muta in "
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:204
+msgid "volti subito "
+msgstr "volti subito "
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:205
+msgid "soli"
+msgstr "soli"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:206
+msgid "div."
+msgstr "div."
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:210
+msgid "Tempo: "
+msgstr "Tempo: "
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:214
+#: ../src/gui/dialogs/TextEventDialog.cpp:238
+msgid "Grave"
+msgstr "Grave"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:215
+#: ../src/gui/dialogs/TextEventDialog.cpp:239
+msgid "Adagio"
+msgstr "Adagio"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:216
+#: ../src/gui/dialogs/TextEventDialog.cpp:240
+msgid "Largo"
+msgstr "Largo"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:217
+#: ../src/gui/dialogs/TextEventDialog.cpp:241
+msgid "Lento"
+msgstr "Lento"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:218
+#: ../src/gui/dialogs/TextEventDialog.cpp:242
+msgid "Andante"
+msgstr "Andante"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:219
+#: ../src/gui/dialogs/TextEventDialog.cpp:243
+msgid "Moderato"
+msgstr "Moderato"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:220
+#: ../src/gui/dialogs/TextEventDialog.cpp:244
+msgid "Allegretto"
+msgstr "Allegretto"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:221
+#: ../src/gui/dialogs/TextEventDialog.cpp:245
+msgid "Allegro"
+msgstr "Allegro"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:222
+#: ../src/gui/dialogs/TextEventDialog.cpp:246
+msgid "Vivace"
+msgstr "Vivace"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:223
+#: ../src/gui/dialogs/TextEventDialog.cpp:247
+msgid "Presto"
+msgstr "Presto"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:224
+#: ../src/gui/dialogs/TextEventDialog.cpp:248
+msgid "Prestissimo"
+msgstr "Prestissimo"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:225
+#: ../src/gui/dialogs/TextEventDialog.cpp:249
+msgid "Maestoso"
+msgstr "Maestoso"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:226
+#: ../src/gui/dialogs/TextEventDialog.cpp:250
+msgid "Sostenuto"
+msgstr "Sostenuto"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:227
+#: ../src/gui/dialogs/TextEventDialog.cpp:251
+msgid "Tempo Primo"
+msgstr "Tempo Primo"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:234
+msgid "Local Tempo: "
+msgstr "Tempo Locale: "
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:255
+msgid "Directive: "
+msgstr "Direttiva:.."
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:312
+msgid "Example"
+msgstr "Esempio"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:65
+msgid "Event Filter"
+msgstr "Filtro eventi"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:86
+msgid "Note Events"
+msgstr "Eventi delle note"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:90
+msgid "lowest:"
+msgstr "più basso:"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:93
+msgid "highest:"
+msgstr "più alto:"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:96
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:141
+#: ../src/gui/widgets/PitchChooser.cpp:53
+msgid "Pitch:"
+msgstr "Altezza:"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:99
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:163
+msgid "Velocity:"
+msgstr "Velocità:"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:102
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:129
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:257
+msgid "Duration:"
+msgstr "Durata:"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:107
+#: ../src/gui/dialogs/EventFilterDialog.cpp:114
+#: ../src/gui/dialogs/EventFilterDialog.cpp:121
+msgid "include"
+msgstr "includi"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:108
+#: ../src/gui/dialogs/EventFilterDialog.cpp:115
+#: ../src/gui/dialogs/EventFilterDialog.cpp:122
+msgid "exclude"
+msgstr "escludi"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:136
+#: ../src/gui/dialogs/EventFilterDialog.cpp:155
+#: ../src/gui/editors/eventlist/EventView.cpp:172
+#: ../src/gui/editors/eventlist/EventView.cpp:179
+#: ../src/gui/editors/eventlist/EventView.cpp:186
+msgid "edit"
+msgstr "modifica"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:141
+#: ../src/gui/dialogs/EventFilterDialog.cpp:157
+msgid "choose a pitch using a staff"
+msgstr "scegli un'altezza usando il rigo"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:182
+#: ../src/gui/dialogs/EventFilterDialog.cpp:188
+msgid "longest"
+msgstr "più lungo"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:200
+msgid "Include all"
+msgstr "Includi tutti"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:203
+msgid "Include entire range of values"
+msgstr "Includi l'intero intervallo di valori"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:206
+msgid "Exclude all"
+msgstr "Escludi tutti"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:209
+msgid "Exclude entire range of values"
+msgstr "Escludi l'intero intervallo di valori"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:233
+#: ../src/gui/dialogs/EventFilterDialog.cpp:234
+msgid "shortest"
+msgstr "più corto"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:333
+msgid "Lowest pitch"
+msgstr "Nota più bassa"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:343
+msgid "Highest pitch"
+msgstr "Nota più alta"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:56
+#: ../src/gui/editors/notation/NotationView.cpp:1619
+#: ../src/gui/editors/notation/NotationView.cpp:6088
+msgid "Use Ornament"
+msgstr "Usa ornamento"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:260
+#: ../src/gui/configuration/NotationConfigurationPage.h:64
+#: ../src/gui/configuration/NotationConfigurationPage.h:65
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:63
+msgid "Notation"
+msgstr "Notazione"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:68
+msgid "Display as: "
+msgstr "Mostra come: "
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:84
+msgid "Trill"
+msgstr "Trillo"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:84
+msgid "Trill with line"
+msgstr "Trillo con linea"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:84
+msgid "Trill line only"
+msgstr "Solo linea di trillo"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:85
+msgid "Turn"
+msgstr "Gira"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:85
+msgid "Mordent"
+msgstr "Mordente"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:85
+msgid "Inverted mordent"
+msgstr "Mordente invertito"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:86
+msgid "Long mordent"
+msgstr "Mordente lungo"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:86
+msgid "Long inverted mordent"
+msgstr "Mordente lungo invertito"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:94
+msgid "Text mark"
+msgstr "Segno del testo"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:98
+msgid " Text: "
+msgstr " Testo: "
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:104
+msgid "Performance"
+msgstr "Performance"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:109
+msgid "Perform using triggered segment: "
+msgstr "Esegui usando i segmenti attivi: "
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:75
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:123
+msgid "Perform with timing: "
+msgstr "Esegui con tempismo: "
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:81
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:129
+msgid "As stored"
+msgstr "Come memorizzato"
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:82
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:130
+msgid "Truncate if longer than note"
+msgstr "Tronca se più lungo della nota"
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:83
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:131
+msgid "End at same time as note"
+msgstr "Finisci allo stesso istante della nota"
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:84
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:132
+msgid "Stretch or squash segment to note duration"
+msgstr "Adatta il segmento alla durata della nota"
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:86
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:134
+msgid "Adjust pitch to note"
+msgstr "Adatta l'altezza alla nota"
+
+#: ../src/gui/dialogs/PitchPickerDialog.cpp:40
+msgid "Pitch Selector"
+msgstr "Selettore di altezza"
+
+#: ../src/gui/dialogs/BeatsBarsDialog.cpp:44
+msgid "Audio Segment Duration"
+msgstr "Durata Segmento Audio"
+
+#: ../src/gui/dialogs/BeatsBarsDialog.cpp:50
+msgid "The selected audio segment contains:"
+msgstr "Il segmento audio selezionato contiene:"
+
+#: ../src/gui/dialogs/BeatsBarsDialog.cpp:59
+msgid "beat(s)"
+msgstr "ritmo(i)"
+
+#: ../src/gui/dialogs/BeatsBarsDialog.cpp:60
+msgid "bar(s)"
+msgstr "battuta(e)"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:51
+msgid "Tuplet"
+msgstr "Tupla"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:58
+msgid "New timing for tuplet group"
+msgstr "Nuovo tempo per il gruppo di tuple"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:76
+msgid "Play "
+msgstr "Riproduci"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:98
+msgid "in the time of "
+msgstr "nel tempo di "
+
+#: ../src/gui/dialogs/TupletDialog.cpp:104
+msgid "Timing is already correct: update display only"
+msgstr "Il tempo è giusto: aggiorna solo la visualizzazione"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:114
+msgid "Timing calculations"
+msgstr "Calcolo del tempo"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:120
+msgid "Selected region:"
+msgstr "Regione selezionata:"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:129
+msgid "Group with current timing:"
+msgstr "Gruppo col tempo corrente:"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:135
+msgid "Group with new timing:"
+msgstr "Gruppo col tempo nuovo:"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:141
+msgid "Gap created by timing change:"
+msgstr "Gap creato dal cambio di tempo:"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:149
+msgid "Unchanged at end of selection:"
+msgstr "Invariato alla fine della selezione:"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:63 rc.cpp:372
+#, no-c-format
+msgid "Metronome"
+msgstr "Metronomo"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:77
+msgid "Metronome Instrument"
+msgstr "Strumento metronomo"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:82
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:150
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:183
+#: ../src/gui/studio/DeviceEditorDialog.cpp:73
+#: ../src/gui/studio/DeviceManagerDialog.cpp:105
+#: ../src/gui/studio/DeviceManagerDialog.cpp:163
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:66
+msgid "Device"
+msgstr "Dispositivo"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:101
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:89
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:215
+#: ../src/gui/studio/DeviceEditorDialog.cpp:195
+#: ../src/gui/studio/DeviceEditorDialog.cpp:218
+#: ../src/gui/studio/DeviceEditorDialog.cpp:230
+#: ../src/gui/studio/DeviceManagerDialog.cpp:196
+#: ../src/gui/studio/DeviceManagerDialog.cpp:440
+#: ../src/gui/studio/DeviceManagerDialog.cpp:452
+msgid "No connection"
+msgstr "Nessuna connessione"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:112
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:111
+#: ../src/gui/editors/parameters/InstrumentParameterBox.cpp:53
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:1209
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:159
+#: ../src/gui/general/PresetHandlerDialog.cpp:92
+#: ../src/gui/studio/MidiMixerWindow.cpp:204
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:67
+msgid "Instrument"
+msgstr "Strumento"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:118
+msgid "Beats"
+msgstr "Battiti"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:184
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:123
+msgid "Resolution"
+msgstr "Risoluzione"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:309
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:139
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:205
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:125
+#: ../src/gui/editors/matrix/MatrixView.cpp:2132
+#: ../src/gui/editors/notation/NotationView.cpp:1582
+#: ../src/gui/widgets/QuantizeParameters.cpp:128
+#: ../src/gui/widgets/QuantizeParameters.cpp:301
+msgid "None"
+msgstr "Nessuno"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:126
+msgid "Bars only"
+msgstr "Solo barre"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:127
+msgid "Bars and beats"
+msgstr "Barre e battiti"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:128
+msgid "Bars, beats, and divisions"
+msgstr "Barre, battiti e divisioni"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:132
+msgid "Bar velocity"
+msgstr "Velocità della barra"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:139
+msgid "Beat velocity"
+msgstr "Velocità battito"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:146
+msgid "Sub-beat velocity"
+msgstr "Velocità del sotto-battito"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:155
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:324
+msgid "Pitch"
+msgstr "Altezza"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:160
+msgid "for Bar"
+msgstr "per la Barra"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:161
+msgid "for Beat"
+msgstr "per il Ritmo"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:162
+msgid "for Sub-beat"
+msgstr "per il sotto-ritmo"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:166
+msgid "Metronome Activated"
+msgstr "Metronomo attivato"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:167
+msgid "Playing"
+msgstr "In riproduzione"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:168
+msgid "Recording"
+msgstr "In registrazione"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:46
+msgid "Choose Text Encoding"
+msgstr "Scegli la codifica del testo"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:50
+msgid ""
+"\n"
+"This file contains text in an unknown language encoding.\n"
+"\n"
+"Please select one of the following estimated text encodings\n"
+"for use with the text in this file:\n"
+msgstr ""
+"\n"
+"Questo file contiene del testo in una codifica sconosciuta.\n"
+"\n"
+"Scegli tra le seguenti codifiche la più indicata da usare per il testo di "
+"questo file:\n"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:61
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:77
+msgid "Japanese Shift-JIS"
+msgstr "Japanese Shift-JIS"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:62
+msgid "Unicode variable-width"
+msgstr "Ampiezza variabile di unicode"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:63
+msgid "Western Europe"
+msgstr "Europa occidentale"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:64
+msgid "Western Europe + Euro"
+msgstr "Europa occidentale + Euro"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:65
+msgid "Eastern Europe"
+msgstr "Europa orientale"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:66
+msgid "Southern Europe"
+msgstr "Europa meridionale"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:67
+msgid "Northern Europe"
+msgstr "Europa settentrionale"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:68
+msgid "Cyrillic"
+msgstr "Cirillico"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:69
+msgid "Arabic"
+msgstr "Arabo"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:70
+msgid "Greek"
+msgstr "Greco"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:71
+msgid "Hebrew"
+msgstr "Ebraico"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:72
+msgid "Turkish"
+msgstr "Turco"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:73
+msgid "Nordic"
+msgstr "Nordico"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:74
+msgid "Thai"
+msgstr "Thailandese"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:75
+msgid "Baltic"
+msgstr "Baltico"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:76
+msgid "Celtic"
+msgstr "Celtico"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:78
+msgid "Traditional Chinese"
+msgstr "Cinese tradizionale"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:79
+msgid "Simplified Chinese"
+msgstr "Cinese semplificato"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:80
+msgid "Russian"
+msgstr "Russo"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:81
+msgid "Ukrainian"
+msgstr "Ucraino"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:82
+msgid "Tamil"
+msgstr "Tamil"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:117
+#, c-format
+msgid "Microsoft Code Page %1"
+msgstr "Microsoft Code Page %1"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:123
+#: ../src/gui/editors/matrix/MatrixView.cpp:1490
+msgid "%1 (%2)"
+msgstr "%1 (%2)"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:142
+msgid ""
+"\n"
+"Example text from file:"
+msgstr ""
+"\n"
+"Testo di esempio dal file:"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:59
+#: ../src/gui/editors/tempo/TempoView.cpp:92
+msgid "Time Signature"
+msgstr "Metro"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:82
+msgid "Time signature"
+msgstr "Metro"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:116
+msgid "Time where signature takes effect"
+msgstr "Momento in cui l'indicazione ha effetto"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:83
+#: ../src/gui/dialogs/TempoDialog.cpp:128
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:129
+#: ../src/gui/general/PresetHandlerDialog.cpp:101
+msgid "Scope"
+msgstr "Intervallo di visibilità"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:141
+#, c-format
+msgid "Insertion point is at start of measure %1."
+msgstr "Il punto d'inserimento è all'inizio della battuta %1."
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:145
+#, c-format
+msgid "Insertion point is in the middle of measure %1."
+msgstr "Il punto d'inserimento è in mezzo alla battuta %1."
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:150
+msgid "Insertion point is at start of composition."
+msgstr "Il punto d'inserimento è all'inizio della composizione."
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:155
+msgid "Start measure %1 here"
+msgstr "Comincia la battuta %1 qui"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:159
+#, c-format
+msgid "Change time from start of measure %1"
+msgstr "Cambia il ritmo dall'inizio della battuta %1"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:166
+#, c-format
+msgid "Time change will take effect at the start of measure %1."
+msgstr "Il cambio di tempo comincerà all'inizio della battuta %1."
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:176
+msgid "Hide the time signature"
+msgstr "Nascondi l'indicatore del metro"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:181
+msgid "Hide the affected bar lines"
+msgstr "Nascondi le linee di battuta corrispondenti"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:186
+msgid "Show as common time"
+msgstr "Mostra come tempo comune"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:191
+msgid "Correct the durations of following measures"
+msgstr "Correggi la durata delle seguenti battute"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:280
+msgid "Display as common time"
+msgstr "Visualizza come tempo comune"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:284
+msgid "Display as cut common time"
+msgstr "Mostra come tempo comune di taglio"
+
+#: ../src/gui/dialogs/ConfigureDialog.cpp:66
+msgid "Configure Rosegarden"
+msgstr "Configura Rosegarden"
+
+#: ../src/gui/dialogs/MarkerModifyDialog.cpp:53
+#: ../src/gui/dialogs/MarkerModifyDialog.cpp:61
+msgid "Edit Marker"
+msgstr "Modifica marcatore"
+
+#: ../src/gui/dialogs/MarkerModifyDialog.cpp:78
+msgid "Marker Time"
+msgstr "Tempo del marcatore "
+
+#: ../src/gui/dialogs/MarkerModifyDialog.cpp:94
+msgid "Marker Properties"
+msgstr "Proprietà marcatore"
+
+#: ../src/gui/dialogs/MarkerModifyDialog.cpp:100
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:554
+msgid "Text:"
+msgstr "Testo:"
+
+#: ../src/gui/dialogs/MarkerModifyDialog.cpp:104
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:85
+msgid "Description:"
+msgstr "Descrizione:"
+
+#: ../src/gui/dialogs/FileMergeDialog.cpp:46
+msgid "Merge File"
+msgstr "Inserisci File"
+
+#: ../src/gui/dialogs/FileMergeDialog.cpp:53
+msgid "Merge new file "
+msgstr "Inserisci nuovo file"
+
+#: ../src/gui/dialogs/FileMergeDialog.cpp:56
+msgid "At start of existing composition"
+msgstr "All'inizio della composizione esistente"
+
+#: ../src/gui/dialogs/FileMergeDialog.cpp:57
+msgid "From end of existing composition"
+msgstr "Dalla fine della composizione esistente"
+
+#: ../src/gui/dialogs/FileMergeDialog.cpp:61
+msgid "The file has different time signatures or tempos."
+msgstr "Il file ha metri o tempi diversi."
+
+#: ../src/gui/dialogs/FileMergeDialog.cpp:62
+msgid "Import these as well"
+msgstr "Importa anche questi"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:171
+#: ../src/gui/dialogs/ShowSequencerStatusDialog.cpp:44
+msgid "Sequencer status"
+msgstr "Stato sequencer"
+
+#: ../src/gui/dialogs/ShowSequencerStatusDialog.cpp:48
+msgid "Sequencer status:"
+msgstr "Stato sequencer:"
+
+#: ../src/gui/dialogs/ShowSequencerStatusDialog.cpp:50
+msgid "Status not available."
+msgstr "Stato non disponibile."
+
+#: ../src/gui/dialogs/ShowSequencerStatusDialog.cpp:57
+msgid "Sequencer is not running or is not responding."
+msgstr "Il sequencer non è attivo o non risponde."
+
+#: ../src/gui/dialogs/ShowSequencerStatusDialog.cpp:64
+msgid "Sequencer is not returning a valid status report."
+msgstr "Il sequencer non restituisce uno stato valido."
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:46
+msgid "Add Tracks"
+msgstr "Aggiungi tracce"
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:54
+msgid "How many tracks do you want to add?"
+msgstr "Quante tracce vuoi aggiungere?"
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:62
+msgid "Add tracks"
+msgstr "Aggiungi tracce"
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:64
+msgid "At the top"
+msgstr "All'inizio"
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:65
+msgid "Above the current selected track"
+msgstr "Sopra la traccia selezionata"
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:66
+msgid "Below the current selected track"
+msgstr "Sotto la traccia selezionata"
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:67
+msgid "At the bottom"
+msgstr "Alla fine"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:75
+msgid "Event Properties"
+msgstr "Proprietà evento"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:81
+msgid "Event type:"
+msgstr "Tipo di evento:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:117
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:251
+#: ../src/gui/editors/segment/MarkerEditor.cpp:97
+msgid "Absolute time:"
+msgstr "Tempo assoluto:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:156
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:323
+msgid "Controller name:"
+msgstr "Nome del controller:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:157
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:530
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:562
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:563
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:602
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:631
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:267
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:269
+#: ../src/gui/editors/segment/MarkerEditor.cpp:279
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:272
+#: ../src/gui/studio/AudioMixerWindow.cpp:388
+#: ../src/gui/studio/AudioMixerWindow.cpp:519
+#: ../src/gui/studio/AudioMixerWindow.cpp:683
+#: ../src/gui/studio/AudioMixerWindow.cpp:722
+#: ../src/gui/studio/AudioMixerWindow.cpp:904
+#: ../src/gui/studio/SynthPluginManagerDialog.cpp:121
+msgid "<none>"
+msgstr "<nessuno>"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:174
+msgid "Meta string:"
+msgstr "Meta corda:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:179
+msgid "Load data"
+msgstr "Carica i dati"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:181
+msgid "Save data"
+msgstr "Salva i dati"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:192
+msgid "Notation Properties"
+msgstr "Proprietà di notazione"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:198
+msgid "Lock to changes in performed values"
+msgstr "Blocca i cambiamenti nei valori suonati"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:205
+msgid "Notation time:"
+msgstr "Tempo di notazione:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:217
+msgid "Notation duration:"
+msgstr "Notazione durata:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:283
+msgid "Note pitch:"
+msgstr "Altezza della nota:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:291
+msgid "Note velocity:"
+msgstr "Velocità della nota:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:317
+msgid "Controller number:"
+msgstr "Numero del controller:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:326
+msgid "Controller value:"
+msgstr "Valore del controller:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:354
+msgid "Key pitch:"
+msgstr "Altezza della chiave:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:362
+msgid "Key pressure:"
+msgstr "Pressione tasto:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:390
+msgid "Channel pressure:"
+msgstr "Sensibilità canale:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:418
+msgid "Program change:"
+msgstr "Cambia programma:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:461
+msgid "Data length:"
+msgstr "Lunghezza dei dati:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:462
+msgid "Data:"
+msgstr "Dati:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:480
+msgid "Pitchbend MSB:"
+msgstr "Pitchbend MSB:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:488
+msgid "Pitchbend LSB:"
+msgstr "Pitchbend LSB:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:523
+msgid "Indication:"
+msgstr "Indicazione:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:553
+msgid "Text type:"
+msgstr "Tipo di testo:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:596
+msgid "Clef type:"
+msgstr "Tipo di chiave:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:625
+msgid "Key name:"
+msgstr "Nome della chiave:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:674
+msgid "Unsupported event type:"
+msgstr "Tipo di evento non supportato:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:931
+msgid "Edit Event Time"
+msgstr "Modifica tempo evento"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:943
+msgid "Edit Event Notation Time"
+msgstr "Modifica tempo di notazione evento"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:955
+msgid "Edit Duration"
+msgstr "Modifica Durata"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:968
+msgid "Edit Notation Duration"
+msgstr "Modifica notazione durata"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:981
+msgid "Edit Pitch"
+msgstr "Modifica altezza"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:991
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:1016
+msgid "*.syx|System exclusive files (*.syx)"
+msgstr "*.syx|File esclusivi di sistema (*.syx)"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:992
+msgid "Load System Exclusive data in File"
+msgstr "Carica i dati esclusivi di sistema nel file"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:1017
+msgid "Save System Exclusive data to..."
+msgstr "Salva i dati esclusivi di sistema in..."
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:46
+msgid "Locate audio file"
+msgstr "Localizza file audio"
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:50
+msgid "&Skip"
+msgstr "&Salta"
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:51
+msgid "Skip &All"
+msgstr "S&alta tutto"
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:52
+msgid "&Locate"
+msgstr "&Localizza"
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:57
+msgid ""
+"Can't find file \"%1\".\n"
+"Would you like to try and locate this file or skip it?"
+msgstr ""
+"Non trovo il file \"%1\".\n"
+"Vuoi provare a cercarlo o saltarlo?"
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:71
+msgid ""
+"%1|Requested file (%2)\n"
+"*.wav|WAV files (*.wav)"
+msgstr ""
+"%1|File richiesto(%2)\n"
+"*.wav|file WAV (*.wav)"
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:74
+msgid "Select an Audio File"
+msgstr "Scegli un file audio"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:53 ../src/gui/dialogs/ClefDialog.cpp:62
+#: ../src/gui/dialogs/ClefDialog.cpp:79 ../src/gui/dialogs/ClefDialog.cpp:90
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:278
+msgid "Clef"
+msgstr "Chiave"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:65
+msgid "Existing notes following clef change"
+msgstr "Le note esistenti seguono il cambio di chiave"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:71
+msgid "Lower clef"
+msgstr "Chiave più bassa"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:77
+msgid "Up an Octave"
+msgstr "Su di un'ottava"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:84
+msgid "Down an Octave"
+msgstr "Giù di un'ottava"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:88
+msgid "Higher clef"
+msgstr "Chiave più alta"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:96
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:152
+msgid "Maintain current pitches"
+msgstr "Mantieni le altezze correnti"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:99
+msgid "Transpose into appropriate octave"
+msgstr "Trasponi nell'ottava appropriata"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:231
+msgid "%1 down an octave"
+msgstr "%1 giù di un'ottava"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:234
+msgid "%1 down two octaves"
+msgstr "%1 giù di due ottave"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:237
+msgid "%1 up an octave"
+msgstr "%1 su di un'ottava"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:240
+msgid "%1 up two octaves"
+msgstr "%1 su di due ottave"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:249
+msgid "Treble"
+msgstr "Alti"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:251
+msgid "French violin"
+msgstr "Violino francese"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:253
+msgid "Soprano"
+msgstr "Soprano"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:255
+msgid "Mezzo-soprano"
+msgstr "Mezzosoprano"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:257
+msgid "Alto"
+msgstr "Alto"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:259
+msgid "Tenor"
+msgstr "Tenore"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:261
+msgid "C-baritone"
+msgstr "Baritono in Do"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:263
+msgid "F-baritone"
+msgstr "Baritono in Fa"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:265
+msgid "Bass"
+msgstr "Basso"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:267
+msgid "Sub-bass"
+msgstr "sotto-basso"
+
+#: ../src/gui/dialogs/CountdownDialog.cpp:52
+msgid "Recording..."
+msgstr "Registrazione in corso..."
+
+#: ../src/gui/dialogs/CountdownDialog.cpp:60
+msgid "Recording time remaining: "
+msgstr "Tempo rimanente di registrazione: "
+
+#: ../src/gui/dialogs/CountdownDialog.cpp:120
+msgid "Just how big is your hard disk?"
+msgstr "Quanto è grande il tuo disco fisso?"
+
+#: ../src/gui/dialogs/CountdownDialog.cpp:154
+msgid "Recording beyond end of composition: "
+msgstr "Registrando oltre la fine della composizione: "
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:52
+msgid "Specify Interval"
+msgstr "Specifica intervallo"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:58
+msgid "Reference note:"
+msgstr "Nota di riferimento:"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:59
+msgid "Target note:"
+msgstr "Nota obbiettivo:"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:68
+#: ../src/gui/dialogs/IntervalDialog.cpp:315
+msgid "a perfect unison"
+msgstr "unisono perfetto"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:76
+msgid "Effect on Key"
+msgstr "Effetto sulla tonalità"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:77
+msgid "Transpose within key"
+msgstr "Trasponi nella tonalità"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:79
+msgid "Change key for selection"
+msgstr "Cambia il tasto della selezione"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:89
+msgid ""
+"Adjust segment transposition in opposite direction (maintain audible pitch)"
+msgstr ""
+"Modifica la trasposizione del segmento nella direzione opposta (mantenendo "
+"le altezze udibili)"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:190
+#: ../src/gui/dialogs/IntervalDialog.cpp:220
+msgid "a diminished"
+msgstr "una diminuita"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:192
+#: ../src/gui/dialogs/IntervalDialog.cpp:222
+msgid "an augmented"
+msgstr "una eccedente"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:194
+#: ../src/gui/dialogs/IntervalDialog.cpp:224
+msgid "a doubly diminished"
+msgstr "una più che diminuita"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:196
+#: ../src/gui/dialogs/IntervalDialog.cpp:226
+msgid "a doubly augmented"
+msgstr "una più che eccedente"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:198
+#: ../src/gui/dialogs/IntervalDialog.cpp:228
+msgid "a triply diminished"
+msgstr "una triplamente diminuita"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:200
+#: ../src/gui/dialogs/IntervalDialog.cpp:230
+msgid "a triply augmented"
+msgstr "una triplamente eccedente"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:202
+msgid "a quadruply diminished"
+msgstr "una quadruplamente diminuita"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:204
+#: ../src/gui/dialogs/IntervalDialog.cpp:232
+msgid "a quadruply augmented"
+msgstr "una quadruplamente eccedente"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:206
+#: ../src/gui/dialogs/IntervalDialog.cpp:234
+msgid "a perfect"
+msgstr "una giusta"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:208
+#: ../src/gui/dialogs/IntervalDialog.cpp:236
+msgid "an (unknown, %1)"
+msgstr "una (sconosciuta, %1)"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:216
+msgid "a minor"
+msgstr "una minore"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:218
+msgid "a major"
+msgstr "una maggiore"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:239
+msgid "an (unknown)"
+msgstr "una (sconosciuta)"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:248
+#: ../src/gui/dialogs/IntervalDialog.cpp:251
+msgid "%1 octave"
+msgstr "%1 ottave"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:254
+msgid "%1 unison"
+msgstr "%1 unisono"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:258
+msgid "%1 second"
+msgstr "%1 seconda"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:261
+msgid "%1 third"
+msgstr "%1 terza"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:264
+msgid "%1 fourth"
+msgstr "%1 quarta"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:267
+msgid "%1 fifth"
+msgstr "%1 quinta"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:270
+msgid "%1 sixth"
+msgstr "%1 sesta"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:273
+msgid "%1 seventh"
+msgstr "%1 settima"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:276
+#: ../src/gui/studio/DeviceManagerDialog.cpp:329
+#: ../src/gui/studio/DeviceManagerDialog.cpp:363
+#, c-format
+msgid "%1"
+msgstr "%1"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:287
+msgid ""
+"_n: up 1 octave and %1\n"
+"up %n octaves and %1"
+msgstr ""
+"su 1 ottava e %1\n"
+"su %n ottave e %1"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:291
+#, c-format
+msgid ""
+"_n: up 1 octave\n"
+"up %n octaves"
+msgstr ""
+"su 1 ottava\n"
+"su %n ottave"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:295
+#, c-format
+msgid "up %1"
+msgstr "su %1"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:303
+msgid ""
+"_n: down 1 octave and %1\n"
+"down %n octaves and %1"
+msgstr ""
+"giù 1 ottava e %1\n"
+"giù %n ottave e %1"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:307
+#, c-format
+msgid ""
+"_n: down 1 octave\n"
+"down %n octaves"
+msgstr ""
+"abbassa di 1 ottava\n"
+"abbassa di %n ottave"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:311
+#, c-format
+msgid "down %1"
+msgstr "giù %1"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:81
+msgid "Intrinsics"
+msgstr "Intrinseci"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:85
+msgid "Event type: "
+msgstr "Tipo di evento: "
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:91
+msgid "Absolute time: "
+msgstr "Tempo assoluto: "
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:101
+msgid "Duration: "
+msgstr "Durata: "
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:114
+msgid "Sub-ordering: "
+msgstr "Sotto-ordine: "
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:125
+msgid "Persistent properties"
+msgstr "Proprietà persistenti"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:169
+#: ../src/gui/dialogs/EventEditDialog.cpp:133
+#: ../src/gui/studio/BankEditorDialog.cpp:129
+#: ../src/gui/studio/DeviceEditorDialog.cpp:75
+msgid "Type"
+msgstr "Tipo"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:184
+#: ../src/gui/dialogs/EventEditDialog.cpp:135
+#: ../src/gui/dialogs/EventParameterDialog.cpp:89
+#: ../src/gui/dialogs/EventParameterDialog.cpp:93
+#: ../src/gui/dialogs/EventParameterDialog.cpp:115
+msgid "Value"
+msgstr "Valore"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:155
+msgid "Non-persistent properties"
+msgstr "Proprietà non persistenti"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:156
+msgid "These are cached values, lost if the event is modified."
+msgstr "Ci sono valori memorizzati, si perdono se l'evento viene modificato."
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:170
+msgid "Name "
+msgstr "Nome "
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:172
+msgid "Type "
+msgstr "Tipo "
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:174
+msgid "Value "
+msgstr "Valore "
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:188
+msgid "Make persistent"
+msgstr "Rendi persistente"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:292
+msgid "Delete this property"
+msgstr "Elimina questa proprietà"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:433
+msgid ""
+"Are you sure you want to delete the \"%1\" property?\n"
+"\n"
+"Removing necessary properties may cause unexpected behavior."
+msgstr ""
+"Sei sicuro di voler eliminare la proprietà \"%1\" ?\n"
+"\n"
+"La rimozione di proprietà necessarie può causare comportamenti imprevisti."
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:436
+#: ../src/gui/dialogs/EventEditDialog.cpp:469
+msgid "Edit Event"
+msgstr "Modifica evento"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:465
+msgid ""
+"Are you sure you want to make the \"%1\" property persistent?\n"
+"\n"
+"This could cause problems if it overrides a different computed value later "
+"on."
+msgstr ""
+"Sei sicuro di voler rendere persistente la proprietà \"%1\" ?\n"
+"\n"
+"Questo può causare problemi se si sovrappone a un valore differente più "
+"avanti."
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:470
+msgid "Make &Persistent"
+msgstr "Rendi &persistente"
+
+#: ../src/gui/dialogs/PasteNotationDialog.cpp:52
+msgid "Paste type"
+msgstr "Modo di incollare"
+
+#: ../src/gui/dialogs/PasteNotationDialog.cpp:72
+msgid "Make this the default paste type"
+msgstr "Rendi questo il modo di incollare predefinito"
+
+#: ../src/gui/dialogs/LyricEditDialog.cpp:53
+msgid "Edit Lyrics"
+msgstr "Modifica parole"
+
+#: ../src/gui/dialogs/LyricEditDialog.cpp:62
+msgid "Lyrics for this segment"
+msgstr "Parole per questo segmento"
+
+#: ../src/gui/dialogs/LyricEditDialog.cpp:70
+msgid "Add Verse"
+msgstr "Aggiungi verso"
+
+#: ../src/gui/dialogs/LyricEditDialog.cpp:84
+#: ../src/gui/dialogs/LyricEditDialog.cpp:106
+#, c-format
+msgid "Verse %1"
+msgstr "Verso %1"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:59
+msgid "Import from Device..."
+msgstr "Importa dal dispositivo..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2163
+#: ../src/gui/application/RosegardenGUIApp.cpp:2229
+#: ../src/gui/application/RosegardenGUIApp.cpp:7780
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:87
+#: ../src/sound/AudioFileManager.cpp:664
+#, c-format
+msgid "Cannot download file %1"
+msgstr "Non è possibile scaricare il file %1"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:99
+#, c-format
+msgid "Cannot open file %1"
+msgstr "Impossibile aprire il file '%1'"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:106
+#, c-format
+msgid "No devices found in file %1"
+msgstr "Nessun dispositivo trovato nel file %1"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:113
+msgid "Source device"
+msgstr "Dispositivo sorgente"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:118
+msgid "Import from: "
+msgstr "Importa da: "
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:140
+#: ../src/gui/studio/DeviceEditorDialog.cpp:148
+#, c-format
+msgid "Device %1"
+msgstr "Dispositivo %1"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:155
+msgid "Import banks"
+msgstr "Importa banchi"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:156
+msgid "Import key mappings"
+msgstr "Importa mappature di tastiera"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:157
+msgid "Import controllers"
+msgstr "Importa controller"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:160
+msgid "Import device name"
+msgstr "Importa nome dispositivo"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:166
+msgid "Bank import behavior"
+msgstr "Comportamento importazione banchi"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:168
+msgid "Merge banks"
+msgstr "Inserisci banchi"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:169
+msgid "Overwrite banks"
+msgstr "Sovrascrivi banchi"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:367
+msgid "Bank %1:%2"
+msgstr "Banco %1:%2"
+
+#: ../src/commands/segment/SegmentSplitByRecordingSrcCommand.cpp:42
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:48
+msgid "Split by Recording Source"
+msgstr "Dividi dalla sorgente di registrazione"
+
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:53
+msgid "Recording Source"
+msgstr "Sorgente di registrazione"
+
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:57
+msgid "Channel:"
+msgstr "Canale:"
+
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:64
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:75
+msgid "any"
+msgstr "qualsiasi"
+
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:69
+msgid "Device:"
+msgstr "Dispositivo:"
+
+#: ../src/gui/dialogs/UnusedAudioSelectionDialog.cpp:46
+msgid "Select Unused Audio Files"
+msgstr "Scegli i file audio non usati"
+
+#: ../src/gui/dialogs/UnusedAudioSelectionDialog.cpp:53
+#: ../src/gui/editors/segment/PlayListView.cpp:36
+msgid "File name"
+msgstr "Nome file"
+
+#: ../src/gui/dialogs/UnusedAudioSelectionDialog.cpp:54
+msgid "File size"
+msgstr "Dimensione file"
+
+#: ../src/gui/dialogs/UnusedAudioSelectionDialog.cpp:55
+msgid "Last modified date"
+msgstr "Data ultima modifica"
+
+#: ../src/gui/dialogs/UnusedAudioSelectionDialog.cpp:60
+msgid " (not found) "
+msgstr " (non trovato) "
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:105
+msgid "Audio File Manager"
+msgstr "Gestore file audio"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:126
+msgid ""
+"* Some audio files are encoded at a sample rate different from that of the "
+"JACK audio server.\n"
+"Rosegarden will play them at the correct speed, but they will sound "
+"terrible.\n"
+"Please consider resampling such files externally, or adjusting the sample "
+"rate of the JACK server."
+msgstr ""
+"* Alcuni file audio sono codificati a una frequenza di campionamento diversa "
+"da quella del server audio JACK.\n"
+"Rosegarden li riprodurrà alla velocità giusta, ma saranno terribili.\n"
+"Potresti provare a ricampionarli esternamente, o a modificare la frequenza "
+"del server JACK."
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:132
+msgid "&Add Audio File..."
+msgstr "&Aggiungi file audio..."
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:135
+msgid "&Unload Audio File"
+msgstr "Togli il file audio"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:140
+msgid "&Play Preview"
+msgstr "&Suona Anteprima"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:151
+msgid "&Insert into Selected Audio Track"
+msgstr "&Inserisci nella traccia audio selezionata"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:155
+msgid "Unload &all Audio Files"
+msgstr "Togli tutti i file &audio"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:159
+msgid "Unload all &Unused Audio Files"
+msgstr "Togli tutti i file audio non &usati"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:163
+msgid "&Delete Unused Audio Files..."
+msgstr "Cancella i file audio non usati..."
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:167
+msgid "&Export Audio File..."
+msgstr "&Esporta file audio..."
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:173
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:180
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:91
+msgid "Duration"
+msgstr "Durata"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:181
+msgid "Envelope"
+msgstr "Busta"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:182
+msgid "Sample rate"
+msgstr "Campionamento"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:183
+msgid "Channels"
+msgstr "Canali"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:282
+msgid "<no audio files>"
+msgstr "<nessun file audio>"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:488
+msgid "*.wav|WAV files (*.wav)"
+msgstr "File *.wav|WAV (*.wav)"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:489
+msgid "Choose a name to save this file as"
+msgstr "Scegli un nome per salvare questo file"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:499
+msgid "Exporting audio file..."
+msgstr "Esportazione in corso del file audio..."
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:609
+msgid ""
+"This will unload audio file \"%1\" and remove all associated segments. Are "
+"you sure?"
+msgstr ""
+"Questo vuoterà il file audio \"%1\" e rimuoverà tutti i segmenti associati. "
+"Sei sicuro?"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:692
+msgid ""
+"*.wav|WAV files (*.wav)\n"
+"*.*|All files"
+msgstr ""
+"*.wav|File WAV (*.wav)\n"
+"*.*|Tutti i file"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:697
+msgid ""
+"*.wav *.flac *.ogg *.mp3|Audio files (*.wav *.flac *.ogg *.mp3)\n"
+"*.wav|WAV files (*.wav)\n"
+"*.flac|FLAC files (*.flac)\n"
+"*.ogg|Ogg files (*.ogg)\n"
+"*.mp3|MP3 files (*.mp3)\n"
+"*.*|All files"
+msgstr ""
+"*.wav *.flac *.ogg *.mp3|File audio (*.wav *.flac *.ogg *.mp3)\n"
+"*.wav|File WAV (*.wav)\n"
+"*.flac|File FLAC (*.flac)\n"
+"*.ogg|File Ogg (*.ogg)\n"
+"*.mp3|File MP3 (*.mp3)\n"
+"*.*|Tutti i file"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:704
+msgid "Select one or more audio files"
+msgstr "Scegli uno o più file audio"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:763
+msgid ""
+"This will unload all audio files and remove their associated segments.\n"
+"This action cannot be undone, and associations with these files will be "
+"lost.\n"
+"Files will not be removed from your disk.\n"
+"Are you sure?"
+msgstr ""
+"Questo toglierà tutti i file audio e cancellerà i segmenti associati.\n"
+"L'azione è irreversibile, e le associazioni con questi file verranno perse.\n"
+"I file non verranno rimossi dal disco.\n"
+"Sei sicuro?"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:800
+msgid ""
+"This will unload all audio files that are not associated with any segments "
+"in this composition.\n"
+"This action cannot be undone, and associations with these files will be "
+"lost.\n"
+"Files will not be removed from your disk.\n"
+"Are you sure?"
+msgstr ""
+"Questo toglierà tutti i file audio che non sono associati ad un segmento di "
+"questa composizione.\n"
+"L'azione è irreversibile, e le associazioni con questi file verranno perse.\n"
+"I file non verranno rimossi dal disco.\n"
+"Sei sicuro?"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:865
+msgid ""
+"The following audio files are not used in the current composition.\n"
+"\n"
+"Please select the ones you wish to delete permanently from the hard disk.\n"
+msgstr ""
+"I seguenti file audio non sono usati nella composizione attuale.\n"
+"\n"
+"Scegli quelli che vuoi eliminare definitivamente dal disco fisso.\n"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:875
+#, c-format
+msgid ""
+"_n: <qt>About to delete 1 audio file permanently from the hard disk.<br>This "
+"action cannot be undone, and there will be no way to recover this file."
+"<br>Are you sure?</qt>\n"
+"\n"
+"<qt>About to delete %n audio files permanently from the hard disk.<br>This "
+"action cannot be undone, and there will be no way to recover these files."
+"<br>Are you sure?</qt>"
+msgstr ""
+"<qt>Sto cancellando definitivamente 1 file audio dal disco.<br>L'azione è "
+"irreversibile, e non ci sarà modo di recuperare il file.<br>Sei sicuro?</"
+"qt>\n"
+"<qt>Sto cancellando definitivamente %n file audio dal disco.<br>L'azione è "
+"irreversibile, e non ci sarà modo di recuperare i file.<br>Sei sicuro?</qt>"
+
+#: ../src/document/RosegardenGUIDoc.cpp:525
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:888
+msgid "File %1 could not be deleted."
+msgstr "Il file %1 non può essere cancellato."
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:921
+msgid "Change Audio File label"
+msgstr "Cambia l'etichetta del file audio"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:6466
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:922
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:1099
+msgid "Enter new label"
+msgstr "Inserisci una nuova etichetta"
+
+#: ../src/gui/application/RosegardenGUIView.cpp:1538
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:1086
+msgid "Adding audio file..."
+msgstr "Aggiunta file audio..."
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:1107
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:1112
+msgid "Failed to add audio file. "
+msgstr "Impossibile aggiungere il file audio"
+
+#: ../src/document/RosegardenGUIDoc.cpp:2789
+#: ../src/gui/application/RosegardenGUIApp.cpp:2736
+#: ../src/gui/application/RosegardenGUIView.cpp:1574
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:1122
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:180
+msgid "Generating audio preview..."
+msgstr "Generazione anteprima audio..."
+
+#: ../src/gui/application/RosegardenGUIView.cpp:1581
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:1130
+msgid ""
+"Try copying this file to a directory where you have write permission and re-"
+"add it"
+msgstr ""
+"Prova a copiare questo file in una directory dove hai i diritti di scrittura "
+"e riaggiungilo"
+
+#: ../src/gui/dialogs/TransportDialog.cpp:90 rc.cpp:357
+#, no-c-format
+msgid "Rosegarden Transport"
+msgstr "Trasporto di Rosegarden"
+
+#: ../src/gui/dialogs/TransportDialog.cpp:925
+#: ../src/gui/dialogs/TransportDialog.cpp:985
+msgid "PITCH WHEEL"
+msgstr "ROTELLA DELL'ALTEZZA"
+
+#: ../src/gui/dialogs/TransportDialog.cpp:929
+#: ../src/gui/dialogs/TransportDialog.cpp:989
+msgid "CONTROLLER"
+msgstr "CONTROLLER"
+
+#: ../src/gui/dialogs/TransportDialog.cpp:933
+#: ../src/gui/dialogs/TransportDialog.cpp:993
+msgid "PROG CHNGE"
+msgstr "CAMBIO PROG"
+
+#: ../src/gui/dialogs/TransportDialog.cpp:938
+#: ../src/gui/dialogs/TransportDialog.cpp:998
+msgid "PRESSURE"
+msgstr "PRESSIONE"
+
+#: ../src/gui/dialogs/TransportDialog.cpp:942
+#: ../src/gui/dialogs/TransportDialog.cpp:1002
+msgid "SYS MESSAGE"
+msgstr "MESSAGGIO SIST"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:177
+#: ../src/gui/dialogs/QuantizeDialog.cpp:40
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:127
+msgid "Quantize"
+msgstr "Quantizza"
+
+#: ../src/gui/dialogs/QuantizeDialog.cpp:52
+msgid "Advanced"
+msgstr "Avanzato"
+
+#: ../src/gui/dialogs/ExportDeviceDialog.cpp:42
+msgid "Export Devices..."
+msgstr "Esporta Dispositivi..."
+
+#: ../src/gui/dialogs/ExportDeviceDialog.cpp:47
+msgid "Export devices"
+msgstr "Esporta i dispositivi"
+
+#: ../src/gui/dialogs/ExportDeviceDialog.cpp:49
+msgid "Export all devices"
+msgstr "Esporta tutti i dispositivi"
+
+#: ../src/gui/dialogs/ExportDeviceDialog.cpp:50
+msgid "Export selected device only"
+msgstr "Esporta solo il dispositivo selezionato"
+
+#: ../src/gui/dialogs/ExportDeviceDialog.cpp:51
+msgid " (\"%1\")"
+msgstr " (\"%1\")"
+
+#: ../src/gui/dialogs/CompositionLengthDialog.cpp:44
+msgid "Change Composition Length"
+msgstr "Cambia la lunghezza della composizione"
+
+#: ../src/gui/dialogs/CompositionLengthDialog.cpp:50
+msgid "Set the Start and End bar markers for this Composition"
+msgstr "Imposta i marcatori di inizio e fine battuta per questa composizione"
+
+#: ../src/gui/dialogs/CompositionLengthDialog.cpp:54
+msgid "Start Bar"
+msgstr "Barra di avvio"
+
+#: ../src/gui/dialogs/CompositionLengthDialog.cpp:62
+msgid "End Bar"
+msgstr "Barra di fine"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:62
+msgid "LilyPond Export/Preview"
+msgstr "Esportazione/Anteprima Lilypond"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:85
+msgid "General options"
+msgstr "Opzioni generali"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:90
+msgid "Advanced options"
+msgstr "Opzioni avanzate"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:112
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:95
+msgid "Headers"
+msgstr "Intestazioni"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:106
+msgid "Basic options"
+msgstr "Opzioni di base"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:113
+msgid "Compatibility level"
+msgstr "Livello di compatibilità"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:117
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:118
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:119
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:120
+#, c-format
+msgid "LilyPond %1"
+msgstr "LilyPond %1"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:125
+msgid "Paper size"
+msgstr "Dimensione carta"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:129
+msgid "A3"
+msgstr "A3"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:130
+msgid "A4"
+msgstr "A4"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:131
+msgid "A5"
+msgstr "A5"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:132
+msgid "A6"
+msgstr "A6"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:133
+msgid "Legal"
+msgstr "Legal"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:134
+msgid "US Letter"
+msgstr "US Letter"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:135
+msgid "Tabloid"
+msgstr "Tabloid"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:136
+msgid "do not specify"
+msgstr "non specificare"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:152
+msgid "Font size"
+msgstr "Dimensione font"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:157
+msgid "%1 pt"
+msgstr "%1 pt"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:169
+msgid "Staff level options"
+msgstr "Opzioni del livello del rigo"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:176
+msgid "Export content"
+msgstr "Esporta il contenuto"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:179
+msgid "All tracks"
+msgstr "Tutte le tracce"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:180
+msgid "Non-muted tracks"
+msgstr "Tracce non mute"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:181
+msgid "Selected track"
+msgstr "Tracce selezionate"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:182
+msgid "Selected segments"
+msgstr "Segmenti selezionati"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:188
+msgid "Merge tracks that have the same name"
+msgstr "Fondi le tracce che hanno lo stesso nome"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:198
+msgid "Notation options"
+msgstr "Opzioni della notazione"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:206
+msgid "First"
+msgstr "Primo"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:207
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:538
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:557
+msgid "All"
+msgstr "Tutti"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:211
+msgid "Export tempo marks "
+msgstr "Esporta i marcatori del tempo"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:215
+msgid "Export lyrics"
+msgstr "Esporta le parole"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:225
+msgid "Export beamings"
+msgstr "Esporta collegamenti"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:232
+msgid "Export track staff brackets"
+msgstr "Esporta le parentesi del rigo"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:244
+msgid "Layout options"
+msgstr "Opzioni di visualizzazione"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:257
+msgid "Lyrics alignment"
+msgstr "Allineamento delle parole"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:261
+msgid "Ragged bottom (systems will not be spread vertically across the page)"
+msgstr ""
+"Disallineato (i sistemi non verranno allineati verticalmente nella pagina)"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:267
+msgid "Miscellaneous options"
+msgstr "Opzioni varie"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:274
+msgid "Enable \"point and click\" debugging"
+msgstr "Abilita il debug \"punta e clicca\""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:279
+msgid "Export \\midi block"
+msgstr "Esporta il blocco midi"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:284
+msgid "No markers"
+msgstr "Nessun marcatore"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:285
+msgid "Rehearsal marks"
+msgstr "Marcatori di prova"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:286
+msgid "Marker text"
+msgstr "Testo del marcatore"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:290
+msgid "Export markers"
+msgstr "Esporta i marcatori"
+
+#: ../src/gui/dialogs/AudioSplitDialog.cpp:57
+msgid "Autosplit Audio Segment"
+msgstr "Suddividi automaticamente il segmento audio"
+
+#: ../src/gui/dialogs/AudioSplitDialog.cpp:70
+msgid "AutoSplit Segment \""
+msgstr "Dividi automaticamente il segmento \""
+
+#: ../src/gui/dialogs/AudioSplitDialog.cpp:84
+msgid "Threshold"
+msgstr "Soglia"
+
+#: ../src/gui/dialogs/AudioSplitDialog.cpp:142
+msgid "<no preview generated for this audio file>"
+msgstr "<nessuna anteprima per questo file audio>"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:70
+msgid "Audio Plugin"
+msgstr "Plugin audio"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:94
+#: ../src/gui/widgets/AudioFaderBox.cpp:136
+msgid "Editor"
+msgstr "Editor"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:100
+msgid "Plugin"
+msgstr "Plugin"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:105
+msgid "Category:"
+msgstr "Categoria:"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:110
+msgid "Plugin:"
+msgstr "Plugin:"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:114
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:398
+msgid "Select a plugin from this list."
+msgstr "Seleziona un plugin da questa lista."
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:119
+msgid "Bypass"
+msgstr "Salta"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:121
+msgid "Bypass this plugin."
+msgstr "Salta questo plugin."
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:127
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:390
+msgid "<ports>"
+msgstr "<ports>"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:130
+msgid "Input and output port counts."
+msgstr "Conta le porte input e output."
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:132
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:391
+msgid "<id>"
+msgstr "<id>"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:135
+msgid "Unique ID of plugin."
+msgstr "Unico ID del plugin."
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:149
+msgid "Copy plugin parameters"
+msgstr "Copia i parametri del plugin"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:155
+msgid "Paste plugin parameters"
+msgstr "Incolla i parametri del plugin"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:161
+msgid "Set to defaults"
+msgstr "Imposta come predefinito"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:225
+msgid "(any)"
+msgstr "(qualsiasi)"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:226
+msgid "(unclassified)"
+msgstr "(non classificato)"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:247
+msgid "(none)"
+msgstr "(nessuno)"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:389
+#: ../src/gui/editors/parameters/AudioInstrumentParameterPanel.cpp:132
+#: ../src/gui/editors/parameters/AudioInstrumentParameterPanel.cpp:361
+#: ../src/gui/studio/AudioMixerWindow.cpp:685
+#: ../src/gui/studio/AudioMixerWindow.cpp:724
+#: ../src/gui/studio/AudioMixerWindow.cpp:906
+#: ../src/gui/widgets/AudioFaderBox.cpp:79
+msgid "<no plugin>"
+msgstr "<nessun plugin>"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:427
+msgid "This plugin has too many controls to edit here."
+msgstr "Questo plugin ha troppi controlli da editare."
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:438
+#, c-format
+msgid "Id: %1"
+msgstr "Id: %1"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:490
+msgid "mono"
+msgstr "mono"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:492
+msgid "stereo"
+msgstr "stereo"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:494
+msgid "%1 in, %2 out"
+msgstr "%1 in, %2 out"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:518
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:704
+msgid "Program: "
+msgstr "Programma: "
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:522
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:532
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:708
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:716
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:745
+msgid "<none selected>"
+msgstr "<nessuna selezione>"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:56
+msgid "Set the %1 property of the event selection:"
+msgstr "Seleziona la proprietà %1 dalla selezione eventi:"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:61
+msgid "Pattern"
+msgstr "Motivo"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:66
+msgid "Flat - set %1 to value"
+msgstr "Appiattisci - imposta %1 al valore"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:70
+msgid "Alternating - set %1 to max and min on alternate events"
+msgstr "Alternato - imposta %1 al max e min sugli eventi alternati"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:74
+msgid "Crescendo - set %1 rising from min to max"
+msgstr "Crescendo - imposta %1 crescendo da min a max"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:78
+msgid "Diminuendo - set %1 falling from max to min"
+msgstr "Diminuendo - imposta %1% calando da max a min"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:82
+msgid "Ringing - set %1 alternating from max to min with both dying to zero"
+msgstr "Rintocco - imposta %1 alternando da max a min e sfumando a zero"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:123
+#: ../src/gui/dialogs/EventParameterDialog.cpp:150
+msgid "First Value"
+msgstr "Primo valore"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:124
+#: ../src/gui/dialogs/EventParameterDialog.cpp:151
+msgid "Second Value"
+msgstr "Secondo valore"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:132
+#: ../src/gui/dialogs/EventParameterDialog.cpp:142
+msgid "Low Value"
+msgstr "Valore inferiore"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:133
+#: ../src/gui/dialogs/EventParameterDialog.cpp:141
+msgid "High Value"
+msgstr "Valore superiore"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:56 ../src/gui/rulers/TempoRuler.cpp:127
+msgid "Insert Tempo Change"
+msgstr "Inserisci cambio di ritmo"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:69
+msgid "New tempo:"
+msgstr "Nuovo tempo:"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:76
+msgid "Tap"
+msgstr "Tap"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:81
+msgid "Tempo is fixed until the following tempo change"
+msgstr "Il tempo è fissato fino al prossimo cambio di tempo"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:82
+msgid "Tempo ramps to the following tempo"
+msgstr "Il tempo accelera fino al prossimo tempo"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:83
+msgid "Tempo ramps to:"
+msgstr "Il tempo accelera a:"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:120
+msgid "Time of tempo change"
+msgstr "Momento del cambio di ritmo"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:138
+msgid "The pointer is currently at "
+msgstr "Il puntatore è attualmente in "
+
+#: ../src/gui/dialogs/TempoDialog.cpp:154
+msgid "Apply this tempo from here onwards"
+msgstr "Applica questo ritmo da qui in avanti"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:158
+msgid "Replace the last tempo change"
+msgstr "Sostituisci l'ultimo cambio di ritmo"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:164
+msgid "Apply this tempo from the start of this bar"
+msgstr "Applica questo ritmo dall'inizio della battuta"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:167
+msgid "Apply this tempo to the whole composition"
+msgstr "Applica questo ritmo all'intera composizione"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:172
+msgid "Also make this the default tempo"
+msgstr "Rendi questo anche il ritmo predefinito"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:256
+msgid "%1.%2 s,"
+msgstr "%1.%2,"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:262
+#, c-format
+msgid "at the start of measure %1."
+msgstr "all'inizio della battuta %1."
+
+#: ../src/gui/dialogs/TempoDialog.cpp:266
+#, c-format
+msgid "in the middle of measure %1."
+msgstr "in mezzo alla battuta %1."
+
+#: ../src/gui/dialogs/TempoDialog.cpp:285
+msgid " (at %1.%2 s, in measure %3)"
+msgstr " (a %1.%2, nella battuta %3)"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:302
+msgid "There are no preceding tempo changes."
+msgstr "Non ci sono cambi di ritmo precedenti."
+
+#: ../src/gui/dialogs/TempoDialog.cpp:310
+msgid "There are no other tempo changes."
+msgstr "Non ci sono altri cambi di ritmo."
+
+#: ../src/gui/dialogs/TempoDialog.cpp:328
+msgid " bpm"
+msgstr " bpm"
+
+#: ../src/gui/dialogs/AudioPlayingDialog.cpp:42
+msgid "Playing audio file"
+msgstr "File audio in esecuzione"
+
+#: ../src/gui/dialogs/AudioPlayingDialog.cpp:47
+msgid "Playing audio file \"%1\""
+msgstr "File audio \"%1\" in esecuzione"
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:52
+#: ../src/gui/editors/matrix/MatrixView.cpp:2655
+msgid "Trigger Segment"
+msgstr "Attiva il segmento"
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:61
+msgid "Trigger segment: "
+msgstr "Attiva il segmento: "
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:59
+msgid "Key Change"
+msgstr "Cambio di chiave"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:77
+msgid "Key signature"
+msgstr "Tonalità"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:80
+msgid "Key transposition"
+msgstr "Trasporto di chiave"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:86
+msgid "Existing notes following key change"
+msgstr "Le note esistenti seguono il cambio di chiave"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:98
+msgid "Flatten"
+msgstr "Bemolle"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:100
+msgid "Key"
+msgstr "Chiave"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:105
+msgid "Sharpen"
+msgstr "Diesis"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:109
+msgid "Major"
+msgstr "Maggiore"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:110
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:369
+msgid "Minor"
+msgstr "Minore"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:123
+msgid "Transpose key according to segment transposition"
+msgstr "Trasporta la chiave secondo il trasporto del segmento"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:126
+msgid "Use specified key. Do not transpose"
+msgstr "Usa la chiave specificata. Non trasporre"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:134
+msgid "Apply to current segment only"
+msgstr "Applica solo al segmento corrente"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:137
+msgid "Apply to all segments at this time"
+msgstr "Applica a tutti i segmenti in questo momento"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:141
+msgid "Exclude percussion segments"
+msgstr "Escludi i segmenti di percussioni"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:155
+msgid "Maintain current accidentals"
+msgstr "Mantieni gli accidenti correnti"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:158
+msgid "Transpose into this key"
+msgstr "Trasponi in questa chiave"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:331
+msgid "No such key"
+msgstr "Non c'è questa chiave"
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:44
+#: ../src/gui/editors/notation/NotationSelector.cpp:118
+msgid "Interpret"
+msgstr "Interprete"
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:50
+msgid "Interpretations to apply"
+msgstr "Interpretazioni da applicare"
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:53
+msgid "Apply text dynamics (p, mf, ff etc)"
+msgstr "Applica dinamiche del testo (p, mf, ff ecc)"
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:55
+msgid "Apply hairpin dynamics"
+msgstr "Applica dinamiche a forcina"
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:57
+msgid "Stress beats"
+msgstr "Accentua i battiti"
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:59
+msgid "Articulate slurs, staccato, tenuto etc"
+msgstr "Articola legature, staccato, tenuto, ecc."
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:61
+msgid "All available interpretations"
+msgstr "Tutte le interpretazioni disponibili"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:316
+msgid ""
+"Attempted to launch JACK audio daemon failed. Audio will be disabled.\n"
+"Please check configuration (Settings -> Configure Rosegarden -> Audio -> "
+"Startup)\n"
+" and restart."
+msgstr ""
+"Tentativo fallito di lanciare il demone audio JACK. L'audio sarà "
+"disattivato.\n"
+"Controlla la configurazione (Impostazioni->Configura Rosegarden-> Audio -> "
+"Avvio)\n"
+" e riavvia."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:325
+msgid "Starting sequencer..."
+msgstr "Avvio del sequencer..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:333
+msgid "Initializing plugin manager..."
+msgstr "Inizializzando il gestore dei plugin"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:338
+msgid "Initializing view..."
+msgstr "Inizializzando la vista..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:354
+msgid "Special Parameters"
+msgstr "Parametri speciali"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:430
+msgid "Starting sequence manager..."
+msgstr "Avviando il gestore delle sequenze..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:456
+msgid "Clearing studio data..."
+msgstr "Pulendo i dati dello studio..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:475
+#: ../src/gui/editors/notation/NotationView.cpp:558
+msgid "Starting..."
+msgstr "Avvio in corso..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:556
+msgid "Import Rosegarden &Project file..."
+msgstr "Importa file di &Progetto di Rosegarden..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:560
+msgid "Import &MIDI file..."
+msgstr "Importa file &MIDI..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:564
+msgid "Import &Rosegarden 2.1 file..."
+msgstr "Importa file di &Rosegarden 2.1..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:568
+msgid "Import &Hydrogen file..."
+msgstr "Importa file &Hydrogen..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:572
+msgid "Merge &File..."
+msgstr "Inserisci &File..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:576
+msgid "Merge &MIDI file..."
+msgstr "Inserisci file &MIDI..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:580
+msgid "Merge &Rosegarden 2.1 file..."
+msgstr "Inserisci file di &Rosegarden 2.1..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:584
+msgid "Merge &Hydrogen file..."
+msgstr "Inserisci file &Hydrogen..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:588
+msgid "Export Rosegarden &Project file..."
+msgstr "Esporta file di &Progetto di Rosegarden... "
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:592
+msgid "Export &MIDI file..."
+msgstr "Esporta file &MIDI..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:596
+msgid "Export &LilyPond file..."
+msgstr "Esporta file &Lilypond..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:600
+msgid "Export Music&XML file..."
+msgstr "Esporta file Music&XML..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:604
+msgid "Export &Csound score file..."
+msgstr "Esporta file &Csound..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:608
+msgid "Export M&up file..."
+msgstr "Esporta file M&up..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:612
+#: ../src/gui/editors/notation/NotationView.cpp:1500
+msgid "Print &with LilyPond..."
+msgstr "Stampa con Lilypond..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:616
+#: ../src/gui/editors/notation/NotationView.cpp:1504
+msgid "Preview with Lil&yPond..."
+msgstr "Anteprima con Lilypond..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:620
+msgid "Play&list"
+msgstr "Play&list"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:627
+msgid "Rosegarden &Tutorial"
+msgstr "&Tutorial di Rosegarden"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:631
+msgid "&Bug Reporting Guidelines"
+msgstr "Linee-guida per comunicare un &Bug"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:645
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:348
+#: ../src/gui/editors/segment/MarkerEditor.cpp:378
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:388
+#: ../src/gui/general/EditViewBase.cpp:190
+#: ../src/gui/studio/BankEditorDialog.cpp:318
+#: ../src/gui/studio/DeviceManagerDialog.cpp:227
+msgid "Und&o"
+msgstr "&Annulla"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:651
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:354
+#: ../src/gui/editors/segment/MarkerEditor.cpp:384
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:394
+#: ../src/gui/general/EditViewBase.cpp:196
+#: ../src/gui/studio/BankEditorDialog.cpp:324
+#: ../src/gui/studio/DeviceManagerDialog.cpp:233
+msgid "Re&do"
+msgstr "Ri&fai"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:665
+#: ../src/gui/editors/notation/NotationView.cpp:2297
+msgid "Show T&ools Toolbar"
+msgstr "Mostra Barra degli St&rumenti"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:669
+msgid "Show Trac&ks Toolbar"
+msgstr "Mostra Barra delle Tra&cce"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:673
+msgid "Show &Editors Toolbar"
+msgstr "Mostra Barra dell'&Editor"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:677
+#: ../src/gui/editors/notation/NotationView.cpp:2309
+msgid "Show Trans&port Toolbar"
+msgstr "Mostra la barra degli strumenti di Tras&porto"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:681
+msgid "Show &Zoom Toolbar"
+msgstr "Mostra la barra degli strumenti per l'i&ngrandimento"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:688
+msgid "Show Tra&nsport"
+msgstr "Mostra Tra&sporto"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:693
+msgid "Show Track &Labels"
+msgstr "Mostra le etichette de&lle tracce"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:698
+msgid "Show Playback Position R&uler"
+msgstr "Mostra Indicatore di Posizione della Riproduzione"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:703
+msgid "Show Te&mpo Ruler"
+msgstr "Mostra Indicatore del rit&mo"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:708
+msgid "Show Cho&rd Name Ruler"
+msgstr "Mostra Indicatore Nome Accordi"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:714
+msgid "Show Segment Pre&views"
+msgstr "Mostra Anteprime del Segmento"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:719
+msgid "Show Special &Parameters"
+msgstr "Mostra &Parametri speciali"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:753
+#: ../src/gui/editors/matrix/MatrixView.cpp:641
+#: ../src/gui/editors/notation/NotationView.cpp:1772
+msgid "&Select and Edit"
+msgstr "&Seleziona e modifica"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:758
+#: ../src/gui/editors/matrix/MatrixView.cpp:646
+msgid "&Draw"
+msgstr "&Disegna"
+
+#: ../src/commands/edit/EraseCommand.h:50
+#: ../src/gui/application/RosegardenGUIApp.cpp:763
+#: ../src/gui/editors/matrix/MatrixView.cpp:651
+#: ../src/gui/editors/notation/NotationView.cpp:1766
+msgid "&Erase"
+msgstr "Canc&ella"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:768
+#: ../src/gui/editors/matrix/MatrixView.cpp:656
+msgid "&Move"
+msgstr "&Sposta"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:775
+msgid "&Resize"
+msgstr "&Ridimensiona"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:782 rc.cpp:87
+#, no-c-format
+msgid "&Split"
+msgstr "&Dividi"
+
+#: ../src/commands/segment/SegmentJoinCommand.h:53
+#: ../src/gui/application/RosegardenGUIApp.cpp:789
+msgid "&Join"
+msgstr "&Unisci"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:795
+msgid "&Harmonize"
+msgstr "&Armonizza"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:806
+#: ../src/gui/rulers/TempoRuler.cpp:157
+msgid "Open Tempo and Time Signature Editor"
+msgstr "Apri l'editor di Tempo e di Metro"
+
+#: ../src/commands/segment/CutRangeCommand.cpp:41
+#: ../src/gui/application/RosegardenGUIApp.cpp:812
+msgid "Cut Range"
+msgstr "Taglia intervallo"
+
+#: ../src/commands/edit/CopyCommand.cpp:73
+#: ../src/gui/application/RosegardenGUIApp.cpp:816
+msgid "Copy Range"
+msgstr "Copia intervallo"
+
+#: ../src/commands/segment/PasteRangeCommand.cpp:45
+#: ../src/gui/application/RosegardenGUIApp.cpp:820
+msgid "Paste Range"
+msgstr "Incolla intervallo"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:828
+msgid "Insert Range..."
+msgstr "Inserisci intervallo..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:832
+#: ../src/gui/editors/notation/NotationView.cpp:1804
+msgid "De&lete"
+msgstr "E&limina"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:836
+msgid "Select &All Segments"
+msgstr "Seleziona T&utti i Segmenti"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:852
+msgid "Edit Mar&kers..."
+msgstr "Modifica mar&catori..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:856
+msgid "Edit Document P&roperties..."
+msgstr "Modifica P&roprietà Documento..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:864
+msgid "Open in &Default Editor"
+msgstr "Apri nell'editor pre&definito"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:870
+#: ../src/gui/general/EditViewBase.cpp:206
+msgid "Open in Matri&x Editor"
+msgstr "Apri nell'editor di matri&ce"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:876
+#: ../src/gui/general/EditViewBase.cpp:212
+msgid "Open in &Percussion Matrix Editor"
+msgstr "Apri nell'editor di matrice &Percussioni"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:882
+#: ../src/gui/general/EditViewBase.cpp:218
+msgid "Open in &Notation Editor"
+msgstr "Apri nell'editor di notazione"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:888
+#: ../src/gui/general/EditViewBase.cpp:224
+msgid "Open in &Event List Editor"
+msgstr "Apri nell'editor della lista degli &eventi"
+
+#: ../src/commands/edit/EventQuantizeCommand.cpp:120
+#: ../src/commands/edit/EventUnquantizeCommand.cpp:87
+#: ../src/gui/application/RosegardenGUIApp.cpp:894
+msgid "&Quantize..."
+msgstr "&Quantizza..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:908
+#: ../src/gui/editors/matrix/MatrixView.cpp:686
+msgid "Repeat Last Quantize"
+msgstr "Ripeti l'ultima quantizzazione"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:928
+msgid "Split at Time..."
+msgstr "Dividi al tempo..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:932
+#: ../src/gui/general/EditView.cpp:796
+msgid "Jog &Left"
+msgstr "Avanza a &sinistra"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:936
+#: ../src/gui/general/EditView.cpp:800
+msgid "Jog &Right"
+msgstr "Avanza a &destra"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:940
+msgid "Set Start Time..."
+msgstr "Imposta il tempo d'inizio..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:944
+msgid "Set Duration..."
+msgstr "Imposta Durata..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:953
+msgid "Turn Re&peats into Copies"
+msgstr "Trasforma Rip&etizioni in Copie"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:958
+msgid "Manage Tri&ggered Segments"
+msgstr "Gestisci Se&gmenti attivati"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:962
+msgid "Set Tempos from &Beat Segment"
+msgstr "Imposta i ritmi dal Segmento del &Battito"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:966
+msgid "Set &Tempo to Audio Segment Duration"
+msgstr "Imposta il &ritmo alla Durata Segmento Audio"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:972
+msgid "Manage A&udio Files"
+msgstr "Gestisci i file A&udio"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:977
+msgid "Show Segment Labels"
+msgstr "Mostra etichette dei segmenti"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:986
+msgid "Add &Track"
+msgstr "Aggiungi &Traccia"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:990
+msgid "&Add Tracks..."
+msgstr "&Aggiungi tracce..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:996
+msgid "D&elete Track"
+msgstr "&Elimina Traccia"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1002
+msgid "Move Track &Down"
+msgstr "&Abbassa le tracce"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1008
+msgid "Move Track &Up"
+msgstr "A&lza le tracce"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1012
+msgid "Select &Next Track"
+msgstr "Seleziona Traccia &Successiva"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1017
+msgid "Select &Previous Track"
+msgstr "Seleziona Traccia &Precedente"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1022
+msgid "Mute or Unmute Track"
+msgstr "Zittisci o riattiva la traccia"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1027
+msgid "Arm or Un-arm Track for Record"
+msgstr "Abilita o inabilita la traccia per la registrazione"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1034
+msgid "&Mute all Tracks"
+msgstr "&Zittisci tutte le tracce"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1040
+msgid "&Unmute all Tracks"
+msgstr "&Riattiva tutte le tracce"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1044
+msgid "&Remap Instruments..."
+msgstr "&Rimappa gli Strumenti..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1053
+msgid "&Audio Mixer"
+msgstr "Mixer &Audio"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1059
+msgid "Midi Mi&xer"
+msgstr "Mixer M&IDI"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1065
+msgid "Manage MIDI &Devices"
+msgstr "Gestisci &Dispositivi MIDI"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1071
+msgid "Manage S&ynth Plugins"
+msgstr "Gestisci Plugin &Sintetizzatore"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1075
+msgid "Modify MIDI &Filters"
+msgstr "Modifica &Filtri MIDI"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1079
+msgid "MIDI Thru Routing"
+msgstr "MIDI Thru Routing"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1085
+msgid "Manage &Metronome"
+msgstr "Gestisci &Metronomo"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1089
+msgid "&Save Current Document as Default Studio"
+msgstr "&Salva il documento corrente come studio predefinito"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1093
+msgid "&Import Default Studio"
+msgstr "&Importa studio predefinito"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1097
+msgid "Im&port Studio from File..."
+msgstr "Im&porta studio da file..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1101
+msgid "&Reset MIDI Network"
+msgstr "Azze&ra la rete MIDI"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1105
+msgid "Set Quick Marker at Playback Position"
+msgstr "Inserisci un marcatore immediato nella posizione di riproduzione"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1109
+msgid "Jump to Quick Marker"
+msgstr "Salta al marcatore immediato"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1142
+#: ../src/gui/editors/matrix/MatrixView.cpp:782
+#: ../src/gui/editors/notation/NotationView.cpp:2397
+#: ../src/gui/studio/AudioMixerWindow.cpp:105
+#: ../src/gui/studio/MidiMixerWindow.cpp:81
+msgid "&Play"
+msgstr "&Riproduci"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1153
+#: ../src/gui/editors/matrix/MatrixView.cpp:791
+#: ../src/gui/editors/notation/NotationView.cpp:2406
+#: ../src/gui/studio/AudioMixerWindow.cpp:114
+#: ../src/gui/studio/MidiMixerWindow.cpp:90
+msgid "&Stop"
+msgstr "&Interrompi"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1160
+#: ../src/gui/editors/matrix/MatrixView.cpp:802
+#: ../src/gui/editors/notation/NotationView.cpp:2417
+#: ../src/gui/studio/AudioMixerWindow.cpp:125
+#: ../src/gui/studio/MidiMixerWindow.cpp:101
+msgid "&Fast Forward"
+msgstr "&Avanti veloce"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1168
+#: ../src/gui/editors/matrix/MatrixView.cpp:796
+#: ../src/gui/editors/notation/NotationView.cpp:2411
+#: ../src/gui/studio/AudioMixerWindow.cpp:119
+#: ../src/gui/studio/MidiMixerWindow.cpp:95
+msgid "Re&wind"
+msgstr "Ria&vvolgi"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1175
+msgid "P&unch in Record"
+msgstr "&Metti nel Registro"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1182
+#: ../src/gui/studio/AudioMixerWindow.cpp:143
+#: ../src/gui/studio/MidiMixerWindow.cpp:119
+msgid "&Record"
+msgstr "&Registra"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1189
+#: ../src/gui/editors/matrix/MatrixView.cpp:808
+#: ../src/gui/editors/notation/NotationView.cpp:2423
+#: ../src/gui/studio/AudioMixerWindow.cpp:131
+#: ../src/gui/studio/MidiMixerWindow.cpp:107
+msgid "Rewind to &Beginning"
+msgstr "Riavvolgi all'&inizio"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1196
+#: ../src/gui/editors/matrix/MatrixView.cpp:814
+#: ../src/gui/editors/notation/NotationView.cpp:2429
+#: ../src/gui/studio/AudioMixerWindow.cpp:137
+#: ../src/gui/studio/MidiMixerWindow.cpp:113
+msgid "Fast Forward to &End"
+msgstr "Avanti veloce alla fin&e"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1203
+#: ../src/gui/editors/matrix/MatrixView.cpp:832
+#: ../src/gui/editors/notation/NotationView.cpp:2447
+msgid "Scro&ll to Follow Playback"
+msgstr "Scorri per seguire il suono"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1209
+#: ../src/gui/editors/matrix/MatrixView.cpp:838
+#: ../src/gui/editors/notation/NotationView.cpp:2453
+#: ../src/gui/studio/AudioMixerWindow.cpp:149
+#: ../src/gui/studio/MidiMixerWindow.cpp:125
+msgid "Panic"
+msgstr "Panico"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1213
+msgid "Segment Debug Dump "
+msgstr "Segment Debug Dump "
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1283
+msgid " Zoom: "
+msgstr " Ingrandimento: "
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1719
+msgid "File \"%1\" does not exist"
+msgstr "Il file \"%1\" non esiste"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1725
+msgid "File \"%1\" is actually a directory"
+msgstr "Il file \"%1\" è una directory"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1734
+msgid "You do not have read permission for \"%1\""
+msgstr "Non hai i permessi di lettura per \"%1\""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1802
+msgid ""
+"An auto-save file for this document has been found\n"
+"Do you want to open it instead ?"
+msgstr ""
+"È stato trovato un file auto-salvato per questo documento.\n"
+"Vuoi aprire questo?"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1896
+msgid "Example Files"
+msgstr "File di esempio"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2100
+msgid "Opening a new application window..."
+msgstr "Apertura nuova finestra applicazione..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2110
+msgid "Creating new document..."
+msgstr "Creazione nuovo documento in corso..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2154
+#, c-format
+msgid ""
+"Malformed URL\n"
+"%1"
+msgstr ""
+"URL mal definito\n"
+"%1"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2179
+#: ../src/gui/application/RosegardenGUIApp.cpp:2240
+msgid "Opening file..."
+msgstr "Apertura file in corso..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2201
+#: ../src/gui/application/RosegardenGUIApp.cpp:2220
+msgid "Open File"
+msgstr "Apri file"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1225
+#: ../src/gui/application/RosegardenGUIApp.cpp:2258
+msgid "Saving file..."
+msgstr "Salvataggio file in corso..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2330
+msgid "This is not a valid filename.\n"
+msgstr "Questo non è un nome di file valido.\n"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2335
+msgid "This is not a local file.\n"
+msgstr "Questo non è un file locale.\n"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2342
+#: ../src/gui/studio/BankEditorDialog.cpp:1640
+#: ../src/gui/studio/DeviceManagerDialog.cpp:787
+msgid "You have specified a directory"
+msgstr "Hai specificato una directory."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2348
+#: ../src/gui/studio/BankEditorDialog.cpp:1646
+#: ../src/gui/studio/DeviceManagerDialog.cpp:793
+msgid "The specified file exists. Overwrite?"
+msgstr "Il file specificato esiste. Sovrascrivere?"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2362
+msgid "Saving file with a new filename..."
+msgstr "Salvataggio file con nuovo nome in corso..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2364
+msgid "Rosegarden files"
+msgstr "File di Rosegarden"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2365
+#: ../src/gui/application/RosegardenGUIApp.cpp:4860
+#: ../src/gui/application/RosegardenGUIApp.cpp:4904
+#: ../src/gui/application/RosegardenGUIApp.cpp:4942
+#: ../src/gui/application/RosegardenGUIApp.cpp:4975
+#: ../src/gui/application/RosegardenGUIApp.cpp:5009
+#: ../src/gui/application/RosegardenGUIApp.cpp:5116
+msgid "All files"
+msgstr "Tutti i file"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2366
+msgid "Save as..."
+msgstr "Salva come..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2404
+msgid "Closing file..."
+msgstr "Chiusura file in corso..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2421
+#: ../src/gui/editors/notation/NotationView.cpp:4618
+msgid "Printing..."
+msgstr "Stampa in corso..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2433
+#: ../src/gui/editors/notation/NotationView.cpp:4635
+msgid "Previewing..."
+msgstr "Anteprime in corso..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2440
+msgid "Exiting..."
+msgstr "Uscita in corso..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2463
+msgid "Cutting selection..."
+msgstr "Taglio della selezione in corso..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2474
+#: ../src/gui/editors/matrix/MatrixView.cpp:1614
+#: ../src/gui/editors/notation/NotationView.cpp:4763
+msgid "Copying selection to clipboard..."
+msgstr "Copia in corso della selezione negli appunti..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2484
+#: ../src/gui/editors/eventlist/EventView.cpp:878
+#: ../src/gui/editors/matrix/MatrixView.cpp:1625
+#: ../src/gui/editors/notation/NotationView.cpp:4796
+#: ../src/gui/editors/notation/NotationView.cpp:4841
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:352
+msgid "Clipboard is empty"
+msgstr "Gli appunti sono vuoti"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2487
+#: ../src/gui/editors/eventlist/EventView.cpp:882
+#: ../src/gui/editors/matrix/MatrixView.cpp:1629
+#: ../src/gui/editors/notation/NotationView.cpp:4804
+#: ../src/gui/editors/notation/NotationView.cpp:4845
+msgid "Inserting clipboard contents..."
+msgstr "Inserimento del contenuto degli appunti in corso..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2556
+msgid "Duration of empty range to insert"
+msgstr "Durata della intervallo vuoto da inserire"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2631
+msgid "This function needs no more than one segment to be selected."
+msgstr "Per questa funzione bisogna selezionare non più di un segmento."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2654
+msgid "Can't join Audio segments"
+msgstr "Non posso unire segmenti audio"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2707
+msgid "rescaling an audio file"
+msgstr "riscalando un file audio"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2723
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:172
+msgid "Rescaling audio file..."
+msgstr "RIscalando il file audio..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2767
+msgid ""
+"The audio file path does not exist or is not writable.\n"
+"You must set the audio file path to a valid directory in Document Properties "
+"before %1.\n"
+"Would you like to set it now?"
+msgstr ""
+"Il percorso del file audio non esiste o non è scrivibile.\n"
+"Devi impostare il percorso del file audio su una directory valida nelle\n"
+"Proprietà del documento prima %1.\n"
+"Vuoi impostarlo adesso?"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2769
+#: ../src/gui/application/RosegardenGUIApp.cpp:5291
+#: ../src/gui/application/RosegardenGUIApp.cpp:5339
+#: ../src/gui/editors/segment/TrackButtons.cpp:419
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:159
+msgid "Set audio file path"
+msgstr "Imposta percorso del file audio"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2833
+msgid "Jog Selection"
+msgstr "Spingi la selezione"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2978
+#, c-format
+msgid ""
+"_n: Split Segment at Time\n"
+"Split %n Segments at Time"
+msgstr ""
+"Dividi il segmento al tempo\n"
+"Dividi %n segmenti al tempo"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3013
+#: ../src/gui/general/EditViewBase.cpp:619
+msgid "Segment Start Time"
+msgstr "Tempo d'inizio del segmento"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3023
+msgid "Set Segment Start Times"
+msgstr "Imposta i tempi d'inizio del segmento"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3024
+#: ../src/gui/general/EditViewBase.cpp:626
+msgid "Set Segment Start Time"
+msgstr "Imposta il tempo d'inizio del segmento"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3056
+#: ../src/gui/general/EditViewBase.cpp:644
+msgid "Segment Duration"
+msgstr "Durata del segmento"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3068
+msgid "Set Segment Durations"
+msgstr "Imposta le durate del segmento"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3069
+#: ../src/gui/general/EditViewBase.cpp:652
+msgid "Set Segment Duration"
+msgstr "Imposta la durata del segmento"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3176
+#: ../src/gui/application/RosegardenGUIApp.cpp:5875
+msgid "Set Global Tempo"
+msgstr "Imposta il ritmo globale"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3234
+#: ../src/gui/general/EditViewBase.cpp:477
+msgid "Toggle the toolbar..."
+msgstr "Mostra/Nascondi la barra..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3244
+msgid "Toggle the tools toolbar..."
+msgstr "Mostra/Nascondi la barra degli strumenti..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3254
+msgid "Toggle the tracks toolbar..."
+msgstr "Mostra/Nascondi la barra delle tracce..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3264
+msgid "Toggle the editor toolbar..."
+msgstr "Mostra/Nascondi la barra dell'editor..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3274
+msgid "Toggle the transport toolbar..."
+msgstr "Mostra/Nascondi la barra del trasporto..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3284
+msgid "Toggle the zoom toolbar..."
+msgstr "Mostra/Nascondi la barra di zoom..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3294
+msgid "Toggle the Transport"
+msgstr "Abilita/Disabilita il Trasporto"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3377
+#: ../src/gui/general/EditViewBase.cpp:487
+msgid "Toggle the statusbar..."
+msgstr "Mostra/Nascondi la barra di stato..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3434
+msgid ""
+"The join tool isn't implemented yet. Instead please highlight the segments "
+"you want to join and then use the menu option:\n"
+"\n"
+" Segments->Collapse Segments.\n"
+msgstr ""
+"Lo strumento unione non è ancora implementato. Puoi comunque selezionare i "
+"segmenti da unire e usare l'opzione del menu:\n"
+"\n"
+" Segmenti->Unisci Segmenti.\n"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3437
+msgid "Join tool not yet implemented"
+msgstr "Strumento unione non ancora implementato."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3675
+msgid "Revert modified document to previous saved version?"
+msgstr "Riportare il documento modificato alla versione precedente?"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3691
+msgid ""
+"*.rgp|Rosegarden Project files\n"
+"*|All files"
+msgstr ""
+"*.rgp|file di progetto Rosegarden\n"
+"*|Tutti i file"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3692
+msgid "Import Rosegarden Project File"
+msgstr "Importa file di progetto di Rosegarden"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3717
+msgid "Failed to import project file \"%1\""
+msgstr "Non riesco a importare il file di progetto \"%1\""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3739
+msgid "Open MIDI File"
+msgstr "Apri file MIDI"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3756
+msgid "Merge MIDI File"
+msgstr "Inserisci file MIDI"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3866
+msgid "Importing MIDI file..."
+msgstr "Importazione in corso del file MIDI..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3903
+msgid "Calculating notation..."
+msgstr "Calcolando la notazione..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3950
+msgid "Calculate Notation"
+msgstr "Calcola la notazione"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3991
+#: ../src/gui/application/RosegardenGUIApp.cpp:4008
+msgid ""
+"*.rose|Rosegarden-2 files\n"
+"*|All files"
+msgstr ""
+"*.rose|Rosegarden-2 file\n"
+"*|Tutti i file"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3992
+#: ../src/gui/application/RosegardenGUIApp.cpp:4009
+msgid "Open Rosegarden 2.1 File"
+msgstr "Apri il file di Rosegarden 2.1"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4026
+msgid "Importing Rosegarden 2.1 file..."
+msgstr "Importazione in corso del file di Rosegarden 2.1..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4052
+msgid "Can't load Rosegarden 2.1 file. It appears to be corrupted."
+msgstr "Non posso caricare il file di Rosegarden 2.1. Sembra danneggiato."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4078
+#: ../src/gui/application/RosegardenGUIApp.cpp:4095
+msgid ""
+"*.h2song|Hydrogen files\n"
+"*|All files"
+msgstr ""
+"*.h2song|Hydrogen file\n"
+"*|Tutti i file"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4079
+#: ../src/gui/application/RosegardenGUIApp.cpp:4096
+msgid "Open Hydrogen File"
+msgstr "Apri un file Hydrogen"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4113
+msgid "Importing Hydrogen file..."
+msgstr "Importazione in corso del file Hydrogen..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4139
+msgid "Can't load Hydrogen file. It appears to be corrupted."
+msgstr "Non posso caricare il file di Hydrogen. Sembra danneggiato."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4527
+msgid "Export and import of Rosegarden Project files"
+msgstr "Esporta e importa i file di progetto di Rosegarden"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4529
+msgid "The Rosegarden Project Packager helper script"
+msgstr "Script di aiuto per il Rosegarden Project Packager"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4533
+msgid "%1 - for project file support"
+msgstr "%1 - per supporto ai file di progetto"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4550
+msgid "The Rosegarden LilyPondView helper script"
+msgstr "Script di aiuto per il visualizzatore LilyPond di Rosegarden"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4554
+msgid "%1 - for LilyPond preview support"
+msgstr "%1 - per il supporto all'anteprima di LilyPond"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4570
+msgid "The Rosegarden Audio File Importer helper script"
+msgstr "Script di aiuto per l'importazione di file audio in Rosegarden"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4574
+msgid "%1 - for audio file import"
+msgstr "%1 - per l'importazione di file audio"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4585
+msgid ""
+"<h3>Helper programs not found</h3><p>Rosegarden could not find one or more "
+"helper programs which it needs to provide some features. The following "
+"features will not be available:</p>"
+msgstr ""
+"<h3>Programmi di aiuto non trovati</h3><p>Rosegarden non trova uno o più "
+"programmi di aiuto di cui ha bisogno. Le seguenti caratteristiche non "
+"saranno disponibili:<p>"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4586
+#: ../src/gui/application/RosegardenGUIApp.cpp:4592
+msgid "<ul>"
+msgstr "<ul>"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4588
+#: ../src/gui/application/RosegardenGUIApp.cpp:4594
+msgid "<li>%1</li>"
+msgstr "<li>%1</li>"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4590
+#: ../src/gui/application/RosegardenGUIApp.cpp:4596
+msgid "</ul>"
+msgstr "</ul>"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4591
+msgid ""
+"<p>To fix this, you should install the following additional programs:</p>"
+msgstr "<p>Per sistemare questo, dovresti installare i seguenti programmi:</p>"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4603
+msgid "Helper programs not found"
+msgstr "Programmi di aiuto non trovati"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4686
+msgid "Starting the sequencer..."
+msgstr "Avvio del sequencer..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4712
+msgid "Couldn't start the sequencer"
+msgstr "Non posso avviare il sequencer"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4789
+msgid "Clearing down jackd..."
+msgstr "Sto liberando jackd..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4803
+msgid "Starting jackd..."
+msgstr "Sto avviando jackd..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4842
+msgid ""
+"The Rosegarden sequencer process has exited unexpectedly. Sound and "
+"recording will no longer be available for this session.\n"
+"Please exit and restart Rosegarden to restore sound capability."
+msgstr ""
+"Il processo del sequencer di Rosegarden è terminato inaspettatamente.\n"
+"In questa sessione non sarà possibile suonare e registrare.\n"
+"Prova a chiudere e riavviare Rosegarden per ripristinare il suono."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4846
+msgid ""
+"The Rosegarden sequencer could not be started, so sound and recording will "
+"be unavailable for this session.\n"
+"For assistance with correct audio and MIDI configuration, go to http://"
+"rosegardenmusic.com."
+msgstr ""
+"Il sequencer di Rosegarden non può essere avviato, quindi non sarà possibile "
+"suonare o registrare in questa sessione.\n"
+"Per assistenza sulla corretta configurazione audio e MIDI vai su http://"
+"rosegardenmusic.com."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4856
+msgid "Exporting Rosegarden Project file..."
+msgstr "Esportazione in corso del file di progetto di Rosegarden..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4859
+msgid "Rosegarden Project files\n"
+msgstr "File di progetto di Rosegarden\n"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4861
+#: ../src/gui/application/RosegardenGUIApp.cpp:4905
+#: ../src/gui/application/RosegardenGUIApp.cpp:4943
+#: ../src/gui/application/RosegardenGUIApp.cpp:4976
+#: ../src/gui/application/RosegardenGUIApp.cpp:5010
+#: ../src/gui/application/RosegardenGUIApp.cpp:5116
+msgid "Export as..."
+msgstr "Esporta come..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4875
+#, c-format
+msgid "Saving Rosegarden file to package failed: %1"
+msgstr "Fallito il salvataggio del file di Rosegarden al pacchetto: %1"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4889
+msgid "Failed to export to project file \"%1\""
+msgstr "Fallita l'esportazione al file di progetto \"%1\""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4900
+#: ../src/gui/application/RosegardenGUIApp.cpp:4915
+msgid "Exporting MIDI file..."
+msgstr "Esportazione in corso del file MIDI..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4903
+msgid "Standard MIDI files\n"
+msgstr "File MIDI standard\n"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4934
+#: ../src/gui/application/RosegardenGUIApp.cpp:4966
+#: ../src/gui/application/RosegardenGUIApp.cpp:4999
+#: ../src/gui/application/RosegardenGUIApp.cpp:5103
+#: ../src/gui/application/RosegardenGUIApp.cpp:5140
+#: ../src/gui/editors/notation/NotationView.cpp:4733
+msgid "Export failed. The file could not be opened for writing."
+msgstr "Esportazione fallita. Il file non può essere aperto per la scrittura."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4940
+#: ../src/gui/application/RosegardenGUIApp.cpp:4952
+msgid "Exporting Csound score file..."
+msgstr "Esportazione in corso del file Csound..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4972
+#: ../src/gui/application/RosegardenGUIApp.cpp:4985
+msgid "Exporting Mup file..."
+msgstr "Esportazione in corso del file Mup..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4975
+msgid "Mup files\n"
+msgstr "File Mup\n"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5005
+#: ../src/gui/application/RosegardenGUIApp.cpp:5089
+#: ../src/gui/editors/notation/NotationView.cpp:4719
+msgid "Exporting LilyPond file..."
+msgstr "Esportazione del file Lilypond..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5008
+msgid "LilyPond files"
+msgstr "File di Lilypond"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5023
+#: ../src/gui/editors/notation/NotationView.cpp:4653
+msgid "Printing LilyPond file..."
+msgstr "Stampa del file Lilypond..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5028
+#: ../src/gui/application/RosegardenGUIApp.cpp:5052
+#: ../src/gui/editors/notation/NotationView.cpp:4658
+#: ../src/gui/editors/notation/NotationView.cpp:4682
+msgid "Failed to open a temporary file for LilyPond export."
+msgstr ""
+"Apertura non riuscita di un file temporaneo per l'esportazione Lilypond."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5047
+#: ../src/gui/editors/notation/NotationView.cpp:4677
+msgid "Previewing LilyPond file..."
+msgstr "Anteprima del file Lilypond..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5080
+#: ../src/gui/editors/notation/NotationView.cpp:4710
+msgid "LilyPond Preview Options"
+msgstr "Opzioni dell'Anteprima Lilypond"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5081
+#: ../src/gui/editors/notation/NotationView.cpp:4711
+msgid "LilyPond preview options"
+msgstr "Opzioni dell'anteprima Lilypond"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5112
+#: ../src/gui/application/RosegardenGUIApp.cpp:5126
+msgid "Exporting MusicXML file..."
+msgstr "Esportazione in corso del file MusicXML..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5115
+msgid "XML files"
+msgstr "File XML"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5289
+#: ../src/gui/editors/segment/TrackButtons.cpp:417
+msgid ""
+"The audio file path does not exist or is not writable.\n"
+"Please set the audio file path to a valid directory in Document Properties "
+"before recording audio.\n"
+"Would you like to set it now?"
+msgstr ""
+"Il percorso del file audio non esiste o non è scrivibile.\n"
+"Prova a impostare il percorso del file audio su una directory valida nelle\n"
+"Proprietà del documento prima di cominciare a registrare l'audio.\n"
+"Vuoi impostarlo adesso?"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5337
+msgid ""
+"The audio file path does not exist or is not writable.\n"
+"Please set the audio file path to a valid directory in Document Properties "
+"before you start to record audio.\n"
+"Would you like to set it now?"
+msgstr ""
+"Il percorso del file audio non esiste o non è scrivibile.\n"
+"Prova a impostare il percorso del file audio su una directory valida nelle\n"
+"Proprietà del documento prima di cominciare a registrare l'audio.\n"
+"Vuoi impostarlo adesso?"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5780
+msgid "Move playback pointer to time"
+msgstr "Muovi il puntatore di riproduzione al tempo"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5793
+#: ../src/gui/editors/matrix/MatrixView.cpp:2240
+msgid "%1%"
+msgstr "%1%"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5861
+#, c-format
+msgid "Replace Tempo Change at %1"
+msgstr "Sostituisci il cambio di ritmo in %1"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5891
+msgid "Set Global and Default Tempo"
+msgstr "Imposta il ritmo globale e predefinito"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5914
+msgid "Move Tempo Change"
+msgstr "Muovi il Cambio di Tempo"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5949
+msgid "new marker"
+msgstr "nuovo marcatore"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5950
+msgid "no description"
+msgstr "nessuna descrizione"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:6363
+#, c-format
+msgid "Sequencer failed to add audio file %1"
+msgstr "Il sequencer non ha potuto aggiungere il file audio %1"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:6388
+#, c-format
+msgid "Sequencer failed to remove audio file id %1"
+msgstr "Il sequencer non ha potuto rimuovere il file audio %1"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:6448
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:1086
+msgid "Modify Segment label"
+msgstr "Modifica l'etichetta del segmento"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:6450
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:1088
+msgid "Modify Segments label"
+msgstr "Modifica l'etichetta dei segmenti"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:6452
+msgid "Relabelling selection..."
+msgstr "Rinominando la selezione..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7539
+msgid "Play List"
+msgstr "Riproduci la lista"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7567
+msgid "http://rosegarden.sourceforge.net/tutorial/en/chapter-0.html"
+msgstr "http://rosegarden.sourceforge.net/tutorial/en/chapter-0.html"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7574
+msgid "http://rosegarden.sourceforge.net/tutorial/bug-guidelines.html"
+msgstr "http://rosegarden.sourceforge.net/tutorial/bug-guidelines.html"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7650
+msgid "Queueing MIDI panic events for tranmission..."
+msgstr "Accodando gli eventi di panico MIDI per la trasmissione..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7708
+msgid "Are you sure you want to save this as your default studio?"
+msgstr "Sei sicuro di volere salvare questo come studio predefinito?"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7713
+msgid "Saving current document as default studio..."
+msgstr "Salvando il documento corrente come studio predefinito..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7738
+msgid ""
+"Are you sure you want to import your default studio and lose the current one?"
+msgstr ""
+"Sei sicuro di voler importare lo studio predefinito e abbandonare quello "
+"corrente?"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7773
+msgid "Import Studio from File"
+msgstr "Importa Studio da file"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7807
+msgid "Import Studio"
+msgstr "Importa Studio"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:8015
+msgid ""
+"<h3>Newer version available</h3><p>A newer version of Rosegarden may be "
+"available.<br>Please consult the <a href=\"http://www.rosegardenmusic.com/"
+"getting/\">Rosegarden website</a> for more information.</p>"
+msgstr ""
+"<h3>Nuova versione disponibile</h3><p>Una nuova versione di Rosegarden "
+"potrebbe essere disponibile.<br>Prova a consultare il <a href=\"http://www."
+"rosegardenmusic.com/getting/\">sito web di Rosegarden</a> per maggiori "
+"informazioni.</p>"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:8016
+msgid "Newer version available"
+msgstr "Nuova versione disponibile"
+
+#: ../src/gui/application/RosegardenApplication.cpp:104
+#, c-format
+msgid "Failed to load soundfont %1"
+msgstr "Impossibile caricare il soundfont %1"
+
+#: ../src/gui/application/main.cpp:311
+msgid "Rosegarden - A sequencer and musical notation editor"
+msgstr "Rosegarden - Un sequencer e editor di partiture musicali"
+
+#: ../src/gui/application/main.cpp:315
+msgid "Don't use the sequencer (support editing only)"
+msgstr "Non usare il sequencer (solo supporto notazione)"
+
+#: ../src/gui/application/main.cpp:316
+msgid "Don't show the splash screen"
+msgstr "Non mostrare l'immagine di apertura"
+
+#: ../src/gui/application/main.cpp:317
+msgid "Don't automatically run in the background"
+msgstr "Non passare automaticamente in background"
+
+#: ../src/gui/application/main.cpp:318
+msgid "Attach to a running sequencer process, if found"
+msgstr "Collega al processo attivo di un sequencer, se esiste"
+
+#: ../src/gui/application/main.cpp:319
+msgid "Ignore installed version - for devs only"
+msgstr "Ignora la versione installata - solo per sviluppatori"
+
+#: ../src/gui/application/main.cpp:320
+msgid "file to open"
+msgstr "file da aprire"
+
+#: ../src/gui/application/main.cpp:370
+msgid "Installation contains the wrong version of Rosegarden."
+msgstr "L'installazione contiene la versione sbagliata di Rosegarden."
+
+#: ../src/gui/application/main.cpp:371
+msgid ""
+" The wrong versions of Rosegarden's data files were\n"
+" found in the standard KDE installation directories.\n"
+" (I am %1, but the installed files are for version %2.)\n"
+"\n"
+" This may mean one of the following:\n"
+"\n"
+" 1. This is a new upgrade of Rosegarden, and it has not yet been\n"
+" installed. If you compiled it yourself, check that you have\n"
+" run \"make install\" and that the procedure completed\n"
+" successfully.\n"
+"\n"
+" 2. The upgrade was installed in a non-standard directory,\n"
+" and an old version was found in a standard directory. If so,\n"
+" you will need to add the correct directory to your KDEDIRS\n"
+" environment variable before you can run it."
+msgstr ""
+" Nelle directory standard di KDE sono state trovate\n"
+" versioni errate dei file di dati di Rosegarden.\n"
+" (Io sono %1, ma i file trovati sono per la versione %2.)\n"
+"\n"
+" Questo potrebbe significare che:\n"
+"\n"
+" 1. Questo è un nuovo aggiornamento di Rosegarden, ma non è stato\n"
+" installato. Se l'hai compilato dai sorgenti, controlla di avere "
+"lanciato\n"
+" \"make install\" e che la procedura sia stata completata con successo.\n"
+"\n"
+" 2. L'aggiornamento è stato installato in una directory non standard,\n"
+" e una versione precedente è stata trovata nella directory standard.\n"
+" Se è così, devi aggiungere la directory giusta alla variabile di\n"
+" sistema KDEDIRS prima di lanciare il programma."
+
+#: ../src/gui/application/main.cpp:383 ../src/gui/application/main.cpp:401
+msgid "Installation problem"
+msgstr "Problema di installazione"
+
+#: ../src/gui/application/main.cpp:389
+msgid "Rosegarden does not appear to have been installed."
+msgstr "Sembra che Rosegarden non sia stato installato."
+
+#: ../src/gui/application/main.cpp:390
+msgid ""
+" One or more of Rosegarden's data files could not be\n"
+" found in the standard KDE installation directories.\n"
+"\n"
+" This may mean one of the following:\n"
+"\n"
+" 1. Rosegarden has not been correctly installed. If you compiled\n"
+" it yourself, check that you have run \"make install\" and that\n"
+" the procedure completed successfully.\n"
+"\n"
+" 2. Rosegarden has been installed in a non-standard directory,\n"
+" and you need to add this directory to your KDEDIRS environment\n"
+" variable before you can run it. This may be the case if you\n"
+" installed into $HOME or a local third-party package directory\n"
+" like /usr/local or /opt."
+msgstr ""
+" Non sono stati trovati alcuni file di dati di Rosegarden\n"
+" nelle directory standard di KDE.\n"
+"\n"
+" Questo può significare che:\n"
+"\n"
+" 1. Rosegarden non è stato installato correttamente.\n"
+" Se è stato compilato dai sorgenti, controlla di avere lanciato\n"
+" \"make install\" e che la procedura sia stata completata con successo.\n"
+"\n"
+" 2. Rosegarden è stato installato in una directory non standard,\n"
+" e devi aggiungere questa directory alla variabile di sistema KDEDIRS\n"
+" prima di poter lanciare il programma. Questo può accadere\n"
+" se hai fatto un'installazione in $HOME o in una directory locale\n"
+" come /usr/local o /opt."
+
+#: ../src/gui/application/main.cpp:414
+msgid "Rosegarden"
+msgstr "Rosegarden"
+
+#: ../src/gui/application/main.cpp:416
+msgid ""
+"Copyright 2000 - 2008 Guillaume Laurent, Chris Cannam, Richard Bown\n"
+"Parts copyright 1994 - 2004 Chris Cannam, Andy Green, Richard Bown, "
+"Guillaume Laurent\n"
+"LilyPond fonts copyright 1997 - 2005 Han-Wen Nienhuys and Jan Nieuwenhuizen"
+msgstr ""
+"Copyright 2000 - 2008 Guillaume Laurent, Chris Cannam, Richard Bown\n"
+"Parts copyright 1994 - 2004 Chris Cannam, Andy Green, Richard Bown, "
+"Guillaume Laurent\n"
+"LilyPond fonts copyright 1997 - 2005 Han-Wen Nienhuys and Jan Nieuwenhuizen"
+
+#: ../src/gui/application/main.cpp:428
+msgid "Chord labelling code"
+msgstr "Codice dei nomi degli accordi"
+
+#: ../src/gui/application/main.cpp:429
+msgid ""
+"LilyPond output\n"
+"assorted other patches\n"
+"i18n-ization"
+msgstr ""
+"Output di Lilypond\n"
+"varie patch\n"
+"i18n-ization"
+
+#: ../src/gui/application/main.cpp:430
+msgid ""
+"UI improvements\n"
+"bug fixes"
+msgstr ""
+"miglioramenti UI\n"
+"correzione bug"
+
+#: ../src/gui/application/main.cpp:431
+msgid ""
+"Segment colours\n"
+"Other UI and bug fixes"
+msgstr ""
+"Colori del segmento\n"
+"Altri UI e correzioni di bug"
+
+#: ../src/gui/application/main.cpp:432
+msgid ""
+"Russian translation\n"
+"i18n-ization"
+msgstr ""
+"Traduzione russa\n"
+"i18n-ization"
+
+#: ../src/gui/application/main.cpp:433 ../src/gui/application/main.cpp:434
+msgid "German translation"
+msgstr "Traduzione tedesca"
+
+#: ../src/gui/application/main.cpp:435
+msgid "Welsh translation"
+msgstr "Traduzione gallese"
+
+#: ../src/gui/application/main.cpp:436
+msgid "French translation"
+msgstr "Traduzione francese"
+
+#: ../src/gui/application/main.cpp:437
+msgid ""
+"French translation\n"
+"Bug fixes"
+msgstr ""
+"Traduzione francese\n"
+"Correzione di bug"
+
+#: ../src/gui/application/main.cpp:438 ../src/gui/application/main.cpp:439
+msgid "Italian translation"
+msgstr "Traduzione italiana"
+
+#: ../src/gui/application/main.cpp:440 ../src/gui/application/main.cpp:441
+msgid "Swedish translation"
+msgstr "Traduzione svedese"
+
+#: ../src/gui/application/main.cpp:442
+msgid "Estonian translation"
+msgstr "Traduzione estone"
+
+#: ../src/gui/application/main.cpp:443 ../src/gui/application/main.cpp:444
+msgid "Dutch translation"
+msgstr "Traduzione olandese"
+
+#: ../src/gui/application/main.cpp:445
+msgid "HSpinBox class"
+msgstr "Classe HSpinBox"
+
+#: ../src/gui/application/main.cpp:446
+msgid "Transposition by interval"
+msgstr "Trasposizione per intervallo"
+
+#: ../src/gui/application/main.cpp:447
+msgid "Original designs for rotary controllers"
+msgstr "Design originale per i controlli rotanti"
+
+#: ../src/gui/application/main.cpp:448
+msgid "Japanese translation"
+msgstr "Traduzione giapponese"
+
+#: ../src/gui/application/main.cpp:449
+msgid ""
+"Auto-scroll deceleration\n"
+"Rests outside staves and other bug fixes"
+msgstr ""
+"Decelerazione nell'auto-scorrimento\n"
+"Pause nei pentagrammi e risoluzione di alcuni bachi"
+
+#: ../src/gui/application/main.cpp:450
+msgid "Simplified Chinese translation"
+msgstr "Traduzione cinese semplificato"
+
+#: ../src/gui/application/main.cpp:451
+msgid "LIRC infrared remote-controller support"
+msgstr "Supporto per il controllo remoto ad infrarossi LIRC"
+
+#: ../src/gui/application/main.cpp:452
+msgid "MTC slave timing implementation"
+msgstr "Implementazione dei tempi MTC"
+
+#: ../src/gui/application/main.cpp:453
+msgid "Czech translation"
+msgstr "Traduzione ceca"
+
+#: ../src/gui/application/main.cpp:454
+msgid "SCons/bksys building system"
+msgstr "SCons/bksys building system"
+
+#: ../src/gui/application/main.cpp:455
+msgid "icons, icons, icons"
+msgstr "icone, icone, icone"
+
+#: ../src/gui/application/main.cpp:456 ../src/gui/application/main.cpp:457
+#: ../src/gui/application/main.cpp:458 ../src/gui/application/main.cpp:459
+msgid "Spanish translation"
+msgstr "Traduzione spagnola"
+
+#: ../src/gui/application/main.cpp:460 ../src/gui/application/main.cpp:461
+msgid "Catalan translation"
+msgstr "Traduzione catalana"
+
+#: ../src/gui/application/main.cpp:462
+msgid ""
+"1.2.3 splash screen photo\n"
+"Gave birth to D. Michael McIntyre, bought him a good flute once\n"
+"upon a time, and always humored him when he came over to play her\n"
+"some new instrument, even though she really hated his playing.\n"
+"Born October 19, 1951, died September 21, 2007, R. I. P."
+msgstr ""
+"Foto della schermata di avvio 1.2.3 \n"
+"Fece nascere D. Michael McIntyre, gli comprò un buon flauto\n"
+"tanto tempo fa, e lo incoraggiò sempre quando lui suonava\n"
+"un nuovo strumento, anche se in realtà non gradiva quel suono.\n"
+"Nata il 19 ottobre 1951, morta il 21 settembre 2007, R. I. P."
+
+#: ../src/gui/application/main.cpp:463
+msgid "Initial guitar chord editing code"
+msgstr "codice iniziale per l'editor degli accordi di chitarra"
+
+#: ../src/gui/application/main.cpp:464
+msgid "Polish translation"
+msgstr "Traduzione polacca"
+
+#: ../src/gui/application/main.cpp:465
+msgid "Basque translation"
+msgstr "Traduzione basca"
+
+#: ../src/gui/application/main.cpp:466
+msgid "Klearlook theme"
+msgstr "Tema Klearlook"
+
+#: ../src/_translatorinfo.cpp:1 ../src/gui/application/main.cpp:468
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr "Alessandro Musesti (da una prima traduzione di Daniele Medri)"
+
+#: ../src/_translatorinfo.cpp:3 ../src/gui/application/main.cpp:468
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+
+#: ../src/gui/application/main.cpp:719
+msgid "Welcome!"
+msgstr "Benvenuti!"
+
+#: ../src/gui/application/main.cpp:731
+msgid ""
+"<h2>Welcome to Rosegarden!</h2><p>Welcome to the Rosegarden audio and MIDI "
+"sequencer and musical notation editor.</p><ul><li>If you have not already "
+"done so, you may wish to install some DSSI synth plugins, or a separate "
+"synth program such as QSynth. Rosegarden does not synthesize sounds from "
+"MIDI on its own, so without these you will hear nothing.</"
+"li><br><br><li>Rosegarden uses the JACK audio server for recording and "
+"playback of audio, and for playback from DSSI synth plugins. These features "
+"will only be available if the JACK server is running.</"
+"li><br><br><li>Rosegarden has comprehensive documentation: see the Help menu "
+"for the handbook, tutorials, and other information!</li></ul><p>Rosegarden "
+"was brought to you by a team of volunteers across the world. To learn more, "
+"go to <a href=\"http://www.rosegardenmusic.com/\">http://www.rosegardenmusic."
+"com/</a>.</p>"
+msgstr ""
+"<h2>Benvenuti in Rosegarden!</h2><p>Benvenuti nel sequencer audio e MIDI e "
+"nell'editor di notazione musicale Rosegarden.</p><ul><li>Se non l'avete già "
+"fatto, potreste voler installare qualche plugin di sintetizzazione DSSI, o "
+"un programma di sintetizzazione separato come QSynth. Rosegarden non "
+"sintetizza i suoni MIDI per conto proprio, per cui senza questi potreste non "
+"sentire alcun suono.</li><br><br><li>Rosegarden usa il server audio JACK per "
+"registrare e riprodurre l'audio, e per la riproduzione dai plugin DSSI. "
+"Queste caratteristiche sono disponibili solo ses il server JACK è attivo.</"
+"li><br><br><li>Rosegarden ha una documentatione estesa: guarda il menù Aiuto "
+"per il manuale, i tutorial, e altre informazioni!</li></ul><p>Rosegarden è "
+"stato fatto da una squadra di volontari sparsi per il mondo. Se volete "
+"saperne di più, consultate <a href=\"http://www.rosegardenmusic.com/"
+"\">http://www.rosegardenmusic.com/</a>.</p>"
+
+#: ../src/gui/application/RosegardenGUIView.cpp:257
+msgid "No non-audio segments in composition"
+msgstr "Non ci sono segmenti non-audio nella composizione"
+
+#: ../src/gui/application/RosegardenGUIView.cpp:333
+msgid "Selection must contain only audio or non-audio segments"
+msgstr "La selezione deve contenere solo segmenti audio o non-audio"
+
+#: ../src/gui/application/RosegardenGUIView.cpp:431
+#: ../src/gui/application/RosegardenGUIView.cpp:576
+#: ../src/gui/application/RosegardenGUIView.cpp:612
+#: ../src/gui/application/RosegardenGUIView.cpp:776
+msgid "No non-audio segments selected"
+msgstr "Nessun segmento non-audio selezionato"
+
+#: ../src/gui/application/RosegardenGUIView.cpp:851
+msgid ""
+"You've not yet defined an audio editor for Rosegarden to use.\n"
+"See Settings -> Configure Rosegarden -> Audio."
+msgstr ""
+"Non hai ancora definito un editor audio per Rosegarden.\n"
+"Guarda Impostazioni -> Configura Rosegarden -> Audio."
+
+#: ../src/gui/application/RosegardenGUIView.cpp:1559
+#: ../src/gui/application/RosegardenGUIView.cpp:1564
+msgid "Can't add dropped file. "
+msgstr "Non posso aggiungere il file rilasciato."
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1014
+#: ../src/gui/seqmanager/SequenceManager.cpp:1150
+msgid ""
+"The JACK Audio subsystem has failed or it has stopped Rosegarden from "
+"processing audio.\n"
+"Please restart Rosegarden to continue working with audio.\n"
+"Quitting other running applications may improve Rosegarden's performance."
+msgstr ""
+"Il sistema audio JACK si è spento o ha impedito a Rosegarden di processare\n"
+"l'audio. Riavvia Rosegarden per continuare a lavorare con l'audio.\n"
+"Fermare altre applicazioni attive può migliorare le prestazioni di "
+"Rosegarden."
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1020
+#: ../src/gui/seqmanager/SequenceManager.cpp:1156
+msgid ""
+"The JACK Audio subsystem has stopped Rosegarden from processing audio, "
+"probably because of a processing overload.\n"
+"An attempt to restart the audio service has been made, but some problems may "
+"remain.\n"
+"Quitting other running applications may improve Rosegarden's performance."
+msgstr ""
+"Il sistema audio JACK ha impedito a Rosegarden di processare l'audio,\n"
+"probabilmente per un sovraccarico di lavoro.\n"
+"Si è fatto un tentativo di riavviare i servizi audio, ma qualche problema "
+"può rimanere.\n"
+"Fermare altre applicazioni attive può migliorare le prestazioni di "
+"Rosegarden."
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1031
+msgid ""
+"Run out of processor power for real-time audio processing. Cannot continue."
+msgstr ""
+"Superata la capacità del processore per l'audio in tempo reale.\n"
+"Non riesco a continuare."
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1057
+msgid ""
+"A serious error has occurred in the ALSA MIDI subsystem. It may not be "
+"possible to continue sequencing. Please check console output for more "
+"information."
+msgstr ""
+"È capitato un serio errore nel sottosistema ALSA MIDI. Potrebbe non essere "
+"possibile continuare. Controlla l'output della console per avere più "
+"informazioni."
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1078
+msgid "JACK Audio subsystem is losing sample frames."
+msgstr "Il sistema studio JACK sta perdendo dei frame."
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1096
+msgid ""
+"Failed to read audio data from disc in time to service the audio subsystem."
+msgstr ""
+"Non ho potuto leggere i dati audio dal disco in tempo per passarli al "
+"sistema audio."
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1100
+msgid ""
+"Failed to write audio data to disc fast enough to service the audio "
+"subsystem."
+msgstr ""
+"Non ho potuto scrivere i dati audio sul disco abbastanza veloce per "
+"sincronizzarmi col sistema audio."
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1104
+msgid "The audio mixing subsystem is failing to keep up."
+msgstr "Il sottosistema del mixing audio non riesce a funzionare."
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1108
+msgid "The audio subsystem is failing to keep up."
+msgstr "Il sistema audio non riesce a funzionare."
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1112
+msgid "Unknown sequencer failure mode!"
+msgstr "Errore sconosciuto del sequencer!"
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1170
+msgid ""
+"<h3>System timer resolution is too low</h3><p>Rosegarden was unable to find "
+"a high-resolution timing source for MIDI performance.</p><p>This may mean "
+"you are using a Linux system with the kernel timer resolution set too low. "
+"Please contact your Linux distributor for more information.</p><p>Some Linux "
+"distributors already provide low latency kernels, see <a href=\"http://"
+"rosegarden.wiki.sourceforge.net/Low+latency+kernels\">http://rosegarden.wiki."
+"sourceforge.net/Low+latency+kernels</a> for instructions.</p>"
+msgstr ""
+"<h3>La risoluzione del timer di sistema è troppo bassa</h3><p>Rosegarden non "
+"ha trovato una sorgente del timer ad alta risoluzione per la riproduzione "
+"MIDI.</p><p>Questo potrebbe significare che si sta usando un kernel Linux "
+"con una risoluzione del timer troppo bassa. Contatta il tuo distributore "
+"Linux per avere più informazioni.</p><p>Alcune distribuzioni di Linux "
+"dispongono di kernel a bassa latenza, vedi <a href=\"http://rosegarden.wiki."
+"sourceforge.net/Low+latency+kernels\">http://rosegarden.wiki.sourceforge.net/"
+"Low+latency+kernels</a> per istruzioni.</p>"
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1188
+msgid ""
+"<h3>System timer resolution is too low</h3><p>Rosegarden was unable to find "
+"a high-resolution timing source for MIDI performance.</p><p>You may be able "
+"to solve this problem by loading the RTC timer kernel module. To do this, "
+"try running <b>sudo modprobe snd-rtctimer</b> in a terminal window and then "
+"restarting Rosegarden.</p><p>Alternatively, check whether your Linux "
+"distributor provides a multimedia-optimized kernel. See <a href=\"http://"
+"rosegarden.wiki.sourceforge.net/Low+latency+kernels\">http://rosegarden.wiki."
+"sourceforge.net/Low+latency+kernels</a> for notes about this.</p>"
+msgstr ""
+"<h3>La risoluzione del timer di sistema è troppo bassa</h3><p>Rosegarden non "
+"ha trovato una sorgente del timer ad alta risoluzione per la riproduzione "
+"MIDI.</p><p>Dovresti poter risolvere il problema caricando il modulo del "
+"kernel RTC timer. Per farlo, prova a lanciare <b>sudo modprobe snd-rtctimer</"
+"b> in un terminale e poi riavvia Rosegarden.</p><p>Altrimenti, puoi "
+"controllare se la tua distribuzione di Linux dispone di un kernel "
+"ottimizzato per la multimedialità. Vedi <a href=\"http://rosegarden.wiki."
+"sourceforge.net/Low+latency+kernels\">http://rosegarden.wiki.sourceforge.net/"
+"Low+latency+kernels</a> per qualche appunto.</p>"
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1312
+msgid ""
+"<p>Both MIDI and Audio subsystems have failed to initialize.</p><p>You may "
+"continue without the sequencer, but we suggest closing Rosegarden, running "
+"\"alsaconf\" as root, and starting Rosegarden again. If you wish to run "
+"with no sequencer by design, then use \"rosegarden --nosequencer\" to avoid "
+"seeing this error in the future.</p>"
+msgstr ""
+"<p>Non riesco a inizializzare né il sistema MIDI né il sistema audio.</"
+"p><p>Puoi continuare senza usare il sequencer, ma ti consigliamo di chiudere "
+"Rosegarden, lanciare \"alsaconf\" come root, e riavviare di nuovo "
+"Rosegarden. Se preferisci usare Rosegarden senza il sequencer, allora usa "
+"\"rosegarden --nosequencer\" per non vedere più questo errore.</p>"
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1314
+msgid ""
+"<p>The MIDI subsystem has failed to initialize.</p><p>You may continue "
+"without the sequencer, but we suggest closing Rosegarden, running \"modprobe "
+"snd-seq-midi\" as root, and starting Rosegarden again. If you wish to run "
+"with no sequencer by design, then use \"rosegarden --nosequencer\" to avoid "
+"seeing this error in the future.</p>"
+msgstr ""
+"<p>Non riesco a inizializzare il sistema MIDI.</p><p>Puoi continuare senza "
+"il sequencer, ma ti consigliamo di chiudere Rosegarden, lanciare \"modprobe "
+"snd-seq-midi\" come root, e riavviare di nuovo Rosegarden. Se preferisci "
+"usare Rosegarden senza il sequencer, allora usa \"rosegarden --nosequencer\" "
+"per non vedere più questo errore.</p>"
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1316
+msgid ""
+"<p>The Rosegarden sequencer module version does not match the GUI module "
+"version.</p><p>You have probably mixed up files from two different versions "
+"of Rosegarden. Please check your installation.</p>"
+msgstr ""
+"<p>La versione del modulo del sequencer di Rosegarden non corrisponde alla "
+"versione del modulo dell'interfaccia.</p><p>Probabilmente hai mescolato file "
+"di due versioni diverse di Rosegarden. Controlla l'installazione.</p>"
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1322
+#, c-format
+msgid "<h3>Sequencer startup failed</h3>%1"
+msgstr "<h3>Avvio del sequencer fallito</h3>%1"
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1330
+msgid ""
+"<h3>Failed to connect to JACK audio server.</h3><p>Rosegarden could not "
+"connect to the JACK audio server. This probably means the JACK server is "
+"not running.</p><p>If you want to be able to play or record audio files or "
+"use plugins, you should exit Rosegarden and start the JACK server before "
+"running Rosegarden again.</p>"
+msgstr ""
+"<h3>Connessione fallita al server audio JACK.</h3><p>Rosegarden non riesce a "
+"connettersi al server audio JACK. Probabilmente il server audio JACK non è "
+"attivo.</p><p>Se desideri riprodurre o registrare file audio o usare i "
+"plugin, devi chiudere Rosegarden e avviare il server JACK prima di lanciare "
+"di nuovo Rosegarden.</p>"
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1331
+msgid "Failed to connect to JACK"
+msgstr "Connessione fallita a JACK"
+
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:46
+msgid "Modify MIDI filters..."
+msgstr "Modifica filtri MIDI..."
+
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:58
+msgid "THRU events to ignore"
+msgstr "Eventi THRU da ignorare"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:131
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:60
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:96
+msgid "Note"
+msgstr "Nota"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:132
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:61
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:97
+msgid "Program Change"
+msgstr "Cambia programma"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:136
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:62
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:98
+msgid "Key Pressure"
+msgstr "Pressione tasto"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:137
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:63
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:99
+msgid "Channel Pressure"
+msgstr "Sensibilità canale"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:134
+#: ../src/gui/general/EditView.cpp:899
+#: ../src/gui/rulers/ControllerEventsRuler.cpp:198
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:64
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:100
+msgid "Pitch Bend"
+msgstr "Curva dell'altezza"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:133
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:65
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:101
+msgid "Controller"
+msgstr "Controller"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:135
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:66
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:102
+msgid "System Exclusive"
+msgstr "Esclusione di sistema"
+
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:94
+msgid "RECORD events to ignore"
+msgstr "Eventi di registrazione da ignorare"
+
+#: ../src/gui/widgets/TimeWidget.cpp:101
+msgid "Note:"
+msgstr "Nota:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:108 ../src/gui/widgets/TimeWidget.cpp:145
+msgid "<inexact>"
+msgstr "<inesatto>"
+
+#: ../src/gui/widgets/TimeWidget.cpp:151
+msgid "Units:"
+msgstr "Unità:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:173
+msgid "Time:"
+msgstr "Velocità:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:184
+msgid "units"
+msgstr "unità"
+
+#: ../src/gui/widgets/TimeWidget.cpp:193
+msgid "Measures:"
+msgstr "Battute:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:193
+msgid "Measure:"
+msgstr "Battuta:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:212
+msgid "beats:"
+msgstr "battiti:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:212
+msgid "beat:"
+msgstr "Ritmo:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:230
+msgid "%1:"
+msgstr "%1"
+
+#: ../src/gui/widgets/TimeWidget.cpp:254
+msgid "Seconds:"
+msgstr "Secondi:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:273
+msgid "msec:"
+msgstr "millisecondi:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:407 ../src/gui/widgets/TimeWidget.cpp:531
+msgid "(%1/%2 time)"
+msgstr "(%1/%2 velocità)"
+
+#: ../src/gui/widgets/TimeWidget.cpp:452
+msgid "(starting %1.%2 qpm, %2.%3 bpm)"
+msgstr "(inizio %1.%2 qpm, %2.%3 bpm)"
+
+#: ../src/gui/widgets/TimeWidget.cpp:458
+msgid "(starting %1.%2 bpm)"
+msgstr "(inizio %1.%2 bpm)"
+
+#: ../src/gui/widgets/TimeWidget.cpp:464
+msgid "(%1.%2 qpm, %2.%3 bpm)"
+msgstr "(%1.%2 qpm, %2.%3 bpm)"
+
+#: ../src/gui/widgets/TimeWidget.cpp:470
+msgid "(%1.%2 bpm)"
+msgstr "(%1.%2 bpm)"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:239
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:60
+msgid "C"
+msgstr "Do"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:241
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:61
+msgid "D"
+msgstr "Re"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:243
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:62
+msgid "E"
+msgstr "Mi"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:244
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:63
+msgid "F"
+msgstr "Fa"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:246
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:64
+msgid "G"
+msgstr "Sol"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:248
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:65
+msgid "A"
+msgstr "La"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:250
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:66
+msgid "B"
+msgstr "Si"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:70
+msgid "-2"
+msgstr "-2"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:71
+msgid "-1"
+msgstr "-1"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:72
+msgid "0"
+msgstr "0"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:73
+msgid "1"
+msgstr "1"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:74
+msgid "2"
+msgstr "2"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:75
+msgid "3"
+msgstr "3"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:76
+msgid "4"
+msgstr "4"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:77
+msgid "5"
+msgstr "5"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:78
+msgid "6"
+msgstr "6"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:79
+msgid "7"
+msgstr "7"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:83
+msgid "double flat"
+msgstr "doppio bemolle"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:84
+msgid "flat"
+msgstr "bemolle"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:85
+msgid "natural"
+msgstr "naturale"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:86
+msgid "sharp"
+msgstr "diesis"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:87
+msgid "double sharp"
+msgstr "doppio diesis"
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:234
+#, c-format
+msgid "In %1"
+msgstr "In %1"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:587
+#: ../src/gui/widgets/AudioRouteMenu.cpp:236
+#: ../src/gui/widgets/AudioRouteMenu.cpp:259
+msgid "Master"
+msgstr "Master"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:528
+#: ../src/gui/widgets/AudioRouteMenu.cpp:238
+#: ../src/gui/widgets/AudioRouteMenu.cpp:261
+#, c-format
+msgid "Sub %1"
+msgstr "Sub %1"
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:244
+msgid "In %1 R"
+msgstr "In %1 R"
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:245
+msgid "In %1 L"
+msgstr "In %1 L"
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:247
+msgid "Master R"
+msgstr "Master R"
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:248
+msgid "Master L"
+msgstr "Master L"
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:250
+msgid "Sub %1 R"
+msgstr "Sub %1 R"
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:251
+msgid "Sub %1 L"
+msgstr "Sub %1 L"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:391
+#: ../src/gui/studio/AudioMixerWindow.cpp:522
+#: ../src/gui/widgets/AudioFaderBox.cpp:82
+msgid "Audio plugin button"
+msgstr "Pulsante per i plugin audio"
+
+#: ../src/gui/editors/parameters/AudioInstrumentParameterPanel.cpp:129
+#: ../src/gui/editors/parameters/AudioInstrumentParameterPanel.cpp:357
+#: ../src/gui/widgets/AudioFaderBox.cpp:91
+msgid "<no synth>"
+msgstr "<nessun sintetizzatore>"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:93
+msgid "Synth plugin button"
+msgstr "Pulsante per i plugin del sintetizzatore"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:153
+msgid "Set the audio pan position in the stereo field"
+msgstr "Metti la posizione del pan dell'audio in stereo"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:155
+msgid "Open synth plugin's native editor"
+msgstr "Apri l'editor nativo del plugin sintetizzatore"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:157
+msgid "Mono or Stereo Instrument"
+msgstr "Strumento Mono e Stereo"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:159
+msgid "Record level"
+msgstr "Livello registrazione"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:161
+msgid "Playback level"
+msgstr "Livello riproduzione"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:345
+#: ../src/gui/studio/AudioMixerWindow.cpp:347
+#: ../src/gui/studio/AudioMixerWindow.cpp:503
+#: ../src/gui/studio/AudioMixerWindow.cpp:505
+#: ../src/gui/widgets/AudioFaderBox.cpp:163
+msgid "Audio level"
+msgstr "Livello audio"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:170
+msgid "In:"
+msgstr "In:"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:173
+msgid "Out:"
+msgstr "Out:"
+
+#: ../src/gui/widgets/ProgressDialog.cpp:48
+#: ../src/gui/widgets/ProgressDialog.cpp:53
+#: ../src/gui/widgets/ProgressDialog.cpp:76
+msgid "Processing..."
+msgstr "Elaborazione in corso..."
+
+#: ../src/gui/configuration/ColourConfigurationPage.h:60
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:130
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:346
+#: ../src/gui/widgets/ColourTable.cpp:52
+msgid "Color"
+msgstr "Colore"
+
+#: ../src/gui/widgets/ColourTable.cpp:68
+msgid "Modify Color Name"
+msgstr "Modifica nome colore"
+
+#: ../src/gui/configuration/ColourConfigurationPage.cpp:129
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:983
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:882
+#: ../src/gui/widgets/ColourTable.cpp:68
+msgid "Enter new name"
+msgstr "Inserisci un nuovo nome"
+
+#: ../src/gui/widgets/ColourTable.cpp:107
+msgid "Default Color"
+msgstr "Colore predefinito"
+
+#: ../src/gui/widgets/Rotary.cpp:108
+msgid ""
+"Click and drag up and down or left and right to modify.\n"
+"Double click to edit value directly."
+msgstr ""
+"Clicca e muovi su e giù o a destra e sinistra per modificare.\n"
+"Doppio click per immettere direttamente il valore."
+
+#: ../src/gui/widgets/Rotary.cpp:433
+msgid "Select a new value"
+msgstr "Scegli un nuovo valore"
+
+#: ../src/gui/widgets/Rotary.cpp:434
+msgid "Enter a new value"
+msgstr "Inserisci un nuovo valore"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:80
+msgid "Quantizer"
+msgstr "Quantizzatore"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:86
+msgid "Quantizer type:"
+msgstr "Tipo di quantizzatore:"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:88
+msgid "Grid quantizer"
+msgstr "Griglia del quantizzatore"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:89
+msgid "Legato quantizer"
+msgstr "Quantizzatore Legato"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:90
+msgid "Heuristic notation quantizer"
+msgstr "Quantizzatore di notazione euristica"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:94
+msgid "Quantize for notation only (leave performance unchanged)"
+msgstr "Quantizza solo la notazione (lascia inalterata la riproduzione)"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:104
+msgid "Notation parameters"
+msgstr "Parametri notazione"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:109
+#: ../src/gui/widgets/QuantizeParameters.cpp:150
+msgid "Base grid unit:"
+msgstr "Unità base della griglia:"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:114
+msgid "Complexity:"
+msgstr "Complessità:"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:118
+msgid "Very high"
+msgstr "Molto alto"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:119
+msgid "High"
+msgstr "Alta"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:224
+#: ../src/gui/widgets/QuantizeParameters.cpp:120
+msgid "Normal"
+msgstr "Normale"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:121
+msgid "Low"
+msgstr "Bassa"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:122
+msgid "Very low"
+msgstr "Molto basso"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:125
+msgid "Tuplet level:"
+msgstr "Livello tupla:"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:129
+msgid "2-in-the-time-of-3"
+msgstr "2 nel tempo di 3"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4241
+#: ../src/gui/widgets/QuantizeParameters.cpp:130
+msgid "Triplet"
+msgstr "Terzina"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:138
+msgid "Any"
+msgstr "Qualsiasi"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:141
+msgid "Permit counterpoint"
+msgstr "Permetti il contrappunto"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:145
+msgid "Grid parameters"
+msgstr "Parametri della griglia"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:154
+msgid "Swing:"
+msgstr "Oscillazione:"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:159
+msgid "Iterative amount:"
+msgstr "numero di ripetizioni:"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:165
+msgid "Quantize durations as well as start times"
+msgstr "Quantizza le durate e i tempi d'inizio"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:169
+msgid "After quantization"
+msgstr "Dopo la quantizzazione"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:183
+msgid "Show advanced options"
+msgstr "Mostra le opzioni avanzate"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:192
+msgid "Re-beam"
+msgstr "Ri-collega"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:194
+msgid "Add articulations (staccato, tenuto, slurs)"
+msgstr "Aggiungi articolazioni (staccato, tenuto, legato)"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:195
+msgid "Tie notes at barlines etc"
+msgstr "Lega le note alle linee di battuta ecc"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:196
+msgid "Split-and-tie overlapping chords"
+msgstr "Dividi-e-lega gli accordi sovrapposti"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:307
+msgid "Full quantize"
+msgstr "Quantizzazione piena"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:450
+msgid "Show Advanced Options"
+msgstr "Mostra le Opzioni Avanzate"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:454
+msgid "Hide Advanced Options"
+msgstr "Nascondi le Opzioni Avanzate"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:257
+#: ../src/gui/configuration/MatrixConfigurationPage.h:56
+#: ../src/gui/configuration/MatrixConfigurationPage.h:57
+#: ../src/gui/editors/matrix/MatrixView.cpp:2709
+msgid "Matrix"
+msgstr "Matrice"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:64
+msgid "Printable headers"
+msgstr "Intestazioni stampabili"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:92
+msgid "Dedication"
+msgstr "Dedica"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:96
+#: ../src/gui/editors/segment/PlayListView.cpp:35
+msgid "Title"
+msgstr "Titolo"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:100
+msgid "Subtitle"
+msgstr "Sottotitolo"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:104
+msgid "Subsubtitle"
+msgstr "Sotto-sottotitolo"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:108
+msgid "Poet"
+msgstr "Poeta"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:116
+msgid "Composer"
+msgstr "Compositore"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:120
+msgid "Meter"
+msgstr "Misurazione"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:124
+msgid "Arranger"
+msgstr "Arrangiatore"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:128
+msgid "Piece"
+msgstr "Pezzo"
+
+#: ../data/fonts/mappings/fonts.cpp:26
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:132
+msgid "Opus"
+msgstr "Opus"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:136
+msgid "Copyright"
+msgstr "Copyright"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:140
+msgid "Tagline"
+msgstr "Tagline"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:155
+msgid "The composition comes here."
+msgstr "La composizione viene qui."
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:172
+msgid "Non-printable headers"
+msgstr "Intestazioni non stampabili"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:213
+msgid "Add New Property"
+msgstr "Aggiungi nuova proprietà"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:217
+msgid "Delete Property"
+msgstr "Elimina proprietà"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:236
+msgid "{new property %1}"
+msgstr "{nuova proprietà %1}"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:236
+msgid "{new property}"
+msgstr "{nuova proprietà}"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:243
+msgid "{undefined}"
+msgstr "{non definito}"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:87
+msgid "Double-click opens segment in"
+msgstr "Doppio clic apre il segmento in"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:91
+msgid "Notation editor"
+msgstr "Editor di notazione"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:92
+msgid "Matrix editor"
+msgstr "Editor di matrice"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:93
+msgid "Event List editor"
+msgstr "Editor della lista degli eventi"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:99
+msgid "Number of count-in measures when recording"
+msgstr "Numero di battute durante la registrazione"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:109
+msgid "Auto-save interval"
+msgstr "Intervallo per il salvataggio automatico"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:112
+msgid "Every 30 seconds"
+msgstr "Ogni 30 secondi"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:113
+msgid "Every minute"
+msgstr "Ogni minuto"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:114
+msgid "Every five minutes"
+msgstr "Ogni cinque minuti"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:115
+msgid "Every half an hour"
+msgstr "Ogni mezz'ora"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:116
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:277
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:157
+msgid "Never"
+msgstr "Mai"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:140
+msgid "Use JACK transport"
+msgstr "Usa il trasporto JACK"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:173
+msgid "Unknown"
+msgstr "Sconosciuto"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:179
+msgid "No MIDI, audio OK"
+msgstr "Senza MIDI, audio OK"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:182
+msgid "MIDI OK, no audio"
+msgstr "MIDI OK, senza audio"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:185
+msgid "MIDI OK, audio OK"
+msgstr "MIDI OK, audio OK"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:188
+msgid "No driver"
+msgstr "Nessun driver"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:195
+msgid "Details..."
+msgstr "Dettagli..."
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:204
+msgid "Behavior"
+msgstr "Comportamento"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:219
+msgid "Side-bar parameter box layout"
+msgstr "Visualizzazione della barra laterale dei parametri"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:223
+msgid "Vertically stacked"
+msgstr "Impilato verticalmente"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:225
+msgid "Tabbed"
+msgstr "Tabulato"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:233
+msgid "Note name style"
+msgstr "Stile del nome delle note"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:237
+msgid "Always use US names (e.g. quarter, 8th)"
+msgstr "Usa sempre i nomi USA (per esempio quarter, 8th)"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:238
+msgid "Localized (where available)"
+msgstr "Localizzati (quando esistono)"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:252
+msgid "Show textured background on"
+msgstr "Mostra lo sfondo texture su"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:254
+msgid "Main window"
+msgstr "Finestra principale"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:275
+msgid "Use bundled Klearlook theme"
+msgstr "Usa il tema Klearlook fornito"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:278
+msgid "When not running under KDE"
+msgstr "Quando non è avviato da KDE"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:279
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:159
+msgid "Always"
+msgstr "Sempre"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:287
+msgid "Presentation"
+msgstr "Presentazione"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:423
+msgid ""
+"Changes to the textured background in the main window will not take effect "
+"until you restart Rosegarden."
+msgstr ""
+"I cambiamenti allo sfondo texture nella finestra principale saranno "
+"effettivi dal prossimo riavvio di Rosegarden"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:168
+#: ../src/gui/configuration/GeneralConfigurationPage.h:78
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:207
+#: ../src/gui/configuration/MatrixConfigurationPage.cpp:59
+msgid "General"
+msgstr "Generale"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.h:79
+msgid "General Configuration"
+msgstr "Configurazione generale"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:92
+msgid "Base octave number for MIDI pitch display"
+msgstr "Numero di ottava di base per il display MIDI di altezza"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:107
+msgid "Always use default studio when loading files"
+msgstr "Usa sempre lo studio di default quando carichi i file"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:119
+msgid "Send all MIDI Controllers at start of each playback"
+msgstr "Invia tutti i controlli MIDI all'inizio di ogni riproduzione"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:121
+msgid ""
+"Rosegarden can send all MIDI Controllers (Pan, Reverb etc) to all MIDI "
+"devices every\n"
+"time you hit play if you so wish. Please note that this option will usually "
+"incur a\n"
+"delay at the start of playback due to the amount of data being transmitted."
+msgstr ""
+"Rosegarden può mandare tutti i controller MIDI (Pan, Riverbero ecc) a tutti "
+"i dispositivi MIDI ogni volta che premi \"Riproduci\" se lo desideri. Questa "
+"opzione però di solito induce un ritardo nell'inizio della riproduzione "
+"dovuto alla quantità di dati da trasmettere."
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:138
+msgid "Sequencer timing source"
+msgstr "Sorgente del tempo del sequencer"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:163
+msgid "Load SoundFont to SoundBlaster card at startup"
+msgstr "Carica SoundFont sulla scheda SoundBlaster all'avvio"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:164
+msgid ""
+"Check this box to enable soundfont loading on EMU10K-based cards when "
+"Rosegarden is launched"
+msgstr ""
+"Segna questo box per abilitare il caricamento dei soundfont sulle schede "
+"basate su EMU10K quando Rosegarden viene avviato"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:173
+msgid "Path to 'asfxload' or 'sfxload' command"
+msgstr "Percorso per il comando 'asfxload' o 'sfxload'"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:180
+msgid "SoundFont"
+msgstr "SoundFont"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:223
+msgid "MIDI Clock and System messages"
+msgstr "Messaggi MIDI sull'orologio e il sistema."
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:229
+msgid "Send MIDI Clock, Start and Stop"
+msgstr "Invia il Clock MIDI, inizio e fine"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:230
+msgid "Accept Start, Stop and Continue"
+msgstr "Accetta inizio e fine e continua"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:241
+msgid "MIDI Machine Control mode"
+msgstr "Modo di controllo della macchina MIDI"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:248
+msgid "MMC Master"
+msgstr "MMC Master"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:249
+msgid "MMC Slave"
+msgstr "MMC Slave"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:260
+msgid "MIDI Time Code mode"
+msgstr "Modo Time Code MIDI"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:267
+msgid "MTC Master"
+msgstr "MTC Master"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:268
+msgid "MTC Slave"
+msgstr "MTC Slave"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:281
+msgid "Automatically connect sync output to all devices in use"
+msgstr "Connetti automaticamente l'output sync a tutti i dispositivi in uso"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:292
+msgid "MIDI Sync"
+msgstr "MIDI Sync"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:308
+msgid "sfxload path"
+msgstr "percorso di sfxload"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:315
+msgid "Soundfont path"
+msgstr "Percorso del soundfont"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:67
+msgid "%1 minutes %2.%3%4 seconds (%5 units, %6 measures)"
+msgstr "%1 minuti %2.%3%4 secondi (%5 unità, %6 battute)"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:133
+msgid "Filename:"
+msgstr "Nome file:"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:136
+msgid "Formal duration (to end marker):"
+msgstr "Durata formale (al marcatore finale):"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:141
+msgid "Playing duration:"
+msgstr "Durata della riproduzione:"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:146
+msgid "Tracks:"
+msgstr "Tracce:"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:147
+msgid "%1 used, %2 total"
+msgstr "%1 usati, %2 totali"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:152
+msgid "Segments:"
+msgstr "Segmenti:"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:153
+msgid "%1 MIDI, %2 audio, %3 total"
+msgstr "%1 MIDI, %2 audio, %3 totali"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:161
+msgid "Statistics"
+msgstr "Statistiche"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:170
+#: ../src/gui/editors/parameters/InstrumentParameterBox.cpp:155
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:92
+msgid "Track"
+msgstr "Traccia"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:171
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:125
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:90
+msgid "Label"
+msgstr "Etichetta"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:172
+msgid "Time"
+msgstr "Velocità"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:174
+msgid "Events"
+msgstr "Eventi"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:175
+msgid "Polyphony"
+msgstr "Polifonia"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:176
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:126
+msgid "Repeat"
+msgstr "Ripeti"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:178
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:128
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:305
+#: ../src/gui/general/EditView.cpp:1488
+msgid "Transpose"
+msgstr "Trasporto"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:179
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:129
+msgid "Delay"
+msgstr "Ritardo"
+
+#: ../src/gui/configuration/AudioConfigurationPage.h:61
+#: ../src/gui/configuration/AudioPropertiesPage.h:58
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:204
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:523
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:524
+msgid "Audio"
+msgstr "Audio"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:204
+#: ../src/gui/configuration/MIDIConfigurationPage.h:62
+msgid "MIDI"
+msgstr "MIDI"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:317
+msgid "Segment Summary"
+msgstr "Riassunto del segmento"
+
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:63
+msgid "Audio file path:"
+msgstr "Percorso file audio:"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:137
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:68
+msgid "Choose..."
+msgstr "Scegli..."
+
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:73
+msgid "Disk space remaining:"
+msgstr "Spazio disco rimanente:"
+
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:78
+msgid "Equivalent minutes of 16-bit stereo:"
+msgstr "Minuti equivalenti a 16 bit stereo:"
+
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:90
+msgid "Modify audio path"
+msgstr "Modifica percorso audio"
+
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:113
+msgid "%1 out of %2 (%3% used)"
+msgstr "%1 di %2 (%3% usati)"
+
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:144
+msgid "minutes at"
+msgstr "minuti a"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.h:63
+msgid "MIDI Settings"
+msgstr "Impostazioni MIDI"
+
+#: ../src/gui/configuration/AudioConfigurationPage.h:62
+#: ../src/gui/configuration/AudioPropertiesPage.h:59
+msgid "Audio Settings"
+msgstr "Impostazioni audio"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:87
+msgid "Default layout mode"
+msgstr "Modalità di visualizzazione predefinita"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:91
+msgid "Linear layout"
+msgstr "Visualizzazione lineare"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:92
+msgid "Continuous page layout"
+msgstr "Visualizzazione su pagina continua"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:93
+msgid "Multiple page layout"
+msgstr "Visualizzazione su più pagine"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:101
+msgid "Default spacing"
+msgstr "Spaziatura predefinita"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:125
+msgid "Default duration factor"
+msgstr "Fattore predefinito di durata"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:141
+msgid "Full"
+msgstr "Pieno"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:152
+msgid "Show track headers (linear layout only)"
+msgstr ""
+"Mostra le intestazioni della traccia (solo per la visualizzazione lineare)"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:158
+msgid "When needed"
+msgstr "Al bisogno"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:166
+msgid ""
+"\"Always\" and \"Never\" mean what they usually mean\n"
+"\"When needed\" means \"when staves are too many to all fit in the current "
+"window\""
+msgstr ""
+"\"Sempre\" e \"Mai\" significano quel che di solito significano\n"
+"\"Al bisogno\" significa \"quando i righi sono troppi per stare tutti nella "
+"finestra corrente\""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:178
+msgid "Show non-notation events as question marks"
+msgstr "Mostra gli eventi non di notazione come punti di domanda"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:188
+msgid "Show notation-quantized notes in a different color"
+msgstr "Mostra le note quantizzate in colore diverso"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:198
+msgid "Show \"invisible\" events in grey"
+msgstr "Mostra gli eventi \"invisibili\" in grigio"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:208
+msgid "Show notes outside suggested playable range in red"
+msgstr "Mostra in rosso le note fuori dall'intervallo suggerito"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:218
+msgid "Highlight superimposed notes with a halo effect"
+msgstr "Evidenzia le note sovrapposte con un effetto di trasparenza"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:231
+msgid "When recording MIDI, split-and-tie long notes at barlines"
+msgstr ""
+"Nella registrazione MIDI, dividi e lega le note lunghe alle linee di battuta"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:242
+msgid "Layout"
+msgstr "Aspetto"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:255
+msgid "Default note style for new notes"
+msgstr "Stile predefinito per le nuove note"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:287
+msgid "When inserting notes..."
+msgstr "Quando inserisci le note..."
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:294
+msgid "Split notes into ties to make durations match"
+msgstr "Dividi le note con legature per rispettare la durata delle battute"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:295
+msgid "Ignore existing durations"
+msgstr "Ignora le durate esistenti"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:305
+msgid "Auto-beam on insert when appropriate"
+msgstr "Auto-collega all'inserimento quando appropriato"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:317
+#: ../src/gui/editors/notation/NotationEraser.cpp:54
+msgid "Collapse rests after erase"
+msgstr "Unisci le pause dopo una cancellazione"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:328
+msgid "Default paste type"
+msgstr "Modalità predefinita per incollare"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:350
+msgid "Editing"
+msgstr "Modifica"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:362
+msgid "Accidentals in one octave..."
+msgstr "Accidenti in una ottava..."
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:364
+msgid "Affect only that octave"
+msgstr "Cambia soltanto quell'ottava"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:365
+msgid "Require cautionaries in other octaves"
+msgstr "Chiedi conferma nelle altre ottave"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:366
+msgid "Affect all subsequent octaves"
+msgstr "Cambia tutte le ottave successive"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:374
+msgid "Accidentals in one bar..."
+msgstr "Accidenti in una battuta..."
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:376
+msgid "Affect only that bar"
+msgstr "Cambia solo quella battuta"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:377
+msgid "Require cautionary resets in following bar"
+msgstr "Chiedi l'azzeramento delle precauzioni nella battuta seguente"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:378
+msgid "Require explicit resets in following bar"
+msgstr "Chiedi esplicitamente il ripristino nella battuta seguente"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:386
+msgid "Key signature cancellation style"
+msgstr "Stile di cancellazione della tonalità"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:388
+msgid "Cancel only when entering C major or A minor"
+msgstr "Cancella solo quando parte in DO maggiore o LA minore"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:389
+msgid "Cancel whenever removing sharps or flats"
+msgstr "Cancella quando sono rimossi diesis e bemolle"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:390
+msgid "Cancel always"
+msgstr "Cancella sempre"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:400
+msgid "Accidentals"
+msgstr "Accidenti"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:441
+msgid "Notation font"
+msgstr "Carattere notazione"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:467
+msgid "Origin:"
+msgstr "Origine:"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:471
+msgid "Copyright:"
+msgstr "Copyright:"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:475
+msgid "Mapped by:"
+msgstr "Mappato da:"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:479
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:81
+msgid "Type:"
+msgstr "Tipo:"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:508
+msgid "Font size for single-staff views"
+msgstr "Dimensione dei caratteri per la vista a pentagramma singolo"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:516
+msgid "Font size for multi-staff views"
+msgstr "Dimensione dei caratteri per la vista a più pentagrammi"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:524
+msgid "Font size for printing (pt)"
+msgstr "Dimensione dei caratteri per la stampa (punti)"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:541
+msgid "Text font"
+msgstr "Font del testo"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:549
+msgid "Sans-serif font"
+msgstr "Font Sans-serif"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:664
+msgid "%1 (smooth)"
+msgstr "%1 (regolare)"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:667
+msgid "%1 (jaggy)"
+msgstr "%1 (frastagliato)"
+
+#: ../src/gui/configuration/LatencyConfigurationPage.cpp:58
+msgid "JACK latency"
+msgstr "Latenza di JACK"
+
+#: ../src/gui/configuration/LatencyConfigurationPage.cpp:61
+msgid ""
+"Use the \"Fetch JACK latencies\" button to discover the latency values set "
+"at\n"
+"the sequencer. It's recommended that you use the returned values but it's "
+"also\n"
+"possible to override them manually using the sliders. Note that if you "
+"change\n"
+"your JACK server parameters you should always fetch the latency values "
+"again.\n"
+"The latency values will be stored by Rosegarden for use next time."
+msgstr ""
+"Usa il pulsante \"Trova le latenze di JACK\" per scoprire i valori di "
+"latenza del sequencer. È bene usare i valori trovati, anche se è possibile "
+"impostarli manualmente muovendo gli slider. Se i parametri del server JACK "
+"vengono cambiati, devi sempre ritrovare i valori di latenza di nuovo. I "
+"valori di latenza verranno memorizzati da Rosegarden per gli utilizzi "
+"successivi."
+
+#: ../src/gui/configuration/LatencyConfigurationPage.cpp:65
+msgid "JACK playback latency (in ms)"
+msgstr "Latenza di riproduzione di JACK (in millisecondi)"
+
+#: ../src/gui/configuration/LatencyConfigurationPage.cpp:66
+msgid "JACK record latency (in ms)"
+msgstr "Latenza di registrazione di JACK (in millisecondi)"
+
+#: ../src/gui/configuration/LatencyConfigurationPage.cpp:68
+msgid "Fetch JACK latencies"
+msgstr "Rileva latenze di JACK"
+
+#: ../src/gui/configuration/LatencyConfigurationPage.cpp:121
+msgid "JACK Latency"
+msgstr "Latenza di JACK"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:92
+msgid "Audio preview scale"
+msgstr "Scala dell'anteprima audio"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:96
+msgid "Linear - easier to see loud peaks"
+msgstr "Lineare - picchi di volume più visibili"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:97
+msgid "Meter scaling - easier to see quiet activity"
+msgstr "Meter scaling - easier to see quiet activity"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:105
+msgid "Record audio files as"
+msgstr "Registra i file audio come"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:107
+msgid "16-bit PCM WAV format (smaller files)"
+msgstr "Formato PCM WAV 16-bit (file più piccoli)"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:108
+msgid "32-bit float WAV format (higher quality)"
+msgstr "Formato WAV 32-bit (migliore qualità)"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:117
+msgid "External audio editor"
+msgstr "Editor audio esterni"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:145
+msgid "Create JACK outputs"
+msgstr "Crea output JACK"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:150
+msgid "for individual audio instruments"
+msgstr "per strumenti audio individuali"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:157
+msgid "for submasters"
+msgstr "per submaster"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:184
+msgid ""
+"Rosegarden can start the JACK audio daemon (jackd) for you automatically if "
+"it isn't already running when Rosegarden starts.\n"
+"\n"
+"This is recommended for beginners and those who use Rosegarden as their main "
+"audio application, but it might not be to the liking of advanced users.\n"
+"\n"
+"If you want to start JACK automatically, make sure the command includes a "
+"full path where necessary as well as any command-line arguments you want to "
+"use.\n"
+"\n"
+"For example: /usr/local/bin/jackd -d alsa -d hw -r44100 -p 2048 -n 2\n"
+"\n"
+msgstr ""
+"Rosegarden può avviare il demone audio JACK (jackd) per te automaticamente "
+"se non è già attivo all'avvio.\n"
+"\n"
+"Ciò è consigliato per i principianti e per chi usa Rosegarden come "
+"principale applicazione audio, ma potrebbe non piacere agli utenti "
+"avanzati.\n"
+"\n"
+"Se vuoi avviare JACK automaticamente, assicurati che il comando includa il "
+"percorso completo se necessario, così come ogni opzione della riga di "
+"comando che desideri usare.\n"
+"\n"
+"Per esempio: /usr/local/bin/jackd -d alsa -d hw -r44100 -p 2048 -n 2\n"
+"\n"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:196
+msgid "Start JACK when Rosegarden starts"
+msgstr "Avvia JACK quando Rosegarden parte"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:201
+msgid "JACK command"
+msgstr "comando JACK"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:214
+msgid "JACK Startup"
+msgstr "Avvio JACK"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:224
+msgid "External audio editor path"
+msgstr "Percorso dell'editor audio esterno"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:262
+msgid "External audio editor \"%1\" not found or not executable"
+msgstr "Editor esterno dell'audio \"%1\" non trovato o non eseguibile"
+
+#: ../src/gui/configuration/ColourConfigurationPage.cpp:70
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:448
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:863
+msgid "Add New Color"
+msgstr "Aggiungi nuovo colore"
+
+#: ../src/gui/configuration/ColourConfigurationPage.cpp:74
+msgid "Delete Color"
+msgstr "Elimina colore"
+
+#: ../src/gui/configuration/ColourConfigurationPage.cpp:93
+msgid "Color Map"
+msgstr "Mappa colori"
+
+#: ../src/gui/configuration/ColourConfigurationPage.cpp:128
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:983
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:882
+msgid "New Color Name"
+msgstr "Nuovo nome colore"
+
+#: ../src/gui/configuration/ColourConfigurationPage.cpp:130
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:59
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:984
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:883
+#: ../src/gui/studio/DeviceManagerDialog.cpp:115
+#: ../src/gui/studio/DeviceManagerDialog.cpp:174
+msgid "New"
+msgstr "Nuovo"
+
+#: ../src/gui/configuration/LatencyConfigurationPage.h:62
+msgid "Latency"
+msgstr "Latenza"
+
+#: ../src/gui/configuration/LatencyConfigurationPage.h:63
+msgid "Sequencer Latency"
+msgstr "Latenza del sequencer"
+
+#: ../src/gui/configuration/ColourConfigurationPage.h:61
+msgid "Color Settings"
+msgstr "Impostazioni colore"
+
+#: ../src/gui/studio/MidiDeviceListViewItem.cpp:55
+#: ../src/gui/studio/MidiKeyMapListViewItem.cpp:44
+msgid "Key Mapping"
+msgstr "Mappatura della tastiera"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:97
+msgid "Manage MIDI Banks and Programs"
+msgstr "Gestisci banchi MIDI e programmi"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:128
+msgid "MIDI Device"
+msgstr "Dispositivo MIDI"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:130
+#: ../src/gui/studio/BankEditorDialog.cpp:219
+msgid "MSB"
+msgstr "MSB"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:131
+#: ../src/gui/studio/BankEditorDialog.cpp:218
+msgid "LSB"
+msgstr "LSB"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:140
+msgid "Add Bank"
+msgstr "Aggiungi Banco"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:141
+msgid "Add Key Mapping"
+msgstr "Aggiungi mappatura della tastiera"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:153
+msgid "Add a Bank to the current device"
+msgstr "Aggiungi un banco al dispositivo corrente"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:157
+msgid "Add a Percussion Key Mapping to the current device"
+msgstr ""
+"Aggiungi una mappatura della tastiera per le percussioni al dispositivo "
+"corrente"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:161
+msgid "Delete the current Bank or Key Mapping"
+msgstr "Elimina il banco o la mappatura della tastiera corrente"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:165
+msgid "Delete all Banks and Key Mappings from the current Device"
+msgstr ""
+"Elimina tutti i banchi e le mappature della tastiera dal dispositivo corrente"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:167
+#: ../src/gui/studio/DeviceManagerDialog.cpp:117
+msgid "Import..."
+msgstr "Importazione in corso..."
+
+#: ../src/gui/studio/BankEditorDialog.cpp:168
+#: ../src/gui/studio/DeviceManagerDialog.cpp:118
+msgid "Export..."
+msgstr "Esportazione in corso..."
+
+#: ../src/gui/studio/BankEditorDialog.cpp:176
+msgid ""
+"Import Bank and Program data from a Rosegarden file to the current Device"
+msgstr ""
+"Importa i banchi e i dati del programma da un file di Rosegarden all'attuale "
+"dispositivo"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:179
+msgid ""
+"Export all Device and Bank information to a Rosegarden format interchange "
+"file"
+msgstr ""
+"Esporta tutti i dispositivi e le informazioni sul banco nel formato di "
+"scambio di Rosegarden"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:190
+msgid "Copy all Program names from current Bank to clipboard"
+msgstr "Copia tutti i nomi dei programmi dal banco attuale agli appunti"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:194
+msgid "Paste Program names from clipboard to current Bank"
+msgstr "Incolla i nomi dei programmi dagli appunti al banco attuale"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:216
+msgid "Show Variation list based on "
+msgstr "Mostra le liste di variazione basate su "
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1010
+msgid "<new bank>"
+msgstr "<nuovo banco>"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1046
+msgid "<new mapping>"
+msgstr "<nuova mappatura>"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1048
+msgid "<new mapping %1>"
+msgstr "<nuova mappatura %1>"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1089
+msgid "Really delete this bank?"
+msgstr "Vuoi eliminare veramente questo banco?"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1137
+msgid "Really delete this key mapping?"
+msgstr "Vuoi eliminare veramente questa mappatura?"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1187
+msgid "Really delete all banks for "
+msgstr "Vuoi veramente eliminare tutti i banchi per "
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1476
+msgid "Import Banks from Device in File"
+msgstr "Importa i banchi dal dispositivo nel file"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1623
+#: ../src/gui/studio/DeviceManagerDialog.cpp:770
+msgid "Export Device as..."
+msgstr "Esporta dispositivo come..."
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1694
+msgid ""
+"There are unsaved changes.\n"
+"Do you want to apply the changes before exiting the Bank Editor or discard "
+"the changes ?"
+msgstr ""
+"Ci sono cambiamenti non salvati.\n"
+"Vuoi applicare i cambiamenti prima di uscire dall'editor di banco o "
+"abbandonare i cambiamenti?"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1697
+msgid "Unsaved Changes"
+msgstr "Cambiamenti non salvati"
+
+#: ../src/gui/studio/NameSetEditor.cpp:68
+msgid "Librarian"
+msgstr "Bibliotecario"
+
+#: ../src/gui/studio/NameSetEditor.cpp:75
+msgid "Email"
+msgstr "Posta elettronica"
+
+#: ../src/gui/studio/NameSetEditor.cpp:80
+msgid ""
+"The librarian maintains the Rosegarden device data for this device.\n"
+"If you've made modifications to suit your own device, it might be worth\n"
+"liaising with the librarian in order to publish your information for the "
+"benefit\n"
+"of others."
+msgstr ""
+"Il bibliotecario mantiene i dati di questo dispositivo.\n"
+"Se hai fatto delle modifiche per adeguarli al tuo dispositivo,\n"
+" potrebbe essere utile contattare il bibliotecario per condividerle,\n"
+"a beneficio di altri."
+
+#: ../src/gui/studio/MidiBankListViewItem.cpp:51
+#: ../src/gui/studio/MidiDeviceListViewItem.cpp:48
+msgid "Percussion Bank"
+msgstr "Banco delle percussioni"
+
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:84
+#: ../src/gui/studio/MidiBankListViewItem.cpp:51
+#: ../src/gui/studio/MidiDeviceListViewItem.cpp:48
+msgid "Bank"
+msgstr "Banco"
+
+#: ../src/gui/studio/ChangeRecordDeviceCommand.h:39
+msgid "Change Record Device"
+msgstr "Cambia Dispositivo di Registrazione"
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:61
+#: ../src/gui/studio/DeviceManagerDialog.cpp:96
+msgid "Manage MIDI Devices"
+msgstr "Gestisci dispositivi MIDI"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:98
+msgid "Play devices"
+msgstr "Dispositivi di riproduzione"
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:76
+#: ../src/gui/studio/DeviceManagerDialog.cpp:106
+#: ../src/gui/studio/DeviceManagerDialog.cpp:165
+msgid "Connection"
+msgstr "Connessione"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:119
+msgid "Banks..."
+msgstr "Banchi..."
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:120
+msgid "Control Events..."
+msgstr "Eventi di controllo..."
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:126
+msgid "Create a new Play device"
+msgstr "Crea un nuovo dispositivo di riproduzione"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:129
+#: ../src/gui/studio/DeviceManagerDialog.cpp:184
+msgid "Delete the selected device"
+msgstr "Elimina il dispositivo selezionato"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:132
+msgid ""
+"Import Bank, Program and Controller data from a Rosegarden file to the "
+"selected device"
+msgstr ""
+"Importa i banchi, i dati del programma e del controller da un file di "
+"Rosegarden all'attuale dispositivo"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:135
+msgid "Export Bank and Controller data to a Rosegarden interchange file"
+msgstr ""
+"Esporta i banchi e i dati del controller in un formato di scambio di "
+"Rosegarden"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:138
+msgid "View and edit Banks and Programs for the selected device"
+msgstr ""
+"Visualizza e modifica i banchi e i programmi per il dispositivo selezionato"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:141
+msgid ""
+"View and edit Control Events for the selected device - these are special "
+"Event types that you can define against your device and control through "
+"Control Rulers or the Instrument Parameter Box "
+msgstr ""
+"Visualizza e modifica gli eventi di controllo per il dispositivo "
+"selezionato\n"
+"- questi sono tipi di evento speciali che puoi definire contro il tuo "
+"dispositivo\n"
+"e controllare attraverso gli Indicatori di Controllo o la Casella\n"
+"Parametri dello Strumento"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:156
+msgid "Record devices"
+msgstr "Dispositivo di registrazione"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:164
+msgid "Current"
+msgstr "Corrente"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:181
+msgid "Create a new Record device"
+msgstr "Crea un nuovo Dispositivo di Registrazione"
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:360
+#: ../src/gui/studio/DeviceEditorDialog.cpp:378
+#: ../src/gui/studio/DeviceManagerDialog.cpp:486
+#: ../src/gui/studio/DeviceManagerDialog.cpp:501
+msgid "New Device"
+msgstr "Nuovo dispositivo"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:703
+msgid "Import from Device in File"
+msgstr "Importa dal dispositivo nel file"
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:55
+msgid "Remap Instrument assigments..."
+msgstr "Rimappatura delle assegnazioni degli strumenti..."
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:62
+msgid "Device or Instrument"
+msgstr "Dispositivo o strumento"
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:65
+msgid "Remap Tracks by all Instruments on a Device or by single Instrument"
+msgstr ""
+"Rimappatura delle tracce per tutti gli strumenti su un dispositivo o un "
+"singolo strumento"
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:74
+msgid "Choose Source and Destination"
+msgstr "Scegli la sorgente e la destinazione"
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:77
+msgid "From"
+msgstr "Da"
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:78
+msgid "To"
+msgstr "A"
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:120
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:121
+msgid "<no devices>"
+msgstr "<nessun dispositivo>"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:155
+msgid "Show Audio &Faders"
+msgstr "Mostra i &fader audio"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:160
+msgid "Show Synth &Faders"
+msgstr "Mostra i &fader del sintetizzatore"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:165
+msgid "Show &Submasters"
+msgstr "Mostra i &sottoprincipali"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:170
+msgid "Show &Plugin Buttons"
+msgstr "Mostra i pulsanti dei &plugin"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:175
+msgid "Show &Unassigned Faders"
+msgstr "Mostra i fader non assegnati"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:184
+#, c-format
+msgid ""
+"_n: 1 Input\n"
+"%n Inputs"
+msgstr ""
+"1 Input\n"
+"%n Input"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:194
+msgid "No Submasters"
+msgstr "No Submasters"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:203
+#, c-format
+msgid ""
+"_n: 1 Submaster\n"
+"%n Submasters"
+msgstr ""
+"1 Submaster\n"
+"%n Submaster"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:279
+msgid "Audio Mixer"
+msgstr "Mixer Audio"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:311
+msgid "Record input source"
+msgstr "Registra la sorgente in entrata"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:322
+msgid "Output destination"
+msgstr "Destinazione in uscita"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:336
+#: ../src/gui/studio/AudioMixerWindow.cpp:495
+msgid "Pan"
+msgstr "Pan"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:355
+msgid "Mono or stereo"
+msgstr "Mono o stereo"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:364
+#: ../src/gui/studio/AudioMixerWindow.cpp:513
+msgid "Mute"
+msgstr "Muto"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:373 rc.cpp:408
+#, no-c-format
+msgid "Solo"
+msgstr "Solo"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:382
+msgid "Arm recording"
+msgstr "Arm recording"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:400
+#, c-format
+msgid "Audio %1"
+msgstr "Audio %1"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:404
+#, c-format
+msgid "Synth %1"
+msgstr "Sintetizzatore %1"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:578
+#: ../src/gui/studio/AudioMixerWindow.cpp:580
+msgid "Audio master output level"
+msgstr "Livello di uscita dell'audio principale"
+
+#: ../src/gui/studio/SynthPluginManagerDialog.cpp:71
+msgid "Manage Synth Plugins"
+msgstr "Gestisci Plugin del sintetizzatore"
+
+#: ../src/gui/studio/SynthPluginManagerDialog.cpp:78
+msgid "Synth plugins"
+msgstr "Plugin del sintetizzatore"
+
+#: ../src/gui/studio/SynthPluginManagerDialog.cpp:145
+msgid "Controls"
+msgstr "Controlli"
+
+#: ../src/gui/studio/SynthPluginManagerDialog.cpp:152
+msgid "Editor >>"
+msgstr "Editor >>"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:66
+#: ../src/gui/studio/MidiProgramsEditor.cpp:169
+msgid "Bank and Program details"
+msgstr "Dettagli Banco e Programma"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:67
+msgid "Programs"
+msgstr "Programmi"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2711
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:88
+#: ../src/gui/studio/MidiProgramsEditor.cpp:93
+msgid "Percussion"
+msgstr "Percussioni"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:99
+msgid "MSB Value"
+msgstr "Valore MSB"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:107
+msgid ""
+"Selects a MSB controller Bank number (MSB/LSB pairs are always unique for "
+"any Device)"
+msgstr ""
+"Seleziona un numero di banco per il controller MSB (la coppia MSB/LSB è "
+"sempre unica per qualsiasi dispositivo)"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:111
+msgid ""
+"Selects a LSB controller Bank number (MSB/LSB pairs are always unique for "
+"any Device)"
+msgstr ""
+"Seleziona un numero di banco per il controller LSB (la coppia MSB/LSB è "
+"sempre unica per qualsiasi dispositivo)"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:116
+msgid "LSB Value"
+msgstr "Valore LSB"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:254
+#: ../src/gui/studio/MidiProgramsEditor.cpp:541
+#, c-format
+msgid "Key Mapping: %1"
+msgstr "Mappatura del tasto: %1"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:476
+msgid "<no key mapping>"
+msgstr "<nessuna mappatura della tastiera>"
+
+#: ../src/gui/studio/MidiKeyMappingEditor.cpp:57
+#: ../src/gui/studio/MidiKeyMappingEditor.cpp:81
+msgid "Key Mapping details"
+msgstr "Dettagli della mappatura della tastiera"
+
+#: ../src/gui/studio/MidiKeyMappingEditor.cpp:58
+msgid "Pitches"
+msgstr "Altezze"
+
+#: ../src/gui/studio/MidiMixerWindow.cpp:152
+msgid "MIDI Mixer"
+msgstr "Mixer MIDI"
+
+#: ../src/gui/studio/MidiMixerWindow.cpp:199
+msgid "Volume"
+msgstr "Volume"
+
+#: ../src/gui/studio/AudioPluginOSCGUIManager.cpp:444
+msgid "Rosegarden Plugin"
+msgstr "Plugin di Rosegarden"
+
+#: ../src/gui/studio/AudioPluginOSCGUIManager.cpp:447
+#, c-format
+msgid "Rosegarden: %1"
+msgstr "Rosegarden: %1"
+
+#: ../src/gui/studio/AudioPluginOSCGUIManager.cpp:449
+msgid "Rosegarden: %1: %2"
+msgstr "Rosegarden: %1: %2"
+
+#: ../src/gui/studio/AudioPluginOSCGUIManager.cpp:450
+#, c-format
+msgid "Plugin slot %1"
+msgstr "Plugin slot %1"
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:92
+msgid "Add Play Device"
+msgstr "Aggiungi dispositivo di riproduzione"
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:93
+msgid "Add Record Device"
+msgstr "Aggiungi dispositivo di registrazione"
+
+#: ../src/commands/studio/CreateOrDeleteDeviceCommand.h:68
+#: ../src/gui/studio/DeviceEditorDialog.cpp:94
+msgid "Delete Device"
+msgstr "Elimina dispositivo"
+
+#: ../src/gui/editors/segment/PlayList.cpp:77
+#: ../src/gui/studio/DeviceEditorDialog.cpp:156
+#: ../src/gui/studio/DeviceEditorDialog.cpp:361
+msgid "Play"
+msgstr "Riproduci"
+
+#: ../src/commands/segment/SegmentRecordCommand.cpp:37
+#: ../src/gui/studio/DeviceEditorDialog.cpp:156
+#: ../src/gui/studio/DeviceEditorDialog.cpp:379 rc.cpp:394
+#, no-c-format
+msgid "Record"
+msgstr "Registra"
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:256
+msgid "Apply pending changes?"
+msgstr "Applico i cambiamenti apportati?"
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:359
+#: ../src/gui/studio/DeviceEditorDialog.cpp:377
+msgid "<new device>"
+msgstr "<nuovo dispositivo>"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentEraser.cpp:82
+msgid "Click on a segment to delete it"
+msgstr "Clicca su un segmento per cancellarlo"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSplitter.cpp:166
+msgid ""
+"Click on a segment to split it in two; hold Shift to avoid snapping to beat "
+"grid"
+msgstr ""
+"Clicca su un segmento per dividerlo in due; tieni premuto Maiusc per evitare "
+"la divisione sulla griglia del ritmo"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSplitter.cpp:168
+msgid "Click on a segment to split it in two"
+msgstr "Clicca su un segmento per dividerlo in due"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:81
+msgid "Click and drag to select segments"
+msgstr "Clicca e trascina per selezionare i segmenti"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentMover.cpp:154
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:238
+msgid "Move Segment"
+msgstr "Sposta il segmento"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentMover.cpp:154
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:239
+msgid "Move Segments"
+msgstr "Sposta i segmenti"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:217
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:169
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:141
+#: ../src/gui/editors/segment/segmentcanvas/SegmentMover.cpp:210
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:255
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:359
+msgid "Hold Shift to avoid snapping to beat grid"
+msgstr "Tieni premuto Maiusc per evitare la divisione sulla griglia del ritmo"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:485
+msgid ""
+"Click and drag to select segments; middle-click and drag to draw an empty "
+"segment"
+msgstr ""
+"Clicca e trascina per selezionare i segmenti; tasto centrale e trascina per "
+"disegnare un segmento vuoto"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:384
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:502
+msgid ""
+"Click and drag to resize a segment; hold Ctrl as well to rescale its contents"
+msgstr ""
+"Clicca e trascina per ridimensionare un segmento; tieni premuto Control per "
+"riscalare anche il contenuto"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:386
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:504
+msgid "Click and drag to rescale segment"
+msgstr "Clicca e trascina per riscalare il segmento"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:509
+msgid "Click and drag to move segments; hold Ctrl as well to copy them"
+msgstr ""
+"Clicca e trascina per muovere i segmenti; tieni premuto Control per copiarli"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:511
+msgid "Click and drag to copy segments"
+msgstr "Clicca e trascina per copiare i segmenti"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:515
+msgid ""
+"Click and drag to move segment; hold Ctrl as well to copy it; double-click "
+"to edit"
+msgstr ""
+"Clicca e trascina per muovere il segmento; tieni premuto Control per "
+"copiarlo; doppio click per modificarlo"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:517
+msgid "Click and drag to copy segment"
+msgstr "Clicca e trascina per copiare il segmento"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:157
+msgid ""
+"The audio file path does not exist or is not writable.\n"
+"You must set the audio file path to a valid directory in Document Properties "
+"before rescaling an audio file.\n"
+"Would you like to set it now?"
+msgstr ""
+"Il percorso del file audio non esiste o non è scrivibile.\n"
+"Devi impostare il percorso dei file audio su una directory valida nelle\n"
+"Proprietà del documento prima di riscalare un file audio.\n"
+"Vuoi impostarlo adesso?"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:261
+msgid ""
+"Hold Shift to avoid snapping to beat grid; hold Ctrl as well to rescale "
+"contents"
+msgstr ""
+"Tieni premuto Maiusc per evitare di seguire la griglia del ritmo; tieni "
+"premuto anche Control per risclalare i contenuti"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentMover.cpp:325
+msgid "Click and drag to move a segment"
+msgstr "Clicca e trascina per muovere un segmento"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentPencil.cpp:225
+msgid "Hold Shift to avoid snapping to bar lines"
+msgstr "Tieni premuto Maiusc per evitare di dividere alle battute"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentPencil.cpp:283
+msgid "Record or drop audio here"
+msgstr "Registra o lascia qui l'audio"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentPencil.cpp:289
+msgid ""
+"Click and drag to draw an empty segment. Control+Alt click and drag to draw "
+"in overlap mode."
+msgstr ""
+"Clicca e trascina per disegnare un segmento vuoto. Control+Alt clicca e "
+"trascina per disegnarlo in modalità sovrapposta."
+
+#: ../src/gui/editors/segment/TrackLabel.cpp:77
+msgid ""
+"Click and hold with left mouse button to assign this Track to an Instrument."
+msgstr ""
+"Tieni premuto il tasto sinistro per assegnare questa Traccia a uno Strumento."
+
+#: ../src/gui/editors/segment/TrackLabel.cpp:191
+msgid "Change track name"
+msgstr "Cambia il nome della traccia"
+
+#: ../src/gui/editors/segment/TrackLabel.cpp:192
+msgid "Enter new track name"
+msgstr "Inserisci il nuovo nome della traccia"
+
+#: ../src/gui/editors/segment/TrackEditor.cpp:648
+msgid "Turn Repeating Segment into Real Copies"
+msgstr "Trasforma il segmento ripetuto in copie"
+
+#: ../src/gui/editors/segment/TrackEditor.cpp:650
+msgid "Turn Repeating Segments into Real Copies"
+msgstr "Trasforma i segmenti ripetuti in copie"
+
+#: ../src/gui/editors/segment/TrackEditor.cpp:814
+msgid ""
+"You can't drop files into Rosegarden from this client. Try using Konqueror "
+"instead."
+msgstr ""
+"Non puoi aprire i file in Rosegarden con questo client. Prova ad usare "
+"Konqueror piuttosto."
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:85
+msgid "Manage Triggered Segments"
+msgstr "Gestisci dei segmenti attivati"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:89
+msgid "ID"
+msgstr "ID"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:735
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:93
+msgid "Base velocity"
+msgstr "Velocità di base"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:94
+msgid "Triggers"
+msgstr "Attivatori"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:115
+msgid "Add a Triggered Segment"
+msgstr "Aggiungi un segmento attivato"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:119
+msgid "Delete a Triggered Segment"
+msgstr "Cancella un segmento attivato"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:123
+msgid "Delete All Triggered Segments"
+msgstr "Cancella tutti i segmenti attivati"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:127
+msgid "Close the Triggered Segment Manager"
+msgstr "Chiudi il gestore dei segmenti attivati"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:169
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:245
+msgid "<no label>"
+msgstr "<nessuno>"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:248
+msgid ""
+"_n: %1 on 1 track\n"
+"%1 on %n tracks"
+msgstr ""
+"%1 su 1 traccia\n"
+"%1 su %n tracce"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:284
+msgid ""
+"This will remove all triggered segments from the whole composition. Are you "
+"sure?"
+msgstr ""
+"Questo rimuoverà tutti i segmenti attivati dall'intera composizione. Sei "
+"sicuro?"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:288
+msgid "Remove all triggered segments"
+msgstr "Rimuovi tutti i segmenti attivati"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:313
+msgid "Trigger Segment Duration"
+msgstr "Durata del segmento attivo"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:336
+#, c-format
+msgid ""
+"_n: This triggered segment is used 1 time in the current composition. Are "
+"you sure you want to remove it?\n"
+"This triggered segment is used %n times in the current composition. Are you "
+"sure you want to remove it?"
+msgstr ""
+"Questo segmento attivo è usato una volta nella composizione corrente. Sei "
+"sicuro di volerlo rimuovere?\n"
+"Questo segmento attivo è usato %n volte nella composizione corrente. Sei "
+"sicuro di volerlo rimuovere?"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:400
+msgid "Pa&ste as New Triggered Segment"
+msgstr "Incoll&a come nuovo segmento attivo"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1169
+#: ../src/gui/editors/segment/MarkerEditor.cpp:399
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:412
+#: ../src/gui/editors/tempo/TempoView.cpp:622
+msgid "&Musical Times"
+msgstr "Tempi &Musicali"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1179
+#: ../src/gui/editors/segment/MarkerEditor.cpp:409
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:422
+#: ../src/gui/editors/tempo/TempoView.cpp:632
+msgid "&Real Times"
+msgstr "Tempo &reale"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1189
+#: ../src/gui/editors/segment/MarkerEditor.cpp:419
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:432
+#: ../src/gui/editors/tempo/TempoView.cpp:642
+msgid "Ra&w Times"
+msgstr "Tempi &puri"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:83
+msgid "Manage Markers"
+msgstr "Gestisci marcatori"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:86
+msgid "Marker time "
+msgstr "Tempo del marcatore "
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:87
+msgid "Marker text "
+msgstr "Testo del marcatore"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:88
+msgid "Marker description "
+msgstr "Descrizione marcatore "
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:95
+msgid "Pointer position"
+msgstr "Posizione del puntatore"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:100
+msgid "Real time:"
+msgstr "Tempo reale:"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:103
+msgid "In measure:"
+msgstr "Nella battuta:"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:121
+msgid "Add a Marker"
+msgstr "Aggiungi un marcatore"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:125
+msgid "Delete a Marker"
+msgstr "Elimina un marcatore"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:129
+msgid "Delete All Markers"
+msgstr "Elimina tutti i marcatori"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:133
+msgid "Close the Marker Editor"
+msgstr "Chiudi l'editor del marcatore"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:296
+msgid "Remove all markers"
+msgstr "Rimuovi tutti i marcatori"
+
+#: ../src/gui/editors/segment/PlayList.cpp:76
+msgid "Add..."
+msgstr "Aggiungi..."
+
+#: ../src/gui/editors/segment/PlayList.cpp:78
+msgid "Move Up"
+msgstr "Sposta in alto"
+
+#: ../src/gui/editors/segment/PlayList.cpp:79
+msgid "Move Down"
+msgstr "Sposta in basso"
+
+#: ../src/gui/editors/segment/PlayList.cpp:124
+msgid "Select one or more Rosegarden files"
+msgstr "Seleziona uno o più file di Rosegarden"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:73
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:55
+msgid "<not showing>"
+msgstr "<non sto mostrando>"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:89
+msgid "Manage Control Events"
+msgstr "Gestisci eventi del controller"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:91
+msgid "<no device>"
+msgstr "<nessun dispositivo>"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:99
+msgid " Control Events for %1 (device %2)"
+msgstr "Eventi di controllo per %1 (dispositivo %2)"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:104
+msgid "Control Event name "
+msgstr "Nome evento di controllo"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:105
+msgid "Control Event type "
+msgstr "Tipo evento di controllo"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:106
+msgid "Control Event value "
+msgstr "Valore evento di controllo"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:107
+msgid "Description "
+msgstr "Descrizione "
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:108
+msgid "Min "
+msgstr "Minimo "
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:109
+msgid "Max "
+msgstr "Massimo "
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:110
+msgid "Default "
+msgstr "Predefinito "
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:111
+msgid "Color "
+msgstr "Colore "
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:112
+msgid "Position on instrument panel"
+msgstr "Posizione sul pannello degli strumenti"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:136
+msgid "Add a Control Parameter to the Studio"
+msgstr "Aggiungi un parametro di controllo allo Studio"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:140
+msgid "Delete a Control Parameter from the Studio"
+msgstr "Elimina un parametro di controllo dallo Studio"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:144
+msgid "Close the Control Parameter editor"
+msgstr "Chiudi l'editor del parametro di controllo"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:221
+msgid "<default>"
+msgstr "<predefinito>"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:62
+msgid "Edit Control Parameter"
+msgstr "Modifica parametro di controllo"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:71
+msgid "Control Event Properties"
+msgstr "Proprietà Eventi di controllo"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:77
+msgid "Name:"
+msgstr "Nome:"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:93
+msgid "Control Event value:"
+msgstr "Valore evento di controllo:"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:97
+msgid "Minimum value:"
+msgstr "Valore minimo:"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:101
+msgid "Maximum value:"
+msgstr "Valore massimo:"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:105
+msgid "Default value:"
+msgstr "Valore predefinito:"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:109
+msgid "Color:"
+msgstr "Colore:"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:113
+msgid "Instrument Parameter Box position:"
+msgstr "Posizione Casella parametri dello strumento:"
+
+#: ../src/gui/editors/segment/TrackButtons.cpp:209
+#: ../src/gui/editors/segment/TrackButtons.cpp:585
+#: ../src/gui/editors/segment/TrackButtons.cpp:935
+#: ../src/gui/editors/segment/TrackButtons.cpp:1127
+msgid "<no instrument>"
+msgstr "<nesssuno strumento>"
+
+#: ../src/gui/editors/segment/TrackButtons.cpp:352
+#: ../src/gui/editors/segment/TrackButtons.cpp:1094
+msgid "<untitled audio>"
+msgstr "<audio senza titolo>"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:130
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:662
+#: ../src/gui/editors/segment/TrackButtons.cpp:354
+#: ../src/gui/editors/segment/TrackButtons.cpp:1096
+msgid "<untitled>"
+msgstr "<senza titolo>"
+
+#: ../src/gui/editors/segment/TrackButtons.cpp:1058
+msgid "Mute track"
+msgstr "Zittisci la traccia"
+
+#: ../src/gui/editors/segment/TrackButtons.cpp:1063
+msgid "Record on this track"
+msgstr "Registra su questa traccia"
+
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:88
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:1015
+msgid "Segment"
+msgstr "Segmento"
+
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:89
+msgid "Segment Parameters"
+msgstr "Parametri del segmento"
+
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:366
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:697
+msgid "%1 ms"
+msgstr "%1 millisecondi"
+
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:1031
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:910
+msgid "Highest playable note"
+msgstr "Nota più alta riproducibile"
+
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:1051
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:930
+msgid "Lowest playable note"
+msgstr "Nota più bassa riproducibile"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:93
+msgid "Track Parameters"
+msgstr "Parametri di traccia"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:137
+msgid "Playback parameters"
+msgstr "Parametri della riproduzione"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:172
+msgid "Recording filters"
+msgstr "Filtri di registrazione"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:191
+msgid "Channel"
+msgstr "Canale"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:203
+msgid "Staff export options"
+msgstr "Opzioni di esportazione del rigo"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:220
+msgid "Notation size:"
+msgstr "Dimensione della notazione:"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:225
+msgid "Small"
+msgstr "Piccolo"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:226
+msgid "Tiny"
+msgstr "Piccolissimo"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:233
+msgid "Bracket type:"
+msgstr "Tipo di parentesi:"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:237
+msgid "-----"
+msgstr "-----"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:238
+msgid "[----"
+msgstr "[----"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:239
+msgid "----]"
+msgstr "----]"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:240
+msgid "[---]"
+msgstr "[---]"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:241
+msgid "{----"
+msgstr "{----"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:242
+msgid "----}"
+msgstr "----}"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:243
+msgid "{[---"
+msgstr "{[---"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:244
+msgid "---]}"
+msgstr "---]}"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:253
+msgid "Create segments with"
+msgstr "Crea segmenti con:"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:264
+msgid "Preset"
+msgstr "Preset"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:272
+msgid "Load"
+msgstr "Carica"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:282
+msgid "treble"
+msgstr "alto"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:283
+msgid "bass"
+msgstr "basso"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:284
+msgid "crotales"
+msgstr "cimbali"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:285
+msgid "xylophone"
+msgstr "xilofono"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:286
+msgid "guitar"
+msgstr "chitarra"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:287
+msgid "contrabass"
+msgstr "contrabbasso"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:288
+msgid "celesta"
+msgstr "celesta"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:289
+msgid "old celesta"
+msgstr "celesta antica"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:290
+msgid "french"
+msgstr "francese"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:291
+msgid "soprano"
+msgstr "soprano"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:292
+msgid "mezzosoprano"
+msgstr "mezzosoprano"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:293
+msgid "alto"
+msgstr "alto"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:294
+msgid "tenor"
+msgstr "tenore"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:295
+msgid "baritone"
+msgstr "baritono"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:296
+msgid "varbaritone"
+msgstr "varbaritone"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:297
+msgid "subbass"
+msgstr "sottobasso"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:327
+msgid "Lowest"
+msgstr "Più bassa"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:329
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:336
+msgid "---"
+msgstr "---"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:331
+msgid "Choose the lowest suggested playable note, using a staff"
+msgstr "Scegli la nota più bassa riproducibile, usando il rigo"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:334
+msgid "Highest"
+msgstr "Più alta"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:338
+msgid "Choose the highest suggested playable note, using a staff"
+msgstr "Scegli la nota più alta riproducibile, usando il rigo"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:666
+msgid "[ Track %1 - %2 ]"
+msgstr "[ Traccia %1 - %2 ]"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:985
+msgid "The instrument preset database is corrupt. Check your installation."
+msgstr ""
+"Il database predefinito degli strumenti è rovinato. Controlla "
+"l'installazione."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:173
+#: ../src/gui/editors/parameters/InstrumentParameterBox.cpp:54
+msgid "Instrument Parameters"
+msgstr "Parametri dello strumento"
+
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:85
+msgid "Variation"
+msgstr "Variazione"
+
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:86
+msgid "Program"
+msgstr "Programma"
+
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:87
+msgid "Channel out"
+msgstr "Channel out"
+
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:215
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:221
+msgid "[ %1 ]"
+msgstr "[ %1 ]"
+
+#: ../src/gui/editors/matrix/MatrixEraser.cpp:58
+#: ../src/gui/editors/matrix/MatrixMover.cpp:71
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:67
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:77
+msgid "Switch to Draw Tool"
+msgstr "Commuta per trascinare lo strumento"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:75
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:69
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:71
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:81
+#: ../src/gui/editors/notation/ClefInserter.cpp:57
+#: ../src/gui/editors/notation/GuitarChordInserter.cpp:63
+#: ../src/gui/editors/notation/NotationSelector.cpp:87
+#: ../src/gui/editors/notation/NoteInserter.cpp:113
+#: ../src/gui/editors/notation/RestInserter.cpp:72
+#: ../src/gui/editors/notation/TextInserter.cpp:61
+msgid "Switch to Erase Tool"
+msgstr "Tasto per lo Strumento Cancella"
+
+#: ../src/gui/editors/matrix/MatrixEraser.cpp:62
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:73
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:75
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:85
+msgid "Switch to Move Tool"
+msgstr "Commuta per muovere lo strumento"
+
+#: ../src/gui/editors/matrix/MatrixEraser.cpp:68
+#: ../src/gui/editors/matrix/MatrixMover.cpp:81
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:79
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:93
+msgid "Switch to Resize Tool"
+msgstr "Commuta per ridimensionare lo strumento"
+
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:446
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:579
+msgid "Click and drag to select; middle-click and drag to draw new note"
+msgstr ""
+"Clicca e trascina per selezionare; tasto centrale e trascina per disegnare "
+"una nuova nota"
+
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:324
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:597
+msgid "Click and drag to resize selected notes"
+msgstr "Clicca e trascina per ridimensionare le note selezionate"
+
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:599
+msgid "Click and drag to resize note"
+msgstr "Clicca e trascina per ridimensionare la nota"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:471
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:604
+msgid "Click and drag to move selected notes; hold Ctrl as well to copy"
+msgstr ""
+"Clicca e trascina per muovere le note selezionate; tieni premuto Control per "
+"copiare"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:473
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:606
+msgid "Click and drag to copy selected notes"
+msgstr "Clicca e trascina per copiare le note selezionate"
+
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:610
+msgid "Click and drag to move note; hold Ctrl as well to copy"
+msgstr "Clicca e trascina muovere la nota; tieni premuto Control per copiare"
+
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:612
+msgid "Click and drag to copy note"
+msgstr "Clicca e trascina per copiare la nota"
+
+#: ../src/gui/editors/matrix/MatrixEraser.cpp:54
+#: ../src/gui/editors/matrix/MatrixMover.cpp:67
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:65
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:63
+#: ../src/gui/editors/notation/ClefInserter.cpp:53
+#: ../src/gui/editors/notation/GuitarChordInserter.cpp:59
+#: ../src/gui/editors/notation/NotationEraser.cpp:67
+#: ../src/gui/editors/notation/NoteInserter.cpp:109
+#: ../src/gui/editors/notation/RestInserter.cpp:68
+#: ../src/gui/editors/notation/TextInserter.cpp:57
+msgid "Switch to Select Tool"
+msgstr "Tasto per lo Strumento Selezione"
+
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:218
+msgid "Resize Event"
+msgstr "Ridimensiona evento"
+
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:221
+msgid "Resize Events"
+msgstr "Ridimensiona eventi"
+
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:326
+msgid "Click and drag to resize a note"
+msgstr "Clicca e trascina per ridimensionare una nota"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:328
+msgid "Copy and Move Event"
+msgstr "Copia e sposta l'evento"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:330
+msgid "Copy and Move Events"
+msgstr "Copia e sposta gli eventi"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:334
+msgid "Move Event"
+msgstr "Sposta evento"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:336
+msgid "Move Events"
+msgstr "Sposta eventi"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:465
+msgid "Click and drag to move a note; hold Ctrl as well to copy it"
+msgstr ""
+"Clicca e trascina per muovere una nota; tieni premuto Control per copiarla"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:467
+msgid "Click and drag to copy a note"
+msgstr "Clicca e trascina per copiare una nota"
+
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:361
+msgid "Click and drag to draw a note; Shift to avoid snapping to grid"
+msgstr ""
+"Clicca e trascina per disegnare una nota; Maiusc per evitare di seguire la "
+"griglia"
+
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:363
+msgid "Click and drag to draw a note"
+msgstr "Clicca e trascina per disegnare una nota"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:437
+#: ../src/gui/editors/matrix/MatrixView.cpp:3053
+msgid "Couldn't apply piano roll layout"
+msgstr "Non posso applicare la visualizzazione piano"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:663
+msgid "Resi&ze"
+msgstr "Ridimen&siona"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:669
+#: ../src/gui/editors/notation/NotationView.cpp:1919
+msgid "C&hord Insert Mode"
+msgstr "Modo inserimento a&ccordi"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:676
+#: ../src/gui/editors/notation/NotationView.cpp:1778
+msgid "Ste&p Recording"
+msgstr "&Registra passo passo"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:694
+msgid "&Legato"
+msgstr "&Legato"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:708
+msgid "Set to Current Velocity"
+msgstr "Imposta alla velocità attuale"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:712
+msgid "Set Event &Velocities..."
+msgstr "Imposta &velocità degli eventi..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:716
+msgid "Trigger Se&gment..."
+msgstr "Attiva il se&gmento"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:720
+msgid "Remove Triggers..."
+msgstr "Rimuovi gli attivatori"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1153
+#: ../src/gui/editors/matrix/MatrixView.cpp:724
+#: ../src/gui/editors/tempo/TempoView.cpp:606
+msgid "Select &All"
+msgstr "Seleziona t&utto"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:732
+#: ../src/gui/editors/notation/NotationView.cpp:2325
+msgid "Cursor &Back"
+msgstr "Cursore indietro"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:736
+#: ../src/gui/editors/notation/NotationView.cpp:2329
+msgid "Cursor &Forward"
+msgstr "Cursore avanti"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:740
+#: ../src/gui/editors/notation/NotationView.cpp:2333
+msgid "Cursor Ba&ck Bar"
+msgstr "Cursore indietro per battute"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:744
+#: ../src/gui/editors/notation/NotationView.cpp:2337
+msgid "Cursor For&ward Bar"
+msgstr "Cursore avanti per battute"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:748
+#: ../src/gui/editors/notation/NotationView.cpp:2341
+msgid "Cursor Back and Se&lect"
+msgstr "Cursore indietro e se&leziona"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:752
+#: ../src/gui/editors/notation/NotationView.cpp:2345
+msgid "Cursor Forward and &Select"
+msgstr "Cursore avanti e &seleziona"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:756
+#: ../src/gui/editors/notation/NotationView.cpp:2349
+msgid "Cursor Back Bar and Select"
+msgstr "Cursore indietro per battute e seleziona"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:760
+#: ../src/gui/editors/notation/NotationView.cpp:2353
+msgid "Cursor Forward Bar and Select"
+msgstr "Cursore avanti per battute e seleziona"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:764
+#: ../src/gui/editors/notation/NotationView.cpp:2363
+msgid "Cursor to St&art"
+msgstr "Cursore all'inizio"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:770
+#: ../src/gui/editors/notation/NotationView.cpp:2369
+msgid "Cursor to &End"
+msgstr "Cursore alla fine"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:776
+#: ../src/gui/editors/notation/NotationView.cpp:2391
+msgid "Cursor to &Playback Pointer"
+msgstr "Cursore al &punto di riproduzione"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:820
+#: ../src/gui/editors/notation/NotationView.cpp:2435
+msgid "Playback Pointer to &Cursor"
+msgstr "Punto di riproduzione al &cursore"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:826
+#: ../src/gui/editors/notation/NotationView.cpp:2441
+msgid "&Solo"
+msgstr "&Solo"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:841
+#: ../src/gui/editors/notation/NotationView.cpp:2456
+msgid "Set Loop to Selection"
+msgstr "Imposta ripetizione della selezione"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:845
+#: ../src/gui/editors/notation/NotationView.cpp:2460
+msgid "Clear L&oop"
+msgstr "Pulisci il l&oop"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1157
+#: ../src/gui/editors/matrix/MatrixView.cpp:849
+#: ../src/gui/editors/notation/NotationView.cpp:2464
+#: ../src/gui/editors/tempo/TempoView.cpp:610
+msgid "Clear Selection"
+msgstr "Pulisci selezione"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1149
+#: ../src/gui/editors/matrix/MatrixView.cpp:854
+#: ../src/gui/editors/notation/NotationView.cpp:2471
+msgid "&Filter Selection"
+msgstr "&Filtra la selezione"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:879
+msgid "&No Snap"
+msgstr "Se&nza battuta"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:884
+msgid "Snap to Bea&t"
+msgstr "Spezza sul ba&ttito"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:888
+msgid "Snap to &Bar"
+msgstr "Spezza alla &battuta"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:908
+#, c-format
+msgid "Snap to %1"
+msgstr "Spezza a %1"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:917
+msgid "Show Instrument Parameters"
+msgstr "Mostra i Parametri dello strumento"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:922
+#: ../src/gui/editors/notation/NotationView.cpp:1850
+msgid "Show Ch&ord Name Ruler"
+msgstr "Mostra Indicatore Nome Accordi"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:926
+#: ../src/gui/editors/notation/NotationView.cpp:1858
+msgid "Show &Tempo Ruler"
+msgstr "Mostra l'indicatore del ri&tmo"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1238
+#: ../src/gui/editors/notation/NotationView.cpp:3245
+#, c-format
+msgid ""
+"_n: 1 event selected \n"
+" %n events selected "
+msgstr ""
+" 1 evento selezionato \n"
+" %n eventi selezionati"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1241
+#: ../src/gui/editors/notation/NotationView.cpp:3247
+msgid " No selection "
+msgstr " Nessuna selezione"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1348
+#: ../src/gui/editors/matrix/MatrixView.cpp:1360
+#: ../src/gui/editors/matrix/MatrixView.cpp:2079
+#: ../src/gui/editors/notation/NotationView.cpp:5869
+msgid "Quantizing..."
+msgstr "Quantizzazione in corso..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1370
+#: ../src/gui/editors/notation/NotationView.cpp:5407
+msgid "Collapsing notes..."
+msgstr "Unione delle note in corso..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1381
+msgid "Making legato..."
+msgstr "Costruzione del legato in corso..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1476
+msgid "Note: %1 (%2.%3s)"
+msgstr "Nota: %1 (%2.%3s)"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1531
+#: ../src/gui/editors/notation/NotationView.cpp:7206
+msgid "Time: %1 (%2.%3s)"
+msgstr "Tempo: %1 (%2.%3s)"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1604
+#: ../src/gui/editors/notation/NotationView.cpp:4744
+#: ../src/gui/editors/notation/NotationView.cpp:4773
+msgid "Cutting selection to clipboard..."
+msgstr "Incolla la selezione negli appunti..."
+
+#: ../src/gui/editors/eventlist/EventView.cpp:912
+#: ../src/gui/editors/matrix/MatrixView.cpp:1636
+#: ../src/gui/editors/notation/NotationSelectionPaster.cpp:82
+msgid "Couldn't paste at this point"
+msgstr "Non è possibile incollare in questo punto"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1647
+#: ../src/gui/editors/notation/NotationView.cpp:4754
+msgid "Deleting selection..."
+msgstr "Eliminazione della selezione in corso..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1833
+#: ../src/gui/editors/notation/NotationView.cpp:5617
+#, c-format
+msgid "Unknown note insert action %1"
+msgstr "Azione %1 di inserimento nota sconosciuta"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1837
+#: ../src/gui/editors/matrix/MatrixView.cpp:2857
+#: ../src/gui/editors/notation/NotationView.cpp:5621
+msgid "Inserting note"
+msgstr "Inserimento nota"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2091
+msgid "Unquantizing..."
+msgstr "Dequantizzazione in corso..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2120
+msgid " Grid: "
+msgstr " Griglia: "
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2134
+msgid "Unit"
+msgstr "Unità"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2136
+msgid "Beat"
+msgstr "Ritmo"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2138
+msgid "Bar"
+msgstr "Battuta"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2159
+msgid " Velocity: "
+msgstr " Velocità:"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2170
+msgid " Quantize: "
+msgstr " Quantizza:"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2584
+msgid "Raising velocities..."
+msgstr "Aumento delle velocità..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2596
+msgid "Lowering velocities..."
+msgstr "Diminuzione delle velocità..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2611
+msgid "Set Event Velocities"
+msgstr "Imposta velocità dell'evento"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2616
+msgid "Setting Velocities..."
+msgstr "Impostazione velocità..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2665
+msgid "Remove Triggers"
+msgstr "Rimuovi attivatori"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2723
+msgid "%1 - Segment Track #%2 - %3"
+msgstr "%1 - Traccia del segmento #%2 - %3"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2730
+msgid "%1 - All Segments - %2"
+msgstr "%1 - Tutti i segmenti - %2"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2737
+msgid ""
+"_n: %1 - 1 Segment - %2\n"
+"%1 - %n Segments - %2"
+msgstr ""
+"%1 - 1 Segmento - %2\n"
+"%1 - %n Segmenti - %2"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2885
+msgid "Can't insert note: No grid duration selected"
+msgstr "Non posso inserire la nota. Nessuna durata di griglia selezionata"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2935
+msgid " Chord "
+msgstr " Accordo"
+
+#: ../src/gui/editors/matrix/MatrixEraser.cpp:105
+msgid "Click on a note to delete it"
+msgstr "Clicca su una nota per cancellarla"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:89
+msgid "Filter"
+msgstr "Filtro"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:245
+#: ../src/gui/editors/tempo/TempoView.cpp:117
+msgid "Time "
+msgstr "Velocità "
+
+#: ../src/gui/editors/tempo/TempoView.cpp:118
+msgid "Type "
+msgstr "Tipo "
+
+#: ../src/gui/editors/tempo/TempoView.cpp:119
+msgid "Value "
+msgstr "Valore "
+
+#: ../src/gui/editors/tempo/TempoView.cpp:120
+msgid "Properties "
+msgstr "Proprietà "
+
+#: ../src/gui/editors/tempo/TempoView.cpp:208
+msgid "Common, hidden"
+msgstr "Comune, nascosto"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:210
+msgid "Hidden"
+msgstr "Nascosto"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:213
+msgid "Common"
+msgstr "Comune"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:220
+msgid "Time Signature "
+msgstr "Metro "
+
+#: ../src/gui/editors/tempo/TempoView.cpp:245
+msgid "%1.%2%3"
+msgstr "%1.%2%3"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:255
+msgid "%1.%2%3 qpm (%4.%5%6 bpm) "
+msgstr "%1.%2%3 qpm (%4.%5%6 bpm) "
+
+#: ../src/gui/editors/tempo/TempoView.cpp:264
+msgid "Tempo "
+msgstr "Ritmo"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:271
+msgid "<nothing at this filter level>"
+msgstr "<niente a questo livello di filtro>"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:463
+msgid "Delete Tempo or Time Signature"
+msgstr "Cancella Tempo o Metro"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:602
+msgid "&Edit Item"
+msgstr "Modifica ogg&etto"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:834
+msgid "%1 - Tempo and Time Signature Editor"
+msgstr "%1 - Editor di Tempo e Metro"
+
+#: ../src/gui/editors/guitar/GuitarChordEditorDialog.cpp:43
+msgid "Guitar Chord Editor"
+msgstr "Editor degli accordi di chitarra"
+
+#: ../src/gui/editors/guitar/GuitarChordEditorDialog.cpp:51
+msgid "Start fret"
+msgstr "Avvia fret"
+
+#: ../src/gui/editors/guitar/GuitarChordEditorDialog.cpp:58
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:51
+msgid "Root"
+msgstr "Radice"
+
+#: ../src/gui/editors/guitar/GuitarChordEditorDialog.cpp:62
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:55
+msgid "Extension"
+msgstr "Estensione"
+
+#: ../src/gui/editors/guitar/Fingering.cpp:118
+msgid "couldn't parse fingering '%1' in '%2'"
+msgstr "non posso analizzare la diteggiatura \"%1\" in \"%2\""
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:45
+msgid "Guitar Chord Selector"
+msgstr "Selettore degli accordi di chitarra"
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:64
+msgid "beginner"
+msgstr "novizio"
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:65
+msgid "common"
+msgstr "comune"
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:66
+msgid "all"
+msgstr "tutti"
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:86
+msgid "Fingerings"
+msgstr "Diteggiature"
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:419
+msgid "couldn't open file '%1'"
+msgstr "non posso aprire il file \"%1\""
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:428
+#, c-format
+msgid "couldn't parse chord dictionnary : %1"
+msgstr "non posso analizzare il dizionario di accordi : %1"
+
+#: ../src/gui/editors/notation/NoteFontViewer.cpp:87
+#, c-format
+msgid "Note Font Viewer: %1"
+msgstr "Visualizzatore dei font delle note: %1"
+
+#: ../src/gui/editors/notation/NoteFontViewer.cpp:93
+msgid " Component: "
+msgstr " Componente: "
+
+#: ../src/gui/editors/notation/NoteFontViewer.cpp:101
+msgid " View: "
+msgstr " Vista: "
+
+#: ../src/gui/editors/notation/NoteFontViewer.cpp:104
+msgid "Glyphs"
+msgstr "Glifi"
+
+#: ../src/gui/editors/notation/NoteFontViewer.cpp:105
+msgid "Codes"
+msgstr "Codici"
+
+#: ../src/gui/editors/notation/NoteFontViewer.cpp:107
+msgid " Page: "
+msgstr " Pagina: "
+
+#: ../src/gui/editors/notation/ClefInserter.cpp:64
+#: ../src/gui/editors/notation/GuitarChordInserter.cpp:71
+#: ../src/gui/editors/notation/RestInserter.cpp:79
+#: ../src/gui/editors/notation/TextInserter.cpp:68
+msgid "Switch to Inserting Notes"
+msgstr "Tasto per Inserimento Note"
+
+#: ../src/gui/editors/notation/NotationView.cpp:522
+msgid "Close track headers"
+msgstr "Chiudi le intestazioni di traccia"
+
+#: ../src/gui/editors/notation/NotationView.cpp:917
+msgid "Preparing to print..."
+msgstr "Preparazione alla stampa..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:1516
+msgid "Note &Font"
+msgstr "&Font delle note"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1539
+msgid "Si&ze"
+msgstr "Dimen&sione"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1545
+msgid "Show Track Headers"
+msgstr "Mostra le intestazioni di traccia"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1550
+msgid "S&pacing"
+msgstr "S&paziatura"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1572
+msgid "Du&ration Factor"
+msgstr "Fattore di du&rata"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1598
+msgid "Note &Style"
+msgstr "&Stile della nota"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1624
+msgid "Insert Rest"
+msgstr "Inserisci pausa"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1628
+msgid "Switch from Note to Rest"
+msgstr "Passa dalla nota alla pausa"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1633
+msgid "Switch from Rest to Note"
+msgstr "Passa dalla pausa alla nota"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1690
+msgid "No accidental"
+msgstr "Nessun accidente"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1691
+msgid "Follow previous accidental"
+msgstr "Segui l'accidente precedente"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1692
+msgid "Sharp"
+msgstr "Diesis"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1693
+msgid "Flat"
+msgstr "Bemolle"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1694
+msgid "Natural"
+msgstr "Naturale"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1695
+msgid "Double sharp"
+msgstr "Doppio diesis"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1696
+msgid "Double flat"
+msgstr "Doppio bemolle"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1717
+msgid "&Treble Clef"
+msgstr "Chiave di &violino"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1724
+msgid "&Alto Clef"
+msgstr "Chiave d'&Alto"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1731
+msgid "Te&nor Clef"
+msgstr "Chiave di Te&nore"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1738
+msgid "&Bass Clef"
+msgstr "Chiave di &Basso"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1745
+msgid "&Text"
+msgstr "&Testo"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1751
+msgid "&Guitar Chord"
+msgstr "Accordi chitarra"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1784
+msgid "Select from Sta&rt"
+msgstr "Seleziona dall'&inizio"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1788
+msgid "Select to &End"
+msgstr "Seleziona fino alla fin&e"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1792
+msgid "Select Whole St&aff"
+msgstr "Seleziona &tutto il rigo"
+
+#: ../src/commands/edit/CutAndCloseCommand.h:53
+#: ../src/gui/editors/notation/NotationView.cpp:1796
+msgid "C&ut and Close"
+msgstr "Taglia e chi&udi"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1800
+msgid "Pa&ste..."
+msgstr "In&colla..."
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:122
+#: ../src/gui/editors/notation/NotationView.cpp:1808
+msgid "Move to Staff Above"
+msgstr "Muovi al rigo sopra"
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:126
+#: ../src/gui/editors/notation/NotationView.cpp:1812
+msgid "Move to Staff Below"
+msgstr "Muovi al rigo sotto"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1826
+msgid "&Linear Layout"
+msgstr "Visualizzazione &lineare"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1835
+msgid "&Continuous Page Layout"
+msgstr "Visualizzazione su pagina &continua"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1844
+msgid "&Multiple Page Layout"
+msgstr "Visualizzazione su &più pagine"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1854
+msgid "Show Ra&w Note Ruler"
+msgstr "Mostra indicatore delle note pure"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1862
+msgid "Show &Annotations"
+msgstr "Mostra &annotazioni"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1866
+msgid "Show Lily&Pond Directives"
+msgstr "Mostra le direttive di Lily&Pond"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1870
+msgid "Open L&yric Editor"
+msgstr "Apri editor testi"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1912
+msgid "Trip&let Insert Mode"
+msgstr "&Modo inserimento terzine"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1926
+msgid "Grace Insert Mode"
+msgstr "Modo inserimento abbellimenti"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2180
+msgid "&Dump selected events to stderr"
+msgstr "Man&da gli eventi selezionati in stderr"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2248
+msgid "Ma&ke Ornament..."
+msgstr "Crea ornamento..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:2252
+msgid "Trigger &Ornament..."
+msgstr "Attiva &ornamento..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:2256
+msgid "Remove Ornament..."
+msgstr "Rimuovi ornamento..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:2261
+msgid "&None"
+msgstr "&Nessuno"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2289
+msgid "Convert Notation For..."
+msgstr "Conversione della notazione per..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:2298
+msgid "Show &Notes Toolbar"
+msgstr "Mostra la barra delle &note"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2299
+msgid "Show &Rests Toolbar"
+msgstr "Mostra la barra delle pause"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2300
+msgid "Show &Accidentals Toolbar"
+msgstr "Mostra la barra degli &accidenti"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2301
+msgid "Show Cle&fs Toolbar"
+msgstr "Mostra la barra delle &chiavi"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2303
+msgid "Show &Marks Toolbar"
+msgstr "Mostra la barra dei &marcatori"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2305
+msgid "Show &Group Toolbar"
+msgstr "Mostra la barra dei ra&ggruppatori"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2307
+msgid "Show &Layout Toolbar"
+msgstr "Mostra la barra degli strumenti di &visualizzazione"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2311
+msgid "Show M&eta Toolbar"
+msgstr "Mostra la M&eta barra degli strumenti"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2373
+msgid "Cursor &Up Staff"
+msgstr "Cursore sul rigo s&uperiore"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2377
+msgid "Cursor &Down Staff"
+msgstr "Cursore sul rigo inferiore"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2381
+msgid "Cursor Pre&vious Segment"
+msgstr "Cursore al segmento precedente"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2385
+msgid "Cursor Ne&xt Segment"
+msgstr "Cursore al segmento successivo"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2475
+msgid "Push &Left"
+msgstr "Spingi a sinistra"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2479
+msgid "Push &Right"
+msgstr "Spingi a dest&ra"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2483
+msgid "Push &Up"
+msgstr "Spingi in alto"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2487
+msgid "Push &Down"
+msgstr "Spingi in basso"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2491
+msgid "&Restore Positions"
+msgstr "&Ripristina le posizioni"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2495
+msgid "Make &Invisible"
+msgstr "Rendi &invisibile"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2499
+msgid "Make &Visible"
+msgstr "Rendi &visibile"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2503
+msgid "Toggle Dot"
+msgstr "Aggiungi/Togli il punto"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2507
+#: ../src/gui/editors/notation/NotationView.cpp:2511
+msgid "Add Dot"
+msgstr "Aggiungi punto"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2570
+#, c-format
+msgid ""
+"_n: 1 pixel\n"
+"%n pixels"
+msgstr ""
+"1 pixel\n"
+"%n pixel"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2619
+msgid " Font: "
+msgstr " Font: "
+
+#: ../src/gui/editors/notation/NotationView.cpp:2647
+msgid "Unknown font \"%1\", using default"
+msgstr "Font \"%1\" sconosciuto, uso quello predefinito"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2655
+msgid " Size: "
+msgstr " Dimensione: "
+
+#: ../src/gui/editors/notation/NotationView.cpp:2677
+msgid " Spacing: "
+msgstr " Spaziatura: "
+
+#: ../src/gui/editors/notation/NotationView.cpp:2993
+#: ../src/gui/editors/notation/NotationView.cpp:3818
+msgid " Ready."
+msgstr " Pronto."
+
+#: ../src/gui/editors/notation/NotationView.cpp:2998
+msgid "Laying out score..."
+msgstr "Impaginazione della partitura in corso..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:3011
+msgid "Laying out staff %1..."
+msgstr "Impaginazione del rigo %1..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:3020
+msgid "Reconciling staffs..."
+msgstr "Riallineando i pentagrammi..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:3885
+msgid "Sizing and allocating canvas..."
+msgstr "Dimensionando e posizionando i tracciati..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:4050
+msgid "note"
+msgstr "nota"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4050
+msgid "rest"
+msgstr "pausa"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4211
+msgid "%1 - Segment Track #%2 - Notation"
+msgstr "%1 - Traccia segmento #%2 - Notazione"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4217
+msgid "%1 - All Segments - Notation"
+msgstr "%1 - Tutti i segmenti - Notazione"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4222
+msgid ""
+"_n: %1 - Segment - Notation\n"
+"%1 - %n Segments - Notation"
+msgstr ""
+"%1 - Segmento - Notazione\n"
+"%1 - %n Segmenti - Notazione"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4243
+msgid "Grace"
+msgstr "Abbellimento"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4247
+#: ../src/gui/editors/notation/NotationView.cpp:4251
+#: ../src/gui/editors/notation/NotationView.cpp:4255
+msgid "%1 %2"
+msgstr "%1 %2"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4271
+msgid "Hidden annotations"
+msgstr "Annotazioni nascoste"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4293
+msgid "Hidden LilyPond directives"
+msgstr "LilyPond nascosto"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4326
+#, c-format
+msgid "Unknown spacing action %1"
+msgstr "Azione %1 sulla spaziatura sconosciuta"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4384
+#, c-format
+msgid "Unknown proportion action %1"
+msgstr "Azione %1 di proporzione sconosciuta"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4431
+#, c-format
+msgid "Unknown font action %1"
+msgstr "Azione %1 sul carattere sconosciuta"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4449
+#, c-format
+msgid "Unknown font size %1"
+msgstr "Dimensione %1 del carattere sconosciuta"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4453
+#, c-format
+msgid "Unknown font size action %1"
+msgstr "Azione %1 sulla dimensione dei caratteri sconosciuta"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4780
+msgid ""
+"The Restricted paste type requires enough empty space (containing only "
+"rests) at the paste position to hold all of the events to be pasted.\n"
+"Not enough space was found.\n"
+"If you want to paste anyway, consider using one of the other paste types "
+"from the \"Paste...\" option on the Edit menu. You can also change the "
+"default paste type to something other than Restricted if you wish."
+msgstr ""
+"Il modo di incollare Ristretto richiede uno spazio vuoto sufficiente "
+"(contenente solo pause) nella posizione di incollaggio, per poter contenere "
+"tutti gli eventi da incollare.\n"
+"Non è stato trovato spazio sufficiente.\n"
+"Se vuoi incollare comunque, prova ad usare un altro tipo di incollaggio "
+"dall'opzione \"Incolla...\" nel menù \"Modifica\". Puoi anche cambiare "
+"l'azione di incollaggio predefinita, se vuoi."
+
+#: ../src/gui/editors/notation/NotationView.cpp:4800
+msgid "Can't paste multiple Segments into one"
+msgstr "Non è possibile incollare segmenti multipli in uno solo"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4828
+#: ../src/gui/editors/notation/NotationView.cpp:4877
+msgid "Couldn't paste at this point."
+msgstr "Non è possibile incollare in questo punto."
+
+#: ../src/gui/editors/notation/NotationView.cpp:4896
+msgid "Move Events to Staff Above"
+msgstr "Muovi eventi sul rigo sopra"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4924
+msgid "Move Events to Staff Below"
+msgstr "Muovi eventi sul rigo sotto"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5036
+msgid "Pushing selection left..."
+msgstr "Spingendo la selezione a sinistra..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5047
+msgid "Pushing selection right..."
+msgstr "Spingendo la selezione a destra..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5058
+msgid "Pushing selection up..."
+msgstr "Spingendo la selezione in alto..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5069
+msgid "Pushing selection down..."
+msgstr "Spingendo la selezione in basso..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5080
+msgid "Restoring computed positions..."
+msgstr "Ripristino delle posizioni calcolate..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5089
+msgid "Making visible..."
+msgstr "Rendendo visibile..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5098
+msgid "Making invisible..."
+msgstr "Rendendo invisibile..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5185
+msgid "Beaming group..."
+msgstr "Collegamento del gruppo in corso..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5195
+msgid "Auto-beaming selection..."
+msgstr "Auto-collegamento della selezione in corso..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5205
+msgid "Breaking groups..."
+msgstr "Separando i gruppi..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5293
+msgid "Untupleting..."
+msgstr "Eliminazione dei gruppi irregolari..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5301
+msgid "Adding slur..."
+msgstr "Aggiunta in corso di una legatura..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5302
+msgid "slur"
+msgstr "legatura"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5307
+msgid "Adding phrasing slur..."
+msgstr "Aggiunta in corso di una legatura di frase..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5308
+msgid "phrasing slur"
+msgstr "legatura di frase"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5313
+msgid "Adding glissando..."
+msgstr "Aggiunta di un glissando in corso..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5314
+msgid "glissando"
+msgstr "glissando"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5319
+msgid "Adding crescendo..."
+msgstr "Aggiunta di un crescendo in corso..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5320
+#: ../src/gui/editors/notation/NotationView.cpp:5326
+msgid "dynamic"
+msgstr "dynamic"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5325
+msgid "Adding decrescendo..."
+msgstr "Aggiunta di un decrescendo in corso..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5331
+#: ../src/gui/editors/notation/NotationView.cpp:5337
+#: ../src/gui/editors/notation/NotationView.cpp:5343
+#: ../src/gui/editors/notation/NotationView.cpp:5349
+msgid "Adding octave..."
+msgstr "Aggiunta di un'ottava in corso..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5332
+#: ../src/gui/editors/notation/NotationView.cpp:5338
+#: ../src/gui/editors/notation/NotationView.cpp:5344
+#: ../src/gui/editors/notation/NotationView.cpp:5350
+msgid "ottava"
+msgstr "ottava"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5366
+msgid "Can't add overlapping %1 indications"
+msgstr "Non riesco ad aggiungere le indicazioni sovrapposte %1"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5375
+msgid "Making chord..."
+msgstr "Creazione dell'accordo..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5387
+msgid "Normalizing rests..."
+msgstr "Normalizzazione delle pause..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5397
+msgid "Collapsing rests..."
+msgstr "Unione delle pause..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5417
+msgid "Tying notes..."
+msgstr "Legatura delle note in corso..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5427
+msgid "Untying notes..."
+msgstr "Rimozione legatura delle note in corso..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5437
+msgid "Making notes viable..."
+msgstr "Le note vengono rese eseguibili..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5447
+msgid "Removing counterpoint..."
+msgstr "Rimozione del contrappunto"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5457
+msgid "Pointing stems up..."
+msgstr "Ridisegno dei gambi verso l'alto..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5467
+msgid "Pointing stems down..."
+msgstr "Ridisegno dei gambi verso il basso..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5478
+msgid "Restoring computed stem directions..."
+msgstr "Ripristino delle direzioni dei gambi..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5488
+#: ../src/gui/editors/notation/NotationView.cpp:5498
+msgid "Positioning slurs..."
+msgstr "Posizionamento delle legature..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5509
+msgid "Restoring slur positions..."
+msgstr "Ripristino della posizione delle legature..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5519
+#: ../src/gui/editors/notation/NotationView.cpp:5529
+msgid "Positioning ties..."
+msgstr "Posizionamento delle legature..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5540
+msgid "Restoring tie positions..."
+msgstr "Ripristino delle posizioni della legatura..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5550
+msgid "Fixing notation quantization..."
+msgstr "Sto fissando la quantizzazione della notazione..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5560
+msgid "Removing notation quantization..."
+msgstr "Sto rimuovendo la quantizzazione della notazione..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5577
+msgid "Changing to %1 style..."
+msgstr "Cambiamento in corso verso lo stile %1..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5585
+#, c-format
+msgid "Unknown style action %1"
+msgstr "Azione di stile %1 sconosciuta"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5598
+#: ../src/gui/editors/notation/NotationView.cpp:5639
+#: ../src/gui/editors/notation/NotationView.cpp:5695
+msgid "No note duration selected"
+msgstr "Nessuna durata nota selezionata"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5660
+msgid "No rest duration selected"
+msgstr "Nessuna durata di pausa selezionata"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5746
+msgid "No note or rest duration selected"
+msgstr "Nessuna durata di nota o di pausa selezionata"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5757
+#: ../src/gui/editors/notation/NotationView.cpp:5768
+#: ../src/gui/editors/notation/NotationView.cpp:5779
+#: ../src/gui/editors/notation/NotationView.cpp:5790
+#: ../src/gui/editors/notation/NotationView.cpp:5801
+#: ../src/gui/editors/notation/NotationView.cpp:5812
+#: ../src/gui/editors/notation/NotationView.cpp:5823
+msgid "Forcing accidentals..."
+msgstr "Sto forzando gli accidenti..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5834
+msgid "Restoring accidentals..."
+msgstr "Sto ripristinando gli accidenti..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5845
+msgid "Showing cautionary accidentals..."
+msgstr "Sto mostrando gli accidenti di precauzione..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5855
+msgid "Cancelling cautionary accidentals..."
+msgstr "Sto cancellando gli accidenti di precauzione..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5884
+msgid "Interpreting selection..."
+msgstr "Interpretazione della selezione..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5896
+msgid "Setting note durations..."
+msgstr "Impostazione della durate delle note..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5904
+#: ../src/gui/editors/notation/NotationView.cpp:5912
+msgid "Adding dot..."
+msgstr "Aggiunta in corso di un punto..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5934
+msgid "Text: "
+msgstr "Testo: "
+
+#: ../src/gui/editors/notation/NotationView.cpp:5948
+msgid "Fingering: "
+msgstr "Diteggiatura:"
+
+#: ../src/gui/editors/notation/NotationView.cpp:6036
+msgid "Ornament track %1 bar %2"
+msgstr "Ornamento traccia %1 battuta %2"
+
+#: ../src/gui/editors/notation/NotationView.cpp:6038
+#, c-format
+msgid "Ornament bar %1"
+msgstr "Ornamento battuta %1"
+
+#: ../src/gui/editors/notation/NotationView.cpp:6098
+msgid "Remove Ornaments"
+msgstr "Rimuovi gli ornamenti"
+
+#: ../src/gui/editors/notation/NotationView.cpp:6145
+msgid "Estimated key signature shown"
+msgstr "Tonalità stimata"
+
+#: ../src/gui/editors/notation/NotationStaff.cpp:1249
+#: ../src/gui/editors/notation/NotationView.cpp:6202
+msgid "Sustain"
+msgstr "Sustain"
+
+#: ../src/gui/editors/notation/NotationView.cpp:6218
+msgid ""
+"There is no sustain controller defined for this device.\n"
+"Please ensure the device is configured correctly in the Manage MIDI Devices "
+"dialog in the main window."
+msgstr ""
+"Non c'è un controllo del sustain per questo dispositivo.\n"
+"Accertati che il dispositivo sia correttamente configurato alla voce\n"
+"'Gestisci dispositivi MIDI' nella finestra principale."
+
+#: ../src/gui/editors/notation/NotationView.cpp:7250
+msgid "Can't insert note: No note duration selected"
+msgstr "Non posso inserire la nota. Nessuna durata di nota selezionata"
+
+#: ../src/gui/editors/notation/NotationEraser.cpp:61
+#: ../src/gui/editors/notation/NotationSelector.cpp:83
+msgid "Switch to Insert Tool"
+msgstr "Tasto per lo Strumento Inserimento"
+
+#: ../src/gui/editors/notation/NotePixmapFactory.cpp:2303
+#: ../src/gui/editors/notation/NotePixmapFactory.cpp:2347
+msgid "..."
+msgstr "..."
+
+#: ../src/gui/editors/notation/NoteFontFactory.cpp:200
+msgid "Can't obtain a default font -- no fonts found"
+msgstr "Non c'è un font predefinito -- nessun font trovato"
+
+#: ../src/gui/editors/notation/NoteFontMap.cpp:52
+#: ../src/gui/general/PresetGroup.cpp:49
+msgid "unknown error"
+msgstr "errore sconosciuto"
+
+#: ../src/gui/editors/notation/NoteFontMap.cpp:78
+msgid "Can't open font mapping file %1 or %2"
+msgstr "Non è possibile aprire il font %1 o %2"
+
+#: ../src/gui/editors/notation/NoteFontMap.cpp:82
+#, c-format
+msgid "Can't open font mapping file %1"
+msgstr "Non è possibile aprire il font %1"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:52
+msgid "%1-dotted-%2"
+msgstr "%1-puntata-%2"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:54
+msgid "%1-dotted %2"
+msgstr "%1-puntata %2"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:57
+#, c-format
+msgid "dotted-%1"
+msgstr "%1-puntata"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:59
+#, c-format
+msgid "dotted %1"
+msgstr "%1 puntata"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:83
+msgid "sixty-fourth note"
+msgstr "semibiscroma"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:83
+msgid "thirty-second note"
+msgstr "biscroma"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:84
+msgid "sixteenth note"
+msgstr "semicroma"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:84
+msgid "eighth note"
+msgstr "ottava"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:85
+msgid "quarter note"
+msgstr "semiminima"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:85
+msgid "half note"
+msgstr "minima"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:86
+msgid "whole note"
+msgstr "semibreve"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:86
+msgid "double whole note"
+msgstr "breve"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:89
+msgid "sixty-fourth notes"
+msgstr "semibiscrome"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:89
+msgid "thirty-second notes"
+msgstr "biscrome"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:90
+msgid "sixteenth notes"
+msgstr "semicrome"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:90
+msgid "eighth notes"
+msgstr "ottave"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:91
+msgid "quarter notes"
+msgstr "semiminime"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:91
+msgid "half notes"
+msgstr "minime"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:92
+msgid "whole notes"
+msgstr "semibrevi"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:92
+msgid "double whole notes"
+msgstr "brevi"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:96
+#: ../src/gui/editors/notation/NotationStrings.cpp:154
+msgid "%1 triplets"
+msgstr "%1 terzine"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:100
+#: ../src/gui/editors/notation/NotationStrings.cpp:158
+msgid "%1 triplet"
+msgstr "%1 terzina"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:143
+msgid "64th"
+msgstr "sessantaquattresimo"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:143
+msgid "32nd"
+msgstr "trentaduesimo"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:143
+msgid "16th"
+msgstr "16"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:143
+msgid "8th"
+msgstr "8"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:144
+msgid "quarter"
+msgstr "quarto"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:144
+msgid "half"
+msgstr "metà"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:144
+msgid "whole"
+msgstr "semibreve"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:145
+msgid "double whole"
+msgstr "breve"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:148
+msgid "64ths"
+msgstr "sessantaquattresimi"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:148
+msgid "32nds"
+msgstr "trentaduesimi"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:148
+msgid "16ths"
+msgstr "sedicesimi"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:148
+msgid "8ths"
+msgstr "ottavi"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:149
+msgid "quarters"
+msgstr "quarti"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:149
+msgid "halves"
+msgstr "metà"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:149
+msgid "wholes"
+msgstr "semibrevi"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:150
+msgid "double wholes"
+msgstr "brevi"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:278
+msgid "%1 ticks"
+msgstr "%1 punti"
+
+#: ../src/gui/editors/notation/FontViewFrame.cpp:100
+#, c-format
+msgid "Error: Unable to match font name %1"
+msgstr "Errore: non trovo il font %1"
+
+#: ../src/gui/editors/notation/FontViewFrame.cpp:108
+msgid "Warning: No good match for font name %1 (best is %2)"
+msgstr ""
+"Attenzione: non c'è corrispondenza del nome del font %1\n"
+"(il migliore è %2)"
+
+#: ../src/gui/editors/notation/FontViewFrame.cpp:116
+#, c-format
+msgid "Error: Unable to open best-match font %1"
+msgstr "Errore: non riesco a caricare il font corrispondente %1"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:113
+msgid "Track %1 : \"%2\""
+msgstr "Traccia %1 : \"%2\""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:119
+#, c-format
+msgid ""
+"\n"
+"Notate for: %1"
+msgstr ""
+"\n"
+"Annotare per: %1"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:121
+msgid "normal"
+msgstr "normale"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:124
+msgid "small"
+msgstr "piccolo"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:127
+msgid "tiny"
+msgstr "piccolissimo"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:131
+msgid "--"
+msgstr "--"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:156
+msgid ""
+"\n"
+"Size: %1, Bracket: %2 "
+msgstr ""
+"\n"
+"Dimensione: %1, Parentesi: %2 "
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:183
+msgid ""
+"\n"
+"bars [%1-%2] in %3 (tr=%4) : \"%5\""
+msgstr ""
+"\n"
+"battute [%1-%2] in %3 (tr=%4) : \"%5\""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:190
+msgid ""
+"\n"
+"bars [%1-%2] (tr=%3) : \"%4\""
+msgstr ""
+"\n"
+"battute [%1-%2] (tr=%3) : \"%4\""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:240
+msgid "C#"
+msgstr "Do#"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:242
+msgid "Eb"
+msgstr "Mib"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:245
+msgid "F#"
+msgstr "Fa#"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:247
+msgid "G#"
+msgstr "Sol#"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:249
+msgid "Bb"
+msgstr "Sib"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:352
+msgid "%1: %2"
+msgstr "%1: %2"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:355
+#, c-format
+msgid " in %1"
+msgstr " in %1"
+
+#: ../src/gui/editors/notation/NotationStaff.cpp:452
+msgid "Rendering staff %1..."
+msgstr "Disegnando il rigo %1..."
+
+#: ../src/gui/editors/notation/NotationStaff.cpp:515
+msgid "Rendering notes on staff %1..."
+msgstr "Posizionamento delle note sul rigo %1 in corso..."
+
+#: ../src/gui/editors/notation/NotationStaff.cpp:583
+msgid "Positioning staff %1..."
+msgstr "Posizionando il rigo %1..."
+
+#: ../src/gui/editors/notation/NotationSelectionPaster.cpp:85
+msgid "Ready."
+msgstr "Pronto."
+
+#: ../src/gui/editors/notation/RestInserter.cpp:62
+msgid "Dotted rest"
+msgstr "Pausa puntata"
+
+#: ../src/gui/editors/notation/NoteStyleFileReader.cpp:57
+#, c-format
+msgid "Can't open style file %1"
+msgstr "Non è possibile aprire il file %1 dello stile"
+
+#: ../src/gui/editors/notation/NoteStyleFileReader.cpp:92
+msgid "type is a required attribute of note"
+msgstr "il tipo è un attributo richiesto per la nota"
+
+#: ../src/gui/editors/notation/NoteStyleFileReader.cpp:101
+#, c-format
+msgid "Unrecognised note name %1"
+msgstr "Nome della nota %1 non riconosciuto"
+
+#: ../src/gui/editors/notation/NoteStyleFileReader.cpp:108
+msgid "global element must precede note elements"
+msgstr "l'elemento globale deve precedere gli elementi nota"
+
+#: ../src/gui/editors/notation/NoteStyleFileReader.cpp:137
+msgid ""
+"global and note elements may have shape or charname attribute, but not both"
+msgstr ""
+"gli elementi globali e le note possono avere attributi di forma o di nome, "
+"ma non entrambi."
+
+#: ../src/gui/editors/notation/NotationVLayout.cpp:493
+msgid ""
+"Spanned note at %1 has no HEIGHT_ON_STAFF property!\n"
+"This is a bug (the program would previously have crashed by now)"
+msgstr ""
+"Le note incontrate in %1 non hanno la proprietà HEIGHT_ON_STAFF!\n"
+"Questo è un baco (il programma avrebbe dovuto interrompersi...)"
+
+#: ../src/gui/editors/notation/NoteInserter.cpp:82
+msgid "Auto-Beam when appropriate"
+msgstr "Auto-collega quando appropriato"
+
+#: ../src/gui/editors/notation/NoteInserter.cpp:103
+msgid "Dotted note"
+msgstr "Nota puntata"
+
+#: ../src/gui/editors/notation/NoteInserter.cpp:120
+msgid "Switch to Inserting Rests"
+msgstr "Tasto per Inserimento Pause"
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:98
+msgid "Collapse Rests"
+msgstr "Unisci le pause"
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:102
+msgid "Respell as Flat"
+msgstr "Rialtera come bemolle"
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:106
+msgid "Respell as Sharp"
+msgstr "Rialtera come diesis"
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:110
+msgid "Respell as Natural"
+msgstr "Rialtera come naturale"
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:114
+msgid "Collapse Notes"
+msgstr "Unisci le note"
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:130
+msgid "Make Invisible"
+msgstr "Rendi invisibile"
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:134
+msgid "Make Visible"
+msgstr "Rendi visibile"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:129
+msgid "Event filters"
+msgstr "Filtri degli eventi"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:138
+msgid "Rest"
+msgstr "Silenzio"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:139
+msgid "Indication"
+msgstr "Indicazione"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:141
+msgid "Other"
+msgstr "Altro"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:161
+msgid "Triggered Segment Properties"
+msgstr "Proprietà del segmento attivato"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:166
+msgid "Label: "
+msgstr "Etichetta: "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:176
+msgid "Base pitch: "
+msgstr "Altezza di base: "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:183
+msgid "Base velocity: "
+msgstr "Velocità di base: "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:246
+msgid "Duration "
+msgstr "Durata "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:247
+msgid "Event Type "
+msgstr "Tipo di evento "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:248
+msgid "Pitch "
+msgstr "Altezza "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:249
+msgid "Velocity "
+msgstr "Velocità "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:250
+msgid "Type (Data1) "
+msgstr "Tipo (Data1) "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:251
+msgid "Value (Data2) "
+msgstr "Valore (Data2) "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:461
+msgid "(group %1) "
+msgstr "(gruppo %1) "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:519
+msgid "<no events at this filter level>"
+msgstr "<nessun evento a questo livello di filtro>"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:521
+msgid "<no events>"
+msgstr "<nessun evento>"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:696
+msgid "Segment label"
+msgstr "Etichetta del segmento"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:696
+msgid "Label:"
+msgstr "Etichetta:"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1123
+msgid "&Insert Event"
+msgstr "&Inserisci evento"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1130
+msgid "&Delete Event"
+msgstr "&Elimina evento"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1137
+msgid "&Edit Event"
+msgstr "&Modifica evento"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1144
+msgid "&Advanced Event Editor"
+msgstr "Editor &avanzato degli eventi"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1518
+msgid "Open in Event Editor"
+msgstr "Apri nell'editor dell'evento"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1519
+msgid "Open in Expert Event Editor"
+msgstr "Apri nell'editor avanzato degli eventi"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1577
+msgid "%1 - Triggered Segment: %2"
+msgstr "%1 - Segmento attivato: %2"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1592
+msgid "%1 - Segment Track #%2 - Event List"
+msgstr "%1 - Traccia del segmento #%2 - Lista eventi"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1598
+msgid "%1 - %2 Segments - Event List"
+msgstr "%1 - %2 Segmenti - Lista eventi"
+
+#: ../src/gui/rulers/TempoRuler.cpp:131
+msgid "Insert Tempo Change at Playback Position"
+msgstr "Inserisci cambio di tempo alla posizione di riproduzione"
+
+#: ../src/gui/rulers/TempoRuler.cpp:136
+msgid "Delete Tempo Change"
+msgstr "Cancella il cambio di tempo"
+
+#: ../src/gui/rulers/TempoRuler.cpp:140
+msgid "Ramp Tempo to Next Tempo"
+msgstr "Accelera il tempo fino al prossimo tempo"
+
+#: ../src/gui/rulers/TempoRuler.cpp:144
+msgid "Un-Ramp Tempo"
+msgstr "Non accelerare il tempo"
+
+#: ../src/gui/rulers/TempoRuler.cpp:149
+msgid "Edit Tempo..."
+msgstr "Modifica il tempo..."
+
+#: ../src/gui/rulers/TempoRuler.cpp:153
+msgid "Edit Time Signature..."
+msgstr "Cambia Metro..."
+
+#: ../src/gui/rulers/TempoRuler.cpp:588
+msgid "%1.%2%3 (%4.%5%6 bpm)"
+msgstr "%1.%2%3 (%4.%5%6 bpm)"
+
+#: ../src/gui/rulers/TempoRuler.cpp:596
+msgid "%1.%2%3 bpm"
+msgstr "%1.%2%3 bpm"
+
+#: ../src/gui/rulers/TempoRuler.cpp:604
+msgid "%1 - %2.%3%4"
+msgstr "%1 - %2.%3%4"
+
+#: ../src/gui/rulers/ControlRulerEventInsertCommand.cpp:36
+msgid "Insert Controller Event"
+msgstr "Inserisci evento del controller"
+
+#: ../src/gui/rulers/ControlChangeCommand.cpp:35
+msgid "Control Change"
+msgstr "Cambio controllo"
+
+#: ../src/gui/rulers/PropertyViewRuler.cpp:72
+msgid "%1 controller"
+msgstr "%1 controller"
+
+#: ../src/gui/rulers/RawNoteRuler.cpp:453
+msgid "Track #%1, Segment \"%2\" (runtime id %3)"
+msgstr "Traccia #%1, Segmento \"%2\" (runtime id %3)"
+
+#: ../src/gui/rulers/MarkerRuler.cpp:100
+msgid "Insert Marker"
+msgstr "Inserisci marcatore"
+
+#: ../src/gui/rulers/MarkerRuler.cpp:104
+msgid "Insert Marker at Playback Position"
+msgstr "Inserisci marcatore alla posizione di riproduzione"
+
+#: ../src/gui/rulers/MarkerRuler.cpp:109
+msgid "Delete Marker"
+msgstr "Elimina marcatore"
+
+#: ../src/gui/rulers/MarkerRuler.cpp:114
+msgid "Edit Marker..."
+msgstr "Modifica marcatore..."
+
+#: ../src/gui/rulers/MarkerRuler.cpp:119
+msgid ""
+"Click on a marker to move the playback pointer.\n"
+"Shift-click to set a range between markers.\n"
+"Double-click to open the marker editor."
+msgstr ""
+"Clicca su un marcatore per muovere il puntatore di riproduzione.\n"
+"Maiusc-click per impostare un intervallo tra marcatori.\n"
+"Doppio click per aprire l'editor dei marcatori."
+
+#: ../src/gui/rulers/ChordNameRuler.cpp:97
+msgid ""
+"Chord name ruler.\n"
+"Turn it on and off from the Settings->Rulers menu."
+msgstr ""
+"Indicatore dei nomi degli accordi.\n"
+"Si attiva e disattiva dal menu Impostazioni->Indicatori"
+
+#: ../src/gui/rulers/ControlRulerEventEraseCommand.cpp:37
+msgid "Erase Controller Event(s)"
+msgstr "Cancella eventi del controller"
+
+#: ../src/gui/general/EditView.cpp:901
+#: ../src/gui/rulers/ControllerEventsRuler.cpp:188
+msgid "Unsupported Event Type"
+msgstr "Tipo di evento non supportato"
+
+#: ../src/gui/rulers/ControllerEventsRuler.cpp:203
+msgid "Controller Events"
+msgstr "Eventi del controller"
+
+#: ../src/gui/rulers/ControllerEventsRuler.cpp:278
+msgid "Controller Event Number"
+msgstr "Numero eventi del controller"
+
+#: ../src/gui/rulers/ControllerEventsRuler.cpp:471
+msgid "Add line of controllers"
+msgstr "Aggiungi linee di controllo"
+
+#: ../src/gui/rulers/LoopRuler.cpp:89
+msgid ""
+"Click and drag to move the playback pointer.\n"
+"Shift-click and drag to set a range for looping or editing.\n"
+"Shift-click to clear the loop or range.\n"
+"Double-click to start playback."
+msgstr ""
+"Clicca e trascina per posizionare il puntatore della riproduzione.\n"
+"Maiusc+click e trascina per selezionare un intervallo\n"
+" da modificare o riprodurre ciclicamente.\n"
+"Maiusc+click per pulire la selezione.\n"
+"Doppio click per avviare la riproduzione."
+
+#: ../src/gui/general/EditViewBase.cpp:228
+msgid "Set Segment Start Time..."
+msgstr "Imposta il tempo d'inizio del segmento"
+
+#: ../src/gui/general/EditViewBase.cpp:232
+msgid "Set Segment Duration..."
+msgstr "Imposta la durata del segmento..."
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:56
+msgid "Load track parameters preset"
+msgstr "Carica il preset dei parametri di traccia"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:62
+msgid "Convert notation for..."
+msgstr "Converti la notazione per..."
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:86
+msgid "Select preset track parameters for:"
+msgstr "Scegli il preset dei parametri di traccia per:"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:87
+msgid "Create appropriate notation for:"
+msgstr "Crea una notazione appropriata per:"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:89
+msgid "Category"
+msgstr "Categoria"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:95
+msgid "Player Ability"
+msgstr "Abilità dell'esecutore"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:97
+msgid "Amateur"
+msgstr "Amatore"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:98
+msgid "Professional"
+msgstr "Professionista"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:104
+msgid "Only selected segments"
+msgstr "Solo i segmenti selezionati"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:106
+msgid "All segments in this track"
+msgstr "Tutti i segmenti in questa traccia"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:111
+msgid "Only for new segments"
+msgstr "Solo per i segmenti nuovi"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:113
+msgid "Convert existing segments"
+msgstr "Converti i segmenti esistenti"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:39
+#, c-format
+msgid "C%1"
+msgstr "C%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:39
+#, c-format
+msgid "C#%1"
+msgstr "C#%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:39
+#, c-format
+msgid "D%1"
+msgstr "D%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:39
+#, c-format
+msgid "D#%1"
+msgstr "D#%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:40
+#, c-format
+msgid "E%1"
+msgstr "E%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:40
+#, c-format
+msgid "F%1"
+msgstr "F%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:40
+#, c-format
+msgid "F#%1"
+msgstr "F#%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:40
+#, c-format
+msgid "G%1"
+msgstr "G%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:41
+#, c-format
+msgid "G#%1"
+msgstr "G#%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:41
+#, c-format
+msgid "A%1"
+msgstr "A%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:41
+#, c-format
+msgid "A#%1"
+msgstr "A#%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:41
+#, c-format
+msgid "B%1"
+msgstr "B%1"
+
+#: ../src/gui/general/PresetGroup.cpp:95
+#, c-format
+msgid "Can't open preset file %1"
+msgstr "Non è possibile aprire il file dei preset %1"
+
+#: ../src/gui/general/EditView.cpp:744
+msgid "&Halve Durations"
+msgstr "Dimezza le durate"
+
+#: ../src/gui/general/EditView.cpp:748
+msgid "&Double Durations"
+msgstr "Raddoppia le durate"
+
+#: ../src/gui/general/EditView.cpp:806
+msgid "Show Velocity Property Ruler"
+msgstr "Mostra l'indicatore Proprietà Velocità"
+
+#: ../src/gui/general/EditView.cpp:825
+msgid "Insert item"
+msgstr "Inserisci elemento"
+
+#: ../src/gui/general/EditView.cpp:831
+msgid "Erase selected items"
+msgstr "Cancella gli elementi selezionati"
+
+#: ../src/gui/general/EditView.cpp:835
+msgid "Clear ruler"
+msgstr "Pulisci l'indicatore"
+
+#: ../src/gui/general/EditView.cpp:839
+msgid "Insert line of controllers"
+msgstr "Inserisci la linea dei controller"
+
+#: ../src/gui/general/EditView.cpp:843
+msgid "Flip forward"
+msgstr "Salta in avanti"
+
+#: ../src/gui/general/EditView.cpp:847
+msgid "Flip backwards"
+msgstr "Salta all'indietro"
+
+#: ../src/gui/general/EditView.cpp:851
+msgid "Draw property line"
+msgstr "Disegna la linea delle caratteristiche"
+
+#: ../src/gui/general/EditView.cpp:855
+msgid "Select all property values"
+msgstr "Seleziona tutti i valori delle caratteristiche"
+
+#: ../src/gui/general/EditView.cpp:894
+msgid "%1 Controller %2 %3"
+msgstr "%1 Controller %2 %3"
+
+#: ../src/gui/general/EditView.cpp:1066
+msgid "I"
+msgstr "I"
+
+#: ../src/gui/general/EditView.cpp:1066
+msgid "II"
+msgstr "II"
+
+#: ../src/gui/general/EditView.cpp:1066
+msgid "III"
+msgstr "III"
+
+#: ../src/gui/general/EditView.cpp:1066
+msgid "IV"
+msgstr "IV"
+
+#: ../src/gui/general/EditView.cpp:1067
+msgid "V"
+msgstr "V"
+
+#: ../src/gui/general/EditView.cpp:1067
+msgid "VI"
+msgstr "VI"
+
+#: ../src/gui/general/EditView.cpp:1067
+msgid "VII"
+msgstr "VII"
+
+#: ../src/gui/general/EditView.cpp:1067
+msgid "VIII"
+msgstr "VIII"
+
+#: ../src/gui/general/EditView.cpp:1069
+msgid "%1 flat"
+msgstr "%1 bemolle"
+
+#: ../src/gui/general/EditView.cpp:1070
+msgid "%1 sharp"
+msgstr "%1 diesis"
+
+#: ../src/gui/general/EditView.cpp:1085
+msgid "&Insert Note"
+msgstr "&Inserisci nota"
+
+#: ../src/gui/general/EditView.cpp:1091
+msgid "&Upper Octave"
+msgstr "Ottava più &alta"
+
+#: ../src/gui/general/EditView.cpp:1096
+msgid "&Lower Octave"
+msgstr "Ottava più &bassa"
+
+#: ../src/gui/general/EditView.cpp:1268
+msgid "Estimated time signature shown"
+msgstr "Stima del metro mostrata"
+
+#: ../src/gui/general/EditView.cpp:1431
+msgid "Halving durations..."
+msgstr "Dimezzando le durate..."
+
+#: ../src/gui/general/EditView.cpp:1445
+msgid "Doubling durations..."
+msgstr "Raddoppiando le durate..."
+
+#: ../src/gui/general/EditView.cpp:1469
+msgid "Rescaling..."
+msgstr "Riscalamento in corso..."
+
+#: ../src/gui/general/EditView.cpp:1489
+msgid "By number of semitones: "
+msgstr "Per numero di semitoni: "
+
+#: ../src/gui/general/EditView.cpp:1496 ../src/gui/general/EditView.cpp:1518
+msgid "Transposing..."
+msgstr "Trasposizione in corso..."
+
+#: ../src/gui/general/EditView.cpp:1536
+msgid "Transposing up one semitone..."
+msgstr "Trasposizione in alto di un semitono..."
+
+#: ../src/gui/general/EditView.cpp:1545
+msgid "Transposing up one octave..."
+msgstr "Trasposizione in alto di un'ottava..."
+
+#: ../src/gui/general/EditView.cpp:1554
+msgid "Transposing down one semitone..."
+msgstr "Trasposizione in basso di un semitono..."
+
+#: ../src/gui/general/EditView.cpp:1563
+msgid "Transposing down one octave..."
+msgstr "Trasposizione in basso di un'ottava..."
+
+#: ../src/gui/general/EditView.cpp:1575
+msgid "Inverting..."
+msgstr "Invertendo..."
+
+#: ../src/gui/general/EditView.cpp:1587
+msgid "Retrograding..."
+msgstr "Retrocedendo..."
+
+#: ../src/gui/general/EditView.cpp:1599
+msgid "Retrograde inverting..."
+msgstr "Invertendo e retrocedendo..."
+
+#: ../src/gui/general/EditView.cpp:1608
+msgid "Jogging left..."
+msgstr "Andando a sinistra..."
+
+#: ../src/gui/general/EditView.cpp:1623
+msgid "Jogging right..."
+msgstr "Andando a destra..."
+
+#: ../src/sound/AudioFileManager.cpp:660
+#, c-format
+msgid "Downloading file %1"
+msgstr "Scaricando il file %1"
+
+#: ../src/sound/AudioFileManager.cpp:735
+msgid "Converting audio file..."
+msgstr "Conversione del file audio..."
+
+#: ../src/sound/AudioFileManager.cpp:737
+msgid "Resampling audio file..."
+msgstr "Ricampionamento del file audio..."
+
+#: ../src/sound/AudioFileManager.cpp:739
+msgid "Converting and resampling audio file..."
+msgstr "Conversione e ricampionamento del file audio..."
+
+#: ../src/sound/AudioFileManager.cpp:741
+msgid "Importing audio file..."
+msgstr "Importazione del file audio..."
+
+#: ../src/sound/AudioFileManager.cpp:794
+msgid "Failed to convert or resample audio file on import"
+msgstr "Conversione o ricampionamento del file audio non riuscita"
+
+#: ../src/sequencer/main.cpp:46 ../src/sequencer/main.cpp:86
+msgid "RosegardenSequencer"
+msgstr "Sequencer di Rosegarden"
+
+#: ../src/sequencer/main.cpp:54
+msgid "JACK playback and capture ports"
+msgstr "Riproduzione JACK e porte di acquisizione"
+
+#: ../src/commands/segment/SegmentSyncCommand.cpp:38
+#: ../src/commands/segment/SegmentSyncCommand.cpp:44
+#: ../src/commands/segment/SegmentSyncCommand.cpp:55
+#: ../src/commands/segment/SegmentSyncCommand.cpp:63
+msgid "Sync segment parameters"
+msgstr "Sincronizza i parametri del segmento"
+
+#: ../src/commands/segment/RenameTrackCommand.h:52
+msgid "Rename Track"
+msgstr "Rinomina la traccia"
+
+#: ../src/commands/segment/SegmentRepeatToCopyCommand.cpp:39
+msgid "Turn Repeats into Copies"
+msgstr "Trasforma le ripetizioni in copie"
+
+#: ../src/commands/segment/SegmentTransposeCommand.cpp:36
+#: ../src/commands/segment/SegmentTransposeCommand.cpp:42
+msgid "Change segment transposition"
+msgstr "Cambia la trasposizione del segmento"
+
+#: ../src/commands/edit/RescaleCommand.h:50
+#: ../src/commands/segment/AudioSegmentRescaleCommand.h:62
+#: ../src/commands/segment/SegmentRescaleCommand.h:58
+msgid "Stretch or S&quash..."
+msgstr "Dilata o &comprimi..."
+
+#: ../src/commands/segment/SegmentLabelCommand.h:52
+msgid "Re&label..."
+msgstr "Rie&tichettatura..."
+
+#: ../src/commands/segment/AudioSegmentResizeFromStartCommand.cpp:39
+#: ../src/commands/segment/SegmentResizeFromStartCommand.cpp:39
+msgid "Resize Segment"
+msgstr "Ridimensiona segmento"
+
+#: ../src/commands/segment/RemoveTempoChangeCommand.h:58
+msgid "Remove &Tempo Change..."
+msgstr "Rimuovi cambio di ri&tmo..."
+
+#: ../src/commands/segment/SegmentEraseCommand.cpp:40
+#: ../src/commands/segment/SegmentEraseCommand.cpp:52
+msgid "Erase Segment"
+msgstr "Cancella il segmento"
+
+#: ../src/commands/segment/AudioSegmentRescaleCommand.cpp:126
+#: ../src/commands/segment/SegmentRescaleCommand.cpp:102
+msgid "(rescaled)"
+msgstr "(riscalato)"
+
+#: ../src/commands/segment/AudioSegmentRescaleCommand.cpp:127
+#: ../src/commands/segment/SegmentRescaleCommand.cpp:105
+msgid "%1 (rescaled)"
+msgstr "%1 (riscalato)"
+
+#: ../src/commands/segment/PasteToTriggerSegmentCommand.cpp:47
+msgid "Paste as New Triggered Segment"
+msgstr "Incolla come nuovo segmento attivo"
+
+#: ../src/commands/segment/SegmentColourMapCommand.h:52
+msgid "Change Segment Color Map..."
+msgstr "Cambia la mappa colore del segmento..."
+
+#: ../src/commands/segment/SegmentQuickCopyCommand.h:55
+msgid "Quick-Copy Segment"
+msgstr "Copia rapida del segmento"
+
+#: ../src/commands/segment/AudioSegmentSplitCommand.cpp:42
+msgid "Split Audio Segment"
+msgstr "Dividi segmento audio"
+
+#: ../src/commands/segment/AudioSegmentSplitCommand.cpp:103
+#: ../src/commands/segment/SegmentSplitCommand.cpp:135
+msgid " (split)"
+msgstr " (dividi)"
+
+#: ../src/commands/segment/AudioSegmentSplitCommand.cpp:104
+#: ../src/commands/segment/SegmentSplitByRecordingSrcCommand.cpp:120
+#: ../src/commands/segment/SegmentSplitByRecordingSrcCommand.cpp:122
+#: ../src/commands/segment/SegmentSplitCommand.cpp:136
+msgid "%1 (split)"
+msgstr "%1 (diviso)"
+
+#: ../src/commands/segment/SegmentLabelCommand.cpp:40
+msgid "Label Segments"
+msgstr "Etichetta dei segmenti"
+
+#: ../src/commands/segment/OpenOrCloseRangeCommand.cpp:43
+msgid "Open or Close Range"
+msgstr "Apri o chiudi ampiezza"
+
+#: ../src/commands/edit/TransposeCommand.h:55
+#: ../src/commands/segment/SegmentTransposeCommand.h:54
+msgid "Transpose by &Interval..."
+msgstr "Trasponi per &Intervallo..."
+
+#: ../src/commands/segment/SegmentAutoSplitCommand.cpp:148
+msgid "%1 (part)"
+msgstr "%1 (parte)"
+
+#: ../src/commands/segment/AudioSegmentInsertCommand.cpp:51
+#: ../src/commands/segment/SegmentInsertCommand.cpp:43
+#: ../src/commands/segment/SegmentInsertCommand.cpp:56
+msgid "Create Segment"
+msgstr "Crea segmento"
+
+#: ../src/commands/segment/AudioSegmentInsertCommand.cpp:114
+msgid "%1 (inserted)"
+msgstr "%1 (inserito)"
+
+#: ../src/commands/segment/AudioSegmentInsertCommand.cpp:117
+msgid "unknown audio file"
+msgstr "file audio sconosciuto"
+
+#: ../src/commands/segment/CreateTempoMapFromSegmentCommand.cpp:40
+msgid "Set Tempos from Beat Segment"
+msgstr "Imposta il ritmo dal battito del segmento"
+
+#: ../src/commands/segment/SegmentSplitByRecordingSrcCommand.h:52
+msgid "Split by &Recording Source..."
+msgstr "Dividi dalla Sorgente di &Registrazione..."
+
+#: ../src/commands/segment/SegmentColourMapCommand.cpp:40
+msgid "Change Segment Color Map"
+msgstr "Cambia la mappa colore del segmento"
+
+#: ../src/commands/edit/CopyCommand.cpp:64
+#: ../src/commands/segment/SegmentQuickCopyCommand.cpp:57
+msgid "%1 (copied)"
+msgstr "%1 (copiato)"
+
+#: ../src/commands/segment/SegmentColourCommand.h:52
+msgid "Change Segment Color..."
+msgstr "Cambia il colore del segmento..."
+
+#: ../src/commands/segment/SegmentSplitByPitchCommand.cpp:170
+msgid "%1 (upper)"
+msgstr "%1 (più alto)"
+
+#: ../src/commands/segment/SegmentSplitByPitchCommand.cpp:172
+msgid "%1 (lower)"
+msgstr "%1 (più basso)"
+
+#: ../src/commands/segment/SegmentSingleRepeatToCopyCommand.cpp:39
+msgid "Turn Single Repeat into Copy"
+msgstr "Trasforma la ripetizione singola in copia"
+
+#: ../src/commands/segment/AddTempoChangeCommand.h:58
+msgid "Add Te&mpo Change..."
+msgstr "Aggiungi cambio di te&mpo..."
+
+#: ../src/commands/segment/AudioSegmentAutoSplitCommand.h:57
+#: ../src/commands/segment/SegmentAutoSplitCommand.h:53
+msgid "&Split on Silence"
+msgstr "&Dividi sul silenzio"
+
+#: ../src/commands/segment/SetTriggerSegmentBaseVelocityCommand.cpp:39
+msgid "Set Base Velocity"
+msgstr "Imposta la velocità di base"
+
+#: ../src/commands/segment/DeleteRangeCommand.cpp:43
+#: ../src/commands/segment/EraseSegmentsStartingInRangeCommand.cpp:39
+msgid "Delete Range"
+msgstr "Elimina ampiezza"
+
+#: ../src/commands/segment/ChangeCompositionLengthCommand.h:53
+msgid "Change &Composition Start and End..."
+msgstr "Cambia inizio e fine della &composizione..."
+
+#: ../src/commands/segment/MoveTracksCommand.h:51
+msgid "Move Tracks..."
+msgstr "Sposta le tracce..."
+
+#: ../src/commands/segment/SegmentColourCommand.cpp:39
+msgid "Change Segment Color"
+msgstr "Cambia il colore del segmento"
+
+#: ../src/commands/segment/AudioSegmentDistributeCommand.h:66
+msgid "Distribute Audio Segments over MIDI"
+msgstr "Segmenti Audio Distribuiti su MIDI"
+
+#: ../src/commands/segment/AudioSegmentAutoSplitCommand.cpp:147
+msgid "%1 (autosplit %2)"
+msgstr "%1 (suddivisione automatica %2)"
+
+#: ../src/commands/segment/SetTriggerSegmentDefaultRetuneCommand.cpp:39
+msgid "Set Default Retune"
+msgstr "Imposta l'intonazione predefinita"
+
+#: ../src/commands/segment/AddTimeSignatureCommand.h:52
+msgid "Add Time Si&gnature Change..."
+msgstr "Aggiungi Cambiamento Metro..."
+
+#: ../src/commands/segment/AddTriggerSegmentCommand.cpp:42
+msgid "Add Triggered Segment"
+msgstr "Aggiungi segmento attivo"
+
+#: ../src/commands/segment/SetTriggerSegmentDefaultTimeAdjustCommand.cpp:39
+msgid "Set Default Time Adjust"
+msgstr "Imposta la correzione di tempo predefinita "
+
+#: ../src/commands/segment/RemoveTimeSignatureCommand.h:58
+msgid "Remove &Time Signature Change..."
+msgstr "Rimuovi Cambiamento Metro..."
+
+#: ../src/commands/segment/SegmentCommandRepeat.cpp:39
+msgid "Repeat Segments"
+msgstr "Ripeti i segmenti"
+
+#: ../src/commands/segment/AddTracksCommand.h:55
+msgid "Add Tracks..."
+msgstr "Aggiungi le tracce..."
+
+#: ../src/commands/segment/ModifyDefaultTempoCommand.h:51
+msgid "Modify &Default Tempo..."
+msgstr "Modifica il ritmo pre&definito..."
+
+#: ../src/commands/segment/SegmentSplitByPitchCommand.h:61
+msgid "Split by &Pitch..."
+msgstr "Divi&di per altezza..."
+
+#: ../src/commands/segment/DeleteTriggerSegmentCommand.cpp:40
+msgid "Delete Triggered Segment"
+msgstr "Cancella segmento attivo"
+
+#: ../src/commands/segment/SegmentSplitCommand.cpp:42
+msgid "Split Segment"
+msgstr "Dividi segmento"
+
+#: ../src/commands/segment/DeleteTracksCommand.h:51
+msgid "Delete Tracks..."
+msgstr "Elimina le tracce..."
+
+#: ../src/commands/segment/InsertRangeCommand.cpp:42
+msgid "Insert Range"
+msgstr "Inserisci intervallo"
+
+#: ../src/commands/segment/DeleteRangeCommand.h:62
+msgid "Rejoin Command"
+msgstr "Comando Riunisci"
+
+#: ../src/commands/segment/SetTriggerSegmentBasePitchCommand.cpp:39
+msgid "Set Base Pitch"
+msgstr "Imposta l'altezza di base"
+
+#: ../src/commands/segment/PasteConductorDataCommand.cpp:41
+msgid "Paste Tempos and Time Signatures"
+msgstr "Incolla Tempi e Metri"
+
+#: ../src/commands/segment/SegmentSyncClefCommand.cpp:34
+msgid "Sync segment clef"
+msgstr "Sincronizza la chiave del segmento"
+
+#: ../src/commands/matrix/MatrixInsertionCommand.cpp:46
+#: ../src/commands/notation/NoteInsertionCommand.cpp:54
+msgid "Insert Note"
+msgstr "Inserisci nota"
+
+#: ../src/commands/matrix/MatrixEraseCommand.cpp:41
+msgid "Erase Note"
+msgstr "Cancella la nota"
+
+#: ../src/commands/matrix/MatrixPercussionInsertionCommand.cpp:47
+msgid "Insert Percussion Note"
+msgstr "Inserisci nota di percussione"
+
+#: ../src/commands/matrix/MatrixModifyCommand.cpp:43
+msgid "Move Note"
+msgstr "Sposta la nota"
+
+#: ../src/commands/matrix/MatrixModifyCommand.cpp:43
+msgid "Modify Note"
+msgstr "Modifica la nota"
+
+#: ../src/commands/edit/PasteEventsCommand.cpp:98
+msgid "Paste into an existing gap [\"restricted\"]"
+msgstr "Incolla in uno spazio esistente [\"ristretto\"]"
+
+#: ../src/commands/edit/PasteEventsCommand.cpp:100
+msgid "Erase existing events to make room [\"simple\"]"
+msgstr "Cancella gli eventi esistenti per fare spazio [\"semplice\"]"
+
+#: ../src/commands/edit/PasteEventsCommand.cpp:102
+msgid "Move existing events out of the way [\"open-n-paste\"]"
+msgstr "Muovi lontano gli eventi esistenti [\"apri-e-incolla\"]"
+
+#: ../src/commands/edit/PasteEventsCommand.cpp:104
+msgid "Overlay notes, tying against present notes [\"note-overlay\"]"
+msgstr ""
+"Sovrapponi le note, unendole a quelle presenti [\"sovrapposizione-note\"]"
+
+#: ../src/commands/edit/PasteEventsCommand.cpp:106
+msgid "Overlay notes, ignoring present notes [\"matrix-overlay\"]"
+msgstr ""
+"Sovrapponi le note, ignorando quelle presenti [\"sovrapposizione-matrice\"]"
+
+#: ../src/commands/edit/AddDotCommand.h:52
+msgid "&Add Dot"
+msgstr "&Aggiungi punto"
+
+#: ../src/commands/edit/RemoveMarkerCommand.h:55
+msgid "&Remove Marker"
+msgstr "&Rimuovi marcatore"
+
+#: ../src/commands/edit/EventUnquantizeCommand.cpp:43
+#: ../src/commands/edit/EventUnquantizeCommand.cpp:54
+msgid "Unquantize Events"
+msgstr "Dequantizza gli eventi"
+
+#: ../src/commands/edit/ChangeVelocityCommand.h:53
+msgid "&Increase Velocity"
+msgstr "&Aumenta la velocità"
+
+#: ../src/commands/edit/ChangeVelocityCommand.h:54
+msgid "&Reduce Velocity"
+msgstr "&Riduci la velocità"
+
+#: ../src/commands/edit/CopyCommand.cpp:46
+msgid "(excerpt)"
+msgstr "(brano)"
+
+#: ../src/commands/edit/CopyCommand.cpp:60
+msgid "(copied)"
+msgstr "(copiato)"
+
+#: ../src/commands/edit/EventInsertionCommand.cpp:39
+msgid "Insert Event"
+msgstr "Inserisci evento"
+
+#: ../src/commands/edit/InsertTriggerNoteCommand.cpp:55
+msgid "Insert Trigger Note"
+msgstr "Inserisci nota attivata"
+
+#: ../src/commands/edit/CollapseNotesCommand.h:50
+msgid "Collapse &Equal-Pitch Notes"
+msgstr "Unisci le note alla st&essa altezza"
+
+#: ../src/commands/edit/TransposeCommand.h:61
+msgid "&Up a Semitone"
+msgstr "Alza di &un semitono"
+
+#: ../src/commands/edit/TransposeCommand.h:62
+msgid "&Down a Semitone"
+msgstr "Abbassa &di un semitono"
+
+#: ../src/commands/edit/TransposeCommand.h:63
+msgid "Up an &Octave"
+msgstr "Alza di un'&ottava"
+
+#: ../src/commands/edit/TransposeCommand.h:64
+msgid "Down an Octa&ve"
+msgstr "Abbassa di un'otta&va"
+
+#: ../src/commands/edit/TransposeCommand.h:65
+msgid "&Transpose by Semitones..."
+msgstr "&Trasponi per semitoni..."
+
+#: ../src/commands/edit/SetNoteTypeCommand.h:56
+msgid "&Set Note Type"
+msgstr "Impo&sta tipo di nota"
+
+#: ../src/commands/edit/EventEditCommand.h:55
+msgid "Edit E&vent"
+msgstr "Modifica e&vento"
+
+#: ../src/commands/edit/AddMarkerCommand.h:54
+msgid "&Add Marker"
+msgstr "&Aggiungi marcatore"
+
+#: ../src/commands/edit/SelectionPropertyCommand.h:66
+msgid "Set &Property"
+msgstr "Imposta &proprietà"
+
+#: ../src/commands/edit/CutCommand.h:55
+msgid "Cu&t"
+msgstr "&Taglia"
+
+#: ../src/commands/edit/EventQuantizeCommand.cpp:114
+msgid "Heuristic Notation &Quantize"
+msgstr "&Quantizza la notazione euristica"
+
+#: ../src/commands/edit/EventQuantizeCommand.cpp:116
+msgid "Grid &Quantize"
+msgstr "Quantizza con griglia"
+
+#: ../src/commands/edit/ClearTriggersCommand.h:52
+msgid "&Clear Triggers"
+msgstr "&Pulisci attivatori"
+
+#: ../src/commands/edit/RetrogradeCommand.h:51
+msgid "&Retrograde"
+msgstr "&Retrogrado"
+
+#: ../src/commands/edit/InvertCommand.h:51
+msgid "&Invert"
+msgstr "&Inverti"
+
+#: ../src/commands/edit/SetTriggerCommand.h:64
+msgid "Tri&gger Segment"
+msgstr "Attiva il se&gmento"
+
+#: ../src/commands/edit/SetLyricsCommand.h:50
+msgid "Edit L&yrics"
+msgstr "Modifica pa&role"
+
+#: ../src/commands/edit/MoveAcrossSegmentsCommand.cpp:73
+msgid "&Move Events to Other Segment"
+msgstr "&Muovi eventi su un altro segmento"
+
+#: ../src/commands/edit/RetrogradeInvertCommand.h:51
+msgid "Re&trograde Invert"
+msgstr "Inverti re&trogrado"
+
+#: ../src/commands/edit/ModifyMarkerCommand.h:55
+msgid "&Modify Marker"
+msgstr "&Modifica marcatore"
+
+#: ../src/commands/studio/AddControlParameterCommand.h:61
+msgid "&Add Control Parameter"
+msgstr "&Aggiungi parametro di controllo"
+
+#: ../src/commands/studio/ModifyInstrumentMappingCommand.h:55
+msgid "Modify &Instrument Mapping"
+msgstr "Modifica la mappatura degli &strumenti"
+
+#: ../src/commands/studio/RemoveControlParameterCommand.h:60
+msgid "&Remove Control Parameter"
+msgstr "&Rimuovi parametro di controllo"
+
+#: ../src/commands/studio/ReconnectDeviceCommand.h:55
+msgid "Reconnect Device"
+msgstr "Riconnetti dispositivo"
+
+#: ../src/commands/studio/ModifyDeviceCommand.h:68
+msgid "Modify &MIDI Bank"
+msgstr "Modifica il Banco &MIDI"
+
+#: ../src/commands/studio/CreateOrDeleteDeviceCommand.h:68
+msgid "Create Device"
+msgstr "Crea dispositivo"
+
+#: ../src/commands/studio/ModifyDeviceMappingCommand.h:55
+msgid "Modify &Device Mapping"
+msgstr "Modifica la mappatura dei &dispositivi"
+
+#: ../src/commands/studio/RenameDeviceCommand.h:55
+msgid "Rename Device"
+msgstr "Rinomina dispositivo"
+
+#: ../src/commands/studio/ModifyControlParameterCommand.h:61
+msgid "&Modify Control Parameter"
+msgstr "&Modifica parametro di controllo"
+
+#: ../src/commands/notation/TieNotesCommand.h:49
+msgid "&Tie"
+msgstr "Lega&tura di valore"
+
+#: ../src/commands/notation/ClefInsertionCommand.cpp:74
+msgid "Add Cle&f Change..."
+msgstr "Aggiungi cambio di &chiave"
+
+#: ../src/commands/notation/GuitarChordInsertionCommand.cpp:40
+msgid "Insert Guitar Chord"
+msgstr "Inserisci accordo di chitarra"
+
+#: ../src/commands/notation/RespellCommand.cpp:47
+#, c-format
+msgid "Respell with %1"
+msgstr "Rialtera con %1"
+
+#: ../src/commands/notation/RespellCommand.cpp:50
+msgid "Do&uble Sharp"
+msgstr "Do&ppio diesis"
+
+#: ../src/commands/notation/RespellCommand.cpp:52
+msgid "&Sharp"
+msgstr "&Diesis"
+
+#: ../src/commands/notation/RespellCommand.cpp:54
+msgid "&Flat"
+msgstr "&Bemolle"
+
+#: ../src/commands/notation/RespellCommand.cpp:56
+msgid "Dou&ble Flat"
+msgstr "Doppio &bemolle"
+
+#: ../src/commands/notation/RespellCommand.cpp:58
+msgid "&Natural"
+msgstr "&Naturale"
+
+#: ../src/commands/notation/RespellCommand.cpp:60
+msgid "N&one"
+msgstr "&Nessuno"
+
+#: ../src/commands/notation/RespellCommand.cpp:66
+msgid "Respell Accidentals &Upward"
+msgstr "Rialtera gli accidenti verso l'&alto"
+
+#: ../src/commands/notation/RespellCommand.cpp:69
+msgid "Respell Accidentals &Downward"
+msgstr "Rialtera gli accidenti verso il &basso"
+
+#: ../src/commands/notation/RespellCommand.cpp:72
+msgid "&Restore Accidentals"
+msgstr "&Ripristina gli accidenti"
+
+#: ../src/commands/notation/RespellCommand.cpp:75
+msgid "Respell Accidentals"
+msgstr "Rialtera gli accidenti"
+
+#: ../src/commands/notation/DeCounterpointCommand.h:55
+msgid "Split-and-Tie Overlapping &Chords"
+msgstr "Dividi-e-lega gli a&ccordi sovrapposti"
+
+#: ../src/commands/notation/BeamCommand.h:49
+msgid "&Beam Group"
+msgstr "Collega il gruppo"
+
+#: ../src/commands/notation/AddTextMarkCommand.h:51
+msgid "Add Te&xt Mark..."
+msgstr "Aggiungi marcatori di te&sto..."
+
+#: ../src/commands/notation/RestoreSlursCommand.h:49
+msgid "&Restore Slur Positions"
+msgstr "&Ripristina le posizioni delle legature"
+
+#: ../src/commands/notation/SustainInsertionCommand.h:56
+msgid "Add Pedal &Press"
+msgstr "Aggiungi &pressione di pedale"
+
+#: ../src/commands/notation/SustainInsertionCommand.h:58
+msgid "Add Pedal &Release"
+msgstr "Aggiungi &rilascio di pedale"
+
+#: ../src/commands/notation/FixNotationQuantizeCommand.h:49
+msgid "Fi&x Notation Quantization"
+msgstr "Fissa la quantizzazione della notazione"
+
+#: ../src/commands/notation/ChangeStemsCommand.h:51
+msgid "Stems &Up"
+msgstr "Gambi in alto"
+
+#: ../src/commands/notation/ChangeStemsCommand.h:51
+msgid "Stems &Down"
+msgstr "Gambi in basso"
+
+#: ../src/commands/notation/MakeAccidentalsCautionaryCommand.cpp:43
+msgid "Use &Cautionary Accidentals"
+msgstr "Usa gli a&ccidenti di precauzione"
+
+#: ../src/commands/notation/MakeAccidentalsCautionaryCommand.cpp:45
+msgid "Cancel C&autionary Accidentals"
+msgstr "Cancella gli a&ccidenti di precauzione"
+
+#: ../src/commands/notation/SetVisibilityCommand.h:50
+msgid "Set Visibility"
+msgstr "Imposta la visibilità"
+
+#: ../src/commands/notation/ChangeStyleCommand.h:53
+msgid "Change &Note Style"
+msgstr "Cambia stile della &nota"
+
+#: ../src/commands/notation/TextInsertionCommand.cpp:41
+msgid "Insert Text"
+msgstr "Inserisci testo"
+
+#: ../src/commands/notation/InterpretCommand.h:70
+msgid "&Interpret..."
+msgstr "&Interpreta..."
+
+#: ../src/commands/notation/TupletCommand.h:53
+msgid "&Triplet"
+msgstr "&Terzina"
+
+#: ../src/commands/notation/TupletCommand.h:54
+msgid "Tu&plet..."
+msgstr "Tu&plet..."
+
+#: ../src/commands/notation/UnTupletCommand.h:50
+msgid "&Untuplet"
+msgstr "Togli T&upla"
+
+#: ../src/commands/notation/CollapseRestsCommand.h:54
+msgid "&Collapse Rests"
+msgstr "&Unisci le pause"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:145
+msgid "Add S&lur"
+msgstr "Aggiungi &legatura"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:147
+msgid "Add &Phrasing Slur"
+msgstr "Aggiungi legatura di &frase"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:149
+msgid "Add Double-Octave Up"
+msgstr "Aggiungi doppia ottava superiore"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:151
+msgid "Add Octave &Up"
+msgstr "Aggiungi ottava s&uperiore"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:153
+msgid "Add Octave &Down"
+msgstr "Aggiungi ottava in&feriore"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:155
+msgid "Add Double Octave Down"
+msgstr "Aggiungi doppia ottava inferiore"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:160
+msgid "Add &Crescendo"
+msgstr "Aggiungi &Crescendo"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:162
+msgid "Add &Decrescendo"
+msgstr "Aggiungi &Decrescendo"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:164
+msgid "Add &Glissando"
+msgstr "Aggiungi &Glissando"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:167
+msgid "Add &%1%2"
+msgstr "Aggiungi &%1%2"
+
+#: ../src/commands/notation/RemoveNotationQuantizeCommand.h:49
+msgid "Remo&ve Notation Quantization"
+msgstr "Rimuo&vi la quantizzazione della notazione"
+
+#: ../src/commands/notation/MakeChordCommand.h:50
+msgid "Make &Chord"
+msgstr "Crea A&ccordo"
+
+#: ../src/commands/notation/MultiKeyInsertionCommand.h:63
+msgid "Change all to &Key %1..."
+msgstr "Cambia tutto nella &chiave %1..."
+
+#: ../src/commands/notation/KeyInsertionCommand.h:67
+#: ../src/commands/notation/MultiKeyInsertionCommand.h:65
+msgid "Add &Key Change..."
+msgstr "Aggiungi cambio di &chiave..."
+
+#: ../src/commands/notation/RestoreStemsCommand.h:49
+msgid "&Restore Stems"
+msgstr "&Ripristina i gambi"
+
+#: ../src/commands/notation/MakeNotesViableCommand.h:55
+#: ../src/commands/notation/MakeRegionViableCommand.h:52
+msgid "Tie Notes at &Barlines"
+msgstr "Lega le note alle &battute"
+
+#: ../src/commands/notation/AddSlashesCommand.h:46
+msgid "Slashes"
+msgstr "Slashes"
+
+#: ../src/commands/notation/ChangeSlurPositionCommand.h:51
+msgid "Slur &Above"
+msgstr "Legatura sopr&a"
+
+#: ../src/commands/notation/ChangeSlurPositionCommand.h:51
+msgid "Slur &Below"
+msgstr "Legatura &sotto"
+
+#: ../src/commands/notation/NormalizeRestsCommand.h:54
+msgid "&Normalize Rests"
+msgstr "&Normalizza le pause"
+
+#: ../src/commands/notation/TextChangeCommand.cpp:41
+msgid "Edit Text"
+msgstr "Modifica testo"
+
+#: ../src/commands/notation/RemoveMarksCommand.h:49
+msgid "&Remove All Marks"
+msgstr "&Rimuovi tutti i marcatori"
+
+#: ../src/commands/notation/AutoBeamCommand.h:52
+msgid "&Auto-Beam"
+msgstr "&Auto-collega"
+
+#: ../src/commands/notation/UntieNotesCommand.h:49
+msgid "&Untie"
+msgstr "&Slega"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:48
+msgid "S&forzando"
+msgstr "S&forzando"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:50
+msgid "Sta&ccato"
+msgstr "Sta&ccato"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:52
+msgid "R&inforzando"
+msgstr "R&inforzando"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:54
+msgid "T&enuto"
+msgstr "T&enuto"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:56
+msgid "Tri&ll"
+msgstr "Tr&illo"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:58
+msgid "Trill &with Line"
+msgstr "Trillo &con linea"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:60
+msgid "Trill Line"
+msgstr "Linea di trillo"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:62
+msgid "&Turn"
+msgstr "Gira"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:64
+msgid "&Accent"
+msgstr "&Accento"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:66
+msgid "&Staccatissimo"
+msgstr "&Staccatissimo"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:68
+msgid "&Marcato"
+msgstr "&Marcato"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:70
+msgid "&Pause"
+msgstr "&Pausa"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:72
+msgid "&Up-Bow"
+msgstr "&Up-Bow"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:74
+msgid "&Down-Bow"
+msgstr "&Down-Bow"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:76
+msgid "Mo&rdent"
+msgstr "Mo&rdente"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:78
+msgid "Inverted Mordent"
+msgstr "Mordente invertito"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:80
+msgid "Long Mordent"
+msgstr "Mordente lungo"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:82
+msgid "Lon&g Inverted Mordent"
+msgstr "Mordente invertito lungo"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:84
+msgid "&%1%2"
+msgstr "&%1%2"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:89
+#, c-format
+msgid "Add %1"
+msgstr "Aggiungi %1"
+
+#: ../src/commands/notation/ResetDisplacementsCommand.h:49
+msgid "Restore Positions"
+msgstr "Ripristina le posizioni"
+
+#: ../src/commands/notation/IncrementDisplacementsCommand.h:52
+msgid "Fine Reposition"
+msgstr "Posizionamento fine"
+
+#: ../src/commands/notation/RestoreTiesCommand.h:49
+msgid "&Restore Tie Positions"
+msgstr "&Ripristina le posizioni della legatura"
+
+#: ../src/commands/notation/ChangeTiePositionCommand.h:47
+msgid "Tie &Above"
+msgstr "Legatura sopr&a"
+
+#: ../src/commands/notation/ChangeTiePositionCommand.h:47
+msgid "Tie &Below"
+msgstr "Legatura sotto"
+
+#: ../src/commands/notation/KeyInsertionCommand.h:65
+msgid "Change to &Key %1..."
+msgstr "Cambiamento nella chiave %1..."
+
+#: ../src/commands/notation/RemoveFingeringMarksCommand.h:49
+msgid "&Remove Fingerings"
+msgstr "&Rimuovi diteggiature"
+
+#: ../src/commands/notation/BreakCommand.h:49
+msgid "&Unbeam"
+msgstr "Scollega"
+
+#: ../src/commands/notation/UnGraceCommand.h:48
+msgid "Ung&race"
+msgstr "Togli abbellimento"
+
+#: ../src/commands/notation/AddFingeringMarkCommand.cpp:45
+msgid "Add Other &Fingering..."
+msgstr "Aggiunta altra &diteggiatura..."
+
+#: ../src/commands/notation/AddFingeringMarkCommand.cpp:47
+msgid "Add Fingering &0 (Thumb)"
+msgstr "Aggiungi diteggiatura &0 (Pollice)"
+
+#: ../src/commands/notation/AddFingeringMarkCommand.cpp:49
+#, c-format
+msgid "Add Fingering &%1"
+msgstr "Aggiungi diteggiatura &%1"
+
+#: ../src/document/io/HydrogenXMLHandler.cpp:277
+msgid " imported from Hydrogen "
+msgstr " importato da Hydrogen "
+
+#: ../src/document/io/LilyPondExporter.cpp:404
+msgid ""
+"LilyPond does not allow spaces or backslashes in filenames.\n"
+"\n"
+"Would you like to use\n"
+"\n"
+" %1\n"
+"\n"
+" instead?"
+msgstr ""
+"Lilypond non ammette spazi o barre rovesciate nei nomi dei file.\n"
+"\n"
+"Vuoi usare\n"
+"\n"
+" %1\n"
+"\n"
+" piuttosto?"
+
+#: ../src/document/io/LilyPondExporter.cpp:2054
+msgid "warning: overlong bar truncated here"
+msgstr "attenzione: battuta troppo lunga troncata qui"
+
+#: ../src/document/io/LilyPondExporter.cpp:2060
+msgid "warning: bar too short, padding with rests"
+msgstr "attenzione: battuta troppo breve, riempita con silenzio"
+
+#: ../src/document/MultiViewCommandHistory.cpp:318
+msgid "Nothing to undo"
+msgstr "Nulla da ripristinare"
+
+#: ../src/document/MultiViewCommandHistory.cpp:320
+msgid "Nothing to redo"
+msgstr "Nulla da rifare"
+
+#: ../src/document/MultiViewCommandHistory.cpp:328
+#: ../src/document/MultiViewCommandHistory.cpp:372
+#, c-format
+msgid "Und&o %1"
+msgstr "&Annulla %1"
+
+#: ../src/document/MultiViewCommandHistory.cpp:330
+#: ../src/document/MultiViewCommandHistory.cpp:374
+#, c-format
+msgid "Re&do %1"
+msgstr "Ripri&stina %1"
+
+#: ../src/document/RosegardenGUIDoc.cpp:328
+msgid ""
+"The current file has been modified.\n"
+"Do you want to save it?"
+msgstr ""
+"Il file corrente è stato modificato.\n"
+"Vuoi salvarlo?"
+
+#: ../src/document/RosegardenGUIDoc.cpp:480
+#, c-format
+msgid ""
+"_n: Delete the 1 audio file recorded during the unsaved session?\n"
+"Delete the %n audio files recorded during the unsaved session?"
+msgstr ""
+"Cancello 1 file audio registrato durante la sessione non salvata?\n"
+"Cancello i %n file audio registrati durante la sessione non salvata?"
+
+#: ../src/document/RosegardenGUIDoc.cpp:501
+msgid ""
+"The following audio files were recorded during this session but have been "
+"unloaded\n"
+"from the audio file manager, and so are no longer in use in the document you "
+"are saving.\n"
+"\n"
+"You may want to clean up these files to save disk space.\n"
+"\n"
+"Please select any you wish to delete permanently from the hard disk.\n"
+msgstr ""
+"I seguenti file audio, che sono stati registrati durante questa sessione,\n"
+" non sono più in uso nel documento che si sta salvando.\n"
+"\n"
+"Forse vuoi eliminarli per liberare dello spazio sul disco.\n"
+"\n"
+"Scegli quelli che vuoi cancellare definitivamente dal disco fisso.\n"
+
+#: ../src/document/RosegardenGUIDoc.cpp:517
+#, c-format
+msgid ""
+"_n: <qt>About to delete 1 audio file permanently from the hard disk."
+"<br>There will be no way to recover this file.<br>Are you sure?</qt>\n"
+"\n"
+"<qt>About to delete %n audio files permanently from the hard disk.<br>There "
+"will be no way to recover these files.<br>Are you sure?</qt>"
+msgstr ""
+"<qt>Sto per rimuovere definitivamente 1 file audio dal disco.<br>Non ci sarà "
+"modo di recuperare il file.<br>Sei sicuro?</qt> \n"
+"Sto per rimuovere definitivamente %n file audio dal disco.<br>Non ci sarà "
+"modo di recuperare i file.<br> Sei sicuro?</qt>"
+
+#: ../src/document/RosegardenGUIDoc.cpp:580
+msgid "Can't open file '%1'"
+msgstr "Impossibile aprire il file '%1'"
+
+#: ../src/document/RosegardenGUIDoc.cpp:585
+msgid "Reading file..."
+msgstr "Lettura file..."
+
+#: ../src/document/RosegardenGUIDoc.cpp:603
+msgid "Could not open Rosegarden file"
+msgstr "Non riesco ad aprire il file di Rosegarden"
+
+#: ../src/document/RosegardenGUIDoc.cpp:641
+msgid "Error when parsing file '%1': \"%2\""
+msgstr "Errore durante il controllo del file '%1': \"%2\""
+
+#: ../src/document/RosegardenGUIDoc.cpp:689
+msgid "Generating audio previews..."
+msgstr "Generazione anteprima audio..."
+
+#: ../src/document/RosegardenGUIDoc.cpp:721
+msgid "Merge"
+msgstr "Inserisci"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1605
+msgid "File load cancelled"
+msgstr "Annullato caricamento file"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1625
+msgid ""
+"<h3>Audio and plugins not available</h3><p>This composition uses audio files "
+"or plugins, but Rosegarden is currently running without audio because the "
+"JACK audio server was not available on startup.</p><p>Please exit "
+"Rosegarden, start the JACK audio server and re-start Rosegarden if you wish "
+"to load this complete composition.</p><p><b>WARNING:</b> If you re-save this "
+"composition, all audio and plugin data and settings in it will be lost.</p>"
+msgstr ""
+"<h3>Audio e plugin non disponibili</h3><p>Questa composizione usa file audio "
+"o plugin, ma Rosegarden sta attualmente funzionando senza audio poiché il "
+"server audio JACK non era disponibile all'avvio.</p><p>Si prega di chiudere "
+"Rosegarden, avviare il server JACK e riavviare Rosegarden se si desidera "
+"caricare questa composizione completa.</p><p><b>ATTENZIONE:</b> se salvate "
+"questa composizione, tutti i dati audio e dei plugin andranno perduti.</p>"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1628
+msgid ""
+"<h3>Audio and plugins not available</h3><p>This composition uses audio files "
+"or plugins, but you are running a version of Rosegarden that was compiled "
+"without audio support.</p><p><b>WARNING:</b> If you re-save this composition "
+"from this version of Rosegarden, all audio and plugin data and settings in "
+"it will be lost.</p>"
+msgstr ""
+"<h3>Audio e plugin non disponibili</h3><p>Questa composizione usa file audio "
+"o plugin, ma si sta usando una versione di Rosegarden compilata senza il "
+"supporto audio.</p><p><b>ATTENZIONE:</b> se salvate questa composizione da "
+"questa versione di Rosegarden, tutti i dati audio e dei plugin in essa "
+"contenuti andranno perduti.</p>"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1665
+msgid ""
+"<h3>Incorrect audio sample rate</h3><p>This composition contains audio files "
+"that were recorded or imported with the audio server running at a different "
+"sample rate (%1 Hz) from the current JACK server sample rate (%2 Hz).</"
+"p><p>Rosegarden will play this composition at the correct speed, but any "
+"audio files in it will probably sound awful.</p><p>Please consider re-"
+"starting the JACK server at the correct rate (%3 Hz) and re-loading this "
+"composition before you do any more work with it.</p>"
+msgstr ""
+"<h3>Campionamento audio non corretto</h3><p> La composizione contiene file "
+"audio registrati o importati a una frequenza di campionamento (%1 Hz) "
+"diversa da quella corrente in JACK (%2 Hz).</p><p>Rosegarden suonerà la "
+"composizione alla velocità corretta, ma i file audio in essa contenuti "
+"suoneranno probabilmente in modo orribile.</p><p> Prova a riavviare il "
+"server JACK alla velocità corretta (%3 Hz) e a ricaricare la composizione "
+"prima di continuare a lavorarci.</p>"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1675
+msgid ""
+"<h3>Inconsistent audio sample rates</h3><p>This composition contains audio "
+"files at more than one sample rate.</p><p>Rosegarden will play them at the "
+"correct speed, but any audio files that were recorded or imported at rates "
+"different from the current JACK server sample rate (%1 Hz) will probably "
+"sound awful.</p><p>Please see the audio file manager dialog for more "
+"details, and consider resampling any files that are at the wrong rate.</p>"
+msgstr ""
+"<h3>Campionamenti audio incompatibili</h3><p> La composizione contiene file "
+"audio registrati con diverse frequenze di campionamento.</p><p>Rosegarden li "
+"riprodurrà alla velocità corretta, ma i file audio registrati o importati a "
+"frequenze diverse da quella attualmente usata dal server JACK (%1 Hz) "
+"suoneranno probabilmente in modo orribile.</p><p> Prova guardare il menu del "
+"gestore file audio per avere più dettagli, e valuta la possibilità di "
+"ricampionare i file che hanno le frequenze errate.</p>"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1676
+msgid "Inconsistent sample rates"
+msgstr "Valori di campionamento inconsistenti"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1690
+msgid ""
+"<h3>Plugins not found</h3><p>The following audio plugins could not be loaded:"
+"</p><ul>"
+msgstr ""
+"<h3>Plugin non trovati</h3><p>I seguenti plugin audio non possono essere "
+"caricati:</p><ul>"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1698
+msgid "<li>%1 (from %2)</li>"
+msgstr "<li>%1 (da %2)</li>"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1712
+msgid ""
+"This file contains one or more old element types that are now deprecated.\n"
+"Support for these elements may disappear in future versions of Rosegarden.\n"
+"We recommend you re-save this file from this version of Rosegarden to ensure "
+"that it can still be re-loaded in future versions."
+msgstr ""
+"Questo file contiene uno o più elementi vecchi e non più utilizzati.\n"
+"Il supporto per questi elementi potrebbe sparire nelle prossime versioni di "
+"Rosegarden.\n"
+"Raccomandiamo di risalvare questo file in questa versione di Rosegarden,\n"
+"affinché sia ancora leggibile nelle prossime versioni."
+
+#: ../src/document/RosegardenGUIDoc.cpp:2207
+msgid "Insert Recorded MIDI"
+msgstr "Inserisci un file MIDI registrato"
+
+#: ../src/document/RosegardenGUIDoc.cpp:2560
+msgid "%1 (recorded)"
+msgstr "%1 (registrato)"
+
+#: ../src/document/RoseXmlHandler.cpp:442
+msgid ""
+"This file was written by Rosegarden %1, and it uses\n"
+"a different file format that cannot be read by this version."
+msgstr ""
+"Questo file è stato scritto da Rosegarden %1 e usa \n"
+"un diverso formato che non può essere letto da questa versione."
+
+#: ../src/document/RoseXmlHandler.cpp:452
+msgid ""
+"This file was written by Rosegarden %1, which is more recent than this "
+"version.\n"
+"There may be some incompatibilities with the file format."
+msgstr ""
+"Questo file è stato scritto da Rosegarden %1 , che più recente di questa "
+"versione.\n"
+"Potrebbero esserci alcune incompatibilità di formato."
+
+#: ../src/document/RoseXmlHandler.cpp:1687
+msgid "Loading plugins..."
+msgstr "Caricando i plugin..."
+
+#: rc.cpp:6 rc.cpp:144
+#, no-c-format
+msgid "Se&gment"
+msgstr "Se&gmento"
+
+#: rc.cpp:9 rc.cpp:84 rc.cpp:147 rc.cpp:303
+#, no-c-format
+msgid "Edit &With"
+msgstr "Modifica &con"
+
+#: rc.cpp:12 rc.cpp:21 rc.cpp:30 rc.cpp:39 rc.cpp:345
+#, no-c-format
+msgid "Actions Toolbar"
+msgstr "Barra delle azioni"
+
+#: rc.cpp:15 rc.cpp:33 rc.cpp:129 rc.cpp:285
+#, no-c-format
+msgid "Time Toolbar"
+msgstr "Barra degli strumenti del tempo"
+
+#: rc.cpp:18 rc.cpp:36 rc.cpp:57 rc.cpp:63 rc.cpp:120 rc.cpp:243 rc.cpp:342
+#, no-c-format
+msgid "Transport Toolbar"
+msgstr "Barra degli strumenti per il Trasporto"
+
+#: rc.cpp:24 rc.cpp:42 rc.cpp:123 rc.cpp:348
+#, no-c-format
+msgid "Zoom Toolbar"
+msgstr "Barra degli strumenti per l'ingrandimento"
+
+#: rc.cpp:45 rc.cpp:60 rc.cpp:99 rc.cpp:228 rc.cpp:327
+#, no-c-format
+msgid "T&ransport"
+msgstr "T&rasporto"
+
+#: rc.cpp:51
+#, no-c-format
+msgid "Number of Stereo &Inputs"
+msgstr "Numero di &ingressi stereo"
+
+#: rc.cpp:54
+#, no-c-format
+msgid "&Number of Submasters"
+msgstr "&Numero di submasters"
+
+#: rc.cpp:66
+#, no-c-format
+msgid "&Import"
+msgstr "&Importa"
+
+#: rc.cpp:69
+#, no-c-format
+msgid "&Merge"
+msgstr "&Inserisci"
+
+#: rc.cpp:72
+#, no-c-format
+msgid "&Export"
+msgstr "&Esporta"
+
+#: rc.cpp:75 rc.cpp:141 rc.cpp:297
+#, no-c-format
+msgid "&Composition"
+msgstr "&Composizione"
+
+#: rc.cpp:78
+#, no-c-format
+msgid "&Studio"
+msgstr "&Studio"
+
+#: rc.cpp:81
+#, no-c-format
+msgid "Se&gments"
+msgstr "Se&gmenti"
+
+#: rc.cpp:90
+#, no-c-format
+msgid "Trac&ks"
+msgstr "Trac&ce"
+
+#: rc.cpp:93
+#, no-c-format
+msgid "Set &Instrument"
+msgstr "Seleziona &Strumento"
+
+#: rc.cpp:102 rc.cpp:234 rc.cpp:333
+#, no-c-format
+msgid "&Toolbars"
+msgstr "&Strumenti"
+
+#: rc.cpp:105 rc.cpp:237 rc.cpp:336
+#, no-c-format
+msgid "&Rulers"
+msgstr "Indicato&ri"
+
+#: rc.cpp:111 rc.cpp:240 rc.cpp:339
+#, no-c-format
+msgid "Tools Toolbar"
+msgstr "Barra degli strumenti"
+
+#: rc.cpp:114
+#, no-c-format
+msgid "Tracks Toolbar"
+msgstr "Barra degli strumenti per le tracce"
+
+#: rc.cpp:117
+#, no-c-format
+msgid "Editors Toolbar"
+msgstr "Barra degli editor"
+
+#: rc.cpp:135
+#, no-c-format
+msgid "&Layout Mode"
+msgstr "Modo di &visualizzazione"
+
+#: rc.cpp:138 rc.cpp:294
+#, no-c-format
+msgid "Add Event Ruler"
+msgstr "Aggiungi indicatore eventi"
+
+#: rc.cpp:150
+#, no-c-format
+msgid "N&ote"
+msgstr "N&ota"
+
+#: rc.cpp:153
+#, no-c-format
+msgid "Mar&ks"
+msgstr "Ma&rcatori"
+
+#: rc.cpp:156
+#, no-c-format
+msgid "&Ornaments"
+msgstr "&Ornamenti"
+
+#: rc.cpp:159
+#, no-c-format
+msgid "&Fingerings"
+msgstr "&Diteggiature"
+
+#: rc.cpp:162
+#, no-c-format
+msgid "S&lashes"
+msgstr "S&lashes"
+
+#: rc.cpp:165 rc.cpp:219
+#, no-c-format
+msgid "&Accidentals"
+msgstr "&Accidenti"
+
+#: rc.cpp:168
+#, no-c-format
+msgid "&Phrase"
+msgstr "Frase"
+
+#: rc.cpp:171
+#, no-c-format
+msgid "Slur &Position"
+msgstr "&Posizione della legatura"
+
+#: rc.cpp:174
+#, no-c-format
+msgid "Tie &Position"
+msgstr "&Posizione della legatura"
+
+#: rc.cpp:177
+#, no-c-format
+msgid "&Octaves"
+msgstr "&Ottave"
+
+#: rc.cpp:180 rc.cpp:306
+#, no-c-format
+msgid "Ad&just"
+msgstr "Ag&giusta"
+
+#: rc.cpp:183
+#, no-c-format
+msgid "R&ests"
+msgstr "Paus&e"
+
+#: rc.cpp:186 rc.cpp:213
+#, no-c-format
+msgid "&Notes"
+msgstr "&Note"
+
+#: rc.cpp:189 rc.cpp:309
+#, no-c-format
+msgid "&Quantize"
+msgstr "&Quantizza"
+
+#: rc.cpp:195 rc.cpp:315
+#, no-c-format
+msgid "Trans&pose"
+msgstr "Tras&poni"
+
+#: rc.cpp:198 rc.cpp:318
+#, no-c-format
+msgid "Convert"
+msgstr "Converti"
+
+#: rc.cpp:201
+#, no-c-format
+msgid "&Fine Positioning"
+msgstr "Posizionamento &fine"
+
+#: rc.cpp:204
+#, no-c-format
+msgid "Fine Ti&ming"
+msgstr "Suddivisione fine del te&mpo"
+
+#: rc.cpp:207
+#, no-c-format
+msgid "&Visibility"
+msgstr "&Visibilità"
+
+#: rc.cpp:216
+#, no-c-format
+msgid "&Rests"
+msgstr "&Pause"
+
+#: rc.cpp:222
+#, no-c-format
+msgid "&Clefs"
+msgstr "&Chiavi"
+
+#: rc.cpp:225 rc.cpp:324
+#, no-c-format
+msgid "Local &Cursor"
+msgstr "&Cursore locale"
+
+#: rc.cpp:246
+#, no-c-format
+msgid "Notes Toolbar"
+msgstr "Barra delle note"
+
+#: rc.cpp:249
+#, no-c-format
+msgid "Rests Toolbar"
+msgstr "Barra delle pause"
+
+#: rc.cpp:252
+#, no-c-format
+msgid "Clefs Toolbar"
+msgstr "Barra delle chiavi"
+
+#: rc.cpp:255
+#, no-c-format
+msgid "Accidentals Toolbar"
+msgstr "Barra degli accidenti"
+
+#: rc.cpp:258
+#, no-c-format
+msgid "Group Toolbar"
+msgstr "Barra dei raggruppatori"
+
+#: rc.cpp:261
+#, no-c-format
+msgid "Marks Toolbar"
+msgstr "Barra dei marcatori"
+
+#: rc.cpp:264
+#, no-c-format
+msgid "Meta Toolbar"
+msgstr "Meta barra degli strumenti"
+
+#: rc.cpp:267
+#, no-c-format
+msgid "Layout Toolbar"
+msgstr "Barra degli strumenti di visualizzazione"
+
+#: rc.cpp:270 rc.cpp:351
+#, no-c-format
+msgid "Control Ruler actions"
+msgstr "Eventi del controller"
+
+#: rc.cpp:273 rc.cpp:354
+#, no-c-format
+msgid "Property Ruler actions"
+msgstr "Azioni della Barra delle proprietà"
+
+#: rc.cpp:276
+#, no-c-format
+msgid "&Action"
+msgstr "&Azione"
+
+#: rc.cpp:279
+#, no-c-format
+msgid "General Toolbar"
+msgstr "Barra degli strumenti generale"
+
+#: rc.cpp:291
+#, no-c-format
+msgid "&Grid"
+msgstr "&Griglia"
+
+#: rc.cpp:300
+#, no-c-format
+msgid "&Segment"
+msgstr "&Segmento"
+
+#: rc.cpp:361
+#, no-c-format
+msgid "Hide additional controls"
+msgstr "Nascondi i controlli aggiuntivi"
+
+#: rc.cpp:365
+#, no-c-format
+msgid "Panic Button"
+msgstr "Bottone di allarme"
+
+#: rc.cpp:368
+#, no-c-format
+msgid "Resets all MIDI devices if you've got stuck notes"
+msgstr "Azzera tutti i dispositivi MIDI se ci sono note bloccate"
+
+#: rc.cpp:375
+#, no-c-format
+msgid "Provides a metronome click for you to play along with"
+msgstr "Produce un battito del metronomo da seguire per suonare"
+
+#: rc.cpp:378
+#, no-c-format
+msgid "Shows MIDI activity in and out of Rosegarden"
+msgstr "Mostra l'attività MIDI fuori e dentro Rosegarden"
+
+#: rc.cpp:381
+#, no-c-format
+msgid "IN"
+msgstr "Ingresso"
+
+#: rc.cpp:384
+#, no-c-format
+msgid "OUT"
+msgstr "Uscita"
+
+#: rc.cpp:387 rc.cpp:390
+#, no-c-format
+msgid "NO EVENTS"
+msgstr "NESSUN EVENTO"
+
+#: rc.cpp:397
+#, no-c-format
+msgid "Record either MIDI or audio"
+msgstr "Registra MIDI oppure audio"
+
+#: rc.cpp:401
+#, no-c-format
+msgid "Loop"
+msgstr "Ciclico"
+
+#: rc.cpp:404
+#, no-c-format
+msgid "Turn on and off the loop markers (if set)"
+msgstr "Accendi e spegni i marcatori della ripetizione (se attivati)"
+
+#: rc.cpp:411
+#, no-c-format
+msgid "Mutes all but the currently selected track"
+msgstr "Rendi silenziose tutte le tracce tranne quella selezionata"
+
+#: rc.cpp:415
+#, no-c-format
+msgid "Start loop or range here"
+msgstr "Inizia qui il ciclo o l'intervallo"
+
+#: rc.cpp:419
+#, no-c-format
+msgid "End loop or range here"
+msgstr "Chiudi qui il ciclo o l'intervallo"
+
+#: rc.cpp:422
+#, no-c-format
+msgid "SIG"
+msgstr "SIG"
+
+#: rc.cpp:425
+#, no-c-format
+msgid "DIV"
+msgstr "DIV"
+
+#: rc.cpp:428
+#, no-c-format
+msgid "/16"
+msgstr "/16"
+
+#: rc.cpp:431
+#, no-c-format
+msgid "TEMPO"
+msgstr "TEMPO"
+
+#: rc.cpp:434
+#, no-c-format
+msgid "END"
+msgstr "FINE"
+
+#: rc.cpp:437
+#, no-c-format
+msgid "BAR"
+msgstr "BATTUTA"
+
+#: rc.cpp:441
+#, no-c-format
+msgid "Switch between real time, musical time, and frame count"
+msgstr "Commuta tra tempo reale, tempo musicale e conteggio dei frame"
+
+#: rc.cpp:445
+#, no-c-format
+msgid "Show additional controls"
+msgstr "Mostra i controlli aggiuntivi"
+
+#: rc.cpp:449
+#, no-c-format
+msgid "Rewind"
+msgstr "Riavvolgi"
+
+#: rc.cpp:452
+#, no-c-format
+msgid "Moves the current pointer position back one bar."
+msgstr "Muove li puntatore indietro di una battuta."
+
+#: rc.cpp:456
+#, no-c-format
+msgid "Rewind to beginning"
+msgstr "Indietro all'inizio"
+
+#: rc.cpp:459
+#, no-c-format
+msgid ""
+"Moves the pointer position to the start of the composition. (This may mean "
+"going forwards if the pointer is currently before the start.)"
+msgstr ""
+"Muove il puntatore all'inizio della composizione. (Questo può significare "
+"un avanzamento se il puntatore si trova prima dell'inizio.)"
+
+#: rc.cpp:463
+#, no-c-format
+msgid "Play/Pause"
+msgstr "Riproduci/Pausa"
+
+#: rc.cpp:466
+#, no-c-format
+msgid ""
+"Plays from the current pointer position, or pauses playback if already in "
+"progress."
+msgstr "Suona dalla posizione corrente, o mette in pausa se sta già suonando."
+
+#: rc.cpp:473
+#, no-c-format
+msgid "Stops playback or recording."
+msgstr "Arresta la riproduzione o la registrazione."
+
+#: rc.cpp:477
+#, no-c-format
+msgid "Fast forward"
+msgstr "Avanti veloce"
+
+#: rc.cpp:480
+#, no-c-format
+msgid "Moves the current pointer position forwards one bar."
+msgstr "Muove li puntatore avanti di una battuta."
+
+#: rc.cpp:484
+#, no-c-format
+msgid "Fast forward to end"
+msgstr "Avanti veloce fino alla fine"
+
+#: rc.cpp:487
+#, no-c-format
+msgid ""
+"Moves the pointer position to the end of the composition. (This may mean "
+"going backwards if the pointer is already beyond the end.)"
+msgstr ""
+"Muove il puntatore alla fine della composizione. (Questo può significare un "
+"ritorno indietro se il puntatore si trova oltre la fine.)"
+
+#: rc.cpp:491
+#, no-c-format
+msgid "Display time to end"
+msgstr "Mostra il tempo alla fine"
+
+#: ../docs/en/tips.cpp:3
+msgid ""
+"<p>To configure a track to play using a particular instrument:</p>\n"
+"&nbsp;&nbsp;* click on the track label and hold a moment<br>\n"
+"&nbsp;&nbsp;* select an output device<br>\n"
+"&nbsp;&nbsp;* select one of that device's available instruments (#1 - #16)"
+"<br>\n"
+"&nbsp;&nbsp;* adjust that instrument's output channel, program, bank, and\n"
+"controllers via the instrument parameters box\n"
+msgstr ""
+"<p>Per suonare una traccia con un particolare strumento:</p>\n"
+"&nbsp;&nbsp;* tieni cliccato un momento sull'etichetta della traccia<br>\n"
+"&nbsp;&nbsp;* scegli un dispositivo di uscita<br>\n"
+"&nbsp;&nbsp;* scegli uno strumento (#1 - #16) per quel dispositivo<br>\n"
+"&nbsp;&nbsp;* modifica il canale di uscita, il programma, il banco e i "
+"controlli dello strumento attraverso il box dei parametri\n"
+
+#: ../docs/en/tips.cpp:13
+msgid ""
+"<p>...that Rosegarden has an autosave feature?<br><br>\n"
+"You can select your autosave interval from <b>Settings->Configure\n"
+"Rosegarden</b>.<br><br>\n"
+"When something goes awry, such as a power outage or a Rosegarden crash\n"
+"(unfortunately, it happens...) simply load the file you were working on, and "
+"you'll be given the\n"
+"option to load the autosaved version, or the unmodified original.</p>\n"
+msgstr ""
+"<p>...che Rosegarden ha una funzione di autosalvataggio?<br><br>\n"
+"Puoi scegliere l'intervallo di salvataggio in <b>Impostazioni->Configura\n"
+"Rosegarden</b>.<br><br>\n"
+"Quando qualcosa va storto, come ad esempio un black-out o un crash\n"
+"di Rosegarden (purtroppo capita...), puoi semplicemente ricaricare il file\n"
+"su cui stavi lavorando, e ti verrà chiesto se vuoi usare la versione\n"
+"autosalvata o l'originale non modificato.</p>\n"
+
+#: ../docs/en/tips.cpp:23
+msgid ""
+"<p>\n"
+"...that you can save the current document as your default studio by using\n"
+"<b>Composition -> Studio -> Save Current Document as Default Studio</b>?</"
+"p>\n"
+msgstr ""
+"<p>\n"
+"...che puoi salvare il documento corrente come studio predefinito usando\n"
+"<b>Composizione -> Studio -> &Salva il documento corrente come\n"
+"studio predefinito</b>?</p>\n"
+
+#: ../docs/en/tips.cpp:30
+msgid ""
+"<p>...that your default studio is a complete Rosegarden composition that "
+"gets\n"
+"loaded every time you create a new document or import a MIDI file?</p>\n"
+msgstr ""
+"<p>...che il tuo studio predefinito è una composizione completa\n"
+"di Rosegarden che viene caricata ogni volta che apri un nuovo documento\n"
+"o importi un file MIDI?</p>\n"
+
+#: ../docs/en/tips.cpp:36
+msgid ""
+"<p>...that your default studio can contain instrument assignments, document "
+"properties, LilyPond headers,\n"
+"and many other things?<br><br>The default studio is a complete Rosegarden "
+"composition, so it can contain anything that you may wish to have available "
+"in each\n"
+"new document you create.</p>\n"
+msgstr ""
+"<p>...che il tuo studio predefinito può contenere assegnazioni predefinite "
+"degli strumenti,\n"
+"proprietà del documento, intestazioni di Lilypond, e tante altre "
+"impostazioni?<br><br> Lo studio predefinito è una composizione completa di "
+"Rosegarden, quindi può contenere\n"
+" tutto ciò che potresti voler ritrovare come predefinite ogni volta che crei "
+"un nuovo\n"
+"documento.</p>\n"
+
+#: ../docs/en/tips.cpp:43
+msgid ""
+"<p>...that Rosegarden will detect and create a default connection for ALSA "
+"soft\n"
+"synth applications that are started after Rosegarden is already running?</"
+"p>\n"
+msgstr ""
+"<p>...che Rosegarden rileverà e creerà una connessione predefinita per le "
+"applicazioni ALSA\n"
+"che vengono avviate quando Rosegarden è già aperto?</p>\n"
+
+#: ../docs/en/tips.cpp:49
+msgid ""
+"<p>...that you can make your default studio override that in every "
+"Rosegarden composition you load?<br><br>If your studio setup does not change "
+"very often, and you would prefer for\n"
+"the settings in your default studio to take precedence over whatever\n"
+"studio is saved with any files you happen to load, you can make your studio "
+"the default for everything using <b>Settings -> Configure Rosegarden ->\n"
+"MIDI -> Always use default studio when loading files</b>.</p>\n"
+msgstr ""
+"<p>...che puoi fare in modo che il tuo studio predefinito sostituisca quello "
+"delle composizioni che carichi in Rosegarden?<br><br> Se le tue impostazioni "
+"dello studio non cambiano molto spesso,\n"
+"e preferisci che le impostazioni del tuo studio predefinito abbiano la\n"
+"precedenza su quelle salvate nei file che ti capita di aprire, puoi fare in "
+"modo\n"
+"che il tuo studio predefinito venga usato per ogni cosa impostando\n"
+" <b>Impostazioni -> Configura Rosegarden -> MIDI ->\n"
+"Usa sempre lo studio di default quando carichi i file</b>.</p>\n"
+
+#: ../docs/en/tips.cpp:57
+msgid ""
+"<p>If you have accidentally recorded a segment so short that it does not\n"
+"appear on the canvas, which you can only hear during subsequent recording\n"
+"sessions, you can gain access to it by using <b>Composition -> Change\n"
+"Composition Start and End</b> and then setting the composition to start at a "
+"negative number.</p>\n"
+msgstr ""
+"<p>Se hai accidentalmente registrato un segmento così corto da non\n"
+"comparire sul tracciato, e puoi sentirlo solo durante le successive "
+"sessioni\n"
+"di registrazione, puoi accedervi usando <b>Composizione ->\n"
+"Cambia inizio e fine della composizione</b> e facendo partire la "
+"composizione\n"
+"da un numero negativo</p>\n"
+
+#: ../docs/en/tips.cpp:65
+msgid ""
+"<p>...that if you place a note at the wrong pitch using the notation or "
+"matrix editor, you can move it one semitone at a time with the up and down "
+"arrow keys on your keyboard?</p>\n"
+msgstr ""
+"<p>...che se posizioni una nota ad un'altezza errata con l'editor di "
+"notazione o di matrice, puoi muoverla un semitono alla volta con le frecce "
+"Su e Giù della tastiera?</p>\n"
+
+#: ../docs/en/tips.cpp:70
+msgid ""
+"<p>...that you can toggle stem directions in the notation editor by "
+"selecting\n"
+"one or more notes and using Ctrl-PageUp and Ctrl-PageDown?</p>\n"
+msgstr ""
+"<p>...che puoi cambiare la direzione dei gambi nell'editor di notazione\n"
+"selezionando una o più note e usando Ctrl-PagSu e Ctrl-PagGiù?</p>\n"
+
+#: ../docs/en/tips.cpp:76
+msgid ""
+"<p>...that you can change the accidental used for a note in the notation "
+"editor (without changing the pitch of the note) by selecting\n"
+"it and using the up and down arrow keys with both Ctrl and Shift pressed?</"
+"p>\n"
+msgstr ""
+"<p>...che puoi cambiare gli accidenti di una nota nell'editor di notazione\n"
+"(senza modificare l'altezza della nota) selezionandola e usando le frecce\n"
+"Su e Giù e tenendo premuto contemporaneamente Ctrl e Maiusc?</p>\n"
+
+#: ../docs/en/tips.cpp:82 ../docs/en/tips.cpp:93
+msgid ""
+"<p>...that you can hold down the Shift key while repositioning segments on "
+"the\n"
+"segment canvas in order to avoid the \"snap-to\" effect and exert finer "
+"control?</p>\n"
+msgstr ""
+"<p>...che puoi tenere premuto il tasto Maiusc mentre riposizioni\n"
+"i tracciati dei segmenti, in modo da evitare l'effetto \"aggancia\"\n"
+"per avere un controllo più fine?</p>\n"
+
+#: ../docs/en/tips.cpp:88
+msgid ""
+"<p>...that you can use the arrow tool to draw, move, and resize segments and "
+"events as well as to select them?<br><br>Drag a segment or event block to "
+"move it, drag the right edge of a block to resize it, and drag with the "
+"middle mouse button pressed to draw a new segment or event.<br><br>(Of "
+"course, the dedicated draw, move and resize tools are still quicker for "
+"repeated operations.)</p>\n"
+msgstr ""
+"<p>...che puoi usare lo strumento freccia per disegnare, muovere e "
+"ridimensionare i segmenti e gli eventi, oltre a selezionarli?<br><br> "
+"Trascina un segmento o un blocco evento per muoverlo, trascina l'estremità "
+"destra per ridimensionarlo, e trascina col tasto centrale del mouse per "
+"disegnare un nuovo segmento o evento.<br><br>(Ovviamente, gli strumenti "
+"appositi per disegnare, muovere e ridimensionare sono più veloci per "
+"operazioni ripetute.)</p>\n"
+
+#: ../docs/en/tips.cpp:99
+msgid ""
+"<p>...that you can hold down the Shift key while repositioning or resizing "
+"events in the\n"
+"matrix view in order to avoid the \"snap-to\" effect and exert finer control?"
+"</p>\n"
+msgstr ""
+"<p>...che puoi tenere premuto il tasto Maiusc mentre riposizioni o "
+"ridimensioni\n"
+"gli eventi nella vista a matrice, in modo da evitare l'effetto \"aggancia\"\n"
+"ed avere un controllo più fine?</p>\n"
+
+#: ../docs/en/tips.cpp:105
+msgid ""
+"<p>...that you can edit multiple segments on multiple tracks simultaneously "
+"in\n"
+"the notation editor? Simply select the segments, then use <b>Edit -> Open "
+"in Notation Editor</b>.</p>\n"
+msgstr ""
+"<p>...che puoi modificare più segmenti su più tracce simultaneamente\n"
+"nell'editor di notazione? Devi solo selezionare i segmenti, e usare "
+"<b>Modifica -> Apri nell'editor di notazione</b>.</p>\n"
+
+#: ../docs/en/tips.cpp:111
+msgid ""
+"<p>...that Rosegarden can export files for use by LilyPond, the high-quality "
+"score typesetting system?<br><br>\n"
+"From the <b>File</b> menu, navigate to <b>Export -> Export LilyPond File</"
+"b></p>\n"
+msgstr ""
+"<p>...che Rosegarden può esportare i file per Lilypond, il sistema di alta\n"
+"qualità per creare spartiti?\n"
+"Dal menu <b>File</b>, scegli <b>Esporta -> Esporta file Lilypond </b></p>\n"
+
+#: ../docs/en/tips.cpp:117
+msgid ""
+"<p>...that Rosegarden can print via LilyPond, the high-quality score "
+"typesetting system?<br><br>\n"
+"From the <b>File</b> menu, navigate to <b>Preview with LilyPond</b>. The "
+"file\n"
+"will be exported, rendered, and a preview will appear in KPDF, or one of\n"
+"several other PDF viewers, where it can then be printed as well.</p>\n"
+msgstr ""
+"<p>...che Rosegarden può stampare attraverso LilyPond, il sistema di alta\n"
+"qualità per creare spartiti?<br><br>\n"
+"Dal menu <b>File</b>, scegli <b>Anteprima con LilyPond</b>. Il file\n"
+"verrà esportato e ridisegnato e l'anteprima apparirà in KPDF, o in uno\n"
+"dei tanti visualizzatori PDF, da cui potrà anche essere stampato.</p>\n"
+
+#: ../docs/en/tips.cpp:125
+msgid ""
+"<p>...that if you use the quantizer from within the notation view, you can "
+"tell it to quantize only the timing used for notation -- making it possible "
+"to have good looking notation <b>and</b> a human MIDI performance?</p>\n"
+msgstr ""
+"<p>... che se usi la quantizzazione nella vista di notazione, puoi decidere "
+"di quantizzare solo la notazione -- in modo da avere una notazione bella a "
+"vedersi <b>e</b> una esecuzione MIDI \"umana\"?</p>\n"
+
+#: ../docs/en/tips.cpp:130
+msgid ""
+"<p>...that you can change segment labels using the controls on the Segment "
+"Parameters box\n"
+"in the main window?</p>\n"
+msgstr ""
+"<p>...che puoi cambiare le etichette dei segmenti usando i controlli sul "
+"box\n"
+"\"Parametri del Segmento\" nella finestra principale?</p>\n"
+
+#: ../docs/en/tips.cpp:136
+msgid ""
+"<p>...that the number of tracks in new documents is based on the contents "
+"of\n"
+"your autoload.rg file?\n"
+"<br><br>\n"
+"Whether you prefer to start with three tracks or 43, create a document that\n"
+"contains the desired number of tracks, plus any other studio or document "
+"properties settings\n"
+"you wish to configure, and use <b>Composition -> Studio -> Save Current "
+"Document as Default\n"
+"Studio</b> to make this your new default.</p>\n"
+msgstr ""
+"<p>...che il numero delle tracce nei documenti nuovi è basato sul contenuto\n"
+"del file autoload.rg?\n"
+"Se vuoi partire con tre tracce o con 43, crea un documento che contiene\n"
+" il numero di tracce desiderato, più tutti gli altri settaggi che vuoi "
+"configurare,\n"
+"e usa <b>Composizione ->Studio -> Salva il documento corrente come studio\n"
+"predefinito</b> per rendere questo il tuo nuovo studio predefinito. </p>\n"
+
+#: ../docs/en/tips.cpp:147
+msgid ""
+"<p>...that you can change the name of a track by double clicking on the "
+"label? (The\n"
+"label must be visible for this to work.)</p>\n"
+msgstr ""
+"<p>...che puoi cambiare il nome di una traccia facendo doppio click\n"
+"sull'etichetta? (L'etichetta deve essere visibile perché questo funzioni.)</"
+"p>\n"
+
+#: ../docs/en/tips.cpp:153
+msgid ""
+"<p>...that you can configure what happens when you double-click on a segment?"
+"<br><br>Go to <b>Settings -> Configure Rosegarden</b> and choose your "
+"preferred editing window under the <b>Behaviour</b> tab.</p>\n"
+msgstr ""
+"<p>...che puoi configurare ciò che avviene quando fai doppio-click su un\n"
+"segmento?<br><br> Vai su <b>Impostazioni -> Configura Rosegarden</b> e\n"
+"scegli l'azione preferita nella linguetta <b>Comportamento</b>.</p>\n"
+
+#: ../docs/en/tips.cpp:158
+msgid ""
+"<p>...that Rosegarden is being developed as a community effort with\n"
+"contributions from around the world?<br><br>\n"
+"The four most active developers live in London (England), Cannes, "
+"Barcelona,\n"
+"and... Christiansburg? (Christiansburg is a town of about 50,000 in\n"
+"southwestern Virginia, USA.)<br><br>\n"
+"We have had contributors from elsewhere in the US, UK, Spain, Mexico, "
+"Argentina, Germany,\n"
+"Sweden, Russia, Japan, Finland, and Italy, just to name a few...</p>\n"
+msgstr ""
+"<p>...che Rosegarden è sviluppato dal lavoro comune di persone da tutto\n"
+"il mondo?<br><br>\n"
+"Gli sviluppatori principali vivono a Londra (Inghilterra), Cannes, "
+"Barcellona,\n"
+" e... Christiansburg? (Christiansburg è una città di circa 50,000 nel\n"
+"sud-ovest della Virginia, USA.)<br><br>\n"
+"Abbiamo avuto contributi da altri luoghi in USA, Gran Bretagna, Spagna, "
+"Messico, Argentina, Germania,\n"
+" Svezia, Russia, Giappone, Finlandia e Italia, solo per citarne alcuni...</"
+"p>\n"
+
+#: ../docs/en/tips.cpp:169
+msgid ""
+"<p>...that Rosegarden is available in Spanish, French, German, Russian, "
+"Welsh, Swedish, Italian and Estonian\n"
+"translations? (Just to name a few.)<br><br>\n"
+"If you're interested in translating Rosegarden to another language, drop us "
+"a\n"
+"line at <b>[email protected]</b>.</p>\n"
+msgstr ""
+"<p>...che Rosegarden è tradotto in spagnolo, francese, tedesco, russo,\n"
+"gallese, svedese, italiano e estone (solo per citarne alcuni)?<br><br>\n"
+"Se sei interessato a tradurre Rosegarden in un'altra lingua, manda un\n"
+"messaggio a <b>[email protected]</b>.</p>\n"
+
+#: ../docs/en/tips.cpp:177
+msgid ""
+"<p>...that you can change the total number of bars in the composition via\n"
+"<b>Composition -> Change Composition Start and End</b>?</p>\n"
+msgstr ""
+"<p>...che puoi cambiare il numero totale delle battute nella composizione "
+"tramite\n"
+"<b>Composizione ->Cambia inizio e fine della composizione</b>?</p>\n"
+
+#: ../docs/en/tips.cpp:183
+msgid ""
+"<p>...that you can see the difference between performance and display "
+"duration\n"
+"of duration-quantized notes in the notation editor?<br><br>\n"
+"Use <b>Settings -> Show Raw Note Ruler</b> to turn on this handy\n"
+"feature.<br><br>\n"
+"<i>Note that this feature does not work in page layout view.</i></p>\n"
+msgstr ""
+"<p>...che puoi vedere la differenza di durata tra esecuzione e "
+"visualizzazione \n"
+"per le note quantizzate?<br><br>\n"
+"Usa <b>Impostazioni ->Mostra indicatore delle note pure</b>\n"
+"Questa caratteristica non funziona nella modalità di visualizzazione a "
+"pagina</p>\n"
+
+#: ../docs/en/tips.cpp:192
+msgid ""
+"<p>...that you can add tempo and time-signature changes by double-clicking "
+"on the values displayed in the transport window or tempo rulers?</p>\n"
+msgstr ""
+"<p>...che puoi cambiare il ritmo e l'indicazione di tempo\n"
+"cliccando due volte sui valori mostrati nella finestra del trasporto\n"
+"o sulle barre del tempo?</p>\n"
+
+#: ../docs/en/tips.cpp:197
+msgid ""
+"<p>...that the transport window can display musical time, sample frame "
+"count, and a visual metronome as well as real time?<br><br>Just click on the "
+"small button at the extreme top left of the window.</p>\n"
+msgstr ""
+"<p>...che la finestra di trasporto può mostrare il tempo musicale, il "
+"conteggio dei frame, un metronomo visuale o il tempo reale?<br><br> Basta "
+"cliccare nella finestra sul piccolo bottone in alto a sinistra.</p>\n"
+
+#: ../docs/en/tips.cpp:202
+msgid ""
+"<p>...that you can select all notes of a particular pitch in the matrix "
+"view, by shift-clicking on that pitch on the piano keyboard at the left?"
+"<br><br>If you shift-click-drag, you can select whole ranges too.</p>\n"
+msgstr ""
+"<p>...che puoi selezionare tutte le note di una particolare altezza nella "
+"modalità matrice, facendo Maiusc-click su quell'ottava sulla tastiera del "
+"piano a sinistra?<br><br> Se fai Maiusc-click e trascini, puoi selezionare "
+"anche degli intervalli.</p>\n"
+
+#: ../docs/en/tips.cpp:207
+msgid ""
+"<p>...that you can set a loop in the main window by clicking-and-dragging on "
+"the time ruler with Shift pressed?<br><br>(If the ruler isn't visible, use "
+"<b>Settings -> Show Rulers</b>.)</p>\n"
+msgstr ""
+"<p>...che puoi impostare una ripetizione nella finestra principale, "
+"cliccando e trascinando sul righello del tempo tenendo premuto Maiusc?"
+"<br><br> (Se il righello non è visibile, usa <b>Impostazioni -> Mostra "
+"Righelli</b>.)</p>\n"
+
+#: ../docs/en/tips.cpp:212
+msgid ""
+"<p>...that if you're editing a section in the matrix or notation view, you "
+"can\n"
+"set that section to loop while you edit it?<br><br>Select it and use "
+"<b>Tools ->\n"
+"Local Cursor -> Set Loop to Selection</b>, then hit Play.</p><br><br>\n"
+"<i>This feature does not work quite as well for compositions that include "
+"sampled\n"
+"audio.</i>\n"
+msgstr ""
+"<p>...che se stai modificando una sezione nella vista a matrice o di "
+"notazione,\n"
+"puoi mettere la sezione in ripetizione mentre la editi?<br><br> Selezionala "
+"e usa <b>Strumenti -> Cursore Locale -> Imposta ripetizione della selezione</"
+"b>,\n"
+"poi premi Riproduci.</p><br><br>\n"
+"<i>Questa funzione non va molto bene per composizioni che includono audio "
+"registrato.</i>\n"
+
+#: ../docs/en/tips.cpp:221
+msgid ""
+"<p>...if you have more than one note or controller event at the same time, "
+"you\n"
+"can use the [ and ] keys to flip the stack of events around on the "
+"controller\n"
+"and velocity rulers in order to bring the item you wish to adjust into\n"
+"focus.</p>\n"
+msgstr ""
+"<p>...se hai più di un evento di controller o di nota contemporaneamente,\n"
+"puoi usare i tasti [ e ] per sfogliare la lista degli eventi sui righelli "
+"del\n"
+"controller e della velocità, in modo da evidenziare l'evento che vuoi\n"
+"modificare.</p>\n"
+
+#: ../docs/en/tips.cpp:229
+msgid ""
+"<p>...that the notation view shows you notes using their display duration, "
+"while the\n"
+"matrix allows you to edit their performance duration?<br><br>\n"
+"<i>Be careful with tied notes in the matrix. It is not apparent that they "
+"are\n"
+"tied, and if you split up a pair of tied notes, subsequent notation views "
+"will\n"
+"be confused and unhappy. This is an old bug that has been on our TODO list\n"
+"for years. Sorry about that, folks. Patches welcome.</i>\n"
+"</p>\n"
+msgstr ""
+"<p>...che la vista di notazione mostra le note usando la durata sul rigo,\n"
+"mentre l'editor di matrice ti permette di modificare la durata della loro "
+"esecuzione?<br><br>\n"
+"<i>Attenzione alle note legate nella matrice. Non si vede che sono legate,\n"
+"e se spezzi una coppia di note legate, tutta la notazione successiva\n"
+"diventerà confusa. Questo è un vecchio baco, da anni nella lista delle cose\n"
+" da fare (TODO). Ci spiace, ragazzi! Ogni patch è benvenuta.</i>\n"
+"</p>\n"
+
+#: ../docs/en/tips.cpp:240
+msgid ""
+"<p>If you're working with a human performance and you need to insert some "
+"new\n"
+"notes, these new notes will sound for their entire written duration. To "
+"blend\n"
+"these new notes into a human performance, select them, then use <b>Adjust -> "
+"Interpret...</b> \n"
+"from the notation view to interpret any marks and massage their "
+"performance\n"
+"durations to something less mechanical.</p>\n"
+msgstr ""
+"<p>Se stai lavorando a una esecuzione umana e devi introdurre delle\n"
+"note nuove, queste suoneranno per la loro intera durata. Per armonizzare\n"
+"queste nuove note in un'esecuzione umana, selezionale e usa\n"
+"<b>Aggiusta -> Interpreta...</b> dalla vista a notazione per interpretare\n"
+"ogni segno e rendere meno meccanica la loro esecuzione.</p>\n"
+
+#: ../docs/en/tips.cpp:249
+msgid ""
+"<p>...that Rosegarden can export certain things to LilyPond that it cannot "
+"yet\n"
+"display within its own native interface?<br><br>These new directives can be "
+"inserted\n"
+"via the <b>T</b> text insert tool in the notation view.<br><br>\n"
+"Load the example files\n"
+"<b>lilypond-alternative-endings.rg</b> and <b>lilypond-directives.rg</b> for "
+"a\n"
+"demonstration of how to use the new exportable directives.<br><br>\n"
+"Use <b>File -> Preview with\n"
+"LilyPond</b> to see what they look like on the exported page.<br><br>\n"
+"<i>Be sure to turn on\n"
+"<b>Settings -> Show LilyPond Directives</b> and <b>Show Annotations</b> "
+"within\n"
+"the notation view.</i></p>\n"
+msgstr ""
+"<p>...che Rosegarden può esportare in LilyPond alcune cose che non riesce "
+"ancora a\n"
+" mostrare con la sua interfaccia?<br><br> Queste nuove direttive si possono "
+"inserire\n"
+"tramite lo strumento Inserisci Testo <b>T</b> nella vista a notazione."
+"<br><br>\n"
+"Carica i file di esempio\n"
+"<b>lilypond-alternative-endings.rg</b> e <b>lilypond-directives.rg</b> per\n"
+"una dimostrazione su come usare le nuove direttive di esportazione.<br><br>\n"
+"Usa <b>File -> Anteprima con LilyPond</b> per vedere come appariranno\n"
+" sulla pagina esportata.<br><br>\n"
+"<i>Assicurati di attivare\n"
+"<b>Impostazioni -> Mostra le direttive di LilyPond</b> e\n"
+" <b>Mostra annotazioni</b> nella vista di notazione.</i></p>\n"
+
+#: ../docs/en/tips.cpp:264
+msgid ""
+"<p>...that Rosegarden has track parameters allowing you to <b>Create "
+"segments with:</b> certain\n"
+"properties by default?<br><br>You can pre-select the clef, transposition, "
+"colour, and specify\n"
+"the highest and lowest playable notes (notes outside this range display in\n"
+"red by default). Then draw a segment with the pencil, or record one, and "
+"any\n"
+"new segments created on this track will take these properties as segment\n"
+"parameters.<br><br>\n"
+"<i>These parameters do not apply to audio tracks.</i></p>\n"
+msgstr ""
+"<p>...che Rosegarden ha dei parametri di traccia per\n"
+" <b>Creare segmenti con:</b> specifiche proprietà?<br><br> Puoi "
+"preselezionare chiave, trasposizione, colore, e specificare la nota più "
+"acuta e grave riproducibile\n"
+"(le note fuori da questo intervallo verranno disegnate in rosso). Poi "
+"disegna un\n"
+"segmento con la matita, o registrane uno, e ogni nuovo segmento creato\n"
+"su questa traccia avrà le stesse proprietà.<br><br>\n"
+"<i>Questi parametri non si applicano alle tracce audio.</i></p>\n"
+
+#: ../docs/en/tips.cpp:275
+msgid ""
+"<p>...that Rosegarden has a database of preset parameters describing more "
+"than 300\n"
+"musical instruments from the real world, grouped into several convenient\n"
+"categories?<br><br>Each preset contains a clef, transposition, and playable "
+"range\n"
+"suggestions for both amateur and professional players.<br><br>Click the\n"
+"<b>Load</b> button in the new track parameters box to get started! <i>(If "
+"you\n"
+"do not see a <b>Load</b> button, be sure your parameter panel is set for\n"
+"tabbed mode, rather than stacked mode.)</i> <br><br> <i>(Special thanks to "
+"Magnus\n"
+"Johansson for assembling this extraordinary database.)</i></p>\n"
+msgstr ""
+"<p>...che Rosegarden ha un database di parametri preselezionati che "
+"descrivono\n"
+"più di 300 strumenti musicali del mondo reale, raggruppati in varie "
+"categorie?<br><br>Ogni preselezione contiene una chiave, una trasposizione e "
+"suggerimenti per l'intervallo suonabile\n"
+"sia per gli amatori che per i professionisti.<br><br> Clicca il pulsante "
+"<b>Carica</b> nel riquadro dei parametri per tracce nuove dei parametri per "
+"iniziare!\n"
+"<i>(Se non trovi il pulsante <b>Carica</b>, controlla che il pannello dei\n"
+" parametri sia posto nel modo \"tabulato\" e non in quello \"impilato\".</"
+"i><br><br>\n"
+"<i>(Un ringraziamento speciale a Magnus Johansson per aver formato questo\n"
+" straordinario database.)</i></p>\n"
+
+#: ../docs/en/tips.cpp:287
+msgid ""
+"<p>...that when exporting to Lilypond, you can merge tracks that have the "
+"same name onto a single staff?<br><br>For example, if there are three voices "
+"in a single part, write each\n"
+"voice as an independent segment/staff, each on a separate track. Give all\n"
+"three tracks the same name, and select <b>[x] Merge tracks that have the "
+"same\n"
+"name</b> from the options dialog that appears when you export to, or "
+"preview\n"
+"with LilyPond.<br><br>\n"
+"<i>The tracks must have a non-default name for this to work.</i></p>\n"
+msgstr ""
+"<p>...che quando esporti in LilyPond puoi unire le tracce che hanno lo "
+"stesso nome su un singolo pentagramma?<br><br>Per esempio, se ci sono tre "
+"voci in una parte, scrivi ogni voce\n"
+"su un pentagramma distinto, ognuna in una traccia separata. Dai a tutte le\n"
+"tracce lo stesso nome, e scegli <b>[x] Unisci le tracce che hanno lo stesso "
+"nome</b>\n"
+"nelle opzioni che appaiono quando esporti, o crei un'anteprima, con LilyPond."
+"<br><br>\n"
+"<i>Le tracce devono avere un nome non predefinito perché questo funzioni.</"
+"i>\n"
+
+#: ../docs/en/tips.cpp:297
+msgid ""
+" \t \n"
+"<p>...that you can use the mouse wheel to scroll up and down, scroll left "
+"and right, and zoom in and out?<br><br>Just roll the wheel to scroll up or "
+"down. Hold Alt as well to scroll left or right, or hold Ctrl to zoom in and "
+"out.</p> \t \n"
+msgstr ""
+" \t \n"
+"<p>...che puoi usare la rotella del mouse per scorrere su e giù, scorrere a "
+"destra e sinistra, ingrandire e rimpicciolire?<br><br>Muovi la rotella per "
+"scorrere su e giú, tieni premuto anche Alt per scorrere a destra e sinistra, "
+"tieni premuto Control per ingrandire o rimpicciolire.</p> \t \n"
+
+#: ../docs/en/tips.cpp:303
+msgid ""
+" \t \n"
+"<p>...that you can time-stretch an audio segment -- stretching or squashing "
+"a\n"
+"sample to a different duration without changing its pitch -- just by\n"
+"dragging its right edge with the Ctrl key pressed?</p>\n"
+msgstr ""
+" \t \n"
+"<p>...che puoi allungare o accorciare la durata di un segmento audio -- "
+"senza cambiare la sua tonalità -- semplicemente muovendo la sua estremità "
+"destra e tenendo premuto Control?</p>\n"
+
+#: ../docs/en/tips.cpp:311
+msgid ""
+" \t \n"
+"<p>...that you can add audio to your Rosegarden composition just by dragging "
+"an audio file from your file manager and dropping it on the Rosegarden "
+"segment canvas? (Make sure you drop it on an audio track!)<br><br>You can "
+"also drop audio files from Rosegarden's audio file manager window onto the "
+"segment canvas, and from other programs onto the audio file manager.</p>\n"
+msgstr ""
+" \t \n"
+"<p>...che puoi aggiungere dell'audio alla tua composizione in Rosegarden "
+"semplicemente trascinando un file audio dal tuo gestore dei file sul "
+"tracciato dei segmenti nella finestra di Rosegarden? (Assicurati di "
+"trascinarlo su una traccia audio!)<br><br>Puoi anche trascinare i file audio "
+"dal gestore file audio di Rosegarden direttamente sul tracciato, e da altri "
+"programmi sul gestore file audio.</p>\n"
+
+#: ../docs/en/tips.cpp:317
+msgid ""
+" \t \n"
+"<p>...that you can set the tempo to match the duration of an audio segment "
+"if you know it's an exact number of bars or beats long?<br><br>Just select "
+"the audio segment and use <b>Composition -> Tempo and Time Signature -> Set "
+"Tempo to Audio Segment Duration</b>.</p>\n"
+msgstr ""
+" \t \n"
+"<p>...che puoi impostare il tempo in modo da impostare esattamente la durata "
+"di un segmento audio, se sai il suo numero di battute o di battiti?<br><br> "
+"Basta selezionare il segmento audio e usare <b>Composizione -> Imposta il "
+"ritmo alla durata del segmento audio</b>.</p>\n"
+
+#: ../data/fonts/mappings/fonts.cpp:1
+msgid "Feta Pixmaps"
+msgstr "Feta Pixmap"
+
+#: ../data/fonts/mappings/fonts.cpp:2 ../data/fonts/mappings/fonts.cpp:7
+msgid "GNU Lilypond"
+msgstr "GNU LilyPond"
+
+#: ../data/fonts/mappings/fonts.cpp:3 ../data/fonts/mappings/fonts.cpp:8
+msgid "Copyright (c) 1997--2003 Han-Wen Nienhuys and Jan Nieuwenhuizen"
+msgstr "Copyright (c) 1997--2003 Han-Wen Nienhuys e Jan Nieuwenhuizen"
+
+#: ../data/fonts/mappings/fonts.cpp:4 ../data/fonts/mappings/fonts.cpp:9
+#: ../data/fonts/mappings/fonts.cpp:14 ../data/fonts/mappings/fonts.cpp:19
+#: ../data/fonts/mappings/fonts.cpp:24 ../data/fonts/mappings/fonts.cpp:29
+#: ../data/fonts/mappings/fonts.cpp:34 ../data/fonts/mappings/fonts.cpp:39
+#: ../data/fonts/mappings/fonts.cpp:44 ../data/fonts/mappings/fonts.cpp:49
+#: ../data/fonts/mappings/fonts.cpp:54
+msgid "Chris Cannam"
+msgstr "Chris Cannam"
+
+#: ../data/fonts/mappings/fonts.cpp:5 ../data/fonts/mappings/fonts.cpp:40
+msgid "pixmap"
+msgstr "pixmap"
+
+#: ../data/fonts/mappings/fonts.cpp:6
+msgid "Feta"
+msgstr "Feta"
+
+#: ../data/fonts/mappings/fonts.cpp:10 ../data/fonts/mappings/fonts.cpp:15
+#: ../data/fonts/mappings/fonts.cpp:20 ../data/fonts/mappings/fonts.cpp:25
+#: ../data/fonts/mappings/fonts.cpp:30 ../data/fonts/mappings/fonts.cpp:35
+#: ../data/fonts/mappings/fonts.cpp:45 ../data/fonts/mappings/fonts.cpp:50
+#: ../data/fonts/mappings/fonts.cpp:55
+msgid "scalable"
+msgstr "scalabile"
+
+#: ../data/fonts/mappings/fonts.cpp:11
+msgid "Fughetta"
+msgstr "Fughetta"
+
+#: ../data/fonts/mappings/fonts.cpp:12
+msgid ""
+"Created by Blake Hodgetts; freely redistributable. See http://www.efn.org/"
+"~bch/aboutfonts.html"
+msgstr ""
+"Creato da Blake Hodgetts; liberamente ridistribuibile. Vedi http://www.efh."
+"org/~bch/aboutfonts.html"
+
+#: ../data/fonts/mappings/fonts.cpp:13
+msgid "Copyright 1995-1999 Blake Hodgetts"
+msgstr "Copyright 1995-1999 Blake Hodgetts"
+
+#: ../data/fonts/mappings/fonts.cpp:16
+msgid "Inkpen"
+msgstr "Inkpen"
+
+#: ../data/fonts/mappings/fonts.cpp:17
+msgid "Inkpen is part of Sibelius, but other fonts may use the same mappings."
+msgstr ""
+"Inkpen fa parte di Sibelius, ma altri font possono usare le stesse funzioni."
+
+#: ../data/fonts/mappings/fonts.cpp:18 ../data/fonts/mappings/fonts.cpp:28
+msgid "Copyright Sibelius Software Ltd"
+msgstr "Copyright Sibelius Software Ltd"
+
+#: ../data/fonts/mappings/fonts.cpp:21
+msgid "Maestro"
+msgstr "Maestro"
+
+#: ../data/fonts/mappings/fonts.cpp:22
+msgid "Maestro is part of Finale, but other fonts use the same mappings."
+msgstr "Maestro fa parte di Finale, ma altri font usano le stesse funzioni."
+
+#: ../data/fonts/mappings/fonts.cpp:23 ../data/fonts/mappings/fonts.cpp:33
+msgid "Copyright Coda Inc"
+msgstr "Copyright Coda Inc"
+
+#: ../data/fonts/mappings/fonts.cpp:27
+msgid "Opus is part of Sibelius, but other fonts may use the same mappings."
+msgstr ""
+"Opus fa parte di Sibelius, ma altri font possono usare le stesse funzioni."
+
+#: ../data/fonts/mappings/fonts.cpp:31
+msgid "Petrucci"
+msgstr "Petrucci"
+
+#: ../data/fonts/mappings/fonts.cpp:32
+msgid "Petrucci is part of Finale, but other fonts use the same mappings."
+msgstr "Petrucci fa parte di Finale, ma altri font usano le stesse funzioni."
+
+#: ../data/fonts/mappings/fonts.cpp:36
+msgid "RG21"
+msgstr "RG21"
+
+#: ../data/fonts/mappings/fonts.cpp:37
+msgid "Rosegarden 2.1"
+msgstr "Rosegarden 2.1"
+
+#: ../data/fonts/mappings/fonts.cpp:38
+msgid "Copyright (c) 1994--2001 Chris Cannam"
+msgstr "Copyright (c) 1994--2001 Chris Cannam"
+
+#: ../data/fonts/mappings/fonts.cpp:41
+msgid "Sonata"
+msgstr "Sonata"
+
+#: ../data/fonts/mappings/fonts.cpp:42
+msgid "Adobe"
+msgstr "Adobe"
+
+#: ../data/fonts/mappings/fonts.cpp:43
+msgid "Copyright Adobe Inc"
+msgstr "Copyright Adobe Inc"
+
+#: ../data/fonts/mappings/fonts.cpp:46
+msgid "Steinberg"
+msgstr "Steinberg"
+
+#: ../data/fonts/mappings/fonts.cpp:47
+msgid "The Steinberg Notation font is part of Cubase."
+msgstr "Il font Steinberg Notation fa parte di Cubase."
+
+#: ../data/fonts/mappings/fonts.cpp:48
+msgid "Copyright Steinberg Inc"
+msgstr "Copyright Steinberg Inc"
+
+#: ../data/fonts/mappings/fonts.cpp:51
+msgid "Xinfonia"
+msgstr "Xinfonia"
+
+#: ../data/fonts/mappings/fonts.cpp:52
+msgid "xemo.org"
+msgstr "xemo.org"
+
+#: ../data/fonts/mappings/fonts.cpp:53
+msgid "Copyright 2001-2003 Xemus Software LLC"
+msgstr "Copyright 2001-2003 Xemus Software LLC"
+
+#: ../data/styles/styles.cpp:1
+msgid "Classical"
+msgstr "Classico"
+
+#: ../data/styles/styles.cpp:2
+msgid "Cross"
+msgstr "Croce"
+
+#: ../data/styles/styles.cpp:3
+msgid "Mensural"
+msgstr "Mensurale"
+
+#: ../data/styles/styles.cpp:4
+msgid "Triangle"
+msgstr "Triangolo"
diff --git a/po/ja.po b/po/ja.po
new file mode 100644
index 0000000..295e740
--- /dev/null
+++ b/po/ja.po
@@ -0,0 +1,11185 @@
+# translation of ja17.po to Japanese
+# translation of ja.po to
+# This file is distributed under the same license as the PACKAGE package.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER.
+# oota toshiya <[email protected]>, 2006, 2007, 2008.
+# ribbon <[email protected]>, 2007.
+# oota toshiya <[email protected]>, 2008.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: ja\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-04-24 18:19-0400\n"
+"PO-Revision-Date: 2008-04-20 09:45+0900\n"
+"Last-Translator: oota toshiya <[email protected]>\n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 3.4.2\n"
+
+#: ../src/gui/dialogs/RescaleDialog.cpp:51 rc.cpp:192 rc.cpp:312
+#, no-c-format
+msgid "Rescale"
+msgstr "スケールの変更"
+
+#: ../src/gui/dialogs/RescaleDialog.cpp:56
+msgid "Duration of selection"
+msgstr "選択範囲の長さ"
+
+#: ../src/gui/dialogs/RescaleDialog.cpp:62
+msgid "Adjust times of following events accordingly"
+msgstr "以降のイベントの位置を適切に調整する"
+
+#: ../src/gui/dialogs/PitchDialog.cpp:45
+#: ../src/gui/dialogs/RescaleDialog.cpp:72
+#: ../src/gui/dialogs/TimeDialog.cpp:51 ../src/gui/dialogs/TimeDialog.cpp:68
+#: ../src/gui/studio/BankEditorDialog.cpp:109
+msgid "Reset"
+msgstr "リセット"
+
+#: ../src/commands/segment/SegmentSplitByPitchCommand.cpp:46
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:46
+msgid "Split by Pitch"
+msgstr "音程で分割"
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:54
+msgid "Starting split pitch"
+msgstr "音程の分割位置"
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:57
+msgid "Range up and down to follow music"
+msgstr "旋律を配慮して範囲を広げ(縮め)る"
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:63
+msgid "Duplicate non-note events"
+msgstr "非ノートイベントを複製する"
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:66
+msgid "Clef handling:"
+msgstr "音部記号の操作"
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:69
+msgid "Leave clefs alone"
+msgstr "音部記号をそのままにする"
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:70
+msgid "Guess new clefs"
+msgstr "新しい音部記号の推測"
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:71
+msgid "Use treble and bass clefs"
+msgstr "ト音およびヘ音記号の使用"
+
+#: ../src/gui/dialogs/DocumentConfigureDialog.cpp:64
+msgid "Document Properties"
+msgstr "ドキュメントのプロパティ"
+
+#: ../src/gui/dialogs/MakeOrnamentDialog.cpp:45
+#: ../src/gui/editors/notation/NotationView.cpp:6048
+msgid "Make Ornament"
+msgstr "オルナメントの作成"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:183
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:179
+#: ../src/gui/dialogs/EventEditDialog.cpp:128
+#: ../src/gui/dialogs/MakeOrnamentDialog.cpp:49
+#: ../src/gui/studio/DeviceEditorDialog.cpp:74
+#: ../src/gui/studio/NameSetEditor.cpp:72
+#: ../src/gui/widgets/ColourTable.cpp:51
+msgid "Name"
+msgstr "名前"
+
+#: ../src/gui/dialogs/MakeOrnamentDialog.cpp:51
+msgid ""
+"The name is used to identify both the ornament\n"
+"and the triggered segment that stores\n"
+"the ornament's notes."
+msgstr ""
+"名前は、オルナメントと、オルナメントされた音符があるトリガされた\n"
+"セグメント両方を識別するために使われます。"
+
+#: ../src/gui/dialogs/MakeOrnamentDialog.cpp:54
+msgid "Name: "
+msgstr "名前: "
+
+#: ../src/gui/dialogs/MakeOrnamentDialog.cpp:57
+#: ../src/gui/editors/eventlist/EventView.cpp:717
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:92
+msgid "Base pitch"
+msgstr "ベースピッチ"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:57
+#: ../src/gui/editors/eventlist/EventView.cpp:140
+msgid "Text"
+msgstr "テキスト"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:66
+msgid "Specification"
+msgstr "文字列指定"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:68
+msgid "Preview"
+msgstr "プレビュー"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:72
+msgid "Text: "
+msgstr "テキスト: "
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:79
+msgid "Style: "
+msgstr "スタイル: "
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:90
+msgid "Dynamic"
+msgstr "強弱記号"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:93
+msgid "Direction"
+msgstr "演奏指示"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:96
+msgid "Local Direction"
+msgstr "局所的な演奏指示"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:63
+#: ../src/gui/dialogs/TextEventDialog.cpp:99
+#: ../src/gui/editors/tempo/TempoView.cpp:91
+msgid "Tempo"
+msgstr "速度記号"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:102
+msgid "Local Tempo"
+msgstr "局所的な速度記号"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:105
+msgid "Lyric"
+msgstr "歌詞"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:108
+#: ../src/gui/editors/notation/NotationView.cpp:4242
+msgid "Chord"
+msgstr "コード"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:111
+msgid "Annotation"
+msgstr "注釈"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:114
+msgid "LilyPond Directive"
+msgstr "Lilypondディレクティブ"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:138
+msgid "Verse: "
+msgstr "歌詞: "
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:148
+msgid "Dynamic: "
+msgstr "強弱記号:"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:152
+msgid "ppp"
+msgstr "ppp"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:153
+msgid "pp"
+msgstr "pp"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:154
+msgid "p"
+msgstr "p"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:155
+msgid "mp"
+msgstr "mp"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:156
+msgid "mf"
+msgstr "mf"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:157
+msgid "f"
+msgstr "f"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:158
+msgid "ff"
+msgstr "ff"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:159
+msgid "fff"
+msgstr "fff"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:160
+msgid "rfz"
+msgstr "rfz"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:161
+msgid "sf"
+msgstr "sf"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:165
+msgid "Direction: "
+msgstr "説明: "
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:174
+msgid " ,"
+msgstr " ,"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:175
+msgid "D.C. al Fine"
+msgstr "D.C. al Fine"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:176
+msgid "D.S. al Fine"
+msgstr "D.S. al Fine"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:177
+msgid "Fine"
+msgstr "Fine"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:178
+msgid "D.S. al Coda"
+msgstr "D.S. al Coda"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:179
+msgid "to Coda"
+msgstr "to Coda"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:180
+msgid "Coda"
+msgstr "Coda"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:184
+msgid "Local Direction: "
+msgstr "局所的な演奏記号"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:188
+msgid "accel."
+msgstr "accel."
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:189
+msgid "ritard."
+msgstr "ritard."
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:190
+msgid "ralletando"
+msgstr "ralletando"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:191
+msgid "a tempo"
+msgstr "a tempo"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:192
+msgid "legato"
+msgstr "legato"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:193
+msgid "simile"
+msgstr "simile"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:194
+msgid "pizz."
+msgstr "pizz."
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:195
+msgid "arco"
+msgstr "arco"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:196
+msgid "non vib."
+msgstr "non vib."
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:197
+msgid "sul pont."
+msgstr "sul pont."
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:198
+#: ../src/gui/dialogs/TextEventDialog.cpp:200
+msgid "sul tasto"
+msgstr "sul tasto"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:199
+msgid "con legno"
+msgstr "con legno"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:201
+msgid "sul G"
+msgstr "sul G"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:202
+msgid "ordinario"
+msgstr "ordinario"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:203
+msgid "Muta in "
+msgstr "Muta in "
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:204
+msgid "volti subito "
+msgstr "volti subito "
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:205
+msgid "soli"
+msgstr "soli"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:206
+msgid "div."
+msgstr "div."
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:210
+msgid "Tempo: "
+msgstr "テンポ: "
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:214
+#: ../src/gui/dialogs/TextEventDialog.cpp:238
+msgid "Grave"
+msgstr "Grave"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:215
+#: ../src/gui/dialogs/TextEventDialog.cpp:239
+msgid "Adagio"
+msgstr "Adagio"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:216
+#: ../src/gui/dialogs/TextEventDialog.cpp:240
+msgid "Largo"
+msgstr "Largo"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:217
+#: ../src/gui/dialogs/TextEventDialog.cpp:241
+msgid "Lento"
+msgstr "Lento"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:218
+#: ../src/gui/dialogs/TextEventDialog.cpp:242
+msgid "Andante"
+msgstr "Andante"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:219
+#: ../src/gui/dialogs/TextEventDialog.cpp:243
+msgid "Moderato"
+msgstr "Moderato"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:220
+#: ../src/gui/dialogs/TextEventDialog.cpp:244
+msgid "Allegretto"
+msgstr "Allegretto"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:221
+#: ../src/gui/dialogs/TextEventDialog.cpp:245
+msgid "Allegro"
+msgstr "Allegro"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:222
+#: ../src/gui/dialogs/TextEventDialog.cpp:246
+msgid "Vivace"
+msgstr "Vivace"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:223
+#: ../src/gui/dialogs/TextEventDialog.cpp:247
+msgid "Presto"
+msgstr "Presto"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:224
+#: ../src/gui/dialogs/TextEventDialog.cpp:248
+msgid "Prestissimo"
+msgstr "Prestissimo"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:225
+#: ../src/gui/dialogs/TextEventDialog.cpp:249
+msgid "Maestoso"
+msgstr "Maestoso"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:226
+#: ../src/gui/dialogs/TextEventDialog.cpp:250
+msgid "Sostenuto"
+msgstr "Sostenuto"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:227
+#: ../src/gui/dialogs/TextEventDialog.cpp:251
+msgid "Tempo Primo"
+msgstr "Tempo Primo"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:234
+msgid "Local Tempo: "
+msgstr "局所的な速度記号"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:255
+msgid "Directive: "
+msgstr "ディレクティブ: "
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:312
+msgid "Example"
+msgstr "例"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:65
+msgid "Event Filter"
+msgstr "イベントフィルタ"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:86
+msgid "Note Events"
+msgstr "ノートイベント"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:90
+msgid "lowest:"
+msgstr "下限:"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:93
+msgid "highest:"
+msgstr "上限:"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:96
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:141
+#: ../src/gui/widgets/PitchChooser.cpp:53
+msgid "Pitch:"
+msgstr "音程:"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:99
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:163
+msgid "Velocity:"
+msgstr "ベロシティ:"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:102
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:129
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:257
+msgid "Duration:"
+msgstr "デュレーション:"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:107
+#: ../src/gui/dialogs/EventFilterDialog.cpp:114
+#: ../src/gui/dialogs/EventFilterDialog.cpp:121
+msgid "include"
+msgstr "含む"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:108
+#: ../src/gui/dialogs/EventFilterDialog.cpp:115
+#: ../src/gui/dialogs/EventFilterDialog.cpp:122
+msgid "exclude"
+msgstr "含まない"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:136
+#: ../src/gui/dialogs/EventFilterDialog.cpp:155
+#: ../src/gui/editors/eventlist/EventView.cpp:172
+#: ../src/gui/editors/eventlist/EventView.cpp:179
+#: ../src/gui/editors/eventlist/EventView.cpp:186
+msgid "edit"
+msgstr "編集"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:141
+#: ../src/gui/dialogs/EventFilterDialog.cpp:157
+msgid "choose a pitch using a staff"
+msgstr "五線譜を使用して音程を選択する"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:182
+#: ../src/gui/dialogs/EventFilterDialog.cpp:188
+msgid "longest"
+msgstr "最長"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:200
+msgid "Include all"
+msgstr "すべてを含める"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:203
+msgid "Include entire range of values"
+msgstr "すべての範囲の値を含める"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:206
+msgid "Exclude all"
+msgstr "すべてを排除"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:209
+msgid "Exclude entire range of values"
+msgstr "すべての範囲の値を排除"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:233
+#: ../src/gui/dialogs/EventFilterDialog.cpp:234
+msgid "shortest"
+msgstr "最短"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:333
+msgid "Lowest pitch"
+msgstr "最低音:"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:343
+msgid "Highest pitch"
+msgstr "最高音:"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:56
+#: ../src/gui/editors/notation/NotationView.cpp:1619
+#: ../src/gui/editors/notation/NotationView.cpp:6088
+msgid "Use Ornament"
+msgstr "オルナメントの使用"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:260
+#: ../src/gui/configuration/NotationConfigurationPage.h:64
+#: ../src/gui/configuration/NotationConfigurationPage.h:65
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:63
+msgid "Notation"
+msgstr "譜面"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:68
+msgid "Display as: "
+msgstr "右記として表示: "
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:84
+msgid "Trill"
+msgstr "トリル"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:84
+msgid "Trill with line"
+msgstr "波線を伴うトリル"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:84
+msgid "Trill line only"
+msgstr "トリル線のみ"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:85
+msgid "Turn"
+msgstr "ターン"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:85
+msgid "Mordent"
+msgstr "モルデント"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:85
+msgid "Inverted mordent"
+msgstr "反転したモルデント"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:86
+msgid "Long mordent"
+msgstr "長いモルデント"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:86
+msgid "Long inverted mordent"
+msgstr "長い反転したモルデント"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:94
+msgid "Text mark"
+msgstr "テキストマーク"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:98
+msgid " Text: "
+msgstr " テキスト: "
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:104
+msgid "Performance"
+msgstr "パフォーマンス"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:109
+msgid "Perform using triggered segment: "
+msgstr "トリガーセグメントを使用して演奏"
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:75
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:123
+msgid "Perform with timing: "
+msgstr "再生時の発音時間補正"
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:81
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:129
+msgid "As stored"
+msgstr "として保存"
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:82
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:130
+msgid "Truncate if longer than note"
+msgstr "音符より長い場合は短縮"
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:83
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:131
+msgid "End at same time as note"
+msgstr "同じ音符で終了"
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:84
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:132
+msgid "Stretch or squash segment to note duration"
+msgstr "セグメントを音符デュレーションでストレッチ/スカッシュ"
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:86
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:134
+msgid "Adjust pitch to note"
+msgstr "音符に対してピッチを調整"
+
+#: ../src/gui/dialogs/PitchPickerDialog.cpp:40
+msgid "Pitch Selector"
+msgstr "ピッチセレクタ"
+
+#: ../src/gui/dialogs/BeatsBarsDialog.cpp:44
+msgid "Audio Segment Duration"
+msgstr "オーディオセグメントのデュレーション"
+
+#: ../src/gui/dialogs/BeatsBarsDialog.cpp:50
+msgid "The selected audio segment contains:"
+msgstr "選択されたオーディオセグメントは以下を含む:"
+
+#: ../src/gui/dialogs/BeatsBarsDialog.cpp:59
+msgid "beat(s)"
+msgstr "拍"
+
+#: ../src/gui/dialogs/BeatsBarsDialog.cpp:60
+msgid "bar(s)"
+msgstr "小節"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:51
+msgid "Tuplet"
+msgstr "連符"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:58
+msgid "New timing for tuplet group"
+msgstr "連符を次のように設定"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:76
+msgid "Play "
+msgstr "連符の個数と表記単位"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:98
+msgid "in the time of "
+msgstr "連符全体の長さ"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:104
+msgid "Timing is already correct: update display only"
+msgstr "タイミングはすでに修正済み;表示のみ更新"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:114
+msgid "Timing calculations"
+msgstr "タイミングの計算"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:120
+msgid "Selected region:"
+msgstr "選択された領域 "
+
+#: ../src/gui/dialogs/TupletDialog.cpp:129
+msgid "Group with current timing:"
+msgstr "変更前の長さの合計は"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:135
+msgid "Group with new timing:"
+msgstr "変更後の長さの合計は"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:141
+msgid "Gap created by timing change:"
+msgstr "変更前後の差は"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:149
+msgid "Unchanged at end of selection:"
+msgstr "選択終端付近で変更しない長さは"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:63 rc.cpp:372
+#, no-c-format
+msgid "Metronome"
+msgstr "メトロノーム"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:77
+msgid "Metronome Instrument"
+msgstr "メトロノームインストゥルメント"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:82
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:150
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:183
+#: ../src/gui/studio/DeviceEditorDialog.cpp:73
+#: ../src/gui/studio/DeviceManagerDialog.cpp:105
+#: ../src/gui/studio/DeviceManagerDialog.cpp:163
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:66
+msgid "Device"
+msgstr "デバイス"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:101
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:89
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:215
+#: ../src/gui/studio/DeviceEditorDialog.cpp:195
+#: ../src/gui/studio/DeviceEditorDialog.cpp:218
+#: ../src/gui/studio/DeviceEditorDialog.cpp:230
+#: ../src/gui/studio/DeviceManagerDialog.cpp:196
+#: ../src/gui/studio/DeviceManagerDialog.cpp:440
+#: ../src/gui/studio/DeviceManagerDialog.cpp:452
+msgid "No connection"
+msgstr "接続無し"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:112
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:111
+#: ../src/gui/editors/parameters/InstrumentParameterBox.cpp:53
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:1209
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:159
+#: ../src/gui/general/PresetHandlerDialog.cpp:92
+#: ../src/gui/studio/MidiMixerWindow.cpp:204
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:67
+msgid "Instrument"
+msgstr "楽器"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:118
+msgid "Beats"
+msgstr "次の設定で鳴らす"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:184
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:123
+msgid "Resolution"
+msgstr "分解能"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:309
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:139
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:205
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:125
+#: ../src/gui/editors/matrix/MatrixView.cpp:2132
+#: ../src/gui/editors/notation/NotationView.cpp:1582
+#: ../src/gui/widgets/QuantizeParameters.cpp:128
+#: ../src/gui/widgets/QuantizeParameters.cpp:301
+msgid "None"
+msgstr "なし"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:126
+msgid "Bars only"
+msgstr "小節のみ"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:127
+msgid "Bars and beats"
+msgstr "小節と拍"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:128
+msgid "Bars, beats, and divisions"
+msgstr "小節と拍と拍間"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:132
+msgid "Bar velocity"
+msgstr "小節のベロシティ"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:139
+msgid "Beat velocity"
+msgstr "拍のベロシティ"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:146
+msgid "Sub-beat velocity"
+msgstr "拍間の音符のベロシティ"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:155
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:324
+msgid "Pitch"
+msgstr "ピッチ"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:160
+msgid "for Bar"
+msgstr "小節"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:161
+msgid "for Beat"
+msgstr "拍"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:162
+msgid "for Sub-beat"
+msgstr "拍間"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:166
+msgid "Metronome Activated"
+msgstr "メトロノームを有効"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:167
+msgid "Playing"
+msgstr "再生"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:168
+msgid "Recording"
+msgstr "録音"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:46
+msgid "Choose Text Encoding"
+msgstr "テキストエンコーディングの選択"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:50
+msgid ""
+"\n"
+"This file contains text in an unknown language encoding.\n"
+"\n"
+"Please select one of the following estimated text encodings\n"
+"for use with the text in this file:\n"
+msgstr ""
+"\n"
+"このファイルには不明な言語エンコードが含まれています。\n"
+"\n"
+"このファイル中のテキストに使うための、以下の、推定された 下記のテキスト\n"
+"エンコーディングの1つを選択する:\n"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:61
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:77
+msgid "Japanese Shift-JIS"
+msgstr "日本語のシフトJIS"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:62
+msgid "Unicode variable-width"
+msgstr "ユニコード可変長"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:63
+msgid "Western Europe"
+msgstr "西ヨーロッパ"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:64
+msgid "Western Europe + Euro"
+msgstr "西ヨーロッパ+ユーロ"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:65
+msgid "Eastern Europe"
+msgstr "東ヨーロッパ"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:66
+msgid "Southern Europe"
+msgstr "南ヨーロッパ"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:67
+msgid "Northern Europe"
+msgstr "北ヨーロッパ"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:68
+msgid "Cyrillic"
+msgstr "キリル"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:69
+msgid "Arabic"
+msgstr "アラビア語"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:70
+msgid "Greek"
+msgstr "ギリシャ語"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:71
+msgid "Hebrew"
+msgstr "ヘブライ語"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:72
+msgid "Turkish"
+msgstr "トルコ語"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:73
+msgid "Nordic"
+msgstr "ノルウェー語"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:74
+msgid "Thai"
+msgstr "タイ語"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:75
+msgid "Baltic"
+msgstr "バルト語"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:76
+msgid "Celtic"
+msgstr "ケルト語"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:78
+msgid "Traditional Chinese"
+msgstr "繁体字"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:79
+msgid "Simplified Chinese"
+msgstr "簡体字への翻訳"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:80
+msgid "Russian"
+msgstr "ロシア語"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:81
+msgid "Ukrainian"
+msgstr "ウクライナ語"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:82
+msgid "Tamil"
+msgstr "タミル語"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:117
+#, c-format
+msgid "Microsoft Code Page %1"
+msgstr "Microsoftコードページ %1"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:123
+#: ../src/gui/editors/matrix/MatrixView.cpp:1490
+msgid "%1 (%2)"
+msgstr "%1 (%2)"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:142
+msgid ""
+"\n"
+"Example text from file:"
+msgstr ""
+"\n"
+"ファイルからの例文:"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:59
+#: ../src/gui/editors/tempo/TempoView.cpp:92
+msgid "Time Signature"
+msgstr "拍子"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:82
+msgid "Time signature"
+msgstr "拍子"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:116
+msgid "Time where signature takes effect"
+msgstr "拍子記号を置く場所"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:83
+#: ../src/gui/dialogs/TempoDialog.cpp:128
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:129
+#: ../src/gui/general/PresetHandlerDialog.cpp:101
+msgid "Scope"
+msgstr "範囲"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:141
+#, c-format
+msgid "Insertion point is at start of measure %1."
+msgstr "挿入位置は %1 小節目の開始地点にあります。"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:145
+#, c-format
+msgid "Insertion point is in the middle of measure %1."
+msgstr "挿入ポイントは %1 小節目の中にあります。"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:150
+msgid "Insertion point is at start of composition."
+msgstr "挿入ポイントはコンポジションの開始地点にあります。"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:155
+msgid "Start measure %1 here"
+msgstr "ここから %1 小節目を開始する"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:159
+#, c-format
+msgid "Change time from start of measure %1"
+msgstr "%1 小節目の開始地点で拍子を変更する"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:166
+#, c-format
+msgid "Time change will take effect at the start of measure %1."
+msgstr "変更は%1 小節目の開始地点で反映します。"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:176
+msgid "Hide the time signature"
+msgstr "時間シグネチャを隠す"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:181
+msgid "Hide the affected bar lines"
+msgstr "影響した小節線を隠す"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:186
+msgid "Show as common time"
+msgstr "コモンで表記"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:191
+msgid "Correct the durations of following measures"
+msgstr "以降の小節の長さを直す"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:280
+msgid "Display as common time"
+msgstr "コモンで表記"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:284
+msgid "Display as cut common time"
+msgstr "カットコモンで表記"
+
+#: ../src/gui/dialogs/ConfigureDialog.cpp:66
+msgid "Configure Rosegarden"
+msgstr "Rosegardenの構成"
+
+#: ../src/gui/dialogs/MarkerModifyDialog.cpp:53
+#: ../src/gui/dialogs/MarkerModifyDialog.cpp:61
+msgid "Edit Marker"
+msgstr "マーカーを編集"
+
+#: ../src/gui/dialogs/MarkerModifyDialog.cpp:78
+msgid "Marker Time"
+msgstr "マーカー時間"
+
+#: ../src/gui/dialogs/MarkerModifyDialog.cpp:94
+msgid "Marker Properties"
+msgstr "マーカーのプロパティ"
+
+#: ../src/gui/dialogs/MarkerModifyDialog.cpp:100
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:554
+msgid "Text:"
+msgstr "テキスト:"
+
+#: ../src/gui/dialogs/MarkerModifyDialog.cpp:104
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:85
+msgid "Description:"
+msgstr "説明:"
+
+#: ../src/gui/dialogs/FileMergeDialog.cpp:46
+msgid "Merge File"
+msgstr "ファイルのマージ"
+
+#: ../src/gui/dialogs/FileMergeDialog.cpp:53
+msgid "Merge new file "
+msgstr "新しいファイルをマージ "
+
+#: ../src/gui/dialogs/FileMergeDialog.cpp:56
+msgid "At start of existing composition"
+msgstr "既存のコンポジションの最初へ"
+
+#: ../src/gui/dialogs/FileMergeDialog.cpp:57
+msgid "From end of existing composition"
+msgstr "既存のコンポジションの終端へ"
+
+#: ../src/gui/dialogs/FileMergeDialog.cpp:61
+msgid "The file has different time signatures or tempos."
+msgstr "マージするファイルの拍子、テンポが違います。"
+
+#: ../src/gui/dialogs/FileMergeDialog.cpp:62
+msgid "Import these as well"
+msgstr "そのままインポートする"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:171
+#: ../src/gui/dialogs/ShowSequencerStatusDialog.cpp:44
+msgid "Sequencer status"
+msgstr "シーケンサステータス"
+
+#: ../src/gui/dialogs/ShowSequencerStatusDialog.cpp:48
+msgid "Sequencer status:"
+msgstr "シーケンサステータス:"
+
+#: ../src/gui/dialogs/ShowSequencerStatusDialog.cpp:50
+msgid "Status not available."
+msgstr "ステータスが無効"
+
+#: ../src/gui/dialogs/ShowSequencerStatusDialog.cpp:57
+msgid "Sequencer is not running or is not responding."
+msgstr "シーケンサは動いていないか反応しない。"
+
+#: ../src/gui/dialogs/ShowSequencerStatusDialog.cpp:64
+msgid "Sequencer is not returning a valid status report."
+msgstr "シーケンサが有効なステータスレポートを返さなかった。"
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:46
+msgid "Add Tracks"
+msgstr "トラックを追加"
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:54
+msgid "How many tracks do you want to add?"
+msgstr "いくつトラックを追加しますか?"
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:62
+msgid "Add tracks"
+msgstr "トラックを追加"
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:64
+msgid "At the top"
+msgstr ""
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:65
+msgid "Above the current selected track"
+msgstr "現在選択されているトラックの上"
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:66
+msgid "Below the current selected track"
+msgstr "現在選択されているトラックの下"
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:67
+msgid "At the bottom"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:75
+msgid "Event Properties"
+msgstr "イベントのプロパティ"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:81
+msgid "Event type:"
+msgstr "イベントタイプ:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:117
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:251
+#: ../src/gui/editors/segment/MarkerEditor.cpp:97
+msgid "Absolute time:"
+msgstr "絶対時間:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:156
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:323
+msgid "Controller name:"
+msgstr "コントローラ名:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:157
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:530
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:562
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:563
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:602
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:631
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:267
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:269
+#: ../src/gui/editors/segment/MarkerEditor.cpp:279
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:272
+#: ../src/gui/studio/AudioMixerWindow.cpp:388
+#: ../src/gui/studio/AudioMixerWindow.cpp:519
+#: ../src/gui/studio/AudioMixerWindow.cpp:683
+#: ../src/gui/studio/AudioMixerWindow.cpp:722
+#: ../src/gui/studio/AudioMixerWindow.cpp:904
+#: ../src/gui/studio/SynthPluginManagerDialog.cpp:121
+msgid "<none>"
+msgstr "<なし>"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:174
+msgid "Meta string:"
+msgstr "メタ文字列:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:179
+msgid "Load data"
+msgstr "データのロード"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:181
+msgid "Save data"
+msgstr "データのセーブ"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:192
+msgid "Notation Properties"
+msgstr "譜面のプロパティ"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:198
+msgid "Lock to changes in performed values"
+msgstr "演奏用の値と同じにする"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:205
+msgid "Notation time:"
+msgstr "譜面上の位置:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:217
+msgid "Notation duration:"
+msgstr "譜面上の長さ"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:283
+msgid "Note pitch:"
+msgstr "ノートピッチ:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:291
+msgid "Note velocity:"
+msgstr "ノートベロシティ:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:317
+msgid "Controller number:"
+msgstr "コントローラナンバ:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:326
+msgid "Controller value:"
+msgstr "コントローラ値:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:354
+msgid "Key pitch:"
+msgstr "キーのピッチ:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:362
+msgid "Key pressure:"
+msgstr "キーの圧力:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:390
+msgid "Channel pressure:"
+msgstr "チャンネルの圧力:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:418
+msgid "Program change:"
+msgstr "プログラム変更:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:461
+msgid "Data length:"
+msgstr "データ長:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:462
+msgid "Data:"
+msgstr "データ:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:480
+msgid "Pitchbend MSB:"
+msgstr "ピッチベンド MSB:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:488
+msgid "Pitchbend LSB:"
+msgstr "ピッチベンド LSB:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:523
+msgid "Indication:"
+msgstr "演奏記号:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:553
+msgid "Text type:"
+msgstr "テキストタイプ:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:596
+msgid "Clef type:"
+msgstr "音符記号:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:625
+msgid "Key name:"
+msgstr "キー名:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:674
+msgid "Unsupported event type:"
+msgstr "未サポートのイベントタイプ:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:931
+msgid "Edit Event Time"
+msgstr "イベントタイプの編集"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:943
+msgid "Edit Event Notation Time"
+msgstr "イベントの譜面上の位置を編集"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:955
+msgid "Edit Duration"
+msgstr "デュレーションの編集"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:968
+msgid "Edit Notation Duration"
+msgstr "譜面上の長さを編集"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:981
+msgid "Edit Pitch"
+msgstr "ピッチの編集"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:991
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:1016
+msgid "*.syx|System exclusive files (*.syx)"
+msgstr "*.syx|システムエクスクルーシブファイル (*.syx)"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:992
+msgid "Load System Exclusive data in File"
+msgstr "システムエクスクルーシブデータのファイルを読み込む"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:1017
+msgid "Save System Exclusive data to..."
+msgstr "システムエクスクルーシブデータを保存する"
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:46
+msgid "Locate audio file"
+msgstr "オーディオファイルの配置"
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:50
+msgid "&Skip"
+msgstr "スキップ(&S)"
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:51
+msgid "Skip &All"
+msgstr "すべてをスキップ(&A)"
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:52
+msgid "&Locate"
+msgstr "場所(&L)"
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:57
+msgid ""
+"Can't find file \"%1\".\n"
+"Would you like to try and locate this file or skip it?"
+msgstr ""
+"ファイル \"%1\" が見つかりません。\n"
+"ファイルの場所を探しますか? それともスキップしますか?"
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:71
+msgid ""
+"%1|Requested file (%2)\n"
+"*.wav|WAV files (*.wav)"
+msgstr ""
+"%1|要求されたファイル (%2)\n"
+"*.wav|WAVファイル (*.wav)"
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:74
+msgid "Select an Audio File"
+msgstr "オーディオファイルの選択"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:53 ../src/gui/dialogs/ClefDialog.cpp:62
+#: ../src/gui/dialogs/ClefDialog.cpp:79 ../src/gui/dialogs/ClefDialog.cpp:90
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:278
+msgid "Clef"
+msgstr "音域"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:65
+msgid "Existing notes following clef change"
+msgstr "既存の音符を音部の変更に従って次のようにする"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:71
+msgid "Lower clef"
+msgstr "低音部"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:77
+msgid "Up an Octave"
+msgstr "オクターブ上へ"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:84
+msgid "Down an Octave"
+msgstr "オクターブ下へ"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:88
+msgid "Higher clef"
+msgstr "高音部"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:96
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:152
+msgid "Maintain current pitches"
+msgstr "現在のピッチを調整"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:99
+msgid "Transpose into appropriate octave"
+msgstr "適切な位置に音符を配置"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:231
+msgid "%1 down an octave"
+msgstr "%1 1オクターブ下げる"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:234
+msgid "%1 down two octaves"
+msgstr "%1 2オクターブ下げる"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:237
+msgid "%1 up an octave"
+msgstr "%1 1オクターブ上げる"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:240
+msgid "%1 up two octaves"
+msgstr "%1 2オクターブ上げる"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:249
+msgid "Treble"
+msgstr "ト音記号"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:251
+msgid "French violin"
+msgstr "フレンチバイオリン記号"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:253
+msgid "Soprano"
+msgstr "ソプラノ記号"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:255
+msgid "Mezzo-soprano"
+msgstr "メゾソプラノ"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:257
+msgid "Alto"
+msgstr "アルト記号"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:259
+msgid "Tenor"
+msgstr "テノール記号"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:261
+msgid "C-baritone"
+msgstr "ハ調のバリトン記号"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:263
+msgid "F-baritone"
+msgstr "ヘ調のバリトン記号"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:265
+msgid "Bass"
+msgstr "ヘ音記号"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:267
+msgid "Sub-bass"
+msgstr "低バス記号"
+
+#: ../src/gui/dialogs/CountdownDialog.cpp:52
+msgid "Recording..."
+msgstr "録音..."
+
+#: ../src/gui/dialogs/CountdownDialog.cpp:60
+msgid "Recording time remaining: "
+msgstr "録音残り時間: "
+
+#: ../src/gui/dialogs/CountdownDialog.cpp:120
+msgid "Just how big is your hard disk?"
+msgstr "ハードディスクの容量はどのくらいですか?"
+
+#: ../src/gui/dialogs/CountdownDialog.cpp:154
+msgid "Recording beyond end of composition: "
+msgstr "コンポジションの最後を超えて録音: "
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:52
+msgid "Specify Interval"
+msgstr "インターバルを指定"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:58
+msgid "Reference note:"
+msgstr "参照する音譜:"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:59
+msgid "Target note:"
+msgstr "ターゲットの音符"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:68
+#: ../src/gui/dialogs/IntervalDialog.cpp:315
+msgid "a perfect unison"
+msgstr "完全なユニゾン"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:76
+msgid "Effect on Key"
+msgstr "キー上のエフェクト"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:77
+msgid "Transpose within key"
+msgstr "キー内で移調"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:79
+msgid "Change key for selection"
+msgstr "セレクションのためのキー変更"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:89
+msgid ""
+"Adjust segment transposition in opposite direction (maintain audible pitch)"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:190
+#: ../src/gui/dialogs/IntervalDialog.cpp:220
+msgid "a diminished"
+msgstr "半音狭める"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:192
+#: ../src/gui/dialogs/IntervalDialog.cpp:222
+msgid "an augmented"
+msgstr "半音増やす"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:194
+#: ../src/gui/dialogs/IntervalDialog.cpp:224
+msgid "a doubly diminished"
+msgstr "二重に半音狭める"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:196
+#: ../src/gui/dialogs/IntervalDialog.cpp:226
+msgid "a doubly augmented"
+msgstr "二重に半音増やす"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:198
+#: ../src/gui/dialogs/IntervalDialog.cpp:228
+msgid "a triply diminished"
+msgstr "三重に半音狭める"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:200
+#: ../src/gui/dialogs/IntervalDialog.cpp:230
+msgid "a triply augmented"
+msgstr "三重に半音増やす"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:202
+msgid "a quadruply diminished"
+msgstr "四重に半音狭める"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:204
+#: ../src/gui/dialogs/IntervalDialog.cpp:232
+msgid "a quadruply augmented"
+msgstr "四重に半音増やす"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:206
+#: ../src/gui/dialogs/IntervalDialog.cpp:234
+msgid "a perfect"
+msgstr "完全"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:208
+#: ../src/gui/dialogs/IntervalDialog.cpp:236
+msgid "an (unknown, %1)"
+msgstr "(不明, %1)"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:216
+msgid "a minor"
+msgstr "イ短調"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:218
+msgid "a major"
+msgstr "イ長調"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:239
+msgid "an (unknown)"
+msgstr "(不明)"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:248
+#: ../src/gui/dialogs/IntervalDialog.cpp:251
+msgid "%1 octave"
+msgstr "%1 オクターブ"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:254
+msgid "%1 unison"
+msgstr "%1 同度"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:258
+msgid "%1 second"
+msgstr "%1 秒"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:261
+msgid "%1 third"
+msgstr "3番めの%1"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:264
+msgid "%1 fourth"
+msgstr "4番目の%1"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:267
+msgid "%1 fifth"
+msgstr "5番目の%1"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:270
+msgid "%1 sixth"
+msgstr "6番目の%1"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:273
+msgid "%1 seventh"
+msgstr "7番目の%1"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:276
+#: ../src/gui/studio/DeviceManagerDialog.cpp:329
+#: ../src/gui/studio/DeviceManagerDialog.cpp:363
+#, c-format
+msgid "%1"
+msgstr "%1"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:287
+msgid ""
+"_n: up 1 octave and %1\n"
+"up %n octaves and %1"
+msgstr "上に%nオクターブと%1"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:291
+#, c-format
+msgid ""
+"_n: up 1 octave\n"
+"up %n octaves"
+msgstr "上に%nオクターブ"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:295
+#, c-format
+msgid "up %1"
+msgstr "上 %1"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:303
+msgid ""
+"_n: down 1 octave and %1\n"
+"down %n octaves and %1"
+msgstr "下に%nオクターブと%1"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:307
+#, c-format
+msgid ""
+"_n: down 1 octave\n"
+"down %n octaves"
+msgstr "下に%n オクターブ"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:311
+#, c-format
+msgid "down %1"
+msgstr "下 %1"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:81
+msgid "Intrinsics"
+msgstr "固有プロパティ"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:85
+msgid "Event type: "
+msgstr "イベントタイプ: "
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:91
+msgid "Absolute time: "
+msgstr "絶対時間: "
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:101
+msgid "Duration: "
+msgstr "デュレーション: "
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:114
+msgid "Sub-ordering: "
+msgstr "表示順"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:125
+msgid "Persistent properties"
+msgstr "固定プロパティ"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:169
+#: ../src/gui/dialogs/EventEditDialog.cpp:133
+#: ../src/gui/studio/BankEditorDialog.cpp:129
+#: ../src/gui/studio/DeviceEditorDialog.cpp:75
+msgid "Type"
+msgstr "タイプ"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:184
+#: ../src/gui/dialogs/EventEditDialog.cpp:135
+#: ../src/gui/dialogs/EventParameterDialog.cpp:89
+#: ../src/gui/dialogs/EventParameterDialog.cpp:93
+#: ../src/gui/dialogs/EventParameterDialog.cpp:115
+msgid "Value"
+msgstr "数値"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:155
+msgid "Non-persistent properties"
+msgstr "変動プロパティ"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:156
+msgid "These are cached values, lost if the event is modified."
+msgstr "一時的な値でイベントを変更すると破棄します"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:170
+msgid "Name "
+msgstr "名前 "
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:172
+msgid "Type "
+msgstr "タイプ "
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:174
+msgid "Value "
+msgstr "数値 "
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:188
+msgid "Make persistent"
+msgstr "固定プロパティにする"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:292
+msgid "Delete this property"
+msgstr "このプロパティを削除"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:433
+msgid ""
+"Are you sure you want to delete the \"%1\" property?\n"
+"\n"
+"Removing necessary properties may cause unexpected behavior."
+msgstr ""
+"\"%1\" プロパティを削除してもよろしいですか?\n"
+"\n"
+"必要なプロパティを削除すると予期しない動作を引き起こす可能性があります。"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:436
+#: ../src/gui/dialogs/EventEditDialog.cpp:469
+msgid "Edit Event"
+msgstr "イベントの編集"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:465
+msgid ""
+"Are you sure you want to make the \"%1\" property persistent?\n"
+"\n"
+"This could cause problems if it overrides a different computed value later "
+"on."
+msgstr ""
+"本当に \"%1\" プロパティを固定したいですか?\n"
+"後で計算処理した別の値で上書きする場合、問題が発生する可能性があります。"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:470
+msgid "Make &Persistent"
+msgstr "固定プロパティにする(&P)"
+
+#: ../src/gui/dialogs/PasteNotationDialog.cpp:52
+msgid "Paste type"
+msgstr "ペーストタイプ"
+
+#: ../src/gui/dialogs/PasteNotationDialog.cpp:72
+msgid "Make this the default paste type"
+msgstr "デフォルトのペーストタイプとする"
+
+#: ../src/gui/dialogs/LyricEditDialog.cpp:53
+msgid "Edit Lyrics"
+msgstr "歌詞の編集"
+
+#: ../src/gui/dialogs/LyricEditDialog.cpp:62
+msgid "Lyrics for this segment"
+msgstr "このセグメントの歌詞"
+
+#: ../src/gui/dialogs/LyricEditDialog.cpp:70
+msgid "Add Verse"
+msgstr "歌詞の追加"
+
+#: ../src/gui/dialogs/LyricEditDialog.cpp:84
+#: ../src/gui/dialogs/LyricEditDialog.cpp:106
+#, c-format
+msgid "Verse %1"
+msgstr "歌詞%1"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:59
+msgid "Import from Device..."
+msgstr "デバイスからインポート..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2163
+#: ../src/gui/application/RosegardenGUIApp.cpp:2229
+#: ../src/gui/application/RosegardenGUIApp.cpp:7780
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:87
+#: ../src/sound/AudioFileManager.cpp:664
+#, c-format
+msgid "Cannot download file %1"
+msgstr "ファイル %1 がダウンロードできない"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:99
+#, c-format
+msgid "Cannot open file %1"
+msgstr "%1がオープンできない"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:106
+#, c-format
+msgid "No devices found in file %1"
+msgstr "ファイル%1中にデバイスがない"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:113
+msgid "Source device"
+msgstr "ソースデバイス"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:118
+msgid "Import from: "
+msgstr "インポート元"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:140
+#: ../src/gui/studio/DeviceEditorDialog.cpp:148
+#, c-format
+msgid "Device %1"
+msgstr "デバイス %1"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:155
+msgid "Import banks"
+msgstr "バンクのインポート"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:156
+msgid "Import key mappings"
+msgstr "キーマッピングのインポート"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:157
+msgid "Import controllers"
+msgstr "コントローラのインポート"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:160
+msgid "Import device name"
+msgstr "デバイス名のインポート"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:166
+msgid "Bank import behavior"
+msgstr "バンクをインポートの動作"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:168
+msgid "Merge banks"
+msgstr "バンクのマージ"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:169
+msgid "Overwrite banks"
+msgstr "バンクの上書き"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:367
+msgid "Bank %1:%2"
+msgstr "バンク %1:%2"
+
+#: ../src/commands/segment/SegmentSplitByRecordingSrcCommand.cpp:42
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:48
+msgid "Split by Recording Source"
+msgstr "録音ソースにより分割"
+
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:53
+msgid "Recording Source"
+msgstr "録音ソース"
+
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:57
+msgid "Channel:"
+msgstr "チャンネル:"
+
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:64
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:75
+msgid "any"
+msgstr "任意"
+
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:69
+msgid "Device:"
+msgstr "デバイス:"
+
+#: ../src/gui/dialogs/UnusedAudioSelectionDialog.cpp:46
+msgid "Select Unused Audio Files"
+msgstr "未使用のオーディオファイルの選択"
+
+#: ../src/gui/dialogs/UnusedAudioSelectionDialog.cpp:53
+#: ../src/gui/editors/segment/PlayListView.cpp:36
+msgid "File name"
+msgstr "ファイル名"
+
+#: ../src/gui/dialogs/UnusedAudioSelectionDialog.cpp:54
+msgid "File size"
+msgstr "ファイルサイズ"
+
+#: ../src/gui/dialogs/UnusedAudioSelectionDialog.cpp:55
+msgid "Last modified date"
+msgstr "最後に変更した日付"
+
+#: ../src/gui/dialogs/UnusedAudioSelectionDialog.cpp:60
+msgid " (not found) "
+msgstr " (見つからない) "
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:105
+msgid "Audio File Manager"
+msgstr "オーディオファイルマネージャ"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:126
+msgid ""
+"* Some audio files are encoded at a sample rate different from that of the "
+"JACK audio server.\n"
+"Rosegarden will play them at the correct speed, but they will sound "
+"terrible.\n"
+"Please consider resampling such files externally, or adjusting the sample "
+"rate of the JACK server."
+msgstr ""
+"* いくつかのオーディオファイルはJACKオーディオサーバのサンプルレートと異なっ"
+"てエンコードされます。\n"
+"Rosegardenはそれを正しい速度で演奏しますが、その音はひどいものになります。\n"
+"そのようなファイルを外部で再サンプリングすることを考慮してください;又は、JACK"
+"サーバのサンプルレートを調整してください。 "
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:132
+msgid "&Add Audio File..."
+msgstr "オーディオファイルの追加(&A)"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:135
+msgid "&Unload Audio File"
+msgstr "オーディオファイルをアンロード(&U)"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:140
+msgid "&Play Preview"
+msgstr "再生プレビュー(&P)"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:151
+msgid "&Insert into Selected Audio Track"
+msgstr "選択されたオーディオトラックに挿入(&I)"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:155
+msgid "Unload &all Audio Files"
+msgstr "すべてのオーディオファイルのアンロード(&a)"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:159
+msgid "Unload all &Unused Audio Files"
+msgstr "すべての未使用のオーディオファイルのアンロード(&U)"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:163
+msgid "&Delete Unused Audio Files..."
+msgstr "未使用のオーディオファイルの削除(&D)..."
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:167
+msgid "&Export Audio File..."
+msgstr "オーディオファイルのエクスポート(&E)"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:173
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:180
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:91
+msgid "Duration"
+msgstr "デュレーション"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:181
+msgid "Envelope"
+msgstr "エンベロープ"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:182
+msgid "Sample rate"
+msgstr "サンプルレート"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:183
+msgid "Channels"
+msgstr "チャンネル"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:282
+msgid "<no audio files>"
+msgstr "<オーディオファイルなし>"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:488
+msgid "*.wav|WAV files (*.wav)"
+msgstr "*.wav|WAVファイル(*.wav)"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:489
+msgid "Choose a name to save this file as"
+msgstr "このファイルを保存するための名前を選択"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:499
+msgid "Exporting audio file..."
+msgstr "オーディオファイルのエクスポート..."
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:609
+msgid ""
+"This will unload audio file \"%1\" and remove all associated segments. Are "
+"you sure?"
+msgstr ""
+"これはオーディオファイル \"%1\"をアンロードし、すべての 関連したセグメントを"
+"削除する。それでよいか?"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:692
+msgid ""
+"*.wav|WAV files (*.wav)\n"
+"*.*|All files"
+msgstr ""
+"*.wav|WAVファイル(*.wav)\n"
+"*.*|すべてのファイル"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:697
+msgid ""
+"*.wav *.flac *.ogg *.mp3|Audio files (*.wav *.flac *.ogg *.mp3)\n"
+"*.wav|WAV files (*.wav)\n"
+"*.flac|FLAC files (*.flac)\n"
+"*.ogg|Ogg files (*.ogg)\n"
+"*.mp3|MP3 files (*.mp3)\n"
+"*.*|All files"
+msgstr ""
+"*.wav *.flac *.ogg *.mp3|オーディオファイル (*.wav *.flac *.ogg *.mp3)\n"
+"*.wav|WAV ファイル (*.wav)\n"
+"*.flac|FLAC ファイル (*.flac)\n"
+"*.ogg|Ogg ファイル (*.ogg)\n"
+"*.mp3|MP3 ファイル (*.mp3)\n"
+"*.*|すべてのファイル"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:704
+msgid "Select one or more audio files"
+msgstr "1つ以上のオーディオファイルを選択"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:763
+msgid ""
+"This will unload all audio files and remove their associated segments.\n"
+"This action cannot be undone, and associations with these files will be "
+"lost.\n"
+"Files will not be removed from your disk.\n"
+"Are you sure?"
+msgstr ""
+"これはすべてのオーディオファイルをアンロードし、関連するセグメントを削除す"
+"る。\n"
+"この動作は復活できなく、かつ、それらのファイルの関連は失われる。\n"
+"ファイルはディスクからは削除されない。\n"
+"実行してよいか?"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:800
+msgid ""
+"This will unload all audio files that are not associated with any segments "
+"in this composition.\n"
+"This action cannot be undone, and associations with these files will be "
+"lost.\n"
+"Files will not be removed from your disk.\n"
+"Are you sure?"
+msgstr ""
+"これは、このコンポジション中の任意のセグメントに関連しないすべてのオーディオ"
+"ファイルをアンロードする。\n"
+"この動作は復活できなく、かつ、それらのファイルの関連は失われる。\n"
+"ファイルはディスクからは削除されない。\n"
+"実行してよいか?"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:865
+msgid ""
+"The following audio files are not used in the current composition.\n"
+"\n"
+"Please select the ones you wish to delete permanently from the hard disk.\n"
+msgstr ""
+"以下のオーディオファイルは現在のコンポジション中では使われていない。\n"
+"ハードディスク中から完全に削除したいものを選択。\n"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:875
+#, c-format
+msgid ""
+"_n: <qt>About to delete 1 audio file permanently from the hard disk.<br>This "
+"action cannot be undone, and there will be no way to recover this file."
+"<br>Are you sure?</qt>\n"
+"\n"
+"<qt>About to delete %n audio files permanently from the hard disk.<br>This "
+"action cannot be undone, and there will be no way to recover these files."
+"<br>Are you sure?</qt>"
+msgstr ""
+"<qt>%n個のオーディオファイルをハードディスクから完全に削除することについて。"
+"<BR> この操作は復元不能で、このファイルを戻す方法はありません。 <BR>よろしい"
+"ですか?</qt>"
+
+#: ../src/document/RosegardenGUIDoc.cpp:525
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:888
+msgid "File %1 could not be deleted."
+msgstr "%1 が削除できません。"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:921
+msgid "Change Audio File label"
+msgstr "オーディオファイルのラベル変更"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:6466
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:922
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:1099
+msgid "Enter new label"
+msgstr "新しいラベルを入力"
+
+#: ../src/gui/application/RosegardenGUIView.cpp:1538
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:1086
+msgid "Adding audio file..."
+msgstr "オーディオファイルを追加..."
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:1107
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:1112
+msgid "Failed to add audio file. "
+msgstr "オーディオファイルの追加に失敗。 "
+
+#: ../src/document/RosegardenGUIDoc.cpp:2789
+#: ../src/gui/application/RosegardenGUIApp.cpp:2736
+#: ../src/gui/application/RosegardenGUIView.cpp:1574
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:1122
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:180
+msgid "Generating audio preview..."
+msgstr "オーディオプレビューの生成"
+
+#: ../src/gui/application/RosegardenGUIView.cpp:1581
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:1130
+msgid ""
+"Try copying this file to a directory where you have write permission and re-"
+"add it"
+msgstr ""
+"書き込み許可を持つディレクトリにこのファイルをコピーして再度追加することを試"
+"してください"
+
+#: ../src/gui/dialogs/TransportDialog.cpp:90 rc.cpp:357
+#, no-c-format
+msgid "Rosegarden Transport"
+msgstr "Rosegardenトランスポート"
+
+#: ../src/gui/dialogs/TransportDialog.cpp:925
+#: ../src/gui/dialogs/TransportDialog.cpp:985
+msgid "PITCH WHEEL"
+msgstr "PITCH WHEEL"
+
+#: ../src/gui/dialogs/TransportDialog.cpp:929
+#: ../src/gui/dialogs/TransportDialog.cpp:989
+msgid "CONTROLLER"
+msgstr "CONTROLLER"
+
+#: ../src/gui/dialogs/TransportDialog.cpp:933
+#: ../src/gui/dialogs/TransportDialog.cpp:993
+msgid "PROG CHNGE"
+msgstr "PROG CHNGE"
+
+#: ../src/gui/dialogs/TransportDialog.cpp:938
+#: ../src/gui/dialogs/TransportDialog.cpp:998
+msgid "PRESSURE"
+msgstr "PRESSURE"
+
+#: ../src/gui/dialogs/TransportDialog.cpp:942
+#: ../src/gui/dialogs/TransportDialog.cpp:1002
+msgid "SYS MESSAGE"
+msgstr "SYS MESSAGE"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:177
+#: ../src/gui/dialogs/QuantizeDialog.cpp:40
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:127
+msgid "Quantize"
+msgstr "クォンタイズ"
+
+#: ../src/gui/dialogs/QuantizeDialog.cpp:52
+msgid "Advanced"
+msgstr "高度な"
+
+#: ../src/gui/dialogs/ExportDeviceDialog.cpp:42
+msgid "Export Devices..."
+msgstr "デバイスにエクスポート..."
+
+#: ../src/gui/dialogs/ExportDeviceDialog.cpp:47
+msgid "Export devices"
+msgstr "デバイスのエクスポート"
+
+#: ../src/gui/dialogs/ExportDeviceDialog.cpp:49
+msgid "Export all devices"
+msgstr "すべてのデバイスのエクスポート"
+
+#: ../src/gui/dialogs/ExportDeviceDialog.cpp:50
+msgid "Export selected device only"
+msgstr "選択されたデバイスのみエクスポート"
+
+#: ../src/gui/dialogs/ExportDeviceDialog.cpp:51
+msgid " (\"%1\")"
+msgstr " (\"%1\")"
+
+#: ../src/gui/dialogs/CompositionLengthDialog.cpp:44
+msgid "Change Composition Length"
+msgstr "コンポジションの長さを変更"
+
+#: ../src/gui/dialogs/CompositionLengthDialog.cpp:50
+msgid "Set the Start and End bar markers for this Composition"
+msgstr "このコンポジションの開始、終端小節マーカーを設定"
+
+#: ../src/gui/dialogs/CompositionLengthDialog.cpp:54
+msgid "Start Bar"
+msgstr "開始小節"
+
+#: ../src/gui/dialogs/CompositionLengthDialog.cpp:62
+msgid "End Bar"
+msgstr "終了小節"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:62
+msgid "LilyPond Export/Preview"
+msgstr "Lilypond エクスポート/プレビュー"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:85
+msgid "General options"
+msgstr "一般の設定"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:90
+msgid "Advanced options"
+msgstr "詳細オプション"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:112
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:95
+msgid "Headers"
+msgstr "ヘッダ"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:106
+msgid "Basic options"
+msgstr "基本オプション"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:113
+msgid "Compatibility level"
+msgstr "互換レベル"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:117
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:118
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:119
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:120
+#, c-format
+msgid "LilyPond %1"
+msgstr "Lilypond %1"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:125
+msgid "Paper size"
+msgstr "用紙サイズ"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:129
+msgid "A3"
+msgstr "A3"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:130
+msgid "A4"
+msgstr "A4"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:131
+msgid "A5"
+msgstr "A5"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:132
+msgid "A6"
+msgstr "A6"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:133
+msgid "Legal"
+msgstr "Legal"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:134
+msgid "US Letter"
+msgstr "US Letter"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:135
+msgid "Tabloid"
+msgstr "タブロイド"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:136
+msgid "do not specify"
+msgstr "指定しない"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:152
+msgid "Font size"
+msgstr "フォントサイズ"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:157
+msgid "%1 pt"
+msgstr "%1 pt"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:169
+msgid "Staff level options"
+msgstr "五線譜レベルオプション"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:176
+msgid "Export content"
+msgstr "コンテンツのエクスポート"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:179
+msgid "All tracks"
+msgstr "すべてのトラック"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:180
+msgid "Non-muted tracks"
+msgstr "ミュートされていないトラック"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:181
+msgid "Selected track"
+msgstr "トラックを選択"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:182
+msgid "Selected segments"
+msgstr "セグメントを選択"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:188
+msgid "Merge tracks that have the same name"
+msgstr "同じ名前を持つトラックの併合"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:198
+msgid "Notation options"
+msgstr "譜面オプション"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:206
+msgid "First"
+msgstr "最初"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:207
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:538
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:557
+msgid "All"
+msgstr "すべて"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:211
+msgid "Export tempo marks "
+msgstr "テンポマークをエクスポート"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:215
+msgid "Export lyrics"
+msgstr "lyricのエクスポート"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:225
+msgid "Export beamings"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:232
+msgid "Export track staff brackets"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:244
+msgid "Layout options"
+msgstr "レイアウトオプション"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:257
+msgid "Lyrics alignment"
+msgstr "歌詞の割り当て"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:261
+msgid "Ragged bottom (systems will not be spread vertically across the page)"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:267
+msgid "Miscellaneous options"
+msgstr "その他のオプション"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:274
+msgid "Enable \"point and click\" debugging"
+msgstr "\"ポイントとクリック\"によるデバッグを有効"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:279
+msgid "Export \\midi block"
+msgstr "\\midiブロックのエクスポート"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:284
+msgid "No markers"
+msgstr "マーカなし"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:285
+msgid "Rehearsal marks"
+msgstr "リハーサルマーク"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:286
+msgid "Marker text"
+msgstr "マーカーテキスト"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:290
+msgid "Export markers"
+msgstr "エクスポートマーカ"
+
+#: ../src/gui/dialogs/AudioSplitDialog.cpp:57
+msgid "Autosplit Audio Segment"
+msgstr "オーディオセグメントの自動分割"
+
+#: ../src/gui/dialogs/AudioSplitDialog.cpp:70
+msgid "AutoSplit Segment \""
+msgstr "セグメントの自動分割 \""
+
+#: ../src/gui/dialogs/AudioSplitDialog.cpp:84
+msgid "Threshold"
+msgstr "スレッショルド"
+
+#: ../src/gui/dialogs/AudioSplitDialog.cpp:142
+msgid "<no preview generated for this audio file>"
+msgstr "<このオーディオファイルのためのプレビューは生成されない>"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:70
+msgid "Audio Plugin"
+msgstr "オーディオプラグイン"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:94
+#: ../src/gui/widgets/AudioFaderBox.cpp:136
+msgid "Editor"
+msgstr "エディタ"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:100
+msgid "Plugin"
+msgstr "プラグイン"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:105
+msgid "Category:"
+msgstr "カテゴリ:"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:110
+msgid "Plugin:"
+msgstr "プラグイン:"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:114
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:398
+msgid "Select a plugin from this list."
+msgstr "このリストからプラグインを選択。"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:119
+msgid "Bypass"
+msgstr "バイパス"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:121
+msgid "Bypass this plugin."
+msgstr "このプラグインをバイパス。"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:127
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:390
+msgid "<ports>"
+msgstr "<ポート>"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:130
+msgid "Input and output port counts."
+msgstr "入出力ポートカウント。"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:132
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:391
+msgid "<id>"
+msgstr "<id>"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:135
+msgid "Unique ID of plugin."
+msgstr "プラグインのための一意なID"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:149
+msgid "Copy plugin parameters"
+msgstr "プラグインパラメータの複写"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:155
+msgid "Paste plugin parameters"
+msgstr "プラグインパラメータの貼り付け"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:161
+msgid "Set to defaults"
+msgstr "デフォルトに設定"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:225
+msgid "(any)"
+msgstr "(任意)"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:226
+msgid "(unclassified)"
+msgstr "(未分類)"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:247
+msgid "(none)"
+msgstr "(なし)"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:389
+#: ../src/gui/editors/parameters/AudioInstrumentParameterPanel.cpp:132
+#: ../src/gui/editors/parameters/AudioInstrumentParameterPanel.cpp:361
+#: ../src/gui/studio/AudioMixerWindow.cpp:685
+#: ../src/gui/studio/AudioMixerWindow.cpp:724
+#: ../src/gui/studio/AudioMixerWindow.cpp:906
+#: ../src/gui/widgets/AudioFaderBox.cpp:79
+msgid "<no plugin>"
+msgstr "<プラグイン無し>"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:427
+msgid "This plugin has too many controls to edit here."
+msgstr "編集するためのプラグインのコントロールが多すぎます。"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:438
+#, c-format
+msgid "Id: %1"
+msgstr "Id: %1"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:490
+msgid "mono"
+msgstr "モノ"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:492
+msgid "stereo"
+msgstr "ステレオ"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:494
+msgid "%1 in, %2 out"
+msgstr "%1 入力、%2 出力"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:518
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:704
+msgid "Program: "
+msgstr "プログラム: "
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:522
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:532
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:708
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:716
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:745
+msgid "<none selected>"
+msgstr "<未選択>"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:56
+msgid "Set the %1 property of the event selection:"
+msgstr "選択したイベントの %1 プロパティを設定"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:61
+msgid "Pattern"
+msgstr "パターン"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:66
+msgid "Flat - set %1 to value"
+msgstr "均一 - %1 を均一に設定"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:70
+msgid "Alternating - set %1 to max and min on alternate events"
+msgstr "交互 - %1 をふたつの値で交互に設定"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:74
+msgid "Crescendo - set %1 rising from min to max"
+msgstr "クレッシェンド - %1 を最小値から最大値へ右上がりで設定"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:78
+msgid "Diminuendo - set %1 falling from max to min"
+msgstr "ディミニエンド - %1 を最大値から最小値ヘ右下りで設定"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:82
+msgid "Ringing - set %1 alternating from max to min with both dying to zero"
+msgstr ""
+"リンギング効果 - %1 を最大から最小値へ、最小値からゼロへの両方を交互に設定"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:123
+#: ../src/gui/dialogs/EventParameterDialog.cpp:150
+msgid "First Value"
+msgstr "最初の価"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:124
+#: ../src/gui/dialogs/EventParameterDialog.cpp:151
+msgid "Second Value"
+msgstr "次の値"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:132
+#: ../src/gui/dialogs/EventParameterDialog.cpp:142
+msgid "Low Value"
+msgstr "下限"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:133
+#: ../src/gui/dialogs/EventParameterDialog.cpp:141
+msgid "High Value"
+msgstr "上限"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:56 ../src/gui/rulers/TempoRuler.cpp:127
+msgid "Insert Tempo Change"
+msgstr "テンポを挿入"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:69
+msgid "New tempo:"
+msgstr "新しいテンポ:"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:76
+msgid "Tap"
+msgstr "タップ"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:81
+msgid "Tempo is fixed until the following tempo change"
+msgstr "次のテンポ変更までそのまま"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:82
+msgid "Tempo ramps to the following tempo"
+msgstr "これ以降に存在するテンポへ徐々に変化させる"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:83
+msgid "Tempo ramps to:"
+msgstr "このテンポへ上昇(下降)する"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:120
+msgid "Time of tempo change"
+msgstr "テンポチェンジの時間"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:138
+msgid "The pointer is currently at "
+msgstr "現在ポインタのある場所は"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:154
+msgid "Apply this tempo from here onwards"
+msgstr "このテンポをここから先へ適用"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:158
+msgid "Replace the last tempo change"
+msgstr "直前のテンポを置き換える"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:164
+msgid "Apply this tempo from the start of this bar"
+msgstr "この小節の最初からこのテンポを適用"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:167
+msgid "Apply this tempo to the whole composition"
+msgstr "このテンポをコンポジション全体に適用"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:172
+msgid "Also make this the default tempo"
+msgstr "ついでに、これをデフォルトテンポにする"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:256
+msgid "%1.%2 s,"
+msgstr "%1.%2 秒"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:262
+#, c-format
+msgid "at the start of measure %1."
+msgstr "%1 小節目の開始地点"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:266
+#, c-format
+msgid "in the middle of measure %1."
+msgstr "%1 小節目内"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:285
+msgid " (at %1.%2 s, in measure %3)"
+msgstr " (%1.%2 秒、%3 小節目)"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:302
+msgid "There are no preceding tempo changes."
+msgstr "これより手前にテンポ変更はありません。"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:310
+msgid "There are no other tempo changes."
+msgstr "ほかのテンポ変更はない。"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:328
+msgid " bpm"
+msgstr " bpm"
+
+#: ../src/gui/dialogs/AudioPlayingDialog.cpp:42
+msgid "Playing audio file"
+msgstr "オーディオファイルの再生"
+
+#: ../src/gui/dialogs/AudioPlayingDialog.cpp:47
+msgid "Playing audio file \"%1\""
+msgstr "オーディオファイル \"%1\"の再生"
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:52
+#: ../src/gui/editors/matrix/MatrixView.cpp:2655
+msgid "Trigger Segment"
+msgstr "トリガーセグメント"
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:61
+msgid "Trigger segment: "
+msgstr "トリガーセグメント: "
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:59
+msgid "Key Change"
+msgstr "キー変更"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:77
+msgid "Key signature"
+msgstr "調号"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:80
+msgid "Key transposition"
+msgstr "キー移調"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:86
+msgid "Existing notes following key change"
+msgstr "調の変更に従って既存の音符を以下のように"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:98
+msgid "Flatten"
+msgstr "♭付加"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:100
+msgid "Key"
+msgstr "キー"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:105
+msgid "Sharpen"
+msgstr "♯付加"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:109
+msgid "Major"
+msgstr "長調"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:110
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:369
+msgid "Minor"
+msgstr "短調"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:123
+msgid "Transpose key according to segment transposition"
+msgstr "セグメント移調を調べて移調する"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:126
+msgid "Use specified key. Do not transpose"
+msgstr "指定した調を使用。移調しない。"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:134
+msgid "Apply to current segment only"
+msgstr "現在のセグメントのみに適用"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:137
+msgid "Apply to all segments at this time"
+msgstr "この時点ですべてのセグメントに適用"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:141
+msgid "Exclude percussion segments"
+msgstr "バーカッションセグメントを除く"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:155
+msgid "Maintain current accidentals"
+msgstr "現状の臨時記号を維持する"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:158
+msgid "Transpose into this key"
+msgstr "キー(調)に移調"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:331
+msgid "No such key"
+msgstr "そのキー(調)はありません"
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:44
+#: ../src/gui/editors/notation/NotationSelector.cpp:118
+msgid "Interpret"
+msgstr "解析"
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:50
+msgid "Interpretations to apply"
+msgstr "解析を適用するもの"
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:53
+msgid "Apply text dynamics (p, mf, ff etc)"
+msgstr "強弱記号(p, mf, ff など)を適用"
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:55
+msgid "Apply hairpin dynamics"
+msgstr "ヘアピン強弱記号を適用"
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:57
+msgid "Stress beats"
+msgstr "拍を強調"
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:59
+msgid "Articulate slurs, staccato, tenuto etc"
+msgstr "スラー、タッカート、テヌートなどを表現"
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:61
+msgid "All available interpretations"
+msgstr "有効なもの全て"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:316
+msgid ""
+"Attempted to launch JACK audio daemon failed. Audio will be disabled.\n"
+"Please check configuration (Settings -> Configure Rosegarden -> Audio -> "
+"Startup)\n"
+" and restart."
+msgstr ""
+"JACKオーディオデーモンの起動に失敗しました。オーディオは無効になります。\n"
+"設定 (設定 ->構成 ->Rosegarden -> オーディオ -> スタートアップ)\n"
+"をチェックして Rosegarden を再起動してください。"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:325
+msgid "Starting sequencer..."
+msgstr "シーケンサ起動..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:333
+msgid "Initializing plugin manager..."
+msgstr "プラグインマネージャの初期化..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:338
+msgid "Initializing view..."
+msgstr "ビューの初期化..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:354
+msgid "Special Parameters"
+msgstr "特別パラメータ"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:430
+msgid "Starting sequence manager..."
+msgstr "シーケンスマネージャの起動..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:456
+msgid "Clearing studio data..."
+msgstr "スタジオデータのクリア..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:475
+#: ../src/gui/editors/notation/NotationView.cpp:558
+msgid "Starting..."
+msgstr "起動..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:556
+msgid "Import Rosegarden &Project file..."
+msgstr "Rosegardenプロジェクトファイルからインポート(&P)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:560
+msgid "Import &MIDI file..."
+msgstr "&MIDIファイルをインポート"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:564
+msgid "Import &Rosegarden 2.1 file..."
+msgstr "&Rosegarden 2.1ファイルからインポート"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:568
+msgid "Import &Hydrogen file..."
+msgstr "&Hydrogenファイルからインポート"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:572
+msgid "Merge &File..."
+msgstr "ファイルのマージ(&F)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:576
+msgid "Merge &MIDI file..."
+msgstr "&MIDIファイルのマージ"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:580
+msgid "Merge &Rosegarden 2.1 file..."
+msgstr "&Rosegarden2.1ファイルのマージ"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:584
+msgid "Merge &Hydrogen file..."
+msgstr "&Hydrogenファイルのマージ"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:588
+msgid "Export Rosegarden &Project file..."
+msgstr "Rosegardenプロジェクトファイルをエクスポート(&P)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:592
+msgid "Export &MIDI file..."
+msgstr "&MIDIファイルのエクスポート"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:596
+msgid "Export &LilyPond file..."
+msgstr "&Lilypondファイルのエクスポート"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:600
+msgid "Export Music&XML file..."
+msgstr "MusicXMLファイルのエクスポート(&X)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:604
+msgid "Export &Csound score file..."
+msgstr "&Csound楽譜ファイルのエクスポート"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:608
+msgid "Export M&up file..."
+msgstr "M&upファイルのエクスポート"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:612
+#: ../src/gui/editors/notation/NotationView.cpp:1500
+msgid "Print &with LilyPond..."
+msgstr "Lilypondで印刷(&w)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:616
+#: ../src/gui/editors/notation/NotationView.cpp:1504
+msgid "Preview with Lil&yPond..."
+msgstr "Lilypondでプレビュー(&y)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:620
+msgid "Play&list"
+msgstr "プレイリスト(&l)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:627
+msgid "Rosegarden &Tutorial"
+msgstr "Rosegardenチュートリアル(&T)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:631
+msgid "&Bug Reporting Guidelines"
+msgstr "バグ報告ガイドライン(&B)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:645
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:348
+#: ../src/gui/editors/segment/MarkerEditor.cpp:378
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:388
+#: ../src/gui/general/EditViewBase.cpp:190
+#: ../src/gui/studio/BankEditorDialog.cpp:318
+#: ../src/gui/studio/DeviceManagerDialog.cpp:227
+msgid "Und&o"
+msgstr "アンドゥ(&o)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:651
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:354
+#: ../src/gui/editors/segment/MarkerEditor.cpp:384
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:394
+#: ../src/gui/general/EditViewBase.cpp:196
+#: ../src/gui/studio/BankEditorDialog.cpp:324
+#: ../src/gui/studio/DeviceManagerDialog.cpp:233
+msgid "Re&do"
+msgstr "リドゥ(&d)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:665
+#: ../src/gui/editors/notation/NotationView.cpp:2297
+msgid "Show T&ools Toolbar"
+msgstr "ツールを表示(&o)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:669
+msgid "Show Trac&ks Toolbar"
+msgstr "トラックを表示(&k)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:673
+msgid "Show &Editors Toolbar"
+msgstr "エディタツールバーを表示(&E)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:677
+#: ../src/gui/editors/notation/NotationView.cpp:2309
+msgid "Show Trans&port Toolbar"
+msgstr "トランスポートツールバーを表示(&p)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:681
+msgid "Show &Zoom Toolbar"
+msgstr "ズームツールバーを表示(&Z)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:688
+msgid "Show Tra&nsport"
+msgstr "トランスポートの表示(&n)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:693
+msgid "Show Track &Labels"
+msgstr "トラックラベルの表示(&L)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:698
+msgid "Show Playback Position R&uler"
+msgstr "再生位置ルーラーの表示(&u)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:703
+msgid "Show Te&mpo Ruler"
+msgstr "テンポルーラーの表示(&m)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:708
+msgid "Show Cho&rd Name Ruler"
+msgstr "コード名ルーラーの表示(%r)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:714
+msgid "Show Segment Pre&views"
+msgstr "セグメントプレビューの表示(&v)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:719
+msgid "Show Special &Parameters"
+msgstr "特別パラメータの表示(&P)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:753
+#: ../src/gui/editors/matrix/MatrixView.cpp:641
+#: ../src/gui/editors/notation/NotationView.cpp:1772
+msgid "&Select and Edit"
+msgstr "選択と編集(&S)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:758
+#: ../src/gui/editors/matrix/MatrixView.cpp:646
+msgid "&Draw"
+msgstr "描画(&D)"
+
+#: ../src/commands/edit/EraseCommand.h:50
+#: ../src/gui/application/RosegardenGUIApp.cpp:763
+#: ../src/gui/editors/matrix/MatrixView.cpp:651
+#: ../src/gui/editors/notation/NotationView.cpp:1766
+msgid "&Erase"
+msgstr "消去(&E)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:768
+#: ../src/gui/editors/matrix/MatrixView.cpp:656
+msgid "&Move"
+msgstr "移動(&M)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:775
+msgid "&Resize"
+msgstr "リサイズ(&R)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:782 rc.cpp:87
+#, no-c-format
+msgid "&Split"
+msgstr "分割(&S)"
+
+#: ../src/commands/segment/SegmentJoinCommand.h:53
+#: ../src/gui/application/RosegardenGUIApp.cpp:789
+msgid "&Join"
+msgstr "結合(&J)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:795
+msgid "&Harmonize"
+msgstr "ハーモナイズ(&H)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:806
+#: ../src/gui/rulers/TempoRuler.cpp:157
+msgid "Open Tempo and Time Signature Editor"
+msgstr "テンポ/拍子エディタを開く"
+
+#: ../src/commands/segment/CutRangeCommand.cpp:41
+#: ../src/gui/application/RosegardenGUIApp.cpp:812
+msgid "Cut Range"
+msgstr "レンジをカット"
+
+#: ../src/commands/edit/CopyCommand.cpp:73
+#: ../src/gui/application/RosegardenGUIApp.cpp:816
+msgid "Copy Range"
+msgstr "レンジをコピー"
+
+#: ../src/commands/segment/PasteRangeCommand.cpp:45
+#: ../src/gui/application/RosegardenGUIApp.cpp:820
+msgid "Paste Range"
+msgstr "レンジの貼り付け"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:828
+msgid "Insert Range..."
+msgstr "レンジの挿入"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:832
+#: ../src/gui/editors/notation/NotationView.cpp:1804
+msgid "De&lete"
+msgstr "削除(&l)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:836
+msgid "Select &All Segments"
+msgstr "すべてのセグメントを選択(&A)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:852
+msgid "Edit Mar&kers..."
+msgstr "マーカーの編集(&k)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:856
+msgid "Edit Document P&roperties..."
+msgstr "ドキュメントプロパティの編集(&r)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:864
+msgid "Open in &Default Editor"
+msgstr "デフォルトのエディタでオープン(&D)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:870
+#: ../src/gui/general/EditViewBase.cpp:206
+msgid "Open in Matri&x Editor"
+msgstr "マトリクスエディタ(&x)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:876
+#: ../src/gui/general/EditViewBase.cpp:212
+msgid "Open in &Percussion Matrix Editor"
+msgstr "パーカッションマトリクスエディタでオープン(&P) "
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:882
+#: ../src/gui/general/EditViewBase.cpp:218
+msgid "Open in &Notation Editor"
+msgstr "譜面エディタ(&N)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:888
+#: ../src/gui/general/EditViewBase.cpp:224
+msgid "Open in &Event List Editor"
+msgstr "イベントリストエディタ(&E)"
+
+#: ../src/commands/edit/EventQuantizeCommand.cpp:120
+#: ../src/commands/edit/EventUnquantizeCommand.cpp:87
+#: ../src/gui/application/RosegardenGUIApp.cpp:894
+msgid "&Quantize..."
+msgstr "クオンタイズ(&Q)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:908
+#: ../src/gui/editors/matrix/MatrixView.cpp:686
+msgid "Repeat Last Quantize"
+msgstr "最後のクォンタイズを繰り返す"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:928
+msgid "Split at Time..."
+msgstr "時間で分割..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:932
+#: ../src/gui/general/EditView.cpp:796
+msgid "Jog &Left"
+msgstr "左にずらす(&L)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:936
+#: ../src/gui/general/EditView.cpp:800
+msgid "Jog &Right"
+msgstr "右にずらす(&R)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:940
+msgid "Set Start Time..."
+msgstr "開始時間を設定..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:944
+msgid "Set Duration..."
+msgstr "デュレーションを設定..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:953
+msgid "Turn Re&peats into Copies"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:958
+msgid "Manage Tri&ggered Segments"
+msgstr "トリガーセグメントの管理(&g)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:962
+msgid "Set Tempos from &Beat Segment"
+msgstr "拍セグメントにテンポ設定(&B)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:966
+msgid "Set &Tempo to Audio Segment Duration"
+msgstr "オーディオセグメントデュレーションにテンポ設定(&T)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:972
+msgid "Manage A&udio Files"
+msgstr "オーディオファイルの操作(&u)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:977
+msgid "Show Segment Labels"
+msgstr "セグメントラベルの表示"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:986
+msgid "Add &Track"
+msgstr "トラックを追加(&T)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:990
+msgid "&Add Tracks..."
+msgstr "トラック追加(&A)..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:996
+msgid "D&elete Track"
+msgstr "トラック削除(&e)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1002
+msgid "Move Track &Down"
+msgstr "トラックを下に移動(&D)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1008
+msgid "Move Track &Up"
+msgstr "トラックを上に移動(&U)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1012
+msgid "Select &Next Track"
+msgstr "次のトラックを選択(&N)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1017
+msgid "Select &Previous Track"
+msgstr "前のトラックを選択(&P)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1022
+msgid "Mute or Unmute Track"
+msgstr "トラックをミュート/ミュート停止"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1027
+msgid "Arm or Un-arm Track for Record"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1034
+msgid "&Mute all Tracks"
+msgstr "すべてのトラックをミュート(&M)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1040
+msgid "&Unmute all Tracks"
+msgstr "すべてのトラックのミュート取消(&U)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1044
+msgid "&Remap Instruments..."
+msgstr "インストゥルメントの割り当て(&R)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1053
+msgid "&Audio Mixer"
+msgstr "オーディオミキサ(&A)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1059
+msgid "Midi Mi&xer"
+msgstr "MIDIミキサ(&x)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1065
+msgid "Manage MIDI &Devices"
+msgstr "MIDIデバイスの管理(&D)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1071
+msgid "Manage S&ynth Plugins"
+msgstr "シンセプラグインの管理(&S)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1075
+msgid "Modify MIDI &Filters"
+msgstr "MIDIフィルタを変更(&F)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1079
+msgid "MIDI Thru Routing"
+msgstr "MIDI Trruに出力"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1085
+msgid "Manage &Metronome"
+msgstr "メトロノームの管理(&M)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1089
+msgid "&Save Current Document as Default Studio"
+msgstr "ドキュメントをデフォルトのスタジオに保存(&S)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1093
+msgid "&Import Default Studio"
+msgstr "デフォルトのスタジオをインポート(&I)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1097
+msgid "Im&port Studio from File..."
+msgstr "ファイルからスタジオをインポート(&p)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1101
+msgid "&Reset MIDI Network"
+msgstr "MIDIネットワークをリセット(&R)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1105
+msgid "Set Quick Marker at Playback Position"
+msgstr "再生位置にクイックマーカを挿入"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1109
+msgid "Jump to Quick Marker"
+msgstr "クィックマーカに移動"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1142
+#: ../src/gui/editors/matrix/MatrixView.cpp:782
+#: ../src/gui/editors/notation/NotationView.cpp:2397
+#: ../src/gui/studio/AudioMixerWindow.cpp:105
+#: ../src/gui/studio/MidiMixerWindow.cpp:81
+msgid "&Play"
+msgstr "再生(&P)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1153
+#: ../src/gui/editors/matrix/MatrixView.cpp:791
+#: ../src/gui/editors/notation/NotationView.cpp:2406
+#: ../src/gui/studio/AudioMixerWindow.cpp:114
+#: ../src/gui/studio/MidiMixerWindow.cpp:90
+msgid "&Stop"
+msgstr "停止(&S)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1160
+#: ../src/gui/editors/matrix/MatrixView.cpp:802
+#: ../src/gui/editors/notation/NotationView.cpp:2417
+#: ../src/gui/studio/AudioMixerWindow.cpp:125
+#: ../src/gui/studio/MidiMixerWindow.cpp:101
+msgid "&Fast Forward"
+msgstr "早送り(&F)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1168
+#: ../src/gui/editors/matrix/MatrixView.cpp:796
+#: ../src/gui/editors/notation/NotationView.cpp:2411
+#: ../src/gui/studio/AudioMixerWindow.cpp:119
+#: ../src/gui/studio/MidiMixerWindow.cpp:95
+msgid "Re&wind"
+msgstr "巻き戻し(&R)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1175
+msgid "P&unch in Record"
+msgstr "パンチイン録音(&P)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1182
+#: ../src/gui/studio/AudioMixerWindow.cpp:143
+#: ../src/gui/studio/MidiMixerWindow.cpp:119
+msgid "&Record"
+msgstr "録音(&R)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1189
+#: ../src/gui/editors/matrix/MatrixView.cpp:808
+#: ../src/gui/editors/notation/NotationView.cpp:2423
+#: ../src/gui/studio/AudioMixerWindow.cpp:131
+#: ../src/gui/studio/MidiMixerWindow.cpp:107
+msgid "Rewind to &Beginning"
+msgstr "最初に戻す(&B)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1196
+#: ../src/gui/editors/matrix/MatrixView.cpp:814
+#: ../src/gui/editors/notation/NotationView.cpp:2429
+#: ../src/gui/studio/AudioMixerWindow.cpp:137
+#: ../src/gui/studio/MidiMixerWindow.cpp:113
+msgid "Fast Forward to &End"
+msgstr "最後に進む(&E)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1203
+#: ../src/gui/editors/matrix/MatrixView.cpp:832
+#: ../src/gui/editors/notation/NotationView.cpp:2447
+msgid "Scro&ll to Follow Playback"
+msgstr "再生中スクロールする(&l)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1209
+#: ../src/gui/editors/matrix/MatrixView.cpp:838
+#: ../src/gui/editors/notation/NotationView.cpp:2453
+#: ../src/gui/studio/AudioMixerWindow.cpp:149
+#: ../src/gui/studio/MidiMixerWindow.cpp:125
+msgid "Panic"
+msgstr "パニック"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1213
+msgid "Segment Debug Dump "
+msgstr "セグメントデバッグダンプ"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1283
+msgid " Zoom: "
+msgstr " ズーム:"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1719
+msgid "File \"%1\" does not exist"
+msgstr "ファイル \"%1\"がありません"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1725
+msgid "File \"%1\" is actually a directory"
+msgstr "ファイル\"%1\"はディレクトリです"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1734
+msgid "You do not have read permission for \"%1\""
+msgstr "\"%1\"の読み出しパーミッションではありません"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1802
+msgid ""
+"An auto-save file for this document has been found\n"
+"Do you want to open it instead ?"
+msgstr ""
+"このドキュメントが自動セーブしたファイルを見つけました\n"
+"こちらをオープンしますか?"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1896
+msgid "Example Files"
+msgstr "フィルタの例"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2100
+msgid "Opening a new application window..."
+msgstr "新しいアプリケーションウィンドウをオープン..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2110
+msgid "Creating new document..."
+msgstr "新しいドキュメントを作成..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2154
+#, c-format
+msgid ""
+"Malformed URL\n"
+"%1"
+msgstr ""
+"不正な形式のURL\n"
+"%1"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2179
+#: ../src/gui/application/RosegardenGUIApp.cpp:2240
+msgid "Opening file..."
+msgstr "ファイルをオープン中..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2201
+#: ../src/gui/application/RosegardenGUIApp.cpp:2220
+msgid "Open File"
+msgstr "ファイルのオープン"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1225
+#: ../src/gui/application/RosegardenGUIApp.cpp:2258
+msgid "Saving file..."
+msgstr "ファイルにセーブ..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2330
+msgid "This is not a valid filename.\n"
+msgstr "正しいファイル名ではありません。\n"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2335
+msgid "This is not a local file.\n"
+msgstr "ローカルファイルではありません。\n"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2342
+#: ../src/gui/studio/BankEditorDialog.cpp:1640
+#: ../src/gui/studio/DeviceManagerDialog.cpp:787
+msgid "You have specified a directory"
+msgstr "ディレクトリを指定しています"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2348
+#: ../src/gui/studio/BankEditorDialog.cpp:1646
+#: ../src/gui/studio/DeviceManagerDialog.cpp:793
+msgid "The specified file exists. Overwrite?"
+msgstr "指定したファイルが存在します。上書きしますか?"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2362
+msgid "Saving file with a new filename..."
+msgstr "新しいファイル名で保存..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2364
+msgid "Rosegarden files"
+msgstr "Rosegardenファイル"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2365
+#: ../src/gui/application/RosegardenGUIApp.cpp:4860
+#: ../src/gui/application/RosegardenGUIApp.cpp:4904
+#: ../src/gui/application/RosegardenGUIApp.cpp:4942
+#: ../src/gui/application/RosegardenGUIApp.cpp:4975
+#: ../src/gui/application/RosegardenGUIApp.cpp:5009
+#: ../src/gui/application/RosegardenGUIApp.cpp:5116
+msgid "All files"
+msgstr "すべてのファイル"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2366
+msgid "Save as..."
+msgstr "名前を付けて保存..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2404
+msgid "Closing file..."
+msgstr "ファイルをクローズ..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2421
+#: ../src/gui/editors/notation/NotationView.cpp:4618
+msgid "Printing..."
+msgstr "印刷..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2433
+#: ../src/gui/editors/notation/NotationView.cpp:4635
+msgid "Previewing..."
+msgstr "プレビュー..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2440
+msgid "Exiting..."
+msgstr "終了..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2463
+msgid "Cutting selection..."
+msgstr "選択部分を切り取り..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2474
+#: ../src/gui/editors/matrix/MatrixView.cpp:1614
+#: ../src/gui/editors/notation/NotationView.cpp:4763
+msgid "Copying selection to clipboard..."
+msgstr "クリップボードに選択部分をコピー..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2484
+#: ../src/gui/editors/eventlist/EventView.cpp:878
+#: ../src/gui/editors/matrix/MatrixView.cpp:1625
+#: ../src/gui/editors/notation/NotationView.cpp:4796
+#: ../src/gui/editors/notation/NotationView.cpp:4841
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:352
+msgid "Clipboard is empty"
+msgstr "クリップボードは空です"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2487
+#: ../src/gui/editors/eventlist/EventView.cpp:882
+#: ../src/gui/editors/matrix/MatrixView.cpp:1629
+#: ../src/gui/editors/notation/NotationView.cpp:4804
+#: ../src/gui/editors/notation/NotationView.cpp:4845
+msgid "Inserting clipboard contents..."
+msgstr "クリップボードの内容を挿入..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2556
+msgid "Duration of empty range to insert"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2631
+msgid "This function needs no more than one segment to be selected."
+msgstr "この機能は、選択のために、2つ以上のセグメントは必要としない。"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2654
+msgid "Can't join Audio segments"
+msgstr "オーディオセグメントを結合できない"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2707
+msgid "rescaling an audio file"
+msgstr "オーディオファイルの再スケール"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2723
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:172
+msgid "Rescaling audio file..."
+msgstr "オーディオファイルの長さ変更中..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2767
+msgid ""
+"The audio file path does not exist or is not writable.\n"
+"You must set the audio file path to a valid directory in Document Properties "
+"before %1.\n"
+"Would you like to set it now?"
+msgstr ""
+"オーディオファイルのパスが存在しないか書き込みができません\n"
+"%1 の前にドキュメントプロパティで正しいディレクトリパスを設定してください。\n"
+"すぐに設定をしますか?"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2769
+#: ../src/gui/application/RosegardenGUIApp.cpp:5291
+#: ../src/gui/application/RosegardenGUIApp.cpp:5339
+#: ../src/gui/editors/segment/TrackButtons.cpp:419
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:159
+msgid "Set audio file path"
+msgstr "オーディオファイルパスの設定"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2833
+msgid "Jog Selection"
+msgstr "Jog選択"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2978
+#, c-format
+msgid ""
+"_n: Split Segment at Time\n"
+"Split %n Segments at Time"
+msgstr "時間で%n セグメントを分割"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3013
+#: ../src/gui/general/EditViewBase.cpp:619
+msgid "Segment Start Time"
+msgstr "セグメント開始時間"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3023
+msgid "Set Segment Start Times"
+msgstr "セグメントの開始時間を指定"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3024
+#: ../src/gui/general/EditViewBase.cpp:626
+msgid "Set Segment Start Time"
+msgstr "セグメントの開始時間を指定"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3056
+#: ../src/gui/general/EditViewBase.cpp:644
+msgid "Segment Duration"
+msgstr "セグメントのデュレーション"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3068
+msgid "Set Segment Durations"
+msgstr "セグメントのデュレーションを設定"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3069
+#: ../src/gui/general/EditViewBase.cpp:652
+msgid "Set Segment Duration"
+msgstr "セグメントのデュレーションを設定"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3176
+#: ../src/gui/application/RosegardenGUIApp.cpp:5875
+msgid "Set Global Tempo"
+msgstr "全体のテンポを設定"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3234
+#: ../src/gui/general/EditViewBase.cpp:477
+msgid "Toggle the toolbar..."
+msgstr "ツールバーをON/OFF..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3244
+msgid "Toggle the tools toolbar..."
+msgstr "道具ツールバーをON/OFF..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3254
+msgid "Toggle the tracks toolbar..."
+msgstr "トラックツールバーをON/OFF..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3264
+msgid "Toggle the editor toolbar..."
+msgstr "エディタツールバーをON/OFF..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3274
+msgid "Toggle the transport toolbar..."
+msgstr "トランスポートツールバーをON/OFF..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3284
+msgid "Toggle the zoom toolbar..."
+msgstr "ズームツールバーをON/OFF..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3294
+msgid "Toggle the Transport"
+msgstr "トランスポートをON/OFF"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3377
+#: ../src/gui/general/EditViewBase.cpp:487
+msgid "Toggle the statusbar..."
+msgstr "ステータスバーをON/OFF..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3434
+msgid ""
+"The join tool isn't implemented yet. Instead please highlight the segments "
+"you want to join and then use the menu option:\n"
+"\n"
+" Segments->Collapse Segments.\n"
+msgstr ""
+"併合ツールはまだ実装されていません。 その代わりに、併合したい セグメントをハ"
+"イライトさせ、次に、メニューオプション:\n"
+"\n"
+" セグメント->セグメントの破壊 を使ってください。\n"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3437
+msgid "Join tool not yet implemented"
+msgstr "結合ツールはまだ実装されていない"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3675
+msgid "Revert modified document to previous saved version?"
+msgstr "変更したドキュメントを以前のバージョンに戻しますか?"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3691
+msgid ""
+"*.rgp|Rosegarden Project files\n"
+"*|All files"
+msgstr ""
+"*.rgp|Rosegardenプロジェクトファイル\n"
+"*|すべてのファイル"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3692
+msgid "Import Rosegarden Project File"
+msgstr "Rosegardenプロジェクトファイルのインポート"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3717
+msgid "Failed to import project file \"%1\""
+msgstr "プロジェクトファイル \"%1\"のインポートに失敗"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3739
+msgid "Open MIDI File"
+msgstr "MIDIファイルのオープン"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3756
+msgid "Merge MIDI File"
+msgstr "MIDIファイルのマージ"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3866
+msgid "Importing MIDI file..."
+msgstr "MIDIファイルのインポート..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3903
+msgid "Calculating notation..."
+msgstr "音符の計算...."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3950
+msgid "Calculate Notation"
+msgstr "音符の計算"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3991
+#: ../src/gui/application/RosegardenGUIApp.cpp:4008
+msgid ""
+"*.rose|Rosegarden-2 files\n"
+"*|All files"
+msgstr ""
+"*.rose|Rosegarden-2 ファイル\n"
+"*|すべてのファイル"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3992
+#: ../src/gui/application/RosegardenGUIApp.cpp:4009
+msgid "Open Rosegarden 2.1 File"
+msgstr "Rosegarden 2.1のファイルをオープン"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4026
+msgid "Importing Rosegarden 2.1 file..."
+msgstr "Rosegarden 2.1ファイルのインポート..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4052
+msgid "Can't load Rosegarden 2.1 file. It appears to be corrupted."
+msgstr "Rosegarden 2.1ファイルがロードできない。ファイルが壊れている。"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4078
+#: ../src/gui/application/RosegardenGUIApp.cpp:4095
+msgid ""
+"*.h2song|Hydrogen files\n"
+"*|All files"
+msgstr ""
+"*.h2song|Hydrogen ファイル\n"
+"*|すべてのファイル"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4079
+#: ../src/gui/application/RosegardenGUIApp.cpp:4096
+msgid "Open Hydrogen File"
+msgstr "Hydrogenファイルのオープン"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4113
+msgid "Importing Hydrogen file..."
+msgstr "Hydrogenファイルをインポート..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4139
+msgid "Can't load Hydrogen file. It appears to be corrupted."
+msgstr "ファイルが壊れているのでHydrogenファイルはロードできません。"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4527
+msgid "Export and import of Rosegarden Project files"
+msgstr "Rosegardenプロジェクトファイルをインポート/エクスポート"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4529
+msgid "The Rosegarden Project Packager helper script"
+msgstr "Rosegardenプロジェクトパッケージャヘルパースクリプト"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4533
+msgid "%1 - for project file support"
+msgstr "プロジェクトファイルサポート用 - %1"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4550
+msgid "The Rosegarden LilyPondView helper script"
+msgstr "Rosegarden LilyPondプレビューヘルパースクリプト"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4554
+msgid "%1 - for LilyPond preview support"
+msgstr "%1用のLilypondプレビューサポート"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4570
+msgid "The Rosegarden Audio File Importer helper script"
+msgstr "Rosegarden オーディオファイルインポート用ヘルパースクリプト"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4574
+msgid "%1 - for audio file import"
+msgstr "%1 - オーディオファイルインポート用"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4585
+msgid ""
+"<h3>Helper programs not found</h3><p>Rosegarden could not find one or more "
+"helper programs which it needs to provide some features. The following "
+"features will not be available:</p>"
+msgstr ""
+"<H3>ヘルパープログラムが見つかりません。</h3><p>Rosegarden は、いくつかの機能"
+"を提供するための、1つまたはそれ以上のヘルパー プログラムを見つけることができ"
+"ませんでした。 以下の機能は無効です:</P>"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4586
+#: ../src/gui/application/RosegardenGUIApp.cpp:4592
+msgid "<ul>"
+msgstr "<ul>"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4588
+#: ../src/gui/application/RosegardenGUIApp.cpp:4594
+msgid "<li>%1</li>"
+msgstr "<li>%1</li>"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4590
+#: ../src/gui/application/RosegardenGUIApp.cpp:4596
+msgid "</ul>"
+msgstr "</ul>"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4591
+msgid ""
+"<p>To fix this, you should install the following additional programs:</p>"
+msgstr ""
+"<p>これを修復するために、以下の追加プログラムをインストール する必要がありま"
+"す:</p>"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4603
+msgid "Helper programs not found"
+msgstr "ヘルパープログラムが見つかりません"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4686
+msgid "Starting the sequencer..."
+msgstr "シーケンサの起動..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4712
+msgid "Couldn't start the sequencer"
+msgstr "シーケンサを起動できない"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4789
+msgid "Clearing down jackd..."
+msgstr "jackdを停止..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4803
+msgid "Starting jackd..."
+msgstr "jackdの起動..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4842
+msgid ""
+"The Rosegarden sequencer process has exited unexpectedly. Sound and "
+"recording will no longer be available for this session.\n"
+"Please exit and restart Rosegarden to restore sound capability."
+msgstr ""
+"Rosegardenのプロセスは異常終了しました。セッションのサウンドや録音したものは"
+"使うことができません。\n"
+"Rosegardenを再起動してサウンド機能を有効にしてください。"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4846
+msgid ""
+"The Rosegarden sequencer could not be started, so sound and recording will "
+"be unavailable for this session.\n"
+"For assistance with correct audio and MIDI configuration, go to http://"
+"rosegardenmusic.com."
+msgstr ""
+"Rosegardenのシーケンサを起動できませんでした。セッションのサウンドや録音した"
+"ものは使うことができません。\n"
+"http://rosegardenmusic.com を参照してオーディオとMIDIの設定を修正してくださ"
+"い。"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4856
+msgid "Exporting Rosegarden Project file..."
+msgstr "Rosegardenプロジェクトファイルをエクスポート中..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4859
+msgid "Rosegarden Project files\n"
+msgstr "Rosegardenプロジェクトファイル\n"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4861
+#: ../src/gui/application/RosegardenGUIApp.cpp:4905
+#: ../src/gui/application/RosegardenGUIApp.cpp:4943
+#: ../src/gui/application/RosegardenGUIApp.cpp:4976
+#: ../src/gui/application/RosegardenGUIApp.cpp:5010
+#: ../src/gui/application/RosegardenGUIApp.cpp:5116
+msgid "Export as..."
+msgstr "ファイル名を指定してエクスポート..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4875
+#, c-format
+msgid "Saving Rosegarden file to package failed: %1"
+msgstr "Rosegardenファイルをパッケージに保存するのに失敗: %1"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4889
+msgid "Failed to export to project file \"%1\""
+msgstr "プロジェクトファイル \"%1\"のエクスポートに失敗"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4900
+#: ../src/gui/application/RosegardenGUIApp.cpp:4915
+msgid "Exporting MIDI file..."
+msgstr "MIDIファイルのエクスポート..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4903
+msgid "Standard MIDI files\n"
+msgstr "Standard MIDI ファイル\n"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4934
+#: ../src/gui/application/RosegardenGUIApp.cpp:4966
+#: ../src/gui/application/RosegardenGUIApp.cpp:4999
+#: ../src/gui/application/RosegardenGUIApp.cpp:5103
+#: ../src/gui/application/RosegardenGUIApp.cpp:5140
+#: ../src/gui/editors/notation/NotationView.cpp:4733
+msgid "Export failed. The file could not be opened for writing."
+msgstr "エクスポートに失敗しました。書き込みできませんでした。"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4940
+#: ../src/gui/application/RosegardenGUIApp.cpp:4952
+msgid "Exporting Csound score file..."
+msgstr "Csoundスコアファイルのエクスポート..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4972
+#: ../src/gui/application/RosegardenGUIApp.cpp:4985
+msgid "Exporting Mup file..."
+msgstr "Mupファイルをエクスポート..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4975
+msgid "Mup files\n"
+msgstr "Mupファイル\n"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5005
+#: ../src/gui/application/RosegardenGUIApp.cpp:5089
+#: ../src/gui/editors/notation/NotationView.cpp:4719
+msgid "Exporting LilyPond file..."
+msgstr "Lilypondファイルをエクスポート..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5008
+msgid "LilyPond files"
+msgstr "Lilypondファイル"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5023
+#: ../src/gui/editors/notation/NotationView.cpp:4653
+msgid "Printing LilyPond file..."
+msgstr "Lilypondファイルを印刷..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5028
+#: ../src/gui/application/RosegardenGUIApp.cpp:5052
+#: ../src/gui/editors/notation/NotationView.cpp:4658
+#: ../src/gui/editors/notation/NotationView.cpp:4682
+msgid "Failed to open a temporary file for LilyPond export."
+msgstr "Lilypondエクスポートのための一時ファイルのオープンに失敗"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5047
+#: ../src/gui/editors/notation/NotationView.cpp:4677
+msgid "Previewing LilyPond file..."
+msgstr "Lilypondファイルをプレビュー..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5080
+#: ../src/gui/editors/notation/NotationView.cpp:4710
+msgid "LilyPond Preview Options"
+msgstr "Lilypondプレビューオプション"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5081
+#: ../src/gui/editors/notation/NotationView.cpp:4711
+msgid "LilyPond preview options"
+msgstr "Lilypondプレビューオプション"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5112
+#: ../src/gui/application/RosegardenGUIApp.cpp:5126
+msgid "Exporting MusicXML file..."
+msgstr "MusicXMLファイルをエクスポート..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5115
+msgid "XML files"
+msgstr "XMLファイル"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5289
+#: ../src/gui/editors/segment/TrackButtons.cpp:417
+msgid ""
+"The audio file path does not exist or is not writable.\n"
+"Please set the audio file path to a valid directory in Document Properties "
+"before recording audio.\n"
+"Would you like to set it now?"
+msgstr ""
+"オーディオファイルのパスが存在しないか、書き込みできない。\n"
+"オーディオを録音する前にドキュメントプロパティ中で、オーディオ パスのための有"
+"効なディレクトリを指定する。\n"
+"今それを設定するか?"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5337
+msgid ""
+"The audio file path does not exist or is not writable.\n"
+"Please set the audio file path to a valid directory in Document Properties "
+"before you start to record audio.\n"
+"Would you like to set it now?"
+msgstr ""
+"オーディオファイルのパスが存在しないか書き込みできません。\n"
+"オーディオの録音をする前にドキュメントプロパティからオーディオファイルの正し"
+"いディレクトリパスを設定してください。\n"
+"今すぐ設定しますか?"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5780
+msgid "Move playback pointer to time"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5793
+#: ../src/gui/editors/matrix/MatrixView.cpp:2240
+msgid "%1%"
+msgstr "%1%"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5861
+#, c-format
+msgid "Replace Tempo Change at %1"
+msgstr "テンポを置き換える"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5891
+msgid "Set Global and Default Tempo"
+msgstr "デフォルトテンポを設定"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5914
+msgid "Move Tempo Change"
+msgstr "テンポを移動"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5949
+msgid "new marker"
+msgstr "新しいマーカ"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5950
+msgid "no description"
+msgstr "説明なし"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:6363
+#, c-format
+msgid "Sequencer failed to add audio file %1"
+msgstr "オーディオファイル %1 に追加することにシーケンサが失敗"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:6388
+#, c-format
+msgid "Sequencer failed to remove audio file id %1"
+msgstr "オーディオファイル id %1 を削除するのにシーケンサが失敗"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:6448
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:1086
+msgid "Modify Segment label"
+msgstr "セグメントラベルの変更"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:6450
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:1088
+msgid "Modify Segments label"
+msgstr "セグメントラベルの変更"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:6452
+msgid "Relabelling selection..."
+msgstr "セレクションの再ラベル中..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7539
+msgid "Play List"
+msgstr "プレイリスト"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7567
+msgid "http://rosegarden.sourceforge.net/tutorial/en/chapter-0.html"
+msgstr "http://rosegarden.sourceforge.net/tutorial/en/chapter-0.html"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7574
+msgid "http://rosegarden.sourceforge.net/tutorial/bug-guidelines.html"
+msgstr "http://rosegarden.sourceforge.net/tutorial/bug-guidelines.html"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7650
+msgid "Queueing MIDI panic events for tranmission..."
+msgstr "転送のためにMIDIパニックイベントをキューイング..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7708
+msgid "Are you sure you want to save this as your default studio?"
+msgstr "デフォルトのスタジオとしてセーブしますか?"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7713
+msgid "Saving current document as default studio..."
+msgstr "現在のドキュメントをデフォルトのスタジオとしてセーブ..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7738
+msgid ""
+"Are you sure you want to import your default studio and lose the current one?"
+msgstr "ドキュメントを破棄してデフォルトのスタジオをインポートしますか?"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7773
+msgid "Import Studio from File"
+msgstr "ファイルからのスタジオのインポート"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7807
+msgid "Import Studio"
+msgstr "スタジオのインポート"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:8015
+msgid ""
+"<h3>Newer version available</h3><p>A newer version of Rosegarden may be "
+"available.<br>Please consult the <a href=\"http://www.rosegardenmusic.com/"
+"getting/\">Rosegarden website</a> for more information.</p>"
+msgstr ""
+"<h3>新しいバージョンがあります</h3><p>Rosegardenの新しい バージョンが有効で"
+"す。<br>詳細は<a href=\"http://www.rosegardenmusic.com/getting/\">Rosegarden "
+"website</a>を参照してください。"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:8016
+msgid "Newer version available"
+msgstr "新しいバージョンが有効"
+
+#: ../src/gui/application/RosegardenApplication.cpp:104
+#, c-format
+msgid "Failed to load soundfont %1"
+msgstr "サウンドフォント %1のロードに失敗"
+
+#: ../src/gui/application/main.cpp:311
+msgid "Rosegarden - A sequencer and musical notation editor"
+msgstr "Rosegarden - シーケンサと譜面エディタ"
+
+#: ../src/gui/application/main.cpp:315
+msgid "Don't use the sequencer (support editing only)"
+msgstr "シーケンサは使えません (編集のみサポート)"
+
+#: ../src/gui/application/main.cpp:316
+msgid "Don't show the splash screen"
+msgstr "スプラッシュスクリーンを表示しない"
+
+#: ../src/gui/application/main.cpp:317
+msgid "Don't automatically run in the background"
+msgstr "バックグラウンドで自動的に起動しない"
+
+#: ../src/gui/application/main.cpp:318
+msgid "Attach to a running sequencer process, if found"
+msgstr "もしも見付かれば、シーケンサプロセスに接続"
+
+#: ../src/gui/application/main.cpp:319
+msgid "Ignore installed version - for devs only"
+msgstr "インストールされたバージョンを無視 - 開発者のみ"
+
+#: ../src/gui/application/main.cpp:320
+msgid "file to open"
+msgstr "ファイルをオープン"
+
+#: ../src/gui/application/main.cpp:370
+msgid "Installation contains the wrong version of Rosegarden."
+msgstr ""
+"インストールされたものに間違ったバージョンのRosegardenが含まれています。"
+
+#: ../src/gui/application/main.cpp:371
+msgid ""
+" The wrong versions of Rosegarden's data files were\n"
+" found in the standard KDE installation directories.\n"
+" (I am %1, but the installed files are for version %2.)\n"
+"\n"
+" This may mean one of the following:\n"
+"\n"
+" 1. This is a new upgrade of Rosegarden, and it has not yet been\n"
+" installed. If you compiled it yourself, check that you have\n"
+" run \"make install\" and that the procedure completed\n"
+" successfully.\n"
+"\n"
+" 2. The upgrade was installed in a non-standard directory,\n"
+" and an old version was found in a standard directory. If so,\n"
+" you will need to add the correct directory to your KDEDIRS\n"
+" environment variable before you can run it."
+msgstr ""
+" 間違ったバージョンのRosegardenのデータファイルが標準KDE\n"
+" インストールディレクトリ中に見付かった。(現在のものは%1だが\n"
+" インストールされていたファイルはバージョンが%2である)。\n"
+"\n"
+" これはおそらく以下の理由による:\n"
+"\n"
+" 1. 現在のものが新しいバージョンのRosegardenで、まだインス\n"
+" トールされていない。もしもあなた自身でコンパイルしたな\n"
+" らば、\"scons install\"の実行と、完全に正しく完了したか\n"
+" を確認する。\n"
+"\n"
+" 2. 非標準のディレクトリにアップデートがインストールされ、\n"
+" 標準のディレクトリに古いものが見付かった。もしもそうな\n"
+" らば、実行する前に環境変数KDEDIRSに正しいディレクトリを\n"
+" 追加しなければならない。"
+
+#: ../src/gui/application/main.cpp:383 ../src/gui/application/main.cpp:401
+msgid "Installation problem"
+msgstr "インストレーションの問題"
+
+#: ../src/gui/application/main.cpp:389
+msgid "Rosegarden does not appear to have been installed."
+msgstr "Rosegardenがインストールされているように見えない。"
+
+#: ../src/gui/application/main.cpp:390
+msgid ""
+" One or more of Rosegarden's data files could not be\n"
+" found in the standard KDE installation directories.\n"
+"\n"
+" This may mean one of the following:\n"
+"\n"
+" 1. Rosegarden has not been correctly installed. If you compiled\n"
+" it yourself, check that you have run \"make install\" and that\n"
+" the procedure completed successfully.\n"
+"\n"
+" 2. Rosegarden has been installed in a non-standard directory,\n"
+" and you need to add this directory to your KDEDIRS environment\n"
+" variable before you can run it. This may be the case if you\n"
+" installed into $HOME or a local third-party package directory\n"
+" like /usr/local or /opt."
+msgstr ""
+" 1つまたはそれ以上のRosegardenのデータファイルが標準のKDE\n"
+" インストールディレクトリに見当たらない。\n"
+"\n"
+" これはおそらく以下の理由による:\n"
+" 1. Rosegardenが完全にインストールされていない。もしもあなた\n"
+" 自身でコンパイルしたならば、\"scons install\"の実行と、正しく\n"
+" 完了したかを確認する。\n"
+"\n"
+" 2. 非標準のディレクトリにアップデートがインストールされ、\n"
+" 実行する前に環境変数KDEDIRSにこのディレクトリを追加する\n"
+" 必要がある。これは、たとえば/usr/localや/optのようなサード\n"
+" パーティ用ディレクトリか$HOMEにインストールする場合であろう。"
+
+#: ../src/gui/application/main.cpp:414
+msgid "Rosegarden"
+msgstr "Rosegarden"
+
+#: ../src/gui/application/main.cpp:416
+msgid ""
+"Copyright 2000 - 2008 Guillaume Laurent, Chris Cannam, Richard Bown\n"
+"Parts copyright 1994 - 2004 Chris Cannam, Andy Green, Richard Bown, "
+"Guillaume Laurent\n"
+"LilyPond fonts copyright 1997 - 2005 Han-Wen Nienhuys and Jan Nieuwenhuizen"
+msgstr ""
+"Copyright 2000 - 2008 Guillaume Laurent, Chris Cannam, Richard Bown\n"
+"Parts copyright 1994 - 2004 Chris Cannam, Andy Green, Richard Bown, "
+"Guillaume Laurent\n"
+"LilyPond fonts copyright 1997 - 2005 Han-Wen Nienhuys and Jan Nieuwenhuizen"
+
+#: ../src/gui/application/main.cpp:428
+msgid "Chord labelling code"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:429
+msgid ""
+"LilyPond output\n"
+"assorted other patches\n"
+"i18n-ization"
+msgstr ""
+"Lilypond出力\n"
+"種々のその他のパッチ\n"
+"i18n化"
+
+#: ../src/gui/application/main.cpp:430
+msgid ""
+"UI improvements\n"
+"bug fixes"
+msgstr ""
+"UI 改善\n"
+"バグ修正"
+
+#: ../src/gui/application/main.cpp:431
+msgid ""
+"Segment colours\n"
+"Other UI and bug fixes"
+msgstr ""
+"セグメントカラー\n"
+"他のUIとバグ修正"
+
+#: ../src/gui/application/main.cpp:432
+msgid ""
+"Russian translation\n"
+"i18n-ization"
+msgstr ""
+"ロシア語への翻訳\n"
+"国際化"
+
+#: ../src/gui/application/main.cpp:433 ../src/gui/application/main.cpp:434
+msgid "German translation"
+msgstr "ドイツ語への翻訳"
+
+#: ../src/gui/application/main.cpp:435
+msgid "Welsh translation"
+msgstr "ウェールズ語への翻訳"
+
+#: ../src/gui/application/main.cpp:436
+msgid "French translation"
+msgstr "フランス語への翻訳"
+
+#: ../src/gui/application/main.cpp:437
+msgid ""
+"French translation\n"
+"Bug fixes"
+msgstr ""
+"フランス語への翻訳\n"
+"バグ修正"
+
+#: ../src/gui/application/main.cpp:438 ../src/gui/application/main.cpp:439
+msgid "Italian translation"
+msgstr "イタリア語への翻訳"
+
+#: ../src/gui/application/main.cpp:440 ../src/gui/application/main.cpp:441
+msgid "Swedish translation"
+msgstr "スウェーデン語への翻訳"
+
+#: ../src/gui/application/main.cpp:442
+msgid "Estonian translation"
+msgstr "エストニア語への翻訳"
+
+#: ../src/gui/application/main.cpp:443 ../src/gui/application/main.cpp:444
+msgid "Dutch translation"
+msgstr "オランダ語への翻訳"
+
+#: ../src/gui/application/main.cpp:445
+msgid "HSpinBox class"
+msgstr "HSpinBox class"
+
+#: ../src/gui/application/main.cpp:446
+msgid "Transposition by interval"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:447
+msgid "Original designs for rotary controllers"
+msgstr "ロータリーコントローラのオリジナルデザイン"
+
+#: ../src/gui/application/main.cpp:448
+msgid "Japanese translation"
+msgstr "日本語への翻訳"
+
+#: ../src/gui/application/main.cpp:449
+msgid ""
+"Auto-scroll deceleration\n"
+"Rests outside staves and other bug fixes"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:450
+msgid "Simplified Chinese translation"
+msgstr "簡体字への翻訳"
+
+#: ../src/gui/application/main.cpp:451
+msgid "LIRC infrared remote-controller support"
+msgstr "LIRC赤外線リモートコントローラサポート"
+
+#: ../src/gui/application/main.cpp:452
+msgid "MTC slave timing implementation"
+msgstr "MTC slave timingの実装"
+
+#: ../src/gui/application/main.cpp:453
+msgid "Czech translation"
+msgstr "チェコ語への翻訳"
+
+#: ../src/gui/application/main.cpp:454
+msgid "SCons/bksys building system"
+msgstr "SCons/bksys構築システム"
+
+#: ../src/gui/application/main.cpp:455
+msgid "icons, icons, icons"
+msgstr "icons, icons, icons"
+
+#: ../src/gui/application/main.cpp:456 ../src/gui/application/main.cpp:457
+#: ../src/gui/application/main.cpp:458 ../src/gui/application/main.cpp:459
+msgid "Spanish translation"
+msgstr "スペイン語への翻訳"
+
+#: ../src/gui/application/main.cpp:460 ../src/gui/application/main.cpp:461
+msgid "Catalan translation"
+msgstr "カタロニア語への翻訳"
+
+#: ../src/gui/application/main.cpp:462
+msgid ""
+"1.2.3 splash screen photo\n"
+"Gave birth to D. Michael McIntyre, bought him a good flute once\n"
+"upon a time, and always humored him when he came over to play her\n"
+"some new instrument, even though she really hated his playing.\n"
+"Born October 19, 1951, died September 21, 2007, R. I. P."
+msgstr ""
+"1.2.3 起動画面の写真\n"
+"Gave birth to D. Michael McIntyre, bought him a good flute once\n"
+"upon a time, and always humored him when he came over to play her\n"
+"some new instrument, even though she really hated his playing.\n"
+"Born October 19, 1951, died September 21, 2007, R. I. P."
+
+#: ../src/gui/application/main.cpp:463
+msgid "Initial guitar chord editing code"
+msgstr "初期ギターコード編集コード"
+
+#: ../src/gui/application/main.cpp:464
+msgid "Polish translation"
+msgstr "ポーランド語への翻訳"
+
+#: ../src/gui/application/main.cpp:465
+msgid "Basque translation"
+msgstr "バスク語への翻訳"
+
+#: ../src/gui/application/main.cpp:466
+msgid "Klearlook theme"
+msgstr "Klearlook テーマ"
+
+#: ../src/_translatorinfo.cpp:1 ../src/gui/application/main.cpp:468
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr "Oota Toshiya"
+
+#: ../src/_translatorinfo.cpp:3 ../src/gui/application/main.cpp:468
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+
+#: ../src/gui/application/main.cpp:719
+msgid "Welcome!"
+msgstr "ようこそ!"
+
+#: ../src/gui/application/main.cpp:731
+msgid ""
+"<h2>Welcome to Rosegarden!</h2><p>Welcome to the Rosegarden audio and MIDI "
+"sequencer and musical notation editor.</p><ul><li>If you have not already "
+"done so, you may wish to install some DSSI synth plugins, or a separate "
+"synth program such as QSynth. Rosegarden does not synthesize sounds from "
+"MIDI on its own, so without these you will hear nothing.</"
+"li><br><br><li>Rosegarden uses the JACK audio server for recording and "
+"playback of audio, and for playback from DSSI synth plugins. These features "
+"will only be available if the JACK server is running.</"
+"li><br><br><li>Rosegarden has comprehensive documentation: see the Help menu "
+"for the handbook, tutorials, and other information!</li></ul><p>Rosegarden "
+"was brought to you by a team of volunteers across the world. To learn more, "
+"go to <a href=\"http://www.rosegardenmusic.com/\">http://www.rosegardenmusic."
+"com/</a>.</p>"
+msgstr ""
+"<h2>Rosegardenへようこそ!</h2><p>Rosegarden オーディオとMIDIシーケンサと楽譜"
+"エディタへようこそ。</p><ul><li>If you have not already done so, you may "
+"wish to install some DSSI synth plugins, or a separate synth program such as "
+"QSynth. Rosegarden does not synthesize sounds from MIDI on its own, so "
+"without these you will hear nothing.</li><br><br><li>Rosegarden uses the "
+"JACK audio server for recording and playback of audio, and for playback from "
+"DSSI synth plugins. These features will only be available if the JACK "
+"server is running.</li><br><br><li>Rosegarden has comprehensive "
+"documentation: see the Help menu for the handbook, tutorials, and other "
+"information!</li></ul><p>Rosegarden was brought to you by a team of "
+"volunteers across the world. To learn more, go to <a href=\"http://www."
+"rosegardenmusic.com/\">http://www.rosegardenmusic.com/</a>.</p>"
+
+#: ../src/gui/application/RosegardenGUIView.cpp:257
+msgid "No non-audio segments in composition"
+msgstr "コンポジション中に非オーディオセグメントが1つもない"
+
+#: ../src/gui/application/RosegardenGUIView.cpp:333
+msgid "Selection must contain only audio or non-audio segments"
+msgstr "オーディオまたは非オーディオセグメントのみ選択してください"
+
+#: ../src/gui/application/RosegardenGUIView.cpp:431
+#: ../src/gui/application/RosegardenGUIView.cpp:576
+#: ../src/gui/application/RosegardenGUIView.cpp:612
+#: ../src/gui/application/RosegardenGUIView.cpp:776
+msgid "No non-audio segments selected"
+msgstr "非オーディオセグメントが選択されていません"
+
+#: ../src/gui/application/RosegardenGUIView.cpp:851
+msgid ""
+"You've not yet defined an audio editor for Rosegarden to use.\n"
+"See Settings -> Configure Rosegarden -> Audio."
+msgstr ""
+"Rosegardenが使うオーディオエディタを設定していません。\n"
+"設定 -> Rosegardenの設定 -> オーディオ を参照してください。"
+
+#: ../src/gui/application/RosegardenGUIView.cpp:1559
+#: ../src/gui/application/RosegardenGUIView.cpp:1564
+msgid "Can't add dropped file. "
+msgstr "ドロップされたファイルを追加できない"
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1014
+#: ../src/gui/seqmanager/SequenceManager.cpp:1150
+msgid ""
+"The JACK Audio subsystem has failed or it has stopped Rosegarden from "
+"processing audio.\n"
+"Please restart Rosegarden to continue working with audio.\n"
+"Quitting other running applications may improve Rosegarden's performance."
+msgstr ""
+"JACKオーディオサーバが不正な動作もしくは止まっています。\n"
+"オーディオ処理を続けるにはRosegardenを再起動してください。\n"
+"他のアプリケーションを終了させるとRosegardenのパフォーマンスは向上すると思わ"
+"れます。"
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1020
+#: ../src/gui/seqmanager/SequenceManager.cpp:1156
+msgid ""
+"The JACK Audio subsystem has stopped Rosegarden from processing audio, "
+"probably because of a processing overload.\n"
+"An attempt to restart the audio service has been made, but some problems may "
+"remain.\n"
+"Quitting other running applications may improve Rosegarden's performance."
+msgstr ""
+"高負荷によりRosegardenはJACKオーディオサーバを停止しました。\n"
+"オーディオシステムを再スタートさせたので若干問題が残るかもしれません。\n"
+"他のアプリケーションを終了させるとRosegardenのパフォーマンスは向上すると思わ"
+"れます。"
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1031
+msgid ""
+"Run out of processor power for real-time audio processing. Cannot continue."
+msgstr ""
+"リアルタイムオーディオ処理に必要な処理能力を使いきりました。続けることはでき"
+"ません。"
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1057
+msgid ""
+"A serious error has occurred in the ALSA MIDI subsystem. It may not be "
+"possible to continue sequencing. Please check console output for more "
+"information."
+msgstr ""
+"ALSA MIDIサブシステムに深刻なエラーが発生しました。シーケンサーは処理を続ける"
+"ことは不可能です。詳細についてはコンソール出力を参照してください。"
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1078
+msgid "JACK Audio subsystem is losing sample frames."
+msgstr "JACK オーディオサブシステムはサンプルフレームを失いました。"
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1096
+msgid ""
+"Failed to read audio data from disc in time to service the audio subsystem."
+msgstr ""
+"オーディオサブシステムに提供するために、オーディオデータをディスクから時間内"
+"に読み出せなかった。"
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1100
+msgid ""
+"Failed to write audio data to disc fast enough to service the audio "
+"subsystem."
+msgstr ""
+"オーディオサブシステムに提供するために、オーディオデータをディスクに書くのに"
+"十分な時間がなくて失敗した。"
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1104
+msgid "The audio mixing subsystem is failing to keep up."
+msgstr "オーディオミキシングサブシステムが起動に失敗した。"
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1108
+msgid "The audio subsystem is failing to keep up."
+msgstr "オーディオサブシステムが起動に失敗した。"
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1112
+msgid "Unknown sequencer failure mode!"
+msgstr "不明なシーケンサ失敗モード!"
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1170
+msgid ""
+"<h3>System timer resolution is too low</h3><p>Rosegarden was unable to find "
+"a high-resolution timing source for MIDI performance.</p><p>This may mean "
+"you are using a Linux system with the kernel timer resolution set too low. "
+"Please contact your Linux distributor for more information.</p><p>Some Linux "
+"distributors already provide low latency kernels, see <a href=\"http://"
+"rosegarden.wiki.sourceforge.net/Low+latency+kernels\">http://rosegarden.wiki."
+"sourceforge.net/Low+latency+kernels</a> for instructions.</p>"
+msgstr ""
+"<h3>システムタイマ分解能が低すぎます</h3><p>RosegardeはMIDIパフォーマンスのた"
+"めの高分解能タイマを見つけられませんでした。</p><p>これはLinuxシステムのカー"
+"ネルタイマ分解能が低く抑えられて使っていることを意味します。</p><p>詳しい情報"
+"についてはLinuxディストリビュータにお尋ねください。</p> <P>いくつかのLinux"
+"ディストリビュータはすでに低レイテンシカーネルを 提供しています。指定するため"
+"に、<a href=\"http://rosegarden.wiki.sourceforge.net/Low+latency+kernels"
+"\">http://rosegarden.wiki.sourceforge.net/Low+latency+kernels</a> を参照して"
+"ください</P>"
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1188
+msgid ""
+"<h3>System timer resolution is too low</h3><p>Rosegarden was unable to find "
+"a high-resolution timing source for MIDI performance.</p><p>You may be able "
+"to solve this problem by loading the RTC timer kernel module. To do this, "
+"try running <b>sudo modprobe snd-rtctimer</b> in a terminal window and then "
+"restarting Rosegarden.</p><p>Alternatively, check whether your Linux "
+"distributor provides a multimedia-optimized kernel. See <a href=\"http://"
+"rosegarden.wiki.sourceforge.net/Low+latency+kernels\">http://rosegarden.wiki."
+"sourceforge.net/Low+latency+kernels</a> for notes about this.</p>"
+msgstr ""
+"<h3>システムタイマ分解能が低すぎます</h3><p>RosegardeはMIDIパフォーマンスのた"
+"めの高分解能タイマを見つけられませんでした。</p><p>この問題を 解決するため"
+"に、RTIタイマカーネルモジュールをロードすることができま す。これを行うために"
+"は、ターミナルウィンドウ内で、 <b>sudo modprobe snd-rtctimer</b>を走らせるこ"
+"とを試み、 Rosegardenを再起動してください。</P><P>代わりに、Linux ディストリ"
+"ビュータがマルチメディアに特化したカーネルを提供している かを調べてください。"
+"このことについての注意は、<a href=\"http://rosegarden.wiki.sourceforge.net/"
+"Low+latency+kernels\">http://rosegarden.wiki.sourceforge.net/Low+latency"
+"+kernels</a>を参照してください。</P>"
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1312
+msgid ""
+"<p>Both MIDI and Audio subsystems have failed to initialize.</p><p>You may "
+"continue without the sequencer, but we suggest closing Rosegarden, running "
+"\"alsaconf\" as root, and starting Rosegarden again. If you wish to run "
+"with no sequencer by design, then use \"rosegarden --nosequencer\" to avoid "
+"seeing this error in the future.</p>"
+msgstr ""
+"<p>MIDI, オーディオどちらのサブシステムの初期化に失敗しました。</p><p>このま"
+"まシーケンサなしで続けることもできますが、一度Rosegardenを終了しrootユーザー"
+"で \"alsaconf\" を実行してからRosegardenを起動することをお勧めします。もし"
+"シーケンサなしで使いたいのであるなら \"rosegarden --nosequencer\" と実行すれ"
+"ばこのエラーは表示されません。</p>"
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1314
+msgid ""
+"<p>The MIDI subsystem has failed to initialize.</p><p>You may continue "
+"without the sequencer, but we suggest closing Rosegarden, running \"modprobe "
+"snd-seq-midi\" as root, and starting Rosegarden again. If you wish to run "
+"with no sequencer by design, then use \"rosegarden --nosequencer\" to avoid "
+"seeing this error in the future.</p>"
+msgstr ""
+"MIDIサブシステムの初期化に失敗しました。\n"
+"このままシーケンサなしで使いつづけることもできますが、一度Rosegardenを終了し"
+"rootユーザーで \"modprobe snd-seq-midi\" と実行してから、Rosegardenを起動する"
+"ことをお勧めします。もしシーケンサなしで使いたいのであれば \"rosegarden --"
+"nosequencer\" と実行すると、このエラーは表示されません。"
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1316
+msgid ""
+"<p>The Rosegarden sequencer module version does not match the GUI module "
+"version.</p><p>You have probably mixed up files from two different versions "
+"of Rosegarden. Please check your installation.</p>"
+msgstr ""
+"<p>RosegardenのシーケンサモジュールとGUIモジュールのバージョンが合っていませ"
+"ん。</p><p>異なるバージョンのRosegardenを混ぜて使っていませんか?インストール"
+"方法を確認してください。<p>"
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1322
+#, c-format
+msgid "<h3>Sequencer startup failed</h3>%1"
+msgstr "<h3>シーケンサの起動に失敗しました</h3>%1"
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1330
+msgid ""
+"<h3>Failed to connect to JACK audio server.</h3><p>Rosegarden could not "
+"connect to the JACK audio server. This probably means the JACK server is "
+"not running.</p><p>If you want to be able to play or record audio files or "
+"use plugins, you should exit Rosegarden and start the JACK server before "
+"running Rosegarden again.</p>"
+msgstr ""
+"<h3>JACKオーディオサーバの接続に失敗しました</h3><p>RosegardenはJACKオーディ"
+"オサーバに接続できませんでした。これはJACKサーバが起動していないことを意味し"
+"ます。</p><p>もしあなたがオーディオファイルの再生や録音、プラグインを使うなら"
+"一度Rosegardenを終了しJACKサーバを起動してからRosegardenを起動してください。"
+"</p>"
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1331
+msgid "Failed to connect to JACK"
+msgstr "JACKの接続に失敗"
+
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:46
+msgid "Modify MIDI filters..."
+msgstr "MIDIフィルタの変更..."
+
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:58
+msgid "THRU events to ignore"
+msgstr "THRU eventsを無視"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:131
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:60
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:96
+msgid "Note"
+msgstr "Note"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:132
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:61
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:97
+msgid "Program Change"
+msgstr "Program Change"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:136
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:62
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:98
+msgid "Key Pressure"
+msgstr "Key Pressure"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:137
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:63
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:99
+msgid "Channel Pressure"
+msgstr "Channel Pressure"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:134
+#: ../src/gui/general/EditView.cpp:899
+#: ../src/gui/rulers/ControllerEventsRuler.cpp:198
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:64
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:100
+msgid "Pitch Bend"
+msgstr "Pitch Bend"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:133
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:65
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:101
+msgid "Controller"
+msgstr "Controller"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:135
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:66
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:102
+msgid "System Exclusive"
+msgstr "System Exclusive"
+
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:94
+msgid "RECORD events to ignore"
+msgstr "録音時に無視するイベント"
+
+#: ../src/gui/widgets/TimeWidget.cpp:101
+msgid "Note:"
+msgstr "音符:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:108 ../src/gui/widgets/TimeWidget.cpp:145
+msgid "<inexact>"
+msgstr "<inexact>"
+
+#: ../src/gui/widgets/TimeWidget.cpp:151
+msgid "Units:"
+msgstr "ユニット:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:173
+msgid "Time:"
+msgstr "時間:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:184
+msgid "units"
+msgstr "ユニット"
+
+#: ../src/gui/widgets/TimeWidget.cpp:193
+msgid "Measures:"
+msgstr "小節:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:193
+msgid "Measure:"
+msgstr "小節:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:212
+msgid "beats:"
+msgstr "拍:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:212
+msgid "beat:"
+msgstr "拍:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:230
+msgid "%1:"
+msgstr "%1:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:254
+msgid "Seconds:"
+msgstr "秒:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:273
+msgid "msec:"
+msgstr "ミリ秒:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:407 ../src/gui/widgets/TimeWidget.cpp:531
+msgid "(%1/%2 time)"
+msgstr "(%1/%2 時間)"
+
+#: ../src/gui/widgets/TimeWidget.cpp:452
+msgid "(starting %1.%2 qpm, %2.%3 bpm)"
+msgstr "(%1.%2 qpm, %2.%3 bpmで開始)"
+
+#: ../src/gui/widgets/TimeWidget.cpp:458
+msgid "(starting %1.%2 bpm)"
+msgstr "(%1.%2 bpmで開始)"
+
+#: ../src/gui/widgets/TimeWidget.cpp:464
+msgid "(%1.%2 qpm, %2.%3 bpm)"
+msgstr "(%1.%2 qpm, %2.%3 bpm)"
+
+#: ../src/gui/widgets/TimeWidget.cpp:470
+msgid "(%1.%2 bpm)"
+msgstr "(%1.%2 bpm)"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:239
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:60
+msgid "C"
+msgstr "C"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:241
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:61
+msgid "D"
+msgstr "D"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:243
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:62
+msgid "E"
+msgstr "E"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:244
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:63
+msgid "F"
+msgstr "F"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:246
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:64
+msgid "G"
+msgstr "G"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:248
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:65
+msgid "A"
+msgstr "A"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:250
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:66
+msgid "B"
+msgstr "B"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:70
+msgid "-2"
+msgstr "-2"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:71
+msgid "-1"
+msgstr "-1"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:72
+msgid "0"
+msgstr "0"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:73
+msgid "1"
+msgstr "1"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:74
+msgid "2"
+msgstr "2"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:75
+msgid "3"
+msgstr "3"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:76
+msgid "4"
+msgstr "4"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:77
+msgid "5"
+msgstr "5"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:78
+msgid "6"
+msgstr "6"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:79
+msgid "7"
+msgstr "7"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:83
+msgid "double flat"
+msgstr "♭♭"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:84
+msgid "flat"
+msgstr "♭"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:85
+msgid "natural"
+msgstr "ナチュラル"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:86
+msgid "sharp"
+msgstr "#"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:87
+msgid "double sharp"
+msgstr "♯♯"
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:234
+#, c-format
+msgid "In %1"
+msgstr "In %1"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:587
+#: ../src/gui/widgets/AudioRouteMenu.cpp:236
+#: ../src/gui/widgets/AudioRouteMenu.cpp:259
+msgid "Master"
+msgstr "マスター"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:528
+#: ../src/gui/widgets/AudioRouteMenu.cpp:238
+#: ../src/gui/widgets/AudioRouteMenu.cpp:261
+#, c-format
+msgid "Sub %1"
+msgstr "副 %1"
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:244
+msgid "In %1 R"
+msgstr "In %1 R"
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:245
+msgid "In %1 L"
+msgstr "In %1 L"
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:247
+msgid "Master R"
+msgstr "マスタ R"
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:248
+msgid "Master L"
+msgstr "マスタ L"
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:250
+msgid "Sub %1 R"
+msgstr "副 %1 R"
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:251
+msgid "Sub %1 L"
+msgstr "副 %1 L"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:391
+#: ../src/gui/studio/AudioMixerWindow.cpp:522
+#: ../src/gui/widgets/AudioFaderBox.cpp:82
+msgid "Audio plugin button"
+msgstr "オーディオプラグインボタン"
+
+#: ../src/gui/editors/parameters/AudioInstrumentParameterPanel.cpp:129
+#: ../src/gui/editors/parameters/AudioInstrumentParameterPanel.cpp:357
+#: ../src/gui/widgets/AudioFaderBox.cpp:91
+msgid "<no synth>"
+msgstr "<シンセサイザー無し>"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:93
+msgid "Synth plugin button"
+msgstr "シンセサイザープラグインボタン"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:153
+msgid "Set the audio pan position in the stereo field"
+msgstr "ステレオのパンの位置をセット"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:155
+msgid "Open synth plugin's native editor"
+msgstr "シンセサイザープラグイン用のネイティブエディタをオープン"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:157
+msgid "Mono or Stereo Instrument"
+msgstr "モノ/ステレオインストゥルメント"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:159
+msgid "Record level"
+msgstr "録音レベル"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:161
+msgid "Playback level"
+msgstr "再生レベル"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:345
+#: ../src/gui/studio/AudioMixerWindow.cpp:347
+#: ../src/gui/studio/AudioMixerWindow.cpp:503
+#: ../src/gui/studio/AudioMixerWindow.cpp:505
+#: ../src/gui/widgets/AudioFaderBox.cpp:163
+msgid "Audio level"
+msgstr "オーディオレベル"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:170
+msgid "In:"
+msgstr "In:"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:173
+msgid "Out:"
+msgstr "Out:"
+
+#: ../src/gui/widgets/ProgressDialog.cpp:48
+#: ../src/gui/widgets/ProgressDialog.cpp:53
+#: ../src/gui/widgets/ProgressDialog.cpp:76
+msgid "Processing..."
+msgstr "処理中..."
+
+#: ../src/gui/configuration/ColourConfigurationPage.h:60
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:130
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:346
+#: ../src/gui/widgets/ColourTable.cpp:52
+msgid "Color"
+msgstr "カラー"
+
+#: ../src/gui/widgets/ColourTable.cpp:68
+msgid "Modify Color Name"
+msgstr "カラー変更"
+
+#: ../src/gui/configuration/ColourConfigurationPage.cpp:129
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:983
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:882
+#: ../src/gui/widgets/ColourTable.cpp:68
+msgid "Enter new name"
+msgstr "名前を入力"
+
+#: ../src/gui/widgets/ColourTable.cpp:107
+msgid "Default Color"
+msgstr "デフォルトカラー"
+
+#: ../src/gui/widgets/Rotary.cpp:108
+msgid ""
+"Click and drag up and down or left and right to modify.\n"
+"Double click to edit value directly."
+msgstr ""
+"ドラッグしながら上下左右で変更\n"
+"ダブルクリックで直接入力"
+
+#: ../src/gui/widgets/Rotary.cpp:433
+msgid "Select a new value"
+msgstr "数値の入力"
+
+#: ../src/gui/widgets/Rotary.cpp:434
+msgid "Enter a new value"
+msgstr "数値を入力"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:80
+msgid "Quantizer"
+msgstr "クォンタイザ"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:86
+msgid "Quantizer type:"
+msgstr "クォンタイザの種類:"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:88
+msgid "Grid quantizer"
+msgstr "グリッドにクオンタイズ"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:89
+msgid "Legato quantizer"
+msgstr "レガートクォンタイザ"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:90
+msgid "Heuristic notation quantizer"
+msgstr "ヒューリスティック音符クォンタイザ"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:94
+msgid "Quantize for notation only (leave performance unchanged)"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:104
+msgid "Notation parameters"
+msgstr "ノーテーションパラメータ"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:109
+#: ../src/gui/widgets/QuantizeParameters.cpp:150
+msgid "Base grid unit:"
+msgstr "ベースグリッドユニット:"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:114
+msgid "Complexity:"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:118
+msgid "Very high"
+msgstr "特高"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:119
+msgid "High"
+msgstr "高"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:224
+#: ../src/gui/widgets/QuantizeParameters.cpp:120
+msgid "Normal"
+msgstr "通常"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:121
+msgid "Low"
+msgstr "低"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:122
+msgid "Very low"
+msgstr "超低"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:125
+msgid "Tuplet level:"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:129
+msgid "2-in-the-time-of-3"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:4241
+#: ../src/gui/widgets/QuantizeParameters.cpp:130
+msgid "Triplet"
+msgstr "三連符"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:138
+msgid "Any"
+msgstr "任意の"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:141
+msgid "Permit counterpoint"
+msgstr "カウンタ位置を許可"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:145
+msgid "Grid parameters"
+msgstr "グリッドパラメータ"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:154
+msgid "Swing:"
+msgstr "スィング:"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:159
+msgid "Iterative amount:"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:165
+msgid "Quantize durations as well as start times"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:169
+msgid "After quantization"
+msgstr "クォンタイズ後"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:183
+msgid "Show advanced options"
+msgstr "詳細オプションの表示"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:192
+msgid "Re-beam"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:194
+msgid "Add articulations (staccato, tenuto, slurs)"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:195
+msgid "Tie notes at barlines etc"
+msgstr "小節線で音符をタイでつなげるなど"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:196
+msgid "Split-and-tie overlapping chords"
+msgstr "和音上の音符を分割してタイでつなぐ"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:307
+msgid "Full quantize"
+msgstr "完全クォンタイズ"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:450
+msgid "Show Advanced Options"
+msgstr "拡張オプションの表示"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:454
+msgid "Hide Advanced Options"
+msgstr "拡張オプションを隠す"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:257
+#: ../src/gui/configuration/MatrixConfigurationPage.h:56
+#: ../src/gui/configuration/MatrixConfigurationPage.h:57
+#: ../src/gui/editors/matrix/MatrixView.cpp:2709
+msgid "Matrix"
+msgstr "マトリクス"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:64
+msgid "Printable headers"
+msgstr "印刷可能ヘッダ"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:92
+msgid "Dedication"
+msgstr "Dedication"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:96
+#: ../src/gui/editors/segment/PlayListView.cpp:35
+msgid "Title"
+msgstr "題名"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:100
+msgid "Subtitle"
+msgstr "副題名"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:104
+msgid "Subsubtitle"
+msgstr "副副題名"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:108
+msgid "Poet"
+msgstr "Poet"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:116
+msgid "Composer"
+msgstr "作曲者"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:120
+msgid "Meter"
+msgstr "Meter"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:124
+msgid "Arranger"
+msgstr "編曲者"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:128
+msgid "Piece"
+msgstr "ピース"
+
+#: ../data/fonts/mappings/fonts.cpp:26
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:132
+msgid "Opus"
+msgstr "Opus"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:136
+msgid "Copyright"
+msgstr "Copyright"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:140
+msgid "Tagline"
+msgstr "タグ行"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:155
+msgid "The composition comes here."
+msgstr "コンポジションがここに来ます"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:172
+msgid "Non-printable headers"
+msgstr "印刷不能ヘッダ"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:213
+msgid "Add New Property"
+msgstr "新しいプロパティを追加"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:217
+msgid "Delete Property"
+msgstr "プロパティを削除"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:236
+msgid "{new property %1}"
+msgstr "{新しいプロパティ%1}"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:236
+msgid "{new property}"
+msgstr "{新しいプロパティ}"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:243
+msgid "{undefined}"
+msgstr "{未定義}"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:87
+msgid "Double-click opens segment in"
+msgstr "ダブルクリックでセグメントをオープン "
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:91
+msgid "Notation editor"
+msgstr "譜面エディタ"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:92
+msgid "Matrix editor"
+msgstr "マトリクスエディタ"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:93
+msgid "Event List editor"
+msgstr "イベントリストエディタ"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:99
+msgid "Number of count-in measures when recording"
+msgstr "録音に入るまでのカウントの拍数"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:109
+msgid "Auto-save interval"
+msgstr "自動セーブの間隔"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:112
+msgid "Every 30 seconds"
+msgstr "30秒毎"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:113
+msgid "Every minute"
+msgstr "1分毎"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:114
+msgid "Every five minutes"
+msgstr "5分毎"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:115
+msgid "Every half an hour"
+msgstr "30分毎"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:116
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:277
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:157
+msgid "Never"
+msgstr "決して"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:140
+msgid "Use JACK transport"
+msgstr "JACKトランスポートを使用"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:173
+msgid "Unknown"
+msgstr "不明"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:179
+msgid "No MIDI, audio OK"
+msgstr "MIDI無効, オーディオ有効"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:182
+msgid "MIDI OK, no audio"
+msgstr "MIDI有効, オーディオ無効"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:185
+msgid "MIDI OK, audio OK"
+msgstr "MIDI, オーディオ有効"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:188
+msgid "No driver"
+msgstr "ドライバ無し"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:195
+msgid "Details..."
+msgstr "詳細..."
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:204
+msgid "Behavior"
+msgstr "振る舞い"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:219
+msgid "Side-bar parameter box layout"
+msgstr "サイドバーパラメータのレイアウト"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:223
+msgid "Vertically stacked"
+msgstr "縦に積み上げ"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:225
+msgid "Tabbed"
+msgstr "タブ"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:233
+msgid "Note name style"
+msgstr "音符名スタイル"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:237
+msgid "Always use US names (e.g. quarter, 8th)"
+msgstr "英語名を使う(例: quater,8th)"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:238
+msgid "Localized (where available)"
+msgstr "ローカライズ(有効な所)"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:252
+msgid "Show textured background on"
+msgstr "キャンバスエリアの背景にテクスチャを使う"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:254
+msgid "Main window"
+msgstr "メインウィンドウ"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:275
+msgid "Use bundled Klearlook theme"
+msgstr "バンドルされているKlearlookテーマ"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:278
+msgid "When not running under KDE"
+msgstr "KDE配下で動いていないとき"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:279
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:159
+msgid "Always"
+msgstr "常時"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:287
+msgid "Presentation"
+msgstr "プレゼンテーション"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:423
+msgid ""
+"Changes to the textured background in the main window will not take effect "
+"until you restart Rosegarden."
+msgstr ""
+"Rosegardenを再起動するまでメインウィンドウ背景のテクスチャは変更されません。"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:168
+#: ../src/gui/configuration/GeneralConfigurationPage.h:78
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:207
+#: ../src/gui/configuration/MatrixConfigurationPage.cpp:59
+msgid "General"
+msgstr "一般"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.h:79
+msgid "General Configuration"
+msgstr "一般の設定"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:92
+msgid "Base octave number for MIDI pitch display"
+msgstr "MIDIピッチのベースオクターブナンバを表示"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:107
+msgid "Always use default studio when loading files"
+msgstr "ファイルをロードするときデフォルトのスタジオを使う"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:119
+msgid "Send all MIDI Controllers at start of each playback"
+msgstr "おのおのの再生開始時にすべてのMIDIコントローラに送ります"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:121
+msgid ""
+"Rosegarden can send all MIDI Controllers (Pan, Reverb etc) to all MIDI "
+"devices every\n"
+"time you hit play if you so wish. Please note that this option will usually "
+"incur a\n"
+"delay at the start of playback due to the amount of data being transmitted."
+msgstr ""
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:138
+msgid "Sequencer timing source"
+msgstr "シーケンサタイミングのソース"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:163
+msgid "Load SoundFont to SoundBlaster card at startup"
+msgstr "起動時にSoundBlastarカードにフォントをロード"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:164
+msgid ""
+"Check this box to enable soundfont loading on EMU10K-based cards when "
+"Rosegarden is launched"
+msgstr ""
+"Rosegardenの起動時にEMU10Kベースのカード上にサウンドフォントをロードします。"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:173
+msgid "Path to 'asfxload' or 'sfxload' command"
+msgstr "'asfload'又は'sfxload'コマンドのパス"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:180
+msgid "SoundFont"
+msgstr "サウンドフォント"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:223
+msgid "MIDI Clock and System messages"
+msgstr "MIDIクロックとシステムメッセージ"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:229
+msgid "Send MIDI Clock, Start and Stop"
+msgstr "MIDIクロック, スタート, ストップを送信"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:230
+msgid "Accept Start, Stop and Continue"
+msgstr "スタート, ストップ, コンティニューを許可"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:241
+msgid "MIDI Machine Control mode"
+msgstr "MIDIマシンコントロールモード"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:248
+msgid "MMC Master"
+msgstr "MMCマスタ"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:249
+msgid "MMC Slave"
+msgstr "MMCスレーブ"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:260
+msgid "MIDI Time Code mode"
+msgstr "MIDIタイムコードモード"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:267
+msgid "MTC Master"
+msgstr "MTCマスタ"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:268
+msgid "MTC Slave"
+msgstr "MTCスレーブ"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:281
+msgid "Automatically connect sync output to all devices in use"
+msgstr "同期出力を使用中のすべてのデバイスに自動的に接続"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:292
+msgid "MIDI Sync"
+msgstr "MIDI同期"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:308
+msgid "sfxload path"
+msgstr "sfxload パス"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:315
+msgid "Soundfont path"
+msgstr "サウンドフォントパス"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:67
+msgid "%1 minutes %2.%3%4 seconds (%5 units, %6 measures)"
+msgstr "%1 分 %2.%3%4 秒 (%5 ユニット, %6 measures)"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:133
+msgid "Filename:"
+msgstr "ファイル名:"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:136
+msgid "Formal duration (to end marker):"
+msgstr ""
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:141
+msgid "Playing duration:"
+msgstr ""
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:146
+msgid "Tracks:"
+msgstr "トラック:"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:147
+msgid "%1 used, %2 total"
+msgstr "%1 使用,全部で %2"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:152
+msgid "Segments:"
+msgstr "セグメント:"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:153
+msgid "%1 MIDI, %2 audio, %3 total"
+msgstr "%1 MIDI,%2 オーディオ,全部で %3"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:161
+msgid "Statistics"
+msgstr "統計"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:170
+#: ../src/gui/editors/parameters/InstrumentParameterBox.cpp:155
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:92
+msgid "Track"
+msgstr "トラック"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:171
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:125
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:90
+msgid "Label"
+msgstr "ラベル"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:172
+msgid "Time"
+msgstr "時間"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:174
+msgid "Events"
+msgstr "イベント"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:175
+msgid "Polyphony"
+msgstr "ポリフォニー"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:176
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:126
+msgid "Repeat"
+msgstr "リピート"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:178
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:128
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:305
+#: ../src/gui/general/EditView.cpp:1488
+msgid "Transpose"
+msgstr "トランスポーズ"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:179
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:129
+msgid "Delay"
+msgstr "ディレイ"
+
+#: ../src/gui/configuration/AudioConfigurationPage.h:61
+#: ../src/gui/configuration/AudioPropertiesPage.h:58
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:204
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:523
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:524
+msgid "Audio"
+msgstr "オーディオ"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:204
+#: ../src/gui/configuration/MIDIConfigurationPage.h:62
+msgid "MIDI"
+msgstr "MIDI"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:317
+msgid "Segment Summary"
+msgstr "セグメントサマリ"
+
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:63
+msgid "Audio file path:"
+msgstr "オーディオファイルパス:"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:137
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:68
+msgid "Choose..."
+msgstr "選択..."
+
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:73
+msgid "Disk space remaining:"
+msgstr "ディスクスペースの残り:"
+
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:78
+msgid "Equivalent minutes of 16-bit stereo:"
+msgstr "16ビットステレオの時分と同一:"
+
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:90
+msgid "Modify audio path"
+msgstr "audioパスの変更"
+
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:113
+msgid "%1 out of %2 (%3% used)"
+msgstr "%1 out of %2 (%3% 使用)"
+
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:144
+msgid "minutes at"
+msgstr ""
+
+#: ../src/gui/configuration/MIDIConfigurationPage.h:63
+msgid "MIDI Settings"
+msgstr "MIDIの設定"
+
+#: ../src/gui/configuration/AudioConfigurationPage.h:62
+#: ../src/gui/configuration/AudioPropertiesPage.h:59
+msgid "Audio Settings"
+msgstr "オーディオの設定"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:87
+msgid "Default layout mode"
+msgstr "デフォルトレイアウトモード"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:91
+msgid "Linear layout"
+msgstr "リニアレイアウト"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:92
+msgid "Continuous page layout"
+msgstr "連続ページレイアウト"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:93
+msgid "Multiple page layout"
+msgstr "複数ページレイアウト"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:101
+msgid "Default spacing"
+msgstr "既定値の間隔"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:125
+msgid "Default duration factor"
+msgstr "規定値のデュレーションファクタ"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:141
+msgid "Full"
+msgstr "全部(Full)"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:152
+msgid "Show track headers (linear layout only)"
+msgstr "トラックヘッダの表示(リニアレイアウトのみ)"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:158
+msgid "When needed"
+msgstr "必要なとき"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:166
+msgid ""
+"\"Always\" and \"Never\" mean what they usually mean\n"
+"\"When needed\" means \"when staves are too many to all fit in the current "
+"window\""
+msgstr ""
+"\"全て\" と \"決して\"は通常使っている意味と同じ意味\n"
+"\"When needed\" means \"when staves are too many to all fit in the current "
+"window\""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:178
+msgid "Show non-notation events as question marks"
+msgstr "非ノーテーションイベントを?で表示"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:188
+msgid "Show notation-quantized notes in a different color"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:198
+msgid "Show \"invisible\" events in grey"
+msgstr "\"見えない\"イベントを灰色で表示"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:208
+msgid "Show notes outside suggested playable range in red"
+msgstr "推奨される演奏可能な範囲外の音符は赤で表示されます。"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:218
+msgid "Highlight superimposed notes with a halo effect"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:231
+msgid "When recording MIDI, split-and-tie long notes at barlines"
+msgstr "MIDIを録音中、小節線で長い音は分割され、タイで結ばれます。"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:242
+msgid "Layout"
+msgstr "レイアウト"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:255
+msgid "Default note style for new notes"
+msgstr "新しい音符のための規定値の音符スタイル"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:287
+msgid "When inserting notes..."
+msgstr "音符挿入時..."
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:294
+msgid "Split notes into ties to make durations match"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:295
+msgid "Ignore existing durations"
+msgstr "存在するデュレーションを無視"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:305
+msgid "Auto-beam on insert when appropriate"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:317
+#: ../src/gui/editors/notation/NotationEraser.cpp:54
+msgid "Collapse rests after erase"
+msgstr "削除後休符をつなげる"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:328
+msgid "Default paste type"
+msgstr "既定の貼り付けタイプ"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:350
+msgid "Editing"
+msgstr "編集"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:362
+msgid "Accidentals in one octave..."
+msgstr "1つのオクターブ中での臨時記号..."
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:364
+msgid "Affect only that octave"
+msgstr "そのオクターブにのみ反映"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:365
+msgid "Require cautionaries in other octaves"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:366
+msgid "Affect all subsequent octaves"
+msgstr "その後の全てのオクターブに影響"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:374
+msgid "Accidentals in one bar..."
+msgstr "1つの小節内での臨時記号..."
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:376
+msgid "Affect only that bar"
+msgstr "その小節のみ影響"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:377
+msgid "Require cautionary resets in following bar"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:378
+msgid "Require explicit resets in following bar"
+msgstr "継続する小節中で明示的なリセットが必要"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:386
+msgid "Key signature cancellation style"
+msgstr "調号キャンセルスタイル"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:388
+msgid "Cancel only when entering C major or A minor"
+msgstr "ハ長調かイ短調を入力するときのみキャンセル"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:389
+msgid "Cancel whenever removing sharps or flats"
+msgstr "#か♭を削除するときは常時キャンセル"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:390
+msgid "Cancel always"
+msgstr "常時キャンセル"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:400
+msgid "Accidentals"
+msgstr "臨時記号"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:441
+msgid "Notation font"
+msgstr "譜面フォント"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:467
+msgid "Origin:"
+msgstr "オリジン:"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:471
+msgid "Copyright:"
+msgstr "著作権:"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:475
+msgid "Mapped by:"
+msgstr "右記でマップされる:"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:479
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:81
+msgid "Type:"
+msgstr "タイプ:"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:508
+msgid "Font size for single-staff views"
+msgstr "単一五線譜表示のためのフォントサイズ"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:516
+msgid "Font size for multi-staff views"
+msgstr "複数五線譜表示のためのフォントサイズ"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:524
+msgid "Font size for printing (pt)"
+msgstr "印刷用のフォントサイズ(pt)"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:541
+msgid "Text font"
+msgstr "テキストフォント"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:549
+msgid "Sans-serif font"
+msgstr "Sans-serif フォント"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:664
+msgid "%1 (smooth)"
+msgstr "%1 (スムース)"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:667
+msgid "%1 (jaggy)"
+msgstr "%1 (ジャギー)"
+
+#: ../src/gui/configuration/LatencyConfigurationPage.cpp:58
+msgid "JACK latency"
+msgstr "JACKレイテンシ"
+
+#: ../src/gui/configuration/LatencyConfigurationPage.cpp:61
+msgid ""
+"Use the \"Fetch JACK latencies\" button to discover the latency values set "
+"at\n"
+"the sequencer. It's recommended that you use the returned values but it's "
+"also\n"
+"possible to override them manually using the sliders. Note that if you "
+"change\n"
+"your JACK server parameters you should always fetch the latency values "
+"again.\n"
+"The latency values will be stored by Rosegarden for use next time."
+msgstr ""
+
+#: ../src/gui/configuration/LatencyConfigurationPage.cpp:65
+msgid "JACK playback latency (in ms)"
+msgstr "JACK再生レイテンシ(ミリ秒)"
+
+#: ../src/gui/configuration/LatencyConfigurationPage.cpp:66
+msgid "JACK record latency (in ms)"
+msgstr "JACK録音レイテンシ(ミリ秒)"
+
+#: ../src/gui/configuration/LatencyConfigurationPage.cpp:68
+msgid "Fetch JACK latencies"
+msgstr "JACKレイテンシの取得"
+
+#: ../src/gui/configuration/LatencyConfigurationPage.cpp:121
+msgid "JACK Latency"
+msgstr "JACKレイテンシ"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:92
+msgid "Audio preview scale"
+msgstr "オーディオプレビューレベル"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:96
+msgid "Linear - easier to see loud peaks"
+msgstr "リニア - ピークが見やすい"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:97
+msgid "Meter scaling - easier to see quiet activity"
+msgstr "メータースケーリング - 静かな部分がわかりやすい"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:105
+msgid "Record audio files as"
+msgstr "録音オーディオファイル:"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:107
+msgid "16-bit PCM WAV format (smaller files)"
+msgstr "16bit PCM WAV フォーマット (小さいファイル)"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:108
+msgid "32-bit float WAV format (higher quality)"
+msgstr "32bit 浮動小数点 WAV フォーマット (高品質)"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:117
+msgid "External audio editor"
+msgstr "外部オーディオエディタ"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:145
+msgid "Create JACK outputs"
+msgstr "JACK出力の生成"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:150
+msgid "for individual audio instruments"
+msgstr "オーディオイントゥルメント単位"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:157
+msgid "for submasters"
+msgstr "サブマスタ用"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:184
+msgid ""
+"Rosegarden can start the JACK audio daemon (jackd) for you automatically if "
+"it isn't already running when Rosegarden starts.\n"
+"\n"
+"This is recommended for beginners and those who use Rosegarden as their main "
+"audio application, but it might not be to the liking of advanced users.\n"
+"\n"
+"If you want to start JACK automatically, make sure the command includes a "
+"full path where necessary as well as any command-line arguments you want to "
+"use.\n"
+"\n"
+"For example: /usr/local/bin/jackd -d alsa -d hw -r44100 -p 2048 -n 2\n"
+"\n"
+msgstr ""
+"Rosegarden起動時にJACKオーディオデーモン (jackd) が起動していなければ自動的に"
+"起動することができます。\n"
+"このオプションはRosegardenを使い始めた初心者にはおすすめですが、上級者はお気"
+"に召さないでしょう。\n"
+"\n"
+"もしJACKを自動起動させたいならコマンドラインに完全なパスとオプションが含まれ"
+"ていることを確認してください。\n"
+"例: /usr/local/bin/jackd -d alsa -d hw -r44100 -p 2048 -n 2\n"
+"\n"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:196
+msgid "Start JACK when Rosegarden starts"
+msgstr "Rosegarden起動時にJACKを起動"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:201
+msgid "JACK command"
+msgstr "JACKコマンド"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:214
+msgid "JACK Startup"
+msgstr "JACK起動"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:224
+msgid "External audio editor path"
+msgstr "外部オーディオエディタのパス"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:262
+msgid "External audio editor \"%1\" not found or not executable"
+msgstr "外部オーディオエディタ \"%1\"が見つからないか実行不能"
+
+#: ../src/gui/configuration/ColourConfigurationPage.cpp:70
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:448
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:863
+msgid "Add New Color"
+msgstr "新しいカラーの追加"
+
+#: ../src/gui/configuration/ColourConfigurationPage.cpp:74
+msgid "Delete Color"
+msgstr "カラー削除"
+
+#: ../src/gui/configuration/ColourConfigurationPage.cpp:93
+msgid "Color Map"
+msgstr "カラーマップ"
+
+#: ../src/gui/configuration/ColourConfigurationPage.cpp:128
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:983
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:882
+msgid "New Color Name"
+msgstr "新しいカラー名"
+
+#: ../src/gui/configuration/ColourConfigurationPage.cpp:130
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:59
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:984
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:883
+#: ../src/gui/studio/DeviceManagerDialog.cpp:115
+#: ../src/gui/studio/DeviceManagerDialog.cpp:174
+msgid "New"
+msgstr "新規"
+
+#: ../src/gui/configuration/LatencyConfigurationPage.h:62
+msgid "Latency"
+msgstr "レイテンシ"
+
+#: ../src/gui/configuration/LatencyConfigurationPage.h:63
+msgid "Sequencer Latency"
+msgstr "シーケンサレイテンシ"
+
+#: ../src/gui/configuration/ColourConfigurationPage.h:61
+msgid "Color Settings"
+msgstr "カラーの設定"
+
+#: ../src/gui/studio/MidiDeviceListViewItem.cpp:55
+#: ../src/gui/studio/MidiKeyMapListViewItem.cpp:44
+msgid "Key Mapping"
+msgstr "キーのマッピング"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:97
+msgid "Manage MIDI Banks and Programs"
+msgstr "MIDIバンクとプログラムの管理"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:128
+msgid "MIDI Device"
+msgstr "MIDIデバイス"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:130
+#: ../src/gui/studio/BankEditorDialog.cpp:219
+msgid "MSB"
+msgstr "MSB"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:131
+#: ../src/gui/studio/BankEditorDialog.cpp:218
+msgid "LSB"
+msgstr "LSB"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:140
+msgid "Add Bank"
+msgstr "バンクの追加"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:141
+msgid "Add Key Mapping"
+msgstr "キーマッピングの追加"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:153
+msgid "Add a Bank to the current device"
+msgstr "現在のデバイスにバンクを追加"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:157
+msgid "Add a Percussion Key Mapping to the current device"
+msgstr "現在のデバイスにパーカッションキーマッピングを追加"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:161
+msgid "Delete the current Bank or Key Mapping"
+msgstr "現在のバンクまたはキーマッピングをを削除"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:165
+msgid "Delete all Banks and Key Mappings from the current Device"
+msgstr "現在のデバイスからすべてのバンクとキーマッピングを削除"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:167
+#: ../src/gui/studio/DeviceManagerDialog.cpp:117
+msgid "Import..."
+msgstr "インポート..."
+
+#: ../src/gui/studio/BankEditorDialog.cpp:168
+#: ../src/gui/studio/DeviceManagerDialog.cpp:118
+msgid "Export..."
+msgstr "エクスポート"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:176
+msgid ""
+"Import Bank and Program data from a Rosegarden file to the current Device"
+msgstr "現在のデバイスにRosegardenファイルからバンクとプログラムをインポート"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:179
+msgid ""
+"Export all Device and Bank information to a Rosegarden format interchange "
+"file"
+msgstr ""
+"すべてのデバイスとバンク情報をRosegardenフォーマットに変換してエクスポート"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:190
+msgid "Copy all Program names from current Bank to clipboard"
+msgstr "クリップボードに現在のバンクからすべてのプログラムをコピー"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:194
+msgid "Paste Program names from clipboard to current Bank"
+msgstr "現在のバンクにクリップボードからプログラム名をペースト"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:216
+msgid "Show Variation list based on "
+msgstr ""
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1010
+msgid "<new bank>"
+msgstr "<新しいバンク>"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1046
+msgid "<new mapping>"
+msgstr "<新しいマッピング>"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1048
+msgid "<new mapping %1>"
+msgstr "<新しいマッピング %1>"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1089
+msgid "Really delete this bank?"
+msgstr "バンクを削除しますがいいですか?"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1137
+msgid "Really delete this key mapping?"
+msgstr "キーマッピングを削除しますがよろしいですか?"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1187
+msgid "Really delete all banks for "
+msgstr "右記のすべてのバンクを削除しますか "
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1476
+msgid "Import Banks from Device in File"
+msgstr "ファイルのデバイスをバンクにインポート"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1623
+#: ../src/gui/studio/DeviceManagerDialog.cpp:770
+msgid "Export Device as..."
+msgstr "エクスポートデバイス.."
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1694
+msgid ""
+"There are unsaved changes.\n"
+"Do you want to apply the changes before exiting the Bank Editor or discard "
+"the changes ?"
+msgstr ""
+"バンクは変更されています。\n"
+"バンクエディタを終了する前に保存しますか?"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1697
+msgid "Unsaved Changes"
+msgstr "変更されなかった"
+
+#: ../src/gui/studio/NameSetEditor.cpp:68
+msgid "Librarian"
+msgstr "ライブラリアン"
+
+#: ../src/gui/studio/NameSetEditor.cpp:75
+msgid "Email"
+msgstr "電子メール"
+
+#: ../src/gui/studio/NameSetEditor.cpp:80
+msgid ""
+"The librarian maintains the Rosegarden device data for this device.\n"
+"If you've made modifications to suit your own device, it might be worth\n"
+"liaising with the librarian in order to publish your information for the "
+"benefit\n"
+"of others."
+msgstr ""
+"ライブラリアンはこのデバイスに対するRosegardenデバイスデータを意味します。\n"
+"もしも、固有のデバイスに適合するよう、変更したいのであれば、 it might be "
+"worth\n"
+"liaising with the librarian in order to publish your information for the "
+"benefit\n"
+"of others."
+
+#: ../src/gui/studio/MidiBankListViewItem.cpp:51
+#: ../src/gui/studio/MidiDeviceListViewItem.cpp:48
+msgid "Percussion Bank"
+msgstr "パーカッションバンク"
+
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:84
+#: ../src/gui/studio/MidiBankListViewItem.cpp:51
+#: ../src/gui/studio/MidiDeviceListViewItem.cpp:48
+msgid "Bank"
+msgstr "バンク"
+
+#: ../src/gui/studio/ChangeRecordDeviceCommand.h:39
+msgid "Change Record Device"
+msgstr "録音デバイスの変更"
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:61
+#: ../src/gui/studio/DeviceManagerDialog.cpp:96
+msgid "Manage MIDI Devices"
+msgstr "MIDIデバイスの操作"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:98
+msgid "Play devices"
+msgstr "再生デバイス"
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:76
+#: ../src/gui/studio/DeviceManagerDialog.cpp:106
+#: ../src/gui/studio/DeviceManagerDialog.cpp:165
+msgid "Connection"
+msgstr "接続"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:119
+msgid "Banks..."
+msgstr "バンク..."
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:120
+msgid "Control Events..."
+msgstr "コントロールイベント..."
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:126
+msgid "Create a new Play device"
+msgstr "新しい再生デバイスを作成"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:129
+#: ../src/gui/studio/DeviceManagerDialog.cpp:184
+msgid "Delete the selected device"
+msgstr "選択されたデバイスの削除"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:132
+msgid ""
+"Import Bank, Program and Controller data from a Rosegarden file to the "
+"selected device"
+msgstr ""
+"選択されたデバイスにRosegardenファイルからバンク、プログラムと コントローラ"
+"データをインポート"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:135
+msgid "Export Bank and Controller data to a Rosegarden interchange file"
+msgstr "Rosegarden交換用ファイルにバンクとコントローラデータをエクスポート"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:138
+msgid "View and edit Banks and Programs for the selected device"
+msgstr "選択されたデバイスに対するバンクとプログラムの表示と編集"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:141
+msgid ""
+"View and edit Control Events for the selected device - these are special "
+"Event types that you can define against your device and control through "
+"Control Rulers or the Instrument Parameter Box "
+msgstr ""
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:156
+msgid "Record devices"
+msgstr "録音デバイス"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:164
+msgid "Current"
+msgstr "現在"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:181
+msgid "Create a new Record device"
+msgstr "新しい録音デバイスの作成"
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:360
+#: ../src/gui/studio/DeviceEditorDialog.cpp:378
+#: ../src/gui/studio/DeviceManagerDialog.cpp:486
+#: ../src/gui/studio/DeviceManagerDialog.cpp:501
+msgid "New Device"
+msgstr "新しいデバイス"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:703
+msgid "Import from Device in File"
+msgstr "デバイスからファイル中にインポート"
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:55
+msgid "Remap Instrument assigments..."
+msgstr "インストゥルメントの割り当て変更..."
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:62
+msgid "Device or Instrument"
+msgstr "デバイスもしくはインストゥルメント"
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:65
+msgid "Remap Tracks by all Instruments on a Device or by single Instrument"
+msgstr ""
+"デバイス上のすべてのインストゥルメントか一つのインストゥルメントのトラック割"
+"り当てを変更"
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:74
+msgid "Choose Source and Destination"
+msgstr "送信元と受信先を指定"
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:77
+msgid "From"
+msgstr "送信元"
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:78
+msgid "To"
+msgstr "受信先"
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:120
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:121
+msgid "<no devices>"
+msgstr "<デバイス無し>"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:155
+msgid "Show Audio &Faders"
+msgstr "オーディオフェーダーを表示(&F)"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:160
+msgid "Show Synth &Faders"
+msgstr "シンセフェーダーを表示(&F)"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:165
+msgid "Show &Submasters"
+msgstr "サブマスタを表示(&S)"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:170
+msgid "Show &Plugin Buttons"
+msgstr "プラグインボタンを表示(&P)"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:175
+msgid "Show &Unassigned Faders"
+msgstr "割り当てていないフェーダーを表示"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:184
+#, c-format
+msgid ""
+"_n: 1 Input\n"
+"%n Inputs"
+msgstr "%n Inputs"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:194
+msgid "No Submasters"
+msgstr "サブマスタなし"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:203
+#, c-format
+msgid ""
+"_n: 1 Submaster\n"
+"%n Submasters"
+msgstr "%n Submasters"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:279
+msgid "Audio Mixer"
+msgstr "オーディオミキサ"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:311
+msgid "Record input source"
+msgstr "録音入力ソース"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:322
+msgid "Output destination"
+msgstr "出力先"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:336
+#: ../src/gui/studio/AudioMixerWindow.cpp:495
+msgid "Pan"
+msgstr "パン"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:355
+msgid "Mono or stereo"
+msgstr "モノ/ステレオ切替"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:364
+#: ../src/gui/studio/AudioMixerWindow.cpp:513
+msgid "Mute"
+msgstr "ミュート"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:373 rc.cpp:408
+#, no-c-format
+msgid "Solo"
+msgstr "ソロ"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:382
+msgid "Arm recording"
+msgstr ""
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:400
+#, c-format
+msgid "Audio %1"
+msgstr "オーディオ %1"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:404
+#, c-format
+msgid "Synth %1"
+msgstr "シンセサイザー %1"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:578
+#: ../src/gui/studio/AudioMixerWindow.cpp:580
+msgid "Audio master output level"
+msgstr "オーディオマスタ出力レベル"
+
+#: ../src/gui/studio/SynthPluginManagerDialog.cpp:71
+msgid "Manage Synth Plugins"
+msgstr "シンセサイザープラグインの管理"
+
+#: ../src/gui/studio/SynthPluginManagerDialog.cpp:78
+msgid "Synth plugins"
+msgstr "シンセサイザープラグイン"
+
+#: ../src/gui/studio/SynthPluginManagerDialog.cpp:145
+msgid "Controls"
+msgstr "コントロール"
+
+#: ../src/gui/studio/SynthPluginManagerDialog.cpp:152
+msgid "Editor >>"
+msgstr "エディタ>>"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:66
+#: ../src/gui/studio/MidiProgramsEditor.cpp:169
+msgid "Bank and Program details"
+msgstr "バンクとプログラムの詳細"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:67
+msgid "Programs"
+msgstr "プログラム"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2711
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:88
+#: ../src/gui/studio/MidiProgramsEditor.cpp:93
+msgid "Percussion"
+msgstr "パーカッション"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:99
+msgid "MSB Value"
+msgstr "MSB値"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:107
+msgid ""
+"Selects a MSB controller Bank number (MSB/LSB pairs are always unique for "
+"any Device)"
+msgstr ""
+"MSBコントローラバンクナンバーを選択(MSB/LSBペアは常時任意のデバイスに対して一"
+"意である)"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:111
+msgid ""
+"Selects a LSB controller Bank number (MSB/LSB pairs are always unique for "
+"any Device)"
+msgstr ""
+"LSBコントローラバンクナンバーを選択(MSB/LSBペアは常時任意のデバイスに対して一"
+"意である)"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:116
+msgid "LSB Value"
+msgstr "LSB値"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:254
+#: ../src/gui/studio/MidiProgramsEditor.cpp:541
+#, c-format
+msgid "Key Mapping: %1"
+msgstr "キーマッピング: %1"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:476
+msgid "<no key mapping>"
+msgstr "<キーマッピングなし>"
+
+#: ../src/gui/studio/MidiKeyMappingEditor.cpp:57
+#: ../src/gui/studio/MidiKeyMappingEditor.cpp:81
+msgid "Key Mapping details"
+msgstr "キーマッピングの詳細"
+
+#: ../src/gui/studio/MidiKeyMappingEditor.cpp:58
+msgid "Pitches"
+msgstr "ピッチ"
+
+#: ../src/gui/studio/MidiMixerWindow.cpp:152
+msgid "MIDI Mixer"
+msgstr "MIDIミキサ"
+
+#: ../src/gui/studio/MidiMixerWindow.cpp:199
+msgid "Volume"
+msgstr "音量"
+
+#: ../src/gui/studio/AudioPluginOSCGUIManager.cpp:444
+msgid "Rosegarden Plugin"
+msgstr "Rosegardenプラグイン"
+
+#: ../src/gui/studio/AudioPluginOSCGUIManager.cpp:447
+#, c-format
+msgid "Rosegarden: %1"
+msgstr "Rosegarden: %1"
+
+#: ../src/gui/studio/AudioPluginOSCGUIManager.cpp:449
+msgid "Rosegarden: %1: %2"
+msgstr "Rosegarden: %1: %2"
+
+#: ../src/gui/studio/AudioPluginOSCGUIManager.cpp:450
+#, c-format
+msgid "Plugin slot %1"
+msgstr "プラグインスロット %1"
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:92
+msgid "Add Play Device"
+msgstr "再生デバイスの追加"
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:93
+msgid "Add Record Device"
+msgstr "録音デバイスの追加"
+
+#: ../src/commands/studio/CreateOrDeleteDeviceCommand.h:68
+#: ../src/gui/studio/DeviceEditorDialog.cpp:94
+msgid "Delete Device"
+msgstr "デバイスを削除"
+
+#: ../src/gui/editors/segment/PlayList.cpp:77
+#: ../src/gui/studio/DeviceEditorDialog.cpp:156
+#: ../src/gui/studio/DeviceEditorDialog.cpp:361
+msgid "Play"
+msgstr "再生"
+
+#: ../src/commands/segment/SegmentRecordCommand.cpp:37
+#: ../src/gui/studio/DeviceEditorDialog.cpp:156
+#: ../src/gui/studio/DeviceEditorDialog.cpp:379 rc.cpp:394
+#, no-c-format
+msgid "Record"
+msgstr "録音"
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:256
+msgid "Apply pending changes?"
+msgstr "変更を適用しますか?"
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:359
+#: ../src/gui/studio/DeviceEditorDialog.cpp:377
+msgid "<new device>"
+msgstr "<新しいデバイス>"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentEraser.cpp:82
+msgid "Click on a segment to delete it"
+msgstr "セグメントの上でクリックで削除"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSplitter.cpp:166
+msgid ""
+"Click on a segment to split it in two; hold Shift to avoid snapping to beat "
+"grid"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSplitter.cpp:168
+msgid "Click on a segment to split it in two"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:81
+msgid "Click and drag to select segments"
+msgstr "クリックしてドラッグでセングメント選択"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentMover.cpp:154
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:238
+msgid "Move Segment"
+msgstr "セグメントの移動"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentMover.cpp:154
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:239
+msgid "Move Segments"
+msgstr "セグメントの移動"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:217
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:169
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:141
+#: ../src/gui/editors/segment/segmentcanvas/SegmentMover.cpp:210
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:255
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:359
+msgid "Hold Shift to avoid snapping to beat grid"
+msgstr "SHIFTキーを押しながらで拍グリッドにスナップを無効にできます"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:485
+msgid ""
+"Click and drag to select segments; middle-click and drag to draw an empty "
+"segment"
+msgstr ""
+"クリックしてドラッグでセグメント選択l 中ボタンクリックしてドラッグで空白を描"
+"画"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:384
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:502
+msgid ""
+"Click and drag to resize a segment; hold Ctrl as well to rescale its contents"
+msgstr ""
+"クリックしてドラッグでセグメントの長さ変更; Ctrlキーを押しながらでコンテンツ"
+"の長さ変更"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:386
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:504
+msgid "Click and drag to rescale segment"
+msgstr "クリックしてドラッグするとセグメントの長さ変更"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:509
+msgid "Click and drag to move segments; hold Ctrl as well to copy them"
+msgstr ""
+"クリックしてドラッグでセグメントの移動; Ctrlキーを押しつづけながらでコピー"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:511
+msgid "Click and drag to copy segments"
+msgstr "クリックしてドラッグでセグメントのコピー"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:515
+msgid ""
+"Click and drag to move segment; hold Ctrl as well to copy it; double-click "
+"to edit"
+msgstr ""
+"クリックしてドラッグでセグメントの移動; Ctrlキーを押しつづけながらでコピー; "
+"ダブルクリックで編集"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:517
+msgid "Click and drag to copy segment"
+msgstr "セグメントのコピーのためにクリックとドラッグ"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:157
+msgid ""
+"The audio file path does not exist or is not writable.\n"
+"You must set the audio file path to a valid directory in Document Properties "
+"before rescaling an audio file.\n"
+"Would you like to set it now?"
+msgstr ""
+"オーディオファイルパスが存在しないか書き込みできません。\n"
+"オーディオファイルを再スケールする前に、ドキュメントプロパティ中で 有効なディ"
+"レクトリにオーディオファイルパスを設定しなければなりま せん。\n"
+"今この設定を行いますか?"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:261
+msgid ""
+"Hold Shift to avoid snapping to beat grid; hold Ctrl as well to rescale "
+"contents"
+msgstr ""
+"SHIFTキーを押しながらで拍グリッドのスナップを無効; Ctrlキーを押しながらで縮尺"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentMover.cpp:325
+msgid "Click and drag to move a segment"
+msgstr "クリックしてドラッグでセグメントの移動"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentPencil.cpp:225
+msgid "Hold Shift to avoid snapping to bar lines"
+msgstr "シフトキーを押しながら動かすと小節線のスナップを無効にできます"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentPencil.cpp:283
+msgid "Record or drop audio here"
+msgstr "オーディオの録音又はドロップはここ"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentPencil.cpp:289
+msgid ""
+"Click and drag to draw an empty segment. Control+Alt click and drag to draw "
+"in overlap mode."
+msgstr ""
+"クリック+ドラッグで空白のセグメントを描画。Ctrl+Alt+クリック+ドラッグでオーバ"
+"ラップモードで描画"
+
+#: ../src/gui/editors/segment/TrackLabel.cpp:77
+msgid ""
+"Click and hold with left mouse button to assign this Track to an Instrument."
+msgstr "トラックにインストゥルメントを割り当てるには左マウスボタンをクリック"
+
+#: ../src/gui/editors/segment/TrackLabel.cpp:191
+msgid "Change track name"
+msgstr "トラック名の変更"
+
+#: ../src/gui/editors/segment/TrackLabel.cpp:192
+msgid "Enter new track name"
+msgstr "トラック名を入力"
+
+#: ../src/gui/editors/segment/TrackEditor.cpp:648
+msgid "Turn Repeating Segment into Real Copies"
+msgstr ""
+
+#: ../src/gui/editors/segment/TrackEditor.cpp:650
+msgid "Turn Repeating Segments into Real Copies"
+msgstr ""
+
+#: ../src/gui/editors/segment/TrackEditor.cpp:814
+msgid ""
+"You can't drop files into Rosegarden from this client. Try using Konqueror "
+"instead."
+msgstr ""
+"このクライアントからRosegardenにファイルをドロップできません。Konquerorを使っ"
+"てください。"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:85
+msgid "Manage Triggered Segments"
+msgstr "トリガーセグメントの管理"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:89
+msgid "ID"
+msgstr "ID"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:735
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:93
+msgid "Base velocity"
+msgstr "ベースベロシティ"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:94
+msgid "Triggers"
+msgstr "トリガー"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:115
+msgid "Add a Triggered Segment"
+msgstr "トリガーセグメントを追加"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:119
+msgid "Delete a Triggered Segment"
+msgstr "トリガーセグメントを削除"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:123
+msgid "Delete All Triggered Segments"
+msgstr "トリガーセグメントをすべて削除"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:127
+msgid "Close the Triggered Segment Manager"
+msgstr "トリガーセグメントマネージャを閉じる"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:169
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:245
+msgid "<no label>"
+msgstr "<ラベル無し>"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:248
+msgid ""
+"_n: %1 on 1 track\n"
+"%1 on %n tracks"
+msgstr "%1 上の %n トラック"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:284
+msgid ""
+"This will remove all triggered segments from the whole composition. Are you "
+"sure?"
+msgstr ""
+"この操作はすべてのトリガされたセグメントを全部のコンポジションから 削除しま"
+"す。それでもよいですか?"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:288
+msgid "Remove all triggered segments"
+msgstr "トリガーセグメントをすべて削除"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:313
+msgid "Trigger Segment Duration"
+msgstr "トリガーセグメントのデュレーション"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:336
+#, c-format
+msgid ""
+"_n: This triggered segment is used 1 time in the current composition. Are "
+"you sure you want to remove it?\n"
+"This triggered segment is used %n times in the current composition. Are you "
+"sure you want to remove it?"
+msgstr ""
+"このトリガされたセグメントは現在のコンポジションでは%n回使われています。削除"
+"してよいですか?"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:400
+msgid "Pa&ste as New Triggered Segment"
+msgstr "新しいトリガーセグメントをペースト(&P)"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1169
+#: ../src/gui/editors/segment/MarkerEditor.cpp:399
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:412
+#: ../src/gui/editors/tempo/TempoView.cpp:622
+msgid "&Musical Times"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1179
+#: ../src/gui/editors/segment/MarkerEditor.cpp:409
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:422
+#: ../src/gui/editors/tempo/TempoView.cpp:632
+msgid "&Real Times"
+msgstr "実時間(&R)"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1189
+#: ../src/gui/editors/segment/MarkerEditor.cpp:419
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:432
+#: ../src/gui/editors/tempo/TempoView.cpp:642
+msgid "Ra&w Times"
+msgstr "絶対時間(&w)"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:83
+msgid "Manage Markers"
+msgstr "マーカーの管理"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:86
+msgid "Marker time "
+msgstr "マーカー時間 "
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:87
+msgid "Marker text "
+msgstr "マーカーテキスト "
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:88
+msgid "Marker description "
+msgstr "マーカーの説明 "
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:95
+msgid "Pointer position"
+msgstr "ポインタの位置"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:100
+msgid "Real time:"
+msgstr "実時間:"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:103
+msgid "In measure:"
+msgstr "小節単位:"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:121
+msgid "Add a Marker"
+msgstr "マーカーの追加"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:125
+msgid "Delete a Marker"
+msgstr "マーカーの削除"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:129
+msgid "Delete All Markers"
+msgstr "すべてのマーカの削除"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:133
+msgid "Close the Marker Editor"
+msgstr "マーカーエディタを閉じる"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:296
+msgid "Remove all markers"
+msgstr "すべてのマーカーの削除"
+
+#: ../src/gui/editors/segment/PlayList.cpp:76
+msgid "Add..."
+msgstr "追加..."
+
+#: ../src/gui/editors/segment/PlayList.cpp:78
+msgid "Move Up"
+msgstr "上へ移動"
+
+#: ../src/gui/editors/segment/PlayList.cpp:79
+msgid "Move Down"
+msgstr "下へ移動"
+
+#: ../src/gui/editors/segment/PlayList.cpp:124
+msgid "Select one or more Rosegarden files"
+msgstr "1つ以上のRosegardenファイルを選択"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:73
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:55
+msgid "<not showing>"
+msgstr "<表示なし>"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:89
+msgid "Manage Control Events"
+msgstr "コントロールイベントの管理"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:91
+msgid "<no device>"
+msgstr "<デバイス無し>"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:99
+msgid " Control Events for %1 (device %2)"
+msgstr "%1用のコントロールイベント(%2デバイス)"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:104
+msgid "Control Event name "
+msgstr "コントロールイベント名 "
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:105
+msgid "Control Event type "
+msgstr "コントロールイベントタイプ "
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:106
+msgid "Control Event value "
+msgstr "コントロールイベント値 "
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:107
+msgid "Description "
+msgstr "説明 "
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:108
+msgid "Min "
+msgstr "最小 "
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:109
+msgid "Max "
+msgstr "最大 "
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:110
+msgid "Default "
+msgstr "既定値 "
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:111
+msgid "Color "
+msgstr "色 "
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:112
+msgid "Position on instrument panel"
+msgstr "インスツルメントパネル上の位置"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:136
+msgid "Add a Control Parameter to the Studio"
+msgstr "スタジオに対するコントロールパラメータの追加"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:140
+msgid "Delete a Control Parameter from the Studio"
+msgstr "スタジオからコントロールパラメータの削除"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:144
+msgid "Close the Control Parameter editor"
+msgstr "コントロールパラメータエディタのクローズ"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:221
+msgid "<default>"
+msgstr "<デフォルト>"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:62
+msgid "Edit Control Parameter"
+msgstr "制御パラメータを編集"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:71
+msgid "Control Event Properties"
+msgstr "コントロールイベントのプロパティ"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:77
+msgid "Name:"
+msgstr "名前:"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:93
+msgid "Control Event value:"
+msgstr "コントロールイベント値:"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:97
+msgid "Minimum value:"
+msgstr "最小値:"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:101
+msgid "Maximum value:"
+msgstr "最大値:"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:105
+msgid "Default value:"
+msgstr "既定値:"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:109
+msgid "Color:"
+msgstr "カラー:"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:113
+msgid "Instrument Parameter Box position:"
+msgstr "インスツルメントパラメータボックス位置:"
+
+#: ../src/gui/editors/segment/TrackButtons.cpp:209
+#: ../src/gui/editors/segment/TrackButtons.cpp:585
+#: ../src/gui/editors/segment/TrackButtons.cpp:935
+#: ../src/gui/editors/segment/TrackButtons.cpp:1127
+msgid "<no instrument>"
+msgstr "<楽器無し>"
+
+#: ../src/gui/editors/segment/TrackButtons.cpp:352
+#: ../src/gui/editors/segment/TrackButtons.cpp:1094
+msgid "<untitled audio>"
+msgstr "< 無題 オーディオ >"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:130
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:662
+#: ../src/gui/editors/segment/TrackButtons.cpp:354
+#: ../src/gui/editors/segment/TrackButtons.cpp:1096
+msgid "<untitled>"
+msgstr "< 無題 >"
+
+#: ../src/gui/editors/segment/TrackButtons.cpp:1058
+msgid "Mute track"
+msgstr "トラックをミュート"
+
+#: ../src/gui/editors/segment/TrackButtons.cpp:1063
+msgid "Record on this track"
+msgstr "トラックに録音"
+
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:88
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:1015
+msgid "Segment"
+msgstr "セグメント"
+
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:89
+msgid "Segment Parameters"
+msgstr "セグメントパラメータ"
+
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:366
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:697
+msgid "%1 ms"
+msgstr "%1ミリ秒"
+
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:1031
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:910
+msgid "Highest playable note"
+msgstr "再生可能な最高の音符"
+
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:1051
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:930
+msgid "Lowest playable note"
+msgstr "再生可能な最低の音符"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:93
+msgid "Track Parameters"
+msgstr "トラックパラメータ"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:137
+msgid "Playback parameters"
+msgstr "再生パラメータ"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:172
+msgid "Recording filters"
+msgstr "録音フィルタ"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:191
+msgid "Channel"
+msgstr "チャンネル"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:203
+msgid "Staff export options"
+msgstr "五線譜エクスポートオプション"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:220
+msgid "Notation size:"
+msgstr "譜面の大きさ:"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:225
+msgid "Small"
+msgstr "小"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:226
+msgid "Tiny"
+msgstr "極小"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:233
+msgid "Bracket type:"
+msgstr "括弧のタイプ:"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:237
+msgid "-----"
+msgstr "-----"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:238
+msgid "[----"
+msgstr "[----"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:239
+msgid "----]"
+msgstr "----]"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:240
+msgid "[---]"
+msgstr "[---]"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:241
+msgid "{----"
+msgstr "{----"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:242
+msgid "----}"
+msgstr "----}"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:243
+msgid "{[---"
+msgstr "{[---"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:244
+msgid "---]}"
+msgstr "---]}"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:253
+msgid "Create segments with"
+msgstr "セグメントの作成:"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:264
+msgid "Preset"
+msgstr "プリセット"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:272
+msgid "Load"
+msgstr "ロード"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:282
+msgid "treble"
+msgstr "高音"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:283
+msgid "bass"
+msgstr "低音"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:284
+msgid "crotales"
+msgstr "アンティークシンバル"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:285
+msgid "xylophone"
+msgstr "木琴"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:286
+msgid "guitar"
+msgstr "ギター"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:287
+msgid "contrabass"
+msgstr "コントラバス"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:288
+msgid "celesta"
+msgstr "チェレスタ"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:289
+msgid "old celesta"
+msgstr "古いチェレスタ"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:290
+msgid "french"
+msgstr "フレンチ"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:291
+msgid "soprano"
+msgstr "ソプラノ"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:292
+msgid "mezzosoprano"
+msgstr "メゾソプラノ"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:293
+msgid "alto"
+msgstr "アルト"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:294
+msgid "tenor"
+msgstr "テノール"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:295
+msgid "baritone"
+msgstr "バリトン"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:296
+msgid "varbaritone"
+msgstr "varbaritone"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:297
+msgid "subbass"
+msgstr "サブバス"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:327
+msgid "Lowest"
+msgstr "最低"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:329
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:336
+msgid "---"
+msgstr "---"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:331
+msgid "Choose the lowest suggested playable note, using a staff"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:334
+msgid "Highest"
+msgstr "最高"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:338
+msgid "Choose the highest suggested playable note, using a staff"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:666
+msgid "[ Track %1 - %2 ]"
+msgstr "[ トラック%1 - %2 ]"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:985
+msgid "The instrument preset database is corrupt. Check your installation."
+msgstr ""
+"インストゥルメントプリセットデータベースが壊れています。インストールの状態を"
+"確認してください。"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:173
+#: ../src/gui/editors/parameters/InstrumentParameterBox.cpp:54
+msgid "Instrument Parameters"
+msgstr "インストゥルメントパラメータ"
+
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:85
+msgid "Variation"
+msgstr "バリエーション"
+
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:86
+msgid "Program"
+msgstr "プログラム"
+
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:87
+msgid "Channel out"
+msgstr "チャンネル出力"
+
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:215
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:221
+msgid "[ %1 ]"
+msgstr "[ %1 ]"
+
+#: ../src/gui/editors/matrix/MatrixEraser.cpp:58
+#: ../src/gui/editors/matrix/MatrixMover.cpp:71
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:67
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:77
+msgid "Switch to Draw Tool"
+msgstr "ドローツールに切り替え"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:75
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:69
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:71
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:81
+#: ../src/gui/editors/notation/ClefInserter.cpp:57
+#: ../src/gui/editors/notation/GuitarChordInserter.cpp:63
+#: ../src/gui/editors/notation/NotationSelector.cpp:87
+#: ../src/gui/editors/notation/NoteInserter.cpp:113
+#: ../src/gui/editors/notation/RestInserter.cpp:72
+#: ../src/gui/editors/notation/TextInserter.cpp:61
+msgid "Switch to Erase Tool"
+msgstr "消去ツールに切り替え"
+
+#: ../src/gui/editors/matrix/MatrixEraser.cpp:62
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:73
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:75
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:85
+msgid "Switch to Move Tool"
+msgstr "移動ツールに切り替え"
+
+#: ../src/gui/editors/matrix/MatrixEraser.cpp:68
+#: ../src/gui/editors/matrix/MatrixMover.cpp:81
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:79
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:93
+msgid "Switch to Resize Tool"
+msgstr "リサイズツールに切り替え"
+
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:446
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:579
+msgid "Click and drag to select; middle-click and drag to draw new note"
+msgstr ""
+"クリックしてドラッグすると選択; 中ボタンでクリックしてドラッグすると音符を描"
+"画"
+
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:324
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:597
+msgid "Click and drag to resize selected notes"
+msgstr "クリックしてドラッグすると選択した音符をリサイズ"
+
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:599
+msgid "Click and drag to resize note"
+msgstr "クリックしてドラッグすると音符をリサイズ"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:471
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:604
+msgid "Click and drag to move selected notes; hold Ctrl as well to copy"
+msgstr "クリックとドラッグで選択された音符の移動; Ctrlキーでコピー"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:473
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:606
+msgid "Click and drag to copy selected notes"
+msgstr "クリックしてドラッグでコピーのための音符を選択"
+
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:610
+msgid "Click and drag to move note; hold Ctrl as well to copy"
+msgstr "クリックとドラッグで音符の移動; Ctrlキーを押すとコピー"
+
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:612
+msgid "Click and drag to copy note"
+msgstr "クリックしてドラッグで音符のコピー"
+
+#: ../src/gui/editors/matrix/MatrixEraser.cpp:54
+#: ../src/gui/editors/matrix/MatrixMover.cpp:67
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:65
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:63
+#: ../src/gui/editors/notation/ClefInserter.cpp:53
+#: ../src/gui/editors/notation/GuitarChordInserter.cpp:59
+#: ../src/gui/editors/notation/NotationEraser.cpp:67
+#: ../src/gui/editors/notation/NoteInserter.cpp:109
+#: ../src/gui/editors/notation/RestInserter.cpp:68
+#: ../src/gui/editors/notation/TextInserter.cpp:57
+msgid "Switch to Select Tool"
+msgstr "選択ツールに切り替え"
+
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:218
+msgid "Resize Event"
+msgstr "イベントをリサイズ"
+
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:221
+msgid "Resize Events"
+msgstr "イベントをリサイズ"
+
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:326
+msgid "Click and drag to resize a note"
+msgstr "クリックしてドラッグで音符をリサイズ"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:328
+msgid "Copy and Move Event"
+msgstr "イベントのコピーと移動"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:330
+msgid "Copy and Move Events"
+msgstr "複数のイベントのコピーと移動"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:334
+msgid "Move Event"
+msgstr "イベントの移動"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:336
+msgid "Move Events"
+msgstr "複数のイベントを移動"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:465
+msgid "Click and drag to move a note; hold Ctrl as well to copy it"
+msgstr "クリックしてドラッグで音符の移動; Ctrlキーを押しながらでコピー"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:467
+msgid "Click and drag to copy a note"
+msgstr "クリックしてドラッグで音符のコピー"
+
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:361
+msgid "Click and drag to draw a note; Shift to avoid snapping to grid"
+msgstr ""
+"クリックしてドラッグで音符を置きます; SHIFTを押しながらでグリッドのスナップを"
+"無効にできます"
+
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:363
+msgid "Click and drag to draw a note"
+msgstr "クリックしてドラッグで音符を置きます"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:437
+#: ../src/gui/editors/matrix/MatrixView.cpp:3053
+msgid "Couldn't apply piano roll layout"
+msgstr "ピアノロールレイアウトが適用できません"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:663
+msgid "Resi&ze"
+msgstr "リサイズ(&z)"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:669
+#: ../src/gui/editors/notation/NotationView.cpp:1919
+msgid "C&hord Insert Mode"
+msgstr "コード挿入モード(&h)"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:676
+#: ../src/gui/editors/notation/NotationView.cpp:1778
+msgid "Ste&p Recording"
+msgstr "ステップ録音(&p)"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:694
+msgid "&Legato"
+msgstr "レガート(&L)"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:708
+msgid "Set to Current Velocity"
+msgstr "現在のベロシティの設定"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:712
+msgid "Set Event &Velocities..."
+msgstr "イベントベロシティの設定(&V)"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:716
+msgid "Trigger Se&gment..."
+msgstr "セグメントのトリガ(&g)"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:720
+msgid "Remove Triggers..."
+msgstr "トリガの削除"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1153
+#: ../src/gui/editors/matrix/MatrixView.cpp:724
+#: ../src/gui/editors/tempo/TempoView.cpp:606
+msgid "Select &All"
+msgstr "すべてを選択(&A)"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:732
+#: ../src/gui/editors/notation/NotationView.cpp:2325
+msgid "Cursor &Back"
+msgstr "カーソルを戻す(&B)"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:736
+#: ../src/gui/editors/notation/NotationView.cpp:2329
+msgid "Cursor &Forward"
+msgstr "カーソルを進める(&F)"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:740
+#: ../src/gui/editors/notation/NotationView.cpp:2333
+msgid "Cursor Ba&ck Bar"
+msgstr "カーソル後退バー(&c)"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:744
+#: ../src/gui/editors/notation/NotationView.cpp:2337
+msgid "Cursor For&ward Bar"
+msgstr "カーソル前進バー(&w)"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:748
+#: ../src/gui/editors/notation/NotationView.cpp:2341
+msgid "Cursor Back and Se&lect"
+msgstr "カーソル後退と選択(&l)"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:752
+#: ../src/gui/editors/notation/NotationView.cpp:2345
+msgid "Cursor Forward and &Select"
+msgstr "カーソル前進と選択(&S)"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:756
+#: ../src/gui/editors/notation/NotationView.cpp:2349
+msgid "Cursor Back Bar and Select"
+msgstr "カーソル後退バーと選択"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:760
+#: ../src/gui/editors/notation/NotationView.cpp:2353
+msgid "Cursor Forward Bar and Select"
+msgstr "カーソル前進バーと選択"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:764
+#: ../src/gui/editors/notation/NotationView.cpp:2363
+msgid "Cursor to St&art"
+msgstr "カーソルを開始点へ(&a)"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:770
+#: ../src/gui/editors/notation/NotationView.cpp:2369
+msgid "Cursor to &End"
+msgstr "カーソルを終了点へ(&E)"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:776
+#: ../src/gui/editors/notation/NotationView.cpp:2391
+msgid "Cursor to &Playback Pointer"
+msgstr "カーソルを再生ポインタへ(&P)"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:820
+#: ../src/gui/editors/notation/NotationView.cpp:2435
+msgid "Playback Pointer to &Cursor"
+msgstr "再生ポインタをカーソル位置へ(&C)"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:826
+#: ../src/gui/editors/notation/NotationView.cpp:2441
+msgid "&Solo"
+msgstr "ソロ(&S)"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:841
+#: ../src/gui/editors/notation/NotationView.cpp:2456
+msgid "Set Loop to Selection"
+msgstr "選択範囲をループに設定"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:845
+#: ../src/gui/editors/notation/NotationView.cpp:2460
+msgid "Clear L&oop"
+msgstr "ループのクリア(&o)"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1157
+#: ../src/gui/editors/matrix/MatrixView.cpp:849
+#: ../src/gui/editors/notation/NotationView.cpp:2464
+#: ../src/gui/editors/tempo/TempoView.cpp:610
+msgid "Clear Selection"
+msgstr "選択を解除"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1149
+#: ../src/gui/editors/matrix/MatrixView.cpp:854
+#: ../src/gui/editors/notation/NotationView.cpp:2471
+msgid "&Filter Selection"
+msgstr "フィルタの選択(&F)"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:879
+msgid "&No Snap"
+msgstr "スナップなし(&N)"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:884
+msgid "Snap to Bea&t"
+msgstr "拍にスナップ(%t)"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:888
+msgid "Snap to &Bar"
+msgstr "小節にスナップ(&b)"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:908
+#, c-format
+msgid "Snap to %1"
+msgstr "%1 にスナップ"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:917
+msgid "Show Instrument Parameters"
+msgstr "インストゥルメントパラメータの表示"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:922
+#: ../src/gui/editors/notation/NotationView.cpp:1850
+msgid "Show Ch&ord Name Ruler"
+msgstr "コード名ルーラー表示"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:926
+#: ../src/gui/editors/notation/NotationView.cpp:1858
+msgid "Show &Tempo Ruler"
+msgstr "テンポルーラーの表示(&T)"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1238
+#: ../src/gui/editors/notation/NotationView.cpp:3245
+#, c-format
+msgid ""
+"_n: 1 event selected \n"
+" %n events selected "
+msgstr "%n イベントを選択 "
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1241
+#: ../src/gui/editors/notation/NotationView.cpp:3247
+msgid " No selection "
+msgstr " 選択なし "
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1348
+#: ../src/gui/editors/matrix/MatrixView.cpp:1360
+#: ../src/gui/editors/matrix/MatrixView.cpp:2079
+#: ../src/gui/editors/notation/NotationView.cpp:5869
+msgid "Quantizing..."
+msgstr "クォンタイズ中..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1370
+#: ../src/gui/editors/notation/NotationView.cpp:5407
+msgid "Collapsing notes..."
+msgstr "音符をつなげる"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1381
+msgid "Making legato..."
+msgstr "レガートの作成..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1476
+msgid "Note: %1 (%2.%3s)"
+msgstr "Note: %1 (%2.%3s)"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1531
+#: ../src/gui/editors/notation/NotationView.cpp:7206
+msgid "Time: %1 (%2.%3s)"
+msgstr "時間: %1 (%2.%3秒)"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1604
+#: ../src/gui/editors/notation/NotationView.cpp:4744
+#: ../src/gui/editors/notation/NotationView.cpp:4773
+msgid "Cutting selection to clipboard..."
+msgstr "選択範囲をクリップボードに切り取り中"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:912
+#: ../src/gui/editors/matrix/MatrixView.cpp:1636
+#: ../src/gui/editors/notation/NotationSelectionPaster.cpp:82
+msgid "Couldn't paste at this point"
+msgstr "この点には貼り付けできない"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1647
+#: ../src/gui/editors/notation/NotationView.cpp:4754
+msgid "Deleting selection..."
+msgstr "選択範囲を削除中"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1833
+#: ../src/gui/editors/notation/NotationView.cpp:5617
+#, c-format
+msgid "Unknown note insert action %1"
+msgstr "不明な音符の挿入動作 %1"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1837
+#: ../src/gui/editors/matrix/MatrixView.cpp:2857
+#: ../src/gui/editors/notation/NotationView.cpp:5621
+msgid "Inserting note"
+msgstr "音符の挿入"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2091
+msgid "Unquantizing..."
+msgstr "アンクォンタイズ..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2120
+msgid " Grid: "
+msgstr "グリッド:"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2134
+msgid "Unit"
+msgstr "ユニット"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2136
+msgid "Beat"
+msgstr "拍"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2138
+msgid "Bar"
+msgstr "小節"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2159
+msgid " Velocity: "
+msgstr " ベロシティ:"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2170
+msgid " Quantize: "
+msgstr "クォンタイズ: "
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2584
+msgid "Raising velocities..."
+msgstr "ベロシティの増加中..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2596
+msgid "Lowering velocities..."
+msgstr "ベロシティの低減中..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2611
+msgid "Set Event Velocities"
+msgstr "イベントベロシティの設定"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2616
+msgid "Setting Velocities..."
+msgstr "ベロシティの設定..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2665
+msgid "Remove Triggers"
+msgstr "トリガの削除"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2723
+msgid "%1 - Segment Track #%2 - %3"
+msgstr "%1 - セグメントトラック #%2 - %3"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2730
+msgid "%1 - All Segments - %2"
+msgstr "%1 - すべてのセグメント - %2"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2737
+msgid ""
+"_n: %1 - 1 Segment - %2\n"
+"%1 - %n Segments - %2"
+msgstr "%1 - %n セグメント - %2"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2885
+msgid "Can't insert note: No grid duration selected"
+msgstr "音符が挿入できない;グリッドデュレーションが1つも選択されていない"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2935
+msgid " Chord "
+msgstr "コード"
+
+#: ../src/gui/editors/matrix/MatrixEraser.cpp:105
+msgid "Click on a note to delete it"
+msgstr "音符の上でクリックで削除"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:89
+msgid "Filter"
+msgstr "フィルタ"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:245
+#: ../src/gui/editors/tempo/TempoView.cpp:117
+msgid "Time "
+msgstr "時間 "
+
+#: ../src/gui/editors/tempo/TempoView.cpp:118
+msgid "Type "
+msgstr "タイプ "
+
+#: ../src/gui/editors/tempo/TempoView.cpp:119
+msgid "Value "
+msgstr "値 "
+
+#: ../src/gui/editors/tempo/TempoView.cpp:120
+msgid "Properties "
+msgstr "プロパティ "
+
+#: ../src/gui/editors/tempo/TempoView.cpp:208
+msgid "Common, hidden"
+msgstr "共通, hidden"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:210
+msgid "Hidden"
+msgstr "非表示"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:213
+msgid "Common"
+msgstr "共通"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:220
+msgid "Time Signature "
+msgstr "拍子記号 "
+
+#: ../src/gui/editors/tempo/TempoView.cpp:245
+msgid "%1.%2%3"
+msgstr "%1.%2%3"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:255
+msgid "%1.%2%3 qpm (%4.%5%6 bpm) "
+msgstr "%1.%2%3 qpm (%4.%5%6 bpm) "
+
+#: ../src/gui/editors/tempo/TempoView.cpp:264
+msgid "Tempo "
+msgstr "テンポ "
+
+#: ../src/gui/editors/tempo/TempoView.cpp:271
+msgid "<nothing at this filter level>"
+msgstr "フィルタレベルにはありません>"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:463
+msgid "Delete Tempo or Time Signature"
+msgstr "テンポ又はタイムシグネチャの削除"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:602
+msgid "&Edit Item"
+msgstr "アイテムの編集(&E)"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:834
+msgid "%1 - Tempo and Time Signature Editor"
+msgstr "%1 - テンポ/拍子エディタ"
+
+#: ../src/gui/editors/guitar/GuitarChordEditorDialog.cpp:43
+msgid "Guitar Chord Editor"
+msgstr "ギターコードエディタ"
+
+#: ../src/gui/editors/guitar/GuitarChordEditorDialog.cpp:51
+msgid "Start fret"
+msgstr "開始小節"
+
+#: ../src/gui/editors/guitar/GuitarChordEditorDialog.cpp:58
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:51
+msgid "Root"
+msgstr "Root"
+
+#: ../src/gui/editors/guitar/GuitarChordEditorDialog.cpp:62
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:55
+msgid "Extension"
+msgstr "拡張"
+
+#: ../src/gui/editors/guitar/Fingering.cpp:118
+msgid "couldn't parse fingering '%1' in '%2'"
+msgstr "指使いを解析できない '%1' 中の '%2'"
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:45
+msgid "Guitar Chord Selector"
+msgstr "ギターコードセレクタ"
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:64
+msgid "beginner"
+msgstr "初心者"
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:65
+msgid "common"
+msgstr "共通"
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:66
+msgid "all"
+msgstr "すべて"
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:86
+msgid "Fingerings"
+msgstr "指使い"
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:419
+msgid "couldn't open file '%1'"
+msgstr "'%1'ファイルが開けません"
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:428
+#, c-format
+msgid "couldn't parse chord dictionnary : %1"
+msgstr ""
+
+#: ../src/gui/editors/notation/NoteFontViewer.cpp:87
+#, c-format
+msgid "Note Font Viewer: %1"
+msgstr "音符フォントビューワ: %1"
+
+#: ../src/gui/editors/notation/NoteFontViewer.cpp:93
+msgid " Component: "
+msgstr " コンポーネント: "
+
+#: ../src/gui/editors/notation/NoteFontViewer.cpp:101
+msgid " View: "
+msgstr " ビュー: "
+
+#: ../src/gui/editors/notation/NoteFontViewer.cpp:104
+msgid "Glyphs"
+msgstr "グリフ"
+
+#: ../src/gui/editors/notation/NoteFontViewer.cpp:105
+msgid "Codes"
+msgstr "Codes"
+
+#: ../src/gui/editors/notation/NoteFontViewer.cpp:107
+msgid " Page: "
+msgstr " ページ: "
+
+#: ../src/gui/editors/notation/ClefInserter.cpp:64
+#: ../src/gui/editors/notation/GuitarChordInserter.cpp:71
+#: ../src/gui/editors/notation/RestInserter.cpp:79
+#: ../src/gui/editors/notation/TextInserter.cpp:68
+msgid "Switch to Inserting Notes"
+msgstr "ノートの挿入に切り替え"
+
+#: ../src/gui/editors/notation/NotationView.cpp:522
+msgid "Close track headers"
+msgstr "トラックヘッダのクローズ"
+
+#: ../src/gui/editors/notation/NotationView.cpp:917
+msgid "Preparing to print..."
+msgstr "印刷準備..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:1516
+msgid "Note &Font"
+msgstr "音符フォント(&F)"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1539
+msgid "Si&ze"
+msgstr "サイズ(&z)"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1545
+msgid "Show Track Headers"
+msgstr "トラックヘッダの表示"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1550
+msgid "S&pacing"
+msgstr "スペーシング(&p)"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1572
+msgid "Du&ration Factor"
+msgstr "デュレーションファクタ(&r)"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1598
+msgid "Note &Style"
+msgstr "音符の表現形式(&S)"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1624
+msgid "Insert Rest"
+msgstr "休符挿入"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1628
+msgid "Switch from Note to Rest"
+msgstr "音符から休符に切り替え"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1633
+msgid "Switch from Rest to Note"
+msgstr "休符から音符に切り替え"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1690
+msgid "No accidental"
+msgstr "通常"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1691
+msgid "Follow previous accidental"
+msgstr "直前の臨時記号に従う"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1692
+msgid "Sharp"
+msgstr "#"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1693
+msgid "Flat"
+msgstr "♭"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1694
+msgid "Natural"
+msgstr "ナチュラル"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1695
+msgid "Double sharp"
+msgstr "♯♯"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1696
+msgid "Double flat"
+msgstr "♭♭"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1717
+msgid "&Treble Clef"
+msgstr "ト音記号(&T)"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1724
+msgid "&Alto Clef"
+msgstr "アルト記号(&A)"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1731
+msgid "Te&nor Clef"
+msgstr "テノール記号(&n)"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1738
+msgid "&Bass Clef"
+msgstr "ヘ音記号(&B)"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1745
+msgid "&Text"
+msgstr "テキスト(&T)"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1751
+msgid "&Guitar Chord"
+msgstr "ギターコード(&G)"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1784
+msgid "Select from Sta&rt"
+msgstr "最初から選択(&r)"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1788
+msgid "Select to &End"
+msgstr "最後まで選択(&E)"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1792
+msgid "Select Whole St&aff"
+msgstr "すべてを選択(&a)"
+
+#: ../src/commands/edit/CutAndCloseCommand.h:53
+#: ../src/gui/editors/notation/NotationView.cpp:1796
+msgid "C&ut and Close"
+msgstr "カットとクローズ(&u)"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1800
+msgid "Pa&ste..."
+msgstr "貼り付け(&s)"
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:122
+#: ../src/gui/editors/notation/NotationView.cpp:1808
+msgid "Move to Staff Above"
+msgstr "上の五線に移動"
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:126
+#: ../src/gui/editors/notation/NotationView.cpp:1812
+msgid "Move to Staff Below"
+msgstr "下の五線に移動"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1826
+msgid "&Linear Layout"
+msgstr "リニアレイアウト(&L)"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1835
+msgid "&Continuous Page Layout"
+msgstr "ページレイアウトの続き(&C)"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1844
+msgid "&Multiple Page Layout"
+msgstr "複数ページレイアウト(&M)"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1854
+msgid "Show Ra&w Note Ruler"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1862
+msgid "Show &Annotations"
+msgstr "注釈を表示(&A)"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1866
+msgid "Show Lily&Pond Directives"
+msgstr "LilyPondディレクティブの表示(&P)"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1870
+msgid "Open L&yric Editor"
+msgstr "歌詞エディタをオープン(&y)"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1912
+msgid "Trip&let Insert Mode"
+msgstr "三連符挿入モード(&l)"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1926
+msgid "Grace Insert Mode"
+msgstr "装飾音挿入モード"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2180
+msgid "&Dump selected events to stderr"
+msgstr "選択されたイベントを標準出力へダンプ(&D)"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2248
+msgid "Ma&ke Ornament..."
+msgstr "装飾記号を作成(&K)"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2252
+msgid "Trigger &Ornament..."
+msgstr "オルナメントの設定(&O)"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2256
+msgid "Remove Ornament..."
+msgstr "装飾記号を削除"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2261
+msgid "&None"
+msgstr "無し(&N)"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2289
+msgid "Convert Notation For..."
+msgstr "譜面変換中..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:2298
+msgid "Show &Notes Toolbar"
+msgstr "音符ツールバーを表示(&N)"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2299
+msgid "Show &Rests Toolbar"
+msgstr "休符ツールバーを表示(&R)"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2300
+msgid "Show &Accidentals Toolbar"
+msgstr "臨時記号ツールバーを表示(&A)"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2301
+msgid "Show Cle&fs Toolbar"
+msgstr "音部記号ツールバーの表示(&s)"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2303
+msgid "Show &Marks Toolbar"
+msgstr "演奏記号ツールバーの表示(&M)"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2305
+msgid "Show &Group Toolbar"
+msgstr "グループツールバーの表示(&G)"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2307
+msgid "Show &Layout Toolbar"
+msgstr "レイアウトツールバーの表示(&L)"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2311
+msgid "Show M&eta Toolbar"
+msgstr "メタツールバーの表示(&M)"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2373
+msgid "Cursor &Up Staff"
+msgstr "上の五線にカーソル移動(&U)"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2377
+msgid "Cursor &Down Staff"
+msgstr "下の五線にカーソル移動(&D)"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2381
+msgid "Cursor Pre&vious Segment"
+msgstr "以前のセグメントに位置づけ(&v)"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2385
+msgid "Cursor Ne&xt Segment"
+msgstr "次のセグメントにカーソル移動(&x)"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2475
+msgid "Push &Left"
+msgstr "左に移動(&L)"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2479
+msgid "Push &Right"
+msgstr "右に移動(&R)"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2483
+msgid "Push &Up"
+msgstr "上に移動(&U)"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2487
+msgid "Push &Down"
+msgstr "下に移動(&D)"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2491
+msgid "&Restore Positions"
+msgstr "計算した位置を復帰(&R)"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2495
+msgid "Make &Invisible"
+msgstr "不可視にする(&I)"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2499
+msgid "Make &Visible"
+msgstr "可視にする(&V)"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2503
+msgid "Toggle Dot"
+msgstr "付点のトグル"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2507
+#: ../src/gui/editors/notation/NotationView.cpp:2511
+msgid "Add Dot"
+msgstr "付点の追加"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2570
+#, c-format
+msgid ""
+"_n: 1 pixel\n"
+"%n pixels"
+msgstr "%n ピクセル"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2619
+msgid " Font: "
+msgstr " フォント: "
+
+#: ../src/gui/editors/notation/NotationView.cpp:2647
+msgid "Unknown font \"%1\", using default"
+msgstr "未定義のフォント \"%1\",既定値を使用"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2655
+msgid " Size: "
+msgstr " サイズ: "
+
+#: ../src/gui/editors/notation/NotationView.cpp:2677
+msgid " Spacing: "
+msgstr " 間隔: "
+
+#: ../src/gui/editors/notation/NotationView.cpp:2993
+#: ../src/gui/editors/notation/NotationView.cpp:3818
+msgid " Ready."
+msgstr " 完了"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2998
+msgid "Laying out score..."
+msgstr "譜面をレイアウト..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:3011
+msgid "Laying out staff %1..."
+msgstr "譜表 %1 の外をレイアウト..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:3020
+msgid "Reconciling staffs..."
+msgstr "譜表を調整中..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:3885
+msgid "Sizing and allocating canvas..."
+msgstr "キャンバスのサイズと位置を調整中..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:4050
+msgid "note"
+msgstr "音符"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4050
+msgid "rest"
+msgstr "休符"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4211
+msgid "%1 - Segment Track #%2 - Notation"
+msgstr "%1 - セグメントトラック #%2 - 作譜エディタ"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4217
+msgid "%1 - All Segments - Notation"
+msgstr "%1 - 全セグメント - 作譜エディタ"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4222
+msgid ""
+"_n: %1 - Segment - Notation\n"
+"%1 - %n Segments - Notation"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:4243
+msgid "Grace"
+msgstr "装飾音"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4247
+#: ../src/gui/editors/notation/NotationView.cpp:4251
+#: ../src/gui/editors/notation/NotationView.cpp:4255
+msgid "%1 %2"
+msgstr "%1 %2"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4271
+msgid "Hidden annotations"
+msgstr "注釈を隠す"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4293
+msgid "Hidden LilyPond directives"
+msgstr "LilyPond ディレクティブを隠しました"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4326
+#, c-format
+msgid "Unknown spacing action %1"
+msgstr "不明な間隔操作 %1"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4384
+#, c-format
+msgid "Unknown proportion action %1"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:4431
+#, c-format
+msgid "Unknown font action %1"
+msgstr "不明なフォント動作 %1"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4449
+#, c-format
+msgid "Unknown font size %1"
+msgstr "不明なフォントサイズ %1"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4453
+#, c-format
+msgid "Unknown font size action %1"
+msgstr "不明なフォントサイズ動作 %1"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4780
+msgid ""
+"The Restricted paste type requires enough empty space (containing only "
+"rests) at the paste position to hold all of the events to be pasted.\n"
+"Not enough space was found.\n"
+"If you want to paste anyway, consider using one of the other paste types "
+"from the \"Paste...\" option on the Edit menu. You can also change the "
+"default paste type to something other than Restricted if you wish."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:4800
+msgid "Can't paste multiple Segments into one"
+msgstr "一か所に複数のセグメントは貼り付けできません"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4828
+#: ../src/gui/editors/notation/NotationView.cpp:4877
+msgid "Couldn't paste at this point."
+msgstr "この位置で貼り付けできません"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4896
+msgid "Move Events to Staff Above"
+msgstr "イベントを上の五線に移動"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4924
+msgid "Move Events to Staff Below"
+msgstr "イベントを下の五線に移動"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5036
+msgid "Pushing selection left..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5047
+msgid "Pushing selection right..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5058
+msgid "Pushing selection up..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5069
+msgid "Pushing selection down..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5080
+msgid "Restoring computed positions..."
+msgstr "自動処理位置を復元中"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5089
+msgid "Making visible..."
+msgstr "可視にしています"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5098
+msgid "Making invisible..."
+msgstr "非表示化中..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5185
+msgid "Beaming group..."
+msgstr "連桁を作成中"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5195
+msgid "Auto-beaming selection..."
+msgstr "選択範囲を自動連桁中"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5205
+msgid "Breaking groups..."
+msgstr "連桁を解除中"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5293
+msgid "Untupleting..."
+msgstr "連符を解除中"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5301
+msgid "Adding slur..."
+msgstr "スラー追加中..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5302
+msgid "slur"
+msgstr "スラー"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5307
+msgid "Adding phrasing slur..."
+msgstr "フレージングスラーを追加中"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5308
+msgid "phrasing slur"
+msgstr "フレージングスラー"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5313
+msgid "Adding glissando..."
+msgstr "グリサンドの追加..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5314
+msgid "glissando"
+msgstr "グリサンド"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5319
+msgid "Adding crescendo..."
+msgstr "クレッシェンドの追加..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5320
+#: ../src/gui/editors/notation/NotationView.cpp:5326
+msgid "dynamic"
+msgstr "動的"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5325
+msgid "Adding decrescendo..."
+msgstr "デクレッシェンドの追加..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5331
+#: ../src/gui/editors/notation/NotationView.cpp:5337
+#: ../src/gui/editors/notation/NotationView.cpp:5343
+#: ../src/gui/editors/notation/NotationView.cpp:5349
+msgid "Adding octave..."
+msgstr "オクターブ追加..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5332
+#: ../src/gui/editors/notation/NotationView.cpp:5338
+#: ../src/gui/editors/notation/NotationView.cpp:5344
+#: ../src/gui/editors/notation/NotationView.cpp:5350
+msgid "ottava"
+msgstr "オクターブ(8va)"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5366
+msgid "Can't add overlapping %1 indications"
+msgstr "重ねて演奏記号 %1 を追加することができません"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5375
+msgid "Making chord..."
+msgstr "和音を作成中"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5387
+msgid "Normalizing rests..."
+msgstr "休符を正規化中"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5397
+msgid "Collapsing rests..."
+msgstr "休符をつなげています"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5417
+msgid "Tying notes..."
+msgstr "タイを作成中"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5427
+msgid "Untying notes..."
+msgstr "タイを解除中"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5437
+msgid "Making notes viable..."
+msgstr "音符を可視化しています"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5447
+msgid "Removing counterpoint..."
+msgstr "カウンタ位置を削除..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5457
+msgid "Pointing stems up..."
+msgstr "符幹を上にしています"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5467
+msgid "Pointing stems down..."
+msgstr "符幹を下にしています"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5478
+msgid "Restoring computed stem directions..."
+msgstr "自動処理した符幹の向きを復元中"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5488
+#: ../src/gui/editors/notation/NotationView.cpp:5498
+msgid "Positioning slurs..."
+msgstr "スラーを配置中"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5509
+msgid "Restoring slur positions..."
+msgstr "スラーの配置を復元中"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5519
+#: ../src/gui/editors/notation/NotationView.cpp:5529
+msgid "Positioning ties..."
+msgstr "タイを配置中"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5540
+msgid "Restoring tie positions..."
+msgstr "タイの位置を復元中..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5550
+msgid "Fixing notation quantization..."
+msgstr "作譜クウォンタイズを固定中"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5560
+msgid "Removing notation quantization..."
+msgstr "作譜クウォンタイズを除去中"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5577
+msgid "Changing to %1 style..."
+msgstr "%1スタイルに変更中..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5585
+#, c-format
+msgid "Unknown style action %1"
+msgstr "不明なスタイル動作 %1"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5598
+#: ../src/gui/editors/notation/NotationView.cpp:5639
+#: ../src/gui/editors/notation/NotationView.cpp:5695
+msgid "No note duration selected"
+msgstr "音符のデュレーションが1つも選択されていない"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5660
+msgid "No rest duration selected"
+msgstr "選択されたデューレションに休符はありません"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5746
+msgid "No note or rest duration selected"
+msgstr "選択されたデュレーションに音符/休符はありません"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5757
+#: ../src/gui/editors/notation/NotationView.cpp:5768
+#: ../src/gui/editors/notation/NotationView.cpp:5779
+#: ../src/gui/editors/notation/NotationView.cpp:5790
+#: ../src/gui/editors/notation/NotationView.cpp:5801
+#: ../src/gui/editors/notation/NotationView.cpp:5812
+#: ../src/gui/editors/notation/NotationView.cpp:5823
+msgid "Forcing accidentals..."
+msgstr "臨時記号を強制..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5834
+msgid "Restoring accidentals..."
+msgstr "臨時記号を再読込中..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5845
+msgid "Showing cautionary accidentals..."
+msgstr "括弧付き臨時記号を表示中..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5855
+msgid "Cancelling cautionary accidentals..."
+msgstr "括弧付き臨時記号をキャンセル中..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5884
+msgid "Interpreting selection..."
+msgstr "選択範囲を解析中"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5896
+msgid "Setting note durations..."
+msgstr "音符のデュレーションを設定..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5904
+#: ../src/gui/editors/notation/NotationView.cpp:5912
+msgid "Adding dot..."
+msgstr "符点を追加..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5934
+msgid "Text: "
+msgstr "テキスト: "
+
+#: ../src/gui/editors/notation/NotationView.cpp:5948
+msgid "Fingering: "
+msgstr "指使い:"
+
+#: ../src/gui/editors/notation/NotationView.cpp:6036
+msgid "Ornament track %1 bar %2"
+msgstr "オルナメントトラック %1 bar %2"
+
+#: ../src/gui/editors/notation/NotationView.cpp:6038
+#, c-format
+msgid "Ornament bar %1"
+msgstr "オルナメント 小節 %1"
+
+#: ../src/gui/editors/notation/NotationView.cpp:6098
+msgid "Remove Ornaments"
+msgstr "オルナメントの削除"
+
+#: ../src/gui/editors/notation/NotationView.cpp:6145
+msgid "Estimated key signature shown"
+msgstr "おおよその調号の表示"
+
+#: ../src/gui/editors/notation/NotationStaff.cpp:1249
+#: ../src/gui/editors/notation/NotationView.cpp:6202
+msgid "Sustain"
+msgstr "サステイン"
+
+#: ../src/gui/editors/notation/NotationView.cpp:6218
+msgid ""
+"There is no sustain controller defined for this device.\n"
+"Please ensure the device is configured correctly in the Manage MIDI Devices "
+"dialog in the main window."
+msgstr ""
+"このデバイスに対してサステインコントローラが1つも定義されていません。\n"
+"メインウィンドウ中のMIDIデバイス管理ダイアログ中でデバイスの構成 を正しく行っ"
+"てください。"
+
+#: ../src/gui/editors/notation/NotationView.cpp:7250
+msgid "Can't insert note: No note duration selected"
+msgstr "音符を挿入できません: 選択したデュレーションに音符はありません"
+
+#: ../src/gui/editors/notation/NotationEraser.cpp:61
+#: ../src/gui/editors/notation/NotationSelector.cpp:83
+msgid "Switch to Insert Tool"
+msgstr "挿入ツールに切り替え"
+
+#: ../src/gui/editors/notation/NotePixmapFactory.cpp:2303
+#: ../src/gui/editors/notation/NotePixmapFactory.cpp:2347
+msgid "..."
+msgstr "..."
+
+#: ../src/gui/editors/notation/NoteFontFactory.cpp:200
+msgid "Can't obtain a default font -- no fonts found"
+msgstr "規定値のフォントが得られない -- フォントが見つからない"
+
+#: ../src/gui/editors/notation/NoteFontMap.cpp:52
+#: ../src/gui/general/PresetGroup.cpp:49
+msgid "unknown error"
+msgstr "不明なエラー"
+
+#: ../src/gui/editors/notation/NoteFontMap.cpp:78
+msgid "Can't open font mapping file %1 or %2"
+msgstr "フォントマッピングファイル %1 又は %2が開けない"
+
+#: ../src/gui/editors/notation/NoteFontMap.cpp:82
+#, c-format
+msgid "Can't open font mapping file %1"
+msgstr "フォントマッピングファイル %1 が開けない"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:52
+msgid "%1-dotted-%2"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:54
+msgid "%1-dotted %2"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:57
+#, c-format
+msgid "dotted-%1"
+msgstr "付点-%1"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:59
+#, c-format
+msgid "dotted %1"
+msgstr "付点%1"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:83
+msgid "sixty-fourth note"
+msgstr "六十四分音符"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:83
+msgid "thirty-second note"
+msgstr "三十二分音符"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:84
+msgid "sixteenth note"
+msgstr "十六分音符"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:84
+msgid "eighth note"
+msgstr "八分音符"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:85
+msgid "quarter note"
+msgstr "四分音符"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:85
+msgid "half note"
+msgstr "二分音符"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:86
+msgid "whole note"
+msgstr "全音符"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:86
+msgid "double whole note"
+msgstr "倍全音符"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:89
+msgid "sixty-fourth notes"
+msgstr "六十四分音符"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:89
+msgid "thirty-second notes"
+msgstr "三十二分音符"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:90
+msgid "sixteenth notes"
+msgstr "十六分音符"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:90
+msgid "eighth notes"
+msgstr "八分音符"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:91
+msgid "quarter notes"
+msgstr "四分音符"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:91
+msgid "half notes"
+msgstr "二分音符"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:92
+msgid "whole notes"
+msgstr "全音符"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:92
+msgid "double whole notes"
+msgstr "倍全音符"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:96
+#: ../src/gui/editors/notation/NotationStrings.cpp:154
+msgid "%1 triplets"
+msgstr "%1 三連符"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:100
+#: ../src/gui/editors/notation/NotationStrings.cpp:158
+msgid "%1 triplet"
+msgstr "%1 三連符"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:143
+msgid "64th"
+msgstr "64番目"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:143
+msgid "32nd"
+msgstr "32番目"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:143
+msgid "16th"
+msgstr "16番目"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:143
+msgid "8th"
+msgstr "8番目"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:144
+msgid "quarter"
+msgstr "四分"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:144
+msgid "half"
+msgstr "二分"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:144
+msgid "whole"
+msgstr "全"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:145
+msgid "double whole"
+msgstr "倍全"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:148
+msgid "64ths"
+msgstr "64分"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:148
+msgid "32nds"
+msgstr "32分"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:148
+msgid "16ths"
+msgstr "16分"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:148
+msgid "8ths"
+msgstr "8分"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:149
+msgid "quarters"
+msgstr "四分"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:149
+msgid "halves"
+msgstr "二分"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:149
+msgid "wholes"
+msgstr "全"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:150
+msgid "double wholes"
+msgstr "倍全"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:278
+msgid "%1 ticks"
+msgstr ""
+
+#: ../src/gui/editors/notation/FontViewFrame.cpp:100
+#, c-format
+msgid "Error: Unable to match font name %1"
+msgstr "エラー: フォント名 %1 は一致してません"
+
+#: ../src/gui/editors/notation/FontViewFrame.cpp:108
+msgid "Warning: No good match for font name %1 (best is %2)"
+msgstr "警告: 一致するフォント%1がありません (%2かと思われます)"
+
+#: ../src/gui/editors/notation/FontViewFrame.cpp:116
+#, c-format
+msgid "Error: Unable to open best-match font %1"
+msgstr "エラー: フォント %1 をオープンできません"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:113
+msgid "Track %1 : \"%2\""
+msgstr "トラック%1 : \"%2\""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:119
+#, c-format
+msgid ""
+"\n"
+"Notate for: %1"
+msgstr ""
+"\n"
+"Notate for: %1"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:121
+msgid "normal"
+msgstr "通常"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:124
+msgid "small"
+msgstr "小"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:127
+msgid "tiny"
+msgstr "極小"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:131
+msgid "--"
+msgstr "--"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:156
+msgid ""
+"\n"
+"Size: %1, Bracket: %2 "
+msgstr ""
+"\n"
+"サイズ: %1, 括弧: %2 "
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:183
+msgid ""
+"\n"
+"bars [%1-%2] in %3 (tr=%4) : \"%5\""
+msgstr ""
+"\n"
+"小節 [%1-%2] in %3 (tr=%4) : \"%5\""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:190
+msgid ""
+"\n"
+"bars [%1-%2] (tr=%3) : \"%4\""
+msgstr ""
+"\n"
+"小節 [%1-%2] (tr=%3) : \"%4\""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:240
+msgid "C#"
+msgstr "C#"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:242
+msgid "Eb"
+msgstr "Eb"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:245
+msgid "F#"
+msgstr "F#"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:247
+msgid "G#"
+msgstr "G#"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:249
+msgid "Bb"
+msgstr "Bb"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:352
+msgid "%1: %2"
+msgstr "%1: %2"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:355
+#, c-format
+msgid " in %1"
+msgstr "%1 中"
+
+#: ../src/gui/editors/notation/NotationStaff.cpp:452
+msgid "Rendering staff %1..."
+msgstr "譜表 %1 をレンダリング..."
+
+#: ../src/gui/editors/notation/NotationStaff.cpp:515
+msgid "Rendering notes on staff %1..."
+msgstr "譜表上の音符をレンダリング..."
+
+#: ../src/gui/editors/notation/NotationStaff.cpp:583
+msgid "Positioning staff %1..."
+msgstr "譜表 %1 をポジショニング..."
+
+#: ../src/gui/editors/notation/NotationSelectionPaster.cpp:85
+msgid "Ready."
+msgstr "準備完了。"
+
+#: ../src/gui/editors/notation/RestInserter.cpp:62
+msgid "Dotted rest"
+msgstr "付点休符"
+
+#: ../src/gui/editors/notation/NoteStyleFileReader.cpp:57
+#, c-format
+msgid "Can't open style file %1"
+msgstr "スタイルファイル %1がオープンできない"
+
+#: ../src/gui/editors/notation/NoteStyleFileReader.cpp:92
+msgid "type is a required attribute of note"
+msgstr "タイプは要求された音符の属性である"
+
+#: ../src/gui/editors/notation/NoteStyleFileReader.cpp:101
+#, c-format
+msgid "Unrecognised note name %1"
+msgstr "認識できないノート名 %1"
+
+#: ../src/gui/editors/notation/NoteStyleFileReader.cpp:108
+msgid "global element must precede note elements"
+msgstr ""
+
+#: ../src/gui/editors/notation/NoteStyleFileReader.cpp:137
+msgid ""
+"global and note elements may have shape or charname attribute, but not both"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationVLayout.cpp:493
+msgid ""
+"Spanned note at %1 has no HEIGHT_ON_STAFF property!\n"
+"This is a bug (the program would previously have crashed by now)"
+msgstr ""
+
+#: ../src/gui/editors/notation/NoteInserter.cpp:82
+msgid "Auto-Beam when appropriate"
+msgstr ""
+
+#: ../src/gui/editors/notation/NoteInserter.cpp:103
+msgid "Dotted note"
+msgstr "付点音符"
+
+#: ../src/gui/editors/notation/NoteInserter.cpp:120
+msgid "Switch to Inserting Rests"
+msgstr "休符の挿入に切り替え"
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:98
+msgid "Collapse Rests"
+msgstr "休符をつなげる"
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:102
+msgid "Respell as Flat"
+msgstr "フラットに読み替え"
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:106
+msgid "Respell as Sharp"
+msgstr "シャープに読み替え"
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:110
+msgid "Respell as Natural"
+msgstr "ナチュラルに読み替え"
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:114
+msgid "Collapse Notes"
+msgstr "音符をつなげる"
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:130
+msgid "Make Invisible"
+msgstr "不可視にする"
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:134
+msgid "Make Visible"
+msgstr "可視にする"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:129
+msgid "Event filters"
+msgstr "イベントフィルタ"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:138
+msgid "Rest"
+msgstr "Rest"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:139
+msgid "Indication"
+msgstr "Indication"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:141
+msgid "Other"
+msgstr "Other"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:161
+msgid "Triggered Segment Properties"
+msgstr "トリガーセグメントプロパティ"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:166
+msgid "Label: "
+msgstr "ラベル:"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:176
+msgid "Base pitch: "
+msgstr "ベースピッチ: "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:183
+msgid "Base velocity: "
+msgstr "ベースベロシティ: "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:246
+msgid "Duration "
+msgstr "デュレーション"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:247
+msgid "Event Type "
+msgstr "イベントタイプ "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:248
+msgid "Pitch "
+msgstr "ピッチ "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:249
+msgid "Velocity "
+msgstr "ベロシティ "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:250
+msgid "Type (Data1) "
+msgstr "タイプ (Data1) "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:251
+msgid "Value (Data2) "
+msgstr "値 (Data2) "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:461
+msgid "(group %1) "
+msgstr "(グループ %1)"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:519
+msgid "<no events at this filter level>"
+msgstr "<このフィルタレベルではイベント無し>"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:521
+msgid "<no events>"
+msgstr "<イベント無し>"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:696
+msgid "Segment label"
+msgstr "セグメントラベル"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:696
+msgid "Label:"
+msgstr "ラベル:"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1123
+msgid "&Insert Event"
+msgstr "イベントの挿入(&I)"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1130
+msgid "&Delete Event"
+msgstr "イベントの削除(&D)"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1137
+msgid "&Edit Event"
+msgstr "イベントの挿入(&E)"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1144
+msgid "&Advanced Event Editor"
+msgstr "高度なイベントエディタ(&A)"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1518
+msgid "Open in Event Editor"
+msgstr "イベントエディタ中でオープン"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1519
+msgid "Open in Expert Event Editor"
+msgstr "エキスパートイベントエディタ中でオープン"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1577
+msgid "%1 - Triggered Segment: %2"
+msgstr "%1 - トリガーセグメント: %2"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1592
+msgid "%1 - Segment Track #%2 - Event List"
+msgstr "%1 - セグメントトラック #%2 - イベントリスト"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1598
+msgid "%1 - %2 Segments - Event List"
+msgstr "%1 - %2 セグメント - イベントリスト"
+
+#: ../src/gui/rulers/TempoRuler.cpp:131
+msgid "Insert Tempo Change at Playback Position"
+msgstr "再生位置にテンポを挿入"
+
+#: ../src/gui/rulers/TempoRuler.cpp:136
+msgid "Delete Tempo Change"
+msgstr "テンポを削除"
+
+#: ../src/gui/rulers/TempoRuler.cpp:140
+msgid "Ramp Tempo to Next Tempo"
+msgstr "次のテンポに向けて徐々にテンポを変化"
+
+#: ../src/gui/rulers/TempoRuler.cpp:144
+msgid "Un-Ramp Tempo"
+msgstr "テンポの傾斜をやめる"
+
+#: ../src/gui/rulers/TempoRuler.cpp:149
+msgid "Edit Tempo..."
+msgstr "テンポを編集"
+
+#: ../src/gui/rulers/TempoRuler.cpp:153
+msgid "Edit Time Signature..."
+msgstr "拍子の編集"
+
+#: ../src/gui/rulers/TempoRuler.cpp:588
+msgid "%1.%2%3 (%4.%5%6 bpm)"
+msgstr "%1.%2%3 (%4.%5%6 bpm)"
+
+#: ../src/gui/rulers/TempoRuler.cpp:596
+msgid "%1.%2%3 bpm"
+msgstr "%1.%2%3 bpm"
+
+#: ../src/gui/rulers/TempoRuler.cpp:604
+msgid "%1 - %2.%3%4"
+msgstr "%1 - %2.%3%4"
+
+#: ../src/gui/rulers/ControlRulerEventInsertCommand.cpp:36
+msgid "Insert Controller Event"
+msgstr "コントローライベントの挿入"
+
+#: ../src/gui/rulers/ControlChangeCommand.cpp:35
+msgid "Control Change"
+msgstr "コントロールチェンジ"
+
+#: ../src/gui/rulers/PropertyViewRuler.cpp:72
+msgid "%1 controller"
+msgstr "%1コントローラ"
+
+#: ../src/gui/rulers/RawNoteRuler.cpp:453
+msgid "Track #%1, Segment \"%2\" (runtime id %3)"
+msgstr "トラック #%1, セグメント\"%2\" (runtime id %3)"
+
+#: ../src/gui/rulers/MarkerRuler.cpp:100
+msgid "Insert Marker"
+msgstr "マーカの挿入"
+
+#: ../src/gui/rulers/MarkerRuler.cpp:104
+msgid "Insert Marker at Playback Position"
+msgstr "再生位置にマーカを挿入"
+
+#: ../src/gui/rulers/MarkerRuler.cpp:109
+msgid "Delete Marker"
+msgstr "マーカーの削除"
+
+#: ../src/gui/rulers/MarkerRuler.cpp:114
+msgid "Edit Marker..."
+msgstr "マーカーの編集..."
+
+#: ../src/gui/rulers/MarkerRuler.cpp:119
+msgid ""
+"Click on a marker to move the playback pointer.\n"
+"Shift-click to set a range between markers.\n"
+"Double-click to open the marker editor."
+msgstr ""
+"再生ポインタに移動するためにはマーカをクリック。\n"
+"マーカ間の範囲を設定するためにはシフトキーを押しながらクリック。\n"
+"マーカエディタを開くためにはダブルクリック。"
+
+#: ../src/gui/rulers/ChordNameRuler.cpp:97
+msgid ""
+"Chord name ruler.\n"
+"Turn it on and off from the Settings->Rulers menu."
+msgstr ""
+"コード名ルーラー\n"
+"設定 -> ルーラーから変更してください。"
+
+#: ../src/gui/rulers/ControlRulerEventEraseCommand.cpp:37
+msgid "Erase Controller Event(s)"
+msgstr "コントローライベントの消去"
+
+#: ../src/gui/general/EditView.cpp:901
+#: ../src/gui/rulers/ControllerEventsRuler.cpp:188
+msgid "Unsupported Event Type"
+msgstr "未サポートのイベントタイプ"
+
+#: ../src/gui/rulers/ControllerEventsRuler.cpp:203
+msgid "Controller Events"
+msgstr "コントローライベント"
+
+#: ../src/gui/rulers/ControllerEventsRuler.cpp:278
+msgid "Controller Event Number"
+msgstr "コントローライベント番号"
+
+#: ../src/gui/rulers/ControllerEventsRuler.cpp:471
+msgid "Add line of controllers"
+msgstr ""
+
+#: ../src/gui/rulers/LoopRuler.cpp:89
+msgid ""
+"Click and drag to move the playback pointer.\n"
+"Shift-click and drag to set a range for looping or editing.\n"
+"Shift-click to clear the loop or range.\n"
+"Double-click to start playback."
+msgstr ""
+"クリック+ドラッグで再生ポインタをその位置に移動します。\n"
+"Shift + クリック+ドラッグで範囲、ループ又は編集領域をセットします。\n"
+"Shift + クリックでループ又は編集領域を解除します。\n"
+"ダブルクリックで編集を開始します。"
+
+#: ../src/gui/general/EditViewBase.cpp:228
+msgid "Set Segment Start Time..."
+msgstr "セグメント開始時間の設定..."
+
+#: ../src/gui/general/EditViewBase.cpp:232
+msgid "Set Segment Duration..."
+msgstr "セグメントのデュレーションを設定..."
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:56
+msgid "Load track parameters preset"
+msgstr ""
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:62
+msgid "Convert notation for..."
+msgstr "譜面変換中..."
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:86
+msgid "Select preset track parameters for:"
+msgstr "プリセットトラックパラメータの選択:"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:87
+msgid "Create appropriate notation for:"
+msgstr ""
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:89
+msgid "Category"
+msgstr "カテゴリ"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:95
+msgid "Player Ability"
+msgstr "演奏者のレベル"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:97
+msgid "Amateur"
+msgstr "アマチュア"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:98
+msgid "Professional"
+msgstr "プロフェッショナル"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:104
+msgid "Only selected segments"
+msgstr "選択されたセグメントのみ"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:106
+msgid "All segments in this track"
+msgstr "このトラック中のすべてのセグメント"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:111
+msgid "Only for new segments"
+msgstr "新しいセグメントのみ"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:113
+msgid "Convert existing segments"
+msgstr "存在するセグメントの変換"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:39
+#, c-format
+msgid "C%1"
+msgstr "C %1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:39
+#, c-format
+msgid "C#%1"
+msgstr "C#%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:39
+#, c-format
+msgid "D%1"
+msgstr "D%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:39
+#, c-format
+msgid "D#%1"
+msgstr "D#%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:40
+#, c-format
+msgid "E%1"
+msgstr "E%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:40
+#, c-format
+msgid "F%1"
+msgstr "F%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:40
+#, c-format
+msgid "F#%1"
+msgstr "F#%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:40
+#, c-format
+msgid "G%1"
+msgstr "G%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:41
+#, c-format
+msgid "G#%1"
+msgstr "G#%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:41
+#, c-format
+msgid "A%1"
+msgstr "A%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:41
+#, c-format
+msgid "A#%1"
+msgstr "A#%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:41
+#, c-format
+msgid "B%1"
+msgstr "B%1"
+
+#: ../src/gui/general/PresetGroup.cpp:95
+#, c-format
+msgid "Can't open preset file %1"
+msgstr "プリセットファイル %1がオープンできない"
+
+#: ../src/gui/general/EditView.cpp:744
+msgid "&Halve Durations"
+msgstr "デュレーションを半分にする(&H)"
+
+#: ../src/gui/general/EditView.cpp:748
+msgid "&Double Durations"
+msgstr "デュレーションを倍にする(&D)"
+
+#: ../src/gui/general/EditView.cpp:806
+msgid "Show Velocity Property Ruler"
+msgstr "ベロシティプロパティルーラーの表示"
+
+#: ../src/gui/general/EditView.cpp:825
+msgid "Insert item"
+msgstr "データの挿入"
+
+#: ../src/gui/general/EditView.cpp:831
+msgid "Erase selected items"
+msgstr "選択項目の削除"
+
+#: ../src/gui/general/EditView.cpp:835
+msgid "Clear ruler"
+msgstr "ルーラーをクリア"
+
+#: ../src/gui/general/EditView.cpp:839
+msgid "Insert line of controllers"
+msgstr "コントローラ上に複数データを挿入"
+
+#: ../src/gui/general/EditView.cpp:843
+msgid "Flip forward"
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:847
+msgid "Flip backwards"
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:851
+msgid "Draw property line"
+msgstr "プロパティ行の描画"
+
+#: ../src/gui/general/EditView.cpp:855
+msgid "Select all property values"
+msgstr "すべてのプロパティ値の選択"
+
+#: ../src/gui/general/EditView.cpp:894
+msgid "%1 Controller %2 %3"
+msgstr "%1 コントローラ %2 %3"
+
+#: ../src/gui/general/EditView.cpp:1066
+msgid "I"
+msgstr "ド"
+
+#: ../src/gui/general/EditView.cpp:1066
+msgid "II"
+msgstr "レ"
+
+#: ../src/gui/general/EditView.cpp:1066
+msgid "III"
+msgstr "ミ"
+
+#: ../src/gui/general/EditView.cpp:1066
+msgid "IV"
+msgstr "ファ"
+
+#: ../src/gui/general/EditView.cpp:1067
+msgid "V"
+msgstr "ソ"
+
+#: ../src/gui/general/EditView.cpp:1067
+msgid "VI"
+msgstr "ラ"
+
+#: ../src/gui/general/EditView.cpp:1067
+msgid "VII"
+msgstr "シ"
+
+#: ../src/gui/general/EditView.cpp:1067
+msgid "VIII"
+msgstr "ド"
+
+#: ../src/gui/general/EditView.cpp:1069
+msgid "%1 flat"
+msgstr "%1 ♭"
+
+#: ../src/gui/general/EditView.cpp:1070
+msgid "%1 sharp"
+msgstr "%1 ♯"
+
+#: ../src/gui/general/EditView.cpp:1085
+msgid "&Insert Note"
+msgstr "音符の挿入(&I)"
+
+#: ../src/gui/general/EditView.cpp:1091
+msgid "&Upper Octave"
+msgstr "1オクターブ上げる(&U)"
+
+#: ../src/gui/general/EditView.cpp:1096
+msgid "&Lower Octave"
+msgstr "一オクターブ下げる(&L)"
+
+#: ../src/gui/general/EditView.cpp:1268
+msgid "Estimated time signature shown"
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:1431
+msgid "Halving durations..."
+msgstr "デュレーションを半分に..."
+
+#: ../src/gui/general/EditView.cpp:1445
+msgid "Doubling durations..."
+msgstr "デュレーションを倍に..."
+
+#: ../src/gui/general/EditView.cpp:1469
+msgid "Rescaling..."
+msgstr "スケールの変更..."
+
+#: ../src/gui/general/EditView.cpp:1489
+msgid "By number of semitones: "
+msgstr "半音の数で: "
+
+#: ../src/gui/general/EditView.cpp:1496 ../src/gui/general/EditView.cpp:1518
+msgid "Transposing..."
+msgstr "移調中..."
+
+#: ../src/gui/general/EditView.cpp:1536
+msgid "Transposing up one semitone..."
+msgstr "半音上に移調中..."
+
+#: ../src/gui/general/EditView.cpp:1545
+msgid "Transposing up one octave..."
+msgstr "1オクターブ上に移調中..."
+
+#: ../src/gui/general/EditView.cpp:1554
+msgid "Transposing down one semitone..."
+msgstr "半音下に移調中..."
+
+#: ../src/gui/general/EditView.cpp:1563
+msgid "Transposing down one octave..."
+msgstr "1オクターブ下に移調中..."
+
+#: ../src/gui/general/EditView.cpp:1575
+msgid "Inverting..."
+msgstr "反転中..."
+
+#: ../src/gui/general/EditView.cpp:1587
+msgid "Retrograding..."
+msgstr "逆行中..."
+
+#: ../src/gui/general/EditView.cpp:1599
+msgid "Retrograde inverting..."
+msgstr "反転して逆行中..."
+
+#: ../src/gui/general/EditView.cpp:1608
+msgid "Jogging left..."
+msgstr "左にずらしています..."
+
+#: ../src/gui/general/EditView.cpp:1623
+msgid "Jogging right..."
+msgstr "右にずらしています..."
+
+#: ../src/sound/AudioFileManager.cpp:660
+#, c-format
+msgid "Downloading file %1"
+msgstr "ファイル %1 をダウンロード中"
+
+#: ../src/sound/AudioFileManager.cpp:735
+msgid "Converting audio file..."
+msgstr "オーディオファイル変換中..."
+
+#: ../src/sound/AudioFileManager.cpp:737
+msgid "Resampling audio file..."
+msgstr "オーディオファイルを再サンプリング中..."
+
+#: ../src/sound/AudioFileManager.cpp:739
+msgid "Converting and resampling audio file..."
+msgstr "オーディオファイルを変換/リサンプリング中..."
+
+#: ../src/sound/AudioFileManager.cpp:741
+msgid "Importing audio file..."
+msgstr "オーディオファイルをインポート中..."
+
+#: ../src/sound/AudioFileManager.cpp:794
+msgid "Failed to convert or resample audio file on import"
+msgstr "オーディオファイルを変換/リサンプリングしてのインポートに失敗しました"
+
+#: ../src/sequencer/main.cpp:46 ../src/sequencer/main.cpp:86
+msgid "RosegardenSequencer"
+msgstr "Rosegardenシーケンサ"
+
+#: ../src/sequencer/main.cpp:54
+msgid "JACK playback and capture ports"
+msgstr "JACKプレイバックとキャプチャポート"
+
+#: ../src/commands/segment/SegmentSyncCommand.cpp:38
+#: ../src/commands/segment/SegmentSyncCommand.cpp:44
+#: ../src/commands/segment/SegmentSyncCommand.cpp:55
+#: ../src/commands/segment/SegmentSyncCommand.cpp:63
+msgid "Sync segment parameters"
+msgstr "同期セグメントパラメータ"
+
+#: ../src/commands/segment/RenameTrackCommand.h:52
+msgid "Rename Track"
+msgstr "トラック名変更"
+
+#: ../src/commands/segment/SegmentRepeatToCopyCommand.cpp:39
+msgid "Turn Repeats into Copies"
+msgstr ""
+
+#: ../src/commands/segment/SegmentTransposeCommand.cpp:36
+#: ../src/commands/segment/SegmentTransposeCommand.cpp:42
+msgid "Change segment transposition"
+msgstr "Change segment transposition"
+
+#: ../src/commands/edit/RescaleCommand.h:50
+#: ../src/commands/segment/AudioSegmentRescaleCommand.h:62
+#: ../src/commands/segment/SegmentRescaleCommand.h:58
+msgid "Stretch or S&quash..."
+msgstr "ストレッチ/スカッシュ(&q)..."
+
+#: ../src/commands/segment/SegmentLabelCommand.h:52
+msgid "Re&label..."
+msgstr "ラベルの変更(&l)"
+
+#: ../src/commands/segment/AudioSegmentResizeFromStartCommand.cpp:39
+#: ../src/commands/segment/SegmentResizeFromStartCommand.cpp:39
+msgid "Resize Segment"
+msgstr "セグメントのリサイズ"
+
+#: ../src/commands/segment/RemoveTempoChangeCommand.h:58
+msgid "Remove &Tempo Change..."
+msgstr "テンポ変更の削除(&T)"
+
+#: ../src/commands/segment/SegmentEraseCommand.cpp:40
+#: ../src/commands/segment/SegmentEraseCommand.cpp:52
+msgid "Erase Segment"
+msgstr "セグメントの消去"
+
+#: ../src/commands/segment/AudioSegmentRescaleCommand.cpp:126
+#: ../src/commands/segment/SegmentRescaleCommand.cpp:102
+msgid "(rescaled)"
+msgstr "(再スケールした)"
+
+#: ../src/commands/segment/AudioSegmentRescaleCommand.cpp:127
+#: ../src/commands/segment/SegmentRescaleCommand.cpp:105
+msgid "%1 (rescaled)"
+msgstr "%1 (再スケールした)"
+
+#: ../src/commands/segment/PasteToTriggerSegmentCommand.cpp:47
+msgid "Paste as New Triggered Segment"
+msgstr "新しいトリガセグメントをペースト"
+
+#: ../src/commands/segment/SegmentColourMapCommand.h:52
+msgid "Change Segment Color Map..."
+msgstr "セグメントカラーマップの変更"
+
+#: ../src/commands/segment/SegmentQuickCopyCommand.h:55
+msgid "Quick-Copy Segment"
+msgstr "セグメントのクイックコピー"
+
+#: ../src/commands/segment/AudioSegmentSplitCommand.cpp:42
+msgid "Split Audio Segment"
+msgstr "オーディオセグメントを分割"
+
+#: ../src/commands/segment/AudioSegmentSplitCommand.cpp:103
+#: ../src/commands/segment/SegmentSplitCommand.cpp:135
+msgid " (split)"
+msgstr " (分割)"
+
+#: ../src/commands/segment/AudioSegmentSplitCommand.cpp:104
+#: ../src/commands/segment/SegmentSplitByRecordingSrcCommand.cpp:120
+#: ../src/commands/segment/SegmentSplitByRecordingSrcCommand.cpp:122
+#: ../src/commands/segment/SegmentSplitCommand.cpp:136
+msgid "%1 (split)"
+msgstr "%1 (分割)"
+
+#: ../src/commands/segment/SegmentLabelCommand.cpp:40
+msgid "Label Segments"
+msgstr "セグメントのラベル"
+
+#: ../src/commands/segment/OpenOrCloseRangeCommand.cpp:43
+msgid "Open or Close Range"
+msgstr "レンジを開くもしくは閉じる"
+
+#: ../src/commands/edit/TransposeCommand.h:55
+#: ../src/commands/segment/SegmentTransposeCommand.h:54
+msgid "Transpose by &Interval..."
+msgstr "間隔でトランスポーズ(&I)..."
+
+#: ../src/commands/segment/SegmentAutoSplitCommand.cpp:148
+msgid "%1 (part)"
+msgstr "%1 (パート)"
+
+#: ../src/commands/segment/AudioSegmentInsertCommand.cpp:51
+#: ../src/commands/segment/SegmentInsertCommand.cpp:43
+#: ../src/commands/segment/SegmentInsertCommand.cpp:56
+msgid "Create Segment"
+msgstr "セグメント作成"
+
+#: ../src/commands/segment/AudioSegmentInsertCommand.cpp:114
+msgid "%1 (inserted)"
+msgstr "%1 (挿入された)"
+
+#: ../src/commands/segment/AudioSegmentInsertCommand.cpp:117
+msgid "unknown audio file"
+msgstr "不明なオーディオファイル"
+
+#: ../src/commands/segment/CreateTempoMapFromSegmentCommand.cpp:40
+msgid "Set Tempos from Beat Segment"
+msgstr ""
+
+#: ../src/commands/segment/SegmentSplitByRecordingSrcCommand.h:52
+msgid "Split by &Recording Source..."
+msgstr "録音ソースで分割(&R)"
+
+#: ../src/commands/segment/SegmentColourMapCommand.cpp:40
+msgid "Change Segment Color Map"
+msgstr "セグメントのカラーマップの変更"
+
+#: ../src/commands/edit/CopyCommand.cpp:64
+#: ../src/commands/segment/SegmentQuickCopyCommand.cpp:57
+msgid "%1 (copied)"
+msgstr "%1 (コピーされた)"
+
+#: ../src/commands/segment/SegmentColourCommand.h:52
+msgid "Change Segment Color..."
+msgstr "セグメントカラーの変更"
+
+#: ../src/commands/segment/SegmentSplitByPitchCommand.cpp:170
+msgid "%1 (upper)"
+msgstr "%1 (上側)"
+
+#: ../src/commands/segment/SegmentSplitByPitchCommand.cpp:172
+msgid "%1 (lower)"
+msgstr "%1 (下側)"
+
+#: ../src/commands/segment/SegmentSingleRepeatToCopyCommand.cpp:39
+msgid "Turn Single Repeat into Copy"
+msgstr ""
+
+#: ../src/commands/segment/AddTempoChangeCommand.h:58
+msgid "Add Te&mpo Change..."
+msgstr "テンポ変更の追加(&m)..."
+
+#: ../src/commands/segment/AudioSegmentAutoSplitCommand.h:57
+#: ../src/commands/segment/SegmentAutoSplitCommand.h:53
+msgid "&Split on Silence"
+msgstr "無音部分で分割"
+
+#: ../src/commands/segment/SetTriggerSegmentBaseVelocityCommand.cpp:39
+msgid "Set Base Velocity"
+msgstr "ベースベロシティをセット"
+
+#: ../src/commands/segment/DeleteRangeCommand.cpp:43
+#: ../src/commands/segment/EraseSegmentsStartingInRangeCommand.cpp:39
+msgid "Delete Range"
+msgstr "レンジを削除"
+
+#: ../src/commands/segment/ChangeCompositionLengthCommand.h:53
+msgid "Change &Composition Start and End..."
+msgstr "このコンポジションの開始、終端小節マーカの変更(&C)..."
+
+#: ../src/commands/segment/MoveTracksCommand.h:51
+msgid "Move Tracks..."
+msgstr "トラックの移動"
+
+#: ../src/commands/segment/SegmentColourCommand.cpp:39
+msgid "Change Segment Color"
+msgstr "セグメントカラーの変更"
+
+#: ../src/commands/segment/AudioSegmentDistributeCommand.h:66
+msgid "Distribute Audio Segments over MIDI"
+msgstr "MIDI上でオーディオセグメントを配信"
+
+#: ../src/commands/segment/AudioSegmentAutoSplitCommand.cpp:147
+msgid "%1 (autosplit %2)"
+msgstr "%1 (自動分割 %2)"
+
+#: ../src/commands/segment/SetTriggerSegmentDefaultRetuneCommand.cpp:39
+msgid "Set Default Retune"
+msgstr ""
+
+#: ../src/commands/segment/AddTimeSignatureCommand.h:52
+msgid "Add Time Si&gnature Change..."
+msgstr "拍子変更を追加"
+
+#: ../src/commands/segment/AddTriggerSegmentCommand.cpp:42
+msgid "Add Triggered Segment"
+msgstr "トリガーセグメント追加"
+
+#: ../src/commands/segment/SetTriggerSegmentDefaultTimeAdjustCommand.cpp:39
+msgid "Set Default Time Adjust"
+msgstr ""
+
+#: ../src/commands/segment/RemoveTimeSignatureCommand.h:58
+msgid "Remove &Time Signature Change..."
+msgstr "拍子変更を削除"
+
+#: ../src/commands/segment/SegmentCommandRepeat.cpp:39
+msgid "Repeat Segments"
+msgstr "セグメントを繰り返し"
+
+#: ../src/commands/segment/AddTracksCommand.h:55
+msgid "Add Tracks..."
+msgstr "トラック追加..."
+
+#: ../src/commands/segment/ModifyDefaultTempoCommand.h:51
+msgid "Modify &Default Tempo..."
+msgstr "デフォルトテンポを変更(&D)..."
+
+#: ../src/commands/segment/SegmentSplitByPitchCommand.h:61
+msgid "Split by &Pitch..."
+msgstr "音程で分割(&P)"
+
+#: ../src/commands/segment/DeleteTriggerSegmentCommand.cpp:40
+msgid "Delete Triggered Segment"
+msgstr "トリガーセグメント削除"
+
+#: ../src/commands/segment/SegmentSplitCommand.cpp:42
+msgid "Split Segment"
+msgstr "セグメント分割"
+
+#: ../src/commands/segment/DeleteTracksCommand.h:51
+msgid "Delete Tracks..."
+msgstr "トラック削除..."
+
+#: ../src/commands/segment/InsertRangeCommand.cpp:42
+msgid "Insert Range"
+msgstr "レンジの挿入"
+
+#: ../src/commands/segment/DeleteRangeCommand.h:62
+msgid "Rejoin Command"
+msgstr "再結合コマンド"
+
+#: ../src/commands/segment/SetTriggerSegmentBasePitchCommand.cpp:39
+msgid "Set Base Pitch"
+msgstr "ベースピッチの設定"
+
+#: ../src/commands/segment/PasteConductorDataCommand.cpp:41
+msgid "Paste Tempos and Time Signatures"
+msgstr "テンポ/拍子をペースト"
+
+#: ../src/commands/segment/SegmentSyncClefCommand.cpp:34
+msgid "Sync segment clef"
+msgstr "セグメント音符記号に同期"
+
+#: ../src/commands/matrix/MatrixInsertionCommand.cpp:46
+#: ../src/commands/notation/NoteInsertionCommand.cpp:54
+msgid "Insert Note"
+msgstr "音符の挿入"
+
+#: ../src/commands/matrix/MatrixEraseCommand.cpp:41
+msgid "Erase Note"
+msgstr "音符の消去"
+
+#: ../src/commands/matrix/MatrixPercussionInsertionCommand.cpp:47
+msgid "Insert Percussion Note"
+msgstr "パーカッション音符の挿入"
+
+#: ../src/commands/matrix/MatrixModifyCommand.cpp:43
+msgid "Move Note"
+msgstr "音符の移動"
+
+#: ../src/commands/matrix/MatrixModifyCommand.cpp:43
+msgid "Modify Note"
+msgstr "音符の変更"
+
+#: ../src/commands/edit/PasteEventsCommand.cpp:98
+msgid "Paste into an existing gap [\"restricted\"]"
+msgstr ""
+
+#: ../src/commands/edit/PasteEventsCommand.cpp:100
+msgid "Erase existing events to make room [\"simple\"]"
+msgstr ""
+
+#: ../src/commands/edit/PasteEventsCommand.cpp:102
+msgid "Move existing events out of the way [\"open-n-paste\"]"
+msgstr ""
+
+#: ../src/commands/edit/PasteEventsCommand.cpp:104
+msgid "Overlay notes, tying against present notes [\"note-overlay\"]"
+msgstr ""
+
+#: ../src/commands/edit/PasteEventsCommand.cpp:106
+msgid "Overlay notes, ignoring present notes [\"matrix-overlay\"]"
+msgstr ""
+
+#: ../src/commands/edit/AddDotCommand.h:52
+msgid "&Add Dot"
+msgstr "付点の追加(&A)"
+
+#: ../src/commands/edit/RemoveMarkerCommand.h:55
+msgid "&Remove Marker"
+msgstr "マーカーを削除(&R)"
+
+#: ../src/commands/edit/EventUnquantizeCommand.cpp:43
+#: ../src/commands/edit/EventUnquantizeCommand.cpp:54
+msgid "Unquantize Events"
+msgstr "イベントのクォンタイズ取消"
+
+#: ../src/commands/edit/ChangeVelocityCommand.h:53
+msgid "&Increase Velocity"
+msgstr "ベロシティの増加(&I)"
+
+#: ../src/commands/edit/ChangeVelocityCommand.h:54
+msgid "&Reduce Velocity"
+msgstr "ベロシティの減少(&R)"
+
+#: ../src/commands/edit/CopyCommand.cpp:46
+msgid "(excerpt)"
+msgstr "(例外)"
+
+#: ../src/commands/edit/CopyCommand.cpp:60
+msgid "(copied)"
+msgstr "(コピーした)"
+
+#: ../src/commands/edit/EventInsertionCommand.cpp:39
+msgid "Insert Event"
+msgstr "イベントの挿入"
+
+#: ../src/commands/edit/InsertTriggerNoteCommand.cpp:55
+msgid "Insert Trigger Note"
+msgstr "トリガ音符の追加"
+
+#: ../src/commands/edit/CollapseNotesCommand.h:50
+msgid "Collapse &Equal-Pitch Notes"
+msgstr "同じ音程の音符をつなげる (&E)"
+
+#: ../src/commands/edit/TransposeCommand.h:61
+msgid "&Up a Semitone"
+msgstr "半音上げる(&U)"
+
+#: ../src/commands/edit/TransposeCommand.h:62
+msgid "&Down a Semitone"
+msgstr "半音下げる(&D)"
+
+#: ../src/commands/edit/TransposeCommand.h:63
+msgid "Up an &Octave"
+msgstr "オクターブ上げる(&O)"
+
+#: ../src/commands/edit/TransposeCommand.h:64
+msgid "Down an Octa&ve"
+msgstr "オクターブ下げる(&v)"
+
+#: ../src/commands/edit/TransposeCommand.h:65
+msgid "&Transpose by Semitones..."
+msgstr "半音単位で移調(&T)..."
+
+#: ../src/commands/edit/SetNoteTypeCommand.h:56
+msgid "&Set Note Type"
+msgstr "音符のタイプの設定(&S)"
+
+#: ../src/commands/edit/EventEditCommand.h:55
+msgid "Edit E&vent"
+msgstr "イベントの編集(&v)"
+
+#: ../src/commands/edit/AddMarkerCommand.h:54
+msgid "&Add Marker"
+msgstr "マーカーの追加(&A)"
+
+#: ../src/commands/edit/SelectionPropertyCommand.h:66
+msgid "Set &Property"
+msgstr "プロパティの設定(&P)"
+
+#: ../src/commands/edit/CutCommand.h:55
+msgid "Cu&t"
+msgstr "カット(&t)"
+
+#: ../src/commands/edit/EventQuantizeCommand.cpp:114
+msgid "Heuristic Notation &Quantize"
+msgstr "ヒューリスティック作譜クウォンタイズ(&Q)"
+
+#: ../src/commands/edit/EventQuantizeCommand.cpp:116
+msgid "Grid &Quantize"
+msgstr "グリッドにクォンタイズ"
+
+#: ../src/commands/edit/ClearTriggersCommand.h:52
+msgid "&Clear Triggers"
+msgstr "トリガをクリア(&C)"
+
+#: ../src/commands/edit/RetrogradeCommand.h:51
+msgid "&Retrograde"
+msgstr "逆行(&R)"
+
+#: ../src/commands/edit/InvertCommand.h:51
+msgid "&Invert"
+msgstr "反転(&I)"
+
+#: ../src/commands/edit/SetTriggerCommand.h:64
+msgid "Tri&gger Segment"
+msgstr "セグメントのトリガ(&g)"
+
+#: ../src/commands/edit/SetLyricsCommand.h:50
+msgid "Edit L&yrics"
+msgstr "歌詞の編集(&y)"
+
+#: ../src/commands/edit/MoveAcrossSegmentsCommand.cpp:73
+msgid "&Move Events to Other Segment"
+msgstr "イベントを他のセグメントに移動(&M)"
+
+#: ../src/commands/edit/RetrogradeInvertCommand.h:51
+msgid "Re&trograde Invert"
+msgstr "逆行して反転(&t)"
+
+#: ../src/commands/edit/ModifyMarkerCommand.h:55
+msgid "&Modify Marker"
+msgstr "マーカーを修正(&M)"
+
+#: ../src/commands/studio/AddControlParameterCommand.h:61
+msgid "&Add Control Parameter"
+msgstr "コントロールパラメータの追加(&A)"
+
+#: ../src/commands/studio/ModifyInstrumentMappingCommand.h:55
+msgid "Modify &Instrument Mapping"
+msgstr "インストゥルメントマッピングの変更(&I)"
+
+#: ../src/commands/studio/RemoveControlParameterCommand.h:60
+msgid "&Remove Control Parameter"
+msgstr "コントロールパラメータの削除(&R)"
+
+#: ../src/commands/studio/ReconnectDeviceCommand.h:55
+msgid "Reconnect Device"
+msgstr "デバイスを再接続"
+
+#: ../src/commands/studio/ModifyDeviceCommand.h:68
+msgid "Modify &MIDI Bank"
+msgstr "MIDIバンクを修正(&M)"
+
+#: ../src/commands/studio/CreateOrDeleteDeviceCommand.h:68
+msgid "Create Device"
+msgstr "デバイスを作成"
+
+#: ../src/commands/studio/ModifyDeviceMappingCommand.h:55
+msgid "Modify &Device Mapping"
+msgstr "デバイスマッピングの変更(&D)"
+
+#: ../src/commands/studio/RenameDeviceCommand.h:55
+msgid "Rename Device"
+msgstr "デバイス名の変更"
+
+#: ../src/commands/studio/ModifyControlParameterCommand.h:61
+msgid "&Modify Control Parameter"
+msgstr "コントロールパラメータの変更(&M)"
+
+#: ../src/commands/notation/TieNotesCommand.h:49
+msgid "&Tie"
+msgstr "タイ(&T)"
+
+#: ../src/commands/notation/ClefInsertionCommand.cpp:74
+msgid "Add Cle&f Change..."
+msgstr "音部記号の追加(&f)"
+
+#: ../src/commands/notation/GuitarChordInsertionCommand.cpp:40
+msgid "Insert Guitar Chord"
+msgstr "ギターコードの挿入"
+
+#: ../src/commands/notation/RespellCommand.cpp:47
+#, c-format
+msgid "Respell with %1"
+msgstr "%1 で再描画"
+
+#: ../src/commands/notation/RespellCommand.cpp:50
+msgid "Do&uble Sharp"
+msgstr "##(&u)"
+
+#: ../src/commands/notation/RespellCommand.cpp:52
+msgid "&Sharp"
+msgstr "#(&S)"
+
+#: ../src/commands/notation/RespellCommand.cpp:54
+msgid "&Flat"
+msgstr "♭(&F)"
+
+#: ../src/commands/notation/RespellCommand.cpp:56
+msgid "Dou&ble Flat"
+msgstr "♭♭(&b)"
+
+#: ../src/commands/notation/RespellCommand.cpp:58
+msgid "&Natural"
+msgstr "ナチュラル(&N)"
+
+#: ../src/commands/notation/RespellCommand.cpp:60
+msgid "N&one"
+msgstr "なし(&o)"
+
+#: ../src/commands/notation/RespellCommand.cpp:66
+msgid "Respell Accidentals &Upward"
+msgstr "臨時記号を上に読み替え(&U)"
+
+#: ../src/commands/notation/RespellCommand.cpp:69
+msgid "Respell Accidentals &Downward"
+msgstr "臨時記号を下に読み替え(&D)"
+
+#: ../src/commands/notation/RespellCommand.cpp:72
+msgid "&Restore Accidentals"
+msgstr "臨時記号の復帰(&R)"
+
+#: ../src/commands/notation/RespellCommand.cpp:75
+msgid "Respell Accidentals"
+msgstr "臨時記号を再描画"
+
+#: ../src/commands/notation/DeCounterpointCommand.h:55
+msgid "Split-and-Tie Overlapping &Chords"
+msgstr "和音上の音符を分割してタイでつなぐ(&C)"
+
+#: ../src/commands/notation/BeamCommand.h:49
+msgid "&Beam Group"
+msgstr "連桁(&B)"
+
+#: ../src/commands/notation/AddTextMarkCommand.h:51
+msgid "Add Te&xt Mark..."
+msgstr "テキストマークの追加(&x)..."
+
+#: ../src/commands/notation/RestoreSlursCommand.h:49
+msgid "&Restore Slur Positions"
+msgstr "スラー位置の復帰(&R)"
+
+#: ../src/commands/notation/SustainInsertionCommand.h:56
+msgid "Add Pedal &Press"
+msgstr "ペダルプレス追加(&P)"
+
+#: ../src/commands/notation/SustainInsertionCommand.h:58
+msgid "Add Pedal &Release"
+msgstr "ペダルリリース追加(&P)"
+
+#: ../src/commands/notation/FixNotationQuantizeCommand.h:49
+msgid "Fi&x Notation Quantization"
+msgstr "作譜クウォンタイズを固定(&X)"
+
+#: ../src/commands/notation/ChangeStemsCommand.h:51
+msgid "Stems &Up"
+msgstr "符幹を上に(&U)"
+
+#: ../src/commands/notation/ChangeStemsCommand.h:51
+msgid "Stems &Down"
+msgstr "符幹を下に(&D)"
+
+#: ../src/commands/notation/MakeAccidentalsCautionaryCommand.cpp:43
+msgid "Use &Cautionary Accidentals"
+msgstr "括弧付き臨時符号の使用(&C)"
+
+#: ../src/commands/notation/MakeAccidentalsCautionaryCommand.cpp:45
+msgid "Cancel C&autionary Accidentals"
+msgstr "括弧付き臨時符号の中止"
+
+#: ../src/commands/notation/SetVisibilityCommand.h:50
+msgid "Set Visibility"
+msgstr "表示の設定"
+
+#: ../src/commands/notation/ChangeStyleCommand.h:53
+msgid "Change &Note Style"
+msgstr "音符スタイルの変更(&N)"
+
+#: ../src/commands/notation/TextInsertionCommand.cpp:41
+msgid "Insert Text"
+msgstr "テキストの挿入"
+
+#: ../src/commands/notation/InterpretCommand.h:70
+msgid "&Interpret..."
+msgstr "解析(&I)"
+
+#: ../src/commands/notation/TupletCommand.h:53
+msgid "&Triplet"
+msgstr "三連符(&T)"
+
+#: ../src/commands/notation/TupletCommand.h:54
+msgid "Tu&plet..."
+msgstr "連符(&p)"
+
+#: ../src/commands/notation/UnTupletCommand.h:50
+msgid "&Untuplet"
+msgstr "連符解除(&U)"
+
+#: ../src/commands/notation/CollapseRestsCommand.h:54
+msgid "&Collapse Rests"
+msgstr "休符をつなげる(&C)"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:145
+msgid "Add S&lur"
+msgstr "スラー追加(&l)"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:147
+msgid "Add &Phrasing Slur"
+msgstr "フレージングスラーを追加(&P)"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:149
+msgid "Add Double-Octave Up"
+msgstr "クィンデチマ・アルタ"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:151
+msgid "Add Octave &Up"
+msgstr "オッターヴァ・アルタ(&U)"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:153
+msgid "Add Octave &Down"
+msgstr "オッターヴァ・バッサ(&D)"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:155
+msgid "Add Double Octave Down"
+msgstr "クィンデチマ・バッサ"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:160
+msgid "Add &Crescendo"
+msgstr "クレッシェンドの追加(&C)"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:162
+msgid "Add &Decrescendo"
+msgstr "デクレッシェンドの追加(&D)"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:164
+msgid "Add &Glissando"
+msgstr "グリサンドの追加(&G)"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:167
+msgid "Add &%1%2"
+msgstr "&%1%2の追加"
+
+#: ../src/commands/notation/RemoveNotationQuantizeCommand.h:49
+msgid "Remo&ve Notation Quantization"
+msgstr "作譜クウォンタイズを除去(&V)"
+
+#: ../src/commands/notation/MakeChordCommand.h:50
+msgid "Make &Chord"
+msgstr "和音化(&C)"
+
+#: ../src/commands/notation/MultiKeyInsertionCommand.h:63
+msgid "Change all to &Key %1..."
+msgstr "すべてをキー%1に変更(&K)..."
+
+#: ../src/commands/notation/KeyInsertionCommand.h:67
+#: ../src/commands/notation/MultiKeyInsertionCommand.h:65
+msgid "Add &Key Change..."
+msgstr "キーチェンジの追加(&K)"
+
+#: ../src/commands/notation/RestoreStemsCommand.h:49
+msgid "&Restore Stems"
+msgstr "符幹の復帰(&R)"
+
+#: ../src/commands/notation/MakeNotesViableCommand.h:55
+#: ../src/commands/notation/MakeRegionViableCommand.h:52
+msgid "Tie Notes at &Barlines"
+msgstr "小節線前後で音符をタイでつなぐ(&B)"
+
+#: ../src/commands/notation/AddSlashesCommand.h:46
+msgid "Slashes"
+msgstr "スラッシュ"
+
+#: ../src/commands/notation/ChangeSlurPositionCommand.h:51
+msgid "Slur &Above"
+msgstr "上にスラー(&A)"
+
+#: ../src/commands/notation/ChangeSlurPositionCommand.h:51
+msgid "Slur &Below"
+msgstr "下にスラー(&B)"
+
+#: ../src/commands/notation/NormalizeRestsCommand.h:54
+msgid "&Normalize Rests"
+msgstr "休符の正規化(&N)"
+
+#: ../src/commands/notation/TextChangeCommand.cpp:41
+msgid "Edit Text"
+msgstr "テキストの編集"
+
+#: ../src/commands/notation/RemoveMarksCommand.h:49
+msgid "&Remove All Marks"
+msgstr "すべてのマークを削除(&R)"
+
+#: ../src/commands/notation/AutoBeamCommand.h:52
+msgid "&Auto-Beam"
+msgstr "自動連桁(&A)"
+
+#: ../src/commands/notation/UntieNotesCommand.h:49
+msgid "&Untie"
+msgstr "タイを解除(&U)"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:48
+msgid "S&forzando"
+msgstr "スフォルツァンド(&f)"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:50
+msgid "Sta&ccato"
+msgstr "スタッカート(&c)"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:52
+msgid "R&inforzando"
+msgstr "リンフォルツァート(&i)"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:54
+msgid "T&enuto"
+msgstr "テヌート(&e)"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:56
+msgid "Tri&ll"
+msgstr "トリル(&l)"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:58
+msgid "Trill &with Line"
+msgstr "波線付きのトリル(&w)"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:60
+msgid "Trill Line"
+msgstr "トリル用波線の追加"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:62
+msgid "&Turn"
+msgstr "ターン(&T)"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:64
+msgid "&Accent"
+msgstr "アクセント(&A)"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:66
+msgid "&Staccatissimo"
+msgstr "スタッカーティシモ(&S)"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:68
+msgid "&Marcato"
+msgstr "マルカート(&M)"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:70
+msgid "&Pause"
+msgstr "フェルマータ(&P)"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:72
+msgid "&Up-Bow"
+msgstr "上げ弓(&U)"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:74
+msgid "&Down-Bow"
+msgstr "下げ弓(&D)"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:76
+msgid "Mo&rdent"
+msgstr "モルデント(&r)"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:78
+msgid "Inverted Mordent"
+msgstr "反転したモルデント"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:80
+msgid "Long Mordent"
+msgstr "長いモルデント"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:82
+msgid "Lon&g Inverted Mordent"
+msgstr "長い反転したモルデント(&g)"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:84
+msgid "&%1%2"
+msgstr "&%1%2"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:89
+#, c-format
+msgid "Add %1"
+msgstr "%1の追加"
+
+#: ../src/commands/notation/ResetDisplacementsCommand.h:49
+msgid "Restore Positions"
+msgstr "計算した位置を復帰"
+
+#: ../src/commands/notation/IncrementDisplacementsCommand.h:52
+msgid "Fine Reposition"
+msgstr "高解像度"
+
+#: ../src/commands/notation/RestoreTiesCommand.h:49
+msgid "&Restore Tie Positions"
+msgstr "タイ位置を復帰(&R)"
+
+#: ../src/commands/notation/ChangeTiePositionCommand.h:47
+msgid "Tie &Above"
+msgstr "上にタイ(&A)"
+
+#: ../src/commands/notation/ChangeTiePositionCommand.h:47
+msgid "Tie &Below"
+msgstr "下にタイ(&B)"
+
+#: ../src/commands/notation/KeyInsertionCommand.h:65
+msgid "Change to &Key %1..."
+msgstr "キー%1に変更(&K)"
+
+#: ../src/commands/notation/RemoveFingeringMarksCommand.h:49
+msgid "&Remove Fingerings"
+msgstr "指使い削除(&R)"
+
+#: ../src/commands/notation/BreakCommand.h:49
+msgid "&Unbeam"
+msgstr "連桁解除(&U)"
+
+#: ../src/commands/notation/UnGraceCommand.h:48
+msgid "Ung&race"
+msgstr "装飾音符解除(&r)"
+
+#: ../src/commands/notation/AddFingeringMarkCommand.cpp:45
+msgid "Add Other &Fingering..."
+msgstr "その他の指使い(&F)..."
+
+#: ../src/commands/notation/AddFingeringMarkCommand.cpp:47
+msgid "Add Fingering &0 (Thumb)"
+msgstr "指&0を追加(Thumb)"
+
+#: ../src/commands/notation/AddFingeringMarkCommand.cpp:49
+#, c-format
+msgid "Add Fingering &%1"
+msgstr "指&%1を追加"
+
+#: ../src/document/io/HydrogenXMLHandler.cpp:277
+msgid " imported from Hydrogen "
+msgstr " Hydrogen からインポートされた "
+
+#: ../src/document/io/LilyPondExporter.cpp:404
+msgid ""
+"LilyPond does not allow spaces or backslashes in filenames.\n"
+"\n"
+"Would you like to use\n"
+"\n"
+" %1\n"
+"\n"
+" instead?"
+msgstr ""
+"Lilypondのファイル名には空白やバックスラッシュは使えません。\n"
+"\n"
+"代わりに\n"
+"\n"
+" %1\n"
+"\n"
+"を使いますか?"
+
+#: ../src/document/io/LilyPondExporter.cpp:2054
+msgid "warning: overlong bar truncated here"
+msgstr "警告:長すぎる小節線はここで打ち切られました"
+
+#: ../src/document/io/LilyPondExporter.cpp:2060
+msgid "warning: bar too short, padding with rests"
+msgstr "警告: 音符が足りないので休符で埋めます"
+
+#: ../src/document/MultiViewCommandHistory.cpp:318
+msgid "Nothing to undo"
+msgstr "アンドゥできません"
+
+#: ../src/document/MultiViewCommandHistory.cpp:320
+msgid "Nothing to redo"
+msgstr "リドゥできません"
+
+#: ../src/document/MultiViewCommandHistory.cpp:328
+#: ../src/document/MultiViewCommandHistory.cpp:372
+#, c-format
+msgid "Und&o %1"
+msgstr "%1のアンドゥ(&o)"
+
+#: ../src/document/MultiViewCommandHistory.cpp:330
+#: ../src/document/MultiViewCommandHistory.cpp:374
+#, c-format
+msgid "Re&do %1"
+msgstr "%1のリドゥ(&d)"
+
+#: ../src/document/RosegardenGUIDoc.cpp:328
+msgid ""
+"The current file has been modified.\n"
+"Do you want to save it?"
+msgstr ""
+"ファイルが変更されています。\n"
+"セーブしますか?"
+
+#: ../src/document/RosegardenGUIDoc.cpp:480
+#, c-format
+msgid ""
+"_n: Delete the 1 audio file recorded during the unsaved session?\n"
+"Delete the %n audio files recorded during the unsaved session?"
+msgstr ""
+"未保存のセッション中の録音された%n個のオーディオファイルを削除してよいですか?"
+
+#: ../src/document/RosegardenGUIDoc.cpp:501
+msgid ""
+"The following audio files were recorded during this session but have been "
+"unloaded\n"
+"from the audio file manager, and so are no longer in use in the document you "
+"are saving.\n"
+"\n"
+"You may want to clean up these files to save disk space.\n"
+"\n"
+"Please select any you wish to delete permanently from the hard disk.\n"
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:517
+#, c-format
+msgid ""
+"_n: <qt>About to delete 1 audio file permanently from the hard disk."
+"<br>There will be no way to recover this file.<br>Are you sure?</qt>\n"
+"\n"
+"<qt>About to delete %n audio files permanently from the hard disk.<br>There "
+"will be no way to recover these files.<br>Are you sure?</qt>"
+msgstr ""
+"<qt>%nつのオーディオファイルを恒久的にハードディスクから削除することについ"
+"て。<br>これを元に戻す方法はありません。<br>よろしいですか?</qt>"
+
+#: ../src/document/RosegardenGUIDoc.cpp:580
+msgid "Can't open file '%1'"
+msgstr "'%1'ファイルが開けません"
+
+#: ../src/document/RosegardenGUIDoc.cpp:585
+msgid "Reading file..."
+msgstr "ファイルを読み込み中..."
+
+#: ../src/document/RosegardenGUIDoc.cpp:603
+msgid "Could not open Rosegarden file"
+msgstr "Rosegardenファイルを開けません"
+
+#: ../src/document/RosegardenGUIDoc.cpp:641
+msgid "Error when parsing file '%1': \"%2\""
+msgstr "ファイル '%1'を解釈中にエラー:\"%2\""
+
+#: ../src/document/RosegardenGUIDoc.cpp:689
+msgid "Generating audio previews..."
+msgstr "オーディオプレビューを生成中..."
+
+#: ../src/document/RosegardenGUIDoc.cpp:721
+msgid "Merge"
+msgstr "マージ"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1605
+msgid "File load cancelled"
+msgstr "ロードを中止しました"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1625
+msgid ""
+"<h3>Audio and plugins not available</h3><p>This composition uses audio files "
+"or plugins, but Rosegarden is currently running without audio because the "
+"JACK audio server was not available on startup.</p><p>Please exit "
+"Rosegarden, start the JACK audio server and re-start Rosegarden if you wish "
+"to load this complete composition.</p><p><b>WARNING:</b> If you re-save this "
+"composition, all audio and plugin data and settings in it will be lost.</p>"
+msgstr ""
+"<h3>オーディオとプラグインが無効です</h3><p>このコンポジション は、オーディオ"
+"ファイル又はプラグインを使いますが、起動時にJackオーディオサーバが無効だった"
+"ため、現在Rosegardenはオーディオなしで動いています。</p><p>このコンポジション"
+"を完全にロードしたいので あれば、Rosegardenをいったん終了し、Jackオーディオ"
+"サーバを起動 してRosegardenを再起動してください。</p><p><b>注意:</b> もしも、"
+"このコンポジションを再度セーブすると、すべてのオーディオ とプラグインデータと"
+"設定がすべてなくなります。</p>"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1628
+msgid ""
+"<h3>Audio and plugins not available</h3><p>This composition uses audio files "
+"or plugins, but you are running a version of Rosegarden that was compiled "
+"without audio support.</p><p><b>WARNING:</b> If you re-save this composition "
+"from this version of Rosegarden, all audio and plugin data and settings in "
+"it will be lost.</p>"
+msgstr ""
+"<h3>オーディオとプラグインが無効です</h3><p>このコンポジション は、オーディオ"
+"ファイル又はプラグインを使いますが、Rosegardenはオーディオサポート無しでコン"
+"パイルされています。</p><p><b>注意:</b> もしも、このコンポジションを再度セー"
+"ブすると、すべてのオーディオ とプラグインデータと設定がすべてなくなります。</"
+"p>"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1665
+msgid ""
+"<h3>Incorrect audio sample rate</h3><p>This composition contains audio files "
+"that were recorded or imported with the audio server running at a different "
+"sample rate (%1 Hz) from the current JACK server sample rate (%2 Hz).</"
+"p><p>Rosegarden will play this composition at the correct speed, but any "
+"audio files in it will probably sound awful.</p><p>Please consider re-"
+"starting the JACK server at the correct rate (%3 Hz) and re-loading this "
+"composition before you do any more work with it.</p>"
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:1675
+msgid ""
+"<h3>Inconsistent audio sample rates</h3><p>This composition contains audio "
+"files at more than one sample rate.</p><p>Rosegarden will play them at the "
+"correct speed, but any audio files that were recorded or imported at rates "
+"different from the current JACK server sample rate (%1 Hz) will probably "
+"sound awful.</p><p>Please see the audio file manager dialog for more "
+"details, and consider resampling any files that are at the wrong rate.</p>"
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:1676
+msgid "Inconsistent sample rates"
+msgstr "インストゥルメントサンプルレート"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1690
+msgid ""
+"<h3>Plugins not found</h3><p>The following audio plugins could not be loaded:"
+"</p><ul>"
+msgstr ""
+"<h3>プラグインが見つかりません</h3><p>プラグインをロードすることができません"
+"でした:</p>"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1698
+msgid "<li>%1 (from %2)</li>"
+msgstr "<li>%1 (from %2)</li>"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1712
+msgid ""
+"This file contains one or more old element types that are now deprecated.\n"
+"Support for these elements may disappear in future versions of Rosegarden.\n"
+"We recommend you re-save this file from this version of Rosegarden to ensure "
+"that it can still be re-loaded in future versions."
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:2207
+msgid "Insert Recorded MIDI"
+msgstr "録音したMIDIを挿入"
+
+#: ../src/document/RosegardenGUIDoc.cpp:2560
+msgid "%1 (recorded)"
+msgstr "%1 (録音済)"
+
+#: ../src/document/RoseXmlHandler.cpp:442
+msgid ""
+"This file was written by Rosegarden %1, and it uses\n"
+"a different file format that cannot be read by this version."
+msgstr ""
+"このファイルはRosegaarden %1で書き込まれたが、このバージョンでは\n"
+"読めない異なったファイル形式として使われる。"
+
+#: ../src/document/RoseXmlHandler.cpp:452
+msgid ""
+"This file was written by Rosegarden %1, which is more recent than this "
+"version.\n"
+"There may be some incompatibilities with the file format."
+msgstr ""
+"このファイルは Rosegarden %1によって書かれています。これは 現在のバージョン"
+"よりも新しいものです。\n"
+"ファイルフォーマットに何らかの非互換項目がある可能性があります。"
+
+#: ../src/document/RoseXmlHandler.cpp:1687
+msgid "Loading plugins..."
+msgstr "プラグインを読み込み中..."
+
+#: rc.cpp:6 rc.cpp:144
+#, no-c-format
+msgid "Se&gment"
+msgstr "セグメント(&g)"
+
+#: rc.cpp:9 rc.cpp:84 rc.cpp:147 rc.cpp:303
+#, no-c-format
+msgid "Edit &With"
+msgstr "エディタ(&W)"
+
+#: rc.cpp:12 rc.cpp:21 rc.cpp:30 rc.cpp:39 rc.cpp:345
+#, no-c-format
+msgid "Actions Toolbar"
+msgstr "アクションツールバー"
+
+#: rc.cpp:15 rc.cpp:33 rc.cpp:129 rc.cpp:285
+#, no-c-format
+msgid "Time Toolbar"
+msgstr "時間ツールバー"
+
+#: rc.cpp:18 rc.cpp:36 rc.cpp:57 rc.cpp:63 rc.cpp:120 rc.cpp:243 rc.cpp:342
+#, no-c-format
+msgid "Transport Toolbar"
+msgstr "トランスポートツールバー"
+
+#: rc.cpp:24 rc.cpp:42 rc.cpp:123 rc.cpp:348
+#, no-c-format
+msgid "Zoom Toolbar"
+msgstr "ズームツールバー"
+
+#: rc.cpp:45 rc.cpp:60 rc.cpp:99 rc.cpp:228 rc.cpp:327
+#, no-c-format
+msgid "T&ransport"
+msgstr "トランスポート(&r)"
+
+#: rc.cpp:51
+#, no-c-format
+msgid "Number of Stereo &Inputs"
+msgstr "ステレオ入力"
+
+#: rc.cpp:54
+#, no-c-format
+msgid "&Number of Submasters"
+msgstr "サブマスターズ"
+
+#: rc.cpp:66
+#, no-c-format
+msgid "&Import"
+msgstr "インポート(&I)"
+
+#: rc.cpp:69
+#, no-c-format
+msgid "&Merge"
+msgstr "マージ(&M)"
+
+#: rc.cpp:72
+#, no-c-format
+msgid "&Export"
+msgstr "エクスポート(&M)"
+
+#: rc.cpp:75 rc.cpp:141 rc.cpp:297
+#, no-c-format
+msgid "&Composition"
+msgstr "コンポジション(&C)"
+
+#: rc.cpp:78
+#, no-c-format
+msgid "&Studio"
+msgstr "スタジオ(&S)"
+
+#: rc.cpp:81
+#, no-c-format
+msgid "Se&gments"
+msgstr "セグメント(&g)"
+
+#: rc.cpp:90
+#, no-c-format
+msgid "Trac&ks"
+msgstr "トラック(&k)"
+
+#: rc.cpp:93
+#, no-c-format
+msgid "Set &Instrument"
+msgstr "インストゥルメントを設定(&I)"
+
+#: rc.cpp:102 rc.cpp:234 rc.cpp:333
+#, no-c-format
+msgid "&Toolbars"
+msgstr "ツールバー(&T)"
+
+#: rc.cpp:105 rc.cpp:237 rc.cpp:336
+#, no-c-format
+msgid "&Rulers"
+msgstr "ルーラ(&R)"
+
+#: rc.cpp:111 rc.cpp:240 rc.cpp:339
+#, no-c-format
+msgid "Tools Toolbar"
+msgstr "道具ツールバー"
+
+#: rc.cpp:114
+#, no-c-format
+msgid "Tracks Toolbar"
+msgstr "トラックツールバー"
+
+#: rc.cpp:117
+#, no-c-format
+msgid "Editors Toolbar"
+msgstr "編集ツールバー"
+
+#: rc.cpp:135
+#, no-c-format
+msgid "&Layout Mode"
+msgstr "レイアウトモード(&L)"
+
+#: rc.cpp:138 rc.cpp:294
+#, no-c-format
+msgid "Add Event Ruler"
+msgstr "イベントルーラーの追加"
+
+#: rc.cpp:150
+#, no-c-format
+msgid "N&ote"
+msgstr "音符(&o)"
+
+#: rc.cpp:153
+#, no-c-format
+msgid "Mar&ks"
+msgstr "マーク(&k)"
+
+#: rc.cpp:156
+#, no-c-format
+msgid "&Ornaments"
+msgstr "オルナメント(&O)"
+
+#: rc.cpp:159
+#, no-c-format
+msgid "&Fingerings"
+msgstr "指使い(&F)"
+
+#: rc.cpp:162
+#, no-c-format
+msgid "S&lashes"
+msgstr "スラッシュ(&l)"
+
+#: rc.cpp:165 rc.cpp:219
+#, no-c-format
+msgid "&Accidentals"
+msgstr "臨時記号(&A)"
+
+#: rc.cpp:168
+#, no-c-format
+msgid "&Phrase"
+msgstr "フレーズ(&P)"
+
+#: rc.cpp:171
+#, no-c-format
+msgid "Slur &Position"
+msgstr "スラー位置(&P)"
+
+#: rc.cpp:174
+#, no-c-format
+msgid "Tie &Position"
+msgstr "タイ位置(&P)"
+
+#: rc.cpp:177
+#, no-c-format
+msgid "&Octaves"
+msgstr "オクターブ(&O)"
+
+#: rc.cpp:180 rc.cpp:306
+#, no-c-format
+msgid "Ad&just"
+msgstr "調整(&d)"
+
+#: rc.cpp:183
+#, no-c-format
+msgid "R&ests"
+msgstr "休符(&e)"
+
+#: rc.cpp:186 rc.cpp:213
+#, no-c-format
+msgid "&Notes"
+msgstr "音符(&N)"
+
+#: rc.cpp:189 rc.cpp:309
+#, no-c-format
+msgid "&Quantize"
+msgstr "クォンタイズ(&Q)"
+
+#: rc.cpp:195 rc.cpp:315
+#, no-c-format
+msgid "Trans&pose"
+msgstr "移調(&p)"
+
+#: rc.cpp:198 rc.cpp:318
+#, no-c-format
+msgid "Convert"
+msgstr "変換"
+
+#: rc.cpp:201
+#, no-c-format
+msgid "&Fine Positioning"
+msgstr "位置微調整(&F)"
+
+#: rc.cpp:204
+#, no-c-format
+msgid "Fine Ti&ming"
+msgstr "音符位置微調整(&m)"
+
+#: rc.cpp:207
+#, no-c-format
+msgid "&Visibility"
+msgstr "表示方法(&V)"
+
+#: rc.cpp:216
+#, no-c-format
+msgid "&Rests"
+msgstr "休符(&R)"
+
+#: rc.cpp:222
+#, no-c-format
+msgid "&Clefs"
+msgstr "音部記号(&C)"
+
+#: rc.cpp:225 rc.cpp:324
+#, no-c-format
+msgid "Local &Cursor"
+msgstr "ローカルカーソル(&C)"
+
+#: rc.cpp:246
+#, no-c-format
+msgid "Notes Toolbar"
+msgstr "音符ツールバー"
+
+#: rc.cpp:249
+#, no-c-format
+msgid "Rests Toolbar"
+msgstr "休符ツールバー"
+
+#: rc.cpp:252
+#, no-c-format
+msgid "Clefs Toolbar"
+msgstr "音部記号ツールバー"
+
+#: rc.cpp:255
+#, no-c-format
+msgid "Accidentals Toolbar"
+msgstr "臨時記号ツールバー"
+
+#: rc.cpp:258
+#, no-c-format
+msgid "Group Toolbar"
+msgstr "グループツールバー"
+
+#: rc.cpp:261
+#, no-c-format
+msgid "Marks Toolbar"
+msgstr "アーティキュレーションツールバー"
+
+#: rc.cpp:264
+#, no-c-format
+msgid "Meta Toolbar"
+msgstr "メタツールバー"
+
+#: rc.cpp:267
+#, no-c-format
+msgid "Layout Toolbar"
+msgstr "レイアウトツールバー"
+
+#: rc.cpp:270 rc.cpp:351
+#, no-c-format
+msgid "Control Ruler actions"
+msgstr "ルーラの動作の制御"
+
+#: rc.cpp:273 rc.cpp:354
+#, no-c-format
+msgid "Property Ruler actions"
+msgstr "ルーラの動作のプロパティ"
+
+#: rc.cpp:276
+#, no-c-format
+msgid "&Action"
+msgstr "動作(&A)"
+
+#: rc.cpp:279
+#, no-c-format
+msgid "General Toolbar"
+msgstr "汎用ツールバー"
+
+#: rc.cpp:291
+#, no-c-format
+msgid "&Grid"
+msgstr "グリッド(&G)"
+
+#: rc.cpp:300
+#, no-c-format
+msgid "&Segment"
+msgstr "セグメント(&S)"
+
+#: rc.cpp:361
+#, no-c-format
+msgid "Hide additional controls"
+msgstr "追加のコントロールを隠す"
+
+#: rc.cpp:365
+#, no-c-format
+msgid "Panic Button"
+msgstr "パニックボタン"
+
+#: rc.cpp:368
+#, no-c-format
+msgid "Resets all MIDI devices if you've got stuck notes"
+msgstr ""
+
+#: rc.cpp:375
+#, no-c-format
+msgid "Provides a metronome click for you to play along with"
+msgstr ""
+
+#: rc.cpp:378
+#, no-c-format
+msgid "Shows MIDI activity in and out of Rosegarden"
+msgstr "Rosegarden入出力MIDIアクティビティの表示"
+
+#: rc.cpp:381
+#, no-c-format
+msgid "IN"
+msgstr "IN"
+
+#: rc.cpp:384
+#, no-c-format
+msgid "OUT"
+msgstr "OUT"
+
+#: rc.cpp:387 rc.cpp:390
+#, no-c-format
+msgid "NO EVENTS"
+msgstr "NO EVENTS"
+
+#: rc.cpp:397
+#, no-c-format
+msgid "Record either MIDI or audio"
+msgstr "MIDI又はオーディオを録音"
+
+#: rc.cpp:401
+#, no-c-format
+msgid "Loop"
+msgstr "ループ"
+
+#: rc.cpp:404
+#, no-c-format
+msgid "Turn on and off the loop markers (if set)"
+msgstr "(もしも設定されているなら)ループマーカを反転"
+
+#: rc.cpp:411
+#, no-c-format
+msgid "Mutes all but the currently selected track"
+msgstr "選択トラック以外をミュート"
+
+#: rc.cpp:415
+#, no-c-format
+msgid "Start loop or range here"
+msgstr "ループ/レンジの開始点"
+
+#: rc.cpp:419
+#, no-c-format
+msgid "End loop or range here"
+msgstr "ループ/レンジの終了点"
+
+#: rc.cpp:422
+#, no-c-format
+msgid "SIG"
+msgstr "SIG"
+
+#: rc.cpp:425
+#, no-c-format
+msgid "DIV"
+msgstr "DIV"
+
+#: rc.cpp:428
+#, no-c-format
+msgid "/16"
+msgstr "/16"
+
+#: rc.cpp:431
+#, no-c-format
+msgid "TEMPO"
+msgstr "TEMPO"
+
+#: rc.cpp:434
+#, no-c-format
+msgid "END"
+msgstr "END"
+
+#: rc.cpp:437
+#, no-c-format
+msgid "BAR"
+msgstr "BAR"
+
+#: rc.cpp:441
+#, no-c-format
+msgid "Switch between real time, musical time, and frame count"
+msgstr "実時間, Musical Time, フレームカウントの切り替え"
+
+#: rc.cpp:445
+#, no-c-format
+msgid "Show additional controls"
+msgstr "追加のコントロールの表示"
+
+#: rc.cpp:449
+#, no-c-format
+msgid "Rewind"
+msgstr "巻き戻し"
+
+#: rc.cpp:452
+#, no-c-format
+msgid "Moves the current pointer position back one bar."
+msgstr "現在のポインタ位置を1小節前に移動"
+
+#: rc.cpp:456
+#, no-c-format
+msgid "Rewind to beginning"
+msgstr "最初まで巻き戻し"
+
+#: rc.cpp:459
+#, no-c-format
+msgid ""
+"Moves the pointer position to the start of the composition. (This may mean "
+"going forwards if the pointer is currently before the start.)"
+msgstr ""
+"ポインタ位置をコンポジションの最初に移動(これは開始時点の前に ポインタがいた"
+"場合、先に進むことを意味します)"
+
+#: rc.cpp:463
+#, no-c-format
+msgid "Play/Pause"
+msgstr "再生/一時停止"
+
+#: rc.cpp:466
+#, no-c-format
+msgid ""
+"Plays from the current pointer position, or pauses playback if already in "
+"progress."
+msgstr "現在のポインタ一から再生かすでに再生中ならば再生を一時停止"
+
+#: rc.cpp:473
+#, no-c-format
+msgid "Stops playback or recording."
+msgstr "再生か録音を停止"
+
+#: rc.cpp:477
+#, no-c-format
+msgid "Fast forward"
+msgstr "早送り"
+
+#: rc.cpp:480
+#, no-c-format
+msgid "Moves the current pointer position forwards one bar."
+msgstr "現在のポインタ位置を1小節先に移動"
+
+#: rc.cpp:484
+#, no-c-format
+msgid "Fast forward to end"
+msgstr "末端まで早送り"
+
+#: rc.cpp:487
+#, no-c-format
+msgid ""
+"Moves the pointer position to the end of the composition. (This may mean "
+"going backwards if the pointer is already beyond the end.)"
+msgstr ""
+"ポインタ位置をコンポジションの最後に移動(これは終了時点の先に ポインタがいた"
+"場合、元に戻ることを意味します)"
+
+#: rc.cpp:491
+#, no-c-format
+msgid "Display time to end"
+msgstr "末端までの時間を表示"
+
+#: ../docs/en/tips.cpp:3
+msgid ""
+"<p>To configure a track to play using a particular instrument:</p>\n"
+"&nbsp;&nbsp;* click on the track label and hold a moment<br>\n"
+"&nbsp;&nbsp;* select an output device<br>\n"
+"&nbsp;&nbsp;* select one of that device's available instruments (#1 - #16)"
+"<br>\n"
+"&nbsp;&nbsp;* adjust that instrument's output channel, program, bank, and\n"
+"controllers via the instrument parameters box\n"
+msgstr ""
+"<p>演奏するためにトラックを構成するためには、特定のインスツルメントを使う:</"
+"p>\n"
+"&nbsp;&nbsp;*トラックラベルをクリックし、しばらく保持する<br>\n"
+"&nbsp;&nbsp;*出力デバイスを選択<br>\n"
+"&nbsp;&nbsp;*(#1 - #16の中の)そのデバイスの有効なインスツルメントの1つを選択"
+"<br>\n"
+"&nbsp;&nbsp;*そのインスツルメントの出力チャンネル、プログラム、バンクとコント"
+"ローラを、\n"
+"インスツルメントパラメータボックス経由で調整\n"
+
+#: ../docs/en/tips.cpp:13
+msgid ""
+"<p>...that Rosegarden has an autosave feature?<br><br>\n"
+"You can select your autosave interval from <b>Settings->Configure\n"
+"Rosegarden</b>.<br><br>\n"
+"When something goes awry, such as a power outage or a Rosegarden crash\n"
+"(unfortunately, it happens...) simply load the file you were working on, and "
+"you'll be given the\n"
+"option to load the autosaved version, or the unmodified original.</p>\n"
+msgstr ""
+"<p>...Rosegardeは自動保存機能を持っていますか?<br><br>\n"
+"自動保存間隔を<b>設定->Rosegardenの構成\n"
+"</b>で構成可能です<br><br>\n"
+"何かが失敗に終わる場合;たとえば電源異常やRosegardenの クラッシュ(不運にも起き"
+"るときには起きる)のときは、\n"
+"単に使っていたファイルを再ロードし、自動セーブしたバージョンを\n"
+"ロードするオプションを与えるか、変更していないオリジナルを指定して ください</"
+"p>\n"
+
+#: ../docs/en/tips.cpp:23
+msgid ""
+"<p>\n"
+"...that you can save the current document as your default studio by using\n"
+"<b>Composition -> Studio -> Save Current Document as Default Studio</b>?</"
+"p>\n"
+msgstr ""
+"<p>\n"
+"<b>Composition -> スタジオ -> 現在のスタジオを既定値のスタジオに\n"
+"保存</b>を使うことによって、現在のドキュメントを既定値のスタジオに保存できま"
+"す</p>\n"
+
+#: ../docs/en/tips.cpp:30
+msgid ""
+"<p>...that your default studio is a complete Rosegarden composition that "
+"gets\n"
+"loaded every time you create a new document or import a MIDI file?</p>\n"
+msgstr ""
+"<p>...that your default studio is a complete Rosegarden composition that "
+"gets\n"
+"loaded every time you create a new document or import a MIDI file?</p>\n"
+
+#: ../docs/en/tips.cpp:36
+msgid ""
+"<p>...that your default studio can contain instrument assignments, document "
+"properties, LilyPond headers,\n"
+"and many other things?<br><br>The default studio is a complete Rosegarden "
+"composition, so it can contain anything that you may wish to have available "
+"in each\n"
+"new document you create.</p>\n"
+msgstr ""
+"<p>規定値のスタジオはインスツルメントの割り当て、文書のプロ パティ、 LilyPond"
+"ヘッダと\n"
+"その他を含めることができます。<br><br> 規定値のスタジオは完全な Rosegardenコ"
+"ンポジションであり、作成したおのおのの\n"
+"新しい文書中で 有効にしたい全てのものを含むことができます。</p>\n"
+
+#: ../docs/en/tips.cpp:43
+msgid ""
+"<p>...that Rosegarden will detect and create a default connection for ALSA "
+"soft\n"
+"synth applications that are started after Rosegarden is already running?</"
+"p>\n"
+msgstr ""
+"<p>Rosegardenは自動的にALSAソフトシンセサイザを検出し規定値の接続を作成し、そ"
+" れは\n"
+"Rosegardenがすでに動作している後に開始しますか?</p>\n"
+
+#: ../docs/en/tips.cpp:49
+msgid ""
+"<p>...that you can make your default studio override that in every "
+"Rosegarden composition you load?<br><br>If your studio setup does not change "
+"very often, and you would prefer for\n"
+"the settings in your default studio to take precedence over whatever\n"
+"studio is saved with any files you happen to load, you can make your studio "
+"the default for everything using <b>Settings -> Configure Rosegarden ->\n"
+"MIDI -> Always use default studio when loading files</b>.</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:57
+msgid ""
+"<p>If you have accidentally recorded a segment so short that it does not\n"
+"appear on the canvas, which you can only hear during subsequent recording\n"
+"sessions, you can gain access to it by using <b>Composition -> Change\n"
+"Composition Start and End</b> and then setting the composition to start at a "
+"negative number.</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:65
+msgid ""
+"<p>...that if you place a note at the wrong pitch using the notation or "
+"matrix editor, you can move it one semitone at a time with the up and down "
+"arrow keys on your keyboard?</p>\n"
+msgstr ""
+"<p>もしも音譜エディタやマトリクスエディタを使って間違ったピッチで 音符を配置"
+"したら、キーボード上の上下矢印キーを使って半音単位で 移動することができます。"
+"</p>\n"
+
+#: ../docs/en/tips.cpp:70
+msgid ""
+"<p>...that you can toggle stem directions in the notation editor by "
+"selecting\n"
+"one or more notes and using Ctrl-PageUp and Ctrl-PageDown?</p>\n"
+msgstr ""
+"<P>譜面エディタ中で、1つ又はそれ以上の音符を選択して、Ctrl-PageupとCtrl-"
+"PageDownキーを使うことで、 譜幹の方向を変更することができます。</P>\n"
+
+#: ../docs/en/tips.cpp:76
+msgid ""
+"<p>...that you can change the accidental used for a note in the notation "
+"editor (without changing the pitch of the note) by selecting\n"
+"it and using the up and down arrow keys with both Ctrl and Shift pressed?</"
+"p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:82 ../docs/en/tips.cpp:93
+msgid ""
+"<p>...that you can hold down the Shift key while repositioning segments on "
+"the\n"
+"segment canvas in order to avoid the \"snap-to\" effect and exert finer "
+"control?</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:88
+msgid ""
+"<p>...that you can use the arrow tool to draw, move, and resize segments and "
+"events as well as to select them?<br><br>Drag a segment or event block to "
+"move it, drag the right edge of a block to resize it, and drag with the "
+"middle mouse button pressed to draw a new segment or event.<br><br>(Of "
+"course, the dedicated draw, move and resize tools are still quicker for "
+"repeated operations.)</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:99
+msgid ""
+"<p>...that you can hold down the Shift key while repositioning or resizing "
+"events in the\n"
+"matrix view in order to avoid the \"snap-to\" effect and exert finer control?"
+"</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:105
+msgid ""
+"<p>...that you can edit multiple segments on multiple tracks simultaneously "
+"in\n"
+"the notation editor? Simply select the segments, then use <b>Edit -> Open "
+"in Notation Editor</b>.</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:111
+msgid ""
+"<p>...that Rosegarden can export files for use by LilyPond, the high-quality "
+"score typesetting system?<br><br>\n"
+"From the <b>File</b> menu, navigate to <b>Export -> Export LilyPond File</"
+"b></p>\n"
+msgstr ""
+"<p>Rosegardenは、高品位なスコア作成システムであるLilyPondが使うファイルを出力"
+"できますか?<br><br>\n"
+"From the <b>ファイル</b>メニューから <b>エクスポート ->LilyPondファイルのエク"
+"スポート</b>を選んでください</p>\n"
+
+#: ../docs/en/tips.cpp:117
+msgid ""
+"<p>...that Rosegarden can print via LilyPond, the high-quality score "
+"typesetting system?<br><br>\n"
+"From the <b>File</b> menu, navigate to <b>Preview with LilyPond</b>. The "
+"file\n"
+"will be exported, rendered, and a preview will appear in KPDF, or one of\n"
+"several other PDF viewers, where it can then be printed as well.</p>\n"
+msgstr ""
+"<p>Rosegardenは、高品位なスコア作成システムであるLilyPondが使うファイルを出力"
+"できますか?<br><br>\n"
+"<b>ファイル</b>メニューから <b>LilyPondでプレビュー</b>を選んでください</p> "
+"ファイル\n"
+"はエクスポートされ、描画され、KPDF中で表示されるか、その他の\n"
+"PDFビューワのどれかで表示されます。そして印刷することができます。 </P>\n"
+
+#: ../docs/en/tips.cpp:125
+msgid ""
+"<p>...that if you use the quantizer from within the notation view, you can "
+"tell it to quantize only the timing used for notation -- making it possible "
+"to have good looking notation <b>and</b> a human MIDI performance?</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:130
+msgid ""
+"<p>...that you can change segment labels using the controls on the Segment "
+"Parameters box\n"
+"in the main window?</p>\n"
+msgstr ""
+"<P>メインウィンドウ中のセグメントパラメータボックス上のコントロール を使うこ"
+"とで、セグメントのラベルを変更することができます。</p>\n"
+
+#: ../docs/en/tips.cpp:136
+msgid ""
+"<p>...that the number of tracks in new documents is based on the contents "
+"of\n"
+"your autoload.rg file?\n"
+"<br><br>\n"
+"Whether you prefer to start with three tracks or 43, create a document that\n"
+"contains the desired number of tracks, plus any other studio or document "
+"properties settings\n"
+"you wish to configure, and use <b>Composition -> Studio -> Save Current "
+"Document as Default\n"
+"Studio</b> to make this your new default.</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:147
+msgid ""
+"<p>...that you can change the name of a track by double clicking on the "
+"label? (The\n"
+"label must be visible for this to work.)</p>\n"
+msgstr ""
+"<p>ラベル上でダブルクリックすることでトラックの名前を変更できる? \n"
+"(ラベルはこの作業時には可視状態になっていなければならない)</p>\n"
+
+#: ../docs/en/tips.cpp:153
+msgid ""
+"<p>...that you can configure what happens when you double-click on a segment?"
+"<br><br>Go to <b>Settings -> Configure Rosegarden</b> and choose your "
+"preferred editing window under the <b>Behaviour</b> tab.</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:158
+msgid ""
+"<p>...that Rosegarden is being developed as a community effort with\n"
+"contributions from around the world?<br><br>\n"
+"The four most active developers live in London (England), Cannes, "
+"Barcelona,\n"
+"and... Christiansburg? (Christiansburg is a town of about 50,000 in\n"
+"southwestern Virginia, USA.)<br><br>\n"
+"We have had contributors from elsewhere in the US, UK, Spain, Mexico, "
+"Argentina, Germany,\n"
+"Sweden, Russia, Japan, Finland, and Italy, just to name a few...</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:169
+msgid ""
+"<p>...that Rosegarden is available in Spanish, French, German, Russian, "
+"Welsh, Swedish, Italian and Estonian\n"
+"translations? (Just to name a few.)<br><br>\n"
+"If you're interested in translating Rosegarden to another language, drop us "
+"a\n"
+"line at <b>[email protected]</b>.</p>\n"
+msgstr ""
+"<p>Rosegardenはスペイン語、フランス語、ドイツ語、ロシア語、 ウェールズ語、ス"
+"ウェーデン語、イタリア語とエストニア語に翻訳されて います(Just to name a "
+"few.)。<br><br>\n"
+"もしも他の言語への翻訳に興味があるならば、\n"
+"<b>[email protected]</b>に コンタクトしてください</p>\n"
+
+#: ../docs/en/tips.cpp:177
+msgid ""
+"<p>...that you can change the total number of bars in the composition via\n"
+"<b>Composition -> Change Composition Start and End</b>?</p>\n"
+msgstr ""
+"<P><b>コンポジション->コンポジションの開始と終了</b>を使う ことで、コンポジ"
+"ション中の全部の小節の数を変更することができます </p>\n"
+
+#: ../docs/en/tips.cpp:183
+msgid ""
+"<p>...that you can see the difference between performance and display "
+"duration\n"
+"of duration-quantized notes in the notation editor?<br><br>\n"
+"Use <b>Settings -> Show Raw Note Ruler</b> to turn on this handy\n"
+"feature.<br><br>\n"
+"<i>Note that this feature does not work in page layout view.</i></p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:192
+msgid ""
+"<p>...that you can add tempo and time-signature changes by double-clicking "
+"on the values displayed in the transport window or tempo rulers?</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:197
+msgid ""
+"<p>...that the transport window can display musical time, sample frame "
+"count, and a visual metronome as well as real time?<br><br>Just click on the "
+"small button at the extreme top left of the window.</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:202
+msgid ""
+"<p>...that you can select all notes of a particular pitch in the matrix "
+"view, by shift-clicking on that pitch on the piano keyboard at the left?"
+"<br><br>If you shift-click-drag, you can select whole ranges too.</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:207
+msgid ""
+"<p>...that you can set a loop in the main window by clicking-and-dragging on "
+"the time ruler with Shift pressed?<br><br>(If the ruler isn't visible, use "
+"<b>Settings -> Show Rulers</b>.)</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:212
+msgid ""
+"<p>...that if you're editing a section in the matrix or notation view, you "
+"can\n"
+"set that section to loop while you edit it?<br><br>Select it and use "
+"<b>Tools ->\n"
+"Local Cursor -> Set Loop to Selection</b>, then hit Play.</p><br><br>\n"
+"<i>This feature does not work quite as well for compositions that include "
+"sampled\n"
+"audio.</i>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:221
+msgid ""
+"<p>...if you have more than one note or controller event at the same time, "
+"you\n"
+"can use the [ and ] keys to flip the stack of events around on the "
+"controller\n"
+"and velocity rulers in order to bring the item you wish to adjust into\n"
+"focus.</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:229
+msgid ""
+"<p>...that the notation view shows you notes using their display duration, "
+"while the\n"
+"matrix allows you to edit their performance duration?<br><br>\n"
+"<i>Be careful with tied notes in the matrix. It is not apparent that they "
+"are\n"
+"tied, and if you split up a pair of tied notes, subsequent notation views "
+"will\n"
+"be confused and unhappy. This is an old bug that has been on our TODO list\n"
+"for years. Sorry about that, folks. Patches welcome.</i>\n"
+"</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:240
+msgid ""
+"<p>If you're working with a human performance and you need to insert some "
+"new\n"
+"notes, these new notes will sound for their entire written duration. To "
+"blend\n"
+"these new notes into a human performance, select them, then use <b>Adjust -> "
+"Interpret...</b> \n"
+"from the notation view to interpret any marks and massage their "
+"performance\n"
+"durations to something less mechanical.</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:249
+msgid ""
+"<p>...that Rosegarden can export certain things to LilyPond that it cannot "
+"yet\n"
+"display within its own native interface?<br><br>These new directives can be "
+"inserted\n"
+"via the <b>T</b> text insert tool in the notation view.<br><br>\n"
+"Load the example files\n"
+"<b>lilypond-alternative-endings.rg</b> and <b>lilypond-directives.rg</b> for "
+"a\n"
+"demonstration of how to use the new exportable directives.<br><br>\n"
+"Use <b>File -> Preview with\n"
+"LilyPond</b> to see what they look like on the exported page.<br><br>\n"
+"<i>Be sure to turn on\n"
+"<b>Settings -> Show LilyPond Directives</b> and <b>Show Annotations</b> "
+"within\n"
+"the notation view.</i></p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:264
+msgid ""
+"<p>...that Rosegarden has track parameters allowing you to <b>Create "
+"segments with:</b> certain\n"
+"properties by default?<br><br>You can pre-select the clef, transposition, "
+"colour, and specify\n"
+"the highest and lowest playable notes (notes outside this range display in\n"
+"red by default). Then draw a segment with the pencil, or record one, and "
+"any\n"
+"new segments created on this track will take these properties as segment\n"
+"parameters.<br><br>\n"
+"<i>These parameters do not apply to audio tracks.</i></p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:275
+msgid ""
+"<p>...that Rosegarden has a database of preset parameters describing more "
+"than 300\n"
+"musical instruments from the real world, grouped into several convenient\n"
+"categories?<br><br>Each preset contains a clef, transposition, and playable "
+"range\n"
+"suggestions for both amateur and professional players.<br><br>Click the\n"
+"<b>Load</b> button in the new track parameters box to get started! <i>(If "
+"you\n"
+"do not see a <b>Load</b> button, be sure your parameter panel is set for\n"
+"tabbed mode, rather than stacked mode.)</i> <br><br> <i>(Special thanks to "
+"Magnus\n"
+"Johansson for assembling this extraordinary database.)</i></p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:287
+msgid ""
+"<p>...that when exporting to Lilypond, you can merge tracks that have the "
+"same name onto a single staff?<br><br>For example, if there are three voices "
+"in a single part, write each\n"
+"voice as an independent segment/staff, each on a separate track. Give all\n"
+"three tracks the same name, and select <b>[x] Merge tracks that have the "
+"same\n"
+"name</b> from the options dialog that appears when you export to, or "
+"preview\n"
+"with LilyPond.<br><br>\n"
+"<i>The tracks must have a non-default name for this to work.</i></p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:297
+msgid ""
+" \t \n"
+"<p>...that you can use the mouse wheel to scroll up and down, scroll left "
+"and right, and zoom in and out?<br><br>Just roll the wheel to scroll up or "
+"down. Hold Alt as well to scroll left or right, or hold Ctrl to zoom in and "
+"out.</p> \t \n"
+msgstr ""
+" \t \n"
+"<p>マウスホイールを、スクロールアップとダウン、スクロールレフトとライト、ズー"
+"ムイン/アウトに使うことができます。<br><br>単にホイールを 回せばスクロール"
+"アップ/ダウン、Altキーを押すとスクロールレフト/ライト、 Ctrlキー通すとズーム"
+"イン/アウトになります。</p> \t \n"
+
+#: ../docs/en/tips.cpp:303
+msgid ""
+" \t \n"
+"<p>...that you can time-stretch an audio segment -- stretching or squashing "
+"a\n"
+"sample to a different duration without changing its pitch -- just by\n"
+"dragging its right edge with the Ctrl key pressed?</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:311
+msgid ""
+" \t \n"
+"<p>...that you can add audio to your Rosegarden composition just by dragging "
+"an audio file from your file manager and dropping it on the Rosegarden "
+"segment canvas? (Make sure you drop it on an audio track!)<br><br>You can "
+"also drop audio files from Rosegarden's audio file manager window onto the "
+"segment canvas, and from other programs onto the audio file manager.</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:317
+msgid ""
+" \t \n"
+"<p>...that you can set the tempo to match the duration of an audio segment "
+"if you know it's an exact number of bars or beats long?<br><br>Just select "
+"the audio segment and use <b>Composition -> Tempo and Time Signature -> Set "
+"Tempo to Audio Segment Duration</b>.</p>\n"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:1
+msgid "Feta Pixmaps"
+msgstr "Fetaのピックスマップ"
+
+#: ../data/fonts/mappings/fonts.cpp:2 ../data/fonts/mappings/fonts.cpp:7
+msgid "GNU Lilypond"
+msgstr "GNU Lilypond"
+
+#: ../data/fonts/mappings/fonts.cpp:3 ../data/fonts/mappings/fonts.cpp:8
+msgid "Copyright (c) 1997--2003 Han-Wen Nienhuys and Jan Nieuwenhuizen"
+msgstr "Copyright (c) 1997--2003 Han-Wen Nienhuys and Jan Nieuwenhuizen"
+
+#: ../data/fonts/mappings/fonts.cpp:4 ../data/fonts/mappings/fonts.cpp:9
+#: ../data/fonts/mappings/fonts.cpp:14 ../data/fonts/mappings/fonts.cpp:19
+#: ../data/fonts/mappings/fonts.cpp:24 ../data/fonts/mappings/fonts.cpp:29
+#: ../data/fonts/mappings/fonts.cpp:34 ../data/fonts/mappings/fonts.cpp:39
+#: ../data/fonts/mappings/fonts.cpp:44 ../data/fonts/mappings/fonts.cpp:49
+#: ../data/fonts/mappings/fonts.cpp:54
+msgid "Chris Cannam"
+msgstr "Chris Cannam"
+
+#: ../data/fonts/mappings/fonts.cpp:5 ../data/fonts/mappings/fonts.cpp:40
+msgid "pixmap"
+msgstr "ピックスマップ"
+
+#: ../data/fonts/mappings/fonts.cpp:6
+msgid "Feta"
+msgstr "Feta"
+
+#: ../data/fonts/mappings/fonts.cpp:10 ../data/fonts/mappings/fonts.cpp:15
+#: ../data/fonts/mappings/fonts.cpp:20 ../data/fonts/mappings/fonts.cpp:25
+#: ../data/fonts/mappings/fonts.cpp:30 ../data/fonts/mappings/fonts.cpp:35
+#: ../data/fonts/mappings/fonts.cpp:45 ../data/fonts/mappings/fonts.cpp:50
+#: ../data/fonts/mappings/fonts.cpp:55
+msgid "scalable"
+msgstr "スケーラブル"
+
+#: ../data/fonts/mappings/fonts.cpp:11
+msgid "Fughetta"
+msgstr "Fughetta"
+
+#: ../data/fonts/mappings/fonts.cpp:12
+msgid ""
+"Created by Blake Hodgetts; freely redistributable. See http://www.efn.org/"
+"~bch/aboutfonts.html"
+msgstr ""
+"Blake Hodgettsにより作成;自由に再配布可能。http://www.efh.org/~bch/"
+"aboutfonts.htmlを参照。"
+
+#: ../data/fonts/mappings/fonts.cpp:13
+msgid "Copyright 1995-1999 Blake Hodgetts"
+msgstr "著作権 1995-1999 Blake Hodgetts"
+
+#: ../data/fonts/mappings/fonts.cpp:16
+msgid "Inkpen"
+msgstr "Inkpen"
+
+#: ../data/fonts/mappings/fonts.cpp:17
+msgid "Inkpen is part of Sibelius, but other fonts may use the same mappings."
+msgstr ""
+"InkpenはSibeliusの一部であるが、その他のフォントは同じマッピングで使える。"
+
+#: ../data/fonts/mappings/fonts.cpp:18 ../data/fonts/mappings/fonts.cpp:28
+msgid "Copyright Sibelius Software Ltd"
+msgstr "著作権 Sibelius Software Ltd"
+
+#: ../data/fonts/mappings/fonts.cpp:21
+msgid "Maestro"
+msgstr "Maestro"
+
+#: ../data/fonts/mappings/fonts.cpp:22
+msgid "Maestro is part of Finale, but other fonts use the same mappings."
+msgstr ""
+"MaestroはFinalの一部であるが、その他のフォントは同じマッピングで使える。"
+
+#: ../data/fonts/mappings/fonts.cpp:23 ../data/fonts/mappings/fonts.cpp:33
+msgid "Copyright Coda Inc"
+msgstr "著作権 Coda Inc"
+
+#: ../data/fonts/mappings/fonts.cpp:27
+msgid "Opus is part of Sibelius, but other fonts may use the same mappings."
+msgstr "OpusはSibeliusの一部であるが、フォントは同じマッピングを使ってもよい。"
+
+#: ../data/fonts/mappings/fonts.cpp:31
+msgid "Petrucci"
+msgstr "Petrucci"
+
+#: ../data/fonts/mappings/fonts.cpp:32
+msgid "Petrucci is part of Finale, but other fonts use the same mappings."
+msgstr ""
+"PetrucciはFinareの一部であるが、その他のフォントは同じマッピングで使える。"
+
+#: ../data/fonts/mappings/fonts.cpp:36
+msgid "RG21"
+msgstr "RG21"
+
+#: ../data/fonts/mappings/fonts.cpp:37
+msgid "Rosegarden 2.1"
+msgstr "Rosegarden 2.1"
+
+#: ../data/fonts/mappings/fonts.cpp:38
+msgid "Copyright (c) 1994--2001 Chris Cannam"
+msgstr "Copyright (c) 1994--2001 Chris Cannam"
+
+#: ../data/fonts/mappings/fonts.cpp:41
+msgid "Sonata"
+msgstr "Sonata"
+
+#: ../data/fonts/mappings/fonts.cpp:42
+msgid "Adobe"
+msgstr "Adobe"
+
+#: ../data/fonts/mappings/fonts.cpp:43
+msgid "Copyright Adobe Inc"
+msgstr "Copyright Adobe Inc"
+
+#: ../data/fonts/mappings/fonts.cpp:46
+msgid "Steinberg"
+msgstr "Steinberg"
+
+#: ../data/fonts/mappings/fonts.cpp:47
+msgid "The Steinberg Notation font is part of Cubase."
+msgstr "Steinberg Notation fontはCubaseの一部です。"
+
+#: ../data/fonts/mappings/fonts.cpp:48
+msgid "Copyright Steinberg Inc"
+msgstr "著作権 Steinberg Inc"
+
+#: ../data/fonts/mappings/fonts.cpp:51
+msgid "Xinfonia"
+msgstr "Xinfonia"
+
+#: ../data/fonts/mappings/fonts.cpp:52
+msgid "xemo.org"
+msgstr "xemo.org"
+
+#: ../data/fonts/mappings/fonts.cpp:53
+msgid "Copyright 2001-2003 Xemus Software LLC"
+msgstr "Copyright 2001-2003 Xemus Software LLC"
+
+#: ../data/styles/styles.cpp:1
+msgid "Classical"
+msgstr "クラシカル"
+
+#: ../data/styles/styles.cpp:2
+msgid "Cross"
+msgstr "クロス"
+
+#: ../data/styles/styles.cpp:3
+msgid "Mensural"
+msgstr "Mensural"
+
+#: ../data/styles/styles.cpp:4
+msgid "Triangle"
+msgstr "三連符"
diff --git a/po/messages.sh b/po/messages.sh
new file mode 100755
index 0000000..8368795
--- /dev/null
+++ b/po/messages.sh
@@ -0,0 +1,101 @@
+#!/bin/bash
+
+# Based on KDE messages.sh by Thomas Nagy
+# Inspired by Makefile.common from coolo
+# This script is used to update the .po files.
+
+# To update the translations, you will need a specific gettext
+# patched for kde and a lot of patience, tenacity, luck, time ..
+
+# I guess one should only update the .po files when all .cpp files
+# are generated (after a make or scons)
+
+if [ -z "$KDE_GETTEXT_BIN" ]; then
+ if [ -f ./xgettext ] && ./xgettext --help 2>&1 | grep -q extract; then
+ KDE_GETTEXT_BIN=.
+ elif [ -d /opt/gettext-kde/bin ]; then
+ KDE_GETTEXT_BIN=/opt/gettext-kde/bin
+ fi
+fi
+if [ ! -d "$KDE_GETTEXT_BIN" ]; then
+ echo 1>&2
+ echo "WARNING: Environment variable KDE_GETTEXT_BIN must be set" 1>&2
+ echo "such that the KDE patched version of gettext is found in " 1>&2
+ echo "KDE_GETTEXT_BIN/." 1>&2
+ echo 1>&2
+ echo "Falling back to default gettext, but plural translations " 1>&2
+ echo "will probably be wrong." 1>&2
+ echo 1>&2
+ echo "See ftp://ftp.kde.org/devel/gettext-kde/ for the patched gettext." 1>&2
+ echo 1>&2
+else
+ KDE_GETTEXT_PATH=${KDE_GETTEXT_BIN}/
+fi
+
+SRCDIR=../src # srcdir is the directory containing the source code
+TIPSDIR=../docs/en # tipsdir is the directory containing the tips
+DATADIR=../data # datadir is the directory containing fonts/mappings & styles
+
+KDEDIR=`kde-config --prefix`
+EXTRACTRC=extractrc # from kdesdk-scripts (on Debian Sarge)
+KDEPOT=$KDEDIR/include/kde.pot
+if [ ! -f "$KDEPOT" ] && [ -f /usr/include/kde/kde.pot ]; then
+ KDEPOT=/usr/include/kde/kde.pot
+fi
+XGETTEXT="${KDE_GETTEXT_PATH}xgettext -C -ki18n -ktr2i18n -kI18N_NOOP -ktranslate -kaliasLocale -x $KDEPOT "
+
+## check that kde.pot is available
+if ! test -e $KDEPOT; then
+ echo "$KDEPOT does not exist, there is something wrong with your installation!"
+ XGETTEXT="${KDE_GETTEXT_PATH}xgettext -C -ki18n -ktr2i18n -kI18N_NOOP -ktranslate -kaliasLocale "
+fi
+
+> rc.cpp
+
+## extract the strings
+echo "extracting the strings"
+
+# process the .ui and .rc files
+$EXTRACTRC `find $SRCDIR -iname *.rc` >> rc.cpp
+$EXTRACTRC `find $SRCDIR -iname *.ui` >> rc.cpp
+echo -e 'i18n("_: NAME OF TRANSLATORS\\n"\n"Your names")\ni18n("_: EMAIL OF TRANSLATORS\\n"\n"Your emails")' > $SRCDIR/_translatorinfo.cpp
+
+# process the tips - $SRCDIR is supposed to be where the tips are living
+pushd $TIPSDIR; preparetips >tips.cpp; popd
+
+# process the fonts mapping attributes
+FONTSDIR=$DATADIR/fonts/mappings
+pushd $FONTSDIR
+cat *.xml | perl -e 'while (<STDIN>) { if(/(encoding name|origin|copyright|mapped-by|type)\s*=\s*\"(.*)\"/) { print "i18n(\"$2\")\;\n";} }' > fonts.cpp
+popd
+
+# process the note head style names
+STYLEDIR=$DATADIR/styles
+pushd $STYLEDIR
+ls *.xml | perl -e 'while (<STDIN>) { if(/(.*)\.xml/) { print "i18n(\"$1\")\;\n";} }' > styles.cpp
+popd
+
+# extract the strings
+$XGETTEXT `find $SRCDIR \( -name "*.cpp" -o -name "*.h" \)` rc.cpp $TIPSDIR/tips.cpp $FONTSDIR/fonts.cpp $STYLEDIR/styles.cpp -o tmp.pot
+
+# remove the intermediate files
+rm -f $TIPSDIR/tips.cpp
+rm -f $FONTSDIR/fonts.cpp
+rm -f $STYLEDIR/styles.cpp
+rm -f rc.cpp
+rm -f $SRCDIR/_translatorinfo.cpp
+
+## now merge the .po files ..
+echo "merging the .po files"
+
+for i in `ls *.po`; do
+ echo $i
+ msgmerge $i tmp.pot -o $i || exit 1
+done
+
+# replacing the old template by the new one
+rm -f rosegarden.pot
+mv tmp.pot rosegarden.pot
+
+## finished
+echo "Done"
diff --git a/po/nl.po b/po/nl.po
new file mode 100644
index 0000000..c7deaad
--- /dev/null
+++ b/po/nl.po
@@ -0,0 +1,11475 @@
+# translation of nl.po to
+# This file is distributed under the same license as the rosegarden package.
+# Copyright (C) Jelmer Vernooij <[email protected]>, 2004.
+#
+# Jasper Stein <[email protected]>, 2006, 2007, 2008.
+msgid ""
+msgstr ""
+"Project-Id-Version: nl\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-04-24 18:19-0400\n"
+"PO-Revision-Date: 2008-04-24 23:15+0200\n"
+"Last-Translator: Jasper Stein <[email protected]>\n"
+"Language-Team: <[email protected]>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.4\n"
+
+#: ../src/gui/dialogs/RescaleDialog.cpp:51 rc.cpp:192 rc.cpp:312
+#, no-c-format
+msgid "Rescale"
+msgstr "Herschalen"
+
+#: ../src/gui/dialogs/RescaleDialog.cpp:56
+msgid "Duration of selection"
+msgstr "Selectieduur"
+
+#: ../src/gui/dialogs/RescaleDialog.cpp:62
+msgid "Adjust times of following events accordingly"
+msgstr "Pas tijden van opvolgende gebeurtenissen overeenkomstig aan"
+
+#: ../src/gui/dialogs/PitchDialog.cpp:45
+#: ../src/gui/dialogs/RescaleDialog.cpp:72
+#: ../src/gui/dialogs/TimeDialog.cpp:51 ../src/gui/dialogs/TimeDialog.cpp:68
+#: ../src/gui/studio/BankEditorDialog.cpp:109
+msgid "Reset"
+msgstr "Reset"
+
+#: ../src/commands/segment/SegmentSplitByPitchCommand.cpp:46
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:46
+msgid "Split by Pitch"
+msgstr "Splits naar toonhoogte"
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:54
+msgid "Starting split pitch"
+msgstr "Start splitsen toonhoogte"
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:57
+msgid "Range up and down to follow music"
+msgstr "Verplaats omhoog en omlaag om muziek te volgen"
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:63
+msgid "Duplicate non-note events"
+msgstr "Niet-noot gebeurtenissen verdubbelen"
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:66
+msgid "Clef handling:"
+msgstr "Sleutel gedrag:"
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:69
+msgid "Leave clefs alone"
+msgstr "Sleutels niet aanpassen"
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:70
+msgid "Guess new clefs"
+msgstr "Gok nieuwe sleutels"
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:71
+msgid "Use treble and bass clefs"
+msgstr "Gebruik viool- en bassleutels"
+
+#: ../src/gui/dialogs/DocumentConfigureDialog.cpp:64
+msgid "Document Properties"
+msgstr "Document&eigenschappen..."
+
+#: ../src/gui/dialogs/MakeOrnamentDialog.cpp:45
+#: ../src/gui/editors/notation/NotationView.cpp:6048
+msgid "Make Ornament"
+msgstr "Maak versiering"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:183
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:179
+#: ../src/gui/dialogs/EventEditDialog.cpp:128
+#: ../src/gui/dialogs/MakeOrnamentDialog.cpp:49
+#: ../src/gui/studio/DeviceEditorDialog.cpp:74
+#: ../src/gui/studio/NameSetEditor.cpp:72
+#: ../src/gui/widgets/ColourTable.cpp:51
+msgid "Name"
+msgstr "Naam"
+
+#: ../src/gui/dialogs/MakeOrnamentDialog.cpp:51
+msgid ""
+"The name is used to identify both the ornament\n"
+"and the triggered segment that stores\n"
+"the ornament's notes."
+msgstr ""
+"De naam wordt zowel gebruikt om de versiering\n"
+"te benoemen als het getriggerde segment dat\n"
+"de noten ervan bevat."
+
+#: ../src/gui/dialogs/MakeOrnamentDialog.cpp:54
+msgid "Name: "
+msgstr "Naam:"
+
+#: ../src/gui/dialogs/MakeOrnamentDialog.cpp:57
+#: ../src/gui/editors/eventlist/EventView.cpp:717
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:92
+msgid "Base pitch"
+msgstr "Basistoonhoogte:"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:57
+#: ../src/gui/editors/eventlist/EventView.cpp:140
+msgid "Text"
+msgstr "Tekst"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:66
+msgid "Specification"
+msgstr "Specificatie"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:68
+msgid "Preview"
+msgstr "Voorbeeld"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:72
+msgid "Text: "
+msgstr "Tekst: "
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:79
+msgid "Style: "
+msgstr "Stijl: "
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:90
+msgid "Dynamic"
+msgstr "Dynamisch"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:93
+msgid "Direction"
+msgstr "Richting"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:96
+msgid "Local Direction"
+msgstr "Lokale Richting"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:63
+#: ../src/gui/dialogs/TextEventDialog.cpp:99
+#: ../src/gui/editors/tempo/TempoView.cpp:91
+msgid "Tempo"
+msgstr "Tempo"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:102
+msgid "Local Tempo"
+msgstr "Lokaal Tempo"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:105
+msgid "Lyric"
+msgstr "Tekst"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:108
+#: ../src/gui/editors/notation/NotationView.cpp:4242
+msgid "Chord"
+msgstr "Akkoord"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:111
+msgid "Annotation"
+msgstr "Annotatie"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:114
+msgid "LilyPond Directive"
+msgstr "Lilypond-aanwijzing"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:138
+msgid "Verse: "
+msgstr "Couplet: "
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:148
+msgid "Dynamic: "
+msgstr "Dynamiek:"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:152
+msgid "ppp"
+msgstr "ppp"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:153
+msgid "pp"
+msgstr "pp"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:154
+msgid "p"
+msgstr "p"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:155
+msgid "mp"
+msgstr "mp"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:156
+msgid "mf"
+msgstr "mf"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:157
+msgid "f"
+msgstr "f"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:158
+msgid "ff"
+msgstr "ff"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:159
+msgid "fff"
+msgstr "fff"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:160
+msgid "rfz"
+msgstr "rfz"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:161
+msgid "sf"
+msgstr "sf"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:165
+msgid "Direction: "
+msgstr "Richting: "
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:174
+msgid " ,"
+msgstr " ,"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:175
+msgid "D.C. al Fine"
+msgstr "D.C. al Fine"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:176
+msgid "D.S. al Fine"
+msgstr "D.S. al Fine"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:177
+msgid "Fine"
+msgstr "Fine"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:178
+msgid "D.S. al Coda"
+msgstr "D.S. al Coda"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:179
+msgid "to Coda"
+msgstr "naar Coda"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:180
+msgid "Coda"
+msgstr "Coda"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:184
+msgid "Local Direction: "
+msgstr "Lokale Richting:"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:188
+msgid "accel."
+msgstr "accel."
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:189
+msgid "ritard."
+msgstr "ritard."
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:190
+msgid "ralletando"
+msgstr "rallentando"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:191
+msgid "a tempo"
+msgstr "a tempo"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:192
+msgid "legato"
+msgstr "legato"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:193
+msgid "simile"
+msgstr "simile"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:194
+msgid "pizz."
+msgstr "pizz."
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:195
+msgid "arco"
+msgstr "arco"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:196
+msgid "non vib."
+msgstr "non vib."
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:197
+msgid "sul pont."
+msgstr "sul pont."
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:198
+#: ../src/gui/dialogs/TextEventDialog.cpp:200
+msgid "sul tasto"
+msgstr "sul tasto"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:199
+msgid "con legno"
+msgstr "con legno"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:201
+msgid "sul G"
+msgstr "sul G"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:202
+msgid "ordinario"
+msgstr "ordinario"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:203
+msgid "Muta in "
+msgstr "Muta in "
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:204
+msgid "volti subito "
+msgstr "volti subito "
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:205
+msgid "soli"
+msgstr "soli"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:206
+msgid "div."
+msgstr "div."
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:210
+msgid "Tempo: "
+msgstr "Tempo: "
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:214
+#: ../src/gui/dialogs/TextEventDialog.cpp:238
+msgid "Grave"
+msgstr "Grave"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:215
+#: ../src/gui/dialogs/TextEventDialog.cpp:239
+msgid "Adagio"
+msgstr "Adagio"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:216
+#: ../src/gui/dialogs/TextEventDialog.cpp:240
+msgid "Largo"
+msgstr "Largo"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:217
+#: ../src/gui/dialogs/TextEventDialog.cpp:241
+msgid "Lento"
+msgstr "Lento"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:218
+#: ../src/gui/dialogs/TextEventDialog.cpp:242
+msgid "Andante"
+msgstr "Andante"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:219
+#: ../src/gui/dialogs/TextEventDialog.cpp:243
+msgid "Moderato"
+msgstr "Moderato"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:220
+#: ../src/gui/dialogs/TextEventDialog.cpp:244
+msgid "Allegretto"
+msgstr "Allegretto"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:221
+#: ../src/gui/dialogs/TextEventDialog.cpp:245
+msgid "Allegro"
+msgstr "Allegro"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:222
+#: ../src/gui/dialogs/TextEventDialog.cpp:246
+msgid "Vivace"
+msgstr "Vivace"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:223
+#: ../src/gui/dialogs/TextEventDialog.cpp:247
+msgid "Presto"
+msgstr "Presto"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:224
+#: ../src/gui/dialogs/TextEventDialog.cpp:248
+msgid "Prestissimo"
+msgstr "Prestissimo"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:225
+#: ../src/gui/dialogs/TextEventDialog.cpp:249
+msgid "Maestoso"
+msgstr "Maestoso"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:226
+#: ../src/gui/dialogs/TextEventDialog.cpp:250
+msgid "Sostenuto"
+msgstr "Sostenuto"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:227
+#: ../src/gui/dialogs/TextEventDialog.cpp:251
+msgid "Tempo Primo"
+msgstr "Tempo Primo"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:234
+msgid "Local Tempo: "
+msgstr "Lokaal Tempo:"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:255
+msgid "Directive: "
+msgstr "Directief:"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:312
+msgid "Example"
+msgstr "Voorbeeld"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:65
+msgid "Event Filter"
+msgstr "Gebeurtenis Filter"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:86
+msgid "Note Events"
+msgstr "Nootgebeurtenissen"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:90
+msgid "lowest:"
+msgstr "laagste:"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:93
+msgid "highest:"
+msgstr "hoogste:"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:96
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:141
+#: ../src/gui/widgets/PitchChooser.cpp:53
+msgid "Pitch:"
+msgstr "Toonhoogte: "
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:99
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:163
+msgid "Velocity:"
+msgstr "Snelheid:"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:102
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:129
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:257
+msgid "Duration:"
+msgstr "Duur:"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:107
+#: ../src/gui/dialogs/EventFilterDialog.cpp:114
+#: ../src/gui/dialogs/EventFilterDialog.cpp:121
+msgid "include"
+msgstr "meenemen"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:108
+#: ../src/gui/dialogs/EventFilterDialog.cpp:115
+#: ../src/gui/dialogs/EventFilterDialog.cpp:122
+msgid "exclude"
+msgstr "uitsluiten"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:136
+#: ../src/gui/dialogs/EventFilterDialog.cpp:155
+#: ../src/gui/editors/eventlist/EventView.cpp:172
+#: ../src/gui/editors/eventlist/EventView.cpp:179
+#: ../src/gui/editors/eventlist/EventView.cpp:186
+msgid "edit"
+msgstr "bewerken"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:141
+#: ../src/gui/dialogs/EventFilterDialog.cpp:157
+msgid "choose a pitch using a staff"
+msgstr "kies een toonhoogte door middel van sleutel"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:182
+#: ../src/gui/dialogs/EventFilterDialog.cpp:188
+msgid "longest"
+msgstr "langste"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:200
+msgid "Include all"
+msgstr "Alles Meenemen"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:203
+msgid "Include entire range of values"
+msgstr "Neem gehele reeks waardes mee"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:206
+msgid "Exclude all"
+msgstr "Alles Uitsluiten"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:209
+msgid "Exclude entire range of values"
+msgstr "Sluit gehele reeks waardes uit"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:233
+#: ../src/gui/dialogs/EventFilterDialog.cpp:234
+msgid "shortest"
+msgstr "kortste"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:333
+msgid "Lowest pitch"
+msgstr "Laagste toonhoogte:"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:343
+msgid "Highest pitch"
+msgstr "Hoogste toonhoogte:"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:56
+#: ../src/gui/editors/notation/NotationView.cpp:1619
+#: ../src/gui/editors/notation/NotationView.cpp:6088
+msgid "Use Ornament"
+msgstr "Gebruik versiering"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:260
+#: ../src/gui/configuration/NotationConfigurationPage.h:64
+#: ../src/gui/configuration/NotationConfigurationPage.h:65
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:63
+msgid "Notation"
+msgstr "Notatie"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:68
+msgid "Display as: "
+msgstr "Toon als: "
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:84
+msgid "Trill"
+msgstr "Tri&ller"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:84
+msgid "Trill with line"
+msgstr "Triller met golflijn"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:84
+msgid "Trill line only"
+msgstr "Triller, alleen golflijn"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:85
+msgid "Turn"
+msgstr "&Dubbelslag"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:85
+msgid "Mordent"
+msgstr "Mordent"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:85
+msgid "Inverted mordent"
+msgstr "Omgekeerd mordent"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:86
+msgid "Long mordent"
+msgstr "Lang mordent"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:86
+msgid "Long inverted mordent"
+msgstr "Lang omgekeerd mordent"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:94
+msgid "Text mark"
+msgstr "Tekstmarkering"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:98
+msgid " Text: "
+msgstr "Tekst:"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:104
+msgid "Performance"
+msgstr "Uitvoering"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:109
+msgid "Perform using triggered segment: "
+msgstr "Voer uit met getriggerd segment:"
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:75
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:123
+msgid "Perform with timing: "
+msgstr "Voer uit met timing"
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:81
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:129
+msgid "As stored"
+msgstr "Als opgeslagen"
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:82
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:130
+msgid "Truncate if longer than note"
+msgstr "Afkappen als langer dan de noot"
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:83
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:131
+msgid "End at same time as note"
+msgstr "Eindig op hetzelfde moment als de noot"
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:84
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:132
+msgid "Stretch or squash segment to note duration"
+msgstr "Segment oprekken of samenpersen tot nootlengte"
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:86
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:134
+msgid "Adjust pitch to note"
+msgstr "Toonhoogte aan de noot aanpassen"
+
+#: ../src/gui/dialogs/PitchPickerDialog.cpp:40
+msgid "Pitch Selector"
+msgstr "Toonhoogte-kiezer"
+
+#: ../src/gui/dialogs/BeatsBarsDialog.cpp:44
+msgid "Audio Segment Duration"
+msgstr "Audiosegment-duur"
+
+#: ../src/gui/dialogs/BeatsBarsDialog.cpp:50
+msgid "The selected audio segment contains:"
+msgstr "Het geselecteerde audiosegment bevat:"
+
+#: ../src/gui/dialogs/BeatsBarsDialog.cpp:59
+msgid "beat(s)"
+msgstr "tel(len)"
+
+#: ../src/gui/dialogs/BeatsBarsDialog.cpp:60
+msgid "bar(s)"
+msgstr "ma(a)t(en)"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:51
+msgid "Tuplet"
+msgstr "Multiplet"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:58
+msgid "New timing for tuplet group"
+msgstr "Nieuwe timing voor multiplet-groep"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:76
+msgid "Play "
+msgstr "Speel "
+
+#: ../src/gui/dialogs/TupletDialog.cpp:98
+msgid "in the time of "
+msgstr "in de tijd van "
+
+#: ../src/gui/dialogs/TupletDialog.cpp:104
+msgid "Timing is already correct: update display only"
+msgstr "Timing klopt al: werk alleen weergave bij"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:114
+msgid "Timing calculations"
+msgstr "Tijd berekeningen"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:120
+msgid "Selected region:"
+msgstr "Geselecteerd gebied:"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:129
+msgid "Group with current timing:"
+msgstr "Groep met huidige timing:"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:135
+msgid "Group with new timing:"
+msgstr "Groep met nieuwe timing:"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:141
+msgid "Gap created by timing change:"
+msgstr "Gat ontstaan door verandering timing:"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:149
+msgid "Unchanged at end of selection:"
+msgstr "Onveranderd aan eind van selectie:"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:63 rc.cpp:372
+#, no-c-format
+msgid "Metronome"
+msgstr "Metronoom"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:77
+msgid "Metronome Instrument"
+msgstr "Metronoom-instrument"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:82
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:150
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:183
+#: ../src/gui/studio/DeviceEditorDialog.cpp:73
+#: ../src/gui/studio/DeviceManagerDialog.cpp:105
+#: ../src/gui/studio/DeviceManagerDialog.cpp:163
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:66
+msgid "Device"
+msgstr "Apparaat"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:101
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:89
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:215
+#: ../src/gui/studio/DeviceEditorDialog.cpp:195
+#: ../src/gui/studio/DeviceEditorDialog.cpp:218
+#: ../src/gui/studio/DeviceEditorDialog.cpp:230
+#: ../src/gui/studio/DeviceManagerDialog.cpp:196
+#: ../src/gui/studio/DeviceManagerDialog.cpp:440
+#: ../src/gui/studio/DeviceManagerDialog.cpp:452
+msgid "No connection"
+msgstr "Geen verbinding"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:112
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:111
+#: ../src/gui/editors/parameters/InstrumentParameterBox.cpp:53
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:1209
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:159
+#: ../src/gui/general/PresetHandlerDialog.cpp:92
+#: ../src/gui/studio/MidiMixerWindow.cpp:204
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:67
+msgid "Instrument"
+msgstr "Instrument"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:118
+msgid "Beats"
+msgstr "Beats"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:184
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:123
+msgid "Resolution"
+msgstr "Resolutie"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:309
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:139
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:205
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:125
+#: ../src/gui/editors/matrix/MatrixView.cpp:2132
+#: ../src/gui/editors/notation/NotationView.cpp:1582
+#: ../src/gui/widgets/QuantizeParameters.cpp:128
+#: ../src/gui/widgets/QuantizeParameters.cpp:301
+msgid "None"
+msgstr "Geen"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:126
+msgid "Bars only"
+msgstr "Alleen maten"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:127
+msgid "Bars and beats"
+msgstr "Maten en beats"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:128
+msgid "Bars, beats, and divisions"
+msgstr "Maten, tikken en divisies"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:132
+msgid "Bar velocity"
+msgstr "Balk snelheid"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:139
+msgid "Beat velocity"
+msgstr "Tik snelheid"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:146
+msgid "Sub-beat velocity"
+msgstr "Sub-tik snelheid"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:155
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:324
+msgid "Pitch"
+msgstr "Toonhoogte"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:160
+msgid "for Bar"
+msgstr "voor maat"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:161
+msgid "for Beat"
+msgstr "voor tel"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:162
+msgid "for Sub-beat"
+msgstr "voor teldeel"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:166
+msgid "Metronome Activated"
+msgstr "Metronoom geactiveerd"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:167
+msgid "Playing"
+msgstr "Bezig met afspelen"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:168
+msgid "Recording"
+msgstr "Aan het opnemen"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:46
+msgid "Choose Text Encoding"
+msgstr "Kies tekstcodering"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:50
+msgid ""
+"\n"
+"This file contains text in an unknown language encoding.\n"
+"\n"
+"Please select one of the following estimated text encodings\n"
+"for use with the text in this file:\n"
+msgstr ""
+"\n"
+"Dit bestand bevat tekst in een onbekende codering.\n"
+"\n"
+"Kies een van de volgende mogelijke coderingen\n"
+"voor de tekst in dit bestand:\n"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:61
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:77
+msgid "Japanese Shift-JIS"
+msgstr "Japans Shift-JIS"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:62
+msgid "Unicode variable-width"
+msgstr "Unicode met variabele breedte"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:63
+msgid "Western Europe"
+msgstr "West-Europa"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:64
+msgid "Western Europe + Euro"
+msgstr "West-Europa + euro"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:65
+msgid "Eastern Europe"
+msgstr "Oost-Europa"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:66
+msgid "Southern Europe"
+msgstr "Zuid-Europa"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:67
+msgid "Northern Europe"
+msgstr "Noord-Europa, Baltisch"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:68
+msgid "Cyrillic"
+msgstr "Cyrillisch"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:69
+msgid "Arabic"
+msgstr "Arabisch"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:70
+msgid "Greek"
+msgstr "Grieks"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:71
+msgid "Hebrew"
+msgstr "Hebreeuws"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:72
+msgid "Turkish"
+msgstr "Turks"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:73
+msgid "Nordic"
+msgstr "Noord-Europa, Scandinavisch"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:74
+msgid "Thai"
+msgstr "Thai"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:75
+msgid "Baltic"
+msgstr "Baltisch"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:76
+msgid "Celtic"
+msgstr "Keltisch"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:78
+msgid "Traditional Chinese"
+msgstr "Traditioneel Chinees"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:79
+msgid "Simplified Chinese"
+msgstr "Vereenvoudigd Chinees"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:80
+msgid "Russian"
+msgstr "Russisch"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:81
+msgid "Ukrainian"
+msgstr "Oekraïens"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:82
+msgid "Tamil"
+msgstr "Tamil"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:117
+#, c-format
+msgid "Microsoft Code Page %1"
+msgstr "Microsoft Code Page %1"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:123
+#: ../src/gui/editors/matrix/MatrixView.cpp:1490
+msgid "%1 (%2)"
+msgstr "%1 (%2)"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:142
+msgid ""
+"\n"
+"Example text from file:"
+msgstr ""
+"\n"
+"Voorbeeldtekst uit het bestand:"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:59
+#: ../src/gui/editors/tempo/TempoView.cpp:92
+msgid "Time Signature"
+msgstr "Maatsoort"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:82
+msgid "Time signature"
+msgstr "Maatsoort"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:116
+msgid "Time where signature takes effect"
+msgstr "Tijdstip waarop maatsoort in werking treedt"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:83
+#: ../src/gui/dialogs/TempoDialog.cpp:128
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:129
+#: ../src/gui/general/PresetHandlerDialog.cpp:101
+msgid "Scope"
+msgstr "Bereik"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:141
+#, c-format
+msgid "Insertion point is at start of measure %1."
+msgstr "Invoegpunt is aan het begin van maat %1."
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:145
+#, c-format
+msgid "Insertion point is in the middle of measure %1."
+msgstr "Invoegpunt is in het midden van maat %1."
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:150
+msgid "Insertion point is at start of composition."
+msgstr "Invoegpunt is aan het begin van de compositie."
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:155
+msgid "Start measure %1 here"
+msgstr "Start maat %1 hier"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:159
+#, c-format
+msgid "Change time from start of measure %1"
+msgstr "Verander maatsoort vanaf begin van maat %1"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:166
+#, c-format
+msgid "Time change will take effect at the start of measure %1."
+msgstr "Tijdsverandering zal plaatsvinden aan begin van maat %1."
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:176
+msgid "Hide the time signature"
+msgstr "Verberg de maataanduiding"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:181
+msgid "Hide the affected bar lines"
+msgstr "Verberg de getroffen maatstrepen"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:186
+msgid "Show as common time"
+msgstr "Toon als ongesneden maatsoort"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:191
+msgid "Correct the durations of following measures"
+msgstr "Corrigeer de lengte van opvolgende maten"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:280
+msgid "Display as common time"
+msgstr "Toon als ongesneden maatsoort (c)"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:284
+msgid "Display as cut common time"
+msgstr "Toon als gesneden maatsoort (¢)"
+
+#: ../src/gui/dialogs/ConfigureDialog.cpp:66
+msgid "Configure Rosegarden"
+msgstr "Rosegarden instellen"
+
+#: ../src/gui/dialogs/MarkerModifyDialog.cpp:53
+#: ../src/gui/dialogs/MarkerModifyDialog.cpp:61
+msgid "Edit Marker"
+msgstr "Bewerk marker"
+
+#: ../src/gui/dialogs/MarkerModifyDialog.cpp:78
+msgid "Marker Time"
+msgstr "Markertijd"
+
+#: ../src/gui/dialogs/MarkerModifyDialog.cpp:94
+msgid "Marker Properties"
+msgstr "Accenteigenschappen"
+
+#: ../src/gui/dialogs/MarkerModifyDialog.cpp:100
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:554
+msgid "Text:"
+msgstr "Tekst:"
+
+#: ../src/gui/dialogs/MarkerModifyDialog.cpp:104
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:85
+msgid "Description:"
+msgstr "Omschrijving:"
+
+#: ../src/gui/dialogs/FileMergeDialog.cpp:46
+msgid "Merge File"
+msgstr "Met bestand samenvoegen"
+
+#: ../src/gui/dialogs/FileMergeDialog.cpp:53
+msgid "Merge new file "
+msgstr "Samenvoegen met nieuw bestand "
+
+#: ../src/gui/dialogs/FileMergeDialog.cpp:56
+msgid "At start of existing composition"
+msgstr "Aan het begin van huidige compositie"
+
+#: ../src/gui/dialogs/FileMergeDialog.cpp:57
+msgid "From end of existing composition"
+msgstr "Vanaf eind van huidige compositie"
+
+#: ../src/gui/dialogs/FileMergeDialog.cpp:61
+msgid "The file has different time signatures or tempos."
+msgstr "Het bestand heeft verschillende maatsoorten of tempi."
+
+#: ../src/gui/dialogs/FileMergeDialog.cpp:62
+msgid "Import these as well"
+msgstr "Importeer ook deze"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:171
+#: ../src/gui/dialogs/ShowSequencerStatusDialog.cpp:44
+msgid "Sequencer status"
+msgstr "Sequencerstatus"
+
+#: ../src/gui/dialogs/ShowSequencerStatusDialog.cpp:48
+msgid "Sequencer status:"
+msgstr "Sequencer status:"
+
+#: ../src/gui/dialogs/ShowSequencerStatusDialog.cpp:50
+msgid "Status not available."
+msgstr "Status niet beschikbaar."
+
+#: ../src/gui/dialogs/ShowSequencerStatusDialog.cpp:57
+msgid "Sequencer is not running or is not responding."
+msgstr "De sequencer draait niet of antwoord niet."
+
+#: ../src/gui/dialogs/ShowSequencerStatusDialog.cpp:64
+msgid "Sequencer is not returning a valid status report."
+msgstr "De sequencer geeft geen geldig status rapport."
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:46
+msgid "Add Tracks"
+msgstr "Voeg sporen toe"
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:54
+msgid "How many tracks do you want to add?"
+msgstr "Hoeveel sporen wilt u toevoegen?"
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:62
+msgid "Add tracks"
+msgstr "Voeg sporen toe"
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:64
+msgid "At the top"
+msgstr ""
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:65
+#, fuzzy
+msgid "Above the current selected track"
+msgstr "Dempt alle sporen behalve de nu geselcteerde."
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:66
+#, fuzzy
+msgid "Below the current selected track"
+msgstr "Dempt alle sporen behalve de nu geselcteerde."
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:67
+msgid "At the bottom"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:75
+msgid "Event Properties"
+msgstr "Gebeurteniseigenschappen"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:81
+msgid "Event type:"
+msgstr "Gebeurtenistype:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:117
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:251
+#: ../src/gui/editors/segment/MarkerEditor.cpp:97
+msgid "Absolute time:"
+msgstr "Absolute tijd:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:156
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:323
+msgid "Controller name:"
+msgstr "Controller naam:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:157
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:530
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:562
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:563
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:602
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:631
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:267
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:269
+#: ../src/gui/editors/segment/MarkerEditor.cpp:279
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:272
+#: ../src/gui/studio/AudioMixerWindow.cpp:388
+#: ../src/gui/studio/AudioMixerWindow.cpp:519
+#: ../src/gui/studio/AudioMixerWindow.cpp:683
+#: ../src/gui/studio/AudioMixerWindow.cpp:722
+#: ../src/gui/studio/AudioMixerWindow.cpp:904
+#: ../src/gui/studio/SynthPluginManagerDialog.cpp:121
+msgid "<none>"
+msgstr "<geen>"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:174
+msgid "Meta string:"
+msgstr "Meta data:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:179
+msgid "Load data"
+msgstr "Data laden"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:181
+msgid "Save data"
+msgstr "Data opslaan"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:192
+msgid "Notation Properties"
+msgstr "Notatie-eigenschappen"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:198
+msgid "Lock to changes in performed values"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:205
+msgid "Notation time:"
+msgstr "Notatie"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:217
+msgid "Notation duration:"
+msgstr "Genoteerde duur:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:283
+msgid "Note pitch:"
+msgstr "Noot toonhoogte:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:291
+msgid "Note velocity:"
+msgstr "Noot snelheid:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:317
+msgid "Controller number:"
+msgstr "Controller nummer:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:326
+msgid "Controller value:"
+msgstr "Controller waarde:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:354
+msgid "Key pitch:"
+msgstr "Toets toonhoogte:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:362
+msgid "Key pressure:"
+msgstr "Toets druk:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:390
+msgid "Channel pressure:"
+msgstr "Kanaal druk:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:418
+msgid "Program change:"
+msgstr "Programma veranderen:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:461
+msgid "Data length:"
+msgstr "Data lengte:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:462
+msgid "Data:"
+msgstr "Data:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:480
+msgid "Pitchbend MSB:"
+msgstr "Toonhoogtebuiging MSB:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:488
+msgid "Pitchbend LSB:"
+msgstr "Toonhoogtebuiging LSB:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:523
+msgid "Indication:"
+msgstr "Indicatie:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:553
+msgid "Text type:"
+msgstr "Teksttype:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:596
+msgid "Clef type:"
+msgstr "Sleuteltype:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:625
+msgid "Key name:"
+msgstr "Toonsoortnaam:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:674
+msgid "Unsupported event type:"
+msgstr "Niet-ondersteund gebeurtenistype:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:931
+msgid "Edit Event Time"
+msgstr "Bewerk Gebeurtenis Tijd"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:943
+msgid "Edit Event Notation Time"
+msgstr "Bewerk Gebeurtenis Notatietijd"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:955
+msgid "Edit Duration"
+msgstr "Bewerk Duur"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:968
+msgid "Edit Notation Duration"
+msgstr "Bewerk genoteerde duur"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:981
+msgid "Edit Pitch"
+msgstr "Bewerk Toonhoogte"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:991
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:1016
+msgid "*.syx|System exclusive files (*.syx)"
+msgstr "*.syx|System exclusive-bestanden (*.syx)"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:992
+msgid "Load System Exclusive data in File"
+msgstr "Laaf System Exclusive data in bestand"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:1017
+msgid "Save System Exclusive data to..."
+msgstr "Sla System Exclusive data op in..."
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:46
+msgid "Locate audio file"
+msgstr "Audio bestand opzoeken"
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:50
+msgid "&Skip"
+msgstr "&Overslaan"
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:51
+msgid "Skip &All"
+msgstr "&Alles overslaan"
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:52
+msgid "&Locate"
+msgstr "&Opzoeken"
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:57
+msgid ""
+"Can't find file \"%1\".\n"
+"Would you like to try and locate this file or skip it?"
+msgstr ""
+"Kon het bestand \"%1\" niet vinden.\n"
+"Wilt u proberen het bestand op het zoeken of het overslaan?"
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:71
+msgid ""
+"%1|Requested file (%2)\n"
+"*.wav|WAV files (*.wav)"
+msgstr ""
+"%1|Gevraagd bestand (%2)\n"
+"*.wav|WAV-bestanden (*.wav)"
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:74
+msgid "Select an Audio File"
+msgstr "Selecteer een audiobestand"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:53 ../src/gui/dialogs/ClefDialog.cpp:62
+#: ../src/gui/dialogs/ClefDialog.cpp:79 ../src/gui/dialogs/ClefDialog.cpp:90
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:278
+msgid "Clef"
+msgstr "Sleutel"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:65
+msgid "Existing notes following clef change"
+msgstr "Bestaande noten volgen sleutelverandering"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:71
+msgid "Lower clef"
+msgstr "Lagere sleutel"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:77
+msgid "Up an Octave"
+msgstr "1 Octaaf Omhoog"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:84
+msgid "Down an Octave"
+msgstr "1 Octaaf Omlaag"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:88
+msgid "Higher clef"
+msgstr "Hogere sleutel"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:96
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:152
+msgid "Maintain current pitches"
+msgstr "Behoud huidige toonhoogtes"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:99
+msgid "Transpose into appropriate octave"
+msgstr "Verander in bijpassende octaaf"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:231
+msgid "%1 down an octave"
+msgstr "%1 één octaaf omlaag"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:234
+msgid "%1 down two octaves"
+msgstr "%1 twee octaven omlaag"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:237
+msgid "%1 up an octave"
+msgstr "%1 één octaaf omhoog"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:240
+msgid "%1 up two octaves"
+msgstr "%1 twee octaven omhoog"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:249
+msgid "Treble"
+msgstr "Vioolsleutel"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:251
+msgid "French violin"
+msgstr "Franse vioolsleutel"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:253
+msgid "Soprano"
+msgstr "Sopraansleutel"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:255
+msgid "Mezzo-soprano"
+msgstr "Mezzosopraansleutel"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:257
+msgid "Alto"
+msgstr "Altsleutel"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:259
+msgid "Tenor"
+msgstr "Tenorsleutel"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:261
+msgid "C-baritone"
+msgstr "C-baritonsleutel"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:263
+msgid "F-baritone"
+msgstr "F-baritonsleutel"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:265
+msgid "Bass"
+msgstr "Bassleutel"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:267
+msgid "Sub-bass"
+msgstr "Sub-bassleutel"
+
+#: ../src/gui/dialogs/CountdownDialog.cpp:52
+msgid "Recording..."
+msgstr "Bezig met opnemen..."
+
+#: ../src/gui/dialogs/CountdownDialog.cpp:60
+msgid "Recording time remaining: "
+msgstr "Resterende opnametijd:"
+
+#: ../src/gui/dialogs/CountdownDialog.cpp:120
+msgid "Just how big is your hard disk?"
+msgstr "Hoe groot is uw harde schijf?"
+
+#: ../src/gui/dialogs/CountdownDialog.cpp:154
+msgid "Recording beyond end of composition: "
+msgstr "Opname na eind compositie:"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:52
+msgid "Specify Interval"
+msgstr "Specificeer interval"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:58
+msgid "Reference note:"
+msgstr "Referentie-noot:"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:59
+msgid "Target note:"
+msgstr "Doelnoot:"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:68
+#: ../src/gui/dialogs/IntervalDialog.cpp:315
+msgid "a perfect unison"
+msgstr "een reine priem"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:76
+msgid "Effect on Key"
+msgstr "Effect op toonsoort"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:77
+msgid "Transpose within key"
+msgstr "Transponeer binnen toonsoort"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:79
+msgid "Change key for selection"
+msgstr "Verander toonsoort voor selectie"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:89
+msgid ""
+"Adjust segment transposition in opposite direction (maintain audible pitch)"
+msgstr ""
+"Segment-transpositie in omgekeerde richting (behoud hoorbare toonhoogte)"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:190
+#: ../src/gui/dialogs/IntervalDialog.cpp:220
+msgid "a diminished"
+msgstr "een verminderd(e)"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:192
+#: ../src/gui/dialogs/IntervalDialog.cpp:222
+msgid "an augmented"
+msgstr "een vermeerderd(e)"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:194
+#: ../src/gui/dialogs/IntervalDialog.cpp:224
+msgid "a doubly diminished"
+msgstr "een dubbelverminderd(e)"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:196
+#: ../src/gui/dialogs/IntervalDialog.cpp:226
+msgid "a doubly augmented"
+msgstr "een dubbelvermeerderd(e)"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:198
+#: ../src/gui/dialogs/IntervalDialog.cpp:228
+msgid "a triply diminished"
+msgstr "een driedubbel verminderd(e)"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:200
+#: ../src/gui/dialogs/IntervalDialog.cpp:230
+msgid "a triply augmented"
+msgstr "een driedubbel vermeerderd(e)"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:202
+msgid "a quadruply diminished"
+msgstr "een vierdubbel verminderd(e)"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:204
+#: ../src/gui/dialogs/IntervalDialog.cpp:232
+msgid "a quadruply augmented"
+msgstr "een vierdubbel vermimeerderd(e)"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:206
+#: ../src/gui/dialogs/IntervalDialog.cpp:234
+msgid "a perfect"
+msgstr "een rein(e)"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:208
+#: ../src/gui/dialogs/IntervalDialog.cpp:236
+msgid "an (unknown, %1)"
+msgstr "een (onbekend, %1)"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:216
+msgid "a minor"
+msgstr "een klein(e)"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:218
+msgid "a major"
+msgstr "een gro(o)t(e)"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:239
+msgid "an (unknown)"
+msgstr "een (onbekend)"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:248
+#: ../src/gui/dialogs/IntervalDialog.cpp:251
+msgid "%1 octave"
+msgstr "%1 oktaaf"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:254
+msgid "%1 unison"
+msgstr "%1 priem"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:258
+msgid "%1 second"
+msgstr "%1 secunde"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:261
+msgid "%1 third"
+msgstr "%1 terts"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:264
+msgid "%1 fourth"
+msgstr "%1 kwart"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:267
+msgid "%1 fifth"
+msgstr "%1 kwint"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:270
+msgid "%1 sixth"
+msgstr "%1 sext"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:273
+msgid "%1 seventh"
+msgstr "%1 septiem"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:276
+#: ../src/gui/studio/DeviceManagerDialog.cpp:329
+#: ../src/gui/studio/DeviceManagerDialog.cpp:363
+#, c-format
+msgid "%1"
+msgstr "%1"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:287
+msgid ""
+"_n: up 1 octave and %1\n"
+"up %n octaves and %1"
+msgstr ""
+"1 oktaaf omhoog plus %1\n"
+"%n oktaven omhoog plus %1"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:291
+#, c-format
+msgid ""
+"_n: up 1 octave\n"
+"up %n octaves"
+msgstr ""
+"1 oktaaf omhoog\n"
+"%n oktaven omhoog"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:295
+#, c-format
+msgid "up %1"
+msgstr "%1 omhoog"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:303
+msgid ""
+"_n: down 1 octave and %1\n"
+"down %n octaves and %1"
+msgstr ""
+"1 oktaaf omlaag plus %1\n"
+"%n oktaven omlaag plus %1"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:307
+#, c-format
+msgid ""
+"_n: down 1 octave\n"
+"down %n octaves"
+msgstr ""
+"1 oktaaf omlaag\n"
+"%n oktaven omlaag"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:311
+#, c-format
+msgid "down %1"
+msgstr "%1 omlaag"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:81
+msgid "Intrinsics"
+msgstr "Intrinsieken"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:85
+msgid "Event type: "
+msgstr "Gebeurtenistype: "
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:91
+msgid "Absolute time: "
+msgstr "Absolute tijd: "
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:101
+msgid "Duration: "
+msgstr "Duur: "
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:114
+msgid "Sub-ordering: "
+msgstr "Onderlinge Ordening: "
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:125
+msgid "Persistent properties"
+msgstr "Blijvende eigenschappen"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:169
+#: ../src/gui/dialogs/EventEditDialog.cpp:133
+#: ../src/gui/studio/BankEditorDialog.cpp:129
+#: ../src/gui/studio/DeviceEditorDialog.cpp:75
+msgid "Type"
+msgstr "Type"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:184
+#: ../src/gui/dialogs/EventEditDialog.cpp:135
+#: ../src/gui/dialogs/EventParameterDialog.cpp:89
+#: ../src/gui/dialogs/EventParameterDialog.cpp:93
+#: ../src/gui/dialogs/EventParameterDialog.cpp:115
+msgid "Value"
+msgstr "Waarde"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:155
+msgid "Non-persistent properties"
+msgstr "Niet-blijvende eigenschappen"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:156
+msgid "These are cached values, lost if the event is modified."
+msgstr ""
+"Dit zijn onthouden waardes, verloren als de gebeurtenis wordt gewijzigd."
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:170
+msgid "Name "
+msgstr "Naam "
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:172
+msgid "Type "
+msgstr "Type "
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:174
+msgid "Value "
+msgstr "Waarde "
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:188
+msgid "Make persistent"
+msgstr "Maak blijvend"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:292
+msgid "Delete this property"
+msgstr "Verwijder deze eigenschap"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:433
+msgid ""
+"Are you sure you want to delete the \"%1\" property?\n"
+"\n"
+"Removing necessary properties may cause unexpected behavior."
+msgstr ""
+"Weet u zeker dat u de eigenschap \"%1\" wilt verwijderen?\n"
+"\n"
+"Verwijderen van benodigde eigenschappen kan resulteren in onverwacht gedrag."
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:436
+#: ../src/gui/dialogs/EventEditDialog.cpp:469
+msgid "Edit Event"
+msgstr "Bewerk gebeurtenis"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:465
+msgid ""
+"Are you sure you want to make the \"%1\" property persistent?\n"
+"\n"
+"This could cause problems if it overrides a different computed value later "
+"on."
+msgstr ""
+"Weet u zeker dat u de \"%1\" eigenschap blijvend wilt maken?\n"
+"\n"
+"Dit zou problemen kunnen veroorzaken als het later een andere berekende "
+"waarde overschrijft."
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:470
+msgid "Make &Persistent"
+msgstr "Maak &Blijvend"
+
+#: ../src/gui/dialogs/PasteNotationDialog.cpp:52
+msgid "Paste type"
+msgstr "Plakken type"
+
+#: ../src/gui/dialogs/PasteNotationDialog.cpp:72
+msgid "Make this the default paste type"
+msgstr "Maak dit het standaard plak type"
+
+#: ../src/gui/dialogs/LyricEditDialog.cpp:53
+msgid "Edit Lyrics"
+msgstr "Bewerken liedtekst"
+
+#: ../src/gui/dialogs/LyricEditDialog.cpp:62
+msgid "Lyrics for this segment"
+msgstr "Liedtekst voor dit segment"
+
+#: ../src/gui/dialogs/LyricEditDialog.cpp:70
+msgid "Add Verse"
+msgstr "Couplet toevoegen"
+
+#: ../src/gui/dialogs/LyricEditDialog.cpp:84
+#: ../src/gui/dialogs/LyricEditDialog.cpp:106
+#, c-format
+msgid "Verse %1"
+msgstr "Couplet %1"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:59
+msgid "Import from Device..."
+msgstr "Importeer van apparaat..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2163
+#: ../src/gui/application/RosegardenGUIApp.cpp:2229
+#: ../src/gui/application/RosegardenGUIApp.cpp:7780
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:87
+#: ../src/sound/AudioFileManager.cpp:664
+#, c-format
+msgid "Cannot download file %1"
+msgstr "Kan bestand %1 niet downloaden"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:99
+#, c-format
+msgid "Cannot open file %1"
+msgstr "Kan bestand %1 niet openen"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:106
+#, c-format
+msgid "No devices found in file %1"
+msgstr "Geen apparaten gevonden in bestand %1"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:113
+msgid "Source device"
+msgstr "Bronapparaat"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:118
+msgid "Import from: "
+msgstr "Importeer uit:"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:140
+#: ../src/gui/studio/DeviceEditorDialog.cpp:148
+#, c-format
+msgid "Device %1"
+msgstr "Apparaat-%1"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:155
+msgid "Import banks"
+msgstr "Importeer banken"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:156
+msgid "Import key mappings"
+msgstr "Importeer toetsen-mappings"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:157
+msgid "Import controllers"
+msgstr "Importeer controllers"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:160
+msgid "Import device name"
+msgstr "Importeer apparaatnaam"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:166
+msgid "Bank import behavior"
+msgstr "Gedrag bij banken importeren"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:168
+msgid "Merge banks"
+msgstr "Voeg banken samen"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:169
+msgid "Overwrite banks"
+msgstr "Overschrijf banken"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:367
+msgid "Bank %1:%2"
+msgstr "Bank %1:%2"
+
+#: ../src/commands/segment/SegmentSplitByRecordingSrcCommand.cpp:42
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:48
+msgid "Split by Recording Source"
+msgstr "&Splits naar opnamebron"
+
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:53
+msgid "Recording Source"
+msgstr "Opnamebron"
+
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:57
+msgid "Channel:"
+msgstr "Kanaal:"
+
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:64
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:75
+msgid "any"
+msgstr "(alle)"
+
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:69
+msgid "Device:"
+msgstr "Apparaat:"
+
+#: ../src/gui/dialogs/UnusedAudioSelectionDialog.cpp:46
+msgid "Select Unused Audio Files"
+msgstr "Selecteer ongebruikt audiobestanden"
+
+#: ../src/gui/dialogs/UnusedAudioSelectionDialog.cpp:53
+#: ../src/gui/editors/segment/PlayListView.cpp:36
+msgid "File name"
+msgstr "Bestandsnaam"
+
+#: ../src/gui/dialogs/UnusedAudioSelectionDialog.cpp:54
+msgid "File size"
+msgstr "Bestandsgrootte"
+
+#: ../src/gui/dialogs/UnusedAudioSelectionDialog.cpp:55
+msgid "Last modified date"
+msgstr "Datum laatst gewijzigd"
+
+#: ../src/gui/dialogs/UnusedAudioSelectionDialog.cpp:60
+msgid " (not found) "
+msgstr "(niet gevonden)"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:105
+msgid "Audio File Manager"
+msgstr "Audiobestand-beheerder"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:126
+msgid ""
+"* Some audio files are encoded at a sample rate different from that of the "
+"JACK audio server.\n"
+"Rosegarden will play them at the correct speed, but they will sound "
+"terrible.\n"
+"Please consider resampling such files externally, or adjusting the sample "
+"rate of the JACK server."
+msgstr ""
+"* Sommige audiobestanden zijn gecodeerd met een sample rate anders dan die "
+"van de JACK audioserver.\n"
+"Rosegarden zal ze op de juiste snelheid afspelen, maar dat klinkt "
+"verschrikkelijk.\n"
+"Overweeg om zulke bestanden extern te hersamplen, of om de sample rate van "
+"de JACK server aan te passen.* Some audio files are encoded at a sample rate "
+"different from that of the JACK audio server.\n"
+"Rosegarden will play them at the correct speed, but they will sound "
+"terrible.\n"
+"Please consider resampling such files externally, or adjusting the sample "
+"rate of the JACK server."
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:132
+msgid "&Add Audio File..."
+msgstr "Voeg &audiobestand toe..."
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:135
+msgid "&Unload Audio File"
+msgstr "&Vergeet audiobestand"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:140
+msgid "&Play Preview"
+msgstr "S&peel voorbeeld"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:151
+msgid "&Insert into Selected Audio Track"
+msgstr "Voeg &in in geselecteerd audiospoor"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:155
+msgid "Unload &all Audio Files"
+msgstr "Vergeet alle audiobestanden"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:159
+msgid "Unload all &Unused Audio Files"
+msgstr "Vergeet alle &ongebruikte audiobestanden"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:163
+msgid "&Delete Unused Audio Files..."
+msgstr "&Verwijder ongebruikte audiobestanden"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:167
+msgid "&Export Audio File..."
+msgstr "&Exporteer audiobestand..."
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:173
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:180
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:91
+msgid "Duration"
+msgstr "Duur"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:181
+msgid "Envelope"
+msgstr "Envelop"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:182
+msgid "Sample rate"
+msgstr "Sample tempo"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:183
+msgid "Channels"
+msgstr "Kanalen"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:282
+msgid "<no audio files>"
+msgstr "<geen audio bestanden>"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:488
+msgid "*.wav|WAV files (*.wav)"
+msgstr "*.wav|WAV-bestanden (*.wav)"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:489
+msgid "Choose a name to save this file as"
+msgstr "Kies naam waaronder dit bestand opgeslagen moet worden"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:499
+msgid "Exporting audio file..."
+msgstr "Bezig met exporteren van audio bestand..."
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:609
+msgid ""
+"This will unload audio file \"%1\" and remove all associated segments. Are "
+"you sure?"
+msgstr ""
+"Weet u zeker dat u het audio bestand \"%1\" en alle hierbij "
+"behorendesegmenten wilt laten vergeten?"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:692
+msgid ""
+"*.wav|WAV files (*.wav)\n"
+"*.*|All files"
+msgstr ""
+"*.wav|WAV-bestanden (*.wav)\n"
+"*.*|Alle bestanden"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:697
+msgid ""
+"*.wav *.flac *.ogg *.mp3|Audio files (*.wav *.flac *.ogg *.mp3)\n"
+"*.wav|WAV files (*.wav)\n"
+"*.flac|FLAC files (*.flac)\n"
+"*.ogg|Ogg files (*.ogg)\n"
+"*.mp3|MP3 files (*.mp3)\n"
+"*.*|All files"
+msgstr ""
+"*.wav *.flac *.ogg *.mp3|Audiobestanden (*.wav *.flac *.ogg *.mp3)\n"
+"*.wav|WAV-bestanden (*.wav)\n"
+"*.flac|FLAC-bestanden (*.flac)\n"
+"*.ogg|Ogg-bestanden (*.ogg)\n"
+"*.mp3|MP3-bestanden (*.mp3)\n"
+"*.*|Alle bestanden"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:704
+msgid "Select one or more audio files"
+msgstr "Selecteer een of meer audio bestanden"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:763
+msgid ""
+"This will unload all audio files and remove their associated segments.\n"
+"This action cannot be undone, and associations with these files will be "
+"lost.\n"
+"Files will not be removed from your disk.\n"
+"Are you sure?"
+msgstr ""
+"This will unload all audio files and remove their associated segments.\n"
+"This action cannot be undone, and associations with these files will be "
+"lost.\n"
+"Files will not be removed from your disk.\n"
+"Are you sure?"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:800
+msgid ""
+"This will unload all audio files that are not associated with any segments "
+"in this composition.\n"
+"This action cannot be undone, and associations with these files will be "
+"lost.\n"
+"Files will not be removed from your disk.\n"
+"Are you sure?"
+msgstr ""
+"Hierdoor worden alle audiobestanden vergeten die niet zijn geassocieerd met "
+"segmenten in deze compositie.\n"
+"Deze actie kan niet ongedaan gemaakt worden, en associaties met deze "
+"bestanden gaan verloren.\n"
+"Bestanden worden niet van uw schijf gewist.\n"
+"Weet u zeker dat u wilt doorgaan?"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:865
+msgid ""
+"The following audio files are not used in the current composition.\n"
+"\n"
+"Please select the ones you wish to delete permanently from the hard disk.\n"
+msgstr ""
+"De volgende audiobestanden worden niet gebruikt in de huidige compositie.\n"
+"\n"
+"Selecteer welke u permanent van de harde schijf wilt verwijderen.\n"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:875
+#, c-format
+msgid ""
+"_n: <qt>About to delete 1 audio file permanently from the hard disk.<br>This "
+"action cannot be undone, and there will be no way to recover this file."
+"<br>Are you sure?</qt>\n"
+"\n"
+"<qt>About to delete %n audio files permanently from the hard disk.<br>This "
+"action cannot be undone, and there will be no way to recover these files."
+"<br>Are you sure?</qt>"
+msgstr ""
+"1 audiobestand zal permanent van de harde schijf gewist worden.\n"
+"Deze actie kan niet ongedaan gemaakt worden, en er is geen manier dit "
+"bestand terug te zetten.\n"
+"Weet u zeker dat u wilt doorgaan?\n"
+"%n audiobestanden zullen permanent van de harde schijf gewist worden.\n"
+"Deze actie kan niet ongedaan gemaakt worden, en er is geen manier deze "
+"bestanden terug te zetten.\n"
+"Weet u zeker dat u wilt doorgaan?"
+
+#: ../src/document/RosegardenGUIDoc.cpp:525
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:888
+msgid "File %1 could not be deleted."
+msgstr "Bestand %1 kon niet worden gewist."
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:921
+msgid "Change Audio File label"
+msgstr "Verander Audio Bestand label"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:6466
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:922
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:1099
+msgid "Enter new label"
+msgstr "Voer nieuw label in"
+
+#: ../src/gui/application/RosegardenGUIView.cpp:1538
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:1086
+msgid "Adding audio file..."
+msgstr "Bezig audiobestand toe te voegen..."
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:1107
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:1112
+msgid "Failed to add audio file. "
+msgstr "Audiobestand toevoegen mislukt."
+
+#: ../src/document/RosegardenGUIDoc.cpp:2789
+#: ../src/gui/application/RosegardenGUIApp.cpp:2736
+#: ../src/gui/application/RosegardenGUIView.cpp:1574
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:1122
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:180
+msgid "Generating audio preview..."
+msgstr "Bezig met genereren van audio voorbeeld"
+
+#: ../src/gui/application/RosegardenGUIView.cpp:1581
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:1130
+msgid ""
+"Try copying this file to a directory where you have write permission and re-"
+"add it"
+msgstr ""
+"Probeer dit bestand te verplaatsen naar een map waar u schrijfrechten heeft "
+"en probeer het opnieuw toe te voegen"
+
+#: ../src/gui/dialogs/TransportDialog.cpp:90 rc.cpp:357
+#, no-c-format
+msgid "Rosegarden Transport"
+msgstr "Rosegarden Transport"
+
+#: ../src/gui/dialogs/TransportDialog.cpp:925
+#: ../src/gui/dialogs/TransportDialog.cpp:985
+msgid "PITCH WHEEL"
+msgstr "TOONHOOGTE WIEL"
+
+#: ../src/gui/dialogs/TransportDialog.cpp:929
+#: ../src/gui/dialogs/TransportDialog.cpp:989
+msgid "CONTROLLER"
+msgstr "CONTROLLER"
+
+#: ../src/gui/dialogs/TransportDialog.cpp:933
+#: ../src/gui/dialogs/TransportDialog.cpp:993
+msgid "PROG CHNGE"
+msgstr "PROG CHNGE"
+
+#: ../src/gui/dialogs/TransportDialog.cpp:938
+#: ../src/gui/dialogs/TransportDialog.cpp:998
+msgid "PRESSURE"
+msgstr "PRESSURE"
+
+#: ../src/gui/dialogs/TransportDialog.cpp:942
+#: ../src/gui/dialogs/TransportDialog.cpp:1002
+msgid "SYS MESSAGE"
+msgstr "SYS MESSAGE"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:177
+#: ../src/gui/dialogs/QuantizeDialog.cpp:40
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:127
+msgid "Quantize"
+msgstr "Quantiseren"
+
+#: ../src/gui/dialogs/QuantizeDialog.cpp:52
+msgid "Advanced"
+msgstr "Geavanceerd"
+
+#: ../src/gui/dialogs/ExportDeviceDialog.cpp:42
+msgid "Export Devices..."
+msgstr "Apparaten exporteren..."
+
+#: ../src/gui/dialogs/ExportDeviceDialog.cpp:47
+msgid "Export devices"
+msgstr "Apparaten exporteren"
+
+#: ../src/gui/dialogs/ExportDeviceDialog.cpp:49
+msgid "Export all devices"
+msgstr "Alle apparaten exporteren"
+
+#: ../src/gui/dialogs/ExportDeviceDialog.cpp:50
+msgid "Export selected device only"
+msgstr "Alleen geselecteerde apparaat exporteren"
+
+#: ../src/gui/dialogs/ExportDeviceDialog.cpp:51
+msgid " (\"%1\")"
+msgstr " (\"%1\")"
+
+#: ../src/gui/dialogs/CompositionLengthDialog.cpp:44
+msgid "Change Composition Length"
+msgstr "Verander compositielengte"
+
+#: ../src/gui/dialogs/CompositionLengthDialog.cpp:50
+msgid "Set the Start and End bar markers for this Composition"
+msgstr "Stel begin- en eind-maatindicatoren in voor deze compositie"
+
+#: ../src/gui/dialogs/CompositionLengthDialog.cpp:54
+msgid "Start Bar"
+msgstr "Beginmaat"
+
+#: ../src/gui/dialogs/CompositionLengthDialog.cpp:62
+msgid "End Bar"
+msgstr "Eindmaat"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:62
+msgid "LilyPond Export/Preview"
+msgstr "Lilypond-export/voorbeeld"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:85
+msgid "General options"
+msgstr "Algemene opties"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:90
+msgid "Advanced options"
+msgstr "Geavanceerde opties"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:112
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:95
+msgid "Headers"
+msgstr "Headers"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:106
+msgid "Basic options"
+msgstr "Basisopties"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:113
+msgid "Compatibility level"
+msgstr "Lilypond compatibiliteitsniveau"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:117
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:118
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:119
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:120
+#, c-format
+msgid "LilyPond %1"
+msgstr "Lilypond %1"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:125
+msgid "Paper size"
+msgstr "Papierformaat"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:129
+msgid "A3"
+msgstr "A3"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:130
+msgid "A4"
+msgstr "A4"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:131
+msgid "A5"
+msgstr "A5"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:132
+msgid "A6"
+msgstr "A6"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:133
+msgid "Legal"
+msgstr "Legal"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:134
+msgid "US Letter"
+msgstr "US Letter"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:135
+msgid "Tabloid"
+msgstr "Tabloid"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:136
+msgid "do not specify"
+msgstr "niet opgeven"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:152
+msgid "Font size"
+msgstr "Lettergrootte"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:157
+msgid "%1 pt"
+msgstr "%1 pt"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:169
+msgid "Staff level options"
+msgstr "Opties op notenbalk-nivo"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:176
+msgid "Export content"
+msgstr "Exporteren inhoud"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:179
+msgid "All tracks"
+msgstr "Alle sporen"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:180
+msgid "Non-muted tracks"
+msgstr "Niet-gedempte sporen"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:181
+msgid "Selected track"
+msgstr "Geselecteerd spoor"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:182
+msgid "Selected segments"
+msgstr "Geselecteerde segmenten"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:188
+msgid "Merge tracks that have the same name"
+msgstr "Voeg gelijknamige sporen samen"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:198
+msgid "Notation options"
+msgstr "Notatie-opties"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:206
+msgid "First"
+msgstr "Eerste"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:207
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:538
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:557
+msgid "All"
+msgstr "Alle"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:211
+msgid "Export tempo marks "
+msgstr "Exporteer tempo-markeringen"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:215
+msgid "Export lyrics"
+msgstr "Exporteer liedteksten"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:225
+msgid "Export beamings"
+msgstr "Exporteer groeperingen"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:232
+msgid "Export track staff brackets"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:244
+msgid "Layout options"
+msgstr "Layout-opties"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:257
+msgid "Lyrics alignment"
+msgstr "Liedtekst-plaatsing"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:261
+msgid "Ragged bottom (systems will not be spread vertically across the page)"
+msgstr ""
+"Variabele onderkant (systemen worden niet verticaal over de pagina verdeeld)"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:267
+msgid "Miscellaneous options"
+msgstr "Overige opties"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:274
+msgid "Enable \"point and click\" debugging"
+msgstr "Zet \"wijs en klik\" debuggen aan"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:279
+msgid "Export \\midi block"
+msgstr "Exporteer \\midi blok"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:284
+msgid "No markers"
+msgstr "Geen markeringen"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:285
+msgid "Rehearsal marks"
+msgstr "Oefen-markeringen"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:286
+msgid "Marker text"
+msgstr "Markeringstekst"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:290
+msgid "Export markers"
+msgstr "Exporteer markeringen"
+
+#: ../src/gui/dialogs/AudioSplitDialog.cpp:57
+msgid "Autosplit Audio Segment"
+msgstr "Automatisch Audio Segment Opsplitsen"
+
+#: ../src/gui/dialogs/AudioSplitDialog.cpp:70
+msgid "AutoSplit Segment \""
+msgstr "Automatisch Opslitsen Segment \""
+
+#: ../src/gui/dialogs/AudioSplitDialog.cpp:84
+msgid "Threshold"
+msgstr "Drempel"
+
+#: ../src/gui/dialogs/AudioSplitDialog.cpp:142
+msgid "<no preview generated for this audio file>"
+msgstr "<geen voorbeeld gegenereerd voor dit audio bestand>"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:70
+msgid "Audio Plugin"
+msgstr "Audio Plugin"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:94
+#: ../src/gui/widgets/AudioFaderBox.cpp:136
+msgid "Editor"
+msgstr "Editor"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:100
+msgid "Plugin"
+msgstr "Plugin"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:105
+msgid "Category:"
+msgstr "Categorie:"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:110
+msgid "Plugin:"
+msgstr "Plugin:"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:114
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:398
+msgid "Select a plugin from this list."
+msgstr "Selecteer een plugin uit deze lijst."
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:119
+msgid "Bypass"
+msgstr "Sla over"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:121
+msgid "Bypass this plugin."
+msgstr "Sla deze plugin over."
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:127
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:390
+msgid "<ports>"
+msgstr "<poorten>"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:130
+msgid "Input and output port counts."
+msgstr "Aantal input- en output-poorten"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:132
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:391
+msgid "<id>"
+msgstr "<id>"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:135
+msgid "Unique ID of plugin."
+msgstr "Uniek ID van plugin."
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:149
+msgid "Copy plugin parameters"
+msgstr "Kopieer plugin-parameters"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:155
+msgid "Paste plugin parameters"
+msgstr "Plak plugin-parameters"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:161
+msgid "Set to defaults"
+msgstr "Stel in op standaardwaarden"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:225
+msgid "(any)"
+msgstr "(alles)"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:226
+msgid "(unclassified)"
+msgstr "(ongeclassificeerd)"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:247
+msgid "(none)"
+msgstr "(geen)"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:389
+#: ../src/gui/editors/parameters/AudioInstrumentParameterPanel.cpp:132
+#: ../src/gui/editors/parameters/AudioInstrumentParameterPanel.cpp:361
+#: ../src/gui/studio/AudioMixerWindow.cpp:685
+#: ../src/gui/studio/AudioMixerWindow.cpp:724
+#: ../src/gui/studio/AudioMixerWindow.cpp:906
+#: ../src/gui/widgets/AudioFaderBox.cpp:79
+msgid "<no plugin>"
+msgstr "<geen plugin>"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:427
+msgid "This plugin has too many controls to edit here."
+msgstr "Deze plugin heeft teveel instellingen om hier te bewerken."
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:438
+#, c-format
+msgid "Id: %1"
+msgstr "Id: %1"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:490
+msgid "mono"
+msgstr "mono"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:492
+msgid "stereo"
+msgstr "stereo"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:494
+msgid "%1 in, %2 out"
+msgstr "%1 in, %2 uit"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:518
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:704
+msgid "Program: "
+msgstr "Programma:"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:522
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:532
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:708
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:716
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:745
+msgid "<none selected>"
+msgstr "<geen geselecteerd>"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:56
+msgid "Set the %1 property of the event selection:"
+msgstr "Stel de %1 eigenschap van de gebeurtenis selectie in:"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:61
+msgid "Pattern"
+msgstr "Patroon"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:66
+msgid "Flat - set %1 to value"
+msgstr "Mol - stel %1 in op waarde"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:70
+msgid "Alternating - set %1 to max and min on alternate events"
+msgstr ""
+"Alternerend - zet %1 op max en min waarde bij alternerende gebeurtenissen"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:74
+msgid "Crescendo - set %1 rising from min to max"
+msgstr "Crescendo - zet %1 oplopend van min naar max"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:78
+msgid "Diminuendo - set %1 falling from max to min"
+msgstr "Diminuendo - zet %1 aflopend van max naar min"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:82
+msgid "Ringing - set %1 alternating from max to min with both dying to zero"
+msgstr ""
+"Rammelend - stel %1 alternerend van max naar min met beiden afnemend tot nul"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:123
+#: ../src/gui/dialogs/EventParameterDialog.cpp:150
+msgid "First Value"
+msgstr "Eerste Waarde"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:124
+#: ../src/gui/dialogs/EventParameterDialog.cpp:151
+msgid "Second Value"
+msgstr "Twee Waarde"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:132
+#: ../src/gui/dialogs/EventParameterDialog.cpp:142
+msgid "Low Value"
+msgstr "Lage waarde"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:133
+#: ../src/gui/dialogs/EventParameterDialog.cpp:141
+msgid "High Value"
+msgstr "Hoge waarde"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:56 ../src/gui/rulers/TempoRuler.cpp:127
+msgid "Insert Tempo Change"
+msgstr "Voeg tempoverandering in"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:69
+msgid "New tempo:"
+msgstr "Nieuw tempo:"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:76
+msgid "Tap"
+msgstr ""
+
+#: ../src/gui/dialogs/TempoDialog.cpp:81
+msgid "Tempo is fixed until the following tempo change"
+msgstr "Tempo ligt vast tot volgende tempoverandering"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:82
+msgid "Tempo ramps to the following tempo"
+msgstr "Tempo verloopt naar volgende tempo"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:83
+msgid "Tempo ramps to:"
+msgstr "Tempo verloopt naar:"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:120
+msgid "Time of tempo change"
+msgstr "Tijd van tempoverandering"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:138
+msgid "The pointer is currently at "
+msgstr "De aanwijzer is momenteel op "
+
+#: ../src/gui/dialogs/TempoDialog.cpp:154
+msgid "Apply this tempo from here onwards"
+msgstr "Pas dit tempo vanaf hier toe"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:158
+msgid "Replace the last tempo change"
+msgstr "Vervang de laatste tempo verandering"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:164
+msgid "Apply this tempo from the start of this bar"
+msgstr "Pas dit tempo toe vanaf het begin van deze maat"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:167
+msgid "Apply this tempo to the whole composition"
+msgstr "Pas dit tempo toe op de gehele compositie"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:172
+msgid "Also make this the default tempo"
+msgstr "Maak dit ook het standaardtempo"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:256
+msgid "%1.%2 s,"
+msgstr "%1.%2 s"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:262
+#, c-format
+msgid "at the start of measure %1."
+msgstr "aan het begin van maat %1."
+
+#: ../src/gui/dialogs/TempoDialog.cpp:266
+#, c-format
+msgid "in the middle of measure %1."
+msgstr "in het midden van maat %1."
+
+#: ../src/gui/dialogs/TempoDialog.cpp:285
+msgid " (at %1.%2 s, in measure %3)"
+msgstr " (op %1.%2 s, in maat %3)"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:302
+msgid "There are no preceding tempo changes."
+msgstr "Er zijn geen voorafgaande tempoveranderingen."
+
+#: ../src/gui/dialogs/TempoDialog.cpp:310
+msgid "There are no other tempo changes."
+msgstr "Er zijn geen andere tempo veranderingen."
+
+#: ../src/gui/dialogs/TempoDialog.cpp:328
+msgid " bpm"
+msgstr " bpm"
+
+#: ../src/gui/dialogs/AudioPlayingDialog.cpp:42
+msgid "Playing audio file"
+msgstr "Spelen van audio bestand"
+
+#: ../src/gui/dialogs/AudioPlayingDialog.cpp:47
+msgid "Playing audio file \"%1\""
+msgstr "Spelen van audio bestand \"%1\""
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:52
+#: ../src/gui/editors/matrix/MatrixView.cpp:2655
+msgid "Trigger Segment"
+msgstr "Trigger segment"
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:61
+msgid "Trigger segment: "
+msgstr "Trigger segment: "
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:59
+msgid "Key Change"
+msgstr "Verander toonsoort"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:77
+msgid "Key signature"
+msgstr "Sleutel toonsoortaanduiding"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:80
+msgid "Key transposition"
+msgstr "Toonsoorttranspositie"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:86
+msgid "Existing notes following key change"
+msgstr "Bestaande noten volgende toonsoortverandering"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:98
+msgid "Flatten"
+msgstr "Voeg mol toe"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:100
+msgid "Key"
+msgstr "Toonsoort"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:105
+msgid "Sharpen"
+msgstr "Voeg Kruis Toe"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:109
+msgid "Major"
+msgstr "Majeur"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:110
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:369
+msgid "Minor"
+msgstr "Mineur"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:123
+msgid "Transpose key according to segment transposition"
+msgstr "Transponeer toonsoort volgens segmenttranspositie"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:126
+msgid "Use specified key. Do not transpose"
+msgstr "Gebruik gekozen toonsoort. Transponeer niet."
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:134
+msgid "Apply to current segment only"
+msgstr "Pas alleen op huidige segment toe"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:137
+msgid "Apply to all segments at this time"
+msgstr "Pas toe op alle momenteel bestaande segmenten toe"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:141
+msgid "Exclude percussion segments"
+msgstr "Sluit slagwerksegmenten uit"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:155
+msgid "Maintain current accidentals"
+msgstr "Behoud huidige voortekens"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:158
+msgid "Transpose into this key"
+msgstr "Transponeer naar deze toonsoort"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:331
+msgid "No such key"
+msgstr "Onbekende toonsoort"
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:44
+#: ../src/gui/editors/notation/NotationSelector.cpp:118
+msgid "Interpret"
+msgstr "Interpreteer"
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:50
+msgid "Interpretations to apply"
+msgstr "Interpretaties om toe te passen"
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:53
+msgid "Apply text dynamics (p, mf, ff etc)"
+msgstr "Voeg tekstuele dynamiek toe (p, mf, ff, etc)"
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:55
+msgid "Apply hairpin dynamics"
+msgstr "Pas haarspel dymaniek toe"
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:57
+msgid "Stress beats"
+msgstr "Beklemtoon beats"
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:59
+msgid "Articulate slurs, staccato, tenuto etc"
+msgstr "Benadruk staccato, tenuto, etc"
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:61
+msgid "All available interpretations"
+msgstr "Alle beschikbare interpretaties"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:316
+msgid ""
+"Attempted to launch JACK audio daemon failed. Audio will be disabled.\n"
+"Please check configuration (Settings -> Configure Rosegarden -> Audio -> "
+"Startup)\n"
+" and restart."
+msgstr ""
+"Poging om de JACK audio-daemon te starten is mislukt. Audio is "
+"uitgeschakeld.\n"
+"Controleer de configuratie (Instellingen -> Rosegarden instellen -> Audio -> "
+"JACK Startup)\n"
+"en start opnieuw."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:325
+msgid "Starting sequencer..."
+msgstr "Starten sequencer..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:333
+msgid "Initializing plugin manager..."
+msgstr "Plugin-beheerder initialiseren..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:338
+msgid "Initializing view..."
+msgstr "Overzicht initialiseren..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:354
+msgid "Special Parameters"
+msgstr "Speciale parameters"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:430
+msgid "Starting sequence manager..."
+msgstr "Sequence-beheerder starten..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:456
+msgid "Clearing studio data..."
+msgstr "Wissen studio data..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:475
+#: ../src/gui/editors/notation/NotationView.cpp:558
+msgid "Starting..."
+msgstr "Starten..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:556
+msgid "Import Rosegarden &Project file..."
+msgstr "Importeer &Rosegarden project-bestand..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:560
+msgid "Import &MIDI file..."
+msgstr "Importeer &MIDI-bestand..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:564
+msgid "Import &Rosegarden 2.1 file..."
+msgstr "Importeer &Rosegarden 2.1-bestand..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:568
+msgid "Import &Hydrogen file..."
+msgstr "Importeer Hydrogen-bestand..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:572
+msgid "Merge &File..."
+msgstr "&Bestand samenvoegen..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:576
+msgid "Merge &MIDI file..."
+msgstr "&MIDI-bestand samenvoegen..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:580
+msgid "Merge &Rosegarden 2.1 file..."
+msgstr "&Rosegarden 2.1-bestand samenvoegen..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:584
+msgid "Merge &Hydrogen file..."
+msgstr "&Hydrogen-bestand samenvoegen..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:588
+msgid "Export Rosegarden &Project file..."
+msgstr "Exporteer &Rosegarden project-bestand..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:592
+msgid "Export &MIDI file..."
+msgstr "Exporteer &MIDI-bestand..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:596
+msgid "Export &LilyPond file..."
+msgstr "Exporteer &Lilypond-bestand..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:600
+msgid "Export Music&XML file..."
+msgstr "Exporteer Music&XML-bestand..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:604
+msgid "Export &Csound score file..."
+msgstr "Exporteer &Csound score-bestand..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:608
+msgid "Export M&up file..."
+msgstr "Exporteer M&up-bestand..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:612
+#: ../src/gui/editors/notation/NotationView.cpp:1500
+msgid "Print &with LilyPond..."
+msgstr "Afdrukken met Lil&yPond"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:616
+#: ../src/gui/editors/notation/NotationView.cpp:1504
+msgid "Preview with Lil&yPond..."
+msgstr "Preview met Lil&yPond"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:620
+msgid "Play&list"
+msgstr "Afspeel&lijst"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:627
+msgid "Rosegarden &Tutorial"
+msgstr "Rosegarden-handleiding"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:631
+msgid "&Bug Reporting Guidelines"
+msgstr "Richtlijnen bugs rapporteren"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:645
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:348
+#: ../src/gui/editors/segment/MarkerEditor.cpp:378
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:388
+#: ../src/gui/general/EditViewBase.cpp:190
+#: ../src/gui/studio/BankEditorDialog.cpp:318
+#: ../src/gui/studio/DeviceManagerDialog.cpp:227
+msgid "Und&o"
+msgstr "&Ongedaan Maken"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:651
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:354
+#: ../src/gui/editors/segment/MarkerEditor.cpp:384
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:394
+#: ../src/gui/general/EditViewBase.cpp:196
+#: ../src/gui/studio/BankEditorDialog.cpp:324
+#: ../src/gui/studio/DeviceManagerDialog.cpp:233
+msgid "Re&do"
+msgstr "Opnieuw &Doen"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:665
+#: ../src/gui/editors/notation/NotationView.cpp:2297
+msgid "Show T&ools Toolbar"
+msgstr "Toon &hulpmiddelen-werkbalk"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:669
+msgid "Show Trac&ks Toolbar"
+msgstr "Toon &sporenwerkbalk"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:673
+msgid "Show &Editors Toolbar"
+msgstr "Toon &editors-werkbalk"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:677
+#: ../src/gui/editors/notation/NotationView.cpp:2309
+msgid "Show Trans&port Toolbar"
+msgstr "Toon trans&portwerkbalk"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:681
+msgid "Show &Zoom Toolbar"
+msgstr "Toon &zoom-werkbalk"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:688
+msgid "Show Tra&nsport"
+msgstr "Toon &transport"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:693
+msgid "Show Track &Labels"
+msgstr "Toon spoor&labels"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:698
+msgid "Show Playback Position R&uler"
+msgstr "Toon afspeelpositie-liniaal"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:703
+msgid "Show Te&mpo Ruler"
+msgstr "Toon te&mpo-liniaal"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:708
+msgid "Show Cho&rd Name Ruler"
+msgstr "Toon akkoo&rdnaam-liniaal"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:714
+msgid "Show Segment Pre&views"
+msgstr "Toon segment&voorbeelden"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:719
+msgid "Show Special &Parameters"
+msgstr "Toon speciale &parameters"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:753
+#: ../src/gui/editors/matrix/MatrixView.cpp:641
+#: ../src/gui/editors/notation/NotationView.cpp:1772
+msgid "&Select and Edit"
+msgstr "&Selecteer en bewerk"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:758
+#: ../src/gui/editors/matrix/MatrixView.cpp:646
+msgid "&Draw"
+msgstr "&Teken"
+
+#: ../src/commands/edit/EraseCommand.h:50
+#: ../src/gui/application/RosegardenGUIApp.cpp:763
+#: ../src/gui/editors/matrix/MatrixView.cpp:651
+#: ../src/gui/editors/notation/NotationView.cpp:1766
+msgid "&Erase"
+msgstr "&Wissen"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:768
+#: ../src/gui/editors/matrix/MatrixView.cpp:656
+msgid "&Move"
+msgstr "&Verplaats"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:775
+msgid "&Resize"
+msgstr "&Herschaal"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:782 rc.cpp:87
+#, no-c-format
+msgid "&Split"
+msgstr "&Opsplitsen"
+
+#: ../src/commands/segment/SegmentJoinCommand.h:53
+#: ../src/gui/application/RosegardenGUIApp.cpp:789
+msgid "&Join"
+msgstr "&Samenvoegen"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:795
+msgid "&Harmonize"
+msgstr "&Harmoniseer"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:806
+#: ../src/gui/rulers/TempoRuler.cpp:157
+msgid "Open Tempo and Time Signature Editor"
+msgstr "Open tempo- en maatsoort-editor"
+
+#: ../src/commands/segment/CutRangeCommand.cpp:41
+#: ../src/gui/application/RosegardenGUIApp.cpp:812
+msgid "Cut Range"
+msgstr "Bereik knippen"
+
+#: ../src/commands/edit/CopyCommand.cpp:73
+#: ../src/gui/application/RosegardenGUIApp.cpp:816
+msgid "Copy Range"
+msgstr "Bereik kopiëren"
+
+#: ../src/commands/segment/PasteRangeCommand.cpp:45
+#: ../src/gui/application/RosegardenGUIApp.cpp:820
+msgid "Paste Range"
+msgstr "Bereik plakken"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:828
+msgid "Insert Range..."
+msgstr "Voeg bereik in..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:832
+#: ../src/gui/editors/notation/NotationView.cpp:1804
+msgid "De&lete"
+msgstr "&Verwijder"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:836
+msgid "Select &All Segments"
+msgstr "Selecteer &Alle Segmenten"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:852
+msgid "Edit Mar&kers..."
+msgstr "Bewerk mar&kers..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:856
+msgid "Edit Document P&roperties..."
+msgstr "Bewerk Document&eigenschappen..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:864
+msgid "Open in &Default Editor"
+msgstr "Open in &Standaard Bewerker"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:870
+#: ../src/gui/general/EditViewBase.cpp:206
+msgid "Open in Matri&x Editor"
+msgstr "Open in matri&xeditor"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:876
+#: ../src/gui/general/EditViewBase.cpp:212
+msgid "Open in &Percussion Matrix Editor"
+msgstr "Open in &slagwerk-matrixeditor"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:882
+#: ../src/gui/general/EditViewBase.cpp:218
+msgid "Open in &Notation Editor"
+msgstr "Open in &notatie-editor"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:888
+#: ../src/gui/general/EditViewBase.cpp:224
+msgid "Open in &Event List Editor"
+msgstr "Open in &gebeurtenissenlijst-editor"
+
+#: ../src/commands/edit/EventQuantizeCommand.cpp:120
+#: ../src/commands/edit/EventUnquantizeCommand.cpp:87
+#: ../src/gui/application/RosegardenGUIApp.cpp:894
+msgid "&Quantize..."
+msgstr "&Quantiseer"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:908
+#: ../src/gui/editors/matrix/MatrixView.cpp:686
+msgid "Repeat Last Quantize"
+msgstr "Herhaal laatste quantisering"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:928
+msgid "Split at Time..."
+msgstr "Splits op tijdstip..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:932
+#: ../src/gui/general/EditView.cpp:796
+msgid "Jog &Left"
+msgstr "Tikje naar &links"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:936
+#: ../src/gui/general/EditView.cpp:800
+msgid "Jog &Right"
+msgstr "Tikje naar &rechts"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:940
+msgid "Set Start Time..."
+msgstr "Stel begintijd in..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:944
+msgid "Set Duration..."
+msgstr "Bewerk Duur..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:953
+msgid "Turn Re&peats into Copies"
+msgstr "Verander herhalingen in kopieën"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:958
+msgid "Manage Tri&ggered Segments"
+msgstr "Beheer &getriggerde segmenten"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:962
+msgid "Set Tempos from &Beat Segment"
+msgstr "Stel tempo in via beat-segment"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:966
+msgid "Set &Tempo to Audio Segment Duration"
+msgstr "Stel &Tempo in op Audio Segment Duur"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:972
+msgid "Manage A&udio Files"
+msgstr "Beheer audiobestanden"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:977
+msgid "Show Segment Labels"
+msgstr "Toon segmentlabels"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:986
+msgid "Add &Track"
+msgstr "Voeg Spoor Toe"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:990
+msgid "&Add Tracks..."
+msgstr "&Voeg Sporen Toe..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:996
+msgid "D&elete Track"
+msgstr "&Verwijder Spoor"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1002
+msgid "Move Track &Down"
+msgstr "Verplaats Spoor &Omlaag"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1008
+msgid "Move Track &Up"
+msgstr "Verplaats Spoor &Omhoog"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1012
+msgid "Select &Next Track"
+msgstr "Selecteer &Volgende Spoor"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1017
+msgid "Select &Previous Track"
+msgstr "Selecteer &Vorige Spoor"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1022
+msgid "Mute or Unmute Track"
+msgstr "Demp of ont-demp spoor"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1027
+msgid "Arm or Un-arm Track for Record"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1034
+msgid "&Mute all Tracks"
+msgstr "De&mp alle sporen"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1040
+msgid "&Unmute all Tracks"
+msgstr "&Ont-demp alle sporen"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1044
+msgid "&Remap Instruments..."
+msgstr "He&rmap Instrumenten..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1053
+msgid "&Audio Mixer"
+msgstr "&Audio-mixer"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1059
+msgid "Midi Mi&xer"
+msgstr "MIDI-mi&xer"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1065
+msgid "Manage MIDI &Devices"
+msgstr "Beheer MI&DI-apparaten"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1071
+msgid "Manage S&ynth Plugins"
+msgstr "Beheer s&ynth-plugins"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1075
+msgid "Modify MIDI &Filters"
+msgstr "Wijzig MIDI-&filters..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1079
+msgid "MIDI Thru Routing"
+msgstr "MIDI Thru Routing"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1085
+msgid "Manage &Metronome"
+msgstr "Beheer &metronoom"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1089
+msgid "&Save Current Document as Default Studio"
+msgstr "&Sla huidige document op als standaardstudio"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1093
+msgid "&Import Default Studio"
+msgstr "&Importeer standaardstudio"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1097
+msgid "Im&port Studio from File..."
+msgstr "Im&porteer studio uit bestand..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1101
+msgid "&Reset MIDI Network"
+msgstr "He&rstart MIDI-netwerk"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1105
+msgid "Set Quick Marker at Playback Position"
+msgstr "Zet de quickmarker op de afspeelpositie"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1109
+msgid "Jump to Quick Marker"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1142
+#: ../src/gui/editors/matrix/MatrixView.cpp:782
+#: ../src/gui/editors/notation/NotationView.cpp:2397
+#: ../src/gui/studio/AudioMixerWindow.cpp:105
+#: ../src/gui/studio/MidiMixerWindow.cpp:81
+msgid "&Play"
+msgstr "&Afspelen"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1153
+#: ../src/gui/editors/matrix/MatrixView.cpp:791
+#: ../src/gui/editors/notation/NotationView.cpp:2406
+#: ../src/gui/studio/AudioMixerWindow.cpp:114
+#: ../src/gui/studio/MidiMixerWindow.cpp:90
+msgid "&Stop"
+msgstr "&Stoppen"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1160
+#: ../src/gui/editors/matrix/MatrixView.cpp:802
+#: ../src/gui/editors/notation/NotationView.cpp:2417
+#: ../src/gui/studio/AudioMixerWindow.cpp:125
+#: ../src/gui/studio/MidiMixerWindow.cpp:101
+msgid "&Fast Forward"
+msgstr "Snel &vooruitspoelen"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1168
+#: ../src/gui/editors/matrix/MatrixView.cpp:796
+#: ../src/gui/editors/notation/NotationView.cpp:2411
+#: ../src/gui/studio/AudioMixerWindow.cpp:119
+#: ../src/gui/studio/MidiMixerWindow.cpp:95
+msgid "Re&wind"
+msgstr "&Terugspoelen"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1175
+msgid "P&unch in Record"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1182
+#: ../src/gui/studio/AudioMixerWindow.cpp:143
+#: ../src/gui/studio/MidiMixerWindow.cpp:119
+msgid "&Record"
+msgstr "&Opnemen"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1189
+#: ../src/gui/editors/matrix/MatrixView.cpp:808
+#: ../src/gui/editors/notation/NotationView.cpp:2423
+#: ../src/gui/studio/AudioMixerWindow.cpp:131
+#: ../src/gui/studio/MidiMixerWindow.cpp:107
+msgid "Rewind to &Beginning"
+msgstr "Terugspoelen tot het &begin"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1196
+#: ../src/gui/editors/matrix/MatrixView.cpp:814
+#: ../src/gui/editors/notation/NotationView.cpp:2429
+#: ../src/gui/studio/AudioMixerWindow.cpp:137
+#: ../src/gui/studio/MidiMixerWindow.cpp:113
+msgid "Fast Forward to &End"
+msgstr "Vooruitspoelen tot het &eind"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1203
+#: ../src/gui/editors/matrix/MatrixView.cpp:832
+#: ../src/gui/editors/notation/NotationView.cpp:2447
+msgid "Scro&ll to Follow Playback"
+msgstr "Scrollen om afspelen te volgen"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1209
+#: ../src/gui/editors/matrix/MatrixView.cpp:838
+#: ../src/gui/editors/notation/NotationView.cpp:2453
+#: ../src/gui/studio/AudioMixerWindow.cpp:149
+#: ../src/gui/studio/MidiMixerWindow.cpp:125
+msgid "Panic"
+msgstr "Paniek"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1213
+msgid "Segment Debug Dump "
+msgstr "Segment Debug Dump "
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1283
+msgid " Zoom: "
+msgstr " Detail: "
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1719
+msgid "File \"%1\" does not exist"
+msgstr "Bestand \"%1\" bestaat niet"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1725
+msgid "File \"%1\" is actually a directory"
+msgstr "Bestand \"%1\" is eigenlijk een map"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1734
+msgid "You do not have read permission for \"%1\""
+msgstr "U heeft geen leesrechten voor \"%1\""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1802
+msgid ""
+"An auto-save file for this document has been found\n"
+"Do you want to open it instead ?"
+msgstr ""
+"Een automatisch opgeslagen bestand voor dit document is gevonden\n"
+"Wilt u dit bestand openen in plaats van het origineel?"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1896
+msgid "Example Files"
+msgstr "Voorbeeldbestanden"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2100
+msgid "Opening a new application window..."
+msgstr "Openen van een nieuw applicatie venster..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2110
+msgid "Creating new document..."
+msgstr "Maken nieuw document..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2154
+#, c-format
+msgid ""
+"Malformed URL\n"
+"%1"
+msgstr ""
+"Ongeldige URL\n"
+"%1"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2179
+#: ../src/gui/application/RosegardenGUIApp.cpp:2240
+msgid "Opening file..."
+msgstr "Openen bestand..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2201
+#: ../src/gui/application/RosegardenGUIApp.cpp:2220
+msgid "Open File"
+msgstr "Open Bestand"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1225
+#: ../src/gui/application/RosegardenGUIApp.cpp:2258
+msgid "Saving file..."
+msgstr "Opslaan bestand..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2330
+msgid "This is not a valid filename.\n"
+msgstr "Dit is geen geldige bestandsnaam.\n"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2335
+msgid "This is not a local file.\n"
+msgstr "Dit is geen lokaal bestand.\n"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2342
+#: ../src/gui/studio/BankEditorDialog.cpp:1640
+#: ../src/gui/studio/DeviceManagerDialog.cpp:787
+msgid "You have specified a directory"
+msgstr "U heeft een map opgegeven"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2348
+#: ../src/gui/studio/BankEditorDialog.cpp:1646
+#: ../src/gui/studio/DeviceManagerDialog.cpp:793
+msgid "The specified file exists. Overwrite?"
+msgstr "Het opgegeven bestand bestaat. Overschrijven?"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2362
+msgid "Saving file with a new filename..."
+msgstr "Opslaan bestand onder nieuwe bestandsnaam..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2364
+msgid "Rosegarden files"
+msgstr "Rosegarden-bestanden"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2365
+#: ../src/gui/application/RosegardenGUIApp.cpp:4860
+#: ../src/gui/application/RosegardenGUIApp.cpp:4904
+#: ../src/gui/application/RosegardenGUIApp.cpp:4942
+#: ../src/gui/application/RosegardenGUIApp.cpp:4975
+#: ../src/gui/application/RosegardenGUIApp.cpp:5009
+#: ../src/gui/application/RosegardenGUIApp.cpp:5116
+msgid "All files"
+msgstr "Alle bestanden"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2366
+msgid "Save as..."
+msgstr "Opslaan als..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2404
+msgid "Closing file..."
+msgstr "Sluiten bestand..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2421
+#: ../src/gui/editors/notation/NotationView.cpp:4618
+msgid "Printing..."
+msgstr "Afdrukken..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2433
+#: ../src/gui/editors/notation/NotationView.cpp:4635
+msgid "Previewing..."
+msgstr "Voorbeeld afspelen..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2440
+msgid "Exiting..."
+msgstr "Afsluiten..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2463
+msgid "Cutting selection..."
+msgstr "Knippen selectie..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2474
+#: ../src/gui/editors/matrix/MatrixView.cpp:1614
+#: ../src/gui/editors/notation/NotationView.cpp:4763
+msgid "Copying selection to clipboard..."
+msgstr "Selectie naar klembord kopiëren..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2484
+#: ../src/gui/editors/eventlist/EventView.cpp:878
+#: ../src/gui/editors/matrix/MatrixView.cpp:1625
+#: ../src/gui/editors/notation/NotationView.cpp:4796
+#: ../src/gui/editors/notation/NotationView.cpp:4841
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:352
+msgid "Clipboard is empty"
+msgstr "Klembord is leeg"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2487
+#: ../src/gui/editors/eventlist/EventView.cpp:882
+#: ../src/gui/editors/matrix/MatrixView.cpp:1629
+#: ../src/gui/editors/notation/NotationView.cpp:4804
+#: ../src/gui/editors/notation/NotationView.cpp:4845
+msgid "Inserting clipboard contents..."
+msgstr "Invoegen van klembord inhoud..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2556
+msgid "Duration of empty range to insert"
+msgstr "Duur van in te voegen leeg bereik"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2631
+msgid "This function needs no more than one segment to be selected."
+msgstr "Voor deze functie moet meer dan een segment geselecteerd zijn."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2654
+msgid "Can't join Audio segments"
+msgstr "Kan Audio segmenten niet samenvoegen"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2707
+msgid "rescaling an audio file"
+msgstr "bezig met herschalen van audiobestand"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2723
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:172
+msgid "Rescaling audio file..."
+msgstr "Bezig met herschalen van audiobestand..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2767
+msgid ""
+"The audio file path does not exist or is not writable.\n"
+"You must set the audio file path to a valid directory in Document Properties "
+"before %1.\n"
+"Would you like to set it now?"
+msgstr ""
+"Het audiobestandspad bestaat niet of is niet schrijfbaar.\n"
+"Het moet naar een geldige map wijzen in Documenteigenschappen voor %1.\n"
+"Wilt u het nu instellen?"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2769
+#: ../src/gui/application/RosegardenGUIApp.cpp:5291
+#: ../src/gui/application/RosegardenGUIApp.cpp:5339
+#: ../src/gui/editors/segment/TrackButtons.cpp:419
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:159
+msgid "Set audio file path"
+msgstr "Stel audiobestandspad in"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2833
+msgid "Jog Selection"
+msgstr "Selectie opschuiven"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2978
+#, c-format
+msgid ""
+"_n: Split Segment at Time\n"
+"Split %n Segments at Time"
+msgstr ""
+"Splits segment op tijdstip\n"
+"Splits %n segmenten op tijdstip"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3013
+#: ../src/gui/general/EditViewBase.cpp:619
+msgid "Segment Start Time"
+msgstr "Starttijd segment"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3023
+msgid "Set Segment Start Times"
+msgstr "Starttijden segment instellen"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3024
+#: ../src/gui/general/EditViewBase.cpp:626
+msgid "Set Segment Start Time"
+msgstr "Starttijd segment instellen"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3056
+#: ../src/gui/general/EditViewBase.cpp:644
+msgid "Segment Duration"
+msgstr "Segmentduur"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3068
+msgid "Set Segment Durations"
+msgstr "Segmentduren instellen"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3069
+#: ../src/gui/general/EditViewBase.cpp:652
+msgid "Set Segment Duration"
+msgstr "Segmentduur instellen"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3176
+#: ../src/gui/application/RosegardenGUIApp.cpp:5875
+msgid "Set Global Tempo"
+msgstr "Stel Globaal Tempo in"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3234
+#: ../src/gui/general/EditViewBase.cpp:477
+msgid "Toggle the toolbar..."
+msgstr "Werkbalk aan/uit..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3244
+msgid "Toggle the tools toolbar..."
+msgstr "Gereedschappen-werkbalk aan/uit"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3254
+msgid "Toggle the tracks toolbar..."
+msgstr "Sporenwerkbalk aan/uit"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3264
+msgid "Toggle the editor toolbar..."
+msgstr "Editor-werkbalk aan/uit"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3274
+msgid "Toggle the transport toolbar..."
+msgstr "Transport-werkbalk aan/uit"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3284
+msgid "Toggle the zoom toolbar..."
+msgstr "Zoom-werkbalk aan/uit"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3294
+msgid "Toggle the Transport"
+msgstr "Transport aan/uit"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3377
+#: ../src/gui/general/EditViewBase.cpp:487
+msgid "Toggle the statusbar..."
+msgstr "Statusbalk aan/uit..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3434
+msgid ""
+"The join tool isn't implemented yet. Instead please highlight the segments "
+"you want to join and then use the menu option:\n"
+"\n"
+" Segments->Collapse Segments.\n"
+msgstr ""
+"Het samenvoeg-gereedschap is nog niet geïmplementeerd. Selecteer de "
+"segmenten die u wilt samenvoegen en gebruik dan de menu-optie:\n"
+"\n"
+"Segmenten->Samenvoegen.\n"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3437
+msgid "Join tool not yet implemented"
+msgstr "Het samenvoeg-gereedschap is nog niet geímplementeerd"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3675
+msgid "Revert modified document to previous saved version?"
+msgstr "Ga terug naar opgeslagen versie van gewijzigd document?"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3691
+msgid ""
+"*.rgp|Rosegarden Project files\n"
+"*|All files"
+msgstr ""
+"*.rgp|Rosegarden projectbestanden\n"
+"*|Alle bestanden"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3692
+msgid "Import Rosegarden Project File"
+msgstr "Importeer Rosegarden projectbestand..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3717
+msgid "Failed to import project file \"%1\""
+msgstr "Import van projectbestand \"%1\" mislukt"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3739
+msgid "Open MIDI File"
+msgstr "Open MIDI Bestand"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3756
+msgid "Merge MIDI File"
+msgstr "Voeg MIDI Bestand Samen"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3866
+msgid "Importing MIDI file..."
+msgstr "Importeren MIDI bestand..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3903
+msgid "Calculating notation..."
+msgstr "Berekenen notatie..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3950
+msgid "Calculate Notation"
+msgstr "Berekenen Notatie"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3991
+#: ../src/gui/application/RosegardenGUIApp.cpp:4008
+msgid ""
+"*.rose|Rosegarden-2 files\n"
+"*|All files"
+msgstr ""
+"*.rose|Rosegarden-2 bestanden\n"
+"*|Alle bestanden"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3992
+#: ../src/gui/application/RosegardenGUIApp.cpp:4009
+msgid "Open Rosegarden 2.1 File"
+msgstr "Open Rosegarden 2.1 Bestand"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4026
+msgid "Importing Rosegarden 2.1 file..."
+msgstr "Importeren Rosegarden 2.1 bestand..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4052
+msgid "Can't load Rosegarden 2.1 file. It appears to be corrupted."
+msgstr "Kan Rosegarden 2.1 bestand niet laden. Het lijkt ongeldig."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4078
+#: ../src/gui/application/RosegardenGUIApp.cpp:4095
+msgid ""
+"*.h2song|Hydrogen files\n"
+"*|All files"
+msgstr ""
+"*.h2song|Hydrogen-bestanden\n"
+"*|Alle bestanden"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4079
+#: ../src/gui/application/RosegardenGUIApp.cpp:4096
+msgid "Open Hydrogen File"
+msgstr "Open Hydrogen-bestand"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4113
+msgid "Importing Hydrogen file..."
+msgstr "Hydrogen-bestand importeren..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4139
+msgid "Can't load Hydrogen file. It appears to be corrupted."
+msgstr "Kan Hydrogen-bestand niet laden. Het lijkt ongeldig."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4527
+msgid "Export and import of Rosegarden Project files"
+msgstr "Export en import van Rosegarden projectbestanden"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4529
+msgid "The Rosegarden Project Packager helper script"
+msgstr "Het Rosegarden Project Packager hulp-script"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4533
+msgid "%1 - for project file support"
+msgstr "%1 - voor projectbestand-ondersteuning"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4550
+msgid "The Rosegarden LilyPondView helper script"
+msgstr "Het Rosegarden LilyPondView hulp-script"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4554
+msgid "%1 - for LilyPond preview support"
+msgstr "%1 - voor ondersteuning van LilyPond preview"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4570
+msgid "The Rosegarden Audio File Importer helper script"
+msgstr "Het Rosegarden audiobestand-importer hulp-script"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4574
+msgid "%1 - for audio file import"
+msgstr "%1 - voor import van audiobestanden"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4585
+msgid ""
+"<h3>Helper programs not found</h3><p>Rosegarden could not find one or more "
+"helper programs which it needs to provide some features. The following "
+"features will not be available:</p>"
+msgstr ""
+"<h3>Hulpprogramma's niet gevonden</h3><p>Rosegarden kon een of meer "
+"hulpprogramma's niet vinden die nodig zijn om bepaalde functionaliteit te "
+"verschaffen. De volgende functionaliteiten zullen niet beschikbaar zijn:</p>"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4586
+#: ../src/gui/application/RosegardenGUIApp.cpp:4592
+msgid "<ul>"
+msgstr "<ul>"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4588
+#: ../src/gui/application/RosegardenGUIApp.cpp:4594
+msgid "<li>%1</li>"
+msgstr "<li>%1</li>"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4590
+#: ../src/gui/application/RosegardenGUIApp.cpp:4596
+msgid "</ul>"
+msgstr "</ul>"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4591
+msgid ""
+"<p>To fix this, you should install the following additional programs:</p>"
+msgstr "<p>Om dit te verhelpen installeert u de volgende programma's</p>"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4603
+msgid "Helper programs not found"
+msgstr "Hulpprogramma's niet gevonden"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4686
+msgid "Starting the sequencer..."
+msgstr "Starten van de sequencer..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4712
+msgid "Couldn't start the sequencer"
+msgstr "Kon de sequencer niet starten"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4789
+msgid "Clearing down jackd..."
+msgstr "Afsluiten jackd..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4803
+msgid "Starting jackd..."
+msgstr "Starten jackd..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4842
+msgid ""
+"The Rosegarden sequencer process has exited unexpectedly. Sound and "
+"recording will no longer be available for this session.\n"
+"Please exit and restart Rosegarden to restore sound capability."
+msgstr ""
+"Het sequencer-proces van Rosegarden is onverwacht afgebroken. Geluid en "
+"opname is deze sessie niet langer beschikbaar.\n"
+"Sluit af en start Rosegarden opnieuw om geluidsmogelijkheden te herstellen."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4846
+msgid ""
+"The Rosegarden sequencer could not be started, so sound and recording will "
+"be unavailable for this session.\n"
+"For assistance with correct audio and MIDI configuration, go to http://"
+"rosegardenmusic.com."
+msgstr ""
+"De Rosegarden-sequencer kon niet worden gestart. Geluid en opname zijn deze "
+"sessie niet beschikbaar.\n"
+"Voor hulp met de juiste audio- en MIDI-instellingen, ga naar http://"
+"rosegardenmusic.com."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4856
+msgid "Exporting Rosegarden Project file..."
+msgstr "Rosegarden projectbestand exporteren..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4859
+msgid "Rosegarden Project files\n"
+msgstr "Rosegarden projectbestanden\n"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4861
+#: ../src/gui/application/RosegardenGUIApp.cpp:4905
+#: ../src/gui/application/RosegardenGUIApp.cpp:4943
+#: ../src/gui/application/RosegardenGUIApp.cpp:4976
+#: ../src/gui/application/RosegardenGUIApp.cpp:5010
+#: ../src/gui/application/RosegardenGUIApp.cpp:5116
+msgid "Export as..."
+msgstr "Exporteren als..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4875
+#, c-format
+msgid "Saving Rosegarden file to package failed: %1"
+msgstr "Rosegarden-bestand in pakket opslaan mislukt: %1"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4889
+msgid "Failed to export to project file \"%1\""
+msgstr "Export naar projectbestand \"%1\" mislukt"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4900
+#: ../src/gui/application/RosegardenGUIApp.cpp:4915
+msgid "Exporting MIDI file..."
+msgstr "Exporteren MIDI bestand..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4903
+msgid "Standard MIDI files\n"
+msgstr "Standaard MIDI bestanden\n"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4934
+#: ../src/gui/application/RosegardenGUIApp.cpp:4966
+#: ../src/gui/application/RosegardenGUIApp.cpp:4999
+#: ../src/gui/application/RosegardenGUIApp.cpp:5103
+#: ../src/gui/application/RosegardenGUIApp.cpp:5140
+#: ../src/gui/editors/notation/NotationView.cpp:4733
+msgid "Export failed. The file could not be opened for writing."
+msgstr ""
+"Exporteren mislukt. Het bestand kon niet geopend worden voor schrijven."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4940
+#: ../src/gui/application/RosegardenGUIApp.cpp:4952
+msgid "Exporting Csound score file..."
+msgstr "Exporteren Csound score bestand..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4972
+#: ../src/gui/application/RosegardenGUIApp.cpp:4985
+msgid "Exporting Mup file..."
+msgstr "Exporteren Mup bestand..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4975
+msgid "Mup files\n"
+msgstr "Mup bestanden\n"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5005
+#: ../src/gui/application/RosegardenGUIApp.cpp:5089
+#: ../src/gui/editors/notation/NotationView.cpp:4719
+msgid "Exporting LilyPond file..."
+msgstr "Exporteren Lilypond-bestand..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5008
+msgid "LilyPond files"
+msgstr "Lilypond-bestanden"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5023
+#: ../src/gui/editors/notation/NotationView.cpp:4653
+msgid "Printing LilyPond file..."
+msgstr "Afdrukken Lilypond-bestand..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5028
+#: ../src/gui/application/RosegardenGUIApp.cpp:5052
+#: ../src/gui/editors/notation/NotationView.cpp:4658
+#: ../src/gui/editors/notation/NotationView.cpp:4682
+msgid "Failed to open a temporary file for LilyPond export."
+msgstr "Tijdelijk bestand openen voor Lilypond export mislukt."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5047
+#: ../src/gui/editors/notation/NotationView.cpp:4677
+msgid "Previewing LilyPond file..."
+msgstr "Preview Lilypond-bestand..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5080
+#: ../src/gui/editors/notation/NotationView.cpp:4710
+msgid "LilyPond Preview Options"
+msgstr "LilyPond preview-opties"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5081
+#: ../src/gui/editors/notation/NotationView.cpp:4711
+msgid "LilyPond preview options"
+msgstr "Lilypond preview-opties"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5112
+#: ../src/gui/application/RosegardenGUIApp.cpp:5126
+msgid "Exporting MusicXML file..."
+msgstr "Exporteren MusicXML bestand..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5115
+msgid "XML files"
+msgstr "XML bestanden"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5289
+#: ../src/gui/editors/segment/TrackButtons.cpp:417
+msgid ""
+"The audio file path does not exist or is not writable.\n"
+"Please set the audio file path to a valid directory in Document Properties "
+"before recording audio.\n"
+"Would you like to set it now?"
+msgstr ""
+"Het audiobestandspad bestaat niet of is niet schrijfbaar.\n"
+"Het moet naar een geldige map wijzen in Documenteigenschappen voordat u "
+"geluid opneemt.\n"
+"Wilt u het pad nu instellen?"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5337
+msgid ""
+"The audio file path does not exist or is not writable.\n"
+"Please set the audio file path to a valid directory in Document Properties "
+"before you start to record audio.\n"
+"Would you like to set it now?"
+msgstr ""
+"Het audiobestandspad bestaat niet of is niet schrijfbaar.\n"
+"Het moet naar een geldige map wijzen in Documenteigenschappen voordat u "
+"geluid opneemt.\n"
+"Wilt u het pad nu instellen?"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5780
+msgid "Move playback pointer to time"
+msgstr "Verplaats afspeel-pointer naar tijdstip"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5793
+#: ../src/gui/editors/matrix/MatrixView.cpp:2240
+msgid "%1%"
+msgstr "%1%"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5861
+#, c-format
+msgid "Replace Tempo Change at %1"
+msgstr "Vervang Tempo Verandering op %1"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5891
+msgid "Set Global and Default Tempo"
+msgstr "Stel Globaal en Standaard Tempo In"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5914
+msgid "Move Tempo Change"
+msgstr "Verplaats &tempoverandering"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5949
+msgid "new marker"
+msgstr "nieuwe markering"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5950
+msgid "no description"
+msgstr "geen omschrijving"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:6363
+#, c-format
+msgid "Sequencer failed to add audio file %1"
+msgstr "Sequencer kon audio bestand %1 niet toevoegen"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:6388
+#, c-format
+msgid "Sequencer failed to remove audio file id %1"
+msgstr "Sequencer kon audio bestand %1 niet verwijderen"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:6448
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:1086
+msgid "Modify Segment label"
+msgstr "Wijzig Segment Benaming"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:6450
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:1088
+msgid "Modify Segments label"
+msgstr "Wijzig Benaming Segmenten"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:6452
+msgid "Relabelling selection..."
+msgstr "Herbenoemen selectie..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7539
+msgid "Play List"
+msgstr "Afspeellijst"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7567
+msgid "http://rosegarden.sourceforge.net/tutorial/en/chapter-0.html"
+msgstr "http://rosegarden.sourceforge.net/tutorial/en/chapter-0.html"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7574
+msgid "http://rosegarden.sourceforge.net/tutorial/bug-guidelines.html"
+msgstr "http://rosegarden.sourceforge.net/tutorial/bug-guidelines.html"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7650
+msgid "Queueing MIDI panic events for tranmission..."
+msgstr "MIDI paniek-gebeurtenissen oplijnen voor versturing..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7708
+msgid "Are you sure you want to save this as your default studio?"
+msgstr "Weet u zeker dat u dit wilt opslaan als uw standaard studio?"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7713
+msgid "Saving current document as default studio..."
+msgstr "Huidige document opslaan als standaard studio..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7738
+msgid ""
+"Are you sure you want to import your default studio and lose the current one?"
+msgstr ""
+"Weet u zeker dat u uw standaard studio wilt importeren en de huidige "
+"verliezen?"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7773
+msgid "Import Studio from File"
+msgstr "Importeer studio uit bestand"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7807
+msgid "Import Studio"
+msgstr "Importeer studio"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:8015
+msgid ""
+"<h3>Newer version available</h3><p>A newer version of Rosegarden may be "
+"available.<br>Please consult the <a href=\"http://www.rosegardenmusic.com/"
+"getting/\">Rosegarden website</a> for more information.</p>"
+msgstr ""
+"<h3>Nieuwere versie beschikbaar</h3><p>Een nieuwere versie van Rosegarden is "
+"beschikbaar.<br> Kijk op de <a href=\"http://www.rosegardenmusic.com/getting/"
+"\">Rosegarden website</a> voor meer informatie.</p>"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:8016
+msgid "Newer version available"
+msgstr "Nieuwere versie beschikbaar"
+
+#: ../src/gui/application/RosegardenApplication.cpp:104
+#, c-format
+msgid "Failed to load soundfont %1"
+msgstr "Laden van soundfont %1 mislukt"
+
+#: ../src/gui/application/main.cpp:311
+msgid "Rosegarden - A sequencer and musical notation editor"
+msgstr "Rosegarden - Een sequencer en muzieknotatie-editor"
+
+#: ../src/gui/application/main.cpp:315
+msgid "Don't use the sequencer (support editing only)"
+msgstr "Gebruik de sequencer niet (alleen editing)"
+
+#: ../src/gui/application/main.cpp:316
+msgid "Don't show the splash screen"
+msgstr "Toon het opstartscherm niet"
+
+#: ../src/gui/application/main.cpp:317
+msgid "Don't automatically run in the background"
+msgstr "Loop niet automatisch in de achtergrond"
+
+#: ../src/gui/application/main.cpp:318
+msgid "Attach to a running sequencer process, if found"
+msgstr "Verbind met een lopend sequencer-proces, indien gevonden"
+
+#: ../src/gui/application/main.cpp:319
+msgid "Ignore installed version - for devs only"
+msgstr "Let niet op geïnstalleerde versie - alleen voor ontwikkelaars"
+
+#: ../src/gui/application/main.cpp:320
+msgid "file to open"
+msgstr "bestand om te openen"
+
+#: ../src/gui/application/main.cpp:370
+msgid "Installation contains the wrong version of Rosegarden."
+msgstr "Installatie bevat de verkeerde versie van Rosegarden"
+
+#: ../src/gui/application/main.cpp:371
+msgid ""
+" The wrong versions of Rosegarden's data files were\n"
+" found in the standard KDE installation directories.\n"
+" (I am %1, but the installed files are for version %2.)\n"
+"\n"
+" This may mean one of the following:\n"
+"\n"
+" 1. This is a new upgrade of Rosegarden, and it has not yet been\n"
+" installed. If you compiled it yourself, check that you have\n"
+" run \"make install\" and that the procedure completed\n"
+" successfully.\n"
+"\n"
+" 2. The upgrade was installed in a non-standard directory,\n"
+" and an old version was found in a standard directory. If so,\n"
+" you will need to add the correct directory to your KDEDIRS\n"
+" environment variable before you can run it."
+msgstr ""
+" In de standaard KDE-installatiemappen staan verkeerde\n"
+" versies van Rosegarden's databestanden.\n"
+" (Ik ben %1, maar de geïnstalleerde bestanden zijn voor versie %2).\n"
+"\n"
+" Dit kan het volgende betekenen:\n"
+"\n"
+" 1. Dit is een nieuwe upgrade van Rosegarden, maar deze is nog \n"
+" niet geïnstalleerd. Als u deze zelf gecompileerd hebt, check \n"
+" dan dat u \"make install\" hebt gedaan en dat dit succesvol\n"
+" is verlopen.\n"
+"\n"
+" 2. De upgrade is in een non-standaard map geïnstalleerd, en er\n"
+" is een oude versie gevonden in de standaardmap. In dit geval\n"
+" dient u de juiste map aan uw KDEDIRS omgevingsvariabele\n"
+" toevoegen voordat u deze kunt runnen."
+
+#: ../src/gui/application/main.cpp:383 ../src/gui/application/main.cpp:401
+msgid "Installation problem"
+msgstr "Installatie problem"
+
+#: ../src/gui/application/main.cpp:389
+msgid "Rosegarden does not appear to have been installed."
+msgstr "Rosegarden lijkt niet geinstalleerd te zijn."
+
+#: ../src/gui/application/main.cpp:390
+msgid ""
+" One or more of Rosegarden's data files could not be\n"
+" found in the standard KDE installation directories.\n"
+"\n"
+" This may mean one of the following:\n"
+"\n"
+" 1. Rosegarden has not been correctly installed. If you compiled\n"
+" it yourself, check that you have run \"make install\" and that\n"
+" the procedure completed successfully.\n"
+"\n"
+" 2. Rosegarden has been installed in a non-standard directory,\n"
+" and you need to add this directory to your KDEDIRS environment\n"
+" variable before you can run it. This may be the case if you\n"
+" installed into $HOME or a local third-party package directory\n"
+" like /usr/local or /opt."
+msgstr ""
+" Een of meerdere van Rosegarden's gegevensbestanden missen in de\n"
+" standaard KDE-installatiemappen.\n"
+"\n"
+" Dit kan een van deze dingen betekenen:\n"
+" 'n 1. Rosegarden is niet correct geïnstalleerd. Als u het zelf "
+"gecompileerd heeft, controleer dan\n"
+" dat u \"make install\" hebt gedaan en dat de procedure zonder\n"
+" fouten is verlopen.\n"
+"\n"
+" 2. De upgrade is in een nonstandaard map geïnstalleerd,\n"
+" en u moet deze map aan uw KDEDIRS omgevingsvariabele\n"
+" toevoegen om het uit te kunnen voeren. Dit kan het geval zijn\n"
+" als u heeft geïnstalleerd in $HOME of een lokale map voor pakketten\n"
+" van derden, zoals /usr/local of /opt."
+
+#: ../src/gui/application/main.cpp:414
+msgid "Rosegarden"
+msgstr "Rosegarden"
+
+#: ../src/gui/application/main.cpp:416
+msgid ""
+"Copyright 2000 - 2008 Guillaume Laurent, Chris Cannam, Richard Bown\n"
+"Parts copyright 1994 - 2004 Chris Cannam, Andy Green, Richard Bown, "
+"Guillaume Laurent\n"
+"LilyPond fonts copyright 1997 - 2005 Han-Wen Nienhuys and Jan Nieuwenhuizen"
+msgstr ""
+"Auteursrecht (c) 2000 - 2008 Guillaume Laurent, Chris Cannam, Richard Bown\n"
+"Gedeelten auteursrecht (c) 1994 - 2004 Chris Cannam, Andy Green, Richard "
+"Bown, Guillaume Laurent\n"
+"Lilypond-lettertypen auteursrecht (c) 1997 - 2005 Han-Wen Nienhuys en Jan "
+"Nieuwenhuizen"
+
+#: ../src/gui/application/main.cpp:428
+msgid "Chord labelling code"
+msgstr "Akkoord-labeling code"
+
+#: ../src/gui/application/main.cpp:429
+msgid ""
+"LilyPond output\n"
+"assorted other patches\n"
+"i18n-ization"
+msgstr ""
+"Lilypond-uitvoer\n"
+"verschillende andere patches\n"
+"i18n-isatie"
+
+#: ../src/gui/application/main.cpp:430
+msgid ""
+"UI improvements\n"
+"bug fixes"
+msgstr ""
+"UI verbeteringen\n"
+"bugfixes"
+
+#: ../src/gui/application/main.cpp:431
+msgid ""
+"Segment colours\n"
+"Other UI and bug fixes"
+msgstr ""
+"Segmentkleuren\n"
+"Andere UI- en bugfixes"
+
+#: ../src/gui/application/main.cpp:432
+msgid ""
+"Russian translation\n"
+"i18n-ization"
+msgstr ""
+"Russische vertaling\n"
+"i18n-isatie"
+
+#: ../src/gui/application/main.cpp:433 ../src/gui/application/main.cpp:434
+msgid "German translation"
+msgstr "Duitse vertaling"
+
+#: ../src/gui/application/main.cpp:435
+msgid "Welsh translation"
+msgstr "Welshe vertaling"
+
+#: ../src/gui/application/main.cpp:436
+msgid "French translation"
+msgstr "Franse vertaling"
+
+#: ../src/gui/application/main.cpp:437
+msgid ""
+"French translation\n"
+"Bug fixes"
+msgstr ""
+"Franse vertaling\n"
+"Bug fixes"
+
+#: ../src/gui/application/main.cpp:438 ../src/gui/application/main.cpp:439
+msgid "Italian translation"
+msgstr "Italiaanse vertaling"
+
+#: ../src/gui/application/main.cpp:440 ../src/gui/application/main.cpp:441
+msgid "Swedish translation"
+msgstr "Zweedse vertaling"
+
+#: ../src/gui/application/main.cpp:442
+msgid "Estonian translation"
+msgstr "Estse vertaling"
+
+#: ../src/gui/application/main.cpp:443 ../src/gui/application/main.cpp:444
+msgid "Dutch translation"
+msgstr "Nederlandse vertaling"
+
+#: ../src/gui/application/main.cpp:445
+msgid "HSpinBox class"
+msgstr "HSpinBox-klasse"
+
+#: ../src/gui/application/main.cpp:446
+msgid "Transposition by interval"
+msgstr "Transponeren per interval"
+
+#: ../src/gui/application/main.cpp:447
+msgid "Original designs for rotary controllers"
+msgstr "Originele ontwerpen voor draaibare controllers"
+
+#: ../src/gui/application/main.cpp:448
+msgid "Japanese translation"
+msgstr "Japanse vertaling"
+
+#: ../src/gui/application/main.cpp:449
+msgid ""
+"Auto-scroll deceleration\n"
+"Rests outside staves and other bug fixes"
+msgstr ""
+"Auto-scroll afremming\n"
+"Rusten buiten balken en andere bugfixes"
+
+#: ../src/gui/application/main.cpp:450
+msgid "Simplified Chinese translation"
+msgstr "Vereenvoudigd Chinese vertaling"
+
+#: ../src/gui/application/main.cpp:451
+msgid "LIRC infrared remote-controller support"
+msgstr "LIRC ondersteuning voor infrarode afstandsbediening"
+
+#: ../src/gui/application/main.cpp:452
+msgid "MTC slave timing implementation"
+msgstr "MTC slave timing implementatie"
+
+#: ../src/gui/application/main.cpp:453
+msgid "Czech translation"
+msgstr "Tsjechische vertaling"
+
+#: ../src/gui/application/main.cpp:454
+msgid "SCons/bksys building system"
+msgstr "SCons/bksys building systeem"
+
+#: ../src/gui/application/main.cpp:455
+msgid "icons, icons, icons"
+msgstr "icoontjes, meer icoontjes, nog meer icoontjes"
+
+#: ../src/gui/application/main.cpp:456 ../src/gui/application/main.cpp:457
+#: ../src/gui/application/main.cpp:458 ../src/gui/application/main.cpp:459
+msgid "Spanish translation"
+msgstr "Spaanse vertaling"
+
+#: ../src/gui/application/main.cpp:460 ../src/gui/application/main.cpp:461
+msgid "Catalan translation"
+msgstr "Catalaanse vertaling"
+
+#: ../src/gui/application/main.cpp:462
+msgid ""
+"1.2.3 splash screen photo\n"
+"Gave birth to D. Michael McIntyre, bought him a good flute once\n"
+"upon a time, and always humored him when he came over to play her\n"
+"some new instrument, even though she really hated his playing.\n"
+"Born October 19, 1951, died September 21, 2007, R. I. P."
+msgstr ""
+"1.2.3 splash screen foto\n"
+"Bracht D. Michael McIntyre ter wereld, kocht ooit een goede fluit voor hem,\n"
+"en gaf hem altijd de ruimte als hij haar een nieuw instrument kwam laten "
+"horen,\n"
+"hoewijl ze eigenlijk een hekel had aan zijn spel.\n"
+"Geboren 19 oktober 1951, gestorven 21 september 2007, R. I. P."
+
+#: ../src/gui/application/main.cpp:463
+msgid "Initial guitar chord editing code"
+msgstr "Initiële gitaar-akkoorden editing code"
+
+#: ../src/gui/application/main.cpp:464
+msgid "Polish translation"
+msgstr "Poolse vertaling"
+
+#: ../src/gui/application/main.cpp:465
+msgid "Basque translation"
+msgstr "Baskische vertaling"
+
+#: ../src/gui/application/main.cpp:466
+msgid "Klearlook theme"
+msgstr "Klearlook-thema"
+
+#: ../src/_translatorinfo.cpp:1 ../src/gui/application/main.cpp:468
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr "Jelmer Vernooij - Jasper Stein (sinds 1.4.0)"
+
+#: ../src/_translatorinfo.cpp:3 ../src/gui/application/main.cpp:468
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+
+#: ../src/gui/application/main.cpp:719
+msgid "Welcome!"
+msgstr "Welkom!"
+
+#: ../src/gui/application/main.cpp:731
+msgid ""
+"<h2>Welcome to Rosegarden!</h2><p>Welcome to the Rosegarden audio and MIDI "
+"sequencer and musical notation editor.</p><ul><li>If you have not already "
+"done so, you may wish to install some DSSI synth plugins, or a separate "
+"synth program such as QSynth. Rosegarden does not synthesize sounds from "
+"MIDI on its own, so without these you will hear nothing.</"
+"li><br><br><li>Rosegarden uses the JACK audio server for recording and "
+"playback of audio, and for playback from DSSI synth plugins. These features "
+"will only be available if the JACK server is running.</"
+"li><br><br><li>Rosegarden has comprehensive documentation: see the Help menu "
+"for the handbook, tutorials, and other information!</li></ul><p>Rosegarden "
+"was brought to you by a team of volunteers across the world. To learn more, "
+"go to <a href=\"http://www.rosegardenmusic.com/\">http://www.rosegardenmusic."
+"com/</a>.</p>"
+msgstr ""
+"<h2>Welkom bij Rosegarden!</h2><p>Welkom bij de Rosegarden audio- and MIDI-"
+"sequencer en muzieknotatie-editor.</p><ul><li>Als u dat nog niet gedaan had, "
+"wilt u mogelijk een aantal DSSI-plugins of een apart synth-programma zoals "
+"QSynth installeren. Rosegarden synthetiseert zelf geen geluid vanuit MIDI, "
+"dus zonder dit soort programma's hoort u niets.</li><br><br><li>Rosegarden "
+"gebruikt de JACK audio-server om audio op te nemen en af te spelen, en voor "
+"afspelen van DSSI synth-plugins. Deze functionaliteiten zijn alleen "
+"beschikbaar als de JACK-server draait.</li><br><br><li>Rosegarden heeft "
+"uitgebreide documentatie: zie het menu Help voor het handboek, "
+"handleidingen, en andere informatie!</li></ul><p>Rosegarden wordt voor u "
+"gebracht door een team vrijwilligers van over de hele wereld. Voor meer "
+"informatie, ga naar <a href=\"http://www.rosegardenmusic.com/\">http://www."
+"rosegardenmusic.com/</a>.</p>"
+
+#: ../src/gui/application/RosegardenGUIView.cpp:257
+msgid "No non-audio segments in composition"
+msgstr "Geen non-audio-segmenten in compositie"
+
+#: ../src/gui/application/RosegardenGUIView.cpp:333
+msgid "Selection must contain only audio or non-audio segments"
+msgstr "Selectie moet alleen audio- of non-audio-segmenten bevatten"
+
+#: ../src/gui/application/RosegardenGUIView.cpp:431
+#: ../src/gui/application/RosegardenGUIView.cpp:576
+#: ../src/gui/application/RosegardenGUIView.cpp:612
+#: ../src/gui/application/RosegardenGUIView.cpp:776
+msgid "No non-audio segments selected"
+msgstr "Geen non-audio-segmenten geselecteerd"
+
+#: ../src/gui/application/RosegardenGUIView.cpp:851
+msgid ""
+"You've not yet defined an audio editor for Rosegarden to use.\n"
+"See Settings -> Configure Rosegarden -> Audio."
+msgstr ""
+"U heeft nog geen audio-editor voor Rosegarden ingesteld.\n"
+"Zie Instellingen -> Rosegarden instellen -> Audio."
+
+#: ../src/gui/application/RosegardenGUIView.cpp:1559
+#: ../src/gui/application/RosegardenGUIView.cpp:1564
+msgid "Can't add dropped file. "
+msgstr "Kan gedropt bestand niet toevoegen."
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1014
+#: ../src/gui/seqmanager/SequenceManager.cpp:1150
+msgid ""
+"The JACK Audio subsystem has failed or it has stopped Rosegarden from "
+"processing audio.\n"
+"Please restart Rosegarden to continue working with audio.\n"
+"Quitting other running applications may improve Rosegarden's performance."
+msgstr ""
+"Er is iets misgelopen met het JACK audio-subsysteem, of het houdt Rosegarden "
+"tegengehouden om audio te verwerken.\n"
+"Herstart Rosegarden om met audio verder te werken.\n"
+"Andere lopende applicaties afsluiten kan de werking van Rosegarden "
+"verbeteren."
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1020
+#: ../src/gui/seqmanager/SequenceManager.cpp:1156
+msgid ""
+"The JACK Audio subsystem has stopped Rosegarden from processing audio, "
+"probably because of a processing overload.\n"
+"An attempt to restart the audio service has been made, but some problems may "
+"remain.\n"
+"Quitting other running applications may improve Rosegarden's performance."
+msgstr ""
+"Het JACK audio-subsysteem heeft Rosegarden tegengehouden audio te verwerken, "
+"waarschijnlijk vanwege te zware processorbelasting.\n"
+"De audioservice herstarten is al geprobeerd, maar er kunnen problemen "
+"overblijven.\n"
+"Andere lopende applicaties afsluiten kan de werking van Rosegarden "
+"verbeteren."
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1031
+msgid ""
+"Run out of processor power for real-time audio processing. Cannot continue."
+msgstr ""
+"Processorkracht ontoereikend voor real-time audio-verwerking. Kan niet "
+"doorgaan."
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1057
+msgid ""
+"A serious error has occurred in the ALSA MIDI subsystem. It may not be "
+"possible to continue sequencing. Please check console output for more "
+"information."
+msgstr ""
+"Een ernstige error is opgetreden in het ALSA MIDI subsysteem. Doorgaan met "
+"sequencen is wellicht niet mogelijk. Bekijk console-uitvoer voor meer "
+"informatie."
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1078
+msgid "JACK Audio subsystem is losing sample frames."
+msgstr "JACK audio-subsysteem verliest sample frames."
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1096
+msgid ""
+"Failed to read audio data from disc in time to service the audio subsystem."
+msgstr ""
+"Kon audio-data niet op tijd van disk lezen om het audio-subsysteem te "
+"bedienen."
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1100
+msgid ""
+"Failed to write audio data to disc fast enough to service the audio "
+"subsystem."
+msgstr ""
+"Kon audio-data niet snel genoeg naar disk schrijven om het audio-subsysteem "
+"te bedienen."
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1104
+msgid "The audio mixing subsystem is failing to keep up."
+msgstr "Het audio-mixing-subsysteem houdt het tempo niet bij."
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1108
+msgid "The audio subsystem is failing to keep up."
+msgstr "Het audio-subsysteem houdt het tempo niet bij."
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1112
+msgid "Unknown sequencer failure mode!"
+msgstr "Sequencer: onbekende probleem-modus!"
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1170
+msgid ""
+"<h3>System timer resolution is too low</h3><p>Rosegarden was unable to find "
+"a high-resolution timing source for MIDI performance.</p><p>This may mean "
+"you are using a Linux system with the kernel timer resolution set too low. "
+"Please contact your Linux distributor for more information.</p><p>Some Linux "
+"distributors already provide low latency kernels, see <a href=\"http://"
+"rosegarden.wiki.sourceforge.net/Low+latency+kernels\">http://rosegarden.wiki."
+"sourceforge.net/Low+latency+kernels</a> for instructions.</p>"
+msgstr ""
+"<h3>Systeemklok heeft te lage resolutie</h3><p>Rosegarden kon geen hoge-"
+"resolutie timingbron vinden om MIDI te gebruiken.</p><p>Mogelijk gebruikt "
+"ueen Linux-systeem waarvan de kernelklok op een te lage resolutie is "
+"afgesteld. Neem contact op met uw Linux-distributeur voor verdere informatie."
+"</p><p>Sommige Linux-distributeurs bieden al lage-latency-kernels aan; zie<a "
+"href=\"http://rosegarden.wiki.sourceforge.net/Low+latency+kernels\">http://"
+"rosegarden.wiki.sourceforge.net/Low+latency+kernels</a> voor instructies.</p>"
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1188
+msgid ""
+"<h3>System timer resolution is too low</h3><p>Rosegarden was unable to find "
+"a high-resolution timing source for MIDI performance.</p><p>You may be able "
+"to solve this problem by loading the RTC timer kernel module. To do this, "
+"try running <b>sudo modprobe snd-rtctimer</b> in a terminal window and then "
+"restarting Rosegarden.</p><p>Alternatively, check whether your Linux "
+"distributor provides a multimedia-optimized kernel. See <a href=\"http://"
+"rosegarden.wiki.sourceforge.net/Low+latency+kernels\">http://rosegarden.wiki."
+"sourceforge.net/Low+latency+kernels</a> for notes about this.</p>"
+msgstr ""
+"<h3>Systeemklok heeft te lage resolutie</h3><p>Rosegarden kon geen hoge-"
+"resolutie timingbron vinden voor MIDI-uitvoering.</p><p>U kunt dit probleem "
+"wellicht oplossen door de RTC timer kernelmodule te laden. Hiervoor runt u "
+"<b>sudo modprobe snd-rtctimer</b> in een terminalscherm, en herstart u "
+"Rosegarden.</p> <p>Een andere mogelijkheid is na te gaan of uw Linux-"
+"distributie een kernel aanbiedt die is geoptimaliseerd voor multimedia. Zie "
+"<a href=\"http://rosegarden.wiki.sourceforge.net/Low+latency+kernels"
+"\">http://rosegarden.wiki.sourceforge.net/Low+latency+kernels</a> voor "
+"enkele notities hierover.</p>"
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1312
+msgid ""
+"<p>Both MIDI and Audio subsystems have failed to initialize.</p><p>You may "
+"continue without the sequencer, but we suggest closing Rosegarden, running "
+"\"alsaconf\" as root, and starting Rosegarden again. If you wish to run "
+"with no sequencer by design, then use \"rosegarden --nosequencer\" to avoid "
+"seeing this error in the future.</p>"
+msgstr ""
+"<p>MIDI- noch Audio-deelsysteem zijn succesvol geïnitialiseerd.</p><p>U kunt "
+"zonder sequencer doorwerken, maar wij bevelen aan Rosegarden af te sluiten, "
+"\"alsaconf\" als root uit te voeren, en Rosegarden opnieuw op te starten. "
+"Als u Rosegarden bewust zonder sequencer wilt gebruiken, gebruik dan "
+"\"rosegarden --nosequencer\" om deze melding niet meer te hoeven zien.</p>"
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1314
+msgid ""
+"<p>The MIDI subsystem has failed to initialize.</p><p>You may continue "
+"without the sequencer, but we suggest closing Rosegarden, running \"modprobe "
+"snd-seq-midi\" as root, and starting Rosegarden again. If you wish to run "
+"with no sequencer by design, then use \"rosegarden --nosequencer\" to avoid "
+"seeing this error in the future.</p>"
+msgstr ""
+"<p>MIDI-deelsysteem is niet succesvol geïnitialiseerd.</p><p>U kunt zonder "
+"sequencer doorwerken, maar wij bevelen aan Rosegarden af te sluiten, "
+"\"modprobe snd-seq-midi\" als root uit te voeren, en Rosegarden opnieuw opte "
+"starten. Als u Rosegarden bewust zonder sequencer wilt gebruiken, gebruik "
+"dan \"rosegarden --nosequencer\" om deze melding niet meer te hoeven zien.</"
+"p> "
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1316
+msgid ""
+"<p>The Rosegarden sequencer module version does not match the GUI module "
+"version.</p><p>You have probably mixed up files from two different versions "
+"of Rosegarden. Please check your installation.</p>"
+msgstr ""
+"<p>Rosegarden's sequencer-moduleversie komt niet overeen met de GUI-"
+"moduleversie.</p><p>Waarschijnlijk zijn bestanden van twee verschillende "
+"Rosegarden-versies door elkaar geraakt. Kijk a.u.b. uw installatie na.</p>"
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1322
+#, c-format
+msgid "<h3>Sequencer startup failed</h3>%1"
+msgstr "<h3>Sequencer opstarten mislukt</h3>%1"
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1330
+msgid ""
+"<h3>Failed to connect to JACK audio server.</h3><p>Rosegarden could not "
+"connect to the JACK audio server. This probably means the JACK server is "
+"not running.</p><p>If you want to be able to play or record audio files or "
+"use plugins, you should exit Rosegarden and start the JACK server before "
+"running Rosegarden again.</p>"
+msgstr ""
+"<h3>Geen verbinding met JACK audio-server</h3><p>Rosegarden kon geen "
+"verbinding maken met de JACK audio-server. Dit betekent waarschijnlijk dat "
+"die momenteel niet loopt.</p><p>Als u audio-bestanden wilt kunnen afspelen "
+"of opnemen, verlaat Rosegarden dan, en start de JACK-server voordat u "
+"Rosegarden opnieuw opstart.</p>"
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1331
+msgid "Failed to connect to JACK"
+msgstr "Kon niet met JACK verbinden"
+
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:46
+msgid "Modify MIDI filters..."
+msgstr "Wijzig MIDI-filters..."
+
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:58
+msgid "THRU events to ignore"
+msgstr "Te negeren THRU gebeurtenissen"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:131
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:60
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:96
+msgid "Note"
+msgstr "Noot"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:132
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:61
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:97
+msgid "Program Change"
+msgstr "Programma veranderen"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:136
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:62
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:98
+msgid "Key Pressure"
+msgstr "Toetsdruk"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:137
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:63
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:99
+msgid "Channel Pressure"
+msgstr "Kanaaldruk"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:134
+#: ../src/gui/general/EditView.cpp:899
+#: ../src/gui/rulers/ControllerEventsRuler.cpp:198
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:64
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:100
+msgid "Pitch Bend"
+msgstr "Toonhoogtebuiging"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:133
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:65
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:101
+msgid "Controller"
+msgstr "Controller"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:135
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:66
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:102
+msgid "System Exclusive"
+msgstr "System Exclusive"
+
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:94
+msgid "RECORD events to ignore"
+msgstr "Te negeren OPNAME-gebeurtenissen"
+
+#: ../src/gui/widgets/TimeWidget.cpp:101
+msgid "Note:"
+msgstr "Noot:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:108 ../src/gui/widgets/TimeWidget.cpp:145
+msgid "<inexact>"
+msgstr "<inexact>"
+
+#: ../src/gui/widgets/TimeWidget.cpp:151
+msgid "Units:"
+msgstr "Eenheden:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:173
+msgid "Time:"
+msgstr "Tijd:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:184
+msgid "units"
+msgstr "eenheden"
+
+#: ../src/gui/widgets/TimeWidget.cpp:193
+msgid "Measures:"
+msgstr "Maten:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:193
+msgid "Measure:"
+msgstr "Maat:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:212
+msgid "beats:"
+msgstr "tellen:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:212
+msgid "beat:"
+msgstr "tel:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:230
+msgid "%1:"
+msgstr "%1:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:254
+msgid "Seconds:"
+msgstr "Seconden:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:273
+msgid "msec:"
+msgstr "msec:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:407 ../src/gui/widgets/TimeWidget.cpp:531
+msgid "(%1/%2 time)"
+msgstr "(%1/%2-maat)"
+
+#: ../src/gui/widgets/TimeWidget.cpp:452
+msgid "(starting %1.%2 qpm, %2.%3 bpm)"
+msgstr "(start met %1.%2 qpm, %3.%4 bpm)"
+
+#: ../src/gui/widgets/TimeWidget.cpp:458
+msgid "(starting %1.%2 bpm)"
+msgstr "(start met %1.%2 bpm)"
+
+#: ../src/gui/widgets/TimeWidget.cpp:464
+msgid "(%1.%2 qpm, %2.%3 bpm)"
+msgstr "(%1.%2 qpm, %2.%3 bpm)"
+
+#: ../src/gui/widgets/TimeWidget.cpp:470
+msgid "(%1.%2 bpm)"
+msgstr "(%1.%2 bpm)"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:239
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:60
+msgid "C"
+msgstr "C"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:241
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:61
+msgid "D"
+msgstr "D"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:243
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:62
+msgid "E"
+msgstr "E"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:244
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:63
+msgid "F"
+msgstr "F"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:246
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:64
+msgid "G"
+msgstr "G"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:248
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:65
+msgid "A"
+msgstr "A"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:250
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:66
+msgid "B"
+msgstr "B"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:70
+msgid "-2"
+msgstr "-2"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:71
+msgid "-1"
+msgstr "-1"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:72
+msgid "0"
+msgstr "0"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:73
+msgid "1"
+msgstr "1"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:74
+msgid "2"
+msgstr "2"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:75
+msgid "3"
+msgstr "3"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:76
+msgid "4"
+msgstr "4"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:77
+msgid "5"
+msgstr "5"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:78
+msgid "6"
+msgstr "6"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:79
+msgid "7"
+msgstr "7"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:83
+msgid "double flat"
+msgstr "dubbelmol"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:84
+msgid "flat"
+msgstr "mol"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:85
+msgid "natural"
+msgstr "herstellingsteken"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:86
+msgid "sharp"
+msgstr "kruis"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:87
+msgid "double sharp"
+msgstr "dubbelkruis"
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:234
+#, c-format
+msgid "In %1"
+msgstr "In %1"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:587
+#: ../src/gui/widgets/AudioRouteMenu.cpp:236
+#: ../src/gui/widgets/AudioRouteMenu.cpp:259
+msgid "Master"
+msgstr "Master"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:528
+#: ../src/gui/widgets/AudioRouteMenu.cpp:238
+#: ../src/gui/widgets/AudioRouteMenu.cpp:261
+#, c-format
+msgid "Sub %1"
+msgstr "Sub %1"
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:244
+msgid "In %1 R"
+msgstr "In %1 R"
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:245
+msgid "In %1 L"
+msgstr "In %1 L"
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:247
+msgid "Master R"
+msgstr "Master R"
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:248
+msgid "Master L"
+msgstr "Master L"
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:250
+msgid "Sub %1 R"
+msgstr "Sub %1 R"
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:251
+msgid "Sub %1 L"
+msgstr "Sub %1 L"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:391
+#: ../src/gui/studio/AudioMixerWindow.cpp:522
+#: ../src/gui/widgets/AudioFaderBox.cpp:82
+msgid "Audio plugin button"
+msgstr "Audio-pluginknop"
+
+#: ../src/gui/editors/parameters/AudioInstrumentParameterPanel.cpp:129
+#: ../src/gui/editors/parameters/AudioInstrumentParameterPanel.cpp:357
+#: ../src/gui/widgets/AudioFaderBox.cpp:91
+msgid "<no synth>"
+msgstr "<geen synth>"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:93
+msgid "Synth plugin button"
+msgstr "Synth-pluginknop"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:153
+msgid "Set the audio pan position in the stereo field"
+msgstr "Stel de audio pan-positie in in het stereo-veld"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:155
+msgid "Open synth plugin's native editor"
+msgstr "Open de synth-plugin's eigen editor"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:157
+msgid "Mono or Stereo Instrument"
+msgstr "Mono- of stereo-instrument"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:159
+msgid "Record level"
+msgstr "Opnameniveau"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:161
+msgid "Playback level"
+msgstr "Afspeelniveau"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:345
+#: ../src/gui/studio/AudioMixerWindow.cpp:347
+#: ../src/gui/studio/AudioMixerWindow.cpp:503
+#: ../src/gui/studio/AudioMixerWindow.cpp:505
+#: ../src/gui/widgets/AudioFaderBox.cpp:163
+msgid "Audio level"
+msgstr "Audioniveau"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:170
+msgid "In:"
+msgstr "In:"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:173
+msgid "Out:"
+msgstr "Uit:"
+
+#: ../src/gui/widgets/ProgressDialog.cpp:48
+#: ../src/gui/widgets/ProgressDialog.cpp:53
+#: ../src/gui/widgets/ProgressDialog.cpp:76
+msgid "Processing..."
+msgstr "Verwerken..."
+
+#: ../src/gui/configuration/ColourConfigurationPage.h:60
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:130
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:346
+#: ../src/gui/widgets/ColourTable.cpp:52
+msgid "Color"
+msgstr "Kleur"
+
+#: ../src/gui/widgets/ColourTable.cpp:68
+msgid "Modify Color Name"
+msgstr "Wijzig Kleur Naam"
+
+#: ../src/gui/configuration/ColourConfigurationPage.cpp:129
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:983
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:882
+#: ../src/gui/widgets/ColourTable.cpp:68
+msgid "Enter new name"
+msgstr "Voer nieuwe naam in"
+
+#: ../src/gui/widgets/ColourTable.cpp:107
+msgid "Default Color"
+msgstr "Standaard Kleur"
+
+#: ../src/gui/widgets/Rotary.cpp:108
+msgid ""
+"Click and drag up and down or left and right to modify.\n"
+"Double click to edit value directly."
+msgstr ""
+"Klik en sleep op en neer of links en rechts om te wijzigen\n"
+"Dubbelklik om de waarde direct te bewerken."
+
+#: ../src/gui/widgets/Rotary.cpp:433
+msgid "Select a new value"
+msgstr "Kies een nieuwe waarde"
+
+#: ../src/gui/widgets/Rotary.cpp:434
+msgid "Enter a new value"
+msgstr "Voer nieuwe waarde in"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:80
+msgid "Quantizer"
+msgstr "Quantiseerder"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:86
+msgid "Quantizer type:"
+msgstr "Quantiseerdertype:"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:88
+msgid "Grid quantizer"
+msgstr "Rooster-quantiseerder"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:89
+msgid "Legato quantizer"
+msgstr "Legato-quantiseerder"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:90
+msgid "Heuristic notation quantizer"
+msgstr "Heuristische notatie-quantiseerder"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:94
+msgid "Quantize for notation only (leave performance unchanged)"
+msgstr "Quantiseer alleen voor notatie (uitvoering blijft ongewijzigd)"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:104
+msgid "Notation parameters"
+msgstr "Notatieparameters"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:109
+#: ../src/gui/widgets/QuantizeParameters.cpp:150
+msgid "Base grid unit:"
+msgstr "Basis-roostereenheid"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:114
+msgid "Complexity:"
+msgstr "Complexiteit:"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:118
+msgid "Very high"
+msgstr "Zeer hoog"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:119
+msgid "High"
+msgstr "Hoog"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:224
+#: ../src/gui/widgets/QuantizeParameters.cpp:120
+msgid "Normal"
+msgstr "Normaal"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:121
+msgid "Low"
+msgstr "Laag"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:122
+msgid "Very low"
+msgstr "Zeer laag"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:125
+msgid "Tuplet level:"
+msgstr "Multiplet-niveau:"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:129
+msgid "2-in-the-time-of-3"
+msgstr "2-in-de-tijd-van-3"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4241
+#: ../src/gui/widgets/QuantizeParameters.cpp:130
+msgid "Triplet"
+msgstr "Triool"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:138
+msgid "Any"
+msgstr "Elke"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:141
+msgid "Permit counterpoint"
+msgstr "Sta contrapunt toe"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:145
+msgid "Grid parameters"
+msgstr "Roosterparameters"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:154
+msgid "Swing:"
+msgstr "Swing:"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:159
+msgid "Iterative amount:"
+msgstr "Iteratieve hoeveelheid:"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:165
+msgid "Quantize durations as well as start times"
+msgstr "Quantiseer zowel duur als begintijd"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:169
+msgid "After quantization"
+msgstr "Na quantisatie"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:183
+msgid "Show advanced options"
+msgstr "Toon geavanceerde opties"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:192
+msgid "Re-beam"
+msgstr "Hergroeperen"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:194
+msgid "Add articulations (staccato, tenuto, slurs)"
+msgstr "Voeg articulaties toe"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:195
+msgid "Tie notes at barlines etc"
+msgstr "Bind noten over maatstrepen enz."
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:196
+msgid "Split-and-tie overlapping chords"
+msgstr "Splits-en-bind overlappende akkoorden"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:307
+msgid "Full quantize"
+msgstr "Quantiseer volledig"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:450
+msgid "Show Advanced Options"
+msgstr "Toon geavanceerde opties"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:454
+msgid "Hide Advanced Options"
+msgstr "Verberg geavanceerde opties"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:257
+#: ../src/gui/configuration/MatrixConfigurationPage.h:56
+#: ../src/gui/configuration/MatrixConfigurationPage.h:57
+#: ../src/gui/editors/matrix/MatrixView.cpp:2709
+msgid "Matrix"
+msgstr "Matrix"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:64
+msgid "Printable headers"
+msgstr "Afdrukbare headers"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:92
+msgid "Dedication"
+msgstr "Opdracht"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:96
+#: ../src/gui/editors/segment/PlayListView.cpp:35
+msgid "Title"
+msgstr "Titel"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:100
+msgid "Subtitle"
+msgstr "Ondertitel"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:104
+msgid "Subsubtitle"
+msgstr "Subsubtitel"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:108
+msgid "Poet"
+msgstr "Dichter"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:116
+msgid "Composer"
+msgstr "Componist"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:120
+msgid "Meter"
+msgstr ""
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:124
+msgid "Arranger"
+msgstr "Arrangeur"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:128
+msgid "Piece"
+msgstr "Stuk"
+
+#: ../data/fonts/mappings/fonts.cpp:26
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:132
+msgid "Opus"
+msgstr "Opus"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:136
+msgid "Copyright"
+msgstr "Auteursrecht"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:140
+msgid "Tagline"
+msgstr ""
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:155
+msgid "The composition comes here."
+msgstr "De compositie komt hier."
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:172
+msgid "Non-printable headers"
+msgstr "Niet-afdrukbare headers"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:213
+msgid "Add New Property"
+msgstr "Voeg Nieuwe Eigenschap Toe"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:217
+msgid "Delete Property"
+msgstr "Verwijder Eigenschap"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:236
+msgid "{new property %1}"
+msgstr "{nieuwe eigenschap %1}"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:236
+msgid "{new property}"
+msgstr "{nieuwe eigenschap}"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:243
+msgid "{undefined}"
+msgstr "{ongedefinierd}"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:87
+msgid "Double-click opens segment in"
+msgstr "Dubbelklikken opent segment in"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:91
+msgid "Notation editor"
+msgstr "Notatie-editor"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:92
+msgid "Matrix editor"
+msgstr "Matrix-editor"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:93
+msgid "Event List editor"
+msgstr "Gebeurtenissenlijst-editor"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:99
+msgid "Number of count-in measures when recording"
+msgstr "Aantal inleidende maten bij opname"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:109
+msgid "Auto-save interval"
+msgstr "Interval voor automatisch opslaan"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:112
+msgid "Every 30 seconds"
+msgstr "Elke 30 seconden"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:113
+msgid "Every minute"
+msgstr "Elke minuut"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:114
+msgid "Every five minutes"
+msgstr "Elke 5 minuten"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:115
+msgid "Every half an hour"
+msgstr "Elk halfuur"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:116
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:277
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:157
+msgid "Never"
+msgstr "Nooit"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:140
+msgid "Use JACK transport"
+msgstr "Gebruik JACK-transport"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:173
+msgid "Unknown"
+msgstr "Onbekend"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:179
+msgid "No MIDI, audio OK"
+msgstr "Geen MIDI, audio OK"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:182
+msgid "MIDI OK, no audio"
+msgstr "MIDI OK, geen audio"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:185
+msgid "MIDI OK, audio OK"
+msgstr "MIDI OK, audio OK"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:188
+msgid "No driver"
+msgstr "Geen driver"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:195
+msgid "Details..."
+msgstr "Details..."
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:204
+msgid "Behavior"
+msgstr "Gedrag"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:219
+msgid "Side-bar parameter box layout"
+msgstr "Layout van de parameterbox (zijbalk)"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:223
+msgid "Vertically stacked"
+msgstr "Verticaal gestapeld"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:225
+msgid "Tabbed"
+msgstr "Tabbladen"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:233
+msgid "Note name style"
+msgstr "Notenbenaming"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:237
+msgid "Always use US names (e.g. quarter, 8th)"
+msgstr "Gebruik altijd Amerikaanse namen (zoals quarter, 8th)"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:238
+msgid "Localized (where available)"
+msgstr "Gelokaliseerd (waar beschikbaar)"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:252
+msgid "Show textured background on"
+msgstr "Gebruik getextureerde achtergrond voor"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:254
+msgid "Main window"
+msgstr "Hoofdvenster"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:275
+msgid "Use bundled Klearlook theme"
+msgstr "Gebruik meegeleverd Klearlook-thema"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:278
+msgid "When not running under KDE"
+msgstr "Als we niet onder KDE draaien"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:279
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:159
+msgid "Always"
+msgstr "Altijd"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:287
+msgid "Presentation"
+msgstr "Presentatie"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:423
+msgid ""
+"Changes to the textured background in the main window will not take effect "
+"until you restart Rosegarden."
+msgstr ""
+"Wijzigingen in de getextureerde achtergrond in het hoofdvenster worden pas "
+"van kracht nadat u Rosegarden opnieuw opstart."
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:168
+#: ../src/gui/configuration/GeneralConfigurationPage.h:78
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:207
+#: ../src/gui/configuration/MatrixConfigurationPage.cpp:59
+msgid "General"
+msgstr "Algemeen"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.h:79
+msgid "General Configuration"
+msgstr "Algemene Configuratie"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:92
+msgid "Base octave number for MIDI pitch display"
+msgstr "Basisoctaaf om MIDI hoogtes te tonen"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:107
+msgid "Always use default studio when loading files"
+msgstr "Gebruik altijd de standaardstudio bij het laden van bestanden"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:119
+msgid "Send all MIDI Controllers at start of each playback"
+msgstr "Stuur alle MIDI-controllers als afspelen begint"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:121
+msgid ""
+"Rosegarden can send all MIDI Controllers (Pan, Reverb etc) to all MIDI "
+"devices every\n"
+"time you hit play if you so wish. Please note that this option will usually "
+"incur a\n"
+"delay at the start of playback due to the amount of data being transmitted."
+msgstr ""
+"Rosegarden kan desgewenst elke keer dat u op afspelen klikt, alle MIDI-"
+"controllers (Pan, Reverb, enz.) naar alle MIDI-apparaten sturen. Deze optie "
+"zal het afspelen meestal iets uitstellen vanwege de extra hoeveelheid te "
+"verzenden data."
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:138
+msgid "Sequencer timing source"
+msgstr "Sequencer timingbron"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:163
+msgid "Load SoundFont to SoundBlaster card at startup"
+msgstr "Laad SoundFont in de SoundBlaster-kaart bij het opstarten"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:164
+msgid ""
+"Check this box to enable soundfont loading on EMU10K-based cards when "
+"Rosegarden is launched"
+msgstr ""
+"Met deze optie laadt Rosegarden tijdens het opstarten soundfonts naar EMU10K-"
+"gebaseerde geluidskaarten."
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:173
+msgid "Path to 'asfxload' or 'sfxload' command"
+msgstr "Pad naar het commando 'asfxload' of 'sfxload'"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:180
+msgid "SoundFont"
+msgstr "SoundFont"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:223
+msgid "MIDI Clock and System messages"
+msgstr "MIDI klok- en systeemberichten"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:229
+msgid "Send MIDI Clock, Start and Stop"
+msgstr "Stuur MIDI klok, start, en stop"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:230
+msgid "Accept Start, Stop and Continue"
+msgstr "Accepteer start, stop, en verdergaan"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:241
+msgid "MIDI Machine Control mode"
+msgstr "MIDI Machine controle modus"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:248
+msgid "MMC Master"
+msgstr "MMC Master"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:249
+msgid "MMC Slave"
+msgstr "MMC Slave"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:260
+msgid "MIDI Time Code mode"
+msgstr "MIDI Time Code mode"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:267
+msgid "MTC Master"
+msgstr "MTC Master"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:268
+msgid "MTC Slave"
+msgstr "MTC Slave"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:281
+msgid "Automatically connect sync output to all devices in use"
+msgstr "Verbind sync-uitvoer automatisch met alle in gebruik zijnde apparaten"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:292
+msgid "MIDI Sync"
+msgstr "MIDI sync"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:308
+msgid "sfxload path"
+msgstr "pad naar sfxload"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:315
+msgid "Soundfont path"
+msgstr "pad naar soundfont"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:67
+msgid "%1 minutes %2.%3%4 seconds (%5 units, %6 measures)"
+msgstr "%1 minuten %2.%3.%4 seconden (%5 eenheden, %6 maten)"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:133
+msgid "Filename:"
+msgstr "Bestandsnaam"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:136
+msgid "Formal duration (to end marker):"
+msgstr "Formele duur (tot eind-marker)"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:141
+msgid "Playing duration:"
+msgstr "Afspeelduur:"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:146
+msgid "Tracks:"
+msgstr "Sporen:"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:147
+msgid "%1 used, %2 total"
+msgstr "%1 gebruikt, %2 totaal"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:152
+msgid "Segments:"
+msgstr "Segmenten:"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:153
+msgid "%1 MIDI, %2 audio, %3 total"
+msgstr "%1 MIDI, %2 audio, %3 totaal"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:161
+msgid "Statistics"
+msgstr "Statistieken"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:170
+#: ../src/gui/editors/parameters/InstrumentParameterBox.cpp:155
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:92
+msgid "Track"
+msgstr "Spoor"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:171
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:125
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:90
+msgid "Label"
+msgstr "Benaming"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:172
+msgid "Time"
+msgstr "Tijd "
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:174
+msgid "Events"
+msgstr "Gebeurtenissen"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:175
+msgid "Polyphony"
+msgstr "Polyfonie"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:176
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:126
+msgid "Repeat"
+msgstr "Herhaal"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:178
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:128
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:305
+#: ../src/gui/general/EditView.cpp:1488
+msgid "Transpose"
+msgstr "Transponeren"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:179
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:129
+msgid "Delay"
+msgstr "Vertraging"
+
+#: ../src/gui/configuration/AudioConfigurationPage.h:61
+#: ../src/gui/configuration/AudioPropertiesPage.h:58
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:204
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:523
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:524
+msgid "Audio"
+msgstr "Audio"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:204
+#: ../src/gui/configuration/MIDIConfigurationPage.h:62
+msgid "MIDI"
+msgstr "MIDI"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:317
+msgid "Segment Summary"
+msgstr "Segment samenvatting"
+
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:63
+msgid "Audio file path:"
+msgstr "Audio bestand pad:"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:137
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:68
+msgid "Choose..."
+msgstr "Kiezen..."
+
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:73
+msgid "Disk space remaining:"
+msgstr "Beschikbare schrijfruimte"
+
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:78
+msgid "Equivalent minutes of 16-bit stereo:"
+msgstr "Overeenkomend aantal minuten aan 16-bit stereo"
+
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:90
+msgid "Modify audio path"
+msgstr "Wijzigen audio pad"
+
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:113
+msgid "%1 out of %2 (%3% used)"
+msgstr "%1 van de %2 (%3% gebruikt)"
+
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:144
+msgid "minutes at"
+msgstr "minuten bij"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.h:63
+msgid "MIDI Settings"
+msgstr "MIDI-instellingen"
+
+#: ../src/gui/configuration/AudioConfigurationPage.h:62
+#: ../src/gui/configuration/AudioPropertiesPage.h:59
+msgid "Audio Settings"
+msgstr "Audio Instellingen"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:87
+msgid "Default layout mode"
+msgstr "Standaard layout-modus"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:91
+msgid "Linear layout"
+msgstr "Lineaire layout"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:92
+msgid "Continuous page layout"
+msgstr "Doorlopende pagina-layout"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:93
+msgid "Multiple page layout"
+msgstr "Meerdere pagina-layout"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:101
+msgid "Default spacing"
+msgstr "Standaard spatiëring"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:125
+msgid "Default duration factor"
+msgstr "Standaard duu&rfactor"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:141
+msgid "Full"
+msgstr "Volledig"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:152
+msgid "Show track headers (linear layout only)"
+msgstr "Toon spoorheaders (alleen bij lineaire layout)"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:158
+msgid "When needed"
+msgstr "Indien nodig"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:166
+msgid ""
+"\"Always\" and \"Never\" mean what they usually mean\n"
+"\"When needed\" means \"when staves are too many to all fit in the current "
+"window\""
+msgstr ""
+"\"Altijd\" en \"Nooit\" hebben hun gebruikelijke betekenis. \"Indien nodig\" "
+"wil zeggen \"Als er teveel notenbalken zijn om op het huidige scherm te "
+"passen\"."
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:178
+msgid "Show non-notation events as question marks"
+msgstr "Toon niet-notatie-gebeurtenissen als vraagtekens"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:188
+msgid "Show notation-quantized notes in a different color"
+msgstr "Toon notatie-gequantiseerde noten in een andere kleur"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:198
+msgid "Show \"invisible\" events in grey"
+msgstr "Toon \"onzichtbare\" gebeurtenissen in grijs"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:208
+msgid "Show notes outside suggested playable range in red"
+msgstr "Toon noten buiten het voorgestelde speelbare bereik in rood"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:218
+msgid "Highlight superimposed notes with a halo effect"
+msgstr "Opeengestapelde noten laten oplichten mbv. een halo-effect"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:231
+msgid "When recording MIDI, split-and-tie long notes at barlines"
+msgstr "Bij MIDI-opnames, splits-en-bind lange noten over de maatstreep"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:242
+msgid "Layout"
+msgstr "Layout"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:255
+msgid "Default note style for new notes"
+msgstr "Standaard notenstijl voor nieuwe noten"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:287
+msgid "When inserting notes..."
+msgstr "Bij invoegen noten..."
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:294
+msgid "Split notes into ties to make durations match"
+msgstr "Splits noten in gebonden noten om nootlengtes te laten kloppen"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:295
+msgid "Ignore existing durations"
+msgstr "Negeer bestaande duren"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:305
+msgid "Auto-beam on insert when appropriate"
+msgstr "Groeperen bij invoegen, waar gepast"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:317
+#: ../src/gui/editors/notation/NotationEraser.cpp:54
+msgid "Collapse rests after erase"
+msgstr "Verwijder rusten na wissen"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:328
+msgid "Default paste type"
+msgstr "Standaard plak type"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:350
+msgid "Editing"
+msgstr "Bewerken"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:362
+msgid "Accidentals in one octave..."
+msgstr "Voortekens in een octaaf..."
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:364
+msgid "Affect only that octave"
+msgstr "Beïnvloed alleen dat octaaf"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:365
+msgid "Require cautionaries in other octaves"
+msgstr "Eis waarschuwings-voortekens in andere octaven"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:366
+msgid "Affect all subsequent octaves"
+msgstr "Beïnvloed alle volgende octaven"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:374
+msgid "Accidentals in one bar..."
+msgstr "Voortekens in een maat..."
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:376
+msgid "Affect only that bar"
+msgstr "Beïnvloed alleen die maat"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:377
+msgid "Require cautionary resets in following bar"
+msgstr "Eis waarschuwings-herstellingstekens in de volgende maat"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:378
+msgid "Require explicit resets in following bar"
+msgstr "Eis expliciete herstellingstekens in de volgende maat"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:386
+msgid "Key signature cancellation style"
+msgstr "Herstellingstekens aan de sleutel:"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:388
+msgid "Cancel only when entering C major or A minor"
+msgstr "Alleen bij overgang naar C-groot of A-klein"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:389
+msgid "Cancel whenever removing sharps or flats"
+msgstr "Zodra er kruizen of mollen verdwijnen"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:390
+msgid "Cancel always"
+msgstr "Altijd"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:400
+msgid "Accidentals"
+msgstr "Voortekens"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:441
+msgid "Notation font"
+msgstr "Notatie-lettertype"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:467
+msgid "Origin:"
+msgstr "Oorsprong:"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:471
+msgid "Copyright:"
+msgstr "Auteursrecht (c):"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:475
+msgid "Mapped by:"
+msgstr "Genoteerd door:"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:479
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:81
+msgid "Type:"
+msgstr "Type:"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:508
+msgid "Font size for single-staff views"
+msgstr "Lettergrootte voor enkelregelige overzichten"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:516
+msgid "Font size for multi-staff views"
+msgstr "Lettergrootte voor meerregelige overzichten"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:524
+msgid "Font size for printing (pt)"
+msgstr "Lettergrootte voor afdrukken (pt)"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:541
+msgid "Text font"
+msgstr "Tekstlettertype"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:549
+msgid "Sans-serif font"
+msgstr "Schreefloos lettertype"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:664
+msgid "%1 (smooth)"
+msgstr "%1 (glad)"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:667
+msgid "%1 (jaggy)"
+msgstr "%1 (ruw)"
+
+#: ../src/gui/configuration/LatencyConfigurationPage.cpp:58
+msgid "JACK latency"
+msgstr "JACK vertraging"
+
+#: ../src/gui/configuration/LatencyConfigurationPage.cpp:61
+msgid ""
+"Use the \"Fetch JACK latencies\" button to discover the latency values set "
+"at\n"
+"the sequencer. It's recommended that you use the returned values but it's "
+"also\n"
+"possible to override them manually using the sliders. Note that if you "
+"change\n"
+"your JACK server parameters you should always fetch the latency values "
+"again.\n"
+"The latency values will be stored by Rosegarden for use next time."
+msgstr ""
+"Gebruik de knop \"JACK vertragingen bepalen\" om de vertragingen bij de "
+"sequencer te zien.\n"
+"Aanbevolen wordt om de gegeven waarden te gebruiken, maar u kunt deze ook\n"
+"handmatig instellen met de schuifbalken. NB: zodra u de JACK "
+"serverparameters\n"
+"wijzigt, dient u altijd de vertragingswaarden opnieuw te bepalen.\n"
+"De vertragingswaarden worden door Rosegarden opgeslagen voor de volgende "
+"keer."
+
+#: ../src/gui/configuration/LatencyConfigurationPage.cpp:65
+msgid "JACK playback latency (in ms)"
+msgstr "JACK afspeel vertraging (in ms)"
+
+#: ../src/gui/configuration/LatencyConfigurationPage.cpp:66
+msgid "JACK record latency (in ms)"
+msgstr "JACK opneem vertraging (in ms)"
+
+#: ../src/gui/configuration/LatencyConfigurationPage.cpp:68
+msgid "Fetch JACK latencies"
+msgstr "JACK vertragingen bepalen"
+
+#: ../src/gui/configuration/LatencyConfigurationPage.cpp:121
+msgid "JACK Latency"
+msgstr "JACK Vertraging"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:92
+msgid "Audio preview scale"
+msgstr "Schaling van audiopreview"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:96
+msgid "Linear - easier to see loud peaks"
+msgstr "Lineair - luide pieken zijn makkelijk te zien"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:97
+msgid "Meter scaling - easier to see quiet activity"
+msgstr "Meterschaling - activiteit in zachte passages beter zichtbaar"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:105
+msgid "Record audio files as"
+msgstr "Audiobestand opnemen als"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:107
+msgid "16-bit PCM WAV format (smaller files)"
+msgstr "16-bit PCM WAV-formaat (kleinere bestanden)"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:108
+msgid "32-bit float WAV format (higher quality)"
+msgstr "32-bit float WAV-formaat (hogere kwaliteit)"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:117
+msgid "External audio editor"
+msgstr "Externe audiobewerker"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:145
+msgid "Create JACK outputs"
+msgstr "Creëer JACK outputs"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:150
+msgid "for individual audio instruments"
+msgstr "voor individuele audio-instrumenteno"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:157
+msgid "for submasters"
+msgstr "voor submasters"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:184
+msgid ""
+"Rosegarden can start the JACK audio daemon (jackd) for you automatically if "
+"it isn't already running when Rosegarden starts.\n"
+"\n"
+"This is recommended for beginners and those who use Rosegarden as their main "
+"audio application, but it might not be to the liking of advanced users.\n"
+"\n"
+"If you want to start JACK automatically, make sure the command includes a "
+"full path where necessary as well as any command-line arguments you want to "
+"use.\n"
+"\n"
+"For example: /usr/local/bin/jackd -d alsa -d hw -r44100 -p 2048 -n 2\n"
+"\n"
+msgstr ""
+"Rosegarden kan de JACK audiodaemon (jackd) automatisch starten\n"
+"als die nog niet loopt bij het starten van Rosegarden.\n"
+"\n"
+"Dit is aanbevolen voor beginners en voor wie Rosegarden de belangrijkste\n"
+"audio-applicatie is, maar past soms minder goed bij geavanceerde "
+"gebruikers.\n"
+"\n"
+"Om JACK automatisch te laten starten, zorg dan dat het commando - waar\n"
+"nodig - een volledig pad, en alle gewenste commando-argumenten bevat.\n"
+"\n"
+"Bijvoorbeeld: /usr/local/bin/jackd -d alsa -d hw -r44100 -p 2048 -n 2\n"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:196
+msgid "Start JACK when Rosegarden starts"
+msgstr "Start JACK als Rosegarden start"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:201
+msgid "JACK command"
+msgstr "JACK-commando"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:214
+msgid "JACK Startup"
+msgstr "JACK Startup"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:224
+msgid "External audio editor path"
+msgstr "Externe audiobewerker-pad"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:262
+msgid "External audio editor \"%1\" not found or not executable"
+msgstr "Externe audio-editor \"%1\" niet gevonden of niet uitvoerbaar"
+
+#: ../src/gui/configuration/ColourConfigurationPage.cpp:70
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:448
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:863
+msgid "Add New Color"
+msgstr "Voeg een Nieuwe Kleur toe"
+
+#: ../src/gui/configuration/ColourConfigurationPage.cpp:74
+msgid "Delete Color"
+msgstr "Verwijder Kleur"
+
+#: ../src/gui/configuration/ColourConfigurationPage.cpp:93
+msgid "Color Map"
+msgstr "Kleurgebruik"
+
+#: ../src/gui/configuration/ColourConfigurationPage.cpp:128
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:983
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:882
+msgid "New Color Name"
+msgstr "Nieuwe Kleurnaam"
+
+#: ../src/gui/configuration/ColourConfigurationPage.cpp:130
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:59
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:984
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:883
+#: ../src/gui/studio/DeviceManagerDialog.cpp:115
+#: ../src/gui/studio/DeviceManagerDialog.cpp:174
+msgid "New"
+msgstr "Nieuw"
+
+#: ../src/gui/configuration/LatencyConfigurationPage.h:62
+msgid "Latency"
+msgstr "Vertraging"
+
+#: ../src/gui/configuration/LatencyConfigurationPage.h:63
+msgid "Sequencer Latency"
+msgstr "Sequencer-vertraging"
+
+#: ../src/gui/configuration/ColourConfigurationPage.h:61
+msgid "Color Settings"
+msgstr "Kleur Instellingen"
+
+#: ../src/gui/studio/MidiDeviceListViewItem.cpp:55
+#: ../src/gui/studio/MidiKeyMapListViewItem.cpp:44
+msgid "Key Mapping"
+msgstr "Toetsen-mapping"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:97
+msgid "Manage MIDI Banks and Programs"
+msgstr "Beheer MIDI-banken en -programma's"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:128
+msgid "MIDI Device"
+msgstr "MIDI-apparaat"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:130
+#: ../src/gui/studio/BankEditorDialog.cpp:219
+msgid "MSB"
+msgstr "MSB"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:131
+#: ../src/gui/studio/BankEditorDialog.cpp:218
+msgid "LSB"
+msgstr "LSB"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:140
+msgid "Add Bank"
+msgstr "Voeg bank toe..."
+
+#: ../src/gui/studio/BankEditorDialog.cpp:141
+msgid "Add Key Mapping"
+msgstr "Voeg toetsenbinding toe"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:153
+msgid "Add a Bank to the current device"
+msgstr "Voeg een bank toe aan het huidige apparaat"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:157
+msgid "Add a Percussion Key Mapping to the current device"
+msgstr "Voeg een slagwerk-toetsen-mapping toe aan het huidige apparaat"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:161
+msgid "Delete the current Bank or Key Mapping"
+msgstr "Verwijder de huidige bank of toets"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:165
+msgid "Delete all Banks and Key Mappings from the current Device"
+msgstr "Verwijder alle banken en toetsen-mappings van het huidige apparaat"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:167
+#: ../src/gui/studio/DeviceManagerDialog.cpp:117
+msgid "Import..."
+msgstr "Importeer..."
+
+#: ../src/gui/studio/BankEditorDialog.cpp:168
+#: ../src/gui/studio/DeviceManagerDialog.cpp:118
+msgid "Export..."
+msgstr "Exporteer..."
+
+#: ../src/gui/studio/BankEditorDialog.cpp:176
+msgid ""
+"Import Bank and Program data from a Rosegarden file to the current Device"
+msgstr ""
+"Importeer bank- en programmadata uit een Rosegarden bestand naar het huidige "
+"apparaat"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:179
+msgid ""
+"Export all Device and Bank information to a Rosegarden format interchange "
+"file"
+msgstr ""
+"Exporteer alle apparaat- en bank-informatie naar een Rosegarden formaat-"
+"uitwisselingsbestand"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:190
+msgid "Copy all Program names from current Bank to clipboard"
+msgstr "Kopier alle Programma namen van huidige Bank naar klembord"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:194
+msgid "Paste Program names from clipboard to current Bank"
+msgstr "Plak Programma namen van klembord naar huidige Bank"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:216
+msgid "Show Variation list based on "
+msgstr "Toon Variatie lijst gebaseerd op"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1010
+msgid "<new bank>"
+msgstr "<nieuwe bank>"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1046
+msgid "<new mapping>"
+msgstr "<nieuwe mapping>"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1048
+msgid "<new mapping %1>"
+msgstr "<nieuwe mapping %1>"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1089
+msgid "Really delete this bank?"
+msgstr "Deze bank echt verwijderen?"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1137
+msgid "Really delete this key mapping?"
+msgstr "Deze toetsen-mapping echt verwijderen?"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1187
+msgid "Really delete all banks for "
+msgstr "Weet u zeker dat u al deze banken wilt verwijderen voor "
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1476
+msgid "Import Banks from Device in File"
+msgstr "Importeer banken uit apparaat in bestand"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1623
+#: ../src/gui/studio/DeviceManagerDialog.cpp:770
+msgid "Export Device as..."
+msgstr "Exporteer apparaat als..."
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1694
+msgid ""
+"There are unsaved changes.\n"
+"Do you want to apply the changes before exiting the Bank Editor or discard "
+"the changes ?"
+msgstr ""
+"Er zijn onopgeslagen wijzigingen.\n"
+"Wilt u de wijzigingen toepassen voordat u de bank-editor verlaat of de "
+"wijzigingen weggooien?"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1697
+msgid "Unsaved Changes"
+msgstr "Onopgeslagen wijzigingen"
+
+#: ../src/gui/studio/NameSetEditor.cpp:68
+msgid "Librarian"
+msgstr "Bibliothecaris"
+
+#: ../src/gui/studio/NameSetEditor.cpp:75
+msgid "Email"
+msgstr "Email"
+
+#: ../src/gui/studio/NameSetEditor.cpp:80
+msgid ""
+"The librarian maintains the Rosegarden device data for this device.\n"
+"If you've made modifications to suit your own device, it might be worth\n"
+"liaising with the librarian in order to publish your information for the "
+"benefit\n"
+"of others."
+msgstr ""
+"De bibliothecaris beheert de apparaatgegevens voor dit apparaat.\n"
+"Als u wijzigingen hebt gemaakt die nodig waren voor uw eigen apparaat\n"
+"wordt het op prijs gesteld als u uw informatie doorgeeft aan de "
+"bibliothecaris\n"
+"zodat ook anderen ervan kunnen profiteren."
+
+#: ../src/gui/studio/MidiBankListViewItem.cpp:51
+#: ../src/gui/studio/MidiDeviceListViewItem.cpp:48
+msgid "Percussion Bank"
+msgstr "Percussie-bank"
+
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:84
+#: ../src/gui/studio/MidiBankListViewItem.cpp:51
+#: ../src/gui/studio/MidiDeviceListViewItem.cpp:48
+msgid "Bank"
+msgstr "Bank"
+
+#: ../src/gui/studio/ChangeRecordDeviceCommand.h:39
+msgid "Change Record Device"
+msgstr "Verander opnameapparaat"
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:61
+#: ../src/gui/studio/DeviceManagerDialog.cpp:96
+msgid "Manage MIDI Devices"
+msgstr "Beheer MIDI-apparaten"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:98
+msgid "Play devices"
+msgstr "Speel apparaten"
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:76
+#: ../src/gui/studio/DeviceManagerDialog.cpp:106
+#: ../src/gui/studio/DeviceManagerDialog.cpp:165
+msgid "Connection"
+msgstr "Connectie"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:119
+msgid "Banks..."
+msgstr "Banken..."
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:120
+msgid "Control Events..."
+msgstr "Controle-gebeurtenissen..."
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:126
+msgid "Create a new Play device"
+msgstr "Creëer een nieuw afspeelapparaat"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:129
+#: ../src/gui/studio/DeviceManagerDialog.cpp:184
+msgid "Delete the selected device"
+msgstr "Verwijder het geselecteerde apparaat"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:132
+msgid ""
+"Import Bank, Program and Controller data from a Rosegarden file to the "
+"selected device"
+msgstr ""
+"Importeer bank-, programma- en controller-data van een Rosegarden-bestand "
+"naar het geselecteerde apparaat"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:135
+msgid "Export Bank and Controller data to a Rosegarden interchange file"
+msgstr ""
+"Exporteer bank- en controller-data naar een Rosegarden uitwisselbestand"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:138
+msgid "View and edit Banks and Programs for the selected device"
+msgstr "Bekijk en wijzig banken en programma's voor het geselecteerde apparaat"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:141
+msgid ""
+"View and edit Control Events for the selected device - these are special "
+"Event types that you can define against your device and control through "
+"Control Rulers or the Instrument Parameter Box "
+msgstr ""
+"Bekijk en wijzig controlegebeurtenissen voor het geselecteerde apparaat - "
+"dit zijn speciale gebeurtenistypes die u t.o.v. uw apparaat kan definiëren "
+"en besturen d.m.v. Controle-linialen of de instrumentparameterbox."
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:156
+msgid "Record devices"
+msgstr "Opname-apparaten"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:164
+msgid "Current"
+msgstr "Huidige"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:181
+msgid "Create a new Record device"
+msgstr "Creëer nieuw opnameapparaat"
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:360
+#: ../src/gui/studio/DeviceEditorDialog.cpp:378
+#: ../src/gui/studio/DeviceManagerDialog.cpp:486
+#: ../src/gui/studio/DeviceManagerDialog.cpp:501
+msgid "New Device"
+msgstr "Nieuw apparaat"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:703
+msgid "Import from Device in File"
+msgstr "Importeer van apparaat in bestand"
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:55
+msgid "Remap Instrument assigments..."
+msgstr "Hermap Instrument toewijzingen..."
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:62
+msgid "Device or Instrument"
+msgstr "Apparaat of instrument"
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:65
+msgid "Remap Tracks by all Instruments on a Device or by single Instrument"
+msgstr ""
+"Hermap sporen op basis van alle Instrumenten op een apparaat of op basis van "
+"een enkel instrument"
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:74
+msgid "Choose Source and Destination"
+msgstr "Kies Bron en Doel"
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:77
+msgid "From"
+msgstr "Van"
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:78
+msgid "To"
+msgstr "Naar"
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:120
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:121
+msgid "<no devices>"
+msgstr "<geen apparaten>"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:155
+msgid "Show Audio &Faders"
+msgstr "Toon Audio &Faders"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:160
+msgid "Show Synth &Faders"
+msgstr "Toon Synth &Faders"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:165
+msgid "Show &Submasters"
+msgstr "Toon &Submasters"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:170
+msgid "Show &Plugin Buttons"
+msgstr "Toon &Plugin-knoppen"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:175
+msgid "Show &Unassigned Faders"
+msgstr "Toon niet-toegekende faders"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:184
+#, c-format
+msgid ""
+"_n: 1 Input\n"
+"%n Inputs"
+msgstr ""
+"1 Input\n"
+"%n Inputs"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:194
+msgid "No Submasters"
+msgstr "Geen submasters"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:203
+#, c-format
+msgid ""
+"_n: 1 Submaster\n"
+"%n Submasters"
+msgstr ""
+"1 Submaster\n"
+"%n Submasters"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:279
+msgid "Audio Mixer"
+msgstr "Audiomixer"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:311
+msgid "Record input source"
+msgstr "Opname-invooerbron"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:322
+msgid "Output destination"
+msgstr "Uitvoerbestemming"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:336
+#: ../src/gui/studio/AudioMixerWindow.cpp:495
+msgid "Pan"
+msgstr "Pan"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:355
+msgid "Mono or stereo"
+msgstr "Mono of stereo"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:364
+#: ../src/gui/studio/AudioMixerWindow.cpp:513
+msgid "Mute"
+msgstr "Dempen"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:373 rc.cpp:408
+#, no-c-format
+msgid "Solo"
+msgstr "Solo"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:382
+msgid "Arm recording"
+msgstr ""
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:400
+#, c-format
+msgid "Audio %1"
+msgstr "Audio %1"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:404
+#, c-format
+msgid "Synth %1"
+msgstr "Synth %1"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:578
+#: ../src/gui/studio/AudioMixerWindow.cpp:580
+msgid "Audio master output level"
+msgstr "Audio-master uitvoerniveau"
+
+#: ../src/gui/studio/SynthPluginManagerDialog.cpp:71
+msgid "Manage Synth Plugins"
+msgstr "Beheer synth-plugins"
+
+#: ../src/gui/studio/SynthPluginManagerDialog.cpp:78
+msgid "Synth plugins"
+msgstr "synth-plugins"
+
+#: ../src/gui/studio/SynthPluginManagerDialog.cpp:145
+msgid "Controls"
+msgstr "Controls"
+
+#: ../src/gui/studio/SynthPluginManagerDialog.cpp:152
+msgid "Editor >>"
+msgstr "Editor >>"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:66
+#: ../src/gui/studio/MidiProgramsEditor.cpp:169
+msgid "Bank and Program details"
+msgstr "Bank en Programma details"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:67
+msgid "Programs"
+msgstr "Programma's"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2711
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:88
+#: ../src/gui/studio/MidiProgramsEditor.cpp:93
+msgid "Percussion"
+msgstr "Slagwerk"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:99
+msgid "MSB Value"
+msgstr "MSB Waarde"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:107
+msgid ""
+"Selects a MSB controller Bank number (MSB/LSB pairs are always unique for "
+"any Device)"
+msgstr ""
+"Selecteer een MSB controller Bank nummer (MSB/LSB paren zijn altijd uniek "
+"voor elk apparaat)"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:111
+msgid ""
+"Selects a LSB controller Bank number (MSB/LSB pairs are always unique for "
+"any Device)"
+msgstr ""
+"Selecteer een LSB controller Bank nummer (MSB/LSB paren zijn altijd uniek "
+"voor elk Apparaat)"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:116
+msgid "LSB Value"
+msgstr "LSB Waarde"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:254
+#: ../src/gui/studio/MidiProgramsEditor.cpp:541
+#, c-format
+msgid "Key Mapping: %1"
+msgstr "Toets-mapping: %1"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:476
+msgid "<no key mapping>"
+msgstr "<geen toets-mapping>"
+
+#: ../src/gui/studio/MidiKeyMappingEditor.cpp:57
+#: ../src/gui/studio/MidiKeyMappingEditor.cpp:81
+msgid "Key Mapping details"
+msgstr "Toets-mapping-details"
+
+#: ../src/gui/studio/MidiKeyMappingEditor.cpp:58
+msgid "Pitches"
+msgstr "Toonhoogtes"
+
+#: ../src/gui/studio/MidiMixerWindow.cpp:152
+msgid "MIDI Mixer"
+msgstr "MIDI-mixer"
+
+#: ../src/gui/studio/MidiMixerWindow.cpp:199
+msgid "Volume"
+msgstr "Volume"
+
+#: ../src/gui/studio/AudioPluginOSCGUIManager.cpp:444
+msgid "Rosegarden Plugin"
+msgstr "Rosegarden-plugin"
+
+#: ../src/gui/studio/AudioPluginOSCGUIManager.cpp:447
+#, c-format
+msgid "Rosegarden: %1"
+msgstr "Rosegarden: %1"
+
+#: ../src/gui/studio/AudioPluginOSCGUIManager.cpp:449
+msgid "Rosegarden: %1: %2"
+msgstr "Rosegarden: %1: %2"
+
+#: ../src/gui/studio/AudioPluginOSCGUIManager.cpp:450
+#, c-format
+msgid "Plugin slot %1"
+msgstr "Plugin slot %1"
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:92
+msgid "Add Play Device"
+msgstr "Voeg afspeelapparaat toe"
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:93
+msgid "Add Record Device"
+msgstr "Voeg opnameapparaat toe"
+
+#: ../src/commands/studio/CreateOrDeleteDeviceCommand.h:68
+#: ../src/gui/studio/DeviceEditorDialog.cpp:94
+msgid "Delete Device"
+msgstr "Verwijder apparaat"
+
+#: ../src/gui/editors/segment/PlayList.cpp:77
+#: ../src/gui/studio/DeviceEditorDialog.cpp:156
+#: ../src/gui/studio/DeviceEditorDialog.cpp:361
+msgid "Play"
+msgstr "Afspelen"
+
+#: ../src/commands/segment/SegmentRecordCommand.cpp:37
+#: ../src/gui/studio/DeviceEditorDialog.cpp:156
+#: ../src/gui/studio/DeviceEditorDialog.cpp:379 rc.cpp:394
+#, no-c-format
+msgid "Record"
+msgstr "Opnemen"
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:256
+msgid "Apply pending changes?"
+msgstr "Onopgeslagen veranderingen toepassen?"
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:359
+#: ../src/gui/studio/DeviceEditorDialog.cpp:377
+msgid "<new device>"
+msgstr "<nieuw apparaat>"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentEraser.cpp:82
+msgid "Click on a segment to delete it"
+msgstr "Klik op een segment om het te verwijderen"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSplitter.cpp:166
+msgid ""
+"Click on a segment to split it in two; hold Shift to avoid snapping to beat "
+"grid"
+msgstr ""
+"Klik op een segment om het in tweeën te splitsen; houd Shift ingedrukt om "
+"niet naar het rooster te springen."
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSplitter.cpp:168
+msgid "Click on a segment to split it in two"
+msgstr "Klik op een segment om het in tweeën te splitsen"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:81
+msgid "Click and drag to select segments"
+msgstr "Klik-en-sleep om segmenten te selecteren"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentMover.cpp:154
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:238
+msgid "Move Segment"
+msgstr "Verplaats segment"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentMover.cpp:154
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:239
+msgid "Move Segments"
+msgstr "Verplaats segmenten"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:217
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:169
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:141
+#: ../src/gui/editors/segment/segmentcanvas/SegmentMover.cpp:210
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:255
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:359
+msgid "Hold Shift to avoid snapping to beat grid"
+msgstr "Houd Shift ingedrukt om niet naar het rooster te springen"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:485
+msgid ""
+"Click and drag to select segments; middle-click and drag to draw an empty "
+"segment"
+msgstr ""
+"Klik-en-sleep om segmenten te selecteren; middel-klik-en-sleep om een leeg "
+"segment te tekenen"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:384
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:502
+msgid ""
+"Click and drag to resize a segment; hold Ctrl as well to rescale its contents"
+msgstr ""
+"Klik-en-sleep om een segment te herschalen; houd Ctrl ook ingedrukt om de "
+"inhoud te herschalen"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:386
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:504
+msgid "Click and drag to rescale segment"
+msgstr "Klik-en-sleep om segment te herschalen"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:509
+msgid "Click and drag to move segments; hold Ctrl as well to copy them"
+msgstr ""
+"Klik-en-sleep om segmenten te verplaatsen; houd Ctrl ook ingedrukt om te "
+"kopiëren"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:511
+msgid "Click and drag to copy segments"
+msgstr "Klik-en-sleep om segmenten te kopiëren"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:515
+msgid ""
+"Click and drag to move segment; hold Ctrl as well to copy it; double-click "
+"to edit"
+msgstr ""
+"Klik-en-sleep om segmenten te verplaatsen; houd Ctrl ook ingedrukt om te "
+"kopiëren; dubbelklik om te bewerken"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:517
+msgid "Click and drag to copy segment"
+msgstr "Klik-en-sleep om segment te kopiëren"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:157
+msgid ""
+"The audio file path does not exist or is not writable.\n"
+"You must set the audio file path to a valid directory in Document Properties "
+"before rescaling an audio file.\n"
+"Would you like to set it now?"
+msgstr ""
+"Het audiobestandspad bestaat niet of is niet schrijfbaar\n"
+"U dient het audiobestandspad in te stellen op een geldige folder in "
+"Documenteigenschappen alvorens een audiobestand te herschalen.\n"
+"Wilt u het nu instellen?"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:261
+msgid ""
+"Hold Shift to avoid snapping to beat grid; hold Ctrl as well to rescale "
+"contents"
+msgstr ""
+"Houd Shift ingedrukt om niet naar rooster te verspringen; gebruik ook Ctrl "
+"om de inhoud te herschalen."
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentMover.cpp:325
+msgid "Click and drag to move a segment"
+msgstr "Klik-en-sleep om een segment te verplaatsen"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentPencil.cpp:225
+msgid "Hold Shift to avoid snapping to bar lines"
+msgstr "Houd Shift ingesrukt om niet naar maatstrepen te verspringen"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentPencil.cpp:283
+msgid "Record or drop audio here"
+msgstr "Hier audio droppen of opnemen"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentPencil.cpp:289
+msgid ""
+"Click and drag to draw an empty segment. Control+Alt click and drag to draw "
+"in overlap mode."
+msgstr ""
+"Klik-en-sleep om een leeg segment te tekenen; Ctrl+Alt klik-en-sleep om in "
+"overlap-modus te tekenen."
+
+#: ../src/gui/editors/segment/TrackLabel.cpp:77
+msgid ""
+"Click and hold with left mouse button to assign this Track to an Instrument."
+msgstr ""
+"Houd de linker muisknop ingedrukt om dit spoor aan een instrument toe te "
+"wijzen."
+
+#: ../src/gui/editors/segment/TrackLabel.cpp:191
+msgid "Change track name"
+msgstr "Wijzig spoornaam"
+
+#: ../src/gui/editors/segment/TrackLabel.cpp:192
+msgid "Enter new track name"
+msgstr "Voer nieuwe spoornaam in"
+
+#: ../src/gui/editors/segment/TrackEditor.cpp:648
+msgid "Turn Repeating Segment into Real Copies"
+msgstr "Zet het herhalende segment om in echte kopieën"
+
+#: ../src/gui/editors/segment/TrackEditor.cpp:650
+msgid "Turn Repeating Segments into Real Copies"
+msgstr "Zet de herhalende segmenten om in echte kopieën"
+
+#: ../src/gui/editors/segment/TrackEditor.cpp:814
+msgid ""
+"You can't drop files into Rosegarden from this client. Try using Konqueror "
+"instead."
+msgstr ""
+"U kunt vanaf deze cliënt geen bestanden in Rosegarden droppen. Probeer het "
+"eens met Konqueror."
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:85
+msgid "Manage Triggered Segments"
+msgstr "Beheer getriggerde segmenten"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:89
+msgid "ID"
+msgstr "ID"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:735
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:93
+msgid "Base velocity"
+msgstr "Basissnelheid"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:94
+msgid "Triggers"
+msgstr "Triggers"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:115
+msgid "Add a Triggered Segment"
+msgstr "Voeg een getriggerd segment toe"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:119
+msgid "Delete a Triggered Segment"
+msgstr "Verwijder een getriggerd segment"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:123
+msgid "Delete All Triggered Segments"
+msgstr "Verwijder alle getriggerde segmenten"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:127
+msgid "Close the Triggered Segment Manager"
+msgstr "Sluit de getriggerde segmenten-beheerder"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:169
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:245
+msgid "<no label>"
+msgstr "<geen label>"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:248
+msgid ""
+"_n: %1 on 1 track\n"
+"%1 on %n tracks"
+msgstr ""
+"%1 op 1 spoor\n"
+"%1 op %n sporen"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:284
+msgid ""
+"This will remove all triggered segments from the whole composition. Are you "
+"sure?"
+msgstr ""
+"Weet u zeker dat u alle getriggerde segmenten uit de hele compositie wilt "
+"verwijderen?"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:288
+msgid "Remove all triggered segments"
+msgstr "Verwijder alle getriggerde segmenten"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:313
+msgid "Trigger Segment Duration"
+msgstr "Duur van getriggerd segment"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:336
+#, c-format
+msgid ""
+"_n: This triggered segment is used 1 time in the current composition. Are "
+"you sure you want to remove it?\n"
+"This triggered segment is used %n times in the current composition. Are you "
+"sure you want to remove it?"
+msgstr ""
+"Dit getriggerde segment wordt 1x gebruikt in de huidige compositie. Wilt u "
+"deze echt verwijderen?\n"
+"Dit getriggerde segment wordt %nx gebruikt in de huidige compositie. Wilt u "
+"deze echt verwijderen?"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:400
+msgid "Pa&ste as New Triggered Segment"
+msgstr "&Plak als nieuw getriggerd segment"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1169
+#: ../src/gui/editors/segment/MarkerEditor.cpp:399
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:412
+#: ../src/gui/editors/tempo/TempoView.cpp:622
+msgid "&Musical Times"
+msgstr "&Muzikale tijden"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1179
+#: ../src/gui/editors/segment/MarkerEditor.cpp:409
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:422
+#: ../src/gui/editors/tempo/TempoView.cpp:632
+msgid "&Real Times"
+msgstr "&Werkelijke tijden"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1189
+#: ../src/gui/editors/segment/MarkerEditor.cpp:419
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:432
+#: ../src/gui/editors/tempo/TempoView.cpp:642
+msgid "Ra&w Times"
+msgstr "&Ruwe tijden"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:83
+msgid "Manage Markers"
+msgstr "Beheer accenten"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:86
+msgid "Marker time "
+msgstr "Accenttijd "
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:87
+msgid "Marker text "
+msgstr "Markeringtekst"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:88
+msgid "Marker description "
+msgstr "Accentbeschrijving "
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:95
+msgid "Pointer position"
+msgstr "Aanwijzer positie"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:100
+msgid "Real time:"
+msgstr "Werkelijke tijd:"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:103
+msgid "In measure:"
+msgstr "In maat:"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:121
+msgid "Add a Marker"
+msgstr "Voeg een accent toe"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:125
+msgid "Delete a Marker"
+msgstr "Verwijder een accent"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:129
+msgid "Delete All Markers"
+msgstr "Verwijder alle accenten"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:133
+msgid "Close the Marker Editor"
+msgstr "Sluit de accent-editor"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:296
+msgid "Remove all markers"
+msgstr "Verwijder alle accenten"
+
+#: ../src/gui/editors/segment/PlayList.cpp:76
+msgid "Add..."
+msgstr "Toevoegen..."
+
+#: ../src/gui/editors/segment/PlayList.cpp:78
+msgid "Move Up"
+msgstr "Verplaats Spoor om&hoog"
+
+#: ../src/gui/editors/segment/PlayList.cpp:79
+msgid "Move Down"
+msgstr "Verplaats Spoor om&laag"
+
+#: ../src/gui/editors/segment/PlayList.cpp:124
+msgid "Select one or more Rosegarden files"
+msgstr "Selecteer een of meer Rosegarde-bestanden"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:73
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:55
+msgid "<not showing>"
+msgstr "<niet getoond>"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:89
+msgid "Manage Control Events"
+msgstr "Beheer Control Events"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:91
+msgid "<no device>"
+msgstr "<geen apparaat>"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:99
+msgid " Control Events for %1 (device %2)"
+msgstr " Controlegebeurtenissen voor %1 (apparaat %2)"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:104
+msgid "Control Event name "
+msgstr "Naam van controlegebeurtenis"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:105
+msgid "Control Event type "
+msgstr "Type controlegebeurtenis"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:106
+msgid "Control Event value "
+msgstr "Waarde van controlegebeurtenis"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:107
+msgid "Description "
+msgstr "Omschrijving "
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:108
+msgid "Min "
+msgstr "Min "
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:109
+msgid "Max "
+msgstr "Max "
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:110
+msgid "Default "
+msgstr "Standaard "
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:111
+msgid "Color "
+msgstr "Kleur "
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:112
+msgid "Position on instrument panel"
+msgstr "Positie op instumentpaneel"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:136
+msgid "Add a Control Parameter to the Studio"
+msgstr "Voeg een controleparameter toe aan de studio"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:140
+msgid "Delete a Control Parameter from the Studio"
+msgstr "Verwijder een controleparameter uit de studio"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:144
+msgid "Close the Control Parameter editor"
+msgstr "Sluit de Controle Parameter Bewerker"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:221
+msgid "<default>"
+msgstr "<standaard>"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:62
+msgid "Edit Control Parameter"
+msgstr "Bewerk Controle Parameter"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:71
+msgid "Control Event Properties"
+msgstr "Controlegebeurtenis-eigenschappen"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:77
+msgid "Name:"
+msgstr "Naam:"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:93
+msgid "Control Event value:"
+msgstr "Controlegebeurtenis-waarde:"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:97
+msgid "Minimum value:"
+msgstr "Minimum waarde:"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:101
+msgid "Maximum value:"
+msgstr "Maximum waarde:"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:105
+msgid "Default value:"
+msgstr "Standaard waarde:"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:109
+msgid "Color:"
+msgstr "Kleur:"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:113
+msgid "Instrument Parameter Box position:"
+msgstr "Positie van de instrument-parameterbox:"
+
+#: ../src/gui/editors/segment/TrackButtons.cpp:209
+#: ../src/gui/editors/segment/TrackButtons.cpp:585
+#: ../src/gui/editors/segment/TrackButtons.cpp:935
+#: ../src/gui/editors/segment/TrackButtons.cpp:1127
+msgid "<no instrument>"
+msgstr "<geen instrument>"
+
+#: ../src/gui/editors/segment/TrackButtons.cpp:352
+#: ../src/gui/editors/segment/TrackButtons.cpp:1094
+msgid "<untitled audio>"
+msgstr "<naamloze audio>"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:130
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:662
+#: ../src/gui/editors/segment/TrackButtons.cpp:354
+#: ../src/gui/editors/segment/TrackButtons.cpp:1096
+msgid "<untitled>"
+msgstr "<naamloos>"
+
+#: ../src/gui/editors/segment/TrackButtons.cpp:1058
+msgid "Mute track"
+msgstr "Demp Spoor"
+
+#: ../src/gui/editors/segment/TrackButtons.cpp:1063
+msgid "Record on this track"
+msgstr "Op dit spoor opnemen"
+
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:88
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:1015
+msgid "Segment"
+msgstr "Segment"
+
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:89
+msgid "Segment Parameters"
+msgstr "Segmentparameters"
+
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:366
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:697
+msgid "%1 ms"
+msgstr "%1 ms"
+
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:1031
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:910
+msgid "Highest playable note"
+msgstr "Hoogst speelbare noot"
+
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:1051
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:930
+msgid "Lowest playable note"
+msgstr "Laagst speelbare noot"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:93
+msgid "Track Parameters"
+msgstr "Spoorparameters"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:137
+msgid "Playback parameters"
+msgstr "Afspeelparameters"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:172
+msgid "Recording filters"
+msgstr "Opnamefilters"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:191
+msgid "Channel"
+msgstr "Kanaal"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:203
+msgid "Staff export options"
+msgstr "Notenbalk-exportopties"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:220
+msgid "Notation size:"
+msgstr "Notatiegrootte:"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:225
+msgid "Small"
+msgstr "Klein"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:226
+msgid "Tiny"
+msgstr "Zeer klein"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:233
+msgid "Bracket type:"
+msgstr "Type notenbalk-groepering:"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:237
+msgid "-----"
+msgstr "-----"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:238
+msgid "[----"
+msgstr "[----"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:239
+msgid "----]"
+msgstr "----]"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:240
+msgid "[---]"
+msgstr "[---]"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:241
+msgid "{----"
+msgstr "{----"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:242
+msgid "----}"
+msgstr "----}"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:243
+msgid "{[---"
+msgstr "{[---"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:244
+msgid "---]}"
+msgstr "---]}"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:253
+msgid "Create segments with"
+msgstr "Creëer segmenten met"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:264
+msgid "Preset"
+msgstr "Preset"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:272
+msgid "Load"
+msgstr "Laden"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:282
+msgid "treble"
+msgstr "viool-"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:283
+msgid "bass"
+msgstr "bas-"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:284
+msgid "crotales"
+msgstr "crotales-"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:285
+msgid "xylophone"
+msgstr "xylofoon-"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:286
+msgid "guitar"
+msgstr "gitaar-"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:287
+msgid "contrabass"
+msgstr "contrabas-"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:288
+msgid "celesta"
+msgstr "celesta-"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:289
+msgid "old celesta"
+msgstr "oude celesta-"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:290
+msgid "french"
+msgstr "franse"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:291
+msgid "soprano"
+msgstr "sopraan-"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:292
+msgid "mezzosoprano"
+msgstr "mezzosopraan-"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:293
+msgid "alto"
+msgstr "alt-"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:294
+msgid "tenor"
+msgstr "tenor-"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:295
+msgid "baritone"
+msgstr "bariton-"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:296
+msgid "varbaritone"
+msgstr "(variatie) bariton-"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:297
+msgid "subbass"
+msgstr "subbas-"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:327
+msgid "Lowest"
+msgstr "Laagste"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:329
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:336
+msgid "---"
+msgstr "---"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:331
+msgid "Choose the lowest suggested playable note, using a staff"
+msgstr "Kies de laagst voorgestelde speelbare noot, mbv. een notenbalk"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:334
+msgid "Highest"
+msgstr "Hoogste"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:338
+msgid "Choose the highest suggested playable note, using a staff"
+msgstr "Kies de hoogst voorgestelde speelbare noot, mbv. een notenbalk"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:666
+msgid "[ Track %1 - %2 ]"
+msgstr "[ Spoor %1 - %2 ]"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:985
+msgid "The instrument preset database is corrupt. Check your installation."
+msgstr "De instrumenten preset-database is corrupt. Controleer uw installatie."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:173
+#: ../src/gui/editors/parameters/InstrumentParameterBox.cpp:54
+msgid "Instrument Parameters"
+msgstr "Instrumentparameters"
+
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:85
+msgid "Variation"
+msgstr "Variatie"
+
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:86
+msgid "Program"
+msgstr "Programma"
+
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:87
+msgid "Channel out"
+msgstr "Uitvoerkanaal"
+
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:215
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:221
+msgid "[ %1 ]"
+msgstr "[ %1 ]"
+
+#: ../src/gui/editors/matrix/MatrixEraser.cpp:58
+#: ../src/gui/editors/matrix/MatrixMover.cpp:71
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:67
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:77
+msgid "Switch to Draw Tool"
+msgstr "Wissel naar tekengereedschap"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:75
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:69
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:71
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:81
+#: ../src/gui/editors/notation/ClefInserter.cpp:57
+#: ../src/gui/editors/notation/GuitarChordInserter.cpp:63
+#: ../src/gui/editors/notation/NotationSelector.cpp:87
+#: ../src/gui/editors/notation/NoteInserter.cpp:113
+#: ../src/gui/editors/notation/RestInserter.cpp:72
+#: ../src/gui/editors/notation/TextInserter.cpp:61
+msgid "Switch to Erase Tool"
+msgstr "Wissel naar gum"
+
+#: ../src/gui/editors/matrix/MatrixEraser.cpp:62
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:73
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:75
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:85
+msgid "Switch to Move Tool"
+msgstr "Wissel naar verplaats-gereedschap"
+
+#: ../src/gui/editors/matrix/MatrixEraser.cpp:68
+#: ../src/gui/editors/matrix/MatrixMover.cpp:81
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:79
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:93
+msgid "Switch to Resize Tool"
+msgstr "Wissel naar resize-gereedschap"
+
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:446
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:579
+msgid "Click and drag to select; middle-click and drag to draw new note"
+msgstr ""
+"Klik-en-sleep om te selecteren; middel-klik-en-sleep om een nieuwe noot te "
+"tekenen"
+
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:324
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:597
+msgid "Click and drag to resize selected notes"
+msgstr "Klik-en-sleep om geselecteerde noten te herschalen"
+
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:599
+msgid "Click and drag to resize note"
+msgstr "Klik-en-sleep om de noot te herschalen"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:471
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:604
+msgid "Click and drag to move selected notes; hold Ctrl as well to copy"
+msgstr ""
+"Klik-en-sleep om geselecteerde noten te verplaatsen; gebruik ook Ctrl om te "
+"kopiëren"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:473
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:606
+msgid "Click and drag to copy selected notes"
+msgstr "Klik-en-sleep om geselecteerde noten te kopiëren"
+
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:610
+msgid "Click and drag to move note; hold Ctrl as well to copy"
+msgstr ""
+"Klik-en-sleep om de noot te verplaatsen; gebruik ook Ctrl om te kopiëren"
+
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:612
+msgid "Click and drag to copy note"
+msgstr "Klik-en-sleep om de noot te kopiëren"
+
+#: ../src/gui/editors/matrix/MatrixEraser.cpp:54
+#: ../src/gui/editors/matrix/MatrixMover.cpp:67
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:65
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:63
+#: ../src/gui/editors/notation/ClefInserter.cpp:53
+#: ../src/gui/editors/notation/GuitarChordInserter.cpp:59
+#: ../src/gui/editors/notation/NotationEraser.cpp:67
+#: ../src/gui/editors/notation/NoteInserter.cpp:109
+#: ../src/gui/editors/notation/RestInserter.cpp:68
+#: ../src/gui/editors/notation/TextInserter.cpp:57
+msgid "Switch to Select Tool"
+msgstr "Wissel naar Selecteren"
+
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:218
+msgid "Resize Event"
+msgstr "Verander Grootte Gebeurtenis"
+
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:221
+msgid "Resize Events"
+msgstr "Verander Grootte Gebeurtenissen"
+
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:326
+msgid "Click and drag to resize a note"
+msgstr "Klik-en-sleep om de noot te herschalen"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:328
+msgid "Copy and Move Event"
+msgstr "Kopieer en verplaats gebeurtenis"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:330
+msgid "Copy and Move Events"
+msgstr "Kopieer en verplaats gebeurtenissen"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:334
+msgid "Move Event"
+msgstr "Verplaats Gebeurtenis"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:336
+msgid "Move Events"
+msgstr "Verplaats Gebeurtenissen"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:465
+msgid "Click and drag to move a note; hold Ctrl as well to copy it"
+msgstr ""
+"Klik-en-sleep om een noot te verplaatsen; gebruik ook Ctrl om hem te kopiëren"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:467
+msgid "Click and drag to copy a note"
+msgstr "Klik-en-sleep om een noot te kopiëren"
+
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:361
+msgid "Click and drag to draw a note; Shift to avoid snapping to grid"
+msgstr ""
+"Klik-en-sleep om een noot te tekenen; Shift om niet naar rooster te "
+"verspringen"
+
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:363
+msgid "Click and drag to draw a note"
+msgstr "Klik-en-sleep om een noot te tekenen"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:437
+#: ../src/gui/editors/matrix/MatrixView.cpp:3053
+msgid "Couldn't apply piano roll layout"
+msgstr "Kan piano klavier layout niet toepassen"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:663
+msgid "Resi&ze"
+msgstr "Verander &Grootte"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:669
+#: ../src/gui/editors/notation/NotationView.cpp:1919
+msgid "C&hord Insert Mode"
+msgstr "A&kkoord Invoegen Modus"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:676
+#: ../src/gui/editors/notation/NotationView.cpp:1778
+msgid "Ste&p Recording"
+msgstr "&Stap Opnemen"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:694
+msgid "&Legato"
+msgstr "&Legato"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:708
+msgid "Set to Current Velocity"
+msgstr "Zet op huidige velocity"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:712
+msgid "Set Event &Velocities..."
+msgstr "Stel gebeurtenis-&velocities in"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:716
+msgid "Trigger Se&gment..."
+msgstr "Trigger Se&gment..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:720
+msgid "Remove Triggers..."
+msgstr "Verwijder triggers..."
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1153
+#: ../src/gui/editors/matrix/MatrixView.cpp:724
+#: ../src/gui/editors/tempo/TempoView.cpp:606
+msgid "Select &All"
+msgstr "&Alles Selecteren"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:732
+#: ../src/gui/editors/notation/NotationView.cpp:2325
+msgid "Cursor &Back"
+msgstr "Cursor &Terug"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:736
+#: ../src/gui/editors/notation/NotationView.cpp:2329
+msgid "Cursor &Forward"
+msgstr "Cursor &Vooruit"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:740
+#: ../src/gui/editors/notation/NotationView.cpp:2333
+msgid "Cursor Ba&ck Bar"
+msgstr "Cursor Te&rug Balk"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:744
+#: ../src/gui/editors/notation/NotationView.cpp:2337
+msgid "Cursor For&ward Bar"
+msgstr "Cursor Voor&uit Balk"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:748
+#: ../src/gui/editors/notation/NotationView.cpp:2341
+msgid "Cursor Back and Se&lect"
+msgstr "Cursor Terug en Se&lecteren"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:752
+#: ../src/gui/editors/notation/NotationView.cpp:2345
+msgid "Cursor Forward and &Select"
+msgstr "Cursor Vooruit en &Selecteren"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:756
+#: ../src/gui/editors/notation/NotationView.cpp:2349
+msgid "Cursor Back Bar and Select"
+msgstr "Cursor maat terug en selecteren"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:760
+#: ../src/gui/editors/notation/NotationView.cpp:2353
+msgid "Cursor Forward Bar and Select"
+msgstr "Cursor maat vooruit en selecteren"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:764
+#: ../src/gui/editors/notation/NotationView.cpp:2363
+msgid "Cursor to St&art"
+msgstr "Cursor naar &begin"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:770
+#: ../src/gui/editors/notation/NotationView.cpp:2369
+msgid "Cursor to &End"
+msgstr "Cursor naar &eind"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:776
+#: ../src/gui/editors/notation/NotationView.cpp:2391
+msgid "Cursor to &Playback Pointer"
+msgstr "Cursor naar afspeel-&pointer"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:820
+#: ../src/gui/editors/notation/NotationView.cpp:2435
+msgid "Playback Pointer to &Cursor"
+msgstr "Afspeel-pointer naar &cursor"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:826
+#: ../src/gui/editors/notation/NotationView.cpp:2441
+msgid "&Solo"
+msgstr "&Solo"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:841
+#: ../src/gui/editors/notation/NotationView.cpp:2456
+msgid "Set Loop to Selection"
+msgstr "Gebruik selectie als afspeellus"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:845
+#: ../src/gui/editors/notation/NotationView.cpp:2460
+msgid "Clear L&oop"
+msgstr "Lus wissen"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1157
+#: ../src/gui/editors/matrix/MatrixView.cpp:849
+#: ../src/gui/editors/notation/NotationView.cpp:2464
+#: ../src/gui/editors/tempo/TempoView.cpp:610
+msgid "Clear Selection"
+msgstr "Selectie Wissen"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1149
+#: ../src/gui/editors/matrix/MatrixView.cpp:854
+#: ../src/gui/editors/notation/NotationView.cpp:2471
+msgid "&Filter Selection"
+msgstr "&Filter Selectie"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:879
+msgid "&No Snap"
+msgstr "&Niet springen"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:884
+msgid "Snap to Bea&t"
+msgstr "Spring naar &tel"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:888
+msgid "Snap to &Bar"
+msgstr "Spring naar &maat"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:908
+#, c-format
+msgid "Snap to %1"
+msgstr "Spring naar %1"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:917
+msgid "Show Instrument Parameters"
+msgstr "Toon instrumentparameters"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:922
+#: ../src/gui/editors/notation/NotationView.cpp:1850
+msgid "Show Ch&ord Name Ruler"
+msgstr "Toon akk&oordnaam-liniaal"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:926
+#: ../src/gui/editors/notation/NotationView.cpp:1858
+msgid "Show &Tempo Ruler"
+msgstr "Toon &tempo-liniaal"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1238
+#: ../src/gui/editors/notation/NotationView.cpp:3245
+#, c-format
+msgid ""
+"_n: 1 event selected \n"
+" %n events selected "
+msgstr ""
+" 1 gebeurtenis geselecteerd \n"
+" %n gebeurtenissen geselecteerd "
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1241
+#: ../src/gui/editors/notation/NotationView.cpp:3247
+msgid " No selection "
+msgstr "Geen selectie"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1348
+#: ../src/gui/editors/matrix/MatrixView.cpp:1360
+#: ../src/gui/editors/matrix/MatrixView.cpp:2079
+#: ../src/gui/editors/notation/NotationView.cpp:5869
+msgid "Quantizing..."
+msgstr "Quantiseren..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1370
+#: ../src/gui/editors/notation/NotationView.cpp:5407
+msgid "Collapsing notes..."
+msgstr "Inklappen noten..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1381
+msgid "Making legato..."
+msgstr "Legato maken..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1476
+msgid "Note: %1 (%2.%3s)"
+msgstr "Noot: %1 (%2.%3s)"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1531
+#: ../src/gui/editors/notation/NotationView.cpp:7206
+msgid "Time: %1 (%2.%3s)"
+msgstr "Tijd: %1 (%2.%3s)"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1604
+#: ../src/gui/editors/notation/NotationView.cpp:4744
+#: ../src/gui/editors/notation/NotationView.cpp:4773
+msgid "Cutting selection to clipboard..."
+msgstr "Selectie knippen en naar klembord brengen"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:912
+#: ../src/gui/editors/matrix/MatrixView.cpp:1636
+#: ../src/gui/editors/notation/NotationSelectionPaster.cpp:82
+msgid "Couldn't paste at this point"
+msgstr "Kan niet plakken op dit punt"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1647
+#: ../src/gui/editors/notation/NotationView.cpp:4754
+msgid "Deleting selection..."
+msgstr "Selectie verwijderen..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1833
+#: ../src/gui/editors/notation/NotationView.cpp:5617
+#, c-format
+msgid "Unknown note insert action %1"
+msgstr "Noot-invoegactie %1 onbekend"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1837
+#: ../src/gui/editors/matrix/MatrixView.cpp:2857
+#: ../src/gui/editors/notation/NotationView.cpp:5621
+msgid "Inserting note"
+msgstr "Noot invoegen..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2091
+msgid "Unquantizing..."
+msgstr "Ont-quantiseren..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2120
+msgid " Grid: "
+msgstr "Rooster:"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2134
+msgid "Unit"
+msgstr "Eenheid"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2136
+msgid "Beat"
+msgstr "Beat"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2138
+msgid "Bar"
+msgstr "Maat"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2159
+msgid " Velocity: "
+msgstr " Velocity: "
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2170
+msgid " Quantize: "
+msgstr "Quantiseer:"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2584
+msgid "Raising velocities..."
+msgstr "Verhogen snelheden..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2596
+msgid "Lowering velocities..."
+msgstr "Verlagen snelheden..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2611
+msgid "Set Event Velocities"
+msgstr "Stel Gebeurtenis Snelheden In"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2616
+msgid "Setting Velocities..."
+msgstr "Instellen Snelheden..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2665
+msgid "Remove Triggers"
+msgstr "Verwijder triggers"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2723
+msgid "%1 - Segment Track #%2 - %3"
+msgstr "%1 - Segmentspoor #%2 - %3"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2730
+msgid "%1 - All Segments - %2"
+msgstr "%1 - Alle Segmenten - %2"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2737
+msgid ""
+"_n: %1 - 1 Segment - %2\n"
+"%1 - %n Segments - %2"
+msgstr ""
+"%1 - 1 Segment - %2\n"
+"%1 - %n Segmenten - %2"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2885
+msgid "Can't insert note: No grid duration selected"
+msgstr "Kan noot niet invoegen: Geen roosterlengte geselecteerd"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2935
+msgid " Chord "
+msgstr " Akkoord"
+
+#: ../src/gui/editors/matrix/MatrixEraser.cpp:105
+msgid "Click on a note to delete it"
+msgstr "Klik op een noot om die te verwijderen"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:89
+msgid "Filter"
+msgstr "Filter"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:245
+#: ../src/gui/editors/tempo/TempoView.cpp:117
+msgid "Time "
+msgstr "Tijd "
+
+#: ../src/gui/editors/tempo/TempoView.cpp:118
+msgid "Type "
+msgstr "Type "
+
+#: ../src/gui/editors/tempo/TempoView.cpp:119
+msgid "Value "
+msgstr "Waarde"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:120
+msgid "Properties "
+msgstr "Eigenschappen"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:208
+msgid "Common, hidden"
+msgstr "Ongedeeld, verborgen"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:210
+msgid "Hidden"
+msgstr "Verborgen"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:213
+msgid "Common"
+msgstr "Ongedeeld"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:220
+msgid "Time Signature "
+msgstr "Maatsoort"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:245
+msgid "%1.%2%3"
+msgstr "%1.%2%3"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:255
+msgid "%1.%2%3 qpm (%4.%5%6 bpm) "
+msgstr "%1.%2%3 qpm (%4.%5%6 bpm) "
+
+#: ../src/gui/editors/tempo/TempoView.cpp:264
+msgid "Tempo "
+msgstr "Tempo"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:271
+msgid "<nothing at this filter level>"
+msgstr "<geen gebeurtenissen op dit filterniveau>"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:463
+msgid "Delete Tempo or Time Signature"
+msgstr "Verwijder tempo of maatsoort"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:602
+msgid "&Edit Item"
+msgstr "&Bewerk item"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:834
+msgid "%1 - Tempo and Time Signature Editor"
+msgstr "%1 - Tempo- en maatsoort-editor"
+
+#: ../src/gui/editors/guitar/GuitarChordEditorDialog.cpp:43
+msgid "Guitar Chord Editor"
+msgstr "Gitaarakkoord-editor"
+
+#: ../src/gui/editors/guitar/GuitarChordEditorDialog.cpp:51
+msgid "Start fret"
+msgstr "Beginfret"
+
+#: ../src/gui/editors/guitar/GuitarChordEditorDialog.cpp:58
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:51
+msgid "Root"
+msgstr "Stam"
+
+#: ../src/gui/editors/guitar/GuitarChordEditorDialog.cpp:62
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:55
+msgid "Extension"
+msgstr "Achtervoegsel"
+
+#: ../src/gui/editors/guitar/Fingering.cpp:118
+msgid "couldn't parse fingering '%1' in '%2'"
+msgstr "Kon vingerzetting '%1' in '%2' niet parsen"
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:45
+msgid "Guitar Chord Selector"
+msgstr "Akkoordkiezer"
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:64
+msgid "beginner"
+msgstr "Beginner"
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:65
+msgid "common"
+msgstr "Meest voorkomende"
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:66
+msgid "all"
+msgstr "Alle"
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:86
+msgid "Fingerings"
+msgstr "Vingerzettingen"
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:419
+msgid "couldn't open file '%1'"
+msgstr "Kon bestand '%1' niet openen"
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:428
+#, c-format
+msgid "couldn't parse chord dictionnary : %1"
+msgstr "Kon akkoordentabel niet lezen: %1"
+
+#: ../src/gui/editors/notation/NoteFontViewer.cpp:87
+#, c-format
+msgid "Note Font Viewer: %1"
+msgstr "Noten Lettertype Bekijken: %1"
+
+#: ../src/gui/editors/notation/NoteFontViewer.cpp:93
+msgid " Component: "
+msgstr " Onderdeel: "
+
+#: ../src/gui/editors/notation/NoteFontViewer.cpp:101
+msgid " View: "
+msgstr " Bekijk: "
+
+#: ../src/gui/editors/notation/NoteFontViewer.cpp:104
+msgid "Glyphs"
+msgstr "Glyphen"
+
+#: ../src/gui/editors/notation/NoteFontViewer.cpp:105
+msgid "Codes"
+msgstr "Codes"
+
+#: ../src/gui/editors/notation/NoteFontViewer.cpp:107
+msgid " Page: "
+msgstr " Pagina: "
+
+#: ../src/gui/editors/notation/ClefInserter.cpp:64
+#: ../src/gui/editors/notation/GuitarChordInserter.cpp:71
+#: ../src/gui/editors/notation/RestInserter.cpp:79
+#: ../src/gui/editors/notation/TextInserter.cpp:68
+msgid "Switch to Inserting Notes"
+msgstr "Wissel naar Invoegen Noten"
+
+#: ../src/gui/editors/notation/NotationView.cpp:522
+msgid "Close track headers"
+msgstr "Sluit spoorheaders"
+
+#: ../src/gui/editors/notation/NotationView.cpp:917
+msgid "Preparing to print..."
+msgstr "Voorbereiden op afdrukken..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:1516
+msgid "Note &Font"
+msgstr "Noten-&lettertype"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1539
+msgid "Si&ze"
+msgstr "Gro&otte"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1545
+msgid "Show Track Headers"
+msgstr "Toon spoorheaders"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1550
+msgid "S&pacing"
+msgstr "S&patiëring"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1572
+msgid "Du&ration Factor"
+msgstr "Duu&rfactor"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1598
+msgid "Note &Style"
+msgstr "Noten &Stijl"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1624
+msgid "Insert Rest"
+msgstr "Voeg Rust In"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1628
+msgid "Switch from Note to Rest"
+msgstr "Verander van Noot naar Rust"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1633
+msgid "Switch from Rest to Note"
+msgstr "Verander van Rust naar Noot"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1690
+msgid "No accidental"
+msgstr "Geen voorteken"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1691
+msgid "Follow previous accidental"
+msgstr "Volg vorig voorteken"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1692
+msgid "Sharp"
+msgstr "Kruis"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1693
+msgid "Flat"
+msgstr "Mol"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1694
+msgid "Natural"
+msgstr "Herstellingsteken"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1695
+msgid "Double sharp"
+msgstr "Dubbelkruis"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1696
+msgid "Double flat"
+msgstr "Dubbelmol"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1717
+msgid "&Treble Clef"
+msgstr "Vioolsleutel"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1724
+msgid "&Alto Clef"
+msgstr "&Altsleutel"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1731
+msgid "Te&nor Clef"
+msgstr "Te&norsleutel"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1738
+msgid "&Bass Clef"
+msgstr "&Bassleutel"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1745
+msgid "&Text"
+msgstr "&Tekst"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1751
+msgid "&Guitar Chord"
+msgstr "&Gitaarakkoord"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1784
+msgid "Select from Sta&rt"
+msgstr "Selecteren vanaf Sta&rt"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1788
+msgid "Select to &End"
+msgstr "Selecteer tot &Eind"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1792
+msgid "Select Whole St&aff"
+msgstr "Selecteer hele b&alk"
+
+#: ../src/commands/edit/CutAndCloseCommand.h:53
+#: ../src/gui/editors/notation/NotationView.cpp:1796
+msgid "C&ut and Close"
+msgstr "Knippen en &Sluiten"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1800
+msgid "Pa&ste..."
+msgstr "Pla&kken..."
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:122
+#: ../src/gui/editors/notation/NotationView.cpp:1808
+msgid "Move to Staff Above"
+msgstr "Naar bovenliggende notenbalk verplaatsen"
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:126
+#: ../src/gui/editors/notation/NotationView.cpp:1812
+msgid "Move to Staff Below"
+msgstr "Naar onderliggende notenbalk verplaatsen"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1826
+msgid "&Linear Layout"
+msgstr "&Lineaire layout"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1835
+msgid "&Continuous Page Layout"
+msgstr "&Doorlopende pagina-layout"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1844
+msgid "&Multiple Page Layout"
+msgstr "&Meerdere pagina-layout"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1854
+msgid "Show Ra&w Note Ruler"
+msgstr "Toon Ru&we noten-liniaal"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1862
+msgid "Show &Annotations"
+msgstr "Toon &Annotaties"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1866
+msgid "Show Lily&Pond Directives"
+msgstr "Toon Lily&Pond-directieven"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1870
+msgid "Open L&yric Editor"
+msgstr "Open &tekstenbewerker"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1912
+msgid "Trip&let Insert Mode"
+msgstr "Triool-invoegmodus"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1926
+msgid "Grace Insert Mode"
+msgstr "Voorslag-invoegmodus"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2180
+msgid "&Dump selected events to stderr"
+msgstr "&Dump geselecteerde gebeurtenissen op stderr"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2248
+msgid "Ma&ke Ornament..."
+msgstr "Maa&k versiering..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:2252
+msgid "Trigger &Ornament..."
+msgstr "Trigger versiering..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:2256
+msgid "Remove Ornament..."
+msgstr "Verwijder versiering..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:2261
+msgid "&None"
+msgstr "&Geen"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2289
+msgid "Convert Notation For..."
+msgstr "Notatie converteren voor..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:2298
+msgid "Show &Notes Toolbar"
+msgstr "Toon &notenwerkbalk"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2299
+msgid "Show &Rests Toolbar"
+msgstr "Toon &rustenwerkbalk"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2300
+msgid "Show &Accidentals Toolbar"
+msgstr "Toon &voortekens-werkbalk"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2301
+msgid "Show Cle&fs Toolbar"
+msgstr "Toon &sleutelwerkbalk"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2303
+msgid "Show &Marks Toolbar"
+msgstr "Toon &accentenwerkbalk"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2305
+msgid "Show &Group Toolbar"
+msgstr "Toon &groepenwerkbalk"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2307
+msgid "Show &Layout Toolbar"
+msgstr "Toon &layoutwerkbalk"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2311
+msgid "Show M&eta Toolbar"
+msgstr "Toon &meta-werkbalk"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2373
+msgid "Cursor &Up Staff"
+msgstr "Cursor balk om&hoog"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2377
+msgid "Cursor &Down Staff"
+msgstr "Cursor balk om&laag"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2381
+msgid "Cursor Pre&vious Segment"
+msgstr "Cursor v&orig segment"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2385
+msgid "Cursor Ne&xt Segment"
+msgstr "Cursor &volgend segment"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2475
+msgid "Push &Left"
+msgstr "Duw naar &links"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2479
+msgid "Push &Right"
+msgstr "Duw naar &rechts"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2483
+msgid "Push &Up"
+msgstr "Duw naar &boven"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2487
+msgid "Push &Down"
+msgstr "Duw naar &onder"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2491
+msgid "&Restore Positions"
+msgstr "&Herstel posities"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2495
+msgid "Make &Invisible"
+msgstr "Maak &Onzichtbaar"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2499
+msgid "Make &Visible"
+msgstr "Maak &Zichtbaar"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2503
+msgid "Toggle Dot"
+msgstr "Punt aan/uit"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2507
+#: ../src/gui/editors/notation/NotationView.cpp:2511
+msgid "Add Dot"
+msgstr "Voeg punt toe"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2570
+#, c-format
+msgid ""
+"_n: 1 pixel\n"
+"%n pixels"
+msgstr ""
+"1 pixel\n"
+"%n pixels"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2619
+msgid " Font: "
+msgstr " Lettertype: "
+
+#: ../src/gui/editors/notation/NotationView.cpp:2647
+msgid "Unknown font \"%1\", using default"
+msgstr "Onbekend lettertype \"%1\", standaard wordt gebruikt"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2655
+msgid " Size: "
+msgstr " Grootte: "
+
+#: ../src/gui/editors/notation/NotationView.cpp:2677
+msgid " Spacing: "
+msgstr "Spatiëring:"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2993
+#: ../src/gui/editors/notation/NotationView.cpp:3818
+msgid " Ready."
+msgstr " Klaar."
+
+#: ../src/gui/editors/notation/NotationView.cpp:2998
+msgid "Laying out score..."
+msgstr "Partituur opmaken..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:3011
+msgid "Laying out staff %1..."
+msgstr "Balk %1 opmaken..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:3020
+msgid "Reconciling staffs..."
+msgstr "Balken verenigen..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:3885
+msgid "Sizing and allocating canvas..."
+msgstr "Canvas uitmeten en toewijzen..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:4050
+msgid "note"
+msgstr "noot"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4050
+msgid "rest"
+msgstr "rust"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4211
+msgid "%1 - Segment Track #%2 - Notation"
+msgstr "%1 - Segmentspoor #%2 - Notatie"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4217
+msgid "%1 - All Segments - Notation"
+msgstr "%1 - Alle Segmenten - Notatie"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4222
+msgid ""
+"_n: %1 - Segment - Notation\n"
+"%1 - %n Segments - Notation"
+msgstr ""
+"%1 - Segment - Notatie\n"
+"%1 - %n Segmenten - Notatie"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4243
+msgid "Grace"
+msgstr "Voorslag"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4247
+#: ../src/gui/editors/notation/NotationView.cpp:4251
+#: ../src/gui/editors/notation/NotationView.cpp:4255
+msgid "%1 %2"
+msgstr "%1 %2"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4271
+msgid "Hidden annotations"
+msgstr "Verborgen annotaties"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4293
+msgid "Hidden LilyPond directives"
+msgstr "Verborgen LilyPond-directieven"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4326
+#, c-format
+msgid "Unknown spacing action %1"
+msgstr "Onbekende spatiëring actie %1"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4384
+#, c-format
+msgid "Unknown proportion action %1"
+msgstr "Onbekende proportie actie %1"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4431
+#, c-format
+msgid "Unknown font action %1"
+msgstr "Onbekende lettertype actie %1"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4449
+#, c-format
+msgid "Unknown font size %1"
+msgstr "Onbekende lettertype grootte %1"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4453
+#, c-format
+msgid "Unknown font size action %1"
+msgstr "Onbekende lettertype grootte actie %1"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4780
+msgid ""
+"The Restricted paste type requires enough empty space (containing only "
+"rests) at the paste position to hold all of the events to be pasted.\n"
+"Not enough space was found.\n"
+"If you want to paste anyway, consider using one of the other paste types "
+"from the \"Paste...\" option on the Edit menu. You can also change the "
+"default paste type to something other than Restricted if you wish."
+msgstr ""
+"Bij \"invoegen met restricties\" moet er genoeg lege ruimte zijn (met alleen "
+"rusten) op de inplak-plaats om alle in te plakken gebeurtenissen te kunnen "
+"bevatten. <br>Er is niet genoeg ruimte gevonden. <br> Als u toch hier wilt "
+"plakken, gebruik dan een van de andere plak-types uit de optie \"Plakken..."
+"\" in het menu Bewerken. u kunt desgewenst het standaard-plaktype wijzigen "
+"naar iets anders dan \"met restricties\"."
+
+#: ../src/gui/editors/notation/NotationView.cpp:4800
+msgid "Can't paste multiple Segments into one"
+msgstr "Kan niet meerdere Segmenten in elkaar plakken"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4828
+#: ../src/gui/editors/notation/NotationView.cpp:4877
+msgid "Couldn't paste at this point."
+msgstr "Kan niet plakken op dit punt."
+
+#: ../src/gui/editors/notation/NotationView.cpp:4896
+msgid "Move Events to Staff Above"
+msgstr "Verplaats gebeurtenissen naar bovenliggende notenbalk"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4924
+msgid "Move Events to Staff Below"
+msgstr "Verplaats gebeurtenissen naar onderliggende notenbalk"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5036
+msgid "Pushing selection left..."
+msgstr "Selectie naar links duwen..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5047
+msgid "Pushing selection right..."
+msgstr "Selectie naar rechts duwen..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5058
+msgid "Pushing selection up..."
+msgstr "Selectie naar boven duwen..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5069
+msgid "Pushing selection down..."
+msgstr "Selectie naar onder duwen..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5080
+msgid "Restoring computed positions..."
+msgstr "Berekende posities herstellen..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5089
+msgid "Making visible..."
+msgstr "Zichtbaar maken..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5098
+msgid "Making invisible..."
+msgstr "Onzichtbaar maken..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5185
+msgid "Beaming group..."
+msgstr "Noten groeperen..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5195
+msgid "Auto-beaming selection..."
+msgstr "Selectie auto-groeperen..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5205
+msgid "Breaking groups..."
+msgstr "Groepen losmaken..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5293
+msgid "Untupleting..."
+msgstr "Ont-multipletten"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5301
+msgid "Adding slur..."
+msgstr "Fraseringsboog toevoegen..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5302
+msgid "slur"
+msgstr "boog"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5307
+msgid "Adding phrasing slur..."
+msgstr "Fraseringsboog toevoegen..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5308
+msgid "phrasing slur"
+msgstr "fraseringsboog"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5313
+msgid "Adding glissando..."
+msgstr "Glissando toevoegen..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5314
+msgid "glissando"
+msgstr "glissando"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5319
+msgid "Adding crescendo..."
+msgstr "Toevoegen crescendo..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5320
+#: ../src/gui/editors/notation/NotationView.cpp:5326
+msgid "dynamic"
+msgstr "dynamiek"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5325
+msgid "Adding decrescendo..."
+msgstr "Toevoegen descrescendo..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5331
+#: ../src/gui/editors/notation/NotationView.cpp:5337
+#: ../src/gui/editors/notation/NotationView.cpp:5343
+#: ../src/gui/editors/notation/NotationView.cpp:5349
+msgid "Adding octave..."
+msgstr "Octava toevoegen..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5332
+#: ../src/gui/editors/notation/NotationView.cpp:5338
+#: ../src/gui/editors/notation/NotationView.cpp:5344
+#: ../src/gui/editors/notation/NotationView.cpp:5350
+msgid "ottava"
+msgstr "ottava"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5366
+msgid "Can't add overlapping %1 indications"
+msgstr "Kan geen overlappende aanduidingen %1 toevoegen"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5375
+msgid "Making chord..."
+msgstr "Maken akkoord..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5387
+msgid "Normalizing rests..."
+msgstr "Normaliseren rusten..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5397
+msgid "Collapsing rests..."
+msgstr "Inklappen rusten..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5417
+msgid "Tying notes..."
+msgstr "Binden noten..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5427
+msgid "Untying notes..."
+msgstr "Losmaken noten..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5437
+msgid "Making notes viable..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5447
+msgid "Removing counterpoint..."
+msgstr "Fermate verwijderen..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5457
+msgid "Pointing stems up..."
+msgstr "Stokken omhoog zetten..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5467
+msgid "Pointing stems down..."
+msgstr "Stokken omlaag zetten..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5478
+msgid "Restoring computed stem directions..."
+msgstr "Berekende stokrichtingen herstellen..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5488
+#: ../src/gui/editors/notation/NotationView.cpp:5498
+msgid "Positioning slurs..."
+msgstr "Bogen positioneren..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5509
+msgid "Restoring slur positions..."
+msgstr "Boogposities herstellen..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5519
+#: ../src/gui/editors/notation/NotationView.cpp:5529
+msgid "Positioning ties..."
+msgstr "Bogen positioneren..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5540
+msgid "Restoring tie positions..."
+msgstr "Boogposities herstellen..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5550
+msgid "Fixing notation quantization..."
+msgstr "Notatie-quantisatie fixeren..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5560
+msgid "Removing notation quantization..."
+msgstr "Notatie-quantisatie verwijderen..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5577
+msgid "Changing to %1 style..."
+msgstr "Veranderen in %1 stijl..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5585
+#, c-format
+msgid "Unknown style action %1"
+msgstr "Onbekende stijl actie %1"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5598
+#: ../src/gui/editors/notation/NotationView.cpp:5639
+#: ../src/gui/editors/notation/NotationView.cpp:5695
+msgid "No note duration selected"
+msgstr "Geen nootduur geselecteerd"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5660
+msgid "No rest duration selected"
+msgstr "Geen rustduur geselecteerd"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5746
+msgid "No note or rest duration selected"
+msgstr "Geen noot of rustduur geselecteerd"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5757
+#: ../src/gui/editors/notation/NotationView.cpp:5768
+#: ../src/gui/editors/notation/NotationView.cpp:5779
+#: ../src/gui/editors/notation/NotationView.cpp:5790
+#: ../src/gui/editors/notation/NotationView.cpp:5801
+#: ../src/gui/editors/notation/NotationView.cpp:5812
+#: ../src/gui/editors/notation/NotationView.cpp:5823
+msgid "Forcing accidentals..."
+msgstr "Voortekens forceren..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5834
+msgid "Restoring accidentals..."
+msgstr "Voortekens herstellen..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5845
+msgid "Showing cautionary accidentals..."
+msgstr "Waarschuwende voortekens tonen..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5855
+msgid "Cancelling cautionary accidentals..."
+msgstr "Waarschuwende -voortekens verwijderen..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5884
+msgid "Interpreting selection..."
+msgstr "Selectie interpreteren..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5896
+msgid "Setting note durations..."
+msgstr "Nootduren instellen..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5904
+#: ../src/gui/editors/notation/NotationView.cpp:5912
+msgid "Adding dot..."
+msgstr "Punt toevoegen..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5934
+msgid "Text: "
+msgstr "Tekst: "
+
+#: ../src/gui/editors/notation/NotationView.cpp:5948
+msgid "Fingering: "
+msgstr "Vingerzetting:"
+
+#: ../src/gui/editors/notation/NotationView.cpp:6036
+msgid "Ornament track %1 bar %2"
+msgstr "Versiering spoor %1 maat %2"
+
+#: ../src/gui/editors/notation/NotationView.cpp:6038
+#, c-format
+msgid "Ornament bar %1"
+msgstr "Versiering maat %1 "
+
+#: ../src/gui/editors/notation/NotationView.cpp:6098
+msgid "Remove Ornaments"
+msgstr "Verwijder versieringen"
+
+#: ../src/gui/editors/notation/NotationView.cpp:6145
+msgid "Estimated key signature shown"
+msgstr "Geschatte maatsoort wordt getoond"
+
+#: ../src/gui/editors/notation/NotationStaff.cpp:1249
+#: ../src/gui/editors/notation/NotationView.cpp:6202
+msgid "Sustain"
+msgstr "Sustain"
+
+#: ../src/gui/editors/notation/NotationView.cpp:6218
+msgid ""
+"There is no sustain controller defined for this device.\n"
+"Please ensure the device is configured correctly in the Manage MIDI Devices "
+"dialog in the main window."
+msgstr ""
+"Er is geen sustain-controller gedefinieerd voor dit apparaat.\n"
+"Controleer of het apparaat juist is geconfigureerd in het dialoog 'Beheer "
+"MIDI-apparaten' in het hoofdvenster."
+
+#: ../src/gui/editors/notation/NotationView.cpp:7250
+msgid "Can't insert note: No note duration selected"
+msgstr "Kan noot niet invoegen: Geen noot lengte geselecteerd"
+
+#: ../src/gui/editors/notation/NotationEraser.cpp:61
+#: ../src/gui/editors/notation/NotationSelector.cpp:83
+msgid "Switch to Insert Tool"
+msgstr "Wissel naar Invoegen"
+
+#: ../src/gui/editors/notation/NotePixmapFactory.cpp:2303
+#: ../src/gui/editors/notation/NotePixmapFactory.cpp:2347
+msgid "..."
+msgstr "..."
+
+#: ../src/gui/editors/notation/NoteFontFactory.cpp:200
+msgid "Can't obtain a default font -- no fonts found"
+msgstr "Kan standaardlettertype niet verkrijgen -- geen lettertypes gevonden"
+
+#: ../src/gui/editors/notation/NoteFontMap.cpp:52
+#: ../src/gui/general/PresetGroup.cpp:49
+msgid "unknown error"
+msgstr "Onbekende fout"
+
+#: ../src/gui/editors/notation/NoteFontMap.cpp:78
+msgid "Can't open font mapping file %1 or %2"
+msgstr "Kan font mapping bestand %1 of %2 niet openen"
+
+#: ../src/gui/editors/notation/NoteFontMap.cpp:82
+#, c-format
+msgid "Can't open font mapping file %1"
+msgstr "Kan font mapping bestand %1 niet openen"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:52
+msgid "%1-dotted-%2"
+msgstr "%1-gepuncteerde-%2"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:54
+msgid "%1-dotted %2"
+msgstr "%1-gepuncteerde %2"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:57
+#, c-format
+msgid "dotted-%1"
+msgstr "%1-punt"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:59
+#, c-format
+msgid "dotted %1"
+msgstr "%1 met punt"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:83
+msgid "sixty-fourth note"
+msgstr "vierenzestigste noot"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:83
+msgid "thirty-second note"
+msgstr "tweeendertigste noot"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:84
+msgid "sixteenth note"
+msgstr "zestiende noot"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:84
+msgid "eighth note"
+msgstr "achtste noot"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:85
+msgid "quarter note"
+msgstr "kwartnoot"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:85
+msgid "half note"
+msgstr "halve noot"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:86
+msgid "whole note"
+msgstr "hele noot"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:86
+msgid "double whole note"
+msgstr "brevis"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:89
+msgid "sixty-fourth notes"
+msgstr "vierenzestigste noten"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:89
+msgid "thirty-second notes"
+msgstr "tweeendertigste noten"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:90
+msgid "sixteenth notes"
+msgstr "zestiende noten"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:90
+msgid "eighth notes"
+msgstr "achtste noten"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:91
+msgid "quarter notes"
+msgstr "kwartnoten"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:91
+msgid "half notes"
+msgstr "halve noten"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:92
+msgid "whole notes"
+msgstr "hele noten"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:92
+msgid "double whole notes"
+msgstr "dubbele hele noten"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:96
+#: ../src/gui/editors/notation/NotationStrings.cpp:154
+msgid "%1 triplets"
+msgstr "%1 triolen"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:100
+#: ../src/gui/editors/notation/NotationStrings.cpp:158
+msgid "%1 triplet"
+msgstr "%1 triool"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:143
+msgid "64th"
+msgstr "64e"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:143
+msgid "32nd"
+msgstr "32e"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:143
+msgid "16th"
+msgstr "16e"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:143
+msgid "8th"
+msgstr "8e"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:144
+msgid "quarter"
+msgstr "kwart"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:144
+msgid "half"
+msgstr "half"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:144
+msgid "whole"
+msgstr "heel"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:145
+msgid "double whole"
+msgstr "brevis"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:148
+msgid "64ths"
+msgstr "64sten"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:148
+msgid "32nds"
+msgstr "32sten"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:148
+msgid "16ths"
+msgstr "16den"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:148
+msgid "8ths"
+msgstr "8sten"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:149
+msgid "quarters"
+msgstr "kwarten"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:149
+msgid "halves"
+msgstr "halven"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:149
+msgid "wholes"
+msgstr "helen"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:150
+msgid "double wholes"
+msgstr "breves"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:278
+msgid "%1 ticks"
+msgstr "%1 tikken"
+
+#: ../src/gui/editors/notation/FontViewFrame.cpp:100
+#, c-format
+msgid "Error: Unable to match font name %1"
+msgstr "Error: kan lettertypenaam %1 niet matchen"
+
+#: ../src/gui/editors/notation/FontViewFrame.cpp:108
+msgid "Warning: No good match for font name %1 (best is %2)"
+msgstr "Let op: geen goede match voor lettertypenaam %1 (%2 is de beste)"
+
+#: ../src/gui/editors/notation/FontViewFrame.cpp:116
+#, c-format
+msgid "Error: Unable to open best-match font %1"
+msgstr "Fout: Kan best-overeenkomende lettertype %1 niet openen"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:113
+msgid "Track %1 : \"%2\""
+msgstr "Spoor %1 : \"%2\""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:119
+#, c-format
+msgid ""
+"\n"
+"Notate for: %1"
+msgstr ""
+"\n"
+"Noteer voor: %1"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:121
+msgid "normal"
+msgstr "normaal"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:124
+msgid "small"
+msgstr "klein"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:127
+msgid "tiny"
+msgstr "zeer klein"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:131
+msgid "--"
+msgstr "--"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:156
+msgid ""
+"\n"
+"Size: %1, Bracket: %2 "
+msgstr ""
+"\n"
+"Grootte: %1, groepeerhaken: %2"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:183
+msgid ""
+"\n"
+"bars [%1-%2] in %3 (tr=%4) : \"%5\""
+msgstr ""
+"\n"
+"maten [%1-%2] in %3 (tr=%4) : \"%5\""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:190
+msgid ""
+"\n"
+"bars [%1-%2] (tr=%3) : \"%4\""
+msgstr ""
+"\n"
+"maten [%1-%2] (tr=%3) : \"%4\""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:240
+msgid "C#"
+msgstr "C#"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:242
+msgid "Eb"
+msgstr "Eb"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:245
+msgid "F#"
+msgstr "F#"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:247
+msgid "G#"
+msgstr "G#"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:249
+msgid "Bb"
+msgstr "Bb"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:352
+msgid "%1: %2"
+msgstr "%1: %2"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:355
+#, c-format
+msgid " in %1"
+msgstr " in %1"
+
+#: ../src/gui/editors/notation/NotationStaff.cpp:452
+msgid "Rendering staff %1..."
+msgstr "Balk %1 renderen..."
+
+#: ../src/gui/editors/notation/NotationStaff.cpp:515
+msgid "Rendering notes on staff %1..."
+msgstr "Noten op balk %1 renderen..."
+
+#: ../src/gui/editors/notation/NotationStaff.cpp:583
+msgid "Positioning staff %1..."
+msgstr "Balk %1 positioneren..."
+
+#: ../src/gui/editors/notation/NotationSelectionPaster.cpp:85
+msgid "Ready."
+msgstr "Klaar."
+
+#: ../src/gui/editors/notation/RestInserter.cpp:62
+msgid "Dotted rest"
+msgstr "Rust met punt"
+
+#: ../src/gui/editors/notation/NoteStyleFileReader.cpp:57
+#, c-format
+msgid "Can't open style file %1"
+msgstr "Kan stijl bestand %1 niet openen"
+
+#: ../src/gui/editors/notation/NoteStyleFileReader.cpp:92
+msgid "type is a required attribute of note"
+msgstr "type is een vereiste eigenschap van noot"
+
+#: ../src/gui/editors/notation/NoteStyleFileReader.cpp:101
+#, c-format
+msgid "Unrecognised note name %1"
+msgstr "Onbekende noot naam %1"
+
+#: ../src/gui/editors/notation/NoteStyleFileReader.cpp:108
+msgid "global element must precede note elements"
+msgstr "globale elementen moeten notenelementen voorafgaan"
+
+#: ../src/gui/editors/notation/NoteStyleFileReader.cpp:137
+msgid ""
+"global and note elements may have shape or charname attribute, but not both"
+msgstr ""
+"globale en notenelementen mogen vorm of charname eigenschap hebben, maar "
+"niet beiden"
+
+#: ../src/gui/editors/notation/NotationVLayout.cpp:493
+msgid ""
+"Spanned note at %1 has no HEIGHT_ON_STAFF property!\n"
+"This is a bug (the program would previously have crashed by now)"
+msgstr ""
+"Gespannen noot op %1 heeft geen HEIGHT_ON_STAFF eigenschap!\n"
+"Dit is een bug (het programma zou anders nu gecrashed zijn)"
+
+#: ../src/gui/editors/notation/NoteInserter.cpp:82
+msgid "Auto-Beam when appropriate"
+msgstr "Auto-groeperen waar gepast"
+
+#: ../src/gui/editors/notation/NoteInserter.cpp:103
+msgid "Dotted note"
+msgstr "Noot met punt"
+
+#: ../src/gui/editors/notation/NoteInserter.cpp:120
+msgid "Switch to Inserting Rests"
+msgstr "Wissel naar Invoegen Rusten"
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:98
+msgid "Collapse Rests"
+msgstr "&Klap Rusten In"
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:102
+msgid "Respell as Flat"
+msgstr "Forceer mol"
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:106
+msgid "Respell as Sharp"
+msgstr "Forceer kruis"
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:110
+msgid "Respell as Natural"
+msgstr "Forceer herstellingsteken"
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:114
+msgid "Collapse Notes"
+msgstr "&Klap noten In"
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:130
+msgid "Make Invisible"
+msgstr "Maak Onzichtbaar"
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:134
+msgid "Make Visible"
+msgstr "Maak Zichtbaar"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:129
+msgid "Event filters"
+msgstr "Gebeurtenisfilters"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:138
+msgid "Rest"
+msgstr "Rust"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:139
+msgid "Indication"
+msgstr "Indicatie"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:141
+msgid "Other"
+msgstr "Anders"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:161
+msgid "Triggered Segment Properties"
+msgstr "Eigenschappen getriggerde segmenten"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:166
+msgid "Label: "
+msgstr "Label: "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:176
+msgid "Base pitch: "
+msgstr "Basistoonhoogte:"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:183
+msgid "Base velocity: "
+msgstr "Basissnelheid"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:246
+msgid "Duration "
+msgstr "Duur "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:247
+msgid "Event Type "
+msgstr "Gebeurtenis Type "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:248
+msgid "Pitch "
+msgstr "Toonhoogte "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:249
+msgid "Velocity "
+msgstr "Snelheid "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:250
+msgid "Type (Data1) "
+msgstr "Type (Data1) "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:251
+msgid "Value (Data2) "
+msgstr "Waarde (Data2) "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:461
+msgid "(group %1) "
+msgstr "(groep %1) "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:519
+msgid "<no events at this filter level>"
+msgstr "<geen gebeurtenissen op dit filter niveau>"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:521
+msgid "<no events>"
+msgstr "<geen gebeurtenissen>"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:696
+msgid "Segment label"
+msgstr "Segmentlabel"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:696
+msgid "Label:"
+msgstr "Label:"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1123
+msgid "&Insert Event"
+msgstr "Gebeurtenis &invoegen"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1130
+msgid "&Delete Event"
+msgstr "Gebeurtenis &verwijderen"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1137
+msgid "&Edit Event"
+msgstr "Gebeurtenis &bewerken"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1144
+msgid "&Advanced Event Editor"
+msgstr "&Geavanceerde gebeurtenis-editor"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1518
+msgid "Open in Event Editor"
+msgstr "Openen in gebeurtenis-editor"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1519
+msgid "Open in Expert Event Editor"
+msgstr "Openen in expert-gebeurtenis-editor"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1577
+msgid "%1 - Triggered Segment: %2"
+msgstr "%1 - Getriggerd segment: %2"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1592
+msgid "%1 - Segment Track #%2 - Event List"
+msgstr "%1 - Segmentspoor #%2 - Gebeurtenissenlijst"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1598
+msgid "%1 - %2 Segments - Event List"
+msgstr "%1 - %2 Segmenten - Gebeurtenissenlijst"
+
+#: ../src/gui/rulers/TempoRuler.cpp:131
+msgid "Insert Tempo Change at Playback Position"
+msgstr "Voeg tempoverandering In op afspeelpositie"
+
+#: ../src/gui/rulers/TempoRuler.cpp:136
+msgid "Delete Tempo Change"
+msgstr "Verwijder tempoverandering"
+
+#: ../src/gui/rulers/TempoRuler.cpp:140
+msgid "Ramp Tempo to Next Tempo"
+msgstr "Tempo verloopt naar volgend tempo"
+
+#: ../src/gui/rulers/TempoRuler.cpp:144
+msgid "Un-Ramp Tempo"
+msgstr "Tempoverloop opheffen"
+
+#: ../src/gui/rulers/TempoRuler.cpp:149
+msgid "Edit Tempo..."
+msgstr "Bewerk tempo..."
+
+#: ../src/gui/rulers/TempoRuler.cpp:153
+msgid "Edit Time Signature..."
+msgstr "Bewerk maatsoort..."
+
+#: ../src/gui/rulers/TempoRuler.cpp:588
+msgid "%1.%2%3 (%4.%5%6 bpm)"
+msgstr "%1.%2%3 (%4.%5%6 bpm)"
+
+#: ../src/gui/rulers/TempoRuler.cpp:596
+msgid "%1.%2%3 bpm"
+msgstr "%1.%2%3 bpm"
+
+#: ../src/gui/rulers/TempoRuler.cpp:604
+msgid "%1 - %2.%3%4"
+msgstr "%1 - %2.%3%4"
+
+#: ../src/gui/rulers/ControlRulerEventInsertCommand.cpp:36
+msgid "Insert Controller Event"
+msgstr "Voeg Controller Gebeurtenis In"
+
+#: ../src/gui/rulers/ControlChangeCommand.cpp:35
+msgid "Control Change"
+msgstr "Controller Veranderen"
+
+#: ../src/gui/rulers/PropertyViewRuler.cpp:72
+msgid "%1 controller"
+msgstr "%1-controller"
+
+#: ../src/gui/rulers/RawNoteRuler.cpp:453
+msgid "Track #%1, Segment \"%2\" (runtime id %3)"
+msgstr "Spoor #%1, Segment \"%2\" (runtime id %3)"
+
+#: ../src/gui/rulers/MarkerRuler.cpp:100
+msgid "Insert Marker"
+msgstr "Voeg accent in"
+
+#: ../src/gui/rulers/MarkerRuler.cpp:104
+msgid "Insert Marker at Playback Position"
+msgstr "Voeg marker in op afspeelpositie"
+
+#: ../src/gui/rulers/MarkerRuler.cpp:109
+msgid "Delete Marker"
+msgstr "Verwijder accent"
+
+#: ../src/gui/rulers/MarkerRuler.cpp:114
+msgid "Edit Marker..."
+msgstr "Bewerk accent..."
+
+#: ../src/gui/rulers/MarkerRuler.cpp:119
+msgid ""
+"Click on a marker to move the playback pointer.\n"
+"Shift-click to set a range between markers.\n"
+"Double-click to open the marker editor."
+msgstr ""
+"Klik op een marker om de afspeelpointer te bewegen\n"
+"Shift-klik om een bereik tussen markers in te stellen\n"
+"Dubbelklik om de marker-editor te openen."
+
+#: ../src/gui/rulers/ChordNameRuler.cpp:97
+msgid ""
+"Chord name ruler.\n"
+"Turn it on and off from the Settings->Rulers menu."
+msgstr ""
+"Akkoordnaam-liniaal.\n"
+"Schakel in en uit via menu Instellingen->linialen."
+
+#: ../src/gui/rulers/ControlRulerEventEraseCommand.cpp:37
+msgid "Erase Controller Event(s)"
+msgstr "Wis Controller Gebeurtenis(sen)"
+
+#: ../src/gui/general/EditView.cpp:901
+#: ../src/gui/rulers/ControllerEventsRuler.cpp:188
+msgid "Unsupported Event Type"
+msgstr "Niet-ondersteund gebeurtenistype:"
+
+#: ../src/gui/rulers/ControllerEventsRuler.cpp:203
+msgid "Controller Events"
+msgstr "Controller Gebeurtenissen"
+
+#: ../src/gui/rulers/ControllerEventsRuler.cpp:278
+msgid "Controller Event Number"
+msgstr "Controller Gebeurtenis Nummer"
+
+#: ../src/gui/rulers/ControllerEventsRuler.cpp:471
+msgid "Add line of controllers"
+msgstr "Voeg regel van controllers toe"
+
+#: ../src/gui/rulers/LoopRuler.cpp:89
+msgid ""
+"Click and drag to move the playback pointer.\n"
+"Shift-click and drag to set a range for looping or editing.\n"
+"Shift-click to clear the loop or range.\n"
+"Double-click to start playback."
+msgstr ""
+"Klik links om de afspeelaanwijzer te positioneren.\n"
+"Shift-klik+slepen om selectie te maken voor wijzigen of herhaald afspelen.\n"
+"Shift-klik om de selectie of loop te wissen.\n"
+"Dubbelklik om afspelen te starten."
+
+#: ../src/gui/general/EditViewBase.cpp:228
+msgid "Set Segment Start Time..."
+msgstr "Starttijd segment instellen..."
+
+#: ../src/gui/general/EditViewBase.cpp:232
+msgid "Set Segment Duration..."
+msgstr "Segmentduur instellen..."
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:56
+msgid "Load track parameters preset"
+msgstr "Laad spoorparameters preset"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:62
+msgid "Convert notation for..."
+msgstr "Notatie converteren voor..."
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:86
+msgid "Select preset track parameters for:"
+msgstr "Selecteer preset spoorparameters voor:"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:87
+msgid "Create appropriate notation for:"
+msgstr "Creëer geschikte notatie voor:"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:89
+msgid "Category"
+msgstr "Categorie:"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:95
+msgid "Player Ability"
+msgstr "Vaardigheid v/d speler"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:97
+msgid "Amateur"
+msgstr "Amateur"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:98
+msgid "Professional"
+msgstr "Professional"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:104
+msgid "Only selected segments"
+msgstr "Alleen geselecteerde segmenten"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:106
+msgid "All segments in this track"
+msgstr "Alle segmenten op dit spoor"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:111
+msgid "Only for new segments"
+msgstr "Alleen voor nieuwe segmenten"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:113
+msgid "Convert existing segments"
+msgstr "Converteer bestaande segmenten"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:39
+#, c-format
+msgid "C%1"
+msgstr "C%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:39
+#, c-format
+msgid "C#%1"
+msgstr "C#%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:39
+#, c-format
+msgid "D%1"
+msgstr "D%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:39
+#, c-format
+msgid "D#%1"
+msgstr "D#%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:40
+#, c-format
+msgid "E%1"
+msgstr "E%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:40
+#, c-format
+msgid "F%1"
+msgstr "F%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:40
+#, c-format
+msgid "F#%1"
+msgstr "F#%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:40
+#, c-format
+msgid "G%1"
+msgstr "G%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:41
+#, c-format
+msgid "G#%1"
+msgstr "G#%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:41
+#, c-format
+msgid "A%1"
+msgstr "A%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:41
+#, c-format
+msgid "A#%1"
+msgstr "A#%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:41
+#, c-format
+msgid "B%1"
+msgstr "B%1"
+
+#: ../src/gui/general/PresetGroup.cpp:95
+#, c-format
+msgid "Can't open preset file %1"
+msgstr "Kan preset-bestand %1 niet openen"
+
+#: ../src/gui/general/EditView.cpp:744
+msgid "&Halve Durations"
+msgstr "&Halveer lengte"
+
+#: ../src/gui/general/EditView.cpp:748
+msgid "&Double Durations"
+msgstr "&Dubbele lengte"
+
+#: ../src/gui/general/EditView.cpp:806
+msgid "Show Velocity Property Ruler"
+msgstr "Toon Snelheid Eigenschap Lineaal"
+
+#: ../src/gui/general/EditView.cpp:825
+msgid "Insert item"
+msgstr "Voeg item in"
+
+#: ../src/gui/general/EditView.cpp:831
+msgid "Erase selected items"
+msgstr "Wis geselecteerde items"
+
+#: ../src/gui/general/EditView.cpp:835
+msgid "Clear ruler"
+msgstr "Maak liniaal leeg"
+
+#: ../src/gui/general/EditView.cpp:839
+msgid "Insert line of controllers"
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:843
+msgid "Flip forward"
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:847
+msgid "Flip backwards"
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:851
+msgid "Draw property line"
+msgstr "Teken eigenschappenlijn"
+
+#: ../src/gui/general/EditView.cpp:855
+msgid "Select all property values"
+msgstr "Selecteer alle eigenschapswaarden"
+
+#: ../src/gui/general/EditView.cpp:894
+msgid "%1 Controller %2 %3"
+msgstr "%1 Controller %2 %3"
+
+#: ../src/gui/general/EditView.cpp:1066
+msgid "I"
+msgstr "I"
+
+#: ../src/gui/general/EditView.cpp:1066
+msgid "II"
+msgstr "II"
+
+#: ../src/gui/general/EditView.cpp:1066
+msgid "III"
+msgstr "III"
+
+#: ../src/gui/general/EditView.cpp:1066
+msgid "IV"
+msgstr "IV"
+
+#: ../src/gui/general/EditView.cpp:1067
+msgid "V"
+msgstr "V"
+
+#: ../src/gui/general/EditView.cpp:1067
+msgid "VI"
+msgstr "VI"
+
+#: ../src/gui/general/EditView.cpp:1067
+msgid "VII"
+msgstr "VII"
+
+#: ../src/gui/general/EditView.cpp:1067
+msgid "VIII"
+msgstr "VIII"
+
+#: ../src/gui/general/EditView.cpp:1069
+msgid "%1 flat"
+msgstr "%1 mol"
+
+#: ../src/gui/general/EditView.cpp:1070
+msgid "%1 sharp"
+msgstr "%1 kruis"
+
+#: ../src/gui/general/EditView.cpp:1085
+msgid "&Insert Note"
+msgstr "&Voeg Noot In"
+
+#: ../src/gui/general/EditView.cpp:1091
+msgid "&Upper Octave"
+msgstr "Octaaf Om&hoog"
+
+#: ../src/gui/general/EditView.cpp:1096
+msgid "&Lower Octave"
+msgstr "Octaaf Om&laag"
+
+#: ../src/gui/general/EditView.cpp:1268
+msgid "Estimated time signature shown"
+msgstr "Geschatte maatsoort getoond"
+
+#: ../src/gui/general/EditView.cpp:1431
+msgid "Halving durations..."
+msgstr "Lengtes halveren..."
+
+#: ../src/gui/general/EditView.cpp:1445
+msgid "Doubling durations..."
+msgstr "Lengtes verdubbelen"
+
+#: ../src/gui/general/EditView.cpp:1469
+msgid "Rescaling..."
+msgstr "&Herschalen..."
+
+#: ../src/gui/general/EditView.cpp:1489
+msgid "By number of semitones: "
+msgstr "Per aantal halve toonsafstanden:"
+
+#: ../src/gui/general/EditView.cpp:1496 ../src/gui/general/EditView.cpp:1518
+msgid "Transposing..."
+msgstr "Transponeren..."
+
+#: ../src/gui/general/EditView.cpp:1536
+msgid "Transposing up one semitone..."
+msgstr "Een semitoon omhoog transponeren..."
+
+#: ../src/gui/general/EditView.cpp:1545
+msgid "Transposing up one octave..."
+msgstr "Een octaaf omhoog transponeren..."
+
+#: ../src/gui/general/EditView.cpp:1554
+msgid "Transposing down one semitone..."
+msgstr "Een semitoon omlaag transponeren..."
+
+#: ../src/gui/general/EditView.cpp:1563
+msgid "Transposing down one octave..."
+msgstr "Een octaaf omlaag transponeren..."
+
+#: ../src/gui/general/EditView.cpp:1575
+msgid "Inverting..."
+msgstr "Inverteren..."
+
+#: ../src/gui/general/EditView.cpp:1587
+msgid "Retrograding..."
+msgstr "Retrograderen..."
+
+#: ../src/gui/general/EditView.cpp:1599
+msgid "Retrograde inverting..."
+msgstr "Retrograde inverteren..."
+
+#: ../src/gui/general/EditView.cpp:1608
+msgid "Jogging left..."
+msgstr "Naar links schuiven..."
+
+#: ../src/gui/general/EditView.cpp:1623
+msgid "Jogging right..."
+msgstr "Naar rechts schuiven..."
+
+#: ../src/sound/AudioFileManager.cpp:660
+#, c-format
+msgid "Downloading file %1"
+msgstr "Bestand %1 downloaden"
+
+#: ../src/sound/AudioFileManager.cpp:735
+msgid "Converting audio file..."
+msgstr "Audiobestand converteren..."
+
+#: ../src/sound/AudioFileManager.cpp:737
+msgid "Resampling audio file..."
+msgstr "Audiobestand her-samplen..."
+
+#: ../src/sound/AudioFileManager.cpp:739
+msgid "Converting and resampling audio file..."
+msgstr "Audiobestand converteren en hersamplen..."
+
+#: ../src/sound/AudioFileManager.cpp:741
+msgid "Importing audio file..."
+msgstr "Audiobestand importeren..."
+
+#: ../src/sound/AudioFileManager.cpp:794
+msgid "Failed to convert or resample audio file on import"
+msgstr "Converteren of her-samplen mislukt bij importeren van audiobestand"
+
+#: ../src/sequencer/main.cpp:46 ../src/sequencer/main.cpp:86
+msgid "RosegardenSequencer"
+msgstr "RosegardenSequencer"
+
+#: ../src/sequencer/main.cpp:54
+msgid "JACK playback and capture ports"
+msgstr "JACK afspeel- en opnamepoorten"
+
+#: ../src/commands/segment/SegmentSyncCommand.cpp:38
+#: ../src/commands/segment/SegmentSyncCommand.cpp:44
+#: ../src/commands/segment/SegmentSyncCommand.cpp:55
+#: ../src/commands/segment/SegmentSyncCommand.cpp:63
+msgid "Sync segment parameters"
+msgstr "Sync segmentparameters"
+
+#: ../src/commands/segment/RenameTrackCommand.h:52
+msgid "Rename Track"
+msgstr "Hernoem Spoor"
+
+#: ../src/commands/segment/SegmentRepeatToCopyCommand.cpp:39
+msgid "Turn Repeats into Copies"
+msgstr "Zet herhalingen om in kopieën"
+
+#: ../src/commands/segment/SegmentTransposeCommand.cpp:36
+#: ../src/commands/segment/SegmentTransposeCommand.cpp:42
+msgid "Change segment transposition"
+msgstr "Verander segmenttranspositie"
+
+#: ../src/commands/edit/RescaleCommand.h:50
+#: ../src/commands/segment/AudioSegmentRescaleCommand.h:62
+#: ../src/commands/segment/SegmentRescaleCommand.h:58
+msgid "Stretch or S&quash..."
+msgstr "&Oprekken of samenpersen..."
+
+#: ../src/commands/segment/SegmentLabelCommand.h:52
+msgid "Re&label..."
+msgstr "&Herbenoem..."
+
+#: ../src/commands/segment/AudioSegmentResizeFromStartCommand.cpp:39
+#: ../src/commands/segment/SegmentResizeFromStartCommand.cpp:39
+msgid "Resize Segment"
+msgstr "Verander segmentgrootte"
+
+#: ../src/commands/segment/RemoveTempoChangeCommand.h:58
+msgid "Remove &Tempo Change..."
+msgstr "Verwijder &Tempoverandering..."
+
+#: ../src/commands/segment/SegmentEraseCommand.cpp:40
+#: ../src/commands/segment/SegmentEraseCommand.cpp:52
+msgid "Erase Segment"
+msgstr "Wis segment"
+
+#: ../src/commands/segment/AudioSegmentRescaleCommand.cpp:126
+#: ../src/commands/segment/SegmentRescaleCommand.cpp:102
+msgid "(rescaled)"
+msgstr "(herschaald)"
+
+#: ../src/commands/segment/AudioSegmentRescaleCommand.cpp:127
+#: ../src/commands/segment/SegmentRescaleCommand.cpp:105
+msgid "%1 (rescaled)"
+msgstr "%1 (herschaald)"
+
+#: ../src/commands/segment/PasteToTriggerSegmentCommand.cpp:47
+msgid "Paste as New Triggered Segment"
+msgstr "Plak als nieuw getriggerd segment"
+
+#: ../src/commands/segment/SegmentColourMapCommand.h:52
+msgid "Change Segment Color Map..."
+msgstr "Verander segment-kleuren..."
+
+#: ../src/commands/segment/SegmentQuickCopyCommand.h:55
+msgid "Quick-Copy Segment"
+msgstr "Segment snelkopiëren"
+
+#: ../src/commands/segment/AudioSegmentSplitCommand.cpp:42
+msgid "Split Audio Segment"
+msgstr "Splits audiosegment"
+
+#: ../src/commands/segment/AudioSegmentSplitCommand.cpp:103
+#: ../src/commands/segment/SegmentSplitCommand.cpp:135
+msgid " (split)"
+msgstr "(opsplitsen)"
+
+#: ../src/commands/segment/AudioSegmentSplitCommand.cpp:104
+#: ../src/commands/segment/SegmentSplitByRecordingSrcCommand.cpp:120
+#: ../src/commands/segment/SegmentSplitByRecordingSrcCommand.cpp:122
+#: ../src/commands/segment/SegmentSplitCommand.cpp:136
+msgid "%1 (split)"
+msgstr "%1 (opsplitsen)"
+
+#: ../src/commands/segment/SegmentLabelCommand.cpp:40
+msgid "Label Segments"
+msgstr "Benoem segmenten"
+
+#: ../src/commands/segment/OpenOrCloseRangeCommand.cpp:43
+msgid "Open or Close Range"
+msgstr "Open of sluit bereik"
+
+#: ../src/commands/edit/TransposeCommand.h:55
+#: ../src/commands/segment/SegmentTransposeCommand.h:54
+msgid "Transpose by &Interval..."
+msgstr "Transponeren per &interval"
+
+#: ../src/commands/segment/SegmentAutoSplitCommand.cpp:148
+msgid "%1 (part)"
+msgstr "%1 (deel)"
+
+#: ../src/commands/segment/AudioSegmentInsertCommand.cpp:51
+#: ../src/commands/segment/SegmentInsertCommand.cpp:43
+#: ../src/commands/segment/SegmentInsertCommand.cpp:56
+msgid "Create Segment"
+msgstr "Creëer segment"
+
+#: ../src/commands/segment/AudioSegmentInsertCommand.cpp:114
+msgid "%1 (inserted)"
+msgstr "%1 (ingevoegd)"
+
+#: ../src/commands/segment/AudioSegmentInsertCommand.cpp:117
+msgid "unknown audio file"
+msgstr "onbekend audio bestand"
+
+#: ../src/commands/segment/CreateTempoMapFromSegmentCommand.cpp:40
+msgid "Set Tempos from Beat Segment"
+msgstr ""
+
+#: ../src/commands/segment/SegmentSplitByRecordingSrcCommand.h:52
+msgid "Split by &Recording Source..."
+msgstr "Splits naar &opnamebron..."
+
+#: ../src/commands/segment/SegmentColourMapCommand.cpp:40
+msgid "Change Segment Color Map"
+msgstr "Wijzig kleurenpalet van segment"
+
+#: ../src/commands/edit/CopyCommand.cpp:64
+#: ../src/commands/segment/SegmentQuickCopyCommand.cpp:57
+msgid "%1 (copied)"
+msgstr "%1 (gekopieerd)"
+
+#: ../src/commands/segment/SegmentColourCommand.h:52
+msgid "Change Segment Color..."
+msgstr "Verander segmentkleur..."
+
+#: ../src/commands/segment/SegmentSplitByPitchCommand.cpp:170
+msgid "%1 (upper)"
+msgstr "%1 (bovenste)"
+
+#: ../src/commands/segment/SegmentSplitByPitchCommand.cpp:172
+msgid "%1 (lower)"
+msgstr "%1 (onderste)"
+
+#: ../src/commands/segment/SegmentSingleRepeatToCopyCommand.cpp:39
+msgid "Turn Single Repeat into Copy"
+msgstr "Zet enkele herhaling om in kopie"
+
+#: ../src/commands/segment/AddTempoChangeCommand.h:58
+msgid "Add Te&mpo Change..."
+msgstr "Voeg te&mpoverandering toe..."
+
+#: ../src/commands/segment/AudioSegmentAutoSplitCommand.h:57
+#: ../src/commands/segment/SegmentAutoSplitCommand.h:53
+msgid "&Split on Silence"
+msgstr "&Splits bij stilte"
+
+#: ../src/commands/segment/SetTriggerSegmentBaseVelocityCommand.cpp:39
+msgid "Set Base Velocity"
+msgstr "Stel basis-aanslagsnelheid in"
+
+#: ../src/commands/segment/DeleteRangeCommand.cpp:43
+#: ../src/commands/segment/EraseSegmentsStartingInRangeCommand.cpp:39
+msgid "Delete Range"
+msgstr "Verwijder bereik"
+
+#: ../src/commands/segment/ChangeCompositionLengthCommand.h:53
+msgid "Change &Composition Start and End..."
+msgstr "Verander &compositiebegin en -eind..."
+
+#: ../src/commands/segment/MoveTracksCommand.h:51
+msgid "Move Tracks..."
+msgstr "Verplaats Sporen..."
+
+#: ../src/commands/segment/SegmentColourCommand.cpp:39
+msgid "Change Segment Color"
+msgstr "Verander segmentkleur"
+
+#: ../src/commands/segment/AudioSegmentDistributeCommand.h:66
+msgid "Distribute Audio Segments over MIDI"
+msgstr "Verdeel audiosegmenten over MIDI"
+
+#: ../src/commands/segment/AudioSegmentAutoSplitCommand.cpp:147
+msgid "%1 (autosplit %2)"
+msgstr "%1 (autosplits %2)"
+
+#: ../src/commands/segment/SetTriggerSegmentDefaultRetuneCommand.cpp:39
+msgid "Set Default Retune"
+msgstr ""
+
+#: ../src/commands/segment/AddTimeSignatureCommand.h:52
+msgid "Add Time Si&gnature Change..."
+msgstr "Voeg maatsoortveranderin&g toe"
+
+#: ../src/commands/segment/AddTriggerSegmentCommand.cpp:42
+msgid "Add Triggered Segment"
+msgstr "Voeg getriggerd segment toe"
+
+#: ../src/commands/segment/SetTriggerSegmentDefaultTimeAdjustCommand.cpp:39
+msgid "Set Default Time Adjust"
+msgstr ""
+
+#: ../src/commands/segment/RemoveTimeSignatureCommand.h:58
+msgid "Remove &Time Signature Change..."
+msgstr "Verwijder Maa&tsoortverandering..."
+
+#: ../src/commands/segment/SegmentCommandRepeat.cpp:39
+msgid "Repeat Segments"
+msgstr "Herhaal segmenten"
+
+#: ../src/commands/segment/AddTracksCommand.h:55
+msgid "Add Tracks..."
+msgstr "Voeg Sporen Toe..."
+
+#: ../src/commands/segment/ModifyDefaultTempoCommand.h:51
+msgid "Modify &Default Tempo..."
+msgstr "Wijzig &Standaardtempo..."
+
+#: ../src/commands/segment/SegmentSplitByPitchCommand.h:61
+msgid "Split by &Pitch..."
+msgstr "Splits naar &toonhoogte..."
+
+#: ../src/commands/segment/DeleteTriggerSegmentCommand.cpp:40
+msgid "Delete Triggered Segment"
+msgstr "Verwijder getriggerd segment"
+
+#: ../src/commands/segment/SegmentSplitCommand.cpp:42
+msgid "Split Segment"
+msgstr "Splits segment"
+
+#: ../src/commands/segment/DeleteTracksCommand.h:51
+msgid "Delete Tracks..."
+msgstr "Verwijder Sporen..."
+
+#: ../src/commands/segment/InsertRangeCommand.cpp:42
+msgid "Insert Range"
+msgstr "Voeg bereik in"
+
+#: ../src/commands/segment/DeleteRangeCommand.h:62
+msgid "Rejoin Command"
+msgstr ""
+
+#: ../src/commands/segment/SetTriggerSegmentBasePitchCommand.cpp:39
+msgid "Set Base Pitch"
+msgstr "Stel basis-toonhoogte in"
+
+#: ../src/commands/segment/PasteConductorDataCommand.cpp:41
+msgid "Paste Tempos and Time Signatures"
+msgstr "Tempi en maatsoorten plakken"
+
+#: ../src/commands/segment/SegmentSyncClefCommand.cpp:34
+msgid "Sync segment clef"
+msgstr ""
+
+#: ../src/commands/matrix/MatrixInsertionCommand.cpp:46
+#: ../src/commands/notation/NoteInsertionCommand.cpp:54
+msgid "Insert Note"
+msgstr "Voeg Noot In"
+
+#: ../src/commands/matrix/MatrixEraseCommand.cpp:41
+msgid "Erase Note"
+msgstr "Wis noot"
+
+#: ../src/commands/matrix/MatrixPercussionInsertionCommand.cpp:47
+msgid "Insert Percussion Note"
+msgstr "Voeg slagwerknoot In"
+
+#: ../src/commands/matrix/MatrixModifyCommand.cpp:43
+msgid "Move Note"
+msgstr "Verplaats noot"
+
+#: ../src/commands/matrix/MatrixModifyCommand.cpp:43
+msgid "Modify Note"
+msgstr "Wijzig noot"
+
+#: ../src/commands/edit/PasteEventsCommand.cpp:98
+msgid "Paste into an existing gap [\"restricted\"]"
+msgstr "Plak in bestaande leegte [\"met restricties\"]"
+
+#: ../src/commands/edit/PasteEventsCommand.cpp:100
+msgid "Erase existing events to make room [\"simple\"]"
+msgstr "Wis bestaande gebeurtenissen om ruimte te maken [\"simpel\"]"
+
+#: ../src/commands/edit/PasteEventsCommand.cpp:102
+msgid "Move existing events out of the way [\"open-n-paste\"]"
+msgstr "Verplaats bestaande gebeurtenissen [\"open-en-plakken\"]"
+
+#: ../src/commands/edit/PasteEventsCommand.cpp:104
+msgid "Overlay notes, tying against present notes [\"note-overlay\"]"
+msgstr "Leg noten eroverheen, en bind met bestaande noten [\"noot-overlay\"]"
+
+#: ../src/commands/edit/PasteEventsCommand.cpp:106
+msgid "Overlay notes, ignoring present notes [\"matrix-overlay\"]"
+msgstr ""
+"Leg noten eroverheen, en let niet op bestaande noten [\"matrix-overlay\"]"
+
+#: ../src/commands/edit/AddDotCommand.h:52
+msgid "&Add Dot"
+msgstr "&Voeg punt toe"
+
+#: ../src/commands/edit/RemoveMarkerCommand.h:55
+msgid "&Remove Marker"
+msgstr "&Verwijder Marker"
+
+#: ../src/commands/edit/EventUnquantizeCommand.cpp:43
+#: ../src/commands/edit/EventUnquantizeCommand.cpp:54
+msgid "Unquantize Events"
+msgstr "Ontquantiseer gebeurtenissen"
+
+#: ../src/commands/edit/ChangeVelocityCommand.h:53
+msgid "&Increase Velocity"
+msgstr "&Verhoog snelheid"
+
+#: ../src/commands/edit/ChangeVelocityCommand.h:54
+msgid "&Reduce Velocity"
+msgstr "&Reduceer snelheid"
+
+#: ../src/commands/edit/CopyCommand.cpp:46
+msgid "(excerpt)"
+msgstr "(gedeelte)"
+
+#: ../src/commands/edit/CopyCommand.cpp:60
+msgid "(copied)"
+msgstr "(gekopierd)"
+
+#: ../src/commands/edit/EventInsertionCommand.cpp:39
+msgid "Insert Event"
+msgstr "Voeg Gebeurtenis Toe"
+
+#: ../src/commands/edit/InsertTriggerNoteCommand.cpp:55
+msgid "Insert Trigger Note"
+msgstr "Trigger-noot invoegen"
+
+#: ../src/commands/edit/CollapseNotesCommand.h:50
+msgid "Collapse &Equal-Pitch Notes"
+msgstr "Voeg &Gelijke-Toonhoogte Noten Samen"
+
+#: ../src/commands/edit/TransposeCommand.h:61
+msgid "&Up a Semitone"
+msgstr "Halve toon Om&hoog"
+
+#: ../src/commands/edit/TransposeCommand.h:62
+msgid "&Down a Semitone"
+msgstr "Halve toon Om&laag"
+
+#: ../src/commands/edit/TransposeCommand.h:63
+msgid "Up an &Octave"
+msgstr "Een &Octaaf Omhoog"
+
+#: ../src/commands/edit/TransposeCommand.h:64
+msgid "Down an Octa&ve"
+msgstr "Een Octaa&f Omlaag"
+
+#: ../src/commands/edit/TransposeCommand.h:65
+msgid "&Transpose by Semitones..."
+msgstr "&Transponeren per halve secunde..."
+
+#: ../src/commands/edit/SetNoteTypeCommand.h:56
+msgid "&Set Note Type"
+msgstr "&Stel noot-type in"
+
+#: ../src/commands/edit/EventEditCommand.h:55
+msgid "Edit E&vent"
+msgstr "&Bewerk Gebeurtenis"
+
+#: ../src/commands/edit/AddMarkerCommand.h:54
+msgid "&Add Marker"
+msgstr "&Voeg Marker Toe"
+
+#: ../src/commands/edit/SelectionPropertyCommand.h:66
+msgid "Set &Property"
+msgstr "Stel &Eigenschap In"
+
+#: ../src/commands/edit/CutCommand.h:55
+msgid "Cu&t"
+msgstr "&Knippen"
+
+#: ../src/commands/edit/EventQuantizeCommand.cpp:114
+msgid "Heuristic Notation &Quantize"
+msgstr "Heuristische notatie-&quantisatie"
+
+#: ../src/commands/edit/EventQuantizeCommand.cpp:116
+msgid "Grid &Quantize"
+msgstr "Rooster-&quantisatie"
+
+#: ../src/commands/edit/ClearTriggersCommand.h:52
+msgid "&Clear Triggers"
+msgstr "Triggers &verwijderen"
+
+#: ../src/commands/edit/RetrogradeCommand.h:51
+msgid "&Retrograde"
+msgstr "&Retrograde"
+
+#: ../src/commands/edit/InvertCommand.h:51
+msgid "&Invert"
+msgstr "&Inversie"
+
+#: ../src/commands/edit/SetTriggerCommand.h:64
+msgid "Tri&gger Segment"
+msgstr "Tri&gger segment"
+
+#: ../src/commands/edit/SetLyricsCommand.h:50
+msgid "Edit L&yrics"
+msgstr "Bewerk &Teksten"
+
+#: ../src/commands/edit/MoveAcrossSegmentsCommand.cpp:73
+msgid "&Move Events to Other Segment"
+msgstr "Verplaats gebeurtenissen naar ander segment"
+
+#: ../src/commands/edit/RetrogradeInvertCommand.h:51
+msgid "Re&trograde Invert"
+msgstr "Re&trograde inversie"
+
+#: ../src/commands/edit/ModifyMarkerCommand.h:55
+msgid "&Modify Marker"
+msgstr "&Wijzig Marker"
+
+#: ../src/commands/studio/AddControlParameterCommand.h:61
+msgid "&Add Control Parameter"
+msgstr "&Voeg controleparameter toe"
+
+#: ../src/commands/studio/ModifyInstrumentMappingCommand.h:55
+msgid "Modify &Instrument Mapping"
+msgstr "Wijzig instrumentmapping"
+
+#: ../src/commands/studio/RemoveControlParameterCommand.h:60
+msgid "&Remove Control Parameter"
+msgstr "Ve&rwijder controleparameter"
+
+#: ../src/commands/studio/ReconnectDeviceCommand.h:55
+msgid "Reconnect Device"
+msgstr "Sluit apparaat opnieuw aan"
+
+#: ../src/commands/studio/ModifyDeviceCommand.h:68
+msgid "Modify &MIDI Bank"
+msgstr "Wijzig &MIDI Bank"
+
+#: ../src/commands/studio/CreateOrDeleteDeviceCommand.h:68
+msgid "Create Device"
+msgstr "Creëer apparaat"
+
+#: ../src/commands/studio/ModifyDeviceMappingCommand.h:55
+msgid "Modify &Device Mapping"
+msgstr "Wijzig &apparaat-mapping"
+
+#: ../src/commands/studio/RenameDeviceCommand.h:55
+msgid "Rename Device"
+msgstr "Hernoem apparaat"
+
+#: ../src/commands/studio/ModifyControlParameterCommand.h:61
+msgid "&Modify Control Parameter"
+msgstr "Bewerk controleparameter"
+
+#: ../src/commands/notation/TieNotesCommand.h:49
+msgid "&Tie"
+msgstr "Binden"
+
+#: ../src/commands/notation/ClefInsertionCommand.cpp:74
+msgid "Add Cle&f Change..."
+msgstr "Voeg sleutelverandering toe..."
+
+#: ../src/commands/notation/GuitarChordInsertionCommand.cpp:40
+msgid "Insert Guitar Chord"
+msgstr "Voeg gitaarakkoord in"
+
+#: ../src/commands/notation/RespellCommand.cpp:47
+#, c-format
+msgid "Respell with %1"
+msgstr "Forceer %1"
+
+#: ../src/commands/notation/RespellCommand.cpp:50
+msgid "Do&uble Sharp"
+msgstr "D&ubbelkruis"
+
+#: ../src/commands/notation/RespellCommand.cpp:52
+msgid "&Sharp"
+msgstr "&Kruis"
+
+#: ../src/commands/notation/RespellCommand.cpp:54
+msgid "&Flat"
+msgstr "&Mol"
+
+#: ../src/commands/notation/RespellCommand.cpp:56
+msgid "Dou&ble Flat"
+msgstr "Dub&belmol"
+
+#: ../src/commands/notation/RespellCommand.cpp:58
+msgid "&Natural"
+msgstr "&Herstellingsteken"
+
+#: ../src/commands/notation/RespellCommand.cpp:60
+msgid "N&one"
+msgstr "&Geen"
+
+#: ../src/commands/notation/RespellCommand.cpp:66
+msgid "Respell Accidentals &Upward"
+msgstr "Forceer voortekens om&hoog"
+
+#: ../src/commands/notation/RespellCommand.cpp:69
+msgid "Respell Accidentals &Downward"
+msgstr "Forceer voortekens om&laag"
+
+#: ../src/commands/notation/RespellCommand.cpp:72
+msgid "&Restore Accidentals"
+msgstr "He&rstel voortekens"
+
+#: ../src/commands/notation/RespellCommand.cpp:75
+msgid "Respell Accidentals"
+msgstr "Forceer voortekens"
+
+#: ../src/commands/notation/DeCounterpointCommand.h:55
+msgid "Split-and-Tie Overlapping &Chords"
+msgstr "Splits-en-bind overlappende &akkoorden"
+
+#: ../src/commands/notation/BeamCommand.h:49
+msgid "&Beam Group"
+msgstr "&Noten groeperen"
+
+#: ../src/commands/notation/AddTextMarkCommand.h:51
+msgid "Add Te&xt Mark..."
+msgstr "Tekstaccent toevoegen..."
+
+#: ../src/commands/notation/RestoreSlursCommand.h:49
+msgid "&Restore Slur Positions"
+msgstr "He&rstel boogposities"
+
+#: ../src/commands/notation/SustainInsertionCommand.h:56
+msgid "Add Pedal &Press"
+msgstr "Toevoegen: pedaal omlaag"
+
+#: ../src/commands/notation/SustainInsertionCommand.h:58
+msgid "Add Pedal &Release"
+msgstr "Toevoegen: pedaal omhoog"
+
+#: ../src/commands/notation/FixNotationQuantizeCommand.h:49
+msgid "Fi&x Notation Quantization"
+msgstr "Fi&xeer notatie-quantisatie"
+
+#: ../src/commands/notation/ChangeStemsCommand.h:51
+msgid "Stems &Up"
+msgstr "Stokken om&hoog"
+
+#: ../src/commands/notation/ChangeStemsCommand.h:51
+msgid "Stems &Down"
+msgstr "Stokken om&laag"
+
+#: ../src/commands/notation/MakeAccidentalsCautionaryCommand.cpp:43
+msgid "Use &Cautionary Accidentals"
+msgstr "Gebruik &waarschuwende voortekens"
+
+#: ../src/commands/notation/MakeAccidentalsCautionaryCommand.cpp:45
+msgid "Cancel C&autionary Accidentals"
+msgstr "Verwijder w&aarschuwende voortekens"
+
+#: ../src/commands/notation/SetVisibilityCommand.h:50
+msgid "Set Visibility"
+msgstr "Zichtbaarheid instellen"
+
+#: ../src/commands/notation/ChangeStyleCommand.h:53
+msgid "Change &Note Style"
+msgstr "Wijzig &notenstijl"
+
+#: ../src/commands/notation/TextInsertionCommand.cpp:41
+msgid "Insert Text"
+msgstr "Voeg Tekst In"
+
+#: ../src/commands/notation/InterpretCommand.h:70
+msgid "&Interpret..."
+msgstr "Interpretatie..."
+
+#: ../src/commands/notation/TupletCommand.h:53
+msgid "&Triplet"
+msgstr "&Triool"
+
+#: ../src/commands/notation/TupletCommand.h:54
+msgid "Tu&plet..."
+msgstr "Multi&plet"
+
+#: ../src/commands/notation/UnTupletCommand.h:50
+msgid "&Untuplet"
+msgstr "Ont-multiplet"
+
+#: ../src/commands/notation/CollapseRestsCommand.h:54
+msgid "&Collapse Rests"
+msgstr "&Klap Rusten In"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:145
+msgid "Add S&lur"
+msgstr "Voeg boog toe"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:147
+msgid "Add &Phrasing Slur"
+msgstr "Voeg fraseringsboog toe"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:149
+msgid "Add Double-Octave Up"
+msgstr "Dubbel octaaf omhoog (15ma) toevoegen"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:151
+msgid "Add Octave &Up"
+msgstr "Octaaf omhoog (8va) toevoegen"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:153
+msgid "Add Octave &Down"
+msgstr "Octaaf omlaag (8vb) toevoegen"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:155
+msgid "Add Double Octave Down"
+msgstr "Dubbel octaaf omlaag (15mb) toevoegen"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:160
+msgid "Add &Crescendo"
+msgstr "Toevoegen crescendo"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:162
+msgid "Add &Decrescendo"
+msgstr "Toevoegen descrescendo"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:164
+msgid "Add &Glissando"
+msgstr "Toevoegen glissando"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:167
+msgid "Add &%1%2"
+msgstr "Voeg &%1%2 toe"
+
+#: ../src/commands/notation/RemoveNotationQuantizeCommand.h:49
+msgid "Remo&ve Notation Quantization"
+msgstr "&Verwijder notatie-quantisatie"
+
+#: ../src/commands/notation/MakeChordCommand.h:50
+msgid "Make &Chord"
+msgstr "Maak &Akkoord"
+
+#: ../src/commands/notation/MultiKeyInsertionCommand.h:63
+msgid "Change all to &Key %1..."
+msgstr "Alles veranderen in &Sleutel %1..."
+
+#: ../src/commands/notation/KeyInsertionCommand.h:67
+#: ../src/commands/notation/MultiKeyInsertionCommand.h:65
+msgid "Add &Key Change..."
+msgstr "Voeg voortekens aan de sleutel toe..."
+
+#: ../src/commands/notation/RestoreStemsCommand.h:49
+msgid "&Restore Stems"
+msgstr "He&rstel stokken"
+
+#: ../src/commands/notation/MakeNotesViableCommand.h:55
+#: ../src/commands/notation/MakeRegionViableCommand.h:52
+msgid "Tie Notes at &Barlines"
+msgstr "Bind noten bij &maatstrepen"
+
+#: ../src/commands/notation/AddSlashesCommand.h:46
+msgid "Slashes"
+msgstr "Tremolo-strepen"
+
+#: ../src/commands/notation/ChangeSlurPositionCommand.h:51
+msgid "Slur &Above"
+msgstr "Boog bovenlangs"
+
+#: ../src/commands/notation/ChangeSlurPositionCommand.h:51
+msgid "Slur &Below"
+msgstr "Boog onderlangs"
+
+#: ../src/commands/notation/NormalizeRestsCommand.h:54
+msgid "&Normalize Rests"
+msgstr "&Normaliseer Rusten"
+
+#: ../src/commands/notation/TextChangeCommand.cpp:41
+msgid "Edit Text"
+msgstr "Bewerk tekst"
+
+#: ../src/commands/notation/RemoveMarksCommand.h:49
+msgid "&Remove All Marks"
+msgstr "Verwijder alle accenten"
+
+#: ../src/commands/notation/AutoBeamCommand.h:52
+msgid "&Auto-Beam"
+msgstr "&Auto-groeperen"
+
+#: ../src/commands/notation/UntieNotesCommand.h:49
+msgid "&Untie"
+msgstr "&Noten losmaken"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:48
+msgid "S&forzando"
+msgstr "S&forzando"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:50
+msgid "Sta&ccato"
+msgstr "Sta&ccato"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:52
+msgid "R&inforzando"
+msgstr "R&inforzando"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:54
+msgid "T&enuto"
+msgstr "T&enuto"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:56
+msgid "Tri&ll"
+msgstr "Tri&ller"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:58
+msgid "Trill &with Line"
+msgstr "Triller met lijn"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:60
+msgid "Trill Line"
+msgstr "Trillerlijn"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:62
+msgid "&Turn"
+msgstr "&Dubbelslag"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:64
+msgid "&Accent"
+msgstr "&Accent"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:66
+msgid "&Staccatissimo"
+msgstr "&Staccatissimo"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:68
+msgid "&Marcato"
+msgstr "&Marcato"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:70
+msgid "&Pause"
+msgstr "&Fermate"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:72
+msgid "&Up-Bow"
+msgstr "Opstreek"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:74
+msgid "&Down-Bow"
+msgstr "Afstreek"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:76
+msgid "Mo&rdent"
+msgstr "Mo&rdent"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:78
+msgid "Inverted Mordent"
+msgstr "Pralltriller"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:80
+msgid "Long Mordent"
+msgstr "Lang mordent"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:82
+msgid "Lon&g Inverted Mordent"
+msgstr "Lange pralltriller"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:84
+msgid "&%1%2"
+msgstr "&%1%2"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:89
+#, c-format
+msgid "Add %1"
+msgstr "Voeg %1 toe"
+
+#: ../src/commands/notation/ResetDisplacementsCommand.h:49
+msgid "Restore Positions"
+msgstr "Herstel posities"
+
+#: ../src/commands/notation/IncrementDisplacementsCommand.h:52
+msgid "Fine Reposition"
+msgstr "Precisie-herpositioneren"
+
+#: ../src/commands/notation/RestoreTiesCommand.h:49
+msgid "&Restore Tie Positions"
+msgstr "&Herstel boogposities"
+
+#: ../src/commands/notation/ChangeTiePositionCommand.h:47
+msgid "Tie &Above"
+msgstr "Boog &bovenlangs"
+
+#: ../src/commands/notation/ChangeTiePositionCommand.h:47
+msgid "Tie &Below"
+msgstr "Boog &onderlangs"
+
+#: ../src/commands/notation/KeyInsertionCommand.h:65
+msgid "Change to &Key %1..."
+msgstr "Verander naar &Sleutel %1..."
+
+#: ../src/commands/notation/RemoveFingeringMarksCommand.h:49
+msgid "&Remove Fingerings"
+msgstr "&Verwijder vingerzettingen"
+
+#: ../src/commands/notation/BreakCommand.h:49
+msgid "&Unbeam"
+msgstr "&Groep losmaken"
+
+#: ../src/commands/notation/UnGraceCommand.h:48
+msgid "Ung&race"
+msgstr "Noten niet als voorslag"
+
+#: ../src/commands/notation/AddFingeringMarkCommand.cpp:45
+msgid "Add Other &Fingering..."
+msgstr "Voeg andere &vingerzetting toe..."
+
+#: ../src/commands/notation/AddFingeringMarkCommand.cpp:47
+msgid "Add Fingering &0 (Thumb)"
+msgstr "Voeg vingerzetting &0 (duim) toe"
+
+#: ../src/commands/notation/AddFingeringMarkCommand.cpp:49
+#, c-format
+msgid "Add Fingering &%1"
+msgstr "Voeg vingerzetting &%1 toe"
+
+#: ../src/document/io/HydrogenXMLHandler.cpp:277
+msgid " imported from Hydrogen "
+msgstr " geïmporteerd uit Hydrogen"
+
+#: ../src/document/io/LilyPondExporter.cpp:404
+msgid ""
+"LilyPond does not allow spaces or backslashes in filenames.\n"
+"\n"
+"Would you like to use\n"
+"\n"
+" %1\n"
+"\n"
+" instead?"
+msgstr ""
+"Lilypond staat geen spaties of backslashes toe in bestandsnamen.<br><br> "
+"Wilt u<br> <br>%1<br><br>in plaats van de opgegeven bestandsnaam gebruiken?"
+
+#: ../src/document/io/LilyPondExporter.cpp:2054
+msgid "warning: overlong bar truncated here"
+msgstr "waarschuwing: te lange maat is ingekort"
+
+#: ../src/document/io/LilyPondExporter.cpp:2060
+msgid "warning: bar too short, padding with rests"
+msgstr "waarschuwing: maat is te kort, wordt aangevuld met rusten"
+
+#: ../src/document/MultiViewCommandHistory.cpp:318
+msgid "Nothing to undo"
+msgstr "Niets om ongedaan te maken"
+
+#: ../src/document/MultiViewCommandHistory.cpp:320
+msgid "Nothing to redo"
+msgstr "Niets om te herhalen"
+
+#: ../src/document/MultiViewCommandHistory.cpp:328
+#: ../src/document/MultiViewCommandHistory.cpp:372
+#, c-format
+msgid "Und&o %1"
+msgstr "Ongedaan maken %1"
+
+#: ../src/document/MultiViewCommandHistory.cpp:330
+#: ../src/document/MultiViewCommandHistory.cpp:374
+#, c-format
+msgid "Re&do %1"
+msgstr "Herhalen %1"
+
+#: ../src/document/RosegardenGUIDoc.cpp:328
+msgid ""
+"The current file has been modified.\n"
+"Do you want to save it?"
+msgstr ""
+"Het huidige bestand is gewijzigd.\n"
+"Wilt u het opslaan?"
+
+#: ../src/document/RosegardenGUIDoc.cpp:480
+#, c-format
+msgid ""
+"_n: Delete the 1 audio file recorded during the unsaved session?\n"
+"Delete the %n audio files recorded during the unsaved session?"
+msgstr ""
+"Wilt u het tijdens de onopgeslagen sessie opgenomen audiobestand wissen?\n"
+"Wilt u de tijdens de onopgeslagen sessie %n opgenomen audiobestanden "
+"wissen? "
+
+#: ../src/document/RosegardenGUIDoc.cpp:501
+msgid ""
+"The following audio files were recorded during this session but have been "
+"unloaded\n"
+"from the audio file manager, and so are no longer in use in the document you "
+"are saving.\n"
+"\n"
+"You may want to clean up these files to save disk space.\n"
+"\n"
+"Please select any you wish to delete permanently from the hard disk.\n"
+msgstr ""
+"De volgende audiobestanden zijn tijdens deze sessie opgenomen maar zijn uit "
+"de audiobestandsbeheerder gehaald, en dus niet langer in gebruik in het "
+"document dat u nu opslaat.\n"
+"\n"
+"Wellicht wilt u deze bestanden opschonen om schijfruimte te winnen.\n"
+"\n"
+"Selecteer de bestanden die u permanent van de harde schijf wilt wissen.\n"
+
+#: ../src/document/RosegardenGUIDoc.cpp:517
+#, c-format
+msgid ""
+"_n: <qt>About to delete 1 audio file permanently from the hard disk."
+"<br>There will be no way to recover this file.<br>Are you sure?</qt>\n"
+"\n"
+"<qt>About to delete %n audio files permanently from the hard disk.<br>There "
+"will be no way to recover these files.<br>Are you sure?</qt>"
+msgstr ""
+"<qt>Er zal 1 audiobestand permanent van de harde schijf worden gewist.\n"
+"Er zal geen manier zijn om dit bestand terug te halen.\n"
+"Weet u zeker dat u wilt doorgaan?</qt>\n"
+"<qt>Er zullen %n audiobestanden permanent van de harde schijf worden "
+"gewist.\n"
+"Er zal geen manier zijn om deze bestanden terug te halen.\n"
+"Weet u zeker dat u wilt doorgaan?</qt>"
+
+#: ../src/document/RosegardenGUIDoc.cpp:580
+msgid "Can't open file '%1'"
+msgstr "Kan bestand '%1' niet openen"
+
+#: ../src/document/RosegardenGUIDoc.cpp:585
+msgid "Reading file..."
+msgstr "Lezen bestand..."
+
+#: ../src/document/RosegardenGUIDoc.cpp:603
+msgid "Could not open Rosegarden file"
+msgstr "Kon Rosegarden-bestand niet openen"
+
+#: ../src/document/RosegardenGUIDoc.cpp:641
+msgid "Error when parsing file '%1': \"%2\""
+msgstr "Fout tijdens lezen bestand '%1': \"%2\""
+
+#: ../src/document/RosegardenGUIDoc.cpp:689
+msgid "Generating audio previews..."
+msgstr "Audio-preciews genereren..."
+
+#: ../src/document/RosegardenGUIDoc.cpp:721
+msgid "Merge"
+msgstr "Samenvoegen"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1605
+msgid "File load cancelled"
+msgstr "Bestand laden geannuleerd"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1625
+msgid ""
+"<h3>Audio and plugins not available</h3><p>This composition uses audio files "
+"or plugins, but Rosegarden is currently running without audio because the "
+"JACK audio server was not available on startup.</p><p>Please exit "
+"Rosegarden, start the JACK audio server and re-start Rosegarden if you wish "
+"to load this complete composition.</p><p><b>WARNING:</b> If you re-save this "
+"composition, all audio and plugin data and settings in it will be lost.</p>"
+msgstr ""
+"<h3>Audio en plugins niet beschikbaar</h3><p>Deze compositie gebruikt "
+"audiobestanden of plugins, maar Rosegarden loopt momenteel zonder audio "
+"omdat de JACK audio-server niet beschikbaar was tijdens het opstarten.</"
+"p><p>Verlaat Rosegarden, start de JACK audio-server en herstart Rosegarden "
+"als u deze hele compositie wilt laden.</p><p><b>LET OP:</b> Als u deze "
+"compositie opnieuw opslaat zullen alle audio- en plugin-data en -"
+"instellingen verloren gaan.</p>"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1628
+msgid ""
+"<h3>Audio and plugins not available</h3><p>This composition uses audio files "
+"or plugins, but you are running a version of Rosegarden that was compiled "
+"without audio support.</p><p><b>WARNING:</b> If you re-save this composition "
+"from this version of Rosegarden, all audio and plugin data and settings in "
+"it will be lost.</p>"
+msgstr ""
+"<h3>Audio en plugins niet beschikbaar</h3><p>Deze compositie gebruikt "
+"audiobestanden of plugins, maar u runt een versie van Rosegarden die zonder "
+"audio-ondersteuning is gecompileerd.</p><p><b>LET OP:</b> Als u deze "
+"compositie opslaat vanuit deze versie van Rosegarden, dan zullen alle audio- "
+"en plugin-data en -instellingen verloren gaan.</p>"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1665
+msgid ""
+"<h3>Incorrect audio sample rate</h3><p>This composition contains audio files "
+"that were recorded or imported with the audio server running at a different "
+"sample rate (%1 Hz) from the current JACK server sample rate (%2 Hz).</"
+"p><p>Rosegarden will play this composition at the correct speed, but any "
+"audio files in it will probably sound awful.</p><p>Please consider re-"
+"starting the JACK server at the correct rate (%3 Hz) and re-loading this "
+"composition before you do any more work with it.</p>"
+msgstr ""
+"<h3>Onjuiste audio-samplerate</h3><p>Deze compositie bevat audiobestanden "
+"die zijn opgenomen met een audio-server die een andere samplerate (%1 Hz) "
+"gebruikte dan de huidige JACK server samplerate (%2 Hz).</p><p>Rosegarden "
+"zal deze compositie op de juiste snelheid afspelen, maar de audiobestanden "
+"erin zullen waarschijnlijk vreselijk klinken.</p><p>Overweeg om de JACK-"
+"server op de juiste snelheid (%3 Hz) te herstarten en deze compositie te "
+"herladen alvorens er verder mee te werken.</p>"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1675
+msgid ""
+"<h3>Inconsistent audio sample rates</h3><p>This composition contains audio "
+"files at more than one sample rate.</p><p>Rosegarden will play them at the "
+"correct speed, but any audio files that were recorded or imported at rates "
+"different from the current JACK server sample rate (%1 Hz) will probably "
+"sound awful.</p><p>Please see the audio file manager dialog for more "
+"details, and consider resampling any files that are at the wrong rate.</p>"
+msgstr ""
+"<h3>Inconsistente audio-samplerates</h3><p>Deze compositie bevat "
+"audiobestanden met meer dan één smaplerate.</p><p>Rosegarden zal ze op de "
+"juiste snelheid afspelen, maar de audiobestanden die opgenomen of "
+"geïmporteerd zijn op snelheden die verschillen van de huidige JACK server "
+"samplerate (%1 Hz) zullen waarschijnlijk vreselijk klinken.</p><p>Zie de "
+"audiobestandsbeheer-dialoog voor meer details, en overweeg de bestanden met "
+"een verkeerde rate te her-samplen.</p>"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1676
+msgid "Inconsistent sample rates"
+msgstr "Inconsistente sample rates"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1690
+msgid ""
+"<h3>Plugins not found</h3><p>The following audio plugins could not be loaded:"
+"</p><ul>"
+msgstr ""
+"<h3>Plugins niet gevonden</h3><p>De volgende audioplugins konden niet "
+"geladen worden:</p><ul>"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1698
+msgid "<li>%1 (from %2)</li>"
+msgstr "<li>%1 (van %2)</li>"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1712
+msgid ""
+"This file contains one or more old element types that are now deprecated.\n"
+"Support for these elements may disappear in future versions of Rosegarden.\n"
+"We recommend you re-save this file from this version of Rosegarden to ensure "
+"that it can still be re-loaded in future versions."
+msgstr ""
+"Dit bestand bevat één of meer verouderde element-types.\n"
+"Ondersteuning voor deze elementen kan verdwijnen uit toekomstige versies van "
+"Rosegarden.\n"
+"Wij bevelen aan om dit bestand vanuit deze Rosegarden-versie opnieuw op te "
+"slaan, om te verzekeren dat het ook met toekomstige versies geladen kan "
+"worden."
+
+#: ../src/document/RosegardenGUIDoc.cpp:2207
+msgid "Insert Recorded MIDI"
+msgstr "Voeg Opgenomen MIDI in"
+
+#: ../src/document/RosegardenGUIDoc.cpp:2560
+msgid "%1 (recorded)"
+msgstr "%1 (opgenomen)"
+
+#: ../src/document/RoseXmlHandler.cpp:442
+msgid ""
+"This file was written by Rosegarden %1, and it uses\n"
+"a different file format that cannot be read by this version."
+msgstr ""
+"Dit bestand heeft het bestandsformaat van Rosegarden %1.\n"
+" Deze versie ondersteunt dat formaat niet."
+
+#: ../src/document/RoseXmlHandler.cpp:452
+msgid ""
+"This file was written by Rosegarden %1, which is more recent than this "
+"version.\n"
+"There may be some incompatibilities with the file format."
+msgstr ""
+"Dit bestand is gemaakt met Rosegarden %1, wat nieuwer is dan deze versie.\n"
+" Mogelijk sluiten de bestandsformaten slecht op elkaar aan."
+
+#: ../src/document/RoseXmlHandler.cpp:1687
+msgid "Loading plugins..."
+msgstr "Plugins laden..."
+
+#: rc.cpp:6 rc.cpp:144
+#, no-c-format
+msgid "Se&gment"
+msgstr "Se&gment"
+
+#: rc.cpp:9 rc.cpp:84 rc.cpp:147 rc.cpp:303
+#, no-c-format
+msgid "Edit &With"
+msgstr "Bewerk &Met"
+
+#: rc.cpp:12 rc.cpp:21 rc.cpp:30 rc.cpp:39 rc.cpp:345
+#, no-c-format
+msgid "Actions Toolbar"
+msgstr "Actiewerkbalk"
+
+#: rc.cpp:15 rc.cpp:33 rc.cpp:129 rc.cpp:285
+#, no-c-format
+msgid "Time Toolbar"
+msgstr "Maatsoort-werkbalk"
+
+#: rc.cpp:18 rc.cpp:36 rc.cpp:57 rc.cpp:63 rc.cpp:120 rc.cpp:243 rc.cpp:342
+#, no-c-format
+msgid "Transport Toolbar"
+msgstr "Toon trans&portwerkbalk"
+
+#: rc.cpp:24 rc.cpp:42 rc.cpp:123 rc.cpp:348
+#, no-c-format
+msgid "Zoom Toolbar"
+msgstr "Zoom-werkbalk"
+
+#: rc.cpp:45 rc.cpp:60 rc.cpp:99 rc.cpp:228 rc.cpp:327
+#, no-c-format
+msgid "T&ransport"
+msgstr "T&ransport"
+
+#: rc.cpp:51
+#, no-c-format
+msgid "Number of Stereo &Inputs"
+msgstr "Aantal stereo-&inputs"
+
+#: rc.cpp:54
+#, no-c-format
+msgid "&Number of Submasters"
+msgstr "Aa&ntal submasters"
+
+#: rc.cpp:66
+#, no-c-format
+msgid "&Import"
+msgstr "&Importeren"
+
+#: rc.cpp:69
+#, no-c-format
+msgid "&Merge"
+msgstr "&Samenvoegen"
+
+#: rc.cpp:72
+#, no-c-format
+msgid "&Export"
+msgstr "&Exporteren"
+
+#: rc.cpp:75 rc.cpp:141 rc.cpp:297
+#, no-c-format
+msgid "&Composition"
+msgstr "&Compositie"
+
+#: rc.cpp:78
+#, no-c-format
+msgid "&Studio"
+msgstr "&Studio"
+
+#: rc.cpp:81
+#, no-c-format
+msgid "Se&gments"
+msgstr "&Segmenten"
+
+#: rc.cpp:90
+#, no-c-format
+msgid "Trac&ks"
+msgstr "S&poren"
+
+#: rc.cpp:93
+#, no-c-format
+msgid "Set &Instrument"
+msgstr "Instrument instellen"
+
+#
+#: rc.cpp:102 rc.cpp:234 rc.cpp:333
+#, no-c-format
+msgid "&Toolbars"
+msgstr "&Werkbalken"
+
+#: rc.cpp:105 rc.cpp:237 rc.cpp:336
+#, no-c-format
+msgid "&Rulers"
+msgstr "&Linealen"
+
+#: rc.cpp:111 rc.cpp:240 rc.cpp:339
+#, no-c-format
+msgid "Tools Toolbar"
+msgstr "Hulpmiddelenwerkbalk"
+
+#: rc.cpp:114
+#, no-c-format
+msgid "Tracks Toolbar"
+msgstr "Sporenwerkbalk"
+
+#: rc.cpp:117
+#, no-c-format
+msgid "Editors Toolbar"
+msgstr "Editors-werkbalk"
+
+#: rc.cpp:135
+#, no-c-format
+msgid "&Layout Mode"
+msgstr "&Layout-modus"
+
+#: rc.cpp:138 rc.cpp:294
+#, no-c-format
+msgid "Add Event Ruler"
+msgstr "Voeg gebeurtenis-liniaal toe"
+
+#: rc.cpp:150
+#, no-c-format
+msgid "N&ote"
+msgstr "N&oot"
+
+#: rc.cpp:153
+#, no-c-format
+msgid "Mar&ks"
+msgstr "&Markeringen"
+
+#: rc.cpp:156
+#, no-c-format
+msgid "&Ornaments"
+msgstr "&Versieringen"
+
+#: rc.cpp:159
+#, no-c-format
+msgid "&Fingerings"
+msgstr "V&ingerzettingen"
+
+#: rc.cpp:162
+#, no-c-format
+msgid "S&lashes"
+msgstr "&Tremolo-strepen"
+
+#: rc.cpp:165 rc.cpp:219
+#, no-c-format
+msgid "&Accidentals"
+msgstr "&Voortekens"
+
+#: rc.cpp:168
+#, no-c-format
+msgid "&Phrase"
+msgstr "&Frase"
+
+#: rc.cpp:171
+#, no-c-format
+msgid "Slur &Position"
+msgstr "&Boogpositie"
+
+#: rc.cpp:174
+#, no-c-format
+msgid "Tie &Position"
+msgstr "&Boogpositie"
+
+#: rc.cpp:177
+#, no-c-format
+msgid "&Octaves"
+msgstr "&Octaven"
+
+#: rc.cpp:180 rc.cpp:306
+#, no-c-format
+msgid "Ad&just"
+msgstr "Aanpassen"
+
+#: rc.cpp:183
+#, no-c-format
+msgid "R&ests"
+msgstr "&Rusten"
+
+#: rc.cpp:186 rc.cpp:213
+#, no-c-format
+msgid "&Notes"
+msgstr "&Noten"
+
+#: rc.cpp:189 rc.cpp:309
+#, no-c-format
+msgid "&Quantize"
+msgstr "&Quantiseren"
+
+#: rc.cpp:195 rc.cpp:315
+#, no-c-format
+msgid "Trans&pose"
+msgstr "&Transponeren"
+
+#: rc.cpp:198 rc.cpp:318
+#, no-c-format
+msgid "Convert"
+msgstr "Converteren"
+
+#: rc.cpp:201
+#, no-c-format
+msgid "&Fine Positioning"
+msgstr "&Fijnpositionering"
+
+#: rc.cpp:204
+#, no-c-format
+msgid "Fine Ti&ming"
+msgstr "&Precisie-timing"
+
+#: rc.cpp:207
+#, no-c-format
+msgid "&Visibility"
+msgstr "&Zichtbaarheid"
+
+#: rc.cpp:216
+#, no-c-format
+msgid "&Rests"
+msgstr "&Rusten"
+
+#: rc.cpp:222
+#, no-c-format
+msgid "&Clefs"
+msgstr "&Sleutels"
+
+#: rc.cpp:225 rc.cpp:324
+#, no-c-format
+msgid "Local &Cursor"
+msgstr "Lokale &cursor"
+
+#: rc.cpp:246
+#, no-c-format
+msgid "Notes Toolbar"
+msgstr "Notenwerkbalk"
+
+#: rc.cpp:249
+#, no-c-format
+msgid "Rests Toolbar"
+msgstr "Rustenwerkbalk"
+
+#: rc.cpp:252
+#, no-c-format
+msgid "Clefs Toolbar"
+msgstr "Sleutelwerkbalk"
+
+#: rc.cpp:255
+#, no-c-format
+msgid "Accidentals Toolbar"
+msgstr "Voortekens-werkbalk"
+
+#: rc.cpp:258
+#, no-c-format
+msgid "Group Toolbar"
+msgstr "Groep-werkbalk"
+
+#: rc.cpp:261
+#, no-c-format
+msgid "Marks Toolbar"
+msgstr "Accentenwerkbalk"
+
+#: rc.cpp:264
+#, no-c-format
+msgid "Meta Toolbar"
+msgstr "Meta-werkbalk"
+
+#: rc.cpp:267
+#, no-c-format
+msgid "Layout Toolbar"
+msgstr "Layout-werkbalk"
+
+#: rc.cpp:270 rc.cpp:351
+#, no-c-format
+msgid "Control Ruler actions"
+msgstr ""
+
+#: rc.cpp:273 rc.cpp:354
+#, no-c-format
+msgid "Property Ruler actions"
+msgstr ""
+
+#: rc.cpp:276
+#, no-c-format
+msgid "&Action"
+msgstr "&Actie"
+
+#: rc.cpp:279
+#, no-c-format
+msgid "General Toolbar"
+msgstr "Algemene werkbalk"
+
+#: rc.cpp:291
+#, no-c-format
+msgid "&Grid"
+msgstr "&Grid"
+
+#: rc.cpp:300
+#, no-c-format
+msgid "&Segment"
+msgstr "&Segment"
+
+#: rc.cpp:361
+#, no-c-format
+msgid "Hide additional controls"
+msgstr "Verberg extra controls"
+
+#: rc.cpp:365
+#, no-c-format
+msgid "Panic Button"
+msgstr "Paniek-knop"
+
+#: rc.cpp:368
+#, no-c-format
+msgid "Resets all MIDI devices if you've got stuck notes"
+msgstr "Herstelt alle MIDI-apparaten als er een noot blijft hangen"
+
+#: rc.cpp:375
+#, no-c-format
+msgid "Provides a metronome click for you to play along with"
+msgstr "Geeft metronoomtikken om mee mee te spelen."
+
+#: rc.cpp:378
+#, no-c-format
+msgid "Shows MIDI activity in and out of Rosegarden"
+msgstr "Toont MIDI-activiteit van en naar Rosegarden"
+
+#: rc.cpp:381
+#, no-c-format
+msgid "IN"
+msgstr "INI"
+
+#: rc.cpp:384
+#, no-c-format
+msgid "OUT"
+msgstr "UIT"
+
+#: rc.cpp:387 rc.cpp:390
+#, no-c-format
+msgid "NO EVENTS"
+msgstr "GEEN GEBEURTENISSEN"
+
+#: rc.cpp:397
+#, no-c-format
+msgid "Record either MIDI or audio"
+msgstr "Neem MIDI of audio op"
+
+#: rc.cpp:401
+#, no-c-format
+msgid "Loop"
+msgstr "Loop"
+
+#: rc.cpp:404
+#, no-c-format
+msgid "Turn on and off the loop markers (if set)"
+msgstr "Zet de loop-markers aan en uit (indien gezet)"
+
+#: rc.cpp:411
+#, no-c-format
+msgid "Mutes all but the currently selected track"
+msgstr "Dempt alle sporen behalve de nu geselcteerde."
+
+#: rc.cpp:415
+#, no-c-format
+msgid "Start loop or range here"
+msgstr "Start loop of bereik hier"
+
+#: rc.cpp:419
+#, no-c-format
+msgid "End loop or range here"
+msgstr "Eindig loop of bereik hier"
+
+#: rc.cpp:422
+#, no-c-format
+msgid "SIG"
+msgstr "MAAT"
+
+#: rc.cpp:425
+#, no-c-format
+msgid "DIV"
+msgstr "EENH"
+
+#: rc.cpp:428
+#, no-c-format
+msgid "/16"
+msgstr "/16"
+
+#: rc.cpp:431
+#, no-c-format
+msgid "TEMPO"
+msgstr "TEMPO"
+
+#: rc.cpp:434
+#, no-c-format
+msgid "END"
+msgstr "EIND"
+
+#: rc.cpp:437
+#, no-c-format
+msgid "BAR"
+msgstr "MAATNR"
+
+#: rc.cpp:441
+#, no-c-format
+msgid "Switch between real time, musical time, and frame count"
+msgstr "Switch tussen kloktijd, maat, en frame-aantal"
+
+#: rc.cpp:445
+#, no-c-format
+msgid "Show additional controls"
+msgstr "Toon extra controls"
+
+#: rc.cpp:449
+#, no-c-format
+msgid "Rewind"
+msgstr "Terugspoelen"
+
+#: rc.cpp:452
+#, no-c-format
+msgid "Moves the current pointer position back one bar."
+msgstr "Verplaats de huidige aanwijzerpositie een maat terug."
+
+#: rc.cpp:456
+#, no-c-format
+msgid "Rewind to beginning"
+msgstr "Terugspoelen naar begin"
+
+#: rc.cpp:459
+#, no-c-format
+msgid ""
+"Moves the pointer position to the start of the composition. (This may mean "
+"going forwards if the pointer is currently before the start.)"
+msgstr ""
+"Zet de pointer-positie op het begin van de compositie. (Dat kan betekenen "
+"dat hij vooruit gaat als de pointer nog voor het begin staat.)"
+
+#: rc.cpp:463
+#, no-c-format
+msgid "Play/Pause"
+msgstr "Afspelen/Pauze"
+
+#: rc.cpp:466
+#, no-c-format
+msgid ""
+"Plays from the current pointer position, or pauses playback if already in "
+"progress."
+msgstr ""
+"Speelt vanaf de huidige aanwijzerpositie, of pauzeert afspelen als die loopt."
+
+#: rc.cpp:473
+#, no-c-format
+msgid "Stops playback or recording."
+msgstr "Stopt afspelen of opnemen."
+
+#: rc.cpp:477
+#, no-c-format
+msgid "Fast forward"
+msgstr "Snel doorspoelen"
+
+#: rc.cpp:480
+#, no-c-format
+msgid "Moves the current pointer position forwards one bar."
+msgstr "Verplaatst de huidige aanwijzerpositie een maat vooruit."
+
+#: rc.cpp:484
+#, no-c-format
+msgid "Fast forward to end"
+msgstr "Doorspoelen naar het einde"
+
+#: rc.cpp:487
+#, no-c-format
+msgid ""
+"Moves the pointer position to the end of the composition. (This may mean "
+"going backwards if the pointer is already beyond the end.)"
+msgstr ""
+"Zet de pointer-positie op het eind van de compositie. (Dat kan betekenen dat "
+"hij achteruit gaat als de pointer al voorbij het einde is.)"
+
+#: rc.cpp:491
+#, no-c-format
+msgid "Display time to end"
+msgstr "Toon resterende tijd"
+
+#: ../docs/en/tips.cpp:3
+msgid ""
+"<p>To configure a track to play using a particular instrument:</p>\n"
+"&nbsp;&nbsp;* click on the track label and hold a moment<br>\n"
+"&nbsp;&nbsp;* select an output device<br>\n"
+"&nbsp;&nbsp;* select one of that device's available instruments (#1 - #16)"
+"<br>\n"
+"&nbsp;&nbsp;* adjust that instrument's output channel, program, bank, and\n"
+"controllers via the instrument parameters box\n"
+msgstr ""
+"<p>Zo laat u een spoor afspelen met een bepaald instrument:</p>\n"
+"&nbsp;&nbsp;* klik op het spoorlabel en houd de muisknop even ingedrukt<br>\n"
+"&nbsp;&nbsp;* kies een uitvoerapparaat<br>\n"
+"&nbsp;&nbsp;* kies een van de beschikbare instrumenten (#1 - #16) van dat "
+"apparaat<br>\n"
+"&nbsp;&nbsp;* stel van dat apparaat het uitvoerkanaal, programma, bank en "
+"controllers in via de box Instrumentparameters\n"
+
+#: ../docs/en/tips.cpp:13
+msgid ""
+"<p>...that Rosegarden has an autosave feature?<br><br>\n"
+"You can select your autosave interval from <b>Settings->Configure\n"
+"Rosegarden</b>.<br><br>\n"
+"When something goes awry, such as a power outage or a Rosegarden crash\n"
+"(unfortunately, it happens...) simply load the file you were working on, and "
+"you'll be given the\n"
+"option to load the autosaved version, or the unmodified original.</p>\n"
+msgstr ""
+"<p>...dat Rosegarden een auto-opslagmogelijkheid heeft?<br><br>\n"
+"u kan een auto-opslaginterval instellen via <b>Instellingen -> Rosegarden "
+"Instellen...</b>.<br><br>\n"
+"Als iets misgaat, zoals stroomuitval of een crash (jammergenoeg\n"
+"gebeurt dat soms...), opent u gewoon het bestand waarmee u aan het werk "
+"was:\n"
+"u krijgt dan de keus om de auto-opslag te laden of het ongewijzigde "
+"origineel.</p>\n"
+
+#: ../docs/en/tips.cpp:23
+msgid ""
+"<p>\n"
+"...that you can save the current document as your default studio by using\n"
+"<b>Composition -> Studio -> Save Current Document as Default Studio</b>?</"
+"p>\n"
+msgstr ""
+"<p>\n"
+"...dat u het huidige document als uw standaard-studio kunt opslaan door\n"
+"<b>Compositie -> Studio -> Sla huidige document op als standaard studio</b> "
+"te kiezen.</p>\n"
+
+#: ../docs/en/tips.cpp:30
+msgid ""
+"<p>...that your default studio is a complete Rosegarden composition that "
+"gets\n"
+"loaded every time you create a new document or import a MIDI file?</p>\n"
+msgstr ""
+"<p>... dat uw standaard-studio een volledige Rosegarden-compositie is, dat "
+"elke keer geladen wordt als u een nieuw document creëert of een MIDI-bestand "
+"importeert?</p>\n"
+
+#: ../docs/en/tips.cpp:36
+msgid ""
+"<p>...that your default studio can contain instrument assignments, document "
+"properties, LilyPond headers,\n"
+"and many other things?<br><br>The default studio is a complete Rosegarden "
+"composition, so it can contain anything that you may wish to have available "
+"in each\n"
+"new document you create.</p>\n"
+msgstr ""
+"<p>...dat uw standaard-studio instrument-toewijzingen, "
+"documenteigenschappen, LilyPond headers en nog veel meer kan bevatten?"
+"<br><br>De standaard-studio is een volledige Rosegaren-compositie, dus het "
+"kan alles bevatten dat u beschikbaar wenst te hebben in elk nieuw te creëren "
+"document.</p>\n"
+
+#: ../docs/en/tips.cpp:43
+msgid ""
+"<p>...that Rosegarden will detect and create a default connection for ALSA "
+"soft\n"
+"synth applications that are started after Rosegarden is already running?</"
+"p>\n"
+msgstr ""
+"<p>...dat Rosegarden ALSA soft synths detecteert en een standaardverbinding "
+"creëert, ook als die gestart worden als Rosegarden al draait?</p>\n"
+
+#: ../docs/en/tips.cpp:49
+msgid ""
+"<p>...that you can make your default studio override that in every "
+"Rosegarden composition you load?<br><br>If your studio setup does not change "
+"very often, and you would prefer for\n"
+"the settings in your default studio to take precedence over whatever\n"
+"studio is saved with any files you happen to load, you can make your studio "
+"the default for everything using <b>Settings -> Configure Rosegarden ->\n"
+"MIDI -> Always use default studio when loading files</b>.</p>\n"
+msgstr ""
+"<p>...dat u uw standaard-studio voorrang kunt geven over de studio van elke "
+"Rosegarden-compositie die u laadt?<br><br>Als uw studio-opzet niet vaak "
+"verandert, en u prefereert de instellingen in uw standaard-studio boven wat "
+"voor studio ook is opgeslagen in de bestanden die u laadt, kunt u uw studio "
+"als uitgangspunt voor alles nemen via <b>Instellingen -> Rosegarden "
+"instellen... -> MIDI -> Gebruik altijd de standaardstudio bij het laden van "
+"bestanden</b>.</p>\n"
+
+#: ../docs/en/tips.cpp:57
+msgid ""
+"<p>If you have accidentally recorded a segment so short that it does not\n"
+"appear on the canvas, which you can only hear during subsequent recording\n"
+"sessions, you can gain access to it by using <b>Composition -> Change\n"
+"Composition Start and End</b> and then setting the composition to start at a "
+"negative number.</p>\n"
+msgstr ""
+"<p>Als u per ongeluk een segment hebt opgenomen dat zo kort is dat die niet\n"
+"op het canvas verschijnt, wat u alleen kan horen tijdens latere "
+"opnamesessies,\n"
+"dan kunt u daar toegang toe krijgen door in <b>Compositie ->\n"
+"Verander compositiebegin en -eind</b> de compositie bij een\n"
+"negatief getal te laten beginnen.</p>\n"
+
+#: ../docs/en/tips.cpp:65
+msgid ""
+"<p>...that if you place a note at the wrong pitch using the notation or "
+"matrix editor, you can move it one semitone at a time with the up and down "
+"arrow keys on your keyboard?</p>\n"
+msgstr ""
+"<p>...dat als u in de notatie- of matrix-editor een noot op de verkeerde "
+"toonhoogte hebt neergezet, u hem met de pijltjestoetsen in stappen van een "
+"halve secunde omhoog en omlaag kan schuiven?</p>\n"
+
+#: ../docs/en/tips.cpp:70
+msgid ""
+"<p>...that you can toggle stem directions in the notation editor by "
+"selecting\n"
+"one or more notes and using Ctrl-PageUp and Ctrl-PageDown?</p>\n"
+msgstr ""
+"<p>...dat u de stokken van de noten in de notatie-editor in de juiste "
+"richting kan\n"
+"dwingen door één of meer noten te selecteren en dan op Ctrl-PageUp of Ctrl-"
+"PageDown te drukken?</p>\n"
+
+#: ../docs/en/tips.cpp:76
+msgid ""
+"<p>...that you can change the accidental used for a note in the notation "
+"editor (without changing the pitch of the note) by selecting\n"
+"it and using the up and down arrow keys with both Ctrl and Shift pressed?</"
+"p>\n"
+msgstr ""
+"<p>...dat u het voorteken voor een noot in de notatie-editor kan wijzigen "
+"(zonder dat de toonhoogte verandert) door hem te selecteren\n"
+"en de omhoog- en omlaag-pijltjestoetsen te gebruiken terwijl u Ctrl en Shift "
+"ingedrukt houdt?</p>\n"
+
+#: ../docs/en/tips.cpp:82 ../docs/en/tips.cpp:93
+msgid ""
+"<p>...that you can hold down the Shift key while repositioning segments on "
+"the\n"
+"segment canvas in order to avoid the \"snap-to\" effect and exert finer "
+"control?</p>\n"
+msgstr ""
+"<p>...dat u, door de Shift-toets ingedrukt te houden, het \"magnetische\" "
+"effect vermijdt\n"
+"tijdens het herpositioneren van segmenten op het segmentencanvas, zodat "
+"ufijnere controle kan uitoefenen?</p>\n"
+
+#: ../docs/en/tips.cpp:88
+msgid ""
+"<p>...that you can use the arrow tool to draw, move, and resize segments and "
+"events as well as to select them?<br><br>Drag a segment or event block to "
+"move it, drag the right edge of a block to resize it, and drag with the "
+"middle mouse button pressed to draw a new segment or event.<br><br>(Of "
+"course, the dedicated draw, move and resize tools are still quicker for "
+"repeated operations.)</p>\n"
+msgstr ""
+"<p>...dat u het pijl-gereedschap, naast selecteren, ook kan gebruiken om "
+"segmenten en gebeurtenissen kan bewegen en herschalen?<br><br>Sleep een "
+"segment- of gebeurtenis-blok om het te bewegen, sleep de rechterzijde van "
+"het blok om het te herschalen, en sleep met de middelste muisknop ingedrukt "
+"om een nieuw segment of gebeurtenis te tekenen.<br><br>(Uiteraard zijn de "
+"gespecialiseerde teken-, beweeg- en herschaal-gereedschappen wel sneller bij "
+"veelvuldig gebruik.)</p>\n"
+
+#: ../docs/en/tips.cpp:99
+msgid ""
+"<p>...that you can hold down the Shift key while repositioning or resizing "
+"events in the\n"
+"matrix view in order to avoid the \"snap-to\" effect and exert finer control?"
+"</p>\n"
+msgstr ""
+"<p>...dat u dmv. de Shift-toets in de matrix-editor het \"magnetische\" "
+"effect voorkomt tijdens het\n"
+"herpositioneren of herschalen van gebeurtenissen, zodat u fijnere controle "
+"kan uitoefenen?</p>\n"
+
+#: ../docs/en/tips.cpp:105
+msgid ""
+"<p>...that you can edit multiple segments on multiple tracks simultaneously "
+"in\n"
+"the notation editor? Simply select the segments, then use <b>Edit -> Open "
+"in Notation Editor</b>.</p>\n"
+msgstr ""
+"<p>...dat u tegelijkertijd verschillende segmenten op meerdere sporen kan "
+"bewerken in de notatie-editor?\n"
+"Selecteer de segmenten, en kies <b>Bewerken -> Open met Notatie-editor</b>.</"
+"p>\n"
+
+#: ../docs/en/tips.cpp:111
+msgid ""
+"<p>...that Rosegarden can export files for use by LilyPond, the high-quality "
+"score typesetting system?<br><br>\n"
+"From the <b>File</b> menu, navigate to <b>Export -> Export LilyPond File</"
+"b></p>\n"
+msgstr ""
+"<p>...dat Rosegarden bestanden kan exporteren voor gebruik met LilyPond, het "
+"hoge-kwaliteits muzieknotatie-systeem?<br><br>\n"
+"Kies in menu <b>Bestand</b> de opties <b>Exporteren -> Exporteer LilyPond-"
+"bestand</b></p>\n"
+
+#: ../docs/en/tips.cpp:117
+msgid ""
+"<p>...that Rosegarden can print via LilyPond, the high-quality score "
+"typesetting system?<br><br>\n"
+"From the <b>File</b> menu, navigate to <b>Preview with LilyPond</b>. The "
+"file\n"
+"will be exported, rendered, and a preview will appear in KPDF, or one of\n"
+"several other PDF viewers, where it can then be printed as well.</p>\n"
+msgstr ""
+"<p>...dat Rosegarden kan afdrukken via LilyPond, het hoge-kwaliteits "
+"muzieknotatie-systeem?<br><br>\n"
+"Ga in het <b>Bestand</b>-menu naar <b>Preview met LilyPond</p>.Het bestand\n"
+"wordt dan geëxporteerd en gerenderd, en een preview zal dan verschijnen in "
+"KPDF, of een andere PDF-viewer, waar het dan ook geprint kan worden.</p>\n"
+
+#: ../docs/en/tips.cpp:125
+msgid ""
+"<p>...that if you use the quantizer from within the notation view, you can "
+"tell it to quantize only the timing used for notation -- making it possible "
+"to have good looking notation <b>and</b> a human MIDI performance?</p>\n"
+msgstr ""
+"<p>...dat als u de quantizer gebruikt vanuit de notatie-view, u het de "
+"opdracht kan geven alleen de timing voor de notatie te quantiseren - zodat u "
+"een goed uitziende notatie <b>en</b> een menselijke MIDI-uitvoering krijgt?</"
+"p>\n"
+
+#: ../docs/en/tips.cpp:130
+msgid ""
+"<p>...that you can change segment labels using the controls on the Segment "
+"Parameters box\n"
+"in the main window?</p>\n"
+msgstr ""
+"<p>...dat u de segment-labels kan veranderen met de besturingselementen\n"
+"in de Segmentparameters-box in het hoofdscherm?</p>\n"
+
+#: ../docs/en/tips.cpp:136
+msgid ""
+"<p>...that the number of tracks in new documents is based on the contents "
+"of\n"
+"your autoload.rg file?\n"
+"<br><br>\n"
+"Whether you prefer to start with three tracks or 43, create a document that\n"
+"contains the desired number of tracks, plus any other studio or document "
+"properties settings\n"
+"you wish to configure, and use <b>Composition -> Studio -> Save Current "
+"Document as Default\n"
+"Studio</b> to make this your new default.</p>\n"
+msgstr ""
+"<p>...dat het aantal sporen in nieuwe documenten afhangt van de inhoud van "
+"uw autoload.rg-bestand?\n"
+"<br><br>\n"
+"Of u nu met 3 of 43 sporen wil beginnen, maak een document dat het gewenste "
+"aantal sporen bevat, plus andere studio- of documenteigenschappen die u wilt "
+"instellen, en gebruik <b>Compositie -> Studio -> Sla huidige document op als "
+"standaardstudio</b> om dit tot uw nieuwe standaard te maken.</p>\n"
+
+#: ../docs/en/tips.cpp:147
+msgid ""
+"<p>...that you can change the name of a track by double clicking on the "
+"label? (The\n"
+"label must be visible for this to work.)</p>\n"
+msgstr ""
+"<p>...dat u de naam van een spoor kunt veranderen door te dubbelklikken op "
+"het label? (Het\n"
+"label moet hiervoor wel zichtbaar zijn.)</p>\n"
+
+#: ../docs/en/tips.cpp:153
+msgid ""
+"<p>...that you can configure what happens when you double-click on a segment?"
+"<br><br>Go to <b>Settings -> Configure Rosegarden</b> and choose your "
+"preferred editing window under the <b>Behaviour</b> tab.</p>\n"
+msgstr ""
+"<p>...dat u in kunt stellen wat er gebeurt als u dubbelklikt op een "
+"segment? Ga naar <b>Instellingen -> Rosegarden instellen...</b> en kies uw "
+"voorkeurs-editor onder het tabblad <b>Gedrag</b>.</p>\n"
+
+#: ../docs/en/tips.cpp:158
+msgid ""
+"<p>...that Rosegarden is being developed as a community effort with\n"
+"contributions from around the world?<br><br>\n"
+"The four most active developers live in London (England), Cannes, "
+"Barcelona,\n"
+"and... Christiansburg? (Christiansburg is a town of about 50,000 in\n"
+"southwestern Virginia, USA.)<br><br>\n"
+"We have had contributors from elsewhere in the US, UK, Spain, Mexico, "
+"Argentina, Germany,\n"
+"Sweden, Russia, Japan, Finland, and Italy, just to name a few...</p>\n"
+msgstr ""
+"<p>...dat Rosegarden ontwikkeld wordt als gemeenschaps-project met\n"
+"bijdragen van over de hele wereld?<br><br>\n"
+"De vier actiefste ontwikkelaars wonen in Londen (Engeland), Cannes, "
+"Barcelona,\n"
+"en... Christiansburg. (Christiansburg is stadje van ca. 50,000 inwoners "
+"in\n"
+"zuidwestelijk Virginia, in de VS.)<br><br>\n"
+"We hebben bijdragen gekregen van elders in de VS, Verenigd Koninkrijk, "
+"Spanje, Mexico, Argentinië, Duitsland,\n"
+"Zweden, Rusland, Japan, Finland, en Italië, om er maar een paar te noemen..."
+"</p>\n"
+
+#: ../docs/en/tips.cpp:169
+msgid ""
+"<p>...that Rosegarden is available in Spanish, French, German, Russian, "
+"Welsh, Swedish, Italian and Estonian\n"
+"translations? (Just to name a few.)<br><br>\n"
+"If you're interested in translating Rosegarden to another language, drop us "
+"a\n"
+"line at <b>[email protected]</b>.</p>\n"
+msgstr ""
+"<p>...dat Rosegarden beschikbaar is in Spaanse, Franse, Duitse, Russische en "
+"Welsche vertalingen? (Om er maar een paar te noemen.)<br><br>\n"
+"Als u geïnteresseerd bent in het vertalen van Rosegarden naar een andere "
+"taal, laat ons dat dan weten op <b>[email protected]</"
+"b>. </p>\n"
+
+#: ../docs/en/tips.cpp:177
+msgid ""
+"<p>...that you can change the total number of bars in the composition via\n"
+"<b>Composition -> Change Composition Start and End</b>?</p>\n"
+msgstr ""
+"<p>...dat u het totaal aantal maten in de compositie kan wijzigen via\n"
+"<b>Compositie -> Verander compositiebegin en -eind</b>?</p>\n"
+
+#: ../docs/en/tips.cpp:183
+msgid ""
+"<p>...that you can see the difference between performance and display "
+"duration\n"
+"of duration-quantized notes in the notation editor?<br><br>\n"
+"Use <b>Settings -> Show Raw Note Ruler</b> to turn on this handy\n"
+"feature.<br><br>\n"
+"<i>Note that this feature does not work in page layout view.</i></p>\n"
+msgstr ""
+"<p>...dat u het verschil kunt zien tussen uitvoering en afgebeelde duur van "
+"gequantiseerde noten in de notatie-editor?<br><br>\n"
+"Gebruik <b>Instellingen -> Toon ruwe noten-liniaal</b> om deze handige "
+"feature aan te zetten.<br><br>\n"
+"<i>NB: deze feature werkt niet in pagina-layout-view</i></p>\n"
+
+#: ../docs/en/tips.cpp:192
+msgid ""
+"<p>...that you can add tempo and time-signature changes by double-clicking "
+"on the values displayed in the transport window or tempo rulers?</p>\n"
+msgstr ""
+"<p>...dat u tempo- en maatsoortveranderingen kunt toevoegen door te dubbel-"
+"klikken op de waarden die in het transport-window of tempo-liniaal getoond "
+"worden?</p>\n"
+
+#: ../docs/en/tips.cpp:197
+msgid ""
+"<p>...that the transport window can display musical time, sample frame "
+"count, and a visual metronome as well as real time?<br><br>Just click on the "
+"small button at the extreme top left of the window.</p>\n"
+msgstr ""
+"<p>...dat het transportvenster de maat kan aangeven, net als het sample "
+"frame aantal, een visuele metronoom en de kloktijd? Klik gewoon even op het "
+"knopje linksboven in het venster</p>\n"
+
+#: ../docs/en/tips.cpp:202
+msgid ""
+"<p>...that you can select all notes of a particular pitch in the matrix "
+"view, by shift-clicking on that pitch on the piano keyboard at the left?"
+"<br><br>If you shift-click-drag, you can select whole ranges too.</p>\n"
+msgstr ""
+"<p>...dat u alle noten met een bepaalde toonhoogte in de matrix view kunt "
+"selecteren door de shift-knop in te drukken en dan te klikken op de gewenste "
+"toonhoogte op het pianotoetsenbord, links?<br><br>Als u de muis sleept met "
+"de shift-toets ingedrukt, kunt u zelfs een heel bereik selecteren.</p>\n"
+
+#: ../docs/en/tips.cpp:207
+msgid ""
+"<p>...that you can set a loop in the main window by clicking-and-dragging on "
+"the time ruler with Shift pressed?<br><br>(If the ruler isn't visible, use "
+"<b>Settings -> Show Rulers</b>.)</p>\n"
+msgstr ""
+"<p>...dat u een afspeellus kan instellen in het hoofdvenster door te klikken-"
+"en-slepen op de afspeelpositie-liniaal met de Shift-toets ingedrukt?<br><br>"
+"(Als die liniaal niet zichtbaar is, gebruik dan <b>Instellingen -> Linealen</"
+"b>.)</p>\n"
+
+#: ../docs/en/tips.cpp:212
+msgid ""
+"<p>...that if you're editing a section in the matrix or notation view, you "
+"can\n"
+"set that section to loop while you edit it?<br><br>Select it and use "
+"<b>Tools ->\n"
+"Local Cursor -> Set Loop to Selection</b>, then hit Play.</p><br><br>\n"
+"<i>This feature does not work quite as well for compositions that include "
+"sampled\n"
+"audio.</i>\n"
+msgstr ""
+"<p>...dat als u een sectie in de matrix- of notatie-view aan het bewerken "
+"bent,\n"
+"u die sectie dan herhaald kan laten afspelen terwijl u bezig bent? "
+"Selecteer de sectie en kies\n"
+"<b>Hulpmiddelen -> Lokale cursor -> Gebruik selectie als afspeellus</b>, en "
+"druk op afspelen.</p><br><br>\n"
+"<i>Deze feature werkt niet zo heel erg goed voor composities waar "
+"gesamplede \n"
+"audio in zit.</i>\n"
+
+#: ../docs/en/tips.cpp:221
+msgid ""
+"<p>...if you have more than one note or controller event at the same time, "
+"you\n"
+"can use the [ and ] keys to flip the stack of events around on the "
+"controller\n"
+"and velocity rulers in order to bring the item you wish to adjust into\n"
+"focus.</p>\n"
+msgstr ""
+"<p>...dat als u meer dan een noot- of controller-gebeurtenis op hetzelfde "
+"moment hebt, u de [- en ]-toetsen kunt gebruiken om de stapel gebeurtenissen "
+"op de controller- en velocity-linialen om de draaien, om zo het element in "
+"focus te brengen wat u wilt aanpassen?</p>\n"
+
+#: ../docs/en/tips.cpp:229
+msgid ""
+"<p>...that the notation view shows you notes using their display duration, "
+"while the\n"
+"matrix allows you to edit their performance duration?<br><br>\n"
+"<i>Be careful with tied notes in the matrix. It is not apparent that they "
+"are\n"
+"tied, and if you split up a pair of tied notes, subsequent notation views "
+"will\n"
+"be confused and unhappy. This is an old bug that has been on our TODO list\n"
+"for years. Sorry about that, folks. Patches welcome.</i>\n"
+"</p>\n"
+msgstr ""
+"<p>...dat de notatie-view u de noten laat zien met hun visuele duur, terwijl "
+"u in de matrix-view de uitgevoerde duur kunt bewerken?</p><br><br>\n"
+"<i>Wees voorzichtig met gebonden noten in de matrix. Het is niet duidelijk "
+"dat ze gebonden zijn, en als u twee gebonden noten splitst, raken volgende "
+"notatie-views in de war. Dit is een oude bug die al jaren op onze TODO-list "
+"staat. Sorry, mensen...! Patches zijn welkom.</i>\n"
+
+#: ../docs/en/tips.cpp:240
+msgid ""
+"<p>If you're working with a human performance and you need to insert some "
+"new\n"
+"notes, these new notes will sound for their entire written duration. To "
+"blend\n"
+"these new notes into a human performance, select them, then use <b>Adjust -> "
+"Interpret...</b> \n"
+"from the notation view to interpret any marks and massage their "
+"performance\n"
+"durations to something less mechanical.</p>\n"
+msgstr ""
+"<p>...dat als u werkt met een menselijke uitvoering, en u nieuwe noten moet "
+"toevoegen, dat die nieuwe noten dan hun volledige lengte krijgen? Om deze "
+"nieuwe noten gladjes in een menselijke uitvoering in te passen, selecteer ze "
+"dan, en gebruik <b>Aanpassen -> Interpretatie...</b> vanuit de notatie-view "
+"om accenten e.d. te interpreteren en de uitvoeringsduur tot iets minder "
+"mechanisch te masseren.</p>\n"
+
+#: ../docs/en/tips.cpp:249
+msgid ""
+"<p>...that Rosegarden can export certain things to LilyPond that it cannot "
+"yet\n"
+"display within its own native interface?<br><br>These new directives can be "
+"inserted\n"
+"via the <b>T</b> text insert tool in the notation view.<br><br>\n"
+"Load the example files\n"
+"<b>lilypond-alternative-endings.rg</b> and <b>lilypond-directives.rg</b> for "
+"a\n"
+"demonstration of how to use the new exportable directives.<br><br>\n"
+"Use <b>File -> Preview with\n"
+"LilyPond</b> to see what they look like on the exported page.<br><br>\n"
+"<i>Be sure to turn on\n"
+"<b>Settings -> Show LilyPond Directives</b> and <b>Show Annotations</b> "
+"within\n"
+"the notation view.</i></p>\n"
+msgstr ""
+"<p>...dat Rosegarden bepaalde dingen naar LilyPond kan exporteren die de "
+"eigen interface nog niet kan weergeven?<br><br>Deze nieuwe directieven "
+"kunnen via het <b>T</b> tekst-gereedschap in de notatie-view ingevoegd "
+"worden.<br><br>Laad de voorbeeld-bestanden<b>lilypond-alternative-endings."
+"rg</b> en <b>lilypond-directives.rg</b> voor een demonstratie van hoe de "
+"nieuwe exporteerbare directieven te gebruiken zijn.<br><br>Gebruik "
+"<b>Bestand -> Preview met LilyPond</b> om te zien hoe de geëxporteerde "
+"pagina eruit komt te zien.<br><br> <i>Zorg wel dat <b>Instellingen -> Toon "
+"LilyPond-directieven</b> en <b>Toon annotaties</b> in de notatie-view "
+"aangeschakeld staan.</i></p>\n"
+
+#: ../docs/en/tips.cpp:264
+msgid ""
+"<p>...that Rosegarden has track parameters allowing you to <b>Create "
+"segments with:</b> certain\n"
+"properties by default?<br><br>You can pre-select the clef, transposition, "
+"colour, and specify\n"
+"the highest and lowest playable notes (notes outside this range display in\n"
+"red by default). Then draw a segment with the pencil, or record one, and "
+"any\n"
+"new segments created on this track will take these properties as segment\n"
+"parameters.<br><br>\n"
+"<i>These parameters do not apply to audio tracks.</i></p>\n"
+msgstr ""
+"<p>...dat Rosegarden spoorparameters heeft, zodat <b>Creëer segmenten met:</"
+"b> bepaalde standaard eigenschappen mogelijk is?<br><br>u kunt de sleutel "
+"voorselecteren, net als de transpositie, kleur, en de hoogst en laagst "
+"speelbare noten aangeven (noten buiten dit bereik krijgen standaard een rode "
+"kleur). Teken vervolgens een segment met het potlood, of neem er een op, en "
+"de nieuwe segmenten op dit spoor krijgen deze eigenschappen als segment-"
+"parameters.<br><br>\n"
+"<i>Deze parameters zijn niet van toepassing op audio-sporen.</i></p>\n"
+
+#: ../docs/en/tips.cpp:275
+msgid ""
+"<p>...that Rosegarden has a database of preset parameters describing more "
+"than 300\n"
+"musical instruments from the real world, grouped into several convenient\n"
+"categories?<br><br>Each preset contains a clef, transposition, and playable "
+"range\n"
+"suggestions for both amateur and professional players.<br><br>Click the\n"
+"<b>Load</b> button in the new track parameters box to get started! <i>(If "
+"you\n"
+"do not see a <b>Load</b> button, be sure your parameter panel is set for\n"
+"tabbed mode, rather than stacked mode.)</i> <br><br> <i>(Special thanks to "
+"Magnus\n"
+"Johansson for assembling this extraordinary database.)</i></p>\n"
+msgstr ""
+"<p>...dat Rosegarden een database heeft met preset-parameters die meer dan "
+"300 in het echt bestaande instrumenten beschrijven, gegroepeerd in "
+"verscheidene handige categorieën?<br><br>Elke preset bevat een sleutel, "
+"transpositie, en suggesties over het speelbaar bereik voor zowel amateurs "
+"als professionele spelers.<br><br>Klik de knop <b>Laden</b> in de box met "
+"spoorparameters om aan de slag te gaan! <i>(Als u geen knop <b>Laden</b> "
+"ziet, zorg dan eerst dat het parameterpaneel in tabblad-modus staat, ipv. "
+"gestapeld.)</i> <br><br> <i>(Met speciale dank aan Magnus Johansson die deze "
+"buitengewone database heeft samengesteld.)</i></p>\n"
+
+#: ../docs/en/tips.cpp:287
+msgid ""
+"<p>...that when exporting to Lilypond, you can merge tracks that have the "
+"same name onto a single staff?<br><br>For example, if there are three voices "
+"in a single part, write each\n"
+"voice as an independent segment/staff, each on a separate track. Give all\n"
+"three tracks the same name, and select <b>[x] Merge tracks that have the "
+"same\n"
+"name</b> from the options dialog that appears when you export to, or "
+"preview\n"
+"with LilyPond.<br><br>\n"
+"<i>The tracks must have a non-default name for this to work.</i></p>\n"
+msgstr ""
+"<p>... dat als u naar LilyPond exporteert, u sporen met dezelfde naam naar "
+"een enkele notenbalk kan samenvoegen?<br><br>Als er bijvoorbeeld drie "
+"stemmen in een enkele partij staan, schrijf dan elke stem als een "
+"onafhankelijk segment/notenbalk, elk op een apart spoor. Geef alledrie de "
+"sporen dezelfde naam, en selecteer <b>[x] Voeg gelijknamige sporen samen</b> "
+"in het opties-dialoogvenster dat verschijnt als u exporteert naar, of "
+"previewt met, LilyPond.<br><br>\n"
+"<i>Om dit te laten werken mogen de sporen geen standaardnaam hebben</i></p>\n"
+
+#: ../docs/en/tips.cpp:297
+msgid ""
+" \t \n"
+"<p>...that you can use the mouse wheel to scroll up and down, scroll left "
+"and right, and zoom in and out?<br><br>Just roll the wheel to scroll up or "
+"down. Hold Alt as well to scroll left or right, or hold Ctrl to zoom in and "
+"out.</p> \t \n"
+msgstr ""
+" \t \n"
+"<p>...dat u het muiswiel kan gebruiken om op en neer te scrollen, links en "
+"rechts te scrollen, en in en uit te zoomen?<br><br>Rol met het wiel om op en "
+"neer te scrollen. Met Alt erbij scrollt u links of rechts, of gebruik Ctrl "
+"om in en uit te zoomen.</p> \t \n"
+
+#: ../docs/en/tips.cpp:303
+msgid ""
+" \t \n"
+"<p>...that you can time-stretch an audio segment -- stretching or squashing "
+"a\n"
+"sample to a different duration without changing its pitch -- just by\n"
+"dragging its right edge with the Ctrl key pressed?</p>\n"
+msgstr ""
+" \t \n"
+"<p>...dat u een audiosegment kunt time-stretchen -- een sample in de tijd "
+"oprekken of samenpersen zonder de toonhoogtes te veranderen -- gewoon door "
+"de rechter zijkant met de Ctrl-toets ingedrukt te verslepen?</p>\n"
+
+#: ../docs/en/tips.cpp:311
+msgid ""
+" \t \n"
+"<p>...that you can add audio to your Rosegarden composition just by dragging "
+"an audio file from your file manager and dropping it on the Rosegarden "
+"segment canvas? (Make sure you drop it on an audio track!)<br><br>You can "
+"also drop audio files from Rosegarden's audio file manager window onto the "
+"segment canvas, and from other programs onto the audio file manager.</p>\n"
+msgstr ""
+" \t \n"
+"<p>...dat u audio aan uw Rosegarden-compositie kan toevoegen door een "
+"audiobestand vanuit uw bestandsbeheerder naar het Rosegarden segment-canvas "
+"te verslepen? (Zorg wel dat u hem naar een audio-spoor sleept!)<br><br>u "
+"kunt ook audiobestanden vanuit Rosegarden's audiobestanden-beheerwindow naar "
+"het segment-canvas verslepen, en vanui andere programma's naar de "
+"audiobestandsbeheerder.</p>\n"
+
+#: ../docs/en/tips.cpp:317
+msgid ""
+" \t \n"
+"<p>...that you can set the tempo to match the duration of an audio segment "
+"if you know it's an exact number of bars or beats long?<br><br>Just select "
+"the audio segment and use <b>Composition -> Tempo and Time Signature -> Set "
+"Tempo to Audio Segment Duration</b>.</p>\n"
+msgstr ""
+" \t \n"
+"<p>...dat u het tempo kunt aanpassen aan de lengte van een audiobestand als "
+"u weet dat het een exact aantal maten of tellen lang is?<br><br>Selecteer "
+"het audio-segment en gebruik <b>Compositie -> Tempo en maatsoort -> Stel "
+"Tempo in op Audio Segment Duur</b>.</p>\n"
+
+#: ../data/fonts/mappings/fonts.cpp:1
+msgid "Feta Pixmaps"
+msgstr "Feta Pixmaps"
+
+#: ../data/fonts/mappings/fonts.cpp:2 ../data/fonts/mappings/fonts.cpp:7
+msgid "GNU Lilypond"
+msgstr "GNU Lilypond"
+
+#: ../data/fonts/mappings/fonts.cpp:3 ../data/fonts/mappings/fonts.cpp:8
+msgid "Copyright (c) 1997--2003 Han-Wen Nienhuys and Jan Nieuwenhuizen"
+msgstr "Auteursrecht (c) 1997--2003 Han-Wen Nienhuys en Jan Nieuwenhuizen"
+
+#: ../data/fonts/mappings/fonts.cpp:4 ../data/fonts/mappings/fonts.cpp:9
+#: ../data/fonts/mappings/fonts.cpp:14 ../data/fonts/mappings/fonts.cpp:19
+#: ../data/fonts/mappings/fonts.cpp:24 ../data/fonts/mappings/fonts.cpp:29
+#: ../data/fonts/mappings/fonts.cpp:34 ../data/fonts/mappings/fonts.cpp:39
+#: ../data/fonts/mappings/fonts.cpp:44 ../data/fonts/mappings/fonts.cpp:49
+#: ../data/fonts/mappings/fonts.cpp:54
+msgid "Chris Cannam"
+msgstr "Chris Cannam"
+
+#: ../data/fonts/mappings/fonts.cpp:5 ../data/fonts/mappings/fonts.cpp:40
+msgid "pixmap"
+msgstr "pixmap"
+
+#: ../data/fonts/mappings/fonts.cpp:6
+msgid "Feta"
+msgstr "Feta"
+
+#: ../data/fonts/mappings/fonts.cpp:10 ../data/fonts/mappings/fonts.cpp:15
+#: ../data/fonts/mappings/fonts.cpp:20 ../data/fonts/mappings/fonts.cpp:25
+#: ../data/fonts/mappings/fonts.cpp:30 ../data/fonts/mappings/fonts.cpp:35
+#: ../data/fonts/mappings/fonts.cpp:45 ../data/fonts/mappings/fonts.cpp:50
+#: ../data/fonts/mappings/fonts.cpp:55
+msgid "scalable"
+msgstr "Schaalbaar"
+
+#: ../data/fonts/mappings/fonts.cpp:11
+msgid "Fughetta"
+msgstr "Fughetta"
+
+#: ../data/fonts/mappings/fonts.cpp:12
+msgid ""
+"Created by Blake Hodgetts; freely redistributable. See http://www.efn.org/"
+"~bch/aboutfonts.html"
+msgstr ""
+"Gemaakt door Blake Hodgetts; vrij herverspreidbaar.Kijk op http://www.efh."
+"org/~bch/aboutfonts.html"
+
+#: ../data/fonts/mappings/fonts.cpp:13
+msgid "Copyright 1995-1999 Blake Hodgetts"
+msgstr "Auteursrecht (c) 1995-1999 Blake Hodgetts"
+
+#: ../data/fonts/mappings/fonts.cpp:16
+msgid "Inkpen"
+msgstr "Inkpen"
+
+#: ../data/fonts/mappings/fonts.cpp:17
+msgid "Inkpen is part of Sibelius, but other fonts may use the same mappings."
+msgstr ""
+"Inkpen is onderdeel van Sibelius, maar andere lettertypen gebruiken mogelijk "
+"dezelfde mappings."
+
+#: ../data/fonts/mappings/fonts.cpp:18 ../data/fonts/mappings/fonts.cpp:28
+msgid "Copyright Sibelius Software Ltd"
+msgstr "Auteursrecht (c) Sibelius Software Ltd"
+
+#: ../data/fonts/mappings/fonts.cpp:21
+msgid "Maestro"
+msgstr "Maestro"
+
+#: ../data/fonts/mappings/fonts.cpp:22
+msgid "Maestro is part of Finale, but other fonts use the same mappings."
+msgstr ""
+"Maestro is onderdeel van Finale, maar andere lettertypen gebruiken mogelijk "
+"dezelfde mappings."
+
+#: ../data/fonts/mappings/fonts.cpp:23 ../data/fonts/mappings/fonts.cpp:33
+msgid "Copyright Coda Inc"
+msgstr "Auteursrecht (c) Coda Inc"
+
+#: ../data/fonts/mappings/fonts.cpp:27
+msgid "Opus is part of Sibelius, but other fonts may use the same mappings."
+msgstr ""
+"Opus is onderdeel van Sibelius, maar andere lettertypen gebruiken mogelijk "
+"dezelfde mappings."
+
+#: ../data/fonts/mappings/fonts.cpp:31
+msgid "Petrucci"
+msgstr "Petrucci"
+
+#: ../data/fonts/mappings/fonts.cpp:32
+msgid "Petrucci is part of Finale, but other fonts use the same mappings."
+msgstr ""
+"Petrucci is onderdeel van Finale, maar andere lettertypen gebruiken mogelijk "
+"dezelfde mappings."
+
+#: ../data/fonts/mappings/fonts.cpp:36
+msgid "RG21"
+msgstr "RG21"
+
+#: ../data/fonts/mappings/fonts.cpp:37
+msgid "Rosegarden 2.1"
+msgstr "Rosegarden 2.1"
+
+#: ../data/fonts/mappings/fonts.cpp:38
+msgid "Copyright (c) 1994--2001 Chris Cannam"
+msgstr "Auteursrecht (c) 1994--2001 Chris Cannam"
+
+#: ../data/fonts/mappings/fonts.cpp:41
+msgid "Sonata"
+msgstr "Sonata"
+
+#: ../data/fonts/mappings/fonts.cpp:42
+msgid "Adobe"
+msgstr "Adobe"
+
+#: ../data/fonts/mappings/fonts.cpp:43
+msgid "Copyright Adobe Inc"
+msgstr "Auteursrecht (c) Adobe Inc"
+
+#: ../data/fonts/mappings/fonts.cpp:46
+msgid "Steinberg"
+msgstr "Steinberg"
+
+#: ../data/fonts/mappings/fonts.cpp:47
+msgid "The Steinberg Notation font is part of Cubase."
+msgstr "Het notatie-letterytype Steinberg is onderdeel van Cubase."
+
+#: ../data/fonts/mappings/fonts.cpp:48
+msgid "Copyright Steinberg Inc"
+msgstr "Auteursrecht (c) Steinberg Inc"
+
+#: ../data/fonts/mappings/fonts.cpp:51
+msgid "Xinfonia"
+msgstr "Xinfonia"
+
+#: ../data/fonts/mappings/fonts.cpp:52
+msgid "xemo.org"
+msgstr "xemo.org"
+
+#: ../data/fonts/mappings/fonts.cpp:53
+msgid "Copyright 2001-2003 Xemus Software LLC"
+msgstr "Auteursrecht (c) 2001-2003 Xemus Software LLC"
+
+#: ../data/styles/styles.cpp:1
+msgid "Classical"
+msgstr "Klassiek"
+
+#: ../data/styles/styles.cpp:2
+msgid "Cross"
+msgstr "Kruis"
+
+#: ../data/styles/styles.cpp:3
+msgid "Mensural"
+msgstr "Mensuraal"
+
+#: ../data/styles/styles.cpp:4
+msgid "Triangle"
+msgstr "Driehoek"
diff --git a/po/pl.po b/po/pl.po
new file mode 100644
index 0000000..552713c
--- /dev/null
+++ b/po/pl.po
@@ -0,0 +1,12061 @@
+# translation of pl_PL.po to Polish
+# translation of rosegarden.po to Polish
+# Copyright (C) 2006 Free Software Foundation, Inc.
+# Piotr Sawicki <[email protected]>, 2006.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pl_PL\n"
+"POT-Creation-Date: 2008-04-24 18:19-0400\n"
+"PO-Revision-Date: 2006-10-01 23:33+0200\n"
+"Last-Translator: Piotr Sawicki <[email protected]>\n"
+"Language-Team: Polish <[email protected]>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.10.1\n"
+
+#: ../src/gui/dialogs/RescaleDialog.cpp:51 rc.cpp:192 rc.cpp:312
+#, no-c-format
+msgid "Rescale"
+msgstr "Przeskaluj"
+
+#: ../src/gui/dialogs/RescaleDialog.cpp:56
+msgid "Duration of selection"
+msgstr "Czas trwania zaznaczenia"
+
+#: ../src/gui/dialogs/RescaleDialog.cpp:62
+msgid "Adjust times of following events accordingly"
+msgstr "Dopasuj odpowiednio współrzędne do następujących komunikatów"
+
+#: ../src/gui/dialogs/PitchDialog.cpp:45
+#: ../src/gui/dialogs/RescaleDialog.cpp:72
+#: ../src/gui/dialogs/TimeDialog.cpp:51 ../src/gui/dialogs/TimeDialog.cpp:68
+#: ../src/gui/studio/BankEditorDialog.cpp:109
+msgid "Reset"
+msgstr "Wyzeruj"
+
+#: ../src/commands/segment/SegmentSplitByPitchCommand.cpp:46
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:46
+msgid "Split by Pitch"
+msgstr "Rozdziel według wysokości"
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:54
+msgid "Starting split pitch"
+msgstr "Rozpoczynanie rozdziału według wysokości"
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:57
+msgid "Range up and down to follow music"
+msgstr "Zakres w górę i w dół zgodnie z muzyką"
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:63
+msgid "Duplicate non-note events"
+msgstr "Duplikuj komunikaty nie-nuty"
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:66
+msgid "Clef handling:"
+msgstr "Obsługa kluczy:"
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:69
+msgid "Leave clefs alone"
+msgstr "Zostaw klucze w spokoju"
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:70
+msgid "Guess new clefs"
+msgstr "Odgadnij nowe klucze"
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:71
+msgid "Use treble and bass clefs"
+msgstr "Użyj klucza wiolinowego i basowego"
+
+#: ../src/gui/dialogs/DocumentConfigureDialog.cpp:64
+msgid "Document Properties"
+msgstr "Właściwości Dokumentu"
+
+#: ../src/gui/dialogs/MakeOrnamentDialog.cpp:45
+#: ../src/gui/editors/notation/NotationView.cpp:6048
+msgid "Make Ornament"
+msgstr "Zrób Ozdobnik"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:183
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:179
+#: ../src/gui/dialogs/EventEditDialog.cpp:128
+#: ../src/gui/dialogs/MakeOrnamentDialog.cpp:49
+#: ../src/gui/studio/DeviceEditorDialog.cpp:74
+#: ../src/gui/studio/NameSetEditor.cpp:72
+#: ../src/gui/widgets/ColourTable.cpp:51
+msgid "Name"
+msgstr "Nazwa"
+
+#: ../src/gui/dialogs/MakeOrnamentDialog.cpp:51
+msgid ""
+"The name is used to identify both the ornament\n"
+"and the triggered segment that stores\n"
+"the ornament's notes."
+msgstr ""
+"Nazwa jest użyta do ozdobnika\n"
+"i sterowanego segmentu\n"
+"który przechowuje nuty trylu."
+
+#: ../src/gui/dialogs/MakeOrnamentDialog.cpp:54
+msgid "Name: "
+msgstr "Nazwa:"
+
+#: ../src/gui/dialogs/MakeOrnamentDialog.cpp:57
+#: ../src/gui/editors/eventlist/EventView.cpp:717
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:92
+msgid "Base pitch"
+msgstr "Nuta bazowa"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:57
+#: ../src/gui/editors/eventlist/EventView.cpp:140
+msgid "Text"
+msgstr "Tekst"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:66
+msgid "Specification"
+msgstr "Specyfikacja"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:68
+msgid "Preview"
+msgstr "Podgląd"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:72
+msgid "Text: "
+msgstr "Tekst:"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:79
+msgid "Style: "
+msgstr "Styl:"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:90
+msgid "Dynamic"
+msgstr "Znaki dynamiki"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:93
+msgid "Direction"
+msgstr "Kierunek"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:96
+msgid "Local Direction"
+msgstr "Kierunek Lokalny"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:63
+#: ../src/gui/dialogs/TextEventDialog.cpp:99
+#: ../src/gui/editors/tempo/TempoView.cpp:91
+msgid "Tempo"
+msgstr "Tempo"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:102
+msgid "Local Tempo"
+msgstr "Lokalne Tempo"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:105
+msgid "Lyric"
+msgstr "Słowa"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:108
+#: ../src/gui/editors/notation/NotationView.cpp:4242
+msgid "Chord"
+msgstr "Akord"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:111
+msgid "Annotation"
+msgstr "Adnotacje"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:114
+msgid "LilyPond Directive"
+msgstr "Dyrektywa Lilypond"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:138
+msgid "Verse: "
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:148
+msgid "Dynamic: "
+msgstr "Znaki dynamiki:"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:152
+msgid "ppp"
+msgstr "ppp"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:153
+msgid "pp"
+msgstr "pp"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:154
+msgid "p"
+msgstr "p"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:155
+msgid "mp"
+msgstr "mp"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:156
+msgid "mf"
+msgstr "mf"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:157
+msgid "f"
+msgstr "f"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:158
+msgid "ff"
+msgstr "ff"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:159
+msgid "fff"
+msgstr "fff"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:160
+msgid "rfz"
+msgstr "rfz"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:161
+msgid "sf"
+msgstr "sf"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:165
+msgid "Direction: "
+msgstr "Kierunek:"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:174
+msgid " ,"
+msgstr " ,"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:175
+msgid "D.C. al Fine"
+msgstr "D.C. al Fine"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:176
+msgid "D.S. al Fine"
+msgstr "D.S. al Fine"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:177
+msgid "Fine"
+msgstr "Fine"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:178
+msgid "D.S. al Coda"
+msgstr "D.S. al Coda"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:179
+msgid "to Coda"
+msgstr "to Coda"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:180
+msgid "Coda"
+msgstr "Coda"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:184
+msgid "Local Direction: "
+msgstr "Lokalny Kierunek:"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:188
+msgid "accel."
+msgstr "accel."
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:189
+msgid "ritard."
+msgstr "ritard."
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:190
+msgid "ralletando"
+msgstr "ralletando"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:191
+msgid "a tempo"
+msgstr "a tempo"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:192
+msgid "legato"
+msgstr "legato"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:193
+msgid "simile"
+msgstr "simile"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:194
+msgid "pizz."
+msgstr "pizz."
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:195
+msgid "arco"
+msgstr "arco"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:196
+msgid "non vib."
+msgstr "non vib."
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:197
+msgid "sul pont."
+msgstr "sul pont."
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:198
+#: ../src/gui/dialogs/TextEventDialog.cpp:200
+msgid "sul tasto"
+msgstr "sul tasto"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:199
+msgid "con legno"
+msgstr "con legno"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:201
+msgid "sul G"
+msgstr "sul G"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:202
+msgid "ordinario"
+msgstr "ordinario"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:203
+msgid "Muta in "
+msgstr "Muta in "
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:204
+msgid "volti subito "
+msgstr "volti subito "
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:205
+msgid "soli"
+msgstr "soli"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:206
+msgid "div."
+msgstr "div."
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:210
+msgid "Tempo: "
+msgstr "Tempo: "
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:214
+#: ../src/gui/dialogs/TextEventDialog.cpp:238
+msgid "Grave"
+msgstr "Grave"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:215
+#: ../src/gui/dialogs/TextEventDialog.cpp:239
+msgid "Adagio"
+msgstr "Adagio"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:216
+#: ../src/gui/dialogs/TextEventDialog.cpp:240
+msgid "Largo"
+msgstr "Largo"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:217
+#: ../src/gui/dialogs/TextEventDialog.cpp:241
+msgid "Lento"
+msgstr "Lento"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:218
+#: ../src/gui/dialogs/TextEventDialog.cpp:242
+msgid "Andante"
+msgstr "Andante"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:219
+#: ../src/gui/dialogs/TextEventDialog.cpp:243
+msgid "Moderato"
+msgstr "Moderato"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:220
+#: ../src/gui/dialogs/TextEventDialog.cpp:244
+msgid "Allegretto"
+msgstr "Allegretto"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:221
+#: ../src/gui/dialogs/TextEventDialog.cpp:245
+msgid "Allegro"
+msgstr "Allegro"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:222
+#: ../src/gui/dialogs/TextEventDialog.cpp:246
+msgid "Vivace"
+msgstr "Vivace"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:223
+#: ../src/gui/dialogs/TextEventDialog.cpp:247
+msgid "Presto"
+msgstr "Presto"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:224
+#: ../src/gui/dialogs/TextEventDialog.cpp:248
+msgid "Prestissimo"
+msgstr "Prestissimo"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:225
+#: ../src/gui/dialogs/TextEventDialog.cpp:249
+msgid "Maestoso"
+msgstr "Maestoso"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:226
+#: ../src/gui/dialogs/TextEventDialog.cpp:250
+msgid "Sostenuto"
+msgstr "Sostenuto"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:227
+#: ../src/gui/dialogs/TextEventDialog.cpp:251
+msgid "Tempo Primo"
+msgstr "Tempo Primo"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:234
+msgid "Local Tempo: "
+msgstr "Tempo Lokalne: "
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:255
+msgid "Directive: "
+msgstr "Dyrektywa:"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:312
+msgid "Example"
+msgstr "Przykład"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:65
+msgid "Event Filter"
+msgstr "Filtr Komunikatów"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:86
+msgid "Note Events"
+msgstr "Komunikaty Nuta"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:90
+msgid "lowest:"
+msgstr ""
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:93
+msgid "highest:"
+msgstr ""
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:96
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:141
+#: ../src/gui/widgets/PitchChooser.cpp:53
+msgid "Pitch:"
+msgstr "Wysokość:"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:99
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:163
+msgid "Velocity:"
+msgstr "Prędkość uderzenia (velocity):"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:102
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:129
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:257
+msgid "Duration:"
+msgstr "Czas trwania:"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:107
+#: ../src/gui/dialogs/EventFilterDialog.cpp:114
+#: ../src/gui/dialogs/EventFilterDialog.cpp:121
+msgid "include"
+msgstr "zawrzyj"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:108
+#: ../src/gui/dialogs/EventFilterDialog.cpp:115
+#: ../src/gui/dialogs/EventFilterDialog.cpp:122
+msgid "exclude"
+msgstr "pomiń"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:136
+#: ../src/gui/dialogs/EventFilterDialog.cpp:155
+#: ../src/gui/editors/eventlist/EventView.cpp:172
+#: ../src/gui/editors/eventlist/EventView.cpp:179
+#: ../src/gui/editors/eventlist/EventView.cpp:186
+msgid "edit"
+msgstr "edytuj"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:141
+#: ../src/gui/dialogs/EventFilterDialog.cpp:157
+msgid "choose a pitch using a staff"
+msgstr "wybierz dźwięk za pomocą pięciolinii"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:182
+#: ../src/gui/dialogs/EventFilterDialog.cpp:188
+msgid "longest"
+msgstr ""
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:200
+msgid "Include all"
+msgstr "Zawrzyj wszystko"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:203
+msgid "Include entire range of values"
+msgstr "Zawrzyj cały zakres wartości"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:206
+msgid "Exclude all"
+msgstr "Wyklucz wszystko"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:209
+msgid "Exclude entire range of values"
+msgstr "Wyklucz cały zakres wartości"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:233
+#: ../src/gui/dialogs/EventFilterDialog.cpp:234
+#, fuzzy
+msgid "shortest"
+msgstr "pauza"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:333
+#, fuzzy
+msgid "Lowest pitch"
+msgstr "Wysokość dźwięku:"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:343
+#, fuzzy
+msgid "Highest pitch"
+msgstr "Wysokość klawisza:"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:56
+#: ../src/gui/editors/notation/NotationView.cpp:1619
+#: ../src/gui/editors/notation/NotationView.cpp:6088
+msgid "Use Ornament"
+msgstr "Użyj Ozdobnika"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:260
+#: ../src/gui/configuration/NotationConfigurationPage.h:64
+#: ../src/gui/configuration/NotationConfigurationPage.h:65
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:63
+msgid "Notation"
+msgstr "Notacja"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:68
+msgid "Display as: "
+msgstr "Wyświetl jako:"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:84
+msgid "Trill"
+msgstr "Tryl"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:84
+msgid "Trill with line"
+msgstr "Tryl z linią"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:84
+msgid "Trill line only"
+msgstr "Tylko Linia Trylu"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:85
+msgid "Turn"
+msgstr "Zawróć"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:85
+msgid "Mordent"
+msgstr "Mordent"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:85
+msgid "Inverted mordent"
+msgstr "Odwrócony Mordent"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:86
+msgid "Long mordent"
+msgstr "Długi Mordent"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:86
+msgid "Long inverted mordent"
+msgstr "Długi odwrócony mordent"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:94
+msgid "Text mark"
+msgstr "Oznaczenie tekstowe"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:98
+msgid " Text: "
+msgstr "Tekst:"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:104
+msgid "Performance"
+msgstr "Wykonanie"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:109
+msgid "Perform using triggered segment: "
+msgstr "Wykonaj używając sterowanego segmentu:"
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:75
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:123
+msgid "Perform with timing: "
+msgstr "Wykonaj z tym czasem:"
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:81
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:129
+msgid "As stored"
+msgstr "Jak zapisano"
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:82
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:130
+msgid "Truncate if longer than note"
+msgstr "Skróć jeśli dłużej niż nuta"
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:83
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:131
+msgid "End at same time as note"
+msgstr "Skończ w tym samym czasie co nuta"
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:84
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:132
+msgid "Stretch or squash segment to note duration"
+msgstr "Skurcz, lub zagęść segment do czasu trwania nuty"
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:86
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:134
+msgid "Adjust pitch to note"
+msgstr "Przypisz wysokość do nuty"
+
+#: ../src/gui/dialogs/PitchPickerDialog.cpp:40
+msgid "Pitch Selector"
+msgstr "Wybierak dźwięku"
+
+#: ../src/gui/dialogs/BeatsBarsDialog.cpp:44
+msgid "Audio Segment Duration"
+msgstr "Czas trwania segmentu Audio"
+
+#: ../src/gui/dialogs/BeatsBarsDialog.cpp:50
+msgid "The selected audio segment contains:"
+msgstr "Wybrany segment audio zawiera:"
+
+#: ../src/gui/dialogs/BeatsBarsDialog.cpp:59
+msgid "beat(s)"
+msgstr "miar"
+
+#: ../src/gui/dialogs/BeatsBarsDialog.cpp:60
+msgid "bar(s)"
+msgstr "takt(ów)"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:51
+msgid "Tuplet"
+msgstr "Duola i Inne"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:58
+msgid "New timing for tuplet group"
+msgstr "Nowy czas dla grup duolowych itp"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:76
+msgid "Play "
+msgstr "Odtwarzaj"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:98
+msgid "in the time of "
+msgstr "w czasie "
+
+#: ../src/gui/dialogs/TupletDialog.cpp:104
+msgid "Timing is already correct: update display only"
+msgstr "Czas jest prawidłowy: aktualizuj tylko wyświetlanie"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:114
+msgid "Timing calculations"
+msgstr "Kalkulacje czasu"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:120
+msgid "Selected region:"
+msgstr "Zaznacz region:"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:129
+msgid "Group with current timing:"
+msgstr "Zgrupuj z bieżącym czasem:"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:135
+msgid "Group with new timing:"
+msgstr "Zgrupuj z nowym czasem:"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:141
+msgid "Gap created by timing change:"
+msgstr "Dziura stworzona poprzez zmianę czasu:"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:149
+msgid "Unchanged at end of selection:"
+msgstr "Bez zmian na końcu zaznaczenia:"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:63 rc.cpp:372
+#, no-c-format
+msgid "Metronome"
+msgstr "Metronom"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:77
+msgid "Metronome Instrument"
+msgstr "Instrument Metronomu"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:82
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:150
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:183
+#: ../src/gui/studio/DeviceEditorDialog.cpp:73
+#: ../src/gui/studio/DeviceManagerDialog.cpp:105
+#: ../src/gui/studio/DeviceManagerDialog.cpp:163
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:66
+msgid "Device"
+msgstr "Urządzenie"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:101
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:89
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:215
+#: ../src/gui/studio/DeviceEditorDialog.cpp:195
+#: ../src/gui/studio/DeviceEditorDialog.cpp:218
+#: ../src/gui/studio/DeviceEditorDialog.cpp:230
+#: ../src/gui/studio/DeviceManagerDialog.cpp:196
+#: ../src/gui/studio/DeviceManagerDialog.cpp:440
+#: ../src/gui/studio/DeviceManagerDialog.cpp:452
+msgid "No connection"
+msgstr "Brak połączenia"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:112
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:111
+#: ../src/gui/editors/parameters/InstrumentParameterBox.cpp:53
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:1209
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:159
+#: ../src/gui/general/PresetHandlerDialog.cpp:92
+#: ../src/gui/studio/MidiMixerWindow.cpp:204
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:67
+msgid "Instrument"
+msgstr "Kanał MIDI"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:118
+msgid "Beats"
+msgstr "Miary"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:184
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:123
+msgid "Resolution"
+msgstr "Rozdzielczość"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:309
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:139
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:205
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:125
+#: ../src/gui/editors/matrix/MatrixView.cpp:2132
+#: ../src/gui/editors/notation/NotationView.cpp:1582
+#: ../src/gui/widgets/QuantizeParameters.cpp:128
+#: ../src/gui/widgets/QuantizeParameters.cpp:301
+msgid "None"
+msgstr "Brak"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:126
+msgid "Bars only"
+msgstr "Tylko takty"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:127
+msgid "Bars and beats"
+msgstr "Takty i miary"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:128
+msgid "Bars, beats, and divisions"
+msgstr "Takty, miary, i podziały"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:132
+msgid "Bar velocity"
+msgstr "Prędkość uderzenia taktu"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:139
+msgid "Beat velocity"
+msgstr "Prędkość uderzenia pulsu"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:146
+msgid "Sub-beat velocity"
+msgstr "Prędkość uderzenia podziałów"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:155
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:324
+msgid "Pitch"
+msgstr "Wysokość"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:160
+msgid "for Bar"
+msgstr "dla Taktu"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:161
+msgid "for Beat"
+msgstr "dla Pulsu"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:162
+msgid "for Sub-beat"
+msgstr "dla Podziału"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:166
+msgid "Metronome Activated"
+msgstr "Metronom Aktywowano"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:167
+msgid "Playing"
+msgstr "Odtwarzanie"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:168
+msgid "Recording"
+msgstr "Nagrywanie"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:46
+msgid "Choose Text Encoding"
+msgstr "Wybierz Kodowanie Tekstu"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:50
+msgid ""
+"\n"
+"This file contains text in an unknown language encoding.\n"
+"\n"
+"Please select one of the following estimated text encodings\n"
+"for use with the text in this file:\n"
+msgstr ""
+"\n"
+"Ten plik zawiera tekst zapisany w nieznanym kodowaniu.\n"
+"\n"
+"Proszę wybrać jedno z pasujących kodowań tekstu\n"
+"do używania z tym plikiem:\n"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:61
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:77
+msgid "Japanese Shift-JIS"
+msgstr "Japoński Shift-JIS"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:62
+msgid "Unicode variable-width"
+msgstr "Wspólny-Kod różna szerokość"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:63
+msgid "Western Europe"
+msgstr "Europa Zachodnia"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:64
+msgid "Western Europe + Euro"
+msgstr "Europa Zachodnia + Euro"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:65
+msgid "Eastern Europe"
+msgstr "Europa Wschodnia"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:66
+msgid "Southern Europe"
+msgstr "Europa Południowa"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:67
+msgid "Northern Europe"
+msgstr "Europa Północna"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:68
+msgid "Cyrillic"
+msgstr "Cyrylica"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:69
+msgid "Arabic"
+msgstr "Arabski"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:70
+msgid "Greek"
+msgstr "Grecki"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:71
+msgid "Hebrew"
+msgstr "Hebrajski"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:72
+msgid "Turkish"
+msgstr "Turecki"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:73
+msgid "Nordic"
+msgstr "Nordycki"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:74
+msgid "Thai"
+msgstr "Tajski"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:75
+msgid "Baltic"
+msgstr "Bałtycki"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:76
+msgid "Celtic"
+msgstr "Celtycki"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:78
+msgid "Traditional Chinese"
+msgstr "Tradycyjny Chiński"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:79
+msgid "Simplified Chinese"
+msgstr "Chiński Uproszczony"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:80
+msgid "Russian"
+msgstr "Rosyjski"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:81
+msgid "Ukrainian"
+msgstr "Ukraiński"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:82
+msgid "Tamil"
+msgstr "Tamil"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:117
+#, c-format
+msgid "Microsoft Code Page %1"
+msgstr "Microsoft Code Page %1"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:123
+#: ../src/gui/editors/matrix/MatrixView.cpp:1490
+msgid "%1 (%2)"
+msgstr "%1 (%2)"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:142
+msgid ""
+"\n"
+"Example text from file:"
+msgstr ""
+"\n"
+"Przykładowy tekst z pliku:"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:59
+#: ../src/gui/editors/tempo/TempoView.cpp:92
+msgid "Time Signature"
+msgstr "Metrum"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:82
+msgid "Time signature"
+msgstr "Metrum"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:116
+msgid "Time where signature takes effect"
+msgstr "Współrzędne, gdzie metrum się zmienia"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:83
+#: ../src/gui/dialogs/TempoDialog.cpp:128
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:129
+#: ../src/gui/general/PresetHandlerDialog.cpp:101
+msgid "Scope"
+msgstr "Zakres"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:141
+#, c-format
+msgid "Insertion point is at start of measure %1."
+msgstr "Punkt wstawienia jest na początku taktu %1."
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:145
+#, c-format
+msgid "Insertion point is in the middle of measure %1."
+msgstr "Punkt wstawienia jest w środku taktu %1."
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:150
+msgid "Insertion point is at start of composition."
+msgstr "Punkt wstawienia jest na początku utworu."
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:155
+msgid "Start measure %1 here"
+msgstr "Wstaw na początek taktu %1"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:159
+#, fuzzy, c-format
+msgid "Change time from start of measure %1"
+msgstr "Zmień metrum od początku taktu %1"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:166
+#, c-format
+msgid "Time change will take effect at the start of measure %1."
+msgstr "Zmiana metrum będzie aktywna od początku taktu %1."
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:176
+#, fuzzy
+msgid "Hide the time signature"
+msgstr "Ukryj metrum"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:181
+#, fuzzy
+msgid "Hide the affected bar lines"
+msgstr "Połącz nuty na kreskach taktowych itd"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:186
+msgid "Show as common time"
+msgstr "Pokaż metrum 4/4"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:191
+msgid "Correct the durations of following measures"
+msgstr "Popraw długości kolejnych taktów"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:280
+msgid "Display as common time"
+msgstr "Wyświetl skrót \"C\" zamiast 4/4"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:284
+msgid "Display as cut common time"
+msgstr "Wyświetl metrum jako alla breve"
+
+#: ../src/gui/dialogs/ConfigureDialog.cpp:66
+msgid "Configure Rosegarden"
+msgstr "Configure Rosegarden"
+
+#: ../src/gui/dialogs/MarkerModifyDialog.cpp:53
+#: ../src/gui/dialogs/MarkerModifyDialog.cpp:61
+msgid "Edit Marker"
+msgstr "Edytuj Znacznik"
+
+#: ../src/gui/dialogs/MarkerModifyDialog.cpp:78
+msgid "Marker Time"
+msgstr "Współrzędne Znacznika"
+
+#: ../src/gui/dialogs/MarkerModifyDialog.cpp:94
+msgid "Marker Properties"
+msgstr "Właściwości Znacznika"
+
+#: ../src/gui/dialogs/MarkerModifyDialog.cpp:100
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:554
+msgid "Text:"
+msgstr "Tekst:"
+
+#: ../src/gui/dialogs/MarkerModifyDialog.cpp:104
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:85
+msgid "Description:"
+msgstr "Opis:"
+
+#: ../src/gui/dialogs/FileMergeDialog.cpp:46
+msgid "Merge File"
+msgstr "Scal plik"
+
+#: ../src/gui/dialogs/FileMergeDialog.cpp:53
+msgid "Merge new file "
+msgstr "Scal z nowym plikiem"
+
+#: ../src/gui/dialogs/FileMergeDialog.cpp:56
+msgid "At start of existing composition"
+msgstr "Na początku istniejącego utworu"
+
+#: ../src/gui/dialogs/FileMergeDialog.cpp:57
+msgid "From end of existing composition"
+msgstr "Od końca istniejącego utworu"
+
+#: ../src/gui/dialogs/FileMergeDialog.cpp:61
+msgid "The file has different time signatures or tempos."
+msgstr "Plik ma różne metra i tempa."
+
+#: ../src/gui/dialogs/FileMergeDialog.cpp:62
+msgid "Import these as well"
+msgstr "Importuj je również"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:171
+#: ../src/gui/dialogs/ShowSequencerStatusDialog.cpp:44
+msgid "Sequencer status"
+msgstr "Status sekwencera"
+
+#: ../src/gui/dialogs/ShowSequencerStatusDialog.cpp:48
+msgid "Sequencer status:"
+msgstr "Status sekwencera:"
+
+#: ../src/gui/dialogs/ShowSequencerStatusDialog.cpp:50
+msgid "Status not available."
+msgstr "Status nieosiągalny."
+
+#: ../src/gui/dialogs/ShowSequencerStatusDialog.cpp:57
+msgid "Sequencer is not running or is not responding."
+msgstr "Sekwencer nie pracuje, albo nie odpowiada."
+
+#: ../src/gui/dialogs/ShowSequencerStatusDialog.cpp:64
+msgid "Sequencer is not returning a valid status report."
+msgstr "Sekwencer nie zwraca właściwego raportu statusu."
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:46
+#, fuzzy
+msgid "Add Tracks"
+msgstr "Dodaj &Ścieżkę"
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:54
+msgid "How many tracks do you want to add?"
+msgstr "Ile ścieżek chcesz dodać?"
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:62
+#, fuzzy
+msgid "Add tracks"
+msgstr "Dodaj Wiele Ścieżek"
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:64
+msgid "At the top"
+msgstr ""
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:65
+#, fuzzy
+msgid "Above the current selected track"
+msgstr "Wycisza wszystkie ścieżki oprócz bieżącej"
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:66
+#, fuzzy
+msgid "Below the current selected track"
+msgstr "Wycisza wszystkie ścieżki oprócz bieżącej"
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:67
+msgid "At the bottom"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:75
+msgid "Event Properties"
+msgstr "Właściwości Zdarzenia"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:81
+msgid "Event type:"
+msgstr "Typ komunikaty:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:117
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:251
+#: ../src/gui/editors/segment/MarkerEditor.cpp:97
+msgid "Absolute time:"
+msgstr "Czas Absolutny:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:156
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:323
+msgid "Controller name:"
+msgstr "Nazwa kontrolera:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:157
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:530
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:562
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:563
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:602
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:631
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:267
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:269
+#: ../src/gui/editors/segment/MarkerEditor.cpp:279
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:272
+#: ../src/gui/studio/AudioMixerWindow.cpp:388
+#: ../src/gui/studio/AudioMixerWindow.cpp:519
+#: ../src/gui/studio/AudioMixerWindow.cpp:683
+#: ../src/gui/studio/AudioMixerWindow.cpp:722
+#: ../src/gui/studio/AudioMixerWindow.cpp:904
+#: ../src/gui/studio/SynthPluginManagerDialog.cpp:121
+msgid "<none>"
+msgstr "<brak>"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:174
+msgid "Meta string:"
+msgstr "Meta Łańcuch:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:179
+msgid "Load data"
+msgstr "Załaduj dane"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:181
+msgid "Save data"
+msgstr "Zapisz dane"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:192
+msgid "Notation Properties"
+msgstr "Właściwości Notacji"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:198
+msgid "Lock to changes in performed values"
+msgstr "Zablokuj zmiany w wykonywanych wartościach"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:205
+msgid "Notation time:"
+msgstr "Współrzędne notacji:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:217
+msgid "Notation duration:"
+msgstr "Czas trwania:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:283
+msgid "Note pitch:"
+msgstr "Wysokość dźwięku:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:291
+msgid "Note velocity:"
+msgstr "Szybkość uderzenia dźwięku:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:317
+msgid "Controller number:"
+msgstr "Numer kontrolera"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:326
+msgid "Controller value:"
+msgstr "Wartość kontrolera:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:354
+msgid "Key pitch:"
+msgstr "Wysokość klawisza:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:362
+msgid "Key pressure:"
+msgstr "Nacisk klawisza"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:390
+msgid "Channel pressure:"
+msgstr "Nacisk kanału:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:418
+msgid "Program change:"
+msgstr "Zmiana programu:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:461
+msgid "Data length:"
+msgstr "Długość danych:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:462
+msgid "Data:"
+msgstr "Dane:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:480
+msgid "Pitchbend MSB:"
+msgstr "Wychylenie stroju MSB:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:488
+msgid "Pitchbend LSB:"
+msgstr "Wychylenie stroju LSB"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:523
+msgid "Indication:"
+msgstr "Wskazówka:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:553
+msgid "Text type:"
+msgstr "Typ tekstu:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:596
+msgid "Clef type:"
+msgstr "Rodzaj klucza:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:625
+msgid "Key name:"
+msgstr "Nazwa tonacji:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:674
+msgid "Unsupported event type:"
+msgstr "Nieobsługiwany typ komunikaty:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:931
+msgid "Edit Event Time"
+msgstr "Edytuj Współrzędne Zdarzenia"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:943
+msgid "Edit Event Notation Time"
+msgstr "Edytuj Współrzędne Zapisu Nutowego "
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:955
+msgid "Edit Duration"
+msgstr "Edytuj Czas Trwania"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:968
+msgid "Edit Notation Duration"
+msgstr "Edytuj Czas trwania notacji"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:981
+msgid "Edit Pitch"
+msgstr "Edytuj Wysokość"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:991
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:1016
+msgid "*.syx|System exclusive files (*.syx)"
+msgstr "pliki *.syx|System exclusive (*.syx)"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:992
+msgid "Load System Exclusive data in File"
+msgstr "Załaduj dane System Exclusive do Pliku"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:1017
+msgid "Save System Exclusive data to..."
+msgstr "Zapisz dane System Exclusive do ..."
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:46
+msgid "Locate audio file"
+msgstr "Zlokalizuj pliki audio"
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:50
+msgid "&Skip"
+msgstr "&Pomiń"
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:51
+msgid "Skip &All"
+msgstr "Pomiń &Wszystko"
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:52
+msgid "&Locate"
+msgstr "&Zlokalizuj"
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:57
+msgid ""
+"Can't find file \"%1\".\n"
+"Would you like to try and locate this file or skip it?"
+msgstr ""
+"Nie można odnaleźć pliku \"%1\".\n"
+"Czy chciałbyś spróbować sam go zlokalizować, czy pominąć go?"
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:71
+msgid ""
+"%1|Requested file (%2)\n"
+"*.wav|WAV files (*.wav)"
+msgstr ""
+"%1|Żądany plik (%2)\n"
+"*.wav|WAV pliki (*.wav)"
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:74
+msgid "Select an Audio File"
+msgstr "Wybierz plik Audio"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:53 ../src/gui/dialogs/ClefDialog.cpp:62
+#: ../src/gui/dialogs/ClefDialog.cpp:79 ../src/gui/dialogs/ClefDialog.cpp:90
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:278
+msgid "Clef"
+msgstr "Klucz"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:65
+msgid "Existing notes following clef change"
+msgstr "Istniejące nuty obowiązuje zmiana klucza"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:71
+msgid "Lower clef"
+msgstr "Obniż klucz"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:77
+msgid "Up an Octave"
+msgstr "Oktawę w górę"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:84
+msgid "Down an Octave"
+msgstr "Oktawę w dół"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:88
+msgid "Higher clef"
+msgstr "Podwyższ klucz"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:96
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:152
+msgid "Maintain current pitches"
+msgstr "Zachowaj bieżące wysokości dźwięków"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:99
+msgid "Transpose into appropriate octave"
+msgstr "Transponuj do odpowiedniej oktawy"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:231
+msgid "%1 down an octave"
+msgstr "%1 w dół o oktawę"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:234
+msgid "%1 down two octaves"
+msgstr "%1 w dół o dwie oktawy"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:237
+msgid "%1 up an octave"
+msgstr "%1 w górę o oktawę"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:240
+msgid "%1 up two octaves"
+msgstr "%1 w górę o dwie oktawy"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:249
+msgid "Treble"
+msgstr "Wiolinowy"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:251
+#, fuzzy
+msgid "French violin"
+msgstr "Tłumaczenie na francuski"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:253
+msgid "Soprano"
+msgstr "Sopranowy"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:255
+#, fuzzy
+msgid "Mezzo-soprano"
+msgstr "sopranowy"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:257
+msgid "Alto"
+msgstr "Altowy"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:259
+msgid "Tenor"
+msgstr "Tenorowy"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:261
+#, fuzzy
+msgid "C-baritone"
+msgstr "Wariacje"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:263
+#, fuzzy
+msgid "F-baritone"
+msgstr "Wariacje"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:265
+msgid "Bass"
+msgstr "Basowy"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:267
+#, fuzzy
+msgid "Sub-bass"
+msgstr "basowy"
+
+#: ../src/gui/dialogs/CountdownDialog.cpp:52
+msgid "Recording..."
+msgstr "Nagrywanie..."
+
+#: ../src/gui/dialogs/CountdownDialog.cpp:60
+msgid "Recording time remaining: "
+msgstr "Pozostały czas nagrywania:"
+
+#: ../src/gui/dialogs/CountdownDialog.cpp:120
+msgid "Just how big is your hard disk?"
+msgstr "Tylko jak duży jest twój twardy dysk?"
+
+#: ../src/gui/dialogs/CountdownDialog.cpp:154
+msgid "Recording beyond end of composition: "
+msgstr "Nagrywanie poza punktem końcowym utworu:"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:52
+msgid "Specify Interval"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:58
+msgid "Reference note:"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:59
+#, fuzzy
+msgid "Target note:"
+msgstr "ćwiartka"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:68
+#: ../src/gui/dialogs/IntervalDialog.cpp:315
+msgid "a perfect unison"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:76
+msgid "Effect on Key"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:77
+#, fuzzy
+msgid "Transpose within key"
+msgstr "Transponuj do tej tonacji"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:79
+#, fuzzy
+msgid "Change key for selection"
+msgstr "Bez zmian na końcu zaznaczenia:"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:89
+msgid ""
+"Adjust segment transposition in opposite direction (maintain audible pitch)"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:190
+#: ../src/gui/dialogs/IntervalDialog.cpp:220
+msgid "a diminished"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:192
+#: ../src/gui/dialogs/IntervalDialog.cpp:222
+msgid "an augmented"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:194
+#: ../src/gui/dialogs/IntervalDialog.cpp:224
+msgid "a doubly diminished"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:196
+#: ../src/gui/dialogs/IntervalDialog.cpp:226
+msgid "a doubly augmented"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:198
+#: ../src/gui/dialogs/IntervalDialog.cpp:228
+msgid "a triply diminished"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:200
+#: ../src/gui/dialogs/IntervalDialog.cpp:230
+msgid "a triply augmented"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:202
+msgid "a quadruply diminished"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:204
+#: ../src/gui/dialogs/IntervalDialog.cpp:232
+msgid "a quadruply augmented"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:206
+#: ../src/gui/dialogs/IntervalDialog.cpp:234
+msgid "a perfect"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:208
+#: ../src/gui/dialogs/IntervalDialog.cpp:236
+msgid "an (unknown, %1)"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:216
+#, fuzzy
+msgid "a minor"
+msgstr "Minor"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:218
+#, fuzzy
+msgid "a major"
+msgstr "Major"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:239
+#, fuzzy
+msgid "an (unknown)"
+msgstr "Nieznane"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:248
+#: ../src/gui/dialogs/IntervalDialog.cpp:251
+#, fuzzy
+msgid "%1 octave"
+msgstr "%1 w górę o oktawę"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:254
+#, fuzzy
+msgid "%1 unison"
+msgstr "jednostki"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:258
+#, fuzzy
+msgid "%1 second"
+msgstr "Sekundy:"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:261
+#, fuzzy
+msgid "%1 third"
+msgstr "Inny"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:264
+#, fuzzy
+msgid "%1 fourth"
+msgstr "%1 obniżony"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:267
+#, fuzzy
+msgid "%1 fifth"
+msgstr "Wysokość"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:270
+#, fuzzy
+msgid "%1 sixth"
+msgstr "Wysokość"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:273
+#, fuzzy
+msgid "%1 seventh"
+msgstr "Zmień rozmiar komunikatu"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:276
+#: ../src/gui/studio/DeviceManagerDialog.cpp:329
+#: ../src/gui/studio/DeviceManagerDialog.cpp:363
+#, c-format
+msgid "%1"
+msgstr "%1"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:287
+msgid ""
+"_n: up 1 octave and %1\n"
+"up %n octaves and %1"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:291
+#, c-format
+msgid ""
+"_n: up 1 octave\n"
+"up %n octaves"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:295
+#, fuzzy, c-format
+msgid "up %1"
+msgstr "Szyna %1"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:303
+msgid ""
+"_n: down 1 octave and %1\n"
+"down %n octaves and %1"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:307
+#, fuzzy, c-format
+msgid ""
+"_n: down 1 octave\n"
+"down %n octaves"
+msgstr ""
+"%1 na 1 ścieżce\n"
+"%1 na %n ścieżkach"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:311
+#, fuzzy, c-format
+msgid "down %1"
+msgstr "Od: %1"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:81
+msgid "Intrinsics"
+msgstr ""
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:85
+msgid "Event type: "
+msgstr "Typ komunikatu:"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:91
+msgid "Absolute time: "
+msgstr "Czas absolutny:"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:101
+msgid "Duration: "
+msgstr "Czas trwania:"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:114
+msgid "Sub-ordering: "
+msgstr "Podporządkowanie:"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:125
+msgid "Persistent properties"
+msgstr "Stałe właściwości"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:169
+#: ../src/gui/dialogs/EventEditDialog.cpp:133
+#: ../src/gui/studio/BankEditorDialog.cpp:129
+#: ../src/gui/studio/DeviceEditorDialog.cpp:75
+msgid "Type"
+msgstr "Typ"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:184
+#: ../src/gui/dialogs/EventEditDialog.cpp:135
+#: ../src/gui/dialogs/EventParameterDialog.cpp:89
+#: ../src/gui/dialogs/EventParameterDialog.cpp:93
+#: ../src/gui/dialogs/EventParameterDialog.cpp:115
+msgid "Value"
+msgstr "Wartość"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:155
+msgid "Non-persistent properties"
+msgstr "Właściwości tymczasowe"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:156
+msgid "These are cached values, lost if the event is modified."
+msgstr "To są wartości podręczne, zostaną zgubione przy edycji komunikaty."
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:170
+msgid "Name "
+msgstr "Nazwa"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:172
+msgid "Type "
+msgstr "Typ"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:174
+msgid "Value "
+msgstr "Wartość"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:188
+msgid "Make persistent"
+msgstr "Zrób na stałe"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:292
+msgid "Delete this property"
+msgstr "Kasuj tę właściwość"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:433
+msgid ""
+"Are you sure you want to delete the \"%1\" property?\n"
+"\n"
+"Removing necessary properties may cause unexpected behavior."
+msgstr ""
+"Jesteś pewien, że chcesz skasować właściwość \"%1\"?\n"
+"Usunięcie potrzebnych właściwości może spowodować nieoczekiwane zachowanie."
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:436
+#: ../src/gui/dialogs/EventEditDialog.cpp:469
+msgid "Edit Event"
+msgstr "Edytuj Komunikat"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:465
+msgid ""
+"Are you sure you want to make the \"%1\" property persistent?\n"
+"\n"
+"This could cause problems if it overrides a different computed value later "
+"on."
+msgstr ""
+"Jesteś pewien, że chcesz ustawić na stałe właściwość \"%1\"?\n"
+"\n"
+"To może spowodować problemy, jeśli nadpisze się inne później wyliczone "
+"wartości."
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:470
+msgid "Make &Persistent"
+msgstr "Zrób na %Stałe"
+
+#: ../src/gui/dialogs/PasteNotationDialog.cpp:52
+msgid "Paste type"
+msgstr "Typ wklejenia"
+
+#: ../src/gui/dialogs/PasteNotationDialog.cpp:72
+msgid "Make this the default paste type"
+msgstr "Określ to jako domyślny typ wklejenia"
+
+#: ../src/gui/dialogs/LyricEditDialog.cpp:53
+msgid "Edit Lyrics"
+msgstr "Edytuj Słowa"
+
+#: ../src/gui/dialogs/LyricEditDialog.cpp:62
+msgid "Lyrics for this segment"
+msgstr "Słowa dla tego segmentu"
+
+#: ../src/gui/dialogs/LyricEditDialog.cpp:70
+#, fuzzy
+msgid "Add Verse"
+msgstr "Dodaj &Decrescendo"
+
+#: ../src/gui/dialogs/LyricEditDialog.cpp:84
+#: ../src/gui/dialogs/LyricEditDialog.cpp:106
+#, c-format
+msgid "Verse %1"
+msgstr ""
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:59
+msgid "Import from Device..."
+msgstr "Importuj z Urządzenia..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2163
+#: ../src/gui/application/RosegardenGUIApp.cpp:2229
+#: ../src/gui/application/RosegardenGUIApp.cpp:7780
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:87
+#: ../src/sound/AudioFileManager.cpp:664
+#, c-format
+msgid "Cannot download file %1"
+msgstr "Nie można ściągnąć pliku %1"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:99
+#, c-format
+msgid "Cannot open file %1"
+msgstr "Nie można otworzyć pliku %1"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:106
+#, c-format
+msgid "No devices found in file %1"
+msgstr "Nie znaleziono urządzeń w pliku %1"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:113
+msgid "Source device"
+msgstr "Urządzenie źródłowe"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:118
+msgid "Import from: "
+msgstr "Importuj z: "
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:140
+#: ../src/gui/studio/DeviceEditorDialog.cpp:148
+#, c-format
+msgid "Device %1"
+msgstr "Urządzenie %1"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:155
+msgid "Import banks"
+msgstr "Importuj banki"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:156
+msgid "Import key mappings"
+msgstr "Importuj mapy klawiatury"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:157
+msgid "Import controllers"
+msgstr "Importuj kontrolery"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:160
+msgid "Import device name"
+msgstr "Importuj nazwy urządzeń"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:166
+msgid "Bank import behavior"
+msgstr "zachowanie podczas importu banków"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:168
+msgid "Merge banks"
+msgstr "Scal Banki"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:169
+msgid "Overwrite banks"
+msgstr "Nadpisz banki"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:367
+msgid "Bank %1:%2"
+msgstr "Bank %1:%2"
+
+#: ../src/commands/segment/SegmentSplitByRecordingSrcCommand.cpp:42
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:48
+msgid "Split by Recording Source"
+msgstr "Rozdziel według źródła nagrywania"
+
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:53
+msgid "Recording Source"
+msgstr "Źródło Nagrywania"
+
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:57
+msgid "Channel:"
+msgstr "Kanał:"
+
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:64
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:75
+msgid "any"
+msgstr "jakiekolwiek"
+
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:69
+msgid "Device:"
+msgstr "Urządzenie:"
+
+#: ../src/gui/dialogs/UnusedAudioSelectionDialog.cpp:46
+msgid "Select Unused Audio Files"
+msgstr "Zaznacz Nieużywane Pliki Dźwiękowe"
+
+#: ../src/gui/dialogs/UnusedAudioSelectionDialog.cpp:53
+#: ../src/gui/editors/segment/PlayListView.cpp:36
+msgid "File name"
+msgstr "Nazwa pliku"
+
+#: ../src/gui/dialogs/UnusedAudioSelectionDialog.cpp:54
+msgid "File size"
+msgstr "Rozmiar pliku"
+
+#: ../src/gui/dialogs/UnusedAudioSelectionDialog.cpp:55
+msgid "Last modified date"
+msgstr "Ostatnia Data Modyfikacji"
+
+#: ../src/gui/dialogs/UnusedAudioSelectionDialog.cpp:60
+msgid " (not found) "
+msgstr "(nie znaleziono)"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:105
+msgid "Audio File Manager"
+msgstr "Menadżer Plików Dźwiękowych"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:126
+msgid ""
+"* Some audio files are encoded at a sample rate different from that of the "
+"JACK audio server.\n"
+"Rosegarden will play them at the correct speed, but they will sound "
+"terrible.\n"
+"Please consider resampling such files externally, or adjusting the sample "
+"rate of the JACK server."
+msgstr ""
+"Częstotliwość próbkowania niektórych plików dźwiękowych jest inną niż "
+"serwera JACK.\n"
+"Różany Ogród będzie odtwarzał je z prawidłową prędkością, ale będą strasznie "
+"brzmieć .\n"
+"Proszę rozważyć zewnętrzną zmianę częstotliwości próbkowania tych plików, "
+"albo zmienić częstotliwość próbkowania serwera JACK."
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:132
+msgid "&Add Audio File..."
+msgstr "&Dodaj Plik Dźwiękowy..."
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:135
+msgid "&Unload Audio File"
+msgstr "&Wyładuj Plik Dźwiękowy"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:140
+msgid "&Play Preview"
+msgstr "&Podgląd Odtwarzania"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:151
+msgid "&Insert into Selected Audio Track"
+msgstr "&Wstaw do Zaznaczonej Ścieżki Dźwiękowej"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:155
+msgid "Unload &all Audio Files"
+msgstr "Wyładuj &wszystkie Pliki Dźwiękowe"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:159
+msgid "Unload all &Unused Audio Files"
+msgstr "Wyładuj wszystkie &nieużywane Pliki Dźwiękowe"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:163
+msgid "&Delete Unused Audio Files..."
+msgstr "&Kasuj Nieużywane Pliki Dźwiękowe..."
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:167
+msgid "&Export Audio File..."
+msgstr "&Eksportuj Plik Dźwiękowy..."
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:173
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:180
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:91
+msgid "Duration"
+msgstr "Czas Trwania"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:181
+msgid "Envelope"
+msgstr "Obwiednia"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:182
+msgid "Sample rate"
+msgstr "Częstotliwość próbkowania"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:183
+msgid "Channels"
+msgstr "Kanały"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:282
+msgid "<no audio files>"
+msgstr "<brak plików dźwiękowych>"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:488
+msgid "*.wav|WAV files (*.wav)"
+msgstr "*.wav|WAV pliki (*.wav)"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:489
+msgid "Choose a name to save this file as"
+msgstr "Wybierz nazwę by zapisać ten plik jako"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:499
+msgid "Exporting audio file..."
+msgstr "Eksportowanie pliku dźwiękowego..."
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:609
+msgid ""
+"This will unload audio file \"%1\" and remove all associated segments. Are "
+"you sure?"
+msgstr ""
+"To wyładuje plik \"%1\" i usunie związane z nim segmenty. Jesteś pewien?"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:692
+#, fuzzy
+msgid ""
+"*.wav|WAV files (*.wav)\n"
+"*.*|All files"
+msgstr "*.wav|WAV pliki (*.wav)"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:697
+msgid ""
+"*.wav *.flac *.ogg *.mp3|Audio files (*.wav *.flac *.ogg *.mp3)\n"
+"*.wav|WAV files (*.wav)\n"
+"*.flac|FLAC files (*.flac)\n"
+"*.ogg|Ogg files (*.ogg)\n"
+"*.mp3|MP3 files (*.mp3)\n"
+"*.*|All files"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:704
+msgid "Select one or more audio files"
+msgstr "Zaznacz jeden lub więcej plików dźwiękowych"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:763
+msgid ""
+"This will unload all audio files and remove their associated segments.\n"
+"This action cannot be undone, and associations with these files will be "
+"lost.\n"
+"Files will not be removed from your disk.\n"
+"Are you sure?"
+msgstr ""
+"To wyładuje wszystkie pliki dźwiękowe i usunie związane segmenty. \n"
+"Tej operacji nie da się cofnąć, a związki z tymi plikami będą utracone.\n"
+"Piki nie będą skasowane z Twojego dysku twardego.\n"
+"Jesteś pewien?"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:800
+msgid ""
+"This will unload all audio files that are not associated with any segments "
+"in this composition.\n"
+"This action cannot be undone, and associations with these files will be "
+"lost.\n"
+"Files will not be removed from your disk.\n"
+"Are you sure?"
+msgstr ""
+"To wyładuje wszystkie pliki dźwiękowe, które nie są związane z żadnymi "
+"segmentami. \n"
+"Tej operacji nie da się cofnąć, a związki z tymi plikami będą utracone.\n"
+"Piki nie będą skasowane z Twojego dysku twardego.\n"
+"Jesteś pewien?"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:865
+msgid ""
+"The following audio files are not used in the current composition.\n"
+"\n"
+"Please select the ones you wish to delete permanently from the hard disk.\n"
+msgstr ""
+"Następujące pliki dźwiękowe nie są używane w bieżąvym utworze.\n"
+"\n"
+"Proszę zaznaczyć te, które mają być skasowane na zawsze z twardego dysku.\n"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:875
+#, fuzzy, c-format
+msgid ""
+"_n: <qt>About to delete 1 audio file permanently from the hard disk.<br>This "
+"action cannot be undone, and there will be no way to recover this file."
+"<br>Are you sure?</qt>\n"
+"\n"
+"<qt>About to delete %n audio files permanently from the hard disk.<br>This "
+"action cannot be undone, and there will be no way to recover these files."
+"<br>Are you sure?</qt>"
+msgstr ""
+"Z dysku twardego zostanie na zawsze skasowany 1 plik dźwiękowy. Tej "
+"operacji nie da się cofnąć i nie będzie możliwości odzyskania tego pliku.\n"
+"Jesteś Pewien?\n"
+"Z dysku twardego zostaną na zawsze skasowane % pliki dźwiękowe. Tej operacji "
+"nie da się cofnąć i nie będzie możliwości odzyskania tych plików.\n"
+"Jesteś Pewien?"
+
+#: ../src/document/RosegardenGUIDoc.cpp:525
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:888
+msgid "File %1 could not be deleted."
+msgstr "Plik %1 nie mógł zostać skasowany."
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:921
+msgid "Change Audio File label"
+msgstr "Zmień etykietkę Pliku Dźwiękowego"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:6466
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:922
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:1099
+msgid "Enter new label"
+msgstr "Wprowadź nową etykietkę"
+
+#: ../src/gui/application/RosegardenGUIView.cpp:1538
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:1086
+#, fuzzy
+msgid "Adding audio file..."
+msgstr "Eksportowanie pliku dźwiękowego..."
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:1107
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:1112
+#, fuzzy
+msgid "Failed to add audio file. "
+msgstr "Sekwencer zawiódł podczas dodawania pliku dźwiękowego %1"
+
+#: ../src/document/RosegardenGUIDoc.cpp:2789
+#: ../src/gui/application/RosegardenGUIApp.cpp:2736
+#: ../src/gui/application/RosegardenGUIView.cpp:1574
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:1122
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:180
+msgid "Generating audio preview..."
+msgstr "Tworzenie wykresu fali dźwiękowej..."
+
+#: ../src/gui/application/RosegardenGUIView.cpp:1581
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:1130
+msgid ""
+"Try copying this file to a directory where you have write permission and re-"
+"add it"
+msgstr ""
+"Spróbuj skopiować ten plik do katalogu gdzie masz uprawnienia zapisu i dodaj "
+"go ponownie"
+
+#: ../src/gui/dialogs/TransportDialog.cpp:90 rc.cpp:357
+#, no-c-format
+msgid "Rosegarden Transport"
+msgstr "Panel Sterowania Różanego Ogrodu"
+
+#: ../src/gui/dialogs/TransportDialog.cpp:925
+#: ../src/gui/dialogs/TransportDialog.cpp:985
+msgid "PITCH WHEEL"
+msgstr "PITCH WHEEL"
+
+#: ../src/gui/dialogs/TransportDialog.cpp:929
+#: ../src/gui/dialogs/TransportDialog.cpp:989
+msgid "CONTROLLER"
+msgstr "KONTROLER"
+
+#: ../src/gui/dialogs/TransportDialog.cpp:933
+#: ../src/gui/dialogs/TransportDialog.cpp:993
+msgid "PROG CHNGE"
+msgstr "ZMIANA PROGRAMU"
+
+#: ../src/gui/dialogs/TransportDialog.cpp:938
+#: ../src/gui/dialogs/TransportDialog.cpp:998
+msgid "PRESSURE"
+msgstr "NACISK"
+
+#: ../src/gui/dialogs/TransportDialog.cpp:942
+#: ../src/gui/dialogs/TransportDialog.cpp:1002
+msgid "SYS MESSAGE"
+msgstr "KOMUNIKAT SYSTEMOWY"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:177
+#: ../src/gui/dialogs/QuantizeDialog.cpp:40
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:127
+msgid "Quantize"
+msgstr "Kwantyzacja"
+
+#: ../src/gui/dialogs/QuantizeDialog.cpp:52
+msgid "Advanced"
+msgstr "Zaawansowane"
+
+#: ../src/gui/dialogs/ExportDeviceDialog.cpp:42
+msgid "Export Devices..."
+msgstr "Eksportuj Urządzenia..."
+
+#: ../src/gui/dialogs/ExportDeviceDialog.cpp:47
+msgid "Export devices"
+msgstr "Eksportuj urządzenia"
+
+#: ../src/gui/dialogs/ExportDeviceDialog.cpp:49
+msgid "Export all devices"
+msgstr "Eksportuj wszystkie urządzenia"
+
+#: ../src/gui/dialogs/ExportDeviceDialog.cpp:50
+msgid "Export selected device only"
+msgstr "Eksportuj tylko wybrane urządzenia"
+
+#: ../src/gui/dialogs/ExportDeviceDialog.cpp:51
+msgid " (\"%1\")"
+msgstr " (\"%1\")"
+
+#: ../src/gui/dialogs/CompositionLengthDialog.cpp:44
+msgid "Change Composition Length"
+msgstr "Zmień Długość Utworu"
+
+#: ../src/gui/dialogs/CompositionLengthDialog.cpp:50
+msgid "Set the Start and End bar markers for this Composition"
+msgstr "Określ takt Początkowy i Końcowy dla tego Utworu"
+
+#: ../src/gui/dialogs/CompositionLengthDialog.cpp:54
+msgid "Start Bar"
+msgstr "Takt początkowy"
+
+#: ../src/gui/dialogs/CompositionLengthDialog.cpp:62
+msgid "End Bar"
+msgstr "Takt końcowy"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:62
+msgid "LilyPond Export/Preview"
+msgstr "Lilypond Eksport/Podgląd"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:85
+#, fuzzy
+msgid "General options"
+msgstr "Konfiguracja Podstawowa"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:90
+#, fuzzy
+msgid "Advanced options"
+msgstr "Pokaż opcje zaawansowane"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:112
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:95
+msgid "Headers"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:106
+msgid "Basic options"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:113
+#, fuzzy
+msgid "Compatibility level"
+msgstr "Lilypond poziom kompatybilności"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:117
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:118
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:119
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:120
+#, fuzzy, c-format
+msgid "LilyPond %1"
+msgstr "Lilypond 2.2"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:125
+#, fuzzy
+msgid "Paper size"
+msgstr "na plik"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:129
+msgid "A3"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:130
+msgid "A4"
+msgstr "A4"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:131
+msgid "A5"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:132
+msgid "A6"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:133
+msgid "Legal"
+msgstr "Legalny"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:134
+msgid "US Letter"
+msgstr "List US"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:135
+#, fuzzy
+msgid "Tabloid"
+msgstr "W Zakładkach"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:136
+msgid "do not specify"
+msgstr "nie określaj"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:152
+#, fuzzy
+msgid "Font size"
+msgstr "Rozmiar pliku"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:157
+#, fuzzy
+msgid "%1 pt"
+msgstr "%1 (część)"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:169
+#, fuzzy
+msgid "Staff level options"
+msgstr "Pokaż opcje zaawansowane"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:176
+#, fuzzy
+msgid "Export content"
+msgstr "Eksportuj urządzenia"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:179
+#, fuzzy
+msgid "All tracks"
+msgstr "Dodaj Wiele Ścieżek"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:180
+#, fuzzy
+msgid "Non-muted tracks"
+msgstr "Wycisz ścieżkę"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:181
+#, fuzzy
+msgid "Selected track"
+msgstr "Zaznacz &Następną Ścieżkę"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:182
+#, fuzzy
+msgid "Selected segments"
+msgstr "Zaznacz &Wszystkie Segmenty"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:188
+msgid "Merge tracks that have the same name"
+msgstr "Scal ścieżki o tych samych nazwach"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:198
+#, fuzzy
+msgid "Notation options"
+msgstr "Właściwości Notacji"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:206
+#, fuzzy
+msgid "First"
+msgstr "pauza"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:207
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:538
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:557
+msgid "All"
+msgstr "Wszystkie"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:211
+msgid "Export tempo marks "
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:215
+#, fuzzy
+msgid "Export lyrics"
+msgstr "Eksport \\słów bloku"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:225
+msgid "Export beamings"
+msgstr "Eksportuj belkowanie"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:232
+msgid "Export track staff brackets"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:244
+#, fuzzy
+msgid "Layout options"
+msgstr "Narzędzia wydruku"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:257
+#, fuzzy
+msgid "Lyrics alignment"
+msgstr "Słowa dla tego segmentu"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:261
+msgid "Ragged bottom (systems will not be spread vertically across the page)"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:267
+msgid "Miscellaneous options"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:274
+msgid "Enable \"point and click\" debugging"
+msgstr "Zezwól na debugowanie \"punkt i kliknięcie\""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:279
+msgid "Export \\midi block"
+msgstr "Eksportuj \\blok midi"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:284
+#, fuzzy
+msgid "No markers"
+msgstr "Brak Szyn"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:285
+#, fuzzy
+msgid "Rehearsal marks"
+msgstr "Usuń Wszystkie Oznaczenia"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:286
+#, fuzzy
+msgid "Marker text"
+msgstr "Pozycja"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:290
+#, fuzzy
+msgid "Export markers"
+msgstr "Eksportuj jako..."
+
+#: ../src/gui/dialogs/AudioSplitDialog.cpp:57
+msgid "Autosplit Audio Segment"
+msgstr "Automatyczne rozdzielenie Segmentu Audio"
+
+#: ../src/gui/dialogs/AudioSplitDialog.cpp:70
+msgid "AutoSplit Segment \""
+msgstr "Automatyczne rozdzielenie Segmentu "
+
+#: ../src/gui/dialogs/AudioSplitDialog.cpp:84
+msgid "Threshold"
+msgstr "Próg"
+
+#: ../src/gui/dialogs/AudioSplitDialog.cpp:142
+msgid "<no preview generated for this audio file>"
+msgstr "<nie wygenerowano podglądu dla tego pliku audio>"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:70
+msgid "Audio Plugin"
+msgstr "Wtyczka Audio"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:94
+#: ../src/gui/widgets/AudioFaderBox.cpp:136
+msgid "Editor"
+msgstr "Edytor"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:100
+msgid "Plugin"
+msgstr "Wtyczka"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:105
+msgid "Category:"
+msgstr "Kategoria:"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:110
+msgid "Plugin:"
+msgstr "Wtyczka:"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:114
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:398
+msgid "Select a plugin from this list."
+msgstr "Wybierz wtyczkę z listy."
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:119
+msgid "Bypass"
+msgstr "Omiń"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:121
+msgid "Bypass this plugin."
+msgstr "Omiń tę wtyczkę."
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:127
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:390
+msgid "<ports>"
+msgstr "<porty>"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:130
+msgid "Input and output port counts."
+msgstr "Liczba portów wejściowych i wyjściowych."
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:132
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:391
+msgid "<id>"
+msgstr "<Nr>"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:135
+msgid "Unique ID of plugin."
+msgstr "Unikalny Nr wtyczki."
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:149
+msgid "Copy plugin parameters"
+msgstr "Kopiuj Parametry Wtyczki"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:155
+msgid "Paste plugin parameters"
+msgstr "Wklej parametry wtyczki"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:161
+msgid "Set to defaults"
+msgstr "Ustaw na domyślne"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:225
+msgid "(any)"
+msgstr "(jakiekolwiek)"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:226
+msgid "(unclassified)"
+msgstr "(nie sklasyfikowane)"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:247
+msgid "(none)"
+msgstr "(brak)"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:389
+#: ../src/gui/editors/parameters/AudioInstrumentParameterPanel.cpp:132
+#: ../src/gui/editors/parameters/AudioInstrumentParameterPanel.cpp:361
+#: ../src/gui/studio/AudioMixerWindow.cpp:685
+#: ../src/gui/studio/AudioMixerWindow.cpp:724
+#: ../src/gui/studio/AudioMixerWindow.cpp:906
+#: ../src/gui/widgets/AudioFaderBox.cpp:79
+msgid "<no plugin>"
+msgstr "<brak wtyczek>"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:427
+msgid "This plugin has too many controls to edit here."
+msgstr "Ta wtyczka ma za dużo kontrolerów by tu ją edytować."
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:438
+#, c-format
+msgid "Id: %1"
+msgstr "Nr: %1"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:490
+msgid "mono"
+msgstr "mono"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:492
+msgid "stereo"
+msgstr "stereo"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:494
+msgid "%1 in, %2 out"
+msgstr "%1 wejście, %2 wyjście"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:518
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:704
+msgid "Program: "
+msgstr "Program: "
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:522
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:532
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:708
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:716
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:745
+msgid "<none selected>"
+msgstr "<nie zaznaczono>"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:56
+msgid "Set the %1 property of the event selection:"
+msgstr "Ustaw właściwości zaznaczonych komunikatów %1 "
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:61
+msgid "Pattern"
+msgstr "Wzór"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:66
+msgid "Flat - set %1 to value"
+msgstr "Obniż - ustaw do wartości %1 "
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:70
+msgid "Alternating - set %1 to max and min on alternate events"
+msgstr "Zmienny - ustaw %1 dla maks i min wartości komunikatów"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:74
+msgid "Crescendo - set %1 rising from min to max"
+msgstr "Crescendo - ustaw %1 wzgłaśnianie od min to maks"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:78
+msgid "Diminuendo - set %1 falling from max to min"
+msgstr "Diminuendo - ustaw %1 wyciszanie od maks to min"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:82
+msgid "Ringing - set %1 alternating from max to min with both dying to zero"
+msgstr ""
+"Śladowy = ustaw zmienną %1 od maks do min z obiema dochodzącymi do zera"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:123
+#: ../src/gui/dialogs/EventParameterDialog.cpp:150
+msgid "First Value"
+msgstr "Pierwsza Wartość"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:124
+#: ../src/gui/dialogs/EventParameterDialog.cpp:151
+msgid "Second Value"
+msgstr "Druga Wartość"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:132
+#: ../src/gui/dialogs/EventParameterDialog.cpp:142
+msgid "Low Value"
+msgstr "Niska Wartość"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:133
+#: ../src/gui/dialogs/EventParameterDialog.cpp:141
+msgid "High Value"
+msgstr "Wysoka Wartość"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:56 ../src/gui/rulers/TempoRuler.cpp:127
+msgid "Insert Tempo Change"
+msgstr "Wstaw Zmianę Tempa"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:69
+msgid "New tempo:"
+msgstr "Nowe Tempo:"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:76
+msgid "Tap"
+msgstr ""
+
+#: ../src/gui/dialogs/TempoDialog.cpp:81
+msgid "Tempo is fixed until the following tempo change"
+msgstr "Tempo jest stałe aż do następnego tempa"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:82
+msgid "Tempo ramps to the following tempo"
+msgstr "Tempo nachyla się do następującego tempa"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:83
+msgid "Tempo ramps to:"
+msgstr "Tempo nachyla się do:"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:120
+msgid "Time of tempo change"
+msgstr "Współrzędne zmiany tempa"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:138
+msgid "The pointer is currently at "
+msgstr "Kursor jest aktualnie w "
+
+#: ../src/gui/dialogs/TempoDialog.cpp:154
+msgid "Apply this tempo from here onwards"
+msgstr "Zastosuj to tempo od tego punktu dalej"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:158
+msgid "Replace the last tempo change"
+msgstr "Zastąp ostatnią zmianę tempa"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:164
+msgid "Apply this tempo from the start of this bar"
+msgstr "Zastosuj to tempo od początku tego taktu"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:167
+msgid "Apply this tempo to the whole composition"
+msgstr "Zastosuj to tempo dla całego utworu"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:172
+msgid "Also make this the default tempo"
+msgstr "Również zrób to tempo domyślnym"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:256
+msgid "%1.%2 s,"
+msgstr "%1.%2 s,"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:262
+#, c-format
+msgid "at the start of measure %1."
+msgstr "na początku taktu %1."
+
+#: ../src/gui/dialogs/TempoDialog.cpp:266
+#, c-format
+msgid "in the middle of measure %1."
+msgstr "w środku taktu %1."
+
+#: ../src/gui/dialogs/TempoDialog.cpp:285
+msgid " (at %1.%2 s, in measure %3)"
+msgstr " (w %1.%2 s, w takcie %3)"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:302
+msgid "There are no preceding tempo changes."
+msgstr "Nie ma żadnych wcześniejszych zmian tempa."
+
+#: ../src/gui/dialogs/TempoDialog.cpp:310
+msgid "There are no other tempo changes."
+msgstr "Nie ma żadnych zmian tempa."
+
+#: ../src/gui/dialogs/TempoDialog.cpp:328
+msgid " bpm"
+msgstr " bpm"
+
+#: ../src/gui/dialogs/AudioPlayingDialog.cpp:42
+msgid "Playing audio file"
+msgstr "Odtwarzanie pliku audio"
+
+#: ../src/gui/dialogs/AudioPlayingDialog.cpp:47
+msgid "Playing audio file \"%1\""
+msgstr "Odtwarzanie pliku audio \"%1\""
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:52
+#: ../src/gui/editors/matrix/MatrixView.cpp:2655
+msgid "Trigger Segment"
+msgstr "Wyzwalaj Segment"
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:61
+msgid "Trigger segment: "
+msgstr "Wyzwalaj segment:"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:59
+msgid "Key Change"
+msgstr "Zmiana tonacji"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:77
+msgid "Key signature"
+msgstr "Tonacja"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:80
+msgid "Key transposition"
+msgstr "Zmiana klucza"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:86
+msgid "Existing notes following key change"
+msgstr "Istniejące nuty podlegają zmianie tonacji"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:98
+msgid "Flatten"
+msgstr "Obniż"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:100
+msgid "Key"
+msgstr "Tonacja"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:105
+msgid "Sharpen"
+msgstr "Podwyższ"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:109
+msgid "Major"
+msgstr "Major"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:110
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:369
+msgid "Minor"
+msgstr "Minor"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:123
+msgid "Transpose key according to segment transposition"
+msgstr "Transponuj tonację zgodnie z transpozycją segmentu"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:126
+msgid "Use specified key. Do not transpose"
+msgstr "Użyj określonej tonacji. Nie transponuj"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:134
+msgid "Apply to current segment only"
+msgstr "Zastosuj tylko dla bieżącego segmentu"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:137
+msgid "Apply to all segments at this time"
+msgstr "Zastosuj dla wszystkich segmentów w tym miejscu"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:141
+msgid "Exclude percussion segments"
+msgstr ""
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:155
+msgid "Maintain current accidentals"
+msgstr "Zachowaj bieżące znaki przygodne"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:158
+msgid "Transpose into this key"
+msgstr "Transponuj do tej tonacji"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:331
+msgid "No such key"
+msgstr "Nie ma takiej tonacji"
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:44
+#: ../src/gui/editors/notation/NotationSelector.cpp:118
+msgid "Interpret"
+msgstr "Interpretuj"
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:50
+msgid "Interpretations to apply"
+msgstr "Zastosuj interpretacje"
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:53
+msgid "Apply text dynamics (p, mf, ff etc)"
+msgstr "Zastosuj oznaczenia dynamiki (p, mf, ff itd)"
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:55
+msgid "Apply hairpin dynamics"
+msgstr "Użyj graficznych znaków dynamicznych"
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:57
+msgid "Stress beats"
+msgstr "Zaakcentuj puls"
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:59
+msgid "Articulate slurs, staccato, tenuto etc"
+msgstr "Artykułuj łuki, staccato, tenuto, itd"
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:61
+msgid "All available interpretations"
+msgstr "Wszystkie możliwe interpretacje"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:316
+#, fuzzy
+msgid ""
+"Attempted to launch JACK audio daemon failed. Audio will be disabled.\n"
+"Please check configuration (Settings -> Configure Rosegarden -> Audio -> "
+"Startup)\n"
+" and restart."
+msgstr ""
+"Próba uruchomienia serwera JACK nie powiodła się. Dźwięk będzie wyłączony.\n"
+"Proszę sprawdzić konfigurację (Ustawienia->Konfiguruj Różany Ogród->Kontrola "
+"JACK)\n"
+" i uruchomić ponownie."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:325
+msgid "Starting sequencer..."
+msgstr "Uruchamianie sekwencera..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:333
+msgid "Initializing plugin manager..."
+msgstr "Inicjalizacja menadżera wtyczek..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:338
+msgid "Initializing view..."
+msgstr "Inicjalizacja widoku..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:354
+msgid "Special Parameters"
+msgstr "Parametry specjalne"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:430
+msgid "Starting sequence manager..."
+msgstr "Uruchamianie menadżera sekwencji..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:456
+msgid "Clearing studio data..."
+msgstr "Czyszczenie danych studia..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:475
+#: ../src/gui/editors/notation/NotationView.cpp:558
+msgid "Starting..."
+msgstr "Rozpoczynanie..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:556
+msgid "Import Rosegarden &Project file..."
+msgstr "Import pliku projektu Różanego Ogrodu..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:560
+msgid "Import &MIDI file..."
+msgstr "Import pliku &MIDI..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:564
+msgid "Import &Rosegarden 2.1 file..."
+msgstr "Importowanie pliku &Różanego Ogrodu 2.1..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:568
+msgid "Import &Hydrogen file..."
+msgstr "Importowanie pliku Wodoru..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:572
+msgid "Merge &File..."
+msgstr "Scalanie z &Plikiem..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:576
+msgid "Merge &MIDI file..."
+msgstr "Scalanie z plikiem &MIDI..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:580
+msgid "Merge &Rosegarden 2.1 file..."
+msgstr "Scalanie z plikiem &Różanego Ogrodu..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:584
+msgid "Merge &Hydrogen file..."
+msgstr "Scalanie z plikiem &Wodoru..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:588
+msgid "Export Rosegarden &Project file..."
+msgstr "Eksportowanie pliku &Różanego Ogrodu..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:592
+msgid "Export &MIDI file..."
+msgstr "Eksportowanie pliku &MIDI..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:596
+#, fuzzy
+msgid "Export &LilyPond file..."
+msgstr "Eksportowanie pliku &Lilypond..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:600
+msgid "Export Music&XML file..."
+msgstr "Eksportowanie pliku Music&XML..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:604
+msgid "Export &Csound score file..."
+msgstr "Eksportowanie pliku &Csound..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:608
+msgid "Export M&up file..."
+msgstr "Eksportowanie pliku M&up..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:612
+#: ../src/gui/editors/notation/NotationView.cpp:1500
+#, fuzzy
+msgid "Print &with LilyPond..."
+msgstr "Podglądanie za pomocą Lilypond..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:616
+#: ../src/gui/editors/notation/NotationView.cpp:1504
+msgid "Preview with Lil&yPond..."
+msgstr "Podglądanie za pomocą Lilypond..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:620
+msgid "Play&list"
+msgstr "&Lista odtwarzania"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:627
+msgid "Rosegarden &Tutorial"
+msgstr "&Samouczek Różanego Ogrodu"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:631
+msgid "&Bug Reporting Guidelines"
+msgstr "&Wskazówki Zgłaszania Błędów"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:645
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:348
+#: ../src/gui/editors/segment/MarkerEditor.cpp:378
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:388
+#: ../src/gui/general/EditViewBase.cpp:190
+#: ../src/gui/studio/BankEditorDialog.cpp:318
+#: ../src/gui/studio/DeviceManagerDialog.cpp:227
+msgid "Und&o"
+msgstr "&Cofnij"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:651
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:354
+#: ../src/gui/editors/segment/MarkerEditor.cpp:384
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:394
+#: ../src/gui/general/EditViewBase.cpp:196
+#: ../src/gui/studio/BankEditorDialog.cpp:324
+#: ../src/gui/studio/DeviceManagerDialog.cpp:233
+msgid "Re&do"
+msgstr "&Ponów"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:665
+#: ../src/gui/editors/notation/NotationView.cpp:2297
+msgid "Show T&ools Toolbar"
+msgstr "Pokaż &Narzędzia Edycyjne"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:669
+msgid "Show Trac&ks Toolbar"
+msgstr "Pokaż Narzędzia dla &Ścieżek"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:673
+msgid "Show &Editors Toolbar"
+msgstr "Pokaż Przyciski &Edytorów"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:677
+#: ../src/gui/editors/notation/NotationView.cpp:2309
+msgid "Show Trans&port Toolbar"
+msgstr "Pokaż Pasek &Odtwarzania"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:681
+msgid "Show &Zoom Toolbar"
+msgstr "Pokaż Suwak &Powiększenia"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:688
+msgid "Show Tra&nsport"
+msgstr "Pokaż &Okno Odtwarzania"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:693
+msgid "Show Track &Labels"
+msgstr "Pokaż &Etykietki Ścieżki"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:698
+msgid "Show Playback Position R&uler"
+msgstr "Pokaż Oś Czasu Odtwarzania"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:703
+msgid "Show Te&mpo Ruler"
+msgstr "Pokaż Wykres Zmian Tempa"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:708
+msgid "Show Cho&rd Name Ruler"
+msgstr "Pokaż Linię Nazw Akordów"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:714
+msgid "Show Segment Pre&views"
+msgstr "Wyświetl &Zawartość Segmentów"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:719
+msgid "Show Special &Parameters"
+msgstr "Pokaż Specjalne &Parametry"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:753
+#: ../src/gui/editors/matrix/MatrixView.cpp:641
+#: ../src/gui/editors/notation/NotationView.cpp:1772
+#, fuzzy
+msgid "&Select and Edit"
+msgstr "Zaznacz do &Końca"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:758
+#: ../src/gui/editors/matrix/MatrixView.cpp:646
+msgid "&Draw"
+msgstr "&Rysuj"
+
+#: ../src/commands/edit/EraseCommand.h:50
+#: ../src/gui/application/RosegardenGUIApp.cpp:763
+#: ../src/gui/editors/matrix/MatrixView.cpp:651
+#: ../src/gui/editors/notation/NotationView.cpp:1766
+msgid "&Erase"
+msgstr "&Kasuj"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:768
+#: ../src/gui/editors/matrix/MatrixView.cpp:656
+msgid "&Move"
+msgstr "&Przesuń"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:775
+msgid "&Resize"
+msgstr "&Zmień Rozmiar"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:782 rc.cpp:87
+#, no-c-format
+msgid "&Split"
+msgstr "&Rozdziel"
+
+#: ../src/commands/segment/SegmentJoinCommand.h:53
+#: ../src/gui/application/RosegardenGUIApp.cpp:789
+msgid "&Join"
+msgstr "&Połącz"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:795
+msgid "&Harmonize"
+msgstr "&Harmonizuj"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:806
+#: ../src/gui/rulers/TempoRuler.cpp:157
+msgid "Open Tempo and Time Signature Editor"
+msgstr "Otwórz Edytor Tempa i Metrum"
+
+#: ../src/commands/segment/CutRangeCommand.cpp:41
+#: ../src/gui/application/RosegardenGUIApp.cpp:812
+msgid "Cut Range"
+msgstr "Wytnij Zakres"
+
+#: ../src/commands/edit/CopyCommand.cpp:73
+#: ../src/gui/application/RosegardenGUIApp.cpp:816
+msgid "Copy Range"
+msgstr "Zakres Kopiowanie"
+
+#: ../src/commands/segment/PasteRangeCommand.cpp:45
+#: ../src/gui/application/RosegardenGUIApp.cpp:820
+msgid "Paste Range"
+msgstr "Wklej Zakres"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:828
+#, fuzzy
+msgid "Insert Range..."
+msgstr "Wstaw Pauzy"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:832
+#: ../src/gui/editors/notation/NotationView.cpp:1804
+msgid "De&lete"
+msgstr "&Skasuj"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:836
+msgid "Select &All Segments"
+msgstr "Zaznacz &Wszystkie Segmenty"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:852
+msgid "Edit Mar&kers..."
+msgstr "Edytuj &Znaczniki..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:856
+msgid "Edit Document P&roperties..."
+msgstr "Edytuj &Właściwości Dokumentu..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:864
+msgid "Open in &Default Editor"
+msgstr "Otwórz w &Domyślnym Edytorze"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:870
+#: ../src/gui/general/EditViewBase.cpp:206
+msgid "Open in Matri&x Editor"
+msgstr "Otwórz w Edytorze &Pianoli"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:876
+#: ../src/gui/general/EditViewBase.cpp:212
+msgid "Open in &Percussion Matrix Editor"
+msgstr "Otwórz w Edytorze P&erkusyjnym"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:882
+#: ../src/gui/general/EditViewBase.cpp:218
+msgid "Open in &Notation Editor"
+msgstr "Otwórz w Edytorze &Nutowym"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:888
+#: ../src/gui/general/EditViewBase.cpp:224
+msgid "Open in &Event List Editor"
+msgstr "Otwórz w Edytorze &Lista"
+
+#: ../src/commands/edit/EventQuantizeCommand.cpp:120
+#: ../src/commands/edit/EventUnquantizeCommand.cpp:87
+#: ../src/gui/application/RosegardenGUIApp.cpp:894
+msgid "&Quantize..."
+msgstr "&Kwantyzuj..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:908
+#: ../src/gui/editors/matrix/MatrixView.cpp:686
+msgid "Repeat Last Quantize"
+msgstr "Powtórz Ostatnią Kwantyzację"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:928
+msgid "Split at Time..."
+msgstr "Rozdziel w Punkcie..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:932
+#: ../src/gui/general/EditView.cpp:796
+msgid "Jog &Left"
+msgstr "Popchnij w &Lewo"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:936
+#: ../src/gui/general/EditView.cpp:800
+msgid "Jog &Right"
+msgstr "Popchnij w &Prawo"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:940
+msgid "Set Start Time..."
+msgstr "Ustawianie Współrzędnych Początkowych..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:944
+msgid "Set Duration..."
+msgstr "Ustawianie Czasu Trwania..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:953
+msgid "Turn Re&peats into Copies"
+msgstr "Zamień &Repetycje na Kopie"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:958
+msgid "Manage Tri&ggered Segments"
+msgstr "Zarządzaj &Sterowanymi Segmentami"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:962
+msgid "Set Tempos from &Beat Segment"
+msgstr "Ustal Tempa z Segmentu &Pulsu"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:966
+msgid "Set &Tempo to Audio Segment Duration"
+msgstr "Dopasuj &Tempo do Długości Segmentu Dźwiękowego"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:972
+#, fuzzy
+msgid "Manage A&udio Files"
+msgstr "Zmień etykietkę Pliku Dźwiękowego"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:977
+msgid "Show Segment Labels"
+msgstr "Pokaż Tytułu Segmentów"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:986
+msgid "Add &Track"
+msgstr "Dodaj &Ścieżkę"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:990
+#, fuzzy
+msgid "&Add Tracks..."
+msgstr "Dodaj Ścieżki..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:996
+msgid "D&elete Track"
+msgstr "&Kasuj Ścieżkę"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1002
+msgid "Move Track &Down"
+msgstr "Przesuń Ścieżkę w &Dół"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1008
+msgid "Move Track &Up"
+msgstr "Przesuń Ścieżkę w &Górę"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1012
+msgid "Select &Next Track"
+msgstr "Zaznacz &Następną Ścieżkę"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1017
+msgid "Select &Previous Track"
+msgstr "Zaznacz &Poprzednią Ścieżkę"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1022
+#, fuzzy
+msgid "Mute or Unmute Track"
+msgstr "Wycisz ścieżkę"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1027
+msgid "Arm or Un-arm Track for Record"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1034
+msgid "&Mute all Tracks"
+msgstr "&Wyłącz/Wycisz Wszystkie Ścieżki"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1040
+msgid "&Unmute all Tracks"
+msgstr "Włącz Wszystkie Ścieżki"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1044
+msgid "&Remap Instruments..."
+msgstr "&Zmień Przyporządkowanie Instrumentów..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1053
+msgid "&Audio Mixer"
+msgstr "Mikser &Audio"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1059
+msgid "Midi Mi&xer"
+msgstr "Mikser &MIDI"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1065
+msgid "Manage MIDI &Devices"
+msgstr "Zarządzaj &Urządzeniami MIDI"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1071
+msgid "Manage S&ynth Plugins"
+msgstr "Zarządzaj &Syntezatorami Wtyczkowymi"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1075
+msgid "Modify MIDI &Filters"
+msgstr "Modyfikuj &Filtry MIDI"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1079
+msgid "MIDI Thru Routing"
+msgstr "Połączenia MIDI Thru"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1085
+msgid "Manage &Metronome"
+msgstr "Zarządzaj &Metronomem"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1089
+msgid "&Save Current Document as Default Studio"
+msgstr "&Zapisz Bieżący Dokument jako Domyślne Studio"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1093
+msgid "&Import Default Studio"
+msgstr "&Import Domyślnego Studio"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1097
+msgid "Im&port Studio from File..."
+msgstr "Im&port Studio z Pliku..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1101
+msgid "&Reset MIDI Network"
+msgstr "&Uruchom ponownie MIDI"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1105
+#, fuzzy
+msgid "Set Quick Marker at Playback Position"
+msgstr "Wstaw Zmianę Tempa w pozycji kursora"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1109
+msgid "Jump to Quick Marker"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1142
+#: ../src/gui/editors/matrix/MatrixView.cpp:782
+#: ../src/gui/editors/notation/NotationView.cpp:2397
+#: ../src/gui/studio/AudioMixerWindow.cpp:105
+#: ../src/gui/studio/MidiMixerWindow.cpp:81
+msgid "&Play"
+msgstr "&Odtwarzaj"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1153
+#: ../src/gui/editors/matrix/MatrixView.cpp:791
+#: ../src/gui/editors/notation/NotationView.cpp:2406
+#: ../src/gui/studio/AudioMixerWindow.cpp:114
+#: ../src/gui/studio/MidiMixerWindow.cpp:90
+msgid "&Stop"
+msgstr "&Zatrzymaj"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1160
+#: ../src/gui/editors/matrix/MatrixView.cpp:802
+#: ../src/gui/editors/notation/NotationView.cpp:2417
+#: ../src/gui/studio/AudioMixerWindow.cpp:125
+#: ../src/gui/studio/MidiMixerWindow.cpp:101
+msgid "&Fast Forward"
+msgstr "&Przewijaj do przodu"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1168
+#: ../src/gui/editors/matrix/MatrixView.cpp:796
+#: ../src/gui/editors/notation/NotationView.cpp:2411
+#: ../src/gui/studio/AudioMixerWindow.cpp:119
+#: ../src/gui/studio/MidiMixerWindow.cpp:95
+msgid "Re&wind"
+msgstr "Przewijaj do &tyłu"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1175
+msgid "P&unch in Record"
+msgstr "&Wcinaj się z nagraniem"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1182
+#: ../src/gui/studio/AudioMixerWindow.cpp:143
+#: ../src/gui/studio/MidiMixerWindow.cpp:119
+msgid "&Record"
+msgstr "&Nagrywaj"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1189
+#: ../src/gui/editors/matrix/MatrixView.cpp:808
+#: ../src/gui/editors/notation/NotationView.cpp:2423
+#: ../src/gui/studio/AudioMixerWindow.cpp:131
+#: ../src/gui/studio/MidiMixerWindow.cpp:107
+msgid "Rewind to &Beginning"
+msgstr "Przewiń do &Początku"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1196
+#: ../src/gui/editors/matrix/MatrixView.cpp:814
+#: ../src/gui/editors/notation/NotationView.cpp:2429
+#: ../src/gui/studio/AudioMixerWindow.cpp:137
+#: ../src/gui/studio/MidiMixerWindow.cpp:113
+msgid "Fast Forward to &End"
+msgstr "Przewiń do &Końca"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1203
+#: ../src/gui/editors/matrix/MatrixView.cpp:832
+#: ../src/gui/editors/notation/NotationView.cpp:2447
+msgid "Scro&ll to Follow Playback"
+msgstr "Podążaj za Kursorem Odtwarzania"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1209
+#: ../src/gui/editors/matrix/MatrixView.cpp:838
+#: ../src/gui/editors/notation/NotationView.cpp:2453
+#: ../src/gui/studio/AudioMixerWindow.cpp:149
+#: ../src/gui/studio/MidiMixerWindow.cpp:125
+msgid "Panic"
+msgstr "Panika"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1213
+msgid "Segment Debug Dump "
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1283
+msgid " Zoom: "
+msgstr "Powiększenie:"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1719
+msgid "File \"%1\" does not exist"
+msgstr "Plik \"%1\" nie istnieje"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1725
+msgid "File \"%1\" is actually a directory"
+msgstr "Plik \"%1\" jest katalogiem"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1734
+msgid "You do not have read permission for \"%1\""
+msgstr "Nie masz uprawnień by czytać \"%1\""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1802
+msgid ""
+"An auto-save file for this document has been found\n"
+"Do you want to open it instead ?"
+msgstr ""
+"Znaleziono plik samo-zapisu dla tego dokumentu\n"
+"Chcesz go otworzyć zamiast tego?"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1896
+msgid "Example Files"
+msgstr "Pliki Przykładowe"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2100
+msgid "Opening a new application window..."
+msgstr "Otwieranie nowego okna aplikacji..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2110
+msgid "Creating new document..."
+msgstr "Tworzenie nowego dokumentu..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2154
+#, c-format
+msgid ""
+"Malformed URL\n"
+"%1"
+msgstr ""
+"Zniekształcony adres\n"
+"%1"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2179
+#: ../src/gui/application/RosegardenGUIApp.cpp:2240
+msgid "Opening file..."
+msgstr "Otwieranie pliku..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2201
+#: ../src/gui/application/RosegardenGUIApp.cpp:2220
+msgid "Open File"
+msgstr "Otwórz plik"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1225
+#: ../src/gui/application/RosegardenGUIApp.cpp:2258
+msgid "Saving file..."
+msgstr "Zapisz plik..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2330
+msgid "This is not a valid filename.\n"
+msgstr "To nie jest prawidłowa nazwa pliku.\n"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2335
+msgid "This is not a local file.\n"
+msgstr "To nie jest plik lokalny.\n"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2342
+#: ../src/gui/studio/BankEditorDialog.cpp:1640
+#: ../src/gui/studio/DeviceManagerDialog.cpp:787
+msgid "You have specified a directory"
+msgstr "Nie określiłeś katalogu"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2348
+#: ../src/gui/studio/BankEditorDialog.cpp:1646
+#: ../src/gui/studio/DeviceManagerDialog.cpp:793
+msgid "The specified file exists. Overwrite?"
+msgstr "Określony plik istnieje. Nadpisać?"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2362
+msgid "Saving file with a new filename..."
+msgstr "Zapisywanie pliku z nową nazwą..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2364
+#, fuzzy
+msgid "Rosegarden files"
+msgstr "Pliki Różanego Ogrodu-4"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2365
+#: ../src/gui/application/RosegardenGUIApp.cpp:4860
+#: ../src/gui/application/RosegardenGUIApp.cpp:4904
+#: ../src/gui/application/RosegardenGUIApp.cpp:4942
+#: ../src/gui/application/RosegardenGUIApp.cpp:4975
+#: ../src/gui/application/RosegardenGUIApp.cpp:5009
+#: ../src/gui/application/RosegardenGUIApp.cpp:5116
+msgid "All files"
+msgstr "Wszyskie pliki"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2366
+msgid "Save as..."
+msgstr "Zapisz jako..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2404
+msgid "Closing file..."
+msgstr "Zamykanie pliku..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2421
+#: ../src/gui/editors/notation/NotationView.cpp:4618
+msgid "Printing..."
+msgstr "Drukowanie..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2433
+#: ../src/gui/editors/notation/NotationView.cpp:4635
+msgid "Previewing..."
+msgstr "Podgląd..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2440
+msgid "Exiting..."
+msgstr "Wychodzenie..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2463
+msgid "Cutting selection..."
+msgstr "Wycinanie zaznaczenia..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2474
+#: ../src/gui/editors/matrix/MatrixView.cpp:1614
+#: ../src/gui/editors/notation/NotationView.cpp:4763
+msgid "Copying selection to clipboard..."
+msgstr "Kopiowanie zaznaczenia do schowka..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2484
+#: ../src/gui/editors/eventlist/EventView.cpp:878
+#: ../src/gui/editors/matrix/MatrixView.cpp:1625
+#: ../src/gui/editors/notation/NotationView.cpp:4796
+#: ../src/gui/editors/notation/NotationView.cpp:4841
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:352
+msgid "Clipboard is empty"
+msgstr "Schowek jest pusty"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2487
+#: ../src/gui/editors/eventlist/EventView.cpp:882
+#: ../src/gui/editors/matrix/MatrixView.cpp:1629
+#: ../src/gui/editors/notation/NotationView.cpp:4804
+#: ../src/gui/editors/notation/NotationView.cpp:4845
+msgid "Inserting clipboard contents..."
+msgstr "Wstawianie zawartości schowka..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2556
+#, fuzzy
+msgid "Duration of empty range to insert"
+msgstr "Czas trwania zaznaczenia"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2631
+msgid "This function needs no more than one segment to be selected."
+msgstr "Ta funkcja wymaga zaznaczenia nie więcej niż jednego segmentu."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2654
+msgid "Can't join Audio segments"
+msgstr "Nie można połączyć segmentów Audio"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2707
+#, fuzzy
+msgid "rescaling an audio file"
+msgstr "Odtwarzanie pliku audio"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2723
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:172
+#, fuzzy
+msgid "Rescaling audio file..."
+msgstr "Eksportowanie pliku dźwiękowego..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2767
+#, fuzzy
+msgid ""
+"The audio file path does not exist or is not writable.\n"
+"You must set the audio file path to a valid directory in Document Properties "
+"before %1.\n"
+"Would you like to set it now?"
+msgstr ""
+"Ścieżka dźwiękowa nie istnieje, albo nie jest zapisywalna.\n"
+"Proszę ustaw ścieżkę dźwiękową prawidłowo we Właściwościach Dokumentu zanim "
+"nagrasz dźwięk.\n"
+"Czy chciałbyś ją teraz ustawić?"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2769
+#: ../src/gui/application/RosegardenGUIApp.cpp:5291
+#: ../src/gui/application/RosegardenGUIApp.cpp:5339
+#: ../src/gui/editors/segment/TrackButtons.cpp:419
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:159
+msgid "Set audio file path"
+msgstr "Ustaw ścieżkę plików dźwiękowych"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2833
+msgid "Jog Selection"
+msgstr "Popychanie Zaznaczenia"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2978
+#, fuzzy, c-format
+msgid ""
+"_n: Split Segment at Time\n"
+"Split %n Segments at Time"
+msgstr "%1 - Segmenty - Notatacja%1 - %n Segmenty - Notatacja"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3013
+#: ../src/gui/general/EditViewBase.cpp:619
+msgid "Segment Start Time"
+msgstr "Współrzędne Początkowe dla Segmentu"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3023
+msgid "Set Segment Start Times"
+msgstr "Ustaw Współrzędne Początkowe dla Segmentu"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3024
+#: ../src/gui/general/EditViewBase.cpp:626
+msgid "Set Segment Start Time"
+msgstr "Ustaw Współrzędne Początkowe dla Segmentu"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3056
+#: ../src/gui/general/EditViewBase.cpp:644
+msgid "Segment Duration"
+msgstr "Czas Trwania Segmentu"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3068
+msgid "Set Segment Durations"
+msgstr "Ustaw Czas Trwania Segmentu"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3069
+#: ../src/gui/general/EditViewBase.cpp:652
+msgid "Set Segment Duration"
+msgstr "Ustaw Czas Trwania Segmentu"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3176
+#: ../src/gui/application/RosegardenGUIApp.cpp:5875
+msgid "Set Global Tempo"
+msgstr "Ustaw Globalne Tempo"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3234
+#: ../src/gui/general/EditViewBase.cpp:477
+msgid "Toggle the toolbar..."
+msgstr "Przełączaj panele narzędzi"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3244
+msgid "Toggle the tools toolbar..."
+msgstr "Przełączaj panel narzędzi..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3254
+msgid "Toggle the tracks toolbar..."
+msgstr "Przełączaj panel narzędzi ścieżki..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3264
+msgid "Toggle the editor toolbar..."
+msgstr "Przełączaj panel narzędzi edytora..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3274
+msgid "Toggle the transport toolbar..."
+msgstr "Przełączaj panel narzędzi panelu sterowania..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3284
+msgid "Toggle the zoom toolbar..."
+msgstr "Przełączaj panel narzędzi powiększenia..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3294
+msgid "Toggle the Transport"
+msgstr "Przełączaj Panel Sterowania"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3377
+#: ../src/gui/general/EditViewBase.cpp:487
+msgid "Toggle the statusbar..."
+msgstr "Przełączaj pasek stanu..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3434
+msgid ""
+"The join tool isn't implemented yet. Instead please highlight the segments "
+"you want to join and then use the menu option:\n"
+"\n"
+" Segments->Collapse Segments.\n"
+msgstr ""
+"Narzędzie łączenia jest jeszcze nie zaimplementowane. Proszę zaznaczyć "
+"segmenty, które mają być połączone i wybrać opcję z menu:\n"
+"\n"
+"Segmenty->Połącz Segmenty.\n"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3437
+msgid "Join tool not yet implemented"
+msgstr "Narzędzie łączenia jest jeszcze nie zaimplementowane"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3675
+msgid "Revert modified document to previous saved version?"
+msgstr "Powracanie zmodyfikowało dokument do poprzedniej wersji?"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3691
+msgid ""
+"*.rgp|Rosegarden Project files\n"
+"*|All files"
+msgstr ""
+"*.rgp|Pliki Projektów Różanego Ogrodu\n"
+"*|Wszystkie pliki"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3692
+msgid "Import Rosegarden Project File"
+msgstr "Importuj Plik Różanego Ogrodu"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3717
+msgid "Failed to import project file \"%1\""
+msgstr "Import pliku projektu\"%1\" nie powiódł się "
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3739
+msgid "Open MIDI File"
+msgstr "Otwórz Plik MIDI"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3756
+msgid "Merge MIDI File"
+msgstr "Scal Plik MIDI"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3866
+msgid "Importing MIDI file..."
+msgstr "Importowanie pliku MIDI"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3903
+msgid "Calculating notation..."
+msgstr "Kalkulowanie notacji..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3950
+msgid "Calculate Notation"
+msgstr "Kalkuluj Notację"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3991
+#: ../src/gui/application/RosegardenGUIApp.cpp:4008
+msgid ""
+"*.rose|Rosegarden-2 files\n"
+"*|All files"
+msgstr ""
+"*.rose|pliki Różanego Ogrodu-2 \n"
+"*|Wszystkie pliki"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3992
+#: ../src/gui/application/RosegardenGUIApp.cpp:4009
+msgid "Open Rosegarden 2.1 File"
+msgstr "Otwórz plik Różanego Ogrodu 2.1"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4026
+msgid "Importing Rosegarden 2.1 file..."
+msgstr "Importowanie pliku Różanego Ogrodu 2.1..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4052
+msgid "Can't load Rosegarden 2.1 file. It appears to be corrupted."
+msgstr ""
+"Nie można otworzyć pliku Różanego Ogrodu 2.1. Plik wydaje się być zepsuty."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4078
+#: ../src/gui/application/RosegardenGUIApp.cpp:4095
+msgid ""
+"*.h2song|Hydrogen files\n"
+"*|All files"
+msgstr ""
+"*.h2song|pliki Wodoru files\n"
+"*|Wszystkie pliki"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4079
+#: ../src/gui/application/RosegardenGUIApp.cpp:4096
+msgid "Open Hydrogen File"
+msgstr "Otwórz Plik Wodoru"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4113
+msgid "Importing Hydrogen file..."
+msgstr "Importowanie pliku Wodoru..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4139
+msgid "Can't load Hydrogen file. It appears to be corrupted."
+msgstr "Nie można otworzyć pliku Wodoru. Plik wydaje się być zepsuty."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4527
+#, fuzzy
+msgid "Export and import of Rosegarden Project files"
+msgstr "Eksportowanie plików utworów Różanego Ogrodu..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4529
+#, fuzzy
+msgid "The Rosegarden Project Packager helper script"
+msgstr "Pliki utworów Różanego Ogrodu\n"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4533
+msgid "%1 - for project file support"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4550
+msgid "The Rosegarden LilyPondView helper script"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4554
+#, fuzzy
+msgid "%1 - for LilyPond preview support"
+msgstr "Opcje podglądu lilypond"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4570
+msgid "The Rosegarden Audio File Importer helper script"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4574
+#, fuzzy
+msgid "%1 - for audio file import"
+msgstr "Ustaw ścieżkę plików dźwiękowych"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4585
+msgid ""
+"<h3>Helper programs not found</h3><p>Rosegarden could not find one or more "
+"helper programs which it needs to provide some features. The following "
+"features will not be available:</p>"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4586
+#: ../src/gui/application/RosegardenGUIApp.cpp:4592
+#, fuzzy
+msgid "<ul>"
+msgstr "<domyślny>"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4588
+#: ../src/gui/application/RosegardenGUIApp.cpp:4594
+#, fuzzy
+msgid "<li>%1</li>"
+msgstr "-- %1 (z %2)\n"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4590
+#: ../src/gui/application/RosegardenGUIApp.cpp:4596
+msgid "</ul>"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4591
+msgid ""
+"<p>To fix this, you should install the following additional programs:</p>"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4603
+msgid "Helper programs not found"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4686
+msgid "Starting the sequencer..."
+msgstr "Uruchamianie sekwencera..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4712
+msgid "Couldn't start the sequencer"
+msgstr "Nie można było uruchomić sekwencera"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4789
+msgid "Clearing down jackd..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4803
+msgid "Starting jackd..."
+msgstr "Uruchamianie serwera jackd..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4842
+msgid ""
+"The Rosegarden sequencer process has exited unexpectedly. Sound and "
+"recording will no longer be available for this session.\n"
+"Please exit and restart Rosegarden to restore sound capability."
+msgstr ""
+"Sekwencer Różanego Ogrodu niespodziewanie zakończył pracę. Dźwięk i "
+"nagrywanie będą niedostępne dla tej sesji.\n"
+"Uruchom ponownie Różany Ogród by przywrócić funkcje dźwiękowe."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4846
+msgid ""
+"The Rosegarden sequencer could not be started, so sound and recording will "
+"be unavailable for this session.\n"
+"For assistance with correct audio and MIDI configuration, go to http://"
+"rosegardenmusic.com."
+msgstr ""
+"Sekwencer Różanego Ogrodu nie mógł wystartować, więc dźwięk i nagrywanie "
+"będą niedostępne dla tej sesji.\n"
+"Aby uzyskać wsparcie w konfiguracji audio i MIDI, wejdź na stronę http://"
+"rosegardenmusic.com."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4856
+msgid "Exporting Rosegarden Project file..."
+msgstr "Eksportowanie plików utworów Różanego Ogrodu..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4859
+msgid "Rosegarden Project files\n"
+msgstr "Pliki utworów Różanego Ogrodu\n"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4861
+#: ../src/gui/application/RosegardenGUIApp.cpp:4905
+#: ../src/gui/application/RosegardenGUIApp.cpp:4943
+#: ../src/gui/application/RosegardenGUIApp.cpp:4976
+#: ../src/gui/application/RosegardenGUIApp.cpp:5010
+#: ../src/gui/application/RosegardenGUIApp.cpp:5116
+msgid "Export as..."
+msgstr "Eksportuj jako..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4875
+#, c-format
+msgid "Saving Rosegarden file to package failed: %1"
+msgstr "Zapisywanie Różanego Ogrodu do pakietu nie powiodło sie: %1"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4889
+msgid "Failed to export to project file \"%1\""
+msgstr "Eksport do pliku \"%1\" nie powiódł się"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4900
+#: ../src/gui/application/RosegardenGUIApp.cpp:4915
+msgid "Exporting MIDI file..."
+msgstr "Eksportowanie pliku MIDI..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4903
+msgid "Standard MIDI files\n"
+msgstr "Standardowy plik MIDI\n"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4934
+#: ../src/gui/application/RosegardenGUIApp.cpp:4966
+#: ../src/gui/application/RosegardenGUIApp.cpp:4999
+#: ../src/gui/application/RosegardenGUIApp.cpp:5103
+#: ../src/gui/application/RosegardenGUIApp.cpp:5140
+#: ../src/gui/editors/notation/NotationView.cpp:4733
+msgid "Export failed. The file could not be opened for writing."
+msgstr "Eksport się nie powiódł. Plik nie mógł zostać otworzony do zapisu."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4940
+#: ../src/gui/application/RosegardenGUIApp.cpp:4952
+msgid "Exporting Csound score file..."
+msgstr "Eksportowanie pliku nutowego Csound..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4972
+#: ../src/gui/application/RosegardenGUIApp.cpp:4985
+msgid "Exporting Mup file..."
+msgstr "Eksportowanie pliku Mup..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4975
+msgid "Mup files\n"
+msgstr "pliki Mup\n"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5005
+#: ../src/gui/application/RosegardenGUIApp.cpp:5089
+#: ../src/gui/editors/notation/NotationView.cpp:4719
+#, fuzzy
+msgid "Exporting LilyPond file..."
+msgstr "Eksportowanie pliku Lilypond"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5008
+#, fuzzy
+msgid "LilyPond files"
+msgstr "pliki Lilypond"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5023
+#: ../src/gui/editors/notation/NotationView.cpp:4653
+#, fuzzy
+msgid "Printing LilyPond file..."
+msgstr "Podglądanie pliku Lilypond..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5028
+#: ../src/gui/application/RosegardenGUIApp.cpp:5052
+#: ../src/gui/editors/notation/NotationView.cpp:4658
+#: ../src/gui/editors/notation/NotationView.cpp:4682
+#, fuzzy
+msgid "Failed to open a temporary file for LilyPond export."
+msgstr "Otwarcie pliku tymczasowego do eksportu do Lilypond nie powiodło się."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5047
+#: ../src/gui/editors/notation/NotationView.cpp:4677
+#, fuzzy
+msgid "Previewing LilyPond file..."
+msgstr "Podglądanie pliku Lilypond..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5080
+#: ../src/gui/editors/notation/NotationView.cpp:4710
+#, fuzzy
+msgid "LilyPond Preview Options"
+msgstr "Opcje Podglądu Lilypond"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5081
+#: ../src/gui/editors/notation/NotationView.cpp:4711
+#, fuzzy
+msgid "LilyPond preview options"
+msgstr "Opcje podglądu lilypond"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5112
+#: ../src/gui/application/RosegardenGUIApp.cpp:5126
+msgid "Exporting MusicXML file..."
+msgstr "Eksportowanie pliku MusicXML..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5115
+msgid "XML files"
+msgstr "Plik XML"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5289
+#: ../src/gui/editors/segment/TrackButtons.cpp:417
+msgid ""
+"The audio file path does not exist or is not writable.\n"
+"Please set the audio file path to a valid directory in Document Properties "
+"before recording audio.\n"
+"Would you like to set it now?"
+msgstr ""
+"Ścieżka dźwiękowa nie istnieje, albo nie jest zapisywalna.\n"
+"Proszę ustaw ścieżkę dźwiękową prawidłowo we Właściwościach Dokumentu zanim "
+"nagrasz dźwięk.\n"
+"Czy chciałbyś ją teraz ustawić?"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5337
+msgid ""
+"The audio file path does not exist or is not writable.\n"
+"Please set the audio file path to a valid directory in Document Properties "
+"before you start to record audio.\n"
+"Would you like to set it now?"
+msgstr ""
+"Ścieżka dźwiękowa nie istnieje, albo nie jest zapisywalna.\n"
+"Proszę ustaw ścieżkę dźwiękową prawidłowo we Właściwościach Dokumentu zanim "
+"zaczniesz nagrywać dźwięk.\n"
+"Czy chciałbyś ją teraz ustawić?"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5780
+#, fuzzy
+msgid "Move playback pointer to time"
+msgstr "Kursor &odtwarzania do kursora edycji"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5793
+#: ../src/gui/editors/matrix/MatrixView.cpp:2240
+msgid "%1%"
+msgstr "%1%"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5861
+#, c-format
+msgid "Replace Tempo Change at %1"
+msgstr "Zamień Zmianę Tempa w %1"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5891
+msgid "Set Global and Default Tempo"
+msgstr "Ustaw Globalne i Domyślne Tempo"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5914
+msgid "Move Tempo Change"
+msgstr "Przesuń Zmianę Tempa"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5949
+#, fuzzy
+msgid "new marker"
+msgstr "Brak Szyn"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5950
+#, fuzzy
+msgid "no description"
+msgstr "Opis"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:6363
+#, c-format
+msgid "Sequencer failed to add audio file %1"
+msgstr "Sekwencer zawiódł podczas dodawania pliku dźwiękowego %1"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:6388
+#, c-format
+msgid "Sequencer failed to remove audio file id %1"
+msgstr "Sekwencer zawiódł podczas usuwania pliku dźwiękowego %1"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:6448
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:1086
+msgid "Modify Segment label"
+msgstr "Modyfikuj etykietkę Segmentu"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:6450
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:1088
+msgid "Modify Segments label"
+msgstr "Modyfikuj etykietki Segmentów"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:6452
+msgid "Relabelling selection..."
+msgstr "Przemianowywanie zazanczenia..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7539
+msgid "Play List"
+msgstr "Lista Odtwarzania"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7567
+msgid "http://rosegarden.sourceforge.net/tutorial/en/chapter-0.html"
+msgstr "http://rosegarden.sourceforge.net/tutorial/en/chapter-0.html"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7574
+msgid "http://rosegarden.sourceforge.net/tutorial/bug-guidelines.html"
+msgstr "http://rosegarden.sourceforge.net/tutorial/bug-guidelines.html"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7650
+msgid "Queueing MIDI panic events for tranmission..."
+msgstr "Kolejkowanie Komunikatów paniki MIDI dla transmisji..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7708
+msgid "Are you sure you want to save this as your default studio?"
+msgstr "Jesteś pewien, że chcesz zapisać to jako swoje domyślne studio?"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7713
+msgid "Saving current document as default studio..."
+msgstr "Zapisywanie bieżącego dokumentu jako domyślnego studia..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7738
+msgid ""
+"Are you sure you want to import your default studio and lose the current one?"
+msgstr ""
+"Jesteś pewien, że chcesz zaimportować Twoje domyślne studio i stracić "
+"bieżące?"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7773
+msgid "Import Studio from File"
+msgstr "Importuj Studio z Pliku"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7807
+msgid "Import Studio"
+msgstr "Importuj Studio"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:8015
+msgid ""
+"<h3>Newer version available</h3><p>A newer version of Rosegarden may be "
+"available.<br>Please consult the <a href=\"http://www.rosegardenmusic.com/"
+"getting/\">Rosegarden website</a> for more information.</p>"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:8016
+#, fuzzy
+msgid "Newer version available"
+msgstr "Tłumaczone (gdzie możliwe)"
+
+#: ../src/gui/application/RosegardenApplication.cpp:104
+#, c-format
+msgid "Failed to load soundfont %1"
+msgstr "Nieudane załadowanie pliku soundfont %1"
+
+#: ../src/gui/application/main.cpp:311
+msgid "Rosegarden - A sequencer and musical notation editor"
+msgstr "Różany Ogród - Sekwencer i Edytor Nut"
+
+#: ../src/gui/application/main.cpp:315
+msgid "Don't use the sequencer (support editing only)"
+msgstr "Nie używaj sekwencera (wsparcie tylko dla edycji)"
+
+#: ../src/gui/application/main.cpp:316
+msgid "Don't show the splash screen"
+msgstr "Nie pokazuj okna powitalnego"
+
+#: ../src/gui/application/main.cpp:317
+msgid "Don't automatically run in the background"
+msgstr "Nie ruszaj automatycznie w tle"
+
+#: ../src/gui/application/main.cpp:318
+msgid "Attach to a running sequencer process, if found"
+msgstr ""
+"Podłącz się do działającego procesu sekwencera, jeśli zostanie znaleziony"
+
+#: ../src/gui/application/main.cpp:319
+msgid "Ignore installed version - for devs only"
+msgstr "Ignoruj zainstalowaną wersję - tylko dla programistów"
+
+#: ../src/gui/application/main.cpp:320
+msgid "file to open"
+msgstr "plik do otwarcia"
+
+#: ../src/gui/application/main.cpp:370
+msgid "Installation contains the wrong version of Rosegarden."
+msgstr "Instalacja zawiera złą wersję Różanego Ogrodu."
+
+#: ../src/gui/application/main.cpp:371
+#, fuzzy
+msgid ""
+" The wrong versions of Rosegarden's data files were\n"
+" found in the standard KDE installation directories.\n"
+" (I am %1, but the installed files are for version %2.)\n"
+"\n"
+" This may mean one of the following:\n"
+"\n"
+" 1. This is a new upgrade of Rosegarden, and it has not yet been\n"
+" installed. If you compiled it yourself, check that you have\n"
+" run \"make install\" and that the procedure completed\n"
+" successfully.\n"
+"\n"
+" 2. The upgrade was installed in a non-standard directory,\n"
+" and an old version was found in a standard directory. If so,\n"
+" you will need to add the correct directory to your KDEDIRS\n"
+" environment variable before you can run it."
+msgstr ""
+"Dane złej wersji Różanego Ogrodu zostały znalezione\n"
+" w standardowym katalogu KDE.\n"
+"(I jestem %1, lecz pliki instalacyjne są z wersji %2.)\n"
+"\n"
+"To może oznaczać jedną z możliwych rzeczy:\n"
+"\n"
+"1. To jest aktualizacja Różanego Ogrodu, która nie została jeszcze "
+"zainstalowana. Jeśli sam ją skompilowałeś, sprawdź,\n"
+" czy wydałeś polecenie \"scons install\" i że procedura instalacji "
+"przebiegła pomyślnie.\n"
+"\n"
+"2. Aktualizacja została zainstalowana w nie standardowym katalogu,\n"
+"a stara wersja została znaleziona w standardowym katalogu. Jeśli tak, \n"
+"musisz dodać prawidłowy katalog do zmiennej środowiskowej KDEDIRS\n"
+" zanim będziesz mógł uruchomić program."
+
+#: ../src/gui/application/main.cpp:383 ../src/gui/application/main.cpp:401
+msgid "Installation problem"
+msgstr "Problem instalacyjny"
+
+#: ../src/gui/application/main.cpp:389
+msgid "Rosegarden does not appear to have been installed."
+msgstr "Różany Ogród nie wygląda na zainstalowany."
+
+#: ../src/gui/application/main.cpp:390
+#, fuzzy
+msgid ""
+" One or more of Rosegarden's data files could not be\n"
+" found in the standard KDE installation directories.\n"
+"\n"
+" This may mean one of the following:\n"
+"\n"
+" 1. Rosegarden has not been correctly installed. If you compiled\n"
+" it yourself, check that you have run \"make install\" and that\n"
+" the procedure completed successfully.\n"
+"\n"
+" 2. Rosegarden has been installed in a non-standard directory,\n"
+" and you need to add this directory to your KDEDIRS environment\n"
+" variable before you can run it. This may be the case if you\n"
+" installed into $HOME or a local third-party package directory\n"
+" like /usr/local or /opt."
+msgstr ""
+"Jeden lub więcej plików z danymi nie mógł zostać znaleziony\n"
+"w standardowym katalogu instalacyjnym KDE.\n"
+"\n"
+"To może oznaczać jedną z możliwych rzeczy:\n"
+"\n"
+"1. Różany Ogród został niepoprawnie zainstalowany. Jeśli sam go "
+"skompilowałeś, sprawdź,\n"
+" czy wydałeś polecenie \"scons install\" i że procedura instalacji "
+"przebiegła pomyślnie.\n"
+"\n"
+"2. Aplikacja została zainstalowana w nie standardowym katalogu,\n"
+"a stara wersja została znaleziona w standardowym katalogu. Jeśli tak, \n"
+"musisz dodać prawidłowy katalog do zmiennej środowiskowej KDEDIRS\n"
+" zanim będziesz mógł uruchomić program. To może być przypadek, kiedy "
+"zainstalowałeś program do $HOME lub do lokalnego trzeciorzędnego katalogu\n"
+"jak /usr/local albo /opt."
+
+#: ../src/gui/application/main.cpp:414
+msgid "Rosegarden"
+msgstr "Różany Ogród"
+
+#: ../src/gui/application/main.cpp:416
+#, fuzzy
+msgid ""
+"Copyright 2000 - 2008 Guillaume Laurent, Chris Cannam, Richard Bown\n"
+"Parts copyright 1994 - 2004 Chris Cannam, Andy Green, Richard Bown, "
+"Guillaume Laurent\n"
+"LilyPond fonts copyright 1997 - 2005 Han-Wen Nienhuys and Jan Nieuwenhuizen"
+msgstr ""
+"Prawa Autorskie 2000 - 2006 Guillaume Laurent, Chris Cannam, Richard Bown\n"
+"Parts copyright 1994 - 2004 Chris Cannam, Andy Green, Richard Bown, "
+"Guillaume Laurent\n"
+"Lilypond czcionki prawa autorskie 1997 - 2005 Han-Wen Nienhuys and Jan "
+"Nieuwenhuizen"
+
+#: ../src/gui/application/main.cpp:428
+msgid "Chord labelling code"
+msgstr "Kod nazwywania akordów"
+
+#: ../src/gui/application/main.cpp:429
+#, fuzzy
+msgid ""
+"LilyPond output\n"
+"assorted other patches\n"
+"i18n-ization"
+msgstr ""
+"Wyjście Lilypond\n"
+"wybrano inne łaty\n"
+"i18-anie"
+
+#: ../src/gui/application/main.cpp:430
+msgid ""
+"UI improvements\n"
+"bug fixes"
+msgstr ""
+"Postępy w rozwoju interfejsu\n"
+"naprawy błędów"
+
+#: ../src/gui/application/main.cpp:431
+msgid ""
+"Segment colours\n"
+"Other UI and bug fixes"
+msgstr ""
+"Kolory segmentów\n"
+"Inne Interfejsy i naprawy błędów"
+
+#: ../src/gui/application/main.cpp:432
+msgid ""
+"Russian translation\n"
+"i18n-ization"
+msgstr ""
+"Tłumaczenie na rosyjski\n"
+"i18n-anie"
+
+#: ../src/gui/application/main.cpp:433 ../src/gui/application/main.cpp:434
+msgid "German translation"
+msgstr "Tłumaczenie na niemiecki"
+
+#: ../src/gui/application/main.cpp:435
+msgid "Welsh translation"
+msgstr "Tłumaczenie na walijski"
+
+#: ../src/gui/application/main.cpp:436
+msgid "French translation"
+msgstr "Tłumaczenie na francuski"
+
+#: ../src/gui/application/main.cpp:437
+#, fuzzy
+msgid ""
+"French translation\n"
+"Bug fixes"
+msgstr "Tłumaczenie na francuski"
+
+#: ../src/gui/application/main.cpp:438 ../src/gui/application/main.cpp:439
+msgid "Italian translation"
+msgstr "Tłumaczenie na włoski"
+
+#: ../src/gui/application/main.cpp:440 ../src/gui/application/main.cpp:441
+msgid "Swedish translation"
+msgstr "Tłumaczenie na szwedzki"
+
+#: ../src/gui/application/main.cpp:442
+msgid "Estonian translation"
+msgstr "Tłumaczenie na estoński"
+
+#: ../src/gui/application/main.cpp:443 ../src/gui/application/main.cpp:444
+msgid "Dutch translation"
+msgstr "Tłumaczenie na holenderski"
+
+#: ../src/gui/application/main.cpp:445
+msgid "HSpinBox class"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:446
+msgid "Transposition by interval"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:447
+msgid "Original designs for rotary controllers"
+msgstr "Oryginalny projekt dla kontrolerów obrotowych"
+
+#: ../src/gui/application/main.cpp:448
+msgid "Japanese translation"
+msgstr "Tłumaczenie na japoński"
+
+#: ../src/gui/application/main.cpp:449
+msgid ""
+"Auto-scroll deceleration\n"
+"Rests outside staves and other bug fixes"
+msgstr ""
+"Zwolnienie tempa Auto-przewijania\n"
+"Pauzy poza pięciolinią i inne naprawy błędów"
+
+#: ../src/gui/application/main.cpp:450
+msgid "Simplified Chinese translation"
+msgstr "Tłumaczenie na chiński uproszczony"
+
+#: ../src/gui/application/main.cpp:451
+msgid "LIRC infrared remote-controller support"
+msgstr "LIRC wsparcie dla zdalnego sterowania podczerwienią"
+
+#: ../src/gui/application/main.cpp:452
+msgid "MTC slave timing implementation"
+msgstr "Implemetnacja zegara podrzędnego MTC"
+
+#: ../src/gui/application/main.cpp:453
+msgid "Czech translation"
+msgstr "Tłumaczenie na czeski"
+
+#: ../src/gui/application/main.cpp:454
+msgid "SCons/bksys building system"
+msgstr "System budowania SCons/bksys"
+
+#: ../src/gui/application/main.cpp:455
+msgid "icons, icons, icons"
+msgstr "ikony, ikony, ikony"
+
+#: ../src/gui/application/main.cpp:456 ../src/gui/application/main.cpp:457
+#: ../src/gui/application/main.cpp:458 ../src/gui/application/main.cpp:459
+msgid "Spanish translation"
+msgstr "Tłumaczenie na hiszpański"
+
+#: ../src/gui/application/main.cpp:460 ../src/gui/application/main.cpp:461
+msgid "Catalan translation"
+msgstr "Tłumaczenie na kataloński"
+
+#: ../src/gui/application/main.cpp:462
+msgid ""
+"1.2.3 splash screen photo\n"
+"Gave birth to D. Michael McIntyre, bought him a good flute once\n"
+"upon a time, and always humored him when he came over to play her\n"
+"some new instrument, even though she really hated his playing.\n"
+"Born October 19, 1951, died September 21, 2007, R. I. P."
+msgstr ""
+
+#: ../src/gui/application/main.cpp:463
+#, fuzzy
+msgid "Initial guitar chord editing code"
+msgstr "edytor akordów gitarowych"
+
+#: ../src/gui/application/main.cpp:464
+#, fuzzy
+msgid "Polish translation"
+msgstr "Tłumaczenie na walijski"
+
+#: ../src/gui/application/main.cpp:465
+#, fuzzy
+msgid "Basque translation"
+msgstr "Tłumaczenie na japoński"
+
+#: ../src/gui/application/main.cpp:466
+msgid "Klearlook theme"
+msgstr ""
+
+#: ../src/_translatorinfo.cpp:1 ../src/gui/application/main.cpp:468
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr "Piotr Sawicki"
+
+#: ../src/_translatorinfo.cpp:3 ../src/gui/application/main.cpp:468
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+
+#: ../src/gui/application/main.cpp:719
+msgid "Welcome!"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:731
+msgid ""
+"<h2>Welcome to Rosegarden!</h2><p>Welcome to the Rosegarden audio and MIDI "
+"sequencer and musical notation editor.</p><ul><li>If you have not already "
+"done so, you may wish to install some DSSI synth plugins, or a separate "
+"synth program such as QSynth. Rosegarden does not synthesize sounds from "
+"MIDI on its own, so without these you will hear nothing.</"
+"li><br><br><li>Rosegarden uses the JACK audio server for recording and "
+"playback of audio, and for playback from DSSI synth plugins. These features "
+"will only be available if the JACK server is running.</"
+"li><br><br><li>Rosegarden has comprehensive documentation: see the Help menu "
+"for the handbook, tutorials, and other information!</li></ul><p>Rosegarden "
+"was brought to you by a team of volunteers across the world. To learn more, "
+"go to <a href=\"http://www.rosegardenmusic.com/\">http://www.rosegardenmusic."
+"com/</a>.</p>"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIView.cpp:257
+msgid "No non-audio segments in composition"
+msgstr "Brak nie-dźwiękowych segmentów w utworze"
+
+#: ../src/gui/application/RosegardenGUIView.cpp:333
+msgid "Selection must contain only audio or non-audio segments"
+msgstr "Zaznaczenie musi zawierać tylko segmenty audio, lub tylko MIDI"
+
+#: ../src/gui/application/RosegardenGUIView.cpp:431
+#: ../src/gui/application/RosegardenGUIView.cpp:576
+#: ../src/gui/application/RosegardenGUIView.cpp:612
+#: ../src/gui/application/RosegardenGUIView.cpp:776
+msgid "No non-audio segments selected"
+msgstr "Brak zaznaczonych segmentów MIDI"
+
+#: ../src/gui/application/RosegardenGUIView.cpp:851
+#, fuzzy
+msgid ""
+"You've not yet defined an audio editor for Rosegarden to use.\n"
+"See Settings -> Configure Rosegarden -> Audio."
+msgstr ""
+"Nie zdefiniowałeś jeszcze zewnętrznego edytora dźwiękowego do użytku przez "
+"Różany Ogród.\n"
+"Zobacz Ustawienia -> Konfiguracja: Różany Ogród -> Ogólne -> Zewnętrzne "
+"Edytory."
+
+#: ../src/gui/application/RosegardenGUIView.cpp:1559
+#: ../src/gui/application/RosegardenGUIView.cpp:1564
+msgid "Can't add dropped file. "
+msgstr "Nie można dodać wyrzuconego pliku."
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1014
+#: ../src/gui/seqmanager/SequenceManager.cpp:1150
+msgid ""
+"The JACK Audio subsystem has failed or it has stopped Rosegarden from "
+"processing audio.\n"
+"Please restart Rosegarden to continue working with audio.\n"
+"Quitting other running applications may improve Rosegarden's performance."
+msgstr ""
+"Serwer dźwiękowy Jack zawiódł, albo stanął i wstrzymał Różany Ogród w "
+"przetwarzaniu audio.\n"
+"Proszę uruchom ponownie Różany Ogród by kontynuować pracę z audio.\n"
+"Zamknięcie innych programów może spowodować wzrost wydajności Różanego "
+"Ogrodu."
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1020
+#: ../src/gui/seqmanager/SequenceManager.cpp:1156
+msgid ""
+"The JACK Audio subsystem has stopped Rosegarden from processing audio, "
+"probably because of a processing overload.\n"
+"An attempt to restart the audio service has been made, but some problems may "
+"remain.\n"
+"Quitting other running applications may improve Rosegarden's performance."
+msgstr ""
+"Serwer dźwiękowy Jack zawiódł, albo stanął i wstrzymał Różany Ogród w "
+"przetwarzaniu audio, prawdopodobnie z powodu przeładowania procesora.\n"
+"Uruchomiono ponownie usługi audio, ale problemy mogły pozostać\n"
+"Zamknięcie innych programów może spowodować wzrost wydajności Różanego "
+"Ogrodu."
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1031
+msgid ""
+"Run out of processor power for real-time audio processing. Cannot continue."
+msgstr ""
+"Zabrakło mocy procesora dla operacji dźwiękowych w czasie rzeczywistym. Nie "
+"można kontynuować."
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1057
+msgid ""
+"A serious error has occurred in the ALSA MIDI subsystem. It may not be "
+"possible to continue sequencing. Please check console output for more "
+"information."
+msgstr ""
+"Poważny błąd pojawił się systemie ALSA/MIDI. Używanie sekwencera może być "
+"niemożliwe. Proszę sprawdzić komunikaty programu w konsoli w celu uzyskania "
+"więcej informacji."
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1078
+msgid "JACK Audio subsystem is losing sample frames."
+msgstr "Serwer dźwięku JACK traci ramki sampli."
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1096
+msgid ""
+"Failed to read audio data from disc in time to service the audio subsystem."
+msgstr ""
+"Nie udało się odczytać danych z dysku w czasie wystarczającym do obsługi "
+"systemu audio."
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1100
+msgid ""
+"Failed to write audio data to disc fast enough to service the audio "
+"subsystem."
+msgstr ""
+"Nie udało się zapisać danych z dysku w czasie wystarczającym do obsługi "
+"systemu audio."
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1104
+msgid "The audio mixing subsystem is failing to keep up."
+msgstr "System miksowania audio słabnie."
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1108
+msgid "The audio subsystem is failing to keep up."
+msgstr "Podsystem miksowania audio słabnie."
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1112
+msgid "Unknown sequencer failure mode!"
+msgstr "Nieznany tryb błędu sekwencera!"
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1170
+#, fuzzy
+msgid ""
+"<h3>System timer resolution is too low</h3><p>Rosegarden was unable to find "
+"a high-resolution timing source for MIDI performance.</p><p>This may mean "
+"you are using a Linux system with the kernel timer resolution set too low. "
+"Please contact your Linux distributor for more information.</p><p>Some Linux "
+"distributors already provide low latency kernels, see <a href=\"http://"
+"rosegarden.wiki.sourceforge.net/Low+latency+kernels\">http://rosegarden.wiki."
+"sourceforge.net/Low+latency+kernels</a> for instructions.</p>"
+msgstr ""
+"<h3>Rozdzielczość zegara systemowego jest za niska</h3><p> Różany Ogród nie "
+"był w stanie znaleźć źródła czasu o wysokiej rozdzielczości dla działania "
+"MIDI.</p><p> To może oznaczać, że używasz Linuksa z jądrem o zbyt nisko "
+"ustawionym zegarze. Proszę skontaktuj się ze swoim dystrybutorem Linuksa w "
+"celu uzyskania więcej informacji.</p>"
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1188
+#, fuzzy
+msgid ""
+"<h3>System timer resolution is too low</h3><p>Rosegarden was unable to find "
+"a high-resolution timing source for MIDI performance.</p><p>You may be able "
+"to solve this problem by loading the RTC timer kernel module. To do this, "
+"try running <b>sudo modprobe snd-rtctimer</b> in a terminal window and then "
+"restarting Rosegarden.</p><p>Alternatively, check whether your Linux "
+"distributor provides a multimedia-optimized kernel. See <a href=\"http://"
+"rosegarden.wiki.sourceforge.net/Low+latency+kernels\">http://rosegarden.wiki."
+"sourceforge.net/Low+latency+kernels</a> for notes about this.</p>"
+msgstr ""
+"<h3>Rozdzielczość zegara systemowego jest za niska</h3><p> Różany Ogród nie "
+"był w stanie znaleźć źródła czasu o wysokiej rozdzielczości dla działania "
+"MIDI.</p><p> To może oznaczać, że używasz Linuksa z jądrem o zbyt nisko "
+"ustawionym zegarze. Proszę skontaktuj się ze swoim dystrybutorem Linuksa w "
+"celu uzyskania więcej informacji.</p>"
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1312
+msgid ""
+"<p>Both MIDI and Audio subsystems have failed to initialize.</p><p>You may "
+"continue without the sequencer, but we suggest closing Rosegarden, running "
+"\"alsaconf\" as root, and starting Rosegarden again. If you wish to run "
+"with no sequencer by design, then use \"rosegarden --nosequencer\" to avoid "
+"seeing this error in the future.</p>"
+msgstr ""
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1314
+msgid ""
+"<p>The MIDI subsystem has failed to initialize.</p><p>You may continue "
+"without the sequencer, but we suggest closing Rosegarden, running \"modprobe "
+"snd-seq-midi\" as root, and starting Rosegarden again. If you wish to run "
+"with no sequencer by design, then use \"rosegarden --nosequencer\" to avoid "
+"seeing this error in the future.</p>"
+msgstr ""
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1316
+msgid ""
+"<p>The Rosegarden sequencer module version does not match the GUI module "
+"version.</p><p>You have probably mixed up files from two different versions "
+"of Rosegarden. Please check your installation.</p>"
+msgstr ""
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1322
+#, fuzzy, c-format
+msgid "<h3>Sequencer startup failed</h3>%1"
+msgstr "Uruchomienie Sekwencera nie powiodło się:%1"
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1330
+msgid ""
+"<h3>Failed to connect to JACK audio server.</h3><p>Rosegarden could not "
+"connect to the JACK audio server. This probably means the JACK server is "
+"not running.</p><p>If you want to be able to play or record audio files or "
+"use plugins, you should exit Rosegarden and start the JACK server before "
+"running Rosegarden again.</p>"
+msgstr ""
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1331
+msgid "Failed to connect to JACK"
+msgstr ""
+
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:46
+msgid "Modify MIDI filters..."
+msgstr "Modyfikuj filtry MIDI..."
+
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:58
+msgid "THRU events to ignore"
+msgstr "Ignorowane komunikaty THRU"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:131
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:60
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:96
+msgid "Note"
+msgstr "Nuta"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:132
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:61
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:97
+msgid "Program Change"
+msgstr "Zmiana Programu"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:136
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:62
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:98
+msgid "Key Pressure"
+msgstr "Nacisk Klawisza"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:137
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:63
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:99
+msgid "Channel Pressure"
+msgstr "Nacisk Kanału"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:134
+#: ../src/gui/general/EditView.cpp:899
+#: ../src/gui/rulers/ControllerEventsRuler.cpp:198
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:64
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:100
+msgid "Pitch Bend"
+msgstr "Odchylenie Stroju"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:133
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:65
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:101
+msgid "Controller"
+msgstr "Kontroler"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:135
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:66
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:102
+msgid "System Exclusive"
+msgstr "System Exclusive"
+
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:94
+msgid "RECORD events to ignore"
+msgstr "Komunikaty ignorowane podczas nagrywania"
+
+#: ../src/gui/widgets/TimeWidget.cpp:101
+msgid "Note:"
+msgstr "Nuta:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:108 ../src/gui/widgets/TimeWidget.cpp:145
+msgid "<inexact>"
+msgstr "<niedokładne>"
+
+#: ../src/gui/widgets/TimeWidget.cpp:151
+msgid "Units:"
+msgstr "Jednostki:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:173
+msgid "Time:"
+msgstr "Czas:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:184
+msgid "units"
+msgstr "jednostki"
+
+#: ../src/gui/widgets/TimeWidget.cpp:193
+msgid "Measures:"
+msgstr "Takty:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:193
+msgid "Measure:"
+msgstr "Takt:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:212
+msgid "beats:"
+msgstr "miary:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:212
+msgid "beat:"
+msgstr "miara:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:230
+msgid "%1:"
+msgstr "%1:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:254
+msgid "Seconds:"
+msgstr "Sekundy:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:273
+msgid "msec:"
+msgstr "msek:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:407 ../src/gui/widgets/TimeWidget.cpp:531
+msgid "(%1/%2 time)"
+msgstr "(%1/%2 czas)"
+
+#: ../src/gui/widgets/TimeWidget.cpp:452
+msgid "(starting %1.%2 qpm, %2.%3 bpm)"
+msgstr "(rozpoczynanie %1.%2 qpm, %2.%3 bpm)"
+
+#: ../src/gui/widgets/TimeWidget.cpp:458
+msgid "(starting %1.%2 bpm)"
+msgstr "(rozpoczynanie %1.%2 bpm)"
+
+#: ../src/gui/widgets/TimeWidget.cpp:464
+msgid "(%1.%2 qpm, %2.%3 bpm)"
+msgstr "(%1.%2 qpm, %2.%3 bpm)"
+
+#: ../src/gui/widgets/TimeWidget.cpp:470
+msgid "(%1.%2 bpm)"
+msgstr "(%1.%2 bpm)"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:239
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:60
+msgid "C"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:241
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:61
+#, fuzzy
+msgid "D"
+msgstr "Nr"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:243
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:62
+msgid "E"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:244
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:63
+msgid "F"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:246
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:64
+msgid "G"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:248
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:65
+#, fuzzy
+msgid "A"
+msgstr "A4"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:250
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:66
+msgid "B"
+msgstr ""
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:70
+msgid "-2"
+msgstr ""
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:71
+msgid "-1"
+msgstr ""
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:72
+msgid "0"
+msgstr "0"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:73
+#, fuzzy
+msgid "1"
+msgstr "%1"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:74
+msgid "2"
+msgstr ""
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:75
+msgid "3"
+msgstr ""
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:76
+#, fuzzy
+msgid "4"
+msgstr "A4"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:77
+msgid "5"
+msgstr ""
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:78
+msgid "6"
+msgstr ""
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:79
+msgid "7"
+msgstr ""
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:83
+#, fuzzy
+msgid "double flat"
+msgstr "Podwójny bemol"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:84
+#, fuzzy
+msgid "flat"
+msgstr "Bemol"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:85
+#, fuzzy
+msgid "natural"
+msgstr "Naturalny"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:86
+#, fuzzy
+msgid "sharp"
+msgstr "Krzyżyk"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:87
+#, fuzzy
+msgid "double sharp"
+msgstr "Podwójny krzyżyk"
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:234
+#, c-format
+msgid "In %1"
+msgstr "Wejście %1"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:587
+#: ../src/gui/widgets/AudioRouteMenu.cpp:236
+#: ../src/gui/widgets/AudioRouteMenu.cpp:259
+msgid "Master"
+msgstr "Suma"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:528
+#: ../src/gui/widgets/AudioRouteMenu.cpp:238
+#: ../src/gui/widgets/AudioRouteMenu.cpp:261
+#, c-format
+msgid "Sub %1"
+msgstr "Szyna %1"
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:244
+msgid "In %1 R"
+msgstr "Wejście %1 Prawe"
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:245
+msgid "In %1 L"
+msgstr "Wejście %1 Lewe"
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:247
+msgid "Master R"
+msgstr "Suma Prawa"
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:248
+msgid "Master L"
+msgstr "Suma Lewa"
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:250
+msgid "Sub %1 R"
+msgstr "Szyna %1 Prawa"
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:251
+msgid "Sub %1 L"
+msgstr "Szyna %1 Lewa"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:391
+#: ../src/gui/studio/AudioMixerWindow.cpp:522
+#: ../src/gui/widgets/AudioFaderBox.cpp:82
+msgid "Audio plugin button"
+msgstr "Przycisk Wtyczki Audio"
+
+#: ../src/gui/editors/parameters/AudioInstrumentParameterPanel.cpp:129
+#: ../src/gui/editors/parameters/AudioInstrumentParameterPanel.cpp:357
+#: ../src/gui/widgets/AudioFaderBox.cpp:91
+msgid "<no synth>"
+msgstr "<brak syntezatora>"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:93
+msgid "Synth plugin button"
+msgstr "Przycisk Syntezatora Wtyczkowego"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:153
+msgid "Set the audio pan position in the stereo field"
+msgstr "Ustaw panoramę audio w polu stereo"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:155
+msgid "Open synth plugin's native editor"
+msgstr "Otwórz natywny edytor syntezatora wtyczkowego"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:157
+msgid "Mono or Stereo Instrument"
+msgstr "Instrument Mono lub Stereo "
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:159
+msgid "Record level"
+msgstr "poziom Nagrania"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:161
+msgid "Playback level"
+msgstr "poziom Sygnału Odtwarzania"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:345
+#: ../src/gui/studio/AudioMixerWindow.cpp:347
+#: ../src/gui/studio/AudioMixerWindow.cpp:503
+#: ../src/gui/studio/AudioMixerWindow.cpp:505
+#: ../src/gui/widgets/AudioFaderBox.cpp:163
+msgid "Audio level"
+msgstr "Poziom dźwięku"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:170
+msgid "In:"
+msgstr "Wejście:"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:173
+msgid "Out:"
+msgstr "Wyjście:"
+
+#: ../src/gui/widgets/ProgressDialog.cpp:48
+#: ../src/gui/widgets/ProgressDialog.cpp:53
+#: ../src/gui/widgets/ProgressDialog.cpp:76
+msgid "Processing..."
+msgstr "Przetwarzanie..."
+
+#: ../src/gui/configuration/ColourConfigurationPage.h:60
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:130
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:346
+#: ../src/gui/widgets/ColourTable.cpp:52
+msgid "Color"
+msgstr "Kolor"
+
+#: ../src/gui/widgets/ColourTable.cpp:68
+msgid "Modify Color Name"
+msgstr "Modyfikuj Nazwę Koloru"
+
+#: ../src/gui/configuration/ColourConfigurationPage.cpp:129
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:983
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:882
+#: ../src/gui/widgets/ColourTable.cpp:68
+msgid "Enter new name"
+msgstr "Wprowadź nową nazwę"
+
+#: ../src/gui/widgets/ColourTable.cpp:107
+msgid "Default Color"
+msgstr "Domyślny Kolor"
+
+#: ../src/gui/widgets/Rotary.cpp:108
+msgid ""
+"Click and drag up and down or left and right to modify.\n"
+"Double click to edit value directly."
+msgstr ""
+"Kliknij i przeciągnik w górę i w dół , lub prawo i lewo by zmodyfikować.\n"
+"Kliknij podwójnie by edytować wartość bezpośrednio."
+
+#: ../src/gui/widgets/Rotary.cpp:433
+msgid "Select a new value"
+msgstr "Wybierz nową wartość"
+
+#: ../src/gui/widgets/Rotary.cpp:434
+msgid "Enter a new value"
+msgstr "Wprowadź nową wartość"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:80
+msgid "Quantizer"
+msgstr "Kwantyzator"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:86
+msgid "Quantizer type:"
+msgstr "Typ kwantyzacji:"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:88
+msgid "Grid quantizer"
+msgstr "Kwantyzator typu siatka"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:89
+msgid "Legato quantizer"
+msgstr "Kwantyzator typ legato"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:90
+msgid "Heuristic notation quantizer"
+msgstr "Heurystyczny kwantyzator notacji"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:94
+msgid "Quantize for notation only (leave performance unchanged)"
+msgstr "Kwantyzuj tylko notację (nie zmieniaj wykonania)"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:104
+msgid "Notation parameters"
+msgstr "Parametry notacji"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:109
+#: ../src/gui/widgets/QuantizeParameters.cpp:150
+msgid "Base grid unit:"
+msgstr "Bazowa jednostka siatki:"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:114
+msgid "Complexity:"
+msgstr "Poziom komplikacji:"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:118
+msgid "Very high"
+msgstr "Bardzo Wysoki"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:119
+msgid "High"
+msgstr "Wysoki"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:224
+#: ../src/gui/widgets/QuantizeParameters.cpp:120
+msgid "Normal"
+msgstr "Normalny"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:121
+msgid "Low"
+msgstr "Niski"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:122
+msgid "Very low"
+msgstr "Bardzo Niski"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:125
+msgid "Tuplet level:"
+msgstr "Poziom Trioli:"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:129
+msgid "2-in-the-time-of-3"
+msgstr "2 w czasie 3"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4241
+#: ../src/gui/widgets/QuantizeParameters.cpp:130
+msgid "Triplet"
+msgstr "Triola"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:138
+msgid "Any"
+msgstr "Jakiekolwiek"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:141
+msgid "Permit counterpoint"
+msgstr "Zezwól na kontrapunkt"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:145
+msgid "Grid parameters"
+msgstr "Parametry siatki"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:154
+msgid "Swing:"
+msgstr "Swing:"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:159
+msgid "Iterative amount:"
+msgstr "Stopień przyciągania:"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:165
+msgid "Quantize durations as well as start times"
+msgstr "Kwantyzuj wartości rytmiczne oraz współrzędne początkowe"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:169
+msgid "After quantization"
+msgstr "Po kwantyzacji"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:183
+msgid "Show advanced options"
+msgstr "Pokaż opcje zaawansowane"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:192
+msgid "Re-beam"
+msgstr "Powtórz belkowanie"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:194
+msgid "Add articulations (staccato, tenuto, slurs)"
+msgstr "Dodaj artykulację (staccato, tenuto, łuki)"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:195
+msgid "Tie notes at barlines etc"
+msgstr "Połącz nuty na kreskach taktowych itd"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:196
+msgid "Split-and-tie overlapping chords"
+msgstr "Rozdziel i połącz nachodzące na siebie akordy"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:307
+msgid "Full quantize"
+msgstr "Pełna kwantyzacja"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:450
+msgid "Show Advanced Options"
+msgstr "Pokaż Opcje Zaawansowane"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:454
+msgid "Hide Advanced Options"
+msgstr "Ukryj Opcje Zaawansowane"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:257
+#: ../src/gui/configuration/MatrixConfigurationPage.h:56
+#: ../src/gui/configuration/MatrixConfigurationPage.h:57
+#: ../src/gui/editors/matrix/MatrixView.cpp:2709
+msgid "Matrix"
+msgstr "Pianola"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:64
+msgid "Printable headers"
+msgstr ""
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:92
+#, fuzzy
+msgid "Dedication"
+msgstr "Wskazanie"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:96
+#: ../src/gui/editors/segment/PlayListView.cpp:35
+msgid "Title"
+msgstr "Tytuł"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:100
+msgid "Subtitle"
+msgstr "Podtytuł"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:104
+#, fuzzy
+msgid "Subsubtitle"
+msgstr "Podtytuł"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:108
+#, fuzzy
+msgid "Poet"
+msgstr "Presto"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:116
+msgid "Composer"
+msgstr "Kompozytor"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:120
+#, fuzzy
+msgid "Meter"
+msgstr "Suma"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:124
+msgid "Arranger"
+msgstr "Aranżer"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:128
+#, fuzzy
+msgid "Piece"
+msgstr "Dźwięki"
+
+#: ../data/fonts/mappings/fonts.cpp:26
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:132
+msgid "Opus"
+msgstr "Opus"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:136
+msgid "Copyright"
+msgstr "Prawa Autorskie"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:140
+#, fuzzy
+msgid "Tagline"
+msgstr "Trójkąty"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:155
+#, fuzzy
+msgid "The composition comes here."
+msgstr "Zmień Długość Utworu"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:172
+msgid "Non-printable headers"
+msgstr ""
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:213
+msgid "Add New Property"
+msgstr "Dodaj Nową Właściwość"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:217
+msgid "Delete Property"
+msgstr "Skasuj Właściwość"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:236
+msgid "{new property %1}"
+msgstr "{nowa właściwość %1}"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:236
+msgid "{new property}"
+msgstr "{nowa właściwość}"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:243
+msgid "{undefined}"
+msgstr "{niezdefiniowano}"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:87
+#, fuzzy
+msgid "Double-click opens segment in"
+msgstr "Domyślny edytor (dla podwójnego kliknięcia na segment)"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:91
+#, fuzzy
+msgid "Notation editor"
+msgstr "Czas trwania:"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:92
+#, fuzzy
+msgid "Matrix editor"
+msgstr "Otwórz w Edytorze &Pianoli"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:93
+#, fuzzy
+msgid "Event List editor"
+msgstr "Otwórz w Edytorze &Lista"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:99
+msgid "Number of count-in measures when recording"
+msgstr "Ilość taków nabitych przed nagraniem"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:109
+#, fuzzy
+msgid "Auto-save interval"
+msgstr "Auto zapis odstęp czasowy (w sekundach)"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:112
+msgid "Every 30 seconds"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:113
+msgid "Every minute"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:114
+msgid "Every five minutes"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:115
+msgid "Every half an hour"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:116
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:277
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:157
+msgid "Never"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:140
+#, fuzzy
+msgid "Use JACK transport"
+msgstr "Ignoruj JACK transport"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:173
+msgid "Unknown"
+msgstr "Nieznane"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:179
+msgid "No MIDI, audio OK"
+msgstr "Brak MIDI, audio OK"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:182
+msgid "MIDI OK, no audio"
+msgstr "MIDI OK, brak audio"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:185
+msgid "MIDI OK, audio OK"
+msgstr "MIDI OK, audio OK"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:188
+msgid "No driver"
+msgstr "Brak sterownika"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:195
+#, fuzzy
+msgid "Details..."
+msgstr "Kasuj Ścieżki..."
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:204
+msgid "Behavior"
+msgstr "Zachowanie"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:219
+msgid "Side-bar parameter box layout"
+msgstr "Wygląd bocznego paska parametrów"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:223
+msgid "Vertically stacked"
+msgstr "Wertykalny spiętrzony"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:225
+msgid "Tabbed"
+msgstr "W Zakładkach"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:233
+msgid "Note name style"
+msgstr "Nazwa stylu nutowego"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:237
+msgid "Always use US names (e.g. quarter, 8th)"
+msgstr "Zawsze używaj nazw amerykańskich (quarter, 8th)"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:238
+msgid "Localized (where available)"
+msgstr "Tłumaczone (gdzie możliwe)"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:252
+#, fuzzy
+msgid "Show textured background on"
+msgstr "Użyj tła z fakturą na powierzchni płótna"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:254
+msgid "Main window"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:275
+msgid "Use bundled Klearlook theme"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:278
+msgid "When not running under KDE"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:279
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:159
+#, fuzzy
+msgid "Always"
+msgstr "Pseudonimy"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:287
+msgid "Presentation"
+msgstr "Prezentacja"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:423
+msgid ""
+"Changes to the textured background in the main window will not take effect "
+"until you restart Rosegarden."
+msgstr ""
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:168
+#: ../src/gui/configuration/GeneralConfigurationPage.h:78
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:207
+#: ../src/gui/configuration/MatrixConfigurationPage.cpp:59
+msgid "General"
+msgstr "Podstawowa"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.h:79
+msgid "General Configuration"
+msgstr "Konfiguracja Podstawowa"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:92
+msgid "Base octave number for MIDI pitch display"
+msgstr "Bazowy numer oktawy dla wyświetlania wysokości dźwięków MIDI"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:107
+msgid "Always use default studio when loading files"
+msgstr "Zawsze używaj domyślnego studio podczas ładowania plików"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:119
+#, fuzzy
+msgid "Send all MIDI Controllers at start of each playback"
+msgstr ""
+"Wysyłaj wszystkie MIDI kontrolery na początku odtwarzania\n"
+"(nastąpi nieznaczne opóźnienie)"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:121
+msgid ""
+"Rosegarden can send all MIDI Controllers (Pan, Reverb etc) to all MIDI "
+"devices every\n"
+"time you hit play if you so wish. Please note that this option will usually "
+"incur a\n"
+"delay at the start of playback due to the amount of data being transmitted."
+msgstr ""
+"Różany Ogród może wysyłać wszystkie Kontrolery MIDI(Panorama, Pogłos itd) do "
+"wszystkich urządzeń MIDI za każdym razem kiedy naciśniesz odtwarzanie. "
+"Proszę zauważ, że ta opcja powoduje opóźnienie na początku odtwarzania w "
+"wyniku transmisji dużej ilości danych."
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:138
+#, fuzzy
+msgid "Sequencer timing source"
+msgstr "Zegar sekwencera"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:163
+msgid "Load SoundFont to SoundBlaster card at startup"
+msgstr "Ładuj SoundFont do karty SoundBlaster przy starcie"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:164
+msgid ""
+"Check this box to enable soundfont loading on EMU10K-based cards when "
+"Rosegarden is launched"
+msgstr ""
+"Zaznacz to pole by zezwolić na ładowanie soundfontów do kart z chipsetem "
+"EMU10K kiedy Różany Ogród startuje"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:173
+msgid "Path to 'asfxload' or 'sfxload' command"
+msgstr "Ścieżka do polecenia 'asfxload' albo 'sfxload'"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:180
+msgid "SoundFont"
+msgstr "SoundFont"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:223
+msgid "MIDI Clock and System messages"
+msgstr "Zegar MIDI i komunikaty systemowe"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:229
+msgid "Send MIDI Clock, Start and Stop"
+msgstr "Wysyłaj Zegar MIDI, Start i Stop"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:230
+msgid "Accept Start, Stop and Continue"
+msgstr "Akceptuj Start, Stop i Kontynuuj"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:241
+msgid "MIDI Machine Control mode"
+msgstr "tryb MIDI Machine Control"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:248
+msgid "MMC Master"
+msgstr "Nadrzędny MMC"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:249
+msgid "MMC Slave"
+msgstr "Podrzędny MMC"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:260
+msgid "MIDI Time Code mode"
+msgstr "tryb MIDI Time Code"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:267
+msgid "MTC Master"
+msgstr "Nadrzędny MTC"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:268
+msgid "MTC Slave"
+msgstr "Podrzędny MTC"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:281
+msgid "Automatically connect sync output to all devices in use"
+msgstr ""
+"Automatycznie łącz wyjście synchornizacji z wszystkimi używanymi urządzeniami"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:292
+#, fuzzy
+msgid "MIDI Sync"
+msgstr "MIDI"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:308
+msgid "sfxload path"
+msgstr "ścieżka do sfxload"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:315
+msgid "Soundfont path"
+msgstr "ścieżka Soundfontów"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:67
+msgid "%1 minutes %2.%3%4 seconds (%5 units, %6 measures)"
+msgstr "%1 minut %2.%3%4 sekund (%5 jednostek, %6 taktów)"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:133
+msgid "Filename:"
+msgstr "Nazwa pliku:"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:136
+msgid "Formal duration (to end marker):"
+msgstr "Formalny czas trwania (do znacznika końca):"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:141
+msgid "Playing duration:"
+msgstr "Czas trwania"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:146
+msgid "Tracks:"
+msgstr "Ścieżki"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:147
+msgid "%1 used, %2 total"
+msgstr "%1 użyto, %2 razem"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:152
+msgid "Segments:"
+msgstr "Segmenty:"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:153
+msgid "%1 MIDI, %2 audio, %3 total"
+msgstr "%1 MIDI, %2 audio, %3 total"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:161
+msgid "Statistics"
+msgstr "Statystyka"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:170
+#: ../src/gui/editors/parameters/InstrumentParameterBox.cpp:155
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:92
+msgid "Track"
+msgstr "Ścieżka"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:171
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:125
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:90
+msgid "Label"
+msgstr "Etykietka"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:172
+msgid "Time"
+msgstr "Czas"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:174
+msgid "Events"
+msgstr "Komunikaty"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:175
+msgid "Polyphony"
+msgstr "Polifonia"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:176
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:126
+msgid "Repeat"
+msgstr "Repetycja"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:178
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:128
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:305
+#: ../src/gui/general/EditView.cpp:1488
+msgid "Transpose"
+msgstr "Transpozycja"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:179
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:129
+msgid "Delay"
+msgstr "Opóźnienie"
+
+#: ../src/gui/configuration/AudioConfigurationPage.h:61
+#: ../src/gui/configuration/AudioPropertiesPage.h:58
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:204
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:523
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:524
+msgid "Audio"
+msgstr "Audio"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:204
+#: ../src/gui/configuration/MIDIConfigurationPage.h:62
+msgid "MIDI"
+msgstr "MIDI"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:317
+msgid "Segment Summary"
+msgstr "Podsumowanie Segmentu"
+
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:63
+msgid "Audio file path:"
+msgstr "Ścieżka plików audio:"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:137
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:68
+msgid "Choose..."
+msgstr "Wybierz..."
+
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:73
+msgid "Disk space remaining:"
+msgstr "Pozostałe miejsce na dysku:"
+
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:78
+msgid "Equivalent minutes of 16-bit stereo:"
+msgstr "Równowartość minut 16-bitowego stereo:"
+
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:90
+msgid "Modify audio path"
+msgstr "Modyfiku ścieżkę audio"
+
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:113
+msgid "%1 out of %2 (%3% used)"
+msgstr "%1 z %2 (%3% użyto)"
+
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:144
+msgid "minutes at"
+msgstr "minuty w"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.h:63
+#, fuzzy
+msgid "MIDI Settings"
+msgstr "Ustawienia Audio"
+
+#: ../src/gui/configuration/AudioConfigurationPage.h:62
+#: ../src/gui/configuration/AudioPropertiesPage.h:59
+msgid "Audio Settings"
+msgstr "Ustawienia Audio"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:87
+msgid "Default layout mode"
+msgstr "Domyślny tryb widoku"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:91
+msgid "Linear layout"
+msgstr "Widok liniowy"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:92
+msgid "Continuous page layout"
+msgstr "Widok stron ciągły"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:93
+msgid "Multiple page layout"
+msgstr "Widok wielu stron"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:101
+msgid "Default spacing"
+msgstr "Domyślne odstępy"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:125
+msgid "Default duration factor"
+msgstr "Domyślny faktor czasu trwania"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:141
+msgid "Full"
+msgstr "Pełny"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:152
+msgid "Show track headers (linear layout only)"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:158
+msgid "When needed"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:166
+msgid ""
+"\"Always\" and \"Never\" mean what they usually mean\n"
+"\"When needed\" means \"when staves are too many to all fit in the current "
+"window\""
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:178
+msgid "Show non-notation events as question marks"
+msgstr "Pokaż komunikaty nie nutowe jako znaki zapytania"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:188
+msgid "Show notation-quantized notes in a different color"
+msgstr "Pokaż skwantyzowane nuty w innym kolorze"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:198
+msgid "Show \"invisible\" events in grey"
+msgstr "Pokaż \"niewidzialne\" komunikaty na szaro"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:208
+msgid "Show notes outside suggested playable range in red"
+msgstr "Pokaż nuty poza skalą instrumentu na czerwono"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:218
+msgid "Highlight superimposed notes with a halo effect"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:231
+msgid "When recording MIDI, split-and-tie long notes at barlines"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:242
+msgid "Layout"
+msgstr "Wygląd"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:255
+msgid "Default note style for new notes"
+msgstr "Domyślny styl notacji dla nowych nut"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:287
+msgid "When inserting notes..."
+msgstr "Podczas wstawiania nut..."
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:294
+msgid "Split notes into ties to make durations match"
+msgstr "Rozdziel nuty łukami by dopasować wartości rytmiczne"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:295
+msgid "Ignore existing durations"
+msgstr "Ignoruj istniejące wartości rytmiczne"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:305
+msgid "Auto-beam on insert when appropriate"
+msgstr "Auto belkowanie podczas wstawianie kiedy dotyczy"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:317
+#: ../src/gui/editors/notation/NotationEraser.cpp:54
+msgid "Collapse rests after erase"
+msgstr "Scal pauzy po wymazaniu"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:328
+msgid "Default paste type"
+msgstr "Domyślny typ wklejania"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:350
+msgid "Editing"
+msgstr "Edytowanie"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:362
+msgid "Accidentals in one octave..."
+msgstr "Znaki chromatyczne w jednej oktawie..."
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:364
+msgid "Affect only that octave"
+msgstr "Oddziaływuje tylko na tę oktawę"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:365
+msgid "Require cautionaries in other octaves"
+msgstr "Wymaga znaków przygodnych w innych oktawach"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:366
+msgid "Affect all subsequent octaves"
+msgstr "Oddziaływuje na kolejne oktawy"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:374
+msgid "Accidentals in one bar..."
+msgstr "Znaki chromatyczne w jednym takcie..."
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:376
+msgid "Affect only that bar"
+msgstr "Oddziaływuje tylko na ten takt"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:377
+msgid "Require cautionary resets in following bar"
+msgstr "Wymaga kasowników po znakach przygodnych w następujących taktach"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:378
+msgid "Require explicit resets in following bar"
+msgstr "Wymaga wyraźnego skasowania w następującym takcie"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:386
+#, fuzzy
+msgid "Key signature cancellation style"
+msgstr "Styl kasowania zmianty tonacji:"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:388
+msgid "Cancel only when entering C major or A minor"
+msgstr "Kasuj tylko przy wprowadzaniu C Dur i a moll"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:389
+msgid "Cancel whenever removing sharps or flats"
+msgstr "Kasuj tylko przy usuwaniu krzyżyków lub bemoli"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:390
+msgid "Cancel always"
+msgstr "Zawsze anuluj"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:400
+msgid "Accidentals"
+msgstr "Znaki chromatyczne"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:441
+msgid "Notation font"
+msgstr "Czcionka notacji"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:467
+msgid "Origin:"
+msgstr "Oryginał:"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:471
+msgid "Copyright:"
+msgstr "Prawa Autorskie:"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:475
+msgid "Mapped by:"
+msgstr "Mapowane przez:"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:479
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:81
+msgid "Type:"
+msgstr "Typ:"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:508
+msgid "Font size for single-staff views"
+msgstr "Rozmiar czcionki dla widoku pojedynczej pięciolinii"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:516
+msgid "Font size for multi-staff views"
+msgstr "Rozmiar czcionki dla widoku kilku pięciolinii"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:524
+msgid "Font size for printing (pt)"
+msgstr "Rozmiar czcionki dla wydruku (pt)"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:541
+msgid "Text font"
+msgstr "Czcionka tekstowa"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:549
+msgid "Sans-serif font"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:664
+msgid "%1 (smooth)"
+msgstr "%1 (gładki)"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:667
+msgid "%1 (jaggy)"
+msgstr "%1 (chropawy)"
+
+#: ../src/gui/configuration/LatencyConfigurationPage.cpp:58
+msgid "JACK latency"
+msgstr "Latencja serwera JACK"
+
+#: ../src/gui/configuration/LatencyConfigurationPage.cpp:61
+msgid ""
+"Use the \"Fetch JACK latencies\" button to discover the latency values set "
+"at\n"
+"the sequencer. It's recommended that you use the returned values but it's "
+"also\n"
+"possible to override them manually using the sliders. Note that if you "
+"change\n"
+"your JACK server parameters you should always fetch the latency values "
+"again.\n"
+"The latency values will be stored by Rosegarden for use next time."
+msgstr ""
+"Użyj przycisku \"Osiągnij wartość latencji JACK\" by sprawdzić wartości "
+"latencji w\n"
+" sekwencerze. Jest zalecane, by używać zwróconych wartości, ale jest "
+"również\n"
+" możliwe by je ręcznie zmienić używając suwaków. Zauważ, że jeśl zmienisz "
+"<br> parametry serwera JACK, powinieneś zawsze sprawdzać wartość latencji "
+"ponownie.\n"
+"Wartość latencji będzie zapisana przez Różany Ogród do następnego razu. "
+
+#: ../src/gui/configuration/LatencyConfigurationPage.cpp:65
+msgid "JACK playback latency (in ms)"
+msgstr "Latencja Serwera JACK podczas odtwarzania (w mili sekundach)"
+
+#: ../src/gui/configuration/LatencyConfigurationPage.cpp:66
+msgid "JACK record latency (in ms)"
+msgstr "Latencja Serwera JACK podczas nagrywania (w milisekundach)"
+
+#: ../src/gui/configuration/LatencyConfigurationPage.cpp:68
+msgid "Fetch JACK latencies"
+msgstr "Osiągij latencję serwera JACK"
+
+#: ../src/gui/configuration/LatencyConfigurationPage.cpp:121
+msgid "JACK Latency"
+msgstr "Latencja Serwera JACK"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:92
+msgid "Audio preview scale"
+msgstr "Oś współrzędnych podglądu dźwiękowego"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:96
+msgid "Linear - easier to see loud peaks"
+msgstr "Linearnie -łatwiej zobaczyć głośne szczyty"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:97
+msgid "Meter scaling - easier to see quiet activity"
+msgstr "Skalowanie metryczne - łatwiej zobaczyć cichą aktywność"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:105
+#, fuzzy
+msgid "Record audio files as"
+msgstr "Nagrywaj pliki dźwiękowe jako:"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:107
+msgid "16-bit PCM WAV format (smaller files)"
+msgstr "format 16-bit PCM WAV (mniejsze pliki)"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:108
+msgid "32-bit float WAV format (higher quality)"
+msgstr "format 32-bit float WAV (lepsza jakość)"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:117
+msgid "External audio editor"
+msgstr "Zewnętrzny edytor dźwiękowy"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:145
+msgid "Create JACK outputs"
+msgstr ""
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:150
+#, fuzzy
+msgid "for individual audio instruments"
+msgstr "na instrumnet audio"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:157
+#, fuzzy
+msgid "for submasters"
+msgstr "Brak Szyn"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:184
+#, fuzzy
+msgid ""
+"Rosegarden can start the JACK audio daemon (jackd) for you automatically if "
+"it isn't already running when Rosegarden starts.\n"
+"\n"
+"This is recommended for beginners and those who use Rosegarden as their main "
+"audio application, but it might not be to the liking of advanced users.\n"
+"\n"
+"If you want to start JACK automatically, make sure the command includes a "
+"full path where necessary as well as any command-line arguments you want to "
+"use.\n"
+"\n"
+"For example: /usr/local/bin/jackd -d alsa -d hw -r44100 -p 2048 -n 2\n"
+"\n"
+msgstr ""
+"Różany Ogród może dla ciebie automatycznie uruchomić serwer dźwięku JACK\n"
+"jeśli nie pracuje podczas uruchamiania Różanego Ogrodu.\n"
+"\n"
+"To jest zalecane dla początkujących i tych którzy używają Różanego Ogrodu "
+"jako podstawoej aplikacji dźwiękowej, ale niekoniecznie dla zaawansowanych "
+"użytkowników.\n"
+"Jeśli chcesz uruchamiać serwer JACK automatycznie, upewnij się, że polecenie "
+"zawiera pełną ścieżkę gdzie trzeba oraz wszystkie argumenty, których chcesz "
+"użyć.\n"
+"\n"
+"Na przykład: /usr/local/bin/jackd -d alsa -d hw -r44100 -p 2048 -n 2\n"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:196
+msgid "Start JACK when Rosegarden starts"
+msgstr "Uruchom serwer JACK podczas uruchamiania Różanego Ogrodu"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:201
+msgid "JACK command"
+msgstr ""
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:214
+#, fuzzy
+msgid "JACK Startup"
+msgstr "Rozpoczęcie"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:224
+msgid "External audio editor path"
+msgstr "Ścieżka do zewnętrznego edytora dźwiękowego"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:262
+msgid "External audio editor \"%1\" not found or not executable"
+msgstr ""
+
+#: ../src/gui/configuration/ColourConfigurationPage.cpp:70
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:448
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:863
+msgid "Add New Color"
+msgstr "Dodaj Nowy Kolor"
+
+#: ../src/gui/configuration/ColourConfigurationPage.cpp:74
+msgid "Delete Color"
+msgstr "Skasuj Kolor"
+
+#: ../src/gui/configuration/ColourConfigurationPage.cpp:93
+msgid "Color Map"
+msgstr "Mapa Koloru"
+
+#: ../src/gui/configuration/ColourConfigurationPage.cpp:128
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:983
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:882
+msgid "New Color Name"
+msgstr "Nazwa Nowego Koloru"
+
+#: ../src/gui/configuration/ColourConfigurationPage.cpp:130
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:59
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:984
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:883
+#: ../src/gui/studio/DeviceManagerDialog.cpp:115
+#: ../src/gui/studio/DeviceManagerDialog.cpp:174
+msgid "New"
+msgstr "Nowy"
+
+#: ../src/gui/configuration/LatencyConfigurationPage.h:62
+msgid "Latency"
+msgstr "Latencja"
+
+#: ../src/gui/configuration/LatencyConfigurationPage.h:63
+msgid "Sequencer Latency"
+msgstr "Latencja Sekwencera"
+
+#: ../src/gui/configuration/ColourConfigurationPage.h:61
+msgid "Color Settings"
+msgstr "Ustawienia Koloru"
+
+#: ../src/gui/studio/MidiDeviceListViewItem.cpp:55
+#: ../src/gui/studio/MidiKeyMapListViewItem.cpp:44
+msgid "Key Mapping"
+msgstr "Tabela Klawiszy"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:97
+msgid "Manage MIDI Banks and Programs"
+msgstr "Zarządzaj Bankami i Programami MIDI"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:128
+msgid "MIDI Device"
+msgstr "Urządzenia MIDI"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:130
+#: ../src/gui/studio/BankEditorDialog.cpp:219
+msgid "MSB"
+msgstr "MSB"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:131
+#: ../src/gui/studio/BankEditorDialog.cpp:218
+msgid "LSB"
+msgstr "LSB"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:140
+msgid "Add Bank"
+msgstr "Dodaj Bank"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:141
+msgid "Add Key Mapping"
+msgstr "Dodaj Tabelę Klawiszy"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:153
+msgid "Add a Bank to the current device"
+msgstr "Dodaj Bank do bieżącego urządzenia"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:157
+msgid "Add a Percussion Key Mapping to the current device"
+msgstr "Dodaj tabelę klawiszy do perkusji do bieżącego urządzenia"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:161
+msgid "Delete the current Bank or Key Mapping"
+msgstr "Skasuj bieżący Bank, lub Tabelę Klawiszy"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:165
+msgid "Delete all Banks and Key Mappings from the current Device"
+msgstr "Skasuj wszystkie Banki i Mapowania Klawiszy z bieżącego Urządzenia"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:167
+#: ../src/gui/studio/DeviceManagerDialog.cpp:117
+msgid "Import..."
+msgstr "Import..."
+
+#: ../src/gui/studio/BankEditorDialog.cpp:168
+#: ../src/gui/studio/DeviceManagerDialog.cpp:118
+msgid "Export..."
+msgstr "Eksport..."
+
+#: ../src/gui/studio/BankEditorDialog.cpp:176
+msgid ""
+"Import Bank and Program data from a Rosegarden file to the current Device"
+msgstr ""
+"Importuj dane Banków i Programów z pliku Różanego Ogrodu do bieżącego "
+"Urządzenia"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:179
+msgid ""
+"Export all Device and Bank information to a Rosegarden format interchange "
+"file"
+msgstr ""
+"Eksportuj wszystkie informacje o Bankach z tego Urządzenia do wymienialnego "
+"pliku Różanego Ogrodu"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:190
+msgid "Copy all Program names from current Bank to clipboard"
+msgstr "Kopiuj nazwy wszystkich Programów z bieżącego Banku do schowka"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:194
+msgid "Paste Program names from clipboard to current Bank"
+msgstr "Wklej nazwy Programów ze schowka do bierzącego Banku"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:216
+msgid "Show Variation list based on "
+msgstr "Pokaż listę wariacji bazując na"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1010
+msgid "<new bank>"
+msgstr "<nowy bank>"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1046
+msgid "<new mapping>"
+msgstr "<nowa tabela>"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1048
+msgid "<new mapping %1>"
+msgstr "<nowa tabela %1>"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1089
+msgid "Really delete this bank?"
+msgstr "Naprawdę skasować ten bank?"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1137
+msgid "Really delete this key mapping?"
+msgstr "Naprawdę skasować tę tabelę klawiszy?"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1187
+msgid "Really delete all banks for "
+msgstr "Naprawdę skasować wszystkie banki dla"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1476
+msgid "Import Banks from Device in File"
+msgstr "Importuj Banki z Urządzenia w Pliku"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1623
+#: ../src/gui/studio/DeviceManagerDialog.cpp:770
+msgid "Export Device as..."
+msgstr "Eksportuj Urządzenia jako..."
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1694
+msgid ""
+"There are unsaved changes.\n"
+"Do you want to apply the changes before exiting the Bank Editor or discard "
+"the changes ?"
+msgstr ""
+"Są nie zapisane zmiany.\n"
+"Chcesz zastosować zmiany przed wyjściem z Edytora Banków, czy je anulować?"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1697
+msgid "Unsaved Changes"
+msgstr "Nie zapisane Zmiany"
+
+#: ../src/gui/studio/NameSetEditor.cpp:68
+msgid "Librarian"
+msgstr "Twórca Tabeli"
+
+#: ../src/gui/studio/NameSetEditor.cpp:75
+msgid "Email"
+msgstr "Email"
+
+#: ../src/gui/studio/NameSetEditor.cpp:80
+msgid ""
+"The librarian maintains the Rosegarden device data for this device.\n"
+"If you've made modifications to suit your own device, it might be worth\n"
+"liaising with the librarian in order to publish your information for the "
+"benefit\n"
+"of others."
+msgstr ""
+"Bibliotekarz zarządza danymi urządzeń Różanego Ogrodu.\n"
+"Jeśli poczyniłeś jakieś zmiany by dopasować je do swoich urządzeń, \n"
+"warto by było opublikować te informację, by służyły\n"
+" także innym."
+
+#: ../src/gui/studio/MidiBankListViewItem.cpp:51
+#: ../src/gui/studio/MidiDeviceListViewItem.cpp:48
+msgid "Percussion Bank"
+msgstr "Bank Perkusyjny"
+
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:84
+#: ../src/gui/studio/MidiBankListViewItem.cpp:51
+#: ../src/gui/studio/MidiDeviceListViewItem.cpp:48
+msgid "Bank"
+msgstr "Bank"
+
+#: ../src/gui/studio/ChangeRecordDeviceCommand.h:39
+msgid "Change Record Device"
+msgstr "Zmień Urządzenie Nagrywające"
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:61
+#: ../src/gui/studio/DeviceManagerDialog.cpp:96
+msgid "Manage MIDI Devices"
+msgstr "Zarządzaj Urządzeniami MIDI"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:98
+msgid "Play devices"
+msgstr "Odtwarzaj Urządzenia"
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:76
+#: ../src/gui/studio/DeviceManagerDialog.cpp:106
+#: ../src/gui/studio/DeviceManagerDialog.cpp:165
+msgid "Connection"
+msgstr "Połączenia"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:119
+msgid "Banks..."
+msgstr "Banki..."
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:120
+msgid "Control Events..."
+msgstr "Zdarzenia Kontrolerów..."
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:126
+msgid "Create a new Play device"
+msgstr "Dodaj nowe urządzenie odgrywające"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:129
+#: ../src/gui/studio/DeviceManagerDialog.cpp:184
+msgid "Delete the selected device"
+msgstr "Skasuj zaznaczone urządzenie/a"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:132
+msgid ""
+"Import Bank, Program and Controller data from a Rosegarden file to the "
+"selected device"
+msgstr ""
+"Importuj dane Banków, Programów i Kontrolerów z pliku Różanego Ogrodu do "
+"zaznaczonego urządzenia"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:135
+msgid "Export Bank and Controller data to a Rosegarden interchange file"
+msgstr ""
+"Eksportuj dane Banków i Kontrolerów do wymienialnego pliku Różanego Ogrodu"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:138
+msgid "View and edit Banks and Programs for the selected device"
+msgstr "Zobacz i edytuj Banki i Programy zaznaczonego urządzenia"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:141
+msgid ""
+"View and edit Control Events for the selected device - these are special "
+"Event types that you can define against your device and control through "
+"Control Rulers or the Instrument Parameter Box "
+msgstr ""
+"Zobacz i edytuj Komunikaty Kontrolerów zaznaczonego urządzenia\n"
+" - te są Zdarzeniami Specjalnymi, które możesz definiować dla Twojego "
+"urządzenia \n"
+" i kontrolować poprzez Oś Współrzędnych Kontrolera, lub Boczny Panel "
+"Parametrów Instrumentu"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:156
+msgid "Record devices"
+msgstr "Urządzenia nagrywające"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:164
+msgid "Current"
+msgstr "Bierzący"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:181
+msgid "Create a new Record device"
+msgstr "Dodaj nowe urządzenie Nagrywające"
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:360
+#: ../src/gui/studio/DeviceEditorDialog.cpp:378
+#: ../src/gui/studio/DeviceManagerDialog.cpp:486
+#: ../src/gui/studio/DeviceManagerDialog.cpp:501
+msgid "New Device"
+msgstr "Nowe Urządzenie"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:703
+msgid "Import from Device in File"
+msgstr "importuj z Urządzenia w Pliku"
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:55
+msgid "Remap Instrument assigments..."
+msgstr "Zmień przyporządkowanie instrumentów..."
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:62
+msgid "Device or Instrument"
+msgstr "Urządzenie lub Instrument"
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:65
+msgid "Remap Tracks by all Instruments on a Device or by single Instrument"
+msgstr ""
+"Przyporządkuj Ścieżki do wszystkich Instrumentów Urządzenia albo "
+"pojedyncznego Instrumentu"
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:74
+msgid "Choose Source and Destination"
+msgstr "Wybierz Źródło i Cel"
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:77
+msgid "From"
+msgstr "Od"
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:78
+msgid "To"
+msgstr "Do"
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:120
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:121
+msgid "<no devices>"
+msgstr "<brak urządzeń>"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:155
+msgid "Show Audio &Faders"
+msgstr "Pokaż &Tłumiki Audio"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:160
+msgid "Show Synth &Faders"
+msgstr "Pokaż &Tłumiki Syntezatorów"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:165
+msgid "Show &Submasters"
+msgstr "Pokaż &Szyny"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:170
+msgid "Show &Plugin Buttons"
+msgstr "Pokaż Przyciski &Wtyczek"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:175
+msgid "Show &Unassigned Faders"
+msgstr "Pokaż &Nie przyporządkowane Tłumiki"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:184
+#, c-format
+msgid ""
+"_n: 1 Input\n"
+"%n Inputs"
+msgstr ""
+"1 Wejście\n"
+"%n Wejścia"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:194
+msgid "No Submasters"
+msgstr "Brak Szyn"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:203
+#, c-format
+msgid ""
+"_n: 1 Submaster\n"
+"%n Submasters"
+msgstr ""
+"1 Szyna\n"
+"%n Szyny"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:279
+msgid "Audio Mixer"
+msgstr "Mikser Audio"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:311
+msgid "Record input source"
+msgstr "Źródło Nagrywania"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:322
+msgid "Output destination"
+msgstr "Wyjście "
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:336
+#: ../src/gui/studio/AudioMixerWindow.cpp:495
+msgid "Pan"
+msgstr "Panorama"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:355
+msgid "Mono or stereo"
+msgstr "Mono lub stereo"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:364
+#: ../src/gui/studio/AudioMixerWindow.cpp:513
+msgid "Mute"
+msgstr "Wycisz"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:373 rc.cpp:408
+#, no-c-format
+msgid "Solo"
+msgstr "Solo"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:382
+msgid "Arm recording"
+msgstr "Uzbrój nagrywanie"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:400
+#, c-format
+msgid "Audio %1"
+msgstr "Audio %1"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:404
+#, c-format
+msgid "Synth %1"
+msgstr "Syntezator %1"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:578
+#: ../src/gui/studio/AudioMixerWindow.cpp:580
+msgid "Audio master output level"
+msgstr "Poziom sygnału sumy audio"
+
+#: ../src/gui/studio/SynthPluginManagerDialog.cpp:71
+msgid "Manage Synth Plugins"
+msgstr "Zarządzaj Syntezatorami Wtyczkowymi"
+
+#: ../src/gui/studio/SynthPluginManagerDialog.cpp:78
+msgid "Synth plugins"
+msgstr "Syntezatory Wtyczkowe"
+
+#: ../src/gui/studio/SynthPluginManagerDialog.cpp:145
+msgid "Controls"
+msgstr "Kontrolki"
+
+#: ../src/gui/studio/SynthPluginManagerDialog.cpp:152
+msgid "Editor >>"
+msgstr "Edytor >>"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:66
+#: ../src/gui/studio/MidiProgramsEditor.cpp:169
+msgid "Bank and Program details"
+msgstr "Szczegóły Banku i Programu"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:67
+msgid "Programs"
+msgstr "Programy"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2711
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:88
+#: ../src/gui/studio/MidiProgramsEditor.cpp:93
+msgid "Percussion"
+msgstr "Perkusja"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:99
+msgid "MSB Value"
+msgstr "Wartość MSB"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:107
+msgid ""
+"Selects a MSB controller Bank number (MSB/LSB pairs are always unique for "
+"any Device)"
+msgstr ""
+"Wybiera numer kontorlera Banku MSB (pary MSB/LSB są zawsze unikalne dla "
+"każdego urządzenia)"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:111
+msgid ""
+"Selects a LSB controller Bank number (MSB/LSB pairs are always unique for "
+"any Device)"
+msgstr ""
+"Wybiera numer kontorlera Banku LSB (pary MSB/LSB są zawsze unikalne dla "
+"każdego urządzenia)"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:116
+msgid "LSB Value"
+msgstr "Wartość LSB"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:254
+#: ../src/gui/studio/MidiProgramsEditor.cpp:541
+#, c-format
+msgid "Key Mapping: %1"
+msgstr "Mapowanie Klawisza: %1 "
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:476
+msgid "<no key mapping>"
+msgstr "<brak mapowania klaiwsza>"
+
+#: ../src/gui/studio/MidiKeyMappingEditor.cpp:57
+#: ../src/gui/studio/MidiKeyMappingEditor.cpp:81
+msgid "Key Mapping details"
+msgstr "Szczegóły mapowania klawiszy"
+
+#: ../src/gui/studio/MidiKeyMappingEditor.cpp:58
+msgid "Pitches"
+msgstr "Dźwięki"
+
+#: ../src/gui/studio/MidiMixerWindow.cpp:152
+msgid "MIDI Mixer"
+msgstr "MIDI Mikser"
+
+#: ../src/gui/studio/MidiMixerWindow.cpp:199
+msgid "Volume"
+msgstr "Głośność"
+
+#: ../src/gui/studio/AudioPluginOSCGUIManager.cpp:444
+msgid "Rosegarden Plugin"
+msgstr "Wtyczka Różanego Ogrodu"
+
+#: ../src/gui/studio/AudioPluginOSCGUIManager.cpp:447
+#, c-format
+msgid "Rosegarden: %1"
+msgstr "Różany Ogród: %1"
+
+#: ../src/gui/studio/AudioPluginOSCGUIManager.cpp:449
+msgid "Rosegarden: %1: %2"
+msgstr "Różany Ogród: %1: %2"
+
+#: ../src/gui/studio/AudioPluginOSCGUIManager.cpp:450
+#, c-format
+msgid "Plugin slot %1"
+msgstr "Wejście wtyczki %1"
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:92
+msgid "Add Play Device"
+msgstr "Dodaj urządzenie Odtwarzające"
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:93
+msgid "Add Record Device"
+msgstr "Dodaj urządzenie Nagrywające"
+
+#: ../src/commands/studio/CreateOrDeleteDeviceCommand.h:68
+#: ../src/gui/studio/DeviceEditorDialog.cpp:94
+msgid "Delete Device"
+msgstr "Skasuj Urządzenie"
+
+#: ../src/gui/editors/segment/PlayList.cpp:77
+#: ../src/gui/studio/DeviceEditorDialog.cpp:156
+#: ../src/gui/studio/DeviceEditorDialog.cpp:361
+msgid "Play"
+msgstr "Odtwarzaj"
+
+#: ../src/commands/segment/SegmentRecordCommand.cpp:37
+#: ../src/gui/studio/DeviceEditorDialog.cpp:156
+#: ../src/gui/studio/DeviceEditorDialog.cpp:379 rc.cpp:394
+#, no-c-format
+msgid "Record"
+msgstr "Nagrywaj"
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:256
+msgid "Apply pending changes?"
+msgstr "Zastosować dotychczasowe zmiany?"
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:359
+#: ../src/gui/studio/DeviceEditorDialog.cpp:377
+msgid "<new device>"
+msgstr "<nowe urządzenie>"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentEraser.cpp:82
+msgid "Click on a segment to delete it"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSplitter.cpp:166
+msgid ""
+"Click on a segment to split it in two; hold Shift to avoid snapping to beat "
+"grid"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSplitter.cpp:168
+msgid "Click on a segment to split it in two"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:81
+msgid "Click and drag to select segments"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentMover.cpp:154
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:238
+msgid "Move Segment"
+msgstr "Przesuń Segment"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentMover.cpp:154
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:239
+msgid "Move Segments"
+msgstr "Przesuń Segmenty"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:217
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:169
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:141
+#: ../src/gui/editors/segment/segmentcanvas/SegmentMover.cpp:210
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:255
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:359
+msgid "Hold Shift to avoid snapping to beat grid"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:485
+msgid ""
+"Click and drag to select segments; middle-click and drag to draw an empty "
+"segment"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:384
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:502
+msgid ""
+"Click and drag to resize a segment; hold Ctrl as well to rescale its contents"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:386
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:504
+msgid "Click and drag to rescale segment"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:509
+msgid "Click and drag to move segments; hold Ctrl as well to copy them"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:511
+msgid "Click and drag to copy segments"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:515
+msgid ""
+"Click and drag to move segment; hold Ctrl as well to copy it; double-click "
+"to edit"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:517
+msgid "Click and drag to copy segment"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:157
+#, fuzzy
+msgid ""
+"The audio file path does not exist or is not writable.\n"
+"You must set the audio file path to a valid directory in Document Properties "
+"before rescaling an audio file.\n"
+"Would you like to set it now?"
+msgstr ""
+"Ścieżka dźwiękowa nie istnieje, albo nie jest zapisywalna.\n"
+"Proszę ustaw ścieżkę dźwiękową prawidłowo we Właściwościach Dokumentu zanim "
+"nagrasz dźwięk.\n"
+"Czy chciałbyś ją teraz ustawić?"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:261
+msgid ""
+"Hold Shift to avoid snapping to beat grid; hold Ctrl as well to rescale "
+"contents"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentMover.cpp:325
+msgid "Click and drag to move a segment"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentPencil.cpp:225
+msgid "Hold Shift to avoid snapping to bar lines"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentPencil.cpp:283
+#, fuzzy
+msgid "Record or drop audio here"
+msgstr "Nagrywaj MIDI lub audio"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentPencil.cpp:289
+msgid ""
+"Click and drag to draw an empty segment. Control+Alt click and drag to draw "
+"in overlap mode."
+msgstr ""
+
+#: ../src/gui/editors/segment/TrackLabel.cpp:77
+msgid ""
+"Click and hold with left mouse button to assign this Track to an Instrument."
+msgstr ""
+"Kliknij i przytrzymaj lewym klawiszem myszy, by przyporządkować tę ścieżkę "
+"do instrumentu."
+
+#: ../src/gui/editors/segment/TrackLabel.cpp:191
+msgid "Change track name"
+msgstr "Zmień etykietkę ścieżki"
+
+#: ../src/gui/editors/segment/TrackLabel.cpp:192
+msgid "Enter new track name"
+msgstr "Wprowadź nową etykietkę ścieżki"
+
+#: ../src/gui/editors/segment/TrackEditor.cpp:648
+msgid "Turn Repeating Segment into Real Copies"
+msgstr "Zamień Repetycje Segmentu w Rzeczywiste Kopie"
+
+#: ../src/gui/editors/segment/TrackEditor.cpp:650
+msgid "Turn Repeating Segments into Real Copies"
+msgstr "Zamień Repetycje Segmentów w Rzeczywiste Kopie"
+
+#: ../src/gui/editors/segment/TrackEditor.cpp:814
+msgid ""
+"You can't drop files into Rosegarden from this client. Try using Konqueror "
+"instead."
+msgstr ""
+"Nie można przeciągnąć plików z tego programu. Spróbuj zamiast niego użyć "
+"Konqueror'a."
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:85
+msgid "Manage Triggered Segments"
+msgstr "Zarządzaj Sterowanymi Segmentami"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:89
+msgid "ID"
+msgstr "Nr"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:735
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:93
+msgid "Base velocity"
+msgstr "Bazowa Prędkość Uderzenia"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:94
+msgid "Triggers"
+msgstr "Wyzwalacze"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:115
+msgid "Add a Triggered Segment"
+msgstr "Dodaj sterowany segment"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:119
+msgid "Delete a Triggered Segment"
+msgstr "Kasuj sterowany segment"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:123
+msgid "Delete All Triggered Segments"
+msgstr "Kasuj Wszystkie Wyzwalane Segmenty"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:127
+msgid "Close the Triggered Segment Manager"
+msgstr "Zamknij Menadżera Wyzwalanych Segmentów"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:169
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:245
+msgid "<no label>"
+msgstr "<brak etykietki>"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:248
+msgid ""
+"_n: %1 on 1 track\n"
+"%1 on %n tracks"
+msgstr ""
+"%1 na 1 ścieżce\n"
+"%1 na %n ścieżkach"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:284
+msgid ""
+"This will remove all triggered segments from the whole composition. Are you "
+"sure?"
+msgstr ""
+"To spowoduje skasowanie wszystkich sterowanych segmentów z utworu. "
+"Kontynuować?"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:288
+msgid "Remove all triggered segments"
+msgstr "Usuń wszystkie sterowane segmenty"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:313
+msgid "Trigger Segment Duration"
+msgstr "Czas trwania sterowanego segmentu"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:336
+#, c-format
+msgid ""
+"_n: This triggered segment is used 1 time in the current composition. Are "
+"you sure you want to remove it?\n"
+"This triggered segment is used %n times in the current composition. Are you "
+"sure you want to remove it?"
+msgstr ""
+"Ten sterowany segment jest użyty po raz pierwszy w tym utworze. Jesteś "
+"pewien, że chcesz go usunąć?\n"
+"Wyzwalany segment jest używany %n razy w bieżącym utworze. Jesteś pewien, "
+"że chcesz go usunąć?"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:400
+msgid "Pa&ste as New Triggered Segment"
+msgstr "&Wklej jako nowy sterowany segment"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1169
+#: ../src/gui/editors/segment/MarkerEditor.cpp:399
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:412
+#: ../src/gui/editors/tempo/TempoView.cpp:622
+msgid "&Musical Times"
+msgstr "Współrzędne &Muzyczne"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1179
+#: ../src/gui/editors/segment/MarkerEditor.cpp:409
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:422
+#: ../src/gui/editors/tempo/TempoView.cpp:632
+msgid "&Real Times"
+msgstr "Współrzędne Rzeczywiste"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1189
+#: ../src/gui/editors/segment/MarkerEditor.cpp:419
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:432
+#: ../src/gui/editors/tempo/TempoView.cpp:642
+msgid "Ra&w Times"
+msgstr "Współrzędne &Surowe "
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:83
+msgid "Manage Markers"
+msgstr "Edytuj Znaczniki"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:86
+msgid "Marker time "
+msgstr "Pozycja"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:87
+#, fuzzy
+msgid "Marker text "
+msgstr "Pozycja"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:88
+msgid "Marker description "
+msgstr "Opis"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:95
+msgid "Pointer position"
+msgstr "Pozycja Kursora"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:100
+msgid "Real time:"
+msgstr "Czas Rzeczywisty:"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:103
+msgid "In measure:"
+msgstr "W takcie:"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:121
+msgid "Add a Marker"
+msgstr "Dodaj Znacznik"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:125
+msgid "Delete a Marker"
+msgstr "Skasuj Znacznik"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:129
+msgid "Delete All Markers"
+msgstr "Skasuj Wszystkie Znaczniki"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:133
+msgid "Close the Marker Editor"
+msgstr "Zamknij Edytora Znaczników"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:296
+msgid "Remove all markers"
+msgstr "Usuń Wszystkie Oznaczenia"
+
+#: ../src/gui/editors/segment/PlayList.cpp:76
+msgid "Add..."
+msgstr "Dodaj..."
+
+#: ../src/gui/editors/segment/PlayList.cpp:78
+msgid "Move Up"
+msgstr "Do góry"
+
+#: ../src/gui/editors/segment/PlayList.cpp:79
+msgid "Move Down"
+msgstr "W dół"
+
+#: ../src/gui/editors/segment/PlayList.cpp:124
+msgid "Select one or more Rosegarden files"
+msgstr "Zaznacz jeden lub więcej plików Różanego Ogrodu"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:73
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:55
+msgid "<not showing>"
+msgstr "<bez pokazywania>"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:89
+msgid "Manage Control Events"
+msgstr "Zarządzaj Komunikatami Kontrolera"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:91
+msgid "<no device>"
+msgstr "<brak urządzenia>"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:99
+msgid " Control Events for %1 (device %2)"
+msgstr "Komunikaty Kontrolerów dla %1 (urządzenie %2)"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:104
+msgid "Control Event name "
+msgstr "Nazwa"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:105
+msgid "Control Event type "
+msgstr "Typ "
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:106
+msgid "Control Event value "
+msgstr "Wartość"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:107
+msgid "Description "
+msgstr "Opis"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:108
+msgid "Min "
+msgstr "Min."
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:109
+msgid "Max "
+msgstr "Maks."
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:110
+msgid "Default "
+msgstr "Wart. Domyślna"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:111
+msgid "Color "
+msgstr "Kolor "
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:112
+msgid "Position on instrument panel"
+msgstr "Nr na panelu"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:136
+msgid "Add a Control Parameter to the Studio"
+msgstr "Dodaj parametr Kontrolera do Studio"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:140
+msgid "Delete a Control Parameter from the Studio"
+msgstr "Usuń parametr Kontrolera ze Studio"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:144
+msgid "Close the Control Parameter editor"
+msgstr "Zamknij Edytora Parametrów Kontrolera"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:221
+msgid "<default>"
+msgstr "<domyślny>"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:62
+msgid "Edit Control Parameter"
+msgstr "Edytuj Parametr Kontrolera"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:71
+msgid "Control Event Properties"
+msgstr "Właściwości Typu Komunikatów"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:77
+msgid "Name:"
+msgstr "Nazwa:"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:93
+msgid "Control Event value:"
+msgstr "Wartość Kontrolera:"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:97
+msgid "Minimum value:"
+msgstr "Minimalna wartość:"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:101
+msgid "Maximum value:"
+msgstr "Maksymalna wartość:"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:105
+msgid "Default value:"
+msgstr "Domyślna wartość:"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:109
+msgid "Color:"
+msgstr "Kolor:"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:113
+msgid "Instrument Parameter Box position:"
+msgstr "Nr na panelu Parametry Instrumentu:"
+
+#: ../src/gui/editors/segment/TrackButtons.cpp:209
+#: ../src/gui/editors/segment/TrackButtons.cpp:585
+#: ../src/gui/editors/segment/TrackButtons.cpp:935
+#: ../src/gui/editors/segment/TrackButtons.cpp:1127
+msgid "<no instrument>"
+msgstr "<brak instrumentu>"
+
+#: ../src/gui/editors/segment/TrackButtons.cpp:352
+#: ../src/gui/editors/segment/TrackButtons.cpp:1094
+msgid "<untitled audio>"
+msgstr "<niezatytułowane audio>"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:130
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:662
+#: ../src/gui/editors/segment/TrackButtons.cpp:354
+#: ../src/gui/editors/segment/TrackButtons.cpp:1096
+msgid "<untitled>"
+msgstr "<niezatytułowana>"
+
+#: ../src/gui/editors/segment/TrackButtons.cpp:1058
+msgid "Mute track"
+msgstr "Wycisz ścieżkę"
+
+#: ../src/gui/editors/segment/TrackButtons.cpp:1063
+msgid "Record on this track"
+msgstr "Nagrywaj na tę ścieżkę"
+
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:88
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:1015
+msgid "Segment"
+msgstr "Segment"
+
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:89
+msgid "Segment Parameters"
+msgstr "Parametry Segmentu"
+
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:366
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:697
+msgid "%1 ms"
+msgstr "%1 ms"
+
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:1031
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:910
+msgid "Highest playable note"
+msgstr "Najwyższa możliwa do wykonania nuta"
+
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:1051
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:930
+msgid "Lowest playable note"
+msgstr "Najniższa możliwa do wykonania nuta"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:93
+msgid "Track Parameters"
+msgstr "Parametry ścieżki"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:137
+msgid "Playback parameters"
+msgstr "Parametry odtwarzania"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:172
+msgid "Recording filters"
+msgstr "Filtry nagywania"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:191
+msgid "Channel"
+msgstr "Kanał"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:203
+#, fuzzy
+msgid "Staff export options"
+msgstr "Pokaż opcje zaawansowane"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:220
+#, fuzzy
+msgid "Notation size:"
+msgstr "Współrzędne notacji:"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:225
+#, fuzzy
+msgid "Small"
+msgstr "Wszystkie"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:226
+msgid "Tiny"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:233
+#, fuzzy
+msgid "Bracket type:"
+msgstr "Typ tekstu:"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:237
+msgid "-----"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:238
+msgid "[----"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:239
+msgid "----]"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:240
+msgid "[---]"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:241
+msgid "{----"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:242
+msgid "----}"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:243
+msgid "{[---"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:244
+msgid "---]}"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:253
+#, fuzzy
+msgid "Create segments with"
+msgstr "Twórz segmenty z:"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:264
+msgid "Preset"
+msgstr "Ustawienie"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:272
+msgid "Load"
+msgstr "Ładuj"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:282
+msgid "treble"
+msgstr "wiolinowy"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:283
+msgid "bass"
+msgstr "basowy"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:284
+msgid "crotales"
+msgstr "krotale"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:285
+msgid "xylophone"
+msgstr "ksylofon"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:286
+msgid "guitar"
+msgstr "gitarowy"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:287
+msgid "contrabass"
+msgstr "kontrabasowy"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:288
+msgid "celesta"
+msgstr "czelesta"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:289
+msgid "old celesta"
+msgstr "stara czelesta"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:290
+msgid "french"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:291
+msgid "soprano"
+msgstr "sopranowy"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:292
+#, fuzzy
+msgid "mezzosoprano"
+msgstr "sopranowy"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:293
+msgid "alto"
+msgstr "altowy"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:294
+msgid "tenor"
+msgstr "tenorowy"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:295
+#, fuzzy
+msgid "baritone"
+msgstr "Wariacje"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:296
+#, fuzzy
+msgid "varbaritone"
+msgstr "Wariacje"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:297
+#, fuzzy
+msgid "subbass"
+msgstr "basowy"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:327
+#, fuzzy
+msgid "Lowest"
+msgstr "Niski"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:329
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:336
+msgid "---"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:331
+msgid "Choose the lowest suggested playable note, using a staff"
+msgstr "Wybierz najniższą możliwą do wykonania nutę, za pomocą pięciolinii"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:334
+#, fuzzy
+msgid "Highest"
+msgstr "Wysoki"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:338
+msgid "Choose the highest suggested playable note, using a staff"
+msgstr "Wybierz najwyższą możliwą do wykonania nutę, za pomocą pięciolinii"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:666
+#, fuzzy
+msgid "[ Track %1 - %2 ]"
+msgstr "[ Ścieżka#%1 - %2 ]"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:985
+msgid "The instrument preset database is corrupt. Check your installation."
+msgstr "Baza danych instrumentów jest zepsuta. Sprawdź Twoją instalację."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:173
+#: ../src/gui/editors/parameters/InstrumentParameterBox.cpp:54
+msgid "Instrument Parameters"
+msgstr "Parametry Instrumentu"
+
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:85
+msgid "Variation"
+msgstr "Wariacje"
+
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:86
+msgid "Program"
+msgstr "Program"
+
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:87
+msgid "Channel out"
+msgstr "Wyjście Kanału"
+
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:215
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:221
+msgid "[ %1 ]"
+msgstr "[ %1 ]"
+
+#: ../src/gui/editors/matrix/MatrixEraser.cpp:58
+#: ../src/gui/editors/matrix/MatrixMover.cpp:71
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:67
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:77
+msgid "Switch to Draw Tool"
+msgstr "Przejdź do Narzędzia Rysowania"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:75
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:69
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:71
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:81
+#: ../src/gui/editors/notation/ClefInserter.cpp:57
+#: ../src/gui/editors/notation/GuitarChordInserter.cpp:63
+#: ../src/gui/editors/notation/NotationSelector.cpp:87
+#: ../src/gui/editors/notation/NoteInserter.cpp:113
+#: ../src/gui/editors/notation/RestInserter.cpp:72
+#: ../src/gui/editors/notation/TextInserter.cpp:61
+msgid "Switch to Erase Tool"
+msgstr "Przejdź do Narzędzia Kasowania"
+
+#: ../src/gui/editors/matrix/MatrixEraser.cpp:62
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:73
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:75
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:85
+msgid "Switch to Move Tool"
+msgstr "Przejdź do Narzędzia Przesuwania"
+
+#: ../src/gui/editors/matrix/MatrixEraser.cpp:68
+#: ../src/gui/editors/matrix/MatrixMover.cpp:81
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:79
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:93
+msgid "Switch to Resize Tool"
+msgstr "Przejdź do Narzędzia Zmiany Rozmiaru"
+
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:446
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:579
+msgid "Click and drag to select; middle-click and drag to draw new note"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:324
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:597
+msgid "Click and drag to resize selected notes"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:599
+msgid "Click and drag to resize note"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:471
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:604
+msgid "Click and drag to move selected notes; hold Ctrl as well to copy"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:473
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:606
+msgid "Click and drag to copy selected notes"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:610
+msgid "Click and drag to move note; hold Ctrl as well to copy"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:612
+msgid "Click and drag to copy note"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixEraser.cpp:54
+#: ../src/gui/editors/matrix/MatrixMover.cpp:67
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:65
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:63
+#: ../src/gui/editors/notation/ClefInserter.cpp:53
+#: ../src/gui/editors/notation/GuitarChordInserter.cpp:59
+#: ../src/gui/editors/notation/NotationEraser.cpp:67
+#: ../src/gui/editors/notation/NoteInserter.cpp:109
+#: ../src/gui/editors/notation/RestInserter.cpp:68
+#: ../src/gui/editors/notation/TextInserter.cpp:57
+msgid "Switch to Select Tool"
+msgstr "Przejdź do Narzędzia Zaznaczania"
+
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:218
+msgid "Resize Event"
+msgstr "Zmień rozmiar komunikatu"
+
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:221
+msgid "Resize Events"
+msgstr "Zmień rozmiar komunikatów"
+
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:326
+msgid "Click and drag to resize a note"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:328
+#, fuzzy
+msgid "Copy and Move Event"
+msgstr "Przesuń Komunikat"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:330
+#, fuzzy
+msgid "Copy and Move Events"
+msgstr "Przesuń Komunikaty"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:334
+msgid "Move Event"
+msgstr "Przesuń Komunikat"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:336
+msgid "Move Events"
+msgstr "Przesuń Komunikaty"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:465
+msgid "Click and drag to move a note; hold Ctrl as well to copy it"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:467
+msgid "Click and drag to copy a note"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:361
+msgid "Click and drag to draw a note; Shift to avoid snapping to grid"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:363
+msgid "Click and drag to draw a note"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:437
+#: ../src/gui/editors/matrix/MatrixView.cpp:3053
+msgid "Couldn't apply piano roll layout"
+msgstr "Nie można było zastosować widoku pianoli"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:663
+msgid "Resi&ze"
+msgstr "&Zmień Rozmiar"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:669
+#: ../src/gui/editors/notation/NotationView.cpp:1919
+msgid "C&hord Insert Mode"
+msgstr "Tryb Wstawiania &Akordów"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:676
+#: ../src/gui/editors/notation/NotationView.cpp:1778
+msgid "Ste&p Recording"
+msgstr "Nagrywnie &krok po kroku"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:694
+msgid "&Legato"
+msgstr "&Legato"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:708
+#, fuzzy
+msgid "Set to Current Velocity"
+msgstr "Ustaw Bazową Prędkość Uderzenia"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:712
+msgid "Set Event &Velocities..."
+msgstr "Modifikuj Prędkości u&derzeń Komunikatów..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:716
+msgid "Trigger Se&gment..."
+msgstr "Wyzwól Se&gment..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:720
+msgid "Remove Triggers..."
+msgstr "Usuń Wyzwalacze..."
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1153
+#: ../src/gui/editors/matrix/MatrixView.cpp:724
+#: ../src/gui/editors/tempo/TempoView.cpp:606
+msgid "Select &All"
+msgstr "Zaznasz &Wszystko"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:732
+#: ../src/gui/editors/notation/NotationView.cpp:2325
+msgid "Cursor &Back"
+msgstr "Kursor do &tyłu"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:736
+#: ../src/gui/editors/notation/NotationView.cpp:2329
+msgid "Cursor &Forward"
+msgstr "Kursor do &przodu"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:740
+#: ../src/gui/editors/notation/NotationView.cpp:2333
+msgid "Cursor Ba&ck Bar"
+msgstr "Kursor do tyłu o t&akt"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:744
+#: ../src/gui/editors/notation/NotationView.cpp:2337
+msgid "Cursor For&ward Bar"
+msgstr "Kursor do przodu o ta&kt"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:748
+#: ../src/gui/editors/notation/NotationView.cpp:2341
+msgid "Cursor Back and Se&lect"
+msgstr "Kursor do tyłu i &zaznacz"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:752
+#: ../src/gui/editors/notation/NotationView.cpp:2345
+msgid "Cursor Forward and &Select"
+msgstr "Kursor do przodu i zaznacz"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:756
+#: ../src/gui/editors/notation/NotationView.cpp:2349
+msgid "Cursor Back Bar and Select"
+msgstr "Kursor do tyłu o takt i zaz&nacz"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:760
+#: ../src/gui/editors/notation/NotationView.cpp:2353
+msgid "Cursor Forward Bar and Select"
+msgstr "Kursor do p&rzodu od takt i zaznacz"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:764
+#: ../src/gui/editors/notation/NotationView.cpp:2363
+msgid "Cursor to St&art"
+msgstr "Kursor &do początku"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:770
+#: ../src/gui/editors/notation/NotationView.cpp:2369
+msgid "Cursor to &End"
+msgstr "Kursor do &końca"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:776
+#: ../src/gui/editors/notation/NotationView.cpp:2391
+msgid "Cursor to &Playback Pointer"
+msgstr "Kursor edycji do kursora &odtwarzania"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:820
+#: ../src/gui/editors/notation/NotationView.cpp:2435
+msgid "Playback Pointer to &Cursor"
+msgstr "Kursor &odtwarzania do kursora edycji"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:826
+#: ../src/gui/editors/notation/NotationView.cpp:2441
+msgid "&Solo"
+msgstr "&Solo"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:841
+#: ../src/gui/editors/notation/NotationView.cpp:2456
+msgid "Set Loop to Selection"
+msgstr "Ustaw Pętlę według Zaznaczenia"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:845
+#: ../src/gui/editors/notation/NotationView.cpp:2460
+msgid "Clear L&oop"
+msgstr "&Wyłącz Pętlę"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1157
+#: ../src/gui/editors/matrix/MatrixView.cpp:849
+#: ../src/gui/editors/notation/NotationView.cpp:2464
+#: ../src/gui/editors/tempo/TempoView.cpp:610
+msgid "Clear Selection"
+msgstr "Wyczyść Zaznaczenie"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1149
+#: ../src/gui/editors/matrix/MatrixView.cpp:854
+#: ../src/gui/editors/notation/NotationView.cpp:2471
+msgid "&Filter Selection"
+msgstr "Ustawianie &Filtra"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:879
+msgid "&No Snap"
+msgstr "&Brak Przyciągania"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:884
+msgid "Snap to Bea&t"
+msgstr "Przyciągaj do &Pulsu"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:888
+msgid "Snap to &Bar"
+msgstr "Przyciągaj do &Taktu"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:908
+#, fuzzy, c-format
+msgid "Snap to %1"
+msgstr "Przyciągaj do 1/2"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:917
+msgid "Show Instrument Parameters"
+msgstr "Pokaż parametry instrumentu"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:922
+#: ../src/gui/editors/notation/NotationView.cpp:1850
+msgid "Show Ch&ord Name Ruler"
+msgstr "Pokaż Oś Współrzędnych Nazw &Akordów"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:926
+#: ../src/gui/editors/notation/NotationView.cpp:1858
+msgid "Show &Tempo Ruler"
+msgstr "Pokaż Oś Współrzędnych &Tempa"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1238
+#: ../src/gui/editors/notation/NotationView.cpp:3245
+#, c-format
+msgid ""
+"_n: 1 event selected \n"
+" %n events selected "
+msgstr ""
+" 1 zaznaczono komunikat \n"
+" %n zaznaczono komunikaty"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1241
+#: ../src/gui/editors/notation/NotationView.cpp:3247
+msgid " No selection "
+msgstr "Brak zaznaczenia"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1348
+#: ../src/gui/editors/matrix/MatrixView.cpp:1360
+#: ../src/gui/editors/matrix/MatrixView.cpp:2079
+#: ../src/gui/editors/notation/NotationView.cpp:5869
+msgid "Quantizing..."
+msgstr "Kwantyzowanie..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1370
+#: ../src/gui/editors/notation/NotationView.cpp:5407
+msgid "Collapsing notes..."
+msgstr "Scalanie nut..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1381
+msgid "Making legato..."
+msgstr "legowanie..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1476
+#, fuzzy
+msgid "Note: %1 (%2.%3s)"
+msgstr "Współrzędne: %1 (%2.%3s)"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1531
+#: ../src/gui/editors/notation/NotationView.cpp:7206
+msgid "Time: %1 (%2.%3s)"
+msgstr "Współrzędne: %1 (%2.%3s)"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1604
+#: ../src/gui/editors/notation/NotationView.cpp:4744
+#: ../src/gui/editors/notation/NotationView.cpp:4773
+msgid "Cutting selection to clipboard..."
+msgstr "Wycinanie zaznaczenia do schowka..."
+
+#: ../src/gui/editors/eventlist/EventView.cpp:912
+#: ../src/gui/editors/matrix/MatrixView.cpp:1636
+#: ../src/gui/editors/notation/NotationSelectionPaster.cpp:82
+msgid "Couldn't paste at this point"
+msgstr "Nie można było wkleić w tym miejscu"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1647
+#: ../src/gui/editors/notation/NotationView.cpp:4754
+msgid "Deleting selection..."
+msgstr "Kasowanie zaznaczenia..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1833
+#: ../src/gui/editors/notation/NotationView.cpp:5617
+#, c-format
+msgid "Unknown note insert action %1"
+msgstr "Nieznana akcja wstawiania nut %1"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1837
+#: ../src/gui/editors/matrix/MatrixView.cpp:2857
+#: ../src/gui/editors/notation/NotationView.cpp:5621
+msgid "Inserting note"
+msgstr "Wstawianie nut"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2091
+msgid "Unquantizing..."
+msgstr "Odkwantyzowywanie..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2120
+msgid " Grid: "
+msgstr "Przyciąganie:"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2134
+msgid "Unit"
+msgstr "Jednostka"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2136
+msgid "Beat"
+msgstr "Puls"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2138
+msgid "Bar"
+msgstr "Takt"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2159
+#, fuzzy
+msgid " Velocity: "
+msgstr "Prędkość uderzenia (velocity):"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2170
+msgid " Quantize: "
+msgstr "Kwantyzacja:"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2584
+msgid "Raising velocities..."
+msgstr "Zwiększanie prędkości uderzenia..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2596
+msgid "Lowering velocities..."
+msgstr "Zmniejszanie prędkości uderzenia..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2611
+msgid "Set Event Velocities"
+msgstr "Ustaw prędkości uderzeń (velocity)"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2616
+msgid "Setting Velocities..."
+msgstr "Ustawianie Prędkości Uderzeń (velocity)... "
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2665
+msgid "Remove Triggers"
+msgstr "Usuń Wyzwalacze"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2723
+msgid "%1 - Segment Track #%2 - %3"
+msgstr "%1 - Segment Ścieżka #%2 - %3"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2730
+msgid "%1 - All Segments - %2"
+msgstr "%1 - Wszystkie Segmenty - %2"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2737
+msgid ""
+"_n: %1 - 1 Segment - %2\n"
+"%1 - %n Segments - %2"
+msgstr ""
+"%1 - 1 Segmenty - %2\n"
+"%1 - %n Segmenty - %2"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2885
+msgid "Can't insert note: No grid duration selected"
+msgstr "Nie można wstawić nuty: Nie wybrano siatki"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2935
+#, fuzzy
+msgid " Chord "
+msgstr "Akord"
+
+#: ../src/gui/editors/matrix/MatrixEraser.cpp:105
+msgid "Click on a note to delete it"
+msgstr ""
+
+#: ../src/gui/editors/tempo/TempoView.cpp:89
+msgid "Filter"
+msgstr "Filtr"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:245
+#: ../src/gui/editors/tempo/TempoView.cpp:117
+msgid "Time "
+msgstr "Współrzędne"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:118
+msgid "Type "
+msgstr "Typ"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:119
+msgid "Value "
+msgstr "Wartość"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:120
+msgid "Properties "
+msgstr "Właściwości"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:208
+msgid "Common, hidden"
+msgstr "Wspólne, ukryte"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:210
+msgid "Hidden"
+msgstr "Ukryte"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:213
+msgid "Common"
+msgstr "Wspólne"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:220
+msgid "Time Signature "
+msgstr "Metrum"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:245
+msgid "%1.%2%3"
+msgstr "%1.%2%3"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:255
+msgid "%1.%2%3 qpm (%4.%5%6 bpm) "
+msgstr "%1.%2%3 qpm (%4.%5%6 bpm) "
+
+#: ../src/gui/editors/tempo/TempoView.cpp:264
+msgid "Tempo "
+msgstr "Tempo "
+
+#: ../src/gui/editors/tempo/TempoView.cpp:271
+msgid "<nothing at this filter level>"
+msgstr "<nic w tym filtrze>"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:463
+msgid "Delete Tempo or Time Signature"
+msgstr "Kasuj Tempo lub Metrum"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:602
+msgid "&Edit Item"
+msgstr "&Edytuj Wpis"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:834
+msgid "%1 - Tempo and Time Signature Editor"
+msgstr "%1 - Edytor Tempa i Metrum"
+
+#: ../src/gui/editors/guitar/GuitarChordEditorDialog.cpp:43
+#, fuzzy
+msgid "Guitar Chord Editor"
+msgstr "edytor akordów gitarowych"
+
+#: ../src/gui/editors/guitar/GuitarChordEditorDialog.cpp:51
+#, fuzzy
+msgid "Start fret"
+msgstr "Takt początkowy"
+
+#: ../src/gui/editors/guitar/GuitarChordEditorDialog.cpp:58
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:51
+msgid "Root"
+msgstr ""
+
+#: ../src/gui/editors/guitar/GuitarChordEditorDialog.cpp:62
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:55
+#, fuzzy
+msgid "Extension"
+msgstr "Wersja"
+
+#: ../src/gui/editors/guitar/Fingering.cpp:118
+msgid "couldn't parse fingering '%1' in '%2'"
+msgstr ""
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:45
+#, fuzzy
+msgid "Guitar Chord Selector"
+msgstr "Wybierak akordów"
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:64
+msgid "beginner"
+msgstr ""
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:65
+#, fuzzy
+msgid "common"
+msgstr "Wspólne"
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:66
+#, fuzzy
+msgid "all"
+msgstr "Wszystkie"
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:86
+#, fuzzy
+msgid "Fingerings"
+msgstr "&Palcowanie"
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:419
+#, fuzzy
+msgid "couldn't open file '%1'"
+msgstr "Nie można otworzyć pliku '%1'"
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:428
+#, c-format
+msgid "couldn't parse chord dictionnary : %1"
+msgstr ""
+
+#: ../src/gui/editors/notation/NoteFontViewer.cpp:87
+#, c-format
+msgid "Note Font Viewer: %1"
+msgstr "Przeglądarka Czcionek Nutowych: %1"
+
+#: ../src/gui/editors/notation/NoteFontViewer.cpp:93
+msgid " Component: "
+msgstr "Komponent: "
+
+#: ../src/gui/editors/notation/NoteFontViewer.cpp:101
+msgid " View: "
+msgstr "Widok:"
+
+#: ../src/gui/editors/notation/NoteFontViewer.cpp:104
+msgid "Glyphs"
+msgstr "Symbol"
+
+#: ../src/gui/editors/notation/NoteFontViewer.cpp:105
+msgid "Codes"
+msgstr "Kody"
+
+#: ../src/gui/editors/notation/NoteFontViewer.cpp:107
+msgid " Page: "
+msgstr "Strona:"
+
+#: ../src/gui/editors/notation/ClefInserter.cpp:64
+#: ../src/gui/editors/notation/GuitarChordInserter.cpp:71
+#: ../src/gui/editors/notation/RestInserter.cpp:79
+#: ../src/gui/editors/notation/TextInserter.cpp:68
+msgid "Switch to Inserting Notes"
+msgstr "Przejdź do Wstawiania Nut"
+
+#: ../src/gui/editors/notation/NotationView.cpp:522
+#, fuzzy
+msgid "Close track headers"
+msgstr "Zmień etykietkę ścieżki"
+
+#: ../src/gui/editors/notation/NotationView.cpp:917
+msgid "Preparing to print..."
+msgstr "Przygotowanie do drukowania..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:1516
+msgid "Note &Font"
+msgstr "Czcionka &nut"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1539
+msgid "Si&ze"
+msgstr "&Rozmiar"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1545
+#, fuzzy
+msgid "Show Track Headers"
+msgstr "Pokaż &Etykietki Ścieżki"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1550
+msgid "S&pacing"
+msgstr "&Odstępy między znakami"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1572
+msgid "Du&ration Factor"
+msgstr "Miejsce &Wartości Rytmicznych"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1598
+msgid "Note &Style"
+msgstr "&Styl Główek"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1624
+msgid "Insert Rest"
+msgstr "Wstaw Pauzy"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1628
+msgid "Switch from Note to Rest"
+msgstr "Przejdź z Nut do Pauz"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1633
+msgid "Switch from Rest to Note"
+msgstr "Przejdź z Pauz do Nut"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1690
+msgid "No accidental"
+msgstr "Brak znaków chromatycznych"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1691
+msgid "Follow previous accidental"
+msgstr "Podążaj za poprzednim znakiem chromatycznym"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1692
+msgid "Sharp"
+msgstr "Krzyżyk"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1693
+msgid "Flat"
+msgstr "Bemol"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1694
+msgid "Natural"
+msgstr "Naturalny"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1695
+msgid "Double sharp"
+msgstr "Podwójny krzyżyk"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1696
+msgid "Double flat"
+msgstr "Podwójny bemol"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1717
+msgid "&Treble Clef"
+msgstr "Klucz &wiolinowy"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1724
+msgid "&Alto Clef"
+msgstr "Klucz &altowy"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1731
+msgid "Te&nor Clef"
+msgstr "Klucz &tenorowy"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1738
+msgid "&Bass Clef"
+msgstr "Klucz &basowy"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1745
+msgid "&Text"
+msgstr "&Tekst"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1751
+#, fuzzy
+msgid "&Guitar Chord"
+msgstr "edytor akordów gitarowych"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1784
+msgid "Select from Sta&rt"
+msgstr "Zaznacz od &Początku"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1788
+msgid "Select to &End"
+msgstr "Zaznacz do &Końca"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1792
+msgid "Select Whole St&aff"
+msgstr "Zaznacz całą &Pięciolinię"
+
+#: ../src/commands/edit/CutAndCloseCommand.h:53
+#: ../src/gui/editors/notation/NotationView.cpp:1796
+msgid "C&ut and Close"
+msgstr "W&ytnij i Zamknij"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1800
+msgid "Pa&ste..."
+msgstr "&Wklej"
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:122
+#: ../src/gui/editors/notation/NotationView.cpp:1808
+msgid "Move to Staff Above"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:126
+#: ../src/gui/editors/notation/NotationView.cpp:1812
+msgid "Move to Staff Below"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1826
+msgid "&Linear Layout"
+msgstr "&Widok Liniowy"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1835
+msgid "&Continuous Page Layout"
+msgstr "Ciągły Widok Stron"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1844
+msgid "&Multiple Page Layout"
+msgstr "Widok Wielu Stron"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1854
+msgid "Show Ra&w Note Ruler"
+msgstr "Pokaż Oś Współrzędnych Nut &Surową"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1862
+msgid "Show &Annotations"
+msgstr "Pokaż &Adnotacje"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1866
+msgid "Show Lily&Pond Directives"
+msgstr "Pokaż Dyrektywy &Lilypond"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1870
+msgid "Open L&yric Editor"
+msgstr "Otwórz Edytor &Tekstu"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1912
+msgid "Trip&let Insert Mode"
+msgstr "Tryb Wstawiania Triol"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1926
+#, fuzzy
+msgid "Grace Insert Mode"
+msgstr "Tryb Wstawiania Triol"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2180
+msgid "&Dump selected events to stderr"
+msgstr "&Wyrzucaj następujące komunikaty do standardowego wyjścia"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2248
+msgid "Ma&ke Ornament..."
+msgstr "&Zrób Ozdobnik..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:2252
+msgid "Trigger &Ornament..."
+msgstr "Wyzwól &Ozdobnik..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:2256
+msgid "Remove Ornament..."
+msgstr "Usuń Ozdobnik..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:2261
+msgid "&None"
+msgstr "&Brak"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2289
+#, fuzzy
+msgid "Convert Notation For..."
+msgstr "Eksportowanie pliku dźwiękowego..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:2298
+msgid "Show &Notes Toolbar"
+msgstr "Pokaż Panel Narzędzi &Nut"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2299
+msgid "Show &Rests Toolbar"
+msgstr "Pokaż Panel Narzędzi &Pauz"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2300
+msgid "Show &Accidentals Toolbar"
+msgstr "Pokaż Panel Narzędzi &Znaków Chromatycznch"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2301
+msgid "Show Cle&fs Toolbar"
+msgstr "Pokaż Panel Narzędzi &Kluczy"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2303
+msgid "Show &Marks Toolbar"
+msgstr "Pokaż Panel Narzędzi &Znaczników"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2305
+msgid "Show &Group Toolbar"
+msgstr "Pokaż Panel Narzędzi &Grup"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2307
+msgid "Show &Layout Toolbar"
+msgstr "Pokaż Panel Narzędzi &Widoku"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2311
+msgid "Show M&eta Toolbar"
+msgstr "Pokaż Panel Narzędzi Meta"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2373
+msgid "Cursor &Up Staff"
+msgstr "Kursor pięciolinię do &góry"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2377
+msgid "Cursor &Down Staff"
+msgstr "Kursor pięciolinię w &dół"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2381
+msgid "Cursor Pre&vious Segment"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2385
+#, fuzzy
+msgid "Cursor Ne&xt Segment"
+msgstr "Twórz Segment"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2475
+msgid "Push &Left"
+msgstr "Przesuń w &Lewo"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2479
+msgid "Push &Right"
+msgstr "Przesuń w &Prawo"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2483
+msgid "Push &Up"
+msgstr "Przesuń do &Góry"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2487
+msgid "Push &Down"
+msgstr "Przesuń w &Dół"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2491
+#, fuzzy
+msgid "&Restore Positions"
+msgstr "&Przywróć Wyliczone Pozycje "
+
+#: ../src/gui/editors/notation/NotationView.cpp:2495
+msgid "Make &Invisible"
+msgstr "Zrób &Niewidoczne"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2499
+msgid "Make &Visible"
+msgstr "Zrób &Widoczne"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2503
+msgid "Toggle Dot"
+msgstr "Przełączaj Kropki"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2507
+#: ../src/gui/editors/notation/NotationView.cpp:2511
+msgid "Add Dot"
+msgstr "Dodaj Kropkę"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2570
+#, c-format
+msgid ""
+"_n: 1 pixel\n"
+"%n pixels"
+msgstr ""
+"1 piksel\n"
+"%n piksele"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2619
+msgid " Font: "
+msgstr "Czcionka:"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2647
+msgid "Unknown font \"%1\", using default"
+msgstr "Nieznana czcionka \"%1\", użyto domyślnej"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2655
+msgid " Size: "
+msgstr "Powiększenie:"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2677
+msgid " Spacing: "
+msgstr "Odstępy:"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2993
+#: ../src/gui/editors/notation/NotationView.cpp:3818
+msgid " Ready."
+msgstr "Gotowy."
+
+#: ../src/gui/editors/notation/NotationView.cpp:2998
+msgid "Laying out score..."
+msgstr "Układanie nut..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:3011
+msgid "Laying out staff %1..."
+msgstr "Układanie pięciolinii %1..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:3020
+msgid "Reconciling staffs..."
+msgstr "Godzenie pięciolinii..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:3885
+msgid "Sizing and allocating canvas..."
+msgstr "Zmiana rozmiaru i przydzielenie płótna..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:4050
+msgid "note"
+msgstr "nuta"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4050
+msgid "rest"
+msgstr "pauza"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4211
+msgid "%1 - Segment Track #%2 - Notation"
+msgstr "%1 - Segment Ścieżka #%2 - Notatacja"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4217
+msgid "%1 - All Segments - Notation"
+msgstr "%1 - Wszystkie Segmenty - Notacja"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4222
+msgid ""
+"_n: %1 - Segment - Notation\n"
+"%1 - %n Segments - Notation"
+msgstr "%1 - Segmenty - Notatacja%1 - %n Segmenty - Notatacja"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4243
+#, fuzzy
+msgid "Grace"
+msgstr "Grave"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4247
+#: ../src/gui/editors/notation/NotationView.cpp:4251
+#: ../src/gui/editors/notation/NotationView.cpp:4255
+#, fuzzy
+msgid "%1 %2"
+msgstr "%1 (%2)"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4271
+msgid "Hidden annotations"
+msgstr "Ukryte adnotacje"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4293
+msgid "Hidden LilyPond directives"
+msgstr "Ukryte dyrektywy Lilypond"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4326
+#, c-format
+msgid "Unknown spacing action %1"
+msgstr "Nieznana akcja odległości %1"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4384
+#, c-format
+msgid "Unknown proportion action %1"
+msgstr "Nieznana akcja proporcji %1"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4431
+#, c-format
+msgid "Unknown font action %1"
+msgstr "Nieznana akcji czcionki %1"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4449
+#, c-format
+msgid "Unknown font size %1"
+msgstr "Nieznany rozmiar czcionki %1"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4453
+#, c-format
+msgid "Unknown font size action %1"
+msgstr "Nieznany akcja rozmiaru czcionki %1"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4780
+#, fuzzy
+msgid ""
+"The Restricted paste type requires enough empty space (containing only "
+"rests) at the paste position to hold all of the events to be pasted.\n"
+"Not enough space was found.\n"
+"If you want to paste anyway, consider using one of the other paste types "
+"from the \"Paste...\" option on the Edit menu. You can also change the "
+"default paste type to something other than Restricted if you wish."
+msgstr ""
+"Ograniczony typ wklejania wymaga wystarczająco dużo\n"
+" miejsca (zawierającego tylko pauzy) w pozycji wklejania\n"
+"by trzymać wszystkie komunikaty do wklejenia.\n"
+"Nie znaleziono wystarczająco dużo miejsca.\n"
+"Jeśli mimo tego chcesz wkleić, rozważ użycie jednego z typów wklejenia z "
+"opcji \"Wklej..\" w menu Edycja. Możesz również zmienić domyślny typ "
+"wklejania na coś innego niż Ograniczony\n"
+"jeśli chcesz."
+
+#: ../src/gui/editors/notation/NotationView.cpp:4800
+msgid "Can't paste multiple Segments into one"
+msgstr "Nie można wkleić kilku Segmentów do jednego"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4828
+#: ../src/gui/editors/notation/NotationView.cpp:4877
+msgid "Couldn't paste at this point."
+msgstr "Nie można było wkleić w tym punkcie."
+
+#: ../src/gui/editors/notation/NotationView.cpp:4896
+#, fuzzy
+msgid "Move Events to Staff Above"
+msgstr "&Przeniśc Komunikaty do Innego Segmentu"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4924
+#, fuzzy
+msgid "Move Events to Staff Below"
+msgstr "&Przeniśc Komunikaty do Innego Segmentu"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5036
+msgid "Pushing selection left..."
+msgstr "Przesuwanie zaznaczenia w lewo..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5047
+msgid "Pushing selection right..."
+msgstr "Przesuwanie zaznaczenia w prawo..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5058
+msgid "Pushing selection up..."
+msgstr "Przesuwanie zaznaczenia do góry..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5069
+msgid "Pushing selection down..."
+msgstr "Przesuwanie zaznaczenia w dół..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5080
+msgid "Restoring computed positions..."
+msgstr "Przywracania wyliczonych pozycji..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5089
+msgid "Making visible..."
+msgstr "Zmiana na widoczne..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5098
+msgid "Making invisible..."
+msgstr "Zmiana na niewidoczne..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5185
+msgid "Beaming group..."
+msgstr "Belkowanie grupy..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5195
+msgid "Auto-beaming selection..."
+msgstr "Auto-belkowanie zaznaczenia..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5205
+msgid "Breaking groups..."
+msgstr "Rozgrupowanie..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5293
+msgid "Untupleting..."
+msgstr "Usuwanie trioli..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5301
+msgid "Adding slur..."
+msgstr "Dodawanie łuku..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5302
+msgid "slur"
+msgstr "łuk"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5307
+msgid "Adding phrasing slur..."
+msgstr "Dodawanie łuku frazy..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5308
+msgid "phrasing slur"
+msgstr "łuk frazy"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5313
+msgid "Adding glissando..."
+msgstr "Dodawanie glissanda..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5314
+msgid "glissando"
+msgstr "glissando"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5319
+msgid "Adding crescendo..."
+msgstr "Dodawanie crescendo..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5320
+#: ../src/gui/editors/notation/NotationView.cpp:5326
+msgid "dynamic"
+msgstr "znaki dynamiki"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5325
+msgid "Adding decrescendo..."
+msgstr "Dodawanie decrescendo..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5331
+#: ../src/gui/editors/notation/NotationView.cpp:5337
+#: ../src/gui/editors/notation/NotationView.cpp:5343
+#: ../src/gui/editors/notation/NotationView.cpp:5349
+msgid "Adding octave..."
+msgstr "Dodawanie oktawy..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5332
+#: ../src/gui/editors/notation/NotationView.cpp:5338
+#: ../src/gui/editors/notation/NotationView.cpp:5344
+#: ../src/gui/editors/notation/NotationView.cpp:5350
+msgid "ottava"
+msgstr "oktawa"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5366
+msgid "Can't add overlapping %1 indications"
+msgstr "Nie można dodać nachodzących na siebie opisów %1"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5375
+msgid "Making chord..."
+msgstr "Robienie akordu..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5387
+msgid "Normalizing rests..."
+msgstr "Normalizowanie pauz..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5397
+msgid "Collapsing rests..."
+msgstr "Scalanie pauz..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5417
+msgid "Tying notes..."
+msgstr "Łukowanie nut..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5427
+msgid "Untying notes..."
+msgstr "Usuwanie łuków pomiędzy nutami..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5437
+msgid "Making notes viable..."
+msgstr "Robienie nut wykonalnymi..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5447
+msgid "Removing counterpoint..."
+msgstr "Usuwanie kontrapunktu..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5457
+msgid "Pointing stems up..."
+msgstr "Ustawianie chorągiewek do góry..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5467
+msgid "Pointing stems down..."
+msgstr "Ustawianie chorągiewek do dołu..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5478
+msgid "Restoring computed stem directions..."
+msgstr "Przywracanie wyliczonych kierunków chorągiewek..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5488
+#: ../src/gui/editors/notation/NotationView.cpp:5498
+msgid "Positioning slurs..."
+msgstr "Pozycjonowanie łuków..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5509
+msgid "Restoring slur positions..."
+msgstr "Przywracania pozycji łuków..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5519
+#: ../src/gui/editors/notation/NotationView.cpp:5529
+#, fuzzy
+msgid "Positioning ties..."
+msgstr "Pozycjonowanie łuków..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5540
+#, fuzzy
+msgid "Restoring tie positions..."
+msgstr "Przywracania wyliczonych pozycji..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5550
+msgid "Fixing notation quantization..."
+msgstr "Naprawianie kwantyzacji nutowej..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5560
+msgid "Removing notation quantization..."
+msgstr "Usuwanie kwantyzacji nutowej..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5577
+msgid "Changing to %1 style..."
+msgstr "Zmiana na styl %1..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5585
+#, c-format
+msgid "Unknown style action %1"
+msgstr "Nieznana akcja stylu %1"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5598
+#: ../src/gui/editors/notation/NotationView.cpp:5639
+#: ../src/gui/editors/notation/NotationView.cpp:5695
+msgid "No note duration selected"
+msgstr "Nie zaznaczono wartości rytmicznych nut"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5660
+msgid "No rest duration selected"
+msgstr "Nie zaznaczono wartości rytmicznych pauz"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5746
+msgid "No note or rest duration selected"
+msgstr "Nie zaznaczono wartości rytmicznych nut lub pauz"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5757
+#: ../src/gui/editors/notation/NotationView.cpp:5768
+#: ../src/gui/editors/notation/NotationView.cpp:5779
+#: ../src/gui/editors/notation/NotationView.cpp:5790
+#: ../src/gui/editors/notation/NotationView.cpp:5801
+#: ../src/gui/editors/notation/NotationView.cpp:5812
+#: ../src/gui/editors/notation/NotationView.cpp:5823
+msgid "Forcing accidentals..."
+msgstr "Zmuszanie znaków chromatycznych..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5834
+msgid "Restoring accidentals..."
+msgstr "Przywracanie znaków chromatycznych..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5845
+msgid "Showing cautionary accidentals..."
+msgstr "Pokazywanie przygodnych znaków chromatycznych..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5855
+msgid "Cancelling cautionary accidentals..."
+msgstr "Kasowanie przygodnych znaków chromatycznych..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5884
+msgid "Interpreting selection..."
+msgstr "Interpretowanie zaznaczenia..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5896
+msgid "Setting note durations..."
+msgstr "Ustawianie wartości rytmicznych..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5904
+#: ../src/gui/editors/notation/NotationView.cpp:5912
+msgid "Adding dot..."
+msgstr "Dodawanie kropki..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5934
+msgid "Text: "
+msgstr "Tekst:"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5948
+msgid "Fingering: "
+msgstr "Palcowanie:"
+
+#: ../src/gui/editors/notation/NotationView.cpp:6036
+msgid "Ornament track %1 bar %2"
+msgstr "Ozdobnik ścieżka %1 takt %2"
+
+#: ../src/gui/editors/notation/NotationView.cpp:6038
+#, c-format
+msgid "Ornament bar %1"
+msgstr "Ozdobnik takt %1 "
+
+#: ../src/gui/editors/notation/NotationView.cpp:6098
+msgid "Remove Ornaments"
+msgstr "Usuń Ozdobniki"
+
+#: ../src/gui/editors/notation/NotationView.cpp:6145
+msgid "Estimated key signature shown"
+msgstr "Pokazana tonacja wyliczona"
+
+#: ../src/gui/editors/notation/NotationStaff.cpp:1249
+#: ../src/gui/editors/notation/NotationView.cpp:6202
+msgid "Sustain"
+msgstr "Pedał"
+
+#: ../src/gui/editors/notation/NotationView.cpp:6218
+msgid ""
+"There is no sustain controller defined for this device.\n"
+"Please ensure the device is configured correctly in the Manage MIDI Devices "
+"dialog in the main window."
+msgstr ""
+"Brak zdefiniowanego komunikatu pedału dla tego urządzenia.\n"
+"Proszę sprawdzić, czy urządzenie jest poprawnie skonfigurowane w oknie "
+"Zarządzaniu Urządzeniami MIDI w głównym oknie."
+
+#: ../src/gui/editors/notation/NotationView.cpp:7250
+msgid "Can't insert note: No note duration selected"
+msgstr "Nie można wstawić nuty: Nie wybrany wartości rytmicznej"
+
+#: ../src/gui/editors/notation/NotationEraser.cpp:61
+#: ../src/gui/editors/notation/NotationSelector.cpp:83
+msgid "Switch to Insert Tool"
+msgstr "Przejdź do Narzędzia Wstawiania"
+
+#: ../src/gui/editors/notation/NotePixmapFactory.cpp:2303
+#: ../src/gui/editors/notation/NotePixmapFactory.cpp:2347
+msgid "..."
+msgstr "..."
+
+#: ../src/gui/editors/notation/NoteFontFactory.cpp:200
+msgid "Can't obtain a default font -- no fonts found"
+msgstr "Nie można uzyskać domyślnej czcionki --nie znaleziono czcionek"
+
+#: ../src/gui/editors/notation/NoteFontMap.cpp:52
+#: ../src/gui/general/PresetGroup.cpp:49
+msgid "unknown error"
+msgstr "nieznany błąd"
+
+#: ../src/gui/editors/notation/NoteFontMap.cpp:78
+msgid "Can't open font mapping file %1 or %2"
+msgstr "Nie można otworzyć pliku mapowania czcionki %1 lub %2"
+
+#: ../src/gui/editors/notation/NoteFontMap.cpp:82
+#, c-format
+msgid "Can't open font mapping file %1"
+msgstr "Nie można otworzyć pliku mapowania czcionki %1 "
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:52
+msgid "%1-dotted-%2"
+msgstr "%1-kropkowana-%2"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:54
+msgid "%1-dotted %2"
+msgstr "%1-kropkowana-%2"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:57
+#, c-format
+msgid "dotted-%1"
+msgstr "kropkowana-%1"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:59
+#, c-format
+msgid "dotted %1"
+msgstr "kropkowana-%1"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:83
+msgid "sixty-fourth note"
+msgstr "sześćdziesięcioczwórka"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:83
+msgid "thirty-second note"
+msgstr "trzydziestodwójka"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:84
+msgid "sixteenth note"
+msgstr "szesnastka"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:84
+msgid "eighth note"
+msgstr "ósemka"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:85
+msgid "quarter note"
+msgstr "ćwiartka"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:85
+msgid "half note"
+msgstr "półnuta"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:86
+msgid "whole note"
+msgstr "cała nuta"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:86
+msgid "double whole note"
+msgstr "podwójna cała nuta"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:89
+msgid "sixty-fourth notes"
+msgstr "sześćdziesięcioczwórki"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:89
+msgid "thirty-second notes"
+msgstr "trzydziestodwójki"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:90
+msgid "sixteenth notes"
+msgstr "szesnastki"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:90
+msgid "eighth notes"
+msgstr "ósemki"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:91
+msgid "quarter notes"
+msgstr "ćwierćnuty"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:91
+msgid "half notes"
+msgstr "półnuty"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:92
+msgid "whole notes"
+msgstr "całe nuty"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:92
+msgid "double whole notes"
+msgstr "podwójne całe nuty"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:96
+#: ../src/gui/editors/notation/NotationStrings.cpp:154
+msgid "%1 triplets"
+msgstr "%1 triole"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:100
+#: ../src/gui/editors/notation/NotationStrings.cpp:158
+msgid "%1 triplet"
+msgstr "%1 triola"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:143
+msgid "64th"
+msgstr "sześćdziesięcioczwórka"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:143
+msgid "32nd"
+msgstr "trzydziestodwójka"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:143
+msgid "16th"
+msgstr "szesnastka"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:143
+msgid "8th"
+msgstr "ósemka"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:144
+msgid "quarter"
+msgstr "ćwierćnuta"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:144
+msgid "half"
+msgstr "półnuta"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:144
+msgid "whole"
+msgstr "całe nuta"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:145
+msgid "double whole"
+msgstr "podwójna cała nuta"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:148
+msgid "64ths"
+msgstr "sześćdziesięcioczwórki"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:148
+msgid "32nds"
+msgstr "trzydziestodwójki"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:148
+msgid "16ths"
+msgstr "szesnastki"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:148
+msgid "8ths"
+msgstr "ósemki"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:149
+msgid "quarters"
+msgstr "ćwierćnuty"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:149
+msgid "halves"
+msgstr "półnuty"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:149
+msgid "wholes"
+msgstr "całe nuty"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:150
+msgid "double wholes"
+msgstr "podwójne całe nuty"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:278
+msgid "%1 ticks"
+msgstr "%1 tiki"
+
+#: ../src/gui/editors/notation/FontViewFrame.cpp:100
+#, c-format
+msgid "Error: Unable to match font name %1"
+msgstr "Błąd: Nie można dopasować nazwy czcionki %1"
+
+#: ../src/gui/editors/notation/FontViewFrame.cpp:108
+msgid "Warning: No good match for font name %1 (best is %2)"
+msgstr ""
+"Ostrzeżenie: Brak dobrych dopasowań dla nazwy czcionki %1 (najlepsza jest %2)"
+
+#: ../src/gui/editors/notation/FontViewFrame.cpp:116
+#, c-format
+msgid "Error: Unable to open best-match font %1"
+msgstr "Błąd: Nie można otworzyć najlepiej pasującej czcionki %1"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:113
+#, fuzzy
+msgid "Track %1 : \"%2\""
+msgstr "[ Ścieżka#%1 - %2 ]"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:119
+#, fuzzy, c-format
+msgid ""
+"\n"
+"Notate for: %1"
+msgstr "Przeglądarka Czcionek Nutowych: %1"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:121
+#, fuzzy
+msgid "normal"
+msgstr "Normalny"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:124
+#, fuzzy
+msgid "small"
+msgstr "Wszystkie"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:127
+msgid "tiny"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:131
+msgid "--"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:156
+msgid ""
+"\n"
+"Size: %1, Bracket: %2 "
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:183
+msgid ""
+"\n"
+"bars [%1-%2] in %3 (tr=%4) : \"%5\""
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:190
+msgid ""
+"\n"
+"bars [%1-%2] (tr=%3) : \"%4\""
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:240
+#, fuzzy
+msgid "C#"
+msgstr "C#%1"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:242
+msgid "Eb"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:245
+#, fuzzy
+msgid "F#"
+msgstr "F#%1"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:247
+#, fuzzy
+msgid "G#"
+msgstr "G#%1"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:249
+msgid "Bb"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:352
+#, fuzzy
+msgid "%1: %2"
+msgstr "%1 (%2)"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:355
+#, fuzzy, c-format
+msgid " in %1"
+msgstr "Wejście %1"
+
+#: ../src/gui/editors/notation/NotationStaff.cpp:452
+msgid "Rendering staff %1..."
+msgstr "Przetwarzanie pięciolinii %1..."
+
+#: ../src/gui/editors/notation/NotationStaff.cpp:515
+msgid "Rendering notes on staff %1..."
+msgstr "Przetwarzanie nut na pięciolinii %1..."
+
+#: ../src/gui/editors/notation/NotationStaff.cpp:583
+msgid "Positioning staff %1..."
+msgstr "Pozycjonowanie pięciolinii %1..."
+
+#: ../src/gui/editors/notation/NotationSelectionPaster.cpp:85
+msgid "Ready."
+msgstr "Gotowy."
+
+#: ../src/gui/editors/notation/RestInserter.cpp:62
+msgid "Dotted rest"
+msgstr "Kropkowana pauza"
+
+#: ../src/gui/editors/notation/NoteStyleFileReader.cpp:57
+#, c-format
+msgid "Can't open style file %1"
+msgstr "Nie można otworzyć pliku stylu %1"
+
+#: ../src/gui/editors/notation/NoteStyleFileReader.cpp:92
+msgid "type is a required attribute of note"
+msgstr "Typ jest wymaganym atrybutem nuty"
+
+#: ../src/gui/editors/notation/NoteStyleFileReader.cpp:101
+#, c-format
+msgid "Unrecognised note name %1"
+msgstr "Nieznana nazwa nuty %1"
+
+#: ../src/gui/editors/notation/NoteStyleFileReader.cpp:108
+msgid "global element must precede note elements"
+msgstr "Globalny element musi poprzedzić element nuty"
+
+#: ../src/gui/editors/notation/NoteStyleFileReader.cpp:137
+msgid ""
+"global and note elements may have shape or charname attribute, but not both"
+msgstr ""
+"Elementy globalne i nuty mogą mieć atrybuty kształtu i nazwy, lecz nie "
+"obydwie na raz"
+
+#: ../src/gui/editors/notation/NotationVLayout.cpp:493
+msgid ""
+"Spanned note at %1 has no HEIGHT_ON_STAFF property!\n"
+"This is a bug (the program would previously have crashed by now)"
+msgstr ""
+
+#: ../src/gui/editors/notation/NoteInserter.cpp:82
+msgid "Auto-Beam when appropriate"
+msgstr "Auto Belkowanie gdzie pasuje"
+
+#: ../src/gui/editors/notation/NoteInserter.cpp:103
+msgid "Dotted note"
+msgstr "Kropkowana nuta"
+
+#: ../src/gui/editors/notation/NoteInserter.cpp:120
+msgid "Switch to Inserting Rests"
+msgstr "Przejdź do Wstawiania Pauz"
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:98
+msgid "Collapse Rests"
+msgstr "Scal Pauzy"
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:102
+msgid "Respell as Flat"
+msgstr "Zamień na dźwięk enharmonicznie równoważny z bemolem"
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:106
+msgid "Respell as Sharp"
+msgstr "Zamień na dźwięk enharmonicznie równoważny z krzyżykiem"
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:110
+msgid "Respell as Natural"
+msgstr "Zamień na dźwięk enharmonicznie równoważny naturalny"
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:114
+msgid "Collapse Notes"
+msgstr "Scal nuty"
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:130
+msgid "Make Invisible"
+msgstr "Zrób Niewidoczne"
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:134
+msgid "Make Visible"
+msgstr "Zrób Widoczne"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:129
+msgid "Event filters"
+msgstr "Filtry Komunikatów"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:138
+msgid "Rest"
+msgstr "Pauza"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:139
+msgid "Indication"
+msgstr "Wskazanie"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:141
+msgid "Other"
+msgstr "Inny"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:161
+msgid "Triggered Segment Properties"
+msgstr "Właściwości Sterowanego Segmentu"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:166
+msgid "Label: "
+msgstr "Etykietka:"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:176
+msgid "Base pitch: "
+msgstr "Bazowa wysokość dźwięku"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:183
+msgid "Base velocity: "
+msgstr "Bazowa prędkość uderzenia"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:246
+msgid "Duration "
+msgstr "Czas trwania"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:247
+msgid "Event Type "
+msgstr "Typ komunikatu"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:248
+msgid "Pitch "
+msgstr "Wysokość dźwięku"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:249
+msgid "Velocity "
+msgstr "Prędkość Uderzenia"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:250
+msgid "Type (Data1) "
+msgstr "Typ (Dane1) "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:251
+msgid "Value (Data2) "
+msgstr "Wartość (Dane2) "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:461
+msgid "(group %1) "
+msgstr "(grupa %1) "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:519
+msgid "<no events at this filter level>"
+msgstr "<brak komunikatów na tym poziomie filtra>"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:521
+msgid "<no events>"
+msgstr "<brak komunikatów>"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:696
+msgid "Segment label"
+msgstr "Etykietka segmentu"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:696
+msgid "Label:"
+msgstr "Etykietka:"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1123
+msgid "&Insert Event"
+msgstr "&Wstaw Komunikat"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1130
+msgid "&Delete Event"
+msgstr "&Skasuj Komunikat"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1137
+msgid "&Edit Event"
+msgstr "&Edytuj Komunikat"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1144
+msgid "&Advanced Event Editor"
+msgstr "&Zaawansowany Edytor Komunikatów"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1518
+msgid "Open in Event Editor"
+msgstr "Otwórz w Edytorze Lista"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1519
+msgid "Open in Expert Event Editor"
+msgstr "Otwórz w Edytorze Lista Ekspert"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1577
+msgid "%1 - Triggered Segment: %2"
+msgstr "%1 - Sterowany Segment %2 "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1592
+msgid "%1 - Segment Track #%2 - Event List"
+msgstr "%1 - Sterowana Ścieżka #%2 - Lista Komunikatów"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1598
+msgid "%1 - %2 Segments - Event List"
+msgstr "%1 -%2 Sterowane Segmenty - Lista Komunikatów"
+
+#: ../src/gui/rulers/TempoRuler.cpp:131
+msgid "Insert Tempo Change at Playback Position"
+msgstr "Wstaw Zmianę Tempa w pozycji kursora"
+
+#: ../src/gui/rulers/TempoRuler.cpp:136
+msgid "Delete Tempo Change"
+msgstr "Kasuj Zmianę Tempa"
+
+#: ../src/gui/rulers/TempoRuler.cpp:140
+msgid "Ramp Tempo to Next Tempo"
+msgstr "Nachyl Tempo do Następnego Tempa"
+
+#: ../src/gui/rulers/TempoRuler.cpp:144
+msgid "Un-Ramp Tempo"
+msgstr "Odchyl Tempo"
+
+#: ../src/gui/rulers/TempoRuler.cpp:149
+msgid "Edit Tempo..."
+msgstr "Edytuj tempo..."
+
+#: ../src/gui/rulers/TempoRuler.cpp:153
+msgid "Edit Time Signature..."
+msgstr "Edytuj Metrum..."
+
+#: ../src/gui/rulers/TempoRuler.cpp:588
+msgid "%1.%2%3 (%4.%5%6 bpm)"
+msgstr "%1.%2%3 (%4.%5%6 bpm)"
+
+#: ../src/gui/rulers/TempoRuler.cpp:596
+msgid "%1.%2%3 bpm"
+msgstr "%1.%2%3 bpm"
+
+#: ../src/gui/rulers/TempoRuler.cpp:604
+msgid "%1 - %2.%3%4"
+msgstr "%1 - %2.%3%4"
+
+#: ../src/gui/rulers/ControlRulerEventInsertCommand.cpp:36
+msgid "Insert Controller Event"
+msgstr "Wstaw komunikat Kontrolera"
+
+#: ../src/gui/rulers/ControlChangeCommand.cpp:35
+msgid "Control Change"
+msgstr "Zmiana Kontrolera"
+
+#: ../src/gui/rulers/PropertyViewRuler.cpp:72
+msgid "%1 controller"
+msgstr "%1 kontroler"
+
+#: ../src/gui/rulers/RawNoteRuler.cpp:453
+msgid "Track #%1, Segment \"%2\" (runtime id %3)"
+msgstr ""
+
+#: ../src/gui/rulers/MarkerRuler.cpp:100
+#, fuzzy
+msgid "Insert Marker"
+msgstr "Wstaw Pauzy"
+
+#: ../src/gui/rulers/MarkerRuler.cpp:104
+#, fuzzy
+msgid "Insert Marker at Playback Position"
+msgstr "Wstaw Zmianę Tempa w pozycji kursora"
+
+#: ../src/gui/rulers/MarkerRuler.cpp:109
+#, fuzzy
+msgid "Delete Marker"
+msgstr "Skasuj Znacznik"
+
+#: ../src/gui/rulers/MarkerRuler.cpp:114
+#, fuzzy
+msgid "Edit Marker..."
+msgstr "Edytuj &Znaczniki..."
+
+#: ../src/gui/rulers/MarkerRuler.cpp:119
+msgid ""
+"Click on a marker to move the playback pointer.\n"
+"Shift-click to set a range between markers.\n"
+"Double-click to open the marker editor."
+msgstr ""
+
+#: ../src/gui/rulers/ChordNameRuler.cpp:97
+msgid ""
+"Chord name ruler.\n"
+"Turn it on and off from the Settings->Rulers menu."
+msgstr ""
+"Oś nazw akordowych.\n"
+"Włącz i wyłąćz z Ustawienia-> Menu Wykresów."
+
+#: ../src/gui/rulers/ControlRulerEventEraseCommand.cpp:37
+msgid "Erase Controller Event(s)"
+msgstr "Usuń komunikat Kontrolera(ów)"
+
+#: ../src/gui/general/EditView.cpp:901
+#: ../src/gui/rulers/ControllerEventsRuler.cpp:188
+msgid "Unsupported Event Type"
+msgstr "Niewspierany Typ Komunikatu"
+
+#: ../src/gui/rulers/ControllerEventsRuler.cpp:203
+msgid "Controller Events"
+msgstr "Komunikaty Kontrolera"
+
+#: ../src/gui/rulers/ControllerEventsRuler.cpp:278
+msgid "Controller Event Number"
+msgstr "Numer Komunikatu Kontrolera"
+
+#: ../src/gui/rulers/ControllerEventsRuler.cpp:471
+msgid "Add line of controllers"
+msgstr "Dodaj oś kontrolerów"
+
+#: ../src/gui/rulers/LoopRuler.cpp:89
+#, fuzzy
+msgid ""
+"Click and drag to move the playback pointer.\n"
+"Shift-click and drag to set a range for looping or editing.\n"
+"Shift-click to clear the loop or range.\n"
+"Double-click to start playback."
+msgstr ""
+"Kliknij lewą myszą by ustawić kursor odtwarzania.\n"
+"Shift + Lewa Mysz + Przeciąganie by zaznaczyć zakres pętli lub edycji\n"
+"Shift + Lewa Mysz by wyczyścić pętlę lub zakres."
+
+#: ../src/gui/general/EditViewBase.cpp:228
+msgid "Set Segment Start Time..."
+msgstr "Ustaw Współrzędne Początku Segmentu..."
+
+#: ../src/gui/general/EditViewBase.cpp:232
+msgid "Set Segment Duration..."
+msgstr "Ustaw czas Trwania Segmentu..."
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:56
+msgid "Load track parameters preset"
+msgstr "Ładuj ustawienia parametrów ścieżki"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:62
+#, fuzzy
+msgid "Convert notation for..."
+msgstr "Eksportowanie pliku dźwiękowego..."
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:86
+msgid "Select preset track parameters for:"
+msgstr "Zaznacz ustawienia parametrów ścieżki dla:"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:87
+msgid "Create appropriate notation for:"
+msgstr ""
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:89
+msgid "Category"
+msgstr "Kategoria"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:95
+msgid "Player Ability"
+msgstr "Poziom Trudności"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:97
+msgid "Amateur"
+msgstr "Amator"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:98
+msgid "Professional"
+msgstr "Profesjonalista"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:104
+#, fuzzy
+msgid "Only selected segments"
+msgstr "Zaznacz &Wszystkie Segmenty"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:106
+#, fuzzy
+msgid "All segments in this track"
+msgstr "Zastosuj dla wszystkich segmentów w tym miejscu"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:111
+#, fuzzy
+msgid "Only for new segments"
+msgstr "Słowa dla tego segmentu"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:113
+#, fuzzy
+msgid "Convert existing segments"
+msgstr "Twórz Segment"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:39
+#, c-format
+msgid "C%1"
+msgstr "C%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:39
+#, c-format
+msgid "C#%1"
+msgstr "C#%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:39
+#, c-format
+msgid "D%1"
+msgstr "D%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:39
+#, c-format
+msgid "D#%1"
+msgstr "D#%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:40
+#, c-format
+msgid "E%1"
+msgstr "E%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:40
+#, c-format
+msgid "F%1"
+msgstr "F%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:40
+#, c-format
+msgid "F#%1"
+msgstr "F#%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:40
+#, c-format
+msgid "G%1"
+msgstr "G%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:41
+#, c-format
+msgid "G#%1"
+msgstr "G#%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:41
+#, c-format
+msgid "A%1"
+msgstr "A%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:41
+#, c-format
+msgid "A#%1"
+msgstr "A#%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:41
+#, c-format
+msgid "B%1"
+msgstr "H%1"
+
+#: ../src/gui/general/PresetGroup.cpp:95
+#, c-format
+msgid "Can't open preset file %1"
+msgstr "Nie można otworzyć pliku ustawienia %1"
+
+#: ../src/gui/general/EditView.cpp:744
+#, fuzzy
+msgid "&Halve Durations"
+msgstr "Czas Trwania"
+
+#: ../src/gui/general/EditView.cpp:748
+#, fuzzy
+msgid "&Double Durations"
+msgstr "Podwójny bemol"
+
+#: ../src/gui/general/EditView.cpp:806
+msgid "Show Velocity Property Ruler"
+msgstr "Pokaż Oś Współrzędnych dla Prędkości Uderzenia"
+
+#: ../src/gui/general/EditView.cpp:825
+msgid "Insert item"
+msgstr "Wstaw komunikat"
+
+#: ../src/gui/general/EditView.cpp:831
+msgid "Erase selected items"
+msgstr "Kasuj zaznaczone komunikaty"
+
+#: ../src/gui/general/EditView.cpp:835
+msgid "Clear ruler"
+msgstr "Wyczyść wykres"
+
+#: ../src/gui/general/EditView.cpp:839
+msgid "Insert line of controllers"
+msgstr "Wstaw oś kontrolerów"
+
+#: ../src/gui/general/EditView.cpp:843
+msgid "Flip forward"
+msgstr "Przeleć do przodu"
+
+#: ../src/gui/general/EditView.cpp:847
+msgid "Flip backwards"
+msgstr "Przeleć do tyłu"
+
+#: ../src/gui/general/EditView.cpp:851
+msgid "Draw property line"
+msgstr "Rysuj oś właściwości"
+
+#: ../src/gui/general/EditView.cpp:855
+msgid "Select all property values"
+msgstr "Zaznacz wszystkie wartości właściwości"
+
+#: ../src/gui/general/EditView.cpp:894
+msgid "%1 Controller %2 %3"
+msgstr "%1 Kontroler %2 %3"
+
+#: ../src/gui/general/EditView.cpp:1066
+msgid "I"
+msgstr "I"
+
+#: ../src/gui/general/EditView.cpp:1066
+msgid "II"
+msgstr "II"
+
+#: ../src/gui/general/EditView.cpp:1066
+msgid "III"
+msgstr "III"
+
+#: ../src/gui/general/EditView.cpp:1066
+msgid "IV"
+msgstr "IV"
+
+#: ../src/gui/general/EditView.cpp:1067
+msgid "V"
+msgstr "V"
+
+#: ../src/gui/general/EditView.cpp:1067
+msgid "VI"
+msgstr "VI"
+
+#: ../src/gui/general/EditView.cpp:1067
+msgid "VII"
+msgstr "VII"
+
+#: ../src/gui/general/EditView.cpp:1067
+msgid "VIII"
+msgstr "VIII"
+
+#: ../src/gui/general/EditView.cpp:1069
+msgid "%1 flat"
+msgstr "%1 obniżony"
+
+#: ../src/gui/general/EditView.cpp:1070
+msgid "%1 sharp"
+msgstr "%1 podwyższony"
+
+#: ../src/gui/general/EditView.cpp:1085
+msgid "&Insert Note"
+msgstr "&Wstaw Nutę"
+
+#: ../src/gui/general/EditView.cpp:1091
+msgid "&Upper Octave"
+msgstr "&Górna Oktawa"
+
+#: ../src/gui/general/EditView.cpp:1096
+msgid "&Lower Octave"
+msgstr "&Dolna Oktawa"
+
+#: ../src/gui/general/EditView.cpp:1268
+msgid "Estimated time signature shown"
+msgstr "Szacowane metrum widoczne"
+
+#: ../src/gui/general/EditView.cpp:1431
+#, fuzzy
+msgid "Halving durations..."
+msgstr "Ustawianie wartości rytmicznych..."
+
+#: ../src/gui/general/EditView.cpp:1445
+#, fuzzy
+msgid "Doubling durations..."
+msgstr "Ustawianie wartości rytmicznych..."
+
+#: ../src/gui/general/EditView.cpp:1469
+msgid "Rescaling..."
+msgstr "Przeskalowywanie..."
+
+#: ../src/gui/general/EditView.cpp:1489
+#, fuzzy
+msgid "By number of semitones: "
+msgstr "Wpisz o ile półtonów transponować:"
+
+#: ../src/gui/general/EditView.cpp:1496 ../src/gui/general/EditView.cpp:1518
+msgid "Transposing..."
+msgstr "Transponowanie..."
+
+#: ../src/gui/general/EditView.cpp:1536
+msgid "Transposing up one semitone..."
+msgstr "Transponowanie o półton do góry..."
+
+#: ../src/gui/general/EditView.cpp:1545
+msgid "Transposing up one octave..."
+msgstr "Transponowanie o oktawę do góry..."
+
+#: ../src/gui/general/EditView.cpp:1554
+msgid "Transposing down one semitone..."
+msgstr "Transponowanie o półton w dół..."
+
+#: ../src/gui/general/EditView.cpp:1563
+msgid "Transposing down one octave..."
+msgstr "Transponowanie o oktawę w dół..."
+
+#: ../src/gui/general/EditView.cpp:1575
+#, fuzzy
+msgid "Inverting..."
+msgstr "Rozpoczynanie..."
+
+#: ../src/gui/general/EditView.cpp:1587
+#, fuzzy
+msgid "Retrograding..."
+msgstr "Nagrywanie..."
+
+#: ../src/gui/general/EditView.cpp:1599
+#, fuzzy
+msgid "Retrograde inverting..."
+msgstr "Nagrywanie..."
+
+#: ../src/gui/general/EditView.cpp:1608
+msgid "Jogging left..."
+msgstr "Popychanie w lewo..."
+
+#: ../src/gui/general/EditView.cpp:1623
+msgid "Jogging right..."
+msgstr "Popychanie w prawo..."
+
+#: ../src/sound/AudioFileManager.cpp:660
+#, fuzzy, c-format
+msgid "Downloading file %1"
+msgstr "Nie można ściągnąć pliku %1"
+
+#: ../src/sound/AudioFileManager.cpp:735
+#, fuzzy
+msgid "Converting audio file..."
+msgstr "Eksportowanie pliku dźwiękowego..."
+
+#: ../src/sound/AudioFileManager.cpp:737
+#, fuzzy
+msgid "Resampling audio file..."
+msgstr "Eksportowanie pliku dźwiękowego..."
+
+#: ../src/sound/AudioFileManager.cpp:739
+#, fuzzy
+msgid "Converting and resampling audio file..."
+msgstr "Eksportowanie pliku dźwiękowego..."
+
+#: ../src/sound/AudioFileManager.cpp:741
+#, fuzzy
+msgid "Importing audio file..."
+msgstr "Eksportowanie pliku dźwiękowego..."
+
+#: ../src/sound/AudioFileManager.cpp:794
+#, fuzzy
+msgid "Failed to convert or resample audio file on import"
+msgstr "Otwarcie pliku tymczasowego do eksportu do Lilypond nie powiodło się."
+
+#: ../src/sequencer/main.cpp:46 ../src/sequencer/main.cpp:86
+#, fuzzy
+msgid "RosegardenSequencer"
+msgstr "Różany Ogród"
+
+#: ../src/sequencer/main.cpp:54
+#, fuzzy
+msgid "JACK playback and capture ports"
+msgstr "Latencja Serwera JACK podczas odtwarzania (w mili sekundach)"
+
+#: ../src/commands/segment/SegmentSyncCommand.cpp:38
+#: ../src/commands/segment/SegmentSyncCommand.cpp:44
+#: ../src/commands/segment/SegmentSyncCommand.cpp:55
+#: ../src/commands/segment/SegmentSyncCommand.cpp:63
+#, fuzzy
+msgid "Sync segment parameters"
+msgstr "Parametry Segmentu"
+
+#: ../src/commands/segment/RenameTrackCommand.h:52
+msgid "Rename Track"
+msgstr "Zmień Nazwę Ścieżki"
+
+#: ../src/commands/segment/SegmentRepeatToCopyCommand.cpp:39
+msgid "Turn Repeats into Copies"
+msgstr "Zmień Repetycje w Żywe Kopie"
+
+#: ../src/commands/segment/SegmentTransposeCommand.cpp:36
+#: ../src/commands/segment/SegmentTransposeCommand.cpp:42
+#, fuzzy
+msgid "Change segment transposition"
+msgstr "Zmień Kolor Segmentu"
+
+#: ../src/commands/edit/RescaleCommand.h:50
+#: ../src/commands/segment/AudioSegmentRescaleCommand.h:62
+#: ../src/commands/segment/SegmentRescaleCommand.h:58
+msgid "Stretch or S&quash..."
+msgstr "Skurcz lub &Zagęść..."
+
+#: ../src/commands/segment/SegmentLabelCommand.h:52
+msgid "Re&label..."
+msgstr "Zmień &Tytuł Segmentu..."
+
+#: ../src/commands/segment/AudioSegmentResizeFromStartCommand.cpp:39
+#: ../src/commands/segment/SegmentResizeFromStartCommand.cpp:39
+msgid "Resize Segment"
+msgstr "Zmień rozmiar segmentu"
+
+#: ../src/commands/segment/RemoveTempoChangeCommand.h:58
+msgid "Remove &Tempo Change..."
+msgstr "Usuń &Zmianę Tempa..."
+
+#: ../src/commands/segment/SegmentEraseCommand.cpp:40
+#: ../src/commands/segment/SegmentEraseCommand.cpp:52
+msgid "Erase Segment"
+msgstr "Kasuj Segment"
+
+#: ../src/commands/segment/AudioSegmentRescaleCommand.cpp:126
+#: ../src/commands/segment/SegmentRescaleCommand.cpp:102
+#, fuzzy
+msgid "(rescaled)"
+msgstr "%1 (przeskalowane)"
+
+#: ../src/commands/segment/AudioSegmentRescaleCommand.cpp:127
+#: ../src/commands/segment/SegmentRescaleCommand.cpp:105
+msgid "%1 (rescaled)"
+msgstr "%1 (przeskalowane)"
+
+#: ../src/commands/segment/PasteToTriggerSegmentCommand.cpp:47
+msgid "Paste as New Triggered Segment"
+msgstr "Wklej jako Nowy Wyzwalany Segment"
+
+#: ../src/commands/segment/SegmentColourMapCommand.h:52
+msgid "Change Segment Color Map..."
+msgstr "Zmień Mapę Kolorów Segmentu..."
+
+#: ../src/commands/segment/SegmentQuickCopyCommand.h:55
+msgid "Quick-Copy Segment"
+msgstr "Szybkie Kopiowanie Segmentu"
+
+#: ../src/commands/segment/AudioSegmentSplitCommand.cpp:42
+msgid "Split Audio Segment"
+msgstr "Rozdziel Segment Dźwiękowy"
+
+#: ../src/commands/segment/AudioSegmentSplitCommand.cpp:103
+#: ../src/commands/segment/SegmentSplitCommand.cpp:135
+msgid " (split)"
+msgstr "(rozdziel)"
+
+#: ../src/commands/segment/AudioSegmentSplitCommand.cpp:104
+#: ../src/commands/segment/SegmentSplitByRecordingSrcCommand.cpp:120
+#: ../src/commands/segment/SegmentSplitByRecordingSrcCommand.cpp:122
+#: ../src/commands/segment/SegmentSplitCommand.cpp:136
+msgid "%1 (split)"
+msgstr "%1 (rozdziel)"
+
+#: ../src/commands/segment/SegmentLabelCommand.cpp:40
+msgid "Label Segments"
+msgstr "Nazwij Segment"
+
+#: ../src/commands/segment/OpenOrCloseRangeCommand.cpp:43
+msgid "Open or Close Range"
+msgstr "Otwórz lub Zamknij Zakres"
+
+#: ../src/commands/edit/TransposeCommand.h:55
+#: ../src/commands/segment/SegmentTransposeCommand.h:54
+#, fuzzy
+msgid "Transpose by &Interval..."
+msgstr "&Transponuj..."
+
+#: ../src/commands/segment/SegmentAutoSplitCommand.cpp:148
+msgid "%1 (part)"
+msgstr "%1 (część)"
+
+#: ../src/commands/segment/AudioSegmentInsertCommand.cpp:51
+#: ../src/commands/segment/SegmentInsertCommand.cpp:43
+#: ../src/commands/segment/SegmentInsertCommand.cpp:56
+msgid "Create Segment"
+msgstr "Twórz Segment"
+
+#: ../src/commands/segment/AudioSegmentInsertCommand.cpp:114
+msgid "%1 (inserted)"
+msgstr "%1 (wstawiono)"
+
+#: ../src/commands/segment/AudioSegmentInsertCommand.cpp:117
+msgid "unknown audio file"
+msgstr "nieznany plik dźwiękowy"
+
+#: ../src/commands/segment/CreateTempoMapFromSegmentCommand.cpp:40
+msgid "Set Tempos from Beat Segment"
+msgstr "Ustaw Tempa z Segmentu Pulsu"
+
+#: ../src/commands/segment/SegmentSplitByRecordingSrcCommand.h:52
+msgid "Split by &Recording Source..."
+msgstr "Rozdziel według &Źródła Nagrania..."
+
+#: ../src/commands/segment/SegmentColourMapCommand.cpp:40
+msgid "Change Segment Color Map"
+msgstr "Zmień Mapę Kolorów Segmentu"
+
+#: ../src/commands/edit/CopyCommand.cpp:64
+#: ../src/commands/segment/SegmentQuickCopyCommand.cpp:57
+msgid "%1 (copied)"
+msgstr "%1 (skopiowano)"
+
+#: ../src/commands/segment/SegmentColourCommand.h:52
+msgid "Change Segment Color..."
+msgstr "Zmień Kolor Segmentu..."
+
+#: ../src/commands/segment/SegmentSplitByPitchCommand.cpp:170
+msgid "%1 (upper)"
+msgstr "%1 (górne)"
+
+#: ../src/commands/segment/SegmentSplitByPitchCommand.cpp:172
+msgid "%1 (lower)"
+msgstr "%1 (dolne)"
+
+#: ../src/commands/segment/SegmentSingleRepeatToCopyCommand.cpp:39
+msgid "Turn Single Repeat into Copy"
+msgstr "Zmień Pojedynczą Repetycję w Żywą Kopię"
+
+#: ../src/commands/segment/AddTempoChangeCommand.h:58
+#, fuzzy
+msgid "Add Te&mpo Change..."
+msgstr "Dodaj Zmianę &klucza"
+
+#: ../src/commands/segment/AudioSegmentAutoSplitCommand.h:57
+#: ../src/commands/segment/SegmentAutoSplitCommand.h:53
+msgid "&Split on Silence"
+msgstr "&Rozdziel w punkcie Ciszy"
+
+#: ../src/commands/segment/SetTriggerSegmentBaseVelocityCommand.cpp:39
+msgid "Set Base Velocity"
+msgstr "Ustaw Bazową Prędkość Uderzenia"
+
+#: ../src/commands/segment/DeleteRangeCommand.cpp:43
+#: ../src/commands/segment/EraseSegmentsStartingInRangeCommand.cpp:39
+msgid "Delete Range"
+msgstr "Skasuj Zakres"
+
+#: ../src/commands/segment/ChangeCompositionLengthCommand.h:53
+msgid "Change &Composition Start and End..."
+msgstr "Zmień Początek i Koniec &Utworu..."
+
+#: ../src/commands/segment/MoveTracksCommand.h:51
+msgid "Move Tracks..."
+msgstr "Przesuń Ścieżki..."
+
+#: ../src/commands/segment/SegmentColourCommand.cpp:39
+msgid "Change Segment Color"
+msgstr "Zmień Kolor Segmentu"
+
+#: ../src/commands/segment/AudioSegmentDistributeCommand.h:66
+msgid "Distribute Audio Segments over MIDI"
+msgstr "Dystrybuuj Segmenty Audio zgodnie z MIDI"
+
+#: ../src/commands/segment/AudioSegmentAutoSplitCommand.cpp:147
+msgid "%1 (autosplit %2)"
+msgstr "%1 (auto rozdzielenie %2)"
+
+#: ../src/commands/segment/SetTriggerSegmentDefaultRetuneCommand.cpp:39
+msgid "Set Default Retune"
+msgstr ""
+
+#: ../src/commands/segment/AddTimeSignatureCommand.h:52
+msgid "Add Time Si&gnature Change..."
+msgstr "Dodaj Zmianę &Metrum..."
+
+#: ../src/commands/segment/AddTriggerSegmentCommand.cpp:42
+msgid "Add Triggered Segment"
+msgstr "Dodaj Wyzwalany Segment"
+
+#: ../src/commands/segment/SetTriggerSegmentDefaultTimeAdjustCommand.cpp:39
+msgid "Set Default Time Adjust"
+msgstr "Ustaw Domyślne Współrzędne"
+
+#: ../src/commands/segment/RemoveTimeSignatureCommand.h:58
+msgid "Remove &Time Signature Change..."
+msgstr "Usuń zmianę &Metrum..."
+
+#: ../src/commands/segment/SegmentCommandRepeat.cpp:39
+msgid "Repeat Segments"
+msgstr "Powtórz Segment"
+
+#: ../src/commands/segment/AddTracksCommand.h:55
+msgid "Add Tracks..."
+msgstr "Dodaj Ścieżki..."
+
+#: ../src/commands/segment/ModifyDefaultTempoCommand.h:51
+msgid "Modify &Default Tempo..."
+msgstr "Modyfikuj &Domyślne Tempo..."
+
+#: ../src/commands/segment/SegmentSplitByPitchCommand.h:61
+msgid "Split by &Pitch..."
+msgstr "Rozdziel według &wysokości dźwięku..."
+
+#: ../src/commands/segment/DeleteTriggerSegmentCommand.cpp:40
+msgid "Delete Triggered Segment"
+msgstr "Kasuj Wyzwalany Segment"
+
+#: ../src/commands/segment/SegmentSplitCommand.cpp:42
+msgid "Split Segment"
+msgstr "Rozdziel Segment"
+
+#: ../src/commands/segment/DeleteTracksCommand.h:51
+msgid "Delete Tracks..."
+msgstr "Kasuj Ścieżki..."
+
+#: ../src/commands/segment/InsertRangeCommand.cpp:42
+#, fuzzy
+msgid "Insert Range"
+msgstr "Wstaw Pauzy"
+
+#: ../src/commands/segment/DeleteRangeCommand.h:62
+msgid "Rejoin Command"
+msgstr "Komenda Regionu"
+
+#: ../src/commands/segment/SetTriggerSegmentBasePitchCommand.cpp:39
+msgid "Set Base Pitch"
+msgstr "Ustaw Dźwięk Bazowy"
+
+#: ../src/commands/segment/PasteConductorDataCommand.cpp:41
+msgid "Paste Tempos and Time Signatures"
+msgstr "Wklej Tempa i Metra"
+
+#: ../src/commands/segment/SegmentSyncClefCommand.cpp:34
+#, fuzzy
+msgid "Sync segment clef"
+msgstr "Etykietka segmentu"
+
+#: ../src/commands/matrix/MatrixInsertionCommand.cpp:46
+#: ../src/commands/notation/NoteInsertionCommand.cpp:54
+msgid "Insert Note"
+msgstr "Wstaw nutę"
+
+#: ../src/commands/matrix/MatrixEraseCommand.cpp:41
+msgid "Erase Note"
+msgstr "Kasuj Nutę"
+
+#: ../src/commands/matrix/MatrixPercussionInsertionCommand.cpp:47
+msgid "Insert Percussion Note"
+msgstr "Wstaw Nutę Perkusyjną"
+
+#: ../src/commands/matrix/MatrixModifyCommand.cpp:43
+msgid "Move Note"
+msgstr "Przesuń Nutę"
+
+#: ../src/commands/matrix/MatrixModifyCommand.cpp:43
+msgid "Modify Note"
+msgstr "Modyfikuj Nutę"
+
+#: ../src/commands/edit/PasteEventsCommand.cpp:98
+msgid "Paste into an existing gap [\"restricted\"]"
+msgstr "Wklej do istniejącej dziury [\"ograniczone\"]"
+
+#: ../src/commands/edit/PasteEventsCommand.cpp:100
+msgid "Erase existing events to make room [\"simple\"]"
+msgstr "Kasuj istniejące komunikaty by zrobić miejsce [\"proste\"]"
+
+#: ../src/commands/edit/PasteEventsCommand.cpp:102
+msgid "Move existing events out of the way [\"open-n-paste\"]"
+msgstr "Przesuń istniejące komunikaty by zrobić miejsce [\"otwórz -n wklej\"]"
+
+#: ../src/commands/edit/PasteEventsCommand.cpp:104
+msgid "Overlay notes, tying against present notes [\"note-overlay\"]"
+msgstr ""
+"Nachodzące nuty, łukowane z bieżącymi nutami Kasuj istniejące komunikaty by "
+"zrobić miejsce [\"nachodzenie-nut\"]"
+
+#: ../src/commands/edit/PasteEventsCommand.cpp:106
+msgid "Overlay notes, ignoring present notes [\"matrix-overlay\"]"
+msgstr "Nachodzące nuty, ignorowanie bieżących nut [\"nachodzenie-pianolowe\"]"
+
+#: ../src/commands/edit/AddDotCommand.h:52
+msgid "&Add Dot"
+msgstr "&Dodaj kropkę"
+
+#: ../src/commands/edit/RemoveMarkerCommand.h:55
+msgid "&Remove Marker"
+msgstr "&Usuń znacznik"
+
+#: ../src/commands/edit/EventUnquantizeCommand.cpp:43
+#: ../src/commands/edit/EventUnquantizeCommand.cpp:54
+msgid "Unquantize Events"
+msgstr "Odkwantyzuj Komunikaty"
+
+#: ../src/commands/edit/ChangeVelocityCommand.h:53
+msgid "&Increase Velocity"
+msgstr "&Zwiększ prędkość uderzenia"
+
+#: ../src/commands/edit/ChangeVelocityCommand.h:54
+msgid "&Reduce Velocity"
+msgstr "Z&mniejsz prędkość uderzenia"
+
+#: ../src/commands/edit/CopyCommand.cpp:46
+msgid "(excerpt)"
+msgstr "(wyciąg)"
+
+#: ../src/commands/edit/CopyCommand.cpp:60
+msgid "(copied)"
+msgstr "(skopionwano)"
+
+#: ../src/commands/edit/EventInsertionCommand.cpp:39
+msgid "Insert Event"
+msgstr "Wstaw Komunikat"
+
+#: ../src/commands/edit/InsertTriggerNoteCommand.cpp:55
+msgid "Insert Trigger Note"
+msgstr "Wstaw nutę Wyzwalającą"
+
+#: ../src/commands/edit/CollapseNotesCommand.h:50
+msgid "Collapse &Equal-Pitch Notes"
+msgstr "Połącz legowane nuty o tej same wysokości"
+
+#: ../src/commands/edit/TransposeCommand.h:61
+msgid "&Up a Semitone"
+msgstr "Do &góry o półton"
+
+#: ../src/commands/edit/TransposeCommand.h:62
+msgid "&Down a Semitone"
+msgstr "W &dół o półton"
+
+#: ../src/commands/edit/TransposeCommand.h:63
+msgid "Up an &Octave"
+msgstr "Do &góry o oktawę"
+
+#: ../src/commands/edit/TransposeCommand.h:64
+msgid "Down an Octa&ve"
+msgstr "W &dół o oktawę"
+
+#: ../src/commands/edit/TransposeCommand.h:65
+#, fuzzy
+msgid "&Transpose by Semitones..."
+msgstr "Transponowanie o półton do góry..."
+
+#: ../src/commands/edit/SetNoteTypeCommand.h:56
+msgid "&Set Note Type"
+msgstr "&Ustaw typ nuty"
+
+#: ../src/commands/edit/EventEditCommand.h:55
+msgid "Edit E&vent"
+msgstr "Edytuj &Komunikat"
+
+#: ../src/commands/edit/AddMarkerCommand.h:54
+msgid "&Add Marker"
+msgstr "&Dodaj znacznik"
+
+#: ../src/commands/edit/SelectionPropertyCommand.h:66
+msgid "Set &Property"
+msgstr "Ustaw &Właściwości"
+
+#: ../src/commands/edit/CutCommand.h:55
+msgid "Cu&t"
+msgstr "&Wytnij"
+
+#: ../src/commands/edit/EventQuantizeCommand.cpp:114
+msgid "Heuristic Notation &Quantize"
+msgstr "Heurystyczna &Kwantyzacja Notacji"
+
+#: ../src/commands/edit/EventQuantizeCommand.cpp:116
+msgid "Grid &Quantize"
+msgstr "&Kwantyzacja Siatkowa"
+
+#: ../src/commands/edit/ClearTriggersCommand.h:52
+msgid "&Clear Triggers"
+msgstr "&Wyczyść Wyzwalacze"
+
+#: ../src/commands/edit/RetrogradeCommand.h:51
+#, fuzzy
+msgid "&Retrograde"
+msgstr "&Nagrywaj"
+
+#: ../src/commands/edit/InvertCommand.h:51
+#, fuzzy
+msgid "&Invert"
+msgstr "&Wstaw Nutę"
+
+#: ../src/commands/edit/SetTriggerCommand.h:64
+msgid "Tri&gger Segment"
+msgstr "W&yzwól segment"
+
+#: ../src/commands/edit/SetLyricsCommand.h:50
+msgid "Edit L&yrics"
+msgstr "Edytuj &Słowa"
+
+#: ../src/commands/edit/MoveAcrossSegmentsCommand.cpp:73
+msgid "&Move Events to Other Segment"
+msgstr "&Przeniśc Komunikaty do Innego Segmentu"
+
+#: ../src/commands/edit/RetrogradeInvertCommand.h:51
+msgid "Re&trograde Invert"
+msgstr ""
+
+#: ../src/commands/edit/ModifyMarkerCommand.h:55
+msgid "&Modify Marker"
+msgstr "&Zmień znacznik"
+
+#: ../src/commands/studio/AddControlParameterCommand.h:61
+msgid "&Add Control Parameter"
+msgstr "&Dodaj Parametr Kontrolera"
+
+#: ../src/commands/studio/ModifyInstrumentMappingCommand.h:55
+msgid "Modify &Instrument Mapping"
+msgstr "Modyfikuj Tabelę &Instrumentu"
+
+#: ../src/commands/studio/RemoveControlParameterCommand.h:60
+msgid "&Remove Control Parameter"
+msgstr "&Usuń Parametr Kontrolera"
+
+#: ../src/commands/studio/ReconnectDeviceCommand.h:55
+msgid "Reconnect Device"
+msgstr "Podłącz ponownie Urządzenie"
+
+#: ../src/commands/studio/ModifyDeviceCommand.h:68
+msgid "Modify &MIDI Bank"
+msgstr "Modyfikuj Bank &MIDI"
+
+#: ../src/commands/studio/CreateOrDeleteDeviceCommand.h:68
+msgid "Create Device"
+msgstr "Twórz Urządzenie"
+
+#: ../src/commands/studio/ModifyDeviceMappingCommand.h:55
+msgid "Modify &Device Mapping"
+msgstr "Modyfikuj Tabelę &Urządzenia"
+
+#: ../src/commands/studio/RenameDeviceCommand.h:55
+msgid "Rename Device"
+msgstr "Zmień Nazwę Urządzenia"
+
+#: ../src/commands/studio/ModifyControlParameterCommand.h:61
+msgid "&Modify Control Parameter"
+msgstr "&Modyfikuj Parametr Kontrolera"
+
+#: ../src/commands/notation/TieNotesCommand.h:49
+msgid "&Tie"
+msgstr "&Połącz"
+
+#: ../src/commands/notation/ClefInsertionCommand.cpp:74
+msgid "Add Cle&f Change..."
+msgstr "Dodaj Zmianę &klucza"
+
+#: ../src/commands/notation/GuitarChordInsertionCommand.cpp:40
+#, fuzzy
+msgid "Insert Guitar Chord"
+msgstr "edytor akordów gitarowych"
+
+#: ../src/commands/notation/RespellCommand.cpp:47
+#, c-format
+msgid "Respell with %1"
+msgstr "Zamień encharmonicznie na %1"
+
+#: ../src/commands/notation/RespellCommand.cpp:50
+msgid "Do&uble Sharp"
+msgstr "&Podwójny krzyżyk"
+
+#: ../src/commands/notation/RespellCommand.cpp:52
+msgid "&Sharp"
+msgstr "&Krzyżyk"
+
+#: ../src/commands/notation/RespellCommand.cpp:54
+msgid "&Flat"
+msgstr "&Bemol"
+
+#: ../src/commands/notation/RespellCommand.cpp:56
+msgid "Dou&ble Flat"
+msgstr "Po&dwójny bemol"
+
+#: ../src/commands/notation/RespellCommand.cpp:58
+msgid "&Natural"
+msgstr "&Bez Znaków"
+
+#: ../src/commands/notation/RespellCommand.cpp:60
+msgid "N&one"
+msgstr "&Brak"
+
+#: ../src/commands/notation/RespellCommand.cpp:66
+msgid "Respell Accidentals &Upward"
+msgstr "Zamień znaki chromatyczne na krzyżykowe"
+
+#: ../src/commands/notation/RespellCommand.cpp:69
+msgid "Respell Accidentals &Downward"
+msgstr "Zamień na znaki chromatyczne na bemolowe"
+
+#: ../src/commands/notation/RespellCommand.cpp:72
+#, fuzzy
+msgid "&Restore Accidentals"
+msgstr "Sprawdź pisownię znaków chromatycznych"
+
+#: ../src/commands/notation/RespellCommand.cpp:75
+msgid "Respell Accidentals"
+msgstr "Sprawdź pisownię znaków chromatycznych"
+
+#: ../src/commands/notation/DeCounterpointCommand.h:55
+msgid "Split-and-Tie Overlapping &Chords"
+msgstr "Rozdziel i połącz łukami nachodzące na siebie &Akordy"
+
+#: ../src/commands/notation/BeamCommand.h:49
+msgid "&Beam Group"
+msgstr "&Belkuj grupę"
+
+#: ../src/commands/notation/AddTextMarkCommand.h:51
+msgid "Add Te&xt Mark..."
+msgstr "Dodaj &Oznaczenie Tekstowe..."
+
+#: ../src/commands/notation/RestoreSlursCommand.h:49
+#, fuzzy
+msgid "&Restore Slur Positions"
+msgstr "&Przywróć Wyliczoną Pozycję Łuku"
+
+#: ../src/commands/notation/SustainInsertionCommand.h:56
+msgid "Add Pedal &Press"
+msgstr "Dodaj Oznaczenie &Pedału"
+
+#: ../src/commands/notation/SustainInsertionCommand.h:58
+msgid "Add Pedal &Release"
+msgstr "Dodaj Oznaczenie &Zwolnienia Pedału"
+
+#: ../src/commands/notation/FixNotationQuantizeCommand.h:49
+msgid "Fi&x Notation Quantization"
+msgstr "&Napraw Kwantyzację Nutową"
+
+#: ../src/commands/notation/ChangeStemsCommand.h:51
+msgid "Stems &Up"
+msgstr "Chorągiewki w &Górę"
+
+#: ../src/commands/notation/ChangeStemsCommand.h:51
+msgid "Stems &Down"
+msgstr "Chorągiewki w &Dół"
+
+#: ../src/commands/notation/MakeAccidentalsCautionaryCommand.cpp:43
+msgid "Use &Cautionary Accidentals"
+msgstr "Dodaj nawiasy do znaków przygodnych"
+
+#: ../src/commands/notation/MakeAccidentalsCautionaryCommand.cpp:45
+msgid "Cancel C&autionary Accidentals"
+msgstr "Usuń znaki p&rzygodne"
+
+#: ../src/commands/notation/SetVisibilityCommand.h:50
+msgid "Set Visibility"
+msgstr "Ustaw Widoczność"
+
+#: ../src/commands/notation/ChangeStyleCommand.h:53
+msgid "Change &Note Style"
+msgstr "Zmień &styl notacji"
+
+#: ../src/commands/notation/TextInsertionCommand.cpp:41
+msgid "Insert Text"
+msgstr "Wstaw tekst"
+
+#: ../src/commands/notation/InterpretCommand.h:70
+msgid "&Interpret..."
+msgstr "&Interpretuj..."
+
+#: ../src/commands/notation/TupletCommand.h:53
+msgid "&Triplet"
+msgstr "&Triola"
+
+#: ../src/commands/notation/TupletCommand.h:54
+msgid "Tu&plet..."
+msgstr "&Duola i Inne"
+
+#: ../src/commands/notation/UnTupletCommand.h:50
+msgid "&Untuplet"
+msgstr "&Usuń Triolę"
+
+#: ../src/commands/notation/CollapseRestsCommand.h:54
+msgid "&Collapse Rests"
+msgstr "&Scal Pauzy"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:145
+msgid "Add S&lur"
+msgstr "Dodaj &Łuk"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:147
+msgid "Add &Phrasing Slur"
+msgstr "Dodaj Łuk &Frazy"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:149
+msgid "Add Double-Octave Up"
+msgstr "Zamień na nutę z przenośnikiem podwójno-oktawowym "
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:151
+msgid "Add Octave &Up"
+msgstr "Zamień na nutę z przenośnikiem oktawowym "
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:153
+msgid "Add Octave &Down"
+msgstr "Zamień na nutę z dolnym przenośnikiem oktawowym "
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:155
+msgid "Add Double Octave Down"
+msgstr "Zamień na nutę z dolnym przenośnikiem podwójno-oktawowym "
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:160
+msgid "Add &Crescendo"
+msgstr "Dodaj &Crescendo"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:162
+msgid "Add &Decrescendo"
+msgstr "Dodaj &Decrescendo"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:164
+msgid "Add &Glissando"
+msgstr "Dodaj &Glissando"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:167
+msgid "Add &%1%2"
+msgstr "Dodaj &%1%2"
+
+#: ../src/commands/notation/RemoveNotationQuantizeCommand.h:49
+msgid "Remo&ve Notation Quantization"
+msgstr "&Usuń Kwantyzację Nutową"
+
+#: ../src/commands/notation/MakeChordCommand.h:50
+msgid "Make &Chord"
+msgstr "Zrób &Akord"
+
+#: ../src/commands/notation/MultiKeyInsertionCommand.h:63
+msgid "Change all to &Key %1..."
+msgstr "Zmień wszystko na &Klawisz %1..."
+
+#: ../src/commands/notation/KeyInsertionCommand.h:67
+#: ../src/commands/notation/MultiKeyInsertionCommand.h:65
+msgid "Add &Key Change..."
+msgstr "Dodaj Zmianę Tonacji..."
+
+#: ../src/commands/notation/RestoreStemsCommand.h:49
+#, fuzzy
+msgid "&Restore Stems"
+msgstr "&Przywróć Wyliczone Laski"
+
+#: ../src/commands/notation/MakeNotesViableCommand.h:55
+#: ../src/commands/notation/MakeRegionViableCommand.h:52
+msgid "Tie Notes at &Barlines"
+msgstr "Połącz Łukiem Nuty pomiędzy Kreskami Taktowymi"
+
+#: ../src/commands/notation/AddSlashesCommand.h:46
+msgid "Slashes"
+msgstr "Kreski ukośne miar groov'u"
+
+#: ../src/commands/notation/ChangeSlurPositionCommand.h:51
+msgid "Slur &Above"
+msgstr "Łuk &Nad"
+
+#: ../src/commands/notation/ChangeSlurPositionCommand.h:51
+msgid "Slur &Below"
+msgstr "Łuk &Pod"
+
+#: ../src/commands/notation/NormalizeRestsCommand.h:54
+msgid "&Normalize Rests"
+msgstr "&Normalizuj Pauzy"
+
+#: ../src/commands/notation/TextChangeCommand.cpp:41
+msgid "Edit Text"
+msgstr "Edytuj tekst"
+
+#: ../src/commands/notation/RemoveMarksCommand.h:49
+msgid "&Remove All Marks"
+msgstr "&Usun Wszystkie Znaczniki"
+
+#: ../src/commands/notation/AutoBeamCommand.h:52
+msgid "&Auto-Beam"
+msgstr "&Auto Belkowanie"
+
+#: ../src/commands/notation/UntieNotesCommand.h:49
+msgid "&Untie"
+msgstr "&Rozłącz"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:48
+msgid "S&forzando"
+msgstr "S&forzando"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:50
+msgid "Sta&ccato"
+msgstr "Sta&ccato"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:52
+msgid "R&inforzando"
+msgstr "R&inforzando"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:54
+msgid "T&enuto"
+msgstr "T&enuto"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:56
+msgid "Tri&ll"
+msgstr "Tri&ll"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:58
+msgid "Trill &with Line"
+msgstr "Tryl &z Linią falistą"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:60
+msgid "Trill Line"
+msgstr "Falista Linia trylu"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:62
+msgid "&Turn"
+msgstr "&Obiegnik"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:64
+msgid "&Accent"
+msgstr "&Akcent"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:66
+msgid "&Staccatissimo"
+msgstr "&Staccatissimo"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:68
+msgid "&Marcato"
+msgstr "&Marcato"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:70
+msgid "&Pause"
+msgstr "&Pauza"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:72
+msgid "&Up-Bow"
+msgstr "&Smyczek w górę"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:74
+msgid "&Down-Bow"
+msgstr "&Smyczek w dół"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:76
+msgid "Mo&rdent"
+msgstr "Mo&rdent"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:78
+msgid "Inverted Mordent"
+msgstr "Odwrócony mordent"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:80
+msgid "Long Mordent"
+msgstr "Długi mordent"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:82
+msgid "Lon&g Inverted Mordent"
+msgstr "&Długi odwrócony mordent"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:84
+msgid "&%1%2"
+msgstr "&%1%2"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:89
+#, c-format
+msgid "Add %1"
+msgstr "Dodaj %1"
+
+#: ../src/commands/notation/ResetDisplacementsCommand.h:49
+#, fuzzy
+msgid "Restore Positions"
+msgstr "&Przywróć Wyliczone Pozycje "
+
+#: ../src/commands/notation/IncrementDisplacementsCommand.h:52
+msgid "Fine Reposition"
+msgstr "Precyzyjne Przesuwanie"
+
+#: ../src/commands/notation/RestoreTiesCommand.h:49
+#, fuzzy
+msgid "&Restore Tie Positions"
+msgstr "&Przywróć Wyliczone Pozycje "
+
+#: ../src/commands/notation/ChangeTiePositionCommand.h:47
+#, fuzzy
+msgid "Tie &Above"
+msgstr "Łuk &Nad"
+
+#: ../src/commands/notation/ChangeTiePositionCommand.h:47
+#, fuzzy
+msgid "Tie &Below"
+msgstr "Łuk &Pod"
+
+#: ../src/commands/notation/KeyInsertionCommand.h:65
+msgid "Change to &Key %1..."
+msgstr "Zmień na &Klawisz %1..."
+
+#: ../src/commands/notation/RemoveFingeringMarksCommand.h:49
+msgid "&Remove Fingerings"
+msgstr "&Usuń Palcowanie"
+
+#: ../src/commands/notation/BreakCommand.h:49
+msgid "&Unbeam"
+msgstr "&Rozdziel chorągiewski"
+
+#: ../src/commands/notation/UnGraceCommand.h:48
+msgid "Ung&race"
+msgstr "Zamień &Przednutkę na Nutę"
+
+#: ../src/commands/notation/AddFingeringMarkCommand.cpp:45
+msgid "Add Other &Fingering..."
+msgstr "Dodaj Inne %Palcowanie..."
+
+#: ../src/commands/notation/AddFingeringMarkCommand.cpp:47
+msgid "Add Fingering &0 (Thumb)"
+msgstr "Dodaj Palcowanie &0 (Kciuk)"
+
+#: ../src/commands/notation/AddFingeringMarkCommand.cpp:49
+#, c-format
+msgid "Add Fingering &%1"
+msgstr "Dodaj Palcowanie &%1"
+
+#: ../src/document/io/HydrogenXMLHandler.cpp:277
+msgid " imported from Hydrogen "
+msgstr "importowane z Wodoru"
+
+#: ../src/document/io/LilyPondExporter.cpp:404
+#, fuzzy
+msgid ""
+"LilyPond does not allow spaces or backslashes in filenames.\n"
+"\n"
+"Would you like to use\n"
+"\n"
+" %1\n"
+"\n"
+" instead?"
+msgstr ""
+"Lilypond nie pozwala na odstępu lub ukośniki w nazwach plików.\n"
+"\n"
+"Czy chciałbyś użyć\n"
+"\n"
+"%1\n"
+"\n"
+"zamiast?"
+
+#: ../src/document/io/LilyPondExporter.cpp:2054
+msgid "warning: overlong bar truncated here"
+msgstr "ostrzeżenie: skrócony przydługi takt"
+
+#: ../src/document/io/LilyPondExporter.cpp:2060
+msgid "warning: bar too short, padding with rests"
+msgstr "ostrzeżenie: za krótki takt, wypełnianie pauzami"
+
+#: ../src/document/MultiViewCommandHistory.cpp:318
+msgid "Nothing to undo"
+msgstr "Nic do cofnięcia"
+
+#: ../src/document/MultiViewCommandHistory.cpp:320
+msgid "Nothing to redo"
+msgstr "Nic do ponowienia"
+
+#: ../src/document/MultiViewCommandHistory.cpp:328
+#: ../src/document/MultiViewCommandHistory.cpp:372
+#, c-format
+msgid "Und&o %1"
+msgstr "&Cofnij %1"
+
+#: ../src/document/MultiViewCommandHistory.cpp:330
+#: ../src/document/MultiViewCommandHistory.cpp:374
+#, c-format
+msgid "Re&do %1"
+msgstr "&Ponów %1"
+
+#: ../src/document/RosegardenGUIDoc.cpp:328
+msgid ""
+"The current file has been modified.\n"
+"Do you want to save it?"
+msgstr ""
+"Bieżący plik został zmodyfikowany.\n"
+" Chcesz go zapisać?"
+
+#: ../src/document/RosegardenGUIDoc.cpp:480
+#, c-format
+msgid ""
+"_n: Delete the 1 audio file recorded during the unsaved session?\n"
+"Delete the %n audio files recorded during the unsaved session?"
+msgstr ""
+"_n: Kasować 1 plik audio nagrany podczas nie zapisanej sesji??\n"
+"Kasuj %n pliki audio nagrane podczas nie zapisanej sesji?"
+
+#: ../src/document/RosegardenGUIDoc.cpp:501
+msgid ""
+"The following audio files were recorded during this session but have been "
+"unloaded\n"
+"from the audio file manager, and so are no longer in use in the document you "
+"are saving.\n"
+"\n"
+"You may want to clean up these files to save disk space.\n"
+"\n"
+"Please select any you wish to delete permanently from the hard disk.\n"
+msgstr ""
+"Następujące pliki audio zostały nagrane podczas tej sesji, ale zostały "
+"wyładowane \n"
+" z menadżera plików audio, więc nie są używane w dokumencie, który "
+"zapisujesz.\n"
+"\n"
+"Mógłbyś chcieć skasować te pliki, by zaoszczędzić miejsce na dysku.\n"
+"\n"
+"Proszę wybrać, które chcesz na zawsze skasować z dysku twardego.\n"
+
+#: ../src/document/RosegardenGUIDoc.cpp:517
+#, fuzzy, c-format
+msgid ""
+"_n: <qt>About to delete 1 audio file permanently from the hard disk."
+"<br>There will be no way to recover this file.<br>Are you sure?</qt>\n"
+"\n"
+"<qt>About to delete %n audio files permanently from the hard disk.<br>There "
+"will be no way to recover these files.<br>Are you sure?</qt>"
+msgstr ""
+"_n: Masz zamiar skasować na zawsze 1 plik audio z dysku twardego.\n"
+"Nie będzie możliwości jego odzyskania.\n"
+"Jesteś pewien?\n"
+"Masz zamiar skasować na zawsze %n plik audio z dysku twardego. Nie będzie "
+"możliwości jego odzyskania.\n"
+"Jesteś pewien?"
+
+#: ../src/document/RosegardenGUIDoc.cpp:580
+msgid "Can't open file '%1'"
+msgstr "Nie można otworzyć pliku '%1'"
+
+#: ../src/document/RosegardenGUIDoc.cpp:585
+msgid "Reading file..."
+msgstr "Odczytywanie pliku..."
+
+#: ../src/document/RosegardenGUIDoc.cpp:603
+#, fuzzy
+msgid "Could not open Rosegarden file"
+msgstr "Nie można było otworzyć pliku Różanego Ogrodu-4"
+
+#: ../src/document/RosegardenGUIDoc.cpp:641
+msgid "Error when parsing file '%1': \"%2\""
+msgstr "Błąd przetwarzania pliku '%1': \"%2\""
+
+#: ../src/document/RosegardenGUIDoc.cpp:689
+msgid "Generating audio previews..."
+msgstr "Tworzenie wykresów fali dźwiękowej..."
+
+#: ../src/document/RosegardenGUIDoc.cpp:721
+msgid "Merge"
+msgstr "Scal"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1605
+msgid "File load cancelled"
+msgstr "Ładowanie pliku anulowane"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1625
+msgid ""
+"<h3>Audio and plugins not available</h3><p>This composition uses audio files "
+"or plugins, but Rosegarden is currently running without audio because the "
+"JACK audio server was not available on startup.</p><p>Please exit "
+"Rosegarden, start the JACK audio server and re-start Rosegarden if you wish "
+"to load this complete composition.</p><p><b>WARNING:</b> If you re-save this "
+"composition, all audio and plugin data and settings in it will be lost.</p>"
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:1628
+msgid ""
+"<h3>Audio and plugins not available</h3><p>This composition uses audio files "
+"or plugins, but you are running a version of Rosegarden that was compiled "
+"without audio support.</p><p><b>WARNING:</b> If you re-save this composition "
+"from this version of Rosegarden, all audio and plugin data and settings in "
+"it will be lost.</p>"
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:1665
+msgid ""
+"<h3>Incorrect audio sample rate</h3><p>This composition contains audio files "
+"that were recorded or imported with the audio server running at a different "
+"sample rate (%1 Hz) from the current JACK server sample rate (%2 Hz).</"
+"p><p>Rosegarden will play this composition at the correct speed, but any "
+"audio files in it will probably sound awful.</p><p>Please consider re-"
+"starting the JACK server at the correct rate (%3 Hz) and re-loading this "
+"composition before you do any more work with it.</p>"
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:1675
+msgid ""
+"<h3>Inconsistent audio sample rates</h3><p>This composition contains audio "
+"files at more than one sample rate.</p><p>Rosegarden will play them at the "
+"correct speed, but any audio files that were recorded or imported at rates "
+"different from the current JACK server sample rate (%1 Hz) will probably "
+"sound awful.</p><p>Please see the audio file manager dialog for more "
+"details, and consider resampling any files that are at the wrong rate.</p>"
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:1676
+#, fuzzy
+msgid "Inconsistent sample rates"
+msgstr "Właściwości tymczasowe"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1690
+#, fuzzy
+msgid ""
+"<h3>Plugins not found</h3><p>The following audio plugins could not be loaded:"
+"</p><ul>"
+msgstr ""
+"Następujące wtyczki nie mogły zostać załadowane:\n"
+"\n"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1698
+#, fuzzy
+msgid "<li>%1 (from %2)</li>"
+msgstr "-- %1 (z %2)\n"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1712
+msgid ""
+"This file contains one or more old element types that are now deprecated.\n"
+"Support for these elements may disappear in future versions of Rosegarden.\n"
+"We recommend you re-save this file from this version of Rosegarden to ensure "
+"that it can still be re-loaded in future versions."
+msgstr ""
+"Ten plik zawiera jeden, lub więcej elementów starego typu, które nie są "
+"rozwijane.\n"
+"Wsparcie dla tych elementów może w przyszłości zostać wycofane przez Różany "
+"Ogród.\n"
+"Zalecamy zapisać ten plik w tej wersji programu, by zapewnić, że będzie go "
+"można otworzyć w przyszłości."
+
+#: ../src/document/RosegardenGUIDoc.cpp:2207
+msgid "Insert Recorded MIDI"
+msgstr "Wstaw nagrane MIDI"
+
+#: ../src/document/RosegardenGUIDoc.cpp:2560
+msgid "%1 (recorded)"
+msgstr "%1 (nagrane)"
+
+#: ../src/document/RoseXmlHandler.cpp:442
+msgid ""
+"This file was written by Rosegarden %1, and it uses\n"
+"a different file format that cannot be read by this version."
+msgstr ""
+"Ten plik został zapisany przez Różany Ogród %1, i używa\n"
+"innego rodzaju formatu, którego nie może odczytać ta wersja programu."
+
+#: ../src/document/RoseXmlHandler.cpp:452
+msgid ""
+"This file was written by Rosegarden %1, which is more recent than this "
+"version.\n"
+"There may be some incompatibilities with the file format."
+msgstr ""
+"Ten plik został zapisany przez Różany Ogród %1, którego wersja jest "
+"późniejsza niż obecnie używana.\n"
+"Może wystąpić pewien brak kompatybilności z tym formatem pliku."
+
+#: ../src/document/RoseXmlHandler.cpp:1687
+msgid "Loading plugins..."
+msgstr "Ładowanie wtyczek..."
+
+#: rc.cpp:6 rc.cpp:144
+#, no-c-format
+msgid "Se&gment"
+msgstr "Se&gment"
+
+#: rc.cpp:9 rc.cpp:84 rc.cpp:147 rc.cpp:303
+#, no-c-format
+msgid "Edit &With"
+msgstr "&Edytuj w"
+
+#: rc.cpp:12 rc.cpp:21 rc.cpp:30 rc.cpp:39 rc.cpp:345
+#, no-c-format
+msgid "Actions Toolbar"
+msgstr "Narzędzia akcji"
+
+#: rc.cpp:15 rc.cpp:33 rc.cpp:129 rc.cpp:285
+#, no-c-format
+msgid "Time Toolbar"
+msgstr "Narzędzie Czasu"
+
+#: rc.cpp:18 rc.cpp:36 rc.cpp:57 rc.cpp:63 rc.cpp:120 rc.cpp:243 rc.cpp:342
+#, no-c-format
+msgid "Transport Toolbar"
+msgstr "Narzędzie Panelu Sterowania"
+
+#: rc.cpp:24 rc.cpp:42 rc.cpp:123 rc.cpp:348
+#, no-c-format
+msgid "Zoom Toolbar"
+msgstr "Narzędzie Powiększania"
+
+#: rc.cpp:45 rc.cpp:60 rc.cpp:99 rc.cpp:228 rc.cpp:327
+#, no-c-format
+msgid "T&ransport"
+msgstr "&Panel Sterowania"
+
+#: rc.cpp:51
+#, no-c-format
+msgid "Number of Stereo &Inputs"
+msgstr "Liczba W&ejść stereo"
+
+#: rc.cpp:54
+#, no-c-format
+msgid "&Number of Submasters"
+msgstr "&Liczba szyn"
+
+#: rc.cpp:66
+#, no-c-format
+msgid "&Import"
+msgstr "&Import"
+
+#: rc.cpp:69
+#, no-c-format
+msgid "&Merge"
+msgstr "&Scal"
+
+#: rc.cpp:72
+#, no-c-format
+msgid "&Export"
+msgstr "&Eksport"
+
+#: rc.cpp:75 rc.cpp:141 rc.cpp:297
+#, no-c-format
+msgid "&Composition"
+msgstr "&Utwór"
+
+#: rc.cpp:78
+#, no-c-format
+msgid "&Studio"
+msgstr "&Studio"
+
+#: rc.cpp:81
+#, no-c-format
+msgid "Se&gments"
+msgstr "Se&gmenty"
+
+#: rc.cpp:90
+#, no-c-format
+msgid "Trac&ks"
+msgstr "Ś&cieżki"
+
+#: rc.cpp:93
+#, no-c-format
+msgid "Set &Instrument"
+msgstr "Wybierz &Instrument/Kanał dla Ścieżki"
+
+#: rc.cpp:102 rc.cpp:234 rc.cpp:333
+#, no-c-format
+msgid "&Toolbars"
+msgstr "&Narzędzia"
+
+#: rc.cpp:105 rc.cpp:237 rc.cpp:336
+#, no-c-format
+msgid "&Rulers"
+msgstr "&Linijki"
+
+#: rc.cpp:111 rc.cpp:240 rc.cpp:339
+#, no-c-format
+msgid "Tools Toolbar"
+msgstr "Narzędzie narzędzi"
+
+#: rc.cpp:114
+#, no-c-format
+msgid "Tracks Toolbar"
+msgstr "Narzędzie Ścieżek"
+
+#: rc.cpp:117
+#, no-c-format
+msgid "Editors Toolbar"
+msgstr "Narzędzie Edycji"
+
+#: rc.cpp:135
+#, no-c-format
+msgid "&Layout Mode"
+msgstr "Tryb &wydruku"
+
+#: rc.cpp:138 rc.cpp:294
+#, no-c-format
+msgid "Add Event Ruler"
+msgstr "Dodaj Oś współrzędnych Zdarzeń"
+
+#: rc.cpp:150
+#, fuzzy, no-c-format
+msgid "N&ote"
+msgstr "&Nuty"
+
+#: rc.cpp:153
+#, no-c-format
+msgid "Mar&ks"
+msgstr "&Artykulacja"
+
+#: rc.cpp:156
+#, no-c-format
+msgid "&Ornaments"
+msgstr "&Ozdobniki"
+
+#: rc.cpp:159
+#, no-c-format
+msgid "&Fingerings"
+msgstr "&Palcowanie"
+
+#: rc.cpp:162
+#, no-c-format
+msgid "S&lashes"
+msgstr "&Tremolo"
+
+#: rc.cpp:165 rc.cpp:219
+#, no-c-format
+msgid "&Accidentals"
+msgstr "&Znaki przygodne"
+
+#: rc.cpp:168
+#, fuzzy, no-c-format
+msgid "&Phrase"
+msgstr "&Kasuj"
+
+#: rc.cpp:171
+#, no-c-format
+msgid "Slur &Position"
+msgstr "Pozycje Ł&uków"
+
+#: rc.cpp:174
+#, fuzzy, no-c-format
+msgid "Tie &Position"
+msgstr "Pozycje Ł&uków"
+
+#: rc.cpp:177
+#, no-c-format
+msgid "&Octaves"
+msgstr "&Oktawy"
+
+#: rc.cpp:180 rc.cpp:306
+#, no-c-format
+msgid "Ad&just"
+msgstr "&Zmień"
+
+#: rc.cpp:183
+#, no-c-format
+msgid "R&ests"
+msgstr "Pau&zy"
+
+#: rc.cpp:186 rc.cpp:213
+#, no-c-format
+msgid "&Notes"
+msgstr "&Nuty"
+
+#: rc.cpp:189 rc.cpp:309
+#, no-c-format
+msgid "&Quantize"
+msgstr "&Kwantyzuj"
+
+#: rc.cpp:195 rc.cpp:315
+#, no-c-format
+msgid "Trans&pose"
+msgstr "&Transponuj"
+
+#: rc.cpp:198 rc.cpp:318
+#, no-c-format
+msgid "Convert"
+msgstr ""
+
+#: rc.cpp:201
+#, no-c-format
+msgid "&Fine Positioning"
+msgstr "&Precyzyjne umiejscawianie w takcie"
+
+#: rc.cpp:204
+#, no-c-format
+msgid "Fine Ti&ming"
+msgstr "Precyzyjne przesuwanie w &czasie"
+
+#: rc.cpp:207
+#, no-c-format
+msgid "&Visibility"
+msgstr "&Ukrywanie Nut"
+
+#: rc.cpp:216
+#, no-c-format
+msgid "&Rests"
+msgstr "&Pauzy"
+
+#: rc.cpp:222
+#, no-c-format
+msgid "&Clefs"
+msgstr "&Klucze"
+
+#: rc.cpp:225 rc.cpp:324
+#, no-c-format
+msgid "Local &Cursor"
+msgstr "Kursor &Edycji"
+
+#: rc.cpp:246
+#, no-c-format
+msgid "Notes Toolbar"
+msgstr "Narzędzia Nut"
+
+#: rc.cpp:249
+#, no-c-format
+msgid "Rests Toolbar"
+msgstr "Narzędzia Pauz"
+
+#: rc.cpp:252
+#, no-c-format
+msgid "Clefs Toolbar"
+msgstr "Narzędzia Kluczy"
+
+#: rc.cpp:255
+#, no-c-format
+msgid "Accidentals Toolbar"
+msgstr "Narzędzia Znaków Przygodnych"
+
+#: rc.cpp:258
+#, no-c-format
+msgid "Group Toolbar"
+msgstr "Narzędzie Grup"
+
+#: rc.cpp:261
+#, no-c-format
+msgid "Marks Toolbar"
+msgstr "Narzędzie Znaczników"
+
+#: rc.cpp:264
+#, no-c-format
+msgid "Meta Toolbar"
+msgstr "Narzędzia Meta"
+
+#: rc.cpp:267
+#, no-c-format
+msgid "Layout Toolbar"
+msgstr "Narzędzia wydruku"
+
+#: rc.cpp:270 rc.cpp:351
+#, no-c-format
+msgid "Control Ruler actions"
+msgstr "akcje Oś współrzędnychu Kontrolera"
+
+#: rc.cpp:273 rc.cpp:354
+#, no-c-format
+msgid "Property Ruler actions"
+msgstr "akcje Oś współrzędnych Właściwości"
+
+#: rc.cpp:276
+#, no-c-format
+msgid "&Action"
+msgstr "&Akcja"
+
+#: rc.cpp:279
+#, no-c-format
+msgid "General Toolbar"
+msgstr "Narzędzia Podstawowe"
+
+#: rc.cpp:291
+#, no-c-format
+msgid "&Grid"
+msgstr "&Siatka"
+
+#: rc.cpp:300
+#, no-c-format
+msgid "&Segment"
+msgstr "&Segment"
+
+#: rc.cpp:361
+#, no-c-format
+msgid "Hide additional controls"
+msgstr "Schowaj dodatkowe kontrolki"
+
+#: rc.cpp:365
+#, no-c-format
+msgid "Panic Button"
+msgstr "Przycisk Paniki"
+
+#: rc.cpp:368
+#, no-c-format
+msgid "Resets all MIDI devices if you've got stuck notes"
+msgstr "Wyzerowuje wszystkie urządzenia MIDI jakie zawiesiły swoje dźwięki"
+
+#: rc.cpp:375
+#, no-c-format
+msgid "Provides a metronome click for you to play along with"
+msgstr "Zapewnia dźwięk metronomu w trakcie odtwarzania"
+
+#: rc.cpp:378
+#, no-c-format
+msgid "Shows MIDI activity in and out of Rosegarden"
+msgstr "Pokazuje aktywność wejścia i wyjścia MIDI Różanego Ogrodu"
+
+#: rc.cpp:381
+#, no-c-format
+msgid "IN"
+msgstr "WEJŚCIE"
+
+#: rc.cpp:384
+#, no-c-format
+msgid "OUT"
+msgstr "WYJŚCIE"
+
+#: rc.cpp:387 rc.cpp:390
+#, no-c-format
+msgid "NO EVENTS"
+msgstr "BRAK ZDARZEŃ"
+
+#: rc.cpp:397
+#, no-c-format
+msgid "Record either MIDI or audio"
+msgstr "Nagrywaj MIDI lub audio"
+
+#: rc.cpp:401
+#, no-c-format
+msgid "Loop"
+msgstr "Pętla"
+
+#: rc.cpp:404
+#, no-c-format
+msgid "Turn on and off the loop markers (if set)"
+msgstr "Włącz/wyłącz znaczniki pętli (jeśli ustawione)"
+
+#: rc.cpp:411
+#, no-c-format
+msgid "Mutes all but the currently selected track"
+msgstr "Wycisza wszystkie ścieżki oprócz bieżącej"
+
+#: rc.cpp:415
+#, no-c-format
+msgid "Start loop or range here"
+msgstr "Ustal tutaj początkowy zakres pętli"
+
+#: rc.cpp:419
+#, no-c-format
+msgid "End loop or range here"
+msgstr "Ustal tutaj końcowy zakres pętli"
+
+#: rc.cpp:422
+#, no-c-format
+msgid "SIG"
+msgstr "ILOŚĆ MIAR"
+
+#: rc.cpp:425
+#, no-c-format
+msgid "DIV"
+msgstr "PODZIAŁ"
+
+#: rc.cpp:428
+#, no-c-format
+msgid "/16"
+msgstr "/16"
+
+#: rc.cpp:431
+#, no-c-format
+msgid "TEMPO"
+msgstr "TEMPO"
+
+#: rc.cpp:434
+#, no-c-format
+msgid "END"
+msgstr "KONIEC"
+
+#: rc.cpp:437
+#, no-c-format
+msgid "BAR"
+msgstr "TAKT"
+
+#: rc.cpp:441
+#, no-c-format
+msgid "Switch between real time, musical time, and frame count"
+msgstr "Zmień pomiędzy czasem rzeczywistym, muzycznym i odliczaniem ramek"
+
+#: rc.cpp:445
+#, no-c-format
+msgid "Show additional controls"
+msgstr "Pokaż dodatkowe kontrolki"
+
+#: rc.cpp:449
+#, no-c-format
+msgid "Rewind"
+msgstr "Do tyłu"
+
+#: rc.cpp:452
+#, no-c-format
+msgid "Moves the current pointer position back one bar."
+msgstr "Przesuwa bierzącą pozycję jeden takt do tyłu."
+
+#: rc.cpp:456
+#, no-c-format
+msgid "Rewind to beginning"
+msgstr "Przewiń do początku"
+
+#: rc.cpp:459
+#, no-c-format
+msgid ""
+"Moves the pointer position to the start of the composition. (This may mean "
+"going forwards if the pointer is currently before the start.)"
+msgstr ""
+"Przesuwa kursor do początku kompozycji. (To może oznaczać przewinięcie do "
+"przodu jeśli kursor jest przed pozycją początkową.)"
+
+#: rc.cpp:463
+#, no-c-format
+msgid "Play/Pause"
+msgstr "Odtwarzanie/Pauza"
+
+#: rc.cpp:466
+#, no-c-format
+msgid ""
+"Plays from the current pointer position, or pauses playback if already in "
+"progress."
+msgstr ""
+"Odtwarza z bieżącej pozycji kursora, albo wstrzymuje odtwarzanie jeśli jest "
+"w trakcie."
+
+#: rc.cpp:473
+#, no-c-format
+msgid "Stops playback or recording."
+msgstr "Zatrzymuje odtwarzanie lub nagrywanie."
+
+#: rc.cpp:477
+#, no-c-format
+msgid "Fast forward"
+msgstr "Szybko do przodu"
+
+#: rc.cpp:480
+#, no-c-format
+msgid "Moves the current pointer position forwards one bar."
+msgstr "Przesuń bierzącą pozycję kursora o jeden takt."
+
+#: rc.cpp:484
+#, no-c-format
+msgid "Fast forward to end"
+msgstr "Szybko przewiń do końca"
+
+#: rc.cpp:487
+#, no-c-format
+msgid ""
+"Moves the pointer position to the end of the composition. (This may mean "
+"going backwards if the pointer is already beyond the end.)"
+msgstr ""
+"Przesuwa kursor do końca kompozycji. (TO może oznaczać pójście do tyłu, "
+"jeśli kursor jest już za tym punktem.)"
+
+#: rc.cpp:491
+#, no-c-format
+msgid "Display time to end"
+msgstr "Wyświetl czas do końca"
+
+#: ../docs/en/tips.cpp:3
+msgid ""
+"<p>To configure a track to play using a particular instrument:</p>\n"
+"&nbsp;&nbsp;* click on the track label and hold a moment<br>\n"
+"&nbsp;&nbsp;* select an output device<br>\n"
+"&nbsp;&nbsp;* select one of that device's available instruments (#1 - #16)"
+"<br>\n"
+"&nbsp;&nbsp;* adjust that instrument's output channel, program, bank, and\n"
+"controllers via the instrument parameters box\n"
+msgstr ""
+"<p>By skonfigurować ścieżkę do odtwarzania konkretnego instrumentu:</p>\n"
+"&nbsp;&nbsp;* kliknij na etykietkę ścieżki i przytrzymaj na chwilę<br> "
+"&nbsp;&nbsp;* wybierz urządzenie wyjściowe<br> &nbsp;&nbsp;* wybierz jeden z "
+"instrumentów dostępnych w tym urządzeniu (#1-#16)<br> &nbsp;&nbsp;* ustaw "
+"kanał wyjściowy dla urządzenia, program, bank, i \n"
+" kontrolery przez panel parametrów instrumentu \n"
+
+#: ../docs/en/tips.cpp:13
+msgid ""
+"<p>...that Rosegarden has an autosave feature?<br><br>\n"
+"You can select your autosave interval from <b>Settings->Configure\n"
+"Rosegarden</b>.<br><br>\n"
+"When something goes awry, such as a power outage or a Rosegarden crash\n"
+"(unfortunately, it happens...) simply load the file you were working on, and "
+"you'll be given the\n"
+"option to load the autosaved version, or the unmodified original.</p>\n"
+msgstr ""
+"<p>...że Rosegarden ma funkcję auto-zapisu?<br><br>\n"
+" Możesz wybrać interwał czasowy auto-zapisu z <b> Ustawienia->Konfiguracja:"
+"f \n"
+"Różany Ogród</b>.<br><br>\n"
+" Kiedy coś idzie na opak, np. przerwa w dopływie prądu, lub zawieszenie "
+"Różanego Ogrodu\n"
+"(niestety, to się zdarza...) po prostu załaduj plik na którym pracujesz, a "
+"będzie Ci dana możliwość \n"
+" załadowania wersji auto-zapisu, lub nie zmodyfikowanego oryginału.</p>\n"
+
+#: ../docs/en/tips.cpp:23
+#, fuzzy
+msgid ""
+"<p>\n"
+"...that you can save the current document as your default studio by using\n"
+"<b>Composition -> Studio -> Save Current Document as Default Studio</b>?</"
+"p>\n"
+msgstr ""
+"<p>\n"
+"Możesz zapisać bieżący dokument jako domyślne ustawienie studia poprzez\n"
+"<br>Utwór --> Studio --> Zapisz Bieżący Dokument jako Domyślne Studio</b>.</"
+"p>\n"
+
+#: ../docs/en/tips.cpp:30
+msgid ""
+"<p>...that your default studio is a complete Rosegarden composition that "
+"gets\n"
+"loaded every time you create a new document or import a MIDI file?</p>\n"
+msgstr ""
+"<p>...że Twoje domyślne studio jest kompletną kompozycją,\n"
+"która jest ładowana za każdym razem kiedy tworzysz nowy dokument, lub "
+"importujesz plik MIDI?</p>\n"
+
+#: ../docs/en/tips.cpp:36
+#, fuzzy
+msgid ""
+"<p>...that your default studio can contain instrument assignments, document "
+"properties, LilyPond headers,\n"
+"and many other things?<br><br>The default studio is a complete Rosegarden "
+"composition, so it can contain anything that you may wish to have available "
+"in each\n"
+"new document you create.</p>\n"
+msgstr ""
+"<p>Ponieważ Twój domyślne studio jest kompletną kompozycją Różanego "
+"Ogrodu, \n"
+"może zawierać domyślne przyporządkowanie instrumentów, właściwości "
+"dokumentu, nagłówki Lilypond, \n"
+"i wiele innych rzeczy, które chciałbyś mieć pod ręką domyślnie\n"
+" przy każdym nowo utworzonym dokumencie.<p>\n"
+
+#: ../docs/en/tips.cpp:43
+#, fuzzy
+msgid ""
+"<p>...that Rosegarden will detect and create a default connection for ALSA "
+"soft\n"
+"synth applications that are started after Rosegarden is already running?</"
+"p>\n"
+msgstr ""
+"<p>...że Różany Ogród wykryje i utworzy domyślne połączenie z syntezatorami "
+"ALSA,\n"
+"które zostały uruchomione w trakcie działania Różanego Ogrodu?</p>\n"
+
+#: ../docs/en/tips.cpp:49
+#, fuzzy
+msgid ""
+"<p>...that you can make your default studio override that in every "
+"Rosegarden composition you load?<br><br>If your studio setup does not change "
+"very often, and you would prefer for\n"
+"the settings in your default studio to take precedence over whatever\n"
+"studio is saved with any files you happen to load, you can make your studio "
+"the default for everything using <b>Settings -> Configure Rosegarden ->\n"
+"MIDI -> Always use default studio when loading files</b>.</p>\n"
+msgstr ""
+"<p> Jeśli ustawienia Twojego studio nie zmieniają się zbyt często\n"
+" i chciałbyś je zapisać w Twoim pliku <b>autoload.rg</b> by były domyślnymi "
+"ustawieniami \n"
+"przy otwieraniu jakichkolwiek innych plików, możesz ustawić ustawienia pliku "
+"autoload\n"
+" jako domyślnego ustawienia studio dla wszystkich plików używając "
+"<b>Ustawienia -> Konfiguracja: Różany Ogród-->\n"
+"Zachowanie -> Zawsze używaj domyślnego studio podczas otwierania plików<b>.</"
+"p>\n"
+
+#: ../docs/en/tips.cpp:57
+msgid ""
+"<p>If you have accidentally recorded a segment so short that it does not\n"
+"appear on the canvas, which you can only hear during subsequent recording\n"
+"sessions, you can gain access to it by using <b>Composition -> Change\n"
+"Composition Start and End</b> and then setting the composition to start at a "
+"negative number.</p>\n"
+msgstr ""
+"<p>Jeśli przypadkowo nagrałeś segment tak krótki, że nie widać go wykresie,\n"
+"ale słychać go podczas nagrywania\n"
+"możesz dostać się do niego używając, <b>Utwór -> Zmień Początek i Koniec "
+"Utworu</b> i zmieniając start utworu na liczbę ujemną..</p>\n"
+
+#: ../docs/en/tips.cpp:65
+#, fuzzy
+msgid ""
+"<p>...that if you place a note at the wrong pitch using the notation or "
+"matrix editor, you can move it one semitone at a time with the up and down "
+"arrow keys on your keyboard?</p>\n"
+msgstr ""
+"<p>...jeśli umieścisz nutę na złej wysokości używając edytora nutowego, "
+"możesz przesuwać ją o półton klawiszami strzałek w górę i w dół na Twojej "
+"klawiaturze?</p>\n"
+
+#: ../docs/en/tips.cpp:70
+msgid ""
+"<p>...that you can toggle stem directions in the notation editor by "
+"selecting\n"
+"one or more notes and using Ctrl-PageUp and Ctrl-PageDown?</p>\n"
+msgstr ""
+"<p>...że możesz zmieniać kierunek lasek w edytorze nutowym poprzez "
+"zaznaczenie\n"
+"kilku lub jednej nuty i używając Ctrl-PageUp i Ctrl-PageDown?</p>\n"
+
+#: ../docs/en/tips.cpp:76
+msgid ""
+"<p>...that you can change the accidental used for a note in the notation "
+"editor (without changing the pitch of the note) by selecting\n"
+"it and using the up and down arrow keys with both Ctrl and Shift pressed?</"
+"p>\n"
+msgstr ""
+"<p>...że możesz zmienić znak przygodny dla jednej nuty w edytorze nutowym "
+"(bez zmiany wysokości dźwięku) poprzez zaznaczenie \n"
+"jej i użycie strzałek góra i dół trzymając oba Ctrl i Shift na raz?</p>\n"
+
+#: ../docs/en/tips.cpp:82 ../docs/en/tips.cpp:93
+msgid ""
+"<p>...that you can hold down the Shift key while repositioning segments on "
+"the\n"
+"segment canvas in order to avoid the \"snap-to\" effect and exert finer "
+"control?</p>\n"
+msgstr ""
+"<p>...że trzymając klawisz Shift podczas przemieszczania segmentów na \n"
+"wykresie segmentów możesz dezaktywować efekt przyciągania i przesuwać "
+"bardziej precyzyjnie?</p>\n"
+
+#: ../docs/en/tips.cpp:88
+msgid ""
+"<p>...that you can use the arrow tool to draw, move, and resize segments and "
+"events as well as to select them?<br><br>Drag a segment or event block to "
+"move it, drag the right edge of a block to resize it, and drag with the "
+"middle mouse button pressed to draw a new segment or event.<br><br>(Of "
+"course, the dedicated draw, move and resize tools are still quicker for "
+"repeated operations.)</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:99
+msgid ""
+"<p>...that you can hold down the Shift key while repositioning or resizing "
+"events in the\n"
+"matrix view in order to avoid the \"snap-to\" effect and exert finer control?"
+"</p>\n"
+msgstr ""
+"<p>...że trzymając klawisz Shift podczas przemieszczania albo zmiany "
+"rozmiaru komunikatów w edytorze \n"
+"pianoli, możesz dezaktywować efekt przyciągania i edytować z większą "
+"precyzją?</p>\n"
+
+#: ../docs/en/tips.cpp:105
+msgid ""
+"<p>...that you can edit multiple segments on multiple tracks simultaneously "
+"in\n"
+"the notation editor? Simply select the segments, then use <b>Edit -> Open "
+"in Notation Editor</b>.</p>\n"
+msgstr ""
+"<p>...że możesz edytować kilka segmentów na kilku ścieżkach jednocześnie w \n"
+"edytorze nutowym? Po prostu zaznacz segmenty, potem wybierz <b>Edycja -> "
+"Otwórz w Edytorze Nutowym</b>.</p>\n"
+
+#: ../docs/en/tips.cpp:111
+msgid ""
+"<p>...that Rosegarden can export files for use by LilyPond, the high-quality "
+"score typesetting system?<br><br>\n"
+"From the <b>File</b> menu, navigate to <b>Export -> Export LilyPond File</"
+"b></p>\n"
+msgstr ""
+"<p>...że Rosegarden może eksportować pliki do programu Lilypond, wysokiej "
+"jakości systemu wydruku nut?<br><br>\n"
+"Z<b>Menu Plik</b> przejdź do <b>Eksport -> Eksportuj do pliku Lilypond </b></"
+"p>\n"
+
+#: ../docs/en/tips.cpp:117
+#, fuzzy
+msgid ""
+"<p>...that Rosegarden can print via LilyPond, the high-quality score "
+"typesetting system?<br><br>\n"
+"From the <b>File</b> menu, navigate to <b>Preview with LilyPond</b>. The "
+"file\n"
+"will be exported, rendered, and a preview will appear in KPDF, or one of\n"
+"several other PDF viewers, where it can then be printed as well.</p>\n"
+msgstr ""
+"<p>...że Różany Ogród może drukować nuty poprzez Lilypond, system wysokiej "
+"jakości wydruku?<br><br>\n"
+"Z <b>Menu Plik</b> przejdź do Eksport -><b>Podgląd w Lilypond</b>. Plik\n"
+"zostanie wyeksportowany, przetworzony, a jego podgląd zostanie wyświetlony w "
+"KGhostView, lub innej przeglądarce PDF, gdzie można go wydrukować.\n"
+"</p>\n"
+
+#: ../docs/en/tips.cpp:125
+msgid ""
+"<p>...that if you use the quantizer from within the notation view, you can "
+"tell it to quantize only the timing used for notation -- making it possible "
+"to have good looking notation <b>and</b> a human MIDI performance?</p>\n"
+msgstr ""
+"<p>...że możesz użyć kwantyzatora w edytorze nutowym i nakazać kwantyzację "
+"czasu tylko dla wydruku nut -- co umożliwia prawidłowy wygląd nut dla "
+"nagrania midi?</p>\n"
+
+#: ../docs/en/tips.cpp:130
+msgid ""
+"<p>...that you can change segment labels using the controls on the Segment "
+"Parameters box\n"
+"in the main window?</p>\n"
+msgstr ""
+"<p>...że możesz zmienić etykietki segmentów używając kontrolek w oknie "
+"Parametry Segmentu \n"
+"w głównym oknie programu?</p>\n"
+
+#: ../docs/en/tips.cpp:136
+msgid ""
+"<p>...that the number of tracks in new documents is based on the contents "
+"of\n"
+"your autoload.rg file?\n"
+"<br><br>\n"
+"Whether you prefer to start with three tracks or 43, create a document that\n"
+"contains the desired number of tracks, plus any other studio or document "
+"properties settings\n"
+"you wish to configure, and use <b>Composition -> Studio -> Save Current "
+"Document as Default\n"
+"Studio</b> to make this your new default.</p>\n"
+msgstr ""
+"<p>...że ilość ścieżek w dokumencie bazuje na zawartości \n"
+"Twojego pliku autoload.rg ?\n"
+"<br><br>\n"
+"Jeśli chcesz rozpoczynać pracę z 3 lub 33, albo 43, stwórz dokument,\n"
+"który zawiera określoną liczbę ścieżek, plus jakieś ustawienia Twojego "
+"studio i właściwości dokumentu, \n"
+"które chcesz skonfigurować i użyj <b>Utwór -> Studio -> Zapisz Bieżący "
+"Dokument jako Domyślne\n"
+"Studio</b> by było Twoim nowym domyślnym dokumentem.</p>\n"
+
+#: ../docs/en/tips.cpp:147
+msgid ""
+"<p>...that you can change the name of a track by double clicking on the "
+"label? (The\n"
+"label must be visible for this to work.)</p>\n"
+msgstr ""
+"<p>...że możesz zmienić nazwę ścieżki podwójnie klikając na jego etykietkę?"
+"(\n"
+"Nazwa musi być widoczna, by to zadziałało.)</p>\n"
+
+#: ../docs/en/tips.cpp:153
+#, fuzzy
+msgid ""
+"<p>...that you can configure what happens when you double-click on a segment?"
+"<br><br>Go to <b>Settings -> Configure Rosegarden</b> and choose your "
+"preferred editing window under the <b>Behaviour</b> tab.</p>\n"
+msgstr ""
+"<p>...że możesz skonfigurować co się stanie, kiedy klikniesz dwa razy na "
+"segment? Idź do <b>Ustawienia -> Konfiguruj Różany Ogród</b> i wybierz "
+"preferowany przez Ciebie edytor w zakładce <b>Zachowanie</b> </p>\n"
+
+#: ../docs/en/tips.cpp:158
+msgid ""
+"<p>...that Rosegarden is being developed as a community effort with\n"
+"contributions from around the world?<br><br>\n"
+"The four most active developers live in London (England), Cannes, "
+"Barcelona,\n"
+"and... Christiansburg? (Christiansburg is a town of about 50,000 in\n"
+"southwestern Virginia, USA.)<br><br>\n"
+"We have had contributors from elsewhere in the US, UK, Spain, Mexico, "
+"Argentina, Germany,\n"
+"Sweden, Russia, Japan, Finland, and Italy, just to name a few...</p>\n"
+msgstr ""
+"<p>...że Różany Ogród jest rozwijany dzięki wysiłkom społeczności \n"
+"z całego świata<br><br>\n"
+"Najbardziej aktywni programiści żyją w Londynie (Anglia)i Barcelonie, "
+"Kann, \n"
+"i Christiansburg? (Christiansburg jest 50 tysięcznym miastem, w\n"
+"zachodnio-południowej Wirginii, USA.)<br><br>\n"
+"Mamy współpracowników zewsząd: w USA, Wielkiej Brytanii, Hiszpanii, Meksyku, "
+"Argentynie, Niemczech,\n"
+"Szwecji, Rosji, Japonii, Finlandii, i Włoszech, by wspomnieć tylko kilku..."
+"</p>\n"
+
+#: ../docs/en/tips.cpp:169
+msgid ""
+"<p>...that Rosegarden is available in Spanish, French, German, Russian, "
+"Welsh, Swedish, Italian and Estonian\n"
+"translations? (Just to name a few.)<br><br>\n"
+"If you're interested in translating Rosegarden to another language, drop us "
+"a\n"
+"line at <b>[email protected]</b>.</p>\n"
+msgstr ""
+"<p>...że Różany Ogród jest dostępny po hiszpańsku, francusku, niemiecku, "
+"rosyjsku, walijsku, szwedzku, włosku i estońsku?\n"
+"(By wspomnieć tylko kilka języków.)<br><br>\n"
+"Jeśli jesteś zainteresowany tłumaczeniem Różanego Ogrodu na inny język, "
+"napisz do nas\n"
+"maila na adres<b>[email protected]</b>.</p>\n"
+
+#: ../docs/en/tips.cpp:177
+msgid ""
+"<p>...that you can change the total number of bars in the composition via\n"
+"<b>Composition -> Change Composition Start and End</b>?</p>\n"
+msgstr ""
+"<p>...że możesz zmienić całkowitą ilość taktów w kompozycji poprzez\n"
+"<b>Utwór -> Zmień Początek i Koniec Utworu...</b>?</p>\n"
+
+#: ../docs/en/tips.cpp:183
+msgid ""
+"<p>...that you can see the difference between performance and display "
+"duration\n"
+"of duration-quantized notes in the notation editor?<br><br>\n"
+"Use <b>Settings -> Show Raw Note Ruler</b> to turn on this handy\n"
+"feature.<br><br>\n"
+"<i>Note that this feature does not work in page layout view.</i></p>\n"
+msgstr ""
+"<p>...że możesz widzieć różnicę pomiędzy wykonaniem i wyświetlaniem "
+"wartości \n"
+"kwantyzacji w edytorze nutowym?<br><br>\n"
+"Użyj <b>Ustawienia -> Oś Współrzędnych -> Pokaż Oś Współrzędnych Nut "
+"Surową</b> by włączyć tę przydatną funkcję.<br><br>\n"
+"<i>Zauważ, że ta funkcja nie działa w podglądzie strony.</i></p>\n"
+
+#: ../docs/en/tips.cpp:192
+msgid ""
+"<p>...that you can add tempo and time-signature changes by double-clicking "
+"on the values displayed in the transport window or tempo rulers?</p>\n"
+msgstr ""
+"<p>...że możesz dodać zmiany tempa i metrum klikając podwójnie w wartości "
+"wyświetlane w panelu sterowania, albo na wykres tempa?</p>\n"
+
+#: ../docs/en/tips.cpp:197
+#, fuzzy
+msgid ""
+"<p>...that the transport window can display musical time, sample frame "
+"count, and a visual metronome as well as real time?<br><br>Just click on the "
+"small button at the extreme top left of the window.</p>\n"
+msgstr ""
+"<p>...że panel sterowania może wyświetlać współrzędne muzyczne, ramki, i "
+"metronom jak również czas rzeczywisty? Wystarczy kliknąć na małej ikonce w "
+"górnym lewym rogu panelu sterowania.</p>\n"
+
+#: ../docs/en/tips.cpp:202
+#, fuzzy
+msgid ""
+"<p>...that you can select all notes of a particular pitch in the matrix "
+"view, by shift-clicking on that pitch on the piano keyboard at the left?"
+"<br><br>If you shift-click-drag, you can select whole ranges too.</p>\n"
+msgstr ""
+"<p>...że możesz zaznaczyć wszystkie nuty o jednej wysokości dźwięku w "
+"edytorze pianoli trzymają shift klikając i klikając tę wysokość na "
+"klawiaturze po lewej stronie? Jeśli przytrzymasz Shift i przeciągniesz "
+"myszkę, możesz także zaznaczać całe zakresy.</p>\n"
+
+#: ../docs/en/tips.cpp:207
+#, fuzzy
+msgid ""
+"<p>...that you can set a loop in the main window by clicking-and-dragging on "
+"the time ruler with Shift pressed?<br><br>(If the ruler isn't visible, use "
+"<b>Settings -> Show Rulers</b>.)</p>\n"
+msgstr ""
+"<p>...że możesz ustawić pętlę w głównym oknie trzymając shift , klikając i "
+"przeciągając na wykresie współrzędnych? (Jeśli nie widać wykresu, "
+"użyj<b>Ustawienia -> Pokaż Oś Współrzędnych Tempa</b>.)</p>\n"
+
+#: ../docs/en/tips.cpp:212
+#, fuzzy
+msgid ""
+"<p>...that if you're editing a section in the matrix or notation view, you "
+"can\n"
+"set that section to loop while you edit it?<br><br>Select it and use "
+"<b>Tools ->\n"
+"Local Cursor -> Set Loop to Selection</b>, then hit Play.</p><br><br>\n"
+"<i>This feature does not work quite as well for compositions that include "
+"sampled\n"
+"audio.</i>\n"
+msgstr ""
+"<p>...że kiedy pracujesz w edytorze pianolowym, możesz\n"
+"zapętlić sekcję w trakcie jej edytowania? Zaznacz ją użyj <b>Narzędzia ->\n"
+" Kursor Edycji -> Ustaw pętle według zaznaczenia</b>, naciśnij odtwarzanie.</"
+"p><br><br>\n"
+"<i>Ta funkcja nie działa zbyt dobrze z kompozycjami, które zawierają "
+"samplowany materiał.\n"
+"dźwiękowy.</i>\n"
+
+#: ../docs/en/tips.cpp:221
+msgid ""
+"<p>...if you have more than one note or controller event at the same time, "
+"you\n"
+"can use the [ and ] keys to flip the stack of events around on the "
+"controller\n"
+"and velocity rulers in order to bring the item you wish to adjust into\n"
+"focus.</p>\n"
+msgstr ""
+"<p>...że jeśli masz więcej nut, lub komunikatów midi typu control w tym "
+"samym czasie, możesz\n"
+"użyć klawiszy [ i ] by tasować stertę komunikatów przyporządkowanych do "
+"wykresów kontrolera i prędkości uderzenia\n"
+"by móc wywołać ten element, który chcesz edytować.</p>\n"
+
+#: ../docs/en/tips.cpp:229
+#, fuzzy
+msgid ""
+"<p>...that the notation view shows you notes using their display duration, "
+"while the\n"
+"matrix allows you to edit their performance duration?<br><br>\n"
+"<i>Be careful with tied notes in the matrix. It is not apparent that they "
+"are\n"
+"tied, and if you split up a pair of tied notes, subsequent notation views "
+"will\n"
+"be confused and unhappy. This is an old bug that has been on our TODO list\n"
+"for years. Sorry about that, folks. Patches welcome.</i>\n"
+"</p>\n"
+msgstr ""
+"<p>Edytor nutowy pozwala zobaczyć długość nut, a edytor \n"
+"pianoli pozwala edytować ich wykonanie.</p><br><br>\n"
+"<i>Bądź ostrożny z legowanymi nutami w edytorze pianoli. To nie przypadkowe, "
+"że są połączone. \n"
+"Jeśli je rozdzielisz, widok nut w edytorze nutowym będzie nieprawidłowy.\n"
+"To jest stary błąd programu i jest na naszej liście do zrobienia od lat. "
+"Przepraszamy za to. Łaty do programu mile widziane.</i>\n"
+
+#: ../docs/en/tips.cpp:240
+#, fuzzy
+msgid ""
+"<p>If you're working with a human performance and you need to insert some "
+"new\n"
+"notes, these new notes will sound for their entire written duration. To "
+"blend\n"
+"these new notes into a human performance, select them, then use <b>Adjust -> "
+"Interpret...</b> \n"
+"from the notation view to interpret any marks and massage their "
+"performance\n"
+"durations to something less mechanical.</p>\n"
+msgstr ""
+"<p>Jeśli pracujesz nad naturalnym wykonaniem i potrzebujesz wstawić kilka "
+"nowych \n"
+"nut, będą one brzmiały przez całą swoją zapisaną długość. By były bardziej "
+"naturalne \n"
+", zaznacz je i użyj<b> Ustaw -> Nuty ->\n"
+"Interpretuj</b> z edytora nutowego, by zinterpretować jakiekolwiek "
+"oznaczenia muzyczne i zmienić wykonanie ich\n"
+"na mniej mechaniczne .</p>\n"
+
+#: ../docs/en/tips.cpp:249
+#, fuzzy
+msgid ""
+"<p>...that Rosegarden can export certain things to LilyPond that it cannot "
+"yet\n"
+"display within its own native interface?<br><br>These new directives can be "
+"inserted\n"
+"via the <b>T</b> text insert tool in the notation view.<br><br>\n"
+"Load the example files\n"
+"<b>lilypond-alternative-endings.rg</b> and <b>lilypond-directives.rg</b> for "
+"a\n"
+"demonstration of how to use the new exportable directives.<br><br>\n"
+"Use <b>File -> Preview with\n"
+"LilyPond</b> to see what they look like on the exported page.<br><br>\n"
+"<i>Be sure to turn on\n"
+"<b>Settings -> Show LilyPond Directives</b> and <b>Show Annotations</b> "
+"within\n"
+"the notation view.</i></p>\n"
+msgstr ""
+"<p>Różany Ogród potrafi teraz eksportować kilka nowych rzeczy do Lilypond, "
+"których sam na razie nie potrafi \n"
+"wyświetlić w swoim interfejsie. Te nowe polecenia mogą być wpisane\n"
+"poprzez <b>T</b> Narzędzie tekstowe w edytorze nutowym<br><br>\n"
+"Otwórz plik przykładowy\n"
+"<b>lilypond-alternative-endings.rg</b> i<b>lilypond-directives.rg</b> for a\n"
+"by zobaczyć jak użyć tych poleceń.<br><br>\n"
+"Użyj <b>Plik -> Podgląd w\n"
+"Lilypond</b> by zobaczyć jak to będzie wyglądać na kartce.<br><br>\n"
+"<i>Upewnij się, że włączone jest \n"
+"<b>Ustawienia -> Pokaż Dyrektywy Lilypond </b> oraz <b>Pokaż Adnotacje</b> "
+"w\n"
+"edytorze nutowym.</i></p>\n"
+
+#: ../docs/en/tips.cpp:264
+#, fuzzy
+msgid ""
+"<p>...that Rosegarden has track parameters allowing you to <b>Create "
+"segments with:</b> certain\n"
+"properties by default?<br><br>You can pre-select the clef, transposition, "
+"colour, and specify\n"
+"the highest and lowest playable notes (notes outside this range display in\n"
+"red by default). Then draw a segment with the pencil, or record one, and "
+"any\n"
+"new segments created on this track will take these properties as segment\n"
+"parameters.<br><br>\n"
+"<i>These parameters do not apply to audio tracks.</i></p>\n"
+msgstr ""
+"<p>Różany Ogród ma teraz parametry dla każdej ze ścieżek Stwórz segment z:"
+"określonymi\n"
+"właściwościami. Możesz określić wcześniej klucz, transpozycję, kolor i "
+"określić skalę instrumentu\n"
+"(nuty poza skalą wyświetlone zostaną \n"
+"domyślnie na czerwono). Potem narysuj segment ołówkiem, albo go nagraj i \n"
+"wszystkie nowe segmenty stworzone na tej ścieżce będą miały te parametry jak "
+"parametry segmentu.<br><br>\n"
+"<i>Te parametry nie dotyczą ścieżek audio.</i></p>\n"
+
+#: ../docs/en/tips.cpp:275
+#, fuzzy
+msgid ""
+"<p>...that Rosegarden has a database of preset parameters describing more "
+"than 300\n"
+"musical instruments from the real world, grouped into several convenient\n"
+"categories?<br><br>Each preset contains a clef, transposition, and playable "
+"range\n"
+"suggestions for both amateur and professional players.<br><br>Click the\n"
+"<b>Load</b> button in the new track parameters box to get started! <i>(If "
+"you\n"
+"do not see a <b>Load</b> button, be sure your parameter panel is set for\n"
+"tabbed mode, rather than stacked mode.)</i> <br><br> <i>(Special thanks to "
+"Magnus\n"
+"Johansson for assembling this extraordinary database.)</i></p>\n"
+msgstr ""
+"<p>Różany Ogród ma bazę danych gotowych ustawień dla ponad 300 \n"
+"instrumentów muzycznych z całego świata, pogrupowanych wedle kilka "
+"wygodnych \n"
+"kategorii. Każde ustawienie zawiera informację o kluczu, transpozycji i "
+"skali \n"
+"dla amatorów i profesjonalistów.<br><br>Kliknij w \n"
+"<b>przycisk Ładuj</b> w oknie parametrów nowej ścieżki by rozpocząć! <i>"
+"(Jeśli nie widzisz\n"
+"<b>przycisku Ładuj</b>, upewnij się, że drzewo panelu ustawień jest "
+"rozwinięte.)</i> <br><br> <i>(Specjalne podziękowania dla Magnusa\n"
+"Johansson'a za dostarczenie tej wyjątkowej bazy danych.)</i></p>\n"
+
+#: ../docs/en/tips.cpp:287
+#, fuzzy
+msgid ""
+"<p>...that when exporting to Lilypond, you can merge tracks that have the "
+"same name onto a single staff?<br><br>For example, if there are three voices "
+"in a single part, write each\n"
+"voice as an independent segment/staff, each on a separate track. Give all\n"
+"three tracks the same name, and select <b>[x] Merge tracks that have the "
+"same\n"
+"name</b> from the options dialog that appears when you export to, or "
+"preview\n"
+"with LilyPond.<br><br>\n"
+"<i>The tracks must have a non-default name for this to work.</i></p>\n"
+msgstr ""
+"<p>Możesz eksportować ścieżki, które mają tę samą nazwę na jedną pięciolinię "
+"w Lilypond.\n"
+"\n"
+"Na przykład, jeśli masz trzy głosy dla jednej partii, zapisz każdy głos\n"
+"jako niezależny segment/pięciolinię, na osobnych ścieżkach. Daj im\n"
+"takie same nazwy, zaznacz <b>[x] Scal ścieżki o tych samych \n"
+" nazwach</b> z okna opcji, które pojawia się kiedy eksportujesz, lub robisz "
+"podgląd w\n"
+" Lilypond.<br><br>\n"
+"<i>Ścieżki nie mogą mieć domyślnych nazw, by to zadziałało.</i></p>\n"
+
+#: ../docs/en/tips.cpp:297
+msgid ""
+" \t \n"
+"<p>...that you can use the mouse wheel to scroll up and down, scroll left "
+"and right, and zoom in and out?<br><br>Just roll the wheel to scroll up or "
+"down. Hold Alt as well to scroll left or right, or hold Ctrl to zoom in and "
+"out.</p> \t \n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:303
+msgid ""
+" \t \n"
+"<p>...that you can time-stretch an audio segment -- stretching or squashing "
+"a\n"
+"sample to a different duration without changing its pitch -- just by\n"
+"dragging its right edge with the Ctrl key pressed?</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:311
+msgid ""
+" \t \n"
+"<p>...that you can add audio to your Rosegarden composition just by dragging "
+"an audio file from your file manager and dropping it on the Rosegarden "
+"segment canvas? (Make sure you drop it on an audio track!)<br><br>You can "
+"also drop audio files from Rosegarden's audio file manager window onto the "
+"segment canvas, and from other programs onto the audio file manager.</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:317
+msgid ""
+" \t \n"
+"<p>...that you can set the tempo to match the duration of an audio segment "
+"if you know it's an exact number of bars or beats long?<br><br>Just select "
+"the audio segment and use <b>Composition -> Tempo and Time Signature -> Set "
+"Tempo to Audio Segment Duration</b>.</p>\n"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:1
+msgid "Feta Pixmaps"
+msgstr "Piksmapy Feta"
+
+#: ../data/fonts/mappings/fonts.cpp:2 ../data/fonts/mappings/fonts.cpp:7
+msgid "GNU Lilypond"
+msgstr "GNU Lilypond"
+
+#: ../data/fonts/mappings/fonts.cpp:3 ../data/fonts/mappings/fonts.cpp:8
+msgid "Copyright (c) 1997--2003 Han-Wen Nienhuys and Jan Nieuwenhuizen"
+msgstr "Prawa Autorskie (c) 1997--2003 Han-Wen Nienhuys and Jan Nieuwenhuizen"
+
+#: ../data/fonts/mappings/fonts.cpp:4 ../data/fonts/mappings/fonts.cpp:9
+#: ../data/fonts/mappings/fonts.cpp:14 ../data/fonts/mappings/fonts.cpp:19
+#: ../data/fonts/mappings/fonts.cpp:24 ../data/fonts/mappings/fonts.cpp:29
+#: ../data/fonts/mappings/fonts.cpp:34 ../data/fonts/mappings/fonts.cpp:39
+#: ../data/fonts/mappings/fonts.cpp:44 ../data/fonts/mappings/fonts.cpp:49
+#: ../data/fonts/mappings/fonts.cpp:54
+msgid "Chris Cannam"
+msgstr "Chris Cannam"
+
+#: ../data/fonts/mappings/fonts.cpp:5 ../data/fonts/mappings/fonts.cpp:40
+msgid "pixmap"
+msgstr "piksmapa"
+
+#: ../data/fonts/mappings/fonts.cpp:6
+msgid "Feta"
+msgstr "Feta"
+
+#: ../data/fonts/mappings/fonts.cpp:10 ../data/fonts/mappings/fonts.cpp:15
+#: ../data/fonts/mappings/fonts.cpp:20 ../data/fonts/mappings/fonts.cpp:25
+#: ../data/fonts/mappings/fonts.cpp:30 ../data/fonts/mappings/fonts.cpp:35
+#: ../data/fonts/mappings/fonts.cpp:45 ../data/fonts/mappings/fonts.cpp:50
+#: ../data/fonts/mappings/fonts.cpp:55
+msgid "scalable"
+msgstr "wektorowe"
+
+#: ../data/fonts/mappings/fonts.cpp:11
+msgid "Fughetta"
+msgstr "Fughetta"
+
+#: ../data/fonts/mappings/fonts.cpp:12
+#, fuzzy
+msgid ""
+"Created by Blake Hodgetts; freely redistributable. See http://www.efn.org/"
+"~bch/aboutfonts.html"
+msgstr ""
+"Stworzone przez Blake'a Hodgetts; podlega nieograniczonej dystrybucji. Wejdź "
+"na http://www.efh.org/~bch/aboutfonts.html"
+
+#: ../data/fonts/mappings/fonts.cpp:13
+msgid "Copyright 1995-1999 Blake Hodgetts"
+msgstr "Prawa Autorskie 1995-1999 Blake Hodgetts"
+
+#: ../data/fonts/mappings/fonts.cpp:16
+msgid "Inkpen"
+msgstr "Inkpen"
+
+#: ../data/fonts/mappings/fonts.cpp:17
+msgid "Inkpen is part of Sibelius, but other fonts may use the same mappings."
+msgstr ""
+"Inkpen jest częścią Sibeliusa, ale inny czcionki mogą używać tej samej mapy "
+"znaków."
+
+#: ../data/fonts/mappings/fonts.cpp:18 ../data/fonts/mappings/fonts.cpp:28
+msgid "Copyright Sibelius Software Ltd"
+msgstr "Prawa Autorskie Sibelius spółka z.o.o"
+
+#: ../data/fonts/mappings/fonts.cpp:21
+msgid "Maestro"
+msgstr "Maestro"
+
+#: ../data/fonts/mappings/fonts.cpp:22
+msgid "Maestro is part of Finale, but other fonts use the same mappings."
+msgstr ""
+"Maestro jest częścią Finale, ale inne czcionki mogą używać tej samej mapy "
+"znaków."
+
+#: ../data/fonts/mappings/fonts.cpp:23 ../data/fonts/mappings/fonts.cpp:33
+msgid "Copyright Coda Inc"
+msgstr "Prawa Autorskie Spółka Coda "
+
+#: ../data/fonts/mappings/fonts.cpp:27
+msgid "Opus is part of Sibelius, but other fonts may use the same mappings."
+msgstr ""
+"Opus jest częścią Sibeliusa, ale inne czcionki mogą używać tej samej mapy "
+"znaków."
+
+#: ../data/fonts/mappings/fonts.cpp:31
+msgid "Petrucci"
+msgstr "Petrucci"
+
+#: ../data/fonts/mappings/fonts.cpp:32
+msgid "Petrucci is part of Finale, but other fonts use the same mappings."
+msgstr ""
+"Petrucci jest częścią Finale, ale inne czcionki mogą używać tej samej mapy "
+"znaków."
+
+#: ../data/fonts/mappings/fonts.cpp:36
+msgid "RG21"
+msgstr "RG21"
+
+#: ../data/fonts/mappings/fonts.cpp:37
+msgid "Rosegarden 2.1"
+msgstr "Różany Ogród 2.1"
+
+#: ../data/fonts/mappings/fonts.cpp:38
+msgid "Copyright (c) 1994--2001 Chris Cannam"
+msgstr "Prawa Autorskie (c) 1994--2001 Chris Cannam"
+
+#: ../data/fonts/mappings/fonts.cpp:41
+msgid "Sonata"
+msgstr "Sonata"
+
+#: ../data/fonts/mappings/fonts.cpp:42
+msgid "Adobe"
+msgstr "Adobe"
+
+#: ../data/fonts/mappings/fonts.cpp:43
+msgid "Copyright Adobe Inc"
+msgstr "Prawa Autorskie Spółka Adobe"
+
+#: ../data/fonts/mappings/fonts.cpp:46
+msgid "Steinberg"
+msgstr "Steinberg"
+
+#: ../data/fonts/mappings/fonts.cpp:47
+msgid "The Steinberg Notation font is part of Cubase."
+msgstr "Czcionka nutowa Steinberg jest częścią Cubase'a."
+
+#: ../data/fonts/mappings/fonts.cpp:48
+msgid "Copyright Steinberg Inc"
+msgstr "Prawa Autorskie Spółka Steinberg"
+
+#: ../data/fonts/mappings/fonts.cpp:51
+msgid "Xinfonia"
+msgstr "Xinfonia"
+
+#: ../data/fonts/mappings/fonts.cpp:52
+msgid "xemo.org"
+msgstr "xemo.org"
+
+#: ../data/fonts/mappings/fonts.cpp:53
+msgid "Copyright 2001-2003 Xemus Software LLC"
+msgstr "Prawa Autorskie 2001-2003 Xemus Software LLC"
+
+#: ../data/styles/styles.cpp:1
+msgid "Classical"
+msgstr "Normalny"
+
+#: ../data/styles/styles.cpp:2
+msgid "Cross"
+msgstr "X-sy"
+
+#: ../data/styles/styles.cpp:3
+msgid "Mensural"
+msgstr "Romby"
+
+#: ../data/styles/styles.cpp:4
+msgid "Triangle"
+msgstr "Trójkąty"
+
+#, fuzzy
+#~ msgid "Set Quick Marker"
+#~ msgstr "Skasuj Znacznik"
+
+#~ msgid ""
+#~ "Finnish translation\n"
+#~ "LilyPond export fixes/improvements"
+#~ msgstr ""
+#~ "Tłumaczenie na fiński\n"
+#~ "Postępy w imporcie/eksporcie Lilypond"
+
+#, fuzzy
+#~ msgid "LilyPond previews not available"
+#~ msgstr "Opcje podglądu lilypond"
+
+#, fuzzy
+#~ msgid "Audio file importer not available"
+#~ msgstr "Bufor zapisu pliku audio"
+
+#~ msgid " Triplet Chord"
+#~ msgstr "Potrójny Akord"
+
+#~ msgid " Chord"
+#~ msgstr "Akord"
+
+#~ msgid " Triplet"
+#~ msgstr "Triola"
+
+#~ msgid "Making grace notes..."
+#~ msgstr "Robienie przed-nutek..."
+
+#~ msgid "Making non-grace notes..."
+#~ msgstr "Robienie nie-przednutek..."
+
+#~ msgid "Marker name "
+#~ msgstr "Nazwa "
+
+#~ msgid "Time Signature font"
+#~ msgstr "Czcionka Metrum"
+
+#~ msgid "&Halve Speed"
+#~ msgstr "&Połowa Prędkości"
+
+#~ msgid "&Double Speed"
+#~ msgstr "P&odwójna Prędkość"
+
+#~ msgid "Halving speed..."
+#~ msgstr "Podwójne spowalnianie..."
+
+#~ msgid "Doubling speed..."
+#~ msgstr "Podwójne przyśpieszanie..."
+
+#~ msgid "Add staff group bracket"
+#~ msgstr "Dodaj klamrę grupy pięciolinii"
+
+#~ msgid "Make subsequent bar lines hidden"
+#~ msgstr "Ukryj kolejne kreski taktowe"
+
+#~ msgid "Make &Grace Notes"
+#~ msgstr "Zrób &Przednutkę"
+
+#~ msgid "Change Te&mpo..."
+#~ msgstr "Dodaj Zmianę T&empa..."
+
+#~ msgid "Insert Fretboard"
+#~ msgstr "Wstaw tabulaturę"
+
+#~ msgid "&Restore Computed Accidentals"
+#~ msgstr "&Przywróć wyliczone znaki chromatyczne"
+
+#~ msgid "LilyPond export/preview options"
+#~ msgstr "Lilypond eksport/podgląd opcje"
+
+#~ msgid "LilyPond 2.6"
+#~ msgstr "Lilypond 2.6"
+
+#~ msgid "LilyPond 2.8"
+#~ msgstr "Lilypond 2.8"
+
+#, fuzzy
+#~ msgid "LilyPond 2.12"
+#~ msgstr "Lilypond 2.2"
+
+#~ msgid "Export Document Properties as \\header block"
+#~ msgstr "Eksportuj Właściwości Dokumentu jako \\nagłówek bloku"
+
+#, fuzzy
+#~ msgid "prime"
+#~ msgstr "Czas"
+
+#, fuzzy
+#~ msgid " and 1 octave"
+#~ msgstr "Oktawę w górę"
+
+#, fuzzy
+#~ msgid " and %1 octaves"
+#~ msgstr "%1 w górę o oktawę"
+
+#, fuzzy
+#~ msgid "Transpose by Interval"
+#~ msgstr "Transpozycja"
+
+#~ msgid "Manage Files Associated with A&udio Segments"
+#~ msgstr "Zarządzaj Plikami &Dźwiękowymi"
+
+#~ msgid "&Add Multiple Tracks..."
+#~ msgstr "&Dodaj Wiele Ścieżek..."
+
+#~ msgid "Split Segments at Time"
+#~ msgstr "Rozdzielenie Segmentów w Pozycji"
+
+#~ msgid "Split Segment at Time"
+#~ msgstr "Rozdzielenie Segmentu w Pozycji"
+
+#~ msgid "Add Multiple Tracks"
+#~ msgstr "Dodaj Wiele Ścieżek"
+
+#~ msgid ""
+#~ "1.2.3 splash screen photo (of Michael's rose garden)\n"
+#~ "new splash screen photo (of Michael McIntyre's\n"
+#~ "instruments along with a rose from the garden of Hassell Arnold Hale, "
+#~ "1916-2006,\n"
+#~ "may he rest in peace)"
+#~ msgstr ""
+#~ "Zdjęcie okna powitalnego 1.2.3 (różanego ogrodu Michael'a)\n"
+#~ "nowe zdjęcie do okna powitalnego (instrumenty Michael'a McIntyre'a z "
+#~ "ogrodu w Hassell Arnold Hale, 1916-2006,\n"
+#~ "niech odpoczywa w pokoju"
+
+#~ msgid "Event List"
+#~ msgstr "Edytor Lista"
+
+#~ msgid "External Editors"
+#~ msgstr "Zezwnętrzne Edytory"
+
+#~ msgid "Enable auto-save"
+#~ msgstr "Zezwól na auto zapis"
+
+#~ msgid "Auto-save"
+#~ msgstr "Auto zapis"
+
+#~ msgid "Show detailed status"
+#~ msgstr "Pokaż szczegółowy status"
+
+#~ msgid "JACK command (including path as necessary)"
+#~ msgstr "polecenie JACK (zawierające konieczną ścieżkę)"
+
+#~ msgid ""
+#~ "Longer buffers usually improve playback quality, but use more memory and "
+#~ "slow response."
+#~ msgstr ""
+#~ "Dłuższe bufory zwykle zapewniają lepszą jakośc odtwarzania, ale zużywają "
+#~ "więcej pamięci i spowalniają odzew."
+
+#~ msgid "Event read-ahead"
+#~ msgstr "Czytanie Komunikatów z wyprzedzeniem"
+
+#~ msgid "Audio mix buffer"
+#~ msgstr "Bufor miksu audio"
+
+#~ msgid "Audio file read buffer"
+#~ msgstr "Bufor odczytu pliku audio"
+
+#~ msgid "Audio file write buffer"
+#~ msgstr "Bufor zapisu pliku audio"
+
+#~ msgid "Per-file limit for cacheable audio files"
+#~ msgstr "Limit na pliku dla podręcznych plików dźwiękowych"
+
+#~ msgid "20 msec"
+#~ msgstr "20 milisek"
+
+#~ msgid "5 sec"
+#~ msgstr "5 sekund"
+
+#~ msgid "per file"
+#~ msgstr "na plik"
+
+#~ msgid "32KB"
+#~ msgstr "32KB"
+
+#~ msgid "32MB"
+#~ msgstr "32MB"
+
+#~ msgid "Audio mix and monitor mode:"
+#~ msgstr "Tryb monitorowania i miksowania audio:"
+
+#~ msgid "Low latency"
+#~ msgstr "Niska latencja"
+
+#~ msgid "Buffered"
+#~ msgstr "Buforowany"
+
+#~ msgid "Create post-fader outputs for audio instruments"
+#~ msgstr "Twórz wyjścia za tłumikami dla instrumentów audio"
+
+#~ msgid "Create post-fader outputs for submasters"
+#~ msgstr "Twórz wyjścia za tłumikami dla szyn audio"
+
+#~ msgid "Record and Mix"
+#~ msgstr "Nagrywaj i Miksuj"
+
+#~ msgid "JACK transport mode"
+#~ msgstr "Tryb JACK transport"
+
+#~ msgid "Sync"
+#~ msgstr "Synchronizacja"
+
+#~ msgid "Synchronisation"
+#~ msgstr "Synchronizacja"
+
+#~ msgid "%1 msec / %2 KB %3"
+#~ msgstr "%1 msek / %2 KB %3"
+
+#~ msgid "%1 msec / %2 MB %3"
+#~ msgstr "%1 msek / %2 MB %3"
+
+#~ msgid "%1 sec / %2 KB %3"
+#~ msgstr "%1 sek / %2 KB %3"
+
+#~ msgid "%1 sec / %2 MB %3"
+#~ msgstr "%1 sek / %2 MB %3"
+
+#~ msgid "%1 msec"
+#~ msgstr "%1 msek"
+
+#~ msgid "%1 sec"
+#~ msgstr "%1 sek"
+
+#~ msgid "%1 KB"
+#~ msgstr "%1 KB"
+
+#~ msgid "%1 MB"
+#~ msgstr "%1 MB"
+
+#~ msgid "Other fonts"
+#~ msgstr "Inne czcionki"
+
+#~ msgid "Rescan available fonts"
+#~ msgstr "Przeskanuj dostępne czcionki"
+
+#~ msgid ""
+#~ "Rosegarden can apply automatic quantization to recorded or imported MIDI "
+#~ "data for notation purposes only. This does not affect playback, and does "
+#~ "not affect editing in any of the views except notation."
+#~ msgstr ""
+#~ "Różany Ogród może automatycznie kwantyzować nagrane, lub importowane "
+#~ "komunikaty MIDI do celów prawidłowej notacji. To nie oddziaływuje "
+#~ "odtwarzania, jak również edycji w innych edytorach opórcz nutowego."
+
+#~ msgid "Sequencer"
+#~ msgstr "Sekwencer"
+
+#~ msgid "Sequencer Settings"
+#~ msgstr "ustawienia Sekwencera"
+
+#~ msgid "Audio auto-fade"
+#~ msgstr "Auto wyciszanie"
+
+#~ msgid "Fade in"
+#~ msgstr "Wzgłaśnianie"
+
+#~ msgid "Fade out"
+#~ msgstr "Wyciszanie"
+
+#~ msgid "Range"
+#~ msgstr "Zakres"
+
+#~ msgid ""
+#~ "_: used internally for spacing\n"
+#~ "High: ----"
+#~ msgstr "używane wewnętrznie dla odstępów<br>Wysoko:----"
+
+#~ msgid "High: ---"
+#~ msgstr "Do: ---"
+
+#~ msgid "Low: ----"
+#~ msgstr "Od:----"
+
+#~ msgid " ms"
+#~ msgstr "ms"
+
+#~ msgid "&Fretboard"
+#~ msgstr "&Tabulatura"
+
+#~ msgid "Restore &Computed Positions"
+#~ msgstr "Przywróć &Wyliczone Pozycje"
+
+#~ msgid ""
+#~ "You encountered an enharmonic resolution bug somewhere during this "
+#~ "operation. You may wish to save a copy of your current composition and "
+#~ "email it to [email protected] for analysis.\n"
+#~ "\n"
+#~ "In the meantime, you will probably need to make manual adjustments to the "
+#~ "file you've just exported."
+#~ msgstr ""
+#~ "Podczas wykonywania tej operacji natrafiłeś na błąd dotyczący enharmonii. "
+#~ "Mógłbyś chcieć zapisać kopię bieżącego utworu i wysłać ją emailem do "
+#~ "zanalizowania do [email protected].\n"
+#~ "\n"
+#~ "Poza tym prawdopodobnie musisz też ręcznie zmienić ustawienia pliku, "
+#~ "który właśnie wyeksportowałeś."
+
+#~ msgid "&Tempo and Time Signature"
+#~ msgstr "&Tempo i Metrum"
+
+#~ msgid "&Split..."
+#~ msgstr "&Rozdziel..."
+
+#~ msgid "&Editor Tools"
+#~ msgstr "Narzędzia &Edycyjne"
+
+#~ msgid "&Beams"
+#~ msgstr "&Belkowanie"
+
+#~ msgid "&Indications"
+#~ msgstr "&Frazowanie"
+
+#~ msgid "Trip&lets and Tuplets"
+#~ msgstr "&Triole, Duole i Inne"
+
+#~ msgid "S&tem Direction"
+#~ msgstr "Kierunek &Chorągiewek"
+
+#~ msgid "&Clear"
+#~ msgstr "&Wyczyść"
+
+#~ msgid "A&dd Alias"
+#~ msgstr "Dodaj pseudonim"
+
+#~ msgid "C&ancel"
+#~ msgstr "&Odrzuć"
+
+#~ msgid "&Ok"
+#~ msgstr "&Akceptuj"
+
+#~ msgid "Toggle &Mode"
+#~ msgstr "Tryb &przełączania"
+
+#~ msgid "Scale"
+#~ msgstr "Skala"
+
+#~ msgid "Modifier"
+#~ msgstr "Modyfikator"
+
+#~ msgid "Suffix"
+#~ msgstr "Symbol akordowy"
+
+#~ msgid "&New"
+#~ msgstr "&Nowe"
+
+#~ msgid "Additivies"
+#~ msgstr "Dodatki"
+
+#~ msgid "Fingering"
+#~ msgstr "Palcowanie"
+
+#~ msgid ""
+#~ "<p>When exporting to LilyPond, you will see extra empty bars if the "
+#~ "Rosegarden\n"
+#~ "composition is longer than the notation it contains. To cure this, "
+#~ "navigate\n"
+#~ "to <b>Composition -> Change Composition Start and End...</b> then set "
+#~ "<b>End\n"
+#~ "Bar</b> to the end of your notation.</p>\n"
+#~ msgstr ""
+#~ "<p>Podczas eksportu do Lilypond, zobaczysz kilka pustych taktów, jeśli "
+#~ "kompozycja z Różanego Ogrodu \n"
+#~ "jest dłuższa niż to co zawierają nuty. By to naprawić, przejdź\n"
+#~ "do <b>Utwór -> Zmień Początek i Koniec Utworu...</b> ustaw <b>Takt "
+#~ "końcowy\n"
+#~ "</b> by zakończyć zapis nutowy.</p>\n"
+
+#~ msgid ""
+#~ "<p>You can use the mouse wheel to scroll up and down, or to scroll left "
+#~ "and right (by holding the Alt key at the same time), or to zoom in and "
+#~ "out (by holding the Control key).</p>\n"
+#~ msgstr ""
+#~ "<p>Możesz używać kółka myszy, by przewijać w górę i w dół, lub w lewo i "
+#~ "prawo, (trzymając klawisz Alt w tym samym czasie), albo powiększać i "
+#~ "zmniejszać (trzymając klawisz Control ).</p>\n"
+
+#~ msgid "LilyPond 2.4"
+#~ msgstr "Lilypond 2.4"
+
+#~ msgid "Paper size to use in \\paper block"
+#~ msgstr "Rozmiar papieru do zastosowania w \\bloku papieru"
+
+#~ msgid "LilyPond font size"
+#~ msgstr "Lilypond rozmiar czcionki"
+
+#~ msgid "Do not export muted tracks"
+#~ msgstr "Nie eksportuj wyciszonych ścieżek"
+
+#~ msgid "Write bar checks at end of measures"
+#~ msgstr "Zapisz sprawdzenia taktów na ich końcach"
+
+#~ msgid "Half Speed"
+#~ msgstr "Połowa Prędkości"
+
+#~ msgid "Double Speed"
+#~ msgstr "Podwójna Prędkość"
+
+#~ msgid " (takes effect only from next restart)"
+#~ msgstr "(zadziała po ponowym uruchomieniu)"
+
+#~ msgid "&Select"
+#~ msgstr "&Zaznacz"
+
+#~ msgid "Snap to 1/64"
+#~ msgstr "Przyciągaj do 1/64"
+
+#~ msgid "Snap to 1/48"
+#~ msgstr "Przyciągaj do 1/48"
+
+#~ msgid "Snap to 1/32"
+#~ msgstr "Przyciągaj do 1/32"
+
+#~ msgid "Snap to 1/24"
+#~ msgstr "Przyciągaj do 1/24"
+
+#~ msgid "Snap to 1/16"
+#~ msgstr "Przyciągaj do 1/16"
+
+#~ msgid "Snap to 1/12"
+#~ msgstr "Przyciągaj do 1/12"
+
+#~ msgid "Snap to 1/8"
+#~ msgstr "Przyciągaj do 1/8"
+
+#~ msgid "Snap to 1/6"
+#~ msgstr "Przyciągaj do 1/6"
+
+#~ msgid "Snap to 1/4"
+#~ msgstr "Przyciągaj do 1/4"
+
+#~ msgid "Snap to &Unit"
+#~ msgstr "Przyciągaj do &Miar Taktów"
+
+#~ msgid "%1 (%2.%3s)"
+#~ msgstr "%1 (%2.%3s)"
+
+#~ msgid "%1 (%2): %3"
+#~ msgstr "%1 (%2): %3"
+
+#~ msgid "Add Fretboard"
+#~ msgstr "Dodaj Tabulaturę"
+
+#~ msgid "Getting sound driver status..."
+#~ msgstr "Uzyskanie stanu sterownika dźwięku..."
+
+#~ msgid "Distribute Audio on &MIDI"
+#~ msgstr "Dystrybuuj Audio na &MIDI"
+
+#~ msgid "Cannot add file %1: %2"
+#~ msgstr "Nie można dodać pliku %1: %2"
+
+#~ msgid "Enable"
+#~ msgstr "Zezwól"
+
+#~ msgid "from:"
+#~ msgstr "od:"
+
+#~ msgid "to:"
+#~ msgstr "do:"
+
+#~ msgid "unlimited"
+#~ msgstr "nieograniczony"
+
+#~ msgid "Number:"
+#~ msgstr "Numer:"
+
+#~ msgid "Value:"
+#~ msgstr "Wartość:"
+
+#~ msgid "Wheel Events"
+#~ msgstr "Komunikaty Koła"
+
+#~ msgid "Amount:"
+#~ msgstr "Ilość:"
+
+#~ msgid "Pitch from"
+#~ msgstr "Dźwięk od"
+
+#~ msgid "Pitch to"
+#~ msgstr "Dźwięk do"
+
+#~ msgid "High: %1"
+#~ msgstr "Do: %1"
+
+#~ msgid "[+]"
+#~ msgstr "[+]"
+
+#~ msgid "&Velocity"
+#~ msgstr "&Prędkość Uderzenia"
diff --git a/po/rosegarden.pot b/po/rosegarden.pot
new file mode 100644
index 0000000..f54243b
--- /dev/null
+++ b/po/rosegarden.pot
@@ -0,0 +1,10794 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR Free Software Foundation, Inc.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"POT-Creation-Date: 2008-04-24 18:19-0400\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <[email protected]>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=CHARSET\n"
+"Content-Transfer-Encoding: ENCODING\n"
+
+#: ../src/gui/dialogs/RescaleDialog.cpp:51 rc.cpp:192 rc.cpp:312
+#, no-c-format
+msgid "Rescale"
+msgstr ""
+
+#: ../src/gui/dialogs/RescaleDialog.cpp:56
+msgid "Duration of selection"
+msgstr ""
+
+#: ../src/gui/dialogs/RescaleDialog.cpp:62
+msgid "Adjust times of following events accordingly"
+msgstr ""
+
+#: ../src/gui/dialogs/PitchDialog.cpp:45
+#: ../src/gui/dialogs/RescaleDialog.cpp:72
+#: ../src/gui/dialogs/TimeDialog.cpp:51 ../src/gui/dialogs/TimeDialog.cpp:68
+#: ../src/gui/studio/BankEditorDialog.cpp:109
+msgid "Reset"
+msgstr ""
+
+#: ../src/commands/segment/SegmentSplitByPitchCommand.cpp:46
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:46
+msgid "Split by Pitch"
+msgstr ""
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:54
+msgid "Starting split pitch"
+msgstr ""
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:57
+msgid "Range up and down to follow music"
+msgstr ""
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:63
+msgid "Duplicate non-note events"
+msgstr ""
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:66
+msgid "Clef handling:"
+msgstr ""
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:69
+msgid "Leave clefs alone"
+msgstr ""
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:70
+msgid "Guess new clefs"
+msgstr ""
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:71
+msgid "Use treble and bass clefs"
+msgstr ""
+
+#: ../src/gui/dialogs/DocumentConfigureDialog.cpp:64
+msgid "Document Properties"
+msgstr ""
+
+#: ../src/gui/dialogs/MakeOrnamentDialog.cpp:45
+#: ../src/gui/editors/notation/NotationView.cpp:6048
+msgid "Make Ornament"
+msgstr ""
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:183
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:179
+#: ../src/gui/dialogs/EventEditDialog.cpp:128
+#: ../src/gui/dialogs/MakeOrnamentDialog.cpp:49
+#: ../src/gui/studio/DeviceEditorDialog.cpp:74
+#: ../src/gui/studio/NameSetEditor.cpp:72
+#: ../src/gui/widgets/ColourTable.cpp:51
+msgid "Name"
+msgstr ""
+
+#: ../src/gui/dialogs/MakeOrnamentDialog.cpp:51
+msgid ""
+"The name is used to identify both the ornament\n"
+"and the triggered segment that stores\n"
+"the ornament's notes."
+msgstr ""
+
+#: ../src/gui/dialogs/MakeOrnamentDialog.cpp:54
+msgid "Name: "
+msgstr ""
+
+#: ../src/gui/dialogs/MakeOrnamentDialog.cpp:57
+#: ../src/gui/editors/eventlist/EventView.cpp:717
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:92
+msgid "Base pitch"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:57
+#: ../src/gui/editors/eventlist/EventView.cpp:140
+msgid "Text"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:66
+msgid "Specification"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:68
+msgid "Preview"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:72
+msgid "Text: "
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:79
+msgid "Style: "
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:90
+msgid "Dynamic"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:93
+msgid "Direction"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:96
+msgid "Local Direction"
+msgstr ""
+
+#: ../src/gui/dialogs/TempoDialog.cpp:63
+#: ../src/gui/dialogs/TextEventDialog.cpp:99
+#: ../src/gui/editors/tempo/TempoView.cpp:91
+msgid "Tempo"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:102
+msgid "Local Tempo"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:105
+msgid "Lyric"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:108
+#: ../src/gui/editors/notation/NotationView.cpp:4242
+msgid "Chord"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:111
+msgid "Annotation"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:114
+msgid "LilyPond Directive"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:138
+msgid "Verse: "
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:148
+msgid "Dynamic: "
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:152
+msgid "ppp"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:153
+msgid "pp"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:154
+msgid "p"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:155
+msgid "mp"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:156
+msgid "mf"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:157
+msgid "f"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:158
+msgid "ff"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:159
+msgid "fff"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:160
+msgid "rfz"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:161
+msgid "sf"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:165
+msgid "Direction: "
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:174
+msgid " ,"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:175
+msgid "D.C. al Fine"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:176
+msgid "D.S. al Fine"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:177
+msgid "Fine"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:178
+msgid "D.S. al Coda"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:179
+msgid "to Coda"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:180
+msgid "Coda"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:184
+msgid "Local Direction: "
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:188
+msgid "accel."
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:189
+msgid "ritard."
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:190
+msgid "ralletando"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:191
+msgid "a tempo"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:192
+msgid "legato"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:193
+msgid "simile"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:194
+msgid "pizz."
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:195
+msgid "arco"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:196
+msgid "non vib."
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:197
+msgid "sul pont."
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:198
+#: ../src/gui/dialogs/TextEventDialog.cpp:200
+msgid "sul tasto"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:199
+msgid "con legno"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:201
+msgid "sul G"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:202
+msgid "ordinario"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:203
+msgid "Muta in "
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:204
+msgid "volti subito "
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:205
+msgid "soli"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:206
+msgid "div."
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:210
+msgid "Tempo: "
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:214
+#: ../src/gui/dialogs/TextEventDialog.cpp:238
+msgid "Grave"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:215
+#: ../src/gui/dialogs/TextEventDialog.cpp:239
+msgid "Adagio"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:216
+#: ../src/gui/dialogs/TextEventDialog.cpp:240
+msgid "Largo"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:217
+#: ../src/gui/dialogs/TextEventDialog.cpp:241
+msgid "Lento"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:218
+#: ../src/gui/dialogs/TextEventDialog.cpp:242
+msgid "Andante"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:219
+#: ../src/gui/dialogs/TextEventDialog.cpp:243
+msgid "Moderato"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:220
+#: ../src/gui/dialogs/TextEventDialog.cpp:244
+msgid "Allegretto"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:221
+#: ../src/gui/dialogs/TextEventDialog.cpp:245
+msgid "Allegro"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:222
+#: ../src/gui/dialogs/TextEventDialog.cpp:246
+msgid "Vivace"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:223
+#: ../src/gui/dialogs/TextEventDialog.cpp:247
+msgid "Presto"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:224
+#: ../src/gui/dialogs/TextEventDialog.cpp:248
+msgid "Prestissimo"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:225
+#: ../src/gui/dialogs/TextEventDialog.cpp:249
+msgid "Maestoso"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:226
+#: ../src/gui/dialogs/TextEventDialog.cpp:250
+msgid "Sostenuto"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:227
+#: ../src/gui/dialogs/TextEventDialog.cpp:251
+msgid "Tempo Primo"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:234
+msgid "Local Tempo: "
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:255
+msgid "Directive: "
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:312
+msgid "Example"
+msgstr ""
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:65
+msgid "Event Filter"
+msgstr ""
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:86
+msgid "Note Events"
+msgstr ""
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:90
+msgid "lowest:"
+msgstr ""
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:93
+msgid "highest:"
+msgstr ""
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:96
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:141
+#: ../src/gui/widgets/PitchChooser.cpp:53
+msgid "Pitch:"
+msgstr ""
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:99
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:163
+msgid "Velocity:"
+msgstr ""
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:102
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:129
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:257
+msgid "Duration:"
+msgstr ""
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:107
+#: ../src/gui/dialogs/EventFilterDialog.cpp:114
+#: ../src/gui/dialogs/EventFilterDialog.cpp:121
+msgid "include"
+msgstr ""
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:108
+#: ../src/gui/dialogs/EventFilterDialog.cpp:115
+#: ../src/gui/dialogs/EventFilterDialog.cpp:122
+msgid "exclude"
+msgstr ""
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:136
+#: ../src/gui/dialogs/EventFilterDialog.cpp:155
+#: ../src/gui/editors/eventlist/EventView.cpp:172
+#: ../src/gui/editors/eventlist/EventView.cpp:179
+#: ../src/gui/editors/eventlist/EventView.cpp:186
+msgid "edit"
+msgstr ""
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:141
+#: ../src/gui/dialogs/EventFilterDialog.cpp:157
+msgid "choose a pitch using a staff"
+msgstr ""
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:182
+#: ../src/gui/dialogs/EventFilterDialog.cpp:188
+msgid "longest"
+msgstr ""
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:200
+msgid "Include all"
+msgstr ""
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:203
+msgid "Include entire range of values"
+msgstr ""
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:206
+msgid "Exclude all"
+msgstr ""
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:209
+msgid "Exclude entire range of values"
+msgstr ""
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:233
+#: ../src/gui/dialogs/EventFilterDialog.cpp:234
+msgid "shortest"
+msgstr ""
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:333
+msgid "Lowest pitch"
+msgstr ""
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:343
+msgid "Highest pitch"
+msgstr ""
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:56
+#: ../src/gui/editors/notation/NotationView.cpp:1619
+#: ../src/gui/editors/notation/NotationView.cpp:6088
+msgid "Use Ornament"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:260
+#: ../src/gui/configuration/NotationConfigurationPage.h:64
+#: ../src/gui/configuration/NotationConfigurationPage.h:65
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:63
+msgid "Notation"
+msgstr ""
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:68
+msgid "Display as: "
+msgstr ""
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:84
+msgid "Trill"
+msgstr ""
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:84
+msgid "Trill with line"
+msgstr ""
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:84
+msgid "Trill line only"
+msgstr ""
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:85
+msgid "Turn"
+msgstr ""
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:85
+msgid "Mordent"
+msgstr ""
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:85
+msgid "Inverted mordent"
+msgstr ""
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:86
+msgid "Long mordent"
+msgstr ""
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:86
+msgid "Long inverted mordent"
+msgstr ""
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:94
+msgid "Text mark"
+msgstr ""
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:98
+msgid " Text: "
+msgstr ""
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:104
+msgid "Performance"
+msgstr ""
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:109
+msgid "Perform using triggered segment: "
+msgstr ""
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:75
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:123
+msgid "Perform with timing: "
+msgstr ""
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:81
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:129
+msgid "As stored"
+msgstr ""
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:82
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:130
+msgid "Truncate if longer than note"
+msgstr ""
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:83
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:131
+msgid "End at same time as note"
+msgstr ""
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:84
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:132
+msgid "Stretch or squash segment to note duration"
+msgstr ""
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:86
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:134
+msgid "Adjust pitch to note"
+msgstr ""
+
+#: ../src/gui/dialogs/PitchPickerDialog.cpp:40
+msgid "Pitch Selector"
+msgstr ""
+
+#: ../src/gui/dialogs/BeatsBarsDialog.cpp:44
+msgid "Audio Segment Duration"
+msgstr ""
+
+#: ../src/gui/dialogs/BeatsBarsDialog.cpp:50
+msgid "The selected audio segment contains:"
+msgstr ""
+
+#: ../src/gui/dialogs/BeatsBarsDialog.cpp:59
+msgid "beat(s)"
+msgstr ""
+
+#: ../src/gui/dialogs/BeatsBarsDialog.cpp:60
+msgid "bar(s)"
+msgstr ""
+
+#: ../src/gui/dialogs/TupletDialog.cpp:51
+msgid "Tuplet"
+msgstr ""
+
+#: ../src/gui/dialogs/TupletDialog.cpp:58
+msgid "New timing for tuplet group"
+msgstr ""
+
+#: ../src/gui/dialogs/TupletDialog.cpp:76
+msgid "Play "
+msgstr ""
+
+#: ../src/gui/dialogs/TupletDialog.cpp:98
+msgid "in the time of "
+msgstr ""
+
+#: ../src/gui/dialogs/TupletDialog.cpp:104
+msgid "Timing is already correct: update display only"
+msgstr ""
+
+#: ../src/gui/dialogs/TupletDialog.cpp:114
+msgid "Timing calculations"
+msgstr ""
+
+#: ../src/gui/dialogs/TupletDialog.cpp:120
+msgid "Selected region:"
+msgstr ""
+
+#: ../src/gui/dialogs/TupletDialog.cpp:129
+msgid "Group with current timing:"
+msgstr ""
+
+#: ../src/gui/dialogs/TupletDialog.cpp:135
+msgid "Group with new timing:"
+msgstr ""
+
+#: ../src/gui/dialogs/TupletDialog.cpp:141
+msgid "Gap created by timing change:"
+msgstr ""
+
+#: ../src/gui/dialogs/TupletDialog.cpp:149
+msgid "Unchanged at end of selection:"
+msgstr ""
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:63 rc.cpp:372
+#, no-c-format
+msgid "Metronome"
+msgstr ""
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:77
+msgid "Metronome Instrument"
+msgstr ""
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:82
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:150
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:183
+#: ../src/gui/studio/DeviceEditorDialog.cpp:73
+#: ../src/gui/studio/DeviceManagerDialog.cpp:105
+#: ../src/gui/studio/DeviceManagerDialog.cpp:163
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:66
+msgid "Device"
+msgstr ""
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:101
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:89
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:215
+#: ../src/gui/studio/DeviceEditorDialog.cpp:195
+#: ../src/gui/studio/DeviceEditorDialog.cpp:218
+#: ../src/gui/studio/DeviceEditorDialog.cpp:230
+#: ../src/gui/studio/DeviceManagerDialog.cpp:196
+#: ../src/gui/studio/DeviceManagerDialog.cpp:440
+#: ../src/gui/studio/DeviceManagerDialog.cpp:452
+msgid "No connection"
+msgstr ""
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:112
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:111
+#: ../src/gui/editors/parameters/InstrumentParameterBox.cpp:53
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:1209
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:159
+#: ../src/gui/general/PresetHandlerDialog.cpp:92
+#: ../src/gui/studio/MidiMixerWindow.cpp:204
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:67
+msgid "Instrument"
+msgstr ""
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:118
+msgid "Beats"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:184
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:123
+msgid "Resolution"
+msgstr ""
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:309
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:139
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:205
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:125
+#: ../src/gui/editors/matrix/MatrixView.cpp:2132
+#: ../src/gui/editors/notation/NotationView.cpp:1582
+#: ../src/gui/widgets/QuantizeParameters.cpp:128
+#: ../src/gui/widgets/QuantizeParameters.cpp:301
+msgid "None"
+msgstr ""
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:126
+msgid "Bars only"
+msgstr ""
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:127
+msgid "Bars and beats"
+msgstr ""
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:128
+msgid "Bars, beats, and divisions"
+msgstr ""
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:132
+msgid "Bar velocity"
+msgstr ""
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:139
+msgid "Beat velocity"
+msgstr ""
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:146
+msgid "Sub-beat velocity"
+msgstr ""
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:155
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:324
+msgid "Pitch"
+msgstr ""
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:160
+msgid "for Bar"
+msgstr ""
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:161
+msgid "for Beat"
+msgstr ""
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:162
+msgid "for Sub-beat"
+msgstr ""
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:166
+msgid "Metronome Activated"
+msgstr ""
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:167
+msgid "Playing"
+msgstr ""
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:168
+msgid "Recording"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:46
+msgid "Choose Text Encoding"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:50
+msgid ""
+"\n"
+"This file contains text in an unknown language encoding.\n"
+"\n"
+"Please select one of the following estimated text encodings\n"
+"for use with the text in this file:\n"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:61
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:77
+msgid "Japanese Shift-JIS"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:62
+msgid "Unicode variable-width"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:63
+msgid "Western Europe"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:64
+msgid "Western Europe + Euro"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:65
+msgid "Eastern Europe"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:66
+msgid "Southern Europe"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:67
+msgid "Northern Europe"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:68
+msgid "Cyrillic"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:69
+msgid "Arabic"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:70
+msgid "Greek"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:71
+msgid "Hebrew"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:72
+msgid "Turkish"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:73
+msgid "Nordic"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:74
+msgid "Thai"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:75
+msgid "Baltic"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:76
+msgid "Celtic"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:78
+msgid "Traditional Chinese"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:79
+msgid "Simplified Chinese"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:80
+msgid "Russian"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:81
+msgid "Ukrainian"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:82
+msgid "Tamil"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:117
+#, c-format
+msgid "Microsoft Code Page %1"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:123
+#: ../src/gui/editors/matrix/MatrixView.cpp:1490
+msgid "%1 (%2)"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:142
+msgid ""
+"\n"
+"Example text from file:"
+msgstr ""
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:59
+#: ../src/gui/editors/tempo/TempoView.cpp:92
+msgid "Time Signature"
+msgstr ""
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:82
+msgid "Time signature"
+msgstr ""
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:116
+msgid "Time where signature takes effect"
+msgstr ""
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:83
+#: ../src/gui/dialogs/TempoDialog.cpp:128
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:129
+#: ../src/gui/general/PresetHandlerDialog.cpp:101
+msgid "Scope"
+msgstr ""
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:141
+#, c-format
+msgid "Insertion point is at start of measure %1."
+msgstr ""
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:145
+#, c-format
+msgid "Insertion point is in the middle of measure %1."
+msgstr ""
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:150
+msgid "Insertion point is at start of composition."
+msgstr ""
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:155
+msgid "Start measure %1 here"
+msgstr ""
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:159
+#, c-format
+msgid "Change time from start of measure %1"
+msgstr ""
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:166
+#, c-format
+msgid "Time change will take effect at the start of measure %1."
+msgstr ""
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:176
+msgid "Hide the time signature"
+msgstr ""
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:181
+msgid "Hide the affected bar lines"
+msgstr ""
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:186
+msgid "Show as common time"
+msgstr ""
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:191
+msgid "Correct the durations of following measures"
+msgstr ""
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:280
+msgid "Display as common time"
+msgstr ""
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:284
+msgid "Display as cut common time"
+msgstr ""
+
+#: ../src/gui/dialogs/ConfigureDialog.cpp:66
+msgid "Configure Rosegarden"
+msgstr ""
+
+#: ../src/gui/dialogs/MarkerModifyDialog.cpp:53
+#: ../src/gui/dialogs/MarkerModifyDialog.cpp:61
+msgid "Edit Marker"
+msgstr ""
+
+#: ../src/gui/dialogs/MarkerModifyDialog.cpp:78
+msgid "Marker Time"
+msgstr ""
+
+#: ../src/gui/dialogs/MarkerModifyDialog.cpp:94
+msgid "Marker Properties"
+msgstr ""
+
+#: ../src/gui/dialogs/MarkerModifyDialog.cpp:100
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:554
+msgid "Text:"
+msgstr ""
+
+#: ../src/gui/dialogs/MarkerModifyDialog.cpp:104
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:85
+msgid "Description:"
+msgstr ""
+
+#: ../src/gui/dialogs/FileMergeDialog.cpp:46
+msgid "Merge File"
+msgstr ""
+
+#: ../src/gui/dialogs/FileMergeDialog.cpp:53
+msgid "Merge new file "
+msgstr ""
+
+#: ../src/gui/dialogs/FileMergeDialog.cpp:56
+msgid "At start of existing composition"
+msgstr ""
+
+#: ../src/gui/dialogs/FileMergeDialog.cpp:57
+msgid "From end of existing composition"
+msgstr ""
+
+#: ../src/gui/dialogs/FileMergeDialog.cpp:61
+msgid "The file has different time signatures or tempos."
+msgstr ""
+
+#: ../src/gui/dialogs/FileMergeDialog.cpp:62
+msgid "Import these as well"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:171
+#: ../src/gui/dialogs/ShowSequencerStatusDialog.cpp:44
+msgid "Sequencer status"
+msgstr ""
+
+#: ../src/gui/dialogs/ShowSequencerStatusDialog.cpp:48
+msgid "Sequencer status:"
+msgstr ""
+
+#: ../src/gui/dialogs/ShowSequencerStatusDialog.cpp:50
+msgid "Status not available."
+msgstr ""
+
+#: ../src/gui/dialogs/ShowSequencerStatusDialog.cpp:57
+msgid "Sequencer is not running or is not responding."
+msgstr ""
+
+#: ../src/gui/dialogs/ShowSequencerStatusDialog.cpp:64
+msgid "Sequencer is not returning a valid status report."
+msgstr ""
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:46
+msgid "Add Tracks"
+msgstr ""
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:54
+msgid "How many tracks do you want to add?"
+msgstr ""
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:62
+msgid "Add tracks"
+msgstr ""
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:64
+msgid "At the top"
+msgstr ""
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:65
+msgid "Above the current selected track"
+msgstr ""
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:66
+msgid "Below the current selected track"
+msgstr ""
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:67
+msgid "At the bottom"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:75
+msgid "Event Properties"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:81
+msgid "Event type:"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:117
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:251
+#: ../src/gui/editors/segment/MarkerEditor.cpp:97
+msgid "Absolute time:"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:156
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:323
+msgid "Controller name:"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:157
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:530
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:562
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:563
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:602
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:631
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:267
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:269
+#: ../src/gui/editors/segment/MarkerEditor.cpp:279
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:272
+#: ../src/gui/studio/AudioMixerWindow.cpp:388
+#: ../src/gui/studio/AudioMixerWindow.cpp:519
+#: ../src/gui/studio/AudioMixerWindow.cpp:683
+#: ../src/gui/studio/AudioMixerWindow.cpp:722
+#: ../src/gui/studio/AudioMixerWindow.cpp:904
+#: ../src/gui/studio/SynthPluginManagerDialog.cpp:121
+msgid "<none>"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:174
+msgid "Meta string:"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:179
+msgid "Load data"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:181
+msgid "Save data"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:192
+msgid "Notation Properties"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:198
+msgid "Lock to changes in performed values"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:205
+msgid "Notation time:"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:217
+msgid "Notation duration:"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:283
+msgid "Note pitch:"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:291
+msgid "Note velocity:"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:317
+msgid "Controller number:"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:326
+msgid "Controller value:"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:354
+msgid "Key pitch:"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:362
+msgid "Key pressure:"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:390
+msgid "Channel pressure:"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:418
+msgid "Program change:"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:461
+msgid "Data length:"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:462
+msgid "Data:"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:480
+msgid "Pitchbend MSB:"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:488
+msgid "Pitchbend LSB:"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:523
+msgid "Indication:"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:553
+msgid "Text type:"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:596
+msgid "Clef type:"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:625
+msgid "Key name:"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:674
+msgid "Unsupported event type:"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:931
+msgid "Edit Event Time"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:943
+msgid "Edit Event Notation Time"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:955
+msgid "Edit Duration"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:968
+msgid "Edit Notation Duration"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:981
+msgid "Edit Pitch"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:991
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:1016
+msgid "*.syx|System exclusive files (*.syx)"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:992
+msgid "Load System Exclusive data in File"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:1017
+msgid "Save System Exclusive data to..."
+msgstr ""
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:46
+msgid "Locate audio file"
+msgstr ""
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:50
+msgid "&Skip"
+msgstr ""
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:51
+msgid "Skip &All"
+msgstr ""
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:52
+msgid "&Locate"
+msgstr ""
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:57
+msgid ""
+"Can't find file \"%1\".\n"
+"Would you like to try and locate this file or skip it?"
+msgstr ""
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:71
+msgid ""
+"%1|Requested file (%2)\n"
+"*.wav|WAV files (*.wav)"
+msgstr ""
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:74
+msgid "Select an Audio File"
+msgstr ""
+
+#: ../src/gui/dialogs/ClefDialog.cpp:53 ../src/gui/dialogs/ClefDialog.cpp:62
+#: ../src/gui/dialogs/ClefDialog.cpp:79 ../src/gui/dialogs/ClefDialog.cpp:90
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:278
+msgid "Clef"
+msgstr ""
+
+#: ../src/gui/dialogs/ClefDialog.cpp:65
+msgid "Existing notes following clef change"
+msgstr ""
+
+#: ../src/gui/dialogs/ClefDialog.cpp:71
+msgid "Lower clef"
+msgstr ""
+
+#: ../src/gui/dialogs/ClefDialog.cpp:77
+msgid "Up an Octave"
+msgstr ""
+
+#: ../src/gui/dialogs/ClefDialog.cpp:84
+msgid "Down an Octave"
+msgstr ""
+
+#: ../src/gui/dialogs/ClefDialog.cpp:88
+msgid "Higher clef"
+msgstr ""
+
+#: ../src/gui/dialogs/ClefDialog.cpp:96
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:152
+msgid "Maintain current pitches"
+msgstr ""
+
+#: ../src/gui/dialogs/ClefDialog.cpp:99
+msgid "Transpose into appropriate octave"
+msgstr ""
+
+#: ../src/gui/dialogs/ClefDialog.cpp:231
+msgid "%1 down an octave"
+msgstr ""
+
+#: ../src/gui/dialogs/ClefDialog.cpp:234
+msgid "%1 down two octaves"
+msgstr ""
+
+#: ../src/gui/dialogs/ClefDialog.cpp:237
+msgid "%1 up an octave"
+msgstr ""
+
+#: ../src/gui/dialogs/ClefDialog.cpp:240
+msgid "%1 up two octaves"
+msgstr ""
+
+#: ../src/gui/dialogs/ClefDialog.cpp:249
+msgid "Treble"
+msgstr ""
+
+#: ../src/gui/dialogs/ClefDialog.cpp:251
+msgid "French violin"
+msgstr ""
+
+#: ../src/gui/dialogs/ClefDialog.cpp:253
+msgid "Soprano"
+msgstr ""
+
+#: ../src/gui/dialogs/ClefDialog.cpp:255
+msgid "Mezzo-soprano"
+msgstr ""
+
+#: ../src/gui/dialogs/ClefDialog.cpp:257
+msgid "Alto"
+msgstr ""
+
+#: ../src/gui/dialogs/ClefDialog.cpp:259
+msgid "Tenor"
+msgstr ""
+
+#: ../src/gui/dialogs/ClefDialog.cpp:261
+msgid "C-baritone"
+msgstr ""
+
+#: ../src/gui/dialogs/ClefDialog.cpp:263
+msgid "F-baritone"
+msgstr ""
+
+#: ../src/gui/dialogs/ClefDialog.cpp:265
+msgid "Bass"
+msgstr ""
+
+#: ../src/gui/dialogs/ClefDialog.cpp:267
+msgid "Sub-bass"
+msgstr ""
+
+#: ../src/gui/dialogs/CountdownDialog.cpp:52
+msgid "Recording..."
+msgstr ""
+
+#: ../src/gui/dialogs/CountdownDialog.cpp:60
+msgid "Recording time remaining: "
+msgstr ""
+
+#: ../src/gui/dialogs/CountdownDialog.cpp:120
+msgid "Just how big is your hard disk?"
+msgstr ""
+
+#: ../src/gui/dialogs/CountdownDialog.cpp:154
+msgid "Recording beyond end of composition: "
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:52
+msgid "Specify Interval"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:58
+msgid "Reference note:"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:59
+msgid "Target note:"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:68
+#: ../src/gui/dialogs/IntervalDialog.cpp:315
+msgid "a perfect unison"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:76
+msgid "Effect on Key"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:77
+msgid "Transpose within key"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:79
+msgid "Change key for selection"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:89
+msgid ""
+"Adjust segment transposition in opposite direction (maintain audible pitch)"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:190
+#: ../src/gui/dialogs/IntervalDialog.cpp:220
+msgid "a diminished"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:192
+#: ../src/gui/dialogs/IntervalDialog.cpp:222
+msgid "an augmented"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:194
+#: ../src/gui/dialogs/IntervalDialog.cpp:224
+msgid "a doubly diminished"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:196
+#: ../src/gui/dialogs/IntervalDialog.cpp:226
+msgid "a doubly augmented"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:198
+#: ../src/gui/dialogs/IntervalDialog.cpp:228
+msgid "a triply diminished"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:200
+#: ../src/gui/dialogs/IntervalDialog.cpp:230
+msgid "a triply augmented"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:202
+msgid "a quadruply diminished"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:204
+#: ../src/gui/dialogs/IntervalDialog.cpp:232
+msgid "a quadruply augmented"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:206
+#: ../src/gui/dialogs/IntervalDialog.cpp:234
+msgid "a perfect"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:208
+#: ../src/gui/dialogs/IntervalDialog.cpp:236
+msgid "an (unknown, %1)"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:216
+msgid "a minor"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:218
+msgid "a major"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:239
+msgid "an (unknown)"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:248
+#: ../src/gui/dialogs/IntervalDialog.cpp:251
+msgid "%1 octave"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:254
+msgid "%1 unison"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:258
+msgid "%1 second"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:261
+msgid "%1 third"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:264
+msgid "%1 fourth"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:267
+msgid "%1 fifth"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:270
+msgid "%1 sixth"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:273
+msgid "%1 seventh"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:276
+#: ../src/gui/studio/DeviceManagerDialog.cpp:329
+#: ../src/gui/studio/DeviceManagerDialog.cpp:363
+#, c-format
+msgid "%1"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:287
+msgid ""
+"_n: up 1 octave and %1\n"
+"up %n octaves and %1"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:291
+#, c-format
+msgid ""
+"_n: up 1 octave\n"
+"up %n octaves"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:295
+#, c-format
+msgid "up %1"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:303
+msgid ""
+"_n: down 1 octave and %1\n"
+"down %n octaves and %1"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:307
+#, c-format
+msgid ""
+"_n: down 1 octave\n"
+"down %n octaves"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:311
+#, c-format
+msgid "down %1"
+msgstr ""
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:81
+msgid "Intrinsics"
+msgstr ""
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:85
+msgid "Event type: "
+msgstr ""
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:91
+msgid "Absolute time: "
+msgstr ""
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:101
+msgid "Duration: "
+msgstr ""
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:114
+msgid "Sub-ordering: "
+msgstr ""
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:125
+msgid "Persistent properties"
+msgstr ""
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:169
+#: ../src/gui/dialogs/EventEditDialog.cpp:133
+#: ../src/gui/studio/BankEditorDialog.cpp:129
+#: ../src/gui/studio/DeviceEditorDialog.cpp:75
+msgid "Type"
+msgstr ""
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:184
+#: ../src/gui/dialogs/EventEditDialog.cpp:135
+#: ../src/gui/dialogs/EventParameterDialog.cpp:89
+#: ../src/gui/dialogs/EventParameterDialog.cpp:93
+#: ../src/gui/dialogs/EventParameterDialog.cpp:115
+msgid "Value"
+msgstr ""
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:155
+msgid "Non-persistent properties"
+msgstr ""
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:156
+msgid "These are cached values, lost if the event is modified."
+msgstr ""
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:170
+msgid "Name "
+msgstr ""
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:172
+msgid "Type "
+msgstr ""
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:174
+msgid "Value "
+msgstr ""
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:188
+msgid "Make persistent"
+msgstr ""
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:292
+msgid "Delete this property"
+msgstr ""
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:433
+msgid ""
+"Are you sure you want to delete the \"%1\" property?\n"
+"\n"
+"Removing necessary properties may cause unexpected behavior."
+msgstr ""
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:436
+#: ../src/gui/dialogs/EventEditDialog.cpp:469
+msgid "Edit Event"
+msgstr ""
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:465
+msgid ""
+"Are you sure you want to make the \"%1\" property persistent?\n"
+"\n"
+"This could cause problems if it overrides a different computed value later "
+"on."
+msgstr ""
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:470
+msgid "Make &Persistent"
+msgstr ""
+
+#: ../src/gui/dialogs/PasteNotationDialog.cpp:52
+msgid "Paste type"
+msgstr ""
+
+#: ../src/gui/dialogs/PasteNotationDialog.cpp:72
+msgid "Make this the default paste type"
+msgstr ""
+
+#: ../src/gui/dialogs/LyricEditDialog.cpp:53
+msgid "Edit Lyrics"
+msgstr ""
+
+#: ../src/gui/dialogs/LyricEditDialog.cpp:62
+msgid "Lyrics for this segment"
+msgstr ""
+
+#: ../src/gui/dialogs/LyricEditDialog.cpp:70
+msgid "Add Verse"
+msgstr ""
+
+#: ../src/gui/dialogs/LyricEditDialog.cpp:84
+#: ../src/gui/dialogs/LyricEditDialog.cpp:106
+#, c-format
+msgid "Verse %1"
+msgstr ""
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:59
+msgid "Import from Device..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2163
+#: ../src/gui/application/RosegardenGUIApp.cpp:2229
+#: ../src/gui/application/RosegardenGUIApp.cpp:7780
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:87
+#: ../src/sound/AudioFileManager.cpp:664
+#, c-format
+msgid "Cannot download file %1"
+msgstr ""
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:99
+#, c-format
+msgid "Cannot open file %1"
+msgstr ""
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:106
+#, c-format
+msgid "No devices found in file %1"
+msgstr ""
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:113
+msgid "Source device"
+msgstr ""
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:118
+msgid "Import from: "
+msgstr ""
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:140
+#: ../src/gui/studio/DeviceEditorDialog.cpp:148
+#, c-format
+msgid "Device %1"
+msgstr ""
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:155
+msgid "Import banks"
+msgstr ""
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:156
+msgid "Import key mappings"
+msgstr ""
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:157
+msgid "Import controllers"
+msgstr ""
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:160
+msgid "Import device name"
+msgstr ""
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:166
+msgid "Bank import behavior"
+msgstr ""
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:168
+msgid "Merge banks"
+msgstr ""
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:169
+msgid "Overwrite banks"
+msgstr ""
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:367
+msgid "Bank %1:%2"
+msgstr ""
+
+#: ../src/commands/segment/SegmentSplitByRecordingSrcCommand.cpp:42
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:48
+msgid "Split by Recording Source"
+msgstr ""
+
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:53
+msgid "Recording Source"
+msgstr ""
+
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:57
+msgid "Channel:"
+msgstr ""
+
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:64
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:75
+msgid "any"
+msgstr ""
+
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:69
+msgid "Device:"
+msgstr ""
+
+#: ../src/gui/dialogs/UnusedAudioSelectionDialog.cpp:46
+msgid "Select Unused Audio Files"
+msgstr ""
+
+#: ../src/gui/dialogs/UnusedAudioSelectionDialog.cpp:53
+#: ../src/gui/editors/segment/PlayListView.cpp:36
+msgid "File name"
+msgstr ""
+
+#: ../src/gui/dialogs/UnusedAudioSelectionDialog.cpp:54
+msgid "File size"
+msgstr ""
+
+#: ../src/gui/dialogs/UnusedAudioSelectionDialog.cpp:55
+msgid "Last modified date"
+msgstr ""
+
+#: ../src/gui/dialogs/UnusedAudioSelectionDialog.cpp:60
+msgid " (not found) "
+msgstr ""
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:105
+msgid "Audio File Manager"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:126
+msgid ""
+"* Some audio files are encoded at a sample rate different from that of the "
+"JACK audio server.\n"
+"Rosegarden will play them at the correct speed, but they will sound "
+"terrible.\n"
+"Please consider resampling such files externally, or adjusting the sample "
+"rate of the JACK server."
+msgstr ""
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:132
+msgid "&Add Audio File..."
+msgstr ""
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:135
+msgid "&Unload Audio File"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:140
+msgid "&Play Preview"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:151
+msgid "&Insert into Selected Audio Track"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:155
+msgid "Unload &all Audio Files"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:159
+msgid "Unload all &Unused Audio Files"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:163
+msgid "&Delete Unused Audio Files..."
+msgstr ""
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:167
+msgid "&Export Audio File..."
+msgstr ""
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:173
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:180
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:91
+msgid "Duration"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:181
+msgid "Envelope"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:182
+msgid "Sample rate"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:183
+msgid "Channels"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:282
+msgid "<no audio files>"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:488
+msgid "*.wav|WAV files (*.wav)"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:489
+msgid "Choose a name to save this file as"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:499
+msgid "Exporting audio file..."
+msgstr ""
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:609
+msgid ""
+"This will unload audio file \"%1\" and remove all associated segments. Are "
+"you sure?"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:692
+msgid ""
+"*.wav|WAV files (*.wav)\n"
+"*.*|All files"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:697
+msgid ""
+"*.wav *.flac *.ogg *.mp3|Audio files (*.wav *.flac *.ogg *.mp3)\n"
+"*.wav|WAV files (*.wav)\n"
+"*.flac|FLAC files (*.flac)\n"
+"*.ogg|Ogg files (*.ogg)\n"
+"*.mp3|MP3 files (*.mp3)\n"
+"*.*|All files"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:704
+msgid "Select one or more audio files"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:763
+msgid ""
+"This will unload all audio files and remove their associated segments.\n"
+"This action cannot be undone, and associations with these files will be "
+"lost.\n"
+"Files will not be removed from your disk.\n"
+"Are you sure?"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:800
+msgid ""
+"This will unload all audio files that are not associated with any segments "
+"in this composition.\n"
+"This action cannot be undone, and associations with these files will be "
+"lost.\n"
+"Files will not be removed from your disk.\n"
+"Are you sure?"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:865
+msgid ""
+"The following audio files are not used in the current composition.\n"
+"\n"
+"Please select the ones you wish to delete permanently from the hard disk.\n"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:875
+#, c-format
+msgid ""
+"_n: <qt>About to delete 1 audio file permanently from the hard disk.<br>This "
+"action cannot be undone, and there will be no way to recover this "
+"file.<br>Are you sure?</qt>\n"
+"\n"
+"<qt>About to delete %n audio files permanently from the hard disk.<br>This "
+"action cannot be undone, and there will be no way to recover these "
+"files.<br>Are you sure?</qt>"
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:525
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:888
+msgid "File %1 could not be deleted."
+msgstr ""
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:921
+msgid "Change Audio File label"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:6466
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:922
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:1099
+msgid "Enter new label"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIView.cpp:1538
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:1086
+msgid "Adding audio file..."
+msgstr ""
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:1107
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:1112
+msgid "Failed to add audio file. "
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:2789
+#: ../src/gui/application/RosegardenGUIApp.cpp:2736
+#: ../src/gui/application/RosegardenGUIView.cpp:1574
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:1122
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:180
+msgid "Generating audio preview..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIView.cpp:1581
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:1130
+msgid ""
+"Try copying this file to a directory where you have write permission and "
+"re-add it"
+msgstr ""
+
+#: ../src/gui/dialogs/TransportDialog.cpp:90 rc.cpp:357
+#, no-c-format
+msgid "Rosegarden Transport"
+msgstr ""
+
+#: ../src/gui/dialogs/TransportDialog.cpp:925
+#: ../src/gui/dialogs/TransportDialog.cpp:985
+msgid "PITCH WHEEL"
+msgstr ""
+
+#: ../src/gui/dialogs/TransportDialog.cpp:929
+#: ../src/gui/dialogs/TransportDialog.cpp:989
+msgid "CONTROLLER"
+msgstr ""
+
+#: ../src/gui/dialogs/TransportDialog.cpp:933
+#: ../src/gui/dialogs/TransportDialog.cpp:993
+msgid "PROG CHNGE"
+msgstr ""
+
+#: ../src/gui/dialogs/TransportDialog.cpp:938
+#: ../src/gui/dialogs/TransportDialog.cpp:998
+msgid "PRESSURE"
+msgstr ""
+
+#: ../src/gui/dialogs/TransportDialog.cpp:942
+#: ../src/gui/dialogs/TransportDialog.cpp:1002
+msgid "SYS MESSAGE"
+msgstr ""
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:177
+#: ../src/gui/dialogs/QuantizeDialog.cpp:40
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:127
+msgid "Quantize"
+msgstr ""
+
+#: ../src/gui/dialogs/QuantizeDialog.cpp:52
+msgid "Advanced"
+msgstr ""
+
+#: ../src/gui/dialogs/ExportDeviceDialog.cpp:42
+msgid "Export Devices..."
+msgstr ""
+
+#: ../src/gui/dialogs/ExportDeviceDialog.cpp:47
+msgid "Export devices"
+msgstr ""
+
+#: ../src/gui/dialogs/ExportDeviceDialog.cpp:49
+msgid "Export all devices"
+msgstr ""
+
+#: ../src/gui/dialogs/ExportDeviceDialog.cpp:50
+msgid "Export selected device only"
+msgstr ""
+
+#: ../src/gui/dialogs/ExportDeviceDialog.cpp:51
+msgid " (\"%1\")"
+msgstr ""
+
+#: ../src/gui/dialogs/CompositionLengthDialog.cpp:44
+msgid "Change Composition Length"
+msgstr ""
+
+#: ../src/gui/dialogs/CompositionLengthDialog.cpp:50
+msgid "Set the Start and End bar markers for this Composition"
+msgstr ""
+
+#: ../src/gui/dialogs/CompositionLengthDialog.cpp:54
+msgid "Start Bar"
+msgstr ""
+
+#: ../src/gui/dialogs/CompositionLengthDialog.cpp:62
+msgid "End Bar"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:62
+msgid "LilyPond Export/Preview"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:85
+msgid "General options"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:90
+msgid "Advanced options"
+msgstr ""
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:112
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:95
+msgid "Headers"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:106
+msgid "Basic options"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:113
+msgid "Compatibility level"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:117
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:118
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:119
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:120
+#, c-format
+msgid "LilyPond %1"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:125
+msgid "Paper size"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:129
+msgid "A3"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:130
+msgid "A4"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:131
+msgid "A5"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:132
+msgid "A6"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:133
+msgid "Legal"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:134
+msgid "US Letter"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:135
+msgid "Tabloid"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:136
+msgid "do not specify"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:152
+msgid "Font size"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:157
+msgid "%1 pt"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:169
+msgid "Staff level options"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:176
+msgid "Export content"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:179
+msgid "All tracks"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:180
+msgid "Non-muted tracks"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:181
+msgid "Selected track"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:182
+msgid "Selected segments"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:188
+msgid "Merge tracks that have the same name"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:198
+msgid "Notation options"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:206
+msgid "First"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:207
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:538
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:557
+msgid "All"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:211
+msgid "Export tempo marks "
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:215
+msgid "Export lyrics"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:225
+msgid "Export beamings"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:232
+msgid "Export track staff brackets"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:244
+msgid "Layout options"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:257
+msgid "Lyrics alignment"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:261
+msgid "Ragged bottom (systems will not be spread vertically across the page)"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:267
+msgid "Miscellaneous options"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:274
+msgid "Enable \"point and click\" debugging"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:279
+msgid "Export \\midi block"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:284
+msgid "No markers"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:285
+msgid "Rehearsal marks"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:286
+msgid "Marker text"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:290
+msgid "Export markers"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioSplitDialog.cpp:57
+msgid "Autosplit Audio Segment"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioSplitDialog.cpp:70
+msgid "AutoSplit Segment \""
+msgstr ""
+
+#: ../src/gui/dialogs/AudioSplitDialog.cpp:84
+msgid "Threshold"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioSplitDialog.cpp:142
+msgid "<no preview generated for this audio file>"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:70
+msgid "Audio Plugin"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:94
+#: ../src/gui/widgets/AudioFaderBox.cpp:136
+msgid "Editor"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:100
+msgid "Plugin"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:105
+msgid "Category:"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:110
+msgid "Plugin:"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:114
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:398
+msgid "Select a plugin from this list."
+msgstr ""
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:119
+msgid "Bypass"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:121
+msgid "Bypass this plugin."
+msgstr ""
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:127
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:390
+msgid "<ports>"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:130
+msgid "Input and output port counts."
+msgstr ""
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:132
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:391
+msgid "<id>"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:135
+msgid "Unique ID of plugin."
+msgstr ""
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:149
+msgid "Copy plugin parameters"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:155
+msgid "Paste plugin parameters"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:161
+msgid "Set to defaults"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:225
+msgid "(any)"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:226
+msgid "(unclassified)"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:247
+msgid "(none)"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:389
+#: ../src/gui/editors/parameters/AudioInstrumentParameterPanel.cpp:132
+#: ../src/gui/editors/parameters/AudioInstrumentParameterPanel.cpp:361
+#: ../src/gui/studio/AudioMixerWindow.cpp:685
+#: ../src/gui/studio/AudioMixerWindow.cpp:724
+#: ../src/gui/studio/AudioMixerWindow.cpp:906
+#: ../src/gui/widgets/AudioFaderBox.cpp:79
+msgid "<no plugin>"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:427
+msgid "This plugin has too many controls to edit here."
+msgstr ""
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:438
+#, c-format
+msgid "Id: %1"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:490
+msgid "mono"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:492
+msgid "stereo"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:494
+msgid "%1 in, %2 out"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:518
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:704
+msgid "Program: "
+msgstr ""
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:522
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:532
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:708
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:716
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:745
+msgid "<none selected>"
+msgstr ""
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:56
+msgid "Set the %1 property of the event selection:"
+msgstr ""
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:61
+msgid "Pattern"
+msgstr ""
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:66
+msgid "Flat - set %1 to value"
+msgstr ""
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:70
+msgid "Alternating - set %1 to max and min on alternate events"
+msgstr ""
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:74
+msgid "Crescendo - set %1 rising from min to max"
+msgstr ""
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:78
+msgid "Diminuendo - set %1 falling from max to min"
+msgstr ""
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:82
+msgid "Ringing - set %1 alternating from max to min with both dying to zero"
+msgstr ""
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:123
+#: ../src/gui/dialogs/EventParameterDialog.cpp:150
+msgid "First Value"
+msgstr ""
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:124
+#: ../src/gui/dialogs/EventParameterDialog.cpp:151
+msgid "Second Value"
+msgstr ""
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:132
+#: ../src/gui/dialogs/EventParameterDialog.cpp:142
+msgid "Low Value"
+msgstr ""
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:133
+#: ../src/gui/dialogs/EventParameterDialog.cpp:141
+msgid "High Value"
+msgstr ""
+
+#: ../src/gui/dialogs/TempoDialog.cpp:56 ../src/gui/rulers/TempoRuler.cpp:127
+msgid "Insert Tempo Change"
+msgstr ""
+
+#: ../src/gui/dialogs/TempoDialog.cpp:69
+msgid "New tempo:"
+msgstr ""
+
+#: ../src/gui/dialogs/TempoDialog.cpp:76
+msgid "Tap"
+msgstr ""
+
+#: ../src/gui/dialogs/TempoDialog.cpp:81
+msgid "Tempo is fixed until the following tempo change"
+msgstr ""
+
+#: ../src/gui/dialogs/TempoDialog.cpp:82
+msgid "Tempo ramps to the following tempo"
+msgstr ""
+
+#: ../src/gui/dialogs/TempoDialog.cpp:83
+msgid "Tempo ramps to:"
+msgstr ""
+
+#: ../src/gui/dialogs/TempoDialog.cpp:120
+msgid "Time of tempo change"
+msgstr ""
+
+#: ../src/gui/dialogs/TempoDialog.cpp:138
+msgid "The pointer is currently at "
+msgstr ""
+
+#: ../src/gui/dialogs/TempoDialog.cpp:154
+msgid "Apply this tempo from here onwards"
+msgstr ""
+
+#: ../src/gui/dialogs/TempoDialog.cpp:158
+msgid "Replace the last tempo change"
+msgstr ""
+
+#: ../src/gui/dialogs/TempoDialog.cpp:164
+msgid "Apply this tempo from the start of this bar"
+msgstr ""
+
+#: ../src/gui/dialogs/TempoDialog.cpp:167
+msgid "Apply this tempo to the whole composition"
+msgstr ""
+
+#: ../src/gui/dialogs/TempoDialog.cpp:172
+msgid "Also make this the default tempo"
+msgstr ""
+
+#: ../src/gui/dialogs/TempoDialog.cpp:256
+msgid "%1.%2 s,"
+msgstr ""
+
+#: ../src/gui/dialogs/TempoDialog.cpp:262
+#, c-format
+msgid "at the start of measure %1."
+msgstr ""
+
+#: ../src/gui/dialogs/TempoDialog.cpp:266
+#, c-format
+msgid "in the middle of measure %1."
+msgstr ""
+
+#: ../src/gui/dialogs/TempoDialog.cpp:285
+msgid " (at %1.%2 s, in measure %3)"
+msgstr ""
+
+#: ../src/gui/dialogs/TempoDialog.cpp:302
+msgid "There are no preceding tempo changes."
+msgstr ""
+
+#: ../src/gui/dialogs/TempoDialog.cpp:310
+msgid "There are no other tempo changes."
+msgstr ""
+
+#: ../src/gui/dialogs/TempoDialog.cpp:328
+msgid " bpm"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioPlayingDialog.cpp:42
+msgid "Playing audio file"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioPlayingDialog.cpp:47
+msgid "Playing audio file \"%1\""
+msgstr ""
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:52
+#: ../src/gui/editors/matrix/MatrixView.cpp:2655
+msgid "Trigger Segment"
+msgstr ""
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:61
+msgid "Trigger segment: "
+msgstr ""
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:59
+msgid "Key Change"
+msgstr ""
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:77
+msgid "Key signature"
+msgstr ""
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:80
+msgid "Key transposition"
+msgstr ""
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:86
+msgid "Existing notes following key change"
+msgstr ""
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:98
+msgid "Flatten"
+msgstr ""
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:100
+msgid "Key"
+msgstr ""
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:105
+msgid "Sharpen"
+msgstr ""
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:109
+msgid "Major"
+msgstr ""
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:110
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:369
+msgid "Minor"
+msgstr ""
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:123
+msgid "Transpose key according to segment transposition"
+msgstr ""
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:126
+msgid "Use specified key. Do not transpose"
+msgstr ""
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:134
+msgid "Apply to current segment only"
+msgstr ""
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:137
+msgid "Apply to all segments at this time"
+msgstr ""
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:141
+msgid "Exclude percussion segments"
+msgstr ""
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:155
+msgid "Maintain current accidentals"
+msgstr ""
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:158
+msgid "Transpose into this key"
+msgstr ""
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:331
+msgid "No such key"
+msgstr ""
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:44
+#: ../src/gui/editors/notation/NotationSelector.cpp:118
+msgid "Interpret"
+msgstr ""
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:50
+msgid "Interpretations to apply"
+msgstr ""
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:53
+msgid "Apply text dynamics (p, mf, ff etc)"
+msgstr ""
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:55
+msgid "Apply hairpin dynamics"
+msgstr ""
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:57
+msgid "Stress beats"
+msgstr ""
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:59
+msgid "Articulate slurs, staccato, tenuto etc"
+msgstr ""
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:61
+msgid "All available interpretations"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:316
+msgid ""
+"Attempted to launch JACK audio daemon failed. Audio will be disabled.\n"
+"Please check configuration (Settings -> Configure Rosegarden -> Audio -> "
+"Startup)\n"
+" and restart."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:325
+msgid "Starting sequencer..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:333
+msgid "Initializing plugin manager..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:338
+msgid "Initializing view..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:354
+msgid "Special Parameters"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:430
+msgid "Starting sequence manager..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:456
+msgid "Clearing studio data..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:475
+#: ../src/gui/editors/notation/NotationView.cpp:558
+msgid "Starting..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:556
+msgid "Import Rosegarden &Project file..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:560
+msgid "Import &MIDI file..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:564
+msgid "Import &Rosegarden 2.1 file..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:568
+msgid "Import &Hydrogen file..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:572
+msgid "Merge &File..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:576
+msgid "Merge &MIDI file..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:580
+msgid "Merge &Rosegarden 2.1 file..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:584
+msgid "Merge &Hydrogen file..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:588
+msgid "Export Rosegarden &Project file..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:592
+msgid "Export &MIDI file..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:596
+msgid "Export &LilyPond file..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:600
+msgid "Export Music&XML file..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:604
+msgid "Export &Csound score file..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:608
+msgid "Export M&up file..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:612
+#: ../src/gui/editors/notation/NotationView.cpp:1500
+msgid "Print &with LilyPond..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:616
+#: ../src/gui/editors/notation/NotationView.cpp:1504
+msgid "Preview with Lil&yPond..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:620
+msgid "Play&list"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:627
+msgid "Rosegarden &Tutorial"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:631
+msgid "&Bug Reporting Guidelines"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:645
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:348
+#: ../src/gui/editors/segment/MarkerEditor.cpp:378
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:388
+#: ../src/gui/general/EditViewBase.cpp:190
+#: ../src/gui/studio/BankEditorDialog.cpp:318
+#: ../src/gui/studio/DeviceManagerDialog.cpp:227
+msgid "Und&o"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:651
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:354
+#: ../src/gui/editors/segment/MarkerEditor.cpp:384
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:394
+#: ../src/gui/general/EditViewBase.cpp:196
+#: ../src/gui/studio/BankEditorDialog.cpp:324
+#: ../src/gui/studio/DeviceManagerDialog.cpp:233
+msgid "Re&do"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:665
+#: ../src/gui/editors/notation/NotationView.cpp:2297
+msgid "Show T&ools Toolbar"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:669
+msgid "Show Trac&ks Toolbar"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:673
+msgid "Show &Editors Toolbar"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:677
+#: ../src/gui/editors/notation/NotationView.cpp:2309
+msgid "Show Trans&port Toolbar"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:681
+msgid "Show &Zoom Toolbar"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:688
+msgid "Show Tra&nsport"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:693
+msgid "Show Track &Labels"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:698
+msgid "Show Playback Position R&uler"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:703
+msgid "Show Te&mpo Ruler"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:708
+msgid "Show Cho&rd Name Ruler"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:714
+msgid "Show Segment Pre&views"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:719
+msgid "Show Special &Parameters"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:753
+#: ../src/gui/editors/matrix/MatrixView.cpp:641
+#: ../src/gui/editors/notation/NotationView.cpp:1772
+msgid "&Select and Edit"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:758
+#: ../src/gui/editors/matrix/MatrixView.cpp:646
+msgid "&Draw"
+msgstr ""
+
+#: ../src/commands/edit/EraseCommand.h:50
+#: ../src/gui/application/RosegardenGUIApp.cpp:763
+#: ../src/gui/editors/matrix/MatrixView.cpp:651
+#: ../src/gui/editors/notation/NotationView.cpp:1766
+msgid "&Erase"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:768
+#: ../src/gui/editors/matrix/MatrixView.cpp:656
+msgid "&Move"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:775
+msgid "&Resize"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:782 rc.cpp:87
+#, no-c-format
+msgid "&Split"
+msgstr ""
+
+#: ../src/commands/segment/SegmentJoinCommand.h:53
+#: ../src/gui/application/RosegardenGUIApp.cpp:789
+msgid "&Join"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:795
+msgid "&Harmonize"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:806
+#: ../src/gui/rulers/TempoRuler.cpp:157
+msgid "Open Tempo and Time Signature Editor"
+msgstr ""
+
+#: ../src/commands/segment/CutRangeCommand.cpp:41
+#: ../src/gui/application/RosegardenGUIApp.cpp:812
+msgid "Cut Range"
+msgstr ""
+
+#: ../src/commands/edit/CopyCommand.cpp:73
+#: ../src/gui/application/RosegardenGUIApp.cpp:816
+msgid "Copy Range"
+msgstr ""
+
+#: ../src/commands/segment/PasteRangeCommand.cpp:45
+#: ../src/gui/application/RosegardenGUIApp.cpp:820
+msgid "Paste Range"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:828
+msgid "Insert Range..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:832
+#: ../src/gui/editors/notation/NotationView.cpp:1804
+msgid "De&lete"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:836
+msgid "Select &All Segments"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:852
+msgid "Edit Mar&kers..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:856
+msgid "Edit Document P&roperties..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:864
+msgid "Open in &Default Editor"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:870
+#: ../src/gui/general/EditViewBase.cpp:206
+msgid "Open in Matri&x Editor"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:876
+#: ../src/gui/general/EditViewBase.cpp:212
+msgid "Open in &Percussion Matrix Editor"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:882
+#: ../src/gui/general/EditViewBase.cpp:218
+msgid "Open in &Notation Editor"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:888
+#: ../src/gui/general/EditViewBase.cpp:224
+msgid "Open in &Event List Editor"
+msgstr ""
+
+#: ../src/commands/edit/EventQuantizeCommand.cpp:120
+#: ../src/commands/edit/EventUnquantizeCommand.cpp:87
+#: ../src/gui/application/RosegardenGUIApp.cpp:894
+msgid "&Quantize..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:908
+#: ../src/gui/editors/matrix/MatrixView.cpp:686
+msgid "Repeat Last Quantize"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:928
+msgid "Split at Time..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:932
+#: ../src/gui/general/EditView.cpp:796
+msgid "Jog &Left"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:936
+#: ../src/gui/general/EditView.cpp:800
+msgid "Jog &Right"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:940
+msgid "Set Start Time..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:944
+msgid "Set Duration..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:953
+msgid "Turn Re&peats into Copies"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:958
+msgid "Manage Tri&ggered Segments"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:962
+msgid "Set Tempos from &Beat Segment"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:966
+msgid "Set &Tempo to Audio Segment Duration"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:972
+msgid "Manage A&udio Files"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:977
+msgid "Show Segment Labels"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:986
+msgid "Add &Track"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:990
+msgid "&Add Tracks..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:996
+msgid "D&elete Track"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1002
+msgid "Move Track &Down"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1008
+msgid "Move Track &Up"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1012
+msgid "Select &Next Track"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1017
+msgid "Select &Previous Track"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1022
+msgid "Mute or Unmute Track"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1027
+msgid "Arm or Un-arm Track for Record"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1034
+msgid "&Mute all Tracks"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1040
+msgid "&Unmute all Tracks"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1044
+msgid "&Remap Instruments..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1053
+msgid "&Audio Mixer"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1059
+msgid "Midi Mi&xer"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1065
+msgid "Manage MIDI &Devices"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1071
+msgid "Manage S&ynth Plugins"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1075
+msgid "Modify MIDI &Filters"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1079
+msgid "MIDI Thru Routing"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1085
+msgid "Manage &Metronome"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1089
+msgid "&Save Current Document as Default Studio"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1093
+msgid "&Import Default Studio"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1097
+msgid "Im&port Studio from File..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1101
+msgid "&Reset MIDI Network"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1105
+msgid "Set Quick Marker at Playback Position"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1109
+msgid "Jump to Quick Marker"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1142
+#: ../src/gui/editors/matrix/MatrixView.cpp:782
+#: ../src/gui/editors/notation/NotationView.cpp:2397
+#: ../src/gui/studio/AudioMixerWindow.cpp:105
+#: ../src/gui/studio/MidiMixerWindow.cpp:81
+msgid "&Play"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1153
+#: ../src/gui/editors/matrix/MatrixView.cpp:791
+#: ../src/gui/editors/notation/NotationView.cpp:2406
+#: ../src/gui/studio/AudioMixerWindow.cpp:114
+#: ../src/gui/studio/MidiMixerWindow.cpp:90
+msgid "&Stop"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1160
+#: ../src/gui/editors/matrix/MatrixView.cpp:802
+#: ../src/gui/editors/notation/NotationView.cpp:2417
+#: ../src/gui/studio/AudioMixerWindow.cpp:125
+#: ../src/gui/studio/MidiMixerWindow.cpp:101
+msgid "&Fast Forward"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1168
+#: ../src/gui/editors/matrix/MatrixView.cpp:796
+#: ../src/gui/editors/notation/NotationView.cpp:2411
+#: ../src/gui/studio/AudioMixerWindow.cpp:119
+#: ../src/gui/studio/MidiMixerWindow.cpp:95
+msgid "Re&wind"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1175
+msgid "P&unch in Record"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1182
+#: ../src/gui/studio/AudioMixerWindow.cpp:143
+#: ../src/gui/studio/MidiMixerWindow.cpp:119
+msgid "&Record"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1189
+#: ../src/gui/editors/matrix/MatrixView.cpp:808
+#: ../src/gui/editors/notation/NotationView.cpp:2423
+#: ../src/gui/studio/AudioMixerWindow.cpp:131
+#: ../src/gui/studio/MidiMixerWindow.cpp:107
+msgid "Rewind to &Beginning"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1196
+#: ../src/gui/editors/matrix/MatrixView.cpp:814
+#: ../src/gui/editors/notation/NotationView.cpp:2429
+#: ../src/gui/studio/AudioMixerWindow.cpp:137
+#: ../src/gui/studio/MidiMixerWindow.cpp:113
+msgid "Fast Forward to &End"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1203
+#: ../src/gui/editors/matrix/MatrixView.cpp:832
+#: ../src/gui/editors/notation/NotationView.cpp:2447
+msgid "Scro&ll to Follow Playback"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1209
+#: ../src/gui/editors/matrix/MatrixView.cpp:838
+#: ../src/gui/editors/notation/NotationView.cpp:2453
+#: ../src/gui/studio/AudioMixerWindow.cpp:149
+#: ../src/gui/studio/MidiMixerWindow.cpp:125
+msgid "Panic"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1213
+msgid "Segment Debug Dump "
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1283
+msgid " Zoom: "
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1719
+msgid "File \"%1\" does not exist"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1725
+msgid "File \"%1\" is actually a directory"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1734
+msgid "You do not have read permission for \"%1\""
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1802
+msgid ""
+"An auto-save file for this document has been found\n"
+"Do you want to open it instead ?"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1896
+msgid "Example Files"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2100
+msgid "Opening a new application window..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2110
+msgid "Creating new document..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2154
+#, c-format
+msgid ""
+"Malformed URL\n"
+"%1"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2179
+#: ../src/gui/application/RosegardenGUIApp.cpp:2240
+msgid "Opening file..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2201
+#: ../src/gui/application/RosegardenGUIApp.cpp:2220
+msgid "Open File"
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:1225
+#: ../src/gui/application/RosegardenGUIApp.cpp:2258
+msgid "Saving file..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2330
+msgid "This is not a valid filename.\n"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2335
+msgid "This is not a local file.\n"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2342
+#: ../src/gui/studio/BankEditorDialog.cpp:1640
+#: ../src/gui/studio/DeviceManagerDialog.cpp:787
+msgid "You have specified a directory"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2348
+#: ../src/gui/studio/BankEditorDialog.cpp:1646
+#: ../src/gui/studio/DeviceManagerDialog.cpp:793
+msgid "The specified file exists. Overwrite?"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2362
+msgid "Saving file with a new filename..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2364
+msgid "Rosegarden files"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2365
+#: ../src/gui/application/RosegardenGUIApp.cpp:4860
+#: ../src/gui/application/RosegardenGUIApp.cpp:4904
+#: ../src/gui/application/RosegardenGUIApp.cpp:4942
+#: ../src/gui/application/RosegardenGUIApp.cpp:4975
+#: ../src/gui/application/RosegardenGUIApp.cpp:5009
+#: ../src/gui/application/RosegardenGUIApp.cpp:5116
+msgid "All files"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2366
+msgid "Save as..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2404
+msgid "Closing file..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2421
+#: ../src/gui/editors/notation/NotationView.cpp:4618
+msgid "Printing..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2433
+#: ../src/gui/editors/notation/NotationView.cpp:4635
+msgid "Previewing..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2440
+msgid "Exiting..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2463
+msgid "Cutting selection..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2474
+#: ../src/gui/editors/matrix/MatrixView.cpp:1614
+#: ../src/gui/editors/notation/NotationView.cpp:4763
+msgid "Copying selection to clipboard..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2484
+#: ../src/gui/editors/eventlist/EventView.cpp:878
+#: ../src/gui/editors/matrix/MatrixView.cpp:1625
+#: ../src/gui/editors/notation/NotationView.cpp:4796
+#: ../src/gui/editors/notation/NotationView.cpp:4841
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:352
+msgid "Clipboard is empty"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2487
+#: ../src/gui/editors/eventlist/EventView.cpp:882
+#: ../src/gui/editors/matrix/MatrixView.cpp:1629
+#: ../src/gui/editors/notation/NotationView.cpp:4804
+#: ../src/gui/editors/notation/NotationView.cpp:4845
+msgid "Inserting clipboard contents..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2556
+msgid "Duration of empty range to insert"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2631
+msgid "This function needs no more than one segment to be selected."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2654
+msgid "Can't join Audio segments"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2707
+msgid "rescaling an audio file"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2723
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:172
+msgid "Rescaling audio file..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2767
+msgid ""
+"The audio file path does not exist or is not writable.\n"
+"You must set the audio file path to a valid directory in Document Properties "
+"before %1.\n"
+"Would you like to set it now?"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2769
+#: ../src/gui/application/RosegardenGUIApp.cpp:5291
+#: ../src/gui/application/RosegardenGUIApp.cpp:5339
+#: ../src/gui/editors/segment/TrackButtons.cpp:419
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:159
+msgid "Set audio file path"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2833
+msgid "Jog Selection"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2978
+#, c-format
+msgid ""
+"_n: Split Segment at Time\n"
+"Split %n Segments at Time"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3013
+#: ../src/gui/general/EditViewBase.cpp:619
+msgid "Segment Start Time"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3023
+msgid "Set Segment Start Times"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3024
+#: ../src/gui/general/EditViewBase.cpp:626
+msgid "Set Segment Start Time"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3056
+#: ../src/gui/general/EditViewBase.cpp:644
+msgid "Segment Duration"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3068
+msgid "Set Segment Durations"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3069
+#: ../src/gui/general/EditViewBase.cpp:652
+msgid "Set Segment Duration"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3176
+#: ../src/gui/application/RosegardenGUIApp.cpp:5875
+msgid "Set Global Tempo"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3234
+#: ../src/gui/general/EditViewBase.cpp:477
+msgid "Toggle the toolbar..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3244
+msgid "Toggle the tools toolbar..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3254
+msgid "Toggle the tracks toolbar..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3264
+msgid "Toggle the editor toolbar..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3274
+msgid "Toggle the transport toolbar..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3284
+msgid "Toggle the zoom toolbar..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3294
+msgid "Toggle the Transport"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3377
+#: ../src/gui/general/EditViewBase.cpp:487
+msgid "Toggle the statusbar..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3434
+msgid ""
+"The join tool isn't implemented yet. Instead please highlight the segments "
+"you want to join and then use the menu option:\n"
+"\n"
+" Segments->Collapse Segments.\n"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3437
+msgid "Join tool not yet implemented"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3675
+msgid "Revert modified document to previous saved version?"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3691
+msgid ""
+"*.rgp|Rosegarden Project files\n"
+"*|All files"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3692
+msgid "Import Rosegarden Project File"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3717
+msgid "Failed to import project file \"%1\""
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3739
+msgid "Open MIDI File"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3756
+msgid "Merge MIDI File"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3866
+msgid "Importing MIDI file..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3903
+msgid "Calculating notation..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3950
+msgid "Calculate Notation"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3991
+#: ../src/gui/application/RosegardenGUIApp.cpp:4008
+msgid ""
+"*.rose|Rosegarden-2 files\n"
+"*|All files"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3992
+#: ../src/gui/application/RosegardenGUIApp.cpp:4009
+msgid "Open Rosegarden 2.1 File"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4026
+msgid "Importing Rosegarden 2.1 file..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4052
+msgid "Can't load Rosegarden 2.1 file. It appears to be corrupted."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4078
+#: ../src/gui/application/RosegardenGUIApp.cpp:4095
+msgid ""
+"*.h2song|Hydrogen files\n"
+"*|All files"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4079
+#: ../src/gui/application/RosegardenGUIApp.cpp:4096
+msgid "Open Hydrogen File"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4113
+msgid "Importing Hydrogen file..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4139
+msgid "Can't load Hydrogen file. It appears to be corrupted."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4527
+msgid "Export and import of Rosegarden Project files"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4529
+msgid "The Rosegarden Project Packager helper script"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4533
+msgid "%1 - for project file support"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4550
+msgid "The Rosegarden LilyPondView helper script"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4554
+msgid "%1 - for LilyPond preview support"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4570
+msgid "The Rosegarden Audio File Importer helper script"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4574
+msgid "%1 - for audio file import"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4585
+msgid ""
+"<h3>Helper programs not found</h3><p>Rosegarden could not find one or more "
+"helper programs which it needs to provide some features. The following "
+"features will not be available:</p>"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4586
+#: ../src/gui/application/RosegardenGUIApp.cpp:4592
+msgid "<ul>"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4588
+#: ../src/gui/application/RosegardenGUIApp.cpp:4594
+msgid "<li>%1</li>"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4590
+#: ../src/gui/application/RosegardenGUIApp.cpp:4596
+msgid "</ul>"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4591
+msgid ""
+"<p>To fix this, you should install the following additional programs:</p>"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4603
+msgid "Helper programs not found"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4686
+msgid "Starting the sequencer..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4712
+msgid "Couldn't start the sequencer"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4789
+msgid "Clearing down jackd..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4803
+msgid "Starting jackd..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4842
+msgid ""
+"The Rosegarden sequencer process has exited unexpectedly. Sound and "
+"recording will no longer be available for this session.\n"
+"Please exit and restart Rosegarden to restore sound capability."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4846
+msgid ""
+"The Rosegarden sequencer could not be started, so sound and recording will "
+"be unavailable for this session.\n"
+"For assistance with correct audio and MIDI configuration, go to "
+"http://rosegardenmusic.com."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4856
+msgid "Exporting Rosegarden Project file..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4859
+msgid "Rosegarden Project files\n"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4861
+#: ../src/gui/application/RosegardenGUIApp.cpp:4905
+#: ../src/gui/application/RosegardenGUIApp.cpp:4943
+#: ../src/gui/application/RosegardenGUIApp.cpp:4976
+#: ../src/gui/application/RosegardenGUIApp.cpp:5010
+#: ../src/gui/application/RosegardenGUIApp.cpp:5116
+msgid "Export as..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4875
+#, c-format
+msgid "Saving Rosegarden file to package failed: %1"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4889
+msgid "Failed to export to project file \"%1\""
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4900
+#: ../src/gui/application/RosegardenGUIApp.cpp:4915
+msgid "Exporting MIDI file..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4903
+msgid "Standard MIDI files\n"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4934
+#: ../src/gui/application/RosegardenGUIApp.cpp:4966
+#: ../src/gui/application/RosegardenGUIApp.cpp:4999
+#: ../src/gui/application/RosegardenGUIApp.cpp:5103
+#: ../src/gui/application/RosegardenGUIApp.cpp:5140
+#: ../src/gui/editors/notation/NotationView.cpp:4733
+msgid "Export failed. The file could not be opened for writing."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4940
+#: ../src/gui/application/RosegardenGUIApp.cpp:4952
+msgid "Exporting Csound score file..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4972
+#: ../src/gui/application/RosegardenGUIApp.cpp:4985
+msgid "Exporting Mup file..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4975
+msgid "Mup files\n"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5005
+#: ../src/gui/application/RosegardenGUIApp.cpp:5089
+#: ../src/gui/editors/notation/NotationView.cpp:4719
+msgid "Exporting LilyPond file..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5008
+msgid "LilyPond files"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5023
+#: ../src/gui/editors/notation/NotationView.cpp:4653
+msgid "Printing LilyPond file..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5028
+#: ../src/gui/application/RosegardenGUIApp.cpp:5052
+#: ../src/gui/editors/notation/NotationView.cpp:4658
+#: ../src/gui/editors/notation/NotationView.cpp:4682
+msgid "Failed to open a temporary file for LilyPond export."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5047
+#: ../src/gui/editors/notation/NotationView.cpp:4677
+msgid "Previewing LilyPond file..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5080
+#: ../src/gui/editors/notation/NotationView.cpp:4710
+msgid "LilyPond Preview Options"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5081
+#: ../src/gui/editors/notation/NotationView.cpp:4711
+msgid "LilyPond preview options"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5112
+#: ../src/gui/application/RosegardenGUIApp.cpp:5126
+msgid "Exporting MusicXML file..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5115
+msgid "XML files"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5289
+#: ../src/gui/editors/segment/TrackButtons.cpp:417
+msgid ""
+"The audio file path does not exist or is not writable.\n"
+"Please set the audio file path to a valid directory in Document Properties "
+"before recording audio.\n"
+"Would you like to set it now?"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5337
+msgid ""
+"The audio file path does not exist or is not writable.\n"
+"Please set the audio file path to a valid directory in Document Properties "
+"before you start to record audio.\n"
+"Would you like to set it now?"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5780
+msgid "Move playback pointer to time"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5793
+#: ../src/gui/editors/matrix/MatrixView.cpp:2240
+msgid "%1%"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5861
+#, c-format
+msgid "Replace Tempo Change at %1"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5891
+msgid "Set Global and Default Tempo"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5914
+msgid "Move Tempo Change"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5949
+msgid "new marker"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5950
+msgid "no description"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:6363
+#, c-format
+msgid "Sequencer failed to add audio file %1"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:6388
+#, c-format
+msgid "Sequencer failed to remove audio file id %1"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:6448
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:1086
+msgid "Modify Segment label"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:6450
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:1088
+msgid "Modify Segments label"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:6452
+msgid "Relabelling selection..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7539
+msgid "Play List"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7567
+msgid "http://rosegarden.sourceforge.net/tutorial/en/chapter-0.html"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7574
+msgid "http://rosegarden.sourceforge.net/tutorial/bug-guidelines.html"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7650
+msgid "Queueing MIDI panic events for tranmission..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7708
+msgid "Are you sure you want to save this as your default studio?"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7713
+msgid "Saving current document as default studio..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7738
+msgid ""
+"Are you sure you want to import your default studio and lose the current one?"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7773
+msgid "Import Studio from File"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7807
+msgid "Import Studio"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:8015
+msgid ""
+"<h3>Newer version available</h3><p>A newer version of Rosegarden may be "
+"available.<br>Please consult the <a "
+"href=\"http://www.rosegardenmusic.com/getting/\">Rosegarden website</a> for "
+"more information.</p>"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:8016
+msgid "Newer version available"
+msgstr ""
+
+#: ../src/gui/application/RosegardenApplication.cpp:104
+#, c-format
+msgid "Failed to load soundfont %1"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:311
+msgid "Rosegarden - A sequencer and musical notation editor"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:315
+msgid "Don't use the sequencer (support editing only)"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:316
+msgid "Don't show the splash screen"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:317
+msgid "Don't automatically run in the background"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:318
+msgid "Attach to a running sequencer process, if found"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:319
+msgid "Ignore installed version - for devs only"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:320
+msgid "file to open"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:370
+msgid "Installation contains the wrong version of Rosegarden."
+msgstr ""
+
+#: ../src/gui/application/main.cpp:371
+msgid ""
+" The wrong versions of Rosegarden's data files were\n"
+" found in the standard KDE installation directories.\n"
+" (I am %1, but the installed files are for version %2.)\n"
+"\n"
+" This may mean one of the following:\n"
+"\n"
+" 1. This is a new upgrade of Rosegarden, and it has not yet been\n"
+" installed. If you compiled it yourself, check that you have\n"
+" run \"make install\" and that the procedure completed\n"
+" successfully.\n"
+"\n"
+" 2. The upgrade was installed in a non-standard directory,\n"
+" and an old version was found in a standard directory. If so,\n"
+" you will need to add the correct directory to your KDEDIRS\n"
+" environment variable before you can run it."
+msgstr ""
+
+#: ../src/gui/application/main.cpp:383 ../src/gui/application/main.cpp:401
+msgid "Installation problem"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:389
+msgid "Rosegarden does not appear to have been installed."
+msgstr ""
+
+#: ../src/gui/application/main.cpp:390
+msgid ""
+" One or more of Rosegarden's data files could not be\n"
+" found in the standard KDE installation directories.\n"
+"\n"
+" This may mean one of the following:\n"
+"\n"
+" 1. Rosegarden has not been correctly installed. If you compiled\n"
+" it yourself, check that you have run \"make install\" and that\n"
+" the procedure completed successfully.\n"
+"\n"
+" 2. Rosegarden has been installed in a non-standard directory,\n"
+" and you need to add this directory to your KDEDIRS environment\n"
+" variable before you can run it. This may be the case if you\n"
+" installed into $HOME or a local third-party package directory\n"
+" like /usr/local or /opt."
+msgstr ""
+
+#: ../src/gui/application/main.cpp:414
+msgid "Rosegarden"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:416
+msgid ""
+"Copyright 2000 - 2008 Guillaume Laurent, Chris Cannam, Richard Bown\n"
+"Parts copyright 1994 - 2004 Chris Cannam, Andy Green, Richard Bown, "
+"Guillaume Laurent\n"
+"LilyPond fonts copyright 1997 - 2005 Han-Wen Nienhuys and Jan Nieuwenhuizen"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:428
+msgid "Chord labelling code"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:429
+msgid ""
+"LilyPond output\n"
+"assorted other patches\n"
+"i18n-ization"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:430
+msgid ""
+"UI improvements\n"
+"bug fixes"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:431
+msgid ""
+"Segment colours\n"
+"Other UI and bug fixes"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:432
+msgid ""
+"Russian translation\n"
+"i18n-ization"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:433 ../src/gui/application/main.cpp:434
+msgid "German translation"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:435
+msgid "Welsh translation"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:436
+msgid "French translation"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:437
+msgid ""
+"French translation\n"
+"Bug fixes"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:438 ../src/gui/application/main.cpp:439
+msgid "Italian translation"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:440 ../src/gui/application/main.cpp:441
+msgid "Swedish translation"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:442
+msgid "Estonian translation"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:443 ../src/gui/application/main.cpp:444
+msgid "Dutch translation"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:445
+msgid "HSpinBox class"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:446
+msgid "Transposition by interval"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:447
+msgid "Original designs for rotary controllers"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:448
+msgid "Japanese translation"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:449
+msgid ""
+"Auto-scroll deceleration\n"
+"Rests outside staves and other bug fixes"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:450
+msgid "Simplified Chinese translation"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:451
+msgid "LIRC infrared remote-controller support"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:452
+msgid "MTC slave timing implementation"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:453
+msgid "Czech translation"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:454
+msgid "SCons/bksys building system"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:455
+msgid "icons, icons, icons"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:456 ../src/gui/application/main.cpp:457
+#: ../src/gui/application/main.cpp:458 ../src/gui/application/main.cpp:459
+msgid "Spanish translation"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:460 ../src/gui/application/main.cpp:461
+msgid "Catalan translation"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:462
+msgid ""
+"1.2.3 splash screen photo\n"
+"Gave birth to D. Michael McIntyre, bought him a good flute once\n"
+"upon a time, and always humored him when he came over to play her\n"
+"some new instrument, even though she really hated his playing.\n"
+"Born October 19, 1951, died September 21, 2007, R. I. P."
+msgstr ""
+
+#: ../src/gui/application/main.cpp:463
+msgid "Initial guitar chord editing code"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:464
+msgid "Polish translation"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:465
+msgid "Basque translation"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:466
+msgid "Klearlook theme"
+msgstr ""
+
+#: ../src/_translatorinfo.cpp:1 ../src/gui/application/main.cpp:468
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr ""
+
+#: ../src/_translatorinfo.cpp:3 ../src/gui/application/main.cpp:468
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:719
+msgid "Welcome!"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:731
+msgid ""
+"<h2>Welcome to Rosegarden!</h2><p>Welcome to the Rosegarden audio and MIDI "
+"sequencer and musical notation editor.</p><ul><li>If you have not already "
+"done so, you may wish to install some DSSI synth plugins, or a separate "
+"synth program such as QSynth. Rosegarden does not synthesize sounds from "
+"MIDI on its own, so without these you will hear "
+"nothing.</li><br><br><li>Rosegarden uses the JACK audio server for recording "
+"and playback of audio, and for playback from DSSI synth plugins. These "
+"features will only be available if the JACK server is "
+"running.</li><br><br><li>Rosegarden has comprehensive documentation: see the "
+"Help menu for the handbook, tutorials, and other "
+"information!</li></ul><p>Rosegarden was brought to you by a team of "
+"volunteers across the world. To learn more, go to <a "
+"href=\"http://www.rosegardenmusic.com/\">http://www.rosegardenmusic.com/</a>."
+"</p>"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIView.cpp:257
+msgid "No non-audio segments in composition"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIView.cpp:333
+msgid "Selection must contain only audio or non-audio segments"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIView.cpp:431
+#: ../src/gui/application/RosegardenGUIView.cpp:576
+#: ../src/gui/application/RosegardenGUIView.cpp:612
+#: ../src/gui/application/RosegardenGUIView.cpp:776
+msgid "No non-audio segments selected"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIView.cpp:851
+msgid ""
+"You've not yet defined an audio editor for Rosegarden to use.\n"
+"See Settings -> Configure Rosegarden -> Audio."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIView.cpp:1559
+#: ../src/gui/application/RosegardenGUIView.cpp:1564
+msgid "Can't add dropped file. "
+msgstr ""
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1014
+#: ../src/gui/seqmanager/SequenceManager.cpp:1150
+msgid ""
+"The JACK Audio subsystem has failed or it has stopped Rosegarden from "
+"processing audio.\n"
+"Please restart Rosegarden to continue working with audio.\n"
+"Quitting other running applications may improve Rosegarden's performance."
+msgstr ""
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1020
+#: ../src/gui/seqmanager/SequenceManager.cpp:1156
+msgid ""
+"The JACK Audio subsystem has stopped Rosegarden from processing audio, "
+"probably because of a processing overload.\n"
+"An attempt to restart the audio service has been made, but some problems may "
+"remain.\n"
+"Quitting other running applications may improve Rosegarden's performance."
+msgstr ""
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1031
+msgid ""
+"Run out of processor power for real-time audio processing. Cannot continue."
+msgstr ""
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1057
+msgid ""
+"A serious error has occurred in the ALSA MIDI subsystem. It may not be "
+"possible to continue sequencing. Please check console output for more "
+"information."
+msgstr ""
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1078
+msgid "JACK Audio subsystem is losing sample frames."
+msgstr ""
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1096
+msgid ""
+"Failed to read audio data from disc in time to service the audio subsystem."
+msgstr ""
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1100
+msgid ""
+"Failed to write audio data to disc fast enough to service the audio "
+"subsystem."
+msgstr ""
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1104
+msgid "The audio mixing subsystem is failing to keep up."
+msgstr ""
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1108
+msgid "The audio subsystem is failing to keep up."
+msgstr ""
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1112
+msgid "Unknown sequencer failure mode!"
+msgstr ""
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1170
+msgid ""
+"<h3>System timer resolution is too low</h3><p>Rosegarden was unable to find "
+"a high-resolution timing source for MIDI performance.</p><p>This may mean "
+"you are using a Linux system with the kernel timer resolution set too low. "
+"Please contact your Linux distributor for more information.</p><p>Some Linux "
+"distributors already provide low latency kernels, see <a "
+"href=\"http://rosegarden.wiki.sourceforge.net/Low+latency+kernels\">http://ro"
+"segarden.wiki.sourceforge.net/Low+latency+kernels</a> for instructions.</p>"
+msgstr ""
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1188
+msgid ""
+"<h3>System timer resolution is too low</h3><p>Rosegarden was unable to find "
+"a high-resolution timing source for MIDI performance.</p><p>You may be able "
+"to solve this problem by loading the RTC timer kernel module. To do this, "
+"try running <b>sudo modprobe snd-rtctimer</b> in a terminal window and then "
+"restarting Rosegarden.</p><p>Alternatively, check whether your Linux "
+"distributor provides a multimedia-optimized kernel. See <a "
+"href=\"http://rosegarden.wiki.sourceforge.net/Low+latency+kernels\">http://ro"
+"segarden.wiki.sourceforge.net/Low+latency+kernels</a> for notes about "
+"this.</p>"
+msgstr ""
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1312
+msgid ""
+"<p>Both MIDI and Audio subsystems have failed to initialize.</p><p>You may "
+"continue without the sequencer, but we suggest closing Rosegarden, running "
+"\"alsaconf\" as root, and starting Rosegarden again. If you wish to run "
+"with no sequencer by design, then use \"rosegarden --nosequencer\" to avoid "
+"seeing this error in the future.</p>"
+msgstr ""
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1314
+msgid ""
+"<p>The MIDI subsystem has failed to initialize.</p><p>You may continue "
+"without the sequencer, but we suggest closing Rosegarden, running \"modprobe "
+"snd-seq-midi\" as root, and starting Rosegarden again. If you wish to run "
+"with no sequencer by design, then use \"rosegarden --nosequencer\" to avoid "
+"seeing this error in the future.</p>"
+msgstr ""
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1316
+msgid ""
+"<p>The Rosegarden sequencer module version does not match the GUI module "
+"version.</p><p>You have probably mixed up files from two different versions "
+"of Rosegarden. Please check your installation.</p>"
+msgstr ""
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1322
+#, c-format
+msgid "<h3>Sequencer startup failed</h3>%1"
+msgstr ""
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1330
+msgid ""
+"<h3>Failed to connect to JACK audio server.</h3><p>Rosegarden could not "
+"connect to the JACK audio server. This probably means the JACK server is "
+"not running.</p><p>If you want to be able to play or record audio files or "
+"use plugins, you should exit Rosegarden and start the JACK server before "
+"running Rosegarden again.</p>"
+msgstr ""
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1331
+msgid "Failed to connect to JACK"
+msgstr ""
+
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:46
+msgid "Modify MIDI filters..."
+msgstr ""
+
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:58
+msgid "THRU events to ignore"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:131
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:60
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:96
+msgid "Note"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:132
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:61
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:97
+msgid "Program Change"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:136
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:62
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:98
+msgid "Key Pressure"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:137
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:63
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:99
+msgid "Channel Pressure"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:134
+#: ../src/gui/general/EditView.cpp:899
+#: ../src/gui/rulers/ControllerEventsRuler.cpp:198
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:64
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:100
+msgid "Pitch Bend"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:133
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:65
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:101
+msgid "Controller"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:135
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:66
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:102
+msgid "System Exclusive"
+msgstr ""
+
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:94
+msgid "RECORD events to ignore"
+msgstr ""
+
+#: ../src/gui/widgets/TimeWidget.cpp:101
+msgid "Note:"
+msgstr ""
+
+#: ../src/gui/widgets/TimeWidget.cpp:108 ../src/gui/widgets/TimeWidget.cpp:145
+msgid "<inexact>"
+msgstr ""
+
+#: ../src/gui/widgets/TimeWidget.cpp:151
+msgid "Units:"
+msgstr ""
+
+#: ../src/gui/widgets/TimeWidget.cpp:173
+msgid "Time:"
+msgstr ""
+
+#: ../src/gui/widgets/TimeWidget.cpp:184
+msgid "units"
+msgstr ""
+
+#: ../src/gui/widgets/TimeWidget.cpp:193
+msgid "Measures:"
+msgstr ""
+
+#: ../src/gui/widgets/TimeWidget.cpp:193
+msgid "Measure:"
+msgstr ""
+
+#: ../src/gui/widgets/TimeWidget.cpp:212
+msgid "beats:"
+msgstr ""
+
+#: ../src/gui/widgets/TimeWidget.cpp:212
+msgid "beat:"
+msgstr ""
+
+#: ../src/gui/widgets/TimeWidget.cpp:230
+msgid "%1:"
+msgstr ""
+
+#: ../src/gui/widgets/TimeWidget.cpp:254
+msgid "Seconds:"
+msgstr ""
+
+#: ../src/gui/widgets/TimeWidget.cpp:273
+msgid "msec:"
+msgstr ""
+
+#: ../src/gui/widgets/TimeWidget.cpp:407 ../src/gui/widgets/TimeWidget.cpp:531
+msgid "(%1/%2 time)"
+msgstr ""
+
+#: ../src/gui/widgets/TimeWidget.cpp:452
+msgid "(starting %1.%2 qpm, %2.%3 bpm)"
+msgstr ""
+
+#: ../src/gui/widgets/TimeWidget.cpp:458
+msgid "(starting %1.%2 bpm)"
+msgstr ""
+
+#: ../src/gui/widgets/TimeWidget.cpp:464
+msgid "(%1.%2 qpm, %2.%3 bpm)"
+msgstr ""
+
+#: ../src/gui/widgets/TimeWidget.cpp:470
+msgid "(%1.%2 bpm)"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:239
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:60
+msgid "C"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:241
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:61
+msgid "D"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:243
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:62
+msgid "E"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:244
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:63
+msgid "F"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:246
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:64
+msgid "G"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:248
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:65
+msgid "A"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:250
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:66
+msgid "B"
+msgstr ""
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:70
+msgid "-2"
+msgstr ""
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:71
+msgid "-1"
+msgstr ""
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:72
+msgid "0"
+msgstr ""
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:73
+msgid "1"
+msgstr ""
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:74
+msgid "2"
+msgstr ""
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:75
+msgid "3"
+msgstr ""
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:76
+msgid "4"
+msgstr ""
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:77
+msgid "5"
+msgstr ""
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:78
+msgid "6"
+msgstr ""
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:79
+msgid "7"
+msgstr ""
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:83
+msgid "double flat"
+msgstr ""
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:84
+msgid "flat"
+msgstr ""
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:85
+msgid "natural"
+msgstr ""
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:86
+msgid "sharp"
+msgstr ""
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:87
+msgid "double sharp"
+msgstr ""
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:234
+#, c-format
+msgid "In %1"
+msgstr ""
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:587
+#: ../src/gui/widgets/AudioRouteMenu.cpp:236
+#: ../src/gui/widgets/AudioRouteMenu.cpp:259
+msgid "Master"
+msgstr ""
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:528
+#: ../src/gui/widgets/AudioRouteMenu.cpp:238
+#: ../src/gui/widgets/AudioRouteMenu.cpp:261
+#, c-format
+msgid "Sub %1"
+msgstr ""
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:244
+msgid "In %1 R"
+msgstr ""
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:245
+msgid "In %1 L"
+msgstr ""
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:247
+msgid "Master R"
+msgstr ""
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:248
+msgid "Master L"
+msgstr ""
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:250
+msgid "Sub %1 R"
+msgstr ""
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:251
+msgid "Sub %1 L"
+msgstr ""
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:391
+#: ../src/gui/studio/AudioMixerWindow.cpp:522
+#: ../src/gui/widgets/AudioFaderBox.cpp:82
+msgid "Audio plugin button"
+msgstr ""
+
+#: ../src/gui/editors/parameters/AudioInstrumentParameterPanel.cpp:129
+#: ../src/gui/editors/parameters/AudioInstrumentParameterPanel.cpp:357
+#: ../src/gui/widgets/AudioFaderBox.cpp:91
+msgid "<no synth>"
+msgstr ""
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:93
+msgid "Synth plugin button"
+msgstr ""
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:153
+msgid "Set the audio pan position in the stereo field"
+msgstr ""
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:155
+msgid "Open synth plugin's native editor"
+msgstr ""
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:157
+msgid "Mono or Stereo Instrument"
+msgstr ""
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:159
+msgid "Record level"
+msgstr ""
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:161
+msgid "Playback level"
+msgstr ""
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:345
+#: ../src/gui/studio/AudioMixerWindow.cpp:347
+#: ../src/gui/studio/AudioMixerWindow.cpp:503
+#: ../src/gui/studio/AudioMixerWindow.cpp:505
+#: ../src/gui/widgets/AudioFaderBox.cpp:163
+msgid "Audio level"
+msgstr ""
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:170
+msgid "In:"
+msgstr ""
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:173
+msgid "Out:"
+msgstr ""
+
+#: ../src/gui/widgets/ProgressDialog.cpp:48
+#: ../src/gui/widgets/ProgressDialog.cpp:53
+#: ../src/gui/widgets/ProgressDialog.cpp:76
+msgid "Processing..."
+msgstr ""
+
+#: ../src/gui/configuration/ColourConfigurationPage.h:60
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:130
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:346
+#: ../src/gui/widgets/ColourTable.cpp:52
+msgid "Color"
+msgstr ""
+
+#: ../src/gui/widgets/ColourTable.cpp:68
+msgid "Modify Color Name"
+msgstr ""
+
+#: ../src/gui/configuration/ColourConfigurationPage.cpp:129
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:983
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:882
+#: ../src/gui/widgets/ColourTable.cpp:68
+msgid "Enter new name"
+msgstr ""
+
+#: ../src/gui/widgets/ColourTable.cpp:107
+msgid "Default Color"
+msgstr ""
+
+#: ../src/gui/widgets/Rotary.cpp:108
+msgid ""
+"Click and drag up and down or left and right to modify.\n"
+"Double click to edit value directly."
+msgstr ""
+
+#: ../src/gui/widgets/Rotary.cpp:433
+msgid "Select a new value"
+msgstr ""
+
+#: ../src/gui/widgets/Rotary.cpp:434
+msgid "Enter a new value"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:80
+msgid "Quantizer"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:86
+msgid "Quantizer type:"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:88
+msgid "Grid quantizer"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:89
+msgid "Legato quantizer"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:90
+msgid "Heuristic notation quantizer"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:94
+msgid "Quantize for notation only (leave performance unchanged)"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:104
+msgid "Notation parameters"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:109
+#: ../src/gui/widgets/QuantizeParameters.cpp:150
+msgid "Base grid unit:"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:114
+msgid "Complexity:"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:118
+msgid "Very high"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:119
+msgid "High"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:224
+#: ../src/gui/widgets/QuantizeParameters.cpp:120
+msgid "Normal"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:121
+msgid "Low"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:122
+msgid "Very low"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:125
+msgid "Tuplet level:"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:129
+msgid "2-in-the-time-of-3"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:4241
+#: ../src/gui/widgets/QuantizeParameters.cpp:130
+msgid "Triplet"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:138
+msgid "Any"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:141
+msgid "Permit counterpoint"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:145
+msgid "Grid parameters"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:154
+msgid "Swing:"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:159
+msgid "Iterative amount:"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:165
+msgid "Quantize durations as well as start times"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:169
+msgid "After quantization"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:183
+msgid "Show advanced options"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:192
+msgid "Re-beam"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:194
+msgid "Add articulations (staccato, tenuto, slurs)"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:195
+msgid "Tie notes at barlines etc"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:196
+msgid "Split-and-tie overlapping chords"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:307
+msgid "Full quantize"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:450
+msgid "Show Advanced Options"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:454
+msgid "Hide Advanced Options"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:257
+#: ../src/gui/configuration/MatrixConfigurationPage.h:56
+#: ../src/gui/configuration/MatrixConfigurationPage.h:57
+#: ../src/gui/editors/matrix/MatrixView.cpp:2709
+msgid "Matrix"
+msgstr ""
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:64
+msgid "Printable headers"
+msgstr ""
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:92
+msgid "Dedication"
+msgstr ""
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:96
+#: ../src/gui/editors/segment/PlayListView.cpp:35
+msgid "Title"
+msgstr ""
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:100
+msgid "Subtitle"
+msgstr ""
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:104
+msgid "Subsubtitle"
+msgstr ""
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:108
+msgid "Poet"
+msgstr ""
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:116
+msgid "Composer"
+msgstr ""
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:120
+msgid "Meter"
+msgstr ""
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:124
+msgid "Arranger"
+msgstr ""
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:128
+msgid "Piece"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:26
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:132
+msgid "Opus"
+msgstr ""
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:136
+msgid "Copyright"
+msgstr ""
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:140
+msgid "Tagline"
+msgstr ""
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:155
+msgid "The composition comes here."
+msgstr ""
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:172
+msgid "Non-printable headers"
+msgstr ""
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:213
+msgid "Add New Property"
+msgstr ""
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:217
+msgid "Delete Property"
+msgstr ""
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:236
+msgid "{new property %1}"
+msgstr ""
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:236
+msgid "{new property}"
+msgstr ""
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:243
+msgid "{undefined}"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:87
+msgid "Double-click opens segment in"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:91
+msgid "Notation editor"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:92
+msgid "Matrix editor"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:93
+msgid "Event List editor"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:99
+msgid "Number of count-in measures when recording"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:109
+msgid "Auto-save interval"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:112
+msgid "Every 30 seconds"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:113
+msgid "Every minute"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:114
+msgid "Every five minutes"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:115
+msgid "Every half an hour"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:116
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:277
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:157
+msgid "Never"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:140
+msgid "Use JACK transport"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:173
+msgid "Unknown"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:179
+msgid "No MIDI, audio OK"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:182
+msgid "MIDI OK, no audio"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:185
+msgid "MIDI OK, audio OK"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:188
+msgid "No driver"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:195
+msgid "Details..."
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:204
+msgid "Behavior"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:219
+msgid "Side-bar parameter box layout"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:223
+msgid "Vertically stacked"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:225
+msgid "Tabbed"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:233
+msgid "Note name style"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:237
+msgid "Always use US names (e.g. quarter, 8th)"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:238
+msgid "Localized (where available)"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:252
+msgid "Show textured background on"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:254
+msgid "Main window"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:275
+msgid "Use bundled Klearlook theme"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:278
+msgid "When not running under KDE"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:279
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:159
+msgid "Always"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:287
+msgid "Presentation"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:423
+msgid ""
+"Changes to the textured background in the main window will not take effect "
+"until you restart Rosegarden."
+msgstr ""
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:168
+#: ../src/gui/configuration/GeneralConfigurationPage.h:78
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:207
+#: ../src/gui/configuration/MatrixConfigurationPage.cpp:59
+msgid "General"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.h:79
+msgid "General Configuration"
+msgstr ""
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:92
+msgid "Base octave number for MIDI pitch display"
+msgstr ""
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:107
+msgid "Always use default studio when loading files"
+msgstr ""
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:119
+msgid "Send all MIDI Controllers at start of each playback"
+msgstr ""
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:121
+msgid ""
+"Rosegarden can send all MIDI Controllers (Pan, Reverb etc) to all MIDI "
+"devices every\n"
+"time you hit play if you so wish. Please note that this option will usually "
+"incur a\n"
+"delay at the start of playback due to the amount of data being transmitted."
+msgstr ""
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:138
+msgid "Sequencer timing source"
+msgstr ""
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:163
+msgid "Load SoundFont to SoundBlaster card at startup"
+msgstr ""
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:164
+msgid ""
+"Check this box to enable soundfont loading on EMU10K-based cards when "
+"Rosegarden is launched"
+msgstr ""
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:173
+msgid "Path to 'asfxload' or 'sfxload' command"
+msgstr ""
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:180
+msgid "SoundFont"
+msgstr ""
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:223
+msgid "MIDI Clock and System messages"
+msgstr ""
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:229
+msgid "Send MIDI Clock, Start and Stop"
+msgstr ""
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:230
+msgid "Accept Start, Stop and Continue"
+msgstr ""
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:241
+msgid "MIDI Machine Control mode"
+msgstr ""
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:248
+msgid "MMC Master"
+msgstr ""
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:249
+msgid "MMC Slave"
+msgstr ""
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:260
+msgid "MIDI Time Code mode"
+msgstr ""
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:267
+msgid "MTC Master"
+msgstr ""
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:268
+msgid "MTC Slave"
+msgstr ""
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:281
+msgid "Automatically connect sync output to all devices in use"
+msgstr ""
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:292
+msgid "MIDI Sync"
+msgstr ""
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:308
+msgid "sfxload path"
+msgstr ""
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:315
+msgid "Soundfont path"
+msgstr ""
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:67
+msgid "%1 minutes %2.%3%4 seconds (%5 units, %6 measures)"
+msgstr ""
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:133
+msgid "Filename:"
+msgstr ""
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:136
+msgid "Formal duration (to end marker):"
+msgstr ""
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:141
+msgid "Playing duration:"
+msgstr ""
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:146
+msgid "Tracks:"
+msgstr ""
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:147
+msgid "%1 used, %2 total"
+msgstr ""
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:152
+msgid "Segments:"
+msgstr ""
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:153
+msgid "%1 MIDI, %2 audio, %3 total"
+msgstr ""
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:161
+msgid "Statistics"
+msgstr ""
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:170
+#: ../src/gui/editors/parameters/InstrumentParameterBox.cpp:155
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:92
+msgid "Track"
+msgstr ""
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:171
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:125
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:90
+msgid "Label"
+msgstr ""
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:172
+msgid "Time"
+msgstr ""
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:174
+msgid "Events"
+msgstr ""
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:175
+msgid "Polyphony"
+msgstr ""
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:176
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:126
+msgid "Repeat"
+msgstr ""
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:178
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:128
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:305
+#: ../src/gui/general/EditView.cpp:1488
+msgid "Transpose"
+msgstr ""
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:179
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:129
+msgid "Delay"
+msgstr ""
+
+#: ../src/gui/configuration/AudioConfigurationPage.h:61
+#: ../src/gui/configuration/AudioPropertiesPage.h:58
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:204
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:523
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:524
+msgid "Audio"
+msgstr ""
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:204
+#: ../src/gui/configuration/MIDIConfigurationPage.h:62
+msgid "MIDI"
+msgstr ""
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:317
+msgid "Segment Summary"
+msgstr ""
+
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:63
+msgid "Audio file path:"
+msgstr ""
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:137
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:68
+msgid "Choose..."
+msgstr ""
+
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:73
+msgid "Disk space remaining:"
+msgstr ""
+
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:78
+msgid "Equivalent minutes of 16-bit stereo:"
+msgstr ""
+
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:90
+msgid "Modify audio path"
+msgstr ""
+
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:113
+msgid "%1 out of %2 (%3% used)"
+msgstr ""
+
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:144
+msgid "minutes at"
+msgstr ""
+
+#: ../src/gui/configuration/MIDIConfigurationPage.h:63
+msgid "MIDI Settings"
+msgstr ""
+
+#: ../src/gui/configuration/AudioConfigurationPage.h:62
+#: ../src/gui/configuration/AudioPropertiesPage.h:59
+msgid "Audio Settings"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:87
+msgid "Default layout mode"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:91
+msgid "Linear layout"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:92
+msgid "Continuous page layout"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:93
+msgid "Multiple page layout"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:101
+msgid "Default spacing"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:125
+msgid "Default duration factor"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:141
+msgid "Full"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:152
+msgid "Show track headers (linear layout only)"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:158
+msgid "When needed"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:166
+msgid ""
+"\"Always\" and \"Never\" mean what they usually mean\n"
+"\"When needed\" means \"when staves are too many to all fit in the current "
+"window\""
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:178
+msgid "Show non-notation events as question marks"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:188
+msgid "Show notation-quantized notes in a different color"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:198
+msgid "Show \"invisible\" events in grey"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:208
+msgid "Show notes outside suggested playable range in red"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:218
+msgid "Highlight superimposed notes with a halo effect"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:231
+msgid "When recording MIDI, split-and-tie long notes at barlines"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:242
+msgid "Layout"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:255
+msgid "Default note style for new notes"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:287
+msgid "When inserting notes..."
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:294
+msgid "Split notes into ties to make durations match"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:295
+msgid "Ignore existing durations"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:305
+msgid "Auto-beam on insert when appropriate"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:317
+#: ../src/gui/editors/notation/NotationEraser.cpp:54
+msgid "Collapse rests after erase"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:328
+msgid "Default paste type"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:350
+msgid "Editing"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:362
+msgid "Accidentals in one octave..."
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:364
+msgid "Affect only that octave"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:365
+msgid "Require cautionaries in other octaves"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:366
+msgid "Affect all subsequent octaves"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:374
+msgid "Accidentals in one bar..."
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:376
+msgid "Affect only that bar"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:377
+msgid "Require cautionary resets in following bar"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:378
+msgid "Require explicit resets in following bar"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:386
+msgid "Key signature cancellation style"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:388
+msgid "Cancel only when entering C major or A minor"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:389
+msgid "Cancel whenever removing sharps or flats"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:390
+msgid "Cancel always"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:400
+msgid "Accidentals"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:441
+msgid "Notation font"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:467
+msgid "Origin:"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:471
+msgid "Copyright:"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:475
+msgid "Mapped by:"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:479
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:81
+msgid "Type:"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:508
+msgid "Font size for single-staff views"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:516
+msgid "Font size for multi-staff views"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:524
+msgid "Font size for printing (pt)"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:541
+msgid "Text font"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:549
+msgid "Sans-serif font"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:664
+msgid "%1 (smooth)"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:667
+msgid "%1 (jaggy)"
+msgstr ""
+
+#: ../src/gui/configuration/LatencyConfigurationPage.cpp:58
+msgid "JACK latency"
+msgstr ""
+
+#: ../src/gui/configuration/LatencyConfigurationPage.cpp:61
+msgid ""
+"Use the \"Fetch JACK latencies\" button to discover the latency values set "
+"at\n"
+"the sequencer. It's recommended that you use the returned values but it's "
+"also\n"
+"possible to override them manually using the sliders. Note that if you "
+"change\n"
+"your JACK server parameters you should always fetch the latency values "
+"again.\n"
+"The latency values will be stored by Rosegarden for use next time."
+msgstr ""
+
+#: ../src/gui/configuration/LatencyConfigurationPage.cpp:65
+msgid "JACK playback latency (in ms)"
+msgstr ""
+
+#: ../src/gui/configuration/LatencyConfigurationPage.cpp:66
+msgid "JACK record latency (in ms)"
+msgstr ""
+
+#: ../src/gui/configuration/LatencyConfigurationPage.cpp:68
+msgid "Fetch JACK latencies"
+msgstr ""
+
+#: ../src/gui/configuration/LatencyConfigurationPage.cpp:121
+msgid "JACK Latency"
+msgstr ""
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:92
+msgid "Audio preview scale"
+msgstr ""
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:96
+msgid "Linear - easier to see loud peaks"
+msgstr ""
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:97
+msgid "Meter scaling - easier to see quiet activity"
+msgstr ""
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:105
+msgid "Record audio files as"
+msgstr ""
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:107
+msgid "16-bit PCM WAV format (smaller files)"
+msgstr ""
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:108
+msgid "32-bit float WAV format (higher quality)"
+msgstr ""
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:117
+msgid "External audio editor"
+msgstr ""
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:145
+msgid "Create JACK outputs"
+msgstr ""
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:150
+msgid "for individual audio instruments"
+msgstr ""
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:157
+msgid "for submasters"
+msgstr ""
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:184
+msgid ""
+"Rosegarden can start the JACK audio daemon (jackd) for you automatically if "
+"it isn't already running when Rosegarden starts.\n"
+"\n"
+"This is recommended for beginners and those who use Rosegarden as their main "
+"audio application, but it might not be to the liking of advanced users.\n"
+"\n"
+"If you want to start JACK automatically, make sure the command includes a "
+"full path where necessary as well as any command-line arguments you want to "
+"use.\n"
+"\n"
+"For example: /usr/local/bin/jackd -d alsa -d hw -r44100 -p 2048 -n 2\n"
+"\n"
+msgstr ""
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:196
+msgid "Start JACK when Rosegarden starts"
+msgstr ""
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:201
+msgid "JACK command"
+msgstr ""
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:214
+msgid "JACK Startup"
+msgstr ""
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:224
+msgid "External audio editor path"
+msgstr ""
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:262
+msgid "External audio editor \"%1\" not found or not executable"
+msgstr ""
+
+#: ../src/gui/configuration/ColourConfigurationPage.cpp:70
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:448
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:863
+msgid "Add New Color"
+msgstr ""
+
+#: ../src/gui/configuration/ColourConfigurationPage.cpp:74
+msgid "Delete Color"
+msgstr ""
+
+#: ../src/gui/configuration/ColourConfigurationPage.cpp:93
+msgid "Color Map"
+msgstr ""
+
+#: ../src/gui/configuration/ColourConfigurationPage.cpp:128
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:983
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:882
+msgid "New Color Name"
+msgstr ""
+
+#: ../src/gui/configuration/ColourConfigurationPage.cpp:130
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:59
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:984
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:883
+#: ../src/gui/studio/DeviceManagerDialog.cpp:115
+#: ../src/gui/studio/DeviceManagerDialog.cpp:174
+msgid "New"
+msgstr ""
+
+#: ../src/gui/configuration/LatencyConfigurationPage.h:62
+msgid "Latency"
+msgstr ""
+
+#: ../src/gui/configuration/LatencyConfigurationPage.h:63
+msgid "Sequencer Latency"
+msgstr ""
+
+#: ../src/gui/configuration/ColourConfigurationPage.h:61
+msgid "Color Settings"
+msgstr ""
+
+#: ../src/gui/studio/MidiDeviceListViewItem.cpp:55
+#: ../src/gui/studio/MidiKeyMapListViewItem.cpp:44
+msgid "Key Mapping"
+msgstr ""
+
+#: ../src/gui/studio/BankEditorDialog.cpp:97
+msgid "Manage MIDI Banks and Programs"
+msgstr ""
+
+#: ../src/gui/studio/BankEditorDialog.cpp:128
+msgid "MIDI Device"
+msgstr ""
+
+#: ../src/gui/studio/BankEditorDialog.cpp:130
+#: ../src/gui/studio/BankEditorDialog.cpp:219
+msgid "MSB"
+msgstr ""
+
+#: ../src/gui/studio/BankEditorDialog.cpp:131
+#: ../src/gui/studio/BankEditorDialog.cpp:218
+msgid "LSB"
+msgstr ""
+
+#: ../src/gui/studio/BankEditorDialog.cpp:140
+msgid "Add Bank"
+msgstr ""
+
+#: ../src/gui/studio/BankEditorDialog.cpp:141
+msgid "Add Key Mapping"
+msgstr ""
+
+#: ../src/gui/studio/BankEditorDialog.cpp:153
+msgid "Add a Bank to the current device"
+msgstr ""
+
+#: ../src/gui/studio/BankEditorDialog.cpp:157
+msgid "Add a Percussion Key Mapping to the current device"
+msgstr ""
+
+#: ../src/gui/studio/BankEditorDialog.cpp:161
+msgid "Delete the current Bank or Key Mapping"
+msgstr ""
+
+#: ../src/gui/studio/BankEditorDialog.cpp:165
+msgid "Delete all Banks and Key Mappings from the current Device"
+msgstr ""
+
+#: ../src/gui/studio/BankEditorDialog.cpp:167
+#: ../src/gui/studio/DeviceManagerDialog.cpp:117
+msgid "Import..."
+msgstr ""
+
+#: ../src/gui/studio/BankEditorDialog.cpp:168
+#: ../src/gui/studio/DeviceManagerDialog.cpp:118
+msgid "Export..."
+msgstr ""
+
+#: ../src/gui/studio/BankEditorDialog.cpp:176
+msgid ""
+"Import Bank and Program data from a Rosegarden file to the current Device"
+msgstr ""
+
+#: ../src/gui/studio/BankEditorDialog.cpp:179
+msgid ""
+"Export all Device and Bank information to a Rosegarden format interchange "
+"file"
+msgstr ""
+
+#: ../src/gui/studio/BankEditorDialog.cpp:190
+msgid "Copy all Program names from current Bank to clipboard"
+msgstr ""
+
+#: ../src/gui/studio/BankEditorDialog.cpp:194
+msgid "Paste Program names from clipboard to current Bank"
+msgstr ""
+
+#: ../src/gui/studio/BankEditorDialog.cpp:216
+msgid "Show Variation list based on "
+msgstr ""
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1010
+msgid "<new bank>"
+msgstr ""
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1046
+msgid "<new mapping>"
+msgstr ""
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1048
+msgid "<new mapping %1>"
+msgstr ""
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1089
+msgid "Really delete this bank?"
+msgstr ""
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1137
+msgid "Really delete this key mapping?"
+msgstr ""
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1187
+msgid "Really delete all banks for "
+msgstr ""
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1476
+msgid "Import Banks from Device in File"
+msgstr ""
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1623
+#: ../src/gui/studio/DeviceManagerDialog.cpp:770
+msgid "Export Device as..."
+msgstr ""
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1694
+msgid ""
+"There are unsaved changes.\n"
+"Do you want to apply the changes before exiting the Bank Editor or discard "
+"the changes ?"
+msgstr ""
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1697
+msgid "Unsaved Changes"
+msgstr ""
+
+#: ../src/gui/studio/NameSetEditor.cpp:68
+msgid "Librarian"
+msgstr ""
+
+#: ../src/gui/studio/NameSetEditor.cpp:75
+msgid "Email"
+msgstr ""
+
+#: ../src/gui/studio/NameSetEditor.cpp:80
+msgid ""
+"The librarian maintains the Rosegarden device data for this device.\n"
+"If you've made modifications to suit your own device, it might be worth\n"
+"liaising with the librarian in order to publish your information for the "
+"benefit\n"
+"of others."
+msgstr ""
+
+#: ../src/gui/studio/MidiBankListViewItem.cpp:51
+#: ../src/gui/studio/MidiDeviceListViewItem.cpp:48
+msgid "Percussion Bank"
+msgstr ""
+
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:84
+#: ../src/gui/studio/MidiBankListViewItem.cpp:51
+#: ../src/gui/studio/MidiDeviceListViewItem.cpp:48
+msgid "Bank"
+msgstr ""
+
+#: ../src/gui/studio/ChangeRecordDeviceCommand.h:39
+msgid "Change Record Device"
+msgstr ""
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:61
+#: ../src/gui/studio/DeviceManagerDialog.cpp:96
+msgid "Manage MIDI Devices"
+msgstr ""
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:98
+msgid "Play devices"
+msgstr ""
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:76
+#: ../src/gui/studio/DeviceManagerDialog.cpp:106
+#: ../src/gui/studio/DeviceManagerDialog.cpp:165
+msgid "Connection"
+msgstr ""
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:119
+msgid "Banks..."
+msgstr ""
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:120
+msgid "Control Events..."
+msgstr ""
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:126
+msgid "Create a new Play device"
+msgstr ""
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:129
+#: ../src/gui/studio/DeviceManagerDialog.cpp:184
+msgid "Delete the selected device"
+msgstr ""
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:132
+msgid ""
+"Import Bank, Program and Controller data from a Rosegarden file to the "
+"selected device"
+msgstr ""
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:135
+msgid "Export Bank and Controller data to a Rosegarden interchange file"
+msgstr ""
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:138
+msgid "View and edit Banks and Programs for the selected device"
+msgstr ""
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:141
+msgid ""
+"View and edit Control Events for the selected device - these are special "
+"Event types that you can define against your device and control through "
+"Control Rulers or the Instrument Parameter Box "
+msgstr ""
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:156
+msgid "Record devices"
+msgstr ""
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:164
+msgid "Current"
+msgstr ""
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:181
+msgid "Create a new Record device"
+msgstr ""
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:360
+#: ../src/gui/studio/DeviceEditorDialog.cpp:378
+#: ../src/gui/studio/DeviceManagerDialog.cpp:486
+#: ../src/gui/studio/DeviceManagerDialog.cpp:501
+msgid "New Device"
+msgstr ""
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:703
+msgid "Import from Device in File"
+msgstr ""
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:55
+msgid "Remap Instrument assigments..."
+msgstr ""
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:62
+msgid "Device or Instrument"
+msgstr ""
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:65
+msgid "Remap Tracks by all Instruments on a Device or by single Instrument"
+msgstr ""
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:74
+msgid "Choose Source and Destination"
+msgstr ""
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:77
+msgid "From"
+msgstr ""
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:78
+msgid "To"
+msgstr ""
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:120
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:121
+msgid "<no devices>"
+msgstr ""
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:155
+msgid "Show Audio &Faders"
+msgstr ""
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:160
+msgid "Show Synth &Faders"
+msgstr ""
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:165
+msgid "Show &Submasters"
+msgstr ""
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:170
+msgid "Show &Plugin Buttons"
+msgstr ""
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:175
+msgid "Show &Unassigned Faders"
+msgstr ""
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:184
+#, c-format
+msgid ""
+"_n: 1 Input\n"
+"%n Inputs"
+msgstr ""
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:194
+msgid "No Submasters"
+msgstr ""
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:203
+#, c-format
+msgid ""
+"_n: 1 Submaster\n"
+"%n Submasters"
+msgstr ""
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:279
+msgid "Audio Mixer"
+msgstr ""
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:311
+msgid "Record input source"
+msgstr ""
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:322
+msgid "Output destination"
+msgstr ""
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:336
+#: ../src/gui/studio/AudioMixerWindow.cpp:495
+msgid "Pan"
+msgstr ""
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:355
+msgid "Mono or stereo"
+msgstr ""
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:364
+#: ../src/gui/studio/AudioMixerWindow.cpp:513
+msgid "Mute"
+msgstr ""
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:373 rc.cpp:408
+#, no-c-format
+msgid "Solo"
+msgstr ""
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:382
+msgid "Arm recording"
+msgstr ""
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:400
+#, c-format
+msgid "Audio %1"
+msgstr ""
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:404
+#, c-format
+msgid "Synth %1"
+msgstr ""
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:578
+#: ../src/gui/studio/AudioMixerWindow.cpp:580
+msgid "Audio master output level"
+msgstr ""
+
+#: ../src/gui/studio/SynthPluginManagerDialog.cpp:71
+msgid "Manage Synth Plugins"
+msgstr ""
+
+#: ../src/gui/studio/SynthPluginManagerDialog.cpp:78
+msgid "Synth plugins"
+msgstr ""
+
+#: ../src/gui/studio/SynthPluginManagerDialog.cpp:145
+msgid "Controls"
+msgstr ""
+
+#: ../src/gui/studio/SynthPluginManagerDialog.cpp:152
+msgid "Editor >>"
+msgstr ""
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:66
+#: ../src/gui/studio/MidiProgramsEditor.cpp:169
+msgid "Bank and Program details"
+msgstr ""
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:67
+msgid "Programs"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2711
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:88
+#: ../src/gui/studio/MidiProgramsEditor.cpp:93
+msgid "Percussion"
+msgstr ""
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:99
+msgid "MSB Value"
+msgstr ""
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:107
+msgid ""
+"Selects a MSB controller Bank number (MSB/LSB pairs are always unique for "
+"any Device)"
+msgstr ""
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:111
+msgid ""
+"Selects a LSB controller Bank number (MSB/LSB pairs are always unique for "
+"any Device)"
+msgstr ""
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:116
+msgid "LSB Value"
+msgstr ""
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:254
+#: ../src/gui/studio/MidiProgramsEditor.cpp:541
+#, c-format
+msgid "Key Mapping: %1"
+msgstr ""
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:476
+msgid "<no key mapping>"
+msgstr ""
+
+#: ../src/gui/studio/MidiKeyMappingEditor.cpp:57
+#: ../src/gui/studio/MidiKeyMappingEditor.cpp:81
+msgid "Key Mapping details"
+msgstr ""
+
+#: ../src/gui/studio/MidiKeyMappingEditor.cpp:58
+msgid "Pitches"
+msgstr ""
+
+#: ../src/gui/studio/MidiMixerWindow.cpp:152
+msgid "MIDI Mixer"
+msgstr ""
+
+#: ../src/gui/studio/MidiMixerWindow.cpp:199
+msgid "Volume"
+msgstr ""
+
+#: ../src/gui/studio/AudioPluginOSCGUIManager.cpp:444
+msgid "Rosegarden Plugin"
+msgstr ""
+
+#: ../src/gui/studio/AudioPluginOSCGUIManager.cpp:447
+#, c-format
+msgid "Rosegarden: %1"
+msgstr ""
+
+#: ../src/gui/studio/AudioPluginOSCGUIManager.cpp:449
+msgid "Rosegarden: %1: %2"
+msgstr ""
+
+#: ../src/gui/studio/AudioPluginOSCGUIManager.cpp:450
+#, c-format
+msgid "Plugin slot %1"
+msgstr ""
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:92
+msgid "Add Play Device"
+msgstr ""
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:93
+msgid "Add Record Device"
+msgstr ""
+
+#: ../src/commands/studio/CreateOrDeleteDeviceCommand.h:68
+#: ../src/gui/studio/DeviceEditorDialog.cpp:94
+msgid "Delete Device"
+msgstr ""
+
+#: ../src/gui/editors/segment/PlayList.cpp:77
+#: ../src/gui/studio/DeviceEditorDialog.cpp:156
+#: ../src/gui/studio/DeviceEditorDialog.cpp:361
+msgid "Play"
+msgstr ""
+
+#: ../src/commands/segment/SegmentRecordCommand.cpp:37
+#: ../src/gui/studio/DeviceEditorDialog.cpp:156
+#: ../src/gui/studio/DeviceEditorDialog.cpp:379 rc.cpp:394
+#, no-c-format
+msgid "Record"
+msgstr ""
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:256
+msgid "Apply pending changes?"
+msgstr ""
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:359
+#: ../src/gui/studio/DeviceEditorDialog.cpp:377
+msgid "<new device>"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentEraser.cpp:82
+msgid "Click on a segment to delete it"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSplitter.cpp:166
+msgid ""
+"Click on a segment to split it in two; hold Shift to avoid snapping to beat "
+"grid"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSplitter.cpp:168
+msgid "Click on a segment to split it in two"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:81
+msgid "Click and drag to select segments"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentMover.cpp:154
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:238
+msgid "Move Segment"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentMover.cpp:154
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:239
+msgid "Move Segments"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:217
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:169
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:141
+#: ../src/gui/editors/segment/segmentcanvas/SegmentMover.cpp:210
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:255
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:359
+msgid "Hold Shift to avoid snapping to beat grid"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:485
+msgid ""
+"Click and drag to select segments; middle-click and drag to draw an empty "
+"segment"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:384
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:502
+msgid ""
+"Click and drag to resize a segment; hold Ctrl as well to rescale its contents"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:386
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:504
+msgid "Click and drag to rescale segment"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:509
+msgid "Click and drag to move segments; hold Ctrl as well to copy them"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:511
+msgid "Click and drag to copy segments"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:515
+msgid ""
+"Click and drag to move segment; hold Ctrl as well to copy it; double-click "
+"to edit"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:517
+msgid "Click and drag to copy segment"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:157
+msgid ""
+"The audio file path does not exist or is not writable.\n"
+"You must set the audio file path to a valid directory in Document Properties "
+"before rescaling an audio file.\n"
+"Would you like to set it now?"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:261
+msgid ""
+"Hold Shift to avoid snapping to beat grid; hold Ctrl as well to rescale "
+"contents"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentMover.cpp:325
+msgid "Click and drag to move a segment"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentPencil.cpp:225
+msgid "Hold Shift to avoid snapping to bar lines"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentPencil.cpp:283
+msgid "Record or drop audio here"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentPencil.cpp:289
+msgid ""
+"Click and drag to draw an empty segment. Control+Alt click and drag to draw "
+"in overlap mode."
+msgstr ""
+
+#: ../src/gui/editors/segment/TrackLabel.cpp:77
+msgid ""
+"Click and hold with left mouse button to assign this Track to an Instrument."
+msgstr ""
+
+#: ../src/gui/editors/segment/TrackLabel.cpp:191
+msgid "Change track name"
+msgstr ""
+
+#: ../src/gui/editors/segment/TrackLabel.cpp:192
+msgid "Enter new track name"
+msgstr ""
+
+#: ../src/gui/editors/segment/TrackEditor.cpp:648
+msgid "Turn Repeating Segment into Real Copies"
+msgstr ""
+
+#: ../src/gui/editors/segment/TrackEditor.cpp:650
+msgid "Turn Repeating Segments into Real Copies"
+msgstr ""
+
+#: ../src/gui/editors/segment/TrackEditor.cpp:814
+msgid ""
+"You can't drop files into Rosegarden from this client. Try using Konqueror "
+"instead."
+msgstr ""
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:85
+msgid "Manage Triggered Segments"
+msgstr ""
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:89
+msgid "ID"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:735
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:93
+msgid "Base velocity"
+msgstr ""
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:94
+msgid "Triggers"
+msgstr ""
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:115
+msgid "Add a Triggered Segment"
+msgstr ""
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:119
+msgid "Delete a Triggered Segment"
+msgstr ""
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:123
+msgid "Delete All Triggered Segments"
+msgstr ""
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:127
+msgid "Close the Triggered Segment Manager"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:169
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:245
+msgid "<no label>"
+msgstr ""
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:248
+msgid ""
+"_n: %1 on 1 track\n"
+"%1 on %n tracks"
+msgstr ""
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:284
+msgid ""
+"This will remove all triggered segments from the whole composition. Are you "
+"sure?"
+msgstr ""
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:288
+msgid "Remove all triggered segments"
+msgstr ""
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:313
+msgid "Trigger Segment Duration"
+msgstr ""
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:336
+#, c-format
+msgid ""
+"_n: This triggered segment is used 1 time in the current composition. Are "
+"you sure you want to remove it?\n"
+"This triggered segment is used %n times in the current composition. Are you "
+"sure you want to remove it?"
+msgstr ""
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:400
+msgid "Pa&ste as New Triggered Segment"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1169
+#: ../src/gui/editors/segment/MarkerEditor.cpp:399
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:412
+#: ../src/gui/editors/tempo/TempoView.cpp:622
+msgid "&Musical Times"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1179
+#: ../src/gui/editors/segment/MarkerEditor.cpp:409
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:422
+#: ../src/gui/editors/tempo/TempoView.cpp:632
+msgid "&Real Times"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1189
+#: ../src/gui/editors/segment/MarkerEditor.cpp:419
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:432
+#: ../src/gui/editors/tempo/TempoView.cpp:642
+msgid "Ra&w Times"
+msgstr ""
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:83
+msgid "Manage Markers"
+msgstr ""
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:86
+msgid "Marker time "
+msgstr ""
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:87
+msgid "Marker text "
+msgstr ""
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:88
+msgid "Marker description "
+msgstr ""
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:95
+msgid "Pointer position"
+msgstr ""
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:100
+msgid "Real time:"
+msgstr ""
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:103
+msgid "In measure:"
+msgstr ""
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:121
+msgid "Add a Marker"
+msgstr ""
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:125
+msgid "Delete a Marker"
+msgstr ""
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:129
+msgid "Delete All Markers"
+msgstr ""
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:133
+msgid "Close the Marker Editor"
+msgstr ""
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:296
+msgid "Remove all markers"
+msgstr ""
+
+#: ../src/gui/editors/segment/PlayList.cpp:76
+msgid "Add..."
+msgstr ""
+
+#: ../src/gui/editors/segment/PlayList.cpp:78
+msgid "Move Up"
+msgstr ""
+
+#: ../src/gui/editors/segment/PlayList.cpp:79
+msgid "Move Down"
+msgstr ""
+
+#: ../src/gui/editors/segment/PlayList.cpp:124
+msgid "Select one or more Rosegarden files"
+msgstr ""
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:73
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:55
+msgid "<not showing>"
+msgstr ""
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:89
+msgid "Manage Control Events"
+msgstr ""
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:91
+msgid "<no device>"
+msgstr ""
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:99
+msgid " Control Events for %1 (device %2)"
+msgstr ""
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:104
+msgid "Control Event name "
+msgstr ""
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:105
+msgid "Control Event type "
+msgstr ""
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:106
+msgid "Control Event value "
+msgstr ""
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:107
+msgid "Description "
+msgstr ""
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:108
+msgid "Min "
+msgstr ""
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:109
+msgid "Max "
+msgstr ""
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:110
+msgid "Default "
+msgstr ""
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:111
+msgid "Color "
+msgstr ""
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:112
+msgid "Position on instrument panel"
+msgstr ""
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:136
+msgid "Add a Control Parameter to the Studio"
+msgstr ""
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:140
+msgid "Delete a Control Parameter from the Studio"
+msgstr ""
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:144
+msgid "Close the Control Parameter editor"
+msgstr ""
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:221
+msgid "<default>"
+msgstr ""
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:62
+msgid "Edit Control Parameter"
+msgstr ""
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:71
+msgid "Control Event Properties"
+msgstr ""
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:77
+msgid "Name:"
+msgstr ""
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:93
+msgid "Control Event value:"
+msgstr ""
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:97
+msgid "Minimum value:"
+msgstr ""
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:101
+msgid "Maximum value:"
+msgstr ""
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:105
+msgid "Default value:"
+msgstr ""
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:109
+msgid "Color:"
+msgstr ""
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:113
+msgid "Instrument Parameter Box position:"
+msgstr ""
+
+#: ../src/gui/editors/segment/TrackButtons.cpp:209
+#: ../src/gui/editors/segment/TrackButtons.cpp:585
+#: ../src/gui/editors/segment/TrackButtons.cpp:935
+#: ../src/gui/editors/segment/TrackButtons.cpp:1127
+msgid "<no instrument>"
+msgstr ""
+
+#: ../src/gui/editors/segment/TrackButtons.cpp:352
+#: ../src/gui/editors/segment/TrackButtons.cpp:1094
+msgid "<untitled audio>"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:130
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:662
+#: ../src/gui/editors/segment/TrackButtons.cpp:354
+#: ../src/gui/editors/segment/TrackButtons.cpp:1096
+msgid "<untitled>"
+msgstr ""
+
+#: ../src/gui/editors/segment/TrackButtons.cpp:1058
+msgid "Mute track"
+msgstr ""
+
+#: ../src/gui/editors/segment/TrackButtons.cpp:1063
+msgid "Record on this track"
+msgstr ""
+
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:88
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:1015
+msgid "Segment"
+msgstr ""
+
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:89
+msgid "Segment Parameters"
+msgstr ""
+
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:366
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:697
+msgid "%1 ms"
+msgstr ""
+
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:1031
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:910
+msgid "Highest playable note"
+msgstr ""
+
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:1051
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:930
+msgid "Lowest playable note"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:93
+msgid "Track Parameters"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:137
+msgid "Playback parameters"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:172
+msgid "Recording filters"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:191
+msgid "Channel"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:203
+msgid "Staff export options"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:220
+msgid "Notation size:"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:225
+msgid "Small"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:226
+msgid "Tiny"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:233
+msgid "Bracket type:"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:237
+msgid "-----"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:238
+msgid "[----"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:239
+msgid "----]"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:240
+msgid "[---]"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:241
+msgid "{----"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:242
+msgid "----}"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:243
+msgid "{[---"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:244
+msgid "---]}"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:253
+msgid "Create segments with"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:264
+msgid "Preset"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:272
+msgid "Load"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:282
+msgid "treble"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:283
+msgid "bass"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:284
+msgid "crotales"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:285
+msgid "xylophone"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:286
+msgid "guitar"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:287
+msgid "contrabass"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:288
+msgid "celesta"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:289
+msgid "old celesta"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:290
+msgid "french"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:291
+msgid "soprano"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:292
+msgid "mezzosoprano"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:293
+msgid "alto"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:294
+msgid "tenor"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:295
+msgid "baritone"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:296
+msgid "varbaritone"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:297
+msgid "subbass"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:327
+msgid "Lowest"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:329
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:336
+msgid "---"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:331
+msgid "Choose the lowest suggested playable note, using a staff"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:334
+msgid "Highest"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:338
+msgid "Choose the highest suggested playable note, using a staff"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:666
+msgid "[ Track %1 - %2 ]"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:985
+msgid "The instrument preset database is corrupt. Check your installation."
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:173
+#: ../src/gui/editors/parameters/InstrumentParameterBox.cpp:54
+msgid "Instrument Parameters"
+msgstr ""
+
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:85
+msgid "Variation"
+msgstr ""
+
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:86
+msgid "Program"
+msgstr ""
+
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:87
+msgid "Channel out"
+msgstr ""
+
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:215
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:221
+msgid "[ %1 ]"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixEraser.cpp:58
+#: ../src/gui/editors/matrix/MatrixMover.cpp:71
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:67
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:77
+msgid "Switch to Draw Tool"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:75
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:69
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:71
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:81
+#: ../src/gui/editors/notation/ClefInserter.cpp:57
+#: ../src/gui/editors/notation/GuitarChordInserter.cpp:63
+#: ../src/gui/editors/notation/NotationSelector.cpp:87
+#: ../src/gui/editors/notation/NoteInserter.cpp:113
+#: ../src/gui/editors/notation/RestInserter.cpp:72
+#: ../src/gui/editors/notation/TextInserter.cpp:61
+msgid "Switch to Erase Tool"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixEraser.cpp:62
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:73
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:75
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:85
+msgid "Switch to Move Tool"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixEraser.cpp:68
+#: ../src/gui/editors/matrix/MatrixMover.cpp:81
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:79
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:93
+msgid "Switch to Resize Tool"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:446
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:579
+msgid "Click and drag to select; middle-click and drag to draw new note"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:324
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:597
+msgid "Click and drag to resize selected notes"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:599
+msgid "Click and drag to resize note"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:471
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:604
+msgid "Click and drag to move selected notes; hold Ctrl as well to copy"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:473
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:606
+msgid "Click and drag to copy selected notes"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:610
+msgid "Click and drag to move note; hold Ctrl as well to copy"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:612
+msgid "Click and drag to copy note"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixEraser.cpp:54
+#: ../src/gui/editors/matrix/MatrixMover.cpp:67
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:65
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:63
+#: ../src/gui/editors/notation/ClefInserter.cpp:53
+#: ../src/gui/editors/notation/GuitarChordInserter.cpp:59
+#: ../src/gui/editors/notation/NotationEraser.cpp:67
+#: ../src/gui/editors/notation/NoteInserter.cpp:109
+#: ../src/gui/editors/notation/RestInserter.cpp:68
+#: ../src/gui/editors/notation/TextInserter.cpp:57
+msgid "Switch to Select Tool"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:218
+msgid "Resize Event"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:221
+msgid "Resize Events"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:326
+msgid "Click and drag to resize a note"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:328
+msgid "Copy and Move Event"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:330
+msgid "Copy and Move Events"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:334
+msgid "Move Event"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:336
+msgid "Move Events"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:465
+msgid "Click and drag to move a note; hold Ctrl as well to copy it"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:467
+msgid "Click and drag to copy a note"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:361
+msgid "Click and drag to draw a note; Shift to avoid snapping to grid"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:363
+msgid "Click and drag to draw a note"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:437
+#: ../src/gui/editors/matrix/MatrixView.cpp:3053
+msgid "Couldn't apply piano roll layout"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:663
+msgid "Resi&ze"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:669
+#: ../src/gui/editors/notation/NotationView.cpp:1919
+msgid "C&hord Insert Mode"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:676
+#: ../src/gui/editors/notation/NotationView.cpp:1778
+msgid "Ste&p Recording"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:694
+msgid "&Legato"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:708
+msgid "Set to Current Velocity"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:712
+msgid "Set Event &Velocities..."
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:716
+msgid "Trigger Se&gment..."
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:720
+msgid "Remove Triggers..."
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1153
+#: ../src/gui/editors/matrix/MatrixView.cpp:724
+#: ../src/gui/editors/tempo/TempoView.cpp:606
+msgid "Select &All"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:732
+#: ../src/gui/editors/notation/NotationView.cpp:2325
+msgid "Cursor &Back"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:736
+#: ../src/gui/editors/notation/NotationView.cpp:2329
+msgid "Cursor &Forward"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:740
+#: ../src/gui/editors/notation/NotationView.cpp:2333
+msgid "Cursor Ba&ck Bar"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:744
+#: ../src/gui/editors/notation/NotationView.cpp:2337
+msgid "Cursor For&ward Bar"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:748
+#: ../src/gui/editors/notation/NotationView.cpp:2341
+msgid "Cursor Back and Se&lect"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:752
+#: ../src/gui/editors/notation/NotationView.cpp:2345
+msgid "Cursor Forward and &Select"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:756
+#: ../src/gui/editors/notation/NotationView.cpp:2349
+msgid "Cursor Back Bar and Select"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:760
+#: ../src/gui/editors/notation/NotationView.cpp:2353
+msgid "Cursor Forward Bar and Select"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:764
+#: ../src/gui/editors/notation/NotationView.cpp:2363
+msgid "Cursor to St&art"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:770
+#: ../src/gui/editors/notation/NotationView.cpp:2369
+msgid "Cursor to &End"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:776
+#: ../src/gui/editors/notation/NotationView.cpp:2391
+msgid "Cursor to &Playback Pointer"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:820
+#: ../src/gui/editors/notation/NotationView.cpp:2435
+msgid "Playback Pointer to &Cursor"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:826
+#: ../src/gui/editors/notation/NotationView.cpp:2441
+msgid "&Solo"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:841
+#: ../src/gui/editors/notation/NotationView.cpp:2456
+msgid "Set Loop to Selection"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:845
+#: ../src/gui/editors/notation/NotationView.cpp:2460
+msgid "Clear L&oop"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1157
+#: ../src/gui/editors/matrix/MatrixView.cpp:849
+#: ../src/gui/editors/notation/NotationView.cpp:2464
+#: ../src/gui/editors/tempo/TempoView.cpp:610
+msgid "Clear Selection"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1149
+#: ../src/gui/editors/matrix/MatrixView.cpp:854
+#: ../src/gui/editors/notation/NotationView.cpp:2471
+msgid "&Filter Selection"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:879
+msgid "&No Snap"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:884
+msgid "Snap to Bea&t"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:888
+msgid "Snap to &Bar"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:908
+#, c-format
+msgid "Snap to %1"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:917
+msgid "Show Instrument Parameters"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:922
+#: ../src/gui/editors/notation/NotationView.cpp:1850
+msgid "Show Ch&ord Name Ruler"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:926
+#: ../src/gui/editors/notation/NotationView.cpp:1858
+msgid "Show &Tempo Ruler"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1238
+#: ../src/gui/editors/notation/NotationView.cpp:3245
+#, c-format
+msgid ""
+"_n: 1 event selected \n"
+" %n events selected "
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1241
+#: ../src/gui/editors/notation/NotationView.cpp:3247
+msgid " No selection "
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1348
+#: ../src/gui/editors/matrix/MatrixView.cpp:1360
+#: ../src/gui/editors/matrix/MatrixView.cpp:2079
+#: ../src/gui/editors/notation/NotationView.cpp:5869
+msgid "Quantizing..."
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1370
+#: ../src/gui/editors/notation/NotationView.cpp:5407
+msgid "Collapsing notes..."
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1381
+msgid "Making legato..."
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1476
+msgid "Note: %1 (%2.%3s)"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1531
+#: ../src/gui/editors/notation/NotationView.cpp:7206
+msgid "Time: %1 (%2.%3s)"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1604
+#: ../src/gui/editors/notation/NotationView.cpp:4744
+#: ../src/gui/editors/notation/NotationView.cpp:4773
+msgid "Cutting selection to clipboard..."
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:912
+#: ../src/gui/editors/matrix/MatrixView.cpp:1636
+#: ../src/gui/editors/notation/NotationSelectionPaster.cpp:82
+msgid "Couldn't paste at this point"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1647
+#: ../src/gui/editors/notation/NotationView.cpp:4754
+msgid "Deleting selection..."
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1833
+#: ../src/gui/editors/notation/NotationView.cpp:5617
+#, c-format
+msgid "Unknown note insert action %1"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1837
+#: ../src/gui/editors/matrix/MatrixView.cpp:2857
+#: ../src/gui/editors/notation/NotationView.cpp:5621
+msgid "Inserting note"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2091
+msgid "Unquantizing..."
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2120
+msgid " Grid: "
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2134
+msgid "Unit"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2136
+msgid "Beat"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2138
+msgid "Bar"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2159
+msgid " Velocity: "
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2170
+msgid " Quantize: "
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2584
+msgid "Raising velocities..."
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2596
+msgid "Lowering velocities..."
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2611
+msgid "Set Event Velocities"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2616
+msgid "Setting Velocities..."
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2665
+msgid "Remove Triggers"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2723
+msgid "%1 - Segment Track #%2 - %3"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2730
+msgid "%1 - All Segments - %2"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2737
+msgid ""
+"_n: %1 - 1 Segment - %2\n"
+"%1 - %n Segments - %2"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2885
+msgid "Can't insert note: No grid duration selected"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2935
+msgid " Chord "
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixEraser.cpp:105
+msgid "Click on a note to delete it"
+msgstr ""
+
+#: ../src/gui/editors/tempo/TempoView.cpp:89
+msgid "Filter"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:245
+#: ../src/gui/editors/tempo/TempoView.cpp:117
+msgid "Time "
+msgstr ""
+
+#: ../src/gui/editors/tempo/TempoView.cpp:118
+msgid "Type "
+msgstr ""
+
+#: ../src/gui/editors/tempo/TempoView.cpp:119
+msgid "Value "
+msgstr ""
+
+#: ../src/gui/editors/tempo/TempoView.cpp:120
+msgid "Properties "
+msgstr ""
+
+#: ../src/gui/editors/tempo/TempoView.cpp:208
+msgid "Common, hidden"
+msgstr ""
+
+#: ../src/gui/editors/tempo/TempoView.cpp:210
+msgid "Hidden"
+msgstr ""
+
+#: ../src/gui/editors/tempo/TempoView.cpp:213
+msgid "Common"
+msgstr ""
+
+#: ../src/gui/editors/tempo/TempoView.cpp:220
+msgid "Time Signature "
+msgstr ""
+
+#: ../src/gui/editors/tempo/TempoView.cpp:245
+msgid "%1.%2%3"
+msgstr ""
+
+#: ../src/gui/editors/tempo/TempoView.cpp:255
+msgid "%1.%2%3 qpm (%4.%5%6 bpm) "
+msgstr ""
+
+#: ../src/gui/editors/tempo/TempoView.cpp:264
+msgid "Tempo "
+msgstr ""
+
+#: ../src/gui/editors/tempo/TempoView.cpp:271
+msgid "<nothing at this filter level>"
+msgstr ""
+
+#: ../src/gui/editors/tempo/TempoView.cpp:463
+msgid "Delete Tempo or Time Signature"
+msgstr ""
+
+#: ../src/gui/editors/tempo/TempoView.cpp:602
+msgid "&Edit Item"
+msgstr ""
+
+#: ../src/gui/editors/tempo/TempoView.cpp:834
+msgid "%1 - Tempo and Time Signature Editor"
+msgstr ""
+
+#: ../src/gui/editors/guitar/GuitarChordEditorDialog.cpp:43
+msgid "Guitar Chord Editor"
+msgstr ""
+
+#: ../src/gui/editors/guitar/GuitarChordEditorDialog.cpp:51
+msgid "Start fret"
+msgstr ""
+
+#: ../src/gui/editors/guitar/GuitarChordEditorDialog.cpp:58
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:51
+msgid "Root"
+msgstr ""
+
+#: ../src/gui/editors/guitar/GuitarChordEditorDialog.cpp:62
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:55
+msgid "Extension"
+msgstr ""
+
+#: ../src/gui/editors/guitar/Fingering.cpp:118
+msgid "couldn't parse fingering '%1' in '%2'"
+msgstr ""
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:45
+msgid "Guitar Chord Selector"
+msgstr ""
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:64
+msgid "beginner"
+msgstr ""
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:65
+msgid "common"
+msgstr ""
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:66
+msgid "all"
+msgstr ""
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:86
+msgid "Fingerings"
+msgstr ""
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:419
+msgid "couldn't open file '%1'"
+msgstr ""
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:428
+#, c-format
+msgid "couldn't parse chord dictionnary : %1"
+msgstr ""
+
+#: ../src/gui/editors/notation/NoteFontViewer.cpp:87
+#, c-format
+msgid "Note Font Viewer: %1"
+msgstr ""
+
+#: ../src/gui/editors/notation/NoteFontViewer.cpp:93
+msgid " Component: "
+msgstr ""
+
+#: ../src/gui/editors/notation/NoteFontViewer.cpp:101
+msgid " View: "
+msgstr ""
+
+#: ../src/gui/editors/notation/NoteFontViewer.cpp:104
+msgid "Glyphs"
+msgstr ""
+
+#: ../src/gui/editors/notation/NoteFontViewer.cpp:105
+msgid "Codes"
+msgstr ""
+
+#: ../src/gui/editors/notation/NoteFontViewer.cpp:107
+msgid " Page: "
+msgstr ""
+
+#: ../src/gui/editors/notation/ClefInserter.cpp:64
+#: ../src/gui/editors/notation/GuitarChordInserter.cpp:71
+#: ../src/gui/editors/notation/RestInserter.cpp:79
+#: ../src/gui/editors/notation/TextInserter.cpp:68
+msgid "Switch to Inserting Notes"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:522
+msgid "Close track headers"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:917
+msgid "Preparing to print..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1516
+msgid "Note &Font"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1539
+msgid "Si&ze"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1545
+msgid "Show Track Headers"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1550
+msgid "S&pacing"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1572
+msgid "Du&ration Factor"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1598
+msgid "Note &Style"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1624
+msgid "Insert Rest"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1628
+msgid "Switch from Note to Rest"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1633
+msgid "Switch from Rest to Note"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1690
+msgid "No accidental"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1691
+msgid "Follow previous accidental"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1692
+msgid "Sharp"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1693
+msgid "Flat"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1694
+msgid "Natural"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1695
+msgid "Double sharp"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1696
+msgid "Double flat"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1717
+msgid "&Treble Clef"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1724
+msgid "&Alto Clef"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1731
+msgid "Te&nor Clef"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1738
+msgid "&Bass Clef"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1745
+msgid "&Text"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1751
+msgid "&Guitar Chord"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1784
+msgid "Select from Sta&rt"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1788
+msgid "Select to &End"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1792
+msgid "Select Whole St&aff"
+msgstr ""
+
+#: ../src/commands/edit/CutAndCloseCommand.h:53
+#: ../src/gui/editors/notation/NotationView.cpp:1796
+msgid "C&ut and Close"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1800
+msgid "Pa&ste..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:122
+#: ../src/gui/editors/notation/NotationView.cpp:1808
+msgid "Move to Staff Above"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:126
+#: ../src/gui/editors/notation/NotationView.cpp:1812
+msgid "Move to Staff Below"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1826
+msgid "&Linear Layout"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1835
+msgid "&Continuous Page Layout"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1844
+msgid "&Multiple Page Layout"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1854
+msgid "Show Ra&w Note Ruler"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1862
+msgid "Show &Annotations"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1866
+msgid "Show Lily&Pond Directives"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1870
+msgid "Open L&yric Editor"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1912
+msgid "Trip&let Insert Mode"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1926
+msgid "Grace Insert Mode"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2180
+msgid "&Dump selected events to stderr"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2248
+msgid "Ma&ke Ornament..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2252
+msgid "Trigger &Ornament..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2256
+msgid "Remove Ornament..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2261
+msgid "&None"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2289
+msgid "Convert Notation For..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2298
+msgid "Show &Notes Toolbar"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2299
+msgid "Show &Rests Toolbar"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2300
+msgid "Show &Accidentals Toolbar"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2301
+msgid "Show Cle&fs Toolbar"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2303
+msgid "Show &Marks Toolbar"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2305
+msgid "Show &Group Toolbar"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2307
+msgid "Show &Layout Toolbar"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2311
+msgid "Show M&eta Toolbar"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2373
+msgid "Cursor &Up Staff"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2377
+msgid "Cursor &Down Staff"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2381
+msgid "Cursor Pre&vious Segment"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2385
+msgid "Cursor Ne&xt Segment"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2475
+msgid "Push &Left"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2479
+msgid "Push &Right"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2483
+msgid "Push &Up"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2487
+msgid "Push &Down"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2491
+msgid "&Restore Positions"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2495
+msgid "Make &Invisible"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2499
+msgid "Make &Visible"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2503
+msgid "Toggle Dot"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2507
+#: ../src/gui/editors/notation/NotationView.cpp:2511
+msgid "Add Dot"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2570
+#, c-format
+msgid ""
+"_n: 1 pixel\n"
+"%n pixels"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2619
+msgid " Font: "
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2647
+msgid "Unknown font \"%1\", using default"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2655
+msgid " Size: "
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2677
+msgid " Spacing: "
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2993
+#: ../src/gui/editors/notation/NotationView.cpp:3818
+msgid " Ready."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2998
+msgid "Laying out score..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:3011
+msgid "Laying out staff %1..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:3020
+msgid "Reconciling staffs..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:3885
+msgid "Sizing and allocating canvas..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:4050
+msgid "note"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:4050
+msgid "rest"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:4211
+msgid "%1 - Segment Track #%2 - Notation"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:4217
+msgid "%1 - All Segments - Notation"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:4222
+msgid ""
+"_n: %1 - Segment - Notation\n"
+"%1 - %n Segments - Notation"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:4243
+msgid "Grace"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:4247
+#: ../src/gui/editors/notation/NotationView.cpp:4251
+#: ../src/gui/editors/notation/NotationView.cpp:4255
+msgid "%1 %2"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:4271
+msgid "Hidden annotations"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:4293
+msgid "Hidden LilyPond directives"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:4326
+#, c-format
+msgid "Unknown spacing action %1"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:4384
+#, c-format
+msgid "Unknown proportion action %1"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:4431
+#, c-format
+msgid "Unknown font action %1"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:4449
+#, c-format
+msgid "Unknown font size %1"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:4453
+#, c-format
+msgid "Unknown font size action %1"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:4780
+msgid ""
+"The Restricted paste type requires enough empty space (containing only "
+"rests) at the paste position to hold all of the events to be pasted.\n"
+"Not enough space was found.\n"
+"If you want to paste anyway, consider using one of the other paste types "
+"from the \"Paste...\" option on the Edit menu. You can also change the "
+"default paste type to something other than Restricted if you wish."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:4800
+msgid "Can't paste multiple Segments into one"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:4828
+#: ../src/gui/editors/notation/NotationView.cpp:4877
+msgid "Couldn't paste at this point."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:4896
+msgid "Move Events to Staff Above"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:4924
+msgid "Move Events to Staff Below"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5036
+msgid "Pushing selection left..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5047
+msgid "Pushing selection right..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5058
+msgid "Pushing selection up..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5069
+msgid "Pushing selection down..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5080
+msgid "Restoring computed positions..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5089
+msgid "Making visible..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5098
+msgid "Making invisible..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5185
+msgid "Beaming group..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5195
+msgid "Auto-beaming selection..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5205
+msgid "Breaking groups..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5293
+msgid "Untupleting..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5301
+msgid "Adding slur..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5302
+msgid "slur"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5307
+msgid "Adding phrasing slur..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5308
+msgid "phrasing slur"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5313
+msgid "Adding glissando..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5314
+msgid "glissando"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5319
+msgid "Adding crescendo..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5320
+#: ../src/gui/editors/notation/NotationView.cpp:5326
+msgid "dynamic"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5325
+msgid "Adding decrescendo..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5331
+#: ../src/gui/editors/notation/NotationView.cpp:5337
+#: ../src/gui/editors/notation/NotationView.cpp:5343
+#: ../src/gui/editors/notation/NotationView.cpp:5349
+msgid "Adding octave..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5332
+#: ../src/gui/editors/notation/NotationView.cpp:5338
+#: ../src/gui/editors/notation/NotationView.cpp:5344
+#: ../src/gui/editors/notation/NotationView.cpp:5350
+msgid "ottava"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5366
+msgid "Can't add overlapping %1 indications"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5375
+msgid "Making chord..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5387
+msgid "Normalizing rests..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5397
+msgid "Collapsing rests..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5417
+msgid "Tying notes..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5427
+msgid "Untying notes..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5437
+msgid "Making notes viable..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5447
+msgid "Removing counterpoint..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5457
+msgid "Pointing stems up..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5467
+msgid "Pointing stems down..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5478
+msgid "Restoring computed stem directions..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5488
+#: ../src/gui/editors/notation/NotationView.cpp:5498
+msgid "Positioning slurs..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5509
+msgid "Restoring slur positions..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5519
+#: ../src/gui/editors/notation/NotationView.cpp:5529
+msgid "Positioning ties..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5540
+msgid "Restoring tie positions..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5550
+msgid "Fixing notation quantization..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5560
+msgid "Removing notation quantization..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5577
+msgid "Changing to %1 style..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5585
+#, c-format
+msgid "Unknown style action %1"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5598
+#: ../src/gui/editors/notation/NotationView.cpp:5639
+#: ../src/gui/editors/notation/NotationView.cpp:5695
+msgid "No note duration selected"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5660
+msgid "No rest duration selected"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5746
+msgid "No note or rest duration selected"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5757
+#: ../src/gui/editors/notation/NotationView.cpp:5768
+#: ../src/gui/editors/notation/NotationView.cpp:5779
+#: ../src/gui/editors/notation/NotationView.cpp:5790
+#: ../src/gui/editors/notation/NotationView.cpp:5801
+#: ../src/gui/editors/notation/NotationView.cpp:5812
+#: ../src/gui/editors/notation/NotationView.cpp:5823
+msgid "Forcing accidentals..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5834
+msgid "Restoring accidentals..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5845
+msgid "Showing cautionary accidentals..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5855
+msgid "Cancelling cautionary accidentals..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5884
+msgid "Interpreting selection..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5896
+msgid "Setting note durations..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5904
+#: ../src/gui/editors/notation/NotationView.cpp:5912
+msgid "Adding dot..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5934
+msgid "Text: "
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5948
+msgid "Fingering: "
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:6036
+msgid "Ornament track %1 bar %2"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:6038
+#, c-format
+msgid "Ornament bar %1"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:6098
+msgid "Remove Ornaments"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:6145
+msgid "Estimated key signature shown"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStaff.cpp:1249
+#: ../src/gui/editors/notation/NotationView.cpp:6202
+msgid "Sustain"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:6218
+msgid ""
+"There is no sustain controller defined for this device.\n"
+"Please ensure the device is configured correctly in the Manage MIDI Devices "
+"dialog in the main window."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:7250
+msgid "Can't insert note: No note duration selected"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationEraser.cpp:61
+#: ../src/gui/editors/notation/NotationSelector.cpp:83
+msgid "Switch to Insert Tool"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotePixmapFactory.cpp:2303
+#: ../src/gui/editors/notation/NotePixmapFactory.cpp:2347
+msgid "..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NoteFontFactory.cpp:200
+msgid "Can't obtain a default font -- no fonts found"
+msgstr ""
+
+#: ../src/gui/editors/notation/NoteFontMap.cpp:52
+#: ../src/gui/general/PresetGroup.cpp:49
+msgid "unknown error"
+msgstr ""
+
+#: ../src/gui/editors/notation/NoteFontMap.cpp:78
+msgid "Can't open font mapping file %1 or %2"
+msgstr ""
+
+#: ../src/gui/editors/notation/NoteFontMap.cpp:82
+#, c-format
+msgid "Can't open font mapping file %1"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:52
+msgid "%1-dotted-%2"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:54
+msgid "%1-dotted %2"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:57
+#, c-format
+msgid "dotted-%1"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:59
+#, c-format
+msgid "dotted %1"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:83
+msgid "sixty-fourth note"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:83
+msgid "thirty-second note"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:84
+msgid "sixteenth note"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:84
+msgid "eighth note"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:85
+msgid "quarter note"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:85
+msgid "half note"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:86
+msgid "whole note"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:86
+msgid "double whole note"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:89
+msgid "sixty-fourth notes"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:89
+msgid "thirty-second notes"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:90
+msgid "sixteenth notes"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:90
+msgid "eighth notes"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:91
+msgid "quarter notes"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:91
+msgid "half notes"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:92
+msgid "whole notes"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:92
+msgid "double whole notes"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:96
+#: ../src/gui/editors/notation/NotationStrings.cpp:154
+msgid "%1 triplets"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:100
+#: ../src/gui/editors/notation/NotationStrings.cpp:158
+msgid "%1 triplet"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:143
+msgid "64th"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:143
+msgid "32nd"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:143
+msgid "16th"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:143
+msgid "8th"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:144
+msgid "quarter"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:144
+msgid "half"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:144
+msgid "whole"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:145
+msgid "double whole"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:148
+msgid "64ths"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:148
+msgid "32nds"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:148
+msgid "16ths"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:148
+msgid "8ths"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:149
+msgid "quarters"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:149
+msgid "halves"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:149
+msgid "wholes"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:150
+msgid "double wholes"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:278
+msgid "%1 ticks"
+msgstr ""
+
+#: ../src/gui/editors/notation/FontViewFrame.cpp:100
+#, c-format
+msgid "Error: Unable to match font name %1"
+msgstr ""
+
+#: ../src/gui/editors/notation/FontViewFrame.cpp:108
+msgid "Warning: No good match for font name %1 (best is %2)"
+msgstr ""
+
+#: ../src/gui/editors/notation/FontViewFrame.cpp:116
+#, c-format
+msgid "Error: Unable to open best-match font %1"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:113
+msgid "Track %1 : \"%2\""
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:119
+#, c-format
+msgid ""
+"\n"
+"Notate for: %1"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:121
+msgid "normal"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:124
+msgid "small"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:127
+msgid "tiny"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:131
+msgid "--"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:156
+msgid ""
+"\n"
+"Size: %1, Bracket: %2 "
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:183
+msgid ""
+"\n"
+"bars [%1-%2] in %3 (tr=%4) : \"%5\""
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:190
+msgid ""
+"\n"
+"bars [%1-%2] (tr=%3) : \"%4\""
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:240
+msgid "C#"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:242
+msgid "Eb"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:245
+msgid "F#"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:247
+msgid "G#"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:249
+msgid "Bb"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:352
+msgid "%1: %2"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:355
+#, c-format
+msgid " in %1"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStaff.cpp:452
+msgid "Rendering staff %1..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStaff.cpp:515
+msgid "Rendering notes on staff %1..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStaff.cpp:583
+msgid "Positioning staff %1..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationSelectionPaster.cpp:85
+msgid "Ready."
+msgstr ""
+
+#: ../src/gui/editors/notation/RestInserter.cpp:62
+msgid "Dotted rest"
+msgstr ""
+
+#: ../src/gui/editors/notation/NoteStyleFileReader.cpp:57
+#, c-format
+msgid "Can't open style file %1"
+msgstr ""
+
+#: ../src/gui/editors/notation/NoteStyleFileReader.cpp:92
+msgid "type is a required attribute of note"
+msgstr ""
+
+#: ../src/gui/editors/notation/NoteStyleFileReader.cpp:101
+#, c-format
+msgid "Unrecognised note name %1"
+msgstr ""
+
+#: ../src/gui/editors/notation/NoteStyleFileReader.cpp:108
+msgid "global element must precede note elements"
+msgstr ""
+
+#: ../src/gui/editors/notation/NoteStyleFileReader.cpp:137
+msgid ""
+"global and note elements may have shape or charname attribute, but not both"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationVLayout.cpp:493
+msgid ""
+"Spanned note at %1 has no HEIGHT_ON_STAFF property!\n"
+"This is a bug (the program would previously have crashed by now)"
+msgstr ""
+
+#: ../src/gui/editors/notation/NoteInserter.cpp:82
+msgid "Auto-Beam when appropriate"
+msgstr ""
+
+#: ../src/gui/editors/notation/NoteInserter.cpp:103
+msgid "Dotted note"
+msgstr ""
+
+#: ../src/gui/editors/notation/NoteInserter.cpp:120
+msgid "Switch to Inserting Rests"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:98
+msgid "Collapse Rests"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:102
+msgid "Respell as Flat"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:106
+msgid "Respell as Sharp"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:110
+msgid "Respell as Natural"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:114
+msgid "Collapse Notes"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:130
+msgid "Make Invisible"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:134
+msgid "Make Visible"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:129
+msgid "Event filters"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:138
+msgid "Rest"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:139
+msgid "Indication"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:141
+msgid "Other"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:161
+msgid "Triggered Segment Properties"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:166
+msgid "Label: "
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:176
+msgid "Base pitch: "
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:183
+msgid "Base velocity: "
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:246
+msgid "Duration "
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:247
+msgid "Event Type "
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:248
+msgid "Pitch "
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:249
+msgid "Velocity "
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:250
+msgid "Type (Data1) "
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:251
+msgid "Value (Data2) "
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:461
+msgid "(group %1) "
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:519
+msgid "<no events at this filter level>"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:521
+msgid "<no events>"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:696
+msgid "Segment label"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:696
+msgid "Label:"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1123
+msgid "&Insert Event"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1130
+msgid "&Delete Event"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1137
+msgid "&Edit Event"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1144
+msgid "&Advanced Event Editor"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1518
+msgid "Open in Event Editor"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1519
+msgid "Open in Expert Event Editor"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1577
+msgid "%1 - Triggered Segment: %2"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1592
+msgid "%1 - Segment Track #%2 - Event List"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1598
+msgid "%1 - %2 Segments - Event List"
+msgstr ""
+
+#: ../src/gui/rulers/TempoRuler.cpp:131
+msgid "Insert Tempo Change at Playback Position"
+msgstr ""
+
+#: ../src/gui/rulers/TempoRuler.cpp:136
+msgid "Delete Tempo Change"
+msgstr ""
+
+#: ../src/gui/rulers/TempoRuler.cpp:140
+msgid "Ramp Tempo to Next Tempo"
+msgstr ""
+
+#: ../src/gui/rulers/TempoRuler.cpp:144
+msgid "Un-Ramp Tempo"
+msgstr ""
+
+#: ../src/gui/rulers/TempoRuler.cpp:149
+msgid "Edit Tempo..."
+msgstr ""
+
+#: ../src/gui/rulers/TempoRuler.cpp:153
+msgid "Edit Time Signature..."
+msgstr ""
+
+#: ../src/gui/rulers/TempoRuler.cpp:588
+msgid "%1.%2%3 (%4.%5%6 bpm)"
+msgstr ""
+
+#: ../src/gui/rulers/TempoRuler.cpp:596
+msgid "%1.%2%3 bpm"
+msgstr ""
+
+#: ../src/gui/rulers/TempoRuler.cpp:604
+msgid "%1 - %2.%3%4"
+msgstr ""
+
+#: ../src/gui/rulers/ControlRulerEventInsertCommand.cpp:36
+msgid "Insert Controller Event"
+msgstr ""
+
+#: ../src/gui/rulers/ControlChangeCommand.cpp:35
+msgid "Control Change"
+msgstr ""
+
+#: ../src/gui/rulers/PropertyViewRuler.cpp:72
+msgid "%1 controller"
+msgstr ""
+
+#: ../src/gui/rulers/RawNoteRuler.cpp:453
+msgid "Track #%1, Segment \"%2\" (runtime id %3)"
+msgstr ""
+
+#: ../src/gui/rulers/MarkerRuler.cpp:100
+msgid "Insert Marker"
+msgstr ""
+
+#: ../src/gui/rulers/MarkerRuler.cpp:104
+msgid "Insert Marker at Playback Position"
+msgstr ""
+
+#: ../src/gui/rulers/MarkerRuler.cpp:109
+msgid "Delete Marker"
+msgstr ""
+
+#: ../src/gui/rulers/MarkerRuler.cpp:114
+msgid "Edit Marker..."
+msgstr ""
+
+#: ../src/gui/rulers/MarkerRuler.cpp:119
+msgid ""
+"Click on a marker to move the playback pointer.\n"
+"Shift-click to set a range between markers.\n"
+"Double-click to open the marker editor."
+msgstr ""
+
+#: ../src/gui/rulers/ChordNameRuler.cpp:97
+msgid ""
+"Chord name ruler.\n"
+"Turn it on and off from the Settings->Rulers menu."
+msgstr ""
+
+#: ../src/gui/rulers/ControlRulerEventEraseCommand.cpp:37
+msgid "Erase Controller Event(s)"
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:901
+#: ../src/gui/rulers/ControllerEventsRuler.cpp:188
+msgid "Unsupported Event Type"
+msgstr ""
+
+#: ../src/gui/rulers/ControllerEventsRuler.cpp:203
+msgid "Controller Events"
+msgstr ""
+
+#: ../src/gui/rulers/ControllerEventsRuler.cpp:278
+msgid "Controller Event Number"
+msgstr ""
+
+#: ../src/gui/rulers/ControllerEventsRuler.cpp:471
+msgid "Add line of controllers"
+msgstr ""
+
+#: ../src/gui/rulers/LoopRuler.cpp:89
+msgid ""
+"Click and drag to move the playback pointer.\n"
+"Shift-click and drag to set a range for looping or editing.\n"
+"Shift-click to clear the loop or range.\n"
+"Double-click to start playback."
+msgstr ""
+
+#: ../src/gui/general/EditViewBase.cpp:228
+msgid "Set Segment Start Time..."
+msgstr ""
+
+#: ../src/gui/general/EditViewBase.cpp:232
+msgid "Set Segment Duration..."
+msgstr ""
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:56
+msgid "Load track parameters preset"
+msgstr ""
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:62
+msgid "Convert notation for..."
+msgstr ""
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:86
+msgid "Select preset track parameters for:"
+msgstr ""
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:87
+msgid "Create appropriate notation for:"
+msgstr ""
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:89
+msgid "Category"
+msgstr ""
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:95
+msgid "Player Ability"
+msgstr ""
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:97
+msgid "Amateur"
+msgstr ""
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:98
+msgid "Professional"
+msgstr ""
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:104
+msgid "Only selected segments"
+msgstr ""
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:106
+msgid "All segments in this track"
+msgstr ""
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:111
+msgid "Only for new segments"
+msgstr ""
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:113
+msgid "Convert existing segments"
+msgstr ""
+
+#: ../src/gui/general/MidiPitchLabel.cpp:39
+#, c-format
+msgid "C%1"
+msgstr ""
+
+#: ../src/gui/general/MidiPitchLabel.cpp:39
+#, c-format
+msgid "C#%1"
+msgstr ""
+
+#: ../src/gui/general/MidiPitchLabel.cpp:39
+#, c-format
+msgid "D%1"
+msgstr ""
+
+#: ../src/gui/general/MidiPitchLabel.cpp:39
+#, c-format
+msgid "D#%1"
+msgstr ""
+
+#: ../src/gui/general/MidiPitchLabel.cpp:40
+#, c-format
+msgid "E%1"
+msgstr ""
+
+#: ../src/gui/general/MidiPitchLabel.cpp:40
+#, c-format
+msgid "F%1"
+msgstr ""
+
+#: ../src/gui/general/MidiPitchLabel.cpp:40
+#, c-format
+msgid "F#%1"
+msgstr ""
+
+#: ../src/gui/general/MidiPitchLabel.cpp:40
+#, c-format
+msgid "G%1"
+msgstr ""
+
+#: ../src/gui/general/MidiPitchLabel.cpp:41
+#, c-format
+msgid "G#%1"
+msgstr ""
+
+#: ../src/gui/general/MidiPitchLabel.cpp:41
+#, c-format
+msgid "A%1"
+msgstr ""
+
+#: ../src/gui/general/MidiPitchLabel.cpp:41
+#, c-format
+msgid "A#%1"
+msgstr ""
+
+#: ../src/gui/general/MidiPitchLabel.cpp:41
+#, c-format
+msgid "B%1"
+msgstr ""
+
+#: ../src/gui/general/PresetGroup.cpp:95
+#, c-format
+msgid "Can't open preset file %1"
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:744
+msgid "&Halve Durations"
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:748
+msgid "&Double Durations"
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:806
+msgid "Show Velocity Property Ruler"
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:825
+msgid "Insert item"
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:831
+msgid "Erase selected items"
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:835
+msgid "Clear ruler"
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:839
+msgid "Insert line of controllers"
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:843
+msgid "Flip forward"
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:847
+msgid "Flip backwards"
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:851
+msgid "Draw property line"
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:855
+msgid "Select all property values"
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:894
+msgid "%1 Controller %2 %3"
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:1066
+msgid "I"
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:1066
+msgid "II"
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:1066
+msgid "III"
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:1066
+msgid "IV"
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:1067
+msgid "V"
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:1067
+msgid "VI"
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:1067
+msgid "VII"
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:1067
+msgid "VIII"
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:1069
+msgid "%1 flat"
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:1070
+msgid "%1 sharp"
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:1085
+msgid "&Insert Note"
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:1091
+msgid "&Upper Octave"
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:1096
+msgid "&Lower Octave"
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:1268
+msgid "Estimated time signature shown"
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:1431
+msgid "Halving durations..."
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:1445
+msgid "Doubling durations..."
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:1469
+msgid "Rescaling..."
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:1489
+msgid "By number of semitones: "
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:1496 ../src/gui/general/EditView.cpp:1518
+msgid "Transposing..."
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:1536
+msgid "Transposing up one semitone..."
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:1545
+msgid "Transposing up one octave..."
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:1554
+msgid "Transposing down one semitone..."
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:1563
+msgid "Transposing down one octave..."
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:1575
+msgid "Inverting..."
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:1587
+msgid "Retrograding..."
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:1599
+msgid "Retrograde inverting..."
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:1608
+msgid "Jogging left..."
+msgstr ""
+
+#: ../src/gui/general/EditView.cpp:1623
+msgid "Jogging right..."
+msgstr ""
+
+#: ../src/sound/AudioFileManager.cpp:660
+#, c-format
+msgid "Downloading file %1"
+msgstr ""
+
+#: ../src/sound/AudioFileManager.cpp:735
+msgid "Converting audio file..."
+msgstr ""
+
+#: ../src/sound/AudioFileManager.cpp:737
+msgid "Resampling audio file..."
+msgstr ""
+
+#: ../src/sound/AudioFileManager.cpp:739
+msgid "Converting and resampling audio file..."
+msgstr ""
+
+#: ../src/sound/AudioFileManager.cpp:741
+msgid "Importing audio file..."
+msgstr ""
+
+#: ../src/sound/AudioFileManager.cpp:794
+msgid "Failed to convert or resample audio file on import"
+msgstr ""
+
+#: ../src/sequencer/main.cpp:46 ../src/sequencer/main.cpp:86
+msgid "RosegardenSequencer"
+msgstr ""
+
+#: ../src/sequencer/main.cpp:54
+msgid "JACK playback and capture ports"
+msgstr ""
+
+#: ../src/commands/segment/SegmentSyncCommand.cpp:38
+#: ../src/commands/segment/SegmentSyncCommand.cpp:44
+#: ../src/commands/segment/SegmentSyncCommand.cpp:55
+#: ../src/commands/segment/SegmentSyncCommand.cpp:63
+msgid "Sync segment parameters"
+msgstr ""
+
+#: ../src/commands/segment/RenameTrackCommand.h:52
+msgid "Rename Track"
+msgstr ""
+
+#: ../src/commands/segment/SegmentRepeatToCopyCommand.cpp:39
+msgid "Turn Repeats into Copies"
+msgstr ""
+
+#: ../src/commands/segment/SegmentTransposeCommand.cpp:36
+#: ../src/commands/segment/SegmentTransposeCommand.cpp:42
+msgid "Change segment transposition"
+msgstr ""
+
+#: ../src/commands/edit/RescaleCommand.h:50
+#: ../src/commands/segment/AudioSegmentRescaleCommand.h:62
+#: ../src/commands/segment/SegmentRescaleCommand.h:58
+msgid "Stretch or S&quash..."
+msgstr ""
+
+#: ../src/commands/segment/SegmentLabelCommand.h:52
+msgid "Re&label..."
+msgstr ""
+
+#: ../src/commands/segment/AudioSegmentResizeFromStartCommand.cpp:39
+#: ../src/commands/segment/SegmentResizeFromStartCommand.cpp:39
+msgid "Resize Segment"
+msgstr ""
+
+#: ../src/commands/segment/RemoveTempoChangeCommand.h:58
+msgid "Remove &Tempo Change..."
+msgstr ""
+
+#: ../src/commands/segment/SegmentEraseCommand.cpp:40
+#: ../src/commands/segment/SegmentEraseCommand.cpp:52
+msgid "Erase Segment"
+msgstr ""
+
+#: ../src/commands/segment/AudioSegmentRescaleCommand.cpp:126
+#: ../src/commands/segment/SegmentRescaleCommand.cpp:102
+msgid "(rescaled)"
+msgstr ""
+
+#: ../src/commands/segment/AudioSegmentRescaleCommand.cpp:127
+#: ../src/commands/segment/SegmentRescaleCommand.cpp:105
+msgid "%1 (rescaled)"
+msgstr ""
+
+#: ../src/commands/segment/PasteToTriggerSegmentCommand.cpp:47
+msgid "Paste as New Triggered Segment"
+msgstr ""
+
+#: ../src/commands/segment/SegmentColourMapCommand.h:52
+msgid "Change Segment Color Map..."
+msgstr ""
+
+#: ../src/commands/segment/SegmentQuickCopyCommand.h:55
+msgid "Quick-Copy Segment"
+msgstr ""
+
+#: ../src/commands/segment/AudioSegmentSplitCommand.cpp:42
+msgid "Split Audio Segment"
+msgstr ""
+
+#: ../src/commands/segment/AudioSegmentSplitCommand.cpp:103
+#: ../src/commands/segment/SegmentSplitCommand.cpp:135
+msgid " (split)"
+msgstr ""
+
+#: ../src/commands/segment/AudioSegmentSplitCommand.cpp:104
+#: ../src/commands/segment/SegmentSplitByRecordingSrcCommand.cpp:120
+#: ../src/commands/segment/SegmentSplitByRecordingSrcCommand.cpp:122
+#: ../src/commands/segment/SegmentSplitCommand.cpp:136
+msgid "%1 (split)"
+msgstr ""
+
+#: ../src/commands/segment/SegmentLabelCommand.cpp:40
+msgid "Label Segments"
+msgstr ""
+
+#: ../src/commands/segment/OpenOrCloseRangeCommand.cpp:43
+msgid "Open or Close Range"
+msgstr ""
+
+#: ../src/commands/edit/TransposeCommand.h:55
+#: ../src/commands/segment/SegmentTransposeCommand.h:54
+msgid "Transpose by &Interval..."
+msgstr ""
+
+#: ../src/commands/segment/SegmentAutoSplitCommand.cpp:148
+msgid "%1 (part)"
+msgstr ""
+
+#: ../src/commands/segment/AudioSegmentInsertCommand.cpp:51
+#: ../src/commands/segment/SegmentInsertCommand.cpp:43
+#: ../src/commands/segment/SegmentInsertCommand.cpp:56
+msgid "Create Segment"
+msgstr ""
+
+#: ../src/commands/segment/AudioSegmentInsertCommand.cpp:114
+msgid "%1 (inserted)"
+msgstr ""
+
+#: ../src/commands/segment/AudioSegmentInsertCommand.cpp:117
+msgid "unknown audio file"
+msgstr ""
+
+#: ../src/commands/segment/CreateTempoMapFromSegmentCommand.cpp:40
+msgid "Set Tempos from Beat Segment"
+msgstr ""
+
+#: ../src/commands/segment/SegmentSplitByRecordingSrcCommand.h:52
+msgid "Split by &Recording Source..."
+msgstr ""
+
+#: ../src/commands/segment/SegmentColourMapCommand.cpp:40
+msgid "Change Segment Color Map"
+msgstr ""
+
+#: ../src/commands/edit/CopyCommand.cpp:64
+#: ../src/commands/segment/SegmentQuickCopyCommand.cpp:57
+msgid "%1 (copied)"
+msgstr ""
+
+#: ../src/commands/segment/SegmentColourCommand.h:52
+msgid "Change Segment Color..."
+msgstr ""
+
+#: ../src/commands/segment/SegmentSplitByPitchCommand.cpp:170
+msgid "%1 (upper)"
+msgstr ""
+
+#: ../src/commands/segment/SegmentSplitByPitchCommand.cpp:172
+msgid "%1 (lower)"
+msgstr ""
+
+#: ../src/commands/segment/SegmentSingleRepeatToCopyCommand.cpp:39
+msgid "Turn Single Repeat into Copy"
+msgstr ""
+
+#: ../src/commands/segment/AddTempoChangeCommand.h:58
+msgid "Add Te&mpo Change..."
+msgstr ""
+
+#: ../src/commands/segment/AudioSegmentAutoSplitCommand.h:57
+#: ../src/commands/segment/SegmentAutoSplitCommand.h:53
+msgid "&Split on Silence"
+msgstr ""
+
+#: ../src/commands/segment/SetTriggerSegmentBaseVelocityCommand.cpp:39
+msgid "Set Base Velocity"
+msgstr ""
+
+#: ../src/commands/segment/DeleteRangeCommand.cpp:43
+#: ../src/commands/segment/EraseSegmentsStartingInRangeCommand.cpp:39
+msgid "Delete Range"
+msgstr ""
+
+#: ../src/commands/segment/ChangeCompositionLengthCommand.h:53
+msgid "Change &Composition Start and End..."
+msgstr ""
+
+#: ../src/commands/segment/MoveTracksCommand.h:51
+msgid "Move Tracks..."
+msgstr ""
+
+#: ../src/commands/segment/SegmentColourCommand.cpp:39
+msgid "Change Segment Color"
+msgstr ""
+
+#: ../src/commands/segment/AudioSegmentDistributeCommand.h:66
+msgid "Distribute Audio Segments over MIDI"
+msgstr ""
+
+#: ../src/commands/segment/AudioSegmentAutoSplitCommand.cpp:147
+msgid "%1 (autosplit %2)"
+msgstr ""
+
+#: ../src/commands/segment/SetTriggerSegmentDefaultRetuneCommand.cpp:39
+msgid "Set Default Retune"
+msgstr ""
+
+#: ../src/commands/segment/AddTimeSignatureCommand.h:52
+msgid "Add Time Si&gnature Change..."
+msgstr ""
+
+#: ../src/commands/segment/AddTriggerSegmentCommand.cpp:42
+msgid "Add Triggered Segment"
+msgstr ""
+
+#: ../src/commands/segment/SetTriggerSegmentDefaultTimeAdjustCommand.cpp:39
+msgid "Set Default Time Adjust"
+msgstr ""
+
+#: ../src/commands/segment/RemoveTimeSignatureCommand.h:58
+msgid "Remove &Time Signature Change..."
+msgstr ""
+
+#: ../src/commands/segment/SegmentCommandRepeat.cpp:39
+msgid "Repeat Segments"
+msgstr ""
+
+#: ../src/commands/segment/AddTracksCommand.h:55
+msgid "Add Tracks..."
+msgstr ""
+
+#: ../src/commands/segment/ModifyDefaultTempoCommand.h:51
+msgid "Modify &Default Tempo..."
+msgstr ""
+
+#: ../src/commands/segment/SegmentSplitByPitchCommand.h:61
+msgid "Split by &Pitch..."
+msgstr ""
+
+#: ../src/commands/segment/DeleteTriggerSegmentCommand.cpp:40
+msgid "Delete Triggered Segment"
+msgstr ""
+
+#: ../src/commands/segment/SegmentSplitCommand.cpp:42
+msgid "Split Segment"
+msgstr ""
+
+#: ../src/commands/segment/DeleteTracksCommand.h:51
+msgid "Delete Tracks..."
+msgstr ""
+
+#: ../src/commands/segment/InsertRangeCommand.cpp:42
+msgid "Insert Range"
+msgstr ""
+
+#: ../src/commands/segment/DeleteRangeCommand.h:62
+msgid "Rejoin Command"
+msgstr ""
+
+#: ../src/commands/segment/SetTriggerSegmentBasePitchCommand.cpp:39
+msgid "Set Base Pitch"
+msgstr ""
+
+#: ../src/commands/segment/PasteConductorDataCommand.cpp:41
+msgid "Paste Tempos and Time Signatures"
+msgstr ""
+
+#: ../src/commands/segment/SegmentSyncClefCommand.cpp:34
+msgid "Sync segment clef"
+msgstr ""
+
+#: ../src/commands/matrix/MatrixInsertionCommand.cpp:46
+#: ../src/commands/notation/NoteInsertionCommand.cpp:54
+msgid "Insert Note"
+msgstr ""
+
+#: ../src/commands/matrix/MatrixEraseCommand.cpp:41
+msgid "Erase Note"
+msgstr ""
+
+#: ../src/commands/matrix/MatrixPercussionInsertionCommand.cpp:47
+msgid "Insert Percussion Note"
+msgstr ""
+
+#: ../src/commands/matrix/MatrixModifyCommand.cpp:43
+msgid "Move Note"
+msgstr ""
+
+#: ../src/commands/matrix/MatrixModifyCommand.cpp:43
+msgid "Modify Note"
+msgstr ""
+
+#: ../src/commands/edit/PasteEventsCommand.cpp:98
+msgid "Paste into an existing gap [\"restricted\"]"
+msgstr ""
+
+#: ../src/commands/edit/PasteEventsCommand.cpp:100
+msgid "Erase existing events to make room [\"simple\"]"
+msgstr ""
+
+#: ../src/commands/edit/PasteEventsCommand.cpp:102
+msgid "Move existing events out of the way [\"open-n-paste\"]"
+msgstr ""
+
+#: ../src/commands/edit/PasteEventsCommand.cpp:104
+msgid "Overlay notes, tying against present notes [\"note-overlay\"]"
+msgstr ""
+
+#: ../src/commands/edit/PasteEventsCommand.cpp:106
+msgid "Overlay notes, ignoring present notes [\"matrix-overlay\"]"
+msgstr ""
+
+#: ../src/commands/edit/AddDotCommand.h:52
+msgid "&Add Dot"
+msgstr ""
+
+#: ../src/commands/edit/RemoveMarkerCommand.h:55
+msgid "&Remove Marker"
+msgstr ""
+
+#: ../src/commands/edit/EventUnquantizeCommand.cpp:43
+#: ../src/commands/edit/EventUnquantizeCommand.cpp:54
+msgid "Unquantize Events"
+msgstr ""
+
+#: ../src/commands/edit/ChangeVelocityCommand.h:53
+msgid "&Increase Velocity"
+msgstr ""
+
+#: ../src/commands/edit/ChangeVelocityCommand.h:54
+msgid "&Reduce Velocity"
+msgstr ""
+
+#: ../src/commands/edit/CopyCommand.cpp:46
+msgid "(excerpt)"
+msgstr ""
+
+#: ../src/commands/edit/CopyCommand.cpp:60
+msgid "(copied)"
+msgstr ""
+
+#: ../src/commands/edit/EventInsertionCommand.cpp:39
+msgid "Insert Event"
+msgstr ""
+
+#: ../src/commands/edit/InsertTriggerNoteCommand.cpp:55
+msgid "Insert Trigger Note"
+msgstr ""
+
+#: ../src/commands/edit/CollapseNotesCommand.h:50
+msgid "Collapse &Equal-Pitch Notes"
+msgstr ""
+
+#: ../src/commands/edit/TransposeCommand.h:61
+msgid "&Up a Semitone"
+msgstr ""
+
+#: ../src/commands/edit/TransposeCommand.h:62
+msgid "&Down a Semitone"
+msgstr ""
+
+#: ../src/commands/edit/TransposeCommand.h:63
+msgid "Up an &Octave"
+msgstr ""
+
+#: ../src/commands/edit/TransposeCommand.h:64
+msgid "Down an Octa&ve"
+msgstr ""
+
+#: ../src/commands/edit/TransposeCommand.h:65
+msgid "&Transpose by Semitones..."
+msgstr ""
+
+#: ../src/commands/edit/SetNoteTypeCommand.h:56
+msgid "&Set Note Type"
+msgstr ""
+
+#: ../src/commands/edit/EventEditCommand.h:55
+msgid "Edit E&vent"
+msgstr ""
+
+#: ../src/commands/edit/AddMarkerCommand.h:54
+msgid "&Add Marker"
+msgstr ""
+
+#: ../src/commands/edit/SelectionPropertyCommand.h:66
+msgid "Set &Property"
+msgstr ""
+
+#: ../src/commands/edit/CutCommand.h:55
+msgid "Cu&t"
+msgstr ""
+
+#: ../src/commands/edit/EventQuantizeCommand.cpp:114
+msgid "Heuristic Notation &Quantize"
+msgstr ""
+
+#: ../src/commands/edit/EventQuantizeCommand.cpp:116
+msgid "Grid &Quantize"
+msgstr ""
+
+#: ../src/commands/edit/ClearTriggersCommand.h:52
+msgid "&Clear Triggers"
+msgstr ""
+
+#: ../src/commands/edit/RetrogradeCommand.h:51
+msgid "&Retrograde"
+msgstr ""
+
+#: ../src/commands/edit/InvertCommand.h:51
+msgid "&Invert"
+msgstr ""
+
+#: ../src/commands/edit/SetTriggerCommand.h:64
+msgid "Tri&gger Segment"
+msgstr ""
+
+#: ../src/commands/edit/SetLyricsCommand.h:50
+msgid "Edit L&yrics"
+msgstr ""
+
+#: ../src/commands/edit/MoveAcrossSegmentsCommand.cpp:73
+msgid "&Move Events to Other Segment"
+msgstr ""
+
+#: ../src/commands/edit/RetrogradeInvertCommand.h:51
+msgid "Re&trograde Invert"
+msgstr ""
+
+#: ../src/commands/edit/ModifyMarkerCommand.h:55
+msgid "&Modify Marker"
+msgstr ""
+
+#: ../src/commands/studio/AddControlParameterCommand.h:61
+msgid "&Add Control Parameter"
+msgstr ""
+
+#: ../src/commands/studio/ModifyInstrumentMappingCommand.h:55
+msgid "Modify &Instrument Mapping"
+msgstr ""
+
+#: ../src/commands/studio/RemoveControlParameterCommand.h:60
+msgid "&Remove Control Parameter"
+msgstr ""
+
+#: ../src/commands/studio/ReconnectDeviceCommand.h:55
+msgid "Reconnect Device"
+msgstr ""
+
+#: ../src/commands/studio/ModifyDeviceCommand.h:68
+msgid "Modify &MIDI Bank"
+msgstr ""
+
+#: ../src/commands/studio/CreateOrDeleteDeviceCommand.h:68
+msgid "Create Device"
+msgstr ""
+
+#: ../src/commands/studio/ModifyDeviceMappingCommand.h:55
+msgid "Modify &Device Mapping"
+msgstr ""
+
+#: ../src/commands/studio/RenameDeviceCommand.h:55
+msgid "Rename Device"
+msgstr ""
+
+#: ../src/commands/studio/ModifyControlParameterCommand.h:61
+msgid "&Modify Control Parameter"
+msgstr ""
+
+#: ../src/commands/notation/TieNotesCommand.h:49
+msgid "&Tie"
+msgstr ""
+
+#: ../src/commands/notation/ClefInsertionCommand.cpp:74
+msgid "Add Cle&f Change..."
+msgstr ""
+
+#: ../src/commands/notation/GuitarChordInsertionCommand.cpp:40
+msgid "Insert Guitar Chord"
+msgstr ""
+
+#: ../src/commands/notation/RespellCommand.cpp:47
+#, c-format
+msgid "Respell with %1"
+msgstr ""
+
+#: ../src/commands/notation/RespellCommand.cpp:50
+msgid "Do&uble Sharp"
+msgstr ""
+
+#: ../src/commands/notation/RespellCommand.cpp:52
+msgid "&Sharp"
+msgstr ""
+
+#: ../src/commands/notation/RespellCommand.cpp:54
+msgid "&Flat"
+msgstr ""
+
+#: ../src/commands/notation/RespellCommand.cpp:56
+msgid "Dou&ble Flat"
+msgstr ""
+
+#: ../src/commands/notation/RespellCommand.cpp:58
+msgid "&Natural"
+msgstr ""
+
+#: ../src/commands/notation/RespellCommand.cpp:60
+msgid "N&one"
+msgstr ""
+
+#: ../src/commands/notation/RespellCommand.cpp:66
+msgid "Respell Accidentals &Upward"
+msgstr ""
+
+#: ../src/commands/notation/RespellCommand.cpp:69
+msgid "Respell Accidentals &Downward"
+msgstr ""
+
+#: ../src/commands/notation/RespellCommand.cpp:72
+msgid "&Restore Accidentals"
+msgstr ""
+
+#: ../src/commands/notation/RespellCommand.cpp:75
+msgid "Respell Accidentals"
+msgstr ""
+
+#: ../src/commands/notation/DeCounterpointCommand.h:55
+msgid "Split-and-Tie Overlapping &Chords"
+msgstr ""
+
+#: ../src/commands/notation/BeamCommand.h:49
+msgid "&Beam Group"
+msgstr ""
+
+#: ../src/commands/notation/AddTextMarkCommand.h:51
+msgid "Add Te&xt Mark..."
+msgstr ""
+
+#: ../src/commands/notation/RestoreSlursCommand.h:49
+msgid "&Restore Slur Positions"
+msgstr ""
+
+#: ../src/commands/notation/SustainInsertionCommand.h:56
+msgid "Add Pedal &Press"
+msgstr ""
+
+#: ../src/commands/notation/SustainInsertionCommand.h:58
+msgid "Add Pedal &Release"
+msgstr ""
+
+#: ../src/commands/notation/FixNotationQuantizeCommand.h:49
+msgid "Fi&x Notation Quantization"
+msgstr ""
+
+#: ../src/commands/notation/ChangeStemsCommand.h:51
+msgid "Stems &Up"
+msgstr ""
+
+#: ../src/commands/notation/ChangeStemsCommand.h:51
+msgid "Stems &Down"
+msgstr ""
+
+#: ../src/commands/notation/MakeAccidentalsCautionaryCommand.cpp:43
+msgid "Use &Cautionary Accidentals"
+msgstr ""
+
+#: ../src/commands/notation/MakeAccidentalsCautionaryCommand.cpp:45
+msgid "Cancel C&autionary Accidentals"
+msgstr ""
+
+#: ../src/commands/notation/SetVisibilityCommand.h:50
+msgid "Set Visibility"
+msgstr ""
+
+#: ../src/commands/notation/ChangeStyleCommand.h:53
+msgid "Change &Note Style"
+msgstr ""
+
+#: ../src/commands/notation/TextInsertionCommand.cpp:41
+msgid "Insert Text"
+msgstr ""
+
+#: ../src/commands/notation/InterpretCommand.h:70
+msgid "&Interpret..."
+msgstr ""
+
+#: ../src/commands/notation/TupletCommand.h:53
+msgid "&Triplet"
+msgstr ""
+
+#: ../src/commands/notation/TupletCommand.h:54
+msgid "Tu&plet..."
+msgstr ""
+
+#: ../src/commands/notation/UnTupletCommand.h:50
+msgid "&Untuplet"
+msgstr ""
+
+#: ../src/commands/notation/CollapseRestsCommand.h:54
+msgid "&Collapse Rests"
+msgstr ""
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:145
+msgid "Add S&lur"
+msgstr ""
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:147
+msgid "Add &Phrasing Slur"
+msgstr ""
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:149
+msgid "Add Double-Octave Up"
+msgstr ""
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:151
+msgid "Add Octave &Up"
+msgstr ""
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:153
+msgid "Add Octave &Down"
+msgstr ""
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:155
+msgid "Add Double Octave Down"
+msgstr ""
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:160
+msgid "Add &Crescendo"
+msgstr ""
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:162
+msgid "Add &Decrescendo"
+msgstr ""
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:164
+msgid "Add &Glissando"
+msgstr ""
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:167
+msgid "Add &%1%2"
+msgstr ""
+
+#: ../src/commands/notation/RemoveNotationQuantizeCommand.h:49
+msgid "Remo&ve Notation Quantization"
+msgstr ""
+
+#: ../src/commands/notation/MakeChordCommand.h:50
+msgid "Make &Chord"
+msgstr ""
+
+#: ../src/commands/notation/MultiKeyInsertionCommand.h:63
+msgid "Change all to &Key %1..."
+msgstr ""
+
+#: ../src/commands/notation/KeyInsertionCommand.h:67
+#: ../src/commands/notation/MultiKeyInsertionCommand.h:65
+msgid "Add &Key Change..."
+msgstr ""
+
+#: ../src/commands/notation/RestoreStemsCommand.h:49
+msgid "&Restore Stems"
+msgstr ""
+
+#: ../src/commands/notation/MakeNotesViableCommand.h:55
+#: ../src/commands/notation/MakeRegionViableCommand.h:52
+msgid "Tie Notes at &Barlines"
+msgstr ""
+
+#: ../src/commands/notation/AddSlashesCommand.h:46
+msgid "Slashes"
+msgstr ""
+
+#: ../src/commands/notation/ChangeSlurPositionCommand.h:51
+msgid "Slur &Above"
+msgstr ""
+
+#: ../src/commands/notation/ChangeSlurPositionCommand.h:51
+msgid "Slur &Below"
+msgstr ""
+
+#: ../src/commands/notation/NormalizeRestsCommand.h:54
+msgid "&Normalize Rests"
+msgstr ""
+
+#: ../src/commands/notation/TextChangeCommand.cpp:41
+msgid "Edit Text"
+msgstr ""
+
+#: ../src/commands/notation/RemoveMarksCommand.h:49
+msgid "&Remove All Marks"
+msgstr ""
+
+#: ../src/commands/notation/AutoBeamCommand.h:52
+msgid "&Auto-Beam"
+msgstr ""
+
+#: ../src/commands/notation/UntieNotesCommand.h:49
+msgid "&Untie"
+msgstr ""
+
+#: ../src/commands/notation/AddMarkCommand.cpp:48
+msgid "S&forzando"
+msgstr ""
+
+#: ../src/commands/notation/AddMarkCommand.cpp:50
+msgid "Sta&ccato"
+msgstr ""
+
+#: ../src/commands/notation/AddMarkCommand.cpp:52
+msgid "R&inforzando"
+msgstr ""
+
+#: ../src/commands/notation/AddMarkCommand.cpp:54
+msgid "T&enuto"
+msgstr ""
+
+#: ../src/commands/notation/AddMarkCommand.cpp:56
+msgid "Tri&ll"
+msgstr ""
+
+#: ../src/commands/notation/AddMarkCommand.cpp:58
+msgid "Trill &with Line"
+msgstr ""
+
+#: ../src/commands/notation/AddMarkCommand.cpp:60
+msgid "Trill Line"
+msgstr ""
+
+#: ../src/commands/notation/AddMarkCommand.cpp:62
+msgid "&Turn"
+msgstr ""
+
+#: ../src/commands/notation/AddMarkCommand.cpp:64
+msgid "&Accent"
+msgstr ""
+
+#: ../src/commands/notation/AddMarkCommand.cpp:66
+msgid "&Staccatissimo"
+msgstr ""
+
+#: ../src/commands/notation/AddMarkCommand.cpp:68
+msgid "&Marcato"
+msgstr ""
+
+#: ../src/commands/notation/AddMarkCommand.cpp:70
+msgid "&Pause"
+msgstr ""
+
+#: ../src/commands/notation/AddMarkCommand.cpp:72
+msgid "&Up-Bow"
+msgstr ""
+
+#: ../src/commands/notation/AddMarkCommand.cpp:74
+msgid "&Down-Bow"
+msgstr ""
+
+#: ../src/commands/notation/AddMarkCommand.cpp:76
+msgid "Mo&rdent"
+msgstr ""
+
+#: ../src/commands/notation/AddMarkCommand.cpp:78
+msgid "Inverted Mordent"
+msgstr ""
+
+#: ../src/commands/notation/AddMarkCommand.cpp:80
+msgid "Long Mordent"
+msgstr ""
+
+#: ../src/commands/notation/AddMarkCommand.cpp:82
+msgid "Lon&g Inverted Mordent"
+msgstr ""
+
+#: ../src/commands/notation/AddMarkCommand.cpp:84
+msgid "&%1%2"
+msgstr ""
+
+#: ../src/commands/notation/AddMarkCommand.cpp:89
+#, c-format
+msgid "Add %1"
+msgstr ""
+
+#: ../src/commands/notation/ResetDisplacementsCommand.h:49
+msgid "Restore Positions"
+msgstr ""
+
+#: ../src/commands/notation/IncrementDisplacementsCommand.h:52
+msgid "Fine Reposition"
+msgstr ""
+
+#: ../src/commands/notation/RestoreTiesCommand.h:49
+msgid "&Restore Tie Positions"
+msgstr ""
+
+#: ../src/commands/notation/ChangeTiePositionCommand.h:47
+msgid "Tie &Above"
+msgstr ""
+
+#: ../src/commands/notation/ChangeTiePositionCommand.h:47
+msgid "Tie &Below"
+msgstr ""
+
+#: ../src/commands/notation/KeyInsertionCommand.h:65
+msgid "Change to &Key %1..."
+msgstr ""
+
+#: ../src/commands/notation/RemoveFingeringMarksCommand.h:49
+msgid "&Remove Fingerings"
+msgstr ""
+
+#: ../src/commands/notation/BreakCommand.h:49
+msgid "&Unbeam"
+msgstr ""
+
+#: ../src/commands/notation/UnGraceCommand.h:48
+msgid "Ung&race"
+msgstr ""
+
+#: ../src/commands/notation/AddFingeringMarkCommand.cpp:45
+msgid "Add Other &Fingering..."
+msgstr ""
+
+#: ../src/commands/notation/AddFingeringMarkCommand.cpp:47
+msgid "Add Fingering &0 (Thumb)"
+msgstr ""
+
+#: ../src/commands/notation/AddFingeringMarkCommand.cpp:49
+#, c-format
+msgid "Add Fingering &%1"
+msgstr ""
+
+#: ../src/document/io/HydrogenXMLHandler.cpp:277
+msgid " imported from Hydrogen "
+msgstr ""
+
+#: ../src/document/io/LilyPondExporter.cpp:404
+msgid ""
+"LilyPond does not allow spaces or backslashes in filenames.\n"
+"\n"
+"Would you like to use\n"
+"\n"
+" %1\n"
+"\n"
+" instead?"
+msgstr ""
+
+#: ../src/document/io/LilyPondExporter.cpp:2054
+msgid "warning: overlong bar truncated here"
+msgstr ""
+
+#: ../src/document/io/LilyPondExporter.cpp:2060
+msgid "warning: bar too short, padding with rests"
+msgstr ""
+
+#: ../src/document/MultiViewCommandHistory.cpp:318
+msgid "Nothing to undo"
+msgstr ""
+
+#: ../src/document/MultiViewCommandHistory.cpp:320
+msgid "Nothing to redo"
+msgstr ""
+
+#: ../src/document/MultiViewCommandHistory.cpp:328
+#: ../src/document/MultiViewCommandHistory.cpp:372
+#, c-format
+msgid "Und&o %1"
+msgstr ""
+
+#: ../src/document/MultiViewCommandHistory.cpp:330
+#: ../src/document/MultiViewCommandHistory.cpp:374
+#, c-format
+msgid "Re&do %1"
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:328
+msgid ""
+"The current file has been modified.\n"
+"Do you want to save it?"
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:480
+#, c-format
+msgid ""
+"_n: Delete the 1 audio file recorded during the unsaved session?\n"
+"Delete the %n audio files recorded during the unsaved session?"
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:501
+msgid ""
+"The following audio files were recorded during this session but have been "
+"unloaded\n"
+"from the audio file manager, and so are no longer in use in the document you "
+"are saving.\n"
+"\n"
+"You may want to clean up these files to save disk space.\n"
+"\n"
+"Please select any you wish to delete permanently from the hard disk.\n"
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:517
+#, c-format
+msgid ""
+"_n: <qt>About to delete 1 audio file permanently from the hard "
+"disk.<br>There will be no way to recover this file.<br>Are you sure?</qt>\n"
+"\n"
+"<qt>About to delete %n audio files permanently from the hard disk.<br>There "
+"will be no way to recover these files.<br>Are you sure?</qt>"
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:580
+msgid "Can't open file '%1'"
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:585
+msgid "Reading file..."
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:603
+msgid "Could not open Rosegarden file"
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:641
+msgid "Error when parsing file '%1': \"%2\""
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:689
+msgid "Generating audio previews..."
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:721
+msgid "Merge"
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:1605
+msgid "File load cancelled"
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:1625
+msgid ""
+"<h3>Audio and plugins not available</h3><p>This composition uses audio files "
+"or plugins, but Rosegarden is currently running without audio because the "
+"JACK audio server was not available on startup.</p><p>Please exit "
+"Rosegarden, start the JACK audio server and re-start Rosegarden if you wish "
+"to load this complete composition.</p><p><b>WARNING:</b> If you re-save this "
+"composition, all audio and plugin data and settings in it will be lost.</p>"
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:1628
+msgid ""
+"<h3>Audio and plugins not available</h3><p>This composition uses audio files "
+"or plugins, but you are running a version of Rosegarden that was compiled "
+"without audio support.</p><p><b>WARNING:</b> If you re-save this composition "
+"from this version of Rosegarden, all audio and plugin data and settings in "
+"it will be lost.</p>"
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:1665
+msgid ""
+"<h3>Incorrect audio sample rate</h3><p>This composition contains audio files "
+"that were recorded or imported with the audio server running at a different "
+"sample rate (%1 Hz) from the current JACK server sample rate (%2 "
+"Hz).</p><p>Rosegarden will play this composition at the correct speed, but "
+"any audio files in it will probably sound awful.</p><p>Please consider "
+"re-starting the JACK server at the correct rate (%3 Hz) and re-loading this "
+"composition before you do any more work with it.</p>"
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:1675
+msgid ""
+"<h3>Inconsistent audio sample rates</h3><p>This composition contains audio "
+"files at more than one sample rate.</p><p>Rosegarden will play them at the "
+"correct speed, but any audio files that were recorded or imported at rates "
+"different from the current JACK server sample rate (%1 Hz) will probably "
+"sound awful.</p><p>Please see the audio file manager dialog for more "
+"details, and consider resampling any files that are at the wrong rate.</p>"
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:1676
+msgid "Inconsistent sample rates"
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:1690
+msgid ""
+"<h3>Plugins not found</h3><p>The following audio plugins could not be "
+"loaded:</p><ul>"
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:1698
+msgid "<li>%1 (from %2)</li>"
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:1712
+msgid ""
+"This file contains one or more old element types that are now deprecated.\n"
+"Support for these elements may disappear in future versions of Rosegarden.\n"
+"We recommend you re-save this file from this version of Rosegarden to ensure "
+"that it can still be re-loaded in future versions."
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:2207
+msgid "Insert Recorded MIDI"
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:2560
+msgid "%1 (recorded)"
+msgstr ""
+
+#: ../src/document/RoseXmlHandler.cpp:442
+msgid ""
+"This file was written by Rosegarden %1, and it uses\n"
+"a different file format that cannot be read by this version."
+msgstr ""
+
+#: ../src/document/RoseXmlHandler.cpp:452
+msgid ""
+"This file was written by Rosegarden %1, which is more recent than this "
+"version.\n"
+"There may be some incompatibilities with the file format."
+msgstr ""
+
+#: ../src/document/RoseXmlHandler.cpp:1687
+msgid "Loading plugins..."
+msgstr ""
+
+#: rc.cpp:6 rc.cpp:144
+#, no-c-format
+msgid "Se&gment"
+msgstr ""
+
+#: rc.cpp:9 rc.cpp:84 rc.cpp:147 rc.cpp:303
+#, no-c-format
+msgid "Edit &With"
+msgstr ""
+
+#: rc.cpp:12 rc.cpp:21 rc.cpp:30 rc.cpp:39 rc.cpp:345
+#, no-c-format
+msgid "Actions Toolbar"
+msgstr ""
+
+#: rc.cpp:15 rc.cpp:33 rc.cpp:129 rc.cpp:285
+#, no-c-format
+msgid "Time Toolbar"
+msgstr ""
+
+#: rc.cpp:18 rc.cpp:36 rc.cpp:57 rc.cpp:63 rc.cpp:120 rc.cpp:243 rc.cpp:342
+#, no-c-format
+msgid "Transport Toolbar"
+msgstr ""
+
+#: rc.cpp:24 rc.cpp:42 rc.cpp:123 rc.cpp:348
+#, no-c-format
+msgid "Zoom Toolbar"
+msgstr ""
+
+#: rc.cpp:45 rc.cpp:60 rc.cpp:99 rc.cpp:228 rc.cpp:327
+#, no-c-format
+msgid "T&ransport"
+msgstr ""
+
+#: rc.cpp:51
+#, no-c-format
+msgid "Number of Stereo &Inputs"
+msgstr ""
+
+#: rc.cpp:54
+#, no-c-format
+msgid "&Number of Submasters"
+msgstr ""
+
+#: rc.cpp:66
+#, no-c-format
+msgid "&Import"
+msgstr ""
+
+#: rc.cpp:69
+#, no-c-format
+msgid "&Merge"
+msgstr ""
+
+#: rc.cpp:72
+#, no-c-format
+msgid "&Export"
+msgstr ""
+
+#: rc.cpp:75 rc.cpp:141 rc.cpp:297
+#, no-c-format
+msgid "&Composition"
+msgstr ""
+
+#: rc.cpp:78
+#, no-c-format
+msgid "&Studio"
+msgstr ""
+
+#: rc.cpp:81
+#, no-c-format
+msgid "Se&gments"
+msgstr ""
+
+#: rc.cpp:90
+#, no-c-format
+msgid "Trac&ks"
+msgstr ""
+
+#: rc.cpp:93
+#, no-c-format
+msgid "Set &Instrument"
+msgstr ""
+
+#: rc.cpp:102 rc.cpp:234 rc.cpp:333
+#, no-c-format
+msgid "&Toolbars"
+msgstr ""
+
+#: rc.cpp:105 rc.cpp:237 rc.cpp:336
+#, no-c-format
+msgid "&Rulers"
+msgstr ""
+
+#: rc.cpp:111 rc.cpp:240 rc.cpp:339
+#, no-c-format
+msgid "Tools Toolbar"
+msgstr ""
+
+#: rc.cpp:114
+#, no-c-format
+msgid "Tracks Toolbar"
+msgstr ""
+
+#: rc.cpp:117
+#, no-c-format
+msgid "Editors Toolbar"
+msgstr ""
+
+#: rc.cpp:135
+#, no-c-format
+msgid "&Layout Mode"
+msgstr ""
+
+#: rc.cpp:138 rc.cpp:294
+#, no-c-format
+msgid "Add Event Ruler"
+msgstr ""
+
+#: rc.cpp:150
+#, no-c-format
+msgid "N&ote"
+msgstr ""
+
+#: rc.cpp:153
+#, no-c-format
+msgid "Mar&ks"
+msgstr ""
+
+#: rc.cpp:156
+#, no-c-format
+msgid "&Ornaments"
+msgstr ""
+
+#: rc.cpp:159
+#, no-c-format
+msgid "&Fingerings"
+msgstr ""
+
+#: rc.cpp:162
+#, no-c-format
+msgid "S&lashes"
+msgstr ""
+
+#: rc.cpp:165 rc.cpp:219
+#, no-c-format
+msgid "&Accidentals"
+msgstr ""
+
+#: rc.cpp:168
+#, no-c-format
+msgid "&Phrase"
+msgstr ""
+
+#: rc.cpp:171
+#, no-c-format
+msgid "Slur &Position"
+msgstr ""
+
+#: rc.cpp:174
+#, no-c-format
+msgid "Tie &Position"
+msgstr ""
+
+#: rc.cpp:177
+#, no-c-format
+msgid "&Octaves"
+msgstr ""
+
+#: rc.cpp:180 rc.cpp:306
+#, no-c-format
+msgid "Ad&just"
+msgstr ""
+
+#: rc.cpp:183
+#, no-c-format
+msgid "R&ests"
+msgstr ""
+
+#: rc.cpp:186 rc.cpp:213
+#, no-c-format
+msgid "&Notes"
+msgstr ""
+
+#: rc.cpp:189 rc.cpp:309
+#, no-c-format
+msgid "&Quantize"
+msgstr ""
+
+#: rc.cpp:195 rc.cpp:315
+#, no-c-format
+msgid "Trans&pose"
+msgstr ""
+
+#: rc.cpp:198 rc.cpp:318
+#, no-c-format
+msgid "Convert"
+msgstr ""
+
+#: rc.cpp:201
+#, no-c-format
+msgid "&Fine Positioning"
+msgstr ""
+
+#: rc.cpp:204
+#, no-c-format
+msgid "Fine Ti&ming"
+msgstr ""
+
+#: rc.cpp:207
+#, no-c-format
+msgid "&Visibility"
+msgstr ""
+
+#: rc.cpp:216
+#, no-c-format
+msgid "&Rests"
+msgstr ""
+
+#: rc.cpp:222
+#, no-c-format
+msgid "&Clefs"
+msgstr ""
+
+#: rc.cpp:225 rc.cpp:324
+#, no-c-format
+msgid "Local &Cursor"
+msgstr ""
+
+#: rc.cpp:246
+#, no-c-format
+msgid "Notes Toolbar"
+msgstr ""
+
+#: rc.cpp:249
+#, no-c-format
+msgid "Rests Toolbar"
+msgstr ""
+
+#: rc.cpp:252
+#, no-c-format
+msgid "Clefs Toolbar"
+msgstr ""
+
+#: rc.cpp:255
+#, no-c-format
+msgid "Accidentals Toolbar"
+msgstr ""
+
+#: rc.cpp:258
+#, no-c-format
+msgid "Group Toolbar"
+msgstr ""
+
+#: rc.cpp:261
+#, no-c-format
+msgid "Marks Toolbar"
+msgstr ""
+
+#: rc.cpp:264
+#, no-c-format
+msgid "Meta Toolbar"
+msgstr ""
+
+#: rc.cpp:267
+#, no-c-format
+msgid "Layout Toolbar"
+msgstr ""
+
+#: rc.cpp:270 rc.cpp:351
+#, no-c-format
+msgid "Control Ruler actions"
+msgstr ""
+
+#: rc.cpp:273 rc.cpp:354
+#, no-c-format
+msgid "Property Ruler actions"
+msgstr ""
+
+#: rc.cpp:276
+#, no-c-format
+msgid "&Action"
+msgstr ""
+
+#: rc.cpp:279
+#, no-c-format
+msgid "General Toolbar"
+msgstr ""
+
+#: rc.cpp:291
+#, no-c-format
+msgid "&Grid"
+msgstr ""
+
+#: rc.cpp:300
+#, no-c-format
+msgid "&Segment"
+msgstr ""
+
+#: rc.cpp:361
+#, no-c-format
+msgid "Hide additional controls"
+msgstr ""
+
+#: rc.cpp:365
+#, no-c-format
+msgid "Panic Button"
+msgstr ""
+
+#: rc.cpp:368
+#, no-c-format
+msgid "Resets all MIDI devices if you've got stuck notes"
+msgstr ""
+
+#: rc.cpp:375
+#, no-c-format
+msgid "Provides a metronome click for you to play along with"
+msgstr ""
+
+#: rc.cpp:378
+#, no-c-format
+msgid "Shows MIDI activity in and out of Rosegarden"
+msgstr ""
+
+#: rc.cpp:381
+#, no-c-format
+msgid "IN"
+msgstr ""
+
+#: rc.cpp:384
+#, no-c-format
+msgid "OUT"
+msgstr ""
+
+#: rc.cpp:387 rc.cpp:390
+#, no-c-format
+msgid "NO EVENTS"
+msgstr ""
+
+#: rc.cpp:397
+#, no-c-format
+msgid "Record either MIDI or audio"
+msgstr ""
+
+#: rc.cpp:401
+#, no-c-format
+msgid "Loop"
+msgstr ""
+
+#: rc.cpp:404
+#, no-c-format
+msgid "Turn on and off the loop markers (if set)"
+msgstr ""
+
+#: rc.cpp:411
+#, no-c-format
+msgid "Mutes all but the currently selected track"
+msgstr ""
+
+#: rc.cpp:415
+#, no-c-format
+msgid "Start loop or range here"
+msgstr ""
+
+#: rc.cpp:419
+#, no-c-format
+msgid "End loop or range here"
+msgstr ""
+
+#: rc.cpp:422
+#, no-c-format
+msgid "SIG"
+msgstr ""
+
+#: rc.cpp:425
+#, no-c-format
+msgid "DIV"
+msgstr ""
+
+#: rc.cpp:428
+#, no-c-format
+msgid "/16"
+msgstr ""
+
+#: rc.cpp:431
+#, no-c-format
+msgid "TEMPO"
+msgstr ""
+
+#: rc.cpp:434
+#, no-c-format
+msgid "END"
+msgstr ""
+
+#: rc.cpp:437
+#, no-c-format
+msgid "BAR"
+msgstr ""
+
+#: rc.cpp:441
+#, no-c-format
+msgid "Switch between real time, musical time, and frame count"
+msgstr ""
+
+#: rc.cpp:445
+#, no-c-format
+msgid "Show additional controls"
+msgstr ""
+
+#: rc.cpp:449
+#, no-c-format
+msgid "Rewind"
+msgstr ""
+
+#: rc.cpp:452
+#, no-c-format
+msgid "Moves the current pointer position back one bar."
+msgstr ""
+
+#: rc.cpp:456
+#, no-c-format
+msgid "Rewind to beginning"
+msgstr ""
+
+#: rc.cpp:459
+#, no-c-format
+msgid ""
+"Moves the pointer position to the start of the composition. (This may mean "
+"going forwards if the pointer is currently before the start.)"
+msgstr ""
+
+#: rc.cpp:463
+#, no-c-format
+msgid "Play/Pause"
+msgstr ""
+
+#: rc.cpp:466
+#, no-c-format
+msgid ""
+"Plays from the current pointer position, or pauses playback if already in "
+"progress."
+msgstr ""
+
+#: rc.cpp:473
+#, no-c-format
+msgid "Stops playback or recording."
+msgstr ""
+
+#: rc.cpp:477
+#, no-c-format
+msgid "Fast forward"
+msgstr ""
+
+#: rc.cpp:480
+#, no-c-format
+msgid "Moves the current pointer position forwards one bar."
+msgstr ""
+
+#: rc.cpp:484
+#, no-c-format
+msgid "Fast forward to end"
+msgstr ""
+
+#: rc.cpp:487
+#, no-c-format
+msgid ""
+"Moves the pointer position to the end of the composition. (This may mean "
+"going backwards if the pointer is already beyond the end.)"
+msgstr ""
+
+#: rc.cpp:491
+#, no-c-format
+msgid "Display time to end"
+msgstr ""
+
+#: ../docs/en/tips.cpp:3
+msgid ""
+"<p>To configure a track to play using a particular instrument:</p>\n"
+"&nbsp;&nbsp;* click on the track label and hold a moment<br>\n"
+"&nbsp;&nbsp;* select an output device<br>\n"
+"&nbsp;&nbsp;* select one of that device's available instruments (#1 - "
+"#16)<br>\n"
+"&nbsp;&nbsp;* adjust that instrument's output channel, program, bank, and\n"
+"controllers via the instrument parameters box\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:13
+msgid ""
+"<p>...that Rosegarden has an autosave feature?<br><br>\n"
+"You can select your autosave interval from <b>Settings->Configure\n"
+"Rosegarden</b>.<br><br>\n"
+"When something goes awry, such as a power outage or a Rosegarden crash\n"
+"(unfortunately, it happens...) simply load the file you were working on, and "
+"you'll be given the\n"
+"option to load the autosaved version, or the unmodified original.</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:23
+msgid ""
+"<p>\n"
+"...that you can save the current document as your default studio by using\n"
+"<b>Composition -> Studio -> Save Current Document as Default "
+"Studio</b>?</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:30
+msgid ""
+"<p>...that your default studio is a complete Rosegarden composition that "
+"gets\n"
+"loaded every time you create a new document or import a MIDI file?</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:36
+msgid ""
+"<p>...that your default studio can contain instrument assignments, document "
+"properties, LilyPond headers,\n"
+"and many other things?<br><br>The default studio is a complete Rosegarden "
+"composition, so it can contain anything that you may wish to have available "
+"in each\n"
+"new document you create.</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:43
+msgid ""
+"<p>...that Rosegarden will detect and create a default connection for ALSA "
+"soft\n"
+"synth applications that are started after Rosegarden is already "
+"running?</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:49
+msgid ""
+"<p>...that you can make your default studio override that in every "
+"Rosegarden composition you load?<br><br>If your studio setup does not change "
+"very often, and you would prefer for\n"
+"the settings in your default studio to take precedence over whatever\n"
+"studio is saved with any files you happen to load, you can make your studio "
+"the default for everything using <b>Settings -> Configure Rosegarden ->\n"
+"MIDI -> Always use default studio when loading files</b>.</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:57
+msgid ""
+"<p>If you have accidentally recorded a segment so short that it does not\n"
+"appear on the canvas, which you can only hear during subsequent recording\n"
+"sessions, you can gain access to it by using <b>Composition -> Change\n"
+"Composition Start and End</b> and then setting the composition to start at a "
+"negative number.</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:65
+msgid ""
+"<p>...that if you place a note at the wrong pitch using the notation or "
+"matrix editor, you can move it one semitone at a time with the up and down "
+"arrow keys on your keyboard?</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:70
+msgid ""
+"<p>...that you can toggle stem directions in the notation editor by "
+"selecting\n"
+"one or more notes and using Ctrl-PageUp and Ctrl-PageDown?</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:76
+msgid ""
+"<p>...that you can change the accidental used for a note in the notation "
+"editor (without changing the pitch of the note) by selecting\n"
+"it and using the up and down arrow keys with both Ctrl and Shift "
+"pressed?</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:82 ../docs/en/tips.cpp:93
+msgid ""
+"<p>...that you can hold down the Shift key while repositioning segments on "
+"the\n"
+"segment canvas in order to avoid the \"snap-to\" effect and exert finer "
+"control?</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:88
+msgid ""
+"<p>...that you can use the arrow tool to draw, move, and resize segments and "
+"events as well as to select them?<br><br>Drag a segment or event block to "
+"move it, drag the right edge of a block to resize it, and drag with the "
+"middle mouse button pressed to draw a new segment or event.<br><br>(Of "
+"course, the dedicated draw, move and resize tools are still quicker for "
+"repeated operations.)</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:99
+msgid ""
+"<p>...that you can hold down the Shift key while repositioning or resizing "
+"events in the\n"
+"matrix view in order to avoid the \"snap-to\" effect and exert finer "
+"control?</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:105
+msgid ""
+"<p>...that you can edit multiple segments on multiple tracks simultaneously "
+"in\n"
+"the notation editor? Simply select the segments, then use <b>Edit -> Open "
+"in Notation Editor</b>.</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:111
+msgid ""
+"<p>...that Rosegarden can export files for use by LilyPond, the high-quality "
+"score typesetting system?<br><br>\n"
+"From the <b>File</b> menu, navigate to <b>Export -> Export LilyPond "
+"File</b></p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:117
+msgid ""
+"<p>...that Rosegarden can print via LilyPond, the high-quality score "
+"typesetting system?<br><br>\n"
+"From the <b>File</b> menu, navigate to <b>Preview with LilyPond</b>. The "
+"file\n"
+"will be exported, rendered, and a preview will appear in KPDF, or one of\n"
+"several other PDF viewers, where it can then be printed as well.</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:125
+msgid ""
+"<p>...that if you use the quantizer from within the notation view, you can "
+"tell it to quantize only the timing used for notation -- making it possible "
+"to have good looking notation <b>and</b> a human MIDI performance?</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:130
+msgid ""
+"<p>...that you can change segment labels using the controls on the Segment "
+"Parameters box\n"
+"in the main window?</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:136
+msgid ""
+"<p>...that the number of tracks in new documents is based on the contents "
+"of\n"
+"your autoload.rg file?\n"
+"<br><br>\n"
+"Whether you prefer to start with three tracks or 43, create a document that\n"
+"contains the desired number of tracks, plus any other studio or document "
+"properties settings\n"
+"you wish to configure, and use <b>Composition -> Studio -> Save Current "
+"Document as Default\n"
+"Studio</b> to make this your new default.</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:147
+msgid ""
+"<p>...that you can change the name of a track by double clicking on the "
+"label? (The\n"
+"label must be visible for this to work.)</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:153
+msgid ""
+"<p>...that you can configure what happens when you double-click on a "
+"segment?<br><br>Go to <b>Settings -> Configure Rosegarden</b> and choose "
+"your preferred editing window under the <b>Behaviour</b> tab.</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:158
+msgid ""
+"<p>...that Rosegarden is being developed as a community effort with\n"
+"contributions from around the world?<br><br>\n"
+"The four most active developers live in London (England), Cannes, "
+"Barcelona,\n"
+"and... Christiansburg? (Christiansburg is a town of about 50,000 in\n"
+"southwestern Virginia, USA.)<br><br>\n"
+"We have had contributors from elsewhere in the US, UK, Spain, Mexico, "
+"Argentina, Germany,\n"
+"Sweden, Russia, Japan, Finland, and Italy, just to name a few...</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:169
+msgid ""
+"<p>...that Rosegarden is available in Spanish, French, German, Russian, "
+"Welsh, Swedish, Italian and Estonian\n"
+"translations? (Just to name a few.)<br><br>\n"
+"If you're interested in translating Rosegarden to another language, drop us "
+"a\n"
+"line at <b>[email protected]</b>.</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:177
+msgid ""
+"<p>...that you can change the total number of bars in the composition via\n"
+"<b>Composition -> Change Composition Start and End</b>?</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:183
+msgid ""
+"<p>...that you can see the difference between performance and display "
+"duration\n"
+"of duration-quantized notes in the notation editor?<br><br>\n"
+"Use <b>Settings -> Show Raw Note Ruler</b> to turn on this handy\n"
+"feature.<br><br>\n"
+"<i>Note that this feature does not work in page layout view.</i></p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:192
+msgid ""
+"<p>...that you can add tempo and time-signature changes by double-clicking "
+"on the values displayed in the transport window or tempo rulers?</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:197
+msgid ""
+"<p>...that the transport window can display musical time, sample frame "
+"count, and a visual metronome as well as real time?<br><br>Just click on the "
+"small button at the extreme top left of the window.</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:202
+msgid ""
+"<p>...that you can select all notes of a particular pitch in the matrix "
+"view, by shift-clicking on that pitch on the piano keyboard at the "
+"left?<br><br>If you shift-click-drag, you can select whole ranges too.</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:207
+msgid ""
+"<p>...that you can set a loop in the main window by clicking-and-dragging on "
+"the time ruler with Shift pressed?<br><br>(If the ruler isn't visible, use "
+"<b>Settings -> Show Rulers</b>.)</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:212
+msgid ""
+"<p>...that if you're editing a section in the matrix or notation view, you "
+"can\n"
+"set that section to loop while you edit it?<br><br>Select it and use "
+"<b>Tools ->\n"
+"Local Cursor -> Set Loop to Selection</b>, then hit Play.</p><br><br>\n"
+"<i>This feature does not work quite as well for compositions that include "
+"sampled\n"
+"audio.</i>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:221
+msgid ""
+"<p>...if you have more than one note or controller event at the same time, "
+"you\n"
+"can use the [ and ] keys to flip the stack of events around on the "
+"controller\n"
+"and velocity rulers in order to bring the item you wish to adjust into\n"
+"focus.</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:229
+msgid ""
+"<p>...that the notation view shows you notes using their display duration, "
+"while the\n"
+"matrix allows you to edit their performance duration?<br><br>\n"
+"<i>Be careful with tied notes in the matrix. It is not apparent that they "
+"are\n"
+"tied, and if you split up a pair of tied notes, subsequent notation views "
+"will\n"
+"be confused and unhappy. This is an old bug that has been on our TODO list\n"
+"for years. Sorry about that, folks. Patches welcome.</i>\n"
+"</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:240
+msgid ""
+"<p>If you're working with a human performance and you need to insert some "
+"new\n"
+"notes, these new notes will sound for their entire written duration. To "
+"blend\n"
+"these new notes into a human performance, select them, then use <b>Adjust -> "
+"Interpret...</b> \n"
+"from the notation view to interpret any marks and massage their "
+"performance\n"
+"durations to something less mechanical.</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:249
+msgid ""
+"<p>...that Rosegarden can export certain things to LilyPond that it cannot "
+"yet\n"
+"display within its own native interface?<br><br>These new directives can be "
+"inserted\n"
+"via the <b>T</b> text insert tool in the notation view.<br><br>\n"
+"Load the example files\n"
+"<b>lilypond-alternative-endings.rg</b> and <b>lilypond-directives.rg</b> for "
+"a\n"
+"demonstration of how to use the new exportable directives.<br><br>\n"
+"Use <b>File -> Preview with\n"
+"LilyPond</b> to see what they look like on the exported page.<br><br>\n"
+"<i>Be sure to turn on\n"
+"<b>Settings -> Show LilyPond Directives</b> and <b>Show Annotations</b> "
+"within\n"
+"the notation view.</i></p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:264
+msgid ""
+"<p>...that Rosegarden has track parameters allowing you to <b>Create "
+"segments with:</b> certain\n"
+"properties by default?<br><br>You can pre-select the clef, transposition, "
+"colour, and specify\n"
+"the highest and lowest playable notes (notes outside this range display in\n"
+"red by default). Then draw a segment with the pencil, or record one, and "
+"any\n"
+"new segments created on this track will take these properties as segment\n"
+"parameters.<br><br>\n"
+"<i>These parameters do not apply to audio tracks.</i></p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:275
+msgid ""
+"<p>...that Rosegarden has a database of preset parameters describing more "
+"than 300\n"
+"musical instruments from the real world, grouped into several convenient\n"
+"categories?<br><br>Each preset contains a clef, transposition, and playable "
+"range\n"
+"suggestions for both amateur and professional players.<br><br>Click the\n"
+"<b>Load</b> button in the new track parameters box to get started! <i>(If "
+"you\n"
+"do not see a <b>Load</b> button, be sure your parameter panel is set for\n"
+"tabbed mode, rather than stacked mode.)</i> <br><br> <i>(Special thanks to "
+"Magnus\n"
+"Johansson for assembling this extraordinary database.)</i></p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:287
+msgid ""
+"<p>...that when exporting to Lilypond, you can merge tracks that have the "
+"same name onto a single staff?<br><br>For example, if there are three voices "
+"in a single part, write each\n"
+"voice as an independent segment/staff, each on a separate track. Give all\n"
+"three tracks the same name, and select <b>[x] Merge tracks that have the "
+"same\n"
+"name</b> from the options dialog that appears when you export to, or "
+"preview\n"
+"with LilyPond.<br><br>\n"
+"<i>The tracks must have a non-default name for this to work.</i></p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:297
+msgid ""
+" \t \n"
+"<p>...that you can use the mouse wheel to scroll up and down, scroll left "
+"and right, and zoom in and out?<br><br>Just roll the wheel to scroll up or "
+"down. Hold Alt as well to scroll left or right, or hold Ctrl to zoom in and "
+"out.</p> \t \n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:303
+msgid ""
+" \t \n"
+"<p>...that you can time-stretch an audio segment -- stretching or squashing "
+"a\n"
+"sample to a different duration without changing its pitch -- just by\n"
+"dragging its right edge with the Ctrl key pressed?</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:311
+msgid ""
+" \t \n"
+"<p>...that you can add audio to your Rosegarden composition just by dragging "
+"an audio file from your file manager and dropping it on the Rosegarden "
+"segment canvas? (Make sure you drop it on an audio track!)<br><br>You can "
+"also drop audio files from Rosegarden's audio file manager window onto the "
+"segment canvas, and from other programs onto the audio file manager.</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:317
+msgid ""
+" \t \n"
+"<p>...that you can set the tempo to match the duration of an audio segment "
+"if you know it's an exact number of bars or beats long?<br><br>Just select "
+"the audio segment and use <b>Composition -> Tempo and Time Signature -> Set "
+"Tempo to Audio Segment Duration</b>.</p>\n"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:1
+msgid "Feta Pixmaps"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:2 ../data/fonts/mappings/fonts.cpp:7
+msgid "GNU Lilypond"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:3 ../data/fonts/mappings/fonts.cpp:8
+msgid "Copyright (c) 1997--2003 Han-Wen Nienhuys and Jan Nieuwenhuizen"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:4 ../data/fonts/mappings/fonts.cpp:9
+#: ../data/fonts/mappings/fonts.cpp:14 ../data/fonts/mappings/fonts.cpp:19
+#: ../data/fonts/mappings/fonts.cpp:24 ../data/fonts/mappings/fonts.cpp:29
+#: ../data/fonts/mappings/fonts.cpp:34 ../data/fonts/mappings/fonts.cpp:39
+#: ../data/fonts/mappings/fonts.cpp:44 ../data/fonts/mappings/fonts.cpp:49
+#: ../data/fonts/mappings/fonts.cpp:54
+msgid "Chris Cannam"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:5 ../data/fonts/mappings/fonts.cpp:40
+msgid "pixmap"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:6
+msgid "Feta"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:10 ../data/fonts/mappings/fonts.cpp:15
+#: ../data/fonts/mappings/fonts.cpp:20 ../data/fonts/mappings/fonts.cpp:25
+#: ../data/fonts/mappings/fonts.cpp:30 ../data/fonts/mappings/fonts.cpp:35
+#: ../data/fonts/mappings/fonts.cpp:45 ../data/fonts/mappings/fonts.cpp:50
+#: ../data/fonts/mappings/fonts.cpp:55
+msgid "scalable"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:11
+msgid "Fughetta"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:12
+msgid ""
+"Created by Blake Hodgetts; freely redistributable. See "
+"http://www.efn.org/~bch/aboutfonts.html"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:13
+msgid "Copyright 1995-1999 Blake Hodgetts"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:16
+msgid "Inkpen"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:17
+msgid "Inkpen is part of Sibelius, but other fonts may use the same mappings."
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:18 ../data/fonts/mappings/fonts.cpp:28
+msgid "Copyright Sibelius Software Ltd"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:21
+msgid "Maestro"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:22
+msgid "Maestro is part of Finale, but other fonts use the same mappings."
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:23 ../data/fonts/mappings/fonts.cpp:33
+msgid "Copyright Coda Inc"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:27
+msgid "Opus is part of Sibelius, but other fonts may use the same mappings."
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:31
+msgid "Petrucci"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:32
+msgid "Petrucci is part of Finale, but other fonts use the same mappings."
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:36
+msgid "RG21"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:37
+msgid "Rosegarden 2.1"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:38
+msgid "Copyright (c) 1994--2001 Chris Cannam"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:41
+msgid "Sonata"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:42
+msgid "Adobe"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:43
+msgid "Copyright Adobe Inc"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:46
+msgid "Steinberg"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:47
+msgid "The Steinberg Notation font is part of Cubase."
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:48
+msgid "Copyright Steinberg Inc"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:51
+msgid "Xinfonia"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:52
+msgid "xemo.org"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:53
+msgid "Copyright 2001-2003 Xemus Software LLC"
+msgstr ""
+
+#: ../data/styles/styles.cpp:1
+msgid "Classical"
+msgstr ""
+
+#: ../data/styles/styles.cpp:2
+msgid "Cross"
+msgstr ""
+
+#: ../data/styles/styles.cpp:3
+msgid "Mensural"
+msgstr ""
+
+#: ../data/styles/styles.cpp:4
+msgid "Triangle"
+msgstr ""
diff --git a/po/ru.po b/po/ru.po
new file mode 100644
index 0000000..66b0e6b
--- /dev/null
+++ b/po/ru.po
@@ -0,0 +1,11895 @@
+# translation of ru.po to Russian
+# This file is distributed under the same license as the PACKAGE package.
+# Copyright (C) 2003 THE PACKAGE'S COPYRIGHT HOLDER.
+#
+# Alexandre Prokoudine <[email protected]>, 2003, 2004.
+# Alexandre Prokoudine <[email protected]>, 2004.
+# Alexandre Prokoudine <[email protected]>, 2004, 2005, 2006.
+msgid ""
+msgstr ""
+"Project-Id-Version: ru\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-04-24 18:19-0400\n"
+"PO-Revision-Date: 2007-11-12 09:19+0300\n"
+"Last-Translator: Alexandre Prokoudine <[email protected]>\n"
+"Language-Team: Russian <[email protected]>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.4\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%"
+"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+
+#: ../src/gui/dialogs/RescaleDialog.cpp:51 rc.cpp:192 rc.cpp:312
+#, no-c-format
+msgid "Rescale"
+msgstr "Смена масштаба"
+
+#: ../src/gui/dialogs/RescaleDialog.cpp:56
+msgid "Duration of selection"
+msgstr "Длительность выделения"
+
+#: ../src/gui/dialogs/RescaleDialog.cpp:62
+msgid "Adjust times of following events accordingly"
+msgstr "Соотв. образом изменить времена следующих событий"
+
+#: ../src/gui/dialogs/PitchDialog.cpp:45
+#: ../src/gui/dialogs/RescaleDialog.cpp:72
+#: ../src/gui/dialogs/TimeDialog.cpp:51 ../src/gui/dialogs/TimeDialog.cpp:68
+#: ../src/gui/studio/BankEditorDialog.cpp:109
+msgid "Reset"
+msgstr "Сбросить"
+
+#: ../src/commands/segment/SegmentSplitByPitchCommand.cpp:46
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:46
+msgid "Split by Pitch"
+msgstr "Разделить по высоте тона"
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:54
+msgid "Starting split pitch"
+msgstr "Начало разделения по высоте тона"
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:57
+msgid "Range up and down to follow music"
+msgstr "Выстраивать вверх и вниз по ходу композиции"
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:63
+msgid "Duplicate non-note events"
+msgstr "Дублировать ненотные события"
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:66
+msgid "Clef handling:"
+msgstr "Действия с ключом:"
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:69
+msgid "Leave clefs alone"
+msgstr "Не трогать ключи"
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:70
+msgid "Guess new clefs"
+msgstr "Угадать новый ключ"
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:71
+msgid "Use treble and bass clefs"
+msgstr "Использовать дискантовые и басовые ключи"
+
+#: ../src/gui/dialogs/DocumentConfigureDialog.cpp:64
+msgid "Document Properties"
+msgstr "Свойства документа"
+
+#: ../src/gui/dialogs/MakeOrnamentDialog.cpp:45
+#: ../src/gui/editors/notation/NotationView.cpp:6048
+msgid "Make Ornament"
+msgstr "Создать украшение"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:183
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:179
+#: ../src/gui/dialogs/EventEditDialog.cpp:128
+#: ../src/gui/dialogs/MakeOrnamentDialog.cpp:49
+#: ../src/gui/studio/DeviceEditorDialog.cpp:74
+#: ../src/gui/studio/NameSetEditor.cpp:72
+#: ../src/gui/widgets/ColourTable.cpp:51
+msgid "Name"
+msgstr "Имя"
+
+#: ../src/gui/dialogs/MakeOrnamentDialog.cpp:51
+msgid ""
+"The name is used to identify both the ornament\n"
+"and the triggered segment that stores\n"
+"the ornament's notes."
+msgstr ""
+"Это имя используется для идентификации как украшения,\n"
+"так и переключаемого сегмента, хранящего ноты украшения."
+
+#: ../src/gui/dialogs/MakeOrnamentDialog.cpp:54
+msgid "Name: "
+msgstr "Имя: "
+
+#: ../src/gui/dialogs/MakeOrnamentDialog.cpp:57
+#: ../src/gui/editors/eventlist/EventView.cpp:717
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:92
+msgid "Base pitch"
+msgstr "Базовая высота тона"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:57
+#: ../src/gui/editors/eventlist/EventView.cpp:140
+msgid "Text"
+msgstr "Текст"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:66
+msgid "Specification"
+msgstr "Спецификация"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:68
+msgid "Preview"
+msgstr "Предосмотр"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:72
+msgid "Text: "
+msgstr "Текст: "
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:79
+msgid "Style: "
+msgstr "Стиль: "
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:90
+msgid "Dynamic"
+msgstr "Динамический"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:93
+msgid "Direction"
+msgstr "Направление"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:96
+msgid "Local Direction"
+msgstr "Локальное направление"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:63
+#: ../src/gui/dialogs/TextEventDialog.cpp:99
+#: ../src/gui/editors/tempo/TempoView.cpp:91
+msgid "Tempo"
+msgstr "Темп"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:102
+msgid "Local Tempo"
+msgstr "Локальный темп"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:105
+msgid "Lyric"
+msgstr "Лирика"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:108
+#: ../src/gui/editors/notation/NotationView.cpp:4242
+msgid "Chord"
+msgstr "Аккорд"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:111
+msgid "Annotation"
+msgstr "Аннотация"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:114
+msgid "LilyPond Directive"
+msgstr "Указания Lilypond"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:138
+msgid "Verse: "
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:148
+msgid "Dynamic: "
+msgstr "Динамика: "
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:152
+msgid "ppp"
+msgstr "ppp"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:153
+msgid "pp"
+msgstr "pp"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:154
+msgid "p"
+msgstr "p"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:155
+msgid "mp"
+msgstr "mp"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:156
+msgid "mf"
+msgstr "mf"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:157
+msgid "f"
+msgstr "f"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:158
+msgid "ff"
+msgstr "ff"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:159
+msgid "fff"
+msgstr "fff"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:160
+msgid "rfz"
+msgstr "rfz"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:161
+msgid "sf"
+msgstr "sf"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:165
+msgid "Direction: "
+msgstr "Направление:"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:174
+msgid " ,"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:175
+msgid "D.C. al Fine"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:176
+msgid "D.S. al Fine"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:177
+msgid "Fine"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:178
+msgid "D.S. al Coda"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:179
+msgid "to Coda"
+msgstr "к коде"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:180
+msgid "Coda"
+msgstr "Кода"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:184
+msgid "Local Direction: "
+msgstr "Локальное направление: "
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:188
+msgid "accel."
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:189
+msgid "ritard."
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:190
+msgid "ralletando"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:191
+msgid "a tempo"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:192
+msgid "legato"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:193
+msgid "simile"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:194
+msgid "pizz."
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:195
+msgid "arco"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:196
+msgid "non vib."
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:197
+msgid "sul pont."
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:198
+#: ../src/gui/dialogs/TextEventDialog.cpp:200
+msgid "sul tasto"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:199
+msgid "con legno"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:201
+msgid "sul G"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:202
+msgid "ordinario"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:203
+msgid "Muta in "
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:204
+msgid "volti subito "
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:205
+msgid "soli"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:206
+msgid "div."
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:210
+msgid "Tempo: "
+msgstr "Темп:"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:214
+#: ../src/gui/dialogs/TextEventDialog.cpp:238
+msgid "Grave"
+msgstr "Grave"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:215
+#: ../src/gui/dialogs/TextEventDialog.cpp:239
+msgid "Adagio"
+msgstr "Adagio"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:216
+#: ../src/gui/dialogs/TextEventDialog.cpp:240
+msgid "Largo"
+msgstr "Largo"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:217
+#: ../src/gui/dialogs/TextEventDialog.cpp:241
+msgid "Lento"
+msgstr "Lento"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:218
+#: ../src/gui/dialogs/TextEventDialog.cpp:242
+msgid "Andante"
+msgstr "Andante"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:219
+#: ../src/gui/dialogs/TextEventDialog.cpp:243
+msgid "Moderato"
+msgstr "Moderato"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:220
+#: ../src/gui/dialogs/TextEventDialog.cpp:244
+msgid "Allegretto"
+msgstr "Allegretto"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:221
+#: ../src/gui/dialogs/TextEventDialog.cpp:245
+msgid "Allegro"
+msgstr "Allegro"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:222
+#: ../src/gui/dialogs/TextEventDialog.cpp:246
+msgid "Vivace"
+msgstr "Vivace"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:223
+#: ../src/gui/dialogs/TextEventDialog.cpp:247
+msgid "Presto"
+msgstr "Presto"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:224
+#: ../src/gui/dialogs/TextEventDialog.cpp:248
+msgid "Prestissimo"
+msgstr "Prestissimo"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:225
+#: ../src/gui/dialogs/TextEventDialog.cpp:249
+msgid "Maestoso"
+msgstr "Maestoso"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:226
+#: ../src/gui/dialogs/TextEventDialog.cpp:250
+msgid "Sostenuto"
+msgstr "Sostenuto"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:227
+#: ../src/gui/dialogs/TextEventDialog.cpp:251
+msgid "Tempo Primo"
+msgstr "Tempo Primo"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:234
+msgid "Local Tempo: "
+msgstr "Локальный темп:"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:255
+msgid "Directive: "
+msgstr "Указание: "
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:312
+msgid "Example"
+msgstr "Пример"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:65
+msgid "Event Filter"
+msgstr "Фильтр событий"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:86
+msgid "Note Events"
+msgstr "Нотные события"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:90
+msgid "lowest:"
+msgstr ""
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:93
+msgid "highest:"
+msgstr ""
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:96
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:141
+#: ../src/gui/widgets/PitchChooser.cpp:53
+msgid "Pitch:"
+msgstr "Высота тона:"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:99
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:163
+msgid "Velocity:"
+msgstr "Сила нажатия:"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:102
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:129
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:257
+msgid "Duration:"
+msgstr "Длительность:"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:107
+#: ../src/gui/dialogs/EventFilterDialog.cpp:114
+#: ../src/gui/dialogs/EventFilterDialog.cpp:121
+msgid "include"
+msgstr "включая"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:108
+#: ../src/gui/dialogs/EventFilterDialog.cpp:115
+#: ../src/gui/dialogs/EventFilterDialog.cpp:122
+msgid "exclude"
+msgstr "исключая"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:136
+#: ../src/gui/dialogs/EventFilterDialog.cpp:155
+#: ../src/gui/editors/eventlist/EventView.cpp:172
+#: ../src/gui/editors/eventlist/EventView.cpp:179
+#: ../src/gui/editors/eventlist/EventView.cpp:186
+msgid "edit"
+msgstr "изменить"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:141
+#: ../src/gui/dialogs/EventFilterDialog.cpp:157
+msgid "choose a pitch using a staff"
+msgstr "выберите высоту через нотный стан"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:182
+#: ../src/gui/dialogs/EventFilterDialog.cpp:188
+msgid "longest"
+msgstr ""
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:200
+msgid "Include all"
+msgstr "Включить все"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:203
+msgid "Include entire range of values"
+msgstr "Включить весь диапазон значений"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:206
+msgid "Exclude all"
+msgstr "Исключить все"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:209
+msgid "Exclude entire range of values"
+msgstr "Исключить весь диапазон значений"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:233
+#: ../src/gui/dialogs/EventFilterDialog.cpp:234
+#, fuzzy
+msgid "shortest"
+msgstr "пауза"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:333
+msgid "Lowest pitch"
+msgstr ""
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:343
+msgid "Highest pitch"
+msgstr ""
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:56
+#: ../src/gui/editors/notation/NotationView.cpp:1619
+#: ../src/gui/editors/notation/NotationView.cpp:6088
+msgid "Use Ornament"
+msgstr "Использование украшения"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:260
+#: ../src/gui/configuration/NotationConfigurationPage.h:64
+#: ../src/gui/configuration/NotationConfigurationPage.h:65
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:63
+msgid "Notation"
+msgstr "Партитура"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:68
+msgid "Display as: "
+msgstr "Показать как:"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:84
+msgid "Trill"
+msgstr "Трель"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:84
+msgid "Trill with line"
+msgstr "трель с линией"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:84
+msgid "Trill line only"
+msgstr "только линия трели"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:85
+msgid "Turn"
+msgstr "Повернуть"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:85
+msgid "Mordent"
+msgstr "Мордент"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:85
+msgid "Inverted mordent"
+msgstr "Инвертированный мордент"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:86
+msgid "Long mordent"
+msgstr "Долгий мордент"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:86
+msgid "Long inverted mordent"
+msgstr "Долгий инвертированный мордент"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:94
+msgid "Text mark"
+msgstr "Текстовая помета"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:98
+msgid " Text: "
+msgstr " Текст: "
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:104
+msgid "Performance"
+msgstr "Исполнение"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:109
+msgid "Perform using triggered segment: "
+msgstr "Исполнить при помощи переключаемого сегмента: "
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:75
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:123
+msgid "Perform with timing: "
+msgstr "Сыграть по таймингу: "
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:81
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:129
+msgid "As stored"
+msgstr "Так, как сохранено"
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:82
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:130
+msgid "Truncate if longer than note"
+msgstr "Обрезать, если длиннее ноты"
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:83
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:131
+msgid "End at same time as note"
+msgstr "Закончить одновременно с нотой"
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:84
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:132
+msgid "Stretch or squash segment to note duration"
+msgstr "Растянуть или урезать сегмент до длительности ноты"
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:86
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:134
+msgid "Adjust pitch to note"
+msgstr "Подстроить высоту тона ноты"
+
+#: ../src/gui/dialogs/PitchPickerDialog.cpp:40
+msgid "Pitch Selector"
+msgstr "Выбор высоты тона"
+
+#: ../src/gui/dialogs/BeatsBarsDialog.cpp:44
+msgid "Audio Segment Duration"
+msgstr "Длительность звукового сегмента"
+
+#: ../src/gui/dialogs/BeatsBarsDialog.cpp:50
+msgid "The selected audio segment contains:"
+msgstr "Выбранный звуковой сегмент содержит:"
+
+#: ../src/gui/dialogs/BeatsBarsDialog.cpp:59
+msgid "beat(s)"
+msgstr "долей"
+
+#: ../src/gui/dialogs/BeatsBarsDialog.cpp:60
+msgid "bar(s)"
+msgstr "такт(ов)"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:51
+msgid "Tuplet"
+msgstr "Группа"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:58
+msgid "New timing for tuplet group"
+msgstr "Новый расчёт времени для группы"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:76
+msgid "Play "
+msgstr "Воспроизвести "
+
+#: ../src/gui/dialogs/TupletDialog.cpp:98
+msgid "in the time of "
+msgstr "за время "
+
+#: ../src/gui/dialogs/TupletDialog.cpp:104
+msgid "Timing is already correct: update display only"
+msgstr "Тайминг уже корректен: только обновить отображение"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:114
+msgid "Timing calculations"
+msgstr "Расчёт времени"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:120
+msgid "Selected region:"
+msgstr "Выбранный фргамент:"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:129
+msgid "Group with current timing:"
+msgstr "Группировка по текущему расчёту времени:"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:135
+msgid "Group with new timing:"
+msgstr "Группировка по новому расчёту времени:"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:141
+msgid "Gap created by timing change:"
+msgstr "Интервал, созданный сменой тайминга:"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:149
+msgid "Unchanged at end of selection:"
+msgstr "Без изменения в конце выделения:"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:63 rc.cpp:372
+#, no-c-format
+msgid "Metronome"
+msgstr "Метроном"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:77
+msgid "Metronome Instrument"
+msgstr "Инструмент метронома"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:82
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:150
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:183
+#: ../src/gui/studio/DeviceEditorDialog.cpp:73
+#: ../src/gui/studio/DeviceManagerDialog.cpp:105
+#: ../src/gui/studio/DeviceManagerDialog.cpp:163
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:66
+msgid "Device"
+msgstr "Устройство"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:101
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:89
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:215
+#: ../src/gui/studio/DeviceEditorDialog.cpp:195
+#: ../src/gui/studio/DeviceEditorDialog.cpp:218
+#: ../src/gui/studio/DeviceEditorDialog.cpp:230
+#: ../src/gui/studio/DeviceManagerDialog.cpp:196
+#: ../src/gui/studio/DeviceManagerDialog.cpp:440
+#: ../src/gui/studio/DeviceManagerDialog.cpp:452
+msgid "No connection"
+msgstr "Нет связи"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:112
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:111
+#: ../src/gui/editors/parameters/InstrumentParameterBox.cpp:53
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:1209
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:159
+#: ../src/gui/general/PresetHandlerDialog.cpp:92
+#: ../src/gui/studio/MidiMixerWindow.cpp:204
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:67
+msgid "Instrument"
+msgstr "Инструмент"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:118
+msgid "Beats"
+msgstr "Ударов"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:184
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:123
+msgid "Resolution"
+msgstr "Разрешение"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:309
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:139
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:205
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:125
+#: ../src/gui/editors/matrix/MatrixView.cpp:2132
+#: ../src/gui/editors/notation/NotationView.cpp:1582
+#: ../src/gui/widgets/QuantizeParameters.cpp:128
+#: ../src/gui/widgets/QuantizeParameters.cpp:301
+msgid "None"
+msgstr "Нет"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:126
+msgid "Bars only"
+msgstr "Только такты"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:127
+msgid "Bars and beats"
+msgstr "Такты и доли"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:128
+msgid "Bars, beats, and divisions"
+msgstr "Такты, доли и деления"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:132
+msgid "Bar velocity"
+msgstr "Скорость такта"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:139
+msgid "Beat velocity"
+msgstr "Скорость доли"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:146
+msgid "Sub-beat velocity"
+msgstr "Сила нажатия на деление (полдоли)"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:155
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:324
+msgid "Pitch"
+msgstr "Высота тона"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:160
+msgid "for Bar"
+msgstr "для такта"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:161
+msgid "for Beat"
+msgstr "для доли"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:162
+msgid "for Sub-beat"
+msgstr "для слабой доли"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:166
+msgid "Metronome Activated"
+msgstr "Метроном запущен"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:167
+msgid "Playing"
+msgstr "Идёт воспроизведение..."
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:168
+msgid "Recording"
+msgstr "Идёт запись..."
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:46
+msgid "Choose Text Encoding"
+msgstr "Выберите кодировку текста"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:50
+msgid ""
+"\n"
+"This file contains text in an unknown language encoding.\n"
+"\n"
+"Please select one of the following estimated text encodings\n"
+"for use with the text in this file:\n"
+msgstr ""
+"\n"
+"Этот файл содержит текст в неизвестной языковой кодировке.\n"
+"\n"
+"Выберите одну из приведённых ниже кодировок\n"
+"для использования в тексте этого файла:\n"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:61
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:77
+msgid "Japanese Shift-JIS"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:62
+msgid "Unicode variable-width"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:63
+msgid "Western Europe"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:64
+msgid "Western Europe + Euro"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:65
+msgid "Eastern Europe"
+msgstr "Восточная Европа"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:66
+msgid "Southern Europe"
+msgstr "Южная Европа"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:67
+msgid "Northern Europe"
+msgstr "Северная Европа"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:68
+msgid "Cyrillic"
+msgstr "Кириллица"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:69
+msgid "Arabic"
+msgstr "Арабский"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:70
+msgid "Greek"
+msgstr "Греческий"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:71
+msgid "Hebrew"
+msgstr "Идиш"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:72
+msgid "Turkish"
+msgstr "Турецкий"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:73
+msgid "Nordic"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:74
+msgid "Thai"
+msgstr "Тайский"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:75
+msgid "Baltic"
+msgstr "Балтийский"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:76
+msgid "Celtic"
+msgstr "Кельтский"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:78
+msgid "Traditional Chinese"
+msgstr "Традиционный китайский"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:79
+msgid "Simplified Chinese"
+msgstr "Упрощённый китайский"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:80
+msgid "Russian"
+msgstr "Русский"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:81
+msgid "Ukrainian"
+msgstr "Украинская"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:82
+msgid "Tamil"
+msgstr "Тамильский"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:117
+#, c-format
+msgid "Microsoft Code Page %1"
+msgstr "Кодовая страница Microsoft %1"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:123
+#: ../src/gui/editors/matrix/MatrixView.cpp:1490
+msgid "%1 (%2)"
+msgstr "%1 (%2)"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:142
+msgid ""
+"\n"
+"Example text from file:"
+msgstr ""
+"\n"
+"Пример текста из файла:"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:59
+#: ../src/gui/editors/tempo/TempoView.cpp:92
+msgid "Time Signature"
+msgstr "Размер"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:82
+msgid "Time signature"
+msgstr "Размер"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:116
+msgid "Time where signature takes effect"
+msgstr "Время, когда ключевые знаки вступают в силу"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:83
+#: ../src/gui/dialogs/TempoDialog.cpp:128
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:129
+#: ../src/gui/general/PresetHandlerDialog.cpp:101
+msgid "Scope"
+msgstr "Границы"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:141
+#, c-format
+msgid "Insertion point is at start of measure %1."
+msgstr "Точка вставки находится в начале такта %1."
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:145
+#, c-format
+msgid "Insertion point is in the middle of measure %1."
+msgstr "Точка вставки находится в середине такта %1."
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:150
+msgid "Insertion point is at start of composition."
+msgstr "Точка вставки находится в начале композиции."
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:155
+msgid "Start measure %1 here"
+msgstr "Начать такт %1 здесь"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:159
+#, fuzzy, c-format
+msgid "Change time from start of measure %1"
+msgstr "Изменить время начиная с такта %1"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:166
+#, c-format
+msgid "Time change will take effect at the start of measure %1."
+msgstr "Изменение временных параметров станет актуальным с начала такта %1."
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:176
+msgid "Hide the time signature"
+msgstr "Скрыть размер"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:181
+msgid "Hide the affected bar lines"
+msgstr "Скрыть измененные тактовые черты"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:186
+msgid "Show as common time"
+msgstr "Показывать как обычное время"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:191
+msgid "Correct the durations of following measures"
+msgstr "Исправить длительность следующих тактов"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:280
+msgid "Display as common time"
+msgstr "Показывать как обычное время"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:284
+msgid "Display as cut common time"
+msgstr "Показывать оставшееся время"
+
+#: ../src/gui/dialogs/ConfigureDialog.cpp:66
+msgid "Configure Rosegarden"
+msgstr "Настроить Rosegarden"
+
+#: ../src/gui/dialogs/MarkerModifyDialog.cpp:53
+#: ../src/gui/dialogs/MarkerModifyDialog.cpp:61
+msgid "Edit Marker"
+msgstr "Изменить маркер"
+
+#: ../src/gui/dialogs/MarkerModifyDialog.cpp:78
+msgid "Marker Time"
+msgstr "Позиция маркера"
+
+#: ../src/gui/dialogs/MarkerModifyDialog.cpp:94
+msgid "Marker Properties"
+msgstr "Свойства маркера"
+
+#: ../src/gui/dialogs/MarkerModifyDialog.cpp:100
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:554
+msgid "Text:"
+msgstr "Текст:"
+
+#: ../src/gui/dialogs/MarkerModifyDialog.cpp:104
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:85
+msgid "Description:"
+msgstr "Описание:"
+
+#: ../src/gui/dialogs/FileMergeDialog.cpp:46
+msgid "Merge File"
+msgstr "Объединить с файлом"
+
+#: ../src/gui/dialogs/FileMergeDialog.cpp:53
+msgid "Merge new file "
+msgstr "Добавить новый файл"
+
+#: ../src/gui/dialogs/FileMergeDialog.cpp:56
+msgid "At start of existing composition"
+msgstr "в начало текущей композиции"
+
+#: ../src/gui/dialogs/FileMergeDialog.cpp:57
+msgid "From end of existing composition"
+msgstr "в конец текущей композиции"
+
+#: ../src/gui/dialogs/FileMergeDialog.cpp:61
+msgid "The file has different time signatures or tempos."
+msgstr "Файл содержит различные ключевые тональности или темпы"
+
+#: ../src/gui/dialogs/FileMergeDialog.cpp:62
+msgid "Import these as well"
+msgstr "Импортировать их тоже"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:171
+#: ../src/gui/dialogs/ShowSequencerStatusDialog.cpp:44
+msgid "Sequencer status"
+msgstr "Статус секвенсера"
+
+#: ../src/gui/dialogs/ShowSequencerStatusDialog.cpp:48
+msgid "Sequencer status:"
+msgstr "Статус секвенсера:"
+
+#: ../src/gui/dialogs/ShowSequencerStatusDialog.cpp:50
+msgid "Status not available."
+msgstr "Статус недоступен."
+
+#: ../src/gui/dialogs/ShowSequencerStatusDialog.cpp:57
+msgid "Sequencer is not running or is not responding."
+msgstr "Секвенсер не запущен или не отвечает на запросы."
+
+#: ../src/gui/dialogs/ShowSequencerStatusDialog.cpp:64
+msgid "Sequencer is not returning a valid status report."
+msgstr "Секвенсер не возвращает корректный отчёт о статусе."
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:46
+msgid "Add Tracks"
+msgstr "Добавить дорожки"
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:54
+msgid "How many tracks do you want to add?"
+msgstr "Сколько дорожек вы хотите добавить?"
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:62
+msgid "Add tracks"
+msgstr "Добавка дорожек"
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:64
+msgid "At the top"
+msgstr ""
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:65
+#, fuzzy
+msgid "Above the current selected track"
+msgstr "Приглушает все дорожки кроме выбранных"
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:66
+#, fuzzy
+msgid "Below the current selected track"
+msgstr "Приглушает все дорожки кроме выбранных"
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:67
+msgid "At the bottom"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:75
+msgid "Event Properties"
+msgstr "Свойства события"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:81
+msgid "Event type:"
+msgstr "Тип события:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:117
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:251
+#: ../src/gui/editors/segment/MarkerEditor.cpp:97
+msgid "Absolute time:"
+msgstr "Абсолютное время:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:156
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:323
+msgid "Controller name:"
+msgstr "Имя контроллера:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:157
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:530
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:562
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:563
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:602
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:631
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:267
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:269
+#: ../src/gui/editors/segment/MarkerEditor.cpp:279
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:272
+#: ../src/gui/studio/AudioMixerWindow.cpp:388
+#: ../src/gui/studio/AudioMixerWindow.cpp:519
+#: ../src/gui/studio/AudioMixerWindow.cpp:683
+#: ../src/gui/studio/AudioMixerWindow.cpp:722
+#: ../src/gui/studio/AudioMixerWindow.cpp:904
+#: ../src/gui/studio/SynthPluginManagerDialog.cpp:121
+msgid "<none>"
+msgstr "<ничего>"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:174
+msgid "Meta string:"
+msgstr "Метастрока:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:179
+msgid "Load data"
+msgstr "Загрузка данных"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:181
+msgid "Save data"
+msgstr "Сохранить данные"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:192
+msgid "Notation Properties"
+msgstr "Свойства композиции"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:198
+msgid "Lock to changes in performed values"
+msgstr "Закрыть от изменений сыгранных значений"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:205
+msgid "Notation time:"
+msgstr "Время партитуры:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:217
+msgid "Notation duration:"
+msgstr "Длительность партитуры:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:283
+msgid "Note pitch:"
+msgstr "Высота ноты:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:291
+msgid "Note velocity:"
+msgstr "Сила нажатия ноты:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:317
+msgid "Controller number:"
+msgstr "Номер контроллера:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:326
+msgid "Controller value:"
+msgstr "Значение контроллера:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:354
+msgid "Key pitch:"
+msgstr "Key pitch:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:362
+msgid "Key pressure:"
+msgstr "Key pressure:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:390
+msgid "Channel pressure:"
+msgstr "Давление для всех клавиш одного канала:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:418
+msgid "Program change:"
+msgstr "Смена программы:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:461
+msgid "Data length:"
+msgstr "Длительность данных:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:462
+msgid "Data:"
+msgstr "Данные:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:480
+msgid "Pitchbend MSB:"
+msgstr "Pitchbend MSB:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:488
+msgid "Pitchbend LSB:"
+msgstr "Pitchbend LSB:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:523
+msgid "Indication:"
+msgstr "Индикация:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:553
+msgid "Text type:"
+msgstr "Тип текста:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:596
+msgid "Clef type:"
+msgstr "Тип ключа:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:625
+msgid "Key name:"
+msgstr "Имя тональности:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:674
+msgid "Unsupported event type:"
+msgstr "Неподдерживаемый тип событий:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:931
+msgid "Edit Event Time"
+msgstr "Изменить время события"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:943
+msgid "Edit Event Notation Time"
+msgstr "Изменить время нотного события"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:955
+msgid "Edit Duration"
+msgstr "Изменить длительность"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:968
+msgid "Edit Notation Duration"
+msgstr "Смена длительности композиции"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:981
+msgid "Edit Pitch"
+msgstr "Изменить высоту тона"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:991
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:1016
+msgid "*.syx|System exclusive files (*.syx)"
+msgstr "*.syx|Файлы System exclusive (*.syx)"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:992
+msgid "Load System Exclusive data in File"
+msgstr "Загрузить данные System Exclusive в файл"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:1017
+msgid "Save System Exclusive data to..."
+msgstr "Сохранить данные System Exclusive в..."
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:46
+msgid "Locate audio file"
+msgstr "Указать звуковой файл"
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:50
+msgid "&Skip"
+msgstr "&Пропустить"
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:51
+msgid "Skip &All"
+msgstr "Пропустить &все"
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:52
+msgid "&Locate"
+msgstr "&Указать"
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:57
+msgid ""
+"Can't find file \"%1\".\n"
+"Would you like to try and locate this file or skip it?"
+msgstr ""
+"Не удаётся найти файл \"%1\".\n"
+"Вы предпочитаете найти его или пропустить?"
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:71
+msgid ""
+"%1|Requested file (%2)\n"
+"*.wav|WAV files (*.wav)"
+msgstr ""
+"%1|Запрошенный файл (%2)\n"
+"*.wav|Файлы WAV (*.wav)"
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:74
+msgid "Select an Audio File"
+msgstr "Выберите звуковой файл"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:53 ../src/gui/dialogs/ClefDialog.cpp:62
+#: ../src/gui/dialogs/ClefDialog.cpp:79 ../src/gui/dialogs/ClefDialog.cpp:90
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:278
+msgid "Clef"
+msgstr "Ключ"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:65
+msgid "Existing notes following clef change"
+msgstr "Существующие ноты, следующие смене ключа"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:71
+msgid "Lower clef"
+msgstr "Расположить ключ ниже"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:77
+msgid "Up an Octave"
+msgstr "Октавой выше"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:84
+msgid "Down an Octave"
+msgstr "Октавой ниже"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:88
+msgid "Higher clef"
+msgstr "Расположить ключ выше"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:96
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:152
+msgid "Maintain current pitches"
+msgstr "Сохранить существующие высоты тонов"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:99
+msgid "Transpose into appropriate octave"
+msgstr "Транспонировать в соответствующую октаву"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:231
+msgid "%1 down an octave"
+msgstr "%1 октавой ниже"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:234
+msgid "%1 down two octaves"
+msgstr "%1 двумя октавами ниже"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:237
+msgid "%1 up an octave"
+msgstr "%1 октавой выше"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:240
+msgid "%1 up two octaves"
+msgstr "%1 двумя октавами выше"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:249
+msgid "Treble"
+msgstr "Высокие"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:251
+#, fuzzy
+msgid "French violin"
+msgstr "Перевод на французский"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:253
+msgid "Soprano"
+msgstr "Сопрановый"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:255
+#, fuzzy
+msgid "Mezzo-soprano"
+msgstr "сопрано"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:257
+msgid "Alto"
+msgstr "Альтовый"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:259
+msgid "Tenor"
+msgstr "Теноровый"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:261
+#, fuzzy
+msgid "C-baritone"
+msgstr "Вариация"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:263
+#, fuzzy
+msgid "F-baritone"
+msgstr "Вариация"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:265
+msgid "Bass"
+msgstr "Басовый"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:267
+#, fuzzy
+msgid "Sub-bass"
+msgstr "басовый"
+
+#: ../src/gui/dialogs/CountdownDialog.cpp:52
+msgid "Recording..."
+msgstr "Идёт запись..."
+
+#: ../src/gui/dialogs/CountdownDialog.cpp:60
+msgid "Recording time remaining: "
+msgstr "Оставшееся время записи: "
+
+#: ../src/gui/dialogs/CountdownDialog.cpp:120
+msgid "Just how big is your hard disk?"
+msgstr "Каков объём жёсткого диска?"
+
+#: ../src/gui/dialogs/CountdownDialog.cpp:154
+msgid "Recording beyond end of composition: "
+msgstr "Запись за пределами композиции: "
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:52
+msgid "Specify Interval"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:58
+msgid "Reference note:"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:59
+#, fuzzy
+msgid "Target note:"
+msgstr "4-ая нота"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:68
+#: ../src/gui/dialogs/IntervalDialog.cpp:315
+msgid "a perfect unison"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:76
+msgid "Effect on Key"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:77
+#, fuzzy
+msgid "Transpose within key"
+msgstr "Транспонировать в эту тональность"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:79
+#, fuzzy
+msgid "Change key for selection"
+msgstr "Без изменения в конце выделения:"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:89
+msgid ""
+"Adjust segment transposition in opposite direction (maintain audible pitch)"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:190
+#: ../src/gui/dialogs/IntervalDialog.cpp:220
+msgid "a diminished"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:192
+#: ../src/gui/dialogs/IntervalDialog.cpp:222
+msgid "an augmented"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:194
+#: ../src/gui/dialogs/IntervalDialog.cpp:224
+msgid "a doubly diminished"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:196
+#: ../src/gui/dialogs/IntervalDialog.cpp:226
+msgid "a doubly augmented"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:198
+#: ../src/gui/dialogs/IntervalDialog.cpp:228
+msgid "a triply diminished"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:200
+#: ../src/gui/dialogs/IntervalDialog.cpp:230
+msgid "a triply augmented"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:202
+msgid "a quadruply diminished"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:204
+#: ../src/gui/dialogs/IntervalDialog.cpp:232
+msgid "a quadruply augmented"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:206
+#: ../src/gui/dialogs/IntervalDialog.cpp:234
+msgid "a perfect"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:208
+#: ../src/gui/dialogs/IntervalDialog.cpp:236
+msgid "an (unknown, %1)"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:216
+#, fuzzy
+msgid "a minor"
+msgstr "Минор"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:218
+#, fuzzy
+msgid "a major"
+msgstr "Мажор"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:239
+#, fuzzy
+msgid "an (unknown)"
+msgstr "Неизвестно"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:248
+#: ../src/gui/dialogs/IntervalDialog.cpp:251
+#, fuzzy
+msgid "%1 octave"
+msgstr "%1 октавой выше"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:254
+#, fuzzy
+msgid "%1 unison"
+msgstr "единиц"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:258
+#, fuzzy
+msgid "%1 second"
+msgstr "Секунд:"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:261
+#, fuzzy
+msgid "%1 third"
+msgstr "Другое"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:264
+#, fuzzy
+msgid "%1 fourth"
+msgstr "%1 бемоль"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:267
+#, fuzzy
+msgid "%1 fifth"
+msgstr "Высота тона"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:270
+#, fuzzy
+msgid "%1 sixth"
+msgstr "Высота тона"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:273
+#, fuzzy
+msgid "%1 seventh"
+msgstr "Изменить размер события"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:276
+#: ../src/gui/studio/DeviceManagerDialog.cpp:329
+#: ../src/gui/studio/DeviceManagerDialog.cpp:363
+#, c-format
+msgid "%1"
+msgstr "%1"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:287
+msgid ""
+"_n: up 1 octave and %1\n"
+"up %n octaves and %1"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:291
+#, c-format
+msgid ""
+"_n: up 1 octave\n"
+"up %n octaves"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:295
+#, fuzzy, c-format
+msgid "up %1"
+msgstr "Суб %1"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:303
+msgid ""
+"_n: down 1 octave and %1\n"
+"down %n octaves and %1"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:307
+#, fuzzy, c-format
+msgid ""
+"_n: down 1 octave\n"
+"down %n octaves"
+msgstr "%1 двумя октавами ниже"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:311
+#, fuzzy, c-format
+msgid "down %1"
+msgstr "Низкая: %1"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:81
+msgid "Intrinsics"
+msgstr "Внутренние свойства"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:85
+msgid "Event type: "
+msgstr "Тип события: "
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:91
+msgid "Absolute time: "
+msgstr "Абсолютное время: "
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:101
+msgid "Duration: "
+msgstr "Длительность: "
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:114
+msgid "Sub-ordering: "
+msgstr "Соподчинение: "
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:125
+msgid "Persistent properties"
+msgstr "Постоянные свойства"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:169
+#: ../src/gui/dialogs/EventEditDialog.cpp:133
+#: ../src/gui/studio/BankEditorDialog.cpp:129
+#: ../src/gui/studio/DeviceEditorDialog.cpp:75
+msgid "Type"
+msgstr "Тип"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:184
+#: ../src/gui/dialogs/EventEditDialog.cpp:135
+#: ../src/gui/dialogs/EventParameterDialog.cpp:89
+#: ../src/gui/dialogs/EventParameterDialog.cpp:93
+#: ../src/gui/dialogs/EventParameterDialog.cpp:115
+msgid "Value"
+msgstr "Значение"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:155
+msgid "Non-persistent properties"
+msgstr "Непостоянные свойства"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:156
+msgid "These are cached values, lost if the event is modified."
+msgstr "Это закешированные значения, которые теряются при изменении события."
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:170
+msgid "Name "
+msgstr "Имя "
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:172
+msgid "Type "
+msgstr "Тип "
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:174
+msgid "Value "
+msgstr "Значение "
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:188
+msgid "Make persistent"
+msgstr "Сделать постоянным"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:292
+msgid "Delete this property"
+msgstr "Удалить это свойство"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:433
+msgid ""
+"Are you sure you want to delete the \"%1\" property?\n"
+"\n"
+"Removing necessary properties may cause unexpected behavior."
+msgstr ""
+"Вы точно хотите удалить свойство \"%1\"?\n"
+"\n"
+"Удаление необходимых свойств может вызвать неадекватное поведение программы."
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:436
+#: ../src/gui/dialogs/EventEditDialog.cpp:469
+msgid "Edit Event"
+msgstr "Изменить событие"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:465
+msgid ""
+"Are you sure you want to make the \"%1\" property persistent?\n"
+"\n"
+"This could cause problems if it overrides a different computed value later "
+"on."
+msgstr ""
+"Вы точно хотите сделать свойство \"%1\" постоянным?\n"
+"\n"
+"Это может привести к проблемам при последующем \n"
+"перерасчёте значения."
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:470
+msgid "Make &Persistent"
+msgstr "Сделать &постоянным"
+
+#: ../src/gui/dialogs/PasteNotationDialog.cpp:52
+msgid "Paste type"
+msgstr "Тип вставки"
+
+#: ../src/gui/dialogs/PasteNotationDialog.cpp:72
+msgid "Make this the default paste type"
+msgstr "Сделать этот тип вставки стандартным"
+
+#: ../src/gui/dialogs/LyricEditDialog.cpp:53
+msgid "Edit Lyrics"
+msgstr "Редактор лирики"
+
+#: ../src/gui/dialogs/LyricEditDialog.cpp:62
+msgid "Lyrics for this segment"
+msgstr "Лирика для этого сегмента"
+
+#: ../src/gui/dialogs/LyricEditDialog.cpp:70
+#, fuzzy
+msgid "Add Verse"
+msgstr "Добавить &декрещендо..."
+
+#: ../src/gui/dialogs/LyricEditDialog.cpp:84
+#: ../src/gui/dialogs/LyricEditDialog.cpp:106
+#, c-format
+msgid "Verse %1"
+msgstr ""
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:59
+msgid "Import from Device..."
+msgstr "Импортировать из устройства..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2163
+#: ../src/gui/application/RosegardenGUIApp.cpp:2229
+#: ../src/gui/application/RosegardenGUIApp.cpp:7780
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:87
+#: ../src/sound/AudioFileManager.cpp:664
+#, c-format
+msgid "Cannot download file %1"
+msgstr "Не удаётся загрузить файл %1"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:99
+#, c-format
+msgid "Cannot open file %1"
+msgstr "Не удаётся открыть файл \"%1\""
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:106
+#, c-format
+msgid "No devices found in file %1"
+msgstr "В файле \"%1\" устройств не обнаружено"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:113
+msgid "Source device"
+msgstr "Исходное устройство"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:118
+msgid "Import from: "
+msgstr "Импортировать из: "
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:140
+#: ../src/gui/studio/DeviceEditorDialog.cpp:148
+#, c-format
+msgid "Device %1"
+msgstr "Устройство %1"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:155
+msgid "Import banks"
+msgstr "Импортировать банки"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:156
+msgid "Import key mappings"
+msgstr "Импортировать компоновки"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:157
+msgid "Import controllers"
+msgstr "Импортировать контроллеры"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:160
+msgid "Import device name"
+msgstr "Импортировать имя устройства"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:166
+msgid "Bank import behavior"
+msgstr "Поведение при импорте банка"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:168
+msgid "Merge banks"
+msgstr "Объединить банки"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:169
+msgid "Overwrite banks"
+msgstr "Перезаписать банки"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:367
+msgid "Bank %1:%2"
+msgstr "Банк %1:%2"
+
+#: ../src/commands/segment/SegmentSplitByRecordingSrcCommand.cpp:42
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:48
+msgid "Split by Recording Source"
+msgstr "Разделение по источнику записи"
+
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:53
+msgid "Recording Source"
+msgstr "Источник записи"
+
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:57
+msgid "Channel:"
+msgstr "Канал:"
+
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:64
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:75
+#, fuzzy
+msgid "any"
+msgstr "любой"
+
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:69
+msgid "Device:"
+msgstr "Устройство:"
+
+#: ../src/gui/dialogs/UnusedAudioSelectionDialog.cpp:46
+msgid "Select Unused Audio Files"
+msgstr "Выберите неиспользуемые звуковые файлы"
+
+#: ../src/gui/dialogs/UnusedAudioSelectionDialog.cpp:53
+#: ../src/gui/editors/segment/PlayListView.cpp:36
+msgid "File name"
+msgstr "Имя файла"
+
+#: ../src/gui/dialogs/UnusedAudioSelectionDialog.cpp:54
+msgid "File size"
+msgstr "Размер файла"
+
+#: ../src/gui/dialogs/UnusedAudioSelectionDialog.cpp:55
+msgid "Last modified date"
+msgstr "Дата последнего изменения"
+
+#: ../src/gui/dialogs/UnusedAudioSelectionDialog.cpp:60
+msgid " (not found) "
+msgstr " (не найдено) "
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:105
+msgid "Audio File Manager"
+msgstr "Управление звуковыми файлами"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:126
+msgid ""
+"* Some audio files are encoded at a sample rate different from that of the "
+"JACK audio server.\n"
+"Rosegarden will play them at the correct speed, but they will sound "
+"terrible.\n"
+"Please consider resampling such files externally, or adjusting the sample "
+"rate of the JACK server."
+msgstr ""
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:132
+msgid "&Add Audio File..."
+msgstr "&Добавить звуковой файл..."
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:135
+msgid "&Unload Audio File"
+msgstr "&Удалить звуковой файл"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:140
+msgid "&Play Preview"
+msgstr "&Прослушать"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:151
+msgid "&Insert into Selected Audio Track"
+msgstr "В&ставить в выбранную звуковую дорожку"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:155
+msgid "Unload &all Audio Files"
+msgstr "Удалить в&се звуковые файлы"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:159
+msgid "Unload all &Unused Audio Files"
+msgstr "Удалить все &неиспользуемые звуковые файлы"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:163
+msgid "&Delete Unused Audio Files..."
+msgstr "Удалить все &неиспользуемые звуковые файлы"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:167
+msgid "&Export Audio File..."
+msgstr "&Экспортировать звуковой файл..."
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:173
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:180
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:91
+msgid "Duration"
+msgstr "Длительность"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:181
+msgid "Envelope"
+msgstr "Огибающая"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:182
+msgid "Sample rate"
+msgstr "Частота дискретизации"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:183
+msgid "Channels"
+msgstr "Каналы"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:282
+msgid "<no audio files>"
+msgstr "<нет звуковых файлов>"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:488
+msgid "*.wav|WAV files (*.wav)"
+msgstr "Файлы *.wav|WAV (*.wav)"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:489
+msgid "Choose a name to save this file as"
+msgstr "Выберите имя для сохраняемого файла"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:499
+msgid "Exporting audio file..."
+msgstr "Экспортируется звуковой файл..."
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:609
+msgid ""
+"This will unload audio file \"%1\" and remove all associated segments. Are "
+"you sure?"
+msgstr ""
+"Это приведёт к выгрузке звукового файла \"%1\" и удалению связанных с ним "
+"сегментов? Вы уверены?"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:692
+msgid ""
+"*.wav|WAV files (*.wav)\n"
+"*.*|All files"
+msgstr ""
+"*.wav|Файлы WAV (*.wav)\n"
+"*.*|Все файлы"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:697
+msgid ""
+"*.wav *.flac *.ogg *.mp3|Audio files (*.wav *.flac *.ogg *.mp3)\n"
+"*.wav|WAV files (*.wav)\n"
+"*.flac|FLAC files (*.flac)\n"
+"*.ogg|Ogg files (*.ogg)\n"
+"*.mp3|MP3 files (*.mp3)\n"
+"*.*|All files"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:704
+msgid "Select one or more audio files"
+msgstr "Выберите один или несколько звуковых файлов"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:763
+msgid ""
+"This will unload all audio files and remove their associated segments.\n"
+"This action cannot be undone, and associations with these files will be "
+"lost.\n"
+"Files will not be removed from your disk.\n"
+"Are you sure?"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:800
+msgid ""
+"This will unload all audio files that are not associated with any segments "
+"in this composition.\n"
+"This action cannot be undone, and associations with these files will be "
+"lost.\n"
+"Files will not be removed from your disk.\n"
+"Are you sure?"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:865
+msgid ""
+"The following audio files are not used in the current composition.\n"
+"\n"
+"Please select the ones you wish to delete permanently from the hard disk.\n"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:875
+#, c-format
+msgid ""
+"_n: <qt>About to delete 1 audio file permanently from the hard disk.<br>This "
+"action cannot be undone, and there will be no way to recover this file."
+"<br>Are you sure?</qt>\n"
+"\n"
+"<qt>About to delete %n audio files permanently from the hard disk.<br>This "
+"action cannot be undone, and there will be no way to recover these files."
+"<br>Are you sure?</qt>"
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:525
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:888
+msgid "File %1 could not be deleted."
+msgstr "Не получилось удалить файл \"%1\"."
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:921
+msgid "Change Audio File label"
+msgstr "Сменить метку звукового файла"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:6466
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:922
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:1099
+msgid "Enter new label"
+msgstr "Введите новую метку"
+
+#: ../src/gui/application/RosegardenGUIView.cpp:1538
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:1086
+msgid "Adding audio file..."
+msgstr "Добавляется звуковой файл..."
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:1107
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:1112
+msgid "Failed to add audio file. "
+msgstr "Не удалось добавить звуковой файл."
+
+#: ../src/document/RosegardenGUIDoc.cpp:2789
+#: ../src/gui/application/RosegardenGUIApp.cpp:2736
+#: ../src/gui/application/RosegardenGUIView.cpp:1574
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:1122
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:180
+msgid "Generating audio preview..."
+msgstr "Создаётся просмотр волновой формы..."
+
+#: ../src/gui/application/RosegardenGUIView.cpp:1581
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:1130
+msgid ""
+"Try copying this file to a directory where you have write permission and re-"
+"add it"
+msgstr ""
+"Попробуйте скопировать этот в файл в директорию,\n"
+"на запись в которую у вас есть права, а затем добавьте файл заново."
+
+#: ../src/gui/dialogs/TransportDialog.cpp:90 rc.cpp:357
+#, no-c-format
+msgid "Rosegarden Transport"
+msgstr "Транспорт Rosegarden"
+
+#: ../src/gui/dialogs/TransportDialog.cpp:925
+#: ../src/gui/dialogs/TransportDialog.cpp:985
+msgid "PITCH WHEEL"
+msgstr "PITCH WHEEL"
+
+#: ../src/gui/dialogs/TransportDialog.cpp:929
+#: ../src/gui/dialogs/TransportDialog.cpp:989
+msgid "CONTROLLER"
+msgstr "КОНТРОЛЛЕР"
+
+#: ../src/gui/dialogs/TransportDialog.cpp:933
+#: ../src/gui/dialogs/TransportDialog.cpp:993
+msgid "PROG CHNGE"
+msgstr "PROG CHNGE"
+
+#: ../src/gui/dialogs/TransportDialog.cpp:938
+#: ../src/gui/dialogs/TransportDialog.cpp:998
+msgid "PRESSURE"
+msgstr "PRESSURE"
+
+#: ../src/gui/dialogs/TransportDialog.cpp:942
+#: ../src/gui/dialogs/TransportDialog.cpp:1002
+msgid "SYS MESSAGE"
+msgstr "SYS MESSAGE"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:177
+#: ../src/gui/dialogs/QuantizeDialog.cpp:40
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:127
+msgid "Quantize"
+msgstr "Квантование"
+
+#: ../src/gui/dialogs/QuantizeDialog.cpp:52
+msgid "Advanced"
+msgstr "Больше настроек"
+
+#: ../src/gui/dialogs/ExportDeviceDialog.cpp:42
+msgid "Export Devices..."
+msgstr "Экспортировать устройства..."
+
+#: ../src/gui/dialogs/ExportDeviceDialog.cpp:47
+msgid "Export devices"
+msgstr "Экспорт устройств"
+
+#: ../src/gui/dialogs/ExportDeviceDialog.cpp:49
+msgid "Export all devices"
+msgstr "Экспортировать все устройства"
+
+#: ../src/gui/dialogs/ExportDeviceDialog.cpp:50
+msgid "Export selected device only"
+msgstr "Экспортировать только выбранное устройство"
+
+#: ../src/gui/dialogs/ExportDeviceDialog.cpp:51
+msgid " (\"%1\")"
+msgstr " (\"%1\")"
+
+#: ../src/gui/dialogs/CompositionLengthDialog.cpp:44
+msgid "Change Composition Length"
+msgstr "Смена длительности композиции"
+
+#: ../src/gui/dialogs/CompositionLengthDialog.cpp:50
+msgid "Set the Start and End bar markers for this Composition"
+msgstr "Установите метки для первого и последнего тактов в этой композиции"
+
+#: ../src/gui/dialogs/CompositionLengthDialog.cpp:54
+msgid "Start Bar"
+msgstr "Первый такт"
+
+#: ../src/gui/dialogs/CompositionLengthDialog.cpp:62
+msgid "End Bar"
+msgstr "Последний такт"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:62
+msgid "LilyPond Export/Preview"
+msgstr "Экспорт/предосмотр в Lilypond"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:85
+msgid "General options"
+msgstr "Основные параметры"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:90
+msgid "Advanced options"
+msgstr "Расширенные параметры"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:112
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:95
+msgid "Headers"
+msgstr "Верхние колонтитулы"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:106
+msgid "Basic options"
+msgstr "Основные параметры"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:113
+msgid "Compatibility level"
+msgstr "Уровень совместимости"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:117
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:118
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:119
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:120
+#, c-format
+msgid "LilyPond %1"
+msgstr "LilyPond %1"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:125
+msgid "Paper size"
+msgstr "Формат бумаги"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:129
+msgid "A3"
+msgstr "A3"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:130
+msgid "A4"
+msgstr "А4"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:131
+msgid "A5"
+msgstr "A5"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:132
+msgid "A6"
+msgstr "A6"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:133
+msgid "Legal"
+msgstr "Legal"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:134
+msgid "US Letter"
+msgstr "US Letter"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:135
+msgid "Tabloid"
+msgstr "Таблоид"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:136
+msgid "do not specify"
+msgstr "Не указывать"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:152
+msgid "Font size"
+msgstr "Кегль шрифта"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:157
+msgid "%1 pt"
+msgstr "%1 pt"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:169
+msgid "Staff level options"
+msgstr "Параметры нотоносца"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:176
+msgid "Export content"
+msgstr "Что экспортировать:"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:179
+msgid "All tracks"
+msgstr "Все дорожки"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:180
+msgid "Non-muted tracks"
+msgstr "Неприглушенные дорожки"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:181
+msgid "Selected track"
+msgstr "Выбранная дорожка"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:182
+msgid "Selected segments"
+msgstr "Выбранные сегменты"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:188
+msgid "Merge tracks that have the same name"
+msgstr "Объединять дорожки с одинаковым названием"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:198
+msgid "Notation options"
+msgstr "Параметры партитуры"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:206
+msgid "First"
+msgstr "Первую"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:207
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:538
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:557
+msgid "All"
+msgstr "Все"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:211
+msgid "Export tempo marks "
+msgstr "Экспортировать метки темпа"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:215
+msgid "Export lyrics"
+msgstr "Экспортировать лирики"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:225
+msgid "Export beamings"
+msgstr "Экспортировать перенаправления"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:232
+msgid "Export track staff brackets"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:244
+msgid "Layout options"
+msgstr "Параметры макета"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:257
+msgid "Lyrics alignment"
+msgstr "Выравнивание лирики"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:261
+msgid "Ragged bottom (systems will not be spread vertically across the page)"
+msgstr "Выключка снизу (системы не распределятся вертикально по странице)"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:267
+msgid "Miscellaneous options"
+msgstr "Различные параметры"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:274
+msgid "Enable \"point and click\" debugging"
+msgstr "Разрешить отладку методом \"point and click\""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:279
+msgid "Export \\midi block"
+msgstr "Экспортировать \\midi block"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:284
+#, fuzzy
+msgid "No markers"
+msgstr "Нет субмиксов"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:285
+#, fuzzy
+msgid "Rehearsal marks"
+msgstr "Удалить все маркеры"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:286
+#, fuzzy
+msgid "Marker text"
+msgstr "Время маркера "
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:290
+#, fuzzy
+msgid "Export markers"
+msgstr "Экспортировать метки темпа"
+
+#: ../src/gui/dialogs/AudioSplitDialog.cpp:57
+msgid "Autosplit Audio Segment"
+msgstr "Авторазделение звукового сегмента"
+
+#: ../src/gui/dialogs/AudioSplitDialog.cpp:70
+msgid "AutoSplit Segment \""
+msgstr "Авторазделение сегмента \""
+
+#: ../src/gui/dialogs/AudioSplitDialog.cpp:84
+msgid "Threshold"
+msgstr "Порог"
+
+#: ../src/gui/dialogs/AudioSplitDialog.cpp:142
+msgid "<no preview generated for this audio file>"
+msgstr "<предпросмотр этого звукового файла не создан>"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:70
+msgid "Audio Plugin"
+msgstr "Звуковой модуль"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:94
+#: ../src/gui/widgets/AudioFaderBox.cpp:136
+msgid "Editor"
+msgstr "Редактор"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:100
+msgid "Plugin"
+msgstr "Модуль"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:105
+msgid "Category:"
+msgstr "Категория:"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:110
+msgid "Plugin:"
+msgstr "Модуль:"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:114
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:398
+msgid "Select a plugin from this list."
+msgstr "Выбрать модуль из этого списка"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:119
+msgid "Bypass"
+msgstr "Обход"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:121
+msgid "Bypass this plugin."
+msgstr "Обойти этот модуль"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:127
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:390
+msgid "<ports>"
+msgstr "<порты>"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:130
+msgid "Input and output port counts."
+msgstr "Порты входа и выхода считаются."
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:132
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:391
+msgid "<id>"
+msgstr "<id>"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:135
+msgid "Unique ID of plugin."
+msgstr "Уникальный ID модуля"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:149
+msgid "Copy plugin parameters"
+msgstr "Параметры копирования модуля"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:155
+msgid "Paste plugin parameters"
+msgstr "Параметры вставки модуля"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:161
+msgid "Set to defaults"
+msgstr "Обнулить настройки"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:225
+msgid "(any)"
+msgstr "(любой)"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:226
+msgid "(unclassified)"
+msgstr "(не классифицировано)"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:247
+msgid "(none)"
+msgstr "(ничего)"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:389
+#: ../src/gui/editors/parameters/AudioInstrumentParameterPanel.cpp:132
+#: ../src/gui/editors/parameters/AudioInstrumentParameterPanel.cpp:361
+#: ../src/gui/studio/AudioMixerWindow.cpp:685
+#: ../src/gui/studio/AudioMixerWindow.cpp:724
+#: ../src/gui/studio/AudioMixerWindow.cpp:906
+#: ../src/gui/widgets/AudioFaderBox.cpp:79
+msgid "<no plugin>"
+msgstr "<нет модуля>"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:427
+msgid "This plugin has too many controls to edit here."
+msgstr ""
+"У этого модуля слишком много ручек управления. Переключитесь на \"родной\" "
+"интерфейс."
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:438
+#, c-format
+msgid "Id: %1"
+msgstr "Id: %1"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:490
+msgid "mono"
+msgstr "моно"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:492
+msgid "stereo"
+msgstr "стерео"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:494
+msgid "%1 in, %2 out"
+msgstr "%1 вх., %2 вых."
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:518
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:704
+msgid "Program: "
+msgstr "Программа:"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:522
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:532
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:708
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:716
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:745
+msgid "<none selected>"
+msgstr "<ничего не выделено>"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:56
+msgid "Set the %1 property of the event selection:"
+msgstr "Установить свойство %1 выбранного события:"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:61
+msgid "Pattern"
+msgstr "Образец"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:66
+msgid "Flat - set %1 to value"
+msgstr "Бемоль - установить значение %1"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:70
+msgid "Alternating - set %1 to max and min on alternate events"
+msgstr ""
+"Переменный — установить %1 в макс. или мин. значение на переменных событиях"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:74
+msgid "Crescendo - set %1 rising from min to max"
+msgstr "Крещендо - установить повышение %1 от мин до макс"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:78
+msgid "Diminuendo - set %1 falling from max to min"
+msgstr "Диминуэндо - установить %1 с понижением от макс. до мин."
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:82
+msgid "Ringing - set %1 alternating from max to min with both dying to zero"
+msgstr ""
+"Звон - установить %1 чередующимся от макс. до мин. значения c угасанием до "
+"нуля"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:123
+#: ../src/gui/dialogs/EventParameterDialog.cpp:150
+msgid "First Value"
+msgstr "Первое значение"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:124
+#: ../src/gui/dialogs/EventParameterDialog.cpp:151
+msgid "Second Value"
+msgstr "Второе значение"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:132
+#: ../src/gui/dialogs/EventParameterDialog.cpp:142
+msgid "Low Value"
+msgstr "Низкое значение"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:133
+#: ../src/gui/dialogs/EventParameterDialog.cpp:141
+msgid "High Value"
+msgstr "Высокое значение"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:56 ../src/gui/rulers/TempoRuler.cpp:127
+msgid "Insert Tempo Change"
+msgstr "Вставка смены темпа"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:69
+msgid "New tempo:"
+msgstr "Новый темп:"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:76
+msgid "Tap"
+msgstr ""
+
+#: ../src/gui/dialogs/TempoDialog.cpp:81
+msgid "Tempo is fixed until the following tempo change"
+msgstr "Темп резко меняется на следующий"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:82
+msgid "Tempo ramps to the following tempo"
+msgstr "Темп плавно меняется на следующий"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:83
+msgid "Tempo ramps to:"
+msgstr "Темп меняется на:"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:120
+msgid "Time of tempo change"
+msgstr "Время смены темпа"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:138
+msgid "The pointer is currently at "
+msgstr "Сейчас курсор в позиции "
+
+#: ../src/gui/dialogs/TempoDialog.cpp:154
+msgid "Apply this tempo from here onwards"
+msgstr "Применить этот темп отсюда и далее везде"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:158
+msgid "Replace the last tempo change"
+msgstr "Заменить предыдущую смену темпа"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:164
+msgid "Apply this tempo from the start of this bar"
+msgstr "Применить этот темп начиная с текущего такта"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:167
+msgid "Apply this tempo to the whole composition"
+msgstr "Применить этот темп ко всей композиции"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:172
+msgid "Also make this the default tempo"
+msgstr "Также сделать этот темп стандартным"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:256
+msgid "%1.%2 s,"
+msgstr "%1.%2 s,"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:262
+#, c-format
+msgid "at the start of measure %1."
+msgstr "в начале такта %1."
+
+#: ../src/gui/dialogs/TempoDialog.cpp:266
+#, c-format
+msgid "in the middle of measure %1."
+msgstr "в середине такта %1."
+
+#: ../src/gui/dialogs/TempoDialog.cpp:285
+msgid " (at %1.%2 s, in measure %3)"
+msgstr " (в позиции %1.%2 с, в такте %3)"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:302
+msgid "There are no preceding tempo changes."
+msgstr "Предшествующих смен темпа нет."
+
+#: ../src/gui/dialogs/TempoDialog.cpp:310
+msgid "There are no other tempo changes."
+msgstr "Других смен темпа нет."
+
+#: ../src/gui/dialogs/TempoDialog.cpp:328
+msgid " bpm"
+msgstr " bpm"
+
+#: ../src/gui/dialogs/AudioPlayingDialog.cpp:42
+msgid "Playing audio file"
+msgstr "Воспроизведение звукового файла"
+
+#: ../src/gui/dialogs/AudioPlayingDialog.cpp:47
+msgid "Playing audio file \"%1\""
+msgstr "Воспроизводится звуковой файл \"%1\""
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:52
+#: ../src/gui/editors/matrix/MatrixView.cpp:2655
+msgid "Trigger Segment"
+msgstr "Переключаемый сегмент"
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:61
+msgid "Trigger segment: "
+msgstr "Переключаемый сегмент: "
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:59
+msgid "Key Change"
+msgstr "Смена тональности"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:77
+msgid "Key signature"
+msgstr "Ключевые знаки альтерации"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:80
+msgid "Key transposition"
+msgstr ""
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:86
+msgid "Existing notes following key change"
+msgstr "Существующие ноты, зависящие от смены тональности"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:98
+msgid "Flatten"
+msgstr "Понизить на полтона (flatten)"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:100
+msgid "Key"
+msgstr "Тональность"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:105
+msgid "Sharpen"
+msgstr "Повысить на полтона (sharpen)"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:109
+msgid "Major"
+msgstr "Мажор"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:110
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:369
+msgid "Minor"
+msgstr "Минор"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:123
+msgid "Transpose key according to segment transposition"
+msgstr ""
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:126
+msgid "Use specified key. Do not transpose"
+msgstr ""
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:134
+msgid "Apply to current segment only"
+msgstr "Применить только к текущему сегменту"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:137
+msgid "Apply to all segments at this time"
+msgstr "Применить ко всем сегментам в этот раз"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:141
+msgid "Exclude percussion segments"
+msgstr ""
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:155
+msgid "Maintain current accidentals"
+msgstr "Сохранить текущие случайные знаки альтерации"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:158
+msgid "Transpose into this key"
+msgstr "Транспонировать в эту тональность"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:331
+msgid "No such key"
+msgstr "Такой тональности нет"
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:44
+#: ../src/gui/editors/notation/NotationSelector.cpp:118
+msgid "Interpret"
+msgstr "Интерпретация"
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:50
+msgid "Interpretations to apply"
+msgstr "Применяемые интерпретации"
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:53
+msgid "Apply text dynamics (p, mf, ff etc)"
+msgstr "Применить маркеры динамики (p, mf, ff и др.)"
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:55
+msgid "Apply hairpin dynamics"
+msgstr "Применить динамику"
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:57
+msgid "Stress beats"
+msgstr "Акцентировать доли"
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:59
+msgid "Articulate slurs, staccato, tenuto etc"
+msgstr "Исполнять лигатуры, стаккато, тенуто и т.д."
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:61
+msgid "All available interpretations"
+msgstr "Все доступные интерпретации"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:316
+#, fuzzy
+msgid ""
+"Attempted to launch JACK audio daemon failed. Audio will be disabled.\n"
+"Please check configuration (Settings -> Configure Rosegarden -> Audio -> "
+"Startup)\n"
+" and restart."
+msgstr ""
+"Попытка запустить демон JACK-сервера провалилась. Звук будет отключен.\n"
+"Проверьте соответствующие настройки: Настройка ->Настроить Rosegarden... -"
+">Секвенсер-> Запуск)\n"
+" и перезапустите программу."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:325
+msgid "Starting sequencer..."
+msgstr "Запускается секвенсер..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:333
+msgid "Initializing plugin manager..."
+msgstr "Инициализируется настройщик модулей..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:338
+msgid "Initializing view..."
+msgstr "Создаётся просмотр... "
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:354
+msgid "Special Parameters"
+msgstr "Специальные параметры"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:430
+msgid "Starting sequence manager..."
+msgstr "Запускается диспетчер секвенции..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:456
+msgid "Clearing studio data..."
+msgstr "Очищаются данные студии..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:475
+#: ../src/gui/editors/notation/NotationView.cpp:558
+msgid "Starting..."
+msgstr "Ключ на старт..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:556
+msgid "Import Rosegarden &Project file..."
+msgstr "Импортировать файл &проекта Rosegarden..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:560
+msgid "Import &MIDI file..."
+msgstr "Импортировать &MIDI-файл..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:564
+msgid "Import &Rosegarden 2.1 file..."
+msgstr "Импортировать файл &Rosegarden 2.1..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:568
+msgid "Import &Hydrogen file..."
+msgstr "Импортировать фай&л Hydrogen..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:572
+msgid "Merge &File..."
+msgstr "Объединить с &файлом..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:576
+msgid "Merge &MIDI file..."
+msgstr "Объединить с &MIDI-файлом..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:580
+msgid "Merge &Rosegarden 2.1 file..."
+msgstr "Объединить с файлом &Rosegarden 2.1..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:584
+msgid "Merge &Hydrogen file..."
+msgstr "Объединить с фай&лом Hydrogen..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:588
+msgid "Export Rosegarden &Project file..."
+msgstr "Экспортировать файл &проекта Rosegarden..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:592
+msgid "Export &MIDI file..."
+msgstr "Экспортировать в &MIDI-файл..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:596
+#, fuzzy
+msgid "Export &LilyPond file..."
+msgstr "Экспортировать в партитуру &Lilypond..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:600
+msgid "Export Music&XML file..."
+msgstr "Экспортировать в файл Music&XML..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:604
+msgid "Export &Csound score file..."
+msgstr "Экспортировать в партитуру &Csound..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:608
+msgid "Export M&up file..."
+msgstr "Экспортировать в &Mup-файл..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:612
+#: ../src/gui/editors/notation/NotationView.cpp:1500
+msgid "Print &with LilyPond..."
+msgstr "Печать &через Lilypond..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:616
+#: ../src/gui/editors/notation/NotationView.cpp:1504
+msgid "Preview with Lil&yPond..."
+msgstr "Просмо&треть с Lilypond..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:620
+msgid "Play&list"
+msgstr "Список &воспроизведения"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:627
+msgid "Rosegarden &Tutorial"
+msgstr "Электронный у&чебник по Rosegarden"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:631
+msgid "&Bug Reporting Guidelines"
+msgstr "&Руководство по сообщению об ошибках"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:645
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:348
+#: ../src/gui/editors/segment/MarkerEditor.cpp:378
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:388
+#: ../src/gui/general/EditViewBase.cpp:190
+#: ../src/gui/studio/BankEditorDialog.cpp:318
+#: ../src/gui/studio/DeviceManagerDialog.cpp:227
+msgid "Und&o"
+msgstr "От&менить"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:651
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:354
+#: ../src/gui/editors/segment/MarkerEditor.cpp:384
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:394
+#: ../src/gui/general/EditViewBase.cpp:196
+#: ../src/gui/studio/BankEditorDialog.cpp:324
+#: ../src/gui/studio/DeviceManagerDialog.cpp:233
+msgid "Re&do"
+msgstr "По&вторить"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:665
+#: ../src/gui/editors/notation/NotationView.cpp:2297
+msgid "Show T&ools Toolbar"
+msgstr "Показать панель «&Инструменты»"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:669
+msgid "Show Trac&ks Toolbar"
+msgstr "Показать панель «&Дорожки»"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:673
+msgid "Show &Editors Toolbar"
+msgstr "Показать панель «&Правка»"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:677
+#: ../src/gui/editors/notation/NotationView.cpp:2309
+msgid "Show Trans&port Toolbar"
+msgstr "Показать панель «&Транспорт»"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:681
+msgid "Show &Zoom Toolbar"
+msgstr "Показать панель «&Масштаб»"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:688
+msgid "Show Tra&nsport"
+msgstr "Показать Тр&анспорт"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:693
+msgid "Show Track &Labels"
+msgstr "Показать м&етки дорожек"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:698
+msgid "Show Playback Position R&uler"
+msgstr "Показать линейку &позиции воспроизведения"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:703
+msgid "Show Te&mpo Ruler"
+msgstr "Показать &линейку темпа"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:708
+msgid "Show Cho&rd Name Ruler"
+msgstr "Показать линейку с именами а&ккордов"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:714
+msgid "Show Segment Pre&views"
+msgstr "Показать содержание се&гментов"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:719
+msgid "Show Special &Parameters"
+msgstr "Показать сп&ециальные параметры"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:753
+#: ../src/gui/editors/matrix/MatrixView.cpp:641
+#: ../src/gui/editors/notation/NotationView.cpp:1772
+msgid "&Select and Edit"
+msgstr "&Выделение и правка"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:758
+#: ../src/gui/editors/matrix/MatrixView.cpp:646
+msgid "&Draw"
+msgstr "&Нарисовать"
+
+#: ../src/commands/edit/EraseCommand.h:50
+#: ../src/gui/application/RosegardenGUIApp.cpp:763
+#: ../src/gui/editors/matrix/MatrixView.cpp:651
+#: ../src/gui/editors/notation/NotationView.cpp:1766
+msgid "&Erase"
+msgstr "&Стереть"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:768
+#: ../src/gui/editors/matrix/MatrixView.cpp:656
+msgid "&Move"
+msgstr "&Перемеcтить"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:775
+msgid "&Resize"
+msgstr "&Изменить размер"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:782 rc.cpp:87
+#, no-c-format
+msgid "&Split"
+msgstr "&Разделить"
+
+#: ../src/commands/segment/SegmentJoinCommand.h:53
+#: ../src/gui/application/RosegardenGUIApp.cpp:789
+msgid "&Join"
+msgstr "О&бъединить"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:795
+msgid "&Harmonize"
+msgstr "&Гармонизовать"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:806
+#: ../src/gui/rulers/TempoRuler.cpp:157
+msgid "Open Tempo and Time Signature Editor"
+msgstr "Открыть редактор темпа и размера"
+
+#: ../src/commands/segment/CutRangeCommand.cpp:41
+#: ../src/gui/application/RosegardenGUIApp.cpp:812
+msgid "Cut Range"
+msgstr "Вырезать диапазон"
+
+#: ../src/commands/edit/CopyCommand.cpp:73
+#: ../src/gui/application/RosegardenGUIApp.cpp:816
+msgid "Copy Range"
+msgstr "Скопировать диапазон"
+
+#: ../src/commands/segment/PasteRangeCommand.cpp:45
+#: ../src/gui/application/RosegardenGUIApp.cpp:820
+msgid "Paste Range"
+msgstr "Вставить диапазон"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:828
+msgid "Insert Range..."
+msgstr "Вставить область..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:832
+#: ../src/gui/editors/notation/NotationView.cpp:1804
+msgid "De&lete"
+msgstr "&Удалить"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:836
+msgid "Select &All Segments"
+msgstr "В&ыбрать все сегменты"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:852
+msgid "Edit Mar&kers..."
+msgstr "Изменить &маркеры..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:856
+msgid "Edit Document P&roperties..."
+msgstr "&Изменить свойства документа..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:864
+msgid "Open in &Default Editor"
+msgstr "С&тандартный редактор"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:870
+#: ../src/gui/general/EditViewBase.cpp:206
+msgid "Open in Matri&x Editor"
+msgstr "&Матричный редактор"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:876
+#: ../src/gui/general/EditViewBase.cpp:212
+msgid "Open in &Percussion Matrix Editor"
+msgstr "Редактор &перкуссии"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:882
+#: ../src/gui/general/EditViewBase.cpp:218
+msgid "Open in &Notation Editor"
+msgstr "&Нотный редактор"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:888
+#: ../src/gui/general/EditViewBase.cpp:224
+msgid "Open in &Event List Editor"
+msgstr "Редактор &событий"
+
+#: ../src/commands/edit/EventQuantizeCommand.cpp:120
+#: ../src/commands/edit/EventUnquantizeCommand.cpp:87
+#: ../src/gui/application/RosegardenGUIApp.cpp:894
+msgid "&Quantize..."
+msgstr "&Квантовать..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:908
+#: ../src/gui/editors/matrix/MatrixView.cpp:686
+msgid "Repeat Last Quantize"
+msgstr "&Повторить последнее квантование"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:928
+msgid "Split at Time..."
+msgstr "Разделить по времени..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:932
+#: ../src/gui/general/EditView.cpp:796
+msgid "Jog &Left"
+msgstr "Сместить в&лево"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:936
+#: ../src/gui/general/EditView.cpp:800
+msgid "Jog &Right"
+msgstr "Сместить в&право"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:940
+msgid "Set Start Time..."
+msgstr "Установить время &начала..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:944
+msgid "Set Duration..."
+msgstr "Установить длительность..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:953
+msgid "Turn Re&peats into Copies"
+msgstr "Превратить по&вторы в копии"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:958
+msgid "Manage Tri&ggered Segments"
+msgstr "Настроить &переключаемые сегменты"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:962
+msgid "Set Tempos from &Beat Segment"
+msgstr "Установить темп из &бит-сегмента"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:966
+msgid "Set &Tempo to Audio Segment Duration"
+msgstr "Установить &темп для всего звукового сегмента"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:972
+#, fuzzy
+msgid "Manage A&udio Files"
+msgstr "Настроить м&етроном..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:977
+msgid "Show Segment Labels"
+msgstr "Показывать метки сегментов"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:986
+msgid "Add &Track"
+msgstr "Добавить &дорожку"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:990
+msgid "&Add Tracks..."
+msgstr "&Добавить дорожки..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:996
+msgid "D&elete Track"
+msgstr "&Удалить дорожку"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1002
+msgid "Move Track &Down"
+msgstr "Переместить дорожку в&низ"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1008
+msgid "Move Track &Up"
+msgstr "Переместить дорожку &вверх"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1012
+msgid "Select &Next Track"
+msgstr "Выбрать &следующую дорожку"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1017
+msgid "Select &Previous Track"
+msgstr "Выбрать &предыдущую дорожку"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1022
+msgid "Mute or Unmute Track"
+msgstr "Приглушить или вернуть громкость дорожке"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1027
+msgid "Arm or Un-arm Track for Record"
+msgstr "Выбрать дорожку для записи или снять выбор"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1034
+msgid "&Mute all Tracks"
+msgstr "Приг&лушить все дорожки"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1040
+msgid "&Unmute all Tracks"
+msgstr "Вернуть &громкость всем дорожкам"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1044
+msgid "&Remap Instruments..."
+msgstr "П&ерераспределить инструменты..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1053
+msgid "&Audio Mixer"
+msgstr "&Звуковой микшер"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1059
+msgid "Midi Mi&xer"
+msgstr "MIDI-&микшер"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1065
+msgid "Manage MIDI &Devices"
+msgstr "Настроить MIDI-&устройства..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1071
+msgid "Manage S&ynth Plugins"
+msgstr "Настроить &синт. модули"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1075
+msgid "Modify MIDI &Filters"
+msgstr "Изменить MIDI-&фильтры..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1079
+msgid "MIDI Thru Routing"
+msgstr "MIDI Thru маршрутизация"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1085
+msgid "Manage &Metronome"
+msgstr "Настроить м&етроном..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1089
+msgid "&Save Current Document as Default Studio"
+msgstr "&Сохранить как стандартное описание студии"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1093
+msgid "&Import Default Studio"
+msgstr "&Импортировать стандартную Студию"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1097
+msgid "Im&port Studio from File..."
+msgstr "Импортировать Студию из ф&айла..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1101
+msgid "&Reset MIDI Network"
+msgstr "&Перезагрузить MIDI Network"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1105
+#, fuzzy
+msgid "Set Quick Marker at Playback Position"
+msgstr "Вставить смену темпа в точку воспроизведения"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1109
+msgid "Jump to Quick Marker"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1142
+#: ../src/gui/editors/matrix/MatrixView.cpp:782
+#: ../src/gui/editors/notation/NotationView.cpp:2397
+#: ../src/gui/studio/AudioMixerWindow.cpp:105
+#: ../src/gui/studio/MidiMixerWindow.cpp:81
+msgid "&Play"
+msgstr "&Воспроизвести"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1153
+#: ../src/gui/editors/matrix/MatrixView.cpp:791
+#: ../src/gui/editors/notation/NotationView.cpp:2406
+#: ../src/gui/studio/AudioMixerWindow.cpp:114
+#: ../src/gui/studio/MidiMixerWindow.cpp:90
+msgid "&Stop"
+msgstr "&Остановить"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1160
+#: ../src/gui/editors/matrix/MatrixView.cpp:802
+#: ../src/gui/editors/notation/NotationView.cpp:2417
+#: ../src/gui/studio/AudioMixerWindow.cpp:125
+#: ../src/gui/studio/MidiMixerWindow.cpp:101
+msgid "&Fast Forward"
+msgstr "Перемотать &вперёд"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1168
+#: ../src/gui/editors/matrix/MatrixView.cpp:796
+#: ../src/gui/editors/notation/NotationView.cpp:2411
+#: ../src/gui/studio/AudioMixerWindow.cpp:119
+#: ../src/gui/studio/MidiMixerWindow.cpp:95
+msgid "Re&wind"
+msgstr "Перемотать &назад"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1175
+msgid "P&unch in Record"
+msgstr "Записать &врезкой (punch-in)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1182
+#: ../src/gui/studio/AudioMixerWindow.cpp:143
+#: ../src/gui/studio/MidiMixerWindow.cpp:119
+msgid "&Record"
+msgstr "&Записать"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1189
+#: ../src/gui/editors/matrix/MatrixView.cpp:808
+#: ../src/gui/editors/notation/NotationView.cpp:2423
+#: ../src/gui/studio/AudioMixerWindow.cpp:131
+#: ../src/gui/studio/MidiMixerWindow.cpp:107
+msgid "Rewind to &Beginning"
+msgstr "Перемотать к &началу"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1196
+#: ../src/gui/editors/matrix/MatrixView.cpp:814
+#: ../src/gui/editors/notation/NotationView.cpp:2429
+#: ../src/gui/studio/AudioMixerWindow.cpp:137
+#: ../src/gui/studio/MidiMixerWindow.cpp:113
+msgid "Fast Forward to &End"
+msgstr "Перемотать к &концу"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1203
+#: ../src/gui/editors/matrix/MatrixView.cpp:832
+#: ../src/gui/editors/notation/NotationView.cpp:2447
+msgid "Scro&ll to Follow Playback"
+msgstr "&Прокручивать по ходу воспроизведения"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1209
+#: ../src/gui/editors/matrix/MatrixView.cpp:838
+#: ../src/gui/editors/notation/NotationView.cpp:2453
+#: ../src/gui/studio/AudioMixerWindow.cpp:149
+#: ../src/gui/studio/MidiMixerWindow.cpp:125
+msgid "Panic"
+msgstr "Panic"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1213
+msgid "Segment Debug Dump "
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1283
+msgid " Zoom: "
+msgstr " Масштаб: "
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1719
+msgid "File \"%1\" does not exist"
+msgstr "Файл \"%1\" не существует"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1725
+msgid "File \"%1\" is actually a directory"
+msgstr "Вообще-то, файл \"%1\" является каталогом"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1734
+msgid "You do not have read permission for \"%1\""
+msgstr "Вы не имеете прав на чтение файла \"%1\""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1802
+msgid ""
+"An auto-save file for this document has been found\n"
+"Do you want to open it instead ?"
+msgstr ""
+"Найдена автоматически сохранённая копия этого файла\n"
+"Вы хотите загрузить её вместо указанного файла?"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1896
+msgid "Example Files"
+msgstr "Файлы с примерами"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2100
+msgid "Opening a new application window..."
+msgstr "Открывается окно с новым приложением..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2110
+msgid "Creating new document..."
+msgstr "Создаётся новый документ..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2154
+#, c-format
+msgid ""
+"Malformed URL\n"
+"%1"
+msgstr ""
+"Задан некорректный URL\n"
+"%1"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2179
+#: ../src/gui/application/RosegardenGUIApp.cpp:2240
+msgid "Opening file..."
+msgstr "Открывается файл..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2201
+#: ../src/gui/application/RosegardenGUIApp.cpp:2220
+msgid "Open File"
+msgstr "Открыть файл"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1225
+#: ../src/gui/application/RosegardenGUIApp.cpp:2258
+msgid "Saving file..."
+msgstr "Сохраняется файл..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2330
+msgid "This is not a valid filename.\n"
+msgstr "Это некорректное имя файла.\n"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2335
+msgid "This is not a local file.\n"
+msgstr "Этот файл находится не на локальной файловой системе.\n"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2342
+#: ../src/gui/studio/BankEditorDialog.cpp:1640
+#: ../src/gui/studio/DeviceManagerDialog.cpp:787
+msgid "You have specified a directory"
+msgstr "Вы указали каталог"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2348
+#: ../src/gui/studio/BankEditorDialog.cpp:1646
+#: ../src/gui/studio/DeviceManagerDialog.cpp:793
+msgid "The specified file exists. Overwrite?"
+msgstr "Указанный файл уже существует. Перезаписать его?"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2362
+msgid "Saving file with a new filename..."
+msgstr "Файл сохраняется под новым именем..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2364
+msgid "Rosegarden files"
+msgstr "Файлы Rosegarden"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2365
+#: ../src/gui/application/RosegardenGUIApp.cpp:4860
+#: ../src/gui/application/RosegardenGUIApp.cpp:4904
+#: ../src/gui/application/RosegardenGUIApp.cpp:4942
+#: ../src/gui/application/RosegardenGUIApp.cpp:4975
+#: ../src/gui/application/RosegardenGUIApp.cpp:5009
+#: ../src/gui/application/RosegardenGUIApp.cpp:5116
+msgid "All files"
+msgstr "Все файлы"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2366
+msgid "Save as..."
+msgstr "Сохранить как..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2404
+msgid "Closing file..."
+msgstr "Файл закрывается..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2421
+#: ../src/gui/editors/notation/NotationView.cpp:4618
+msgid "Printing..."
+msgstr "Документ выводится на печать..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2433
+#: ../src/gui/editors/notation/NotationView.cpp:4635
+msgid "Previewing..."
+msgstr "Предпросмотр..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2440
+msgid "Exiting..."
+msgstr "Сессия завершается..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2463
+msgid "Cutting selection..."
+msgstr "Выделенное вырезается..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2474
+#: ../src/gui/editors/matrix/MatrixView.cpp:1614
+#: ../src/gui/editors/notation/NotationView.cpp:4763
+msgid "Copying selection to clipboard..."
+msgstr "Выделение копируется в буфер обмена..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2484
+#: ../src/gui/editors/eventlist/EventView.cpp:878
+#: ../src/gui/editors/matrix/MatrixView.cpp:1625
+#: ../src/gui/editors/notation/NotationView.cpp:4796
+#: ../src/gui/editors/notation/NotationView.cpp:4841
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:352
+msgid "Clipboard is empty"
+msgstr "Буфер обмена пуст"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2487
+#: ../src/gui/editors/eventlist/EventView.cpp:882
+#: ../src/gui/editors/matrix/MatrixView.cpp:1629
+#: ../src/gui/editors/notation/NotationView.cpp:4804
+#: ../src/gui/editors/notation/NotationView.cpp:4845
+msgid "Inserting clipboard contents..."
+msgstr "Вставляется содержимое буфера обмена..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2556
+msgid "Duration of empty range to insert"
+msgstr "Длительность вставляемой пустой области"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2631
+msgid "This function needs no more than one segment to be selected."
+msgstr "Для этой функции нужен только один выделенный сегмент"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2654
+msgid "Can't join Audio segments"
+msgstr "Не удаётся объединить звуковые сегменты"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2707
+#, fuzzy
+msgid "rescaling an audio file"
+msgstr "Воспроизведение звукового файла"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2723
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:172
+#, fuzzy
+msgid "Rescaling audio file..."
+msgstr "Экспортируется звуковой файл..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2767
+#, fuzzy
+msgid ""
+"The audio file path does not exist or is not writable.\n"
+"You must set the audio file path to a valid directory in Document Properties "
+"before %1.\n"
+"Would you like to set it now?"
+msgstr ""
+"Каталог со звуковыми файлами не существует или закрыт для записи.\n"
+" Укажите правильный каталог в свойствах документа перед началом записи.\n"
+"Хотите сделать это прямо сейчас?"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2769
+#: ../src/gui/application/RosegardenGUIApp.cpp:5291
+#: ../src/gui/application/RosegardenGUIApp.cpp:5339
+#: ../src/gui/editors/segment/TrackButtons.cpp:419
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:159
+msgid "Set audio file path"
+msgstr "Указать путь к звуковым файлам"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2833
+msgid "Jog Selection"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2978
+#, fuzzy, c-format
+msgid ""
+"_n: Split Segment at Time\n"
+"Split %n Segments at Time"
+msgstr "%1 — Дорожка с сегмаентами №%2 — Партитура"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3013
+#: ../src/gui/general/EditViewBase.cpp:619
+msgid "Segment Start Time"
+msgstr "Время начала сегмента"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3023
+msgid "Set Segment Start Times"
+msgstr "Установить время начала сегментов"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3024
+#: ../src/gui/general/EditViewBase.cpp:626
+msgid "Set Segment Start Time"
+msgstr "Установить время начала сегмента"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3056
+#: ../src/gui/general/EditViewBase.cpp:644
+msgid "Segment Duration"
+msgstr "Длительность сегмента"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3068
+msgid "Set Segment Durations"
+msgstr "Установить длительность сегментов"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3069
+#: ../src/gui/general/EditViewBase.cpp:652
+msgid "Set Segment Duration"
+msgstr "Установить длительность сегмента"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3176
+#: ../src/gui/application/RosegardenGUIApp.cpp:5875
+msgid "Set Global Tempo"
+msgstr "Установить темп для всей композиции"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3234
+#: ../src/gui/general/EditViewBase.cpp:477
+msgid "Toggle the toolbar..."
+msgstr "Переключить отображение панели..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3244
+msgid "Toggle the tools toolbar..."
+msgstr "Переключить отображение панели \"Инструменты\"..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3254
+msgid "Toggle the tracks toolbar..."
+msgstr "Переключить отображение панели \"Дорожки\"..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3264
+msgid "Toggle the editor toolbar..."
+msgstr "Переключить отображение панели \"Правка\"..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3274
+msgid "Toggle the transport toolbar..."
+msgstr "Переключить отображение панели \"Транспорт\"..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3284
+msgid "Toggle the zoom toolbar..."
+msgstr "Переключить отображение панели \"Масштаб\"..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3294
+msgid "Toggle the Transport"
+msgstr "Переключить отображение Транспорта"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3377
+#: ../src/gui/general/EditViewBase.cpp:487
+msgid "Toggle the statusbar..."
+msgstr "Переключить отображение статусной строки..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3434
+msgid ""
+"The join tool isn't implemented yet. Instead please highlight the segments "
+"you want to join and then use the menu option:\n"
+"\n"
+" Segments->Collapse Segments.\n"
+msgstr ""
+"Инструмент \"Объединение\" пока не закончен. Вместо него используйте, "
+"пожалуйста, меню: <b>Сегменты -> Объединить.</b>\n"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3437
+msgid "Join tool not yet implemented"
+msgstr "Инструмент \"Объединение\" пока не закончен"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3675
+msgid "Revert modified document to previous saved version?"
+msgstr "Восстановить изменённый документ до предыдущей версии?"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3691
+msgid ""
+"*.rgp|Rosegarden Project files\n"
+"*|All files"
+msgstr ""
+"*.rgp|Файлы проектов Rosegarden\n"
+"*|Все файлы"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3692
+msgid "Import Rosegarden Project File"
+msgstr "Импорт проектного файла Rosegarden"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3717
+msgid "Failed to import project file \"%1\""
+msgstr "Не удалось импортировать файл проекта \"%1\""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3739
+msgid "Open MIDI File"
+msgstr "Открыть MIDI-файл"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3756
+msgid "Merge MIDI File"
+msgstr "Объединить с MIDI-файлом"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3866
+msgid "Importing MIDI file..."
+msgstr "Импортируется MIDI-файл..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3903
+msgid "Calculating notation..."
+msgstr "Вычисляется партитура..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3950
+msgid "Calculate Notation"
+msgstr "Вычислить партитуру"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3991
+#: ../src/gui/application/RosegardenGUIApp.cpp:4008
+msgid ""
+"*.rose|Rosegarden-2 files\n"
+"*|All files"
+msgstr ""
+"*.rose|Файлы Rosegarden-2\n"
+"*|Все файлы"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3992
+#: ../src/gui/application/RosegardenGUIApp.cpp:4009
+msgid "Open Rosegarden 2.1 File"
+msgstr "Открыть файл Rosegarden 2.1"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4026
+msgid "Importing Rosegarden 2.1 file..."
+msgstr "Импортируется файл Rosegarden 2.1..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4052
+msgid "Can't load Rosegarden 2.1 file. It appears to be corrupted."
+msgstr ""
+"Не удалось прочесть файл Rosegarden 2.1.\n"
+"Скорее всего, файл испорчен."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4078
+#: ../src/gui/application/RosegardenGUIApp.cpp:4095
+msgid ""
+"*.h2song|Hydrogen files\n"
+"*|All files"
+msgstr ""
+"*.h2song|Файлы Hydrogen\n"
+"*|Все файлы"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4079
+#: ../src/gui/application/RosegardenGUIApp.cpp:4096
+msgid "Open Hydrogen File"
+msgstr "Открыть файл Hydrogen"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4113
+msgid "Importing Hydrogen file..."
+msgstr "Импортировать файл Hydrogen..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4139
+msgid "Can't load Hydrogen file. It appears to be corrupted."
+msgstr ""
+"Не удалось загрузить файл Hydrogen.\n"
+"Скорее всего, файл испорчен."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4527
+#, fuzzy
+msgid "Export and import of Rosegarden Project files"
+msgstr "Экспортируется проектный файл Rosegarden..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4529
+#, fuzzy
+msgid "The Rosegarden Project Packager helper script"
+msgstr "Проектные файлы Rosegarden\n"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4533
+msgid "%1 - for project file support"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4550
+msgid "The Rosegarden LilyPondView helper script"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4554
+#, fuzzy
+msgid "%1 - for LilyPond preview support"
+msgstr "Параметры предосмотра Lilypond"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4570
+msgid "The Rosegarden Audio File Importer helper script"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4574
+#, fuzzy
+msgid "%1 - for audio file import"
+msgstr "Указать путь к звуковым файлам"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4585
+msgid ""
+"<h3>Helper programs not found</h3><p>Rosegarden could not find one or more "
+"helper programs which it needs to provide some features. The following "
+"features will not be available:</p>"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4586
+#: ../src/gui/application/RosegardenGUIApp.cpp:4592
+#, fuzzy
+msgid "<ul>"
+msgstr "<по умолчанию>"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4588
+#: ../src/gui/application/RosegardenGUIApp.cpp:4594
+#, fuzzy
+msgid "<li>%1</li>"
+msgstr "<li>%1 (из %2)</li>"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4590
+#: ../src/gui/application/RosegardenGUIApp.cpp:4596
+msgid "</ul>"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4591
+msgid ""
+"<p>To fix this, you should install the following additional programs:</p>"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4603
+msgid "Helper programs not found"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4686
+msgid "Starting the sequencer..."
+msgstr "Запускается секвенсер..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4712
+msgid "Couldn't start the sequencer"
+msgstr "Не удалось запустить секвенсер"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4789
+msgid "Clearing down jackd..."
+msgstr "\"Опускается\" сервер jackd..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4803
+msgid "Starting jackd..."
+msgstr "Запускается сервер jackd..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4842
+msgid ""
+"The Rosegarden sequencer process has exited unexpectedly. Sound and "
+"recording will no longer be available for this session.\n"
+"Please exit and restart Rosegarden to restore sound capability."
+msgstr ""
+"Секвенсер Rosgarden запустить не удалось, поэтому воспроизведение \n"
+"и запись для этой сессии будут недоступны. За помощью о корректной \n"
+"настройке звука и MIDI обратитесь на www.rosegardenmusic.com."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4846
+msgid ""
+"The Rosegarden sequencer could not be started, so sound and recording will "
+"be unavailable for this session.\n"
+"For assistance with correct audio and MIDI configuration, go to http://"
+"rosegardenmusic.com."
+msgstr ""
+"Секвенсер Rosgarden запустить не удалось, поэтому воспроизведение \n"
+"и запись для этой сессии будут недоступны. За помощью о корректной \n"
+"настройке звука и MIDI обратитесь на www.rosegardenmusic.com."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4856
+msgid "Exporting Rosegarden Project file..."
+msgstr "Экспортируется проектный файл Rosegarden..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4859
+msgid "Rosegarden Project files\n"
+msgstr "Проектные файлы Rosegarden\n"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4861
+#: ../src/gui/application/RosegardenGUIApp.cpp:4905
+#: ../src/gui/application/RosegardenGUIApp.cpp:4943
+#: ../src/gui/application/RosegardenGUIApp.cpp:4976
+#: ../src/gui/application/RosegardenGUIApp.cpp:5010
+#: ../src/gui/application/RosegardenGUIApp.cpp:5116
+msgid "Export as..."
+msgstr "Экспортировать как..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4875
+#, c-format
+msgid "Saving Rosegarden file to package failed: %1"
+msgstr "Не удалось сохранить файл Rosegarden в архив: %1"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4889
+msgid "Failed to export to project file \"%1\""
+msgstr "Не удалось экспортировать в проектный файл \"%1\""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4900
+#: ../src/gui/application/RosegardenGUIApp.cpp:4915
+msgid "Exporting MIDI file..."
+msgstr "Идёт экспорт в MIDI..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4903
+msgid "Standard MIDI files\n"
+msgstr "Стандартные MIDI-файлы\n"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4934
+#: ../src/gui/application/RosegardenGUIApp.cpp:4966
+#: ../src/gui/application/RosegardenGUIApp.cpp:4999
+#: ../src/gui/application/RosegardenGUIApp.cpp:5103
+#: ../src/gui/application/RosegardenGUIApp.cpp:5140
+#: ../src/gui/editors/notation/NotationView.cpp:4733
+msgid "Export failed. The file could not be opened for writing."
+msgstr "Экспорт не удался. Файл не мог быть открыт для записи."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4940
+#: ../src/gui/application/RosegardenGUIApp.cpp:4952
+msgid "Exporting Csound score file..."
+msgstr "Идёт экспорт в партитуру Csound..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4972
+#: ../src/gui/application/RosegardenGUIApp.cpp:4985
+msgid "Exporting Mup file..."
+msgstr "Экспортируется Mup-файл..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4975
+msgid "Mup files\n"
+msgstr "Mup-файлы\n"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5005
+#: ../src/gui/application/RosegardenGUIApp.cpp:5089
+#: ../src/gui/editors/notation/NotationView.cpp:4719
+#, fuzzy
+msgid "Exporting LilyPond file..."
+msgstr "Идёт экспорт в партитуру Lilypond..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5008
+#, fuzzy
+msgid "LilyPond files"
+msgstr "Файлы Lilypond"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5023
+#: ../src/gui/editors/notation/NotationView.cpp:4653
+#, fuzzy
+msgid "Printing LilyPond file..."
+msgstr "Печатается файл Lilypond..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5028
+#: ../src/gui/application/RosegardenGUIApp.cpp:5052
+#: ../src/gui/editors/notation/NotationView.cpp:4658
+#: ../src/gui/editors/notation/NotationView.cpp:4682
+#, fuzzy
+msgid "Failed to open a temporary file for LilyPond export."
+msgstr "Не удалось открыть временный файл для экспорта в партитуру Lilypond"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5047
+#: ../src/gui/editors/notation/NotationView.cpp:4677
+#, fuzzy
+msgid "Previewing LilyPond file..."
+msgstr "Просмотр партитуры Lilypond..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5080
+#: ../src/gui/editors/notation/NotationView.cpp:4710
+#, fuzzy
+msgid "LilyPond Preview Options"
+msgstr "Параметры предосмотра Lilypond"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5081
+#: ../src/gui/editors/notation/NotationView.cpp:4711
+#, fuzzy
+msgid "LilyPond preview options"
+msgstr "Параметры предосмотра Lilypond"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5112
+#: ../src/gui/application/RosegardenGUIApp.cpp:5126
+msgid "Exporting MusicXML file..."
+msgstr "Идёт экспорт в партитуру MusicXML..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5115
+msgid "XML files"
+msgstr "XML-файлы"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5289
+#: ../src/gui/editors/segment/TrackButtons.cpp:417
+msgid ""
+"The audio file path does not exist or is not writable.\n"
+"Please set the audio file path to a valid directory in Document Properties "
+"before recording audio.\n"
+"Would you like to set it now?"
+msgstr ""
+"Каталог со звуковыми файлами не существует или закрыт для записи.\n"
+" Укажите правильный каталог в свойствах документа перед началом записи.\n"
+"Хотите сделать это прямо сейчас?"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5337
+msgid ""
+"The audio file path does not exist or is not writable.\n"
+"Please set the audio file path to a valid directory in Document Properties "
+"before you start to record audio.\n"
+"Would you like to set it now?"
+msgstr ""
+"Путь к звуковым файлам не существует, либо нет прав записи в него.\n"
+"Укажите корректный путь в настройках документа перед записью звука.\n"
+"Хотите сделать это прямо сейчас?"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5780
+#, fuzzy
+msgid "Move playback pointer to time"
+msgstr "Указатель точки воспроизведения к &курсору"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5793
+#: ../src/gui/editors/matrix/MatrixView.cpp:2240
+msgid "%1%"
+msgstr "%1%"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5861
+#, c-format
+msgid "Replace Tempo Change at %1"
+msgstr "Заменить изменение темпа в позиции %1"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5891
+msgid "Set Global and Default Tempo"
+msgstr "Установить глобальный и стандартный темпы"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5914
+msgid "Move Tempo Change"
+msgstr "Переместить смену темпа"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5949
+#, fuzzy
+msgid "new marker"
+msgstr "Нет субмиксов"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5950
+#, fuzzy
+msgid "no description"
+msgstr "Описание"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:6363
+#, c-format
+msgid "Sequencer failed to add audio file %1"
+msgstr "Секвенсеру не удалось добавить звуковой файл·%1"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:6388
+#, c-format
+msgid "Sequencer failed to remove audio file id %1"
+msgstr "Секвенсеру не удалось удалить звуковой файл с id %1"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:6448
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:1086
+msgid "Modify Segment label"
+msgstr "Изменить метку сегмента"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:6450
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:1088
+msgid "Modify Segments label"
+msgstr "Изменить метки сегментов"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:6452
+msgid "Relabelling selection..."
+msgstr "Меняется метка выделения..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7539
+msgid "Play List"
+msgstr "Список воспроизведения"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7567
+msgid "http://rosegarden.sourceforge.net/tutorial/en/chapter-0.html"
+msgstr "http://rosegarden.sourceforge.net/tutorial/en/chapter-0.html"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7574
+msgid "http://rosegarden.sourceforge.net/tutorial/bug-guidelines.html"
+msgstr "http://rosegarden.sourceforge.net/tutorial/bug-guidelines.html"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7650
+msgid "Queueing MIDI panic events for tranmission..."
+msgstr "В очередь на передачу ставятся события MIDI panic..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7708
+msgid "Are you sure you want to save this as your default studio?"
+msgstr ""
+"Вы действительно хотите сделать этот документ\n"
+"стандартным описанием студии?"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7713
+msgid "Saving current document as default studio..."
+msgstr "Документ сохраняется как стандартное описание студии..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7738
+msgid ""
+"Are you sure you want to import your default studio and lose the current one?"
+msgstr ""
+"Вы действительно хотите сделать этот документ стандартным \n"
+"описанием студии и отказаться от текущего описания?"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7773
+msgid "Import Studio from File"
+msgstr "Импортировать Студию из файла"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7807
+msgid "Import Studio"
+msgstr "Импортировать Студию"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:8015
+msgid ""
+"<h3>Newer version available</h3><p>A newer version of Rosegarden may be "
+"available.<br>Please consult the <a href=\"http://www.rosegardenmusic.com/"
+"getting/\">Rosegarden website</a> for more information.</p>"
+msgstr ""
+"<h3>Доступна более новая версия</h3><p>По всей видимости, доступна более "
+"новая версия Rosegarden.<br>Зайдите на <a href=\"http://www.rosegardenmusic."
+"com/getting/\">сайт Rosegarden</a>, чтобы узнать подробности.</p>"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:8016
+msgid "Newer version available"
+msgstr "Доступна новая версия"
+
+#: ../src/gui/application/RosegardenApplication.cpp:104
+#, c-format
+msgid "Failed to load soundfont %1"
+msgstr "Не удалось загрузить soundfont %1"
+
+#: ../src/gui/application/main.cpp:311
+msgid "Rosegarden - A sequencer and musical notation editor"
+msgstr "Rosegarden - секвенсер и нотный редактор"
+
+#: ../src/gui/application/main.cpp:315
+msgid "Don't use the sequencer (support editing only)"
+msgstr "Не использовать секвенсер (оставить только редактирование)"
+
+#: ../src/gui/application/main.cpp:316
+msgid "Don't show the splash screen"
+msgstr "Не показывать заставку при старте"
+
+#: ../src/gui/application/main.cpp:317
+msgid "Don't automatically run in the background"
+msgstr "Не запускаться автоматически в фоновом режиме"
+
+#: ../src/gui/application/main.cpp:318
+msgid "Attach to a running sequencer process, if found"
+msgstr "Встроиться в найденный процесс секвенсера, или таковой найден"
+
+#: ../src/gui/application/main.cpp:319
+msgid "Ignore installed version - for devs only"
+msgstr "Проигнорировать установленную версию — только для разработчиков"
+
+#: ../src/gui/application/main.cpp:320
+msgid "file to open"
+msgstr "откройте файл"
+
+#: ../src/gui/application/main.cpp:370
+msgid "Installation contains the wrong version of Rosegarden."
+msgstr "В установщике указана неверная версия Rosegarden"
+
+#: ../src/gui/application/main.cpp:371
+#, fuzzy
+msgid ""
+" The wrong versions of Rosegarden's data files were\n"
+" found in the standard KDE installation directories.\n"
+" (I am %1, but the installed files are for version %2.)\n"
+"\n"
+" This may mean one of the following:\n"
+"\n"
+" 1. This is a new upgrade of Rosegarden, and it has not yet been\n"
+" installed. If you compiled it yourself, check that you have\n"
+" run \"make install\" and that the procedure completed\n"
+" successfully.\n"
+"\n"
+" 2. The upgrade was installed in a non-standard directory,\n"
+" and an old version was found in a standard directory. If so,\n"
+" you will need to add the correct directory to your KDEDIRS\n"
+" environment variable before you can run it."
+msgstr ""
+" В стандартных каталогах KDE для установки были найдены \n"
+" неверные версии файлов Rosegarden.\n"
+" (Текущая версия — %1, но файлы предназначены для версии %2.)\n"
+"\n"
+" Тому могут быть следующие причины:\n"
+"\n"
+" 1. Это новая версия Rosegarden, которая ещё не установлена.\n"
+" Если вы собрали её из исходного кода, убедитесь в том, что\n"
+" вы ввели команду \"scons install\" и её выполнение прошло успешно.\n"
+"\n"
+" 2. Обновлённые данные новой версии были записаны в каталог, \n"
+" отличный от стандартного, и старые версии данных остались \n"
+" в стандартном каталоге. В таком случае вам необходимо указать "
+"правильные каталоги для переменной окружения KDEDIRS,\n"
+" прежде чем снова попробовать запустить Rosegarden."
+
+#: ../src/gui/application/main.cpp:383 ../src/gui/application/main.cpp:401
+msgid "Installation problem"
+msgstr "Проблема при установке"
+
+#: ../src/gui/application/main.cpp:389
+msgid "Rosegarden does not appear to have been installed."
+msgstr "Похоже, что программа Rosegarden не установлена."
+
+#: ../src/gui/application/main.cpp:390
+#, fuzzy
+msgid ""
+" One or more of Rosegarden's data files could not be\n"
+" found in the standard KDE installation directories.\n"
+"\n"
+" This may mean one of the following:\n"
+"\n"
+" 1. Rosegarden has not been correctly installed. If you compiled\n"
+" it yourself, check that you have run \"make install\" and that\n"
+" the procedure completed successfully.\n"
+"\n"
+" 2. Rosegarden has been installed in a non-standard directory,\n"
+" and you need to add this directory to your KDEDIRS environment\n"
+" variable before you can run it. This may be the case if you\n"
+" installed into $HOME or a local third-party package directory\n"
+" like /usr/local or /opt."
+msgstr ""
+"Один или несколько файлов Rosegarden не были найдены в стандартных каталогах "
+"KDE для установки.\n"
+"\n"
+" Тому могут быть следующие причины:\n"
+"\n"
+" 1. Программа Rosegarden была некорректно установлена.\n"
+" Если вы собрали её из исходного кода, убедитесь в том, что\n"
+" вы ввели команду \"scons install\" и её выполнение прошло успешно.\n"
+"\n"
+" 2. При установке файлы Rosegarden были записаны в каталог, отличный \n"
+" от стандартного — например в $HOME или локальный каталог для "
+"«неофициальных» пакетов — /usr/local или /opt. В таком случае вам\n"
+" необходимо указать правильные каталоги для переменной окружения\n"
+" KDEDIRS, прежде чем снова попробовать запустить Rosegarden."
+
+#: ../src/gui/application/main.cpp:414
+msgid "Rosegarden"
+msgstr "Rosegarden"
+
+#: ../src/gui/application/main.cpp:416
+#, fuzzy
+msgid ""
+"Copyright 2000 - 2008 Guillaume Laurent, Chris Cannam, Richard Bown\n"
+"Parts copyright 1994 - 2004 Chris Cannam, Andy Green, Richard Bown, "
+"Guillaume Laurent\n"
+"LilyPond fonts copyright 1997 - 2005 Han-Wen Nienhuys and Jan Nieuwenhuizen"
+msgstr ""
+"Авторские права 2000 - 2007 Guillaume Laurent, Chris Cannam, Richard Bown\n"
+"Частичные авторские права 1994 - 2004 Chris Cannam, Andy Green, Richard "
+"Bown, Guillaume Laurent\n"
+"Авторские права на шрифты Lilypond 1997 - 2005 Han-Wen Nienhuys и Jan "
+"Nieuwenhuizen"
+
+#: ../src/gui/application/main.cpp:428
+msgid "Chord labelling code"
+msgstr "Код обозначения аккордов"
+
+#: ../src/gui/application/main.cpp:429
+#, fuzzy
+msgid ""
+"LilyPond output\n"
+"assorted other patches\n"
+"i18n-ization"
+msgstr ""
+"Вывод в Lilypond\n"
+"Некоторые исправления\n"
+"i18n-ization"
+
+#: ../src/gui/application/main.cpp:430
+msgid ""
+"UI improvements\n"
+"bug fixes"
+msgstr ""
+"Улучшения пользовательского интерфейса\n"
+"Исправление ошибок"
+
+#: ../src/gui/application/main.cpp:431
+msgid ""
+"Segment colours\n"
+"Other UI and bug fixes"
+msgstr ""
+"Цвета сегментов\n"
+"Прочие изменения в интерфейса и исправление ошибок"
+
+#: ../src/gui/application/main.cpp:432
+msgid ""
+"Russian translation\n"
+"i18n-ization"
+msgstr ""
+"Перевод на русский\n"
+"i18n-ization"
+
+#: ../src/gui/application/main.cpp:433 ../src/gui/application/main.cpp:434
+msgid "German translation"
+msgstr "Перевод на немецкий"
+
+#: ../src/gui/application/main.cpp:435
+msgid "Welsh translation"
+msgstr "Перевод на уэльский"
+
+#: ../src/gui/application/main.cpp:436
+msgid "French translation"
+msgstr "Перевод на французский"
+
+#: ../src/gui/application/main.cpp:437
+msgid ""
+"French translation\n"
+"Bug fixes"
+msgstr ""
+"Перевод на французский\n"
+"Исправление ошибок"
+
+#: ../src/gui/application/main.cpp:438 ../src/gui/application/main.cpp:439
+msgid "Italian translation"
+msgstr "Перевод на итальянский"
+
+#: ../src/gui/application/main.cpp:440 ../src/gui/application/main.cpp:441
+msgid "Swedish translation"
+msgstr "Перевод на шведский"
+
+#: ../src/gui/application/main.cpp:442
+msgid "Estonian translation"
+msgstr "Перевод на эстонский"
+
+#: ../src/gui/application/main.cpp:443 ../src/gui/application/main.cpp:444
+msgid "Dutch translation"
+msgstr "Перевод на датский"
+
+#: ../src/gui/application/main.cpp:445
+msgid "HSpinBox class"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:446
+msgid "Transposition by interval"
+msgstr "Транспозиция на интервал"
+
+#: ../src/gui/application/main.cpp:447
+msgid "Original designs for rotary controllers"
+msgstr "Исходный дизайн круговых регуляторов"
+
+#: ../src/gui/application/main.cpp:448
+msgid "Japanese translation"
+msgstr "Перевод на японский"
+
+#: ../src/gui/application/main.cpp:449
+msgid ""
+"Auto-scroll deceleration\n"
+"Rests outside staves and other bug fixes"
+msgstr ""
+"Замедление автопрокрутки \n"
+"Паузы вне нотного стана и исправление ошибок"
+
+#: ../src/gui/application/main.cpp:450
+msgid "Simplified Chinese translation"
+msgstr "Перевод на упрощённый китайский"
+
+#: ../src/gui/application/main.cpp:451
+msgid "LIRC infrared remote-controller support"
+msgstr "Поддержка дистанционного управления через LIRC"
+
+#: ../src/gui/application/main.cpp:452
+msgid "MTC slave timing implementation"
+msgstr "Реализаций тайминга MTC slave"
+
+#: ../src/gui/application/main.cpp:453
+msgid "Czech translation"
+msgstr "Перевод на чешский"
+
+#: ../src/gui/application/main.cpp:454
+msgid "SCons/bksys building system"
+msgstr "Система сборки SCons/bksys"
+
+#: ../src/gui/application/main.cpp:455
+msgid "icons, icons, icons"
+msgstr "Новые пиктограммы"
+
+#: ../src/gui/application/main.cpp:456 ../src/gui/application/main.cpp:457
+#: ../src/gui/application/main.cpp:458 ../src/gui/application/main.cpp:459
+msgid "Spanish translation"
+msgstr "Перевод на испанский"
+
+#: ../src/gui/application/main.cpp:460 ../src/gui/application/main.cpp:461
+msgid "Catalan translation"
+msgstr "Перевод на каталонский"
+
+#: ../src/gui/application/main.cpp:462
+msgid ""
+"1.2.3 splash screen photo\n"
+"Gave birth to D. Michael McIntyre, bought him a good flute once\n"
+"upon a time, and always humored him when he came over to play her\n"
+"some new instrument, even though she really hated his playing.\n"
+"Born October 19, 1951, died September 21, 2007, R. I. P."
+msgstr ""
+
+#: ../src/gui/application/main.cpp:463
+msgid "Initial guitar chord editing code"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:464
+msgid "Polish translation"
+msgstr "Перевод на польский"
+
+#: ../src/gui/application/main.cpp:465
+msgid "Basque translation"
+msgstr "Перевод на баскский"
+
+#: ../src/gui/application/main.cpp:466
+msgid "Klearlook theme"
+msgstr "Тема Klearlook"
+
+#: ../src/_translatorinfo.cpp:1 ../src/gui/application/main.cpp:468
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr "Александр Прокудин"
+
+#: ../src/_translatorinfo.cpp:3 ../src/gui/application/main.cpp:468
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+
+#: ../src/gui/application/main.cpp:719
+msgid "Welcome!"
+msgstr "Добро пожаловать!"
+
+#: ../src/gui/application/main.cpp:731
+msgid ""
+"<h2>Welcome to Rosegarden!</h2><p>Welcome to the Rosegarden audio and MIDI "
+"sequencer and musical notation editor.</p><ul><li>If you have not already "
+"done so, you may wish to install some DSSI synth plugins, or a separate "
+"synth program such as QSynth. Rosegarden does not synthesize sounds from "
+"MIDI on its own, so without these you will hear nothing.</"
+"li><br><br><li>Rosegarden uses the JACK audio server for recording and "
+"playback of audio, and for playback from DSSI synth plugins. These features "
+"will only be available if the JACK server is running.</"
+"li><br><br><li>Rosegarden has comprehensive documentation: see the Help menu "
+"for the handbook, tutorials, and other information!</li></ul><p>Rosegarden "
+"was brought to you by a team of volunteers across the world. To learn more, "
+"go to <a href=\"http://www.rosegardenmusic.com/\">http://www.rosegardenmusic."
+"com/</a>.</p>"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIView.cpp:257
+msgid "No non-audio segments in composition"
+msgstr "В композиции нет незвуковых сегментов"
+
+#: ../src/gui/application/RosegardenGUIView.cpp:333
+msgid "Selection must contain only audio or non-audio segments"
+msgstr "Выделять можно либо звуковой, либо незвуковой сегмент"
+
+#: ../src/gui/application/RosegardenGUIView.cpp:431
+#: ../src/gui/application/RosegardenGUIView.cpp:576
+#: ../src/gui/application/RosegardenGUIView.cpp:612
+#: ../src/gui/application/RosegardenGUIView.cpp:776
+msgid "No non-audio segments selected"
+msgstr "Ни одного звукового сегмента не выделено"
+
+#: ../src/gui/application/RosegardenGUIView.cpp:851
+#, fuzzy
+msgid ""
+"You've not yet defined an audio editor for Rosegarden to use.\n"
+"See Settings -> Configure Rosegarden -> Audio."
+msgstr ""
+"Вы не определили звуковой редактор для совместной работы с Rosegarden.\n"
+"Пройдитесь по меню Настройки -> Настроить Rosegarden -> Общее -> Внешние "
+"редакторы."
+
+#: ../src/gui/application/RosegardenGUIView.cpp:1559
+#: ../src/gui/application/RosegardenGUIView.cpp:1564
+msgid "Can't add dropped file. "
+msgstr "Не удаётся добавить перетащенный файл. "
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1014
+#: ../src/gui/seqmanager/SequenceManager.cpp:1150
+msgid ""
+"The JACK Audio subsystem has failed or it has stopped Rosegarden from "
+"processing audio.\n"
+"Please restart Rosegarden to continue working with audio.\n"
+"Quitting other running applications may improve Rosegarden's performance."
+msgstr ""
+"Подсистема JACK Audio «умерла» или сделала невозможным\n"
+"обработку аудио в Rosegarden. Перезапустите Rosegarden для \n"
+"возобновления работы с аудио. Завершение работы других \n"
+"приложений может улучшить производительность Rosegarden."
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1020
+#: ../src/gui/seqmanager/SequenceManager.cpp:1156
+msgid ""
+"The JACK Audio subsystem has stopped Rosegarden from processing audio, "
+"probably because of a processing overload.\n"
+"An attempt to restart the audio service has been made, but some problems may "
+"remain.\n"
+"Quitting other running applications may improve Rosegarden's performance."
+msgstr ""
+"Подсистема JACK Audio «умерла» или сделала невозможным\n"
+"обработку аудио в Rosegarden. Была произведена попытка \n"
+"перезапустить аудиосервис, но некоторые проблемы могли \n"
+"остаться нерешёнными. Завершение работы других приложений \n"
+"может улучшить производительность Rosegarden."
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1031
+msgid ""
+"Run out of processor power for real-time audio processing. Cannot continue."
+msgstr ""
+"Мощности процессора уже не хватает для работы в режиме \n"
+"реального времени. Продолжение работы невозможно."
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1057
+msgid ""
+"A serious error has occurred in the ALSA MIDI subsystem. It may not be "
+"possible to continue sequencing. Please check console output for more "
+"information."
+msgstr ""
+"Произошла серьёзная ошибка в подсистеме ALSA MIDI. Секвенсер может перестать "
+"работать. Проверьте, есть ли подробности в выводе на консоль."
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1078
+msgid "JACK Audio subsystem is losing sample frames."
+msgstr "Подсистема JACK Audio теряет некоторые сэмплы."
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1096
+msgid ""
+"Failed to read audio data from disc in time to service the audio subsystem."
+msgstr ""
+"Не удалось своевременно прочитать звуковые данные с диска\n"
+"для обеспечения нормальной работы звуковой подсистемы."
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1100
+msgid ""
+"Failed to write audio data to disc fast enough to service the audio "
+"subsystem."
+msgstr ""
+"Не удалось записать данные на диск достаточно быстро\n"
+"для обеспечения нормальной работы звуковой подсистемы."
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1104
+msgid "The audio mixing subsystem is failing to keep up."
+msgstr "Звуковая подсистема микшера не поспевает."
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1108
+msgid "The audio subsystem is failing to keep up."
+msgstr "Звуковая подсистема не поспевает."
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1112
+msgid "Unknown sequencer failure mode!"
+msgstr "Неизвестная ошибка секвенсера!"
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1170
+#, fuzzy
+msgid ""
+"<h3>System timer resolution is too low</h3><p>Rosegarden was unable to find "
+"a high-resolution timing source for MIDI performance.</p><p>This may mean "
+"you are using a Linux system with the kernel timer resolution set too low. "
+"Please contact your Linux distributor for more information.</p><p>Some Linux "
+"distributors already provide low latency kernels, see <a href=\"http://"
+"rosegarden.wiki.sourceforge.net/Low+latency+kernels\">http://rosegarden.wiki."
+"sourceforge.net/Low+latency+kernels</a> for instructions.</p>"
+msgstr ""
+"<h3>Разрешение системного таймера слишком низкое</h3> <p>Rosegarden не "
+"удалось найти источник тайминга с высоким разрешением для работы с MIDI.</"
+"p><p>Это может значить, что ваша система использует ядро Linux, в котором "
+"разрешение таймера слишком низкое. Свяжитесь с разработчиками вашего "
+"дистрибутива..</p>"
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1188
+#, fuzzy
+msgid ""
+"<h3>System timer resolution is too low</h3><p>Rosegarden was unable to find "
+"a high-resolution timing source for MIDI performance.</p><p>You may be able "
+"to solve this problem by loading the RTC timer kernel module. To do this, "
+"try running <b>sudo modprobe snd-rtctimer</b> in a terminal window and then "
+"restarting Rosegarden.</p><p>Alternatively, check whether your Linux "
+"distributor provides a multimedia-optimized kernel. See <a href=\"http://"
+"rosegarden.wiki.sourceforge.net/Low+latency+kernels\">http://rosegarden.wiki."
+"sourceforge.net/Low+latency+kernels</a> for notes about this.</p>"
+msgstr ""
+"<h3>Разрешение системного таймера слишком низкое</h3> <p>Rosegarden не "
+"удалось найти источник тайминга с высоким разрешением для работы с MIDI.</"
+"p><p>Это может значить, что ваша система использует ядро Linux, в котором "
+"разрешение таймера слишком низкое. Свяжитесь с разработчиками вашего "
+"дистрибутива..</p>"
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1312
+msgid ""
+"<p>Both MIDI and Audio subsystems have failed to initialize.</p><p>You may "
+"continue without the sequencer, but we suggest closing Rosegarden, running "
+"\"alsaconf\" as root, and starting Rosegarden again. If you wish to run "
+"with no sequencer by design, then use \"rosegarden --nosequencer\" to avoid "
+"seeing this error in the future.</p>"
+msgstr ""
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1314
+msgid ""
+"<p>The MIDI subsystem has failed to initialize.</p><p>You may continue "
+"without the sequencer, but we suggest closing Rosegarden, running \"modprobe "
+"snd-seq-midi\" as root, and starting Rosegarden again. If you wish to run "
+"with no sequencer by design, then use \"rosegarden --nosequencer\" to avoid "
+"seeing this error in the future.</p>"
+msgstr ""
+"<p>Не удалось инициализировать MIDI-подсистему.</p><p>You may continue "
+"without the sequencer, but we suggest closing Rosegarden, running \"modprobe "
+"snd-seq-midi\" as root, and starting Rosegarden again. If you wish to run "
+"with no sequencer by design, then use \"rosegarden --nosequencer\" to avoid "
+"seeing this error in the future.</p>"
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1316
+msgid ""
+"<p>The Rosegarden sequencer module version does not match the GUI module "
+"version.</p><p>You have probably mixed up files from two different versions "
+"of Rosegarden. Please check your installation.</p>"
+msgstr ""
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1322
+#, fuzzy, c-format
+msgid "<h3>Sequencer startup failed</h3>%1"
+msgstr "Не удалось запустить секвенсер: %1"
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1330
+msgid ""
+"<h3>Failed to connect to JACK audio server.</h3><p>Rosegarden could not "
+"connect to the JACK audio server. This probably means the JACK server is "
+"not running.</p><p>If you want to be able to play or record audio files or "
+"use plugins, you should exit Rosegarden and start the JACK server before "
+"running Rosegarden again.</p>"
+msgstr ""
+"<h3>Не удалось соединиться со звуковым сервером JACK</h3><p>Rosegarden не "
+"удалось соединиться со звуковым сервером JACK. Скорее всего, сервер попросту "
+"не запущен. </p><p>Если вы хотите записывать аудио или использовать "
+"расширения, вам необходимо закрыть Rosegarden, запустить JACK, и уже вслед "
+"за ним — Rosegarden.</p>"
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1331
+msgid "Failed to connect to JACK"
+msgstr "Не удалось соединиться с JACK"
+
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:46
+msgid "Modify MIDI filters..."
+msgstr "Изменить MIDI-фильтры..."
+
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:58
+msgid "THRU events to ignore"
+msgstr "Какие THRU-события игнорировать"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:131
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:60
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:96
+msgid "Note"
+msgstr "Note"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:132
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:61
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:97
+msgid "Program Change"
+msgstr "Program Change"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:136
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:62
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:98
+msgid "Key Pressure"
+msgstr "Key Pressure"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:137
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:63
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:99
+msgid "Channel Pressure"
+msgstr "Channel Pressure"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:134
+#: ../src/gui/general/EditView.cpp:899
+#: ../src/gui/rulers/ControllerEventsRuler.cpp:198
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:64
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:100
+msgid "Pitch Bend"
+msgstr "Pitch Bend"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:133
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:65
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:101
+msgid "Controller"
+msgstr "Controller"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:135
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:66
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:102
+msgid "System Exclusive"
+msgstr "System Exclusive"
+
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:94
+msgid "RECORD events to ignore"
+msgstr "Какие RECORD-события игнорировать"
+
+#: ../src/gui/widgets/TimeWidget.cpp:101
+msgid "Note:"
+msgstr "Нота:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:108 ../src/gui/widgets/TimeWidget.cpp:145
+msgid "<inexact>"
+msgstr "<неточно>"
+
+#: ../src/gui/widgets/TimeWidget.cpp:151
+msgid "Units:"
+msgstr "Единиц:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:173
+msgid "Time:"
+msgstr "Время:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:184
+msgid "units"
+msgstr "единиц"
+
+#: ../src/gui/widgets/TimeWidget.cpp:193
+msgid "Measures:"
+msgstr "Тактов:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:193
+msgid "Measure:"
+msgstr "Тактов:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:212
+msgid "beats:"
+msgstr "Долей:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:212
+msgid "beat:"
+msgstr "Доля:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:230
+msgid "%1:"
+msgstr "%1:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:254
+msgid "Seconds:"
+msgstr "Секунд:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:273
+msgid "msec:"
+msgstr "мс:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:407 ../src/gui/widgets/TimeWidget.cpp:531
+msgid "(%1/%2 time)"
+msgstr "(размер %1/%2)"
+
+#: ../src/gui/widgets/TimeWidget.cpp:452
+msgid "(starting %1.%2 qpm, %2.%3 bpm)"
+msgstr "(при запуске %1.%2 qpm, %2.%3 bpm)"
+
+#: ../src/gui/widgets/TimeWidget.cpp:458
+msgid "(starting %1.%2 bpm)"
+msgstr "(при запуске %1.%2 bpm)"
+
+#: ../src/gui/widgets/TimeWidget.cpp:464
+msgid "(%1.%2 qpm, %2.%3 bpm)"
+msgstr "(%1.%2 qpm, %2.%3 bpm)"
+
+#: ../src/gui/widgets/TimeWidget.cpp:470
+msgid "(%1.%2 bpm)"
+msgstr "(%1.%2 bpm)"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:239
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:60
+msgid "C"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:241
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:61
+msgid "D"
+msgstr "D"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:243
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:62
+msgid "E"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:244
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:63
+msgid "F"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:246
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:64
+msgid "G"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:248
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:65
+msgid "A"
+msgstr "A"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:250
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:66
+msgid "B"
+msgstr ""
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:70
+msgid "-2"
+msgstr "-2"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:71
+msgid "-1"
+msgstr "-1"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:72
+msgid "0"
+msgstr "0"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:73
+msgid "1"
+msgstr "1"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:74
+msgid "2"
+msgstr "2"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:75
+msgid "3"
+msgstr "3"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:76
+msgid "4"
+msgstr "4"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:77
+msgid "5"
+msgstr "5"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:78
+msgid "6"
+msgstr "6"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:79
+msgid "7"
+msgstr "7"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:83
+#, fuzzy
+msgid "double flat"
+msgstr "Двойной бемоль"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:84
+#, fuzzy
+msgid "flat"
+msgstr "Бемоль"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:85
+#, fuzzy
+msgid "natural"
+msgstr "Бекар"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:86
+#, fuzzy
+msgid "sharp"
+msgstr "Диез"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:87
+#, fuzzy
+msgid "double sharp"
+msgstr "Двойной диез"
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:234
+#, c-format
+msgid "In %1"
+msgstr "Вх %1"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:587
+#: ../src/gui/widgets/AudioRouteMenu.cpp:236
+#: ../src/gui/widgets/AudioRouteMenu.cpp:259
+msgid "Master"
+msgstr "Общий"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:528
+#: ../src/gui/widgets/AudioRouteMenu.cpp:238
+#: ../src/gui/widgets/AudioRouteMenu.cpp:261
+#, c-format
+msgid "Sub %1"
+msgstr "Суб %1"
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:244
+msgid "In %1 R"
+msgstr "Вх %1 П"
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:245
+msgid "In %1 L"
+msgstr "Вх %1 Л"
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:247
+msgid "Master R"
+msgstr "Общий П"
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:248
+msgid "Master L"
+msgstr "Общий Л"
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:250
+msgid "Sub %1 R"
+msgstr "Суб %1 П"
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:251
+msgid "Sub %1 L"
+msgstr "Суб %1 Л"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:391
+#: ../src/gui/studio/AudioMixerWindow.cpp:522
+#: ../src/gui/widgets/AudioFaderBox.cpp:82
+msgid "Audio plugin button"
+msgstr "Кнопка звукового модуля"
+
+#: ../src/gui/editors/parameters/AudioInstrumentParameterPanel.cpp:129
+#: ../src/gui/editors/parameters/AudioInstrumentParameterPanel.cpp:357
+#: ../src/gui/widgets/AudioFaderBox.cpp:91
+msgid "<no synth>"
+msgstr "<нет синтезатора>"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:93
+msgid "Synth plugin button"
+msgstr "Кнопка модуля синтезатора"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:153
+msgid "Set the audio pan position in the stereo field"
+msgstr "Установить панорамирование для звуковых файлов в стерео"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:155
+msgid "Open synth plugin's native editor"
+msgstr "Открыть \"родной\" редактор синт. модулей"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:157
+msgid "Mono or Stereo Instrument"
+msgstr "Моно- или стереофонический инструмент"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:159
+msgid "Record level"
+msgstr "Уровень записи"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:161
+msgid "Playback level"
+msgstr "Уровень воспроизведения"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:345
+#: ../src/gui/studio/AudioMixerWindow.cpp:347
+#: ../src/gui/studio/AudioMixerWindow.cpp:503
+#: ../src/gui/studio/AudioMixerWindow.cpp:505
+#: ../src/gui/widgets/AudioFaderBox.cpp:163
+msgid "Audio level"
+msgstr "Громкость звука"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:170
+msgid "In:"
+msgstr "Вх:"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:173
+msgid "Out:"
+msgstr "Вых:"
+
+#: ../src/gui/widgets/ProgressDialog.cpp:48
+#: ../src/gui/widgets/ProgressDialog.cpp:53
+#: ../src/gui/widgets/ProgressDialog.cpp:76
+msgid "Processing..."
+msgstr "Идёт обработка..."
+
+#: ../src/gui/configuration/ColourConfigurationPage.h:60
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:130
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:346
+#: ../src/gui/widgets/ColourTable.cpp:52
+msgid "Color"
+msgstr "Цвет"
+
+#: ../src/gui/widgets/ColourTable.cpp:68
+msgid "Modify Color Name"
+msgstr "Изменить имя цвета"
+
+#: ../src/gui/configuration/ColourConfigurationPage.cpp:129
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:983
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:882
+#: ../src/gui/widgets/ColourTable.cpp:68
+msgid "Enter new name"
+msgstr "Введите новое имя"
+
+#: ../src/gui/widgets/ColourTable.cpp:107
+msgid "Default Color"
+msgstr "Цвет по умолчанию"
+
+#: ../src/gui/widgets/Rotary.cpp:108
+msgid ""
+"Click and drag up and down or left and right to modify.\n"
+"Double click to edit value directly."
+msgstr ""
+"Для изменения щёлкните и перетащите вверх-вниз или вправо-влево.\n"
+"Двойным щелчком вызывается диалога для ввода значения напрямую."
+
+#: ../src/gui/widgets/Rotary.cpp:433
+msgid "Select a new value"
+msgstr "Выбрать новое значение"
+
+#: ../src/gui/widgets/Rotary.cpp:434
+msgid "Enter a new value"
+msgstr "Ввести новое значение"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:80
+msgid "Quantizer"
+msgstr "Квантователь"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:86
+msgid "Quantizer type:"
+msgstr "Тип квантователя:"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:88
+msgid "Grid quantizer"
+msgstr "Квантование по сетке"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:89
+msgid "Legato quantizer"
+msgstr "Квантование легато"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:90
+msgid "Heuristic notation quantizer"
+msgstr "Эвристический квантователь нотации"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:94
+msgid "Quantize for notation only (leave performance unchanged)"
+msgstr "Квантовать только нотацию (оставить исполнение без изменения)"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:104
+msgid "Notation parameters"
+msgstr "Параметры нотации"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:109
+#: ../src/gui/widgets/QuantizeParameters.cpp:150
+msgid "Base grid unit:"
+msgstr "Основная единица сетки:"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:114
+msgid "Complexity:"
+msgstr "Сложность:"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:118
+msgid "Very high"
+msgstr "Очень высокая"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:119
+msgid "High"
+msgstr "Высокая"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:224
+#: ../src/gui/widgets/QuantizeParameters.cpp:120
+msgid "Normal"
+msgstr "Нормальная"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:121
+msgid "Low"
+msgstr "Низкая"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:122
+msgid "Very low"
+msgstr "Очень низкая"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:125
+msgid "Tuplet level:"
+msgstr "Уровень группирования:"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:129
+msgid "2-in-the-time-of-3"
+msgstr "2 за время 3"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4241
+#: ../src/gui/widgets/QuantizeParameters.cpp:130
+msgid "Triplet"
+msgstr "Триоль"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:138
+msgid "Any"
+msgstr "Любой"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:141
+msgid "Permit counterpoint"
+msgstr "Разрешить контрапункт"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:145
+msgid "Grid parameters"
+msgstr "Параметры сетки"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:154
+msgid "Swing:"
+msgstr "Свинг:"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:159
+msgid "Iterative amount:"
+msgstr "Повторяющееся количество:"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:165
+msgid "Quantize durations as well as start times"
+msgstr "Квантовать длительности и времена начала"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:169
+msgid "After quantization"
+msgstr "После квантования"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:183
+msgid "Show advanced options"
+msgstr "Показать больше пераметров"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:192
+msgid "Re-beam"
+msgstr "Перегруппировать"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:194
+msgid "Add articulations (staccato, tenuto, slurs)"
+msgstr "Добавить артикуляцию (стаккато, тенуто и т.д.)"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:195
+msgid "Tie notes at barlines etc"
+msgstr "Слиговать ноты по тактовым чертам и пр."
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:196
+msgid "Split-and-tie overlapping chords"
+msgstr "Слиговать-разлиговать перекрывающиеся аккорды"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:307
+msgid "Full quantize"
+msgstr "Полное квантование"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:450
+msgid "Show Advanced Options"
+msgstr "Больше пераметров"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:454
+msgid "Hide Advanced Options"
+msgstr "Меньше пераметров"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:257
+#: ../src/gui/configuration/MatrixConfigurationPage.h:56
+#: ../src/gui/configuration/MatrixConfigurationPage.h:57
+#: ../src/gui/editors/matrix/MatrixView.cpp:2709
+msgid "Matrix"
+msgstr "Матричный редактор"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:64
+msgid "Printable headers"
+msgstr "Печатаемые верхние колонтитулы"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:92
+msgid "Dedication"
+msgstr "Посвящение"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:96
+#: ../src/gui/editors/segment/PlayListView.cpp:35
+msgid "Title"
+msgstr "Название"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:100
+msgid "Subtitle"
+msgstr "Подзаголовок"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:104
+msgid "Subsubtitle"
+msgstr "Подподзаголовок"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:108
+#, fuzzy
+msgid "Poet"
+msgstr "Presto"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:116
+msgid "Composer"
+msgstr "Композитор"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:120
+#, fuzzy
+msgid "Meter"
+msgstr "Общий"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:124
+msgid "Arranger"
+msgstr "Аранжировщик"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:128
+#, fuzzy
+msgid "Piece"
+msgstr "Высоты тона"
+
+#: ../data/fonts/mappings/fonts.cpp:26
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:132
+msgid "Opus"
+msgstr "Opus"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:136
+msgid "Copyright"
+msgstr "Авторские и смежные права"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:140
+#, fuzzy
+msgid "Tagline"
+msgstr "Треугольные"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:155
+#, fuzzy
+msgid "The composition comes here."
+msgstr "Смена длительности композиции"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:172
+msgid "Non-printable headers"
+msgstr "Непечатаемые верхние колонтитулы"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:213
+msgid "Add New Property"
+msgstr "Добавить новое свойство"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:217
+msgid "Delete Property"
+msgstr "Удалить свойство"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:236
+msgid "{new property %1}"
+msgstr "{новое свойство %1}"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:236
+msgid "{new property}"
+msgstr "{новое свойство}"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:243
+msgid "{undefined}"
+msgstr "{не определено}"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:87
+msgid "Double-click opens segment in"
+msgstr "По двойному щелчку сегмент открывается в"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:91
+msgid "Notation editor"
+msgstr "Редактор партитуры"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:92
+msgid "Matrix editor"
+msgstr "Матричный редактор"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:93
+msgid "Event List editor"
+msgstr "Редактор списка событий"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:99
+msgid "Number of count-in measures when recording"
+msgstr "Количество включённых тактов при записи"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:109
+msgid "Auto-save interval"
+msgstr "Интервал автосохранения"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:112
+msgid "Every 30 seconds"
+msgstr "Каждые 30 секунд"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:113
+msgid "Every minute"
+msgstr "Каждую минуту"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:114
+msgid "Every five minutes"
+msgstr "Каждые пять минут"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:115
+msgid "Every half an hour"
+msgstr "Каждый полчаса"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:116
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:277
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:157
+msgid "Never"
+msgstr "Никогда"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:140
+msgid "Use JACK transport"
+msgstr "Использовать транспорт JACK"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:173
+msgid "Unknown"
+msgstr "Неизвестно"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:179
+msgid "No MIDI, audio OK"
+msgstr "MIDI недоступен, звук доступен"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:182
+msgid "MIDI OK, no audio"
+msgstr "MIDI доступен, звук недоступен"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:185
+msgid "MIDI OK, audio OK"
+msgstr "MIDI доступен, звук доступен"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:188
+msgid "No driver"
+msgstr "Нет драйвера"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:195
+msgid "Details..."
+msgstr "Подробнее..."
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:204
+msgid "Behavior"
+msgstr "Поведение"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:219
+msgid "Side-bar parameter box layout"
+msgstr "Облик групп параметров в боковой панели"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:223
+msgid "Vertically stacked"
+msgstr "Вертикально, одна над другой"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:225
+msgid "Tabbed"
+msgstr "Распределены по вкладкам"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:233
+msgid "Note name style"
+msgstr "Стиль именования нот"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:237
+msgid "Always use US names (e.g. quarter, 8th)"
+msgstr "Всегда использовать амер. единицы измерения (8th, quarter и т.д.)"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:238
+msgid "Localized (where available)"
+msgstr "Локализовано (где доступно)"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:252
+msgid "Show textured background on"
+msgstr "Где использовать фон:"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:254
+msgid "Main window"
+msgstr "Основное окно"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:275
+msgid "Use bundled Klearlook theme"
+msgstr "Использовать встроенную тему Klearlook"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:278
+msgid "When not running under KDE"
+msgstr "При работе не в KDE"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:279
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:159
+msgid "Always"
+msgstr "Всегда"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:287
+msgid "Presentation"
+msgstr "Внешний вид"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:423
+msgid ""
+"Changes to the textured background in the main window will not take effect "
+"until you restart Rosegarden."
+msgstr ""
+"Изменения касательно фонового рисунку не возымеют эффекта до перезапуска "
+"Rosegarden."
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:168
+#: ../src/gui/configuration/GeneralConfigurationPage.h:78
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:207
+#: ../src/gui/configuration/MatrixConfigurationPage.cpp:59
+msgid "General"
+msgstr "Общее"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.h:79
+msgid "General Configuration"
+msgstr "Основные параметры"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:92
+msgid "Base octave number for MIDI pitch display"
+msgstr "Номер основной октавы для отображения высоты тона в MIDI"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:107
+msgid "Always use default studio when loading files"
+msgstr "Всегда использовать стандартную Студию при загрузке файлов"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:119
+msgid "Send all MIDI Controllers at start of each playback"
+msgstr "Пересылать все MIDI-контроллеры в начале воспроизведения"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:121
+msgid ""
+"Rosegarden can send all MIDI Controllers (Pan, Reverb etc) to all MIDI "
+"devices every\n"
+"time you hit play if you so wish. Please note that this option will usually "
+"incur a\n"
+"delay at the start of playback due to the amount of data being transmitted."
+msgstr ""
+"Rosegarden может пересылать устройствам все MIDI-контроллеры\n"
+"(Pan, Reverb и т.д.) при каждом нажатии кнопки \"Воспроизвести\", \n"
+"если вы того пожелаете. Учтите, что это повлечёт за собой задержку\n"
+"воспроизведения ввиду большого количества пересылаемых данных."
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:138
+#, fuzzy
+msgid "Sequencer timing source"
+msgstr "Таймер секвенсера"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:163
+msgid "Load SoundFont to SoundBlaster card at startup"
+msgstr "Загружать SoundFont в карту SoundBlaster при старте"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:164
+msgid ""
+"Check this box to enable soundfont loading on EMU10K-based cards when "
+"Rosegarden is launched"
+msgstr ""
+"Выставьте здесь флажок, чтобы разрешить загрузку SoundFont \n"
+"в звуковую карту на чипе EMU10K при старте Rosegarden"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:173
+msgid "Path to 'asfxload' or 'sfxload' command"
+msgstr "Путь к программам 'asfxload' или 'sfxload'"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:180
+msgid "SoundFont"
+msgstr "SoundFont"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:223
+msgid "MIDI Clock and System messages"
+msgstr "Сообщения MIDI Clock и System"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:229
+msgid "Send MIDI Clock, Start and Stop"
+msgstr "Посылать сообщения MIDI Clock, System и Stop"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:230
+msgid "Accept Start, Stop and Continue"
+msgstr "Принимать сообщения Start, Stop и Continue"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:241
+msgid "MIDI Machine Control mode"
+msgstr "Режим MIDI Machine Control"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:248
+msgid "MMC Master"
+msgstr "Ведущий MMC"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:249
+msgid "MMC Slave"
+msgstr "Ведомый MMC"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:260
+msgid "MIDI Time Code mode"
+msgstr "Режим MIDI Time Code"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:267
+msgid "MTC Master"
+msgstr "Ведущий MTC"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:268
+msgid "MTC Slave"
+msgstr "Ведомый MTC"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:281
+msgid "Automatically connect sync output to all devices in use"
+msgstr "Автоматически соединять выход со всеми используемыми устройствами"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:292
+#, fuzzy
+msgid "MIDI Sync"
+msgstr "MIDI"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:308
+msgid "sfxload path"
+msgstr "Путь к sfxload"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:315
+msgid "Soundfont path"
+msgstr "Путь к SoundFont"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:67
+msgid "%1 minutes %2.%3%4 seconds (%5 units, %6 measures)"
+msgstr "%1 минут %2.%3%4 секунд (%5 единиц, %6 тактов)"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:133
+msgid "Filename:"
+msgstr "Имя файла:"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:136
+msgid "Formal duration (to end marker):"
+msgstr "Формальная длительность (до маркера окончания):"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:141
+msgid "Playing duration:"
+msgstr "Длительность воспроизведения:"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:146
+msgid "Tracks:"
+msgstr "Дорожки:"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:147
+msgid "%1 used, %2 total"
+msgstr "%1 использовано, %2 всего"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:152
+msgid "Segments:"
+msgstr "Сегментов:"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:153
+msgid "%1 MIDI, %2 audio, %3 total"
+msgstr "%1 MIDI, %2 звуковых, %3 всего"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:161
+msgid "Statistics"
+msgstr "Статистика"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:170
+#: ../src/gui/editors/parameters/InstrumentParameterBox.cpp:155
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:92
+msgid "Track"
+msgstr "Дорожка"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:171
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:125
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:90
+msgid "Label"
+msgstr "Метка"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:172
+msgid "Time"
+msgstr "Время"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:174
+msgid "Events"
+msgstr "События"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:175
+msgid "Polyphony"
+msgstr "Полифония"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:176
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:126
+msgid "Repeat"
+msgstr "Повтор"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:178
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:128
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:305
+#: ../src/gui/general/EditView.cpp:1488
+msgid "Transpose"
+msgstr "Транспозиция"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:179
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:129
+msgid "Delay"
+msgstr "Задержка"
+
+#: ../src/gui/configuration/AudioConfigurationPage.h:61
+#: ../src/gui/configuration/AudioPropertiesPage.h:58
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:204
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:523
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:524
+msgid "Audio"
+msgstr "Звук"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:204
+#: ../src/gui/configuration/MIDIConfigurationPage.h:62
+msgid "MIDI"
+msgstr "MIDI"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:317
+msgid "Segment Summary"
+msgstr "О сегменте"
+
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:63
+msgid "Audio file path:"
+msgstr "Путь к звуковым файлам:"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:137
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:68
+msgid "Choose..."
+msgstr "Выберите..."
+
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:73
+msgid "Disk space remaining:"
+msgstr "Свободного пространства на диске:"
+
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:78
+msgid "Equivalent minutes of 16-bit stereo:"
+msgstr "Эквивалентное кол-во минут 16-битного стерео:"
+
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:90
+msgid "Modify audio path"
+msgstr "Изменить путь к звуковым файлам"
+
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:113
+msgid "%1 out of %2 (%3% used)"
+msgstr "%1 из %2 (использовано %3%)"
+
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:144
+msgid "minutes at"
+msgstr "минут в"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.h:63
+msgid "MIDI Settings"
+msgstr "Параметры MIDI"
+
+#: ../src/gui/configuration/AudioConfigurationPage.h:62
+#: ../src/gui/configuration/AudioPropertiesPage.h:59
+msgid "Audio Settings"
+msgstr "Параметры звука"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:87
+msgid "Default layout mode"
+msgstr "Стандартный режим облика"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:91
+msgid "Linear layout"
+msgstr "Линейное представление"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:92
+msgid "Continuous page layout"
+msgstr "Продолжительное страничное представление"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:93
+msgid "Multiple page layout"
+msgstr "Несколько страниц"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:101
+msgid "Default spacing"
+msgstr "Стандартный промежуток"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:125
+msgid "Default duration factor"
+msgstr "Коэффициент обычной длительности"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:141
+msgid "Full"
+msgstr "Полный"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:152
+msgid "Show track headers (linear layout only)"
+msgstr "Показывать заголовки дорожек (только в линейном режиме)"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:158
+msgid "When needed"
+msgstr "При необходимости"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:166
+msgid ""
+"\"Always\" and \"Never\" mean what they usually mean\n"
+"\"When needed\" means \"when staves are too many to all fit in the current "
+"window\""
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:178
+msgid "Show non-notation events as question marks"
+msgstr "Показывать ненотные события как символы \"?\""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:188
+msgid "Show notation-quantized notes in a different color"
+msgstr "Отображать квантованные в партитуре ноты другим цветом"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:198
+msgid "Show \"invisible\" events in grey"
+msgstr "Отображать «невидимые» события серым цветом"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:208
+msgid "Show notes outside suggested playable range in red"
+msgstr "Показывать красным ноты вне предложенного воспроизводимого диапазона"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:218
+msgid "Highlight superimposed notes with a halo effect"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:231
+msgid "When recording MIDI, split-and-tie long notes at barlines"
+msgstr "При записи MIDI разбивать длинные ноты и связывать их между тактами"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:242
+msgid "Layout"
+msgstr "Представление"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:255
+msgid "Default note style for new notes"
+msgstr "Стандартный нотный стиль для новых нот"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:287
+msgid "When inserting notes..."
+msgstr "При вставке нот..."
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:294
+msgid "Split notes into ties to make durations match"
+msgstr "Разделять ноты на лиги для совпадения длительностей"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:295
+msgid "Ignore existing durations"
+msgstr "Игнорировать существующие длительности"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:305
+msgid "Auto-beam on insert when appropriate"
+msgstr "Автогруппировка"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:317
+#: ../src/gui/editors/notation/NotationEraser.cpp:54
+msgid "Collapse rests after erase"
+msgstr "Объединить паузы после стирания"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:328
+msgid "Default paste type"
+msgstr "Тип вставки по умолчанию"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:350
+msgid "Editing"
+msgstr "Правка"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:362
+msgid "Accidentals in one octave..."
+msgstr "Знаки альтерации в одной октаве..."
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:364
+msgid "Affect only that octave"
+msgstr "Воздействовать только на ту октаву"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:365
+msgid "Require cautionaries in other octaves"
+msgstr "Требовать предупреждающие сбросы в других октавах"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:366
+msgid "Affect all subsequent octaves"
+msgstr "Воздействовать на все последующие октавы"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:374
+msgid "Accidentals in one bar..."
+msgstr "Знаки альтерации в одном такте..."
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:376
+msgid "Affect only that bar"
+msgstr "Воздействовать только на этот такт"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:377
+msgid "Require cautionary resets in following bar"
+msgstr "Требовать предупреждающие сбросы в следующем такте"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:378
+msgid "Require explicit resets in following bar"
+msgstr "Требовать явные сбросы в следующем такте"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:386
+msgid "Key signature cancellation style"
+msgstr "Стиль отмены тактового размера"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:388
+msgid "Cancel only when entering C major or A minor"
+msgstr "Отменять только при вводе До-мажор или Ля-минор"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:389
+msgid "Cancel whenever removing sharps or flats"
+msgstr "Отменять при любом удалении диезов и бемолей"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:390
+msgid "Cancel always"
+msgstr "Всегда отменять"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:400
+msgid "Accidentals"
+msgstr "Знаки альтерации"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:441
+msgid "Notation font"
+msgstr "Шрифт для нот"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:467
+msgid "Origin:"
+msgstr "Источник:"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:471
+msgid "Copyright:"
+msgstr "Авторское право:"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:475
+msgid "Mapped by:"
+msgstr "Автор разметки:"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:479
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:81
+msgid "Type:"
+msgstr "Тип:"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:508
+msgid "Font size for single-staff views"
+msgstr ""
+"Размер шрифта для\n"
+"одностанного просмотра"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:516
+msgid "Font size for multi-staff views"
+msgstr ""
+"Размер шрифта для\n"
+"многостанного просмотра"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:524
+msgid "Font size for printing (pt)"
+msgstr "Размер шрифта для печати (pt)"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:541
+msgid "Text font"
+msgstr "Шрифт текста"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:549
+msgid "Sans-serif font"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:664
+msgid "%1 (smooth)"
+msgstr "%1 (гладкий)"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:667
+msgid "%1 (jaggy)"
+msgstr "%1 (неровный)"
+
+#: ../src/gui/configuration/LatencyConfigurationPage.cpp:58
+msgid "JACK latency"
+msgstr "Латентность JACK"
+
+#: ../src/gui/configuration/LatencyConfigurationPage.cpp:61
+msgid ""
+"Use the \"Fetch JACK latencies\" button to discover the latency values set "
+"at\n"
+"the sequencer. It's recommended that you use the returned values but it's "
+"also\n"
+"possible to override them manually using the sliders. Note that if you "
+"change\n"
+"your JACK server parameters you should always fetch the latency values "
+"again.\n"
+"The latency values will be stored by Rosegarden for use next time."
+msgstr ""
+"Щёлкните по кнопке \"Узнать латентность JACK\" для получения \n"
+"данных об установленных для секвенсера значений задержки.\n"
+"Рекомендуется устанавливать латентность именно в очерченных системой "
+"границах, хотя вы можете использовать и свои значения.\n"
+"Помните, что если вы изменили параметры JACK-сервера, вам обязательно нужно "
+"снова запросить значения задержки.\n"
+"Установленные значения задержки сохраняются для последующих\n"
+"запусков программы."
+
+#: ../src/gui/configuration/LatencyConfigurationPage.cpp:65
+msgid "JACK playback latency (in ms)"
+msgstr "Задержка воспроизведения через JACK (в мс)"
+
+#: ../src/gui/configuration/LatencyConfigurationPage.cpp:66
+msgid "JACK record latency (in ms)"
+msgstr "Задержка записи через JACK (в мс)"
+
+#: ../src/gui/configuration/LatencyConfigurationPage.cpp:68
+msgid "Fetch JACK latencies"
+msgstr "Узнать задержку JACK"
+
+#: ../src/gui/configuration/LatencyConfigurationPage.cpp:121
+msgid "JACK Latency"
+msgstr "Задержка JACK"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:92
+msgid "Audio preview scale"
+msgstr "Масштаб просмотра волновой формы"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:96
+msgid "Linear - easier to see loud peaks"
+msgstr "Линейный — проще видеть пики громкости"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:97
+msgid "Meter scaling - easier to see quiet activity"
+msgstr "По индикатору — проще видеть тихие пассажи"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:105
+msgid "Record audio files as"
+msgstr "Записывать звуковые файлы как"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:107
+msgid "16-bit PCM WAV format (smaller files)"
+msgstr "16-bit PCM WAV (меньше размер)"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:108
+msgid "32-bit float WAV format (higher quality)"
+msgstr "32-bit float WAV (лучше качество)"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:117
+msgid "External audio editor"
+msgstr "Внешний редактор звука"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:145
+msgid "Create JACK outputs"
+msgstr "Создать выходы для JACK"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:150
+msgid "for individual audio instruments"
+msgstr "Для отдельных аудиоинструментов"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:157
+msgid "for submasters"
+msgstr "Для субмиксов"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:184
+msgid ""
+"Rosegarden can start the JACK audio daemon (jackd) for you automatically if "
+"it isn't already running when Rosegarden starts.\n"
+"\n"
+"This is recommended for beginners and those who use Rosegarden as their main "
+"audio application, but it might not be to the liking of advanced users.\n"
+"\n"
+"If you want to start JACK automatically, make sure the command includes a "
+"full path where necessary as well as any command-line arguments you want to "
+"use.\n"
+"\n"
+"For example: /usr/local/bin/jackd -d alsa -d hw -r44100 -p 2048 -n 2\n"
+"\n"
+msgstr ""
+"Rosegarden может проверять, запущен ли демон сервера JACK\n"
+"(jackd) и при необходимости запустить его для текущей сессии Rosegarden.\n"
+"\n"
+"Управление сервером JACK таким способом рекомендуется для \n"
+"начинающих пользователей, а также тех, что использует Rosegarden\n"
+"как основное JACK-приложение, но, вероятно, не для опытных пользователей.\n"
+"\n"
+"Если вы хотите автоматически запускать JACK, команда должна при \n"
+"необходимости включать полный путь к исполняемому файлу демона\n"
+"с необходимыми параметрами.\n"
+"\n"
+"Например: /usr/local/bin/jackd -d alsa -d hw -r44100 -p 2048 -n 2\n"
+"\n"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:196
+msgid "Start JACK when Rosegarden starts"
+msgstr "Запускать JACK при загрузке Rosegarden"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:201
+msgid "JACK command"
+msgstr "Команда JACK"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:214
+msgid "JACK Startup"
+msgstr "Запуск JACK"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:224
+msgid "External audio editor path"
+msgstr "Путь к внешнему редактору звука"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:262
+msgid "External audio editor \"%1\" not found or not executable"
+msgstr ""
+"Внешний звуковой редактор \"%1\" не найден или не является исполняемым файлом"
+
+#: ../src/gui/configuration/ColourConfigurationPage.cpp:70
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:448
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:863
+msgid "Add New Color"
+msgstr "Добавить новый цвет"
+
+#: ../src/gui/configuration/ColourConfigurationPage.cpp:74
+msgid "Delete Color"
+msgstr "Удалить цвет"
+
+#: ../src/gui/configuration/ColourConfigurationPage.cpp:93
+msgid "Color Map"
+msgstr "Карта цветов"
+
+#: ../src/gui/configuration/ColourConfigurationPage.cpp:128
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:983
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:882
+msgid "New Color Name"
+msgstr "Имя нового цвета"
+
+#: ../src/gui/configuration/ColourConfigurationPage.cpp:130
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:59
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:984
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:883
+#: ../src/gui/studio/DeviceManagerDialog.cpp:115
+#: ../src/gui/studio/DeviceManagerDialog.cpp:174
+msgid "New"
+msgstr "Новый"
+
+#: ../src/gui/configuration/LatencyConfigurationPage.h:62
+msgid "Latency"
+msgstr "Латентность"
+
+#: ../src/gui/configuration/LatencyConfigurationPage.h:63
+msgid "Sequencer Latency"
+msgstr "Латентность секвенсера"
+
+#: ../src/gui/configuration/ColourConfigurationPage.h:61
+msgid "Color Settings"
+msgstr "Параметры цветов"
+
+#: ../src/gui/studio/MidiDeviceListViewItem.cpp:55
+#: ../src/gui/studio/MidiKeyMapListViewItem.cpp:44
+msgid "Key Mapping"
+msgstr "Компоновка клавиатуры"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:97
+msgid "Manage MIDI Banks and Programs"
+msgstr "Настройки банков и программ"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:128
+msgid "MIDI Device"
+msgstr "MIDI-устройство"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:130
+#: ../src/gui/studio/BankEditorDialog.cpp:219
+msgid "MSB"
+msgstr "MSB"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:131
+#: ../src/gui/studio/BankEditorDialog.cpp:218
+msgid "LSB"
+msgstr "LSB"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:140
+msgid "Add Bank"
+msgstr "Добавить банк"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:141
+msgid "Add Key Mapping"
+msgstr "Добавить компоновку клавиатуры"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:153
+msgid "Add a Bank to the current device"
+msgstr "Добавить банк к текущему устройству"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:157
+msgid "Add a Percussion Key Mapping to the current device"
+msgstr "Добавить компоновку перкуссии к текущему устройству"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:161
+msgid "Delete the current Bank or Key Mapping"
+msgstr "Удалить текущий банк или компоновку"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:165
+msgid "Delete all Banks and Key Mappings from the current Device"
+msgstr "Удалить все банки и компоновки из текущего устройства"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:167
+#: ../src/gui/studio/DeviceManagerDialog.cpp:117
+msgid "Import..."
+msgstr "Импортировать"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:168
+#: ../src/gui/studio/DeviceManagerDialog.cpp:118
+msgid "Export..."
+msgstr "Экспортировать"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:176
+msgid ""
+"Import Bank and Program data from a Rosegarden file to the current Device"
+msgstr ""
+"Импортировать данные о банке и программах\n"
+"из файла Rosegarden в текущее устройство"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:179
+msgid ""
+"Export all Device and Bank information to a Rosegarden format interchange "
+"file"
+msgstr ""
+"Экспортировать данные о банке и программах\n"
+"в файл Rosegarden для обмена данными"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:190
+msgid "Copy all Program names from current Bank to clipboard"
+msgstr "Скопировать имена всех программ из текущего банка в буфер обмена"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:194
+msgid "Paste Program names from clipboard to current Bank"
+msgstr "Вставить имена программ из буфера обмена в текущий банк"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:216
+msgid "Show Variation list based on "
+msgstr "Показать список вариаций на основе "
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1010
+msgid "<new bank>"
+msgstr "<новый банк>"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1046
+msgid "<new mapping>"
+msgstr "<новая компоновка>"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1048
+msgid "<new mapping %1>"
+msgstr "<новая компоновка %1>"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1089
+msgid "Really delete this bank?"
+msgstr "Действительно удалить этот банк?"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1137
+msgid "Really delete this key mapping?"
+msgstr "Действительно удалить эту компоновку?"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1187
+msgid "Really delete all banks for "
+msgstr "Действительно удалить все банки для "
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1476
+msgid "Import Banks from Device in File"
+msgstr "Импортировать банки из устройства в файл"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1623
+#: ../src/gui/studio/DeviceManagerDialog.cpp:770
+msgid "Export Device as..."
+msgstr "Экспортировать устройство как..."
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1694
+msgid ""
+"There are unsaved changes.\n"
+"Do you want to apply the changes before exiting the Bank Editor or discard "
+"the changes ?"
+msgstr ""
+"Некоторые изменения не сохранены.\n"
+"Вы хотите учесть изменения перед выходом из редактора банков?"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1697
+msgid "Unsaved Changes"
+msgstr "Несохранённые изменения"
+
+#: ../src/gui/studio/NameSetEditor.cpp:68
+msgid "Librarian"
+msgstr "Библиотекарь"
+
+#: ../src/gui/studio/NameSetEditor.cpp:75
+msgid "Email"
+msgstr "Эл. адрес"
+
+#: ../src/gui/studio/NameSetEditor.cpp:80
+msgid ""
+"The librarian maintains the Rosegarden device data for this device.\n"
+"If you've made modifications to suit your own device, it might be worth\n"
+"liaising with the librarian in order to publish your information for the "
+"benefit\n"
+"of others."
+msgstr ""
+"Библиотекарь ответственен за основную информацию об этом устройстве.\n"
+"Если вы как-либо изменили данные целью их адаптации под используемое вами \n"
+"устройство, возможно, имеет смысл договориться с библиотекарем о "
+"публикации \n"
+"вашей версии."
+
+#: ../src/gui/studio/MidiBankListViewItem.cpp:51
+#: ../src/gui/studio/MidiDeviceListViewItem.cpp:48
+msgid "Percussion Bank"
+msgstr "Банк перкуссии"
+
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:84
+#: ../src/gui/studio/MidiBankListViewItem.cpp:51
+#: ../src/gui/studio/MidiDeviceListViewItem.cpp:48
+msgid "Bank"
+msgstr "Банк"
+
+#: ../src/gui/studio/ChangeRecordDeviceCommand.h:39
+msgid "Change Record Device"
+msgstr "Сменить устройство записи"
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:61
+#: ../src/gui/studio/DeviceManagerDialog.cpp:96
+msgid "Manage MIDI Devices"
+msgstr "Настройка MIDI-устройств"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:98
+msgid "Play devices"
+msgstr "Устройства воспроизведения"
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:76
+#: ../src/gui/studio/DeviceManagerDialog.cpp:106
+#: ../src/gui/studio/DeviceManagerDialog.cpp:165
+msgid "Connection"
+msgstr "Связь"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:119
+msgid "Banks..."
+msgstr "Банки..."
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:120
+msgid "Control Events..."
+msgstr "Контроллеры..."
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:126
+msgid "Create a new Play device"
+msgstr "Создать новое устройство воспр."
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:129
+#: ../src/gui/studio/DeviceManagerDialog.cpp:184
+msgid "Delete the selected device"
+msgstr "Удалить выбранное устройство"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:132
+msgid ""
+"Import Bank, Program and Controller data from a Rosegarden file to the "
+"selected device"
+msgstr ""
+"Импортировать данные о банке и контроллерах\n"
+"из файла Rosegarden в выбранное устройство"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:135
+msgid "Export Bank and Controller data to a Rosegarden interchange file"
+msgstr ""
+"Экспортировать данные о банке и контроллерах\n"
+"в файл Rosegarden для обмена данными"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:138
+msgid "View and edit Banks and Programs for the selected device"
+msgstr ""
+"Просмотреть и изменить банки и программы\n"
+"для выбранного устройства"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:141
+msgid ""
+"View and edit Control Events for the selected device - these are special "
+"Event types that you can define against your device and control through "
+"Control Rulers or the Instrument Parameter Box "
+msgstr ""
+"Просмотр и правка контроллеров для выбранного устройства. Контроллеры --- "
+"это события особого типа, позволяющие управлять устройством через панель "
+"параметров инструмента."
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:156
+msgid "Record devices"
+msgstr "Устройства записи"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:164
+msgid "Current"
+msgstr "Сейчас"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:181
+msgid "Create a new Record device"
+msgstr "Создать новое устройства зап."
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:360
+#: ../src/gui/studio/DeviceEditorDialog.cpp:378
+#: ../src/gui/studio/DeviceManagerDialog.cpp:486
+#: ../src/gui/studio/DeviceManagerDialog.cpp:501
+msgid "New Device"
+msgstr "Новое устройство"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:703
+msgid "Import from Device in File"
+msgstr "Импортировать из устройства в файл"
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:55
+msgid "Remap Instrument assigments..."
+msgstr "Перераспределить привязки инструментов..."
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:62
+msgid "Device or Instrument"
+msgstr "Устройство или инструмент"
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:65
+msgid "Remap Tracks by all Instruments on a Device or by single Instrument"
+msgstr ""
+"Перераспределить дорожки по всем инструментам\n"
+"в устройстве или по отдельному инструменту"
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:74
+msgid "Choose Source and Destination"
+msgstr "Укажите источник и место назначения"
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:77
+msgid "From"
+msgstr "Из"
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:78
+msgid "To"
+msgstr "В"
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:120
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:121
+msgid "<no devices>"
+msgstr "<нет устройств>"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:155
+msgid "Show Audio &Faders"
+msgstr "Показать &звуковые фейдеры"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:160
+msgid "Show Synth &Faders"
+msgstr "Показать фейдеры &синтезатора"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:165
+msgid "Show &Submasters"
+msgstr "Показать &субмастеры"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:170
+msgid "Show &Plugin Buttons"
+msgstr "Показать кнопки &модулей"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:175
+msgid "Show &Unassigned Faders"
+msgstr "Показать неназначенные фейдеры"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:184
+#, c-format
+msgid ""
+"_n: 1 Input\n"
+"%n Inputs"
+msgstr ""
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:194
+msgid "No Submasters"
+msgstr "Нет субмиксов"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:203
+#, fuzzy, c-format
+msgid ""
+"_n: 1 Submaster\n"
+"%n Submasters"
+msgstr "&Количество субмиксов"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:279
+msgid "Audio Mixer"
+msgstr "Звуковой микшер"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:311
+msgid "Record input source"
+msgstr "Источник записи"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:322
+msgid "Output destination"
+msgstr "Куда вывести"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:336
+#: ../src/gui/studio/AudioMixerWindow.cpp:495
+msgid "Pan"
+msgstr "Панорама"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:355
+msgid "Mono or stereo"
+msgstr "Моно или стерео"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:364
+#: ../src/gui/studio/AudioMixerWindow.cpp:513
+msgid "Mute"
+msgstr "Тихо"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:373 rc.cpp:408
+#, no-c-format
+msgid "Solo"
+msgstr "Соло"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:382
+msgid "Arm recording"
+msgstr "Автомат. (arm) запись"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:400
+#, c-format
+msgid "Audio %1"
+msgstr "Звук (аудио) %1"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:404
+#, c-format
+msgid "Synth %1"
+msgstr "Синтезатор %1"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:578
+#: ../src/gui/studio/AudioMixerWindow.cpp:580
+msgid "Audio master output level"
+msgstr "Уровень звукового мастер-выхода"
+
+#: ../src/gui/studio/SynthPluginManagerDialog.cpp:71
+msgid "Manage Synth Plugins"
+msgstr "Настроить синт. модули"
+
+#: ../src/gui/studio/SynthPluginManagerDialog.cpp:78
+msgid "Synth plugins"
+msgstr "Синт. модули"
+
+#: ../src/gui/studio/SynthPluginManagerDialog.cpp:145
+msgid "Controls"
+msgstr "Регуляторы"
+
+#: ../src/gui/studio/SynthPluginManagerDialog.cpp:152
+msgid "Editor >>"
+msgstr "Редактор >>"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:66
+#: ../src/gui/studio/MidiProgramsEditor.cpp:169
+msgid "Bank and Program details"
+msgstr "Подробнее о банке и программах"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:67
+msgid "Programs"
+msgstr "Программы"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2711
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:88
+#: ../src/gui/studio/MidiProgramsEditor.cpp:93
+msgid "Percussion"
+msgstr "Перкуссия"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:99
+msgid "MSB Value"
+msgstr "Значение MSB"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:107
+msgid ""
+"Selects a MSB controller Bank number (MSB/LSB pairs are always unique for "
+"any Device)"
+msgstr ""
+"Выберите номер банка для MSB-контроллера \n"
+"(MSB-/LSB-пары всегда уникальны для любого устройства)"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:111
+msgid ""
+"Selects a LSB controller Bank number (MSB/LSB pairs are always unique for "
+"any Device)"
+msgstr ""
+"Выберите номер банка для LSB-контроллера \n"
+"(MSB-/LSB-пары всегда уникальны для любого устройства)"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:116
+msgid "LSB Value"
+msgstr "Значение LSB"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:254
+#: ../src/gui/studio/MidiProgramsEditor.cpp:541
+#, c-format
+msgid "Key Mapping: %1"
+msgstr "Компоновка клавиатуры: %1"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:476
+msgid "<no key mapping>"
+msgstr "<без компоновки клавиатуры>"
+
+#: ../src/gui/studio/MidiKeyMappingEditor.cpp:57
+#: ../src/gui/studio/MidiKeyMappingEditor.cpp:81
+msgid "Key Mapping details"
+msgstr "Подробности о компоновке клавиатуры"
+
+#: ../src/gui/studio/MidiKeyMappingEditor.cpp:58
+msgid "Pitches"
+msgstr "Высоты тона"
+
+#: ../src/gui/studio/MidiMixerWindow.cpp:152
+msgid "MIDI Mixer"
+msgstr "MIDI-микшер"
+
+#: ../src/gui/studio/MidiMixerWindow.cpp:199
+msgid "Volume"
+msgstr "Громкость"
+
+#: ../src/gui/studio/AudioPluginOSCGUIManager.cpp:444
+msgid "Rosegarden Plugin"
+msgstr "Модуль Rosegarden"
+
+#: ../src/gui/studio/AudioPluginOSCGUIManager.cpp:447
+#, c-format
+msgid "Rosegarden: %1"
+msgstr "Rosegarden: %1"
+
+#: ../src/gui/studio/AudioPluginOSCGUIManager.cpp:449
+msgid "Rosegarden: %1: %2"
+msgstr "Rosegarden: %1: %2"
+
+#: ../src/gui/studio/AudioPluginOSCGUIManager.cpp:450
+#, c-format
+msgid "Plugin slot %1"
+msgstr "Слот модуля %1"
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:92
+msgid "Add Play Device"
+msgstr "Добавить устройство воспроизведения"
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:93
+msgid "Add Record Device"
+msgstr "Добавить устройство записи"
+
+#: ../src/commands/studio/CreateOrDeleteDeviceCommand.h:68
+#: ../src/gui/studio/DeviceEditorDialog.cpp:94
+msgid "Delete Device"
+msgstr "Удалить устройство"
+
+#: ../src/gui/editors/segment/PlayList.cpp:77
+#: ../src/gui/studio/DeviceEditorDialog.cpp:156
+#: ../src/gui/studio/DeviceEditorDialog.cpp:361
+msgid "Play"
+msgstr "Воспроизвести"
+
+#: ../src/commands/segment/SegmentRecordCommand.cpp:37
+#: ../src/gui/studio/DeviceEditorDialog.cpp:156
+#: ../src/gui/studio/DeviceEditorDialog.cpp:379 rc.cpp:394
+#, no-c-format
+msgid "Record"
+msgstr "Записать"
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:256
+msgid "Apply pending changes?"
+msgstr "Применить ждущие очереди изменения?"
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:359
+#: ../src/gui/studio/DeviceEditorDialog.cpp:377
+msgid "<new device>"
+msgstr "<новое устройство>"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentEraser.cpp:82
+msgid "Click on a segment to delete it"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSplitter.cpp:166
+msgid ""
+"Click on a segment to split it in two; hold Shift to avoid snapping to beat "
+"grid"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSplitter.cpp:168
+msgid "Click on a segment to split it in two"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:81
+msgid "Click and drag to select segments"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentMover.cpp:154
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:238
+msgid "Move Segment"
+msgstr "Переместить сегмент"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentMover.cpp:154
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:239
+msgid "Move Segments"
+msgstr "Переместить сегменты"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:217
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:169
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:141
+#: ../src/gui/editors/segment/segmentcanvas/SegmentMover.cpp:210
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:255
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:359
+msgid "Hold Shift to avoid snapping to beat grid"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:485
+msgid ""
+"Click and drag to select segments; middle-click and drag to draw an empty "
+"segment"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:384
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:502
+msgid ""
+"Click and drag to resize a segment; hold Ctrl as well to rescale its contents"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:386
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:504
+msgid "Click and drag to rescale segment"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:509
+msgid "Click and drag to move segments; hold Ctrl as well to copy them"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:511
+msgid "Click and drag to copy segments"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:515
+msgid ""
+"Click and drag to move segment; hold Ctrl as well to copy it; double-click "
+"to edit"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:517
+msgid "Click and drag to copy segment"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:157
+#, fuzzy
+msgid ""
+"The audio file path does not exist or is not writable.\n"
+"You must set the audio file path to a valid directory in Document Properties "
+"before rescaling an audio file.\n"
+"Would you like to set it now?"
+msgstr ""
+"Каталог со звуковыми файлами не существует или закрыт для записи.\n"
+" Укажите правильный каталог в свойствах документа перед началом записи.\n"
+"Хотите сделать это прямо сейчас?"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:261
+msgid ""
+"Hold Shift to avoid snapping to beat grid; hold Ctrl as well to rescale "
+"contents"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentMover.cpp:325
+msgid "Click and drag to move a segment"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentPencil.cpp:225
+msgid "Hold Shift to avoid snapping to bar lines"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentPencil.cpp:283
+#, fuzzy
+msgid "Record or drop audio here"
+msgstr "Записать либо MIDI, либо звук"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentPencil.cpp:289
+#, fuzzy
+msgid ""
+"Click and drag to draw an empty segment. Control+Alt click and drag to draw "
+"in overlap mode."
+msgstr ""
+"Щелкните и перетащите курсор мыши выбора; щелкните средней клавише мыши и "
+"перетащите курсор для рисования новой ноты"
+
+#: ../src/gui/editors/segment/TrackLabel.cpp:77
+msgid ""
+"Click and hold with left mouse button to assign this Track to an Instrument."
+msgstr ""
+"Щёлкните левой кнопкой мыши и назначьте \n"
+"инструмент для дорожки через появившееся меню."
+
+#: ../src/gui/editors/segment/TrackLabel.cpp:191
+msgid "Change track name"
+msgstr "Сменить имени дорожки"
+
+#: ../src/gui/editors/segment/TrackLabel.cpp:192
+msgid "Enter new track name"
+msgstr "Введите новое имя дорожки"
+
+#: ../src/gui/editors/segment/TrackEditor.cpp:648
+msgid "Turn Repeating Segment into Real Copies"
+msgstr "Превратить повторение сегмента в его настоящие копии"
+
+#: ../src/gui/editors/segment/TrackEditor.cpp:650
+msgid "Turn Repeating Segments into Real Copies"
+msgstr "Превратить повторение сегментов в их настоящие копии"
+
+#: ../src/gui/editors/segment/TrackEditor.cpp:814
+msgid ""
+"You can't drop files into Rosegarden from this client. Try using Konqueror "
+"instead."
+msgstr ""
+"Перетаскивание файлов в Rosegarden из этого клиента невозможно. Попробуйте "
+"использовать Konqueror."
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:85
+msgid "Manage Triggered Segments"
+msgstr "Настройка переключаемых сегментов"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:89
+msgid "ID"
+msgstr "ID"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:735
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:93
+msgid "Base velocity"
+msgstr "Базовая сила нажатия"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:94
+msgid "Triggers"
+msgstr "Переключатели"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:115
+msgid "Add a Triggered Segment"
+msgstr "Добавить переключаемый сегмент"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:119
+msgid "Delete a Triggered Segment"
+msgstr "Удалить переключаемый сегмент"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:123
+msgid "Delete All Triggered Segments"
+msgstr "Удалить все переключаемые сегменты"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:127
+msgid "Close the Triggered Segment Manager"
+msgstr "Закрыть окно настройки переключаемых сегментов"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:169
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:245
+msgid "<no label>"
+msgstr "<без метки>"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:248
+msgid ""
+"_n: %1 on 1 track\n"
+"%1 on %n tracks"
+msgstr ""
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:284
+msgid ""
+"This will remove all triggered segments from the whole composition. Are you "
+"sure?"
+msgstr "Все переключаемые сегменты будут удалены из композиции. Вы уверены?"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:288
+msgid "Remove all triggered segments"
+msgstr "Удалить все переключаемые сегменты"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:313
+msgid "Trigger Segment Duration"
+msgstr "Длительность переключаемого сегмента"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:336
+#, fuzzy, c-format
+msgid ""
+"_n: This triggered segment is used 1 time in the current composition. Are "
+"you sure you want to remove it?\n"
+"This triggered segment is used %n times in the current composition. Are you "
+"sure you want to remove it?"
+msgstr ""
+"Этот переключаемый сегмент используется в текущей композиции 1 раз. Вы "
+"действительно хотите его удалить?"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:400
+msgid "Pa&ste as New Triggered Segment"
+msgstr "Вставить как &новый переключаемый сегмент"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1169
+#: ../src/gui/editors/segment/MarkerEditor.cpp:399
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:412
+#: ../src/gui/editors/tempo/TempoView.cpp:622
+msgid "&Musical Times"
+msgstr "&Музыкальное время"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1179
+#: ../src/gui/editors/segment/MarkerEditor.cpp:409
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:422
+#: ../src/gui/editors/tempo/TempoView.cpp:632
+msgid "&Real Times"
+msgstr "&Реальное время"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1189
+#: ../src/gui/editors/segment/MarkerEditor.cpp:419
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:432
+#: ../src/gui/editors/tempo/TempoView.cpp:642
+msgid "Ra&w Times"
+msgstr "&Реальное время"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:83
+msgid "Manage Markers"
+msgstr "Настроить маркеры"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:86
+msgid "Marker time "
+msgstr "Время маркера "
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:87
+#, fuzzy
+msgid "Marker text "
+msgstr "Время маркера "
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:88
+msgid "Marker description "
+msgstr "Описание маркера "
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:95
+msgid "Pointer position"
+msgstr "Позиция указателя"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:100
+msgid "Real time:"
+msgstr "Реальное время:"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:103
+msgid "In measure:"
+msgstr "В такте:"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:121
+msgid "Add a Marker"
+msgstr "Добавить маркер"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:125
+msgid "Delete a Marker"
+msgstr "Удалить маркер"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:129
+msgid "Delete All Markers"
+msgstr "Удалить все маркеры"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:133
+msgid "Close the Marker Editor"
+msgstr "Закрыть редактор маркеров"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:296
+msgid "Remove all markers"
+msgstr "Удалить все маркеры"
+
+#: ../src/gui/editors/segment/PlayList.cpp:76
+msgid "Add..."
+msgstr "Доб..."
+
+#: ../src/gui/editors/segment/PlayList.cpp:78
+msgid "Move Up"
+msgstr "Выше"
+
+#: ../src/gui/editors/segment/PlayList.cpp:79
+msgid "Move Down"
+msgstr "Ниже"
+
+#: ../src/gui/editors/segment/PlayList.cpp:124
+msgid "Select one or more Rosegarden files"
+msgstr "Выберите один или несколько файлов Rosegarden"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:73
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:55
+msgid "<not showing>"
+msgstr "<не отображается>"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:89
+msgid "Manage Control Events"
+msgstr "Настроить управление событиями"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:91
+msgid "<no device>"
+msgstr "<нет устройства>"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:99
+msgid " Control Events for %1 (device %2)"
+msgstr " Параметры контроллера для %1 (устройство %2)"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:104
+msgid "Control Event name "
+msgstr "Имя контроллера"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:105
+msgid "Control Event type "
+msgstr "Тип контроллера"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:106
+msgid "Control Event value "
+msgstr "Значение контроллера"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:107
+msgid "Description "
+msgstr "Описание "
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:108
+msgid "Min "
+msgstr "Мин "
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:109
+msgid "Max "
+msgstr "Макс "
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:110
+msgid "Default "
+msgstr "По умолчанию "
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:111
+msgid "Color "
+msgstr "Цвет "
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:112
+msgid "Position on instrument panel"
+msgstr "Позиция на инструментальной панели"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:136
+msgid "Add a Control Parameter to the Studio"
+msgstr "Добавить параметр контроллера в Студию"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:140
+msgid "Delete a Control Parameter from the Studio"
+msgstr "Удалить параметр контроллера из Студии"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:144
+msgid "Close the Control Parameter editor"
+msgstr "Закрыть редактор параметров контроллера"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:221
+msgid "<default>"
+msgstr "<по умолчанию>"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:62
+msgid "Edit Control Parameter"
+msgstr "Изменить параметр контроллера"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:71
+msgid "Control Event Properties"
+msgstr "Свойства контроллера"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:77
+msgid "Name:"
+msgstr "Имя:"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:93
+msgid "Control Event value:"
+msgstr "Значение контроллера:"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:97
+msgid "Minimum value:"
+msgstr "Миним. значение:"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:101
+msgid "Maximum value:"
+msgstr "Максим. значение:"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:105
+msgid "Default value:"
+msgstr "Стандартное значение:"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:109
+msgid "Color:"
+msgstr "Цвет:"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:113
+msgid "Instrument Parameter Box position:"
+msgstr "Положение панели параметров инструмента:"
+
+#: ../src/gui/editors/segment/TrackButtons.cpp:209
+#: ../src/gui/editors/segment/TrackButtons.cpp:585
+#: ../src/gui/editors/segment/TrackButtons.cpp:935
+#: ../src/gui/editors/segment/TrackButtons.cpp:1127
+msgid "<no instrument>"
+msgstr "<нет инструмента>"
+
+#: ../src/gui/editors/segment/TrackButtons.cpp:352
+#: ../src/gui/editors/segment/TrackButtons.cpp:1094
+msgid "<untitled audio>"
+msgstr "<звук без имени>"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:130
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:662
+#: ../src/gui/editors/segment/TrackButtons.cpp:354
+#: ../src/gui/editors/segment/TrackButtons.cpp:1096
+msgid "<untitled>"
+msgstr "<без имени>"
+
+#: ../src/gui/editors/segment/TrackButtons.cpp:1058
+msgid "Mute track"
+msgstr "Приглушить дорожку"
+
+#: ../src/gui/editors/segment/TrackButtons.cpp:1063
+msgid "Record on this track"
+msgstr "Записать в эту дорожку"
+
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:88
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:1015
+msgid "Segment"
+msgstr "Сегмент"
+
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:89
+msgid "Segment Parameters"
+msgstr "Параметры сегмента"
+
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:366
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:697
+msgid "%1 ms"
+msgstr "%1 мс"
+
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:1031
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:910
+msgid "Highest playable note"
+msgstr "Самая высокая играемая нота"
+
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:1051
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:930
+msgid "Lowest playable note"
+msgstr "Самая низкая играемая нота"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:93
+msgid "Track Parameters"
+msgstr "Параметры дорожки"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:137
+msgid "Playback parameters"
+msgstr "Параметры воспроизведения"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:172
+msgid "Recording filters"
+msgstr "Фильтры записи"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:191
+msgid "Channel"
+msgstr "Канал"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:203
+#, fuzzy
+msgid "Staff export options"
+msgstr "Параметры нотоносца"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:220
+#, fuzzy
+msgid "Notation size:"
+msgstr "Время партитуры:"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:225
+#, fuzzy
+msgid "Small"
+msgstr "Все"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:226
+msgid "Tiny"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:233
+#, fuzzy
+msgid "Bracket type:"
+msgstr "Тип текста:"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:237
+msgid "-----"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:238
+msgid "[----"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:239
+msgid "----]"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:240
+msgid "[---]"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:241
+msgid "{----"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:242
+msgid "----}"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:243
+msgid "{[---"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:244
+msgid "---]}"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:253
+#, fuzzy
+msgid "Create segments with"
+msgstr "С чем создать сегмент:"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:264
+msgid "Preset"
+msgstr "Предустановка"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:272
+msgid "Load"
+msgstr "Загрузить"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:282
+msgid "treble"
+msgstr "скрипичный"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:283
+msgid "bass"
+msgstr "басовый"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:284
+msgid "crotales"
+msgstr "помпейская тарелка"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:285
+msgid "xylophone"
+msgstr "ксилофон"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:286
+msgid "guitar"
+msgstr "гитара"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:287
+msgid "contrabass"
+msgstr "контрабас"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:288
+msgid "celesta"
+msgstr "челеста"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:289
+msgid "old celesta"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:290
+msgid "french"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:291
+msgid "soprano"
+msgstr "сопрано"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:292
+#, fuzzy
+msgid "mezzosoprano"
+msgstr "сопрано"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:293
+msgid "alto"
+msgstr "альт"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:294
+msgid "tenor"
+msgstr "тенор"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:295
+#, fuzzy
+msgid "baritone"
+msgstr "Вариация"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:296
+#, fuzzy
+msgid "varbaritone"
+msgstr "Вариация"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:297
+#, fuzzy
+msgid "subbass"
+msgstr "басовый"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:327
+#, fuzzy
+msgid "Lowest"
+msgstr "Низкая"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:329
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:336
+msgid "---"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:331
+msgid "Choose the lowest suggested playable note, using a staff"
+msgstr "Выбрать самую нижнюю воспроизводимую ноту, используя нотный стан"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:334
+#, fuzzy
+msgid "Highest"
+msgstr "Высокая"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:338
+msgid "Choose the highest suggested playable note, using a staff"
+msgstr "Выбрать самую высокую воспроизводимую ноту, используя нотный стан"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:666
+msgid "[ Track %1 - %2 ]"
+msgstr "[ Дорожка %1 - %2 ]"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:985
+msgid "The instrument preset database is corrupt. Check your installation."
+msgstr ""
+"База данных предустановок инструментов испорчена. Проверьте корректность "
+"установки."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:173
+#: ../src/gui/editors/parameters/InstrumentParameterBox.cpp:54
+msgid "Instrument Parameters"
+msgstr "Параметры инструмента"
+
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:85
+msgid "Variation"
+msgstr "Вариация"
+
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:86
+msgid "Program"
+msgstr "Программа"
+
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:87
+msgid "Channel out"
+msgstr "Канал выхода"
+
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:215
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:221
+msgid "[ %1 ]"
+msgstr "[ %1 ]"
+
+#: ../src/gui/editors/matrix/MatrixEraser.cpp:58
+#: ../src/gui/editors/matrix/MatrixMover.cpp:71
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:67
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:77
+msgid "Switch to Draw Tool"
+msgstr "Переключиться на инструмент «Карандаш»"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:75
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:69
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:71
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:81
+#: ../src/gui/editors/notation/ClefInserter.cpp:57
+#: ../src/gui/editors/notation/GuitarChordInserter.cpp:63
+#: ../src/gui/editors/notation/NotationSelector.cpp:87
+#: ../src/gui/editors/notation/NoteInserter.cpp:113
+#: ../src/gui/editors/notation/RestInserter.cpp:72
+#: ../src/gui/editors/notation/TextInserter.cpp:61
+msgid "Switch to Erase Tool"
+msgstr "Стирание"
+
+#: ../src/gui/editors/matrix/MatrixEraser.cpp:62
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:73
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:75
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:85
+msgid "Switch to Move Tool"
+msgstr "Переключиться на инструмент «Перемещение»"
+
+#: ../src/gui/editors/matrix/MatrixEraser.cpp:68
+#: ../src/gui/editors/matrix/MatrixMover.cpp:81
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:79
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:93
+msgid "Switch to Resize Tool"
+msgstr "Переключиться на инструмент «Смена размера»"
+
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:446
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:579
+msgid "Click and drag to select; middle-click and drag to draw new note"
+msgstr ""
+"Щелкните и перетащите курсор мыши выбора; щелкните средней клавише мыши и "
+"перетащите курсор для рисования новой ноты"
+
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:324
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:597
+msgid "Click and drag to resize selected notes"
+msgstr "Щелкните и перетащите курсор мыши для смены размера нот"
+
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:599
+msgid "Click and drag to resize note"
+msgstr "Щелкните и перетащите курсор мыши для смены размера ноты"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:471
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:604
+msgid "Click and drag to move selected notes; hold Ctrl as well to copy"
+msgstr ""
+"Щелкните и перетащите курсор мыши для перемещения выбранных нот; с Ctrl — "
+"для копирования нот"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:473
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:606
+msgid "Click and drag to copy selected notes"
+msgstr "Щелкните и перетащите курсор мыши для копирования нот"
+
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:610
+msgid "Click and drag to move note; hold Ctrl as well to copy"
+msgstr ""
+"Щелкните и перетащите курсор мыши для перемещения ноты; с Ctrl — для "
+"копирования ноты"
+
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:612
+msgid "Click and drag to copy note"
+msgstr "Щелкните и перетащите курсор мыши для копирования ноты"
+
+#: ../src/gui/editors/matrix/MatrixEraser.cpp:54
+#: ../src/gui/editors/matrix/MatrixMover.cpp:67
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:65
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:63
+#: ../src/gui/editors/notation/ClefInserter.cpp:53
+#: ../src/gui/editors/notation/GuitarChordInserter.cpp:59
+#: ../src/gui/editors/notation/NotationEraser.cpp:67
+#: ../src/gui/editors/notation/NoteInserter.cpp:109
+#: ../src/gui/editors/notation/RestInserter.cpp:68
+#: ../src/gui/editors/notation/TextInserter.cpp:57
+msgid "Switch to Select Tool"
+msgstr "Выделение"
+
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:218
+msgid "Resize Event"
+msgstr "Изменить размер события"
+
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:221
+msgid "Resize Events"
+msgstr "Изменить размер событий"
+
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:326
+msgid "Click and drag to resize a note"
+msgstr "Щелкните и перетащите курсор мыши для смены размера ноты"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:328
+msgid "Copy and Move Event"
+msgstr "Скопировать и переместить событие"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:330
+msgid "Copy and Move Events"
+msgstr "Скопировать и переместить события"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:334
+msgid "Move Event"
+msgstr "Переместить событие"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:336
+msgid "Move Events"
+msgstr "Переместить события"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:465
+msgid "Click and drag to move a note; hold Ctrl as well to copy it"
+msgstr ""
+"Щелкните и перетащите курсор мыши для перемещения ноты; с Ctrl — для "
+"копирования ноты"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:467
+msgid "Click and drag to copy a note"
+msgstr "Щелкните и перетащите курсор мыши для копирования ноты"
+
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:361
+msgid "Click and drag to draw a note; Shift to avoid snapping to grid"
+msgstr ""
+"Щелкните и перетащите курсор мыши для рисования ноты; с Shift, чтобы не "
+"прилипать к сетке"
+
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:363
+msgid "Click and drag to draw a note"
+msgstr "Щелкните и перетащите курсор мыши для рисования ноты"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:437
+#: ../src/gui/editors/matrix/MatrixView.cpp:3053
+msgid "Couldn't apply piano roll layout"
+msgstr "Не удалось применить раскладку piano roll"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:663
+msgid "Resi&ze"
+msgstr "Из&менить размер"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:669
+#: ../src/gui/editors/notation/NotationView.cpp:1919
+msgid "C&hord Insert Mode"
+msgstr "&Режим ввода аккордов"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:676
+#: ../src/gui/editors/notation/NotationView.cpp:1778
+msgid "Ste&p Recording"
+msgstr "&Пошаговая запись"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:694
+msgid "&Legato"
+msgstr "&Легато"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:708
+#, fuzzy
+msgid "Set to Current Velocity"
+msgstr "Установить базовую силу нажатия"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:712
+msgid "Set Event &Velocities..."
+msgstr "&Установить скорости событий"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:716
+msgid "Trigger Se&gment..."
+msgstr "&Переключаемые сегменты..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:720
+msgid "Remove Triggers..."
+msgstr "Удалить переключатели..."
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1153
+#: ../src/gui/editors/matrix/MatrixView.cpp:724
+#: ../src/gui/editors/tempo/TempoView.cpp:606
+msgid "Select &All"
+msgstr "Выделить вс&ё"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:732
+#: ../src/gui/editors/notation/NotationView.cpp:2325
+msgid "Cursor &Back"
+msgstr "Переместить курсор &назад"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:736
+#: ../src/gui/editors/notation/NotationView.cpp:2329
+msgid "Cursor &Forward"
+msgstr "Переместить курсор &вперёд"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:740
+#: ../src/gui/editors/notation/NotationView.cpp:2333
+msgid "Cursor Ba&ck Bar"
+msgstr "Переместить курсор на один такт &назад"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:744
+#: ../src/gui/editors/notation/NotationView.cpp:2337
+msgid "Cursor For&ward Bar"
+msgstr "Переместить курсор на один такт &вперёд"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:748
+#: ../src/gui/editors/notation/NotationView.cpp:2341
+msgid "Cursor Back and Se&lect"
+msgstr "Переместить курсор &назад и выбрать ноту"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:752
+#: ../src/gui/editors/notation/NotationView.cpp:2345
+msgid "Cursor Forward and &Select"
+msgstr "Переместить курсор &вперёд и выбрать ноту"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:756
+#: ../src/gui/editors/notation/NotationView.cpp:2349
+msgid "Cursor Back Bar and Select"
+msgstr "Переместить курсор на один такт назад и выбрать ноту"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:760
+#: ../src/gui/editors/notation/NotationView.cpp:2353
+msgid "Cursor Forward Bar and Select"
+msgstr "Переместить курсор на один такт вперёд и выбрать ноту"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:764
+#: ../src/gui/editors/notation/NotationView.cpp:2363
+msgid "Cursor to St&art"
+msgstr "Курсор к &началу"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:770
+#: ../src/gui/editors/notation/NotationView.cpp:2369
+msgid "Cursor to &End"
+msgstr "Курсор к &концу"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:776
+#: ../src/gui/editors/notation/NotationView.cpp:2391
+msgid "Cursor to &Playback Pointer"
+msgstr "Курсор к указателю точки &воспроизведения"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:820
+#: ../src/gui/editors/notation/NotationView.cpp:2435
+msgid "Playback Pointer to &Cursor"
+msgstr "Указатель точки воспроизведения к &курсору"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:826
+#: ../src/gui/editors/notation/NotationView.cpp:2441
+msgid "&Solo"
+msgstr "&Соло"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:841
+#: ../src/gui/editors/notation/NotationView.cpp:2456
+msgid "Set Loop to Selection"
+msgstr "Зациклить выделение"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:845
+#: ../src/gui/editors/notation/NotationView.cpp:2460
+msgid "Clear L&oop"
+msgstr "Удалить п&етлю"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1157
+#: ../src/gui/editors/matrix/MatrixView.cpp:849
+#: ../src/gui/editors/notation/NotationView.cpp:2464
+#: ../src/gui/editors/tempo/TempoView.cpp:610
+msgid "Clear Selection"
+msgstr "Снять выделение"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1149
+#: ../src/gui/editors/matrix/MatrixView.cpp:854
+#: ../src/gui/editors/notation/NotationView.cpp:2471
+msgid "&Filter Selection"
+msgstr "&Фильтровать выделение"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:879
+msgid "&No Snap"
+msgstr "&Без привязки"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:884
+msgid "Snap to Bea&t"
+msgstr "Привязать к &такту"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:888
+msgid "Snap to &Bar"
+msgstr "Привязать к &такту"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:908
+#, c-format
+msgid "Snap to %1"
+msgstr "Прилипать к %1"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:917
+msgid "Show Instrument Parameters"
+msgstr "Показать параметры инструмента"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:922
+#: ../src/gui/editors/notation/NotationView.cpp:1850
+msgid "Show Ch&ord Name Ruler"
+msgstr "Показать линейку а&ккордов"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:926
+#: ../src/gui/editors/notation/NotationView.cpp:1858
+msgid "Show &Tempo Ruler"
+msgstr "Показать линейку &темпа"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1238
+#: ../src/gui/editors/notation/NotationView.cpp:3245
+#, c-format
+msgid ""
+"_n: 1 event selected \n"
+" %n events selected "
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1241
+#: ../src/gui/editors/notation/NotationView.cpp:3247
+msgid " No selection "
+msgstr " Нет выделения "
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1348
+#: ../src/gui/editors/matrix/MatrixView.cpp:1360
+#: ../src/gui/editors/matrix/MatrixView.cpp:2079
+#: ../src/gui/editors/notation/NotationView.cpp:5869
+msgid "Quantizing..."
+msgstr "Квантование..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1370
+#: ../src/gui/editors/notation/NotationView.cpp:5407
+msgid "Collapsing notes..."
+msgstr "Ноты сжимаются..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1381
+msgid "Making legato..."
+msgstr "Создаётся легато..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1476
+msgid "Note: %1 (%2.%3s)"
+msgstr "Нота: %1 (%2.%3s)"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1531
+#: ../src/gui/editors/notation/NotationView.cpp:7206
+msgid "Time: %1 (%2.%3s)"
+msgstr "Время: %1 (%2.%3s)"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1604
+#: ../src/gui/editors/notation/NotationView.cpp:4744
+#: ../src/gui/editors/notation/NotationView.cpp:4773
+msgid "Cutting selection to clipboard..."
+msgstr "Вырезать выделение в буфер обмена..."
+
+#: ../src/gui/editors/eventlist/EventView.cpp:912
+#: ../src/gui/editors/matrix/MatrixView.cpp:1636
+#: ../src/gui/editors/notation/NotationSelectionPaster.cpp:82
+msgid "Couldn't paste at this point"
+msgstr "Не удалось произвести вставку в этой точке"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1647
+#: ../src/gui/editors/notation/NotationView.cpp:4754
+msgid "Deleting selection..."
+msgstr "Удаляется выделение..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1833
+#: ../src/gui/editors/notation/NotationView.cpp:5617
+#, c-format
+msgid "Unknown note insert action %1"
+msgstr "Неизвестное действие %1 при вставке ноты"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1837
+#: ../src/gui/editors/matrix/MatrixView.cpp:2857
+#: ../src/gui/editors/notation/NotationView.cpp:5621
+msgid "Inserting note"
+msgstr "Вставляется нота"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2091
+msgid "Unquantizing..."
+msgstr "Расквантование..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2120
+msgid " Grid: "
+msgstr " Сетка: "
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2134
+msgid "Unit"
+msgstr "Единица"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2136
+msgid "Beat"
+msgstr "Доля"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2138
+msgid "Bar"
+msgstr "Такт"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2159
+msgid " Velocity: "
+msgstr "Сила нажатия:"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2170
+msgid " Quantize: "
+msgstr " Квантование: "
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2584
+msgid "Raising velocities..."
+msgstr "Повышение скоростей..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2596
+msgid "Lowering velocities..."
+msgstr "Понижение скоростей..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2611
+msgid "Set Event Velocities"
+msgstr "Установить скорости событий"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2616
+msgid "Setting Velocities..."
+msgstr "Устанавливаются скорости..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2665
+msgid "Remove Triggers"
+msgstr "Удалить переключатели"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2723
+msgid "%1 - Segment Track #%2 - %3"
+msgstr "%1 — Дорожка с сегментами №%2 — %3"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2730
+msgid "%1 - All Segments - %2"
+msgstr "%1 — Все сегменты — %2"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2737
+msgid ""
+"_n: %1 - 1 Segment - %2\n"
+"%1 - %n Segments - %2"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2885
+msgid "Can't insert note: No grid duration selected"
+msgstr "Невозможно вставить ноту: не выбрана длительность сетки"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2935
+msgid " Chord "
+msgstr " Аккорд"
+
+#: ../src/gui/editors/matrix/MatrixEraser.cpp:105
+msgid "Click on a note to delete it"
+msgstr "Щелкните ноту, чтобы удалить её"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:89
+msgid "Filter"
+msgstr "Фильтр"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:245
+#: ../src/gui/editors/tempo/TempoView.cpp:117
+msgid "Time "
+msgstr "Время "
+
+#: ../src/gui/editors/tempo/TempoView.cpp:118
+msgid "Type "
+msgstr "Тип"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:119
+msgid "Value "
+msgstr "Значение"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:120
+msgid "Properties "
+msgstr "Свойства"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:208
+msgid "Common, hidden"
+msgstr "Общий, скрытый"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:210
+msgid "Hidden"
+msgstr "Скрытый"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:213
+msgid "Common"
+msgstr "Общий"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:220
+msgid "Time Signature "
+msgstr "Размер "
+
+#: ../src/gui/editors/tempo/TempoView.cpp:245
+msgid "%1.%2%3"
+msgstr "%1.%2%3"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:255
+msgid "%1.%2%3 qpm (%4.%5%6 bpm) "
+msgstr "%1.%2%3 qpm (%4.%5%6 bpm) "
+
+#: ../src/gui/editors/tempo/TempoView.cpp:264
+msgid "Tempo "
+msgstr "Темп"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:271
+msgid "<nothing at this filter level>"
+msgstr "<на этом уровне фильтрации нет событий>"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:463
+msgid "Delete Tempo or Time Signature"
+msgstr "Удалить темп или размер"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:602
+msgid "&Edit Item"
+msgstr "&Изменить"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:834
+msgid "%1 - Tempo and Time Signature Editor"
+msgstr "%1 - Редактор темпа и размера"
+
+#: ../src/gui/editors/guitar/GuitarChordEditorDialog.cpp:43
+msgid "Guitar Chord Editor"
+msgstr "Редактор гитарных аккордов"
+
+#: ../src/gui/editors/guitar/GuitarChordEditorDialog.cpp:51
+#, fuzzy
+msgid "Start fret"
+msgstr "Первый такт"
+
+#: ../src/gui/editors/guitar/GuitarChordEditorDialog.cpp:58
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:51
+msgid "Root"
+msgstr ""
+
+#: ../src/gui/editors/guitar/GuitarChordEditorDialog.cpp:62
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:55
+msgid "Extension"
+msgstr "Расширение"
+
+#: ../src/gui/editors/guitar/Fingering.cpp:118
+msgid "couldn't parse fingering '%1' in '%2'"
+msgstr ""
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:45
+msgid "Guitar Chord Selector"
+msgstr "Выбор гитарного аккорда"
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:64
+msgid "beginner"
+msgstr ""
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:65
+#, fuzzy
+msgid "common"
+msgstr "Общий"
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:66
+#, fuzzy
+msgid "all"
+msgstr "Все"
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:86
+msgid "Fingerings"
+msgstr "Аппликатура"
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:419
+msgid "couldn't open file '%1'"
+msgstr "Не удалось открыть файл '%1'"
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:428
+#, c-format
+msgid "couldn't parse chord dictionnary : %1"
+msgstr ""
+
+#: ../src/gui/editors/notation/NoteFontViewer.cpp:87
+#, c-format
+msgid "Note Font Viewer: %1"
+msgstr "Просмотр нотного шрифта: %1"
+
+#: ../src/gui/editors/notation/NoteFontViewer.cpp:93
+msgid " Component: "
+msgstr " Компонент: "
+
+#: ../src/gui/editors/notation/NoteFontViewer.cpp:101
+msgid " View: "
+msgstr " Вид: "
+
+#: ../src/gui/editors/notation/NoteFontViewer.cpp:104
+msgid "Glyphs"
+msgstr "Знаки"
+
+#: ../src/gui/editors/notation/NoteFontViewer.cpp:105
+msgid "Codes"
+msgstr "Коды"
+
+#: ../src/gui/editors/notation/NoteFontViewer.cpp:107
+msgid " Page: "
+msgstr " Страница: "
+
+#: ../src/gui/editors/notation/ClefInserter.cpp:64
+#: ../src/gui/editors/notation/GuitarChordInserter.cpp:71
+#: ../src/gui/editors/notation/RestInserter.cpp:79
+#: ../src/gui/editors/notation/TextInserter.cpp:68
+msgid "Switch to Inserting Notes"
+msgstr "Вставка нот"
+
+#: ../src/gui/editors/notation/NotationView.cpp:522
+msgid "Close track headers"
+msgstr "Скрыть заголовки дорожек"
+
+#: ../src/gui/editors/notation/NotationView.cpp:917
+msgid "Preparing to print..."
+msgstr "Идёт подготовка к печати..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:1516
+msgid "Note &Font"
+msgstr "&Нотный шрифт"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1539
+msgid "Si&ze"
+msgstr "Раз&мер"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1545
+#, fuzzy
+msgid "Show Track Headers"
+msgstr "Показывать заголовки дорожек"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1550
+msgid "S&pacing"
+msgstr "&Интервал"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1572
+msgid "Du&ration Factor"
+msgstr "&Коэффициент длительности"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1598
+msgid "Note &Style"
+msgstr "Нотный &стиль"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1624
+msgid "Insert Rest"
+msgstr "Вставить паузу"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1628
+msgid "Switch from Note to Rest"
+msgstr "Переключиться в режим вставки пауз из нот"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1633
+msgid "Switch from Rest to Note"
+msgstr "Переключиться в режим вставки нот из пауз"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1690
+msgid "No accidental"
+msgstr "Нет знаков альтерации"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1691
+msgid "Follow previous accidental"
+msgstr "Следовать предыдущему знаку альтерации"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1692
+msgid "Sharp"
+msgstr "Диез"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1693
+msgid "Flat"
+msgstr "Бемоль"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1694
+msgid "Natural"
+msgstr "Бекар"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1695
+msgid "Double sharp"
+msgstr "Двойной диез"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1696
+msgid "Double flat"
+msgstr "Двойной бемоль"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1717
+msgid "&Treble Clef"
+msgstr "&Скрипичный ключ"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1724
+msgid "&Alto Clef"
+msgstr "&Альтовый ключ"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1731
+msgid "Te&nor Clef"
+msgstr "&Теноровый ключ"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1738
+msgid "&Bass Clef"
+msgstr "&Басовый ключ"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1745
+msgid "&Text"
+msgstr "&Текст"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1751
+msgid "&Guitar Chord"
+msgstr "&Гитарный аккорд"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1784
+msgid "Select from Sta&rt"
+msgstr "Выделить с &начала дорожки"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1788
+msgid "Select to &End"
+msgstr "Выделить до &конца дорожки"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1792
+msgid "Select Whole St&aff"
+msgstr "Выбрать вс&ё"
+
+#: ../src/commands/edit/CutAndCloseCommand.h:53
+#: ../src/gui/editors/notation/NotationView.cpp:1796
+msgid "C&ut and Close"
+msgstr "В&ырезать и закрыть"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1800
+msgid "Pa&ste..."
+msgstr "&Вставить...\tCtrl+v"
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:122
+#: ../src/gui/editors/notation/NotationView.cpp:1808
+msgid "Move to Staff Above"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:126
+#: ../src/gui/editors/notation/NotationView.cpp:1812
+msgid "Move to Staff Below"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1826
+msgid "&Linear Layout"
+msgstr "&Линейное представление\tCtrl+Shift+L"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1835
+msgid "&Continuous Page Layout"
+msgstr "&Продолжительное страничное представление\tCtrl+Shift+P"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1844
+msgid "&Multiple Page Layout"
+msgstr "&Многостраничное представление\tCtrl+Shift+P"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1854
+msgid "Show Ra&w Note Ruler"
+msgstr "Показать линейку &исполняемых нот"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1862
+msgid "Show &Annotations"
+msgstr "Показать &примечания"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1866
+msgid "Show Lily&Pond Directives"
+msgstr "Показывать д&ирективы Lilypond"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1870
+msgid "Open L&yric Editor"
+msgstr "&Открыть редактор лирики"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1912
+msgid "Trip&let Insert Mode"
+msgstr "Режим ввода &триолей"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1926
+#, fuzzy
+msgid "Grace Insert Mode"
+msgstr "Режим ввода &триолей"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2180
+msgid "&Dump selected events to stderr"
+msgstr "«С&брасывать» выделенные события в stderr"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2248
+msgid "Ma&ke Ornament..."
+msgstr "Со&здать украшение..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:2252
+msgid "Trigger &Ornament..."
+msgstr "&Украшение триггера..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:2256
+msgid "Remove Ornament..."
+msgstr "У&далить украшение..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:2261
+msgid "&None"
+msgstr "&Ничего"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2289
+#, fuzzy
+msgid "Convert Notation For..."
+msgstr "Экспортируется звуковой файл..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:2298
+msgid "Show &Notes Toolbar"
+msgstr "Показать панель «&Ноты»"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2299
+msgid "Show &Rests Toolbar"
+msgstr "Показать панель «&Паузы»"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2300
+msgid "Show &Accidentals Toolbar"
+msgstr "Показать панель «&Знаки альтерации»"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2301
+msgid "Show Cle&fs Toolbar"
+msgstr "Показать панель «&Ключи»"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2303
+msgid "Show &Marks Toolbar"
+msgstr "Показать панель «&Пометки»"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2305
+msgid "Show &Group Toolbar"
+msgstr "Показать панель «&Группировка»"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2307
+msgid "Show &Layout Toolbar"
+msgstr "Показать панель «&Облик»"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2311
+msgid "Show M&eta Toolbar"
+msgstr "Показать &метапанель"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2373
+msgid "Cursor &Up Staff"
+msgstr "Курсор &вверх по нотному стану"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2377
+msgid "Cursor &Down Staff"
+msgstr "Курсор в&низ по нотному стану"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2381
+msgid "Cursor Pre&vious Segment"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2385
+#, fuzzy
+msgid "Cursor Ne&xt Segment"
+msgstr "Создать сегмент"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2475
+msgid "Push &Left"
+msgstr "Сместить в&лево"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2479
+msgid "Push &Right"
+msgstr "Сместить в&право"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2483
+msgid "Push &Up"
+msgstr "Сместить ввер&х"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2487
+msgid "Push &Down"
+msgstr "Сместить &вниз"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2491
+msgid "&Restore Positions"
+msgstr "&Восстановить позиции"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2495
+msgid "Make &Invisible"
+msgstr "Сделать &невидимым"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2499
+msgid "Make &Visible"
+msgstr "Сделать &видимым"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2503
+msgid "Toggle Dot"
+msgstr "Переключить точку"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2507
+#: ../src/gui/editors/notation/NotationView.cpp:2511
+msgid "Add Dot"
+msgstr "Добавить точку"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2570
+#, c-format
+msgid ""
+"_n: 1 pixel\n"
+"%n pixels"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2619
+msgid " Font: "
+msgstr " Шрифт: "
+
+#: ../src/gui/editors/notation/NotationView.cpp:2647
+msgid "Unknown font \"%1\", using default"
+msgstr ""
+"Размер шрифта \"%1\" не подходит ; \n"
+"вместо него используется стандартный"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2655
+msgid " Size: "
+msgstr " Размер: "
+
+#: ../src/gui/editors/notation/NotationView.cpp:2677
+msgid " Spacing: "
+msgstr " Промежуток: "
+
+#: ../src/gui/editors/notation/NotationView.cpp:2993
+#: ../src/gui/editors/notation/NotationView.cpp:3818
+msgid " Ready."
+msgstr " Готово."
+
+#: ../src/gui/editors/notation/NotationView.cpp:2998
+msgid "Laying out score..."
+msgstr "Строится отображение партитуры..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:3011
+msgid "Laying out staff %1..."
+msgstr "Строится отображение нотного стана %1..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:3020
+msgid "Reconciling staffs..."
+msgstr "Пересогласовываются нотные станы ..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:3885
+msgid "Sizing and allocating canvas..."
+msgstr "Размещается и подстраивается канва..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:4050
+msgid "note"
+msgstr "нота"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4050
+msgid "rest"
+msgstr "пауза"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4211
+msgid "%1 - Segment Track #%2 - Notation"
+msgstr "%1 — Дорожка с сегмаентами №%2 — Партитура"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4217
+msgid "%1 - All Segments - Notation"
+msgstr "%1 — Все сегменты — Партитура"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4222
+#, fuzzy
+msgid ""
+"_n: %1 - Segment - Notation\n"
+"%1 - %n Segments - Notation"
+msgstr "%1 — Дорожка с сегмаентами №%2 — Партитура"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4243
+#, fuzzy
+msgid "Grace"
+msgstr "Grave"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4247
+#: ../src/gui/editors/notation/NotationView.cpp:4251
+#: ../src/gui/editors/notation/NotationView.cpp:4255
+#, fuzzy
+msgid "%1 %2"
+msgstr "%1: %2"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4271
+msgid "Hidden annotations"
+msgstr "Скрытые примечания"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4293
+msgid "Hidden LilyPond directives"
+msgstr "Скрытые директивы Lilypond"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4326
+#, c-format
+msgid "Unknown spacing action %1"
+msgstr "%1 - неизвестное действие с промежутком"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4384
+#, c-format
+msgid "Unknown proportion action %1"
+msgstr "%1 - неизвестное пропорциональное действие"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4431
+#, c-format
+msgid "Unknown font action %1"
+msgstr "%1 - неизвестное действие со шрифтом"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4449
+#, c-format
+msgid "Unknown font size %1"
+msgstr "%1 - неизвестный размер шрифта"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4453
+#, c-format
+msgid "Unknown font size action %1"
+msgstr "%1 - неизвестное действие с размером шрифта"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4780
+#, fuzzy
+msgid ""
+"The Restricted paste type requires enough empty space (containing only "
+"rests) at the paste position to hold all of the events to be pasted.\n"
+"Not enough space was found.\n"
+"If you want to paste anyway, consider using one of the other paste types "
+"from the \"Paste...\" option on the Edit menu. You can also change the "
+"default paste type to something other than Restricted if you wish."
+msgstr ""
+"Ограниченный способ вставки требует достаточного\n"
+"количества свободного дискового пространства\n"
+"для хранения всех вставляемых событий.\n"
+"В настоящий момент дискового постранства не хватает..\n"
+"Если вам всё равно необходимо вставить данные, \n"
+"используйте любой другой тип вставки\n"
+"из меню \"Правка\". Вы также можете сменить\n"
+"стандартный тип вставки с Ограниченной \n"
+"на какую-либо другую."
+
+#: ../src/gui/editors/notation/NotationView.cpp:4800
+msgid "Can't paste multiple Segments into one"
+msgstr "Невозможно осуществить вставку нескольких сегментов в один"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4828
+#: ../src/gui/editors/notation/NotationView.cpp:4877
+msgid "Couldn't paste at this point."
+msgstr "Невозможно осуществить вставку в этой точке."
+
+#: ../src/gui/editors/notation/NotationView.cpp:4896
+#, fuzzy
+msgid "Move Events to Staff Above"
+msgstr "С&местить события в другой сегмент"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4924
+#, fuzzy
+msgid "Move Events to Staff Below"
+msgstr "С&местить события в другой сегмент"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5036
+msgid "Pushing selection left..."
+msgstr "Выделение смещается влево..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5047
+msgid "Pushing selection right..."
+msgstr "Выделение смещается вправо..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5058
+msgid "Pushing selection up..."
+msgstr "Выделение смещается вверх..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5069
+msgid "Pushing selection down..."
+msgstr "Выделение смещается вниз..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5080
+msgid "Restoring computed positions..."
+msgstr "Восстанавливаются расчитанные позиции..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5089
+msgid "Making visible..."
+msgstr "Делается видимым..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5098
+msgid "Making invisible..."
+msgstr "Прячется..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5185
+msgid "Beaming group..."
+msgstr "Производится группировка..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5195
+msgid "Auto-beaming selection..."
+msgstr "Автогруппировка выделения..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5205
+msgid "Breaking groups..."
+msgstr "Разделение групп..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5293
+msgid "Untupleting..."
+msgstr "Разгруппирование..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5301
+msgid "Adding slur..."
+msgstr "Добавляется лига..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5302
+msgid "slur"
+msgstr "лига"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5307
+msgid "Adding phrasing slur..."
+msgstr "Добавляется фразовая лига..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5308
+msgid "phrasing slur"
+msgstr "фразовая лига"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5313
+msgid "Adding glissando..."
+msgstr "Добавляется глиссандо..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5314
+msgid "glissando"
+msgstr "глиссандо"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5319
+msgid "Adding crescendo..."
+msgstr "Добавляется крещендо..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5320
+#: ../src/gui/editors/notation/NotationView.cpp:5326
+msgid "dynamic"
+msgstr "динамический"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5325
+msgid "Adding decrescendo..."
+msgstr "Добавляется декрещендо..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5331
+#: ../src/gui/editors/notation/NotationView.cpp:5337
+#: ../src/gui/editors/notation/NotationView.cpp:5343
+#: ../src/gui/editors/notation/NotationView.cpp:5349
+msgid "Adding octave..."
+msgstr "Добавляется октава..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5332
+#: ../src/gui/editors/notation/NotationView.cpp:5338
+#: ../src/gui/editors/notation/NotationView.cpp:5344
+#: ../src/gui/editors/notation/NotationView.cpp:5350
+msgid "ottava"
+msgstr "октава"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5366
+msgid "Can't add overlapping %1 indications"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5375
+msgid "Making chord..."
+msgstr "Создаётся аккорд..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5387
+msgid "Normalizing rests..."
+msgstr "Паузы нормализуются..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5397
+msgid "Collapsing rests..."
+msgstr "Паузы сжимаются..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5417
+msgid "Tying notes..."
+msgstr "Лигатура создаётся..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5427
+msgid "Untying notes..."
+msgstr "Лигатура удаляется..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5437
+msgid "Making notes viable..."
+msgstr "Ноты \"оживляются\"..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5447
+msgid "Removing counterpoint..."
+msgstr "Контрапункт удаляется..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5457
+msgid "Pointing stems up..."
+msgstr "Штили направляются вверх..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5467
+msgid "Pointing stems down..."
+msgstr "Штили направляются вниз..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5478
+msgid "Restoring computed stem directions..."
+msgstr "Восстанавливается расчитанное направление штилей..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5488
+#: ../src/gui/editors/notation/NotationView.cpp:5498
+msgid "Positioning slurs..."
+msgstr "Расстанавливаются лиги..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5509
+msgid "Restoring slur positions..."
+msgstr "Восстанавливаются позиции лиг"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5519
+#: ../src/gui/editors/notation/NotationView.cpp:5529
+#, fuzzy
+msgid "Positioning ties..."
+msgstr "Расстанавливаются лиги..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5540
+#, fuzzy
+msgid "Restoring tie positions..."
+msgstr "Восстанавливаются расчитанные позиции..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5550
+msgid "Fixing notation quantization..."
+msgstr "Исправляющее партитуру квантование..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5560
+msgid "Removing notation quantization..."
+msgstr "Удаляется квантование партитуры..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5577
+msgid "Changing to %1 style..."
+msgstr "Происходит переход к стилю %1..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5585
+#, c-format
+msgid "Unknown style action %1"
+msgstr "Неизвестное действие стиля %1"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5598
+#: ../src/gui/editors/notation/NotationView.cpp:5639
+#: ../src/gui/editors/notation/NotationView.cpp:5695
+msgid "No note duration selected"
+msgstr "Длительность ноты не выбрана"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5660
+msgid "No rest duration selected"
+msgstr "Длительность паузы не выбрана"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5746
+msgid "No note or rest duration selected"
+msgstr "Не выбрана длительность ноты или паузы"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5757
+#: ../src/gui/editors/notation/NotationView.cpp:5768
+#: ../src/gui/editors/notation/NotationView.cpp:5779
+#: ../src/gui/editors/notation/NotationView.cpp:5790
+#: ../src/gui/editors/notation/NotationView.cpp:5801
+#: ../src/gui/editors/notation/NotationView.cpp:5812
+#: ../src/gui/editors/notation/NotationView.cpp:5823
+msgid "Forcing accidentals..."
+msgstr "Применяются случайные знаки альтерации..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5834
+msgid "Restoring accidentals..."
+msgstr "Восстанавливаются случайные знаки альтерации..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5845
+msgid "Showing cautionary accidentals..."
+msgstr "Предупредительные знаки альтерации показываются"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5855
+msgid "Cancelling cautionary accidentals..."
+msgstr "Предупредительные знаки альтерации отменяются"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5884
+msgid "Interpreting selection..."
+msgstr "Выделение интерпретируется..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5896
+msgid "Setting note durations..."
+msgstr "Устанавливаются длительности нот..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5904
+#: ../src/gui/editors/notation/NotationView.cpp:5912
+msgid "Adding dot..."
+msgstr "Добавляется точка..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5934
+msgid "Text: "
+msgstr "Текст: "
+
+#: ../src/gui/editors/notation/NotationView.cpp:5948
+msgid "Fingering: "
+msgstr "Аппликатура:"
+
+#: ../src/gui/editors/notation/NotationView.cpp:6036
+msgid "Ornament track %1 bar %2"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:6038
+#, c-format
+msgid "Ornament bar %1"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:6098
+msgid "Remove Ornaments"
+msgstr "Удалить украшения"
+
+#: ../src/gui/editors/notation/NotationView.cpp:6145
+msgid "Estimated key signature shown"
+msgstr "Рассчитанные ключевые знаки альтерации отображены вверху"
+
+#: ../src/gui/editors/notation/NotationStaff.cpp:1249
+#: ../src/gui/editors/notation/NotationView.cpp:6202
+msgid "Sustain"
+msgstr "Стабильная фаза"
+
+#: ../src/gui/editors/notation/NotationView.cpp:6218
+msgid ""
+"There is no sustain controller defined for this device.\n"
+"Please ensure the device is configured correctly in the Manage MIDI Devices "
+"dialog in the main window."
+msgstr ""
+"Для этого устройства не определён контроллер \n"
+"стабильной фазы сигнала. Убедитесь в том, что устройство правильно "
+"настроено, заглянув в диалог «Настройка MIDI-устройств»."
+
+#: ../src/gui/editors/notation/NotationView.cpp:7250
+msgid "Can't insert note: No note duration selected"
+msgstr "Невозможно вставить ноту: не выбрана длительность ноты"
+
+#: ../src/gui/editors/notation/NotationEraser.cpp:61
+#: ../src/gui/editors/notation/NotationSelector.cpp:83
+msgid "Switch to Insert Tool"
+msgstr "Вставка"
+
+#: ../src/gui/editors/notation/NotePixmapFactory.cpp:2303
+#: ../src/gui/editors/notation/NotePixmapFactory.cpp:2347
+msgid "..."
+msgstr "..."
+
+#: ../src/gui/editors/notation/NoteFontFactory.cpp:200
+msgid "Can't obtain a default font -- no fonts found"
+msgstr "Не удаётся получить стандартный шрифт -- шрифты не найдены"
+
+#: ../src/gui/editors/notation/NoteFontMap.cpp:52
+#: ../src/gui/general/PresetGroup.cpp:49
+msgid "unknown error"
+msgstr "неизвестная ошибка"
+
+#: ../src/gui/editors/notation/NoteFontMap.cpp:78
+msgid "Can't open font mapping file %1 or %2"
+msgstr "Не удаётся открыть файл шрифтовой карты '%1' или '%2'"
+
+#: ../src/gui/editors/notation/NoteFontMap.cpp:82
+#, c-format
+msgid "Can't open font mapping file %1"
+msgstr "Не удаётся открыть файл шрифтовой карты '%1'"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:52
+msgid "%1-dotted-%2"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:54
+msgid "%1-dotted %2"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:57
+#, c-format
+msgid "dotted-%1"
+msgstr "увеличенная-%1"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:59
+#, c-format
+msgid "dotted %1"
+msgstr "увеличенная %1"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:83
+msgid "sixty-fourth note"
+msgstr "64-ая нота"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:83
+msgid "thirty-second note"
+msgstr "32-ая нота"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:84
+msgid "sixteenth note"
+msgstr "16-ая нота"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:84
+msgid "eighth note"
+msgstr "8-ая нота"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:85
+msgid "quarter note"
+msgstr "4-ая нота"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:85
+msgid "half note"
+msgstr "половинная нота"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:86
+msgid "whole note"
+msgstr "целая нота"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:86
+msgid "double whole note"
+msgstr "двойная нота"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:89
+msgid "sixty-fourth notes"
+msgstr "64-ые ноты"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:89
+msgid "thirty-second notes"
+msgstr "32-ые ноты"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:90
+msgid "sixteenth notes"
+msgstr "16-ые ноты"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:90
+msgid "eighth notes"
+msgstr "восьмые ноты"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:91
+msgid "quarter notes"
+msgstr "четвёртые ноты"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:91
+msgid "half notes"
+msgstr "половинки"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:92
+msgid "whole notes"
+msgstr "целые ноты"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:92
+msgid "double whole notes"
+msgstr "двойные ноты"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:96
+#: ../src/gui/editors/notation/NotationStrings.cpp:154
+msgid "%1 triplets"
+msgstr "%1 триоли"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:100
+#: ../src/gui/editors/notation/NotationStrings.cpp:158
+msgid "%1 triplet"
+msgstr "%1 триоль"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:143
+msgid "64th"
+msgstr "64-ая"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:143
+msgid "32nd"
+msgstr "32-ая"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:143
+msgid "16th"
+msgstr "16-ая"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:143
+msgid "8th"
+msgstr "8-ая"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:144
+msgid "quarter"
+msgstr "четверть"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:144
+msgid "half"
+msgstr "половинка"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:144
+msgid "whole"
+msgstr "целая"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:145
+msgid "double whole"
+msgstr "двойная"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:148
+msgid "64ths"
+msgstr "64-ые"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:148
+msgid "32nds"
+msgstr "32-ые"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:148
+msgid "16ths"
+msgstr "16-ые"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:148
+msgid "8ths"
+msgstr "8-ые"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:149
+msgid "quarters"
+msgstr "четверти"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:149
+msgid "halves"
+msgstr "половинные"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:149
+msgid "wholes"
+msgstr "целые"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:150
+msgid "double wholes"
+msgstr "двойные"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:278
+msgid "%1 ticks"
+msgstr "%1 ударов"
+
+#: ../src/gui/editors/notation/FontViewFrame.cpp:100
+#, c-format
+msgid "Error: Unable to match font name %1"
+msgstr "Ошибка: невозможно найти соответствие шрифту \"%1\""
+
+#: ../src/gui/editors/notation/FontViewFrame.cpp:108
+msgid "Warning: No good match for font name %1 (best is %2)"
+msgstr ""
+"Предупреждение: невозможно найти точное соответствие шрифту \"%1\"\n"
+"(лучший вариант -- \"%2\")"
+
+#: ../src/gui/editors/notation/FontViewFrame.cpp:116
+#, c-format
+msgid "Error: Unable to open best-match font %1"
+msgstr "Ошибка: Невозможно открыть лучший вариант с именем \"%1\""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:113
+msgid "Track %1 : \"%2\""
+msgstr "Дорожка %1 : \"%2\""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:119
+#, fuzzy, c-format
+msgid ""
+"\n"
+"Notate for: %1"
+msgstr "Просмотр нотного шрифта: %1"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:121
+#, fuzzy
+msgid "normal"
+msgstr "Нормальная"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:124
+#, fuzzy
+msgid "small"
+msgstr "Все"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:127
+msgid "tiny"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:131
+msgid "--"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:156
+msgid ""
+"\n"
+"Size: %1, Bracket: %2 "
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:183
+msgid ""
+"\n"
+"bars [%1-%2] in %3 (tr=%4) : \"%5\""
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:190
+msgid ""
+"\n"
+"bars [%1-%2] (tr=%3) : \"%4\""
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:240
+msgid "C#"
+msgstr "C#"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:242
+msgid "Eb"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:245
+msgid "F#"
+msgstr "F#"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:247
+msgid "G#"
+msgstr "G#"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:249
+msgid "Bb"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:352
+msgid "%1: %2"
+msgstr "%1: %2"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:355
+#, fuzzy, c-format
+msgid " in %1"
+msgstr "Вх %1"
+
+#: ../src/gui/editors/notation/NotationStaff.cpp:452
+msgid "Rendering staff %1..."
+msgstr "Просчитывается отображение нот %1..."
+
+#: ../src/gui/editors/notation/NotationStaff.cpp:515
+msgid "Rendering notes on staff %1..."
+msgstr "Просчитывается отображение нот в нотном стане %1..."
+
+#: ../src/gui/editors/notation/NotationStaff.cpp:583
+msgid "Positioning staff %1..."
+msgstr "Просчитывается отображение нотного стана %1"
+
+#: ../src/gui/editors/notation/NotationSelectionPaster.cpp:85
+msgid "Ready."
+msgstr "Готово."
+
+#: ../src/gui/editors/notation/RestInserter.cpp:62
+msgid "Dotted rest"
+msgstr "Пауза с точкой"
+
+#: ../src/gui/editors/notation/NoteStyleFileReader.cpp:57
+#, c-format
+msgid "Can't open style file %1"
+msgstr "Не удаётся открыть стилевой файл %1"
+
+#: ../src/gui/editors/notation/NoteStyleFileReader.cpp:92
+msgid "type is a required attribute of note"
+msgstr "\"type\" является обязательным атрибутом \"note\""
+
+#: ../src/gui/editors/notation/NoteStyleFileReader.cpp:101
+#, c-format
+msgid "Unrecognised note name %1"
+msgstr "Имя ноты \"%1\" неизвестно"
+
+#: ../src/gui/editors/notation/NoteStyleFileReader.cpp:108
+msgid "global element must precede note elements"
+msgstr "элемент global должен предшестовать элементу note"
+
+#: ../src/gui/editors/notation/NoteStyleFileReader.cpp:137
+msgid ""
+"global and note elements may have shape or charname attribute, but not both"
+msgstr ""
+"Элементы global и note могут содержать атрибут shape или charname, но не оба "
+"сразу"
+
+#: ../src/gui/editors/notation/NotationVLayout.cpp:493
+msgid ""
+"Spanned note at %1 has no HEIGHT_ON_STAFF property!\n"
+"This is a bug (the program would previously have crashed by now)"
+msgstr ""
+"Перекрытая нота в такте %1 не имеет свойства HEIGHT_ON_STAFF!\n"
+"Эта ошибка, которая, по идее, должна привести к обрушиванию программы."
+
+#: ../src/gui/editors/notation/NoteInserter.cpp:82
+msgid "Auto-Beam when appropriate"
+msgstr "Автогруппировка"
+
+#: ../src/gui/editors/notation/NoteInserter.cpp:103
+msgid "Dotted note"
+msgstr "Нота с точкой"
+
+#: ../src/gui/editors/notation/NoteInserter.cpp:120
+msgid "Switch to Inserting Rests"
+msgstr "Вставка пауз"
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:98
+msgid "Collapse Rests"
+msgstr "Объединить паузы"
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:102
+msgid "Respell as Flat"
+msgstr "Перечитать как бемоль"
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:106
+msgid "Respell as Sharp"
+msgstr "Перечитать как диез"
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:110
+msgid "Respell as Natural"
+msgstr "Перечитать как бекар"
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:114
+msgid "Collapse Notes"
+msgstr "Объединить ноты"
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:130
+msgid "Make Invisible"
+msgstr "Сделать невидимым"
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:134
+msgid "Make Visible"
+msgstr "Сделать видимым"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:129
+msgid "Event filters"
+msgstr "Фильтры событий"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:138
+msgid "Rest"
+msgstr "Пауза"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:139
+msgid "Indication"
+msgstr "Индикация"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:141
+msgid "Other"
+msgstr "Другое"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:161
+msgid "Triggered Segment Properties"
+msgstr "Свойства переключаемого сегмента"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:166
+msgid "Label: "
+msgstr "Метка:"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:176
+msgid "Base pitch: "
+msgstr "Основная высота тона:"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:183
+msgid "Base velocity: "
+msgstr "Основная сила нажатия:"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:246
+msgid "Duration "
+msgstr "Длительность "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:247
+msgid "Event Type "
+msgstr "Тип события "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:248
+msgid "Pitch "
+msgstr "Поднятие "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:249
+msgid "Velocity "
+msgstr "Сила нажатия "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:250
+msgid "Type (Data1) "
+msgstr "Тип (Data1) "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:251
+msgid "Value (Data2) "
+msgstr "Значение (Data2) "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:461
+msgid "(group %1) "
+msgstr "(группа %1) "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:519
+msgid "<no events at this filter level>"
+msgstr "<на этом уровне фильтрации нет событий>"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:521
+msgid "<no events>"
+msgstr "<нет событий>"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:696
+msgid "Segment label"
+msgstr "Метка сегмента"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:696
+msgid "Label:"
+msgstr "Метка:"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1123
+msgid "&Insert Event"
+msgstr "&Вставить событие"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1130
+msgid "&Delete Event"
+msgstr "&Удалить событие"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1137
+msgid "&Edit Event"
+msgstr "&Изменить событие"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1144
+msgid "&Advanced Event Editor"
+msgstr "&Расширенный редактор событий"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1518
+msgid "Open in Event Editor"
+msgstr "Открыть в редакторе событий"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1519
+msgid "Open in Expert Event Editor"
+msgstr "Открыть в расширенном редакторе событий"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1577
+msgid "%1 - Triggered Segment: %2"
+msgstr "%1 - Переключаемый сегмент: %2"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1592
+msgid "%1 - Segment Track #%2 - Event List"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1598
+msgid "%1 - %2 Segments - Event List"
+msgstr "%1 - %2 сегментов - Список событий"
+
+#: ../src/gui/rulers/TempoRuler.cpp:131
+msgid "Insert Tempo Change at Playback Position"
+msgstr "Вставить смену темпа в точку воспроизведения"
+
+#: ../src/gui/rulers/TempoRuler.cpp:136
+msgid "Delete Tempo Change"
+msgstr "Удалить смену темпа"
+
+#: ../src/gui/rulers/TempoRuler.cpp:140
+msgid "Ramp Tempo to Next Tempo"
+msgstr "Плавно поменять темп на следующий"
+
+#: ../src/gui/rulers/TempoRuler.cpp:144
+msgid "Un-Ramp Tempo"
+msgstr "Выключить плавную смену темпа"
+
+#: ../src/gui/rulers/TempoRuler.cpp:149
+msgid "Edit Tempo..."
+msgstr "Изменить темп..."
+
+#: ../src/gui/rulers/TempoRuler.cpp:153
+msgid "Edit Time Signature..."
+msgstr "Изменить размер..."
+
+#: ../src/gui/rulers/TempoRuler.cpp:588
+msgid "%1.%2%3 (%4.%5%6 bpm)"
+msgstr "%1.%2%3 (%4.%5%6 bpm) "
+
+#: ../src/gui/rulers/TempoRuler.cpp:596
+msgid "%1.%2%3 bpm"
+msgstr "%1.%2%3 bpm"
+
+#: ../src/gui/rulers/TempoRuler.cpp:604
+msgid "%1 - %2.%3%4"
+msgstr "%1 - %2.%3%4"
+
+#: ../src/gui/rulers/ControlRulerEventInsertCommand.cpp:36
+msgid "Insert Controller Event"
+msgstr "Вставить событие контроллера"
+
+#: ../src/gui/rulers/ControlChangeCommand.cpp:35
+msgid "Control Change"
+msgstr "Смена контроллера"
+
+#: ../src/gui/rulers/PropertyViewRuler.cpp:72
+msgid "%1 controller"
+msgstr "%1 контроллер"
+
+#: ../src/gui/rulers/RawNoteRuler.cpp:453
+msgid "Track #%1, Segment \"%2\" (runtime id %3)"
+msgstr ""
+
+#: ../src/gui/rulers/MarkerRuler.cpp:100
+#, fuzzy
+msgid "Insert Marker"
+msgstr "Вставить паузу"
+
+#: ../src/gui/rulers/MarkerRuler.cpp:104
+#, fuzzy
+msgid "Insert Marker at Playback Position"
+msgstr "Вставить смену темпа в точку воспроизведения"
+
+#: ../src/gui/rulers/MarkerRuler.cpp:109
+#, fuzzy
+msgid "Delete Marker"
+msgstr "Удалить маркер"
+
+#: ../src/gui/rulers/MarkerRuler.cpp:114
+#, fuzzy
+msgid "Edit Marker..."
+msgstr "Изменить &маркеры..."
+
+#: ../src/gui/rulers/MarkerRuler.cpp:119
+msgid ""
+"Click on a marker to move the playback pointer.\n"
+"Shift-click to set a range between markers.\n"
+"Double-click to open the marker editor."
+msgstr ""
+
+#: ../src/gui/rulers/ChordNameRuler.cpp:97
+msgid ""
+"Chord name ruler.\n"
+"Turn it on and off from the Settings->Rulers menu."
+msgstr ""
+"Линейка имён аккордов.\n"
+"Она включается и отключается через меню \"Настройки -> Линейки\"."
+
+#: ../src/gui/rulers/ControlRulerEventEraseCommand.cpp:37
+msgid "Erase Controller Event(s)"
+msgstr "Удалить событие(я) контроллера"
+
+#: ../src/gui/general/EditView.cpp:901
+#: ../src/gui/rulers/ControllerEventsRuler.cpp:188
+msgid "Unsupported Event Type"
+msgstr "Неподдерживаемый тип событий"
+
+#: ../src/gui/rulers/ControllerEventsRuler.cpp:203
+msgid "Controller Events"
+msgstr "События контроллера"
+
+#: ../src/gui/rulers/ControllerEventsRuler.cpp:278
+msgid "Controller Event Number"
+msgstr "Номер события контроллера:"
+
+#: ../src/gui/rulers/ControllerEventsRuler.cpp:471
+msgid "Add line of controllers"
+msgstr "Добавить линию контроллеров"
+
+#: ../src/gui/rulers/LoopRuler.cpp:89
+#, fuzzy
+msgid ""
+"Click and drag to move the playback pointer.\n"
+"Shift-click and drag to set a range for looping or editing.\n"
+"Shift-click to clear the loop or range.\n"
+"Double-click to start playback."
+msgstr ""
+"Щелчком левой клавишей мыши установить позицию воспроизведения.\n"
+"Shift + щелчок левой клавишей мыши + перетаскивание — установить петлю или "
+"область.\n"
+"Shift + щелчок левой клавишей мыши — убрать петлю или область."
+
+#: ../src/gui/general/EditViewBase.cpp:228
+msgid "Set Segment Start Time..."
+msgstr "Установить &время начала сегмента..."
+
+#: ../src/gui/general/EditViewBase.cpp:232
+msgid "Set Segment Duration..."
+msgstr "Установить &длительность сегмента..."
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:56
+msgid "Load track parameters preset"
+msgstr "Загрузка предустановки параметров дорожки"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:62
+#, fuzzy
+msgid "Convert notation for..."
+msgstr "Экспортируется звуковой файл..."
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:86
+msgid "Select preset track parameters for:"
+msgstr "Выберите параметры предустановки дорожки для:"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:87
+msgid "Create appropriate notation for:"
+msgstr ""
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:89
+msgid "Category"
+msgstr "Категория"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:95
+msgid "Player Ability"
+msgstr "Уровень подготовки музыканта"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:97
+msgid "Amateur"
+msgstr "Любитель"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:98
+msgid "Professional"
+msgstr "Профессионал"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:104
+#, fuzzy
+msgid "Only selected segments"
+msgstr "Выбранные сегменты"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:106
+#, fuzzy
+msgid "All segments in this track"
+msgstr "Применить ко всем сегментам в этот раз"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:111
+#, fuzzy
+msgid "Only for new segments"
+msgstr "Лирика для этого сегмента"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:113
+#, fuzzy
+msgid "Convert existing segments"
+msgstr "Создать сегмент"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:39
+#, c-format
+msgid "C%1"
+msgstr "До%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:39
+#, c-format
+msgid "C#%1"
+msgstr "До#%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:39
+#, c-format
+msgid "D%1"
+msgstr "Ре%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:39
+#, c-format
+msgid "D#%1"
+msgstr "Ре диез%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:40
+#, c-format
+msgid "E%1"
+msgstr "Ми%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:40
+#, c-format
+msgid "F%1"
+msgstr "Фа%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:40
+#, c-format
+msgid "F#%1"
+msgstr "Фа диез%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:40
+#, c-format
+msgid "G%1"
+msgstr "Соль%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:41
+#, c-format
+msgid "G#%1"
+msgstr "Соль диез%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:41
+#, c-format
+msgid "A%1"
+msgstr "Ля%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:41
+#, c-format
+msgid "A#%1"
+msgstr "Ля диез%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:41
+#, c-format
+msgid "B%1"
+msgstr "Си%1"
+
+#: ../src/gui/general/PresetGroup.cpp:95
+#, c-format
+msgid "Can't open preset file %1"
+msgstr "Не удаётся открыть файл предустановки %1"
+
+#: ../src/gui/general/EditView.cpp:744
+#, fuzzy
+msgid "&Halve Durations"
+msgstr "Длительность"
+
+#: ../src/gui/general/EditView.cpp:748
+#, fuzzy
+msgid "&Double Durations"
+msgstr "Двойной бемоль"
+
+#: ../src/gui/general/EditView.cpp:806
+msgid "Show Velocity Property Ruler"
+msgstr "&Показать линейку силы нажатия"
+
+#: ../src/gui/general/EditView.cpp:825
+msgid "Insert item"
+msgstr "Вставить объект"
+
+#: ../src/gui/general/EditView.cpp:831
+msgid "Erase selected items"
+msgstr "Удалить выбранные объекты"
+
+#: ../src/gui/general/EditView.cpp:835
+msgid "Clear ruler"
+msgstr "Очистить линейку"
+
+#: ../src/gui/general/EditView.cpp:839
+msgid "Insert line of controllers"
+msgstr "Вставить линию контроеллров"
+
+#: ../src/gui/general/EditView.cpp:843
+msgid "Flip forward"
+msgstr "Перескочить вперёд"
+
+#: ../src/gui/general/EditView.cpp:847
+msgid "Flip backwards"
+msgstr "Перескочить назад"
+
+#: ../src/gui/general/EditView.cpp:851
+msgid "Draw property line"
+msgstr "Нарисовать линию свойств"
+
+#: ../src/gui/general/EditView.cpp:855
+msgid "Select all property values"
+msgstr "Выбрать "
+
+#: ../src/gui/general/EditView.cpp:894
+msgid "%1 Controller %2 %3"
+msgstr "Контроллер %1 — %2 %3"
+
+#: ../src/gui/general/EditView.cpp:1066
+msgid "I"
+msgstr "I"
+
+#: ../src/gui/general/EditView.cpp:1066
+msgid "II"
+msgstr "II"
+
+#: ../src/gui/general/EditView.cpp:1066
+msgid "III"
+msgstr "III"
+
+#: ../src/gui/general/EditView.cpp:1066
+msgid "IV"
+msgstr "IV"
+
+#: ../src/gui/general/EditView.cpp:1067
+msgid "V"
+msgstr "V"
+
+#: ../src/gui/general/EditView.cpp:1067
+msgid "VI"
+msgstr "VI"
+
+#: ../src/gui/general/EditView.cpp:1067
+msgid "VII"
+msgstr "VII"
+
+#: ../src/gui/general/EditView.cpp:1067
+msgid "VIII"
+msgstr "VIII"
+
+#: ../src/gui/general/EditView.cpp:1069
+msgid "%1 flat"
+msgstr "%1 бемоль"
+
+#: ../src/gui/general/EditView.cpp:1070
+msgid "%1 sharp"
+msgstr "%1 диез"
+
+#: ../src/gui/general/EditView.cpp:1085
+msgid "&Insert Note"
+msgstr "&Вставить ноту"
+
+#: ../src/gui/general/EditView.cpp:1091
+msgid "&Upper Octave"
+msgstr "&Октавой выше"
+
+#: ../src/gui/general/EditView.cpp:1096
+msgid "&Lower Octave"
+msgstr "&Октавой ниже"
+
+#: ../src/gui/general/EditView.cpp:1268
+msgid "Estimated time signature shown"
+msgstr "Вычисленные ключевые знаки альтерации показаны вверху"
+
+#: ../src/gui/general/EditView.cpp:1431
+#, fuzzy
+msgid "Halving durations..."
+msgstr "Устанавливаются длительности нот..."
+
+#: ../src/gui/general/EditView.cpp:1445
+#, fuzzy
+msgid "Doubling durations..."
+msgstr "Устанавливаются длительности нот..."
+
+#: ../src/gui/general/EditView.cpp:1469
+msgid "Rescaling..."
+msgstr "Идёт перемасштабирование..."
+
+#: ../src/gui/general/EditView.cpp:1489
+msgid "By number of semitones: "
+msgstr "По числу полутонов:"
+
+#: ../src/gui/general/EditView.cpp:1496 ../src/gui/general/EditView.cpp:1518
+msgid "Transposing..."
+msgstr "Транспонирование..."
+
+#: ../src/gui/general/EditView.cpp:1536
+msgid "Transposing up one semitone..."
+msgstr "Транспонировать полутоном выше..."
+
+#: ../src/gui/general/EditView.cpp:1545
+msgid "Transposing up one octave..."
+msgstr "Транспонировать октавой выше..."
+
+#: ../src/gui/general/EditView.cpp:1554
+msgid "Transposing down one semitone..."
+msgstr "Транспонировать полутоном ниже..."
+
+#: ../src/gui/general/EditView.cpp:1563
+msgid "Transposing down one octave..."
+msgstr "Транспонировать октавой ниже..."
+
+#: ../src/gui/general/EditView.cpp:1575
+msgid "Inverting..."
+msgstr "Выполняется инвертирование..."
+
+#: ../src/gui/general/EditView.cpp:1587
+msgid "Retrograding..."
+msgstr "Применяется ракоход..."
+
+#: ../src/gui/general/EditView.cpp:1599
+msgid "Retrograde inverting..."
+msgstr "Выполняется инвертированный ракоход..."
+
+#: ../src/gui/general/EditView.cpp:1608
+msgid "Jogging left..."
+msgstr "Перемещается влево..."
+
+#: ../src/gui/general/EditView.cpp:1623
+msgid "Jogging right..."
+msgstr "Перемещается вправо..."
+
+#: ../src/sound/AudioFileManager.cpp:660
+#, c-format
+msgid "Downloading file %1"
+msgstr "Скачивается файл %1"
+
+#: ../src/sound/AudioFileManager.cpp:735
+#, fuzzy
+msgid "Converting audio file..."
+msgstr "Экспортируется звуковой файл..."
+
+#: ../src/sound/AudioFileManager.cpp:737
+#, fuzzy
+msgid "Resampling audio file..."
+msgstr "Экспортируется звуковой файл..."
+
+#: ../src/sound/AudioFileManager.cpp:739
+#, fuzzy
+msgid "Converting and resampling audio file..."
+msgstr "Экспортируется звуковой файл..."
+
+#: ../src/sound/AudioFileManager.cpp:741
+msgid "Importing audio file..."
+msgstr "Импортируется звуковой файл..."
+
+#: ../src/sound/AudioFileManager.cpp:794
+#, fuzzy
+msgid "Failed to convert or resample audio file on import"
+msgstr "Не удалось открыть временный файл для экспорта в партитуру Lilypond"
+
+#: ../src/sequencer/main.cpp:46 ../src/sequencer/main.cpp:86
+msgid "RosegardenSequencer"
+msgstr "RosegardenSequencer"
+
+#: ../src/sequencer/main.cpp:54
+msgid "JACK playback and capture ports"
+msgstr "Порты воспроизведения и захвата в JACK"
+
+#: ../src/commands/segment/SegmentSyncCommand.cpp:38
+#: ../src/commands/segment/SegmentSyncCommand.cpp:44
+#: ../src/commands/segment/SegmentSyncCommand.cpp:55
+#: ../src/commands/segment/SegmentSyncCommand.cpp:63
+#, fuzzy
+msgid "Sync segment parameters"
+msgstr "Параметры сегмента"
+
+#: ../src/commands/segment/RenameTrackCommand.h:52
+msgid "Rename Track"
+msgstr "Переименовать дорожку"
+
+#: ../src/commands/segment/SegmentRepeatToCopyCommand.cpp:39
+msgid "Turn Repeats into Copies"
+msgstr "Превратить повторы в копии"
+
+#: ../src/commands/segment/SegmentTransposeCommand.cpp:36
+#: ../src/commands/segment/SegmentTransposeCommand.cpp:42
+msgid "Change segment transposition"
+msgstr "Изменить транспозицию сегмента"
+
+#: ../src/commands/edit/RescaleCommand.h:50
+#: ../src/commands/segment/AudioSegmentRescaleCommand.h:62
+#: ../src/commands/segment/SegmentRescaleCommand.h:58
+msgid "Stretch or S&quash..."
+msgstr "&Растянуть или сжать..."
+
+#: ../src/commands/segment/SegmentLabelCommand.h:52
+msgid "Re&label..."
+msgstr "Переименовать &метку..."
+
+#: ../src/commands/segment/AudioSegmentResizeFromStartCommand.cpp:39
+#: ../src/commands/segment/SegmentResizeFromStartCommand.cpp:39
+msgid "Resize Segment"
+msgstr "Изменить размер сегмента"
+
+#: ../src/commands/segment/RemoveTempoChangeCommand.h:58
+msgid "Remove &Tempo Change..."
+msgstr "Удалить с&мену темпа..."
+
+#: ../src/commands/segment/SegmentEraseCommand.cpp:40
+#: ../src/commands/segment/SegmentEraseCommand.cpp:52
+msgid "Erase Segment"
+msgstr "Удалить сегмент"
+
+#: ../src/commands/segment/AudioSegmentRescaleCommand.cpp:126
+#: ../src/commands/segment/SegmentRescaleCommand.cpp:102
+#, fuzzy
+msgid "(rescaled)"
+msgstr "%1 (перемасштабировано)"
+
+#: ../src/commands/segment/AudioSegmentRescaleCommand.cpp:127
+#: ../src/commands/segment/SegmentRescaleCommand.cpp:105
+msgid "%1 (rescaled)"
+msgstr "%1 (перемасштабировано)"
+
+#: ../src/commands/segment/PasteToTriggerSegmentCommand.cpp:47
+msgid "Paste as New Triggered Segment"
+msgstr "Вставить как новый переключаемый сегмент"
+
+#: ../src/commands/segment/SegmentColourMapCommand.h:52
+msgid "Change Segment Color Map..."
+msgstr "Изменить цветовую карту сегментов..."
+
+#: ../src/commands/segment/SegmentQuickCopyCommand.h:55
+msgid "Quick-Copy Segment"
+msgstr "Быстро скопировать сегмент"
+
+#: ../src/commands/segment/AudioSegmentSplitCommand.cpp:42
+msgid "Split Audio Segment"
+msgstr "Разделить звуковой сегмент"
+
+#: ../src/commands/segment/AudioSegmentSplitCommand.cpp:103
+#: ../src/commands/segment/SegmentSplitCommand.cpp:135
+msgid " (split)"
+msgstr " (разделено)"
+
+#: ../src/commands/segment/AudioSegmentSplitCommand.cpp:104
+#: ../src/commands/segment/SegmentSplitByRecordingSrcCommand.cpp:120
+#: ../src/commands/segment/SegmentSplitByRecordingSrcCommand.cpp:122
+#: ../src/commands/segment/SegmentSplitCommand.cpp:136
+msgid "%1 (split)"
+msgstr "%1 (разделено)"
+
+#: ../src/commands/segment/SegmentLabelCommand.cpp:40
+msgid "Label Segments"
+msgstr "Пометить сегменты"
+
+#: ../src/commands/segment/OpenOrCloseRangeCommand.cpp:43
+msgid "Open or Close Range"
+msgstr "Открыть или закрыть диапазон"
+
+#: ../src/commands/edit/TransposeCommand.h:55
+#: ../src/commands/segment/SegmentTransposeCommand.h:54
+msgid "Transpose by &Interval..."
+msgstr "&Транспонировать на интервал..."
+
+#: ../src/commands/segment/SegmentAutoSplitCommand.cpp:148
+msgid "%1 (part)"
+msgstr "%1 (часть)"
+
+#: ../src/commands/segment/AudioSegmentInsertCommand.cpp:51
+#: ../src/commands/segment/SegmentInsertCommand.cpp:43
+#: ../src/commands/segment/SegmentInsertCommand.cpp:56
+msgid "Create Segment"
+msgstr "Создать сегмент"
+
+#: ../src/commands/segment/AudioSegmentInsertCommand.cpp:114
+msgid "%1 (inserted)"
+msgstr "%1 (вставлено)"
+
+#: ../src/commands/segment/AudioSegmentInsertCommand.cpp:117
+msgid "unknown audio file"
+msgstr "неизвестный звуковой файл"
+
+#: ../src/commands/segment/CreateTempoMapFromSegmentCommand.cpp:40
+msgid "Set Tempos from Beat Segment"
+msgstr "Установить темп из бит-сегмента"
+
+#: ../src/commands/segment/SegmentSplitByRecordingSrcCommand.h:52
+msgid "Split by &Recording Source..."
+msgstr "Разделить по &источнику записи..."
+
+#: ../src/commands/segment/SegmentColourMapCommand.cpp:40
+msgid "Change Segment Color Map"
+msgstr "Изменить цветовую карту сегментов"
+
+#: ../src/commands/edit/CopyCommand.cpp:64
+#: ../src/commands/segment/SegmentQuickCopyCommand.cpp:57
+msgid "%1 (copied)"
+msgstr "%1 (скопировано)"
+
+#: ../src/commands/segment/SegmentColourCommand.h:52
+msgid "Change Segment Color..."
+msgstr "Изменить цвет сегмента..."
+
+#: ../src/commands/segment/SegmentSplitByPitchCommand.cpp:170
+msgid "%1 (upper)"
+msgstr "%1 (выше)"
+
+#: ../src/commands/segment/SegmentSplitByPitchCommand.cpp:172
+msgid "%1 (lower)"
+msgstr "%1 (ниже)"
+
+#: ../src/commands/segment/SegmentSingleRepeatToCopyCommand.cpp:39
+msgid "Turn Single Repeat into Copy"
+msgstr "Превратить отдельные повторы в копии"
+
+#: ../src/commands/segment/AddTempoChangeCommand.h:58
+msgid "Add Te&mpo Change..."
+msgstr "Добавить смену &темпа..."
+
+#: ../src/commands/segment/AudioSegmentAutoSplitCommand.h:57
+#: ../src/commands/segment/SegmentAutoSplitCommand.h:53
+msgid "&Split on Silence"
+msgstr "&Разделить по тишине"
+
+#: ../src/commands/segment/SetTriggerSegmentBaseVelocityCommand.cpp:39
+msgid "Set Base Velocity"
+msgstr "Установить базовую силу нажатия"
+
+#: ../src/commands/segment/DeleteRangeCommand.cpp:43
+#: ../src/commands/segment/EraseSegmentsStartingInRangeCommand.cpp:39
+msgid "Delete Range"
+msgstr "Удалить диапазон"
+
+#: ../src/commands/segment/ChangeCompositionLengthCommand.h:53
+msgid "Change &Composition Start and End..."
+msgstr "Изменить &начало и конец композиции..."
+
+#: ../src/commands/segment/MoveTracksCommand.h:51
+msgid "Move Tracks..."
+msgstr "Переместить дорожки..."
+
+#: ../src/commands/segment/SegmentColourCommand.cpp:39
+msgid "Change Segment Color"
+msgstr "Изменить цвет сегмента"
+
+#: ../src/commands/segment/AudioSegmentDistributeCommand.h:66
+msgid "Distribute Audio Segments over MIDI"
+msgstr "Распределить звуковые сегменты по MIDI"
+
+#: ../src/commands/segment/AudioSegmentAutoSplitCommand.cpp:147
+msgid "%1 (autosplit %2)"
+msgstr "%1 (авторазделение %2)"
+
+#: ../src/commands/segment/SetTriggerSegmentDefaultRetuneCommand.cpp:39
+msgid "Set Default Retune"
+msgstr ""
+
+#: ../src/commands/segment/AddTimeSignatureCommand.h:52
+msgid "Add Time Si&gnature Change..."
+msgstr "Добавить &смену размера..."
+
+#: ../src/commands/segment/AddTriggerSegmentCommand.cpp:42
+msgid "Add Triggered Segment"
+msgstr "Добавить переключаемый сегмент"
+
+#: ../src/commands/segment/SetTriggerSegmentDefaultTimeAdjustCommand.cpp:39
+msgid "Set Default Time Adjust"
+msgstr "Указать стандартное время подстройки"
+
+#: ../src/commands/segment/RemoveTimeSignatureCommand.h:58
+msgid "Remove &Time Signature Change..."
+msgstr "Удалить смену размера..."
+
+#: ../src/commands/segment/SegmentCommandRepeat.cpp:39
+msgid "Repeat Segments"
+msgstr "Повторить сегменты"
+
+#: ../src/commands/segment/AddTracksCommand.h:55
+msgid "Add Tracks..."
+msgstr "Добавить дорожки..."
+
+#: ../src/commands/segment/ModifyDefaultTempoCommand.h:51
+msgid "Modify &Default Tempo..."
+msgstr "Изменить &стандартный темп..."
+
+#: ../src/commands/segment/SegmentSplitByPitchCommand.h:61
+msgid "Split by &Pitch..."
+msgstr "Разделить по &высоте тона..."
+
+#: ../src/commands/segment/DeleteTriggerSegmentCommand.cpp:40
+msgid "Delete Triggered Segment"
+msgstr "Удалить переключаемый сегмент"
+
+#: ../src/commands/segment/SegmentSplitCommand.cpp:42
+msgid "Split Segment"
+msgstr "Разделить сегмент"
+
+#: ../src/commands/segment/DeleteTracksCommand.h:51
+msgid "Delete Tracks..."
+msgstr "Удалить дорожки..."
+
+#: ../src/commands/segment/InsertRangeCommand.cpp:42
+msgid "Insert Range"
+msgstr "Вставить область"
+
+#: ../src/commands/segment/DeleteRangeCommand.h:62
+msgid "Rejoin Command"
+msgstr ""
+
+#: ../src/commands/segment/SetTriggerSegmentBasePitchCommand.cpp:39
+msgid "Set Base Pitch"
+msgstr "Установить базовую высоту тона"
+
+#: ../src/commands/segment/PasteConductorDataCommand.cpp:41
+msgid "Paste Tempos and Time Signatures"
+msgstr "Вставить темпы и тактовые размеры"
+
+#: ../src/commands/segment/SegmentSyncClefCommand.cpp:34
+#, fuzzy
+msgid "Sync segment clef"
+msgstr "Метка сегмента"
+
+#: ../src/commands/matrix/MatrixInsertionCommand.cpp:46
+#: ../src/commands/notation/NoteInsertionCommand.cpp:54
+msgid "Insert Note"
+msgstr "Вставить ноту"
+
+#: ../src/commands/matrix/MatrixEraseCommand.cpp:41
+msgid "Erase Note"
+msgstr "Стереть ноту"
+
+#: ../src/commands/matrix/MatrixPercussionInsertionCommand.cpp:47
+msgid "Insert Percussion Note"
+msgstr "Вставить ноту перкуссии"
+
+#: ../src/commands/matrix/MatrixModifyCommand.cpp:43
+msgid "Move Note"
+msgstr "Переместить ноту"
+
+#: ../src/commands/matrix/MatrixModifyCommand.cpp:43
+msgid "Modify Note"
+msgstr "Изменить ноту"
+
+#: ../src/commands/edit/PasteEventsCommand.cpp:98
+msgid "Paste into an existing gap [\"restricted\"]"
+msgstr "Вставить в существующий интервал [«ограничено»]"
+
+#: ../src/commands/edit/PasteEventsCommand.cpp:100
+msgid "Erase existing events to make room [\"simple\"]"
+msgstr "Стереть существующие события для освобождения пространства [«просто»]"
+
+#: ../src/commands/edit/PasteEventsCommand.cpp:102
+msgid "Move existing events out of the way [\"open-n-paste\"]"
+msgstr "Убрать с пути существующие события [«открыть-и-вставить»]"
+
+#: ../src/commands/edit/PasteEventsCommand.cpp:104
+msgid "Overlay notes, tying against present notes [\"note-overlay\"]"
+msgstr "Перекрыть ноты, связывая против текущих [«перекрытие нот»]"
+
+#: ../src/commands/edit/PasteEventsCommand.cpp:106
+msgid "Overlay notes, ignoring present notes [\"matrix-overlay\"]"
+msgstr "Перекрыть ноты, игнорируя текущие [«перекрытие матрицы»]"
+
+#: ../src/commands/edit/AddDotCommand.h:52
+msgid "&Add Dot"
+msgstr "&Добавить точку"
+
+#: ../src/commands/edit/RemoveMarkerCommand.h:55
+msgid "&Remove Marker"
+msgstr "&Удалить маркер"
+
+#: ../src/commands/edit/EventUnquantizeCommand.cpp:43
+#: ../src/commands/edit/EventUnquantizeCommand.cpp:54
+msgid "Unquantize Events"
+msgstr "Разквантовать события"
+
+#: ../src/commands/edit/ChangeVelocityCommand.h:53
+msgid "&Increase Velocity"
+msgstr "По&высить скорость"
+
+#: ../src/commands/edit/ChangeVelocityCommand.h:54
+msgid "&Reduce Velocity"
+msgstr "По&низить скорость"
+
+#: ../src/commands/edit/CopyCommand.cpp:46
+msgid "(excerpt)"
+msgstr "(отрывок)"
+
+#: ../src/commands/edit/CopyCommand.cpp:60
+msgid "(copied)"
+msgstr "(скопировано)"
+
+#: ../src/commands/edit/EventInsertionCommand.cpp:39
+msgid "Insert Event"
+msgstr "Вставить событие"
+
+#: ../src/commands/edit/InsertTriggerNoteCommand.cpp:55
+msgid "Insert Trigger Note"
+msgstr "Вставить переключаемую ноту"
+
+#: ../src/commands/edit/CollapseNotesCommand.h:50
+msgid "Collapse &Equal-Pitch Notes"
+msgstr "Объединить ноты с &одинаковой высотой тона"
+
+#: ../src/commands/edit/TransposeCommand.h:61
+msgid "&Up a Semitone"
+msgstr "Полутоном &выше"
+
+#: ../src/commands/edit/TransposeCommand.h:62
+msgid "&Down a Semitone"
+msgstr "Полутоном &ниже"
+
+#: ../src/commands/edit/TransposeCommand.h:63
+msgid "Up an &Octave"
+msgstr "&Октавой выше"
+
+#: ../src/commands/edit/TransposeCommand.h:64
+msgid "Down an Octa&ve"
+msgstr "&Октавой ниже"
+
+#: ../src/commands/edit/TransposeCommand.h:65
+msgid "&Transpose by Semitones..."
+msgstr "&Транспонировать по полутонам..."
+
+#: ../src/commands/edit/SetNoteTypeCommand.h:56
+msgid "&Set Note Type"
+msgstr "&Указать тип ноты"
+
+#: ../src/commands/edit/EventEditCommand.h:55
+msgid "Edit E&vent"
+msgstr "Редактировать &событие"
+
+#: ../src/commands/edit/AddMarkerCommand.h:54
+msgid "&Add Marker"
+msgstr "&Добавить маркер"
+
+#: ../src/commands/edit/SelectionPropertyCommand.h:66
+msgid "Set &Property"
+msgstr "Установить &свойство"
+
+#: ../src/commands/edit/CutCommand.h:55
+msgid "Cu&t"
+msgstr "Вы&резать"
+
+#: ../src/commands/edit/EventQuantizeCommand.cpp:114
+msgid "Heuristic Notation &Quantize"
+msgstr "Эвристическое &квантование партитуры"
+
+#: ../src/commands/edit/EventQuantizeCommand.cpp:116
+msgid "Grid &Quantize"
+msgstr "&Квантовать по сетке"
+
+#: ../src/commands/edit/ClearTriggersCommand.h:52
+msgid "&Clear Triggers"
+msgstr "Очистить п&ереключатели"
+
+#: ../src/commands/edit/RetrogradeCommand.h:51
+msgid "&Retrograde"
+msgstr "&Ракоход («Крабий канон»)"
+
+#: ../src/commands/edit/InvertCommand.h:51
+msgid "&Invert"
+msgstr "&Инвертировать"
+
+#: ../src/commands/edit/SetTriggerCommand.h:64
+msgid "Tri&gger Segment"
+msgstr "&Переключаемый сегмент"
+
+#: ../src/commands/edit/SetLyricsCommand.h:50
+msgid "Edit L&yrics"
+msgstr "Изменить &лирику"
+
+#: ../src/commands/edit/MoveAcrossSegmentsCommand.cpp:73
+msgid "&Move Events to Other Segment"
+msgstr "С&местить события в другой сегмент"
+
+#: ../src/commands/edit/RetrogradeInvertCommand.h:51
+msgid "Re&trograde Invert"
+msgstr "&Инвертированный ракоход"
+
+#: ../src/commands/edit/ModifyMarkerCommand.h:55
+msgid "&Modify Marker"
+msgstr "&Изменить маркер"
+
+#: ../src/commands/studio/AddControlParameterCommand.h:61
+msgid "&Add Control Parameter"
+msgstr "&Добавить параметр контроллера"
+
+#: ../src/commands/studio/ModifyInstrumentMappingCommand.h:55
+msgid "Modify &Instrument Mapping"
+msgstr "Изменить привязку &инструментов"
+
+#: ../src/commands/studio/RemoveControlParameterCommand.h:60
+msgid "&Remove Control Parameter"
+msgstr "&Удалить параметр контроллера"
+
+#: ../src/commands/studio/ReconnectDeviceCommand.h:55
+msgid "Reconnect Device"
+msgstr "Заново присоединить устройство"
+
+#: ../src/commands/studio/ModifyDeviceCommand.h:68
+msgid "Modify &MIDI Bank"
+msgstr "Изменить &MIDI-банк"
+
+#: ../src/commands/studio/CreateOrDeleteDeviceCommand.h:68
+msgid "Create Device"
+msgstr "Создать устройство"
+
+#: ../src/commands/studio/ModifyDeviceMappingCommand.h:55
+msgid "Modify &Device Mapping"
+msgstr "Изменить привязку &устройств"
+
+#: ../src/commands/studio/RenameDeviceCommand.h:55
+msgid "Rename Device"
+msgstr "Переименовать устройство"
+
+#: ../src/commands/studio/ModifyControlParameterCommand.h:61
+msgid "&Modify Control Parameter"
+msgstr "&Изменить параметр контроллера"
+
+#: ../src/commands/notation/TieNotesCommand.h:49
+msgid "&Tie"
+msgstr "&Связать"
+
+#: ../src/commands/notation/ClefInsertionCommand.cpp:74
+msgid "Add Cle&f Change..."
+msgstr "Добавить смену &ключа..."
+
+#: ../src/commands/notation/GuitarChordInsertionCommand.cpp:40
+msgid "Insert Guitar Chord"
+msgstr "Вставить гитарный аккорд"
+
+#: ../src/commands/notation/RespellCommand.cpp:47
+#, c-format
+msgid "Respell with %1"
+msgstr "Перечитать с %1"
+
+#: ../src/commands/notation/RespellCommand.cpp:50
+msgid "Do&uble Sharp"
+msgstr "дв&ойным диезом"
+
+#: ../src/commands/notation/RespellCommand.cpp:52
+msgid "&Sharp"
+msgstr "&диезом"
+
+#: ../src/commands/notation/RespellCommand.cpp:54
+msgid "&Flat"
+msgstr "&бемолем"
+
+#: ../src/commands/notation/RespellCommand.cpp:56
+msgid "Dou&ble Flat"
+msgstr "д&войным бемолем"
+
+#: ../src/commands/notation/RespellCommand.cpp:58
+msgid "&Natural"
+msgstr "бе&каром"
+
+#: ../src/commands/notation/RespellCommand.cpp:60
+msgid "N&one"
+msgstr "&Ничего"
+
+#: ../src/commands/notation/RespellCommand.cpp:66
+msgid "Respell Accidentals &Upward"
+msgstr "Перечитать случайные знаки альтерации в&верх"
+
+#: ../src/commands/notation/RespellCommand.cpp:69
+msgid "Respell Accidentals &Downward"
+msgstr "Перечитать случайные знаки альтерации в&низ"
+
+#: ../src/commands/notation/RespellCommand.cpp:72
+msgid "&Restore Accidentals"
+msgstr "В&осстановить знаки альтерации"
+
+#: ../src/commands/notation/RespellCommand.cpp:75
+msgid "Respell Accidentals"
+msgstr "Перечитать случайные знаки альтерации"
+
+#: ../src/commands/notation/DeCounterpointCommand.h:55
+msgid "Split-and-Tie Overlapping &Chords"
+msgstr "Слиговать-разлиговать перекрывающиеся &аккорды"
+
+#: ../src/commands/notation/BeamCommand.h:49
+msgid "&Beam Group"
+msgstr "&Сгруппировать"
+
+#: ../src/commands/notation/AddTextMarkCommand.h:51
+msgid "Add Te&xt Mark..."
+msgstr "Добавить &текстовые пометки"
+
+#: ../src/commands/notation/RestoreSlursCommand.h:49
+msgid "&Restore Slur Positions"
+msgstr "&Восстановить позиции легато"
+
+#: ../src/commands/notation/SustainInsertionCommand.h:56
+msgid "Add Pedal &Press"
+msgstr "Добавить нажатие &педали"
+
+#: ../src/commands/notation/SustainInsertionCommand.h:58
+msgid "Add Pedal &Release"
+msgstr "Добавить &отпускание педали"
+
+#: ../src/commands/notation/FixNotationQuantizeCommand.h:49
+msgid "Fi&x Notation Quantization"
+msgstr "&Исправляющее партитуру квантование"
+
+#: ../src/commands/notation/ChangeStemsCommand.h:51
+msgid "Stems &Up"
+msgstr "Штилями &вверх"
+
+#: ../src/commands/notation/ChangeStemsCommand.h:51
+msgid "Stems &Down"
+msgstr "Штилями в&низ"
+
+#: ../src/commands/notation/MakeAccidentalsCautionaryCommand.cpp:43
+msgid "Use &Cautionary Accidentals"
+msgstr "&Использовать предупреждающие знаки альтерации"
+
+#: ../src/commands/notation/MakeAccidentalsCautionaryCommand.cpp:45
+msgid "Cancel C&autionary Accidentals"
+msgstr "&Отменить предупреждающие знаки альтерации"
+
+#: ../src/commands/notation/SetVisibilityCommand.h:50
+msgid "Set Visibility"
+msgstr "Установить видимость"
+
+#: ../src/commands/notation/ChangeStyleCommand.h:53
+msgid "Change &Note Style"
+msgstr "Сменить нотный &стиль"
+
+#: ../src/commands/notation/TextInsertionCommand.cpp:41
+msgid "Insert Text"
+msgstr "Вставить текст"
+
+#: ../src/commands/notation/InterpretCommand.h:70
+msgid "&Interpret..."
+msgstr "&Интерпретировать..."
+
+#: ../src/commands/notation/TupletCommand.h:53
+msgid "&Triplet"
+msgstr "&Триоль"
+
+#: ../src/commands/notation/TupletCommand.h:54
+msgid "Tu&plet..."
+msgstr "&Группа..."
+
+#: ../src/commands/notation/UnTupletCommand.h:50
+msgid "&Untuplet"
+msgstr "&Разгруппировать"
+
+#: ../src/commands/notation/CollapseRestsCommand.h:54
+msgid "&Collapse Rests"
+msgstr "&Объединить паузы"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:145
+msgid "Add S&lur"
+msgstr "Добавить &лигато"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:147
+msgid "Add &Phrasing Slur"
+msgstr "Добавить фра&зовую лигу.."
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:149
+msgid "Add Double-Octave Up"
+msgstr "Добавить перенос на две октавы вверх"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:151
+msgid "Add Octave &Up"
+msgstr "Добавить перенос на &октаву вверх"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:153
+msgid "Add Octave &Down"
+msgstr "Добавить перенос на октаву в&низ"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:155
+msgid "Add Double Octave Down"
+msgstr "Добавить перенос на две октавы вниз"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:160
+msgid "Add &Crescendo"
+msgstr "Добавить &крещендо..."
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:162
+msgid "Add &Decrescendo"
+msgstr "Добавить &декрещендо..."
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:164
+msgid "Add &Glissando"
+msgstr "Добить &глиссандо..."
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:167
+msgid "Add &%1%2"
+msgstr "Добавить &%1%2"
+
+#: ../src/commands/notation/RemoveNotationQuantizeCommand.h:49
+msgid "Remo&ve Notation Quantization"
+msgstr "&Удалить квантование партитуры"
+
+#: ../src/commands/notation/MakeChordCommand.h:50
+msgid "Make &Chord"
+msgstr "Сделать &аккорд"
+
+#: ../src/commands/notation/MultiKeyInsertionCommand.h:63
+msgid "Change all to &Key %1..."
+msgstr "Изменить все на &тональность %1..."
+
+#: ../src/commands/notation/KeyInsertionCommand.h:67
+#: ../src/commands/notation/MultiKeyInsertionCommand.h:65
+msgid "Add &Key Change..."
+msgstr "Добавить смену &тональности..."
+
+#: ../src/commands/notation/RestoreStemsCommand.h:49
+msgid "&Restore Stems"
+msgstr "&Восстановить направление штилей"
+
+#: ../src/commands/notation/MakeNotesViableCommand.h:55
+#: ../src/commands/notation/MakeRegionViableCommand.h:52
+msgid "Tie Notes at &Barlines"
+msgstr "Связать ноты лигатурой по &тактовым чертам"
+
+#: ../src/commands/notation/AddSlashesCommand.h:46
+msgid "Slashes"
+msgstr "Чёрточки"
+
+#: ../src/commands/notation/ChangeSlurPositionCommand.h:51
+msgid "Slur &Above"
+msgstr "Лигу с&верху"
+
+#: ../src/commands/notation/ChangeSlurPositionCommand.h:51
+msgid "Slur &Below"
+msgstr "Лига с&низу"
+
+#: ../src/commands/notation/NormalizeRestsCommand.h:54
+msgid "&Normalize Rests"
+msgstr "&Нормализовать паузы"
+
+#: ../src/commands/notation/TextChangeCommand.cpp:41
+msgid "Edit Text"
+msgstr "Изменить текст"
+
+#: ../src/commands/notation/RemoveMarksCommand.h:49
+msgid "&Remove All Marks"
+msgstr "&Удалить все пометки"
+
+#: ../src/commands/notation/AutoBeamCommand.h:52
+msgid "&Auto-Beam"
+msgstr "&Автогруппировка"
+
+#: ../src/commands/notation/UntieNotesCommand.h:49
+msgid "&Untie"
+msgstr "&Разлиговать ноты"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:48
+msgid "S&forzando"
+msgstr "с&форцандо"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:50
+msgid "Sta&ccato"
+msgstr "ста&ккато"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:52
+msgid "R&inforzando"
+msgstr "р&инфорцандо"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:54
+msgid "T&enuto"
+msgstr "т&енуто"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:56
+msgid "Tri&ll"
+msgstr "тре&ль"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:58
+msgid "Trill &with Line"
+msgstr "трель с л&инией"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:60
+msgid "Trill Line"
+msgstr "линию трели"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:62
+msgid "&Turn"
+msgstr "гру&ппето"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:64
+msgid "&Accent"
+msgstr "&акцент"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:66
+msgid "&Staccatissimo"
+msgstr "&стаккатиссимо"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:68
+msgid "&Marcato"
+msgstr "&маркато"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:70
+msgid "&Pause"
+msgstr "&фермату"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:72
+msgid "&Up-Bow"
+msgstr "движение смычком в&верх"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:74
+msgid "&Down-Bow"
+msgstr "движение смычком в&низ"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:76
+msgid "Mo&rdent"
+msgstr "морд&ент"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:78
+msgid "Inverted Mordent"
+msgstr "инвертированный мордент"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:80
+msgid "Long Mordent"
+msgstr "долгий &мордент"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:82
+msgid "Lon&g Inverted Mordent"
+msgstr "дол&гий инвертированный мордент"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:84
+msgid "&%1%2"
+msgstr "&%1%2"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:89
+#, c-format
+msgid "Add %1"
+msgstr "Добавить %1"
+
+#: ../src/commands/notation/ResetDisplacementsCommand.h:49
+msgid "Restore Positions"
+msgstr "Восстановить позиции"
+
+#: ../src/commands/notation/IncrementDisplacementsCommand.h:52
+msgid "Fine Reposition"
+msgstr "Точное перепозиционирование"
+
+#: ../src/commands/notation/RestoreTiesCommand.h:49
+#, fuzzy
+msgid "&Restore Tie Positions"
+msgstr "&Восстановить позиции"
+
+#: ../src/commands/notation/ChangeTiePositionCommand.h:47
+#, fuzzy
+msgid "Tie &Above"
+msgstr "Лигу с&верху"
+
+#: ../src/commands/notation/ChangeTiePositionCommand.h:47
+#, fuzzy
+msgid "Tie &Below"
+msgstr "Лига с&низу"
+
+#: ../src/commands/notation/KeyInsertionCommand.h:65
+msgid "Change to &Key %1..."
+msgstr "Изменить на &тональность %1..."
+
+#: ../src/commands/notation/RemoveFingeringMarksCommand.h:49
+msgid "&Remove Fingerings"
+msgstr "&Удалить аппликатуру"
+
+#: ../src/commands/notation/BreakCommand.h:49
+msgid "&Unbeam"
+msgstr "&Разгруппировать"
+
+#: ../src/commands/notation/UnGraceCommand.h:48
+msgid "Ung&race"
+msgstr "У&брать форшлаг"
+
+#: ../src/commands/notation/AddFingeringMarkCommand.cpp:45
+msgid "Add Other &Fingering..."
+msgstr "Добавить ещё &аппликатуру..."
+
+#: ../src/commands/notation/AddFingeringMarkCommand.cpp:47
+msgid "Add Fingering &0 (Thumb)"
+msgstr "Добавить аппликатуру &0 (большой палец)"
+
+#: ../src/commands/notation/AddFingeringMarkCommand.cpp:49
+#, c-format
+msgid "Add Fingering &%1"
+msgstr "Добавить аппликатуру &%1"
+
+#: ../src/document/io/HydrogenXMLHandler.cpp:277
+msgid " imported from Hydrogen "
+msgstr " импортировано из Hydrogen "
+
+#: ../src/document/io/LilyPondExporter.cpp:404
+#, fuzzy
+msgid ""
+"LilyPond does not allow spaces or backslashes in filenames.\n"
+"\n"
+"Would you like to use\n"
+"\n"
+" %1\n"
+"\n"
+" instead?"
+msgstr ""
+"В Lilypond недопустимы пробелы и обратные черты в именах файлов.\n"
+"\n"
+"Использовать\n"
+"\n"
+" %1\n"
+"\n"
+" вместо них?"
+
+#: ../src/document/io/LilyPondExporter.cpp:2054
+msgid "warning: overlong bar truncated here"
+msgstr "Предупреждение: слишком длинный такт здесь урезан"
+
+#: ../src/document/io/LilyPondExporter.cpp:2060
+msgid "warning: bar too short, padding with rests"
+msgstr "Предупреждение: слишком короткий так был заполнен паузами."
+
+#: ../src/document/MultiViewCommandHistory.cpp:318
+msgid "Nothing to undo"
+msgstr "Нет отменяемых операций"
+
+#: ../src/document/MultiViewCommandHistory.cpp:320
+msgid "Nothing to redo"
+msgstr "Нет повторяемых операций"
+
+#: ../src/document/MultiViewCommandHistory.cpp:328
+#: ../src/document/MultiViewCommandHistory.cpp:372
+#, c-format
+msgid "Und&o %1"
+msgstr "От&менить операцию \"%1\""
+
+#: ../src/document/MultiViewCommandHistory.cpp:330
+#: ../src/document/MultiViewCommandHistory.cpp:374
+#, c-format
+msgid "Re&do %1"
+msgstr "По&вторить операцию \"%1\""
+
+#: ../src/document/RosegardenGUIDoc.cpp:328
+msgid ""
+"The current file has been modified.\n"
+"Do you want to save it?"
+msgstr ""
+"Открытый сейчас файл был изменён.\n"
+"Вы хотите его сохранить?"
+
+#: ../src/document/RosegardenGUIDoc.cpp:480
+#, fuzzy, c-format
+msgid ""
+"_n: Delete the 1 audio file recorded during the unsaved session?\n"
+"Delete the %n audio files recorded during the unsaved session?"
+msgstr "Удалить 1 звуковой файл, записанный во время не сохранённого сеанса?"
+
+#: ../src/document/RosegardenGUIDoc.cpp:501
+msgid ""
+"The following audio files were recorded during this session but have been "
+"unloaded\n"
+"from the audio file manager, and so are no longer in use in the document you "
+"are saving.\n"
+"\n"
+"You may want to clean up these files to save disk space.\n"
+"\n"
+"Please select any you wish to delete permanently from the hard disk.\n"
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:517
+#, c-format
+msgid ""
+"_n: <qt>About to delete 1 audio file permanently from the hard disk."
+"<br>There will be no way to recover this file.<br>Are you sure?</qt>\n"
+"\n"
+"<qt>About to delete %n audio files permanently from the hard disk.<br>There "
+"will be no way to recover these files.<br>Are you sure?</qt>"
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:580
+msgid "Can't open file '%1'"
+msgstr "Не удаётся открыть файл '%1'"
+
+#: ../src/document/RosegardenGUIDoc.cpp:585
+msgid "Reading file..."
+msgstr "Читается файл..."
+
+#: ../src/document/RosegardenGUIDoc.cpp:603
+msgid "Could not open Rosegarden file"
+msgstr "Не удалось открыть файл Rosegarden"
+
+#: ../src/document/RosegardenGUIDoc.cpp:641
+msgid "Error when parsing file '%1': \"%2\""
+msgstr "Ошибка при синтаксическом разборе файла '%1': \"%2\""
+
+#: ../src/document/RosegardenGUIDoc.cpp:689
+msgid "Generating audio previews..."
+msgstr "Создаётся предпросмотр звуковых сегментов..."
+
+#: ../src/document/RosegardenGUIDoc.cpp:721
+msgid "Merge"
+msgstr "Объединить"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1605
+msgid "File load cancelled"
+msgstr "Загрузка файла отменена"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1625
+msgid ""
+"<h3>Audio and plugins not available</h3><p>This composition uses audio files "
+"or plugins, but Rosegarden is currently running without audio because the "
+"JACK audio server was not available on startup.</p><p>Please exit "
+"Rosegarden, start the JACK audio server and re-start Rosegarden if you wish "
+"to load this complete composition.</p><p><b>WARNING:</b> If you re-save this "
+"composition, all audio and plugin data and settings in it will be lost.</p>"
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:1628
+msgid ""
+"<h3>Audio and plugins not available</h3><p>This composition uses audio files "
+"or plugins, but you are running a version of Rosegarden that was compiled "
+"without audio support.</p><p><b>WARNING:</b> If you re-save this composition "
+"from this version of Rosegarden, all audio and plugin data and settings in "
+"it will be lost.</p>"
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:1665
+msgid ""
+"<h3>Incorrect audio sample rate</h3><p>This composition contains audio files "
+"that were recorded or imported with the audio server running at a different "
+"sample rate (%1 Hz) from the current JACK server sample rate (%2 Hz).</"
+"p><p>Rosegarden will play this composition at the correct speed, but any "
+"audio files in it will probably sound awful.</p><p>Please consider re-"
+"starting the JACK server at the correct rate (%3 Hz) and re-loading this "
+"composition before you do any more work with it.</p>"
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:1675
+msgid ""
+"<h3>Inconsistent audio sample rates</h3><p>This composition contains audio "
+"files at more than one sample rate.</p><p>Rosegarden will play them at the "
+"correct speed, but any audio files that were recorded or imported at rates "
+"different from the current JACK server sample rate (%1 Hz) will probably "
+"sound awful.</p><p>Please see the audio file manager dialog for more "
+"details, and consider resampling any files that are at the wrong rate.</p>"
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:1676
+#, fuzzy
+msgid "Inconsistent sample rates"
+msgstr "Непостоянные свойства"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1690
+msgid ""
+"<h3>Plugins not found</h3><p>The following audio plugins could not be loaded:"
+"</p><ul>"
+msgstr ""
+"<h3>Расширения не найдены</h3><p>Следующие расширения не удалось загрузить:</"
+"p><ul>"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1698
+msgid "<li>%1 (from %2)</li>"
+msgstr "<li>%1 (из %2)</li>"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1712
+msgid ""
+"This file contains one or more old element types that are now deprecated.\n"
+"Support for these elements may disappear in future versions of Rosegarden.\n"
+"We recommend you re-save this file from this version of Rosegarden to ensure "
+"that it can still be re-loaded in future versions."
+msgstr ""
+"В этом файле содержится один или несколько устаревших элементов.\n"
+"Поддержка этих элементов в следующих версиях программы может\n"
+"быть удалена. Рекомендуем заново сохранить файл из это версии RG,\n"
+"чтобы обеспечить поддерживаемость файла в следующих версиях\n"
+"программы."
+
+#: ../src/document/RosegardenGUIDoc.cpp:2207
+msgid "Insert Recorded MIDI"
+msgstr "Вставить записанное MIDI"
+
+#: ../src/document/RosegardenGUIDoc.cpp:2560
+msgid "%1 (recorded)"
+msgstr "%1 (записано)"
+
+#: ../src/document/RoseXmlHandler.cpp:442
+msgid ""
+"This file was written by Rosegarden %1, and it uses\n"
+"a different file format that cannot be read by this version."
+msgstr ""
+"Это файл был создан при помощи Rosegarden %1; \n"
+"он использует формат, не поддерживаемый\n"
+"в этой версии программы."
+
+#: ../src/document/RoseXmlHandler.cpp:452
+msgid ""
+"This file was written by Rosegarden %1, which is more recent than this "
+"version.\n"
+"There may be some incompatibilities with the file format."
+msgstr ""
+"Это файл был создан при помощи Rosegarden %1; являющегося \n"
+"более новой версией программы, чем используемая вами, \n"
+"поэтому возможна несовместимость данных."
+
+#: ../src/document/RoseXmlHandler.cpp:1687
+msgid "Loading plugins..."
+msgstr "Загружаются модули..."
+
+#: rc.cpp:6 rc.cpp:144
+#, no-c-format
+msgid "Se&gment"
+msgstr "Сег&мент"
+
+#: rc.cpp:9 rc.cpp:84 rc.cpp:147 rc.cpp:303
+#, no-c-format
+msgid "Edit &With"
+msgstr "&Открыть в редакторе..."
+
+#: rc.cpp:12 rc.cpp:21 rc.cpp:30 rc.cpp:39 rc.cpp:345
+#, no-c-format
+msgid "Actions Toolbar"
+msgstr "Панель \"Действия\""
+
+#: rc.cpp:15 rc.cpp:33 rc.cpp:129 rc.cpp:285
+#, no-c-format
+msgid "Time Toolbar"
+msgstr "Панель \"Время\""
+
+#: rc.cpp:18 rc.cpp:36 rc.cpp:57 rc.cpp:63 rc.cpp:120 rc.cpp:243 rc.cpp:342
+#, no-c-format
+msgid "Transport Toolbar"
+msgstr "Панель \"Транспорт\""
+
+#: rc.cpp:24 rc.cpp:42 rc.cpp:123 rc.cpp:348
+#, no-c-format
+msgid "Zoom Toolbar"
+msgstr "Панель \"Масштаб\""
+
+#: rc.cpp:45 rc.cpp:60 rc.cpp:99 rc.cpp:228 rc.cpp:327
+#, no-c-format
+msgid "T&ransport"
+msgstr "&Транспорт"
+
+#: rc.cpp:51
+#, no-c-format
+msgid "Number of Stereo &Inputs"
+msgstr "Количество стерео&входов"
+
+#: rc.cpp:54
+#, fuzzy, no-c-format
+msgid "&Number of Submasters"
+msgstr "Нет субмиксов"
+
+#: rc.cpp:66
+#, no-c-format
+msgid "&Import"
+msgstr "&Импортировать"
+
+#: rc.cpp:69
+#, no-c-format
+msgid "&Merge"
+msgstr "О&бъединить"
+
+#: rc.cpp:72
+#, no-c-format
+msgid "&Export"
+msgstr "&Экспортировать"
+
+#: rc.cpp:75 rc.cpp:141 rc.cpp:297
+#, no-c-format
+msgid "&Composition"
+msgstr "&Композиция"
+
+#: rc.cpp:78
+#, no-c-format
+msgid "&Studio"
+msgstr "&Студия"
+
+#: rc.cpp:81
+#, no-c-format
+msgid "Se&gments"
+msgstr "Сег&менты"
+
+#: rc.cpp:90
+#, no-c-format
+msgid "Trac&ks"
+msgstr "&Дорожки"
+
+#: rc.cpp:93
+#, no-c-format
+msgid "Set &Instrument"
+msgstr "Установить &инструмент"
+
+#: rc.cpp:102 rc.cpp:234 rc.cpp:333
+#, no-c-format
+msgid "&Toolbars"
+msgstr "&Панели"
+
+#: rc.cpp:105 rc.cpp:237 rc.cpp:336
+#, no-c-format
+msgid "&Rulers"
+msgstr "&Линейки"
+
+#: rc.cpp:111 rc.cpp:240 rc.cpp:339
+#, no-c-format
+msgid "Tools Toolbar"
+msgstr "Панель \"Инструменты\""
+
+#: rc.cpp:114
+#, no-c-format
+msgid "Tracks Toolbar"
+msgstr "Панель \"Дорожки\""
+
+#: rc.cpp:117
+#, no-c-format
+msgid "Editors Toolbar"
+msgstr "Панель \"Правка\""
+
+#: rc.cpp:135
+#, no-c-format
+msgid "&Layout Mode"
+msgstr "&Режим представления"
+
+#: rc.cpp:138 rc.cpp:294
+#, no-c-format
+msgid "Add Event Ruler"
+msgstr "Добавить линейку событий"
+
+#: rc.cpp:150
+#, no-c-format
+msgid "N&ote"
+msgstr "Н&оты"
+
+#: rc.cpp:153
+#, no-c-format
+msgid "Mar&ks"
+msgstr "&Пометки"
+
+#: rc.cpp:156
+#, no-c-format
+msgid "&Ornaments"
+msgstr "&Украшения"
+
+#: rc.cpp:159
+#, no-c-format
+msgid "&Fingerings"
+msgstr "&Аппликатура"
+
+#: rc.cpp:162
+#, no-c-format
+msgid "S&lashes"
+msgstr "&Чёрточки"
+
+#: rc.cpp:165 rc.cpp:219
+#, no-c-format
+msgid "&Accidentals"
+msgstr "&Знаки альтерации"
+
+#: rc.cpp:168
+#, no-c-format
+msgid "&Phrase"
+msgstr "Фр&аза"
+
+#: rc.cpp:171
+#, no-c-format
+msgid "Slur &Position"
+msgstr "Позиция &лиги"
+
+#: rc.cpp:174
+#, fuzzy, no-c-format
+msgid "Tie &Position"
+msgstr "Позиция &лиги"
+
+#: rc.cpp:177
+#, no-c-format
+msgid "&Octaves"
+msgstr "&Октавы"
+
+#: rc.cpp:180 rc.cpp:306
+#, no-c-format
+msgid "Ad&just"
+msgstr "&Коррекция"
+
+#: rc.cpp:183
+#, no-c-format
+msgid "R&ests"
+msgstr "&Паузы"
+
+#: rc.cpp:186 rc.cpp:213
+#, no-c-format
+msgid "&Notes"
+msgstr "&Ноты"
+
+#: rc.cpp:189 rc.cpp:309
+#, no-c-format
+msgid "&Quantize"
+msgstr "&Квантование"
+
+#: rc.cpp:195 rc.cpp:315
+#, no-c-format
+msgid "Trans&pose"
+msgstr "&Транспозиция"
+
+#: rc.cpp:198 rc.cpp:318
+#, no-c-format
+msgid "Convert"
+msgstr "Преобразовать"
+
+#: rc.cpp:201
+#, no-c-format
+msgid "&Fine Positioning"
+msgstr "Точное &позиционирование"
+
+#: rc.cpp:204
+#, no-c-format
+msgid "Fine Ti&ming"
+msgstr "Т&очный тайминг"
+
+#: rc.cpp:207
+#, no-c-format
+msgid "&Visibility"
+msgstr "&Видимость"
+
+#: rc.cpp:216
+#, no-c-format
+msgid "&Rests"
+msgstr "&Паузы"
+
+#: rc.cpp:222
+#, no-c-format
+msgid "&Clefs"
+msgstr "&Ключи"
+
+#: rc.cpp:225 rc.cpp:324
+#, no-c-format
+msgid "Local &Cursor"
+msgstr "&Местный курсор"
+
+#: rc.cpp:246
+#, no-c-format
+msgid "Notes Toolbar"
+msgstr "Панель \"Ноты\""
+
+#: rc.cpp:249
+#, no-c-format
+msgid "Rests Toolbar"
+msgstr "Панель \"Паузы\""
+
+#: rc.cpp:252
+#, no-c-format
+msgid "Clefs Toolbar"
+msgstr "Панель \"Ключи\""
+
+#: rc.cpp:255
+#, no-c-format
+msgid "Accidentals Toolbar"
+msgstr "Панель \"Знаки альтерации\""
+
+#: rc.cpp:258
+#, no-c-format
+msgid "Group Toolbar"
+msgstr "Панель \"Группирование\""
+
+#: rc.cpp:261
+#, no-c-format
+msgid "Marks Toolbar"
+msgstr "Панель \"Пометки\""
+
+#: rc.cpp:264
+#, no-c-format
+msgid "Meta Toolbar"
+msgstr "Метапанель"
+
+#: rc.cpp:267
+#, no-c-format
+msgid "Layout Toolbar"
+msgstr "Показать панель \"Облик\""
+
+#: rc.cpp:270 rc.cpp:351
+#, no-c-format
+msgid "Control Ruler actions"
+msgstr "Действия контрольной линейки"
+
+#: rc.cpp:273 rc.cpp:354
+#, no-c-format
+msgid "Property Ruler actions"
+msgstr "Действия линейки свойств"
+
+#: rc.cpp:276
+#, no-c-format
+msgid "&Action"
+msgstr "&Действие"
+
+#: rc.cpp:279
+#, no-c-format
+msgid "General Toolbar"
+msgstr "Общая панель"
+
+#: rc.cpp:291
+#, no-c-format
+msgid "&Grid"
+msgstr "&Сетка"
+
+#: rc.cpp:300
+#, no-c-format
+msgid "&Segment"
+msgstr "&Сегмент"
+
+#: rc.cpp:361
+#, no-c-format
+msgid "Hide additional controls"
+msgstr "Спрятать дополнительные кнопки управления"
+
+#: rc.cpp:365
+#, no-c-format
+msgid "Panic Button"
+msgstr "Panic (снять все события)"
+
+#: rc.cpp:368
+#, no-c-format
+msgid "Resets all MIDI devices if you've got stuck notes"
+msgstr "Перезагружает все MIDI-устройства при \"проглатывании\" нот"
+
+#: rc.cpp:375
+#, no-c-format
+msgid "Provides a metronome click for you to play along with"
+msgstr "Включает метроном"
+
+#: rc.cpp:378
+#, no-c-format
+msgid "Shows MIDI activity in and out of Rosegarden"
+msgstr "Отображает MIDI-события в/вне Rosegarden"
+
+#: rc.cpp:381
+#, no-c-format
+msgid "IN"
+msgstr "В"
+
+#: rc.cpp:384
+#, no-c-format
+msgid "OUT"
+msgstr "ИЗ"
+
+#: rc.cpp:387 rc.cpp:390
+#, no-c-format
+msgid "NO EVENTS"
+msgstr "НЕТ СОБЫТИЙ"
+
+#: rc.cpp:397
+#, no-c-format
+msgid "Record either MIDI or audio"
+msgstr "Записать либо MIDI, либо звук"
+
+#: rc.cpp:401
+#, no-c-format
+msgid "Loop"
+msgstr "Цикл"
+
+#: rc.cpp:404
+#, no-c-format
+msgid "Turn on and off the loop markers (if set)"
+msgstr "Включить или выключить метки цикла (если установлены)"
+
+#: rc.cpp:411
+#, no-c-format
+msgid "Mutes all but the currently selected track"
+msgstr "Приглушает все дорожки кроме выбранных"
+
+#: rc.cpp:415
+#, no-c-format
+msgid "Start loop or range here"
+msgstr "Начать петлю или область здесь"
+
+#: rc.cpp:419
+#, fuzzy, no-c-format
+msgid "End loop or range here"
+msgstr "Начать петлю или область здесь"
+
+#: rc.cpp:422
+#, no-c-format
+msgid "SIG"
+msgstr "SIG"
+
+#: rc.cpp:425
+#, no-c-format
+msgid "DIV"
+msgstr "DIV"
+
+#: rc.cpp:428
+#, no-c-format
+msgid "/16"
+msgstr "/16"
+
+#: rc.cpp:431
+#, no-c-format
+msgid "TEMPO"
+msgstr "ТЕМП"
+
+#: rc.cpp:434
+#, no-c-format
+msgid "END"
+msgstr "КНЦ"
+
+#: rc.cpp:437
+#, no-c-format
+msgid "BAR"
+msgstr "ТАКТ"
+
+#: rc.cpp:441
+#, no-c-format
+msgid "Switch between real time, musical time, and frame count"
+msgstr "Переключиться между реальным временем, музыкальным кадрами"
+
+#: rc.cpp:445
+#, no-c-format
+msgid "Show additional controls"
+msgstr "Показать дополнительные кнопки управления"
+
+#: rc.cpp:449
+#, no-c-format
+msgid "Rewind"
+msgstr "Перемотать назад"
+
+#: rc.cpp:452
+#, no-c-format
+msgid "Moves the current pointer position back one bar."
+msgstr "Перемещает текущую позицию курсора на один такт назад."
+
+#: rc.cpp:456
+#, no-c-format
+msgid "Rewind to beginning"
+msgstr "Перемотать к началу композиции"
+
+#: rc.cpp:459
+#, no-c-format
+msgid ""
+"Moves the pointer position to the start of the composition. (This may mean "
+"going forwards if the pointer is currently before the start.)"
+msgstr ""
+"Перемещает текущую позицию курсора к концу композиции.\n"
+"(Если курсор уже находится в начале композиции, курсор\n"
+"переместится вперёд.)"
+
+#: rc.cpp:463
+#, no-c-format
+msgid "Play/Pause"
+msgstr "Воспроизвести/Приостановить"
+
+#: rc.cpp:466
+#, no-c-format
+msgid ""
+"Plays from the current pointer position, or pauses playback if already in "
+"progress."
+msgstr ""
+"Воспроизводит композицию начиная с текущей позиции курсора, либо "
+"приостанавливает воспроизведение."
+
+#: rc.cpp:473
+#, no-c-format
+msgid "Stops playback or recording."
+msgstr "Останавливает воспроизведение или запись"
+
+#: rc.cpp:477
+#, no-c-format
+msgid "Fast forward"
+msgstr "Перемотать вперёд"
+
+#: rc.cpp:480
+#, no-c-format
+msgid "Moves the current pointer position forwards one bar."
+msgstr "Перемещает текущую позицию курсора на один такт вперёд."
+
+#: rc.cpp:484
+#, no-c-format
+msgid "Fast forward to end"
+msgstr "Перемотать до конца"
+
+#: rc.cpp:487
+#, no-c-format
+msgid ""
+"Moves the pointer position to the end of the composition. (This may mean "
+"going backwards if the pointer is already beyond the end.)"
+msgstr ""
+"Перемещает текущую позицию курсора к концу композиции.\n"
+"(Если курсор уже находится в конце композиции, то курсор\n"
+"переместится назад.)"
+
+#: rc.cpp:491
+#, no-c-format
+msgid "Display time to end"
+msgstr "Показать время до конца"
+
+#: ../docs/en/tips.cpp:3
+msgid ""
+"<p>To configure a track to play using a particular instrument:</p>\n"
+"&nbsp;&nbsp;* click on the track label and hold a moment<br>\n"
+"&nbsp;&nbsp;* select an output device<br>\n"
+"&nbsp;&nbsp;* select one of that device's available instruments (#1 - #16)"
+"<br>\n"
+"&nbsp;&nbsp;* adjust that instrument's output channel, program, bank, and\n"
+"controllers via the instrument parameters box\n"
+msgstr ""
+"<p>Для назначения дорожке инструмента:</p>\n"
+"&nbsp;&nbsp;* щёлкните по имени дорожки мышью и удержите кнопку нажатой "
+"буквально секунду<br>\n"
+"&nbsp;&nbsp;* в появившемся меню выберите устройство выхода<br>\n"
+"&nbsp;&nbsp;* в субменю выберите один из доступных инструментов (#1 - #16)"
+"<br>\n"
+"&nbsp;&nbsp;* в панели свойств инструмента настройте канал выхода "
+"инструмента, программу, банк и контроллеры\n"
+
+#: ../docs/en/tips.cpp:13
+msgid ""
+"<p>...that Rosegarden has an autosave feature?<br><br>\n"
+"You can select your autosave interval from <b>Settings->Configure\n"
+"Rosegarden</b>.<br><br>\n"
+"When something goes awry, such as a power outage or a Rosegarden crash\n"
+"(unfortunately, it happens...) simply load the file you were working on, and "
+"you'll be given the\n"
+"option to load the autosaved version, or the unmodified original.</p>\n"
+msgstr ""
+"<p>...что в Rosegarden есть функция автоматического сохранения данных?"
+"<br><br>\n"
+"Вы можете выбрать интервал автосохранения в диалоге настройки\n"
+"Rosegarden (<b>Настройка -> Настроить Rosegarden...</b>).<br><br>\n"
+"При возникновении ЧП вроде внезапного отключения электроэнергии\n"
+"или незапланированного завершения сессии Rosegarden (бывает и такое)\n"
+"просто загрузите файл, над которым вы работали, и вам будет предложено\n"
+"на выбор загрузить либо автоматически сохранённый документ, либо его "
+"оригинал.</p>\n"
+
+#: ../docs/en/tips.cpp:23
+#, fuzzy
+msgid ""
+"<p>\n"
+"...that you can save the current document as your default studio by using\n"
+"<b>Composition -> Studio -> Save Current Document as Default Studio</b>?</"
+"p>\n"
+msgstr ""
+"<p>\n"
+"Вы можете сохранить текущий документ как стандартную Студию\n"
+"через меню <b>Композиция -> Студия -> Сохранить как стандартное\n"
+"описание студии</b>.</p>\n"
+
+#: ../docs/en/tips.cpp:30
+msgid ""
+"<p>...that your default studio is a complete Rosegarden composition that "
+"gets\n"
+"loaded every time you create a new document or import a MIDI file?</p>\n"
+msgstr ""
+"<p>...что ваше стандартное описание студии это целая композиция Rosegarden,\n"
+"которая загружается при каждом создании нового документа или импорте MIDI-"
+"файла?</p>\n"
+
+#: ../docs/en/tips.cpp:36
+#, fuzzy
+msgid ""
+"<p>...that your default studio can contain instrument assignments, document "
+"properties, LilyPond headers,\n"
+"and many other things?<br><br>The default studio is a complete Rosegarden "
+"composition, so it can contain anything that you may wish to have available "
+"in each\n"
+"new document you create.</p>\n"
+msgstr ""
+"<p>Поскольку стандартное описание студии является полноценной композицией\n"
+"в ней можно хранить стандартные привязки к инструментам, свойства "
+"документа,\n"
+"заголовки для LilyPond и многое другое, что вам нужно в каждой новой "
+"композиции.</p>\n"
+
+#: ../docs/en/tips.cpp:43
+#, fuzzy
+msgid ""
+"<p>...that Rosegarden will detect and create a default connection for ALSA "
+"soft\n"
+"synth applications that are started after Rosegarden is already running?</"
+"p>\n"
+msgstr ""
+"<p>...что Rosegarden определит и создаст стандартное соединение с \n"
+"программными синтезаторами для ALSA, которые будут запущены \n"
+"после Rosegarden?</html>\n"
+"</tip>\n"
+
+#: ../docs/en/tips.cpp:49
+msgid ""
+"<p>...that you can make your default studio override that in every "
+"Rosegarden composition you load?<br><br>If your studio setup does not change "
+"very often, and you would prefer for\n"
+"the settings in your default studio to take precedence over whatever\n"
+"studio is saved with any files you happen to load, you can make your studio "
+"the default for everything using <b>Settings -> Configure Rosegarden ->\n"
+"MIDI -> Always use default studio when loading files</b>.</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:57
+msgid ""
+"<p>If you have accidentally recorded a segment so short that it does not\n"
+"appear on the canvas, which you can only hear during subsequent recording\n"
+"sessions, you can gain access to it by using <b>Composition -> Change\n"
+"Composition Start and End</b> and then setting the composition to start at a "
+"negative number.</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:65
+#, fuzzy
+msgid ""
+"<p>...that if you place a note at the wrong pitch using the notation or "
+"matrix editor, you can move it one semitone at a time with the up and down "
+"arrow keys on your keyboard?</p>\n"
+msgstr ""
+"<p>...что если вы ошиблись с позиционированием ноты по высоте, вы можете "
+"легко сдвинуть её вверх или вниз клавишами со стрелками \"вверх\" и \"вниз"
+"\", каждым нажатием - на полутон?</p>\n"
+
+#: ../docs/en/tips.cpp:70
+msgid ""
+"<p>...that you can toggle stem directions in the notation editor by "
+"selecting\n"
+"one or more notes and using Ctrl-PageUp and Ctrl-PageDown?</p>\n"
+msgstr ""
+"<p>...что вы можете переключать направление штилей в нотном редакторе,\n"
+"выделив одну или несколько нот и нажимая Ctrl-PageUp или Ctrl-PageDown?</p>\n"
+
+#: ../docs/en/tips.cpp:76
+msgid ""
+"<p>...that you can change the accidental used for a note in the notation "
+"editor (without changing the pitch of the note) by selecting\n"
+"it and using the up and down arrow keys with both Ctrl and Shift pressed?</"
+"p>\n"
+msgstr ""
+"<p>...что если вы можете изменить знак альтерации для ноты в нотном "
+"редакторе (не изменяя высоту тона ноты), выбрав её\n"
+"и нажав клавишами со стрелками \"вверх\" и \"вниз\" вместе с Ctrl и Shift?</"
+"p>\n"
+
+#: ../docs/en/tips.cpp:82 ../docs/en/tips.cpp:93
+msgid ""
+"<p>...that you can hold down the Shift key while repositioning segments on "
+"the\n"
+"segment canvas in order to avoid the \"snap-to\" effect and exert finer "
+"control?</p>\n"
+msgstr ""
+"<p>...что вы можете избежать эффекта \"snap-to\", удерживая клавишу Shift\n"
+"при перемещении сегментов в канве?</p>\n"
+
+#: ../docs/en/tips.cpp:88
+msgid ""
+"<p>...that you can use the arrow tool to draw, move, and resize segments and "
+"events as well as to select them?<br><br>Drag a segment or event block to "
+"move it, drag the right edge of a block to resize it, and drag with the "
+"middle mouse button pressed to draw a new segment or event.<br><br>(Of "
+"course, the dedicated draw, move and resize tools are still quicker for "
+"repeated operations.)</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:99
+msgid ""
+"<p>...that you can hold down the Shift key while repositioning or resizing "
+"events in the\n"
+"matrix view in order to avoid the \"snap-to\" effect and exert finer control?"
+"</p>\n"
+msgstr ""
+"<p>...что вы можете избежать эффекта \"snap-to\", удерживая клавишу Shift\n"
+"при перемещении сегментов по канве, получив тем самым больший контроль?</p>\n"
+
+#: ../docs/en/tips.cpp:105
+msgid ""
+"<p>...that you can edit multiple segments on multiple tracks simultaneously "
+"in\n"
+"the notation editor? Simply select the segments, then use <b>Edit -> Open "
+"in Notation Editor</b>.</p>\n"
+msgstr ""
+"<p>...что вы можете редактировать один или несколько сегментов в одном\n"
+"или нескольких нотных редакторах? Выделите сегменты, а затем выберите "
+"<b>Сегменты > Открыть в нотном редакторе<b>.</p>\n"
+
+#: ../docs/en/tips.cpp:111
+msgid ""
+"<p>...that Rosegarden can export files for use by LilyPond, the high-quality "
+"score typesetting system?<br><br>\n"
+"From the <b>File</b> menu, navigate to <b>Export -> Export LilyPond File</"
+"b></p>\n"
+msgstr ""
+"<p>...что Rosegarden умеет экспортировать свои файлы проектов в формат "
+"LilyPond — системы высококачественной печати партитур?\n"
+"Воспользуйтесь меню <b>Файл -> Экспортировать -> Экспортировать в партитуру "
+"LilyPond</b></p>\n"
+
+#: ../docs/en/tips.cpp:117
+#, fuzzy
+msgid ""
+"<p>...that Rosegarden can print via LilyPond, the high-quality score "
+"typesetting system?<br><br>\n"
+"From the <b>File</b> menu, navigate to <b>Preview with LilyPond</b>. The "
+"file\n"
+"will be exported, rendered, and a preview will appear in KPDF, or one of\n"
+"several other PDF viewers, where it can then be printed as well.</p>\n"
+msgstr ""
+"<p>...что Rosegarden умеет экспортировать свои файлы проектов в формат "
+"LilyPond — системы высококачественной печати партитур?\n"
+"Воспользуйтесь меню <b>Файл -> Экспортировать -> Экспортировать в партитуру "
+"LilyPond</b></p>.\n"
+"Файл будет экспортирован, преобразован и его показан в KGhostView или "
+"одном \n"
+"из других доступных в системе просмотрщиков PDF, откуда его партитуру можно "
+"будет и напечатать\n"
+
+#: ../docs/en/tips.cpp:125
+msgid ""
+"<p>...that if you use the quantizer from within the notation view, you can "
+"tell it to quantize only the timing used for notation -- making it possible "
+"to have good looking notation <b>and</b> a human MIDI performance?</p>\n"
+msgstr ""
+"<p>...что если использовать квантователь из окна редактора партитуры, "
+"квантование будет доступно только для тайминга нотации, что, однако, "
+"позволит получить красиво выглядящую партитуру <b>и</b> более живое "
+"исполнение MIDI?</p>\n"
+
+#: ../docs/en/tips.cpp:130
+msgid ""
+"<p>...that you can change segment labels using the controls on the Segment "
+"Parameters box\n"
+"in the main window?</p>\n"
+msgstr ""
+"<p>...что вы можете изменить метки сегментов из панели «Параметры сегмента»\n"
+"в главном окне программы?</p>\n"
+
+#: ../docs/en/tips.cpp:136
+msgid ""
+"<p>...that the number of tracks in new documents is based on the contents "
+"of\n"
+"your autoload.rg file?\n"
+"<br><br>\n"
+"Whether you prefer to start with three tracks or 43, create a document that\n"
+"contains the desired number of tracks, plus any other studio or document "
+"properties settings\n"
+"you wish to configure, and use <b>Composition -> Studio -> Save Current "
+"Document as Default\n"
+"Studio</b> to make this your new default.</p>\n"
+msgstr ""
+"<p>...что количество дорожек в новых проектах определяется \n"
+" в файле autoload.rg file?\n"
+"<br><br>\n"
+"Создайте новый проект, в котором будет нужное вам по умолчанию \n"
+"количество дорожек, добавьте необходимые настройки Студии и \n"
+"воспользуйтесь функцией <b>Композиция -> Студия -> Сохранить как \n"
+"стандартное описание Студии</b> для того, чтобы все новые проекты \n"
+"создавались по этому образцу.</p>\n"
+
+#: ../docs/en/tips.cpp:147
+msgid ""
+"<p>...that you can change the name of a track by double clicking on the "
+"label? (The\n"
+"label must be visible for this to work.)</p>\n"
+msgstr ""
+"<p>...что вы можете изменить имя дорожки, вызвав соответствующий диалог\n"
+"двойным щелчком по метке? (Отображение меток должно быть включено.)</p>\n"
+
+#: ../docs/en/tips.cpp:153
+#, fuzzy
+msgid ""
+"<p>...that you can configure what happens when you double-click on a segment?"
+"<br><br>Go to <b>Settings -> Configure Rosegarden</b> and choose your "
+"preferred editing window under the <b>Behaviour</b> tab.</p>\n"
+msgstr ""
+"<p>...что вы можете настроить реакцию на двойной щелчок по сегменту? Зайдите "
+"в диалог <b>Настройка -> Настроить Rosegarden...</b> и выберите "
+"предпочитаемый вами способ редактирования нотации во вкладке <b>Поведение</"
+"b>.</p>\n"
+
+#: ../docs/en/tips.cpp:158
+msgid ""
+"<p>...that Rosegarden is being developed as a community effort with\n"
+"contributions from around the world?<br><br>\n"
+"The four most active developers live in London (England), Cannes, "
+"Barcelona,\n"
+"and... Christiansburg? (Christiansburg is a town of about 50,000 in\n"
+"southwestern Virginia, USA.)<br><br>\n"
+"We have had contributors from elsewhere in the US, UK, Spain, Mexico, "
+"Argentina, Germany,\n"
+"Sweden, Russia, Japan, Finland, and Italy, just to name a few...</p>\n"
+msgstr ""
+"<p>...что Rosegarden — международная разработка, участие в которой принимают "
+"программисты со всего мира?<br><br>\n"
+"Основные разработчики живут в Лондоне, Каннах, Барселоне и... "
+"Кристиансбурге? \n"
+"(Кристиансбург — это город с населением примерно в 50 000 человек на юго-"
+"западе Вирджинии, США)<br><br>\n"
+"Остальные участники проекта находятся в разных частях США, в "
+"Великобритании, \n"
+"Испании, Мексике, Аргентине, Германии, Швеции, России, Японии, Финляндии и "
+"Италии, и это ещё не предел... </p>\n"
+
+#: ../docs/en/tips.cpp:169
+msgid ""
+"<p>...that Rosegarden is available in Spanish, French, German, Russian, "
+"Welsh, Swedish, Italian and Estonian\n"
+"translations? (Just to name a few.)<br><br>\n"
+"If you're interested in translating Rosegarden to another language, drop us "
+"a\n"
+"line at <b>[email protected]</b>.</p>\n"
+msgstr ""
+"<p>...что Rosegarden переведён на испанский, французский, немецкий, "
+"русский, \n"
+"уэльский, шведский, итальянский и эстонский языки?<br><br>\n"
+"Хотите перевести Rosegarden на свой родной язык? Напишите нам об этом \n"
+"по адресу <b>[email protected]</b>.</p>\n"
+
+#: ../docs/en/tips.cpp:177
+msgid ""
+"<p>...that you can change the total number of bars in the composition via\n"
+"<b>Composition -> Change Composition Start and End</b>?</p>\n"
+msgstr ""
+"<p>...что вы можете изменить общее число тактов в композиции при \n"
+"помощи функции <b>Композиция-> Изменить начало и конец композиции...</b>?</"
+"p>\n"
+
+#: ../docs/en/tips.cpp:183
+msgid ""
+"<p>...that you can see the difference between performance and display "
+"duration\n"
+"of duration-quantized notes in the notation editor?<br><br>\n"
+"Use <b>Settings -> Show Raw Note Ruler</b> to turn on this handy\n"
+"feature.<br><br>\n"
+"<i>Note that this feature does not work in page layout view.</i></p>\n"
+msgstr ""
+"<p>...что вы можете видеть разницу между исполнением и отображением \n"
+"длительности квантованных по продолжительности нот в редакторе партитур?"
+"<br><br>\n"
+"Используйте <b>Настройки -> Показать линейку исполняемых нот</b> для того, \n"
+"чтобы включить эту отличную функцию.<br><br>\n"
+"<i>Обратите внимание на то, что в страничном представлении эта функция \n"
+"не работает.</i></p>\n"
+
+#: ../docs/en/tips.cpp:192
+msgid ""
+"<p>...that you can add tempo and time-signature changes by double-clicking "
+"on the values displayed in the transport window or tempo rulers?</p>\n"
+msgstr ""
+"<p>...что вы можете добавить изменение темпа и размера двойным щелчком \n"
+"мыши по значениям, отображённым в окне транспорта или линейках темпа?</p>\n"
+
+#: ../docs/en/tips.cpp:197
+#, fuzzy
+msgid ""
+"<p>...that the transport window can display musical time, sample frame "
+"count, and a visual metronome as well as real time?<br><br>Just click on the "
+"small button at the extreme top left of the window.</p>\n"
+msgstr ""
+"<p>...что окно транспорта может отображать время по тактам и долям "
+"(музыкальное время), а также 24-fps кадры SMPTE, равно как и реальное время "
+"и даже визуальный метроном? Для переключения между этими режимами щёлкайте "
+"по небольшой кнопке слева в самом верху окна.</p>\n"
+
+#: ../docs/en/tips.cpp:202
+#, fuzzy
+msgid ""
+"<p>...that you can select all notes of a particular pitch in the matrix "
+"view, by shift-clicking on that pitch on the piano keyboard at the left?"
+"<br><br>If you shift-click-drag, you can select whole ranges too.</p>\n"
+msgstr ""
+"<p>...то вы можете выбрать все ноты одинаковой высоты в матричном редакторе, "
+"удерживая Shift и щёлкая мышкой по соответствующей клавише на клавиатуре "
+"слева? Удерживая Shift и совершая перетаскивающее движение мышью, можно "
+"выделять целые области.</p>\n"
+
+#: ../docs/en/tips.cpp:207
+#, fuzzy
+msgid ""
+"<p>...that you can set a loop in the main window by clicking-and-dragging on "
+"the time ruler with Shift pressed?<br><br>(If the ruler isn't visible, use "
+"<b>Settings -> Show Rulers</b>.)</p>\n"
+msgstr ""
+"Что вы можете установить \"петлю\" в главном окне щелчком и перетаскиванием "
+"по линейке временем с удерживаемой клавишей Shift? (Если линейка не видна, "
+"выберите <b>Настройки -> Линейки -> Показать линейку позиции "
+"воспроизведения</b>.)</p>\n"
+
+#: ../docs/en/tips.cpp:212
+#, fuzzy
+msgid ""
+"<p>...that if you're editing a section in the matrix or notation view, you "
+"can\n"
+"set that section to loop while you edit it?<br><br>Select it and use "
+"<b>Tools ->\n"
+"Local Cursor -> Set Loop to Selection</b>, then hit Play.</p><br><br>\n"
+"<i>This feature does not work quite as well for compositions that include "
+"sampled\n"
+"audio.</i>\n"
+msgstr ""
+" <p>...что пока вы редактируете данные в матричном или нотном редакторе, "
+"эти \n"
+"данные можно превратить в «петлю» прямо во время редактирования? Выделите \n"
+"их и используйте <b>Сервис -> Местный курсор -> Зациклить выделение</b>, а "
+"затем \n"
+"нажмите кнопку воспроизведения.</p>\n"
+
+#: ../docs/en/tips.cpp:221
+msgid ""
+"<p>...if you have more than one note or controller event at the same time, "
+"you\n"
+"can use the [ and ] keys to flip the stack of events around on the "
+"controller\n"
+"and velocity rulers in order to bring the item you wish to adjust into\n"
+"focus.</p>\n"
+msgstr ""
+"<p>...что для доступа к одному из одновременно располагающихся \n"
+"контроллеров или нот нужно воспользоваться клавишами \"[\" и \"]\" \n"
+"над линейкой контроллера или силы нажатия\n"
+
+#: ../docs/en/tips.cpp:229
+msgid ""
+"<p>...that the notation view shows you notes using their display duration, "
+"while the\n"
+"matrix allows you to edit their performance duration?<br><br>\n"
+"<i>Be careful with tied notes in the matrix. It is not apparent that they "
+"are\n"
+"tied, and if you split up a pair of tied notes, subsequent notation views "
+"will\n"
+"be confused and unhappy. This is an old bug that has been on our TODO list\n"
+"for years. Sorry about that, folks. Patches welcome.</i>\n"
+"</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:240
+msgid ""
+"<p>If you're working with a human performance and you need to insert some "
+"new\n"
+"notes, these new notes will sound for their entire written duration. To "
+"blend\n"
+"these new notes into a human performance, select them, then use <b>Adjust -> "
+"Interpret...</b> \n"
+"from the notation view to interpret any marks and massage their "
+"performance\n"
+"durations to something less mechanical.</p>\n"
+msgstr ""
+"<p>Если вы работаете с записанной вживую партией, и вам нужно \n"
+"вставить в неё несколько нот, их длительность будет слишком правильной.\n"
+"Для уестествления их звучания их необходимо выбрать, а затем \n"
+"через меню <b>Коррекция→Интерпретировать...</b> \n"
+"в редакторе партитуры запустить процедуру подстройки длительности \n"
+"вставленных нот под манеру исполнения.</p>\n"
+
+#: ../docs/en/tips.cpp:249
+msgid ""
+"<p>...that Rosegarden can export certain things to LilyPond that it cannot "
+"yet\n"
+"display within its own native interface?<br><br>These new directives can be "
+"inserted\n"
+"via the <b>T</b> text insert tool in the notation view.<br><br>\n"
+"Load the example files\n"
+"<b>lilypond-alternative-endings.rg</b> and <b>lilypond-directives.rg</b> for "
+"a\n"
+"demonstration of how to use the new exportable directives.<br><br>\n"
+"Use <b>File -> Preview with\n"
+"LilyPond</b> to see what they look like on the exported page.<br><br>\n"
+"<i>Be sure to turn on\n"
+"<b>Settings -> Show LilyPond Directives</b> and <b>Show Annotations</b> "
+"within\n"
+"the notation view.</i></p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:264
+msgid ""
+"<p>...that Rosegarden has track parameters allowing you to <b>Create "
+"segments with:</b> certain\n"
+"properties by default?<br><br>You can pre-select the clef, transposition, "
+"colour, and specify\n"
+"the highest and lowest playable notes (notes outside this range display in\n"
+"red by default). Then draw a segment with the pencil, or record one, and "
+"any\n"
+"new segments created on this track will take these properties as segment\n"
+"parameters.<br><br>\n"
+"<i>These parameters do not apply to audio tracks.</i></p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:275
+msgid ""
+"<p>...that Rosegarden has a database of preset parameters describing more "
+"than 300\n"
+"musical instruments from the real world, grouped into several convenient\n"
+"categories?<br><br>Each preset contains a clef, transposition, and playable "
+"range\n"
+"suggestions for both amateur and professional players.<br><br>Click the\n"
+"<b>Load</b> button in the new track parameters box to get started! <i>(If "
+"you\n"
+"do not see a <b>Load</b> button, be sure your parameter panel is set for\n"
+"tabbed mode, rather than stacked mode.)</i> <br><br> <i>(Special thanks to "
+"Magnus\n"
+"Johansson for assembling this extraordinary database.)</i></p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:287
+msgid ""
+"<p>...that when exporting to Lilypond, you can merge tracks that have the "
+"same name onto a single staff?<br><br>For example, if there are three voices "
+"in a single part, write each\n"
+"voice as an independent segment/staff, each on a separate track. Give all\n"
+"three tracks the same name, and select <b>[x] Merge tracks that have the "
+"same\n"
+"name</b> from the options dialog that appears when you export to, or "
+"preview\n"
+"with LilyPond.<br><br>\n"
+"<i>The tracks must have a non-default name for this to work.</i></p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:297
+msgid ""
+" \t \n"
+"<p>...that you can use the mouse wheel to scroll up and down, scroll left "
+"and right, and zoom in and out?<br><br>Just roll the wheel to scroll up or "
+"down. Hold Alt as well to scroll left or right, or hold Ctrl to zoom in and "
+"out.</p> \t \n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:303
+msgid ""
+" \t \n"
+"<p>...that you can time-stretch an audio segment -- stretching or squashing "
+"a\n"
+"sample to a different duration without changing its pitch -- just by\n"
+"dragging its right edge with the Ctrl key pressed?</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:311
+msgid ""
+" \t \n"
+"<p>...that you can add audio to your Rosegarden composition just by dragging "
+"an audio file from your file manager and dropping it on the Rosegarden "
+"segment canvas? (Make sure you drop it on an audio track!)<br><br>You can "
+"also drop audio files from Rosegarden's audio file manager window onto the "
+"segment canvas, and from other programs onto the audio file manager.</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:317
+msgid ""
+" \t \n"
+"<p>...that you can set the tempo to match the duration of an audio segment "
+"if you know it's an exact number of bars or beats long?<br><br>Just select "
+"the audio segment and use <b>Composition -> Tempo and Time Signature -> Set "
+"Tempo to Audio Segment Duration</b>.</p>\n"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:1
+msgid "Feta Pixmaps"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:2 ../data/fonts/mappings/fonts.cpp:7
+msgid "GNU Lilypond"
+msgstr "GNU Lilypond"
+
+#: ../data/fonts/mappings/fonts.cpp:3 ../data/fonts/mappings/fonts.cpp:8
+msgid "Copyright (c) 1997--2003 Han-Wen Nienhuys and Jan Nieuwenhuizen"
+msgstr "Авторские права (c) 1997--2003 Han-Wen Nienhuys и Jan Nieuwenhuizen"
+
+#: ../data/fonts/mappings/fonts.cpp:4 ../data/fonts/mappings/fonts.cpp:9
+#: ../data/fonts/mappings/fonts.cpp:14 ../data/fonts/mappings/fonts.cpp:19
+#: ../data/fonts/mappings/fonts.cpp:24 ../data/fonts/mappings/fonts.cpp:29
+#: ../data/fonts/mappings/fonts.cpp:34 ../data/fonts/mappings/fonts.cpp:39
+#: ../data/fonts/mappings/fonts.cpp:44 ../data/fonts/mappings/fonts.cpp:49
+#: ../data/fonts/mappings/fonts.cpp:54
+msgid "Chris Cannam"
+msgstr "Chris Cannam"
+
+#: ../data/fonts/mappings/fonts.cpp:5 ../data/fonts/mappings/fonts.cpp:40
+msgid "pixmap"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:6
+msgid "Feta"
+msgstr "Feta"
+
+#: ../data/fonts/mappings/fonts.cpp:10 ../data/fonts/mappings/fonts.cpp:15
+#: ../data/fonts/mappings/fonts.cpp:20 ../data/fonts/mappings/fonts.cpp:25
+#: ../data/fonts/mappings/fonts.cpp:30 ../data/fonts/mappings/fonts.cpp:35
+#: ../data/fonts/mappings/fonts.cpp:45 ../data/fonts/mappings/fonts.cpp:50
+#: ../data/fonts/mappings/fonts.cpp:55
+msgid "scalable"
+msgstr "масштабируемый"
+
+#: ../data/fonts/mappings/fonts.cpp:11
+msgid "Fughetta"
+msgstr "Fughetta"
+
+#: ../data/fonts/mappings/fonts.cpp:12
+msgid ""
+"Created by Blake Hodgetts; freely redistributable. See http://www.efn.org/"
+"~bch/aboutfonts.html"
+msgstr ""
+"Создан Blake Hodgetts; свободно распространяем. См. http://www.efn.org/~bch/"
+"aboutfonts.html"
+
+#: ../data/fonts/mappings/fonts.cpp:13
+msgid "Copyright 1995-1999 Blake Hodgetts"
+msgstr "Авторские права 1995-1999 Blake Hodgetts"
+
+#: ../data/fonts/mappings/fonts.cpp:16
+msgid "Inkpen"
+msgstr "Inkpen"
+
+#: ../data/fonts/mappings/fonts.cpp:17
+msgid "Inkpen is part of Sibelius, but other fonts may use the same mappings."
+msgstr ""
+"Inkpen является частью Sibelius, но у других шрифтов может быть такое же "
+"отображение."
+
+#: ../data/fonts/mappings/fonts.cpp:18 ../data/fonts/mappings/fonts.cpp:28
+msgid "Copyright Sibelius Software Ltd"
+msgstr "Авторские права Sibelius Software Ltd"
+
+#: ../data/fonts/mappings/fonts.cpp:21
+msgid "Maestro"
+msgstr "Maestro"
+
+#: ../data/fonts/mappings/fonts.cpp:22
+msgid "Maestro is part of Finale, but other fonts use the same mappings."
+msgstr ""
+"Maestro является частью Finale, но у других шрифтов может быть такое же "
+"отображение."
+
+#: ../data/fonts/mappings/fonts.cpp:23 ../data/fonts/mappings/fonts.cpp:33
+msgid "Copyright Coda Inc"
+msgstr "Авторские права Coda Inc"
+
+#: ../data/fonts/mappings/fonts.cpp:27
+msgid "Opus is part of Sibelius, but other fonts may use the same mappings."
+msgstr ""
+"Opus является частью Sibelius, но другие шрифтов может быть такое же "
+"отображение."
+
+#: ../data/fonts/mappings/fonts.cpp:31
+msgid "Petrucci"
+msgstr "Petrucci"
+
+#: ../data/fonts/mappings/fonts.cpp:32
+msgid "Petrucci is part of Finale, but other fonts use the same mappings."
+msgstr ""
+"Petrucci является частью Finale, но у других шрифтов может быть такое же "
+"отображение."
+
+#: ../data/fonts/mappings/fonts.cpp:36
+msgid "RG21"
+msgstr "RG21"
+
+#: ../data/fonts/mappings/fonts.cpp:37
+msgid "Rosegarden 2.1"
+msgstr "Rosegarden 2.1"
+
+#: ../data/fonts/mappings/fonts.cpp:38
+msgid "Copyright (c) 1994--2001 Chris Cannam"
+msgstr "Авторские права (c) 1994--2001 Chris Cannam"
+
+#: ../data/fonts/mappings/fonts.cpp:41
+msgid "Sonata"
+msgstr "Sonata"
+
+#: ../data/fonts/mappings/fonts.cpp:42
+msgid "Adobe"
+msgstr "Adobe"
+
+#: ../data/fonts/mappings/fonts.cpp:43
+msgid "Copyright Adobe Inc"
+msgstr "Авторские права Adobe Inc"
+
+#: ../data/fonts/mappings/fonts.cpp:46
+msgid "Steinberg"
+msgstr "Steinberg"
+
+#: ../data/fonts/mappings/fonts.cpp:47
+msgid "The Steinberg Notation font is part of Cubase."
+msgstr "Шрифт Steinberg Notation является частью Cubase."
+
+#: ../data/fonts/mappings/fonts.cpp:48
+msgid "Copyright Steinberg Inc"
+msgstr "Авторские права Steinberg Inc"
+
+#: ../data/fonts/mappings/fonts.cpp:51
+msgid "Xinfonia"
+msgstr "Xinfonia"
+
+#: ../data/fonts/mappings/fonts.cpp:52
+msgid "xemo.org"
+msgstr "xemo.org"
+
+#: ../data/fonts/mappings/fonts.cpp:53
+msgid "Copyright 2001-2003 Xemus Software LLC"
+msgstr "Авторские права 2001-2003 Xemus Software LLC"
+
+#: ../data/styles/styles.cpp:1
+msgid "Classical"
+msgstr "Классические"
+
+#: ../data/styles/styles.cpp:2
+msgid "Cross"
+msgstr "Крестовые"
+
+#: ../data/styles/styles.cpp:3
+msgid "Mensural"
+msgstr "Мензуральные"
+
+#: ../data/styles/styles.cpp:4
+msgid "Triangle"
+msgstr "Треугольные"
+
+#, fuzzy
+#~ msgid "Set Quick Marker"
+#~ msgstr "Удалить маркер"
+
+#~ msgid "Make &Grace Notes"
+#~ msgstr "Создать &форшлаг"
+
+#~ msgid " Triplet Chord"
+#~ msgstr " Триольный аккорд "
+
+#~ msgid " Chord"
+#~ msgstr " Аккорд"
+
+#~ msgid " Triplet"
+#~ msgstr " Триоль"
+
+#~ msgid "Making grace notes..."
+#~ msgstr "Создаются форшлаги..."
+
+#~ msgid "Making non-grace notes..."
+#~ msgstr "Удаляются форшлаги..."
+
+#~ msgid ""
+#~ "\n"
+#~ "Preset : %1"
+#~ msgstr ""
+#~ "\n"
+#~ "Предустановка: %1"
+
+#~ msgid "Marker name "
+#~ msgstr "Имя маркера "
+
+#~ msgid "Add staff group bracket"
+#~ msgstr "Добавлять акколаду"
+
+#~ msgid "&Halve Speed"
+#~ msgstr "У&половинить скорость"
+
+#~ msgid "&Double Speed"
+#~ msgstr "У&двоить скорость"
+
+#~ msgid "Halving speed..."
+#~ msgstr "Скорость уполовинивается..."
+
+#~ msgid "Doubling speed..."
+#~ msgstr "Скорость удваивается..."
+
+#~ msgid "Time Signature font"
+#~ msgstr "Шрифт размера"
+
+#~ msgid ""
+#~ "<h3>Project Packager not available</h3><p>Rosegarden could not run the "
+#~ "Project Packager.</p><p>Export and import of Rosegarden Project files "
+#~ "will not be available.</p>"
+#~ msgstr ""
+#~ "<h3>Упаковщик проектов недоступен</h3><p>Rosegarden не удалось запустить "
+#~ "Упаковщик проектов.</p><p>Импорт и экспорт проектов Rosegarden работать "
+#~ "не будет.</p>"
+
+#~ msgid ""
+#~ "<h3>Project Packager not available</h3><p>Rosegarden could not find one "
+#~ "or more of the additional programs needed to support the Rosegarden "
+#~ "Project Packager.</p><p>Export and import of Rosegarden Project files "
+#~ "will not be available.<p><p>To fix this, you should install the following "
+#~ "additional programs:</p>"
+#~ msgstr ""
+#~ "<h3>Упаковщик проектов недоступен</h3><p>Rosegarden не удалось найти одну "
+#~ "или несколько программ для поддержки Упаковщика проектов.</p><p>Импорт и "
+#~ "экспорт проектов Rosegarden работать не будет.</p><p>Чтобы исправить это, "
+#~ "вам необходимо установить следующие программы:</p>"
+
+#~ msgid ""
+#~ "<h3>LilyPond Preview not available</h3><p>Rosegarden could not find one "
+#~ "or more of the additional programs needed to support the LilyPond "
+#~ "previewer.</p><p>Notation previews through LilyPond will not be available."
+#~ "</p><p>To fix this, you should install the following additional programs:"
+#~ "</p>"
+#~ msgstr ""
+#~ "<h3>Просмотр через LilyPond невозможен</h3><p>Rosegarden не удалось найти "
+#~ "одну или более программы для поддержки просмотра через LilyPond.</"
+#~ "p><p>Просмотр партитуры, создаваемый LilyPond, недоступен.</p><p>Чтобы "
+#~ "исправить это, установите следующие дополнительные программы:</p>"
+
+#, fuzzy
+#~ msgid "LilyPond previews not available"
+#~ msgstr "Параметры предосмотра Lilypond"
+
+#, fuzzy
+#~ msgid "Audio file importer not available"
+#~ msgstr "Буфер записи звуковых файлов"
+
+#~ msgid ""
+#~ "<h2>Welcome to Rosegarden!</h2><p>Welcome to the Rosegarden audio and "
+#~ "MIDI sequencer and musical notation editor.</p><p>Rosegarden was brought "
+#~ "to you by a team of volunteers across the world. To learn more about "
+#~ "Rosegarden, see <a href=\"http://www.rosegardenmusic.com/\">http://www."
+#~ "rosegardenmusic.com/</a>, or see the Help menu for tutorials and other "
+#~ "information.</p>"
+#~ msgstr ""
+#~ "<h2>Добро пожаловать в Rosegarden!</h2><p>Добро пожаловать в аудио-/MIDI-"
+#~ "секвенсер и нотный редактор Rosegarden.</p><p>Rosegarden был создан для "
+#~ "вас командой добровольцев со всего света. Подробнее о Rosegarden вы "
+#~ "можете узнать на сайте <a href=\"http://www.rosegardenmusic.com/\">http://"
+#~ "www.rosegardenmusic.com/</a>, либо из меню «Справка».</p>"
+
+#~ msgid "Make subsequent bar lines hidden"
+#~ msgstr "Спрятать последующие черты делений"
+
+#, fuzzy
+#~ msgid "Extra options"
+#~ msgstr "Внешние редакторы"
+
+#~ msgid "&Add Multiple Tracks..."
+#~ msgstr "Добавить &несколько дорожек..."
+
+#~ msgid "Add Multiple Tracks"
+#~ msgstr "Добавка нескольких дорожек"
+
+#~ msgid "&Split..."
+#~ msgstr "&Разделить..."
+
+#~ msgid "Change Te&mpo..."
+#~ msgstr "С&менить темп..."
+
+#~ msgid "&Restore Computed Accidentals"
+#~ msgstr "&Восстановить рассчитанные знаки альтерации"
+
+#~ msgid "LilyPond export/preview options"
+#~ msgstr "Параметры экспорта/предосмотра в Lilypond"
+
+#~ msgid "LilyPond 2.6"
+#~ msgstr "LilyPond 2.6"
+
+#~ msgid "LilyPond 2.8"
+#~ msgstr "LilyPond 2.8"
+
+#, fuzzy
+#~ msgid "LilyPond 2.12"
+#~ msgstr "LilyPond 2.2"
+
+#~ msgid "Export Document Properties as \\header block"
+#~ msgstr "Экспортировать свойства документа как \\header block"
+
+#, fuzzy
+#~ msgid "prime"
+#~ msgstr "Время"
+
+#, fuzzy
+#~ msgid " and 1 octave"
+#~ msgstr "Октавой выше"
+
+#, fuzzy
+#~ msgid " and %1 octaves"
+#~ msgstr "%1 октавой выше"
+
+#, fuzzy
+#~ msgid "Transpose by Interval"
+#~ msgstr "Транспозиция"
+
+#~ msgid "Manage Files Associated with A&udio Segments"
+#~ msgstr "&Звуковые файлы проекта..."
+
+#~ msgid "Split Segments at Time"
+#~ msgstr "Разделить сегменты по времени"
+
+#~ msgid "Split Segment at Time"
+#~ msgstr "Разделить сегмент по времени"
+
+#~ msgid "Event List"
+#~ msgstr "Список событий"
+
+#~ msgid "Enable auto-save"
+#~ msgstr "Включить автосохранение"
+
+#~ msgid "Auto-save"
+#~ msgstr "Автосохранение"
+
+#~ msgid "Show detailed status"
+#~ msgstr "Показать подробности о статусе"
+
+#~ msgid "JACK command (including path as necessary)"
+#~ msgstr "Команда для запуска JACK (с путём к нему, при необходимости)"
+
+#~ msgid ""
+#~ "Longer buffers usually improve playback quality, but use more memory and "
+#~ "slow response."
+#~ msgstr ""
+#~ "Буферы большего размера улучшают качество воспроизведения, \n"
+#~ "но используют больше памяти и менее отзывчивы."
+
+#~ msgid "Event read-ahead"
+#~ msgstr "Предсчитывание событий"
+
+#~ msgid "Audio mix buffer"
+#~ msgstr "Буфер смешивания звука"
+
+#~ msgid "Audio file read buffer"
+#~ msgstr "Буфер чтения звуковых файлов"
+
+#~ msgid "Audio file write buffer"
+#~ msgstr "Буфер записи звуковых файлов"
+
+#~ msgid "Per-file limit for cacheable audio files"
+#~ msgstr ""
+#~ "Пофайловое ограничение для \n"
+#~ "кэшируемых звуковых файлов"
+
+#~ msgid "20 msec"
+#~ msgstr "20 мс"
+
+#~ msgid "5 sec"
+#~ msgstr "5 с"
+
+#~ msgid "per file"
+#~ msgstr "на файл"
+
+#~ msgid "32KB"
+#~ msgstr "32 Кбайт"
+
+#~ msgid "32MB"
+#~ msgstr "32 Мбайт"
+
+#~ msgid "Audio mix and monitor mode:"
+#~ msgstr "Режим сведения и мониторинга звука:"
+
+#~ msgid "Low latency"
+#~ msgstr "Низкая латентность"
+
+#~ msgid "Buffered"
+#~ msgstr "Через буфер"
+
+#~ msgid "Create post-fader outputs for audio instruments"
+#~ msgstr "Создать пост-фейдерные выходы для звуковых инструментов"
+
+#~ msgid "Create post-fader outputs for submasters"
+#~ msgstr "Создать пост-фейдерные выходы для субмастеров"
+
+#~ msgid "Record and Mix"
+#~ msgstr "Запись и сведение"
+
+#~ msgid "JACK transport mode"
+#~ msgstr "Режим JACK-транспорта"
+
+#~ msgid "Sync"
+#~ msgstr "Синхронизировать"
+
+#~ msgid "Synchronisation"
+#~ msgstr "Синхронизация"
+
+#~ msgid "%1 msec / %2 KB %3"
+#~ msgstr "%1 мс / %2 Кбайт %3"
+
+#~ msgid "%1 msec / %2 MB %3"
+#~ msgstr "%1 мс / %2 Мбайт %3"
+
+#~ msgid "%1 sec / %2 KB %3"
+#~ msgstr "%1 с / %2 Кбайт %3"
+
+#~ msgid "%1 sec / %2 MB %3"
+#~ msgstr "%1 с / %2 Мбайт %3"
+
+#~ msgid "%1 msec"
+#~ msgstr "%1 мс"
+
+#~ msgid "%1 sec"
+#~ msgstr "%1 с"
+
+#~ msgid "%1 KB"
+#~ msgstr "%1 Кбайт"
+
+#~ msgid "%1 MB"
+#~ msgstr "%1 Мбайт"
+
+#~ msgid "Other fonts"
+#~ msgstr "Другие шрифты"
+
+#~ msgid "Rescan available fonts"
+#~ msgstr "Перечитать доступные шрифты"
+
+#~ msgid ""
+#~ "Rosegarden can apply automatic quantization to recorded or imported MIDI "
+#~ "data for notation purposes only. This does not affect playback, and does "
+#~ "not affect editing in any of the views except notation."
+#~ msgstr ""
+#~ "Rosegarden может автоматически квантовать записываемые или\n"
+#~ "импортируемые MIDI-данные исключительно к контексте нотации.\n"
+#~ "Это никак не повлияет на воспроизведение, а на редактирование\n"
+#~ "данных -- только в режиме нотного редактора."
+
+#~ msgid "Sequencer"
+#~ msgstr "Секвенсер"
+
+#~ msgid "Sequencer Settings"
+#~ msgstr "Параметры секвенсера"
+
+#~ msgid "Audio auto-fade"
+#~ msgstr "Звуковой автофейд"
+
+#~ msgid "Fade in"
+#~ msgstr "Нарастание"
+
+#~ msgid "Fade out"
+#~ msgstr "Затухание"
+
+#~ msgid "Range"
+#~ msgstr "Диапазон"
+
+#~ msgid "High: ---"
+#~ msgstr "Высокая: ---"
+
+#~ msgid "Low: ----"
+#~ msgstr "Низкая: ----"
+
+#~ msgid " ms"
+#~ msgstr "мс"
+
+#~ msgid "&Fretboard"
+#~ msgstr "&Табулатура"
+
+#~ msgid "Restore &Computed Positions"
+#~ msgstr "&Восстановить рассчитанные позиции"
+
+#~ msgid "&Tempo and Time Signature"
+#~ msgstr "&Темп и тактовый размер"
+
+#~ msgid "&Editor Tools"
+#~ msgstr "&Инструменты редактора"
+
+#~ msgid "&Beams"
+#~ msgstr "&Группы"
+
+#~ msgid "&Indications"
+#~ msgstr "&Индикация"
+
+#~ msgid "Trip&lets and Tuplets"
+#~ msgstr "Триоли и &группы"
+
+#~ msgid "S&tem Direction"
+#~ msgstr "Направление &штилей"
+
+#~ msgid "&Clear"
+#~ msgstr "О&чистить"
+
+#~ msgid "A&dd Alias"
+#~ msgstr "&Добавить псевдоним"
+
+#~ msgid "C&ancel"
+#~ msgstr "О&тмена"
+
+#~ msgid "&Ok"
+#~ msgstr "&ОК"
+
+#~ msgid "Toggle &Mode"
+#~ msgstr "Переключить &режим"
+
+#~ msgid "Scale"
+#~ msgstr "Лад"
+
+#~ msgid "Modifier"
+#~ msgstr "Модификатор"
+
+#~ msgid "Suffix"
+#~ msgstr "Суффикс"
+
+#~ msgid "&New"
+#~ msgstr "&Создать"
+
+#~ msgid "Fingering"
+#~ msgstr "Аппликатура"
+
+#~ msgid "LilyPond 2.4"
+#~ msgstr "LilyPond 2.4"
+
+#~ msgid "Paper size to use in \\paper block"
+#~ msgstr "Размер бумаги \\paper block"
+
+#~ msgid "LilyPond font size"
+#~ msgstr "Кегль шрифта для LilyPond"
+
+#~ msgid "Do not export muted tracks"
+#~ msgstr "Не экспортировать приглушённые дорожки"
+
+#~ msgid "Write bar checks at end of measures"
+#~ msgstr "Писать проверку тактов в конце делений"
+
+#~ msgid "Half Speed"
+#~ msgstr "Половинная скорость"
+
+#~ msgid "Double Speed"
+#~ msgstr "У&двоить скорость"
+
+#~ msgid " (takes effect only from next restart)"
+#~ msgstr " (учитывается при следующем старте программы)"
+
+#~ msgid "&Select"
+#~ msgstr "&Выделить"
+
+#~ msgid "Snap to 1/64"
+#~ msgstr "Привязать к 1/64"
+
+#~ msgid "Snap to 1/48"
+#~ msgstr "Привязать к 1/48"
+
+#~ msgid "Snap to 1/32"
+#~ msgstr "Привязать к 1/32"
+
+#~ msgid "Snap to 1/24"
+#~ msgstr "Привязать к 1/24"
+
+#~ msgid "Snap to 1/16"
+#~ msgstr "Привязать к 1/16"
+
+#~ msgid "Snap to 1/12"
+#~ msgstr "Привязать к 1/12"
+
+#~ msgid "Snap to 1/8"
+#~ msgstr "Привязать к 1/8"
+
+#~ msgid "Snap to 1/6"
+#~ msgstr "Привязать к 1/6"
+
+#~ msgid "Snap to 1/4"
+#~ msgstr "Привязать к 1/4"
+
+#~ msgid "Snap to &Unit"
+#~ msgstr "Привязать к &единице"
+
+#, fuzzy
+#~ msgid "%1 (%2.%3s)"
+#~ msgstr "Время: %1 (%2.%3s)"
+
+#, fuzzy
+#~ msgid "%1 (%2): %3"
+#~ msgstr "%1 (%2)"
+
+#~ msgid "Add Fretboard"
+#~ msgstr "Добавить гриф"
+
+#~ msgid "Getting sound driver status..."
+#~ msgstr "Определяется статус драйвера..."
+
+#~ msgid "Distribute Audio on &MIDI"
+#~ msgstr "Распределить &звук по MIDI"
+
+#~ msgid "Cannot add file %1: %2"
+#~ msgstr "Не удаётся добавить файл %1: %2"
+
+#~ msgid "Enable"
+#~ msgstr "Включить"
+
+#~ msgid "from:"
+#~ msgstr "от:"
+
+#~ msgid "to:"
+#~ msgstr "до:"
+
+#~ msgid "unlimited"
+#~ msgstr "неограниченно"
+
+#~ msgid "Number:"
+#~ msgstr "Число:"
+
+#~ msgid "Value:"
+#~ msgstr "Значение:"
+
+#~ msgid "Wheel Events"
+#~ msgstr "События от колеса"
+
+#~ msgid "Amount:"
+#~ msgstr "Количество:"
+
+#~ msgid "Pitch from"
+#~ msgstr "Изменить высоту тона с"
+
+#~ msgid "Pitch to"
+#~ msgstr "Изменить высоту тона до"
+
+#~ msgid "High: %1"
+#~ msgstr "Высокая: %1"
+
+#~ msgid "&Velocity"
+#~ msgstr "&Сила нажатия"
+
+#~ msgid "1 pixel"
+#~ msgstr "1 пиксел"
+
+#~ msgid " 1 event selected "
+#~ msgstr " 1 событие выбрано "
+
+#~ msgid "%1 - Segment - Notation"
+#~ msgstr "%1 — Сегмент — Партитура"
+
+#~ msgid "%1 - 1 Segment - %2"
+#~ msgstr "%1 — 1 сегмент — %2"
+
+#~ msgid "Time: %1"
+#~ msgstr "Время: %1"
+
+#~ msgid "1 Input"
+#~ msgstr "1 вход"
+
+#~ msgid "1 Submaster"
+#~ msgstr "1 субмикс"
+
+#~ msgid "Advanced Event Edit"
+#~ msgstr "Расширенный редактор событий"
+
+#~ msgid "Advanced Event Viewer"
+#~ msgstr "Расширенный просмотрщик событий"
+
+#~ msgid "%1 on 1 track"
+#~ msgstr "%1 на 1 дорожке"
diff --git a/po/sv.po b/po/sv.po
new file mode 100644
index 0000000..9bf64d6
--- /dev/null
+++ b/po/sv.po
@@ -0,0 +1,12124 @@
+# translation of sv.po to
+# Translation of rosegarden.pot to Swedish.
+# This file is distributed under the same license as the package.
+#
+# Stefan Asserhäll <[email protected]>, 2003, 2004, 2005, 2006.
+# Magnus Johansson <[email protected]>, 2005.
+# Erik Magnus Johansson <[email protected]>, 2006.
+msgid ""
+msgstr ""
+"Project-Id-Version: sv\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-04-24 18:19-0400\n"
+"PO-Revision-Date: 2007-02-24 19:30+0100\n"
+"Last-Translator: Erik Magnus Johansson <[email protected]>\n"
+"Language-Team: <[email protected]>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.1\n"
+
+#: ../src/gui/dialogs/RescaleDialog.cpp:51 rc.cpp:192 rc.cpp:312
+#, no-c-format
+msgid "Rescale"
+msgstr "Skala om"
+
+#: ../src/gui/dialogs/RescaleDialog.cpp:56
+msgid "Duration of selection"
+msgstr "Markeringens längd"
+
+#: ../src/gui/dialogs/RescaleDialog.cpp:62
+msgid "Adjust times of following events accordingly"
+msgstr "Justera tider för efterföljande händelser på samma sätt"
+
+#: ../src/gui/dialogs/PitchDialog.cpp:45
+#: ../src/gui/dialogs/RescaleDialog.cpp:72
+#: ../src/gui/dialogs/TimeDialog.cpp:51 ../src/gui/dialogs/TimeDialog.cpp:68
+#: ../src/gui/studio/BankEditorDialog.cpp:109
+msgid "Reset"
+msgstr "Återställ"
+
+#: ../src/commands/segment/SegmentSplitByPitchCommand.cpp:46
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:46
+msgid "Split by Pitch"
+msgstr "Dela efter tonhöjd"
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:54
+msgid "Starting split pitch"
+msgstr "Börjar dela efter tonhöjd"
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:57
+msgid "Range up and down to follow music"
+msgstr "Flytta område upp och ner för att följa musiken"
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:63
+msgid "Duplicate non-note events"
+msgstr "Duplicera händelser utan noter"
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:66
+msgid "Clef handling:"
+msgstr "Klavhantering:"
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:69
+msgid "Leave clefs alone"
+msgstr "Låt klaver vara i fred"
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:70
+msgid "Guess new clefs"
+msgstr "Gissa nya klaver"
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:71
+msgid "Use treble and bass clefs"
+msgstr "Använd diskant- och basklav"
+
+#: ../src/gui/dialogs/DocumentConfigureDialog.cpp:64
+msgid "Document Properties"
+msgstr "Dokumentegenskaper"
+
+#: ../src/gui/dialogs/MakeOrnamentDialog.cpp:45
+#: ../src/gui/editors/notation/NotationView.cpp:6048
+msgid "Make Ornament"
+msgstr "Skapa ornament"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:183
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:179
+#: ../src/gui/dialogs/EventEditDialog.cpp:128
+#: ../src/gui/dialogs/MakeOrnamentDialog.cpp:49
+#: ../src/gui/studio/DeviceEditorDialog.cpp:74
+#: ../src/gui/studio/NameSetEditor.cpp:72
+#: ../src/gui/widgets/ColourTable.cpp:51
+msgid "Name"
+msgstr "Namn"
+
+#: ../src/gui/dialogs/MakeOrnamentDialog.cpp:51
+msgid ""
+"The name is used to identify both the ornament\n"
+"and the triggered segment that stores\n"
+"the ornament's notes."
+msgstr ""
+"Namnet används både för att identifiera ornamentet\n"
+"och det utlösande segmentet som lagrar ornamentets\n"
+"toner."
+
+#: ../src/gui/dialogs/MakeOrnamentDialog.cpp:54
+msgid "Name: "
+msgstr "Namn: "
+
+#: ../src/gui/dialogs/MakeOrnamentDialog.cpp:57
+#: ../src/gui/editors/eventlist/EventView.cpp:717
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:92
+msgid "Base pitch"
+msgstr "Huvudtonhöjd"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:57
+#: ../src/gui/editors/eventlist/EventView.cpp:140
+msgid "Text"
+msgstr "Text"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:66
+msgid "Specification"
+msgstr "Specifikation"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:68
+msgid "Preview"
+msgstr "Förhandsgranskning"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:72
+msgid "Text: "
+msgstr "Text: "
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:79
+msgid "Style: "
+msgstr "Stil: "
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:90
+msgid "Dynamic"
+msgstr "Dynamik"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:93
+msgid "Direction"
+msgstr "Spelteknik"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:96
+msgid "Local Direction"
+msgstr "Karaktär"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:63
+#: ../src/gui/dialogs/TextEventDialog.cpp:99
+#: ../src/gui/editors/tempo/TempoView.cpp:91
+msgid "Tempo"
+msgstr "Tempo"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:102
+msgid "Local Tempo"
+msgstr "Tempoförändring"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:105
+msgid "Lyric"
+msgstr "Sångtext"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:108
+#: ../src/gui/editors/notation/NotationView.cpp:4242
+msgid "Chord"
+msgstr "Ackord"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:111
+msgid "Annotation"
+msgstr "Anteckning"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:114
+msgid "LilyPond Directive"
+msgstr "Lilypond-direktiv"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:138
+msgid "Verse: "
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:148
+msgid "Dynamic: "
+msgstr "Dynamik: "
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:152
+msgid "ppp"
+msgstr "ppp"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:153
+msgid "pp"
+msgstr "pp"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:154
+msgid "p"
+msgstr "p"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:155
+msgid "mp"
+msgstr "mp"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:156
+msgid "mf"
+msgstr "mf"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:157
+msgid "f"
+msgstr "f"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:158
+msgid "ff"
+msgstr "ff"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:159
+msgid "fff"
+msgstr "fff"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:160
+msgid "rfz"
+msgstr "rfz"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:161
+msgid "sf"
+msgstr "sf"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:165
+msgid "Direction: "
+msgstr "Spelteknik "
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:174
+msgid " ,"
+msgstr " ,"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:175
+msgid "D.C. al Fine"
+msgstr "D.C. al Fine"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:176
+msgid "D.S. al Fine"
+msgstr "D.S. al Fine"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:177
+msgid "Fine"
+msgstr "Fin"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:178
+msgid "D.S. al Coda"
+msgstr "D.S. al Coda"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:179
+msgid "to Coda"
+msgstr "till Coda"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:180
+msgid "Coda"
+msgstr "Coda"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:184
+msgid "Local Direction: "
+msgstr "Karaktär: "
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:188
+msgid "accel."
+msgstr "accel."
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:189
+msgid "ritard."
+msgstr "ritard."
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:190
+msgid "ralletando"
+msgstr "rallentando"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:191
+msgid "a tempo"
+msgstr "a tempo"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:192
+msgid "legato"
+msgstr "legato"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:193
+msgid "simile"
+msgstr "simile"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:194
+msgid "pizz."
+msgstr "pizz."
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:195
+msgid "arco"
+msgstr "arco"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:196
+msgid "non vib."
+msgstr "non vib."
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:197
+msgid "sul pont."
+msgstr "sul pont."
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:198
+#: ../src/gui/dialogs/TextEventDialog.cpp:200
+msgid "sul tasto"
+msgstr "sul tasto"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:199
+msgid "con legno"
+msgstr "col legno"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:201
+msgid "sul G"
+msgstr "sul G"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:202
+msgid "ordinario"
+msgstr "ordinario"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:203
+msgid "Muta in "
+msgstr "Byt till"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:204
+msgid "volti subito "
+msgstr "volti subito"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:205
+msgid "soli"
+msgstr "soli"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:206
+msgid "div."
+msgstr "div."
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:210
+msgid "Tempo: "
+msgstr "Tempo: "
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:214
+#: ../src/gui/dialogs/TextEventDialog.cpp:238
+msgid "Grave"
+msgstr "Grave"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:215
+#: ../src/gui/dialogs/TextEventDialog.cpp:239
+msgid "Adagio"
+msgstr "Adagio"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:216
+#: ../src/gui/dialogs/TextEventDialog.cpp:240
+msgid "Largo"
+msgstr "Largo"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:217
+#: ../src/gui/dialogs/TextEventDialog.cpp:241
+msgid "Lento"
+msgstr "Lento"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:218
+#: ../src/gui/dialogs/TextEventDialog.cpp:242
+msgid "Andante"
+msgstr "Andante"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:219
+#: ../src/gui/dialogs/TextEventDialog.cpp:243
+msgid "Moderato"
+msgstr "Moderato"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:220
+#: ../src/gui/dialogs/TextEventDialog.cpp:244
+msgid "Allegretto"
+msgstr "Allegretto"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:221
+#: ../src/gui/dialogs/TextEventDialog.cpp:245
+msgid "Allegro"
+msgstr "Allegro"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:222
+#: ../src/gui/dialogs/TextEventDialog.cpp:246
+msgid "Vivace"
+msgstr "Vivace"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:223
+#: ../src/gui/dialogs/TextEventDialog.cpp:247
+msgid "Presto"
+msgstr "Presto"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:224
+#: ../src/gui/dialogs/TextEventDialog.cpp:248
+msgid "Prestissimo"
+msgstr "Prestissimo"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:225
+#: ../src/gui/dialogs/TextEventDialog.cpp:249
+msgid "Maestoso"
+msgstr "Maestoso"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:226
+#: ../src/gui/dialogs/TextEventDialog.cpp:250
+msgid "Sostenuto"
+msgstr "Sostenuto"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:227
+#: ../src/gui/dialogs/TextEventDialog.cpp:251
+msgid "Tempo Primo"
+msgstr "Tempo primo"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:234
+msgid "Local Tempo: "
+msgstr "Tempo "
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:255
+msgid "Directive: "
+msgstr "Spelteknik"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:312
+msgid "Example"
+msgstr "Exempel"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:65
+msgid "Event Filter"
+msgstr "Händelsefilter"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:86
+msgid "Note Events"
+msgstr "Tonhändelser"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:90
+msgid "lowest:"
+msgstr "lägsta:"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:93
+msgid "highest:"
+msgstr "högsta:"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:96
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:141
+#: ../src/gui/widgets/PitchChooser.cpp:53
+msgid "Pitch:"
+msgstr "Tonhöjd:"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:99
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:163
+msgid "Velocity:"
+msgstr "Ljudstyrka:"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:102
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:129
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:257
+msgid "Duration:"
+msgstr "Notvärde:"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:107
+#: ../src/gui/dialogs/EventFilterDialog.cpp:114
+#: ../src/gui/dialogs/EventFilterDialog.cpp:121
+msgid "include"
+msgstr "inkludera"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:108
+#: ../src/gui/dialogs/EventFilterDialog.cpp:115
+#: ../src/gui/dialogs/EventFilterDialog.cpp:122
+msgid "exclude"
+msgstr "undanta"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:136
+#: ../src/gui/dialogs/EventFilterDialog.cpp:155
+#: ../src/gui/editors/eventlist/EventView.cpp:172
+#: ../src/gui/editors/eventlist/EventView.cpp:179
+#: ../src/gui/editors/eventlist/EventView.cpp:186
+msgid "edit"
+msgstr "redigera"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:141
+#: ../src/gui/dialogs/EventFilterDialog.cpp:157
+msgid "choose a pitch using a staff"
+msgstr "välj tonhöjd med notsystem"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:182
+#: ../src/gui/dialogs/EventFilterDialog.cpp:188
+msgid "longest"
+msgstr "längsta"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:200
+msgid "Include all"
+msgstr "Inkludera alla"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:203
+msgid "Include entire range of values"
+msgstr "Inkludera hela registret med värden"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:206
+msgid "Exclude all"
+msgstr "Undanta alla"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:209
+msgid "Exclude entire range of values"
+msgstr "Undanta hela registret med värden"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:233
+#: ../src/gui/dialogs/EventFilterDialog.cpp:234
+msgid "shortest"
+msgstr "kortaste"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:333
+msgid "Lowest pitch"
+msgstr "Lägsta ton"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:343
+msgid "Highest pitch"
+msgstr "Högsta ton"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:56
+#: ../src/gui/editors/notation/NotationView.cpp:1619
+#: ../src/gui/editors/notation/NotationView.cpp:6088
+msgid "Use Ornament"
+msgstr "Använd ornament"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:260
+#: ../src/gui/configuration/NotationConfigurationPage.h:64
+#: ../src/gui/configuration/NotationConfigurationPage.h:65
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:63
+msgid "Notation"
+msgstr "Notation"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:68
+msgid "Display as: "
+msgstr "Visa som: "
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:84
+msgid "Trill"
+msgstr "Drill"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:84
+msgid "Trill with line"
+msgstr "Drill med våglinje"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:84
+msgid "Trill line only"
+msgstr "Bara våglinje"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:85
+msgid "Turn"
+msgstr "Dubbelslag"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:85
+msgid "Mordent"
+msgstr "Mordent"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:85
+msgid "Inverted mordent"
+msgstr "Pralldrill"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:86
+msgid "Long mordent"
+msgstr "Lång mordent"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:86
+msgid "Long inverted mordent"
+msgstr "Lång pralldrill"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:94
+msgid "Text mark"
+msgstr "Textmarkering"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:98
+msgid " Text: "
+msgstr " Text: "
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:104
+msgid "Performance"
+msgstr "Utförande"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:109
+msgid "Perform using triggered segment: "
+msgstr "Utför med utlösande segment: "
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:75
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:123
+msgid "Perform with timing: "
+msgstr "Utförandetid: "
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:81
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:129
+msgid "As stored"
+msgstr "Som lagrad"
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:82
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:130
+msgid "Truncate if longer than note"
+msgstr "Korta av om längre än ton"
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:83
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:131
+msgid "End at same time as note"
+msgstr "Sluta samtidigt som ton"
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:84
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:132
+msgid "Stretch or squash segment to note duration"
+msgstr "Sträck ut eller pressa ihop segment till notvärde"
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:86
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:134
+msgid "Adjust pitch to note"
+msgstr "Justera tonhöjd till ton"
+
+#: ../src/gui/dialogs/PitchPickerDialog.cpp:40
+msgid "Pitch Selector"
+msgstr "Tonhöjdsväljare"
+
+#: ../src/gui/dialogs/BeatsBarsDialog.cpp:44
+msgid "Audio Segment Duration"
+msgstr "Längd för ljudsegment"
+
+#: ../src/gui/dialogs/BeatsBarsDialog.cpp:50
+msgid "The selected audio segment contains:"
+msgstr "Det markerade ljudsegmentet innehåller:"
+
+#: ../src/gui/dialogs/BeatsBarsDialog.cpp:59
+msgid "beat(s)"
+msgstr "taktslag"
+
+#: ../src/gui/dialogs/BeatsBarsDialog.cpp:60
+msgid "bar(s)"
+msgstr "takt(er)"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:51
+msgid "Tuplet"
+msgstr "Annandelning"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:58
+msgid "New timing for tuplet group"
+msgstr "Förhållande för annandelning"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:76
+msgid "Play "
+msgstr "Spela "
+
+#: ../src/gui/dialogs/TupletDialog.cpp:98
+msgid "in the time of "
+msgstr "under tiden för "
+
+#: ../src/gui/dialogs/TupletDialog.cpp:104
+msgid "Timing is already correct: update display only"
+msgstr "Förhållandet är redan riktigt: uppdaterar bara skärmen"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:114
+msgid "Timing calculations"
+msgstr "Tidsberäkningar"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:120
+msgid "Selected region:"
+msgstr "Markerat område:"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:129
+msgid "Group with current timing:"
+msgstr "Gruppera med nuvarande tid:"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:135
+msgid "Group with new timing:"
+msgstr "Gruppera med ny tid:"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:141
+msgid "Gap created by timing change:"
+msgstr "Gap skapat av tidsändring:"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:149
+msgid "Unchanged at end of selection:"
+msgstr "Oförändrad vid markeringens slut:"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:63 rc.cpp:372
+#, no-c-format
+msgid "Metronome"
+msgstr "Metronom"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:77
+msgid "Metronome Instrument"
+msgstr "Metronominstrument"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:82
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:150
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:183
+#: ../src/gui/studio/DeviceEditorDialog.cpp:73
+#: ../src/gui/studio/DeviceManagerDialog.cpp:105
+#: ../src/gui/studio/DeviceManagerDialog.cpp:163
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:66
+msgid "Device"
+msgstr "Enhet"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:101
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:89
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:215
+#: ../src/gui/studio/DeviceEditorDialog.cpp:195
+#: ../src/gui/studio/DeviceEditorDialog.cpp:218
+#: ../src/gui/studio/DeviceEditorDialog.cpp:230
+#: ../src/gui/studio/DeviceManagerDialog.cpp:196
+#: ../src/gui/studio/DeviceManagerDialog.cpp:440
+#: ../src/gui/studio/DeviceManagerDialog.cpp:452
+msgid "No connection"
+msgstr "Ingen anslutning"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:112
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:111
+#: ../src/gui/editors/parameters/InstrumentParameterBox.cpp:53
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:1209
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:159
+#: ../src/gui/general/PresetHandlerDialog.cpp:92
+#: ../src/gui/studio/MidiMixerWindow.cpp:204
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:67
+msgid "Instrument"
+msgstr "Instrument"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:118
+msgid "Beats"
+msgstr "Taktslag"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:184
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:123
+msgid "Resolution"
+msgstr "Upplösning"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:309
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:139
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:205
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:125
+#: ../src/gui/editors/matrix/MatrixView.cpp:2132
+#: ../src/gui/editors/notation/NotationView.cpp:1582
+#: ../src/gui/widgets/QuantizeParameters.cpp:128
+#: ../src/gui/widgets/QuantizeParameters.cpp:301
+msgid "None"
+msgstr "Ingen"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:126
+msgid "Bars only"
+msgstr "Bara taktettor"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:127
+msgid "Bars and beats"
+msgstr "Alla taktslag"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:128
+msgid "Bars, beats, and divisions"
+msgstr "Alla taktslag och underdelningar"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:132
+msgid "Bar velocity"
+msgstr "Taktettans styrka"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:139
+msgid "Beat velocity"
+msgstr "Taktslagsstyrka"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:146
+msgid "Sub-beat velocity"
+msgstr "Deltaktslagsstyrka"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:155
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:324
+msgid "Pitch"
+msgstr "Tonhöjd"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:160
+msgid "for Bar"
+msgstr "för takt"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:161
+msgid "for Beat"
+msgstr "för taktslag"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:162
+msgid "for Sub-beat"
+msgstr "för deltaktslag"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:166
+msgid "Metronome Activated"
+msgstr "Metronomen är aktiverad ..."
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:167
+msgid "Playing"
+msgstr "vid uppspelning"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:168
+msgid "Recording"
+msgstr "vid inspelning"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:46
+msgid "Choose Text Encoding"
+msgstr "Text"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:50
+msgid ""
+"\n"
+"This file contains text in an unknown language encoding.\n"
+"\n"
+"Please select one of the following estimated text encodings\n"
+"for use with the text in this file:\n"
+msgstr ""
+"\n"
+"Filen innehåller text med en okänd språkkodning.\n"
+"\n"
+"Välj en av följande antagna textkodningar\n"
+"att använda för texten i filen:\n"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:61
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:77
+msgid "Japanese Shift-JIS"
+msgstr "Japansk skift-JIS"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:62
+msgid "Unicode variable-width"
+msgstr "Unicode med variabel bredd"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:63
+msgid "Western Europe"
+msgstr "Västeuropeisk"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:64
+msgid "Western Europe + Euro"
+msgstr "Västeuropeisk med euro"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:65
+msgid "Eastern Europe"
+msgstr "Östeuropeisk"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:66
+msgid "Southern Europe"
+msgstr "Sydeuropeisk"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:67
+msgid "Northern Europe"
+msgstr "Nordeuropeisk"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:68
+msgid "Cyrillic"
+msgstr "Kyrillisk"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:69
+msgid "Arabic"
+msgstr "Arabisk"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:70
+msgid "Greek"
+msgstr "Grekisk"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:71
+msgid "Hebrew"
+msgstr "Hebreisk"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:72
+msgid "Turkish"
+msgstr "Turkisk"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:73
+msgid "Nordic"
+msgstr "Nordisk"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:74
+msgid "Thai"
+msgstr "Thailändsk"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:75
+msgid "Baltic"
+msgstr "Baltisk"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:76
+msgid "Celtic"
+msgstr "Keltisk"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:78
+msgid "Traditional Chinese"
+msgstr "Traditionell kinesisk"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:79
+msgid "Simplified Chinese"
+msgstr "Förenklad kinesisk"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:80
+msgid "Russian"
+msgstr "Rysk"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:81
+msgid "Ukrainian"
+msgstr "Ukrainsk"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:82
+msgid "Tamil"
+msgstr "Tamilsk"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:117
+#, c-format
+msgid "Microsoft Code Page %1"
+msgstr "Microsoft-kodsida %1"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:123
+#: ../src/gui/editors/matrix/MatrixView.cpp:1490
+msgid "%1 (%2)"
+msgstr "%1 (%2)"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:142
+msgid ""
+"\n"
+"Example text from file:"
+msgstr ""
+"\n"
+"Exempeltext från filen:"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:59
+#: ../src/gui/editors/tempo/TempoView.cpp:92
+msgid "Time Signature"
+msgstr "Taktart"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:82
+msgid "Time signature"
+msgstr "Taktart"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:116
+msgid "Time where signature takes effect"
+msgstr "Tid då signaturen börjar gälla"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:83
+#: ../src/gui/dialogs/TempoDialog.cpp:128
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:129
+#: ../src/gui/general/PresetHandlerDialog.cpp:101
+msgid "Scope"
+msgstr "Omfattning"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:141
+#, c-format
+msgid "Insertion point is at start of measure %1."
+msgstr "Infogningsplatsen är i början av takt %1."
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:145
+#, c-format
+msgid "Insertion point is in the middle of measure %1."
+msgstr "Infogningsplatsen är i mitten av takt %1."
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:150
+msgid "Insertion point is at start of composition."
+msgstr "Infogningsplatsen är i början av kompositionen."
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:155
+msgid "Start measure %1 here"
+msgstr "Infoga den nya taktartssignaturen här"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:159
+#, fuzzy, c-format
+msgid "Change time from start of measure %1"
+msgstr "Ändra taktart från början av takt %1"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:166
+#, c-format
+msgid "Time change will take effect at the start of measure %1."
+msgstr "Taktartsändring börjar gälla i början av takt %1."
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:176
+#, fuzzy
+msgid "Hide the time signature"
+msgstr "Dölj taktartssignaturen"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:181
+#, fuzzy
+msgid "Hide the affected bar lines"
+msgstr "Bind noter vid taktstreck etc."
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:186
+msgid "Show as common time"
+msgstr "Använd taktartssignaturen C"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:191
+msgid "Correct the durations of following measures"
+msgstr "Rätta notvärdena i följande takter"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:280
+msgid "Display as common time"
+msgstr "Använd taktartssignaturen C"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:284
+msgid "Display as cut common time"
+msgstr "Visa som allabreve"
+
+#: ../src/gui/dialogs/ConfigureDialog.cpp:66
+msgid "Configure Rosegarden"
+msgstr "Anpassa Rosegarden"
+
+#: ../src/gui/dialogs/MarkerModifyDialog.cpp:53
+#: ../src/gui/dialogs/MarkerModifyDialog.cpp:61
+msgid "Edit Marker"
+msgstr "Redigera markering"
+
+#: ../src/gui/dialogs/MarkerModifyDialog.cpp:78
+msgid "Marker Time"
+msgstr "Markeringstid"
+
+#: ../src/gui/dialogs/MarkerModifyDialog.cpp:94
+msgid "Marker Properties"
+msgstr "Markeringsegenskaper"
+
+#: ../src/gui/dialogs/MarkerModifyDialog.cpp:100
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:554
+msgid "Text:"
+msgstr "Text:"
+
+#: ../src/gui/dialogs/MarkerModifyDialog.cpp:104
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:85
+msgid "Description:"
+msgstr "Beskrivning:"
+
+#: ../src/gui/dialogs/FileMergeDialog.cpp:46
+msgid "Merge File"
+msgstr "Sammanfoga med fil"
+
+#: ../src/gui/dialogs/FileMergeDialog.cpp:53
+msgid "Merge new file "
+msgstr "Sammanfoga med ny fil "
+
+#: ../src/gui/dialogs/FileMergeDialog.cpp:56
+msgid "At start of existing composition"
+msgstr "Från början av befintlig komposition"
+
+#: ../src/gui/dialogs/FileMergeDialog.cpp:57
+msgid "From end of existing composition"
+msgstr "Från slutet av befintlig komposition"
+
+#: ../src/gui/dialogs/FileMergeDialog.cpp:61
+msgid "The file has different time signatures or tempos."
+msgstr "Filen har flera olika taktarter eller tempon."
+
+#: ../src/gui/dialogs/FileMergeDialog.cpp:62
+msgid "Import these as well"
+msgstr "Importera också dessa"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:171
+#: ../src/gui/dialogs/ShowSequencerStatusDialog.cpp:44
+msgid "Sequencer status"
+msgstr "Spelarstatus"
+
+#: ../src/gui/dialogs/ShowSequencerStatusDialog.cpp:48
+msgid "Sequencer status:"
+msgstr "Spelarstatus:"
+
+#: ../src/gui/dialogs/ShowSequencerStatusDialog.cpp:50
+msgid "Status not available."
+msgstr "Status inte tillgänglig."
+
+#: ../src/gui/dialogs/ShowSequencerStatusDialog.cpp:57
+msgid "Sequencer is not running or is not responding."
+msgstr "Spelaren körs inte eller svarar inte."
+
+#: ../src/gui/dialogs/ShowSequencerStatusDialog.cpp:64
+msgid "Sequencer is not returning a valid status report."
+msgstr "Spelaren returnerar inte en giltig statusrapport."
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:46
+#, fuzzy
+msgid "Add Tracks"
+msgstr "Lägg till ett &spår"
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:54
+msgid "How many tracks do you want to add?"
+msgstr "Hur många spår vill du lägga till?"
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:62
+#, fuzzy
+msgid "Add tracks"
+msgstr "Alla spår"
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:64
+msgid "At the top"
+msgstr ""
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:65
+#, fuzzy
+msgid "Above the current selected track"
+msgstr "Tystar alla utom nuvarande markerat spår"
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:66
+#, fuzzy
+msgid "Below the current selected track"
+msgstr "Tystar alla utom nuvarande markerat spår"
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:67
+msgid "At the bottom"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:75
+msgid "Event Properties"
+msgstr "Egenskaper för händelse"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:81
+msgid "Event type:"
+msgstr "Händelsetyp:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:117
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:251
+#: ../src/gui/editors/segment/MarkerEditor.cpp:97
+msgid "Absolute time:"
+msgstr "Absolut tid:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:156
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:323
+msgid "Controller name:"
+msgstr "Effektnamn:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:157
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:530
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:562
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:563
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:602
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:631
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:267
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:269
+#: ../src/gui/editors/segment/MarkerEditor.cpp:279
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:272
+#: ../src/gui/studio/AudioMixerWindow.cpp:388
+#: ../src/gui/studio/AudioMixerWindow.cpp:519
+#: ../src/gui/studio/AudioMixerWindow.cpp:683
+#: ../src/gui/studio/AudioMixerWindow.cpp:722
+#: ../src/gui/studio/AudioMixerWindow.cpp:904
+#: ../src/gui/studio/SynthPluginManagerDialog.cpp:121
+msgid "<none>"
+msgstr "<ingen>"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:174
+msgid "Meta string:"
+msgstr "Metasträng:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:179
+msgid "Load data"
+msgstr "Ladda data"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:181
+msgid "Save data"
+msgstr "Spara data"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:192
+msgid "Notation Properties"
+msgstr "Notationsegenskaper"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:198
+msgid "Lock to changes in performed values"
+msgstr "Lås för ändringar i uppspelningsvärden"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:205
+msgid "Notation time:"
+msgstr "Notationstid:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:217
+msgid "Notation duration:"
+msgstr "Notationslängd:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:283
+msgid "Note pitch:"
+msgstr "Tonplats:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:291
+msgid "Note velocity:"
+msgstr "Tonstyrka:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:317
+msgid "Controller number:"
+msgstr "Effektnummer:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:326
+msgid "Controller value:"
+msgstr "Effektvärde:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:354
+msgid "Key pitch:"
+msgstr "Transpositionsläge:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:362
+msgid "Key pressure:"
+msgstr "Tangenttryck:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:390
+msgid "Channel pressure:"
+msgstr "Kanaltryck:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:418
+msgid "Program change:"
+msgstr "Programändring:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:461
+msgid "Data length:"
+msgstr "Datalängd:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:462
+msgid "Data:"
+msgstr "Data:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:480
+msgid "Pitchbend MSB:"
+msgstr "Tonhöjdsavvikelse för mest signifikanta värdet:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:488
+msgid "Pitchbend LSB:"
+msgstr "Tonhöjdsavvikelse för minst signifikanta värdet:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:523
+msgid "Indication:"
+msgstr "Indikering:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:553
+msgid "Text type:"
+msgstr "Texttyp:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:596
+msgid "Clef type:"
+msgstr "Klavtyp:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:625
+msgid "Key name:"
+msgstr "Tonartsnamn:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:674
+msgid "Unsupported event type:"
+msgstr "Händelsetyp som inte stöds:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:931
+msgid "Edit Event Time"
+msgstr "Redigera händelsetid"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:943
+msgid "Edit Event Notation Time"
+msgstr "Redigera händelsenotskriftstid"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:955
+msgid "Edit Duration"
+msgstr "Redigera notvärde"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:968
+msgid "Edit Notation Duration"
+msgstr "Redigera notskriftslängd"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:981
+msgid "Edit Pitch"
+msgstr "Redigera tonhöjd"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:991
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:1016
+msgid "*.syx|System exclusive files (*.syx)"
+msgstr "*.syx|Systemexklusiva filer (*.syx)"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:992
+msgid "Load System Exclusive data in File"
+msgstr "Ladda systemexklusiv data i fil"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:1017
+msgid "Save System Exclusive data to..."
+msgstr "Spara systemexklusiv data till ..."
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:46
+msgid "Locate audio file"
+msgstr "Sök efter ljudfil"
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:50
+msgid "&Skip"
+msgstr "Hoppa &över"
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:51
+msgid "Skip &All"
+msgstr "Hoppa över &alla"
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:52
+msgid "&Locate"
+msgstr "&Sök"
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:57
+msgid ""
+"Can't find file \"%1\".\n"
+"Would you like to try and locate this file or skip it?"
+msgstr ""
+"Kan inte hitta filen \"%1\".\n"
+"Vill du försöka söka efter filen eller hoppa över den?"
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:71
+msgid ""
+"%1|Requested file (%2)\n"
+"*.wav|WAV files (*.wav)"
+msgstr ""
+"%1|Begärd fil (%2)\n"
+"*.wav|WAV-filer (*.wav)"
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:74
+msgid "Select an Audio File"
+msgstr "Markera en ljudfil"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:53 ../src/gui/dialogs/ClefDialog.cpp:62
+#: ../src/gui/dialogs/ClefDialog.cpp:79 ../src/gui/dialogs/ClefDialog.cpp:90
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:278
+msgid "Clef"
+msgstr "Klav"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:65
+msgid "Existing notes following clef change"
+msgstr "Befintliga noter efter klavbyte ..."
+
+#: ../src/gui/dialogs/ClefDialog.cpp:71
+msgid "Lower clef"
+msgstr "Nedre klav"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:77
+msgid "Up an Octave"
+msgstr "Upp en oktav"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:84
+msgid "Down an Octave"
+msgstr "Ner en oktav"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:88
+msgid "Higher clef"
+msgstr "Övre klav"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:96
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:152
+msgid "Maintain current pitches"
+msgstr "behåller nuvarande tonhöjder"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:99
+msgid "Transpose into appropriate octave"
+msgstr "transponeras till lämplig oktav"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:231
+msgid "%1 down an octave"
+msgstr "%1 ner en oktav"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:234
+msgid "%1 down two octaves"
+msgstr "%1 ner två oktaver"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:237
+msgid "%1 up an octave"
+msgstr "%1 upp en oktav"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:240
+msgid "%1 up two octaves"
+msgstr "%1 upp två oktaver"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:249
+msgid "Treble"
+msgstr "Diskant"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:251
+#, fuzzy
+msgid "French violin"
+msgstr "Översättning till franska"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:253
+msgid "Soprano"
+msgstr "Sopran"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:255
+#, fuzzy
+msgid "Mezzo-soprano"
+msgstr "sopran"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:257
+msgid "Alto"
+msgstr "Alt"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:259
+msgid "Tenor"
+msgstr "Tenor"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:261
+#, fuzzy
+msgid "C-baritone"
+msgstr "Variant"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:263
+#, fuzzy
+msgid "F-baritone"
+msgstr "Variant"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:265
+msgid "Bass"
+msgstr "Bas"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:267
+#, fuzzy
+msgid "Sub-bass"
+msgstr "Bas"
+
+#: ../src/gui/dialogs/CountdownDialog.cpp:52
+msgid "Recording..."
+msgstr "Spelar in..."
+
+#: ../src/gui/dialogs/CountdownDialog.cpp:60
+msgid "Recording time remaining: "
+msgstr "Kvarvarande tid för inspelning: "
+
+#: ../src/gui/dialogs/CountdownDialog.cpp:120
+msgid "Just how big is your hard disk?"
+msgstr "Hur stor är din hårddisk egentligen?"
+
+#: ../src/gui/dialogs/CountdownDialog.cpp:154
+msgid "Recording beyond end of composition: "
+msgstr "Inspelning bortom kompositionens slut: "
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:52
+msgid "Specify Interval"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:58
+msgid "Reference note:"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:59
+#, fuzzy
+msgid "Target note:"
+msgstr "fjärdedelsnot"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:68
+#: ../src/gui/dialogs/IntervalDialog.cpp:315
+msgid "a perfect unison"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:76
+msgid "Effect on Key"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:77
+#, fuzzy
+msgid "Transpose within key"
+msgstr "transponeras till den här tonarten"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:79
+#, fuzzy
+msgid "Change key for selection"
+msgstr "Oförändrad vid markeringens slut:"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:89
+msgid ""
+"Adjust segment transposition in opposite direction (maintain audible pitch)"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:190
+#: ../src/gui/dialogs/IntervalDialog.cpp:220
+msgid "a diminished"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:192
+#: ../src/gui/dialogs/IntervalDialog.cpp:222
+msgid "an augmented"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:194
+#: ../src/gui/dialogs/IntervalDialog.cpp:224
+msgid "a doubly diminished"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:196
+#: ../src/gui/dialogs/IntervalDialog.cpp:226
+msgid "a doubly augmented"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:198
+#: ../src/gui/dialogs/IntervalDialog.cpp:228
+msgid "a triply diminished"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:200
+#: ../src/gui/dialogs/IntervalDialog.cpp:230
+msgid "a triply augmented"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:202
+msgid "a quadruply diminished"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:204
+#: ../src/gui/dialogs/IntervalDialog.cpp:232
+msgid "a quadruply augmented"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:206
+#: ../src/gui/dialogs/IntervalDialog.cpp:234
+msgid "a perfect"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:208
+#: ../src/gui/dialogs/IntervalDialog.cpp:236
+msgid "an (unknown, %1)"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:216
+#, fuzzy
+msgid "a minor"
+msgstr "Moll"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:218
+#, fuzzy
+msgid "a major"
+msgstr "Dur"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:239
+#, fuzzy
+msgid "an (unknown)"
+msgstr "Okänd"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:248
+#: ../src/gui/dialogs/IntervalDialog.cpp:251
+#, fuzzy
+msgid "%1 octave"
+msgstr "%1 upp en oktav"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:254
+#, fuzzy
+msgid "%1 unison"
+msgstr "enheter"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:258
+#, fuzzy
+msgid "%1 second"
+msgstr "Sekunder:"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:261
+#, fuzzy
+msgid "%1 third"
+msgstr "Annan"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:264
+#, fuzzy
+msgid "%1 fourth"
+msgstr "%1 b-förtecken"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:267
+#, fuzzy
+msgid "%1 fifth"
+msgstr "Tonhöjd"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:270
+#, fuzzy
+msgid "%1 sixth"
+msgstr "Tonhöjd"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:273
+#, fuzzy
+msgid "%1 seventh"
+msgstr "Ändra storlek på händelse"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:276
+#: ../src/gui/studio/DeviceManagerDialog.cpp:329
+#: ../src/gui/studio/DeviceManagerDialog.cpp:363
+#, c-format
+msgid "%1"
+msgstr "%1"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:287
+msgid ""
+"_n: up 1 octave and %1\n"
+"up %n octaves and %1"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:291
+#, c-format
+msgid ""
+"_n: up 1 octave\n"
+"up %n octaves"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:295
+#, fuzzy, c-format
+msgid "up %1"
+msgstr "Del %1"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:303
+msgid ""
+"_n: down 1 octave and %1\n"
+"down %n octaves and %1"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:307
+#, fuzzy, c-format
+msgid ""
+"_n: down 1 octave\n"
+"down %n octaves"
+msgstr ""
+"%1 på 1 spår\n"
+"%1 på %n spår"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:311
+#, fuzzy, c-format
+msgid "down %1"
+msgstr "Lägsta: %1"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:81
+msgid "Intrinsics"
+msgstr "Inbyggda"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:85
+msgid "Event type: "
+msgstr "Händelsetyp: "
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:91
+msgid "Absolute time: "
+msgstr "Absolut tid: "
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:101
+msgid "Duration: "
+msgstr "Notvärde: "
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:114
+msgid "Sub-ordering: "
+msgstr "Undergruppering: "
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:125
+msgid "Persistent properties"
+msgstr "Bestående egenskaper"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:169
+#: ../src/gui/dialogs/EventEditDialog.cpp:133
+#: ../src/gui/studio/BankEditorDialog.cpp:129
+#: ../src/gui/studio/DeviceEditorDialog.cpp:75
+msgid "Type"
+msgstr "Typ"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:184
+#: ../src/gui/dialogs/EventEditDialog.cpp:135
+#: ../src/gui/dialogs/EventParameterDialog.cpp:89
+#: ../src/gui/dialogs/EventParameterDialog.cpp:93
+#: ../src/gui/dialogs/EventParameterDialog.cpp:115
+msgid "Value"
+msgstr "Värde"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:155
+msgid "Non-persistent properties"
+msgstr "Flyktiga egenskaper"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:156
+msgid "These are cached values, lost if the event is modified."
+msgstr "Det här är värden i cache, som går förlorade om händelsen ändras."
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:170
+msgid "Name "
+msgstr "Namn "
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:172
+msgid "Type "
+msgstr "Typ "
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:174
+msgid "Value "
+msgstr "Värde "
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:188
+msgid "Make persistent"
+msgstr "Gör bestående"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:292
+msgid "Delete this property"
+msgstr "Ta bort egenskap"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:433
+msgid ""
+"Are you sure you want to delete the \"%1\" property?\n"
+"\n"
+"Removing necessary properties may cause unexpected behavior."
+msgstr ""
+"Är du säker på att du vill ta bort egenskapen \"%1\"?\n"
+"\n"
+"Att ta bort egenskaper som krävs kan orsaka oväntat beteende."
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:436
+#: ../src/gui/dialogs/EventEditDialog.cpp:469
+msgid "Edit Event"
+msgstr "Redigera händelse"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:465
+msgid ""
+"Are you sure you want to make the \"%1\" property persistent?\n"
+"\n"
+"This could cause problems if it overrides a different computed value later "
+"on."
+msgstr ""
+"Är du säker på att du vill göra egenskapen \"%1\" bestående?\n"
+"\n"
+"Det kan orsaka problem om den senare överskrider ett annat beräknat värde."
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:470
+msgid "Make &Persistent"
+msgstr "Gör &bestående"
+
+#: ../src/gui/dialogs/PasteNotationDialog.cpp:52
+msgid "Paste type"
+msgstr "Inklistringstyp"
+
+#: ../src/gui/dialogs/PasteNotationDialog.cpp:72
+msgid "Make this the default paste type"
+msgstr "Gör det här till förvald inklistringstyp"
+
+#: ../src/gui/dialogs/LyricEditDialog.cpp:53
+msgid "Edit Lyrics"
+msgstr "Redigera sångtext"
+
+#: ../src/gui/dialogs/LyricEditDialog.cpp:62
+msgid "Lyrics for this segment"
+msgstr "Sångtext för segmentet"
+
+#: ../src/gui/dialogs/LyricEditDialog.cpp:70
+#, fuzzy
+msgid "Add Verse"
+msgstr "Lägg till &diminuendo"
+
+#: ../src/gui/dialogs/LyricEditDialog.cpp:84
+#: ../src/gui/dialogs/LyricEditDialog.cpp:106
+#, c-format
+msgid "Verse %1"
+msgstr ""
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:59
+msgid "Import from Device..."
+msgstr "Importera från enhet ..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2163
+#: ../src/gui/application/RosegardenGUIApp.cpp:2229
+#: ../src/gui/application/RosegardenGUIApp.cpp:7780
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:87
+#: ../src/sound/AudioFileManager.cpp:664
+#, c-format
+msgid "Cannot download file %1"
+msgstr "Kan inte ladda ner filen %1"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:99
+#, c-format
+msgid "Cannot open file %1"
+msgstr "Kan inte öppna filen %1"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:106
+#, c-format
+msgid "No devices found in file %1"
+msgstr "Inga enheter hittades i filen %1"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:113
+msgid "Source device"
+msgstr "Källenhet"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:118
+msgid "Import from: "
+msgstr "Importera från: "
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:140
+#: ../src/gui/studio/DeviceEditorDialog.cpp:148
+#, c-format
+msgid "Device %1"
+msgstr "Enhet %1"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:155
+msgid "Import banks"
+msgstr "Importera banker"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:156
+msgid "Import key mappings"
+msgstr "Importera tonartsändringar"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:157
+msgid "Import controllers"
+msgstr "Importera effekter"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:160
+msgid "Import device name"
+msgstr "Importenhetens namn"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:166
+msgid "Bank import behavior"
+msgstr "Bank"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:168
+msgid "Merge banks"
+msgstr "Sammanfoga banker"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:169
+msgid "Overwrite banks"
+msgstr "Skriv över banker"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:367
+msgid "Bank %1:%2"
+msgstr "Bank %1:%2"
+
+#: ../src/commands/segment/SegmentSplitByRecordingSrcCommand.cpp:42
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:48
+msgid "Split by Recording Source"
+msgstr "Dela efter inspelningskälla"
+
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:53
+msgid "Recording Source"
+msgstr "Inspelningskälla"
+
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:57
+msgid "Channel:"
+msgstr "Kanal:"
+
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:64
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:75
+msgid "any"
+msgstr "godtyckligt"
+
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:69
+msgid "Device:"
+msgstr "Enhet:"
+
+#: ../src/gui/dialogs/UnusedAudioSelectionDialog.cpp:46
+msgid "Select Unused Audio Files"
+msgstr "Markera oanvända ljudfiler"
+
+#: ../src/gui/dialogs/UnusedAudioSelectionDialog.cpp:53
+#: ../src/gui/editors/segment/PlayListView.cpp:36
+msgid "File name"
+msgstr "Filnamn"
+
+#: ../src/gui/dialogs/UnusedAudioSelectionDialog.cpp:54
+msgid "File size"
+msgstr "Filstorlek"
+
+#: ../src/gui/dialogs/UnusedAudioSelectionDialog.cpp:55
+msgid "Last modified date"
+msgstr "Senaste ändringsdatum"
+
+#: ../src/gui/dialogs/UnusedAudioSelectionDialog.cpp:60
+msgid " (not found) "
+msgstr " (hittades inte) "
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:105
+msgid "Audio File Manager"
+msgstr "Ljudfilshantering"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:126
+msgid ""
+"* Some audio files are encoded at a sample rate different from that of the "
+"JACK audio server.\n"
+"Rosegarden will play them at the correct speed, but they will sound "
+"terrible.\n"
+"Please consider resampling such files externally, or adjusting the sample "
+"rate of the JACK server."
+msgstr ""
+"* Vissa ljudfiler kodas med en samplingsfrekvens som skiljer sig från den "
+"som används av ljudservern JACK\n"
+"Rosegarden kommer att spela dem med rätt hastighet, men de kommer att låta "
+"förfärligt.\n"
+"Fundera på att sampla om sådana filer externt, eller justera "
+"samplingsfrekvensen i JACK-servern."
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:132
+msgid "&Add Audio File..."
+msgstr "&Lägg till ljudfil..."
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:135
+msgid "&Unload Audio File"
+msgstr "&Stäng ljudfil"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:140
+msgid "&Play Preview"
+msgstr "S&pela förhandsgranskning"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:151
+msgid "&Insert into Selected Audio Track"
+msgstr "&Infoga i markerat ljudspår"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:155
+msgid "Unload &all Audio Files"
+msgstr "Stäng &alla ljudfiler"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:159
+msgid "Unload all &Unused Audio Files"
+msgstr "Stäng alla oanvända lj&udfiler"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:163
+msgid "&Delete Unused Audio Files..."
+msgstr "Radera oanvända lju&dfiler ..."
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:167
+msgid "&Export Audio File..."
+msgstr "&Exportera ljudfil ..."
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:173
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:180
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:91
+msgid "Duration"
+msgstr "Notvärde"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:181
+msgid "Envelope"
+msgstr "Envelopp"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:182
+msgid "Sample rate"
+msgstr "Samplingsfrekvens"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:183
+msgid "Channels"
+msgstr "Kanaler"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:282
+msgid "<no audio files>"
+msgstr "<inga ljudfiler>"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:488
+msgid "*.wav|WAV files (*.wav)"
+msgstr "*.wav|WAV-filer (*.wav)"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:489
+msgid "Choose a name to save this file as"
+msgstr "Välj ett namn att spara filen med"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:499
+msgid "Exporting audio file..."
+msgstr "Exporterar ljudfil..."
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:609
+msgid ""
+"This will unload audio file \"%1\" and remove all associated segments. Are "
+"you sure?"
+msgstr ""
+"Det här stänger ljudfilen \"%1\" och alla tillhörande ljudsegment. Är du "
+"säker?"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:692
+msgid ""
+"*.wav|WAV files (*.wav)\n"
+"*.*|All files"
+msgstr ""
+"*.wav|WAV files (*.wav)\n"
+"*.*|Alla filer"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:697
+msgid ""
+"*.wav *.flac *.ogg *.mp3|Audio files (*.wav *.flac *.ogg *.mp3)\n"
+"*.wav|WAV files (*.wav)\n"
+"*.flac|FLAC files (*.flac)\n"
+"*.ogg|Ogg files (*.ogg)\n"
+"*.mp3|MP3 files (*.mp3)\n"
+"*.*|All files"
+msgstr ""
+"*.wav *.flac *.ogg *.mp3|Audio files (*.wav *.flac *.ogg *.mp3)\n"
+"*.wav|WAV files (*.wav)\n"
+"*.flac|FLAC files (*.flac)\n"
+"*.ogg|Ogg files (*.ogg)\n"
+"*.mp3|MP3 files (*.mp3)\n"
+"*.*|All files"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:704
+msgid "Select one or more audio files"
+msgstr "Markera en eller flera ljudfiler"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:763
+msgid ""
+"This will unload all audio files and remove their associated segments.\n"
+"This action cannot be undone, and associations with these files will be "
+"lost.\n"
+"Files will not be removed from your disk.\n"
+"Are you sure?"
+msgstr ""
+"Detta stänger alla ljudfiler och tar bort tillhörande segment.\n"
+"Åtgärden kan inte ångras, och kopplingen till dessa filer kommer att gå "
+"förlorad.\n"
+"Filerna tas inte bort från disken.\n"
+"Är du säker?"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:800
+msgid ""
+"This will unload all audio files that are not associated with any segments "
+"in this composition.\n"
+"This action cannot be undone, and associations with these files will be "
+"lost.\n"
+"Files will not be removed from your disk.\n"
+"Are you sure?"
+msgstr ""
+"Detta stänger alla ljudfiler som inte hör ihop med något segment i "
+"kompositionen.\n"
+"Åtgärden kan inte ångras, och kopplingen till dessa filer kommer att gå "
+"förlorad.\n"
+"Filerna tas inte bort från disken.\n"
+"Är du säker?"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:865
+msgid ""
+"The following audio files are not used in the current composition.\n"
+"\n"
+"Please select the ones you wish to delete permanently from the hard disk.\n"
+msgstr ""
+"Följande ljudfiler används inte i aktuell komposition.\n"
+"\n"
+"Välj de du vill ta bort permanent från hårddisken.\n"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:875
+#, fuzzy, c-format
+msgid ""
+"_n: <qt>About to delete 1 audio file permanently from the hard disk.<br>This "
+"action cannot be undone, and there will be no way to recover this file."
+"<br>Are you sure?</qt>\n"
+"\n"
+"<qt>About to delete %n audio files permanently from the hard disk.<br>This "
+"action cannot be undone, and there will be no way to recover these files."
+"<br>Are you sure?</qt>"
+msgstr ""
+"_n: På väg att permanent ta bort 1 ljudfil från hårddisken.\n"
+"Det kommer inte att finnas något sätt att återställa filen.\n"
+"Är du säker?\n"
+"På väg att permanent ta bort %n ljudfiler från hårddisken.\n"
+"Det kommer inte att finnas något sätt att återställa filerna.\n"
+"Är du säker?"
+
+#: ../src/document/RosegardenGUIDoc.cpp:525
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:888
+msgid "File %1 could not be deleted."
+msgstr "Filen %1 kunde inte tas bort."
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:921
+msgid "Change Audio File label"
+msgstr "Ändra ljudfilsnamn"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:6466
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:922
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:1099
+msgid "Enter new label"
+msgstr "Skriv nytt namn"
+
+#: ../src/gui/application/RosegardenGUIView.cpp:1538
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:1086
+msgid "Adding audio file..."
+msgstr "Lägger till ljudfil ..."
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:1107
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:1112
+msgid "Failed to add audio file. "
+msgstr "Misslyckades med att lägga till ljudfil."
+
+#: ../src/document/RosegardenGUIDoc.cpp:2789
+#: ../src/gui/application/RosegardenGUIApp.cpp:2736
+#: ../src/gui/application/RosegardenGUIView.cpp:1574
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:1122
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:180
+msgid "Generating audio preview..."
+msgstr "Skapar förhandsgranskning av ljud ..."
+
+#: ../src/gui/application/RosegardenGUIView.cpp:1581
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:1130
+msgid ""
+"Try copying this file to a directory where you have write permission and re-"
+"add it"
+msgstr ""
+"Försök att kopiera filen till en katalog där du har skrivrättighet och lägga "
+"till den igen"
+
+#: ../src/gui/dialogs/TransportDialog.cpp:90 rc.cpp:357
+#, no-c-format
+msgid "Rosegarden Transport"
+msgstr "Spelkontrollpanel"
+
+#: ../src/gui/dialogs/TransportDialog.cpp:925
+#: ../src/gui/dialogs/TransportDialog.cpp:985
+msgid "PITCH WHEEL"
+msgstr "TONHJUL"
+
+#: ../src/gui/dialogs/TransportDialog.cpp:929
+#: ../src/gui/dialogs/TransportDialog.cpp:989
+msgid "CONTROLLER"
+msgstr "EFFEKT"
+
+#: ../src/gui/dialogs/TransportDialog.cpp:933
+#: ../src/gui/dialogs/TransportDialog.cpp:993
+msgid "PROG CHNGE"
+msgstr "PROG ÄNDR"
+
+#: ../src/gui/dialogs/TransportDialog.cpp:938
+#: ../src/gui/dialogs/TransportDialog.cpp:998
+msgid "PRESSURE"
+msgstr "TRYCK"
+
+#: ../src/gui/dialogs/TransportDialog.cpp:942
+#: ../src/gui/dialogs/TransportDialog.cpp:1002
+msgid "SYS MESSAGE"
+msgstr "SYS MEDDEL"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:177
+#: ../src/gui/dialogs/QuantizeDialog.cpp:40
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:127
+msgid "Quantize"
+msgstr "Kvantisering"
+
+#: ../src/gui/dialogs/QuantizeDialog.cpp:52
+msgid "Advanced"
+msgstr "Avancerat"
+
+#: ../src/gui/dialogs/ExportDeviceDialog.cpp:42
+msgid "Export Devices..."
+msgstr "Exportera enheter ..."
+
+#: ../src/gui/dialogs/ExportDeviceDialog.cpp:47
+msgid "Export devices"
+msgstr "Exportera enheter"
+
+#: ../src/gui/dialogs/ExportDeviceDialog.cpp:49
+msgid "Export all devices"
+msgstr "Exportera alla enheter"
+
+#: ../src/gui/dialogs/ExportDeviceDialog.cpp:50
+msgid "Export selected device only"
+msgstr "Exportera bara markerade enheter"
+
+#: ../src/gui/dialogs/ExportDeviceDialog.cpp:51
+msgid " (\"%1\")"
+msgstr " (\"%1\")"
+
+#: ../src/gui/dialogs/CompositionLengthDialog.cpp:44
+msgid "Change Composition Length"
+msgstr "Ändra kompositionens längd"
+
+#: ../src/gui/dialogs/CompositionLengthDialog.cpp:50
+msgid "Set the Start and End bar markers for this Composition"
+msgstr "Ställ in markering av början och slut för kompositionen"
+
+#: ../src/gui/dialogs/CompositionLengthDialog.cpp:54
+msgid "Start Bar"
+msgstr "Första takten"
+
+#: ../src/gui/dialogs/CompositionLengthDialog.cpp:62
+msgid "End Bar"
+msgstr "Sista takten"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:62
+msgid "LilyPond Export/Preview"
+msgstr "Förhandsgranskning"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:85
+#, fuzzy
+msgid "General options"
+msgstr "Allmänna inställningar"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:90
+#, fuzzy
+msgid "Advanced options"
+msgstr "Visa avancerade alternativ"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:112
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:95
+msgid "Headers"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:106
+msgid "Basic options"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:113
+msgid "Compatibility level"
+msgstr "Kompatibilitetsnivå"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:117
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:118
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:119
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:120
+#, fuzzy, c-format
+msgid "LilyPond %1"
+msgstr "Lilypond 2.10"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:125
+msgid "Paper size"
+msgstr "Pappersstorlek"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:129
+msgid "A3"
+msgstr "A3"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:130
+msgid "A4"
+msgstr "A4"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:131
+msgid "A5"
+msgstr "A5"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:132
+msgid "A6"
+msgstr "A6"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:133
+msgid "Legal"
+msgstr "Legal"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:134
+msgid "US Letter"
+msgstr "US Letter"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:135
+msgid "Tabloid"
+msgstr "Tabloid"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:136
+msgid "do not specify"
+msgstr "ange inte"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:152
+msgid "Font size"
+msgstr "Typsnittsstorlek"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:157
+#, fuzzy
+msgid "%1 pt"
+msgstr "%1 (del)"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:169
+#, fuzzy
+msgid "Staff level options"
+msgstr "Visa avancerade alternativ"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:176
+msgid "Export content"
+msgstr "Exportera innehåll"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:179
+msgid "All tracks"
+msgstr "Alla spår"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:180
+msgid "Non-muted tracks"
+msgstr "Ljudande spår"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:181
+msgid "Selected track"
+msgstr "Markerat spår"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:182
+msgid "Selected segments"
+msgstr "Markerade segment"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:188
+msgid "Merge tracks that have the same name"
+msgstr "Sammanfoga spår med samma namn"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:198
+#, fuzzy
+msgid "Notation options"
+msgstr "Notationsegenskaper"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:206
+msgid "First"
+msgstr "Första"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:207
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:538
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:557
+msgid "All"
+msgstr "Alla"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:211
+msgid "Export tempo marks "
+msgstr "Exportera tempobeteckningar"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:215
+#, fuzzy
+msgid "Export lyrics"
+msgstr "Exportera \\lyric-block"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:225
+msgid "Export beamings"
+msgstr "Exportera balkningar"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:232
+msgid "Export track staff brackets"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:244
+#, fuzzy
+msgid "Layout options"
+msgstr "Utläggningsverktygslist"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:257
+#, fuzzy
+msgid "Lyrics alignment"
+msgstr "Sångtext för segmentet"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:261
+msgid "Ragged bottom (systems will not be spread vertically across the page)"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:267
+msgid "Miscellaneous options"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:274
+msgid "Enable \"point and click\" debugging"
+msgstr "Aktivera felsökning med \"peka och klicka\""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:279
+msgid "Export \\midi block"
+msgstr "Exportera \\midi-block"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:284
+#, fuzzy
+msgid "No markers"
+msgstr "Inga delnivåer"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:285
+#, fuzzy
+msgid "Rehearsal marks"
+msgstr "Ta bort alla markeringar"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:286
+#, fuzzy
+msgid "Marker text"
+msgstr "Markeringstid "
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:290
+#, fuzzy
+msgid "Export markers"
+msgstr "Exportera tempobeteckningar"
+
+#: ../src/gui/dialogs/AudioSplitDialog.cpp:57
+msgid "Autosplit Audio Segment"
+msgstr "Dela ljudsegment automatiskt"
+
+#: ../src/gui/dialogs/AudioSplitDialog.cpp:70
+msgid "AutoSplit Segment \""
+msgstr "Dela segment automatiskt \""
+
+#: ../src/gui/dialogs/AudioSplitDialog.cpp:84
+msgid "Threshold"
+msgstr "Tröskel"
+
+#: ../src/gui/dialogs/AudioSplitDialog.cpp:142
+msgid "<no preview generated for this audio file>"
+msgstr "<ingen förhandsgranskning skapad för ljudfilen>"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:70
+msgid "Audio Plugin"
+msgstr "Ljudinsticksmodul"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:94
+#: ../src/gui/widgets/AudioFaderBox.cpp:136
+msgid "Editor"
+msgstr "Editor"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:100
+msgid "Plugin"
+msgstr "Insticksmodul"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:105
+msgid "Category:"
+msgstr "Kategori:"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:110
+msgid "Plugin:"
+msgstr "Insticksmodul:"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:114
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:398
+msgid "Select a plugin from this list."
+msgstr "Välj en insticksmodul i listan."
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:119
+msgid "Bypass"
+msgstr "Koppla förbi"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:121
+msgid "Bypass this plugin."
+msgstr "Koppla förbi insticksmodulen."
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:127
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:390
+msgid "<ports>"
+msgstr "<portar>"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:130
+msgid "Input and output port counts."
+msgstr "Antal in- och utportar."
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:132
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:391
+msgid "<id>"
+msgstr "<id>"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:135
+msgid "Unique ID of plugin."
+msgstr "Unik identifikation för insticksmodulen."
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:149
+msgid "Copy plugin parameters"
+msgstr "Kopiera insticksparametrar"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:155
+msgid "Paste plugin parameters"
+msgstr "Klistra in insticksparametrar"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:161
+msgid "Set to defaults"
+msgstr "Sätt till förvalda inställningar"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:225
+msgid "(any)"
+msgstr "(godtyckligt)"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:226
+msgid "(unclassified)"
+msgstr "(obegränsad)"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:247
+msgid "(none)"
+msgstr "(ingen)"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:389
+#: ../src/gui/editors/parameters/AudioInstrumentParameterPanel.cpp:132
+#: ../src/gui/editors/parameters/AudioInstrumentParameterPanel.cpp:361
+#: ../src/gui/studio/AudioMixerWindow.cpp:685
+#: ../src/gui/studio/AudioMixerWindow.cpp:724
+#: ../src/gui/studio/AudioMixerWindow.cpp:906
+#: ../src/gui/widgets/AudioFaderBox.cpp:79
+msgid "<no plugin>"
+msgstr "<ingen modul>"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:427
+msgid "This plugin has too many controls to edit here."
+msgstr "Insticksprogrammet har för många komponenter att redigera här."
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:438
+#, c-format
+msgid "Id: %1"
+msgstr "Id: %1"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:490
+msgid "mono"
+msgstr "mono"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:492
+msgid "stereo"
+msgstr "stereo"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:494
+msgid "%1 in, %2 out"
+msgstr "%1 in, %2 ut"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:518
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:704
+msgid "Program: "
+msgstr "Program: "
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:522
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:532
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:708
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:716
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:745
+msgid "<none selected>"
+msgstr "<inget markerat>"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:56
+msgid "Set the %1 property of the event selection:"
+msgstr "Ställ in egenskapen %1 för händelsemarkeringen:"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:61
+msgid "Pattern"
+msgstr "Mönster"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:66
+msgid "Flat - set %1 to value"
+msgstr "Jämn: Ställ in %1 till ett värde"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:70
+msgid "Alternating - set %1 to max and min on alternate events"
+msgstr "Växlande: Ställ in %1 till maximum och minimum för varannan händelse"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:74
+msgid "Crescendo - set %1 rising from min to max"
+msgstr "Crescendo: Ställ in %1 stigande från minimum till maximum"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:78
+msgid "Diminuendo - set %1 falling from max to min"
+msgstr "Diminuendo: Ställ in %1 fallande från maximum till minimum"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:82
+msgid "Ringing - set %1 alternating from max to min with both dying to zero"
+msgstr ""
+"Ringning: Ställ in %1 växlande från maximum till minimum med båda bortdöende "
+"till tystnad"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:123
+#: ../src/gui/dialogs/EventParameterDialog.cpp:150
+msgid "First Value"
+msgstr "Första värdet"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:124
+#: ../src/gui/dialogs/EventParameterDialog.cpp:151
+msgid "Second Value"
+msgstr "Andra värdet"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:132
+#: ../src/gui/dialogs/EventParameterDialog.cpp:142
+msgid "Low Value"
+msgstr "Lägsta värdet"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:133
+#: ../src/gui/dialogs/EventParameterDialog.cpp:141
+msgid "High Value"
+msgstr "Högsta värdet"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:56 ../src/gui/rulers/TempoRuler.cpp:127
+msgid "Insert Tempo Change"
+msgstr "Tempo"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:69
+msgid "New tempo:"
+msgstr "Nytt tempo:"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:76
+msgid "Tap"
+msgstr "slag"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:81
+msgid "Tempo is fixed until the following tempo change"
+msgstr "Tempot är fast till följande tempobyte"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:82
+msgid "Tempo ramps to the following tempo"
+msgstr "Mjuk tempoövergång"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:83
+msgid "Tempo ramps to:"
+msgstr "Tempoövergång:"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:120
+msgid "Time of tempo change"
+msgstr "Tid för tempoändring"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:138
+msgid "The pointer is currently at "
+msgstr "Markören är för närvarande vid "
+
+#: ../src/gui/dialogs/TempoDialog.cpp:154
+msgid "Apply this tempo from here onwards"
+msgstr "Använd tempot härifrån och framåt"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:158
+msgid "Replace the last tempo change"
+msgstr "Ersätt senaste tempoändring"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:164
+msgid "Apply this tempo from the start of this bar"
+msgstr "Använd tempot från den här taktens början"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:167
+msgid "Apply this tempo to the whole composition"
+msgstr "Använd tempot för hela kompositionen"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:172
+msgid "Also make this the default tempo"
+msgstr "Gör också detta till standardtempo"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:256
+msgid "%1.%2 s,"
+msgstr "%1,%2 s,"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:262
+#, c-format
+msgid "at the start of measure %1."
+msgstr " i början av takt %1."
+
+#: ../src/gui/dialogs/TempoDialog.cpp:266
+#, c-format
+msgid "in the middle of measure %1."
+msgstr "i mitten av takt %1."
+
+#: ../src/gui/dialogs/TempoDialog.cpp:285
+msgid " (at %1.%2 s, in measure %3)"
+msgstr " (vid %1,%2 s, i takt %3)"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:302
+msgid "There are no preceding tempo changes."
+msgstr "Det finns inga tidigare tempoändringar."
+
+#: ../src/gui/dialogs/TempoDialog.cpp:310
+msgid "There are no other tempo changes."
+msgstr "Det finns inga ytterligare tempoändringar."
+
+#: ../src/gui/dialogs/TempoDialog.cpp:328
+msgid " bpm"
+msgstr " slag/min"
+
+#: ../src/gui/dialogs/AudioPlayingDialog.cpp:42
+msgid "Playing audio file"
+msgstr "Spelar upp ljudfil"
+
+#: ../src/gui/dialogs/AudioPlayingDialog.cpp:47
+msgid "Playing audio file \"%1\""
+msgstr "Spelar upp ljudfil \"%1\""
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:52
+#: ../src/gui/editors/matrix/MatrixView.cpp:2655
+msgid "Trigger Segment"
+msgstr "Utlösande segment"
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:61
+msgid "Trigger segment: "
+msgstr "Utlösande segment: "
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:59
+msgid "Key Change"
+msgstr "Tonart"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:77
+msgid "Key signature"
+msgstr "Fasta förtecken"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:80
+msgid "Key transposition"
+msgstr "Transposition"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:86
+msgid "Existing notes following key change"
+msgstr "Befintliga noter efter tonartsbyte"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:98
+msgid "Flatten"
+msgstr "Sänk"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:100
+msgid "Key"
+msgstr "Tangent"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:105
+msgid "Sharpen"
+msgstr "Höj"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:109
+msgid "Major"
+msgstr "Dur"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:110
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:369
+msgid "Minor"
+msgstr "Moll"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:123
+msgid "Transpose key according to segment transposition"
+msgstr "Transponera tonart enligt segmenttransposition"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:126
+msgid "Use specified key. Do not transpose"
+msgstr "Använd angiven tonart. Transponera ej"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:134
+msgid "Apply to current segment only"
+msgstr "I detta system"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:137
+msgid "Apply to all segments at this time"
+msgstr "I alla system"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:141
+msgid "Exclude percussion segments"
+msgstr ""
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:155
+msgid "Maintain current accidentals"
+msgstr "behåller nuvarande tillfälliga förtecken"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:158
+msgid "Transpose into this key"
+msgstr "transponeras till den här tonarten"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:331
+msgid "No such key"
+msgstr "Tonarten finns inte"
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:44
+#: ../src/gui/editors/notation/NotationSelector.cpp:118
+msgid "Interpret"
+msgstr "Tolka"
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:50
+msgid "Interpretations to apply"
+msgstr "Saker att ta hänsyn till vid uppspelning"
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:53
+msgid "Apply text dynamics (p, mf, ff etc)"
+msgstr "Dynamikbeteckningar (p, mf, ff, etc.)"
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:55
+msgid "Apply hairpin dynamics"
+msgstr "Dynamikklykor"
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:57
+msgid "Stress beats"
+msgstr "Taktslagsbetoning"
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:59
+msgid "Articulate slurs, staccato, tenuto etc"
+msgstr "Artikulationsbeteckningar"
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:61
+msgid "All available interpretations"
+msgstr "Allt tillgängligt"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:316
+#, fuzzy
+msgid ""
+"Attempted to launch JACK audio daemon failed. Audio will be disabled.\n"
+"Please check configuration (Settings -> Configure Rosegarden -> Audio -> "
+"Startup)\n"
+" and restart."
+msgstr ""
+"Försöket att starta ljuddemonen JACK misslyckades. Ljudet är avstängt.\n"
+"Kontrollera inställningarna (Inställningar -> Anpassa Rosegarden -> Spelare -"
+"> JACK-styrning)\n"
+"och starta om."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:325
+msgid "Starting sequencer..."
+msgstr "Startar spelare ..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:333
+msgid "Initializing plugin manager..."
+msgstr "Initierar instickshantering ..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:338
+msgid "Initializing view..."
+msgstr "Initierar vy ..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:354
+msgid "Special Parameters"
+msgstr "Speciella parametrar"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:430
+msgid "Starting sequence manager..."
+msgstr "Startar spelarhanteraren ..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:456
+msgid "Clearing studio data..."
+msgstr "Rensar studiodata ..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:475
+#: ../src/gui/editors/notation/NotationView.cpp:558
+msgid "Starting..."
+msgstr "Startar ..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:556
+msgid "Import Rosegarden &Project file..."
+msgstr "Importera Rosegarden-&projektfil ..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:560
+msgid "Import &MIDI file..."
+msgstr "Importera &MIDI-fil ..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:564
+msgid "Import &Rosegarden 2.1 file..."
+msgstr "Importera &Rosegarden-2.1-fil ..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:568
+msgid "Import &Hydrogen file..."
+msgstr "Importera &Hydrogen-fil ..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:572
+msgid "Merge &File..."
+msgstr "Sammanfoga &fil ..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:576
+msgid "Merge &MIDI file..."
+msgstr "Sammanfoga &MIDI-fil ..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:580
+msgid "Merge &Rosegarden 2.1 file..."
+msgstr "Sammanfoga &Rosegarden-2.1-fil ..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:584
+msgid "Merge &Hydrogen file..."
+msgstr "Sammanfoga &Hydrogen-fil ..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:588
+msgid "Export Rosegarden &Project file..."
+msgstr "Exportera Rosegarden-&projektfil ..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:592
+msgid "Export &MIDI file..."
+msgstr "Exportera &MIDI-fil ..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:596
+#, fuzzy
+msgid "Export &LilyPond file..."
+msgstr "Exportera &Lilypond-fil ..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:600
+msgid "Export Music&XML file..."
+msgstr "Exportera Music&XML-fil ..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:604
+msgid "Export &Csound score file..."
+msgstr "Exportera &Csound-partiturfil ..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:608
+msgid "Export M&up file..."
+msgstr "Exportera M&up-fil ..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:612
+#: ../src/gui/editors/notation/NotationView.cpp:1500
+#, fuzzy
+msgid "Print &with LilyPond..."
+msgstr "Förhandsgranskning med Lil&ypond ..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:616
+#: ../src/gui/editors/notation/NotationView.cpp:1504
+msgid "Preview with Lil&yPond..."
+msgstr "Förhandsgranskning med Lil&ypond ..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:620
+msgid "Play&list"
+msgstr "Spel&lista ..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:627
+msgid "Rosegarden &Tutorial"
+msgstr "Rosegarden-hand&boken"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:631
+msgid "&Bug Reporting Guidelines"
+msgstr "&Riktlinjer för felrapportering"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:645
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:348
+#: ../src/gui/editors/segment/MarkerEditor.cpp:378
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:388
+#: ../src/gui/general/EditViewBase.cpp:190
+#: ../src/gui/studio/BankEditorDialog.cpp:318
+#: ../src/gui/studio/DeviceManagerDialog.cpp:227
+msgid "Und&o"
+msgstr "Å&ngra"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:651
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:354
+#: ../src/gui/editors/segment/MarkerEditor.cpp:384
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:394
+#: ../src/gui/general/EditViewBase.cpp:196
+#: ../src/gui/studio/BankEditorDialog.cpp:324
+#: ../src/gui/studio/DeviceManagerDialog.cpp:233
+msgid "Re&do"
+msgstr "&Gör om"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:665
+#: ../src/gui/editors/notation/NotationView.cpp:2297
+msgid "Show T&ools Toolbar"
+msgstr "Visa redigeringsver&ktygslist"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:669
+msgid "Show Trac&ks Toolbar"
+msgstr "Visa s&pårverktygslist"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:673
+msgid "Show &Editors Toolbar"
+msgstr "Visa e&ditorverktygslist"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:677
+#: ../src/gui/editors/notation/NotationView.cpp:2309
+msgid "Show Trans&port Toolbar"
+msgstr "Visa verktygslist med s&pelkontroller"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:681
+msgid "Show &Zoom Toolbar"
+msgstr "Visa &zoomverktygslist"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:688
+msgid "Show Tra&nsport"
+msgstr "Visa &spelkontrollfönster"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:693
+msgid "Show Track &Labels"
+msgstr "Visa sp&årnamn"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:698
+msgid "Show Playback Position R&uler"
+msgstr "Visa &uppspelningslinjal"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:703
+msgid "Show Te&mpo Ruler"
+msgstr "Visa te&mpolinjal"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:708
+msgid "Show Cho&rd Name Ruler"
+msgstr "Visa &linjal för ackordnamn"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:714
+msgid "Show Segment Pre&views"
+msgstr "Visa &förhandsgranskningar av segment"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:719
+msgid "Show Special &Parameters"
+msgstr "Visa speciella &parametrar"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:753
+#: ../src/gui/editors/matrix/MatrixView.cpp:641
+#: ../src/gui/editors/notation/NotationView.cpp:1772
+msgid "&Select and Edit"
+msgstr "&Markera och redigera"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:758
+#: ../src/gui/editors/matrix/MatrixView.cpp:646
+msgid "&Draw"
+msgstr "&Rita"
+
+#: ../src/commands/edit/EraseCommand.h:50
+#: ../src/gui/application/RosegardenGUIApp.cpp:763
+#: ../src/gui/editors/matrix/MatrixView.cpp:651
+#: ../src/gui/editors/notation/NotationView.cpp:1766
+msgid "&Erase"
+msgstr "Rad&era"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:768
+#: ../src/gui/editors/matrix/MatrixView.cpp:656
+msgid "&Move"
+msgstr "&Flytta"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:775
+msgid "&Resize"
+msgstr "&Ändra storlek"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:782 rc.cpp:87
+#, no-c-format
+msgid "&Split"
+msgstr "&Dela"
+
+#: ../src/commands/segment/SegmentJoinCommand.h:53
+#: ../src/gui/application/RosegardenGUIApp.cpp:789
+msgid "&Join"
+msgstr "&Sammanfoga"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:795
+msgid "&Harmonize"
+msgstr "&Harmoniera"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:806
+#: ../src/gui/rulers/TempoRuler.cpp:157
+msgid "Open Tempo and Time Signature Editor"
+msgstr "Öppna tempo- och taktartsverktyget"
+
+#: ../src/commands/segment/CutRangeCommand.cpp:41
+#: ../src/gui/application/RosegardenGUIApp.cpp:812
+msgid "Cut Range"
+msgstr "Klippomfång"
+
+#: ../src/commands/edit/CopyCommand.cpp:73
+#: ../src/gui/application/RosegardenGUIApp.cpp:816
+msgid "Copy Range"
+msgstr "Kopiera omfång"
+
+#: ../src/commands/segment/PasteRangeCommand.cpp:45
+#: ../src/gui/application/RosegardenGUIApp.cpp:820
+msgid "Paste Range"
+msgstr "Inklistringsomfång"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:828
+msgid "Insert Range..."
+msgstr "Infoga omfång ..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:832
+#: ../src/gui/editors/notation/NotationView.cpp:1804
+msgid "De&lete"
+msgstr "Ta &bort"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:836
+msgid "Select &All Segments"
+msgstr "Markera &alla segment"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:852
+msgid "Edit Mar&kers..."
+msgstr "&Redigera markeringar ..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:856
+msgid "Edit Document P&roperties..."
+msgstr "Redigera dokument&egenskaper ..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:864
+msgid "Open in &Default Editor"
+msgstr "&Öppna i standardvy"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:870
+#: ../src/gui/general/EditViewBase.cpp:206
+msgid "Open in Matri&x Editor"
+msgstr "Öppna i m&atriseditor"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:876
+#: ../src/gui/general/EditViewBase.cpp:212
+msgid "Open in &Percussion Matrix Editor"
+msgstr "Öppna i slag&verksmatriseditor"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:882
+#: ../src/gui/general/EditViewBase.cpp:218
+msgid "Open in &Notation Editor"
+msgstr "Öppna i &noteditor"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:888
+#: ../src/gui/general/EditViewBase.cpp:224
+msgid "Open in &Event List Editor"
+msgstr "Öppna i ed&itor för händelselista"
+
+#: ../src/commands/edit/EventQuantizeCommand.cpp:120
+#: ../src/commands/edit/EventUnquantizeCommand.cpp:87
+#: ../src/gui/application/RosegardenGUIApp.cpp:894
+msgid "&Quantize..."
+msgstr "&Kvantisera..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:908
+#: ../src/gui/editors/matrix/MatrixView.cpp:686
+msgid "Repeat Last Quantize"
+msgstr "Upprepa senaste kvantisering"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:928
+msgid "Split at Time..."
+msgstr "Dela vid tid ..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:932
+#: ../src/gui/general/EditView.cpp:796
+msgid "Jog &Left"
+msgstr "Knuffa åt &vänster"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:936
+#: ../src/gui/general/EditView.cpp:800
+msgid "Jog &Right"
+msgstr "Knuffa åt &höger"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:940
+msgid "Set Start Time..."
+msgstr "Ställ in starttid ..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:944
+msgid "Set Duration..."
+msgstr "Ställ in längd ..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:953
+msgid "Turn Re&peats into Copies"
+msgstr "Omvandla u&pprepningar till kopior"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:958
+msgid "Manage Tri&ggered Segments"
+msgstr "Hantera &utlösande segment ..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:962
+msgid "Set Tempos from &Beat Segment"
+msgstr "Ställ in tempon från ta&ktsegment"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:966
+msgid "Set &Tempo to Audio Segment Duration"
+msgstr "Ställ in &tempo till ljudsegmentets längd"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:972
+#, fuzzy
+msgid "Manage A&udio Files"
+msgstr "Ändra ljudfilsnamn"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:977
+msgid "Show Segment Labels"
+msgstr "Visa segmentnamn"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:986
+msgid "Add &Track"
+msgstr "Lägg till ett &spår"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:990
+#, fuzzy
+msgid "&Add Tracks..."
+msgstr "Lägg till spår ..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:996
+msgid "D&elete Track"
+msgstr "&Ta bort markerat spår"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1002
+msgid "Move Track &Down"
+msgstr "Flytta &ner spår"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1008
+msgid "Move Track &Up"
+msgstr "Flytta &upp spår"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1012
+msgid "Select &Next Track"
+msgstr "&Markera nästa spår"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1017
+msgid "Select &Previous Track"
+msgstr "Markera &föregående spår"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1022
+#, fuzzy
+msgid "Mute or Unmute Track"
+msgstr "Spela upp detta spår"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1027
+msgid "Arm or Un-arm Track for Record"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1034
+msgid "&Mute all Tracks"
+msgstr "Gö&r alla spår stumma"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1040
+msgid "&Unmute all Tracks"
+msgstr "&Gör alla spår ljudande"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1044
+msgid "&Remap Instruments..."
+msgstr "Mappa &om instrument ..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1053
+msgid "&Audio Mixer"
+msgstr "Lj&udmixer"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1059
+msgid "Midi Mi&xer"
+msgstr "MIDI-mi&xer ..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1065
+msgid "Manage MIDI &Devices"
+msgstr "Hantera MIDI-en&heter ..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1071
+msgid "Manage S&ynth Plugins"
+msgstr "Hantera s&yntinsticksmoduler ..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1075
+msgid "Modify MIDI &Filters"
+msgstr "Ändra MIDI-&filter ..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1079
+msgid "MIDI Thru Routing"
+msgstr "MIDI-Thru-dragning"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1085
+msgid "Manage &Metronome"
+msgstr "Hantera &metronom ..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1089
+msgid "&Save Current Document as Default Studio"
+msgstr "&Spara nuvarande dokument som standardstudio ..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1093
+msgid "&Import Default Studio"
+msgstr "&Importera standardstudio ..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1097
+msgid "Im&port Studio from File..."
+msgstr "Im&portera studio från fil ..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1101
+msgid "&Reset MIDI Network"
+msgstr "&Återställ MIDI-nätverk"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1105
+#, fuzzy
+msgid "Set Quick Marker at Playback Position"
+msgstr "Tempo"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1109
+msgid "Jump to Quick Marker"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1142
+#: ../src/gui/editors/matrix/MatrixView.cpp:782
+#: ../src/gui/editors/notation/NotationView.cpp:2397
+#: ../src/gui/studio/AudioMixerWindow.cpp:105
+#: ../src/gui/studio/MidiMixerWindow.cpp:81
+msgid "&Play"
+msgstr "S&pela"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1153
+#: ../src/gui/editors/matrix/MatrixView.cpp:791
+#: ../src/gui/editors/notation/NotationView.cpp:2406
+#: ../src/gui/studio/AudioMixerWindow.cpp:114
+#: ../src/gui/studio/MidiMixerWindow.cpp:90
+msgid "&Stop"
+msgstr "&Stoppa"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1160
+#: ../src/gui/editors/matrix/MatrixView.cpp:802
+#: ../src/gui/editors/notation/NotationView.cpp:2417
+#: ../src/gui/studio/AudioMixerWindow.cpp:125
+#: ../src/gui/studio/MidiMixerWindow.cpp:101
+msgid "&Fast Forward"
+msgstr "Spola &fram"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1168
+#: ../src/gui/editors/matrix/MatrixView.cpp:796
+#: ../src/gui/editors/notation/NotationView.cpp:2411
+#: ../src/gui/studio/AudioMixerWindow.cpp:119
+#: ../src/gui/studio/MidiMixerWindow.cpp:95
+msgid "Re&wind"
+msgstr "Spola &tillbaka"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1175
+msgid "P&unch in Record"
+msgstr "Pu&nch-in-inspelning"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1182
+#: ../src/gui/studio/AudioMixerWindow.cpp:143
+#: ../src/gui/studio/MidiMixerWindow.cpp:119
+msgid "&Record"
+msgstr "Spela &in"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1189
+#: ../src/gui/editors/matrix/MatrixView.cpp:808
+#: ../src/gui/editors/notation/NotationView.cpp:2423
+#: ../src/gui/studio/AudioMixerWindow.cpp:131
+#: ../src/gui/studio/MidiMixerWindow.cpp:107
+msgid "Rewind to &Beginning"
+msgstr "Spola tillbaka till &början"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1196
+#: ../src/gui/editors/matrix/MatrixView.cpp:814
+#: ../src/gui/editors/notation/NotationView.cpp:2429
+#: ../src/gui/studio/AudioMixerWindow.cpp:137
+#: ../src/gui/studio/MidiMixerWindow.cpp:113
+msgid "Fast Forward to &End"
+msgstr "Spola fram till s&lutet"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1203
+#: ../src/gui/editors/matrix/MatrixView.cpp:832
+#: ../src/gui/editors/notation/NotationView.cpp:2447
+msgid "Scro&ll to Follow Playback"
+msgstr "&Rulla för att följa uppspelning"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1209
+#: ../src/gui/editors/matrix/MatrixView.cpp:838
+#: ../src/gui/editors/notation/NotationView.cpp:2453
+#: ../src/gui/studio/AudioMixerWindow.cpp:149
+#: ../src/gui/studio/MidiMixerWindow.cpp:125
+msgid "Panic"
+msgstr "Panik"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1213
+msgid "Segment Debug Dump "
+msgstr "Felsökningsutskrift av segment "
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1283
+msgid " Zoom: "
+msgstr " Zooma: "
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1719
+msgid "File \"%1\" does not exist"
+msgstr "Filen \"%1\" finns inte"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1725
+msgid "File \"%1\" is actually a directory"
+msgstr "Filen \"%1\" är i själva verket en katalog"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1734
+msgid "You do not have read permission for \"%1\""
+msgstr "Du har inte läsrättigheter till \"%1\""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1802
+msgid ""
+"An auto-save file for this document has been found\n"
+"Do you want to open it instead ?"
+msgstr ""
+"En automatiskt sparad fil för det här dokumentet har hittats.\n"
+"Vill du öppna den istället?"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1896
+msgid "Example Files"
+msgstr "Exempelfiler"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2100
+msgid "Opening a new application window..."
+msgstr "Öppnar ett nytt programfönster ..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2110
+msgid "Creating new document..."
+msgstr "Skapar nytt dokument ..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2154
+#, c-format
+msgid ""
+"Malformed URL\n"
+"%1"
+msgstr ""
+"Felaktig webbadress\n"
+"%1"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2179
+#: ../src/gui/application/RosegardenGUIApp.cpp:2240
+msgid "Opening file..."
+msgstr "Öppnar fil ..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2201
+#: ../src/gui/application/RosegardenGUIApp.cpp:2220
+msgid "Open File"
+msgstr "Öppna fil"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1225
+#: ../src/gui/application/RosegardenGUIApp.cpp:2258
+msgid "Saving file..."
+msgstr "Sparar fil ..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2330
+msgid "This is not a valid filename.\n"
+msgstr "Detta är inte ett giltigt filnamn.\n"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2335
+msgid "This is not a local file.\n"
+msgstr "Detta är inte en lokal fil.\n"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2342
+#: ../src/gui/studio/BankEditorDialog.cpp:1640
+#: ../src/gui/studio/DeviceManagerDialog.cpp:787
+msgid "You have specified a directory"
+msgstr "Du har angivit en katalog"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2348
+#: ../src/gui/studio/BankEditorDialog.cpp:1646
+#: ../src/gui/studio/DeviceManagerDialog.cpp:793
+msgid "The specified file exists. Overwrite?"
+msgstr "Den angivna filen finns. Ska den skrivas över?"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2362
+msgid "Saving file with a new filename..."
+msgstr "Sparar fil med ett nytt namn ..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2364
+msgid "Rosegarden files"
+msgstr "Rosegardenfiler"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2365
+#: ../src/gui/application/RosegardenGUIApp.cpp:4860
+#: ../src/gui/application/RosegardenGUIApp.cpp:4904
+#: ../src/gui/application/RosegardenGUIApp.cpp:4942
+#: ../src/gui/application/RosegardenGUIApp.cpp:4975
+#: ../src/gui/application/RosegardenGUIApp.cpp:5009
+#: ../src/gui/application/RosegardenGUIApp.cpp:5116
+msgid "All files"
+msgstr "Alla filer"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2366
+msgid "Save as..."
+msgstr "Spara som ..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2404
+msgid "Closing file..."
+msgstr "Stänger fil ..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2421
+#: ../src/gui/editors/notation/NotationView.cpp:4618
+msgid "Printing..."
+msgstr "Skriver ut ..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2433
+#: ../src/gui/editors/notation/NotationView.cpp:4635
+msgid "Previewing..."
+msgstr "Förhandsgranskar ..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2440
+msgid "Exiting..."
+msgstr "Avslutar ..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2463
+msgid "Cutting selection..."
+msgstr "Klipper ut markering ..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2474
+#: ../src/gui/editors/matrix/MatrixView.cpp:1614
+#: ../src/gui/editors/notation/NotationView.cpp:4763
+msgid "Copying selection to clipboard..."
+msgstr "Kopierar markering till klippbord ..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2484
+#: ../src/gui/editors/eventlist/EventView.cpp:878
+#: ../src/gui/editors/matrix/MatrixView.cpp:1625
+#: ../src/gui/editors/notation/NotationView.cpp:4796
+#: ../src/gui/editors/notation/NotationView.cpp:4841
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:352
+msgid "Clipboard is empty"
+msgstr "Klippbordet är tomt"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2487
+#: ../src/gui/editors/eventlist/EventView.cpp:882
+#: ../src/gui/editors/matrix/MatrixView.cpp:1629
+#: ../src/gui/editors/notation/NotationView.cpp:4804
+#: ../src/gui/editors/notation/NotationView.cpp:4845
+msgid "Inserting clipboard contents..."
+msgstr "Infogar klippbordets innehåll ..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2556
+msgid "Duration of empty range to insert"
+msgstr "Längden för det tomma omfånget att infoga"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2631
+msgid "This function needs no more than one segment to be selected."
+msgstr "Den här funktionen kräver att bara ett segment är markerat."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2654
+msgid "Can't join Audio segments"
+msgstr "Kan inte sammanfoga ljudsegment"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2707
+msgid "rescaling an audio file"
+msgstr "storleksändrar en ljudfil"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2723
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:172
+msgid "Rescaling audio file..."
+msgstr "Storleksändrar en ljudfil ..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2767
+msgid ""
+"The audio file path does not exist or is not writable.\n"
+"You must set the audio file path to a valid directory in Document Properties "
+"before %1.\n"
+"Would you like to set it now?"
+msgstr ""
+"Ljudfilens sökväg finns inte eller är inte skrivbar.\n"
+"Du måste ange ljudfilens sökväg till en giltig katalog i Dokumentegenskaper "
+"före %1.\n"
+"Vill du ange den nu?"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2769
+#: ../src/gui/application/RosegardenGUIApp.cpp:5291
+#: ../src/gui/application/RosegardenGUIApp.cpp:5339
+#: ../src/gui/editors/segment/TrackButtons.cpp:419
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:159
+msgid "Set audio file path"
+msgstr "Ange sökväg för ljudfil"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2833
+msgid "Jog Selection"
+msgstr "Knuffa markering"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2978
+#, fuzzy, c-format
+msgid ""
+"_n: Split Segment at Time\n"
+"Split %n Segments at Time"
+msgstr ""
+"%1 - Segment - Notation\n"
+"%1 - %n Segment - Notation"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3013
+#: ../src/gui/general/EditViewBase.cpp:619
+msgid "Segment Start Time"
+msgstr "Starttid för segment"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3023
+msgid "Set Segment Start Times"
+msgstr "Ställ in starttider för segment"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3024
+#: ../src/gui/general/EditViewBase.cpp:626
+msgid "Set Segment Start Time"
+msgstr "Starttid för segment"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3056
+#: ../src/gui/general/EditViewBase.cpp:644
+msgid "Segment Duration"
+msgstr "Segmentlängd"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3068
+msgid "Set Segment Durations"
+msgstr "Ställ in segmentlängder"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3069
+#: ../src/gui/general/EditViewBase.cpp:652
+msgid "Set Segment Duration"
+msgstr "Ställ in segmentlängd"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3176
+#: ../src/gui/application/RosegardenGUIApp.cpp:5875
+msgid "Set Global Tempo"
+msgstr "Ställ in övergripande tempo"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3234
+#: ../src/gui/general/EditViewBase.cpp:477
+msgid "Toggle the toolbar..."
+msgstr "Växla verktygslist..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3244
+msgid "Toggle the tools toolbar..."
+msgstr "Växla redigeringsverktygslist ..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3254
+msgid "Toggle the tracks toolbar..."
+msgstr "Växla spårverktygslist ..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3264
+msgid "Toggle the editor toolbar..."
+msgstr "Växla editorverktygslist ..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3274
+msgid "Toggle the transport toolbar..."
+msgstr "Växla spelverktygslist ..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3284
+msgid "Toggle the zoom toolbar..."
+msgstr "Växla zoomverktygslist ..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3294
+msgid "Toggle the Transport"
+msgstr "Växla spelkontrollfönster"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3377
+#: ../src/gui/general/EditViewBase.cpp:487
+msgid "Toggle the statusbar..."
+msgstr "Växla statuslisten ..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3434
+msgid ""
+"The join tool isn't implemented yet. Instead please highlight the segments "
+"you want to join and then use the menu option:\n"
+"\n"
+" Segments->Collapse Segments.\n"
+msgstr ""
+"Sammanfogningsverktyget är ännu inte implementerat. Markera istället "
+"segmenten som du vill sammanfoga och använd därefter menyalternativet:\n"
+"\n"
+"Segment -> Sammanfoga segment.\n"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3437
+msgid "Join tool not yet implemented"
+msgstr "Sammanfogningsverktyg ännu inte implementerat"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3675
+msgid "Revert modified document to previous saved version?"
+msgstr "Återställ ändrat dokument till tidigare sparad version?"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3691
+msgid ""
+"*.rgp|Rosegarden Project files\n"
+"*|All files"
+msgstr ""
+"*.rgp|Rosegarden projektfiler\n"
+"*|Alla filer"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3692
+msgid "Import Rosegarden Project File"
+msgstr "Importera Rosegarden-projektfil"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3717
+msgid "Failed to import project file \"%1\""
+msgstr "Misslyckades att importera projektfilen \"%1\""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3739
+msgid "Open MIDI File"
+msgstr "Öppna MIDI-fil"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3756
+msgid "Merge MIDI File"
+msgstr "Sammanfoga MIDI-fil"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3866
+msgid "Importing MIDI file..."
+msgstr "Importerar MIDI-fil ..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3903
+msgid "Calculating notation..."
+msgstr "Beräknar notering ..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3950
+msgid "Calculate Notation"
+msgstr "Beräkna notering"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3991
+#: ../src/gui/application/RosegardenGUIApp.cpp:4008
+msgid ""
+"*.rose|Rosegarden-2 files\n"
+"*|All files"
+msgstr ""
+"*.rose|Rosegarden-2-filer\n"
+"*|Alla filer"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3992
+#: ../src/gui/application/RosegardenGUIApp.cpp:4009
+msgid "Open Rosegarden 2.1 File"
+msgstr "Öppna Rosegarden-2.1-fil"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4026
+msgid "Importing Rosegarden 2.1 file..."
+msgstr "Importerar Rosegarden-2.1-fil ..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4052
+msgid "Can't load Rosegarden 2.1 file. It appears to be corrupted."
+msgstr "Kan inte ladda Rosegarden-2.1-fil. Den verkar vara skadad."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4078
+#: ../src/gui/application/RosegardenGUIApp.cpp:4095
+msgid ""
+"*.h2song|Hydrogen files\n"
+"*|All files"
+msgstr ""
+"*.h2song|Hydrogen-filer\n"
+"*|Alla filer"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4079
+#: ../src/gui/application/RosegardenGUIApp.cpp:4096
+msgid "Open Hydrogen File"
+msgstr "Öppna Hydrogen-fil"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4113
+msgid "Importing Hydrogen file..."
+msgstr "Importerar Hydrogen-fil ..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4139
+msgid "Can't load Hydrogen file. It appears to be corrupted."
+msgstr "Kan inte ladda Rosegarden-2.1-fil. Den verkar vara skadad."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4527
+#, fuzzy
+msgid "Export and import of Rosegarden Project files"
+msgstr "Exporterar Rosegarden-projektfil ..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4529
+#, fuzzy
+msgid "The Rosegarden Project Packager helper script"
+msgstr "Rosegardens projektpaketerare ej tillgänglig"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4533
+msgid "%1 - for project file support"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4550
+msgid "The Rosegarden LilyPondView helper script"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4554
+#, fuzzy
+msgid "%1 - for LilyPond preview support"
+msgstr "Förhandsgranskningsalternativ för Lilypond"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4570
+msgid "The Rosegarden Audio File Importer helper script"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4574
+#, fuzzy
+msgid "%1 - for audio file import"
+msgstr "Ange sökväg för ljudfil"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4585
+msgid ""
+"<h3>Helper programs not found</h3><p>Rosegarden could not find one or more "
+"helper programs which it needs to provide some features. The following "
+"features will not be available:</p>"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4586
+#: ../src/gui/application/RosegardenGUIApp.cpp:4592
+#, fuzzy
+msgid "<ul>"
+msgstr "<förval>"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4588
+#: ../src/gui/application/RosegardenGUIApp.cpp:4594
+#, fuzzy
+msgid "<li>%1</li>"
+msgstr "<li>%1 (från %2)</li>"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4590
+#: ../src/gui/application/RosegardenGUIApp.cpp:4596
+msgid "</ul>"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4591
+msgid ""
+"<p>To fix this, you should install the following additional programs:</p>"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4603
+msgid "Helper programs not found"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4686
+msgid "Starting the sequencer..."
+msgstr "Startar spelaren ..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4712
+msgid "Couldn't start the sequencer"
+msgstr "Kunde inte starta spelaren"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4789
+msgid "Clearing down jackd..."
+msgstr "Tar bort jackd ..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4803
+msgid "Starting jackd..."
+msgstr "Startar jackd ..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4842
+msgid ""
+"The Rosegarden sequencer process has exited unexpectedly. Sound and "
+"recording will no longer be available for this session.\n"
+"Please exit and restart Rosegarden to restore sound capability."
+msgstr ""
+"Rosegardens spelarprocess har oväntat avslutats. Ljud och inspelning är inte "
+"längre tillgängliga för den här sessionen.\n"
+"Avsluta och starta om Rosegarden för att återställa ljudfunktionen."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4846
+msgid ""
+"The Rosegarden sequencer could not be started, so sound and recording will "
+"be unavailable for this session.\n"
+"For assistance with correct audio and MIDI configuration, go to http://"
+"rosegardenmusic.com."
+msgstr ""
+"Rosegardens spelare kunde inte startas, alltså är ljud och inspelning inte "
+"tillgängliga för den här sessionen.\n"
+"För hjälp med riktig inställning av ljud och MIDI, besök http://www."
+"rosegardenmusic.com."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4856
+msgid "Exporting Rosegarden Project file..."
+msgstr "Exporterar Rosegarden-projektfil ..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4859
+msgid "Rosegarden Project files\n"
+msgstr "Rosegarden-projektfiler\n"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4861
+#: ../src/gui/application/RosegardenGUIApp.cpp:4905
+#: ../src/gui/application/RosegardenGUIApp.cpp:4943
+#: ../src/gui/application/RosegardenGUIApp.cpp:4976
+#: ../src/gui/application/RosegardenGUIApp.cpp:5010
+#: ../src/gui/application/RosegardenGUIApp.cpp:5116
+msgid "Export as..."
+msgstr "Exportera som ..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4875
+#, c-format
+msgid "Saving Rosegarden file to package failed: %1"
+msgstr "Misslyckades spara Rosegarden-fil till paket: %1"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4889
+msgid "Failed to export to project file \"%1\""
+msgstr "Misslyckades exportera projektfilen \"%1\""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4900
+#: ../src/gui/application/RosegardenGUIApp.cpp:4915
+msgid "Exporting MIDI file..."
+msgstr "Exporterar MIDI-fil ..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4903
+msgid "Standard MIDI files\n"
+msgstr "Standard-MIDI-filer\n"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4934
+#: ../src/gui/application/RosegardenGUIApp.cpp:4966
+#: ../src/gui/application/RosegardenGUIApp.cpp:4999
+#: ../src/gui/application/RosegardenGUIApp.cpp:5103
+#: ../src/gui/application/RosegardenGUIApp.cpp:5140
+#: ../src/gui/editors/notation/NotationView.cpp:4733
+msgid "Export failed. The file could not be opened for writing."
+msgstr "Export misslyckades. Filen kunde inte öppnas för skrivning."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4940
+#: ../src/gui/application/RosegardenGUIApp.cpp:4952
+msgid "Exporting Csound score file..."
+msgstr "Exporterar Csound-partiturfil ..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4972
+#: ../src/gui/application/RosegardenGUIApp.cpp:4985
+msgid "Exporting Mup file..."
+msgstr "Exporterar Mup-fil ..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4975
+msgid "Mup files\n"
+msgstr "Mup-filer\n"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5005
+#: ../src/gui/application/RosegardenGUIApp.cpp:5089
+#: ../src/gui/editors/notation/NotationView.cpp:4719
+#, fuzzy
+msgid "Exporting LilyPond file..."
+msgstr "Exporterar Lilypond-fil ..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5008
+#, fuzzy
+msgid "LilyPond files"
+msgstr "Lilypond-filer"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5023
+#: ../src/gui/editors/notation/NotationView.cpp:4653
+#, fuzzy
+msgid "Printing LilyPond file..."
+msgstr "Förhandsgranskar Lilypond-fil ..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5028
+#: ../src/gui/application/RosegardenGUIApp.cpp:5052
+#: ../src/gui/editors/notation/NotationView.cpp:4658
+#: ../src/gui/editors/notation/NotationView.cpp:4682
+#, fuzzy
+msgid "Failed to open a temporary file for LilyPond export."
+msgstr "Misslyckades att öppna en tillfällig fil för export till Lilypond."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5047
+#: ../src/gui/editors/notation/NotationView.cpp:4677
+#, fuzzy
+msgid "Previewing LilyPond file..."
+msgstr "Förhandsgranskar Lilypond-fil ..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5080
+#: ../src/gui/editors/notation/NotationView.cpp:4710
+#, fuzzy
+msgid "LilyPond Preview Options"
+msgstr "Förhandsgranskningsalternativ för Lilypond"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5081
+#: ../src/gui/editors/notation/NotationView.cpp:4711
+#, fuzzy
+msgid "LilyPond preview options"
+msgstr "Förhandsgranskningsalternativ för Lilypond"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5112
+#: ../src/gui/application/RosegardenGUIApp.cpp:5126
+msgid "Exporting MusicXML file..."
+msgstr "Exporterar MusicXML-fil ..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5115
+msgid "XML files"
+msgstr "XML-filer"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5289
+#: ../src/gui/editors/segment/TrackButtons.cpp:417
+msgid ""
+"The audio file path does not exist or is not writable.\n"
+"Please set the audio file path to a valid directory in Document Properties "
+"before recording audio.\n"
+"Would you like to set it now?"
+msgstr ""
+"Sökvägen till ljudfiler finns inte eller är inte skrivbar.\n"
+"Ställ in sökvägen till ljudfiler till en giltig katalog i dokumentegenskaper "
+"innan ljud spelas in.\n"
+"Vill du ställa in den nu?"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5337
+msgid ""
+"The audio file path does not exist or is not writable.\n"
+"Please set the audio file path to a valid directory in Document Properties "
+"before you start to record audio.\n"
+"Would you like to set it now?"
+msgstr ""
+"Sökvägen till ljudfiler finns inte eller är inte skrivbar.\n"
+"Ställ in sökvägen till ljudfiler till en giltig katalog i dokumentegenskaper "
+"innan du börjar spela in ljud.\n"
+"Vill du ställa in den nu?"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5780
+msgid "Move playback pointer to time"
+msgstr "Flytta uppspelningsvisaren till tid"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5793
+#: ../src/gui/editors/matrix/MatrixView.cpp:2240
+msgid "%1%"
+msgstr "%1%"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5861
+#, c-format
+msgid "Replace Tempo Change at %1"
+msgstr "Ersätt tempoändring vid %1"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5891
+msgid "Set Global and Default Tempo"
+msgstr "Ställ in övergripande tempo och standardtempo"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5914
+msgid "Move Tempo Change"
+msgstr "Flytta tempobyte"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5949
+#, fuzzy
+msgid "new marker"
+msgstr "Inga delnivåer"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5950
+#, fuzzy
+msgid "no description"
+msgstr "Beskrivning"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:6363
+#, c-format
+msgid "Sequencer failed to add audio file %1"
+msgstr "Spelaren misslyckades med att lägga till ljudfilen %1"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:6388
+#, c-format
+msgid "Sequencer failed to remove audio file id %1"
+msgstr "Spelaren misslyckades med att ta bort ljudfilen med id %1"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:6448
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:1086
+msgid "Modify Segment label"
+msgstr "Ändra segmentnamn"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:6450
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:1088
+msgid "Modify Segments label"
+msgstr "Ändra segmentnamn"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:6452
+msgid "Relabelling selection..."
+msgstr "Ändrar namn på markering ..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7539
+msgid "Play List"
+msgstr "Spellista"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7567
+msgid "http://rosegarden.sourceforge.net/tutorial/en/chapter-0.html"
+msgstr "http://rosegarden.sourceforge.net/tutorial/en/chapter-0.html"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7574
+msgid "http://rosegarden.sourceforge.net/tutorial/bug-guidelines.html"
+msgstr "http://rosegarden.sourceforge.net/tutorial/bug-guidelines.html"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7650
+msgid "Queueing MIDI panic events for tranmission..."
+msgstr "Köar MIDI-panikhändelser för att skicka..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7708
+msgid "Are you sure you want to save this as your default studio?"
+msgstr "Är du säker på att du vill spara den här som standardstudio?"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7713
+msgid "Saving current document as default studio..."
+msgstr "Sparar nuvarande dokument som standardstudio ..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7738
+msgid ""
+"Are you sure you want to import your default studio and lose the current one?"
+msgstr ""
+"Är du säker på att du vill importera din standardstudio och låta den "
+"nuvarande gå förlorad?"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7773
+msgid "Import Studio from File"
+msgstr "Importera studio från fil"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7807
+msgid "Import Studio"
+msgstr "Importera studio"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:8015
+msgid ""
+"<h3>Newer version available</h3><p>A newer version of Rosegarden may be "
+"available.<br>Please consult the <a href=\"http://www.rosegardenmusic.com/"
+"getting/\">Rosegarden website</a> for more information.</p>"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:8016
+#, fuzzy
+msgid "Newer version available"
+msgstr "Lokala (om tillgängliga)"
+
+#: ../src/gui/application/RosegardenApplication.cpp:104
+#, c-format
+msgid "Failed to load soundfont %1"
+msgstr "Misslyckades att ladda ljudsamplingar från %1"
+
+#: ../src/gui/application/main.cpp:311
+msgid "Rosegarden - A sequencer and musical notation editor"
+msgstr ""
+"Rosegarden - Ett musikbehandlingsprogram med spår-, matris- och noteditorer"
+
+#: ../src/gui/application/main.cpp:315
+msgid "Don't use the sequencer (support editing only)"
+msgstr "Använd inte spelaren (stöd bara redigering)"
+
+#: ../src/gui/application/main.cpp:316
+msgid "Don't show the splash screen"
+msgstr "Visa inte vinjettfönster"
+
+#: ../src/gui/application/main.cpp:317
+msgid "Don't automatically run in the background"
+msgstr "Kör inte automatiskt i bakgrunden"
+
+#: ../src/gui/application/main.cpp:318
+msgid "Attach to a running sequencer process, if found"
+msgstr "Anslut till en inspelningsprocess som körs, om någon hittas"
+
+#: ../src/gui/application/main.cpp:319
+msgid "Ignore installed version - for devs only"
+msgstr "Ignorera installerad version - endast för programutvecklare"
+
+#: ../src/gui/application/main.cpp:320
+msgid "file to open"
+msgstr "fil att öppna"
+
+#: ../src/gui/application/main.cpp:370
+msgid "Installation contains the wrong version of Rosegarden."
+msgstr "installationen innehåller fel version av Rosegarden."
+
+#: ../src/gui/application/main.cpp:371
+#, fuzzy
+msgid ""
+" The wrong versions of Rosegarden's data files were\n"
+" found in the standard KDE installation directories.\n"
+" (I am %1, but the installed files are for version %2.)\n"
+"\n"
+" This may mean one of the following:\n"
+"\n"
+" 1. This is a new upgrade of Rosegarden, and it has not yet been\n"
+" installed. If you compiled it yourself, check that you have\n"
+" run \"make install\" and that the procedure completed\n"
+" successfully.\n"
+"\n"
+" 2. The upgrade was installed in a non-standard directory,\n"
+" and an old version was found in a standard directory. If so,\n"
+" you will need to add the correct directory to your KDEDIRS\n"
+" environment variable before you can run it."
+msgstr ""
+"Fel version av Rosegardens datafiler hittades\n"
+"i KDE-installationens standardkataloger.\n"
+"(Det här är %1, men de installerade filerna är %2.)\n"
+"\n"
+"Det här kan betyda något av följande:\n"
+"\n"
+"1. Det här är en ny uppgradering av Rosegarden, som inte ännu\n"
+" har installerats. Om du kompilerade den själv, kontrollera att\n"
+" du har kört \"scons install\" och att proceduren slutfördes\n"
+" med lyckat resultat.\n"
+"\n"
+"2. Uppgraderingen installerades i en annan än standardkatalogen,\n"
+" och en gammal version hittades i en standardkatalog. Om det\n"
+" är fallet, måste du lägga till den riktiga katalogen i miljövariabeln\n"
+" KDEDIRS innan du kan köra den."
+
+#: ../src/gui/application/main.cpp:383 ../src/gui/application/main.cpp:401
+msgid "Installation problem"
+msgstr "installationsproblem"
+
+#: ../src/gui/application/main.cpp:389
+msgid "Rosegarden does not appear to have been installed."
+msgstr "Rosegarden verkar inte ha installerats."
+
+#: ../src/gui/application/main.cpp:390
+#, fuzzy
+msgid ""
+" One or more of Rosegarden's data files could not be\n"
+" found in the standard KDE installation directories.\n"
+"\n"
+" This may mean one of the following:\n"
+"\n"
+" 1. Rosegarden has not been correctly installed. If you compiled\n"
+" it yourself, check that you have run \"make install\" and that\n"
+" the procedure completed successfully.\n"
+"\n"
+" 2. Rosegarden has been installed in a non-standard directory,\n"
+" and you need to add this directory to your KDEDIRS environment\n"
+" variable before you can run it. This may be the case if you\n"
+" installed into $HOME or a local third-party package directory\n"
+" like /usr/local or /opt."
+msgstr ""
+"En eller flera av Rosegardens datafiler kunde inte\n"
+"hittas i standard-KDE-katalogen.\n"
+"\n"
+" Detta kan betyda följande:\n"
+"\n"
+" 1. Rosegarden har inte installerats korrekt. Om du kompilerade\n"
+" den själv, kontrollera att du har kört \"scons install\" och att\n"
+" processen avslutades riktigt.\n"
+" 2. Rosegarden har installerats i en annan än standardkatalogen,\n"
+" och du behöver lägga den katalogen till dina KDEDIRS-miljövariabler\n"
+" innan du kan köra programmet. Detta kan vara fallet om du\n"
+" installerade i HOME-katalogen eller en lokal katalog från tredje part\n"
+" som exempelvis /usr/local eller /opt."
+
+#: ../src/gui/application/main.cpp:414
+msgid "Rosegarden"
+msgstr "Rosegarden"
+
+#: ../src/gui/application/main.cpp:416
+#, fuzzy
+msgid ""
+"Copyright 2000 - 2008 Guillaume Laurent, Chris Cannam, Richard Bown\n"
+"Parts copyright 1994 - 2004 Chris Cannam, Andy Green, Richard Bown, "
+"Guillaume Laurent\n"
+"LilyPond fonts copyright 1997 - 2005 Han-Wen Nienhuys and Jan Nieuwenhuizen"
+msgstr ""
+"Kopieringsrättighet 2000 - 2007 Guillaume Laurent, Chris Cannam, Richard "
+"Bown\n"
+"Delkopieringsrättighet 1994 - 2004 Chris Cannam, Andy Green, Richard Bown, "
+"Guillaume Laurent\n"
+"Kopieringsrättighet för Lilypondteckensnitt 1997 - 2005 Han-Wen Nienhuys och "
+"Jan Nieuwenhuizen"
+
+#: ../src/gui/application/main.cpp:428
+msgid "Chord labelling code"
+msgstr "Ackordbeteckningskod"
+
+#: ../src/gui/application/main.cpp:429
+#, fuzzy
+msgid ""
+"LilyPond output\n"
+"assorted other patches\n"
+"i18n-ization"
+msgstr ""
+"Lilypond-utmatning\n"
+"Diverse andra programfixar\n"
+"i18n-anpassning"
+
+#: ../src/gui/application/main.cpp:430
+msgid ""
+"UI improvements\n"
+"bug fixes"
+msgstr ""
+"Förbättringar av användargränssnitt\n"
+"Felrättningar"
+
+#: ../src/gui/application/main.cpp:431
+msgid ""
+"Segment colours\n"
+"Other UI and bug fixes"
+msgstr ""
+"Segmentfärger\n"
+"Andra rättningar av användargränssnitt och fel"
+
+#: ../src/gui/application/main.cpp:432
+msgid ""
+"Russian translation\n"
+"i18n-ization"
+msgstr ""
+"Översättning till ryska\n"
+"i18n-anpassning"
+
+#: ../src/gui/application/main.cpp:433 ../src/gui/application/main.cpp:434
+msgid "German translation"
+msgstr "Översättning till tyska"
+
+#: ../src/gui/application/main.cpp:435
+msgid "Welsh translation"
+msgstr "Översättning till walesiska"
+
+#: ../src/gui/application/main.cpp:436
+msgid "French translation"
+msgstr "Översättning till franska"
+
+#: ../src/gui/application/main.cpp:437
+#, fuzzy
+msgid ""
+"French translation\n"
+"Bug fixes"
+msgstr "Översättning till franska"
+
+#: ../src/gui/application/main.cpp:438 ../src/gui/application/main.cpp:439
+msgid "Italian translation"
+msgstr "Översättning till italienska"
+
+#: ../src/gui/application/main.cpp:440 ../src/gui/application/main.cpp:441
+msgid "Swedish translation"
+msgstr "Översättning till svenska"
+
+#: ../src/gui/application/main.cpp:442
+msgid "Estonian translation"
+msgstr "Översättning till estniska"
+
+#: ../src/gui/application/main.cpp:443 ../src/gui/application/main.cpp:444
+msgid "Dutch translation"
+msgstr "Översättning till holländska"
+
+#: ../src/gui/application/main.cpp:445
+msgid "HSpinBox class"
+msgstr "Klassen Nummerinmatningsruta"
+
+#: ../src/gui/application/main.cpp:446
+msgid "Transposition by interval"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:447
+msgid "Original designs for rotary controllers"
+msgstr "Ursprunglig formgivning av rattar"
+
+#: ../src/gui/application/main.cpp:448
+msgid "Japanese translation"
+msgstr "Översättning till japanska"
+
+#: ../src/gui/application/main.cpp:449
+msgid ""
+"Auto-scroll deceleration\n"
+"Rests outside staves and other bug fixes"
+msgstr ""
+"Fartminskning för automatisk panorering\n"
+"Pauser utanför notsystem och andra felrättningar"
+
+#: ../src/gui/application/main.cpp:450
+msgid "Simplified Chinese translation"
+msgstr "Översättning till förenklad kinesiska"
+
+#: ../src/gui/application/main.cpp:451
+msgid "LIRC infrared remote-controller support"
+msgstr "Stöd för LIRC, infraröd fjärrkontroll"
+
+#: ../src/gui/application/main.cpp:452
+msgid "MTC slave timing implementation"
+msgstr "Implementering av MTC-slavtid"
+
+#: ../src/gui/application/main.cpp:453
+msgid "Czech translation"
+msgstr "Översättning till tjeckiska"
+
+#: ../src/gui/application/main.cpp:454
+msgid "SCons/bksys building system"
+msgstr "SCons/bksys-byggsystem"
+
+#: ../src/gui/application/main.cpp:455
+msgid "icons, icons, icons"
+msgstr "ikoner, ikoner, ikoner"
+
+#: ../src/gui/application/main.cpp:456 ../src/gui/application/main.cpp:457
+#: ../src/gui/application/main.cpp:458 ../src/gui/application/main.cpp:459
+msgid "Spanish translation"
+msgstr "Översättning till spanska"
+
+#: ../src/gui/application/main.cpp:460 ../src/gui/application/main.cpp:461
+msgid "Catalan translation"
+msgstr "Översättning till katalanska"
+
+#: ../src/gui/application/main.cpp:462
+msgid ""
+"1.2.3 splash screen photo\n"
+"Gave birth to D. Michael McIntyre, bought him a good flute once\n"
+"upon a time, and always humored him when he came over to play her\n"
+"some new instrument, even though she really hated his playing.\n"
+"Born October 19, 1951, died September 21, 2007, R. I. P."
+msgstr ""
+
+#: ../src/gui/application/main.cpp:463
+#, fuzzy
+msgid "Initial guitar chord editing code"
+msgstr "gitarrackordeditor"
+
+#: ../src/gui/application/main.cpp:464
+msgid "Polish translation"
+msgstr "Översättning till polska"
+
+#: ../src/gui/application/main.cpp:465
+#, fuzzy
+msgid "Basque translation"
+msgstr "Översättning till japanska"
+
+#: ../src/gui/application/main.cpp:466
+msgid "Klearlook theme"
+msgstr ""
+
+#: ../src/_translatorinfo.cpp:1 ../src/gui/application/main.cpp:468
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr "Stefan Asserhäll,Erik Magnus Johansson"
+
+#: ../src/_translatorinfo.cpp:3 ../src/gui/application/main.cpp:468
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+
+#: ../src/gui/application/main.cpp:719
+msgid "Welcome!"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:731
+msgid ""
+"<h2>Welcome to Rosegarden!</h2><p>Welcome to the Rosegarden audio and MIDI "
+"sequencer and musical notation editor.</p><ul><li>If you have not already "
+"done so, you may wish to install some DSSI synth plugins, or a separate "
+"synth program such as QSynth. Rosegarden does not synthesize sounds from "
+"MIDI on its own, so without these you will hear nothing.</"
+"li><br><br><li>Rosegarden uses the JACK audio server for recording and "
+"playback of audio, and for playback from DSSI synth plugins. These features "
+"will only be available if the JACK server is running.</"
+"li><br><br><li>Rosegarden has comprehensive documentation: see the Help menu "
+"for the handbook, tutorials, and other information!</li></ul><p>Rosegarden "
+"was brought to you by a team of volunteers across the world. To learn more, "
+"go to <a href=\"http://www.rosegardenmusic.com/\">http://www.rosegardenmusic."
+"com/</a>.</p>"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIView.cpp:257
+msgid "No non-audio segments in composition"
+msgstr "Inga segment utan ljud i kompositionen"
+
+#: ../src/gui/application/RosegardenGUIView.cpp:333
+msgid "Selection must contain only audio or non-audio segments"
+msgstr "Markering får bara innehålla segment med eller utan ljud"
+
+#: ../src/gui/application/RosegardenGUIView.cpp:431
+#: ../src/gui/application/RosegardenGUIView.cpp:576
+#: ../src/gui/application/RosegardenGUIView.cpp:612
+#: ../src/gui/application/RosegardenGUIView.cpp:776
+msgid "No non-audio segments selected"
+msgstr "Inga segment utan ljud markerade"
+
+#: ../src/gui/application/RosegardenGUIView.cpp:851
+#, fuzzy
+msgid ""
+"You've not yet defined an audio editor for Rosegarden to use.\n"
+"See Settings -> Configure Rosegarden -> Audio."
+msgstr ""
+"Du har ännu inte definierat en ljudeditor som Rosegarden ska använda.\n"
+"Se Inställningar -> Anpassa Rosegarden -> Allmänt -> Externa editorer."
+
+#: ../src/gui/application/RosegardenGUIView.cpp:1559
+#: ../src/gui/application/RosegardenGUIView.cpp:1564
+msgid "Can't add dropped file. "
+msgstr "Kan inte lägga till släppt fil. "
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1014
+#: ../src/gui/seqmanager/SequenceManager.cpp:1150
+msgid ""
+"The JACK Audio subsystem has failed or it has stopped Rosegarden from "
+"processing audio.\n"
+"Please restart Rosegarden to continue working with audio.\n"
+"Quitting other running applications may improve Rosegarden's performance."
+msgstr ""
+"JACK-delsystemet för ljud har slutat fungera eller har stoppat Rosegarden "
+"att behandla ljud.\n"
+"Starta om Rosegarden för att fortsätta arbeta med ljud.\n"
+"Att avsluta andra program som körs kan förbättra Rosegardens prestanda."
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1020
+#: ../src/gui/seqmanager/SequenceManager.cpp:1156
+msgid ""
+"The JACK Audio subsystem has stopped Rosegarden from processing audio, "
+"probably because of a processing overload.\n"
+"An attempt to restart the audio service has been made, but some problems may "
+"remain.\n"
+"Quitting other running applications may improve Rosegarden's performance."
+msgstr ""
+"JACK-delsystemet för ljud har stoppat Rosegarden att behandla ljud, troligen "
+"på grund av en överbelastning.\n"
+"Ett försök att starta om ljudtjänsten har gjorts, men vissa problem kan vara "
+"kvar.\n"
+"Att avsluta andra program som körs kan förbättra Rosegardens prestanda."
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1031
+msgid ""
+"Run out of processor power for real-time audio processing. Cannot continue."
+msgstr ""
+"Slut på processorkraft för ljudbehandling i realtid. Kan inte fortsätta."
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1057
+msgid ""
+"A serious error has occurred in the ALSA MIDI subsystem. It may not be "
+"possible to continue sequencing. Please check console output for more "
+"information."
+msgstr ""
+"Ett allvarligt fel har inträffat i ALSA-MIDI-delsystemet. Det kanske inte är "
+"möjligt att fortsätta köra spelaren. Kontrollera terminalutmatningen för mer "
+"information."
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1078
+msgid "JACK Audio subsystem is losing sample frames."
+msgstr "JACK-ljudsystemet förlorar samplade ramar."
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1096
+msgid ""
+"Failed to read audio data from disc in time to service the audio subsystem."
+msgstr ""
+"Misslyckades läsa ljuddata snabbt från disk för att hantera ljudsystemet."
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1100
+msgid ""
+"Failed to write audio data to disc fast enough to service the audio "
+"subsystem."
+msgstr ""
+"Misslyckades skriva ljuddata snabbt nog till disk för att hantera "
+"ljudsystemet."
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1104
+msgid "The audio mixing subsystem is failing to keep up."
+msgstr "Ljudsystemet klarar inte av att hänga med."
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1108
+msgid "The audio subsystem is failing to keep up."
+msgstr "Ljudsystemet klarar inte av att hänga med."
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1112
+msgid "Unknown sequencer failure mode!"
+msgstr "Okänt fel i spelaren!"
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1170
+#, fuzzy
+msgid ""
+"<h3>System timer resolution is too low</h3><p>Rosegarden was unable to find "
+"a high-resolution timing source for MIDI performance.</p><p>This may mean "
+"you are using a Linux system with the kernel timer resolution set too low. "
+"Please contact your Linux distributor for more information.</p><p>Some Linux "
+"distributors already provide low latency kernels, see <a href=\"http://"
+"rosegarden.wiki.sourceforge.net/Low+latency+kernels\">http://rosegarden.wiki."
+"sourceforge.net/Low+latency+kernels</a> for instructions.</p>"
+msgstr ""
+"<h3>Systemets tidupplösning är för låg</h3><p> Rosegarden var oförmöget att "
+"hitta en högupplöst tidkälla för MIDI-uppspelning</p><p>Detta kan betyda att "
+"du använder ett Linux-system där kärnans tidupplösning är satt för lågt. "
+"Var vänlig och kontakta din Linux-distributör för mer information.</p>"
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1188
+#, fuzzy
+msgid ""
+"<h3>System timer resolution is too low</h3><p>Rosegarden was unable to find "
+"a high-resolution timing source for MIDI performance.</p><p>You may be able "
+"to solve this problem by loading the RTC timer kernel module. To do this, "
+"try running <b>sudo modprobe snd-rtctimer</b> in a terminal window and then "
+"restarting Rosegarden.</p><p>Alternatively, check whether your Linux "
+"distributor provides a multimedia-optimized kernel. See <a href=\"http://"
+"rosegarden.wiki.sourceforge.net/Low+latency+kernels\">http://rosegarden.wiki."
+"sourceforge.net/Low+latency+kernels</a> for notes about this.</p>"
+msgstr ""
+"<h3>Systemets tidupplösning är för låg</h3><p> Rosegarden var oförmöget att "
+"hitta en högupplöst tidkälla för MIDI-uppspelning</p><p>Detta kan betyda att "
+"du använder ett Linux-system där kärnans tidupplösning är satt för lågt. "
+"Var vänlig och kontakta din Linux-distributör för mer information.</p>"
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1312
+msgid ""
+"<p>Both MIDI and Audio subsystems have failed to initialize.</p><p>You may "
+"continue without the sequencer, but we suggest closing Rosegarden, running "
+"\"alsaconf\" as root, and starting Rosegarden again. If you wish to run "
+"with no sequencer by design, then use \"rosegarden --nosequencer\" to avoid "
+"seeing this error in the future.</p>"
+msgstr ""
+"<p>Både MIDI- och ljudundersystemen kunde inte initialiseras.</p><p>Du kan "
+"fortsätta utan spelaren men vi föreslår att du stänger Rosegarden, kör "
+"\"alsaconf\" som rotanvändare, och startar Rosegarden ånyo. Om du önskar "
+"köra utan spelare, använd \"rosegarden --nosequencer\" för att slippa se "
+"detta i fel fortsättningen.</p>"
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1314
+msgid ""
+"<p>The MIDI subsystem has failed to initialize.</p><p>You may continue "
+"without the sequencer, but we suggest closing Rosegarden, running \"modprobe "
+"snd-seq-midi\" as root, and starting Rosegarden again. If you wish to run "
+"with no sequencer by design, then use \"rosegarden --nosequencer\" to avoid "
+"seeing this error in the future.</p>"
+msgstr ""
+"<p>MIDI-undersystemet kunde inte initialiseras.</p><p>Du kan fortsätta utan "
+"spelaren men vi föreslår att du stänger Rosegarden, kör \"modprobe snd-seq-"
+"midi\" som rotanvändare, och startar Rosegarden ånyo. Om du önskar köra utan "
+"spelare, använd \"rosegarden --nosequencer\" för att slippa se detta i fel "
+"fortsättningen.</p>"
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1316
+msgid ""
+"<p>The Rosegarden sequencer module version does not match the GUI module "
+"version.</p><p>You have probably mixed up files from two different versions "
+"of Rosegarden. Please check your installation.</p>"
+msgstr ""
+"<p>Rosegardens spelarmodulversion stämmer inte överens med det grafiska "
+"användargränssnittets modulversion.</p><p>Du har antagligen blandat ihop "
+"filer från två olika versioner av Rosegarden. Var vänlig kontrollera din "
+"installation.</p>"
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1322
+#, c-format
+msgid "<h3>Sequencer startup failed</h3>%1"
+msgstr "<h3>Spelaren startades inte</h3>%1"
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1330
+msgid ""
+"<h3>Failed to connect to JACK audio server.</h3><p>Rosegarden could not "
+"connect to the JACK audio server. This probably means the JACK server is "
+"not running.</p><p>If you want to be able to play or record audio files or "
+"use plugins, you should exit Rosegarden and start the JACK server before "
+"running Rosegarden again.</p>"
+msgstr ""
+"<h3>Misslyckades att ansluta till ljudservern JACK.</h3><p>Rosegarden kunde "
+"inte ansluta till ljudservern JACK. Detta innebär troligen att JACK inte "
+"körs.</p><p>Om du vill kunna spela upp eller spela in ljudfiler eller "
+"använda insticksprogram skall du stänga Rosegarden och starta JACK innan du "
+"startar Rosegarden ånyo.</p>"
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1331
+msgid "Failed to connect to JACK"
+msgstr "Misslyckades ansluta till JACK"
+
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:46
+msgid "Modify MIDI filters..."
+msgstr "Ändra MIDI-filter ..."
+
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:58
+msgid "THRU events to ignore"
+msgstr "THRU-händelser att ignorera"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:131
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:60
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:96
+msgid "Note"
+msgstr "Ton"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:132
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:61
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:97
+msgid "Program Change"
+msgstr "Programändring"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:136
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:62
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:98
+msgid "Key Pressure"
+msgstr "Tangenttryck"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:137
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:63
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:99
+msgid "Channel Pressure"
+msgstr "Kanaltryck"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:134
+#: ../src/gui/general/EditView.cpp:899
+#: ../src/gui/rulers/ControllerEventsRuler.cpp:198
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:64
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:100
+msgid "Pitch Bend"
+msgstr "Tonhöjdsavvikelse"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:133
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:65
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:101
+msgid "Controller"
+msgstr "Effekt"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:135
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:66
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:102
+msgid "System Exclusive"
+msgstr "Systemexklusiv"
+
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:94
+msgid "RECORD events to ignore"
+msgstr "RECORD-händelser att ignorera"
+
+#: ../src/gui/widgets/TimeWidget.cpp:101
+msgid "Note:"
+msgstr "Anmärkning:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:108 ../src/gui/widgets/TimeWidget.cpp:145
+msgid "<inexact>"
+msgstr "<inexakt>"
+
+#: ../src/gui/widgets/TimeWidget.cpp:151
+msgid "Units:"
+msgstr "Enheter:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:173
+msgid "Time:"
+msgstr "Tid:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:184
+msgid "units"
+msgstr "enheter"
+
+#: ../src/gui/widgets/TimeWidget.cpp:193
+msgid "Measures:"
+msgstr "Takter:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:193
+msgid "Measure:"
+msgstr "Takt:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:212
+msgid "beats:"
+msgstr "taktslag:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:212
+msgid "beat:"
+msgstr "taktslag:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:230
+msgid "%1:"
+msgstr "%1:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:254
+msgid "Seconds:"
+msgstr "Sekunder:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:273
+msgid "msec:"
+msgstr "ms:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:407 ../src/gui/widgets/TimeWidget.cpp:531
+msgid "(%1/%2 time)"
+msgstr "(%1/%2 takt)"
+
+#: ../src/gui/widgets/TimeWidget.cpp:452
+msgid "(starting %1.%2 qpm, %2.%3 bpm)"
+msgstr "(startar med %1.%2 fjärdedelar/min, %2.%3 taktslag/min)"
+
+#: ../src/gui/widgets/TimeWidget.cpp:458
+msgid "(starting %1.%2 bpm)"
+msgstr "(startar med %1.%2 taktslag/min)"
+
+#: ../src/gui/widgets/TimeWidget.cpp:464
+msgid "(%1.%2 qpm, %2.%3 bpm)"
+msgstr "(%1.%2 fjärdedelar/min, %2.%3 taktslag/min)"
+
+#: ../src/gui/widgets/TimeWidget.cpp:470
+msgid "(%1.%2 bpm)"
+msgstr "(%1.%2 taktslag/min)"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:239
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:60
+msgid "C"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:241
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:61
+#, fuzzy
+msgid "D"
+msgstr "Id"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:243
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:62
+msgid "E"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:244
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:63
+msgid "F"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:246
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:64
+msgid "G"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:248
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:65
+#, fuzzy
+msgid "A"
+msgstr "A6"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:250
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:66
+msgid "B"
+msgstr ""
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:70
+msgid "-2"
+msgstr ""
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:71
+msgid "-1"
+msgstr ""
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:72
+msgid "0"
+msgstr "0"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:73
+#, fuzzy
+msgid "1"
+msgstr "%1"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:74
+msgid "2"
+msgstr ""
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:75
+#, fuzzy
+msgid "3"
+msgstr "A3"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:76
+#, fuzzy
+msgid "4"
+msgstr "A4"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:77
+#, fuzzy
+msgid "5"
+msgstr "A5"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:78
+#, fuzzy
+msgid "6"
+msgstr "A6"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:79
+msgid "7"
+msgstr ""
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:83
+#, fuzzy
+msgid "double flat"
+msgstr "Dubbel-b-förtecken"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:84
+#, fuzzy
+msgid "flat"
+msgstr "B-förtecken"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:85
+#, fuzzy
+msgid "natural"
+msgstr "Återställningstecken"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:86
+#, fuzzy
+msgid "sharp"
+msgstr "Korsförtecken"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:87
+#, fuzzy
+msgid "double sharp"
+msgstr "Dubbelkorsförtecken"
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:234
+#, c-format
+msgid "In %1"
+msgstr "In %1"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:587
+#: ../src/gui/widgets/AudioRouteMenu.cpp:236
+#: ../src/gui/widgets/AudioRouteMenu.cpp:259
+msgid "Master"
+msgstr "Huvudnivå"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:528
+#: ../src/gui/widgets/AudioRouteMenu.cpp:238
+#: ../src/gui/widgets/AudioRouteMenu.cpp:261
+#, c-format
+msgid "Sub %1"
+msgstr "Del %1"
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:244
+msgid "In %1 R"
+msgstr "In %1 H"
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:245
+msgid "In %1 L"
+msgstr "In %1 V"
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:247
+msgid "Master R"
+msgstr "Huvudnivå H"
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:248
+msgid "Master L"
+msgstr "Huvudnivå V"
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:250
+msgid "Sub %1 R"
+msgstr "Del %1 H"
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:251
+msgid "Sub %1 L"
+msgstr "Del %1 V"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:391
+#: ../src/gui/studio/AudioMixerWindow.cpp:522
+#: ../src/gui/widgets/AudioFaderBox.cpp:82
+msgid "Audio plugin button"
+msgstr "Ljudinsticksknapp"
+
+#: ../src/gui/editors/parameters/AudioInstrumentParameterPanel.cpp:129
+#: ../src/gui/editors/parameters/AudioInstrumentParameterPanel.cpp:357
+#: ../src/gui/widgets/AudioFaderBox.cpp:91
+msgid "<no synth>"
+msgstr "<ingen synt>"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:93
+msgid "Synth plugin button"
+msgstr "Syntinsticksknapp"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:153
+msgid "Set the audio pan position in the stereo field"
+msgstr "Ställ in ljudets panoreringsposition i stereofältet"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:155
+msgid "Open synth plugin's native editor"
+msgstr "Öppna i syntinsticksmodulens egen editor"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:157
+msgid "Mono or Stereo Instrument"
+msgstr "Mono- eller stereoinstrument"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:159
+msgid "Record level"
+msgstr "Inspelningsnivå"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:161
+msgid "Playback level"
+msgstr "Uppspelningsnivå"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:345
+#: ../src/gui/studio/AudioMixerWindow.cpp:347
+#: ../src/gui/studio/AudioMixerWindow.cpp:503
+#: ../src/gui/studio/AudioMixerWindow.cpp:505
+#: ../src/gui/widgets/AudioFaderBox.cpp:163
+msgid "Audio level"
+msgstr "Ljudnivå"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:170
+msgid "In:"
+msgstr "In:"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:173
+msgid "Out:"
+msgstr "Ut:"
+
+#: ../src/gui/widgets/ProgressDialog.cpp:48
+#: ../src/gui/widgets/ProgressDialog.cpp:53
+#: ../src/gui/widgets/ProgressDialog.cpp:76
+msgid "Processing..."
+msgstr "Behandlar ..."
+
+#: ../src/gui/configuration/ColourConfigurationPage.h:60
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:130
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:346
+#: ../src/gui/widgets/ColourTable.cpp:52
+msgid "Color"
+msgstr "Färg"
+
+#: ../src/gui/widgets/ColourTable.cpp:68
+msgid "Modify Color Name"
+msgstr "Ändra färgnamn"
+
+#: ../src/gui/configuration/ColourConfigurationPage.cpp:129
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:983
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:882
+#: ../src/gui/widgets/ColourTable.cpp:68
+msgid "Enter new name"
+msgstr "Ange nytt namn"
+
+#: ../src/gui/widgets/ColourTable.cpp:107
+msgid "Default Color"
+msgstr "Förvald färg"
+
+#: ../src/gui/widgets/Rotary.cpp:108
+msgid ""
+"Click and drag up and down or left and right to modify.\n"
+"Double click to edit value directly."
+msgstr ""
+"Klicka och dra uppåt och neråt eller vänster och höger för att ändra.\n"
+"Dubbelklicka för att redigera värdet direkt."
+
+#: ../src/gui/widgets/Rotary.cpp:433
+msgid "Select a new value"
+msgstr "Välj ett nytt värde"
+
+#: ../src/gui/widgets/Rotary.cpp:434
+msgid "Enter a new value"
+msgstr "Ange ett nytt värde"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:80
+msgid "Quantizer"
+msgstr "Kvantisering"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:86
+msgid "Quantizer type:"
+msgstr "Kvantiseringstyp:"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:88
+msgid "Grid quantizer"
+msgstr "Rutnätskvantisering"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:89
+msgid "Legato quantizer"
+msgstr "Legato-kvantisering"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:90
+msgid "Heuristic notation quantizer"
+msgstr "Heuristisk kvantisering"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:94
+msgid "Quantize for notation only (leave performance unchanged)"
+msgstr "Kvantisera bara för notskrift (lämna utförande oförändrat)"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:104
+msgid "Notation parameters"
+msgstr "Notationsparametrar"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:109
+#: ../src/gui/widgets/QuantizeParameters.cpp:150
+msgid "Base grid unit:"
+msgstr "Grundenhet för rutnät:"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:114
+msgid "Complexity:"
+msgstr "Komplexitet:"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:118
+msgid "Very high"
+msgstr "Mycket hög"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:119
+msgid "High"
+msgstr "Hög"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:224
+#: ../src/gui/widgets/QuantizeParameters.cpp:120
+msgid "Normal"
+msgstr "Normal"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:121
+msgid "Low"
+msgstr "Låg"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:122
+msgid "Very low"
+msgstr "Mycket låg"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:125
+msgid "Tuplet level:"
+msgstr "Annandelningsnivå:"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:129
+msgid "2-in-the-time-of-3"
+msgstr "Duol"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4241
+#: ../src/gui/widgets/QuantizeParameters.cpp:130
+msgid "Triplet"
+msgstr "Triol"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:138
+msgid "Any"
+msgstr "Alla"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:141
+msgid "Permit counterpoint"
+msgstr "Tillåt kontrapunkt"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:145
+msgid "Grid parameters"
+msgstr "Rutnätsparametrar"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:154
+msgid "Swing:"
+msgstr "Svaj:"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:159
+msgid "Iterative amount:"
+msgstr "Itereringsvärde:"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:165
+msgid "Quantize durations as well as start times"
+msgstr "Kvantisera både notvärden och starttider"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:169
+msgid "After quantization"
+msgstr "Efter kvantisering"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:183
+msgid "Show advanced options"
+msgstr "Visa avancerade alternativ"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:192
+msgid "Re-beam"
+msgstr "Lägg till balkar igen"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:194
+msgid "Add articulations (staccato, tenuto, slurs)"
+msgstr "Lägg till artikulationsbeteckningar"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:195
+msgid "Tie notes at barlines etc"
+msgstr "Bind noter vid taktstreck etc."
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:196
+msgid "Split-and-tie overlapping chords"
+msgstr "Dela och bind ackordnoter med för stora notvärden"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:307
+msgid "Full quantize"
+msgstr "Fullständig kvantisering"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:450
+msgid "Show Advanced Options"
+msgstr "Visa avancerade alternativ"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:454
+msgid "Hide Advanced Options"
+msgstr "Dölj avancerade alternativ"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:257
+#: ../src/gui/configuration/MatrixConfigurationPage.h:56
+#: ../src/gui/configuration/MatrixConfigurationPage.h:57
+#: ../src/gui/editors/matrix/MatrixView.cpp:2709
+msgid "Matrix"
+msgstr "Matris"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:64
+msgid "Printable headers"
+msgstr ""
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:92
+#, fuzzy
+msgid "Dedication"
+msgstr "Indikering"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:96
+#: ../src/gui/editors/segment/PlayListView.cpp:35
+msgid "Title"
+msgstr "Titel"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:100
+msgid "Subtitle"
+msgstr "Undertitel"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:104
+#, fuzzy
+msgid "Subsubtitle"
+msgstr "Undertitel"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:108
+#, fuzzy
+msgid "Poet"
+msgstr "Presto"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:116
+msgid "Composer"
+msgstr "Tonsättare"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:120
+#, fuzzy
+msgid "Meter"
+msgstr "Huvudnivå"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:124
+msgid "Arranger"
+msgstr "Arrangör"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:128
+#, fuzzy
+msgid "Piece"
+msgstr "Tonhöjder"
+
+#: ../data/fonts/mappings/fonts.cpp:26
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:132
+msgid "Opus"
+msgstr "Opus"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:136
+msgid "Copyright"
+msgstr "Kopieringsrättigheter"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:140
+#, fuzzy
+msgid "Tagline"
+msgstr "Triangel"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:155
+#, fuzzy
+msgid "The composition comes here."
+msgstr "Ändra kompositionens längd"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:172
+msgid "Non-printable headers"
+msgstr ""
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:213
+msgid "Add New Property"
+msgstr "Lägg till ny egenskap"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:217
+msgid "Delete Property"
+msgstr "Ta bort egenskap"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:236
+msgid "{new property %1}"
+msgstr "{ny egenskap %1}"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:236
+msgid "{new property}"
+msgstr "{ny egenskap}"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:243
+msgid "{undefined}"
+msgstr "{odefinierad}"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:87
+#, fuzzy
+msgid "Double-click opens segment in"
+msgstr "Standardvy (för dubbelklick på segment)"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:91
+#, fuzzy
+msgid "Notation editor"
+msgstr "Notationslängd:"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:92
+#, fuzzy
+msgid "Matrix editor"
+msgstr "Öppna i m&atriseditor"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:93
+#, fuzzy
+msgid "Event List editor"
+msgstr "Öppna i ed&itor för händelselista"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:99
+msgid "Number of count-in measures when recording"
+msgstr "Antal inräkningstakter vid inspelning"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:109
+#, fuzzy
+msgid "Auto-save interval"
+msgstr "Intervall för spara automatiskt (i sekunder)"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:112
+msgid "Every 30 seconds"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:113
+msgid "Every minute"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:114
+msgid "Every five minutes"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:115
+msgid "Every half an hour"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:116
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:277
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:157
+msgid "Never"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:140
+#, fuzzy
+msgid "Use JACK transport"
+msgstr "Ignorera JACK-överföring"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:173
+msgid "Unknown"
+msgstr "Okänd"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:179
+msgid "No MIDI, audio OK"
+msgstr "Inget MIDI, ljud ok"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:182
+msgid "MIDI OK, no audio"
+msgstr "MIDI ok, inget ljud"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:185
+msgid "MIDI OK, audio OK"
+msgstr "MIDI ok, ljud ok"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:188
+msgid "No driver"
+msgstr "Ingen drivrutin"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:195
+#, fuzzy
+msgid "Details..."
+msgstr "Ta bort spår ..."
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:204
+msgid "Behavior"
+msgstr "Beteende"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:219
+msgid "Side-bar parameter box layout"
+msgstr "Parameterboxutläggning"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:223
+msgid "Vertically stacked"
+msgstr "Staplade på höjden"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:225
+msgid "Tabbed"
+msgstr "Flikar"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:233
+msgid "Note name style"
+msgstr "Notnamn"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:237
+msgid "Always use US names (e.g. quarter, 8th)"
+msgstr "Använd alltid amerikanska namn (t.ex. quarter, 8th)"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:238
+msgid "Localized (where available)"
+msgstr "Lokala (om tillgängliga)"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:252
+#, fuzzy
+msgid "Show textured background on"
+msgstr ""
+"Använd virtuellt notpapper med struktur, och virtuellt notskrivbord vid "
+"sidutläggning"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:254
+msgid "Main window"
+msgstr "Huvudfönster"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:275
+msgid "Use bundled Klearlook theme"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:278
+msgid "When not running under KDE"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:279
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:159
+#, fuzzy
+msgid "Always"
+msgstr "Alias"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:287
+msgid "Presentation"
+msgstr "Presentation"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:423
+msgid ""
+"Changes to the textured background in the main window will not take effect "
+"until you restart Rosegarden."
+msgstr ""
+"Ändringar av strukturbakgrunderna i huvudfönstret träder inte i kraft förrän "
+"du startar om Rosegarden."
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:168
+#: ../src/gui/configuration/GeneralConfigurationPage.h:78
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:207
+#: ../src/gui/configuration/MatrixConfigurationPage.cpp:59
+msgid "General"
+msgstr "Allmänt"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.h:79
+msgid "General Configuration"
+msgstr "Allmänna inställningar"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:92
+msgid "Base octave number for MIDI pitch display"
+msgstr "Nummer på infraoktaven (oktaven under subkontraoktaven)"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:107
+msgid "Always use default studio when loading files"
+msgstr "Använd alltid standardstudio när filer laddas"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:119
+#, fuzzy
+msgid "Send all MIDI Controllers at start of each playback"
+msgstr ""
+"Skicka alla MIDI-effekter vid start av uppspelning\n"
+"(orsakar märkbar initial fördröjning)"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:121
+msgid ""
+"Rosegarden can send all MIDI Controllers (Pan, Reverb etc) to all MIDI "
+"devices every\n"
+"time you hit play if you so wish. Please note that this option will usually "
+"incur a\n"
+"delay at the start of playback due to the amount of data being transmitted."
+msgstr ""
+"Rosegarden kan, om du vill, skicka alla MIDI-effekter (Panorera, Eko, etc.) "
+"till alla MIDI-enheter\n"
+"varje gång du trycker på spela. Observera att detta alternativ ger oftast "
+"en\n"
+"fördröjning vid uppspelningens start, på grund av mängden data som skickas."
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:138
+#, fuzzy
+msgid "Sequencer timing source"
+msgstr "Tidtagare"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:163
+msgid "Load SoundFont to SoundBlaster card at startup"
+msgstr "Ladda ljudsamplingar till Soundblaster-kort vid start"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:164
+msgid ""
+"Check this box to enable soundfont loading on EMU10K-based cards when "
+"Rosegarden is launched"
+msgstr ""
+"Markera rutan för att aktivera laddning av ljudsamplingar till EMU10K-"
+"baserade kort när Rosegarden startas"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:173
+msgid "Path to 'asfxload' or 'sfxload' command"
+msgstr "Sökväg till kommandot 'asfxload' eller 'sfxload'"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:180
+msgid "SoundFont"
+msgstr "Ljudsamplingar"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:223
+msgid "MIDI Clock and System messages"
+msgstr "MIDI-klock- och systemmeddelanden"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:229
+msgid "Send MIDI Clock, Start and Stop"
+msgstr "Skicka start och stopp för MIDI-klockan"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:230
+msgid "Accept Start, Stop and Continue"
+msgstr "Acceptera start, stopp och fortsätt"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:241
+msgid "MIDI Machine Control mode"
+msgstr "MIDI-maskinstyrläge"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:248
+msgid "MMC Master"
+msgstr "MMC-huvudnivå"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:249
+msgid "MMC Slave"
+msgstr "MMC-slav"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:260
+msgid "MIDI Time Code mode"
+msgstr "MIDI-tidkodsläge"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:267
+msgid "MTC Master"
+msgstr "MTC-huvudnivå"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:268
+msgid "MTC Slave"
+msgstr "MTC-slav"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:281
+msgid "Automatically connect sync output to all devices in use"
+msgstr "Anslut synkroniseringsutmatning automatiskt till alla använda enheter"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:292
+#, fuzzy
+msgid "MIDI Sync"
+msgstr "MIDI"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:308
+msgid "sfxload path"
+msgstr "Sökväg till sfxload"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:315
+msgid "Soundfont path"
+msgstr "Sökväg till ljudsamplingar"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:67
+msgid "%1 minutes %2.%3%4 seconds (%5 units, %6 measures)"
+msgstr "%1 minuter %2,%3%4 sekunder (%5 enheter, %6 takter)"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:133
+msgid "Filename:"
+msgstr "Filnamn:"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:136
+msgid "Formal duration (to end marker):"
+msgstr "Formell längd (till slutmarkering):"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:141
+msgid "Playing duration:"
+msgstr "Uppspelningslängd:"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:146
+msgid "Tracks:"
+msgstr "Spår:"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:147
+msgid "%1 used, %2 total"
+msgstr "%1 använda, %2 totalt"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:152
+msgid "Segments:"
+msgstr "Segment:"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:153
+msgid "%1 MIDI, %2 audio, %3 total"
+msgstr "%1 MIDI, %2 ljud, %3 totalt"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:161
+msgid "Statistics"
+msgstr "Statistik"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:170
+#: ../src/gui/editors/parameters/InstrumentParameterBox.cpp:155
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:92
+msgid "Track"
+msgstr "Spår"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:171
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:125
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:90
+msgid "Label"
+msgstr "Namn"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:172
+msgid "Time"
+msgstr "Tid"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:174
+msgid "Events"
+msgstr "Händelser"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:175
+msgid "Polyphony"
+msgstr "Polyfoni"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:176
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:126
+msgid "Repeat"
+msgstr "Upprepa"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:178
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:128
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:305
+#: ../src/gui/general/EditView.cpp:1488
+msgid "Transpose"
+msgstr "Transponera"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:179
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:129
+msgid "Delay"
+msgstr "Fördröjning"
+
+#: ../src/gui/configuration/AudioConfigurationPage.h:61
+#: ../src/gui/configuration/AudioPropertiesPage.h:58
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:204
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:523
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:524
+msgid "Audio"
+msgstr "Ljud"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:204
+#: ../src/gui/configuration/MIDIConfigurationPage.h:62
+msgid "MIDI"
+msgstr "MIDI"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:317
+msgid "Segment Summary"
+msgstr "Segmentöversikt"
+
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:63
+msgid "Audio file path:"
+msgstr "Sökväg för ljudfil:"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:137
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:68
+msgid "Choose..."
+msgstr "Välj ..."
+
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:73
+msgid "Disk space remaining:"
+msgstr "Återstående diskutrymme:"
+
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:78
+msgid "Equivalent minutes of 16-bit stereo:"
+msgstr "Motsvarande minuter med 16-bitars stereo:"
+
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:90
+msgid "Modify audio path"
+msgstr "Ändra ljudsökväg"
+
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:113
+msgid "%1 out of %2 (%3% used)"
+msgstr "%1 av %2 (%3% använt)"
+
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:144
+msgid "minutes at"
+msgstr "minuter vid"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.h:63
+#, fuzzy
+msgid "MIDI Settings"
+msgstr "Ljudinställningar"
+
+#: ../src/gui/configuration/AudioConfigurationPage.h:62
+#: ../src/gui/configuration/AudioPropertiesPage.h:59
+msgid "Audio Settings"
+msgstr "Ljudinställningar"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:87
+msgid "Default layout mode"
+msgstr "Standardutläggning"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:91
+msgid "Linear layout"
+msgstr "Horisontell utläggning"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:92
+msgid "Continuous page layout"
+msgstr "Vertikal utläggning"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:93
+msgid "Multiple page layout"
+msgstr "Sidutläggning"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:101
+msgid "Default spacing"
+msgstr "Standardavstånd"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:125
+msgid "Default duration factor"
+msgstr "Förvald notvärdesfaktor"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:141
+msgid "Full"
+msgstr "Fullt"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:152
+msgid "Show track headers (linear layout only)"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:158
+msgid "When needed"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:166
+msgid ""
+"\"Always\" and \"Never\" mean what they usually mean\n"
+"\"When needed\" means \"when staves are too many to all fit in the current "
+"window\""
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:178
+msgid "Show non-notation events as question marks"
+msgstr "Visa händelser utan noter som frågetecken"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:188
+msgid "Show notation-quantized notes in a different color"
+msgstr "Visa kvantiserade noter med en annan färg"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:198
+msgid "Show \"invisible\" events in grey"
+msgstr "Visa \"osynliga\" händelser i grått"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:208
+msgid "Show notes outside suggested playable range in red"
+msgstr "Visa noter utanför angivet omfång med röd färg"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:218
+msgid "Highlight superimposed notes with a halo effect"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:231
+msgid "When recording MIDI, split-and-tie long notes at barlines"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:242
+msgid "Layout"
+msgstr "Utläggning"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:255
+msgid "Default note style for new notes"
+msgstr "Nothuvudstil"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:287
+msgid "When inserting notes..."
+msgstr "När noter infogas..."
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:294
+msgid "Split notes into ties to make durations match"
+msgstr "Dela upp för stora notvärden med hjälp av bindebågar"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:295
+msgid "Ignore existing durations"
+msgstr "Ignorera befintliga notvärden"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:305
+msgid "Auto-beam on insert when appropriate"
+msgstr "Lägg om lämpligt automatiskt till balkar vid infogning "
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:317
+#: ../src/gui/editors/notation/NotationEraser.cpp:54
+msgid "Collapse rests after erase"
+msgstr "Lägg ihop pauser efter radering"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:328
+msgid "Default paste type"
+msgstr "Förvald inklistringstyp"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:350
+msgid "Editing"
+msgstr "Redigering"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:362
+msgid "Accidentals in one octave..."
+msgstr "Tillfälliga förtecken i en oktav ..."
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:364
+msgid "Affect only that octave"
+msgstr "gäller bara den oktaven"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:365
+msgid "Require cautionaries in other octaves"
+msgstr "kräver förtydligande förtecken i andra oktaver"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:366
+msgid "Affect all subsequent octaves"
+msgstr "påverkar alla andra oktaver"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:374
+msgid "Accidentals in one bar..."
+msgstr "Tillfälliga förtecken i en takt ..."
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:376
+msgid "Affect only that bar"
+msgstr "gäller bara den takten"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:377
+msgid "Require cautionary resets in following bar"
+msgstr "kräver förtydligande återställningstecken i följande takt"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:378
+msgid "Require explicit resets in following bar"
+msgstr "kräver återställningstecken i följande takt"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:386
+#, fuzzy
+msgid "Key signature cancellation style"
+msgstr "Återställning av fasta förtecken:"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:388
+msgid "Cancel only when entering C major or A minor"
+msgstr "Återställ endast i C-dur eller a-moll"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:389
+msgid "Cancel whenever removing sharps or flats"
+msgstr "Återställ när kors- eller b-förtecken tas bort"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:390
+msgid "Cancel always"
+msgstr "Återställ alltid"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:400
+msgid "Accidentals"
+msgstr "Tillfälliga förtecken"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:441
+msgid "Notation font"
+msgstr "Notteckensnitt"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:467
+msgid "Origin:"
+msgstr "Ursprung:"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:471
+msgid "Copyright:"
+msgstr "Kopieringsrättigheter:"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:475
+msgid "Mapped by:"
+msgstr "Mappat av:"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:479
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:81
+msgid "Type:"
+msgstr "Typ:"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:508
+msgid "Font size for single-staff views"
+msgstr "Teckenstorlek för vyer med en notlinjesystemräcka"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:516
+msgid "Font size for multi-staff views"
+msgstr "Teckenstorlek för vyer med flera notlinjesystemräckor"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:524
+msgid "Font size for printing (pt)"
+msgstr "Teckenstorlek för utskrift (punkter)"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:541
+msgid "Text font"
+msgstr "Textteckensnitt"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:549
+msgid "Sans-serif font"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:664
+msgid "%1 (smooth)"
+msgstr "%1 (jämnt)"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:667
+msgid "%1 (jaggy)"
+msgstr "%1 (ojämnt)"
+
+#: ../src/gui/configuration/LatencyConfigurationPage.cpp:58
+msgid "JACK latency"
+msgstr "JACK-latenstid"
+
+#: ../src/gui/configuration/LatencyConfigurationPage.cpp:61
+msgid ""
+"Use the \"Fetch JACK latencies\" button to discover the latency values set "
+"at\n"
+"the sequencer. It's recommended that you use the returned values but it's "
+"also\n"
+"possible to override them manually using the sliders. Note that if you "
+"change\n"
+"your JACK server parameters you should always fetch the latency values "
+"again.\n"
+"The latency values will be stored by Rosegarden for use next time."
+msgstr ""
+"Använd knappen \"Hämta latenstider från JACK\" för att se vilka\n"
+"latenstider som är inställda för spelaren. Det rekommenderas att du\n"
+"använder returnerade värden, men det är också möjligt att överskrida dem\n"
+"manuellt med skjutreglagen. Observera att om du ändrar dina\n"
+"serverparametrar för JACK, ska du alltid hämta latenstidsvärden igen.\n"
+"Latenstidsvärden lagras av Rosegarden för användning nästa gång."
+
+#: ../src/gui/configuration/LatencyConfigurationPage.cpp:65
+msgid "JACK playback latency (in ms)"
+msgstr "Latenstid vid uppspelning med JACK (i ms)"
+
+#: ../src/gui/configuration/LatencyConfigurationPage.cpp:66
+msgid "JACK record latency (in ms)"
+msgstr "Latenstid vid inspelning med JACK (i ms)"
+
+#: ../src/gui/configuration/LatencyConfigurationPage.cpp:68
+msgid "Fetch JACK latencies"
+msgstr "Hämta latenstider från JACK"
+
+#: ../src/gui/configuration/LatencyConfigurationPage.cpp:121
+msgid "JACK Latency"
+msgstr "JACK-latenstid"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:92
+msgid "Audio preview scale"
+msgstr "Ljudgranskning"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:96
+msgid "Linear - easier to see loud peaks"
+msgstr "Linjära - lättare att se toppar"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:97
+msgid "Meter scaling - easier to see quiet activity"
+msgstr "Meterskalning - lättare att upptäcka tystnad"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:105
+#, fuzzy
+msgid "Record audio files as"
+msgstr "Spela in:"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:107
+msgid "16-bit PCM WAV format (smaller files)"
+msgstr "WAV-format med 16-bitars PCM (mindre filer)"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:108
+msgid "32-bit float WAV format (higher quality)"
+msgstr "WAV-format med 32-bitars flyttal (högre kvalitet)"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:117
+msgid "External audio editor"
+msgstr "Extern ljudeditor"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:145
+msgid "Create JACK outputs"
+msgstr ""
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:150
+#, fuzzy
+msgid "for individual audio instruments"
+msgstr "per instrument"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:157
+#, fuzzy
+msgid "for submasters"
+msgstr "Inga delnivåer"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:184
+#, fuzzy
+msgid ""
+"Rosegarden can start the JACK audio daemon (jackd) for you automatically if "
+"it isn't already running when Rosegarden starts.\n"
+"\n"
+"This is recommended for beginners and those who use Rosegarden as their main "
+"audio application, but it might not be to the liking of advanced users.\n"
+"\n"
+"If you want to start JACK automatically, make sure the command includes a "
+"full path where necessary as well as any command-line arguments you want to "
+"use.\n"
+"\n"
+"For example: /usr/local/bin/jackd -d alsa -d hw -r44100 -p 2048 -n 2\n"
+"\n"
+msgstr ""
+"Rosegarden kan starta ljuddemonen JACK (jackd) automatiskt\n"
+"åt dig om den inte redan körs när Rosegarden startas.\n"
+"\n"
+"Det rekommenderas för nybörjare och de som använder Rosegarden som\n"
+"huvudsakligt ljudprogram, men kanske inte passar avancerade användare.\n"
+"\n"
+"Om du vill starta JACK automatiskt, försäkra dig om att kommandot\n"
+"innehåller en fullständig sökväg om nödvändigt, samt alla "
+"kommandoradsväljare du vill använda.\n"
+"\n"
+"Till exempel: /usr/local/bin/jackd -d alsa -d hw -r44100 -p 2048 -n 2\n"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:196
+msgid "Start JACK when Rosegarden starts"
+msgstr "Starta JACK när Rosegarden startas"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:201
+msgid "JACK command"
+msgstr ""
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:214
+#, fuzzy
+msgid "JACK Startup"
+msgstr "Start"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:224
+msgid "External audio editor path"
+msgstr "Sökväg till extern ljudeditor"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:262
+msgid "External audio editor \"%1\" not found or not executable"
+msgstr ""
+
+#: ../src/gui/configuration/ColourConfigurationPage.cpp:70
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:448
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:863
+msgid "Add New Color"
+msgstr "Lägg till ny färg"
+
+#: ../src/gui/configuration/ColourConfigurationPage.cpp:74
+msgid "Delete Color"
+msgstr "Ta bort färg"
+
+#: ../src/gui/configuration/ColourConfigurationPage.cpp:93
+msgid "Color Map"
+msgstr "Färgkarta"
+
+#: ../src/gui/configuration/ColourConfigurationPage.cpp:128
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:983
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:882
+msgid "New Color Name"
+msgstr "Nytt färgnamn"
+
+#: ../src/gui/configuration/ColourConfigurationPage.cpp:130
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:59
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:984
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:883
+#: ../src/gui/studio/DeviceManagerDialog.cpp:115
+#: ../src/gui/studio/DeviceManagerDialog.cpp:174
+msgid "New"
+msgstr "Ny"
+
+#: ../src/gui/configuration/LatencyConfigurationPage.h:62
+msgid "Latency"
+msgstr "Latenstid"
+
+#: ../src/gui/configuration/LatencyConfigurationPage.h:63
+msgid "Sequencer Latency"
+msgstr "Spelarens latenstid"
+
+#: ../src/gui/configuration/ColourConfigurationPage.h:61
+msgid "Color Settings"
+msgstr "Färginställningar"
+
+#: ../src/gui/studio/MidiDeviceListViewItem.cpp:55
+#: ../src/gui/studio/MidiKeyMapListViewItem.cpp:44
+msgid "Key Mapping"
+msgstr "Tonartsändring"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:97
+msgid "Manage MIDI Banks and Programs"
+msgstr "Hantera MIDI-banker och program"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:128
+msgid "MIDI Device"
+msgstr "MIDI-enhet"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:130
+#: ../src/gui/studio/BankEditorDialog.cpp:219
+msgid "MSB"
+msgstr "Mest signifikant"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:131
+#: ../src/gui/studio/BankEditorDialog.cpp:218
+msgid "LSB"
+msgstr "Minst signifikant"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:140
+msgid "Add Bank"
+msgstr "Lägg till bank"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:141
+msgid "Add Key Mapping"
+msgstr "Lägg till tonartsändring"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:153
+msgid "Add a Bank to the current device"
+msgstr "Lägg till en bank i nuvarande enhet"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:157
+msgid "Add a Percussion Key Mapping to the current device"
+msgstr "Lägg till en tonartsändring för slagverk i nuvarande enhet"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:161
+msgid "Delete the current Bank or Key Mapping"
+msgstr "Ta bort nuvarande bank eller tonartsändring"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:165
+msgid "Delete all Banks and Key Mappings from the current Device"
+msgstr "Ta bort alla banker och tonartsändringar från nuvarande enhet"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:167
+#: ../src/gui/studio/DeviceManagerDialog.cpp:117
+msgid "Import..."
+msgstr "Importera..."
+
+#: ../src/gui/studio/BankEditorDialog.cpp:168
+#: ../src/gui/studio/DeviceManagerDialog.cpp:118
+msgid "Export..."
+msgstr "Exportera..."
+
+#: ../src/gui/studio/BankEditorDialog.cpp:176
+msgid ""
+"Import Bank and Program data from a Rosegarden file to the current Device"
+msgstr ""
+"Importera bank- och programdata från Rosegarden-fil till nuvarande enhet"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:179
+msgid ""
+"Export all Device and Bank information to a Rosegarden format interchange "
+"file"
+msgstr ""
+"Exportera all bank- och programdata till utbytesfil med Rosegarden-format"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:190
+msgid "Copy all Program names from current Bank to clipboard"
+msgstr "Kopiera alla programnamn från nuvarande bank till klippbordet"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:194
+msgid "Paste Program names from clipboard to current Bank"
+msgstr "Klistra in programnamn från klippbordet till nuvarande bank"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:216
+msgid "Show Variation list based on "
+msgstr "Visa variantlista baserad på "
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1010
+msgid "<new bank>"
+msgstr "<ny bank>"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1046
+msgid "<new mapping>"
+msgstr "<ny tonartsändring>"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1048
+msgid "<new mapping %1>"
+msgstr "<ny tonartsändring %1>"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1089
+msgid "Really delete this bank?"
+msgstr "Ska banken verkligen tas bort?"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1137
+msgid "Really delete this key mapping?"
+msgstr "Ska tonartsändringen verkligen tas bort?"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1187
+msgid "Really delete all banks for "
+msgstr "Ska alla banker tas bort för "
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1476
+msgid "Import Banks from Device in File"
+msgstr "Importera banker från enhet i fil"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1623
+#: ../src/gui/studio/DeviceManagerDialog.cpp:770
+msgid "Export Device as..."
+msgstr "Exportera enhet som ..."
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1694
+msgid ""
+"There are unsaved changes.\n"
+"Do you want to apply the changes before exiting the Bank Editor or discard "
+"the changes ?"
+msgstr ""
+"Det finns osparade ändringar.\n"
+"Vill du verkställa ändringarna innan du avslutar bankeditorn eller kasta "
+"ändringarna?"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1697
+msgid "Unsaved Changes"
+msgstr "Osparade ändringar"
+
+#: ../src/gui/studio/NameSetEditor.cpp:68
+msgid "Librarian"
+msgstr "Bibliotekarie"
+
+#: ../src/gui/studio/NameSetEditor.cpp:75
+msgid "Email"
+msgstr "E-post"
+
+#: ../src/gui/studio/NameSetEditor.cpp:80
+msgid ""
+"The librarian maintains the Rosegarden device data for this device.\n"
+"If you've made modifications to suit your own device, it might be worth\n"
+"liaising with the librarian in order to publish your information for the "
+"benefit\n"
+"of others."
+msgstr ""
+"Bibliotekarien underhåller Rosegardens enhetsdata för enheten.\n"
+"Om du har gjort ändringar för att passa din egen enhet kan det vara\n"
+"värt att samråda med bibliotekarien för att publicera din information,\n"
+"så att andra kan dra nytta av den."
+
+#: ../src/gui/studio/MidiBankListViewItem.cpp:51
+#: ../src/gui/studio/MidiDeviceListViewItem.cpp:48
+msgid "Percussion Bank"
+msgstr "Slagverksbank"
+
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:84
+#: ../src/gui/studio/MidiBankListViewItem.cpp:51
+#: ../src/gui/studio/MidiDeviceListViewItem.cpp:48
+msgid "Bank"
+msgstr "Bank"
+
+#: ../src/gui/studio/ChangeRecordDeviceCommand.h:39
+msgid "Change Record Device"
+msgstr "Ändra inspelningsenhet"
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:61
+#: ../src/gui/studio/DeviceManagerDialog.cpp:96
+msgid "Manage MIDI Devices"
+msgstr "Hantera MIDI-enheter"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:98
+msgid "Play devices"
+msgstr "Uppspelningsenheter"
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:76
+#: ../src/gui/studio/DeviceManagerDialog.cpp:106
+#: ../src/gui/studio/DeviceManagerDialog.cpp:165
+msgid "Connection"
+msgstr "Anslutning"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:119
+msgid "Banks..."
+msgstr "Banker..."
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:120
+msgid "Control Events..."
+msgstr "Styrhändelser ..."
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:126
+msgid "Create a new Play device"
+msgstr "Skapa en ny uppspelningsenhet"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:129
+#: ../src/gui/studio/DeviceManagerDialog.cpp:184
+msgid "Delete the selected device"
+msgstr "Ta bort markerad enhet"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:132
+msgid ""
+"Import Bank, Program and Controller data from a Rosegarden file to the "
+"selected device"
+msgstr ""
+"Importera bank-, program- och effektdata från Rosegarden-fil till markerad "
+"enhet"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:135
+msgid "Export Bank and Controller data to a Rosegarden interchange file"
+msgstr "Exportera bank- och effektdata till utbytesfil med Rosegarden-format"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:138
+msgid "View and edit Banks and Programs for the selected device"
+msgstr "Visa och redigera banker och program för markerad enhet"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:141
+msgid ""
+"View and edit Control Events for the selected device - these are special "
+"Event types that you can define against your device and control through "
+"Control Rulers or the Instrument Parameter Box "
+msgstr ""
+"Visa och redigera effekthändelser för markerad enhet; dessa är särskilda "
+"händelsetyper som du kan definiera för din enhet och kontrollera via "
+"effektlinjaler eller rutan med instrumentparametrar."
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:156
+msgid "Record devices"
+msgstr "Inspelningsenheter"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:164
+msgid "Current"
+msgstr "Nuvarande"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:181
+msgid "Create a new Record device"
+msgstr "Skapa en ny inspelningsenhet"
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:360
+#: ../src/gui/studio/DeviceEditorDialog.cpp:378
+#: ../src/gui/studio/DeviceManagerDialog.cpp:486
+#: ../src/gui/studio/DeviceManagerDialog.cpp:501
+msgid "New Device"
+msgstr "Ny enhet"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:703
+msgid "Import from Device in File"
+msgstr "Importera från enhet i fil"
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:55
+msgid "Remap Instrument assigments..."
+msgstr "Mappa om instrumenttilldelningar..."
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:62
+msgid "Device or Instrument"
+msgstr "Enhet eller instrument"
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:65
+msgid "Remap Tracks by all Instruments on a Device or by single Instrument"
+msgstr ""
+"Mappa om spår för alla instrument till en enhet eller ett enstaka instrument"
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:74
+msgid "Choose Source and Destination"
+msgstr "Välj källa och mål"
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:77
+msgid "From"
+msgstr "Från"
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:78
+msgid "To"
+msgstr "Till"
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:120
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:121
+msgid "<no devices>"
+msgstr "<inga enheter>"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:155
+msgid "Show Audio &Faders"
+msgstr "Visa ljud&toningsreglage"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:160
+msgid "Show Synth &Faders"
+msgstr "Visa s&ynttoningsreglage"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:165
+msgid "Show &Submasters"
+msgstr "Visa &delnivåer"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:170
+msgid "Show &Plugin Buttons"
+msgstr "Visa insticks&knappar"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:175
+msgid "Show &Unassigned Faders"
+msgstr "Visa &otilldelade toningsreglage"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:184
+#, c-format
+msgid ""
+"_n: 1 Input\n"
+"%n Inputs"
+msgstr ""
+"1 ingång\n"
+"%n ingångar"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:194
+msgid "No Submasters"
+msgstr "Inga delnivåer"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:203
+#, c-format
+msgid ""
+"_n: 1 Submaster\n"
+"%n Submasters"
+msgstr ""
+"1 delnivå\n"
+"%n delnivåer"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:279
+msgid "Audio Mixer"
+msgstr "Ljudmixer"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:311
+msgid "Record input source"
+msgstr "Inspelningskälla"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:322
+msgid "Output destination"
+msgstr "Utgång"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:336
+#: ../src/gui/studio/AudioMixerWindow.cpp:495
+msgid "Pan"
+msgstr "Panorera"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:355
+msgid "Mono or stereo"
+msgstr "Mono eller stereo"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:364
+#: ../src/gui/studio/AudioMixerWindow.cpp:513
+msgid "Mute"
+msgstr "Tyst"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:373 rc.cpp:408
+#, no-c-format
+msgid "Solo"
+msgstr "Solo"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:382
+msgid "Arm recording"
+msgstr "Förbered inspelning"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:400
+#, c-format
+msgid "Audio %1"
+msgstr "Ljud %1"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:404
+#, c-format
+msgid "Synth %1"
+msgstr "Synt %1"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:578
+#: ../src/gui/studio/AudioMixerWindow.cpp:580
+msgid "Audio master output level"
+msgstr "Huvudutnivå för ljud"
+
+#: ../src/gui/studio/SynthPluginManagerDialog.cpp:71
+msgid "Manage Synth Plugins"
+msgstr "Hantera syntinsticksmoduler"
+
+#: ../src/gui/studio/SynthPluginManagerDialog.cpp:78
+msgid "Synth plugins"
+msgstr "Syntinsticksmoduler"
+
+#: ../src/gui/studio/SynthPluginManagerDialog.cpp:145
+msgid "Controls"
+msgstr "Styrning"
+
+#: ../src/gui/studio/SynthPluginManagerDialog.cpp:152
+msgid "Editor >>"
+msgstr "Editor >>"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:66
+#: ../src/gui/studio/MidiProgramsEditor.cpp:169
+msgid "Bank and Program details"
+msgstr "Bank- och programinformation"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:67
+msgid "Programs"
+msgstr "Program"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2711
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:88
+#: ../src/gui/studio/MidiProgramsEditor.cpp:93
+msgid "Percussion"
+msgstr "Slagverk"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:99
+msgid "MSB Value"
+msgstr "Mest signifikant värde"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:107
+msgid ""
+"Selects a MSB controller Bank number (MSB/LSB pairs are always unique for "
+"any Device)"
+msgstr ""
+"Väljer mest signifikant banknummer för effekt (mest och minst signifikanta "
+"par är alltid unika för respektive enhet)"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:111
+msgid ""
+"Selects a LSB controller Bank number (MSB/LSB pairs are always unique for "
+"any Device)"
+msgstr ""
+"Väljer minst signifikant banknummer för effekt (mest och minst signifikanta "
+"par är alltid unika för respektive enhet)"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:116
+msgid "LSB Value"
+msgstr "Minst signifikant värde"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:254
+#: ../src/gui/studio/MidiProgramsEditor.cpp:541
+#, c-format
+msgid "Key Mapping: %1"
+msgstr "Tonartsändring: %1"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:476
+msgid "<no key mapping>"
+msgstr "<ingen tonartsändring>"
+
+#: ../src/gui/studio/MidiKeyMappingEditor.cpp:57
+#: ../src/gui/studio/MidiKeyMappingEditor.cpp:81
+msgid "Key Mapping details"
+msgstr "Information om tonartsändring"
+
+#: ../src/gui/studio/MidiKeyMappingEditor.cpp:58
+msgid "Pitches"
+msgstr "Tonhöjder"
+
+#: ../src/gui/studio/MidiMixerWindow.cpp:152
+msgid "MIDI Mixer"
+msgstr "MIDI-mixer"
+
+#: ../src/gui/studio/MidiMixerWindow.cpp:199
+msgid "Volume"
+msgstr "Volym"
+
+#: ../src/gui/studio/AudioPluginOSCGUIManager.cpp:444
+msgid "Rosegarden Plugin"
+msgstr "Insticksmodul för Rosegarden"
+
+#: ../src/gui/studio/AudioPluginOSCGUIManager.cpp:447
+#, c-format
+msgid "Rosegarden: %1"
+msgstr "Rosegarden: %1"
+
+#: ../src/gui/studio/AudioPluginOSCGUIManager.cpp:449
+msgid "Rosegarden: %1: %2"
+msgstr "Rosegarden: %1: %2"
+
+#: ../src/gui/studio/AudioPluginOSCGUIManager.cpp:450
+#, c-format
+msgid "Plugin slot %1"
+msgstr "Insticksplats %1"
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:92
+msgid "Add Play Device"
+msgstr "Lägg till uppspelningsenhet"
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:93
+msgid "Add Record Device"
+msgstr "Lägg till inspelningsenhet"
+
+#: ../src/commands/studio/CreateOrDeleteDeviceCommand.h:68
+#: ../src/gui/studio/DeviceEditorDialog.cpp:94
+msgid "Delete Device"
+msgstr "Ta bort enhet"
+
+#: ../src/gui/editors/segment/PlayList.cpp:77
+#: ../src/gui/studio/DeviceEditorDialog.cpp:156
+#: ../src/gui/studio/DeviceEditorDialog.cpp:361
+msgid "Play"
+msgstr "Spela"
+
+#: ../src/commands/segment/SegmentRecordCommand.cpp:37
+#: ../src/gui/studio/DeviceEditorDialog.cpp:156
+#: ../src/gui/studio/DeviceEditorDialog.cpp:379 rc.cpp:394
+#, no-c-format
+msgid "Record"
+msgstr "Spela in"
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:256
+msgid "Apply pending changes?"
+msgstr "Verkställ vilande ändringar?"
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:359
+#: ../src/gui/studio/DeviceEditorDialog.cpp:377
+msgid "<new device>"
+msgstr "<ny enhet>"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentEraser.cpp:82
+msgid "Click on a segment to delete it"
+msgstr "Klicka på ett segment för att radera det."
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSplitter.cpp:166
+msgid ""
+"Click on a segment to split it in two; hold Shift to avoid snapping to beat "
+"grid"
+msgstr ""
+"Klicka på ett segment för att dela det itu; håll ner Skift för att undvika "
+"fästande på rutnätet för taktslag."
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSplitter.cpp:168
+msgid "Click on a segment to split it in two"
+msgstr "Klicka på ett segment för att dela det itu."
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:81
+msgid "Click and drag to select segments"
+msgstr "Dra för att markera segment"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentMover.cpp:154
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:238
+msgid "Move Segment"
+msgstr "Flytta segment"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentMover.cpp:154
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:239
+msgid "Move Segments"
+msgstr "Flytta segment"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:217
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:169
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:141
+#: ../src/gui/editors/segment/segmentcanvas/SegmentMover.cpp:210
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:255
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:359
+msgid "Hold Shift to avoid snapping to beat grid"
+msgstr "Håll ner Skift för att undvika rutnätet för taktslag"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:485
+msgid ""
+"Click and drag to select segments; middle-click and drag to draw an empty "
+"segment"
+msgstr ""
+"Dra för att markera segment; mittenklicka för att skapa ett tomt segment"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:384
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:502
+msgid ""
+"Click and drag to resize a segment; hold Ctrl as well to rescale its contents"
+msgstr ""
+"Dra för att ändra storlek på ett segment; håll ner Ctrl för att även ändra "
+"innehållet"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:386
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:504
+msgid "Click and drag to rescale segment"
+msgstr "Dra för att storleksändra innehållet"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:509
+msgid "Click and drag to move segments; hold Ctrl as well to copy them"
+msgstr "Dra för att flytta segment; håll ner Ctrl för att kopiera dem"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:511
+msgid "Click and drag to copy segments"
+msgstr "Dra för att kopiera segment"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:515
+msgid ""
+"Click and drag to move segment; hold Ctrl as well to copy it; double-click "
+"to edit"
+msgstr ""
+"Dra för att flytta segment; håll ner Ctrl för att kopiera det; dubbelklicka "
+"för att redigera"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:517
+msgid "Click and drag to copy segment"
+msgstr "Dra för att kopiera segment"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:157
+msgid ""
+"The audio file path does not exist or is not writable.\n"
+"You must set the audio file path to a valid directory in Document Properties "
+"before rescaling an audio file.\n"
+"Would you like to set it now?"
+msgstr ""
+"Sökvägen till ljudfiler finns inte eller är inte skrivbar.\n"
+"Du måste ange sökvägen för ljudfiler till en giltig katalog i "
+"Dokumentegenskaper innan en ljudfil storleksändras.\n"
+"Vill du ange den nu?"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:261
+msgid ""
+"Hold Shift to avoid snapping to beat grid; hold Ctrl as well to rescale "
+"contents"
+msgstr ""
+"Håll nere Skift för att undvika rutnätet för taktslag; håll även ner Ctrl "
+"för att storleksändra innehållet"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentMover.cpp:325
+msgid "Click and drag to move a segment"
+msgstr "Dra för att flytta ett segment"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentPencil.cpp:225
+msgid "Hold Shift to avoid snapping to bar lines"
+msgstr "Håll ner Skift för att undvika fästande vid taktstreck"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentPencil.cpp:283
+msgid "Record or drop audio here"
+msgstr "Spela in eller släpp ljud här"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentPencil.cpp:289
+#, fuzzy
+msgid ""
+"Click and drag to draw an empty segment. Control+Alt click and drag to draw "
+"in overlap mode."
+msgstr ""
+"Dra för att markera segment; mittenklicka för att skapa ett tomt segment"
+
+#: ../src/gui/editors/segment/TrackLabel.cpp:77
+msgid ""
+"Click and hold with left mouse button to assign this Track to an Instrument."
+msgstr ""
+"Klicka och håll nere vänster musknapp för att tilldela spåret ett instrument."
+
+#: ../src/gui/editors/segment/TrackLabel.cpp:191
+msgid "Change track name"
+msgstr "Ändra spårnamn"
+
+#: ../src/gui/editors/segment/TrackLabel.cpp:192
+msgid "Enter new track name"
+msgstr "Skriv in nytt spårnamn"
+
+#: ../src/gui/editors/segment/TrackEditor.cpp:648
+msgid "Turn Repeating Segment into Real Copies"
+msgstr "Omvandla upprepat segment till riktiga kopior"
+
+#: ../src/gui/editors/segment/TrackEditor.cpp:650
+msgid "Turn Repeating Segments into Real Copies"
+msgstr "Omvandla upprepade segment till riktiga kopior"
+
+#: ../src/gui/editors/segment/TrackEditor.cpp:814
+msgid ""
+"You can't drop files into Rosegarden from this client. Try using Konqueror "
+"instead."
+msgstr ""
+"Du kan inte släppa filer till Rosegarden från det här programmet. Försök att "
+"använda Konqueror istället."
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:85
+msgid "Manage Triggered Segments"
+msgstr "Hantera utlösande segment"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:89
+msgid "ID"
+msgstr "Id"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:735
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:93
+msgid "Base velocity"
+msgstr "Grundljudstyrka"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:94
+msgid "Triggers"
+msgstr "Utlösare"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:115
+msgid "Add a Triggered Segment"
+msgstr "Lägg till ett utlösande segment"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:119
+msgid "Delete a Triggered Segment"
+msgstr "Ta bort ett utlösande segment"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:123
+msgid "Delete All Triggered Segments"
+msgstr "Ta bort alla utlösande segment"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:127
+msgid "Close the Triggered Segment Manager"
+msgstr "Stäng hantering av utlösande segment"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:169
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:245
+msgid "<no label>"
+msgstr "<inget namn>"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:248
+msgid ""
+"_n: %1 on 1 track\n"
+"%1 on %n tracks"
+msgstr ""
+"%1 på 1 spår\n"
+"%1 på %n spår"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:284
+msgid ""
+"This will remove all triggered segments from the whole composition. Are you "
+"sure?"
+msgstr ""
+"Det här tar bort alla utlösande segment från hela kompositionen. Är du säker?"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:288
+msgid "Remove all triggered segments"
+msgstr "Ta bort alla utlösande segment"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:313
+msgid "Trigger Segment Duration"
+msgstr "Längd för utlösande segment"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:336
+#, c-format
+msgid ""
+"_n: This triggered segment is used 1 time in the current composition. Are "
+"you sure you want to remove it?\n"
+"This triggered segment is used %n times in the current composition. Are you "
+"sure you want to remove it?"
+msgstr ""
+"Det här utlösande segmentet används 1 gång i nuvarande komposition. Är du "
+"säker på att du vill ta bort det?\n"
+"Det här utlösande segmentet används %n gånger i nuvarande komposition. Är du "
+"säker på att du vill ta bort det?"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:400
+msgid "Pa&ste as New Triggered Segment"
+msgstr "Kli&stra in som nytt utlösande segment"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1169
+#: ../src/gui/editors/segment/MarkerEditor.cpp:399
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:412
+#: ../src/gui/editors/tempo/TempoView.cpp:622
+msgid "&Musical Times"
+msgstr "&Metronomtider"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1179
+#: ../src/gui/editors/segment/MarkerEditor.cpp:409
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:422
+#: ../src/gui/editors/tempo/TempoView.cpp:632
+msgid "&Real Times"
+msgstr "&Klocktider"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1189
+#: ../src/gui/editors/segment/MarkerEditor.cpp:419
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:432
+#: ../src/gui/editors/tempo/TempoView.cpp:642
+msgid "Ra&w Times"
+msgstr "&Obehandlade tider"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:83
+msgid "Manage Markers"
+msgstr "Hantera markeringar"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:86
+msgid "Marker time "
+msgstr "Markeringstid "
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:87
+#, fuzzy
+msgid "Marker text "
+msgstr "Markeringstid "
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:88
+msgid "Marker description "
+msgstr "Markeringsbeskrivning "
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:95
+msgid "Pointer position"
+msgstr "Visarposition"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:100
+msgid "Real time:"
+msgstr "Klocktid:"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:103
+msgid "In measure:"
+msgstr "I takt:"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:121
+msgid "Add a Marker"
+msgstr "Lägg till en markering"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:125
+msgid "Delete a Marker"
+msgstr "Ta bort en markering"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:129
+msgid "Delete All Markers"
+msgstr "Ta bort alla markering"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:133
+msgid "Close the Marker Editor"
+msgstr "Stäng markeringseditorn"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:296
+msgid "Remove all markers"
+msgstr "Ta bort alla markeringar"
+
+#: ../src/gui/editors/segment/PlayList.cpp:76
+msgid "Add..."
+msgstr "Lägg till..."
+
+#: ../src/gui/editors/segment/PlayList.cpp:78
+msgid "Move Up"
+msgstr "Flytta upp"
+
+#: ../src/gui/editors/segment/PlayList.cpp:79
+msgid "Move Down"
+msgstr "Flytta ner"
+
+#: ../src/gui/editors/segment/PlayList.cpp:124
+msgid "Select one or more Rosegarden files"
+msgstr "Markera en eller flera Rosegarden-filer"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:73
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:55
+msgid "<not showing>"
+msgstr "<visas inte>"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:89
+msgid "Manage Control Events"
+msgstr "Hantera styrhändelser"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:91
+msgid "<no device>"
+msgstr "<ingen enhet>"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:99
+msgid " Control Events for %1 (device %2)"
+msgstr " Styrhändelser för %1 (enhet %2)"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:104
+msgid "Control Event name "
+msgstr "Styrhändelsenamn "
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:105
+msgid "Control Event type "
+msgstr "Styrhändelsetyp "
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:106
+msgid "Control Event value "
+msgstr "Styrhändelsevärde "
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:107
+msgid "Description "
+msgstr "Beskrivning "
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:108
+msgid "Min "
+msgstr "Minimum "
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:109
+msgid "Max "
+msgstr "Maximum "
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:110
+msgid "Default "
+msgstr "Standard "
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:111
+msgid "Color "
+msgstr "Färg "
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:112
+msgid "Position on instrument panel"
+msgstr "Plats på instrumentpanelen"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:136
+msgid "Add a Control Parameter to the Studio"
+msgstr "Lägg till en styrparameter i studion"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:140
+msgid "Delete a Control Parameter from the Studio"
+msgstr "Ta bort en styrparameter från studion"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:144
+msgid "Close the Control Parameter editor"
+msgstr "Stäng styrparametereditor"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:221
+msgid "<default>"
+msgstr "<förval>"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:62
+msgid "Edit Control Parameter"
+msgstr "Redigera styrparameter"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:71
+msgid "Control Event Properties"
+msgstr "Egenskaper för styrhändelser"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:77
+msgid "Name:"
+msgstr "Namn:"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:93
+msgid "Control Event value:"
+msgstr "Styrhändelsevärde:"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:97
+msgid "Minimum value:"
+msgstr "Minimalt värde:"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:101
+msgid "Maximum value:"
+msgstr "Maximalt värde:"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:105
+msgid "Default value:"
+msgstr "Standardvärde:"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:109
+msgid "Color:"
+msgstr "Färg:"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:113
+msgid "Instrument Parameter Box position:"
+msgstr "Plats för rutan med instrumentparametrar:"
+
+#: ../src/gui/editors/segment/TrackButtons.cpp:209
+#: ../src/gui/editors/segment/TrackButtons.cpp:585
+#: ../src/gui/editors/segment/TrackButtons.cpp:935
+#: ../src/gui/editors/segment/TrackButtons.cpp:1127
+msgid "<no instrument>"
+msgstr "<inget instrument>"
+
+#: ../src/gui/editors/segment/TrackButtons.cpp:352
+#: ../src/gui/editors/segment/TrackButtons.cpp:1094
+msgid "<untitled audio>"
+msgstr "<namnlöst ljud>"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:130
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:662
+#: ../src/gui/editors/segment/TrackButtons.cpp:354
+#: ../src/gui/editors/segment/TrackButtons.cpp:1096
+msgid "<untitled>"
+msgstr "<namnlös>"
+
+#: ../src/gui/editors/segment/TrackButtons.cpp:1058
+msgid "Mute track"
+msgstr "Spela upp detta spår"
+
+#: ../src/gui/editors/segment/TrackButtons.cpp:1063
+msgid "Record on this track"
+msgstr "Spela in på detta spår"
+
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:88
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:1015
+msgid "Segment"
+msgstr "Segment"
+
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:89
+msgid "Segment Parameters"
+msgstr "Segmentparametrar"
+
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:366
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:697
+msgid "%1 ms"
+msgstr "%1 ms"
+
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:1031
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:910
+msgid "Highest playable note"
+msgstr "Högsta spelbara ton"
+
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:1051
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:930
+msgid "Lowest playable note"
+msgstr "Lägsta spelbara ton"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:93
+msgid "Track Parameters"
+msgstr "Spårparametrar"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:137
+msgid "Playback parameters"
+msgstr "Uppspelningsparametrar"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:172
+msgid "Recording filters"
+msgstr "Inspelningsfilter"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:191
+msgid "Channel"
+msgstr "Kanal"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:203
+#, fuzzy
+msgid "Staff export options"
+msgstr "Visa avancerade alternativ"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:220
+#, fuzzy
+msgid "Notation size:"
+msgstr "Notationstid:"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:225
+#, fuzzy
+msgid "Small"
+msgstr "Alla"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:226
+msgid "Tiny"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:233
+#, fuzzy
+msgid "Bracket type:"
+msgstr "Texttyp:"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:237
+#, fuzzy
+msgid "-----"
+msgstr "---"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:238
+#, fuzzy
+msgid "[----"
+msgstr "---"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:239
+#, fuzzy
+msgid "----]"
+msgstr "---"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:240
+#, fuzzy
+msgid "[---]"
+msgstr "---"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:241
+#, fuzzy
+msgid "{----"
+msgstr "---"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:242
+#, fuzzy
+msgid "----}"
+msgstr "---"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:243
+#, fuzzy
+msgid "{[---"
+msgstr "---"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:244
+#, fuzzy
+msgid "---]}"
+msgstr "---"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:253
+#, fuzzy
+msgid "Create segments with"
+msgstr "Skapa segment med:"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:264
+msgid "Preset"
+msgstr "Förinställning"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:272
+msgid "Load"
+msgstr "Ladda data"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:282
+msgid "treble"
+msgstr "Diskant"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:283
+msgid "bass"
+msgstr "Bas"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:284
+msgid "crotales"
+msgstr "krotal"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:285
+msgid "xylophone"
+msgstr "xylofon"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:286
+msgid "guitar"
+msgstr "gitarr"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:287
+msgid "contrabass"
+msgstr "kontrabas"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:288
+msgid "celesta"
+msgstr "celesta"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:289
+msgid "old celesta"
+msgstr "äldre celesta"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:290
+msgid "french"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:291
+msgid "soprano"
+msgstr "sopran"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:292
+#, fuzzy
+msgid "mezzosoprano"
+msgstr "sopran"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:293
+msgid "alto"
+msgstr "alt"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:294
+msgid "tenor"
+msgstr "tenor"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:295
+#, fuzzy
+msgid "baritone"
+msgstr "Variant"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:296
+#, fuzzy
+msgid "varbaritone"
+msgstr "Variant"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:297
+#, fuzzy
+msgid "subbass"
+msgstr "Bas"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:327
+msgid "Lowest"
+msgstr "Lägsta"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:329
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:336
+msgid "---"
+msgstr "---"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:331
+msgid "Choose the lowest suggested playable note, using a staff"
+msgstr "Ange den lägsta spelbara tonen"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:334
+msgid "Highest"
+msgstr "Högsta"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:338
+msgid "Choose the highest suggested playable note, using a staff"
+msgstr "Ange den högsta spelbara tonen"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:666
+msgid "[ Track %1 - %2 ]"
+msgstr "[ Spår %1 - %2 ]"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:985
+msgid "The instrument preset database is corrupt. Check your installation."
+msgstr "Instrumentdatabasen är korrupt. Kontrollera din installation."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:173
+#: ../src/gui/editors/parameters/InstrumentParameterBox.cpp:54
+msgid "Instrument Parameters"
+msgstr "Instrumentparametrar"
+
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:85
+msgid "Variation"
+msgstr "Variant"
+
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:86
+msgid "Program"
+msgstr "Program"
+
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:87
+msgid "Channel out"
+msgstr "Kanal ut"
+
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:215
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:221
+msgid "[ %1 ]"
+msgstr "[ %1 ]"
+
+#: ../src/gui/editors/matrix/MatrixEraser.cpp:58
+#: ../src/gui/editors/matrix/MatrixMover.cpp:71
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:67
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:77
+msgid "Switch to Draw Tool"
+msgstr "Byt till ritverktyg"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:75
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:69
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:71
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:81
+#: ../src/gui/editors/notation/ClefInserter.cpp:57
+#: ../src/gui/editors/notation/GuitarChordInserter.cpp:63
+#: ../src/gui/editors/notation/NotationSelector.cpp:87
+#: ../src/gui/editors/notation/NoteInserter.cpp:113
+#: ../src/gui/editors/notation/RestInserter.cpp:72
+#: ../src/gui/editors/notation/TextInserter.cpp:61
+msgid "Switch to Erase Tool"
+msgstr "Byt till raderingsverktyg"
+
+#: ../src/gui/editors/matrix/MatrixEraser.cpp:62
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:73
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:75
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:85
+msgid "Switch to Move Tool"
+msgstr "Byt till förflyttningsverktyg"
+
+#: ../src/gui/editors/matrix/MatrixEraser.cpp:68
+#: ../src/gui/editors/matrix/MatrixMover.cpp:81
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:79
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:93
+msgid "Switch to Resize Tool"
+msgstr "Byt till storleksändringsverktyg"
+
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:446
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:579
+msgid "Click and drag to select; middle-click and drag to draw new note"
+msgstr "Dra för att markera; mittenklicka och dra för att skriva en ny not"
+
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:324
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:597
+msgid "Click and drag to resize selected notes"
+msgstr "Dra för att storleksändra markerade noter"
+
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:599
+msgid "Click and drag to resize note"
+msgstr "Dra för att storleksändra noter"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:471
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:604
+msgid "Click and drag to move selected notes; hold Ctrl as well to copy"
+msgstr "Dra för att flytta markerade noter; håll ner Ctrl för att kopiera"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:473
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:606
+msgid "Click and drag to copy selected notes"
+msgstr "Dra för att kopiera markerade noter"
+
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:610
+msgid "Click and drag to move note; hold Ctrl as well to copy"
+msgstr "Dra för att flytta noter; håll ner Ctrl för att kopiera"
+
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:612
+msgid "Click and drag to copy note"
+msgstr "Dra för att kopiera noter"
+
+#: ../src/gui/editors/matrix/MatrixEraser.cpp:54
+#: ../src/gui/editors/matrix/MatrixMover.cpp:67
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:65
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:63
+#: ../src/gui/editors/notation/ClefInserter.cpp:53
+#: ../src/gui/editors/notation/GuitarChordInserter.cpp:59
+#: ../src/gui/editors/notation/NotationEraser.cpp:67
+#: ../src/gui/editors/notation/NoteInserter.cpp:109
+#: ../src/gui/editors/notation/RestInserter.cpp:68
+#: ../src/gui/editors/notation/TextInserter.cpp:57
+msgid "Switch to Select Tool"
+msgstr "Byt till markeringsverktyg"
+
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:218
+msgid "Resize Event"
+msgstr "Ändra storlek på händelse"
+
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:221
+msgid "Resize Events"
+msgstr "Ändra storlek på händelser"
+
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:326
+msgid "Click and drag to resize a note"
+msgstr "Dra för att storleksändra en not"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:328
+msgid "Copy and Move Event"
+msgstr "Kopiera och flytta händelse"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:330
+msgid "Copy and Move Events"
+msgstr "Kopiera och flytta händelser"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:334
+msgid "Move Event"
+msgstr "Flytta händelse"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:336
+msgid "Move Events"
+msgstr "Flytta händelser"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:465
+msgid "Click and drag to move a note; hold Ctrl as well to copy it"
+msgstr "Dra för att flytta en not; håll ner Ctrl för att kopiera den"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:467
+msgid "Click and drag to copy a note"
+msgstr "Dra för att kopiera en not"
+
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:361
+msgid "Click and drag to draw a note; Shift to avoid snapping to grid"
+msgstr "Dra för att skriva en not; håll ner Skift för att undvika rutnätet"
+
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:363
+msgid "Click and drag to draw a note"
+msgstr "Dra för att skriva en not"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:437
+#: ../src/gui/editors/matrix/MatrixView.cpp:3053
+msgid "Couldn't apply piano roll layout"
+msgstr "Kunde inte verkställa pianorulleutläggning"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:663
+msgid "Resi&ze"
+msgstr "&Ändra storlek"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:669
+#: ../src/gui/editors/notation/NotationView.cpp:1919
+msgid "C&hord Insert Mode"
+msgstr "Infogningsläge för &ackord"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:676
+#: ../src/gui/editors/notation/NotationView.cpp:1778
+msgid "Ste&p Recording"
+msgstr "&Stegvis inspelning"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:694
+msgid "&Legato"
+msgstr "&Legato"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:708
+msgid "Set to Current Velocity"
+msgstr "Sätt till aktuell grundljudstyrka"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:712
+msgid "Set Event &Velocities..."
+msgstr "Ställ in &händelseljudstyrkor ..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:716
+msgid "Trigger Se&gment..."
+msgstr "Utlösande se&gment ..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:720
+msgid "Remove Triggers..."
+msgstr "Ta bort utlösare ..."
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1153
+#: ../src/gui/editors/matrix/MatrixView.cpp:724
+#: ../src/gui/editors/tempo/TempoView.cpp:606
+msgid "Select &All"
+msgstr "&Markera alla"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:732
+#: ../src/gui/editors/notation/NotationView.cpp:2325
+msgid "Cursor &Back"
+msgstr "Markör &bakåt"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:736
+#: ../src/gui/editors/notation/NotationView.cpp:2329
+msgid "Cursor &Forward"
+msgstr "Markör &framåt"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:740
+#: ../src/gui/editors/notation/NotationView.cpp:2333
+msgid "Cursor Ba&ck Bar"
+msgstr "Ma&rkör bakåt en takt"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:744
+#: ../src/gui/editors/notation/NotationView.cpp:2337
+msgid "Cursor For&ward Bar"
+msgstr "Mar&kör framåt en takt"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:748
+#: ../src/gui/editors/notation/NotationView.cpp:2341
+msgid "Cursor Back and Se&lect"
+msgstr "Markör bakåt och m&arkera"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:752
+#: ../src/gui/editors/notation/NotationView.cpp:2345
+msgid "Cursor Forward and &Select"
+msgstr "Markör framåt och &markera"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:756
+#: ../src/gui/editors/notation/NotationView.cpp:2349
+msgid "Cursor Back Bar and Select"
+msgstr "Markör bakåt en takt och markera"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:760
+#: ../src/gui/editors/notation/NotationView.cpp:2353
+msgid "Cursor Forward Bar and Select"
+msgstr "Markör framåt en takt och markera"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:764
+#: ../src/gui/editors/notation/NotationView.cpp:2363
+msgid "Cursor to St&art"
+msgstr "Markör &till början"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:770
+#: ../src/gui/editors/notation/NotationView.cpp:2369
+msgid "Cursor to &End"
+msgstr "Markör till &slutet"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:776
+#: ../src/gui/editors/notation/NotationView.cpp:2391
+msgid "Cursor to &Playback Pointer"
+msgstr "Mark&ör till uppspelningsvisare"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:820
+#: ../src/gui/editors/notation/NotationView.cpp:2435
+msgid "Playback Pointer to &Cursor"
+msgstr "&Uppspelningsvisare till markör"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:826
+#: ../src/gui/editors/notation/NotationView.cpp:2441
+msgid "&Solo"
+msgstr "S&olo"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:841
+#: ../src/gui/editors/notation/NotationView.cpp:2456
+msgid "Set Loop to Selection"
+msgstr "Ställ in upprepning till markör"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:845
+#: ../src/gui/editors/notation/NotationView.cpp:2460
+msgid "Clear L&oop"
+msgstr "R&ensa upprepning"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1157
+#: ../src/gui/editors/matrix/MatrixView.cpp:849
+#: ../src/gui/editors/notation/NotationView.cpp:2464
+#: ../src/gui/editors/tempo/TempoView.cpp:610
+msgid "Clear Selection"
+msgstr "Rensa markering"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1149
+#: ../src/gui/editors/matrix/MatrixView.cpp:854
+#: ../src/gui/editors/notation/NotationView.cpp:2471
+msgid "&Filter Selection"
+msgstr "&Filtrera..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:879
+msgid "&No Snap"
+msgstr "I&ngen låsning"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:884
+msgid "Snap to Bea&t"
+msgstr "Lås till &taktslag"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:888
+msgid "Snap to &Bar"
+msgstr "Lås t&ill takt"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:908
+#, c-format
+msgid "Snap to %1"
+msgstr "Fäst vid %1"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:917
+msgid "Show Instrument Parameters"
+msgstr "Visa instrumentparametrar"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:922
+#: ../src/gui/editors/notation/NotationView.cpp:1850
+msgid "Show Ch&ord Name Ruler"
+msgstr "Visa linjal med a&ckordnamn"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:926
+#: ../src/gui/editors/notation/NotationView.cpp:1858
+msgid "Show &Tempo Ruler"
+msgstr "Visa &tempolinjal"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1238
+#: ../src/gui/editors/notation/NotationView.cpp:3245
+#, c-format
+msgid ""
+"_n: 1 event selected \n"
+" %n events selected "
+msgstr ""
+" 1 händelse markerad \n"
+" %n händelser markerade "
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1241
+#: ../src/gui/editors/notation/NotationView.cpp:3247
+msgid " No selection "
+msgstr " Ingen markering "
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1348
+#: ../src/gui/editors/matrix/MatrixView.cpp:1360
+#: ../src/gui/editors/matrix/MatrixView.cpp:2079
+#: ../src/gui/editors/notation/NotationView.cpp:5869
+msgid "Quantizing..."
+msgstr "Kvantiserar..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1370
+#: ../src/gui/editors/notation/NotationView.cpp:5407
+msgid "Collapsing notes..."
+msgstr "Lägger ihop noter..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1381
+msgid "Making legato..."
+msgstr "Gör legato..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1476
+msgid "Note: %1 (%2.%3s)"
+msgstr "Not: %1 (%2,%3 s)"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1531
+#: ../src/gui/editors/notation/NotationView.cpp:7206
+msgid "Time: %1 (%2.%3s)"
+msgstr "Tid: %1 (%2,%3 s)"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1604
+#: ../src/gui/editors/notation/NotationView.cpp:4744
+#: ../src/gui/editors/notation/NotationView.cpp:4773
+msgid "Cutting selection to clipboard..."
+msgstr "Klipper ut markering till klippbordet ..."
+
+#: ../src/gui/editors/eventlist/EventView.cpp:912
+#: ../src/gui/editors/matrix/MatrixView.cpp:1636
+#: ../src/gui/editors/notation/NotationSelectionPaster.cpp:82
+msgid "Couldn't paste at this point"
+msgstr "Kunde inte klistra in på den här platsen"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1647
+#: ../src/gui/editors/notation/NotationView.cpp:4754
+msgid "Deleting selection..."
+msgstr "Tar bort markering ..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1833
+#: ../src/gui/editors/notation/NotationView.cpp:5617
+#, c-format
+msgid "Unknown note insert action %1"
+msgstr "Okänd notinfogningsåtgärd %1"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1837
+#: ../src/gui/editors/matrix/MatrixView.cpp:2857
+#: ../src/gui/editors/notation/NotationView.cpp:5621
+msgid "Inserting note"
+msgstr "Infogar not"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2091
+msgid "Unquantizing..."
+msgstr "Tar bort kvantisering ..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2120
+msgid " Grid: "
+msgstr " Rutnät: "
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2134
+msgid "Unit"
+msgstr "Enhet"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2136
+msgid "Beat"
+msgstr "Taktslag"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2138
+msgid "Bar"
+msgstr "Takt"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2159
+msgid " Velocity: "
+msgstr "Ljudstyrka:"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2170
+msgid " Quantize: "
+msgstr " Kvantisera: "
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2584
+msgid "Raising velocities..."
+msgstr "Ökar ljudstyrkor ..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2596
+msgid "Lowering velocities..."
+msgstr "Minskar ljudstyrkor ..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2611
+msgid "Set Event Velocities"
+msgstr "Ställ in händelseljudstyrkor"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2616
+msgid "Setting Velocities..."
+msgstr "Ställer in ljudstyrkor ..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2665
+msgid "Remove Triggers"
+msgstr "Ta bort utlösare"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2723
+msgid "%1 - Segment Track #%2 - %3"
+msgstr "%1 - segment spår nummer %2 - %3"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2730
+msgid "%1 - All Segments - %2"
+msgstr "%1 - alla segment - %2"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2737
+msgid ""
+"_n: %1 - 1 Segment - %2\n"
+"%1 - %n Segments - %2"
+msgstr ""
+"%1 - 1 segment - %2\n"
+"%1 - %n segment - %2"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2885
+msgid "Can't insert note: No grid duration selected"
+msgstr "Kan inte infoga not: Ingen rutnätslängd vald"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2935
+msgid " Chord "
+msgstr "Ackord"
+
+#: ../src/gui/editors/matrix/MatrixEraser.cpp:105
+msgid "Click on a note to delete it"
+msgstr "Klicka på en not för att radera den"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:89
+msgid "Filter"
+msgstr "Filter"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:245
+#: ../src/gui/editors/tempo/TempoView.cpp:117
+msgid "Time "
+msgstr "Tid "
+
+#: ../src/gui/editors/tempo/TempoView.cpp:118
+msgid "Type "
+msgstr "Typ "
+
+#: ../src/gui/editors/tempo/TempoView.cpp:119
+msgid "Value "
+msgstr "Värde "
+
+#: ../src/gui/editors/tempo/TempoView.cpp:120
+msgid "Properties "
+msgstr "Egenskaper "
+
+#: ../src/gui/editors/tempo/TempoView.cpp:208
+msgid "Common, hidden"
+msgstr "Vanlig, dold"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:210
+msgid "Hidden"
+msgstr "Dold"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:213
+msgid "Common"
+msgstr "Vanlig"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:220
+msgid "Time Signature "
+msgstr "Taktartssignatur "
+
+#: ../src/gui/editors/tempo/TempoView.cpp:245
+msgid "%1.%2%3"
+msgstr "%1,%2%3"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:255
+msgid "%1.%2%3 qpm (%4.%5%6 bpm) "
+msgstr "%1,%2%3 fjärdedelar/min (%4,%5%6 taktslag/min) "
+
+#: ../src/gui/editors/tempo/TempoView.cpp:264
+msgid "Tempo "
+msgstr "Tempo "
+
+#: ../src/gui/editors/tempo/TempoView.cpp:271
+msgid "<nothing at this filter level>"
+msgstr "<ingenting på den här filternivån>"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:463
+msgid "Delete Tempo or Time Signature"
+msgstr "Ta bort tempobeteckning eller taktartssignatur"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:602
+msgid "&Edit Item"
+msgstr "&Redigera objekt"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:834
+msgid "%1 - Tempo and Time Signature Editor"
+msgstr "%1 - Tempo- och taktartsverktyg"
+
+#: ../src/gui/editors/guitar/GuitarChordEditorDialog.cpp:43
+#, fuzzy
+msgid "Guitar Chord Editor"
+msgstr "gitarrackordeditor"
+
+#: ../src/gui/editors/guitar/GuitarChordEditorDialog.cpp:51
+#, fuzzy
+msgid "Start fret"
+msgstr "Första takten"
+
+#: ../src/gui/editors/guitar/GuitarChordEditorDialog.cpp:58
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:51
+msgid "Root"
+msgstr ""
+
+#: ../src/gui/editors/guitar/GuitarChordEditorDialog.cpp:62
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:55
+#, fuzzy
+msgid "Extension"
+msgstr "Version"
+
+#: ../src/gui/editors/guitar/Fingering.cpp:118
+msgid "couldn't parse fingering '%1' in '%2'"
+msgstr ""
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:45
+#, fuzzy
+msgid "Guitar Chord Selector"
+msgstr "Ackordväljare"
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:64
+msgid "beginner"
+msgstr ""
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:65
+#, fuzzy
+msgid "common"
+msgstr "Vanlig"
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:66
+#, fuzzy
+msgid "all"
+msgstr "Alla"
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:86
+#, fuzzy
+msgid "Fingerings"
+msgstr "&Fingersättningar"
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:419
+#, fuzzy
+msgid "couldn't open file '%1'"
+msgstr "Kan inte öppna filen '%1'"
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:428
+#, c-format
+msgid "couldn't parse chord dictionnary : %1"
+msgstr ""
+
+#: ../src/gui/editors/notation/NoteFontViewer.cpp:87
+#, c-format
+msgid "Note Font Viewer: %1"
+msgstr "Notteckensnittvisning: %1"
+
+#: ../src/gui/editors/notation/NoteFontViewer.cpp:93
+msgid " Component: "
+msgstr " Komponent: "
+
+#: ../src/gui/editors/notation/NoteFontViewer.cpp:101
+msgid " View: "
+msgstr " Vy: "
+
+#: ../src/gui/editors/notation/NoteFontViewer.cpp:104
+msgid "Glyphs"
+msgstr "Glyfer"
+
+#: ../src/gui/editors/notation/NoteFontViewer.cpp:105
+msgid "Codes"
+msgstr "Koder"
+
+#: ../src/gui/editors/notation/NoteFontViewer.cpp:107
+msgid " Page: "
+msgstr " Sida: "
+
+#: ../src/gui/editors/notation/ClefInserter.cpp:64
+#: ../src/gui/editors/notation/GuitarChordInserter.cpp:71
+#: ../src/gui/editors/notation/RestInserter.cpp:79
+#: ../src/gui/editors/notation/TextInserter.cpp:68
+msgid "Switch to Inserting Notes"
+msgstr "Byt till att infoga noter"
+
+#: ../src/gui/editors/notation/NotationView.cpp:522
+#, fuzzy
+msgid "Close track headers"
+msgstr "Ändra spårnamn"
+
+#: ../src/gui/editors/notation/NotationView.cpp:917
+msgid "Preparing to print..."
+msgstr "Förbereder utskrift ..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:1516
+msgid "Note &Font"
+msgstr "Not&teckensnitt"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1539
+msgid "Si&ze"
+msgstr "St&orlek"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1545
+#, fuzzy
+msgid "Show Track Headers"
+msgstr "Visa sp&årnamn"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1550
+msgid "S&pacing"
+msgstr "&Avstånd"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1572
+msgid "Du&ration Factor"
+msgstr "&Längdfaktor"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1598
+msgid "Note &Style"
+msgstr "N&othuvudstil"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1624
+msgid "Insert Rest"
+msgstr "Infoga paus"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1628
+msgid "Switch from Note to Rest"
+msgstr "Byt not mot paus"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1633
+msgid "Switch from Rest to Note"
+msgstr "Byt paus mot not"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1690
+msgid "No accidental"
+msgstr "Inga tillfälliga förtecken"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1691
+msgid "Follow previous accidental"
+msgstr "Följ föregående tillfälliga förtecken"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1692
+msgid "Sharp"
+msgstr "Korsförtecken"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1693
+msgid "Flat"
+msgstr "B-förtecken"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1694
+msgid "Natural"
+msgstr "Återställningstecken"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1695
+msgid "Double sharp"
+msgstr "Dubbelkorsförtecken"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1696
+msgid "Double flat"
+msgstr "Dubbel-b-förtecken"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1717
+msgid "&Treble Clef"
+msgstr "&Diskantklav"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1724
+msgid "&Alto Clef"
+msgstr "&Altklav"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1731
+msgid "Te&nor Clef"
+msgstr "Te&norklav"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1738
+msgid "&Bass Clef"
+msgstr "&Basklav"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1745
+msgid "&Text"
+msgstr "Te&xt"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1751
+#, fuzzy
+msgid "&Guitar Chord"
+msgstr "gitarrackordeditor"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1784
+msgid "Select from Sta&rt"
+msgstr "M&arkera från början"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1788
+msgid "Select to &End"
+msgstr "Markera till &slutet"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1792
+msgid "Select Whole St&aff"
+msgstr "Markera hela &notsystemet"
+
+#: ../src/commands/edit/CutAndCloseCommand.h:53
+#: ../src/gui/editors/notation/NotationView.cpp:1796
+msgid "C&ut and Close"
+msgstr "Klipp &ut och dra tillbaka"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1800
+msgid "Pa&ste..."
+msgstr "Klistra &in ..."
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:122
+#: ../src/gui/editors/notation/NotationView.cpp:1808
+msgid "Move to Staff Above"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:126
+#: ../src/gui/editors/notation/NotationView.cpp:1812
+msgid "Move to Staff Below"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1826
+msgid "&Linear Layout"
+msgstr "Hor&isontell utläggning"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1835
+msgid "&Continuous Page Layout"
+msgstr "&Vertikal utläggning"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1844
+msgid "&Multiple Page Layout"
+msgstr "&Sidutläggning"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1854
+msgid "Show Ra&w Note Ruler"
+msgstr "Visa linjal för &obehandlade noter"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1862
+msgid "Show &Annotations"
+msgstr "Visa ant&eckningar"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1866
+msgid "Show Lily&Pond Directives"
+msgstr "Visa Lily&pond-direktiv"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1870
+msgid "Open L&yric Editor"
+msgstr "Öppna &sångtexteditor"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1912
+msgid "Trip&let Insert Mode"
+msgstr "Infogningsläge &för trioler"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1926
+#, fuzzy
+msgid "Grace Insert Mode"
+msgstr "Infogningsläge &för trioler"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2180
+msgid "&Dump selected events to stderr"
+msgstr "&Skicka markerade händelser till standardfelutmatning"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2248
+msgid "Ma&ke Ornament..."
+msgstr "S&kapa ornament ..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:2252
+msgid "Trigger &Ornament..."
+msgstr "Använd &ornament ..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:2256
+msgid "Remove Ornament..."
+msgstr "Ta bort ornament ..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:2261
+msgid "&None"
+msgstr "I&ngen"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2289
+#, fuzzy
+msgid "Convert Notation For..."
+msgstr "Konverterar ljudfil ..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:2298
+msgid "Show &Notes Toolbar"
+msgstr "Visa notverkt&ygslist"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2299
+msgid "Show &Rests Toolbar"
+msgstr "Visa &pausverktygslist"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2300
+msgid "Show &Accidentals Toolbar"
+msgstr "Visa verktygslist med tillfälliga &förtecken"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2301
+msgid "Show Cle&fs Toolbar"
+msgstr "V&isa klavverktygslist"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2303
+msgid "Show &Marks Toolbar"
+msgstr "Visa verktygslist med orna&ment och föredragsbeteckningar"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2305
+msgid "Show &Group Toolbar"
+msgstr "Visa &gruppverktygslist"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2307
+msgid "Show &Layout Toolbar"
+msgstr "Visa ut&läggningsverktygslist"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2311
+msgid "Show M&eta Toolbar"
+msgstr "Vi&sa metaverktygslist"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2373
+msgid "Cursor &Up Staff"
+msgstr "Markör upp ett n&otsystem"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2377
+msgid "Cursor &Down Staff"
+msgstr "Markör &ner ett notsystem"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2381
+msgid "Cursor Pre&vious Segment"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2385
+#, fuzzy
+msgid "Cursor Ne&xt Segment"
+msgstr "Skapa segment"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2475
+msgid "Push &Left"
+msgstr "Knuffa åt &vänster"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2479
+msgid "Push &Right"
+msgstr "Knuffa åt &höger"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2483
+msgid "Push &Up"
+msgstr "Knuffa &uppåt"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2487
+msgid "Push &Down"
+msgstr "Knuffa &neråt"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2491
+#, fuzzy
+msgid "&Restore Positions"
+msgstr "Återställ beräknade positioner"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2495
+msgid "Make &Invisible"
+msgstr "Gör &osynlig"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2499
+msgid "Make &Visible"
+msgstr "Gör &synlig"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2503
+msgid "Toggle Dot"
+msgstr "Växla punkt"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2507
+#: ../src/gui/editors/notation/NotationView.cpp:2511
+msgid "Add Dot"
+msgstr "Lägg till punkt"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2570
+#, c-format
+msgid ""
+"_n: 1 pixel\n"
+"%n pixels"
+msgstr ""
+"1 bildpunkt\n"
+"%n bildpunkter"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2619
+msgid " Font: "
+msgstr " Teckensnitt: "
+
+#: ../src/gui/editors/notation/NotationView.cpp:2647
+msgid "Unknown font \"%1\", using default"
+msgstr "Okänt teckensnitt \"%1\", använder förval"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2655
+msgid " Size: "
+msgstr " Storlek: "
+
+#: ../src/gui/editors/notation/NotationView.cpp:2677
+msgid " Spacing: "
+msgstr " Avstånd: "
+
+#: ../src/gui/editors/notation/NotationView.cpp:2993
+#: ../src/gui/editors/notation/NotationView.cpp:3818
+msgid " Ready."
+msgstr " Klar."
+
+#: ../src/gui/editors/notation/NotationView.cpp:2998
+msgid "Laying out score..."
+msgstr "Lägger ut partitur ..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:3011
+msgid "Laying out staff %1..."
+msgstr "Lägger ut notsystem %1 ..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:3020
+msgid "Reconciling staffs..."
+msgstr "Gör notsystem förenliga ..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:3885
+msgid "Sizing and allocating canvas..."
+msgstr "Ställer in storlek och allokerar duk ..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:4050
+msgid "note"
+msgstr "not"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4050
+msgid "rest"
+msgstr "paus"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4211
+msgid "%1 - Segment Track #%2 - Notation"
+msgstr "%1 - segment spår nummer %2 - notskrift"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4217
+msgid "%1 - All Segments - Notation"
+msgstr "%1 - alla segment - notskrift"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4222
+msgid ""
+"_n: %1 - Segment - Notation\n"
+"%1 - %n Segments - Notation"
+msgstr ""
+"%1 - Segment - Notation\n"
+"%1 - %n Segment - Notation"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4243
+#, fuzzy
+msgid "Grace"
+msgstr "Grave"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4247
+#: ../src/gui/editors/notation/NotationView.cpp:4251
+#: ../src/gui/editors/notation/NotationView.cpp:4255
+#, fuzzy
+msgid "%1 %2"
+msgstr "%1 (%2)"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4271
+msgid "Hidden annotations"
+msgstr "Dolda anteckningar"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4293
+msgid "Hidden LilyPond directives"
+msgstr "Dolda Lilypond-direktiv"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4326
+#, c-format
+msgid "Unknown spacing action %1"
+msgstr "Okänd avståndsåtgärd %1"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4384
+#, c-format
+msgid "Unknown proportion action %1"
+msgstr "Okänd förhållandeåtgärd %1"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4431
+#, c-format
+msgid "Unknown font action %1"
+msgstr "Okänd teckenåtgärd %1"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4449
+#, c-format
+msgid "Unknown font size %1"
+msgstr "Okänd teckenstorlek %1"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4453
+#, c-format
+msgid "Unknown font size action %1"
+msgstr "Okänd teckenstorleksåtgärd %1"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4780
+#, fuzzy
+msgid ""
+"The Restricted paste type requires enough empty space (containing only "
+"rests) at the paste position to hold all of the events to be pasted.\n"
+"Not enough space was found.\n"
+"If you want to paste anyway, consider using one of the other paste types "
+"from the \"Paste...\" option on the Edit menu. You can also change the "
+"default paste type to something other than Restricted if you wish."
+msgstr ""
+"Den begränsade typen av inklistring kräver tillräckligt\n"
+"med tomt utrymme (som bara innehåller pauser) på\n"
+"inklistringsplatsen för att få plats med alla händelser\n"
+"som ska klistras in.\n"
+"Tillräckligt med utrymme hittades inte.\n"
+"Om du ändå vill klistra in, fundera på att använda en av\n"
+"de andra inklistringstyperna under alternativet \"Klistra in...\"\n"
+"i menyn Redigera. Du kan också ändra förvald inklistringstyp\n"
+"till något annat än Begränsad om du vill."
+
+#: ../src/gui/editors/notation/NotationView.cpp:4800
+msgid "Can't paste multiple Segments into one"
+msgstr "Kan inte klistra in flera segment i ett"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4828
+#: ../src/gui/editors/notation/NotationView.cpp:4877
+msgid "Couldn't paste at this point."
+msgstr "Kunde inte klistra in på den här platsen."
+
+#: ../src/gui/editors/notation/NotationView.cpp:4896
+#, fuzzy
+msgid "Move Events to Staff Above"
+msgstr "&Flytta händelser till annat segment"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4924
+#, fuzzy
+msgid "Move Events to Staff Below"
+msgstr "&Flytta händelser till annat segment"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5036
+msgid "Pushing selection left..."
+msgstr "Knuffar markering åt vänster ..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5047
+msgid "Pushing selection right..."
+msgstr "Knuffar markering åt höger ..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5058
+msgid "Pushing selection up..."
+msgstr "Knuffar markering åt uppåt ..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5069
+msgid "Pushing selection down..."
+msgstr "Knuffar markering åt neråt ..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5080
+msgid "Restoring computed positions..."
+msgstr "Återställer beräknade positioner ..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5089
+msgid "Making visible..."
+msgstr "Gör synligt ..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5098
+msgid "Making invisible..."
+msgstr "Gör osynligt ..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5185
+msgid "Beaming group..."
+msgstr "Lägger till balkar för grupp ..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5195
+msgid "Auto-beaming selection..."
+msgstr "Val av automatiska balkar ..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5205
+msgid "Breaking groups..."
+msgstr "Delar upp grupper ..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5293
+msgid "Untupleting..."
+msgstr "Tar bort annandelning ..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5301
+msgid "Adding slur..."
+msgstr "Lägger till legatobåge ..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5302
+msgid "slur"
+msgstr "legatobåge"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5307
+msgid "Adding phrasing slur..."
+msgstr "Lägger till frasbåge ..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5308
+msgid "phrasing slur"
+msgstr "frasbåge"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5313
+msgid "Adding glissando..."
+msgstr "Lägger till glissando ..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5314
+msgid "glissando"
+msgstr "glissando"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5319
+msgid "Adding crescendo..."
+msgstr "Lägger till crescendo ..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5320
+#: ../src/gui/editors/notation/NotationView.cpp:5326
+msgid "dynamic"
+msgstr "dynamisk"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5325
+msgid "Adding decrescendo..."
+msgstr "Lägger till diminuendo ..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5331
+#: ../src/gui/editors/notation/NotationView.cpp:5337
+#: ../src/gui/editors/notation/NotationView.cpp:5343
+#: ../src/gui/editors/notation/NotationView.cpp:5349
+msgid "Adding octave..."
+msgstr "Lägger till oktav ..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5332
+#: ../src/gui/editors/notation/NotationView.cpp:5338
+#: ../src/gui/editors/notation/NotationView.cpp:5344
+#: ../src/gui/editors/notation/NotationView.cpp:5350
+msgid "ottava"
+msgstr "ottava"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5366
+msgid "Can't add overlapping %1 indications"
+msgstr "Kan inte lägga till överlappande %1-indikeringar"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5375
+msgid "Making chord..."
+msgstr "Skapar ackord ..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5387
+msgid "Normalizing rests..."
+msgstr "Normaliserar pauser ..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5397
+msgid "Collapsing rests..."
+msgstr "Sammanfogar pauser ..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5417
+msgid "Tying notes..."
+msgstr "Binder noter ..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5427
+msgid "Untying notes..."
+msgstr "Tar bort bindning från noter ..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5437
+msgid "Making notes viable..."
+msgstr "Gör noter gångbara ..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5447
+msgid "Removing counterpoint..."
+msgstr "Tar bort kontrapunkt ..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5457
+msgid "Pointing stems up..."
+msgstr "Riktar skaft uppåt ..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5467
+msgid "Pointing stems down..."
+msgstr "Riktar skaft neråt ..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5478
+msgid "Restoring computed stem directions..."
+msgstr "Återställer beräknade skaftriktningar ..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5488
+#: ../src/gui/editors/notation/NotationView.cpp:5498
+msgid "Positioning slurs..."
+msgstr "Placerar legatobågar ..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5509
+msgid "Restoring slur positions..."
+msgstr "Återställer positioner för legatobågar ..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5519
+#: ../src/gui/editors/notation/NotationView.cpp:5529
+#, fuzzy
+msgid "Positioning ties..."
+msgstr "Placerar legatobågar ..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5540
+#, fuzzy
+msgid "Restoring tie positions..."
+msgstr "Återställer beräknade positioner ..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5550
+msgid "Fixing notation quantization..."
+msgstr "Bestämmer kvantisering ..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5560
+msgid "Removing notation quantization..."
+msgstr "Tar bort kvantisering ..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5577
+msgid "Changing to %1 style..."
+msgstr "Ändrar till stilen %1 ..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5585
+#, c-format
+msgid "Unknown style action %1"
+msgstr "Okänd stilåtgärd %1"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5598
+#: ../src/gui/editors/notation/NotationView.cpp:5639
+#: ../src/gui/editors/notation/NotationView.cpp:5695
+msgid "No note duration selected"
+msgstr "Inget notvärde valt"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5660
+msgid "No rest duration selected"
+msgstr "Inget pausvärde valt"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5746
+msgid "No note or rest duration selected"
+msgstr "Inget not- eller pausvärde valt"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5757
+#: ../src/gui/editors/notation/NotationView.cpp:5768
+#: ../src/gui/editors/notation/NotationView.cpp:5779
+#: ../src/gui/editors/notation/NotationView.cpp:5790
+#: ../src/gui/editors/notation/NotationView.cpp:5801
+#: ../src/gui/editors/notation/NotationView.cpp:5812
+#: ../src/gui/editors/notation/NotationView.cpp:5823
+msgid "Forcing accidentals..."
+msgstr "Tvingar tillfälliga förtecken ..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5834
+msgid "Restoring accidentals..."
+msgstr "Återställer tillfälliga förtecken ..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5845
+msgid "Showing cautionary accidentals..."
+msgstr "Visar förtydligande förtecken ..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5855
+msgid "Cancelling cautionary accidentals..."
+msgstr "Tar bort förtydligande förtecken ..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5884
+msgid "Interpreting selection..."
+msgstr "Tolkar markering ..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5896
+msgid "Setting note durations..."
+msgstr "Ställer in notvärden ..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5904
+#: ../src/gui/editors/notation/NotationView.cpp:5912
+msgid "Adding dot..."
+msgstr "Lägger till punkt ..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5934
+msgid "Text: "
+msgstr "Text: "
+
+#: ../src/gui/editors/notation/NotationView.cpp:5948
+msgid "Fingering: "
+msgstr "Fingersättning: "
+
+#: ../src/gui/editors/notation/NotationView.cpp:6036
+msgid "Ornament track %1 bar %2"
+msgstr "Ornament spår %1 takt %2"
+
+#: ../src/gui/editors/notation/NotationView.cpp:6038
+#, c-format
+msgid "Ornament bar %1"
+msgstr "Ornament takt %1"
+
+#: ../src/gui/editors/notation/NotationView.cpp:6098
+msgid "Remove Ornaments"
+msgstr "Ta bort ornament"
+
+#: ../src/gui/editors/notation/NotationView.cpp:6145
+msgid "Estimated key signature shown"
+msgstr "Uppskattad tonartssignatur visas"
+
+#: ../src/gui/editors/notation/NotationStaff.cpp:1249
+#: ../src/gui/editors/notation/NotationView.cpp:6202
+msgid "Sustain"
+msgstr "Förlängning"
+
+#: ../src/gui/editors/notation/NotationView.cpp:6218
+msgid ""
+"There is no sustain controller defined for this device.\n"
+"Please ensure the device is configured correctly in the Manage MIDI Devices "
+"dialog in the main window."
+msgstr ""
+"Det finns igen förlängningseffekt definierad för enheten.\n"
+"Försäkra dig om att enheten är riktigt inställd i dialogrutan Hantera MIDI-"
+"enheter i huvudfönstret."
+
+#: ../src/gui/editors/notation/NotationView.cpp:7250
+msgid "Can't insert note: No note duration selected"
+msgstr "Kan inte infoga not: Inget notvärde valt"
+
+#: ../src/gui/editors/notation/NotationEraser.cpp:61
+#: ../src/gui/editors/notation/NotationSelector.cpp:83
+msgid "Switch to Insert Tool"
+msgstr "Byt till infogningsverktyg"
+
+#: ../src/gui/editors/notation/NotePixmapFactory.cpp:2303
+#: ../src/gui/editors/notation/NotePixmapFactory.cpp:2347
+msgid "..."
+msgstr "..."
+
+#: ../src/gui/editors/notation/NoteFontFactory.cpp:200
+msgid "Can't obtain a default font -- no fonts found"
+msgstr "Kan inte hämta ett standardteckensnitt; inga teckensnitt hittades."
+
+#: ../src/gui/editors/notation/NoteFontMap.cpp:52
+#: ../src/gui/general/PresetGroup.cpp:49
+msgid "unknown error"
+msgstr "okänt fel"
+
+#: ../src/gui/editors/notation/NoteFontMap.cpp:78
+msgid "Can't open font mapping file %1 or %2"
+msgstr "Kan inte öppna teckensnittskartfilen %1 eller %2"
+
+#: ../src/gui/editors/notation/NoteFontMap.cpp:82
+#, c-format
+msgid "Can't open font mapping file %1"
+msgstr "Kan inte öppna teckensnittskartfilen %1"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:52
+msgid "%1-dotted-%2"
+msgstr "%1-punkterad-%2"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:54
+msgid "%1-dotted %2"
+msgstr "%1-punkterad %2"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:57
+#, c-format
+msgid "dotted-%1"
+msgstr "punkterad-%1"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:59
+#, c-format
+msgid "dotted %1"
+msgstr "punkterad %1"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:83
+msgid "sixty-fourth note"
+msgstr "sextiofjärdedelsnot"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:83
+msgid "thirty-second note"
+msgstr "trettioandradelsnot"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:84
+msgid "sixteenth note"
+msgstr "sextondedelsnot"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:84
+msgid "eighth note"
+msgstr "åttondedelsnot"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:85
+msgid "quarter note"
+msgstr "fjärdedelsnot"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:85
+msgid "half note"
+msgstr "halvnot"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:86
+msgid "whole note"
+msgstr "helnot"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:86
+msgid "double whole note"
+msgstr "brevis"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:89
+msgid "sixty-fourth notes"
+msgstr "sextiofjärdedelsnoter"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:89
+msgid "thirty-second notes"
+msgstr "trettioandradelsnoter"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:90
+msgid "sixteenth notes"
+msgstr "sextondedelsnoter"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:90
+msgid "eighth notes"
+msgstr "åttondedelsnoter"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:91
+msgid "quarter notes"
+msgstr "fjärdedelsnoter"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:91
+msgid "half notes"
+msgstr "halvnoter"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:92
+msgid "whole notes"
+msgstr "helnoter"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:92
+msgid "double whole notes"
+msgstr "brevisnoter"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:96
+#: ../src/gui/editors/notation/NotationStrings.cpp:154
+msgid "%1 triplets"
+msgstr "%1 trioler"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:100
+#: ../src/gui/editors/notation/NotationStrings.cpp:158
+msgid "%1 triplet"
+msgstr "%1 triol"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:143
+msgid "64th"
+msgstr "sextiofjärdedel"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:143
+msgid "32nd"
+msgstr "trettioandradel"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:143
+msgid "16th"
+msgstr "sextondedel"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:143
+msgid "8th"
+msgstr "åttondedel"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:144
+msgid "quarter"
+msgstr "fjärdedel"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:144
+msgid "half"
+msgstr "halv"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:144
+msgid "whole"
+msgstr "hel"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:145
+msgid "double whole"
+msgstr "brevispaus"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:148
+msgid "64ths"
+msgstr "sextiofjärdedelar"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:148
+msgid "32nds"
+msgstr "trettioandradelar"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:148
+msgid "16ths"
+msgstr "sextondedelar"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:148
+msgid "8ths"
+msgstr "åttondedelar"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:149
+msgid "quarters"
+msgstr "fjärdedelar"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:149
+msgid "halves"
+msgstr "halva"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:149
+msgid "wholes"
+msgstr "hela"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:150
+msgid "double wholes"
+msgstr "brevis"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:278
+msgid "%1 ticks"
+msgstr "%1 tick"
+
+#: ../src/gui/editors/notation/FontViewFrame.cpp:100
+#, c-format
+msgid "Error: Unable to match font name %1"
+msgstr "Fel: Kan inte hitta passande teckensnitt för namnet %1"
+
+#: ../src/gui/editors/notation/FontViewFrame.cpp:108
+msgid "Warning: No good match for font name %1 (best is %2)"
+msgstr "Varning: Ingen bra motsvarighet för teckensnittsnamnet %1 (%2 är bäst)"
+
+#: ../src/gui/editors/notation/FontViewFrame.cpp:116
+#, c-format
+msgid "Error: Unable to open best-match font %1"
+msgstr "Fel: Kan inte öppna teckensnitt %1 som passar bäst"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:113
+#, fuzzy
+msgid "Track %1 : \"%2\""
+msgstr "[ Spår %1 - %2 ]"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:119
+#, fuzzy, c-format
+msgid ""
+"\n"
+"Notate for: %1"
+msgstr "Notteckensnittvisning: %1"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:121
+#, fuzzy
+msgid "normal"
+msgstr "Normal"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:124
+#, fuzzy
+msgid "small"
+msgstr "Alla"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:127
+msgid "tiny"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:131
+#, fuzzy
+msgid "--"
+msgstr "---"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:156
+msgid ""
+"\n"
+"Size: %1, Bracket: %2 "
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:183
+msgid ""
+"\n"
+"bars [%1-%2] in %3 (tr=%4) : \"%5\""
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:190
+msgid ""
+"\n"
+"bars [%1-%2] (tr=%3) : \"%4\""
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:240
+#, fuzzy
+msgid "C#"
+msgstr "Ciss%1"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:242
+msgid "Eb"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:245
+#, fuzzy
+msgid "F#"
+msgstr "Fiss%1"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:247
+#, fuzzy
+msgid "G#"
+msgstr "Giss%1"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:249
+msgid "Bb"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:352
+#, fuzzy
+msgid "%1: %2"
+msgstr "%1 (%2)"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:355
+#, fuzzy, c-format
+msgid " in %1"
+msgstr "In %1"
+
+#: ../src/gui/editors/notation/NotationStaff.cpp:452
+msgid "Rendering staff %1..."
+msgstr "Ritar notlinjesystem %1 ..."
+
+#: ../src/gui/editors/notation/NotationStaff.cpp:515
+msgid "Rendering notes on staff %1..."
+msgstr "Ritar noter i notlinjesystem %1 ..."
+
+#: ../src/gui/editors/notation/NotationStaff.cpp:583
+msgid "Positioning staff %1..."
+msgstr "Placerar notlinjesystem %1 ..."
+
+#: ../src/gui/editors/notation/NotationSelectionPaster.cpp:85
+msgid "Ready."
+msgstr "Klar."
+
+#: ../src/gui/editors/notation/RestInserter.cpp:62
+msgid "Dotted rest"
+msgstr "Punkterad paus"
+
+#: ../src/gui/editors/notation/NoteStyleFileReader.cpp:57
+#, c-format
+msgid "Can't open style file %1"
+msgstr "Kan inte öppna stilfil %1"
+
+#: ../src/gui/editors/notation/NoteStyleFileReader.cpp:92
+msgid "type is a required attribute of note"
+msgstr "typ är en nödvändig notegenskap"
+
+#: ../src/gui/editors/notation/NoteStyleFileReader.cpp:101
+#, c-format
+msgid "Unrecognised note name %1"
+msgstr "Tonnamnet %1 känns inte igen"
+
+#: ../src/gui/editors/notation/NoteStyleFileReader.cpp:108
+msgid "global element must precede note elements"
+msgstr "globala element måste stå före notelement"
+
+#: ../src/gui/editors/notation/NoteStyleFileReader.cpp:137
+msgid ""
+"global and note elements may have shape or charname attribute, but not both"
+msgstr ""
+"globala element och notelement kan ha egenskapen form eller teckennamn, men "
+"inte båda"
+
+#: ../src/gui/editors/notation/NotationVLayout.cpp:493
+msgid ""
+"Spanned note at %1 has no HEIGHT_ON_STAFF property!\n"
+"This is a bug (the program would previously have crashed by now)"
+msgstr ""
+"Överlappande not vid %1 har ingen HEIGHT_ON_STAFF-egenskap!\n"
+"Detta är ett programfel (tidigare skulle programmet redan ha kraschat)."
+
+#: ../src/gui/editors/notation/NoteInserter.cpp:82
+msgid "Auto-Beam when appropriate"
+msgstr "Lägg automatiskt till balkar om lämpligt"
+
+#: ../src/gui/editors/notation/NoteInserter.cpp:103
+msgid "Dotted note"
+msgstr "Punkterad not"
+
+#: ../src/gui/editors/notation/NoteInserter.cpp:120
+msgid "Switch to Inserting Rests"
+msgstr "Byt till infoga pauser"
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:98
+msgid "Collapse Rests"
+msgstr "Lägg ihop pauser"
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:102
+msgid "Respell as Flat"
+msgstr "B-förtecken"
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:106
+msgid "Respell as Sharp"
+msgstr "Korsförtecken"
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:110
+msgid "Respell as Natural"
+msgstr "Återställningstecken"
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:114
+msgid "Collapse Notes"
+msgstr "Lägg ihop noter"
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:130
+msgid "Make Invisible"
+msgstr "Gör osynlig"
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:134
+msgid "Make Visible"
+msgstr "Gör synlig"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:129
+msgid "Event filters"
+msgstr "Händelsefilter"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:138
+msgid "Rest"
+msgstr "Paus"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:139
+msgid "Indication"
+msgstr "Indikering"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:141
+msgid "Other"
+msgstr "Annan"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:161
+msgid "Triggered Segment Properties"
+msgstr "Egenskaper för utlösande segment"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:166
+msgid "Label: "
+msgstr "Namn: "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:176
+msgid "Base pitch: "
+msgstr "Grundtonhöjd: "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:183
+msgid "Base velocity: "
+msgstr "Grundljudstyrka: "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:246
+msgid "Duration "
+msgstr "Notvärde "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:247
+msgid "Event Type "
+msgstr "Händelsetyp "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:248
+msgid "Pitch "
+msgstr "Tonhöjd "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:249
+msgid "Velocity "
+msgstr "Ljudstyrka "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:250
+msgid "Type (Data1) "
+msgstr "Typ (data1) "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:251
+msgid "Value (Data2) "
+msgstr "Värde (data2)"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:461
+msgid "(group %1) "
+msgstr "(grupp %1) "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:519
+msgid "<no events at this filter level>"
+msgstr "<inga händelser på den här filternivån>"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:521
+msgid "<no events>"
+msgstr "<inga händelser>"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:696
+msgid "Segment label"
+msgstr "Segmentnamn"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:696
+msgid "Label:"
+msgstr "Namn:"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1123
+msgid "&Insert Event"
+msgstr "&Infoga händelse"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1130
+msgid "&Delete Event"
+msgstr "Ta &bort händelse"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1137
+msgid "&Edit Event"
+msgstr "&Redigera händelse"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1144
+msgid "&Advanced Event Editor"
+msgstr "&Avancerad händelseeditor"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1518
+msgid "Open in Event Editor"
+msgstr "Öppna i händelseeditor"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1519
+msgid "Open in Expert Event Editor"
+msgstr "Öppna i experthändelseeditor"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1577
+msgid "%1 - Triggered Segment: %2"
+msgstr "%1 - utlösande segment: %2"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1592
+msgid "%1 - Segment Track #%2 - Event List"
+msgstr "%1 - segment spår nummer %2 - händelselista"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1598
+msgid "%1 - %2 Segments - Event List"
+msgstr "%1 - %2 segment - händelselista"
+
+#: ../src/gui/rulers/TempoRuler.cpp:131
+msgid "Insert Tempo Change at Playback Position"
+msgstr "Tempo"
+
+#: ../src/gui/rulers/TempoRuler.cpp:136
+msgid "Delete Tempo Change"
+msgstr "Tempo"
+
+#: ../src/gui/rulers/TempoRuler.cpp:140
+msgid "Ramp Tempo to Next Tempo"
+msgstr "Mjuk tempoövergång"
+
+#: ../src/gui/rulers/TempoRuler.cpp:144
+msgid "Un-Ramp Tempo"
+msgstr "Ta bort mjuk tempoövergång"
+
+#: ../src/gui/rulers/TempoRuler.cpp:149
+msgid "Edit Tempo..."
+msgstr "Redigera tempo ..."
+
+#: ../src/gui/rulers/TempoRuler.cpp:153
+msgid "Edit Time Signature..."
+msgstr "Redigera taktartssignatur ..."
+
+#: ../src/gui/rulers/TempoRuler.cpp:588
+msgid "%1.%2%3 (%4.%5%6 bpm)"
+msgstr "%1,%2%3 (%4,%5%6 taktslag/min)"
+
+#: ../src/gui/rulers/TempoRuler.cpp:596
+msgid "%1.%2%3 bpm"
+msgstr "%1,%2%3 taktslag/min"
+
+#: ../src/gui/rulers/TempoRuler.cpp:604
+msgid "%1 - %2.%3%4"
+msgstr "%1 - %2,%3%4"
+
+#: ../src/gui/rulers/ControlRulerEventInsertCommand.cpp:36
+msgid "Insert Controller Event"
+msgstr "Infoga effekthändelse"
+
+#: ../src/gui/rulers/ControlChangeCommand.cpp:35
+msgid "Control Change"
+msgstr "Styrändring"
+
+#: ../src/gui/rulers/PropertyViewRuler.cpp:72
+msgid "%1 controller"
+msgstr "%1 effekt"
+
+#: ../src/gui/rulers/RawNoteRuler.cpp:453
+msgid "Track #%1, Segment \"%2\" (runtime id %3)"
+msgstr ""
+
+#: ../src/gui/rulers/MarkerRuler.cpp:100
+#, fuzzy
+msgid "Insert Marker"
+msgstr "Infoga omfång"
+
+#: ../src/gui/rulers/MarkerRuler.cpp:104
+#, fuzzy
+msgid "Insert Marker at Playback Position"
+msgstr "Tempo"
+
+#: ../src/gui/rulers/MarkerRuler.cpp:109
+#, fuzzy
+msgid "Delete Marker"
+msgstr "Ta bort en markering"
+
+#: ../src/gui/rulers/MarkerRuler.cpp:114
+#, fuzzy
+msgid "Edit Marker..."
+msgstr "&Redigera markeringar ..."
+
+#: ../src/gui/rulers/MarkerRuler.cpp:119
+msgid ""
+"Click on a marker to move the playback pointer.\n"
+"Shift-click to set a range between markers.\n"
+"Double-click to open the marker editor."
+msgstr ""
+
+#: ../src/gui/rulers/ChordNameRuler.cpp:97
+msgid ""
+"Chord name ruler.\n"
+"Turn it on and off from the Settings->Rulers menu."
+msgstr ""
+"Linjal för ackordnamn.\n"
+"Visa eller dölj den i menyn Inställningar -> Linjaler."
+
+#: ../src/gui/rulers/ControlRulerEventEraseCommand.cpp:37
+msgid "Erase Controller Event(s)"
+msgstr "Ta bort effekthändelse"
+
+#: ../src/gui/general/EditView.cpp:901
+#: ../src/gui/rulers/ControllerEventsRuler.cpp:188
+msgid "Unsupported Event Type"
+msgstr "Händelsetyp som inte stöds"
+
+#: ../src/gui/rulers/ControllerEventsRuler.cpp:203
+msgid "Controller Events"
+msgstr "Effekthändelser"
+
+#: ../src/gui/rulers/ControllerEventsRuler.cpp:278
+msgid "Controller Event Number"
+msgstr "Nummer på effekthändelse"
+
+#: ../src/gui/rulers/ControllerEventsRuler.cpp:471
+msgid "Add line of controllers"
+msgstr "Lägg till rad med effektkontroller"
+
+#: ../src/gui/rulers/LoopRuler.cpp:89
+#, fuzzy
+msgid ""
+"Click and drag to move the playback pointer.\n"
+"Shift-click and drag to set a range for looping or editing.\n"
+"Shift-click to clear the loop or range.\n"
+"Double-click to start playback."
+msgstr ""
+"Vänsterklicka på markeringen för att positionera uppspelningsvisaren.\n"
+"Skift-dra för att ställa in en upprepning.\n"
+"Skift-klicka (eller klicka på spelkontrollfönstrets upprepningsknapp) för "
+"att ta bort upprepning."
+
+#: ../src/gui/general/EditViewBase.cpp:228
+msgid "Set Segment Start Time..."
+msgstr "Starttid för segment ..."
+
+#: ../src/gui/general/EditViewBase.cpp:232
+msgid "Set Segment Duration..."
+msgstr "Längd för segment ..."
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:56
+msgid "Load track parameters preset"
+msgstr "Ladda förinställningar för spårparametrar"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:62
+#, fuzzy
+msgid "Convert notation for..."
+msgstr "Konverterar ljudfil ..."
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:86
+msgid "Select preset track parameters for:"
+msgstr "Ange förinställning av spårparametrar för:"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:87
+msgid "Create appropriate notation for:"
+msgstr ""
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:89
+msgid "Category"
+msgstr "Kategori"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:95
+msgid "Player Ability"
+msgstr "Spelskicklighet"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:97
+msgid "Amateur"
+msgstr "Amatör"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:98
+msgid "Professional"
+msgstr "Professionell"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:104
+#, fuzzy
+msgid "Only selected segments"
+msgstr "Markerade segment"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:106
+#, fuzzy
+msgid "All segments in this track"
+msgstr "I alla system"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:111
+#, fuzzy
+msgid "Only for new segments"
+msgstr "Sångtext för segmentet"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:113
+#, fuzzy
+msgid "Convert existing segments"
+msgstr "Skapa segment"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:39
+#, c-format
+msgid "C%1"
+msgstr "C%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:39
+#, c-format
+msgid "C#%1"
+msgstr "Ciss%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:39
+#, c-format
+msgid "D%1"
+msgstr "D%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:39
+#, c-format
+msgid "D#%1"
+msgstr "Diss%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:40
+#, c-format
+msgid "E%1"
+msgstr "E%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:40
+#, c-format
+msgid "F%1"
+msgstr "F%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:40
+#, c-format
+msgid "F#%1"
+msgstr "Fiss%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:40
+#, c-format
+msgid "G%1"
+msgstr "G%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:41
+#, c-format
+msgid "G#%1"
+msgstr "Giss%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:41
+#, c-format
+msgid "A%1"
+msgstr "A%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:41
+#, c-format
+msgid "A#%1"
+msgstr "Aiss%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:41
+#, c-format
+msgid "B%1"
+msgstr "H%1"
+
+#: ../src/gui/general/PresetGroup.cpp:95
+#, c-format
+msgid "Can't open preset file %1"
+msgstr "Kan inte öppna förinställningsfil %1"
+
+#: ../src/gui/general/EditView.cpp:744
+#, fuzzy
+msgid "&Halve Durations"
+msgstr "Notvärde"
+
+#: ../src/gui/general/EditView.cpp:748
+#, fuzzy
+msgid "&Double Durations"
+msgstr "Dubbel-b-förtecken"
+
+#: ../src/gui/general/EditView.cpp:806
+msgid "Show Velocity Property Ruler"
+msgstr "Visa linjal för ljudstyrkegenskaper"
+
+#: ../src/gui/general/EditView.cpp:825
+msgid "Insert item"
+msgstr "Infoga objekt"
+
+#: ../src/gui/general/EditView.cpp:831
+msgid "Erase selected items"
+msgstr "Ta bort markerade objekt"
+
+#: ../src/gui/general/EditView.cpp:835
+msgid "Clear ruler"
+msgstr "Rensa linjal"
+
+#: ../src/gui/general/EditView.cpp:839
+msgid "Insert line of controllers"
+msgstr "Infoga rad med effektkontroller"
+
+#: ../src/gui/general/EditView.cpp:843
+msgid "Flip forward"
+msgstr "Vänd framåt"
+
+#: ../src/gui/general/EditView.cpp:847
+msgid "Flip backwards"
+msgstr "Vänd bakåt"
+
+#: ../src/gui/general/EditView.cpp:851
+msgid "Draw property line"
+msgstr "Rita egenskapslinje"
+
+#: ../src/gui/general/EditView.cpp:855
+msgid "Select all property values"
+msgstr "Markera alla egenskapsvärden"
+
+#: ../src/gui/general/EditView.cpp:894
+msgid "%1 Controller %2 %3"
+msgstr "%1 effekt %2 %3"
+
+#: ../src/gui/general/EditView.cpp:1066
+msgid "I"
+msgstr "I"
+
+#: ../src/gui/general/EditView.cpp:1066
+msgid "II"
+msgstr "II"
+
+#: ../src/gui/general/EditView.cpp:1066
+msgid "III"
+msgstr "III"
+
+#: ../src/gui/general/EditView.cpp:1066
+msgid "IV"
+msgstr "IV"
+
+#: ../src/gui/general/EditView.cpp:1067
+msgid "V"
+msgstr "V"
+
+#: ../src/gui/general/EditView.cpp:1067
+msgid "VI"
+msgstr "VI"
+
+#: ../src/gui/general/EditView.cpp:1067
+msgid "VII"
+msgstr "VII"
+
+#: ../src/gui/general/EditView.cpp:1067
+msgid "VIII"
+msgstr "VIII"
+
+#: ../src/gui/general/EditView.cpp:1069
+msgid "%1 flat"
+msgstr "%1 b-förtecken"
+
+#: ../src/gui/general/EditView.cpp:1070
+msgid "%1 sharp"
+msgstr "%1 korsförtecken"
+
+#: ../src/gui/general/EditView.cpp:1085
+msgid "&Insert Note"
+msgstr "&Infoga not"
+
+#: ../src/gui/general/EditView.cpp:1091
+msgid "&Upper Octave"
+msgstr "&Övre oktav"
+
+#: ../src/gui/general/EditView.cpp:1096
+msgid "&Lower Octave"
+msgstr "&Undre oktav"
+
+#: ../src/gui/general/EditView.cpp:1268
+msgid "Estimated time signature shown"
+msgstr "Uppskattad taktart visas"
+
+#: ../src/gui/general/EditView.cpp:1431
+#, fuzzy
+msgid "Halving durations..."
+msgstr "Ställer in notvärden ..."
+
+#: ../src/gui/general/EditView.cpp:1445
+#, fuzzy
+msgid "Doubling durations..."
+msgstr "Ställer in notvärden ..."
+
+#: ../src/gui/general/EditView.cpp:1469
+msgid "Rescaling..."
+msgstr "Ändrar skala ..."
+
+#: ../src/gui/general/EditView.cpp:1489
+#, fuzzy
+msgid "By number of semitones: "
+msgstr "Skriv in antal halvtonsteg att transponera:"
+
+#: ../src/gui/general/EditView.cpp:1496 ../src/gui/general/EditView.cpp:1518
+msgid "Transposing..."
+msgstr "Transponerar ..."
+
+#: ../src/gui/general/EditView.cpp:1536
+msgid "Transposing up one semitone..."
+msgstr "Transponerar ner ett halvtonsteg ..."
+
+#: ../src/gui/general/EditView.cpp:1545
+msgid "Transposing up one octave..."
+msgstr "Transponerar upp en oktav ..."
+
+#: ../src/gui/general/EditView.cpp:1554
+msgid "Transposing down one semitone..."
+msgstr "Transponerar ner ett halvtonsteg ..."
+
+#: ../src/gui/general/EditView.cpp:1563
+msgid "Transposing down one octave..."
+msgstr "Transponerar ner en oktav ..."
+
+#: ../src/gui/general/EditView.cpp:1575
+msgid "Inverting..."
+msgstr "Vänder upp och ner ..."
+
+#: ../src/gui/general/EditView.cpp:1587
+msgid "Retrograding..."
+msgstr "Vänder bak och fram ..."
+
+#: ../src/gui/general/EditView.cpp:1599
+msgid "Retrograde inverting..."
+msgstr "Vänder bak och fram och upp och ner ..."
+
+#: ../src/gui/general/EditView.cpp:1608
+msgid "Jogging left..."
+msgstr "Knuffar åt vänster ..."
+
+#: ../src/gui/general/EditView.cpp:1623
+msgid "Jogging right..."
+msgstr "Knuffar åt höger ..."
+
+#: ../src/sound/AudioFileManager.cpp:660
+#, c-format
+msgid "Downloading file %1"
+msgstr "Hämtar filen %1"
+
+#: ../src/sound/AudioFileManager.cpp:735
+msgid "Converting audio file..."
+msgstr "Konverterar ljudfil ..."
+
+#: ../src/sound/AudioFileManager.cpp:737
+msgid "Resampling audio file..."
+msgstr "Samplar om ljudfil ..."
+
+#: ../src/sound/AudioFileManager.cpp:739
+msgid "Converting and resampling audio file..."
+msgstr "Konverterar och samplar om ljudfil ..."
+
+#: ../src/sound/AudioFileManager.cpp:741
+msgid "Importing audio file..."
+msgstr "Importerar ljudfil ..."
+
+#: ../src/sound/AudioFileManager.cpp:794
+msgid "Failed to convert or resample audio file on import"
+msgstr "Misslyckades att konvertera eller sampla om en ljudfil vid import"
+
+#: ../src/sequencer/main.cpp:46 ../src/sequencer/main.cpp:86
+msgid "RosegardenSequencer"
+msgstr "RosegardenSequencer"
+
+#: ../src/sequencer/main.cpp:54
+msgid "JACK playback and capture ports"
+msgstr "In- och uppspelningsportar för JACK"
+
+#: ../src/commands/segment/SegmentSyncCommand.cpp:38
+#: ../src/commands/segment/SegmentSyncCommand.cpp:44
+#: ../src/commands/segment/SegmentSyncCommand.cpp:55
+#: ../src/commands/segment/SegmentSyncCommand.cpp:63
+#, fuzzy
+msgid "Sync segment parameters"
+msgstr "Segmentparametrar"
+
+#: ../src/commands/segment/RenameTrackCommand.h:52
+msgid "Rename Track"
+msgstr "Byt namn på spår"
+
+#: ../src/commands/segment/SegmentRepeatToCopyCommand.cpp:39
+msgid "Turn Repeats into Copies"
+msgstr "Omvandla upprepningar till kopior"
+
+#: ../src/commands/segment/SegmentTransposeCommand.cpp:36
+#: ../src/commands/segment/SegmentTransposeCommand.cpp:42
+#, fuzzy
+msgid "Change segment transposition"
+msgstr "Ändra segmentfärg"
+
+#: ../src/commands/edit/RescaleCommand.h:50
+#: ../src/commands/segment/AudioSegmentRescaleCommand.h:62
+#: ../src/commands/segment/SegmentRescaleCommand.h:58
+msgid "Stretch or S&quash..."
+msgstr "Sträck eller tr&yck ihop ..."
+
+#: ../src/commands/segment/SegmentLabelCommand.h:52
+msgid "Re&label..."
+msgstr "&Ändra namn ..."
+
+#: ../src/commands/segment/AudioSegmentResizeFromStartCommand.cpp:39
+#: ../src/commands/segment/SegmentResizeFromStartCommand.cpp:39
+msgid "Resize Segment"
+msgstr "Ändra storlek på segment"
+
+#: ../src/commands/segment/RemoveTempoChangeCommand.h:58
+msgid "Remove &Tempo Change..."
+msgstr "&Ta bort tempoändring ..."
+
+#: ../src/commands/segment/SegmentEraseCommand.cpp:40
+#: ../src/commands/segment/SegmentEraseCommand.cpp:52
+msgid "Erase Segment"
+msgstr "Ta bort segment"
+
+#: ../src/commands/segment/AudioSegmentRescaleCommand.cpp:126
+#: ../src/commands/segment/SegmentRescaleCommand.cpp:102
+msgid "(rescaled)"
+msgstr "%1 (förändrad)"
+
+#: ../src/commands/segment/AudioSegmentRescaleCommand.cpp:127
+#: ../src/commands/segment/SegmentRescaleCommand.cpp:105
+msgid "%1 (rescaled)"
+msgstr "%1 (skalad)"
+
+#: ../src/commands/segment/PasteToTriggerSegmentCommand.cpp:47
+msgid "Paste as New Triggered Segment"
+msgstr "Klistra in som nytt utlösande segment"
+
+#: ../src/commands/segment/SegmentColourMapCommand.h:52
+msgid "Change Segment Color Map..."
+msgstr "Ändra segmentfärgkarta ..."
+
+#: ../src/commands/segment/SegmentQuickCopyCommand.h:55
+msgid "Quick-Copy Segment"
+msgstr "Snabbkopiera segment"
+
+#: ../src/commands/segment/AudioSegmentSplitCommand.cpp:42
+msgid "Split Audio Segment"
+msgstr "Dela ljudsegment"
+
+#: ../src/commands/segment/AudioSegmentSplitCommand.cpp:103
+#: ../src/commands/segment/SegmentSplitCommand.cpp:135
+msgid " (split)"
+msgstr " (dela)"
+
+#: ../src/commands/segment/AudioSegmentSplitCommand.cpp:104
+#: ../src/commands/segment/SegmentSplitByRecordingSrcCommand.cpp:120
+#: ../src/commands/segment/SegmentSplitByRecordingSrcCommand.cpp:122
+#: ../src/commands/segment/SegmentSplitCommand.cpp:136
+msgid "%1 (split)"
+msgstr "%1 (dela)"
+
+#: ../src/commands/segment/SegmentLabelCommand.cpp:40
+msgid "Label Segments"
+msgstr "Ange segmentnamn"
+
+#: ../src/commands/segment/OpenOrCloseRangeCommand.cpp:43
+msgid "Open or Close Range"
+msgstr "Öppna eller stäng omfång"
+
+#: ../src/commands/edit/TransposeCommand.h:55
+#: ../src/commands/segment/SegmentTransposeCommand.h:54
+#, fuzzy
+msgid "Transpose by &Interval..."
+msgstr "&Transponera..."
+
+#: ../src/commands/segment/SegmentAutoSplitCommand.cpp:148
+msgid "%1 (part)"
+msgstr "%1 (del)"
+
+#: ../src/commands/segment/AudioSegmentInsertCommand.cpp:51
+#: ../src/commands/segment/SegmentInsertCommand.cpp:43
+#: ../src/commands/segment/SegmentInsertCommand.cpp:56
+msgid "Create Segment"
+msgstr "Skapa segment"
+
+#: ../src/commands/segment/AudioSegmentInsertCommand.cpp:114
+msgid "%1 (inserted)"
+msgstr "%1 (infogad)"
+
+#: ../src/commands/segment/AudioSegmentInsertCommand.cpp:117
+msgid "unknown audio file"
+msgstr "okänd ljudfil"
+
+#: ../src/commands/segment/CreateTempoMapFromSegmentCommand.cpp:40
+msgid "Set Tempos from Beat Segment"
+msgstr "Ställ in tempon från taktsegment"
+
+#: ../src/commands/segment/SegmentSplitByRecordingSrcCommand.h:52
+msgid "Split by &Recording Source..."
+msgstr "Dela efter &inspelningskälla ..."
+
+#: ../src/commands/segment/SegmentColourMapCommand.cpp:40
+msgid "Change Segment Color Map"
+msgstr "Ändra segmentfärgkarta"
+
+#: ../src/commands/edit/CopyCommand.cpp:64
+#: ../src/commands/segment/SegmentQuickCopyCommand.cpp:57
+msgid "%1 (copied)"
+msgstr "%1 (kopierad)"
+
+#: ../src/commands/segment/SegmentColourCommand.h:52
+msgid "Change Segment Color..."
+msgstr "Ändra segmentfärg ..."
+
+#: ../src/commands/segment/SegmentSplitByPitchCommand.cpp:170
+msgid "%1 (upper)"
+msgstr "%1 (övre del)"
+
+#: ../src/commands/segment/SegmentSplitByPitchCommand.cpp:172
+msgid "%1 (lower)"
+msgstr "%1 (nedre del)"
+
+#: ../src/commands/segment/SegmentSingleRepeatToCopyCommand.cpp:39
+msgid "Turn Single Repeat into Copy"
+msgstr "Omvandla enkel upprepning till kopia"
+
+#: ../src/commands/segment/AddTempoChangeCommand.h:58
+#, fuzzy
+msgid "Add Te&mpo Change..."
+msgstr "&Klav..."
+
+#: ../src/commands/segment/AudioSegmentAutoSplitCommand.h:57
+#: ../src/commands/segment/SegmentAutoSplitCommand.h:53
+msgid "&Split on Silence"
+msgstr "&Dela vid paus"
+
+#: ../src/commands/segment/SetTriggerSegmentBaseVelocityCommand.cpp:39
+msgid "Set Base Velocity"
+msgstr "Ange grundljudstyrka"
+
+#: ../src/commands/segment/DeleteRangeCommand.cpp:43
+#: ../src/commands/segment/EraseSegmentsStartingInRangeCommand.cpp:39
+msgid "Delete Range"
+msgstr "Ta bort omfång"
+
+#: ../src/commands/segment/ChangeCompositionLengthCommand.h:53
+msgid "Change &Composition Start and End..."
+msgstr "Ändra &kompositionens början och slut..."
+
+#: ../src/commands/segment/MoveTracksCommand.h:51
+msgid "Move Tracks..."
+msgstr "Flytta spår..."
+
+#: ../src/commands/segment/SegmentColourCommand.cpp:39
+msgid "Change Segment Color"
+msgstr "Ändra segmentfärg"
+
+#: ../src/commands/segment/AudioSegmentDistributeCommand.h:66
+msgid "Distribute Audio Segments over MIDI"
+msgstr "Distribuera ljudsegment via MIDI"
+
+#: ../src/commands/segment/AudioSegmentAutoSplitCommand.cpp:147
+msgid "%1 (autosplit %2)"
+msgstr "%1 (dela automatiskt %2)"
+
+#: ../src/commands/segment/SetTriggerSegmentDefaultRetuneCommand.cpp:39
+msgid "Set Default Retune"
+msgstr "Ange standardstämning"
+
+#: ../src/commands/segment/AddTimeSignatureCommand.h:52
+msgid "Add Time Si&gnature Change..."
+msgstr "&Taktart..."
+
+#: ../src/commands/segment/AddTriggerSegmentCommand.cpp:42
+msgid "Add Triggered Segment"
+msgstr "Lägg till utlösande segment"
+
+#: ../src/commands/segment/SetTriggerSegmentDefaultTimeAdjustCommand.cpp:39
+msgid "Set Default Time Adjust"
+msgstr "Ange förvald tidsjustering"
+
+#: ../src/commands/segment/RemoveTimeSignatureCommand.h:58
+msgid "Remove &Time Signature Change..."
+msgstr "&Ta bort taktartsbyte ..."
+
+#: ../src/commands/segment/SegmentCommandRepeat.cpp:39
+msgid "Repeat Segments"
+msgstr "Upprepa segment"
+
+#: ../src/commands/segment/AddTracksCommand.h:55
+msgid "Add Tracks..."
+msgstr "Lägg till spår ..."
+
+#: ../src/commands/segment/ModifyDefaultTempoCommand.h:51
+msgid "Modify &Default Tempo..."
+msgstr "Ändra &standardtempo ..."
+
+#: ../src/commands/segment/SegmentSplitByPitchCommand.h:61
+msgid "Split by &Pitch..."
+msgstr "Dela &efter tonhöjd ..."
+
+#: ../src/commands/segment/DeleteTriggerSegmentCommand.cpp:40
+msgid "Delete Triggered Segment"
+msgstr "Ta bort utlösande segment"
+
+#: ../src/commands/segment/SegmentSplitCommand.cpp:42
+msgid "Split Segment"
+msgstr "Dela segment"
+
+#: ../src/commands/segment/DeleteTracksCommand.h:51
+msgid "Delete Tracks..."
+msgstr "Ta bort spår ..."
+
+#: ../src/commands/segment/InsertRangeCommand.cpp:42
+msgid "Insert Range"
+msgstr "Infoga omfång"
+
+#: ../src/commands/segment/DeleteRangeCommand.h:62
+msgid "Rejoin Command"
+msgstr "Återförena"
+
+#: ../src/commands/segment/SetTriggerSegmentBasePitchCommand.cpp:39
+msgid "Set Base Pitch"
+msgstr "Ange grundtonhöjd"
+
+#: ../src/commands/segment/PasteConductorDataCommand.cpp:41
+msgid "Paste Tempos and Time Signatures"
+msgstr "Klistra in tempo- och taktartsbeteckningar"
+
+#: ../src/commands/segment/SegmentSyncClefCommand.cpp:34
+#, fuzzy
+msgid "Sync segment clef"
+msgstr "Segmentnamn"
+
+#: ../src/commands/matrix/MatrixInsertionCommand.cpp:46
+#: ../src/commands/notation/NoteInsertionCommand.cpp:54
+msgid "Insert Note"
+msgstr "Infoga not"
+
+#: ../src/commands/matrix/MatrixEraseCommand.cpp:41
+msgid "Erase Note"
+msgstr "Ta bort not"
+
+#: ../src/commands/matrix/MatrixPercussionInsertionCommand.cpp:47
+msgid "Insert Percussion Note"
+msgstr "Infoga slagverksnot"
+
+#: ../src/commands/matrix/MatrixModifyCommand.cpp:43
+msgid "Move Note"
+msgstr "Flytta not"
+
+#: ../src/commands/matrix/MatrixModifyCommand.cpp:43
+msgid "Modify Note"
+msgstr "Ändra not"
+
+#: ../src/commands/edit/PasteEventsCommand.cpp:98
+msgid "Paste into an existing gap [\"restricted\"]"
+msgstr "Klistra in i befintligt utrymme [\"begränsat\"]"
+
+#: ../src/commands/edit/PasteEventsCommand.cpp:100
+msgid "Erase existing events to make room [\"simple\"]"
+msgstr "Ta bort befintliga händelser för att ge plats [\"enkelt\"]"
+
+#: ../src/commands/edit/PasteEventsCommand.cpp:102
+msgid "Move existing events out of the way [\"open-n-paste\"]"
+msgstr "Flytta undan befintliga händelser [\"bered plats och klistra in\"]"
+
+#: ../src/commands/edit/PasteEventsCommand.cpp:104
+msgid "Overlay notes, tying against present notes [\"note-overlay\"]"
+msgstr "Överlagra noter, anslut till befintliga noter [\"notöverlagring\"]"
+
+#: ../src/commands/edit/PasteEventsCommand.cpp:106
+msgid "Overlay notes, ignoring present notes [\"matrix-overlay\"]"
+msgstr "Överlagra noter, ignorera befintliga noter [\"matrisöverlagring\"]"
+
+#: ../src/commands/edit/AddDotCommand.h:52
+msgid "&Add Dot"
+msgstr "&Lägg till punkt"
+
+#: ../src/commands/edit/RemoveMarkerCommand.h:55
+msgid "&Remove Marker"
+msgstr "&Ta bort markering"
+
+#: ../src/commands/edit/EventUnquantizeCommand.cpp:43
+#: ../src/commands/edit/EventUnquantizeCommand.cpp:54
+msgid "Unquantize Events"
+msgstr "Ta bort kvantisering för händelser"
+
+#: ../src/commands/edit/ChangeVelocityCommand.h:53
+msgid "&Increase Velocity"
+msgstr "&Öka ljudstyrka"
+
+#: ../src/commands/edit/ChangeVelocityCommand.h:54
+msgid "&Reduce Velocity"
+msgstr "&Reducera ljudstyrka"
+
+#: ../src/commands/edit/CopyCommand.cpp:46
+msgid "(excerpt)"
+msgstr "(utdrag)"
+
+#: ../src/commands/edit/CopyCommand.cpp:60
+msgid "(copied)"
+msgstr "(kopierad)"
+
+#: ../src/commands/edit/EventInsertionCommand.cpp:39
+msgid "Insert Event"
+msgstr "Infoga händelse"
+
+#: ../src/commands/edit/InsertTriggerNoteCommand.cpp:55
+msgid "Insert Trigger Note"
+msgstr "Infoga utlösande ton"
+
+#: ../src/commands/edit/CollapseNotesCommand.h:50
+msgid "Collapse &Equal-Pitch Notes"
+msgstr "Lägg ihop noter med sa&mma tonhöjd"
+
+#: ../src/commands/edit/TransposeCommand.h:61
+msgid "&Up a Semitone"
+msgstr "&Upp ett halvtonsteg"
+
+#: ../src/commands/edit/TransposeCommand.h:62
+msgid "&Down a Semitone"
+msgstr "&Ner ett halvtonsteg"
+
+#: ../src/commands/edit/TransposeCommand.h:63
+msgid "Up an &Octave"
+msgstr "Upp en &oktav"
+
+#: ../src/commands/edit/TransposeCommand.h:64
+msgid "Down an Octa&ve"
+msgstr "Ner en okta&v"
+
+#: ../src/commands/edit/TransposeCommand.h:65
+#, fuzzy
+msgid "&Transpose by Semitones..."
+msgstr "Transponerar ner ett halvtonsteg ..."
+
+#: ../src/commands/edit/SetNoteTypeCommand.h:56
+msgid "&Set Note Type"
+msgstr "&Ange nottyp "
+
+#: ../src/commands/edit/EventEditCommand.h:55
+msgid "Edit E&vent"
+msgstr "Redigera &händelse"
+
+#: ../src/commands/edit/AddMarkerCommand.h:54
+msgid "&Add Marker"
+msgstr "&Lägg till markering"
+
+#: ../src/commands/edit/SelectionPropertyCommand.h:66
+msgid "Set &Property"
+msgstr "Ställ in &egenskap"
+
+#: ../src/commands/edit/CutCommand.h:55
+msgid "Cu&t"
+msgstr "Klipp u&t"
+
+#: ../src/commands/edit/EventQuantizeCommand.cpp:114
+msgid "Heuristic Notation &Quantize"
+msgstr "Heuristisk kvantisering av &notskrift"
+
+#: ../src/commands/edit/EventQuantizeCommand.cpp:116
+msgid "Grid &Quantize"
+msgstr "Rutnäts&kvantisering"
+
+#: ../src/commands/edit/ClearTriggersCommand.h:52
+msgid "&Clear Triggers"
+msgstr "&Rensa utlösare"
+
+#: ../src/commands/edit/RetrogradeCommand.h:51
+msgid "&Retrograde"
+msgstr "&Retrograd"
+
+#: ../src/commands/edit/InvertCommand.h:51
+msgid "&Invert"
+msgstr "&Invertera"
+
+#: ../src/commands/edit/SetTriggerCommand.h:64
+msgid "Tri&gger Segment"
+msgstr "&Utlösande segment"
+
+#: ../src/commands/edit/SetLyricsCommand.h:50
+msgid "Edit L&yrics"
+msgstr "Redigera &sångtext"
+
+#: ../src/commands/edit/MoveAcrossSegmentsCommand.cpp:73
+msgid "&Move Events to Other Segment"
+msgstr "&Flytta händelser till annat segment"
+
+#: ../src/commands/edit/RetrogradeInvertCommand.h:51
+msgid "Re&trograde Invert"
+msgstr "Retrograd inversion"
+
+#: ../src/commands/edit/ModifyMarkerCommand.h:55
+msgid "&Modify Marker"
+msgstr "Ä&ndra markering"
+
+#: ../src/commands/studio/AddControlParameterCommand.h:61
+msgid "&Add Control Parameter"
+msgstr "&Lägg till styrparameter"
+
+#: ../src/commands/studio/ModifyInstrumentMappingCommand.h:55
+msgid "Modify &Instrument Mapping"
+msgstr "Ändra &instrumentmappning"
+
+#: ../src/commands/studio/RemoveControlParameterCommand.h:60
+msgid "&Remove Control Parameter"
+msgstr "&Ta bort styrparameter"
+
+#: ../src/commands/studio/ReconnectDeviceCommand.h:55
+msgid "Reconnect Device"
+msgstr "Koppla upp enhet igen"
+
+#: ../src/commands/studio/ModifyDeviceCommand.h:68
+msgid "Modify &MIDI Bank"
+msgstr "Ändra &MIDI-bank"
+
+#: ../src/commands/studio/CreateOrDeleteDeviceCommand.h:68
+msgid "Create Device"
+msgstr "Skapa enhet"
+
+#: ../src/commands/studio/ModifyDeviceMappingCommand.h:55
+msgid "Modify &Device Mapping"
+msgstr "Ändra &enhetsmappning"
+
+#: ../src/commands/studio/RenameDeviceCommand.h:55
+msgid "Rename Device"
+msgstr "Byt namn på enhet"
+
+#: ../src/commands/studio/ModifyControlParameterCommand.h:61
+msgid "&Modify Control Parameter"
+msgstr "Ä&ndra styrparameter"
+
+#: ../src/commands/notation/TieNotesCommand.h:49
+msgid "&Tie"
+msgstr "&Bind"
+
+#: ../src/commands/notation/ClefInsertionCommand.cpp:74
+msgid "Add Cle&f Change..."
+msgstr "&Klav..."
+
+#: ../src/commands/notation/GuitarChordInsertionCommand.cpp:40
+#, fuzzy
+msgid "Insert Guitar Chord"
+msgstr "gitarrackordeditor"
+
+#: ../src/commands/notation/RespellCommand.cpp:47
+#, c-format
+msgid "Respell with %1"
+msgstr "Stava om med %1"
+
+#: ../src/commands/notation/RespellCommand.cpp:50
+msgid "Do&uble Sharp"
+msgstr "d&ubbelkorsförtecken"
+
+#: ../src/commands/notation/RespellCommand.cpp:52
+msgid "&Sharp"
+msgstr "&korsförtecken"
+
+#: ../src/commands/notation/RespellCommand.cpp:54
+msgid "&Flat"
+msgstr "b-f&örtecken"
+
+#: ../src/commands/notation/RespellCommand.cpp:56
+msgid "Dou&ble Flat"
+msgstr "&dubbel-b-förtecken"
+
+#: ../src/commands/notation/RespellCommand.cpp:58
+msgid "&Natural"
+msgstr "&återställningstecken"
+
+#: ../src/commands/notation/RespellCommand.cpp:60
+msgid "N&one"
+msgstr "In&get"
+
+#: ../src/commands/notation/RespellCommand.cpp:66
+msgid "Respell Accidentals &Upward"
+msgstr "Stava om tillfälliga förtecken &uppåt "
+
+#: ../src/commands/notation/RespellCommand.cpp:69
+msgid "Respell Accidentals &Downward"
+msgstr "Stava om tillfälliga förtecken &neråt "
+
+#: ../src/commands/notation/RespellCommand.cpp:72
+#, fuzzy
+msgid "&Restore Accidentals"
+msgstr "Stava om tillfälliga förtecken"
+
+#: ../src/commands/notation/RespellCommand.cpp:75
+msgid "Respell Accidentals"
+msgstr "Stava om tillfälliga förtecken"
+
+#: ../src/commands/notation/DeCounterpointCommand.h:55
+msgid "Split-and-Tie Overlapping &Chords"
+msgstr "Dela och bind &ackord med för stora notvärden"
+
+#: ../src/commands/notation/BeamCommand.h:49
+msgid "&Beam Group"
+msgstr "&Balkgrupp"
+
+#: ../src/commands/notation/AddTextMarkCommand.h:51
+msgid "Add Te&xt Mark..."
+msgstr "Lägg till föredragsbeteckning som te&xt ..."
+
+#: ../src/commands/notation/RestoreSlursCommand.h:49
+#, fuzzy
+msgid "&Restore Slur Positions"
+msgstr "Åte&rställ beräknad position för legatobåge"
+
+#: ../src/commands/notation/SustainInsertionCommand.h:56
+msgid "Add Pedal &Press"
+msgstr "Lägg till pedal&tryck"
+
+#: ../src/commands/notation/SustainInsertionCommand.h:58
+msgid "Add Pedal &Release"
+msgstr "Lägg till pedal&släpp"
+
+#: ../src/commands/notation/FixNotationQuantizeCommand.h:49
+msgid "Fi&x Notation Quantization"
+msgstr "B&estäm kvantisering av notskrift"
+
+#: ../src/commands/notation/ChangeStemsCommand.h:51
+msgid "Stems &Up"
+msgstr "Skaft &uppåt"
+
+#: ../src/commands/notation/ChangeStemsCommand.h:51
+msgid "Stems &Down"
+msgstr "Skaft &neråt"
+
+#: ../src/commands/notation/MakeAccidentalsCautionaryCommand.cpp:43
+msgid "Use &Cautionary Accidentals"
+msgstr "Använd &förtydligande förtecken"
+
+#: ../src/commands/notation/MakeAccidentalsCautionaryCommand.cpp:45
+msgid "Cancel C&autionary Accidentals"
+msgstr "T&a bort förtydligande förtecken"
+
+#: ../src/commands/notation/SetVisibilityCommand.h:50
+msgid "Set Visibility"
+msgstr "Ange synlighet"
+
+#: ../src/commands/notation/ChangeStyleCommand.h:53
+msgid "Change &Note Style"
+msgstr "Byt &nothuvudstil"
+
+#: ../src/commands/notation/TextInsertionCommand.cpp:41
+msgid "Insert Text"
+msgstr "Infoga text"
+
+#: ../src/commands/notation/InterpretCommand.h:70
+msgid "&Interpret..."
+msgstr "&Tolka..."
+
+#: ../src/commands/notation/TupletCommand.h:53
+msgid "&Triplet"
+msgstr "&Triol"
+
+#: ../src/commands/notation/TupletCommand.h:54
+msgid "Tu&plet..."
+msgstr "Annan&delning ..."
+
+#: ../src/commands/notation/UnTupletCommand.h:50
+msgid "&Untuplet"
+msgstr "Ta b&ort annandelning"
+
+#: ../src/commands/notation/CollapseRestsCommand.h:54
+msgid "&Collapse Rests"
+msgstr "Lägg ihop pau&ser"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:145
+msgid "Add S&lur"
+msgstr "&Lägg till legatobåge"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:147
+msgid "Add &Phrasing Slur"
+msgstr "Lägg &till frasbåge"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:149
+msgid "Add Double-Octave Up"
+msgstr "Quindicesima uppåt"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:151
+msgid "Add Octave &Up"
+msgstr "Ottava &uppåt"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:153
+msgid "Add Octave &Down"
+msgstr "Ottava &neråt"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:155
+msgid "Add Double Octave Down"
+msgstr "Quindicesima neråt"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:160
+msgid "Add &Crescendo"
+msgstr "Lägg till &crescendo"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:162
+msgid "Add &Decrescendo"
+msgstr "Lägg till &diminuendo"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:164
+msgid "Add &Glissando"
+msgstr "Lägg till &glissando"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:167
+msgid "Add &%1%2"
+msgstr "Lägg till &%1%2"
+
+#: ../src/commands/notation/RemoveNotationQuantizeCommand.h:49
+msgid "Remo&ve Notation Quantization"
+msgstr "&Ta bort kvantisering av notskrift"
+
+#: ../src/commands/notation/MakeChordCommand.h:50
+msgid "Make &Chord"
+msgstr "&Skriv ackord"
+
+#: ../src/commands/notation/MultiKeyInsertionCommand.h:63
+msgid "Change all to &Key %1..."
+msgstr "Byt allt till &tonart %1 ..."
+
+#: ../src/commands/notation/KeyInsertionCommand.h:67
+#: ../src/commands/notation/MultiKeyInsertionCommand.h:65
+msgid "Add &Key Change..."
+msgstr "&Tonart ..."
+
+#: ../src/commands/notation/RestoreStemsCommand.h:49
+#, fuzzy
+msgid "&Restore Stems"
+msgstr "Åte&rställ beräknade skaft"
+
+#: ../src/commands/notation/MakeNotesViableCommand.h:55
+#: ../src/commands/notation/MakeRegionViableCommand.h:52
+msgid "Tie Notes at &Barlines"
+msgstr "B&ind noter vid taktstreck"
+
+#: ../src/commands/notation/AddSlashesCommand.h:46
+msgid "Slashes"
+msgstr "Tvärbalkar"
+
+#: ../src/commands/notation/ChangeSlurPositionCommand.h:51
+msgid "Slur &Above"
+msgstr "Legatobåge &ovanför"
+
+#: ../src/commands/notation/ChangeSlurPositionCommand.h:51
+msgid "Slur &Below"
+msgstr "Legatobåge &nedanför"
+
+#: ../src/commands/notation/NormalizeRestsCommand.h:54
+msgid "&Normalize Rests"
+msgstr "&Normalisera pauser"
+
+#: ../src/commands/notation/TextChangeCommand.cpp:41
+msgid "Edit Text"
+msgstr "Redigera text"
+
+#: ../src/commands/notation/RemoveMarksCommand.h:49
+msgid "&Remove All Marks"
+msgstr "&Ta bort alla ornament och föredragsbeteckningar"
+
+#: ../src/commands/notation/AutoBeamCommand.h:52
+msgid "&Auto-Beam"
+msgstr "&Automatiska balkar"
+
+#: ../src/commands/notation/UntieNotesCommand.h:49
+msgid "&Untie"
+msgstr "Ta b&ort bindebåge"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:48
+msgid "S&forzando"
+msgstr "S&forzando"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:50
+msgid "Sta&ccato"
+msgstr "&Staccato"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:52
+msgid "R&inforzando"
+msgstr "&Rinforzando"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:54
+msgid "T&enuto"
+msgstr "T&enuto"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:56
+msgid "Tri&ll"
+msgstr "Dr&ill"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:58
+msgid "Trill &with Line"
+msgstr "&Drill med våglinje"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:60
+msgid "Trill Line"
+msgstr "Våglinje"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:62
+msgid "&Turn"
+msgstr "Du&bbelslag"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:64
+msgid "&Accent"
+msgstr "&Accent"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:66
+msgid "&Staccatissimo"
+msgstr "Sta&ccatissimo"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:68
+msgid "&Marcato"
+msgstr "&Marcato"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:70
+msgid "&Pause"
+msgstr "&Fermat"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:72
+msgid "&Up-Bow"
+msgstr "&Uppstråk"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:74
+msgid "&Down-Bow"
+msgstr "&Nedstråk"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:76
+msgid "Mo&rdent"
+msgstr "M&ordent"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:78
+msgid "Inverted Mordent"
+msgstr "Pralldrill"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:80
+msgid "Long Mordent"
+msgstr "Lång mordent"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:82
+msgid "Lon&g Inverted Mordent"
+msgstr "Lån&g pralldrill"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:84
+msgid "&%1%2"
+msgstr "&%1%2"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:89
+#, c-format
+msgid "Add %1"
+msgstr "Lägg till %1"
+
+#: ../src/commands/notation/ResetDisplacementsCommand.h:49
+#, fuzzy
+msgid "Restore Positions"
+msgstr "Återställ beräknade positioner"
+
+#: ../src/commands/notation/IncrementDisplacementsCommand.h:52
+msgid "Fine Reposition"
+msgstr "Fin ompositionering"
+
+#: ../src/commands/notation/RestoreTiesCommand.h:49
+#, fuzzy
+msgid "&Restore Tie Positions"
+msgstr "Återställ beräknade positioner"
+
+#: ../src/commands/notation/ChangeTiePositionCommand.h:47
+#, fuzzy
+msgid "Tie &Above"
+msgstr "Legatobåge &ovanför"
+
+#: ../src/commands/notation/ChangeTiePositionCommand.h:47
+#, fuzzy
+msgid "Tie &Below"
+msgstr "Legatobåge &nedanför"
+
+#: ../src/commands/notation/KeyInsertionCommand.h:65
+msgid "Change to &Key %1..."
+msgstr "Byt till &tonart %1 ..."
+
+#: ../src/commands/notation/RemoveFingeringMarksCommand.h:49
+msgid "&Remove Fingerings"
+msgstr "&Ta bort fingersättning"
+
+#: ../src/commands/notation/BreakCommand.h:49
+msgid "&Unbeam"
+msgstr "&Ta bort balkar"
+
+#: ../src/commands/notation/UnGraceCommand.h:48
+msgid "Ung&race"
+msgstr "&Ta bort prydnadsnot"
+
+#: ../src/commands/notation/AddFingeringMarkCommand.cpp:45
+msgid "Add Other &Fingering..."
+msgstr "Lägg till annan &fingersättning ..."
+
+#: ../src/commands/notation/AddFingeringMarkCommand.cpp:47
+msgid "Add Fingering &0 (Thumb)"
+msgstr "Finger &0"
+
+#: ../src/commands/notation/AddFingeringMarkCommand.cpp:49
+#, c-format
+msgid "Add Fingering &%1"
+msgstr "Finger &%1"
+
+#: ../src/document/io/HydrogenXMLHandler.cpp:277
+msgid " imported from Hydrogen "
+msgstr " importerad från Hydrogen "
+
+#: ../src/document/io/LilyPondExporter.cpp:404
+#, fuzzy
+msgid ""
+"LilyPond does not allow spaces or backslashes in filenames.\n"
+"\n"
+"Would you like to use\n"
+"\n"
+" %1\n"
+"\n"
+" instead?"
+msgstr ""
+"Lilypond tillåter inte mellanslag eller backsteg i filnamn.\n"
+"\n"
+"Vill du använda\n"
+"\n"
+" %1\n"
+"\n"
+" istället?"
+
+#: ../src/document/io/LilyPondExporter.cpp:2054
+msgid "warning: overlong bar truncated here"
+msgstr "varning: alltför lång takt avkortad här"
+
+#: ../src/document/io/LilyPondExporter.cpp:2060
+msgid "warning: bar too short, padding with rests"
+msgstr "varning: för kort takt, fyller ut med pauser"
+
+#: ../src/document/MultiViewCommandHistory.cpp:318
+msgid "Nothing to undo"
+msgstr "Ingenting att ångra"
+
+#: ../src/document/MultiViewCommandHistory.cpp:320
+msgid "Nothing to redo"
+msgstr "Ingenting att göra om"
+
+#: ../src/document/MultiViewCommandHistory.cpp:328
+#: ../src/document/MultiViewCommandHistory.cpp:372
+#, c-format
+msgid "Und&o %1"
+msgstr "&Ångra %1"
+
+#: ../src/document/MultiViewCommandHistory.cpp:330
+#: ../src/document/MultiViewCommandHistory.cpp:374
+#, c-format
+msgid "Re&do %1"
+msgstr "&Gör om %1"
+
+#: ../src/document/RosegardenGUIDoc.cpp:328
+msgid ""
+"The current file has been modified.\n"
+"Do you want to save it?"
+msgstr ""
+"Den aktuella filen har ändrats.\n"
+"Vill du spara den?"
+
+#: ../src/document/RosegardenGUIDoc.cpp:480
+#, c-format
+msgid ""
+"_n: Delete the 1 audio file recorded during the unsaved session?\n"
+"Delete the %n audio files recorded during the unsaved session?"
+msgstr ""
+"Vill du ta bort den enda ljudfilen inspelad under sessionen?\n"
+"Vill du ta bort de %n ljudfiler inspelade under sessionen?"
+
+#: ../src/document/RosegardenGUIDoc.cpp:501
+msgid ""
+"The following audio files were recorded during this session but have been "
+"unloaded\n"
+"from the audio file manager, and so are no longer in use in the document you "
+"are saving.\n"
+"\n"
+"You may want to clean up these files to save disk space.\n"
+"\n"
+"Please select any you wish to delete permanently from the hard disk.\n"
+msgstr ""
+"Följande ljudfiler spelades in under sessionen, men har stängts i\n"
+"ljudfilshanteraren, och används alltså inte längre i dokumentet du sparar.\n"
+"\n"
+"Du kanske vill städa bort filerna för att spara diskutrymme.\n"
+"\n"
+"Välj alla du vill ta bort permanent från hårddisken.\n"
+
+#: ../src/document/RosegardenGUIDoc.cpp:517
+#, fuzzy, c-format
+msgid ""
+"_n: <qt>About to delete 1 audio file permanently from the hard disk."
+"<br>There will be no way to recover this file.<br>Are you sure?</qt>\n"
+"\n"
+"<qt>About to delete %n audio files permanently from the hard disk.<br>There "
+"will be no way to recover these files.<br>Are you sure?</qt>"
+msgstr ""
+"_n: På väg att permanent ta bort 1 ljudfil från hårddisken.\n"
+"Det kommer inte att finnas något sätt att återställa denna fil.\n"
+"Är du säker?\n"
+"På väg att permanent ta bort %n ljudfiler från hårddisken.\n"
+"Det kommer inte att finnas något sätt att återställa dessa filer.\n"
+"Är du säker?"
+
+#: ../src/document/RosegardenGUIDoc.cpp:580
+msgid "Can't open file '%1'"
+msgstr "Kan inte öppna filen '%1'"
+
+#: ../src/document/RosegardenGUIDoc.cpp:585
+msgid "Reading file..."
+msgstr "Läser fil ..."
+
+#: ../src/document/RosegardenGUIDoc.cpp:603
+msgid "Could not open Rosegarden file"
+msgstr "Kunde inte öppna Rosegardenfil"
+
+#: ../src/document/RosegardenGUIDoc.cpp:641
+msgid "Error when parsing file '%1': \"%2\""
+msgstr "Fel vid tolkning av filen '%1': \"%2\""
+
+#: ../src/document/RosegardenGUIDoc.cpp:689
+msgid "Generating audio previews..."
+msgstr "Skapar förhandsgranskning av ljud ..."
+
+#: ../src/document/RosegardenGUIDoc.cpp:721
+msgid "Merge"
+msgstr "Sammanfoga"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1605
+msgid "File load cancelled"
+msgstr "Laddning av fil avbruten"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1625
+msgid ""
+"<h3>Audio and plugins not available</h3><p>This composition uses audio files "
+"or plugins, but Rosegarden is currently running without audio because the "
+"JACK audio server was not available on startup.</p><p>Please exit "
+"Rosegarden, start the JACK audio server and re-start Rosegarden if you wish "
+"to load this complete composition.</p><p><b>WARNING:</b> If you re-save this "
+"composition, all audio and plugin data and settings in it will be lost.</p>"
+msgstr ""
+"<h3>Ljud och insticksprogram ej tillgängliga</h3><p>Denna komposition "
+"använder ljudfiler eller insticksprogram, men Rosegarden körs för närvarande "
+"utan ljud på grund av att JACK inte kördes när Rosegarden startades.</"
+"p><p>Var vänlig stäng Rosegarden, starta JACK och sedan Rosegarden pånytt om "
+"du vill öppna den fullständiga kompositionen.</p><p><b>VARNING:</b>Om du "
+"sparar denna komposition förloras alla inställningar för ljud och "
+"insticksprogram.</p>"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1628
+msgid ""
+"<h3>Audio and plugins not available</h3><p>This composition uses audio files "
+"or plugins, but you are running a version of Rosegarden that was compiled "
+"without audio support.</p><p><b>WARNING:</b> If you re-save this composition "
+"from this version of Rosegarden, all audio and plugin data and settings in "
+"it will be lost.</p>"
+msgstr ""
+"<h3>Ljud och insticksprogram ej tillgängliga</h3><p>Denna komposition "
+"använder ljudfiler eller insticksprogram, men du kör en version av "
+"Rosegarden som kompilerades utan ljudstöd.</p><p><b>WARNING:</b> If you re-"
+"save this composition from this version of Rosegarden, all audio and plugin "
+"data and settings in it will be lost.</p>"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1665
+msgid ""
+"<h3>Incorrect audio sample rate</h3><p>This composition contains audio files "
+"that were recorded or imported with the audio server running at a different "
+"sample rate (%1 Hz) from the current JACK server sample rate (%2 Hz).</"
+"p><p>Rosegarden will play this composition at the correct speed, but any "
+"audio files in it will probably sound awful.</p><p>Please consider re-"
+"starting the JACK server at the correct rate (%3 Hz) and re-loading this "
+"composition before you do any more work with it.</p>"
+msgstr ""
+"<h3>Felaktig ljudsamplingsnivå</h3><p>Denna komposition innehåller ljudfiler "
+"som spelades in eller importerades med ljudservern på en annan samplingsnivå "
+"(%1 Hz) än den aktuella nivån för JACK (%2 Hz).</p><p>Rosegarden kommer att "
+"spela upp kompositionen med rätt hastighe, men ljudfilerna i den kommer "
+"troligen att låta hemskt.</p><p>Var vänlig överväg att starta om JACK med "
+"rätt nivå (%3 Hz) och öppna denna komposition ånyo innan du fortsätter "
+"arbete med den.</p>"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1675
+msgid ""
+"<h3>Inconsistent audio sample rates</h3><p>This composition contains audio "
+"files at more than one sample rate.</p><p>Rosegarden will play them at the "
+"correct speed, but any audio files that were recorded or imported at rates "
+"different from the current JACK server sample rate (%1 Hz) will probably "
+"sound awful.</p><p>Please see the audio file manager dialog for more "
+"details, and consider resampling any files that are at the wrong rate.</p>"
+msgstr ""
+"<h3>Avvikande ljudsamplingsnivåer</h3><p>Denna komposition innehåller "
+"ljudfiler med olika samplingsnivåer.</p><p>Rosegarden kommer att spela upp "
+"dem med rätt hastighet, men ljudfiler inspelade eller importerade med andra "
+"nivåer än den nuvarande i JACK (%1 Hz) kommer troligen att låta hemskt.</"
+"p><p>Var vänlig se ljudfilshanterarens dialogfönster för mer information, "
+"och överväg omsampling av filer med en annan nivå.</p>"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1676
+msgid "Inconsistent sample rates"
+msgstr "Avvikande samplingsnivåer"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1690
+msgid ""
+"<h3>Plugins not found</h3><p>The following audio plugins could not be loaded:"
+"</p><ul>"
+msgstr ""
+"<h3>Insticksprogram ej funna</h3><p>Följande ljudinsticksprogram kunde inte "
+"laddas:</p><ul>"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1698
+msgid "<li>%1 (from %2)</li>"
+msgstr "<li>%1 (från %2)</li>"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1712
+msgid ""
+"This file contains one or more old element types that are now deprecated.\n"
+"Support for these elements may disappear in future versions of Rosegarden.\n"
+"We recommend you re-save this file from this version of Rosegarden to ensure "
+"that it can still be re-loaded in future versions."
+msgstr ""
+"Den här filen innehåller en eller flera gamla elementtyper som inte längre "
+"förespråkas.\n"
+"Stöd för elementen kan försvinna i framtida versioner av Rosegarden.\n"
+"Du rekommenderas att spara filen med den här versionen av Rosegarden,\n"
+"för att försäkra dig om att den kan laddas igen i framtida versioner."
+
+#: ../src/document/RosegardenGUIDoc.cpp:2207
+msgid "Insert Recorded MIDI"
+msgstr "Infoga inspelad MIDI"
+
+#: ../src/document/RosegardenGUIDoc.cpp:2560
+msgid "%1 (recorded)"
+msgstr "%1 (inspelad)"
+
+#: ../src/document/RoseXmlHandler.cpp:442
+msgid ""
+"This file was written by Rosegarden %1, and it uses\n"
+"a different file format that cannot be read by this version."
+msgstr ""
+"Den här filen är skriven av Rosegarden %1, och använder\n"
+"ett annat filformat som inte kan läsas av den här versionen."
+
+#: ../src/document/RoseXmlHandler.cpp:452
+msgid ""
+"This file was written by Rosegarden %1, which is more recent than this "
+"version.\n"
+"There may be some incompatibilities with the file format."
+msgstr ""
+"Den här filen är skriven av Rosegarden %1, som är nyare än den\n"
+"här versionen. Det kan finnas vissa problem med filformatet."
+
+#: ../src/document/RoseXmlHandler.cpp:1687
+msgid "Loading plugins..."
+msgstr "Laddar insticksmoduler ..."
+
+#: rc.cpp:6 rc.cpp:144
+#, no-c-format
+msgid "Se&gment"
+msgstr "Seg&ment"
+
+#: rc.cpp:9 rc.cpp:84 rc.cpp:147 rc.cpp:303
+#, no-c-format
+msgid "Edit &With"
+msgstr "Redigera &med"
+
+#: rc.cpp:12 rc.cpp:21 rc.cpp:30 rc.cpp:39 rc.cpp:345
+#, no-c-format
+msgid "Actions Toolbar"
+msgstr "Åtgärdsverktygslist"
+
+#: rc.cpp:15 rc.cpp:33 rc.cpp:129 rc.cpp:285
+#, no-c-format
+msgid "Time Toolbar"
+msgstr "Tidsverktygslist"
+
+#: rc.cpp:18 rc.cpp:36 rc.cpp:57 rc.cpp:63 rc.cpp:120 rc.cpp:243 rc.cpp:342
+#, no-c-format
+msgid "Transport Toolbar"
+msgstr "Spelarverktygslist"
+
+#: rc.cpp:24 rc.cpp:42 rc.cpp:123 rc.cpp:348
+#, no-c-format
+msgid "Zoom Toolbar"
+msgstr "Zoomverktygslist"
+
+#: rc.cpp:45 rc.cpp:60 rc.cpp:99 rc.cpp:228 rc.cpp:327
+#, no-c-format
+msgid "T&ransport"
+msgstr "Spelkont&roller"
+
+#: rc.cpp:51
+#, no-c-format
+msgid "Number of Stereo &Inputs"
+msgstr "Antal &ingångar för stereoljud"
+
+#: rc.cpp:54
+#, no-c-format
+msgid "&Number of Submasters"
+msgstr "Antal &delhuvudnivåer"
+
+#: rc.cpp:66
+#, no-c-format
+msgid "&Import"
+msgstr "&Importera"
+
+#: rc.cpp:69
+#, no-c-format
+msgid "&Merge"
+msgstr "Sa&mmanfoga"
+
+#: rc.cpp:72
+#, no-c-format
+msgid "&Export"
+msgstr "E&xportera"
+
+#: rc.cpp:75 rc.cpp:141 rc.cpp:297
+#, no-c-format
+msgid "&Composition"
+msgstr "&Komposition"
+
+#: rc.cpp:78
+#, no-c-format
+msgid "&Studio"
+msgstr "St&udio"
+
+#: rc.cpp:81
+#, no-c-format
+msgid "Se&gments"
+msgstr "Seg&ment"
+
+#: rc.cpp:90
+#, no-c-format
+msgid "Trac&ks"
+msgstr "S&pår"
+
+#: rc.cpp:93
+#, no-c-format
+msgid "Set &Instrument"
+msgstr "Ange &instrument"
+
+#: rc.cpp:102 rc.cpp:234 rc.cpp:333
+#, no-c-format
+msgid "&Toolbars"
+msgstr "Verkt&ygslister"
+
+#: rc.cpp:105 rc.cpp:237 rc.cpp:336
+#, no-c-format
+msgid "&Rulers"
+msgstr "Lin&jaler"
+
+#: rc.cpp:111 rc.cpp:240 rc.cpp:339
+#, no-c-format
+msgid "Tools Toolbar"
+msgstr "Redigeringsverktygslist"
+
+#: rc.cpp:114
+#, no-c-format
+msgid "Tracks Toolbar"
+msgstr "Spårverktygslist"
+
+#: rc.cpp:117
+#, no-c-format
+msgid "Editors Toolbar"
+msgstr "Editorverktygslist"
+
+#: rc.cpp:135
+#, no-c-format
+msgid "&Layout Mode"
+msgstr "Ut&läggning"
+
+#: rc.cpp:138 rc.cpp:294
+#, no-c-format
+msgid "Add Event Ruler"
+msgstr "Lägg till effektlinjal"
+
+#: rc.cpp:150
+#, fuzzy, no-c-format
+msgid "N&ote"
+msgstr "&Noter"
+
+#: rc.cpp:153
+#, no-c-format
+msgid "Mar&ks"
+msgstr "Ornament och föredragsbetec&kningar"
+
+#: rc.cpp:156
+#, no-c-format
+msgid "&Ornaments"
+msgstr "&Ornament"
+
+#: rc.cpp:159
+#, no-c-format
+msgid "&Fingerings"
+msgstr "&Fingersättningar"
+
+#: rc.cpp:162
+#, no-c-format
+msgid "S&lashes"
+msgstr "&Tvärbalkar"
+
+#: rc.cpp:165 rc.cpp:219
+#, no-c-format
+msgid "&Accidentals"
+msgstr "&Tillfälliga förtecken"
+
+#: rc.cpp:168
+#, fuzzy, no-c-format
+msgid "&Phrase"
+msgstr "Rad&era"
+
+#: rc.cpp:171
+#, no-c-format
+msgid "Slur &Position"
+msgstr "&Position för legatobåge"
+
+#: rc.cpp:174
+#, fuzzy, no-c-format
+msgid "Tie &Position"
+msgstr "&Position för legatobåge"
+
+#: rc.cpp:177
+#, no-c-format
+msgid "&Octaves"
+msgstr "&Oktavering"
+
+#: rc.cpp:180 rc.cpp:306
+#, no-c-format
+msgid "Ad&just"
+msgstr "&Justera"
+
+#: rc.cpp:183
+#, no-c-format
+msgid "R&ests"
+msgstr "&Pauser"
+
+#: rc.cpp:186 rc.cpp:213
+#, no-c-format
+msgid "&Notes"
+msgstr "&Noter"
+
+#: rc.cpp:189 rc.cpp:309
+#, no-c-format
+msgid "&Quantize"
+msgstr "&Kvantisera"
+
+#: rc.cpp:195 rc.cpp:315
+#, no-c-format
+msgid "Trans&pose"
+msgstr "T&ransponera"
+
+#: rc.cpp:198 rc.cpp:318
+#, no-c-format
+msgid "Convert"
+msgstr "Konvertera"
+
+#: rc.cpp:201
+#, no-c-format
+msgid "&Fine Positioning"
+msgstr "&Finpositionering"
+
+#: rc.cpp:204
+#, no-c-format
+msgid "Fine Ti&ming"
+msgstr "Fin t&idsjustering"
+
+#: rc.cpp:207
+#, no-c-format
+msgid "&Visibility"
+msgstr "S&ynlighet"
+
+#: rc.cpp:216
+#, no-c-format
+msgid "&Rests"
+msgstr "&Pauser"
+
+#: rc.cpp:222
+#, no-c-format
+msgid "&Clefs"
+msgstr "&Klaver"
+
+#: rc.cpp:225 rc.cpp:324
+#, no-c-format
+msgid "Local &Cursor"
+msgstr "&Markör"
+
+#: rc.cpp:246
+#, no-c-format
+msgid "Notes Toolbar"
+msgstr "Notverktygslist"
+
+#: rc.cpp:249
+#, no-c-format
+msgid "Rests Toolbar"
+msgstr "Pausverktygslist"
+
+#: rc.cpp:252
+#, no-c-format
+msgid "Clefs Toolbar"
+msgstr "Klavverktygslist"
+
+#: rc.cpp:255
+#, no-c-format
+msgid "Accidentals Toolbar"
+msgstr "Verktyglist med tillfälliga förtecken"
+
+#: rc.cpp:258
+#, no-c-format
+msgid "Group Toolbar"
+msgstr "Gruppverktygslist"
+
+#: rc.cpp:261
+#, no-c-format
+msgid "Marks Toolbar"
+msgstr "Verktygslist med föredragsbeteckningar och ornament"
+
+#: rc.cpp:264
+#, no-c-format
+msgid "Meta Toolbar"
+msgstr "Metaverktygslist"
+
+#: rc.cpp:267
+#, no-c-format
+msgid "Layout Toolbar"
+msgstr "Utläggningsverktygslist"
+
+#: rc.cpp:270 rc.cpp:351
+#, no-c-format
+msgid "Control Ruler actions"
+msgstr "Styrlinjalhändelser"
+
+#: rc.cpp:273 rc.cpp:354
+#, no-c-format
+msgid "Property Ruler actions"
+msgstr "Egenskapslinjalhändelser"
+
+#: rc.cpp:276
+#, no-c-format
+msgid "&Action"
+msgstr "Å&tgärd"
+
+#: rc.cpp:279
+#, no-c-format
+msgid "General Toolbar"
+msgstr "Redigeringsverktygslist"
+
+#: rc.cpp:291
+#, no-c-format
+msgid "&Grid"
+msgstr "&Rutnät"
+
+#: rc.cpp:300
+#, no-c-format
+msgid "&Segment"
+msgstr "Seg&ment"
+
+#: rc.cpp:361
+#, no-c-format
+msgid "Hide additional controls"
+msgstr "Dölj flera knappar"
+
+#: rc.cpp:365
+#, no-c-format
+msgid "Panic Button"
+msgstr "Panikknapp"
+
+#: rc.cpp:368
+#, no-c-format
+msgid "Resets all MIDI devices if you've got stuck notes"
+msgstr "Återställer alla MIDI-enheter om du har toner som fastnat"
+
+#: rc.cpp:375
+#, no-c-format
+msgid "Provides a metronome click for you to play along with"
+msgstr "Tillhandahåller ett metronomtick att spela efter"
+
+#: rc.cpp:378
+#, no-c-format
+msgid "Shows MIDI activity in and out of Rosegarden"
+msgstr "Visar MIDI-aktivitet in, till och ut från Rosegarden"
+
+#: rc.cpp:381
+#, no-c-format
+msgid "IN"
+msgstr "IN"
+
+#: rc.cpp:384
+#, no-c-format
+msgid "OUT"
+msgstr " UT"
+
+#: rc.cpp:387 rc.cpp:390
+#, no-c-format
+msgid "NO EVENTS"
+msgstr "INGENTING"
+
+#: rc.cpp:397
+#, no-c-format
+msgid "Record either MIDI or audio"
+msgstr "Spela in antingen MIDI eller ljud"
+
+#: rc.cpp:401
+#, no-c-format
+msgid "Loop"
+msgstr "Upprepa"
+
+#: rc.cpp:404
+#, no-c-format
+msgid "Turn on and off the loop markers (if set)"
+msgstr "Sätt på eller stäng av upprepningsmarkeringar (om inställda)"
+
+#: rc.cpp:411
+#, no-c-format
+msgid "Mutes all but the currently selected track"
+msgstr "Tystar alla utom nuvarande markerat spår"
+
+#: rc.cpp:415
+#, no-c-format
+msgid "Start loop or range here"
+msgstr "Börja loop eller omfång här"
+
+#: rc.cpp:419
+#, no-c-format
+msgid "End loop or range here"
+msgstr "Avsluta loop eller omfång här"
+
+#: rc.cpp:422
+#, no-c-format
+msgid "SIG"
+msgstr "SIG"
+
+#: rc.cpp:425
+#, no-c-format
+msgid "DIV"
+msgstr "DIV"
+
+#: rc.cpp:428
+#, no-c-format
+msgid "/16"
+msgstr "/16"
+
+#: rc.cpp:431
+#, no-c-format
+msgid "TEMPO"
+msgstr "TEMPO"
+
+#: rc.cpp:434
+#, no-c-format
+msgid "END"
+msgstr "SLUT"
+
+#: rc.cpp:437
+#, no-c-format
+msgid "BAR"
+msgstr "TAKT"
+
+#: rc.cpp:441
+#, no-c-format
+msgid "Switch between real time, musical time, and frame count"
+msgstr "Växla mellan klocktid, metronomtid och antal ramar"
+
+#: rc.cpp:445
+#, no-c-format
+msgid "Show additional controls"
+msgstr "Visa/dölj flera knappar"
+
+#: rc.cpp:449
+#, no-c-format
+msgid "Rewind"
+msgstr "Spola tillbaka"
+
+#: rc.cpp:452
+#, no-c-format
+msgid "Moves the current pointer position back one bar."
+msgstr "Flyttar nuvarande visarposition en takt bakåt."
+
+#: rc.cpp:456
+#, no-c-format
+msgid "Rewind to beginning"
+msgstr "Spola tillbaka till början"
+
+#: rc.cpp:459
+#, no-c-format
+msgid ""
+"Moves the pointer position to the start of the composition. (This may mean "
+"going forwards if the pointer is currently before the start.)"
+msgstr ""
+"Flyttar markören till kompositionens början. (Detta kan betyda att gå framåt "
+"om markören för tillfället är framför början.)"
+
+#: rc.cpp:463
+#, no-c-format
+msgid "Play/Pause"
+msgstr "Spela/Pausera"
+
+#: rc.cpp:466
+#, no-c-format
+msgid ""
+"Plays from the current pointer position, or pauses playback if already in "
+"progress."
+msgstr ""
+"Spelar upp från nuvarande visarposition, eller gör paus i uppspelningen om "
+"den redan pågår."
+
+#: rc.cpp:473
+#, no-c-format
+msgid "Stops playback or recording."
+msgstr "Stoppar uppspelning eller inspelning."
+
+#: rc.cpp:477
+#, no-c-format
+msgid "Fast forward"
+msgstr "Spola fram"
+
+#: rc.cpp:480
+#, no-c-format
+msgid "Moves the current pointer position forwards one bar."
+msgstr "Flyttar nuvarande visarposition en takt framåt."
+
+#: rc.cpp:484
+#, no-c-format
+msgid "Fast forward to end"
+msgstr "Spola fram till slutet"
+
+#: rc.cpp:487
+#, no-c-format
+msgid ""
+"Moves the pointer position to the end of the composition. (This may mean "
+"going backwards if the pointer is already beyond the end.)"
+msgstr ""
+"Flyttar markören till kompositionens slut. (Det kan betyda att gå bakåt om "
+"markören för tillfället redan är bortom slutet.)"
+
+#: rc.cpp:491
+#, no-c-format
+msgid "Display time to end"
+msgstr "Visa tid till slutet"
+
+#: ../docs/en/tips.cpp:3
+msgid ""
+"<p>To configure a track to play using a particular instrument:</p>\n"
+"&nbsp;&nbsp;* click on the track label and hold a moment<br>\n"
+"&nbsp;&nbsp;* select an output device<br>\n"
+"&nbsp;&nbsp;* select one of that device's available instruments (#1 - #16)"
+"<br>\n"
+"&nbsp;&nbsp;* adjust that instrument's output channel, program, bank, and\n"
+"controllers via the instrument parameters box\n"
+msgstr ""
+"<p>... att för att anpassa ett spår så att det spelas med ett visst "
+"instrument kan du göra så här:</p>\n"
+"&nbsp;&nbsp;* klicka på spårskylten och håll knappen nere ett ögonblick<br>\n"
+"&nbsp;&nbsp;* välj en utmatningsenhet<br>\n"
+"&nbsp;&nbsp;* välj ett av enhetens tillgängliga instrument (nummer 1 - 16)"
+"<br>\n"
+"&nbsp;&nbsp;* justera instrumentets utdatakanal, program, bank och\n"
+"effekter via rutan med instrumentparametrar?\n"
+
+#: ../docs/en/tips.cpp:13
+msgid ""
+"<p>...that Rosegarden has an autosave feature?<br><br>\n"
+"You can select your autosave interval from <b>Settings->Configure\n"
+"Rosegarden</b>.<br><br>\n"
+"When something goes awry, such as a power outage or a Rosegarden crash\n"
+"(unfortunately, it happens...) simply load the file you were working on, and "
+"you'll be given the\n"
+"option to load the autosaved version, or the unmodified original.</p>\n"
+msgstr ""
+"<p>... att Rosegarden har en funktion för att spara automatiskt?<br><br>\n"
+"Du kan välja intervall för att spara automatiskt från <b>Inställningar->\n"
+"Anpassa Rosegarden</b>.<br><br>\n"
+"När något går snett, som att strömmen försvinner eller Rosegarden kraschar\n"
+"(tyvärr händer det...), ladda bara filen som du arbetade med, så får du "
+"möjlighet att ladda\n"
+"den automatiskt sparade versionen, eller det oförändrade originalet.</p>\n"
+
+#: ../docs/en/tips.cpp:23
+msgid ""
+"<p>\n"
+"...that you can save the current document as your default studio by using\n"
+"<b>Composition -> Studio -> Save Current Document as Default Studio</b>?</"
+"p>\n"
+msgstr ""
+"<p>\n"
+"... att du kan spara det aktuella dokumentet som standardstudio genom\n"
+"att använda <b>Komposition -> Studio -> Spara nuvarande dokument som "
+"standardstudio</b>?</p>\n"
+
+#: ../docs/en/tips.cpp:30
+msgid ""
+"<p>...that your default studio is a complete Rosegarden composition that "
+"gets\n"
+"loaded every time you create a new document or import a MIDI file?</p>\n"
+msgstr ""
+"<p>... att standardstudion är en fullständig Rosegarden-komposition som\n"
+"laddas varje gång du skapar ett nytt dokument eller importerar en MIDI-fil?</"
+"p>\n"
+
+#: ../docs/en/tips.cpp:36
+msgid ""
+"<p>...that your default studio can contain instrument assignments, document "
+"properties, LilyPond headers,\n"
+"and many other things?<br><br>The default studio is a complete Rosegarden "
+"composition, so it can contain anything that you may wish to have available "
+"in each\n"
+"new document you create.</p>\n"
+msgstr ""
+"<p>... att din standardstudio kan innehålla instrumenttilldelningar, "
+"dokumentegenskaper, LilyPond-rubriker\n"
+"och mycket annat?<br><br>Standardstudion är en fullständig "
+"Rosegardenkomposition så den kan innehålla vad helst du önskar ha "
+"tillgängligt i varje nytt dokument som du skapar.</p>\n"
+
+#: ../docs/en/tips.cpp:43
+msgid ""
+"<p>...that Rosegarden will detect and create a default connection for ALSA "
+"soft\n"
+"synth applications that are started after Rosegarden is already running?</"
+"p>\n"
+msgstr ""
+"<p>... att Rosegarden detekterar och skapar en standardanslutning till\n"
+"ALSA-programvarusyntar som startas efter Rosegarden?</p>\n"
+
+#: ../docs/en/tips.cpp:49
+#, fuzzy
+msgid ""
+"<p>...that you can make your default studio override that in every "
+"Rosegarden composition you load?<br><br>If your studio setup does not change "
+"very often, and you would prefer for\n"
+"the settings in your default studio to take precedence over whatever\n"
+"studio is saved with any files you happen to load, you can make your studio "
+"the default for everything using <b>Settings -> Configure Rosegarden ->\n"
+"MIDI -> Always use default studio when loading files</b>.</p>\n"
+msgstr ""
+"<p>... att du kan få din standardstudioinställning att åsidosätta alla "
+"inställningar i de Rosegardenkompositioner du öppnar?<br><br> Om din "
+"standardstudioinställning inte ändras särskilt ofta, och du föredrar att\n"
+"inställningarna skall gälla alla kompositioner du öppnar, klicka på\n"
+" <b>Inställningar -> Beteende\n"
+" -> Använd alltid standardstudio när filer laddas?</b></p>\n"
+
+#: ../docs/en/tips.cpp:57
+msgid ""
+"<p>If you have accidentally recorded a segment so short that it does not\n"
+"appear on the canvas, which you can only hear during subsequent recording\n"
+"sessions, you can gain access to it by using <b>Composition -> Change\n"
+"Composition Start and End</b> and then setting the composition to start at a "
+"negative number.</p>\n"
+msgstr ""
+"<p>... att om du av misstag har spelat in ett segment som är så kort att det "
+"inte\n"
+"visas på duken, och som du bara kan höra under inspelningssessioner,\n"
+"kan du komma åt det med <b>Komposition -> Ändra dokumentets längd</b>\n"
+"och därefter ställa in kompositionen att börja med ett negativt tal?</p>\n"
+
+#: ../docs/en/tips.cpp:65
+msgid ""
+"<p>...that if you place a note at the wrong pitch using the notation or "
+"matrix editor, you can move it one semitone at a time with the up and down "
+"arrow keys on your keyboard?</p>\n"
+msgstr ""
+"<p>... att om du placerar en not på fel notplats, kan du flytta den ett "
+"halvtonsteg i taget uppåt eller neråt med <b>Uppil</b> respektive <b>Nerpil</"
+"b>?</p>\n"
+
+#: ../docs/en/tips.cpp:70
+msgid ""
+"<p>...that you can toggle stem directions in the notation editor by "
+"selecting\n"
+"one or more notes and using Ctrl-PageUp and Ctrl-PageDown?</p>\n"
+msgstr ""
+"<p>... att du kan byta skaftriktningar i notbehandlaren genom att markera\n"
+"en eller flera noter och använda <b>Ctrl+PageUp</b> och <b>Ctrl+PageDown</b>?"
+"</p>\n"
+
+#: ../docs/en/tips.cpp:76
+msgid ""
+"<p>...that you can change the accidental used for a note in the notation "
+"editor (without changing the pitch of the note) by selecting\n"
+"it and using the up and down arrow keys with both Ctrl and Shift pressed?</"
+"p>\n"
+msgstr ""
+"<p>... att du kan ändra tillfälliga förtecken som används för en not i "
+"notbehandlaren (utan att ändra notplatsen) genom att markera\n"
+"den och sedan trycka <b>Ctrl+Skift+Uppil/Nerpil</b>?</p>\n"
+
+#: ../docs/en/tips.cpp:82 ../docs/en/tips.cpp:93
+msgid ""
+"<p>...that you can hold down the Shift key while repositioning segments on "
+"the\n"
+"segment canvas in order to avoid the \"snap-to\" effect and exert finer "
+"control?</p>\n"
+msgstr ""
+"<p>... att du kan hålla nere <b>Skift</b> medan du flyttar omkring\n"
+"segment på segmentduken för att undvika \"positioneringsfunktionen\" och "
+"därigenom själv exakt bestämma placeringen?</p>\n"
+
+#: ../docs/en/tips.cpp:88
+msgid ""
+"<p>...that you can use the arrow tool to draw, move, and resize segments and "
+"events as well as to select them?<br><br>Drag a segment or event block to "
+"move it, drag the right edge of a block to resize it, and drag with the "
+"middle mouse button pressed to draw a new segment or event.<br><br>(Of "
+"course, the dedicated draw, move and resize tools are still quicker for "
+"repeated operations.)</p>\n"
+msgstr ""
+"<p>... att du kan använda pilverktyget till att rita, flytta och ändra "
+"storlek på segment och händelser likaväl som att markera dem?<br><br>Dra ett "
+"segment eller händelseblock för att flytta det, dra den högra kanten av det "
+"för att ändra storlek, och dra med musens mittenknapp nedtryckt för att rita "
+"ett nytt segment eller en ny händelse.<br><br>(Givetvis är de särskilda "
+"verktygen för att rita, flytta samt ändra storlek fortfarande snabbare för "
+"upprepad användning.)</p>\n"
+
+#: ../docs/en/tips.cpp:99
+msgid ""
+"<p>...that you can hold down the Shift key while repositioning or resizing "
+"events in the\n"
+"matrix view in order to avoid the \"snap-to\" effect and exert finer control?"
+"</p>\n"
+msgstr ""
+"<p>... att du kan hålla nere <b>Skift</b> medan du flyttar omkring\n"
+"händelser i matrisvyn för att undvika \"positioneringsfunktionen\" och "
+"därigenom själv exakt bestämma placeringen?<p>\n"
+
+#: ../docs/en/tips.cpp:105
+msgid ""
+"<p>...that you can edit multiple segments on multiple tracks simultaneously "
+"in\n"
+"the notation editor? Simply select the segments, then use <b>Edit -> Open "
+"in Notation Editor</b>.</p>\n"
+msgstr ""
+"<p>... att du kan redigera flera segment i flera spår samtidigt i\n"
+"notbehandlaren? Markera helt enkelt segmenten, och använd därefter "
+"<b>Redigera -> Öppna i notbehandlaren</b>.</p>\n"
+
+#: ../docs/en/tips.cpp:111
+msgid ""
+"<p>...that Rosegarden can export files for use by LilyPond, the high-quality "
+"score typesetting system?<br><br>\n"
+"From the <b>File</b> menu, navigate to <b>Export -> Export LilyPond File</"
+"b></p>\n"
+msgstr ""
+"<p>... att Rosegarden kan exportera filer till Lilypond, det högkvalitativa "
+"typsättningssystemet för noter?<br><br>\n"
+"Klicka på <b>Arkiv</b>-><b>Export</b>-><b>Exportera Lilypond-fil</b></>\n"
+
+#: ../docs/en/tips.cpp:117
+#, fuzzy
+msgid ""
+"<p>...that Rosegarden can print via LilyPond, the high-quality score "
+"typesetting system?<br><br>\n"
+"From the <b>File</b> menu, navigate to <b>Preview with LilyPond</b>. The "
+"file\n"
+"will be exported, rendered, and a preview will appear in KPDF, or one of\n"
+"several other PDF viewers, where it can then be printed as well.</p>\n"
+msgstr ""
+"<p>... att Rosegarden kan skriva ut via Lilypond, det högkvalitativa "
+"typsättningssystemet för noter?<br><br>\n"
+"Klicka på <b>Arkiv</b>-><b>Förhandsgranskning med Lilypond</b>.\n"
+"Filen kommer att exporteras, tolkas och återges i programmet\n"
+"KGhostView eller andra PDF-läsare varifrån det kan skrivas ut.</p>\n"
+
+#: ../docs/en/tips.cpp:125
+msgid ""
+"<p>...that if you use the quantizer from within the notation view, you can "
+"tell it to quantize only the timing used for notation -- making it possible "
+"to have good looking notation <b>and</b> a human MIDI performance?</p>\n"
+msgstr ""
+"<p>... att om du använder kvantiseringen inne i notvyn, kan du tala om för "
+"den att endast kvantisera notskriften, vilket gör det möjligt att ha "
+"notskrift som ser bra ut <b>och</b> ett fullständigt mänskligt MIDI-"
+"utförande?</p>\n"
+
+#: ../docs/en/tips.cpp:130
+msgid ""
+"<p>...that you can change segment labels using the controls on the Segment "
+"Parameters box\n"
+"in the main window?</p>\n"
+msgstr ""
+"<p>... att du kan ändra segmentnamn genom att använda knappen intill fältet "
+"Namn\n"
+"i avdelningen med segmentparametrar i huvudfönstret?</p>\n"
+
+#: ../docs/en/tips.cpp:136
+msgid ""
+"<p>...that the number of tracks in new documents is based on the contents "
+"of\n"
+"your autoload.rg file?\n"
+"<br><br>\n"
+"Whether you prefer to start with three tracks or 43, create a document that\n"
+"contains the desired number of tracks, plus any other studio or document "
+"properties settings\n"
+"you wish to configure, and use <b>Composition -> Studio -> Save Current "
+"Document as Default\n"
+"Studio</b> to make this your new default.</p>\n"
+msgstr ""
+"<p>... att antalet spår i nya dokument är baserat på innehållet i din "
+"autoload.rg-fil?\n"
+"<br><br>\n"
+"Om du så än väljer att starta med tre eller fyrtiotre spår: Skapa ett\n"
+"dokument som innehåller önskat antal spår och andra studio- eller\n"
+"dokumentinställningar, och använd sedan\n"
+"<b>Komposition -> Studio -> Spara nuvarande dokument som\n"
+" standardstudio</b> för att göra det till ny förinställning.</p>\n"
+
+#: ../docs/en/tips.cpp:147
+msgid ""
+"<p>...that you can change the name of a track by double clicking on the "
+"label? (The\n"
+"label must be visible for this to work.)</p>\n"
+msgstr ""
+"<p>... att du kan byta namn på ett spår genom att dubbelklicka på "
+"spårskylten?\n"
+"(Skylten måste vara synlig för att det ska fungera.)</p>\n"
+
+#: ../docs/en/tips.cpp:153
+msgid ""
+"<p>...that you can configure what happens when you double-click on a segment?"
+"<br><br>Go to <b>Settings -> Configure Rosegarden</b> and choose your "
+"preferred editing window under the <b>Behaviour</b> tab.</p>\n"
+msgstr ""
+"<p>... att du kan ställa in vad som händer när du dubbelklickar på ett "
+"segment?<br><br>Gå till <b>Inställningar -> Anpassa Rosegarden</b> och välj "
+"det redigeringsfönster du föredrar under fliken <b>Beteende</b>.</p>\n"
+
+#: ../docs/en/tips.cpp:158
+msgid ""
+"<p>...that Rosegarden is being developed as a community effort with\n"
+"contributions from around the world?<br><br>\n"
+"The four most active developers live in London (England), Cannes, "
+"Barcelona,\n"
+"and... Christiansburg? (Christiansburg is a town of about 50,000 in\n"
+"southwestern Virginia, USA.)<br><br>\n"
+"We have had contributors from elsewhere in the US, UK, Spain, Mexico, "
+"Argentina, Germany,\n"
+"Sweden, Russia, Japan, Finland, and Italy, just to name a few...</p>\n"
+msgstr ""
+"<p>... att Rosegarden utvecklas av en världsvid\n"
+"gemenskap?<br><br>\n"
+"De fyra mest aktiva utvecklarna bor i London, Cannes, Barcelona\n"
+"och Christiansburg? (Christiansburg har omkring 50 000 invånare\n"
+"och ligger i sydvästra Virginia i USA.)<br><br>\n"
+"Bidragsgivare finns även i Mexico, Argentina, Japan, Ryssland,\n"
+"Finland, Sverige och Tyskland, för att bara nämna några...</p>\n"
+
+#: ../docs/en/tips.cpp:169
+msgid ""
+"<p>...that Rosegarden is available in Spanish, French, German, Russian, "
+"Welsh, Swedish, Italian and Estonian\n"
+"translations? (Just to name a few.)<br><br>\n"
+"If you're interested in translating Rosegarden to another language, drop us "
+"a\n"
+"line at <b>[email protected]</b>.</p>\n"
+msgstr ""
+"<p>... att Rosegarden är tillgängligt i bland andra tysk, fransk, rysk,\n"
+"spansk, walesisk, italiensk och estnisk översättning?<br><br>\n"
+"Om du är intresserad av att översätta Rosegarden till andra språk,\n"
+"skriv till <b>[email protected]</b></p>\n"
+
+#: ../docs/en/tips.cpp:177
+msgid ""
+"<p>...that you can change the total number of bars in the composition via\n"
+"<b>Composition -> Change Composition Start and End</b>?</p>\n"
+msgstr ""
+"<p>... att du kan ändra det totala antalet takter i kompositionen med\n"
+"<b>Redigera -> Ändra kompositionens längd</b>?</p>\n"
+
+#: ../docs/en/tips.cpp:183
+msgid ""
+"<p>...that you can see the difference between performance and display "
+"duration\n"
+"of duration-quantized notes in the notation editor?<br><br>\n"
+"Use <b>Settings -> Show Raw Note Ruler</b> to turn on this handy\n"
+"feature.<br><br>\n"
+"<i>Note that this feature does not work in page layout view.</i></p>\n"
+msgstr ""
+"<p>... att du kan se skillnad mellan skrivet och klingande notvärde\n"
+"för kvantiserade noter i notbehandlaren?<br><br>\n"
+"Använd <b>Inställningar -> Visa linjal för obehandlade noter</b> för\n"
+"att aktivera den här praktiska funktionen.<br><br>\n"
+"<i>Observera att funktionen inte fungerar med sidutläggning.</i></p>\n"
+
+#: ../docs/en/tips.cpp:192
+msgid ""
+"<p>...that you can add tempo and time-signature changes by double-clicking "
+"on the values displayed in the transport window or tempo rulers?</p>\n"
+msgstr ""
+"<p>... att du kan lägga till ändring av tempo och taktart genom att "
+"dubbelklicka på värden som visas i spelkontrollfönstret eller på "
+"tempolinjalerna?</p>\n"
+
+#: ../docs/en/tips.cpp:197
+msgid ""
+"<p>...that the transport window can display musical time, sample frame "
+"count, and a visual metronome as well as real time?<br><br>Just click on the "
+"small button at the extreme top left of the window.</p>\n"
+msgstr ""
+"<p>... att spelkontrollfönstret kan visa taktart, antal samplade ramar, och "
+"en synlig metronom samt klocktid?<br><br>Klicka bara på den lilla knappen "
+"längst upp till vänster i fönstret.</p>\n"
+
+#: ../docs/en/tips.cpp:202
+msgid ""
+"<p>...that you can select all notes of a particular pitch in the matrix "
+"view, by shift-clicking on that pitch on the piano keyboard at the left?"
+"<br><br>If you shift-click-drag, you can select whole ranges too.</p>\n"
+msgstr ""
+"<p>... att du kan markera alla förekomster av en viss tonhöjd i matrisvyn "
+"genom att skift-klicka motsvarande tangent på pianoklaviaturen till vänster?"
+"<br><br>Om du skift-drar, kan du också välja hela tonområden.</p>\n"
+
+#: ../docs/en/tips.cpp:207
+msgid ""
+"<p>...that you can set a loop in the main window by clicking-and-dragging on "
+"the time ruler with Shift pressed?<br><br>(If the ruler isn't visible, use "
+"<b>Settings -> Show Rulers</b>.)</p>\n"
+msgstr ""
+"<p>... att du kan ställa in en upprepning i huvudfönstret genom att skift-"
+"dra på tidslinjalen?<br><br> (Om linjalen inte syns, använd <b>Inställningar "
+"-> Visa linjaler</b>.)</p>\n"
+
+#: ../docs/en/tips.cpp:212
+msgid ""
+"<p>...that if you're editing a section in the matrix or notation view, you "
+"can\n"
+"set that section to loop while you edit it?<br><br>Select it and use "
+"<b>Tools ->\n"
+"Local Cursor -> Set Loop to Selection</b>, then hit Play.</p><br><br>\n"
+"<i>This feature does not work quite as well for compositions that include "
+"sampled\n"
+"audio.</i>\n"
+msgstr ""
+"<p>... att om du redigerar ett avsnitt i matris- eller notbehandlaren kan\n"
+"du låta det upprepas medan du redigerar det?<br><br>Markera avsnittet och\n"
+"klicka på <b>Verktyg</b>-><b>Lokal markör</b>-><b>Upprepa\n"
+"markering<b/>, klicka sedan på Spela</p><br><br>\n"
+"<i>Denna funktion är inte lika bra med kompositioner som innehåller samplade "
+"ljud.</i>\n"
+
+#: ../docs/en/tips.cpp:221
+msgid ""
+"<p>...if you have more than one note or controller event at the same time, "
+"you\n"
+"can use the [ and ] keys to flip the stack of events around on the "
+"controller\n"
+"and velocity rulers in order to bring the item you wish to adjust into\n"
+"focus.</p>\n"
+msgstr ""
+"<p>... att om du har fler än en not eller effekthändelse samtidigt, kan\n"
+"du använda tangenterna <b>[</b> och <b>]</b> för att flytta runt\n"
+"följden av händelser i effektenheten och på\n"
+"ljudstyrkelinjalerna för att få objektet som du vill justera i fokus?</p>\n"
+
+#: ../docs/en/tips.cpp:229
+msgid ""
+"<p>...that the notation view shows you notes using their display duration, "
+"while the\n"
+"matrix allows you to edit their performance duration?<br><br>\n"
+"<i>Be careful with tied notes in the matrix. It is not apparent that they "
+"are\n"
+"tied, and if you split up a pair of tied notes, subsequent notation views "
+"will\n"
+"be confused and unhappy. This is an old bug that has been on our TODO list\n"
+"for years. Sorry about that, folks. Patches welcome.</i>\n"
+"</p>\n"
+msgstr ""
+"<p>... att medan notbehandlaren visar noterna med sina notvärden\n"
+"tillåter matrisbehandlaren redigering av deras klingande\n"
+"längder?<p/><br><br>\n"
+"<i>Var försiktig med bundna noter i matrisbehandlaren; det är inte uppenbart "
+"att de är bundna, och om du delar ett par bundna noter\n"
+"kommer notbilden att se rörig ut. Detta är ett gammalt fel som har\n"
+"stått på vår Att-göra-lista i åratal. Ledsen för det, gott folk. Datalappar "
+"välkomna.</i>\n"
+
+#: ../docs/en/tips.cpp:240
+#, fuzzy
+msgid ""
+"<p>If you're working with a human performance and you need to insert some "
+"new\n"
+"notes, these new notes will sound for their entire written duration. To "
+"blend\n"
+"these new notes into a human performance, select them, then use <b>Adjust -> "
+"Interpret...</b> \n"
+"from the notation view to interpret any marks and massage their "
+"performance\n"
+"durations to something less mechanical.</p>\n"
+msgstr ""
+"<p>... att om du i notvyn arbetar med ett mänskligt utförande och behöver "
+"lägga till ytterligare\n"
+"några toner, ljuder de nya tonerna med hela sina notvärden? För att infoga\n"
+"de nya tonerna i ett mänskligt utförande, markera noterna och använd "
+"därefter <b>Justera -> Noter -> \n"
+"Tolka</b> för att tolka eventuella föredragsbeteckningar och justera\n"
+"noternas värden vid utförandet till något mindre mekaniskt.</p>\n"
+
+#: ../docs/en/tips.cpp:249
+msgid ""
+"<p>...that Rosegarden can export certain things to LilyPond that it cannot "
+"yet\n"
+"display within its own native interface?<br><br>These new directives can be "
+"inserted\n"
+"via the <b>T</b> text insert tool in the notation view.<br><br>\n"
+"Load the example files\n"
+"<b>lilypond-alternative-endings.rg</b> and <b>lilypond-directives.rg</b> for "
+"a\n"
+"demonstration of how to use the new exportable directives.<br><br>\n"
+"Use <b>File -> Preview with\n"
+"LilyPond</b> to see what they look like on the exported page.<br><br>\n"
+"<i>Be sure to turn on\n"
+"<b>Settings -> Show LilyPond Directives</b> and <b>Show Annotations</b> "
+"within\n"
+"the notation view.</i></p>\n"
+msgstr ""
+"<p>... att Rosegarden nu kan exportera vissa saker som ännu\n"
+"inte kan visas i dess eget gränssnitt?<br><br>\n"
+"Dessa nya saker kan infogas genom att klicka på verktyget <b>T</b> i "
+"notbehandlaren.<br><br>\n"
+"Öppna exempelfilerna\n"
+"<b>lilypond-alternative-endings.rg</b> och\n"
+"<b>lilypond-directives.rg</b> för\n"
+"en demonstration av hur man använder sig av denna\n"
+"exportfunktion.<br><br>\n"
+"Klicka på <b>Arkiv -> Förhandsgranskning med\n"
+" LilyPond</b> för att se hur det ser ut på den exporterade sidan.<br><br>\n"
+"<i>Förvissa dig om att aktivera\n"
+"<b>Inställningar -> Visa LilyPond-direktiv</b> and <b>Visa anteckningar</b> "
+"i\n"
+"notbehandlaren.</i></p>\n"
+
+#: ../docs/en/tips.cpp:264
+msgid ""
+"<p>...that Rosegarden has track parameters allowing you to <b>Create "
+"segments with:</b> certain\n"
+"properties by default?<br><br>You can pre-select the clef, transposition, "
+"colour, and specify\n"
+"the highest and lowest playable notes (notes outside this range display in\n"
+"red by default). Then draw a segment with the pencil, or record one, and "
+"any\n"
+"new segments created on this track will take these properties as segment\n"
+"parameters.<br><br>\n"
+"<i>These parameters do not apply to audio tracks.</i></p>\n"
+msgstr ""
+"<p>... att Rosegarden nu har spårparametrar som låter dig skapa segment med "
+"vissa förvalda egenskaper? Du kan välja klav,\n"
+"transposition, omfång och spårfärg.\n"
+"Varje nytt segment du skapar på\n"
+"ett sådant spår får de egenskaper\n"
+"du har angivit i\n"
+"spårparameterrutan.\n"
+"<i>Dessa parametrar tillämpas inte på audiospår.</i>\n"
+
+#: ../docs/en/tips.cpp:275
+msgid ""
+"<p>...that Rosegarden has a database of preset parameters describing more "
+"than 300\n"
+"musical instruments from the real world, grouped into several convenient\n"
+"categories?<br><br>Each preset contains a clef, transposition, and playable "
+"range\n"
+"suggestions for both amateur and professional players.<br><br>Click the\n"
+"<b>Load</b> button in the new track parameters box to get started! <i>(If "
+"you\n"
+"do not see a <b>Load</b> button, be sure your parameter panel is set for\n"
+"tabbed mode, rather than stacked mode.)</i> <br><br> <i>(Special thanks to "
+"Magnus\n"
+"Johansson for assembling this extraordinary database.)</i></p>\n"
+msgstr ""
+"<p>... att Rosegarden nu har en databas på förinställningar och egenskaper "
+"för över 300\n"
+"musikinstrument indelade i kategorier?\n"
+"<br><br>Varje instrument har förinställningar av klav, transposition och\n"
+"omfång för både amatörmusiker och professionella.<br><br>\n"
+"Klicka på knappen <b>Ladda</b> i den nya spårparameterrutan för\n"
+"att köra igång!<i>Om du inte ser <b>Ladda</b>-knappen, förvissa dig\n"
+"om att parameterrutan visas med flikar.</i><br><br>\n"
+"<i>(Särskilt tack till Magnus Johansson för sammanställningen av\n"
+"denna extraordinära databas.)</i></p>\n"
+
+#: ../docs/en/tips.cpp:287
+msgid ""
+"<p>...that when exporting to Lilypond, you can merge tracks that have the "
+"same name onto a single staff?<br><br>For example, if there are three voices "
+"in a single part, write each\n"
+"voice as an independent segment/staff, each on a separate track. Give all\n"
+"three tracks the same name, and select <b>[x] Merge tracks that have the "
+"same\n"
+"name</b> from the options dialog that appears when you export to, or "
+"preview\n"
+"with LilyPond.<br><br>\n"
+"<i>The tracks must have a non-default name for this to work.</i></p>\n"
+msgstr ""
+"<p>... att du kan exportera spår som har samma namn till ett enda\n"
+"system i Lilypond?<br><br>Om det exempelvis ska finnas tre stämmor på ett\n"
+"system: Skapa tre stämmor på varsina spår; ge alla samma namn\n"
+"och klicka på <b>Sammanför på ett system</b> i dialogfönstret somvisas när "
+"du exporterar till Lilypond. <br><br>\n"
+"<i>Spåren får inte ha av Rosegarden förinställda namn för att detta\n"
+"skall fungera.</i></p>\n"
+
+#: ../docs/en/tips.cpp:297
+#, fuzzy
+msgid ""
+" \t \n"
+"<p>...that you can use the mouse wheel to scroll up and down, scroll left "
+"and right, and zoom in and out?<br><br>Just roll the wheel to scroll up or "
+"down. Hold Alt as well to scroll left or right, or hold Ctrl to zoom in and "
+"out.</p> \t \n"
+msgstr ""
+"<p>... att du kan använda mushjulet för att bläddra upp och ner eller "
+"vänster och höger samt zooma in och ut?<br><br>Snurra bara på hjulet för att "
+"bläddra upp eller ner. Håll ner Alt för att bläddra vänster eller höger, "
+"eller Ctrl för att zooma in eller ut.</p> \t \n"
+
+#: ../docs/en/tips.cpp:303
+#, fuzzy
+msgid ""
+" \t \n"
+"<p>...that you can time-stretch an audio segment -- stretching or squashing "
+"a\n"
+"sample to a different duration without changing its pitch -- just by\n"
+"dragging its right edge with the Ctrl key pressed?</p>\n"
+msgstr ""
+"<p>... att du kan tidssträcka ett ljudsegment -- sträcka eller trycka ihop "
+"en\n"
+" sampling till en annan längd utan att ändra tonhöjden -- bara genom\n"
+" att dra i dess högra kant med Ctrl nertryckt?</p>\n"
+
+#: ../docs/en/tips.cpp:311
+#, fuzzy
+msgid ""
+" \t \n"
+"<p>...that you can add audio to your Rosegarden composition just by dragging "
+"an audio file from your file manager and dropping it on the Rosegarden "
+"segment canvas? (Make sure you drop it on an audio track!)<br><br>You can "
+"also drop audio files from Rosegarden's audio file manager window onto the "
+"segment canvas, and from other programs onto the audio file manager.</p>\n"
+msgstr ""
+"<p>... att du kan lägga ljud till din Rosegarden-komposition bara genom att "
+"dra en ljudfil från ett filhanteringsfönster och släppa den på Rosegardens "
+"segmentduk? (Se dock till att släppa den på ett ljudspår!)<br><br>Du kan "
+"också släppa ljudfiler från Rosegarden's ljudfilshanterare på segmentduken, "
+"och från andra program i ljudfilshanteraren.</p>\n"
+
+#: ../docs/en/tips.cpp:317
+#, fuzzy
+msgid ""
+" \t \n"
+"<p>...that you can set the tempo to match the duration of an audio segment "
+"if you know it's an exact number of bars or beats long?<br><br>Just select "
+"the audio segment and use <b>Composition -> Tempo and Time Signature -> Set "
+"Tempo to Audio Segment Duration</b>.</p>\n"
+msgstr ""
+"<p>... att du kan sätta tempot att passa en ljudsegmentlängd om du känner "
+"till den exakta längden i takter eller taktslag?<br><br>Markera bara "
+"ljudsegmentet och klicka på <b>Komposition -> Tempo och taktart -> Sätt "
+"tempo i enlighet med ljudsegmentlängd</b>.</p>\n"
+
+#: ../data/fonts/mappings/fonts.cpp:1
+msgid "Feta Pixmaps"
+msgstr "Punktavbildat Feta"
+
+#: ../data/fonts/mappings/fonts.cpp:2 ../data/fonts/mappings/fonts.cpp:7
+msgid "GNU Lilypond"
+msgstr "GNU Lilypond"
+
+#: ../data/fonts/mappings/fonts.cpp:3 ../data/fonts/mappings/fonts.cpp:8
+msgid "Copyright (c) 1997--2003 Han-Wen Nienhuys and Jan Nieuwenhuizen"
+msgstr ""
+"Kopieringsrättighet (c) 1997-2003 Han-Wen Nienhuys och Jan Nieuwenhuizen"
+
+#: ../data/fonts/mappings/fonts.cpp:4 ../data/fonts/mappings/fonts.cpp:9
+#: ../data/fonts/mappings/fonts.cpp:14 ../data/fonts/mappings/fonts.cpp:19
+#: ../data/fonts/mappings/fonts.cpp:24 ../data/fonts/mappings/fonts.cpp:29
+#: ../data/fonts/mappings/fonts.cpp:34 ../data/fonts/mappings/fonts.cpp:39
+#: ../data/fonts/mappings/fonts.cpp:44 ../data/fonts/mappings/fonts.cpp:49
+#: ../data/fonts/mappings/fonts.cpp:54
+msgid "Chris Cannam"
+msgstr "Chris Cannam"
+
+#: ../data/fonts/mappings/fonts.cpp:5 ../data/fonts/mappings/fonts.cpp:40
+msgid "pixmap"
+msgstr "punktavbildat"
+
+#: ../data/fonts/mappings/fonts.cpp:6
+msgid "Feta"
+msgstr "Feta"
+
+#: ../data/fonts/mappings/fonts.cpp:10 ../data/fonts/mappings/fonts.cpp:15
+#: ../data/fonts/mappings/fonts.cpp:20 ../data/fonts/mappings/fonts.cpp:25
+#: ../data/fonts/mappings/fonts.cpp:30 ../data/fonts/mappings/fonts.cpp:35
+#: ../data/fonts/mappings/fonts.cpp:45 ../data/fonts/mappings/fonts.cpp:50
+#: ../data/fonts/mappings/fonts.cpp:55
+msgid "scalable"
+msgstr "skalbar"
+
+#: ../data/fonts/mappings/fonts.cpp:11
+msgid "Fughetta"
+msgstr "Fughetta"
+
+#: ../data/fonts/mappings/fonts.cpp:12
+msgid ""
+"Created by Blake Hodgetts; freely redistributable. See http://www.efn.org/"
+"~bch/aboutfonts.html"
+msgstr ""
+"Skapad av Blake Hodgetts; fritt spridningsbar. Se vidare http://www.efh.org/"
+"~bch/aboutfonts.html"
+
+#: ../data/fonts/mappings/fonts.cpp:13
+msgid "Copyright 1995-1999 Blake Hodgetts"
+msgstr "Kopieringsrättighet 1995-1999 Blake Hodgetts"
+
+#: ../data/fonts/mappings/fonts.cpp:16
+msgid "Inkpen"
+msgstr "Inkpen"
+
+#: ../data/fonts/mappings/fonts.cpp:17
+msgid "Inkpen is part of Sibelius, but other fonts may use the same mappings."
+msgstr ""
+"Inkpen är en del av Sibelius, men andra typsnitt får använda samma "
+"mappningar."
+
+#: ../data/fonts/mappings/fonts.cpp:18 ../data/fonts/mappings/fonts.cpp:28
+msgid "Copyright Sibelius Software Ltd"
+msgstr "Kopieringsrättighet Sibelius Software Ltd"
+
+#: ../data/fonts/mappings/fonts.cpp:21
+msgid "Maestro"
+msgstr "Maestro"
+
+#: ../data/fonts/mappings/fonts.cpp:22
+msgid "Maestro is part of Finale, but other fonts use the same mappings."
+msgstr ""
+"Maestro är en del av Finale, men andra typsnitt använder samma mappningar."
+
+#: ../data/fonts/mappings/fonts.cpp:23 ../data/fonts/mappings/fonts.cpp:33
+msgid "Copyright Coda Inc"
+msgstr "Kopieringsrättigheter Coda Inc"
+
+#: ../data/fonts/mappings/fonts.cpp:27
+msgid "Opus is part of Sibelius, but other fonts may use the same mappings."
+msgstr ""
+"Opus är en del av Sibelius, men andra typsnitt får använda samma mappningar."
+
+#: ../data/fonts/mappings/fonts.cpp:31
+msgid "Petrucci"
+msgstr "Petrucci"
+
+#: ../data/fonts/mappings/fonts.cpp:32
+msgid "Petrucci is part of Finale, but other fonts use the same mappings."
+msgstr ""
+"Petrucci är en del av Finale, men andra typsnitt använder samma mappningar."
+
+#: ../data/fonts/mappings/fonts.cpp:36
+msgid "RG21"
+msgstr "RG21"
+
+#: ../data/fonts/mappings/fonts.cpp:37
+msgid "Rosegarden 2.1"
+msgstr "Rosegarden 2.1"
+
+#: ../data/fonts/mappings/fonts.cpp:38
+msgid "Copyright (c) 1994--2001 Chris Cannam"
+msgstr "Kopieringsrättighet (c) 1994-2001 Chris Cannam"
+
+#: ../data/fonts/mappings/fonts.cpp:41
+msgid "Sonata"
+msgstr "Sonata"
+
+#: ../data/fonts/mappings/fonts.cpp:42
+msgid "Adobe"
+msgstr "Adobe"
+
+#: ../data/fonts/mappings/fonts.cpp:43
+msgid "Copyright Adobe Inc"
+msgstr "Kopieringsrättighet Adobe Inc"
+
+#: ../data/fonts/mappings/fonts.cpp:46
+msgid "Steinberg"
+msgstr "Steinberg"
+
+#: ../data/fonts/mappings/fonts.cpp:47
+msgid "The Steinberg Notation font is part of Cubase."
+msgstr "Steinbergs nottypsnitt är en del av Cubase."
+
+#: ../data/fonts/mappings/fonts.cpp:48
+msgid "Copyright Steinberg Inc"
+msgstr "Kopieringsrättighet Steinberg Inc"
+
+#: ../data/fonts/mappings/fonts.cpp:51
+msgid "Xinfonia"
+msgstr "Xinfonia"
+
+#: ../data/fonts/mappings/fonts.cpp:52
+msgid "xemo.org"
+msgstr "xemo.org"
+
+#: ../data/fonts/mappings/fonts.cpp:53
+msgid "Copyright 2001-2003 Xemus Software LLC"
+msgstr "Kopieringsrättighet 2001-2003 Xemus Software LLC"
+
+#: ../data/styles/styles.cpp:1
+msgid "Classical"
+msgstr "Oval"
+
+#: ../data/styles/styles.cpp:2
+msgid "Cross"
+msgstr "Kryss"
+
+#: ../data/styles/styles.cpp:3
+msgid "Mensural"
+msgstr "Romb"
+
+#: ../data/styles/styles.cpp:4
+msgid "Triangle"
+msgstr "Triangel"
+
+#, fuzzy
+#~ msgid "Set Quick Marker"
+#~ msgstr "Ta bort en markering"
+
+#~ msgid ""
+#~ "Finnish translation\n"
+#~ "LilyPond export fixes/improvements"
+#~ msgstr ""
+#~ "Översättning till finska\n"
+#~ "Felrättningar och förbättringar av Lilypond-export"
+
+#, fuzzy
+#~ msgid ""
+#~ "<h3>Project Packager not available</h3><p>Rosegarden could not run the "
+#~ "Project Packager.</p><p>Export and import of Rosegarden Project files "
+#~ "will not be available.</p>"
+#~ msgstr ""
+#~ "<h3>Projektpaketeraren ej tillgänglig</h3><p>Rosegarden kunde inte hitta "
+#~ "ett eller flera ytterligare program nödvändiga för att stödja "
+#~ "projektpaketeraren.</p><p>Export och import av projektfiler för "
+#~ "Rosegarden kommer inte att vara tillgängliga.<p><p>För att åtgärda detta "
+#~ "bör du installera följande program:</p>"
+
+#~ msgid ""
+#~ "<h3>Project Packager not available</h3><p>Rosegarden could not find one "
+#~ "or more of the additional programs needed to support the Rosegarden "
+#~ "Project Packager.</p><p>Export and import of Rosegarden Project files "
+#~ "will not be available.<p><p>To fix this, you should install the following "
+#~ "additional programs:</p>"
+#~ msgstr ""
+#~ "<h3>Projektpaketeraren ej tillgänglig</h3><p>Rosegarden kunde inte hitta "
+#~ "ett eller flera ytterligare program nödvändiga för att stödja "
+#~ "projektpaketeraren.</p><p>Export och import av projektfiler för "
+#~ "Rosegarden kommer inte att vara tillgängliga.<p><p>För att åtgärda detta "
+#~ "bör du installera följande program:</p>"
+
+#~ msgid ""
+#~ "<h3>LilyPond Preview not available</h3><p>Rosegarden could not find one "
+#~ "or more of the additional programs needed to support the LilyPond "
+#~ "previewer.</p><p>Notation previews through LilyPond will not be available."
+#~ "</p><p>To fix this, you should install the following additional programs:"
+#~ "</p>"
+#~ msgstr ""
+#~ "<h3>LilyPond-förhandsvisning ej tillgänglig</h3><p>Rosegarden kunde inte "
+#~ "hitta ett eller flera ytterligare program nödvändiga för att stödja "
+#~ "LilyPond-förhandsvisning.</p><p>Förhandsvisning av noter genom LilyPond "
+#~ "kommer ej att vara tillgänglig.</p><p>För att åtgärda detta bör du "
+#~ "installera följande program:</p>"
+
+#~ msgid "LilyPond previews not available"
+#~ msgstr "Förhandsgranskning för Lilypond ej tillgängligt"
+
+#~ msgid ""
+#~ "<h3>General audio file import not available</h3><p>Rosegarden could not "
+#~ "find one or more of the additional programs needed to support its audio "
+#~ "file conversion helper.</p><p>Support for importing additional audio file "
+#~ "types, and sample rate conversion, will not be available.</p><p>To fix "
+#~ "this, you should install the following additional programs:</p>"
+#~ msgstr ""
+#~ "<h3>Vanlig ljudfilsimport ej tillgänglig</h3><p>Rosegarden kunde inte "
+#~ "hitta ett eller flera ytterligare program nödvändiga för att stödja "
+#~ "hjälpen för ljudfilskonvertering.</p><p>Stöd för import av ytterligare "
+#~ "ljudfilstyper och samplingsnivåkonvertering kommer ej att vara "
+#~ "tillgängliga.</p><p>För att åtgärda detta bör du installera följande "
+#~ "program:</p>"
+
+#~ msgid "Audio file importer not available"
+#~ msgstr "Ljudfilsimportör ej tillgänglig"
+
+#~ msgid " Triplet Chord"
+#~ msgstr " Triolackord"
+
+#~ msgid " Chord"
+#~ msgstr " ackord"
+
+#~ msgid " Triplet"
+#~ msgstr " triol"
+
+#~ msgid "Making grace notes..."
+#~ msgstr "Skapar prydnadsnoter ..."
+
+#~ msgid "Making non-grace notes..."
+#~ msgstr "Skapar huvudnoter ..."
+
+#~ msgid "Click and drag to draw an empty segment"
+#~ msgstr "Dra för att skapa ett tomt segment"
+
+#~ msgid "Marker name "
+#~ msgstr "Markeringsnamn "
+
+#~ msgid "Time Signature font"
+#~ msgstr "Teckensnitt för taktartssignatur"
+
+#~ msgid "&Halve Speed"
+#~ msgstr "H&alvera hastighet"
+
+#~ msgid "&Double Speed"
+#~ msgstr "&Dubblera hastighet"
+
+#~ msgid "Halving speed..."
+#~ msgstr "Halverar hastighet ..."
+
+#~ msgid "Doubling speed..."
+#~ msgstr "Dubblerar hastighet ..."
+
+#~ msgid "Add staff group bracket"
+#~ msgstr "Lägg till balkklammer"
+
+#~ msgid "Make subsequent bar lines hidden"
+#~ msgstr "Dölj efterföljande taktstreck"
+
+#~ msgid "Make &Grace Notes"
+#~ msgstr "Skriv pr&ydnadsnoter"
+
+#~ msgid "Change Te&mpo..."
+#~ msgstr "Te&mpo..."
+
+#~ msgid "Insert Fretboard"
+#~ msgstr "Infoga greppbräda"
+
+#~ msgid "&Restore Computed Accidentals"
+#~ msgstr "Återställ &beräknade förtecken"
+
+#~ msgid "LilyPond export/preview options"
+#~ msgstr "Exportinställningar för Lilypond"
+
+#~ msgid "LilyPond 2.6"
+#~ msgstr "Lilypond 2.6"
+
+#~ msgid "LilyPond 2.8"
+#~ msgstr "Lilypond 2.8"
+
+#, fuzzy
+#~ msgid "LilyPond 2.12"
+#~ msgstr "Lilypond 2.10"
+
+#~ msgid "Export Document Properties as \\header block"
+#~ msgstr "Exportera dokumentegenskaper som \\header-block"
+
+#, fuzzy
+#~ msgid "prime"
+#~ msgstr "Tid"
+
+#, fuzzy
+#~ msgid " and 1 octave"
+#~ msgstr "Upp en oktav"
+
+#, fuzzy
+#~ msgid " and %1 octaves"
+#~ msgstr "%1 upp en oktav"
+
+#, fuzzy
+#~ msgid "Transpose by Interval"
+#~ msgstr "Transponera"
+
+#~ msgid "Manage Files Associated with A&udio Segments"
+#~ msgstr "Hantera filer som hör ihop med l&judsegment"
+
+#~ msgid "&Add Multiple Tracks..."
+#~ msgstr "&Lägg till flera spår ..."
+
+#~ msgid "Split Segments at Time"
+#~ msgstr "Dela segment vid tid"
+
+#~ msgid "Split Segment at Time"
+#~ msgstr "Dela segment vid tid"
+
+#~ msgid "Add Multiple Tracks"
+#~ msgstr "Lägg till flera spår"
+
+#~ msgid ""
+#~ "1.2.3 splash screen photo (of Michael's rose garden)\n"
+#~ "new splash screen photo (of Michael McIntyre's\n"
+#~ "instruments along with a rose from the garden of Hassell Arnold Hale, "
+#~ "1916-2006,\n"
+#~ "may he rest in peace)"
+#~ msgstr ""
+#~ "Vinjettfönsterfoto för version 1.2.3 från Michaels rosgård\n"
+#~ "Nytt vinjettfönsterfoto på Michael McIntyres instrument tillsammans med "
+#~ "en ros från Hassel Arnold Hales (1916 - 2006) trädgård; må han vila i "
+#~ "frid."
+
+#~ msgid "Show tool context help in status bar"
+#~ msgstr "Visa verktygs kontexthjälp i statuslisten"
+
+#~ msgid "Event List"
+#~ msgstr "Händelselista"
+
+#~ msgid "External Editors"
+#~ msgstr "Externa editorer"
+
+#~ msgid "Enable auto-save"
+#~ msgstr "Aktivera spara automatiskt"
+
+#~ msgid "Auto-save"
+#~ msgstr "Spara automatiskt"
+
+#~ msgid "Show detailed status"
+#~ msgstr "Visa detaljerad status"
+
+#~ msgid "JACK command (including path as necessary)"
+#~ msgstr "JACK-kommando (inklusive sökvägar om nödvändigt)"
+
+#~ msgid ""
+#~ "Longer buffers usually improve playback quality, but use more memory and "
+#~ "slow response."
+#~ msgstr ""
+#~ "Längre buffrar förbättrar oftast uppspelningskvaliteten, men använder mer "
+#~ "minne och ger längre svarstider."
+
+#~ msgid "Event read-ahead"
+#~ msgstr "Läs händelser i förväg"
+
+#~ msgid "Audio mix buffer"
+#~ msgstr "Buffer för ljudmixning"
+
+#~ msgid "Audio file read buffer"
+#~ msgstr "Buffer för läsning av ljudfil"
+
+#~ msgid "Audio file write buffer"
+#~ msgstr "Buffer för skrivning av ljudfil"
+
+#~ msgid "Per-file limit for cacheable audio files"
+#~ msgstr "Gräns för varje cachebar ljudfil"
+
+#~ msgid "20 msec"
+#~ msgstr "20 ms"
+
+#~ msgid "5 sec"
+#~ msgstr "5 s"
+
+#~ msgid "per file"
+#~ msgstr "per fil"
+
+#~ msgid "32KB"
+#~ msgstr "32 KB"
+
+#~ msgid "32MB"
+#~ msgstr "32 MB"
+
+#~ msgid "Audio mix and monitor mode:"
+#~ msgstr "Ljudmixer och övervakningsläge:"
+
+#~ msgid "Low latency"
+#~ msgstr "Låg latenstid"
+
+#~ msgid "Buffered"
+#~ msgstr "Buffrad"
+
+#~ msgid "Create post-fader outputs for audio instruments"
+#~ msgstr "Skapa utgångar för efternertoning av ljudinstrument"
+
+#~ msgid "Create post-fader outputs for submasters"
+#~ msgstr "Skapa utgångar för efternertoning av delnivåer"
+
+#~ msgid "Record and Mix"
+#~ msgstr "Spela in och mixa"
+
+#~ msgid "JACK transport mode"
+#~ msgstr "JACK-spelläge"
+
+#~ msgid "Sync"
+#~ msgstr "Synkronisera"
+
+#~ msgid "Synchronisation"
+#~ msgstr "Synkronisering"
+
+#~ msgid "%1 msec / %2 KB %3"
+#~ msgstr "%1 ms / %2 KB %3"
+
+#~ msgid "%1 msec / %2 MB %3"
+#~ msgstr "%1 ms / %2 MB %3"
+
+#~ msgid "%1 sec / %2 KB %3"
+#~ msgstr "%1 s / %2 KB %3"
+
+#~ msgid "%1 sec / %2 MB %3"
+#~ msgstr "%1 sek / %2 MB %3"
+
+#~ msgid "%1 msec"
+#~ msgstr "%1 ms"
+
+#~ msgid "%1 sec"
+#~ msgstr "%1 sek"
+
+#~ msgid "%1 KB"
+#~ msgstr "%1 KB"
+
+#~ msgid "%1 MB"
+#~ msgstr "%1 MB"
+
+#~ msgid "Other fonts"
+#~ msgstr "Annan"
+
+#~ msgid "Rescan available fonts"
+#~ msgstr "Läs in tillgängliga typsnitt"
+
+#~ msgid ""
+#~ "Rosegarden can apply automatic quantization to recorded or imported MIDI "
+#~ "data for notation purposes only. This does not affect playback, and does "
+#~ "not affect editing in any of the views except notation."
+#~ msgstr ""
+#~ "Rosegarden kan för notationen tillämpa automatisk kvantisering av "
+#~ "inspelad eller importerad MIDI-data. Detta påverkar inte uppspelning, och "
+#~ "påverkar inte redigering i någon av vyerna utom notvyn."
+
+#~ msgid "Sequencer"
+#~ msgstr "Spelare"
+
+#~ msgid "Sequencer Settings"
+#~ msgstr "Spelarinställningar"
+
+#~ msgid "Audio auto-fade"
+#~ msgstr "Automatisk ljudtoning"
+
+#~ msgid "Fade in"
+#~ msgstr "Tona in"
+
+#~ msgid "Fade out"
+#~ msgstr "Tona ut"
+
+#~ msgid "Range"
+#~ msgstr "Omfång"
+
+#~ msgid ""
+#~ "_: used internally for spacing\n"
+#~ "High: ----"
+#~ msgstr ""
+#~ "_: används internt för utrymmestilldelning\n"
+#~ "Högsta: ----"
+
+#~ msgid "High: ---"
+#~ msgstr "Högsta: ---"
+
+#~ msgid "Low: ----"
+#~ msgstr "Lägsta: ---"
+
+#~ msgid " ms"
+#~ msgstr " ms"
+
+#~ msgid "&Fretboard"
+#~ msgstr "Grepp&bräda"
+
+#~ msgid "Restore &Computed Positions"
+#~ msgstr "Åte&rställ beräknade positioner"
+
+#~ msgid ""
+#~ "You encountered an enharmonic resolution bug somewhere during this "
+#~ "operation. You may wish to save a copy of your current composition and "
+#~ "email it to [email protected] for analysis.\n"
+#~ "\n"
+#~ "In the meantime, you will probably need to make manual adjustments to the "
+#~ "file you've just exported."
+#~ msgstr ""
+#~ "Du stötte på ett fel i enharmonisk upplösning någonstans under åtgärden. "
+#~ "Du kan vilja spara en kopia av din nuvarande komposition och skicka den "
+#~ "till [email protected] med e-post för analys.\n"
+#~ "\n"
+#~ "Under tiden måste du troligen göra manuella justeringar i filen du just "
+#~ "har exporterat."
+
+#~ msgid "&Tempo and Time Signature"
+#~ msgstr "&Tempo och taktart"
+
+#~ msgid "&Split..."
+#~ msgstr "&Dela..."
+
+#~ msgid "&Editor Tools"
+#~ msgstr "R&edigeringsverktyg"
+
+#~ msgid "&Beams"
+#~ msgstr "&Balkar"
+
+#~ msgid "&Indications"
+#~ msgstr "Bindebågar och föredragsbeteckn&ingar"
+
+#~ msgid "Trip&lets and Tuplets"
+#~ msgstr "Annande&lning"
+
+#~ msgid "S&tem Direction"
+#~ msgstr "Sk&aftriktning"
+
+#~ msgid "&Clear"
+#~ msgstr "&Rensa"
+
+#~ msgid "A&dd Alias"
+#~ msgstr "Lägg &till alias"
+
+#~ msgid "C&ancel"
+#~ msgstr "&Avbryt"
+
+#~ msgid "&Ok"
+#~ msgstr "&OK"
+
+#~ msgid "Toggle &Mode"
+#~ msgstr "Av-och-på-&läge"
+
+#~ msgid "Scale"
+#~ msgstr "Skala om"
+
+#~ msgid "Modifier"
+#~ msgstr "Modifierare"
+
+#~ msgid "Suffix"
+#~ msgstr "Suffix"
+
+#~ msgid "&New"
+#~ msgstr "&Ny"
+
+#~ msgid "Additivies"
+#~ msgstr "Tillägg"
+
+#~ msgid "Fingering"
+#~ msgstr "Fingersättning"
+
+#~ msgid ""
+#~ "<p>When exporting to LilyPond, you will see extra empty bars if the "
+#~ "Rosegarden\n"
+#~ "composition is longer than the notation it contains. To cure this, "
+#~ "navigate\n"
+#~ "to <b>Composition -> Change Composition Start and End...</b> then set "
+#~ "<b>End\n"
+#~ "Bar</b> to the end of your notation.</p>\n"
+#~ msgstr ""
+#~ "<p>...att vid export till Lilypond visas tillagda tomma takter om\n"
+#~ "Rosegarden-kompositionen är längre än noterna den innehåller. För att\n"
+#~ "råda bot på detta klicka på <b>Komposition</b>-><b>Ändra\n"
+#~ "kompositionens längd</b>och ange sista takten i kompositionen.</p>\n"
+
+#~ msgid ""
+#~ "<p>You can use the mouse wheel to scroll up and down, or to scroll left "
+#~ "and right (by holding the Alt key at the same time), or to zoom in and "
+#~ "out (by holding the Control key).</p>\n"
+#~ msgstr ""
+#~ "<p> ...du kan använda mushjulet för att bläddra upp eller ner; håller du "
+#~ "även ned Alt kan du istället bläddra åt höger eller vänster; med Kontroll "
+#~ "nedtryckt kan du zooma in eller ut.</p>\n"
+
+#~ msgid "LilyPond 2.4"
+#~ msgstr "Lilypond 2.4"
+
+#~ msgid "Paper size to use in \\paper block"
+#~ msgstr "Pappersstorlek att använda i \\paper block"
+
+#~ msgid "LilyPond font size"
+#~ msgstr "Teckenstorlek för Lilypond"
+
+#~ msgid "Do not export muted tracks"
+#~ msgstr "Exportera inte tysta spår"
+
+#~ msgid "Write bar checks at end of measures"
+#~ msgstr "Skriv taktkontroller i slutet av takter"
+
+#~ msgid "Half Speed"
+#~ msgstr "Halv hastighet"
+
+#~ msgid "Double Speed"
+#~ msgstr "Dubbel hastighet"
+
+#~ msgid " (takes effect only from next restart)"
+#~ msgstr "(träder i kraft först vid nästa omstart)"
+
+#~ msgid "&Select"
+#~ msgstr "&Markera"
+
+#~ msgid "Snap to 1/64"
+#~ msgstr "Lås till 1/64"
+
+#~ msgid "Snap to 1/48"
+#~ msgstr "Lås till 1/48"
+
+#~ msgid "Snap to 1/32"
+#~ msgstr "Lås till 1/32"
+
+#~ msgid "Snap to 1/24"
+#~ msgstr "Lås till 1/24"
+
+#~ msgid "Snap to 1/16"
+#~ msgstr "Lås till 1/16"
+
+#~ msgid "Snap to 1/12"
+#~ msgstr "Lås till 1/12"
+
+#~ msgid "Snap to 1/8"
+#~ msgstr "Lås till 1/8"
+
+#~ msgid "Snap to 1/6"
+#~ msgstr "Lås till 1/6"
+
+#~ msgid "Snap to 1/4"
+#~ msgstr "Lås till 1/4"
+
+#~ msgid "Snap to &Unit"
+#~ msgstr "Lås till &enhet"
+
+#~ msgid "%1 (%2.%3s)"
+#~ msgstr "%1 (%2,%3 s)"
+
+#~ msgid "%1 (%2): %3"
+#~ msgstr "%1 (%2): %3"
+
+#~ msgid "Add Fretboard"
+#~ msgstr "Lägg till greppbräda"
+
+#~ msgid "Getting sound driver status..."
+#~ msgstr "Hämtar status för ljuddrivrutin..."
+
+#~ msgid "Distribute Audio on &MIDI"
+#~ msgstr "Distribuera ljud via &MIDI"
+
+#~ msgid "Cannot add file %1: %2"
+#~ msgstr "Kan inte lägga till filen %1: %2"
+
+#~ msgid "Enable"
+#~ msgstr "Aktivera"
+
+#~ msgid "from:"
+#~ msgstr "från:"
+
+#~ msgid "to:"
+#~ msgstr "till:"
+
+#~ msgid "unlimited"
+#~ msgstr "obegränsad"
+
+#~ msgid "Number:"
+#~ msgstr "Nummer:"
+
+#~ msgid "Value:"
+#~ msgstr "Värde:"
+
+#~ msgid "Wheel Events"
+#~ msgstr "Händelser"
+
+#~ msgid "Amount:"
+#~ msgstr "Antal:"
+
+#~ msgid "Pitch from"
+#~ msgstr "Tonhöjd från"
+
+#~ msgid "Pitch to"
+#~ msgstr "Tonhöjd till"
+
+#~ msgid "High: %1"
+#~ msgstr "Högsta: %1"
+
+#~ msgid "[+]"
+#~ msgstr "[+]"
+
+#~ msgid "&Velocity"
+#~ msgstr "Ha&stighet"
diff --git a/po/xgettext b/po/xgettext
new file mode 100755
index 0000000..1308a2e
--- /dev/null
+++ b/po/xgettext
Binary files differ
diff --git a/po/zh_CN.po b/po/zh_CN.po
new file mode 100644
index 0000000..f0fbb67
--- /dev/null
+++ b/po/zh_CN.po
@@ -0,0 +1,12572 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) 2003-2005 Free Software Foundation, Inc.
+# Liu Songhe <[email protected]>, 2003-2004.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: rosegarden4 1.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-04-24 18:19-0400\n"
+"PO-Revision-Date: 2005-02-01 19:15+0800\n"
+"Last-Translator: Liu Songhe <[email protected]>\n"
+"Language-Team: Simplified Chinese <[email protected]>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ../src/gui/dialogs/RescaleDialog.cpp:51 rc.cpp:192 rc.cpp:312
+#, no-c-format
+msgid "Rescale"
+msgstr "重定比例"
+
+#: ../src/gui/dialogs/RescaleDialog.cpp:56
+msgid "Duration of selection"
+msgstr "选中区的音长"
+
+#: ../src/gui/dialogs/RescaleDialog.cpp:62
+msgid "Adjust times of following events accordingly"
+msgstr ""
+
+#: ../src/gui/dialogs/PitchDialog.cpp:45
+#: ../src/gui/dialogs/RescaleDialog.cpp:72
+#: ../src/gui/dialogs/TimeDialog.cpp:51 ../src/gui/dialogs/TimeDialog.cpp:68
+#: ../src/gui/studio/BankEditorDialog.cpp:109
+msgid "Reset"
+msgstr "复位"
+
+#: ../src/commands/segment/SegmentSplitByPitchCommand.cpp:46
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:46
+msgid "Split by Pitch"
+msgstr "根据音色拆分"
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:54
+msgid "Starting split pitch"
+msgstr "正在开始拆分音色"
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:57
+msgid "Range up and down to follow music"
+msgstr "跟随音乐向上和向下延展"
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:63
+msgid "Duplicate non-note events"
+msgstr "复制非音符事件"
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:66
+msgid "Clef handling:"
+msgstr "谱号处理:"
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:69
+msgid "Leave clefs alone"
+msgstr "单独留下谱号"
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:70
+msgid "Guess new clefs"
+msgstr "猜测新的谱号"
+
+#: ../src/gui/dialogs/SplitByPitchDialog.cpp:71
+msgid "Use treble and bass clefs"
+msgstr "使用高音和低音谱号"
+
+#: ../src/gui/dialogs/DocumentConfigureDialog.cpp:64
+#, fuzzy
+msgid "Document Properties"
+msgstr "编辑文档属性(&R)..."
+
+#: ../src/gui/dialogs/MakeOrnamentDialog.cpp:45
+#: ../src/gui/editors/notation/NotationView.cpp:6048
+msgid "Make Ornament"
+msgstr "制作修饰符"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:183
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:179
+#: ../src/gui/dialogs/EventEditDialog.cpp:128
+#: ../src/gui/dialogs/MakeOrnamentDialog.cpp:49
+#: ../src/gui/studio/DeviceEditorDialog.cpp:74
+#: ../src/gui/studio/NameSetEditor.cpp:72
+#: ../src/gui/widgets/ColourTable.cpp:51
+msgid "Name"
+msgstr "名称"
+
+#: ../src/gui/dialogs/MakeOrnamentDialog.cpp:51
+msgid ""
+"The name is used to identify both the ornament\n"
+"and the triggered segment that stores\n"
+"the ornament's notes."
+msgstr "该名称用于同时标识修饰符和保存有修饰记号的已触发片段。"
+
+#: ../src/gui/dialogs/MakeOrnamentDialog.cpp:54
+msgid "Name: "
+msgstr "名称: "
+
+#: ../src/gui/dialogs/MakeOrnamentDialog.cpp:57
+#: ../src/gui/editors/eventlist/EventView.cpp:717
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:92
+msgid "Base pitch"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:57
+#: ../src/gui/editors/eventlist/EventView.cpp:140
+msgid "Text"
+msgstr "文本"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:66
+msgid "Specification"
+msgstr "技术规范"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:68
+msgid "Preview"
+msgstr "预览"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:72
+msgid "Text: "
+msgstr "文本:"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:79
+msgid "Style: "
+msgstr "风格:"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:90
+msgid "Dynamic"
+msgstr "动态"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:93
+msgid "Direction"
+msgstr "方向"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:96
+#, fuzzy
+msgid "Local Direction"
+msgstr "局部方向"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:63
+#: ../src/gui/dialogs/TextEventDialog.cpp:99
+#: ../src/gui/editors/tempo/TempoView.cpp:91
+msgid "Tempo"
+msgstr "节拍"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:102
+#, fuzzy
+msgid "Local Tempo"
+msgstr "局部节拍"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:105
+msgid "Lyric"
+msgstr "歌词"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:108
+#: ../src/gui/editors/notation/NotationView.cpp:4242
+msgid "Chord"
+msgstr "和弦"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:111
+msgid "Annotation"
+msgstr "符号"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:114
+#, fuzzy
+msgid "LilyPond Directive"
+msgstr "Lilypond 文件"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:138
+msgid "Verse: "
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:148
+#, fuzzy
+msgid "Dynamic: "
+msgstr "动态"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:152
+msgid "ppp"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:153
+msgid "pp"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:154
+msgid "p"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:155
+msgid "mp"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:156
+msgid "mf"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:157
+msgid "f"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:158
+#, fuzzy
+msgid "ff"
+msgstr "关闭"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:159
+#, fuzzy
+msgid "fff"
+msgstr "关闭"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:160
+msgid "rfz"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:161
+msgid "sf"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:165
+#, fuzzy
+msgid "Direction: "
+msgstr "方向"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:174
+msgid " ,"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:175
+msgid "D.C. al Fine"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:176
+msgid "D.S. al Fine"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:177
+#, fuzzy
+msgid "Fine"
+msgstr "过滤器"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:178
+msgid "D.S. al Coda"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:179
+#, fuzzy
+msgid "to Coda"
+msgstr " 和弦"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:180
+#, fuzzy
+msgid "Coda"
+msgstr "谱号(音部记号)"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:184
+#, fuzzy
+msgid "Local Direction: "
+msgstr "局部方向"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:188
+#, fuzzy
+msgid "accel."
+msgstr "通道"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:189
+msgid "ritard."
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:190
+msgid "ralletando"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:191
+#, fuzzy
+msgid "a tempo"
+msgstr "新建节拍"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:192
+#, fuzzy
+msgid "legato"
+msgstr "法定"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:193
+#, fuzzy
+msgid "simile"
+msgstr "过滤器"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:194
+msgid "pizz."
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:195
+#, fuzzy
+msgid "arco"
+msgstr "加强(&M)"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:196
+msgid "non vib."
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:197
+msgid "sul pont."
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:198
+#: ../src/gui/dialogs/TextEventDialog.cpp:200
+msgid "sul tasto"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:199
+msgid "con legno"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:201
+msgid "sul G"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:202
+msgid "ordinario"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:203
+#, fuzzy
+msgid "Muta in "
+msgstr "持续"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:204
+msgid "volti subito "
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:205
+msgid "soli"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:206
+msgid "div."
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:210
+#, fuzzy
+msgid "Tempo: "
+msgstr "节拍"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:214
+#: ../src/gui/dialogs/TextEventDialog.cpp:238
+msgid "Grave"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:215
+#: ../src/gui/dialogs/TextEventDialog.cpp:239
+#, fuzzy
+msgid "Adagio"
+msgstr "音频"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:216
+#: ../src/gui/dialogs/TextEventDialog.cpp:240
+msgid "Largo"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:217
+#: ../src/gui/dialogs/TextEventDialog.cpp:241
+#, fuzzy
+msgid "Lento"
+msgstr "法定"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:218
+#: ../src/gui/dialogs/TextEventDialog.cpp:242
+#, fuzzy
+msgid "Andante"
+msgstr "高级"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:219
+#: ../src/gui/dialogs/TextEventDialog.cpp:243
+#, fuzzy
+msgid "Moderato"
+msgstr "波音"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:220
+#: ../src/gui/dialogs/TextEventDialog.cpp:244
+msgid "Allegretto"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:221
+#: ../src/gui/dialogs/TextEventDialog.cpp:245
+msgid "Allegro"
+msgstr ""
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:222
+#: ../src/gui/dialogs/TextEventDialog.cpp:246
+#, fuzzy
+msgid "Vivace"
+msgstr " 大小: "
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:223
+#: ../src/gui/dialogs/TextEventDialog.cpp:247
+#, fuzzy
+msgid "Presto"
+msgstr "休止符"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:224
+#: ../src/gui/dialogs/TextEventDialog.cpp:248
+#, fuzzy
+msgid "Prestissimo"
+msgstr "演示"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:225
+#: ../src/gui/dialogs/TextEventDialog.cpp:249
+#, fuzzy
+msgid "Maestoso"
+msgstr "Maestro"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:226
+#: ../src/gui/dialogs/TextEventDialog.cpp:250
+#, fuzzy
+msgid "Sostenuto"
+msgstr "持续(&E)"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:227
+#: ../src/gui/dialogs/TextEventDialog.cpp:251
+#, fuzzy
+msgid "Tempo Primo"
+msgstr "节拍"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:234
+#, fuzzy
+msgid "Local Tempo: "
+msgstr "局部节拍"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:255
+#, fuzzy
+msgid "Directive: "
+msgstr "方向"
+
+#: ../src/gui/dialogs/TextEventDialog.cpp:312
+msgid "Example"
+msgstr "示例"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:65
+msgid "Event Filter"
+msgstr "事件过滤器"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:86
+msgid "Note Events"
+msgstr "音符事件"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:90
+msgid "lowest:"
+msgstr ""
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:93
+msgid "highest:"
+msgstr ""
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:96
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:141
+#: ../src/gui/widgets/PitchChooser.cpp:53
+msgid "Pitch:"
+msgstr "音色:"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:99
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:163
+msgid "Velocity:"
+msgstr "力度:"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:102
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:129
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:257
+msgid "Duration:"
+msgstr "音长:"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:107
+#: ../src/gui/dialogs/EventFilterDialog.cpp:114
+#: ../src/gui/dialogs/EventFilterDialog.cpp:121
+msgid "include"
+msgstr "包括"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:108
+#: ../src/gui/dialogs/EventFilterDialog.cpp:115
+#: ../src/gui/dialogs/EventFilterDialog.cpp:122
+msgid "exclude"
+msgstr ""
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:136
+#: ../src/gui/dialogs/EventFilterDialog.cpp:155
+#: ../src/gui/editors/eventlist/EventView.cpp:172
+#: ../src/gui/editors/eventlist/EventView.cpp:179
+#: ../src/gui/editors/eventlist/EventView.cpp:186
+#, fuzzy
+msgid "edit"
+msgstr "编辑器"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:141
+#: ../src/gui/dialogs/EventFilterDialog.cpp:157
+msgid "choose a pitch using a staff"
+msgstr ""
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:182
+#: ../src/gui/dialogs/EventFilterDialog.cpp:188
+msgid "longest"
+msgstr ""
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:200
+msgid "Include all"
+msgstr ""
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:203
+msgid "Include entire range of values"
+msgstr ""
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:206
+msgid "Exclude all"
+msgstr ""
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:209
+msgid "Exclude entire range of values"
+msgstr ""
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:233
+#: ../src/gui/dialogs/EventFilterDialog.cpp:234
+#, fuzzy
+msgid "shortest"
+msgstr "休止符"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:333
+#, fuzzy
+msgid "Lowest pitch"
+msgstr "音符音色:"
+
+#: ../src/gui/dialogs/EventFilterDialog.cpp:343
+#, fuzzy
+msgid "Highest pitch"
+msgstr "基调音色:"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:56
+#: ../src/gui/editors/notation/NotationView.cpp:1619
+#: ../src/gui/editors/notation/NotationView.cpp:6088
+msgid "Use Ornament"
+msgstr "使用修饰符"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:260
+#: ../src/gui/configuration/NotationConfigurationPage.h:64
+#: ../src/gui/configuration/NotationConfigurationPage.h:65
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:63
+msgid "Notation"
+msgstr "记号"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:68
+msgid "Display as: "
+msgstr "显示为: "
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:84
+msgid "Trill"
+msgstr "颤音"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:84
+msgid "Trill with line"
+msgstr "颤音加和弦"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:84
+msgid "Trill line only"
+msgstr ""
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:85
+msgid "Turn"
+msgstr "加音"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:85
+msgid "Mordent"
+msgstr "波音"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:85
+msgid "Inverted mordent"
+msgstr "反向波音"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:86
+msgid "Long mordent"
+msgstr "长波音"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:86
+msgid "Long inverted mordent"
+msgstr "长反向波音"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:94
+msgid "Text mark"
+msgstr "文本标记"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:98
+msgid " Text: "
+msgstr " 文本: "
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:104
+msgid "Performance"
+msgstr "性能"
+
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:109
+msgid "Perform using triggered segment: "
+msgstr "执行使用触发片段:"
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:75
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:123
+msgid "Perform with timing: "
+msgstr "执行使用定时的方式:"
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:81
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:129
+msgid "As stored"
+msgstr ""
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:82
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:130
+msgid "Truncate if longer than note"
+msgstr "如果超过记号长度则截掉尾部"
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:83
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:131
+msgid "End at same time as note"
+msgstr "与记号终止于相同时刻"
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:84
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:132
+msgid "Stretch or squash segment to note duration"
+msgstr ""
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:86
+#: ../src/gui/dialogs/UseOrnamentDialog.cpp:134
+msgid "Adjust pitch to note"
+msgstr ""
+
+#: ../src/gui/dialogs/PitchPickerDialog.cpp:40
+msgid "Pitch Selector"
+msgstr "音色选择器"
+
+#: ../src/gui/dialogs/BeatsBarsDialog.cpp:44
+msgid "Audio Segment Duration"
+msgstr "音频片段音长"
+
+#: ../src/gui/dialogs/BeatsBarsDialog.cpp:50
+msgid "The selected audio segment contains:"
+msgstr "选定的音频片段包含:"
+
+#: ../src/gui/dialogs/BeatsBarsDialog.cpp:59
+msgid "beat(s)"
+msgstr "拍音"
+
+#: ../src/gui/dialogs/BeatsBarsDialog.cpp:60
+msgid "bar(s)"
+msgstr ""
+
+#: ../src/gui/dialogs/TupletDialog.cpp:51
+msgid "Tuplet"
+msgstr "连音"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:58
+msgid "New timing for tuplet group"
+msgstr "为连音组新建时长"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:76
+msgid "Play "
+msgstr "播放"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:98
+msgid "in the time of "
+msgstr "在期间 "
+
+#: ../src/gui/dialogs/TupletDialog.cpp:104
+msgid "Timing is already correct: update display only"
+msgstr ""
+
+#: ../src/gui/dialogs/TupletDialog.cpp:114
+msgid "Timing calculations"
+msgstr "时长计算"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:120
+msgid "Selected region:"
+msgstr "选择区域:"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:129
+msgid "Group with current timing:"
+msgstr "具有当前时长的组:"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:135
+msgid "Group with new timing:"
+msgstr "具有新时长的组:"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:141
+msgid "Gap created by timing change:"
+msgstr "由于时长改变而产生的间隙:"
+
+#: ../src/gui/dialogs/TupletDialog.cpp:149
+msgid "Unchanged at end of selection:"
+msgstr "在选中范围末尾未改变的"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:63 rc.cpp:372
+#, no-c-format
+msgid "Metronome"
+msgstr "节拍器"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:77
+msgid "Metronome Instrument"
+msgstr "节拍器乐器"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:82
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:150
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:183
+#: ../src/gui/studio/DeviceEditorDialog.cpp:73
+#: ../src/gui/studio/DeviceManagerDialog.cpp:105
+#: ../src/gui/studio/DeviceManagerDialog.cpp:163
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:66
+msgid "Device"
+msgstr "设备"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:101
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:89
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:215
+#: ../src/gui/studio/DeviceEditorDialog.cpp:195
+#: ../src/gui/studio/DeviceEditorDialog.cpp:218
+#: ../src/gui/studio/DeviceEditorDialog.cpp:230
+#: ../src/gui/studio/DeviceManagerDialog.cpp:196
+#: ../src/gui/studio/DeviceManagerDialog.cpp:440
+#: ../src/gui/studio/DeviceManagerDialog.cpp:452
+msgid "No connection"
+msgstr "没有连接"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:112
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:111
+#: ../src/gui/editors/parameters/InstrumentParameterBox.cpp:53
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:1209
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:159
+#: ../src/gui/general/PresetHandlerDialog.cpp:92
+#: ../src/gui/studio/MidiMixerWindow.cpp:204
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:67
+msgid "Instrument"
+msgstr "乐器"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:118
+msgid "Beats"
+msgstr "拍音"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:184
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:123
+msgid "Resolution"
+msgstr "分辨率"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:309
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:139
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:205
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:125
+#: ../src/gui/editors/matrix/MatrixView.cpp:2132
+#: ../src/gui/editors/notation/NotationView.cpp:1582
+#: ../src/gui/widgets/QuantizeParameters.cpp:128
+#: ../src/gui/widgets/QuantizeParameters.cpp:301
+msgid "None"
+msgstr "无"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:126
+msgid "Bars only"
+msgstr ""
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:127
+msgid "Bars and beats"
+msgstr ""
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:128
+msgid "Bars, beats, and divisions"
+msgstr ""
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:132
+msgid "Bar velocity"
+msgstr ""
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:139
+msgid "Beat velocity"
+msgstr ""
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:146
+msgid "Sub-beat velocity"
+msgstr ""
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:155
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:324
+msgid "Pitch"
+msgstr "音色"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:160
+#, fuzzy
+msgid "for Bar"
+msgstr "起始进程条"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:161
+#, fuzzy
+msgid "for Beat"
+msgstr "节拍"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:162
+msgid "for Sub-beat"
+msgstr ""
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:166
+#, fuzzy
+msgid "Metronome Activated"
+msgstr "节拍器"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:167
+#, fuzzy
+msgid "Playing"
+msgstr "播放"
+
+#: ../src/gui/dialogs/ManageMetronomeDialog.cpp:168
+#, fuzzy
+msgid "Recording"
+msgstr "正在录制..."
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:46
+msgid "Choose Text Encoding"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:50
+msgid ""
+"\n"
+"This file contains text in an unknown language encoding.\n"
+"\n"
+"Please select one of the following estimated text encodings\n"
+"for use with the text in this file:\n"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:61
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:77
+msgid "Japanese Shift-JIS"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:62
+msgid "Unicode variable-width"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:63
+msgid "Western Europe"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:64
+msgid "Western Europe + Euro"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:65
+msgid "Eastern Europe"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:66
+msgid "Southern Europe"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:67
+msgid "Northern Europe"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:68
+#, fuzzy
+msgid "Cyrillic"
+msgstr "歌词"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:69
+msgid "Arabic"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:70
+msgid "Greek"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:71
+msgid "Hebrew"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:72
+msgid "Turkish"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:73
+msgid "Nordic"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:74
+msgid "Thai"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:75
+#, fuzzy
+msgid "Baltic"
+msgstr "节拍"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:76
+msgid "Celtic"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:78
+msgid "Traditional Chinese"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:79
+#, fuzzy
+msgid "Simplified Chinese"
+msgstr "自动同步"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:80
+msgid "Russian"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:81
+msgid "Ukrainian"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:82
+#, fuzzy
+msgid "Tamil"
+msgstr "颤音"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:117
+#, c-format
+msgid "Microsoft Code Page %1"
+msgstr ""
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:123
+#: ../src/gui/editors/matrix/MatrixView.cpp:1490
+#, fuzzy
+msgid "%1 (%2)"
+msgstr "%1 (以上)"
+
+#: ../src/gui/dialogs/IdentifyTextCodecDialog.cpp:142
+msgid ""
+"\n"
+"Example text from file:"
+msgstr ""
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:59
+#: ../src/gui/editors/tempo/TempoView.cpp:92
+msgid "Time Signature"
+msgstr "时间标记"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:82
+msgid "Time signature"
+msgstr "时间标记"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:116
+msgid "Time where signature takes effect"
+msgstr "标记生效的时间点"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:83
+#: ../src/gui/dialogs/TempoDialog.cpp:128
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:129
+#: ../src/gui/general/PresetHandlerDialog.cpp:101
+msgid "Scope"
+msgstr "范围"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:141
+#, c-format
+msgid "Insertion point is at start of measure %1."
+msgstr "插入点位于标尺 %1 的开头。"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:145
+#, c-format
+msgid "Insertion point is in the middle of measure %1."
+msgstr "插入点位于标尺 %1 的中间。"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:150
+msgid "Insertion point is at start of composition."
+msgstr "插入点位于作品的开头。"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:155
+msgid "Start measure %1 here"
+msgstr "此处设定标尺 %1 起点"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:159
+#, fuzzy, c-format
+msgid "Change time from start of measure %1"
+msgstr "从进程条 %1 的开头修改时间"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:166
+#, c-format
+msgid "Time change will take effect at the start of measure %1."
+msgstr "时间修改将在标尺 %1 的开头生效。"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:176
+#, fuzzy
+msgid "Hide the time signature"
+msgstr "隐藏时间标记"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:181
+#, fuzzy
+msgid "Hide the affected bar lines"
+msgstr "将音符捆绑于进程线等等"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:186
+msgid "Show as common time"
+msgstr "显示为普通时间"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:191
+msgid "Correct the durations of following measures"
+msgstr "校正下列标尺的音长"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:280
+msgid "Display as common time"
+msgstr "显示为普通时间"
+
+#: ../src/gui/dialogs/TimeSignatureDialog.cpp:284
+msgid "Display as cut common time"
+msgstr "显示为截止的普通时间"
+
+#: ../src/gui/dialogs/ConfigureDialog.cpp:66
+msgid "Configure Rosegarden"
+msgstr "配置玫瑰园"
+
+#: ../src/gui/dialogs/MarkerModifyDialog.cpp:53
+#: ../src/gui/dialogs/MarkerModifyDialog.cpp:61
+msgid "Edit Marker"
+msgstr ""
+
+#: ../src/gui/dialogs/MarkerModifyDialog.cpp:78
+#, fuzzy
+msgid "Marker Time"
+msgstr "起始时间:"
+
+#: ../src/gui/dialogs/MarkerModifyDialog.cpp:94
+#, fuzzy
+msgid "Marker Properties"
+msgstr "恒定属性"
+
+#: ../src/gui/dialogs/MarkerModifyDialog.cpp:100
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:554
+msgid "Text:"
+msgstr "文本:"
+
+#: ../src/gui/dialogs/MarkerModifyDialog.cpp:104
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:85
+msgid "Description:"
+msgstr "描述:"
+
+#: ../src/gui/dialogs/FileMergeDialog.cpp:46
+msgid "Merge File"
+msgstr "合并文件"
+
+#: ../src/gui/dialogs/FileMergeDialog.cpp:53
+msgid "Merge new file "
+msgstr "合并新文件"
+
+#: ../src/gui/dialogs/FileMergeDialog.cpp:56
+msgid "At start of existing composition"
+msgstr "在现有作品开头"
+
+#: ../src/gui/dialogs/FileMergeDialog.cpp:57
+msgid "From end of existing composition"
+msgstr "从现有作品的末尾"
+
+#: ../src/gui/dialogs/FileMergeDialog.cpp:61
+msgid "The file has different time signatures or tempos."
+msgstr "此文件具有不同的时间标记或节拍"
+
+#: ../src/gui/dialogs/FileMergeDialog.cpp:62
+msgid "Import these as well"
+msgstr "同时载入这些"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:171
+#: ../src/gui/dialogs/ShowSequencerStatusDialog.cpp:44
+msgid "Sequencer status"
+msgstr "音序发生器状态"
+
+#: ../src/gui/dialogs/ShowSequencerStatusDialog.cpp:48
+msgid "Sequencer status:"
+msgstr "音序发生器状态:"
+
+#: ../src/gui/dialogs/ShowSequencerStatusDialog.cpp:50
+msgid "Status not available."
+msgstr "无法获得状态。"
+
+#: ../src/gui/dialogs/ShowSequencerStatusDialog.cpp:57
+msgid "Sequencer is not running or is not responding."
+msgstr "音序发生器没有运行或没有响应。"
+
+#: ../src/gui/dialogs/ShowSequencerStatusDialog.cpp:64
+msgid "Sequencer is not returning a valid status report."
+msgstr "音序发生器没有返回一个有效的状态报告。"
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:46
+#, fuzzy
+msgid "Add Tracks"
+msgstr "添加轨道..."
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:54
+#, fuzzy
+msgid "How many tracks do you want to add?"
+msgstr "您想要添加多少个轨道?(最多 24)"
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:62
+#, fuzzy
+msgid "Add tracks"
+msgstr "删除轨道(&D)"
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:64
+msgid "At the top"
+msgstr ""
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:65
+#, fuzzy
+msgid "Above the current selected track"
+msgstr "除了当前选中的轨道外全部静音"
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:66
+#, fuzzy
+msgid "Below the current selected track"
+msgstr "除了当前选中的轨道外全部静音"
+
+#: ../src/gui/dialogs/AddTracksDialog.cpp:67
+msgid "At the bottom"
+msgstr ""
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:75
+msgid "Event Properties"
+msgstr "事件属性"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:81
+msgid "Event type:"
+msgstr "事件类型:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:117
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:251
+#: ../src/gui/editors/segment/MarkerEditor.cpp:97
+msgid "Absolute time:"
+msgstr "绝对时间:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:156
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:323
+msgid "Controller name:"
+msgstr "控制器名称:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:157
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:530
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:562
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:563
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:602
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:631
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:267
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:269
+#: ../src/gui/editors/segment/MarkerEditor.cpp:279
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:272
+#: ../src/gui/studio/AudioMixerWindow.cpp:388
+#: ../src/gui/studio/AudioMixerWindow.cpp:519
+#: ../src/gui/studio/AudioMixerWindow.cpp:683
+#: ../src/gui/studio/AudioMixerWindow.cpp:722
+#: ../src/gui/studio/AudioMixerWindow.cpp:904
+#: ../src/gui/studio/SynthPluginManagerDialog.cpp:121
+msgid "<none>"
+msgstr "<无>"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:174
+msgid "Meta string:"
+msgstr "元数据字符串:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:179
+msgid "Load data"
+msgstr "载入数据"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:181
+msgid "Save data"
+msgstr "保存数据"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:192
+msgid "Notation Properties"
+msgstr "记号属性"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:198
+msgid "Lock to changes in performed values"
+msgstr "对已经满足的数值锁定变更"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:205
+msgid "Notation time:"
+msgstr "记号时刻:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:217
+msgid "Notation duration:"
+msgstr "记号时长:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:283
+msgid "Note pitch:"
+msgstr "音符音色:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:291
+msgid "Note velocity:"
+msgstr "音符力度:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:317
+msgid "Controller number:"
+msgstr "控制器编号:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:326
+msgid "Controller value:"
+msgstr "控制器数值:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:354
+msgid "Key pitch:"
+msgstr "基调音色:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:362
+msgid "Key pressure:"
+msgstr "基调强度:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:390
+msgid "Channel pressure:"
+msgstr "通道强度:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:418
+msgid "Program change:"
+msgstr "指令列变更:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:461
+msgid "Data length:"
+msgstr "数据长度:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:462
+msgid "Data:"
+msgstr "数据:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:480
+msgid "Pitchbend MSB:"
+msgstr "音色弯曲 MSB:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:488
+msgid "Pitchbend LSB:"
+msgstr "音色弯曲 LSB:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:523
+#, fuzzy
+msgid "Indication:"
+msgstr "指标:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:553
+msgid "Text type:"
+msgstr "文本类型:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:596
+msgid "Clef type:"
+msgstr "谱号类型:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:625
+msgid "Key name:"
+msgstr "基调名称:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:674
+msgid "Unsupported event type:"
+msgstr "不支持的事件类型:"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:931
+msgid "Edit Event Time"
+msgstr "编辑事件时刻"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:943
+msgid "Edit Event Notation Time"
+msgstr "编辑事件记号时刻"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:955
+msgid "Edit Duration"
+msgstr "编辑音长"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:968
+msgid "Edit Notation Duration"
+msgstr "编辑记号音长"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:981
+msgid "Edit Pitch"
+msgstr "编辑音色"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:991
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:1016
+msgid "*.syx|System exclusive files (*.syx)"
+msgstr "*.syx|系统独占文件 (*.syx)"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:992
+msgid "Load System Exclusive data in File"
+msgstr "从文件载入系统独占数据(并非整个文件)"
+
+#: ../src/gui/dialogs/SimpleEventEditDialog.cpp:1017
+msgid "Save System Exclusive data to..."
+msgstr "保存系统独占数据到..."
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:46
+msgid "Locate audio file"
+msgstr "定位音频文件"
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:50
+msgid "&Skip"
+msgstr "跳过(&S)"
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:51
+msgid "Skip &All"
+msgstr "跳过全部(&A)"
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:52
+msgid "&Locate"
+msgstr "定位(&L)"
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:57
+msgid ""
+"Can't find file \"%1\".\n"
+"Would you like to try and locate this file or skip it?"
+msgstr ""
+"无法找到文件“%1”。\n"
+"您愿意尝试定位这个文件或者跳过它吗?"
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:71
+#, fuzzy
+msgid ""
+"%1|Requested file (%2)\n"
+"*.wav|WAV files (*.wav)"
+msgstr "*.wav|波形文件 (*.wav)"
+
+#: ../src/gui/dialogs/FileLocateDialog.cpp:74
+msgid "Select an Audio File"
+msgstr "选择一个音频文件"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:53 ../src/gui/dialogs/ClefDialog.cpp:62
+#: ../src/gui/dialogs/ClefDialog.cpp:79 ../src/gui/dialogs/ClefDialog.cpp:90
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:278
+msgid "Clef"
+msgstr "谱号(音部记号)"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:65
+msgid "Existing notes following clef change"
+msgstr "现有音符伴随谱号修改而变化"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:71
+msgid "Lower clef"
+msgstr "低音谱号"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:77
+msgid "Up an Octave"
+msgstr "升高一个八度音"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:84
+msgid "Down an Octave"
+msgstr "降低一个八度音"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:88
+msgid "Higher clef"
+msgstr "高音谱号"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:96
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:152
+msgid "Maintain current pitches"
+msgstr "维持当前的音色"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:99
+msgid "Transpose into appropriate octave"
+msgstr "转换成适当的八度音"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:231
+msgid "%1 down an octave"
+msgstr "%1 降低一个八度音"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:234
+msgid "%1 down two octaves"
+msgstr "%1 降低两个八度音"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:237
+msgid "%1 up an octave"
+msgstr "%1 升高一个八度音"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:240
+msgid "%1 up two octaves"
+msgstr "%1 升高两个八度音"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:249
+msgid "Treble"
+msgstr "高音"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:251
+#, fuzzy
+msgid "French violin"
+msgstr "自动同步"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:253
+#, fuzzy
+msgid "Soprano"
+msgstr "强音(&F)"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:255
+#, fuzzy
+msgid "Mezzo-soprano"
+msgstr "强音(&F)"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:257
+msgid "Alto"
+msgstr "女低音"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:259
+msgid "Tenor"
+msgstr "男高音"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:261
+#, fuzzy
+msgid "C-baritone"
+msgstr "音长"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:263
+#, fuzzy
+msgid "F-baritone"
+msgstr "音长"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:265
+msgid "Bass"
+msgstr "低音"
+
+#: ../src/gui/dialogs/ClefDialog.cpp:267
+#, fuzzy
+msgid "Sub-bass"
+msgstr "低音"
+
+#: ../src/gui/dialogs/CountdownDialog.cpp:52
+msgid "Recording..."
+msgstr "正在录制..."
+
+#: ../src/gui/dialogs/CountdownDialog.cpp:60
+msgid "Recording time remaining: "
+msgstr "录制时间剩余:"
+
+#: ../src/gui/dialogs/CountdownDialog.cpp:120
+msgid "Just how big is your hard disk?"
+msgstr "您的硬盘到底有多大?"
+
+#: ../src/gui/dialogs/CountdownDialog.cpp:154
+#, fuzzy
+msgid "Recording beyond end of composition: "
+msgstr "录制时间剩余:"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:52
+msgid "Specify Interval"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:58
+msgid "Reference note:"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:59
+#, fuzzy
+msgid "Target note:"
+msgstr "4 分音符"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:68
+#: ../src/gui/dialogs/IntervalDialog.cpp:315
+msgid "a perfect unison"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:76
+msgid "Effect on Key"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:77
+#, fuzzy
+msgid "Transpose within key"
+msgstr "变换到这个基调"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:79
+#, fuzzy
+msgid "Change key for selection"
+msgstr "在选中范围末尾未改变的"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:89
+msgid ""
+"Adjust segment transposition in opposite direction (maintain audible pitch)"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:190
+#: ../src/gui/dialogs/IntervalDialog.cpp:220
+msgid "a diminished"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:192
+#: ../src/gui/dialogs/IntervalDialog.cpp:222
+msgid "an augmented"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:194
+#: ../src/gui/dialogs/IntervalDialog.cpp:224
+msgid "a doubly diminished"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:196
+#: ../src/gui/dialogs/IntervalDialog.cpp:226
+msgid "a doubly augmented"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:198
+#: ../src/gui/dialogs/IntervalDialog.cpp:228
+msgid "a triply diminished"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:200
+#: ../src/gui/dialogs/IntervalDialog.cpp:230
+msgid "a triply augmented"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:202
+msgid "a quadruply diminished"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:204
+#: ../src/gui/dialogs/IntervalDialog.cpp:232
+msgid "a quadruply augmented"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:206
+#: ../src/gui/dialogs/IntervalDialog.cpp:234
+msgid "a perfect"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:208
+#: ../src/gui/dialogs/IntervalDialog.cpp:236
+msgid "an (unknown, %1)"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:216
+#, fuzzy
+msgid "a minor"
+msgstr "男高音"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:218
+msgid "a major"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:239
+#, fuzzy
+msgid "an (unknown)"
+msgstr "未知"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:248
+#: ../src/gui/dialogs/IntervalDialog.cpp:251
+#, fuzzy
+msgid "%1 octave"
+msgstr "%1 升高一个八度音"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:254
+#, fuzzy
+msgid "%1 unison"
+msgstr "单位"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:258
+#, fuzzy
+msgid "%1 second"
+msgstr "秒:"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:261
+#, fuzzy
+msgid "%1 third"
+msgstr "其它"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:264
+#, fuzzy
+msgid "%1 fourth"
+msgstr "%1 平坦化"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:267
+#, fuzzy
+msgid "%1 fifth"
+msgstr "音色"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:270
+#, fuzzy
+msgid "%1 sixth"
+msgstr "音色"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:273
+#, fuzzy
+msgid "%1 seventh"
+msgstr "改变事件大小"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:276
+#: ../src/gui/studio/DeviceManagerDialog.cpp:329
+#: ../src/gui/studio/DeviceManagerDialog.cpp:363
+#, c-format
+msgid "%1"
+msgstr "%1"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:287
+msgid ""
+"_n: up 1 octave and %1\n"
+"up %n octaves and %1"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:291
+#, c-format
+msgid ""
+"_n: up 1 octave\n"
+"up %n octaves"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:295
+#, fuzzy, c-format
+msgid "up %1"
+msgstr "音频 %1"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:303
+msgid ""
+"_n: down 1 octave and %1\n"
+"down %n octaves and %1"
+msgstr ""
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:307
+#, fuzzy, c-format
+msgid ""
+"_n: down 1 octave\n"
+"down %n octaves"
+msgstr "%1 降低两个八度音"
+
+#: ../src/gui/dialogs/IntervalDialog.cpp:311
+#, fuzzy, c-format
+msgid "down %1"
+msgstr "Id:%1"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:81
+msgid "Intrinsics"
+msgstr "内在(事件)"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:85
+msgid "Event type: "
+msgstr "事件类型:"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:91
+msgid "Absolute time: "
+msgstr "绝对时间:"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:101
+msgid "Duration: "
+msgstr "音长:"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:114
+msgid "Sub-ordering: "
+msgstr "辅助排序:"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:125
+msgid "Persistent properties"
+msgstr "恒定属性"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:169
+#: ../src/gui/dialogs/EventEditDialog.cpp:133
+#: ../src/gui/studio/BankEditorDialog.cpp:129
+#: ../src/gui/studio/DeviceEditorDialog.cpp:75
+msgid "Type"
+msgstr "类型"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:184
+#: ../src/gui/dialogs/EventEditDialog.cpp:135
+#: ../src/gui/dialogs/EventParameterDialog.cpp:89
+#: ../src/gui/dialogs/EventParameterDialog.cpp:93
+#: ../src/gui/dialogs/EventParameterDialog.cpp:115
+msgid "Value"
+msgstr "值"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:155
+msgid "Non-persistent properties"
+msgstr "元素属性"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:156
+msgid "These are cached values, lost if the event is modified."
+msgstr "这些是缓存值,如果事件被修改这些值将丢失。"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:170
+msgid "Name "
+msgstr "名称 "
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:172
+msgid "Type "
+msgstr "类型 "
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:174
+msgid "Value "
+msgstr "值 "
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:188
+msgid "Make persistent"
+msgstr "使其恒定"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:292
+msgid "Delete this property"
+msgstr "删除该属性"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:433
+msgid ""
+"Are you sure you want to delete the \"%1\" property?\n"
+"\n"
+"Removing necessary properties may cause unexpected behavior."
+msgstr ""
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:436
+#: ../src/gui/dialogs/EventEditDialog.cpp:469
+msgid "Edit Event"
+msgstr "编辑事件"
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:465
+msgid ""
+"Are you sure you want to make the \"%1\" property persistent?\n"
+"\n"
+"This could cause problems if it overrides a different computed value later "
+"on."
+msgstr ""
+
+#: ../src/gui/dialogs/EventEditDialog.cpp:470
+msgid "Make &Persistent"
+msgstr "使其恒定(&P)"
+
+#: ../src/gui/dialogs/PasteNotationDialog.cpp:52
+msgid "Paste type"
+msgstr "粘贴类型"
+
+#: ../src/gui/dialogs/PasteNotationDialog.cpp:72
+msgid "Make this the default paste type"
+msgstr "使之成为默认的粘贴类型"
+
+#: ../src/gui/dialogs/LyricEditDialog.cpp:53
+msgid "Edit Lyrics"
+msgstr "编辑歌词"
+
+#: ../src/gui/dialogs/LyricEditDialog.cpp:62
+msgid "Lyrics for this segment"
+msgstr "这个片段的歌词"
+
+#: ../src/gui/dialogs/LyricEditDialog.cpp:70
+#, fuzzy
+msgid "Add Verse"
+msgstr "正在添加渐弱..."
+
+#: ../src/gui/dialogs/LyricEditDialog.cpp:84
+#: ../src/gui/dialogs/LyricEditDialog.cpp:106
+#, c-format
+msgid "Verse %1"
+msgstr ""
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:59
+#, fuzzy
+msgid "Import from Device..."
+msgstr "从设备导入库..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2163
+#: ../src/gui/application/RosegardenGUIApp.cpp:2229
+#: ../src/gui/application/RosegardenGUIApp.cpp:7780
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:87
+#: ../src/sound/AudioFileManager.cpp:664
+#, c-format
+msgid "Cannot download file %1"
+msgstr "无法下载文件 %1"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:99
+#, fuzzy, c-format
+msgid "Cannot open file %1"
+msgstr "无法打开文件“%1”"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:106
+#, fuzzy, c-format
+msgid "No devices found in file %1"
+msgstr "没有找到设备于文件"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:113
+msgid "Source device"
+msgstr "源设备"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:118
+#, fuzzy
+msgid "Import from: "
+msgstr "导出音频文件"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:140
+#: ../src/gui/studio/DeviceEditorDialog.cpp:148
+#, c-format
+msgid "Device %1"
+msgstr "设备 %1"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:155
+#, fuzzy
+msgid "Import banks"
+msgstr "导入库"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:156
+#, fuzzy
+msgid "Import key mappings"
+msgstr "导出"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:157
+#, fuzzy
+msgid "Import controllers"
+msgstr "%1 控制器"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:160
+#, fuzzy
+msgid "Import device name"
+msgstr "导出设备为..."
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:166
+#, fuzzy
+msgid "Bank import behavior"
+msgstr "导入行为"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:168
+#, fuzzy
+msgid "Merge banks"
+msgstr "合并库"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:169
+#, fuzzy
+msgid "Overwrite banks"
+msgstr "覆盖库"
+
+#: ../src/gui/dialogs/ImportDeviceDialog.cpp:367
+msgid "Bank %1:%2"
+msgstr ""
+
+#: ../src/commands/segment/SegmentSplitByRecordingSrcCommand.cpp:42
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:48
+#, fuzzy
+msgid "Split by Recording Source"
+msgstr "录制输入源"
+
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:53
+#, fuzzy
+msgid "Recording Source"
+msgstr "录制输入源"
+
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:57
+#, fuzzy
+msgid "Channel:"
+msgstr "通道"
+
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:64
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:75
+#, fuzzy
+msgid "any"
+msgstr "(任何)"
+
+#: ../src/gui/dialogs/SplitByRecordingSrcDialog.cpp:69
+#, fuzzy
+msgid "Device:"
+msgstr "设备"
+
+#: ../src/gui/dialogs/UnusedAudioSelectionDialog.cpp:46
+#, fuzzy
+msgid "Select Unused Audio Files"
+msgstr "选择一个音频文件"
+
+#: ../src/gui/dialogs/UnusedAudioSelectionDialog.cpp:53
+#: ../src/gui/editors/segment/PlayListView.cpp:36
+#, fuzzy
+msgid "File name"
+msgstr "文件名:"
+
+#: ../src/gui/dialogs/UnusedAudioSelectionDialog.cpp:54
+#, fuzzy
+msgid "File size"
+msgstr "文件名:"
+
+#: ../src/gui/dialogs/UnusedAudioSelectionDialog.cpp:55
+msgid "Last modified date"
+msgstr ""
+
+#: ../src/gui/dialogs/UnusedAudioSelectionDialog.cpp:60
+msgid " (not found) "
+msgstr ""
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:105
+msgid "Audio File Manager"
+msgstr "音频文件管理器"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:126
+msgid ""
+"* Some audio files are encoded at a sample rate different from that of the "
+"JACK audio server.\n"
+"Rosegarden will play them at the correct speed, but they will sound "
+"terrible.\n"
+"Please consider resampling such files externally, or adjusting the sample "
+"rate of the JACK server."
+msgstr ""
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:132
+#, fuzzy
+msgid "&Add Audio File..."
+msgstr "添加音频文件(&A)"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:135
+msgid "&Unload Audio File"
+msgstr "卸载音频文件(&U)"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:140
+msgid "&Play Preview"
+msgstr "播放预览(&P)"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:151
+msgid "&Insert into Selected Audio Track"
+msgstr "插入选定的音轨(&I)"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:155
+msgid "Unload &all Audio Files"
+msgstr "卸载全部音频文件(&A)"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:159
+#, fuzzy
+msgid "Unload all &Unused Audio Files"
+msgstr "卸载全部未使用的音频文件(&A)"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:163
+#, fuzzy
+msgid "&Delete Unused Audio Files..."
+msgstr "卸载全部未使用的音频文件(&A)"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:167
+#, fuzzy
+msgid "&Export Audio File..."
+msgstr "导出音频文件(&E)"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:173
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:180
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:91
+msgid "Duration"
+msgstr "音长"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:181
+msgid "Envelope"
+msgstr "包络"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:182
+msgid "Sample rate"
+msgstr "采样率"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:183
+msgid "Channels"
+msgstr "通道"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:282
+msgid "<no audio files>"
+msgstr "<没有音频文件>"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:488
+msgid "*.wav|WAV files (*.wav)"
+msgstr "*.wav|波形文件 (*.wav)"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:489
+msgid "Choose a name to save this file as"
+msgstr "选择一个名称以保存该文件"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:499
+msgid "Exporting audio file..."
+msgstr "正在导出音频文件..."
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:609
+msgid ""
+"This will unload audio file \"%1\" and remove all associated segments. Are "
+"you sure?"
+msgstr "这将卸载音频文件“%1”并删除全部相关的片段。您确定吗?"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:692
+#, fuzzy
+msgid ""
+"*.wav|WAV files (*.wav)\n"
+"*.*|All files"
+msgstr ""
+"*.wav|WAV 文件 (*.wav)\n"
+"*.mp3|MP3 文件 (*.mp3)"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:697
+msgid ""
+"*.wav *.flac *.ogg *.mp3|Audio files (*.wav *.flac *.ogg *.mp3)\n"
+"*.wav|WAV files (*.wav)\n"
+"*.flac|FLAC files (*.flac)\n"
+"*.ogg|Ogg files (*.ogg)\n"
+"*.mp3|MP3 files (*.mp3)\n"
+"*.*|All files"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:704
+msgid "Select one or more audio files"
+msgstr "选择一个或更多音频文件"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:763
+msgid ""
+"This will unload all audio files and remove their associated segments.\n"
+"This action cannot be undone, and associations with these files will be "
+"lost.\n"
+"Files will not be removed from your disk.\n"
+"Are you sure?"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:800
+msgid ""
+"This will unload all audio files that are not associated with any segments "
+"in this composition.\n"
+"This action cannot be undone, and associations with these files will be "
+"lost.\n"
+"Files will not be removed from your disk.\n"
+"Are you sure?"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:865
+msgid ""
+"The following audio files are not used in the current composition.\n"
+"\n"
+"Please select the ones you wish to delete permanently from the hard disk.\n"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:875
+#, c-format
+msgid ""
+"_n: <qt>About to delete 1 audio file permanently from the hard disk.<br>This "
+"action cannot be undone, and there will be no way to recover this file."
+"<br>Are you sure?</qt>\n"
+"\n"
+"<qt>About to delete %n audio files permanently from the hard disk.<br>This "
+"action cannot be undone, and there will be no way to recover these files."
+"<br>Are you sure?</qt>"
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:525
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:888
+#, fuzzy
+msgid "File %1 could not be deleted."
+msgstr "文件 %1 已经存在"
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:921
+msgid "Change Audio File label"
+msgstr "更改音频文件标签"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:6466
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:922
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:1099
+msgid "Enter new label"
+msgstr "输入新标签"
+
+#: ../src/gui/application/RosegardenGUIView.cpp:1538
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:1086
+#, fuzzy
+msgid "Adding audio file..."
+msgstr "正在导出音频文件..."
+
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:1107
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:1112
+#, fuzzy
+msgid "Failed to add audio file. "
+msgstr "无法载入声音字体 %1"
+
+#: ../src/document/RosegardenGUIDoc.cpp:2789
+#: ../src/gui/application/RosegardenGUIApp.cpp:2736
+#: ../src/gui/application/RosegardenGUIView.cpp:1574
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:1122
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:180
+msgid "Generating audio preview..."
+msgstr "正在生成音频预览..."
+
+#: ../src/gui/application/RosegardenGUIView.cpp:1581
+#: ../src/gui/dialogs/AudioManagerDialog.cpp:1130
+msgid ""
+"Try copying this file to a directory where you have write permission and re-"
+"add it"
+msgstr "尝试复制此文件到一个您拥有写权限的目录里并重新添加它"
+
+#: ../src/gui/dialogs/TransportDialog.cpp:90 rc.cpp:357
+#, no-c-format
+msgid "Rosegarden Transport"
+msgstr "玫瑰园播放控制器"
+
+#: ../src/gui/dialogs/TransportDialog.cpp:925
+#: ../src/gui/dialogs/TransportDialog.cpp:985
+msgid "PITCH WHEEL"
+msgstr "音色轮"
+
+#: ../src/gui/dialogs/TransportDialog.cpp:929
+#: ../src/gui/dialogs/TransportDialog.cpp:989
+msgid "CONTROLLER"
+msgstr "控制器"
+
+#: ../src/gui/dialogs/TransportDialog.cpp:933
+#: ../src/gui/dialogs/TransportDialog.cpp:993
+msgid "PROG CHNGE"
+msgstr "指令列变更"
+
+#: ../src/gui/dialogs/TransportDialog.cpp:938
+#: ../src/gui/dialogs/TransportDialog.cpp:998
+msgid "PRESSURE"
+msgstr "强度"
+
+#: ../src/gui/dialogs/TransportDialog.cpp:942
+#: ../src/gui/dialogs/TransportDialog.cpp:1002
+msgid "SYS MESSAGE"
+msgstr "系统消息"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:177
+#: ../src/gui/dialogs/QuantizeDialog.cpp:40
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:127
+msgid "Quantize"
+msgstr "量化"
+
+#: ../src/gui/dialogs/QuantizeDialog.cpp:52
+msgid "Advanced"
+msgstr "高级"
+
+#: ../src/gui/dialogs/ExportDeviceDialog.cpp:42
+msgid "Export Devices..."
+msgstr "导出设备..."
+
+#: ../src/gui/dialogs/ExportDeviceDialog.cpp:47
+msgid "Export devices"
+msgstr "导出设备"
+
+#: ../src/gui/dialogs/ExportDeviceDialog.cpp:49
+msgid "Export all devices"
+msgstr "导出全部设备"
+
+#: ../src/gui/dialogs/ExportDeviceDialog.cpp:50
+msgid "Export selected device only"
+msgstr "仅导出选定的设备"
+
+#: ../src/gui/dialogs/ExportDeviceDialog.cpp:51
+msgid " (\"%1\")"
+msgstr " (“%1”)"
+
+#: ../src/gui/dialogs/CompositionLengthDialog.cpp:44
+msgid "Change Composition Length"
+msgstr "修改作品长度"
+
+#: ../src/gui/dialogs/CompositionLengthDialog.cpp:50
+msgid "Set the Start and End bar markers for this Composition"
+msgstr "为该作品设定起始和中止进程条标记"
+
+#: ../src/gui/dialogs/CompositionLengthDialog.cpp:54
+msgid "Start Bar"
+msgstr "起始进程条"
+
+#: ../src/gui/dialogs/CompositionLengthDialog.cpp:62
+msgid "End Bar"
+msgstr "终止进程条"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:62
+#, fuzzy
+msgid "LilyPond Export/Preview"
+msgstr "Lilypond 导出"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:85
+#, fuzzy
+msgid "General options"
+msgstr "常规配置"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:90
+#, fuzzy
+msgid "Advanced options"
+msgstr "高级选项"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:112
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:95
+msgid "Headers"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:106
+msgid "Basic options"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:113
+#, fuzzy
+msgid "Compatibility level"
+msgstr "Lilypond 兼容级别"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:117
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:118
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:119
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:120
+#, fuzzy, c-format
+msgid "LilyPond %1"
+msgstr "Lilypond 2.2"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:125
+#, fuzzy
+msgid "Paper size"
+msgstr "每文件"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:129
+msgid "A3"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:130
+msgid "A4"
+msgstr "A4"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:131
+msgid "A5"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:132
+msgid "A6"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:133
+msgid "Legal"
+msgstr "法定"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:134
+msgid "US Letter"
+msgstr "美国信纸"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:135
+msgid "Tabloid"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:136
+msgid "do not specify"
+msgstr "不指定"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:152
+#, fuzzy
+msgid "Font size"
+msgstr "文件名:"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:157
+#, fuzzy
+msgid "%1 pt"
+msgstr "%1 (部分)"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:169
+#, fuzzy
+msgid "Staff level options"
+msgstr "高级选项"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:176
+#, fuzzy
+msgid "Export content"
+msgstr "导出设备"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:179
+#, fuzzy
+msgid "All tracks"
+msgstr "删除轨道(&D)"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:180
+#, fuzzy
+msgid "Non-muted tracks"
+msgstr "冲击"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:181
+#, fuzzy
+msgid "Selected track"
+msgstr "选择下一轨(&N)"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:182
+#, fuzzy
+msgid "Selected segments"
+msgstr "选择全部小节(&A)"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:188
+msgid "Merge tracks that have the same name"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:198
+#, fuzzy
+msgid "Notation options"
+msgstr "记号属性"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:206
+#, fuzzy
+msgid "First"
+msgstr "休止符"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:207
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:538
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:557
+msgid "All"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:211
+msgid "Export tempo marks "
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:215
+#, fuzzy
+msgid "Export lyrics"
+msgstr "导出 \\歌词数据块"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:225
+#, fuzzy
+msgid "Export beamings"
+msgstr "导出"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:232
+msgid "Export track staff brackets"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:244
+#, fuzzy
+msgid "Layout options"
+msgstr "Lilypond 导出选项"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:257
+#, fuzzy
+msgid "Lyrics alignment"
+msgstr "这个片段的歌词"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:261
+msgid "Ragged bottom (systems will not be spread vertically across the page)"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:267
+msgid "Miscellaneous options"
+msgstr ""
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:274
+msgid "Enable \"point and click\" debugging"
+msgstr "启用“指向与点击”调试"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:279
+msgid "Export \\midi block"
+msgstr "导出 \\midi 数据块"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:284
+#, fuzzy
+msgid "No markers"
+msgstr "删除所有标记(&R)"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:285
+#, fuzzy
+msgid "Rehearsal marks"
+msgstr "删除所有标记(&R)"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:286
+#, fuzzy
+msgid "Marker text"
+msgstr "起始时间:"
+
+#: ../src/gui/dialogs/LilyPondOptionsDialog.cpp:290
+#, fuzzy
+msgid "Export markers"
+msgstr "导出为..."
+
+#: ../src/gui/dialogs/AudioSplitDialog.cpp:57
+msgid "Autosplit Audio Segment"
+msgstr "自动拆分音频片段"
+
+#: ../src/gui/dialogs/AudioSplitDialog.cpp:70
+msgid "AutoSplit Segment \""
+msgstr "自动拆分片段 “"
+
+#: ../src/gui/dialogs/AudioSplitDialog.cpp:84
+msgid "Threshold"
+msgstr "阈值"
+
+#: ../src/gui/dialogs/AudioSplitDialog.cpp:142
+msgid "<no preview generated for this audio file>"
+msgstr "<没有为这个音频文件生成预览>"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:70
+msgid "Audio Plugin"
+msgstr "音频插件"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:94
+#: ../src/gui/widgets/AudioFaderBox.cpp:136
+msgid "Editor"
+msgstr "编辑器"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:100
+msgid "Plugin"
+msgstr "插件"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:105
+msgid "Category:"
+msgstr "类别:"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:110
+msgid "Plugin:"
+msgstr "插件:"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:114
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:398
+msgid "Select a plugin from this list."
+msgstr "从这个列表中选择一个插件。"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:119
+msgid "Bypass"
+msgstr "绕过"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:121
+msgid "Bypass this plugin."
+msgstr "绕过这个插件"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:127
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:390
+msgid "<ports>"
+msgstr "<端口>"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:130
+msgid "Input and output port counts."
+msgstr "输入和输出端口记数。"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:132
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:391
+msgid "<id>"
+msgstr "<id>"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:135
+msgid "Unique ID of plugin."
+msgstr "插件唯一的 ID。"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:149
+msgid "Copy plugin parameters"
+msgstr "复制插件参数"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:155
+msgid "Paste plugin parameters"
+msgstr "粘贴插件参数"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:161
+msgid "Set to defaults"
+msgstr "设置为默认值"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:225
+msgid "(any)"
+msgstr "(任何)"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:226
+msgid "(unclassified)"
+msgstr "(未分类)"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:247
+msgid "(none)"
+msgstr "(无)"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:389
+#: ../src/gui/editors/parameters/AudioInstrumentParameterPanel.cpp:132
+#: ../src/gui/editors/parameters/AudioInstrumentParameterPanel.cpp:361
+#: ../src/gui/studio/AudioMixerWindow.cpp:685
+#: ../src/gui/studio/AudioMixerWindow.cpp:724
+#: ../src/gui/studio/AudioMixerWindow.cpp:906
+#: ../src/gui/widgets/AudioFaderBox.cpp:79
+msgid "<no plugin>"
+msgstr "<没有插件>"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:427
+msgid "This plugin has too many controls to edit here."
+msgstr "此插件受到过多的控制而无法在此处编辑。"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:438
+#, c-format
+msgid "Id: %1"
+msgstr "Id:%1"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:490
+msgid "mono"
+msgstr "单声道"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:492
+msgid "stereo"
+msgstr "立体声"
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:494
+msgid "%1 in, %2 out"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:518
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:704
+msgid "Program: "
+msgstr "指令列: "
+
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:522
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:532
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:708
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:716
+#: ../src/gui/dialogs/AudioPluginDialog.cpp:745
+msgid "<none selected>"
+msgstr "<没有选中>"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:56
+msgid "Set the %1 property of the event selection:"
+msgstr "设定 %1 的事件选择属性:"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:61
+msgid "Pattern"
+msgstr "模板"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:66
+msgid "Flat - set %1 to value"
+msgstr "平坦化 - 设定 %1 的值为"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:70
+msgid "Alternating - set %1 to max and min on alternate events"
+msgstr "交互 - 基于交互事件设定 %1 到最大和最小"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:74
+msgid "Crescendo - set %1 rising from min to max"
+msgstr "渐强 - 设定 %1 从最小到最大逐渐上升"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:78
+msgid "Diminuendo - set %1 falling from max to min"
+msgstr "减弱 - 设定 %1 从最大到最小逐渐下降"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:82
+msgid "Ringing - set %1 alternating from max to min with both dying to zero"
+msgstr "阻尼振荡 - 设定 %1 交互式地从最大到最小直至声音趋于消失"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:123
+#: ../src/gui/dialogs/EventParameterDialog.cpp:150
+msgid "First Value"
+msgstr "第一值"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:124
+#: ../src/gui/dialogs/EventParameterDialog.cpp:151
+msgid "Second Value"
+msgstr "第二值"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:132
+#: ../src/gui/dialogs/EventParameterDialog.cpp:142
+#, fuzzy
+msgid "Low Value"
+msgstr "最低有效位(LSB)值"
+
+#: ../src/gui/dialogs/EventParameterDialog.cpp:133
+#: ../src/gui/dialogs/EventParameterDialog.cpp:141
+#, fuzzy
+msgid "High Value"
+msgstr "第一值"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:56 ../src/gui/rulers/TempoRuler.cpp:127
+msgid "Insert Tempo Change"
+msgstr "插入节拍变化"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:69
+#, fuzzy
+msgid "New tempo:"
+msgstr "新建节拍"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:76
+msgid "Tap"
+msgstr ""
+
+#: ../src/gui/dialogs/TempoDialog.cpp:81
+#, fuzzy
+msgid "Tempo is fixed until the following tempo change"
+msgstr "现有的音符伴随基调修改而变化"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:82
+#, fuzzy
+msgid "Tempo ramps to the following tempo"
+msgstr "现有的音符伴随基调修改而变化"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:83
+#, fuzzy
+msgid "Tempo ramps to:"
+msgstr "节拍"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:120
+msgid "Time of tempo change"
+msgstr "节拍变化的时间"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:138
+msgid "The pointer is currently at "
+msgstr "指针当前位于 "
+
+#: ../src/gui/dialogs/TempoDialog.cpp:154
+msgid "Apply this tempo from here onwards"
+msgstr "从此向前应用这个节拍"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:158
+msgid "Replace the last tempo change"
+msgstr "替换最后一次节拍变化"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:164
+msgid "Apply this tempo from the start of this bar"
+msgstr "从该进程条开头应用这个节拍"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:167
+msgid "Apply this tempo to the whole composition"
+msgstr "应用这个节拍到整个作品"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:172
+msgid "Also make this the default tempo"
+msgstr "使该节拍也成为默认节拍"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:256
+msgid "%1.%2 s,"
+msgstr "%1.%2 秒,"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:262
+#, c-format
+msgid "at the start of measure %1."
+msgstr "位于标尺 %1 的开头。"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:266
+#, c-format
+msgid "in the middle of measure %1."
+msgstr "位于标尺 %1 的中间。"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:285
+msgid " (at %1.%2 s, in measure %3)"
+msgstr " (位于 %1.%2 秒处,属于标尺 %3)"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:302
+msgid "There are no preceding tempo changes."
+msgstr "没有前述的节拍变化。"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:310
+msgid "There are no other tempo changes."
+msgstr "没有其他节拍变化。"
+
+#: ../src/gui/dialogs/TempoDialog.cpp:328
+msgid " bpm"
+msgstr ""
+
+#: ../src/gui/dialogs/AudioPlayingDialog.cpp:42
+msgid "Playing audio file"
+msgstr "正在播放音频文件"
+
+#: ../src/gui/dialogs/AudioPlayingDialog.cpp:47
+msgid "Playing audio file \"%1\""
+msgstr "正在播放音频文件“%1”"
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:52
+#: ../src/gui/editors/matrix/MatrixView.cpp:2655
+msgid "Trigger Segment"
+msgstr "触发片段"
+
+#: ../src/gui/dialogs/TriggerSegmentDialog.cpp:61
+msgid "Trigger segment: "
+msgstr "触发片段:"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:59
+msgid "Key Change"
+msgstr "基调修改"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:77
+msgid "Key signature"
+msgstr "基调标记"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:80
+#, fuzzy
+msgid "Key transposition"
+msgstr "自动同步"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:86
+msgid "Existing notes following key change"
+msgstr "现有的音符伴随基调修改而变化"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:98
+msgid "Flatten"
+msgstr "平坦化"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:100
+msgid "Key"
+msgstr "基调"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:105
+msgid "Sharpen"
+msgstr "锐化"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:109
+msgid "Major"
+msgstr ""
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:110
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:369
+#, fuzzy
+msgid "Minor"
+msgstr "男高音"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:123
+msgid "Transpose key according to segment transposition"
+msgstr ""
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:126
+#, fuzzy
+msgid "Use specified key. Do not transpose"
+msgstr "指定的文件不存在"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:134
+msgid "Apply to current segment only"
+msgstr "仅应用到当前片段"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:137
+msgid "Apply to all segments at this time"
+msgstr "一次应用到所有片段"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:141
+msgid "Exclude percussion segments"
+msgstr ""
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:155
+msgid "Maintain current accidentals"
+msgstr "维持当前的偶然事件"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:158
+msgid "Transpose into this key"
+msgstr "变换到这个基调"
+
+#: ../src/gui/dialogs/KeySignatureDialog.cpp:331
+msgid "No such key"
+msgstr "没有这样的基调"
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:44
+#: ../src/gui/editors/notation/NotationSelector.cpp:118
+msgid "Interpret"
+msgstr "解译"
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:50
+msgid "Interpretations to apply"
+msgstr "应用解译"
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:53
+msgid "Apply text dynamics (p, mf, ff etc)"
+msgstr "使用文本标记力度强弱(p, mf, ff 等等)"
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:55
+msgid "Apply hairpin dynamics"
+msgstr "使用发夹标记力度强弱"
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:57
+msgid "Stress beats"
+msgstr "重音拍音"
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:59
+msgid "Articulate slurs, staccato, tenuto etc"
+msgstr "连音线、断音、持续等等"
+
+#: ../src/gui/dialogs/InterpretDialog.cpp:61
+msgid "All available interpretations"
+msgstr "全部可用的解译"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:316
+msgid ""
+"Attempted to launch JACK audio daemon failed. Audio will be disabled.\n"
+"Please check configuration (Settings -> Configure Rosegarden -> Audio -> "
+"Startup)\n"
+" and restart."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:325
+msgid "Starting sequencer..."
+msgstr "正在开启音序合成器..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:333
+#, fuzzy
+msgid "Initializing plugin manager..."
+msgstr "正在初始化插件管理器..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:338
+#, fuzzy
+msgid "Initializing view..."
+msgstr "正在初始化视图..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:354
+#, fuzzy
+msgid "Special Parameters"
+msgstr "小节参数"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:430
+msgid "Starting sequence manager..."
+msgstr "正在开启音序合成器管理器..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:456
+msgid "Clearing studio data..."
+msgstr "正在清除工作环境数据..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:475
+#: ../src/gui/editors/notation/NotationView.cpp:558
+msgid "Starting..."
+msgstr "已开始..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:556
+#, fuzzy
+msgid "Import Rosegarden &Project file..."
+msgstr "导入玫瑰园 2.1 文件(&R)..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:560
+msgid "Import &MIDI file..."
+msgstr "导入 MIDI 文件(&M)..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:564
+msgid "Import &Rosegarden 2.1 file..."
+msgstr "导入玫瑰园 2.1 文件(&R)..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:568
+msgid "Import &Hydrogen file..."
+msgstr "导入 Hydrogen 文件(&H)..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:572
+msgid "Merge &File..."
+msgstr "并入文件(&F)..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:576
+msgid "Merge &MIDI file..."
+msgstr "并入 MIDI 文件(&M)..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:580
+msgid "Merge &Rosegarden 2.1 file..."
+msgstr "并入玫瑰园 2.1 文件(&R)..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:584
+msgid "Merge &Hydrogen file..."
+msgstr "并入 Hydrogen 文件(&H)..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:588
+#, fuzzy
+msgid "Export Rosegarden &Project file..."
+msgstr "导入玫瑰园 2.1 文件(&R)..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:592
+msgid "Export &MIDI file..."
+msgstr "导出 MIDI 文件(&M)..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:596
+#, fuzzy
+msgid "Export &LilyPond file..."
+msgstr "导出 Lilypond 文件(&L)..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:600
+msgid "Export Music&XML file..."
+msgstr "导出 MusicXML 文件(&X)..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:604
+msgid "Export &Csound score file..."
+msgstr "导出 Csound 乐谱文件(&C)..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:608
+msgid "Export M&up file..."
+msgstr "导出 Mup 文件(&U)..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:612
+#: ../src/gui/editors/notation/NotationView.cpp:1500
+#, fuzzy
+msgid "Print &with LilyPond..."
+msgstr "正在导出 Lilypond 文件..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:616
+#: ../src/gui/editors/notation/NotationView.cpp:1504
+#, fuzzy
+msgid "Preview with Lil&yPond..."
+msgstr "正在导出 Lilypond 文件..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:620
+#, fuzzy
+msgid "Play&list"
+msgstr "播放列表"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:627
+#, fuzzy
+msgid "Rosegarden &Tutorial"
+msgstr "玫瑰园插件"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:631
+msgid "&Bug Reporting Guidelines"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:645
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:348
+#: ../src/gui/editors/segment/MarkerEditor.cpp:378
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:388
+#: ../src/gui/general/EditViewBase.cpp:190
+#: ../src/gui/studio/BankEditorDialog.cpp:318
+#: ../src/gui/studio/DeviceManagerDialog.cpp:227
+msgid "Und&o"
+msgstr "撤消(&O)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:651
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:354
+#: ../src/gui/editors/segment/MarkerEditor.cpp:384
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:394
+#: ../src/gui/general/EditViewBase.cpp:196
+#: ../src/gui/studio/BankEditorDialog.cpp:324
+#: ../src/gui/studio/DeviceManagerDialog.cpp:233
+msgid "Re&do"
+msgstr "重做(&D)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:665
+#: ../src/gui/editors/notation/NotationView.cpp:2297
+msgid "Show T&ools Toolbar"
+msgstr "显示工具工具栏(&O)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:669
+msgid "Show Trac&ks Toolbar"
+msgstr "显示轨道工具栏(&K)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:673
+msgid "Show &Editors Toolbar"
+msgstr "显示编辑工具栏(&E)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:677
+#: ../src/gui/editors/notation/NotationView.cpp:2309
+msgid "Show Trans&port Toolbar"
+msgstr "显示传送工具栏(&P)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:681
+msgid "Show &Zoom Toolbar"
+msgstr "显示缩放工具栏(&Z)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:688
+msgid "Show Tra&nsport"
+msgstr "显示播放控制器(&N)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:693
+msgid "Show Track &Labels"
+msgstr "显示轨道标签(&L)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:698
+#, fuzzy
+msgid "Show Playback Position R&uler"
+msgstr "从回放点到光标(&C)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:703
+msgid "Show Te&mpo Ruler"
+msgstr "显示节拍标尺(&M)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:708
+msgid "Show Cho&rd Name Ruler"
+msgstr "显示和弦名称标尺(&R)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:714
+msgid "Show Segment Pre&views"
+msgstr "显示小节预览(&V)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:719
+#, fuzzy
+msgid "Show Special &Parameters"
+msgstr "显示设备参数(&I)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:753
+#: ../src/gui/editors/matrix/MatrixView.cpp:641
+#: ../src/gui/editors/notation/NotationView.cpp:1772
+#, fuzzy
+msgid "&Select and Edit"
+msgstr "从当前位置到结尾选中(&E)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:758
+#: ../src/gui/editors/matrix/MatrixView.cpp:646
+msgid "&Draw"
+msgstr "绘制(&D)"
+
+#: ../src/commands/edit/EraseCommand.h:50
+#: ../src/gui/application/RosegardenGUIApp.cpp:763
+#: ../src/gui/editors/matrix/MatrixView.cpp:651
+#: ../src/gui/editors/notation/NotationView.cpp:1766
+msgid "&Erase"
+msgstr "擦除(&E)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:768
+#: ../src/gui/editors/matrix/MatrixView.cpp:656
+msgid "&Move"
+msgstr "移动(&M)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:775
+msgid "&Resize"
+msgstr "重定义大小(&R)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:782 rc.cpp:87
+#, no-c-format
+msgid "&Split"
+msgstr "分割(&R)"
+
+#: ../src/commands/segment/SegmentJoinCommand.h:53
+#: ../src/gui/application/RosegardenGUIApp.cpp:789
+msgid "&Join"
+msgstr "加入(&J)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:795
+msgid "&Harmonize"
+msgstr "调合(&H)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:806
+#: ../src/gui/rulers/TempoRuler.cpp:157
+#, fuzzy
+msgid "Open Tempo and Time Signature Editor"
+msgstr "以事件列表编辑器打开(&E)"
+
+#: ../src/commands/segment/CutRangeCommand.cpp:41
+#: ../src/gui/application/RosegardenGUIApp.cpp:812
+#, fuzzy
+msgid "Cut Range"
+msgstr "剪切并关闭(&U)"
+
+#: ../src/commands/edit/CopyCommand.cpp:73
+#: ../src/gui/application/RosegardenGUIApp.cpp:816
+#, fuzzy
+msgid "Copy Range"
+msgstr "基调修改"
+
+#: ../src/commands/segment/PasteRangeCommand.cpp:45
+#: ../src/gui/application/RosegardenGUIApp.cpp:820
+#, fuzzy
+msgid "Paste Range"
+msgstr "粘贴类型"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:828
+#, fuzzy
+msgid "Insert Range..."
+msgstr "插入休止符"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:832
+#: ../src/gui/editors/notation/NotationView.cpp:1804
+msgid "De&lete"
+msgstr "删除(&L)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:836
+msgid "Select &All Segments"
+msgstr "选择全部小节(&A)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:852
+#, fuzzy
+msgid "Edit Mar&kers..."
+msgstr "添加文本标记(&X)..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:856
+msgid "Edit Document P&roperties..."
+msgstr "编辑文档属性(&R)..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:864
+msgid "Open in &Default Editor"
+msgstr "以默认编辑器打开(&D)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:870
+#: ../src/gui/general/EditViewBase.cpp:206
+msgid "Open in Matri&x Editor"
+msgstr "以字模编辑器打开(&X)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:876
+#: ../src/gui/general/EditViewBase.cpp:212
+#, fuzzy
+msgid "Open in &Percussion Matrix Editor"
+msgstr "以字模编辑器打开(&X)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:882
+#: ../src/gui/general/EditViewBase.cpp:218
+msgid "Open in &Notation Editor"
+msgstr "以记号编辑器打开(&N)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:888
+#: ../src/gui/general/EditViewBase.cpp:224
+msgid "Open in &Event List Editor"
+msgstr "以事件列表编辑器打开(&E)"
+
+#: ../src/commands/edit/EventQuantizeCommand.cpp:120
+#: ../src/commands/edit/EventUnquantizeCommand.cpp:87
+#: ../src/gui/application/RosegardenGUIApp.cpp:894
+msgid "&Quantize..."
+msgstr "量化(&Q)..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:908
+#: ../src/gui/editors/matrix/MatrixView.cpp:686
+msgid "Repeat Last Quantize"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:928
+#, fuzzy
+msgid "Split at Time..."
+msgstr "设置开始时间..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:932
+#: ../src/gui/general/EditView.cpp:796
+msgid "Jog &Left"
+msgstr "左移一帧(&L)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:936
+#: ../src/gui/general/EditView.cpp:800
+msgid "Jog &Right"
+msgstr "右移一帧(&R)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:940
+msgid "Set Start Time..."
+msgstr "设置开始时间..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:944
+msgid "Set Duration..."
+msgstr "设置音长..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:953
+msgid "Turn Re&peats into Copies"
+msgstr "将重复部分转为副本(&P)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:958
+msgid "Manage Tri&ggered Segments"
+msgstr "管理触发片段(&G)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:962
+msgid "Set Tempos from &Beat Segment"
+msgstr "使节拍符合拍音片段(&B)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:966
+msgid "Set &Tempo to Audio Segment Duration"
+msgstr "使节拍符合音频片段音长(&T)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:972
+#, fuzzy
+msgid "Manage A&udio Files"
+msgstr "更改音频文件标签"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:977
+#, fuzzy
+msgid "Show Segment Labels"
+msgstr "小节标签"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:986
+#, fuzzy
+msgid "Add &Track"
+msgstr "添加轨道..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:990
+#, fuzzy
+msgid "&Add Tracks..."
+msgstr "添加轨道..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:996
+#, fuzzy
+msgid "D&elete Track"
+msgstr "删除轨道(&D)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1002
+msgid "Move Track &Down"
+msgstr "下移轨道(&D)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1008
+msgid "Move Track &Up"
+msgstr "上移轨道(&U)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1012
+msgid "Select &Next Track"
+msgstr "选择下一轨(&N)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1017
+msgid "Select &Previous Track"
+msgstr "选择上一轨(&P)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1022
+#, fuzzy
+msgid "Mute or Unmute Track"
+msgstr "冲击"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1027
+msgid "Arm or Un-arm Track for Record"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1034
+#, fuzzy
+msgid "&Mute all Tracks"
+msgstr "删除轨道(&D)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1040
+msgid "&Unmute all Tracks"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1044
+msgid "&Remap Instruments..."
+msgstr "重新映射乐器(&R)..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1053
+#, fuzzy
+msgid "&Audio Mixer"
+msgstr "音频衰减器"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1059
+msgid "Midi Mi&xer"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1065
+#, fuzzy
+msgid "Manage MIDI &Devices"
+msgstr "管理 MIDI 设备"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1071
+msgid "Manage S&ynth Plugins"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1075
+#, fuzzy
+msgid "Modify MIDI &Filters"
+msgstr "调整 MIDI 过滤器(&F)..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1079
+msgid "MIDI Thru Routing"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1085
+#, fuzzy
+msgid "Manage &Metronome"
+msgstr "管理库..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1089
+msgid "&Save Current Document as Default Studio"
+msgstr "将当前文档保存为默认工作环境(&S)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1093
+msgid "&Import Default Studio"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1097
+#, fuzzy
+msgid "Im&port Studio from File..."
+msgstr "正在导出音频文件..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1101
+msgid "&Reset MIDI Network"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1105
+#, fuzzy
+msgid "Set Quick Marker at Playback Position"
+msgstr "插入节拍变化"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1109
+msgid "Jump to Quick Marker"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1142
+#: ../src/gui/editors/matrix/MatrixView.cpp:782
+#: ../src/gui/editors/notation/NotationView.cpp:2397
+#: ../src/gui/studio/AudioMixerWindow.cpp:105
+#: ../src/gui/studio/MidiMixerWindow.cpp:81
+msgid "&Play"
+msgstr "播放(&P)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1153
+#: ../src/gui/editors/matrix/MatrixView.cpp:791
+#: ../src/gui/editors/notation/NotationView.cpp:2406
+#: ../src/gui/studio/AudioMixerWindow.cpp:114
+#: ../src/gui/studio/MidiMixerWindow.cpp:90
+msgid "&Stop"
+msgstr "停止(&S)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1160
+#: ../src/gui/editors/matrix/MatrixView.cpp:802
+#: ../src/gui/editors/notation/NotationView.cpp:2417
+#: ../src/gui/studio/AudioMixerWindow.cpp:125
+#: ../src/gui/studio/MidiMixerWindow.cpp:101
+msgid "&Fast Forward"
+msgstr "快进(&F)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1168
+#: ../src/gui/editors/matrix/MatrixView.cpp:796
+#: ../src/gui/editors/notation/NotationView.cpp:2411
+#: ../src/gui/studio/AudioMixerWindow.cpp:119
+#: ../src/gui/studio/MidiMixerWindow.cpp:95
+msgid "Re&wind"
+msgstr "回绕(&W)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1175
+msgid "P&unch in Record"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1182
+#: ../src/gui/studio/AudioMixerWindow.cpp:143
+#: ../src/gui/studio/MidiMixerWindow.cpp:119
+msgid "&Record"
+msgstr "录制(&R)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1189
+#: ../src/gui/editors/matrix/MatrixView.cpp:808
+#: ../src/gui/editors/notation/NotationView.cpp:2423
+#: ../src/gui/studio/AudioMixerWindow.cpp:131
+#: ../src/gui/studio/MidiMixerWindow.cpp:107
+msgid "Rewind to &Beginning"
+msgstr "回绕到起点(&B)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1196
+#: ../src/gui/editors/matrix/MatrixView.cpp:814
+#: ../src/gui/editors/notation/NotationView.cpp:2429
+#: ../src/gui/studio/AudioMixerWindow.cpp:137
+#: ../src/gui/studio/MidiMixerWindow.cpp:113
+msgid "Fast Forward to &End"
+msgstr "快进到末尾(&E)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1203
+#: ../src/gui/editors/matrix/MatrixView.cpp:832
+#: ../src/gui/editors/notation/NotationView.cpp:2447
+msgid "Scro&ll to Follow Playback"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1209
+#: ../src/gui/editors/matrix/MatrixView.cpp:838
+#: ../src/gui/editors/notation/NotationView.cpp:2453
+#: ../src/gui/studio/AudioMixerWindow.cpp:149
+#: ../src/gui/studio/MidiMixerWindow.cpp:125
+#, fuzzy
+msgid "Panic"
+msgstr "音相"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1213
+msgid "Segment Debug Dump "
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1283
+msgid " Zoom: "
+msgstr " 缩放:"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1719
+#, fuzzy
+msgid "File \"%1\" does not exist"
+msgstr "文件 %1 已经存在"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1725
+msgid "File \"%1\" is actually a directory"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1734
+#, fuzzy
+msgid "You do not have read permission for \"%1\""
+msgstr "您没有读这个文件的权限。"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1802
+msgid ""
+"An auto-save file for this document has been found\n"
+"Do you want to open it instead ?"
+msgstr ""
+"找到一个为该文档自动保存的文件。\n"
+"您是否要改为打开它呢?"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:1896
+#, fuzzy
+msgid "Example Files"
+msgstr "示例"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2100
+msgid "Opening a new application window..."
+msgstr "正在打开一个新的应用程序窗口..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2110
+msgid "Creating new document..."
+msgstr "正在创建新文档..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2154
+#, c-format
+msgid ""
+"Malformed URL\n"
+"%1"
+msgstr ""
+"不正确的 URL\n"
+"%1"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2179
+#: ../src/gui/application/RosegardenGUIApp.cpp:2240
+msgid "Opening file..."
+msgstr "正在打开文件..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2201
+#: ../src/gui/application/RosegardenGUIApp.cpp:2220
+msgid "Open File"
+msgstr "打开文件"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1225
+#: ../src/gui/application/RosegardenGUIApp.cpp:2258
+msgid "Saving file..."
+msgstr "正在保存文件..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2330
+msgid "This is not a valid filename.\n"
+msgstr "这不是有效的文件名。\n"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2335
+msgid "This is not a local file.\n"
+msgstr "这不是本地文件。\n"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2342
+#: ../src/gui/studio/BankEditorDialog.cpp:1640
+#: ../src/gui/studio/DeviceManagerDialog.cpp:787
+msgid "You have specified a directory"
+msgstr "您已经指定了一个目录"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2348
+#: ../src/gui/studio/BankEditorDialog.cpp:1646
+#: ../src/gui/studio/DeviceManagerDialog.cpp:793
+msgid "The specified file exists. Overwrite?"
+msgstr "指定的文件已存在,要覆盖吗?"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2362
+msgid "Saving file with a new filename..."
+msgstr "正在用新文件名保存..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2364
+#, fuzzy
+msgid "Rosegarden files"
+msgstr "玫瑰园-4 文件"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2365
+#: ../src/gui/application/RosegardenGUIApp.cpp:4860
+#: ../src/gui/application/RosegardenGUIApp.cpp:4904
+#: ../src/gui/application/RosegardenGUIApp.cpp:4942
+#: ../src/gui/application/RosegardenGUIApp.cpp:4975
+#: ../src/gui/application/RosegardenGUIApp.cpp:5009
+#: ../src/gui/application/RosegardenGUIApp.cpp:5116
+msgid "All files"
+msgstr "所有文件"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2366
+#, fuzzy
+msgid "Save as..."
+msgstr "移动轨道..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2404
+msgid "Closing file..."
+msgstr "正在关闭文件..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2421
+#: ../src/gui/editors/notation/NotationView.cpp:4618
+msgid "Printing..."
+msgstr "正在打印..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2433
+#: ../src/gui/editors/notation/NotationView.cpp:4635
+#, fuzzy
+msgid "Previewing..."
+msgstr "正在打印..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2440
+msgid "Exiting..."
+msgstr "正在退出..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2463
+msgid "Cutting selection..."
+msgstr "正在剪切选中区..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2474
+#: ../src/gui/editors/matrix/MatrixView.cpp:1614
+#: ../src/gui/editors/notation/NotationView.cpp:4763
+msgid "Copying selection to clipboard..."
+msgstr "正在把选中区复制到剪贴板..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2484
+#: ../src/gui/editors/eventlist/EventView.cpp:878
+#: ../src/gui/editors/matrix/MatrixView.cpp:1625
+#: ../src/gui/editors/notation/NotationView.cpp:4796
+#: ../src/gui/editors/notation/NotationView.cpp:4841
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:352
+msgid "Clipboard is empty"
+msgstr "剪贴板是空的"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2487
+#: ../src/gui/editors/eventlist/EventView.cpp:882
+#: ../src/gui/editors/matrix/MatrixView.cpp:1629
+#: ../src/gui/editors/notation/NotationView.cpp:4804
+#: ../src/gui/editors/notation/NotationView.cpp:4845
+msgid "Inserting clipboard contents..."
+msgstr "正在插入剪贴板内容..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2556
+#, fuzzy
+msgid "Duration of empty range to insert"
+msgstr "选中区的音长"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2631
+msgid "This function needs no more than one segment to be selected."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2654
+msgid "Can't join Audio segments"
+msgstr "无法加入音频片段"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2707
+#, fuzzy
+msgid "rescaling an audio file"
+msgstr "正在播放音频文件"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2723
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:172
+#, fuzzy
+msgid "Rescaling audio file..."
+msgstr "正在导出音频文件..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2767
+msgid ""
+"The audio file path does not exist or is not writable.\n"
+"You must set the audio file path to a valid directory in Document Properties "
+"before %1.\n"
+"Would you like to set it now?"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2769
+#: ../src/gui/application/RosegardenGUIApp.cpp:5291
+#: ../src/gui/application/RosegardenGUIApp.cpp:5339
+#: ../src/gui/editors/segment/TrackButtons.cpp:419
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:159
+#, fuzzy
+msgid "Set audio file path"
+msgstr "声音文件路径"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2833
+#, fuzzy
+msgid "Jog Selection"
+msgstr "清除选择"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:2978
+#, fuzzy, c-format
+msgid ""
+"_n: Split Segment at Time\n"
+"Split %n Segments at Time"
+msgstr "音长"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3013
+#: ../src/gui/general/EditViewBase.cpp:619
+msgid "Segment Start Time"
+msgstr "片段开始时间"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3023
+#, fuzzy
+msgid "Set Segment Start Times"
+msgstr "显示小节参数(&S)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3024
+#: ../src/gui/general/EditViewBase.cpp:626
+msgid "Set Segment Start Time"
+msgstr "设置片段开始时间"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3056
+#: ../src/gui/general/EditViewBase.cpp:644
+msgid "Segment Duration"
+msgstr "片段音长"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3068
+msgid "Set Segment Durations"
+msgstr "设置片段音长"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3069
+#: ../src/gui/general/EditViewBase.cpp:652
+msgid "Set Segment Duration"
+msgstr "设置片段音长"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3176
+#: ../src/gui/application/RosegardenGUIApp.cpp:5875
+msgid "Set Global Tempo"
+msgstr "设置全局节拍"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3234
+#: ../src/gui/general/EditViewBase.cpp:477
+msgid "Toggle the toolbar..."
+msgstr "切换工具栏..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3244
+msgid "Toggle the tools toolbar..."
+msgstr "切换工具工具栏..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3254
+msgid "Toggle the tracks toolbar..."
+msgstr "切换轨道工具栏..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3264
+msgid "Toggle the editor toolbar..."
+msgstr "切换编辑器工具栏..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3274
+msgid "Toggle the transport toolbar..."
+msgstr "切换播放控制器工具栏..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3284
+msgid "Toggle the zoom toolbar..."
+msgstr "切换缩放工具栏..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3294
+msgid "Toggle the Transport"
+msgstr "切换播放控制器"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3377
+#: ../src/gui/general/EditViewBase.cpp:487
+msgid "Toggle the statusbar..."
+msgstr "切换状态条..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3434
+msgid ""
+"The join tool isn't implemented yet. Instead please highlight the segments "
+"you want to join and then use the menu option:\n"
+"\n"
+" Segments->Collapse Segments.\n"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3437
+msgid "Join tool not yet implemented"
+msgstr "加入工具尚未实现"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3675
+msgid "Revert modified document to previous saved version?"
+msgstr "还原修改过的文档至上次保存的版本"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3691
+#, fuzzy
+msgid ""
+"*.rgp|Rosegarden Project files\n"
+"*|All files"
+msgstr ""
+"*.rose|玫瑰园-2 文件\n"
+"*|全部文件"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3692
+#, fuzzy
+msgid "Import Rosegarden Project File"
+msgstr "导入玫瑰园 2.1 文件(&R)..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3717
+msgid "Failed to import project file \"%1\""
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3739
+msgid "Open MIDI File"
+msgstr "打开 MIDI 文件"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3756
+msgid "Merge MIDI File"
+msgstr "合并 MIDI 文件"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3866
+msgid "Importing MIDI file..."
+msgstr " 正在导入 MIDI 文件..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3903
+#, fuzzy
+msgid "Calculating notation..."
+msgstr "正在压缩音符..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3950
+#, fuzzy
+msgid "Calculate Notation"
+msgstr "猜测记号"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3991
+#: ../src/gui/application/RosegardenGUIApp.cpp:4008
+msgid ""
+"*.rose|Rosegarden-2 files\n"
+"*|All files"
+msgstr ""
+"*.rose|玫瑰园-2 文件\n"
+"*|全部文件"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:3992
+#: ../src/gui/application/RosegardenGUIApp.cpp:4009
+msgid "Open Rosegarden 2.1 File"
+msgstr "打开玫瑰园 2.1 文件"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4026
+msgid "Importing Rosegarden 2.1 file..."
+msgstr "正在导入玫瑰园 2.1 文件..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4052
+msgid "Can't load Rosegarden 2.1 file. It appears to be corrupted."
+msgstr "无法载入玫瑰园 2.1 文件。该文件似乎已损坏。"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4078
+#: ../src/gui/application/RosegardenGUIApp.cpp:4095
+#, fuzzy
+msgid ""
+"*.h2song|Hydrogen files\n"
+"*|All files"
+msgstr ""
+"*.rose|玫瑰园-2 文件\n"
+"*|全部文件"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4079
+#: ../src/gui/application/RosegardenGUIApp.cpp:4096
+#, fuzzy
+msgid "Open Hydrogen File"
+msgstr "打开玫瑰园 2.1 文件"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4113
+#, fuzzy
+msgid "Importing Hydrogen file..."
+msgstr "正在导入玫瑰园 2.1 文件..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4139
+#, fuzzy
+msgid "Can't load Hydrogen file. It appears to be corrupted."
+msgstr "无法载入玫瑰园 2.1 文件。该文件似乎已损坏。"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4527
+#, fuzzy
+msgid "Export and import of Rosegarden Project files"
+msgstr "正在导入玫瑰园 2.1 文件..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4529
+#, fuzzy
+msgid "The Rosegarden Project Packager helper script"
+msgstr "玫瑰园-4 文件"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4533
+msgid "%1 - for project file support"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4550
+msgid "The Rosegarden LilyPondView helper script"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4554
+#, fuzzy
+msgid "%1 - for LilyPond preview support"
+msgstr "Lilypond 导出选项"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4570
+#, fuzzy
+msgid "The Rosegarden Audio File Importer helper script"
+msgstr "玫瑰园音频文件管理器"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4574
+#, fuzzy
+msgid "%1 - for audio file import"
+msgstr "声音文件路径"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4585
+msgid ""
+"<h3>Helper programs not found</h3><p>Rosegarden could not find one or more "
+"helper programs which it needs to provide some features. The following "
+"features will not be available:</p>"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4586
+#: ../src/gui/application/RosegardenGUIApp.cpp:4592
+#, fuzzy
+msgid "<ul>"
+msgstr "<默认>"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4588
+#: ../src/gui/application/RosegardenGUIApp.cpp:4594
+#, fuzzy
+msgid "<li>%1</li>"
+msgstr "-- %1 (从 %2)\n"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4590
+#: ../src/gui/application/RosegardenGUIApp.cpp:4596
+msgid "</ul>"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4591
+msgid ""
+"<p>To fix this, you should install the following additional programs:</p>"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4603
+msgid "Helper programs not found"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4686
+msgid "Starting the sequencer..."
+msgstr "正在启动音序发生器..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4712
+msgid "Couldn't start the sequencer"
+msgstr "无法启动音序发生器"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4789
+#, fuzzy
+msgid "Clearing down jackd..."
+msgstr "正在清除音频数据..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4803
+#, fuzzy
+msgid "Starting jackd..."
+msgstr "已开始..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4842
+msgid ""
+"The Rosegarden sequencer process has exited unexpectedly. Sound and "
+"recording will no longer be available for this session.\n"
+"Please exit and restart Rosegarden to restore sound capability."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4846
+msgid ""
+"The Rosegarden sequencer could not be started, so sound and recording will "
+"be unavailable for this session.\n"
+"For assistance with correct audio and MIDI configuration, go to http://"
+"rosegardenmusic.com."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4856
+#, fuzzy
+msgid "Exporting Rosegarden Project file..."
+msgstr "正在导入玫瑰园 2.1 文件..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4859
+#, fuzzy
+msgid "Rosegarden Project files\n"
+msgstr "玫瑰园-4 文件"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4861
+#: ../src/gui/application/RosegardenGUIApp.cpp:4905
+#: ../src/gui/application/RosegardenGUIApp.cpp:4943
+#: ../src/gui/application/RosegardenGUIApp.cpp:4976
+#: ../src/gui/application/RosegardenGUIApp.cpp:5010
+#: ../src/gui/application/RosegardenGUIApp.cpp:5116
+msgid "Export as..."
+msgstr "导出为..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4875
+#, c-format
+msgid "Saving Rosegarden file to package failed: %1"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4889
+msgid "Failed to export to project file \"%1\""
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4900
+#: ../src/gui/application/RosegardenGUIApp.cpp:4915
+msgid "Exporting MIDI file..."
+msgstr " 正在导出 MIDI 文件..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4903
+msgid "Standard MIDI files\n"
+msgstr "标准 MIDI 文件\n"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4934
+#: ../src/gui/application/RosegardenGUIApp.cpp:4966
+#: ../src/gui/application/RosegardenGUIApp.cpp:4999
+#: ../src/gui/application/RosegardenGUIApp.cpp:5103
+#: ../src/gui/application/RosegardenGUIApp.cpp:5140
+#: ../src/gui/editors/notation/NotationView.cpp:4733
+msgid "Export failed. The file could not be opened for writing."
+msgstr "导出失败。无法打开文件以写入。"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4940
+#: ../src/gui/application/RosegardenGUIApp.cpp:4952
+msgid "Exporting Csound score file..."
+msgstr "正在导出 Csound 乐谱文件..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4972
+#: ../src/gui/application/RosegardenGUIApp.cpp:4985
+msgid "Exporting Mup file..."
+msgstr " 正在导出 Mup 文件..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:4975
+msgid "Mup files\n"
+msgstr "Mup 文件\n"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5005
+#: ../src/gui/application/RosegardenGUIApp.cpp:5089
+#: ../src/gui/editors/notation/NotationView.cpp:4719
+#, fuzzy
+msgid "Exporting LilyPond file..."
+msgstr "正在导出 Lilypond 文件..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5008
+#, fuzzy
+msgid "LilyPond files"
+msgstr "Lilypond 文件"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5023
+#: ../src/gui/editors/notation/NotationView.cpp:4653
+#, fuzzy
+msgid "Printing LilyPond file..."
+msgstr "正在导出 Lilypond 文件..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5028
+#: ../src/gui/application/RosegardenGUIApp.cpp:5052
+#: ../src/gui/editors/notation/NotationView.cpp:4658
+#: ../src/gui/editors/notation/NotationView.cpp:4682
+#, fuzzy
+msgid "Failed to open a temporary file for LilyPond export."
+msgstr "选择一个或更多音频文件"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5047
+#: ../src/gui/editors/notation/NotationView.cpp:4677
+#, fuzzy
+msgid "Previewing LilyPond file..."
+msgstr "正在导出 Lilypond 文件..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5080
+#: ../src/gui/editors/notation/NotationView.cpp:4710
+#, fuzzy
+msgid "LilyPond Preview Options"
+msgstr "Lilypond 导出选项"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5081
+#: ../src/gui/editors/notation/NotationView.cpp:4711
+#, fuzzy
+msgid "LilyPond preview options"
+msgstr "Lilypond 导出选项"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5112
+#: ../src/gui/application/RosegardenGUIApp.cpp:5126
+msgid "Exporting MusicXML file..."
+msgstr "正在导出 MusicXML 文章..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5115
+msgid "XML files"
+msgstr "XML 文件"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5289
+#: ../src/gui/editors/segment/TrackButtons.cpp:417
+msgid ""
+"The audio file path does not exist or is not writable.\n"
+"Please set the audio file path to a valid directory in Document Properties "
+"before recording audio.\n"
+"Would you like to set it now?"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5337
+msgid ""
+"The audio file path does not exist or is not writable.\n"
+"Please set the audio file path to a valid directory in Document Properties "
+"before you start to record audio.\n"
+"Would you like to set it now?"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5780
+#, fuzzy
+msgid "Move playback pointer to time"
+msgstr "从回放点到光标(&C)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5793
+#: ../src/gui/editors/matrix/MatrixView.cpp:2240
+msgid "%1%"
+msgstr "%1%"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5861
+#, c-format
+msgid "Replace Tempo Change at %1"
+msgstr "替换节拍修改于 %1"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5891
+msgid "Set Global and Default Tempo"
+msgstr "设置全局和默认节拍"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5914
+#, fuzzy
+msgid "Move Tempo Change"
+msgstr "删除节拍变更(&T)..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5949
+#, fuzzy
+msgid "new marker"
+msgstr "删除所有标记(&R)"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:5950
+#, fuzzy
+msgid "no description"
+msgstr "描述"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:6363
+#, c-format
+msgid "Sequencer failed to add audio file %1"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:6388
+#, c-format
+msgid "Sequencer failed to remove audio file id %1"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:6448
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:1086
+msgid "Modify Segment label"
+msgstr "修改小节标签"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:6450
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:1088
+msgid "Modify Segments label"
+msgstr "修改小节标签"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:6452
+msgid "Relabelling selection..."
+msgstr "正在重新标记选择区..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7539
+#, fuzzy
+msgid "Play List"
+msgstr "播放"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7567
+msgid "http://rosegarden.sourceforge.net/tutorial/en/chapter-0.html"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7574
+msgid "http://rosegarden.sourceforge.net/tutorial/bug-guidelines.html"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7650
+msgid "Queueing MIDI panic events for tranmission..."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7708
+msgid "Are you sure you want to save this as your default studio?"
+msgstr "您确定要将其保存为您的默认工作环境吗?"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7713
+msgid "Saving current document as default studio..."
+msgstr "将当前文挡保存为默认工作环境..."
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7738
+#, fuzzy
+msgid ""
+"Are you sure you want to import your default studio and lose the current one?"
+msgstr "您确定要将其保存为您的默认工作环境吗?"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7773
+#, fuzzy
+msgid "Import Studio from File"
+msgstr "导出音频文件"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:7807
+#, fuzzy
+msgid "Import Studio"
+msgstr "导出音频文件"
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:8015
+msgid ""
+"<h3>Newer version available</h3><p>A newer version of Rosegarden may be "
+"available.<br>Please consult the <a href=\"http://www.rosegardenmusic.com/"
+"getting/\">Rosegarden website</a> for more information.</p>"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIApp.cpp:8016
+#, fuzzy
+msgid "Newer version available"
+msgstr "本地化的(如果可用的话)"
+
+#: ../src/gui/application/RosegardenApplication.cpp:104
+#, c-format
+msgid "Failed to load soundfont %1"
+msgstr "无法载入声音字体 %1"
+
+#: ../src/gui/application/main.cpp:311
+msgid "Rosegarden - A sequencer and musical notation editor"
+msgstr "Rosegarden(玫瑰园) - 音序发生器和音乐记号编辑器"
+
+#: ../src/gui/application/main.cpp:315
+msgid "Don't use the sequencer (support editing only)"
+msgstr "不使用音序器(仅支持编辑)"
+
+#: ../src/gui/application/main.cpp:316
+msgid "Don't show the splash screen"
+msgstr "不显示启动画面"
+
+#: ../src/gui/application/main.cpp:317
+msgid "Don't automatically run in the background"
+msgstr "不自动运行于后台"
+
+#: ../src/gui/application/main.cpp:318
+msgid "Attach to a running sequencer process, if found"
+msgstr "如果找到一个运行中的音序器进程就附加上去"
+
+#: ../src/gui/application/main.cpp:319
+msgid "Ignore installed version - for devs only"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:320
+msgid "file to open"
+msgstr "要打开的文件"
+
+#: ../src/gui/application/main.cpp:370
+msgid "Installation contains the wrong version of Rosegarden."
+msgstr "玫瑰园版本安装有误。"
+
+#: ../src/gui/application/main.cpp:371
+msgid ""
+" The wrong versions of Rosegarden's data files were\n"
+" found in the standard KDE installation directories.\n"
+" (I am %1, but the installed files are for version %2.)\n"
+"\n"
+" This may mean one of the following:\n"
+"\n"
+" 1. This is a new upgrade of Rosegarden, and it has not yet been\n"
+" installed. If you compiled it yourself, check that you have\n"
+" run \"make install\" and that the procedure completed\n"
+" successfully.\n"
+"\n"
+" 2. The upgrade was installed in a non-standard directory,\n"
+" and an old version was found in a standard directory. If so,\n"
+" you will need to add the correct directory to your KDEDIRS\n"
+" environment variable before you can run it."
+msgstr ""
+
+#: ../src/gui/application/main.cpp:383 ../src/gui/application/main.cpp:401
+msgid "Installation problem"
+msgstr "安装问题"
+
+#: ../src/gui/application/main.cpp:389
+msgid "Rosegarden does not appear to have been installed."
+msgstr "玫瑰园似乎没有被安装。"
+
+#: ../src/gui/application/main.cpp:390
+msgid ""
+" One or more of Rosegarden's data files could not be\n"
+" found in the standard KDE installation directories.\n"
+"\n"
+" This may mean one of the following:\n"
+"\n"
+" 1. Rosegarden has not been correctly installed. If you compiled\n"
+" it yourself, check that you have run \"make install\" and that\n"
+" the procedure completed successfully.\n"
+"\n"
+" 2. Rosegarden has been installed in a non-standard directory,\n"
+" and you need to add this directory to your KDEDIRS environment\n"
+" variable before you can run it. This may be the case if you\n"
+" installed into $HOME or a local third-party package directory\n"
+" like /usr/local or /opt."
+msgstr ""
+
+#: ../src/gui/application/main.cpp:414
+msgid "Rosegarden"
+msgstr "玫瑰园"
+
+#: ../src/gui/application/main.cpp:416
+msgid ""
+"Copyright 2000 - 2008 Guillaume Laurent, Chris Cannam, Richard Bown\n"
+"Parts copyright 1994 - 2004 Chris Cannam, Andy Green, Richard Bown, "
+"Guillaume Laurent\n"
+"LilyPond fonts copyright 1997 - 2005 Han-Wen Nienhuys and Jan Nieuwenhuizen"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:428
+msgid "Chord labelling code"
+msgstr "和弦标注代码"
+
+#: ../src/gui/application/main.cpp:429
+msgid ""
+"LilyPond output\n"
+"assorted other patches\n"
+"i18n-ization"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:430
+msgid ""
+"UI improvements\n"
+"bug fixes"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:431
+msgid ""
+"Segment colours\n"
+"Other UI and bug fixes"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:432
+msgid ""
+"Russian translation\n"
+"i18n-ization"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:433 ../src/gui/application/main.cpp:434
+msgid "German translation"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:435
+msgid "Welsh translation"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:436
+#, fuzzy
+msgid "French translation"
+msgstr "自动同步"
+
+#: ../src/gui/application/main.cpp:437
+#, fuzzy
+msgid ""
+"French translation\n"
+"Bug fixes"
+msgstr "自动同步"
+
+#: ../src/gui/application/main.cpp:438 ../src/gui/application/main.cpp:439
+msgid "Italian translation"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:440 ../src/gui/application/main.cpp:441
+msgid "Swedish translation"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:442
+msgid "Estonian translation"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:443 ../src/gui/application/main.cpp:444
+#, fuzzy
+msgid "Dutch translation"
+msgstr "音长"
+
+#: ../src/gui/application/main.cpp:445
+msgid "HSpinBox class"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:446
+msgid "Transposition by interval"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:447
+msgid "Original designs for rotary controllers"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:448
+#, fuzzy
+msgid "Japanese translation"
+msgstr "自动同步"
+
+#: ../src/gui/application/main.cpp:449
+msgid ""
+"Auto-scroll deceleration\n"
+"Rests outside staves and other bug fixes"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:450
+#, fuzzy
+msgid "Simplified Chinese translation"
+msgstr "自动同步"
+
+#: ../src/gui/application/main.cpp:451
+msgid "LIRC infrared remote-controller support"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:452
+msgid "MTC slave timing implementation"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:453
+#, fuzzy
+msgid "Czech translation"
+msgstr "自动同步"
+
+#: ../src/gui/application/main.cpp:454
+msgid "SCons/bksys building system"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:455
+msgid "icons, icons, icons"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:456 ../src/gui/application/main.cpp:457
+#: ../src/gui/application/main.cpp:458 ../src/gui/application/main.cpp:459
+#, fuzzy
+msgid "Spanish translation"
+msgstr "自动同步"
+
+#: ../src/gui/application/main.cpp:460 ../src/gui/application/main.cpp:461
+#, fuzzy
+msgid "Catalan translation"
+msgstr "自动同步"
+
+#: ../src/gui/application/main.cpp:462
+msgid ""
+"1.2.3 splash screen photo\n"
+"Gave birth to D. Michael McIntyre, bought him a good flute once\n"
+"upon a time, and always humored him when he came over to play her\n"
+"some new instrument, even though she really hated his playing.\n"
+"Born October 19, 1951, died September 21, 2007, R. I. P."
+msgstr ""
+
+#: ../src/gui/application/main.cpp:463
+msgid "Initial guitar chord editing code"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:464
+#, fuzzy
+msgid "Polish translation"
+msgstr "自动同步"
+
+#: ../src/gui/application/main.cpp:465
+#, fuzzy
+msgid "Basque translation"
+msgstr "自动同步"
+
+#: ../src/gui/application/main.cpp:466
+msgid "Klearlook theme"
+msgstr ""
+
+#: ../src/_translatorinfo.cpp:1 ../src/gui/application/main.cpp:468
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr "开源软件国际化简体中文组(http://i18n.linux.net.cn),Liu Songhe"
+
+#: ../src/_translatorinfo.cpp:3 ../src/gui/application/main.cpp:468
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+
+#: ../src/gui/application/main.cpp:719
+msgid "Welcome!"
+msgstr ""
+
+#: ../src/gui/application/main.cpp:731
+msgid ""
+"<h2>Welcome to Rosegarden!</h2><p>Welcome to the Rosegarden audio and MIDI "
+"sequencer and musical notation editor.</p><ul><li>If you have not already "
+"done so, you may wish to install some DSSI synth plugins, or a separate "
+"synth program such as QSynth. Rosegarden does not synthesize sounds from "
+"MIDI on its own, so without these you will hear nothing.</"
+"li><br><br><li>Rosegarden uses the JACK audio server for recording and "
+"playback of audio, and for playback from DSSI synth plugins. These features "
+"will only be available if the JACK server is running.</"
+"li><br><br><li>Rosegarden has comprehensive documentation: see the Help menu "
+"for the handbook, tutorials, and other information!</li></ul><p>Rosegarden "
+"was brought to you by a team of volunteers across the world. To learn more, "
+"go to <a href=\"http://www.rosegardenmusic.com/\">http://www.rosegardenmusic."
+"com/</a>.</p>"
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIView.cpp:257
+msgid "No non-audio segments in composition"
+msgstr "作品里没有非音频片段"
+
+#: ../src/gui/application/RosegardenGUIView.cpp:333
+msgid "Selection must contain only audio or non-audio segments"
+msgstr "选择只能包括音频或非音频片段"
+
+#: ../src/gui/application/RosegardenGUIView.cpp:431
+#: ../src/gui/application/RosegardenGUIView.cpp:576
+#: ../src/gui/application/RosegardenGUIView.cpp:612
+#: ../src/gui/application/RosegardenGUIView.cpp:776
+msgid "No non-audio segments selected"
+msgstr "没有非音频片段被选中"
+
+#: ../src/gui/application/RosegardenGUIView.cpp:851
+msgid ""
+"You've not yet defined an audio editor for Rosegarden to use.\n"
+"See Settings -> Configure Rosegarden -> Audio."
+msgstr ""
+
+#: ../src/gui/application/RosegardenGUIView.cpp:1559
+#: ../src/gui/application/RosegardenGUIView.cpp:1564
+#, fuzzy
+msgid "Can't add dropped file. "
+msgstr "无法打开文件“%1”"
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1014
+#: ../src/gui/seqmanager/SequenceManager.cpp:1150
+msgid ""
+"The JACK Audio subsystem has failed or it has stopped Rosegarden from "
+"processing audio.\n"
+"Please restart Rosegarden to continue working with audio.\n"
+"Quitting other running applications may improve Rosegarden's performance."
+msgstr ""
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1020
+#: ../src/gui/seqmanager/SequenceManager.cpp:1156
+msgid ""
+"The JACK Audio subsystem has stopped Rosegarden from processing audio, "
+"probably because of a processing overload.\n"
+"An attempt to restart the audio service has been made, but some problems may "
+"remain.\n"
+"Quitting other running applications may improve Rosegarden's performance."
+msgstr ""
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1031
+msgid ""
+"Run out of processor power for real-time audio processing. Cannot continue."
+msgstr ""
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1057
+msgid ""
+"A serious error has occurred in the ALSA MIDI subsystem. It may not be "
+"possible to continue sequencing. Please check console output for more "
+"information."
+msgstr ""
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1078
+msgid "JACK Audio subsystem is losing sample frames."
+msgstr ""
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1096
+msgid ""
+"Failed to read audio data from disc in time to service the audio subsystem."
+msgstr ""
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1100
+msgid ""
+"Failed to write audio data to disc fast enough to service the audio "
+"subsystem."
+msgstr ""
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1104
+msgid "The audio mixing subsystem is failing to keep up."
+msgstr ""
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1108
+msgid "The audio subsystem is failing to keep up."
+msgstr ""
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1112
+msgid "Unknown sequencer failure mode!"
+msgstr ""
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1170
+msgid ""
+"<h3>System timer resolution is too low</h3><p>Rosegarden was unable to find "
+"a high-resolution timing source for MIDI performance.</p><p>This may mean "
+"you are using a Linux system with the kernel timer resolution set too low. "
+"Please contact your Linux distributor for more information.</p><p>Some Linux "
+"distributors already provide low latency kernels, see <a href=\"http://"
+"rosegarden.wiki.sourceforge.net/Low+latency+kernels\">http://rosegarden.wiki."
+"sourceforge.net/Low+latency+kernels</a> for instructions.</p>"
+msgstr ""
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1188
+msgid ""
+"<h3>System timer resolution is too low</h3><p>Rosegarden was unable to find "
+"a high-resolution timing source for MIDI performance.</p><p>You may be able "
+"to solve this problem by loading the RTC timer kernel module. To do this, "
+"try running <b>sudo modprobe snd-rtctimer</b> in a terminal window and then "
+"restarting Rosegarden.</p><p>Alternatively, check whether your Linux "
+"distributor provides a multimedia-optimized kernel. See <a href=\"http://"
+"rosegarden.wiki.sourceforge.net/Low+latency+kernels\">http://rosegarden.wiki."
+"sourceforge.net/Low+latency+kernels</a> for notes about this.</p>"
+msgstr ""
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1312
+msgid ""
+"<p>Both MIDI and Audio subsystems have failed to initialize.</p><p>You may "
+"continue without the sequencer, but we suggest closing Rosegarden, running "
+"\"alsaconf\" as root, and starting Rosegarden again. If you wish to run "
+"with no sequencer by design, then use \"rosegarden --nosequencer\" to avoid "
+"seeing this error in the future.</p>"
+msgstr ""
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1314
+msgid ""
+"<p>The MIDI subsystem has failed to initialize.</p><p>You may continue "
+"without the sequencer, but we suggest closing Rosegarden, running \"modprobe "
+"snd-seq-midi\" as root, and starting Rosegarden again. If you wish to run "
+"with no sequencer by design, then use \"rosegarden --nosequencer\" to avoid "
+"seeing this error in the future.</p>"
+msgstr ""
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1316
+msgid ""
+"<p>The Rosegarden sequencer module version does not match the GUI module "
+"version.</p><p>You have probably mixed up files from two different versions "
+"of Rosegarden. Please check your installation.</p>"
+msgstr ""
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1322
+#, fuzzy, c-format
+msgid "<h3>Sequencer startup failed</h3>%1"
+msgstr "音序发生器状态:"
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1330
+msgid ""
+"<h3>Failed to connect to JACK audio server.</h3><p>Rosegarden could not "
+"connect to the JACK audio server. This probably means the JACK server is "
+"not running.</p><p>If you want to be able to play or record audio files or "
+"use plugins, you should exit Rosegarden and start the JACK server before "
+"running Rosegarden again.</p>"
+msgstr ""
+
+#: ../src/gui/seqmanager/SequenceManager.cpp:1331
+msgid "Failed to connect to JACK"
+msgstr ""
+
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:46
+msgid "Modify MIDI filters..."
+msgstr "修改 MIDI 过滤器..."
+
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:58
+msgid "THRU events to ignore"
+msgstr "要忽略的通过事件"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:131
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:60
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:96
+msgid "Note"
+msgstr "音符"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:132
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:61
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:97
+msgid "Program Change"
+msgstr "指令列变更"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:136
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:62
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:98
+msgid "Key Pressure"
+msgstr "基调强度"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:137
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:63
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:99
+msgid "Channel Pressure"
+msgstr "通道强度"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:134
+#: ../src/gui/general/EditView.cpp:899
+#: ../src/gui/rulers/ControllerEventsRuler.cpp:198
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:64
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:100
+msgid "Pitch Bend"
+msgstr "音色弯曲"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:133
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:65
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:101
+msgid "Controller"
+msgstr "控制器"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:135
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:66
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:102
+msgid "System Exclusive"
+msgstr "系统独占"
+
+#: ../src/gui/seqmanager/MidiFilterDialog.cpp:94
+msgid "RECORD events to ignore"
+msgstr "要忽略的录制事件"
+
+#: ../src/gui/widgets/TimeWidget.cpp:101
+msgid "Note:"
+msgstr "音符:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:108 ../src/gui/widgets/TimeWidget.cpp:145
+msgid "<inexact>"
+msgstr ""
+
+#: ../src/gui/widgets/TimeWidget.cpp:151
+msgid "Units:"
+msgstr "单位:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:173
+msgid "Time:"
+msgstr "时间:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:184
+msgid "units"
+msgstr "单位"
+
+#: ../src/gui/widgets/TimeWidget.cpp:193
+msgid "Measures:"
+msgstr ""
+
+#: ../src/gui/widgets/TimeWidget.cpp:193
+#, fuzzy
+msgid "Measure:"
+msgstr "合并(&M)"
+
+#: ../src/gui/widgets/TimeWidget.cpp:212
+msgid "beats:"
+msgstr "节拍:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:212
+msgid "beat:"
+msgstr "节拍:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:230
+msgid "%1:"
+msgstr "%1:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:254
+msgid "Seconds:"
+msgstr "秒:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:273
+msgid "msec:"
+msgstr "毫秒:"
+
+#: ../src/gui/widgets/TimeWidget.cpp:407 ../src/gui/widgets/TimeWidget.cpp:531
+msgid "(%1/%2 time)"
+msgstr ""
+
+#: ../src/gui/widgets/TimeWidget.cpp:452
+msgid "(starting %1.%2 qpm, %2.%3 bpm)"
+msgstr ""
+
+#: ../src/gui/widgets/TimeWidget.cpp:458
+msgid "(starting %1.%2 bpm)"
+msgstr ""
+
+#: ../src/gui/widgets/TimeWidget.cpp:464
+msgid "(%1.%2 qpm, %2.%3 bpm)"
+msgstr ""
+
+#: ../src/gui/widgets/TimeWidget.cpp:470
+#, fuzzy
+msgid "(%1.%2 bpm)"
+msgstr "%1.%2 秒,"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:239
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:60
+msgid "C"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:241
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:61
+#, fuzzy
+msgid "D"
+msgstr "ID"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:243
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:62
+msgid "E"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:244
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:63
+msgid "F"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:246
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:64
+msgid "G"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:248
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:65
+#, fuzzy
+msgid "A"
+msgstr "A4"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:250
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:66
+msgid "B"
+msgstr ""
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:70
+msgid "-2"
+msgstr ""
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:71
+msgid "-1"
+msgstr ""
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:72
+msgid "0"
+msgstr "0"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:73
+#, fuzzy
+msgid "1"
+msgstr "%1"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:74
+msgid "2"
+msgstr ""
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:75
+msgid "3"
+msgstr ""
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:76
+#, fuzzy
+msgid "4"
+msgstr "A4"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:77
+msgid "5"
+msgstr ""
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:78
+msgid "6"
+msgstr ""
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:79
+msgid "7"
+msgstr ""
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:83
+#, fuzzy
+msgid "double flat"
+msgstr "双重扁平化"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:84
+#, fuzzy
+msgid "flat"
+msgstr "平坦化"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:85
+#, fuzzy
+msgid "natural"
+msgstr "自然化"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:86
+#, fuzzy
+msgid "sharp"
+msgstr "锐化"
+
+#: ../src/gui/widgets/DiatonicPitchChooser.cpp:87
+#, fuzzy
+msgid "double sharp"
+msgstr "双重锐化"
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:234
+#, fuzzy, c-format
+msgid "In %1"
+msgstr "撤销(&O) %1"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:587
+#: ../src/gui/widgets/AudioRouteMenu.cpp:236
+#: ../src/gui/widgets/AudioRouteMenu.cpp:259
+msgid "Master"
+msgstr "控制器"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:528
+#: ../src/gui/widgets/AudioRouteMenu.cpp:238
+#: ../src/gui/widgets/AudioRouteMenu.cpp:261
+#, c-format
+msgid "Sub %1"
+msgstr ""
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:244
+msgid "In %1 R"
+msgstr ""
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:245
+msgid "In %1 L"
+msgstr ""
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:247
+#, fuzzy
+msgid "Master R"
+msgstr "MMC 主控"
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:248
+#, fuzzy
+msgid "Master L"
+msgstr "MMC 主控"
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:250
+msgid "Sub %1 R"
+msgstr ""
+
+#: ../src/gui/widgets/AudioRouteMenu.cpp:251
+msgid "Sub %1 L"
+msgstr ""
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:391
+#: ../src/gui/studio/AudioMixerWindow.cpp:522
+#: ../src/gui/widgets/AudioFaderBox.cpp:82
+msgid "Audio plugin button"
+msgstr "音频插件按钮"
+
+#: ../src/gui/editors/parameters/AudioInstrumentParameterPanel.cpp:129
+#: ../src/gui/editors/parameters/AudioInstrumentParameterPanel.cpp:357
+#: ../src/gui/widgets/AudioFaderBox.cpp:91
+#, fuzzy
+msgid "<no synth>"
+msgstr "<没有事件>"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:93
+#, fuzzy
+msgid "Synth plugin button"
+msgstr "音频插件按钮"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:153
+msgid "Set the audio pan position in the stereo field"
+msgstr "设置立体声环境里的音频相位"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:155
+#, fuzzy
+msgid "Open synth plugin's native editor"
+msgstr "以字模编辑器打开(&X)"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:157
+#, fuzzy
+msgid "Mono or Stereo Instrument"
+msgstr "单声道或立体声音频设备"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:159
+#, fuzzy
+msgid "Record level"
+msgstr "录音音量 = "
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:161
+#, fuzzy
+msgid "Playback level"
+msgstr "回放音量 = "
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:345
+#: ../src/gui/studio/AudioMixerWindow.cpp:347
+#: ../src/gui/studio/AudioMixerWindow.cpp:503
+#: ../src/gui/studio/AudioMixerWindow.cpp:505
+#: ../src/gui/widgets/AudioFaderBox.cpp:163
+msgid "Audio level"
+msgstr "音频电平"
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:170
+msgid "In:"
+msgstr ""
+
+#: ../src/gui/widgets/AudioFaderBox.cpp:173
+msgid "Out:"
+msgstr "输出:"
+
+#: ../src/gui/widgets/ProgressDialog.cpp:48
+#: ../src/gui/widgets/ProgressDialog.cpp:53
+#: ../src/gui/widgets/ProgressDialog.cpp:76
+msgid "Processing..."
+msgstr "正在处理..."
+
+#: ../src/gui/configuration/ColourConfigurationPage.h:60
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:130
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:346
+#: ../src/gui/widgets/ColourTable.cpp:52
+msgid "Color"
+msgstr "配色"
+
+#: ../src/gui/widgets/ColourTable.cpp:68
+msgid "Modify Color Name"
+msgstr "修改配色名称"
+
+#: ../src/gui/configuration/ColourConfigurationPage.cpp:129
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:983
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:882
+#: ../src/gui/widgets/ColourTable.cpp:68
+msgid "Enter new name"
+msgstr "输入新名称"
+
+#: ../src/gui/widgets/ColourTable.cpp:107
+msgid "Default Color"
+msgstr "默认配色"
+
+#: ../src/gui/widgets/Rotary.cpp:108
+msgid ""
+"Click and drag up and down or left and right to modify.\n"
+"Double click to edit value directly."
+msgstr ""
+
+#: ../src/gui/widgets/Rotary.cpp:433
+#, fuzzy
+msgid "Select a new value"
+msgstr "删除该属性"
+
+#: ../src/gui/widgets/Rotary.cpp:434
+#, fuzzy
+msgid "Enter a new value"
+msgstr "输入新名称"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:80
+#, fuzzy
+msgid "Quantizer"
+msgstr "量化"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:86
+#, fuzzy
+msgid "Quantizer type:"
+msgstr "量化类型"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:88
+msgid "Grid quantizer"
+msgstr "栅格量化"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:89
+#, fuzzy
+msgid "Legato quantizer"
+msgstr "栅格量化"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:90
+msgid "Heuristic notation quantizer"
+msgstr "启发记号量化"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:94
+msgid "Quantize for notation only (leave performance unchanged)"
+msgstr "仅对记号量化(保持性能不变)"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:104
+msgid "Notation parameters"
+msgstr "记号参数"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:109
+#: ../src/gui/widgets/QuantizeParameters.cpp:150
+msgid "Base grid unit:"
+msgstr "基础栅格单元:"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:114
+msgid "Complexity:"
+msgstr "复杂度:"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:118
+msgid "Very high"
+msgstr "非常高"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:119
+msgid "High"
+msgstr "高"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:224
+#: ../src/gui/widgets/QuantizeParameters.cpp:120
+msgid "Normal"
+msgstr "正常"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:121
+msgid "Low"
+msgstr "低"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:122
+msgid "Very low"
+msgstr "非常低"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:125
+msgid "Tuplet level:"
+msgstr "连音级别:"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:129
+msgid "2-in-the-time-of-3"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:4241
+#: ../src/gui/widgets/QuantizeParameters.cpp:130
+msgid "Triplet"
+msgstr "三连音"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:138
+msgid "Any"
+msgstr "任意"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:141
+#, fuzzy
+msgid "Permit counterpoint"
+msgstr "正在删除配合旋律(对位音)..."
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:145
+msgid "Grid parameters"
+msgstr "删格参数"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:154
+msgid "Swing:"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:159
+msgid "Iterative amount:"
+msgstr ""
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:165
+msgid "Quantize durations as well as start times"
+msgstr "量化音长及起始时间"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:169
+msgid "After quantization"
+msgstr "在量化后"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:183
+#, fuzzy
+msgid "Show advanced options"
+msgstr "高级选项"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:192
+msgid "Re-beam"
+msgstr "重新分开符尾"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:194
+msgid "Add articulations (staccato, tenuto, slurs)"
+msgstr "添加辅音(断音、持续、连音)"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:195
+msgid "Tie notes at barlines etc"
+msgstr "将音符捆绑于进程线等等"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:196
+msgid "Split-and-tie overlapping chords"
+msgstr "分割与捆绑重叠和弦"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:307
+#, fuzzy
+msgid "Full quantize"
+msgstr "栅格量化"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:450
+#, fuzzy
+msgid "Show Advanced Options"
+msgstr "高级选项"
+
+#: ../src/gui/widgets/QuantizeParameters.cpp:454
+#, fuzzy
+msgid "Hide Advanced Options"
+msgstr "高级选项"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:257
+#: ../src/gui/configuration/MatrixConfigurationPage.h:56
+#: ../src/gui/configuration/MatrixConfigurationPage.h:57
+#: ../src/gui/editors/matrix/MatrixView.cpp:2709
+msgid "Matrix"
+msgstr "字模"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:64
+msgid "Printable headers"
+msgstr ""
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:92
+#, fuzzy
+msgid "Dedication"
+msgstr "指示"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:96
+#: ../src/gui/editors/segment/PlayListView.cpp:35
+#, fuzzy
+msgid "Title"
+msgstr "三连音"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:100
+msgid "Subtitle"
+msgstr "小标题"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:104
+#, fuzzy
+msgid "Subsubtitle"
+msgstr "小标题"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:108
+#, fuzzy
+msgid "Poet"
+msgstr "休止符"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:116
+msgid "Composer"
+msgstr "作曲者"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:120
+#, fuzzy
+msgid "Meter"
+msgstr "控制器"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:124
+#, fuzzy
+msgid "Arranger"
+msgstr "三连音"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:128
+#, fuzzy
+msgid "Piece"
+msgstr "音色"
+
+#: ../data/fonts/mappings/fonts.cpp:26
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:132
+msgid "Opus"
+msgstr "Opus"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:136
+msgid "Copyright"
+msgstr "版权所有"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:140
+#, fuzzy
+msgid "Tagline"
+msgstr "三连音"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:155
+#, fuzzy
+msgid "The composition comes here."
+msgstr "修改作品长度"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:172
+msgid "Non-printable headers"
+msgstr ""
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:213
+msgid "Add New Property"
+msgstr "添加新属性"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:217
+msgid "Delete Property"
+msgstr "删除属性"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:236
+msgid "{new property %1}"
+msgstr "{新属性 %1}"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:236
+msgid "{new property}"
+msgstr "{新属性}"
+
+#: ../src/gui/configuration/HeadersConfigurationPage.cpp:243
+msgid "{undefined}"
+msgstr "{未定义}"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:87
+#, fuzzy
+msgid "Double-click opens segment in"
+msgstr "默认编辑器(用于在小节上双击时的编辑器)"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:91
+#, fuzzy
+msgid "Notation editor"
+msgstr "记号时长:"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:92
+#, fuzzy
+msgid "Matrix editor"
+msgstr "以字模编辑器打开(&X)"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:93
+#, fuzzy
+msgid "Event List editor"
+msgstr "以事件列表编辑器打开(&E)"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:99
+#, fuzzy
+msgid "Number of count-in measures when recording"
+msgstr "录音时进程条的数量"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:109
+#, fuzzy
+msgid "Auto-save interval"
+msgstr "自动保存的时间间隔(秒)"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:112
+msgid "Every 30 seconds"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:113
+msgid "Every minute"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:114
+msgid "Every five minutes"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:115
+msgid "Every half an hour"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:116
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:277
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:157
+#, fuzzy
+msgid "Never"
+msgstr "混响"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:140
+#, fuzzy
+msgid "Use JACK transport"
+msgstr "忽略 JACK 播放控制器"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:173
+msgid "Unknown"
+msgstr "未知"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:179
+msgid "No MIDI, audio OK"
+msgstr "无 MIDI,有音频"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:182
+msgid "MIDI OK, no audio"
+msgstr "有 MIDI,无音频"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:185
+msgid "MIDI OK, audio OK"
+msgstr "有 MIDI,有音频"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:188
+msgid "No driver"
+msgstr "无驱动程序"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:195
+#, fuzzy
+msgid "Details..."
+msgstr "删除轨道..."
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:204
+#, fuzzy
+msgid "Behavior"
+msgstr "行为"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:219
+msgid "Side-bar parameter box layout"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:223
+msgid "Vertically stacked"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:225
+msgid "Tabbed"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:233
+msgid "Note name style"
+msgstr "音符名称样式"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:237
+msgid "Always use US names (e.g. quarter, 8th)"
+msgstr "总是使用美国名称(例如 quarter,8th)"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:238
+#, fuzzy
+msgid "Localized (where available)"
+msgstr "本地化的(如果可用的话)"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:252
+#, fuzzy
+msgid "Show textured background on"
+msgstr "在画布上使用网纹背景"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:254
+msgid "Main window"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:275
+msgid "Use bundled Klearlook theme"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:278
+msgid "When not running under KDE"
+msgstr ""
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:279
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:159
+#, fuzzy
+msgid "Always"
+msgstr "斜线"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:287
+msgid "Presentation"
+msgstr "演示"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.cpp:423
+msgid ""
+"Changes to the textured background in the main window will not take effect "
+"until you restart Rosegarden."
+msgstr ""
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:168
+#: ../src/gui/configuration/GeneralConfigurationPage.h:78
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:207
+#: ../src/gui/configuration/MatrixConfigurationPage.cpp:59
+msgid "General"
+msgstr "常规"
+
+#: ../src/gui/configuration/GeneralConfigurationPage.h:79
+msgid "General Configuration"
+msgstr "常规配置"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:92
+msgid "Base octave number for MIDI pitch display"
+msgstr "用于 MIDI 音色显示的低音八度音阶数"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:107
+msgid "Always use default studio when loading files"
+msgstr "载入文件时总是使用默认工作环境"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:119
+#, fuzzy
+msgid "Send all MIDI Controllers at start of each playback"
+msgstr ""
+"在回放开始的时候发送全部 MIDI 控制器\n"
+" (将招致明显的延迟)"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:121
+msgid ""
+"Rosegarden can send all MIDI Controllers (Pan, Reverb etc) to all MIDI "
+"devices every\n"
+"time you hit play if you so wish. Please note that this option will usually "
+"incur a\n"
+"delay at the start of playback due to the amount of data being transmitted."
+msgstr ""
+"如果您愿意,每当您点击播放按钮,Rosegarden 能向全部 MIDI 设备\n"
+"发送全部 MIDI 控制器(音相、混响等等)。请注意此选项常常会在回放\n"
+"开始引起延迟,原因是要传输大量的数据。"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:138
+#, fuzzy
+msgid "Sequencer timing source"
+msgstr "音序发生器定时器"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:163
+msgid "Load SoundFont to SoundBlaster card at startup"
+msgstr "开始时向 SoundBlaster 卡载入声音字体"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:164
+msgid ""
+"Check this box to enable soundfont loading on EMU10K-based cards when "
+"Rosegarden is launched"
+msgstr "选中此复选框来启用当 Rosegarden 启动后基于 EMU10K 卡的声音字体装载"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:173
+msgid "Path to 'asfxload' or 'sfxload' command"
+msgstr "到“asfxload”或“sfxload”命令的路径"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:180
+msgid "SoundFont"
+msgstr "声音字体"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:223
+#, fuzzy
+msgid "MIDI Clock and System messages"
+msgstr "发送 MIDI 时钟和系统消息"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:229
+#, fuzzy
+msgid "Send MIDI Clock, Start and Stop"
+msgstr "发送 MIDI 时钟和系统消息"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:230
+msgid "Accept Start, Stop and Continue"
+msgstr ""
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:241
+#, fuzzy
+msgid "MIDI Machine Control mode"
+msgstr "管理控制器事件"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:248
+msgid "MMC Master"
+msgstr "MMC 主控"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:249
+msgid "MMC Slave"
+msgstr "MMC 从属"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:260
+msgid "MIDI Time Code mode"
+msgstr ""
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:267
+#, fuzzy
+msgid "MTC Master"
+msgstr "MMC 主控"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:268
+#, fuzzy
+msgid "MTC Slave"
+msgstr "MMC 从属"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:281
+msgid "Automatically connect sync output to all devices in use"
+msgstr ""
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:292
+#, fuzzy
+msgid "MIDI Sync"
+msgstr "MIDI 潜伏期"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:308
+msgid "sfxload path"
+msgstr "sfx 装载路径"
+
+#: ../src/gui/configuration/MIDIConfigurationPage.cpp:315
+msgid "Soundfont path"
+msgstr "声音字体路径"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:67
+msgid "%1 minutes %2.%3%4 seconds (%5 units, %6 measures)"
+msgstr "%1 分 %2.%3%4 秒 (%5 个单元, %6 个进程条)"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:133
+msgid "Filename:"
+msgstr "文件名:"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:136
+msgid "Formal duration (to end marker):"
+msgstr "表观时长(到结束标记的):"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:141
+msgid "Playing duration:"
+msgstr "播放时长:"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:146
+msgid "Tracks:"
+msgstr "轨道:"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:147
+msgid "%1 used, %2 total"
+msgstr "已用 %1,总共 %2"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:152
+msgid "Segments:"
+msgstr "节数:"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:153
+msgid "%1 MIDI, %2 audio, %3 total"
+msgstr "MIDI %1,音频 %2,总共 %3"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:161
+msgid "Statistics"
+msgstr "统计"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:170
+#: ../src/gui/editors/parameters/InstrumentParameterBox.cpp:155
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:92
+msgid "Track"
+msgstr "轨道"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:171
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:125
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:90
+msgid "Label"
+msgstr "标注"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:172
+msgid "Time"
+msgstr "时间"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:174
+msgid "Events"
+msgstr "事件"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:175
+msgid "Polyphony"
+msgstr "复调"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:176
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:126
+msgid "Repeat"
+msgstr "重复"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:178
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:128
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:305
+#: ../src/gui/general/EditView.cpp:1488
+msgid "Transpose"
+msgstr "变调"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:179
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:129
+msgid "Delay"
+msgstr "延迟"
+
+#: ../src/gui/configuration/AudioConfigurationPage.h:61
+#: ../src/gui/configuration/AudioPropertiesPage.h:58
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:204
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:523
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:524
+msgid "Audio"
+msgstr "音频"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:204
+#: ../src/gui/configuration/MIDIConfigurationPage.h:62
+#, fuzzy
+msgid "MIDI"
+msgstr "II"
+
+#: ../src/gui/configuration/DocumentMetaConfigurationPage.cpp:317
+#, fuzzy
+msgid "Segment Summary"
+msgstr "摘要"
+
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:63
+#, fuzzy
+msgid "Audio file path:"
+msgstr "声音文件路径"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:137
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:68
+msgid "Choose..."
+msgstr "选择..."
+
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:73
+msgid "Disk space remaining:"
+msgstr "磁盘空间剩余:"
+
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:78
+msgid "Equivalent minutes of 16-bit stereo:"
+msgstr "等价于 16 位立体声音乐的分钟数:"
+
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:90
+msgid "Modify audio path"
+msgstr "修改音频路径"
+
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:113
+msgid "%1 out of %2 (%3% used)"
+msgstr ""
+
+#: ../src/gui/configuration/AudioPropertiesPage.cpp:144
+msgid "minutes at"
+msgstr ""
+
+#: ../src/gui/configuration/MIDIConfigurationPage.h:63
+#, fuzzy
+msgid "MIDI Settings"
+msgstr "音频设置"
+
+#: ../src/gui/configuration/AudioConfigurationPage.h:62
+#: ../src/gui/configuration/AudioPropertiesPage.h:59
+msgid "Audio Settings"
+msgstr "音频设置"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:87
+msgid "Default layout mode"
+msgstr "默认布局模式"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:91
+msgid "Linear layout"
+msgstr "谱线布局"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:92
+msgid "Continuous page layout"
+msgstr "连续页面布局"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:93
+msgid "Multiple page layout"
+msgstr "多页面布局"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:101
+msgid "Default spacing"
+msgstr "默认间隔"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:125
+msgid "Default duration factor"
+msgstr "默认音长因数"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:141
+msgid "Full"
+msgstr "充满"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:152
+msgid "Show track headers (linear layout only)"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:158
+msgid "When needed"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:166
+msgid ""
+"\"Always\" and \"Never\" mean what they usually mean\n"
+"\"When needed\" means \"when staves are too many to all fit in the current "
+"window\""
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:178
+msgid "Show non-notation events as question marks"
+msgstr "将非记号事件显示为问题标记"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:188
+#, fuzzy
+msgid "Show notation-quantized notes in a different color"
+msgstr "以不同的颜色显示记号量化的音符"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:198
+msgid "Show \"invisible\" events in grey"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:208
+msgid "Show notes outside suggested playable range in red"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:218
+msgid "Highlight superimposed notes with a halo effect"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:231
+msgid "When recording MIDI, split-and-tie long notes at barlines"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:242
+msgid "Layout"
+msgstr "布局"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:255
+msgid "Default note style for new notes"
+msgstr "新音符的默认音符样式"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:287
+msgid "When inserting notes..."
+msgstr "当插入音符时..."
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:294
+msgid "Split notes into ties to make durations match"
+msgstr "分割音符成束使音长匹配"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:295
+msgid "Ignore existing durations"
+msgstr "忽略现有音长"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:305
+msgid "Auto-beam on insert when appropriate"
+msgstr "插入音符时在适当的时机自动分开符尾"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:317
+#: ../src/gui/editors/notation/NotationEraser.cpp:54
+msgid "Collapse rests after erase"
+msgstr "擦除后压缩休止符"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:328
+msgid "Default paste type"
+msgstr "默认粘贴类型"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:350
+msgid "Editing"
+msgstr "编辑"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:362
+#, fuzzy
+msgid "Accidentals in one octave..."
+msgstr "正在升高一个八度音阶..."
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:364
+msgid "Affect only that octave"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:365
+#, fuzzy
+msgid "Require cautionaries in other octaves"
+msgstr "没有其他节拍变化。"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:366
+msgid "Affect all subsequent octaves"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:374
+#, fuzzy
+msgid "Accidentals in one bar..."
+msgstr "临时记号工具栏"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:376
+msgid "Affect only that bar"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:377
+msgid "Require cautionary resets in following bar"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:378
+msgid "Require explicit resets in following bar"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:386
+msgid "Key signature cancellation style"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:388
+msgid "Cancel only when entering C major or A minor"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:389
+msgid "Cancel whenever removing sharps or flats"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:390
+msgid "Cancel always"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:400
+#, fuzzy
+msgid "Accidentals"
+msgstr "临时记号(&A)"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:441
+msgid "Notation font"
+msgstr "记号字体"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:467
+msgid "Origin:"
+msgstr "来源:"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:471
+msgid "Copyright:"
+msgstr "版权所有:"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:475
+msgid "Mapped by:"
+msgstr "制图:"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:479
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:81
+msgid "Type:"
+msgstr "类型:"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:508
+msgid "Font size for single-staff views"
+msgstr "单五线谱视图的字体大小"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:516
+msgid "Font size for multi-staff views"
+msgstr "多五线谱视图的字体大小"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:524
+msgid "Font size for printing (pt)"
+msgstr "打印字体大小(pt)"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:541
+#, fuzzy
+msgid "Text font"
+msgstr "文本:"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:549
+msgid "Sans-serif font"
+msgstr ""
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:664
+msgid "%1 (smooth)"
+msgstr "%1 (平滑)"
+
+#: ../src/gui/configuration/NotationConfigurationPage.cpp:667
+msgid "%1 (jaggy)"
+msgstr "%1 (粗糙)"
+
+#: ../src/gui/configuration/LatencyConfigurationPage.cpp:58
+msgid "JACK latency"
+msgstr "JACK 潜伏期"
+
+#: ../src/gui/configuration/LatencyConfigurationPage.cpp:61
+msgid ""
+"Use the \"Fetch JACK latencies\" button to discover the latency values set "
+"at\n"
+"the sequencer. It's recommended that you use the returned values but it's "
+"also\n"
+"possible to override them manually using the sliders. Note that if you "
+"change\n"
+"your JACK server parameters you should always fetch the latency values "
+"again.\n"
+"The latency values will be stored by Rosegarden for use next time."
+msgstr ""
+"使用“获取 JACK 潜伏期”按钮来查看音序发生器里设置的潜伏期值。\n"
+"建议您使用这些返回值,但是使用滑块手工覆盖这些值也是可以的。\n"
+"请注意,如果您更改了您的 JACK 服务器参数,您应该总是重新获取\n"
+"潜伏期值。这些潜伏期值将被 Rosegarden 保存以备下次使用。"
+
+#: ../src/gui/configuration/LatencyConfigurationPage.cpp:65
+msgid "JACK playback latency (in ms)"
+msgstr "JACK 回放潜伏期(ms)"
+
+#: ../src/gui/configuration/LatencyConfigurationPage.cpp:66
+msgid "JACK record latency (in ms)"
+msgstr "JACK 录制潜伏期(ms)"
+
+#: ../src/gui/configuration/LatencyConfigurationPage.cpp:68
+msgid "Fetch JACK latencies"
+msgstr "获取 JACK 潜伏期"
+
+#: ../src/gui/configuration/LatencyConfigurationPage.cpp:121
+msgid "JACK Latency"
+msgstr "JACK 潜伏期"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:92
+#, fuzzy
+msgid "Audio preview scale"
+msgstr "音频电平"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:96
+msgid "Linear - easier to see loud peaks"
+msgstr ""
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:97
+msgid "Meter scaling - easier to see quiet activity"
+msgstr ""
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:105
+#, fuzzy
+msgid "Record audio files as"
+msgstr "<没有音频文件>"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:107
+msgid "16-bit PCM WAV format (smaller files)"
+msgstr ""
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:108
+msgid "32-bit float WAV format (higher quality)"
+msgstr ""
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:117
+msgid "External audio editor"
+msgstr "外部音频编辑器"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:145
+msgid "Create JACK outputs"
+msgstr ""
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:150
+#, fuzzy
+msgid "for individual audio instruments"
+msgstr "每音频设备"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:157
+#, fuzzy
+msgid "for submasters"
+msgstr "显示标尺(&U)"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:184
+#, fuzzy
+msgid ""
+"Rosegarden can start the JACK audio daemon (jackd) for you automatically if "
+"it isn't already running when Rosegarden starts.\n"
+"\n"
+"This is recommended for beginners and those who use Rosegarden as their main "
+"audio application, but it might not be to the liking of advanced users.\n"
+"\n"
+"If you want to start JACK automatically, make sure the command includes a "
+"full path where necessary as well as any command-line arguments you want to "
+"use.\n"
+"\n"
+"For example: /usr/local/bin/jackd -d alsa -d hw -r44100 -p 2048 -n 2\n"
+"\n"
+msgstr ""
+"Rosegarden 启动的时候,如果 JACK 音频守侯进程(jackd)\n"
+"尚未运行,Rosegarden 可以为您自动开启它。\n"
+"\n"
+"推荐初学者和那些将 Rosegarden 作为主要音频应用程序的\n"
+"人们这样设置,但是高级用户可能并不喜欢这样做。\n"
+"\n"
+"如果您想自动开启 JACK,请确保命令行包含必需的完整路径\n"
+"以及任何您想使用的命令行参数。\n"
+"\n"
+"例如:/usr/local/bin/jackd -d alsa -d hw -r44100 -p 2048 -n 2\n"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:196
+msgid "Start JACK when Rosegarden starts"
+msgstr "启动 Rosegarden 的同时启动 JACK"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:201
+msgid "JACK command"
+msgstr ""
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:214
+#, fuzzy
+msgid "JACK Startup"
+msgstr "启动"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:224
+msgid "External audio editor path"
+msgstr "外部音频编辑器路径"
+
+#: ../src/gui/configuration/AudioConfigurationPage.cpp:262
+msgid "External audio editor \"%1\" not found or not executable"
+msgstr ""
+
+#: ../src/gui/configuration/ColourConfigurationPage.cpp:70
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:448
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:863
+msgid "Add New Color"
+msgstr "添加新配色"
+
+#: ../src/gui/configuration/ColourConfigurationPage.cpp:74
+msgid "Delete Color"
+msgstr "删除风格"
+
+#: ../src/gui/configuration/ColourConfigurationPage.cpp:93
+msgid "Color Map"
+msgstr "风格映射"
+
+#: ../src/gui/configuration/ColourConfigurationPage.cpp:128
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:983
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:882
+msgid "New Color Name"
+msgstr "新配色名"
+
+#: ../src/gui/configuration/ColourConfigurationPage.cpp:130
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:59
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:984
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:883
+#: ../src/gui/studio/DeviceManagerDialog.cpp:115
+#: ../src/gui/studio/DeviceManagerDialog.cpp:174
+msgid "New"
+msgstr "新建"
+
+#: ../src/gui/configuration/LatencyConfigurationPage.h:62
+msgid "Latency"
+msgstr "潜伏期"
+
+#: ../src/gui/configuration/LatencyConfigurationPage.h:63
+msgid "Sequencer Latency"
+msgstr "音序发生器潜伏期"
+
+#: ../src/gui/configuration/ColourConfigurationPage.h:61
+#, fuzzy
+msgid "Color Settings"
+msgstr "音频设置"
+
+#: ../src/gui/studio/MidiDeviceListViewItem.cpp:55
+#: ../src/gui/studio/MidiKeyMapListViewItem.cpp:44
+#, fuzzy
+msgid "Key Mapping"
+msgstr "基调修改"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:97
+msgid "Manage MIDI Banks and Programs"
+msgstr "管理 MIDI 音色库和指令列"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:128
+msgid "MIDI Device"
+msgstr "MIDI 设备"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:130
+#: ../src/gui/studio/BankEditorDialog.cpp:219
+msgid "MSB"
+msgstr "MSB"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:131
+#: ../src/gui/studio/BankEditorDialog.cpp:218
+msgid "LSB"
+msgstr "LSB"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:140
+#, fuzzy
+msgid "Add Bank"
+msgstr "添加轨道..."
+
+#: ../src/gui/studio/BankEditorDialog.cpp:141
+#, fuzzy
+msgid "Add Key Mapping"
+msgstr "添加键改变(&K)..."
+
+#: ../src/gui/studio/BankEditorDialog.cpp:153
+msgid "Add a Bank to the current device"
+msgstr "为当前设备添加一个库"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:157
+#, fuzzy
+msgid "Add a Percussion Key Mapping to the current device"
+msgstr "为当前设备添加一个库"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:161
+#, fuzzy
+msgid "Delete the current Bank or Key Mapping"
+msgstr "删除当前库"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:165
+#, fuzzy
+msgid "Delete all Banks and Key Mappings from the current Device"
+msgstr "从当前设备删除全部库"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:167
+#: ../src/gui/studio/DeviceManagerDialog.cpp:117
+msgid "Import..."
+msgstr "导入..."
+
+#: ../src/gui/studio/BankEditorDialog.cpp:168
+#: ../src/gui/studio/DeviceManagerDialog.cpp:118
+msgid "Export..."
+msgstr "导出..."
+
+#: ../src/gui/studio/BankEditorDialog.cpp:176
+msgid ""
+"Import Bank and Program data from a Rosegarden file to the current Device"
+msgstr "从玫瑰园文件导入库和指令列数据到当前设备"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:179
+msgid ""
+"Export all Device and Bank information to a Rosegarden format interchange "
+"file"
+msgstr "导出全部设备和库信息到一个玫瑰园格式交换文件"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:190
+msgid "Copy all Program names from current Bank to clipboard"
+msgstr "从当前库复制全部指令列名称到剪贴板"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:194
+msgid "Paste Program names from clipboard to current Bank"
+msgstr "从剪贴板粘贴指令列名称到当前库"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:216
+msgid "Show Variation list based on "
+msgstr "显示变奏列表,基于 "
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1010
+msgid "<new bank>"
+msgstr "<新建库>"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1046
+#, fuzzy
+msgid "<new mapping>"
+msgstr "<新建库>"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1048
+#, fuzzy
+msgid "<new mapping %1>"
+msgstr "<新建库>"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1089
+msgid "Really delete this bank?"
+msgstr "真的要删除这个库吗?"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1137
+#, fuzzy
+msgid "Really delete this key mapping?"
+msgstr "真的要删除这个库吗?"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1187
+msgid "Really delete all banks for "
+msgstr "真的要删除全部库从"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1476
+msgid "Import Banks from Device in File"
+msgstr "从设备导入库于文件"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1623
+#: ../src/gui/studio/DeviceManagerDialog.cpp:770
+msgid "Export Device as..."
+msgstr "导出设备为..."
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1694
+msgid ""
+"There are unsaved changes.\n"
+"Do you want to apply the changes before exiting the Bank Editor or discard "
+"the changes ?"
+msgstr ""
+"有变更尚未保存。\n"
+"您想在退出音色库编辑器之前应用这些变更或放弃它们吗?"
+
+#: ../src/gui/studio/BankEditorDialog.cpp:1697
+msgid "Unsaved Changes"
+msgstr "未保存的变更"
+
+#: ../src/gui/studio/NameSetEditor.cpp:68
+msgid "Librarian"
+msgstr "库管理程序"
+
+#: ../src/gui/studio/NameSetEditor.cpp:75
+msgid "Email"
+msgstr "电子邮件"
+
+#: ../src/gui/studio/NameSetEditor.cpp:80
+#, fuzzy
+msgid ""
+"The librarian maintains the Rosegarden device data for this device.\n"
+"If you've made modifications to suit your own device, it might be worth\n"
+"liaising with the librarian in order to publish your information for the "
+"benefit\n"
+"of others."
+msgstr ""
+"库管理员为此设备维护常规音色库和指令列信息。如果您已经\n"
+"修改了一个音色库以适应您自己的设备,那么出于对其他人利\n"
+"益的考虑有必要和库管理员取得联系以便发布您的音色库信息。"
+
+#: ../src/gui/studio/MidiBankListViewItem.cpp:51
+#: ../src/gui/studio/MidiDeviceListViewItem.cpp:48
+#, fuzzy
+msgid "Percussion Bank"
+msgstr "打击乐器"
+
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:84
+#: ../src/gui/studio/MidiBankListViewItem.cpp:51
+#: ../src/gui/studio/MidiDeviceListViewItem.cpp:48
+msgid "Bank"
+msgstr "库"
+
+#: ../src/gui/studio/ChangeRecordDeviceCommand.h:39
+msgid "Change Record Device"
+msgstr "变更录制设备"
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:61
+#: ../src/gui/studio/DeviceManagerDialog.cpp:96
+msgid "Manage MIDI Devices"
+msgstr "管理 MIDI 设备"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:98
+msgid "Play devices"
+msgstr "播放设备"
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:76
+#: ../src/gui/studio/DeviceManagerDialog.cpp:106
+#: ../src/gui/studio/DeviceManagerDialog.cpp:165
+msgid "Connection"
+msgstr "连接"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:119
+msgid "Banks..."
+msgstr "库..."
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:120
+msgid "Control Events..."
+msgstr "控制事件..."
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:126
+msgid "Create a new Play device"
+msgstr "创建新播放设备"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:129
+#: ../src/gui/studio/DeviceManagerDialog.cpp:184
+msgid "Delete the selected device"
+msgstr "删除选中的设备"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:132
+msgid ""
+"Import Bank, Program and Controller data from a Rosegarden file to the "
+"selected device"
+msgstr "从玫瑰园文件导入库、指令列和控制器数据到选定的设备"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:135
+msgid "Export Bank and Controller data to a Rosegarden interchange file"
+msgstr "导出库和控制器数据到一个玫瑰园交换文件"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:138
+msgid "View and edit Banks and Programs for the selected device"
+msgstr "为选定的设备查看和编辑库和指令列"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:141
+msgid ""
+"View and edit Control Events for the selected device - these are special "
+"Event types that you can define against your device and control through "
+"Control Rulers or the Instrument Parameter Box "
+msgstr ""
+"对选定的设备查看和编辑控制事件 - 这些是特殊事件类型,可以针对您的设备进行定"
+"义,并且可以通过控制标尺或者乐器参数对话框进行控制。"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:156
+msgid "Record devices"
+msgstr "录制设备"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:164
+msgid "Current"
+msgstr "当前设备"
+
+#: ../src/gui/studio/DeviceManagerDialog.cpp:181
+msgid "Create a new Record device"
+msgstr "创建新录制设备"
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:360
+#: ../src/gui/studio/DeviceEditorDialog.cpp:378
+#: ../src/gui/studio/DeviceManagerDialog.cpp:486
+#: ../src/gui/studio/DeviceManagerDialog.cpp:501
+msgid "New Device"
+msgstr "新建设备"
+
+# "Import Device from File", except that we might not be importing
+#: ../src/gui/studio/DeviceManagerDialog.cpp:703
+msgid "Import from Device in File"
+msgstr "从文件载入设备数据(并非整个文件)"
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:55
+msgid "Remap Instrument assigments..."
+msgstr "重新映射乐器分配..."
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:62
+msgid "Device or Instrument"
+msgstr "设备或乐器"
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:65
+msgid "Remap Tracks by all Instruments on a Device or by single Instrument"
+msgstr "通过一个设备上的全部乐器或单一乐器重新映射轨道"
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:74
+msgid "Choose Source and Destination"
+msgstr "选择源和目标"
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:77
+msgid "From"
+msgstr "从"
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:78
+msgid "To"
+msgstr "到"
+
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:120
+#: ../src/gui/studio/RemapInstrumentDialog.cpp:121
+msgid "<no devices>"
+msgstr "<没有设备>"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:155
+#, fuzzy
+msgid "Show Audio &Faders"
+msgstr "显示标尺(&U)"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:160
+#, fuzzy
+msgid "Show Synth &Faders"
+msgstr "显示标尺(&U)"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:165
+#, fuzzy
+msgid "Show &Submasters"
+msgstr "显示标尺(&U)"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:170
+#, fuzzy
+msgid "Show &Plugin Buttons"
+msgstr "音频插件按钮"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:175
+msgid "Show &Unassigned Faders"
+msgstr ""
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:184
+#, c-format
+msgid ""
+"_n: 1 Input\n"
+"%n Inputs"
+msgstr ""
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:194
+msgid "No Submasters"
+msgstr ""
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:203
+#, fuzzy, c-format
+msgid ""
+"_n: 1 Submaster\n"
+"%n Submasters"
+msgstr "副控制器数量(&N)"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:279
+msgid "Audio Mixer"
+msgstr "混音器"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:311
+msgid "Record input source"
+msgstr "录制输入源"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:322
+msgid "Output destination"
+msgstr "输出目标"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:336
+#: ../src/gui/studio/AudioMixerWindow.cpp:495
+msgid "Pan"
+msgstr "音相"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:355
+msgid "Mono or stereo"
+msgstr "单声道或立体声"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:364
+#: ../src/gui/studio/AudioMixerWindow.cpp:513
+msgid "Mute"
+msgstr "静音"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:373 rc.cpp:408
+#, no-c-format
+msgid "Solo"
+msgstr "独奏"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:382
+#, fuzzy
+msgid "Arm recording"
+msgstr "正在录音"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:400
+#, c-format
+msgid "Audio %1"
+msgstr "音频 %1"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:404
+#, c-format
+msgid "Synth %1"
+msgstr "同步 %1"
+
+#: ../src/gui/studio/AudioMixerWindow.cpp:578
+#: ../src/gui/studio/AudioMixerWindow.cpp:580
+msgid "Audio master output level"
+msgstr "音频控制器输出电平"
+
+#: ../src/gui/studio/SynthPluginManagerDialog.cpp:71
+msgid "Manage Synth Plugins"
+msgstr "管理同步插件"
+
+#: ../src/gui/studio/SynthPluginManagerDialog.cpp:78
+msgid "Synth plugins"
+msgstr "同步插件"
+
+#: ../src/gui/studio/SynthPluginManagerDialog.cpp:145
+msgid "Controls"
+msgstr "控制器"
+
+#: ../src/gui/studio/SynthPluginManagerDialog.cpp:152
+msgid "Editor >>"
+msgstr "编辑器 >>"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:66
+#: ../src/gui/studio/MidiProgramsEditor.cpp:169
+msgid "Bank and Program details"
+msgstr "库和指令列细节"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:67
+#, fuzzy
+msgid "Programs"
+msgstr "指令列"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2711
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:88
+#: ../src/gui/studio/MidiProgramsEditor.cpp:93
+msgid "Percussion"
+msgstr "打击乐器"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:99
+msgid "MSB Value"
+msgstr "最高有效位(MSB)值"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:107
+msgid ""
+"Selects a MSB controller Bank number (MSB/LSB pairs are always unique for "
+"any Device)"
+msgstr "选择一个 MSB 控制器库号(任何设备的 MSB/LSB 对总是唯一的)"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:111
+msgid ""
+"Selects a LSB controller Bank number (MSB/LSB pairs are always unique for "
+"any Device)"
+msgstr "选择一个 LSB 控制器库号(任何设备的 MSB/LSB 对总是唯一的)"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:116
+msgid "LSB Value"
+msgstr "最低有效位(LSB)值"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:254
+#: ../src/gui/studio/MidiProgramsEditor.cpp:541
+#, fuzzy, c-format
+msgid "Key Mapping: %1"
+msgstr "基调修改"
+
+#: ../src/gui/studio/MidiProgramsEditor.cpp:476
+msgid "<no key mapping>"
+msgstr ""
+
+#: ../src/gui/studio/MidiKeyMappingEditor.cpp:57
+#: ../src/gui/studio/MidiKeyMappingEditor.cpp:81
+msgid "Key Mapping details"
+msgstr ""
+
+#: ../src/gui/studio/MidiKeyMappingEditor.cpp:58
+#, fuzzy
+msgid "Pitches"
+msgstr "音色"
+
+#: ../src/gui/studio/MidiMixerWindow.cpp:152
+msgid "MIDI Mixer"
+msgstr "MIDI 混音器"
+
+#: ../src/gui/studio/MidiMixerWindow.cpp:199
+msgid "Volume"
+msgstr "音量"
+
+#: ../src/gui/studio/AudioPluginOSCGUIManager.cpp:444
+msgid "Rosegarden Plugin"
+msgstr "玫瑰园插件"
+
+#: ../src/gui/studio/AudioPluginOSCGUIManager.cpp:447
+#, c-format
+msgid "Rosegarden: %1"
+msgstr "玫瑰园:%1"
+
+#: ../src/gui/studio/AudioPluginOSCGUIManager.cpp:449
+msgid "Rosegarden: %1: %2"
+msgstr "玫瑰园:%1:%2"
+
+#: ../src/gui/studio/AudioPluginOSCGUIManager.cpp:450
+#, c-format
+msgid "Plugin slot %1"
+msgstr "插件接口 %1"
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:92
+msgid "Add Play Device"
+msgstr "添加播放设备"
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:93
+msgid "Add Record Device"
+msgstr "添加录制设备"
+
+#: ../src/commands/studio/CreateOrDeleteDeviceCommand.h:68
+#: ../src/gui/studio/DeviceEditorDialog.cpp:94
+msgid "Delete Device"
+msgstr "删除设备"
+
+#: ../src/gui/editors/segment/PlayList.cpp:77
+#: ../src/gui/studio/DeviceEditorDialog.cpp:156
+#: ../src/gui/studio/DeviceEditorDialog.cpp:361
+msgid "Play"
+msgstr "播放"
+
+#: ../src/commands/segment/SegmentRecordCommand.cpp:37
+#: ../src/gui/studio/DeviceEditorDialog.cpp:156
+#: ../src/gui/studio/DeviceEditorDialog.cpp:379 rc.cpp:394
+#, no-c-format
+msgid "Record"
+msgstr "录制"
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:256
+msgid "Apply pending changes?"
+msgstr "应用待执行的修改吗?"
+
+#: ../src/gui/studio/DeviceEditorDialog.cpp:359
+#: ../src/gui/studio/DeviceEditorDialog.cpp:377
+msgid "<new device>"
+msgstr "<新设备>"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentEraser.cpp:82
+msgid "Click on a segment to delete it"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSplitter.cpp:166
+msgid ""
+"Click on a segment to split it in two; hold Shift to avoid snapping to beat "
+"grid"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSplitter.cpp:168
+msgid "Click on a segment to split it in two"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:81
+#, fuzzy
+msgid "Click and drag to select segments"
+msgstr "切换到选择工具"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentMover.cpp:154
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:238
+msgid "Move Segment"
+msgstr "移动小节"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentMover.cpp:154
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:239
+msgid "Move Segments"
+msgstr "移动小节"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:217
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:169
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:141
+#: ../src/gui/editors/segment/segmentcanvas/SegmentMover.cpp:210
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:255
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:359
+msgid "Hold Shift to avoid snapping to beat grid"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:485
+msgid ""
+"Click and drag to select segments; middle-click and drag to draw an empty "
+"segment"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:384
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:502
+msgid ""
+"Click and drag to resize a segment; hold Ctrl as well to rescale its contents"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:386
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:504
+msgid "Click and drag to rescale segment"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:509
+msgid "Click and drag to move segments; hold Ctrl as well to copy them"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:511
+msgid "Click and drag to copy segments"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:515
+msgid ""
+"Click and drag to move segment; hold Ctrl as well to copy it; double-click "
+"to edit"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp:517
+msgid "Click and drag to copy segment"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:157
+msgid ""
+"The audio file path does not exist or is not writable.\n"
+"You must set the audio file path to a valid directory in Document Properties "
+"before rescaling an audio file.\n"
+"Would you like to set it now?"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp:261
+msgid ""
+"Hold Shift to avoid snapping to beat grid; hold Ctrl as well to rescale "
+"contents"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentMover.cpp:325
+msgid "Click and drag to move a segment"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentPencil.cpp:225
+msgid "Hold Shift to avoid snapping to bar lines"
+msgstr ""
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentPencil.cpp:283
+#, fuzzy
+msgid "Record or drop audio here"
+msgstr "录制 MIDI 或音频"
+
+#: ../src/gui/editors/segment/segmentcanvas/SegmentPencil.cpp:289
+msgid ""
+"Click and drag to draw an empty segment. Control+Alt click and drag to draw "
+"in overlap mode."
+msgstr ""
+
+#: ../src/gui/editors/segment/TrackLabel.cpp:77
+msgid ""
+"Click and hold with left mouse button to assign this Track to an Instrument."
+msgstr ""
+
+#: ../src/gui/editors/segment/TrackLabel.cpp:191
+msgid "Change track name"
+msgstr ""
+
+#: ../src/gui/editors/segment/TrackLabel.cpp:192
+#, fuzzy
+msgid "Enter new track name"
+msgstr "输入新名称"
+
+#: ../src/gui/editors/segment/TrackEditor.cpp:648
+msgid "Turn Repeating Segment into Real Copies"
+msgstr "将重复的小节转换为真实的副本"
+
+#: ../src/gui/editors/segment/TrackEditor.cpp:650
+msgid "Turn Repeating Segments into Real Copies"
+msgstr "将重复的小节转换为真实的副本"
+
+#: ../src/gui/editors/segment/TrackEditor.cpp:814
+msgid ""
+"You can't drop files into Rosegarden from this client. Try using Konqueror "
+"instead."
+msgstr ""
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:85
+msgid "Manage Triggered Segments"
+msgstr "管理触发片段"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:89
+msgid "ID"
+msgstr "ID"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:735
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:93
+msgid "Base velocity"
+msgstr "基础力度"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:94
+msgid "Triggers"
+msgstr "触发器"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:115
+msgid "Add a Triggered Segment"
+msgstr "添加一个触发片段"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:119
+msgid "Delete a Triggered Segment"
+msgstr "删除一个触发片段"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:123
+msgid "Delete All Triggered Segments"
+msgstr "删除全部触发片段"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:127
+msgid "Close the Triggered Segment Manager"
+msgstr "关闭触发片段管理器"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:169
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:245
+msgid "<no label>"
+msgstr "(无标签)"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:248
+msgid ""
+"_n: %1 on 1 track\n"
+"%1 on %n tracks"
+msgstr ""
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:284
+msgid ""
+"This will remove all triggered segments from the whole composition. Are you "
+"sure?"
+msgstr ""
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:288
+msgid "Remove all triggered segments"
+msgstr "删除全部触发片段"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:313
+msgid "Trigger Segment Duration"
+msgstr "触发片段音长"
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:336
+#, c-format
+msgid ""
+"_n: This triggered segment is used 1 time in the current composition. Are "
+"you sure you want to remove it?\n"
+"This triggered segment is used %n times in the current composition. Are you "
+"sure you want to remove it?"
+msgstr ""
+
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:400
+msgid "Pa&ste as New Triggered Segment"
+msgstr "粘贴为新的触发片段(&S)"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1169
+#: ../src/gui/editors/segment/MarkerEditor.cpp:399
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:412
+#: ../src/gui/editors/tempo/TempoView.cpp:622
+msgid "&Musical Times"
+msgstr "音乐时间(&M)"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1179
+#: ../src/gui/editors/segment/MarkerEditor.cpp:409
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:422
+#: ../src/gui/editors/tempo/TempoView.cpp:632
+msgid "&Real Times"
+msgstr "实际时间(&R)"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1189
+#: ../src/gui/editors/segment/MarkerEditor.cpp:419
+#: ../src/gui/editors/segment/TriggerSegmentManager.cpp:432
+#: ../src/gui/editors/tempo/TempoView.cpp:642
+msgid "Ra&w Times"
+msgstr "天然时间(&W)"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:83
+#, fuzzy
+msgid "Manage Markers"
+msgstr "管理库..."
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:86
+msgid "Marker time "
+msgstr ""
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:87
+#, fuzzy
+msgid "Marker text "
+msgstr "起始时间:"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:88
+#, fuzzy
+msgid "Marker description "
+msgstr "描述"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:95
+#, fuzzy
+msgid "Pointer position"
+msgstr "插入到作品中"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:100
+#, fuzzy
+msgid "Real time:"
+msgstr "缩混比率"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:103
+msgid "In measure:"
+msgstr ""
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:121
+#, fuzzy
+msgid "Add a Marker"
+msgstr "添加文本标记(&X)..."
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:125
+#, fuzzy
+msgid "Delete a Marker"
+msgstr "删除库"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:129
+#, fuzzy
+msgid "Delete All Markers"
+msgstr "删除全部库"
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:133
+msgid "Close the Marker Editor"
+msgstr ""
+
+#: ../src/gui/editors/segment/MarkerEditor.cpp:296
+#, fuzzy
+msgid "Remove all markers"
+msgstr "删除所有标记(&R)"
+
+#: ../src/gui/editors/segment/PlayList.cpp:76
+#, fuzzy
+msgid "Add..."
+msgstr "添加轨道..."
+
+#: ../src/gui/editors/segment/PlayList.cpp:78
+#, fuzzy
+msgid "Move Up"
+msgstr "上移轨道(&U)"
+
+#: ../src/gui/editors/segment/PlayList.cpp:79
+#, fuzzy
+msgid "Move Down"
+msgstr "下移轨道(&D)"
+
+#: ../src/gui/editors/segment/PlayList.cpp:124
+#, fuzzy
+msgid "Select one or more Rosegarden files"
+msgstr "选择一个或更多音频文件"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:73
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:55
+msgid "<not showing>"
+msgstr "<未显示>"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:89
+msgid "Manage Control Events"
+msgstr "管理控制器事件"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:91
+msgid "<no device>"
+msgstr "<没有设备>"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:99
+msgid " Control Events for %1 (device %2)"
+msgstr " %1 的控制器事件(设备 %2)"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:104
+msgid "Control Event name "
+msgstr "控制器事件名称"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:105
+msgid "Control Event type "
+msgstr "控制器事件类型"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:106
+msgid "Control Event value "
+msgstr "控制器事件值"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:107
+msgid "Description "
+msgstr "描述 "
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:108
+msgid "Min "
+msgstr "最小 "
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:109
+msgid "Max "
+msgstr "最大 "
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:110
+msgid "Default "
+msgstr "默认 "
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:111
+msgid "Color "
+msgstr "配色 "
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:112
+msgid "Position on instrument panel"
+msgstr "乐器面板上的位置"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:136
+msgid "Add a Control Parameter to the Studio"
+msgstr "向工作环境添加一个控制器参数"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:140
+msgid "Delete a Control Parameter from the Studio"
+msgstr "从工作环境删除一个控制器参数"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:144
+msgid "Close the Control Parameter editor"
+msgstr "关闭控制器参数编辑器"
+
+#: ../src/gui/editors/segment/ControlEditorDialog.cpp:221
+msgid "<default>"
+msgstr "<默认>"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:62
+msgid "Edit Control Parameter"
+msgstr "编辑控制器参数"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:71
+msgid "Control Event Properties"
+msgstr "控制器事件属性"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:77
+msgid "Name:"
+msgstr "名称:"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:93
+msgid "Control Event value:"
+msgstr "控制器事件值:"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:97
+msgid "Minimum value:"
+msgstr "最小值:"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:101
+msgid "Maximum value:"
+msgstr "最大值:"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:105
+msgid "Default value:"
+msgstr "默认值:"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:109
+msgid "Color:"
+msgstr "配色:"
+
+#: ../src/gui/editors/segment/ControlParameterEditDialog.cpp:113
+msgid "Instrument Parameter Box position:"
+msgstr "乐器参数框位置:"
+
+#: ../src/gui/editors/segment/TrackButtons.cpp:209
+#: ../src/gui/editors/segment/TrackButtons.cpp:585
+#: ../src/gui/editors/segment/TrackButtons.cpp:935
+#: ../src/gui/editors/segment/TrackButtons.cpp:1127
+msgid "<no instrument>"
+msgstr "<没有乐器>"
+
+#: ../src/gui/editors/segment/TrackButtons.cpp:352
+#: ../src/gui/editors/segment/TrackButtons.cpp:1094
+#, fuzzy
+msgid "<untitled audio>"
+msgstr "<未命名>"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:130
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:662
+#: ../src/gui/editors/segment/TrackButtons.cpp:354
+#: ../src/gui/editors/segment/TrackButtons.cpp:1096
+msgid "<untitled>"
+msgstr "<未命名>"
+
+#: ../src/gui/editors/segment/TrackButtons.cpp:1058
+#, fuzzy
+msgid "Mute track"
+msgstr "冲击"
+
+#: ../src/gui/editors/segment/TrackButtons.cpp:1063
+msgid "Record on this track"
+msgstr ""
+
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:88
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:1015
+#, fuzzy
+msgid "Segment"
+msgstr "小节(&M)"
+
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:89
+#, fuzzy
+msgid "Segment Parameters"
+msgstr "乐器参数"
+
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:366
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:697
+msgid "%1 ms"
+msgstr "%1 ms"
+
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:1031
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:910
+msgid "Highest playable note"
+msgstr ""
+
+#: ../src/gui/editors/parameters/SegmentParameterBox.cpp:1051
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:930
+msgid "Lowest playable note"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:93
+#, fuzzy
+msgid "Track Parameters"
+msgstr "删格参数"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:137
+#, fuzzy
+msgid "Playback parameters"
+msgstr "回放音量 = "
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:172
+#, fuzzy
+msgid "Recording filters"
+msgstr "录制设备"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:191
+msgid "Channel"
+msgstr "通道"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:203
+#, fuzzy
+msgid "Staff export options"
+msgstr "高级选项"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:220
+#, fuzzy
+msgid "Notation size:"
+msgstr "记号时刻:"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:225
+#, fuzzy
+msgid "Small"
+msgstr "电子邮件"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:226
+msgid "Tiny"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:233
+#, fuzzy
+msgid "Bracket type:"
+msgstr "文本类型:"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:237
+msgid "-----"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:238
+msgid "[----"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:239
+msgid "----]"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:240
+msgid "[---]"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:241
+msgid "{----"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:242
+msgid "----}"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:243
+msgid "{[---"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:244
+msgid "---]}"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:253
+#, fuzzy
+msgid "Create segments with"
+msgstr "创建小节"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:264
+#, fuzzy
+msgid "Preset"
+msgstr "休止符"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:272
+#, fuzzy
+msgid "Load"
+msgstr "载入数据"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:282
+#, fuzzy
+msgid "treble"
+msgstr "高音"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:283
+#, fuzzy
+msgid "bass"
+msgstr "低音"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:284
+#, fuzzy
+msgid "crotales"
+msgstr "八度音阶(&O)"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:285
+msgid "xylophone"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:286
+msgid "guitar"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:287
+msgid "contrabass"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:288
+#, fuzzy
+msgid "celesta"
+msgstr "删除(&L)"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:289
+msgid "old celesta"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:290
+msgid "french"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:291
+msgid "soprano"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:292
+#, fuzzy
+msgid "mezzosoprano"
+msgstr "强音(&F)"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:293
+#, fuzzy
+msgid "alto"
+msgstr "女低音"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:294
+#, fuzzy
+msgid "tenor"
+msgstr "男高音"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:295
+#, fuzzy
+msgid "baritone"
+msgstr "音长"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:296
+#, fuzzy
+msgid "varbaritone"
+msgstr "音长"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:297
+#, fuzzy
+msgid "subbass"
+msgstr "低音"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:327
+#, fuzzy
+msgid "Lowest"
+msgstr "低"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:329
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:336
+msgid "---"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:331
+msgid "Choose the lowest suggested playable note, using a staff"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:334
+#, fuzzy
+msgid "Highest"
+msgstr "高"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:338
+msgid "Choose the highest suggested playable note, using a staff"
+msgstr ""
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:666
+#, fuzzy
+msgid "[ Track %1 - %2 ]"
+msgstr "指令列 %1 - %2"
+
+#: ../src/gui/editors/parameters/TrackParameterBox.cpp:985
+msgid "The instrument preset database is corrupt. Check your installation."
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:173
+#: ../src/gui/editors/parameters/InstrumentParameterBox.cpp:54
+msgid "Instrument Parameters"
+msgstr "乐器参数"
+
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:85
+#, fuzzy
+msgid "Variation"
+msgstr "音长"
+
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:86
+msgid "Program"
+msgstr "指令列"
+
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:87
+#, fuzzy
+msgid "Channel out"
+msgstr "通道"
+
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:215
+#: ../src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp:221
+msgid "[ %1 ]"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixEraser.cpp:58
+#: ../src/gui/editors/matrix/MatrixMover.cpp:71
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:67
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:77
+#, fuzzy
+msgid "Switch to Draw Tool"
+msgstr "切换到擦除工具"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:75
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:69
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:71
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:81
+#: ../src/gui/editors/notation/ClefInserter.cpp:57
+#: ../src/gui/editors/notation/GuitarChordInserter.cpp:63
+#: ../src/gui/editors/notation/NotationSelector.cpp:87
+#: ../src/gui/editors/notation/NoteInserter.cpp:113
+#: ../src/gui/editors/notation/RestInserter.cpp:72
+#: ../src/gui/editors/notation/TextInserter.cpp:61
+msgid "Switch to Erase Tool"
+msgstr "切换到擦除工具"
+
+#: ../src/gui/editors/matrix/MatrixEraser.cpp:62
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:73
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:75
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:85
+#, fuzzy
+msgid "Switch to Move Tool"
+msgstr "切换到擦除工具"
+
+#: ../src/gui/editors/matrix/MatrixEraser.cpp:68
+#: ../src/gui/editors/matrix/MatrixMover.cpp:81
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:79
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:93
+#, fuzzy
+msgid "Switch to Resize Tool"
+msgstr "切换到擦除工具"
+
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:446
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:579
+msgid "Click and drag to select; middle-click and drag to draw new note"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:324
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:597
+msgid "Click and drag to resize selected notes"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:599
+msgid "Click and drag to resize note"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:471
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:604
+msgid "Click and drag to move selected notes; hold Ctrl as well to copy"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:473
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:606
+#, fuzzy
+msgid "Click and drag to copy selected notes"
+msgstr "切换到选择工具"
+
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:610
+msgid "Click and drag to move note; hold Ctrl as well to copy"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixSelector.cpp:612
+msgid "Click and drag to copy note"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixEraser.cpp:54
+#: ../src/gui/editors/matrix/MatrixMover.cpp:67
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:65
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:63
+#: ../src/gui/editors/notation/ClefInserter.cpp:53
+#: ../src/gui/editors/notation/GuitarChordInserter.cpp:59
+#: ../src/gui/editors/notation/NotationEraser.cpp:67
+#: ../src/gui/editors/notation/NoteInserter.cpp:109
+#: ../src/gui/editors/notation/RestInserter.cpp:68
+#: ../src/gui/editors/notation/TextInserter.cpp:57
+msgid "Switch to Select Tool"
+msgstr "切换到选择工具"
+
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:218
+msgid "Resize Event"
+msgstr "改变事件大小"
+
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:221
+msgid "Resize Events"
+msgstr "改变事件大小"
+
+#: ../src/gui/editors/matrix/MatrixResizer.cpp:326
+#, fuzzy
+msgid "Click and drag to resize a note"
+msgstr "切换到选择工具"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:328
+#, fuzzy
+msgid "Copy and Move Event"
+msgstr "移动事件"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:330
+#, fuzzy
+msgid "Copy and Move Events"
+msgstr "移动事件"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:334
+msgid "Move Event"
+msgstr "移动事件"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:336
+msgid "Move Events"
+msgstr "移动事件"
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:465
+msgid "Click and drag to move a note; hold Ctrl as well to copy it"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixMover.cpp:467
+msgid "Click and drag to copy a note"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:361
+msgid "Click and drag to draw a note; Shift to avoid snapping to grid"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixPainter.cpp:363
+msgid "Click and drag to draw a note"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:437
+#: ../src/gui/editors/matrix/MatrixView.cpp:3053
+msgid "Couldn't apply piano roll layout"
+msgstr "无法应用钢琴谱布局"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:663
+#, fuzzy
+msgid "Resi&ze"
+msgstr "改变大小"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:669
+#: ../src/gui/editors/notation/NotationView.cpp:1919
+msgid "C&hord Insert Mode"
+msgstr "和弦插入模式(&H)"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:676
+#: ../src/gui/editors/notation/NotationView.cpp:1778
+#, fuzzy
+msgid "Ste&p Recording"
+msgstr "正在录音"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:694
+#, fuzzy
+msgid "&Legato"
+msgstr "法定"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:708
+#, fuzzy
+msgid "Set to Current Velocity"
+msgstr "提高力度(&I)"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:712
+msgid "Set Event &Velocities..."
+msgstr "设定事件力度(&V)..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:716
+#, fuzzy
+msgid "Trigger Se&gment..."
+msgstr "擦除小节"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:720
+#, fuzzy
+msgid "Remove Triggers..."
+msgstr "删除节拍变更(&T)..."
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1153
+#: ../src/gui/editors/matrix/MatrixView.cpp:724
+#: ../src/gui/editors/tempo/TempoView.cpp:606
+msgid "Select &All"
+msgstr "全部选择(&A)"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:732
+#: ../src/gui/editors/notation/NotationView.cpp:2325
+msgid "Cursor &Back"
+msgstr "光标后退(&B)"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:736
+#: ../src/gui/editors/notation/NotationView.cpp:2329
+msgid "Cursor &Forward"
+msgstr "光标前进(&F)"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:740
+#: ../src/gui/editors/notation/NotationView.cpp:2333
+msgid "Cursor Ba&ck Bar"
+msgstr "光标沿进程条后退(&C)"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:744
+#: ../src/gui/editors/notation/NotationView.cpp:2337
+msgid "Cursor For&ward Bar"
+msgstr "光标沿进程条前进(&W)"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:748
+#: ../src/gui/editors/notation/NotationView.cpp:2341
+msgid "Cursor Back and Se&lect"
+msgstr "光标后退并选中(&L)"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:752
+#: ../src/gui/editors/notation/NotationView.cpp:2345
+msgid "Cursor Forward and &Select"
+msgstr "光标前进并选中(&S)"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:756
+#: ../src/gui/editors/notation/NotationView.cpp:2349
+msgid "Cursor Back Bar and Select"
+msgstr "光标沿进程条后退并选中"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:760
+#: ../src/gui/editors/notation/NotationView.cpp:2353
+msgid "Cursor Forward Bar and Select"
+msgstr "光标沿进程条前进并选中"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:764
+#: ../src/gui/editors/notation/NotationView.cpp:2363
+msgid "Cursor to St&art"
+msgstr "光标移到起点(&A)"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:770
+#: ../src/gui/editors/notation/NotationView.cpp:2369
+msgid "Cursor to &End"
+msgstr "光标移到末尾(&E)"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:776
+#: ../src/gui/editors/notation/NotationView.cpp:2391
+msgid "Cursor to &Playback Pointer"
+msgstr "光标移到回放点(&P)"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:820
+#: ../src/gui/editors/notation/NotationView.cpp:2435
+msgid "Playback Pointer to &Cursor"
+msgstr "从回放点到光标(&C)"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:826
+#: ../src/gui/editors/notation/NotationView.cpp:2441
+msgid "&Solo"
+msgstr "独奏(&S)"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:841
+#: ../src/gui/editors/notation/NotationView.cpp:2456
+msgid "Set Loop to Selection"
+msgstr "设置循环选择区"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:845
+#: ../src/gui/editors/notation/NotationView.cpp:2460
+msgid "Clear L&oop"
+msgstr "清除循环(&O)"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1157
+#: ../src/gui/editors/matrix/MatrixView.cpp:849
+#: ../src/gui/editors/notation/NotationView.cpp:2464
+#: ../src/gui/editors/tempo/TempoView.cpp:610
+msgid "Clear Selection"
+msgstr "清除选择"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1149
+#: ../src/gui/editors/matrix/MatrixView.cpp:854
+#: ../src/gui/editors/notation/NotationView.cpp:2471
+msgid "&Filter Selection"
+msgstr "过滤器选择(&F)"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:879
+msgid "&No Snap"
+msgstr "无快速切换(&N)"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:884
+msgid "Snap to Bea&t"
+msgstr "快速切换到节拍(&T)"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:888
+msgid "Snap to &Bar"
+msgstr "快速切换到进程条(&B)"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:908
+#, fuzzy, c-format
+msgid "Snap to %1"
+msgstr "快速切换到 1/2"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:917
+#, fuzzy
+msgid "Show Instrument Parameters"
+msgstr "显示设备参数(&I)"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:922
+#: ../src/gui/editors/notation/NotationView.cpp:1850
+msgid "Show Ch&ord Name Ruler"
+msgstr "显示和弦名称标尺(&O)"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:926
+#: ../src/gui/editors/notation/NotationView.cpp:1858
+msgid "Show &Tempo Ruler"
+msgstr "显示节拍标尺(&T)"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1238
+#: ../src/gui/editors/notation/NotationView.cpp:3245
+#, c-format
+msgid ""
+"_n: 1 event selected \n"
+" %n events selected "
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1241
+#: ../src/gui/editors/notation/NotationView.cpp:3247
+msgid " No selection "
+msgstr " 没有选中 "
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1348
+#: ../src/gui/editors/matrix/MatrixView.cpp:1360
+#: ../src/gui/editors/matrix/MatrixView.cpp:2079
+#: ../src/gui/editors/notation/NotationView.cpp:5869
+msgid "Quantizing..."
+msgstr "正在量化..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1370
+#: ../src/gui/editors/notation/NotationView.cpp:5407
+msgid "Collapsing notes..."
+msgstr "正在压缩音符..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1381
+#, fuzzy
+msgid "Making legato..."
+msgstr "正在制作美化音符..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1476
+#, fuzzy
+msgid "Note: %1 (%2.%3s)"
+msgstr "时间:%1"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1531
+#: ../src/gui/editors/notation/NotationView.cpp:7206
+#, fuzzy
+msgid "Time: %1 (%2.%3s)"
+msgstr "时间:%1"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1604
+#: ../src/gui/editors/notation/NotationView.cpp:4744
+#: ../src/gui/editors/notation/NotationView.cpp:4773
+msgid "Cutting selection to clipboard..."
+msgstr "正在把选中区剪切到剪贴板..."
+
+#: ../src/gui/editors/eventlist/EventView.cpp:912
+#: ../src/gui/editors/matrix/MatrixView.cpp:1636
+#: ../src/gui/editors/notation/NotationSelectionPaster.cpp:82
+msgid "Couldn't paste at this point"
+msgstr "无法粘贴到这点"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1647
+#: ../src/gui/editors/notation/NotationView.cpp:4754
+msgid "Deleting selection..."
+msgstr "正在删除选择区..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1833
+#: ../src/gui/editors/notation/NotationView.cpp:5617
+#, c-format
+msgid "Unknown note insert action %1"
+msgstr "未知的音符插入行为 %1"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:1837
+#: ../src/gui/editors/matrix/MatrixView.cpp:2857
+#: ../src/gui/editors/notation/NotationView.cpp:5621
+msgid "Inserting note"
+msgstr "正在插入音符"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2091
+msgid "Unquantizing..."
+msgstr "正在解除量化..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2120
+msgid " Grid: "
+msgstr " 栅格:"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2134
+msgid "Unit"
+msgstr "小节"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2136
+msgid "Beat"
+msgstr "节拍"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2138
+msgid "Bar"
+msgstr "进程条"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2159
+#, fuzzy
+msgid " Velocity: "
+msgstr "力度:"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2170
+msgid " Quantize: "
+msgstr " 量化:"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2584
+msgid "Raising velocities..."
+msgstr "正在提升力度..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2596
+msgid "Lowering velocities..."
+msgstr "正在降低力度..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2611
+msgid "Set Event Velocities"
+msgstr "设定事件力度"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2616
+msgid "Setting Velocities..."
+msgstr "正在设定力度..."
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2665
+#, fuzzy
+msgid "Remove Triggers"
+msgstr "删除所有标记(&R)"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2723
+msgid "%1 - Segment Track #%2 - %3"
+msgstr ""
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2730
+#, fuzzy
+msgid "%1 - All Segments - %2"
+msgstr "音长"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2737
+#, fuzzy
+msgid ""
+"_n: %1 - 1 Segment - %2\n"
+"%1 - %n Segments - %2"
+msgstr "音长"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2885
+#, fuzzy
+msgid "Can't insert note: No grid duration selected"
+msgstr "没有音符音长被选中"
+
+#: ../src/gui/editors/matrix/MatrixView.cpp:2935
+#, fuzzy
+msgid " Chord "
+msgstr " 和弦"
+
+#: ../src/gui/editors/matrix/MatrixEraser.cpp:105
+#, fuzzy
+msgid "Click on a note to delete it"
+msgstr "切换到选择工具"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:89
+msgid "Filter"
+msgstr "过滤器"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:245
+#: ../src/gui/editors/tempo/TempoView.cpp:117
+msgid "Time "
+msgstr "时间 "
+
+#: ../src/gui/editors/tempo/TempoView.cpp:118
+#, fuzzy
+msgid "Type "
+msgstr "类型"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:119
+#, fuzzy
+msgid "Value "
+msgstr "值"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:120
+#, fuzzy
+msgid "Properties "
+msgstr "恒定属性"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:208
+msgid "Common, hidden"
+msgstr ""
+
+#: ../src/gui/editors/tempo/TempoView.cpp:210
+msgid "Hidden"
+msgstr ""
+
+#: ../src/gui/editors/tempo/TempoView.cpp:213
+#, fuzzy
+msgid "Common"
+msgstr ""
+"#-#-#-#-# ark.po #-#-#-#-#\n"
+"公共\n"
+"#-#-#-#-# kiten.po (kiten) #-#-#-#-#\n"
+"常见\n"
+"#-#-#-#-# kofficefilters.po (xsltimportfilter) #-#-#-#-#\n"
+"普通\n"
+"#-#-#-#-# quanta.po (quanta) #-#-#-#-#\n"
+"公共"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:220
+#, fuzzy
+msgid "Time Signature "
+msgstr "时间标记"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:245
+#, fuzzy
+msgid "%1.%2%3"
+msgstr "&%1%2"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:255
+msgid "%1.%2%3 qpm (%4.%5%6 bpm) "
+msgstr ""
+
+#: ../src/gui/editors/tempo/TempoView.cpp:264
+#, fuzzy
+msgid "Tempo "
+msgstr "节拍"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:271
+#, fuzzy
+msgid "<nothing at this filter level>"
+msgstr "<在此过滤级别没有事件>"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:463
+#, fuzzy
+msgid "Delete Tempo or Time Signature"
+msgstr "时间标记"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:602
+#, fuzzy
+msgid "&Edit Item"
+msgstr "编辑事件"
+
+#: ../src/gui/editors/tempo/TempoView.cpp:834
+msgid "%1 - Tempo and Time Signature Editor"
+msgstr ""
+
+#: ../src/gui/editors/guitar/GuitarChordEditorDialog.cpp:43
+msgid "Guitar Chord Editor"
+msgstr ""
+
+#: ../src/gui/editors/guitar/GuitarChordEditorDialog.cpp:51
+#, fuzzy
+msgid "Start fret"
+msgstr "起始进程条"
+
+#: ../src/gui/editors/guitar/GuitarChordEditorDialog.cpp:58
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:51
+msgid "Root"
+msgstr ""
+
+#: ../src/gui/editors/guitar/GuitarChordEditorDialog.cpp:62
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:55
+#, fuzzy
+msgid "Extension"
+msgstr "打击乐器"
+
+#: ../src/gui/editors/guitar/Fingering.cpp:118
+msgid "couldn't parse fingering '%1' in '%2'"
+msgstr ""
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:45
+#, fuzzy
+msgid "Guitar Chord Selector"
+msgstr "音色选择器"
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:64
+msgid "beginner"
+msgstr ""
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:65
+#, fuzzy
+msgid "common"
+msgstr ""
+"#-#-#-#-# ark.po #-#-#-#-#\n"
+"公共\n"
+"#-#-#-#-# kiten.po (kiten) #-#-#-#-#\n"
+"常见\n"
+"#-#-#-#-# kofficefilters.po (xsltimportfilter) #-#-#-#-#\n"
+"普通\n"
+"#-#-#-#-# quanta.po (quanta) #-#-#-#-#\n"
+"公共"
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:66
+msgid "all"
+msgstr ""
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:86
+#, fuzzy
+msgid "Fingerings"
+msgstr "正在添加连音线..."
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:419
+#, fuzzy
+msgid "couldn't open file '%1'"
+msgstr "无法打开文件“%1”"
+
+#: ../src/gui/editors/guitar/GuitarChordSelectorDialog.cpp:428
+#, c-format
+msgid "couldn't parse chord dictionnary : %1"
+msgstr ""
+
+#: ../src/gui/editors/notation/NoteFontViewer.cpp:87
+#, fuzzy, c-format
+msgid "Note Font Viewer: %1"
+msgstr "音符字体(&F)"
+
+#: ../src/gui/editors/notation/NoteFontViewer.cpp:93
+#, fuzzy
+msgid " Component: "
+msgstr "组件"
+
+#: ../src/gui/editors/notation/NoteFontViewer.cpp:101
+#, fuzzy
+msgid " View: "
+msgstr " 大小: "
+
+#: ../src/gui/editors/notation/NoteFontViewer.cpp:104
+msgid "Glyphs"
+msgstr ""
+
+#: ../src/gui/editors/notation/NoteFontViewer.cpp:105
+#, fuzzy
+msgid "Codes"
+msgstr "谱号(音部记号)"
+
+#: ../src/gui/editors/notation/NoteFontViewer.cpp:107
+#, fuzzy
+msgid " Page: "
+msgstr "页 %1"
+
+#: ../src/gui/editors/notation/ClefInserter.cpp:64
+#: ../src/gui/editors/notation/GuitarChordInserter.cpp:71
+#: ../src/gui/editors/notation/RestInserter.cpp:79
+#: ../src/gui/editors/notation/TextInserter.cpp:68
+msgid "Switch to Inserting Notes"
+msgstr "切换到插入音符"
+
+#: ../src/gui/editors/notation/NotationView.cpp:522
+msgid "Close track headers"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:917
+#, fuzzy
+msgid "Preparing to print..."
+msgstr "正在清除音频数据..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:1516
+msgid "Note &Font"
+msgstr "音符字体(&F)"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1539
+msgid "Si&ze"
+msgstr "大小(&Z)"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1545
+#, fuzzy
+msgid "Show Track Headers"
+msgstr "显示轨道标签(&L)"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1550
+#, fuzzy
+msgid "S&pacing"
+msgstr "间距"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1572
+#, fuzzy
+msgid "Du&ration Factor"
+msgstr "音长 "
+
+#: ../src/gui/editors/notation/NotationView.cpp:1598
+msgid "Note &Style"
+msgstr "音符样式(&S)"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1624
+msgid "Insert Rest"
+msgstr "插入休止符"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1628
+msgid "Switch from Note to Rest"
+msgstr "从音符切换到休止符"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1633
+msgid "Switch from Rest to Note"
+msgstr "从休止符切换到音符"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1690
+msgid "No accidental"
+msgstr "不使用临时记号"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1691
+#, fuzzy
+msgid "Follow previous accidental"
+msgstr "临时记号(&A)"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1692
+msgid "Sharp"
+msgstr "锐化"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1693
+msgid "Flat"
+msgstr "平坦化"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1694
+msgid "Natural"
+msgstr "自然化"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1695
+msgid "Double sharp"
+msgstr "双重锐化"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1696
+msgid "Double flat"
+msgstr "双重扁平化"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1717
+msgid "&Treble Clef"
+msgstr "高音谱号(&T)"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1724
+msgid "&Alto Clef"
+msgstr "次高音谱号(&A)"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1731
+msgid "Te&nor Clef"
+msgstr "次中音谱号(&N)"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1738
+msgid "&Bass Clef"
+msgstr "低音谱号(&B)"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1745
+msgid "&Text"
+msgstr "文本(&T)"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1751
+#, fuzzy
+msgid "&Guitar Chord"
+msgstr "音色选择器"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1784
+msgid "Select from Sta&rt"
+msgstr "从开头到当前位置选中(&R)"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1788
+msgid "Select to &End"
+msgstr "从当前位置到结尾选中(&E)"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1792
+msgid "Select Whole St&aff"
+msgstr "选中整个五线谱(&A)"
+
+#: ../src/commands/edit/CutAndCloseCommand.h:53
+#: ../src/gui/editors/notation/NotationView.cpp:1796
+msgid "C&ut and Close"
+msgstr "剪切并关闭(&U)"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1800
+msgid "Pa&ste..."
+msgstr "粘贴(&S)..."
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:122
+#: ../src/gui/editors/notation/NotationView.cpp:1808
+msgid "Move to Staff Above"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:126
+#: ../src/gui/editors/notation/NotationView.cpp:1812
+msgid "Move to Staff Below"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1826
+msgid "&Linear Layout"
+msgstr "谱线布局(&L)"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1835
+#, fuzzy
+msgid "&Continuous Page Layout"
+msgstr "页面布局(&P)"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1844
+#, fuzzy
+msgid "&Multiple Page Layout"
+msgstr "页面布局(&P)"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1854
+msgid "Show Ra&w Note Ruler"
+msgstr "显示未加工音符标尺(&W)"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1862
+msgid "Show &Annotations"
+msgstr "显示标注(&A)"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1866
+msgid "Show Lily&Pond Directives"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:1870
+msgid "Open L&yric Editor"
+msgstr "用 ge_dit 打开"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1912
+#, fuzzy
+msgid "Trip&let Insert Mode"
+msgstr "三连音符插入模式(&P)"
+
+#: ../src/gui/editors/notation/NotationView.cpp:1926
+#, fuzzy
+msgid "Grace Insert Mode"
+msgstr "三连音符插入模式(&P)"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2180
+msgid "&Dump selected events to stderr"
+msgstr "转储选中的事件到标准错误<stderr>(&D)"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2248
+#, fuzzy
+msgid "Ma&ke Ornament..."
+msgstr "正在制作美化音符..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:2252
+msgid "Trigger &Ornament..."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2256
+#, fuzzy
+msgid "Remove Ornament..."
+msgstr "正在删除配合旋律(对位音)..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:2261
+msgid "&None"
+msgstr "无(&N)"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2289
+#, fuzzy
+msgid "Convert Notation For..."
+msgstr "正在导出音频文件..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:2298
+msgid "Show &Notes Toolbar"
+msgstr "显示音符工具栏(&N)"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2299
+msgid "Show &Rests Toolbar"
+msgstr "显示休止符工具栏(&R)"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2300
+msgid "Show &Accidentals Toolbar"
+msgstr "显示临时记号工具栏(&A)"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2301
+msgid "Show Cle&fs Toolbar"
+msgstr "显示谱号工具栏(&F)"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2303
+msgid "Show &Marks Toolbar"
+msgstr "显示标记工具栏(&M)"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2305
+msgid "Show &Group Toolbar"
+msgstr "显示分组工具栏(&G)"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2307
+msgid "Show &Layout Toolbar"
+msgstr "显示布局工具栏(&L)"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2311
+#, fuzzy
+msgid "Show M&eta Toolbar"
+msgstr "显示休止符工具栏(&R)"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2373
+msgid "Cursor &Up Staff"
+msgstr "光标上移五线谱(&U)"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2377
+msgid "Cursor &Down Staff"
+msgstr "光标下移五线谱(&D)"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2381
+msgid "Cursor Pre&vious Segment"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2385
+#, fuzzy
+msgid "Cursor Ne&xt Segment"
+msgstr "创建小节"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2475
+msgid "Push &Left"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2479
+msgid "Push &Right"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2483
+msgid "Push &Up"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2487
+#, fuzzy
+msgid "Push &Down"
+msgstr "符干向下(&D)"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2491
+#, fuzzy
+msgid "&Restore Positions"
+msgstr "恢复计算好的符干(&R)"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2495
+#, fuzzy
+msgid "Make &Invisible"
+msgstr "使音符生效(&V)"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2499
+#, fuzzy
+msgid "Make &Visible"
+msgstr "使音符生效(&V)"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2503
+#, fuzzy
+msgid "Toggle Dot"
+msgstr "全音符"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2507
+#: ../src/gui/editors/notation/NotationView.cpp:2511
+#, fuzzy
+msgid "Add Dot"
+msgstr "添加 %1"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2570
+#, c-format
+msgid ""
+"_n: 1 pixel\n"
+"%n pixels"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:2619
+msgid " Font: "
+msgstr " 字体: "
+
+#: ../src/gui/editors/notation/NotationView.cpp:2647
+msgid "Unknown font \"%1\", using default"
+msgstr "未知的字体“%1”,使用默认值"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2655
+msgid " Size: "
+msgstr " 大小: "
+
+#: ../src/gui/editors/notation/NotationView.cpp:2677
+msgid " Spacing: "
+msgstr " 间隔: "
+
+#: ../src/gui/editors/notation/NotationView.cpp:2993
+#: ../src/gui/editors/notation/NotationView.cpp:3818
+msgid " Ready."
+msgstr " 已就绪。"
+
+#: ../src/gui/editors/notation/NotationView.cpp:2998
+msgid "Laying out score..."
+msgstr "正在布置乐谱..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:3011
+msgid "Laying out staff %1..."
+msgstr "正在布置五线谱 %1..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:3020
+msgid "Reconciling staffs..."
+msgstr "正在调和五线谱..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:3885
+msgid "Sizing and allocating canvas..."
+msgstr "正在估计规模和分配画布..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:4050
+msgid "note"
+msgstr "音符"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4050
+msgid "rest"
+msgstr "休止符"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4211
+msgid "%1 - Segment Track #%2 - Notation"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:4217
+#, fuzzy
+msgid "%1 - All Segments - Notation"
+msgstr "音长"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4222
+#, fuzzy
+msgid ""
+"_n: %1 - Segment - Notation\n"
+"%1 - %n Segments - Notation"
+msgstr "音长"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4243
+#, fuzzy
+msgid "Grace"
+msgstr "取消装饰音(&R)"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4247
+#: ../src/gui/editors/notation/NotationView.cpp:4251
+#: ../src/gui/editors/notation/NotationView.cpp:4255
+#, fuzzy
+msgid "%1 %2"
+msgstr "%1 (以上)"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4271
+msgid "Hidden annotations"
+msgstr "隐藏标注"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4293
+msgid "Hidden LilyPond directives"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:4326
+#, c-format
+msgid "Unknown spacing action %1"
+msgstr "未知的间隔行为 %1"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4384
+#, fuzzy, c-format
+msgid "Unknown proportion action %1"
+msgstr "未知的字体行为 %1"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4431
+#, c-format
+msgid "Unknown font action %1"
+msgstr "未知的字体行为 %1"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4449
+#, c-format
+msgid "Unknown font size %1"
+msgstr "未知的字体大小 %1"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4453
+#, c-format
+msgid "Unknown font size action %1"
+msgstr "未知的字体大小行为 %1"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4780
+msgid ""
+"The Restricted paste type requires enough empty space (containing only "
+"rests) at the paste position to hold all of the events to be pasted.\n"
+"Not enough space was found.\n"
+"If you want to paste anyway, consider using one of the other paste types "
+"from the \"Paste...\" option on the Edit menu. You can also change the "
+"default paste type to something other than Restricted if you wish."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:4800
+msgid "Can't paste multiple Segments into one"
+msgstr "无法将多个小节粘贴入一个文件"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4828
+#: ../src/gui/editors/notation/NotationView.cpp:4877
+msgid "Couldn't paste at this point."
+msgstr "无法粘贴到这点。"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4896
+#, fuzzy
+msgid "Move Events to Staff Above"
+msgstr "移动事件到其他片段(&M)"
+
+#: ../src/gui/editors/notation/NotationView.cpp:4924
+#, fuzzy
+msgid "Move Events to Staff Below"
+msgstr "移动事件到其他片段(&M)"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5036
+#, fuzzy
+msgid "Pushing selection left..."
+msgstr "正在剪切选中区..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5047
+#, fuzzy
+msgid "Pushing selection right..."
+msgstr "正在剪切选中区..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5058
+#, fuzzy
+msgid "Pushing selection up..."
+msgstr "正在剪切选中区..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5069
+#, fuzzy
+msgid "Pushing selection down..."
+msgstr "正在剪切选中区..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5080
+#, fuzzy
+msgid "Restoring computed positions..."
+msgstr "正在恢复计算过的符干方向...."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5089
+#, fuzzy
+msgid "Making visible..."
+msgstr "正在使音符生效..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5098
+#, fuzzy
+msgid "Making invisible..."
+msgstr "正在使音符生效..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5185
+msgid "Beaming group..."
+msgstr "正在分开全部符尾..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5195
+msgid "Auto-beaming selection..."
+msgstr "正在对选中部分自动分开符尾..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5205
+msgid "Breaking groups..."
+msgstr "正在打散分组..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5293
+msgid "Untupleting..."
+msgstr "正在取消连音..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5301
+msgid "Adding slur..."
+msgstr "正在添加连音线..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5302
+msgid "slur"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5307
+#, fuzzy
+msgid "Adding phrasing slur..."
+msgstr "正在添加连音线..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5308
+msgid "phrasing slur"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5313
+#, fuzzy
+msgid "Adding glissando..."
+msgstr "正在添加渐强..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5314
+msgid "glissando"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5319
+msgid "Adding crescendo..."
+msgstr "正在添加渐强..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5320
+#: ../src/gui/editors/notation/NotationView.cpp:5326
+msgid "dynamic"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5325
+msgid "Adding decrescendo..."
+msgstr "正在添加渐弱..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5331
+#: ../src/gui/editors/notation/NotationView.cpp:5337
+#: ../src/gui/editors/notation/NotationView.cpp:5343
+#: ../src/gui/editors/notation/NotationView.cpp:5349
+#, fuzzy
+msgid "Adding octave..."
+msgstr "正在添加渐强..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5332
+#: ../src/gui/editors/notation/NotationView.cpp:5338
+#: ../src/gui/editors/notation/NotationView.cpp:5344
+#: ../src/gui/editors/notation/NotationView.cpp:5350
+msgid "ottava"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5366
+msgid "Can't add overlapping %1 indications"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:5375
+#, fuzzy
+msgid "Making chord..."
+msgstr "正在制作美化音符..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5387
+msgid "Normalizing rests..."
+msgstr "正在规格化休止符..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5397
+msgid "Collapsing rests..."
+msgstr "正在压缩休止符..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5417
+msgid "Tying notes..."
+msgstr "正在捆绑音符..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5427
+msgid "Untying notes..."
+msgstr "正在松解音符..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5437
+msgid "Making notes viable..."
+msgstr "正在使音符生效..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5447
+msgid "Removing counterpoint..."
+msgstr "正在删除配合旋律(对位音)..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5457
+msgid "Pointing stems up..."
+msgstr "正在使符干向上指..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5467
+msgid "Pointing stems down..."
+msgstr "正在使符干向下指..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5478
+msgid "Restoring computed stem directions..."
+msgstr "正在恢复计算过的符干方向...."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5488
+#: ../src/gui/editors/notation/NotationView.cpp:5498
+#, fuzzy
+msgid "Positioning slurs..."
+msgstr "正在布置五线谱 %1..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5509
+#, fuzzy
+msgid "Restoring slur positions..."
+msgstr "正在恢复计算过的符干方向...."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5519
+#: ../src/gui/editors/notation/NotationView.cpp:5529
+#, fuzzy
+msgid "Positioning ties..."
+msgstr "正在布置五线谱 %1..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5540
+#, fuzzy
+msgid "Restoring tie positions..."
+msgstr "正在恢复计算过的符干方向...."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5550
+#, fuzzy
+msgid "Fixing notation quantization..."
+msgstr "启发记号量化"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5560
+#, fuzzy
+msgid "Removing notation quantization..."
+msgstr "启发记号量化"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5577
+msgid "Changing to %1 style..."
+msgstr "正在变更为 %1 样式..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5585
+#, c-format
+msgid "Unknown style action %1"
+msgstr "未知的样式行为 %1"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5598
+#: ../src/gui/editors/notation/NotationView.cpp:5639
+#: ../src/gui/editors/notation/NotationView.cpp:5695
+msgid "No note duration selected"
+msgstr "没有音符音长被选中"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5660
+msgid "No rest duration selected"
+msgstr "没有已选中的休止符时长"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5746
+#, fuzzy
+msgid "No note or rest duration selected"
+msgstr "没有已选中的休止符时长"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5757
+#: ../src/gui/editors/notation/NotationView.cpp:5768
+#: ../src/gui/editors/notation/NotationView.cpp:5779
+#: ../src/gui/editors/notation/NotationView.cpp:5790
+#: ../src/gui/editors/notation/NotationView.cpp:5801
+#: ../src/gui/editors/notation/NotationView.cpp:5812
+#: ../src/gui/editors/notation/NotationView.cpp:5823
+#, fuzzy
+msgid "Forcing accidentals..."
+msgstr "不使用临时记号"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5834
+#, fuzzy
+msgid "Restoring accidentals..."
+msgstr "不使用临时记号"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5845
+#, fuzzy
+msgid "Showing cautionary accidentals..."
+msgstr "不使用临时记号"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5855
+#, fuzzy
+msgid "Cancelling cautionary accidentals..."
+msgstr "不使用临时记号"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5884
+msgid "Interpreting selection..."
+msgstr "正在解析选择区..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5896
+#, fuzzy
+msgid "Setting note durations..."
+msgstr "音长"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5904
+#: ../src/gui/editors/notation/NotationView.cpp:5912
+#, fuzzy
+msgid "Adding dot..."
+msgstr "正在添加渐强..."
+
+#: ../src/gui/editors/notation/NotationView.cpp:5934
+msgid "Text: "
+msgstr "文本:"
+
+#: ../src/gui/editors/notation/NotationView.cpp:5948
+msgid "Fingering: "
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:6036
+msgid "Ornament track %1 bar %2"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:6038
+#, fuzzy, c-format
+msgid "Ornament bar %1"
+msgstr "小节(&M)"
+
+#: ../src/gui/editors/notation/NotationView.cpp:6098
+#, fuzzy
+msgid "Remove Ornaments"
+msgstr "删除所有标记(&R)"
+
+#: ../src/gui/editors/notation/NotationView.cpp:6145
+msgid "Estimated key signature shown"
+msgstr "估计的基调标记显示为"
+
+#: ../src/gui/editors/notation/NotationStaff.cpp:1249
+#: ../src/gui/editors/notation/NotationView.cpp:6202
+msgid "Sustain"
+msgstr "持续"
+
+#: ../src/gui/editors/notation/NotationView.cpp:6218
+msgid ""
+"There is no sustain controller defined for this device.\n"
+"Please ensure the device is configured correctly in the Manage MIDI Devices "
+"dialog in the main window."
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationView.cpp:7250
+#, fuzzy
+msgid "Can't insert note: No note duration selected"
+msgstr "没有音符音长被选中"
+
+#: ../src/gui/editors/notation/NotationEraser.cpp:61
+#: ../src/gui/editors/notation/NotationSelector.cpp:83
+msgid "Switch to Insert Tool"
+msgstr "切换到插入工具"
+
+#: ../src/gui/editors/notation/NotePixmapFactory.cpp:2303
+#: ../src/gui/editors/notation/NotePixmapFactory.cpp:2347
+msgid "..."
+msgstr "..."
+
+#: ../src/gui/editors/notation/NoteFontFactory.cpp:200
+msgid "Can't obtain a default font -- no fonts found"
+msgstr ""
+
+#: ../src/gui/editors/notation/NoteFontMap.cpp:52
+#: ../src/gui/general/PresetGroup.cpp:49
+#, fuzzy
+msgid "unknown error"
+msgstr "未知"
+
+#: ../src/gui/editors/notation/NoteFontMap.cpp:78
+#, fuzzy
+msgid "Can't open font mapping file %1 or %2"
+msgstr "无法打开映射文件"
+
+#: ../src/gui/editors/notation/NoteFontMap.cpp:82
+#, fuzzy, c-format
+msgid "Can't open font mapping file %1"
+msgstr "无法打开映射文件"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:52
+msgid "%1-dotted-%2"
+msgstr "%1-符点-%2"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:54
+msgid "%1-dotted %2"
+msgstr "%1-符点 %2"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:57
+#, c-format
+msgid "dotted-%1"
+msgstr "符点-%1"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:59
+#, c-format
+msgid "dotted %1"
+msgstr "符点 %1"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:83
+msgid "sixty-fourth note"
+msgstr "64 分音符"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:83
+msgid "thirty-second note"
+msgstr "32 分音符"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:84
+msgid "sixteenth note"
+msgstr "16 分音符"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:84
+msgid "eighth note"
+msgstr "8 分音符"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:85
+msgid "quarter note"
+msgstr "4 分音符"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:85
+msgid "half note"
+msgstr "2 分音符"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:86
+msgid "whole note"
+msgstr "全音符"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:86
+msgid "double whole note"
+msgstr "双倍全音符"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:89
+msgid "sixty-fourth notes"
+msgstr "64 分音符"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:89
+msgid "thirty-second notes"
+msgstr "32 分音符"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:90
+msgid "sixteenth notes"
+msgstr "16 分音符"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:90
+msgid "eighth notes"
+msgstr "8 分音符"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:91
+msgid "quarter notes"
+msgstr "4 分音符"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:91
+msgid "half notes"
+msgstr "2 分音符"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:92
+msgid "whole notes"
+msgstr "全音符"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:92
+msgid "double whole notes"
+msgstr "双倍全音符"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:96
+#: ../src/gui/editors/notation/NotationStrings.cpp:154
+msgid "%1 triplets"
+msgstr "%1 三连音符"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:100
+#: ../src/gui/editors/notation/NotationStrings.cpp:158
+msgid "%1 triplet"
+msgstr "%1 三连音符"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:143
+msgid "64th"
+msgstr "64分"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:143
+msgid "32nd"
+msgstr "32分"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:143
+msgid "16th"
+msgstr "16分"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:143
+msgid "8th"
+msgstr "8分"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:144
+msgid "quarter"
+msgstr "4分"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:144
+msgid "half"
+msgstr "2分"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:144
+msgid "whole"
+msgstr "全"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:145
+msgid "double whole"
+msgstr "双倍全"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:148
+msgid "64ths"
+msgstr "64分"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:148
+msgid "32nds"
+msgstr "32分"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:148
+msgid "16ths"
+msgstr "16分"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:148
+msgid "8ths"
+msgstr "8分"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:149
+msgid "quarters"
+msgstr "4分"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:149
+msgid "halves"
+msgstr "2分"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:149
+msgid "wholes"
+msgstr "全"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:150
+msgid "double wholes"
+msgstr "双倍全"
+
+#: ../src/gui/editors/notation/NotationStrings.cpp:278
+msgid "%1 ticks"
+msgstr "%1 记号"
+
+#: ../src/gui/editors/notation/FontViewFrame.cpp:100
+#, c-format
+msgid "Error: Unable to match font name %1"
+msgstr ""
+
+#: ../src/gui/editors/notation/FontViewFrame.cpp:108
+msgid "Warning: No good match for font name %1 (best is %2)"
+msgstr ""
+
+#: ../src/gui/editors/notation/FontViewFrame.cpp:116
+#, c-format
+msgid "Error: Unable to open best-match font %1"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:113
+#, fuzzy
+msgid "Track %1 : \"%2\""
+msgstr "指令列 %1 - %2"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:119
+#, fuzzy, c-format
+msgid ""
+"\n"
+"Notate for: %1"
+msgstr "音符字体(&F)"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:121
+#, fuzzy
+msgid "normal"
+msgstr "正常"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:124
+#, fuzzy
+msgid "small"
+msgstr "可缩放"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:127
+msgid "tiny"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:131
+msgid "--"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:156
+msgid ""
+"\n"
+"Size: %1, Bracket: %2 "
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:183
+msgid ""
+"\n"
+"bars [%1-%2] in %3 (tr=%4) : \"%5\""
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:190
+msgid ""
+"\n"
+"bars [%1-%2] (tr=%3) : \"%4\""
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:240
+#, fuzzy
+msgid "C#"
+msgstr "C#%1"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:242
+msgid "Eb"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:245
+#, fuzzy
+msgid "F#"
+msgstr "F#%1"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:247
+#, fuzzy
+msgid "G#"
+msgstr "G#%1"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:249
+msgid "Bb"
+msgstr ""
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:352
+#, fuzzy
+msgid "%1: %2"
+msgstr "%1 (以上)"
+
+#: ../src/gui/editors/notation/TrackHeader.cpp:355
+#, fuzzy, c-format
+msgid " in %1"
+msgstr "撤销(&O) %1"
+
+#: ../src/gui/editors/notation/NotationStaff.cpp:452
+msgid "Rendering staff %1..."
+msgstr "正在绘制五线谱 %1..."
+
+#: ../src/gui/editors/notation/NotationStaff.cpp:515
+#, fuzzy
+msgid "Rendering notes on staff %1..."
+msgstr "正在绘制五线谱 %1..."
+
+#: ../src/gui/editors/notation/NotationStaff.cpp:583
+msgid "Positioning staff %1..."
+msgstr "正在布置五线谱 %1..."
+
+#: ../src/gui/editors/notation/NotationSelectionPaster.cpp:85
+msgid "Ready."
+msgstr "已就绪。"
+
+#: ../src/gui/editors/notation/RestInserter.cpp:62
+msgid "Dotted rest"
+msgstr "符点休止符"
+
+#: ../src/gui/editors/notation/NoteStyleFileReader.cpp:57
+#, c-format
+msgid "Can't open style file %1"
+msgstr "无法打开样式文件 %1"
+
+#: ../src/gui/editors/notation/NoteStyleFileReader.cpp:92
+msgid "type is a required attribute of note"
+msgstr "类型是音符的必需属性"
+
+#: ../src/gui/editors/notation/NoteStyleFileReader.cpp:101
+#, c-format
+msgid "Unrecognised note name %1"
+msgstr "未识别出的音符名称 %1"
+
+#: ../src/gui/editors/notation/NoteStyleFileReader.cpp:108
+msgid "global element must precede note elements"
+msgstr "全局元素必须先于音符元素"
+
+#: ../src/gui/editors/notation/NoteStyleFileReader.cpp:137
+msgid ""
+"global and note elements may have shape or charname attribute, but not both"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationVLayout.cpp:493
+msgid ""
+"Spanned note at %1 has no HEIGHT_ON_STAFF property!\n"
+"This is a bug (the program would previously have crashed by now)"
+msgstr ""
+"位于 %1 的共轭音符没有 HEIGHT_ON_STAFF 属性!\n"
+"这是一个臭虫(程序可能在此之前已经崩溃了)。"
+
+#: ../src/gui/editors/notation/NoteInserter.cpp:82
+msgid "Auto-Beam when appropriate"
+msgstr "适当的时候自动分开符尾"
+
+#: ../src/gui/editors/notation/NoteInserter.cpp:103
+msgid "Dotted note"
+msgstr "符点音符"
+
+#: ../src/gui/editors/notation/NoteInserter.cpp:120
+msgid "Switch to Inserting Rests"
+msgstr "切换到插入休止符"
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:98
+#, fuzzy
+msgid "Collapse Rests"
+msgstr "压缩休止符(&C)"
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:102
+msgid "Respell as Flat"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:106
+#, fuzzy
+msgid "Respell as Sharp"
+msgstr "临时记号(&A)"
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:110
+msgid "Respell as Natural"
+msgstr ""
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:114
+#, fuzzy
+msgid "Collapse Notes"
+msgstr "压缩休止符(&C)"
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:130
+#, fuzzy
+msgid "Make Invisible"
+msgstr "使音符生效(&V)"
+
+#: ../src/gui/editors/notation/NotationSelector.cpp:134
+#, fuzzy
+msgid "Make Visible"
+msgstr "使音符生效(&V)"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:129
+msgid "Event filters"
+msgstr "事件过滤器"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:138
+msgid "Rest"
+msgstr "休止"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:139
+msgid "Indication"
+msgstr "指示"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:141
+msgid "Other"
+msgstr "其它"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:161
+#, fuzzy
+msgid "Triggered Segment Properties"
+msgstr "恒定属性"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:166
+msgid "Label: "
+msgstr "标签: "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:176
+msgid "Base pitch: "
+msgstr "基础音色: "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:183
+msgid "Base velocity: "
+msgstr "基础力度: "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:246
+msgid "Duration "
+msgstr "音长 "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:247
+msgid "Event Type "
+msgstr "事件类型 "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:248
+msgid "Pitch "
+msgstr "音色 "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:249
+msgid "Velocity "
+msgstr "力度 "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:250
+msgid "Type (Data1) "
+msgstr "类型 (数据 1)"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:251
+msgid "Value (Data2) "
+msgstr "值 (数据 2)"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:461
+msgid "(group %1) "
+msgstr "(组 %1) "
+
+#: ../src/gui/editors/eventlist/EventView.cpp:519
+msgid "<no events at this filter level>"
+msgstr "<在此过滤级别没有事件>"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:521
+msgid "<no events>"
+msgstr "<没有事件>"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:696
+msgid "Segment label"
+msgstr "小节标签"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:696
+msgid "Label:"
+msgstr "标签:"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1123
+msgid "&Insert Event"
+msgstr "插入事件(&I)"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1130
+msgid "&Delete Event"
+msgstr "删除事件(&D)"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1137
+msgid "&Edit Event"
+msgstr "编辑事件(&E)"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1144
+msgid "&Advanced Event Editor"
+msgstr "高级事件编辑器(&A)"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1518
+msgid "Open in Event Editor"
+msgstr "以事件编辑器打开"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1519
+msgid "Open in Expert Event Editor"
+msgstr "以专家事件编辑器打开"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1577
+#, fuzzy
+msgid "%1 - Triggered Segment: %2"
+msgstr "创建小节"
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1592
+msgid "%1 - Segment Track #%2 - Event List"
+msgstr ""
+
+#: ../src/gui/editors/eventlist/EventView.cpp:1598
+msgid "%1 - %2 Segments - Event List"
+msgstr ""
+
+#: ../src/gui/rulers/TempoRuler.cpp:131
+#, fuzzy
+msgid "Insert Tempo Change at Playback Position"
+msgstr "插入节拍变化"
+
+#: ../src/gui/rulers/TempoRuler.cpp:136
+#, fuzzy
+msgid "Delete Tempo Change"
+msgstr "插入节拍变化"
+
+#: ../src/gui/rulers/TempoRuler.cpp:140
+msgid "Ramp Tempo to Next Tempo"
+msgstr ""
+
+#: ../src/gui/rulers/TempoRuler.cpp:144
+msgid "Un-Ramp Tempo"
+msgstr ""
+
+#: ../src/gui/rulers/TempoRuler.cpp:149
+#, fuzzy
+msgid "Edit Tempo..."
+msgstr "修改默认节拍(&D)..."
+
+#: ../src/gui/rulers/TempoRuler.cpp:153
+#, fuzzy
+msgid "Edit Time Signature..."
+msgstr "时间标记"
+
+#: ../src/gui/rulers/TempoRuler.cpp:588
+#, fuzzy
+msgid "%1.%2%3 (%4.%5%6 bpm)"
+msgstr "%1.%2 秒,"
+
+#: ../src/gui/rulers/TempoRuler.cpp:596
+#, fuzzy
+msgid "%1.%2%3 bpm"
+msgstr "%1.%2 秒,"
+
+#: ../src/gui/rulers/TempoRuler.cpp:604
+#, fuzzy
+msgid "%1 - %2.%3%4"
+msgstr "&%1%2"
+
+#: ../src/gui/rulers/ControlRulerEventInsertCommand.cpp:36
+msgid "Insert Controller Event"
+msgstr "插入控制器事件"
+
+#: ../src/gui/rulers/ControlChangeCommand.cpp:35
+msgid "Control Change"
+msgstr "控制器变更"
+
+#: ../src/gui/rulers/PropertyViewRuler.cpp:72
+msgid "%1 controller"
+msgstr "%1 控制器"
+
+#: ../src/gui/rulers/RawNoteRuler.cpp:453
+msgid "Track #%1, Segment \"%2\" (runtime id %3)"
+msgstr ""
+
+#: ../src/gui/rulers/MarkerRuler.cpp:100
+#, fuzzy
+msgid "Insert Marker"
+msgstr "插入休止符"
+
+#: ../src/gui/rulers/MarkerRuler.cpp:104
+#, fuzzy
+msgid "Insert Marker at Playback Position"
+msgstr "插入节拍变化"
+
+#: ../src/gui/rulers/MarkerRuler.cpp:109
+#, fuzzy
+msgid "Delete Marker"
+msgstr "删除库"
+
+#: ../src/gui/rulers/MarkerRuler.cpp:114
+#, fuzzy
+msgid "Edit Marker..."
+msgstr "添加文本标记(&X)..."
+
+#: ../src/gui/rulers/MarkerRuler.cpp:119
+msgid ""
+"Click on a marker to move the playback pointer.\n"
+"Shift-click to set a range between markers.\n"
+"Double-click to open the marker editor."
+msgstr ""
+
+#: ../src/gui/rulers/ChordNameRuler.cpp:97
+msgid ""
+"Chord name ruler.\n"
+"Turn it on and off from the Settings->Rulers menu."
+msgstr ""
+"和弦名称标尺。\n"
+"从设置->标尺菜单开启或关闭。"
+
+#: ../src/gui/rulers/ControlRulerEventEraseCommand.cpp:37
+msgid "Erase Controller Event(s)"
+msgstr "抹除控制器事件"
+
+#: ../src/gui/general/EditView.cpp:901
+#: ../src/gui/rulers/ControllerEventsRuler.cpp:188
+msgid "Unsupported Event Type"
+msgstr "不支持的事件类型"
+
+#: ../src/gui/rulers/ControllerEventsRuler.cpp:203
+msgid "Controller Events"
+msgstr "控制器事件"
+
+#: ../src/gui/rulers/ControllerEventsRuler.cpp:278
+msgid "Controller Event Number"
+msgstr "控制器事件号"
+
+#: ../src/gui/rulers/ControllerEventsRuler.cpp:471
+msgid "Add line of controllers"
+msgstr "添加控制器行"
+
+#: ../src/gui/rulers/LoopRuler.cpp:89
+#, fuzzy
+msgid ""
+"Click and drag to move the playback pointer.\n"
+"Shift-click and drag to set a range for looping or editing.\n"
+"Shift-click to clear the loop or range.\n"
+"Double-click to start playback."
+msgstr ""
+"左键点击标记以放置回放指针。\n"
+"Shift + 左键点击 + 拖动 设置一个循环片段。\n"
+"Shift + 左键点击 取消循环设置(或者在播放控制器上弹起循环按钮)"
+
+#: ../src/gui/general/EditViewBase.cpp:228
+msgid "Set Segment Start Time..."
+msgstr "设置片段开始时间..."
+
+#: ../src/gui/general/EditViewBase.cpp:232
+msgid "Set Segment Duration..."
+msgstr "设置片段音长..."
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:56
+msgid "Load track parameters preset"
+msgstr ""
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:62
+#, fuzzy
+msgid "Convert notation for..."
+msgstr "正在导出音频文件..."
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:86
+msgid "Select preset track parameters for:"
+msgstr ""
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:87
+msgid "Create appropriate notation for:"
+msgstr ""
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:89
+#, fuzzy
+msgid "Category"
+msgstr "类别:"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:95
+#, fuzzy
+msgid "Player Ability"
+msgstr "播放列表"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:97
+#, fuzzy
+msgid "Amateur"
+msgstr "控制器"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:98
+#, fuzzy
+msgid "Professional"
+msgstr "正在处理..."
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:104
+#, fuzzy
+msgid "Only selected segments"
+msgstr "选择全部小节(&A)"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:106
+#, fuzzy
+msgid "All segments in this track"
+msgstr "一次应用到所有片段"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:111
+#, fuzzy
+msgid "Only for new segments"
+msgstr "这个片段的歌词"
+
+#: ../src/gui/general/PresetHandlerDialog.cpp:113
+#, fuzzy
+msgid "Convert existing segments"
+msgstr "创建小节"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:39
+#, c-format
+msgid "C%1"
+msgstr "C%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:39
+#, c-format
+msgid "C#%1"
+msgstr "C#%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:39
+#, c-format
+msgid "D%1"
+msgstr "D%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:39
+#, c-format
+msgid "D#%1"
+msgstr "D#%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:40
+#, c-format
+msgid "E%1"
+msgstr "E%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:40
+#, c-format
+msgid "F%1"
+msgstr "F%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:40
+#, c-format
+msgid "F#%1"
+msgstr "F#%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:40
+#, c-format
+msgid "G%1"
+msgstr "G%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:41
+#, c-format
+msgid "G#%1"
+msgstr "G#%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:41
+#, c-format
+msgid "A%1"
+msgstr "A%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:41
+#, c-format
+msgid "A#%1"
+msgstr "A#%1"
+
+#: ../src/gui/general/MidiPitchLabel.cpp:41
+#, c-format
+msgid "B%1"
+msgstr "B%1"
+
+#: ../src/gui/general/PresetGroup.cpp:95
+#, fuzzy, c-format
+msgid "Can't open preset file %1"
+msgstr "无法打开样式文件 %1"
+
+#: ../src/gui/general/EditView.cpp:744
+#, fuzzy
+msgid "&Halve Durations"
+msgstr "音长"
+
+#: ../src/gui/general/EditView.cpp:748
+#, fuzzy
+msgid "&Double Durations"
+msgstr "双重扁平化"
+
+#: ../src/gui/general/EditView.cpp:806
+msgid "Show Velocity Property Ruler"
+msgstr "显示力度属性标尺"
+
+#: ../src/gui/general/EditView.cpp:825
+msgid "Insert item"
+msgstr "插入项目"
+
+#: ../src/gui/general/EditView.cpp:831
+msgid "Erase selected items"
+msgstr "擦除选定的项目"
+
+#: ../src/gui/general/EditView.cpp:835
+msgid "Clear ruler"
+msgstr "清除标尺"
+
+#: ../src/gui/general/EditView.cpp:839
+msgid "Insert line of controllers"
+msgstr "插入整行控制器"
+
+#: ../src/gui/general/EditView.cpp:843
+msgid "Flip forward"
+msgstr "快进"
+
+#: ../src/gui/general/EditView.cpp:847
+msgid "Flip backwards"
+msgstr "快退"
+
+#: ../src/gui/general/EditView.cpp:851
+#, fuzzy
+msgid "Draw property line"
+msgstr "绘制定界线"
+
+#: ../src/gui/general/EditView.cpp:855
+msgid "Select all property values"
+msgstr "选择全部属性值"
+
+#: ../src/gui/general/EditView.cpp:894
+msgid "%1 Controller %2 %3"
+msgstr "%1 控制器 %2 %3"
+
+#: ../src/gui/general/EditView.cpp:1066
+msgid "I"
+msgstr "I"
+
+#: ../src/gui/general/EditView.cpp:1066
+msgid "II"
+msgstr "II"
+
+#: ../src/gui/general/EditView.cpp:1066
+msgid "III"
+msgstr "III"
+
+#: ../src/gui/general/EditView.cpp:1066
+msgid "IV"
+msgstr "IV"
+
+#: ../src/gui/general/EditView.cpp:1067
+msgid "V"
+msgstr "V"
+
+#: ../src/gui/general/EditView.cpp:1067
+msgid "VI"
+msgstr "VI"
+
+#: ../src/gui/general/EditView.cpp:1067
+msgid "VII"
+msgstr "VII"
+
+#: ../src/gui/general/EditView.cpp:1067
+msgid "VIII"
+msgstr "VIII"
+
+#: ../src/gui/general/EditView.cpp:1069
+msgid "%1 flat"
+msgstr "%1 平坦化"
+
+#: ../src/gui/general/EditView.cpp:1070
+msgid "%1 sharp"
+msgstr "%1 锐化"
+
+#: ../src/gui/general/EditView.cpp:1085
+msgid "&Insert Note"
+msgstr "插入音符(&I)"
+
+#: ../src/gui/general/EditView.cpp:1091
+msgid "&Upper Octave"
+msgstr "高八度(&U)"
+
+#: ../src/gui/general/EditView.cpp:1096
+msgid "&Lower Octave"
+msgstr "低八度(&L)"
+
+#: ../src/gui/general/EditView.cpp:1268
+msgid "Estimated time signature shown"
+msgstr "估计的时间标记显示为"
+
+#: ../src/gui/general/EditView.cpp:1431
+#, fuzzy
+msgid "Halving durations..."
+msgstr "音长"
+
+#: ../src/gui/general/EditView.cpp:1445
+#, fuzzy
+msgid "Doubling durations..."
+msgstr "音长"
+
+#: ../src/gui/general/EditView.cpp:1469
+#, fuzzy
+msgid "Rescaling..."
+msgstr "重新调整(&R)..."
+
+#: ../src/gui/general/EditView.cpp:1489
+#, fuzzy
+msgid "By number of semitones: "
+msgstr "输入要变调的半音数字:"
+
+#: ../src/gui/general/EditView.cpp:1496 ../src/gui/general/EditView.cpp:1518
+msgid "Transposing..."
+msgstr "正在变调..."
+
+#: ../src/gui/general/EditView.cpp:1536
+msgid "Transposing up one semitone..."
+msgstr "正在升高一个半音..."
+
+#: ../src/gui/general/EditView.cpp:1545
+msgid "Transposing up one octave..."
+msgstr "正在升高一个八度音阶..."
+
+#: ../src/gui/general/EditView.cpp:1554
+msgid "Transposing down one semitone..."
+msgstr "正在降低一个半音..."
+
+#: ../src/gui/general/EditView.cpp:1563
+msgid "Transposing down one octave..."
+msgstr "正在降低一个八度音阶..."
+
+#: ../src/gui/general/EditView.cpp:1575
+#, fuzzy
+msgid "Inverting..."
+msgstr "已开始..."
+
+#: ../src/gui/general/EditView.cpp:1587
+#, fuzzy
+msgid "Retrograding..."
+msgstr "正在录制..."
+
+#: ../src/gui/general/EditView.cpp:1599
+#, fuzzy
+msgid "Retrograde inverting..."
+msgstr "正在录制..."
+
+#: ../src/gui/general/EditView.cpp:1608
+msgid "Jogging left..."
+msgstr "正在左移一帧..."
+
+#: ../src/gui/general/EditView.cpp:1623
+msgid "Jogging right..."
+msgstr "正在右移一帧..."
+
+#: ../src/sound/AudioFileManager.cpp:660
+#, fuzzy, c-format
+msgid "Downloading file %1"
+msgstr "无法下载文件 %1"
+
+#: ../src/sound/AudioFileManager.cpp:735
+#, fuzzy
+msgid "Converting audio file..."
+msgstr "正在导出音频文件..."
+
+#: ../src/sound/AudioFileManager.cpp:737
+#, fuzzy
+msgid "Resampling audio file..."
+msgstr "正在导出音频文件..."
+
+#: ../src/sound/AudioFileManager.cpp:739
+#, fuzzy
+msgid "Converting and resampling audio file..."
+msgstr "正在导出音频文件..."
+
+#: ../src/sound/AudioFileManager.cpp:741
+#, fuzzy
+msgid "Importing audio file..."
+msgstr "正在导出音频文件..."
+
+#: ../src/sound/AudioFileManager.cpp:794
+#, fuzzy
+msgid "Failed to convert or resample audio file on import"
+msgstr "选择一个或更多音频文件"
+
+#: ../src/sequencer/main.cpp:46 ../src/sequencer/main.cpp:86
+#, fuzzy
+msgid "RosegardenSequencer"
+msgstr "玫瑰园"
+
+#: ../src/sequencer/main.cpp:54
+#, fuzzy
+msgid "JACK playback and capture ports"
+msgstr "JACK 回放潜伏期(ms)"
+
+#: ../src/commands/segment/SegmentSyncCommand.cpp:38
+#: ../src/commands/segment/SegmentSyncCommand.cpp:44
+#: ../src/commands/segment/SegmentSyncCommand.cpp:55
+#: ../src/commands/segment/SegmentSyncCommand.cpp:63
+#, fuzzy
+msgid "Sync segment parameters"
+msgstr "乐器参数"
+
+#: ../src/commands/segment/RenameTrackCommand.h:52
+#, fuzzy
+msgid "Rename Track"
+msgstr "删除轨道(&D)"
+
+#: ../src/commands/segment/SegmentRepeatToCopyCommand.cpp:39
+msgid "Turn Repeats into Copies"
+msgstr "转换重复部分为副本"
+
+#: ../src/commands/segment/SegmentTransposeCommand.cpp:36
+#: ../src/commands/segment/SegmentTransposeCommand.cpp:42
+#, fuzzy
+msgid "Change segment transposition"
+msgstr "创建小节"
+
+#: ../src/commands/edit/RescaleCommand.h:50
+#: ../src/commands/segment/AudioSegmentRescaleCommand.h:62
+#: ../src/commands/segment/SegmentRescaleCommand.h:58
+msgid "Stretch or S&quash..."
+msgstr ""
+
+#: ../src/commands/segment/SegmentLabelCommand.h:52
+msgid "Re&label..."
+msgstr "重新标注(&L)..."
+
+#: ../src/commands/segment/AudioSegmentResizeFromStartCommand.cpp:39
+#: ../src/commands/segment/SegmentResizeFromStartCommand.cpp:39
+#, fuzzy
+msgid "Resize Segment"
+msgstr "改变事件大小"
+
+#: ../src/commands/segment/RemoveTempoChangeCommand.h:58
+msgid "Remove &Tempo Change..."
+msgstr "删除节拍变更(&T)..."
+
+#: ../src/commands/segment/SegmentEraseCommand.cpp:40
+#: ../src/commands/segment/SegmentEraseCommand.cpp:52
+msgid "Erase Segment"
+msgstr "擦除小节"
+
+#: ../src/commands/segment/AudioSegmentRescaleCommand.cpp:126
+#: ../src/commands/segment/SegmentRescaleCommand.cpp:102
+#, fuzzy
+msgid "(rescaled)"
+msgstr "%1 (已自动调整)"
+
+#: ../src/commands/segment/AudioSegmentRescaleCommand.cpp:127
+#: ../src/commands/segment/SegmentRescaleCommand.cpp:105
+msgid "%1 (rescaled)"
+msgstr "%1 (已自动调整)"
+
+#: ../src/commands/segment/PasteToTriggerSegmentCommand.cpp:47
+msgid "Paste as New Triggered Segment"
+msgstr ""
+
+#: ../src/commands/segment/SegmentColourMapCommand.h:52
+#, fuzzy
+msgid "Change Segment Color Map..."
+msgstr "改为 %1 谱号(&F)..."
+
+#: ../src/commands/segment/SegmentQuickCopyCommand.h:55
+msgid "Quick-Copy Segment"
+msgstr "快速复制小节"
+
+#: ../src/commands/segment/AudioSegmentSplitCommand.cpp:42
+msgid "Split Audio Segment"
+msgstr "拆分音频片段"
+
+#: ../src/commands/segment/AudioSegmentSplitCommand.cpp:103
+#: ../src/commands/segment/SegmentSplitCommand.cpp:135
+#, fuzzy
+msgid " (split)"
+msgstr "%1 (已拆分)"
+
+#: ../src/commands/segment/AudioSegmentSplitCommand.cpp:104
+#: ../src/commands/segment/SegmentSplitByRecordingSrcCommand.cpp:120
+#: ../src/commands/segment/SegmentSplitByRecordingSrcCommand.cpp:122
+#: ../src/commands/segment/SegmentSplitCommand.cpp:136
+msgid "%1 (split)"
+msgstr "%1 (已拆分)"
+
+#: ../src/commands/segment/SegmentLabelCommand.cpp:40
+msgid "Label Segments"
+msgstr "标注"
+
+#: ../src/commands/segment/OpenOrCloseRangeCommand.cpp:43
+msgid "Open or Close Range"
+msgstr ""
+
+#: ../src/commands/edit/TransposeCommand.h:55
+#: ../src/commands/segment/SegmentTransposeCommand.h:54
+#, fuzzy
+msgid "Transpose by &Interval..."
+msgstr "变调(&T)..."
+
+#: ../src/commands/segment/SegmentAutoSplitCommand.cpp:148
+msgid "%1 (part)"
+msgstr "%1 (部分)"
+
+#: ../src/commands/segment/AudioSegmentInsertCommand.cpp:51
+#: ../src/commands/segment/SegmentInsertCommand.cpp:43
+#: ../src/commands/segment/SegmentInsertCommand.cpp:56
+msgid "Create Segment"
+msgstr "创建小节"
+
+#: ../src/commands/segment/AudioSegmentInsertCommand.cpp:114
+msgid "%1 (inserted)"
+msgstr "%1 (已插入)"
+
+#: ../src/commands/segment/AudioSegmentInsertCommand.cpp:117
+msgid "unknown audio file"
+msgstr "未知的音频文件"
+
+#: ../src/commands/segment/CreateTempoMapFromSegmentCommand.cpp:40
+msgid "Set Tempos from Beat Segment"
+msgstr "使节拍符合拍音片段"
+
+#: ../src/commands/segment/SegmentSplitByRecordingSrcCommand.h:52
+#, fuzzy
+msgid "Split by &Recording Source..."
+msgstr "根据音色拆分(&P)..."
+
+#: ../src/commands/segment/SegmentColourMapCommand.cpp:40
+msgid "Change Segment Color Map"
+msgstr ""
+
+#: ../src/commands/edit/CopyCommand.cpp:64
+#: ../src/commands/segment/SegmentQuickCopyCommand.cpp:57
+msgid "%1 (copied)"
+msgstr "%1 (已复制)"
+
+#: ../src/commands/segment/SegmentColourCommand.h:52
+#, fuzzy
+msgid "Change Segment Color..."
+msgstr "改为 %1 谱号(&F)..."
+
+#: ../src/commands/segment/SegmentSplitByPitchCommand.cpp:170
+msgid "%1 (upper)"
+msgstr "%1 (以上)"
+
+#: ../src/commands/segment/SegmentSplitByPitchCommand.cpp:172
+msgid "%1 (lower)"
+msgstr "%1 (以下)"
+
+#: ../src/commands/segment/SegmentSingleRepeatToCopyCommand.cpp:39
+#, fuzzy
+msgid "Turn Single Repeat into Copy"
+msgstr "转换重复部分为副本"
+
+#: ../src/commands/segment/AddTempoChangeCommand.h:58
+msgid "Add Te&mpo Change..."
+msgstr "添加节拍变更(&M)..."
+
+#: ../src/commands/segment/AudioSegmentAutoSplitCommand.h:57
+#: ../src/commands/segment/SegmentAutoSplitCommand.h:53
+msgid "&Split on Silence"
+msgstr "安静拆分(&S)"
+
+#: ../src/commands/segment/SetTriggerSegmentBaseVelocityCommand.cpp:39
+#, fuzzy
+msgid "Set Base Velocity"
+msgstr "提高力度(&I)"
+
+#: ../src/commands/segment/DeleteRangeCommand.cpp:43
+#: ../src/commands/segment/EraseSegmentsStartingInRangeCommand.cpp:39
+#, fuzzy
+msgid "Delete Range"
+msgstr "删除(&L)"
+
+#: ../src/commands/segment/ChangeCompositionLengthCommand.h:53
+#, fuzzy
+msgid "Change &Composition Start and End..."
+msgstr "改变作品持续时间(&C)..."
+
+#: ../src/commands/segment/MoveTracksCommand.h:51
+msgid "Move Tracks..."
+msgstr "移动轨道..."
+
+#: ../src/commands/segment/SegmentColourCommand.cpp:39
+#, fuzzy
+msgid "Change Segment Color"
+msgstr "创建小节"
+
+#: ../src/commands/segment/AudioSegmentDistributeCommand.h:66
+msgid "Distribute Audio Segments over MIDI"
+msgstr "在 MIDI 上排布音频片段"
+
+#: ../src/commands/segment/AudioSegmentAutoSplitCommand.cpp:147
+msgid "%1 (autosplit %2)"
+msgstr "%1 (自动拆分 %2)"
+
+#: ../src/commands/segment/SetTriggerSegmentDefaultRetuneCommand.cpp:39
+#, fuzzy
+msgid "Set Default Retune"
+msgstr "默认布局模式"
+
+#: ../src/commands/segment/AddTimeSignatureCommand.h:52
+msgid "Add Time Si&gnature Change..."
+msgstr "添加时间署名变更(&G)..."
+
+#: ../src/commands/segment/AddTriggerSegmentCommand.cpp:42
+#, fuzzy
+msgid "Add Triggered Segment"
+msgstr "创建小节"
+
+#: ../src/commands/segment/SetTriggerSegmentDefaultTimeAdjustCommand.cpp:39
+msgid "Set Default Time Adjust"
+msgstr ""
+
+#: ../src/commands/segment/RemoveTimeSignatureCommand.h:58
+#, fuzzy
+msgid "Remove &Time Signature Change..."
+msgstr "添加时间署名变更(&G)..."
+
+#: ../src/commands/segment/SegmentCommandRepeat.cpp:39
+msgid "Repeat Segments"
+msgstr "重复小节"
+
+#: ../src/commands/segment/AddTracksCommand.h:55
+msgid "Add Tracks..."
+msgstr "添加轨道..."
+
+#: ../src/commands/segment/ModifyDefaultTempoCommand.h:51
+msgid "Modify &Default Tempo..."
+msgstr "修改默认节拍(&D)..."
+
+#: ../src/commands/segment/SegmentSplitByPitchCommand.h:61
+msgid "Split by &Pitch..."
+msgstr "根据音色拆分(&P)..."
+
+#: ../src/commands/segment/DeleteTriggerSegmentCommand.cpp:40
+msgid "Delete Triggered Segment"
+msgstr ""
+
+#: ../src/commands/segment/SegmentSplitCommand.cpp:42
+msgid "Split Segment"
+msgstr "拆分小节"
+
+#: ../src/commands/segment/DeleteTracksCommand.h:51
+msgid "Delete Tracks..."
+msgstr "删除轨道..."
+
+#: ../src/commands/segment/InsertRangeCommand.cpp:42
+#, fuzzy
+msgid "Insert Range"
+msgstr "插入休止符"
+
+#: ../src/commands/segment/DeleteRangeCommand.h:62
+msgid "Rejoin Command"
+msgstr ""
+
+#: ../src/commands/segment/SetTriggerSegmentBasePitchCommand.cpp:39
+#, fuzzy
+msgid "Set Base Pitch"
+msgstr "根据音色拆分"
+
+#: ../src/commands/segment/PasteConductorDataCommand.cpp:41
+#, fuzzy
+msgid "Paste Tempos and Time Signatures"
+msgstr "以事件列表编辑器打开(&E)"
+
+#: ../src/commands/segment/SegmentSyncClefCommand.cpp:34
+#, fuzzy
+msgid "Sync segment clef"
+msgstr "小节标签"
+
+#: ../src/commands/matrix/MatrixInsertionCommand.cpp:46
+#: ../src/commands/notation/NoteInsertionCommand.cpp:54
+msgid "Insert Note"
+msgstr "插入音符"
+
+#: ../src/commands/matrix/MatrixEraseCommand.cpp:41
+msgid "Erase Note"
+msgstr "擦除音符"
+
+#: ../src/commands/matrix/MatrixPercussionInsertionCommand.cpp:47
+#, fuzzy
+msgid "Insert Percussion Note"
+msgstr "插入触发记号"
+
+#: ../src/commands/matrix/MatrixModifyCommand.cpp:43
+msgid "Move Note"
+msgstr "移动音符"
+
+#: ../src/commands/matrix/MatrixModifyCommand.cpp:43
+msgid "Modify Note"
+msgstr "修改音符"
+
+#: ../src/commands/edit/PasteEventsCommand.cpp:98
+msgid "Paste into an existing gap [\"restricted\"]"
+msgstr "粘贴到一个现有空隙[“限定”]"
+
+#: ../src/commands/edit/PasteEventsCommand.cpp:100
+msgid "Erase existing events to make room [\"simple\"]"
+msgstr "擦除现有事件腾出空间[“简化”]"
+
+#: ../src/commands/edit/PasteEventsCommand.cpp:102
+msgid "Move existing events out of the way [\"open-n-paste\"]"
+msgstr "把现有事件移动出去[“打开并粘贴”]"
+
+#: ../src/commands/edit/PasteEventsCommand.cpp:104
+msgid "Overlay notes, tying against present notes [\"note-overlay\"]"
+msgstr "修饰音符,紧缩现有音符[“音符修饰”]"
+
+#: ../src/commands/edit/PasteEventsCommand.cpp:106
+msgid "Overlay notes, ignoring present notes [\"matrix-overlay\"]"
+msgstr "修饰音符,忽略现有音符[“字模修饰”]"
+
+#: ../src/commands/edit/AddDotCommand.h:52
+msgid "&Add Dot"
+msgstr "添加顿音符号(&A)"
+
+#: ../src/commands/edit/RemoveMarkerCommand.h:55
+msgid "&Remove Marker"
+msgstr "删除示标(&R)"
+
+#: ../src/commands/edit/EventUnquantizeCommand.cpp:43
+#: ../src/commands/edit/EventUnquantizeCommand.cpp:54
+msgid "Unquantize Events"
+msgstr "未量化事件"
+
+#: ../src/commands/edit/ChangeVelocityCommand.h:53
+msgid "&Increase Velocity"
+msgstr "提高力度(&I)"
+
+#: ../src/commands/edit/ChangeVelocityCommand.h:54
+msgid "&Reduce Velocity"
+msgstr "降低力度(&R)"
+
+#: ../src/commands/edit/CopyCommand.cpp:46
+msgid "(excerpt)"
+msgstr "(摘要)"
+
+#: ../src/commands/edit/CopyCommand.cpp:60
+msgid "(copied)"
+msgstr "(复件)"
+
+#: ../src/commands/edit/EventInsertionCommand.cpp:39
+msgid "Insert Event"
+msgstr "插入事件"
+
+#: ../src/commands/edit/InsertTriggerNoteCommand.cpp:55
+msgid "Insert Trigger Note"
+msgstr "插入触发记号"
+
+#: ../src/commands/edit/CollapseNotesCommand.h:50
+msgid "Collapse &Equal-Pitch Notes"
+msgstr "压缩相同音色的音符(&E)"
+
+#: ../src/commands/edit/TransposeCommand.h:61
+msgid "&Up a Semitone"
+msgstr "升高一个半音(&U)"
+
+#: ../src/commands/edit/TransposeCommand.h:62
+msgid "&Down a Semitone"
+msgstr "降低一个半音(&D)"
+
+#: ../src/commands/edit/TransposeCommand.h:63
+msgid "Up an &Octave"
+msgstr "升高一个八度音阶(&O)"
+
+#: ../src/commands/edit/TransposeCommand.h:64
+msgid "Down an Octa&ve"
+msgstr "降低一个八度音阶(&V)"
+
+#: ../src/commands/edit/TransposeCommand.h:65
+#, fuzzy
+msgid "&Transpose by Semitones..."
+msgstr "正在升高一个半音..."
+
+#: ../src/commands/edit/SetNoteTypeCommand.h:56
+msgid "&Set Note Type"
+msgstr "设置记号类型(&S)"
+
+#: ../src/commands/edit/EventEditCommand.h:55
+msgid "Edit E&vent"
+msgstr "编辑事件(&V)"
+
+#: ../src/commands/edit/AddMarkerCommand.h:54
+msgid "&Add Marker"
+msgstr "添加示标(&A)"
+
+#: ../src/commands/edit/SelectionPropertyCommand.h:66
+msgid "Set &Property"
+msgstr "设定属性(&P)"
+
+#: ../src/commands/edit/CutCommand.h:55
+msgid "Cu&t"
+msgstr "剪切(&T)"
+
+#: ../src/commands/edit/EventQuantizeCommand.cpp:114
+msgid "Heuristic Notation &Quantize"
+msgstr "启发记号量化(&Q)"
+
+#: ../src/commands/edit/EventQuantizeCommand.cpp:116
+msgid "Grid &Quantize"
+msgstr "栅格量化(&Q)"
+
+#: ../src/commands/edit/ClearTriggersCommand.h:52
+msgid "&Clear Triggers"
+msgstr "清除触发器(&C)"
+
+#: ../src/commands/edit/RetrogradeCommand.h:51
+#, fuzzy
+msgid "&Retrograde"
+msgstr "录制(&R)"
+
+#: ../src/commands/edit/InvertCommand.h:51
+#, fuzzy
+msgid "&Invert"
+msgstr "还原(&V)"
+
+#: ../src/commands/edit/SetTriggerCommand.h:64
+msgid "Tri&gger Segment"
+msgstr "触发片段(&G)"
+
+#: ../src/commands/edit/SetLyricsCommand.h:50
+msgid "Edit L&yrics"
+msgstr "编辑歌词(&Y)"
+
+#: ../src/commands/edit/MoveAcrossSegmentsCommand.cpp:73
+msgid "&Move Events to Other Segment"
+msgstr "移动事件到其他片段(&M)"
+
+#: ../src/commands/edit/RetrogradeInvertCommand.h:51
+msgid "Re&trograde Invert"
+msgstr ""
+
+#: ../src/commands/edit/ModifyMarkerCommand.h:55
+msgid "&Modify Marker"
+msgstr "修改示标(&M)"
+
+#: ../src/commands/studio/AddControlParameterCommand.h:61
+#, fuzzy
+msgid "&Add Control Parameter"
+msgstr "乐器参数"
+
+#: ../src/commands/studio/ModifyInstrumentMappingCommand.h:55
+msgid "Modify &Instrument Mapping"
+msgstr "修改乐器映射(&I)"
+
+#: ../src/commands/studio/RemoveControlParameterCommand.h:60
+#, fuzzy
+msgid "&Remove Control Parameter"
+msgstr "小节参数"
+
+#: ../src/commands/studio/ReconnectDeviceCommand.h:55
+msgid "Reconnect Device"
+msgstr "重新连接设备"
+
+#: ../src/commands/studio/ModifyDeviceCommand.h:68
+msgid "Modify &MIDI Bank"
+msgstr "修改 MIDI 库(&M)"
+
+#: ../src/commands/studio/CreateOrDeleteDeviceCommand.h:68
+msgid "Create Device"
+msgstr "创建设备"
+
+#: ../src/commands/studio/ModifyDeviceMappingCommand.h:55
+msgid "Modify &Device Mapping"
+msgstr "修改设备映射(&D)"
+
+#: ../src/commands/studio/RenameDeviceCommand.h:55
+msgid "Rename Device"
+msgstr "重命名设备"
+
+#: ../src/commands/studio/ModifyControlParameterCommand.h:61
+#, fuzzy
+msgid "&Modify Control Parameter"
+msgstr "编辑控制器参数"
+
+#: ../src/commands/notation/TieNotesCommand.h:49
+#, fuzzy
+msgid "&Tie"
+msgstr "时间"
+
+#: ../src/commands/notation/ClefInsertionCommand.cpp:74
+msgid "Add Cle&f Change..."
+msgstr "添加谱号改变(&F)..."
+
+#: ../src/commands/notation/GuitarChordInsertionCommand.cpp:40
+#, fuzzy
+msgid "Insert Guitar Chord"
+msgstr "插入休止符"
+
+#: ../src/commands/notation/RespellCommand.cpp:47
+#, c-format
+msgid "Respell with %1"
+msgstr ""
+
+#: ../src/commands/notation/RespellCommand.cpp:50
+#, fuzzy
+msgid "Do&uble Sharp"
+msgstr "双重锐化"
+
+#: ../src/commands/notation/RespellCommand.cpp:52
+#, fuzzy
+msgid "&Sharp"
+msgstr "锐化"
+
+#: ../src/commands/notation/RespellCommand.cpp:54
+#, fuzzy
+msgid "&Flat"
+msgstr "平坦化"
+
+#: ../src/commands/notation/RespellCommand.cpp:56
+#, fuzzy
+msgid "Dou&ble Flat"
+msgstr "双重扁平化"
+
+#: ../src/commands/notation/RespellCommand.cpp:58
+#, fuzzy
+msgid "&Natural"
+msgstr "自然化"
+
+#: ../src/commands/notation/RespellCommand.cpp:60
+#, fuzzy
+msgid "N&one"
+msgstr "无"
+
+#: ../src/commands/notation/RespellCommand.cpp:66
+#, fuzzy
+msgid "Respell Accidentals &Upward"
+msgstr "临时记号(&A)"
+
+#: ../src/commands/notation/RespellCommand.cpp:69
+#, fuzzy
+msgid "Respell Accidentals &Downward"
+msgstr "临时记号(&A)"
+
+#: ../src/commands/notation/RespellCommand.cpp:72
+#, fuzzy
+msgid "&Restore Accidentals"
+msgstr "临时记号(&A)"
+
+#: ../src/commands/notation/RespellCommand.cpp:75
+#, fuzzy
+msgid "Respell Accidentals"
+msgstr "临时记号(&A)"
+
+#: ../src/commands/notation/DeCounterpointCommand.h:55
+#, fuzzy
+msgid "Split-and-Tie Overlapping &Chords"
+msgstr "分割与捆绑重叠和弦"
+
+#: ../src/commands/notation/BeamCommand.h:49
+msgid "&Beam Group"
+msgstr "全部分开符尾(&B)"
+
+#: ../src/commands/notation/AddTextMarkCommand.h:51
+msgid "Add Te&xt Mark..."
+msgstr "添加文本标记(&X)..."
+
+#: ../src/commands/notation/RestoreSlursCommand.h:49
+#, fuzzy
+msgid "&Restore Slur Positions"
+msgstr "恢复计算好的符干(&R)"
+
+#: ../src/commands/notation/SustainInsertionCommand.h:56
+msgid "Add Pedal &Press"
+msgstr ""
+
+#: ../src/commands/notation/SustainInsertionCommand.h:58
+msgid "Add Pedal &Release"
+msgstr ""
+
+#: ../src/commands/notation/FixNotationQuantizeCommand.h:49
+#, fuzzy
+msgid "Fi&x Notation Quantization"
+msgstr "启发记号量化(&Q)"
+
+#: ../src/commands/notation/ChangeStemsCommand.h:51
+msgid "Stems &Up"
+msgstr "符干向上(&U)"
+
+#: ../src/commands/notation/ChangeStemsCommand.h:51
+msgid "Stems &Down"
+msgstr "符干向下(&D)"
+
+#: ../src/commands/notation/MakeAccidentalsCautionaryCommand.cpp:43
+#, fuzzy
+msgid "Use &Cautionary Accidentals"
+msgstr "恢复计算好的符干(&R)"
+
+#: ../src/commands/notation/MakeAccidentalsCautionaryCommand.cpp:45
+#, fuzzy
+msgid "Cancel C&autionary Accidentals"
+msgstr "临时记号(&A)"
+
+#: ../src/commands/notation/SetVisibilityCommand.h:50
+#, fuzzy
+msgid "Set Visibility"
+msgstr "力度(&V)"
+
+#: ../src/commands/notation/ChangeStyleCommand.h:53
+msgid "Change &Note Style"
+msgstr "改变音符样式(&N)"
+
+#: ../src/commands/notation/TextInsertionCommand.cpp:41
+msgid "Insert Text"
+msgstr "插入文本"
+
+#: ../src/commands/notation/InterpretCommand.h:70
+msgid "&Interpret..."
+msgstr "解析(&I)..."
+
+#: ../src/commands/notation/TupletCommand.h:53
+#, fuzzy
+msgid "&Triplet"
+msgstr "三连音"
+
+#: ../src/commands/notation/TupletCommand.h:54
+#, fuzzy
+msgid "Tu&plet..."
+msgstr "连音(&T)..."
+
+#: ../src/commands/notation/UnTupletCommand.h:50
+msgid "&Untuplet"
+msgstr "取消连音(&U)"
+
+#: ../src/commands/notation/CollapseRestsCommand.h:54
+msgid "&Collapse Rests"
+msgstr "压缩休止符(&C)"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:145
+msgid "Add S&lur"
+msgstr "添加含糊音(&L)"
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:147
+#, fuzzy
+msgid "Add &Phrasing Slur"
+msgstr "正在添加连音线..."
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:149
+msgid "Add Double-Octave Up"
+msgstr ""
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:151
+msgid "Add Octave &Up"
+msgstr ""
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:153
+msgid "Add Octave &Down"
+msgstr ""
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:155
+msgid "Add Double Octave Down"
+msgstr ""
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:160
+#, fuzzy
+msgid "Add &Crescendo"
+msgstr "正在添加渐强..."
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:162
+#, fuzzy
+msgid "Add &Decrescendo"
+msgstr "正在添加渐弱..."
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:164
+#, fuzzy
+msgid "Add &Glissando"
+msgstr "正在添加渐强..."
+
+#: ../src/commands/notation/AddIndicationCommand.cpp:167
+msgid "Add &%1%2"
+msgstr "添加 &%1%2"
+
+#: ../src/commands/notation/RemoveNotationQuantizeCommand.h:49
+#, fuzzy
+msgid "Remo&ve Notation Quantization"
+msgstr "启发记号量化(&Q)"
+
+#: ../src/commands/notation/MakeChordCommand.h:50
+#, fuzzy
+msgid "Make &Chord"
+msgstr " 和弦"
+
+#: ../src/commands/notation/MultiKeyInsertionCommand.h:63
+msgid "Change all to &Key %1..."
+msgstr "全部变为键 %1(&K)..."
+
+#: ../src/commands/notation/KeyInsertionCommand.h:67
+#: ../src/commands/notation/MultiKeyInsertionCommand.h:65
+msgid "Add &Key Change..."
+msgstr "添加键改变(&K)..."
+
+#: ../src/commands/notation/RestoreStemsCommand.h:49
+#, fuzzy
+msgid "&Restore Stems"
+msgstr "恢复计算好的符干(&R)"
+
+#: ../src/commands/notation/MakeNotesViableCommand.h:55
+#: ../src/commands/notation/MakeRegionViableCommand.h:52
+#, fuzzy
+msgid "Tie Notes at &Barlines"
+msgstr "将音符捆绑于进程线等等"
+
+#: ../src/commands/notation/AddSlashesCommand.h:46
+msgid "Slashes"
+msgstr "斜线"
+
+#: ../src/commands/notation/ChangeSlurPositionCommand.h:51
+msgid "Slur &Above"
+msgstr ""
+
+#: ../src/commands/notation/ChangeSlurPositionCommand.h:51
+msgid "Slur &Below"
+msgstr ""
+
+#: ../src/commands/notation/NormalizeRestsCommand.h:54
+msgid "&Normalize Rests"
+msgstr "规格化休止符(&N)"
+
+#: ../src/commands/notation/TextChangeCommand.cpp:41
+#, fuzzy
+msgid "Edit Text"
+msgstr "编辑事件"
+
+#: ../src/commands/notation/RemoveMarksCommand.h:49
+msgid "&Remove All Marks"
+msgstr "删除所有标记(&R)"
+
+#: ../src/commands/notation/AutoBeamCommand.h:52
+msgid "&Auto-Beam"
+msgstr "自动分开符尾(&A)"
+
+#: ../src/commands/notation/UntieNotesCommand.h:49
+#, fuzzy
+msgid "&Untie"
+msgstr "松解音符(&U)"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:48
+msgid "S&forzando"
+msgstr "强音(&F)"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:50
+msgid "Sta&ccato"
+msgstr "断音(&C)"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:52
+msgid "R&inforzando"
+msgstr "突强(&I)"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:54
+msgid "T&enuto"
+msgstr "持续(&E)"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:56
+msgid "Tri&ll"
+msgstr "颤音(&L)"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:58
+msgid "Trill &with Line"
+msgstr ""
+
+#: ../src/commands/notation/AddMarkCommand.cpp:60
+#, fuzzy
+msgid "Trill Line"
+msgstr "颤音(&L)"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:62
+msgid "&Turn"
+msgstr "加音(&T)"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:64
+msgid "&Accent"
+msgstr "重音(&A)"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:66
+msgid "&Staccatissimo"
+msgstr ""
+
+#: ../src/commands/notation/AddMarkCommand.cpp:68
+msgid "&Marcato"
+msgstr "加强(&M)"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:70
+msgid "&Pause"
+msgstr "暂停(&P)"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:72
+msgid "&Up-Bow"
+msgstr ""
+
+#: ../src/commands/notation/AddMarkCommand.cpp:74
+msgid "&Down-Bow"
+msgstr ""
+
+#: ../src/commands/notation/AddMarkCommand.cpp:76
+msgid "Mo&rdent"
+msgstr ""
+
+#: ../src/commands/notation/AddMarkCommand.cpp:78
+#, fuzzy
+msgid "Inverted Mordent"
+msgstr "插入文本"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:80
+msgid "Long Mordent"
+msgstr ""
+
+#: ../src/commands/notation/AddMarkCommand.cpp:82
+#, fuzzy
+msgid "Lon&g Inverted Mordent"
+msgstr "和弦插入模式(&H)"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:84
+msgid "&%1%2"
+msgstr "&%1%2"
+
+#: ../src/commands/notation/AddMarkCommand.cpp:89
+#, c-format
+msgid "Add %1"
+msgstr "添加 %1"
+
+#: ../src/commands/notation/ResetDisplacementsCommand.h:49
+#, fuzzy
+msgid "Restore Positions"
+msgstr "恢复计算好的符干(&R)"
+
+#: ../src/commands/notation/IncrementDisplacementsCommand.h:52
+#, fuzzy
+msgid "Fine Reposition"
+msgstr "插入到作品中"
+
+#: ../src/commands/notation/RestoreTiesCommand.h:49
+#, fuzzy
+msgid "&Restore Tie Positions"
+msgstr "恢复计算好的符干(&R)"
+
+#: ../src/commands/notation/ChangeTiePositionCommand.h:47
+msgid "Tie &Above"
+msgstr ""
+
+#: ../src/commands/notation/ChangeTiePositionCommand.h:47
+msgid "Tie &Below"
+msgstr ""
+
+#: ../src/commands/notation/KeyInsertionCommand.h:65
+msgid "Change to &Key %1..."
+msgstr "变更为键 %1(&K)..."
+
+#: ../src/commands/notation/RemoveFingeringMarksCommand.h:49
+#, fuzzy
+msgid "&Remove Fingerings"
+msgstr "删除所有标记(&R)"
+
+#: ../src/commands/notation/BreakCommand.h:49
+msgid "&Unbeam"
+msgstr "取销符尾分开(&U)"
+
+#: ../src/commands/notation/UnGraceCommand.h:48
+msgid "Ung&race"
+msgstr "取消装饰音(&R)"
+
+#: ../src/commands/notation/AddFingeringMarkCommand.cpp:45
+#, fuzzy
+msgid "Add Other &Fingering..."
+msgstr "正在添加连音线..."
+
+#: ../src/commands/notation/AddFingeringMarkCommand.cpp:47
+#, fuzzy
+msgid "Add Fingering &0 (Thumb)"
+msgstr "正在添加连音线..."
+
+#: ../src/commands/notation/AddFingeringMarkCommand.cpp:49
+#, fuzzy, c-format
+msgid "Add Fingering &%1"
+msgstr "正在添加连音线..."
+
+#: ../src/document/io/HydrogenXMLHandler.cpp:277
+msgid " imported from Hydrogen "
+msgstr " 从 Hydrogen 导入 "
+
+#: ../src/document/io/LilyPondExporter.cpp:404
+#, fuzzy
+msgid ""
+"LilyPond does not allow spaces or backslashes in filenames.\n"
+"\n"
+"Would you like to use\n"
+"\n"
+" %1\n"
+"\n"
+" instead?"
+msgstr ""
+"Lilypond 不允许空格或反斜杠出现在文件名里。\n"
+"\n"
+"您希望用\n"
+"\n"
+" %1\n"
+"\n"
+" 来代替吗?"
+
+#: ../src/document/io/LilyPondExporter.cpp:2054
+msgid "warning: overlong bar truncated here"
+msgstr "警告:过长的进程条截断于此处"
+
+#: ../src/document/io/LilyPondExporter.cpp:2060
+msgid "warning: bar too short, padding with rests"
+msgstr "警告:进程条太短,以休止符填充"
+
+#: ../src/document/MultiViewCommandHistory.cpp:318
+msgid "Nothing to undo"
+msgstr "没什么可撤消!"
+
+#: ../src/document/MultiViewCommandHistory.cpp:320
+msgid "Nothing to redo"
+msgstr "没什么可重做!"
+
+#: ../src/document/MultiViewCommandHistory.cpp:328
+#: ../src/document/MultiViewCommandHistory.cpp:372
+#, c-format
+msgid "Und&o %1"
+msgstr "撤销(&O) %1"
+
+#: ../src/document/MultiViewCommandHistory.cpp:330
+#: ../src/document/MultiViewCommandHistory.cpp:374
+#, c-format
+msgid "Re&do %1"
+msgstr "重做(&D) %1"
+
+#: ../src/document/RosegardenGUIDoc.cpp:328
+msgid ""
+"The current file has been modified.\n"
+"Do you want to save it?"
+msgstr ""
+"当前文件已被修改。\n"
+"您想保存它吗?"
+
+#: ../src/document/RosegardenGUIDoc.cpp:480
+#, c-format
+msgid ""
+"_n: Delete the 1 audio file recorded during the unsaved session?\n"
+"Delete the %n audio files recorded during the unsaved session?"
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:501
+msgid ""
+"The following audio files were recorded during this session but have been "
+"unloaded\n"
+"from the audio file manager, and so are no longer in use in the document you "
+"are saving.\n"
+"\n"
+"You may want to clean up these files to save disk space.\n"
+"\n"
+"Please select any you wish to delete permanently from the hard disk.\n"
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:517
+#, c-format
+msgid ""
+"_n: <qt>About to delete 1 audio file permanently from the hard disk."
+"<br>There will be no way to recover this file.<br>Are you sure?</qt>\n"
+"\n"
+"<qt>About to delete %n audio files permanently from the hard disk.<br>There "
+"will be no way to recover these files.<br>Are you sure?</qt>"
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:580
+msgid "Can't open file '%1'"
+msgstr "无法打开文件“%1”"
+
+#: ../src/document/RosegardenGUIDoc.cpp:585
+msgid "Reading file..."
+msgstr "正在读取文件..."
+
+#: ../src/document/RosegardenGUIDoc.cpp:603
+#, fuzzy
+msgid "Could not open Rosegarden file"
+msgstr "不是 玫瑰园-4 文件"
+
+#: ../src/document/RosegardenGUIDoc.cpp:641
+msgid "Error when parsing file '%1': \"%2\""
+msgstr "解析文件“%1”时出错:“%2”"
+
+#: ../src/document/RosegardenGUIDoc.cpp:689
+msgid "Generating audio previews..."
+msgstr "正在生成音频预览..."
+
+#: ../src/document/RosegardenGUIDoc.cpp:721
+#, fuzzy
+msgid "Merge"
+msgstr "合并(&M)"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1605
+#, fuzzy
+msgid "File load cancelled"
+msgstr "文件载入已取消"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1625
+msgid ""
+"<h3>Audio and plugins not available</h3><p>This composition uses audio files "
+"or plugins, but Rosegarden is currently running without audio because the "
+"JACK audio server was not available on startup.</p><p>Please exit "
+"Rosegarden, start the JACK audio server and re-start Rosegarden if you wish "
+"to load this complete composition.</p><p><b>WARNING:</b> If you re-save this "
+"composition, all audio and plugin data and settings in it will be lost.</p>"
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:1628
+msgid ""
+"<h3>Audio and plugins not available</h3><p>This composition uses audio files "
+"or plugins, but you are running a version of Rosegarden that was compiled "
+"without audio support.</p><p><b>WARNING:</b> If you re-save this composition "
+"from this version of Rosegarden, all audio and plugin data and settings in "
+"it will be lost.</p>"
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:1665
+msgid ""
+"<h3>Incorrect audio sample rate</h3><p>This composition contains audio files "
+"that were recorded or imported with the audio server running at a different "
+"sample rate (%1 Hz) from the current JACK server sample rate (%2 Hz).</"
+"p><p>Rosegarden will play this composition at the correct speed, but any "
+"audio files in it will probably sound awful.</p><p>Please consider re-"
+"starting the JACK server at the correct rate (%3 Hz) and re-loading this "
+"composition before you do any more work with it.</p>"
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:1675
+msgid ""
+"<h3>Inconsistent audio sample rates</h3><p>This composition contains audio "
+"files at more than one sample rate.</p><p>Rosegarden will play them at the "
+"correct speed, but any audio files that were recorded or imported at rates "
+"different from the current JACK server sample rate (%1 Hz) will probably "
+"sound awful.</p><p>Please see the audio file manager dialog for more "
+"details, and consider resampling any files that are at the wrong rate.</p>"
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:1676
+#, fuzzy
+msgid "Inconsistent sample rates"
+msgstr "元素属性"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1690
+msgid ""
+"<h3>Plugins not found</h3><p>The following audio plugins could not be loaded:"
+"</p><ul>"
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:1698
+#, fuzzy
+msgid "<li>%1 (from %2)</li>"
+msgstr "-- %1 (从 %2)\n"
+
+#: ../src/document/RosegardenGUIDoc.cpp:1712
+msgid ""
+"This file contains one or more old element types that are now deprecated.\n"
+"Support for these elements may disappear in future versions of Rosegarden.\n"
+"We recommend you re-save this file from this version of Rosegarden to ensure "
+"that it can still be re-loaded in future versions."
+msgstr ""
+
+#: ../src/document/RosegardenGUIDoc.cpp:2207
+msgid "Insert Recorded MIDI"
+msgstr "插入录制好的 MIDI"
+
+#: ../src/document/RosegardenGUIDoc.cpp:2560
+msgid "%1 (recorded)"
+msgstr "%1 (已录制)"
+
+#: ../src/document/RoseXmlHandler.cpp:442
+msgid ""
+"This file was written by Rosegarden %1, and it uses\n"
+"a different file format that cannot be read by this version."
+msgstr ""
+
+#: ../src/document/RoseXmlHandler.cpp:452
+msgid ""
+"This file was written by Rosegarden %1, which is more recent than this "
+"version.\n"
+"There may be some incompatibilities with the file format."
+msgstr ""
+
+#: ../src/document/RoseXmlHandler.cpp:1687
+#, fuzzy
+msgid "Loading plugins..."
+msgstr "正在列举插件..."
+
+#: rc.cpp:6 rc.cpp:144
+#, fuzzy, no-c-format
+msgid "Se&gment"
+msgstr "小节(&M)"
+
+#: rc.cpp:9 rc.cpp:84 rc.cpp:147 rc.cpp:303
+#, fuzzy, no-c-format
+msgid "Edit &With"
+msgstr "根据音色拆分"
+
+#: rc.cpp:12 rc.cpp:21 rc.cpp:30 rc.cpp:39 rc.cpp:345
+#, no-c-format
+msgid "Actions Toolbar"
+msgstr "行为工具栏"
+
+#: rc.cpp:15 rc.cpp:33 rc.cpp:129 rc.cpp:285
+#, no-c-format
+msgid "Time Toolbar"
+msgstr "时间工具栏"
+
+#: rc.cpp:18 rc.cpp:36 rc.cpp:57 rc.cpp:63 rc.cpp:120 rc.cpp:243 rc.cpp:342
+#, no-c-format
+msgid "Transport Toolbar"
+msgstr "播放控制器工具栏"
+
+#: rc.cpp:24 rc.cpp:42 rc.cpp:123 rc.cpp:348
+#, no-c-format
+msgid "Zoom Toolbar"
+msgstr "缩放工具栏"
+
+#: rc.cpp:45 rc.cpp:60 rc.cpp:99 rc.cpp:228 rc.cpp:327
+#, no-c-format
+msgid "T&ransport"
+msgstr "播放控制器(&R)"
+
+#: rc.cpp:51
+#, no-c-format
+msgid "Number of Stereo &Inputs"
+msgstr "立体声输入数量(&I)"
+
+#: rc.cpp:54
+#, no-c-format
+msgid "&Number of Submasters"
+msgstr "副控制器数量(&N)"
+
+#: rc.cpp:66
+#, no-c-format
+msgid "&Import"
+msgstr "导入(&I)"
+
+#: rc.cpp:69
+#, no-c-format
+msgid "&Merge"
+msgstr "并入(&M)"
+
+#: rc.cpp:72
+#, no-c-format
+msgid "&Export"
+msgstr "导出(&E)"
+
+#: rc.cpp:75 rc.cpp:141 rc.cpp:297
+#, fuzzy, no-c-format
+msgid "&Composition"
+msgstr "插入到作品中"
+
+#: rc.cpp:78
+#, no-c-format
+msgid "&Studio"
+msgstr "工作环境(&S)"
+
+#: rc.cpp:81
+#, no-c-format
+msgid "Se&gments"
+msgstr "片段(&G)"
+
+#: rc.cpp:90
+#, no-c-format
+msgid "Trac&ks"
+msgstr "轨道(&K)"
+
+#: rc.cpp:93
+#, no-c-format
+msgid "Set &Instrument"
+msgstr "设置乐器(&I)"
+
+#: rc.cpp:102 rc.cpp:234 rc.cpp:333
+#, no-c-format
+msgid "&Toolbars"
+msgstr "工具栏(&T)"
+
+#: rc.cpp:105 rc.cpp:237 rc.cpp:336
+#, no-c-format
+msgid "&Rulers"
+msgstr "标尺(&R)"
+
+#: rc.cpp:111 rc.cpp:240 rc.cpp:339
+#, no-c-format
+msgid "Tools Toolbar"
+msgstr "工具工具栏"
+
+#: rc.cpp:114
+#, no-c-format
+msgid "Tracks Toolbar"
+msgstr "轨道工具栏"
+
+#: rc.cpp:117
+#, no-c-format
+msgid "Editors Toolbar"
+msgstr "编辑器工具栏"
+
+#: rc.cpp:135
+#, no-c-format
+msgid "&Layout Mode"
+msgstr "布局模式(&L)"
+
+#: rc.cpp:138 rc.cpp:294
+#, no-c-format
+msgid "Add Event Ruler"
+msgstr "添加事件标尺"
+
+#: rc.cpp:150
+#, fuzzy, no-c-format
+msgid "N&ote"
+msgstr "音符(&O)"
+
+#: rc.cpp:153
+#, no-c-format
+msgid "Mar&ks"
+msgstr "标记(&K)"
+
+#: rc.cpp:156
+#, fuzzy, no-c-format
+msgid "&Ornaments"
+msgstr "小节(&M)"
+
+#: rc.cpp:159
+#, fuzzy, no-c-format
+msgid "&Fingerings"
+msgstr "正在添加连音线..."
+
+#: rc.cpp:162
+#, no-c-format
+msgid "S&lashes"
+msgstr "斜线(&L)"
+
+#: rc.cpp:165 rc.cpp:219
+#, no-c-format
+msgid "&Accidentals"
+msgstr "临时记号(&A)"
+
+#: rc.cpp:168
+#, fuzzy, no-c-format
+msgid "&Phrase"
+msgstr "擦除(&E)"
+
+#: rc.cpp:171
+#, fuzzy, no-c-format
+msgid "Slur &Position"
+msgstr "插入到作品中"
+
+#: rc.cpp:174
+#, fuzzy, no-c-format
+msgid "Tie &Position"
+msgstr "插入到作品中"
+
+#: rc.cpp:177
+#, no-c-format
+msgid "&Octaves"
+msgstr "八度音阶(&O)"
+
+#: rc.cpp:180 rc.cpp:306
+#, no-c-format
+msgid "Ad&just"
+msgstr ""
+
+#: rc.cpp:183
+#, fuzzy, no-c-format
+msgid "R&ests"
+msgstr "休止符(&R)"
+
+#: rc.cpp:186 rc.cpp:213
+#, no-c-format
+msgid "&Notes"
+msgstr "音符(&N)"
+
+#: rc.cpp:189 rc.cpp:309
+#, fuzzy, no-c-format
+msgid "&Quantize"
+msgstr "量化"
+
+#: rc.cpp:195 rc.cpp:315
+#, no-c-format
+msgid "Trans&pose"
+msgstr "变调(&P)"
+
+#: rc.cpp:198 rc.cpp:318
+#, no-c-format
+msgid "Convert"
+msgstr ""
+
+#: rc.cpp:201
+#, fuzzy, no-c-format
+msgid "&Fine Positioning"
+msgstr "插入到作品中"
+
+#: rc.cpp:204
+#, fuzzy, no-c-format
+msgid "Fine Ti&ming"
+msgstr "插入到作品中"
+
+#: rc.cpp:207
+#, fuzzy, no-c-format
+msgid "&Visibility"
+msgstr "力度(&V)"
+
+#: rc.cpp:216
+#, no-c-format
+msgid "&Rests"
+msgstr "休止符(&R)"
+
+#: rc.cpp:222
+#, no-c-format
+msgid "&Clefs"
+msgstr "谱号(&C)"
+
+#: rc.cpp:225 rc.cpp:324
+#, no-c-format
+msgid "Local &Cursor"
+msgstr ""
+
+#: rc.cpp:246
+#, no-c-format
+msgid "Notes Toolbar"
+msgstr "音符工具栏"
+
+#: rc.cpp:249
+#, no-c-format
+msgid "Rests Toolbar"
+msgstr "休止符工具栏"
+
+#: rc.cpp:252
+#, no-c-format
+msgid "Clefs Toolbar"
+msgstr "谱号工具栏"
+
+#: rc.cpp:255
+#, no-c-format
+msgid "Accidentals Toolbar"
+msgstr "临时记号工具栏"
+
+#: rc.cpp:258
+#, no-c-format
+msgid "Group Toolbar"
+msgstr "分组工具栏"
+
+#: rc.cpp:261
+#, no-c-format
+msgid "Marks Toolbar"
+msgstr "标记工具栏"
+
+#: rc.cpp:264
+#, no-c-format
+msgid "Meta Toolbar"
+msgstr "元(数据)工具栏"
+
+#: rc.cpp:267
+#, no-c-format
+msgid "Layout Toolbar"
+msgstr "布局工具栏"
+
+#: rc.cpp:270 rc.cpp:351
+#, no-c-format
+msgid "Control Ruler actions"
+msgstr "控制器标尺行为"
+
+#: rc.cpp:273 rc.cpp:354
+#, no-c-format
+msgid "Property Ruler actions"
+msgstr "属性标尺行为"
+
+#: rc.cpp:276
+#, fuzzy, no-c-format
+msgid "&Action"
+msgstr "符干方向(&T)"
+
+#: rc.cpp:279
+#, fuzzy, no-c-format
+msgid "General Toolbar"
+msgstr "元(数据)工具栏"
+
+#: rc.cpp:291
+#, no-c-format
+msgid "&Grid"
+msgstr "栅格(&G)"
+
+#: rc.cpp:300
+#, fuzzy, no-c-format
+msgid "&Segment"
+msgstr "小节(&M)"
+
+#: rc.cpp:361
+#, no-c-format
+msgid "Hide additional controls"
+msgstr "隐藏额外控件"
+
+#: rc.cpp:365
+#, no-c-format
+msgid "Panic Button"
+msgstr "应急按钮"
+
+#: rc.cpp:368
+#, no-c-format
+msgid "Resets all MIDI devices if you've got stuck notes"
+msgstr ""
+
+#: rc.cpp:375
+#, no-c-format
+msgid "Provides a metronome click for you to play along with"
+msgstr "提供一个节拍器滴答声以便您能跟随它播放"
+
+#: rc.cpp:378
+#, no-c-format
+msgid "Shows MIDI activity in and out of Rosegarden"
+msgstr "于玫瑰园内或外显示 MIDI 激活"
+
+#: rc.cpp:381
+#, no-c-format
+msgid "IN"
+msgstr "内"
+
+#: rc.cpp:384
+#, no-c-format
+msgid "OUT"
+msgstr "外"
+
+#: rc.cpp:387 rc.cpp:390
+#, no-c-format
+msgid "NO EVENTS"
+msgstr "没有事件"
+
+#: rc.cpp:397
+#, no-c-format
+msgid "Record either MIDI or audio"
+msgstr "录制 MIDI 或音频"
+
+#: rc.cpp:401
+#, no-c-format
+msgid "Loop"
+msgstr "循环"
+
+#: rc.cpp:404
+#, no-c-format
+msgid "Turn on and off the loop markers (if set)"
+msgstr "开启或关闭循环标记(如果设置的话)"
+
+#: rc.cpp:411
+#, no-c-format
+msgid "Mutes all but the currently selected track"
+msgstr "除了当前选中的轨道外全部静音"
+
+#: rc.cpp:415
+#, fuzzy, no-c-format
+msgid "Start loop or range here"
+msgstr "从这里开始进程条 %1"
+
+#: rc.cpp:419
+#, fuzzy, no-c-format
+msgid "End loop or range here"
+msgstr "从这里开始进程条 %1"
+
+#: rc.cpp:422
+#, no-c-format
+msgid "SIG"
+msgstr "标记"
+
+#: rc.cpp:425
+#, no-c-format
+msgid "DIV"
+msgstr "DIV"
+
+#: rc.cpp:428
+#, no-c-format
+msgid "/16"
+msgstr "/16"
+
+#: rc.cpp:431
+#, no-c-format
+msgid "TEMPO"
+msgstr "节拍"
+
+#: rc.cpp:434
+#, no-c-format
+msgid "END"
+msgstr "结束"
+
+#: rc.cpp:437
+#, no-c-format
+msgid "BAR"
+msgstr "进程条"
+
+#: rc.cpp:441
+#, no-c-format
+msgid "Switch between real time, musical time, and frame count"
+msgstr "在真实时间、音乐时间和帧计数之间切换"
+
+#: rc.cpp:445
+#, no-c-format
+msgid "Show additional controls"
+msgstr "显示额外控件"
+
+#: rc.cpp:449
+#, no-c-format
+msgid "Rewind"
+msgstr "回绕"
+
+#: rc.cpp:452
+#, no-c-format
+msgid "Moves the current pointer position back one bar."
+msgstr "将当前指针位置向后移动一个进程条"
+
+#: rc.cpp:456
+#, no-c-format
+msgid "Rewind to beginning"
+msgstr "回绕到起点"
+
+#: rc.cpp:459
+#, no-c-format
+msgid ""
+"Moves the pointer position to the start of the composition. (This may mean "
+"going forwards if the pointer is currently before the start.)"
+msgstr ""
+
+#: rc.cpp:463
+#, no-c-format
+msgid "Play/Pause"
+msgstr "播放/暂停"
+
+#: rc.cpp:466
+#, no-c-format
+msgid ""
+"Plays from the current pointer position, or pauses playback if already in "
+"progress."
+msgstr "从当前的指针位置播放,或者如果正在播放则暂停回放。"
+
+#: rc.cpp:473
+#, no-c-format
+msgid "Stops playback or recording."
+msgstr "停止播放或录音。"
+
+#: rc.cpp:477
+#, no-c-format
+msgid "Fast forward"
+msgstr "快进"
+
+#: rc.cpp:480
+#, no-c-format
+msgid "Moves the current pointer position forwards one bar."
+msgstr "将当前指针位置向前移动一个进程条。"
+
+#: rc.cpp:484
+#, no-c-format
+msgid "Fast forward to end"
+msgstr "快进至终点"
+
+#: rc.cpp:487
+#, no-c-format
+msgid ""
+"Moves the pointer position to the end of the composition. (This may mean "
+"going backwards if the pointer is already beyond the end.)"
+msgstr ""
+
+#: rc.cpp:491
+#, no-c-format
+msgid "Display time to end"
+msgstr "以倒计时方式显示时间"
+
+#: ../docs/en/tips.cpp:3
+msgid ""
+"<p>To configure a track to play using a particular instrument:</p>\n"
+"&nbsp;&nbsp;* click on the track label and hold a moment<br>\n"
+"&nbsp;&nbsp;* select an output device<br>\n"
+"&nbsp;&nbsp;* select one of that device's available instruments (#1 - #16)"
+"<br>\n"
+"&nbsp;&nbsp;* adjust that instrument's output channel, program, bank, and\n"
+"controllers via the instrument parameters box\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:13
+msgid ""
+"<p>...that Rosegarden has an autosave feature?<br><br>\n"
+"You can select your autosave interval from <b>Settings->Configure\n"
+"Rosegarden</b>.<br><br>\n"
+"When something goes awry, such as a power outage or a Rosegarden crash\n"
+"(unfortunately, it happens...) simply load the file you were working on, and "
+"you'll be given the\n"
+"option to load the autosaved version, or the unmodified original.</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:23
+msgid ""
+"<p>\n"
+"...that you can save the current document as your default studio by using\n"
+"<b>Composition -> Studio -> Save Current Document as Default Studio</b>?</"
+"p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:30
+msgid ""
+"<p>...that your default studio is a complete Rosegarden composition that "
+"gets\n"
+"loaded every time you create a new document or import a MIDI file?</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:36
+msgid ""
+"<p>...that your default studio can contain instrument assignments, document "
+"properties, LilyPond headers,\n"
+"and many other things?<br><br>The default studio is a complete Rosegarden "
+"composition, so it can contain anything that you may wish to have available "
+"in each\n"
+"new document you create.</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:43
+msgid ""
+"<p>...that Rosegarden will detect and create a default connection for ALSA "
+"soft\n"
+"synth applications that are started after Rosegarden is already running?</"
+"p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:49
+msgid ""
+"<p>...that you can make your default studio override that in every "
+"Rosegarden composition you load?<br><br>If your studio setup does not change "
+"very often, and you would prefer for\n"
+"the settings in your default studio to take precedence over whatever\n"
+"studio is saved with any files you happen to load, you can make your studio "
+"the default for everything using <b>Settings -> Configure Rosegarden ->\n"
+"MIDI -> Always use default studio when loading files</b>.</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:57
+msgid ""
+"<p>If you have accidentally recorded a segment so short that it does not\n"
+"appear on the canvas, which you can only hear during subsequent recording\n"
+"sessions, you can gain access to it by using <b>Composition -> Change\n"
+"Composition Start and End</b> and then setting the composition to start at a "
+"negative number.</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:65
+msgid ""
+"<p>...that if you place a note at the wrong pitch using the notation or "
+"matrix editor, you can move it one semitone at a time with the up and down "
+"arrow keys on your keyboard?</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:70
+#, fuzzy
+msgid ""
+"<p>...that you can toggle stem directions in the notation editor by "
+"selecting\n"
+"one or more notes and using Ctrl-PageUp and Ctrl-PageDown?</p>\n"
+msgstr ""
+"<p>……按住Shift键,再按Page Up或Page Down键,\n"
+"可以按页面大小卷动以查看屏幕上以前的记录。\n"
+
+#: ../docs/en/tips.cpp:76
+msgid ""
+"<p>...that you can change the accidental used for a note in the notation "
+"editor (without changing the pitch of the note) by selecting\n"
+"it and using the up and down arrow keys with both Ctrl and Shift pressed?</"
+"p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:82 ../docs/en/tips.cpp:93
+msgid ""
+"<p>...that you can hold down the Shift key while repositioning segments on "
+"the\n"
+"segment canvas in order to avoid the \"snap-to\" effect and exert finer "
+"control?</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:88
+msgid ""
+"<p>...that you can use the arrow tool to draw, move, and resize segments and "
+"events as well as to select them?<br><br>Drag a segment or event block to "
+"move it, drag the right edge of a block to resize it, and drag with the "
+"middle mouse button pressed to draw a new segment or event.<br><br>(Of "
+"course, the dedicated draw, move and resize tools are still quicker for "
+"repeated operations.)</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:99
+msgid ""
+"<p>...that you can hold down the Shift key while repositioning or resizing "
+"events in the\n"
+"matrix view in order to avoid the \"snap-to\" effect and exert finer control?"
+"</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:105
+msgid ""
+"<p>...that you can edit multiple segments on multiple tracks simultaneously "
+"in\n"
+"the notation editor? Simply select the segments, then use <b>Edit -> Open "
+"in Notation Editor</b>.</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:111
+msgid ""
+"<p>...that Rosegarden can export files for use by LilyPond, the high-quality "
+"score typesetting system?<br><br>\n"
+"From the <b>File</b> menu, navigate to <b>Export -> Export LilyPond File</"
+"b></p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:117
+msgid ""
+"<p>...that Rosegarden can print via LilyPond, the high-quality score "
+"typesetting system?<br><br>\n"
+"From the <b>File</b> menu, navigate to <b>Preview with LilyPond</b>. The "
+"file\n"
+"will be exported, rendered, and a preview will appear in KPDF, or one of\n"
+"several other PDF viewers, where it can then be printed as well.</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:125
+msgid ""
+"<p>...that if you use the quantizer from within the notation view, you can "
+"tell it to quantize only the timing used for notation -- making it possible "
+"to have good looking notation <b>and</b> a human MIDI performance?</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:130
+msgid ""
+"<p>...that you can change segment labels using the controls on the Segment "
+"Parameters box\n"
+"in the main window?</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:136
+msgid ""
+"<p>...that the number of tracks in new documents is based on the contents "
+"of\n"
+"your autoload.rg file?\n"
+"<br><br>\n"
+"Whether you prefer to start with three tracks or 43, create a document that\n"
+"contains the desired number of tracks, plus any other studio or document "
+"properties settings\n"
+"you wish to configure, and use <b>Composition -> Studio -> Save Current "
+"Document as Default\n"
+"Studio</b> to make this your new default.</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:147
+msgid ""
+"<p>...that you can change the name of a track by double clicking on the "
+"label? (The\n"
+"label must be visible for this to work.)</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:153
+msgid ""
+"<p>...that you can configure what happens when you double-click on a segment?"
+"<br><br>Go to <b>Settings -> Configure Rosegarden</b> and choose your "
+"preferred editing window under the <b>Behaviour</b> tab.</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:158
+msgid ""
+"<p>...that Rosegarden is being developed as a community effort with\n"
+"contributions from around the world?<br><br>\n"
+"The four most active developers live in London (England), Cannes, "
+"Barcelona,\n"
+"and... Christiansburg? (Christiansburg is a town of about 50,000 in\n"
+"southwestern Virginia, USA.)<br><br>\n"
+"We have had contributors from elsewhere in the US, UK, Spain, Mexico, "
+"Argentina, Germany,\n"
+"Sweden, Russia, Japan, Finland, and Italy, just to name a few...</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:169
+msgid ""
+"<p>...that Rosegarden is available in Spanish, French, German, Russian, "
+"Welsh, Swedish, Italian and Estonian\n"
+"translations? (Just to name a few.)<br><br>\n"
+"If you're interested in translating Rosegarden to another language, drop us "
+"a\n"
+"line at <b>[email protected]</b>.</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:177
+msgid ""
+"<p>...that you can change the total number of bars in the composition via\n"
+"<b>Composition -> Change Composition Start and End</b>?</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:183
+msgid ""
+"<p>...that you can see the difference between performance and display "
+"duration\n"
+"of duration-quantized notes in the notation editor?<br><br>\n"
+"Use <b>Settings -> Show Raw Note Ruler</b> to turn on this handy\n"
+"feature.<br><br>\n"
+"<i>Note that this feature does not work in page layout view.</i></p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:192
+msgid ""
+"<p>...that you can add tempo and time-signature changes by double-clicking "
+"on the values displayed in the transport window or tempo rulers?</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:197
+msgid ""
+"<p>...that the transport window can display musical time, sample frame "
+"count, and a visual metronome as well as real time?<br><br>Just click on the "
+"small button at the extreme top left of the window.</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:202
+msgid ""
+"<p>...that you can select all notes of a particular pitch in the matrix "
+"view, by shift-clicking on that pitch on the piano keyboard at the left?"
+"<br><br>If you shift-click-drag, you can select whole ranges too.</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:207
+msgid ""
+"<p>...that you can set a loop in the main window by clicking-and-dragging on "
+"the time ruler with Shift pressed?<br><br>(If the ruler isn't visible, use "
+"<b>Settings -> Show Rulers</b>.)</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:212
+msgid ""
+"<p>...that if you're editing a section in the matrix or notation view, you "
+"can\n"
+"set that section to loop while you edit it?<br><br>Select it and use "
+"<b>Tools ->\n"
+"Local Cursor -> Set Loop to Selection</b>, then hit Play.</p><br><br>\n"
+"<i>This feature does not work quite as well for compositions that include "
+"sampled\n"
+"audio.</i>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:221
+msgid ""
+"<p>...if you have more than one note or controller event at the same time, "
+"you\n"
+"can use the [ and ] keys to flip the stack of events around on the "
+"controller\n"
+"and velocity rulers in order to bring the item you wish to adjust into\n"
+"focus.</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:229
+msgid ""
+"<p>...that the notation view shows you notes using their display duration, "
+"while the\n"
+"matrix allows you to edit their performance duration?<br><br>\n"
+"<i>Be careful with tied notes in the matrix. It is not apparent that they "
+"are\n"
+"tied, and if you split up a pair of tied notes, subsequent notation views "
+"will\n"
+"be confused and unhappy. This is an old bug that has been on our TODO list\n"
+"for years. Sorry about that, folks. Patches welcome.</i>\n"
+"</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:240
+msgid ""
+"<p>If you're working with a human performance and you need to insert some "
+"new\n"
+"notes, these new notes will sound for their entire written duration. To "
+"blend\n"
+"these new notes into a human performance, select them, then use <b>Adjust -> "
+"Interpret...</b> \n"
+"from the notation view to interpret any marks and massage their "
+"performance\n"
+"durations to something less mechanical.</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:249
+msgid ""
+"<p>...that Rosegarden can export certain things to LilyPond that it cannot "
+"yet\n"
+"display within its own native interface?<br><br>These new directives can be "
+"inserted\n"
+"via the <b>T</b> text insert tool in the notation view.<br><br>\n"
+"Load the example files\n"
+"<b>lilypond-alternative-endings.rg</b> and <b>lilypond-directives.rg</b> for "
+"a\n"
+"demonstration of how to use the new exportable directives.<br><br>\n"
+"Use <b>File -> Preview with\n"
+"LilyPond</b> to see what they look like on the exported page.<br><br>\n"
+"<i>Be sure to turn on\n"
+"<b>Settings -> Show LilyPond Directives</b> and <b>Show Annotations</b> "
+"within\n"
+"the notation view.</i></p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:264
+msgid ""
+"<p>...that Rosegarden has track parameters allowing you to <b>Create "
+"segments with:</b> certain\n"
+"properties by default?<br><br>You can pre-select the clef, transposition, "
+"colour, and specify\n"
+"the highest and lowest playable notes (notes outside this range display in\n"
+"red by default). Then draw a segment with the pencil, or record one, and "
+"any\n"
+"new segments created on this track will take these properties as segment\n"
+"parameters.<br><br>\n"
+"<i>These parameters do not apply to audio tracks.</i></p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:275
+msgid ""
+"<p>...that Rosegarden has a database of preset parameters describing more "
+"than 300\n"
+"musical instruments from the real world, grouped into several convenient\n"
+"categories?<br><br>Each preset contains a clef, transposition, and playable "
+"range\n"
+"suggestions for both amateur and professional players.<br><br>Click the\n"
+"<b>Load</b> button in the new track parameters box to get started! <i>(If "
+"you\n"
+"do not see a <b>Load</b> button, be sure your parameter panel is set for\n"
+"tabbed mode, rather than stacked mode.)</i> <br><br> <i>(Special thanks to "
+"Magnus\n"
+"Johansson for assembling this extraordinary database.)</i></p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:287
+msgid ""
+"<p>...that when exporting to Lilypond, you can merge tracks that have the "
+"same name onto a single staff?<br><br>For example, if there are three voices "
+"in a single part, write each\n"
+"voice as an independent segment/staff, each on a separate track. Give all\n"
+"three tracks the same name, and select <b>[x] Merge tracks that have the "
+"same\n"
+"name</b> from the options dialog that appears when you export to, or "
+"preview\n"
+"with LilyPond.<br><br>\n"
+"<i>The tracks must have a non-default name for this to work.</i></p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:297
+msgid ""
+" \t \n"
+"<p>...that you can use the mouse wheel to scroll up and down, scroll left "
+"and right, and zoom in and out?<br><br>Just roll the wheel to scroll up or "
+"down. Hold Alt as well to scroll left or right, or hold Ctrl to zoom in and "
+"out.</p> \t \n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:303
+msgid ""
+" \t \n"
+"<p>...that you can time-stretch an audio segment -- stretching or squashing "
+"a\n"
+"sample to a different duration without changing its pitch -- just by\n"
+"dragging its right edge with the Ctrl key pressed?</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:311
+msgid ""
+" \t \n"
+"<p>...that you can add audio to your Rosegarden composition just by dragging "
+"an audio file from your file manager and dropping it on the Rosegarden "
+"segment canvas? (Make sure you drop it on an audio track!)<br><br>You can "
+"also drop audio files from Rosegarden's audio file manager window onto the "
+"segment canvas, and from other programs onto the audio file manager.</p>\n"
+msgstr ""
+
+#: ../docs/en/tips.cpp:317
+msgid ""
+" \t \n"
+"<p>...that you can set the tempo to match the duration of an audio segment "
+"if you know it's an exact number of bars or beats long?<br><br>Just select "
+"the audio segment and use <b>Composition -> Tempo and Time Signature -> Set "
+"Tempo to Audio Segment Duration</b>.</p>\n"
+msgstr ""
+
+#: ../data/fonts/mappings/fonts.cpp:1
+msgid "Feta Pixmaps"
+msgstr "Feta 象素图"
+
+#: ../data/fonts/mappings/fonts.cpp:2 ../data/fonts/mappings/fonts.cpp:7
+msgid "GNU Lilypond"
+msgstr "GNU Lilypond"
+
+#: ../data/fonts/mappings/fonts.cpp:3 ../data/fonts/mappings/fonts.cpp:8
+msgid "Copyright (c) 1997--2003 Han-Wen Nienhuys and Jan Nieuwenhuizen"
+msgstr "版权所有 (c) 1997--2003 Han-Wen Nienhuys 和 Jan Nieuwenhuizen"
+
+#: ../data/fonts/mappings/fonts.cpp:4 ../data/fonts/mappings/fonts.cpp:9
+#: ../data/fonts/mappings/fonts.cpp:14 ../data/fonts/mappings/fonts.cpp:19
+#: ../data/fonts/mappings/fonts.cpp:24 ../data/fonts/mappings/fonts.cpp:29
+#: ../data/fonts/mappings/fonts.cpp:34 ../data/fonts/mappings/fonts.cpp:39
+#: ../data/fonts/mappings/fonts.cpp:44 ../data/fonts/mappings/fonts.cpp:49
+#: ../data/fonts/mappings/fonts.cpp:54
+msgid "Chris Cannam"
+msgstr "Chris Cannam"
+
+#: ../data/fonts/mappings/fonts.cpp:5 ../data/fonts/mappings/fonts.cpp:40
+msgid "pixmap"
+msgstr "象素图"
+
+#: ../data/fonts/mappings/fonts.cpp:6
+msgid "Feta"
+msgstr "Feta"
+
+#: ../data/fonts/mappings/fonts.cpp:10 ../data/fonts/mappings/fonts.cpp:15
+#: ../data/fonts/mappings/fonts.cpp:20 ../data/fonts/mappings/fonts.cpp:25
+#: ../data/fonts/mappings/fonts.cpp:30 ../data/fonts/mappings/fonts.cpp:35
+#: ../data/fonts/mappings/fonts.cpp:45 ../data/fonts/mappings/fonts.cpp:50
+#: ../data/fonts/mappings/fonts.cpp:55
+msgid "scalable"
+msgstr "可缩放"
+
+#: ../data/fonts/mappings/fonts.cpp:11
+msgid "Fughetta"
+msgstr "小赋格曲"
+
+#: ../data/fonts/mappings/fonts.cpp:12
+#, fuzzy
+msgid ""
+"Created by Blake Hodgetts; freely redistributable. See http://www.efn.org/"
+"~bch/aboutfonts.html"
+msgstr ""
+"由 Blake Hodgetts 创建;可自由地重新散布。参见:http://www.efh.org/~bch/"
+"aboutfonts.html"
+
+#: ../data/fonts/mappings/fonts.cpp:13
+msgid "Copyright 1995-1999 Blake Hodgetts"
+msgstr "版权所有 1995-1999 Blake Hodgetts"
+
+#: ../data/fonts/mappings/fonts.cpp:16
+msgid "Inkpen"
+msgstr "Inkpen"
+
+#: ../data/fonts/mappings/fonts.cpp:17
+msgid "Inkpen is part of Sibelius, but other fonts may use the same mappings."
+msgstr "Inkpen 是 Sibelius 的一部分,但是其它字体可能使用同样的映射。"
+
+#: ../data/fonts/mappings/fonts.cpp:18 ../data/fonts/mappings/fonts.cpp:28
+msgid "Copyright Sibelius Software Ltd"
+msgstr "版权所有 Sibelius 软件有限公司"
+
+#: ../data/fonts/mappings/fonts.cpp:21
+msgid "Maestro"
+msgstr "Maestro"
+
+#: ../data/fonts/mappings/fonts.cpp:22
+msgid "Maestro is part of Finale, but other fonts use the same mappings."
+msgstr "Maestro 是 Finale 的一部分,但是其它字体使用同样的映射。"
+
+#: ../data/fonts/mappings/fonts.cpp:23 ../data/fonts/mappings/fonts.cpp:33
+msgid "Copyright Coda Inc"
+msgstr "版权所有 Coda 有限公司"
+
+#: ../data/fonts/mappings/fonts.cpp:27
+msgid "Opus is part of Sibelius, but other fonts may use the same mappings."
+msgstr "Opus 是 Sibelius 的一部分,但是其它字体可能使用同样的映射。"
+
+#: ../data/fonts/mappings/fonts.cpp:31
+msgid "Petrucci"
+msgstr "Petrucci"
+
+#: ../data/fonts/mappings/fonts.cpp:32
+msgid "Petrucci is part of Finale, but other fonts use the same mappings."
+msgstr "Petrucci 是 Finale 的一部分,但是其它字体使用同样的映射。"
+
+#: ../data/fonts/mappings/fonts.cpp:36
+msgid "RG21"
+msgstr "RG21"
+
+#: ../data/fonts/mappings/fonts.cpp:37
+msgid "Rosegarden 2.1"
+msgstr "玫瑰园 2.1"
+
+#: ../data/fonts/mappings/fonts.cpp:38
+msgid "Copyright (c) 1994--2001 Chris Cannam"
+msgstr "版权所有 (c) 1994--2001 Chris Cannam"
+
+#: ../data/fonts/mappings/fonts.cpp:41
+msgid "Sonata"
+msgstr "奏鸣曲"
+
+#: ../data/fonts/mappings/fonts.cpp:42
+msgid "Adobe"
+msgstr "Adobe"
+
+#: ../data/fonts/mappings/fonts.cpp:43
+msgid "Copyright Adobe Inc"
+msgstr "版权所有 Adobe 有限公司"
+
+#: ../data/fonts/mappings/fonts.cpp:46
+msgid "Steinberg"
+msgstr "Steinberg"
+
+#: ../data/fonts/mappings/fonts.cpp:47
+msgid "The Steinberg Notation font is part of Cubase."
+msgstr "Steinberg 音符字体是 Cubase 的一部分。"
+
+#: ../data/fonts/mappings/fonts.cpp:48
+msgid "Copyright Steinberg Inc"
+msgstr "版权所有 Steinberg 有限公司"
+
+#: ../data/fonts/mappings/fonts.cpp:51
+msgid "Xinfonia"
+msgstr "Xinfonia"
+
+#: ../data/fonts/mappings/fonts.cpp:52
+msgid "xemo.org"
+msgstr "xemo.org"
+
+#: ../data/fonts/mappings/fonts.cpp:53
+msgid "Copyright 2001-2003 Xemus Software LLC"
+msgstr "版权所有 2001-2003 Xemus Software LLC"
+
+#: ../data/styles/styles.cpp:1
+msgid "Classical"
+msgstr "经典"
+
+#: ../data/styles/styles.cpp:2
+msgid "Cross"
+msgstr "十字"
+
+#: ../data/styles/styles.cpp:3
+#, fuzzy
+msgid "Mensural"
+msgstr "常规"
+
+#: ../data/styles/styles.cpp:4
+#, fuzzy
+msgid "Triangle"
+msgstr "三连音"
+
+#, fuzzy
+#~ msgid "Set Quick Marker"
+#~ msgstr "删除库"
+
+#, fuzzy
+#~ msgid "LilyPond previews not available"
+#~ msgstr "Lilypond 导出选项"
+
+#, fuzzy
+#~ msgid "Audio file importer not available"
+#~ msgstr "<无法获得采样率>"
+
+#~ msgid " Triplet Chord"
+#~ msgstr " 三连音和弦"
+
+#~ msgid " Chord"
+#~ msgstr " 和弦"
+
+#~ msgid " Triplet"
+#~ msgstr " 三连音"
+
+#~ msgid "Making grace notes..."
+#~ msgstr "正在制作美化音符..."
+
+#~ msgid "Making non-grace notes..."
+#~ msgstr "正在制作非美化音符..."
+
+#, fuzzy
+#~ msgid "Time Signature font"
+#~ msgstr "时间标记"
+
+#, fuzzy
+#~ msgid "&Double Speed"
+#~ msgstr "双重锐化"
+
+#, fuzzy
+#~ msgid "Halving speed..."
+#~ msgstr "正在保存文件..."
+
+#, fuzzy
+#~ msgid "Doubling speed..."
+#~ msgstr "正在删除选择区..."
+
+#~ msgid "Make subsequent bar lines hidden"
+#~ msgstr "隐藏随后的进程条行"
+
+#~ msgid "Make &Grace Notes"
+#~ msgstr "制作装饰音音符(&G)"
+
+#, fuzzy
+#~ msgid "Change Te&mpo..."
+#~ msgstr "改为 %1 谱号(&F)..."
+
+#, fuzzy
+#~ msgid "&Restore Computed Accidentals"
+#~ msgstr "恢复计算好的符干(&R)"
+
+#, fuzzy
+#~ msgid "LilyPond export/preview options"
+#~ msgstr "Lilypond 导出选项"
+
+#, fuzzy
+#~ msgid "LilyPond 2.6"
+#~ msgstr "Lilypond 2.2"
+
+#, fuzzy
+#~ msgid "LilyPond 2.8"
+#~ msgstr "Lilypond 2.2"
+
+#, fuzzy
+#~ msgid "LilyPond 2.12"
+#~ msgstr "Lilypond 2.2"
+
+#~ msgid "Export Document Properties as \\header block"
+#~ msgstr "导出文档属性作为 \\头部数据块"
+
+#, fuzzy
+#~ msgid "prime"
+#~ msgstr "时间"
+
+#, fuzzy
+#~ msgid " and 1 octave"
+#~ msgstr "升高一个八度音"
+
+#, fuzzy
+#~ msgid " and %1 octaves"
+#~ msgstr "%1 升高一个八度音"
+
+#, fuzzy
+#~ msgid "Transpose by Interval"
+#~ msgstr "变调"
+
+#, fuzzy
+#~ msgid "Manage Files Associated with A&udio Segments"
+#~ msgstr "管理音频片段(&U)"
+
+#, fuzzy
+#~ msgid "&Add Multiple Tracks..."
+#~ msgstr "添加轨道(&A)..."
+
+#, fuzzy
+#~ msgid "Split Segments at Time"
+#~ msgstr "设置片段开始时间"
+
+#, fuzzy
+#~ msgid "Split Segment at Time"
+#~ msgstr "设置片段开始时间"
+
+#, fuzzy
+#~ msgid "Add Multiple Tracks"
+#~ msgstr "删除轨道(&D)"
+
+#~ msgid "Event List"
+#~ msgstr "事件列表"
+
+#~ msgid "External Editors"
+#~ msgstr "外部编辑器"
+
+#~ msgid "Enable auto-save"
+#~ msgstr "启用自动保存"
+
+#~ msgid "Auto-save"
+#~ msgstr "自动保存"
+
+#~ msgid "Show detailed status"
+#~ msgstr "显示详细状态"
+
+#~ msgid "JACK command (including path as necessary)"
+#~ msgstr "JACK 命令(包含必要的路径)"
+
+#~ msgid ""
+#~ "Longer buffers usually improve playback quality, but use more memory and "
+#~ "slow response."
+#~ msgstr ""
+#~ "更长时间的缓冲常常可以提高回放质量,但会使用更多内存并且降低响应速度。"
+
+#~ msgid "Event read-ahead"
+#~ msgstr "事件预读"
+
+#~ msgid "Audio mix buffer"
+#~ msgstr "混音缓冲"
+
+#~ msgid "Audio file read buffer"
+#~ msgstr "音频文件读取缓冲"
+
+#~ msgid "Audio file write buffer"
+#~ msgstr "音频文件写入缓冲"
+
+#~ msgid "Per-file limit for cacheable audio files"
+#~ msgstr "可缓存音频文件每文件限制"
+
+#~ msgid "20 msec"
+#~ msgstr "20 毫秒"
+
+#~ msgid "5 sec"
+#~ msgstr "5 秒"
+
+#~ msgid "per file"
+#~ msgstr "每文件"
+
+#~ msgid "32KB"
+#~ msgstr "32KB"
+
+#~ msgid "32MB"
+#~ msgstr "32MB"
+
+#, fuzzy
+#~ msgid "Low latency"
+#~ msgstr "潜伏期"
+
+#, fuzzy
+#~ msgid "Buffered"
+#~ msgstr "缓存"
+
+#~ msgid "Create post-fader outputs for audio instruments"
+#~ msgstr "为音频设备创建衰减后输出"
+
+#~ msgid "Create post-fader outputs for submasters"
+#~ msgstr "为副控制器创建衰减后输出"
+
+#~ msgid "Record and Mix"
+#~ msgstr "录制与混音"
+
+#~ msgid "JACK transport mode"
+#~ msgstr "JACK 播放控制器模式"
+
+#~ msgid "Sync"
+#~ msgstr "同步"
+
+#~ msgid "Synchronisation"
+#~ msgstr "自动同步"
+
+#~ msgid "%1 msec / %2 KB %3"
+#~ msgstr "%1 毫秒 / %2 KB %3"
+
+#~ msgid "%1 msec / %2 MB %3"
+#~ msgstr "%1 毫秒 / %2 MB %3"
+
+#~ msgid "%1 sec / %2 KB %3"
+#~ msgstr "%1 秒 / %2 KB %3"
+
+#~ msgid "%1 sec / %2 MB %3"
+#~ msgstr "%1 秒 / %2 MB %3"
+
+#~ msgid "%1 msec"
+#~ msgstr "%1 毫秒"
+
+#~ msgid "%1 sec"
+#~ msgstr "%1 秒"
+
+#~ msgid "%1 KB"
+#~ msgstr "%1 KB"
+
+#~ msgid "%1 MB"
+#~ msgstr "%1 MB"
+
+#, fuzzy
+#~ msgid "Other fonts"
+#~ msgstr "其它"
+
+#~ msgid ""
+#~ "Rosegarden can apply automatic quantization to recorded or imported MIDI "
+#~ "data for notation purposes only. This does not affect playback, and does "
+#~ "not affect editing in any of the views except notation."
+#~ msgstr ""
+#~ "Rosegarden 可以仅仅为了记号的目的对录制的或导入的 MIDI 数据实行自动量化。"
+#~ "这不影响回放,而且除了记号外不影响任何视图里的编辑。"
+
+#~ msgid "Sequencer"
+#~ msgstr "音序发生器"
+
+#~ msgid "Sequencer Settings"
+#~ msgstr "音序发生器设置"
+
+#, fuzzy
+#~ msgid "Audio auto-fade"
+#~ msgstr "音频输入"
+
+#, fuzzy
+#~ msgid "Range"
+#~ msgstr "三连音"
+
+#, fuzzy
+#~ msgid "High: ---"
+#~ msgstr "高"
+
+#~ msgid " ms"
+#~ msgstr " ms"
+
+#, fuzzy
+#~ msgid "&Fretboard"
+#~ msgstr "快进(&F)"
+
+#, fuzzy
+#~ msgid "Restore &Computed Positions"
+#~ msgstr "恢复计算好的符干(&R)"
+
+#, fuzzy
+#~ msgid "&Tempo and Time Signature"
+#~ msgstr "以事件列表编辑器打开(&E)"
+
+#, fuzzy
+#~ msgid "&Split..."
+#~ msgstr "分割(&R)"
+
+#~ msgid "&Editor Tools"
+#~ msgstr "编辑器工具(&E)"
+
+#, fuzzy
+#~ msgid "&Beams"
+#~ msgstr "节拍"
+
+#, fuzzy
+#~ msgid "&Indications"
+#~ msgstr "指示"
+
+#, fuzzy
+#~ msgid "Trip&lets and Tuplets"
+#~ msgstr "简单连音(&S)"
+
+#~ msgid "S&tem Direction"
+#~ msgstr "符干方向(&T)"
+
+#, fuzzy
+#~ msgid "&Clear"
+#~ msgstr "谱号(音部记号)"
+
+#, fuzzy
+#~ msgid "C&ancel"
+#~ msgstr "通道"
+
+#, fuzzy
+#~ msgid "Toggle &Mode"
+#~ msgstr "全音符"
+
+#, fuzzy
+#~ msgid "Scale"
+#~ msgstr "重定比例"
+
+#, fuzzy
+#~ msgid "Modifier"
+#~ msgstr "修改示标(&M)"
+
+#, fuzzy
+#~ msgid "&New"
+#~ msgstr "新建"
+
+#, fuzzy
+#~ msgid "Fingering"
+#~ msgstr "正在添加连音线..."
+
+#, fuzzy
+#~ msgid "LilyPond 2.4"
+#~ msgstr "Lilypond 2.2"
+
+#~ msgid "Paper size to use in \\paper block"
+#~ msgstr "在 \\纸张数据块 要使用的纸张大小"
+
+#, fuzzy
+#~ msgid "LilyPond font size"
+#~ msgstr "Lilypond 字体大小"
+
+#~ msgid "Do not export muted tracks"
+#~ msgstr "不导出静音轨道"
+
+#, fuzzy
+#~ msgid "Write bar checks at end of measures"
+#~ msgstr "在标尺末端写入进程条校验符"
+
+#, fuzzy
+#~ msgid "Double Speed"
+#~ msgstr "双重锐化"
+
+#~ msgid " (takes effect only from next restart)"
+#~ msgstr " (仅在下次重启后生效)"
+
+#~ msgid "&Select"
+#~ msgstr "选择(&S)"
+
+#~ msgid "Snap to 1/64"
+#~ msgstr "快速切换到 1/64"
+
+#, fuzzy
+#~ msgid "Snap to 1/48"
+#~ msgstr "快速切换到 1/8"
+
+#~ msgid "Snap to 1/32"
+#~ msgstr "快速切换到 1/32"
+
+#, fuzzy
+#~ msgid "Snap to 1/24"
+#~ msgstr "快速切换到 1/4"
+
+#~ msgid "Snap to 1/16"
+#~ msgstr "快速切换到 1/16"
+
+#, fuzzy
+#~ msgid "Snap to 1/12"
+#~ msgstr "快速切换到 1/2"
+
+#~ msgid "Snap to 1/8"
+#~ msgstr "快速切换到 1/8"
+
+#, fuzzy
+#~ msgid "Snap to 1/6"
+#~ msgstr "快速切换到 1/64"
+
+#~ msgid "Snap to 1/4"
+#~ msgstr "快速切换到 1/4"
+
+#~ msgid "Snap to &Unit"
+#~ msgstr "快速切换到小节(&U)"
+
+#, fuzzy
+#~ msgid "%1 (%2.%3s)"
+#~ msgstr "时间:%1"
+
+#, fuzzy
+#~ msgid "%1 (%2): %3"
+#~ msgstr "%1 (以上)"
+
+#~ msgid "Getting sound driver status..."
+#~ msgstr "正在获取声音驱动状态..."
+
+#~ msgid "Distribute Audio on &MIDI"
+#~ msgstr "在 MIDI 上排布音频(&M)"
+
+#~ msgid "Cannot add file %1: %2"
+#~ msgstr "无法添加文件 %1: %2"
+
+#~ msgid "Enable"
+#~ msgstr "启用"
+
+#~ msgid "from:"
+#~ msgstr "从:"
+
+#~ msgid "to:"
+#~ msgstr "到:"
+
+#, fuzzy
+#~ msgid "unlimited"
+#~ msgstr "<未命名>"
+
+#~ msgid "Number:"
+#~ msgstr "数字:"
+
+#, fuzzy
+#~ msgid "Value:"
+#~ msgstr "值"
+
+#, fuzzy
+#~ msgid "Wheel Events"
+#~ msgstr "改变事件大小"
+
+#~ msgid "Amount:"
+#~ msgstr "数量:"
+
+#, fuzzy
+#~ msgid "Pitch from"
+#~ msgstr "音色 "
+
+#, fuzzy
+#~ msgid "Pitch to"
+#~ msgstr "音色 "
+
+#, fuzzy
+#~ msgid "High: %1"
+#~ msgstr "高"
+
+#~ msgid "&Velocity"
+#~ msgstr "力度(&V)"
+
+#~ msgid "Time: %1"
+#~ msgstr "时间:%1"
+
+#, fuzzy
+#~ msgid "Recording Channel:"
+#~ msgstr "正在录音"
+
+#, fuzzy
+#~ msgid "Finnish translation"
+#~ msgstr "自动同步"
+
+#~ msgid "Close this tab"
+#~ msgstr "关闭此标签"
+
+#, fuzzy
+#~ msgid "Preview of the selected font"
+#~ msgstr "这是一个当前选中的音频文件的预览。"
+
+#~ msgid ""
+#~ "This is a preview of the selected font. You can change it by clicking the "
+#~ "\"Choose...\" button."
+#~ msgstr "这是所选择的字体的预览。您可以点击“选择...”按钮来改变它。"
+
+#~ msgid "Preview of the \"%1\" font"
+#~ msgstr "字体“%1”的预览"
+
+#~ msgid ""
+#~ "This is a preview of the \"%1\" font. You can change it by clicking the "
+#~ "\"Choose...\" button."
+#~ msgstr "这是字体“%1”的预览。您可以点击“选择...”按钮来改变它。"
+
+#, fuzzy
+#~ msgid "Segment & Instrument Parameters"
+#~ msgstr "显示设备参数(&I)"
+
+#, fuzzy
+#~ msgid "Pre&view Lilypond file..."
+#~ msgstr "正在导出 Lilypond 文件..."
+
+#, fuzzy
+#~ msgid "Show Se&gment and Instrument Parameters"
+#~ msgstr "显示设备参数(&I)"
+
+#~ msgid "%1 Pitch"
+#~ msgstr "%1 音色"
+
+#~ msgid "&Split or Join"
+#~ msgstr "拆分或合并(&S)"
+
+#~ msgid "Lilypond 1.6 or 1.8"
+#~ msgstr "Lilypond 1.6 或 1.8"
+
+#~ msgid "Lilypond 2.0"
+#~ msgstr "Lilypond 2.0"
+
+#~ msgid "<timing has gone astray>"
+#~ msgstr "<定时出现偏差>"
+
+#~ msgid "You can't yet resize an audio segment!"
+#~ msgstr "您仍然无法调整音频片段的大小!"
+
+#~ msgid "Advanced Event Edit"
+#~ msgstr "高级事件编辑"
+
+#~ msgid "Advanced Event Viewer"
+#~ msgstr "高级事件查看器"
+
+#, fuzzy
+#~ msgid " 1 event selected "
+#~ msgstr " %1 事件%2 被选中"
+
+#, fuzzy
+#~ msgid "%1 - 1 Segment - %2"
+#~ msgstr "音长"
+
+#, fuzzy
+#~ msgid "1 Input"
+#~ msgstr "%1 个输入"
+
+#, fuzzy
+#~ msgid "1 Submaster"
+#~ msgstr "显示标尺(&U)"
+
+#, fuzzy
+#~ msgid "1 pixel"
+#~ msgstr "%1 个像素"
+
+#, fuzzy
+#~ msgid "%1 - Segment - Notation"
+#~ msgstr "音长"
+
+#, fuzzy
+#~ msgid "%1 on 1 track"
+#~ msgstr "%1 位于 %2 条轨道上"
+
+#, fuzzy
+#~ msgid "Set Tempo"
+#~ msgstr "设置全局节拍"
+
+#, fuzzy
+#~ msgid "Modify Tempo"
+#~ msgstr "修改音符"
+
+#, fuzzy
+#~ msgid "is currently"
+#~ msgstr "当前设备"
+
+#, fuzzy
+#~ msgid "PitchRuler"
+#~ msgstr "音色"
+
+#, fuzzy
+#~ msgid "Paste"
+#~ msgstr "控制器"
+
+#, fuzzy
+#~ msgid "&Delete"
+#~ msgstr "删除(&L)"
+
+#, fuzzy
+#~ msgid "Stop"
+#~ msgstr "停止(&S)"
+
+#, fuzzy
+#~ msgid "Copy"
+#~ msgstr "版权所有"
+
+#, fuzzy
+#~ msgid "Default"
+#~ msgstr "默认 "
+
+#, fuzzy
+#~ msgid "Delete All"
+#~ msgstr "全部选择(&A)"
+
+#, fuzzy
+#~ msgid "Add"
+#~ msgstr "添加轨道..."
+
+#, fuzzy
+#~ msgid "No"
+#~ msgstr "音符"
+
+#, fuzzy
+#~ msgid "&Copy"
+#~ msgstr "停止(&S)"
+
+#, fuzzy
+#~ msgid "&Paste"
+#~ msgstr "暂停(&P)"
+
+#, fuzzy
+#~ msgid "About"
+#~ msgstr "数量:"
+
+#, fuzzy
+#~ msgid "Configure"
+#~ msgstr "配置玫瑰园"
+
+#, fuzzy
+#~ msgid "Untitled"
+#~ msgstr "<未命名>"
+
+#, fuzzy
+#~ msgid "Font"
+#~ msgstr " 字体: "
+
+#, fuzzy
+#~ msgid "&View"
+#~ msgstr "时间"
+
+#, fuzzy
+#~ msgid "&Tools"
+#~ msgstr "工具栏(&T)"
+
+#~ msgid "Tracks to add"
+#~ msgstr "欲添加的轨道"
+
+#~ msgid "%1 pixels"
+#~ msgstr "%1 个像素"
+
+#~ msgid "%1 Inputs"
+#~ msgstr "%1 个输入"
+
+#~ msgid "%1 on %2 tracks"
+#~ msgstr "%1 位于 %2 条轨道上"
+
+#~ msgid ""
+#~ "This will unload all audio files and remove their associated segments. "
+#~ "Are you sure?"
+#~ msgstr "这将卸载全部音频文件并删除它们的相关片段。您确定吗?"
+
+#~ msgid ""
+#~ "This will unload all audio files that have no segments used in this "
+#~ "composition. Are you sure?"
+#~ msgstr "这将卸载没有被此作品使用任何片段的全部音频文件。您确定吗?"
+
+#~ msgid "Re&label"
+#~ msgstr "重新标注(&L)"
+
+#~ msgid "Start Value"
+#~ msgstr "起始值"
+
+#~ msgid "End Value"
+#~ msgstr "终止值"
+
+#~ msgid "Audio record level"
+#~ msgstr "录音电平"
+
+#~ msgid "Rec"
+#~ msgstr "录制"
+
+#~ msgid "Segments Canvas - Create and manipulate your segments here"
+#~ msgstr "小节画布 - 这里可以创建和处理您的小节"
+
+#~ msgid "Minutes of audio recording:"
+#~ msgstr "录音的时间(分钟):"
+
+#~ msgid "The Opus font is part of Sibelius."
+#~ msgstr "Opus 字体是 Sibelius 的一部分。"
+
+#~ msgid "Sync, and offer timebase master"
+#~ msgstr "同步,并且提供时基控制"
+
+#~ msgid "Show Tip of the &Day"
+#~ msgstr "显示“日积月累”(&D)"
+
+#~ msgid "MMC transport mode"
+#~ msgstr "MMC 播放控制条模式"
+
+#~ msgid "Audio record path \""
+#~ msgstr "音频录制路径 “"
+
+#~ msgid ""
+#~ "Edit your audio path properties (Edit->Edit Document Properties->Audio)"
+#~ msgstr "编辑您的音频路径属性(编辑->编辑文挡属性->音频)"
+
+#~ msgid "Toggle &All of the Above"
+#~ msgstr "切换上面全部选项(&A)"
+
+#~ msgid "Sending MIDI panic..."
+#~ msgstr "正在发送 MIDI panic..."
+
+#~ msgid "Solo the Track to which this Instrument is attached."
+#~ msgstr "对附上此设备的轨道独奏"
+
+#~ msgid "Mute the Track to which this Instrument is attached."
+#~ msgstr "对附上此设备的轨道静音"
+
+#~ msgid "&Tie Equal-Pitch Notes"
+#~ msgstr "捆绑相同音色的音符(&T)"
+
+#~ msgid "Trans&forms"
+#~ msgstr "变形(&F)"
+
+#~ msgid "&Group"
+#~ msgstr "分组(&G)"
+
+#~ msgid "Can't determine free disk space."
+#~ msgstr "无法侦测剩余磁盘空间。"
+
+#~ msgid "Couldn't extract disk space information."
+#~ msgstr "无法提取磁盘空间信息。"
+
+#~ msgid "Audio File actions"
+#~ msgstr "音频文件行为"
+
+#~ msgid "Remove Audio File"
+#~ msgstr "删除音频文件"
+
+#~ msgid "Play Preview"
+#~ msgstr "播放预览"
+
+#~ msgid "Rename File"
+#~ msgstr "重命名文件"
+
+#~ msgid "Export Audio File"
+#~ msgstr "导出音频文件"
+
+#~ msgid "Add an audio file to this manager dialog."
+#~ msgstr "向此管理器对话框添加一个音频文件。"
+
+#~ msgid "Remove an audio file from this manager dialog."
+#~ msgstr "从此管理器对话框删除一个音频文件。"
+
+#~ msgid "Rename the currently selected audio file."
+#~ msgstr "重命名当前选中的音频文件。"
+
+#, fuzzy
+#~ msgid ""
+#~ "Insert the current audio file in your composition, on the selected audio "
+#~ "track."
+#~ msgstr "在您作品的底部插入当前的音频文件于一个新的音轨里。"
+
+#~ msgid ""
+#~ "Remove all audio files (and any representations of them) from this dialog "
+#~ "and the composition."
+#~ msgstr ""
+#~ "从这个对话框和该作品删除所有的音频文件(以及任何关于它们的表示符号)。"
+
+#~ msgid "Export this audio file."
+#~ msgstr "导出这个音频文件。"
+
+#~ msgid ""
+#~ "You can drag and drop .wav files here to insert them from Konqueror or "
+#~ "other KDE file browsers."
+#~ msgstr ""
+#~ "您可以从 Konqueror 或其他 KDE 文件浏览器拖放 .wav 文件至此以插入它们。"
+
+#~ msgid "Really delete audio file \"%1\" and all associated audio segments ?"
+#~ msgstr "确实要删除音频文件“%1”以及所有相关的音频片段吗?"
+
+#~ msgid "Really remove all audio files and associated segments?"
+#~ msgstr "确实要删除全部音频文件以及相关的小节吗?"
+
+#, fuzzy
+#~ msgid "Can't add File. "
+#~ msgstr "无法下载文件 %1"
+
+#~ msgid "Time change will take effect at the start of bar %1."
+#~ msgstr "时间修改将在进程条 %1 的开头生效。"
+
+#~ msgid "Normalize subsequent rests"
+#~ msgstr "规格化随后的休止符"
+
+#~ msgid "in the middle of bar %1."
+#~ msgstr "位于进程条 %1 的中间。"
+
+#~ msgid " (at %1.%2 s, in bar %3)"
+#~ msgstr " (位于 %1.%2 秒处,属于进程条 %3)"
+
+#~ msgid "Rescale ratio"
+#~ msgstr "缩混比率"
+
+#~ msgid "As percentage: "
+#~ msgstr "百分比为:"
+
+#~ msgid "Directory doesn't exist."
+#~ msgstr "目录不存在。"
+
+#, fuzzy
+#~ msgid "Close Ruler"
+#~ msgstr "关闭当前文件"
+
+#~ msgid "don't show splash screen"
+#~ msgstr "不显示启动画面"
+
+#~ msgid "don't use an external sequencer"
+#~ msgstr "使用外部音序发生器"
+
+#, fuzzy
+#~ msgid "Force Accidentals &Down"
+#~ msgstr "临时记号(&A)"
+
+#~ msgid "Read ahead (in ms)"
+#~ msgstr "预读(ms)"
+
+#~ msgid "Playback (in ms)"
+#~ msgstr "回放(ms)"
+
+#~ msgid ""
+#~ "Send MIDI Controllers at start of playback\n"
+#~ " (will incur noticeable initial delay)"
+#~ msgstr ""
+#~ "在回放开始的时候发送 MIDI 控制器\n"
+#~ " (将招致明显的初始延迟)"
+
+#~ msgid ""
+#~ "Sequencer command line options\n"
+#~ " (takes effect only from next restart)"
+#~ msgstr ""
+#~ "音序发生器命令行选项\n"
+#~ " (仅在下次重启后生效)"
+
+#~ msgid "Number of JACK audio inputs"
+#~ msgstr "JACK 音频输入数量"
+
+#~ msgid "JACK Slave"
+#~ msgstr "JACK 从属"
+
+#~ msgid "JACK Master"
+#~ msgstr "JACK 主控"
+
+#~ msgid "Manage MIDI Devices..."
+#~ msgstr "管理 MIDI 设备..."
+
+#~ msgid "Modify MIDI &Filters..."
+#~ msgstr "调整 MIDI 过滤器(&F)..."
+
+#~ msgid ""
+#~ "*.mid *.midi|Standard MIDI files\n"
+#~ "*|All files"
+#~ msgstr ""
+#~ "*.mid *.midi|标准 MIDI 文件\n"
+#~ "*|全部文件"
+
+#~ msgid "Sequencer exited"
+#~ msgstr "音序发生器退出"
+
+#~ msgid "Audio VU Meter"
+#~ msgstr "音频 VU 指示表"
+
+#, fuzzy
+#~ msgid "Bars:"
+#~ msgstr "进程条"
+
+#, fuzzy
+#~ msgid "Bar:"
+#~ msgstr "进程条"
+
+#, fuzzy
+#~ msgid "Controller value "
+#~ msgstr "控制器"
+
+#, fuzzy
+#~ msgid "Controllers..."
+#~ msgstr "控制器"
+
+#~ msgid "Manage Banks..."
+#~ msgstr "管理库..."
+
+#~ msgid "Merge Banks"
+#~ msgstr "合并库"
+
+#~ msgid "Manage MIDI &Devices..."
+#~ msgstr "管理 MIDI 设备(&D)..."
+
+#~ msgid "Manage MIDI &Banks and Programs..."
+#~ msgstr "管理 MIDI 音色库和指令列"
+
+#, fuzzy
+#~ msgid "Manage Control Parameters..."
+#~ msgstr "小节参数"
+
+#~ msgid "Spa&cing"
+#~ msgstr "间隔(&C)"
+
+#~ msgid "Chorus"
+#~ msgstr "合弦"
+
+#~ msgid "Release"
+#~ msgstr "释放"
+
+#~ msgid "Resonance"
+#~ msgstr "共鸣"
+
+#~ msgid "MIDI Record Device"
+#~ msgstr "MIDI 录制设备"
+
+#~ msgid "<no record devices>"
+#~ msgstr "<没有录制设备>"
+
+#, fuzzy
+#~ msgid "Metronome Bar Velocity"
+#~ msgstr "提高力度(&I)"
+
+#, fuzzy
+#~ msgid "Metronome Beat Velocity"
+#~ msgstr "设定事件力度"
+
+#, fuzzy
+#~ msgid "Modify Metronome settings"
+#~ msgstr "节拍器位于工作环境之外"
+
+#~ msgid "Remove Audio FIle"
+#~ msgstr "删除音频文件"
+
+#~ msgid "Insert into Composition"
+#~ msgstr "插入到作品中"
+
+#~ msgid ""
+#~ "Can't add File. WAV file body invalid.\n"
+#~ "\""
+#~ msgstr ""
+#~ "无法添加文件。波形文件体无效。\n"
+#~ "\""
+
+#, fuzzy
+#~ msgid "Paste a Control Parameter"
+#~ msgstr "乐器参数"
+
+#, fuzzy
+#~ msgid "Red"
+#~ msgstr "重做(&D)"
+
+#, fuzzy
+#~ msgid "Blue"
+#~ msgstr "值"
+
+#, fuzzy
+#~ msgid "Absolute Time:"
+#~ msgstr "绝对时间:"
+
+#~ msgid "Programs 65 - 128"
+#~ msgstr "指令列 65 - 128"
+
+#~ msgid "Import Banks"
+#~ msgstr "导入库"
+
+#~ msgid "Copy Programs"
+#~ msgstr "复制指令列"
+
+#~ msgid "Paste Programs"
+#~ msgstr "粘贴指令列"
+
+#~ msgid "View Event"
+#~ msgstr "查看事件"
+
+#~ msgid "Connection: %1"
+#~ msgstr "连接:%1"
+
+#~ msgid "note-height not found"
+#~ msgstr "未找到音符高度"
+
+#~ msgid "name is a required attribute of symbol"
+#~ msgstr "名称是记号的必需属性"
+
+#~ msgid ""
+#~ "src is a required attribute of symbol (until real font support is "
+#~ "implemented)"
+#~ msgstr "src 是记号的必需属性(直到实现真正的字体支持)"
+
+#~ msgid "name is a required attribute of hotspot"
+#~ msgstr "名称是热点的必需属性"
+
+#~ msgid "when-element must be in hotspot-element"
+#~ msgstr "时间元素必须位于热点元素里"
+
+#~ msgid "note-height is a required attribute of when"
+#~ msgstr "音符高度是时间的必需属性"
+
+#~ msgid "y is a required attribute of when"
+#~ msgstr "y 是时间的必需属性"
+
+#~ msgid "No note font names available, aborting"
+#~ msgstr "没有可用的音符字体名,正在放弃"
+
+#~ msgid "Summary"
+#~ msgstr "摘要"
+
+#~ msgid "Yes, append"
+#~ msgstr "确定,应用"
+
+#~ msgid "No, merge as normal"
+#~ msgstr "取消,正常合并"
+
+#~ msgid "Got grouped event outside of a segment"
+#~ msgstr "在小节外取得分组事件"
+
+#~ msgid "Got group outside of a segment"
+#~ msgstr "在片段外取得分组"
+
+#~ msgid "Found Studio in another section"
+#~ msgstr "工作环境位于另一个区域"
+
+#~ msgid "TimeSignature object found outside Composition"
+#~ msgstr "拍号对象位于作品之外"
+
+#~ msgid "Found Composition in another section"
+#~ msgstr "作品位于另一个区域"
+
+#~ msgid "Track object found outside Composition"
+#~ msgstr "轨道对象位于作品之外"
+
+#~ msgid "Found Segment in another section"
+#~ msgstr "片段位于另一个区域"
+
+#~ msgid "Audio object found outside Audio section"
+#~ msgstr "音频对象位于音频区域之外"
+
+#~ msgid "Audio object has empty parameters"
+#~ msgstr "音频对象具有空参数"
+
+#~ msgid "Audiopath object found outside AudioFiles section"
+#~ msgstr "音频路径对象位于音频文件区域之外"
+
+#~ msgid "Audiopath has no value"
+#~ msgstr "音频路径没有值"
+
+#~ msgid "found audio begin index in non audio segment"
+#~ msgstr "发现音频起始索引位于非音频片段内"
+
+#~ msgid "found audio end index in non audio segment"
+#~ msgstr "发现音频终末索引位于非音频片段内"
+
+#~ msgid "audio end index before audio start marker"
+#~ msgstr "音频终末索引位于音频起始标志之前"
+
+#~ msgid "Found Device outside Studio"
+#~ msgstr "设备位于工作环境之外"
+
+#~ msgid "No ID on Device tag"
+#~ msgstr "设备标签上没有 ID"
+
+#~ msgid "Found unknown Device type"
+#~ msgstr "找到未知设备类型"
+
+#~ msgid "Found Bank outside Studio or Instrument"
+#~ msgstr "库位于工作环境或乐器之外"
+
+#~ msgid "Found Program outside Studio and Instrument"
+#~ msgstr "指令列位于工作环境和乐器之外"
+
+#~ msgid "Found Reverb outside Instrument"
+#~ msgstr "混响位于乐器之外"
+
+#~ msgid "Found Chorus outside Instrument"
+#~ msgstr "和声位于乐器之外"
+
+#~ msgid "Found Filter outside Instrument"
+#~ msgstr "过滤器位于乐器之外"
+
+#~ msgid "Found Resonance outside Instrument"
+#~ msgstr "混响位于乐器之外"
+
+#~ msgid "Found Attack outside Instrument"
+#~ msgstr "冲击位于乐器之外"
+
+#~ msgid "Found Release outside Instrument"
+#~ msgstr "释放位于乐器之外"
+
+#~ msgid "Found Pan outside Instrument"
+#~ msgstr "平移位于乐器之外"
+
+#~ msgid "Found Volume outside Instrument"
+#~ msgstr "音量位于乐器之外"
+
+#~ msgid "Found Plugin outside Instrument"
+#~ msgstr "插件位于乐器之外"
+
+#~ msgid "Can't find Plugin"
+#~ msgstr "无法找到插件"
+
+#~ msgid "Found Port outside Plugin"
+#~ msgstr "端口位于插件之外"
+
+#~ msgid "Found Instrument outside Studio"
+#~ msgstr "乐器位于工作环境之外"
+
+#~ msgid "Found unknown Instrument type"
+#~ msgstr "发现未知的乐器类型"
+
+#~ msgid "Found AudioFiles inside another section"
+#~ msgstr "音频文件位于另一个区域内"
+
+#~ msgid "Found Metadata outside Composition"
+#~ msgstr "元数据位于作品之外"
+
+#~ msgid "Found recordLevel outside Instrument"
+#~ msgstr "录音音量位于乐器之外"
+
+#~ msgid "Found audioInput outside Instrument"
+#~ msgstr "音频输入位于乐器之外"
+
+#~ msgid "Playback failed to contact Rosegarden sequencer"
+#~ msgstr "回放装置与玫瑰园音序发生器通讯失败"
+
+#~ msgid "Failed to start playback"
+#~ msgstr "启动回放装置失败"
+
+#~ msgid "Failed to contact Rosegarden sequencer"
+#~ msgstr "与玫瑰园音序发生器通讯失败"
+
+#~ msgid "Audio subsystem is not available - can't record audio"
+#~ msgstr "音频子系统不可用 - 无法录制音频"
+
+#~ msgid "MIDI and Audio subsystems have failed to initialise"
+#~ msgstr "MIDI 和音频子系统初始化失败"
+
+#~ msgid "MIDI subsystem has failed to initialise"
+#~ msgstr "MIDI 子系统初始化失败"
+
+#~ msgid "<p>No more tips...</p>\n"
+#~ msgstr "<p>技巧就这么多...</p>\n"
diff --git a/rosegarden.lsm b/rosegarden.lsm
new file mode 100644
index 0000000..309e297
--- /dev/null
+++ b/rosegarden.lsm
@@ -0,0 +1,14 @@
+Begin3
+Title: Rosegarden-4
+Version: 1.2.3
+Entered-date:
+Description: MIDI and audio sequencer and musical notation editor
+Keywords: KDE Qt JACK ALSA
+Author: Guillaume Laurent <[email protected]>, Chris Cannam <[email protected]>, Richard Bown <[email protected]>
+Maintained-by: Guillaume Laurent <[email protected]>, Chris Cannam <[email protected]>, Richard Bown <[email protected]>
+Home-page: http://www.rosegardenmusic.com/
+Alternate-site:
+Primary-site:
+Platform: Linux
+Copying-policy: GPL
+End
diff --git a/rosegarden.spec b/rosegarden.spec
new file mode 100644
index 0000000..4bfdccf
--- /dev/null
+++ b/rosegarden.spec
@@ -0,0 +1,209 @@
+%define name rosegarden
+%define version 1.7.0
+%define release
+
+Summary: Midi, audio and notation editor
+Name: %name
+Version: %version
+Release: %release
+URL: http://www.rosegardenmusic.com/
+Source0: %name-1.7.0.tar.bz2
+License: GPL
+Group: Sound
+BuildRequires: qt3-devel
+BuildRequires: kdemultimedia-devel
+BuildRequires: jackit-devel
+BuildRequires: ladspa-devel
+BuildRequires: dssi-devel
+BuildRequires: liblrdf-devel
+BuildRequires: libxml2-utils
+BuildRequires: libfftw3-devel
+
+BuildRoot: %{_tmppath}/%{name}-buildroot
+
+%description
+Rosegarden is an attractive, user-friendly MIDI and audio sequencer,
+notation editor, and general-purpose music composition and editing
+application for Unix and Linux
+
+%prep
+rm -rf $RPM_BUILD_ROOT
+%setup -q -n %{name}-1.7.0
+
+%build
+cmake . -DCMAKE_INSTALL_PREFIX=%{_prefix}
+%make
+
+%install
+rm -rf $RPM_BUILD_ROOT
+%make DESTDIR=$RPM_BUILD_ROOT install
+
+#rm 0 byte fonts----why were they kept Lenny?
+rm -rf `find $RPM_BUILD_ROOT -name accordion*.xpm`
+rm -rf `find $RPM_BUILD_ROOT -name custodes*.xpm`
+
+#menu
+mkdir -p %{buildroot}%{_menudir}
+kdedesktop2mdkmenu.pl %{name} "Multimedia/Sound" $RPM_BUILD_ROOT%{_datadir}/applnk/Applications/rosegarden.desktop $RPM_BUILD_ROOT%{_menudir}/%{name}
+
+%find_lang %name
+
+%post
+%update_menus
+
+%postun
+%clean_menus
+
+%clean
+rm -rf $RPM_BUILD_ROOT
+
+%files -n %name -f %name.lang
+%defattr(-,root,root)
+%defattr(-, root,root)
+%doc AUTHORS COPYING Doxyfile INSTALL README TRANSLATORS
+%{_bindir}/*
+
+%{_datadir}/applnk/Applications/kde/rosegarden.desktop
+%{_datadir}/apps/%name
+%{_datadir}/apps/profiles
+
+%dir %_docdir/HTML/en/%name/
+%doc %_docdir/HTML/en/%name/*
+
+%dir %_docdir/HTML/ja/%name/
+%doc %_docdir/HTML/ja/%name/*.bz2
+%doc %_docdir/HTML/ja/%name/*.docbook
+
+%dir %_docdir/HTML/sv/%name/
+%doc %_docdir/HTML/sv/%name/*.bz2
+%doc %_docdir/HTML/sv/%name/*.docbook
+%doc %_docdir/HTML/sv/%name/*.png
+
+%doc %_docdir/HTML/es/%name/*.bz2
+%doc %_docdir/HTML/es/%name/*.docbook
+
+%{_datadir}/mimelnk/audio/*
+
+%_menudir/*
+
+%{_iconsdir}/hicolor/*/apps/*
+%{_iconsdir}/locolor/*/apps/*
+%{_iconsdir}/hicolor/16x16/mimetypes/x-rosegarden.png
+%{_iconsdir}/hicolor/32x32/mimetypes/x-rosegarden.png
+%{_iconsdir}/locolor/16x16/mimetypes/x-rosegarden.png
+%{_iconsdir}/locolor/32x32/mimetypes/x-rosegarden.png
+
+%changelog
+* Mon Dec 4 2006 Pedro Lopez-Cabanillas <[email protected]> 1.5.0
+- Using CMake
+
+* Mon Sep 25 2006 Pedro Lopez-Cabanillas <[email protected]> 1.4.0-1mdk
+- 1.4.0
+
+* Fri Jul 14 2006 Pedro Lopez-Cabanillas <[email protected]> 1.2.4-1mdk
+- New release
+- Include DSSI support
+- Use the internal scons-mini to avoid broken SCons versions
+
+* Sun Feb 19 2006 Christiaan Welvaart <[email protected]> 1.2.3-1mdk
+- 1.2.3
+- drop patches 1,2,3,4 - don't apply + not needed
+- scons...
+- no shared libraries built, drop lib packages
+
+* Wed Aug 24 2005 Gwenole Beauchesne <[email protected]> 1.0-5mdk
+- harmless 64-bit fixes
+
+* Sat Aug 20 2005 Christiaan Welvaart <[email protected]> 1.0-4mdk
+- patch3: fix build (for gcc 4.0?)
+
+* Mon Jun 13 2005 Pascal Terjan <[email protected]> 1.0-3mdk
+- fix build with gcc4 (patch2)
+
+* Mon Mar 21 2005 Gwenole Beauchesne <[email protected]> 1.0-2mdk
+- fix build on lib64 platforms
+
+* Tue Feb 15 2005 Laurent MONTEL <[email protected]> 1.0-1mdk
+- 1.0
+
+* Mon Dec 20 2004 Laurent MONTEL <[email protected]> 0.9.91-1mdk
+- 0.9.91
+
+* Tue Oct 19 2004 Gwenole Beauchesne <[email protected]> 0.9.9-2mdk
+- -Wmissing-prototypes is only valid for the C front-end
+
+* Tue Aug 17 2004 Pascal Terjan <[email protected]> 0.9.9-1mdk
+- 0.9.9
+- update patch0
+
+* Fri Jul 16 2004 Michael Scherer <[email protected]> 0.9.8-2mdk
+- rebuild for new gcc ( patch 0 )
+
+* Tue May 26 2004 Austin Acton <[email protected]> 0.9.8-1mdk
+- 0.9.8
+
+* Tue Apr 20 2004 Laurent MONTEL <[email protected]> 0.9.7-2mdk
+- Fix menu
+
+* Thu Apr 1 2004 Austin Acton <[email protected]> 0.9.7-1mdk
+- 0.9.7
+
+* Tue Feb 17 2004 Austin Acton <[email protected]> 0.9.6-4mdk
+- rebuild for liblrdf2
+
+* Wed Jan 14 2004 Charles A Edwards <[email protected]> 0.9.6-3mdk
+- put back correct changelog entry for Austin's 0.9.6-1mdk--don't
+ know how I screwed that
+
+* Wed Jan 14 2004 Charles A Edwards <[email protected]> 0.9.6-2mdk
+- use libtoolize /bin/true
+- define iconname
+- build with liblrdf
+- buildrequire liblrdf0-devel and ImageMagick
+- use source xpm to create icons
+- fix rpath for _libdir and _bindir
+- use marcos configure2_5x and makeinstall_std
+- rm 0 byte fonts
+- add docand doc/howtos
+
+* Mon Jan 12 2004 Austin Acton <[email protected]> 0.9.6-1mdk
+- 0.9.6
+- does not require "jack" or libname
+- buildrequires jackit and ladspa libs
+- mklibname
+- lib64 fix buildrequires
+
+* Thu Dec 04 2003 Lenny Cartier <[email protected]> 0.9.5-1mdk
+- 0.9.5
+
+* Thu Jun 5 2003 Austin Acton <[email protected]> 0.9.1-1mdk
+- 0.9.1
+- pretty-up spec
+- tie bin and lib package versions
+
+* Sun May 11 2003 Laurent Culioli <[email protected]> 0.9-1mdk
+- 0.9
+- frop patch0
+
+* Tue May 06 2003 Lenny Cartier <[email protected]> 0.8.5-2mdk
+- buildrequires
+
+* Fri Dec 20 2002 Lenny Cartier <[email protected]> 0.8.5-1mdk
+- add mandrake menu
+- add libraries rpm
+- keep zero length xpm icons...
+- from ccrma package
+
+* Wed Dec 18 2002 Fernando Lopez Lezcano <[email protected]> 0.8.5-1
+- changed name to rosegarden, anaconda does not like the current name
+ (anaconda should be fixed, name is legal)
+- update to 0.8.5
+
+* Sun Nov 10 2002 Fernando Lopez Lezcano <[email protected]> 0.8-2
+- changed name of package to rosegarden-4 (what was I thinking?...)
+- added patch to rename jack alsa ports for jack >= 0.40
+- added explicit dependency to jack
+- added redhat menu entry
+
+* Fri Oct 18 2002 Fernando Lopez Lezcano <[email protected]>
+- Initial build.
diff --git a/rosegarden.spec.in b/rosegarden.spec.in
new file mode 100644
index 0000000..7662015
--- /dev/null
+++ b/rosegarden.spec.in
@@ -0,0 +1,209 @@
+%define name rosegarden
+%define version @VERSION_MAJOR@.@VERSION_MINOR@.@VERSION_PATCH@
+%define release @VERSION_SUFFIX@
+
+Summary: Midi, audio and notation editor
+Name: %name
+Version: %version
+Release: %release
+URL: http://www.rosegardenmusic.com/
+Source0: %name-@[email protected]
+License: GPL
+Group: Sound
+BuildRequires: qt3-devel
+BuildRequires: kdemultimedia-devel
+BuildRequires: jackit-devel
+BuildRequires: ladspa-devel
+BuildRequires: dssi-devel
+BuildRequires: liblrdf-devel
+BuildRequires: libxml2-utils
+BuildRequires: libfftw3-devel
+
+BuildRoot: %{_tmppath}/%{name}-buildroot
+
+%description
+Rosegarden is an attractive, user-friendly MIDI and audio sequencer,
+notation editor, and general-purpose music composition and editing
+application for Unix and Linux
+
+%prep
+rm -rf $RPM_BUILD_ROOT
+%setup -q -n %{name}-@VERSION@
+
+%build
+cmake . -DCMAKE_INSTALL_PREFIX=%{_prefix}
+%make
+
+%install
+rm -rf $RPM_BUILD_ROOT
+%make DESTDIR=$RPM_BUILD_ROOT install
+
+#rm 0 byte fonts----why were they kept Lenny?
+rm -rf `find $RPM_BUILD_ROOT -name accordion*.xpm`
+rm -rf `find $RPM_BUILD_ROOT -name custodes*.xpm`
+
+#menu
+mkdir -p %{buildroot}%{_menudir}
+kdedesktop2mdkmenu.pl %{name} "Multimedia/Sound" $RPM_BUILD_ROOT%{_datadir}/applnk/Applications/rosegarden.desktop $RPM_BUILD_ROOT%{_menudir}/%{name}
+
+%find_lang %name
+
+%post
+%update_menus
+
+%postun
+%clean_menus
+
+%clean
+rm -rf $RPM_BUILD_ROOT
+
+%files -n %name -f %name.lang
+%defattr(-,root,root)
+%defattr(-, root,root)
+%doc AUTHORS COPYING Doxyfile INSTALL README TRANSLATORS
+%{_bindir}/*
+
+%{_datadir}/applnk/Applications/kde/rosegarden.desktop
+%{_datadir}/apps/%name
+%{_datadir}/apps/profiles
+
+%dir %_docdir/HTML/en/%name/
+%doc %_docdir/HTML/en/%name/*
+
+%dir %_docdir/HTML/ja/%name/
+%doc %_docdir/HTML/ja/%name/*.bz2
+%doc %_docdir/HTML/ja/%name/*.docbook
+
+%dir %_docdir/HTML/sv/%name/
+%doc %_docdir/HTML/sv/%name/*.bz2
+%doc %_docdir/HTML/sv/%name/*.docbook
+%doc %_docdir/HTML/sv/%name/*.png
+
+%doc %_docdir/HTML/es/%name/*.bz2
+%doc %_docdir/HTML/es/%name/*.docbook
+
+%{_datadir}/mimelnk/audio/*
+
+%_menudir/*
+
+%{_iconsdir}/hicolor/*/apps/*
+%{_iconsdir}/locolor/*/apps/*
+%{_iconsdir}/hicolor/16x16/mimetypes/x-rosegarden.png
+%{_iconsdir}/hicolor/32x32/mimetypes/x-rosegarden.png
+%{_iconsdir}/locolor/16x16/mimetypes/x-rosegarden.png
+%{_iconsdir}/locolor/32x32/mimetypes/x-rosegarden.png
+
+%changelog
+* Mon Dec 4 2006 Pedro Lopez-Cabanillas <[email protected]> 1.5.0
+- Using CMake
+
+* Mon Sep 25 2006 Pedro Lopez-Cabanillas <[email protected]> 1.4.0-1mdk
+- 1.4.0
+
+* Fri Jul 14 2006 Pedro Lopez-Cabanillas <[email protected]> 1.2.4-1mdk
+- New release
+- Include DSSI support
+- Use the internal scons-mini to avoid broken SCons versions
+
+* Sun Feb 19 2006 Christiaan Welvaart <[email protected]> 1.2.3-1mdk
+- 1.2.3
+- drop patches 1,2,3,4 - don't apply + not needed
+- scons...
+- no shared libraries built, drop lib packages
+
+* Wed Aug 24 2005 Gwenole Beauchesne <[email protected]> 1.0-5mdk
+- harmless 64-bit fixes
+
+* Sat Aug 20 2005 Christiaan Welvaart <[email protected]> 1.0-4mdk
+- patch3: fix build (for gcc 4.0?)
+
+* Mon Jun 13 2005 Pascal Terjan <[email protected]> 1.0-3mdk
+- fix build with gcc4 (patch2)
+
+* Mon Mar 21 2005 Gwenole Beauchesne <[email protected]> 1.0-2mdk
+- fix build on lib64 platforms
+
+* Tue Feb 15 2005 Laurent MONTEL <[email protected]> 1.0-1mdk
+- 1.0
+
+* Mon Dec 20 2004 Laurent MONTEL <[email protected]> 0.9.91-1mdk
+- 0.9.91
+
+* Tue Oct 19 2004 Gwenole Beauchesne <[email protected]> 0.9.9-2mdk
+- -Wmissing-prototypes is only valid for the C front-end
+
+* Tue Aug 17 2004 Pascal Terjan <[email protected]> 0.9.9-1mdk
+- 0.9.9
+- update patch0
+
+* Fri Jul 16 2004 Michael Scherer <[email protected]> 0.9.8-2mdk
+- rebuild for new gcc ( patch 0 )
+
+* Tue May 26 2004 Austin Acton <[email protected]> 0.9.8-1mdk
+- 0.9.8
+
+* Tue Apr 20 2004 Laurent MONTEL <[email protected]> 0.9.7-2mdk
+- Fix menu
+
+* Thu Apr 1 2004 Austin Acton <[email protected]> 0.9.7-1mdk
+- 0.9.7
+
+* Tue Feb 17 2004 Austin Acton <[email protected]> 0.9.6-4mdk
+- rebuild for liblrdf2
+
+* Wed Jan 14 2004 Charles A Edwards <[email protected]> 0.9.6-3mdk
+- put back correct changelog entry for Austin's 0.9.6-1mdk--don't
+ know how I screwed that
+
+* Wed Jan 14 2004 Charles A Edwards <[email protected]> 0.9.6-2mdk
+- use libtoolize /bin/true
+- define iconname
+- build with liblrdf
+- buildrequire liblrdf0-devel and ImageMagick
+- use source xpm to create icons
+- fix rpath for _libdir and _bindir
+- use marcos configure2_5x and makeinstall_std
+- rm 0 byte fonts
+- add docand doc/howtos
+
+* Mon Jan 12 2004 Austin Acton <[email protected]> 0.9.6-1mdk
+- 0.9.6
+- does not require "jack" or libname
+- buildrequires jackit and ladspa libs
+- mklibname
+- lib64 fix buildrequires
+
+* Thu Dec 04 2003 Lenny Cartier <[email protected]> 0.9.5-1mdk
+- 0.9.5
+
+* Thu Jun 5 2003 Austin Acton <[email protected]> 0.9.1-1mdk
+- 0.9.1
+- pretty-up spec
+- tie bin and lib package versions
+
+* Sun May 11 2003 Laurent Culioli <[email protected]> 0.9-1mdk
+- 0.9
+- frop patch0
+
+* Tue May 06 2003 Lenny Cartier <[email protected]> 0.8.5-2mdk
+- buildrequires
+
+* Fri Dec 20 2002 Lenny Cartier <[email protected]> 0.8.5-1mdk
+- add mandrake menu
+- add libraries rpm
+- keep zero length xpm icons...
+- from ccrma package
+
+* Wed Dec 18 2002 Fernando Lopez Lezcano <[email protected]> 0.8.5-1
+- changed name to rosegarden, anaconda does not like the current name
+ (anaconda should be fixed, name is legal)
+- update to 0.8.5
+
+* Sun Nov 10 2002 Fernando Lopez Lezcano <[email protected]> 0.8-2
+- changed name of package to rosegarden-4 (what was I thinking?...)
+- added patch to rename jack alsa ports for jack >= 0.40
+- added explicit dependency to jack
+- added redhat menu entry
+
+* Fri Oct 18 2002 Fernando Lopez Lezcano <[email protected]>
+- Initial build.
diff --git a/src/BaseFileList.txt b/src/BaseFileList.txt
new file mode 100644
index 0000000..f3f7b75
--- /dev/null
+++ b/src/BaseFileList.txt
@@ -0,0 +1,102 @@
+SET(base_SRCS
+ base/AnalysisTypes.cpp
+ base/AnalysisTypes.h
+ base/AudioDevice.cpp
+ base/AudioDevice.h
+ base/AudioLevel.cpp
+ base/AudioLevel.h
+ base/AudioPluginInstance.cpp
+ base/AudioPluginInstance.h
+ base/BaseProperties.cpp
+ base/BaseProperties.h
+ base/BasicQuantizer.cpp
+ base/BasicQuantizer.h
+ base/Clipboard.cpp
+ base/Clipboard.h
+ base/Colour.cpp
+ base/Colour.h
+ base/ColourMap.cpp
+ base/ColourMap.h
+ base/Composition.cpp
+ base/Composition.h
+ base/CompositionTimeSliceAdapter.cpp
+ base/CompositionTimeSliceAdapter.h
+ base/Configuration.cpp
+ base/Configuration.h
+ base/Controllable.h
+ base/ControlParameter.cpp
+ base/ControlParameter.h
+ base/Device.cpp
+ base/Device.h
+ base/Equation.cpp
+ base/Equation.h
+ base/Event.cpp
+ base/Event.h
+ base/Exception.cpp
+ base/Exception.h
+ base/FastVector.h
+ base/Instrument.cpp
+ base/Instrument.h
+ base/LayoutEngine.cpp
+ base/LayoutEngine.h
+ base/LegatoQuantizer.cpp
+ base/LegatoQuantizer.h
+ base/Marker.cpp
+ base/Marker.h
+ base/MidiDevice.cpp
+ base/MidiDevice.h
+ base/MidiProgram.cpp
+ base/MidiProgram.h
+ base/MidiTypes.cpp
+ base/MidiTypes.h
+ base/NotationQuantizer.cpp
+ base/NotationQuantizer.h
+ base/NotationRules.h
+ base/NotationTypes.cpp
+ base/NotationTypes.h
+ base/Profiler.cpp
+ base/Profiler.h
+ base/Property.cpp
+ base/Property.h
+ base/PropertyMap.cpp
+ base/PropertyMap.h
+ base/PropertyName.cpp
+ base/PropertyName.h
+ base/Quantizer.cpp
+ base/Quantizer.h
+ base/RealTime.cpp
+ base/RealTime.h
+ base/RefreshStatus.h
+ base/RulerScale.cpp
+ base/RulerScale.h
+ base/ScriptAPI.cpp
+ base/ScriptAPI.h
+ base/Segment.cpp
+ base/Segment.h
+ base/SegmentMatrixHelper.cpp
+ base/SegmentMatrixHelper.h
+ base/SegmentNotationHelper.cpp
+ base/SegmentNotationHelper.h
+ base/SegmentPerformanceHelper.cpp
+ base/SegmentPerformanceHelper.h
+ base/Selection.cpp
+ base/Selection.h
+ base/Sets.cpp
+ base/Sets.h
+ base/SnapGrid.cpp
+ base/SnapGrid.h
+ base/SoftSynthDevice.cpp
+ base/SoftSynthDevice.h
+ base/Staff.cpp
+ base/Staff.h
+ base/Studio.cpp
+ base/Studio.h
+ base/Track.cpp
+ base/Track.h
+ base/TriggerSegment.cpp
+ base/TriggerSegment.h
+ base/ViewElement.cpp
+ base/ViewElement.h
+ base/XmlExportable.cpp
+ base/XmlExportable.h
+)
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
new file mode 100644
index 0000000..d942e71
--- /dev/null
+++ b/src/CMakeLists.txt
@@ -0,0 +1,208 @@
+IF(NOT ROSEGARDEN_SOURCE_DIR)
+ MESSAGE(FATAL_ERROR "You need to run cmake or ccmake at the root directory")
+ENDIF(NOT ROSEGARDEN_SOURCE_DIR)
+
+IF(USE_PCH)
+ ADD_PRECOMPILED_HEADER(precompiled_headers misc/stableheaders.h)
+ENDIF(USE_PCH)
+
+LINK_DIRECTORIES(
+ ${KDE3_LIB_DIR}
+ ${ALSA_LIB_DIR}
+ ${JACK_LIB_DIR}
+ ${XFT_LIB_DIR}
+ ${LIBLO_LIB_DIR}
+ ${LRDF_LIB_DIR}
+ ${LIRC_LIB_DIR}
+ ${FFTW3F_LIB_DIR}
+)
+
+INCLUDE_DIRECTORIES(AFTER
+ ${QT_INCLUDE_DIR}
+ ${KDE3_INCLUDE_DIR}
+ ${ALSA_INC_DIR}
+ ${JACK_INC_DIR}
+ ${XFT_INC_DIR}
+ ${DSSI_INC_DIR}
+ ${LIBLO_INC_DIR}
+ ${LADSPA_INC_DIR}
+ ${LRDF_INC_DIR}
+ ${LIRC_INC_DIR}
+ ${FFTW3F_INC_DIR}
+ base
+)
+
+SET(CMAKE_INCLUDE_PATH ".")
+
+# Common sources
+INCLUDE(BaseFileList.txt)
+INCLUDE(MiscFileList.txt)
+
+# Sound sources
+INCLUDE(SoundFileList.txt)
+
+KDE3_AUTOMOC(${common_sound_SRCS})
+
+ADD_LIBRARY(RosegardenCommon STATIC
+ ${misc_SRCS}
+ ${base_SRCS}
+ ${common_sound_SRCS}
+)
+
+IF(USE_PCH)
+ ADD_DEPENDENCIES(RosegardenCommon precompiled_headers)
+ENDIF(USE_PCH)
+
+# sequencer executable
+INCLUDE(SequencerFileList.txt)
+
+IF(WANT_SOUND)
+ SET(snd_SRCS ${sound_SRCS})
+ELSE(WANT_SOUND)
+ SET(snd_SRCS ${nosnd_SRCS})
+ENDIF(WANT_SOUND)
+
+KDE3_ADD_DCOP_SKELS(sequencer_SRCS ${seq_dcop_SRCS})
+KDE3_ADD_DCOP_STUBS(sequencer_SRCS ${seq_dcop_SRCS})
+KDE3_AUTOMOC(${sequencer_SRCS})
+
+KDE3_ADD_EXECUTABLE(rosegardensequencer
+ ${snd_SRCS}
+ ${sequencer_SRCS}
+)
+
+IF(USE_PCH)
+ ADD_DEPENDENCIES(rosegardensequencer precompiled_headers)
+ENDIF(USE_PCH)
+
+TARGET_LINK_LIBRARIES(rosegardensequencer
+ ${QT_AND_KDECORE_LIBS}
+ ${ALSA_LIBS}
+ ${JACK_LIBS}
+ ${LIBLO_LIBS}
+ ${LRDF_LIBS}
+ ${FFTW3F_LIBS}
+ kdeui
+ RosegardenCommon
+)
+
+# gui executable
+INCLUDE(GUIFileList.txt)
+
+KDE3_ADD_DCOP_SKELS(gui_SRCS ${gui_dcop_SRCS})
+KDE3_ADD_DCOP_STUBS(gui_SRCS ${gui_dcop_SRCS})
+KDE3_ADD_UI_FILES(gui_SRCS ${ui_SRCS})
+KDE3_AUTOMOC(${gui_SRCS})
+KDE3_AUTOMOC(${segmentcanvas_SRCS})
+KDE3_AUTOMOC(${commands_SRCS})
+KDE3_AUTOMOC(${document_SRCS})
+
+ADD_LIBRARY(RosegardenExtended STATIC
+ ${document_SRCS}
+ ${gui_SRCS}
+)
+
+ADD_LIBRARY(RosegardenCommands STATIC
+ ${commands_SRCS}
+)
+
+IF(USE_PCH)
+ ADD_DEPENDENCIES(RosegardenExtended precompiled_headers)
+ENDIF(USE_PCH)
+
+IF(USE_PCH)
+ ADD_DEPENDENCIES(RosegardenCommands precompiled_headers)
+ENDIF(USE_PCH)
+
+ADD_LIBRARY(RosegardenSegmentCanvas STATIC
+ ${segmentcanvas_SRCS}
+)
+
+IF(USE_PCH)
+ ADD_DEPENDENCIES(RosegardenSegmentCanvas precompiled_headers)
+ENDIF(USE_PCH)
+
+
+
+KDE3_ADD_EXECUTABLE(rosegarden
+ #${commands_SRCS}
+ #${document_SRCS}
+ #${gui_SRCS}
+ #${segmentcanvas_SRCS}
+ gui/application/main.cpp
+)
+
+IF(USE_PCH)
+ ADD_DEPENDENCIES(rosegarden precompiled_headers)
+ENDIF(USE_PCH)
+
+TARGET_LINK_LIBRARIES(rosegarden
+ ${QT_AND_KDECORE_LIBS}
+ ${LIBLO_LIBS}
+ ${LRDF_LIBS}
+ ${FFTW3F_LIBS}
+ ${XFT_LIBS}
+ ${LIRC_LIBS}
+ ${JACK_LIBS}
+ kio
+ kdeui
+ kdeprint
+ RosegardenExtended
+ RosegardenSegmentCanvas
+ RosegardenCommands
+ RosegardenCommon
+)
+
+# Install targets
+INSTALL(TARGETS rosegarden rosegardensequencer
+ RUNTIME DESTINATION ${KDE3EXECDIR} )
+
+# Install helper scripts
+INSTALL(PROGRAMS
+ helpers/rosegarden-lilypondview
+ helpers/rosegarden-project-package
+ helpers/rosegarden-audiofile-importer
+ DESTINATION ${KDE3EXECDIR} )
+
+# Install GUI resource files
+FILE(GLOB RC_FILES gui/ui/*.rc)
+INSTALL(FILES ${RC_FILES}
+ DESTINATION ${KDE3DATADIR}/rosegarden )
+
+IF(WANT_TEST)
+ INCLUDE(TestFileList.txt)
+
+ CREATE_TEST_SOURCELIST(RosegardenTest
+ RosegardenTestDriver.cpp
+ ${tests_SRCS}
+# base/test/transpose.cpp
+# base/test/segmenttransposecommand.cpp
+ )
+
+ KDE3_ADD_EXECUTABLE(RosegardenTestDriver
+ RosegardenTestDriver.cpp
+ ${tests_SRCS}
+ )
+
+ TARGET_LINK_LIBRARIES(RosegardenTestDriver
+ ${QT_AND_KDECORE_LIBS}
+ ${LIBLO_LIBS}
+ ${LRDF_LIBS}
+ ${FFTW3F_LIBS}
+ ${XFT_LIBS}
+ ${LIRC_LIBS}
+ ${JACK_LIBS}
+ kio
+ kdeui
+ kdeprint
+ RosegardenExtended
+ RosegardenSegmentCanvas
+ RosegardenCommands
+ RosegardenCommon
+ )
+ FOREACH(currenttest ${tests_SRCS})
+ GET_FILENAME_COMPONENT(TestName ${currenttest} NAME_WE)
+ ADD_TEST(test/${TestName} RosegardenTestDriver test/${TestName})
+ ENDFOREACH(currenttest ${tests_SRCS})
+ENDIF(WANT_TEST)
+
diff --git a/src/GUIFileList.txt b/src/GUIFileList.txt
new file mode 100644
index 0000000..75403e0
--- /dev/null
+++ b/src/GUIFileList.txt
@@ -0,0 +1,975 @@
+# to rebuild the list:
+# find commands/ document/ gui/ -iname '*.cpp' -or -iname '*.h' > list.txt
+
+SET(gui_dcop_SRCS
+ gui/application/RosegardenIface.h
+ gui/editors/segment/TrackEditorIface.h
+)
+
+SET(ui_SRCS
+ gui/ui/RosegardenTransport.ui
+)
+
+SET(commands_SRCS
+ commands/edit/AddDotCommand.cpp
+ commands/edit/AddDotCommand.h
+ commands/edit/AddMarkerCommand.cpp
+ commands/edit/AddMarkerCommand.h
+ commands/edit/ChangeVelocityCommand.cpp
+ commands/edit/ChangeVelocityCommand.h
+ commands/edit/ClearTriggersCommand.cpp
+ commands/edit/ClearTriggersCommand.h
+ commands/edit/CollapseNotesCommand.cpp
+ commands/edit/CollapseNotesCommand.h
+ commands/edit/CopyCommand.cpp
+ commands/edit/CopyCommand.h
+ commands/edit/CutAndCloseCommand.cpp
+ commands/edit/CutAndCloseCommand.h
+ commands/edit/CutCommand.cpp
+ commands/edit/CutCommand.h
+ commands/edit/EraseCommand.cpp
+ commands/edit/EraseCommand.h
+ commands/edit/EventEditCommand.cpp
+ commands/edit/EventEditCommand.h
+ commands/edit/EventInsertionCommand.cpp
+ commands/edit/EventInsertionCommand.h
+ commands/edit/EventQuantizeCommand.cpp
+ commands/edit/EventQuantizeCommand.h
+ commands/edit/EventUnquantizeCommand.cpp
+ commands/edit/EventUnquantizeCommand.h
+ commands/edit/InsertTriggerNoteCommand.cpp
+ commands/edit/InsertTriggerNoteCommand.h
+ commands/edit/InvertCommand.cpp
+ commands/edit/InvertCommand.h
+ commands/edit/ModifyMarkerCommand.cpp
+ commands/edit/ModifyMarkerCommand.h
+ commands/edit/MoveAcrossSegmentsCommand.cpp
+ commands/edit/MoveAcrossSegmentsCommand.h
+ commands/edit/MoveCommand.cpp
+ commands/edit/MoveCommand.h
+ commands/edit/PasteEventsCommand.cpp
+ commands/edit/PasteEventsCommand.h
+ commands/edit/PasteSegmentsCommand.cpp
+ commands/edit/PasteSegmentsCommand.h
+ commands/edit/RemoveMarkerCommand.cpp
+ commands/edit/RemoveMarkerCommand.h
+ commands/edit/RescaleCommand.cpp
+ commands/edit/RescaleCommand.h
+ commands/edit/RetrogradeCommand.cpp
+ commands/edit/RetrogradeCommand.h
+ commands/edit/RetrogradeInvertCommand.cpp
+ commands/edit/RetrogradeInvertCommand.h
+ commands/edit/SelectionPropertyCommand.cpp
+ commands/edit/SelectionPropertyCommand.h
+ commands/edit/SetLyricsCommand.cpp
+ commands/edit/SetLyricsCommand.h
+ commands/edit/SetNoteTypeCommand.cpp
+ commands/edit/SetNoteTypeCommand.h
+ commands/edit/SetTriggerCommand.cpp
+ commands/edit/SetTriggerCommand.h
+ commands/edit/TransposeCommand.cpp
+ commands/edit/TransposeCommand.h
+ commands/matrix/MatrixEraseCommand.cpp
+ commands/matrix/MatrixEraseCommand.h
+ commands/matrix/MatrixInsertionCommand.cpp
+ commands/matrix/MatrixInsertionCommand.h
+ commands/matrix/MatrixModifyCommand.cpp
+ commands/matrix/MatrixModifyCommand.h
+ commands/matrix/MatrixPercussionInsertionCommand.cpp
+ commands/matrix/MatrixPercussionInsertionCommand.h
+ commands/notation/AddFingeringMarkCommand.cpp
+ commands/notation/AddFingeringMarkCommand.h
+ commands/notation/AddIndicationCommand.cpp
+ commands/notation/AddIndicationCommand.h
+ commands/notation/AddMarkCommand.cpp
+ commands/notation/AddMarkCommand.h
+ commands/notation/AddSlashesCommand.cpp
+ commands/notation/AddSlashesCommand.h
+ commands/notation/AddTextMarkCommand.cpp
+ commands/notation/AddTextMarkCommand.h
+ commands/notation/AutoBeamCommand.cpp
+ commands/notation/AutoBeamCommand.h
+ commands/notation/BeamCommand.cpp
+ commands/notation/BeamCommand.h
+ commands/notation/BreakCommand.cpp
+ commands/notation/BreakCommand.h
+ commands/notation/ChangeSlurPositionCommand.cpp
+ commands/notation/ChangeSlurPositionCommand.h
+ commands/notation/ChangeStemsCommand.cpp
+ commands/notation/ChangeStemsCommand.h
+ commands/notation/ChangeStyleCommand.cpp
+ commands/notation/ChangeStyleCommand.h
+ commands/notation/ChangeTiePositionCommand.cpp
+ commands/notation/ChangeTiePositionCommand.h
+ commands/notation/ClefInsertionCommand.cpp
+ commands/notation/ClefInsertionCommand.h
+ commands/notation/CollapseRestsCommand.cpp
+ commands/notation/CollapseRestsCommand.h
+ commands/notation/DeCounterpointCommand.cpp
+ commands/notation/DeCounterpointCommand.h
+ commands/notation/EraseEventCommand.cpp
+ commands/notation/EraseEventCommand.h
+ commands/notation/FixNotationQuantizeCommand.cpp
+ commands/notation/FixNotationQuantizeCommand.h
+ commands/notation/GuitarChordInsertionCommand.cpp
+ commands/notation/GuitarChordInsertionCommand.h
+ commands/notation/GraceCommand.cpp
+ commands/notation/GraceCommand.h
+ commands/notation/IncrementDisplacementsCommand.cpp
+ commands/notation/IncrementDisplacementsCommand.h
+ commands/notation/InterpretCommand.cpp
+ commands/notation/InterpretCommand.h
+ commands/notation/KeyInsertionCommand.cpp
+ commands/notation/KeyInsertionCommand.h
+ commands/notation/MakeAccidentalsCautionaryCommand.cpp
+ commands/notation/MakeAccidentalsCautionaryCommand.h
+ commands/notation/MakeChordCommand.cpp
+ commands/notation/MakeChordCommand.h
+ commands/notation/MakeNotesViableCommand.cpp
+ commands/notation/MakeNotesViableCommand.h
+ commands/notation/MakeRegionViableCommand.cpp
+ commands/notation/MakeRegionViableCommand.h
+ commands/notation/MultiKeyInsertionCommand.cpp
+ commands/notation/MultiKeyInsertionCommand.h
+ commands/notation/NormalizeRestsCommand.cpp
+ commands/notation/NormalizeRestsCommand.h
+ commands/notation/NoteInsertionCommand.cpp
+ commands/notation/NoteInsertionCommand.h
+ commands/notation/RemoveFingeringMarksCommand.cpp
+ commands/notation/RemoveFingeringMarksCommand.h
+ commands/notation/RemoveMarksCommand.cpp
+ commands/notation/RemoveMarksCommand.h
+ commands/notation/RemoveNotationQuantizeCommand.cpp
+ commands/notation/RemoveNotationQuantizeCommand.h
+ commands/notation/ResetDisplacementsCommand.cpp
+ commands/notation/ResetDisplacementsCommand.h
+ commands/notation/RespellCommand.cpp
+ commands/notation/RespellCommand.h
+ commands/notation/RestInsertionCommand.cpp
+ commands/notation/RestInsertionCommand.h
+ commands/notation/RestoreSlursCommand.cpp
+ commands/notation/RestoreSlursCommand.h
+ commands/notation/RestoreStemsCommand.cpp
+ commands/notation/RestoreStemsCommand.h
+ commands/notation/RestoreTiesCommand.cpp
+ commands/notation/RestoreTiesCommand.h
+ commands/notation/SetVisibilityCommand.cpp
+ commands/notation/SetVisibilityCommand.h
+ commands/notation/SustainInsertionCommand.cpp
+ commands/notation/SustainInsertionCommand.h
+ commands/notation/TextChangeCommand.cpp
+ commands/notation/TextChangeCommand.h
+ commands/notation/TextInsertionCommand.cpp
+ commands/notation/TextInsertionCommand.h
+ commands/notation/TieNotesCommand.cpp
+ commands/notation/TieNotesCommand.h
+ commands/notation/TupletCommand.cpp
+ commands/notation/TupletCommand.h
+ commands/notation/UnGraceCommand.cpp
+ commands/notation/UnGraceCommand.h
+ commands/notation/UntieNotesCommand.cpp
+ commands/notation/UntieNotesCommand.h
+ commands/notation/UnTupletCommand.cpp
+ commands/notation/UnTupletCommand.h
+ commands/segment/AddTempoChangeCommand.cpp
+ commands/segment/AddTempoChangeCommand.h
+ commands/segment/AddTimeSignatureAndNormalizeCommand.cpp
+ commands/segment/AddTimeSignatureAndNormalizeCommand.h
+ commands/segment/AddTimeSignatureCommand.cpp
+ commands/segment/AddTimeSignatureCommand.h
+ commands/segment/AddTracksCommand.cpp
+ commands/segment/AddTracksCommand.h
+ commands/segment/AddTriggerSegmentCommand.cpp
+ commands/segment/AddTriggerSegmentCommand.h
+ commands/segment/AudioSegmentAutoSplitCommand.cpp
+ commands/segment/AudioSegmentAutoSplitCommand.h
+ commands/segment/AudioSegmentDistributeCommand.cpp
+ commands/segment/AudioSegmentDistributeCommand.h
+ commands/segment/AudioSegmentInsertCommand.cpp
+ commands/segment/AudioSegmentInsertCommand.h
+ commands/segment/AudioSegmentResizeFromStartCommand.cpp
+ commands/segment/AudioSegmentResizeFromStartCommand.h
+ commands/segment/AudioSegmentRescaleCommand.cpp
+ commands/segment/AudioSegmentRescaleCommand.h
+ commands/segment/AudioSegmentSplitCommand.cpp
+ commands/segment/AudioSegmentSplitCommand.h
+ commands/segment/ChangeCompositionLengthCommand.cpp
+ commands/segment/ChangeCompositionLengthCommand.h
+ commands/segment/CreateTempoMapFromSegmentCommand.cpp
+ commands/segment/CreateTempoMapFromSegmentCommand.h
+ commands/segment/CutRangeCommand.cpp
+ commands/segment/CutRangeCommand.h
+ commands/segment/DeleteRangeCommand.cpp
+ commands/segment/DeleteRangeCommand.h
+ commands/segment/DeleteTracksCommand.cpp
+ commands/segment/DeleteTracksCommand.h
+ commands/segment/DeleteTriggerSegmentCommand.cpp
+ commands/segment/DeleteTriggerSegmentCommand.h
+ commands/segment/EraseSegmentsStartingInRangeCommand.cpp
+ commands/segment/EraseSegmentsStartingInRangeCommand.h
+ commands/segment/InsertRangeCommand.cpp
+ commands/segment/InsertRangeCommand.h
+ commands/segment/ModifyDefaultTempoCommand.cpp
+ commands/segment/ModifyDefaultTempoCommand.h
+ commands/segment/MoveTracksCommand.cpp
+ commands/segment/MoveTracksCommand.h
+ commands/segment/OpenOrCloseRangeCommand.cpp
+ commands/segment/OpenOrCloseRangeCommand.h
+ commands/segment/PasteConductorDataCommand.cpp
+ commands/segment/PasteConductorDataCommand.h
+ commands/segment/PasteRangeCommand.cpp
+ commands/segment/PasteRangeCommand.h
+ commands/segment/PasteToTriggerSegmentCommand.cpp
+ commands/segment/PasteToTriggerSegmentCommand.h
+ commands/segment/RemoveTempoChangeCommand.cpp
+ commands/segment/RemoveTempoChangeCommand.h
+ commands/segment/RemoveTimeSignatureCommand.cpp
+ commands/segment/RemoveTimeSignatureCommand.h
+ commands/segment/RenameTrackCommand.cpp
+ commands/segment/RenameTrackCommand.h
+ commands/segment/SegmentAutoSplitCommand.cpp
+ commands/segment/SegmentAutoSplitCommand.h
+ commands/segment/SegmentChangePlayableRangeCommand.cpp
+ commands/segment/SegmentChangePlayableRangeCommand.h
+ commands/segment/SegmentChangeTransposeCommand.cpp
+ commands/segment/SegmentChangeTransposeCommand.h
+ commands/segment/SegmentChangeQuantizationCommand.cpp
+ commands/segment/SegmentChangeQuantizationCommand.h
+ commands/segment/SegmentColourCommand.cpp
+ commands/segment/SegmentColourCommand.h
+ commands/segment/SegmentColourMapCommand.cpp
+ commands/segment/SegmentColourMapCommand.h
+ commands/segment/SegmentCommand.cpp
+ commands/segment/SegmentCommand.h
+ commands/segment/SegmentCommandRepeat.cpp
+ commands/segment/SegmentCommandRepeat.h
+ commands/segment/SegmentEraseCommand.cpp
+ commands/segment/SegmentEraseCommand.h
+ commands/segment/SegmentInsertCommand.cpp
+ commands/segment/SegmentInsertCommand.h
+ commands/segment/SegmentJoinCommand.cpp
+ commands/segment/SegmentJoinCommand.h
+ commands/segment/SegmentLabelCommand.cpp
+ commands/segment/SegmentLabelCommand.h
+ commands/segment/SegmentQuickCopyCommand.cpp
+ commands/segment/SegmentQuickCopyCommand.h
+ commands/segment/SegmentReconfigureCommand.cpp
+ commands/segment/SegmentReconfigureCommand.h
+ commands/segment/SegmentRecordCommand.cpp
+ commands/segment/SegmentRecordCommand.h
+ commands/segment/SegmentRepeatToCopyCommand.cpp
+ commands/segment/SegmentRepeatToCopyCommand.h
+ commands/segment/SegmentRescaleCommand.cpp
+ commands/segment/SegmentRescaleCommand.h
+ commands/segment/SegmentResizeFromStartCommand.cpp
+ commands/segment/SegmentResizeFromStartCommand.h
+ commands/segment/SegmentSingleRepeatToCopyCommand.cpp
+ commands/segment/SegmentSingleRepeatToCopyCommand.h
+ commands/segment/SegmentSplitByPitchCommand.cpp
+ commands/segment/SegmentSplitByPitchCommand.h
+ commands/segment/SegmentSplitByRecordingSrcCommand.cpp
+ commands/segment/SegmentSplitByRecordingSrcCommand.h
+ commands/segment/SegmentSplitCommand.cpp
+ commands/segment/SegmentSplitCommand.h
+ commands/segment/SegmentSyncClefCommand.cpp
+ commands/segment/SegmentSyncClefCommand.h
+ commands/segment/SegmentSyncCommand.cpp
+ commands/segment/SegmentSyncCommand.h
+ commands/segment/SegmentTransposeCommand.cpp
+ commands/segment/SegmentTransposeCommand.h
+ commands/segment/SetTriggerSegmentBasePitchCommand.cpp
+ commands/segment/SetTriggerSegmentBasePitchCommand.h
+ commands/segment/SetTriggerSegmentBaseVelocityCommand.cpp
+ commands/segment/SetTriggerSegmentBaseVelocityCommand.h
+ commands/segment/SetTriggerSegmentDefaultRetuneCommand.cpp
+ commands/segment/SetTriggerSegmentDefaultRetuneCommand.h
+ commands/segment/SetTriggerSegmentDefaultTimeAdjustCommand.cpp
+ commands/segment/SetTriggerSegmentDefaultTimeAdjustCommand.h
+ commands/studio/AddControlParameterCommand.cpp
+ commands/studio/AddControlParameterCommand.h
+ commands/studio/CreateOrDeleteDeviceCommand.cpp
+ commands/studio/CreateOrDeleteDeviceCommand.h
+ commands/studio/ModifyControlParameterCommand.cpp
+ commands/studio/ModifyControlParameterCommand.h
+ commands/studio/ModifyDeviceCommand.cpp
+ commands/studio/ModifyDeviceCommand.h
+ commands/studio/ModifyDeviceMappingCommand.cpp
+ commands/studio/ModifyDeviceMappingCommand.h
+ commands/studio/ModifyInstrumentMappingCommand.cpp
+ commands/studio/ModifyInstrumentMappingCommand.h
+ commands/studio/ReconnectDeviceCommand.cpp
+ commands/studio/ReconnectDeviceCommand.h
+ commands/studio/RemoveControlParameterCommand.cpp
+ commands/studio/RemoveControlParameterCommand.h
+ commands/studio/RenameDeviceCommand.cpp
+ commands/studio/RenameDeviceCommand.h
+)
+
+SET(document_SRCS
+ document/BasicCommand.cpp
+ document/BasicCommand.h
+ document/BasicSelectionCommand.cpp
+ document/BasicSelectionCommand.h
+ document/ConfigGroups.cpp
+ document/ConfigGroups.h
+ document/io/CsoundExporter.cpp
+ document/io/CsoundExporter.h
+ document/io/HydrogenLoader.cpp
+ document/io/HydrogenLoader.h
+ document/io/HydrogenXMLHandler.cpp
+ document/io/HydrogenXMLHandler.h
+ document/io/LilyPondExporter.cpp
+ document/io/LilyPondExporter.h
+ document/io/MupExporter.cpp
+ document/io/MupExporter.h
+ document/io/MusicXmlExporter.cpp
+ document/io/MusicXmlExporter.h
+ document/io/RG21Loader.cpp
+ document/io/RG21Loader.h
+ document/MultiViewCommandHistory.cpp
+ document/MultiViewCommandHistory.h
+ document/RosegardenGUIDoc.cpp
+ document/RosegardenGUIDoc.h
+ document/RoseXmlHandler.cpp
+ document/RoseXmlHandler.h
+ document/XmlStorableEvent.cpp
+ document/XmlStorableEvent.h
+ document/XmlSubHandler.cpp
+ document/XmlSubHandler.h
+)
+
+SET(guitar_test_SRCS
+ gui/editors/guitar/test_barre.cpp
+ gui/editors/guitar/test_chordmap.cpp
+ gui/editors/guitar/test_chordname.cpp
+ gui/editors/guitar/test_fingeringconstruct.cpp
+ gui/editors/guitar/test_fingering.cpp
+ gui/editors/guitar/test_guitar.cpp
+ gui/editors/guitar/test_note.cpp
+)
+
+SET(gui_SRCS
+ gui/application/LircClient.cpp
+ gui/application/LircClient.h
+ gui/application/LircCommander.cpp
+ gui/application/LircCommander.h
+ gui/application/RosegardenApplication.cpp
+ gui/application/RosegardenApplication.h
+ gui/application/RosegardenDCOP.h
+ gui/application/RosegardenGUIApp.cpp
+ gui/application/RosegardenGUIApp.h
+ gui/application/RosegardenGUIView.cpp
+ gui/application/RosegardenGUIView.h
+ gui/application/RosegardenIface.cpp
+ gui/application/RosegardenIface.h
+ gui/application/SetWaitCursor.cpp
+ gui/application/SetWaitCursor.h
+ gui/application/StartupTester.cpp
+ gui/application/StartupTester.h
+ gui/configuration/AudioConfigurationPage.cpp
+ gui/configuration/AudioConfigurationPage.h
+ gui/configuration/AudioPropertiesPage.cpp
+ gui/configuration/AudioPropertiesPage.h
+ gui/configuration/ColourConfigurationPage.cpp
+ gui/configuration/ColourConfigurationPage.h
+ gui/configuration/ConfigurationPage.cpp
+ gui/configuration/ConfigurationPage.h
+ gui/configuration/DocumentMetaConfigurationPage.cpp
+ gui/configuration/DocumentMetaConfigurationPage.h
+ gui/configuration/GeneralConfigurationPage.cpp
+ gui/configuration/GeneralConfigurationPage.h
+ gui/configuration/HeadersConfigurationPage.cpp
+ gui/configuration/HeadersConfigurationPage.h
+ gui/configuration/LatencyConfigurationPage.cpp
+ gui/configuration/LatencyConfigurationPage.h
+ gui/configuration/MatrixConfigurationPage.cpp
+ gui/configuration/MatrixConfigurationPage.h
+ gui/configuration/MIDIConfigurationPage.cpp
+ gui/configuration/MIDIConfigurationPage.h
+ gui/configuration/NotationConfigurationPage.cpp
+ gui/configuration/NotationConfigurationPage.h
+ gui/configuration/TabbedConfigurationPage.cpp
+ gui/configuration/TabbedConfigurationPage.h
+ gui/dialogs/AddTracksDialog.cpp
+ gui/dialogs/AddTracksDialog.h
+ gui/dialogs/AudioManagerDialog.cpp
+ gui/dialogs/AudioManagerDialog.h
+ gui/dialogs/AudioPlayingDialog.cpp
+ gui/dialogs/AudioPlayingDialog.h
+ gui/dialogs/AudioPluginDialog.cpp
+ gui/dialogs/AudioPluginDialog.h
+ gui/dialogs/AudioSplitDialog.cpp
+ gui/dialogs/AudioSplitDialog.h
+ gui/dialogs/BeatsBarsDialog.cpp
+ gui/dialogs/BeatsBarsDialog.h
+ gui/dialogs/ClefDialog.cpp
+ gui/dialogs/ClefDialog.h
+ gui/dialogs/CompositionLengthDialog.cpp
+ gui/dialogs/CompositionLengthDialog.h
+ gui/dialogs/ConfigureDialogBase.cpp
+ gui/dialogs/ConfigureDialogBase.h
+ gui/dialogs/ConfigureDialog.cpp
+ gui/dialogs/ConfigureDialog.h
+ gui/dialogs/CountdownBar.cpp
+ gui/dialogs/CountdownBar.h
+ gui/dialogs/CountdownDialog.cpp
+ gui/dialogs/CountdownDialog.h
+ gui/dialogs/DocumentConfigureDialog.cpp
+ gui/dialogs/DocumentConfigureDialog.h
+ gui/dialogs/EventEditDialog.cpp
+ gui/dialogs/EventEditDialog.h
+ gui/dialogs/EventFilterDialog.cpp
+ gui/dialogs/EventFilterDialog.h
+ gui/dialogs/EventParameterDialog.cpp
+ gui/dialogs/EventParameterDialog.h
+ gui/dialogs/ExportDeviceDialog.cpp
+ gui/dialogs/ExportDeviceDialog.h
+ gui/dialogs/FileLocateDialog.cpp
+ gui/dialogs/FileLocateDialog.h
+ gui/dialogs/FileMergeDialog.cpp
+ gui/dialogs/FileMergeDialog.h
+ gui/dialogs/FloatEdit.cpp
+ gui/dialogs/FloatEdit.h
+ gui/dialogs/IdentifyTextCodecDialog.cpp
+ gui/dialogs/IdentifyTextCodecDialog.h
+ gui/dialogs/ImportDeviceDialog.cpp
+ gui/dialogs/ImportDeviceDialog.h
+ gui/dialogs/InterpretDialog.cpp
+ gui/dialogs/InterpretDialog.h
+ gui/dialogs/IntervalDialog.cpp
+ gui/dialogs/IntervalDialog.h
+ gui/dialogs/KeySignatureDialog.cpp
+ gui/dialogs/KeySignatureDialog.h
+ gui/dialogs/LilyPondOptionsDialog.cpp
+ gui/dialogs/LilyPondOptionsDialog.h
+ gui/dialogs/LyricEditDialog.cpp
+ gui/dialogs/LyricEditDialog.h
+ gui/dialogs/MakeOrnamentDialog.cpp
+ gui/dialogs/MakeOrnamentDialog.h
+ gui/dialogs/ManageMetronomeDialog.cpp
+ gui/dialogs/ManageMetronomeDialog.h
+ gui/dialogs/MarkerModifyDialog.cpp
+ gui/dialogs/MarkerModifyDialog.h
+ gui/dialogs/PasteNotationDialog.cpp
+ gui/dialogs/PasteNotationDialog.h
+ gui/dialogs/PitchDialog.cpp
+ gui/dialogs/PitchDialog.h
+ gui/dialogs/PitchPickerDialog.cpp
+ gui/dialogs/PitchPickerDialog.h
+ gui/dialogs/QuantizeDialog.cpp
+ gui/dialogs/QuantizeDialog.h
+ gui/dialogs/RescaleDialog.cpp
+ gui/dialogs/RescaleDialog.h
+ gui/dialogs/ShowSequencerStatusDialog.cpp
+ gui/dialogs/ShowSequencerStatusDialog.h
+ gui/dialogs/SimpleEventEditDialog.cpp
+ gui/dialogs/SimpleEventEditDialog.h
+ gui/dialogs/SplitByPitchDialog.cpp
+ gui/dialogs/SplitByPitchDialog.h
+ gui/dialogs/SplitByRecordingSrcDialog.cpp
+ gui/dialogs/SplitByRecordingSrcDialog.h
+ gui/dialogs/TempoDialog.cpp
+ gui/dialogs/TempoDialog.h
+ gui/dialogs/TextEventDialog.cpp
+ gui/dialogs/TextEventDialog.h
+ gui/dialogs/TimeDialog.cpp
+ gui/dialogs/TimeDialog.h
+ gui/dialogs/TimeSignatureDialog.cpp
+ gui/dialogs/TimeSignatureDialog.h
+ gui/dialogs/TransportDialog.cpp
+ gui/dialogs/TransportDialog.h
+ gui/dialogs/TriggerSegmentDialog.cpp
+ gui/dialogs/TriggerSegmentDialog.h
+ gui/dialogs/TupletDialog.cpp
+ gui/dialogs/TupletDialog.h
+ gui/dialogs/UnusedAudioSelectionDialog.cpp
+ gui/dialogs/UnusedAudioSelectionDialog.h
+ gui/dialogs/UseOrnamentDialog.cpp
+ gui/dialogs/UseOrnamentDialog.h
+ gui/editors/eventlist/EventView.cpp
+ gui/editors/eventlist/EventView.h
+ gui/editors/eventlist/EventViewItem.cpp
+ gui/editors/eventlist/EventViewItem.h
+ gui/editors/eventlist/TrivialVelocityDialog.cpp
+ gui/editors/eventlist/TrivialVelocityDialog.h
+ gui/editors/guitar/NoteSymbols.cpp
+ gui/editors/guitar/NoteSymbols.h
+ gui/editors/guitar/Chord.h
+ gui/editors/guitar/Chord.cpp
+ gui/editors/guitar/Fingering.h
+ gui/editors/guitar/Fingering.cpp
+ gui/editors/guitar/FingeringBox.h
+ gui/editors/guitar/FingeringBox.cpp
+ gui/editors/guitar/FingeringListBoxItem.h
+ gui/editors/guitar/FingeringListBoxItem.cpp
+ gui/editors/guitar/ChordXmlHandler.h
+ gui/editors/guitar/ChordXmlHandler.cpp
+ gui/editors/guitar/ChordMap.h
+ gui/editors/guitar/ChordMap.cpp
+ gui/editors/guitar/GuitarChordSelectorDialog.h
+ gui/editors/guitar/GuitarChordSelectorDialog.cpp
+ gui/editors/guitar/GuitarChordEditorDialog.h
+ gui/editors/guitar/GuitarChordEditorDialog.cpp
+ gui/editors/matrix/MatrixCanvasView.cpp
+ gui/editors/matrix/MatrixCanvasView.h
+ gui/editors/matrix/MatrixElement.cpp
+ gui/editors/matrix/MatrixElement.h
+ gui/editors/matrix/MatrixEraser.cpp
+ gui/editors/matrix/MatrixEraser.h
+ gui/editors/matrix/MatrixHLayout.cpp
+ gui/editors/matrix/MatrixHLayout.h
+ gui/editors/matrix/MatrixMover.cpp
+ gui/editors/matrix/MatrixMover.h
+ gui/editors/matrix/MatrixPainter.cpp
+ gui/editors/matrix/MatrixPainter.h
+ gui/editors/matrix/MatrixParameterBox.cpp
+ gui/editors/matrix/MatrixParameterBox.h
+ gui/editors/matrix/MatrixResizer.cpp
+ gui/editors/matrix/MatrixResizer.h
+ gui/editors/matrix/MatrixSelector.cpp
+ gui/editors/matrix/MatrixSelector.h
+ gui/editors/matrix/MatrixStaff.cpp
+ gui/editors/matrix/MatrixStaff.h
+ gui/editors/matrix/MatrixToolBox.cpp
+ gui/editors/matrix/MatrixToolBox.h
+ gui/editors/matrix/MatrixTool.cpp
+ gui/editors/matrix/MatrixTool.h
+ gui/editors/matrix/MatrixView.cpp
+ gui/editors/matrix/MatrixView.h
+ gui/editors/matrix/MatrixVLayout.cpp
+ gui/editors/matrix/MatrixVLayout.h
+ gui/editors/matrix/PianoKeyboard.cpp
+ gui/editors/matrix/PianoKeyboard.h
+ gui/editors/matrix/QCanvasMatrixDiamond.cpp
+ gui/editors/matrix/QCanvasMatrixDiamond.h
+ gui/editors/matrix/QCanvasMatrixRectangle.cpp
+ gui/editors/matrix/QCanvasMatrixRectangle.h
+ gui/editors/notation/ClefInserter.cpp
+ gui/editors/notation/ClefInserter.h
+ gui/editors/notation/FontViewFrame.cpp
+ gui/editors/notation/FontViewFrame.h
+ gui/editors/notation/GuitarChordInserter.cpp
+ gui/editors/notation/GuitarChordInserter.h
+ gui/editors/notation/NotationCanvasView.cpp
+ gui/editors/notation/NotationCanvasView.h
+ gui/editors/notation/NotationChord.cpp
+ gui/editors/notation/NotationChord.h
+ gui/editors/notation/NotationElement.cpp
+ gui/editors/notation/NotationElement.h
+ gui/editors/notation/NotationEraser.cpp
+ gui/editors/notation/NotationEraser.h
+ gui/editors/notation/NotationGroup.cpp
+ gui/editors/notation/NotationGroup.h
+ gui/editors/notation/NotationHLayout.cpp
+ gui/editors/notation/NotationHLayout.h
+ gui/editors/notation/NotationProperties.cpp
+ gui/editors/notation/NotationProperties.h
+ gui/editors/notation/NotationSelectionPaster.cpp
+ gui/editors/notation/NotationSelectionPaster.h
+ gui/editors/notation/NotationSelector.cpp
+ gui/editors/notation/NotationSelector.h
+ gui/editors/notation/NotationStaff.cpp
+ gui/editors/notation/NotationStaff.h
+ gui/editors/notation/NotationStrings.cpp
+ gui/editors/notation/NotationStrings.h
+ gui/editors/notation/NotationToolBox.cpp
+ gui/editors/notation/NotationToolBox.h
+ gui/editors/notation/NotationTool.cpp
+ gui/editors/notation/NotationTool.h
+ gui/editors/notation/NotationView.cpp
+ gui/editors/notation/NotationView.h
+ gui/editors/notation/NotationVLayout.cpp
+ gui/editors/notation/NotationVLayout.h
+ gui/editors/notation/NoteCharacter.cpp
+ gui/editors/notation/NoteCharacter.h
+ gui/editors/notation/NoteCharacterNames.cpp
+ gui/editors/notation/NoteCharacterNames.h
+ gui/editors/notation/NoteFont.cpp
+ gui/editors/notation/NoteFontFactory.cpp
+ gui/editors/notation/NoteFontFactory.h
+ gui/editors/notation/NoteFont.h
+ gui/editors/notation/NoteFontMap.cpp
+ gui/editors/notation/NoteFontMap.h
+ gui/editors/notation/NoteFontViewer.cpp
+ gui/editors/notation/NoteFontViewer.h
+ gui/editors/notation/NoteInserter.cpp
+ gui/editors/notation/NoteInserter.h
+ gui/editors/notation/NotePixmapFactory.cpp
+ gui/editors/notation/NotePixmapFactory.h
+ gui/editors/notation/NotePixmapPainter.h
+ gui/editors/notation/NotePixmapParameters.cpp
+ gui/editors/notation/NotePixmapParameters.h
+ gui/editors/notation/NoteStyle.cpp
+ gui/editors/notation/NoteStyleFactory.cpp
+ gui/editors/notation/NoteStyleFactory.h
+ gui/editors/notation/NoteStyleFileReader.cpp
+ gui/editors/notation/NoteStyleFileReader.h
+ gui/editors/notation/NoteStyle.h
+ gui/editors/notation/RestInserter.cpp
+ gui/editors/notation/RestInserter.h
+ gui/editors/notation/SystemFont.cpp
+ gui/editors/notation/SystemFont.h
+ gui/editors/notation/SystemFontQt.cpp
+ gui/editors/notation/SystemFontQt.h
+ gui/editors/notation/SystemFontXft.cpp
+ gui/editors/notation/SystemFontXft.h
+ gui/editors/notation/TextInserter.cpp
+ gui/editors/notation/TextInserter.h
+ gui/editors/notation/TrackHeader.cpp
+ gui/editors/notation/TrackHeader.h
+ gui/editors/notation/HeadersGroup.cpp
+ gui/editors/notation/HeadersGroup.h
+ gui/editors/parameters/AudioInstrumentParameterPanel.cpp
+ gui/editors/parameters/AudioInstrumentParameterPanel.h
+ gui/editors/parameters/InstrumentParameterBox.cpp
+ gui/editors/parameters/InstrumentParameterBox.h
+ gui/editors/parameters/InstrumentParameterPanel.cpp
+ gui/editors/parameters/InstrumentParameterPanel.h
+ gui/editors/parameters/MIDIInstrumentParameterPanel.cpp
+ gui/editors/parameters/MIDIInstrumentParameterPanel.h
+ gui/editors/parameters/RosegardenParameterArea.cpp
+ gui/editors/parameters/RosegardenParameterArea.h
+ gui/editors/parameters/RosegardenParameterBox.cpp
+ gui/editors/parameters/RosegardenParameterBox.h
+ gui/editors/parameters/SegmentParameterBox.cpp
+ gui/editors/parameters/SegmentParameterBox.h
+ gui/editors/parameters/TrackParameterBox.cpp
+ gui/editors/parameters/TrackParameterBox.h
+ gui/editors/segment/ControlEditorDialog.cpp
+ gui/editors/segment/ControlEditorDialog.h
+ gui/editors/segment/ControlParameterEditDialog.cpp
+ gui/editors/segment/ControlParameterEditDialog.h
+ gui/editors/segment/ControlParameterItem.cpp
+ gui/editors/segment/ControlParameterItem.h
+ gui/editors/segment/MarkerEditor.cpp
+ gui/editors/segment/MarkerEditor.h
+ gui/editors/segment/MarkerEditorViewItem.cpp
+ gui/editors/segment/MarkerEditorViewItem.h
+ gui/editors/segment/PlayList.cpp
+ gui/editors/segment/PlayListDialog.cpp
+ gui/editors/segment/PlayListDialog.h
+ gui/editors/segment/PlayList.h
+ gui/editors/segment/PlayListView.cpp
+ gui/editors/segment/PlayListView.h
+ gui/editors/segment/PlayListViewItem.cpp
+ gui/editors/segment/PlayListViewItem.h
+ gui/editors/segment/TrackButtons.cpp
+ gui/editors/segment/TrackButtons.h
+ gui/editors/segment/TrackEditor.cpp
+ gui/editors/segment/TrackEditor.h
+ gui/editors/segment/TrackEditorIface.cpp
+ gui/editors/segment/TrackEditorIface.h
+ gui/editors/segment/TrackHeader.cpp
+ gui/editors/segment/TrackHeader.h
+ gui/editors/segment/TrackLabel.cpp
+ gui/editors/segment/TrackLabel.h
+ gui/editors/segment/TrackVUMeter.cpp
+ gui/editors/segment/TrackVUMeter.h
+ gui/editors/segment/TriggerManagerItem.cpp
+ gui/editors/segment/TriggerManagerItem.h
+ gui/editors/segment/TriggerSegmentManager.cpp
+ gui/editors/segment/TriggerSegmentManager.h
+ gui/editors/tempo/TempoListItem.cpp
+ gui/editors/tempo/TempoListItem.h
+ gui/editors/tempo/TempoView.cpp
+ gui/editors/tempo/TempoView.h
+ gui/general/ActiveItem.cpp
+ gui/general/ActiveItem.h
+ gui/general/BarLine.cpp
+ gui/general/BarLine.h
+ gui/general/BaseToolBox.cpp
+ gui/general/BaseToolBox.h
+ gui/general/BaseTool.cpp
+ gui/general/BaseTool.h
+ gui/general/CanvasCursor.cpp
+ gui/general/CanvasCursor.h
+ gui/general/CanvasItemGC.cpp
+ gui/general/CanvasItemGC.h
+ gui/general/CategoryElement.cpp
+ gui/general/CategoryElement.h
+ gui/general/ClefIndex.h
+ gui/general/ClefIndex.cpp
+ gui/general/EditToolBox.cpp
+ gui/general/EditToolBox.h
+ gui/general/EditTool.cpp
+ gui/general/EditTool.h
+ gui/general/EditViewBase.cpp
+ gui/general/EditViewBase.h
+ gui/general/EditView.cpp
+ gui/general/EditView.h
+ gui/general/EditViewTimeSigNotifier.h
+ gui/general/GUIPalette.cpp
+ gui/general/GUIPalette.h
+ gui/general/HZoomable.cpp
+ gui/general/HZoomable.h
+ gui/general/LinedStaff.cpp
+ gui/general/LinedStaff.h
+ gui/general/LinedStaffManager.cpp
+ gui/general/LinedStaffManager.h
+ gui/general/MidiPitchLabel.cpp
+ gui/general/MidiPitchLabel.h
+ gui/general/PixmapFunctions.cpp
+ gui/general/PixmapFunctions.h
+ gui/general/PresetElement.cpp
+ gui/general/PresetElement.h
+ gui/general/PresetGroup.cpp
+ gui/general/PresetGroup.h
+ gui/general/PresetHandlerDialog.cpp
+ gui/general/PresetHandlerDialog.h
+ gui/general/ProgressReporter.cpp
+ gui/general/ProgressReporter.h
+ gui/general/RosegardenCanvasView.cpp
+ gui/general/RosegardenCanvasView.h
+ gui/general/RosegardenScrollView.cpp
+ gui/general/RosegardenScrollView.h
+ gui/general/Spline.cpp
+ gui/general/Spline.h
+ gui/general/StaffLine.cpp
+ gui/general/StaffLine.h
+ gui/kdeext/KLedButton.cpp
+ gui/kdeext/KLedButton.h
+ gui/kdeext/KStartupLogo.cpp
+ gui/kdeext/KStartupLogo.h
+ gui/kdeext/KTmpStatusMsg.cpp
+ gui/kdeext/KTmpStatusMsg.h
+ gui/kdeext/QCanvasGroupableItem.cpp
+ gui/kdeext/QCanvasGroupableItem.h
+ gui/kdeext/QCanvasSimpleSprite.cpp
+ gui/kdeext/QCanvasSimpleSprite.h
+ gui/kdeext/RGLed.cpp
+ gui/kdeext/klearlook.cpp
+ gui/rulers/ChordNameRuler.cpp
+ gui/rulers/ChordNameRuler.h
+ gui/rulers/ControlChangeCommand.cpp
+ gui/rulers/ControlChangeCommand.h
+ gui/rulers/ControlItem.cpp
+ gui/rulers/ControlItem.h
+ gui/rulers/ControllerEventAdapter.cpp
+ gui/rulers/ControllerEventAdapter.h
+ gui/rulers/ControllerEventsRuler.cpp
+ gui/rulers/ControllerEventsRuler.h
+ gui/rulers/ControlRuler.cpp
+ gui/rulers/ControlRulerEventEraseCommand.cpp
+ gui/rulers/ControlRulerEventEraseCommand.h
+ gui/rulers/ControlRulerEventInsertCommand.cpp
+ gui/rulers/ControlRulerEventInsertCommand.h
+ gui/rulers/ControlRuler.h
+ gui/rulers/ControlSelector.cpp
+ gui/rulers/ControlSelector.h
+ gui/rulers/ControlTool.h
+ gui/rulers/DefaultVelocityColour.cpp
+ gui/rulers/DefaultVelocityColour.h
+ gui/rulers/ElementAdapter.h
+ gui/rulers/LoopRuler.cpp
+ gui/rulers/LoopRuler.h
+ gui/rulers/MarkerRuler.cpp
+ gui/rulers/MarkerRuler.h
+ gui/rulers/PercussionPitchRuler.cpp
+ gui/rulers/PercussionPitchRuler.h
+ gui/rulers/PitchRuler.cpp
+ gui/rulers/PitchRuler.h
+ gui/rulers/PropertyBox.cpp
+ gui/rulers/PropertyBox.h
+ gui/rulers/PropertyControlRuler.cpp
+ gui/rulers/PropertyControlRuler.h
+ gui/rulers/PropertyViewRuler.cpp
+ gui/rulers/PropertyViewRuler.h
+ gui/rulers/RawNoteRuler.cpp
+ gui/rulers/RawNoteRuler.h
+ gui/rulers/StandardRuler.cpp
+ gui/rulers/StandardRuler.h
+ gui/rulers/TempoColour.cpp
+ gui/rulers/TempoColour.h
+ gui/rulers/TempoRuler.cpp
+ gui/rulers/TempoRuler.h
+ gui/rulers/TextRuler.cpp
+ gui/rulers/TextRuler.h
+ gui/rulers/VelocityColour.cpp
+ gui/rulers/VelocityColour.h
+ gui/rulers/ViewElementAdapter.cpp
+ gui/rulers/ViewElementAdapter.h
+ gui/seqmanager/AudioSegmentMmapper.cpp
+ gui/seqmanager/AudioSegmentMmapper.h
+ gui/seqmanager/CompositionMmapper.cpp
+ gui/seqmanager/CompositionMmapper.h
+ gui/seqmanager/ControlBlockMmapper.cpp
+ gui/seqmanager/ControlBlockMmapper.h
+ gui/seqmanager/MetronomeMmapper.cpp
+ gui/seqmanager/MetronomeMmapper.h
+ gui/seqmanager/MidiFilterDialog.cpp
+ gui/seqmanager/MidiFilterDialog.h
+ gui/seqmanager/SegmentMmapper.cpp
+ gui/seqmanager/SegmentMmapperFactory.cpp
+ gui/seqmanager/SegmentMmapperFactory.h
+ gui/seqmanager/SegmentMmapper.h
+ gui/seqmanager/SequenceManager.cpp
+ gui/seqmanager/SequenceManager.h
+ gui/seqmanager/SequencerMapper.cpp
+ gui/seqmanager/SequencerMapper.h
+ gui/seqmanager/SpecialSegmentMmapper.cpp
+ gui/seqmanager/SpecialSegmentMmapper.h
+ gui/seqmanager/TempoSegmentMmapper.cpp
+ gui/seqmanager/TempoSegmentMmapper.h
+ gui/seqmanager/TimeSigSegmentMmapper.cpp
+ gui/seqmanager/TimeSigSegmentMmapper.h
+ gui/studio/AudioMixerWindow.cpp
+ gui/studio/AudioMixerWindow.h
+ gui/studio/AudioPluginClipboard.cpp
+ gui/studio/AudioPluginClipboard.h
+ gui/studio/AudioPlugin.cpp
+ gui/studio/AudioPlugin.h
+ gui/studio/AudioPluginManager.cpp
+ gui/studio/AudioPluginManager.h
+ gui/studio/AudioPluginOSCGUI.cpp
+ gui/studio/AudioPluginOSCGUI.h
+ gui/studio/AudioPluginOSCGUIManager.cpp
+ gui/studio/AudioPluginOSCGUIManager.h
+ gui/studio/BankEditorDialog.cpp
+ gui/studio/BankEditorDialog.h
+ gui/studio/ChangeRecordDeviceCommand.cpp
+ gui/studio/ChangeRecordDeviceCommand.h
+ gui/studio/DeviceEditorDialog.cpp
+ gui/studio/DeviceEditorDialog.h
+ gui/studio/DeviceManagerDialog.cpp
+ gui/studio/DeviceManagerDialog.h
+ gui/studio/MidiBankListViewItem.cpp
+ gui/studio/MidiBankListViewItem.h
+ gui/studio/MidiDeviceListViewItem.cpp
+ gui/studio/MidiDeviceListViewItem.h
+ gui/studio/MidiKeyMapListViewItem.cpp
+ gui/studio/MidiKeyMapListViewItem.h
+ gui/studio/MidiKeyMappingEditor.cpp
+ gui/studio/MidiKeyMappingEditor.h
+ gui/studio/MidiMixerVUMeter.cpp
+ gui/studio/MidiMixerVUMeter.h
+ gui/studio/MidiMixerWindow.cpp
+ gui/studio/MidiMixerWindow.h
+ gui/studio/MidiProgramsEditor.cpp
+ gui/studio/MidiProgramsEditor.h
+ gui/studio/MixerWindow.cpp
+ gui/studio/MixerWindow.h
+ gui/studio/NameSetEditor.cpp
+ gui/studio/NameSetEditor.h
+ gui/studio/OSCMessage.cpp
+ gui/studio/OSCMessage.h
+ gui/studio/RemapInstrumentDialog.cpp
+ gui/studio/RemapInstrumentDialog.h
+ gui/studio/StudioControl.cpp
+ gui/studio/StudioControl.h
+ gui/studio/SynthPluginManagerDialog.cpp
+ gui/studio/SynthPluginManagerDialog.h
+ gui/studio/TimerCallbackAssistant.cpp
+ gui/studio/TimerCallbackAssistant.h
+ gui/widgets/AudioFaderBox.cpp
+ gui/widgets/AudioFaderBox.h
+ gui/widgets/AudioListItem.h
+ gui/widgets/AudioListView.cpp
+ gui/widgets/AudioListView.h
+ gui/widgets/AudioRouteMenu.cpp
+ gui/widgets/AudioRouteMenu.h
+ gui/widgets/AudioVUMeter.cpp
+ gui/widgets/AudioVUMeter.h
+ gui/widgets/BigArrowButton.h
+ gui/widgets/CollapsingFrame.cpp
+ gui/widgets/CollapsingFrame.h
+ gui/widgets/ColourTable.cpp
+ gui/widgets/ColourTable.h
+ gui/widgets/ColourTableItem.cpp
+ gui/widgets/ColourTableItem.h
+ gui/widgets/CurrentProgressDialog.cpp
+ gui/widgets/CurrentProgressDialog.h
+ gui/widgets/DiatonicPitchChooser.cpp
+ gui/widgets/DiatonicPitchChooser.h
+ gui/widgets/Fader.cpp
+ gui/widgets/Fader.h
+ gui/widgets/HSpinBox.cpp
+ gui/widgets/HSpinBox.h
+ gui/widgets/Label.cpp
+ gui/widgets/Label.h
+ gui/widgets/MidiFaderWidget.cpp
+ gui/widgets/MidiFaderWidget.h
+ gui/widgets/PitchChooser.cpp
+ gui/widgets/PitchChooser.h
+ gui/widgets/PitchDragLabel.cpp
+ gui/widgets/PitchDragLabel.h
+ gui/widgets/PluginControl.cpp
+ gui/widgets/PluginControl.h
+ gui/widgets/ProgressBar.cpp
+ gui/widgets/ProgressBar.h
+ gui/widgets/ProgressDialog.cpp
+ gui/widgets/ProgressDialog.h
+ gui/widgets/QDeferScrollView.cpp
+ gui/widgets/QDeferScrollView.h
+ gui/widgets/QuantizeParameters.cpp
+ gui/widgets/QuantizeParameters.h
+ gui/widgets/RosegardenPopupMenu.h
+ gui/widgets/Rotary.cpp
+ gui/widgets/Rotary.h
+ gui/widgets/ScrollBox.cpp
+ gui/widgets/ScrollBoxDialog.cpp
+ gui/widgets/ScrollBoxDialog.h
+ gui/widgets/ScrollBox.h
+ gui/widgets/SpinBox.cpp
+ gui/widgets/SpinBox.h
+ gui/widgets/TextFloat.cpp
+ gui/widgets/TextFloat.h
+ gui/widgets/TimeWidget.cpp
+ gui/widgets/TimeWidget.h
+ gui/widgets/TristateCheckBox.cpp
+ gui/widgets/TristateCheckBox.h
+ gui/widgets/VUMeter.cpp
+ gui/widgets/VUMeter.h
+ gui/widgets/WheelyButton.cpp
+ gui/widgets/WheelyButton.h
+ gui/widgets/ZoomSlider.cpp
+ gui/widgets/ZoomSlider.h
+)
+
+SET(segmentcanvas_SRCS
+ gui/editors/segment/segmentcanvas/AudioPreviewPainter.cpp
+ gui/editors/segment/segmentcanvas/AudioPreviewPainter.h
+ gui/editors/segment/segmentcanvas/AudioPreviewThread.cpp
+ gui/editors/segment/segmentcanvas/AudioPreviewThread.h
+ gui/editors/segment/segmentcanvas/AudioPreviewUpdater.cpp
+ gui/editors/segment/segmentcanvas/AudioPreviewUpdater.h
+ gui/editors/segment/segmentcanvas/CompositionColourCache.cpp
+ gui/editors/segment/segmentcanvas/CompositionColourCache.h
+ gui/editors/segment/segmentcanvas/CompositionItem.cpp
+ gui/editors/segment/segmentcanvas/CompositionItem.h
+ gui/editors/segment/segmentcanvas/CompositionItemHelper.cpp
+ gui/editors/segment/segmentcanvas/CompositionItemHelper.h
+ gui/editors/segment/segmentcanvas/CompositionItemImpl.cpp
+ gui/editors/segment/segmentcanvas/CompositionItemImpl.h
+ gui/editors/segment/segmentcanvas/CompositionModel.cpp
+ gui/editors/segment/segmentcanvas/CompositionModel.h
+ gui/editors/segment/segmentcanvas/CompositionModelImpl.cpp
+ gui/editors/segment/segmentcanvas/CompositionModelImpl.h
+ gui/editors/segment/segmentcanvas/CompositionRect.cpp
+ gui/editors/segment/segmentcanvas/CompositionRect.h
+ gui/editors/segment/segmentcanvas/CompositionView.cpp
+ gui/editors/segment/segmentcanvas/CompositionView.h
+ gui/editors/segment/segmentcanvas/PreviewRect.cpp
+ gui/editors/segment/segmentcanvas/PreviewRect.h
+ gui/editors/segment/segmentcanvas/SegmentEraser.cpp
+ gui/editors/segment/segmentcanvas/SegmentEraser.h
+ gui/editors/segment/segmentcanvas/SegmentItemPreview.cpp
+ gui/editors/segment/segmentcanvas/SegmentItemPreview.h
+ gui/editors/segment/segmentcanvas/SegmentJoiner.cpp
+ gui/editors/segment/segmentcanvas/SegmentJoiner.h
+ gui/editors/segment/segmentcanvas/SegmentMover.cpp
+ gui/editors/segment/segmentcanvas/SegmentMover.h
+ gui/editors/segment/segmentcanvas/SegmentOrderer.cpp
+ gui/editors/segment/segmentcanvas/SegmentOrderer.h
+ gui/editors/segment/segmentcanvas/SegmentPencil.cpp
+ gui/editors/segment/segmentcanvas/SegmentPencil.h
+ gui/editors/segment/segmentcanvas/SegmentResizer.cpp
+ gui/editors/segment/segmentcanvas/SegmentResizer.h
+ gui/editors/segment/segmentcanvas/SegmentSelector.cpp
+ gui/editors/segment/segmentcanvas/SegmentSelector.h
+ gui/editors/segment/segmentcanvas/SegmentSplitter.cpp
+ gui/editors/segment/segmentcanvas/SegmentSplitter.h
+ gui/editors/segment/segmentcanvas/SegmentToolBox.cpp
+ gui/editors/segment/segmentcanvas/SegmentToolBox.h
+ gui/editors/segment/segmentcanvas/SegmentTool.cpp
+ gui/editors/segment/segmentcanvas/SegmentTool.h
+)
diff --git a/src/MiscFileList.txt b/src/MiscFileList.txt
new file mode 100644
index 0000000..66e3c82
--- /dev/null
+++ b/src/MiscFileList.txt
@@ -0,0 +1,6 @@
+SET(misc_SRCS
+ misc/Debug.cpp
+ misc/Debug.h
+ misc/Strings.cpp
+ misc/Strings.h
+)
diff --git a/src/SequencerFileList.txt b/src/SequencerFileList.txt
new file mode 100644
index 0000000..bd85f75
--- /dev/null
+++ b/src/SequencerFileList.txt
@@ -0,0 +1,17 @@
+
+SET(sequencer_SRCS
+ sequencer/ControlBlockMmapper.cpp
+ sequencer/ControlBlockMmapper.h
+ sequencer/main.cpp
+ sequencer/MmappedSegment.cpp
+ sequencer/MmappedSegment.h
+ sequencer/RosegardenSequencerApp.cpp
+ sequencer/RosegardenSequencerApp.h
+ sequencer/RosegardenSequencerIface.h
+ sequencer/SequencerMmapper.cpp
+ sequencer/SequencerMmapper.h
+)
+
+SET(seq_dcop_SRCS
+ sequencer/RosegardenSequencerIface.h
+)
diff --git a/src/SoundFileList.txt b/src/SoundFileList.txt
new file mode 100644
index 0000000..762f992
--- /dev/null
+++ b/src/SoundFileList.txt
@@ -0,0 +1,98 @@
+SET(common_sound_SRCS
+ sound/AudioCache.cpp
+ sound/AudioCache.h
+ sound/AudioFile.cpp
+ sound/AudioFile.h
+ sound/AudioFileManager.cpp
+ sound/AudioFileManager.h
+ sound/AudioPlayQueue.cpp
+ sound/AudioPlayQueue.h
+ sound/AudioProcess.cpp
+ sound/AudioProcess.h
+ sound/AudioFileTimeStretcher.cpp
+ sound/AudioFileTimeStretcher.h
+ sound/AudioTimeStretcher.cpp
+ sound/AudioTimeStretcher.h
+ sound/Audit.cpp
+ sound/Audit.h
+ sound/BWFAudioFile.cpp
+ sound/BWFAudioFile.h
+ sound/ControlBlock.cpp
+ sound/ControlBlock.h
+ sound/DSSIPluginFactory.cpp
+ sound/DSSIPluginFactory.h
+ sound/DSSIPluginInstance.cpp
+ sound/DSSIPluginInstance.h
+ sound/ExternalTransport.h
+ sound/LADSPAPluginFactory.cpp
+ sound/LADSPAPluginFactory.h
+ sound/LADSPAPluginInstance.cpp
+ sound/LADSPAPluginInstance.h
+ sound/MappedCommon.h
+ sound/MappedComposition.cpp
+ sound/MappedComposition.h
+ sound/MappedDevice.cpp
+ sound/MappedDevice.h
+ sound/MappedEvent.cpp
+ sound/MappedEvent.h
+ sound/MappedInstrument.cpp
+ sound/MappedInstrument.h
+ sound/MappedRealTime.cpp
+ sound/MappedRealTime.h
+ sound/MappedStudio.cpp
+ sound/MappedStudio.h
+ sound/MidiEvent.cpp
+ sound/MidiEvent.h
+ sound/MidiFile.cpp
+ sound/MidiFile.h
+ sound/Midi.h
+ sound/MP3AudioFile.cpp
+ sound/MP3AudioFile.h
+ sound/PeakFile.cpp
+ sound/PeakFile.h
+ sound/PeakFileManager.cpp
+ sound/PeakFileManager.h
+ sound/PlayableAudioFile.cpp
+ sound/PlayableAudioFile.h
+ sound/PluginFactory.cpp
+ sound/PluginFactory.h
+ sound/PluginIdentifier.cpp
+ sound/PluginIdentifier.h
+ sound/RecordableAudioFile.cpp
+ sound/RecordableAudioFile.h
+ sound/RIFFAudioFile.cpp
+ sound/RIFFAudioFile.h
+ sound/RingBuffer.h
+ sound/RunnablePluginInstance.cpp
+ sound/RunnablePluginInstance.h
+ sound/SampleWindow.h
+ sound/Scavenger.h
+ sound/SequencerDataBlock.cpp
+ sound/SequencerDataBlock.h
+ sound/SF2PatchExtractor.cpp
+ sound/SF2PatchExtractor.h
+ sound/SoundDriver.cpp
+ sound/SoundDriver.h
+ sound/SoundFile.cpp
+ sound/SoundFile.h
+ sound/WAVAudioFile.cpp
+ sound/WAVAudioFile.h
+)
+
+SET(sound_SRCS
+ sound/AlsaDriver.cpp
+ sound/AlsaDriver.h
+ sound/AlsaPort.cpp
+ sound/AlsaPort.h
+ sound/DummyDriver.h
+ sound/JackDriver.cpp
+ sound/JackDriver.h
+ sound/SoundDriverFactory.cpp
+ sound/SoundDriverFactory.h
+)
+
+SET(nosnd_SRCS
+ sound/DummyDriver.h
+ sound/SoundDriverFactory.cpp
+ sound/SoundDriverFactory.h
+)
diff --git a/src/TestFileList.txt b/src/TestFileList.txt
new file mode 100644
index 0000000..470b4cb
--- /dev/null
+++ b/src/TestFileList.txt
@@ -0,0 +1,6 @@
+SET(tests_SRCS
+ test/dummy.cpp
+ test/transpose.cpp
+ test/segmenttransposecommand.cpp
+ test/accidentals.cpp
+)
diff --git a/src/base/AnalysisTypes.cpp b/src/base/AnalysisTypes.cpp
new file mode 100644
index 0000000..b2d8727
--- /dev/null
+++ b/src/base/AnalysisTypes.cpp
@@ -0,0 +1,1118 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ This file is Copyright 2002
+ Randall Farmer <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include <iostream>
+#include <string>
+#include <map>
+#include <algorithm>
+#include <cmath> // fabs, pow
+
+#include "NotationTypes.h"
+#include "AnalysisTypes.h"
+#include "Event.h"
+#include "Segment.h"
+#include "CompositionTimeSliceAdapter.h"
+#include "BaseProperties.h"
+#include "Composition.h"
+#include "Profiler.h"
+
+#include "Sets.h"
+#include "Quantizer.h"
+
+
+namespace Rosegarden
+{
+
+using std::string;
+using std::cerr;
+using std::endl;
+using std::multimap;
+using std::vector;
+using std::partial_sort_copy;
+
+///////////////////////////////////////////////////////////////////////////
+// Miscellany (doesn't analyze anything)
+///////////////////////////////////////////////////////////////////////////
+
+Key
+AnalysisHelper::getKeyForEvent(Event *e, Segment &s)
+{
+ Segment::iterator i =
+ e ? s.findNearestTime(e->getAbsoluteTime()) //cc
+ : s.begin();
+
+ if (i==s.end()) return Key();
+
+ // This is an ugly loop. Is there a better way to iterate backwards
+ // through an STL container?
+
+ while (true) {
+ if ((*i)->isa(Key::EventType)) {
+ return Key(**i);
+ }
+ if (i != s.begin()) --i;
+ else break;
+ }
+
+ return Key();
+}
+
+///////////////////////////////////////////////////////////////////////////
+// Simple chord identification
+///////////////////////////////////////////////////////////////////////////
+
+void
+AnalysisHelper::labelChords(CompositionTimeSliceAdapter &c, Segment &s,
+ const Rosegarden::Quantizer *quantizer)
+{
+
+ Key key;
+ if (c.begin() != c.end()) key = getKeyForEvent(*c.begin(), s);
+ else key = getKeyForEvent(0, s);
+
+ Profiler profiler("AnalysisHelper::labelChords", true);
+
+ for (CompositionTimeSliceAdapter::iterator i = c.begin(); i != c.end(); ++i) {
+
+ timeT time = (*i)->getAbsoluteTime();
+
+// std::cerr << "AnalysisHelper::labelChords: time is " << time << ", type is " << (*i)->getType() << ", event is " << *i << " (itr is " << &i << ")" << std::endl;
+
+ if ((*i)->isa(Key::EventType)) {
+ key = Key(**i);
+ Text text(key.getName(), Text::KeyName);
+ s.insert(text.getAsEvent(time));
+ continue;
+ }
+
+ if ((*i)->isa(Note::EventType)) {
+
+ int bass = 999;
+ int mask = 0;
+
+ GlobalChord chord(c, i, quantizer);
+ if (chord.size() == 0) continue;
+
+ for (GlobalChord::iterator j = chord.begin(); j != chord.end(); ++j) {
+ long pitch = 999;
+ if ((**j)->get<Int>(BaseProperties::PITCH, pitch)) {
+ if (pitch < bass) {
+ assert(bass == 999); // should be in ascending order already
+ bass = pitch;
+ }
+ mask |= 1 << (pitch % 12);
+ }
+ }
+
+ i = chord.getFinalElement();
+
+ if (mask == 0) continue;
+
+ ChordLabel ch(key, mask, bass);
+
+ if (ch.isValid())
+ {
+ //std::cerr << ch.getName(key) << " at time " << time << std::endl;
+
+ Text text(ch.getName(key), Text::ChordName);
+ s.insert(text.getAsEvent(time));
+ }
+ }
+
+ }
+}
+
+
+// ChordLabel
+/////////////////////////////////////////////////
+
+ChordLabel::ChordMap ChordLabel::m_chordMap;
+
+ChordLabel::ChordLabel()
+{
+ checkMap();
+}
+
+ChordLabel::ChordLabel(Key key, int mask, int /* bass */) :
+ m_data()
+{
+ checkMap();
+
+ // Look for a chord built on an unaltered scale step of the current key.
+
+ for (ChordMap::iterator i = m_chordMap.find(mask);
+ i != m_chordMap.end() && i->first==mask; ++i)
+ {
+
+ if (Pitch(i->second.m_rootPitch).isDiatonicInKey(key))
+ {
+ m_data = i->second;
+ }
+
+ }
+
+ /*
+ int rootBassInterval = ((bass - m_data.m_rootPitch + 12) % 12);
+
+ // Pretend nobody cares about second and third inversions
+ // (i.e., bass must always be either root or third of chord)
+ if (rootBassInterval > 7) m_data.m_type=ChordTypes::NoChord;
+ else if (rootBassInterval > 4) m_data.m_type=ChordTypes::NoChord;
+ // Mark first-inversion and root-position chords as such
+ else if (rootBassInterval > 0) m_data.m_inversion=1;
+ else m_data.m_inversion=0;
+ */
+
+}
+
+std::string
+ChordLabel::getName(Key key) const
+{
+ return Pitch(m_data.m_rootPitch).getAsString(key.isSharp(), false) +
+ m_data.m_type;
+ // + (m_data.m_inversion>0 ? " in first inversion" : "");
+}
+
+int
+ChordLabel::rootPitch()
+{
+ return m_data.m_rootPitch;
+}
+
+bool
+ChordLabel::isValid() const
+{
+ return m_data.m_type != ChordTypes::NoChord;
+}
+
+bool
+ChordLabel::operator<(const ChordLabel& other) const
+{
+ if (!isValid()) return true;
+ return getName(Key()) < other.getName(Key());
+}
+
+bool
+ChordLabel::operator==(const ChordLabel& other) const
+{
+ return getName(Key()) == other.getName(Key());
+}
+
+void
+ChordLabel::checkMap()
+{
+ if (!m_chordMap.empty()) return;
+
+ const ChordType basicChordTypes[8] =
+ {ChordTypes::Major, ChordTypes::Minor, ChordTypes::Diminished,
+ ChordTypes::MajorSeventh, ChordTypes::DominantSeventh,
+ ChordTypes::MinorSeventh, ChordTypes::HalfDimSeventh,
+ ChordTypes::DimSeventh};
+
+ // What the basicChordMasks mean: each bit set in each one represents
+ // a pitch class (pitch%12) in a chord. C major has three pitch
+ // classes, C, E, and G natural; if you take the MIDI pitches
+ // of those notes modulo 12, you get 0, 4, and 7, so the mask for
+ // major triads is (1<<0)+(1<<4)+(1<<7). All the masks are for chords
+ // built on C.
+
+ const int basicChordMasks[8] =
+ {
+ 1 + (1<<4) + (1<<7), // major
+ 1 + (1<<3) + (1<<7), // minor
+ 1 + (1<<3) + (1<<6), // diminished
+ 1 + (1<<4) + (1<<7) + (1<<11), // major 7th
+ 1 + (1<<4) + (1<<7) + (1<<10), // dominant 7th
+ 1 + (1<<3) + (1<<7) + (1<<10), // minor 7th
+ 1 + (1<<3) + (1<<6) + (1<<10), // half-diminished 7th
+ 1 + (1<<3) + (1<<6) + (1<<9) // diminished 7th
+ };
+
+ // Each mask is inserted into the map rotated twelve ways; each
+ // rotation is a mask you would get by transposing the chord
+ // to have a new root (i.e., C, C#, D, D#, E, F...)
+
+ for (int i = 0; i < 8; ++i)
+ {
+ for (int j = 0; j < 12; ++j)
+ {
+
+ m_chordMap.insert
+ (
+ std::pair<int, ChordData>
+ (
+ (basicChordMasks[i] << j | basicChordMasks[i] >> (12-j))
+ & ((1<<12) - 1),
+ ChordData(basicChordTypes[i], j)
+ )
+ );
+
+ }
+ }
+
+}
+
+///////////////////////////////////////////////////////////////////////////
+// Harmony guessing
+///////////////////////////////////////////////////////////////////////////
+
+void
+AnalysisHelper::guessHarmonies(CompositionTimeSliceAdapter &c, Segment &s)
+{
+ HarmonyGuessList l;
+
+ // 1. Get the list of possible harmonies
+ makeHarmonyGuessList(c, l);
+
+ // 2. Refine the list of possible harmonies by preferring chords in the
+ // current key and looking for familiar progressions and
+ // tonicizations.
+ refineHarmonyGuessList(c, l, s);
+
+ // 3. Put labels in the Segment. For the moment we just do the
+ // really naive thing with the segment arg to refineHarmonyGuessList:
+ // could do much better here
+}
+
+// #### explain how this works:
+// in terms of other functions (simple chord labelling, key guessing)
+// in terms of basic concepts (pitch profile, harmony guess)
+// in terms of flow
+
+void
+AnalysisHelper::makeHarmonyGuessList(CompositionTimeSliceAdapter &c,
+ HarmonyGuessList &l)
+{
+ if (*c.begin() == *c.end()) return;
+
+ checkHarmonyTable();
+
+ PitchProfile p; // defaults to all zeroes
+ TimeSignature timeSig;
+ timeT timeSigTime = 0;
+ timeT nextSigTime = (*c.begin())->getAbsoluteTime();
+
+ // Walk through the piece labelChords style
+
+ // no increment (the first inner loop does the incrementing)
+ for (CompositionTimeSliceAdapter::iterator i = c.begin(); i != c.end(); )
+ {
+
+ // 2. Update the pitch profile
+
+ timeT time = (*i)->getAbsoluteTime();
+
+ if (time >= nextSigTime) {
+ Composition *comp = c.getComposition();
+ int sigNo = comp->getTimeSignatureNumberAt(time);
+ if (sigNo >= 0) {
+ std::pair<timeT, TimeSignature> sig = comp->getTimeSignatureChange(sigNo);
+ timeSigTime = sig.first;
+ timeSig = sig.second;
+ }
+ if (sigNo < comp->getTimeSignatureCount() - 1) {
+ nextSigTime = comp->getTimeSignatureChange(sigNo + 1).first;
+ } else {
+ nextSigTime = comp->getEndMarker();
+ }
+ }
+
+ double emphasis =
+ double(timeSig.getEmphasisForTime(time - timeSigTime));
+
+ // Scale all the components of the pitch profile down so that
+ // 1. notes that are a beat/bar away have less weight than notes
+ // from this beat/bar
+ // 2. the difference in weight depends on the metrical importance
+ // of the boundary between the notes: the previous beat should
+ // get less weight if this is the first beat of a new bar
+
+ // ### possibly too much fade here
+ // also, fade should happen w/reference to how many notes played?
+
+ PitchProfile delta;
+ int noteCount = 0;
+
+ // no initialization
+ for ( ; i != c.end() && (*i)->getAbsoluteTime() == time; ++i)
+ {
+ if ((*i)->isa(Note::EventType))
+ {
+ try {
+ int pitch = (*i)->get<Int>(BaseProperties::PITCH);
+ delta[pitch % 12] += 1 << int(emphasis);
+ ++noteCount;
+ } catch (...) {
+ std::cerr << "No pitch for note at " << time << "!" << std::endl;
+ }
+ }
+ }
+
+ p *= 1. / (pow(2, emphasis) + 1 + noteCount);
+ p += delta;
+
+ // 1. If there could have been a chord change, compare the current
+ // pitch profile with all of the profiles in the table to figure
+ // out which chords we are now nearest.
+
+ // (If these events weren't on a beat boundary, assume there was no
+ // chord change and continue -- ### will need this back)
+/* if ((!(i != c.end())) ||
+ timeSig.getEmphasisForTime((*i)->getAbsoluteTime() - timeSigTime) < 3)
+ {
+ continue;
+ }*/
+
+ // (If the pitch profile hasn't changed much, continue)
+
+ PitchProfile np = p.normalized();
+
+ HarmonyGuess possibleChords;
+
+ possibleChords.reserve(m_harmonyTable.size());
+
+ for (HarmonyTable::iterator j = m_harmonyTable.begin();
+ j != m_harmonyTable.end();
+ ++j)
+ {
+ double score = np.productScorer(j->first);
+ possibleChords.push_back(ChordPossibility(score, j->second));
+ }
+
+ // 3. Save a short list of the nearest chords in the
+ // HarmonyGuessList passed in from guessHarmonies()
+
+ l.push_back(std::pair<timeT, HarmonyGuess>(time, HarmonyGuess()));
+
+ HarmonyGuess& smallerGuess = l.back().second;
+
+ // Have to learn to love this:
+
+ smallerGuess.resize(10);
+
+ partial_sort_copy(possibleChords.begin(),
+ possibleChords.end(),
+ smallerGuess.begin(),
+ smallerGuess.end(),
+ cp_less());
+
+#ifdef GIVE_HARMONYGUESS_DETAILS
+ std::cerr << "Time: " << time << std::endl;
+
+ std::cerr << "Profile: ";
+ for (int k = 0; k < 12; ++k)
+ std::cerr << np[k] << " ";
+ std::cerr << std::endl;
+
+ std::cerr << "Best guesses: " << std::endl;
+ for (HarmonyGuess::iterator debugi = smallerGuess.begin();
+ debugi != smallerGuess.end();
+ ++debugi)
+ {
+ std::cerr << debugi->first << ": " << debugi->second.getName(Key()) << std::endl;
+ }
+#endif
+
+ }
+
+}
+
+// Comparison function object -- can't declare this in the headers because
+// this only works with pair<double, ChordLabel> instantiated,
+// pair<double, ChordLabel> can't be instantiated while ChordLabel is an
+// incomplete type, and ChordLabel is still an incomplete type at that
+// point in the headers.
+
+bool
+AnalysisHelper::cp_less::operator()(ChordPossibility l, ChordPossibility r)
+{
+ // Change name from "less?"
+ return l.first > r.first;
+}
+
+
+void
+AnalysisHelper::refineHarmonyGuessList(CompositionTimeSliceAdapter &/* c */,
+ HarmonyGuessList &l, Segment &segment)
+{
+ // (Fetch the piece's starting key from the key guesser)
+ Key key;
+
+ checkProgressionMap();
+
+ if (l.size() < 2)
+ {
+ l.clear();
+ return;
+ }
+
+ // Look at the list of harmony guesses two guesses at a time.
+
+ HarmonyGuessList::iterator i = l.begin();
+ // j stays ahead of i
+ HarmonyGuessList::iterator j = i + 1;
+
+ ChordLabel bestGuessForFirstChord, bestGuessForSecondChord;
+ while (j != l.end())
+ {
+
+ double highestScore = 0;
+
+ // For each possible pair of chords (i.e., two for loops here)
+ for (HarmonyGuess::iterator k = i->second.begin();
+ k != i->second.end();
+ ++k)
+ {
+ for (HarmonyGuess::iterator l = j->second.begin();
+ l != j->second.end();
+ ++l)
+ {
+ // Print the guess being processed:
+
+ // std::cerr << k->second.getName(Key()) << "->" << l->second.getName(Key()) << std::endl;
+
+ // For a first approximation, let's say the probability that
+ // a chord guess is correct is proportional to its score. Then
+ // the probability that a pair is correct is the product of
+ // its scores.
+
+ double currentScore;
+ currentScore = k->first * l->first;
+
+ // std::cerr << currentScore << std::endl;
+
+ // Is this a familiar progression? Bonus if so.
+
+ bool isFamiliar = false;
+
+ // #### my ways of breaking up long function calls are haphazard
+ // also, does this code belong here?
+
+ ProgressionMap::iterator pmi =
+ m_progressionMap.lower_bound(
+ ChordProgression(k->second, l->second)
+ );
+
+ // no initialization
+ for ( ;
+ pmi != m_progressionMap.end()
+ && pmi->first == k->second
+ && pmi->second == l->second;
+ ++pmi)
+ {
+ // key doesn't have operator== defined
+ if (key.getName() == pmi->homeKey.getName())
+ {
+// std::cerr << k->second.getName(Key()) << "->" << l->second.getName(Key()) << " is familiar" << std::endl;
+ isFamiliar = true;
+ break;
+ }
+ }
+
+ if (isFamiliar) currentScore *= 5; // #### arbitrary
+
+ // (Are voice-leading rules followed? Penalty if not)
+
+ // Is this better than any pair examined so far? If so, set
+ // some variables that should end up holding the best chord
+ // progression
+ if (currentScore > highestScore)
+ {
+ bestGuessForFirstChord = k->second;
+ bestGuessForSecondChord = l->second;
+ highestScore = currentScore;
+ }
+
+ }
+ }
+
+ // Since we're not returning any results right now, print them
+ std::cerr << "Time: " << j->first << std::endl;
+ std::cerr << "Best chords: "
+ << bestGuessForFirstChord.getName(Key()) << ", "
+ << bestGuessForSecondChord.getName(Key()) << std::endl;
+ std::cerr << "Best score: " << highestScore << std::endl;
+
+ // Using the best pair of chords:
+
+ // Is the first chord diatonic?
+
+ // If not, is it a secondary function?
+ // If so, change the current key
+ // If not, set an "implausible progression" flag
+
+ // (Is the score of the best pair of chords reasonable?
+ // If not, set the flag.)
+
+ // Was the progression plausible?
+
+ // If so, replace the ten or so chords in the first guess with the
+ // first chord of the best pair, set
+ // first-iterator=second-iterator, and ++second-iterator
+ // (and possibly do the real key-setting)
+
+ // If not, h.erase(second-iterator++)
+
+ // Temporary hack to get _something_ interesting out:
+ Event *e;
+ e = Text(bestGuessForFirstChord.getName(Key()), Text::ChordName).
+ getAsEvent(j->first);
+ segment.insert(new Event(*e, e->getAbsoluteTime(),
+ e->getDuration(), e->getSubOrdering()-1));
+ delete e;
+
+ e = Text(bestGuessForSecondChord.getName(Key()), Text::ChordName).
+ getAsEvent(j->first);
+ segment.insert(e);
+
+ // For now, just advance:
+ i = j;
+ ++j;
+ }
+}
+
+AnalysisHelper::HarmonyTable AnalysisHelper::m_harmonyTable;
+
+void
+AnalysisHelper::checkHarmonyTable()
+{
+ if (!m_harmonyTable.empty()) return;
+
+ // Identical to basicChordTypes in ChordLabel::checkMap
+ const ChordType basicChordTypes[8] =
+ {ChordTypes::Major, ChordTypes::Minor, ChordTypes::Diminished,
+ ChordTypes::MajorSeventh, ChordTypes::DominantSeventh,
+ ChordTypes::MinorSeventh, ChordTypes::HalfDimSeventh,
+ ChordTypes::DimSeventh};
+
+ // Like basicChordMasks in ChordLabel::checkMap(), only with
+ // ints instead of bits
+ const int basicChordProfiles[8][12] =
+ {
+ // 0 1 2 3 4 5 6 7 8 9 10 11
+ {1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0}, // major
+ {1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0}, // minor
+ {1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0}, // diminished
+ {1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1}, // major 7th
+ {1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0}, // dominant 7th
+ {1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0}, // minor 7th
+ {1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0}, // half-diminished 7th
+ {1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0} // diminished 7th
+ };
+
+ for (int i = 0; i < 8; ++i)
+ {
+ for (int j = 0; j < 12; ++j)
+ {
+ PitchProfile p;
+
+ for (int k = 0; k < 12; ++k)
+ p[(j + k) % 12] = (basicChordProfiles[i][k] == 1)
+ ? 1.
+ : -1.;
+
+ PitchProfile np = p.normalized();
+
+ ChordLabel c(basicChordTypes[i], j);
+
+ m_harmonyTable.push_back(std::pair<PitchProfile, ChordLabel>(np, c));
+ }
+ }
+
+}
+
+AnalysisHelper::ProgressionMap AnalysisHelper::m_progressionMap;
+
+void
+AnalysisHelper::checkProgressionMap()
+{
+ if (!m_progressionMap.empty()) return;
+ // majorProgressionFirsts[0] = 5, majorProgressionSeconds[0]=1, so 5->1 is
+ // a valid progression. Note that the chord numbers are 1-based, like the
+ // Roman numeral symbols
+ const int majorProgressionFirsts[9] =
+ {5, 2, 6, 3, 7, 4, 4, 3, 5};
+ const int majorProgressionSeconds[9] =
+ {1, 5, 2, 6, 1, 2, 5, 4, 6};
+
+ // For each major key
+ for (int i = 0; i < 12; ++i)
+ {
+ // Make the key
+ Key k(0, false); // tonicPitch = i, isMinor = false
+ // Add the common progressions
+ for (int j = 0; j < 9; ++j)
+ {
+ std::cerr << majorProgressionFirsts[j] << ", " << majorProgressionSeconds[j] << std::endl;
+ addProgressionToMap(k,
+ majorProgressionFirsts[j],
+ majorProgressionSeconds[j]);
+ }
+ // Add I->everything
+ for (int j = 1; j < 8; ++j)
+ {
+ addProgressionToMap(k, 1, j);
+ }
+ // (Add the progressions involving seventh chords)
+ // (Add I->seventh chords)
+ }
+ // (For each minor key)
+ // (Do what we just did for major keys)
+
+}
+
+void
+AnalysisHelper::addProgressionToMap(Key k,
+ int firstChordNumber,
+ int secondChordNumber)
+{
+ // majorScalePitches[1] should be the pitch of the first step of
+ // the scale, so there's padding at the beginning of both these
+ // arrays.
+ const int majorScalePitches[] = {0, 0, 2, 4, 5, 7, 9, 11};
+ const ChordType majorDiationicTriadTypes[] =
+ {ChordTypes::NoChord, ChordTypes::Major, ChordTypes::Minor,
+ ChordTypes::Minor, ChordTypes::Major, ChordTypes::Major,
+ ChordTypes::Minor, ChordTypes::Diminished};
+
+ int offset = k.getTonicPitch();
+
+ if (!k.isMinor())
+ {
+ ChordLabel firstChord
+ (
+ majorDiationicTriadTypes[firstChordNumber],
+ (majorScalePitches[firstChordNumber] + offset) % 12
+ );
+ ChordLabel secondChord
+ (
+ majorDiationicTriadTypes[secondChordNumber],
+ (majorScalePitches[secondChordNumber] + offset) % 12
+ );
+ ChordProgression p(firstChord, secondChord, k);
+ m_progressionMap.insert(p);
+ }
+ // else handle minor-key chords
+
+}
+
+// AnalysisHelper::ChordProgression
+/////////////////////////////////////////////////
+
+AnalysisHelper::ChordProgression::ChordProgression(ChordLabel first_,
+ ChordLabel second_,
+ Key key_) :
+ first(first_),
+ second(second_),
+ homeKey(key_)
+{
+ // nothing else
+}
+
+bool
+AnalysisHelper::ChordProgression::operator<(const AnalysisHelper::ChordProgression& other) const
+{
+ // no need for:
+ // if (first == other.first) return second < other.second;
+ return first < other.first;
+}
+
+// AnalysisHelper::PitchProfile
+/////////////////////////////////////////////////
+
+AnalysisHelper::PitchProfile::PitchProfile()
+{
+ for (int i = 0; i < 12; ++i) m_data[i] = 0;
+}
+
+double&
+AnalysisHelper::PitchProfile::operator[](int i)
+{
+ return m_data[i];
+}
+
+const double&
+AnalysisHelper::PitchProfile::operator[](int i) const
+{
+ return m_data[i];
+}
+
+double
+AnalysisHelper::PitchProfile::distance(const PitchProfile &other)
+{
+ double distance = 0;
+
+ for (int i = 0; i < 12; ++i)
+ {
+ distance += fabs(other[i] - m_data[i]);
+ }
+
+ return distance;
+}
+
+double
+AnalysisHelper::PitchProfile::dotProduct(const PitchProfile &other)
+{
+ double product = 0;
+
+ for (int i = 0; i < 12; ++i)
+ {
+ product += other[i] * m_data[i];
+ }
+
+ return product;
+}
+
+double
+AnalysisHelper::PitchProfile::productScorer(const PitchProfile &other)
+{
+ double cumulativeProduct = 1;
+ double numbersInProduct = 0;
+
+ for (int i = 0; i < 12; ++i)
+ {
+ if (other[i] > 0)
+ {
+ cumulativeProduct *= m_data[i];
+ ++numbersInProduct;
+ }
+ }
+
+ if (numbersInProduct > 0)
+ return pow(cumulativeProduct, 1/numbersInProduct);
+
+ return 0;
+}
+
+AnalysisHelper::PitchProfile
+AnalysisHelper::PitchProfile::normalized()
+{
+ double size = 0;
+ PitchProfile normedProfile;
+
+ for (int i = 0; i < 12; ++i)
+ {
+ size += fabs(m_data[i]);
+ }
+
+ if (size == 0) size = 1;
+
+ for (int i = 0; i < 12; ++i)
+ {
+ normedProfile[i] = m_data[i] / size;
+ }
+
+ return normedProfile;
+}
+
+AnalysisHelper::PitchProfile&
+AnalysisHelper::PitchProfile::operator*=(double d)
+{
+
+ for (int i = 0; i < 12; ++i)
+ {
+ m_data[i] *= d;
+ }
+
+ return *this;
+}
+
+AnalysisHelper::PitchProfile&
+AnalysisHelper::PitchProfile::operator+=(const PitchProfile& d)
+{
+
+ for (int i = 0; i < 12; ++i)
+ {
+ m_data[i] += d[i];
+ }
+
+ return *this;
+}
+
+///////////////////////////////////////////////////////////////////////////
+// Time signature guessing
+///////////////////////////////////////////////////////////////////////////
+
+// #### this is too long
+// should use constants for basic lengths, not numbers
+
+TimeSignature
+AnalysisHelper::guessTimeSignature(CompositionTimeSliceAdapter &c)
+{
+ bool haveNotes = false;
+
+ // 1. Guess the duration of the beat. The right beat length is going
+ // to be a common note length, and beat boundaries should be likely
+ // to have notes starting on them.
+
+ vector<int> beatScores(4, 0);
+
+ // durations of quaver, dotted quaver, crotchet, dotted crotchet:
+ static const int commonBeatDurations[4] = {48, 72, 96, 144};
+
+ int j = 0;
+ for (CompositionTimeSliceAdapter::iterator i = c.begin();
+ i != c.end() && j < 100;
+ ++i, ++j)
+ {
+
+ // Skip non-notes
+ if (!(*i)->isa(Note::EventType)) continue;
+ haveNotes = true;
+
+ for (int k = 0; k < 4; ++k)
+ {
+
+ // Points for any note of the right length
+ if ((*i)->getDuration() == commonBeatDurations[k])
+ beatScores[k]++;
+
+ // Score for the probability that a note starts on a beat
+ // boundary.
+
+ // Normally, to get the probability that a random beat boundary
+ // has a note on it, you'd add a constant for each note on a
+ // boundary and divide by the number of beat boundaries.
+ // Instead, this multiplies the constant (1/24) by
+ // commonBeatDurations[k], which is inversely proportional to
+ // the number of beat boundaries.
+
+ if ((*i)->getAbsoluteTime() % commonBeatDurations[k] == 0)
+ beatScores[k] += commonBeatDurations[k] / 24;
+
+ }
+
+ }
+
+ if (!haveNotes) return TimeSignature();
+
+ int beatDuration = 0,
+ bestScore = 0;
+
+ for (int j = 0; j < 4; ++j)
+ {
+ if (beatScores[j] >= bestScore)
+ {
+ bestScore = beatScores[j];
+ beatDuration = commonBeatDurations[j];
+ }
+ }
+
+ // 2. Guess whether the measure has two, three or four beats. The right
+ // measure length should make notes rarely cross barlines and have a
+ // high average length for notes at the start of bars.
+
+ vector<int> measureLengthScores(5, 0);
+
+ for (CompositionTimeSliceAdapter::iterator i = c.begin();
+ i != c.end() && j < 100;
+ ++i, ++j)
+ {
+
+ if (!(*i)->isa(Note::EventType)) continue;
+
+ // k is the guess at the number of beats in a measure
+ for (int k = 2; k < 5; ++k)
+ {
+
+ // Determine whether this note crosses a barline; points for the
+ // measure length if it does NOT.
+
+ int noteOffset = ((*i)->getAbsoluteTime() % (beatDuration * k));
+ int noteEnd = noteOffset + (*i)->getDuration();
+ if ( !(noteEnd > (beatDuration * k)) )
+ measureLengthScores[k] += 10;
+
+
+ // Average length of notes at measure starts
+
+ // Instead of dividing by the number of measure starts, this
+ // multiplies by the number of beats per measure, which is
+ // inversely proportional to the number of measure starts.
+
+ if ((*i)->getAbsoluteTime() % (beatDuration * k) == 0)
+ measureLengthScores[k] +=
+ (*i)->getDuration() * k / 24;
+
+ }
+
+ }
+
+ int measureLength = 0;
+
+ bestScore = 0; // reused from earlier
+
+ for (int j = 2; j < 5; ++j)
+ {
+ if (measureLengthScores[j] >= bestScore)
+ {
+ bestScore = measureLengthScores[j];
+ measureLength = j;
+ }
+ }
+
+ //
+ // 3. Put the result in a TimeSignature object.
+ //
+
+ int numerator = 0, denominator = 0;
+
+ if (beatDuration % 72 == 0)
+ {
+
+ numerator = 3 * measureLength;
+
+ // 144 means the beat is a dotted crotchet, so the beat division
+ // is a quaver, so you want 8 on bottom
+ denominator = (144 * 8) / beatDuration;
+
+ }
+ else
+ {
+
+ numerator = measureLength;
+
+ // 96 means that the beat is a crotchet, so you want 4 on bottom
+ denominator = (96 * 4) / beatDuration;
+
+ }
+
+ TimeSignature ts(numerator, denominator);
+
+ return ts;
+
+}
+
+///////////////////////////////////////////////////////////////////////////
+// Key guessing
+///////////////////////////////////////////////////////////////////////////
+
+Key
+AnalysisHelper::guessKey(CompositionTimeSliceAdapter &c)
+{
+ if (c.begin() == c.end()) return Key();
+
+ // 1. Figure out the distribution of emphasis over the twelve
+ // pitch clases in the first few bars. Pitches that occur
+ // more often have greater emphasis, and pitches that occur
+ // at stronger points in the bar have greater emphasis.
+
+ vector<int> weightedNoteCount(12, 0);
+ TimeSignature timeSig;
+ timeT timeSigTime = 0;
+ timeT nextSigTime = (*c.begin())->getAbsoluteTime();
+
+ int j = 0;
+ for (CompositionTimeSliceAdapter::iterator i = c.begin();
+ i != c.end() && j < 100; ++i, ++j)
+ {
+ timeT time = (*i)->getAbsoluteTime();
+
+ if (time >= nextSigTime) {
+ Composition *comp = c.getComposition();
+ int sigNo = comp->getTimeSignatureNumberAt(time);
+ if (sigNo >= 0) {
+ std::pair<timeT, TimeSignature> sig = comp->getTimeSignatureChange(sigNo);
+ timeSigTime = sig.first;
+ timeSig = sig.second;
+ }
+ if (sigNo < comp->getTimeSignatureCount() - 1) {
+ nextSigTime = comp->getTimeSignatureChange(sigNo + 1).first;
+ } else {
+ nextSigTime = comp->getEndMarker();
+ }
+ }
+
+ // Skip any other non-notes
+ if (!(*i)->isa(Note::EventType)) continue;
+
+ try {
+ // Get pitch, metric strength of this event
+ int pitch = (*i)->get<Int>(BaseProperties::PITCH)%12;
+ int emphasis =
+ 1 << timeSig.getEmphasisForTime((*i)->getAbsoluteTime() - timeSigTime);
+
+ // Count notes
+ weightedNoteCount[pitch] += emphasis;
+
+ } catch (...) {
+ std::cerr << "No pitch for note at " << time << "!" << std::endl;
+ }
+ }
+
+ // 2. Figure out what key best fits the distribution of emphasis.
+ // Notes outside a piece's key are rarely heavily emphasized,
+ // and the tonic and dominant of the key are likely to appear.
+
+ // This part is longer than it should be.
+
+ int bestTonic = -1;
+ bool bestKeyIsMinor = false;
+ int lowestCost = 999999999;
+
+ for (int k = 0; k < 12; ++k)
+ {
+ int cost =
+ // accidentals are costly
+ weightedNoteCount[(k + 1 ) % 12]
+ + weightedNoteCount[(k + 3 ) % 12]
+ + weightedNoteCount[(k + 6 ) % 12]
+ + weightedNoteCount[(k + 8 ) % 12]
+ + weightedNoteCount[(k + 10) % 12]
+ // tonic is very good
+ - weightedNoteCount[ k ] * 5
+ // dominant is good
+ - weightedNoteCount[(k + 7 ) % 12];
+ if (cost < lowestCost)
+ {
+ bestTonic = k;
+ lowestCost = cost;
+ }
+ }
+
+ for (int k = 0; k < 12; ++k)
+ {
+ int cost =
+ // accidentals are costly
+ weightedNoteCount[(k + 1 ) % 12]
+ + weightedNoteCount[(k + 4 ) % 12]
+ + weightedNoteCount[(k + 6 ) % 12]
+ // no cost for raised steps 6/7 (k+9, k+11)
+ // tonic is very good
+ - weightedNoteCount[ k ] * 5
+ // dominant is good
+ - weightedNoteCount[(k + 7 ) % 12];
+ if (cost < lowestCost)
+ {
+ bestTonic = k;
+ bestKeyIsMinor = true;
+ lowestCost = cost;
+ }
+ }
+
+ return Key(bestTonic, bestKeyIsMinor);
+
+}
+
+}
diff --git a/src/base/AnalysisTypes.h b/src/base/AnalysisTypes.h
new file mode 100644
index 0000000..d7eabad
--- /dev/null
+++ b/src/base/AnalysisTypes.h
@@ -0,0 +1,227 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ This file is Copyright 2002
+ Randall Farmer <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _ANALYSISTYPES_H_
+#define _ANALYSISTYPES_H_
+
+#include <string>
+#include <map>
+#include <set>
+#include <vector>
+
+#include "NotationTypes.h"
+
+namespace Rosegarden
+{
+
+class Segment;
+class Event;
+class CompositionTimeSliceAdapter;
+class Quantizer;
+
+///////////////////////////////////////////////////////////////////////////
+
+typedef std::string ChordType;
+class ChordLabel;
+
+namespace ChordTypes
+{
+const ChordType
+NoChord = "no-chord",
+ Major = "",
+ Minor = "m",
+ Diminished = "dim",
+ MajorSeventh = "M7",
+ DominantSeventh = "7",
+ MinorSeventh = "m7",
+ HalfDimSeventh = "7b5",
+ DimSeventh = "dim7";
+}
+
+///////////////////////////////////////////////////////////////////////////
+
+/**
+ * ChordLabel names chords and identifies them from their masks. See
+ * ChordLabel::checkMap() for details on what the masks are and
+ * AnalysisHelper::labelChords() for an example.
+ */
+
+class ChordLabel
+{
+public:
+ ChordLabel();
+ ChordLabel(Key key, int mask, int bass);
+ ChordLabel(ChordType type, int rootPitch, int inversion = 0) :
+ m_data(type, rootPitch, inversion) { };
+ int rootPitch();
+ /**
+ * Gives the name of the chord in lead-sheet notation: C, Dm,
+ * G#7b5...
+ */
+ std::string getName(Key key) const;
+ /**
+ * Gives the name of the chord in roman-numeral notation: I, ii,
+ * VMm7...
+ */
+// std::string getRomanNumeral(Key key);
+ bool isValid() const;
+ bool operator<(const ChordLabel& other) const;
+ // ### I can't believe this is necessary, but the compiler
+ // is asking for it
+ bool operator==(const ChordLabel& other) const;
+
+private:
+ // #### are m_* names appropriate for a struct?
+ // shouldn't I find a neater way to keep a ChordMap?
+ struct ChordData
+ {
+ ChordData(ChordType type, int rootPitch, int inversion = 0) :
+ m_type(type),
+ m_rootPitch(rootPitch),
+ m_inversion(inversion) { };
+
+ ChordData() :
+ m_type(ChordTypes::NoChord),
+ m_rootPitch(0),
+ m_inversion(0) { };
+
+ ChordType m_type;
+ int m_rootPitch;
+ int m_inversion;
+ };
+ ChordData m_data;
+ void checkMap();
+
+ typedef std::multimap<int, ChordData> ChordMap;
+ static ChordMap m_chordMap;
+};
+
+///////////////////////////////////////////////////////////////////////////
+
+class AnalysisHelper
+{
+public:
+ AnalysisHelper() {};
+
+ /**
+ * Returns the key in force during a given event.
+ */
+ Key getKeyForEvent(Event *e, Segment &s);
+
+ /**
+ * Inserts in the given Segment labels for all of the chords found in
+ * the timeslice in the given CompositionTimeSliceAdapter.
+ */
+ void labelChords(CompositionTimeSliceAdapter &c, Segment &s,
+ const Quantizer *quantizer);
+
+ /**
+ * Returns a time signature that is probably reasonable for the
+ * given timeslice.
+ */
+ TimeSignature guessTimeSignature(CompositionTimeSliceAdapter &c);
+
+ /**
+ * Returns a guess at the starting key of the given timeslice.
+ */
+ Key guessKey(CompositionTimeSliceAdapter &c);
+
+ /**
+ * Like labelChords, but the algorithm is more complicated. This tries
+ * to guess the chords that should go under a beat even when all of the
+ * chord members aren't played at once.
+ */
+ void guessHarmonies(CompositionTimeSliceAdapter &c, Segment &s);
+
+protected:
+ // ### THESE NAMES ARE AWFUL. MUST GREP THEM OUT OF EXISTENCE.
+ typedef std::pair<double, ChordLabel> ChordPossibility;
+ typedef std::vector<ChordPossibility> HarmonyGuess;
+ typedef std::vector<std::pair<timeT, HarmonyGuess> > HarmonyGuessList;
+ struct cp_less : public std::binary_function<ChordPossibility, ChordPossibility, bool>
+ {
+ bool operator()(ChordPossibility l, ChordPossibility r);
+ };
+
+ /// For use by guessHarmonies
+ void makeHarmonyGuessList(CompositionTimeSliceAdapter &c,
+ HarmonyGuessList &l);
+
+ /// For use by guessHarmonies
+ void refineHarmonyGuessList(CompositionTimeSliceAdapter &c,
+ HarmonyGuessList& l,
+ Segment &);
+
+ /// For use by guessHarmonies (makeHarmonyGuessList)
+ class PitchProfile
+ {
+ public:
+ PitchProfile();
+ double& operator[](int i);
+ const double& operator[](int i) const;
+ double distance(const PitchProfile &other);
+ double dotProduct(const PitchProfile &other);
+ double productScorer(const PitchProfile &other);
+ PitchProfile normalized();
+ PitchProfile& operator*=(double d);
+ PitchProfile& operator+=(const PitchProfile &d);
+ private:
+ double m_data[12];
+ };
+
+ /// For use by guessHarmonies (makeHarmonyGuessList)
+ typedef std::vector<std::pair<PitchProfile, ChordLabel> > HarmonyTable;
+ static HarmonyTable m_harmonyTable;
+
+ /// For use by guessHarmonies (makeHarmonyGuessList)
+ void checkHarmonyTable();
+
+ /// For use by guessHarmonies (refineHarmonyGuessList)
+ // #### grep ProgressionMap to something else
+ struct ChordProgression {
+ ChordProgression(ChordLabel first_,
+ ChordLabel second_ = ChordLabel(),
+ Key key_ = Key());
+ ChordLabel first;
+ ChordLabel second;
+ Key homeKey;
+ // double commonness...
+ bool operator<(const ChordProgression& other) const;
+ };
+ typedef std::set<ChordProgression> ProgressionMap;
+ static ProgressionMap m_progressionMap;
+
+ /// For use by guessHarmonies (refineHarmonyGuessList)
+ void checkProgressionMap();
+
+ /// For use by checkProgressionMap
+ void addProgressionToMap(Key k,
+ int firstChordNumber,
+ int secondChordNumber);
+
+};
+
+}
+
+#endif
diff --git a/src/base/AudioDevice.cpp b/src/base/AudioDevice.cpp
new file mode 100644
index 0000000..d9ff1f2
--- /dev/null
+++ b/src/base/AudioDevice.cpp
@@ -0,0 +1,107 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include "AudioDevice.h"
+#include "Instrument.h"
+
+#include <cstdio>
+
+
+#if (__GNUC__ < 3)
+#include <strstream>
+#define stringstream strstream
+#else
+#include <sstream>
+#endif
+
+
+namespace Rosegarden
+{
+
+AudioDevice::AudioDevice():Device(0, "Default Audio Device", Device::Audio)
+{
+}
+
+AudioDevice::AudioDevice(DeviceId id, const std::string &name):
+ Device(id, name, Device::Audio)
+{
+}
+
+
+AudioDevice::AudioDevice(const AudioDevice &dev):
+ Device(dev.getId(), dev.getName(), dev.getType())
+{
+ // Copy the instruments
+ //
+ InstrumentList insList = dev.getAllInstruments();
+ InstrumentList::iterator iIt = insList.begin();
+ for (; iIt != insList.end(); iIt++)
+ m_instruments.push_back(new Instrument(**iIt));
+}
+
+AudioDevice::~AudioDevice()
+{
+}
+
+
+std::string
+AudioDevice::toXmlString()
+{
+ std::stringstream audioDevice;
+ InstrumentList::iterator iit;
+
+ audioDevice << " <device id=\"" << m_id
+ << "\" name=\"" << m_name
+ << "\" type=\"audio\">" << std::endl;
+
+ for (iit = m_instruments.begin(); iit != m_instruments.end(); ++iit)
+ audioDevice << (*iit)->toXmlString();
+
+ audioDevice << " </device>"
+#if (__GNUC__ < 3)
+ << std::endl << std::ends;
+#else
+ << std::endl;
+#endif
+
+ return audioDevice.str();
+}
+
+
+// Add to instrument list
+//
+void
+AudioDevice::addInstrument(Instrument *instrument)
+{
+ m_instruments.push_back(instrument);
+}
+
+// For the moment just use the first audio Instrument
+//
+InstrumentId
+AudioDevice::getPreviewInstrument()
+{
+ return AudioInstrumentBase;
+}
+
+}
+
+
diff --git a/src/base/AudioDevice.h b/src/base/AudioDevice.h
new file mode 100644
index 0000000..671c781
--- /dev/null
+++ b/src/base/AudioDevice.h
@@ -0,0 +1,70 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include <string>
+
+#include "Device.h"
+#include "Instrument.h"
+
+// An AudioDevice defines Instruments where we can play our
+// audio Segments.
+//
+//
+//
+#ifndef _AUDIODEVICE_H_
+#define _AUDIODEVICE_H_
+
+namespace Rosegarden
+{
+
+class AudioDevice : public Device
+{
+
+public:
+ AudioDevice();
+ AudioDevice(DeviceId id, const std::string &name);
+ virtual ~AudioDevice();
+
+ // Copy constructor
+ //
+ AudioDevice(const AudioDevice &);
+
+ virtual void addInstrument(Instrument*);
+
+ // An untainted Instrument we can use for playing previews
+ //
+ InstrumentId getPreviewInstrument();
+
+ // Turn into XML string
+ //
+ virtual std::string toXmlString();
+
+ virtual InstrumentList getAllInstruments() const { return m_instruments; }
+ virtual InstrumentList getPresentationInstruments() const
+ { return m_instruments; }
+
+private:
+
+};
+
+}
+
+#endif // _AUDIODEVICE_H_
diff --git a/src/base/AudioLevel.cpp b/src/base/AudioLevel.cpp
new file mode 100644
index 0000000..6772c97
--- /dev/null
+++ b/src/base/AudioLevel.cpp
@@ -0,0 +1,272 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include "AudioLevel.h"
+#include <cmath>
+#include <iostream>
+#include <map>
+#include <vector>
+
+namespace Rosegarden {
+
+const float AudioLevel::DB_FLOOR = -1000.0;
+
+struct FaderDescription
+{
+ FaderDescription(float _minDb, float _maxDb, float _zeroPoint) :
+ minDb(_minDb), maxDb(_maxDb), zeroPoint(_zeroPoint) { }
+
+ float minDb;
+ float maxDb;
+ float zeroPoint; // as fraction of total throw
+};
+
+static const FaderDescription faderTypes[] = {
+ FaderDescription(-40.0, +6.0, 0.75), // short
+ FaderDescription(-70.0, +10.0, 0.80), // long
+ FaderDescription(-70.0, 0.0, 1.00), // IEC268
+ FaderDescription(-70.0, +10.0, 0.80), // IEC268 long
+ FaderDescription(-40.0, 0.0, 1.00), // preview
+};
+
+typedef std::vector<float> LevelList;
+static std::map<int, LevelList> previewLevelCache;
+static const LevelList &getPreviewLevelCache(int levels);
+
+float
+AudioLevel::multiplier_to_dB(float multiplier)
+{
+ if (multiplier == 0.0) return DB_FLOOR;
+ float dB = 10 * log10f(multiplier);
+ return dB;
+}
+
+float
+AudioLevel::dB_to_multiplier(float dB)
+{
+ if (dB == DB_FLOOR) return 0.0;
+ float m = powf(10.0, dB / 10.0);
+ return m;
+}
+
+/* IEC 60-268-18 fader levels. Thanks to Steve Harris. */
+
+static float iec_dB_to_fader(float db)
+{
+ float def = 0.0f; // Meter deflection %age
+
+ if (db < -70.0f) {
+ def = 0.0f;
+ } else if (db < -60.0f) {
+ def = (db + 70.0f) * 0.25f;
+ } else if (db < -50.0f) {
+ def = (db + 60.0f) * 0.5f + 5.0f;
+ } else if (db < -40.0f) {
+ def = (db + 50.0f) * 0.75f + 7.5f;
+ } else if (db < -30.0f) {
+ def = (db + 40.0f) * 1.5f + 15.0f;
+ } else if (db < -20.0f) {
+ def = (db + 30.0f) * 2.0f + 30.0f;
+ } else {
+ def = (db + 20.0f) * 2.5f + 50.0f;
+ }
+
+ return def;
+}
+
+static float iec_fader_to_dB(float def) // Meter deflection %age
+{
+ float db = 0.0f;
+
+ if (def >= 50.0f) {
+ db = (def - 50.0f) / 2.5f - 20.0f;
+ } else if (def >= 30.0f) {
+ db = (def - 30.0f) / 2.0f - 30.0f;
+ } else if (def >= 15.0f) {
+ db = (def - 15.0f) / 1.5f - 40.0f;
+ } else if (def >= 7.5f) {
+ db = (def - 7.5f) / 0.75f - 50.0f;
+ } else if (def >= 5.0f) {
+ db = (def - 5.0f) / 0.5f - 60.0f;
+ } else {
+ db = (def / 0.25f) - 70.0f;
+ }
+
+ return db;
+}
+
+float
+AudioLevel::fader_to_dB(int level, int maxLevel, FaderType type)
+{
+ if (level == 0) return DB_FLOOR;
+
+ if (type == IEC268Meter || type == IEC268LongMeter) {
+
+ float maxPercent = iec_dB_to_fader(faderTypes[type].maxDb);
+ float percent = float(level) * maxPercent / float(maxLevel);
+ float dB = iec_fader_to_dB(percent);
+ return dB;
+
+ } else { // scale proportional to sqrt(fabs(dB))
+
+ int zeroLevel = int(maxLevel * faderTypes[type].zeroPoint);
+
+ if (level >= zeroLevel) {
+
+ float value = level - zeroLevel;
+ float scale = float(maxLevel - zeroLevel) /
+ sqrtf(faderTypes[type].maxDb);
+ value /= scale;
+ float dB = powf(value, 2.0);
+ return dB;
+
+ } else {
+
+ float value = zeroLevel - level;
+ float scale = zeroLevel / sqrtf(0.0 - faderTypes[type].minDb);
+ value /= scale;
+ float dB = powf(value, 2.0);
+ return 0.0 - dB;
+ }
+ }
+}
+
+
+int
+AudioLevel::dB_to_fader(float dB, int maxLevel, FaderType type)
+{
+ if (dB == DB_FLOOR) return 0;
+
+ if (type == IEC268Meter || type == IEC268LongMeter) {
+
+ // The IEC scale gives a "percentage travel" for a given dB
+ // level, but it reaches 100% at 0dB. So we want to treat the
+ // result not as a percentage, but as a scale between 0 and
+ // whatever the "percentage" for our (possibly >0dB) max dB is.
+
+ float maxPercent = iec_dB_to_fader(faderTypes[type].maxDb);
+ float percent = iec_dB_to_fader(dB);
+ int faderLevel = int((maxLevel * percent) / maxPercent + 0.01);
+
+ if (faderLevel < 0) faderLevel = 0;
+ if (faderLevel > maxLevel) faderLevel = maxLevel;
+ return faderLevel;
+
+ } else {
+
+ int zeroLevel = int(maxLevel * faderTypes[type].zeroPoint);
+
+ if (dB >= 0.0) {
+
+ float value = sqrtf(dB);
+ float scale = (maxLevel - zeroLevel) / sqrtf(faderTypes[type].maxDb);
+ value *= scale;
+ int level = int(value + 0.01) + zeroLevel;
+ if (level > maxLevel) level = maxLevel;
+ return level;
+
+ } else {
+
+ dB = 0.0 - dB;
+ float value = sqrtf(dB);
+ float scale = zeroLevel / sqrtf(0.0 - faderTypes[type].minDb);
+ value *= scale;
+ int level = zeroLevel - int(value + 0.01);
+ if (level < 0) level = 0;
+ return level;
+ }
+ }
+}
+
+
+float
+AudioLevel::fader_to_multiplier(int level, int maxLevel, FaderType type)
+{
+ if (level == 0) return 0.0;
+ return dB_to_multiplier(fader_to_dB(level, maxLevel, type));
+}
+
+int
+AudioLevel::multiplier_to_fader(float multiplier, int maxLevel, FaderType type)
+{
+ if (multiplier == 0.0) return 0;
+ float dB = multiplier_to_dB(multiplier);
+ int fader = dB_to_fader(dB, maxLevel, type);
+ return fader;
+}
+
+
+const LevelList &
+getPreviewLevelCache(int levels)
+{
+ LevelList &ll = previewLevelCache[levels];
+ if (ll.empty()) {
+ for (int i = 0; i <= levels; ++i) {
+ float m = AudioLevel::fader_to_multiplier
+ (i, levels, AudioLevel::PreviewLevel);
+ if (levels == 1) m /= 100; // noise
+ ll.push_back(m);
+ }
+ }
+ return ll;
+}
+
+int
+AudioLevel::multiplier_to_preview(float m, int levels)
+{
+ const LevelList &ll = getPreviewLevelCache(levels);
+ int result = -1;
+
+ int lo = 0, hi = levels;
+
+ // binary search
+ int level = -1;
+ while (result < 0) {
+ int newlevel = (lo + hi) / 2;
+ if (newlevel == level ||
+ newlevel == 0 ||
+ newlevel == levels) {
+ result = newlevel;
+ break;
+ }
+ level = newlevel;
+ if (ll[level] >= m) {
+ hi = level;
+ } else if (ll[level+1] >= m) {
+ result = level;
+ } else {
+ lo = level;
+ }
+ }
+
+ return result;
+}
+
+float
+AudioLevel::preview_to_multiplier(int level, int levels)
+{
+ const LevelList &ll = getPreviewLevelCache(levels);
+ return ll[level];
+}
+
+
+}
+
diff --git a/src/base/AudioLevel.h b/src/base/AudioLevel.h
new file mode 100644
index 0000000..2dc742d
--- /dev/null
+++ b/src/base/AudioLevel.h
@@ -0,0 +1,67 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _AUDIO_LEVEL_H_
+#define _AUDIO_LEVEL_H_
+
+namespace Rosegarden {
+
+/**
+ * We need to represent audio levels in three different ways: as dB
+ * values; as a floating-point multiplier for gain; and as an integer
+ * on a scale for fader position and vu level. This class does the
+ * necessary conversions.
+ */
+
+class AudioLevel
+{
+public:
+
+ static const float DB_FLOOR;
+
+ enum FaderType {
+ ShortFader = 0, // -40 -> +6 dB
+ LongFader = 1, // -70 -> +10 dB
+ IEC268Meter = 2, // -70 -> 0 dB
+ IEC268LongMeter = 3, // -70 -> +10 dB (0dB aligns with LongFader)
+ PreviewLevel = 4
+ };
+
+ static float multiplier_to_dB(float multiplier);
+ static float dB_to_multiplier(float dB);
+
+ static float fader_to_dB(int level, int maxLevel, FaderType type);
+ static int dB_to_fader(float dB, int maxFaderLevel, FaderType type);
+
+ static float fader_to_multiplier(int level, int maxLevel, FaderType type);
+ static int multiplier_to_fader(float multiplier, int maxFaderLevel,
+ FaderType type);
+
+ // fast if "levels" doesn't change often -- for audio segment previews
+ static int multiplier_to_preview(float multiplier, int levels);
+ static float preview_to_multiplier(int level, int levels);
+};
+
+}
+
+#endif
+
+
diff --git a/src/base/AudioPluginInstance.cpp b/src/base/AudioPluginInstance.cpp
new file mode 100644
index 0000000..112687b
--- /dev/null
+++ b/src/base/AudioPluginInstance.cpp
@@ -0,0 +1,256 @@
+// -*- c-basic-offset: 4 -*-
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include "AudioPluginInstance.h"
+#include "Instrument.h"
+
+#include <iostream>
+#include <cstring>
+
+#if (__GNUC__ < 3)
+#include <strstream>
+#define stringstream strstream
+#else
+#include <sstream>
+#endif
+
+namespace Rosegarden
+{
+
+// ------------------ PluginPort ---------------------
+//
+
+PluginPort::PluginPort(int number,
+ std::string name,
+ PluginPort::PortType type,
+ PluginPort::PortDisplayHint hint,
+ PortData lowerBound,
+ PortData upperBound,
+ PortData defaultValue):
+ m_number(number),
+ m_name(name),
+ m_type(type),
+ m_displayHint(hint),
+ m_lowerBound(lowerBound),
+ m_upperBound(upperBound),
+ m_default(defaultValue)
+{
+}
+
+AudioPluginInstance::AudioPluginInstance(unsigned int position):
+ m_mappedId(-1),
+ m_identifier(""),
+ m_position(position),
+ m_assigned(false),
+ m_bypass(false),
+ m_program("")
+{
+}
+
+AudioPluginInstance::AudioPluginInstance(std::string identifier,
+ unsigned int position):
+ m_mappedId(-1),
+ m_identifier(identifier),
+ m_position(position),
+ m_assigned(true)
+{
+}
+
+std::string
+AudioPluginInstance::toXmlString()
+{
+
+ std::stringstream plugin;
+
+ if (m_assigned == false)
+ {
+#if (__GNUC__ < 3)
+ plugin << std::ends;
+#endif
+ return plugin.str();
+ }
+
+ if (m_position == Instrument::SYNTH_PLUGIN_POSITION) {
+ plugin << " <synth ";
+ } else {
+ plugin << " <plugin"
+ << " position=\""
+ << m_position
+ << "\" ";
+ }
+
+ plugin << "identifier=\""
+ << encode(m_identifier)
+ << "\" bypassed=\"";
+
+ if (m_bypass)
+ plugin << "true\" ";
+ else
+ plugin << "false\" ";
+
+ if (m_program != "") {
+ plugin << "program=\"" << encode(m_program) << "\"";
+ }
+
+ plugin << ">" << std::endl;
+
+ for (unsigned int i = 0; i < m_ports.size(); i++)
+ {
+ plugin << " <port id=\""
+ << m_ports[i]->number
+ << "\" value=\""
+ << m_ports[i]->value
+ << "\" changed=\""
+ << (m_ports[i]->changedSinceProgramChange ? "true" : "false")
+ << "\"/>" << std::endl;
+ }
+
+ for (ConfigMap::iterator i = m_config.begin(); i != m_config.end(); ++i) {
+ plugin << " <configure key=\""
+ << encode(i->first) << "\" value=\""
+ << encode(i->second) << "\"/>" << std::endl;
+ }
+
+ if (m_position == Instrument::SYNTH_PLUGIN_POSITION) {
+ plugin << " </synth>";
+ } else {
+ plugin << " </plugin>";
+ }
+
+#if (__GNUC__ < 3)
+ plugin << std::endl << std::ends;
+#else
+ plugin << std::endl;
+#endif
+
+ return plugin.str();
+}
+
+
+void
+AudioPluginInstance::addPort(int number, PortData value)
+{
+ m_ports.push_back(new PluginPortInstance(number, value));
+}
+
+
+bool
+AudioPluginInstance::removePort(int number)
+{
+ PortInstanceIterator it = m_ports.begin();
+
+ for (; it != m_ports.end(); ++it)
+ {
+ if ((*it)->number == number)
+ {
+ delete (*it);
+ m_ports.erase(it);
+ return true;
+ }
+ }
+
+ return false;
+}
+
+
+PluginPortInstance*
+AudioPluginInstance::getPort(int number)
+{
+ PortInstanceIterator it = m_ports.begin();
+
+ for (; it != m_ports.end(); ++it)
+ {
+ if ((*it)->number == number)
+ return *it;
+ }
+
+ return 0;
+}
+
+void
+AudioPluginInstance::clearPorts()
+{
+ PortInstanceIterator it = m_ports.begin();
+ for (; it != m_ports.end(); ++it)
+ delete (*it);
+ m_ports.erase(m_ports.begin(), m_ports.end());
+}
+
+std::string
+AudioPluginInstance::getConfigurationValue(std::string k) const
+{
+ ConfigMap::const_iterator i = m_config.find(k);
+ if (i != m_config.end()) return i->second;
+ return "";
+}
+
+void
+AudioPluginInstance::setProgram(std::string program)
+{
+ m_program = program;
+
+ PortInstanceIterator it = m_ports.begin();
+ for (; it != m_ports.end(); ++it) {
+ (*it)->changedSinceProgramChange = false;
+ }
+}
+
+void
+AudioPluginInstance::setConfigurationValue(std::string k, std::string v)
+{
+ m_config[k] = v;
+}
+
+std::string
+AudioPluginInstance::getDistinctiveConfigurationText() const
+{
+ std::string base = getConfigurationValue("load");
+
+ if (base == "") {
+ for (ConfigMap::const_iterator i = m_config.begin();
+ i != m_config.end(); ++i) {
+
+ if (!strncmp(i->first.c_str(),
+ "__ROSEGARDEN__",
+ strlen("__ROSEGARDEN__"))) continue;
+
+ if (i->second != "" && i->second[0] == '/') {
+ base = i->second;
+ break;
+ } else if (base != "") {
+ base = i->second;
+ }
+ }
+ }
+
+ if (base == "") return "";
+
+ std::string::size_type s = base.rfind('/');
+ if (s < base.length() - 1) base = base.substr(s + 1);
+
+ std::string::size_type d = base.rfind('.');
+ if (d < base.length() - 1 && d > 0) base = base.substr(0, d);
+
+ return base;
+}
+
+
+}
+
diff --git a/src/base/AudioPluginInstance.h b/src/base/AudioPluginInstance.h
new file mode 100644
index 0000000..7641228
--- /dev/null
+++ b/src/base/AudioPluginInstance.h
@@ -0,0 +1,172 @@
+// -*- c-indentation-style:"stroustrup" c-basic-offset: 4 -*-
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include <vector>
+#include <string>
+#include <map>
+
+#include "XmlExportable.h"
+
+// An Instrument on needs to implement these to render an instance
+// of the plugin at the sequencer.
+//
+
+#ifndef _AUDIOPLUGININSTANCE_H_
+#define _AUDIOPLUGININSTANCE_H_
+
+namespace Rosegarden
+{
+
+typedef float PortData;
+
+class PluginPort
+{
+public:
+ typedef enum
+ {
+ Input = 0x01,
+ Output = 0x02,
+ Control = 0x04,
+ Audio = 0x08
+ } PortType;
+
+ typedef enum
+ {
+ NoHint = 0x00,
+ Toggled = 0x01,
+ Integer = 0x02,
+ Logarithmic = 0x04
+ } PortDisplayHint;
+
+ PluginPort(int number,
+ std::string m_name,
+ PortType type,
+ PortDisplayHint displayHint,
+ PortData lowerBound,
+ PortData upperBound,
+ PortData defaultValue);
+
+ int getNumber() const { return m_number; }
+ std::string getName() const { return m_name; }
+ PortType getType() const { return m_type; }
+ PortDisplayHint getDisplayHint() const { return m_displayHint; }
+ PortData getLowerBound() const { return m_lowerBound; }
+ PortData getUpperBound() const { return m_upperBound; }
+ PortData getDefaultValue() const { return m_default; }
+
+protected:
+
+ int m_number;
+ std::string m_name;
+ PortType m_type;
+ PortDisplayHint m_displayHint;
+ PortData m_lowerBound;
+ PortData m_upperBound;
+ PortData m_default;
+};
+
+class PluginPortInstance
+{
+public:
+ PluginPortInstance(unsigned int n,
+ float v)
+ : number(n), value(v), changedSinceProgramChange(false) {;}
+
+ int number;
+ PortData value;
+ bool changedSinceProgramChange;
+
+ void setValue(PortData v) { value = v; changedSinceProgramChange = true; }
+};
+
+typedef std::vector<PluginPortInstance*>::iterator PortInstanceIterator;
+
+class AudioPluginInstance : public XmlExportable
+{
+public:
+ AudioPluginInstance(unsigned int position);
+
+ AudioPluginInstance(std::string identifier,
+ unsigned int position);
+
+ void setIdentifier(std::string identifier) { m_identifier = identifier; }
+ std::string getIdentifier() const { return m_identifier; }
+
+ void setPosition(unsigned int position) { m_position = position; }
+ unsigned int getPosition() const { return m_position; }
+
+ PortInstanceIterator begin() { return m_ports.begin(); }
+ PortInstanceIterator end() { return m_ports.end(); }
+
+ // Port management
+ //
+ void addPort(int number, PortData value);
+ bool removePort(int number);
+ PluginPortInstance* getPort(int number);
+ void clearPorts();
+
+ unsigned int getPortCount() const { return m_ports.size(); }
+
+ // export
+ std::string toXmlString();
+
+ // Is the instance assigned to a plugin?
+ //
+ void setAssigned(bool ass) { m_assigned = ass; }
+ bool isAssigned() const { return m_assigned; }
+
+ void setBypass(bool bypass) { m_bypass = bypass; }
+ bool isBypassed() const { return m_bypass; }
+
+ void setProgram(std::string program);
+ std::string getProgram() const { return m_program; }
+
+ int getMappedId() const { return m_mappedId; }
+ void setMappedId(int value) { m_mappedId = value; }
+
+ typedef std::map<std::string, std::string> ConfigMap;
+ void clearConfiguration() { m_config.clear(); }
+ const ConfigMap &getConfiguration() { return m_config; }
+ std::string getConfigurationValue(std::string k) const;
+ void setConfigurationValue(std::string k, std::string v);
+
+ std::string getDistinctiveConfigurationText() const;
+
+protected:
+
+ int m_mappedId;
+ std::string m_identifier;
+ std::vector<PluginPortInstance*> m_ports;
+ unsigned int m_position;
+
+ // Is the plugin actually assigned i.e. should we create
+ // a matching instance at the sequencer?
+ //
+ bool m_assigned;
+ bool m_bypass;
+
+ std::string m_program;
+
+ ConfigMap m_config;
+};
+
+}
+
+#endif // _AUDIOPLUGININSTANCE_H_
diff --git a/src/base/BaseProperties.cpp b/src/base/BaseProperties.cpp
new file mode 100644
index 0000000..adff519
--- /dev/null
+++ b/src/base/BaseProperties.cpp
@@ -0,0 +1,133 @@
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include "BaseProperties.h"
+#include <vector>
+
+#if (__GNUC__ < 3)
+#include <strstream>
+#define stringstream strstream
+#else
+#include <sstream>
+#endif
+
+namespace Rosegarden
+{
+
+namespace BaseProperties
+{
+
+// Some of the most basic property names are defined in individual
+// classes in NotationTypes.h -- those are the ones that are used to
+// store the value of a clef/key/timesig event, whereas things like
+// notes have their values calculated from the duration property.
+
+// We mostly define persistent properties with lower-case names and
+// non-persistent ones with mixed-case. That's just because lower-
+// case looks nicer in XML, whereas mixed-case is friendlier for the
+// sorts of long names sometimes found in cached calculations.
+
+const PropertyName PITCH = "pitch";
+const PropertyName VELOCITY = "velocity";
+const PropertyName ACCIDENTAL = "accidental";
+
+const PropertyName NOTE_TYPE = "notetype";
+const PropertyName NOTE_DOTS = "notedots";
+
+const PropertyName MARK_COUNT = "marks";
+
+PropertyName getMarkPropertyName(int markNo)
+{
+ static std::vector<PropertyName> firstFive;
+
+ if (firstFive.size() == 0) {
+ firstFive.push_back(PropertyName("mark1"));
+ firstFive.push_back(PropertyName("mark2"));
+ firstFive.push_back(PropertyName("mark3"));
+ firstFive.push_back(PropertyName("mark4"));
+ firstFive.push_back(PropertyName("mark5"));
+ }
+
+ if (markNo < 5) return firstFive[markNo];
+
+ // This is slower than it looks, because it means we need to do
+ // the PropertyName interning process for each string -- hence the
+ // firstFive cache
+
+ std::stringstream markPropertyName;
+
+#if (__GNUC__ < 3)
+ markPropertyName << "mark" << (markNo + 1) << std::ends;
+#else
+ markPropertyName << "mark" << (markNo + 1);
+#endif
+
+ return markPropertyName.str();
+}
+
+const PropertyName TIED_BACKWARD = "tiedback";
+const PropertyName TIED_FORWARD = "tiedforward";
+const PropertyName TIE_IS_ABOVE = "tieabove";
+
+// capitalised for back-compatibility (used to be in NotationProperties)
+const PropertyName HEIGHT_ON_STAFF = "HeightOnStaff";
+const PropertyName NOTE_STYLE = "NoteStyle";
+const PropertyName BEAMED = "Beamed";
+
+const PropertyName BEAMED_GROUP_ID = "groupid";
+const PropertyName BEAMED_GROUP_TYPE = "grouptype";
+
+const PropertyName BEAMED_GROUP_TUPLET_BASE = "tupletbase";
+const PropertyName BEAMED_GROUP_TUPLED_COUNT = "tupledcount";
+const PropertyName BEAMED_GROUP_UNTUPLED_COUNT = "untupledcount";
+
+// persistent, but mixed-case anyway
+const PropertyName IS_GRACE_NOTE = "IsGraceNote";
+
+// obsolete
+const PropertyName HAS_GRACE_NOTES = "HasGraceNotes";
+
+// non-persistent
+const PropertyName MAY_HAVE_GRACE_NOTES = "MayHaveGraceNotes";
+
+const std::string GROUP_TYPE_BEAMED = "beamed";
+const std::string GROUP_TYPE_TUPLED = "tupled";
+const std::string GROUP_TYPE_GRACE = "grace";
+
+const PropertyName TRIGGER_SEGMENT_ID = "triggersegmentid";
+const PropertyName TRIGGER_SEGMENT_RETUNE = "triggersegmentretune";
+const PropertyName TRIGGER_SEGMENT_ADJUST_TIMES = "triggersegmentadjusttimes";
+
+const std::string TRIGGER_SEGMENT_ADJUST_NONE = "none";
+const std::string TRIGGER_SEGMENT_ADJUST_SQUISH = "squish";
+const std::string TRIGGER_SEGMENT_ADJUST_SYNC_START = "syncstart";
+const std::string TRIGGER_SEGMENT_ADJUST_SYNC_END = "syncend";
+
+const PropertyName RECORDED_CHANNEL = "recordedchannel";
+const PropertyName RECORDED_PORT = "recordedport";
+
+const PropertyName DISPLACED_X = "displacedx";
+const PropertyName DISPLACED_Y = "displacedy";
+
+const PropertyName INVISIBLE = "invisible";
+
+}
+
+}
+
diff --git a/src/base/BaseProperties.h b/src/base/BaseProperties.h
new file mode 100644
index 0000000..f83b2f7
--- /dev/null
+++ b/src/base/BaseProperties.h
@@ -0,0 +1,82 @@
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _BASE_PROPERTIES_H_
+#define _BASE_PROPERTIES_H_
+
+#include "PropertyName.h"
+
+namespace Rosegarden
+{
+
+namespace BaseProperties
+{
+
+extern const PropertyName PITCH;
+extern const PropertyName VELOCITY;
+extern const PropertyName ACCIDENTAL;
+
+extern const PropertyName NOTE_TYPE;
+extern const PropertyName NOTE_DOTS;
+
+extern const PropertyName MARK_COUNT;
+extern PropertyName getMarkPropertyName(int markNo);
+
+extern const PropertyName TIED_BACKWARD;
+extern const PropertyName TIED_FORWARD;
+extern const PropertyName TIE_IS_ABOVE; // optional; default position if absent
+
+extern const PropertyName BEAMED_GROUP_ID;
+extern const PropertyName BEAMED_GROUP_TYPE;
+
+extern const PropertyName BEAMED_GROUP_TUPLET_BASE;
+extern const PropertyName BEAMED_GROUP_TUPLED_COUNT;
+extern const PropertyName BEAMED_GROUP_UNTUPLED_COUNT;
+
+extern const PropertyName IS_GRACE_NOTE;
+extern const PropertyName HAS_GRACE_NOTES; // obsolete
+extern const PropertyName MAY_HAVE_GRACE_NOTES; // hint for use by performance helper
+
+extern const std::string GROUP_TYPE_BEAMED;
+extern const std::string GROUP_TYPE_TUPLED;
+extern const std::string GROUP_TYPE_GRACE; // obsolete
+
+extern const PropertyName TRIGGER_SEGMENT_ID;
+extern const PropertyName TRIGGER_SEGMENT_RETUNE;
+extern const PropertyName TRIGGER_SEGMENT_ADJUST_TIMES;
+
+extern const std::string TRIGGER_SEGMENT_ADJUST_NONE;
+extern const std::string TRIGGER_SEGMENT_ADJUST_SQUISH;
+extern const std::string TRIGGER_SEGMENT_ADJUST_SYNC_START;
+extern const std::string TRIGGER_SEGMENT_ADJUST_SYNC_END;
+
+extern const PropertyName RECORDED_CHANNEL;
+extern const PropertyName RECORDED_PORT;
+
+extern const PropertyName DISPLACED_X;
+extern const PropertyName DISPLACED_Y;
+
+extern const PropertyName INVISIBLE;
+
+}
+
+}
+
+#endif
+
diff --git a/src/base/BasicQuantizer.cpp b/src/base/BasicQuantizer.cpp
new file mode 100644
index 0000000..7cfc0db
--- /dev/null
+++ b/src/base/BasicQuantizer.cpp
@@ -0,0 +1,253 @@
+// -*- c-basic-offset: 4 -*-
+
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include "BasicQuantizer.h"
+#include "BaseProperties.h"
+#include "NotationTypes.h"
+#include "Selection.h"
+#include "Composition.h"
+#include "Profiler.h"
+
+#include <iostream>
+#include <cmath>
+#include <cstdio> // for sprintf
+#include <ctime>
+
+using std::cout;
+using std::cerr;
+using std::endl;
+
+namespace Rosegarden
+{
+
+using namespace BaseProperties;
+
+const std::string Quantizer::RawEventData = "";
+const std::string Quantizer::DefaultTarget = "DefaultQ";
+const std::string Quantizer::GlobalSource = "GlobalQ";
+const std::string Quantizer::NotationPrefix = "Notation";
+
+BasicQuantizer::BasicQuantizer(timeT unit, bool doDurations,
+ int swing, int iterate) :
+ Quantizer(RawEventData),
+ m_unit(unit),
+ m_durations(doDurations),
+ m_swing(swing),
+ m_iterate(iterate)
+{
+ if (m_unit < 0) m_unit = Note(Note::Shortest).getDuration();
+}
+
+BasicQuantizer::BasicQuantizer(std::string source, std::string target,
+ timeT unit, bool doDurations,
+ int swing, int iterate) :
+ Quantizer(source, target),
+ m_unit(unit),
+ m_durations(doDurations),
+ m_swing(swing),
+ m_iterate(iterate)
+{
+ if (m_unit < 0) m_unit = Note(Note::Shortest).getDuration();
+}
+
+BasicQuantizer::BasicQuantizer(const BasicQuantizer &q) :
+ Quantizer(q.m_target),
+ m_unit(q.m_unit),
+ m_durations(q.m_durations),
+ m_swing(q.m_swing),
+ m_iterate(q.m_iterate)
+{
+ // nothing else
+}
+
+BasicQuantizer::~BasicQuantizer()
+{
+ // nothing
+}
+
+void
+BasicQuantizer::quantizeSingle(Segment *s, Segment::iterator i) const
+{
+ timeT d = getFromSource(*i, DurationValue);
+
+ if (d == 0 && (*i)->isa(Note::EventType)) {
+ s->erase(i);
+ return;
+ }
+
+ if (m_unit == 0) return;
+
+ timeT t = getFromSource(*i, AbsoluteTimeValue);
+ timeT d0(d), t0(t);
+
+ timeT barStart = s->getBarStartForTime(t);
+
+ t -= barStart;
+
+ int n = t / m_unit;
+ timeT low = n * m_unit;
+ timeT high = low + m_unit;
+ timeT swingOffset = (m_unit * m_swing) / 300;
+
+ if (high - t > t - low) {
+ t = low;
+ } else {
+ t = high;
+ ++n;
+ }
+
+ if (n % 2 == 1) {
+ t += swingOffset;
+ }
+
+ if (m_durations && d != 0) {
+
+ low = (d / m_unit) * m_unit;
+ high = low + m_unit;
+
+ if (low > 0 && (high - d > d - low)) {
+ d = low;
+ } else {
+ d = high;
+ }
+
+ int n1 = n + d / m_unit;
+
+ if (n % 2 == 0) { // start not swung
+ if (n1 % 2 == 0) { // end not swung
+ // do nothing
+ } else { // end swung
+ d += swingOffset;
+ }
+ } else { // start swung
+ if (n1 % 2 == 0) { // end not swung
+ d -= swingOffset;
+ } else {
+ // do nothing
+ }
+ }
+ }
+
+ t += barStart;
+
+ timeT t1(t), d1(d);
+ t = (t - t0) * m_iterate / 100 + t0;
+ d = (d - d0) * m_iterate / 100 + d0;
+
+ // if an iterative quantize results in something much closer than
+ // the shortest actual note resolution we have, just snap it
+ if (m_iterate != 100) {
+ timeT close = Note(Note::Shortest).getDuration()/2;
+ if (t >= t1 - close && t <= t1 + close) t = t1;
+ if (d >= d1 - close && d <= d1 + close) d = d1;
+ }
+
+ if (t0 != t || d0 != d) setToTarget(s, i, t, d);
+}
+
+
+std::vector<timeT>
+BasicQuantizer::getStandardQuantizations()
+{
+ checkStandardQuantizations();
+ return m_standardQuantizations;
+}
+
+void
+BasicQuantizer::checkStandardQuantizations()
+{
+ if (m_standardQuantizations.size() > 0) return;
+
+ for (Note::Type nt = Note::Semibreve; nt >= Note::Shortest; --nt) {
+
+ int i1 = (nt < Note::Quaver ? 1 : 0);
+ for (int i = 0; i <= i1; ++i) {
+
+ int divisor = (1 << (Note::Semibreve - nt));
+ if (i) divisor = divisor * 3 / 2;
+
+ timeT unit = Note(Note::Semibreve).getDuration() / divisor;
+ m_standardQuantizations.push_back(unit);
+ }
+ }
+}
+
+timeT
+BasicQuantizer::getStandardQuantization(Segment *s)
+{
+ checkStandardQuantizations();
+ timeT unit = -1;
+
+ for (Segment::iterator i = s->begin(); s->isBeforeEndMarker(i); ++i) {
+
+ if (!(*i)->isa(Rosegarden::Note::EventType)) continue;
+ timeT myUnit = getUnitFor(*i);
+ if (unit < 0 || myUnit < unit) unit = myUnit;
+ }
+
+ return unit;
+}
+
+timeT
+BasicQuantizer::getStandardQuantization(EventSelection *s)
+{
+ checkStandardQuantizations();
+ timeT unit = -1;
+
+ if (!s) return 0;
+
+ for (EventSelection::eventcontainer::iterator i =
+ s->getSegmentEvents().begin();
+ i != s->getSegmentEvents().end(); ++i) {
+
+ if (!(*i)->isa(Rosegarden::Note::EventType)) continue;
+ timeT myUnit = getUnitFor(*i);
+ if (unit < 0 || myUnit < unit) unit = myUnit;
+ }
+
+ return unit;
+}
+
+timeT
+BasicQuantizer::getUnitFor(Event *e)
+{
+ timeT absTime = e->getAbsoluteTime();
+ timeT myQuantizeUnit = 0;
+
+ // m_quantizations is in descending order of duration;
+ // stop when we reach one that divides into the note's time
+
+ for (unsigned int i = 0; i < m_standardQuantizations.size(); ++i) {
+ if (absTime % m_standardQuantizations[i] == 0) {
+ myQuantizeUnit = m_standardQuantizations[i];
+ break;
+ }
+ }
+
+ return myQuantizeUnit;
+}
+
+std::vector<timeT>
+BasicQuantizer::m_standardQuantizations;
+
+
+}
diff --git a/src/base/BasicQuantizer.h b/src/base/BasicQuantizer.h
new file mode 100644
index 0000000..1a9a7b7
--- /dev/null
+++ b/src/base/BasicQuantizer.h
@@ -0,0 +1,95 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef BASIC_QUANTIZER_H
+#define BASIC_QUANTIZER_H
+
+#include "Quantizer.h"
+
+namespace Rosegarden {
+
+class BasicQuantizer : public Quantizer
+{
+public:
+ // The default unit is the shortest note type. A unit of
+ // zero means do no quantization (rather pointlessly).
+ BasicQuantizer(timeT unit = -1, bool doDurations = false,
+ int swingPercent = 0, int iteratePercent = 100);
+ BasicQuantizer(std::string source, std::string target,
+ timeT unit = -1, bool doDurations = false,
+ int swingPercent = 0, int iteratePercent = 100);
+ BasicQuantizer(const BasicQuantizer &);
+ virtual ~BasicQuantizer();
+
+ void setUnit(timeT unit) { m_unit = unit; }
+ timeT getUnit() const { return m_unit; }
+
+ void setDoDurations(bool doDurations) { m_durations = doDurations; }
+ bool getDoDurations() const { return m_durations; }
+
+ void setSwing(int percent) { m_swing = percent; }
+ int getSwing() const { return m_swing; }
+
+ void setIterative(int percent) { m_iterate = percent; }
+ int getIterative() const { return m_iterate; }
+
+ /**
+ * Return the standard quantization units in descending order of
+ * unit duration
+ */
+ static std::vector<timeT> getStandardQuantizations();
+
+ /**
+ * Study the given segment; if all the events in it have times
+ * that match one or more of the standard quantizations, return
+ * the longest standard quantization unit to match. Otherwise
+ * return 0.
+ */
+ static timeT getStandardQuantization(Segment *);
+
+ /**
+ * Study the given selection; if all the events in it have times
+ * that match one or more of the standard quantizations, return
+ * the longest standard quantization unit to match. Otherwise
+ * return 0.
+ */
+ static timeT getStandardQuantization(EventSelection *);
+
+protected:
+ virtual void quantizeSingle(Segment *,
+ Segment::iterator) const;
+
+private:
+ BasicQuantizer &operator=(const BasicQuantizer &); // not provided
+
+ timeT m_unit;
+ bool m_durations;
+ int m_swing;
+ int m_iterate;
+
+ static std::vector<timeT> m_standardQuantizations;
+ static void checkStandardQuantizations();
+ static timeT getUnitFor(Event *);
+};
+
+}
+
+#endif
diff --git a/src/base/Clipboard.cpp b/src/base/Clipboard.cpp
new file mode 100644
index 0000000..71ff03f
--- /dev/null
+++ b/src/base/Clipboard.cpp
@@ -0,0 +1,387 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include "Clipboard.h"
+#include "Selection.h"
+
+namespace Rosegarden
+{
+
+Clipboard::Clipboard() :
+ m_partial(false),
+ m_haveTimeSigSelection(false),
+ m_haveTempoSelection(false),
+ m_nominalStart(0),
+ m_nominalEnd(0)
+{
+ // nothing
+}
+
+Clipboard::Clipboard(const Clipboard &c) :
+ m_partial(false)
+{
+ copyFrom(&c);
+}
+
+Clipboard &
+Clipboard::operator=(const Clipboard &c)
+{
+ copyFrom(&c);
+ return *this;
+}
+
+Clipboard::~Clipboard()
+{
+ clear();
+}
+
+void
+Clipboard::clear()
+{
+ for (iterator i = begin(); i != end(); ++i) {
+ delete *i;
+ }
+ m_segments.clear();
+ clearTimeSignatureSelection();
+ clearTempoSelection();
+ clearNominalRange();
+ m_partial = false;
+}
+
+bool
+Clipboard::isEmpty() const
+{
+ return (m_segments.size() == 0 &&
+ !m_haveTimeSigSelection &&
+ !m_haveTempoSelection &&
+ m_nominalStart == m_nominalEnd);
+}
+
+bool
+Clipboard::isSingleSegment() const
+{
+ return (m_segments.size() == 1 &&
+ !m_haveTimeSigSelection &&
+ !m_haveTempoSelection);
+}
+
+Segment *
+Clipboard::getSingleSegment() const
+{
+ if (isSingleSegment()) return *begin();
+ else return 0;
+}
+
+bool
+Clipboard::isPartial() const
+{
+ return m_partial;
+}
+
+Segment *
+Clipboard::newSegment()
+{
+ Segment *s = new Segment();
+ m_segments.insert(s);
+ // don't change m_partial
+ return s;
+}
+
+Segment *
+Clipboard::newSegment(const Segment *copyFrom)
+{
+ Segment *s = new Segment(*copyFrom);
+ m_segments.insert(s);
+ // don't change m_partial
+ return s;
+}
+
+void
+Clipboard::newSegment(const Segment *copyFrom, timeT from, timeT to,
+ bool expandRepeats)
+{
+ // create with copy ctor so as to inherit track, instrument etc
+ Segment *s = new Segment(*copyFrom);
+
+ if (from <= s->getStartTime() && to >= s->getEndMarkerTime()) {
+ m_segments.insert(s);
+ s->setEndTime(s->getEndMarkerTime());
+ // don't change m_partial
+ return;
+ }
+
+ timeT segStart = copyFrom->getStartTime();
+ timeT segEnd = copyFrom->getEndMarkerTime();
+ timeT segDuration = segEnd - segStart;
+
+ int firstRepeat = 0;
+ int lastRepeat = 0;
+
+ if (!copyFrom->isRepeating() || segDuration <= 0) {
+ expandRepeats = false;
+ }
+
+ if (expandRepeats) {
+ firstRepeat = (from - segStart) / segDuration;
+ lastRepeat = (to - segStart) / segDuration;
+ to = std::min(to, copyFrom->getRepeatEndTime());
+ }
+
+ s->setRepeating(false);
+
+ if (s->getType() == Segment::Audio) {
+
+ Composition *c = copyFrom->getComposition();
+
+ for (int repeat = firstRepeat; repeat <= lastRepeat; ++repeat) {
+
+ timeT wrappedFrom = segStart;
+ timeT wrappedTo = segEnd;
+
+ if (!expandRepeats) {
+ wrappedFrom = from;
+ wrappedTo = to;
+ } else {
+ if (repeat == firstRepeat) {
+ wrappedFrom = segStart + (from - segStart) % segDuration;
+ }
+ if (repeat == lastRepeat) {
+ wrappedTo = segStart + (to - segStart) % segDuration;
+ }
+ }
+
+ if (wrappedFrom > segStart) {
+ if (c) {
+ s->setAudioStartTime
+ (s->getAudioStartTime() +
+ c->getRealTimeDifference(segStart + repeat * segDuration,
+ from));
+ }
+ s->setStartTime(from);
+ } else {
+ s->setStartTime(segStart + repeat * segDuration);
+ }
+
+ if (wrappedTo < segEnd) {
+ s->setEndMarkerTime(to);
+ if (c) {
+ s->setAudioEndTime
+ (s->getAudioStartTime() +
+ c->getRealTimeDifference(segStart + repeat * segDuration,
+ to));
+ }
+ } else {
+ s->setEndMarkerTime(segStart + (repeat + 1) * segDuration);
+ }
+
+ m_segments.insert(s);
+ if (repeat < lastRepeat) {
+ s = new Segment(*copyFrom);
+ s->setRepeating(false);
+ }
+ }
+
+ m_partial = true;
+ return;
+ }
+
+ s->erase(s->begin(), s->end());
+
+ for (int repeat = firstRepeat; repeat <= lastRepeat; ++repeat) {
+
+ Segment::const_iterator ifrom = copyFrom->begin();
+ Segment::const_iterator ito = copyFrom->end();
+
+ if (!expandRepeats) {
+ ifrom = copyFrom->findTime(from);
+ ito = copyFrom->findTime(to);
+ } else {
+ if (repeat == firstRepeat) {
+ ifrom = copyFrom->findTime
+ (segStart + (from - segStart) % segDuration);
+ }
+ if (repeat == lastRepeat) {
+ ito = copyFrom->findTime
+ (segStart + (to - segStart) % segDuration);
+ }
+ }
+
+ for (Segment::const_iterator i = ifrom;
+ i != ito && copyFrom->isBeforeEndMarker(i); ++i) {
+
+ timeT absTime = (*i)->getAbsoluteTime() + repeat * segDuration;
+ timeT duration = (*i)->getDuration();
+
+ Event *e = (*i)->copyMoving(repeat * segDuration);
+
+ if (absTime + duration <= to) {
+
+ s->insert(e);
+
+ } else {
+
+ s->insert(new Event(*e,
+ e->getAbsoluteTime(),
+ duration,
+ e->getSubOrdering(),
+ e->getNotationAbsoluteTime(),
+ e->getNotationDuration()));
+ delete e;
+ }
+ }
+ }
+
+ // need to call getEndMarkerTime() on copyFrom, not on s, because
+ // its return value may depend on the composition it's in
+ if (copyFrom->getEndMarkerTime() > to) {
+ s->setEndMarkerTime(to);
+ }
+
+ m_segments.insert(s);
+ m_partial = true;
+ return;
+}
+
+Segment *
+Clipboard::newSegment(const EventSelection *copyFrom)
+{
+ // create with copy ctor so as to inherit track, instrument etc
+ Segment *s = new Segment(copyFrom->getSegment());
+ s->erase(s->begin(), s->end());
+
+ const EventSelection::eventcontainer &events(copyFrom->getSegmentEvents());
+ for (EventSelection::eventcontainer::const_iterator i = events.begin();
+ i != events.end(); ++i) {
+ s->insert(new Event(**i));
+ }
+
+ m_segments.insert(s);
+ m_partial = true;
+ return s;
+}
+
+void
+Clipboard::setTimeSignatureSelection(const TimeSignatureSelection &ts)
+{
+ m_timeSigSelection = ts;
+ m_haveTimeSigSelection = true;
+}
+
+void
+Clipboard::clearTimeSignatureSelection()
+{
+ m_timeSigSelection = TimeSignatureSelection();
+ m_haveTimeSigSelection = false;
+}
+
+const TimeSignatureSelection &
+Clipboard::getTimeSignatureSelection() const
+{
+ return m_timeSigSelection;
+}
+
+void
+Clipboard::setTempoSelection(const TempoSelection &ts)
+{
+ m_tempoSelection = ts;
+ m_haveTempoSelection = true;
+}
+
+void
+Clipboard::clearTempoSelection()
+{
+ m_tempoSelection = TempoSelection();
+ m_haveTempoSelection = false;
+}
+
+const TempoSelection &
+Clipboard::getTempoSelection() const
+{
+ return m_tempoSelection;
+}
+
+void
+Clipboard::copyFrom(const Clipboard *c)
+{
+ if (c == this) return;
+ clear();
+
+ for (Clipboard::const_iterator i = c->begin(); i != c->end(); ++i) {
+ newSegment(*i);
+ }
+
+ m_partial = c->m_partial;
+
+ m_timeSigSelection = c->m_timeSigSelection;
+ m_haveTimeSigSelection = c->m_haveTimeSigSelection;
+
+ m_tempoSelection = c->m_tempoSelection;
+ m_haveTempoSelection = c->m_haveTempoSelection;
+
+ m_nominalStart = c->m_nominalStart;
+ m_nominalEnd = c->m_nominalEnd;
+}
+
+timeT
+Clipboard::getBaseTime() const
+{
+ if (hasNominalRange()) {
+ return m_nominalStart;
+ }
+
+ timeT t = 0;
+
+ for (iterator i = begin(); i != end(); ++i) {
+ if (i == begin() || (*i)->getStartTime() < t) {
+ t = (*i)->getStartTime();
+ }
+ }
+
+ if (m_haveTimeSigSelection && !m_timeSigSelection.empty()) {
+ if (m_timeSigSelection.begin()->first < t) {
+ t = m_timeSigSelection.begin()->first;
+ }
+ }
+
+ if (m_haveTempoSelection && !m_tempoSelection.empty()) {
+ if (m_tempoSelection.begin()->first < t) {
+ t = m_tempoSelection.begin()->first;
+ }
+ }
+
+ return t;
+}
+
+void
+Clipboard::setNominalRange(timeT start, timeT end)
+{
+ m_nominalStart = start;
+ m_nominalEnd = end;
+}
+
+void
+Clipboard::getNominalRange(timeT &start, timeT &end)
+{
+ start = m_nominalStart;
+ end = m_nominalEnd;
+}
+
+}
diff --git a/src/base/Clipboard.h b/src/base/Clipboard.h
new file mode 100644
index 0000000..e205e33
--- /dev/null
+++ b/src/base/Clipboard.h
@@ -0,0 +1,203 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _CLIPBOARD_H_
+#define _CLIPBOARD_H_
+
+#include <set>
+#include "Segment.h"
+#include "Selection.h"
+
+namespace Rosegarden
+{
+class EventSelection;
+
+/**
+ * Simple container for segments, that can serve as a clipboard for
+ * editing operations. Conceptually it has two "modes",
+ * single-segment and multiple-segment, although there's no particular
+ * distinction behind the scenes. The Clipboard owns all the segments
+ * it contains -- they should always be deep copies, not aliases.
+ */
+
+class Clipboard
+{
+public:
+ typedef std::multiset<Segment *, Segment::SegmentCmp> segmentcontainer;
+ typedef segmentcontainer::iterator iterator;
+ typedef segmentcontainer::const_iterator const_iterator;
+
+ Clipboard();
+ Clipboard(const Clipboard &);
+ Clipboard &operator=(const Clipboard &);
+ virtual ~Clipboard();
+
+ /**
+ * Empty the clipboard.
+ */
+ void clear();
+
+ /**
+ * Return true if the clipboard is empty.
+ */
+ bool isEmpty() const;
+
+ iterator begin() { return m_segments.begin(); }
+ const_iterator begin() const { return m_segments.begin(); }
+ iterator end() { return m_segments.end(); }
+ const_iterator end() const { return m_segments.end(); }
+
+ /**
+ * Return true if the clipboard only contains a single segment.
+ * Single-segment and multi-segment are conceptually rather
+ * separate -- for example, you can only paste into a segment
+ * from a single-segment clipboard.
+ */
+ bool isSingleSegment() const;
+
+ /**
+ * Return true if the clipboard contains at least one segment
+ * that originated as only part of another segment. If a
+ * paste is made from a clipboard with isPartial true, the
+ * paste command will generally want to be sure to normalize
+ * rests etc on the pasted region afterwards.
+ */
+ bool isPartial() const;
+
+ /**
+ * Return the single segment contained by the clipboard.
+ * If the clipboard is empty or contains more than one segment,
+ * returns null. (Use the iterator accessors begin()/end() to
+ * read from a clipboard for which isSingleSegment is false.)
+ */
+ Segment *getSingleSegment() const;
+
+ /**
+ * Add a new empty segment to the clipboard, and return a
+ * pointer to it. (The clipboard retains ownership.)
+ */
+ Segment *newSegment();
+
+ /**
+ * Add a new segment to the clipboard, containing copies of
+ * the events in copyFrom. (The clipboard retains ownership
+ * of the new segment.)
+ */
+ Segment *newSegment(const Segment *copyFrom);
+
+ /**
+ * Add one or more new segments to the clipboard, containing
+ * copies of the events in copyFrom found between from and to. If
+ * expandRepeats is true, include any events found in the
+ * repeating trail of the segment within this time. (The
+ * clipboard retains ownership of the new segment(s).)
+ *
+ * This may insert more than one new segment, if it is required to
+ * insert a repeating section of an audio segment. For this
+ * reason it does not return the inserted segment (even though in
+ * most situations it will only insert one).
+ */
+ void newSegment(const Segment *copyFrom, timeT from, timeT to,
+ bool expandRepeats);
+
+ /**
+ * Add a new segment to the clipboard, containing copied of
+ * the events in the given selection.
+ */
+ Segment *newSegment(const EventSelection *copyFrom);
+
+ /**
+ * Add a time signature selection to this clipboard, replacing any
+ * that already exists.
+ */
+ void setTimeSignatureSelection(const TimeSignatureSelection &);
+
+ bool hasTimeSignatureSelection() const { return m_haveTimeSigSelection; }
+
+ /**
+ * Remove any time signature selection from the clipboard.
+ */
+ void clearTimeSignatureSelection();
+
+ /**
+ * Retrieve any time signature selection found in the clipboard.
+ */
+ const TimeSignatureSelection &getTimeSignatureSelection() const;
+
+ /**
+ * Add a tempo selection to this clipboard, replacing any
+ * that already exists.
+ */
+ void setTempoSelection(const TempoSelection &);
+
+ bool hasTempoSelection() const { return m_haveTempoSelection; }
+
+ /**
+ * Remove any tempo selection from the clipboard.
+ */
+ void clearTempoSelection();
+
+ /**
+ * Retrieve any tempo selection found in the clipboard.
+ */
+ const TempoSelection &getTempoSelection() const;
+
+ /**
+ * Clear the current clipboard and re-fill it by copying from c.
+ */
+ void copyFrom(const Clipboard *c);
+
+ /**
+ * Get the earliest start time for anything in this clipboard,
+ * or the start of the nominal range if there is one.
+ */
+ timeT getBaseTime() const;
+
+ /**
+ * Set nominal start and end times for the range in the clipboard,
+ * if it is intended to cover a particular time range regardless
+ * of whether the data in it covers the full range or not.
+ */
+ void setNominalRange(timeT start, timeT end);
+
+ void clearNominalRange() { setNominalRange(0, 0); }
+
+ bool hasNominalRange() const { return m_nominalStart != m_nominalEnd; }
+
+ void getNominalRange(timeT &start, timeT &end);
+
+private:
+ segmentcontainer m_segments;
+ bool m_partial;
+
+ TimeSignatureSelection m_timeSigSelection;
+ bool m_haveTimeSigSelection;
+
+ TempoSelection m_tempoSelection;
+ bool m_haveTempoSelection;
+
+ timeT m_nominalStart;
+ timeT m_nominalEnd;
+};
+
+}
+
+#endif
diff --git a/src/base/Colour.cpp b/src/base/Colour.cpp
new file mode 100644
index 0000000..ea1f5a2
--- /dev/null
+++ b/src/base/Colour.cpp
@@ -0,0 +1,175 @@
+// -*- c-basic-offset: 4 -*-
+
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ This file is Copyright 2003
+ Mark Hymers <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include "Colour.h"
+
+#if (__GNUC__ < 3)
+#include <strstream>
+#define stringstream strstream
+#else
+#include <sstream>
+#endif
+
+namespace Rosegarden
+{
+
+// The Colour Class
+
+Colour::Colour()
+{
+ m_r = 0;
+ m_g = 0;
+ m_b = 0;
+}
+
+Colour::Colour(const unsigned int red, const unsigned int green, const unsigned int blue)
+{
+ this->setColour(red, green, blue);
+}
+
+Colour::Colour(const Colour& input)
+{
+ this->setColour(input.getRed(), input.getGreen(), input.getBlue());
+}
+
+Colour::~Colour()
+{
+
+}
+
+Colour&
+Colour::operator= (const Colour& input)
+{
+ // We don't have to check for assignment to self because it'll have
+ // no nasty effects (in fact, it'll do what it should - nothing)
+ this->setColour(input.getRed(), input.getGreen(), input.getBlue());
+ return *this;
+}
+
+void
+Colour::setColour(const unsigned int red, const unsigned int green, const unsigned int blue)
+{
+ (red<=255) ? m_r=red : m_r=0;
+ (green<=255) ? m_g=green : m_g=0;
+ (blue<=255) ? m_b=blue : m_b=0;
+}
+
+void
+Colour::getColour(unsigned int &red, unsigned int &green, unsigned int &blue) const
+{
+ red = m_r;
+ green = m_g;
+ blue = m_b;
+}
+
+unsigned int
+Colour::getRed() const
+{
+ return m_r;
+}
+
+unsigned int
+Colour::getBlue() const
+{
+ return m_b;
+}
+
+unsigned int
+Colour::getGreen() const
+{
+ return m_g;
+}
+
+void
+Colour::setRed(const unsigned int red)
+{
+ (red<=255) ? m_r=red : m_r=0;
+}
+
+void
+Colour::setBlue(const unsigned int blue)
+{
+ (blue<=255) ? m_b=blue: m_b=0;
+}
+
+void
+Colour::setGreen(const unsigned int green)
+{
+ (green<=255) ? m_g=green : m_g=0;
+}
+
+Colour
+Colour::getContrastingColour() const
+{
+ Colour ret(255-m_r, 255-m_g, 255-m_b);
+ return ret;
+}
+
+std::string
+Colour::toXmlString() const
+{
+ std::stringstream output;
+
+ output << "<colour red=\"" << m_r
+ << "\" green=\"" << m_g
+ << "\" blue=\"" << m_b
+#if (__GNUC__ < 3)
+ << "\"/>" << std::endl << std::ends;
+#else
+ << "\"/>" << std::endl;
+#endif
+
+ return output.str();
+}
+
+std::string
+Colour::dataToXmlString() const
+{
+ std::stringstream output;
+ output << "red=\"" << m_r
+ << "\" green=\"" << m_g
+ << "\" blue=\"" << m_b
+#if (__GNUC__ < 3)
+ << "\"" << std::ends;
+#else
+ << "\"";
+#endif
+
+ return output.str();
+}
+
+// Generic Colour routines:
+
+Colour
+getCombinationColour(const Colour &input1, const Colour &input2)
+{
+ Colour ret((input1.getRed()+input2.getRed())/2,
+ (input1.getGreen()+input2.getGreen())/2,
+ (input1.getBlue()+input2.getBlue())/2);
+ return ret;
+
+}
+
+}
diff --git a/src/base/Colour.h b/src/base/Colour.h
new file mode 100644
index 0000000..ba8cd6f
--- /dev/null
+++ b/src/base/Colour.h
@@ -0,0 +1,125 @@
+// -*- c-basic-offset: 4 -*-
+
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ This file is Copyright 2003
+ Mark Hymers <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _BASE_COLOUR_H_
+#define _BASE_COLOUR_H_
+
+#include <string>
+
+namespace Rosegarden
+{
+
+/**
+ * Colour is our internal colour storage mechanism; it's extremely basic
+ * but does what it needs to
+ */
+
+class Colour
+{
+public:
+ /**
+ * Create a Colour with values initialised to r=0, g=0, b=0
+ * i.e. Black.
+ */
+ Colour();
+
+ /**
+ * Create a Colour with the specified red, green, blue values.
+ * If out of specification (i.e. < 0 || > 255 the value will be set to 0.
+ */
+ Colour(unsigned int red, unsigned int green, unsigned int blue);
+ Colour(const Colour& input);
+
+ ~Colour();
+ Colour& operator= (const Colour& input);
+
+ /**
+ * Set the colour as appropriate; as with the constructor invalid values
+ * will be set to 0.
+ */
+ void setColour(unsigned int red, unsigned int green, unsigned int blue);
+
+ /**
+ * Sets the three pointers to the values stored in the colour.
+ */
+ void getColour(unsigned int &red, unsigned int &green, unsigned int &blue) const;
+
+ /**
+ * Returns the current Red value of the colour as an integer.
+ */
+ unsigned int getRed() const;
+
+ /**
+ * Returns the current Blue value of the colour as an integer.
+ */
+ unsigned int getBlue() const;
+
+ /**
+ * Returns the current Green value of the colour as an integer.
+ */
+ unsigned int getGreen() const;
+
+ /**
+ * Sets the Red value of the current colour. If the value isn't
+ * between 0 and 255 inclusive, it will set to 0
+ */
+ void setRed(unsigned int input);
+
+ /**
+ * Sets the Blue value of the current colour. If the value isn't
+ * between 0 and 255 inclusive, it will set to 0
+ */
+ void setBlue(unsigned int input);
+
+ /**
+ * Sets the Green value of the current colour. If the value isn't
+ * between 0 and 255 inclusive, it will set to 0
+ */
+ void setGreen(unsigned int input);
+
+ /**
+ * This uses a simple calculation to give us a contrasting colour.
+ * Useful for working out a visible text colour given
+ * any background colour
+ */
+ Colour getContrastingColour() const;
+
+ std::string toXmlString() const;
+
+ std::string dataToXmlString() const;
+
+private:
+ unsigned int m_r, m_g, m_b;
+};
+
+ /**
+ * This works out a colour which is directly in between the two inputs.
+ * Useful for working out what overlapping Segments should be coloured as
+ */
+ Colour getCombinationColour(const Colour &input1, const Colour &input2);
+
+}
+
+#endif
diff --git a/src/base/ColourMap.cpp b/src/base/ColourMap.cpp
new file mode 100644
index 0000000..322a4a7
--- /dev/null
+++ b/src/base/ColourMap.cpp
@@ -0,0 +1,266 @@
+// -*- c-basic-offset: 4 -*-
+
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ This file is Copyright 2003
+ Mark Hymers <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include <string>
+
+#if (__GNUC__ < 3)
+#include <strstream>
+#define stringstream strstream
+#else
+#include <sstream>
+#endif
+
+#include "ColourMap.h"
+#include "XmlExportable.h"
+
+namespace Rosegarden
+{
+
+ColourMap::ColourMap()
+{
+ // Set up the default colour. The #defines can be found in ColourMap.h
+ Colour tempcolour(COLOUR_DEF_R, COLOUR_DEF_G, COLOUR_DEF_B);
+ m_map[0] = make_pair(tempcolour, std::string(""));
+}
+
+ColourMap::ColourMap(const Colour& input)
+{
+ // Set up the default colour based on the input
+ m_map[0] = make_pair(input, std::string(""));
+}
+
+ColourMap::~ColourMap()
+{
+ // Everything should destroy itself automatically
+}
+
+bool
+ColourMap::deleteItemByIndex(const unsigned int item_num)
+{
+ // We explicitly refuse to delete the default colour
+ if (item_num == 0)
+ return false;
+
+ unsigned int n_e = m_map.erase(item_num);
+ if (n_e != 0)
+ {
+ return true;
+ }
+
+ // Otherwise we didn't find the right item
+ return false;
+}
+
+Colour
+ColourMap::getColourByIndex(const unsigned int item_num) const
+{
+ // Iterate over the m_map and if we find a match, return the
+ // Colour. If we don't match, return the default colour. m_map
+ // was initialised with at least one item in the ctor, so this is
+ // safe.
+ Colour ret = (*m_map.begin()).second.first;
+
+ for (RCMap::const_iterator position = m_map.begin();
+ position != m_map.end(); ++position)
+ if (position->first == item_num)
+ ret = position->second.first;
+
+ return ret;
+}
+
+std::string
+ColourMap::getNameByIndex(const unsigned int item_num) const
+{
+ // Iterate over the m_map and if we find a match, return the name.
+ // If we don't match, return the default colour's name. m_map was
+ // initialised with at least one item in the ctor, so this is
+ // safe.
+ std::string ret = (*m_map.begin()).second.second;
+
+ for (RCMap::const_iterator position = m_map.begin();
+ position != m_map.end(); ++position)
+ if (position->first == item_num)
+ ret = position->second.second;
+
+ return ret;
+}
+
+bool
+ColourMap::addItem(const Colour colour, const std::string name)
+{
+ // If we want to limit the number of colours, here's the place to do it
+ unsigned int highest=0;
+
+ for (RCMap::iterator position = m_map.begin(); position != m_map.end(); ++position)
+ {
+ if (position->first != highest)
+ break;
+
+ ++highest;
+ }
+
+ m_map[highest] = make_pair(colour, name);
+
+ return true;
+}
+
+// WARNING: This version of addItem is only for use by rosexmlhandler.cpp
+bool
+ColourMap::addItem(const Colour colour, const std::string name, const unsigned int id)
+{
+ m_map[id] = make_pair(colour, name);
+
+ return true;
+}
+
+bool
+ColourMap::modifyNameByIndex(const unsigned int item_num, const std::string name)
+{
+ // We don't allow a name to be given to the default colour
+ if (item_num == 0)
+ return false;
+
+ for (RCMap::iterator position = m_map.begin(); position != m_map.end(); ++position)
+ if (position->first == item_num)
+ {
+ position->second.second = name;
+ return true;
+ }
+
+ // We didn't find the element
+ return false;
+}
+
+bool
+ColourMap::modifyColourByIndex(const unsigned int item_num, const Colour colour)
+{
+ for (RCMap::iterator position = m_map.begin(); position != m_map.end(); ++position)
+ if (position->first == item_num)
+ {
+ position->second.first = colour;
+ return true;
+ }
+
+ // We didn't find the element
+ return false;
+}
+
+bool
+ColourMap::swapItems(const unsigned int item_1, const unsigned int item_2)
+{
+ // It would make no difference but we return false because
+ // we haven't altered the iterator (see docs in ColourMap.h)
+ if (item_1 == item_2)
+ return false;
+
+ // We refuse to swap the default colour for something else
+ // Basically because what would we do with the strings?
+ if ((item_1 == 0) || (item_2 == 0))
+ return false;
+
+ unsigned int one = 0, two = 0;
+
+ // Check that both elements exist
+ // It's not worth bothering about optimising this
+ for (RCMap::iterator position = m_map.begin(); position != m_map.end(); ++position)
+ {
+ if (position->first == item_1) one = position->first;
+ if (position->first == item_2) two = position->first;
+ }
+
+ // If they both exist, do it
+ // There's probably a nicer way to do this
+ if ((one != 0) && (two != 0))
+ {
+ Colour tempC = m_map[one].first;
+ std::string tempS = m_map[one].second;
+ m_map[one].first = m_map[two].first;
+ m_map[one].second = m_map[two].second;
+ m_map[two].first = tempC;
+ m_map[two].second = tempS;
+
+ return true;
+ }
+
+ // Else they didn't
+ return false;
+}
+
+RCMap::const_iterator
+ColourMap::begin()
+{
+ RCMap::const_iterator ret = m_map.begin();
+ return ret;
+}
+
+RCMap::const_iterator
+ColourMap::end()
+{
+ RCMap::const_iterator ret = m_map.end();
+ return ret;
+}
+
+ColourMap&
+ColourMap::operator=(const ColourMap& input)
+{
+ if (this != &input)
+ m_map = input.m_map;
+
+ return *this;
+}
+
+int
+ColourMap::size() const
+{
+ return m_map.size();
+}
+
+std::string
+ColourMap::toXmlString(std::string name) const
+{
+ std::stringstream output;
+
+ output << " <colourmap name=\"" << XmlExportable::encode(name)
+ << "\">" << std::endl;
+
+ for (RCMap::const_iterator pos = m_map.begin(); pos != m_map.end(); ++pos)
+ {
+ output << " " << " <colourpair id=\"" << pos->first
+ << "\" name=\"" << XmlExportable::encode(pos->second.second)
+ << "\" " << pos->second.first.dataToXmlString() << "/>" << std::endl;
+ }
+
+#if (__GNUC__ < 3)
+ output << " </colourmap>" << std::endl << std::ends;
+#else
+ output << " </colourmap>" << std::endl;
+#endif
+
+
+ return output.str();
+
+}
+
+}
diff --git a/src/base/ColourMap.h b/src/base/ColourMap.h
new file mode 100644
index 0000000..973c1e0
--- /dev/null
+++ b/src/base/ColourMap.h
@@ -0,0 +1,138 @@
+// -*- c-basic-offset: 4 -*-
+
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ This file is Copyright 2003
+ Mark Hymers <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include <utility>
+#include <map>
+#include <string>
+#include "Colour.h"
+
+#ifndef _BASE_COLOURMAP_H_
+#define _BASE_COLOURMAP_H_
+
+// These are the default, default colour
+#define COLOUR_DEF_R 255
+#define COLOUR_DEF_G 234
+#define COLOUR_DEF_B 182
+
+namespace Rosegarden
+{
+ typedef std::map<unsigned int, std::pair<Colour, std::string>, std::less<unsigned int> > RCMap;
+
+/**
+ * ColourMap is our table which maps the unsigned integer keys stored in
+ * segments to both a Colour and a String containing the 'name'
+ */
+
+class ColourMap
+{
+public:
+ // Functions:
+
+ /**
+ * Initialises an ColourMap with a default element set to
+ * whatever COLOUR_DEF_X defines the colour to be (see the source file)
+ */
+ ColourMap();
+ /**
+ * Initialises an ColourMap with a default element set to
+ * the value of the Colour passed in.
+ */
+ ColourMap(const Colour& input);
+ ~ColourMap();
+
+ /**
+ * Returns the Colour associated with the item_num passed in. Note that
+ * if the item_num doesn't represent a valid item, the routine returns
+ * the value of the Default colour. This means that if somehow some of
+ * the Segments get out of sync with the ColourMap and have invalid
+ * colour values, they'll be set to the Composition default colour.
+ */
+ Colour getColourByIndex(unsigned int item_num) const;
+
+ /**
+ * Returns the string associated with the item_num passed in. If the
+ * item_num doesn't exist, it'll return "" (the same name as the default
+ * colour has - for internationalization reasons).
+ */
+ std::string getNameByIndex(unsigned int item_num) const;
+
+ /**
+ * If item_num exists, this routine deletes it from the map.
+ */
+ bool deleteItemByIndex(unsigned int item_num);
+
+ /**
+ * This routine adds a Colour using the lowest possible index.
+ */
+ bool addItem(Colour colour, std::string name);
+
+ /**
+ * This routine adds a Colour using the given id. ONLY FOR USE IN
+ * rosexmlhandler.cpp
+ */
+ bool addItem(Colour colour, std::string name, unsigned int id);
+
+ /**
+ * If the item with item_num exists and isn't the default, this
+ * routine modifies the string associated with it
+ */
+ bool modifyNameByIndex(unsigned int item_num, std::string name);
+
+ /**
+ * If the item with item_num exists, this routine modifies the
+ * Colour associated with it
+ */
+ bool modifyColourByIndex(unsigned int item_num, Colour colour);
+
+ /**
+ * If both items exist, swap them.
+ */
+ bool swapItems(unsigned int item_1, unsigned int item_2);
+
+// void replace(ColourMap &input);
+
+ /**
+ * This returns a const iterator pointing to m_map.begin()
+ */
+ RCMap::const_iterator begin();
+
+ /**
+ * This returns a const iterator pointing to m_map.end()
+ */
+ RCMap::const_iterator end();
+
+ std::string toXmlString(std::string name) const;
+
+ ColourMap& operator=(const ColourMap& input);
+
+ int size() const;
+
+private:
+ RCMap m_map;
+};
+
+}
+
+#endif
diff --git a/src/base/Composition.cpp b/src/base/Composition.cpp
new file mode 100644
index 0000000..cde3a8b
--- /dev/null
+++ b/src/base/Composition.cpp
@@ -0,0 +1,2225 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include "Composition.h"
+#include "misc/Debug.h"
+#include "Segment.h"
+#include "FastVector.h"
+#include "BaseProperties.h"
+#include "BasicQuantizer.h"
+#include "NotationQuantizer.h"
+
+#include <iostream>
+#include <iomanip>
+#include <algorithm>
+#include <cmath>
+#include <typeinfo>
+
+#if (__GNUC__ < 3)
+#include <strstream>
+#define stringstream strstream
+#else
+#include <sstream>
+#endif
+
+using std::cerr;
+using std::endl;
+
+//#define DEBUG_BAR_STUFF 1
+//#define DEBUG_TEMPO_STUFF 1
+
+
+namespace Rosegarden
+{
+
+const PropertyName Composition::NoAbsoluteTimeProperty = "NoAbsoluteTime";
+const PropertyName Composition::BarNumberProperty = "BarNumber";
+
+const std::string Composition::TempoEventType = "tempo";
+const PropertyName Composition::TempoProperty = "Tempo";
+const PropertyName Composition::TargetTempoProperty = "TargetTempo";
+const PropertyName Composition::TempoTimestampProperty = "TimestampSec";
+
+
+bool
+Composition::ReferenceSegmentEventCmp::operator()(const Event &e1,
+ const Event &e2) const
+{
+ if (e1.has(NoAbsoluteTimeProperty) ||
+ e2.has(NoAbsoluteTimeProperty)) {
+ RealTime r1 = getTempoTimestamp(&e1);
+ RealTime r2 = getTempoTimestamp(&e2);
+ return r1 < r2;
+ } else {
+ return e1 < e2;
+ }
+}
+
+Composition::ReferenceSegment::ReferenceSegment(std::string eventType) :
+ m_eventType(eventType)
+{
+ // nothing
+}
+
+Composition::ReferenceSegment::~ReferenceSegment()
+{
+ clear();
+}
+
+void
+Composition::ReferenceSegment::clear()
+{
+ for (iterator it = begin(); it != end(); ++it) delete (*it);
+ Impl::erase(begin(), end());
+}
+
+timeT
+Composition::ReferenceSegment::getDuration() const
+{
+ const_iterator i = end();
+ if (i == begin()) return 0;
+ --i;
+
+ return (*i)->getAbsoluteTime() + (*i)->getDuration();
+}
+
+Composition::ReferenceSegment::iterator
+Composition::ReferenceSegment::find(Event *e)
+{
+ return std::lower_bound
+ (begin(), end(), e, ReferenceSegmentEventCmp());
+}
+
+Composition::ReferenceSegment::iterator
+Composition::ReferenceSegment::insert(Event *e)
+{
+ if (!e->isa(m_eventType)) {
+ throw Event::BadType(std::string("event in ReferenceSegment"),
+ m_eventType, e->getType(), __FILE__, __LINE__);
+ }
+
+ iterator i = find(e);
+
+ if (i != end() && (*i)->getAbsoluteTime() == e->getAbsoluteTime()) {
+
+ Event *old = (*i);
+ (*i) = e;
+ delete old;
+ return i;
+
+ } else {
+ return Impl::insert(i, e);
+ }
+}
+
+void
+Composition::ReferenceSegment::erase(Event *e)
+{
+ iterator i = find(e);
+ if (i != end()) Impl::erase(i);
+}
+
+Composition::ReferenceSegment::iterator
+Composition::ReferenceSegment::findTime(timeT t)
+{
+ Event dummy("dummy", t, 0, MIN_SUBORDERING);
+ return find(&dummy);
+}
+
+Composition::ReferenceSegment::iterator
+Composition::ReferenceSegment::findRealTime(RealTime t)
+{
+ Event dummy("dummy", 0, 0, MIN_SUBORDERING);
+ dummy.set<Bool>(NoAbsoluteTimeProperty, true);
+ setTempoTimestamp(&dummy, t);
+ return find(&dummy);
+}
+
+Composition::ReferenceSegment::iterator
+Composition::ReferenceSegment::findNearestTime(timeT t)
+{
+ iterator i = findTime(t);
+ if (i == end() || (*i)->getAbsoluteTime() > t) {
+ if (i == begin()) return end();
+ else --i;
+ }
+ return i;
+}
+
+Composition::ReferenceSegment::iterator
+Composition::ReferenceSegment::findNearestRealTime(RealTime t)
+{
+ iterator i = findRealTime(t);
+ if (i == end() || (getTempoTimestamp(*i) > t)) {
+ if (i == begin()) return end();
+ else --i;
+ }
+ return i;
+}
+
+
+
+int Composition::m_defaultNbBars = 100;
+
+Composition::Composition() :
+ m_solo(false), // default is not soloing
+ m_selectedTrack(0),
+ m_timeSigSegment(TimeSignature::EventType),
+ m_tempoSegment(TempoEventType),
+ m_barPositionsNeedCalculating(true),
+ m_tempoTimestampsNeedCalculating(true),
+ m_basicQuantizer(new BasicQuantizer()),
+ m_notationQuantizer(new NotationQuantizer()),
+ m_position(0),
+ m_defaultTempo(getTempoForQpm(120.0)),
+ m_minTempo(0),
+ m_maxTempo(0),
+ m_startMarker(0),
+ m_endMarker(getBarRange(m_defaultNbBars).first),
+ m_loopStart(0),
+ m_loopEnd(0),
+ m_playMetronome(false),
+ m_recordMetronome(true),
+ m_nextTriggerSegmentId(0)
+{
+ // nothing else
+}
+
+Composition::~Composition()
+{
+ if (!m_observers.empty()) {
+ cerr << "Warning: Composition::~Composition() with " << m_observers.size()
+ << " observers still extant" << endl;
+ cerr << "Observers are:";
+ for (ObserverSet::const_iterator i = m_observers.begin();
+ i != m_observers.end(); ++i) {
+ cerr << " " << (void *)(*i);
+ cerr << " [" << typeid(**i).name() << "]";
+ }
+ cerr << endl;
+ }
+
+ notifySourceDeletion();
+ clear();
+ delete m_basicQuantizer;
+ delete m_notationQuantizer;
+}
+
+Composition::iterator
+Composition::addSegment(Segment *segment)
+{
+ iterator res = weakAddSegment(segment);
+
+ if (res != end()) {
+ updateRefreshStatuses();
+ notifySegmentAdded(segment);
+ }
+
+ return res;
+}
+
+Composition::iterator
+Composition::weakAddSegment(Segment *segment)
+{
+ if (!segment) return end();
+
+ iterator res = m_segments.insert(segment);
+ segment->setComposition(this);
+
+ return res;
+}
+
+void
+Composition::deleteSegment(Composition::iterator i)
+{
+ if (i == end()) return;
+
+ Segment *p = (*i);
+ p->setComposition(0);
+
+ m_segments.erase(i);
+ notifySegmentRemoved(p);
+ delete p;
+
+ updateRefreshStatuses();
+}
+
+bool
+Composition::deleteSegment(Segment *segment)
+{
+ iterator i = findSegment(segment);
+ if (i == end()) return false;
+
+ deleteSegment(i);
+ return true;
+}
+
+bool
+Composition::detachSegment(Segment *segment)
+{
+ bool res = weakDetachSegment(segment);
+
+ if (res) {
+ notifySegmentRemoved(segment);
+ updateRefreshStatuses();
+ }
+
+ return res;
+}
+
+bool
+Composition::weakDetachSegment(Segment *segment)
+{
+ iterator i = findSegment(segment);
+ if (i == end()) return false;
+
+ segment->setComposition(0);
+ m_segments.erase(i);
+
+ return true;
+}
+
+bool
+Composition::contains(const Segment *s)
+{
+ iterator i = findSegment(s);
+ return (i != end());
+}
+
+Composition::iterator
+Composition::findSegment(const Segment *s)
+{
+ iterator i = m_segments.lower_bound(const_cast<Segment*>(s));
+
+ while (i != end()) {
+ if (*i == s) break;
+ if ((*i)->getStartTime() > s->getStartTime()) return end();
+ ++i;
+ }
+
+ return i;
+}
+
+void Composition::setSegmentStartTime(Segment *segment, timeT startTime)
+{
+ // remove the segment from the multiset
+ iterator i = findSegment(segment);
+ if (i == end()) return;
+
+ m_segments.erase(i);
+
+ segment->setStartTimeDataMember(startTime);
+
+ // re-add it
+ m_segments.insert(segment);
+}
+
+int
+Composition::getMaxContemporaneousSegmentsOnTrack(TrackId track) const
+{
+ // Could be made faster, but only if it needs to be.
+
+ // This is similar to the polyphony calculation in
+ // DocumentMetaConfigurationPage ctor.
+
+ std::set<Segment *> simultaneous;
+ std::multimap<timeT, Segment *> ends;
+
+ int maximum = 0;
+
+ for (const_iterator i = begin(); i != end(); ++i) {
+ if ((*i)->getTrack() != track) continue;
+ timeT t0 = (*i)->getStartTime();
+ timeT t1 = (*i)->getRepeatEndTime();
+// std::cerr << "getMaxContemporaneousSegmentsOnTrack(" << track << "): segment " << *i << " from " << t0 << " to " << t1 << std::endl;
+ while (!ends.empty() && t0 >= ends.begin()->first) {
+ simultaneous.erase(ends.begin()->second);
+ ends.erase(ends.begin());
+ }
+ simultaneous.insert(*i);
+ ends.insert(std::multimap<timeT, Segment *>::value_type(t1, *i));
+ int current = simultaneous.size();
+ if (current > maximum) maximum = current;
+ }
+
+ return maximum;
+}
+
+int
+Composition::getSegmentVoiceIndex(const Segment *segment) const
+{
+ TrackId track = segment->getTrack();
+
+ // See function above
+
+ std::map<Segment *, int> indices;
+ std::set<int> used;
+ std::multimap<timeT, Segment *> ends;
+
+ int maximum = 0;
+
+ for (const_iterator i = begin(); i != end(); ++i) {
+ if ((*i)->getTrack() != track) continue;
+ timeT t0 = (*i)->getStartTime();
+ timeT t1 = (*i)->getRepeatEndTime();
+ int index;
+ while (!ends.empty() && t0 >= ends.begin()->first) {
+ index = indices[ends.begin()->second];
+ used.erase(index);
+ indices.erase(ends.begin()->second);
+ ends.erase(ends.begin());
+ }
+ for (index = 0; ; ++index) {
+ if (used.find(index) == used.end()) break;
+ }
+ if (*i == segment) return index;
+ indices[*i] = index;
+ used.insert(index);
+ ends.insert(std::multimap<timeT, Segment *>::value_type(t1, *i));
+ }
+
+ std::cerr << "WARNING: Composition::getSegmentVoiceIndex: segment "
+ << segment << " not found in composition" << std::endl;
+ return 0;
+}
+
+TriggerSegmentRec *
+Composition::addTriggerSegment(Segment *s, int pitch, int velocity)
+{
+ TriggerSegmentId id = m_nextTriggerSegmentId;
+ return addTriggerSegment(s, id, pitch, velocity);
+}
+
+TriggerSegmentRec *
+Composition::addTriggerSegment(Segment *s, TriggerSegmentId id, int pitch, int velocity)
+{
+ TriggerSegmentRec *rec = getTriggerSegmentRec(id);
+ if (rec) return 0;
+ rec = new TriggerSegmentRec(id, s, pitch, velocity);
+ m_triggerSegments.insert(rec);
+ s->setComposition(this);
+ if (m_nextTriggerSegmentId <= id) m_nextTriggerSegmentId = id + 1;
+ return rec;
+}
+
+void
+Composition::deleteTriggerSegment(TriggerSegmentId id)
+{
+ TriggerSegmentRec dummyRec(id, 0);
+ triggersegmentcontaineriterator i = m_triggerSegments.find(&dummyRec);
+ if (i == m_triggerSegments.end()) return;
+ (*i)->getSegment()->setComposition(0);
+ delete (*i)->getSegment();
+ delete *i;
+ m_triggerSegments.erase(i);
+}
+
+void
+Composition::detachTriggerSegment(TriggerSegmentId id)
+{
+ TriggerSegmentRec dummyRec(id, 0);
+ triggersegmentcontaineriterator i = m_triggerSegments.find(&dummyRec);
+ if (i == m_triggerSegments.end()) return;
+ (*i)->getSegment()->setComposition(0);
+ delete *i;
+ m_triggerSegments.erase(i);
+}
+
+void
+Composition::clearTriggerSegments()
+{
+ for (triggersegmentcontaineriterator i = m_triggerSegments.begin();
+ i != m_triggerSegments.end(); ++i) {
+ delete (*i)->getSegment();
+ delete *i;
+ }
+ m_triggerSegments.clear();
+}
+
+int
+Composition::getTriggerSegmentId(Segment *s)
+{
+ for (triggersegmentcontaineriterator i = m_triggerSegments.begin();
+ i != m_triggerSegments.end(); ++i) {
+ if ((*i)->getSegment() == s) return (*i)->getId();
+ }
+ return -1;
+}
+
+Segment *
+Composition::getTriggerSegment(TriggerSegmentId id)
+{
+ TriggerSegmentRec *rec = getTriggerSegmentRec(id);
+ if (!rec) return 0;
+ return rec->getSegment();
+}
+
+TriggerSegmentRec *
+Composition::getTriggerSegmentRec(TriggerSegmentId id)
+{
+ TriggerSegmentRec dummyRec(id, 0);
+ triggersegmentcontaineriterator i = m_triggerSegments.find(&dummyRec);
+ if (i == m_triggerSegments.end()) return 0;
+ return *i;
+}
+
+TriggerSegmentId
+Composition::getNextTriggerSegmentId() const
+{
+ return m_nextTriggerSegmentId;
+}
+
+void
+Composition::setNextTriggerSegmentId(TriggerSegmentId id)
+{
+ m_nextTriggerSegmentId = id;
+}
+
+void
+Composition::updateTriggerSegmentReferences()
+{
+ std::map<TriggerSegmentId, TriggerSegmentRec::SegmentRuntimeIdSet> refs;
+
+ for (iterator i = begin(); i != end(); ++i) {
+ for (Segment::iterator j = (*i)->begin(); j != (*i)->end(); ++j) {
+ if ((*j)->has(BaseProperties::TRIGGER_SEGMENT_ID)) {
+ TriggerSegmentId id =
+ (*j)->get<Int>(BaseProperties::TRIGGER_SEGMENT_ID);
+ refs[id].insert((*i)->getRuntimeId());
+ }
+ }
+ }
+
+ for (std::map<TriggerSegmentId,
+ TriggerSegmentRec::SegmentRuntimeIdSet>::iterator i = refs.begin();
+ i != refs.end(); ++i) {
+ TriggerSegmentRec *rec = getTriggerSegmentRec(i->first);
+ if (rec) rec->setReferences(i->second);
+ }
+}
+
+
+timeT
+Composition::getDuration() const
+{
+ timeT maxDuration = 0;
+
+ for (segmentcontainer::const_iterator i = m_segments.begin();
+ i != m_segments.end(); ++i) {
+
+ timeT segmentTotal = (*i)->getEndTime();
+
+ if (segmentTotal > maxDuration) {
+ maxDuration = segmentTotal;
+ }
+ }
+
+ return maxDuration;
+}
+
+void
+Composition::setStartMarker(const timeT &sM)
+{
+ m_startMarker = sM;
+ updateRefreshStatuses();
+}
+
+void
+Composition::setEndMarker(const timeT &eM)
+{
+ bool shorten = (eM < m_endMarker);
+ m_endMarker = eM;
+ updateRefreshStatuses();
+ notifyEndMarkerChange(shorten);
+}
+
+void
+Composition::clear()
+{
+ while (m_segments.size() > 0) {
+ deleteSegment(begin());
+ }
+
+ clearTracks();
+ clearMarkers();
+ clearTriggerSegments();
+
+ m_timeSigSegment.clear();
+ m_tempoSegment.clear();
+ m_defaultTempo = getTempoForQpm(120.0);
+ m_minTempo = 0;
+ m_maxTempo = 0;
+ m_loopStart = 0;
+ m_loopEnd = 0;
+ m_position = 0;
+ m_startMarker = 0;
+ m_endMarker = getBarRange(m_defaultNbBars).first;
+ m_solo = false;
+ m_selectedTrack = 0;
+ updateRefreshStatuses();
+}
+
+void
+Composition::calculateBarPositions() const
+{
+ if (!m_barPositionsNeedCalculating) return;
+
+#ifdef DEBUG_BAR_STUFF
+ cerr << "Composition::calculateBarPositions" << endl;
+#endif
+
+ ReferenceSegment &t = m_timeSigSegment;
+ ReferenceSegment::iterator i;
+
+ timeT lastBarNo = 0;
+ timeT lastSigTime = 0;
+ timeT barDuration = TimeSignature().getBarDuration();
+
+ if (getStartMarker() < 0) {
+ if (!t.empty() && (*t.begin())->getAbsoluteTime() <= 0) {
+ barDuration = TimeSignature(**t.begin()).getBarDuration();
+ }
+ lastBarNo = getStartMarker() / barDuration;
+ lastSigTime = getStartMarker();
+#ifdef DEBUG_BAR_STUFF
+ cerr << "Composition::calculateBarPositions: start marker = " << getStartMarker() << ", so initial bar number = " << lastBarNo << endl;
+#endif
+ }
+
+ for (i = t.begin(); i != t.end(); ++i) {
+
+ timeT myTime = (*i)->getAbsoluteTime();
+ int n = (myTime - lastSigTime) / barDuration;
+
+ // should only happen for first time sig, when it's at time < 0:
+ if (myTime < lastSigTime) --n;
+
+ // would there be a new bar here anyway?
+ if (barDuration * n + lastSigTime == myTime) { // yes
+ n += lastBarNo;
+ } else { // no
+ n += lastBarNo + 1;
+ }
+
+#ifdef DEBUG_BAR_STUFF
+ cerr << "Composition::calculateBarPositions: bar " << n
+ << " at " << myTime << endl;
+#endif
+
+ (*i)->set<Int>(BarNumberProperty, n);
+
+ lastBarNo = n;
+ lastSigTime = myTime;
+ barDuration = TimeSignature(**i).getBarDuration();
+ }
+
+ m_barPositionsNeedCalculating = false;
+}
+
+int
+Composition::getNbBars() const
+{
+ calculateBarPositions();
+
+ // the "-1" is a small kludge to deal with the case where the
+ // composition has a duration that's an exact number of bars
+ int bars = getBarNumber(getDuration() - 1) + 1;
+
+#ifdef DEBUG_BAR_STUFF
+ cerr << "Composition::getNbBars: returning " << bars << endl;
+#endif
+ return bars;
+}
+
+int
+Composition::getBarNumber(timeT t) const
+{
+ calculateBarPositions();
+ ReferenceSegment::iterator i = m_timeSigSegment.findNearestTime(t);
+ int n;
+
+ if (i == m_timeSigSegment.end()) { // precedes any time signatures
+
+ timeT bd = TimeSignature().getBarDuration();
+ if (t < 0) { // see comment in getTimeSignatureAtAux
+ i = m_timeSigSegment.begin();
+ if (i != m_timeSigSegment.end() && (*i)->getAbsoluteTime() <= 0) {
+ bd = TimeSignature(**i).getBarDuration();
+ }
+ }
+
+ n = t / bd;
+ if (t < 0) {
+ // negative bars should be rounded down, except where
+ // the time is on a barline in which case we already
+ // have the right value (i.e. time -1920 is bar -1,
+ // but time -3840 is also bar -1, in 4/4)
+ if (n * bd != t) --n;
+ }
+
+ } else {
+
+ n = (*i)->get<Int>(BarNumberProperty);
+ timeT offset = t - (*i)->getAbsoluteTime();
+ n += offset / TimeSignature(**i).getBarDuration();
+ }
+
+#ifdef DEBUG_BAR_STUFF
+ cerr << "Composition::getBarNumber(" << t << "): returning " << n << endl;
+#endif
+ return n;
+}
+
+
+std::pair<timeT, timeT>
+Composition::getBarRangeForTime(timeT t) const
+{
+ return getBarRange(getBarNumber(t));
+}
+
+
+std::pair<timeT, timeT>
+Composition::getBarRange(int n) const
+{
+ calculateBarPositions();
+
+ Event dummy("dummy", 0);
+ dummy.set<Int>(BarNumberProperty, n);
+
+ ReferenceSegment::iterator j = std::lower_bound
+ (m_timeSigSegment.begin(), m_timeSigSegment.end(),
+ &dummy, BarNumberComparator());
+ ReferenceSegment::iterator i = j;
+
+ if (i == m_timeSigSegment.end() || (*i)->get<Int>(BarNumberProperty) > n) {
+ if (i == m_timeSigSegment.begin()) i = m_timeSigSegment.end();
+ else --i;
+ } else ++j; // j needs to point to following barline
+
+ timeT start, finish;
+
+ if (i == m_timeSigSegment.end()) { // precedes any time sig changes
+
+ timeT barDuration = TimeSignature().getBarDuration();
+ if (n < 0) { // see comment in getTimeSignatureAtAux
+ i = m_timeSigSegment.begin();
+ if (i != m_timeSigSegment.end() && (*i)->getAbsoluteTime() <= 0) {
+ barDuration = TimeSignature(**i).getBarDuration();
+ }
+ }
+
+ start = n * barDuration;
+ finish = start + barDuration;
+
+#ifdef DEBUG_BAR_STUFF
+ cerr << "Composition::getBarRange[1]: bar " << n << ": (" << start
+ << " -> " << finish << ")" << endl;
+#endif
+
+ } else {
+
+ timeT barDuration = TimeSignature(**i).getBarDuration();
+ start = (*i)->getAbsoluteTime() +
+ (n - (*i)->get<Int>(BarNumberProperty)) * barDuration;
+ finish = start + barDuration;
+
+#ifdef DEBUG_BAR_STUFF
+ cerr << "Composition::getBarRange[2]: bar " << n << ": (" << start
+ << " -> " << finish << ")" << endl;
+#endif
+ }
+
+ // partial bar
+ if (j != m_timeSigSegment.end() && finish > (*j)->getAbsoluteTime()) {
+ finish = (*j)->getAbsoluteTime();
+#ifdef DEBUG_BAR_STUFF
+ cerr << "Composition::getBarRange[3]: bar " << n << ": (" << start
+ << " -> " << finish << ")" << endl;
+#endif
+ }
+
+ return std::pair<timeT, timeT>(start, finish);
+}
+
+
+int
+Composition::addTimeSignature(timeT t, TimeSignature timeSig)
+{
+#ifdef DEBUG_BAR_STUFF
+ cerr << "Composition::addTimeSignature(" << t << ", " << timeSig.getNumerator() << "/" << timeSig.getDenominator() << ")" << endl;
+#endif
+
+ ReferenceSegment::iterator i =
+ m_timeSigSegment.insert(timeSig.getAsEvent(t));
+ m_barPositionsNeedCalculating = true;
+
+ updateRefreshStatuses();
+ notifyTimeSignatureChanged();
+
+ return std::distance(m_timeSigSegment.begin(), i);
+}
+
+TimeSignature
+Composition::getTimeSignatureAt(timeT t) const
+{
+ TimeSignature timeSig;
+ (void)getTimeSignatureAt(t, timeSig);
+ return timeSig;
+}
+
+timeT
+Composition::getTimeSignatureAt(timeT t, TimeSignature &timeSig) const
+{
+ ReferenceSegment::iterator i = getTimeSignatureAtAux(t);
+
+ if (i == m_timeSigSegment.end()) {
+ timeSig = TimeSignature();
+ return 0;
+ } else {
+ timeSig = TimeSignature(**i);
+ return (*i)->getAbsoluteTime();
+ }
+}
+
+TimeSignature
+Composition::getTimeSignatureInBar(int barNo, bool &isNew) const
+{
+ isNew = false;
+ timeT t = getBarRange(barNo).first;
+
+ ReferenceSegment::iterator i = getTimeSignatureAtAux(t);
+
+ if (i == m_timeSigSegment.end()) return TimeSignature();
+ if (t == (*i)->getAbsoluteTime()) isNew = true;
+
+ return TimeSignature(**i);
+}
+
+Composition::ReferenceSegment::iterator
+Composition::getTimeSignatureAtAux(timeT t) const
+{
+ ReferenceSegment::iterator i = m_timeSigSegment.findNearestTime(t);
+
+ // In negative time, if there's no time signature actually defined
+ // prior to the point of interest then we use the next time
+ // signature after it, so long as it's no later than time zero.
+ // This is the only rational way to deal with count-in bars where
+ // the correct time signature otherwise won't appear until we hit
+ // bar zero.
+
+ if (t < 0 && i == m_timeSigSegment.end()) {
+ i = m_timeSigSegment.begin();
+ if (i != m_timeSigSegment.end() && (*i)->getAbsoluteTime() > 0) {
+ i = m_timeSigSegment.end();
+ }
+ }
+
+ return i;
+}
+
+int
+Composition::getTimeSignatureCount() const
+{
+ return m_timeSigSegment.size();
+}
+
+int
+Composition::getTimeSignatureNumberAt(timeT t) const
+{
+ ReferenceSegment::iterator i = getTimeSignatureAtAux(t);
+ if (i == m_timeSigSegment.end()) return -1;
+ else return std::distance(m_timeSigSegment.begin(), i);
+}
+
+std::pair<timeT, TimeSignature>
+Composition::getTimeSignatureChange(int n) const
+{
+ return std::pair<timeT, TimeSignature>
+ (m_timeSigSegment[n]->getAbsoluteTime(),
+ TimeSignature(*m_timeSigSegment[n]));
+}
+
+void
+Composition::removeTimeSignature(int n)
+{
+ m_timeSigSegment.erase(m_timeSigSegment[n]);
+ m_barPositionsNeedCalculating = true;
+ updateRefreshStatuses();
+ notifyTimeSignatureChanged();
+}
+
+
+tempoT
+Composition::getTempoAtTime(timeT t) const
+{
+ ReferenceSegment::iterator i = m_tempoSegment.findNearestTime(t);
+
+ // In negative time, if there's no tempo event actually defined
+ // prior to the point of interest then we use the next one after
+ // it, so long as it's no later than time zero. This is the only
+ // rational way to deal with count-in bars where the correct
+ // tempo otherwise won't appear until we hit bar zero. See also
+ // getTimeSignatureAt
+
+ if (i == m_tempoSegment.end()) {
+ if (t < 0) {
+#ifdef DEBUG_TEMPO_STUFF
+ cerr << "Composition: Negative time " << t << " for tempo, using 0" << endl;
+#endif
+ return getTempoAtTime(0);
+ }
+ else return m_defaultTempo;
+ }
+
+ tempoT tempo = (tempoT)((*i)->get<Int>(TempoProperty));
+
+ if ((*i)->has(TargetTempoProperty)) {
+
+ tempoT target = (tempoT)((*i)->get<Int>(TargetTempoProperty));
+ ReferenceSegment::iterator j = i;
+ ++j;
+
+ if (target > 0 || (target == 0 && j != m_tempoSegment.end())) {
+
+ timeT t0 = (*i)->getAbsoluteTime();
+ timeT t1 = (j != m_tempoSegment.end() ?
+ (*j)->getAbsoluteTime() : getEndMarker());
+
+ if (t1 < t0) return tempo;
+
+ if (target == 0) {
+ target = (tempoT)((*j)->get<Int>(TempoProperty));
+ }
+
+ // tempo ramps are linear in 1/tempo
+ double s0 = 1.0 / double(tempo);
+ double s1 = 1.0 / double(target);
+ double s = s0 + (t - t0) * ((s1 - s0) / (t1 - t0));
+
+ tempoT result = tempoT((1.0 / s) + 0.01);
+
+#ifdef DEBUG_TEMPO_STUFF
+ cerr << "Composition: Calculated tempo " << result << " at " << t << endl;
+#endif
+
+ return result;
+ }
+ }
+
+#ifdef DEBUG_TEMPO_STUFF
+ cerr << "Composition: Found tempo " << tempo << " at " << t << endl;
+#endif
+ return tempo;
+}
+
+int
+Composition::addTempoAtTime(timeT time, tempoT tempo, tempoT targetTempo)
+{
+ // If there's an existing tempo at this time, the ReferenceSegment
+ // object will remove the duplicate, but we have to ensure that
+ // the minimum and maximum tempos are updated if necessary.
+
+ bool fullTempoUpdate = false;
+
+ int n = getTempoChangeNumberAt(time);
+ if (n >= 0) {
+ std::pair<timeT, tempoT> tc = getTempoChange(n);
+ if (tc.first == time) {
+ if (tc.second == m_minTempo || tc.second == m_maxTempo) {
+ fullTempoUpdate = true;
+ } else {
+ std::pair<bool, tempoT> tr = getTempoRamping(n);
+ if (tr.first &&
+ (tr.second == m_minTempo || tr.second == m_maxTempo)) {
+ fullTempoUpdate = true;
+ }
+ }
+ }
+ }
+
+ Event *tempoEvent = new Event(TempoEventType, time);
+ tempoEvent->set<Int>(TempoProperty, tempo);
+
+ if (targetTempo >= 0) {
+ tempoEvent->set<Int>(TargetTempoProperty, targetTempo);
+ }
+
+ ReferenceSegment::iterator i = m_tempoSegment.insert(tempoEvent);
+
+ if (fullTempoUpdate) {
+
+ updateExtremeTempos();
+
+ } else {
+
+ if (tempo < m_minTempo || m_minTempo == 0) m_minTempo = tempo;
+ if (targetTempo > 0 && targetTempo < m_minTempo) m_minTempo = targetTempo;
+
+ if (tempo > m_maxTempo || m_maxTempo == 0) m_maxTempo = tempo;
+ if (targetTempo > 0 && targetTempo > m_maxTempo) m_maxTempo = targetTempo;
+ }
+
+ m_tempoTimestampsNeedCalculating = true;
+ updateRefreshStatuses();
+
+#ifdef DEBUG_TEMPO_STUFF
+ cerr << "Composition: Added tempo " << tempo << " at " << time << endl;
+#endif
+ notifyTempoChanged();
+
+ return std::distance(m_tempoSegment.begin(), i);
+}
+
+int
+Composition::getTempoChangeCount() const
+{
+ return m_tempoSegment.size();
+}
+
+int
+Composition::getTempoChangeNumberAt(timeT t) const
+{
+ ReferenceSegment::iterator i = m_tempoSegment.findNearestTime(t);
+ if (i == m_tempoSegment.end()) return -1;
+ else return std::distance(m_tempoSegment.begin(), i);
+}
+
+std::pair<timeT, tempoT>
+Composition::getTempoChange(int n) const
+{
+ return std::pair<timeT, tempoT>
+ (m_tempoSegment[n]->getAbsoluteTime(),
+ tempoT(m_tempoSegment[n]->get<Int>(TempoProperty)));
+}
+
+std::pair<bool, tempoT>
+Composition::getTempoRamping(int n, bool calculate) const
+{
+ tempoT target = -1;
+ if (m_tempoSegment[n]->has(TargetTempoProperty)) {
+ target = m_tempoSegment[n]->get<Int>(TargetTempoProperty);
+ }
+ bool ramped = (target >= 0);
+ if (target == 0) {
+ if (calculate) {
+ if (m_tempoSegment.size() > n+1) {
+ target = m_tempoSegment[n+1]->get<Int>(TempoProperty);
+ }
+ }
+ }
+ if (target < 0 || (calculate && (target == 0))) {
+ target = m_tempoSegment[n]->get<Int>(TempoProperty);
+ }
+ return std::pair<bool, tempoT>(ramped, target);
+}
+
+void
+Composition::removeTempoChange(int n)
+{
+ tempoT oldTempo = m_tempoSegment[n]->get<Int>(TempoProperty);
+ tempoT oldTarget = -1;
+
+ if (m_tempoSegment[n]->has(TargetTempoProperty)) {
+ oldTarget = m_tempoSegment[n]->get<Int>(TargetTempoProperty);
+ }
+
+ m_tempoSegment.erase(m_tempoSegment[n]);
+ m_tempoTimestampsNeedCalculating = true;
+
+ if (oldTempo == m_minTempo ||
+ oldTempo == m_maxTempo ||
+ (oldTarget > 0 && oldTarget == m_minTempo) ||
+ (oldTarget > 0 && oldTarget == m_maxTempo)) {
+ updateExtremeTempos();
+ }
+
+ updateRefreshStatuses();
+ notifyTempoChanged();
+}
+
+void
+Composition::updateExtremeTempos()
+{
+ m_minTempo = 0;
+ m_maxTempo = 0;
+ for (ReferenceSegment::iterator i = m_tempoSegment.begin();
+ i != m_tempoSegment.end(); ++i) {
+ tempoT tempo = (*i)->get<Int>(TempoProperty);
+ tempoT target = -1;
+ if ((*i)->has(TargetTempoProperty)) {
+ target = (*i)->get<Int>(TargetTempoProperty);
+ }
+ if (tempo < m_minTempo || m_minTempo == 0) m_minTempo = tempo;
+ if (target > 0 && target < m_minTempo) m_minTempo = target;
+ if (tempo > m_maxTempo || m_maxTempo == 0) m_maxTempo = tempo;
+ if (target > 0 && target > m_maxTempo) m_maxTempo = target;
+ }
+ if (m_minTempo == 0) {
+ m_minTempo = m_defaultTempo;
+ m_maxTempo = m_defaultTempo;
+ }
+}
+
+RealTime
+Composition::getElapsedRealTime(timeT t) const
+{
+ calculateTempoTimestamps();
+
+ ReferenceSegment::iterator i = m_tempoSegment.findNearestTime(t);
+ if (i == m_tempoSegment.end()) {
+ i = m_tempoSegment.begin();
+ if (t >= 0 ||
+ (i == m_tempoSegment.end() || (*i)->getAbsoluteTime() > 0)) {
+ return time2RealTime(t, m_defaultTempo);
+ }
+ }
+
+ RealTime elapsed;
+
+ tempoT target = -1;
+ timeT nextTempoTime = t;
+
+ if (!getTempoTarget(i, target, nextTempoTime)) target = -1;
+
+ if (target > 0) {
+ elapsed = getTempoTimestamp(*i) +
+ time2RealTime(t - (*i)->getAbsoluteTime(),
+ tempoT((*i)->get<Int>(TempoProperty)),
+ nextTempoTime - (*i)->getAbsoluteTime(),
+ target);
+ } else {
+ elapsed = getTempoTimestamp(*i) +
+ time2RealTime(t - (*i)->getAbsoluteTime(),
+ tempoT((*i)->get<Int>(TempoProperty)));
+ }
+
+#ifdef DEBUG_TEMPO_STUFF
+ cerr << "Composition::getElapsedRealTime: " << t << " -> "
+ << elapsed << " (last tempo change at " << (*i)->getAbsoluteTime() << ")" << endl;
+#endif
+
+ return elapsed;
+}
+
+timeT
+Composition::getElapsedTimeForRealTime(RealTime t) const
+{
+ calculateTempoTimestamps();
+
+ ReferenceSegment::iterator i = m_tempoSegment.findNearestRealTime(t);
+ if (i == m_tempoSegment.end()) {
+ i = m_tempoSegment.begin();
+ if (t >= RealTime::zeroTime ||
+ (i == m_tempoSegment.end() || (*i)->getAbsoluteTime() > 0)) {
+ return realTime2Time(t, m_defaultTempo);
+ }
+ }
+
+ timeT elapsed;
+
+ tempoT target = -1;
+ timeT nextTempoTime = 0;
+ if (!getTempoTarget(i, target, nextTempoTime)) target = -1;
+
+ if (target > 0) {
+ elapsed = (*i)->getAbsoluteTime() +
+ realTime2Time(t - getTempoTimestamp(*i),
+ (tempoT)((*i)->get<Int>(TempoProperty)),
+ nextTempoTime - (*i)->getAbsoluteTime(),
+ target);
+ } else {
+ elapsed = (*i)->getAbsoluteTime() +
+ realTime2Time(t - getTempoTimestamp(*i),
+ (tempoT)((*i)->get<Int>(TempoProperty)));
+ }
+
+#ifdef DEBUG_TEMPO_STUFF
+ static int doError = true;
+ if (doError) {
+ doError = false;
+ RealTime cfReal = getElapsedRealTime(elapsed);
+ timeT cfTimeT = getElapsedTimeForRealTime(cfReal);
+ doError = true;
+ cerr << "getElapsedTimeForRealTime: " << t << " -> "
+ << elapsed << " (error " << (cfReal - t)
+ << " or " << (cfTimeT - elapsed) << ", tempo "
+ << (*i)->getAbsoluteTime() << ":"
+ << (tempoT)((*i)->get<Int>(TempoProperty)) << ")" << endl;
+ }
+#endif
+ return elapsed;
+}
+
+void
+Composition::calculateTempoTimestamps() const
+{
+ if (!m_tempoTimestampsNeedCalculating) return;
+
+ timeT lastTimeT = 0;
+ RealTime lastRealTime;
+
+ tempoT tempo = m_defaultTempo;
+ tempoT target = -1;
+
+#ifdef DEBUG_TEMPO_STUFF
+ cerr << "Composition::calculateTempoTimestamps: Tempo events are:" << endl;
+#endif
+
+ for (ReferenceSegment::iterator i = m_tempoSegment.begin();
+ i != m_tempoSegment.end(); ++i) {
+
+ RealTime myTime;
+
+ if (target > 0) {
+ myTime = lastRealTime +
+ time2RealTime((*i)->getAbsoluteTime() - lastTimeT, tempo,
+ (*i)->getAbsoluteTime() - lastTimeT, target);
+ } else {
+ myTime = lastRealTime +
+ time2RealTime((*i)->getAbsoluteTime() - lastTimeT, tempo);
+ }
+
+ setTempoTimestamp(*i, myTime);
+
+#ifdef DEBUG_TEMPO_STUFF
+ (*i)->dump(cerr);
+#endif
+
+ lastRealTime = myTime;
+ lastTimeT = (*i)->getAbsoluteTime();
+ tempo = tempoT((*i)->get<Int>(TempoProperty));
+
+ target = -1;
+ timeT nextTempoTime = 0;
+ if (!getTempoTarget(i, target, nextTempoTime)) target = -1;
+ }
+
+ m_tempoTimestampsNeedCalculating = false;
+}
+
+#ifdef DEBUG_TEMPO_STUFF
+static int DEBUG_silence_recursive_tempo_printout = 0;
+#endif
+
+RealTime
+Composition::time2RealTime(timeT t, tempoT tempo) const
+{
+ static timeT cdur = Note(Note::Crotchet).getDuration();
+
+ double dt = (double(t) * 100000 * 60) / (double(tempo) * cdur);
+
+ int sec = int(dt);
+ int nsec = int((dt - sec) * 1000000000);
+
+ RealTime rt(sec, nsec);
+
+#ifdef DEBUG_TEMPO_STUFF
+ if (!DEBUG_silence_recursive_tempo_printout) {
+ cerr << "Composition::time2RealTime: t " << t << ", sec " << sec << ", nsec "
+ << nsec << ", tempo " << tempo
+ << ", cdur " << cdur << ", dt " << dt << ", rt " << rt << endl;
+ DEBUG_silence_recursive_tempo_printout = 1;
+ timeT ct = realTime2Time(rt, tempo);
+ timeT et = t - ct;
+ RealTime ert = time2RealTime(et, tempo);
+ cerr << "cf. realTime2Time(" << rt << ") -> " << ct << " [err " << et << " (" << ert << "?)]" << endl;
+ DEBUG_silence_recursive_tempo_printout=0;
+ }
+#endif
+
+ return rt;
+}
+
+RealTime
+Composition::time2RealTime(timeT time, tempoT tempo,
+ timeT targetTime, tempoT targetTempo) const
+{
+ static timeT cdur = Note(Note::Crotchet).getDuration();
+
+ // The real time elapsed at musical time t, in seconds, during a
+ // smooth tempo change from "tempo" at musical time zero to
+ // "targetTempo" at musical time "targetTime", is
+ //
+ // 2
+ // at + t (b - a)
+ // ---------
+ // 2n
+ // where
+ //
+ // a is the initial tempo in seconds per tick
+ // b is the target tempo in seconds per tick
+ // n is targetTime in ticks
+
+ if (targetTime == 0 || targetTempo == tempo) {
+ return time2RealTime(time, targetTempo);
+ }
+
+ double a = (100000 * 60) / (double(tempo) * cdur);
+ double b = (100000 * 60) / (double(targetTempo) * cdur);
+ double t = time;
+ double n = targetTime;
+ double result = (a * t) + (t * t * (b - a)) / (2 * n);
+
+ int sec = int(result);
+ int nsec = int((result - sec) * 1000000000);
+
+ RealTime rt(sec, nsec);
+
+#ifdef DEBUG_TEMPO_STUFF
+ if (!DEBUG_silence_recursive_tempo_printout) {
+ cerr << "Composition::time2RealTime[2]: time " << time << ", tempo "
+ << tempo << ", targetTime " << targetTime << ", targetTempo "
+ << targetTempo << ": rt " << rt << endl;
+ DEBUG_silence_recursive_tempo_printout = 1;
+// RealTime nextRt = time2RealTime(targetTime, tempo, targetTime, targetTempo);
+ timeT ct = realTime2Time(rt, tempo, targetTime, targetTempo);
+ cerr << "cf. realTime2Time: rt " << rt << " -> " << ct << endl;
+ DEBUG_silence_recursive_tempo_printout=0;
+ }
+#endif
+
+ return rt;
+}
+
+timeT
+Composition::realTime2Time(RealTime rt, tempoT tempo) const
+{
+ static timeT cdur = Note(Note::Crotchet).getDuration();
+
+ double tsec = (double(rt.sec) * cdur) * (tempo / (60.0 * 100000.0));
+ double tnsec = (double(rt.nsec) * cdur) * (tempo / 100000.0);
+
+ double dt = tsec + (tnsec / 60000000000.0);
+ timeT t = (timeT)(dt + (dt < 0 ? -1e-6 : 1e-6));
+
+#ifdef DEBUG_TEMPO_STUFF
+ if (!DEBUG_silence_recursive_tempo_printout) {
+ cerr << "Composition::realTime2Time: rt.sec " << rt.sec << ", rt.nsec "
+ << rt.nsec << ", tempo " << tempo
+ << ", cdur " << cdur << ", tsec " << tsec << ", tnsec " << tnsec << ", dt " << dt << ", t " << t << endl;
+ DEBUG_silence_recursive_tempo_printout = 1;
+ RealTime crt = time2RealTime(t, tempo);
+ RealTime ert = rt - crt;
+ timeT et = realTime2Time(ert, tempo);
+ cerr << "cf. time2RealTime(" << t << ") -> " << crt << " [err " << ert << " (" << et << "?)]" << endl;
+ DEBUG_silence_recursive_tempo_printout = 0;
+ }
+#endif
+
+ return t;
+}
+
+timeT
+Composition::realTime2Time(RealTime rt, tempoT tempo,
+ timeT targetTime, tempoT targetTempo) const
+{
+ static timeT cdur = Note(Note::Crotchet).getDuration();
+
+ // Inverse of the expression in time2RealTime above.
+ //
+ // The musical time elapsed at real time t, in ticks, during a
+ // smooth tempo change from "tempo" at real time zero to
+ // "targetTempo" at real time "targetTime", is
+ //
+ // 2na (+/-) sqrt((2nb)^2 + 8(b-a)tn)
+ // - ----------------------------------
+ // 2(b-a)
+ // where
+ //
+ // a is the initial tempo in seconds per tick
+ // b is the target tempo in seconds per tick
+ // n is target real time in ticks
+
+ if (targetTempo == tempo) return realTime2Time(rt, tempo);
+
+ double a = (100000 * 60) / (double(tempo) * cdur);
+ double b = (100000 * 60) / (double(targetTempo) * cdur);
+ double t = double(rt.sec) + double(rt.nsec) / 1e9;
+ double n = targetTime;
+
+ double term1 = 2.0 * n * a;
+ double term2 = (2.0 * n * a) * (2.0 * n * a) + 8 * (b - a) * t * n;
+
+ if (term2 < 0) {
+ // We're screwed, but at least let's not crash
+ std::cerr << "ERROR: Composition::realTime2Time: term2 < 0 (it's " << term2 << ")" << std::endl;
+#ifdef DEBUG_TEMPO_STUFF
+ std::cerr << "rt = " << rt << ", tempo = " << tempo << ", targetTime = " << targetTime << ", targetTempo = " << targetTempo << std::endl;
+ std::cerr << "n = " << n << ", b = " << b << ", a = " << a << ", t = " << t <<std::endl;
+ std::cerr << "that's sqrt( (" << ((2.0*n*a*2.0*n*a)) << ") + "
+ << (8*(b-a)*t*n) << " )" << endl;
+
+ std::cerr << "so our original expression was " << rt << " = "
+ << a << "t + (t^2 * (" << b << " - " << a << ")) / " << 2*n << std::endl;
+#endif
+
+ return realTime2Time(rt, tempo);
+ }
+
+ double term3 = sqrt(term2);
+
+ // We only want the positive root
+ if (term3 > 0) term3 = -term3;
+
+ double result = - (term1 + term3) / (2 * (b - a));
+
+#ifdef DEBUG_TEMPO_STUFF
+ std::cerr << "Composition::realTime2Time:" <<endl;
+ std::cerr << "n = " << n << ", b = " << b << ", a = " << a << ", t = " << t <<std::endl;
+ std::cerr << "+/-sqrt(term2) = " << term3 << std::endl;
+ std::cerr << "result = " << result << endl;
+#endif
+
+ return long(result + 0.1);
+}
+
+bool
+Composition::getTempoTarget(ReferenceSegment::const_iterator i,
+ tempoT &target,
+ timeT &targetTime) const
+{
+ target = -1;
+ targetTime = 0;
+ bool have = false;
+
+ if ((*i)->has(TargetTempoProperty)) {
+ target = (*i)->get<Int>(TargetTempoProperty);
+ if (target >= 0) {
+ ReferenceSegment::const_iterator j(i);
+ if (++j != m_tempoSegment.end()) {
+ if (target == 0) target = (*j)->get<Int>(TempoProperty);
+ targetTime = (*j)->getAbsoluteTime();
+ } else {
+ targetTime = getEndMarker();
+ if (targetTime < (*i)->getAbsoluteTime()) {
+ target = -1;
+ }
+ }
+ if (target > 0) have = true;
+ }
+ }
+
+ return have;
+}
+
+RealTime
+Composition::getTempoTimestamp(const Event *e)
+{
+ RealTime res;
+ e->get<RealTimeT>(TempoTimestampProperty, res);
+ return res;
+}
+
+void
+Composition::setTempoTimestamp(Event *e, RealTime t)
+{
+ e->setMaybe<RealTimeT>(TempoTimestampProperty, t);
+}
+
+void
+Composition::getMusicalTimeForAbsoluteTime(timeT absTime,
+ int &bar, int &beat,
+ int &fraction, int &remainder)
+{
+ bar = getBarNumber(absTime);
+
+ TimeSignature timeSig = getTimeSignatureAt(absTime);
+ timeT barStart = getBarStart(bar);
+ timeT beatDuration = timeSig.getBeatDuration();
+ beat = (absTime - barStart) / beatDuration + 1;
+
+ remainder = (absTime - barStart) % beatDuration;
+ timeT fractionDuration = Note(Note::Shortest).getDuration();
+ fraction = remainder / fractionDuration;
+ remainder = remainder % fractionDuration;
+}
+
+void
+Composition::getMusicalTimeForDuration(timeT absTime, timeT duration,
+ int &bars, int &beats,
+ int &fractions, int &remainder)
+{
+ TimeSignature timeSig = getTimeSignatureAt(absTime);
+ timeT barDuration = timeSig.getBarDuration();
+ timeT beatDuration = timeSig.getBeatDuration();
+
+ bars = duration / barDuration;
+ beats = (duration % barDuration) / beatDuration;
+ remainder = (duration % barDuration) % beatDuration;
+ timeT fractionDuration = Note(Note::Shortest).getDuration();
+ fractions = remainder / fractionDuration;
+ remainder = remainder % fractionDuration;
+}
+
+timeT
+Composition::getAbsoluteTimeForMusicalTime(int bar, int beat,
+ int fraction, int remainder)
+{
+ timeT t = getBarStart(bar - 1);
+ TimeSignature timesig = getTimeSignatureAt(t);
+ t += (beat-1) * timesig.getBeatDuration();
+ t += Note(Note::Shortest).getDuration() * fraction;
+ t += remainder;
+ return t;
+}
+
+timeT
+Composition::getDurationForMusicalTime(timeT absTime,
+ int bars, int beats,
+ int fractions, int remainder)
+{
+ TimeSignature timeSig = getTimeSignatureAt(absTime);
+ timeT barDuration = timeSig.getBarDuration();
+ timeT beatDuration = timeSig.getBeatDuration();
+ timeT t = bars * barDuration + beats * beatDuration + fractions *
+ Note(Note::Shortest).getDuration() + remainder;
+ return t;
+}
+
+void
+Composition::setPosition(timeT position)
+{
+ m_position = position;
+}
+
+void Composition::setPlayMetronome(bool value)
+{
+ m_playMetronome = value;
+ notifyMetronomeChanged();
+}
+
+void Composition::setRecordMetronome(bool value)
+{
+ m_recordMetronome = value;
+ notifyMetronomeChanged();
+}
+
+
+
+#ifdef TRACK_DEBUG
+// track debug convenience function
+//
+static void dumpTracks(Composition::trackcontainer& tracks)
+{
+ Composition::trackiterator it = tracks.begin();
+ for (; it != tracks.end(); ++it) {
+ std::cerr << "tracks[" << (*it).first << "] = "
+ << (*it).second << std::endl;
+ }
+}
+#endif
+
+Track* Composition::getTrackById(TrackId track) const
+{
+ trackconstiterator i = m_tracks.find(track);
+
+ if (i != m_tracks.end())
+ return (*i).second;
+
+ std::cerr << "Composition::getTrackById("
+ << track << ") - WARNING - track id not found, this is probably a BUG "
+ << __FILE__ << ":" << __LINE__ << std::endl;
+ std::cerr << "Available track ids are: " << std::endl;
+ for (trackconstiterator i = m_tracks.begin(); i != m_tracks.end(); ++i) {
+ std::cerr << (*i).second->getId() << std::endl;
+ }
+
+ return 0;
+}
+
+// Move a track object to a new id and position in the container -
+// used when deleting and undoing deletion of tracks.
+//
+//
+void Composition::resetTrackIdAndPosition(TrackId oldId, TrackId newId,
+ int position)
+{
+ trackiterator titerator = m_tracks.find(oldId);
+
+ if (titerator != m_tracks.end())
+ {
+ // detach old track
+ Track *track = (*titerator).second;
+ m_tracks.erase(titerator);
+
+ // set new position and
+ track->setId(newId);
+ track->setPosition(position);
+ m_tracks[newId] = track;
+
+ // modify segment mappings
+ //
+ for (segmentcontainer::const_iterator i = m_segments.begin();
+ i != m_segments.end(); ++i)
+ {
+ if ((*i)->getTrack() == oldId) (*i)->setTrack(newId);
+ }
+
+ checkSelectedAndRecordTracks();
+ updateRefreshStatuses();
+ notifyTrackChanged(getTrackById(newId));
+ }
+ else
+ std::cerr << "Composition::resetTrackIdAndPosition - "
+ << "can't move track " << oldId << " to " << newId
+ << std::endl;
+}
+
+void Composition::setSelectedTrack(TrackId track)
+{
+ m_selectedTrack = track;
+ notifySoloChanged();
+}
+
+void Composition::setSolo(bool value)
+{
+ m_solo = value;
+ notifySoloChanged();
+}
+
+// Insert a Track representation into the Composition
+//
+void Composition::addTrack(Track *track)
+{
+ // make sure a track with the same id isn't already there
+ //
+ if (m_tracks.find(track->getId()) == m_tracks.end()) {
+
+ m_tracks[track->getId()] = track;
+ track->setOwningComposition(this);
+ updateRefreshStatuses();
+ notifyTrackChanged(track);
+
+ } else {
+ std::cerr << "Composition::addTrack("
+ << track << "), id = " << track->getId()
+ << " - WARNING - track id already present "
+ << __FILE__ << ":" << __LINE__ << std::endl;
+ // throw Exception("track id already present");
+ }
+}
+
+
+void Composition::deleteTrack(Rosegarden::TrackId track)
+{
+ trackiterator titerator = m_tracks.find(track);
+
+ if (titerator == m_tracks.end()) {
+
+ std::cerr << "Composition::deleteTrack : no track of id " << track << std::endl;
+ throw Exception("track id not found");
+
+ } else {
+
+ delete ((*titerator).second);
+ m_tracks.erase(titerator);
+ checkSelectedAndRecordTracks();
+ updateRefreshStatuses();
+ notifyTrackDeleted(track);
+ }
+
+}
+
+bool Composition::detachTrack(Rosegarden::Track *track)
+{
+ trackiterator it = m_tracks.begin();
+
+ for (; it != m_tracks.end(); ++it)
+ {
+ if ((*it).second == track)
+ break;
+ }
+
+ if (it == m_tracks.end()) {
+ std::cerr << "Composition::detachTrack() : no such track " << track << std::endl;
+ throw Exception("track id not found");
+ return false;
+ }
+
+ ((*it).second)->setOwningComposition(0);
+
+ m_tracks.erase(it);
+ updateRefreshStatuses();
+ checkSelectedAndRecordTracks();
+
+ return true;
+}
+
+void Composition::checkSelectedAndRecordTracks()
+{
+ // reset m_selectedTrack and m_recordTrack to the next valid track id
+ // if the track they point to has been deleted
+
+ if (m_tracks.find(m_selectedTrack) == m_tracks.end()) {
+
+ m_selectedTrack = getClosestValidTrackId(m_selectedTrack);
+ notifySoloChanged();
+
+ }
+
+ for (recordtrackcontainer::iterator i = m_recordTracks.begin();
+ i != m_recordTracks.end(); ++i) {
+ if (m_tracks.find(*i) == m_tracks.end()) {
+ m_recordTracks.erase(i);
+ }
+ }
+
+}
+
+TrackId
+Composition::getClosestValidTrackId(TrackId id) const
+{
+ long diff = LONG_MAX;
+ TrackId closestValidTrackId = 0;
+
+ for (trackcontainer::const_iterator i = getTracks().begin();
+ i != getTracks().end(); ++i) {
+
+ long cdiff = labs(i->second->getId() - id);
+
+ if (cdiff < diff) {
+ diff = cdiff;
+ closestValidTrackId = i->second->getId();
+
+ } else break; // std::map is sorted, so if the diff increases, we're passed closest valid id
+
+ }
+
+ return closestValidTrackId;
+}
+
+TrackId
+Composition::getMinTrackId() const
+{
+ if (getTracks().size() == 0) return 0;
+
+ trackcontainer::const_iterator i = getTracks().begin();
+ return i->first;
+}
+
+TrackId
+Composition::getMaxTrackId() const
+{
+ if (getTracks().size() == 0) return 0;
+
+ trackcontainer::const_iterator i = getTracks().end();
+ --i;
+
+ return i->first;
+}
+
+void
+Composition::setTrackRecording(TrackId track, bool recording)
+{
+ if (recording) {
+ m_recordTracks.insert(track);
+ } else {
+ m_recordTracks.erase(track);
+ }
+ Track *t = getTrackById(track);
+ if (t) {
+ t->setArmed(recording);
+ }
+}
+
+bool
+Composition::isTrackRecording(TrackId track) const
+{
+ return m_recordTracks.find(track) != m_recordTracks.end();
+}
+
+
+// Export the Composition as XML, also iterates through
+// Tracks and any further sub-objects
+//
+//
+std::string Composition::toXmlString()
+{
+ std::stringstream composition;
+
+ composition << "<composition recordtracks=\"";
+ for (recordtrackiterator i = m_recordTracks.begin();
+ i != m_recordTracks.end(); ) {
+ composition << *i;
+ if (++i != m_recordTracks.end()) {
+ composition << ",";
+ }
+ }
+ composition << "\" pointer=\"" << m_position;
+ composition << "\" defaultTempo=\"";
+ composition << std::setiosflags(std::ios::fixed)
+ << std::setprecision(4)
+ << getTempoQpm(m_defaultTempo);
+ composition << "\" compositionDefaultTempo=\"";
+ composition << m_defaultTempo;
+
+ if (m_loopStart != m_loopEnd)
+ {
+ composition << "\" loopstart=\"" << m_loopStart;
+ composition << "\" loopend=\"" << m_loopEnd;
+ }
+
+ composition << "\" startMarker=\"" << m_startMarker;
+ composition << "\" endMarker=\"" << m_endMarker;
+
+ // Add the Solo if set
+ //
+ if (m_solo)
+ composition << "\" solo=\"" << m_solo;
+
+ composition << "\" selected=\"" << m_selectedTrack;
+ composition << "\" playmetronome=\"" << m_playMetronome;
+ composition << "\" recordmetronome=\"" << m_recordMetronome;
+ composition << "\" nexttriggerid=\"" << m_nextTriggerSegmentId;
+ composition << "\">" << endl << endl;
+
+ composition << endl;
+
+ for (trackiterator tit = getTracks().begin();
+ tit != getTracks().end();
+ ++tit)
+ {
+ if ((*tit).second)
+ composition << " " << (*tit).second->toXmlString() << endl;
+ }
+
+ composition << endl;
+
+ for (ReferenceSegment::iterator i = m_timeSigSegment.begin();
+ i != m_timeSigSegment.end(); ++i) {
+
+ // Might be nice just to stream the events, but that's
+ // normally done by XmlStorableEvent in gui/ at the
+ // moment. Still, this isn't too much of a hardship
+
+ composition << " <timesignature time=\"" << (*i)->getAbsoluteTime()
+ << "\" numerator=\""
+ << (*i)->get<Int>(TimeSignature::NumeratorPropertyName)
+ << "\" denominator=\""
+ << (*i)->get<Int>(TimeSignature::DenominatorPropertyName)
+ << "\"";
+
+ bool common = false;
+ (*i)->get<Bool>(TimeSignature::ShowAsCommonTimePropertyName, common);
+ if (common) composition << " common=\"true\"";
+
+ bool hidden = false;
+ (*i)->get<Bool>(TimeSignature::IsHiddenPropertyName, hidden);
+ if (hidden) composition << " hidden=\"true\"";
+
+ bool hiddenBars = false;
+ (*i)->get<Bool>(TimeSignature::HasHiddenBarsPropertyName, hiddenBars);
+ if (hiddenBars) composition << " hiddenbars=\"true\"";
+
+ composition << "/>" << endl;
+ }
+
+ composition << endl;
+
+ for (ReferenceSegment::iterator i = m_tempoSegment.begin();
+ i != m_tempoSegment.end(); ++i) {
+
+ tempoT tempo = tempoT((*i)->get<Int>(TempoProperty));
+ tempoT target = -1;
+ if ((*i)->has(TargetTempoProperty)) {
+ target = tempoT((*i)->get<Int>(TargetTempoProperty));
+ }
+ composition << " <tempo time=\"" << (*i)->getAbsoluteTime()
+ << "\" bph=\"" << ((tempo * 6) / 10000)
+ << "\" tempo=\"" << tempo;
+ if (target >= 0) {
+ composition << "\" target=\"" << target;
+ }
+ composition << "\"/>" << endl;
+ }
+
+ composition << endl;
+
+ composition << "<metadata>" << endl
+ << m_metadata.toXmlString() << endl
+ << "</metadata>" << endl << endl;
+
+ composition << "<markers>" << endl;
+ for (markerconstiterator mIt = m_markers.begin();
+ mIt != m_markers.end(); ++mIt)
+ {
+ composition << (*mIt)->toXmlString();
+ }
+ composition << "</markers>" << endl;
+
+
+#if (__GNUC__ < 3)
+ composition << "</composition>" << std::ends;
+#else
+ composition << "</composition>";
+#endif
+
+ return composition.str();
+}
+
+void
+Composition::clearTracks()
+{
+ trackiterator it = m_tracks.begin();
+
+ for (; it != m_tracks.end(); it++)
+ delete ((*it).second);
+
+ m_tracks.erase(m_tracks.begin(), m_tracks.end());
+}
+
+Track*
+Composition::getTrackByPosition(int position) const
+{
+ trackconstiterator it = m_tracks.begin();
+
+ for (; it != m_tracks.end(); it++)
+ {
+ if ((*it).second->getPosition() == position)
+ return (*it).second;
+ }
+
+ return 0;
+
+}
+
+int
+Composition::getTrackPositionById(TrackId id) const
+{
+ Track *track = getTrackById(id);
+ if (!track) return -1;
+ return track->getPosition();
+}
+
+
+Rosegarden::TrackId
+Composition::getNewTrackId() const
+{
+ // Re BR #1070325: another track deletion problem
+ // Formerly this was returning the count of tracks currently in
+ // existence -- returning a duplicate ID if some had been deleted
+ // from the middle. Let's find one that's really available instead.
+
+ TrackId highWater = 0;
+
+ trackconstiterator it = m_tracks.begin();
+
+ for (; it != m_tracks.end(); it++)
+ {
+ if ((*it).second->getId() >= highWater)
+ highWater = (*it).second->getId() + 1;
+ }
+
+ return highWater;
+}
+
+
+void
+Composition::notifySegmentAdded(Segment *s) const
+{
+ // If there is an earlier repeating segment on the same track, we
+ // need to notify the change of its repeat end time
+
+ for (const_iterator i = begin(); i != end(); ++i) {
+
+ if (((*i)->getTrack() == s->getTrack())
+ && ((*i)->isRepeating())
+ && ((*i)->getStartTime() < s->getStartTime())) {
+
+ notifySegmentRepeatEndChanged(*i, (*i)->getRepeatEndTime());
+ }
+ }
+
+ for (ObserverSet::const_iterator i = m_observers.begin();
+ i != m_observers.end(); ++i) {
+ (*i)->segmentAdded(this, s);
+ }
+}
+
+
+void
+Composition::notifySegmentRemoved(Segment *s) const
+{
+ // If there is an earlier repeating segment on the same track, we
+ // need to notify the change of its repeat end time
+
+ for (const_iterator i = begin(); i != end(); ++i) {
+
+ if (((*i)->getTrack() == s->getTrack())
+ && ((*i)->isRepeating())
+ && ((*i)->getStartTime() < s->getStartTime())) {
+
+ notifySegmentRepeatEndChanged(*i, (*i)->getRepeatEndTime());
+ }
+ }
+
+ for (ObserverSet::const_iterator i = m_observers.begin();
+ i != m_observers.end(); ++i) {
+ (*i)->segmentRemoved(this, s);
+ }
+}
+
+void
+Composition::notifySegmentRepeatChanged(Segment *s, bool repeat) const
+{
+ for (ObserverSet::const_iterator i = m_observers.begin();
+ i != m_observers.end(); ++i) {
+ (*i)->segmentRepeatChanged(this, s, repeat);
+ }
+}
+
+void
+Composition::notifySegmentRepeatEndChanged(Segment *s, timeT t) const
+{
+ for (ObserverSet::const_iterator i = m_observers.begin();
+ i != m_observers.end(); ++i) {
+ (*i)->segmentRepeatEndChanged(this, s, t);
+ }
+}
+
+void
+Composition::notifySegmentEventsTimingChanged(Segment *s, timeT delay, RealTime rtDelay) const
+{
+ for (ObserverSet::const_iterator i = m_observers.begin();
+ i != m_observers.end(); ++i) {
+ (*i)->segmentEventsTimingChanged(this, s, delay, rtDelay);
+ }
+}
+
+void
+Composition::notifySegmentTransposeChanged(Segment *s, int transpose) const
+{
+ for (ObserverSet::const_iterator i = m_observers.begin();
+ i != m_observers.end(); ++i) {
+ (*i)->segmentTransposeChanged(this, s, transpose);
+ }
+}
+
+void
+Composition::notifySegmentTrackChanged(Segment *s, TrackId oldId, TrackId newId) const
+{
+ // If there is an earlier repeating segment on either the
+ // origin or destination track, we need to notify the change
+ // of its repeat end time
+
+ for (const_iterator i = begin(); i != end(); ++i) {
+
+ if (((*i)->getTrack() == oldId || (*i)->getTrack() == newId)
+ && ((*i)->isRepeating())
+ && ((*i)->getStartTime() < s->getStartTime())) {
+
+ notifySegmentRepeatEndChanged(*i, (*i)->getRepeatEndTime());
+ }
+ }
+
+ for (ObserverSet::const_iterator i = m_observers.begin();
+ i != m_observers.end(); ++i) {
+ (*i)->segmentTrackChanged(this, s, newId);
+ }
+}
+
+void
+Composition::notifySegmentStartChanged(Segment *s, timeT t)
+{
+ updateRefreshStatuses(); // not ideal, but best way to ensure track heights are recomputed
+ for (ObserverSet::const_iterator i = m_observers.begin();
+ i != m_observers.end(); ++i) {
+ (*i)->segmentStartChanged(this, s, t);
+ }
+}
+
+void
+Composition::notifySegmentEndMarkerChange(Segment *s, bool shorten)
+{
+ for (ObserverSet::const_iterator i = m_observers.begin();
+ i != m_observers.end(); ++i) {
+ (*i)->segmentEndMarkerChanged(this, s, shorten);
+ }
+}
+
+void
+Composition::notifyEndMarkerChange(bool shorten) const
+{
+ for (ObserverSet::const_iterator i = m_observers.begin();
+ i != m_observers.end(); ++i) {
+ (*i)->endMarkerTimeChanged(this, shorten);
+ }
+}
+
+void
+Composition::notifyTrackChanged(Track *t) const
+{
+ for (ObserverSet::const_iterator i = m_observers.begin();
+ i != m_observers.end(); ++i) {
+ (*i)->trackChanged(this, t);
+ }
+}
+
+void
+Composition::notifyTrackDeleted(TrackId t) const
+{
+ for (ObserverSet::const_iterator i = m_observers.begin();
+ i != m_observers.end(); ++i) {
+ (*i)->trackDeleted(this, t);
+ }
+}
+
+void
+Composition::notifyMetronomeChanged() const
+{
+ for (ObserverSet::const_iterator i = m_observers.begin();
+ i != m_observers.end(); ++i) {
+ (*i)->metronomeChanged(this);
+ }
+}
+
+void
+Composition::notifyTimeSignatureChanged() const
+{
+ for (ObserverSet::const_iterator i = m_observers.begin();
+ i != m_observers.end(); ++i) {
+ (*i)->timeSignatureChanged(this);
+ }
+}
+
+void
+Composition::notifySoloChanged() const
+{
+ for (ObserverSet::const_iterator i = m_observers.begin();
+ i != m_observers.end(); ++i) {
+ (*i)->soloChanged(this, isSolo(), getSelectedTrack());
+ }
+}
+
+void
+Composition::notifyTempoChanged() const
+{
+ for (ObserverSet::const_iterator i = m_observers.begin();
+ i != m_observers.end(); ++i) {
+ (*i)->tempoChanged(this);
+ }
+}
+
+
+void
+Composition::notifySourceDeletion() const
+{
+ for (ObserverSet::const_iterator i = m_observers.begin();
+ i != m_observers.end(); ++i) {
+ (*i)->compositionDeleted(this);
+ }
+}
+
+
+void breakpoint()
+{
+ //std::cerr << "breakpoint()\n";
+}
+
+// Just empty out the markers
+void
+Composition::clearMarkers()
+{
+ markerconstiterator it = m_markers.begin();
+
+ for (; it != m_markers.end(); ++it)
+ {
+ delete *it;
+ }
+
+ m_markers.clear();
+}
+
+void
+Composition::addMarker(Rosegarden::Marker *marker)
+{
+ m_markers.push_back(marker);
+ updateRefreshStatuses();
+}
+
+bool
+Composition::detachMarker(Rosegarden::Marker *marker)
+{
+ markeriterator it = m_markers.begin();
+
+ for (; it != m_markers.end(); ++it)
+ {
+ if (*it == marker)
+ {
+ m_markers.erase(it);
+ updateRefreshStatuses();
+ return true;
+ }
+ }
+
+ return false;
+}
+
+bool
+Composition::isMarkerAtPosition(Rosegarden::timeT time) const
+{
+ markerconstiterator it = m_markers.begin();
+
+ for (; it != m_markers.end(); ++it)
+ if ((*it)->getTime() == time) return true;
+
+ return false;
+}
+
+void
+Composition::setSegmentColourMap(Rosegarden::ColourMap &newmap)
+{
+ m_segmentColourMap = newmap;
+
+ updateRefreshStatuses();
+}
+
+void
+Composition::setGeneralColourMap(Rosegarden::ColourMap &newmap)
+{
+ m_generalColourMap = newmap;
+
+ updateRefreshStatuses();
+}
+
+void
+Composition::dump(std::ostream& out, bool) const
+{
+ out << "Composition segments : " << endl;
+
+ for(iterator i = begin(); i != end(); ++i) {
+ Segment* s = *i;
+
+ out << "Segment start : " << s->getStartTime() << " - end : " << s->getEndMarkerTime()
+ << " - repeating : " << s->isRepeating()
+ << " - track id : " << s->getTrack()
+ << " - label : " << s->getLabel()
+ << endl;
+
+ }
+
+}
+
+
+
+}
+
+
diff --git a/src/base/Composition.h b/src/base/Composition.h
new file mode 100644
index 0000000..24865dd
--- /dev/null
+++ b/src/base/Composition.h
@@ -0,0 +1,1134 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _COMPOSITION_H_
+#define _COMPOSITION_H_
+
+#include <set>
+#include <map>
+
+#include "FastVector.h"
+
+#include "RealTime.h"
+#include "Segment.h"
+#include "Track.h"
+#include "Configuration.h"
+#include "XmlExportable.h"
+#include "ColourMap.h"
+#include "TriggerSegment.h"
+
+#include "Marker.h"
+
+namespace Rosegarden
+{
+// We store tempo in quarter-notes per minute * 10^5 (hundred
+// thousandths of a quarter-note per minute). This means the maximum
+// tempo in a 32-bit integer is about 21400 qpm. We use a signed int
+// for compatibility with the Event integer type -- but note that we
+// use 0 (rather than -1) to indicate "tempo not set", by convention
+// (though see usage of target tempo in e.g. addTempoAtTime).
+typedef int tempoT;
+
+class Quantizer;
+class BasicQuantizer;
+class NotationQuantizer;
+
+/**
+ * Composition contains a complete representation of a piece of music.
+ * It is a container for multiple Segments, as well as any associated
+ * non-Event data.
+ *
+ * The Composition owns the Segments it holds, and deletes them on
+ * destruction. When Segments are removed, it will also delete them.
+ */
+
+class CompositionObserver;
+
+class Composition : public XmlExportable
+{
+ friend class Track; // to call notifyTrackChanged()
+ friend class Segment; // to call notifySegmentRepeatChanged()
+
+public:
+ typedef std::multiset<Segment*, Segment::SegmentCmp> segmentcontainer;
+ typedef segmentcontainer::iterator iterator;
+ typedef segmentcontainer::const_iterator const_iterator;
+
+ typedef std::map<TrackId, Track*> trackcontainer;
+ typedef trackcontainer::iterator trackiterator;
+ typedef trackcontainer::const_iterator trackconstiterator;
+
+ typedef std::vector<Marker*> markercontainer;
+ typedef markercontainer::iterator markeriterator;
+ typedef markercontainer::const_iterator markerconstiterator;
+
+ typedef std::set<TriggerSegmentRec *, TriggerSegmentCmp> triggersegmentcontainer;
+ typedef triggersegmentcontainer::iterator triggersegmentcontaineriterator;
+ typedef triggersegmentcontainer::const_iterator triggersegmentcontainerconstiterator;
+
+ typedef std::set<TrackId> recordtrackcontainer;
+ typedef recordtrackcontainer::iterator recordtrackiterator;
+ typedef recordtrackcontainer::const_iterator recordtrackconstiterator;
+
+ Composition();
+ virtual ~Composition();
+
+private:
+ Composition(const Composition &);
+ Composition &operator=(const Composition &);
+public:
+
+ /**
+ * Remove all Segments from the Composition and destroy them
+ */
+ void clear();
+
+ /**
+ * Return the absolute end time of the segment that ends last
+ */
+ timeT getDuration() const;
+
+
+ //////
+ //
+ // START AND END MARKERS
+
+ timeT getStartMarker() const { return m_startMarker; }
+ timeT getEndMarker() const { return m_endMarker; }
+
+ void setStartMarker(const timeT &sM);
+ void setEndMarker(const timeT &eM);
+
+
+ //////
+ //
+ // INSTRUMENT & TRACK
+
+ Track* getTrackById(TrackId track) const;
+
+ Track* getTrackByPosition(int position) const;
+
+ int getTrackPositionById(TrackId track) const; // -1 if not found
+
+ trackcontainer& getTracks() { return m_tracks; }
+
+ const trackcontainer& getTracks() const { return m_tracks; }
+
+ // Reset id and position
+ void resetTrackIdAndPosition(TrackId oldId, TrackId newId, int position);
+
+ TrackId getMinTrackId() const;
+ TrackId getMaxTrackId() const;
+
+ const recordtrackcontainer &getRecordTracks() const { return m_recordTracks; }
+ void setTrackRecording(TrackId track, bool recording);
+ bool isTrackRecording(TrackId track) const;
+
+ // Get and set Solo Track
+ //
+ TrackId getSelectedTrack() const { return m_selectedTrack; }
+
+ void setSelectedTrack(TrackId track);
+
+ // Are we soloing a Track?
+ //
+ bool isSolo() const { return m_solo; }
+ void setSolo(bool value);
+
+ unsigned int getNbTracks() const { return m_tracks.size(); }
+
+ /**
+ * Clear out the Track container
+ */
+ void clearTracks();
+
+ /**
+ * Insert a new Track. The Composition takes over ownership of
+ * the track object.
+ */
+ void addTrack(Track *track);
+
+ /**
+ * Delete a Track by index
+ */
+ void deleteTrack(TrackId track);
+
+ /**
+ * Detach a Track (revert ownership of the Track object to the
+ * caller).
+ */
+ bool detachTrack(Track *track);
+
+ /**
+ * Get the highest running track id (generated and kept
+ * through addTrack)
+ */
+ TrackId getNewTrackId() const;
+
+
+ //////
+ //
+ // MARKERS
+
+ markercontainer& getMarkers() { return m_markers; }
+ const markercontainer& getMarkers() const { return m_markers; }
+
+ /**
+ * Add a new Marker. The Composition takes ownership of the
+ * marker object.
+ */
+ void addMarker(Marker *marker);
+
+ /**
+ * Detach a Marker (revert ownership of the Marker object to the
+ * caller).
+ */
+ bool detachMarker(Marker *marker);
+
+ bool isMarkerAtPosition(timeT time) const;
+
+ void clearMarkers();
+
+
+ //////
+ //
+ // SEGMENT
+
+ segmentcontainer& getSegments() { return m_segments; }
+ const segmentcontainer& getSegments() const { return m_segments; }
+
+ unsigned int getNbSegments() const { return m_segments.size(); }
+
+ /**
+ * Add a new Segment and return an iterator pointing to it
+ * The inserted Segment is owned by the Composition object
+ */
+ iterator addSegment(Segment*);
+
+ /**
+ * Delete the Segment pointed to by the specified iterator
+ *
+ * NOTE: The Segment is deleted from the Composition and
+ * destroyed
+ */
+ void deleteSegment(iterator);
+
+ /**
+ * Delete the Segment if it is part of the Composition
+ * \return true if the Segment was found and deleted
+ *
+ * NOTE: The Segment is deleted from the composition and
+ * destroyed
+ */
+ bool deleteSegment(Segment*);
+
+ /**
+ * DO NOT USE THIS METHOD
+ *
+ * Set a Segment's start time while keeping the integrity of the
+ * Composition multiset.
+ *
+ * The segment is removed and re-inserted from the composition
+ * so the ordering is preserved.
+ */
+ void setSegmentStartTime(Segment*, timeT);
+
+ /**
+ * Test whether a Segment exists in this Composition.
+ */
+ bool contains(const Segment *);
+
+ /**
+ * Return an iterator pointing at the given Segment, or end()
+ * if it does not exist in this Composition.
+ */
+ iterator findSegment(const Segment *);
+
+ /**
+ * Remove the Segment if it is part of the Composition,
+ * but do not destroy it (passing it to addSegment again
+ * would restore it correctly).
+ * \return true if the Segment was found and removed
+ *
+ * NOTE: Many of the Segment methods will fail if the
+ * Segment is not in a Composition. You should not
+ * expect to do anything meaningful with a Segment that
+ * has been detached from the Composition in this way.
+ */
+ bool detachSegment(Segment*);
+
+ /**
+ * Add a new Segment which has been "weakly detached"
+ *
+ * Like addSegment(), but doesn't send the segmentAdded signal
+ * nor updating refresh statuses
+ */
+ iterator weakAddSegment(Segment*);
+
+ /**
+ * Detach a segment which you're going to re-add (with weakAddSegment)
+ * later.
+ * Like detachSegment(), but without sending the segmentDeleted signal
+ * nor updating refresh statuses.
+ */
+ bool weakDetachSegment(Segment*);
+
+ /**
+ * Get the largest number of segments that "overlap" at any one
+ * time on the given track. I have given this function a nice
+ * long name to make it feel important.
+ */
+ int getMaxContemporaneousSegmentsOnTrack(TrackId track) const;
+
+ /**
+ * Retrieve a "vertical" index for this segment within its track.
+ * Currently this is based on studying the way that segments on
+ * the track overlap and returning the lowest integer such that no
+ * prior starting segment that overlaps with this one would use
+ * the same integer. In future this could use proper voice
+ * ordering.
+ */
+ int getSegmentVoiceIndex(const Segment *) const;
+
+
+ //////
+ //
+ // TRIGGER SEGMENTS
+
+ triggersegmentcontainer &getTriggerSegments() { return m_triggerSegments; }
+ const triggersegmentcontainer &getTriggerSegments() const { return m_triggerSegments; }
+
+ /**
+ * Add a new trigger Segment with a given base pitch and base
+ * velocity, and return its record. If pitch or velocity is -1,
+ * it will be taken from the first note event in the segment
+ */
+ TriggerSegmentRec *addTriggerSegment(Segment *, int pitch = -1, int velocity = -1);
+
+ /**
+ * Delete a trigger Segment.
+ */
+ void deleteTriggerSegment(TriggerSegmentId);
+
+ /**
+ * Detach a trigger Segment from the Composition.
+ */
+ void detachTriggerSegment(TriggerSegmentId);
+
+ /**
+ * Delete all trigger Segments.
+ */
+ void clearTriggerSegments();
+
+ /**
+ * Return the TriggerSegmentId for the given Segment, or -1 if it is
+ * not a trigger Segment.
+ */
+ int getTriggerSegmentId(Segment *);
+
+ /**
+ * Return the Segment for a given TriggerSegmentId
+ */
+ Segment *getTriggerSegment(TriggerSegmentId);
+
+ /**
+ * Return the TriggerSegmentRec (with Segment, base pitch, base velocity,
+ * references etc) for a given TriggerSegmentId
+ */
+ TriggerSegmentRec *getTriggerSegmentRec(TriggerSegmentId);
+
+ /**
+ * Add a new trigger Segment with a given ID and base pitch and
+ * velocity. Fails and returns 0 if the ID is already in use.
+ * This is intended for use from file load or from undo/redo.
+ */
+ TriggerSegmentRec *addTriggerSegment(Segment *, TriggerSegmentId,
+ int basePitch = -1, int baseVelocity = -1);
+
+ /**
+ * Get the ID of the next trigger segment that will be inserted.
+ */
+ TriggerSegmentId getNextTriggerSegmentId() const;
+
+ /**
+ * Specify the next trigger ID. This is intended for use from file
+ * load only. Do not use this function unless you know what you're
+ * doing.
+ */
+ void setNextTriggerSegmentId(TriggerSegmentId);
+
+ /**
+ * Update the trigger segment references for all trigger segments.
+ * To be called after file load.
+ */
+ void updateTriggerSegmentReferences();
+
+
+ //////
+ //
+ // BAR
+
+ /**
+ * Return the total number of bars in the composition
+ */
+ int getNbBars() const;
+
+ /**
+ * Return the number of the bar that starts at or contains time t.
+ *
+ * Will happily return computed bar numbers for times before
+ * the start or beyond the real end of the composition.
+ */
+ int getBarNumber(timeT t) const;
+
+ /**
+ * Return the starting time of bar n
+ */
+ timeT getBarStart(int n) const {
+ return getBarRange(n).first;
+ }
+
+ /**
+ * Return the ending time of bar n
+ */
+ timeT getBarEnd(int n) const {
+ return getBarRange(n).second;
+ }
+
+ /**
+ * Return the time range of bar n.
+ *
+ * Will happily return theoretical timings for bars before the
+ * start or beyond the end of composition (i.e. there is no
+ * requirement that 0 <= n < getNbBars()).
+ */
+ std::pair<timeT, timeT> getBarRange(int n) const;
+
+ /**
+ * Return the starting time of the bar that contains time t
+ */
+ timeT getBarStartForTime(timeT t) const {
+ return getBarRangeForTime(t).first;
+ }
+
+ /**
+ * Return the ending time of the bar that contains time t
+ */
+ timeT getBarEndForTime(timeT t) const {
+ return getBarRangeForTime(t).second;
+ }
+
+ /**
+ * Return the starting and ending times of the bar that contains
+ * time t.
+ *
+ * Will happily return theoretical timings for bars before the
+ * start or beyond the end of composition.
+ */
+ std::pair<timeT, timeT> getBarRangeForTime(timeT t) const;
+
+ /**
+ * Get the default number of bars in a new empty composition
+ */
+ static int getDefaultNbBars() { return m_defaultNbBars; }
+
+ /**
+ * Set the default number of bars in a new empty composition
+ */
+ static void setDefaultNbBars(int b) { m_defaultNbBars = b; }
+
+
+ //////
+ //
+ // TIME SIGNATURE
+
+ /**
+ * Add the given time signature at the given time. Returns the
+ * resulting index of the time signature (suitable for passing
+ * to removeTimeSignature, for example)
+ */
+ int addTimeSignature(timeT t, TimeSignature timeSig);
+
+ /**
+ * Return the time signature in effect at time t
+ */
+ TimeSignature getTimeSignatureAt(timeT t) const;
+
+ /**
+ * Return the time signature in effect at time t, and the time at
+ * which it came into effect
+ */
+ timeT getTimeSignatureAt(timeT, TimeSignature &) const;
+
+ /**
+ * Return the time signature in effect in bar n. Also sets
+ * isNew to true if the time signature is a new one that did
+ * not appear in the previous bar.
+ */
+ TimeSignature getTimeSignatureInBar(int n, bool &isNew) const;
+
+ /**
+ * Return the total number of time signature changes in the
+ * composition.
+ */
+ int getTimeSignatureCount() const;
+
+ /**
+ * Return the index of the last time signature change before
+ * or at the given time, in a range suitable for passing to
+ * getTimeSignatureChange. Return -1 if there has been no
+ * time signature by this time.
+ */
+ int getTimeSignatureNumberAt(timeT time) const;
+
+ /**
+ * Return the absolute time of and time signature introduced
+ * by time-signature change n.
+ */
+ std::pair<timeT, TimeSignature> getTimeSignatureChange(int n) const;
+
+ /**
+ * Remove time signature change event n from the composition.
+ */
+ void removeTimeSignature(int n);
+
+
+
+ //////
+ //
+ // TEMPO
+
+ /**
+ * Return the (approximate) number of quarters per minute for a
+ * given tempo.
+ */
+ static double getTempoQpm(tempoT tempo) { return double(tempo) / 100000.0; }
+ static tempoT getTempoForQpm(double qpm) { return tempoT(qpm * 100000 + 0.01); }
+
+ /**
+ * Return the tempo in effect at time t. If a ramped tempo change
+ * is in effect at the time, it will be properly interpolated and
+ * a computed value returned.
+ */
+ tempoT getTempoAtTime(timeT t) const;
+
+ /**
+ * Return the tempo in effect at the current playback position.
+ */
+ tempoT getCurrentTempo() const { return getTempoAtTime(getPosition()); }
+
+ /**
+ * Set a default tempo for the composition. This will be
+ * overridden by any tempo events encountered during playback.
+ */
+ void setCompositionDefaultTempo(tempoT tempo) { m_defaultTempo = tempo; }
+ tempoT getCompositionDefaultTempo() const { return m_defaultTempo; }
+
+ /**
+ * Add a tempo-change event at the given time, to the given tempo.
+ * Removes any existing tempo event at that time. Returns the
+ * index of the new tempo event in a form suitable for passing to
+ * removeTempoChange.
+ *
+ * If targetTempo == -1, adds a single constant tempo change.
+ * If targetTempo == 0, adds a smooth tempo ramp from this tempo
+ * change to the next.
+ * If targetTempo > 0, adds a smooth tempo ramp from this tempo
+ * ending at targetTempo at the time of the next tempo change.
+ */
+ int addTempoAtTime(timeT time, tempoT tempo, tempoT targetTempo = -1);
+
+ /**
+ * Return the number of tempo changes in the composition.
+ */
+ int getTempoChangeCount() const;
+
+ /**
+ * Return the index of the last tempo change before the given
+ * time, in a range suitable for passing to getTempoChange.
+ * Return -1 if the default tempo is in effect at this time.
+ */
+ int getTempoChangeNumberAt(timeT time) const;
+
+ /**
+ * Return the absolute time of and tempo introduced by tempo
+ * change number n. If the tempo is ramped, this returns only
+ * the starting tempo.
+ */
+ std::pair<timeT, tempoT> getTempoChange(int n) const;
+
+ /**
+ * Return whether the tempo change number n is a ramped tempo or
+ * not, and if it is, return the target tempo for the ramp.
+ *
+ * If calculate is false, return a target tempo of 0 if the tempo
+ * change is defined to ramp to the following tempo. If calculate
+ * is true, return a target tempo equal to the following tempo in
+ * this case.
+ */
+ std::pair<bool, tempoT> getTempoRamping(int n, bool calculate = true) const;
+
+ /**
+ * Remove tempo change event n from the composition.
+ */
+ void removeTempoChange(int n);
+
+ /**
+ * Get the slowest assigned tempo in the composition.
+ */
+ tempoT getMinTempo() const {
+ return ((m_minTempo != 0) ? m_minTempo : m_defaultTempo);
+ }
+
+ /**
+ * Get the fastest assigned tempo in the composition.
+ */
+ tempoT getMaxTempo() const {
+ return ((m_maxTempo != 0) ? m_maxTempo : m_defaultTempo);
+ }
+
+
+ //////
+ //
+ // REAL TIME
+
+ /**
+ * Return the number of microseconds elapsed between
+ * the beginning of the composition and the given timeT time.
+ * (timeT units are independent of tempo; this takes into
+ * account any tempo changes in the first t units of time.)
+ *
+ * This is a fairly efficient operation, not dependent on the
+ * magnitude of t or the number of tempo changes in the piece.
+ */
+ RealTime getElapsedRealTime(timeT t) const;
+
+ /**
+ * Return the nearest time in timeT units to the point at the
+ * given number of microseconds after the beginning of the
+ * composition. (timeT units are independent of tempo; this takes
+ * into account any tempo changes in the first t microseconds.)
+ * The result will be approximate, as timeT units are obviously
+ * less precise than microseconds.
+ *
+ * This is a fairly efficient operation, not dependent on the
+ * magnitude of t or the number of tempo changes in the piece.
+ */
+ timeT getElapsedTimeForRealTime(RealTime t) const;
+
+ /**
+ * Return the number of microseconds elapsed between
+ * the two given timeT indices into the composition, taking
+ * into account any tempo changes between the two times.
+ */
+ RealTime getRealTimeDifference(timeT t0, timeT t1) const {
+ if (t1 > t0) return getElapsedRealTime(t1) - getElapsedRealTime(t0);
+ else return getElapsedRealTime(t0) - getElapsedRealTime(t1);
+ }
+
+
+ //////
+ //
+ // OTHER TIME CONVERSIONS
+
+ /**
+ * Return (by reference) the bar number and beat/division values
+ * corresponding to a given absolute time.
+ */
+ void getMusicalTimeForAbsoluteTime(timeT absoluteTime,
+ int &bar, int &beat,
+ int &fraction, int &remainder);
+
+ /**
+ * Return (by reference) the number of bars and beats/divisions
+ * corresponding to a given duration. The absolute time at which
+ * the duration starts is also required, so as to know the correct
+ * time signature.
+ */
+ void getMusicalTimeForDuration(timeT absoluteTime, timeT duration,
+ int &bars, int &beats,
+ int &fractions, int &remainder);
+
+ /**
+ * Return the absolute time corresponding to a given bar number
+ * and beat/division values.
+ */
+ timeT getAbsoluteTimeForMusicalTime(int bar, int beat,
+ int fraction, int remainder);
+
+ /**
+ * Return the duration corresponding to a given number of bars and
+ * beats/divisions. The absolute time at which the duration
+ * starts is also required, so as to know the correct time
+ * signature.
+ */
+ timeT getDurationForMusicalTime(timeT absoluteTime,
+ int bars, int beats,
+ int fractions, int remainder);
+
+
+ /**
+ * Get the current playback position.
+ */
+ timeT getPosition() const { return m_position; }
+
+ /**
+ * Set the current playback position.
+ */
+ void setPosition(timeT position);
+
+
+
+ //////
+ //
+ // LOOP
+
+ timeT getLoopStart() const { return m_loopStart; }
+ timeT getLoopEnd() const { return m_loopEnd;}
+
+ void setLoopStart(const timeT &lS) { m_loopStart = lS; }
+ void setLoopEnd(const timeT &lE) { m_loopEnd = lE; }
+
+ // Determine if we're currently looping
+ //
+ bool isLooping() const { return (m_loopStart != m_loopEnd); }
+
+
+
+ //////
+ //
+ // OTHER STUFF
+
+
+ // Some set<> API delegation
+ iterator begin() { return m_segments.begin(); }
+ const_iterator begin() const { return m_segments.begin(); }
+ iterator end() { return m_segments.end(); }
+ const_iterator end() const { return m_segments.end(); }
+
+
+ // XML exportable method
+ //
+ virtual std::string toXmlString();
+
+ // Who's making this racket?
+ //
+ Configuration &getMetadata() {
+ return m_metadata;
+ }
+ const Configuration &getMetadata() const {
+ return m_metadata;
+ }
+
+ std::string getCopyrightNote() const {
+ return m_metadata.get<String>(CompositionMetadataKeys::Copyright,
+ "");
+ }
+ void setCopyrightNote(const std::string &cr) {
+ m_metadata.set<String>(CompositionMetadataKeys::Copyright, cr);
+ }
+
+
+ // We can have the metronome on or off while playing or
+ // recording - get and set values from here
+ //
+ bool usePlayMetronome() const { return m_playMetronome; }
+ bool useRecordMetronome() const { return m_recordMetronome; }
+
+ void setPlayMetronome(bool value);
+ void setRecordMetronome(bool value);
+
+
+ // Colour stuff
+ ColourMap& getSegmentColourMap() { return m_segmentColourMap; }
+ const ColourMap& getSegmentColourMap() const { return m_segmentColourMap; }
+ void setSegmentColourMap(ColourMap &newmap);
+
+ // General colourmap for non-segments
+ //
+ ColourMap& getGeneralColourMap() { return m_generalColourMap; }
+ void setGeneralColourMap(ColourMap &newmap);
+
+
+ //////
+ //
+ // QUANTIZERS
+
+ /**
+ * Return a quantizer that quantizes to the our most basic
+ * units (i.e. a unit quantizer whose unit is our shortest
+ * note duration).
+ */
+ const BasicQuantizer *getBasicQuantizer() const {
+ return m_basicQuantizer;
+ }
+
+ /**
+ * Return a quantizer that does quantization for notation
+ * only.
+ */
+ const NotationQuantizer *getNotationQuantizer() const {
+ return m_notationQuantizer;
+ }
+
+
+ //////
+ //
+ // REFRESH STATUS
+
+ // delegate RefreshStatusArray API
+ unsigned int getNewRefreshStatusId() {
+ return m_refreshStatusArray.getNewRefreshStatusId();
+ }
+
+ RefreshStatus& getRefreshStatus(unsigned int id) {
+ return m_refreshStatusArray.getRefreshStatus(id);
+ }
+
+ /// Set all refresh statuses to true
+ void updateRefreshStatuses() {
+ m_refreshStatusArray.updateRefreshStatuses();
+ }
+
+
+ void addObserver(CompositionObserver *obs) { m_observers.push_back(obs); }
+ void removeObserver(CompositionObserver *obs) { m_observers.remove(obs); }
+
+ //////
+ // DEBUG FACILITIES
+ void dump(std::ostream&, bool full=false) const;
+
+protected:
+
+ static const std::string TempoEventType;
+ static const PropertyName TempoProperty;
+ static const PropertyName TargetTempoProperty;
+
+ static const PropertyName NoAbsoluteTimeProperty;
+ static const PropertyName BarNumberProperty;
+ static const PropertyName TempoTimestampProperty;
+
+
+ struct ReferenceSegmentEventCmp
+ {
+ bool operator()(const Event &e1, const Event &e2) const;
+ bool operator()(const Event *e1, const Event *e2) const {
+ return operator()(*e1, *e2);
+ }
+ };
+
+ struct BarNumberComparator
+ {
+ bool operator()(const Event &e1, const Event &e2) const {
+ return (e1.get<Int>(BarNumberProperty) <
+ e2.get<Int>(BarNumberProperty));
+ }
+ bool operator()(const Event *e1, const Event *e2) const {
+ return operator()(*e1, *e2);
+ }
+ };
+
+ /**
+ * Ensure the selected and record trackids still point to something valid
+ * Must be called after deletion of detach of a track
+ */
+ void checkSelectedAndRecordTracks();
+ TrackId getClosestValidTrackId(TrackId id) const;
+
+
+ //--------------- Data members ---------------------------------
+ //
+ trackcontainer m_tracks;
+ segmentcontainer m_segments;
+
+ // The tracks we are armed for record on
+ //
+ recordtrackcontainer m_recordTracks;
+
+ // Are we soloing and if so which Track?
+ //
+ bool m_solo;
+ TrackId m_selectedTrack;
+
+ /**
+ * This is a bit like a segment, but can only contain one sort of
+ * event, and can only have one event at each absolute time
+ */
+ class ReferenceSegment :
+ public FastVector<Event *> // not a set: want random access for bars
+ {
+ typedef FastVector<Event *> Impl;
+
+ public:
+ ReferenceSegment(std::string eventType);
+ virtual ~ReferenceSegment();
+ private:
+ ReferenceSegment(const ReferenceSegment &);
+ ReferenceSegment& operator=(const ReferenceSegment &);
+ public:
+ typedef Impl::iterator iterator;
+ typedef Impl::size_type size_type;
+ typedef Impl::difference_type difference_type;
+
+ void clear();
+
+ timeT getDuration() const;
+
+ /// Inserts a single event, removing any existing one at that time
+ iterator insert(Event *e); // may throw Event::BadType
+
+ void erase(Event *e);
+
+ iterator findTime(timeT time);
+ iterator findNearestTime(timeT time);
+
+ iterator findRealTime(RealTime time);
+ iterator findNearestRealTime(RealTime time);
+
+ std::string getEventType() const { return m_eventType; }
+
+ private:
+ iterator find(Event *e);
+ std::string m_eventType;
+ };
+
+ /// Contains time signature events
+ mutable ReferenceSegment m_timeSigSegment;
+
+ /// Contains tempo events
+ mutable ReferenceSegment m_tempoSegment;
+
+ /// affects m_timeSigSegment
+ void calculateBarPositions() const;
+ mutable bool m_barPositionsNeedCalculating;
+ ReferenceSegment::iterator getTimeSignatureAtAux(timeT t) const;
+
+ /// affects m_tempoSegment
+ void calculateTempoTimestamps() const;
+ mutable bool m_tempoTimestampsNeedCalculating;
+ RealTime time2RealTime(timeT time, tempoT tempo) const;
+ RealTime time2RealTime(timeT time, tempoT tempo,
+ timeT targetTempoTime, tempoT targetTempo) const;
+ timeT realTime2Time(RealTime rtime, tempoT tempo) const;
+ timeT realTime2Time(RealTime rtime, tempoT tempo,
+ timeT targetTempoTime, tempoT targetTempo) const;
+
+ bool getTempoTarget(ReferenceSegment::const_iterator i,
+ tempoT &target,
+ timeT &targetTime) const;
+
+ static RealTime getTempoTimestamp(const Event *e);
+ static void setTempoTimestamp(Event *e, RealTime r);
+
+ typedef std::list<CompositionObserver *> ObserverSet;
+ ObserverSet m_observers;
+
+ void notifySegmentAdded(Segment *) const;
+ void notifySegmentRemoved(Segment *) const;
+ void notifySegmentRepeatChanged(Segment *, bool) const;
+ void notifySegmentRepeatEndChanged(Segment *, timeT) const;
+ void notifySegmentEventsTimingChanged(Segment *s, timeT delay, RealTime rtDelay) const;
+ void notifySegmentTransposeChanged(Segment *s, int transpose) const;
+ void notifySegmentTrackChanged(Segment *s, TrackId oldId, TrackId newId) const;
+ void notifySegmentStartChanged(Segment *, timeT);
+ void notifySegmentEndMarkerChange(Segment *s, bool shorten);
+ void notifyEndMarkerChange(bool shorten) const;
+ void notifyTrackChanged(Track*) const;
+ void notifyTrackDeleted(TrackId) const;
+ void notifyMetronomeChanged() const;
+ void notifyTimeSignatureChanged() const;
+ void notifySoloChanged() const;
+ void notifyTempoChanged() const;
+ void notifySourceDeletion() const;
+
+ void updateExtremeTempos();
+
+ BasicQuantizer *m_basicQuantizer;
+ NotationQuantizer *m_notationQuantizer;
+
+ timeT m_position;
+ tempoT m_defaultTempo;
+ tempoT m_minTempo; // cached from tempo segment
+ tempoT m_maxTempo; // cached from tempo segment
+
+ // Notional Composition markers - these define buffers for the
+ // start and end of the piece, Segments can still exist outside
+ // of these markers - these are for visual and playback cueing.
+ //
+ timeT m_startMarker;
+ timeT m_endMarker;
+
+ static int m_defaultNbBars;
+
+ // Loop start and end positions. If they're both the same
+ // value (usually 0) then there's no loop set.
+ //
+ timeT m_loopStart;
+ timeT m_loopEnd;
+
+ Configuration m_metadata;
+
+ bool m_playMetronome;
+ bool m_recordMetronome;
+
+ RefreshStatusArray<RefreshStatus> m_refreshStatusArray;
+
+ // User defined markers in the composition
+ //
+ markercontainer m_markers;
+
+ // Trigger segments (unsorted segments fired by events elsewhere)
+ //
+ triggersegmentcontainer m_triggerSegments;
+ TriggerSegmentId m_nextTriggerSegmentId;
+
+ ColourMap m_segmentColourMap;
+ ColourMap m_generalColourMap;
+};
+
+
+/**
+ * If you subclass from CompositionObserver, you can then attach to a
+ * Composition to receive notification when something changes.
+ *
+ * Normally all the methods in this class would be pure virtual. But
+ * because there are so many, that imposes far too much work on the
+ * subclass implementation in a case where it only really wants to
+ * know about one thing, such as segments being deleted. So we have
+ * empty default implementations, and you'll just have to take a bit
+ * more care to make sure you really are making the correct
+ * declarations in the subclass.
+ */
+
+class CompositionObserver
+{
+public:
+ CompositionObserver() : m_compositionDeleted(false) {}
+
+ virtual ~CompositionObserver() {}
+
+ /**
+ * Called after the segment has been added to the composition
+ */
+ virtual void segmentAdded(const Composition *, Segment *) { }
+
+ /**
+ * Called after the segment has been removed from the segment,
+ * and just before it is deleted
+ */
+ virtual void segmentRemoved(const Composition *, Segment *) { }
+
+ /**
+ * Called when the segment's repeat status has changed
+ */
+ virtual void segmentRepeatChanged(const Composition *, Segment *, bool) { }
+
+ /**
+ * Called when the segment's repeat end time has changed
+ */
+ virtual void segmentRepeatEndChanged(const Composition *, Segment *, timeT) { }
+
+ /**
+ * Called when the segment's delay timing has changed
+ */
+ virtual void segmentEventsTimingChanged(const Composition *, Segment *,
+ timeT /* delay */,
+ RealTime /* rtDelay */) { }
+
+ /**
+ * Called when the segment's transpose value has changed
+ */
+ virtual void segmentTransposeChanged(const Composition *, Segment *,
+ int /* transpose */) { }
+
+ /**
+ * Called when the segment's start time has changed
+ */
+ virtual void segmentStartChanged(const Composition *, Segment *,
+ timeT /* newStartTime */) { }
+
+ /**
+ * Called when the segment's end marker time has changed
+ */
+ virtual void segmentEndMarkerChanged(const Composition *, Segment *,
+ bool /* shorten */) { }
+
+ /**
+ * Called when the segment's track has changed
+ */
+ virtual void segmentTrackChanged(const Composition *, Segment *,
+ TrackId /* id */) { }
+
+ /**
+ * Called after the composition's end marker time has been
+ * changed
+ */
+ virtual void endMarkerTimeChanged(const Composition *, bool /* shorten */) { }
+
+ /**
+ * Called when a track is changed (instrument id, muted status...)
+ */
+ virtual void trackChanged(const Composition *, Track*) { }
+
+ /**
+ * Called when a track has been deleted
+ */
+ virtual void trackDeleted(const Composition *, TrackId) { }
+
+ /**
+ * Called when some time signature has changed
+ */
+ virtual void timeSignatureChanged(const Composition *) { }
+
+ /**
+ * Called when metronome status has changed (on/off)
+ */
+ virtual void metronomeChanged(const Composition *) { }
+
+ /**
+ * Called when solo status changes (solo on/off, and selected track)
+ */
+ virtual void soloChanged(const Composition *, bool /* solo */,
+ TrackId /* selectedTrack */) { }
+
+ /**
+ * Called when solo status changes (solo on/off, and selected track)
+ */
+ virtual void tempoChanged(const Composition *) { }
+
+ /**
+ * Called from the composition dtor
+ */
+ virtual void compositionDeleted(const Composition *) {
+ m_compositionDeleted = true;
+ }
+
+ bool isCompositionDeleted() { return m_compositionDeleted; }
+
+protected:
+ bool m_compositionDeleted;
+};
+
+}
+
+
+#endif
+
diff --git a/src/base/CompositionTimeSliceAdapter.cpp b/src/base/CompositionTimeSliceAdapter.cpp
new file mode 100644
index 0000000..b91b804
--- /dev/null
+++ b/src/base/CompositionTimeSliceAdapter.cpp
@@ -0,0 +1,283 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ This file is Copyright 2002
+ Randall Farmer <[email protected]>
+ with additional work by Chris Cannam.
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+// !!!TODO: handle timeslices
+
+#include <list>
+#include <utility>
+
+#include "CompositionTimeSliceAdapter.h"
+#include "Segment.h"
+#include "Composition.h"
+#include "Selection.h"
+
+namespace Rosegarden {
+
+using std::list;
+using std::pair;
+
+CompositionTimeSliceAdapter::CompositionTimeSliceAdapter(Composition *c,
+ timeT begin,
+ timeT end) :
+ m_composition(c),
+ m_begin(begin),
+ m_end(end)
+{
+ if (begin == end) {
+ m_begin = 0;
+ m_end = c->getDuration();
+ }
+
+ for (Composition::iterator ci = m_composition->begin();
+ ci != m_composition->end(); ++ci) {
+ m_segmentList.push_back(*ci);
+ }
+}
+
+CompositionTimeSliceAdapter::CompositionTimeSliceAdapter(Composition *c,
+ SegmentSelection* s,
+ timeT begin,
+ timeT end) :
+ m_composition(c),
+ m_begin(begin),
+ m_end(end)
+{
+ if (begin == end) {
+ m_begin = 0;
+ m_end = c->getDuration();
+ }
+
+ for (Composition::iterator ci = m_composition->begin();
+ ci != m_composition->end(); ++ci) {
+ if (!s || s->find(*ci) != s->end()) {
+ m_segmentList.push_back(*ci);
+ }
+ }
+}
+
+CompositionTimeSliceAdapter::CompositionTimeSliceAdapter(Composition *c,
+ const TrackSet &trackIDs,
+ timeT begin,
+ timeT end) :
+ m_composition(c),
+ m_begin(begin),
+ m_end(end)
+{
+ if (begin == end) {
+ m_begin = 0;
+ m_end = c->getDuration();
+ }
+
+ for (Composition::iterator ci = m_composition->begin();
+ ci != m_composition->end(); ++ci) {
+ if (trackIDs.find((*ci)->getTrack()) != trackIDs.end()) {
+ m_segmentList.push_back(*ci);
+ }
+ }
+}
+
+CompositionTimeSliceAdapter::iterator
+CompositionTimeSliceAdapter::begin() const
+{
+ if (m_beginItr.m_a == 0) {
+ m_beginItr = iterator(this);
+ fill(m_beginItr, false);
+ }
+ return m_beginItr;
+}
+
+CompositionTimeSliceAdapter::iterator
+CompositionTimeSliceAdapter::end() const
+{
+ return iterator(this);
+}
+
+void
+CompositionTimeSliceAdapter::fill(iterator &i, bool atEnd) const
+{
+ // The segment iterators should all point to events starting at or
+ // after m_begin (if atEnd false) or at or before m_end (if atEnd true).
+
+ for (unsigned int k = 0; k < m_segmentList.size(); ++k) {
+ Segment::iterator j = m_segmentList[k]->findTime(atEnd ? m_end : m_begin);
+ i.m_segmentItrList.push_back(j);
+ }
+
+ // fill m_curEvent & m_curTrack
+ if (!atEnd) ++i;
+}
+
+CompositionTimeSliceAdapter::iterator&
+CompositionTimeSliceAdapter::iterator::operator=(const iterator &i)
+{
+ if (&i == this) return *this;
+ m_segmentItrList.clear();
+
+ for (segmentitrlist::const_iterator j = i.m_segmentItrList.begin();
+ j != i.m_segmentItrList.end(); ++j) {
+ m_segmentItrList.push_back(Segment::iterator(*j));
+ }
+
+ m_a = i.m_a;
+ m_curTrack = i.m_curTrack;
+ m_curEvent = i.m_curEvent;
+ m_needFill = i.m_needFill;
+ return *this;
+}
+
+CompositionTimeSliceAdapter::iterator::iterator(const iterator &i) :
+ m_a(i.m_a),
+ m_curEvent(i.m_curEvent),
+ m_curTrack(i.m_curTrack),
+ m_needFill(i.m_needFill)
+{
+ for (segmentitrlist::const_iterator j = i.m_segmentItrList.begin();
+ j != i.m_segmentItrList.end(); ++j) {
+ m_segmentItrList.push_back(Segment::iterator(*j));
+ }
+}
+
+CompositionTimeSliceAdapter::iterator&
+CompositionTimeSliceAdapter::iterator::operator++()
+{
+ assert(m_a != 0);
+
+ // needFill is only set true for iterators created at end()
+ if (m_needFill) {
+ m_a->fill(*this, true);
+ m_needFill = false;
+ }
+
+ Event *e = 0;
+ unsigned int pos = 0;
+
+ for (unsigned int i = 0; i < m_a->m_segmentList.size(); ++i) {
+
+ if (!m_a->m_segmentList[i]->isBeforeEndMarker(m_segmentItrList[i])) continue;
+
+ if (!e || strictLessThan(*m_segmentItrList[i], e)) {
+ e = *m_segmentItrList[i];
+ m_curTrack = m_a->m_segmentList[i]->getTrack();
+ pos = i;
+ }
+ }
+
+ // Check whether we're past the end time, if there is one
+ if (!e || e->getAbsoluteTime() >= m_a->m_end) {
+ m_curEvent = 0;
+ m_curTrack = -1;
+ return *this;
+ }
+
+ // e is now an Event* less than or equal to any that the iterator
+ // hasn't already passed over
+ m_curEvent = e;
+
+ // m_segmentItrList[pos] is a segment::iterator that points to e
+ ++m_segmentItrList[pos];
+
+ return *this;
+}
+
+CompositionTimeSliceAdapter::iterator&
+CompositionTimeSliceAdapter::iterator::operator--()
+{
+ assert(m_a != 0);
+
+ // needFill is only set true for iterators created at end()
+ if (m_needFill) {
+ m_a->fill(*this, true);
+ m_needFill = false;
+ }
+
+ Event *e = 0;
+ int pos = -1;
+
+ // Decrement is more subtle than increment. We have to scan the
+ // iterators available, and decrement the one that points to
+ // m_curEvent. Then to fill m_curEvent we need to find the next
+ // greatest event back that is not itself m_curEvent.
+
+ for (unsigned int i = 0; i < m_a->m_segmentList.size(); ++i) {
+
+ if (m_segmentItrList[i] == m_a->m_segmentList[i]->begin()) continue;
+
+ Segment::iterator si(m_segmentItrList[i]);
+ --si;
+
+ if (*si == m_curEvent) {
+ pos = i;
+ } else if (!e || !strictLessThan(*si, e)) {
+ e = *si;
+ m_curTrack = m_a->m_segmentList[i]->getTrack();
+ }
+ }
+
+ if (e) m_curEvent = e;
+ if (pos >= 0) {
+ --m_segmentItrList[pos];
+ }
+
+ return *this;
+}
+
+bool
+CompositionTimeSliceAdapter::iterator::operator==(const iterator& other) const {
+ return m_a == other.m_a && m_curEvent == other.m_curEvent;
+}
+
+bool
+CompositionTimeSliceAdapter::iterator::operator!=(const iterator& other) const {
+ return !operator==(other);
+}
+
+Event *
+CompositionTimeSliceAdapter::iterator::operator*() const {
+ return m_curEvent;
+}
+
+Event &
+CompositionTimeSliceAdapter::iterator::operator->() const {
+ return *m_curEvent;
+}
+
+int
+CompositionTimeSliceAdapter::iterator::getTrack() const {
+ return m_curTrack;
+}
+
+bool
+CompositionTimeSliceAdapter::iterator::strictLessThan(Event *e1, Event *e2) {
+ // We need a complete ordering of events -- we can't cope with two events
+ // comparing equal. i.e. one of e1 < e2 and e2 < e1 must be true. The
+ // ordering can be arbitrary -- we just compare addresses for events the
+ // event comparator doesn't distinguish between. We know we're always
+ // dealing with event pointers, not copies of events.
+ if (*e1 < *e2) return true;
+ else if (*e2 < *e1) return false;
+ else return e1 < e2;
+}
+
+}
diff --git a/src/base/CompositionTimeSliceAdapter.h b/src/base/CompositionTimeSliceAdapter.h
new file mode 100644
index 0000000..01307e3
--- /dev/null
+++ b/src/base/CompositionTimeSliceAdapter.h
@@ -0,0 +1,149 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ This file is Copyright 2002
+ Randall Farmer <[email protected]>
+ with additional work by Chris Cannam.
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _COMPOSITION_TIMESLICE_ADAPTER_H_
+#define _COMPOSITION_TIMESLICE_ADAPTER_H_
+
+#include <list>
+#include <utility>
+
+#include "Segment.h"
+
+namespace Rosegarden {
+
+class Event;
+class Composition;
+class SegmentSelection;
+
+/**
+ * CompositionTimeSliceAdapter provides the ability to iterate through
+ * all the events in a Composition in time order, across many segments
+ * at once.
+ *
+ * The CompositionTimeSliceAdapter is suitable for use as the backing
+ * container for the Set classes, notably GenericChord (see Sets.h).
+ * This combination enables you to iterate through a Composition as a
+ * sequence of chords composed of all Events on a set of Segments that
+ * lie within a particular quantize range of one another.
+ */
+
+class CompositionTimeSliceAdapter
+{
+public:
+ class iterator;
+ typedef std::set<TrackId> TrackSet;
+
+ /**
+ * Construct a CompositionTimeSliceAdapter that operates on the
+ * given section in time of the given composition. If begin and
+ * end are equal, the whole composition will be used.
+ */
+ CompositionTimeSliceAdapter(Composition* c,
+ timeT begin = 0,
+ timeT end = 0);
+
+ /**
+ * Construct a CompositionTimeSliceAdapter that operates on the
+ * given section in time of the given set of segments within the
+ * given composition. If begin and end are equal, the whole
+ * duration of the composition will be used.
+ */
+ CompositionTimeSliceAdapter(Composition* c,
+ SegmentSelection* s,
+ timeT begin = 0,
+ timeT end = 0);
+
+ /**
+ * Construct a CompositionTimeSliceAdapter that operates on the
+ * given section in time of all the segments in the given set of
+ * tracks within the given composition. If begin and end are
+ * equal, the whole duration of the composition will be used.
+ */
+ CompositionTimeSliceAdapter(Composition *c,
+ const TrackSet &trackIDs,
+ timeT begin = 0,
+ timeT end = 0);
+
+ ~CompositionTimeSliceAdapter() { };
+
+ // bit sloppy -- we don't have a const_iterator
+ iterator begin() const;
+ iterator end() const;
+
+ typedef std::vector<Segment *> segmentlist;
+ typedef std::vector<Segment::iterator> segmentitrlist;
+
+ Composition *getComposition() { return m_composition; }
+
+ class iterator {
+ friend class CompositionTimeSliceAdapter;
+
+ public:
+ iterator() :
+ m_a(0), m_curEvent(0), m_curTrack(-1), m_needFill(true) { }
+ iterator(const CompositionTimeSliceAdapter *a) :
+ m_a(a), m_curEvent(0), m_curTrack(-1), m_needFill(true) { }
+ iterator(const iterator &);
+ iterator &operator=(const iterator &);
+ ~iterator() { };
+
+ iterator &operator++();
+ iterator &operator--();
+
+ bool operator==(const iterator& other) const;
+ bool operator!=(const iterator& other) const;
+
+ Event *operator*() const;
+ Event &operator->() const;
+
+ int getTrack() const;
+
+ private:
+ segmentitrlist m_segmentItrList;
+ const CompositionTimeSliceAdapter *m_a;
+ Event* m_curEvent;
+ int m_curTrack;
+ bool m_needFill;
+
+ static bool strictLessThan(Event *, Event *);
+ };
+
+
+private:
+ friend class iterator;
+
+ Composition* m_composition;
+ mutable iterator m_beginItr;
+ timeT m_begin;
+ timeT m_end;
+
+ segmentlist m_segmentList;
+
+ void fill(iterator &, bool atEnd) const;
+};
+
+}
+
+#endif
diff --git a/src/base/Configuration.cpp b/src/base/Configuration.cpp
new file mode 100644
index 0000000..a3d836f
--- /dev/null
+++ b/src/base/Configuration.cpp
@@ -0,0 +1,232 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+// Class to hold extraneous bits of configuration which
+// don't sit inside the Composition itself - sequencer
+// and other general stuff that we want to keep separate.
+//
+//
+
+#include <string>
+#include <algorithm>
+
+#include "Configuration.h"
+
+#if (__GNUC__ < 3)
+#include <strstream>
+#define stringstream strstream
+#else
+#include <sstream>
+#endif
+
+
+namespace Rosegarden
+{
+
+Configuration::Configuration(const Configuration &conf) :
+ PropertyMap(),
+ XmlExportable()
+{
+ clear();
+
+ // Copy everything
+ //
+ for (const_iterator i = conf.begin(); i != conf.end(); ++i)
+ insert(PropertyPair(i->first, i->second->clone()));
+}
+
+Configuration::~Configuration()
+{
+ clear();
+}
+
+
+std::vector<std::string>
+Configuration::getPropertyNames()
+{
+ std::vector<std::string> v;
+ for (const_iterator i = begin(); i != end(); ++i) {
+ v.push_back(i->first.getName());
+ }
+ std::sort(v.begin(), v.end());
+ return v;
+}
+
+
+bool
+Configuration::has(const PropertyName &name) const
+{
+ const_iterator i = find(name);
+ return (i != end());
+}
+
+
+std::string
+Configuration::toXmlString()
+{
+ using std::endl;
+ std::stringstream config;
+
+ // This simple implementation just assumes everything's a string.
+ // Override it if you want something fancier (or reimplement it to
+ // support the whole gamut -- the reader in rosexmlhandler.cpp
+ // already can)
+
+ for (const_iterator i = begin(); i != end(); ++i) {
+ config << "<property name=\""
+ << encode(i->first.getName()) << "\" value=\""
+ << encode(get<String>(i->first)) << "\"/>" << endl;
+ }
+
+#if (__GNUC__ < 3)
+ config << endl << std::ends;
+#else
+ config << endl;
+#endif
+
+ return config.str();
+}
+
+Configuration&
+Configuration::operator=(const Configuration &conf)
+{
+ clear();
+
+ // Copy everything
+ //
+ for (const_iterator i = conf.begin(); i != conf.end(); ++i)
+ insert(PropertyPair(i->first, i->second->clone()));
+
+ return (*this);
+}
+
+
+
+namespace CompositionMetadataKeys
+{
+ const PropertyName Copyright = "copyright";
+ const PropertyName Composer = "composer";
+ const PropertyName Title = "title";
+ const PropertyName Subtitle = "subtitle";
+ const PropertyName Arranger = "arranger";
+ // The following are recognized only by LilyPond output
+ const PropertyName Dedication = "dedication";
+ const PropertyName Subsubtitle = "subsubtitle";
+ const PropertyName Poet = "poet";
+ const PropertyName Meter = "meter";
+ const PropertyName Opus = "opus";
+ const PropertyName Instrument = "instrument";
+ const PropertyName Piece = "piece";
+ const PropertyName Tagline = "tagline";
+
+ // The tab order of the edit fields in HeadersConfigurationPage
+ // is defined by the creation order of the edit fields.
+ // The edit fields are created in the order of the keys in getFixedKeys().
+ std::vector<PropertyName> getFixedKeys() {
+ std::vector<PropertyName> keys;
+ keys.push_back(Dedication);
+ keys.push_back(Title);
+ keys.push_back(Subtitle);
+ keys.push_back(Subsubtitle);
+ keys.push_back(Poet);
+ keys.push_back(Instrument);
+ keys.push_back(Composer);
+ keys.push_back(Meter);
+ keys.push_back(Arranger);
+ keys.push_back(Piece);
+ keys.push_back(Opus);
+ keys.push_back(Copyright);
+ keys.push_back(Tagline);
+
+ return keys;
+ }
+}
+
+
+// Keep these in lower case
+const PropertyName DocumentConfiguration::SequencerOptions = "sequenceroptions";
+const PropertyName DocumentConfiguration::ZoomLevel = "zoomlevel";
+const PropertyName DocumentConfiguration::TransportMode = "transportmode";
+
+
+DocumentConfiguration::DocumentConfiguration()
+{
+ set<Int>(ZoomLevel, 0);
+ set<String>(TransportMode, ""); // apparently generates an exception if not initialized
+}
+
+DocumentConfiguration::DocumentConfiguration(const DocumentConfiguration &conf):
+ Configuration()
+{
+ for (const_iterator i = conf.begin(); i != conf.end(); ++i)
+ insert(PropertyPair(i->first, i->second->clone()));
+}
+
+DocumentConfiguration::~DocumentConfiguration()
+{
+ clear();
+}
+
+
+DocumentConfiguration&
+DocumentConfiguration::operator=(const DocumentConfiguration &conf)
+{
+ clear();
+
+ for (const_iterator i = conf.begin(); i != conf.end(); ++i)
+ insert(PropertyPair(i->first, i->second->clone()));
+
+ return *this;
+}
+
+
+// Convert to XML string for export
+//
+std::string
+DocumentConfiguration::toXmlString()
+{
+ using std::endl;
+
+ std::stringstream config;
+
+ config << endl << "<configuration>" << endl;
+
+ config << " <" << ZoomLevel << " type=\"Int\">" << get<Int>(ZoomLevel)
+ << "</" << ZoomLevel << ">\n";
+
+ config << " <" << TransportMode << " type=\"String\">" << get<String>(TransportMode)
+ << "</" << TransportMode << ">\n";
+
+ config << "</configuration>" << endl;
+
+#if (__GNUC__ < 3)
+ config << endl << std::ends;
+#else
+ config << endl;
+#endif
+
+ return config.str();
+}
+
+}
+
+
diff --git a/src/base/Configuration.h b/src/base/Configuration.h
new file mode 100644
index 0000000..23b3776
--- /dev/null
+++ b/src/base/Configuration.h
@@ -0,0 +1,211 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+// Class to hold extraenous bits of configuration which
+// don't sit inside the Composition itself - sequencer
+// and other general stuff that we want to keep separate.
+//
+//
+
+#include <string>
+#include <vector>
+
+#include "Instrument.h"
+#include "RealTime.h"
+#include "PropertyMap.h"
+#include "Exception.h"
+#include "XmlExportable.h"
+
+#ifndef _CONFIGURATION_H_
+#define _CONFIGURATION_H_
+
+namespace Rosegarden
+{
+
+class Configuration : public PropertyMap, public XmlExportable
+{
+public:
+ class NoData : public Exception {
+ public:
+ NoData(std::string property, std::string file, int line) :
+ Exception("No data found for property " + property, file, line) { }
+ };
+
+ class BadType : public Exception {
+ public:
+ BadType(std::string property, std::string expected, std::string actual,
+ std::string file, int line) :
+ Exception("Bad type for " + property + " (expected " +
+ expected + ", found " + actual + ")", file, line) { }
+ };
+
+ Configuration() {;}
+ Configuration(const Configuration &);
+ ~Configuration();
+
+ bool has(const PropertyName &name) const;
+
+ template <PropertyType P>
+ void
+ set(const PropertyName &name,
+ typename PropertyDefn<P>::basic_type value);
+
+ /**
+ * get() with a default value
+ */
+ template <PropertyType P>
+ typename PropertyDefn<P>::basic_type
+ get(const PropertyName &name,
+ typename PropertyDefn<P>::basic_type defaultVal) const;
+
+ /**
+ * regular get()
+ */
+ template <PropertyType P>
+ typename PropertyDefn<P>::basic_type get(const PropertyName &name) const;
+
+ // For exporting -- doesn't write the <configuration> part of
+ // the element in case you want to write it into another element
+ //
+ virtual std::string toXmlString();
+
+ /// Return all the contained property names in alphabetical order
+ std::vector<std::string> getPropertyNames();
+
+ // Assignment
+ //
+ Configuration& operator=(const Configuration &);
+
+private:
+
+};
+
+namespace CompositionMetadataKeys
+{
+ extern const PropertyName Composer;
+ extern const PropertyName Arranger;
+ extern const PropertyName Copyright;
+ extern const PropertyName Title;
+ extern const PropertyName Subtitle;
+ // The following are recognized only by LilyPond output
+ extern const PropertyName Subsubtitle;
+ extern const PropertyName Dedication;
+ extern const PropertyName Poet;
+ extern const PropertyName Meter;
+ extern const PropertyName Opus;
+ extern const PropertyName Instrument;
+ extern const PropertyName Piece;
+ extern const PropertyName Tagline;
+
+
+ std::vector<PropertyName> getFixedKeys();
+}
+
+class DocumentConfiguration : public Configuration
+{
+public:
+ DocumentConfiguration();
+ DocumentConfiguration(const DocumentConfiguration &);
+ ~DocumentConfiguration();
+
+ DocumentConfiguration& operator=(const DocumentConfiguration &);
+
+ // for exporting -- doesn't write the <configuration> part of
+ // the element in case you want to write it into another element
+ //
+ virtual std::string toXmlString();
+
+ // Property names
+ static const PropertyName SequencerOptions;
+
+ static const PropertyName ZoomLevel;
+
+ static const PropertyName TransportMode;
+};
+
+
+template <PropertyType P>
+void
+Configuration::set(const PropertyName &name,
+ typename PropertyDefn<P>::basic_type value)
+{
+ iterator i = find(name);
+
+ if (i != end()) {
+
+ // A property with the same name has
+ // already been set - recycle it, just change the data
+ PropertyStoreBase *sb = i->second;
+ (static_cast<PropertyStore<P> *>(sb))->setData(value);
+
+ } else {
+
+ PropertyStoreBase *p = new PropertyStore<P>(value);
+ insert(PropertyPair(name, p));
+
+ }
+
+}
+
+template <PropertyType P>
+typename PropertyDefn<P>::basic_type
+Configuration::get(const PropertyName &name,
+ typename PropertyDefn<P>::basic_type defaultVal) const
+
+{
+ const_iterator i = find(name);
+
+ if (i == end()) return defaultVal;
+
+ PropertyStoreBase *sb = i->second;
+ if (sb->getType() == P) {
+ return (static_cast<PropertyStore<P> *>(sb))->getData();
+ } else {
+ throw BadType(name.getName(),
+ PropertyDefn<P>::typeName(), sb->getTypeName(),
+ __FILE__, __LINE__);
+ }
+}
+
+template <PropertyType P>
+typename PropertyDefn<P>::basic_type
+Configuration::get(const PropertyName &name) const
+
+{
+ const_iterator i = find(name);
+
+ if (i == end()) throw NoData(name.getName(), __FILE__, __LINE__);
+
+ PropertyStoreBase *sb = i->second;
+ if (sb->getType() == P) {
+ return (static_cast<PropertyStore<P> *>(sb))->getData();
+ } else {
+ throw BadType(name.getName(),
+ PropertyDefn<P>::typeName(), sb->getTypeName(),
+ __FILE__, __LINE__);
+ }
+}
+
+
+}
+
+#endif // _AUDIODEVICE_H_
diff --git a/src/base/ControlParameter.cpp b/src/base/ControlParameter.cpp
new file mode 100644
index 0000000..8606cf3
--- /dev/null
+++ b/src/base/ControlParameter.cpp
@@ -0,0 +1,144 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#if (__GNUC__ < 3)
+#include <strstream>
+#define stringstream strstream
+#else
+#include <sstream>
+#endif
+
+#include "ControlParameter.h"
+#include "MidiTypes.h"
+
+namespace Rosegarden
+{
+
+ControlParameter::ControlParameter():
+ m_name("<unnamed>"),
+ m_type(Rosegarden::Controller::EventType),
+ m_description("<none>"),
+ m_min(0),
+ m_max(127),
+ m_default(0),
+ m_controllerValue(0),
+ m_colourIndex(0),
+ m_ipbPosition(-1) // doesn't appear on IPB by default
+{
+}
+
+
+ControlParameter::ControlParameter(const std::string &name,
+ const std::string &type,
+ const std::string &description,
+ int min,
+ int max,
+ int def,
+ MidiByte controllerValue,
+ unsigned int colour,
+ int ipbPosition):
+ m_name(name),
+ m_type(type),
+ m_description(description),
+ m_min(min),
+ m_max(max),
+ m_default(def),
+ m_controllerValue(controllerValue),
+ m_colourIndex(colour),
+ m_ipbPosition(ipbPosition)
+{
+}
+
+
+ControlParameter::ControlParameter(const ControlParameter &control):
+ XmlExportable(),
+ m_name(control.getName()),
+ m_type(control.getType()),
+ m_description(control.getDescription()),
+ m_min(control.getMin()),
+ m_max(control.getMax()),
+ m_default(control.getDefault()),
+ m_controllerValue(control.getControllerValue()),
+ m_colourIndex(control.getColourIndex()),
+ m_ipbPosition(control.getIPBPosition())
+{
+}
+
+ControlParameter&
+ControlParameter::operator=(const ControlParameter &control)
+{
+ m_name = control.getName();
+ m_type = control.getType();
+ m_description = control.getDescription();
+ m_min = control.getMin();
+ m_max = control.getMax();
+ m_default = control.getDefault();
+ m_controllerValue = control.getControllerValue();
+ m_colourIndex = control.getColourIndex();
+ m_ipbPosition = control.getIPBPosition();
+
+ return *this;
+}
+
+bool ControlParameter::operator==(const ControlParameter &control)
+{
+ return m_type == control.getType() &&
+ m_controllerValue == control.getControllerValue() &&
+ m_min == control.getMin() &&
+ m_max == control.getMax();
+}
+
+bool operator<(const ControlParameter &a, const ControlParameter &b)
+{
+ if (a.m_type != b.m_type)
+ return a.m_type < b.m_type;
+ else if (a.m_controllerValue != b.m_controllerValue)
+ return a.m_controllerValue < b.m_controllerValue;
+ else
+ return false;
+}
+
+
+std::string
+ControlParameter::toXmlString()
+{
+ std::stringstream control;
+
+ control << " <control name=\"" << encode(m_name)
+ << "\" type=\"" << encode(m_type)
+ << "\" description=\"" << encode(m_description)
+ << "\" min=\"" << m_min
+ << "\" max=\"" << m_max
+ << "\" default=\"" << m_default
+ << "\" controllervalue=\"" << int(m_controllerValue)
+ << "\" colourindex=\"" << m_colourIndex
+ << "\" ipbposition=\"" << m_ipbPosition;
+
+#if (__GNUC__ < 3)
+ control << "\"/>" << endl << std::ends;
+#else
+ control << "\"/>" << std::endl;
+#endif
+
+ return control.str();
+}
+
+}
diff --git a/src/base/ControlParameter.h b/src/base/ControlParameter.h
new file mode 100644
index 0000000..d9e487f
--- /dev/null
+++ b/src/base/ControlParameter.h
@@ -0,0 +1,124 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _CONTROLPARAMETER_H_
+#define _CONTROLPARAMETER_H_
+
+#include <string>
+
+#include "XmlExportable.h"
+#include "MidiProgram.h"
+
+namespace Rosegarden
+{
+
+class ControlParameter : public XmlExportable
+{
+public:
+ ControlParameter();
+ ControlParameter(const std::string &name,
+ const std::string &type,
+ const std::string &description,
+ int min = 0,
+ int max = 127,
+ int def = 0,
+ MidiByte controllerValue = 0,
+ unsigned int colour = 0,
+ int ipbPositon = -1);
+ ControlParameter(const ControlParameter &control);
+ ControlParameter& operator=(const ControlParameter &control);
+ bool operator==(const ControlParameter &control);
+
+ friend bool operator<(const ControlParameter &a, const ControlParameter &b);
+
+ // ControlParameter comparison on IPB position
+ //
+ struct ControlPositionCmp
+ {
+ bool operator()(ControlParameter *c1,
+ ControlParameter *c2)
+ {
+ return (c1->getIPBPosition() < c2->getIPBPosition());
+ }
+
+ bool operator()(const ControlParameter &c1,
+ const ControlParameter &c2)
+ {
+ return (c1.getIPBPosition() < c2.getIPBPosition());
+ }
+ };
+
+ std::string getName() const { return m_name; }
+ std::string getType() const { return m_type; }
+ std::string getDescription() const { return m_description; }
+
+ int getMin() const { return m_min; }
+ int getMax() const { return m_max; }
+ int getDefault() const { return m_default; }
+
+ MidiByte getControllerValue() const { return m_controllerValue; }
+
+ unsigned int getColourIndex() const { return m_colourIndex; }
+
+ int getIPBPosition() const { return m_ipbPosition; }
+
+ void setName(const std::string &name) { m_name = name; }
+ void setType(const std::string &type) { m_type = type; }
+ void setDescription(const std::string &des) { m_description = des; }
+
+ void setMin(int min) { m_min = min; }
+ void setMax(int max) { m_max = max; }
+ void setDefault(int def) { m_default = def; }
+
+ void setControllerValue(MidiByte con) { m_controllerValue = con; }
+
+ void setColourIndex(unsigned int colour) { m_colourIndex = colour; }
+
+ void setIPBPosition(int position) { m_ipbPosition = position; }
+
+ virtual std::string toXmlString();
+
+protected:
+
+ // ControlParameter name as it's displayed ("Velocity", "Controller")
+ std::string m_name;
+
+ // use event types in here ("controller", "pitchbend");
+ std::string m_type;
+
+ std::string m_description;
+
+ int m_min;
+ int m_max;
+ int m_default;
+
+ MidiByte m_controllerValue;
+
+ unsigned int m_colourIndex;
+
+ int m_ipbPosition; // position on Instrument Parameter Box
+
+
+};
+
+}
+
+#endif // _CONTROLPARAMETER_H_
diff --git a/src/base/Controllable.h b/src/base/Controllable.h
new file mode 100644
index 0000000..9062d13
--- /dev/null
+++ b/src/base/Controllable.h
@@ -0,0 +1,48 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _CONTROLLABLE_DEVICE_H_
+#define _CONTROLLABLE_DEVICE_H_
+
+#include "ControlParameter.h"
+
+namespace Rosegarden
+{
+
+typedef std::vector<ControlParameter> ControlList;
+
+class Controllable
+{
+public:
+ virtual ~Controllable() {}
+
+ virtual const ControlList &getControlParameters() const = 0;
+ virtual const ControlParameter *getControlParameter(int index) const = 0;
+ virtual const ControlParameter *getControlParameter(const std::string &type,
+ MidiByte controllerNumber) const = 0;
+
+protected:
+ Controllable() { }
+};
+
+}
+
+#endif
diff --git a/src/base/Device.cpp b/src/base/Device.cpp
new file mode 100644
index 0000000..796846a
--- /dev/null
+++ b/src/base/Device.cpp
@@ -0,0 +1,31 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include "Device.h"
+
+namespace Rosegarden
+{
+
+const DeviceId Device::NO_DEVICE = 10000;
+const DeviceId Device::ALL_DEVICES = 10001;
+const DeviceId Device::CONTROL_DEVICE = 10002;
+
+}
diff --git a/src/base/Device.h b/src/base/Device.h
new file mode 100644
index 0000000..47a8ec0
--- /dev/null
+++ b/src/base/Device.h
@@ -0,0 +1,102 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _DEVICE_H_
+#define _DEVICE_H_
+
+#include "XmlExportable.h"
+#include "Instrument.h"
+#include <string>
+#include <vector>
+
+// A Device can query underlying hardware/sound APIs to
+// generate a list of Instruments.
+//
+
+namespace Rosegarden
+{
+
+typedef unsigned int DeviceId;
+
+class Instrument;
+typedef std::vector<Instrument *> InstrumentList;
+
+class Device : public XmlExportable
+{
+public:
+ typedef enum
+ {
+ Midi,
+ Audio,
+ SoftSynth
+ } DeviceType;
+
+ // special device ids
+ static const DeviceId NO_DEVICE;
+ static const DeviceId ALL_DEVICES;
+ static const DeviceId CONTROL_DEVICE;
+
+ Device(DeviceId id, const std::string &name, DeviceType type):
+ m_name(name), m_type(type), m_id(id) { }
+
+ virtual ~Device()
+ {
+ InstrumentList::iterator it = m_instruments.begin();
+ for (; it != m_instruments.end(); it++)
+ delete (*it);
+ m_instruments.erase(m_instruments.begin(), m_instruments.end());
+ }
+
+ void setType(DeviceType type) { m_type = type; }
+ DeviceType getType() const { return m_type; }
+
+ void setName(const std::string &name) { m_name = name; }
+ std::string getName() const { return m_name; }
+
+ void setId(DeviceId id) { m_id = id; }
+ DeviceId getId() const { return m_id; }
+
+ // Accessing instrument lists - Devices should only
+ // show the world what they want it to see
+ //
+ virtual void addInstrument(Instrument*) = 0;
+
+ // Two functions - one to return all Instruments on a
+ // Device - one to return all Instruments that a user
+ // is allowed to select (Presentation Instruments).
+ //
+ virtual InstrumentList getAllInstruments() const = 0;
+ virtual InstrumentList getPresentationInstruments() const = 0;
+
+ std::string getConnection() const { return m_connection; }
+ void setConnection(std::string connection) { m_connection = connection; }
+
+protected:
+ InstrumentList m_instruments;
+ std::string m_name;
+ DeviceType m_type;
+ DeviceId m_id;
+ std::string m_connection;
+};
+
+}
+
+#endif // _DEVICE_H_
diff --git a/src/base/Equation.cpp b/src/base/Equation.cpp
new file mode 100644
index 0000000..a97fca4
--- /dev/null
+++ b/src/base/Equation.cpp
@@ -0,0 +1,69 @@
+// -*- c-basic-offset: 4 -*-
+
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include "Equation.h"
+
+namespace Rosegarden {
+
+void Equation::solve(Unknown u, double &y, double &m, double &x, double &c)
+{
+ switch(u) {
+ case Y: y = m*x + c; break;
+ case M: m = (y - c) / x; break;
+ case X: x = (y - c) / m; break;
+ case C: c = y - m*x; break;
+ }
+}
+
+void Equation::solve(Unknown u, int &y, double &m, int &x, int &c)
+{
+ switch(u) {
+ case Y: y = static_cast<int>(m*x) + c; break;
+ case M: m = static_cast<double>(y - c) / static_cast<double>(x); break;
+ case X: x = static_cast<int>(static_cast<float>(y - c) / m); break;
+ case C: c = y - static_cast<int>(m*x); break;
+ }
+}
+
+void Equation::solveForYByEndPoints(Point a, Point b, double x, double &y)
+{
+ double m, c, y1, x1;
+
+ m = static_cast<double>(b.y - a.y) / static_cast<double>(b.x - a.x);
+
+ x1 = a.x; y1 = a.y;
+ solve(C, y1, m, x1, c);
+ solve(Y, y, m, x, c);
+}
+
+void Equation::solveForYByEndPoints(Point a, Point b, int x, int &y)
+{
+ double m;
+ int c;
+
+ m = static_cast<double>(b.y - a.y) / static_cast<double>(b.x - a.x);
+
+ solve(C, a.y, m, a.x, c);
+ solve(Y, y, m, x, c);
+}
+
+}
diff --git a/src/base/Equation.h b/src/base/Equation.h
new file mode 100644
index 0000000..61377a5
--- /dev/null
+++ b/src/base/Equation.h
@@ -0,0 +1,51 @@
+// -*- c-basic-offset: 4 -*-
+
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _EQUATION_H_
+#define _EQUATION_H_
+
+namespace Rosegarden {
+
+/**
+ * Equation solving helper class
+ */
+class Equation
+{
+public:
+ enum Unknown { Y, M, X, C };
+
+ struct Point {
+ Point(int xx, int yy) : x(xx), y(yy) { }
+ int x;
+ int y;
+ };
+
+ static void solve(Unknown u, double &y, double &m, double &x, double &c);
+ static void solve(Unknown u, int &y, double &m, int &x, int &c);
+
+ static void solveForYByEndPoints(Point a, Point b, double x, double &y);
+ static void solveForYByEndPoints(Point a, Point b, int x, int &y);
+};
+
+}
+
+#endif
diff --git a/src/base/Event.cpp b/src/base/Event.cpp
new file mode 100644
index 0000000..e63e51b
--- /dev/null
+++ b/src/base/Event.cpp
@@ -0,0 +1,445 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include <cstdio>
+#include <cctype>
+#include <iostream>
+#include "Event.h"
+#include "XmlExportable.h"
+
+#if (__GNUC__ < 3)
+#include <strstream>
+#define stringstream strstream
+#else
+#include <sstream>
+#endif
+
+namespace Rosegarden
+{
+using std::string;
+using std::ostream;
+
+PropertyName Event::EventData::NotationTime = "!notationtime";
+PropertyName Event::EventData::NotationDuration = "!notationduration";
+
+
+Event::EventData::EventData(const std::string &type, timeT absoluteTime,
+ timeT duration, short subOrdering) :
+ m_refCount(1),
+ m_type(type),
+ m_absoluteTime(absoluteTime),
+ m_duration(duration),
+ m_subOrdering(subOrdering),
+ m_properties(0)
+{
+ // empty
+}
+
+Event::EventData::EventData(const std::string &type, timeT absoluteTime,
+ timeT duration, short subOrdering,
+ const PropertyMap *properties) :
+ m_refCount(1),
+ m_type(type),
+ m_absoluteTime(absoluteTime),
+ m_duration(duration),
+ m_subOrdering(subOrdering),
+ m_properties(properties ? new PropertyMap(*properties) : 0)
+{
+ // empty
+}
+
+Event::EventData *Event::EventData::unshare()
+{
+ --m_refCount;
+
+ EventData *newData = new EventData
+ (m_type, m_absoluteTime, m_duration, m_subOrdering, m_properties);
+
+ return newData;
+}
+
+Event::EventData::~EventData()
+{
+ if (m_properties) delete m_properties;
+}
+
+timeT
+Event::EventData::getNotationTime() const
+{
+ if (!m_properties) return m_absoluteTime;
+ PropertyMap::const_iterator i = m_properties->find(NotationTime);
+ if (i == m_properties->end()) return m_absoluteTime;
+ else return static_cast<PropertyStore<Int> *>(i->second)->getData();
+}
+
+timeT
+Event::EventData::getNotationDuration() const
+{
+ if (!m_properties) return m_duration;
+ PropertyMap::const_iterator i = m_properties->find(NotationDuration);
+ if (i == m_properties->end()) return m_duration;
+ else return static_cast<PropertyStore<Int> *>(i->second)->getData();
+}
+
+void
+Event::EventData::setTime(const PropertyName &name, timeT t, timeT deft)
+{
+ if (!m_properties) m_properties = new PropertyMap();
+ PropertyMap::iterator i = m_properties->find(name);
+
+ if (t != deft) {
+ if (i == m_properties->end()) {
+ m_properties->insert(PropertyPair(name, new PropertyStore<Int>(t)));
+ } else {
+ static_cast<PropertyStore<Int> *>(i->second)->setData(t);
+ }
+ } else if (i != m_properties->end()) {
+ delete i->second;
+ m_properties->erase(i);
+ }
+}
+
+PropertyMap *
+Event::find(const PropertyName &name, PropertyMap::iterator &i)
+{
+ PropertyMap *map = m_data->m_properties;
+
+ if (!map || ((i = map->find(name)) == map->end())) {
+
+ map = m_nonPersistentProperties;
+ if (!map) return 0;
+
+ i = map->find(name);
+ if (i == map->end()) return 0;
+ }
+
+ return map;
+}
+
+bool
+Event::has(const PropertyName &name) const
+{
+#ifndef NDEBUG
+ ++m_hasCount;
+#endif
+
+ PropertyMap::const_iterator i;
+ const PropertyMap *map = find(name, i);
+ if (map) return true;
+ else return false;
+}
+
+void
+Event::unset(const PropertyName &name)
+{
+#ifndef NDEBUG
+ ++m_unsetCount;
+#endif
+
+ unshare();
+ PropertyMap::iterator i;
+ PropertyMap *map = find(name, i);
+ if (map) {
+ delete i->second;
+ map->erase(i);
+ }
+}
+
+
+PropertyType
+Event::getPropertyType(const PropertyName &name) const
+ // throw (NoData)
+{
+ PropertyMap::const_iterator i;
+ const PropertyMap *map = find(name, i);
+ if (map) {
+ return i->second->getType();
+ } else {
+ throw NoData(name.getName(), __FILE__, __LINE__);
+ }
+}
+
+
+string
+Event::getPropertyTypeAsString(const PropertyName &name) const
+ // throw (NoData)
+{
+ PropertyMap::const_iterator i;
+ const PropertyMap *map = find(name, i);
+ if (map) {
+ return i->second->getTypeName();
+ } else {
+ throw NoData(name.getName(), __FILE__, __LINE__);
+ }
+}
+
+
+string
+Event::getAsString(const PropertyName &name) const
+ // throw (NoData)
+{
+ PropertyMap::const_iterator i;
+ const PropertyMap *map = find(name, i);
+ if (map) {
+ return i->second->unparse();
+ } else {
+ throw NoData(name.getName(), __FILE__, __LINE__);
+ }
+}
+
+// We could derive from XmlExportable and make this a virtual method
+// overriding XmlExportable's pure virtual. We don't, because this
+// class has no other virtual methods and for such a core class we
+// could do without the overhead (given that it wouldn't really gain
+// us anything anyway).
+
+string
+Event::toXmlString()
+{
+ return toXmlString(0);
+}
+
+string
+Event::toXmlString(timeT expectedTime)
+{
+ std::stringstream out;
+
+ out << "<event";
+
+ if (getType().length() != 0) {
+ out << " type=\"" << getType() << "\"";
+ }
+
+ if (getDuration() != 0) {
+ out << " duration=\"" << getDuration() << "\"";
+ }
+
+ if (getSubOrdering() != 0) {
+ out << " subordering=\"" << getSubOrdering() << "\"";
+ }
+
+ if (expectedTime == 0) {
+ out << " absoluteTime=\"" << getAbsoluteTime() << "\"";
+ } else if (getAbsoluteTime() != expectedTime) {
+ out << " timeOffset=\"" << (getAbsoluteTime() - expectedTime) << "\"";
+ }
+
+ out << ">";
+
+ // Save all persistent properties as <property> elements
+
+ PropertyNames propertyNames(getPersistentPropertyNames());
+ for (PropertyNames::const_iterator i = propertyNames.begin();
+ i != propertyNames.end(); ++i) {
+
+ out << "<property name=\""
+ << XmlExportable::encode(i->getName()) << "\" ";
+ string type = getPropertyTypeAsString(*i);
+ for (unsigned int j = 0; j < type.size(); ++j) {
+ type[j] = (isupper(type[j]) ? tolower(type[j]) : type[j]);
+ }
+
+ out << type << "=\""
+ << XmlExportable::encode(getAsString(*i))
+ << "\"/>";
+ }
+
+ // Save non-persistent properties (the persistence applies to
+ // copying events, not load/save) as <nproperty> elements
+ // unless they're view-local. View-local properties are
+ // assumed to have "::" in their name somewhere.
+
+ propertyNames = getNonPersistentPropertyNames();
+ for (PropertyNames::const_iterator i = propertyNames.begin();
+ i != propertyNames.end(); ++i) {
+
+ std::string s(i->getName());
+ if (s.find("::") != std::string::npos) continue;
+
+ out << "<nproperty name=\""
+ << XmlExportable::encode(s) << "\" ";
+ string type = getPropertyTypeAsString(*i);
+ for (unsigned int j = 0; j < type.size(); ++j) {
+ type[j] = (isupper(type[j]) ? tolower(type[j]) : type[j]);
+ }
+ out << type << "=\""
+ << XmlExportable::encode(getAsString(*i))
+ << "\"/>";
+ }
+
+ out << "</event>";
+
+#if (__GNUC__ < 3)
+ out << std::ends;
+#endif
+
+ return out.str();
+}
+
+
+#ifndef NDEBUG
+void
+Event::dump(ostream& out) const
+{
+ out << "Event type : " << m_data->m_type.c_str() << '\n';
+
+ out << "\tAbsolute Time : " << m_data->m_absoluteTime
+ << "\n\tDuration : " << m_data->m_duration
+ << "\n\tSub-ordering : " << m_data->m_subOrdering
+ << "\n\tPersistent properties : \n";
+
+ if (m_data->m_properties) {
+ for (PropertyMap::const_iterator i = m_data->m_properties->begin();
+ i != m_data->m_properties->end(); ++i) {
+ out << "\t\t" << i->first.getName() << " [" << i->first.getValue() << "] \t" << *(i->second) << "\n";
+ }
+ }
+
+ if (m_nonPersistentProperties) {
+ out << "\n\tNon-persistent properties : \n";
+
+ for (PropertyMap::const_iterator i = m_nonPersistentProperties->begin();
+ i != m_nonPersistentProperties->end(); ++i) {
+ out << "\t\t" << i->first.getName() << " [" << i->first.getValue() << "] \t" << *(i->second) << '\n';
+ }
+ }
+
+ out << "Event storage size : " << getStorageSize() << '\n';
+}
+
+
+int Event::m_getCount = 0;
+int Event::m_setCount = 0;
+int Event::m_setMaybeCount = 0;
+int Event::m_hasCount = 0;
+int Event::m_unsetCount = 0;
+clock_t Event::m_lastStats = clock();
+
+void
+Event::dumpStats(ostream& out)
+{
+ clock_t now = clock();
+ int ms = (now - m_lastStats) * 1000 / CLOCKS_PER_SEC;
+ out << "\nEvent stats, since start of run or last report ("
+ << ms << "ms ago):" << std::endl;
+
+ out << "Calls to get<>: " << m_getCount << std::endl;
+ out << "Calls to set<>: " << m_setCount << std::endl;
+ out << "Calls to setMaybe<>: " << m_setMaybeCount << std::endl;
+ out << "Calls to has: " << m_hasCount << std::endl;
+ out << "Calls to unset: " << m_unsetCount << std::endl;
+
+ m_getCount = m_setCount = m_setMaybeCount = m_hasCount = m_unsetCount = 0;
+ m_lastStats = clock();
+}
+
+#else
+
+void
+Event::dumpStats(ostream&)
+{
+ // nothing
+}
+
+#endif
+
+Event::PropertyNames
+Event::getPropertyNames() const
+{
+ PropertyNames v;
+ if (m_data->m_properties) {
+ for (PropertyMap::const_iterator i = m_data->m_properties->begin();
+ i != m_data->m_properties->end(); ++i) {
+ v.push_back(i->first);
+ }
+ }
+ if (m_nonPersistentProperties) {
+ for (PropertyMap::const_iterator i = m_nonPersistentProperties->begin();
+ i != m_nonPersistentProperties->end(); ++i) {
+ v.push_back(i->first);
+ }
+ }
+ return v;
+}
+
+Event::PropertyNames
+Event::getPersistentPropertyNames() const
+{
+ PropertyNames v;
+ if (m_data->m_properties) {
+ for (PropertyMap::const_iterator i = m_data->m_properties->begin();
+ i != m_data->m_properties->end(); ++i) {
+ v.push_back(i->first);
+ }
+ }
+ return v;
+}
+
+Event::PropertyNames
+Event::getNonPersistentPropertyNames() const
+{
+ PropertyNames v;
+ if (m_nonPersistentProperties) {
+ for (PropertyMap::const_iterator i = m_nonPersistentProperties->begin();
+ i != m_nonPersistentProperties->end(); ++i) {
+ v.push_back(i->first);
+ }
+ }
+ return v;
+}
+
+void
+Event::clearNonPersistentProperties()
+{
+ if (m_nonPersistentProperties) m_nonPersistentProperties->clear();
+}
+
+size_t
+Event::getStorageSize() const
+{
+ size_t s = sizeof(Event) + sizeof(EventData) + m_data->m_type.size();
+ if (m_data->m_properties) {
+ for (PropertyMap::const_iterator i = m_data->m_properties->begin();
+ i != m_data->m_properties->end(); ++i) {
+ s += sizeof(i->first);
+ s += i->second->getStorageSize();
+ }
+ }
+ if (m_nonPersistentProperties) {
+ for (PropertyMap::const_iterator i = m_nonPersistentProperties->begin();
+ i != m_nonPersistentProperties->end(); ++i) {
+ s += sizeof(i->first);
+ s += i->second->getStorageSize();
+ }
+ }
+ return s;
+}
+
+bool
+operator<(const Event &a, const Event &b)
+{
+ timeT at = a.getAbsoluteTime();
+ timeT bt = b.getAbsoluteTime();
+ if (at != bt) return at < bt;
+ else return a.getSubOrdering() < b.getSubOrdering();
+}
+
+}
diff --git a/src/base/Event.h b/src/base/Event.h
new file mode 100644
index 0000000..f236681
--- /dev/null
+++ b/src/base/Event.h
@@ -0,0 +1,584 @@
+// -*- c-basic-offset: 4 -*-
+
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _EVENT_H_
+#define _EVENT_H_
+
+#include "PropertyMap.h"
+#include "Exception.h"
+
+#include <string>
+#include <vector>
+#ifndef NDEBUG
+#include <iostream>
+#include <ctime>
+#endif
+
+
+namespace Rosegarden
+{
+
+typedef long timeT;
+
+/**
+ * The Event class represents an event with some basic attributes and
+ * an arbitrary number of properties of dynamically-determined name
+ * and type.
+ *
+ * An Event has a type; a duration, often zero for events other than
+ * notes; an absolute time, the time at which the event begins, which
+ * is used to order events within a Segment; and a "sub-ordering", used
+ * to determine an order for events that have the same absolute time
+ * (for example to ensure that the clef always appears before the key
+ * signature at the start of a piece). Besides these, an event can
+ * have any number of properties, which are typed values stored and
+ * retrieved by name. Properties may be persistent or non-persistent,
+ * depending on whether they are saved to file with the rest of the
+ * event data or are considered to be only cached values that can be
+ * recomputed at will if necessary.
+ */
+
+class Event
+{
+public:
+ class NoData : public Exception {
+ public:
+ NoData(std::string property) :
+ Exception("No data found for property " + property) { }
+ NoData(std::string property, std::string file, int line) :
+ Exception("No data found for property " + property, file, line) { }
+ };
+
+ class BadType : public Exception {
+ public:
+ BadType(std::string property, std::string expected, std::string actl) :
+ Exception("Bad type for " + property + " (expected " +
+ expected + ", found " + actl + ")") { }
+ BadType(std::string property, std::string expected, std::string actual,
+ std::string file, int line) :
+ Exception("Bad type for " + property + " (expected " +
+ expected + ", found " + actual + ")", file, line) { }
+ };
+
+ Event(const std::string &type,
+ timeT absoluteTime, timeT duration = 0, short subOrdering = 0) :
+ m_data(new EventData(type, absoluteTime, duration, subOrdering)),
+ m_nonPersistentProperties(0) { }
+
+ Event(const std::string &type,
+ timeT absoluteTime, timeT duration, short subOrdering,
+ timeT notationAbsoluteTime, timeT notationDuration) :
+ m_data(new EventData(type, absoluteTime, duration, subOrdering)),
+ m_nonPersistentProperties(0) {
+ setNotationAbsoluteTime(notationAbsoluteTime);
+ setNotationDuration(notationDuration);
+ }
+
+ Event(const Event &e) :
+ m_nonPersistentProperties(0) { share(e); }
+
+ // these ctors can't use default args: default has to be obtained from e
+
+ Event(const Event &e, timeT absoluteTime) :
+ m_nonPersistentProperties(0) {
+ share(e);
+ unshare();
+ m_data->m_absoluteTime = absoluteTime;
+ setNotationAbsoluteTime(absoluteTime);
+ setNotationDuration(m_data->m_duration);
+ }
+
+ Event(const Event &e, timeT absoluteTime, timeT duration) :
+ m_nonPersistentProperties(0) {
+ share(e);
+ unshare();
+ m_data->m_absoluteTime = absoluteTime;
+ m_data->m_duration = duration;
+ setNotationAbsoluteTime(absoluteTime);
+ setNotationDuration(duration);
+ }
+
+ Event(const Event &e, timeT absoluteTime, timeT duration, short subOrdering):
+ m_nonPersistentProperties(0) {
+ share(e);
+ unshare();
+ m_data->m_absoluteTime = absoluteTime;
+ m_data->m_duration = duration;
+ m_data->m_subOrdering = subOrdering;
+ setNotationAbsoluteTime(absoluteTime);
+ setNotationDuration(duration);
+ }
+
+ Event(const Event &e, timeT absoluteTime, timeT duration, short subOrdering,
+ timeT notationAbsoluteTime) :
+ m_nonPersistentProperties(0) {
+ share(e);
+ unshare();
+ m_data->m_absoluteTime = absoluteTime;
+ m_data->m_duration = duration;
+ m_data->m_subOrdering = subOrdering;
+ setNotationAbsoluteTime(notationAbsoluteTime);
+ setNotationDuration(duration);
+ }
+
+ Event(const Event &e, timeT absoluteTime, timeT duration, short subOrdering,
+ timeT notationAbsoluteTime, timeT notationDuration) :
+ m_nonPersistentProperties(0) {
+ share(e);
+ unshare();
+ m_data->m_absoluteTime = absoluteTime;
+ m_data->m_duration = duration;
+ m_data->m_subOrdering = subOrdering;
+ setNotationAbsoluteTime(notationAbsoluteTime);
+ setNotationDuration(notationDuration);
+ }
+
+ ~Event() { lose(); }
+
+ Event *copyMoving(timeT offset) const {
+ return new Event(*this,
+ m_data->m_absoluteTime + offset,
+ m_data->m_duration,
+ m_data->m_subOrdering,
+ getNotationAbsoluteTime() + offset,
+ getNotationDuration());
+ }
+
+ Event &operator=(const Event &e) {
+ if (&e != this) { lose(); share(e); }
+ return *this;
+ }
+
+ friend bool operator<(const Event&, const Event&);
+
+ // Accessors
+ const std::string &getType() const { return m_data->m_type; }
+ bool isa(const std::string &t) const { return (m_data->m_type == t); }
+ timeT getAbsoluteTime() const { return m_data->m_absoluteTime; }
+ timeT getDuration() const { return m_data->m_duration; }
+ short getSubOrdering() const { return m_data->m_subOrdering; }
+
+ bool has(const PropertyName &name) const;
+
+ template <PropertyType P>
+ typename PropertyDefn<P>::basic_type get(const PropertyName &name) const;
+ // throw (NoData, BadType);
+
+ // no throw, returns bool
+ template <PropertyType P>
+ bool get(const PropertyName &name, typename PropertyDefn<P>::basic_type &val) const;
+
+ template <PropertyType P>
+ bool isPersistent(const PropertyName &name) const;
+ // throw (NoData);
+
+ template <PropertyType P>
+ void setPersistence(const PropertyName &name, bool persistent);
+ // throw (NoData);
+
+ PropertyType getPropertyType(const PropertyName &name) const;
+ // throw (NoData);
+
+ std::string getPropertyTypeAsString(const PropertyName &name) const;
+ // throw (NoData);
+
+ std::string getAsString(const PropertyName &name) const;
+ // throw (NoData);
+
+ template <PropertyType P>
+ void set(const PropertyName &name, typename PropertyDefn<P>::basic_type value,
+ bool persistent = true);
+ // throw (BadType);
+
+ // set non-persistent, but only if there's no persistent value already
+ template <PropertyType P>
+ void setMaybe(const PropertyName &name, typename PropertyDefn<P>::basic_type value);
+ // throw (BadType);
+
+ template <PropertyType P>
+ void setFromString(const PropertyName &name, std::string value,
+ bool persistent = true);
+ // throw (BadType);
+
+ void unset(const PropertyName &name);
+
+ timeT getNotationAbsoluteTime() const { return m_data->getNotationTime(); }
+ timeT getNotationDuration() const { return m_data->getNotationDuration(); }
+
+ typedef std::vector<PropertyName> PropertyNames;
+ PropertyNames getPropertyNames() const;
+ PropertyNames getPersistentPropertyNames() const;
+ PropertyNames getNonPersistentPropertyNames() const;
+
+ void clearNonPersistentProperties();
+
+ struct EventCmp
+ {
+ bool operator()(const Event &e1, const Event &e2) const {
+ return e1 < e2;
+ }
+ bool operator()(const Event *e1, const Event *e2) const {
+ return *e1 < *e2;
+ }
+ };
+
+ struct EventEndCmp
+ {
+ bool operator()(const Event &e1, const Event &e2) const {
+ return e1.getAbsoluteTime() + e1.getDuration() <=
+ e2.getAbsoluteTime() + e2.getDuration();
+ }
+ bool operator()(const Event *e1, const Event *e2) const {
+ return e1->getAbsoluteTime() + e1->getDuration() <=
+ e2->getAbsoluteTime() + e2->getDuration();
+ }
+ };
+
+ static bool compareEvent2Time(const Event *e, timeT t) {
+ return e->getAbsoluteTime() < t;
+ }
+
+ static bool compareTime2Event(timeT t, const Event *e) {
+ return t < e->getAbsoluteTime();
+ }
+
+ // approximate, for debugging and inspection purposes
+ size_t getStorageSize() const;
+
+ /**
+ * Get the XML string representing the object.
+ */
+ std::string toXmlString();
+
+ /**
+ * Get the XML string representing the object. If the absolute
+ * time of the event differs from the given absolute time, include
+ * the difference between the two as a timeOffset attribute.
+ * If expectedTime == 0, include an absoluteTime attribute instead.
+ */
+ std::string toXmlString(timeT expectedTime);
+
+#ifndef NDEBUG
+ void dump(std::ostream&) const;
+#else
+ void dump(std::ostream&) const {}
+#endif
+ static void dumpStats(std::ostream&);
+
+protected:
+ // these are for subclasses such as XmlStorableEvent
+
+ Event() :
+ m_data(new EventData("", 0, 0, 0)),
+ m_nonPersistentProperties(0) { }
+
+ void setType(const std::string &t) { unshare(); m_data->m_type = t; }
+ void setAbsoluteTime(timeT t) { unshare(); m_data->m_absoluteTime = t; }
+ void setDuration(timeT d) { unshare(); m_data->m_duration = d; }
+ void setSubOrdering(short o) { unshare(); m_data->m_subOrdering = o; }
+ void setNotationAbsoluteTime(timeT t) { unshare(); m_data->setNotationTime(t); }
+ void setNotationDuration(timeT d) { unshare(); m_data->setNotationDuration(d); }
+
+private:
+ bool operator==(const Event &); // not implemented
+
+ struct EventData // Data that are shared between shallow-copied instances
+ {
+ EventData(const std::string &type,
+ timeT absoluteTime, timeT duration, short subOrdering);
+ EventData(const std::string &type,
+ timeT absoluteTime, timeT duration, short subOrdering,
+ const PropertyMap *properties);
+ EventData *unshare();
+ ~EventData();
+ unsigned int m_refCount;
+
+ std::string m_type;
+ timeT m_absoluteTime;
+ timeT m_duration;
+ short m_subOrdering;
+
+ PropertyMap *m_properties;
+
+ // These are properties because we don't care so much about
+ // raw speed in get/set, but we do care about storage size for
+ // events that don't have them or that have zero values:
+ timeT getNotationTime() const;
+ timeT getNotationDuration() const;
+ void setNotationTime(timeT t) {
+ setTime(NotationTime, t, m_absoluteTime);
+ }
+ void setNotationDuration(timeT d) {
+ setTime(NotationDuration, d, m_duration);
+ }
+
+ private:
+ EventData(const EventData &);
+ EventData &operator=(const EventData &);
+ static PropertyName NotationTime;
+ static PropertyName NotationDuration;
+ void setTime(const PropertyName &name, timeT value, timeT deft);
+ };
+
+ EventData *m_data;
+ PropertyMap *m_nonPersistentProperties; // Unique to an instance
+
+ void share(const Event &e) {
+ m_data = e.m_data;
+ m_data->m_refCount++;
+ }
+
+ bool unshare() { // returns true if unshare was necessary
+ if (m_data->m_refCount > 1) {
+ m_data = m_data->unshare();
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ void lose() {
+ if (--m_data->m_refCount == 0) delete m_data;
+ delete m_nonPersistentProperties;
+ m_nonPersistentProperties = 0;
+ }
+
+ // returned iterator (in i) only valid if return map value is non-zero
+ PropertyMap *find(const PropertyName &name, PropertyMap::iterator &i);
+
+ const PropertyMap *find(const PropertyName &name,
+ PropertyMap::const_iterator &i) const {
+ PropertyMap::iterator j;
+ PropertyMap *map = const_cast<Event *>(this)->find(name, j);
+ i = j;
+ return map;
+ }
+
+ PropertyMap::iterator insert(const PropertyPair &pair, bool persistent) {
+ PropertyMap **map =
+ (persistent ? &m_data->m_properties : &m_nonPersistentProperties);
+ if (!*map) *map = new PropertyMap();
+ return (*map)->insert(pair).first;
+ }
+
+#ifndef NDEBUG
+ static int m_getCount;
+ static int m_setCount;
+ static int m_setMaybeCount;
+ static int m_hasCount;
+ static int m_unsetCount;
+ static clock_t m_lastStats;
+#endif
+};
+
+
+template <PropertyType P>
+bool
+Event::get(const PropertyName &name, typename PropertyDefn<P>::basic_type &val) const
+{
+#ifndef NDEBUG
+ ++m_getCount;
+#endif
+
+ PropertyMap::const_iterator i;
+ const PropertyMap *map = find(name, i);
+
+ if (map) {
+
+ PropertyStoreBase *sb = i->second;
+ if (sb->getType() == P) {
+ val = (static_cast<PropertyStore<P> *>(sb))->getData();
+ return true;
+ }
+ else {
+#ifndef NDEBUG
+ std::cerr << "Event::get() Error: Attempt to get property \"" << name
+ << "\" as " << PropertyDefn<P>::typeName() <<", actual type is "
+ << sb->getTypeName() << std::endl;
+#endif
+ return false;
+ }
+
+ } else {
+ return false;
+ }
+}
+
+
+template <PropertyType P>
+typename PropertyDefn<P>::basic_type
+Event::get(const PropertyName &name) const
+ // throw (NoData, BadType)
+{
+#ifndef NDEBUG
+ ++m_getCount;
+#endif
+
+ PropertyMap::const_iterator i;
+ const PropertyMap *map = find(name, i);
+
+ if (map) {
+
+ PropertyStoreBase *sb = i->second;
+ if (sb->getType() == P)
+ return (static_cast<PropertyStore<P> *>(sb))->getData();
+ else {
+ throw BadType(name.getName(),
+ PropertyDefn<P>::typeName(), sb->getTypeName(),
+ __FILE__, __LINE__);
+ }
+
+ } else {
+
+#ifndef NDEBUG
+ std::cerr << "Event::get(): Error dump follows:" << std::endl;
+ dump(std::cerr);
+#endif
+ throw NoData(name.getName(), __FILE__, __LINE__);
+ }
+}
+
+
+template <PropertyType P>
+bool
+Event::isPersistent(const PropertyName &name) const
+ // throw (NoData)
+{
+ PropertyMap::const_iterator i;
+ const PropertyMap *map = find(name, i);
+
+ if (map) {
+ return (map == m_data->m_properties);
+ } else {
+ throw NoData(name.getName(), __FILE__, __LINE__);
+ }
+}
+
+
+template <PropertyType P>
+void
+Event::setPersistence(const PropertyName &name, bool persistent)
+ // throw (NoData)
+{
+ unshare();
+ PropertyMap::iterator i;
+ PropertyMap *map = find(name, i);
+
+ if (map) {
+ insert(*i, persistent);
+ map->erase(i);
+ } else {
+ throw NoData(name.getName(), __FILE__, __LINE__);
+ }
+}
+
+
+template <PropertyType P>
+void
+Event::set(const PropertyName &name, typename PropertyDefn<P>::basic_type value,
+ bool persistent)
+ // throw (BadType)
+{
+#ifndef NDEBUG
+ ++m_setCount;
+#endif
+
+ // this is a little slow, could bear improvement
+
+ unshare();
+ PropertyMap::iterator i;
+ PropertyMap *map = find(name, i);
+
+ if (map) {
+ bool persistentBefore = (map == m_data->m_properties);
+ if (persistentBefore != persistent) {
+ i = insert(*i, persistent);
+ map->erase(name);
+ }
+
+ PropertyStoreBase *sb = i->second;
+ if (sb->getType() == P) {
+ (static_cast<PropertyStore<P> *>(sb))->setData(value);
+ } else {
+ throw BadType(name.getName(),
+ PropertyDefn<P>::typeName(), sb->getTypeName(),
+ __FILE__, __LINE__);
+ }
+
+ } else {
+ PropertyStoreBase *p = new PropertyStore<P>(value);
+ insert(PropertyPair(name, p), persistent);
+ }
+}
+
+
+
+// setMaybe<> is actually called rather more frequently than set<>, so
+// it makes sense for best performance to implement it separately
+// rather than through calls to has, isPersistent and set<>
+
+template <PropertyType P>
+void
+Event::setMaybe(const PropertyName &name, typename PropertyDefn<P>::basic_type value)
+ // throw (BadType)
+{
+#ifndef NDEBUG
+ ++m_setMaybeCount;
+#endif
+
+ unshare();
+ PropertyMap::iterator i;
+ PropertyMap *map = find(name, i);
+
+ if (map) {
+ if (map == m_data->m_properties) return; // persistent, so ignore it
+
+ PropertyStoreBase *sb = i->second;
+
+ if (sb->getType() == P) {
+ (static_cast<PropertyStore<P> *>(sb))->setData(value);
+ } else {
+ throw BadType(name.getName(),
+ PropertyDefn<P>::typeName(), sb->getTypeName(),
+ __FILE__, __LINE__);
+ }
+ } else {
+ PropertyStoreBase *p = new PropertyStore<P>(value);
+ insert(PropertyPair(name, p), false);
+ }
+}
+
+
+template <PropertyType P>
+void
+Event::setFromString(const PropertyName &name, std::string value, bool persistent)
+ // throw (BadType)
+{
+ set<P>(name, PropertyDefn<P>::parse(value), persistent);
+}
+
+
+//////////////////////////////////////////////////////////////////////
+
+}
+
+#endif
diff --git a/src/base/Exception.cpp b/src/base/Exception.cpp
new file mode 100644
index 0000000..04dad69
--- /dev/null
+++ b/src/base/Exception.cpp
@@ -0,0 +1,46 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include "Exception.h"
+
+#include <iostream>
+
+namespace Rosegarden {
+
+Exception::Exception(std::string message) :
+ m_message(message)
+{
+#ifndef NDEBUG
+ std::cerr << "WARNING: Rosegarden::Exception: \""
+ << message << "\"" << std::endl;
+#endif
+}
+
+Exception::Exception(std::string message, std::string file, int line) :
+ m_message(message)
+{
+#ifndef NDEBUG
+ std::cerr << "WARNING: Rosegarden::Exception: \""
+ << message << "\" at " << file << ":" << line << std::endl;
+#endif
+}
+
+}
diff --git a/src/base/Exception.h b/src/base/Exception.h
new file mode 100644
index 0000000..ba39a0f
--- /dev/null
+++ b/src/base/Exception.h
@@ -0,0 +1,47 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _EXCEPTION_H_
+#define _EXCEPTION_H_
+
+#include <string>
+#include <exception>
+
+namespace Rosegarden {
+
+class Exception : public virtual std::exception
+{
+public:
+ Exception(std::string message);
+ Exception(std::string message, std::string file, int line);
+
+ virtual ~Exception() throw () {}
+
+ std::string getMessage() const { return m_message; }
+
+private:
+ std::string m_message;
+};
+
+
+}
+
+#endif
diff --git a/src/base/FastVector.h b/src/base/FastVector.h
new file mode 100644
index 0000000..0ba8e82
--- /dev/null
+++ b/src/base/FastVector.h
@@ -0,0 +1,596 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _FAST_VECTOR_H_
+#define _FAST_VECTOR_H_
+
+#include <iterator>
+#include <cstdlib> /* for malloc, realloc, free */
+#include <cstring> /* for memmove */
+
+#include <cassert>
+
+
+/**
+ FastVector is a sequence class with an interface similar to that
+ of the STL vector, with several nice properties and one nasty one:
+
+ * It allows fast random access, like the STL vector -- although
+ access is not quite as fast, as a little arithmetic is required.
+
+ * Appending (push_back) and prepending (push_front) are both fast.
+
+ * The worst-case behaviour is repeated random inserts and deletes
+ of single items, and performance in this case is still as good
+ as vector where builtin types are stored, and much better where
+ deep-copied objects are stored.
+
+ * Performance is not as good as vector for very short sequences
+ (where vector's simple implementation excels), but it's not bad.
+
+ * BUT: To achieve all this, it cheats. Objects are moved around
+ from place to place in the vector using memmove(), rather than
+ deep copy. If you store objects with internal pointers, they
+ will break badly. Storing simple structures will be no problem,
+ and if you just store pointers to objects you'll be fine, but
+ it's unwise (for example) to store other containers.
+
+ * One other difference from the STL vector: It uses placement new
+ with the copy constructor to construct objects, rather than
+ the default constructor and assignment. Thus the copy
+ constructor must work on the stored objects, though assignment
+ doesn't have to.
+
+ Do not use this class if:
+
+ * You do not require random access (operator[]). Use the STL
+ linked list instead, it'll almost certainly be faster.
+
+ * Your sequence is constructed once at a non-time-critical
+ moment, and subsequently is only read. Use STL vector, as
+ it's more standard and lookup is slightly quicker.
+
+ * Your sequence is unlikely to contain more than a dozen objects
+ which are only appended (push_back) and you do not require
+ prepend (push_front). Use STL vector, as it's more standard,
+ simpler and often quicker in this case.
+
+ * You want to pass sequences to other libraries or return them
+ from library functions. Use a standard container instead.
+
+ * You want to store objects that contain internal pointers or
+ that do not have a working copy constructor.
+
+ Chris Cannam, 1996-2001
+*/
+
+template <class T>
+class FastVector
+{
+public:
+ typedef T value_type;
+ typedef long size_type;
+ typedef long difference_type;
+
+private:
+ class iterator_base : public
+
+#if defined(_STL_1997_) || (__GNUC__ > 2)
+ std::iterator<std::random_access_iterator_tag, T, difference_type>
+#else
+#if defined(__STL_USE_NAMESPACES)
+ std::
+#endif
+ random_access_iterator<T, difference_type>
+#endif
+ {
+ public:
+ iterator_base() :
+ m_v(0), m_i(-1) {
+ }
+ iterator_base(const iterator_base &i) :
+ m_v(i.m_v), m_i(i.m_i) {
+ }
+ iterator_base &operator=(const iterator_base &i) {
+ if (&i != this) { m_v = i.m_v; m_i = i.m_i; }
+ return *this;
+ }
+
+ iterator_base &operator--() { --m_i; return *this; }
+ iterator_base operator--(int) {
+ iterator_base i(*this);
+ --m_i;
+ return i;
+ }
+ iterator_base &operator++() { ++m_i; return *this; }
+ iterator_base operator++(int) {
+ iterator_base i(*this);
+ ++m_i;
+ return i;
+ }
+
+ bool operator==(const iterator_base &i) const {
+ return (m_v == i.m_v && m_i == i.m_i);
+ }
+
+ bool operator!=(const iterator_base &i) const {
+ return (m_v != i.m_v || m_i != i.m_i);
+ }
+
+ iterator_base &operator+=(FastVector<T>::difference_type i) {
+ m_i += i; return *this;
+ }
+ iterator_base &operator-=(FastVector<T>::difference_type i) {
+ m_i -= i; return *this;
+ }
+
+ iterator_base operator+(FastVector<T>::difference_type i) const {
+ iterator_base n(*this); n += i; return n;
+ }
+ iterator_base operator-(FastVector<T>::difference_type i) const {
+ iterator_base n(*this); n -= i; return n;
+ }
+
+ typename FastVector<T>::difference_type operator-(const iterator_base &i) const{
+ assert(m_v == i.m_v);
+ return m_i - i.m_i;
+ }
+
+ protected:
+ iterator_base(FastVector<T> *v, size_type i) : m_v(v), m_i(i) { }
+ FastVector<T> *m_v;
+ size_type m_i;
+ };
+
+public:
+ // I'm sure these can be simplified
+
+ class iterator : public
+ iterator_base
+ {
+ public:
+ iterator() : iterator_base() { }
+ iterator(const iterator_base &i) : iterator_base(i) { }
+ iterator &operator=(const iterator &i) {
+ iterator_base::operator=(i);
+ return *this;
+ }
+
+ T &operator*() { return iterator_base::m_v->at(iterator_base::m_i); }
+ T *operator->() { return &(operator*()); }
+
+ const T &operator*() const { return iterator_base::m_v->at(iterator_base::m_i); }
+ const T *operator->() const { return &(operator*()); }
+
+ protected:
+ friend class FastVector<T>;
+ iterator(FastVector<T> *v, size_type i) : iterator_base(v,i) { }
+ };
+
+ class reverse_iterator : public
+ iterator_base
+ {
+ public:
+ reverse_iterator() : iterator_base() { }
+ reverse_iterator(const iterator_base &i) : iterator_base(i) { }
+ reverse_iterator &operator=(const reverse_iterator &i) {
+ iterator_base::operator=(i);
+ return *this;
+ }
+
+ T &operator*() { return iterator_base::m_v->at(iterator_base::m_v->size() - iterator_base::m_i - 1); }
+ T *operator->() { return &(operator*()); }
+
+ const T &operator*() const { return iterator_base::m_v->at(iterator_base::m_v->size() - iterator_base::m_i - 1); }
+ const T *operator->() const { return &(operator*()); }
+
+ protected:
+ friend class FastVector<T>;
+ reverse_iterator(FastVector<T> *v, size_type i) : iterator_base(v,i) { }
+ };
+
+ class const_iterator : public
+ iterator_base
+ {
+ public:
+ const_iterator() : iterator_base() { }
+ const_iterator(const iterator_base &i) : iterator_base(i) { }
+ const_iterator &operator=(const const_iterator &i) {
+ iterator_base::operator=(i);
+ return *this;
+ }
+
+ const T &operator*() const { return iterator_base::m_v->at(iterator_base::m_i); }
+ const T *operator->() const { return &(operator*()); }
+
+ protected:
+ friend class FastVector<T>;
+ const_iterator(const FastVector<T> *v, size_type i) :
+ iterator_base(const_cast<FastVector<T> *>(v),i) { }
+ };
+
+ class const_reverse_iterator : public
+ iterator_base
+ {
+ public:
+ const_reverse_iterator() : iterator_base() { }
+ const_reverse_iterator(const iterator_base &i) : iterator_base(i) { }
+ const_reverse_iterator &operator=(const const_reverse_iterator &i) {
+ iterator_base::operator=(i);
+ return *this;
+ }
+
+ const T &operator*() const { return iterator_base::m_v->at(iterator_base::m_v->size() - iterator_base::m_i - 1); }
+ const T *operator->() const { return &(operator*()); }
+
+ protected:
+ friend class FastVector<T>;
+ const_reverse_iterator(const FastVector<T> *v, size_type i) :
+ iterator_base(const_cast<FastVector<T> *>(v),i) { }
+ };
+
+public:
+ FastVector() :
+ m_items(0), m_count(0), m_gapStart(-1),
+ m_gapLength(0), m_size(0) { }
+ FastVector(const FastVector<T> &);
+ virtual ~FastVector();
+
+ template <class InputIterator>
+ FastVector(InputIterator first, InputIterator last) :
+ m_items(0), m_count(0), m_gapStart(-1),
+ m_gapLength(0), m_size(0) {
+ insert(begin(), first, last);
+ }
+
+ FastVector<T> &operator=(const FastVector<T> &);
+
+ virtual iterator begin() { return iterator(this, 0); }
+ virtual iterator end() { return iterator(this, m_count); }
+
+ virtual const_iterator begin() const { return const_iterator(this, 0); }
+ virtual const_iterator end() const { return const_iterator(this, m_count); }
+
+ virtual reverse_iterator rbegin() { return reverse_iterator(this, 0); }
+ virtual reverse_iterator rend() { return reverse_iterator(this, m_count); }
+
+ virtual const_reverse_iterator rbegin() const { return const_reverse_iterator(this, 0); }
+ virtual const_reverse_iterator rend() const { return const_reverse_iterator(this, m_count); }
+
+ size_type size() const { return m_count; }
+ bool empty() const { return m_count == 0; }
+
+ /// not all of these are defined yet
+ void swap(FastVector<T> &v);
+ bool operator==(const FastVector<T> &) const;
+ bool operator!=(const FastVector<T> &v) const { return !operator==(v); }
+ bool operator<(const FastVector<T> &) const;
+ bool operator>(const FastVector<T> &) const;
+ bool operator<=(const FastVector<T> &) const;
+ bool operator>=(const FastVector<T> &) const;
+
+ T& at(size_type index) {
+ assert(index >= 0 && index < m_count);
+ return m_items[externalToInternal(index)];
+ }
+ const T& at(size_type index) const {
+ return (const_cast<FastVector<T> *>(this))->at(index);
+ }
+
+ T &operator[](size_type index) {
+ return at(index);
+ }
+ const T &operator[](size_type index) const {
+ return at(index);
+ }
+
+ virtual T* array(size_type index, size_type count);
+
+ /** We *guarantee* that push methods etc modify the FastVector
+ only through a call to insert(size_type, T), and that erase
+ etc modify it only through a call to remove(size_type). This
+ is important because subclasses only need to override those
+ functions to catch all mutations */
+ virtual void push_front(const T& item) { insert(0, item); }
+ virtual void push_back(const T& item) { insert(m_count, item); }
+
+ virtual iterator insert(const iterator &p, const T &t) {
+ insert(p.m_i, t);
+ return p;
+ }
+
+ template <class InputIterator>
+ iterator insert(const iterator &p, InputIterator &i, InputIterator &j);
+
+ virtual iterator erase(const iterator &i) {
+ assert(i.m_v == this);
+ remove(i.m_i);
+ return iterator(this, i.m_i);
+ }
+
+ virtual iterator erase(const iterator &i, const iterator &j);
+ virtual void clear();
+
+protected:
+ /// basic insert -- all others call this
+ virtual void insert(size_type index, const T&);
+
+ /// basic remove -- erase(), clear() call this
+ virtual void remove(size_type index);
+
+private:
+ void resize(size_type needed); // needed is internal (i.e. including gap)
+
+ void moveGapTo(size_type index); // index is external
+ void closeGap() {
+ if (m_gapStart >= 0) moveGapTo(m_count);
+ m_gapStart = -1;
+ }
+
+ size_type bestNewCount(size_type n, size_t) const {
+ if (m_size == 0) {
+ if (n < 8) return 8;
+ else return n;
+ } else {
+ // double up each time -- it's faster than just incrementing
+ size_type s(m_size);
+ if (s > n*2) return s/2;
+ while (s <= n) s *= 2;
+ return s;
+ }
+ }
+
+ size_type externalToInternal(size_type index) const {
+ return ((index < m_gapStart || m_gapStart < 0) ?
+ index : index + m_gapLength);
+ }
+
+ size_type minSize() const { return 8; }
+ size_t minBlock() const {
+ return minSize() * sizeof(T) > 64 ? minSize() * sizeof(T) : 64;
+ }
+
+ T* m_items;
+ size_type m_count; // not counting gap
+ size_type m_gapStart; // -1 for no gap
+ size_type m_gapLength; // undefined if no gap
+ size_type m_size;
+};
+
+
+template <class T>
+void *operator new(size_t, FastVector<T> *, void *space)
+{
+ return space;
+}
+
+template <class T>
+FastVector<T>::FastVector(const FastVector<T> &l) :
+ m_items(0), m_count(0), m_gapStart(-1),
+ m_gapLength(0), m_size(0)
+{
+ resize(l.size());
+ for (size_type i = 0; i < l.size(); ++i) push_back(l.at(i));
+}
+
+template <class T>
+FastVector<T>::~FastVector()
+{
+ clear();
+ free(static_cast<void *>(m_items));
+}
+
+template <class T>
+FastVector<T>& FastVector<T>::operator=(const FastVector<T>& l)
+{
+ if (&l == this) return *this;
+
+ clear();
+
+ if (l.size() >= m_size) resize(l.size());
+ for (size_type i = 0; i < l.size(); ++i) push_back(l.at(i));
+
+ return *this;
+}
+
+template <class T>
+void FastVector<T>::moveGapTo(size_type index)
+{
+ // shift some elements left or right so as to line the gap up with
+ // the prospective insertion or deletion point.
+
+ assert(m_gapStart >= 0);
+
+ if (m_gapStart < index) {
+ // need to move some stuff left to fill the gap
+ memmove(&m_items[m_gapStart],
+ &m_items[m_gapStart + m_gapLength],
+ (index - m_gapStart) * sizeof(T));
+
+ } else if (m_gapStart > index) {
+ // need to move some stuff right to fill the gap
+ memmove(&m_items[index + m_gapLength], &m_items[index],
+ (m_gapStart - index) * sizeof(T));
+ }
+
+ m_gapStart = index;
+}
+
+template <class T>
+void FastVector<T>::resize(size_type needed)
+{
+ size_type newSize = bestNewCount(needed, sizeof(T));
+
+ if (m_items) {
+ m_items = static_cast<T *>(realloc(m_items, newSize * sizeof(T)));
+ } else {
+ m_items = static_cast<T *>(malloc(newSize * sizeof(T)));
+ }
+
+ m_size = newSize;
+}
+
+template <class T>
+void FastVector<T>::remove(size_type index)
+{
+ assert(index >= 0 && index < m_count);
+
+ if (index == m_count - 1) {
+ // shorten the list without disturbing an existing gap, unless
+ // the item we're taking was the only one after the gap
+ m_items[externalToInternal(index)].T::~T();
+ if (m_gapStart == index) m_gapStart = -1;
+ } else {
+ if (m_gapStart >= 0) {
+ // moveGapTo shifts the gap around ready for insertion.
+ // It actually moves the indexed object out of the way, so
+ // that it's now at the end of the gap. We have to cope.
+ moveGapTo(index);
+ m_items[m_gapStart + m_gapLength].T::~T();
+ ++m_gapLength;
+ } else { // no gap, make one
+ m_gapStart = index;
+ m_items[m_gapStart].T::~T();
+ m_gapLength = 1;
+ }
+ }
+
+ if (--m_count == 0) m_gapStart = -1;
+ if (m_count < m_size/3 && m_size > minSize()) {
+ closeGap();
+ resize(m_count); // recover some memory
+ }
+}
+
+template <class T>
+void FastVector<T>::insert(size_type index, const T&t)
+{
+ assert(index >= 0 && index <= m_count);
+
+ if (index == m_count) {
+
+ // Appending. No need to disturb the gap, if there is one --
+ // we'd rather waste a bit of memory than bother closing it up
+
+ if (externalToInternal(m_count) >= m_size || !m_items) {
+ resize(m_size + 1);
+ }
+
+ new (this, &m_items[externalToInternal(index)]) T(t);
+
+ } else if (m_gapStart < 0) {
+
+ // Inserting somewhere, when there's no gap we can use.
+
+ if (m_count >= m_size) resize(m_size + 1);
+
+ // I think it's going to be more common to insert elements
+ // at the same point repeatedly than at random points.
+ // So, if we can make a gap here ready for more insertions
+ // *without* exceeding the m_size limit (i.e. if we've got
+ // slack left over from a previous gap), then let's. But
+ // not too much -- ideally we'd like some space left for
+ // appending. Say half.
+
+ if (m_count < m_size-2) {
+ m_gapStart = index+1;
+ m_gapLength = (m_size - m_count) / 2;
+ memmove(&m_items[m_gapStart + m_gapLength], &m_items[index],
+ (m_count - index) * sizeof(T));
+ } else {
+ memmove(&m_items[index + 1], &m_items[index],
+ (m_count - index) * sizeof(T));
+ }
+
+ new (this, &m_items[index]) T(t);
+
+ } else {
+
+ // There's already a gap, all we have to do is move it (with
+ // no need to resize)
+
+ if (index != m_gapStart) moveGapTo(index);
+ new (this, &m_items[m_gapStart]) T(t);
+ if (--m_gapLength == 0) m_gapStart = -1;
+ else ++m_gapStart;
+ }
+
+ ++m_count;
+}
+
+template <class T>
+template <class InputIterator>
+typename FastVector<T>::iterator FastVector<T>::insert
+(const FastVector<T>::iterator &p, InputIterator &i, InputIterator &j)
+{
+ size_type n = p.m_i;
+ while (i != j) {
+ --j;
+ insert(n, *j);
+ }
+ return begin() + n;
+}
+
+template <class T>
+typename FastVector<T>::iterator FastVector<T>::erase
+(const FastVector<T>::iterator &i, const FastVector<T>::iterator &j)
+{
+ assert(i.m_v == this && j.m_v == this && j.m_i >= i.m_i);
+ for (size_type k = i.m_i; k < j.m_i; ++k) remove(i.m_i);
+ return iterator(this, i.m_i);
+}
+
+template <class T>
+void FastVector<T>::clear()
+{
+ // Use erase(), which uses remove() -- a subclass that overrides
+ // remove() will not want to have to provide this method as well
+ erase(begin(), end());
+}
+
+template <class T>
+T* FastVector<T>::array(size_type index, size_type count)
+{
+ assert(index >= 0 && count > 0 && index + count <= m_count);
+
+ if (m_gapStart < 0 || index + count <= m_gapStart) {
+ return m_items + index;
+ } else if (index >= m_gapStart) {
+ return m_items + index + m_gapLength;
+ } else {
+ closeGap();
+ return m_items + index;
+ }
+}
+
+template <class T>
+bool FastVector<T>::operator==(const FastVector<T> &v) const
+{
+ if (size() != v.size()) return false;
+ for (size_type i = 0; i < m_count; ++i) {
+ if (at(i) != v.at(i)) return false;
+ }
+ return true;
+}
+
+#endif
+
+
diff --git a/src/base/Instrument.cpp b/src/base/Instrument.cpp
new file mode 100644
index 0000000..add1767
--- /dev/null
+++ b/src/base/Instrument.cpp
@@ -0,0 +1,645 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include <stdio.h>
+
+#include "Instrument.h"
+#include "MidiDevice.h"
+#include "AudioPluginInstance.h"
+#include "AudioLevel.h"
+
+#if (__GNUC__ < 3)
+#include <strstream>
+#define stringstream strstream
+#else
+#include <sstream>
+#endif
+
+
+namespace Rosegarden
+{
+
+const unsigned int PluginContainer::PLUGIN_COUNT = 5;
+
+PluginContainer::PluginContainer(bool havePlugins)
+{
+ if (havePlugins) {
+ // Add a number of plugin place holders (unassigned)
+ for (unsigned int i = 0; i < PLUGIN_COUNT; i++)
+ addPlugin(new AudioPluginInstance(i));
+ }
+}
+
+PluginContainer::~PluginContainer()
+{
+ clearPlugins();
+}
+
+void
+PluginContainer::addPlugin(AudioPluginInstance *instance)
+{
+ m_audioPlugins.push_back(instance);
+}
+
+bool
+PluginContainer::removePlugin(unsigned int position)
+{
+ PluginInstanceIterator it = m_audioPlugins.begin();
+
+ for (; it != m_audioPlugins.end(); it++)
+ {
+ if ((*it)->getPosition() == position)
+ {
+ delete (*it);
+ m_audioPlugins.erase(it);
+ return true;
+ }
+
+ }
+
+ return false;
+}
+
+void
+PluginContainer::clearPlugins()
+{
+ PluginInstanceIterator it = m_audioPlugins.begin();
+ for (; it != m_audioPlugins.end(); it++)
+ delete (*it);
+
+ m_audioPlugins.erase(m_audioPlugins.begin(), m_audioPlugins.end());
+}
+
+void
+PluginContainer::emptyPlugins()
+{
+ PluginInstanceIterator it = m_audioPlugins.begin();
+ for (; it != m_audioPlugins.end(); it++)
+ {
+ (*it)->setAssigned(false);
+ (*it)->setBypass(false);
+ (*it)->clearPorts();
+ }
+}
+
+
+// Get an instance for an index
+//
+AudioPluginInstance*
+PluginContainer::getPlugin(unsigned int position)
+{
+ PluginInstanceIterator it = m_audioPlugins.begin();
+ for (; it != m_audioPlugins.end(); it++)
+ {
+ if ((*it)->getPosition() == position)
+ return *it;
+ }
+
+ return 0;
+}
+
+
+const unsigned int Instrument::SYNTH_PLUGIN_POSITION = 999;
+
+
+Instrument::Instrument(InstrumentId id,
+ InstrumentType it,
+ const std::string &name,
+ Device *device):
+ PluginContainer(it == Audio || it == SoftSynth),
+ m_id(id),
+ m_name(name),
+ m_type(it),
+ m_channel(0),
+ //m_input_channel(-1),
+ m_transpose(MidiMidValue),
+ m_pan(MidiMidValue),
+ m_volume(100),
+ m_level(0.0),
+ m_recordLevel(0.0),
+ m_device(device),
+ m_sendBankSelect(false),
+ m_sendProgramChange(false),
+ m_sendPan(false),
+ m_sendVolume(false),
+ m_mappedId(0),
+ m_audioInput(1000),
+ m_audioInputChannel(0),
+ m_audioOutput(0)
+{
+ if (it == Audio || it == SoftSynth)
+ {
+ // In an audio instrument we use the m_channel attribute to
+ // hold the number of audio channels this Instrument uses -
+ // not the MIDI channel number. Default is 2 (stereo).
+ //
+ m_channel = 2;
+
+ m_pan = 100; // audio pan ranges from -100 to 100 but
+ // we store within an unsigned char as
+ // 0 to 200.
+ }
+
+ if (it == SoftSynth) {
+ addPlugin(new AudioPluginInstance(SYNTH_PLUGIN_POSITION));
+ }
+}
+
+Instrument::Instrument(InstrumentId id,
+ InstrumentType it,
+ const std::string &name,
+ MidiByte channel,
+ Device *device):
+ PluginContainer(it == Audio || it == SoftSynth),
+ m_id(id),
+ m_name(name),
+ m_type(it),
+ m_channel(channel),
+ //m_input_channel(-1),
+ m_transpose(MidiMidValue),
+ m_pan(MidiMidValue),
+ m_volume(100),
+ m_level(0.0),
+ m_recordLevel(0.0),
+ m_device(device),
+ m_sendBankSelect(false),
+ m_sendProgramChange(false),
+ m_sendPan(false),
+ m_sendVolume(false),
+ m_mappedId(0),
+ m_audioInput(1000),
+ m_audioInputChannel(0),
+ m_audioOutput(0)
+{
+ // Add a number of plugin place holders (unassigned)
+ //
+ if (it == Audio || it == SoftSynth)
+ {
+ // In an audio instrument we use the m_channel attribute to
+ // hold the number of audio channels this Instrument uses -
+ // not the MIDI channel number. Default is 2 (stereo).
+ //
+ m_channel = 2;
+
+ m_pan = 100; // audio pan ranges from -100 to 100 but
+ // we store within an unsigned char as
+
+ } else {
+/*
+ *
+ * Let's try getting rid of this default behavior, and replacing it with a
+ * change to the factory autoload instead, because this just doesn't work out
+ * very well, and it's fiddly trying to sort the overall behavior into something
+ * less quirky (dmm)
+ *
+ // Also defined in Midi.h but we don't use that - not here
+ // in the clean inner sanctum.
+ //
+ const MidiByte MIDI_PERCUSSION_CHANNEL = 9;
+ const MidiByte MIDI_EXTENDED_PERCUSSION_CHANNEL = 10;
+
+ if (m_channel == MIDI_PERCUSSION_CHANNEL ||
+ m_channel == MIDI_EXTENDED_PERCUSSION_CHANNEL) {
+ setPercussion(true);
+ }
+*/
+ }
+
+ if (it == SoftSynth) {
+ addPlugin(new AudioPluginInstance(SYNTH_PLUGIN_POSITION));
+ }
+}
+
+Instrument::Instrument(const Instrument &ins):
+ XmlExportable(),
+ PluginContainer(ins.getType() == Audio || ins.getType() == SoftSynth),
+ m_id(ins.getId()),
+ m_name(ins.getName()),
+ m_type(ins.getType()),
+ m_channel(ins.getMidiChannel()),
+ //m_input_channel(ins.getMidiInputChannel()),
+ m_program(ins.getProgram()),
+ m_transpose(ins.getMidiTranspose()),
+ m_pan(ins.getPan()),
+ m_volume(ins.getVolume()),
+ m_level(ins.getLevel()),
+ m_recordLevel(ins.getRecordLevel()),
+ m_device(ins.getDevice()),
+ m_sendBankSelect(ins.sendsBankSelect()),
+ m_sendProgramChange(ins.sendsProgramChange()),
+ m_sendPan(ins.sendsPan()),
+ m_sendVolume(ins.sendsVolume()),
+ m_mappedId(ins.getMappedId()),
+ m_audioInput(ins.m_audioInput),
+ m_audioInputChannel(ins.m_audioInputChannel),
+ m_audioOutput(ins.m_audioOutput)
+{
+ if (ins.getType() == Audio || ins.getType() == SoftSynth)
+ {
+ // In an audio instrument we use the m_channel attribute to
+ // hold the number of audio channels this Instrument uses -
+ // not the MIDI channel number. Default is 2 (stereo).
+ //
+ m_channel = 2;
+ }
+
+ if (ins.getType() == SoftSynth) {
+ addPlugin(new AudioPluginInstance(SYNTH_PLUGIN_POSITION));
+ }
+}
+
+Instrument &
+Instrument::operator=(const Instrument &ins)
+{
+ if (&ins == this) return *this;
+
+ m_id = ins.getId();
+ m_name = ins.getName();
+ m_type = ins.getType();
+ m_channel = ins.getMidiChannel();
+ //m_input_channel = ins.getMidiInputChannel();
+ m_program = ins.getProgram();
+ m_transpose = ins.getMidiTranspose();
+ m_pan = ins.getPan();
+ m_volume = ins.getVolume();
+ m_level = ins.getLevel();
+ m_recordLevel = ins.getRecordLevel();
+ m_device = ins.getDevice();
+ m_sendBankSelect = ins.sendsBankSelect();
+ m_sendProgramChange = ins.sendsProgramChange();
+ m_sendPan = ins.sendsPan();
+ m_sendVolume = ins.sendsVolume();
+ m_mappedId = ins.getMappedId();
+ m_audioInput = ins.m_audioInput;
+ m_audioInputChannel = ins.m_audioInputChannel;
+ m_audioOutput = ins.m_audioOutput;
+
+ return *this;
+}
+
+
+Instrument::~Instrument()
+{
+}
+
+std::string
+Instrument::getPresentationName() const
+{
+ if (m_type == Audio || m_type == SoftSynth || !m_device) {
+ return m_name;
+ } else {
+ return m_device->getName() + " " + m_name;
+ }
+}
+
+void
+Instrument::setProgramChange(MidiByte program)
+{
+ m_program = MidiProgram(m_program.getBank(), program);
+}
+
+MidiByte
+Instrument::getProgramChange() const
+{
+ return m_program.getProgram();
+}
+
+void
+Instrument::setMSB(MidiByte msb)
+{
+ m_program = MidiProgram(MidiBank(m_program.getBank().isPercussion(),
+ msb,
+ m_program.getBank().getLSB()),
+ m_program.getProgram());
+}
+
+MidiByte
+Instrument::getMSB() const
+{
+ return m_program.getBank().getMSB();
+}
+
+void
+Instrument::setLSB(MidiByte lsb)
+{
+ m_program = MidiProgram(MidiBank(m_program.getBank().isPercussion(),
+ m_program.getBank().getMSB(),
+ lsb),
+ m_program.getProgram());
+}
+
+MidiByte
+Instrument::getLSB() const
+{
+ return m_program.getBank().getLSB();
+}
+
+void
+Instrument::setPercussion(bool percussion)
+{
+ m_program = MidiProgram(MidiBank(percussion,
+ m_program.getBank().getMSB(),
+ m_program.getBank().getLSB()),
+ m_program.getProgram());
+}
+
+bool
+Instrument::isPercussion() const
+{
+ return m_program.getBank().isPercussion();
+}
+
+void
+Instrument::setAudioInputToBuss(BussId buss, int channel)
+{
+ m_audioInput = buss;
+ m_audioInputChannel = channel;
+}
+
+void
+Instrument::setAudioInputToRecord(int recordIn, int channel)
+{
+ m_audioInput = recordIn + 1000;
+ m_audioInputChannel = channel;
+}
+
+int
+Instrument::getAudioInput(bool &isBuss, int &channel) const
+{
+ channel = m_audioInputChannel;
+
+ if (m_audioInput >= 1000) {
+ isBuss = false;
+ return m_audioInput - 1000;
+ } else {
+ isBuss = true;
+ return m_audioInput;
+ }
+}
+
+
+// Implementation of the virtual method to output this class
+// as XML. We don't send out the name as it's redundant in
+// the file - that is driven from the sequencer.
+//
+//
+std::string
+Instrument::toXmlString()
+{
+
+ std::stringstream instrument;
+
+ // We don't send system Instruments out this way -
+ // only user Instruments.
+ //
+ if (m_id < AudioInstrumentBase)
+ {
+#if (__GNUC__ < 3)
+ instrument << std::ends;
+#endif
+ return instrument.str();
+ }
+
+ instrument << " <instrument id=\"" << m_id;
+ instrument << "\" channel=\"" << (int)m_channel;
+ instrument << "\" type=\"";
+
+ if (m_type == Midi)
+ {
+ instrument << "midi\">" << std::endl;
+
+ if (m_sendBankSelect)
+ {
+ instrument << " <bank percussion=\""
+ << (isPercussion() ? "true" : "false") << "\" msb=\""
+ << (int)getMSB();
+ instrument << "\" lsb=\"" << (int)getLSB() << "\"/>" << std::endl;
+ }
+
+ if (m_sendProgramChange)
+ {
+ instrument << " <program id=\""
+ << (int)getProgramChange() << "\"/>"
+ << std::endl;
+ }
+
+ instrument << " <pan value=\""
+ << (int)m_pan << "\"/>" << std::endl;
+
+ instrument << " <volume value=\""
+ << (int)m_volume << "\"/>" << std::endl;
+
+ for (StaticControllerConstIterator it = m_staticControllers.begin();
+ it != m_staticControllers.end(); ++it)
+ {
+ instrument << " <controlchange type=\"" << int(it->first)
+ << "\" value=\"" << int(it->second) << "\"/>" << std::endl;
+ }
+
+ }
+ else // Audio or SoftSynth
+ {
+
+ if (m_type == Audio) {
+ instrument << "audio\">" << std::endl;
+ } else {
+ instrument << "softsynth\">" << std::endl;
+ }
+
+ instrument << " <pan value=\""
+ << (int)m_pan << "\"/>" << std::endl;
+
+ instrument << " <level value=\""
+ << m_level << "\"/>" << std::endl;
+
+ instrument << " <recordLevel value=\""
+ << m_recordLevel << "\"/>" << std::endl;
+
+ bool aibuss;
+ int channel;
+ int ai = getAudioInput(aibuss, channel);
+
+ instrument << " <audioInput value=\""
+ << ai << "\" type=\""
+ << (aibuss ? "buss" : "record")
+ << "\" channel=\"" << channel
+ << "\"/>" << std::endl;
+
+ instrument << " <audioOutput value=\""
+ << m_audioOutput << "\"/>" << std::endl;
+
+ PluginInstanceIterator it = m_audioPlugins.begin();
+ for (; it != m_audioPlugins.end(); it++)
+ {
+ instrument << (*it)->toXmlString();
+ }
+ }
+
+ instrument << " </instrument>" << std::endl
+#if (__GNUC__ < 3)
+ << std::endl << std::ends;
+#else
+ << std::endl;
+#endif
+
+ return instrument.str();
+
+}
+
+
+// Return a program name given a bank select (and whether
+// we send it or not)
+//
+std::string
+Instrument::getProgramName() const
+{
+ if (m_sendProgramChange == false)
+ return std::string("");
+
+ MidiProgram program(m_program);
+
+ if (!m_sendBankSelect)
+ program = MidiProgram(MidiBank(isPercussion(), 0, 0), program.getProgram());
+
+ return ((dynamic_cast<MidiDevice*>(m_device))->getProgramName(program));
+}
+
+void
+Instrument::setControllerValue(MidiByte controller, MidiByte value)
+{
+ for (StaticControllerIterator it = m_staticControllers.begin();
+ it != m_staticControllers.end(); ++it)
+ {
+ if (it->first == controller)
+ {
+ it->second = value;
+ return;
+ }
+ }
+
+ m_staticControllers.push_back(std::pair<MidiByte, MidiByte>(controller, value));
+
+}
+
+MidiByte
+Instrument::getControllerValue(MidiByte controller) const
+{
+ for (StaticControllerConstIterator it = m_staticControllers.begin();
+ it != m_staticControllers.end(); ++it)
+ {
+
+ if (it->first == controller)
+ return it->second;
+ }
+
+ throw std::string("<no controller of that value>");
+}
+
+const MidiKeyMapping *
+Instrument::getKeyMapping() const
+{
+ MidiDevice *md = dynamic_cast<MidiDevice*>(m_device);
+ if (!md) return 0;
+
+ const MidiKeyMapping *mkm = md->getKeyMappingForProgram(m_program);
+ if (mkm) return mkm;
+
+ if (isPercussion()) { // if any key mapping is available, use it
+ const KeyMappingList &kml = md->getKeyMappings();
+ if (kml.begin() != kml.end()) {
+ return &(*kml.begin());
+ }
+ }
+
+ return 0;
+}
+
+
+Buss::Buss(BussId id) :
+ PluginContainer(true),
+ m_id(id),
+ m_level(0.0),
+ m_pan(100),
+ m_mappedId(0)
+{
+}
+
+Buss::~Buss()
+{
+}
+
+std::string
+Buss::toXmlString()
+{
+ std::stringstream buss;
+
+ buss << " <buss id=\"" << m_id << "\">" << std::endl;
+ buss << " <pan value=\"" << (int)m_pan << "\"/>" << std::endl;
+ buss << " <level value=\"" << m_level << "\"/>" << std::endl;
+
+ PluginInstanceIterator it = m_audioPlugins.begin();
+ for (; it != m_audioPlugins.end(); it++) {
+ buss << (*it)->toXmlString();
+ }
+
+ buss << " </buss>" << std::endl;
+
+#if (__GNUC__ < 3)
+ buss << std::ends;
+#endif
+
+ return buss.str();
+}
+
+std::string
+Buss::getName() const
+{
+ char buffer[20];
+ sprintf(buffer, "Submaster %d", m_id);
+ return buffer;
+}
+
+std::string
+Buss::getPresentationName() const
+{
+ return getName();
+}
+
+RecordIn::RecordIn() :
+ m_mappedId(0)
+{
+}
+
+RecordIn::~RecordIn()
+{
+}
+
+std::string
+RecordIn::toXmlString()
+{
+ // We don't actually save these, as they have nothing persistent
+ // in them. The studio just remembers how many there should be.
+ return "";
+}
+
+
+}
+
diff --git a/src/base/Instrument.h b/src/base/Instrument.h
new file mode 100644
index 0000000..8c348f0
--- /dev/null
+++ b/src/base/Instrument.h
@@ -0,0 +1,349 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _INSTRUMENT_H_
+#define _INSTRUMENT_H_
+
+#include <string>
+#include <vector>
+
+#include "XmlExportable.h"
+#include "MidiProgram.h"
+
+// An Instrument connects a Track (which itself contains
+// a list of Segments) to a device that can play that
+// Track.
+//
+// An Instrument is either MIDI or Audio (or whatever else
+// we decide to implement).
+//
+//
+
+namespace Rosegarden
+{
+
+// plugins
+class AudioPluginInstance;
+typedef std::vector<AudioPluginInstance*>::iterator PluginInstanceIterator;
+
+typedef std::vector<std::pair<MidiByte, MidiByte> > StaticControllers;
+typedef std::vector<std::pair<MidiByte, MidiByte> >::iterator StaticControllerIterator;
+typedef std::vector<std::pair<MidiByte, MidiByte> >::const_iterator StaticControllerConstIterator;
+
+
+// Instrument number groups
+//
+const InstrumentId SystemInstrumentBase = 0;
+const InstrumentId AudioInstrumentBase = 1000;
+const InstrumentId MidiInstrumentBase = 2000;
+const InstrumentId SoftSynthInstrumentBase = 10000;
+
+const unsigned int AudioInstrumentCount = 16;
+const unsigned int SoftSynthInstrumentCount = 24;
+
+const MidiByte MidiMaxValue = 127;
+const MidiByte MidiMidValue = 64;
+const MidiByte MidiMinValue = 0;
+
+typedef unsigned int BussId;
+
+// Predeclare Device
+//
+class Device;
+
+class PluginContainer
+{
+public:
+ static const unsigned int PLUGIN_COUNT; // for non-synth plugins
+
+ PluginInstanceIterator beginPlugins() { return m_audioPlugins.begin(); }
+ PluginInstanceIterator endPlugins() { return m_audioPlugins.end(); }
+
+ // Plugin management
+ //
+ void addPlugin(AudioPluginInstance *instance);
+ bool removePlugin(unsigned int position);
+ void clearPlugins();
+ void emptyPlugins(); // empty the plugins but don't clear them down
+
+ // Get a plugin for this container
+ //
+ AudioPluginInstance* getPlugin(unsigned int position);
+
+ virtual unsigned int getId() const = 0;
+ virtual std::string getName() const = 0;
+ virtual std::string getPresentationName() const = 0;
+
+protected:
+ PluginContainer(bool havePlugins);
+ virtual ~PluginContainer();
+
+ std::vector<AudioPluginInstance*> m_audioPlugins;
+};
+
+class Instrument : public XmlExportable, public PluginContainer
+{
+public:
+ static const unsigned int SYNTH_PLUGIN_POSITION;
+
+ enum InstrumentType { Midi, Audio, SoftSynth };
+
+ Instrument(InstrumentId id,
+ InstrumentType it,
+ const std::string &name,
+ Device *device);
+
+ Instrument(InstrumentId id,
+ InstrumentType it,
+ const std::string &name,
+ MidiByte channel,
+ Device *device);
+
+
+ // Copy constructor and assignment
+ //
+ Instrument(const Instrument &);
+ Instrument &operator=(const Instrument &);
+
+ ~Instrument();
+
+ virtual std::string getName() const { return m_name; }
+ virtual std::string getPresentationName() const;
+
+ void setId(InstrumentId id) { m_id = id; }
+ InstrumentId getId() const { return m_id; }
+
+ void setName(const std::string &name) { m_name = name; }
+ InstrumentType getType() const { return m_type; }
+
+ void setType(InstrumentType type) { m_type = type; }
+ InstrumentType getInstrumentType() { return m_type; }
+
+
+ // ---------------- MIDI Controllers -----------------
+ //
+ void setMidiChannel(MidiByte mC) { m_channel = mC; }
+ MidiByte getMidiChannel() const { return m_channel; }
+
+ //void setMidiInputChannel(char ic) { m_input_channel = ic; }
+ //char getMidiInputChannel() const { return m_input_channel; }
+
+ void setMidiTranspose(MidiByte mT) { m_transpose = mT; }
+ MidiByte getMidiTranspose() const { return m_transpose; }
+
+ // Pan is 0-127 for MIDI instruments, and (for some
+ // unfathomable reason) 0-200 for audio instruments.
+ //
+ void setPan(MidiByte pan) { m_pan = pan; }
+ MidiByte getPan() const { return m_pan; }
+
+ // Volume is 0-127 for MIDI instruments. It's not used for
+ // audio instruments -- see "level" instead.
+ //
+ void setVolume(MidiByte volume) { m_volume = volume; }
+ MidiByte getVolume() const { return m_volume; }
+
+ void setProgram(const MidiProgram &program) { m_program = program; }
+ const MidiProgram &getProgram() const { return m_program; }
+
+ void setSendBankSelect(bool value) { m_sendBankSelect = value; }
+ bool sendsBankSelect() const { return m_sendBankSelect; }
+
+ void setSendProgramChange(bool value) { m_sendProgramChange = value; }
+ bool sendsProgramChange() const { return m_sendProgramChange; }
+
+ void setSendPan(bool value) { m_sendPan = value; }
+ bool sendsPan() const { return m_sendPan; }
+
+ void setSendVolume(bool value) { m_sendVolume = value; }
+ bool sendsVolume() const { return m_sendVolume; }
+
+ void setControllerValue(MidiByte controller, MidiByte value);
+ MidiByte getControllerValue(MidiByte controller) const;
+
+ // This is retrieved from the reference MidiProgram in the Device
+ const MidiKeyMapping *getKeyMapping() const;
+
+ // Convenience functions (strictly redundant with get/setProgram):
+ //
+ void setProgramChange(MidiByte program);
+ MidiByte getProgramChange() const;
+
+ void setMSB(MidiByte msb);
+ MidiByte getMSB() const;
+
+ void setLSB(MidiByte msb);
+ MidiByte getLSB() const;
+
+ void setPercussion(bool percussion);
+ bool isPercussion() const;
+
+ // --------------- Audio Controllers -----------------
+ //
+ void setLevel(float dB) { m_level = dB; }
+ float getLevel() const { return m_level; }
+
+ void setRecordLevel(float dB) { m_recordLevel = dB; }
+ float getRecordLevel() const { return m_recordLevel; }
+
+ void setAudioChannels(unsigned int ch) { m_channel = MidiByte(ch); }
+ unsigned int getAudioChannels() const { return (unsigned int)(m_channel); }
+
+ // An audio input can be a buss or a record input. The channel number
+ // is required for mono instruments, ignored for stereo ones.
+ void setAudioInputToBuss(BussId buss, int channel = 0);
+ void setAudioInputToRecord(int recordIn, int channel = 0);
+ int getAudioInput(bool &isBuss, int &channel) const;
+
+ void setAudioOutput(BussId buss) { m_audioOutput = buss; }
+ BussId getAudioOutput() const { return m_audioOutput; }
+
+ // Implementation of virtual function
+ //
+ virtual std::string toXmlString();
+
+ // Get and set the parent device
+ //
+ Device* getDevice() const { return m_device; }
+ void setDevice(Device* dev) { m_device = dev; }
+
+ // Return a string describing the current program for
+ // this Instrument
+ //
+ std::string getProgramName() const;
+
+ // MappedId management - should typedef this type once
+ // we have the energy to shake this all out.
+ //
+ int getMappedId() const { return m_mappedId; }
+ void setMappedId(int id) { m_mappedId = id; }
+
+ StaticControllers& getStaticControllers() { return m_staticControllers; }
+
+private:
+ InstrumentId m_id;
+ std::string m_name;
+ InstrumentType m_type;
+
+ // Standard MIDI controllers and parameters
+ //
+ MidiByte m_channel;
+ //char m_input_channel;
+ MidiProgram m_program;
+ MidiByte m_transpose;
+ MidiByte m_pan; // required by audio
+ MidiByte m_volume;
+
+ // Used for Audio volume (dB value)
+ //
+ float m_level;
+
+ // Record level for Audio recording (dB value)
+ //
+ float m_recordLevel;
+
+ Device *m_device;
+
+ // Do we send at this intrument or do we leave these
+ // things up to the parent device and God? These are
+ // directly relatable to GUI elements
+ //
+ bool m_sendBankSelect;
+ bool m_sendProgramChange;
+ bool m_sendPan;
+ bool m_sendVolume;
+
+ // Instruments are directly related to faders for volume
+ // control. Here we can store the remote fader id.
+ //
+ int m_mappedId;
+
+ // Which input terminal we're connected to. This is a BussId if
+ // less than 1000 or a record input number (plus 1000) if >= 1000.
+ // The channel number is only used for mono instruments.
+ //
+ int m_audioInput;
+ int m_audioInputChannel;
+
+ // Which buss we output to. Zero is always the master.
+ //
+ BussId m_audioOutput;
+
+ // A static controller map that can be saved/loaded and queried along with this instrument.
+ // These values are modified from the IPB - if they appear on the IPB then they are sent
+ // at playback start time to the sequencer.
+ //
+ //
+ StaticControllers m_staticControllers;
+};
+
+
+class Buss : public XmlExportable, public PluginContainer
+{
+public:
+ Buss(BussId id);
+ ~Buss();
+
+ void setId(BussId id) { m_id = id; }
+ BussId getId() const { return m_id; }
+
+ void setLevel(float dB) { m_level = dB; }
+ float getLevel() const { return m_level; }
+
+ void setPan(MidiByte pan) { m_pan = pan; }
+ MidiByte getPan() const { return m_pan; }
+
+ int getMappedId() const { return m_mappedId; }
+ void setMappedId(int id) { m_mappedId = id; }
+
+ virtual std::string toXmlString();
+ virtual std::string getName() const;
+ virtual std::string getPresentationName() const;
+
+private:
+ BussId m_id;
+ float m_level;
+ MidiByte m_pan;
+ int m_mappedId;
+};
+
+
+// audio record input of a sort that can be connected to
+
+class RecordIn : public XmlExportable
+{
+public:
+ RecordIn();
+ ~RecordIn();
+
+ int getMappedId() const { return m_mappedId; }
+ void setMappedId(int id) { m_mappedId = id; }
+
+ virtual std::string toXmlString();
+
+private:
+ int m_mappedId;
+};
+
+
+}
+
+#endif // _INSTRUMENT_H_
diff --git a/src/base/LayoutEngine.cpp b/src/base/LayoutEngine.cpp
new file mode 100644
index 0000000..b6b3cf5
--- /dev/null
+++ b/src/base/LayoutEngine.cpp
@@ -0,0 +1,63 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include "LayoutEngine.h"
+
+namespace Rosegarden
+{
+
+LayoutEngine::LayoutEngine() :
+ m_status(0)
+{
+ // empty
+}
+
+LayoutEngine::~LayoutEngine()
+{
+ // empty
+}
+
+
+HorizontalLayoutEngine::HorizontalLayoutEngine(Composition *c) :
+ LayoutEngine(),
+ RulerScale(c)
+{
+ // empty
+}
+
+HorizontalLayoutEngine::~HorizontalLayoutEngine()
+{
+ // empty
+}
+
+
+VerticalLayoutEngine::VerticalLayoutEngine() :
+ LayoutEngine()
+{
+ // empty
+}
+
+VerticalLayoutEngine::~VerticalLayoutEngine()
+{
+ // empty
+}
+
+}
diff --git a/src/base/LayoutEngine.h b/src/base/LayoutEngine.h
new file mode 100644
index 0000000..179d119
--- /dev/null
+++ b/src/base/LayoutEngine.h
@@ -0,0 +1,161 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _LAYOUT_ENGINE_H_
+#define _LAYOUT_ENGINE_H_
+
+#include "RulerScale.h"
+
+namespace Rosegarden {
+
+class Staff;
+class TimeSignature;
+
+
+/**
+ * Base classes for layout engines. The intention is that
+ * different sorts of renderers (piano-roll, score etc) can be
+ * implemented by simply plugging different implementations
+ * of Staff and LayoutEngine into a single view class.
+ */
+class LayoutEngine
+{
+public:
+ LayoutEngine();
+ virtual ~LayoutEngine();
+
+ /**
+ * Resets internal data stores for all staffs
+ */
+ virtual void reset() = 0;
+
+ /**
+ * Resets internal data stores for a specific staff.
+ *
+ * If startTime == endTime, act on the whole staff; otherwise only
+ * the given section.
+ */
+ virtual void resetStaff(Staff &staff,
+ timeT startTime = 0,
+ timeT endTime = 0) = 0;
+
+ /**
+ * Precomputes layout data for a single staff, updating any
+ * internal data stores associated with that staff and updating
+ * any layout-related properties in the events on the staff's
+ * segment.
+ *
+ * If startTime == endTime, act on the whole staff; otherwise only
+ * the given section.
+ */
+ virtual void scanStaff(Staff &staff,
+ timeT startTime = 0,
+ timeT endTime = 0) = 0;
+
+ /**
+ * Computes any layout data that may depend on the results of
+ * scanning more than one staff. This may mean doing most of
+ * the layout (likely for horizontal layout) or nothing at all
+ * (likely for vertical layout).
+ *
+ * If startTime == endTime, act on the whole staff; otherwise only
+ * the given section.
+ */
+ virtual void finishLayout(timeT startTime = 0,
+ timeT endTime = 0) = 0;
+
+ unsigned int getStatus() const { return m_status; }
+
+protected:
+ unsigned int m_status;
+};
+
+
+class HorizontalLayoutEngine : public LayoutEngine,
+ public RulerScale
+{
+public:
+ HorizontalLayoutEngine(Composition *c);
+ virtual ~HorizontalLayoutEngine();
+
+ /**
+ * Sets a page width for the layout.
+ *
+ * A layout implementation does not have to use this. Some might
+ * use it (for example) to ensure that bar lines fall precisely at
+ * the right-hand margin of each page. The computed x-coordinates
+ * will still require to be wrapped into lines by the staff or
+ * view implementation, however.
+ *
+ * A width of zero indicates no requirement for division into
+ * pages.
+ */
+ virtual void setPageWidth(double) { /* default: ignore it */ }
+
+ /**
+ * Returns the number of the first visible bar line on the given
+ * staff
+ */
+ virtual int getFirstVisibleBarOnStaff(Staff &) {
+ return getFirstVisibleBar();
+ }
+
+ /**
+ * Returns the number of the last visible bar line on the given
+ * staff
+ */
+ virtual int getLastVisibleBarOnStaff(Staff &) {
+ return getLastVisibleBar();
+ }
+
+ /**
+ * Returns true if the specified bar has the correct length
+ */
+ virtual bool isBarCorrectOnStaff(Staff &, int/* barNo */) {
+ return true;
+ }
+
+ /**
+ * Returns true if there is a new time signature in the given bar,
+ * setting timeSignature appropriately and setting timeSigX to its
+ * x-coord
+ */
+ virtual bool getTimeSignaturePosition
+ (Staff &, int /* barNo */, TimeSignature &, double &/* timeSigX */) {
+ return 0;
+ }
+};
+
+
+
+class VerticalLayoutEngine : public LayoutEngine
+{
+public:
+ VerticalLayoutEngine();
+ virtual ~VerticalLayoutEngine();
+
+ // I don't think we need to add anything here for now
+};
+
+}
+
+
+#endif
diff --git a/src/base/LegatoQuantizer.cpp b/src/base/LegatoQuantizer.cpp
new file mode 100644
index 0000000..dcc2458
--- /dev/null
+++ b/src/base/LegatoQuantizer.cpp
@@ -0,0 +1,141 @@
+// -*- c-basic-offset: 4 -*-
+
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include "LegatoQuantizer.h"
+#include "BaseProperties.h"
+#include "NotationTypes.h"
+#include "Selection.h"
+#include "Composition.h"
+#include "Profiler.h"
+
+#include <iostream>
+#include <cmath>
+#include <cstdio> // for sprintf
+#include <ctime>
+
+using std::cout;
+using std::cerr;
+using std::endl;
+
+namespace Rosegarden
+{
+
+using namespace BaseProperties;
+
+
+LegatoQuantizer::LegatoQuantizer(timeT unit) :
+ Quantizer(RawEventData),
+ m_unit(unit)
+{
+ if (m_unit < 0) m_unit = Note(Note::Shortest).getDuration();
+}
+
+LegatoQuantizer::LegatoQuantizer(std::string source, std::string target, timeT unit) :
+ Quantizer(source, target),
+ m_unit(unit)
+{
+ if (m_unit < 0) m_unit = Note(Note::Shortest).getDuration();
+}
+
+LegatoQuantizer::LegatoQuantizer(const LegatoQuantizer &q) :
+ Quantizer(q.m_target),
+ m_unit(q.m_unit)
+{
+ // nothing else
+}
+
+LegatoQuantizer::~LegatoQuantizer()
+{
+ // nothing
+}
+
+void
+LegatoQuantizer::quantizeRange(Segment *s,
+ Segment::iterator from,
+ Segment::iterator to) const
+{
+ Segment::iterator tmp;
+ while (from != to) {
+ quantizeSingle(s, from, tmp);
+ from = tmp;
+ if (!s->isBeforeEndMarker(from) ||
+ (s->isBeforeEndMarker(to) &&
+ ((*from)->getAbsoluteTime() >= (*to)->getAbsoluteTime()))) break;
+ }
+}
+
+void
+LegatoQuantizer::quantizeSingle(Segment *s, Segment::iterator i,
+ Segment::iterator &nexti) const
+{
+ // Stretch each note out to reach the quantized start time of the
+ // next note whose quantized start time is greater than or equal
+ // to the end time of this note after quantization
+
+ timeT t = getFromSource(*i, AbsoluteTimeValue);
+ timeT d = getFromSource(*i, DurationValue);
+
+ timeT d0(d), t0(t);
+
+ timeT barStart = s->getBarStartForTime(t);
+
+ t -= barStart;
+ t = quantizeTime(t);
+ t += barStart;
+
+ nexti = i;
+ ++nexti;
+
+ for (Segment::iterator j = i; s->isBeforeEndMarker(j); ++j) {
+ if (!(*j)->isa(Note::EventType)) continue;
+
+ timeT qt = (*j)->getAbsoluteTime();
+ qt -= barStart;
+ qt = quantizeTime(qt);
+ qt += barStart;
+
+ if (qt >= t + d) {
+ d = qt - t;
+ }
+ if (qt > t) {
+ break;
+ }
+ }
+
+ if (t0 != t || d0 != d) {
+ setToTarget(s, i, t, d);
+ nexti = s->findTime(t + d);
+ }
+}
+
+timeT
+LegatoQuantizer::quantizeTime(timeT t) const
+{
+ if (m_unit != 0) {
+ timeT low = (t / m_unit) * m_unit;
+ timeT high = low + m_unit;
+ t = ((high - t > t - low) ? low : high);
+ }
+ return t;
+}
+
+}
diff --git a/src/base/LegatoQuantizer.h b/src/base/LegatoQuantizer.h
new file mode 100644
index 0000000..645da05
--- /dev/null
+++ b/src/base/LegatoQuantizer.h
@@ -0,0 +1,64 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef LEGATO_QUANTIZER_H
+#define LEGATO_QUANTIZER_H
+
+#include "Quantizer.h"
+
+namespace Rosegarden {
+
+class BasicQuantizer;
+
+class LegatoQuantizer : public Quantizer
+{
+public:
+ // The default unit is the shortest note type. A unit of
+ // zero means do no quantization -- unlike for BasicQuantizer
+ // this does have a purpose, as it still does the legato step
+ LegatoQuantizer(timeT unit = -1);
+ LegatoQuantizer(std::string source, std::string target, timeT unit = -1);
+ LegatoQuantizer(const LegatoQuantizer &);
+ virtual ~LegatoQuantizer();
+
+ void setUnit(timeT unit) { m_unit = unit; }
+ timeT getUnit() const { return m_unit; }
+
+ virtual void quantizeRange(Segment *,
+ Segment::iterator,
+ Segment::iterator) const;
+
+protected:
+ virtual void quantizeSingle(Segment *, Segment::iterator,
+ Segment::iterator &) const;
+
+ timeT quantizeTime(timeT) const;
+
+private:
+ LegatoQuantizer &operator=(const BasicQuantizer &); // not provided
+
+ timeT m_unit;
+};
+
+}
+
+#endif
+
diff --git a/src/base/Marker.cpp b/src/base/Marker.cpp
new file mode 100644
index 0000000..beab5f6
--- /dev/null
+++ b/src/base/Marker.cpp
@@ -0,0 +1,55 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "Marker.h"
+#include "misc/Debug.h"
+
+#if (__GNUC__ < 3)
+#include <strstream>
+#define stringstream strstream
+#else
+#include <sstream>
+#endif
+
+namespace Rosegarden
+{
+
+int Marker::m_sequence = 0;
+
+std::string
+Marker::toXmlString()
+{
+ std::stringstream marker;
+
+ marker << " <marker time=\"" << m_time
+ << "\" name=\"" << encode(m_name)
+ << "\" description=\"" << encode(m_description)
+ << "\"/>" << std::endl;
+#if (__GNUC__ < 3)
+ marker << std::ends;
+#endif
+
+ return marker.str();
+}
+
+}
+
diff --git a/src/base/Marker.h b/src/base/Marker.h
new file mode 100644
index 0000000..624081d
--- /dev/null
+++ b/src/base/Marker.h
@@ -0,0 +1,78 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _MARKER_H_
+#define _MARKER_H_
+
+#include <string>
+
+#include "Event.h"
+#include "XmlExportable.h"
+
+// A Marker is a user defined point in a Composition that can be
+// used to define looping points - jump to, make notes at etc.
+//
+// Not to be confused with Composition or Segment start and
+// end markers. Which they probably could be quite easily.
+// I probably should've thought the name through a bit better
+// really..
+//
+
+namespace Rosegarden
+{
+
+class Marker : public XmlExportable
+{
+public:
+ Marker():m_time(0), m_name(std::string("<unnamed>")),
+ m_description(std::string("<none>")) { m_id = nextSeqVal(); }
+
+ Marker(timeT time, const std::string &name,
+ const std::string &description):
+ m_time(time), m_name(name), m_description(description) { m_id = nextSeqVal(); }
+
+ int getID() const { return m_id; }
+ timeT getTime() const { return m_time; }
+ std::string getName() const { return m_name; }
+ std::string getDescription() const { return m_description; }
+
+ void setTime(timeT time) { m_time = time; }
+ void setName(const std::string &name) { m_name = name; }
+ void setDescription(const std::string &des) { m_description = des; }
+
+ // export as XML
+ virtual std::string toXmlString();
+
+protected:
+
+ int m_id;
+ timeT m_time;
+ std::string m_name;
+ std::string m_description;
+
+private:
+ static int nextSeqVal() { return ++m_sequence; } // assume there won't be concurrency problem
+ static int m_sequence;
+};
+
+}
+
+#endif // _CONTROLPARAMETER_H_
diff --git a/src/base/MidiDevice.cpp b/src/base/MidiDevice.cpp
new file mode 100644
index 0000000..cceeb0e
--- /dev/null
+++ b/src/base/MidiDevice.cpp
@@ -0,0 +1,839 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include "MidiDevice.h"
+#include "MidiTypes.h"
+#include "Instrument.h"
+#include "ControlParameter.h"
+
+#include <cstdio>
+#include <cstdlib>
+#include <iostream>
+#include <set>
+
+#if (__GNUC__ < 3)
+#include <strstream>
+#define stringstream strstream
+#else
+#include <sstream>
+#endif
+
+
+namespace Rosegarden
+{
+
+MidiDevice::MidiDevice():
+ Device(0, "Default Midi Device", Device::Midi),
+ m_metronome(0),
+ m_direction(Play),
+ m_variationType(NoVariations),
+ m_librarian(std::pair<std::string, std::string>("<none>", "<none>"))
+{
+ generatePresentationList();
+ generateDefaultControllers();
+
+ // create a default Metronome
+ m_metronome = new MidiMetronome(MidiInstrumentBase + 9);
+}
+
+MidiDevice::MidiDevice(DeviceId id,
+ const std::string &name,
+ DeviceDirection dir):
+ Device(id, name, Device::Midi),
+ m_metronome(0),
+ m_direction(dir),
+ m_variationType(NoVariations),
+ m_librarian(std::pair<std::string, std::string>("<none>", "<none>"))
+{
+ generatePresentationList();
+ generateDefaultControllers();
+
+ // create a default Metronome
+ m_metronome = new MidiMetronome(MidiInstrumentBase + 9);
+}
+
+MidiDevice::MidiDevice(DeviceId id,
+ const MidiDevice &dev) :
+ Device(id, dev.getName(), Device::Midi),
+ m_programList(dev.m_programList),
+ m_bankList(dev.m_bankList),
+ m_controlList(dev.m_controlList),
+ m_metronome(0),
+ m_direction(dev.getDirection()),
+ m_variationType(dev.getVariationType()),
+ m_librarian(dev.getLibrarian())
+{
+ // Create and assign a metronome if required
+ //
+ if (dev.getMetronome()) {
+ m_metronome = new MidiMetronome(*dev.getMetronome());
+ }
+
+ generatePresentationList();
+ generateDefaultControllers();
+}
+
+MidiDevice::MidiDevice(const MidiDevice &dev) :
+ Device(dev.getId(), dev.getName(), dev.getType()),
+ Controllable(),
+ m_programList(dev.m_programList),
+ m_bankList(dev.m_bankList),
+ m_controlList(dev.m_controlList),
+ m_metronome(0),
+ m_direction(dev.getDirection()),
+ m_variationType(dev.getVariationType()),
+ m_librarian(dev.getLibrarian())
+{
+ // Create and assign a metronome if required
+ //
+ if (dev.getMetronome())
+ {
+ m_metronome = new MidiMetronome(*dev.getMetronome());
+ }
+
+ // Copy the instruments
+ //
+ InstrumentList insList = dev.getAllInstruments();
+ InstrumentList::iterator iIt = insList.begin();
+ for (; iIt != insList.end(); iIt++)
+ {
+ Instrument *newInst = new Instrument(**iIt);
+ newInst->setDevice(this);
+ m_instruments.push_back(newInst);
+ }
+
+ // generate presentation instruments
+ generatePresentationList();
+}
+
+
+MidiDevice &
+MidiDevice::operator=(const MidiDevice &dev)
+{
+ if (&dev == this) return *this;
+
+ m_id = dev.getId();
+ m_name = dev.getName();
+ m_type = dev.getType();
+ m_librarian = dev.getLibrarian();
+
+ m_programList = dev.getPrograms();
+ m_bankList = dev.getBanks();
+ m_controlList = dev.getControlParameters();
+ m_direction = dev.getDirection();
+ m_variationType = dev.getVariationType();
+
+ // clear down instruments list
+ m_instruments.clear();
+ m_presentationInstrumentList.clear();
+
+ // Create and assign a metronome if required
+ //
+ if (dev.getMetronome())
+ {
+ if (m_metronome) delete m_metronome;
+ m_metronome = new MidiMetronome(*dev.getMetronome());
+ }
+ else
+ {
+ delete m_metronome;
+ m_metronome = 0;
+ }
+
+ // Copy the instruments
+ //
+ InstrumentList insList = dev.getAllInstruments();
+ InstrumentList::iterator iIt = insList.begin();
+ for (; iIt != insList.end(); iIt++)
+ {
+ Instrument *newInst = new Instrument(**iIt);
+ newInst->setDevice(this);
+ m_instruments.push_back(newInst);
+ }
+
+ // generate presentation instruments
+ generatePresentationList();
+
+ return (*this);
+}
+
+MidiDevice::~MidiDevice()
+{
+ delete m_metronome;
+ //!!! delete key mappings
+}
+
+void
+MidiDevice::generatePresentationList()
+{
+ // Fill the presentation list for the instruments
+ //
+ m_presentationInstrumentList.clear();
+
+ InstrumentList::iterator it;
+ for (it = m_instruments.begin(); it != m_instruments.end(); it++)
+ {
+ if ((*it)->getId() >= MidiInstrumentBase) {
+ m_presentationInstrumentList.push_back(*it);
+ }
+ }
+}
+
+void
+MidiDevice::generateDefaultControllers()
+{
+ m_controlList.clear();
+
+ static std::string controls[][9] = {
+ { "Pan", Rosegarden::Controller::EventType, "<none>", "0", "127", "64", "10", "2", "0" },
+ { "Chorus", Rosegarden::Controller::EventType, "<none>", "0", "127", "0", "93", "3", "1" },
+ { "Volume", Rosegarden::Controller::EventType, "<none>", "0", "127", "0", "7", "1", "2" },
+ { "Reverb", Rosegarden::Controller::EventType, "<none>", "0", "127", "0", "91", "3", "3" },
+ { "Sustain", Rosegarden::Controller::EventType, "<none>", "0", "127", "0", "64", "4", "-1" },
+ { "Expression", Rosegarden::Controller::EventType, "<none>", "0", "127", "100", "11", "2", "-1" },
+ { "Modulation", Rosegarden::Controller::EventType, "<none>", "0", "127", "0", "1", "4", "-1" },
+ { "PitchBend", Rosegarden::PitchBend::EventType, "<none>", "0", "16383", "8192", "1", "4", "-1" }
+ };
+
+ for (unsigned int i = 0; i < sizeof(controls) / sizeof(controls[0]); ++i) {
+
+ Rosegarden::ControlParameter con(controls[i][0],
+ controls[i][1],
+ controls[i][2],
+ atoi(controls[i][3].c_str()),
+ atoi(controls[i][4].c_str()),
+ atoi(controls[i][5].c_str()),
+ Rosegarden::MidiByte(atoi(controls[i][6].c_str())),
+ atoi(controls[i][7].c_str()),
+ atoi(controls[i][8].c_str()));
+ addControlParameter(con);
+ }
+
+
+}
+
+void
+MidiDevice::clearBankList()
+{
+ m_bankList.clear();
+}
+
+void
+MidiDevice::clearProgramList()
+{
+ m_programList.clear();
+}
+
+void
+MidiDevice::clearControlList()
+{
+ m_controlList.clear();
+}
+
+void
+MidiDevice::addProgram(const MidiProgram &prog)
+{
+ // Refuse duplicates
+ for (ProgramList::const_iterator it = m_programList.begin();
+ it != m_programList.end(); ++it) {
+ if (*it == prog) return;
+ }
+
+ m_programList.push_back(prog);
+}
+
+void
+MidiDevice::addBank(const MidiBank &bank)
+{
+ m_bankList.push_back(bank);
+}
+
+void
+MidiDevice::removeMetronome()
+{
+ delete m_metronome;
+ m_metronome = 0;
+}
+
+void
+MidiDevice::setMetronome(const MidiMetronome &metronome)
+{
+ delete m_metronome;
+ m_metronome = new MidiMetronome(metronome);
+}
+
+BankList
+MidiDevice::getBanks(bool percussion) const
+{
+ BankList banks;
+
+ for (BankList::const_iterator it = m_bankList.begin();
+ it != m_bankList.end(); ++it) {
+ if (it->isPercussion() == percussion) banks.push_back(*it);
+ }
+
+ return banks;
+}
+
+BankList
+MidiDevice::getBanksByMSB(bool percussion, MidiByte msb) const
+{
+ BankList banks;
+
+ for (BankList::const_iterator it = m_bankList.begin();
+ it != m_bankList.end(); ++it) {
+ if (it->isPercussion() == percussion && it->getMSB() == msb)
+ banks.push_back(*it);
+ }
+
+ return banks;
+}
+
+BankList
+MidiDevice::getBanksByLSB(bool percussion, MidiByte lsb) const
+{
+ BankList banks;
+
+ for (BankList::const_iterator it = m_bankList.begin();
+ it != m_bankList.end(); ++it) {
+ if (it->isPercussion() == percussion && it->getLSB() == lsb)
+ banks.push_back(*it);
+ }
+
+ return banks;
+}
+
+MidiByteList
+MidiDevice::getDistinctMSBs(bool percussion, int lsb) const
+{
+ std::set<MidiByte> msbs;
+
+ for (BankList::const_iterator it = m_bankList.begin();
+ it != m_bankList.end(); ++it) {
+ if (it->isPercussion() == percussion &&
+ (lsb == -1 || it->getLSB() == lsb)) msbs.insert(it->getMSB());
+ }
+
+ MidiByteList v;
+ for (std::set<MidiByte>::iterator i = msbs.begin(); i != msbs.end(); ++i) {
+ v.push_back(*i);
+ }
+
+ return v;
+}
+
+MidiByteList
+MidiDevice::getDistinctLSBs(bool percussion, int msb) const
+{
+ std::set<MidiByte> lsbs;
+
+ for (BankList::const_iterator it = m_bankList.begin();
+ it != m_bankList.end(); ++it) {
+ if (it->isPercussion() == percussion &&
+ (msb == -1 || it->getMSB() == msb)) lsbs.insert(it->getLSB());
+ }
+
+ MidiByteList v;
+ for (std::set<MidiByte>::iterator i = lsbs.begin(); i != lsbs.end(); ++i) {
+ v.push_back(*i);
+ }
+
+ return v;
+}
+
+ProgramList
+MidiDevice::getPrograms(const MidiBank &bank) const
+{
+ ProgramList programs;
+
+ for (ProgramList::const_iterator it = m_programList.begin();
+ it != m_programList.end(); ++it) {
+ if (it->getBank() == bank) programs.push_back(*it);
+ }
+
+ return programs;
+}
+
+std::string
+MidiDevice::getBankName(const MidiBank &bank) const
+{
+ for (BankList::const_iterator it = m_bankList.begin();
+ it != m_bankList.end(); ++it) {
+ if (*it == bank) return it->getName();
+ }
+ return "";
+}
+
+void
+MidiDevice::addKeyMapping(const MidiKeyMapping &mapping)
+{
+ //!!! handle dup names
+ m_keyMappingList.push_back(mapping);
+}
+
+const MidiKeyMapping *
+MidiDevice::getKeyMappingByName(const std::string &name) const
+{
+ for (KeyMappingList::const_iterator i = m_keyMappingList.begin();
+ i != m_keyMappingList.end(); ++i) {
+ if (i->getName() == name) return &(*i);
+ }
+ return 0;
+}
+
+const MidiKeyMapping *
+MidiDevice::getKeyMappingForProgram(const MidiProgram &program) const
+{
+ ProgramList::const_iterator it;
+
+ for (it = m_programList.begin(); it != m_programList.end(); it++) {
+ if (*it == program) {
+ std::string kmn = it->getKeyMapping();
+ if (kmn == "") return 0;
+ return getKeyMappingByName(kmn);
+ }
+ }
+
+ return 0;
+}
+
+void
+MidiDevice::setKeyMappingForProgram(const MidiProgram &program,
+ std::string mapping)
+{
+ ProgramList::iterator it;
+
+ for (it = m_programList.begin(); it != m_programList.end(); it++) {
+ if (*it == program) {
+ it->setKeyMapping(mapping);
+ }
+ }
+}
+
+
+std::string
+MidiDevice::toXmlString()
+{
+ std::stringstream midiDevice;
+
+ midiDevice << " <device id=\"" << m_id
+ << "\" name=\"" << m_name
+ << "\" direction=\"" << (m_direction == Play ?
+ "play" : "record")
+ << "\" variation=\"" << (m_variationType == VariationFromLSB ?
+ "LSB" :
+ m_variationType == VariationFromMSB ?
+ "MSB" : "")
+ << "\" connection=\"" << encode(m_connection)
+ << "\" type=\"midi\">" << std::endl << std::endl;
+
+ midiDevice << " <librarian name=\"" << encode(m_librarian.first)
+ << "\" email=\"" << encode(m_librarian.second)
+ << "\"/>" << std::endl;
+
+ if (m_metronome)
+ {
+ // Write out the metronome - watch the MidiBytes
+ // when using the stringstream
+ //
+ midiDevice << " <metronome "
+ << "instrument=\"" << m_metronome->getInstrument() << "\" "
+ << "barpitch=\"" << (int)m_metronome->getBarPitch() << "\" "
+ << "beatpitch=\"" << (int)m_metronome->getBeatPitch() << "\" "
+ << "subbeatpitch=\"" << (int)m_metronome->getSubBeatPitch() << "\" "
+ << "depth=\"" << (int)m_metronome->getDepth() << "\" "
+ << "barvelocity=\"" << (int)m_metronome->getBarVelocity() << "\" "
+ << "beatvelocity=\"" << (int)m_metronome->getBeatVelocity() << "\" "
+ << "subbeatvelocity=\"" << (int)m_metronome->getSubBeatVelocity()
+ << "\"/>"
+ << std::endl << std::endl;
+ }
+
+ // and now bank information
+ //
+ BankList::iterator it;
+ InstrumentList::iterator iit;
+ ProgramList::iterator pt;
+
+ for (it = m_bankList.begin(); it != m_bankList.end(); it++)
+ {
+ midiDevice << " <bank "
+ << "name=\"" << encode(it->getName()) << "\" "
+ << "percussion=\"" << (it->isPercussion() ? "true" : "false") << "\" "
+ << "msb=\"" << (int)it->getMSB() << "\" "
+ << "lsb=\"" << (int)it->getLSB() << "\">"
+ << std::endl;
+
+ // Not terribly efficient
+ //
+ for (pt = m_programList.begin(); pt != m_programList.end(); pt++)
+ {
+ if (pt->getBank() == *it)
+ {
+ midiDevice << " <program "
+ << "id=\"" << (int)pt->getProgram() << "\" "
+ << "name=\"" << encode(pt->getName()) << "\" ";
+ if (!pt->getKeyMapping().empty()) {
+ midiDevice << "keymapping=\""
+ << encode(pt->getKeyMapping()) << "\" ";
+ }
+ midiDevice << "/>" << std::endl;
+ }
+ }
+
+ midiDevice << " </bank>" << std::endl << std::endl;
+ }
+
+ // Now controllers (before Instruments, which can depend on
+ // Controller colours)
+ //
+ midiDevice << " <controls>" << std::endl;
+ ControlList::iterator cIt;
+ for (cIt = m_controlList.begin(); cIt != m_controlList.end() ; ++cIt)
+ midiDevice << cIt->toXmlString();
+ midiDevice << " </controls>" << std::endl << std::endl;
+
+ // Add instruments
+ //
+ for (iit = m_instruments.begin(); iit != m_instruments.end(); iit++)
+ midiDevice << (*iit)->toXmlString();
+
+ KeyMappingList::iterator kit;
+
+ for (kit = m_keyMappingList.begin(); kit != m_keyMappingList.end(); kit++)
+ {
+ midiDevice << " <keymapping "
+ << "name=\"" << encode(kit->getName()) << "\">\n";
+
+ for (MidiKeyMapping::KeyNameMap::const_iterator nmi =
+ kit->getMap().begin(); nmi != kit->getMap().end(); ++nmi) {
+ midiDevice << " <key number=\"" << (int)nmi->first
+ << "\" name=\"" << encode(nmi->second) << "\"/>\n";
+ }
+
+ midiDevice << " </keymapping>\n";
+ }
+
+#if (__GNUC__ < 3)
+ midiDevice << " </device>" << std::endl << std::ends;
+#else
+ midiDevice << " </device>" << std::endl;
+#endif
+
+ return midiDevice.str();
+}
+
+// Only copy across non System instruments
+//
+InstrumentList
+MidiDevice::getAllInstruments() const
+{
+ return m_instruments;
+}
+
+// Omitting special system Instruments
+//
+InstrumentList
+MidiDevice::getPresentationInstruments() const
+{
+ return m_presentationInstrumentList;
+}
+
+void
+MidiDevice::addInstrument(Instrument *instrument)
+{
+ m_instruments.push_back(instrument);
+ generatePresentationList();
+}
+
+std::string
+MidiDevice::getProgramName(const MidiProgram &program) const
+{
+ ProgramList::const_iterator it;
+
+ for (it = m_programList.begin(); it != m_programList.end(); it++)
+ {
+ if (*it == program) return it->getName();
+ }
+
+ return std::string("");
+}
+
+void
+MidiDevice::replaceBankList(const BankList &bankList)
+{
+ m_bankList = bankList;
+}
+
+void
+MidiDevice::replaceProgramList(const ProgramList &programList)
+{
+ m_programList = programList;
+}
+
+void
+MidiDevice::replaceKeyMappingList(const KeyMappingList &keyMappingList)
+{
+ m_keyMappingList = keyMappingList;
+}
+
+
+// Merge the new bank list in without duplication
+//
+void
+MidiDevice::mergeBankList(const BankList &bankList)
+{
+ BankList::const_iterator it;
+ BankList::iterator oIt;
+ bool clash = false;
+
+ for (it = bankList.begin(); it != bankList.end(); it++)
+ {
+ for (oIt = m_bankList.begin(); oIt != m_bankList.end(); oIt++)
+ {
+ if (*it == *oIt)
+ {
+ clash = true;
+ break;
+ }
+ }
+
+ if (clash == false)
+ addBank(*it);
+ else
+ clash = false;
+ }
+
+}
+
+void
+MidiDevice::mergeProgramList(const ProgramList &programList)
+{
+ ProgramList::const_iterator it;
+ ProgramList::iterator oIt;
+ bool clash = false;
+
+ for (it = programList.begin(); it != programList.end(); it++)
+ {
+ for (oIt = m_programList.begin(); oIt != m_programList.end(); oIt++)
+ {
+ if (*it == *oIt)
+ {
+ clash = true;
+ break;
+ }
+ }
+
+ if (clash == false)
+ addProgram(*it);
+ else
+ clash = false;
+ }
+}
+
+void
+MidiDevice::mergeKeyMappingList(const KeyMappingList &keyMappingList)
+{
+ KeyMappingList::const_iterator it;
+ KeyMappingList::iterator oIt;
+ bool clash = false;
+
+ for (it = keyMappingList.begin(); it != keyMappingList.end(); it++)
+ {
+ for (oIt = m_keyMappingList.begin(); oIt != m_keyMappingList.end(); oIt++)
+ {
+ if (it->getName() == oIt->getName())
+ {
+ clash = true;
+ break;
+ }
+ }
+
+ if (clash == false)
+ addKeyMapping(*it);
+ else
+ clash = false;
+ }
+}
+
+void
+MidiDevice::addControlParameter(const ControlParameter &con)
+{
+ m_controlList.push_back(con);
+}
+
+void
+MidiDevice::addControlParameter(const ControlParameter &con, int index)
+{
+ ControlList controls;
+
+ // if we're out of range just add the control
+ if (index >= (int)m_controlList.size())
+ {
+ m_controlList.push_back(con);
+ return;
+ }
+
+ // add new controller in at a position
+ for (int i = 0; i < (int)m_controlList.size(); ++i)
+ {
+ if (index == i) controls.push_back(con);
+ controls.push_back(m_controlList[i]);
+ }
+
+ m_controlList = controls;
+}
+
+
+bool
+MidiDevice::removeControlParameter(int index)
+{
+ ControlList::iterator it = m_controlList.begin();
+ int i = 0;
+
+ for (; it != m_controlList.end(); ++it)
+ {
+ if (index == i)
+ {
+ m_controlList.erase(it);
+ return true;
+ }
+ i++;
+ }
+
+ return false;
+}
+
+bool
+MidiDevice::modifyControlParameter(const ControlParameter &con, int index)
+{
+ if (index < 0 || index > (int)m_controlList.size()) return false;
+ m_controlList[index] = con;
+ return true;
+}
+
+void
+MidiDevice::replaceControlParameters(const ControlList &con)
+{
+ m_controlList = con;
+}
+
+
+// Check to see if passed ControlParameter is unique. Either the
+// type must be unique or in the case of Controller::EventType the
+// ControllerValue must be unique.
+//
+// Controllers (Control type)
+//
+//
+bool
+MidiDevice::isUniqueControlParameter(const ControlParameter &con) const
+{
+ ControlList::const_iterator it = m_controlList.begin();
+
+ for (; it != m_controlList.end(); ++it)
+ {
+ if (it->getType() == con.getType())
+ {
+ if (it->getType() == Rosegarden::Controller::EventType &&
+ it->getControllerValue() != con.getControllerValue())
+ continue;
+
+ return false;
+ }
+
+ }
+
+ return true;
+}
+
+// Cheat a bit here and remove the VOLUME controller here - just
+// so that the MIDIMixer is made a bit easier.
+//
+ControlList
+MidiDevice::getIPBControlParameters() const
+{
+ ControlList retList;
+
+ Rosegarden::MidiByte MIDI_CONTROLLER_VOLUME = 0x07;
+
+ for (ControlList::const_iterator it = m_controlList.begin();
+ it != m_controlList.end(); ++it)
+ {
+ if (it->getIPBPosition() != -1 &&
+ it->getControllerValue() != MIDI_CONTROLLER_VOLUME)
+ retList.push_back(*it);
+ }
+
+ return retList;
+}
+
+
+
+
+ControlParameter *
+MidiDevice::getControlParameter(int index)
+{
+ if (index >= 0 && ((unsigned int)index) < m_controlList.size())
+ return &m_controlList[index];
+
+ return 0;
+}
+
+const ControlParameter *
+MidiDevice::getControlParameter(int index) const
+{
+ return ((MidiDevice *)this)->getControlParameter(index);
+}
+
+ControlParameter *
+MidiDevice::getControlParameter(const std::string &type, Rosegarden::MidiByte controllerValue)
+{
+ ControlList::iterator it = m_controlList.begin();
+
+ for (; it != m_controlList.end(); ++it)
+ {
+ if (it->getType() == type)
+ {
+ // Return matched on type for most events
+ //
+ if (type != Rosegarden::Controller::EventType)
+ return &*it;
+
+ // Also match controller value for Controller events
+ //
+ if (it->getControllerValue() == controllerValue)
+ return &*it;
+ }
+ }
+
+ return 0;
+}
+
+const ControlParameter *
+MidiDevice::getControlParameter(const std::string &type, Rosegarden::MidiByte controllerValue) const
+{
+ return ((MidiDevice *)this)->getControlParameter(type, controllerValue);
+}
+
+}
+
+
diff --git a/src/base/MidiDevice.h b/src/base/MidiDevice.h
new file mode 100644
index 0000000..0a3c17f
--- /dev/null
+++ b/src/base/MidiDevice.h
@@ -0,0 +1,213 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _MIDIDEVICE_H_
+#define _MIDIDEVICE_H_
+
+#include <string>
+#include <vector>
+
+#include "Device.h"
+#include "Instrument.h"
+#include "MidiProgram.h"
+#include "ControlParameter.h"
+#include "Controllable.h"
+
+namespace Rosegarden
+{
+
+typedef std::vector<std::string> StringList;
+typedef std::vector<MidiByte> MidiByteList;
+
+class MidiDevice : public Device, public Controllable
+{
+public:
+ typedef enum
+ {
+ Play = 0,
+ Record = 1
+ } DeviceDirection;
+
+ typedef enum
+ {
+ NoVariations,
+ VariationFromLSB,
+ VariationFromMSB
+ } VariationType;
+
+ MidiDevice();
+ MidiDevice(const MidiDevice &);
+ MidiDevice(DeviceId id,
+ const MidiDevice &);
+ MidiDevice(DeviceId id,
+ const std::string &name,
+ DeviceDirection dir);
+ MidiDevice(DeviceId id,
+ const std::string &name,
+ const std::string &label,
+ DeviceDirection dir);
+ virtual ~MidiDevice();
+
+ // Assignment
+ MidiDevice &operator=(const MidiDevice &);
+
+ // Instrument must be on heap; I take ownership of it
+ virtual void addInstrument(Instrument*);
+
+ void removeMetronome();
+ void setMetronome(const MidiMetronome &);
+ const MidiMetronome* getMetronome() const { return m_metronome; }
+
+ void addProgram(const MidiProgram &program);
+ void addBank(const MidiBank &bank);
+ void addKeyMapping(const MidiKeyMapping &mapping); // I own the result!
+
+ void clearBankList();
+ void clearProgramList();
+ void clearControlList();
+
+ const BankList &getBanks() const { return m_bankList; }
+ BankList getBanks(bool percussion) const;
+ BankList getBanksByMSB(bool percussion, MidiByte msb) const;
+ BankList getBanksByLSB(bool percussion, MidiByte lsb) const;
+
+ MidiByteList getDistinctMSBs(bool percussion, int lsb = -1) const;
+ MidiByteList getDistinctLSBs(bool percussion, int msb = -1) const;
+
+ const ProgramList &getPrograms() const { return m_programList; }
+ ProgramList getPrograms(const MidiBank &bank) const;
+
+ const KeyMappingList &getKeyMappings() const { return m_keyMappingList; }
+ const MidiKeyMapping *getKeyMappingByName(const std::string &) const;
+ const MidiKeyMapping *getKeyMappingForProgram(const MidiProgram &program) const;
+ void setKeyMappingForProgram(const MidiProgram &program, std::string mapping);
+
+ std::string getBankName(const MidiBank &bank) const;
+ std::string getProgramName(const MidiProgram &program) const;
+
+ void replaceBankList(const BankList &bank);
+ void replaceProgramList(const ProgramList &program);
+ void replaceKeyMappingList(const KeyMappingList &mappings);
+
+ void mergeBankList(const BankList &bank);
+ void mergeProgramList(const ProgramList &program);
+ void mergeKeyMappingList(const KeyMappingList &mappings);
+
+ virtual InstrumentList getAllInstruments() const;
+ virtual InstrumentList getPresentationInstruments() const;
+
+ // Retrieve Librarian details
+ //
+ const std::string getLibrarianName() const { return m_librarian.first; }
+ const std::string getLibrarianEmail() const { return m_librarian.second; }
+ std::pair<std::string, std::string> getLibrarian() const
+ { return m_librarian; }
+
+ // Set Librarian details
+ //
+ void setLibrarian(const std::string &name, const std::string &email)
+ { m_librarian = std::pair<std::string, std::string>(name, email); }
+
+ DeviceDirection getDirection() const { return m_direction; }
+ void setDirection(DeviceDirection dir) { m_direction = dir; }
+
+ VariationType getVariationType() const { return m_variationType; }
+ void setVariationType(VariationType v) { m_variationType = v; }
+
+ // Controllers - for mapping Controller names to values for use in
+ // the InstrumentParameterBoxes (IPBs) and Control rulers.
+ //
+ ControlList::const_iterator beginControllers() const
+ { return m_controlList.begin(); }
+ ControlList::const_iterator endControllers() const
+ { return m_controlList.end(); }
+
+ // implemented from Controllable interface
+ //
+ virtual const ControlList &getControlParameters() const { return m_controlList; }
+
+ // Only those on the IPB list
+ //
+ ControlList getIPBControlParameters() const;
+
+ // Access ControlParameters (read/write)
+ //
+ virtual ControlParameter *getControlParameter(int index);
+ virtual const ControlParameter *getControlParameter(int index) const;
+ virtual ControlParameter *getControlParameter(const std::string &type, MidiByte controllerNumber);
+ virtual const ControlParameter *getControlParameter(const std::string &type, MidiByte controllerNumber) const;
+
+ // Modify ControlParameters
+ //
+ void addControlParameter(const ControlParameter &con);
+ void addControlParameter(const ControlParameter &con, int index);
+ bool removeControlParameter(int index);
+ bool modifyControlParameter(const ControlParameter &con, int index);
+
+ void replaceControlParameters(const ControlList &);
+
+ // Check to see if the passed ControlParameter is unique in
+ // our ControlParameter list.
+ //
+ bool isUniqueControlParameter(const ControlParameter &con) const;
+
+ // Generate some default controllers for the MidiDevice
+ //
+ void generateDefaultControllers();
+
+ virtual std::string toXmlString();
+
+ // Accessors for recording property
+ bool isRecording() {return m_recording; }
+ void setRecording(bool recording) {m_recording = recording;}
+
+protected:
+ void generatePresentationList();
+
+ ProgramList m_programList;
+ BankList m_bankList;
+ ControlList m_controlList;
+ KeyMappingList m_keyMappingList;
+ MidiMetronome *m_metronome;
+
+ // used when we're presenting the instruments
+ InstrumentList m_presentationInstrumentList;
+
+ // Is this device Play or Record?
+ //
+ DeviceDirection m_direction;
+
+ // Is this device recording?
+ //
+ bool m_recording;
+
+ // Should we present LSB or MSB of bank info as a Variation number?
+ //
+ VariationType m_variationType;
+
+ // Librarian contact details
+ //
+ std::pair<std::string, std::string> m_librarian; // name. email
+};
+
+}
+
+#endif // _MIDIDEVICE_H_
diff --git a/src/base/MidiProgram.cpp b/src/base/MidiProgram.cpp
new file mode 100644
index 0000000..c026a0a
--- /dev/null
+++ b/src/base/MidiProgram.cpp
@@ -0,0 +1,224 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include "MidiProgram.h"
+
+namespace Rosegarden {
+
+MidiBank::MidiBank() :
+ m_percussion(false), m_msb(0), m_lsb(0), m_name()
+{
+ // nothing else
+}
+
+MidiBank::MidiBank(bool percussion, MidiByte msb, MidiByte lsb, std::string name) :
+ m_percussion(percussion), m_msb(msb), m_lsb(lsb), m_name(name)
+{
+ // nothing else
+}
+
+bool
+MidiBank::operator==(const MidiBank &b) const
+{
+ return m_percussion == b.m_percussion && m_msb == b.m_msb && m_lsb == b.m_lsb;
+}
+
+bool
+MidiBank::isPercussion() const
+{
+ return m_percussion;
+}
+
+MidiByte
+MidiBank::getMSB() const
+{
+ return m_msb;
+}
+
+MidiByte
+MidiBank::getLSB() const
+{
+ return m_lsb;
+}
+
+std::string
+MidiBank::getName() const
+{
+ return m_name;
+}
+
+void
+MidiBank::setName(std::string name)
+{
+ m_name = name;
+}
+
+
+MidiProgram::MidiProgram() :
+ m_bank(), m_program(0), m_name()
+{
+ // nothing else
+}
+
+MidiProgram::MidiProgram(const MidiBank &bank, MidiByte program, std::string name, std::string keyMapping) :
+ m_bank(bank), m_program(program), m_name(name), m_keyMapping(keyMapping)
+{
+ // nothing else
+}
+
+bool
+MidiProgram::operator==(const MidiProgram &p) const
+{
+ return m_bank == p.m_bank && m_program == p.m_program;
+}
+
+const MidiBank &
+MidiProgram::getBank() const
+{
+ return m_bank;
+}
+
+MidiByte
+MidiProgram::getProgram() const
+{
+ return m_program;
+}
+
+const std::string &
+MidiProgram::getName() const
+{
+ return m_name;
+}
+
+void
+MidiProgram::setName(const std::string &name)
+{
+ m_name = name;
+}
+
+const std::string &
+MidiProgram::getKeyMapping() const
+{
+ return m_keyMapping;
+}
+
+void
+MidiProgram::setKeyMapping(const std::string &keyMapping)
+{
+ m_keyMapping = keyMapping;
+}
+
+MidiKeyMapping::MidiKeyMapping() :
+ m_name("")
+{
+}
+
+MidiKeyMapping::MidiKeyMapping(const std::string &name) :
+ m_name(name)
+{
+ // nothing else
+}
+
+MidiKeyMapping::MidiKeyMapping(const std::string &name, const KeyNameMap &map) :
+ m_name(name),
+ m_map(map)
+{
+ // nothing else
+}
+
+bool
+MidiKeyMapping::operator==(const MidiKeyMapping &m) const
+{
+ return (m_map == m.m_map);
+}
+
+std::string
+MidiKeyMapping::getMapForKeyName(MidiByte pitch) const
+{
+ KeyNameMap::const_iterator i = m_map.find(pitch);
+ if (i != m_map.end()) {
+ return i->second;
+ } else {
+ return "";
+ }
+}
+
+int
+MidiKeyMapping::getOffset(MidiByte pitch) const
+{
+ int c;
+ for (KeyNameMap::const_iterator i = m_map.begin(); i != m_map.end(); ++i) {
+ if (i->first == pitch) return c;
+ ++c;
+ }
+ return -1;
+}
+
+int
+MidiKeyMapping::getPitchForOffset(int offset) const
+{
+ KeyNameMap::const_iterator i = m_map.begin();
+ while (i != m_map.end() && offset > 0) {
+ ++i; --offset;
+ }
+ if (i == m_map.end()) return -1;
+ else return i->first;
+}
+
+int
+MidiKeyMapping::getPitchExtent() const
+{
+ int minPitch = 0, maxPitch = 0;
+ KeyNameMap::const_iterator mi = m_map.begin();
+ if (mi != m_map.end()) {
+ minPitch = mi->first;
+ mi = m_map.end();
+ --mi;
+ maxPitch = mi->first;
+ return maxPitch - minPitch + 1;
+ }
+ return maxPitch - minPitch;
+}
+
+
+
+MidiMetronome::MidiMetronome(InstrumentId instrument,
+ MidiByte barPitch,
+ MidiByte beatPitch,
+ MidiByte subBeatPitch,
+ int depth,
+ MidiByte barVely,
+ MidiByte beatVely,
+ MidiByte subBeatVely):
+ m_instrument(instrument),
+ m_barPitch(barPitch),
+ m_beatPitch(beatPitch),
+ m_subBeatPitch(subBeatPitch),
+ m_depth(depth),
+ m_barVelocity(barVely),
+ m_beatVelocity(beatVely),
+ m_subBeatVelocity(subBeatVely)
+{
+ // nothing else
+}
+
+}
+
diff --git a/src/base/MidiProgram.h b/src/base/MidiProgram.h
new file mode 100644
index 0000000..e44f631
--- /dev/null
+++ b/src/base/MidiProgram.h
@@ -0,0 +1,180 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _MIDIBANK_H_
+#define _MIDIBANK_H_
+
+#include <string>
+#include <vector>
+#include <map>
+
+namespace Rosegarden
+{
+typedef unsigned char MidiByte;
+typedef unsigned int InstrumentId;
+
+class MidiBank
+{
+public:
+ MidiBank();
+ MidiBank(bool percussion, MidiByte msb, MidiByte lsb, std::string name = "");
+
+ // comparator disregards name
+ bool operator==(const MidiBank &b) const;
+
+ bool isPercussion() const;
+ MidiByte getMSB() const;
+ MidiByte getLSB() const;
+ std::string getName() const;
+
+ void setName(std::string name);
+
+private:
+ bool m_percussion;
+ MidiByte m_msb;
+ MidiByte m_lsb;
+ std::string m_name;
+};
+
+typedef std::vector<MidiBank> BankList;
+
+class MidiProgram
+{
+public:
+ MidiProgram();
+ MidiProgram(const MidiBank &bank, MidiByte program, std::string name = "",
+ std::string keyMapping = "");
+
+ // comparator disregards name
+ bool operator==(const MidiProgram &p) const;
+
+ const MidiBank& getBank() const;
+ MidiByte getProgram() const;
+ const std::string &getName() const;
+ const std::string &getKeyMapping() const;
+
+ void setName(const std::string &name);
+ void setKeyMapping(const std::string &name);
+
+private:
+ MidiBank m_bank;
+ MidiByte m_program;
+ std::string m_name;
+ std::string m_keyMapping;
+};
+
+typedef std::vector<MidiProgram> ProgramList;
+
+class MidiKeyMapping
+{
+public:
+ typedef std::map<MidiByte, std::string> KeyNameMap;
+
+ MidiKeyMapping();
+ MidiKeyMapping(const std::string &name);
+ MidiKeyMapping(const std::string &name, const KeyNameMap &map);
+
+ bool operator==(const MidiKeyMapping &m) const;
+
+ const std::string &getName() const { return m_name; }
+ void setName(const std::string &name) { m_name = name; }
+
+ const KeyNameMap &getMap() const { return m_map; }
+ KeyNameMap &getMap() { return m_map; }
+ std::string getMapForKeyName(MidiByte pitch) const;
+ void setMap(const KeyNameMap &map) { m_map = map; }
+
+ // Return 0 if the supplied argument is the lowest pitch in the
+ // mapping, 1 if it is the second-lowest, etc. Return -1 if it
+ // is not in the mapping at all. Not instant.
+ int getOffset(MidiByte pitch) const;
+
+ // Return the offset'th pitch in the mapping. Return -1 if there
+ // are fewer than offset pitches in the mapping (or offset < 0).
+ // Not instant.
+ int getPitchForOffset(int offset) const;
+
+ // Return the difference between the top and bottom pitches
+ // contained in the map.
+ //
+ int getPitchExtent() const;
+
+private:
+ std::string m_name;
+ KeyNameMap m_map;
+};
+
+typedef std::vector<MidiKeyMapping> KeyMappingList;
+
+// A mapped MIDI instrument - a drum track click for example
+//
+class MidiMetronome
+{
+public:
+ MidiMetronome(InstrumentId instrument,
+ MidiByte barPitch = 37,
+ MidiByte beatPitch = 37,
+ MidiByte subBeatPitch = 37,
+ int depth = 2,
+ MidiByte barVely = 120,
+ MidiByte beatVely = 100,
+ MidiByte subBeatVely = 80);
+
+ InstrumentId getInstrument() const { return m_instrument; }
+ MidiByte getBarPitch() const { return m_barPitch; }
+ MidiByte getBeatPitch() const { return m_beatPitch; }
+ MidiByte getSubBeatPitch() const { return m_subBeatPitch; }
+ int getDepth() const { return m_depth; }
+ MidiByte getBarVelocity() const { return m_barVelocity; }
+ MidiByte getBeatVelocity() const { return m_beatVelocity; }
+ MidiByte getSubBeatVelocity() const { return m_subBeatVelocity; }
+
+ void setInstrument(InstrumentId id) { m_instrument = id; }
+ void setBarPitch(MidiByte pitch) { m_barPitch = pitch; }
+ void setBeatPitch(MidiByte pitch) { m_beatPitch = pitch; }
+ void setSubBeatPitch(MidiByte pitch) { m_subBeatPitch = pitch; }
+ void setDepth(int depth) { m_depth = depth; }
+ void setBarVelocity(MidiByte barVely) { m_barVelocity = barVely; }
+ void setBeatVelocity(MidiByte beatVely) { m_beatVelocity = beatVely; }
+ void setSubBeatVelocity(MidiByte subBeatVely) { m_subBeatVelocity = subBeatVely; }
+
+private:
+ InstrumentId m_instrument;
+ MidiByte m_barPitch;
+ MidiByte m_beatPitch;
+ MidiByte m_subBeatPitch;
+ int m_depth;
+ MidiByte m_barVelocity;
+ MidiByte m_beatVelocity;
+ MidiByte m_subBeatVelocity;
+};
+
+
+// MidiFilter is a bitmask of MappedEvent::MappedEventType.
+// Look in sound/MappedEvent.h
+//
+typedef unsigned int MidiFilter;
+
+
+}
+
+#endif
+
diff --git a/src/base/MidiTypes.cpp b/src/base/MidiTypes.cpp
new file mode 100644
index 0000000..4118502
--- /dev/null
+++ b/src/base/MidiTypes.cpp
@@ -0,0 +1,320 @@
+// -*- c-basic-offset: 4 -*-
+
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include "MidiTypes.h"
+
+namespace Rosegarden
+{
+
+static MidiByte getByte(const Event &e, const PropertyName &name) {
+ long value = -1;
+ try {
+ value = e.get<Int>(name);
+ } catch (...) { }
+ if (value < 0 || value > 255) throw MIDIValueOutOfRange(name.getName());
+ return MidiByte(value);
+}
+
+//////////////////////////////////////////////////////////////////////
+// PitchBend
+//////////////////////////////////////////////////////////////////////
+
+const std::string PitchBend::EventType = "pitchbend";
+const int PitchBend::EventSubOrdering = -5;
+
+const PropertyName PitchBend::MSB = "msb";
+const PropertyName PitchBend::LSB = "lsb";
+
+PitchBend::PitchBend(Rosegarden::MidiByte msb,
+ Rosegarden::MidiByte lsb) :
+ m_msb(msb),
+ m_lsb(lsb)
+{
+}
+
+PitchBend::PitchBend(const Event &e)
+{
+ if (e.getType() != EventType) {
+ throw Event::BadType("PitchBend model event", EventType, e.getType());
+ }
+ m_msb = getByte(e, MSB);
+ m_lsb = getByte(e, LSB);
+}
+
+PitchBend::~PitchBend()
+{
+}
+
+Event*
+PitchBend::getAsEvent(timeT absoluteTime) const
+{
+ Event *e = new Event(EventType, absoluteTime, 0, EventSubOrdering);
+ e->set<Int>(MSB, (long)m_msb);
+ e->set<Int>(LSB, (long)m_lsb);
+ return e;
+}
+
+
+//////////////////////////////////////////////////////////////////////
+// Controller
+//////////////////////////////////////////////////////////////////////
+
+const std::string Controller::EventType = "controller";
+const int Controller::EventSubOrdering = -5;
+
+const PropertyName Controller::NUMBER = "number";
+const PropertyName Controller::VALUE = "value";
+
+Controller::Controller(Rosegarden::MidiByte number,
+ Rosegarden::MidiByte value):
+ m_number(number),
+ m_value(value)
+{
+}
+
+Controller::Controller(const Event &e)
+{
+ if (e.getType() != EventType) {
+ throw Event::BadType("Controller model event", EventType, e.getType());
+ }
+ m_number = getByte(e, NUMBER);
+ m_value = getByte(e, VALUE);
+}
+
+Controller::~Controller()
+{
+}
+
+Event*
+Controller::getAsEvent(timeT absoluteTime) const
+{
+ Event *e = new Event(EventType, absoluteTime, 0, EventSubOrdering);
+ e->set<Int>(NUMBER, (long)m_number);
+ e->set<Int>(VALUE, (long)m_value);
+ return e;
+}
+
+
+//////////////////////////////////////////////////////////////////////
+// Key Pressure
+//////////////////////////////////////////////////////////////////////
+
+const std::string KeyPressure::EventType = "keypressure";
+const int KeyPressure::EventSubOrdering = -5;
+
+const PropertyName KeyPressure::PITCH = "pitch";
+const PropertyName KeyPressure::PRESSURE = "pressure";
+
+KeyPressure::KeyPressure(Rosegarden::MidiByte pitch,
+ Rosegarden::MidiByte pressure):
+ m_pitch(pitch),
+ m_pressure(pressure)
+{
+}
+
+KeyPressure::KeyPressure(const Event &e)
+{
+ if (e.getType() != EventType) {
+ throw Event::BadType("KeyPressure model event", EventType, e.getType());
+ }
+ m_pitch = getByte(e, PITCH);
+ m_pressure = getByte(e, PRESSURE);
+}
+
+KeyPressure::~KeyPressure()
+{
+}
+
+Event*
+KeyPressure::getAsEvent(timeT absoluteTime) const
+{
+ Event *e = new Event(EventType, absoluteTime, 0, EventSubOrdering);
+ e->set<Int>(PITCH, (long)m_pitch);
+ e->set<Int>(PRESSURE, (long)m_pressure);
+ return e;
+}
+
+
+//////////////////////////////////////////////////////////////////////
+// Channel Pressure
+//////////////////////////////////////////////////////////////////////
+
+const std::string ChannelPressure::EventType = "channelpressure";
+const int ChannelPressure::EventSubOrdering = -5;
+
+const PropertyName ChannelPressure::PRESSURE = "pressure";
+
+ChannelPressure::ChannelPressure(Rosegarden::MidiByte pressure):
+ m_pressure(pressure)
+{
+}
+
+ChannelPressure::ChannelPressure(const Event &e)
+{
+ if (e.getType() != EventType) {
+ throw Event::BadType("ChannelPressure model event", EventType, e.getType());
+ }
+ m_pressure = getByte(e, PRESSURE);
+}
+
+ChannelPressure::~ChannelPressure()
+{
+}
+
+Event*
+ChannelPressure::getAsEvent(timeT absoluteTime) const
+{
+ Event *e = new Event(EventType, absoluteTime, 0, EventSubOrdering);
+ e->set<Int>(PRESSURE, (long)m_pressure);
+ return e;
+}
+
+
+//////////////////////////////////////////////////////////////////////
+// ProgramChange
+//////////////////////////////////////////////////////////////////////
+
+const std::string ProgramChange::EventType = "programchange";
+const int ProgramChange::EventSubOrdering = -5;
+
+const PropertyName ProgramChange::PROGRAM = "program";
+
+ProgramChange::ProgramChange(Rosegarden::MidiByte program):
+ m_program(program)
+{
+}
+
+ProgramChange::ProgramChange(const Event &e)
+{
+ if (e.getType() != EventType) {
+ throw Event::BadType("ProgramChange model event", EventType, e.getType());
+ }
+ m_program = getByte(e, PROGRAM);
+}
+
+ProgramChange::~ProgramChange()
+{
+}
+
+Event*
+ProgramChange::getAsEvent(timeT absoluteTime) const
+{
+ Event *e = new Event(EventType, absoluteTime, 0, EventSubOrdering);
+ e->set<Int>(PROGRAM, (long)m_program);
+ return e;
+}
+
+
+//////////////////////////////////////////////////////////////////////
+// SystemExclusive
+//////////////////////////////////////////////////////////////////////
+
+const std::string SystemExclusive::EventType = "systemexclusive";
+const int SystemExclusive::EventSubOrdering = -5;
+
+const PropertyName SystemExclusive::DATABLOCK = "datablock";
+
+SystemExclusive::SystemExclusive(std::string rawData) :
+ m_rawData(rawData)
+{
+}
+
+SystemExclusive::SystemExclusive(const Event &e)
+{
+ if (e.getType() != EventType) {
+ throw Event::BadType("SystemExclusive model event", EventType, e.getType());
+ }
+ std::string datablock;
+ e.get<String>(DATABLOCK, datablock);
+ m_rawData = toRaw(datablock);
+}
+
+SystemExclusive::~SystemExclusive()
+{
+}
+
+Event*
+SystemExclusive::getAsEvent(timeT absoluteTime) const
+{
+ Event *e = new Event(EventType, absoluteTime, 0, EventSubOrdering);
+ std::string hex(toHex(m_rawData));
+ e->set<String>(DATABLOCK, hex);
+ return e;
+}
+
+std::string
+SystemExclusive::toHex(std::string r)
+{
+ static char hexchars[] = "0123456789ABCDEF";
+ std::string h;
+ for (unsigned int i = 0; i < r.size(); ++i) {
+ if (i > 0) h += ' ';
+ unsigned char b = (unsigned char)r[i];
+ h += hexchars[(b / 16) % 16];
+ h += hexchars[b % 16];
+ }
+ return h;
+}
+
+std::string
+SystemExclusive::toRaw(std::string rh)
+{
+ std::string r;
+ std::string h;
+
+ // remove whitespace
+ for (unsigned int i = 0; i < rh.size(); ++i) {
+ if (!isspace(rh[i])) h += rh[i];
+ }
+
+ for (unsigned int i = 0; i < h.size()/2; ++i) {
+ unsigned char b = toRawNibble(h[2*i]) * 16 + toRawNibble(h[2*i+1]);
+ r += b;
+ }
+
+ return r;
+}
+
+unsigned char
+SystemExclusive::toRawNibble(char c)
+{
+ if (islower(c)) c = toupper(c);
+ if (isdigit(c)) return c - '0';
+ if (c >= 'A' && c <= 'F') return c - 'A' + 10;
+ throw BadEncoding();
+}
+
+bool
+SystemExclusive::isHex(std::string rh)
+{
+ // arf
+ try {
+ std::string r = toRaw(rh);
+ } catch (BadEncoding) {
+ return false;
+ }
+ return true;
+}
+
+
+}
+
diff --git a/src/base/MidiTypes.h b/src/base/MidiTypes.h
new file mode 100644
index 0000000..10416a9
--- /dev/null
+++ b/src/base/MidiTypes.h
@@ -0,0 +1,224 @@
+// -*- c-basic-offset: 4 -*-
+
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _MIDI_TYPES_H_
+#define _MIDI_TYPES_H_
+
+#include <list>
+
+#include "Event.h"
+#include "Instrument.h"
+
+// Internal representation of some very MIDI specific event types
+// that fall clearly outside of NotationTypes and still require
+// representation.
+//
+
+
+namespace Rosegarden
+{
+
+class MIDIValueOutOfRange : public Exception {
+public:
+ MIDIValueOutOfRange(std::string name) :
+ Exception("Value of " + name + " out of byte range") { }
+ MIDIValueOutOfRange(std::string name, std::string file, int line) :
+ Exception("Value of " + name + " out of byte range", file, line) { }
+};
+
+
+// Rosegarden's internal represetation of MIDI PitchBend
+//
+class PitchBend
+{
+public:
+ static const std::string EventType;
+ static const int EventSubOrdering;
+
+ static const PropertyName MSB;
+ static const PropertyName LSB;
+
+ PitchBend(MidiByte msb, MidiByte lsb);
+ PitchBend(const Event &);
+ ~PitchBend();
+
+ MidiByte getMSB() const { return m_msb; }
+ MidiByte getLSB() const { return m_lsb; }
+
+ /// Returned event is on heap; caller takes responsibility for ownership
+ Event *getAsEvent(timeT absoluteTime) const;
+
+private:
+ MidiByte m_msb;
+ MidiByte m_lsb;
+};
+
+
+// Controller
+//
+
+class Controller
+{
+public:
+ static const std::string EventType;
+ static const int EventSubOrdering;
+
+ static const PropertyName NUMBER; // controller number
+ static const PropertyName VALUE; // and value
+
+ Controller(MidiByte number,
+ MidiByte value);
+
+ Controller(const Event &);
+ ~Controller();
+
+ MidiByte getNumber() const { return m_number; }
+ MidiByte getValue() const { return m_value; }
+
+ /// Returned event is on heap; caller takes responsibility for ownership
+ Event *getAsEvent(timeT absoluteTime) const;
+
+private:
+ MidiByte m_number;
+ MidiByte m_value;
+
+};
+
+
+// Key pressure
+//
+
+class KeyPressure
+{
+public:
+ static const std::string EventType;
+ static const int EventSubOrdering;
+
+ static const PropertyName PITCH;
+ static const PropertyName PRESSURE;
+
+ KeyPressure(MidiByte pitch, MidiByte pressure);
+ KeyPressure(const Event &event);
+ ~KeyPressure();
+
+ MidiByte getPitch() const { return m_pitch; }
+ MidiByte getPressure() const { return m_pressure; }
+
+ /// Returned event is on heap; caller takes responsibility for ownership
+ Event *getAsEvent(timeT absoluteTime) const;
+
+private:
+ MidiByte m_pitch;
+ MidiByte m_pressure;
+};
+
+
+// Channel pressure
+//
+
+class ChannelPressure
+{
+public:
+ static const std::string EventType;
+ static const int EventSubOrdering;
+
+ static const PropertyName PRESSURE;
+
+ ChannelPressure(MidiByte pressure);
+ ChannelPressure(const Event &event);
+ ~ChannelPressure();
+
+ MidiByte getPressure() const { return m_pressure; }
+
+ /// Returned event is on heap; caller takes responsibility for ownership
+ Event *getAsEvent(timeT absoluteTime) const;
+
+private:
+ MidiByte m_pressure;
+};
+
+
+// Program Change
+//
+
+class ProgramChange
+{
+public:
+ static const std::string EventType;
+ static const int EventSubOrdering;
+
+ static const PropertyName PROGRAM;
+
+ ProgramChange(MidiByte program);
+ ProgramChange(const Event &event);
+ ~ProgramChange();
+
+ MidiByte getProgram() const { return m_program; }
+
+ /// Returned event is on heap; caller takes responsibility for ownership
+ Event *getAsEvent(timeT absoluteTime) const;
+
+private:
+ MidiByte m_program;
+};
+
+
+// System exclusive
+//
+
+class SystemExclusive
+{
+public:
+ static const std::string EventType;
+ static const int EventSubOrdering;
+
+ struct BadEncoding : public Exception {
+ BadEncoding() : Exception("Bad SysEx encoding") { }
+ };
+
+ static const PropertyName DATABLOCK;
+
+ SystemExclusive(std::string rawData);
+ SystemExclusive(const Event &event);
+ ~SystemExclusive();
+
+ std::string getRawData() const { return m_rawData; }
+ std::string getHexData() const { return toHex(m_rawData); }
+
+ /// Returned event is on heap; caller takes responsibility for ownership
+ Event *getAsEvent(timeT absoluteTime) const;
+
+ static std::string toHex(std::string rawData);
+ static std::string toRaw(std::string hexData);
+ static bool isHex(std::string data);
+
+private:
+ std::string m_rawData;
+ static unsigned char toRawNibble(char);
+};
+
+
+
+}
+
+
+#endif
diff --git a/src/base/NotationQuantizer.cpp b/src/base/NotationQuantizer.cpp
new file mode 100644
index 0000000..9e76a94
--- /dev/null
+++ b/src/base/NotationQuantizer.cpp
@@ -0,0 +1,1205 @@
+// -*- c-basic-offset: 4 -*-
+
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include "NotationQuantizer.h"
+#include "BaseProperties.h"
+#include "NotationTypes.h"
+#include "Selection.h"
+#include "Composition.h"
+#include "Sets.h"
+#include "Profiler.h"
+
+#include <iostream>
+#include <cmath>
+#include <cstdio> // for sprintf
+#include <ctime>
+
+using std::cout;
+using std::cerr;
+using std::endl;
+
+//#define DEBUG_NOTATION_QUANTIZER 1
+
+namespace Rosegarden {
+
+using namespace BaseProperties;
+
+class NotationQuantizer::Impl
+{
+public:
+ Impl(NotationQuantizer *const q) :
+ m_unit(Note(Note::Demisemiquaver).getDuration()),
+ m_simplicityFactor(13),
+ m_maxTuplet(3),
+ m_articulate(true),
+ m_q(q),
+ m_provisionalBase("notationquantizer-provisionalBase"),
+ m_provisionalAbsTime("notationquantizer-provisionalAbsTime"),
+ m_provisionalDuration("notationquantizer-provisionalDuration"),
+ m_provisionalNoteType("notationquantizer-provisionalNoteType"),
+ m_provisionalScore("notationquantizer-provisionalScore")
+ { }
+
+ Impl(const Impl &i) :
+ m_unit(i.m_unit),
+ m_simplicityFactor(i.m_simplicityFactor),
+ m_maxTuplet(i.m_maxTuplet),
+ m_articulate(i.m_articulate),
+ m_q(i.m_q),
+ m_provisionalBase(i.m_provisionalBase),
+ m_provisionalAbsTime(i.m_provisionalAbsTime),
+ m_provisionalDuration(i.m_provisionalDuration),
+ m_provisionalNoteType(i.m_provisionalNoteType),
+ m_provisionalScore(i.m_provisionalScore)
+ { }
+
+ class ProvisionalQuantizer : public Quantizer {
+ // This class exists only to pick out the provisional abstime
+ // and duration values from half-quantized events, so that we
+ // can treat them using the normal Chord class
+ public:
+ ProvisionalQuantizer(Impl *i) : Quantizer("blah", "blahblah"), m_impl(i) { }
+ virtual timeT getQuantizedDuration(const Event *e) const {
+ return m_impl->getProvisional((Event *)e, DurationValue);
+ }
+ virtual timeT getQuantizedAbsoluteTime(const Event *e) const {
+ timeT t = m_impl->getProvisional((Event *)e, AbsoluteTimeValue);
+#ifdef DEBUG_NOTATION_QUANTIZER
+ cout << "ProvisionalQuantizer::getQuantizedAbsoluteTime: returning " << t << endl;
+#endif
+ return t;
+ }
+
+ private:
+ Impl *m_impl;
+ };
+
+ void quantizeRange(Segment *,
+ Segment::iterator,
+ Segment::iterator) const;
+
+ void quantizeAbsoluteTime(Segment *, Segment::iterator) const;
+ long scoreAbsoluteTimeForBase(Segment *, const Segment::iterator &,
+ int depth, timeT base, timeT sigTime,
+ timeT t, timeT d, int noteType,
+ const Segment::iterator &,
+ const Segment::iterator &,
+ bool &right) const;
+ void quantizeDurationProvisional(Segment *, Segment::iterator) const;
+ void quantizeDuration(Segment *, Chord &) const;
+
+ void scanTupletsInBar(Segment *,
+ timeT barStart, timeT barDuration,
+ timeT wholeStart, timeT wholeDuration,
+ const std::vector<int> &divisions) const;
+ void scanTupletsAt(Segment *, Segment::iterator, int depth,
+ timeT base, timeT barStart,
+ timeT tupletStart, timeT tupletBase) const;
+ bool isValidTupletAt(Segment *, const Segment::iterator &,
+ int depth, timeT base, timeT sigTime,
+ timeT tupletBase) const;
+
+ void setProvisional(Event *, ValueType value, timeT t) const;
+ timeT getProvisional(Event *, ValueType value) const;
+ void unsetProvisionalProperties(Event *) const;
+
+ timeT m_unit;
+ int m_simplicityFactor;
+ int m_maxTuplet;
+ bool m_articulate;
+ bool m_contrapuntal;
+
+private:
+ NotationQuantizer *const m_q;
+
+ PropertyName m_provisionalBase;
+ PropertyName m_provisionalAbsTime;
+ PropertyName m_provisionalDuration;
+ PropertyName m_provisionalNoteType;
+ PropertyName m_provisionalScore;
+};
+
+NotationQuantizer::NotationQuantizer() :
+ Quantizer(NotationPrefix),
+ m_impl(new Impl(this))
+{
+ // nothing else
+}
+
+NotationQuantizer::NotationQuantizer(std::string source, std::string target) :
+ Quantizer(source, target),
+ m_impl(new Impl(this))
+{
+ // nothing else
+}
+
+NotationQuantizer::NotationQuantizer(const NotationQuantizer &q) :
+ Quantizer(q.m_target),
+ m_impl(new Impl(*q.m_impl))
+{
+ // nothing else
+}
+
+NotationQuantizer::~NotationQuantizer()
+{
+ delete m_impl;
+}
+
+void
+NotationQuantizer::setUnit(timeT unit)
+{
+ m_impl->m_unit = unit;
+}
+
+timeT
+NotationQuantizer::getUnit() const
+{
+ return m_impl->m_unit;
+}
+
+void
+NotationQuantizer::setMaxTuplet(int m)
+{
+ m_impl->m_maxTuplet = m;
+}
+
+int
+NotationQuantizer::getMaxTuplet() const
+{
+ return m_impl->m_maxTuplet;
+}
+
+void
+NotationQuantizer::setSimplicityFactor(int s)
+{
+ m_impl->m_simplicityFactor = s;
+}
+
+int
+NotationQuantizer::getSimplicityFactor() const
+{
+ return m_impl->m_simplicityFactor;
+}
+
+void
+NotationQuantizer::setContrapuntal(bool c)
+{
+ m_impl->m_contrapuntal = c;
+}
+
+bool
+NotationQuantizer::getContrapuntal() const
+{
+ return m_impl->m_contrapuntal;
+}
+
+void
+NotationQuantizer::setArticulate(bool a)
+{
+ m_impl->m_articulate = a;
+}
+
+bool
+NotationQuantizer::getArticulate() const
+{
+ return m_impl->m_articulate;
+}
+
+void
+NotationQuantizer::Impl::setProvisional(Event *e, ValueType v, timeT t) const
+{
+ if (v == AbsoluteTimeValue) {
+ e->setMaybe<Int>(m_provisionalAbsTime, t);
+ } else {
+ e->setMaybe<Int>(m_provisionalDuration, t);
+ }
+}
+
+timeT
+NotationQuantizer::Impl::getProvisional(Event *e, ValueType v) const
+{
+ timeT t;
+ if (v == AbsoluteTimeValue) {
+ t = e->getAbsoluteTime();
+ e->get<Int>(m_provisionalAbsTime, t);
+ } else {
+ t = e->getDuration();
+ e->get<Int>(m_provisionalDuration, t);
+ }
+ return t;
+}
+
+void
+NotationQuantizer::Impl::unsetProvisionalProperties(Event *e) const
+{
+ e->unset(m_provisionalBase);
+ e->unset(m_provisionalAbsTime);
+ e->unset(m_provisionalDuration);
+ e->unset(m_provisionalNoteType);
+ e->unset(m_provisionalScore);
+}
+
+void
+NotationQuantizer::Impl::quantizeAbsoluteTime(Segment *s, Segment::iterator i) const
+{
+ Profiler profiler("NotationQuantizer::Impl::quantizeAbsoluteTime");
+
+ Composition *comp = s->getComposition();
+
+ TimeSignature timeSig;
+ timeT t = m_q->getFromSource(*i, AbsoluteTimeValue);
+ timeT sigTime = comp->getTimeSignatureAt(t, timeSig);
+
+ timeT d = getProvisional(*i, DurationValue);
+ int noteType = Note::getNearestNote(d).getNoteType();
+ (*i)->setMaybe<Int>(m_provisionalNoteType, noteType);
+
+ int maxDepth = 8 - noteType;
+ if (maxDepth < 4) maxDepth = 4;
+ std::vector<int> divisions;
+ timeSig.getDivisions(maxDepth, divisions);
+ if (timeSig == TimeSignature()) // special case for 4/4
+ divisions[0] = 2;
+
+ // At each depth of beat subdivision, we find the closest match
+ // and assign it a score according to distance and depth. The
+ // calculation for the score should accord "better" scores to
+ // shorter distance and lower depth, but it should avoid giving
+ // a "perfect" score to any combination of distance and depth
+ // except where both are 0. Also, the effective depth is
+ // 2 more than the value of our depth counter, which counts
+ // from 0 at a point where the effective depth is already 1.
+
+ timeT base = timeSig.getBarDuration();
+
+ timeT bestBase = -2;
+ long bestScore = 0;
+ bool bestRight = false;
+
+#ifdef DEBUG_NOTATION_QUANTIZER
+ cout << "quantizeAbsoluteTime: t is " << t << ", d is " << d << endl;
+#endif
+
+ // scoreAbsoluteTimeForBase wants to know the previous starting
+ // note (N) and the previous starting note that ends (roughly)
+ // before this one starts (N'). Much more efficient to calculate
+ // them once now before the loop.
+
+ static timeT shortTime = Note(Note::Shortest).getDuration();
+
+ Segment::iterator j(i);
+ Segment::iterator n(s->end()), nprime(s->end());
+ for (;;) {
+ if (j == s->begin()) break;
+ --j;
+ if ((*j)->isa(Note::EventType)) {
+ if (n == s->end()) n = j;
+ if ((*j)->getAbsoluteTime() + (*j)->getDuration() + shortTime/2
+ <= (*i)->getAbsoluteTime()) {
+ nprime = j;
+ break;
+ }
+ }
+ }
+
+#ifdef DEBUG_NOTATION_QUANTIZER
+ if (n != s->end() && n != nprime) {
+ cout << "found n (distinct from nprime) at " << (*n)->getAbsoluteTime() << endl;
+ }
+ if (nprime != s->end()) {
+ cout << "found nprime at " << (*nprime)->getAbsoluteTime()
+ << ", duration " << (*nprime)->getDuration() << endl;
+ }
+#endif
+
+ for (int depth = 0; depth < maxDepth; ++depth) {
+
+ base /= divisions[depth];
+ if (base < m_unit) break;
+ bool right = false;
+ long score = scoreAbsoluteTimeForBase(s, i, depth, base, sigTime,
+ t, d, noteType, n, nprime, right);
+
+ if (depth == 0 || score < bestScore) {
+#ifdef DEBUG_NOTATION_QUANTIZER
+ cout << " [*]";
+#endif
+ bestBase = base;
+ bestScore = score;
+ bestRight = right;
+ }
+
+#ifdef DEBUG_NOTATION_QUANTIZER
+ cout << endl;
+#endif
+ }
+
+ if (bestBase == -2) {
+#ifdef DEBUG_NOTATION_QUANTIZER
+ cout << "Quantizer::quantizeAbsoluteTime: weirdness: no snap found" << endl;
+#endif
+ } else {
+ // we need to snap relative to the time sig, not relative
+ // to the start of the whole composition
+ t -= sigTime;
+
+ t = (t / bestBase) * bestBase;
+ if (bestRight) t += bestBase;
+
+/*
+ timeT low = (t / bestBase) * bestBase;
+ timeT high = low + bestBase;
+ t = ((high - t > t - low) ? low : high);
+*/
+
+ t += sigTime;
+
+#ifdef DEBUG_NOTATION_QUANTIZER
+ cout << "snap base is " << bestBase << ", snapped to " << t << endl;
+#endif
+ }
+
+ setProvisional(*i, AbsoluteTimeValue, t);
+ (*i)->setMaybe<Int>(m_provisionalBase, bestBase);
+ (*i)->setMaybe<Int>(m_provisionalScore, bestScore);
+}
+
+long
+NotationQuantizer::Impl::scoreAbsoluteTimeForBase(Segment *s,
+ const Segment::iterator & /* i */,
+ int depth,
+ timeT base,
+ timeT sigTime,
+ timeT t,
+ timeT d,
+ int noteType,
+ const Segment::iterator &n,
+ const Segment::iterator &nprime,
+ bool &wantRight)
+ const
+{
+ Profiler profiler("NotationQuantizer::Impl::scoreAbsoluteTimeForBase");
+
+ // Lower score is better.
+
+ static timeT shortTime = Note(Note::Shortest).getDuration();
+
+ double simplicityFactor(m_simplicityFactor);
+ simplicityFactor -= Note::Crotchet - noteType;
+ if (simplicityFactor < 10) simplicityFactor = 10;
+
+ double effectiveDepth = pow(depth + 2, simplicityFactor / 10);
+
+ //!!! use velocity to adjust the effective depth as well? -- louder
+ // notes are more likely to be on big boundaries. Actually, perhaps
+ // introduce a generally-useful "salience" score a la Dixon et al
+
+ long leftScore = 0;
+
+ for (int ri = 0; ri < 2; ++ri) {
+
+ bool right = (ri == 1);
+
+ long distance = (t - sigTime) % base;
+ if (right) distance = base - distance;
+ long score = long((distance + shortTime / 2) * effectiveDepth);
+
+ double penalty1 = 1.0;
+
+ // seriously penalise moving a note beyond its own end time
+ if (d > 0 && right && distance >= d * 0.9) {
+ penalty1 = double(distance) / d + 0.5;
+ }
+
+ double penalty2 = 1.0;
+
+ // Examine the previous starting note (N), and the previous
+ // starting note that ends before this one starts (N').
+
+ // We should penalise moving this note to before the performed end
+ // of N' and seriously penalise moving it to the same quantized
+ // start time as N' -- but we should encourage moving it to the
+ // same time as the provisional end of N', or to the same start
+ // time as N if N != N'.
+
+ if (!right) {
+ if (n != s->end()) {
+ if (n != nprime) {
+ timeT nt = getProvisional(*n, AbsoluteTimeValue);
+ if (t - distance == nt) penalty2 = penalty2 * 2 / 3;
+ }
+ if (nprime != s->end()) {
+ timeT npt = getProvisional(*nprime, AbsoluteTimeValue);
+ timeT npd = getProvisional(*nprime, DurationValue);
+ if (t - distance <= npt) penalty2 *= 4;
+ else if (t - distance < npt + npd) penalty2 *= 2;
+ else if (t - distance == npt + npd) penalty2 = penalty2 * 2 / 3;
+ }
+ }
+ }
+
+#ifdef DEBUG_NOTATION_QUANTIZER
+ cout << " depth/eff/dist/t/score/pen1/pen2/res: " << depth << "/" << effectiveDepth << "/" << distance << "/" << (right ? t + distance : t - distance) << "/" << score << "/" << penalty1 << "/" << penalty2 << "/" << (score * penalty1 * penalty2);
+ if (right) cout << " -> ";
+ else cout << " <- ";
+ if (ri == 0) cout << endl;
+#endif
+
+ score = long(score * penalty1);
+ score = long(score * penalty2);
+
+ if (ri == 0) {
+ leftScore = score;
+ } else {
+ if (score < leftScore) {
+ wantRight = true;
+ return score;
+ } else {
+ wantRight = false;
+ return leftScore;
+ }
+ }
+ }
+
+ return leftScore;
+}
+
+void
+NotationQuantizer::Impl::quantizeDurationProvisional(Segment *, Segment::iterator i)
+ const
+{
+ Profiler profiler("NotationQuantizer::Impl::quantizeDurationProvisional");
+
+ // Calculate a first guess at the likely notation duration based
+ // only on its performed duration, without considering start time.
+
+ timeT d = m_q->getFromSource(*i, DurationValue);
+ if (d == 0) {
+ setProvisional(*i, DurationValue, d);
+ return;
+ }
+
+ Note shortNote = Note::getNearestNote(d, 2);
+
+ timeT shortTime = shortNote.getDuration();
+ timeT time = shortTime;
+
+ if (shortTime != d) {
+
+ Note longNote(shortNote);
+
+ if ((shortNote.getDots() > 0 ||
+ shortNote.getNoteType() == Note::Shortest)) { // can't dot that
+
+ if (shortNote.getNoteType() < Note::Longest) {
+ longNote = Note(shortNote.getNoteType() + 1, 0);
+ }
+
+ } else {
+ longNote = Note(shortNote.getNoteType(), 1);
+ }
+
+ timeT longTime = longNote.getDuration();
+
+ // we should prefer to round up to a note with fewer dots rather
+ // than down to one with more
+
+ //!!! except in dotted time, etc -- we really want this to work on a
+ // similar attraction-to-grid basis to the abstime quantization
+
+ if ((longNote.getDots() + 1) * (longTime - d) <
+ (shortNote.getDots() + 1) * (d - shortTime)) {
+ time = longTime;
+ }
+ }
+
+ setProvisional(*i, DurationValue, time);
+
+ if ((*i)->has(BEAMED_GROUP_TUPLET_BASE)) {
+ // We're going to recalculate these, and use our own results
+ (*i)->unset(BEAMED_GROUP_ID);
+ (*i)->unset(BEAMED_GROUP_TYPE);
+ (*i)->unset(BEAMED_GROUP_TUPLET_BASE);
+ (*i)->unset(BEAMED_GROUP_TUPLED_COUNT);
+ (*i)->unset(BEAMED_GROUP_UNTUPLED_COUNT);
+//!!! (*i)->unset(TUPLET_NOMINAL_DURATION);
+ }
+}
+
+void
+NotationQuantizer::Impl::quantizeDuration(Segment *s, Chord &c) const
+{
+ static int totalFracCount = 0;
+ static float totalFrac = 0;
+
+ Profiler profiler("NotationQuantizer::Impl::quantizeDuration");
+
+#ifdef DEBUG_NOTATION_QUANTIZER
+ cout << "quantizeDuration: chord has " << c.size() << " notes" << endl;
+#endif
+
+ Composition *comp = s->getComposition();
+
+ TimeSignature timeSig;
+// timeT t = m_q->getFromSource(*c.getInitialElement(), AbsoluteTimeValue);
+// timeT sigTime = comp->getTimeSignatureAt(t, timeSig);
+
+ timeT d = getProvisional(*c.getInitialElement(), DurationValue);
+ int noteType = Note::getNearestNote(d).getNoteType();
+ int maxDepth = 8 - noteType;
+ if (maxDepth < 4) maxDepth = 4;
+ std::vector<int> divisions;
+ timeSig.getDivisions(maxDepth, divisions);
+
+ Segment::iterator nextNote = c.getNextNote();
+ timeT nextNoteTime =
+ (s->isBeforeEndMarker(nextNote) ?
+ getProvisional(*nextNote, AbsoluteTimeValue) :
+ s->getEndMarkerTime());
+
+ timeT nonContrapuntalDuration = 0;
+
+ for (Chord::iterator ci = c.begin(); ci != c.end(); ++ci) {
+
+ if (!(**ci)->isa(Note::EventType)) continue;
+ if ((**ci)->has(m_provisionalDuration) &&
+ (**ci)->has(BEAMED_GROUP_TUPLET_BASE)) {
+ // dealt with already in tuplet code, we'd only mess it up here
+#ifdef DEBUG_NOTATION_QUANTIZER
+ cout << "not recalculating duration for tuplet" << endl;
+#endif
+ continue;
+ }
+
+ timeT ud = 0;
+
+ if (!m_contrapuntal) {
+ // if not contrapuntal, give all notes in chord equal duration
+ if (nonContrapuntalDuration > 0) {
+#ifdef DEBUG_NOTATION_QUANTIZER
+ cout << "setting duration trivially to " << nonContrapuntalDuration << endl;
+#endif
+ setProvisional(**ci, DurationValue, nonContrapuntalDuration);
+ continue;
+ } else {
+ // establish whose duration to use, then set it at the
+ // bottom after it's been quantized
+ Segment::iterator li = c.getLongestElement();
+ if (li != s->end()) ud = m_q->getFromSource(*li, DurationValue);
+ else ud = m_q->getFromSource(**ci, DurationValue);
+ }
+ } else {
+ ud = m_q->getFromSource(**ci, DurationValue);
+ }
+
+ timeT qt = getProvisional(**ci, AbsoluteTimeValue);
+
+#ifdef DEBUG_NOTATION_QUANTIZER
+ cout << "note at time " << (**ci)->getAbsoluteTime() << " (provisional time " << qt << ")" << endl;
+#endif
+
+ timeT base = timeSig.getBarDuration();
+ std::pair<timeT, timeT> bases;
+ for (int depth = 0; depth < maxDepth; ++depth) {
+ if (base >= ud) {
+ bases = std::pair<timeT, timeT>(base / divisions[depth], base);
+ }
+ base /= divisions[depth];
+ }
+
+#ifdef DEBUG_NOTATION_QUANTIZER
+ cout << "duration is " << ud << ", probably between "
+ << bases.first << " and " << bases.second << endl;
+#endif
+
+ timeT qd = getProvisional(**ci, DurationValue);
+
+ timeT spaceAvailable = nextNoteTime - qt;
+
+ if (spaceAvailable > 0) {
+ float frac = float(ud) / float(spaceAvailable);
+ totalFrac += frac;
+ totalFracCount += 1;
+ }
+
+ if (!m_contrapuntal && qd > spaceAvailable) {
+
+ qd = Note::getNearestNote(spaceAvailable).getDuration();
+
+#ifdef DEBUG_NOTATION_QUANTIZER
+ cout << "non-contrapuntal segment, rounded duration down to "
+ << qd << " (as only " << spaceAvailable << " available)"
+ << endl;
+#endif
+
+ } else {
+
+ //!!! Note longer than the longest note we have. Deal with
+ //this -- how? Quantize the end time? Split the note?
+ //(Prefer to do that in a separate phase later if requested.)
+ //Leave it as it is? (Yes, for now.)
+ if (bases.first == 0) return;
+
+ timeT absTimeBase = bases.first;
+ (**ci)->get<Int>(m_provisionalBase, absTimeBase);
+
+ spaceAvailable = std::min(spaceAvailable,
+ comp->getBarEndForTime(qt) - qt);
+
+ // We have a really good possibility of staccato if we have a
+ // note on a boundary whose base is double the note duration
+ // and there's nothing else until the next boundary and we're
+ // shorter than about a quaver (i.e. the base is a quaver or
+ // less)
+
+ if (qd*2 <= absTimeBase && (qd*8/3) >= absTimeBase &&
+ bases.second == absTimeBase) {
+
+ if (nextNoteTime >= qt + bases.second) {
+#ifdef DEBUG_NOTATION_QUANTIZER
+ cout << "We rounded to " << qd
+ << " but we're on " << absTimeBase << " absTimeBase"
+ << " and the next base is " << bases.second
+ << " and we have room for it, so"
+ << " rounding up again" << endl;
+#endif
+ qd = bases.second;
+ }
+
+ } else {
+
+ // Alternatively, if we rounded down but there's space to
+ // round up, consider doing so
+
+ //!!! mark staccato if necessary, and take existing marks into account
+
+ Note note(Note::getNearestNote(qd));
+
+ if (qd < ud || (qd == ud && note.getDots() == 2)) {
+
+ if (note.getNoteType() < Note::Longest) {
+
+ if (bases.second <= spaceAvailable) {
+#ifdef DEBUG_NOTATION_QUANTIZER
+ cout << "We rounded down to " << qd
+ << " but have room for " << bases.second
+ << ", rounding up again" << endl;
+#endif
+ qd = bases.second;
+ } else {
+#ifdef DEBUG_NOTATION_QUANTIZER
+ cout << "We rounded down to " << qd
+ << "; can't fit " << bases.second << endl;
+#endif
+ }
+ }
+ }
+ }
+ }
+
+ setProvisional(**ci, DurationValue, qd);
+ if (!m_contrapuntal) nonContrapuntalDuration = qd;
+ }
+
+#ifdef DEBUG_NOTATION_QUANTIZER
+ cout << "totalFrac " << totalFrac << ", totalFracCount " << totalFracCount << ", avg " << (totalFracCount > 0 ? (totalFrac / totalFracCount) : 0) << endl;
+#endif
+}
+
+
+void
+NotationQuantizer::Impl::scanTupletsInBar(Segment *s,
+ timeT barStart,
+ timeT barDuration,
+ timeT wholeStart,
+ timeT wholeEnd,
+ const std::vector<int> &divisions) const
+{
+ Profiler profiler("NotationQuantizer::Impl::scanTupletsInBar");
+
+ //!!! need to further constrain the area scanned so as to cope with
+ // partial bars
+
+ timeT base = barDuration;
+
+ for (int depth = -1; depth < int(divisions.size()) - 2; ++depth) {
+
+ if (depth >= 0) base /= divisions[depth];
+ if (base <= Note(Note::Semiquaver).getDuration()) break;
+
+#ifdef DEBUG_NOTATION_QUANTIZER
+ cout << "\nscanTupletsInBar: trying at depth " << depth << " (base " << base << ")" << endl;
+#endif
+
+ // check for triplets if our next divisor is 2 and the following
+ // one is not 3
+
+ if (divisions[depth+1] != 2 || divisions[depth+2] == 3) continue;
+
+ timeT tupletBase = base / 3;
+ timeT tupletStart = barStart;
+
+ while (tupletStart < barStart + barDuration) {
+
+ timeT tupletEnd = tupletStart + base;
+ if (tupletStart < wholeStart || tupletEnd > wholeEnd) {
+ tupletStart = tupletEnd;
+ continue;
+ }
+
+#ifdef DEBUG_NOTATION_QUANTIZER
+ cout << "scanTupletsInBar: testing " << tupletStart << "," << base << " at tuplet base " << tupletBase << endl;
+#endif
+
+ // find first note within a certain distance whose start time
+ // quantized to tupletStart or greater
+ Segment::iterator j = s->findTime(tupletStart - tupletBase / 3);
+ timeT jTime = tupletEnd;
+
+ while (s->isBeforeEndMarker(j) &&
+ (!(*j)->isa(Note::EventType) ||
+ !(*j)->get<Int>(m_provisionalAbsTime, jTime) ||
+ jTime < tupletStart)) {
+ if ((*j)->getAbsoluteTime() > tupletEnd + tupletBase / 3) {
+ break;
+ }
+ ++j;
+ }
+
+ if (jTime >= tupletEnd) { // nothing to make tuplets of
+#ifdef DEBUG_NOTATION_QUANTIZER
+ cout << "scanTupletsInBar: nothing here" << endl;
+#endif
+ tupletStart = tupletEnd;
+ continue;
+ }
+
+ scanTupletsAt(s, j, depth+1, base, barStart,
+ tupletStart, tupletBase);
+
+ tupletStart = tupletEnd;
+ }
+ }
+}
+
+
+void
+NotationQuantizer::Impl::scanTupletsAt(Segment *s,
+ Segment::iterator i,
+ int depth,
+ timeT base,
+ timeT sigTime,
+ timeT tupletStart,
+ timeT tupletBase) const
+{
+ Profiler profiler("NotationQuantizer::Impl::scanTupletsAt");
+
+ Segment::iterator j = i;
+ timeT tupletEnd = tupletStart + base;
+ timeT jTime = tupletEnd;
+
+ std::vector<Event *> candidates;
+ int count = 0;
+
+ while (s->isBeforeEndMarker(j) &&
+ ((*j)->isa(Note::EventRestType) ||
+ ((*j)->get<Int>(m_provisionalAbsTime, jTime) &&
+ jTime < tupletEnd))) {
+
+ if (!(*j)->isa(Note::EventType)) { ++j; continue; }
+
+#ifdef DEBUG_NOTATION_QUANTIZER
+ cout << "scanTupletsAt time " << jTime << " (unquantized "
+ << (*j)->getAbsoluteTime() << "), found note" << endl;
+#endif
+
+ // reject any group containing anything already a tuplet
+ if ((*j)->has(BEAMED_GROUP_TUPLET_BASE)) {
+#ifdef DEBUG_NOTATION_QUANTIZER
+ cout << "already made tuplet here" << endl;
+#endif
+ return;
+ }
+
+ timeT originalBase;
+
+ if (!(*j)->get<Int>(m_provisionalBase, originalBase)) {
+#ifdef DEBUG_NOTATION_QUANTIZER
+ cout << "some notes not provisionally quantized, no good" << endl;
+#endif
+ return;
+ }
+
+ if (originalBase == base) {
+#ifdef DEBUG_NOTATION_QUANTIZER
+ cout << "accepting note at original base" << endl;
+#endif
+ candidates.push_back(*j);
+ } else if (((jTime - sigTime) % base) == 0) {
+#ifdef DEBUG_NOTATION_QUANTIZER
+ cout << "accepting note that happens to lie on original base" << endl;
+#endif
+ candidates.push_back(*j);
+ } else {
+
+ // This is a note that did not quantize to the original base
+ // (the first note in the tuplet would have, but we can't tell
+ // anything from that). Reject the entire group if it fails
+ // any of the likelihood tests for tuplets.
+
+ if (!isValidTupletAt(s, j, depth, base, sigTime, tupletBase)) {
+#ifdef DEBUG_NOTATION_QUANTIZER
+ cout << "no good" << endl;
+#endif
+ return;
+ }
+
+ candidates.push_back(*j);
+ ++count;
+ }
+
+ ++j;
+ }
+
+ // must have at least one note that is not already quantized to the
+ // original base
+ if (count < 1) {
+#ifdef DEBUG_NOTATION_QUANTIZER
+ cout << "scanTupletsAt: found no note not already quantized to " << base << endl;
+#endif
+ return;
+ }
+
+#ifdef DEBUG_NOTATION_QUANTIZER
+ cout << "scanTupletsAt: Tuplet group of duration " << base << " starting at " << tupletStart << endl;
+#endif
+
+ // Woo-hoo! It looks good.
+
+ int groupId = s->getNextId();
+ std::map<int, bool> multiples;
+
+ for (std::vector<Event *>::iterator ei = candidates.begin();
+ ei != candidates.end(); ++ei) {
+
+ //!!! Interesting -- we can't modify rests here, but Segment's
+ // normalizeRests won't insert the correct sort of rest for us...
+ // what to do?
+ //!!! insert a tupleted rest, and prevent Segment::normalizeRests
+ // from messing about with it
+ if (!(*ei)->isa(Note::EventType)) continue;
+ (*ei)->set<String>(BEAMED_GROUP_TYPE, GROUP_TYPE_TUPLED);
+
+ //!!! This is too easy, because we rejected any notes of
+ //durations not conforming to a single multiple of the
+ //tupletBase in isValidTupletAt
+
+ (*ei)->set<Int>(BEAMED_GROUP_ID, groupId);
+ (*ei)->set<Int>(BEAMED_GROUP_TUPLET_BASE, base/2); //!!! wrong if tuplet count != 3
+ (*ei)->set<Int>(BEAMED_GROUP_TUPLED_COUNT, 2); //!!! as above
+ (*ei)->set<Int>(BEAMED_GROUP_UNTUPLED_COUNT, base/tupletBase);
+
+ timeT t = (*ei)->getAbsoluteTime();
+ t -= tupletStart;
+ timeT low = (t / tupletBase) * tupletBase;
+ timeT high = low + tupletBase;
+ t = ((high - t > t - low) ? low : high);
+
+ multiples[t / tupletBase] = true;
+
+ t += tupletStart;
+
+ setProvisional(*ei, AbsoluteTimeValue, t);
+ setProvisional(*ei, DurationValue, tupletBase);
+ }
+
+ // fill in with tupleted rests
+
+ for (int m = 0; m < base / tupletBase; ++m) {
+
+ if (multiples[m]) continue;
+
+ timeT absTime = tupletStart + m * tupletBase;
+ timeT duration = tupletBase;
+//!!! while (multiples[++m]) duration += tupletBase;
+
+ Event *rest = new Event(Note::EventRestType, absTime, duration);
+
+ rest->set<String>(BEAMED_GROUP_TYPE, GROUP_TYPE_TUPLED);
+ rest->set<Int>(BEAMED_GROUP_ID, groupId);
+ rest->set<Int>(BEAMED_GROUP_TUPLET_BASE, base/2); //!!! wrong if tuplet count != 3
+ rest->set<Int>(BEAMED_GROUP_TUPLED_COUNT, 2); //!!! as above
+ rest->set<Int>(BEAMED_GROUP_UNTUPLED_COUNT, base/tupletBase);
+
+ m_q->m_toInsert.push_back(rest);
+ }
+}
+
+bool
+NotationQuantizer::Impl::isValidTupletAt(Segment *s,
+ const Segment::iterator &i,
+ int depth,
+ timeT /* base */,
+ timeT sigTime,
+ timeT tupletBase) const
+{
+ Profiler profiler("NotationQuantizer::Impl::isValidTupletAt");
+
+ //!!! This is basically wrong; we need to be able to deal with groups
+ // that contain e.g. a crotchet and a quaver, tripleted.
+
+ timeT ud = m_q->getFromSource(*i, DurationValue);
+
+ if (ud > (tupletBase * 5 / 4)) {
+#ifdef DEBUG_NOTATION_QUANTIZER
+ cout << "\nNotationQuantizer::isValidTupletAt: note too long at "
+ << (*i)->getDuration() << " (tupletBase is " << tupletBase << ")"
+ << endl;
+#endif
+ return false; // too long
+ }
+
+ //!!! This bit is a cop-out. It means we reject anything that looks
+ // like it's going to have rests in it. Bah.
+ if (ud <= (tupletBase * 3 / 8)) {
+#ifdef DEBUG_NOTATION_QUANTIZER
+ cout << "\nNotationQuantizer::isValidTupletAt: note too short at "
+ << (*i)->getDuration() << " (tupletBase is " << tupletBase << ")"
+ << endl;
+#endif
+ return false;
+ }
+
+ long score = 0;
+ if (!(*i)->get<Int>(m_provisionalScore, score)) return false;
+
+ timeT t = m_q->getFromSource(*i, AbsoluteTimeValue);
+ timeT d = getProvisional(*i, DurationValue);
+ int noteType = (*i)->get<Int>(m_provisionalNoteType);
+
+ //!!! not as complete as the calculation we do in the original scoring
+ bool dummy;
+ long tupletScore = scoreAbsoluteTimeForBase
+ (s, i, depth, tupletBase, sigTime, t, d, noteType, s->end(), s->end(), dummy);
+#ifdef DEBUG_NOTATION_QUANTIZER
+ cout << "\nNotationQuantizer::isValidTupletAt: score " << score
+ << " vs tupletScore " << tupletScore << endl;
+#endif
+ return (tupletScore < score);
+}
+
+
+void
+NotationQuantizer::quantizeRange(Segment *s,
+ Segment::iterator from,
+ Segment::iterator to) const
+{
+ m_impl->quantizeRange(s, from, to);
+}
+
+void
+NotationQuantizer::Impl::quantizeRange(Segment *s,
+ Segment::iterator from,
+ Segment::iterator to) const
+{
+ Profiler *profiler = new Profiler("NotationQuantizer::Impl::quantizeRange");
+
+ clock_t start = clock();
+ int events = 0, notes = 0, passes = 0;
+ int setGood = 0, setBad = 0;
+
+#ifdef DEBUG_NOTATION_QUANTIZER
+ cout << "NotationQuantizer::Impl::quantizeRange: from time "
+ << (from == s->end() ? -1 : (*from)->getAbsoluteTime())
+ << " to "
+ << (to == s->end() ? -1 : (*to)->getAbsoluteTime())
+ << endl;
+#endif
+
+ timeT segmentEndTime = s->getEndMarkerTime();
+
+ // This process does several passes over the data. It's assumed
+ // that this is not going to be invoked in any really time-critical
+ // place.
+
+ // Calculate absolute times on the first pass, so that we know
+ // which things are chords. We need to assign absolute times to
+ // all events, but we only need do durations for notes.
+
+ PropertyName provisionalBase("notationquantizer-provisionalBase");
+
+ // We don't use setToTarget until we have our final values ready,
+ // as it erases and replaces the events. Just set the properties.
+
+ // Set a provisional duration to each note first
+
+ for (Segment::iterator i = from; i != to; ++i) {
+
+ ++events;
+ if ((*i)->isa(Note::EventRestType)) continue;
+ if ((*i)->isa(Note::EventType)) ++notes;
+ quantizeDurationProvisional(s, i);
+ }
+ ++passes;
+
+ // now do the absolute-time calculation
+
+ timeT wholeStart = 0, wholeEnd = 0;
+
+ Segment::iterator i = from;
+
+ for (Segment::iterator nexti = i; i != to; i = nexti) {
+
+ ++nexti;
+
+ if ((*i)->isa(Note::EventRestType)) {
+ if (i == from) ++from;
+ s->erase(i);
+ continue;
+ }
+
+ quantizeAbsoluteTime(s, i);
+
+ timeT t0 = (*i)->get<Int>(m_provisionalAbsTime);
+ timeT t1 = (*i)->get<Int>(m_provisionalDuration) + t0;
+ if (wholeStart == wholeEnd) {
+ wholeStart = t0;
+ wholeEnd = t1;
+ } else if (t1 > wholeEnd) {
+ wholeEnd = t1;
+ }
+ }
+ ++passes;
+
+ // now we've grouped into chords, look for tuplets next
+
+ Composition *comp = s->getComposition();
+
+ if (m_maxTuplet >= 2) {
+
+ std::vector<int> divisions;
+ comp->getTimeSignatureAt(wholeStart).getDivisions(7, divisions);
+
+ for (int barNo = comp->getBarNumber(wholeStart);
+ barNo <= comp->getBarNumber(wholeEnd); ++barNo) {
+
+ bool isNew = false;
+ TimeSignature timeSig = comp->getTimeSignatureInBar(barNo, isNew);
+ if (isNew) timeSig.getDivisions(7, divisions);
+ scanTupletsInBar(s, comp->getBarStart(barNo),
+ timeSig.getBarDuration(),
+ wholeStart, wholeEnd, divisions);
+ }
+ ++passes;
+ }
+
+ ProvisionalQuantizer provisionalQuantizer((Impl *)this);
+
+ for (i = from; i != to; ++i) {
+
+ if (!(*i)->isa(Note::EventType)) continue;
+
+ // could potentially supply clef and key here, but at the
+ // moment Chord doesn't do anything with them (unlike
+ // NotationChord) and we don't have any really clever
+ // ideas for how to use them here anyway
+// Chord c(*s, i, m_q);
+ Chord c(*s, i, &provisionalQuantizer);
+
+ quantizeDuration(s, c);
+
+ bool ended = false;
+ for (Segment::iterator ci = c.getInitialElement();
+ s->isBeforeEndMarker(ci); ++ci) {
+ if (ci == to) ended = true;
+ if (ci == c.getFinalElement()) break;
+ }
+ if (ended) break;
+
+ i = c.getFinalElement();
+ }
+ ++passes;
+
+ // staccato (we now do slurs separately, in SegmentNotationHelper::autoSlur)
+
+ if (m_articulate) {
+
+ for (i = from; i != to; ++i) {
+
+ if (!(*i)->isa(Note::EventType)) continue;
+
+ timeT qd = getProvisional(*i, DurationValue);
+ timeT ud = m_q->getFromSource(*i, DurationValue);
+
+ if (ud < (qd * 3 / 4) &&
+ qd <= Note(Note::Crotchet).getDuration()) {
+ Marks::addMark(**i, Marks::Staccato, true);
+ } else if (ud > qd) {
+ Marks::addMark(**i, Marks::Tenuto, true);
+ }
+ }
+ ++passes;
+ }
+
+ i = from;
+
+ for (Segment::iterator nexti = i; i != to; i = nexti) {
+
+ ++nexti;
+
+ if ((*i)->isa(Note::EventRestType)) continue;
+
+ timeT t = getProvisional(*i, AbsoluteTimeValue);
+ timeT d = getProvisional(*i, DurationValue);
+
+ unsetProvisionalProperties(*i);
+
+ if ((*i)->getAbsoluteTime() == t &&
+ (*i)->getDuration() == d) ++setBad;
+ else ++setGood;
+
+#ifdef DEBUG_NOTATION_QUANTIZER
+ cout << "Setting to target at " << t << "," << d << endl;
+#endif
+
+ m_q->setToTarget(s, i, t, d);
+ }
+ ++passes;
+/*
+ cerr << "NotationQuantizer: " << events << " events ("
+ << notes << " notes), " << passes << " passes, "
+ << setGood << " good sets, " << setBad << " bad sets, "
+ << ((clock() - start) * 1000 / CLOCKS_PER_SEC) << "ms elapsed"
+ << endl;
+*/
+ if (s->getEndTime() < segmentEndTime) {
+ s->setEndMarkerTime(segmentEndTime);
+ }
+
+ delete profiler; // on heap so it updates before the next line:
+ Profiles::getInstance()->dump();
+
+}
+
+
+}
+
diff --git a/src/base/NotationQuantizer.h b/src/base/NotationQuantizer.h
new file mode 100644
index 0000000..87b0d72
--- /dev/null
+++ b/src/base/NotationQuantizer.h
@@ -0,0 +1,93 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef NOTATION_QUANTIZER_H_
+#define NOTATION_QUANTIZER_H_
+
+#include "Quantizer.h"
+
+namespace Rosegarden {
+
+class NotationQuantizer : public Quantizer
+{
+public:
+ NotationQuantizer();
+ NotationQuantizer(std::string source, std::string target);
+ NotationQuantizer(const NotationQuantizer &);
+ ~NotationQuantizer();
+
+ /**
+ * Set the absolute time minimum unit. Default is demisemiquaver.
+ */
+ void setUnit(timeT);
+ timeT getUnit() const;
+
+ /**
+ * Set the simplicity factor. This controls the relative "pull"
+ * towards larger units and more obvious beats in placing notes.
+ * The value 10 means no pull to larger units, lower values mean
+ * an active pull away from them. Default is 13.
+ */
+ void setSimplicityFactor(int);
+ int getSimplicityFactor() const;
+
+ /**
+ * Set the maximum size of tuplet group. 2 = two-in-the-time-of-three
+ * groupings, 3 = triplets, etc. Default is 3. Set <2 to switch off
+ * tuplets altogether.
+ */
+ void setMaxTuplet(int);
+ int getMaxTuplet() const;
+
+ /**
+ * Set whether we assume the music may be contrapuntal -- that is,
+ * may have notes that overlap rather than simply a sequence of
+ * individual notes and chords.
+ */
+ void setContrapuntal(bool);
+ bool getContrapuntal() const;
+
+ /**
+ * Set whether to add articulations (staccato, tenuto, slurs).
+ * Default is true. Doesn't affect quantization, only the marks
+ * that are added to quantized notes.
+ */
+ void setArticulate(bool);
+ bool getArticulate() const;
+
+protected:
+ virtual void quantizeRange(Segment *,
+ Segment::iterator,
+ Segment::iterator) const;
+
+protected:
+ // avoid having to rebuild absolutely everything each time we
+ // tweak the implementation
+ class Impl;
+ Impl *m_impl;
+
+private:
+ NotationQuantizer &operator=(const NotationQuantizer &); // not provided
+};
+
+}
+
+#endif
diff --git a/src/base/NotationRules.h b/src/base/NotationRules.h
new file mode 100644
index 0000000..a745afa
--- /dev/null
+++ b/src/base/NotationRules.h
@@ -0,0 +1,133 @@
+// -*- c-basic-offset: 4 -*-
+
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _NOTATION_RULES_H_
+#define _NOTATION_RULES_H_
+
+
+/**
+ * Common major and minor scales.
+ *
+ * For example, sixth note in 12-basis on Cmajor scale:
+ * scale_Cmajor[5] = 9
+ */
+static int scale_Cmajor[] = { 0, 2, 4, 5, 7, 9, 11 };
+static int scale_Cminor[] = { 0, 2, 3, 5, 7, 8, 10 };
+static int scale_Cminor_harmonic[] = { 0, 2, 3, 5, 7, 8, 11 };
+/**
+ * Steps of common major and minor scales.
+ *
+ * For example, get accidental in 12-basis on Cmajor scale:
+ * 10 - scale_Cmajor[steps_Cmajor[10]] = 10 - 9 = +1
+ */
+static int steps_Cmajor[] = { 0, 0, 1, 1, 2, 3, 3, 4, 4, 5, 5, 6 };
+static int steps_Cminor[] = { 0, 0, 1, 2, 2, 3, 3, 4, 5, 5, 6, 6 };
+static int steps_Cminor_harmonic[] = { 0, 0, 1, 2, 2, 3, 3, 4, 5, 5, 5, 6 };
+/**
+ * Same as previosly, but the use of accidentals is explicitly written.
+ *
+ * For example, get accidental in 12-basis on Cmajor scale:
+ * 10 - scale_Cmajor[steps_Cmajor_with_sharps[10]] = 10 - 9 = +1
+ * 10 - scale_Cmajor[steps_Cmajor_with_flats[10]] = 10 - 11 = -1
+ */
+static int steps_Cmajor_with_sharps[] = { 0, 0, 1, 1, 2, 3, 3, 4, 4, 5, 5, 6 };
+static int steps_Cmajor_with_flats[] = { 0, 1, 1, 2, 2, 3, 4, 4, 5, 5, 6, 6 };
+
+namespace Rosegarden
+{
+
+/*
+ * NotationRules.h
+ *
+ * This file contains the model for rules which are used in notation decisions.
+ *
+ */
+
+class NotationRules
+{
+public:
+ NotationRules() { };
+ ~NotationRules() { };
+
+ /**
+ * If a single note is above the middle line, the preferred direction is up.
+ *
+ * If a single note is on the middle line, the preferred direction is down.
+ *
+ * If a single note is below the middle line, the preferred direction is down.
+ */
+ bool isStemUp(int heightOnStaff) { return heightOnStaff < 4; }
+
+ /**
+ * If the highest note in a chord is more distant from the middle
+ * line than the lowest note in a chord, the preferred direction is down.
+ *
+ * If the extreme notes in a chord are an equal distance from the
+ * middle line, the preferred direction is down.
+ *
+ * If the lowest note in a chord is more distant from the middle
+ * line than the highest note in a chord, the preferred direction is up.
+ */
+ bool isStemUp(int highestHeightOnStaff, int lowestHeightOnStaff) {
+ return (highestHeightOnStaff + lowestHeightOnStaff) < 2*4;
+ }
+
+ /**
+ * If majority of notes are below the middle line,
+ * the preferred direction is up.
+ *
+ * If notes are equally distributed around the middle line,
+ * the preferred direction is down.
+ *
+ * If majority of notes are above the middle line,
+ * the preferred direction is down.
+ */
+ bool isBeamAboveWeighted(int weightAbove, int weightBelow) {
+ return weightBelow > weightAbove;
+ }
+
+ /**
+ * If the highest note in a group is more distant from the middle
+ * line than the lowest note in a group, the preferred direction is down.
+ *
+ * If the extreme notes in a group are an equal distance from the
+ * middle line, the preferred direction is down.
+ *
+ * If the lowest note in a group is more distant from the middle
+ * line than the highest note in a group, the preferred direction is up.
+ */
+ bool isBeamAbove(int highestHeightOnStaff, int lowestHeightOnStaff) {
+ return (highestHeightOnStaff + lowestHeightOnStaff) < 2*4;
+ }
+ bool isBeamAbove(int highestHeightOnStaff, int lowestHeightOnStaff,
+ int weightAbove, int weightBelow) {
+ if (highestHeightOnStaff + lowestHeightOnStaff == 2*4) {
+ return isBeamAboveWeighted(weightAbove,weightBelow);
+ } else {
+ return isBeamAbove(highestHeightOnStaff,lowestHeightOnStaff);
+ }
+ }
+};
+
+}
+
+#endif
diff --git a/src/base/NotationTypes.cpp b/src/base/NotationTypes.cpp
new file mode 100644
index 0000000..ceddf79
--- /dev/null
+++ b/src/base/NotationTypes.cpp
@@ -0,0 +1,2436 @@
+// -*- c-basic-offset: 4 -*-
+
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include <cstdio> // needed for sprintf()
+#include "NotationRules.h"
+#include "NotationTypes.h"
+#include "BaseProperties.h"
+#include <iostream>
+#include <cstdlib> // for atoi
+#include <limits.h> // for SHRT_MIN
+#include <cassert>
+
+#if (__GNUC__ < 3)
+#include <strstream>
+#else
+#include <sstream>
+#endif
+
+//dmm This will make everything excruciatingly slow if defined:
+//#define DEBUG_PITCH
+
+namespace Rosegarden
+{
+using std::string;
+using std::vector;
+using std::cout;
+using std::cerr;
+using std::endl;
+
+// This is the fundamental definition of the resolution used throughout.
+// It must be a multiple of 16, and should ideally be a multiple of 96.
+static const timeT basePPQ = 960;
+
+const int MIN_SUBORDERING = SHRT_MIN;
+
+namespace Accidentals
+{
+ /**
+ * NoAccidental means the accidental will be inferred
+ * based on the performance pitch and current key at the
+ * location of the note.
+ */
+ const Accidental NoAccidental = "no-accidental";
+
+ const Accidental Sharp = "sharp";
+ const Accidental Flat = "flat";
+ const Accidental Natural = "natural";
+ const Accidental DoubleSharp = "double-sharp";
+ const Accidental DoubleFlat = "double-flat";
+
+ AccidentalList getStandardAccidentals() {
+
+ static Accidental a[] = {
+ NoAccidental, Sharp, Flat, Natural, DoubleSharp, DoubleFlat
+ };
+
+ static AccidentalList v;
+ if (v.size() == 0) {
+ for (unsigned int i = 0; i < sizeof(a)/sizeof(a[0]); ++i)
+ v.push_back(a[i]);
+ }
+ return v;
+ }
+
+ int getPitchOffset(const Accidental &acc) {
+ if (acc == DoubleSharp) return 2;
+ else if (acc == Sharp) return 1;
+ else if (acc == Flat) return -1;
+ else if (acc == DoubleFlat) return -2;
+ else return 0;
+ }
+
+ Accidental getAccidental(int pitchChange) {
+ if (pitchChange == -2) return DoubleFlat;
+ if (pitchChange == -1) return Flat;
+ // Yielding 'Natural' will add a natural-sign even if not needed, so for now
+ // just return NoAccidental
+ if (pitchChange == 0) return NoAccidental;
+ if (pitchChange == 1) return Sharp;
+ if (pitchChange == 2) return DoubleSharp;
+
+ // if we're getting into triple flats/sharps, we're probably atonal
+ // and don't case if the accidental is simplified
+ return NoAccidental;
+ }
+}
+
+using namespace Accidentals;
+
+
+namespace Marks
+{
+ const Mark NoMark = "no-mark";
+ const Mark Accent = "accent";
+ const Mark Tenuto = "tenuto";
+ const Mark Staccato = "staccato";
+ const Mark Staccatissimo = "staccatissimo";
+ const Mark Marcato = "marcato";
+ const Mark Sforzando = getTextMark("sf");
+ const Mark Rinforzando = getTextMark("rf");
+ const Mark Trill = "trill";
+ const Mark LongTrill = "long-trill";
+ const Mark TrillLine = "trill-line";
+ const Mark Turn = "turn";
+ const Mark Pause = "pause";
+ const Mark UpBow = "up-bow";
+ const Mark DownBow = "down-bow";
+
+ const Mark Mordent = "mordent";
+ const Mark MordentInverted = "mordent-inverted";
+ const Mark MordentLong = "mordent-long";
+ const Mark MordentLongInverted = "mordent-long-inverted";
+
+ string getTextMark(string text) {
+ return string("text_") + text;
+ }
+
+ bool isTextMark(Mark mark) {
+ return string(mark).substr(0, 5) == "text_";
+ }
+
+ string getTextFromMark(Mark mark) {
+ if (!isTextMark(mark)) return string();
+ else return string(mark).substr(5);
+ }
+
+ string getFingeringMark(string fingering) {
+ return string("finger_") + fingering;
+ }
+
+ bool isFingeringMark(Mark mark) {
+ return string(mark).substr(0, 7) == "finger_";
+ }
+
+ string getFingeringFromMark(Mark mark) {
+ if (!isFingeringMark(mark)) return string();
+ else return string(mark).substr(7);
+ }
+
+ int getMarkCount(const Event &e) {
+ long markCount = 0;
+ e.get<Int>(BaseProperties::MARK_COUNT, markCount);
+ return markCount;
+ }
+
+ std::vector<Mark> getMarks(const Event &e) {
+
+ std::vector<Mark> marks;
+
+ long markCount = 0;
+ e.get<Int>(BaseProperties::MARK_COUNT, markCount);
+ if (markCount == 0) return marks;
+
+ for (long j = 0; j < markCount; ++j) {
+
+ Mark mark(Marks::NoMark);
+ (void)e.get<String>(BaseProperties::getMarkPropertyName(j), mark);
+
+ marks.push_back(mark);
+ }
+
+ return marks;
+ }
+
+ Mark getFingeringMark(const Event &e) {
+
+ long markCount = 0;
+ e.get<Int>(BaseProperties::MARK_COUNT, markCount);
+ if (markCount == 0) return NoMark;
+
+ for (long j = 0; j < markCount; ++j) {
+
+ Mark mark(Marks::NoMark);
+ (void)e.get<String>(BaseProperties::getMarkPropertyName(j), mark);
+
+ if (isFingeringMark(mark)) return mark;
+ }
+
+ return NoMark;
+ }
+
+ void addMark(Event &e, const Mark &mark, bool unique) {
+ if (unique && hasMark(e, mark)) return;
+
+ long markCount = 0;
+ e.get<Int>(BaseProperties::MARK_COUNT, markCount);
+ e.set<Int>(BaseProperties::MARK_COUNT, markCount + 1);
+
+ PropertyName markProperty = BaseProperties::getMarkPropertyName(markCount);
+ e.set<String>(markProperty, mark);
+ }
+
+ bool removeMark(Event &e, const Mark &mark) {
+
+ long markCount = 0;
+ e.get<Int>(BaseProperties::MARK_COUNT, markCount);
+
+ for (long j = 0; j < markCount; ++j) {
+ PropertyName pn(BaseProperties::getMarkPropertyName(j));
+ std::string m;
+ if (e.get<String>(pn, m) && m == mark) {
+ e.unset(pn);
+ while (j < markCount - 1) {
+ PropertyName npn(BaseProperties::getMarkPropertyName(j+1));
+ if (e.get<String>(npn, m)) {
+ e.set<String>( pn, m);
+ }
+ pn = npn;
+ ++j;
+ }
+ e.set<Int>(BaseProperties::MARK_COUNT, markCount - 1);
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ bool hasMark(const Event &e, const Mark &mark) {
+ long markCount = 0;
+ e.get<Int>(BaseProperties::MARK_COUNT, markCount);
+
+ for (long j = 0; j < markCount; ++j) {
+ std::string m;
+ if (e.get<String>(BaseProperties::getMarkPropertyName(j), m) && m == mark) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ std::vector<Mark> getStandardMarks() {
+
+ static Mark a[] = {
+ NoMark, Accent, Tenuto, Staccato, Staccatissimo, Marcato,
+ Sforzando, Rinforzando, Trill, LongTrill, TrillLine,
+ Turn, Pause, UpBow, DownBow,
+ Mordent, MordentInverted, MordentLong, MordentLongInverted
+ };
+
+ static std::vector<Mark> v;
+ if (v.size() == 0) {
+ for (unsigned int i = 0; i < sizeof(a)/sizeof(a[0]); ++i)
+ v.push_back(a[i]);
+ }
+ return v;
+ }
+
+}
+
+using namespace Marks;
+
+
+//////////////////////////////////////////////////////////////////////
+// Clef
+//////////////////////////////////////////////////////////////////////
+
+const string Clef::EventType = "clefchange";
+const int Clef::EventSubOrdering = -250;
+const PropertyName Clef::ClefPropertyName = "clef";
+const PropertyName Clef::OctaveOffsetPropertyName = "octaveoffset";
+const string Clef::Treble = "treble";
+const string Clef::French = "french";
+const string Clef::Soprano = "soprano";
+const string Clef::Mezzosoprano = "mezzosoprano";
+const string Clef::Alto = "alto";
+const string Clef::Tenor = "tenor";
+const string Clef::Baritone = "baritone";
+const string Clef::Varbaritone = "varbaritone";
+const string Clef::Bass = "bass";
+const string Clef::Subbass = "subbass";
+
+const Clef Clef::DefaultClef = Clef("treble");
+
+Clef::Clef(const Event &e) :
+ m_clef(DefaultClef.m_clef),
+ m_octaveOffset(0)
+{
+ if (e.getType() != EventType) {
+ std::cerr << Event::BadType
+ ("Clef model event", EventType, e.getType()).getMessage()
+ << std::endl;
+ return;
+ }
+
+ std::string s;
+ e.get<String>(ClefPropertyName, s);
+
+ if (s != Treble && s != Soprano && s != French && s != Mezzosoprano && s != Alto && s != Tenor && s != Baritone && s != Bass && s != Varbaritone && s != Subbass) {
+ std::cerr << BadClefName("No such clef as \"" + s + "\"").getMessage()
+ << std::endl;
+ return;
+ }
+
+ long octaveOffset = 0;
+ (void)e.get<Int>(OctaveOffsetPropertyName, octaveOffset);
+
+ m_clef = s;
+ m_octaveOffset = octaveOffset;
+}
+
+Clef::Clef(const std::string &s, int octaveOffset)
+ // throw (BadClefName)
+{
+ if (s != Treble && s != Soprano && s != French && s != Mezzosoprano && s != Alto && s != Tenor && s != Baritone && s != Bass && s != Varbaritone && s != Subbass) {
+ throw BadClefName("No such clef as \"" + s + "\"");
+ }
+ m_clef = s;
+ m_octaveOffset = octaveOffset;
+}
+
+Clef &Clef::operator=(const Clef &c)
+{
+ if (this != &c) {
+ m_clef = c.m_clef;
+ m_octaveOffset = c.m_octaveOffset;
+ }
+ return *this;
+}
+
+bool Clef::isValid(const Event &e)
+{
+ if (e.getType() != EventType) return false;
+
+ std::string s;
+ e.get<String>(ClefPropertyName, s);
+ if (s != Treble && s != Soprano && s != French && s != Mezzosoprano && s != Alto && s != Tenor && s != Baritone && s != Bass && s != Varbaritone && s != Subbass) return false;
+
+ return true;
+}
+
+int Clef::getTranspose() const
+{
+//!!! plus or minus?
+ return getOctave() * 12 - getPitchOffset();
+}
+
+int Clef::getOctave() const
+{
+ if (m_clef == Treble || m_clef == French) return 0 + m_octaveOffset;
+ else if (m_clef == Bass || m_clef == Varbaritone || m_clef == Subbass) return -2 + m_octaveOffset;
+ else return -1 + m_octaveOffset;
+}
+
+int Clef::getPitchOffset() const
+{
+ if (m_clef == Treble) return 0;
+ else if (m_clef == French) return -2;
+ else if (m_clef == Soprano) return -5;
+ else if (m_clef == Mezzosoprano) return -3;
+ else if (m_clef == Alto) return -1;
+ else if (m_clef == Tenor) return 1;
+ else if (m_clef == Baritone) return 3;
+ else if (m_clef == Varbaritone) return -4;
+ else if (m_clef == Bass) return -2;
+ else if (m_clef == Subbass) return 0;
+ else return -2;
+}
+
+int Clef::getAxisHeight() const
+{
+ if (m_clef == Treble) return 2;
+ else if (m_clef == French) return 0;
+ else if (m_clef == Soprano) return 0;
+ else if (m_clef == Mezzosoprano) return 2;
+ else if (m_clef == Alto) return 4;
+ else if (m_clef == Tenor) return 6;
+ else if (m_clef == Baritone) return 8;
+ else if (m_clef == Varbaritone) return 4;
+ else if (m_clef == Bass) return 6;
+ else if (m_clef == Subbass) return 8;
+ else return 6;
+}
+
+Clef::ClefList
+Clef::getClefs()
+{
+ ClefList clefs;
+ clefs.push_back(Clef(Bass));
+ clefs.push_back(Clef(Varbaritone));
+ clefs.push_back(Clef(Subbass));
+ clefs.push_back(Clef(Baritone));
+ clefs.push_back(Clef(Tenor));
+ clefs.push_back(Clef(Alto));
+ clefs.push_back(Clef(Mezzosoprano));
+ clefs.push_back(Clef(Soprano));
+ clefs.push_back(Clef(French));
+ clefs.push_back(Clef(Treble));
+ return clefs;
+}
+
+Event *Clef::getAsEvent(timeT absoluteTime) const
+{
+ Event *e = new Event(EventType, absoluteTime, 0, EventSubOrdering);
+ e->set<String>(ClefPropertyName, m_clef);
+ e->set<Int>(OctaveOffsetPropertyName, m_octaveOffset);
+ return e;
+}
+
+
+//////////////////////////////////////////////////////////////////////
+// Key
+//////////////////////////////////////////////////////////////////////
+
+Key::KeyDetailMap Key::m_keyDetailMap = Key::KeyDetailMap();
+
+const string Key::EventType = "keychange";
+const int Key::EventSubOrdering = -200;
+const PropertyName Key::KeyPropertyName = "key";
+const Key Key::DefaultKey = Key("C major");
+
+Key::Key() :
+ m_name(DefaultKey.m_name),
+ m_accidentalHeights(0)
+{
+ checkMap();
+}
+
+
+Key::Key(const Event &e) :
+ m_name(""),
+ m_accidentalHeights(0)
+{
+ checkMap();
+ if (e.getType() != EventType) {
+ std::cerr << Event::BadType
+ ("Key model event", EventType, e.getType()).getMessage()
+ << std::endl;
+ return;
+ }
+ e.get<String>(KeyPropertyName, m_name);
+ if (m_keyDetailMap.find(m_name) == m_keyDetailMap.end()) {
+ std::cerr << BadKeyName
+ ("No such key as \"" + m_name + "\"").getMessage() << std::endl;
+ return;
+ }
+}
+
+Key::Key(const std::string &name) :
+ m_name(name),
+ m_accidentalHeights(0)
+{
+ checkMap();
+ if (m_keyDetailMap.find(m_name) == m_keyDetailMap.end()) {
+ throw BadKeyName("No such key as \"" + m_name + "\"");
+ }
+}
+
+Key::Key(int accidentalCount, bool isSharp, bool isMinor) :
+ m_accidentalHeights(0)
+{
+ checkMap();
+ for (KeyDetailMap::const_iterator i = m_keyDetailMap.begin();
+ i != m_keyDetailMap.end(); ++i) {
+ if ((*i).second.m_sharpCount == accidentalCount &&
+ (*i).second.m_minor == isMinor &&
+ ((*i).second.m_sharps == isSharp ||
+ (*i).second.m_sharpCount == 0)) {
+ m_name = (*i).first;
+ return;
+ }
+ }
+
+#if (__GNUC__ < 3)
+ std::ostrstream os;
+#else
+ std::ostringstream os;
+#endif
+
+ os << "No " << (isMinor ? "minor" : "major") << " key with "
+ << accidentalCount << (isSharp ? " sharp(s)" : " flat(s)");
+
+#if (__GNUC__ < 3)
+ os << std::ends;
+#endif
+
+ throw BadKeySpec(os.str());
+}
+
+// Unfortunately this is ambiguous -- e.g. B major / Cb major.
+// We need an isSharp argument, but we already have a constructor
+// with that signature. Not quite sure what's the best solution.
+
+Key::Key(int tonicPitch, bool isMinor) :
+ m_accidentalHeights(0)
+{
+ checkMap();
+ for (KeyDetailMap::const_iterator i = m_keyDetailMap.begin();
+ i != m_keyDetailMap.end(); ++i) {
+ if ((*i).second.m_tonicPitch == tonicPitch &&
+ (*i).second.m_minor == isMinor) {
+ m_name = (*i).first;
+ return;
+ }
+ }
+
+#if (__GNUC__ < 3)
+ std::ostrstream os;
+#else
+ std::ostringstream os;
+#endif
+
+ os << "No " << (isMinor ? "minor" : "major") << " key with tonic pitch "
+ << tonicPitch;
+
+#if (__GNUC__ < 3)
+ os << std::ends;
+#endif
+
+ throw BadKeySpec(os.str());
+}
+
+
+Key::Key(const Key &kc) :
+ m_name(kc.m_name),
+ m_accidentalHeights(0)
+{
+}
+
+Key& Key::operator=(const Key &kc)
+{
+ m_name = kc.m_name;
+ m_accidentalHeights = 0;
+ return *this;
+}
+
+bool Key::isValid(const Event &e)
+{
+ if (e.getType() != EventType) return false;
+ std::string name;
+ e.get<String>(KeyPropertyName, name);
+ if (m_keyDetailMap.find(name) == m_keyDetailMap.end()) return false;
+ return true;
+}
+
+Key::KeyList Key::getKeys(bool minor)
+{
+ checkMap();
+ KeyList result;
+ for (KeyDetailMap::const_iterator i = m_keyDetailMap.begin();
+ i != m_keyDetailMap.end(); ++i) {
+ if ((*i).second.m_minor == minor) {
+ result.push_back(Key((*i).first));
+ }
+ }
+ return result;
+}
+
+Key::Key Key::transpose(int pitchDelta, int heightDelta)
+{
+ Pitch tonic(getTonicPitch());
+ Pitch newTonic = tonic.transpose(*this, pitchDelta, heightDelta);
+ int newTonicPitch = (newTonic.getPerformancePitch() % 12 + 12) % 12;
+ return Key (newTonicPitch, isMinor());
+}
+
+Accidental Key::getAccidentalAtHeight(int height, const Clef &clef) const
+{
+ checkAccidentalHeights();
+ height = canonicalHeight(height);
+ for (unsigned int i = 0; i < m_accidentalHeights->size(); ++i) {
+ if (height ==static_cast<int>(canonicalHeight((*m_accidentalHeights)[i] +
+ clef.getPitchOffset()))) {
+ return isSharp() ? Sharp : Flat;
+ }
+ }
+ return NoAccidental;
+}
+
+Accidental Key::getAccidentalForStep(int step) const
+{
+ if (isMinor()) {
+ step = (step + 5) % 7;
+ }
+
+ int accidentalCount = getAccidentalCount();
+
+ if (accidentalCount == 0) {
+ return NoAccidental;
+ }
+
+ bool sharp = isSharp();
+
+ int currentAccidentalPosition = sharp ? 6 : 3;
+
+ for (int i = 1; i <= accidentalCount; i++) {
+ if (step == currentAccidentalPosition) {
+ return sharp ? Sharp : Flat;
+ }
+
+ currentAccidentalPosition =
+ (currentAccidentalPosition + (sharp ? 3 : 4)) % 7;
+ }
+
+ return NoAccidental;
+}
+
+vector<int> Key::getAccidentalHeights(const Clef &clef) const
+{
+ // staff positions of accidentals
+ checkAccidentalHeights();
+ vector<int> v(*m_accidentalHeights);
+ int offset = clef.getPitchOffset();
+
+ for (unsigned int i = 0; i < v.size(); ++i) {
+ v[i] += offset;
+ if (offset > 0)
+ if (v[i] > 8) v[i] -= 7;
+ }
+ return v;
+}
+
+void Key::checkAccidentalHeights() const
+{
+ if (m_accidentalHeights) return;
+ m_accidentalHeights = new vector<int>;
+
+ bool sharp = isSharp();
+ int accidentals = getAccidentalCount();
+ int height = sharp ? 8 : 4;
+
+ for (int i = 0; i < accidentals; ++i) {
+ m_accidentalHeights->push_back(height);
+ if (sharp) { height -= 3; if (height < 3) height += 7; }
+ else { height += 3; if (height > 7) height -= 7; }
+ }
+}
+
+int Key::convertFrom(int p, const Key &previousKey,
+ const Accidental &explicitAccidental) const
+{
+ Pitch pitch(p, explicitAccidental);
+ int height = pitch.getHeightOnStaff(Clef(), previousKey);
+ Pitch newPitch(height, Clef(), *this, explicitAccidental);
+ return newPitch.getPerformancePitch();
+}
+
+int Key::transposeFrom(int pitch, const Key &previousKey) const
+{
+ int delta = getTonicPitch() - previousKey.getTonicPitch();
+ if (delta > 6) delta -= 12;
+ if (delta < -6) delta += 12;
+ return pitch + delta;
+}
+
+Event *Key::getAsEvent(timeT absoluteTime) const
+{
+ Event *e = new Event(EventType, absoluteTime, 0, EventSubOrdering);
+ e->set<String>(KeyPropertyName, m_name);
+ return e;
+}
+
+
+void Key::checkMap() {
+ if (!m_keyDetailMap.empty()) return;
+
+ m_keyDetailMap["A major" ] = KeyDetails(true, false, 3, "F# minor", "A maj / F# min", 9);
+ m_keyDetailMap["F# minor"] = KeyDetails(true, true, 3, "A major", "A maj / F# min", 6);
+ m_keyDetailMap["Ab major"] = KeyDetails(false, false, 4, "F minor", "Ab maj / F min", 8);
+ m_keyDetailMap["F minor" ] = KeyDetails(false, true, 4, "Ab major", "Ab maj / F min", 5);
+ m_keyDetailMap["B major" ] = KeyDetails(true, false, 5, "G# minor", "B maj / G# min", 11);
+ m_keyDetailMap["G# minor"] = KeyDetails(true, true, 5, "B major", "B maj / G# min", 8);
+ m_keyDetailMap["Bb major"] = KeyDetails(false, false, 2, "G minor", "Bb maj / G min", 10);
+ m_keyDetailMap["G minor" ] = KeyDetails(false, true, 2, "Bb major", "Bb maj / G min", 7);
+ m_keyDetailMap["C major" ] = KeyDetails(true, false, 0, "A minor", "C maj / A min", 0);
+ m_keyDetailMap["A minor" ] = KeyDetails(false, true, 0, "C major", "C maj / A min", 9);
+ m_keyDetailMap["Cb major"] = KeyDetails(false, false, 7, "Ab minor", "Cb maj / Ab min", 11);
+ m_keyDetailMap["Ab minor"] = KeyDetails(false, true, 7, "Cb major", "Cb maj / Ab min", 8);
+ m_keyDetailMap["C# major"] = KeyDetails(true, false, 7, "A# minor", "C# maj / A# min", 1);
+ m_keyDetailMap["A# minor"] = KeyDetails(true, true, 7, "C# major", "C# maj / A# min", 10);
+ m_keyDetailMap["D major" ] = KeyDetails(true, false, 2, "B minor", "D maj / B min", 2);
+ m_keyDetailMap["B minor" ] = KeyDetails(true, true, 2, "D major", "D maj / B min", 11);
+ m_keyDetailMap["Db major"] = KeyDetails(false, false, 5, "Bb minor", "Db maj / Bb min", 1);
+ m_keyDetailMap["Bb minor"] = KeyDetails(false, true, 5, "Db major", "Db maj / Bb min", 10);
+ m_keyDetailMap["E major" ] = KeyDetails(true, false, 4, "C# minor", "E maj / C# min", 4);
+ m_keyDetailMap["C# minor"] = KeyDetails(true, true, 4, "E major", "E maj / C# min", 1);
+ m_keyDetailMap["Eb major"] = KeyDetails(false, false, 3, "C minor", "Eb maj / C min", 3);
+ m_keyDetailMap["C minor" ] = KeyDetails(false, true, 3, "Eb major", "Eb maj / C min", 0);
+ m_keyDetailMap["F major" ] = KeyDetails(false, false, 1, "D minor", "F maj / D min", 5);
+ m_keyDetailMap["D minor" ] = KeyDetails(false, true, 1, "F major", "F maj / D min", 2);
+ m_keyDetailMap["F# major"] = KeyDetails(true, false, 6, "D# minor", "F# maj / D# min", 6);
+ m_keyDetailMap["D# minor"] = KeyDetails(true, true, 6, "F# major", "F# maj / D# min", 3);
+ m_keyDetailMap["G major" ] = KeyDetails(true, false, 1, "E minor", "G maj / E min", 7);
+ m_keyDetailMap["E minor" ] = KeyDetails(true, true, 1, "G major", "G maj / E min", 4);
+ m_keyDetailMap["Gb major"] = KeyDetails(false, false, 6, "Eb minor", "Gb maj / Eb min", 6);
+ m_keyDetailMap["Eb minor"] = KeyDetails(false, true, 6, "Gb major", "Gb maj / Eb min", 3);
+}
+
+
+Key::KeyDetails::KeyDetails()
+ : m_sharps(false), m_minor(false), m_sharpCount(0),
+ m_equivalence(""), m_rg2name(""), m_tonicPitch(0)
+{
+}
+
+Key::KeyDetails::KeyDetails(bool sharps, bool minor, int sharpCount,
+ std::string equivalence, std::string rg2name,
+ int tonicPitch)
+ : m_sharps(sharps), m_minor(minor), m_sharpCount(sharpCount),
+ m_equivalence(equivalence), m_rg2name(rg2name), m_tonicPitch(tonicPitch)
+{
+}
+
+Key::KeyDetails::KeyDetails(const Key::KeyDetails &d)
+ : m_sharps(d.m_sharps), m_minor(d.m_minor),
+ m_sharpCount(d.m_sharpCount), m_equivalence(d.m_equivalence),
+ m_rg2name(d.m_rg2name), m_tonicPitch(d.m_tonicPitch)
+{
+}
+
+Key::KeyDetails& Key::KeyDetails::operator=(const Key::KeyDetails &d)
+{
+ if (&d == this) return *this;
+ m_sharps = d.m_sharps; m_minor = d.m_minor;
+ m_sharpCount = d.m_sharpCount; m_equivalence = d.m_equivalence;
+ m_rg2name = d.m_rg2name; m_tonicPitch = d.m_tonicPitch;
+ return *this;
+}
+
+//////////////////////////////////////////////////////////////////////
+// Indication
+//////////////////////////////////////////////////////////////////////
+
+const std::string Indication::EventType = "indication";
+const int Indication::EventSubOrdering = -50;
+const PropertyName Indication::IndicationTypePropertyName = "indicationtype";
+//const PropertyName Indication::IndicationDurationPropertyName = "indicationduration";
+static const PropertyName IndicationDurationPropertyName = "indicationduration";//!!!
+
+const std::string Indication::Slur = "slur";
+const std::string Indication::PhrasingSlur = "phrasingslur";
+const std::string Indication::Crescendo = "crescendo";
+const std::string Indication::Decrescendo = "decrescendo";
+const std::string Indication::Glissando = "glissando";
+const std::string Indication::QuindicesimaUp = "ottava2up";
+const std::string Indication::OttavaUp = "ottavaup";
+const std::string Indication::OttavaDown = "ottavadown";
+const std::string Indication::QuindicesimaDown = "ottava2down";
+
+Indication::Indication(const Event &e)
+{
+ if (e.getType() != EventType) {
+ throw Event::BadType("Indication model event", EventType, e.getType());
+ }
+ std::string s;
+ e.get<String>(IndicationTypePropertyName, s);
+ if (!isValid(s)) {
+ throw BadIndicationName("No such indication as \"" + s + "\"");
+ }
+ m_indicationType = s;
+
+ m_duration = e.getDuration();
+ if (m_duration == 0) {
+ e.get<Int>(IndicationDurationPropertyName, m_duration); // obsolete property
+ }
+}
+
+Indication::Indication(const std::string &s, timeT indicationDuration)
+{
+ if (!isValid(s)) {
+ throw BadIndicationName("No such indication as \"" + s + "\"");
+ }
+ m_indicationType = s;
+ m_duration = indicationDuration;
+}
+
+Indication &
+Indication::operator=(const Indication &m)
+{
+ if (&m != this) {
+ m_indicationType = m.m_indicationType;
+ m_duration = m.m_duration;
+ }
+ return *this;
+}
+
+Event *
+Indication::getAsEvent(timeT absoluteTime) const
+{
+ Event *e = new Event(EventType, absoluteTime, m_duration, EventSubOrdering);
+ e->set<String>(IndicationTypePropertyName, m_indicationType);
+
+ // Set this obsolete property as well, as otherwise we could actually
+ // crash earlier versions of RG by loading files exported from this one!
+ e->set<Int>(IndicationDurationPropertyName, m_duration);
+
+ return e;
+}
+
+bool
+Indication::isValid(const std::string &s) const
+{
+ return
+ (s == Slur || s == PhrasingSlur ||
+ s == Crescendo || s == Decrescendo ||
+ s == Glissando ||
+ s == QuindicesimaUp || s == OttavaUp ||
+ s == OttavaDown || s == QuindicesimaDown);
+}
+
+
+
+//////////////////////////////////////////////////////////////////////
+// Text
+//////////////////////////////////////////////////////////////////////
+
+const std::string Text::EventType = "text";
+const int Text::EventSubOrdering = -70;
+const PropertyName Text::TextPropertyName = "text";
+const PropertyName Text::TextTypePropertyName = "type";
+const PropertyName Text::LyricVersePropertyName = "verse";
+
+// text styles
+const std::string Text::UnspecifiedType = "unspecified";
+const std::string Text::StaffName = "staffname";
+const std::string Text::ChordName = "chordname";
+const std::string Text::KeyName = "keyname";
+const std::string Text::Dynamic = "dynamic";
+const std::string Text::Lyric = "lyric";
+const std::string Text::Chord = "chord";
+const std::string Text::Direction = "direction";
+const std::string Text::LocalDirection = "local_direction";
+const std::string Text::Tempo = "tempo";
+const std::string Text::LocalTempo = "local_tempo";
+const std::string Text::Annotation = "annotation";
+const std::string Text::LilyPondDirective = "lilypond_directive";
+
+// special LilyPond directives
+const std::string Text::Segno = "Segno";
+const std::string Text::Coda = "Coda";
+const std::string Text::Alternate1 = "Alt1 ->";
+const std::string Text::Alternate2 = "Alt2 ->";
+const std::string Text::BarDouble = "|| ->";
+const std::string Text::BarEnd = "|. ->";
+const std::string Text::BarDot = ": ->";
+const std::string Text::Gliss = "Gliss.";
+const std::string Text::Arpeggio = "Arp.";
+//const std::string Text::ArpeggioUp = "Arp.^";
+//const std::string Text::ArpeggioDn = "Arp._";
+const std::string Text::Tiny = "tiny ->";
+const std::string Text::Small = "small ->";
+const std::string Text::NormalSize = "norm. ->";
+
+Text::Text(const Event &e) :
+ m_verse(0)
+{
+ if (e.getType() != EventType) {
+ throw Event::BadType("Text model event", EventType, e.getType());
+ }
+
+ m_text = "";
+ m_type = Text::UnspecifiedType;
+
+ e.get<String>(TextPropertyName, m_text);
+ e.get<String>(TextTypePropertyName, m_type);
+ e.get<Int>(LyricVersePropertyName, m_verse);
+}
+
+Text::Text(const std::string &s, const std::string &type) :
+ m_text(s),
+ m_type(type),
+ m_verse(0)
+{
+ // nothing else
+}
+
+Text::Text(const Text &t) :
+ m_text(t.m_text),
+ m_type(t.m_type),
+ m_verse(t.m_verse)
+{
+ // nothing else
+}
+
+Text &
+Text::operator=(const Text &t)
+{
+ if (&t != this) {
+ m_text = t.m_text;
+ m_type = t.m_type;
+ m_verse = t.m_verse;
+ }
+ return *this;
+}
+
+Text::~Text()
+{
+ // nothing
+}
+
+bool
+Text::isTextOfType(Event *e, std::string type)
+{
+ return (e->isa(EventType) &&
+ e->has(TextTypePropertyName) &&
+ e->get<String>(TextTypePropertyName) == type);
+}
+
+std::vector<std::string>
+Text::getUserStyles()
+{
+ std::vector<std::string> v;
+
+ v.push_back(Dynamic);
+ v.push_back(Direction);
+ v.push_back(LocalDirection);
+ v.push_back(Tempo);
+ v.push_back(LocalTempo);
+ v.push_back(Chord);
+ v.push_back(Lyric);
+ v.push_back(Annotation);
+ v.push_back(LilyPondDirective);
+
+ return v;
+}
+
+std::vector<std::string>
+Text::getLilyPondDirectives()
+{
+ std::vector<std::string> v;
+
+ v.push_back(Alternate1);
+ v.push_back(Alternate2);
+ v.push_back(Segno);
+ v.push_back(Coda);
+ v.push_back(BarDouble);
+ v.push_back(BarEnd);
+ v.push_back(BarDot);
+ v.push_back(Gliss);
+ v.push_back(Arpeggio);
+// v.push_back(ArpeggioUp);
+// v.push_back(ArpeggioDn);
+ v.push_back(Tiny);
+ v.push_back(Small);
+ v.push_back(NormalSize);
+
+ return v;
+}
+
+Event *
+Text::getAsEvent(timeT absoluteTime) const
+{
+ Event *e = new Event(EventType, absoluteTime, 0, EventSubOrdering);
+ e->set<String>(TextPropertyName, m_text);
+ e->set<String>(TextTypePropertyName, m_type);
+ if (m_type == Lyric) e->set<Int>(LyricVersePropertyName, m_verse);
+ return e;
+}
+
+bool
+pitchInKey(int pitch, const Key& key)
+{
+ int pitchOffset = (pitch - key.getTonicPitch() + 12) % 12;
+
+ static int pitchInMajor[] =
+ { true, false, true, false, true, true, false, true, false, true, false, true };
+ static int pitchInMinor[] =
+ { true, false, true, true, false, true, false, true, true, false, true, false };
+
+ if (key.isMinor()) {
+ return pitchInMinor[pitchOffset];
+ }
+ else {
+ return pitchInMajor[pitchOffset];
+ }
+}
+
+/**
+ * @param pitch in the range 0..11 (C..B)
+ *
+ * @author Arnout Engelen
+ */
+Accidental
+resolveNoAccidental(int pitch,
+ const Key &key,
+ NoAccidentalStrategy noAccidentalStrategy)
+{
+ Accidental outputAccidental = "";
+
+ // Find out the accidental to use, based on the strategy specified
+ switch (noAccidentalStrategy) {
+ case UseKeySharpness:
+ noAccidentalStrategy =
+ key.isSharp() ? UseSharps : UseFlats;
+ // fall though
+ case UseFlats:
+ // shares code with UseSharps
+ case UseSharps:
+ if (pitchInKey(pitch, key)) {
+ outputAccidental = NoAccidental;
+ }
+ else {
+ if (noAccidentalStrategy == UseSharps) {
+ outputAccidental = Sharp;
+ }
+ else {
+ outputAccidental = Flat;
+ }
+ }
+ break;
+ case UseKey:
+ // the distance of the pitch from the tonic of the current
+ // key
+ int pitchOffset = (pitch - key.getTonicPitch() + 12) % 12;
+ // 0: major, 1: minor
+ int minor = key.isMinor();
+ static int pitchToHeight[2][12] =
+ {
+ { 0, 0, 1, 2, 2, 3, 3, 4, 5, 5, 6, 6 },
+ // a ., b, c, ., d, ., e, f, ., g, .
+ { 0, 1, 1, 2, 2, 3, 4, 4, 5, 5, 6, 6 }
+ };
+
+ // map pitchOffset to the extra correction, on top of any
+ // accidentals in the key. Example: in F major, with a pitchOffset
+ // of 6, the resulting height would be 3 (Bb) and the correction
+ // would be +1, so the resulting note would be B-natural
+ static int pitchToCorrection[2][12] =
+ {
+ { 0, +1, 0, -1, 0, 0, +1, 0, -1, 0, -1, 0 },
+ { 0, -1, 0, 0, +1, 0, -1, 0, 0, +1, 0, +1 }
+ };
+
+ int correction = pitchToCorrection[minor][pitchOffset];
+
+ // Get the accidental normally associated with this height in this
+ // key.
+ Accidental normalAccidental = key.getAccidentalForStep(pitchToHeight[minor][pitchOffset]);
+
+ // Apply the pitchCorrection and get the outputAccidental
+ outputAccidental = Accidentals::getAccidental(
+ getPitchOffset(normalAccidental) + correction);
+
+ }
+
+ return outputAccidental;
+}
+
+/**
+ * @param pitch in the range 0..11 (C..B)
+ *
+ * @author Michael McIntyre
+ */
+void
+resolveSpecifiedAccidental(int pitch,
+ const Clef &clef,
+ const Key &key,
+ int &height,
+ int &octave,
+ Accidental &inputAccidental,
+ Accidental &outputAccidental)
+{
+ // 4. Get info from the Key
+ long accidentalCount = key.getAccidentalCount();
+ bool keyIsSharp = key.isSharp(), keyIsFlat = !keyIsSharp;
+
+ // Calculate the flags needed for resolving accidentals against the key.
+ // First we initialize them false...
+ bool keyHasSharpC = false, keyHasSharpD = false, keyHasSharpE = false,
+ keyHasSharpF = false, keyHasSharpG = false, keyHasSharpA = false,
+ keyHasSharpB = false, keyHasFlatC = false, keyHasFlatD = false,
+ keyHasFlatE = false, keyHasFlatF = false, keyHasFlatG = false,
+ keyHasFlatA = false, keyHasFlatB = false;
+
+ // Then we use "trip points" based on the flat/sharp state of the key and
+ // its number of accidentals to set the flags:
+ if (keyIsSharp) {
+ switch (accidentalCount) {
+ case 7: keyHasSharpB = true;
+ case 6: keyHasSharpE = true;
+ case 5: keyHasSharpA = true;
+ case 4: keyHasSharpD = true;
+ case 3: keyHasSharpG = true;
+ case 2: keyHasSharpC = true;
+ case 1: keyHasSharpF = true;
+ }
+ } else {
+ switch (accidentalCount) {
+ case 7: keyHasFlatF = true;
+ case 6: keyHasFlatC = true;
+ case 5: keyHasFlatG = true;
+ case 4: keyHasFlatD = true;
+ case 3: keyHasFlatA = true;
+ case 2: keyHasFlatE = true;
+ case 1: keyHasFlatB = true;
+ }
+ }
+
+
+ // 5. Determine height on staff and accidental note should display with for key...
+ //
+ // Every position on the staff is one of six accidental states:
+ //
+ // Natural, Sharp, Flat, DoubleSharp, DoubleFlat, NoAccidental
+ //
+ // DoubleSharp and DoubleFlat are always user-specified accidentals, so
+ // they are always used to decide how to draw the note, and they are
+ // always passed along unchanged.
+ //
+ // The Natural state indicates that a note is or might be going against
+ // the key. Since the Natural state will always be attached to a plain
+ // pitch that can never resolve to a "black key" note, it is not necessary
+ // to handle this case differently unless the key has "white key" notes
+ // that are supposed to take accidentals for the key. (eg. Cb Gb B C# major)
+ // For most keys we treat it the same as a NoAccidental, and use the key
+ // to decide where to draw the note, and what accidental to return.
+ //
+ // The Sharp and Flat states indicate that a user has specified an
+ // accidental for the note, and it might be "out of key." We check to see
+ // if that's the case. If the note is "in key" then the extra accidental
+ // property is removed, and we return NoAccidental. If the note is "out of
+ // key" then the Sharp or Flat is used to decide where to draw the note, and
+ // the accidental is passed along unchanged. (Incomplete? Will a failure
+ // to always pass along the accidental cause strange behavior if a user
+ // specifies an explicit Bb in key of F and then transposes to G, wishing
+ // the Bb to remain an explicit Bb? If someone complains, I'll know where
+ // to look.)
+ //
+ // The NoAccidental state is a default state. We have nothing else upon
+ // which to base a decision in this case, so we make the best decisions
+ // possible using only the pitch and key. Notes that are "in key" pass on
+ // with NoAccidental preserved, otherwise we return an appropriate
+ // accidental for the key.
+
+ // We calculate height on a virtual staff, and then make necessary adjustments to
+ // translate them onto a particular Clef later on...
+ //
+ // ---------F--------- Staff Height Note(semitone) for each of five states:
+ // E
+ // ---------D--------- Natural| Sharp | Flat |DblSharp| DblFlat
+ // C | | | |
+ // ---------B--------- height 4 B(11) | B#( 0) | Bb(10) | Bx( 1) | Bbb( 9)
+ // A height 3 A( 9) | A#(10) | Ab( 8) | Ax(11) | Abb( 7)
+ // ---------G--------- height 2 G( 7) | G#( 8) | Gb( 6) | Gx( 9) | Gbb( 5)
+ // F height 1 F( 5) | F#( 6) | Fb( 4) | Fx( 7) | Fbb( 3)
+ // ---------E--------- height 0 E( 4) | E#( 5) | Eb( 3) | Ex( 6) | Ebb( 2)
+ // D height -1 D( 2) | D#( 3) | Db( 1) | Dx( 4) | Dbb( 0)
+ // ---C---- height -2 C( 0) | C#( 1) | Cb(11) | Cx( 2) | Cbb(10)
+
+
+ // use these constants instead of numeric literals in order to reduce the
+ // chance of making incorrect height assignments...
+ const int C = -2, D = -1, E = 0, F = 1, G = 2, A = 3, B = 4;
+
+ // Here we do the actual work of making all the decisions explained above.
+ switch (pitch) {
+ case 0 :
+ if (inputAccidental == Sharp || // B#
+ (inputAccidental == NoAccidental && keyHasSharpB)) {
+ height = B;
+ octave--;
+ outputAccidental = (keyHasSharpB) ? NoAccidental : Sharp;
+ } else if (inputAccidental == DoubleFlat) { // Dbb
+ height = D;
+ outputAccidental = DoubleFlat;
+ } else {
+ height = C; // C or C-Natural
+ outputAccidental = (keyHasFlatC || keyHasSharpC ||
+ (keyHasSharpB &&
+ inputAccidental == Natural)) ? Natural : NoAccidental;
+ }
+ break;
+ case 1 :
+ if (inputAccidental == Sharp || // C#
+ (inputAccidental == NoAccidental && keyIsSharp)) {
+ height = C;
+ outputAccidental = (keyHasSharpC) ? NoAccidental : Sharp;
+ } else if (inputAccidental == Flat || // Db
+ (inputAccidental == NoAccidental && keyIsFlat)) {
+ height = D;
+ outputAccidental = (keyHasFlatD) ? NoAccidental : Flat;
+ } else if (inputAccidental == DoubleSharp) { // Bx
+ height = B;
+ octave--;
+ outputAccidental = DoubleSharp;
+ }
+ break;
+ case 2 :
+ if (inputAccidental == DoubleSharp) { // Cx
+ height = C;
+ outputAccidental = DoubleSharp;
+ } else if (inputAccidental == DoubleFlat) { // Ebb
+ height = E;
+ outputAccidental = DoubleFlat;
+ } else { // D or D-Natural
+ height = D;
+ outputAccidental = (keyHasSharpD || keyHasFlatD) ? Natural : NoAccidental;
+ }
+ break;
+ case 3 :
+ if (inputAccidental == Sharp || // D#
+ (inputAccidental == NoAccidental && keyIsSharp)) {
+ height = D;
+ outputAccidental = (keyHasSharpD) ? NoAccidental : Sharp;
+ } else if (inputAccidental == Flat || // Eb
+ (inputAccidental == NoAccidental && keyIsFlat)) {
+ height = E;
+ outputAccidental = (keyHasFlatE) ? NoAccidental : Flat;
+ } else if (inputAccidental == DoubleFlat) { // Fbb
+ height = F;
+ outputAccidental = DoubleFlat;
+ }
+ break;
+ case 4 :
+ if (inputAccidental == Flat || // Fb
+ (inputAccidental == NoAccidental && keyHasFlatF)) {
+ height = F;
+ outputAccidental = (keyHasFlatF) ? NoAccidental : Flat;
+ } else if (inputAccidental == DoubleSharp) { // Dx
+ height = D;
+ outputAccidental = DoubleSharp;
+ } else { // E or E-Natural
+ height = E;
+ outputAccidental = (keyHasSharpE || keyHasFlatE ||
+ (keyHasFlatF && inputAccidental==Natural)) ?
+ Natural : NoAccidental;
+ }
+ break;
+ case 5 :
+ if (inputAccidental == Sharp || // E#
+ (inputAccidental == NoAccidental && keyHasSharpE)) {
+ height = E;
+ outputAccidental = (keyHasSharpE) ? NoAccidental : Sharp;
+ } else if (inputAccidental == DoubleFlat) { // Gbb
+ height = G;
+ outputAccidental = DoubleFlat;
+ } else { // F or F-Natural
+ height = F;
+ outputAccidental = (keyHasSharpF || keyHasFlatF ||
+ (keyHasSharpE && inputAccidental==Natural))?
+ Natural : NoAccidental;
+ }
+ break;
+ case 6 :
+ if (inputAccidental == Sharp ||
+ (inputAccidental == NoAccidental && keyIsSharp)) { // F#
+ height = F;
+ outputAccidental = (keyHasSharpF) ? NoAccidental : Sharp;
+ } else if (inputAccidental == Flat || // Gb
+ (inputAccidental == NoAccidental && keyIsFlat)) {
+ height = G;
+ outputAccidental = (keyHasFlatG) ? NoAccidental : Flat;
+ } else if (inputAccidental == DoubleSharp) { // Ex
+ height = E;
+ outputAccidental = DoubleSharp;
+ }
+ break;
+ case 7 :
+ if (inputAccidental == DoubleSharp) { // Fx
+ height = F;
+ outputAccidental = DoubleSharp;
+ } else if (inputAccidental == DoubleFlat) { // Abb
+ height = A;
+ outputAccidental = DoubleFlat;
+ } else { // G or G-Natural
+ height = G;
+ outputAccidental = (keyHasSharpG || keyHasFlatG) ? Natural : NoAccidental;
+ }
+ break;
+ case 8 :
+ if (inputAccidental == Sharp ||
+ (inputAccidental == NoAccidental && keyIsSharp)) { // G#
+ height = G;
+ outputAccidental = (keyHasSharpG) ? NoAccidental : Sharp;
+ } else if (inputAccidental == Flat || // Ab
+ (inputAccidental == NoAccidental && keyIsFlat)) {
+ height = A;
+ outputAccidental = (keyHasFlatA) ? NoAccidental : Flat;
+ }
+ break;
+ case 9 :
+ if (inputAccidental == DoubleSharp) { // Gx
+ height = G;
+ outputAccidental = DoubleSharp;
+ } else if (inputAccidental == DoubleFlat) { // Bbb
+ height = B;
+ outputAccidental = DoubleFlat;
+ } else { // A or A-Natural
+ height = A;
+ outputAccidental = (keyHasSharpA || keyHasFlatA) ? Natural : NoAccidental;
+ }
+ break;
+ case 10:
+ if (inputAccidental == DoubleFlat) { // Cbb
+ height = C;
+ octave++; // tweak B/C divide
+ outputAccidental = DoubleFlat;
+ } else if (inputAccidental == Sharp || // A#
+ (inputAccidental == NoAccidental && keyIsSharp)) {
+ height = A;
+ outputAccidental = (keyHasSharpA) ? NoAccidental : Sharp;
+ } else if (inputAccidental == Flat || // Bb
+ (inputAccidental == NoAccidental && keyIsFlat)) {
+ height = B;
+ outputAccidental = (keyHasFlatB) ? NoAccidental : Flat;
+ }
+ break;
+ case 11:
+ if (inputAccidental == DoubleSharp) { // Ax
+ height = A;
+ outputAccidental = DoubleSharp;
+ } else if (inputAccidental == Flat || // Cb
+ (inputAccidental == NoAccidental && keyHasFlatC)) {
+ height = C;
+ octave++; // tweak B/C divide
+ outputAccidental = (keyHasFlatC) ? NoAccidental : Flat;
+ } else { // B or B-Natural
+ height = B;
+ outputAccidental = (keyHasSharpB || keyHasFlatB ||
+ (keyHasFlatC && inputAccidental==Natural)) ?
+ Natural : NoAccidental;
+ }
+ }
+
+ if (outputAccidental == NoAccidental && inputAccidental == Natural) {
+ outputAccidental = Natural;
+ }
+
+}
+
+bool
+Pitch::validAccidental() const
+{
+// std::cout << "Checking whether accidental is valid " << std::endl;
+ if (m_accidental == NoAccidental)
+ {
+ return true;
+ }
+ int naturalPitch = (m_pitch -
+ Accidentals::getPitchOffset(m_accidental) + 12) % 12;
+ switch(naturalPitch)
+ {
+ case 0: //C
+ return true;
+ case 1:
+ return false;
+ case 2: //D
+ return true;
+ case 3:
+ return false;
+ case 4: //E
+ return true;
+ case 5: //F
+ return true;
+ case 6:
+ return false;
+ case 7: //G
+ return true;
+ case 8:
+ return false;
+ case 9: //A
+ return true;
+ case 10:
+ return false;
+ case 11: //B
+ return true;
+ };
+ std::cout << "Internal error in validAccidental" << std::endl;
+ return false;
+}
+
+Event *
+Pitch::getAsNoteEvent(timeT absoluteTime, timeT duration) const
+{
+ Event *e = new Event(Note::EventType, absoluteTime, duration);
+ e->set<Int>(BaseProperties::PITCH, m_pitch);
+ e->set<String>(BaseProperties::ACCIDENTAL, m_accidental);
+ return e;
+}
+
+/**
+ * Converts performance pitch to height on staff + correct accidentals
+ * for current key.
+ *
+ * This method takes a Clef, Key, Accidental and raw performance pitch, then
+ * applies this information to return a height on staff value and an
+ * accidental state. The pitch itself contains a lot of information, but we
+ * need to use the Key and user-specified Accidental to make an accurate
+ * decision just where to put it on the staff, and what accidental it should
+ * display for (or against) the key.
+ *
+ * This function originally written by Chris Cannam for Rosegarden 2.1
+ * Entirely rewritten by Chris Cannam for Rosegarden 4
+ * Entirely rewritten by Hans Kieserman
+ * Entirely rewritten by Michael McIntyre
+ * This version by Michael McIntyre <[email protected]>
+ * Resolving the accidental was refactored out by Arnout Engelen
+ */
+void
+Pitch::rawPitchToDisplayPitch(int rawpitch,
+ const Clef &clef,
+ const Key &key,
+ int &height,
+ Accidental &accidental,
+ NoAccidentalStrategy noAccidentalStrategy)
+{
+
+ // 1. Calculate the octave (for later):
+ int octave = rawpitch / 12;
+
+ // 2. Set initial height to 0
+ height = 0;
+
+ // 3. Calculate raw semitone number, yielding a value between 0 (C) and
+ // 11 (B)
+ int pitch = rawpitch % 12;
+
+ // clear the in-coming accidental so we can trap any failure to re-set
+ // it on the way out:
+ Accidental userAccidental = accidental;
+ accidental = "";
+
+ if (userAccidental == NoAccidental || !Pitch(rawpitch, userAccidental).validAccidental())
+ {
+ userAccidental = resolveNoAccidental(pitch, key, noAccidentalStrategy);
+ //std::cout << "Chose accidental " << userAccidental << " for pitch " << pitch <<
+ // " in key " << key.getName() << std::endl;
+ }
+ //else
+ //{
+ // std::cout << "Accidental was specified, as " << userAccidental << std::endl;
+ //}
+
+ resolveSpecifiedAccidental(pitch, clef, key, height, octave, userAccidental, accidental);
+
+ // Failsafe... If this ever executes, there's trouble to fix...
+// WIP - DMM - munged up to explore #937389, which is temporarily deferred,
+// owing to its non-critical nature, having been hacked around in the LilyPond
+// code
+#ifndef DEBUG_PITCH
+ if (accidental == "") {
+ std::cerr << "Pitch::rawPitchToDisplayPitch(): error! returning null accidental for:"
+#else
+ std::cerr << "Pitch::rawPitchToDisplayPitch(): calculating: "
+#endif
+ << std::endl << "pitch: " << rawpitch << " (" << pitch << " in oct "
+ << octave << ") userAcc: " << userAccidental
+ << " clef: " << clef.getClefType() << " key: " << key.getName() << std::endl;
+#ifndef DEBUG_PITCH
+ }
+#endif
+
+
+ // 6. "Recenter" height in case it's been changed:
+ height = ((height + 2) % 7) - 2;
+
+ height += (octave - 5) * 7;
+ height += clef.getPitchOffset();
+
+
+ // 7. Transpose up or down for the clef:
+ height -= 7 * clef.getOctave();
+}
+
+void
+Pitch::displayPitchToRawPitch(int height,
+ Accidental accidental,
+ const Clef &clef,
+ const Key &key,
+ int &pitch,
+ bool ignoreOffset)
+{
+ int octave = 5;
+
+ // 1. Ask Key for accidental if necessary
+ if (accidental == NoAccidental) {
+ accidental = key.getAccidentalAtHeight(height, clef);
+ }
+
+ // 2. Get pitch and correct octave
+
+ if (!ignoreOffset) height -= clef.getPitchOffset();
+
+ while (height < 0) { octave -= 1; height += 7; }
+ while (height >= 7) { octave += 1; height -= 7; }
+
+ if (height > 4) ++octave;
+
+ // Height is now relative to treble clef lines
+ switch (height) {
+
+ case 0: pitch = 4; break; /* bottom line, treble clef: E */
+ case 1: pitch = 5; break; /* F */
+ case 2: pitch = 7; break; /* G */
+ case 3: pitch = 9; break; /* A, in next octave */
+ case 4: pitch = 11; break; /* B, likewise*/
+ case 5: pitch = 0; break; /* C, moved up an octave (see above) */
+ case 6: pitch = 2; break; /* D, likewise */
+ }
+ // Pitch is now "natural"-ized note at given height
+
+ // 3. Adjust pitch for accidental
+
+ if (accidental != NoAccidental &&
+ accidental != Natural) {
+ if (accidental == Sharp) { pitch++; }
+ else if (accidental == Flat) { pitch--; }
+ else if (accidental == DoubleSharp) { pitch += 2; }
+ else if (accidental == DoubleFlat) { pitch -= 2; }
+ }
+
+ // 4. Adjust for clef
+ octave += clef.getOctave();
+
+ pitch += 12 * octave;
+}
+
+
+
+Pitch::Pitch(const Event &e) :
+ // throw (Event::NoData)
+ m_accidental(NoAccidental)
+{
+ m_pitch = e.get<Int>(BaseProperties::PITCH);
+ e.get<String>(BaseProperties::ACCIDENTAL, m_accidental);
+}
+
+Pitch::Pitch(int performancePitch, const Accidental &explicitAccidental) :
+ m_pitch(performancePitch),
+ m_accidental(explicitAccidental)
+{
+ // nothing
+}
+
+Pitch::Pitch(int pitchInOctave, int octave,
+ const Accidental &explicitAccidental, int octaveBase) :
+ m_pitch((octave - octaveBase) * 12 + pitchInOctave),
+ m_accidental(explicitAccidental)
+{
+ // nothing else
+}
+
+Pitch::Pitch(int noteInScale, int octave, const Key &key,
+ const Accidental &explicitAccidental, int octaveBase) :
+ m_pitch(0),
+ m_accidental(explicitAccidental)
+{
+ m_pitch = (key.getTonicPitch());
+ m_pitch = (octave - octaveBase) * 12 + m_pitch % 12;
+
+ if (key.isMinor()) m_pitch += scale_Cminor_harmonic[noteInScale];
+ else m_pitch += scale_Cmajor[noteInScale];
+
+ m_pitch += Accidentals::getPitchOffset(m_accidental);
+}
+
+Pitch::Pitch(int noteInCMajor, int octave, int pitch,
+ int octaveBase) :
+ m_pitch(pitch)
+{
+ int natural = (octave - octaveBase) * 12 + scale_Cmajor[noteInCMajor];
+ m_accidental = Accidentals::getAccidental(pitch - natural);
+}
+
+
+Pitch::Pitch(char noteName, int octave, const Key &key,
+ const Accidental &explicitAccidental, int octaveBase) :
+ m_pitch(0),
+ m_accidental(explicitAccidental)
+{
+ int height = getIndexForNote(noteName) - 2;
+ displayPitchToRawPitch(height, explicitAccidental,
+ Clef(), key, m_pitch);
+
+ // we now have the pitch within octave 5 (C == 60) -- though it
+ // might have spilled over at either end
+ if (m_pitch < 60) --octave;
+ if (m_pitch > 71) ++octave;
+ m_pitch = (octave - octaveBase) * 12 + m_pitch % 12;
+}
+
+Pitch::Pitch(int heightOnStaff, const Clef &clef, const Key &key,
+ const Accidental &explicitAccidental) :
+ m_pitch(0),
+ m_accidental(explicitAccidental)
+{
+ displayPitchToRawPitch
+ (heightOnStaff, explicitAccidental, clef, key, m_pitch);
+}
+
+Pitch::Pitch(const Pitch &p) :
+ m_pitch(p.m_pitch),
+ m_accidental(p.m_accidental)
+{
+ // nothing else
+}
+
+Pitch &
+Pitch::operator=(const Pitch &p)
+{
+ if (&p != this) {
+ m_pitch = p.m_pitch;
+ m_accidental = p.m_accidental;
+ }
+ return *this;
+}
+
+int
+Pitch::getPerformancePitch() const
+{
+ return m_pitch;
+}
+
+Accidental
+Pitch::getAccidental(bool useSharps) const
+{
+ return getDisplayAccidental(Key("C major"),
+ useSharps ? UseSharps : UseFlats);
+}
+
+Accidental
+Pitch::getAccidental(const Key &key) const
+{
+ if (m_accidental == NoAccidental || !validAccidental())
+ {
+ Accidental retval = resolveNoAccidental(m_pitch, key, UseKey);
+ //std::cout << "Resolved No/invalid accidental: chose " << retval << std::endl;
+ return retval;
+ }
+ else
+ {
+ //std::cout << "Returning specified accidental" << std::endl;
+ return m_accidental;
+ }
+}
+
+Accidental
+Pitch::getDisplayAccidental(const Key &key) const
+{
+ return getDisplayAccidental(key, UseKey);
+}
+
+Accidental
+Pitch::getDisplayAccidental(const Key &key, NoAccidentalStrategy noAccidentalStrategy) const
+{
+ int heightOnStaff;
+ Accidental accidental(m_accidental);
+ rawPitchToDisplayPitch(m_pitch, Clef(), key, heightOnStaff, accidental, noAccidentalStrategy);
+ return accidental;
+}
+
+int
+Pitch::getNoteInScale(const Key &key) const
+{
+ int p = m_pitch;
+ p -= key.getTonicPitch();
+ p -= Accidentals::getPitchOffset(getDisplayAccidental(key));
+ p += 24; // in case these calculations made it -ve
+ p %= 12;
+
+ if (key.isMinor()) return steps_Cminor_harmonic[p];
+ else return steps_Cmajor[p];
+}
+
+char
+Pitch::getNoteName(const Key &key) const
+{
+ int index = (getHeightOnStaff(Clef(Clef::Treble), key) + 72) % 7;
+ return getNoteForIndex(index);
+}
+
+int
+Pitch::getHeightOnStaff(const Clef &clef, const Key &key) const
+{
+ int heightOnStaff;
+ Accidental accidental(m_accidental);
+ rawPitchToDisplayPitch(m_pitch, clef, key, heightOnStaff, accidental, UseKey);
+ return heightOnStaff;
+}
+
+int
+Pitch::getHeightOnStaff(const Clef &clef, bool useSharps) const
+{
+ int heightOnStaff;
+ Accidental accidental(m_accidental);
+ rawPitchToDisplayPitch(m_pitch, clef, Key("C major"), heightOnStaff, accidental,
+ useSharps ? UseSharps : UseFlats);
+ return heightOnStaff;
+}
+
+int
+Pitch::getOctave(int octaveBase) const
+{
+ return m_pitch / 12 + octaveBase;
+}
+
+int
+Pitch::getPitchInOctave() const
+{
+ return m_pitch % 12;
+}
+
+bool
+Pitch::isDiatonicInKey(const Key &key) const
+{
+ if (getDisplayAccidental(key) == Accidentals::NoAccidental) return true;
+
+ // ### as used in the chord identifiers, this calls chords built on
+ // the raised sixth step diatonic -- may be correct, but it's
+ // misleading, as we're really looking for whether chords are
+ // often built on given tone
+
+ if (key.isMinor()) {
+ int stepsFromTonic = ((m_pitch - key.getTonicPitch() + 12) % 12);
+ if (stepsFromTonic == 9 || stepsFromTonic == 11) return true;
+ }
+
+ return false;
+}
+
+std::string
+Pitch::getAsString(bool useSharps, bool inclOctave, int octaveBase) const
+{
+ Accidental acc = getAccidental(useSharps);
+
+ std::string s;
+ s += getNoteName(useSharps ? Key("C major") : Key("A minor"));
+
+ if (acc == Accidentals::Sharp) s += "#";
+ else if (acc == Accidentals::Flat) s += "b";
+
+ if (!inclOctave) return s;
+
+ char tmp[10];
+ sprintf(tmp, "%s%d", s.c_str(), getOctave(octaveBase));
+ return std::string(tmp);
+}
+
+int
+Pitch::getIndexForNote(char noteName)
+{
+ if (islower(noteName)) noteName = toupper(noteName);
+ if (noteName < 'C') {
+ if (noteName < 'A') return 0; // error, really
+ else return noteName - 'A' + 5;
+ } else {
+ if (noteName > 'G') return 0; // error, really
+ else return noteName - 'C';
+ }
+}
+
+char
+Pitch::getNoteForIndex(int index)
+{
+ if (index < 0 || index > 6) return 'C'; // error, really
+ return "CDEFGAB"[index];
+}
+
+int
+Pitch::getPerformancePitchFromRG21Pitch(int heightOnStaff,
+ const Accidental &accidental,
+ const Clef &clef,
+ const Key &)
+{
+ // Rosegarden 2.1 pitches are a bit weird; see
+ // docs/data_struct/units.txt
+
+ // We pass the accidental and clef, a faked key of C major, and a
+ // flag telling displayPitchToRawPitch to ignore the clef offset
+ // and take only its octave into account
+
+ int p = 0;
+ displayPitchToRawPitch(heightOnStaff, accidental, clef, Key(), p, true);
+ return p;
+}
+
+Pitch Pitch::transpose(const Key &key, int pitchDelta, int heightDelta)
+{
+ // get old accidental
+ Accidental oldAccidental = getAccidental(key);
+
+ // get old step
+ // TODO: maybe we should write an oldPitchObj.getOctave(0, key) that takes into account accidentals
+ // properly (e.g. yielding '0' instead of '1' for B#0). For now workaround here.
+ Pitch oldPitchWithoutAccidental(getPerformancePitch() - Accidentals::getPitchOffset(oldAccidental), Natural);
+ Key cmaj = Key();
+ int oldStep = oldPitchWithoutAccidental.getNoteInScale(cmaj) + oldPitchWithoutAccidental.getOctave(0) * 7;
+
+ // calculate new pitch and step
+ int newPitch = getPerformancePitch() + pitchDelta;
+ int newStep = oldStep + heightDelta;
+
+ // could happen for example when transposing the tonic of a key downwards
+ if (newStep < 0 || newPitch < 0) {
+ newStep += 7;
+ newPitch += 12;
+ }
+
+ // should not happen
+ if (newStep < 0 || newPitch < 0) {
+ std::cerr << "Internal error in NotationTypes, Pitch::transpose()"
+ << std::endl;
+ }
+
+ // calculate new accidental for step
+ int pitchWithoutAccidental = ((newStep / 7) * 12 + scale_Cmajor[newStep % 7]);
+ int newAccidentalOffset = newPitch - pitchWithoutAccidental;
+
+ // construct pitch-object to return
+ Pitch newPitchObj(newPitch, Accidentals::getAccidental(newAccidentalOffset));
+ return newPitchObj;
+}
+
+//////////////////////////////////////////////////////////////////////
+// Note
+//////////////////////////////////////////////////////////////////////
+
+const string Note::EventType = "note";
+const string Note::EventRestType = "rest";
+const int Note::EventRestSubOrdering = 10;
+
+const timeT Note::m_shortestTime = basePPQ / 16;
+
+Note& Note::operator=(const Note &n)
+{
+ if (&n == this) return *this;
+ m_type = n.m_type;
+ m_dots = n.m_dots;
+ return *this;
+}
+
+timeT Note::getDurationAux() const
+{
+ int duration = m_shortestTime * (1 << m_type);
+ int extra = duration / 2;
+ for (int dots = m_dots; dots > 0; --dots) {
+ duration += extra;
+ extra /= 2;
+ }
+ return duration;
+}
+
+
+Note Note::getNearestNote(timeT duration, int maxDots)
+{
+ int tag = Shortest - 1;
+ timeT d(duration / m_shortestTime);
+ while (d > 0) { ++tag; d /= 2; }
+
+// cout << "Note::getNearestNote: duration " << duration <<
+// " leading to tag " << tag << endl;
+ if (tag < Shortest) return Note(Shortest);
+ if (tag > Longest) return Note(Longest, maxDots);
+
+ timeT prospective = Note(tag, 0).getDuration();
+ int dots = 0;
+ timeT extra = prospective / 2;
+
+ while (dots <= maxDots &&
+ dots <= tag) { // avoid TooManyDots exception from Note ctor
+ prospective += extra;
+ if (prospective > duration) return Note(tag, dots);
+ extra /= 2;
+ ++dots;
+// cout << "added another dot okay" << endl;
+ }
+
+ if (tag < Longest) return Note(tag + 1, 0);
+ else return Note(tag, std::max(maxDots, tag));
+}
+
+Event *Note::getAsNoteEvent(timeT absoluteTime, int pitch) const
+{
+ Event *e = new Event(EventType, absoluteTime, getDuration());
+ e->set<Int>(BaseProperties::PITCH, pitch);
+ return e;
+}
+
+Event *Note::getAsRestEvent(timeT absoluteTime) const
+{
+ Event *e = new Event(EventRestType, absoluteTime, getDuration());
+ return e;
+}
+
+
+
+//////////////////////////////////////////////////////////////////////
+// TimeSignature
+//////////////////////////////////////////////////////////////////////
+
+const string TimeSignature::EventType = "timesignature";
+const int TimeSignature::EventSubOrdering = -150;
+const PropertyName TimeSignature::NumeratorPropertyName = "numerator";
+const PropertyName TimeSignature::DenominatorPropertyName = "denominator";
+const PropertyName TimeSignature::ShowAsCommonTimePropertyName = "common";
+const PropertyName TimeSignature::IsHiddenPropertyName = "hidden";
+const PropertyName TimeSignature::HasHiddenBarsPropertyName = "hiddenbars";
+const TimeSignature TimeSignature::DefaultTimeSignature = TimeSignature(4, 4);
+
+TimeSignature::TimeSignature(int numerator, int denominator,
+ bool preferCommon, bool hidden, bool hiddenBars)
+ // throw (BadTimeSignature)
+ : m_numerator(numerator), m_denominator(denominator),
+ m_common(preferCommon &&
+ (m_denominator == m_numerator &&
+ (m_numerator == 2 || m_numerator == 4))),
+ m_hidden(hidden),
+ m_hiddenBars(hiddenBars)
+{
+ if (numerator < 1 || denominator < 1) {
+ throw BadTimeSignature("Numerator and denominator must be positive");
+ }
+}
+
+TimeSignature::TimeSignature(const Event &e)
+ // throw (Event::NoData, Event::BadType, BadTimeSignature)
+{
+ if (e.getType() != EventType) {
+ throw Event::BadType("TimeSignature model event", EventType, e.getType());
+ }
+ m_numerator = 4;
+ m_denominator = 4;
+
+ if (e.has(NumeratorPropertyName)) {
+ m_numerator = e.get<Int>(NumeratorPropertyName);
+ }
+
+ if (e.has(DenominatorPropertyName)) {
+ m_denominator = e.get<Int>(DenominatorPropertyName);
+ }
+
+ m_common = false;
+ e.get<Bool>(ShowAsCommonTimePropertyName, m_common);
+
+ m_hidden = false;
+ e.get<Bool>(IsHiddenPropertyName, m_hidden);
+
+ m_hiddenBars = false;
+ e.get<Bool>(HasHiddenBarsPropertyName, m_hiddenBars);
+
+ if (m_numerator < 1 || m_denominator < 1) {
+ throw BadTimeSignature("Numerator and denominator must be positive");
+ }
+}
+
+TimeSignature& TimeSignature::operator=(const TimeSignature &ts)
+{
+ if (&ts == this) return *this;
+ m_numerator = ts.m_numerator;
+ m_denominator = ts.m_denominator;
+ m_common = ts.m_common;
+ m_hidden = ts.m_hidden;
+ m_hiddenBars = ts.m_hiddenBars;
+ return *this;
+}
+
+timeT TimeSignature::getBarDuration() const
+{
+ setInternalDurations();
+ return m_barDuration;
+}
+
+timeT TimeSignature::getBeatDuration() const
+{
+ setInternalDurations();
+ return m_beatDuration;
+}
+
+timeT TimeSignature::getUnitDuration() const
+{
+ return m_crotchetTime * 4 / m_denominator;
+}
+
+Note::Type TimeSignature::getUnit() const
+{
+ int c, d;
+ for (c = 0, d = m_denominator; d > 1; d /= 2) ++c;
+ return Note::Semibreve - c;
+}
+
+bool TimeSignature::isDotted() const
+{
+ setInternalDurations();
+ return m_dotted;
+}
+
+Event *TimeSignature::getAsEvent(timeT absoluteTime) const
+{
+ Event *e = new Event(EventType, absoluteTime, 0, EventSubOrdering);
+ e->set<Int>(NumeratorPropertyName, m_numerator);
+ e->set<Int>(DenominatorPropertyName, m_denominator);
+ e->set<Bool>(ShowAsCommonTimePropertyName, m_common);
+ e->set<Bool>(IsHiddenPropertyName, m_hidden);
+ e->set<Bool>(HasHiddenBarsPropertyName, m_hiddenBars);
+ return e;
+}
+
+// This doesn't consider subdivisions of the bar larger than a beat in
+// any time other than 4/4, but it should handle the usual time signatures
+// correctly (compound time included).
+
+void TimeSignature::getDurationListForInterval(DurationList &dlist,
+ timeT duration,
+ timeT startOffset) const
+{
+ setInternalDurations();
+
+ timeT offset = startOffset;
+ timeT durationRemaining = duration;
+
+ while (durationRemaining > 0) {
+
+ // Everything in this loop is of the form, "if we're on a
+ // [unit] boundary and there's a [unit] of space left to fill,
+ // insert a [unit] of time."
+
+ // See if we can insert a bar of time.
+
+ if (offset % m_barDuration == 0
+ && durationRemaining >= m_barDuration) {
+
+ getDurationListForBar(dlist);
+ durationRemaining -= m_barDuration,
+ offset += m_barDuration;
+
+ }
+
+ // If that fails and we're in 4/4 time, see if we can insert a
+ // half-bar of time.
+
+ //_else_ if!
+ else if (m_numerator == 4 && m_denominator == 4
+ && offset % (m_barDuration/2) == 0
+ && durationRemaining >= m_barDuration/2) {
+
+ dlist.push_back(m_barDuration/2);
+ durationRemaining -= m_barDuration/2;
+ offset += m_barDuration;
+
+ }
+
+ // If that fails, see if we can insert a beat of time.
+
+ else if (offset % m_beatDuration == 0
+ && durationRemaining >= m_beatDuration) {
+
+ dlist.push_back(m_beatDuration);
+ durationRemaining -= m_beatDuration;
+ offset += m_beatDuration;
+
+ }
+
+ // If that fails, see if we can insert a beat-division of time
+ // (half the beat in simple time, a third of the beat in compound
+ // time)
+
+ else if (offset % m_beatDivisionDuration == 0
+ && durationRemaining >= m_beatDivisionDuration) {
+
+ dlist.push_back(m_beatDivisionDuration);
+ durationRemaining -= m_beatDivisionDuration;
+ offset += m_beatDivisionDuration;
+
+ }
+
+ // cc: In practice, if the time we have remaining is shorter
+ // than our shortest note then we should just insert a single
+ // unit of the correct time; we won't be able to do anything
+ // useful with any shorter units anyway.
+
+ else if (durationRemaining <= Note(Note::Shortest).getDuration()) {
+
+ dlist.push_back(durationRemaining);
+ offset += durationRemaining;
+ durationRemaining = 0;
+
+ }
+
+ // If that fails, keep halving the beat division until we
+ // find something to insert. (This could be part of the beat-division
+ // case; it's only in its own place for clarity.)
+
+ else {
+
+ timeT currentDuration = m_beatDivisionDuration;
+
+ while ( !(offset % currentDuration == 0
+ && durationRemaining >= currentDuration) ) {
+
+ if (currentDuration <= Note(Note::Shortest).getDuration()) {
+
+ // okay, this isn't working. If our duration takes
+ // us past the next beat boundary, fill with an exact
+ // rest duration to there and then continue --cc
+
+ timeT toNextBeat =
+ m_beatDuration - (offset % m_beatDuration);
+
+ if (durationRemaining > toNextBeat) {
+ currentDuration = toNextBeat;
+ } else {
+ currentDuration = durationRemaining;
+ }
+ break;
+ }
+
+ currentDuration /= 2;
+ }
+
+ dlist.push_back(currentDuration);
+ durationRemaining -= currentDuration;
+ offset += currentDuration;
+
+ }
+
+ }
+
+}
+
+void TimeSignature::getDurationListForBar(DurationList &dlist) const
+{
+
+ // If the bar's length can be represented with one long symbol, do it.
+ // Otherwise, represent it as individual beats.
+
+ if (m_barDuration == m_crotchetTime ||
+ m_barDuration == m_crotchetTime * 2 ||
+ m_barDuration == m_crotchetTime * 4 ||
+ m_barDuration == m_crotchetTime * 8 ||
+ m_barDuration == m_dottedCrotchetTime ||
+ m_barDuration == m_dottedCrotchetTime * 2 ||
+ m_barDuration == m_dottedCrotchetTime * 4 ||
+ m_barDuration == m_dottedCrotchetTime * 8) {
+
+ dlist.push_back(getBarDuration());
+
+ } else {
+
+ for (int i = 0; i < getBeatsPerBar(); ++i) {
+ dlist.push_back(getBeatDuration());
+ }
+
+ }
+
+}
+
+int TimeSignature::getEmphasisForTime(timeT offset)
+{
+ setInternalDurations();
+
+ if (offset % m_barDuration == 0)
+ return 4;
+ else if (m_numerator == 4 && m_denominator == 4 &&
+ offset % (m_barDuration/2) == 0)
+ return 3;
+ else if (offset % m_beatDuration == 0)
+ return 2;
+ else if (offset % m_beatDivisionDuration == 0)
+ return 1;
+ else
+ return 0;
+}
+
+
+void TimeSignature::getDivisions(int depth, std::vector<int> &divisions) const
+{
+ divisions.clear();
+
+ if (depth <= 0) return;
+ timeT base = getBarDuration(); // calls setInternalDurations
+/*
+ if (m_numerator == 4 && m_denominator == 4) {
+ divisions.push_back(2);
+ base /= 2;
+ --depth;
+ }
+*/
+ if (depth <= 0) return;
+
+ divisions.push_back(base / m_beatDuration);
+ base = m_beatDuration;
+ --depth;
+
+ if (depth <= 0) return;
+
+ if (m_dotted) divisions.push_back(3);
+ else divisions.push_back(2);
+ --depth;
+
+ while (depth > 0) {
+ divisions.push_back(2);
+ --depth;
+ }
+
+ return;
+}
+
+
+void TimeSignature::setInternalDurations() const
+{
+ int unitLength = m_crotchetTime * 4 / m_denominator;
+
+ m_barDuration = m_numerator * unitLength;
+
+ // Is 3/8 dotted time? This will report that it isn't, because of
+ // the check for m_numerator > 3 -- but otherwise we'd get a false
+ // positive with 3/4
+
+ // [rf] That's an acceptable answer, according to my theory book. In
+ // practice, you can say it's dotted time iff it has 6, 9, or 12 on top.
+
+ m_dotted = (m_numerator % 3 == 0 &&
+ m_numerator > 3 &&
+ m_barDuration >= m_dottedCrotchetTime);
+
+ if (m_dotted) {
+ m_beatDuration = unitLength * 3;
+ m_beatDivisionDuration = unitLength;
+ }
+ else {
+ m_beatDuration = unitLength;
+ m_beatDivisionDuration = unitLength / 2;
+ }
+
+}
+
+const timeT TimeSignature::m_crotchetTime = basePPQ;
+const timeT TimeSignature::m_dottedCrotchetTime = basePPQ + basePPQ/2;
+
+
+
+//////////////////////////////////////////////////////////////////////
+// AccidentalTable
+//////////////////////////////////////////////////////////////////////
+
+AccidentalTable::AccidentalTable(const Key &key, const Clef &clef,
+ OctaveType octaves, BarResetType barReset) :
+ m_key(key), m_clef(clef),
+ m_octaves(octaves), m_barReset(barReset)
+{
+ // nothing else
+}
+
+AccidentalTable::AccidentalTable(const AccidentalTable &t) :
+ m_key(t.m_key), m_clef(t.m_clef),
+ m_octaves(t.m_octaves), m_barReset(t.m_barReset),
+ m_accidentals(t.m_accidentals),
+ m_canonicalAccidentals(t.m_canonicalAccidentals),
+ m_newAccidentals(t.m_newAccidentals),
+ m_newCanonicalAccidentals(t.m_newCanonicalAccidentals)
+{
+ // nothing else
+}
+
+AccidentalTable &
+AccidentalTable::operator=(const AccidentalTable &t)
+{
+ if (&t != this) {
+ m_key = t.m_key;
+ m_clef = t.m_clef;
+ m_octaves = t.m_octaves;
+ m_barReset = t.m_barReset;
+ m_accidentals = t.m_accidentals;
+ m_canonicalAccidentals = t.m_canonicalAccidentals;
+ m_newAccidentals = t.m_newAccidentals;
+ m_newCanonicalAccidentals = t.m_newCanonicalAccidentals;
+ }
+ return *this;
+}
+
+Accidental
+AccidentalTable::processDisplayAccidental(const Accidental &acc0, int height,
+ bool &cautionary)
+{
+ Accidental acc = acc0;
+
+ int canonicalHeight = Key::canonicalHeight(height);
+ Accidental keyAcc = m_key.getAccidentalAtHeight(canonicalHeight, m_clef);
+
+ Accidental normalAcc = NoAccidental;
+ Accidental canonicalAcc = NoAccidental;
+ Accidental prevBarAcc = NoAccidental;
+
+ if (m_octaves == OctavesEquivalent ||
+ m_octaves == OctavesCautionary) {
+
+ AccidentalMap::iterator i = m_canonicalAccidentals.find(canonicalHeight);
+ if (i != m_canonicalAccidentals.end() && !i->second.previousBar) {
+ canonicalAcc = i->second.accidental;
+ }
+ }
+
+ if (m_octaves == OctavesEquivalent) {
+ normalAcc = canonicalAcc;
+ } else {
+ AccidentalMap::iterator i = m_accidentals.find(height);
+ if (i != m_accidentals.end() && !i->second.previousBar) {
+ normalAcc = i->second.accidental;
+ }
+ }
+
+ if (m_barReset != BarResetNone) {
+ AccidentalMap::iterator i = m_accidentals.find(height);
+ if (i != m_accidentals.end() && i->second.previousBar) {
+ prevBarAcc = i->second.accidental;
+ }
+ }
+
+// std::cerr << "AccidentalTable::processDisplayAccidental: acc " << acc0 << ", h " << height << ", caut " << cautionary << ", ch " << canonicalHeight << ", keyacc " << keyAcc << " canacc " << canonicalAcc << " noracc " << normalAcc << " oct " << m_octaves << " barReset = " << m_barReset << " pbacc " << prevBarAcc << std::endl;
+
+ if (acc == NoAccidental) acc = keyAcc;
+
+ if (m_octaves == OctavesIndependent ||
+ m_octaves == OctavesEquivalent) {
+
+ if (normalAcc == NoAccidental) {
+ normalAcc = keyAcc;
+ }
+
+ if (acc == normalAcc) {
+ if (!cautionary) acc = NoAccidental;
+ } else if (acc == NoAccidental) {
+ if (normalAcc != Natural) {
+ acc = Natural;
+ }
+ }
+
+ } else {
+
+ if (normalAcc != NoAccidental) {
+ if (acc != normalAcc) {
+ if (acc == NoAccidental) {
+ if (normalAcc != Natural) {
+ acc = Natural;
+ }
+ }
+ } else { // normalAcc != NoAccidental, acc == normalAcc
+ if (canonicalAcc != NoAccidental && canonicalAcc != normalAcc) {
+ cautionary = true;
+ } else { // canonicalAcc == NoAccidental || canonicalAcc == normalAcc
+ if (!cautionary) {
+ acc = NoAccidental;
+ }
+ }
+ }
+ } else { // normalAcc == NoAccidental
+ if (acc != keyAcc && keyAcc != Natural) {
+ if (acc == NoAccidental) {
+ acc = Natural;
+ }
+ } else { // normalAcc == NoAccidental, acc == keyAcc
+ if (canonicalAcc != NoAccidental && canonicalAcc != keyAcc) {
+ cautionary = true;
+ if (acc == NoAccidental) {
+ acc = Natural;
+ }
+ } else { // canonicalAcc == NoAccidental || canonicalAcc == keyAcc
+ if (!cautionary) {
+ acc = NoAccidental;
+ }
+ }
+ }
+ }
+ }
+
+ if (m_barReset != BarResetNone) {
+ if (acc == NoAccidental) {
+ if (prevBarAcc != NoAccidental &&
+ prevBarAcc != keyAcc &&
+ !(prevBarAcc == Natural && keyAcc == NoAccidental)) {
+ cautionary = (m_barReset == BarResetCautionary);
+ if (keyAcc == NoAccidental) {
+ acc = Natural;
+ } else {
+ acc = keyAcc;
+ }
+ }
+ }
+ }
+
+ if (acc != NoAccidental) {
+ m_newAccidentals[height] = AccidentalRec(acc, false);
+ m_newCanonicalAccidentals[canonicalHeight] = AccidentalRec(acc, false);
+ }
+
+ return acc;
+}
+
+void
+AccidentalTable::update()
+{
+ m_accidentals = m_newAccidentals;
+ m_canonicalAccidentals = m_newCanonicalAccidentals;
+}
+
+void
+AccidentalTable::newBar()
+{
+ for (AccidentalMap::iterator i = m_accidentals.begin();
+ i != m_accidentals.end(); ) {
+
+ if (i->second.previousBar) {
+ AccidentalMap::iterator j = i;
+ ++j;
+ m_accidentals.erase(i);
+ i = j;
+ } else {
+ i->second.previousBar = true;
+ ++i;
+ }
+ }
+
+ m_canonicalAccidentals.clear();
+
+ m_newAccidentals = m_accidentals;
+ m_newCanonicalAccidentals.clear();
+}
+
+void
+AccidentalTable::newClef(const Clef &clef)
+{
+ m_clef = clef;
+}
+
+
+} // close namespace
diff --git a/src/base/NotationTypes.h b/src/base/NotationTypes.h
new file mode 100644
index 0000000..9133983
--- /dev/null
+++ b/src/base/NotationTypes.h
@@ -0,0 +1,1342 @@
+// -*- c-basic-offset: 4 -*-
+
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _NOTATION_TYPES_H_
+#define _NOTATION_TYPES_H_
+
+#include <list>
+#include <map>
+
+#include "Event.h"
+#include "Instrument.h"
+
+/*
+ * NotationTypes.h
+ *
+ * This file contains definitions of several classes to assist in
+ * creating and manipulating certain event types. The classes are:
+ *
+ * Accidental
+ * Clef
+ * Key
+ * Indication
+ * Pitch
+ * Note
+ * TimeSignature
+ * AccidentalTable
+ *
+ * The classes in this file are _not_ actually used for storing
+ * events. Events are always stored in Event objects (see Event.h).
+ *
+ * These classes are usually constructed on-the-fly when a particular
+ * operation specific to a single sort of event is required, and
+ * usually destroyed as soon as they go out of scope. The most common
+ * usages are for creating events (create an instance of one of these
+ * classes with the data you require, then call getAsEvent on it), for
+ * doing notation-related calculations from existing events (such as
+ * the bar duration of a time signature), and for doing calculations
+ * that are independent of any particular instance of an event (such
+ * as the Note methods that calculate duration-related values without
+ * reference to any specific pitch or other note-event properties; or
+ * everything in Pitch).
+ *
+ * This file also defines the event types and standard property names
+ * for the basic events.
+ */
+
+namespace Rosegarden
+{
+
+extern const int MIN_SUBORDERING;
+
+typedef std::list<int> DurationList;
+
+
+/**
+ * Accidentals are stored in the event as string properties, purely
+ * for clarity. (They aren't manipulated _all_ that often, so this
+ * probably isn't a great inefficiency.) Originally we used an enum
+ * for the Accidental type with conversion functions to and from
+ * strings, but making Accidental a string seems simpler.
+ */
+
+typedef std::string Accidental;
+
+namespace Accidentals
+{
+ extern const Accidental NoAccidental;
+ extern const Accidental Sharp;
+ extern const Accidental Flat;
+ extern const Accidental Natural;
+ extern const Accidental DoubleSharp;
+ extern const Accidental DoubleFlat;
+
+ typedef std::vector<Accidental> AccidentalList;
+
+ /**
+ * When no accidental is specified for a pitch, there are several
+ * strategies to determine what accidental to display for an
+ * out-of-key pitch
+ */
+ enum NoAccidentalStrategy {
+ /** always use sharps */
+ UseSharps,
+ /** always use flats */
+ UseFlats,
+ /** always use sharps or always use flats depending on of what
+ * type of accidentals the current key is made up */
+ UseKeySharpness,
+ /** use the most likely accidental for this key */
+ UseKey
+ };
+
+ /**
+ * Get the predefined accidentals (i.e. the ones listed above)
+ * in their defined order.
+ */
+ extern AccidentalList getStandardAccidentals();
+
+ /**
+ * Get the change in pitch resulting from an accidental: -1 for
+ * flat, 2 for double-sharp, 0 for natural or NoAccidental etc.
+ * This is not as useful as it may seem, as in reality the
+ * effect of an accidental depends on the key as well -- see
+ * the Key and Pitch classes.
+ */
+ extern int getPitchOffset(const Accidental &accidental);
+
+
+ /**
+ * Get the Accidental corresponding to a change in pitch: flat
+ * for -1, double-sharp for 2, natural for 0 etc.
+ *
+ * Useful for tying to code that represents accidentals by
+ * their pitch change.
+ */
+ extern Accidental getAccidental(int pitchChange);
+}
+
+
+/**
+ * Marks, like Accidentals, are stored in the event as string properties.
+ */
+
+typedef std::string Mark;
+
+namespace Marks //!!! This would be better as a class, these days
+{
+ extern const Mark NoMark; // " "
+
+ extern const Mark Accent; // ">"
+ extern const Mark Tenuto; // "-" ("legato" in RG2.1)
+ extern const Mark Staccato; // "."
+ extern const Mark Staccatissimo; // "'"
+ extern const Mark Marcato; // "^"
+ extern const Mark Sforzando; // "sf"
+ extern const Mark Rinforzando; // "rf"
+
+ extern const Mark Trill; // "tr"
+ extern const Mark LongTrill; // with wiggly line
+ extern const Mark TrillLine; // line on its own
+ extern const Mark Turn; // "~"
+
+ extern const Mark Pause; // aka "fermata"
+
+ extern const Mark UpBow; // "v"
+ extern const Mark DownBow; // a square with the bottom side missing
+
+ extern const Mark Mordent;
+ extern const Mark MordentInverted;
+ extern const Mark MordentLong;
+ extern const Mark MordentLongInverted;
+
+ /**
+ * Given a string, return a mark that will be recognised as a
+ * text mark containing that string. For example, the Sforzando
+ * mark is actually defined as getTextMark("sf").
+ */
+ extern Mark getTextMark(std::string text);
+
+ /**
+ * Return true if the given mark is a text mark.
+ */
+ extern bool isTextMark(Mark mark);
+
+ /**
+ * Extract the string from a text mark.
+ */
+ extern std::string getTextFromMark(Mark mark);
+
+ /**
+ * Given a string, return a mark that will be recognised as a
+ * fingering mark containing that string. (We use a string
+ * instead of a number to permit "fingering" marks containing
+ * labels like "+".)
+ */
+ extern Mark getFingeringMark(std::string fingering);
+
+ /**
+ * Return true if the given mark is a fingering mark.
+ */
+ extern bool isFingeringMark(Mark mark);
+
+ /**
+ * Extract the string from a fingering mark.
+ */
+ extern std::string getFingeringFromMark(Mark mark);
+
+ /**
+ * Extract the number of marks from an event.
+ */
+ extern int getMarkCount(const Event &e);
+
+ /**
+ * Extract the marks from an event.
+ */
+ extern std::vector<Mark> getMarks(const Event &e);
+
+ /**
+ * Return the first fingering mark on an event (or NoMark, if none).
+ */
+ extern Mark getFingeringMark(const Event &e);
+
+ /**
+ * Add a mark to an event. If unique is true, add the mark only
+ * if the event does not already have it (otherwise permit
+ * multiple identical marks).
+ */
+ extern void addMark(Event &e, const Mark &mark, bool unique);
+
+ /**
+ * Remove a mark from an event. Returns true if the mark was
+ * there to remove. If the mark was not unique, removes only
+ * the first instance of it.
+ */
+ extern bool removeMark(Event &e, const Mark &mark);
+
+ /**
+ * Returns true if the event has the given mark.
+ */
+ extern bool hasMark(const Event &e, const Mark &mark);
+
+ /**
+ * Get the predefined marks (i.e. the ones listed above) in their
+ * defined order.
+ */
+ extern std::vector<Mark> getStandardMarks();
+}
+
+
+/**
+ * Clefs are represented as one of a set of standard strings, stored
+ * within a clef Event. The Clef class defines those standards and
+ * provides a few bits of information about the clefs.
+ */
+
+class Clef
+{
+public:
+ static const std::string EventType;
+ static const int EventSubOrdering;
+ static const PropertyName ClefPropertyName;
+ static const PropertyName OctaveOffsetPropertyName;
+ static const Clef DefaultClef;
+ typedef Exception BadClefName;
+
+ static const std::string Treble;
+ static const std::string French;
+ static const std::string Soprano;
+ static const std::string Mezzosoprano;
+ static const std::string Alto;
+ static const std::string Tenor;
+ static const std::string Baritone;
+ static const std::string Varbaritone;
+ static const std::string Bass;
+ static const std::string Subbass;
+
+ /**
+ * Construct the default clef (treble).
+ */
+ Clef() : m_clef(DefaultClef.m_clef), m_octaveOffset(0) { }
+
+ /**
+ * Construct a Clef from the clef data in the given event. If the
+ * event is not of clef type or contains insufficient data, this
+ * returns the default clef (with a warning). You should normally
+ * test Clef::isValid() to catch that before construction.
+ */
+ Clef(const Event &e);
+
+ /**
+ * Construct a Clef from the given data. Throws a BadClefName
+ * exception if the given string does not match one of the above
+ * clef name constants.
+ */
+ Clef(const std::string &s, int octaveOffset = 0);
+
+ Clef(const Clef &c) : m_clef(c.m_clef), m_octaveOffset(c.m_octaveOffset) {
+ }
+
+ Clef &operator=(const Clef &c);
+
+ bool operator==(const Clef &c) const {
+ return c.m_clef == m_clef && c.m_octaveOffset == m_octaveOffset;
+ }
+
+ bool operator!=(const Clef &c) const {
+ return !(c == *this);
+ }
+
+ ~Clef() { }
+
+ /**
+ * Test whether the given event is a valid Clef event.
+ */
+ static bool isValid(const Event &e);
+
+ /**
+ * Return the basic clef type (Treble, French, Soprano, Mezzosoprano, Alto, Tenor, Baritone, Varbaritone, Bass, Subbass)
+ */
+ std::string getClefType() const { return m_clef; }
+
+ /**
+ * Return any additional octave offset, that is, return 1 for
+ * a clef shifted an 8ve up, etc
+ */
+ int getOctaveOffset() const { return m_octaveOffset; }
+
+ /**
+ * Return the number of semitones a pitch in the treble clef would
+ * have to be lowered by in order to be drawn with the same height
+ * and accidental in this clef
+ */
+ int getTranspose() const;
+
+ /**
+ * Return the octave component of getTranspose(), i.e. the number
+ * of octaves difference in pitch between this clef and the treble
+ */
+ int getOctave() const;
+
+ /**
+ * Return the intra-octave component of getTranspose(), i.e. the
+ * number of semitones this clef is distinct in pitch from the treble
+ * besides the difference in octaves
+ */
+ int getPitchOffset() const;
+
+ /**
+ * Return the height-on-staff (in Pitch terminology)
+ * of the clef's axis -- the line around which the clef is drawn.
+ */
+ int getAxisHeight() const;
+
+ typedef std::vector<Clef> ClefList;
+
+ /**
+ * Return all the clefs, in ascending order of pitch
+ */
+ static ClefList getClefs();
+
+ /// Returned event is on heap; caller takes responsibility for ownership
+ Event *getAsEvent(timeT absoluteTime) const;
+
+private:
+ std::string m_clef;
+ int m_octaveOffset;
+};
+
+/**
+ * All we store in a key Event is the name of the key. A Key object
+ * can be constructed from such an Event or just from its name, and
+ * will return all the properties of the key. The Key class also
+ * provides some useful mechanisms for getting information about and
+ * transposing between keys.
+ */
+
+class Key
+{
+public:
+ static const std::string EventType;
+ static const int EventSubOrdering;
+ static const PropertyName KeyPropertyName;
+ static const Key DefaultKey;
+ typedef Exception BadKeyName;
+ typedef Exception BadKeySpec;
+
+ /**
+ * Construct the default key (C major).
+ */
+ Key();
+
+ /**
+ * Construct a Key from the key data in the given event. If the
+ * event is not of key type or contains insufficient data, this
+ * returns the default key (with a warning). You should normally
+ * test Key::isValid() to catch that before construction.
+ */
+ Key(const Event &e);
+
+ /**
+ * Construct the named key. Throws a BadKeyName exception if the
+ * given string does not match one of the known key names.
+ */
+ Key(const std::string &name);
+
+ /**
+ * Construct a key from signature and mode. May throw a
+ * BadKeySpec exception.
+ */
+ Key(int accidentalCount, bool isSharp, bool isMinor);
+
+ /**
+ * Construct the key with the given tonic and mode. (Ambiguous.)
+ * May throw a BadKeySpec exception.
+ */
+ Key(int tonicPitch, bool isMinor);
+
+ Key(const Key &kc);
+
+ ~Key() {
+ delete m_accidentalHeights;
+ }
+
+ Key &operator=(const Key &kc);
+
+ bool operator==(const Key &k) const {
+ return k.m_name == m_name;
+ }
+
+ bool operator!=(const Key &k) const {
+ return !(k == *this);
+ }
+
+ /**
+ * Test whether the given event is a valid Key event.
+ */
+ static bool isValid(const Event &e);
+
+ /**
+ * Return true if this is a minor key. Unlike in RG2.1,
+ * we distinguish between major and minor keys with the
+ * same signature.
+ */
+ bool isMinor() const {
+ return m_keyDetailMap[m_name].m_minor;
+ }
+
+ /**
+ * Return true if this key's signature is made up of
+ * sharps, false if flats.
+ */
+ bool isSharp() const {
+ return m_keyDetailMap[m_name].m_sharps;
+ }
+
+ /**
+ * Return the pitch of the tonic note in this key, as a
+ * MIDI (or RG4) pitch modulo 12 (i.e. in the range 0-11).
+ * This is the pitch of the note named in the key's name,
+ * e.g. 0 for the C in C major.
+ */
+ int getTonicPitch() const {
+ return m_keyDetailMap[m_name].m_tonicPitch;
+ }
+
+ /**
+ * Return the number of sharps or flats in the key's signature.
+ */
+ int getAccidentalCount() const {
+ return m_keyDetailMap[m_name].m_sharpCount;
+ }
+
+ /**
+ * Return the key with the same signature but different
+ * major/minor mode. For example if called on C major,
+ * returns A minor.
+ */
+ Key getEquivalent() const {
+ return Key(m_keyDetailMap[m_name].m_equivalence);
+ }
+
+ /**
+ * Return the name of the key, in a human-readable form
+ * also suitable for passing to the Key constructor.
+ */
+ std::string getName() const {
+ return m_name;
+ }
+
+ /**
+ * Return the name of the key, in the form used by RG2.1.
+ */
+ std::string getRosegarden2Name() const {
+ return m_keyDetailMap[m_name].m_rg2name;
+ }
+
+ /**
+ * Return the accidental at the given height-on-staff
+ * (in Pitch terminology) in the given clef.
+ */
+ Accidental getAccidentalAtHeight(int height, const Clef &clef) const;
+
+ /**
+ * Return the accidental for the the given number of steps
+ * from the tonic. For example: for F major, step '3' is the
+ * Bb, so getAccidentalForStep(3) will yield a Flat.
+ */
+ Accidental getAccidentalForStep(int steps) const;
+
+ /**
+ * Return the heights-on-staff (in Pitch
+ * terminology) of all accidentals in the key's signature,
+ * in the given clef.
+ */
+ std::vector<int> getAccidentalHeights(const Clef &clef) const;
+
+ /**
+ * Return the result of applying this key to the given
+ * pitch, that is, modifying the pitch so that it has the
+ * same status in terms of accidentals as it had when
+ * found in the given previous key.
+ */
+ int convertFrom(int pitch, const Key &previousKey,
+ const Accidental &explicitAccidental =
+ Accidentals::NoAccidental) const;
+
+ /**
+ * Return the result of transposing the given pitch into
+ * this key, that is, modifying the pitch by the difference
+ * between the tonic pitches of this and the given previous
+ * key.
+ */
+ int transposeFrom(int pitch, const Key &previousKey) const;
+
+ /**
+ * Reduce a height-on-staff to a single octave, so that it
+ * can be compared against the accidental heights returned
+ * by the preceding method.
+ */
+ static inline unsigned int canonicalHeight(int height) {
+ return (height > 0) ? (height % 7) : ((7 - (-height % 7)) % 7);
+ }
+
+ typedef std::vector<Key> KeyList;
+
+ /**
+ * Return all the keys in the given major/minor mode, in
+ * no particular order.
+ */
+ static KeyList getKeys(bool minor = false);
+
+
+ /// Returned event is on heap; caller takes responsibility for ownership
+ Event *getAsEvent(timeT absoluteTime) const;
+
+ /**
+ * Transpose this key by the specified interval given in pitch and steps
+ *
+ * For example: transposing F major by a major triad (4,2) yields
+ * A major.
+ */
+ Key transpose(int pitchDelta, int heightDelta);
+
+private:
+ std::string m_name;
+ mutable std::vector<int> *m_accidentalHeights;
+
+ struct KeyDetails {
+ bool m_sharps;
+ bool m_minor;
+ int m_sharpCount;
+ std::string m_equivalence;
+ std::string m_rg2name;
+ int m_tonicPitch;
+
+ KeyDetails(); // ctor needed in order to live in a map
+
+ KeyDetails(bool sharps, bool minor, int sharpCount,
+ std::string equivalence, std::string rg2name,
+ int m_tonicPitch);
+
+ KeyDetails(const KeyDetails &d);
+
+ KeyDetails &operator=(const KeyDetails &d);
+ };
+
+
+ typedef std::map<std::string, KeyDetails> KeyDetailMap;
+ static KeyDetailMap m_keyDetailMap;
+ static void checkMap();
+ void checkAccidentalHeights() const;
+
+};
+
+
+/**
+ * Indication is a collective name for graphical marks that span a
+ * series of events, such as slurs, dynamic marks etc. These are
+ * stored in indication Events with a type and duration. The
+ * Indication class gives a basic set of indication types.
+ */
+
+class Indication
+{
+public:
+ static const std::string EventType;
+ static const int EventSubOrdering;
+ static const PropertyName IndicationTypePropertyName;
+ typedef Exception BadIndicationName;
+
+ static const std::string Slur;
+ static const std::string PhrasingSlur;
+ static const std::string Crescendo;
+ static const std::string Decrescendo;
+ static const std::string Glissando;
+
+ static const std::string QuindicesimaUp;
+ static const std::string OttavaUp;
+ static const std::string OttavaDown;
+ static const std::string QuindicesimaDown;
+
+ Indication(const Event &e)
+ /* throw (Event::NoData, Event::BadType) */;
+ Indication(const std::string &s, timeT indicationDuration)
+ /* throw (BadIndicationName) */;
+
+ Indication(const Indication &m) : m_indicationType(m.m_indicationType),
+ m_duration(m.m_duration) { }
+
+ Indication &operator=(const Indication &m);
+
+ ~Indication() { }
+
+ std::string getIndicationType() const { return m_indicationType; }
+ timeT getIndicationDuration() const { return m_duration; }
+
+ bool isOttavaType() const {
+ return
+ m_indicationType == QuindicesimaUp ||
+ m_indicationType == OttavaUp ||
+ m_indicationType == OttavaDown ||
+ m_indicationType == QuindicesimaDown;
+ }
+
+ int getOttavaShift() const {
+ return (m_indicationType == QuindicesimaUp ? 2 :
+ m_indicationType == OttavaUp ? 1 :
+ m_indicationType == OttavaDown ? -1 :
+ m_indicationType == QuindicesimaDown ? -2 : 0);
+ }
+
+ /// Returned event is on heap; caller takes responsibility for ownership
+ Event *getAsEvent(timeT absoluteTime) const;
+
+private:
+ bool isValid(const std::string &s) const;
+
+ std::string m_indicationType;
+ timeT m_duration;
+};
+
+
+
+/**
+ * Definitions for use in the text Event type.
+ */
+
+class Text
+{
+public:
+ static const std::string EventType;
+ static const int EventSubOrdering;
+ static const PropertyName TextPropertyName;
+ static const PropertyName TextTypePropertyName;
+ static const PropertyName LyricVersePropertyName;
+
+ /**
+ * Text styles
+ */
+ static const std::string UnspecifiedType;
+ static const std::string StaffName;
+ static const std::string ChordName;
+ static const std::string KeyName;
+ static const std::string Lyric;
+ static const std::string Chord;
+ static const std::string Dynamic;
+ static const std::string Direction;
+ static const std::string LocalDirection;
+ static const std::string Tempo;
+ static const std::string LocalTempo;
+ static const std::string Annotation;
+ static const std::string LilyPondDirective;
+
+ /**
+ * Special LilyPond directives
+ */
+ static const std::string Segno; // print segno here
+ static const std::string Coda; // print coda sign here
+ static const std::string Alternate1; // first alternative ending
+ static const std::string Alternate2; // second alternative ending
+ static const std::string BarDouble; // next barline is double
+ static const std::string BarEnd; // next barline is final double
+ static const std::string BarDot; // next barline is dotted
+ static const std::string Gliss; // \glissando on this note (to next note)
+ static const std::string Arpeggio; // \arpeggio on this chord
+// static const std::string ArpeggioUp; // \ArpeggioUp on this chord
+// static const std::string ArpeggioDn; // \ArpeggioDown on this chord
+ static const std::string Tiny; // begin \tiny font section
+ static const std::string Small; // begin \small font section
+ static const std::string NormalSize; // begin \normalsize font section
+
+ Text(const Event &e)
+ /* throw (Event::NoData, Event::BadType) */;
+ Text(const std::string &text,
+ const std::string &textType = UnspecifiedType);
+ Text(const Text &);
+ Text &operator=(const Text &);
+ ~Text();
+
+ std::string getText() const { return m_text; }
+ std::string getTextType() const { return m_type; }
+
+ int getVerse() const { return m_verse; } // only relevant for lyrics
+ void setVerse(int verse) { m_verse = verse; }
+
+ static bool isTextOfType(Event *, std::string type);
+
+ /**
+ * Return those text types that the user should be allowed to
+ * specify directly and visually
+ */
+ static std::vector<std::string> getUserStyles();
+
+ /**
+ * Return a list of available special LilyPond directives
+ */
+ static std::vector<std::string> getLilyPondDirectives();
+
+ /// Returned event is on heap; caller takes responsibility for ownership
+ Event *getAsEvent(timeT absoluteTime) const;
+
+private:
+ std::string m_text;
+ std::string m_type;
+ long m_verse;
+};
+
+
+
+/**
+ * Pitch stores a note's pitch and provides information about it in
+ * various different ways, notably in terms of the position of the
+ * note on the staff and its associated accidental.
+ *
+ * (See docs/discussion/units.txt for explanation of pitch units.)
+ *
+ * This completely replaces the older NotationDisplayPitch class.
+ */
+
+class Pitch
+{
+public:
+ /**
+ * Construct a Pitch object based on the given Event, which must
+ * have a BaseProperties::PITCH property. If the property is
+ * absent, NoData is thrown. The BaseProperties::ACCIDENTAL
+ * property will also be used if present.
+ */
+ Pitch(const Event &e)
+ /* throw Event::NoData */;
+
+ /**
+ * Construct a Pitch object based on the given performance (MIDI) pitch.
+ */
+ Pitch(int performancePitch,
+ const Accidental &explicitAccidental = Accidentals::NoAccidental);
+
+ /**
+ * Construct a Pitch based on octave and pitch in octave. The
+ * lowest permissible octave number is octaveBase, and middle C is
+ * in octave octaveBase + 5. pitchInOctave must be in the range
+ * 0-11 where 0 is C, 1 is C sharp, etc.
+ */
+ Pitch(int pitchInOctave, int octave,
+ const Accidental &explicitAccidental = Accidentals::NoAccidental,
+ int octaveBase = -2);
+
+ /**
+ * Construct a Pitch based on octave and note in scale. The
+ * lowest permissible octave number is octaveBase, and middle C is
+ * in octave octaveBase + 5. The octave supplied should be that
+ * of the root note in the given key, which may be in a different
+ * MIDI octave from the resulting pitch (as MIDI octaves always
+ * begin at C). noteInScale must be in the range 0-6 where 0 is
+ * the root of the key and so on. The accidental is relative to
+ * noteInScale: if there is an accidental in the key for this note
+ * already, explicitAccidental will be "added" to it.
+ *
+ * For minor keys, the harmonic scale is used.
+ */
+ Pitch(int noteInScale, int octave, const Key &key,
+ const Accidental &explicitAccidental = Accidentals::NoAccidental,
+ int octaveBase = -2);
+
+ /**
+ * Construct a Pitch based on (MIDI) octave, note in the C major scale and
+ * performance pitch. The accidental is calculated based on these
+ * properties.
+ */
+ Pitch(int noteInCMajor, int octave, int pitch,
+ int octaveBase = -2);
+
+ /**
+ * Construct a Pitch based on octave and note name. The lowest
+ * permissible octave number is octaveBase, and middle C is in
+ * octave octaveBase + 5. noteName must be a character in the
+ * range [CDEFGAB] or lower-case equivalents. The key is supplied
+ * so that we know how to interpret the NoAccidental case.
+ */
+ Pitch(char noteName, int octave, const Key &key,
+ const Accidental &explicitAccidental = Accidentals::NoAccidental,
+ int octaveBase = -2);
+
+ /**
+ * Construct a Pitch corresponding a staff line or space on a
+ * classical 5-line staff. The bottom staff line has height 0,
+ * the top has height 8, and both positive and negative values are
+ * permissible.
+ */
+ Pitch(int heightOnStaff, const Clef &clef, const Key &key,
+ const Accidental &explicitAccidental = Accidentals::NoAccidental);
+
+ Pitch(const Pitch &);
+ Pitch &operator=(const Pitch &);
+
+ /**
+ * Return the MIDI pitch for this Pitch object.
+ */
+ int getPerformancePitch() const;
+
+ /**
+ * Return the accidental for this pitch using a bool to prefer sharps over
+ * flats if there is any doubt. This is the accidental
+ * that would be used to display this pitch outside of the context
+ * of any key; that is, it may duplicate an accidental actually in
+ * the current key. This should not be used if you need to get an
+ * explicit accidental returned for E#, Fb, B# or Cb.
+ *
+ * This version of the function exists to avoid breaking old code.
+ */
+ Accidental getAccidental(bool useSharps) const;
+
+ /**
+ * Return the accidental for this pitch, using a key. This should be used
+ * if you need an explicit accidental returned for E#, Fb, B# or Cb, which
+ * can't be resolved correctly without knowing that their key requires
+ * them to take an accidental. The provided key will also be used to
+ * determine whether to prefer sharps over flats.
+ */
+ Accidental getAccidental(const Key &key) const;
+
+ /**
+ * Return the accidental that should be used to display this pitch
+ * in a given key. For example, if the pitch is F-sharp in a key
+ * in which F has a sharp, NoAccidental will be returned. (This
+ * is in contrast to getAccidental, which would return Sharp.)
+ * This obviously can't take into account things like which
+ * accidentals have already been displayed in the bar, etc.
+ */
+ Accidental getDisplayAccidental(const Key &key) const;
+
+ /**
+ * Return the accidental that should be used to display this pitch
+ * in a given key, using the given strategy to resolve pitches where
+ * an accidental is needed but not specified.
+ */
+ Accidental getDisplayAccidental(const Key &key, Accidentals::NoAccidentalStrategy) const;
+
+ /**
+ * Return the position in the scale for this pitch, as a number in
+ * the range 0 to 6 where 0 is the root of the key.
+ */
+ int getNoteInScale(const Key &key) const;
+
+ /**
+ * Return the note name for this pitch, as a single character in
+ * the range A to G. (This is a reference value that should not
+ * normally be shown directly to the user, for i18n reasons.)
+ */
+ char getNoteName(const Key &key) const;
+
+ /**
+ * Return the height at which this pitch should display on a
+ * conventional 5-line staff. 0 is the bottom line, 1 the first
+ * space, etc., so for example middle-C in the treble clef would
+ * return -2.
+ *
+ * Chooses the most likely accidental for this pitch in this key.
+ */
+ int getHeightOnStaff(const Clef &clef, const Key &key) const;
+
+ /**
+ * Return the height at which this pitch should display on a
+ * conventional 5-line staff. 0 is the bottom line, 1 the first
+ * space, etc., so for example middle-C in the treble clef would
+ * return -2.
+ *
+ * Chooses the accidental specified by the 'useSharps' parameter
+ */
+ int getHeightOnStaff(const Clef &clef, bool useSharps) const;
+
+ /**
+ * Return the octave containing this pitch. The octaveBase argument
+ * specifies the octave containing MIDI pitch 0; middle-C is in octave
+ * octaveBase + 5.
+ */
+ int getOctave(int octaveBase = -2) const;
+
+ /**
+ * Return the pitch within the octave, in the range 0 to 11.
+ */
+ int getPitchInOctave() const;
+
+ /**
+ * Return whether this pitch is diatonic in the given key.
+ */
+ bool isDiatonicInKey(const Key &key) const;
+
+ /**
+ * Return a reference name for this pitch. (C4, Bb2, etc...)
+ * according to http://www.harmony-central.com/MIDI/Doc/table2.html
+ *
+ * Note that this does not take into account the stored accidental
+ * -- this string is purely an encoding of the MIDI pitch, with
+ * the accidental in the string selected according to the
+ * useSharps flag (which may be expected to have come from a call
+ * to Key::isSharp).
+ *
+ * If inclOctave is false, this will return C, Bb, etc.
+ */
+ std::string getAsString(bool useSharps,
+ bool inclOctave = true,
+ int octaveBase = -2) const;
+
+ /**
+ * Return a number 0-6 corresponding to the given note name, which
+ * must be in the range [CDEFGAB] or lower-case equivalents. The
+ * return value is in the range 0-6 with 0 for C, 1 for D etc.
+ */
+ static int getIndexForNote(char noteName);
+
+ /**
+ * Return a note name corresponding to the given note index, which
+ * must be in the range 0-6 with 0 for C, 1 for D etc.
+ */
+ static char getNoteForIndex(int index);
+
+ /**
+ * Calculate and return the performance (MIDI) pitch corresponding
+ * to the stored height and accidental, interpreting them as
+ * Rosegarden-2.1-style values (for backward compatibility use),
+ * in the given clef and key
+ */
+ static int getPerformancePitchFromRG21Pitch(int heightOnStaff,
+ const Accidental &accidental,
+ const Clef &clef,
+ const Key &key);
+
+ /**
+ * return the result of transposing the given pitch by the
+ * specified interval in the given key. The key is left unchanged,
+ * only the pitch is transposed.
+ */
+ Pitch transpose(const Key &key, int pitchDelta, int heightDelta);
+
+ /**
+ * checks whether the accidental specified for this pitch (if any)
+ * is valid - for example, a Sharp for pitch 11 is invalid, as
+ * it's between A# and B#.
+ */
+ bool validAccidental() const;
+
+ /**
+ * Returned event is on heap; caller takes responsibility for ownership
+ */
+ Event *getAsNoteEvent(timeT absoluteTime, timeT duration) const;
+
+private:
+ int m_pitch;
+ Accidental m_accidental;
+
+ static void rawPitchToDisplayPitch
+ (int, const Clef &, const Key &, int &, Accidental &,
+ Accidentals::NoAccidentalStrategy);
+
+ static void displayPitchToRawPitch
+ (int, Accidental, const Clef &, const Key &,
+ int &, bool ignoreOffset = false);
+};
+
+
+
+class TimeSignature;
+
+
+/**
+ * The Note class represents note durations only, not pitch or
+ * accidental; it's therefore just as relevant to rest events as to
+ * note events. You can construct one of these from either.
+ */
+
+class Note
+{
+public:
+ static const std::string EventType;
+ static const std::string EventRestType;
+ static const int EventRestSubOrdering;
+
+ typedef int Type; // not an enum, too much arithmetic at stake
+
+ // define both sorts of names; some people prefer the American
+ // names, but I just can't remember which of them is which
+
+ static const Type
+
+ SixtyFourthNote = 0,
+ ThirtySecondNote = 1,
+ SixteenthNote = 2,
+ EighthNote = 3,
+ QuarterNote = 4,
+ HalfNote = 5,
+ WholeNote = 6,
+ DoubleWholeNote = 7,
+
+ Hemidemisemiquaver = 0,
+ Demisemiquaver = 1,
+ Semiquaver = 2,
+ Quaver = 3,
+ Crotchet = 4,
+ Minim = 5,
+ Semibreve = 6,
+ Breve = 7,
+
+ Shortest = 0,
+ Longest = 7;
+
+
+ /**
+ * Create a Note object of the given type, representing a
+ * particular sort of duration. Note objects are strictly
+ * durational; they don't represent pitch, and may be as
+ * relevant to rests as actual notes.
+ */
+ Note(Type type, int dots = 0) :
+ m_type(type < Shortest ? Shortest :
+ type > Longest ? Longest :
+ type),
+ m_dots(dots) { }
+
+ Note(const Note &n) : m_type(n.m_type), m_dots(n.m_dots) { }
+ ~Note() { }
+
+ Note &operator=(const Note &n);
+
+ Type getNoteType() const { return m_type; }
+ int getDots() const { return m_dots; }
+
+ /**
+ * Return the duration of this note type.
+ */
+ timeT getDuration() const {
+ return m_dots ? getDurationAux() : (m_shortestTime * (1 << m_type));
+ }
+
+ /**
+ * Return the Note whose duration is closest to (but shorter than or
+ * equal to) the given duration, permitting at most maxDots dots.
+ */
+ static Note getNearestNote(timeT duration, int maxDots = 2);
+
+ /// Returned event is on heap; caller takes responsibility for ownership
+ Event *getAsNoteEvent(timeT absoluteTime, int pitch) const;
+
+ /// Returned event is on heap; caller takes responsibility for ownership
+ Event *getAsRestEvent(timeT absoluteTime) const;
+
+
+private:
+ Type m_type;
+ int m_dots;
+
+ timeT getDurationAux() const;
+
+ // a time & effort saving device; if changing this, change
+ // TimeSignature::m_crotchetTime etc too
+ static const timeT m_shortestTime;
+};
+
+
+
+/**
+ * TimeSignature contains arithmetic methods relevant to time
+ * signatures and bar durations, including code for splitting long
+ * rest intervals into bite-sized chunks. Although there is a time
+ * signature Event type, these Events don't appear in regular Segments
+ * but only in the Composition's reference segment.
+ */
+
+class TimeSignature
+{
+public:
+ static const TimeSignature DefaultTimeSignature;
+ typedef Exception BadTimeSignature;
+
+ TimeSignature() :
+ m_numerator(DefaultTimeSignature.m_numerator),
+ m_denominator(DefaultTimeSignature.m_denominator),
+ m_common(false), m_hidden(false), m_hiddenBars(false) { }
+
+ /**
+ * Construct a TimeSignature object describing a time signature
+ * with the given numerator and denominator. If preferCommon is
+ * true and the time signature is a common or cut-common time, the
+ * constructed object will return true for isCommon; if hidden is
+ * true, the time signature is intended not to be displayed and
+ * isHidden will return true; if hiddenBars is true, the bar lines
+ * between this time signature and the next will not be shown.
+ */
+ TimeSignature(int numerator, int denominator,
+ bool preferCommon = false,
+ bool hidden = false,
+ bool hiddenBars = false)
+ /* throw (BadTimeSignature) */;
+
+ TimeSignature(const TimeSignature &ts) :
+ m_numerator(ts.m_numerator),
+ m_denominator(ts.m_denominator),
+ m_common(ts.m_common),
+ m_hidden(ts.m_hidden),
+ m_hiddenBars(ts.m_hiddenBars) { }
+
+ ~TimeSignature() { }
+
+ TimeSignature &operator=(const TimeSignature &ts);
+
+ bool operator==(const TimeSignature &ts) const {
+ return ts.m_numerator == m_numerator && ts.m_denominator == m_denominator;
+ }
+ bool operator!=(const TimeSignature &ts) const {
+ return !operator==(ts);
+ }
+
+ int getNumerator() const { return m_numerator; }
+ int getDenominator() const { return m_denominator; }
+
+ bool isCommon() const { return m_common; }
+ bool isHidden() const { return m_hidden; }
+ bool hasHiddenBars() const { return m_hiddenBars; }
+
+ timeT getBarDuration() const;
+
+ /**
+ * Return the unit of the time signature. This is the note
+ * implied by the denominator. For example, the unit of 4/4 time
+ * is the crotchet, and that of 6/8 is the quaver. (The numerator
+ * of the time signature gives the number of units per bar.)
+ */
+ Note::Type getUnit() const;
+
+ /**
+ * Return the duration of the unit of the time signature.
+ * See also getUnit(). In most cases getBeatDuration() gives
+ * a more meaningful value.
+ */
+ timeT getUnitDuration() const;
+
+ /**
+ * Return true if this time signature indicates dotted time.
+ */
+ bool isDotted() const;
+
+ /**
+ * Return the duration of the beat of the time signature. For
+ * example, the beat of 4/4 time is the crotchet, the same as its
+ * unit, but that of 6/8 is the dotted crotchet (there are only
+ * two beats in a 6/8 bar). The beat therefore depends on whether
+ * the signature indicates dotted or undotted time.
+ */
+ timeT getBeatDuration() const;
+
+ /**
+ * Return the number of beats in a complete bar.
+ */
+ int getBeatsPerBar() const {
+ return getBarDuration() / getBeatDuration();
+ }
+
+ /**
+ * Get the "optimal" list of rest durations to make up a bar in
+ * this time signature.
+ */
+ void getDurationListForBar(DurationList &dlist) const;
+
+ /**
+ * Get the "optimal" list of rest durations to make up a time
+ * interval of the given total duration, starting at the given
+ * offset after the start of a bar, assuming that the interval
+ * is entirely in this time signature.
+ */
+ void getDurationListForInterval(DurationList &dlist,
+ timeT intervalDuration,
+ timeT startOffset = 0) const;
+
+ /**
+ * Get the level of emphasis for a position in a bar. 4 is lots
+ * of emphasis, 0 is none.
+ */
+ int getEmphasisForTime(timeT offset);
+
+ /**
+ * Return a list of divisions, subdivisions, subsubdivisions
+ * etc of a bar in this time, up to the given depth. For example,
+ * if the time signature is 6/8 and the depth is 3, return a list
+ * containing 2, 3, and 2 (there are 2 beats to the bar, each of
+ * which is best subdivided into 3 subdivisions, each of which
+ * divides most neatly into 2).
+ */
+ void getDivisions(int depth, std::vector<int> &divisions) const;
+
+private:
+ friend class Composition;
+ friend class TimeTempoSelection;
+
+ TimeSignature(const Event &e)
+ /* throw (Event::NoData, Event::BadType, BadTimeSignature) */;
+
+ static const std::string EventType;
+ static const int EventSubOrdering;
+ static const PropertyName NumeratorPropertyName;
+ static const PropertyName DenominatorPropertyName;
+ static const PropertyName ShowAsCommonTimePropertyName;
+ static const PropertyName IsHiddenPropertyName;
+ static const PropertyName HasHiddenBarsPropertyName;
+
+ /// Returned event is on heap; caller takes responsibility for ownership
+ Event *getAsEvent(timeT absoluteTime) const;
+
+private:
+ int m_numerator;
+ int m_denominator;
+
+ bool m_common;
+ bool m_hidden;
+ bool m_hiddenBars;
+
+ mutable int m_barDuration;
+ mutable int m_beatDuration;
+ mutable int m_beatDivisionDuration;
+ mutable bool m_dotted;
+ void setInternalDurations() const;
+
+ // a time & effort saving device
+ static const timeT m_crotchetTime;
+ static const timeT m_dottedCrotchetTime;
+};
+
+
+
+/**
+ * AccidentalTable represents a set of accidentals in force at a
+ * given time.
+ *
+ * Keep an AccidentalTable variable on-hand as you track through a
+ * staff; then when reading a chord, call processDisplayAccidental
+ * on the accidentals found in the chord to obtain the actual
+ * displayed accidentals and to tell the AccidentalTable to
+ * remember the accidentals that have been found in the chord.
+ * Then when the chord ends, call update() on the AccidentalTable
+ * so that that chord's accidentals are taken into account for the
+ * next one.
+ *
+ * Create a new AccidentalTable whenever a new key is encountered,
+ * and call newBar() or newClef() when a new bar happens or a new
+ * clef is encountered.
+ */
+class AccidentalTable
+{
+public:
+ enum OctaveType {
+ OctavesIndependent, // if c' and c'' sharp, mark them both sharp
+ OctavesCautionary, // if c' and c'' sharp, put the second one in brackets
+ OctavesEquivalent // if c' and c'' sharp, only mark the first one
+ };
+
+ enum BarResetType {
+ BarResetNone, // c# | c -> omit natural
+ BarResetCautionary, // c# | c -> add natural to c in brackets
+ BarResetExplicit // c# | c -> add natural to c
+ };
+
+ AccidentalTable(const Key &, const Clef &,
+ OctaveType = OctavesCautionary,
+ BarResetType = BarResetCautionary);
+
+ AccidentalTable(const AccidentalTable &);
+ AccidentalTable &operator=(const AccidentalTable &);
+
+ Accidental processDisplayAccidental(const Accidental &displayAcc,
+ int heightOnStaff,
+ bool &cautionary);
+
+ void update();
+
+ void newBar();
+ void newClef(const Clef &);
+
+private:
+ Key m_key;
+ Clef m_clef;
+ OctaveType m_octaves;
+ BarResetType m_barReset;
+
+ struct AccidentalRec {
+ AccidentalRec() : accidental(Accidentals::NoAccidental), previousBar(false) { }
+ AccidentalRec(Accidental a, bool p) : accidental(a), previousBar(p) { }
+ Accidental accidental;
+ bool previousBar;
+ };
+
+ typedef std::map<int, AccidentalRec> AccidentalMap;
+
+ AccidentalMap m_accidentals;
+ AccidentalMap m_canonicalAccidentals;
+
+ AccidentalMap m_newAccidentals;
+ AccidentalMap m_newCanonicalAccidentals;
+};
+
+
+}
+
+
+#endif
diff --git a/src/base/Profiler.cpp b/src/base/Profiler.cpp
new file mode 100644
index 0000000..4f3ab42
--- /dev/null
+++ b/src/base/Profiler.cpp
@@ -0,0 +1,187 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include <iostream>
+#include "Profiler.h"
+
+#include <vector>
+#include <algorithm>
+
+//#define NO_TIMING 1
+
+#ifdef NDEBUG
+#define NO_TIMING 1
+#endif
+
+using std::cerr;
+using std::endl;
+
+namespace Rosegarden
+{
+
+Profiles* Profiles::m_instance = 0;
+
+Profiles* Profiles::getInstance()
+{
+ if (!m_instance) m_instance = new Profiles();
+
+ return m_instance;
+}
+
+Profiles::Profiles()
+{
+}
+
+Profiles::~Profiles()
+{
+ dump();
+}
+
+void Profiles::accumulate(const char* id, clock_t time, RealTime rt)
+{
+#ifndef NO_TIMING
+ ProfilePair &pair(m_profiles[id]);
+ ++pair.first;
+ pair.second.first += time;
+ pair.second.second = pair.second.second + rt;
+
+ TimePair &timePair(m_lastCalls[id]);
+ timePair.first = time;
+ timePair.second = rt;
+#endif
+}
+
+void Profiles::dump()
+{
+#ifndef NO_TIMING
+ cerr << "Profiles::dump() :\n";
+
+ // I'm finding these two confusing dumped out in random order,
+ // so I'm going to sort them alphabetically:
+
+ std::vector<const char *> profileNames;
+ for (ProfileMap::iterator i = m_profiles.begin();
+ i != m_profiles.end(); ++i) {
+ profileNames.push_back((*i).first);
+ }
+
+ std::sort(profileNames.begin(), profileNames.end());
+
+ for (std::vector<const char *>::iterator i = profileNames.begin();
+ i != profileNames.end(); ++i) {
+
+ cerr << "-> " << *i << ": CPU: "
+ << m_profiles[*i].first << " calls, "
+ << int((m_profiles[*i].second.first * 1000.0) / CLOCKS_PER_SEC) << "ms, "
+ << (((double)m_profiles[*i].second.first * 1000000.0 /
+ (double)m_profiles[*i].first) / CLOCKS_PER_SEC) << "us/call"
+ << endl;
+
+ cerr << "-> " << *i << ": real: "
+ << m_profiles[*i].first << " calls, "
+ << m_profiles[*i].second.second << ", "
+ << (m_profiles[*i].second.second / m_profiles[*i].first)
+ << "/call"
+ << endl;
+
+ cerr << "-> " << *i << ": last: CPU: "
+ << int((m_lastCalls[*i].first * 1000.0) / CLOCKS_PER_SEC) << "ms, "
+ << " real: "
+ << m_lastCalls[*i].second << endl;
+ }
+
+ cerr << "Profiles::dump() finished\n";
+#endif
+}
+
+Profiler::Profiler(const char* c, bool showOnDestruct)
+ : m_c(c),
+ m_showOnDestruct(showOnDestruct)
+{
+#ifndef NO_TIMING
+ m_startCPU = clock();
+
+ struct timeval tv;
+ (void)gettimeofday(&tv, 0);
+ m_startTime = RealTime(tv.tv_sec, tv.tv_usec * 1000);
+#endif
+}
+
+void
+Profiler::update()
+{
+#ifndef NO_TIMING
+ clock_t elapsedCPU = clock() - m_startCPU;
+
+ struct timeval tv;
+ (void)gettimeofday(&tv, 0);
+ RealTime elapsedTime = RealTime(tv.tv_sec, tv.tv_usec * 1000) - m_startTime;
+
+ cerr << "Profiler : id = " << m_c
+ << " - elapsed so far = " << ((elapsedCPU * 1000) / CLOCKS_PER_SEC)
+ << "ms CPU, " << elapsedTime << " real" << endl;
+#endif
+}
+
+Profiler::~Profiler()
+{
+#ifndef NO_TIMING
+ clock_t elapsedCPU = clock() - m_startCPU;
+
+ struct timeval tv;
+ (void)gettimeofday(&tv, 0);
+ RealTime elapsedTime = RealTime(tv.tv_sec, tv.tv_usec * 1000) - m_startTime;
+
+ Profiles::getInstance()->accumulate(m_c, elapsedCPU, elapsedTime);
+
+ if (m_showOnDestruct)
+ cerr << "Profiler : id = " << m_c
+ << " - elapsed = " << ((elapsedCPU * 1000) / CLOCKS_PER_SEC)
+ << "ms CPU, " << elapsedTime << " real" << endl;
+#endif
+}
+
+}
+
+/* A little usage demo
+
+int main()
+{
+ {
+ Profiler foo("test");
+ sleep(1);
+ }
+
+ {
+ Profiler foo("test");
+ sleep(1);
+ }
+
+ {
+ Profiler foo("test2");
+ sleep(1);
+ }
+
+ Profiles::getInstance()->dump();
+
+ return 0;
+}
+*/
diff --git a/src/base/Profiler.h b/src/base/Profiler.h
new file mode 100644
index 0000000..4ba033b
--- /dev/null
+++ b/src/base/Profiler.h
@@ -0,0 +1,84 @@
+// -*- c-basic-offset: 4 -*-
+
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _PROFILER_H_
+#define _PROFILER_H_
+
+#include <ctime>
+#include <sys/time.h>
+#include <map>
+
+#include "RealTime.h"
+
+
+namespace Rosegarden
+{
+
+/**
+ * Profiling classes
+ */
+
+/**
+ * The class holding all profiling data
+ *
+ * This class is a singleton
+ */
+class Profiles
+{
+public:
+ static Profiles* getInstance();
+ ~Profiles();
+
+ void accumulate(const char* id, clock_t time, RealTime rt);
+ void dump();
+
+protected:
+ Profiles();
+
+ typedef std::pair<clock_t, RealTime> TimePair;
+ typedef std::pair<int, TimePair> ProfilePair;
+ typedef std::map<const char *, ProfilePair> ProfileMap;
+ typedef std::map<const char *, TimePair> LastCallMap;
+ ProfileMap m_profiles;
+ LastCallMap m_lastCalls;
+
+ static Profiles* m_instance;
+};
+
+class Profiler
+{
+public:
+ Profiler(const char*, bool showOnDestruct = false);
+ ~Profiler();
+
+ void update();
+
+protected:
+ const char* m_c;
+ clock_t m_startCPU;
+ RealTime m_startTime;
+ bool m_showOnDestruct;
+};
+
+}
+
+#endif
diff --git a/src/base/Property.cpp b/src/base/Property.cpp
new file mode 100644
index 0000000..45e818b
--- /dev/null
+++ b/src/base/Property.cpp
@@ -0,0 +1,169 @@
+// -*- c-basic-offset: 4 -*-
+
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include "Property.h"
+#include <cstdio>
+#include <cstdlib>
+#include <string>
+
+namespace Rosegarden
+{
+using std::string;
+
+string
+PropertyDefn<UInt>::typeName()
+{
+ return "UInt";
+}
+
+PropertyDefn<UInt>::basic_type
+PropertyDefn<UInt>::parse(string s)
+{
+ return atoi(s.c_str());
+}
+
+string
+PropertyDefn<UInt>::unparse(PropertyDefn<UInt>::basic_type i)
+{
+ static char buffer[20]; sprintf(buffer, "%ld", i);
+ return buffer;
+}
+
+
+string
+PropertyDefn<Int>::typeName()
+{
+ return "Int";
+}
+
+PropertyDefn<Int>::basic_type
+PropertyDefn<Int>::parse(string s)
+{
+ return atoi(s.c_str());
+}
+
+string
+PropertyDefn<Int>::unparse(PropertyDefn<Int>::basic_type i)
+{
+ static char buffer[20]; sprintf(buffer, "%ld", i);
+ return buffer;
+}
+
+string
+PropertyDefn<String>::typeName()
+{
+ return "String";
+}
+
+PropertyDefn<String>::basic_type
+PropertyDefn<String>::parse(string s)
+{
+ return s;
+}
+
+string
+PropertyDefn<String>::unparse(PropertyDefn<String>::basic_type i)
+{
+ return i;
+}
+
+string
+PropertyDefn<Bool>::typeName()
+{
+ return "Bool";
+}
+
+PropertyDefn<Bool>::basic_type
+PropertyDefn<Bool>::parse(string s)
+{
+ return s == "true";
+}
+
+string
+PropertyDefn<Bool>::unparse(PropertyDefn<Bool>::basic_type i)
+{
+ return (i ? "true" : "false");
+}
+
+string
+PropertyDefn<RealTimeT>::typeName()
+{
+ return "RealTimeT";
+}
+
+PropertyDefn<RealTimeT>::basic_type
+PropertyDefn<RealTimeT>::parse(string s)
+{
+ string sec = s.substr(0, s.find('/')),
+ nsec = s.substr(s.find('/') + 1);
+
+ return RealTime(atoi(sec.c_str()), atoi(nsec.c_str()));
+}
+
+string
+PropertyDefn<RealTimeT>::unparse(PropertyDefn<RealTimeT>::basic_type i)
+{
+ static char buffer[256]; sprintf(buffer, "%d/%d", i.sec, i.nsec);
+ return buffer;
+}
+
+PropertyStoreBase::~PropertyStoreBase()
+{
+}
+
+template <>
+size_t
+PropertyStore<UInt>::getStorageSize() const
+{
+ return sizeof(*this);
+}
+
+template <>
+size_t
+PropertyStore<Int>::getStorageSize() const
+{
+ return sizeof(*this);
+}
+
+template <>
+size_t
+PropertyStore<String>::getStorageSize() const
+{
+ return sizeof(*this) + m_data.size();
+}
+
+template <>
+size_t
+PropertyStore<Bool>::getStorageSize() const
+{
+ return sizeof(*this);
+}
+
+template <>
+size_t
+PropertyStore<RealTimeT>::getStorageSize() const
+{
+ return sizeof(*this);
+}
+
+}
+
diff --git a/src/base/Property.h b/src/base/Property.h
new file mode 100644
index 0000000..32b6226
--- /dev/null
+++ b/src/base/Property.h
@@ -0,0 +1,225 @@
+// -*- c-basic-offset: 4 -*-
+
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _PROPERTY_H_
+#define _PROPERTY_H_
+
+#include <string>
+
+#include "RealTime.h"
+
+namespace Rosegarden
+{
+
+enum PropertyType { Int, String, Bool, RealTimeT, UInt };
+
+template <PropertyType P>
+class PropertyDefn
+{
+public:
+ struct PropertyDefnNotDefined {
+ PropertyDefnNotDefined() { throw(0); }
+ };
+ typedef PropertyDefnNotDefined basic_type;
+
+ static std::string typeName() { return "Undefined"; }
+ static basic_type parse(std::string);
+ static std::string unparse(basic_type);
+};
+
+template <PropertyType P>
+typename PropertyDefn<P>::basic_type
+PropertyDefn<P>::parse(std::string)
+{
+ throw(0);
+ return "";
+}
+
+template <PropertyType P>
+std::string
+PropertyDefn<P>::unparse(PropertyDefn<P>::basic_type)
+{
+ throw(0);
+ return "";
+}
+
+
+template <>
+class PropertyDefn<Int>
+{
+public:
+ typedef long basic_type;
+
+ static std::string typeName();
+ static basic_type parse(std::string s);
+ static std::string unparse(basic_type i);
+};
+
+
+template <>
+class PropertyDefn<String>
+{
+public:
+ typedef std::string basic_type;
+
+ static std::string typeName();
+ static basic_type parse(std::string s);
+ static std::string unparse(basic_type i);
+};
+
+template <>
+class PropertyDefn<Bool>
+{
+public:
+ typedef bool basic_type;
+
+ static std::string typeName();
+ static basic_type parse(std::string s);
+ static std::string unparse(basic_type i);
+};
+
+template <>
+class PropertyDefn<RealTimeT>
+{
+public:
+ typedef RealTime basic_type;
+
+ static std::string typeName();
+ static basic_type parse(std::string s);
+ static std::string unparse(basic_type i);
+};
+
+template <>
+class PropertyDefn<UInt>
+{
+public:
+ typedef unsigned int basic_type;
+
+ static std::string typeName();
+ static basic_type parse(std::string s);
+ static std::string unparse(basic_type i);
+};
+
+
+class PropertyStoreBase {
+public:
+ virtual ~PropertyStoreBase();
+
+ virtual PropertyType getType() const = 0;
+ virtual std::string getTypeName() const = 0;
+ virtual PropertyStoreBase *clone() = 0;
+ virtual std::string unparse() const = 0;
+
+ virtual size_t getStorageSize() const = 0; // for debugging
+
+#ifndef NDEBUG
+ virtual void dump(std::ostream&) const = 0;
+#else
+ virtual void dump(std::ostream&) const { }
+#endif
+};
+
+#ifndef NDEBUG
+inline std::ostream& operator<<(std::ostream &out, PropertyStoreBase &e)
+{ e.dump(out); return out; }
+#endif
+
+template <PropertyType P>
+class PropertyStore : public PropertyStoreBase
+{
+public:
+ PropertyStore(typename PropertyDefn<P>::basic_type d) :
+ m_data(d) { }
+ PropertyStore(const PropertyStore<P> &p) :
+ PropertyStoreBase(p), m_data(p.m_data) { }
+ PropertyStore &operator=(const PropertyStore<P> &p);
+
+ virtual PropertyType getType() const;
+ virtual std::string getTypeName() const;
+
+ virtual PropertyStoreBase* clone();
+
+ virtual std::string unparse() const;
+
+ typename PropertyDefn<P>::basic_type getData() { return m_data; }
+ void setData(typename PropertyDefn<P>::basic_type data) { m_data = data; }
+
+ virtual size_t getStorageSize() const;
+
+#ifndef NDEBUG
+ void dump(std::ostream&) const;
+#endif
+
+private:
+ typename PropertyDefn<P>::basic_type m_data;
+};
+
+template <PropertyType P>
+PropertyStore<P>&
+PropertyStore<P>::operator=(const PropertyStore<P> &p) {
+ if (this != &p) {
+ m_data = p.m_data;
+ }
+ return *this;
+}
+
+template <PropertyType P>
+PropertyType
+PropertyStore<P>::getType() const
+{
+ return P;
+}
+
+template <PropertyType P>
+std::string
+PropertyStore<P>::getTypeName() const
+{
+ return PropertyDefn<P>::typeName();
+}
+
+template <PropertyType P>
+PropertyStoreBase*
+PropertyStore<P>::clone()
+{
+ return new PropertyStore<P>(*this);
+}
+
+template <PropertyType P>
+std::string
+PropertyStore<P>::unparse() const
+{
+ return PropertyDefn<P>::unparse(m_data);
+}
+
+#ifndef NDEBUG
+template <PropertyType P>
+void
+PropertyStore<P>::dump(std::ostream &out) const
+{
+ out << getTypeName() << " - " << unparse();
+}
+#endif
+
+}
+
+
+#endif
diff --git a/src/base/PropertyMap.cpp b/src/base/PropertyMap.cpp
new file mode 100644
index 0000000..5958dc2
--- /dev/null
+++ b/src/base/PropertyMap.cpp
@@ -0,0 +1,101 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include <cstdio>
+#include <iostream>
+#include <string>
+#include "PropertyMap.h"
+#include "XmlExportable.h"
+
+namespace Rosegarden
+{
+using std::string;
+
+#ifdef PROPERTY_MAP_IS_HASH_MAP
+PropertyMap::PropertyMap() :
+ __HASH_NS::hash_map<PropertyName,
+ PropertyStoreBase *,
+ PropertyNameHash,
+ PropertyNamesEqual>(50, PropertyNameHash())
+{
+ // nothing
+}
+#endif
+
+PropertyMap::PropertyMap(const PropertyMap &pm) :
+
+#ifdef PROPERTY_MAP_IS_HASH_MAP
+
+ __HASH_NS::hash_map<PropertyName,
+ PropertyStoreBase *,
+ PropertyNameHash,
+ PropertyNamesEqual>(50, PropertyNameHash())
+#else
+
+ std::map<PropertyName, PropertyStoreBase *>()
+
+#endif
+
+{
+ for (const_iterator i = pm.begin(); i != pm.end(); ++i) {
+ insert(PropertyPair(i->first, i->second->clone()));
+ }
+}
+
+PropertyMap::~PropertyMap()
+{
+ for (iterator i = begin(); i != end(); ++i) delete i->second;
+}
+
+void
+PropertyMap::clear()
+{
+ for (iterator i = begin(); i != end(); ++i) delete i->second;
+ erase(begin(), end());
+}
+
+
+// We could derive from XmlExportable and make this a virtual method
+// overriding XmlExportable's pure virtual. We don't, because this
+// class has no other virtual methods and for such a core class we
+// could do without the overhead (given that it wouldn't really gain
+// us anything anyway).
+
+string
+PropertyMap::toXmlString()
+{
+ string xml;
+
+ for (const_iterator i = begin(); i != end(); ++i) {
+
+ xml +=
+ "<property name=\"" + XmlExportable::encode(i->first.getName()) +
+ "\" " + i->second->getTypeName() +
+ "=\"" + XmlExportable::encode(i->second->unparse()) +
+ "\"/>";
+
+ }
+
+ return xml;
+}
+
+}
+
diff --git a/src/base/PropertyMap.h b/src/base/PropertyMap.h
new file mode 100644
index 0000000..fca603c
--- /dev/null
+++ b/src/base/PropertyMap.h
@@ -0,0 +1,50 @@
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _PROPERTY_MAP_H_
+#define _PROPERTY_MAP_H_
+
+#include "Property.h"
+#include "PropertyName.h"
+
+#include <map>
+
+namespace Rosegarden {
+
+class PropertyMap : public std::map<PropertyName, PropertyStoreBase *>
+{
+public:
+ PropertyMap() { }
+ PropertyMap(const PropertyMap &pm);
+
+ ~PropertyMap();
+
+ void clear();
+
+ std::string toXmlString();
+
+private:
+ PropertyMap &operator=(const PropertyMap &); // not provided
+};
+
+typedef PropertyMap::value_type PropertyPair;
+
+}
+
+#endif
diff --git a/src/base/PropertyName.cpp b/src/base/PropertyName.cpp
new file mode 100644
index 0000000..11ff019
--- /dev/null
+++ b/src/base/PropertyName.cpp
@@ -0,0 +1,86 @@
+// -*- c-basic-offset: 4 -*-
+
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include <iostream>
+#include <string>
+
+#include "PropertyName.h"
+#include "Exception.h"
+
+
+namespace Rosegarden
+{
+using std::string;
+
+PropertyName::intern_map *PropertyName::m_interns = 0;
+PropertyName::intern_reverse_map *PropertyName::m_internsReversed = 0;
+int PropertyName::m_nextValue = 0;
+
+int PropertyName::intern(const string &s)
+{
+ if (!m_interns) {
+ m_interns = new intern_map;
+ m_internsReversed = new intern_reverse_map;
+ }
+
+ intern_map::iterator i(m_interns->find(s));
+
+ if (i != m_interns->end()) {
+ return i->second;
+ } else {
+ int nv = ++m_nextValue;
+ m_interns->insert(intern_pair(s, nv));
+ m_internsReversed->insert(intern_reverse_pair(nv, s));
+ return nv;
+ }
+}
+
+string PropertyName::getName() const
+{
+ intern_reverse_map::iterator i(m_internsReversed->find(m_value));
+ if (i != m_internsReversed->end()) return i->second;
+
+ // dump some informative data, even if we aren't in debug mode,
+ // because this really shouldn't be happening
+ std::cerr << "ERROR: PropertyName::getName: value corrupted!\n";
+ std::cerr << "PropertyName's internal value is " << m_value << std::endl;
+ std::cerr << "Reverse interns are ";
+ i = m_internsReversed->begin();
+ if (i == m_internsReversed->end()) std::cerr << "(none)";
+ else while (i != m_internsReversed->end()) {
+ if (i != m_internsReversed->begin()) {
+ std::cerr << ", ";
+ }
+ std::cerr << i->first << "=" << i->second;
+ ++i;
+ }
+ std::cerr << std::endl;
+
+ throw Exception
+ ("Serious problem in PropertyName::getName(): property "
+ "name's internal value is corrupted -- see stderr for details");
+}
+
+const PropertyName PropertyName::EmptyPropertyName = "";
+
+}
+
diff --git a/src/base/PropertyName.h b/src/base/PropertyName.h
new file mode 100644
index 0000000..f9e8c20
--- /dev/null
+++ b/src/base/PropertyName.h
@@ -0,0 +1,158 @@
+// -*- c-basic-offset: 4 -*-
+
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _PROPERTY_NAME_H_
+#define _PROPERTY_NAME_H_
+
+#include <string>
+#include <map>
+#include <iostream>
+
+namespace Rosegarden
+{
+
+/**
+
+ A PropertyName is something that can be constructed from a string,
+ compared quickly as an int, hashed as a key in a hash map, and
+ streamed out again as a string. It must have accompanying functors
+ PropertyNamesEqual and PropertyNameHash which compare and hash
+ PropertyName objects.
+
+ The simplest implementation is a string:
+
+ typedef std::string PropertyName;
+
+ struct PropertyNamesEqual {
+ bool operator() (const PropertyName &s1, const PropertyName &s2) const {
+ return s1 == s2;
+ }
+ };
+
+ struct PropertyNameHash {
+ static std::hash<const char *> _H;
+ size_t operator() (const PropertyName &s) const {
+ return _H(s.c_str());
+ }
+ };
+
+ std::hash<const char *> PropertyNameHash::_H;
+
+ but our implementation is faster in practice: while it behaves
+ outwardly like a string, for the Event that makes use of it,
+ it performs much like a machine integer. It also shares
+ strings, reducing storage sizes if there are many names in use.
+
+ A big caveat with this class is that it is _not_ safe to persist
+ the values of PropertyNames and assume that the original strings
+ can be recovered; they can't. The values are assigned on demand,
+ and there's no guarantee that a given string will always map to
+ the same value (on separate invocations of the program). This
+ is why there's no PropertyName(int) constructor and no mechanism
+ for storing PropertyNames in properties. (Of course, you can
+ store the string representation of a PropertyName in a property;
+ but that's slow.)
+
+*/
+
+class PropertyName
+{
+public:
+ PropertyName() : m_value(-1) { }
+ PropertyName(const char *cs) { std::string s(cs); m_value = intern(s); }
+ PropertyName(const std::string &s) : m_value(intern(s)) { }
+ PropertyName(const PropertyName &p) : m_value(p.m_value) { }
+ ~PropertyName() { }
+
+ PropertyName &operator=(const char *cs) {
+ std::string s(cs);
+ m_value = intern(s);
+ return *this;
+ }
+ PropertyName &operator=(const std::string &s) {
+ m_value = intern(s);
+ return *this;
+ }
+ PropertyName &operator=(const PropertyName &p) {
+ m_value = p.m_value;
+ return *this;
+ }
+
+ bool operator==(const PropertyName &p) const {
+ return m_value == p.m_value;
+ }
+ bool operator< (const PropertyName &p) const {
+ return m_value < p.m_value;
+ }
+
+ const char *c_str() const {
+ return getName().c_str();
+ }
+
+ std::string getName() const /* throw (CorruptedValue) */;
+
+ int getValue() const { return m_value; }
+
+ static const PropertyName EmptyPropertyName;
+
+private:
+ typedef std::map<std::string, int> intern_map;
+ typedef intern_map::value_type intern_pair;
+
+ typedef std::map<int, std::string> intern_reverse_map;
+ typedef intern_reverse_map::value_type intern_reverse_pair;
+
+ static intern_map *m_interns;
+ static intern_reverse_map *m_internsReversed;
+ static int m_nextValue;
+
+ int m_value;
+
+ static int intern(const std::string &s);
+};
+
+inline std::ostream& operator<<(std::ostream &out, const PropertyName &n) {
+ out << n.getName();
+ return out;
+}
+
+inline std::string operator+(const std::string &s, const PropertyName &n) {
+ return s + n.getName();
+}
+
+struct PropertyNamesEqual
+{
+ bool operator() (const PropertyName &s1, const PropertyName &s2) const {
+ return s1 == s2;
+ }
+};
+
+struct PropertyNameHash
+{
+ size_t operator() (const PropertyName &s) const {
+ return static_cast<size_t>(s.getValue());
+ }
+};
+
+}
+
+#endif
diff --git a/src/base/Quantizer.cpp b/src/base/Quantizer.cpp
new file mode 100644
index 0000000..c0e4d1b
--- /dev/null
+++ b/src/base/Quantizer.cpp
@@ -0,0 +1,496 @@
+// -*- c-basic-offset: 4 -*-
+
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include "Quantizer.h"
+#include "BaseProperties.h"
+#include "NotationTypes.h"
+#include "Selection.h"
+#include "Composition.h"
+#include "Sets.h"
+#include "Profiler.h"
+
+#include <iostream>
+#include <cmath>
+#include <cstdio> // for sprintf
+#include <ctime>
+
+using std::cout;
+using std::cerr;
+using std::endl;
+
+//#define DEBUG_NOTATION_QUANTIZER 1
+
+namespace Rosegarden {
+
+Quantizer::Quantizer(std::string source,
+ std::string target) :
+ m_source(source), m_target(target)
+{
+ makePropertyNames();
+}
+
+
+Quantizer::Quantizer(std::string target) :
+ m_target(target)
+{
+ if (target == RawEventData) {
+ m_source = GlobalSource;
+ } else {
+ m_source = RawEventData;
+ }
+
+ makePropertyNames();
+}
+
+
+Quantizer::~Quantizer()
+{
+ // nothing
+}
+
+void
+Quantizer::quantize(Segment *s) const
+{
+ quantize(s, s->begin(), s->getEndMarker());
+}
+
+void
+Quantizer::quantize(Segment *s,
+ Segment::iterator from,
+ Segment::iterator to) const
+{
+ assert(m_toInsert.size() == 0);
+
+ quantizeRange(s, from, to);
+
+ insertNewEvents(s);
+}
+
+void
+Quantizer::quantize(EventSelection *selection)
+{
+ assert(m_toInsert.size() == 0);
+
+ Segment &segment = selection->getSegment();
+
+ // Attempt to handle non-contiguous selections.
+
+ // We have to be a bit careful here, because the rest-
+ // normalisation that's carried out as part of a quantize
+ // process is liable to replace the event that follows
+ // the quantized range. (moved here from editcommands.cpp)
+
+ EventSelection::RangeList ranges(selection->getRanges());
+
+ // So that we can retrieve a list of new events we cheat and stop
+ // the m_toInsert vector from being cleared automatically. Remember
+ // to turn it back on.
+ //
+
+ EventSelection::RangeList::iterator r = ranges.end();
+ while (r-- != ranges.begin()) {
+
+/*
+ cerr << "Quantizer: quantizing range ";
+ if (r->first == segment.end()) {
+ cerr << "end";
+ } else {
+ cerr << (*r->first)->getAbsoluteTime();
+ }
+ cerr << " to ";
+ if (r->second == segment.end()) {
+ cerr << "end";
+ } else {
+ cerr << (*r->second)->getAbsoluteTime();
+ }
+ cerr << endl;
+*/
+
+ quantizeRange(&segment, r->first, r->second);
+ }
+
+ // Push the new events to the selection
+ for (int i = 0; i < m_toInsert.size(); ++i) {
+ selection->addEvent(m_toInsert[i]);
+ }
+
+ // and then to the segment
+ insertNewEvents(&segment);
+}
+
+
+void
+Quantizer::fixQuantizedValues(Segment *s,
+ Segment::iterator from,
+ Segment::iterator to) const
+{
+ assert(m_toInsert.size() == 0);
+
+ quantize(s, from, to);
+
+ if (m_target == RawEventData) return;
+
+ for (Segment::iterator nextFrom = from; from != to; from = nextFrom) {
+
+ ++nextFrom;
+
+ timeT t = getFromTarget(*from, AbsoluteTimeValue);
+ timeT d = getFromTarget(*from, DurationValue);
+ Event *e = new Event(**from, t, d);
+ s->erase(from);
+ m_toInsert.push_back(e);
+ }
+
+ insertNewEvents(s);
+}
+
+
+timeT
+Quantizer::getQuantizedDuration(const Event *e) const
+{
+ if (m_target == RawEventData) {
+ return e->getDuration();
+ } else if (m_target == NotationPrefix) {
+ return e->getNotationDuration();
+ } else {
+ timeT d = e->getDuration();
+ e->get<Int>(m_targetProperties[DurationValue], d);
+ return d;
+ }
+}
+
+timeT
+Quantizer::getQuantizedAbsoluteTime(const Event *e) const
+{
+ if (m_target == RawEventData) {
+ return e->getAbsoluteTime();
+ } else if (m_target == NotationPrefix) {
+ return e->getNotationAbsoluteTime();
+ } else {
+ timeT t = e->getAbsoluteTime();
+ e->get<Int>(m_targetProperties[AbsoluteTimeValue], t);
+ return t;
+ }
+}
+
+timeT
+Quantizer::getUnquantizedAbsoluteTime(Event *e) const
+{
+ return getFromSource(e, AbsoluteTimeValue);
+}
+
+timeT
+Quantizer::getUnquantizedDuration(Event *e) const
+{
+ return getFromSource(e, DurationValue);
+}
+
+void
+Quantizer::quantizeRange(Segment *s,
+ Segment::iterator from,
+ Segment::iterator to) const
+{
+ //!!! It is vital that ordering is maintained after quantization.
+ // That is, an event whose absolute time quantizes to a time t must
+ // appear in the original segment before all events whose times
+ // quantize to greater than t. This means we must quantize the
+ // absolute times of non-note events as well as notes.
+
+ // We don't need to worry about quantizing rests, however; they're
+ // only used for notation and will be explicitly recalculated when
+ // the notation quantization values change.
+
+ for (Segment::iterator nextFrom = from; from != to; from = nextFrom) {
+
+ ++nextFrom;
+ quantizeSingle(s, from);
+ }
+}
+
+void
+Quantizer::unquantize(Segment *s,
+ Segment::iterator from,
+ Segment::iterator to) const
+{
+ assert(m_toInsert.size() == 0);
+
+ for (Segment::iterator nextFrom = from; from != to; from = nextFrom) {
+ ++nextFrom;
+
+ if (m_target == RawEventData || m_target == NotationPrefix) {
+ setToTarget(s, from,
+ getFromSource(*from, AbsoluteTimeValue),
+ getFromSource(*from, DurationValue));
+
+ } else {
+ removeTargetProperties(*from);
+ }
+ }
+
+ insertNewEvents(s);
+}
+
+void
+Quantizer::unquantize(EventSelection *selection) const
+{
+ assert(m_toInsert.size() == 0);
+
+ Segment *s = &selection->getSegment();
+
+ Rosegarden::EventSelection::eventcontainer::iterator it
+ = selection->getSegmentEvents().begin();
+
+ for (; it != selection->getSegmentEvents().end(); it++) {
+
+ if (m_target == RawEventData || m_target == NotationPrefix) {
+
+ Segment::iterator from = s->findSingle(*it);
+ Segment::iterator to = s->findSingle(*it);
+ setToTarget(s, from,
+ getFromSource(*from, AbsoluteTimeValue),
+ getFromSource(*to, DurationValue));
+
+ } else {
+ removeTargetProperties(*it);
+ }
+ }
+
+ insertNewEvents(&selection->getSegment());
+}
+
+
+
+timeT
+Quantizer::getFromSource(Event *e, ValueType v) const
+{
+ Profiler profiler("Quantizer::getFromSource");
+
+// cerr << "Quantizer::getFromSource: source is \"" << m_source << "\"" << endl;
+
+ if (m_source == RawEventData) {
+
+ if (v == AbsoluteTimeValue) return e->getAbsoluteTime();
+ else return e->getDuration();
+
+ } else if (m_source == NotationPrefix) {
+
+ if (v == AbsoluteTimeValue) return e->getNotationAbsoluteTime();
+ else return e->getNotationDuration();
+
+ } else {
+
+ // We need to write the source from the target if the
+ // source doesn't exist (and the target does)
+
+ bool haveSource = e->has(m_sourceProperties[v]);
+ bool haveTarget = ((m_target == RawEventData) ||
+ (e->has(m_targetProperties[v])));
+ timeT t = 0;
+
+ if (!haveSource && haveTarget) {
+ t = getFromTarget(e, v);
+ e->setMaybe<Int>(m_sourceProperties[v], t);
+ return t;
+ }
+
+ e->get<Int>(m_sourceProperties[v], t);
+ return t;
+ }
+}
+
+timeT
+Quantizer::getFromTarget(Event *e, ValueType v) const
+{
+ Profiler profiler("Quantizer::getFromTarget");
+
+ if (m_target == RawEventData) {
+
+ if (v == AbsoluteTimeValue) return e->getAbsoluteTime();
+ else return e->getDuration();
+
+ } else if (m_target == NotationPrefix) {
+
+ if (v == AbsoluteTimeValue) return e->getNotationAbsoluteTime();
+ else return e->getNotationDuration();
+
+ } else {
+ timeT value;
+ if (v == AbsoluteTimeValue) value = e->getAbsoluteTime();
+ else value = e->getDuration();
+ e->get<Int>(m_targetProperties[v], value);
+ return value;
+ }
+}
+
+void
+Quantizer::setToTarget(Segment *s, Segment::iterator i,
+ timeT absTime, timeT duration) const
+{
+ Profiler profiler("Quantizer::setToTarget");
+
+ //cerr << "Quantizer::setToTarget: target is \"" << m_target << "\", absTime is " << absTime << ", duration is " << duration << " (unit is " << m_unit << ", original values are absTime " << (*i)->getAbsoluteTime() << ", duration " << (*i)->getDuration() << ")" << endl;
+
+ timeT st = 0, sd = 0;
+ bool haveSt = false, haveSd = false;
+ if (m_source != RawEventData && m_target == RawEventData) {
+ haveSt = (*i)->get<Int>(m_sourceProperties[AbsoluteTimeValue], st);
+ haveSd = (*i)->get<Int>(m_sourceProperties[DurationValue], sd);
+ }
+
+ Event *e;
+ if (m_target == RawEventData) {
+ e = new Event(**i, absTime, duration);
+ } else if (m_target == NotationPrefix) {
+ // Setting the notation absolute time on an event without
+ // recreating it would be dodgy, just as setting the absolute
+ // time would, because it could change the ordering of events
+ // that are already being referred to in ViewElementLists,
+ // preventing us from locating them in the ViewElementLists
+ // because their ordering would have silently changed
+#ifdef DEBUG_NOTATION_QUANTIZER
+ cout << "Quantizer: setting " << absTime << " to notation absolute time and "
+ << duration << " to notation duration"
+ << endl;
+#endif
+ e = new Event(**i, (*i)->getAbsoluteTime(), (*i)->getDuration(),
+ (*i)->getSubOrdering(), absTime, duration);
+ } else {
+ e = *i;
+ e->clearNonPersistentProperties();
+ }
+
+ if (m_target == NotationPrefix) {
+ timeT normalizeStart = std::min(absTime, (*i)->getAbsoluteTime());
+ timeT normalizeEnd = std::max(absTime + duration,
+ (*i)->getAbsoluteTime() +
+ (*i)->getDuration()) + 1;
+
+ if (m_normalizeRegion.first != m_normalizeRegion.second) {
+ normalizeStart = std::min(normalizeStart, m_normalizeRegion.first);
+ normalizeEnd = std::max(normalizeEnd, m_normalizeRegion.second);
+ }
+
+ m_normalizeRegion = std::pair<timeT, timeT>
+ (normalizeStart, normalizeEnd);
+ }
+
+ if (haveSt) e->setMaybe<Int>(m_sourceProperties[AbsoluteTimeValue],st);
+ if (haveSd) e->setMaybe<Int>(m_sourceProperties[DurationValue], sd);
+
+ if (m_target != RawEventData && m_target != NotationPrefix) {
+ e->setMaybe<Int>(m_targetProperties[AbsoluteTimeValue], absTime);
+ e->setMaybe<Int>(m_targetProperties[DurationValue], duration);
+ } else {
+ s->erase(i);
+ m_toInsert.push_back(e);
+ }
+
+#ifdef DEBUG_NOTATION_QUANTIZER
+ cout << "m_toInsert.size() is now " << m_toInsert.size() << endl;
+#endif
+}
+
+void
+Quantizer::removeProperties(Event *e) const
+{
+ if (m_source != RawEventData) {
+ e->unset(m_sourceProperties[AbsoluteTimeValue]);
+ e->unset(m_sourceProperties[DurationValue]);
+ }
+
+ if (m_target != RawEventData && m_target != NotationPrefix) {
+ e->unset(m_targetProperties[AbsoluteTimeValue]);
+ e->unset(m_targetProperties[DurationValue]);
+ }
+}
+
+void
+Quantizer::removeTargetProperties(Event *e) const
+{
+ if (m_target != RawEventData) {
+ e->unset(m_targetProperties[AbsoluteTimeValue]);
+ e->unset(m_targetProperties[DurationValue]);
+ }
+}
+
+void
+Quantizer::makePropertyNames()
+{
+ if (m_source != RawEventData && m_source != NotationPrefix) {
+ m_sourceProperties[AbsoluteTimeValue] = m_source + "AbsoluteTimeSource";
+ m_sourceProperties[DurationValue] = m_source + "DurationSource";
+ }
+
+ if (m_target != RawEventData && m_target != NotationPrefix) {
+ m_targetProperties[AbsoluteTimeValue] = m_target + "AbsoluteTimeTarget";
+ m_targetProperties[DurationValue] = m_target + "DurationTarget";
+ }
+}
+
+void
+Quantizer::insertNewEvents(Segment *s) const
+{
+ unsigned int sz = m_toInsert.size();
+
+ timeT minTime = m_normalizeRegion.first,
+ maxTime = m_normalizeRegion.second;
+
+ for (unsigned int i = 0; i < sz; ++i) {
+
+ timeT myTime = m_toInsert[i]->getAbsoluteTime();
+ timeT myDur = m_toInsert[i]->getDuration();
+ if (i == 0 || myTime < minTime) minTime = myTime;
+ if (i == 0 || myTime + myDur > maxTime) maxTime = myTime + myDur;
+
+ s->insert(m_toInsert[i]);
+ }
+
+#ifdef DEBUG_NOTATION_QUANTIZER
+ cout << "Quantizer::insertNewEvents: sz is " << sz
+ << ", minTime " << minTime << ", maxTime " << maxTime
+ << endl;
+#endif
+
+ if (m_target == NotationPrefix || m_target == RawEventData) {
+
+ if (m_normalizeRegion.first == m_normalizeRegion.second) {
+ if (sz > 0) {
+ s->normalizeRests(minTime, maxTime);
+ }
+ } else {
+ s->normalizeRests(minTime, maxTime);
+ m_normalizeRegion = std::pair<timeT, timeT>(0, 0);
+ }
+ }
+
+#ifdef DEBUG_NOTATION_QUANTIZER
+ cout << "Quantizer: calling normalizeRests("
+ << minTime << ", " << maxTime << ")" << endl;
+#endif
+
+ m_toInsert.clear();
+}
+
+
+
+
+}
diff --git a/src/base/Quantizer.h b/src/base/Quantizer.h
new file mode 100644
index 0000000..407b651
--- /dev/null
+++ b/src/base/Quantizer.h
@@ -0,0 +1,249 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef QUANTIZER_H
+#define QUANTIZER_H
+
+#include "Segment.h"
+#include "Event.h"
+#include "NotationTypes.h"
+#include "FastVector.h"
+#include <string>
+
+namespace Rosegarden {
+
+class EventSelection;
+
+/**
+ The Quantizer class rounds the starting times and durations of note
+ and rest events according to one of a set of possible criteria.
+*/
+
+class Quantizer
+{
+ // define the Quantizer API
+
+public:
+ virtual ~Quantizer();
+
+ /**
+ * Quantize a Segment.
+ */
+ void quantize(Segment *) const;
+
+ /**
+ * Quantize a section of a Segment.
+ */
+ void quantize(Segment *,
+ Segment::iterator from,
+ Segment::iterator to) const;
+
+ /**
+ * Quantize an EventSelection.
+ */
+ void quantize(EventSelection *);
+
+ /**
+ * Quantize a section of a Segment, and force the quantized
+ * results into the formal absolute time and duration of
+ * the events. This is a destructive operation that should
+ * not be carried out except on a user's explicit request.
+ * (If target is RawEventData, this will do nothing besides
+ * quantize. In this case, but no other, unquantize will
+ * still work afterwards.)
+ */
+ void fixQuantizedValues(Segment *,
+ Segment::iterator from,
+ Segment::iterator to) const;
+
+ /**
+ * Return the quantized duration of the event if it has been
+ * quantized -- otherwise just return the unquantized duration.
+ * Do not modify the event.
+ */
+ virtual timeT getQuantizedDuration(const Event *e) const;
+
+ /**
+ * Return the quantized absolute time of the event if it has been
+ * quantized -- otherwise just return the unquantized time. Do
+ * not modify the event.
+ */
+ virtual timeT getQuantizedAbsoluteTime(const Event *e) const;
+
+ /**
+ * Return the unquantized absolute time of the event --
+ * the absolute time that would be restored by a call to
+ * unquantize.
+ */
+ virtual timeT getUnquantizedAbsoluteTime(Event *e) const;
+
+ /**
+ * Return the unquantized absolute time of the event --
+ * the absolute time that would be restored by a call to
+ * unquantize.
+ */
+ virtual timeT getUnquantizedDuration(Event *e) const;
+
+ /**
+ * Unquantize all events in the given range, for this
+ * quantizer. Properties set by other quantizers with
+ * different propertyNamePrefix values will remain.
+ */
+ void unquantize(Segment *,
+ Segment::iterator from, Segment::iterator to) const;
+
+ /**
+ * Unquantize a selection of Events
+ */
+ void unquantize(EventSelection *) const;
+
+ static const std::string RawEventData;
+ static const std::string DefaultTarget;
+ static const std::string GlobalSource;
+ static const std::string NotationPrefix;
+
+protected:
+ /**
+ * \arg source, target : Description of where to find the
+ * times to be quantized, and where to put the quantized results.
+ *
+ * These may be strings, specifying a prefix for the names
+ * of properties to contain the timings, or may be the special
+ * value RawEventData in which case the event's absolute time
+ * and duration will be used instead of properties.
+ *
+ * If source specifies a property prefix for properties that are
+ * found not to exist, they will be pre-filled from the original
+ * timings in the target values before being quantized and then
+ * set back into the target. (This permits a quantizer to write
+ * directly into the Event's absolute time and duration without
+ * losing the original values, because they are backed up
+ * automatically into the source properties.)
+ *
+ * Note that because it's impossible to modify the duration or
+ * absolute time of an event after construction, if target is
+ * RawEventData the quantizer must re-construct each event in
+ * order to adjust its timings. This operation (deliberately)
+ * loses any non-persistent properties in the events. This
+ * does not happen if target is a property prefix.
+ *
+ * Examples:
+ *
+ * -- if source == RawEventData and target == "MyPrefix",
+ * values will be read from the event's absolute time and
+ * duration, quantized, and written into MyPrefixAbsoluteTime
+ * and MyPrefixDuration properties on the event. A call to
+ * unquantize will simply delete these properties.
+ *
+ * -- if source == "MyPrefix" and target == RawEventData,
+ * the MyPrefixAbsoluteTime and MyPrefixDuration will be
+ * populated if necessary from the event's absolute time and
+ * duration, and then quantized and written back into the
+ * event's values. A call to unquantize will write the
+ * MyPrefix-property timings back into the event's values,
+ * and delete the MyPrefix properties.
+ *
+ * -- if source == "YourPrefix" and target == "MyPrefix",
+ * values will be read from YourPrefixAbsoluteTime and
+ * YourPrefixDuration, quantized, and written into the
+ * MyPrefix-properties. This may be useful for piggybacking
+ * onto another quantizer's output.
+ *
+ * -- if source == RawEventData and target == RawEventData,
+ * values will be read from the event's absolute time and
+ * duration, quantized, and written back to these values.
+ */
+ Quantizer(std::string source, std::string target);
+
+ /**
+ * If only target is supplied, source is deduced appropriately
+ * as GlobalSource if target == RawEventData and RawEventData
+ * otherwise.
+ */
+ Quantizer(std::string target);
+
+ /**
+ * To implement a subclass of Quantizer, you should
+ * override either quantizeSingle (if your quantizer is simple
+ * enough only to have to look at a single event at a time) or
+ * quantizeRange. The default implementation of quantizeRange
+ * simply calls quantizeSingle on each non-rest event in turn.
+ * The default implementation of quantizeSingle, as you see,
+ * does nothing.
+ *
+ * Note that implementations of these methods should call
+ * getFromSource and setToTarget to get and set the unquantized
+ * and quantized data; they should not query the event properties
+ * or timings directly.
+ *
+ * NOTE: It is vital that ordering is maintained after
+ * quantization. That is, an event whose absolute time quantizes
+ * to a time t must appear in the original segment before all
+ * events whose times quantize to greater than t. This means you
+ * must quantize the absolute times of non-note events as well as
+ * notes. You don't need to worry about quantizing rests,
+ * however; they're only used for notation and will be
+ * automatically recalculated if the notation quantization values
+ * are seen to change.
+ */
+ virtual void quantizeSingle(Segment *,
+ Segment::iterator) const { }
+
+ /**
+ * See note for quantizeSingle.
+ */
+ virtual void quantizeRange(Segment *,
+ Segment::iterator,
+ Segment::iterator) const;
+
+ std::string m_source;
+ std::string m_target;
+ mutable std::pair<timeT, timeT> m_normalizeRegion;
+
+ enum ValueType { AbsoluteTimeValue = 0, DurationValue = 1 };
+
+ PropertyName m_sourceProperties[2];
+ PropertyName m_targetProperties[2];
+
+public: // should be protected, but gcc-2.95 doesn't like allowing NotationQuantizer::m_impl to access them
+ timeT getFromSource(Event *, ValueType) const;
+ timeT getFromTarget(Event *, ValueType) const;
+ void setToTarget(Segment *, Segment::iterator, timeT t, timeT d) const;
+ mutable FastVector<Event *> m_toInsert;
+
+protected:
+ void removeProperties(Event *) const;
+ void removeTargetProperties(Event *) const;
+ void makePropertyNames();
+
+ void insertNewEvents(Segment *) const;
+
+private: // not provided
+ Quantizer(const Quantizer &);
+ Quantizer &operator=(const Quantizer &);
+ bool operator==(const Quantizer &) const;
+ bool operator!=(const Quantizer & c) const;
+};
+
+
+}
+
+#endif
diff --git a/src/base/RealTime.cpp b/src/base/RealTime.cpp
new file mode 100644
index 0000000..8f8125f
--- /dev/null
+++ b/src/base/RealTime.cpp
@@ -0,0 +1,236 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include <iostream>
+
+#if (__GNUC__ < 3)
+#include <strstream>
+#define stringstream strstream
+#else
+#include <sstream>
+#endif
+
+#include "RealTime.h"
+#include "sys/time.h"
+
+namespace Rosegarden {
+
+// A RealTime consists of two ints that must be at least 32 bits each.
+// A signed 32-bit int can store values exceeding +/- 2 billion. This
+// means we can safely use our lower int for nanoseconds, as there are
+// 1 billion nanoseconds in a second and we need to handle double that
+// because of the implementations of addition etc that we use.
+//
+// The maximum valid RealTime on a 32-bit system is somewhere around
+// 68 years: 999999999 nanoseconds longer than the classic Unix epoch.
+
+#define ONE_BILLION 1000000000
+
+RealTime::RealTime(int s, int n) :
+ sec(s), nsec(n)
+{
+ if (sec == 0) {
+ while (nsec <= -ONE_BILLION) { nsec += ONE_BILLION; --sec; }
+ while (nsec >= ONE_BILLION) { nsec -= ONE_BILLION; ++sec; }
+ } else if (sec < 0) {
+ while (nsec <= -ONE_BILLION) { nsec += ONE_BILLION; --sec; }
+ while (nsec > 0) { nsec -= ONE_BILLION; ++sec; }
+ } else {
+ while (nsec >= ONE_BILLION) { nsec -= ONE_BILLION; ++sec; }
+ while (nsec < 0) { nsec += ONE_BILLION; --sec; }
+ }
+}
+
+RealTime
+RealTime::fromSeconds(double sec)
+{
+ return RealTime(int(sec), int((sec - int(sec)) * ONE_BILLION + 0.5));
+}
+
+RealTime
+RealTime::fromMilliseconds(int msec)
+{
+ return RealTime(msec / 1000, (msec % 1000) * 1000000);
+}
+
+RealTime
+RealTime::fromTimeval(const struct timeval &tv)
+{
+ return RealTime(tv.tv_sec, tv.tv_usec * 1000);
+}
+
+std::ostream &operator<<(std::ostream &out, const RealTime &rt)
+{
+ if (rt < RealTime::zeroTime) {
+ out << "-";
+ } else {
+ out << " ";
+ }
+
+ int s = (rt.sec < 0 ? -rt.sec : rt.sec);
+ int n = (rt.nsec < 0 ? -rt.nsec : rt.nsec);
+
+ out << s << ".";
+
+ int nn(n);
+ if (nn == 0) out << "00000000";
+ else while (nn < (ONE_BILLION / 10)) {
+ out << "0";
+ nn *= 10;
+ }
+
+ out << n << "R";
+ return out;
+}
+
+std::string
+RealTime::toString(bool align) const
+{
+ std::stringstream out;
+ out << *this;
+
+#if (__GNUC__ < 3)
+ out << std::ends;
+#endif
+
+ std::string s = out.str();
+
+ if (!align && *this >= RealTime::zeroTime) {
+ // remove leading " "
+ s = s.substr(1, s.length() - 1);
+ }
+
+ // remove trailing R
+ return s.substr(0, s.length() - 1);
+}
+
+std::string
+RealTime::toText(bool fixedDp) const
+{
+ if (*this < RealTime::zeroTime) return "-" + (-*this).toText();
+
+ std::stringstream out;
+
+ if (sec >= 3600) {
+ out << (sec / 3600) << ":";
+ }
+
+ if (sec >= 60) {
+ out << (sec % 3600) / 60 << ":";
+ }
+
+ if (sec >= 10) {
+ out << ((sec % 60) / 10);
+ }
+
+ out << (sec % 10);
+
+ int ms = msec();
+
+ if (ms != 0) {
+ out << ".";
+ out << (ms / 100);
+ ms = ms % 100;
+ if (ms != 0) {
+ out << (ms / 10);
+ ms = ms % 10;
+ } else if (fixedDp) {
+ out << "0";
+ }
+ if (ms != 0) {
+ out << ms;
+ } else if (fixedDp) {
+ out << "0";
+ }
+ } else if (fixedDp) {
+ out << ".000";
+ }
+
+#if (__GNUC__ < 3)
+ out << std::ends;
+#endif
+
+ std::string s = out.str();
+
+ return s;
+}
+
+RealTime
+RealTime::operator*(double m) const
+{
+ double t = (double(nsec) / ONE_BILLION) * m;
+ t += sec * m;
+ return fromSeconds(t);
+}
+
+RealTime
+RealTime::operator/(int d) const
+{
+ int secdiv = sec / d;
+ int secrem = sec % d;
+
+ double nsecdiv = (double(nsec) + ONE_BILLION * double(secrem)) / d;
+
+ return RealTime(secdiv, int(nsecdiv + 0.5));
+}
+
+double
+RealTime::operator/(const RealTime &r) const
+{
+ double lTotal = double(sec) * ONE_BILLION + double(nsec);
+ double rTotal = double(r.sec) * ONE_BILLION + double(r.nsec);
+
+ if (rTotal == 0) return 0.0;
+ else return lTotal/rTotal;
+}
+
+long
+RealTime::realTime2Frame(const RealTime &time, unsigned int sampleRate)
+{
+ if (time < zeroTime) return -realTime2Frame(-time, sampleRate);
+
+ // We like integers. The last term is always zero unless the
+ // sample rate is greater than 1MHz, but hell, you never know...
+
+ long frame =
+ time.sec * sampleRate +
+ (time.msec() * sampleRate) / 1000 +
+ ((time.usec() - 1000 * time.msec()) * sampleRate) / 1000000 +
+ ((time.nsec - 1000 * time.usec()) * sampleRate) / 1000000000;
+
+ return frame;
+}
+
+RealTime
+RealTime::frame2RealTime(long frame, unsigned int sampleRate)
+{
+ if (frame < 0) return -frame2RealTime(-frame, sampleRate);
+
+ RealTime rt;
+ rt.sec = frame / sampleRate;
+ frame -= rt.sec * sampleRate;
+ rt.nsec = (int)(((float(frame) * 1000000) / sampleRate) * 1000);
+ return rt;
+}
+
+const RealTime RealTime::zeroTime(0,0);
+
+}
diff --git a/src/base/RealTime.h b/src/base/RealTime.h
new file mode 100644
index 0000000..3ebef26
--- /dev/null
+++ b/src/base/RealTime.h
@@ -0,0 +1,124 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _REAL_TIME_H_
+#define _REAL_TIME_H_
+
+#include <iostream>
+#include <string>
+
+struct timeval;
+
+namespace Rosegarden
+{
+
+struct RealTime
+{
+ int sec;
+ int nsec;
+
+ int usec() const { return nsec / 1000; }
+ int msec() const { return nsec / 1000000; }
+
+ RealTime(): sec(0), nsec(0) {}
+ RealTime(int s, int n);
+
+ RealTime(const RealTime &r) :
+ sec(r.sec), nsec(r.nsec) { }
+
+ static RealTime fromSeconds(double sec);
+ static RealTime fromMilliseconds(int msec);
+ static RealTime fromTimeval(const struct timeval &);
+
+ RealTime &operator=(const RealTime &r) {
+ sec = r.sec; nsec = r.nsec; return *this;
+ }
+
+ RealTime operator+(const RealTime &r) const {
+ return RealTime(sec + r.sec, nsec + r.nsec);
+ }
+ RealTime operator-(const RealTime &r) const {
+ return RealTime(sec - r.sec, nsec - r.nsec);
+ }
+ RealTime operator-() const {
+ return RealTime(-sec, -nsec);
+ }
+
+ bool operator <(const RealTime &r) const {
+ if (sec == r.sec) return nsec < r.nsec;
+ else return sec < r.sec;
+ }
+
+ bool operator >(const RealTime &r) const {
+ if (sec == r.sec) return nsec > r.nsec;
+ else return sec > r.sec;
+ }
+
+ bool operator==(const RealTime &r) const {
+ return (sec == r.sec && nsec == r.nsec);
+ }
+
+ bool operator!=(const RealTime &r) const {
+ return !(r == *this);
+ }
+
+ bool operator>=(const RealTime &r) const {
+ if (sec == r.sec) return nsec >= r.nsec;
+ else return sec >= r.sec;
+ }
+
+ bool operator<=(const RealTime &r) const {
+ if (sec == r.sec) return nsec <= r.nsec;
+ else return sec <= r.sec;
+ }
+
+ RealTime operator*(double m) const;
+ RealTime operator/(int d) const;
+
+ // Find the fractional difference between times
+ //
+ double operator/(const RealTime &r) const;
+
+ // Return a human-readable debug-type string to full precision
+ // (probably not a format to show to a user directly). If align
+ // is true, prepend " " to the start of positive values so that
+ // they line up with negative ones (which start with "-").
+ //
+ std::string toString(bool align = false) const;
+
+ // Return a user-readable string to the nearest millisecond
+ // in a form like HH:MM:SS.mmm
+ //
+ std::string toText(bool fixedDp = false) const;
+
+ // Convenience functions for handling sample frames
+ //
+ static long realTime2Frame(const RealTime &r, unsigned int sampleRate);
+ static RealTime frame2RealTime(long frame, unsigned int sampleRate);
+
+ static const RealTime zeroTime;
+};
+
+std::ostream &operator<<(std::ostream &out, const RealTime &rt);
+
+}
+
+#endif
diff --git a/src/base/RefreshStatus.h b/src/base/RefreshStatus.h
new file mode 100644
index 0000000..4c39a18
--- /dev/null
+++ b/src/base/RefreshStatus.h
@@ -0,0 +1,76 @@
+// -*- c-basic-offset: 4 -*-
+
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _REFRESH_STATUS_H_
+#define _REFRESH_STATUS_H_
+
+namespace Rosegarden
+{
+
+class RefreshStatus
+{
+public:
+ RefreshStatus() : m_needsRefresh(true) {}
+
+ bool needsRefresh() { return m_needsRefresh; }
+ void setNeedsRefresh(bool s) { m_needsRefresh = s; }
+
+protected:
+ bool m_needsRefresh;
+};
+
+template<class RS>
+class RefreshStatusArray
+{
+public:
+ unsigned int getNewRefreshStatusId();
+ size_t size() { return m_refreshStatuses.size(); }
+ RS& getRefreshStatus(unsigned int id) { return m_refreshStatuses[id]; }
+ void updateRefreshStatuses();
+
+protected:
+ std::vector<RS> m_refreshStatuses;
+};
+
+template<class RS>
+unsigned int RefreshStatusArray<RS>::getNewRefreshStatusId()
+{
+ m_refreshStatuses.push_back(RS());
+ unsigned int res = m_refreshStatuses.size() - 1;
+ return res;
+}
+
+void breakpoint();
+
+template<class RS>
+void RefreshStatusArray<RS>::updateRefreshStatuses()
+{
+ // breakpoint(); // for debug purposes, so one can set a breakpoint
+ // in this template code (set it in breakpoint() itself).
+ for(unsigned int i = 0; i < m_refreshStatuses.size(); ++i)
+ m_refreshStatuses[i].setNeedsRefresh(true);
+}
+
+
+}
+
+#endif
diff --git a/src/base/RulerScale.cpp b/src/base/RulerScale.cpp
new file mode 100644
index 0000000..510a0a5
--- /dev/null
+++ b/src/base/RulerScale.cpp
@@ -0,0 +1,243 @@
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include <cmath>
+#include "RulerScale.h"
+#include "Composition.h"
+
+namespace Rosegarden {
+
+
+//////////////////////////////////////////////////////////////////////
+// RulerScale
+//////////////////////////////////////////////////////////////////////
+
+RulerScale::RulerScale(Composition *c) :
+ m_composition(c)
+{
+ // nothing
+}
+
+RulerScale::~RulerScale()
+{
+ // nothing
+}
+
+int
+RulerScale::getFirstVisibleBar() const
+{
+ return m_composition->getBarNumber(m_composition->getStartMarker());
+}
+
+int
+RulerScale::getLastVisibleBar() const
+{
+ return m_composition->getBarNumber(m_composition->getEndMarker());
+}
+
+double
+RulerScale::getBarWidth(int n) const
+{
+ return getBarPosition(n + 1) - getBarPosition(n);
+}
+
+double
+RulerScale::getBeatWidth(int n) const
+{
+ std::pair<timeT, timeT> barRange = m_composition->getBarRange(n);
+ timeT barDuration = barRange.second - barRange.first;
+ if (barDuration == 0) return 0;
+
+ bool isNew;
+ TimeSignature timeSig = m_composition->getTimeSignatureInBar(n, isNew);
+
+ // cope with partial bars
+ double theoreticalWidth =
+ (getBarWidth(n) * timeSig.getBarDuration()) / barDuration;
+
+ return theoreticalWidth / timeSig.getBeatsPerBar();
+}
+
+int
+RulerScale::getBarForX(double x) const
+{
+ // binary search
+
+ int minBar = getFirstVisibleBar(),
+ maxBar = getLastVisibleBar();
+
+ while (maxBar > minBar) {
+ int middle = minBar + (maxBar - minBar) / 2;
+ if (x > getBarPosition(middle)) minBar = middle + 1;
+ else maxBar = middle;
+ }
+
+ // we've just done equivalent of lower_bound -- we're one bar too
+ // far into the list
+
+ if (minBar > getFirstVisibleBar()) return minBar - 1;
+ else return minBar;
+}
+
+timeT
+RulerScale::getTimeForX(double x) const
+{
+ int n = getBarForX(x);
+
+ double barWidth = getBarWidth(n);
+ std::pair<timeT, timeT> barRange = m_composition->getBarRange(n);
+
+ if (barWidth < 1.0) {
+
+ return barRange.first;
+
+ } else {
+
+ timeT barDuration = barRange.second - barRange.first;
+ x -= getBarPosition(n);
+
+ return barRange.first + (timeT)nearbyint(((double)(x * barDuration) / barWidth));
+ }
+}
+
+double
+RulerScale::getXForTime(timeT time) const
+{
+ int n = m_composition->getBarNumber(time);
+
+ double barWidth = getBarWidth(n);
+ std::pair<timeT, timeT> barRange = m_composition->getBarRange(n);
+ timeT barDuration = barRange.second - barRange.first;
+
+ if (barDuration == 0) {
+
+ return getBarPosition(n);
+
+ } else {
+
+ time -= barRange.first;
+ return getBarPosition(n) + (double)(time * barWidth) / barDuration;
+ }
+}
+
+timeT
+RulerScale::getDurationForWidth(double x, double width) const
+{
+ return getTimeForX(x + width) - getTimeForX(x);
+}
+
+double
+RulerScale::getWidthForDuration(timeT startTime, timeT duration) const
+{
+ return getXForTime(startTime + duration) - getXForTime(startTime);
+}
+
+double
+RulerScale::getTotalWidth() const
+{
+ int n = getLastVisibleBar();
+ return getBarPosition(n) + getBarWidth(n);
+}
+
+
+
+
+//////////////////////////////////////////////////////////////////////
+// SimpleRulerScale
+//////////////////////////////////////////////////////////////////////
+
+
+SimpleRulerScale::SimpleRulerScale(Composition *composition,
+ double origin, double ratio) :
+ RulerScale(composition),
+ m_origin(origin),
+ m_ratio(ratio)
+{
+ // nothing
+}
+
+SimpleRulerScale::SimpleRulerScale(const SimpleRulerScale &ruler):
+ RulerScale(ruler.getComposition()),
+ m_origin(ruler.getOrigin()),
+ m_ratio(ruler.getUnitsPerPixel())
+{
+ // nothing
+}
+
+
+SimpleRulerScale::~SimpleRulerScale()
+{
+ // nothing
+}
+
+double
+SimpleRulerScale::getBarPosition(int n) const
+{
+ timeT barStart = m_composition->getBarRange(n).first;
+ return getXForTime(barStart);
+}
+
+double
+SimpleRulerScale::getBarWidth(int n) const
+{
+ std::pair<timeT, timeT> range = m_composition->getBarRange(n);
+ return (double)(range.second - range.first) / m_ratio;
+}
+
+double
+SimpleRulerScale::getBeatWidth(int n) const
+{
+ bool isNew;
+ TimeSignature timeSig(m_composition->getTimeSignatureInBar(n, isNew));
+ return (double)(timeSig.getBeatDuration()) / m_ratio;
+}
+
+int
+SimpleRulerScale::getBarForX(double x) const
+{
+ return m_composition->getBarNumber(getTimeForX(x));
+}
+
+timeT
+SimpleRulerScale::getTimeForX(double x) const
+{
+ timeT t = (timeT)(nearbyint((double)(x - m_origin) * m_ratio));
+
+ int firstBar = getFirstVisibleBar();
+ if (firstBar != 0) {
+ t += m_composition->getBarRange(firstBar).first;
+ }
+
+ return t;
+}
+
+double
+SimpleRulerScale::getXForTime(timeT time) const
+{
+ int firstBar = getFirstVisibleBar();
+ if (firstBar != 0) {
+ time -= m_composition->getBarRange(firstBar).first;
+ }
+
+ return m_origin + (double)time / m_ratio;
+}
+
+
+}
diff --git a/src/base/RulerScale.h b/src/base/RulerScale.h
new file mode 100644
index 0000000..763ca13
--- /dev/null
+++ b/src/base/RulerScale.h
@@ -0,0 +1,166 @@
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RULER_SCALE_H_
+#define _RULER_SCALE_H_
+
+#include "Event.h"
+
+namespace Rosegarden {
+
+class Composition;
+
+/**
+ * RulerScale is a base for classes that may be queried in order to
+ * discover the correct x-coordinates for bar lines and bar
+ * subdivisions.
+ *
+ * RulerScale does not contain any methods that relate bar numbers
+ * to times, time signature or duration -- those are in Composition.
+ *
+ * The methods in RulerScale should return extrapolated (but valid)
+ * results even when passed a bar number outside the theoretically
+ * visible or existant bar range.
+ *
+ * Apart from getBarPosition, every method in this class has a
+ * default implementation, which should work correctly provided
+ * the subclass maintains spacing proportional to time within a
+ * bar, but which may not be an efficient implementation for any
+ * given subclass.
+ *
+ * (Potential to-do: At the moment all our RulerScales are used in
+ * contexts where spacing proportional to time within a bar is the
+ * only interpretation that makes sense, so this is okay. In
+ * theory though we should probably subclass out these "default"
+ * implementations into an intermediate abstract class.)
+ */
+
+class RulerScale
+{
+public:
+ virtual ~RulerScale();
+ Composition *getComposition() const { return m_composition; }
+
+ /**
+ * Return the number of the first visible bar.
+ */
+ virtual int getFirstVisibleBar() const;
+
+ /**
+ * Return the number of the last visible bar. (The last
+ * visible bar_line_ will be at the end of this bar.)
+ */
+ virtual int getLastVisibleBar() const;
+
+ /**
+ * Return the x-coordinate at which bar number n starts.
+ */
+ virtual double getBarPosition(int n) const = 0;
+
+ /**
+ * Return the width of bar number n.
+ */
+ virtual double getBarWidth(int n) const;
+
+ /**
+ * Return the width of each beat subdivision in bar n.
+ */
+ virtual double getBeatWidth(int n) const;
+
+ /**
+ * Return the number of the bar containing the given x-coord.
+ */
+ virtual int getBarForX(double x) const;
+
+ /**
+ * Return the nearest time value to the given x-coord.
+ */
+ virtual timeT getTimeForX(double x) const;
+
+ /**
+ * Return the x-coord corresponding to the given time value.
+ */
+ virtual double getXForTime(timeT time) const;
+
+ /**
+ * Return the duration corresponding to the given delta-x
+ * starting at the given x-coord.
+ */
+ virtual timeT getDurationForWidth(double x, double width) const;
+
+ /**
+ * Return the width corresponding to the given duration
+ * starting at the given time.
+ */
+ virtual double getWidthForDuration(timeT startTime, timeT duration) const;
+
+ /**
+ * Return the width of the entire scale.
+ */
+ virtual double getTotalWidth() const;
+
+protected:
+ RulerScale(Composition *c);
+ Composition *m_composition;
+};
+
+
+/**
+ * SimpleRulerScale is an implementation of RulerScale that maintains
+ * a strict proportional correspondence between x-coordinate and time.
+ */
+
+class SimpleRulerScale : public RulerScale
+{
+public:
+ /**
+ * Construct a SimpleRulerScale for the given Composition, with a
+ * given origin and x-coord/time ratio. (For example, a ratio of
+ * 10 means that one pixel equals 10 time units.)
+ */
+ SimpleRulerScale(Composition *composition,
+ double origin, double unitsPerPixel);
+ virtual ~SimpleRulerScale();
+
+ double getOrigin() const { return m_origin; }
+ void setOrigin(double origin) { m_origin = origin; }
+
+ double getUnitsPerPixel() const { return m_ratio; }
+ void setUnitsPerPixel(double ratio) { m_ratio = ratio; }
+
+ virtual double getBarPosition(int n) const;
+ virtual double getBarWidth(int n) const;
+ virtual double getBeatWidth(int n) const;
+ virtual int getBarForX(double x) const;
+ virtual timeT getTimeForX(double x) const;
+ virtual double getXForTime(timeT time) const;
+
+protected:
+ double m_origin;
+ double m_ratio;
+
+private:
+ SimpleRulerScale(const SimpleRulerScale &ruler);
+ SimpleRulerScale &operator=(const SimpleRulerScale &ruler);
+};
+
+}
+
+#endif
diff --git a/src/base/ScriptAPI.cpp b/src/base/ScriptAPI.cpp
new file mode 100644
index 0000000..be01550
--- /dev/null
+++ b/src/base/ScriptAPI.cpp
@@ -0,0 +1,85 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2004
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include "ScriptAPI.h"
+
+#include "Composition.h"
+#include "Segment.h"
+#include "Event.h"
+#include "Sets.h"
+
+#include <map>
+
+namespace Rosegarden
+{
+
+class ScriptRep
+{
+public:
+
+ //!!! Needs to be a SegmentObserver _and_ CompositionObserver.
+ // If an event is removed from a segment, we have to drop it too.
+ // If a segment is removed from a composition likewise
+
+ Event *getEvent(ScriptInterface::EventId id);
+
+
+protected:
+ Composition *m_composition;
+ CompositionTimeSliceAdapter *m_adapter;
+ GlobalChord *m_chord;
+ std::map<ScriptInterface::EventId, Event *> m_events;
+};
+
+Event *
+ScriptRep::getEvent(ScriptInterface::EventId id)
+{
+ return m_events[id];
+}
+
+class ScriptInterface::ScriptContainer :
+ public std::map<ScriptId, ScriptRep *> { };
+
+ScriptInterface::ScriptInterface(Rosegarden::Composition *composition) :
+ m_composition(composition),
+ m_scripts(new ScriptContainer())
+{
+}
+
+ScriptInterface::~ScriptInterface()
+{
+}
+
+std::string
+ScriptInterface::getEventType(ScriptId id, EventId eventId)
+{
+ ScriptRep *rep = (*m_scripts)[id];
+ if (!rep) return "";
+
+ Event *event = rep->getEvent(eventId);
+ if (!event) return "";
+
+ return event->getType();
+}
+
+
+}
+
diff --git a/src/base/ScriptAPI.h b/src/base/ScriptAPI.h
new file mode 100644
index 0000000..8d721a4
--- /dev/null
+++ b/src/base/ScriptAPI.h
@@ -0,0 +1,128 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2004
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _SCRIPT_API_H_
+#define _SCRIPT_API_H_
+
+#include "Segment.h"
+
+namespace Rosegarden
+{
+
+class Composition;
+
+class ScriptInterface
+{
+public:
+ typedef int ScriptId;
+ typedef int SegmentId;
+ typedef int EventId;
+ typedef int ScriptTime;
+
+ // Resolution defines the meaning of ScriptTime units. If set to
+ // the QuantizedNN values, each ScriptTime unit will correspond to
+ // the duration of an NN-th note. If Unquantized, ScriptTime will
+ // correspond to timeT, i.e. 960 to a quarter note.
+ // And Notation is like Quantized64 except that the times are
+ // obtained from the notation time and duration properties of each
+ // event instead of the raw ones.
+
+ enum Resolution {
+ Unquantized,
+ Notation,
+ Quantized64,
+ Quantized32,
+ Quantized16
+ };
+
+ enum Scope {
+ Global,
+ Segment
+ };
+
+ class ScriptEvent {
+ EventId id;
+ int bar; // number, 1-based
+ ScriptTime time; // within bar
+ ScriptTime duration;
+ int pitch; // 0-127 if note, -1 otherwise
+ };
+
+ class ScriptTimeSignature {
+ int numerator;
+ int denominator;
+ ScriptTime duration;
+ };
+
+ class ScriptKeySignature {
+ int accidentals;
+ bool sharps;
+ bool minor;
+ };
+
+ ScriptInterface(Composition *composition);
+ virtual ~ScriptInterface();
+
+ ScriptId createScript(SegmentId target, Resolution resolution, Scope scope);
+ void destroyScript(ScriptId id);
+
+ // A script can only proceed forwards. The getEvent and getNote
+ // methods get the next event (including notes) or note within the
+ // current chord or timeslice; the advance method moves forwards
+ // to the next chord or other event. So to process through all
+ // events, call advance() followed by a loop of getEvent() calls
+ // before the next advance(), and so on. An event with id -1
+ // marks the end of a slice. ( -1 is an out-of-range value for
+ // all types of id.)
+
+ ScriptEvent getEvent(ScriptId id);
+ ScriptEvent getNote(ScriptId id);
+
+ bool advance(ScriptId id);
+
+ ScriptTimeSignature getTimeSignature(ScriptId id);
+ ScriptKeySignature getKeySignature(ScriptId id);
+
+ EventId addNote(ScriptId id,
+ int bar, ScriptTime time, ScriptTime duration, int pitch);
+
+ EventId addEvent(ScriptId id,
+ std::string type, int bar, ScriptTime time, ScriptTime duration);
+
+ void deleteEvent(ScriptId id, EventId event);
+
+ std::string getEventType(ScriptId id, EventId event);
+ std::string getProperty(ScriptId id, EventId event, std::string property);
+ void setProperty(ScriptId id, EventId event, std::string property, std::string value);
+
+protected:
+ Composition *m_composition;
+
+ class ScriptContainer;
+ ScriptContainer *m_scripts;
+};
+
+}
+
+
+#endif
+
+
diff --git a/src/base/Segment.cpp b/src/base/Segment.cpp
new file mode 100644
index 0000000..2f65acd
--- /dev/null
+++ b/src/base/Segment.cpp
@@ -0,0 +1,1294 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include "Segment.h"
+#include "NotationTypes.h"
+#include "BaseProperties.h"
+#include "Composition.h"
+#include "BasicQuantizer.h"
+#include "Profiler.h"
+
+#include <iostream>
+#include <algorithm>
+#include <iterator>
+#include <cstdio>
+#include <typeinfo>
+
+namespace Rosegarden
+{
+using std::cerr;
+using std::endl;
+using std::string;
+
+//#define DEBUG_NORMALIZE_RESTS 1
+
+static int _runtimeSegmentId = 0;
+
+Segment::Segment(SegmentType segmentType, timeT startTime) :
+ std::multiset<Event*, Event::EventCmp>(),
+ m_composition(0),
+ m_startTime(startTime),
+ m_endMarkerTime(0),
+ m_endTime(startTime),
+ m_track(0),
+ m_type(segmentType),
+ m_colourIndex(0),
+ m_id(0),
+ m_audioFileId(0),
+ m_unstretchedFileId(0),
+ m_stretchRatio(1.0),
+ m_audioStartTime(0, 0),
+ m_audioEndTime(0, 0),
+ m_repeating(false),
+ m_quantizer(new BasicQuantizer()),
+ m_quantize(false),
+ m_transpose(0),
+ m_delay(0),
+ m_realTimeDelay(0, 0),
+ m_clefKeyList(0),
+ m_runtimeSegmentId(_runtimeSegmentId++),
+ m_snapGridSize(-1),
+ m_viewFeatures(0),
+ m_autoFade(false),
+ m_fadeInTime(Rosegarden::RealTime::zeroTime),
+ m_fadeOutTime(Rosegarden::RealTime::zeroTime),
+ m_highestPlayable(127),
+ m_lowestPlayable(0)
+{
+}
+
+Segment::Segment(const Segment &segment):
+ std::multiset<Event*, Event::EventCmp>(),
+ m_composition(0), // Composition should decide what's in it and what's not
+ m_startTime(segment.getStartTime()),
+ m_endMarkerTime(segment.m_endMarkerTime ?
+ new timeT(*segment.m_endMarkerTime) : 0),
+ m_endTime(segment.getEndTime()),
+ m_track(segment.getTrack()),
+ m_type(segment.getType()),
+ m_label(segment.getLabel()),
+ m_colourIndex(segment.getColourIndex()),
+ m_id(0),
+ m_audioFileId(segment.getAudioFileId()),
+ m_unstretchedFileId(segment.getUnstretchedFileId()),
+ m_stretchRatio(segment.getStretchRatio()),
+ m_audioStartTime(segment.getAudioStartTime()),
+ m_audioEndTime(segment.getAudioEndTime()),
+ m_repeating(segment.isRepeating()),
+ m_quantizer(new BasicQuantizer(segment.m_quantizer->getUnit(),
+ segment.m_quantizer->getDoDurations())),
+ m_quantize(segment.hasQuantization()),
+ m_transpose(segment.getTranspose()),
+ m_delay(segment.getDelay()),
+ m_realTimeDelay(segment.getRealTimeDelay()),
+ m_clefKeyList(0),
+ m_runtimeSegmentId(_runtimeSegmentId++),
+ m_snapGridSize(-1),
+ m_viewFeatures(0),
+ m_autoFade(segment.isAutoFading()),
+ m_fadeInTime(segment.getFadeInTime()),
+ m_fadeOutTime(segment.getFadeOutTime()),
+ m_highestPlayable(127),
+ m_lowestPlayable(0)
+{
+ for (const_iterator it = segment.begin();
+ segment.isBeforeEndMarker(it); ++it) {
+ insert(new Event(**it));
+ }
+}
+
+Segment::~Segment()
+{
+ if (!m_observers.empty()) {
+ cerr << "Warning: Segment::~Segment() with " << m_observers.size()
+ << " observers still extant" << endl;
+ cerr << "Observers are:";
+ for (ObserverSet::const_iterator i = m_observers.begin();
+ i != m_observers.end(); ++i) {
+ cerr << " " << (void *)(*i);
+ cerr << " [" << typeid(**i).name() << "]";
+ }
+ cerr << endl;
+ }
+
+ notifySourceDeletion();
+
+ if (m_composition) m_composition->detachSegment(this);
+
+ if (m_clefKeyList) {
+ // don't delete contents of m_clefKeyList: the pointers
+ // are just aliases for events in the main segment
+ delete m_clefKeyList;
+ }
+
+ // Clear EventRulers
+ //
+ EventRulerListIterator it;
+ for (it = m_eventRulerList.begin(); it != m_eventRulerList.end(); ++it) delete *it;
+ m_eventRulerList.clear();
+
+ // delete content
+ for (iterator it = begin(); it != end(); ++it) delete (*it);
+
+ delete m_endMarkerTime;
+}
+
+
+void
+Segment::setTrack(TrackId id)
+{
+ Composition *c = m_composition;
+ if (c) c->weakDetachSegment(this); // sets m_composition to 0
+ TrackId oldTrack = m_track;
+ m_track = id;
+ if (c) {
+ c->weakAddSegment(this);
+ c->updateRefreshStatuses();
+ c->notifySegmentTrackChanged(this, oldTrack, id);
+ }
+}
+
+timeT
+Segment::getStartTime() const
+{
+ return m_startTime;
+}
+
+timeT
+Segment::getEndMarkerTime() const
+{
+ timeT endTime;
+
+ if (m_type == Audio && m_composition) {
+
+ RealTime startRT = m_composition->getElapsedRealTime(m_startTime);
+ RealTime endRT = startRT - m_audioStartTime + m_audioEndTime;
+ endTime = m_composition->getElapsedTimeForRealTime(endRT);
+
+ } else {
+
+ if (m_endMarkerTime) {
+ endTime = *m_endMarkerTime;
+ } else {
+ endTime = getEndTime();
+ }
+
+ if (m_composition) {
+ endTime = std::min(endTime, m_composition->getEndMarker());
+ }
+ }
+
+ return endTime;
+}
+
+timeT
+Segment::getEndTime() const
+{
+ if (m_type == Audio && m_composition) {
+ RealTime startRT = m_composition->getElapsedRealTime(m_startTime);
+ RealTime endRT = startRT - m_audioStartTime + m_audioEndTime;
+ return m_composition->getElapsedTimeForRealTime(endRT);
+ } else {
+ return m_endTime;
+ }
+}
+
+void
+Segment::setStartTime(timeT t)
+{
+ int dt = t - m_startTime;
+ if (dt == 0) return;
+
+ // reset the time of all events. can't just setAbsoluteTime on these,
+ // partly 'cos we're not allowed, partly 'cos it might screw up the
+ // quantizer (which is why we're not allowed)
+
+ // still, this is rather unsatisfactory
+
+ FastVector<Event *> events;
+
+ for (iterator i = begin(); i != end(); ++i) {
+ events.push_back((*i)->copyMoving(dt));
+ }
+
+ timeT previousEndTime = m_endTime;
+
+ erase(begin(), end());
+
+ m_endTime = previousEndTime + dt;
+ if (m_endMarkerTime) *m_endMarkerTime += dt;
+
+ if (m_composition) m_composition->setSegmentStartTime(this, t);
+ else m_startTime = t;
+
+ for (int i = 0; i < events.size(); ++i) {
+ insert(events[i]);
+ }
+
+ notifyStartChanged(m_startTime);
+ updateRefreshStatuses(m_startTime, m_endTime);
+}
+
+void
+Segment::setEndMarkerTime(timeT t)
+{
+ if (t < m_startTime) t = m_startTime;
+
+ if (m_type == Audio) {
+ if (m_endMarkerTime) *m_endMarkerTime = t;
+ else m_endMarkerTime = new timeT(t);
+ RealTime oldAudioEndTime = m_audioEndTime;
+ if (m_composition) {
+ m_audioEndTime = m_audioStartTime +
+ m_composition->getRealTimeDifference(m_startTime, t);
+ if (oldAudioEndTime != m_audioEndTime) {
+ notifyEndMarkerChange(m_audioEndTime < oldAudioEndTime);
+ }
+ }
+ } else {
+
+ timeT endTime = getEndTime();
+ timeT oldEndMarker = getEndMarkerTime();
+ bool shorten = (t < oldEndMarker);
+
+ if (t > endTime) {
+ fillWithRests(endTime, t);
+ if (oldEndMarker < endTime) {
+ updateRefreshStatuses(oldEndMarker, t);
+ }
+ } else {
+ // only need to do this if we aren't inserting or
+ // deleting any actual events
+ if (oldEndMarker < t) {
+ updateRefreshStatuses(oldEndMarker, t);
+ }
+ updateRefreshStatuses(t, endTime);
+ }
+
+ if (m_endMarkerTime) *m_endMarkerTime = t;
+ else m_endMarkerTime = new timeT(t);
+ notifyEndMarkerChange(shorten);
+ }
+}
+
+void
+Segment::setEndTime(timeT t)
+{
+ timeT endTime = getEndTime();
+ if (t < m_startTime) t = m_startTime;
+
+ if (m_type == Audio) {
+ setEndMarkerTime(t);
+ } else {
+ if (t < endTime) {
+ erase(findTime(t), end());
+ endTime = getEndTime();
+ if (m_endMarkerTime && endTime < *m_endMarkerTime) {
+ *m_endMarkerTime = endTime;
+ notifyEndMarkerChange(true);
+ }
+ } else if (t > endTime) {
+ fillWithRests(endTime, t);
+ }
+ }
+}
+
+Segment::iterator
+Segment::getEndMarker()
+{
+ if (m_endMarkerTime) {
+ return findTime(*m_endMarkerTime);
+ } else {
+ return end();
+ }
+}
+
+bool
+Segment::isBeforeEndMarker(const_iterator i) const
+{
+ if (i == end()) return false;
+
+ timeT absTime = (*i)->getAbsoluteTime();
+ timeT endTime = getEndMarkerTime();
+
+ return ((absTime < endTime) ||
+ (absTime == endTime && (*i)->getDuration() == 0));
+}
+
+void
+Segment::clearEndMarker()
+{
+ delete m_endMarkerTime;
+ m_endMarkerTime = 0;
+ notifyEndMarkerChange(false);
+}
+
+const timeT *
+Segment::getRawEndMarkerTime() const
+{
+ return m_endMarkerTime;
+}
+
+
+void
+Segment::updateRefreshStatuses(timeT startTime, timeT endTime)
+{
+ for(unsigned int i = 0; i < m_refreshStatusArray.size(); ++i)
+ m_refreshStatusArray.getRefreshStatus(i).push(startTime, endTime);
+}
+
+
+Segment::iterator
+Segment::insert(Event *e)
+{
+ assert(e);
+
+ timeT t0 = e->getAbsoluteTime();
+ timeT t1 = t0 + e->getDuration();
+
+ if (t0 < m_startTime ||
+ (begin() == end() && t0 > m_startTime)) {
+
+ if (m_composition) m_composition->setSegmentStartTime(this, t0);
+ else m_startTime = t0;
+ notifyStartChanged(m_startTime);
+ }
+
+ if (t1 > m_endTime ||
+ begin() == end()) {
+ timeT oldTime = m_endTime;
+ m_endTime = t1;
+ notifyEndMarkerChange(m_endTime < oldTime);
+ }
+
+ iterator i = std::multiset<Event*, Event::EventCmp>::insert(e);
+ notifyAdd(e);
+ updateRefreshStatuses(e->getAbsoluteTime(),
+ e->getAbsoluteTime() + e->getDuration());
+ return i;
+}
+
+
+void
+Segment::updateEndTime()
+{
+ m_endTime = m_startTime;
+ for (iterator i = begin(); i != end(); ++i) {
+ timeT t = (*i)->getAbsoluteTime() + (*i)->getDuration();
+ if (t > m_endTime) m_endTime = t;
+ }
+}
+
+
+void
+Segment::erase(iterator pos)
+{
+ Event *e = *pos;
+
+ assert(e);
+
+ timeT t0 = e->getAbsoluteTime();
+ timeT t1 = t0 + e->getDuration();
+
+ std::multiset<Event*, Event::EventCmp>::erase(pos);
+ notifyRemove(e);
+ delete e;
+ updateRefreshStatuses(t0, t1);
+
+ if (t0 == m_startTime && begin() != end()) {
+ timeT startTime = (*begin())->getAbsoluteTime();
+ if (m_composition) m_composition->setSegmentStartTime(this, startTime);
+ else m_startTime = startTime;
+ notifyStartChanged(m_startTime);
+ }
+ if (t1 == m_endTime) {
+ updateEndTime();
+ }
+}
+
+
+void
+Segment::erase(iterator from, iterator to)
+{
+ timeT startTime = 0, endTime = m_endTime;
+ if (from != end()) startTime = (*from)->getAbsoluteTime();
+ if (to != end()) endTime = (*to)->getAbsoluteTime() + (*to)->getDuration();
+
+ // Not very efficient, but without an observer event for
+ // multiple erase we can't do any better.
+
+ for (Segment::iterator i = from; i != to; ) {
+
+ Segment::iterator j(i);
+ ++j;
+
+ Event *e = *i;
+ assert(e);
+
+ std::multiset<Event*, Event::EventCmp>::erase(i);
+ notifyRemove(e);
+ delete e;
+
+ i = j;
+ }
+
+ if (startTime == m_startTime && begin() != end()) {
+ timeT startTime = (*begin())->getAbsoluteTime();
+ if (m_composition) m_composition->setSegmentStartTime(this, startTime);
+ else m_startTime = startTime;
+ notifyStartChanged(m_startTime);
+ }
+
+ if (endTime == m_endTime) {
+ updateEndTime();
+ }
+
+ updateRefreshStatuses(startTime, endTime);
+}
+
+
+bool
+Segment::eraseSingle(Event* e)
+{
+ iterator elPos = findSingle(e);
+
+ if (elPos != end()) {
+
+ erase(elPos);
+ return true;
+
+ } else return false;
+
+}
+
+
+Segment::iterator
+Segment::findSingle(Event* e)
+{
+ iterator res = end();
+
+ std::pair<iterator, iterator> interval = equal_range(e);
+
+ for (iterator i = interval.first; i != interval.second; ++i) {
+ if (*i == e) {
+ res = i;
+ break;
+ }
+ }
+ return res;
+}
+
+
+Segment::iterator
+Segment::findTime(timeT t)
+{
+ Event dummy("dummy", t, 0, MIN_SUBORDERING);
+ return lower_bound(&dummy);
+}
+
+
+Segment::iterator
+Segment::findNearestTime(timeT t)
+{
+ iterator i = findTime(t);
+ if (i == end() || (*i)->getAbsoluteTime() > t) {
+ if (i == begin()) return end();
+ else --i;
+ }
+ return i;
+}
+
+
+timeT
+Segment::getBarStartForTime(timeT t) const
+{
+ if (t < getStartTime()) t = getStartTime();
+ return getComposition()->getBarStartForTime(t);
+}
+
+
+timeT
+Segment::getBarEndForTime(timeT t) const
+{
+ if (t > getEndMarkerTime()) t = getEndMarkerTime();
+ return getComposition()->getBarEndForTime(t);
+}
+
+
+int Segment::getNextId() const
+{
+ return m_id++;
+}
+
+
+void
+Segment::fillWithRests(timeT endTime)
+{
+ fillWithRests(getEndTime(), endTime);
+}
+
+void
+Segment::fillWithRests(timeT startTime, timeT endTime)
+{
+ if (startTime < m_startTime) {
+ if (m_composition) m_composition->setSegmentStartTime(this, startTime);
+ else m_startTime = startTime;
+ notifyStartChanged(m_startTime);
+ }
+
+ TimeSignature ts;
+ timeT sigTime = 0;
+
+ if (getComposition()) {
+ sigTime = getComposition()->getTimeSignatureAt(startTime, ts);
+ }
+
+ timeT restDuration = endTime - startTime;
+ if (restDuration <= 0) return;
+
+#ifdef DEBUG_NORMALIZE_RESTS
+ cerr << "fillWithRests (" << startTime << "->" << endTime << "), composition "
+ << (getComposition() ? "exists" : "does not exist") << ", sigTime "
+ << sigTime << ", timeSig duration " << ts.getBarDuration() << ", restDuration " << restDuration << endl;
+#endif
+
+ DurationList dl;
+ ts.getDurationListForInterval(dl, restDuration, startTime - sigTime);
+
+ timeT acc = startTime;
+
+ for (DurationList::iterator i = dl.begin(); i != dl.end(); ++i) {
+ Event *e = new Event(Note::EventRestType, acc, *i,
+ Note::EventRestSubOrdering);
+ insert(e);
+ acc += *i;
+ }
+}
+
+void
+Segment::normalizeRests(timeT startTime, timeT endTime)
+{
+ Profiler profiler("Segment::normalizeRests");
+
+#ifdef DEBUG_NORMALIZE_RESTS
+ cerr << "normalizeRests (" << startTime << "->" << endTime << "), segment starts at " << m_startTime << endl;
+#endif
+
+ if (startTime < m_startTime) {
+#ifdef DEBUG_NORMALIZE_RESTS
+ cerr << "normalizeRests: pulling start time back from "
+ << m_startTime << " to " << startTime << endl;
+#endif
+ if (m_composition) m_composition->setSegmentStartTime(this, startTime);
+ else m_startTime = startTime;
+ notifyStartChanged(m_startTime);
+ }
+
+ //!!! Need to remove the rests then relocate the start time
+ // and get the notation end time for the nearest note before that
+ // (?)
+
+ //!!! We need to insert rests at fictitious unquantized times that
+ //are broadly correct, so as to maintain ordering of notes and
+ //rests in the unquantized segment. The quantized times should go
+ //in notation-prefix properties.
+
+ // Preliminary: If there are any time signature changes between
+ // the start and end times, consider separately each of the sections
+ // they divide the range up into.
+
+ Composition *composition = getComposition();
+ if (composition) {
+ int timeSigNo = composition->getTimeSignatureNumberAt(startTime);
+ if (timeSigNo < composition->getTimeSignatureCount() - 1) {
+ timeT nextSigTime =
+ composition->getTimeSignatureChange(timeSigNo + 1).first;
+ if (nextSigTime < endTime) {
+#ifdef DEBUG_NORMALIZE_RESTS
+ cerr << "normalizeRests: divide-and-conquer on timesig at " << nextSigTime << endl;
+#endif
+ normalizeRests(startTime, nextSigTime);
+ normalizeRests(nextSigTime, endTime);
+ return;
+ }
+ }
+ }
+
+ // First stage: erase all existing non-tupleted rests in this range.
+
+ timeT segmentEndTime = m_endTime;
+
+ iterator ia = findNearestTime(startTime);
+ if (ia == end()) ia = begin();
+ if (ia == end()) { // the segment is empty
+#ifdef DEBUG_NORMALIZE_RESTS
+ cerr << "normalizeRests: empty segment" << endl;
+#endif
+ fillWithRests(startTime, endTime);
+ return;
+ } else {
+ if (startTime > (*ia)->getNotationAbsoluteTime()) {
+ startTime = (*ia)->getNotationAbsoluteTime();
+ }
+ }
+
+ iterator ib = findTime(endTime);
+ if (ib == end()) {
+ if (ib != begin()) {
+ --ib;
+ // if we're pointing at the real-end-time of the last event,
+ // use its notation-end-time instead
+ if (endTime == (*ib)->getAbsoluteTime() + (*ib)->getDuration()) {
+ endTime =
+ (*ib)->getNotationAbsoluteTime() +
+ (*ib)->getNotationDuration();
+ }
+ ++ib;
+ }
+ } else {
+ endTime = (*ib)->getNotationAbsoluteTime();
+ }
+
+ // If there's a rest preceding the start time, with no notes
+ // between us and it, and if it doesn't have precisely the
+ // right duration, then we need to normalize it too
+
+ //!!! needs modification for new scheme
+
+ iterator scooter = ia;
+ while (scooter-- != begin()) {
+// if ((*scooter)->isa(Note::EventRestType)) { //!!! experimental
+ if ((*scooter)->getDuration() > 0) {
+ if ((*scooter)->getNotationAbsoluteTime() +
+ (*scooter)->getNotationDuration() !=
+ startTime) {
+ startTime = (*scooter)->getNotationAbsoluteTime();
+#ifdef DEBUG_NORMALIZE_RESTS
+ cerr << "normalizeRests: scooting back to " << startTime << endl;
+#endif
+ ia = scooter;
+ }
+ break;
+/*!!!
+ } else if ((*scooter)->getDuration() > 0) {
+ break;
+*/
+ }
+ }
+
+ for (iterator i = ia, j = i; i != ib && i != end(); i = j) {
+ ++j;
+ if ((*i)->isa(Note::EventRestType) &&
+ !(*i)->has(BaseProperties::BEAMED_GROUP_TUPLET_BASE)) {
+#ifdef DEBUG_NORMALIZE_RESTS
+ cerr << "normalizeRests: erasing rest at " << (*i)->getAbsoluteTime() << endl;
+#endif
+ erase(i);
+ }
+ }
+
+ // It's possible we've just removed all the events between here
+ // and the end of the segment, if they were all rests. Check.
+
+ if (endTime < segmentEndTime && m_endTime < segmentEndTime) {
+ endTime = segmentEndTime;
+ }
+
+ // Second stage: find the gaps that need to be filled with
+ // rests. We don't mind about the case where two simultaneous
+ // notes end at different times -- we're only interested in
+ // the one ending sooner. Each time an event ends, we start
+ // a candidate gap.
+
+ std::vector<std::pair<timeT, timeT> > gaps;
+
+ timeT lastNoteStarts = startTime;
+ timeT lastNoteEnds = startTime;
+
+ // Re-find this, as it might have been erased
+ ia = findNearestTime(startTime);
+
+ if (ia == end()) {
+ // already have good lastNoteStarts, lastNoteEnds
+ ia = begin();
+ } else {
+ lastNoteStarts = (*ia)->getNotationAbsoluteTime();
+ lastNoteEnds = lastNoteStarts;
+ }
+
+ if (ib != end()) {
+ //!!! This and related code really need to get a quantized
+ // absolute time of a note event that has the same unquantized
+ // time as ib, not necessarily of ib itself... or else the
+ // quantizer needs to set the quantized times of all non-note
+ // events that happen at the same unquantized time as a note
+ // event to the same as that of the note event... yeah, that's
+ // probably the right thing
+ endTime = (*ib)->getNotationAbsoluteTime();
+
+ // was this just a nasty hack?
+ ++ib;
+ }
+
+ iterator i = ia;
+
+ for (; i != ib && i != end(); ++i) {
+
+ // Boundary events for sets of rests may be notes (obviously),
+ // text events (because they need to be "attached" to
+ // something that has the correct timing), or rests (any
+ // remaining rests in this area have tuplet data so should be
+ // treated as "hard" rests);
+ if (!((*i)->isa(Note::EventType) ||
+ (*i)->isa(Text::EventType) ||
+ (*i)->isa(Note::EventRestType))) {
+ continue;
+ }
+
+ timeT thisNoteStarts = (*i)->getNotationAbsoluteTime();
+
+#ifdef DEBUG_NORMALIZE_RESTS
+ cerr << "normalizeRests: scanning: thisNoteStarts " << thisNoteStarts
+ << ", lastNoteStarts " << lastNoteStarts
+ << ", lastNoteEnds " << lastNoteEnds << endl;
+#endif
+
+ /* BR #988185: "Notation: Rest can be simultaneous with note but follow it"
+
+ This conditional tested whether a note started before the
+ preceding note ended, and if so inserted rests simultaneous
+ with the preceding note to make up the gap. Without the
+ ability to lay out those rests partwise, this is never any
+ better than plain confusing. Revert the change.
+
+ if (thisNoteStarts < lastNoteEnds &&
+ thisNoteStarts > lastNoteStarts) {
+ gaps.push_back(std::pair<timeT, timeT>
+ (lastNoteStarts,
+ thisNoteStarts - lastNoteStarts));
+ }
+ */
+
+ if (thisNoteStarts > lastNoteEnds) {
+ gaps.push_back(std::pair<timeT, timeT>
+ (lastNoteEnds,
+ thisNoteStarts - lastNoteEnds));
+ }
+
+ lastNoteStarts = thisNoteStarts;
+ lastNoteEnds = thisNoteStarts + (*i)->getNotationDuration();
+ }
+
+ if (endTime > lastNoteEnds) {
+ gaps.push_back(std::pair<timeT, timeT>
+ (lastNoteEnds, endTime - lastNoteEnds));
+ }
+
+ timeT duration;
+
+ for (unsigned int gi = 0; gi < gaps.size(); ++gi) {
+
+#ifdef DEBUG_NORMALIZE_RESTS
+ cerr << "normalizeRests: gap " << gi << ": " << gaps[gi].first << " -> " << (gaps[gi].first + gaps[gi].second) << endl;
+#endif
+
+ startTime = gaps[gi].first;
+ duration = gaps[gi].second;
+
+ if (duration >= Note(Note::Shortest).getDuration()) {
+ fillWithRests(startTime, startTime + duration);
+ }
+ }
+}
+
+
+
+void Segment::getTimeSlice(timeT absoluteTime, iterator &start, iterator &end)
+{
+ Event dummy("dummy", absoluteTime, 0, MIN_SUBORDERING);
+
+ // No, this won't work -- we need to include things that don't
+ // compare equal because they have different suborderings, as long
+ // as they have the same times
+
+// std::pair<iterator, iterator> res = equal_range(&dummy);
+
+// start = res.first;
+// end = res.second;
+
+ // Got to do this instead:
+
+ start = end = lower_bound(&dummy);
+
+ while (end != this->end() &&
+ (*end)->getAbsoluteTime() == (*start)->getAbsoluteTime())
+ ++end;
+}
+
+void Segment::getTimeSlice(timeT absoluteTime, const_iterator &start, const_iterator &end)
+ const
+{
+ Event dummy("dummy", absoluteTime, 0, MIN_SUBORDERING);
+
+ start = end = lower_bound(&dummy);
+
+ while (end != this->end() &&
+ (*end)->getAbsoluteTime() == (*start)->getAbsoluteTime())
+ ++end;
+}
+
+void
+Segment::setQuantization(bool quantize)
+{
+ if (m_quantize != quantize) {
+ m_quantize = quantize;
+ if (m_quantize) {
+ m_quantizer->quantize(this, begin(), end());
+ } else {
+ m_quantizer->unquantize(this, begin(), end());
+ }
+ }
+}
+
+bool
+Segment::hasQuantization() const
+{
+ return m_quantize;
+}
+
+void
+Segment::setQuantizeLevel(timeT unit)
+{
+ if (m_quantizer->getUnit() == unit) return;
+
+ m_quantizer->setUnit(unit);
+ if (m_quantize) m_quantizer->quantize(this, begin(), end());
+}
+
+const BasicQuantizer *
+Segment::getQuantizer() const
+{
+ return m_quantizer;
+}
+
+
+void
+Segment::setRepeating(bool value)
+{
+ m_repeating = value;
+ if (m_composition) {
+ m_composition->updateRefreshStatuses();
+ m_composition->notifySegmentRepeatChanged(this, value);
+ }
+}
+
+void
+Segment::setDelay(timeT delay)
+{
+ m_delay = delay;
+ if (m_composition) {
+ // don't updateRefreshStatuses() - affects playback only
+ m_composition->notifySegmentEventsTimingChanged(this, delay, RealTime::zeroTime);
+ }
+}
+
+void
+Segment::setRealTimeDelay(RealTime delay)
+{
+ m_realTimeDelay = delay;
+ if (m_composition) {
+ // don't updateRefreshStatuses() - affects playback only
+ m_composition->notifySegmentEventsTimingChanged(this, 0, delay);
+ }
+}
+
+void
+Segment::setTranspose(int transpose)
+{
+ m_transpose = transpose;
+ if (m_composition) {
+ // don't updateRefreshStatuses() - affects playback only
+ m_composition->notifySegmentTransposeChanged(this, transpose);
+ }
+}
+
+void
+Segment::setAudioFileId(unsigned int id)
+{
+ m_audioFileId = id;
+ updateRefreshStatuses(getStartTime(), getEndTime());
+}
+
+void
+Segment::setUnstretchedFileId(unsigned int id)
+{
+ m_unstretchedFileId = id;
+}
+
+void
+Segment::setStretchRatio(float ratio)
+{
+ m_stretchRatio = ratio;
+}
+
+void
+Segment::setAudioStartTime(const RealTime &time)
+{
+ m_audioStartTime = time;
+ updateRefreshStatuses(getStartTime(), getEndTime());
+}
+
+void
+Segment::setAudioEndTime(const RealTime &time)
+{
+ RealTime oldAudioEndTime = m_audioEndTime;
+ m_audioEndTime = time;
+ updateRefreshStatuses(getStartTime(), getEndTime());
+ notifyEndMarkerChange(time < oldAudioEndTime);
+}
+
+void
+Segment::setAutoFade(bool value)
+{
+ m_autoFade = value;
+ updateRefreshStatuses(getStartTime(), getEndTime());
+}
+
+void
+Segment::setFadeInTime(const RealTime &time)
+{
+ m_fadeInTime = time;
+ updateRefreshStatuses(getStartTime(), getEndTime());
+}
+
+void
+Segment::setFadeOutTime(const RealTime &time)
+{
+ m_fadeOutTime = time;
+ updateRefreshStatuses(getStartTime(), getEndTime());
+}
+
+void
+Segment::setLabel(const std::string &label)
+{
+ m_label = label;
+ if (m_composition) m_composition->updateRefreshStatuses();
+ notifyAppearanceChange();
+}
+
+bool
+Segment::ClefKeyCmp::operator()(const Event *e1, const Event *e2) const
+{
+ if (e1->getType() == e2->getType()) return Event::EventCmp()(e1, e2);
+ else return e1->getType() < e2->getType();
+}
+
+Clef
+Segment::getClefAtTime(timeT time) const
+{
+ timeT ctime;
+ return getClefAtTime(time, ctime);
+}
+
+Clef
+Segment::getClefAtTime(timeT time, timeT &ctime) const
+{
+ if (!m_clefKeyList) return Clef();
+
+ Event ec(Clef::EventType, time);
+ ClefKeyList::iterator i = m_clefKeyList->lower_bound(&ec);
+
+ while (i == m_clefKeyList->end() ||
+ (*i)->getAbsoluteTime() > time ||
+ (*i)->getType() != Clef::EventType) {
+
+ if (i == m_clefKeyList->begin()) {
+ ctime = getStartTime();
+ return Clef();
+ }
+ --i;
+ }
+
+ try {
+ ctime = (*i)->getAbsoluteTime();
+ return Clef(**i);
+ } catch (const Exception &e) {
+ std::cerr << "Segment::getClefAtTime(" << time
+ << "): bogus clef in ClefKeyList: event dump follows:"
+ << std::endl;
+ (*i)->dump(std::cerr);
+ return Clef();
+ }
+}
+
+Key
+Segment::getKeyAtTime(timeT time) const
+{
+ timeT ktime;
+ return getKeyAtTime(time, ktime);
+}
+
+Key
+Segment::getKeyAtTime(timeT time, timeT &ktime) const
+{
+ if (!m_clefKeyList) return Key();
+
+ Event ek(Key::EventType, time);
+ ClefKeyList::iterator i = m_clefKeyList->lower_bound(&ek);
+
+ while (i == m_clefKeyList->end() ||
+ (*i)->getAbsoluteTime() > time ||
+ (*i)->getType() != Key::EventType) {
+
+ if (i == m_clefKeyList->begin()) {
+ ktime = getStartTime();
+ return Key();
+ }
+ --i;
+ }
+
+ try {
+ ktime = (*i)->getAbsoluteTime();
+ return Key(**i);
+ } catch (const Exception &e) {
+ std::cerr << "Segment::getClefAtTime(" << time
+ << "): bogus key in ClefKeyList: event dump follows:"
+ << std::endl;
+ (*i)->dump(std::cerr);
+ return Key();
+ }
+}
+
+void
+Segment::getFirstClefAndKey(Clef &clef, Key &key)
+{
+ bool keyFound = false;
+ bool clefFound = false;
+ clef = Clef(); // Default clef
+ key = Key(); // Default key signature
+
+ iterator i = begin();
+ while (i!=end()) {
+ // Keep current clef and key as soon as a note or rest event is found
+ if ((*i)->isa(Note::EventRestType) || (*i)->isa(Note::EventType)) return;
+
+ // Remember the first clef event found
+ if ((*i)->isa(Clef::EventType)) {
+ clef = Clef(*(*i));
+ // and return if a key has already been found
+ if (keyFound) return;
+ clefFound = true;
+ }
+
+ // Remember the first key event found
+ if ((*i)->isa(Key::EventType)) {
+ key = Key(*(*i));
+ // and return if a clef has already been found
+ if (clefFound) return;
+ keyFound = true;
+ }
+
+ ++i;
+ }
+}
+
+timeT
+Segment::getRepeatEndTime() const
+{
+ timeT endMarker = getEndMarkerTime();
+
+ if (m_repeating && m_composition) {
+ Composition::iterator i(m_composition->findSegment(this));
+ assert(i != m_composition->end());
+ ++i;
+ if (i != m_composition->end() && (*i)->getTrack() == getTrack()) {
+ timeT t = (*i)->getStartTime();
+ if (t < endMarker) return endMarker;
+ else return t;
+ } else {
+ return m_composition->getEndMarker();
+ }
+ }
+
+ return endMarker;
+}
+
+
+void
+Segment::notifyAdd(Event *e) const
+{
+ if (e->isa(Clef::EventType) || e->isa(Key::EventType)) {
+ if (!m_clefKeyList) m_clefKeyList = new ClefKeyList;
+ m_clefKeyList->insert(e);
+ }
+
+ for (ObserverSet::const_iterator i = m_observers.begin();
+ i != m_observers.end(); ++i) {
+ (*i)->eventAdded(this, e);
+ }
+}
+
+
+void
+Segment::notifyRemove(Event *e) const
+{
+ if (m_clefKeyList && (e->isa(Clef::EventType) || e->isa(Key::EventType))) {
+ ClefKeyList::iterator i;
+ for (i = m_clefKeyList->find(e); i != m_clefKeyList->end(); ++i) {
+ // fix for bug#1485643 (crash erasing a duplicated key signature)
+ if ((*i) == e) {
+ m_clefKeyList->erase(i);
+ break;
+ }
+ }
+ }
+
+ for (ObserverSet::const_iterator i = m_observers.begin();
+ i != m_observers.end(); ++i) {
+ (*i)->eventRemoved(this, e);
+ }
+}
+
+
+void
+Segment::notifyAppearanceChange() const
+{
+ for (ObserverSet::const_iterator i = m_observers.begin();
+ i != m_observers.end(); ++i) {
+ (*i)->appearanceChanged(this);
+ }
+}
+
+void
+Segment::notifyStartChanged(timeT newTime)
+{
+ for (ObserverSet::const_iterator i = m_observers.begin();
+ i != m_observers.end(); ++i) {
+ (*i)->startChanged(this, newTime);
+ }
+ if (m_composition) {
+ m_composition->notifySegmentStartChanged(this, newTime);
+ }
+}
+
+
+void
+Segment::notifyEndMarkerChange(bool shorten)
+{
+ for (ObserverSet::const_iterator i = m_observers.begin();
+ i != m_observers.end(); ++i) {
+ (*i)->endMarkerTimeChanged(this, shorten);
+ }
+ if (m_composition) {
+ m_composition->notifySegmentEndMarkerChange(this, shorten);
+ }
+}
+
+
+void
+Segment::notifySourceDeletion() const
+{
+ for (ObserverSet::const_iterator i = m_observers.begin();
+ i != m_observers.end(); ++i) {
+ (*i)->segmentDeleted(this);
+ }
+}
+
+
+void
+Segment::setColourIndex(const unsigned int input)
+{
+ m_colourIndex = input;
+ updateRefreshStatuses(getStartTime(), getEndTime());
+ if (m_composition) m_composition->updateRefreshStatuses();
+ notifyAppearanceChange();
+}
+
+void
+Segment::addEventRuler(const std::string &type, int controllerValue, bool active)
+{
+ EventRulerListConstIterator it;
+
+ for (it = m_eventRulerList.begin(); it != m_eventRulerList.end(); ++it)
+ if ((*it)->m_type == type && (*it)->m_controllerValue == controllerValue)
+ return;
+
+ m_eventRulerList.push_back(new EventRuler(type, controllerValue, active));
+}
+
+bool
+Segment::deleteEventRuler(const std::string &type, int controllerValue)
+{
+ EventRulerListIterator it;
+
+ for (it = m_eventRulerList.begin(); it != m_eventRulerList.end(); ++it)
+ {
+ if ((*it)->m_type == type && (*it)->m_controllerValue == controllerValue)
+ {
+ delete *it;
+ m_eventRulerList.erase(it);
+ return true;
+ }
+ }
+
+ return false;
+}
+
+Segment::EventRuler*
+Segment::getEventRuler(const std::string &type, int controllerValue)
+{
+ EventRulerListConstIterator it;
+ for (it = m_eventRulerList.begin(); it != m_eventRulerList.end(); ++it)
+ if ((*it)->m_type == type && (*it)->m_controllerValue == controllerValue)
+ return *it;
+
+ return 0;
+}
+
+
+
+SegmentHelper::~SegmentHelper() { }
+
+
+void
+SegmentRefreshStatus::push(timeT from, timeT to)
+{
+ if (!needsRefresh()) { // don't do anything subtle - just erase the old data
+
+ m_from = from;
+ m_to = to;
+
+ } else { // accumulate on what was already there
+
+ if (from < m_from) m_from = from;
+ if (to > m_to) m_to = to;
+
+ }
+
+ if (m_to < m_from) std::swap(m_from, m_to);
+
+ setNeedsRefresh(true);
+}
+
+
+
+
+}
diff --git a/src/base/Segment.h b/src/base/Segment.h
new file mode 100644
index 0000000..564d118
--- /dev/null
+++ b/src/base/Segment.h
@@ -0,0 +1,783 @@
+// -*- c-basic-offset: 4 -*-
+
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _SEGMENT_H_
+#define _SEGMENT_H_
+
+#include <set>
+#include <list>
+#include <string>
+
+#include "Track.h"
+#include "Event.h"
+#include "NotationTypes.h"
+#include "RefreshStatus.h"
+#include "RealTime.h"
+#include "MidiProgram.h"
+
+namespace Rosegarden
+{
+
+class SegmentRefreshStatus : public RefreshStatus
+{
+public:
+ SegmentRefreshStatus() : m_from(0), m_to(0) {}
+
+ void push(timeT from, timeT to);
+
+ timeT from() const { return m_from; }
+ timeT to() const { return m_to; }
+
+protected:
+ timeT m_from;
+ timeT m_to;
+};
+
+
+/**
+ * Segment is the container for a set of Events that are all played on
+ * the same track. Each event has an absolute starting time,
+ * which is used as the index within the segment. Multiple events may
+ * have the same absolute time.
+ *
+ * (For example, chords are represented simply as a sequence of notes
+ * that share a starting time. The Segment can contain counterpoint --
+ * notes that overlap, rather than starting and ending together -- but
+ * in practice it's probably too hard to display so we should make
+ * more than one Segment if we want to represent true counterpoint.)
+ *
+ * If you want to carry out notation-related editing operations on
+ * a Segment, take a look at SegmentNotationHelper. If you want to play a
+ * Segment, try SegmentPerformanceHelper for duration calculations.
+ *
+ * The Segment owns the Events its items are pointing at.
+ */
+
+class SegmentObserver;
+class Quantizer;
+class BasicQuantizer;
+class Composition;
+
+class Segment : public std::multiset<Event*, Event::EventCmp>
+{
+public:
+ /// A Segment contains either Internal representation or Audio
+ typedef enum {
+ Internal,
+ Audio
+ } SegmentType;
+
+ /**
+ * Construct a Segment of a given type with a given formal starting time.
+ */
+ Segment(SegmentType segmentType = Internal,
+ timeT startTime = 0);
+ /**
+ * Copy constructor
+ */
+ Segment(const Segment&);
+
+ virtual ~Segment();
+
+
+ //////
+ //
+ // BASIC SEGMENT ATTRIBUTES
+
+ /**
+ * Get the Segment type (Internal or Audio)
+ */
+ SegmentType getType() const { return m_type; }
+
+ /**
+ * Note that a Segment does not have to be in a Composition;
+ * if it isn't, this will return zero
+ */
+ Composition *getComposition() const {
+ return m_composition;
+ }
+
+ /**
+ * Get the track number this Segment is associated with.
+ */
+ TrackId getTrack() const { return m_track; }
+
+ /**
+ * Set the track number this Segment is associated with.
+ */
+ void setTrack(TrackId i);
+
+ // label
+ //
+ void setLabel(const std::string &label);
+ std::string getLabel() const { return m_label; }
+
+ // Colour information
+ void setColourIndex(const unsigned int input);
+ unsigned int getColourIndex() const { return m_colourIndex; }
+
+ /**
+ * Returns a numeric id of some sort
+ * The id is guaranteed to be unique within the segment, but not to
+ * have any other interesting properties
+ */
+ int getNextId() const;
+
+ /**
+ * Returns a MIDI pitch representing the highest suggested playable note for
+ * notation contained in this segment, as a convenience reminder to composers.
+ *
+ * This property, and its corresponding lowest note counterpart, initialize by
+ * default such that no limitation is imposed. (lowest = 0, highest = 127)
+ */
+ int getHighestPlayable() { return m_highestPlayable; }
+
+ /**
+ * Set the highest suggested playable note for this segment
+ */
+ void setHighestPlayable(int pitch) { m_highestPlayable = pitch; }
+
+ /**
+ * Returns a MIDI pitch representing the lowest suggested playable note for
+ * notation contained in this segment, as a convenience reminder to composers
+ */
+ int getLowestPlayable() { return m_lowestPlayable; }
+
+ /**
+ * Set the highest suggested playable note for this segment
+ */
+ void setLowestPlayable(int pitch) { m_lowestPlayable = pitch; }
+
+
+
+ //////
+ //
+ // TIME & DURATION VALUES
+
+ /**
+ * Return the start time of the Segment. For a non-audio
+ * Segment, this is the start time of the first event in it.
+ */
+ timeT getStartTime() const;
+
+ /**
+ * Return the nominal end time of the Segment. This must
+ * be the same as or earlier than the getEndTime() value.
+ * The return value will not necessarily be that last set
+ * with setEndMarkerTime, as if there is a Composition its
+ * end marker will also be used for clipping.
+ */
+ timeT getEndMarkerTime() const;
+
+ /**
+ * Return the time of the end of the last event stored in the
+ * Segment. This time may be outside the audible/editable
+ * range of the Segment, depending on the location of the end
+ * marker.
+ */
+ timeT getEndTime() const;
+
+ /**
+ * Shift the start time of the Segment by moving the start
+ * times of all the events in the Segment.
+ */
+ void setStartTime(timeT);
+
+ /**
+ * DO NOT USE THIS METHOD
+ * Simple accessor for the m_startTime member. Used by
+ * Composition#setSegmentStartTime
+ */
+ void setStartTimeDataMember(timeT t) { m_startTime = t; }
+
+ /**
+ * Set the end marker (nominal end time) of this Segment.
+ *
+ * If the given time is later than the current end of the
+ * Segment's storage, extend the Segment by filling it with
+ * rests; if earlier, simply move the end marker. The end
+ * marker time may not precede the start time.
+ */
+ void setEndMarkerTime(timeT);
+
+ /**
+ * Set the end time of the Segment.
+ *
+ * If the given time is later than the current end of the
+ * Segment's storage, extend the Segment by filling it with
+ * rests; if earlier, shorten it by throwing away events as
+ * necessary (though do not truncate any events) and also move
+ * the end marker to the given time. The end time may not
+ * precede the start time.
+ *
+ * Note that simply inserting an event beyond the end of the
+ * Segment will also change the end time, although it does
+ * not fill with rests in the desirable way.
+ *
+ * Consider using setEndMarkerTime in preference to this.
+ */
+ void setEndTime(timeT);
+
+ /**
+ * Return an iterator pointing to the nominal end of the
+ * Segment. This may be earlier than the end() iterator.
+ */
+ iterator getEndMarker();
+
+ /**
+ * Return true if the given iterator points earlier in the
+ * Segment than the nominal end marker. You can use this
+ * as an extent test in code such as
+ *
+ * while (segment.isBeforeEndMarker(my_iterator)) {
+ * // ...
+ * ++my_iterator;
+ * }
+ *
+ * It is not generally safe to write
+ *
+ * while (my_iterator != segment.getEndMarker()) {
+ * // ...
+ * ++my_iterator;
+ * }
+ *
+ * as the loop will not terminate if my_iterator's initial
+ * value is already beyond the end marker. (Also takes the
+ * Composition's end marker into account.)
+ */
+ bool isBeforeEndMarker(const_iterator) const;
+
+ /**
+ * Remove the end marker, thus making the Segment end
+ * at its storage end time (unless the Composition's
+ * end marker is earlier).
+ */
+ void clearEndMarker();
+
+ /**
+ * Return the end marker in raw form, that is, a pointer to
+ * its value or null if none is set. Does not take the
+ * composition's end marker into account.
+ */
+ const timeT *getRawEndMarkerTime() const;
+
+
+ //////
+ //
+ // QUANTIZATION
+
+ /**
+ * Switch quantization on or off.
+ */
+ void setQuantization(bool quantize);
+
+ /**
+ * Find out whether quantization is on or off.
+ */
+ bool hasQuantization() const;
+
+ /**
+ * Set the quantization level.
+ * (This does not switch quantization on, if it's currently off,
+ * it only changes the level that will be used when it's next
+ * switched on.)
+ */
+ void setQuantizeLevel(timeT unit);
+
+ /**
+ * Get the quantizer currently in (or not in) use.
+ */
+ const BasicQuantizer *getQuantizer() const;
+
+
+
+ //////
+ //
+ // EVENT MANIPULATION
+
+ /**
+ * Inserts a single Event
+ */
+ iterator insert(Event *e);
+
+ /**
+ * Erases a single Event
+ */
+ void erase(iterator pos);
+
+ /**
+ * Erases a set of Events
+ */
+ void erase(iterator from, iterator to);
+
+ /**
+ * Clear the segment.
+ */
+ void clear() { erase(begin(), end()); }
+
+ /**
+ * Looks up an Event and if it finds it, erases it.
+ * @return true if the event was found and erased, false otherwise.
+ */
+ bool eraseSingle(Event*);
+
+ /**
+ * Returns an iterator pointing to that specific element,
+ * end() otherwise
+ */
+ iterator findSingle(Event*);
+
+ const_iterator findSingle(Event *e) const {
+ return const_iterator(((Segment *)this)->findSingle(e));
+ }
+
+ /**
+ * Returns an iterator pointing to the first element starting at
+ * or beyond the given absolute time
+ */
+ iterator findTime(timeT time);
+
+ const_iterator findTime(timeT time) const {
+ return const_iterator(((Segment *)this)->findTime(time));
+ }
+
+ /**
+ * Returns an iterator pointing to the first element starting at
+ * or before the given absolute time (so returns end() if the
+ * time precedes the first event, not if it follows the last one)
+ */
+ iterator findNearestTime(timeT time);
+
+ const_iterator findNearestTime(timeT time) const {
+ return const_iterator(((Segment *)this)->findNearestTime(time));
+ }
+
+
+ //////
+ //
+ // ADVANCED, ESOTERIC, or PLAIN STUPID MANIPULATION
+
+ /**
+ * Returns the range [start, end[ of events which are at absoluteTime
+ */
+ void getTimeSlice(timeT absoluteTime, iterator &start, iterator &end);
+
+ /**
+ * Returns the range [start, end[ of events which are at absoluteTime
+ */
+ void getTimeSlice(timeT absoluteTime, const_iterator &start, const_iterator &end) const;
+
+ /**
+ * Return the starting time of the bar that contains time t. This
+ * differs from Composition's bar methods in that it will truncate
+ * to the start and end times of this Segment, and is guaranteed
+ * to return the start time of a bar that is at least partially
+ * within this Segment.
+ *
+ * (See Composition for most of the generally useful bar methods.)
+ */
+ timeT getBarStartForTime(timeT t) const;
+
+ /**
+ * Return the ending time of the bar that contains time t. This
+ * differs from Composition's bar methods in that it will truncate
+ * to the start and end times of this Segment, and is guaranteed
+ * to return the end time of a bar that is at least partially
+ * within this Segment.
+ *
+ * (See Composition for most of the generally useful bar methods.)
+ */
+ timeT getBarEndForTime(timeT t) const;
+
+ /**
+ * Fill up the segment with rests, from the end of the last event
+ * currently on the segment to the endTime given. Actually, this
+ * does much the same as setEndTime does when it extends a segment.
+ */
+ void fillWithRests(timeT endTime);
+
+ /**
+ * Fill up a section within a segment with rests, from the
+ * startTime given to the endTime given. This may be useful if
+ * you have a pathological segment that contains notes already but
+ * not rests, but it is is likely to be dangerous unless you're
+ * quite careful about making sure the given range doesn't overlap
+ * any notes.
+ */
+ void fillWithRests(timeT startTime, timeT endTime);
+
+ /**
+ * For each series of contiguous rests found between the start and
+ * end time, replace the series of rests with another series of
+ * the same duration but composed of the theoretically "correct"
+ * rest durations to fill the gap, in the current time signature.
+ * The start and end time should be the raw absolute times of the
+ * events, not the notation-quantized versions, although the code
+ * will use the notation quantizations if it finds them.
+ */
+ void normalizeRests(timeT startTime, timeT endTime);
+
+ /**
+ * Return the clef in effect at the given time. This is a
+ * reasonably quick call.
+ */
+ Clef getClefAtTime(timeT time) const;
+
+ /**
+ * Return the clef in effect at the given time, and set ctime to
+ * the time of the clef change. This is a reasonably quick call.
+ */
+ Clef getClefAtTime(timeT time, timeT &ctime) const;
+
+ /**
+ * Return the key signature in effect at the given time. This is
+ * a reasonably quick call.
+ */
+ Key getKeyAtTime(timeT time) const;
+
+ /**
+ * Return the key signature in effect at the given time, and set
+ * ktime to the time of the key change. This is a reasonably
+ * quick call.
+ */
+ Key getKeyAtTime(timeT time, timeT &ktime) const;
+
+ /**
+ * Return the clef and key signature in effect at the beginning of the
+ * segment using the following rules :
+ *
+ * - Return the default clef if no clef change is preceding the first
+ * note or rest event,
+ * - else return the first clef event in the segment,
+ * - else return the default clef if the segment has no note event nor
+ * clef change in it.
+ *
+ * - Use the same rules with the key signature.
+ */
+ void getFirstClefAndKey(Clef &clef, Key &key);
+
+
+ //////
+ //
+ // REPEAT, DELAY, TRANSPOSE
+
+ // Is this Segment repeating?
+ //
+ bool isRepeating() const { return m_repeating; }
+ void setRepeating(bool value);
+
+ /**
+ * If this Segment is repeating, calculate and return the time at
+ * which the repeating stops. This is the start time of the
+ * following Segment on the same Track, if any, or else the end
+ * time of the Composition. If this Segment does not repeat, or
+ * the time calculated would precede the end time of the Segment,
+ * instead return the end time of the Segment.
+ */
+ timeT getRepeatEndTime() const;
+
+ timeT getDelay() const { return m_delay; }
+ void setDelay(timeT delay);
+
+ RealTime getRealTimeDelay() const { return m_realTimeDelay; }
+ void setRealTimeDelay(RealTime delay);
+
+ int getTranspose() const { return m_transpose; }
+ void setTranspose(int transpose);
+
+
+
+ //////
+ //
+ // AUDIO
+
+ // Get and set Audio file Id (see the AudioFileManager)
+ //
+ unsigned int getAudioFileId() const { return m_audioFileId; }
+ void setAudioFileId(unsigned int id);
+
+ unsigned int getUnstretchedFileId() const { return m_unstretchedFileId; }
+ void setUnstretchedFileId(unsigned int id);
+
+ float getStretchRatio() const { return m_stretchRatio; }
+ void setStretchRatio(float ratio);
+
+ // The audio start and end times tell us how far into
+ // audio file "m_audioFileId" this Segment starts and
+ // how far into the sample the Segment finishes.
+ //
+ RealTime getAudioStartTime() const { return m_audioStartTime; }
+ RealTime getAudioEndTime() const { return m_audioEndTime; }
+ void setAudioStartTime(const RealTime &time);
+ void setAudioEndTime(const RealTime &time);
+
+ bool isAutoFading() const { return m_autoFade; }
+ void setAutoFade(bool value);
+
+ RealTime getFadeInTime() const { return m_fadeInTime; }
+ void setFadeInTime(const RealTime &time);
+
+ RealTime getFadeOutTime() const { return m_fadeOutTime; }
+ void setFadeOutTime(const RealTime &time);
+
+ //////
+ //
+ // MISCELLANEOUS
+
+ /// Should only be called by Composition
+ void setComposition(Composition *composition) {
+ m_composition = composition;
+ }
+
+ // The runtime id for this segment
+ //
+ int getRuntimeId() const { return m_runtimeSegmentId; }
+
+ // Grid size for matrix view (and others probably)
+ //
+ void setSnapGridSize(int size) { m_snapGridSize = size; }
+ int getSnapGridSize() const { return m_snapGridSize; }
+
+ // Other view features we might want to set on this Segment
+ //
+ void setViewFeatures(int features) { m_viewFeatures = features; }
+ int getViewFeatures() const { return m_viewFeatures; }
+
+ /**
+ * The compare class used by Composition
+ */
+ struct SegmentCmp
+ {
+ bool operator()(const Segment* a, const Segment* b) const
+ {
+ if (a->getTrack() == b->getTrack())
+ return a->getStartTime() < b->getStartTime();
+
+ return a->getTrack() < b->getTrack();
+ }
+ };
+
+
+ /// For use by SegmentObserver objects like Composition & Staff
+ void addObserver(SegmentObserver *obs) { m_observers.push_back(obs); }
+
+ /// For use by SegmentObserver objects like Composition & Staff
+ void removeObserver(SegmentObserver *obs) { m_observers.remove(obs); }
+
+ // List of visible EventRulers attached to this segment
+ //
+ class EventRuler
+ {
+ public:
+ EventRuler(const std::string &type, int controllerValue, bool active):
+ m_type(type), m_controllerValue(controllerValue), m_active(active) {;}
+
+ std::string m_type; // Event Type
+ int m_controllerValue; // if controller event, then which value
+ bool m_active; // is this Ruler active?
+ };
+
+ typedef std::vector<EventRuler*> EventRulerList;
+ typedef std::vector<EventRuler*>::iterator EventRulerListIterator;
+ typedef std::vector<EventRuler*>::const_iterator EventRulerListConstIterator;
+
+ EventRulerList& getEventRulerList() { return m_eventRulerList; }
+ EventRuler* getEventRuler(const std::string &type, int controllerValue = -1);
+
+ void addEventRuler(const std::string &type, int controllerValue = -1, bool active = 0);
+ bool deleteEventRuler(const std::string &type, int controllerValue = -1);
+
+ //////
+ //
+ // REFRESH STATUS
+
+ // delegate part of the RefreshStatusArray API
+
+ unsigned int getNewRefreshStatusId() {
+ return m_refreshStatusArray.getNewRefreshStatusId();
+ }
+
+ SegmentRefreshStatus &getRefreshStatus(unsigned int id) {
+ return m_refreshStatusArray.getRefreshStatus(id);
+ }
+
+ void updateRefreshStatuses(timeT startTime, timeT endTime);
+
+private:
+ Composition *m_composition; // owns me, if it exists
+
+ timeT m_startTime;
+ timeT *m_endMarkerTime; // points to end time, or null if none
+ timeT m_endTime;
+
+ void updateEndTime(); // called after erase of item at end
+
+ TrackId m_track;
+ SegmentType m_type; // identifies Segment type
+ std::string m_label; // segment label
+
+ unsigned int m_colourIndex; // identifies Colour Index (default == 0)
+
+ mutable int m_id; // not id of Segment, but a value for return by getNextId
+
+ unsigned int m_audioFileId; // audio file ID (see AudioFileManager)
+ unsigned int m_unstretchedFileId;
+ float m_stretchRatio;
+ RealTime m_audioStartTime; // start time relative to start of audio file
+ RealTime m_audioEndTime; // end time relative to start of audio file
+
+ bool m_repeating; // is this segment repeating?
+
+ BasicQuantizer *const m_quantizer;
+ bool m_quantize;
+
+ int m_transpose; // all Events tranpose
+ timeT m_delay; // all Events delay
+ RealTime m_realTimeDelay; // all Events delay (the delays are cumulative)
+
+ int m_highestPlayable; // suggestion for highest playable note (notation)
+ int m_lowestPlayable; // suggestion for lowest playable note (notation)
+
+ RefreshStatusArray<SegmentRefreshStatus> m_refreshStatusArray;
+
+ struct ClefKeyCmp {
+ bool operator()(const Event *e1, const Event *e2) const;
+ };
+ typedef std::multiset<Event*, ClefKeyCmp> ClefKeyList;
+ mutable ClefKeyList *m_clefKeyList;
+
+ // EventRulers currently selected as visible on this segment
+ //
+ EventRulerList m_eventRulerList;
+
+private: // stuff to support SegmentObservers
+
+ typedef std::list<SegmentObserver *> ObserverSet;
+ ObserverSet m_observers;
+
+ void notifyAdd(Event *) const;
+ void notifyRemove(Event *) const;
+ void notifyAppearanceChange() const;
+ void notifyStartChanged(timeT);
+ void notifyEndMarkerChange(bool shorten);
+ void notifySourceDeletion() const;
+
+private: // assignment operator not provided
+
+ Segment &operator=(const Segment &);
+
+ // Used for mapping the segment to runtime things like PlayableAudioFiles at
+ // the sequencer.
+ //
+ int m_runtimeSegmentId;
+
+ // Remember the last used snap grid size for this segment
+ //
+ int m_snapGridSize;
+
+ // Switch for other view-specific features we want to remember in the segment
+ //
+ int m_viewFeatures;
+
+ // Audio autofading
+ //
+ bool m_autoFade;
+ RealTime m_fadeInTime;
+ RealTime m_fadeOutTime;
+
+};
+
+
+class SegmentObserver
+{
+public:
+ virtual ~SegmentObserver() {}
+
+ /**
+ * Called after the event has been added to the segment
+ */
+ virtual void eventAdded(const Segment *, Event *) { }
+
+ /**
+ * Called after the event has been removed from the segment,
+ * and just before it is deleted
+ */
+ virtual void eventRemoved(const Segment *, Event *) { }
+
+ /**
+ * Called after a change in the segment that will change the way its displays,
+ * like a label change for instance
+ */
+ virtual void appearanceChanged(const Segment *) { }
+
+ /**
+ * Called after a change that affects the start time of the segment
+ */
+ virtual void startChanged(const Segment *, timeT) { }
+
+ /**
+ * Called after the segment's end marker time has been
+ * changed
+ *
+ * @param shorten true if the marker change shortens the segment's duration
+ */
+ virtual void endMarkerTimeChanged(const Segment *, bool /*shorten*/) { }
+
+ /**
+ * Called from the segment dtor
+ * MUST BE IMPLEMENTED BY ALL OBSERVERS
+ */
+ virtual void segmentDeleted(const Segment *) = 0;
+};
+
+
+
+// an abstract base
+
+class SegmentHelper
+{
+protected:
+ SegmentHelper(Segment &t) : m_segment(t) { }
+ virtual ~SegmentHelper();
+
+ typedef Segment::iterator iterator;
+
+ Segment &segment() { return m_segment; }
+
+ Segment::iterator begin() { return segment().begin(); }
+ Segment::iterator end() { return segment().end(); }
+
+ bool isBeforeEndMarker(Segment::const_iterator i) {
+ return segment().isBeforeEndMarker(i);
+ }
+
+ Segment::iterator insert(Event *e) { return segment().insert(e); }
+ void erase(Segment::iterator i) { segment().erase(i); }
+
+private:
+ Segment &m_segment;
+};
+
+}
+
+
+#endif
diff --git a/src/base/SegmentMatrixHelper.cpp b/src/base/SegmentMatrixHelper.cpp
new file mode 100644
index 0000000..d9af52c
--- /dev/null
+++ b/src/base/SegmentMatrixHelper.cpp
@@ -0,0 +1,56 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include "SegmentMatrixHelper.h"
+#include "BaseProperties.h"
+
+namespace Rosegarden
+{
+
+Segment::iterator SegmentMatrixHelper::insertNote(Event* e)
+{
+ Segment::iterator i = segment().insert(e);
+ segment().normalizeRests(e->getAbsoluteTime(),
+ e->getAbsoluteTime() + e->getDuration());
+ return i;
+}
+
+bool
+SegmentMatrixHelper::isDrumColliding(Event* e)
+{
+ long pitch = 0;
+ if (!e->get<Int>(BaseProperties::PITCH, pitch))
+ return false;
+
+ timeT evTime = e->getAbsoluteTime();
+
+ Segment::iterator it;
+ for (it = segment().findTime(evTime); it != end(); ++it) {
+ if ((*it) == e) continue;
+ if ((*it)->getAbsoluteTime() != evTime) break;
+ long p = 0;
+ if (!(*it)->get<Int>(BaseProperties::PITCH, p)) continue;
+ if (p == pitch) return true;
+ }
+ return false;
+}
+
+}
diff --git a/src/base/SegmentMatrixHelper.h b/src/base/SegmentMatrixHelper.h
new file mode 100644
index 0000000..1790496
--- /dev/null
+++ b/src/base/SegmentMatrixHelper.h
@@ -0,0 +1,53 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _SEGMENT_MATRIX_HELPER_H_
+#define _SEGMENT_MATRIX_HELPER_H_
+
+#include "SegmentNotationHelper.h"
+
+namespace Rosegarden
+{
+
+class SegmentMatrixHelper : protected SegmentNotationHelper
+{
+public:
+ SegmentMatrixHelper(Segment &t) : SegmentNotationHelper(t) { }
+
+ iterator insertNote(Event *);
+
+ /**
+ * Returns true if event is colliding another note in percussion
+ * matrix (ie event is a note and has the same start time and the
+ * same pitch as another note).
+ */
+ bool isDrumColliding(Event *);
+
+ using SegmentHelper::segment;
+ using SegmentNotationHelper::deleteEvent;
+ using SegmentNotationHelper::deleteNote;
+
+};
+
+
+}
+
+#endif
diff --git a/src/base/SegmentNotationHelper.cpp b/src/base/SegmentNotationHelper.cpp
new file mode 100644
index 0000000..a6c8ab8
--- /dev/null
+++ b/src/base/SegmentNotationHelper.cpp
@@ -0,0 +1,2129 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include "SegmentNotationHelper.h"
+#include "NotationTypes.h"
+#include "Quantizer.h"
+#include "BasicQuantizer.h"
+#include "NotationQuantizer.h"
+#include "BaseProperties.h"
+#include "Composition.h"
+
+#include <iostream>
+#include <algorithm>
+#include <iterator>
+#include <list>
+
+namespace Rosegarden
+{
+using std::cerr;
+using std::endl;
+using std::string;
+using std::list;
+
+using namespace BaseProperties;
+
+
+SegmentNotationHelper::~SegmentNotationHelper() { }
+
+
+const Quantizer &
+SegmentNotationHelper::basicQuantizer() {
+ return *(segment().getComposition()->getBasicQuantizer());
+}
+
+const Quantizer &
+SegmentNotationHelper::notationQuantizer() {
+ return *(segment().getComposition()->getNotationQuantizer());
+}
+
+
+//!!! we need to go very carefully through this file and check calls
+//to getAbsoluteTime/getDuration -- the vast majority should almost
+//certainly now be using getNotationAbsoluteTime/getNotationDuration
+
+Segment::iterator
+SegmentNotationHelper::findNotationAbsoluteTime(timeT t)
+{
+ iterator i(segment().findTime(t));
+
+ // We don't know whether the notation absolute time t will appear
+ // before or after the real absolute time t. First scan backwards
+ // until we find a notation absolute time prior to (or equal to)
+ // t, and then scan forwards until we find the first one that
+ // isn't prior to t
+
+ while (i != begin() &&
+ ((i == end() ? t + 1 : (*i)->getNotationAbsoluteTime()) > t))
+ --i;
+
+ while (i != end() &&
+ ((*i)->getNotationAbsoluteTime() < t))
+ ++i;
+
+ return i;
+}
+
+Segment::iterator
+SegmentNotationHelper::findNearestNotationAbsoluteTime(timeT t)
+{
+ iterator i(segment().findTime(t));
+
+ // Exactly findNotationAbsoluteTime, only with the two scan loops
+ // in the other order
+
+ while (i != end() &&
+ ((*i)->getNotationAbsoluteTime() < t))
+ ++i;
+
+ while (i != begin() &&
+ ((i == end() ? t + 1 : (*i)->getNotationAbsoluteTime()) > t))
+ --i;
+
+ return i;
+}
+
+void
+SegmentNotationHelper::setNotationProperties(timeT startTime, timeT endTime)
+{
+ Segment::iterator from = begin();
+ Segment::iterator to = end();
+
+ if (startTime != endTime) {
+ from = segment().findTime(startTime);
+ to = segment().findTime(endTime);
+ }
+/*!!!
+ bool justSeenGraceNote = false;
+ timeT graceNoteStart = 0;
+*/
+ for (Segment::iterator i = from;
+ i != to && segment().isBeforeEndMarker(i); ++i) {
+
+ if ((*i)->has(NOTE_TYPE) /*!!! && !(*i)->has(IS_GRACE_NOTE) */) continue;
+
+ timeT duration = (*i)->getNotationDuration();
+
+ if ((*i)->has(BEAMED_GROUP_TUPLET_BASE)) {
+ int tcount = (*i)->get<Int>(BEAMED_GROUP_TUPLED_COUNT);
+ int ucount = (*i)->get<Int>(BEAMED_GROUP_UNTUPLED_COUNT);
+
+ if (tcount == 0) {
+ std::cerr << "WARNING: SegmentNotationHelper::setNotationProperties: zero tuplet count:" << std::endl;
+ (*i)->dump(std::cerr);
+ } else {
+ // nominal duration is longer than actual (sounding) duration
+ duration = (duration / tcount) * ucount;
+ }
+ }
+
+ if ((*i)->isa(Note::EventType) || (*i)->isa(Note::EventRestType)) {
+
+ if ((*i)->isa(Note::EventType)) {
+/*!!!
+ if ((*i)->has(IS_GRACE_NOTE) &&
+ (*i)->get<Bool>(IS_GRACE_NOTE)) {
+
+ if (!justSeenGraceNote) {
+ graceNoteStart = (*i)->getNotationAbsoluteTime();
+ justSeenGraceNote = true;
+ }
+
+ } else if (justSeenGraceNote) {
+
+ duration += (*i)->getNotationAbsoluteTime() - graceNoteStart;
+ justSeenGraceNote = false;
+ }
+*/
+ }
+
+ Note n(Note::getNearestNote(duration));
+
+ (*i)->setMaybe<Int>(NOTE_TYPE, n.getNoteType());
+ (*i)->setMaybe<Int>(NOTE_DOTS, n.getDots());
+ }
+ }
+}
+
+timeT
+SegmentNotationHelper::getNotationEndTime(Event *e)
+{
+ return e->getNotationAbsoluteTime() + e->getNotationDuration();
+}
+
+
+Segment::iterator
+SegmentNotationHelper::getNextAdjacentNote(iterator i,
+ bool matchPitch,
+ bool allowOverlap)
+{
+ iterator j(i);
+ if (!isBeforeEndMarker(i)) return i;
+ if (!(*i)->isa(Note::EventType)) return end();
+
+ timeT iEnd = getNotationEndTime(*i);
+ long ip = 0, jp = 0;
+ if (!(*i)->get<Int>(PITCH, ip) && matchPitch) return end();
+
+ while (true) {
+ if (!isBeforeEndMarker(j) || !isBeforeEndMarker(++j)) return end();
+ if (!(*j)->isa(Note::EventType)) continue;
+
+ timeT jStart = (*j)->getNotationAbsoluteTime();
+ if (jStart > iEnd) return end();
+
+ if (matchPitch) {
+ if (!(*j)->get<Int>(PITCH, jp) || (jp != ip)) continue;
+ }
+
+ if (allowOverlap || (jStart == iEnd)) return j;
+ }
+}
+
+
+Segment::iterator
+SegmentNotationHelper::getPreviousAdjacentNote(iterator i,
+ timeT rangeStart,
+ bool matchPitch,
+ bool allowOverlap)
+{
+ iterator j(i);
+ if (!isBeforeEndMarker(i)) return i;
+ if (!(*i)->isa(Note::EventType)) return end();
+
+ timeT iStart = (*i)->getNotationAbsoluteTime();
+ timeT iEnd = getNotationEndTime(*i);
+ long ip = 0, jp = 0;
+ if (!(*i)->get<Int>(PITCH, ip) && matchPitch) return end();
+
+ while (true) {
+ if (j == begin()) return end(); else --j;
+ if (!(*j)->isa(Note::EventType)) continue;
+ if ((*j)->getAbsoluteTime() < rangeStart) return end();
+
+ timeT jEnd = getNotationEndTime(*j);
+
+ // don't consider notes that end after i ends or before i begins
+
+ if (jEnd > iEnd || jEnd < iStart) continue;
+
+ if (matchPitch) {
+ if (!(*j)->get<Int>(PITCH, jp) || (jp != ip)) continue;
+ }
+
+ if (allowOverlap || (jEnd == iStart)) return j;
+ }
+}
+
+
+Segment::iterator
+SegmentNotationHelper::findContiguousNext(iterator el)
+{
+ std::string elType = (*el)->getType(),
+ reject, accept;
+
+ if (elType == Note::EventType) {
+ accept = Note::EventType;
+ reject = Note::EventRestType;
+ } else if (elType == Note::EventRestType) {
+ accept = Note::EventRestType;
+ reject = Note::EventType;
+ } else {
+ accept = elType;
+ reject = "";
+ }
+
+ bool success = false;
+
+ iterator i = ++el;
+
+ for(; isBeforeEndMarker(i); ++i) {
+ std::string iType = (*i)->getType();
+
+ if (iType == reject) {
+ success = false;
+ break;
+ }
+ if (iType == accept) {
+ success = true;
+ break;
+ }
+ }
+
+ if (success) return i;
+ else return end();
+
+}
+
+Segment::iterator
+SegmentNotationHelper::findContiguousPrevious(iterator el)
+{
+ if (el == begin()) return end();
+
+ std::string elType = (*el)->getType(),
+ reject, accept;
+
+ if (elType == Note::EventType) {
+ accept = Note::EventType;
+ reject = Note::EventRestType;
+ } else if (elType == Note::EventRestType) {
+ accept = Note::EventRestType;
+ reject = Note::EventType;
+ } else {
+ accept = elType;
+ reject = "";
+ }
+
+ bool success = false;
+
+ iterator i = --el;
+
+ while (true) {
+ std::string iType = (*i)->getType();
+
+ if (iType == reject) {
+ success = false;
+ break;
+ }
+ if (iType == accept) {
+ success = true;
+ break;
+ }
+ if (i == begin()) break;
+ --i;
+ }
+
+ if (success) return i;
+ else return end();
+}
+
+
+bool
+SegmentNotationHelper::noteIsInChord(Event *note)
+{
+ iterator i = segment().findSingle(note);
+ timeT t = note->getNotationAbsoluteTime();
+
+ for (iterator j = i; j != end(); ++j) { // not isBeforeEndMarker, unnecessary here
+ if (j == i) continue;
+ if ((*j)->isa(Note::EventType)) {
+ timeT tj = (*j)->getNotationAbsoluteTime();
+ if (tj == t) return true;
+ else if (tj > t) break;
+ }
+ }
+
+ for (iterator j = i; ; ) {
+ if (j == begin()) break;
+ --j;
+ if ((*j)->isa(Note::EventType)) {
+ timeT tj = (*j)->getNotationAbsoluteTime();
+ if (tj == t) return true;
+ else if (tj < t) break;
+ }
+ }
+
+ return false;
+
+/*!!!
+ iterator first, second;
+ segment().getTimeSlice(note->getAbsoluteTime(), first, second);
+
+ int noteCount = 0;
+ for (iterator i = first; i != second; ++i) {
+ if ((*i)->isa(Note::EventType)) ++noteCount;
+ }
+
+ return noteCount > 1;
+*/
+}
+
+
+//!!! This doesn't appear to be used any more and may well not work.
+// Ties are calculated in several different places, and it's odd that
+// we don't have a decent API for them
+Segment::iterator
+SegmentNotationHelper::getNoteTiedWith(Event *note, bool forwards)
+{
+ bool tied = false;
+
+ if (!note->get<Bool>(forwards ?
+ BaseProperties::TIED_FORWARD :
+ BaseProperties::TIED_BACKWARD, tied) || !tied) {
+ return end();
+ }
+
+ timeT myTime = note->getAbsoluteTime();
+ timeT myDuration = note->getDuration();
+ int myPitch = note->get<Int>(BaseProperties::PITCH);
+
+ iterator i = segment().findSingle(note);
+ if (!isBeforeEndMarker(i)) return end();
+
+ for (;;) {
+ i = forwards ? findContiguousNext(i) : findContiguousPrevious(i);
+
+ if (!isBeforeEndMarker(i)) return end();
+ if ((*i)->getAbsoluteTime() == myTime) continue;
+
+ if (forwards && ((*i)->getAbsoluteTime() != myTime + myDuration)) {
+ return end();
+ }
+ if (!forwards &&
+ (((*i)->getAbsoluteTime() + (*i)->getDuration()) != myTime)) {
+ return end();
+ }
+
+ if (!(*i)->get<Bool>(forwards ?
+ BaseProperties::TIED_BACKWARD :
+ BaseProperties::TIED_FORWARD, tied) || !tied) {
+ continue;
+ }
+
+ if ((*i)->get<Int>(BaseProperties::PITCH) == myPitch) return i;
+ }
+
+ return end();
+}
+
+
+bool
+SegmentNotationHelper::collapseRestsIfValid(Event* e, bool& collapseForward)
+{
+ iterator elPos = segment().findSingle(e);
+ if (elPos == end()) return false;
+
+ timeT myDuration = (*elPos)->getNotationDuration();
+
+ // findContiguousNext won't return an iterator beyond the end marker
+ iterator nextEvent = findContiguousNext(elPos),
+ previousEvent = findContiguousPrevious(elPos);
+
+ // Remark: findContiguousXXX is inadequate for notes, we would
+ // need to check adjacency using e.g. getNextAdjacentNote if this
+ // method were to work for notes as well as rests.
+
+ // collapse to right if (a) not at end...
+ if (nextEvent != end() &&
+ // ...(b) rests can be merged to a single, valid unit
+ isCollapseValid((*nextEvent)->getNotationDuration(), myDuration) &&
+ // ...(c) event is in same bar (no cross-bar collapsing)
+ (*nextEvent)->getAbsoluteTime() <
+ segment().getBarEndForTime(e->getAbsoluteTime())) {
+
+ // collapse right is OK; collapse e with nextEvent
+ Event *e1(new Event(*e, e->getAbsoluteTime(),
+ e->getDuration() + (*nextEvent)->getDuration()));
+
+ collapseForward = true;
+ erase(elPos);
+ erase(nextEvent);
+ insert(e1);
+ return true;
+ }
+
+ // logic is exactly backwards from collapse to right logic above
+ if (previousEvent != end() &&
+ isCollapseValid((*previousEvent)->getNotationDuration(), myDuration) &&
+ (*previousEvent)->getAbsoluteTime() >
+ segment().getBarStartForTime(e->getAbsoluteTime())) {
+
+ // collapse left is OK; collapse e with previousEvent
+ Event *e1(new Event(**previousEvent,
+ (*previousEvent)->getAbsoluteTime(),
+ e->getDuration() +
+ (*previousEvent)->getDuration()));
+
+ collapseForward = false;
+ erase(elPos);
+ erase(previousEvent);
+ insert(e1);
+ return true;
+ }
+
+ return false;
+}
+
+
+bool
+SegmentNotationHelper::isCollapseValid(timeT a, timeT b)
+{
+ return (isViable(a + b));
+}
+
+
+bool
+SegmentNotationHelper::isSplitValid(timeT a, timeT b)
+{
+ return (isViable(a) && isViable(b));
+}
+
+Segment::iterator
+SegmentNotationHelper::splitIntoTie(iterator &i, timeT baseDuration)
+{
+ if (i == end()) return end();
+ iterator i2;
+ segment().getTimeSlice((*i)->getAbsoluteTime(), i, i2);
+ return splitIntoTie(i, i2, baseDuration);
+}
+
+Segment::iterator
+SegmentNotationHelper::splitIntoTie(iterator &from, iterator to,
+ timeT baseDuration)
+{
+ // so long as we do the quantization checks for validity before
+ // calling this method, we should be fine splitting precise times
+ // in this method. only problem is deciding not to split something
+ // if its duration is very close to requested duration, but that's
+ // probably not a task for this function
+
+ timeT eventDuration = (*from)->getDuration();
+ timeT baseTime = (*from)->getAbsoluteTime();
+
+ long firstGroupId = -1;
+ (*from)->get<Int>(BEAMED_GROUP_ID, firstGroupId);
+
+ long nextGroupId = -1;
+ iterator ni(to);
+
+ if (segment().isBeforeEndMarker(ni) && segment().isBeforeEndMarker(++ni)) {
+ (*ni)->get<Int>(BEAMED_GROUP_ID, nextGroupId);
+ }
+
+ list<Event *> toInsert;
+ list<iterator> toErase;
+
+ // Split all the note and rest events in range [from, to[
+ //
+ for (iterator i = from; i != to; ++i) {
+
+ if (!(*i)->isa(Note::EventType) &&
+ !(*i)->isa(Note::EventRestType)) continue;
+
+ if ((*i)->getAbsoluteTime() != baseTime) {
+ // no way to really cope with an error, because at this
+ // point we may already have splut some events. Best to
+ // skip this event
+ cerr << "WARNING: SegmentNotationHelper::splitIntoTie(): (*i)->getAbsoluteTime() != baseTime (" << (*i)->getAbsoluteTime() << " vs " << baseTime << "), ignoring this event\n";
+ continue;
+ }
+
+ if ((*i)->getDuration() != eventDuration) {
+ if ((*i)->getDuration() == 0) continue;
+ cerr << "WARNING: SegmentNotationHelper::splitIntoTie(): (*i)->getDuration() != eventDuration (" << (*i)->getDuration() << " vs " << eventDuration << "), changing eventDuration to match\n";
+ eventDuration = (*i)->getDuration();
+ }
+
+ if (baseDuration >= eventDuration) {
+// cerr << "SegmentNotationHelper::splitIntoTie() : baseDuration >= eventDuration, ignoring event\n";
+ continue;
+ }
+
+ std::pair<Event *, Event *> split =
+ splitPreservingPerformanceTimes(*i, baseDuration);
+
+ Event *eva = split.first;
+ Event *evb = split.second;
+
+ if (!eva || !evb) {
+ cerr << "WARNING: SegmentNotationHelper::splitIntoTie(): No valid split for event of duration " << eventDuration << " at " << baseTime << " (baseDuration " << baseDuration << "), ignoring this event\n";
+ continue;
+ }
+
+ // we only want to tie Note events:
+
+ if (eva->isa(Note::EventType)) {
+
+ // if the first event was already tied forward, the
+ // second one will now be marked as tied forward
+ // (which is good). set up the relationship between
+ // the original (now shorter) event and the new one.
+
+ evb->set<Bool>(TIED_BACKWARD, true);
+ eva->set<Bool>(TIED_FORWARD, true);
+ }
+
+ // we may also need to change some group information: if
+ // the first event is in a beamed group but the event
+ // following the insertion is not or is in a different
+ // group, then the new second event should not be in a
+ // group. otherwise, it should inherit the grouping info
+ // from the first event (as it already does, because it
+ // was created using the copy constructor).
+
+ // (this doesn't apply to tupled groups, which we want
+ // to persist wherever possible.)
+
+ if (firstGroupId != -1 &&
+ nextGroupId != firstGroupId &&
+ !evb->has(BEAMED_GROUP_TUPLET_BASE)) {
+ evb->unset(BEAMED_GROUP_ID);
+ evb->unset(BEAMED_GROUP_TYPE);
+ }
+
+ toInsert.push_back(eva);
+ toInsert.push_back(evb);
+ toErase.push_back(i);
+ }
+
+ // erase the old events
+ for (list<iterator>::iterator i = toErase.begin();
+ i != toErase.end(); ++i) {
+ segment().erase(*i);
+ }
+
+ from = end();
+ iterator last = end();
+
+ // now insert the new events
+ for (list<Event *>::iterator i = toInsert.begin();
+ i != toInsert.end(); ++i) {
+ last = insert(*i);
+ if (from == end()) from = last;
+ }
+
+ return last;
+}
+
+bool
+SegmentNotationHelper::isViable(timeT duration, int dots)
+{
+ bool viable;
+
+/*!!!
+ duration = basicQuantizer().quantizeDuration(duration);
+
+ if (dots >= 0) {
+ viable = (duration == Quantizer(Quantizer::RawEventData,
+ Quantizer::DefaultTarget,
+ Quantizer::NoteQuantize, 1, dots).
+ quantizeDuration(duration));
+ } else {
+ viable = (duration == notationQuantizer().quantizeDuration(duration));
+ }
+*/
+
+ //!!! what to do about this?
+
+ timeT nearestDuration =
+ Note::getNearestNote(duration, dots >= 0 ? dots : 2).getDuration();
+
+// std::cerr << "SegmentNotationHelper::isViable: nearestDuration is " << nearestDuration << ", duration is " << duration << std::endl;
+ viable = (nearestDuration == duration);
+
+ return viable;
+}
+
+
+void
+SegmentNotationHelper::makeRestViable(iterator i)
+{
+ timeT absTime = (*i)->getAbsoluteTime();
+ timeT duration = (*i)->getDuration();
+ erase(i);
+ segment().fillWithRests(absTime, absTime + duration);
+}
+
+
+void
+SegmentNotationHelper::makeNotesViable(iterator from, iterator to,
+ bool splitAtBars)
+{
+ // We don't use quantized values here; we want a precise division.
+ // Even if it doesn't look precise on the score (because the score
+ // is quantized), we want any playback to produce exactly the same
+ // duration of note as was originally recorded
+
+ std::vector<Event *> toInsert;
+
+ for (Segment::iterator i = from, j = i;
+ segment().isBeforeEndMarker(i) && i != to; i = j) {
+
+ ++j;
+
+ if (!(*i)->isa(Note::EventType) && !(*i)->isa(Note::EventRestType)) {
+ continue;
+ }
+
+ if ((*i)->has(BEAMED_GROUP_TUPLET_BASE)) {
+ continue;
+ }
+
+ DurationList dl;
+
+ // Behaviour differs from TimeSignature::getDurationListForInterval
+
+ timeT acc = 0;
+ timeT required = (*i)->getNotationDuration();
+
+ while (acc < required) {
+ timeT remaining = required - acc;
+ if (splitAtBars) {
+ timeT thisNoteStart = (*i)->getNotationAbsoluteTime() + acc;
+ timeT toNextBar =
+ segment().getBarEndForTime(thisNoteStart) - thisNoteStart;
+ if (toNextBar > 0 && remaining > toNextBar) remaining = toNextBar;
+ }
+ timeT component = Note::getNearestNote(remaining).getDuration();
+ if (component > (required - acc)) dl.push_back(required - acc);
+ else dl.push_back(component);
+ acc += component;
+ }
+
+ if (dl.size() < 2) {
+ // event is already of the correct duration
+ continue;
+ }
+
+ acc = (*i)->getNotationAbsoluteTime();
+ Event *e = new Event(*(*i));
+
+ bool lastTiedForward = false;
+ e->get<Bool>(TIED_FORWARD, lastTiedForward);
+
+ e->set<Bool>(TIED_FORWARD, true);
+ erase(i);
+
+ for (DurationList::iterator dli = dl.begin(); dli != dl.end(); ++dli) {
+
+ DurationList::iterator dlj(dli);
+ if (++dlj == dl.end()) {
+ // end of duration list
+ if (!lastTiedForward) e->unset(TIED_FORWARD);
+ toInsert.push_back(e);
+ e = 0;
+ break;
+ }
+
+ std::pair<Event *, Event *> splits =
+ splitPreservingPerformanceTimes(e, *dli);
+
+ if (!splits.first || !splits.second) {
+ cerr << "WARNING: SegmentNotationHelper::makeNoteViable(): No valid split for event of duration " << e->getDuration() << " at " << e->getAbsoluteTime() << " (split duration " << *dli << "), ignoring remainder\n";
+ cerr << "WARNING: This is probably a bug; fix required" << std::endl;
+ toInsert.push_back(e);
+ e = 0;
+ break;
+ }
+
+ toInsert.push_back(splits.first);
+ delete e;
+ e = splits.second;
+
+ acc += *dli;
+
+ e->set<Bool>(TIED_BACKWARD, true);
+ }
+
+ delete e;
+ }
+
+ for (std::vector<Event *>::iterator ei = toInsert.begin();
+ ei != toInsert.end(); ++ei) {
+ insert(*ei);
+ }
+}
+
+void
+SegmentNotationHelper::makeNotesViable(timeT startTime, timeT endTime,
+ bool splitAtBars)
+{
+ Segment::iterator from = segment().findTime(startTime);
+ Segment::iterator to = segment().findTime(endTime);
+
+ makeNotesViable(from, to, splitAtBars);
+}
+
+
+Segment::iterator
+SegmentNotationHelper::insertNote(timeT absoluteTime, Note note, int pitch,
+ Accidental explicitAccidental)
+{
+ Event *e = new Event(Note::EventType, absoluteTime, note.getDuration());
+ e->set<Int>(PITCH, pitch);
+ e->set<String>(ACCIDENTAL, explicitAccidental);
+ iterator i = insertNote(e);
+ delete e;
+ return i;
+}
+
+Segment::iterator
+SegmentNotationHelper::insertNote(Event *modelEvent)
+{
+ timeT absoluteTime = modelEvent->getAbsoluteTime();
+ iterator i = segment().findNearestTime(absoluteTime);
+
+ // If our insertion time doesn't match up precisely with any
+ // existing event, and if we're inserting over a rest, split the
+ // rest at the insertion time first.
+
+ if (i != end() &&
+ (*i)->getAbsoluteTime() < absoluteTime &&
+ (*i)->getAbsoluteTime() + (*i)->getDuration() > absoluteTime &&
+ (*i)->isa(Note::EventRestType)) {
+ i = splitIntoTie(i, absoluteTime - (*i)->getAbsoluteTime());
+ }
+
+ timeT duration = modelEvent->getDuration();
+
+ if (i != end() && (*i)->has(BEAMED_GROUP_TUPLET_BASE)) {
+ duration = duration * (*i)->get<Int>(BEAMED_GROUP_TUPLED_COUNT) /
+ (*i)->get<Int>(BEAMED_GROUP_UNTUPLED_COUNT);
+ }
+
+ //!!! Deal with end-of-bar issues!
+
+ return insertSomething(i, duration, modelEvent, false);
+}
+
+
+Segment::iterator
+SegmentNotationHelper::insertRest(timeT absoluteTime, Note note)
+{
+ iterator i, j;
+ segment().getTimeSlice(absoluteTime, i, j);
+
+ //!!! Deal with end-of-bar issues!
+
+ timeT duration(note.getDuration());
+
+ if (i != end() && (*i)->has(BEAMED_GROUP_TUPLET_BASE)) {
+ duration = duration * (*i)->get<Int>(BEAMED_GROUP_TUPLED_COUNT) /
+ (*i)->get<Int>(BEAMED_GROUP_UNTUPLED_COUNT);
+ }
+
+ Event *modelEvent = new Event(Note::EventRestType, absoluteTime,
+ note.getDuration(),
+ Note::EventRestSubOrdering);
+
+ i = insertSomething(i, duration, modelEvent, false);
+ delete modelEvent;
+ return i;
+}
+
+
+// return an iterator pointing to the "same" event as the original
+// iterator (which will have been replaced)
+
+Segment::iterator
+SegmentNotationHelper::collapseRestsForInsert(iterator i,
+ timeT desiredDuration)
+{
+ // collapse at most once, then recurse
+
+ if (!segment().isBeforeEndMarker(i) ||
+ !(*i)->isa(Note::EventRestType)) return i;
+
+ timeT d = (*i)->getDuration();
+ iterator j = findContiguousNext(i); // won't return itr after end marker
+ if (d >= desiredDuration || j == end()) return i;
+
+ Event *e(new Event(**i, (*i)->getAbsoluteTime(), d + (*j)->getDuration()));
+ iterator ii(insert(e));
+ erase(i);
+ erase(j);
+
+ return collapseRestsForInsert(ii, desiredDuration);
+}
+
+
+Segment::iterator
+SegmentNotationHelper::insertSomething(iterator i, int duration,
+ Event *modelEvent, bool tiedBack)
+{
+ // Rules:
+ //
+ // 1. If we hit a bar line in the course of the intended inserted
+ // note, we should split the note rather than make the bar the
+ // wrong length. (Not implemented yet)
+ //
+ // 2. If there's nothing at the insertion point but rests (and
+ // enough of them to cover the entire duration of the new note),
+ // then we should insert the new note/rest literally and remove
+ // rests as appropriate. Rests should never prevent us from
+ // inserting what the user asked for.
+ //
+ // 3. If there are notes in the way of an inserted note, however,
+ // we split whenever "reasonable" and truncate our user's note if
+ // not reasonable to split. We can't always give users the Right
+ // Thing here, so to hell with them.
+
+ while (i != end() &&
+ ((*i)->getDuration() == 0 ||
+ !((*i)->isa(Note::EventType) || (*i)->isa(Note::EventRestType))))
+ ++i;
+
+ if (i == end()) {
+ return insertSingleSomething(i, duration, modelEvent, tiedBack);
+ }
+
+ // If there's a rest at the insertion position, merge it with any
+ // following rests, if available, until we have at least the
+ // duration of the new note.
+ i = collapseRestsForInsert(i, duration);
+
+ timeT existingDuration = (*i)->getNotationDuration();
+
+// cerr << "SegmentNotationHelper::insertSomething: asked to insert duration " << duration
+// << " over event of duration " << existingDuration << ":" << endl;
+ (*i)->dump(cerr);
+
+ if (duration == existingDuration) {
+
+ // 1. If the new note or rest is the same length as an
+ // existing note or rest at that position, chord the existing
+ // note or delete the existing rest and insert.
+
+// cerr << "Durations match; doing simple insert" << endl;
+
+ return insertSingleSomething(i, duration, modelEvent, tiedBack);
+
+ } else if (duration < existingDuration) {
+
+ // 2. If the new note or rest is shorter than an existing one,
+ // split the existing one and chord or replace the first part.
+
+ if ((*i)->isa(Note::EventType)) {
+
+ if (!isSplitValid(duration, existingDuration - duration)) {
+
+// cerr << "Bad split, coercing new note" << endl;
+
+ // not reasonable to split existing note, so force new one
+ // to same duration instead
+ duration = (*i)->getNotationDuration();
+
+ } else {
+// cerr << "Good split, splitting old event" << endl;
+ splitIntoTie(i, duration);
+ }
+ } else if ((*i)->isa(Note::EventRestType)) {
+
+// cerr << "Found rest, splitting" << endl;
+ iterator last = splitIntoTie(i, duration);
+
+ // Recover viability for the second half of any split rest
+ // (we duck out of this if we find we're in a tupleted zone)
+
+ if (last != end() && !(*last)->has(BEAMED_GROUP_TUPLET_BASE)) {
+ makeRestViable(last);
+ }
+ }
+
+ return insertSingleSomething(i, duration, modelEvent, tiedBack);
+
+ } else { // duration > existingDuration
+
+ // 3. If the new note is longer, split the new note so that
+ // the first part is the same duration as the existing note or
+ // rest, and recurse to step 1 with both the first and the
+ // second part in turn.
+
+ bool needToSplit = true;
+
+ // special case: existing event is a rest, and it's at the end
+ // of the segment
+
+ if ((*i)->isa(Note::EventRestType)) {
+ iterator j;
+ for (j = i; j != end(); ++j) {
+ if ((*j)->isa(Note::EventType)) break;
+ }
+ if (j == end()) needToSplit = false;
+ }
+
+ if (needToSplit) {
+
+ //!!! This is not quite right for rests. Because they
+ //replace (rather than chording with) any events already
+ //present, they don't need to be split in the case where
+ //their duration spans several note-events. Worry about
+ //that later, I guess. We're actually getting enough
+ //is-note/is-rest decisions here to make it possibly worth
+ //splitting this method into note and rest versions again
+
+// cerr << "Need to split new note" << endl;
+
+ i = insertSingleSomething
+ (i, existingDuration, modelEvent, tiedBack);
+
+ if (modelEvent->isa(Note::EventType))
+ (*i)->set<Bool>(TIED_FORWARD, true);
+
+ timeT insertedTime = (*i)->getAbsoluteTime();
+ while (i != end() &&
+ ((*i)->getNotationAbsoluteTime() <
+ (insertedTime + existingDuration))) ++i;
+
+ return insertSomething
+ (i, duration - existingDuration, modelEvent, true);
+
+ } else {
+// cerr << "No need to split new note" << endl;
+ return insertSingleSomething(i, duration, modelEvent, tiedBack);
+ }
+ }
+}
+
+Segment::iterator
+SegmentNotationHelper::insertSingleSomething(iterator i, int duration,
+ Event *modelEvent, bool tiedBack)
+{
+ timeT time;
+ timeT notationTime;
+ bool eraseI = false;
+ timeT effectiveDuration(duration);
+
+ if (i == end()) {
+ time = segment().getEndTime();
+ notationTime = time;
+ } else {
+ time = (*i)->getAbsoluteTime();
+ notationTime = (*i)->getNotationAbsoluteTime();
+ if (modelEvent->isa(Note::EventRestType) ||
+ (*i)->isa(Note::EventRestType)) eraseI = true;
+ }
+
+ Event *e = new Event(*modelEvent, time, effectiveDuration,
+ modelEvent->getSubOrdering(), notationTime);
+
+ // If the model event already has group info, I guess we'd better use it!
+ if (!e->has(BEAMED_GROUP_ID)) {
+ setInsertedNoteGroup(e, i);
+ }
+
+ if (tiedBack && e->isa(Note::EventType)) {
+ e->set<Bool>(TIED_BACKWARD, true);
+ }
+
+ if (eraseI) {
+ // erase i and all subsequent events with the same type and
+ // absolute time
+ timeT time((*i)->getAbsoluteTime());
+ std::string type((*i)->getType());
+ iterator j(i);
+ while (j != end() && (*j)->getAbsoluteTime() == time) {
+ ++j;
+ if ((*i)->isa(type)) erase(i);
+ i = j;
+ }
+ }
+
+ return insert(e);
+}
+
+void
+SegmentNotationHelper::setInsertedNoteGroup(Event *e, iterator i)
+{
+ // Formerly this was posited on the note being inserted between
+ // two notes in the same group, but that's quite wrong-headed: we
+ // want to place it in the same group as any existing note at the
+ // same time, and otherwise leave it alone.
+
+ e->unset(BEAMED_GROUP_ID);
+ e->unset(BEAMED_GROUP_TYPE);
+
+ while (isBeforeEndMarker(i) &&
+ (!((*i)->isa(Note::EventRestType)) ||
+ (*i)->has(BEAMED_GROUP_TUPLET_BASE)) &&
+ (*i)->getNotationAbsoluteTime() == e->getAbsoluteTime()) {
+
+ if ((*i)->has(BEAMED_GROUP_ID)) {
+
+ string type = (*i)->get<String>(BEAMED_GROUP_TYPE);
+ if (type != GROUP_TYPE_TUPLED && !(*i)->isa(Note::EventType)) {
+ if ((*i)->isa(Note::EventRestType)) return;
+ else {
+ ++i;
+ continue;
+ }
+ }
+
+ e->set<Int>(BEAMED_GROUP_ID, (*i)->get<Int>(BEAMED_GROUP_ID));
+ e->set<String>(BEAMED_GROUP_TYPE, type);
+
+ if ((*i)->has(BEAMED_GROUP_TUPLET_BASE)) {
+
+ e->set<Int>(BEAMED_GROUP_TUPLET_BASE,
+ (*i)->get<Int>(BEAMED_GROUP_TUPLET_BASE));
+ e->set<Int>(BEAMED_GROUP_TUPLED_COUNT,
+ (*i)->get<Int>(BEAMED_GROUP_TUPLED_COUNT));
+ e->set<Int>(BEAMED_GROUP_UNTUPLED_COUNT,
+ (*i)->get<Int>(BEAMED_GROUP_UNTUPLED_COUNT));
+ }
+
+ return;
+ }
+
+ ++i;
+ }
+}
+
+
+Segment::iterator
+SegmentNotationHelper::insertClef(timeT absoluteTime, Clef clef)
+{
+ return insert(clef.getAsEvent(absoluteTime));
+}
+
+
+Segment::iterator
+SegmentNotationHelper::insertKey(timeT absoluteTime, Key key)
+{
+ return insert(key.getAsEvent(absoluteTime));
+}
+
+
+Segment::iterator
+SegmentNotationHelper::insertText(timeT absoluteTime, Text text)
+{
+ return insert(text.getAsEvent(absoluteTime));
+}
+
+
+void
+SegmentNotationHelper::deleteNote(Event *e, bool collapseRest)
+{
+ iterator i = segment().findSingle(e);
+
+ if (i == end()) return;
+
+ if ((*i)->has(TIED_BACKWARD) && (*i)->get<Bool>(TIED_BACKWARD)) {
+ iterator j = getPreviousAdjacentNote(i, segment().getStartTime(),
+ true, false);
+ if (j != end()) {
+ (*j)->unset(TIED_FORWARD); // don't even check if it has it set
+ }
+ }
+
+ if ((*i)->has(TIED_FORWARD) && (*i)->get<Bool>(TIED_FORWARD)) {
+ iterator j = getNextAdjacentNote(i, true, false);
+ if (j != end()) {
+ (*j)->unset(TIED_BACKWARD); // don't even check if it has it set
+ }
+ }
+
+ // If any notes start at the same time as this one but end first,
+ // or start after this one starts but before it ends, then we go
+ // for the delete-event-and-normalize-rests option. Otherwise
+ // (the notationally simpler case) we go for the
+ // replace-note-by-rest option. We still lose in the case where
+ // another note starts before this one, overlaps it, but then also
+ // ends before it does -- but I think we can live with that.
+
+ iterator j = i;
+ timeT endTime = (*i)->getAbsoluteTime() + (*i)->getDuration();
+
+ while (j != end() && (*j)->getAbsoluteTime() < endTime) {
+
+ bool complicatedOverlap = false;
+
+ if ((*j)->getAbsoluteTime() != (*i)->getAbsoluteTime()) {
+ complicatedOverlap = true;
+ } else if (((*j)->getAbsoluteTime() + (*j)->getDuration()) < endTime) {
+ complicatedOverlap = true;
+ }
+
+ if (complicatedOverlap) {
+ timeT startTime = (*i)->getAbsoluteTime();
+ segment().erase(i);
+ segment().normalizeRests(startTime, endTime);
+ return;
+ }
+
+ ++j;
+ }
+
+ if (noteIsInChord(e)) {
+
+ erase(i);
+
+ } else {
+
+ // replace with a rest
+ Event *newRest = new Event(Note::EventRestType,
+ e->getAbsoluteTime(), e->getDuration(),
+ Note::EventRestSubOrdering);
+ insert(newRest);
+ erase(i);
+
+ // collapse the new rest
+ if (collapseRest) {
+ bool dummy;
+ collapseRestsIfValid(newRest, dummy);
+ }
+
+ }
+}
+
+bool
+SegmentNotationHelper::deleteRest(Event *e)
+{
+ bool collapseForward;
+ return collapseRestsIfValid(e, collapseForward);
+}
+
+bool
+SegmentNotationHelper::deleteEvent(Event *e, bool collapseRest)
+{
+ bool res = true;
+
+ if (e->isa(Note::EventType)) deleteNote(e, collapseRest);
+ else if (e->isa(Note::EventRestType)) res = deleteRest(e);
+ else {
+ // just plain delete
+ iterator i = segment().findSingle(e);
+ if (i != end()) erase(i);
+ }
+
+ return res;
+}
+
+
+bool
+SegmentNotationHelper::hasEffectiveDuration(iterator i)
+{
+ bool hasDuration = ((*i)->getDuration() > 0);
+
+ if ((*i)->isa(Note::EventType)) {
+ iterator i0(i);
+ if (++i0 != end() &&
+ (*i0)->isa(Note::EventType) &&
+ (*i0)->getNotationAbsoluteTime() ==
+ (*i)->getNotationAbsoluteTime()) {
+ // we're in a chord or something
+ hasDuration = false;
+ }
+ }
+
+ return hasDuration;
+}
+
+
+void
+SegmentNotationHelper::makeBeamedGroup(timeT from, timeT to, string type)
+{
+ makeBeamedGroupAux(segment().findTime(from), segment().findTime(to),
+ type, false);
+}
+
+void
+SegmentNotationHelper::makeBeamedGroup(iterator from, iterator to, string type)
+{
+ makeBeamedGroupAux
+ ((from == end()) ? from : segment().findTime((*from)->getAbsoluteTime()),
+ (to == end()) ? to : segment().findTime((*to )->getAbsoluteTime()),
+ type, false);
+}
+
+void
+SegmentNotationHelper::makeBeamedGroupExact(iterator from, iterator to, string type)
+{
+ makeBeamedGroupAux(from, to, type, true);
+}
+
+void
+SegmentNotationHelper::makeBeamedGroupAux(iterator from, iterator to,
+ string type, bool groupGraces)
+{
+// cerr << "SegmentNotationHelper::makeBeamedGroupAux: type " << type << endl;
+// if (from == to) cerr << "from == to" <<endl;
+
+ int groupId = segment().getNextId();
+ bool beamedSomething = false;
+
+ for (iterator i = from; i != to; ++i) {
+// std::cerr << "looking at " << (*i)->getType() << " at " << (*i)->getAbsoluteTime() << std::endl;
+
+ // don't permit ourselves to change the type of an
+ // already-grouped event here
+ if ((*i)->has(BEAMED_GROUP_TYPE) &&
+ (*i)->get<String>(BEAMED_GROUP_TYPE) != GROUP_TYPE_BEAMED) {
+ continue;
+ }
+
+ if (!groupGraces) {
+ if ((*i)->has(IS_GRACE_NOTE) &&
+ (*i)->get<Bool>(IS_GRACE_NOTE)) {
+ continue;
+ }
+ }
+
+ // don't beam anything longer than a quaver unless it's
+ // between beamed quavers -- in which case marking it as
+ // beamed will ensure that it gets re-stemmed appropriately
+
+ if ((*i)->isa(Note::EventType) &&
+ (*i)->getNotationDuration() >= Note(Note::Crotchet).getDuration()) {
+// std::cerr << "too long" <<std::endl;
+ if (!beamedSomething) continue;
+ iterator j = i;
+ bool somethingLeft = false;
+ while (++j != to) {
+ if ((*j)->getType() == Note::EventType &&
+ (*j)->getNotationAbsoluteTime() > (*i)->getNotationAbsoluteTime() &&
+ (*j)->getNotationDuration() < Note(Note::Crotchet).getDuration()) {
+ somethingLeft = true;
+ break;
+ }
+ }
+ if (!somethingLeft) continue;
+ }
+
+// std::cerr << "beaming it" <<std::endl;
+ (*i)->set<Int>(BEAMED_GROUP_ID, groupId);
+ (*i)->set<String>(BEAMED_GROUP_TYPE, type);
+ }
+}
+
+void
+SegmentNotationHelper::makeTupletGroup(timeT t, int untupled, int tupled,
+ timeT unit)
+{
+ int groupId = segment().getNextId();
+
+ cerr << "SegmentNotationHelper::makeTupletGroup: time " << t << ", unit "<< unit << ", params " << untupled << "/" << tupled << ", id " << groupId << endl;
+
+ list<Event *> toInsert;
+ list<iterator> toErase;
+ timeT notationTime = t;
+ timeT fillWithRestsTo = t;
+ bool haveStartNotationTime = false;
+
+ for (iterator i = segment().findTime(t); i != end(); ++i) {
+
+ if (!haveStartNotationTime) {
+ notationTime = (*i)->getNotationAbsoluteTime();
+ fillWithRestsTo = notationTime + (untupled * unit);
+ haveStartNotationTime = true;
+ }
+
+ if ((*i)->getNotationAbsoluteTime() >=
+ notationTime + (untupled * unit)) break;
+
+ timeT offset = (*i)->getNotationAbsoluteTime() - notationTime;
+ timeT duration = (*i)->getNotationDuration();
+
+ if ((*i)->isa(Note::EventRestType) &&
+ ((offset + duration) > (untupled * unit))) {
+ fillWithRestsTo = std::max(fillWithRestsTo,
+ notationTime + offset + duration);
+ duration = (untupled * unit) - offset;
+ if (duration <= 0) {
+ toErase.push_back(i);
+ continue;
+ }
+ }
+
+ Event *e = new Event(**i,
+ notationTime + (offset * tupled / untupled),
+ duration * tupled / untupled);
+
+ cerr << "SegmentNotationHelper::makeTupletGroup: made event at time " << e->getAbsoluteTime() << ", duration " << e->getDuration() << endl;
+
+ e->set<Int>(BEAMED_GROUP_ID, groupId);
+ e->set<String>(BEAMED_GROUP_TYPE, GROUP_TYPE_TUPLED);
+
+ e->set<Int>(BEAMED_GROUP_TUPLET_BASE, unit);
+ e->set<Int>(BEAMED_GROUP_TUPLED_COUNT, tupled);
+ e->set<Int>(BEAMED_GROUP_UNTUPLED_COUNT, untupled);
+
+ toInsert.push_back(e);
+ toErase.push_back(i);
+ }
+
+ for (list<iterator>::iterator i = toErase.begin();
+ i != toErase.end(); ++i) {
+ segment().erase(*i);
+ }
+
+ for (list<Event *>::iterator i = toInsert.begin();
+ i != toInsert.end(); ++i) {
+ segment().insert(*i);
+ }
+
+ if (haveStartNotationTime) {
+ segment().fillWithRests(notationTime + (tupled * unit),
+ fillWithRestsTo);
+ }
+}
+
+
+
+
+void
+SegmentNotationHelper::unbeam(timeT from, timeT to)
+{
+ unbeamAux(segment().findTime(from), segment().findTime(to));
+}
+
+void
+SegmentNotationHelper::unbeam(iterator from, iterator to)
+{
+ unbeamAux
+ ((from == end()) ? from : segment().findTime((*from)->getAbsoluteTime()),
+ (to == end()) ? to : segment().findTime((*to )->getAbsoluteTime()));
+}
+
+void
+SegmentNotationHelper::unbeamAux(iterator from, iterator to)
+{
+ for (iterator i = from; i != to; ++i) {
+ (*i)->unset(BEAMED_GROUP_ID);
+ (*i)->unset(BEAMED_GROUP_TYPE);
+ (*i)->clearNonPersistentProperties();
+ }
+}
+
+
+
+/*
+
+ Auto-beaming code derived from Rosegarden 2.1's ItemListAutoBeam
+ and ItemListAutoBeamSub in editor/src/ItemList.c.
+
+*/
+
+void
+SegmentNotationHelper::autoBeam(timeT from, timeT to, string type)
+{
+ /*
+ std::cerr << "autoBeam from " << from << " to " << to << " on segment start time " << segment().getStartTime() << ", end time " << segment().getEndTime() << ", end marker " << segment().getEndMarkerTime() << std::endl;
+ */
+
+ autoBeam(segment().findTime(from), segment().findTime(to), type);
+}
+
+void
+SegmentNotationHelper::autoBeam(iterator from, iterator to, string type)
+{
+ // This can only manage whole bars at a time, and it will split
+ // the from-to range out to encompass the whole bars in which they
+ // each occur
+
+ if (!segment().getComposition()) {
+ cerr << "WARNING: SegmentNotationHelper::autoBeam requires Segment be in a Composition" << endl;
+ return;
+ }
+
+ if (!segment().isBeforeEndMarker(from)) return;
+
+ Composition *comp = segment().getComposition();
+
+ int fromBar = comp->getBarNumber((*from)->getAbsoluteTime());
+ int toBar = comp->getBarNumber(segment().isBeforeEndMarker(to) ?
+ (*to)->getAbsoluteTime() :
+ segment().getEndMarkerTime());
+
+ for (int barNo = fromBar; barNo <= toBar; ++barNo) {
+
+ std::pair<timeT, timeT> barRange = comp->getBarRange(barNo);
+ iterator barStart = segment().findTime(barRange.first);
+ iterator barEnd = segment().findTime(barRange.second);
+
+ // Make sure we're examining the notes defined to be within
+ // the bar in notation terms rather than raw terms
+
+ while (barStart != segment().end() &&
+ (*barStart)->getNotationAbsoluteTime() < barRange.first) ++barStart;
+
+ iterator scooter = barStart;
+ if (barStart != segment().end()) {
+ while (scooter != segment().begin()) {
+ --scooter;
+ if ((*scooter)->getNotationAbsoluteTime() < barRange.first) break;
+ barStart = scooter;
+ }
+ }
+
+ while (barEnd != segment().end() &&
+ (*barEnd)->getNotationAbsoluteTime() < barRange.second) ++barEnd;
+
+ scooter = barEnd;
+ if (barEnd != segment().end()) {
+ while (scooter != segment().begin()) {
+ --scooter;
+ if ((*scooter)->getNotationAbsoluteTime() < barRange.second) break;
+ barEnd = scooter;
+ }
+ }
+
+ TimeSignature timeSig =
+ segment().getComposition()->getTimeSignatureAt(barRange.first);
+
+ autoBeamBar(barStart, barEnd, timeSig, type);
+ }
+}
+
+
+/*
+
+ Derived from (and no less mystifying than) Rosegarden 2.1's
+ ItemListAutoBeamSub in editor/src/ItemList.c.
+
+ "Today I want to celebrate "Montreal" by Autechre, because of
+ its sleep-disturbing aura, because it sounds like the sort of music
+ which would be going around in the gunman's head as he trains a laser
+ sight into your bedroom through the narrow gap in your curtains and
+ dances the little red dot around nervously on your wall."
+
+*/
+
+void
+SegmentNotationHelper::autoBeamBar(iterator from, iterator to,
+ TimeSignature tsig, string type)
+{
+ int num = tsig.getNumerator();
+ int denom = tsig.getDenominator();
+
+ timeT average;
+ timeT minimum = 0;
+
+ // If the denominator is 2 or 4, beam in twos (3/4, 6/2 etc).
+
+ if (denom == 2 || denom == 4) {
+
+ if (num % 3) {
+ average = Note(Note::Quaver).getDuration();
+ } else {
+ average = Note(Note::Semiquaver).getDuration();
+ minimum = average;
+ }
+
+ } else {
+
+ if (num == 6 && denom == 8) { // special hack for 6/8
+ average = 3 * Note(Note::Quaver).getDuration();
+
+ } else {
+ // find a divisor (at least 2) for the numerator
+ int n = 2;
+ while (num >= n && num % n != 0) ++n;
+ average = n * Note(Note::Semiquaver).getDuration();
+ }
+ }
+
+ if (minimum == 0) minimum = average / 2;
+ if (denom > 4) average /= 2;
+
+ autoBeamBar(from, to, average, minimum, average * 4, type);
+}
+
+
+void
+SegmentNotationHelper::autoBeamBar(iterator from, iterator to,
+ timeT average, timeT minimum,
+ timeT maximum, string type)
+{
+ timeT accumulator = 0;
+ timeT crotchet = Note(Note::Crotchet).getDuration();
+ timeT semiquaver = Note(Note::Semiquaver).getDuration();
+
+ iterator e = end();
+
+ for (iterator i = from; i != to && i != e; ++i) {
+
+ // only look at one note in each chord, and at rests
+ if (!hasEffectiveDuration(i)) continue;
+ timeT idur = (*i)->getNotationDuration();
+
+ if (accumulator % average == 0 && // "beamable duration" threshold
+ idur < crotchet) {
+
+ // This could be the start of a beamed group. We maintain
+ // two sorts of state as we scan along here: data about
+ // the best group we've found so far (beamDuration,
+ // prospective, k etc), and data about the items we're
+ // looking at (count, beamable, longerThanDemi etc) just
+ // in case we find a better candidate group before the
+ // eight-line conditional further down makes us give up
+ // the search, beam our best shot, and start again.
+
+ // I hope this is clear.
+
+ iterator k = end(); // best-so-far last item in group;
+ // end() indicates that we've found nothing
+
+ timeT tmin = minimum;
+ timeT count = 0;
+ timeT prospective = 0;
+ timeT beamDuration = 0;
+
+ int beamable = 0;
+ int longerThanDemi = 0;
+
+ for (iterator j = i; j != to; ++j) {
+
+ if (!hasEffectiveDuration(j)) continue;
+ timeT jdur = (*j)->getNotationDuration();
+
+ if ((*j)->isa(Note::EventType)) {
+ if (jdur < crotchet) ++beamable;
+ if (jdur >= semiquaver) ++longerThanDemi;
+ }
+
+ count += jdur;
+
+ if (count % tmin == 0) {
+
+ k = j;
+ beamDuration = count;
+ prospective = accumulator + count;
+
+ // found a group; now accept only double this
+ // group's length for a better one
+ tmin *= 2;
+ }
+
+ // Stop scanning and make the group if our scan has
+ // reached the maximum length of beamed group, we have
+ // more than 4 semis or quavers, we're at the end of
+ // our run, the next chord is longer than the current
+ // one, or there's a rest ahead. (We used to check
+ // that the rest had non-zero duration, but the new
+ // quantization regime should ensure that this doesn't
+ // happen unless we really are displaying completely
+ // unquantized data in which case anything goes.)
+
+ iterator jnext(j);
+
+ if ((count > maximum)
+ || (longerThanDemi > 4)
+ || (++jnext == to)
+ || ((*j )->isa(Note::EventType) &&
+ (*jnext)->isa(Note::EventType) &&
+ (*jnext)->getNotationDuration() > jdur)
+ || ((*jnext)->isa(Note::EventRestType))) {
+
+ if (k != end() && beamable >= 2) {
+
+ iterator knext(k);
+ ++knext;
+
+ makeBeamedGroup(i, knext, type);
+ }
+
+ // If this group is at least as long as the check
+ // threshold ("average"), its length must be a
+ // multiple of the threshold and hence we can
+ // continue scanning from the end of the group
+ // without losing the modulo properties of the
+ // accumulator.
+
+ if (k != end() && beamDuration >= average) {
+
+ i = k;
+ accumulator = prospective;
+
+ } else {
+
+ // Otherwise, we continue from where we were.
+ // (This must be safe because we can't get
+ // another group starting half-way through, as
+ // we know the last group is shorter than the
+ // check threshold.)
+
+ accumulator += idur;
+ }
+
+ break;
+ }
+ }
+ } else {
+
+ accumulator += idur;
+ }
+ }
+}
+
+
+// based on Rosegarden 2.1's GuessItemListClef in editor/src/MidiIn.c
+
+Clef
+SegmentNotationHelper::guessClef(iterator from, iterator to)
+{
+ long totalHeight = 0;
+ int noteCount = 0;
+
+ // just the defaults:
+ Clef clef;
+ Key key;
+
+ for (iterator i = from; i != to; ++i) {
+ if ((*i)->isa(Note::EventType)) {
+//!!! NotationDisplayPitch p((*i)->get<Int>(PITCH), clef, key);
+ try {
+ Pitch p(**i);
+ totalHeight += p.getHeightOnStaff(clef, key);
+ ++noteCount;
+ } catch (Exception e) {
+ // no pitch in note
+ }
+ }
+ }
+
+ if (noteCount == 0) return Clef(Clef::Treble);
+
+ int average = totalHeight / noteCount;
+
+ if (average < -6) return Clef(Clef::Bass);
+ else if (average < -3) return Clef(Clef::Tenor);
+ else if (average < 1) return Clef(Clef::Alto);
+ else return Clef(Clef::Treble);
+}
+
+
+bool
+SegmentNotationHelper::removeRests(timeT time, timeT &duration, bool testOnly)
+{
+ Event dummy("dummy", time, 0, MIN_SUBORDERING);
+
+ std::cerr << "SegmentNotationHelper::removeRests(" << time
+ << ", " << duration << ")" << std::endl;
+
+ iterator from = segment().lower_bound(&dummy);
+
+ // ignore any number of zero-duration events at the start
+ while (from != segment().end() &&
+ (*from)->getAbsoluteTime() == time &&
+ (*from)->getDuration() == 0) ++from;
+ if (from == segment().end()) return false;
+
+ iterator to = from;
+
+ timeT eventTime = time;
+ timeT finalTime = time + duration;
+
+ //!!! We should probably not use an accumulator, but instead
+ // calculate based on each event's absolute time + duration --
+ // in case we've somehow ended up with overlapping rests
+
+ // Iterate on events, checking if all are rests
+ //
+ while ((eventTime < finalTime) && (to != end())) {
+
+ if (!(*to)->isa(Note::EventRestType)) {
+ // a non-rest was found
+ duration = (*to)->getAbsoluteTime() - time;
+ return false;
+ }
+
+ timeT nextEventDuration = (*to)->getDuration();
+
+ if ((eventTime + nextEventDuration) <= finalTime) {
+ eventTime += nextEventDuration;
+ duration = eventTime - time;
+ } else break;
+
+ ++to;
+ }
+
+ bool checkLastRest = false;
+ iterator lastEvent = to;
+
+ if (eventTime < finalTime) {
+ // shorten last event's duration, if possible
+
+
+ if (lastEvent == end()) {
+ duration = segment().getEndTime() - time;
+ return false;
+ }
+
+ if (!testOnly) {
+ // can't safely change the absolute time of an event in a segment
+ Event *newEvent = new Event(**lastEvent, finalTime,
+ (*lastEvent)->getDuration() -
+ (finalTime - eventTime));
+ duration = finalTime + (*lastEvent)->getDuration() - time;
+ bool same = (from == to);
+ segment().erase(lastEvent);
+ to = lastEvent = segment().insert(newEvent);
+ if (same) from = to;
+ checkLastRest = true;
+ }
+ }
+
+ if (testOnly) return true;
+
+ segment().erase(from, to);
+
+ // we must defer calling makeRestViable() until after erase,
+ // because it will invalidate 'to'
+ //
+ if (checkLastRest) makeRestViable(lastEvent);
+
+ return true;
+}
+
+
+void
+SegmentNotationHelper::collapseRestsAggressively(timeT startTime,
+ timeT endTime)
+{
+ reorganizeRests(startTime, endTime,
+ &SegmentNotationHelper::mergeContiguousRests);
+}
+
+
+void
+SegmentNotationHelper::reorganizeRests(timeT startTime, timeT endTime,
+ Reorganizer reorganizer)
+{
+ iterator ia = segment().findTime(startTime);
+ iterator ib = segment().findTime(endTime);
+
+ if (ia == end()) return;
+
+ std::vector<iterator> erasable;
+ std::vector<Event *> insertable;
+
+// cerr << "SegmentNotationHelper::reorganizeRests (" << startTime << ","
+// << endTime << ")" << endl;
+
+ for (iterator i = ia; i != ib; ++i) {
+
+ if ((*i)->isa(Note::EventRestType)) {
+
+ timeT startTime = (*i)->getAbsoluteTime();
+ timeT duration = 0;
+ iterator j = i;
+
+ for ( ; j != ib; ++j) {
+
+ if ((*j)->isa(Note::EventRestType)) {
+ duration += (*j)->getDuration();
+ erasable.push_back(j);
+ } else break;
+ }
+
+ (this->*reorganizer)(startTime, duration, insertable);
+ if (j == ib) break;
+ i = j;
+ }
+ }
+
+ for (unsigned int ei = 0; ei < erasable.size(); ++ei)
+ segment().erase(erasable[ei]);
+
+ for (unsigned int ii = 0; ii < insertable.size(); ++ii)
+ segment().insert(insertable[ii]);
+}
+
+
+void
+SegmentNotationHelper::normalizeContiguousRests(timeT startTime,
+ timeT duration,
+ std::vector<Event *> &toInsert)
+{
+ TimeSignature ts;
+ timeT sigTime =
+ segment().getComposition()->getTimeSignatureAt(startTime, ts);
+
+// cerr << "SegmentNotationHelper::normalizeContiguousRests:"
+// << " startTime = " << startTime << ", duration = "
+// << duration << endl;
+
+ DurationList dl;
+ ts.getDurationListForInterval(dl, duration, startTime - sigTime);
+
+ timeT acc = startTime;
+
+ for (DurationList::iterator i = dl.begin(); i != dl.end(); ++i) {
+ Event *e = new Event(Note::EventRestType, acc, *i,
+ Note::EventRestSubOrdering);
+ toInsert.push_back(e);
+ acc += *i;
+ }
+}
+
+
+void
+SegmentNotationHelper::mergeContiguousRests(timeT startTime,
+ timeT duration,
+ std::vector<Event *> &toInsert)
+{
+ while (duration > 0) {
+
+ timeT d = Note::getNearestNote(duration).getDuration();
+
+ Event *e = new Event(Note::EventRestType, startTime, d,
+ Note::EventRestSubOrdering);
+ toInsert.push_back(e);
+
+ startTime += d;
+ duration -= d;
+ }
+}
+
+
+Segment::iterator
+SegmentNotationHelper::collapseNoteAggressively(Event *note,
+ timeT rangeEnd)
+{
+ iterator i = segment().findSingle(note);
+ if (i == end()) return end();
+
+ iterator j = getNextAdjacentNote(i, true, true);
+ if (j == end() || (*j)->getAbsoluteTime() >= rangeEnd) return end();
+
+ timeT iEnd = (*i)->getAbsoluteTime() + (*i)->getDuration();
+ timeT jEnd = (*j)->getAbsoluteTime() + (*j)->getDuration();
+
+ Event *newEvent = new Event
+ (**i, (*i)->getAbsoluteTime(),
+ (std::max(iEnd, jEnd) - (*i)->getAbsoluteTime()));
+
+ newEvent->unset(TIED_BACKWARD);
+ newEvent->unset(TIED_FORWARD);
+
+ segment().erase(i);
+ segment().erase(j);
+ return segment().insert(newEvent);
+}
+
+std::pair<Event *, Event *>
+SegmentNotationHelper::splitPreservingPerformanceTimes(Event *e, timeT q1)
+{
+ timeT ut = e->getAbsoluteTime();
+ timeT ud = e->getDuration();
+ timeT qt = e->getNotationAbsoluteTime();
+ timeT qd = e->getNotationDuration();
+
+ timeT u1 = (qt + q1) - ut;
+ timeT u2 = (ut + ud) - (qt + q1);
+
+// std::cerr << "splitPreservingPerformanceTimes: (ut,ud) (" << ut << "," << ud << "), (qt,qd) (" << qt << "," << qd << ") q1 " << q1 << ", u1 " << u1 << ", u2 " << u2 << std::endl;
+
+ if (u1 <= 0 || u2 <= 0) { // can't do a meaningful split
+ return std::pair<Event *, Event *>(0, 0);
+ }
+
+ Event *e1 = new Event(*e, ut, u1, e->getSubOrdering(), qt, q1);
+ Event *e2 = new Event(*e, ut + u1, u2, e->getSubOrdering(), qt + q1, qd - q1);
+
+ e1->set<Bool>(TIED_FORWARD, true);
+ e2->set<Bool>(TIED_BACKWARD, true);
+
+ return std::pair<Event *, Event *>(e1, e2);
+}
+
+void
+SegmentNotationHelper::deCounterpoint(timeT startTime, timeT endTime)
+{
+ // How this should work: scan through the range and, for each
+ // note "n" found, if the next following note "m" not at the same
+ // absolute time as n starts before n ends, then split n at m-n.
+
+ // also, if m starts at the same time as n but has a different
+ // duration, we should split the longer of n and m at the shorter
+ // one's duration.
+
+ for (Segment::iterator i = segment().findTime(startTime);
+ segment().isBeforeEndMarker(i); ) {
+
+ timeT t = (*i)->getAbsoluteTime();
+ if (t >= endTime) break;
+
+#ifdef DEBUG_DECOUNTERPOINT
+ std::cerr << "SegmentNotationHelper::deCounterpoint: event at " << (*i)->getAbsoluteTime() << " notation " << (*i)->getNotationAbsoluteTime() << ", duration " << (*i)->getNotationDuration() << ", type " << (*i)->getType() << std::endl;
+#endif
+
+ if (!(*i)->isa(Note::EventType)) { ++i; continue; }
+
+ timeT ti = (*i)->getNotationAbsoluteTime();
+ timeT di = (*i)->getNotationDuration();
+
+#ifdef DEBUG_DECOUNTERPOINT
+ std::cerr<<"looking for k"<<std::endl;
+#endif
+
+ // find next event that's either at a different time or (if a
+ // note) has a different duration
+ Segment::iterator k = i;
+ while (segment().isBeforeEndMarker(k)) {
+ if ((*k)->isa(Note::EventType)) {
+#ifdef DEBUG_DECOUNTERPOINT
+ std::cerr<<"abstime "<<(*k)->getAbsoluteTime()<< std::endl;
+#endif
+ if ((*k)->getNotationAbsoluteTime() > ti ||
+ (*k)->getNotationDuration() != di) break;
+ }
+ ++k;
+ }
+
+ if (!segment().isBeforeEndMarker(k)) break; // no split, no more notes
+
+#ifdef DEBUG_DECOUNTERPOINT
+ std::cerr << "k is at " << (k == segment().end() ? -1 : (*k)->getAbsoluteTime()) << ", notation " << (*k)->getNotationAbsoluteTime() << ", duration " << (*k)->getNotationDuration() << std::endl;
+#endif
+
+ timeT tk = (*k)->getNotationAbsoluteTime();
+ timeT dk = (*k)->getNotationDuration();
+
+ Event *e1 = 0, *e2 = 0;
+ std::pair<Event *, Event *> splits;
+ Segment::iterator toGo = segment().end();
+
+ if (tk == ti && dk != di) {
+ // do the same-time-different-durations case
+ if (di > dk) { // split *i
+#ifdef DEBUG_DECOUNTERPOINT
+ std::cerr << "splitting i into " << dk << " and "<< (di-dk) << std::endl;
+#endif
+ splits = splitPreservingPerformanceTimes(*i, dk);
+
+ toGo = i;
+ } else { // split *k
+#ifdef DEBUG_DECOUNTERPOINT
+ std::cerr << "splitting k into " << di << " and "<< (dk-di) << std::endl;
+#endif
+ splits = splitPreservingPerformanceTimes(*k, di);
+
+ toGo = k;
+ }
+ } else if (tk - ti > 0 && tk - ti < di) { // split *i
+#ifdef DEBUG_DECOUNTERPOINT
+ std::cerr << "splitting i[*] into " << (tk-ti) << " and "<< (di-(tk-ti)) << std::endl;
+#endif
+ splits = splitPreservingPerformanceTimes(*i, tk - ti);
+
+ toGo = i;
+ }
+
+ e1 = splits.first;
+ e2 = splits.second;
+
+ if (e1 && e2) { // e2 is the new note
+
+ e1->set<Bool>(TIED_FORWARD, true);
+ e2->set<Bool>(TIED_BACKWARD, true);
+
+#ifdef DEBUG_DECOUNTERPOINT
+ std::cerr<<"Erasing:"<<std::endl;
+ (*toGo)->dump(std::cerr);
+#endif
+
+ segment().erase(toGo);
+
+#ifdef DEBUG_DECOUNTERPOINT
+ std::cerr<<"Inserting:"<<std::endl;
+ e1->dump(std::cerr);
+#endif
+
+ segment().insert(e1);
+
+#ifdef DEBUG_DECOUNTERPOINT
+ std::cerr<<"Inserting:"<<std::endl;
+ e2->dump(std::cerr);
+#endif
+
+ segment().insert(e2);
+
+ i = segment().findTime(t);
+
+#ifdef DEBUG_DECOUNTERPOINT
+ std::cerr<<"resync at " << t << ":" << std::endl;
+ if (i != segment().end()) (*i)->dump(std::cerr);
+ else std::cerr << "(end)" << std::endl;
+#endif
+
+ } else {
+
+ // no split here
+
+#ifdef DEBUG_DECOUNTERPOINT
+ std::cerr<<"no split"<<std::endl;
+#endif
+ ++i;
+ }
+ }
+
+ segment().normalizeRests(startTime, endTime);
+}
+
+
+void
+SegmentNotationHelper::autoSlur(timeT startTime, timeT endTime, bool legatoOnly)
+{
+ iterator from = segment().findTime(startTime);
+ iterator to = segment().findTime(endTime);
+
+ timeT potentialStart = segment().getEndTime();
+ long groupId = -1;
+ timeT prevTime = startTime;
+ int count = 0;
+ bool thisLegato = false, prevLegato = false;
+
+ for (iterator i = from; i != to && segment().isBeforeEndMarker(i); ++i) {
+
+ timeT t = (*i)->getNotationAbsoluteTime();
+
+ long newGroupId = -1;
+ if ((*i)->get<Int>(BEAMED_GROUP_ID, newGroupId)) {
+ if (groupId == newGroupId) { // group continuing
+ if (t > prevTime) {
+ ++count;
+ prevLegato = thisLegato;
+ thisLegato = Marks::hasMark(**i, Marks::Tenuto);
+ }
+ prevTime = t;
+ continue;
+ }
+ } else {
+ if (groupId == -1) continue; // no group
+ }
+
+ // a group has ended (and a new one might have begun)
+
+ if (groupId >= 0 && count > 1 && (!legatoOnly || prevLegato)) {
+ Indication ind(Indication::Slur, t - potentialStart);
+ segment().insert(ind.getAsEvent(potentialStart));
+ if (legatoOnly) {
+ for (iterator j = segment().findTime(potentialStart); j != i; ++j) {
+ Marks::removeMark(**j, Marks::Tenuto);
+ }
+ }
+ }
+
+ potentialStart = t;
+ groupId = newGroupId;
+ prevTime = t;
+ count = 0;
+ thisLegato = false;
+ prevLegato = false;
+ }
+
+ if (groupId >= 0 && count > 1 && (!legatoOnly || prevLegato)) {
+ Indication ind(Indication::Slur, endTime - potentialStart);
+ segment().insert(ind.getAsEvent(potentialStart));
+ if (legatoOnly) {
+ for (iterator j = segment().findTime(potentialStart);
+ segment().isBeforeEndMarker(j) && j != to; ++j) {
+ Marks::removeMark(**j, Marks::Tenuto);
+ }
+ }
+ }
+}
+
+
+} // end of namespace
+
diff --git a/src/base/SegmentNotationHelper.h b/src/base/SegmentNotationHelper.h
new file mode 100644
index 0000000..5094929
--- /dev/null
+++ b/src/base/SegmentNotationHelper.h
@@ -0,0 +1,591 @@
+// -*- c-basic-offset: 4 -*-
+
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _SEGMENT_NOTATION_HELPER_H_
+#define _SEGMENT_NOTATION_HELPER_H_
+
+#include "Segment.h"
+
+namespace Rosegarden
+{
+
+class SegmentNotationHelper : protected SegmentHelper
+{
+public:
+ SegmentNotationHelper(Segment &t) : SegmentHelper(t) { }
+ virtual ~SegmentNotationHelper();
+
+ SegmentHelper::segment;
+
+ /**
+ * Set the NOTE_TYPE and NOTE_DOTS properties on the events
+ * in the segment. If startTime and endTime are equal, operates
+ * on the whole segment.
+ */
+ void setNotationProperties(timeT startTime = 0, timeT endTime = 0);
+
+ /**
+ * Return the notation absolute time plus the notation duration.
+ */
+ timeT getNotationEndTime(Event *e);
+
+ /**
+ * Return an iterator pointing at the first event in the segment
+ * to have an absolute time of t or later. (Most of the time, the
+ * non-notation absolute times should be used as reference
+ * timings; this and the next function are provided for
+ * completeness, but in most cases if you're about to call them
+ * you should ask yourself why.)
+ */
+ iterator findNotationAbsoluteTime(timeT t);
+
+ /**
+ * Return an iterator pointing at the last event in the segment
+ * to have an absolute time of t or earlier. (Most of the time,
+ * the non-notation absolute times should be used as reference
+ * timings; this and the previous function are provided for
+ * completeness, but in most cases if you're about to call them
+ * you should ask yourself why.)
+ */
+ iterator findNearestNotationAbsoluteTime(timeT t);
+
+
+ /**
+ * Looks for another note immediately following the one pointed to
+ * by the given iterator, and (if matchPitch is true) of the same
+ * pitch, and returns an iterator pointing to that note. Returns
+ * end() if there is no such note.
+ *
+ * The notes are considered "adjacent" if the quantized start
+ * time of one matches the quantized end time of the other, unless
+ * allowOverlap is true in which case overlapping notes are also
+ * considered adjacent so long as one does not completely enclose
+ * the other.
+ */
+ iterator getNextAdjacentNote(iterator i,
+ bool matchPitch = true,
+ bool allowOverlap = true);
+
+
+ /**
+ * Looks for another note immediately preceding the one pointed to
+ * by the given iterator, and (if matchPitch is true) of the same
+ * pitch, and returns an iterator pointing to that note. Returns
+ * end() if there is no such note.
+ *
+ * rangeStart gives a bound to the distance that will be scanned
+ * to find events -- no event with starting time earlier than that
+ * will be considered. (This method has no other way to know when
+ * to stop scanning; potentially the very first note in the segment
+ * could turn out to be adjacent to the very last one.)
+ *
+ * The notes are considered "adjacent" if the quantized start
+ * time of one matches the quantized end time of the other, unless
+ * allowOverlap is true in which case overlapping notes are also
+ * considered adjacent so long as one does not completely enclose
+ * the other.
+ */
+ iterator getPreviousAdjacentNote(iterator i,
+ timeT rangeStart = 0,
+ bool matchPitch = true,
+ bool allowOverlap = true);
+
+
+ /**
+ * Returns an iterator pointing to the next contiguous element of
+ * the same type (note or rest) as the one passed as argument, if
+ * any. Returns end() otherwise.
+ *
+ * (for instance if the argument points to a note and the next
+ * element is a rest, end() will be returned)
+ *
+ * Note that if the iterator points to a note, the "contiguous"
+ * iterator returned may point to a note that follows the first
+ * one, overlaps with it, shares a starting time (i.e. they're
+ * both in the same chord) or anything else. "Contiguous" refers
+ * only to their locations in the segment's event container,
+ * which normally means what you expect for rests but not notes.
+ *
+ * See also SegmentNotationHelper::getNextAdjacentNote.
+ */
+ iterator findContiguousNext(iterator);
+
+ /**
+ * Returns an iterator pointing to the previous contiguous element
+ * of the same type (note or rest) as the one passed as argument,
+ * if any. Returns end() otherwise.
+ *
+ * (for instance if the argument points to a note and the previous
+ * element is a rest, end() will be returned)
+ *
+ * Note that if the iterator points to a note, the "contiguous"
+ * iterator returned may point to a note that precedes the first
+ * one, overlaps with it, shares a starting time (i.e. they're
+ * both in the same chord) or anything else. "Contiguous" refers
+ * only to their locations in the segment's event container,
+ * which normally means what you expect for rests but not notes.
+ *
+ * See also SegmentNotationHelper::getPreviousAdjacentNote.
+ */
+ iterator findContiguousPrevious(iterator);
+
+ /**
+ * Returns true if the iterator points at a note in a chord
+ * e.g. if there are more notes at the same absolute time
+ */
+ bool noteIsInChord(Event *note);
+
+ /**
+ * Returns an iterator pointing to the note that this one is tied
+ * with, in the forward direction if goForwards or back otherwise.
+ * Returns end() if none.
+ *
+ * Untested and probably marked-for-expiry -- prefer
+ * SegmentPerformanceHelper::getTiedNotes
+ */
+ iterator getNoteTiedWith(Event *note, bool goForwards);
+
+
+ /**
+ * Checks whether it's reasonable to split a single event
+ * of duration a+b into two events of durations a and b, for some
+ * working definition of "reasonable".
+ *
+ * You should pass note-quantized durations into this method
+ */
+ bool isSplitValid(timeT a, timeT b);
+
+
+ /**
+ * Splits events in the [from, to[ interval into
+ * tied events of duration baseDuration + events of duration R,
+ * with R being equal to the events' initial duration minus baseDuration
+ *
+ * The events in [from, to[ must all be at the same absolute time
+ *
+ * Does not check "reasonableness" of expansion first
+ *
+ * Events may be notes or rests (rests will obviously not be tied)
+ *
+ * @return iterator pointing at the last inserted event. Also
+ * modifies from to point at the first split event (the original
+ * iterator would have been invalidated).
+ */
+ iterator splitIntoTie(iterator &from, iterator to, timeT baseDuration);
+
+
+ /**
+ * Splits (splits) events in the same timeslice as that pointed
+ * to by i into tied events of duration baseDuration + events of
+ * duration R, with R being equal to the events' initial duration
+ * minus baseDuration
+ *
+ * Does not check "reasonableness" of expansion first
+ *
+ * Events may be notes or rests (rests will obviously not be tied)
+ *
+ * @return iterator pointing at the last inserted event. Also
+ * modifies i to point at the first split event (the original
+ * iterator would have been invalidated).
+ */
+ iterator splitIntoTie(iterator &i, timeT baseDuration);
+
+
+ /**
+ * Returns true if Events of durations a and b can reasonably be
+ * collapsed into a single one of duration a+b, for some
+ * definition of "reasonably". For use by collapseRestsIfValid
+ *
+ * You should pass note-quantized durations into this method
+ */
+ bool isCollapseValid(timeT a, timeT b);
+
+ /**
+ * If possible, collapses the rest event with the following or
+ * previous one.
+ *
+ * @return true if collapse was done, false if it wasn't reasonable
+ *
+ * collapseForward is set to true if the collapse was with the
+ * following element, false if it was with the previous one
+ */
+ bool collapseRestsIfValid(Event*, bool& collapseForward);
+
+ /**
+ * Inserts a note, doing all the clever split/merge stuff as
+ * appropriate. Requires segment to be in a composition. Returns
+ * iterator pointing to last event inserted (there may be more
+ * than one, as note may have had to be split)
+ *
+ * This method will only work correctly if there is a note or
+ * rest event already starting at absoluteTime.
+ */
+ iterator insertNote(timeT absoluteTime, Note note, int pitch,
+ Accidental explicitAccidental);
+
+ /**
+ * Inserts a note, doing all the clever split/merge stuff as
+ * appropriate. Requires segment to be in a composition. Returns
+ * iterator pointing to last event inserted (there may be more
+ * than one, as note may have had to be split)
+ *
+ * This method will only work correctly if there is a note or
+ * rest event already starting at the model event's absoluteTime.
+ *
+ * Passing a model event has the advantage over the previous
+ * method of allowing additional properties to be supplied. The
+ * model event will be copied but not itself used; the caller
+ * continues to own it and should release it after return.
+ */
+ iterator insertNote(Event *modelEvent);
+
+ /**
+ * Inserts a rest, doing all the clever split/merge stuff as
+ * appropriate. Requires segment to be in a composition.
+ * Returns iterator pointing to last event inserted (there
+ * may be more than one, as rest may have had to be split)
+ *
+ * This method will only work correctly if there is a note or
+ * rest event already starting at absoluteTime.
+ */
+ iterator insertRest(timeT absoluteTime, Note note);
+
+ /**
+ * Insert a clef.
+ * Returns iterator pointing to clef.
+ */
+ iterator insertClef(timeT absoluteTime, Clef clef);
+
+ /**
+ * Insert a key.
+ * Returns iterator pointing to key.
+ */
+ iterator insertKey(timeT absoluteTime, Key key);
+
+ /**
+ * Insert a text event.
+ * Returns iterator pointing to text event.
+ */
+ iterator insertText(timeT absoluteTime, Text text);
+
+ /**
+ * Deletes a note, doing all the clever split/merge stuff as
+ * appropriate. Requires segment to be in a composition.
+ */
+ void deleteNote(Event *e, bool collapseRest = false);
+
+ /**
+ * Deletes a rest, doing all the clever split/merge stuff as
+ * appropriate. Requires segment to be in a composition.
+ *
+ * @return whether the rest could be deleted -- a rest can only
+ * be deleted if there's a suitable rest next to it to merge it
+ * with.
+ */
+ bool deleteRest(Event *e);
+
+ /**
+ * Deletes an event. If the event is a note or a rest, calls
+ * deleteNote or deleteRest.
+ *
+ * @return whether the event was deleted (always true, unless the
+ * event is a rest).
+ *
+ * @see deleteRest, deleteNote
+ */
+ bool deleteEvent(Event *e, bool collapseRest = false);
+
+ /**
+ * Check whether a note or rest event has a duration that can be
+ * represented by a single note-type. (If not, the code that's
+ * doing the check might wish to split the event.)
+ *
+ * If dots is specified, a true value will only be returned if the
+ * best-fit note has no more than that number of dots. e.g. if
+ * dots = 0, only notes that are viable without the use of dots
+ * will be acceptable. The default is whatever the segment's
+ * quantizer considers acceptable (probably either 1 or 2 dots).
+ */
+ bool isViable(Event *e, int dots = -1) {
+ return isViable(e->getDuration(), dots);
+ }
+
+ /**
+ * Check whether a duration can be represented by a single
+ * note-type. (If not, the code that's doing the check might wish
+ * to split the duration.)
+ *
+ * If dots is specified, a true value will only be returned if the
+ * best-fit note has no more than that number of dots. e.g. if
+ * dots = 0, only notes that are viable without the use of dots
+ * will be acceptable. The default is whatever the segment's
+ * quantizer considers acceptable (probably either 1 or 2 dots).
+ */
+ bool isViable(timeT duration, int dots = -1);
+
+
+ /**
+ * Given an iterator pointing to a rest, split that rest up
+ * according to the durations returned by TimeSignature's
+ * getDurationListForInterval
+ */
+ void makeRestViable(iterator i);
+
+
+ /**
+ * Split notes and rests up into tied notes or shorter rests of
+ * viable lengths (longest possible viable duration first, then
+ * longest possible viable component of remainder &c). Also
+ * optionally splits notes and rests at barlines -- this is
+ * actually the most common user-visible use of this function.
+ */
+ void makeNotesViable(iterator i, iterator j, bool splitAtBars = true);
+
+
+ /**
+ * As above but given a range in time rather than iterators.
+ */
+ void makeNotesViable(timeT startTime, timeT endTime,
+ bool splitAtBars = true);
+
+
+ /**
+ * Give all events between the start of the timeslice containing
+ * from and the start of the timeslice containing to the same new
+ * group id and the given type.
+ *
+ * Do not use this for making tuplet groups, unless the events
+ * in the group already have the other tuplet properties or you
+ * intend to add those yourself. Use makeTupletGroup instead.
+ */
+ void makeBeamedGroup(timeT from, timeT to, std::string type);
+
+ /**
+ * Give all events between the start of the timeslice containing
+ * from and the start of the timeslice containing to the same new
+ * group id and the given type.
+ *
+ * Do not use this for making tuplet groups, unless the events
+ * in the group already have the other tuplet properties or you
+ * intend to add those yourself. Use makeTupletGroup instead.
+ */
+ void makeBeamedGroup(iterator from, iterator to, std::string type);
+
+ /**
+ * Give all events between from and to the same new group id and
+ * the given type.
+ *
+ * Use makeBeamedGroup for normal notes. This function is usually
+ * used for groups of grace notes, which are equal in time and
+ * distinguished by subordering.
+ *
+ * Do not use this for making tuplet groups, unless the events
+ * in the group already have the other tuplet properties or you
+ * intend to add those yourself.
+ */
+ void makeBeamedGroupExact(iterator from, iterator to, std::string type);
+
+
+ /**
+ * Make a beamed group of tuplet type, whose tuplet properties are
+ * specified as "(untupled-count) notes of duration (unit) played
+ * in the time of (tupled-count)". For example, a quaver triplet
+ * group could be specified with untupled = 3, tupled = 2, unit =
+ * (the duration of a quaver).
+ *
+ * The group will start at the beginning of the timeslice containing
+ * the time t, and will be constructed by compressing the appropriate
+ * number of following notes into the tuplet time, and filling the
+ * space that this compression left behind (after the group) with
+ * rests. The results may be unexpected if overlapping events are
+ * present.
+ */
+ void makeTupletGroup(timeT t, int untupled, int tupled, timeT unit);
+
+
+ /**
+ * Divide the notes between the start of the bar containing
+ * from and the end of the bar containing to up into sensible
+ * beamed groups and give each group the right group properties
+ * using makeBeamedGroup. Requires segment to be in a composition.
+ */
+ void autoBeam(timeT from, timeT to, std::string type);
+
+ /**
+ * Divide the notes between the start of the bar containing
+ * from and the end of the bar containing to up into sensible
+ * beamed groups and give each group the right group properties
+ * using makeBeamedGroup. Requires segment to be in a composition.
+ */
+ void autoBeam(iterator from, iterator to, std::string type);
+
+
+ /**
+ * Clear the group id and group type from all events between the
+ * start of the timeslice containing from and the start of the
+ * timeslice containing to
+ */
+ void unbeam(timeT from, timeT to);
+
+ /**
+ * Clear the group id and group type from all events between the
+ * start of the timeslice containing from and the start of the
+ * timeslice containing to
+ */
+ void unbeam(iterator from, iterator to);
+
+ /**
+ * Guess which clef a section of music is supposed to be in,
+ * ignoring any clef events actually found in the section.
+ */
+ Clef guessClef(iterator from, iterator to);
+
+
+ /**
+ * Removes all rests starting at \a time for \a duration,
+ * splitting the last rest if needed.
+ *
+ * Modifies duration to the actual duration of the series
+ * of rests that has been changed by this action (i.e. if
+ * the last rest was split, duration will be extended to
+ * include the second half of this rest). This is intended
+ * to be of use when calculating the extents of a command
+ * for undo/refresh purposes.
+ *
+ * If there's an event which is not a rest in this interval,
+ * returns false and sets duration to the maximum duration
+ * that would have succeeded.
+ *
+ * If testOnly is true, does not actually remove any rests;
+ * just checks whether the rests can be removed and sets
+ * duration and the return value appropriately.
+ *
+ * (Used for Event pasting.)
+ */
+ bool removeRests(timeT time, timeT &duration, bool testOnly = false);
+
+
+ /**
+ * For each series of contiguous rests found between the start and
+ * end time, replace the series of rests with another series of
+ * the same duration but composed of the longest possible valid
+ * rest plus the remainder
+ */
+ void collapseRestsAggressively(timeT startTime, timeT endTime);
+
+
+ /**
+ * Locate the given event and, if it's a note, collapse it with
+ * any following adjacent note of the same pitch, so long as its
+ * start time is before the the given limit. Does not care
+ * whether the resulting note is viable.
+ *
+ * Returns an iterator pointing to the event that replaced the
+ * original one if a collapse happened, segment.end() if no
+ * collapse or event not found
+ */
+ iterator collapseNoteAggressively(Event *, timeT rangeEnd);
+
+
+
+ std::pair<Event *, Event *> splitPreservingPerformanceTimes(Event *e,
+ timeT q1);
+
+ /**
+ * Look for examples of overlapping notes within the given range,
+ * and split each into chords with some tied notes.
+ */
+ void deCounterpoint(timeT startTime, timeT endTime);
+
+ /**
+ * A rather specialised function: Add a slur to every beamed group.
+ * If legatoOnly is true, add a slur only to those beamed groups
+ * in which every note except the last has a tenuto mark already
+ * (and remove that mark).
+ * This is basically intended as a post-notation-quantization-auto-
+ * beam step.
+ */
+ void autoSlur(timeT startTime, timeT endTime, bool legatoOnly);
+
+
+protected:
+ const Quantizer &basicQuantizer();
+ const Quantizer &notationQuantizer();
+
+ /**
+ * Collapse multiple consecutive rests into one, in preparation
+ * for insertion of a note (whose duration may exceed that of the
+ * first rest) at the given position. The resulting rest event
+ * may have a duration that is not expressible as a single note
+ * type, and may therefore require splitting again after the
+ * insertion.
+ *
+ * Returns position at which the collapse ended (i.e. the first
+ * uncollapsed event)
+ */
+ iterator collapseRestsForInsert(iterator firstRest, timeT desiredDuration);
+
+
+ /// for use by insertNote and insertRest
+ iterator insertSomething(iterator position, int duration,
+ Event *modelEvent, bool tiedBack);
+
+ /// for use by insertSomething
+ iterator insertSingleSomething(iterator position, int duration,
+ Event *modelEvent, bool tiedBack);
+
+ /// for use by insertSingleSomething
+ void setInsertedNoteGroup(Event *e, iterator i);
+
+ /// for use by makeBeamedGroup
+ void makeBeamedGroupAux(iterator from, iterator to, std::string type,
+ bool groupGraces);
+
+ /// for use by unbeam
+ void unbeamAux(iterator from, iterator to);
+
+ /// for use by autoBeam
+
+ void autoBeamBar(iterator from, iterator to, TimeSignature timesig,
+ std::string type);
+
+ void autoBeamBar(iterator from, iterator to, timeT average,
+ timeT minimum, timeT maximum, std::string type);
+
+ /// used by autoBeamAux (duplicate of private method in Segment)
+ bool hasEffectiveDuration(iterator i);
+
+ typedef void (SegmentNotationHelper::*Reorganizer)(timeT, timeT,
+ std::vector<Event *>&);
+
+ void reorganizeRests(timeT, timeT, Reorganizer);
+
+ /// for use by normalizeRests
+ void normalizeContiguousRests(timeT, timeT, std::vector<Event *>&);
+
+ /// for use by collapseRestsAggressively
+ void mergeContiguousRests(timeT, timeT, std::vector<Event *>&);
+};
+
+}
+
+#endif
diff --git a/src/base/SegmentPerformanceHelper.cpp b/src/base/SegmentPerformanceHelper.cpp
new file mode 100644
index 0000000..930a794
--- /dev/null
+++ b/src/base/SegmentPerformanceHelper.cpp
@@ -0,0 +1,472 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include "SegmentPerformanceHelper.h"
+#include "BaseProperties.h"
+#include <iostream>
+
+namespace Rosegarden
+{
+using std::endl;
+using std::string;
+
+using namespace BaseProperties;
+
+SegmentPerformanceHelper::~SegmentPerformanceHelper() { }
+
+
+SegmentPerformanceHelper::iteratorcontainer
+SegmentPerformanceHelper::getTiedNotes(iterator i)
+{
+ iteratorcontainer c;
+ c.push_back(i);
+
+ Event *e = *i;
+ if (!e->isa(Note::EventType)) return c;
+ Segment::iterator j(i);
+
+ bool tiedBack = false, tiedForward = false;
+ e->get<Bool>(TIED_BACKWARD, tiedBack);
+ e->get<Bool>(TIED_FORWARD, tiedForward);
+
+ timeT d = e->getNotationDuration();
+ timeT t = e->getNotationAbsoluteTime();
+
+ if (!e->has(PITCH)) return c;
+ int pitch = e->get<Int>(PITCH);
+
+ bool valid = false;
+
+ if (tiedBack) {
+ // #1171463: If we can find no preceding TIED_FORWARD event,
+ // then we remove this property
+
+ while (j != begin()) {
+
+ --j;
+ if (!(*j)->isa(Note::EventType)) continue;
+ e = *j; // can reuse e because this branch always returns
+
+ timeT t2 = e->getNotationAbsoluteTime() + e->getNotationDuration();
+ if (t2 < t) break;
+
+ if (t2 > t || !e->has(PITCH) ||
+ e->get<Int>(PITCH) != pitch) continue;
+
+ bool prevTiedForward = false;
+ if (!e->get<Bool>(TIED_FORWARD, prevTiedForward) ||
+ !prevTiedForward) break;
+
+ valid = true;
+ break;
+ }
+
+ if (valid) {
+ return iteratorcontainer();
+ } else {
+ (*i)->unset(TIED_BACKWARD);
+ return c;
+ }
+ }
+ else if (!tiedForward) return c;
+
+ for (;;) {
+ while (++j != end() && !(*j)->isa(Note::EventType));
+ if (j == end()) return c;
+
+ e = *j;
+
+ timeT t2 = e->getNotationAbsoluteTime();
+
+ if (t2 > t + d) break;
+ else if (t2 < t + d || !e->has(PITCH) ||
+ e->get<Int>(PITCH) != pitch) continue;
+
+ if (!e->get<Bool>(TIED_BACKWARD, tiedBack) ||
+ !tiedBack) break;
+
+ d += e->getNotationDuration();
+ c.push_back(j);
+ valid = true;
+
+ if (!e->get<Bool>(TIED_FORWARD, tiedForward) ||
+ !tiedForward) return c;
+ }
+
+ if (!valid) {
+ // Related to #1171463: If we can find no following
+ // TIED_BACKWARD event, then we remove this property
+ (*i)->unset(TIED_FORWARD);
+ }
+
+ return c;
+}
+
+
+bool
+SegmentPerformanceHelper::getGraceAndHostNotes(iterator i,
+ iteratorcontainer &graceNotes,
+ iteratorcontainer &hostNotes,
+ bool &isHostNote)
+{
+ if (i == end() || !(*i)->isa(Note::EventType)) return false;
+
+ Segment::iterator j = i;
+ Segment::iterator firstGraceNote = i;
+ Segment::iterator firstHostNote = i;
+
+ if ((*i)->has(IS_GRACE_NOTE) && (*i)->get<Bool>(IS_GRACE_NOTE)) {
+
+ // i is a grace note. Find the first host note following it
+
+ j = i;
+ while (++j != end()) {
+ if ((*j)->getNotationAbsoluteTime() >
+ (*i)->getNotationAbsoluteTime()) break;
+ if ((*j)->getSubOrdering() < 0) continue;
+ if ((*j)->isa(Note::EventType)) {
+ firstHostNote = j;
+ break;
+ }
+ }
+
+ if (firstHostNote == i) {
+ std::cerr << "SegmentPerformanceHelper::getGraceAndHostNotes: REMARK: Grace note at " << (*i)->getAbsoluteTime() << " has no host note" << std::endl;
+ return false;
+ }
+ } else {
+
+ // i is a host note, but we need to ensure we have the first
+ // one, not just any one
+
+ j = i;
+
+ while (j != begin()) {
+ --j;
+ if ((*j)->getNotationAbsoluteTime() <
+ (*i)->getNotationAbsoluteTime()) break;
+ if ((*j)->getSubOrdering() <
+ (*i)->getSubOrdering()) break;
+ if ((*j)->isa(Note::EventType)) {
+ firstHostNote = j;
+ break;
+ }
+ }
+ }
+
+ // firstHostNote now points to the first host note, which is
+ // either the first non-grace note after i (if i was a grace note)
+ // or the first note with the same time and subordering as i (if i
+ // was not a grace note).
+
+ if ((*firstHostNote)->getSubOrdering() < 0) {
+ std::cerr << "SegmentPerformanceHelper::getGraceAndHostNotes: WARNING: Note at " << (*firstHostNote)->getAbsoluteTime() << " has subordering " << (*i)->getSubOrdering() << " but is not a grace note" << std::endl;
+ return false;
+ }
+
+ j = firstHostNote;
+
+ while (j != begin()) {
+ --j;
+ if ((*j)->getNotationAbsoluteTime() <
+ (*firstHostNote)->getNotationAbsoluteTime()) break;
+ if ((*j)->getSubOrdering() >= 0) continue;
+ if (!(*j)->isa(Note::EventType)) continue;
+ if (!(*j)->has(IS_GRACE_NOTE) || !(*j)->get<Bool>(IS_GRACE_NOTE)) {
+ std::cerr << "SegmentPerformanceHelper::getGraceAndHostNotes: WARNING: Note at " << (*j)->getAbsoluteTime() << " (in trackback) has subordering " << (*j)->getSubOrdering() << " but is not a grace note" << std::endl;
+ break;
+ }
+ firstGraceNote = j;
+ }
+
+ if (firstGraceNote == firstHostNote) {
+ std::cerr << "SegmentPerformanceHelper::getGraceAndHostNotes: REMARK: Note at " << (*firstHostNote)->getAbsoluteTime() << " has no grace notes" << std::endl;
+ return false;
+ }
+
+ j = firstGraceNote;
+
+ // push all of the grace notes, and notes with the same time as
+ // the first host note, onto the container
+
+ isHostNote = false;
+
+ while (j != end()) {
+ if ((*j)->isa(Note::EventType)) {
+ if ((*j)->getSubOrdering() < 0) {
+ if ((*j)->has(IS_GRACE_NOTE) && (*j)->get<Bool>(IS_GRACE_NOTE)) {
+ graceNotes.push_back(j);
+ }
+ } else {
+ hostNotes.push_back(j);
+ if (j == i) isHostNote = true;
+ }
+ }
+ if ((*j)->getNotationAbsoluteTime() >
+ (*firstHostNote)->getNotationAbsoluteTime()) break;
+ ++j;
+ }
+
+ return true;
+}
+
+
+timeT
+SegmentPerformanceHelper::getSoundingAbsoluteTime(iterator i)
+{
+ timeT t = 0;
+
+ timeT discard;
+
+// std::cerr << "SegmentPerformanceHelper::getSoundingAbsoluteTime at " << (*i)->getAbsoluteTime() << std::endl;
+
+ if ((*i)->has(IS_GRACE_NOTE)) {
+// std::cerr << "it's a grace note" << std::endl;
+ if (getGraceNoteTimeAndDuration(false, i, t, discard)) return t;
+ }
+ if ((*i)->has(MAY_HAVE_GRACE_NOTES)) {
+// std::cerr << "it's a candidate host note" << std::endl;
+ if (getGraceNoteTimeAndDuration(true, i, t, discard)) return t;
+ }
+
+ return (*i)->getAbsoluteTime();
+}
+
+timeT
+SegmentPerformanceHelper::getSoundingDuration(iterator i)
+{
+ timeT d = 0;
+
+ timeT discard;
+
+// std::cerr << "SegmentPerformanceHelper::getSoundingDuration at " << (*i)->getAbsoluteTime() << std::endl;
+
+ if ((*i)->has(IS_GRACE_NOTE)) {
+// std::cerr << "it's a grace note" << std::endl;
+ if (getGraceNoteTimeAndDuration(false, i, discard, d)) return d;
+ }
+ if ((*i)->has(MAY_HAVE_GRACE_NOTES)) {
+// std::cerr << "it's a candidate host note" << std::endl;
+ if (getGraceNoteTimeAndDuration(true, i, discard, d)) return d;
+ }
+
+ if ((*i)->has(TIED_BACKWARD)) {
+
+ // Formerly we just returned d in this case, but now we check
+ // with getTiedNotes so as to remove any bogus backward ties
+ // that have no corresponding forward tie. Unfortunately this
+ // is quite a bit slower.
+
+ //!!! optimize. at least we should add a marker property to
+ //anything we've already processed from this helper this time
+ //around.
+
+ iteratorcontainer c(getTiedNotes(i));
+
+ if (c.empty()) { // the tie back is valid
+ return 0;
+ }
+ }
+
+ if (!(*i)->has(TIED_FORWARD) || !(*i)->isa(Note::EventType)) {
+
+ d = (*i)->getDuration();
+
+ } else {
+
+ // tied forward but not back
+
+ iteratorcontainer c(getTiedNotes(i));
+
+ for (iteratorcontainer::iterator ci = c.begin();
+ ci != c.end(); ++ci) {
+ d += (**ci)->getDuration();
+ }
+ }
+
+ return d;
+}
+
+
+// In theory we can do better with tuplets, because real time has
+// finer precision than timeT time. With a timeT resolution of 960ppq
+// however the difference is probably not audible
+
+RealTime
+SegmentPerformanceHelper::getRealAbsoluteTime(iterator i)
+{
+ return segment().getComposition()->getElapsedRealTime
+ (getSoundingAbsoluteTime(i));
+}
+
+
+// In theory we can do better with tuplets, because real time has
+// finer precision than timeT time. With a timeT resolution of 960ppq
+// however the difference is probably not audible
+//
+// (If we did want to do this, it'd help to have abstime->realtime
+// conversion methods that accept double args in Composition)
+
+RealTime
+SegmentPerformanceHelper::getRealSoundingDuration(iterator i)
+{
+ timeT t0 = getSoundingAbsoluteTime(i);
+ timeT t1 = t0 + getSoundingDuration(i);
+
+ if (t1 > segment().getEndMarkerTime()) {
+ t1 = segment().getEndMarkerTime();
+ }
+
+ return segment().getComposition()->getRealTimeDifference(t0, t1);
+}
+
+
+bool
+SegmentPerformanceHelper::getGraceNoteTimeAndDuration(bool host, iterator i,
+ timeT &t, timeT &d)
+{
+ // [This code currently assumes appoggiatura. Acciaccatura later.]
+
+ // For our present purposes, we will assume that grace notes start
+ // at the same time as their host note was intended to, and
+ // "steal" a proportion of the duration of their host note. This
+ // causes the host note to start later, and be shorter, by that
+ // same proportion.
+
+ // If a host note has more than one (consecutive) grace note, they
+ // should take a single cut from the grace note and divide it
+ // amongst themselves.
+
+ // To begin with we will set the proportion to 1/4, but we will
+ // probably want it to be (a) something different [because I don't
+ // really know what I'm doing], (b) adaptive [e.g. shorter host
+ // note or more grace notes = longer proportion], (c)
+ // configurable, or (d) all of the above.
+
+ // Of course we also ought to be taking into account the notated
+ // duration of the grace notes -- though in my working examples it
+ // generally doesn't seem to be the case that we can always just
+ // follow those. I wonder if we can always use the grace notes'
+ // notated duration if the ratio of grace note duration to host
+ // note duration is less than some value? Whatever we do, we
+ // should be dividing the grace note duration up in proportion to
+ // the durations of the grace notes, in situations where we have
+ // more than one grace note consecutively of different durations;
+ // that isn't handled at all here.
+
+ if (i == end()) return false;
+
+ iteratorcontainer graceNotes, hostNotes;
+ bool isHostNote;
+
+ if (!getGraceAndHostNotes(i, graceNotes, hostNotes, isHostNote)) {
+ std::cerr << "SegmentPerformanceHelper::getGraceNoteTimeAndDuration: REMARK: Note at " << (*i)->getAbsoluteTime() << " is not a grace note, or has no grace notes" << std::endl;
+ return false;
+ }
+
+ if (!isHostNote) {
+
+ if (!(*i)->has(IS_GRACE_NOTE) || !(*i)->get<Bool>(IS_GRACE_NOTE)) {
+ std::cerr << "SegmentPerformanceHelper::getGraceNoteTimeAndDuration: WARNING: Note at " << (*i)->getAbsoluteTime() << " is neither grace nor host note, but was reported as suitable by getGraceAndHostNotes" << std::endl;
+ return false;
+ }
+ }
+
+ if (hostNotes.empty()) {
+ std::cerr << "SegmentPerformanceHelper::getGraceNoteTimeAndDuration: REMARK: Grace note at " << (*i)->getAbsoluteTime() << " has no host note" << std::endl;
+ return false;
+ }
+
+ if (graceNotes.empty()) {
+ std::cerr << "SegmentPerformanceHelper::getGraceNoteTimeAndDuration: REMARK: Note at " << (*i)->getAbsoluteTime() << " has no grace notes" << std::endl;
+ return false;
+ }
+
+ timeT hostNoteEarliestTime = 0;
+ timeT hostNoteShortestDuration = 0;
+ timeT hostNoteNotationDuration = 0;
+
+ for (iteratorcontainer::iterator j = hostNotes.begin();
+ j != hostNotes.end(); ++j) {
+
+ if (j == hostNotes.begin() ||
+ (**j)->getAbsoluteTime() < hostNoteEarliestTime) {
+ hostNoteEarliestTime = (**j)->getAbsoluteTime();
+ }
+ if (j == hostNotes.begin() ||
+ (**j)->getDuration() < hostNoteShortestDuration) {
+ hostNoteShortestDuration = (**j)->getDuration();
+ }
+ if (j == hostNotes.begin() ||
+ (**j)->getNotationDuration() > hostNoteNotationDuration) {
+ hostNoteNotationDuration = (**j)->getNotationDuration();
+ }
+ (**j)->set<Bool>(MAY_HAVE_GRACE_NOTES, true);
+ }
+
+ timeT graceNoteTime = hostNoteEarliestTime;
+ timeT graceNoteDuration = hostNoteNotationDuration / 4;
+ if (graceNoteDuration > hostNoteShortestDuration / 2) {
+ graceNoteDuration = hostNoteShortestDuration / 2;
+ }
+
+ if (isHostNote) {
+ t = (*i)->getAbsoluteTime() + graceNoteDuration;
+ d = (*i)->getDuration() - graceNoteDuration;
+ } else {
+
+ int count = 0, index = 0;
+ bool found = false;
+ int prevSubOrdering = 0;
+
+ for (iteratorcontainer::iterator j = graceNotes.begin();
+ j != graceNotes.end(); ++j) {
+
+ bool newChord = false;
+
+ if ((**j)->getSubOrdering() != prevSubOrdering) {
+ newChord = true;
+ prevSubOrdering = (**j)->getSubOrdering();
+ }
+
+ if (newChord) ++count;
+
+ if (*j == i) found = true;
+
+ if (!found) {
+ if (newChord) ++index;
+ }
+ }
+
+ if (index == count) index = 0;
+ if (count == 0) count = 1; // should not happen
+
+ d = graceNoteDuration / count;
+ t = hostNoteEarliestTime + d * index;
+ }
+
+ return true;
+
+
+}
+
+
+}
diff --git a/src/base/SegmentPerformanceHelper.h b/src/base/SegmentPerformanceHelper.h
new file mode 100644
index 0000000..e0ce745
--- /dev/null
+++ b/src/base/SegmentPerformanceHelper.h
@@ -0,0 +1,126 @@
+// -*- c-basic-offset: 4 -*-
+
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _SEGMENT_PERFORMANCE_HELPER_H_
+#define _SEGMENT_PERFORMANCE_HELPER_H_
+
+#include "Segment.h"
+#include "Composition.h" // for RealTime
+
+namespace Rosegarden
+{
+
+class SegmentPerformanceHelper : protected SegmentHelper
+{
+public:
+ SegmentPerformanceHelper(Segment &t) : SegmentHelper(t) { }
+ virtual ~SegmentPerformanceHelper();
+
+ typedef std::vector<iterator> iteratorcontainer;
+
+ /**
+ * Returns a sequence of iterators pointing to the note events
+ * that are tied with the given event. If the given event is not
+ * a note event or is not tied, its iterator will be the only one
+ * in the sequence. If the given event is tied but is not the
+ * first in the tied chain, the returned sequence will be empty.
+ */
+ iteratorcontainer getTiedNotes(iterator i);
+
+ /**
+ * Returns two sequences of iterators pointing to the note events
+ * that are grace notes, or host notes for grace notes, associated
+ * with the given event, which is itself either a grace note or a
+ * host note for a grace note. The grace note iterators are
+ * returned in the graceNotes sequence, and the host note
+ * iterators in hostNotes. isHostNote is set to true if the
+ * given event is a host note, false otherwise.
+ *
+ * If the given event is not a grace note, is a grace note with no
+ * host note, or is a potential host note without any grace notes,
+ * the sequences will both be empty and the function will return
+ * false.
+ */
+ bool getGraceAndHostNotes(iterator i,
+ iteratorcontainer &graceNotes,
+ iteratorcontainer &hostNotes,
+ bool &isHostNote);
+
+ /**
+ * Returns the absolute time of the note event pointed to by i.
+ */
+ timeT getSoundingAbsoluteTime(iterator i);
+
+ /**
+ * Returns the duration of the note event pointed to by i, taking
+ * into account any ties the note may have etc.
+ *
+ * If the note is the first of two or more tied notes, this will
+ * return the accumulated duration of the whole series of notes
+ * it's tied to.
+ *
+ * If the note is in a tied series but is not the first, this will
+ * return zero, because the note's duration is presumed to have
+ * been accounted for by a previous call to this method when
+ * examining the first note in the tied series.
+ *
+ * If the note is not tied, or if i does not point to a note
+ * event, this will just return the duration of the event at i.
+ *
+ * This method may return an incorrect duration for any note
+ * event that is tied but lacks a pitch property. This is
+ * expected behaviour; don't create tied notes without pitches.
+ */
+ timeT getSoundingDuration(iterator i);
+
+ /**
+ * Returns the absolute time of the event pointed to by i,
+ * in microseconds elapsed since the start of the Composition.
+ * This method exploits the Composition's getElapsedRealTime
+ * method to take into account any tempo changes that appear
+ * in the section of the composition preceding i.
+ */
+ RealTime getRealAbsoluteTime(iterator i);
+
+ /**
+ * Returns the duration of the note event pointed to by i,
+ * in microseconds. This takes into account the tempo in
+ * force at i's position within the composition, as well as
+ * any tempo changes occurring during the event at i.
+ */
+ RealTime getRealSoundingDuration(iterator i);
+
+ /**
+ * Return a sounding duration (estimated) and start time for the
+ * note event pointed to by i. If host is true, i is expected to
+ * be the "host" note for one or more grace notes; if host is
+ * false, i is expected to point to a grace note. If the relevant
+ * expectation is not met, this function returns false. Otherwise
+ * the sounding time and duration are returned through t and d and
+ * the function returns true.
+ */
+ bool getGraceNoteTimeAndDuration(bool host, iterator i, timeT &t, timeT &d);
+};
+
+}
+
+#endif
diff --git a/src/base/Selection.cpp b/src/base/Selection.cpp
new file mode 100644
index 0000000..6e5ca2f
--- /dev/null
+++ b/src/base/Selection.cpp
@@ -0,0 +1,318 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include "Selection.h"
+#include "Segment.h"
+#include "SegmentNotationHelper.h"
+#include "BaseProperties.h"
+
+namespace Rosegarden {
+
+EventSelection::EventSelection(Segment& t) :
+ m_originalSegment(t),
+ m_beginTime(0),
+ m_endTime(0),
+ m_haveRealStartTime(false)
+{
+ t.addObserver(this);
+}
+
+EventSelection::EventSelection(Segment& t, timeT beginTime, timeT endTime, bool overlap) :
+ m_originalSegment(t),
+ m_beginTime(0),
+ m_endTime(0),
+ m_haveRealStartTime(false)
+{
+ t.addObserver(this);
+
+ Segment::iterator i = t.findTime(beginTime);
+ Segment::iterator j = t.findTime(endTime);
+
+ if (i != t.end()) {
+ m_beginTime = (*i)->getAbsoluteTime();
+ while (i != j) {
+ m_endTime = (*i)->getAbsoluteTime() + (*i)->getDuration();
+ m_segmentEvents.insert(*i);
+ ++i;
+ }
+ m_haveRealStartTime = true;
+ }
+
+ // Find events overlapping the beginning
+ //
+ if (overlap) {
+ i = t.findTime(beginTime);
+
+ while (i != t.begin() && i != t.end() && i != j) {
+
+ if ((*i)->getAbsoluteTime() + (*i)->getDuration() > beginTime)
+ {
+ m_segmentEvents.insert(*i); // duplicates are filtered automatically
+ m_beginTime = (*i)->getAbsoluteTime();
+ }
+ else
+ break;
+
+ --i;
+ }
+
+ }
+
+}
+
+EventSelection::EventSelection(const EventSelection &sel) :
+ SegmentObserver(),
+ m_originalSegment(sel.m_originalSegment),
+ m_segmentEvents(sel.m_segmentEvents),
+ m_beginTime(sel.m_beginTime),
+ m_endTime(sel.m_endTime),
+ m_haveRealStartTime(sel.m_haveRealStartTime)
+{
+ m_originalSegment.addObserver(this);
+}
+
+EventSelection::~EventSelection()
+{
+ m_originalSegment.removeObserver(this);
+}
+
+void EventSelection::addEvent(Event *e)
+{
+ timeT eventDuration = e->getDuration();
+ if (eventDuration == 0) eventDuration = 1;
+
+ if (contains(e)) return;
+
+ if (e->getAbsoluteTime() < m_beginTime || !m_haveRealStartTime) {
+ m_beginTime = e->getAbsoluteTime();
+ m_haveRealStartTime = true;
+ }
+ if (e->getAbsoluteTime() + eventDuration > m_endTime) {
+ m_endTime = e->getAbsoluteTime() + eventDuration;
+ }
+ m_segmentEvents.insert(e);
+}
+
+void EventSelection::addFromSelection(EventSelection *sel)
+{
+ for (eventcontainer::iterator i = sel->getSegmentEvents().begin();
+ i != sel->getSegmentEvents().end(); ++i) {
+ if (!contains(*i)) addEvent(*i);
+ }
+}
+
+void EventSelection::removeEvent(Event *e)
+{
+ std::pair<eventcontainer::iterator, eventcontainer::iterator>
+ interval = m_segmentEvents.equal_range(e);
+
+ for (eventcontainer::iterator it = interval.first;
+ it != interval.second; it++)
+ {
+ if (*it == e) {
+ m_segmentEvents.erase(it);
+ return;
+ }
+ }
+}
+
+bool EventSelection::contains(Event *e) const
+{
+ std::pair<eventcontainer::const_iterator, eventcontainer::const_iterator>
+ interval = m_segmentEvents.equal_range(e);
+
+ for (eventcontainer::const_iterator it = interval.first;
+ it != interval.second; ++it)
+ {
+ if (*it == e) return true;
+ }
+
+ return false;
+}
+
+bool EventSelection::contains(const std::string &type) const
+{
+ for (eventcontainer::const_iterator i = m_segmentEvents.begin();
+ i != m_segmentEvents.end(); ++i) {
+ if ((*i)->isa(type)) return true;
+ }
+ return false;
+}
+
+timeT EventSelection::getTotalDuration() const
+{
+ return getEndTime() - getStartTime();
+}
+
+EventSelection::RangeList
+EventSelection::getRanges() const
+{
+ RangeList ranges;
+
+ Segment::iterator i = m_originalSegment.findTime(getStartTime());
+ Segment::iterator j = i;
+ Segment::iterator k = m_originalSegment.findTime(getEndTime());
+
+ while (j != k) {
+
+ for (j = i; j != k && contains(*j); ++j);
+
+ if (j != i) {
+ ranges.push_back(RangeList::value_type(i, j));
+ }
+
+ for (i = j; i != k && !contains(*i); ++i);
+ j = i;
+ }
+
+ return ranges;
+}
+
+EventSelection::RangeTimeList
+EventSelection::getRangeTimes() const
+{
+ RangeList ranges(getRanges());
+ RangeTimeList rangeTimes;
+
+ for (RangeList::iterator i = ranges.begin(); i != ranges.end(); ++i) {
+ timeT startTime = m_originalSegment.getEndTime();
+ timeT endTime = m_originalSegment.getEndTime();
+ if (i->first != m_originalSegment.end()) {
+ startTime = (*i->first)->getAbsoluteTime();
+ }
+ if (i->second != m_originalSegment.end()) {
+ endTime = (*i->second)->getAbsoluteTime();
+ }
+ rangeTimes.push_back(RangeTimeList::value_type(startTime, endTime));
+ }
+
+ return rangeTimes;
+}
+
+void
+EventSelection::eventRemoved(const Segment *s, Event *e)
+{
+ if (s == &m_originalSegment /*&& contains(e)*/) {
+ removeEvent(e);
+ }
+}
+
+void
+EventSelection::segmentDeleted(const Segment *)
+{
+ /*
+ std::cerr << "WARNING: EventSelection notified of segment deletion: this is probably a bug "
+ << "(selection should have been deleted before segment)" << std::endl;
+ */
+}
+
+bool SegmentSelection::hasNonAudioSegment() const
+{
+ for (const_iterator i = begin(); i != end(); ++i) {
+ if ((*i)->getType() == Segment::Internal)
+ return true;
+ }
+ return false;
+}
+
+
+TimeSignatureSelection::TimeSignatureSelection() { }
+
+TimeSignatureSelection::TimeSignatureSelection(Composition &composition,
+ timeT beginTime,
+ timeT endTime,
+ bool includeOpeningTimeSig)
+{
+ int n = composition.getTimeSignatureNumberAt(endTime);
+
+ for (int i = composition.getTimeSignatureNumberAt(beginTime);
+ i <= n;
+ ++i) {
+
+ if (i < 0) continue;
+
+ std::pair<timeT, TimeSignature> sig =
+ composition.getTimeSignatureChange(i);
+
+ if (sig.first < endTime) {
+ if (sig.first < beginTime) {
+ if (includeOpeningTimeSig) {
+ sig.first = beginTime;
+ } else {
+ continue;
+ }
+ }
+ addTimeSignature(sig.first, sig.second);
+ }
+ }
+}
+
+TimeSignatureSelection::~TimeSignatureSelection() { }
+
+void
+TimeSignatureSelection::addTimeSignature(timeT t, TimeSignature timeSig)
+{
+ m_timeSignatures.insert(timesigcontainer::value_type(t, timeSig));
+}
+
+TempoSelection::TempoSelection() { }
+
+TempoSelection::TempoSelection(Composition &composition,
+ timeT beginTime,
+ timeT endTime,
+ bool includeOpeningTempo)
+{
+ int n = composition.getTempoChangeNumberAt(endTime);
+
+ for (int i = composition.getTempoChangeNumberAt(beginTime);
+ i <= n;
+ ++i) {
+
+ if (i < 0) continue;
+
+ std::pair<timeT, tempoT> change = composition.getTempoChange(i);
+
+ if (change.first < endTime) {
+ if (change.first < beginTime) {
+ if (includeOpeningTempo) {
+ change.first = beginTime;
+ } else {
+ continue;
+ }
+ }
+ std::pair<bool, tempoT> ramping =
+ composition.getTempoRamping(i, false);
+ addTempo(change.first, change.second,
+ ramping.first ? ramping.second : -1);
+ }
+ }
+}
+
+TempoSelection::~TempoSelection() { }
+
+void
+TempoSelection::addTempo(timeT t, tempoT tempo, tempoT targetTempo)
+{
+ m_tempos.insert(tempocontainer::value_type
+ (t, tempochange(tempo, targetTempo)));
+}
+
+}
diff --git a/src/base/Selection.h b/src/base/Selection.h
new file mode 100644
index 0000000..93ce4b4
--- /dev/null
+++ b/src/base/Selection.h
@@ -0,0 +1,263 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef SELECTION_H
+#define SELECTION_H
+
+#include <set>
+#include "PropertyName.h"
+#include "Event.h"
+#include "Segment.h"
+#include "NotationTypes.h"
+#include "Composition.h"
+
+namespace Rosegarden {
+
+/**
+ * EventSelection records a (possibly non-contiguous) selection
+ * of Events in a single Segment, used for cut'n paste operations.
+ * It does not take a copy of those Events, it just remembers
+ * which ones they are.
+ */
+
+class EventSelection : public SegmentObserver
+{
+public:
+ typedef std::multiset<Event*, Event::EventCmp> eventcontainer;
+
+ /**
+ * Construct an empty EventSelection based on the given Segment.
+ */
+ EventSelection(Segment &);
+
+ /**
+ * Construct an EventSelection selecting all the events in the
+ * given range of the given Segment. Set overlap if you want
+ * to include Events overlapping the selection edges.
+ */
+ EventSelection(Segment &, timeT beginTime, timeT endTime, bool overlap = false);
+
+ EventSelection(const EventSelection&);
+
+ virtual ~EventSelection();
+
+ /**
+ * Add an Event to the selection. The Event should come from
+ * the Segment that was passed to the constructor. Will
+ * silently drop any event that is already in the selection.
+ */
+ void addEvent(Event* e);
+
+ /**
+ * Add all the Events in the given Selection to this one.
+ * Will silently drop any events that are already in the
+ * selection.
+ */
+ void addFromSelection(EventSelection *sel);
+
+ /**
+ * If the given Event is in the selection, take it out.
+ */
+ void removeEvent(Event *e);
+
+ /**
+ * Test whether a given Event (in the Segment) is part of
+ * this selection.
+ */
+ bool contains(Event *e) const;
+
+ /**
+ * Return true if there are any events of the given type in
+ * this selection. Slow.
+ */
+ bool contains(const std::string &eventType) const;
+
+ /**
+ * Return the time at which the first Event in the selection
+ * begins.
+ */
+ timeT getStartTime() const { return m_beginTime; }
+
+ /**
+ * Return the time at which the last Event in the selection ends.
+ */
+ timeT getEndTime() const { return m_endTime; }
+
+ /**
+ * Return the total duration spanned by the selection.
+ */
+ timeT getTotalDuration() const;
+
+ typedef std::vector<std::pair<Segment::iterator,
+ Segment::iterator> > RangeList;
+ /**
+ * Return a set of ranges spanned by the selection, such that
+ * each range covers only events within the selection.
+ */
+ RangeList getRanges() const;
+
+ typedef std::vector<std::pair<timeT, timeT> > RangeTimeList;
+ /**
+ * Return a set of times spanned by the selection, such that
+ * each time range covers only events within the selection.
+ */
+ RangeTimeList getRangeTimes() const;
+
+ /**
+ * Return the number of events added to this selection.
+ */
+ unsigned int getAddedEvents() const { return m_segmentEvents.size(); }
+
+ const eventcontainer &getSegmentEvents() const { return m_segmentEvents; }
+ eventcontainer &getSegmentEvents() { return m_segmentEvents; }
+
+ const Segment &getSegment() const { return m_originalSegment; }
+ Segment &getSegment() { return m_originalSegment; }
+
+ // SegmentObserver methods
+ virtual void eventAdded(const Segment *, Event *) { }
+ virtual void eventRemoved(const Segment *, Event *);
+ virtual void endMarkerTimeChanged(const Segment *, bool) { }
+ virtual void segmentDeleted(const Segment *);
+
+private:
+ EventSelection &operator=(const EventSelection &);
+
+protected:
+ //--------------- Data members ---------------------------------
+
+ Segment& m_originalSegment;
+
+ /// pointers to Events in the original Segment
+ eventcontainer m_segmentEvents;
+
+ timeT m_beginTime;
+ timeT m_endTime;
+ bool m_haveRealStartTime;
+};
+
+
+/**
+ * SegmentSelection is much simpler than EventSelection, we don't
+ * need to do much with this really
+ */
+
+class SegmentSelection : public std::set<Segment *>
+{
+public:
+ bool hasNonAudioSegment() const;
+};
+
+
+/**
+ * A selection that includes (only) time signatures. Unlike
+ * EventSelection, this does copy its contents, not just refer to
+ * them.
+ */
+class TimeSignatureSelection
+{
+public:
+ /**
+ * Construct an empty TimeSignatureSelection.
+ */
+ TimeSignatureSelection();
+
+ /**
+ * Construct a TimeSignatureSelection containing all the time
+ * signatures in the given range of the given Composition.
+ *
+ * If includeOpeningTimeSig is true, the selection will start with
+ * a duplicate of the time signature (if any) that is already in
+ * force at beginTime. Otherwise the selection will only start
+ * with a time signature at beginTime if there is an explicit
+ * signature there in the source composition.
+ */
+ TimeSignatureSelection(Composition &, timeT beginTime, timeT endTime,
+ bool includeOpeningTimeSig);
+
+ virtual ~TimeSignatureSelection();
+
+ /**
+ * Add a time signature to the selection.
+ */
+ void addTimeSignature(timeT t, TimeSignature timeSig);
+
+ typedef std::multimap<timeT, TimeSignature> timesigcontainer;
+
+ const timesigcontainer &getTimeSignatures() const { return m_timeSignatures; }
+ timesigcontainer::const_iterator begin() const { return m_timeSignatures.begin(); }
+ timesigcontainer::const_iterator end() const { return m_timeSignatures.end(); }
+ bool empty() const { return begin() == end(); }
+
+protected:
+ timesigcontainer m_timeSignatures;
+};
+
+
+/**
+ * A selection that includes (only) tempo changes.
+ */
+
+class TempoSelection
+{
+public:
+ /**
+ * Construct an empty TempoSelection.
+ */
+ TempoSelection();
+
+ /**
+ * Construct a TempoSelection containing all the time
+ * signatures in the given range of the given Composition.
+ *
+ * If includeOpeningTempo is true, the selection will start with a
+ * duplicate of the tempo (if any) that is already in force at
+ * beginTime. Otherwise the selection will only start with a
+ * tempo at beginTime if there is an explicit tempo change there
+ * in the source composition.
+ */
+ TempoSelection(Composition &, timeT beginTime, timeT endTime,
+ bool includeOpeningTempo);
+
+ virtual ~TempoSelection();
+
+ /**
+ * Add a time signature to the selection.
+ */
+ void addTempo(timeT t, tempoT tempo, tempoT targetTempo = -1);
+
+ typedef std::pair<tempoT, tempoT> tempochange;
+ typedef std::multimap<timeT, tempochange> tempocontainer;
+
+ const tempocontainer &getTempos() const { return m_tempos; }
+ tempocontainer::const_iterator begin() const { return m_tempos.begin(); }
+ tempocontainer::const_iterator end() const { return m_tempos.end(); }
+ bool empty() const { return begin() == end(); }
+
+protected:
+ tempocontainer m_tempos;
+};
+
+
+
+}
+
+#endif
diff --git a/src/base/Sets.cpp b/src/base/Sets.cpp
new file mode 100644
index 0000000..5111f37
--- /dev/null
+++ b/src/base/Sets.cpp
@@ -0,0 +1,108 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include "Sets.h"
+
+#include "Event.h"
+#include "BaseProperties.h"
+#include "Quantizer.h"
+
+namespace Rosegarden {
+
+template <>
+Event *
+AbstractSet<Event, Segment>::getAsEvent(const Segment::iterator &i)
+{
+ return *i;
+}
+
+template <>
+Event *
+AbstractSet<Event, CompositionTimeSliceAdapter>::getAsEvent(const CompositionTimeSliceAdapter::iterator &i)
+{
+ return *i;
+}
+
+/*
+ * This ridiculous shit appears to be necessary to please gcc.
+ * Compiler bug? My own misunderstanding of some huge crock of crap
+ * in the C++ standard? No idea. If you know, tell me. Anyway, as
+ * it stands I can't get any calls to get<> or set<> from the Set or
+ * Chord methods to compile -- the compiler appears to parse the
+ * opening < of the template arguments as an operator<. Hence this.
+ */
+
+extern long
+get__Int(Event *e, const PropertyName &name)
+{
+ return e->get<Int>(name);
+}
+
+extern bool
+get__Bool(Event *e, const PropertyName &name)
+{
+ return e->get<Bool>(name);
+}
+
+extern std::string
+get__String(Event *e, const PropertyName &name)
+{
+ return e->get<String>(name);
+}
+
+extern bool
+get__Int(Event *e, const PropertyName &name, long &ref)
+{
+ return e->get<Int>(name, ref);
+}
+
+extern bool
+get__Bool(Event *e, const PropertyName &name, bool &ref)
+{
+ return e->get<Bool>(name, ref);
+}
+
+extern bool
+get__String(Event *e, const PropertyName &name, std::string &ref)
+{
+ return e->get<String>(name, ref);
+}
+
+extern bool
+isPersistent__Bool(Event *e, const PropertyName &name)
+{
+ return e->isPersistent<Bool>(name);
+}
+
+extern void
+setMaybe__Int(Event *e, const PropertyName &name, long value)
+{
+ e->setMaybe<Int>(name, value);
+}
+
+extern void
+setMaybe__String(Event *e, const PropertyName &name, const std::string &value)
+{
+ e->setMaybe<String>(name, value);
+}
+
+}
+
diff --git a/src/base/Sets.h b/src/base/Sets.h
new file mode 100644
index 0000000..4fe14d1
--- /dev/null
+++ b/src/base/Sets.h
@@ -0,0 +1,698 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _SETS_H_
+#define _SETS_H_
+
+#include <vector>
+#include <algorithm>
+
+#include "Event.h"
+#include "Segment.h"
+#include "CompositionTimeSliceAdapter.h"
+#include "BaseProperties.h"
+#include "NotationTypes.h"
+#include "MidiTypes.h"
+#include "Quantizer.h"
+
+namespace Rosegarden
+{
+
+class Quantizer;
+
+/**
+ * A "set" in Rosegarden terminology is a collection of elements found
+ * in a container (indeed, a subset of that container) all of which
+ * share a particular property and are located near to one another:
+ * generally either contiguous or within the same bar. The elements
+ * are most usually Events and the container most usually a Segment,
+ * and although this does not have to be the case (for other examples
+ * see gui/notationsets.h), the elements do have to be convertible to
+ * Events somehow.
+ *
+ * To construct a set requires (at least) a container reference plus
+ * an iterator into that container. The constructor (or more
+ * precisely the initialise() method called by the constructor) then
+ * scans the surrounding area of the list for the maximal set of
+ * contiguous or within-the-same-bar elements before and after the
+ * passed-in iterator such that all elements are in the same set
+ * (i.e. Chord, BeamedGroup etc) as the one that the passed-in
+ * iterator pointed to.
+ *
+ * The extents of the set within the list can then be discovered via
+ * getInitialElement() and getFinalElement(). If the iterator passed
+ * in to the constructor was at end() or did not point to an element
+ * that could be a member of this kind of set, getInitialElement()
+ * will return end(); if the passed-in iterator pointed to the only
+ * member of this set, getInitialElement() and getFinalElement() will
+ * be equal.
+ *
+ * These classes are not intended to be stored anywhere; all they
+ * contain is iterators into the main container, and those might not
+ * persist. Instead you should create these on-the-fly when you want,
+ * for example, to consider a note as part of a chord; and then you
+ * should let them expire when you've finished with them.
+ */
+
+template <class Element, class Container>
+class AbstractSet // abstract base
+{
+public:
+ typedef typename Container::iterator Iterator;
+
+ virtual ~AbstractSet() { }
+
+ /**
+ * getInitialElement() returns end() if there are no elements in
+ * the set. getInitialElement() == getFinalElement() if there is
+ * only one element in the set
+ */
+ Iterator getInitialElement() const { return m_initial; }
+ Iterator getFinalElement() const { return m_final; }
+
+ /// only return note elements; will return end() if there are none
+ Iterator getInitialNote() const { return m_initialNote; }
+ Iterator getFinalNote() const { return m_finalNote; }
+
+ /**
+ * only elements with duration > 0 are candidates for shortest and
+ * longest; these will return end() if there are no such elements
+ */
+ Iterator getLongestElement() const { return m_longest; }
+ Iterator getShortestElement() const { return m_shortest; }
+
+ /// these will return end() if there are no note elements in the set
+ Iterator getHighestNote() const { return m_highest; }
+ Iterator getLowestNote() const { return m_lowest; }
+
+ virtual bool contains(const Iterator &) const = 0;
+
+ /// Return the pointed-to element, in Event form (public to work around gcc-2.95 bug)
+ static Event *getAsEvent(const Iterator &i);
+
+protected:
+ AbstractSet(Container &c, Iterator elementInSet, const Quantizer *);
+ void initialise();
+
+ /// Return true if this element is not definitely beyond bounds of set
+ virtual bool test(const Iterator &i) = 0;
+
+ /// Return true if this element, known to test() true, is a set member
+ virtual bool sample(const Iterator &i, bool goingForwards);
+
+ Container &getContainer() const { return m_container; }
+ const Quantizer &getQuantizer() const { return *m_quantizer; }
+
+ // Data members:
+
+ Container &m_container;
+ Iterator m_initial, m_final, m_initialNote, m_finalNote;
+ Iterator m_shortest, m_longest, m_highest, m_lowest;
+ Iterator m_baseIterator;
+ const Quantizer *m_quantizer;
+};
+
+
+/**
+ * Chord is subclassed from a vector of iterators; this vector
+ * contains iterators pointing at all the notes in the chord, in
+ * ascending order of pitch. You can also track through all the
+ * events in the chord by iterating from getInitialElement() to
+ * getFinalElement(), but this will only get them in the order in
+ * which they appear in the original container.
+ *
+ * However, the notes in a chord might not be contiguous events in the
+ * container, as there could be other zero-duration events such as
+ * controllers (or even conceivably some short rests) between notes in
+ * the same chord, depending on the quantization settings. The Chord
+ * itself only contains iterators pointing at the notes, so if you
+ * want to iterate through all events spanned by the Chord, iterate
+ * from getInitialElement() to getFinalElement() instead.
+ *
+ * This class can tell you various things about the chord it
+ * describes, but not everything. It can't tell you whether the
+ * chord has a stem, for example, because that depends on the
+ * notation style and system in use. See gui/notationsets.h
+ * for a NotationChord class (subclassed from this) that can.
+ */
+
+template <class Element, class Container, bool singleStaff>
+class GenericChord : public AbstractSet<Element, Container>,
+ public std::vector<typename Container::iterator>
+{
+public:
+ typedef typename Container::iterator Iterator;
+
+ /* You only need to provide the clef and key if the notes
+ making up your chord lack HEIGHT_ON_STAFF properties, in
+ which case this constructor will write those properties
+ in to the chord for you */
+ GenericChord(Container &c,
+ Iterator elementInChord,
+ const Quantizer *quantizer,
+ PropertyName stemUpProperty = PropertyName::EmptyPropertyName);
+
+ virtual ~GenericChord();
+
+ virtual int getMarkCountForChord() const;
+ virtual std::vector<Mark> getMarksForChord() const;
+ virtual std::vector<int> getPitches() const;
+ virtual bool contains(const Iterator &) const;
+
+ /**
+ * Return an iterator pointing to the previous note before this
+ * chord, or container's end() if there is no previous note.
+ */
+ virtual Iterator getPreviousNote();
+
+ /**
+ * Return an iterator pointing to the next note after this chord,
+ * or container's end() if there is no next note. Remember this
+ * class can't know about Segment end marker times, so if your
+ * container is a Segment, check the returned note is actually
+ * before the end marker.
+ */
+ virtual Iterator getNextNote();
+
+ /**
+ * It's possible for a chord to surround (in the segment) elements
+ * that are not members of the chord. This function returns an
+ * iterator pointing to the first of those after the iterator that
+ * was passed to the chord's constructor. If there are none, it
+ * returns the container's end().
+ */
+ virtual Iterator getFirstElementNotInChord();
+
+ virtual int getSubOrdering() { return m_subordering; }
+
+protected:
+ virtual bool test(const Iterator&);
+ virtual bool sample(const Iterator&, bool goingForwards);
+
+ class PitchGreater {
+ public:
+ bool operator()(const Iterator &a, const Iterator &b);
+ };
+
+ void copyGroupProperties(Event *e0, Event *e1) const;
+
+ //--------------- Data members ---------------------------------
+
+ PropertyName m_stemUpProperty;
+ timeT m_time;
+ int m_subordering;
+ Iterator m_firstReject;
+};
+
+
+
+///
+/// Implementation only from here on.
+///
+
+// forward declare hack functions -- see Sets.C for an explanation
+
+extern long
+get__Int(Event *e, const PropertyName &name);
+
+extern bool
+get__Bool(Event *e, const PropertyName &name);
+
+extern std::string
+get__String(Event *e, const PropertyName &name);
+
+extern bool
+get__Int(Event *e, const PropertyName &name, long &ref);
+
+extern bool
+get__Bool(Event *e, const PropertyName &name, bool &ref);
+
+extern bool
+get__String(Event *e, const PropertyName &name, std::string &ref);
+
+extern bool
+isPersistent__Bool(Event *e, const PropertyName &name);
+
+extern void
+setMaybe__Int(Event *e, const PropertyName &name, long value);
+
+extern void
+setMaybe__String(Event *e, const PropertyName &name, const std::string &value);
+
+
+
+template <class Element, class Container>
+AbstractSet<Element, Container>::AbstractSet(Container &c,
+ Iterator i, const Quantizer *q):
+ m_container(c),
+ m_initial(c.end()),
+ m_final(c.end()),
+ m_initialNote(c.end()),
+ m_finalNote(c.end()),
+ m_shortest(c.end()),
+ m_longest(c.end()),
+ m_highest(c.end()),
+ m_lowest(c.end()),
+ m_baseIterator(i),
+ m_quantizer(q)
+{
+ // ...
+}
+
+template <class Element, class Container>
+void
+AbstractSet<Element, Container>::initialise()
+{
+ if (m_baseIterator == getContainer().end() || !test(m_baseIterator)) return;
+
+ m_initial = m_baseIterator;
+ m_final = m_baseIterator;
+ sample(m_baseIterator, true);
+
+ if (getAsEvent(m_baseIterator)->isa(Note::EventType)) {
+ m_initialNote = m_baseIterator;
+ m_finalNote = m_baseIterator;
+ }
+
+ Iterator i, j;
+
+ // first scan back to find an element not in the desired set,
+ // sampling everything as far back as the one after it
+
+ for (i = j = m_baseIterator; i != getContainer().begin() && test(--j); i = j){
+ if (sample(j, false)) {
+ m_initial = j;
+ if (getAsEvent(j)->isa(Note::EventType)) {
+ m_initialNote = j;
+ if (m_finalNote == getContainer().end()) {
+ m_finalNote = j;
+ }
+ }
+ }
+ }
+
+ j = m_baseIterator;
+
+ // then scan forwards to find an element not in the desired set,
+ // sampling everything as far forward as the one before it
+
+ for (i = j = m_baseIterator; ++j != getContainer().end() && test(j); i = j) {
+ if (sample(j, true)) {
+ m_final = j;
+ if (getAsEvent(j)->isa(Note::EventType)) {
+ m_finalNote = j;
+ if (m_initialNote == getContainer().end()) {
+ m_initialNote = j;
+ }
+ }
+ }
+ }
+}
+
+template <class Element, class Container>
+bool
+AbstractSet<Element, Container>::sample(const Iterator &i, bool)
+{
+ const Quantizer &q(getQuantizer());
+ Event *e = getAsEvent(i);
+ timeT d(q.getQuantizedDuration(e));
+
+ if (e->isa(Note::EventType) || d > 0) {
+ if (m_longest == getContainer().end() ||
+ d > q.getQuantizedDuration(getAsEvent(m_longest))) {
+// std::cerr << "New longest in set at duration " << d << " and time " << e->getAbsoluteTime() << std::endl;
+ m_longest = i;
+ }
+ if (m_shortest == getContainer().end() ||
+ d < q.getQuantizedDuration(getAsEvent(m_shortest))) {
+// std::cerr << "New shortest in set at duration " << d << " and time " << e->getAbsoluteTime() << std::endl;
+ m_shortest = i;
+ }
+ }
+
+ if (e->isa(Note::EventType)) {
+ long p = get__Int(e, BaseProperties::PITCH);
+
+ if (m_highest == getContainer().end() ||
+ p > get__Int(getAsEvent(m_highest), BaseProperties::PITCH)) {
+// std::cerr << "New highest in set at pitch " << p << " and time " << e->getAbsoluteTime() << std::endl;
+ m_highest = i;
+ }
+ if (m_lowest == getContainer().end() ||
+ p < get__Int(getAsEvent(m_lowest), BaseProperties::PITCH)) {
+// std::cerr << "New lowest in set at pitch " << p << " and time " << e->getAbsoluteTime() << std::endl;
+ m_lowest = i;
+ }
+ }
+
+ return true;
+}
+
+
+//////////////////////////////////////////////////////////////////////
+
+template <class Element, class Container, bool singleStaff>
+GenericChord<Element, Container, singleStaff>::GenericChord(Container &c,
+ Iterator i,
+ const Quantizer *q,
+ PropertyName stemUpProperty) :
+ AbstractSet<Element, Container>(c, i, q),
+ m_stemUpProperty(stemUpProperty),
+ m_time(q->getQuantizedAbsoluteTime(getAsEvent(i))),
+ m_subordering(getAsEvent(i)->getSubOrdering()),
+ m_firstReject(c.end())
+{
+ AbstractSet<Element, Container>::initialise();
+
+ if (std::vector<typename Container::iterator>::size() > 1) {
+ std::stable_sort(std::vector<typename Container::iterator>::begin(),
+ std::vector<typename Container::iterator>::end(),
+ PitchGreater());
+ }
+
+/*!!! this should all be removed ultimately
+// std::cerr << "GenericChord::GenericChord: pitches are:" << std::endl;
+ int prevPitch = -999;
+ for (unsigned int i = 0; i < size(); ++i) {
+ try {
+ int pitch = getAsEvent((*this)[i])->get<Int>(BaseProperties::PITCH);
+// std::cerr << i << ": " << pitch << std::endl;
+ if (pitch < prevPitch) {
+ cerr << "ERROR: Pitch less than previous pitch (" << pitch
+ << " < " << prevPitch << ")" << std::endl;
+ throw(1);
+ }
+ } catch (Event::NoData) {
+ std::cerr << i << ": no pitch property" << std::endl;
+ }
+ }
+*/
+}
+
+template <class Element, class Container, bool singleStaff>
+GenericChord<Element, Container, singleStaff>::~GenericChord()
+{
+}
+
+template <class Element, class Container, bool singleStaff>
+bool
+GenericChord<Element, Container, singleStaff>::test(const Iterator &i)
+{
+ Event *e = getAsEvent(i);
+ if (AbstractSet<Element, Container>::
+ getQuantizer().getQuantizedAbsoluteTime(e) != m_time) {
+ return false;
+ }
+ if (e->getSubOrdering() != m_subordering) {
+ return false;
+ }
+
+ // We permit note or rest events etc here, because if a chord is a
+ // little staggered (for performance reasons) then it's not at all
+ // unlikely we could get other events (even rests) in the middle
+ // of it. So long as sample() only permits notes, we should be
+ // okay with this.
+ //
+ // (We're really only refusing things like clef and key events
+ // here, though it's slightly quicker [since most things are
+ // notes] and perhaps a bit safer to do it by testing for
+ // inclusion rather than exclusion.)
+
+ std::string type(e->getType());
+ return (type == Note::EventType ||
+ type == Note::EventRestType ||
+ type == Text::EventType ||
+ type == Indication::EventType ||
+ type == PitchBend::EventType ||
+ type == Controller::EventType ||
+ type == KeyPressure::EventType ||
+ type == ChannelPressure::EventType);
+}
+
+template <class Element, class Container, bool singleStaff>
+bool
+GenericChord<Element, Container, singleStaff>::sample(const Iterator &i,
+ bool goingForwards)
+{
+ Event *e1 = getAsEvent(i);
+ if (!e1->isa(Note::EventType)) {
+ if (goingForwards && m_firstReject == AbstractSet<Element, Container>::getContainer().end()) m_firstReject = i;
+ return false;
+ }
+
+ if (singleStaff) {
+
+ // Two notes that would otherwise be in a chord but are
+ // explicitly in different groups, or have stems pointing in
+ // different directions by design, or have substantially
+ // different x displacements, count as separate chords.
+
+ // Per #930473 ("Inserting notes into beamed chords is
+ // broken"), if one note is in a group and the other isn't,
+ // that's no problem. In fact we should actually modify the
+ // one that isn't so as to suggest that it is.
+
+ if (AbstractSet<Element, Container>::m_baseIterator != AbstractSet<Element, Container>::getContainer().end()) {
+
+ Event *e0 = getAsEvent(AbstractSet<Element, Container>::m_baseIterator);
+
+ if (!(m_stemUpProperty == PropertyName::EmptyPropertyName)) {
+
+ if (e0->has(m_stemUpProperty) &&
+ e1->has(m_stemUpProperty) &&
+ isPersistent__Bool(e0, m_stemUpProperty) &&
+ isPersistent__Bool(e1, m_stemUpProperty) &&
+ get__Bool(e0, m_stemUpProperty) !=
+ get__Bool(e1, m_stemUpProperty)) {
+
+ if (goingForwards && m_firstReject == AbstractSet<Element, Container>::getContainer().end())
+ m_firstReject = i;
+ return false;
+ }
+ }
+
+ long dx0 = 0, dx1 = 0;
+ get__Int(e0, BaseProperties::DISPLACED_X, dx0);
+ get__Int(e1, BaseProperties::DISPLACED_X, dx1);
+ if (abs(dx0 - dx1) >= 700) {
+ if (goingForwards && m_firstReject == AbstractSet<Element, Container>::getContainer().end())
+ m_firstReject = i;
+ return false;
+ }
+
+ if (e0->has(BaseProperties::BEAMED_GROUP_ID)) {
+ if (e1->has(BaseProperties::BEAMED_GROUP_ID)) {
+ if (get__Int(e1, BaseProperties::BEAMED_GROUP_ID) !=
+ get__Int(e0, BaseProperties::BEAMED_GROUP_ID)) {
+ if (goingForwards && m_firstReject == AbstractSet<Element, Container>::getContainer().end())
+ m_firstReject = i;
+ return false;
+ }
+ } else {
+ copyGroupProperties(e0, e1); // #930473
+ }
+ } else {
+ if (e1->has(BaseProperties::BEAMED_GROUP_ID)) {
+ copyGroupProperties(e1, e0); // #930473
+ }
+ }
+ }
+ }
+
+ AbstractSet<Element, Container>::sample(i, goingForwards);
+ push_back(i);
+ return true;
+}
+
+template <class Element, class Container, bool singleStaff>
+void
+GenericChord<Element, Container, singleStaff>::copyGroupProperties(Event *e0,
+ Event *e1) const
+{
+ if (e0->has(BaseProperties::BEAMED_GROUP_TYPE)) {
+ setMaybe__String(e1, BaseProperties::BEAMED_GROUP_TYPE,
+ get__String(e0, BaseProperties::BEAMED_GROUP_TYPE));
+ }
+ if (e0->has(BaseProperties::BEAMED_GROUP_ID)) {
+ setMaybe__Int(e1, BaseProperties::BEAMED_GROUP_ID,
+ get__Int(e0, BaseProperties::BEAMED_GROUP_ID));
+ }
+ if (e0->has(BaseProperties::BEAMED_GROUP_TUPLET_BASE)) {
+ setMaybe__Int(e1, BaseProperties::BEAMED_GROUP_TUPLET_BASE,
+ get__Int(e0, BaseProperties::BEAMED_GROUP_TUPLET_BASE));
+ }
+ if (e0->has(BaseProperties::BEAMED_GROUP_TUPLED_COUNT)) {
+ setMaybe__Int(e1, BaseProperties::BEAMED_GROUP_TUPLED_COUNT,
+ get__Int(e0, BaseProperties::BEAMED_GROUP_TUPLED_COUNT));
+ }
+ if (e0->has(BaseProperties::BEAMED_GROUP_UNTUPLED_COUNT)) {
+ setMaybe__Int(e1, BaseProperties::BEAMED_GROUP_UNTUPLED_COUNT,
+ get__Int(e0, BaseProperties::BEAMED_GROUP_UNTUPLED_COUNT));
+ }
+}
+
+
+template <class Element, class Container, bool singleStaff>
+int
+GenericChord<Element, Container, singleStaff>::getMarkCountForChord() const
+{
+ // need to weed out duplicates
+
+ std::set<Mark> cmarks;
+
+ for (unsigned int i = 0; i < std::vector<typename Container::iterator>::size(); ++i) {
+
+ Event *e = getAsEvent((*this)[i]);
+ std::vector<Mark> marks(Marks::getMarks(*e));
+
+ for (std::vector<Mark>::iterator j = marks.begin(); j != marks.end(); ++j) {
+ cmarks.insert(*j);
+ }
+ }
+
+ return cmarks.size();
+}
+
+
+template <class Element, class Container, bool singleStaff>
+std::vector<Mark>
+GenericChord<Element, Container, singleStaff>::getMarksForChord() const
+{
+ std::vector<Mark> cmarks;
+
+ for (unsigned int i = 0; i < std::vector<typename Container::iterator>::size(); ++i) {
+
+ Event *e = getAsEvent((*this)[i]);
+ std::vector<Mark> marks(Marks::getMarks(*e));
+
+
+ for (std::vector<Mark>::iterator j = marks.begin(); j != marks.end(); ++j) {
+
+ // We permit multiple identical fingering marks per chord,
+ // but not any other sort
+ if (Marks::isFingeringMark(*j) ||
+ std::find(cmarks.begin(), cmarks.end(), *j) == cmarks.end()) {
+ cmarks.push_back(*j);
+ }
+ }
+ }
+
+ return cmarks;
+}
+
+
+template <class Element, class Container, bool singleStaff>
+std::vector<int>
+GenericChord<Element, Container, singleStaff>::getPitches() const
+{
+ std::vector<int> pitches;
+
+ for (typename std::vector<typename Container::iterator>::const_iterator
+ i = std::vector<typename Container::iterator>::begin(); i != std::vector<typename Container::iterator>::end(); ++i) {
+ if (getAsEvent(*i)->has(BaseProperties::PITCH)) {
+ int pitch = get__Int
+ (getAsEvent(*i), BaseProperties::PITCH);
+ if (pitches.size() > 0 && pitches[pitches.size()-1] == pitch)
+ continue;
+ pitches.push_back(pitch);
+ }
+ }
+
+ return pitches;
+}
+
+
+template <class Element, class Container, bool singleStaff>
+bool
+GenericChord<Element, Container, singleStaff>::contains(const Iterator &itr) const
+{
+ for (typename std::vector<typename Container::iterator>::const_iterator
+ i = std::vector<typename Container::iterator>::begin();
+ i != std::vector<typename Container::iterator>::end(); ++i) {
+ if (*i == itr) return true;
+ }
+ return false;
+}
+
+
+template <class Element, class Container, bool singleStaff>
+typename GenericChord<Element, Container, singleStaff>::Iterator
+GenericChord<Element, Container, singleStaff>::getPreviousNote()
+{
+ Iterator i(AbstractSet<Element, Container>::getInitialElement());
+ while (1) {
+ if (i == AbstractSet<Element, Container>::getContainer().begin()) return AbstractSet<Element, Container>::getContainer().end();
+ --i;
+ if (getAsEvent(i)->isa(Note::EventType)) {
+ return i;
+ }
+ }
+}
+
+
+template <class Element, class Container, bool singleStaff>
+typename GenericChord<Element, Container, singleStaff>::Iterator
+GenericChord<Element, Container, singleStaff>::getNextNote()
+{
+ Iterator i(AbstractSet<Element, Container>::getFinalElement());
+ while ( i != AbstractSet<Element, Container>::getContainer().end() &&
+ ++i != AbstractSet<Element, Container>::getContainer().end()) {
+ if (getAsEvent(i)->isa(Note::EventType)) {
+ return i;
+ }
+ }
+ return AbstractSet<Element, Container>::getContainer().end();
+}
+
+
+template <class Element, class Container, bool singleStaff>
+typename GenericChord<Element, Container, singleStaff>::Iterator
+GenericChord<Element, Container, singleStaff>::getFirstElementNotInChord()
+{
+ return m_firstReject;
+}
+
+
+template <class Element, class Container, bool singleStaff>
+bool
+GenericChord<Element, Container, singleStaff>::PitchGreater::operator()(const Iterator &a,
+ const Iterator &b)
+{
+ try {
+ long ap = get__Int(getAsEvent(a), BaseProperties::PITCH);
+ long bp = get__Int(getAsEvent(b), BaseProperties::PITCH);
+ return (ap < bp);
+ } catch (Event::NoData) {
+ std::cerr << "Bad karma: PitchGreater failed to find one or both pitches" << std::endl;
+ return false;
+ }
+}
+
+
+typedef GenericChord<Event, Segment, true> Chord;
+typedef GenericChord<Event, CompositionTimeSliceAdapter, false> GlobalChord;
+
+
+}
+
+
+#endif
+
diff --git a/src/base/SnapGrid.cpp b/src/base/SnapGrid.cpp
new file mode 100644
index 0000000..6d0061e
--- /dev/null
+++ b/src/base/SnapGrid.cpp
@@ -0,0 +1,192 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include "SnapGrid.h"
+#include "Composition.h"
+
+namespace Rosegarden {
+
+
+//////////////////////////////////////////////////////////////////////
+// SnapGrid
+//////////////////////////////////////////////////////////////////////
+
+
+const timeT SnapGrid::NoSnap = -1;
+const timeT SnapGrid::SnapToBar = -2;
+const timeT SnapGrid::SnapToBeat = -3;
+const timeT SnapGrid::SnapToUnit = -4;
+
+SnapGrid::SnapGrid(RulerScale *rulerScale, int ysnap) :
+ m_rulerScale(rulerScale),
+ m_snapTime(SnapToBeat),
+ m_ysnap(ysnap)
+{
+ // nothing else
+}
+
+void
+SnapGrid::setSnapTime(timeT snap)
+{
+ assert(snap > 0 ||
+ snap == NoSnap ||
+ snap == SnapToBar ||
+ snap == SnapToBeat ||
+ snap == SnapToUnit);
+ m_snapTime = snap;
+}
+
+timeT
+SnapGrid::getSnapSetting() const
+{
+ return m_snapTime;
+}
+
+timeT
+SnapGrid::getSnapTime(double x) const
+{
+ timeT time = m_rulerScale->getTimeForX(x);
+ return getSnapTime(time);
+}
+
+timeT
+SnapGrid::getSnapTime(timeT time) const
+{
+ if (m_snapTime == NoSnap) return 0;
+
+ Rosegarden::Composition *composition = m_rulerScale->getComposition();
+ int barNo = composition->getBarNumber(time);
+ std::pair<timeT, timeT> barRange = composition->getBarRange(barNo);
+
+ timeT snapTime = barRange.second - barRange.first;
+
+ if (m_snapTime == SnapToBeat) {
+ snapTime = composition->getTimeSignatureAt(time).getBeatDuration();
+ } else if (m_snapTime == SnapToUnit) {
+ snapTime = composition->getTimeSignatureAt(time).getUnitDuration();
+ } else if (m_snapTime != SnapToBar && m_snapTime < snapTime) {
+ snapTime = m_snapTime;
+ }
+
+ return snapTime;
+}
+
+timeT
+SnapGrid::snapX(double x, SnapDirection direction) const
+{
+ return snapTime(m_rulerScale->getTimeForX(x), direction);
+}
+
+timeT
+SnapGrid::snapTime(timeT time, SnapDirection direction) const
+{
+ if (m_snapTime == NoSnap) return time;
+
+ Rosegarden::Composition *composition = m_rulerScale->getComposition();
+ int barNo = composition->getBarNumber(time);
+ std::pair<timeT, timeT> barRange = composition->getBarRange(barNo);
+
+ timeT snapTime = barRange.second - barRange.first;
+
+ if (m_snapTime == SnapToBeat) {
+ snapTime = composition->getTimeSignatureAt(time).getBeatDuration();
+ } else if (m_snapTime == SnapToUnit) {
+ snapTime = composition->getTimeSignatureAt(time).getUnitDuration();
+ } else if (m_snapTime != SnapToBar && m_snapTime < snapTime) {
+ snapTime = m_snapTime;
+ }
+
+ timeT offset = (time - barRange.first);
+ timeT rounded = (offset / snapTime) * snapTime;
+
+ timeT left = rounded + barRange.first;
+ timeT right = left + snapTime;
+
+ if (direction == SnapLeft) return left;
+ else if (direction == SnapRight) return right;
+ else if ((offset - rounded) > (rounded + snapTime - offset)) return right;
+ else return left;
+}
+
+int
+SnapGrid::getYBin(int y) const
+{
+ if (m_ysnap == 0) return y;
+
+ int cy = 0;
+
+ std::map<int, int>::const_iterator i = m_ymultiple.begin();
+
+ int nextbin = -1;
+ if (i != m_ymultiple.end()) nextbin = i->first;
+
+ for (int b = 0; ; ++b) {
+
+ if (nextbin == b) {
+
+ cy += i->second * m_ysnap;
+ ++i;
+ if (i == m_ymultiple.end()) nextbin = -1;
+ else nextbin = i->first;
+
+ } else {
+
+ cy += m_ysnap;
+ }
+
+ if (cy > y) {
+ return b;
+ }
+ }
+}
+
+int
+SnapGrid::getYBinCoordinate(int bin) const
+{
+ if (m_ysnap == 0) return bin;
+
+ int y = 0;
+
+ std::map<int, int>::const_iterator i = m_ymultiple.begin();
+
+ int nextbin = -1;
+ if (i != m_ymultiple.end()) nextbin = i->first;
+
+ for (int b = 0; b < bin; ++b) {
+
+ if (nextbin == b) {
+
+ y += i->second * m_ysnap;
+ ++i;
+ if (i == m_ymultiple.end()) nextbin = -1;
+ else nextbin = i->first;
+
+ } else {
+
+ y += m_ysnap;
+ }
+ }
+
+ return y;
+}
+
+
+}
diff --git a/src/base/SnapGrid.h b/src/base/SnapGrid.h
new file mode 100644
index 0000000..e0c9ec5
--- /dev/null
+++ b/src/base/SnapGrid.h
@@ -0,0 +1,183 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _SNAP_GRID_H_
+#define _SNAP_GRID_H_
+
+#include "RulerScale.h"
+
+#include <map>
+
+namespace Rosegarden {
+
+/**
+ * SnapGrid is a class that maps x-coordinate onto time, using a
+ * RulerScale to get the mapping but constraining the results to a
+ * discrete set of suitable times.
+ *
+ * (It also snaps y-coordinates, but that bit isn't very interesting.)
+ */
+
+class SnapGrid
+{
+public:
+ /**
+ * Construct a SnapGrid that uses the given RulerScale for
+ * x-coordinate mappings and the given ysnap for y-coords.
+ * If ysnap is zero, y-coords are not snapped at all.
+ */
+ SnapGrid(RulerScale *rulerScale, int ysnap = 0);
+
+ static const timeT NoSnap;
+ static const timeT SnapToBar;
+ static const timeT SnapToBeat;
+ static const timeT SnapToUnit;
+
+ enum SnapDirection { SnapEither, SnapLeft, SnapRight };
+
+ /**
+ * Set the snap size of the grid to the given time.
+ * The snap time must be positive, or else one of the
+ * special constants NoSnap, SnapToBar, SnapToBeat or
+ * SnapToUnit.
+ * The default is SnapToBeat.
+ */
+ void setSnapTime(timeT snap);
+
+ /**
+ * Return the snap size of the grid, at the given x-coordinate.
+ * (The x-coordinate is required in case the built-in snap size is
+ * SnapToBar, SnapToBeat or SnapToUnit, in which case we need to
+ * know the current time signature.) Returns zero for NoSnap.
+ */
+ timeT getSnapTime(double x) const;
+
+ /**
+ * Return the snap setting -- the argument that was passed to
+ * setSnapTime. This differs from getSnapTime, which interprets
+ * the NoSnap, SnapToBar, SnapToBeat and SnapToUnit settings to
+ * return actual timeT values; instead this function returns those
+ * actual constants if set.
+ */
+ timeT getSnapSetting() const;
+
+ /**
+ * Return the snap size of the grid, at the given time. (The time
+ * is required in case the built-in snap size is SnapToBar,
+ * SnapToBeat or SnapToUnit, in which case we need to know the
+ * current time signature.) Returns zero for NoSnap.
+ */
+ timeT getSnapTime(timeT t) const;
+
+ /**
+ * Snap a given x-coordinate to the nearest time on the grid. Of
+ * course this also does x-to-time conversion, so it's useful even
+ * in NoSnap mode. If the snap time is greater than the bar
+ * duration at this point, the bar duration will be used instead.
+ *
+ * If d is SnapLeft or SnapRight, a time to the left or right
+ * respectively of the given coordinate will be returned;
+ * otherwise the nearest time on either side will be returned.
+ */
+ timeT snapX(double x, SnapDirection d = SnapEither) const;
+
+ /**
+ * Snap a given time to the nearest time on the grid. Unlike
+ * snapX, this is not useful in NoSnap mode. If the snap time is
+ * greater than the bar duration at this point, the bar duration
+ * will be used instead.
+ *
+ * If d is SnapLeft or SnapRight, a time to the left or right
+ * respectively of the given coordinate will be returned;
+ * otherwise the nearest time on either side will be returned.
+ */
+ timeT snapTime(timeT t, SnapDirection d = SnapEither) const;
+
+ /**
+ * Snap a given y-coordinate to the nearest lower bin coordinate.
+ */
+ int snapY(int y) const {
+ if (m_ysnap == 0) return y;
+ return getYBinCoordinate(getYBin(y));
+ }
+
+ /**
+ * Return the bin number for the given y-coordinate.
+ */
+ int getYBin(int y) const;
+
+ /**
+ * Return the y-coordinate of the grid line at the start of the
+ * given bin.
+ */
+ int getYBinCoordinate(int bin) const;
+
+ /**
+ * Set the default vertical step. This is used as the height for
+ * bins that have no specific height multiple set, and the base
+ * height for bins that have a multiple. Setting the Y snap here
+ * is equivalent to specifying it in the constructor.
+ */
+ void setYSnap(int ysnap) {
+ m_ysnap = ysnap;
+ }
+
+ /**
+ * Retrieve the default vertical step.
+ */
+ int getYSnap() const {
+ return m_ysnap;
+ }
+
+ /**
+ * Set the height multiple for a specific bin. The bin will be
+ * multiple * ysnap high. The default is 1 for all bins.
+ */
+ void setBinHeightMultiple(int bin, int multiple) {
+ m_ymultiple[bin] = multiple;
+ }
+
+ /**
+ * Retrieve the height multiple for a bin.
+ */
+ int getBinHeightMultiple(int bin) {
+ if (m_ymultiple.find(bin) == m_ymultiple.end()) return 1;
+ return m_ymultiple[bin];
+ }
+
+ RulerScale *getRulerScale() {
+ return m_rulerScale;
+ }
+
+ const RulerScale *getRulerScale() const {
+ return m_rulerScale;
+ }
+
+protected:
+ RulerScale *m_rulerScale; // I don't own this
+ timeT m_snapTime;
+ int m_ysnap;
+ std::map<int, int> m_ymultiple;
+};
+
+}
+
+#endif
diff --git a/src/base/SoftSynthDevice.cpp b/src/base/SoftSynthDevice.cpp
new file mode 100644
index 0000000..9a736b7
--- /dev/null
+++ b/src/base/SoftSynthDevice.cpp
@@ -0,0 +1,174 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include "SoftSynthDevice.h"
+#include "Instrument.h"
+#include "MidiTypes.h"
+
+#include <cstdio>
+#include <cstdlib>
+
+
+#if (__GNUC__ < 3)
+#include <strstream>
+#define stringstream strstream
+#else
+#include <sstream>
+#endif
+
+
+namespace Rosegarden
+{
+
+ControlList
+SoftSynthDevice::m_controlList;
+
+SoftSynthDevice::SoftSynthDevice() :
+ Device(0, "Default Soft Synth Device", Device::SoftSynth)
+{
+ checkControlList();
+}
+
+SoftSynthDevice::SoftSynthDevice(DeviceId id, const std::string &name) :
+ Device(id, name, Device::SoftSynth)
+{
+ checkControlList();
+}
+
+
+SoftSynthDevice::SoftSynthDevice(const SoftSynthDevice &dev) :
+ Device(dev.getId(), dev.getName(), dev.getType()),
+ Controllable()
+{
+ // Copy the instruments
+ //
+ InstrumentList insList = dev.getAllInstruments();
+ InstrumentList::iterator iIt = insList.begin();
+ for (; iIt != insList.end(); iIt++)
+ m_instruments.push_back(new Instrument(**iIt));
+}
+
+SoftSynthDevice::~SoftSynthDevice()
+{
+}
+
+void
+SoftSynthDevice::checkControlList()
+{
+ // Much as MidiDevice::generateDefaultControllers
+
+ static std::string controls[][9] = {
+ { "Pan", Rosegarden::Controller::EventType, "<none>", "0", "127", "64", "10", "2", "0" },
+ { "Chorus", Rosegarden::Controller::EventType, "<none>", "0", "127", "0", "93", "3", "1" },
+ { "Volume", Rosegarden::Controller::EventType, "<none>", "0", "127", "0", "7", "1", "2" },
+ { "Reverb", Rosegarden::Controller::EventType, "<none>", "0", "127", "0", "91", "3", "3" },
+ { "Sustain", Rosegarden::Controller::EventType, "<none>", "0", "127", "0", "64", "4", "-1" },
+ { "Expression", Rosegarden::Controller::EventType, "<none>", "0", "127", "100", "11", "2", "-1" },
+ { "Modulation", Rosegarden::Controller::EventType, "<none>", "0", "127", "0", "1", "4", "-1" },
+ { "PitchBend", Rosegarden::PitchBend::EventType, "<none>", "0", "16383", "8192", "1", "4", "-1" }
+ };
+
+ if (m_controlList.empty()) {
+
+ for (unsigned int i = 0; i < sizeof(controls) / sizeof(controls[0]); ++i) {
+
+ Rosegarden::ControlParameter con(controls[i][0],
+ controls[i][1],
+ controls[i][2],
+ atoi(controls[i][3].c_str()),
+ atoi(controls[i][4].c_str()),
+ atoi(controls[i][5].c_str()),
+ Rosegarden::MidiByte(atoi(controls[i][6].c_str())),
+ atoi(controls[i][7].c_str()),
+ atoi(controls[i][8].c_str()));
+ m_controlList.push_back(con);
+ }
+ }
+}
+
+const ControlParameter *
+SoftSynthDevice::getControlParameter(int index) const
+{
+ if (index >= 0 && ((unsigned int)index) < m_controlList.size())
+ return &m_controlList[index];
+ return 0;
+}
+
+const ControlParameter *
+SoftSynthDevice::getControlParameter(const std::string &type,
+ Rosegarden::MidiByte controllerValue) const
+{
+ ControlList::iterator it = m_controlList.begin();
+
+ for (; it != m_controlList.end(); ++it)
+ {
+ if (it->getType() == type)
+ {
+ // Return matched on type for most events
+ //
+ if (type != Rosegarden::Controller::EventType)
+ return &*it;
+
+ // Also match controller value for Controller events
+ //
+ if (it->getControllerValue() == controllerValue)
+ return &*it;
+ }
+ }
+
+ return 0;
+}
+
+std::string
+SoftSynthDevice::toXmlString()
+{
+ std::stringstream ssiDevice;
+ InstrumentList::iterator iit;
+
+ ssiDevice << " <device id=\"" << m_id
+ << "\" name=\"" << m_name
+ << "\" type=\"softsynth\">" << std::endl;
+
+ for (iit = m_instruments.begin(); iit != m_instruments.end(); ++iit)
+ ssiDevice << (*iit)->toXmlString();
+
+ ssiDevice << " </device>"
+#if (__GNUC__ < 3)
+ << std::endl << std::ends;
+#else
+ << std::endl;
+#endif
+
+ return ssiDevice.str();
+}
+
+
+// Add to instrument list
+//
+void
+SoftSynthDevice::addInstrument(Instrument *instrument)
+{
+ m_instruments.push_back(instrument);
+}
+
+}
+
+
diff --git a/src/base/SoftSynthDevice.h b/src/base/SoftSynthDevice.h
new file mode 100644
index 0000000..381a58b
--- /dev/null
+++ b/src/base/SoftSynthDevice.h
@@ -0,0 +1,70 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _SOFT_SYNTH_DEVICE_H_
+#define _SOFT_SYNTH_DEVICE_H_
+
+#include <string>
+
+#include "Device.h"
+#include "Instrument.h"
+#include "Controllable.h"
+
+namespace Rosegarden
+{
+
+class SoftSynthDevice : public Device, public Controllable
+{
+
+public:
+ SoftSynthDevice();
+ SoftSynthDevice(DeviceId id, const std::string &name);
+ virtual ~SoftSynthDevice();
+
+ // Copy constructor
+ //
+ SoftSynthDevice(const SoftSynthDevice &);
+
+ virtual void addInstrument(Instrument*);
+
+ // Turn into XML string
+ //
+ virtual std::string toXmlString();
+
+ virtual InstrumentList getAllInstruments() const { return m_instruments; }
+ virtual InstrumentList getPresentationInstruments() const
+ { return m_instruments; }
+
+ // implemented from Controllable interface
+ //
+ virtual const ControlList &getControlParameters() const { return m_controlList; }
+ virtual const ControlParameter *getControlParameter(int index) const;
+ virtual const ControlParameter *getControlParameter(const std::string &type,
+ MidiByte controllerNumber) const;
+
+private:
+ static ControlList m_controlList;
+ static void checkControlList();
+};
+
+}
+
+#endif
diff --git a/src/base/Staff.cpp b/src/base/Staff.cpp
new file mode 100644
index 0000000..e34aaca
--- /dev/null
+++ b/src/base/Staff.cpp
@@ -0,0 +1,213 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include "Staff.h"
+
+namespace Rosegarden
+{
+
+Staff::Staff(Segment &t) :
+ m_segment(t),
+ m_viewElementList(0)
+{
+ // empty
+}
+
+Staff::~Staff()
+{
+ if (m_viewElementList) m_segment.removeObserver(this);
+ notifySourceDeletion();
+ delete m_viewElementList;
+}
+
+ViewElementList *
+Staff::getViewElementList()
+{
+ return getViewElementList(m_segment.begin(), m_segment.end());
+}
+
+ViewElementList *
+Staff::getViewElementList(Segment::iterator from,
+ Segment::iterator to)
+{
+ if (!m_viewElementList) {
+
+ m_viewElementList = new ViewElementList;
+
+ for (Segment::iterator i = from; i != to; ++i) {
+
+ if (!wrapEvent(*i)) continue;
+
+ ViewElement *el = makeViewElement(*i);
+ m_viewElementList->insert(el);
+ }
+
+ m_segment.addObserver(this);
+
+ }
+
+ return m_viewElementList;
+}
+
+bool
+Staff::wrapEvent(Event *e)
+{
+ timeT emt = m_segment.getEndMarkerTime();
+ return
+ (e->getAbsoluteTime() < emt) ||
+ (e->getAbsoluteTime() == emt && e->getDuration() == 0);
+}
+
+ViewElementList::iterator
+Staff::findEvent(Event *e)
+{
+ // Note that we have to create this using the virtual
+ // makeViewElement, because the result of equal_range depends on
+ // the value of the view absolute time for the element, which
+ // depends on the particular subclass of ViewElement in use.
+
+ //!!! (This is also why this method has to be here and not in
+ // ViewElementList -- ViewElementList has no equivalent of
+ // makeViewElement. Possibly things like NotationElementList
+ // should be subclasses of ViewElementList that implement
+ // makeViewElement instead of having makeViewElement in Staff, but
+ // that's for another day.)
+
+ ViewElement *dummy = makeViewElement(e);
+
+ std::pair<ViewElementList::iterator,
+ ViewElementList::iterator>
+ r = m_viewElementList->equal_range(dummy);
+
+ delete dummy;
+
+ for (ViewElementList::iterator i = r.first; i != r.second; ++i) {
+ if ((*i)->event() == e) {
+ return i;
+ }
+ }
+
+ return m_viewElementList->end();
+}
+
+void
+Staff::eventAdded(const Segment *t, Event *e)
+{
+ assert(t == &m_segment);
+ (void)t; // avoid warnings
+
+ if (wrapEvent(e)) {
+ ViewElement *el = makeViewElement(e);
+ m_viewElementList->insert(el);
+ notifyAdd(el);
+ }
+}
+
+void
+Staff::eventRemoved(const Segment *t, Event *e)
+{
+ assert(t == &m_segment);
+ (void)t; // avoid warnings
+
+ // If we have it, lose it
+
+ ViewElementList::iterator i = findEvent(e);
+ if (i != m_viewElementList->end()) {
+ notifyRemove(*i);
+ m_viewElementList->erase(i);
+ return;
+ }
+
+// std::cerr << "Event at " << e->getAbsoluteTime() << ", notation time " << e->getNotationAbsoluteTime() << ", type " << e->getType()
+// << " not found in Staff" << std::endl;
+}
+
+void
+Staff::endMarkerTimeChanged(const Segment *segment, bool shorten)
+{
+ Segment *s = const_cast<Segment *>(segment);
+
+ assert(s == &m_segment);
+
+ if (shorten) {
+
+ m_viewElementList->erase
+ (m_viewElementList->findTime(s->getEndMarkerTime()),
+ m_viewElementList->end());
+
+ } else {
+
+ timeT myLastEltTime = s->getStartTime();
+ if (m_viewElementList->end() != m_viewElementList->begin()) {
+ ViewElementList::iterator i = m_viewElementList->end();
+ myLastEltTime = (*--i)->event()->getAbsoluteTime();
+ }
+
+ for (Segment::iterator j = s->findTime(myLastEltTime);
+ s->isBeforeEndMarker(j); ++j) {
+
+ ViewElementList::iterator newi = findEvent(*j);
+ if (newi == m_viewElementList->end()) {
+ m_viewElementList->insert(makeViewElement(*j));
+ }
+ }
+ }
+}
+void
+Staff::segmentDeleted(const Segment *s)
+{
+ assert(s == &m_segment);
+ (void)s; // avoid warnings
+ /*
+ std::cerr << "WARNING: Staff notified of segment deletion: this is probably a bug "
+ << "(staff should have been deleted before segment)" << std::endl;
+ */
+}
+
+void
+Staff::notifyAdd(ViewElement *e) const
+{
+ for (ObserverSet::const_iterator i = m_observers.begin();
+ i != m_observers.end(); ++i) {
+ (*i)->elementAdded(this, e);
+ }
+}
+
+void
+Staff::notifyRemove(ViewElement *e) const
+{
+ for (ObserverSet::const_iterator i = m_observers.begin();
+ i != m_observers.end(); ++i) {
+ (*i)->elementRemoved(this, e);
+ }
+}
+
+void
+Staff::notifySourceDeletion() const
+{
+ for (ObserverSet::const_iterator i = m_observers.begin();
+ i != m_observers.end(); ++i) {
+ (*i)->staffDeleted(this);
+ }
+}
+
+
+}
diff --git a/src/base/Staff.h b/src/base/Staff.h
new file mode 100644
index 0000000..ad06930
--- /dev/null
+++ b/src/base/Staff.h
@@ -0,0 +1,149 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _STAFF_H_
+#define _STAFF_H_
+
+#include "ViewElement.h"
+#include "Segment.h"
+
+#include <iostream>
+#include <cassert>
+
+namespace Rosegarden
+{
+
+class StaffObserver;
+
+/**
+ * Staff is the base class for classes which represent a Segment as an
+ * on-screen graphic. It manages the relationship between Segment/Event
+ * and specific implementations of ViewElement.
+ *
+ * The template argument T must be a subclass of ViewElement.
+ *
+ * Staff was formerly known as ViewElementsManager.
+ */
+class Staff : public SegmentObserver
+{
+public:
+ virtual ~Staff();
+
+ /**
+ * Create a new ViewElementList wrapping all Events in the
+ * segment, or return the previously created one
+ */
+ ViewElementList *getViewElementList();
+
+ /**
+ * Create a new ViewElementList wrapping Events in the
+ * [from, to[ interval, or return the previously created one
+ * (even if passed new arguments)
+ */
+ ViewElementList *getViewElementList(Segment::iterator from,
+ Segment::iterator to);
+
+ /**
+ * Return the Segment wrapped by this object
+ */
+ Segment &getSegment() { return m_segment; }
+
+ /**
+ * Return the Segment wrapped by this object
+ */
+ const Segment &getSegment() const { return m_segment; }
+
+ /**
+ * Return the location of the given event in this Staff
+ */
+ ViewElementList::iterator findEvent(Event *);
+
+ /**
+ * SegmentObserver method - called after the event has been added to
+ * the segment
+ */
+ virtual void eventAdded(const Segment *, Event *);
+
+ /**
+ * SegmentObserver method - called after the event has been removed
+ * from the segment, and just before it is deleted
+ */
+ virtual void eventRemoved(const Segment *, Event *);
+
+ /**
+ * SegmentObserver method - called after the segment's end marker
+ * time has been changed
+ */
+ virtual void endMarkerTimeChanged(const Segment *, bool shorten);
+
+ /**
+ * SegmentObserver method - called from Segment dtor
+ */
+ virtual void segmentDeleted(const Segment *);
+
+ void addObserver (StaffObserver *obs) { m_observers.push_back(obs); }
+ void removeObserver(StaffObserver *obs) { m_observers.remove(obs); }
+
+protected:
+ Staff(Segment &);
+ virtual ViewElement* makeViewElement(Event*) = 0;
+
+ /**
+ * Return true if the event should be wrapped
+ * Useful for piano roll where we only want to wrap notes
+ * (always true by default)
+ */
+ virtual bool wrapEvent(Event *);
+
+ void notifyAdd(ViewElement *) const;
+ void notifyRemove(ViewElement *) const;
+ void notifySourceDeletion() const;
+
+ //--------------- Data members ---------------------------------
+
+ Segment &m_segment;
+ ViewElementList *m_viewElementList;
+
+ typedef std::list<StaffObserver*> ObserverSet;
+ ObserverSet m_observers;
+
+private: // not provided
+ Staff(const Staff &);
+ Staff &operator=(const Staff &);
+};
+
+class StaffObserver
+{
+public:
+ virtual ~StaffObserver() {}
+ virtual void elementAdded(const Staff *, ViewElement *) = 0;
+ virtual void elementRemoved(const Staff *, ViewElement *) = 0;
+
+ /// called when the observed object is being deleted
+ virtual void staffDeleted(const Staff *) = 0;
+};
+
+
+
+}
+
+#endif
+
diff --git a/src/base/StaffExportTypes.h b/src/base/StaffExportTypes.h
new file mode 100644
index 0000000..0aeeb78
--- /dev/null
+++ b/src/base/StaffExportTypes.h
@@ -0,0 +1,75 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ This file Coypright 2008 D. Michael McIntyre
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _STAFF_EXPORT_H_
+#define _STAFF_EXPORT_H_
+
+namespace Rosegarden
+{
+
+/**
+ * StaffTypes are currently only used for LilyPond export, and amount to named
+ * constant indices for the Track Parameters Box. They are used to control the
+ * size of notation exported on a given staff, and boil down to a complicated
+ * way to insert a \tiny or \small in the data stream ahead of the first clef,
+ * etc.
+ */
+
+typedef int StaffType;
+
+namespace StaffTypes
+{
+ const StaffType Normal = 0;
+ const StaffType Small = 1;
+ const StaffType Tiny = 2;
+}
+
+/**
+ * Brackets are currently only used for LilyPond export, and amount to named
+ * constant indices for the Track Parameters Box. They are used to control how
+ * staffs are bracketed together, and it is unfortunately necessary to have a
+ * staggering number of them in order to handle all the possible combinations of
+ * opening and closing brackets while keeping the interface as simple as
+ * possible.
+ */
+
+typedef int Bracket;
+
+namespace Brackets
+{
+ const Bracket None = 0; // ----
+ const Bracket SquareOn = 1; // [
+ const Bracket SquareOff = 2; // ]
+ const Bracket SquareOnOff = 3; // [ ]
+ const Bracket CurlyOn = 4; // {
+ const Bracket CurlyOff = 5; // }
+ const Bracket CurlySquareOn = 6; // {[
+ const Bracket CurlySquareOff = 7; // ]}
+}
+
+}
+
+#endif
diff --git a/src/base/Studio.cpp b/src/base/Studio.cpp
new file mode 100644
index 0000000..89e7cc1
--- /dev/null
+++ b/src/base/Studio.cpp
@@ -0,0 +1,674 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include <iostream>
+
+#include "Studio.h"
+#include "MidiDevice.h"
+#include "AudioDevice.h"
+#include "Instrument.h"
+
+#include "Segment.h"
+#include "Track.h"
+#include "Composition.h"
+
+#if (__GNUC__ < 3)
+#include <strstream>
+#define stringstream strstream
+#else
+#include <sstream>
+#endif
+
+using std::cerr;
+using std::endl;
+
+
+namespace Rosegarden
+{
+
+Studio::Studio() :
+ m_midiThruFilter(0),
+ m_midiRecordFilter(0),
+ m_mixerDisplayOptions(0),
+ m_metronomeDevice(0)
+{
+ // We _always_ have a buss with id zero, for the master out
+ m_busses.push_back(new Buss(0));
+
+ // And we always create one audio record in
+ m_recordIns.push_back(new RecordIn());
+}
+
+Studio::~Studio()
+{
+ DeviceListIterator dIt = m_devices.begin();
+
+ for (; dIt != m_devices.end(); ++dIt)
+ delete(*dIt);
+
+ m_devices.clear();
+
+ for (size_t i = 0; i < m_busses.size(); ++i) {
+ delete m_busses[i];
+ }
+
+ for (size_t i = 0; i < m_recordIns.size(); ++i) {
+ delete m_recordIns[i];
+ }
+}
+
+void
+Studio::addDevice(const std::string &name,
+ DeviceId id,
+ Device::DeviceType type)
+{
+ switch(type)
+ {
+ case Device::Midi:
+ m_devices.push_back(new MidiDevice(id, name, MidiDevice::Play));
+ break;
+
+ case Device::Audio:
+ m_devices.push_back(new AudioDevice(id, name));
+ break;
+
+ default:
+ std::cerr << "Studio::addDevice() - unrecognised device"
+ << endl;
+ break;
+ }
+}
+
+void
+Studio::addDevice(Device *device)
+{
+ m_devices.push_back(device);
+}
+
+void
+Studio::removeDevice(DeviceId id)
+{
+ DeviceListIterator it;
+ for (it = m_devices.begin(); it != m_devices.end(); it++)
+ {
+ if ((*it)->getId() == id) {
+ delete *it;
+ m_devices.erase(it);
+ return;
+ }
+ }
+}
+
+InstrumentList
+Studio::getAllInstruments()
+{
+ InstrumentList list, subList;
+
+ DeviceListIterator it;
+
+ // Append lists
+ //
+ for (it = m_devices.begin(); it != m_devices.end(); it++)
+ {
+ // get sub list
+ subList = (*it)->getAllInstruments();
+
+ // concetenate
+ list.insert(list.end(), subList.begin(), subList.end());
+ }
+
+ return list;
+
+}
+
+InstrumentList
+Studio::getPresentationInstruments()
+{
+ InstrumentList list, subList;
+
+ std::vector<Device*>::iterator it;
+ MidiDevice *midiDevice;
+
+ // Append lists
+ //
+ for (it = m_devices.begin(); it != m_devices.end(); it++)
+ {
+ midiDevice = dynamic_cast<MidiDevice*>(*it);
+
+ if (midiDevice)
+ {
+ // skip read-only devices
+ if (midiDevice->getDirection() == MidiDevice::Record)
+ continue;
+ }
+
+ // get sub list
+ subList = (*it)->getPresentationInstruments();
+
+ // concatenate
+ list.insert(list.end(), subList.begin(), subList.end());
+ }
+
+ return list;
+
+}
+
+Instrument*
+Studio::getInstrumentById(InstrumentId id)
+{
+ std::vector<Device*>::iterator it;
+ InstrumentList list;
+ InstrumentList::iterator iit;
+
+ for (it = m_devices.begin(); it != m_devices.end(); it++)
+ {
+ list = (*it)->getAllInstruments();
+
+ for (iit = list.begin(); iit != list.end(); iit++)
+ if ((*iit)->getId() == id)
+ return (*iit);
+ }
+
+ return 0;
+
+}
+
+// From a user selection (from a "Presentation" list) return
+// the matching Instrument
+//
+Instrument*
+Studio::getInstrumentFromList(int index)
+{
+ std::vector<Device*>::iterator it;
+ InstrumentList list;
+ InstrumentList::iterator iit;
+ int count = 0;
+
+ for (it = m_devices.begin(); it != m_devices.end(); it++)
+ {
+ MidiDevice *midiDevice = dynamic_cast<MidiDevice*>(*it);
+
+ if (midiDevice)
+ {
+ // skip read-only devices
+ if (midiDevice->getDirection() == MidiDevice::Record)
+ continue;
+ }
+
+ list = (*it)->getPresentationInstruments();
+
+ for (iit = list.begin(); iit != list.end(); iit++)
+ {
+ if (count == index)
+ return (*iit);
+
+ count++;
+ }
+ }
+
+ return 0;
+
+}
+
+Instrument *
+Studio::getInstrumentFor(Segment *segment)
+{
+ if (!segment) return 0;
+ if (!segment->getComposition()) return 0;
+ TrackId tid = segment->getTrack();
+ Track *track = segment->getComposition()->getTrackById(tid);
+ if (!track) return 0;
+ return getInstrumentFor(track);
+}
+
+Instrument *
+Studio::getInstrumentFor(Track *track)
+{
+ if (!track) return 0;
+ InstrumentId iid = track->getInstrument();
+ return getInstrumentById(iid);
+}
+
+BussList
+Studio::getBusses()
+{
+ return m_busses;
+}
+
+Buss *
+Studio::getBussById(BussId id)
+{
+ for (BussList::iterator i = m_busses.begin(); i != m_busses.end(); ++i) {
+ if ((*i)->getId() == id) return *i;
+ }
+ return 0;
+}
+
+void
+Studio::addBuss(Buss *buss)
+{
+ m_busses.push_back(buss);
+}
+
+PluginContainer *
+Studio::getContainerById(InstrumentId id)
+{
+ PluginContainer *pc = getInstrumentById(id);
+ if (pc) return pc;
+ else return getBussById(id);
+}
+
+RecordIn *
+Studio::getRecordIn(int number)
+{
+ if (number >= 0 && number < int(m_recordIns.size())) return m_recordIns[number];
+ else return 0;
+}
+
+// Clear down the devices - the devices will clear down their
+// own Instruments.
+//
+void
+Studio::clear()
+{
+ InstrumentList list;
+ std::vector<Device*>::iterator it;
+
+ for (it = m_devices.begin(); it != m_devices.end(); it++)
+ delete *it;
+
+ m_devices.erase(m_devices.begin(), m_devices.end());
+}
+
+std::string
+Studio::toXmlString()
+{
+ return toXmlString(std::vector<DeviceId>());
+}
+
+std::string
+Studio::toXmlString(const std::vector<DeviceId> &devices)
+{
+ std::stringstream studio;
+
+ studio << "<studio thrufilter=\"" << m_midiThruFilter
+ << "\" recordfilter=\"" << m_midiRecordFilter
+ << "\" audioinputpairs=\"" << m_recordIns.size()
+ << "\" mixerdisplayoptions=\"" << m_mixerDisplayOptions
+ << "\" metronomedevice=\"" << m_metronomeDevice
+ << "\">" << endl << endl;
+
+ studio << endl;
+
+ InstrumentList list;
+
+ // Get XML version of devices
+ //
+ if (devices.empty()) { // export all devices and busses
+
+ for (DeviceListIterator it = m_devices.begin();
+ it != m_devices.end(); it++) {
+ studio << (*it)->toXmlString() << endl << endl;
+ }
+
+ for (BussList::iterator it = m_busses.begin();
+ it != m_busses.end(); ++it) {
+ studio << (*it)->toXmlString() << endl << endl;
+ }
+
+ } else {
+ for (std::vector<DeviceId>::const_iterator di(devices.begin());
+ di != devices.end(); ++di) {
+ Device *d = getDevice(*di);
+ if (!d) {
+ std::cerr << "WARNING: Unknown device id " << (*di)
+ << " in Studio::toXmlString" << std::endl;
+ } else {
+ studio << d->toXmlString() << endl << endl;
+ }
+ }
+ }
+
+ studio << endl << endl;
+
+#if (__GNUC__ < 3)
+ studio << "</studio>" << endl << std::ends;
+#else
+ studio << "</studio>" << endl;
+#endif
+
+ return studio.str();
+}
+
+// Run through the Devices checking for MidiDevices and
+// returning the first Metronome we come across
+//
+const MidiMetronome*
+Studio::getMetronomeFromDevice(DeviceId id)
+{
+ std::vector<Device*>::iterator it;
+ MidiDevice *midiDevice;
+
+ for (it = m_devices.begin(); it != m_devices.end(); it++)
+ {
+ midiDevice = dynamic_cast<MidiDevice*>(*it);
+
+ if (midiDevice &&
+ midiDevice->getId() == id &&
+ midiDevice->getMetronome())
+ {
+ return midiDevice->getMetronome();
+ }
+ }
+
+ return 0;
+}
+
+// Scan all MIDI devices for available channels and map
+// them to a current program
+
+Instrument*
+Studio::assignMidiProgramToInstrument(MidiByte program,
+ int msb, int lsb,
+ bool percussion)
+{
+ MidiDevice *midiDevice;
+ std::vector<Device*>::iterator it;
+ Rosegarden::InstrumentList::iterator iit;
+ Rosegarden::InstrumentList instList;
+
+ // Instruments that we may return
+ //
+ Rosegarden::Instrument *newInstrument = 0;
+ Rosegarden::Instrument *firstInstrument = 0;
+
+ bool needBank = (msb >= 0 || lsb >= 0);
+ if (needBank) {
+ if (msb < 0) msb = 0;
+ if (lsb < 0) lsb = 0;
+ }
+
+ // Pass one - search through all MIDI instruments looking for
+ // a match that we can re-use. i.e. if we have a matching
+ // Program Change then we can use this Instrument.
+ //
+ for (it = m_devices.begin(); it != m_devices.end(); it++)
+ {
+ midiDevice = dynamic_cast<MidiDevice*>(*it);
+
+ if (midiDevice && midiDevice->getDirection() == MidiDevice::Play)
+ {
+ instList = (*it)->getPresentationInstruments();
+
+ for (iit = instList.begin(); iit != instList.end(); iit++)
+ {
+ if (firstInstrument == 0)
+ firstInstrument = *iit;
+
+ // If we find an Instrument sending the right program already.
+ //
+ if ((*iit)->sendsProgramChange() &&
+ (*iit)->getProgramChange() == program &&
+ (!needBank || ((*iit)->sendsBankSelect() &&
+ (*iit)->getMSB() == msb &&
+ (*iit)->getLSB() == lsb &&
+ (*iit)->isPercussion() == percussion)))
+ {
+ return (*iit);
+ }
+ else
+ {
+ // Ignore the program change and use the percussion
+ // flag.
+ //
+ if ((*iit)->isPercussion() && percussion)
+ {
+ return (*iit);
+ }
+
+ // Otherwise store the first Instrument for
+ // possible use later.
+ //
+ if (newInstrument == 0 &&
+ (*iit)->sendsProgramChange() == false &&
+ (*iit)->sendsBankSelect() == false &&
+ (*iit)->isPercussion() == percussion)
+ newInstrument = *iit;
+ }
+ }
+ }
+ }
+
+
+ // Okay, if we've got this far and we have a new Instrument to use
+ // then use it.
+ //
+ if (newInstrument != 0)
+ {
+ newInstrument->setSendProgramChange(true);
+ newInstrument->setProgramChange(program);
+
+ if (needBank) {
+ newInstrument->setSendBankSelect(true);
+ newInstrument->setPercussion(percussion);
+ newInstrument->setMSB(msb);
+ newInstrument->setLSB(lsb);
+ }
+ }
+ else // Otherwise we just reuse the first Instrument we found
+ newInstrument = firstInstrument;
+
+
+ return newInstrument;
+}
+
+// Just make all of these Instruments available for automatic
+// assignment in the assignMidiProgramToInstrument() method
+// by invalidating the ProgramChange flag.
+//
+// This method sounds much more dramatic than it actually is -
+// it could probably do with a rename.
+//
+//
+void
+Studio::unassignAllInstruments()
+{
+ MidiDevice *midiDevice;
+ AudioDevice *audioDevice;
+ std::vector<Device*>::iterator it;
+ Rosegarden::InstrumentList::iterator iit;
+ Rosegarden::InstrumentList instList;
+ int channel = 0;
+
+ for (it = m_devices.begin(); it != m_devices.end(); it++)
+ {
+ midiDevice = dynamic_cast<MidiDevice*>(*it);
+
+ if (midiDevice)
+ {
+ instList = (*it)->getPresentationInstruments();
+
+ for (iit = instList.begin(); iit != instList.end(); iit++)
+ {
+ // Only for true MIDI Instruments - not System ones
+ //
+ if ((*iit)->getId() >= MidiInstrumentBase)
+ {
+ (*iit)->setSendBankSelect(false);
+ (*iit)->setSendProgramChange(false);
+ (*iit)->setMidiChannel(channel);
+ channel = ( channel + 1 ) % 16;
+
+ (*iit)->setSendPan(false);
+ (*iit)->setSendVolume(false);
+ (*iit)->setPan(MidiMidValue);
+ (*iit)->setVolume(100);
+
+ }
+ }
+ }
+ else
+ {
+ audioDevice = dynamic_cast<AudioDevice*>(*it);
+
+ if (audioDevice)
+ {
+ instList = (*it)->getPresentationInstruments();
+
+ for (iit = instList.begin(); iit != instList.end(); iit++)
+ (*iit)->emptyPlugins();
+ }
+ }
+ }
+}
+
+void
+Studio::clearMidiBanksAndPrograms()
+{
+ MidiDevice *midiDevice;
+ std::vector<Device*>::iterator it;
+
+ for (it = m_devices.begin(); it != m_devices.end(); it++)
+ {
+ midiDevice = dynamic_cast<MidiDevice*>(*it);
+
+ if (midiDevice)
+ {
+ midiDevice->clearProgramList();
+ midiDevice->clearBankList();
+ }
+ }
+}
+
+void
+Studio::clearBusses()
+{
+ for (size_t i = 0; i < m_busses.size(); ++i) {
+ delete m_busses[i];
+ }
+ m_busses.clear();
+ m_busses.push_back(new Buss(0));
+}
+
+void
+Studio::clearRecordIns()
+{
+ for (size_t i = 0; i < m_recordIns.size(); ++i) {
+ delete m_recordIns[i];
+ }
+ m_recordIns.clear();
+ m_recordIns.push_back(new RecordIn());
+}
+
+Device*
+Studio::getDevice(DeviceId id)
+{
+ //cerr << "Studio[" << this << "]::getDevice(" << id << ")... ";
+
+ std::vector<Device*>::iterator it;
+
+ for (it = m_devices.begin(); it != m_devices.end(); it++) {
+
+// if (it != m_devices.begin()) cerr << ", ";
+
+// cerr << (*it)->getId();
+ if ((*it)->getId() == id) {
+ //cerr << ". Found" << endl;
+ return (*it);
+ }
+ }
+
+ //cerr << ". Not found" << endl;
+
+ return 0;
+}
+
+std::string
+Studio::getSegmentName(InstrumentId id)
+{
+ MidiDevice *midiDevice;
+ std::vector<Device*>::iterator it;
+ Rosegarden::InstrumentList::iterator iit;
+ Rosegarden::InstrumentList instList;
+
+ for (it = m_devices.begin(); it != m_devices.end(); it++)
+ {
+ midiDevice = dynamic_cast<MidiDevice*>(*it);
+
+ if (midiDevice)
+ {
+ instList = (*it)->getAllInstruments();
+
+ for (iit = instList.begin(); iit != instList.end(); iit++)
+ {
+ if ((*iit)->getId() == id)
+ {
+ if ((*iit)->sendsProgramChange())
+ {
+ return (*iit)->getProgramName();
+ }
+ else
+ {
+ return midiDevice->getName() + " " + (*iit)->getName();
+ }
+ }
+ }
+ }
+ }
+
+ return std::string("");
+}
+
+InstrumentId
+Studio::getAudioPreviewInstrument()
+{
+ AudioDevice *audioDevice;
+ std::vector<Device*>::iterator it;
+
+ for (it = m_devices.begin(); it != m_devices.end(); it++)
+ {
+ audioDevice = dynamic_cast<AudioDevice*>(*it);
+
+ // Just the first one will do - we can make this more
+ // subtle if we need to later.
+ //
+ if (audioDevice)
+ return audioDevice->getPreviewInstrument();
+ }
+
+ // system instrument - won't accept audio
+ return 0;
+}
+
+bool
+Studio::haveMidiDevices() const
+{
+ Rosegarden::DeviceListConstIterator it = m_devices.begin();
+ for (; it != m_devices.end(); it++)
+ {
+ if ((*it)->getType() == Device::Midi) return true;
+ }
+ return false;
+}
+
+
+}
+
diff --git a/src/base/Studio.h b/src/base/Studio.h
new file mode 100644
index 0000000..7223524
--- /dev/null
+++ b/src/base/Studio.h
@@ -0,0 +1,208 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include <string>
+#include <vector>
+
+#include "XmlExportable.h"
+#include "Instrument.h"
+#include "Device.h"
+#include "MidiProgram.h"
+#include "ControlParameter.h"
+
+// The Studio is where Midi and Audio devices live. We can query
+// them for a list of Instruments, connect them together or to
+// effects units (eventually) and generally do real studio-type
+// stuff to them.
+//
+//
+
+
+#ifndef _STUDIO_H_
+#define _STUDIO_H_
+
+namespace Rosegarden
+{
+
+typedef std::vector<Instrument *> InstrumentList;
+typedef std::vector<Device*> DeviceList;
+typedef std::vector<Buss *> BussList;
+typedef std::vector<RecordIn *> RecordInList;
+typedef std::vector<Device*>::iterator DeviceListIterator;
+typedef std::vector<Device*>::const_iterator DeviceListConstIterator;
+
+class MidiDevice;
+
+class Segment;
+class Track;
+
+
+class Studio : public XmlExportable
+{
+
+public:
+ Studio();
+ ~Studio();
+
+private:
+ Studio(const Studio &);
+ Studio& operator=(const Studio &);
+public:
+
+ void addDevice(const std::string &name,
+ DeviceId id,
+ Device::DeviceType type);
+ void addDevice(Device *device);
+
+ void removeDevice(DeviceId id);
+
+ // Return the combined instrument list from all devices
+ // for all and presentation Instrument (Presentation is
+ // just a subset of All).
+ //
+ InstrumentList getAllInstruments();
+ InstrumentList getPresentationInstruments();
+
+ // Return an Instrument
+ Instrument* getInstrumentById(InstrumentId id);
+ Instrument* getInstrumentFromList(int index);
+
+ // Convenience functions
+ Instrument *getInstrumentFor(Segment *);
+ Instrument *getInstrumentFor(Track *);
+
+ // Return a Buss
+ BussList getBusses();
+ Buss *getBussById(BussId id);
+ void addBuss(Buss *buss);
+
+ // Return an Instrument or a Buss
+ PluginContainer *getContainerById(InstrumentId id);
+
+ RecordInList getRecordIns() { return m_recordIns; }
+ RecordIn *getRecordIn(int number);
+ void addRecordIn(RecordIn *ri) { m_recordIns.push_back(ri); }
+
+ // A clever method to best guess MIDI file program mappings
+ // to available MIDI channels across all MidiDevices.
+ //
+ // Set the percussion flag if it's a percussion channel (mapped
+ // channel) we're after.
+ //
+ Instrument* assignMidiProgramToInstrument(MidiByte program,
+ bool percussion) {
+ return assignMidiProgramToInstrument(program, -1, -1, percussion);
+ }
+
+ // Same again, but with bank select
+ //
+ Instrument* assignMidiProgramToInstrument(MidiByte program,
+ int msb, int lsb,
+ bool percussion);
+
+ // Get a suitable name for a Segment belonging to this instrument.
+ // Takes into account ProgramChanges.
+ //
+ std::string getSegmentName(InstrumentId id);
+
+ // Clear down all the ProgramChange flags in all MIDI Instruments
+ //
+ void unassignAllInstruments();
+
+ // Clear down all MIDI banks and programs on all MidiDevices
+ // prior to reloading. The Instruments and Devices are generated
+ // at the Sequencer - the Banks and Programs are loaded from the
+ // RG4 file.
+ //
+ void clearMidiBanksAndPrograms();
+
+ void clearBusses();
+ void clearRecordIns();
+
+ // Clear down
+ void clear();
+
+ // Get a MIDI metronome from a given device
+ //
+ const MidiMetronome* getMetronomeFromDevice(DeviceId id);
+
+ // Return the device list
+ //
+ DeviceList* getDevices() { return &m_devices; }
+
+ // Const iterators
+ //
+ DeviceListConstIterator begin() const { return m_devices.begin(); }
+ DeviceListConstIterator end() const { return m_devices.end(); }
+
+ // Get a device by ID
+ //
+ Device* getDevice(DeviceId id);
+
+ bool haveMidiDevices() const;
+
+ // Export as XML string
+ //
+ virtual std::string toXmlString();
+
+ // Export a subset of devices as XML string. If devices is empty,
+ // exports all devices just as the above method does.
+ //
+ virtual std::string toXmlString(const std::vector<DeviceId> &devices);
+
+ // Get an audio preview Instrument
+ //
+ InstrumentId getAudioPreviewInstrument();
+
+ // MIDI filtering into and thru Rosegarden
+ //
+ void setMIDIThruFilter(MidiFilter filter) { m_midiThruFilter = filter; }
+ MidiFilter getMIDIThruFilter() const { return m_midiThruFilter; }
+
+ void setMIDIRecordFilter(MidiFilter filter) { m_midiRecordFilter = filter; }
+ MidiFilter getMIDIRecordFilter() const { return m_midiRecordFilter; }
+
+ void setMixerDisplayOptions(unsigned int options) { m_mixerDisplayOptions = options; }
+ unsigned int getMixerDisplayOptions() const { return m_mixerDisplayOptions; }
+
+ DeviceId getMetronomeDevice() const { return m_metronomeDevice; }
+ void setMetronomeDevice(DeviceId device) { m_metronomeDevice = device; }
+
+private:
+
+ DeviceList m_devices;
+
+ BussList m_busses;
+ RecordInList m_recordIns;
+
+ int m_audioInputs; // stereo pairs
+
+ MidiFilter m_midiThruFilter;
+ MidiFilter m_midiRecordFilter;
+
+ unsigned int m_mixerDisplayOptions;
+
+ DeviceId m_metronomeDevice;
+};
+
+}
+
+#endif // _STUDIO_H_
diff --git a/src/base/Track.cpp b/src/base/Track.cpp
new file mode 100644
index 0000000..903e500
--- /dev/null
+++ b/src/base/Track.cpp
@@ -0,0 +1,201 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include "Track.h"
+#include <iostream>
+#include <cstdio>
+
+#if (__GNUC__ < 3)
+#include <strstream>
+#define stringstream strstream
+#else
+#include <sstream>
+#endif
+
+#include "Composition.h"
+#include "StaffExportTypes.h"
+
+namespace Rosegarden
+{
+
+Track::Track():
+ m_id(0),
+ m_muted(false),
+ m_position(-1),
+ m_instrument(0),
+ m_owningComposition(0),
+ m_input_device(Device::ALL_DEVICES),
+ m_input_channel(-1),
+ m_armed(false),
+ m_clef(0),
+ m_transpose(0),
+ m_color(0),
+ m_highestPlayable(127),
+ m_lowestPlayable(0),
+ m_staffSize(StaffTypes::Normal),
+ m_staffBracket(Brackets::None)
+{
+}
+
+Track::Track(TrackId id,
+ InstrumentId instrument,
+ int position,
+ const std::string &label,
+ bool muted):
+ m_id(id),
+ m_muted(muted),
+ m_label(label),
+ m_position(position),
+ m_instrument(instrument),
+ m_owningComposition(0),
+ m_input_device(Device::ALL_DEVICES),
+ m_input_channel(-1),
+ m_armed(false),
+ m_clef(0),
+ m_transpose(0),
+ m_color(0),
+ m_highestPlayable(127),
+ m_lowestPlayable(0),
+ m_staffSize(StaffTypes::Normal),
+ m_staffBracket(Brackets::None)
+{
+}
+
+Track::~Track()
+{
+}
+
+void Track::setMuted(bool muted)
+{
+ if (m_muted == muted) return;
+
+ m_muted = muted;
+
+ if (m_owningComposition)
+ m_owningComposition->notifyTrackChanged(this);
+}
+
+void Track::setLabel(const std::string &label)
+{
+ if (m_label == label) return;
+
+ m_label = label;
+
+ if (m_owningComposition)
+ m_owningComposition->notifyTrackChanged(this);
+}
+
+void Track::setPresetLabel(const std::string &label)
+{
+ if (m_presetLabel == label) return;
+
+ m_presetLabel = label;
+
+ if (m_owningComposition)
+ m_owningComposition->notifyTrackChanged(this);
+}
+
+void Track::setInstrument(InstrumentId instrument)
+{
+ if (m_instrument == instrument) return;
+
+ m_instrument = instrument;
+
+ if (m_owningComposition)
+ m_owningComposition->notifyTrackChanged(this);
+}
+
+
+void Track::setArmed(bool armed)
+{
+ if (m_armed == armed) return;
+
+ m_armed = armed;
+
+ if (m_owningComposition)
+ m_owningComposition->notifyTrackChanged(this);
+}
+
+void Track::setMidiInputDevice(DeviceId id)
+{
+ if (m_input_device == id) return;
+
+ m_input_device = id;
+
+ if (m_owningComposition)
+ m_owningComposition->notifyTrackChanged(this);
+}
+
+void Track::setMidiInputChannel(char ic)
+{
+ if (m_input_channel == ic) return;
+
+ m_input_channel = ic;
+
+ if (m_owningComposition)
+ m_owningComposition->notifyTrackChanged(this);
+}
+
+
+// Our virtual method for exporting Xml.
+//
+//
+std::string Track::toXmlString()
+{
+
+ std::stringstream track;
+
+ track << "<track id=\"" << m_id;
+ track << "\" label=\"" << encode(m_label);
+ track << "\" position=\"" << m_position;
+
+ track << "\" muted=";
+
+ if (m_muted)
+ track << "\"true\"";
+ else
+ track << "\"false\"";
+
+ track << " instrument=\"" << m_instrument << "\"";
+
+ track << " defaultLabel=\"" << m_presetLabel << "\"";
+ track << " defaultClef=\"" << m_clef << "\"";
+ track << " defaultTranspose=\"" << m_transpose << "\"";
+ track << " defaultColour=\"" << m_color << "\"";
+ track << " defaultHighestPlayable=\"" << m_highestPlayable << "\"";
+ track << " defaultLowestPlayable=\"" << m_lowestPlayable << "\"";
+
+ track << " staffSize=\"" << m_staffSize << "\"";
+ track << " staffBracket=\"" << m_staffBracket << "\"";
+
+#if (__GNUC__ < 3)
+ track << "/>"<< std::ends;
+#else
+ track << "/>";
+#endif
+
+ return track.str();
+
+}
+
+}
+
+
diff --git a/src/base/Track.h b/src/base/Track.h
new file mode 100644
index 0000000..bcded51
--- /dev/null
+++ b/src/base/Track.h
@@ -0,0 +1,162 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+// Representation of a Track
+//
+//
+
+
+#ifndef _TRACK_H_
+#define _TRACK_H_
+
+#include <string>
+
+#include "XmlExportable.h"
+#include "Instrument.h"
+#include "Device.h"
+
+namespace Rosegarden
+{
+class Composition;
+
+typedef unsigned int TrackId;
+
+/**
+ * A Track represents a line on the SegmentCanvas on the
+ * Rosegarden GUI. A Track is owned by a Composition and
+ * has reference to an Instrument from which the playback
+ * characteristics of the Track can be derived. A Track
+ * has no type itself - the type comes only from the
+ * Instrument relationship.
+ *
+ */
+class Track : public XmlExportable
+{
+ friend class Composition;
+
+public:
+ Track();
+ Track(TrackId id,
+ InstrumentId instrument = 0,
+ int position =0 ,
+ const std::string &label = "",
+ bool muted = false);
+
+ void setId(TrackId id) { m_id = id; }
+
+private:
+ Track(const Track &);
+ Track operator=(const Track &);
+
+public:
+
+ ~Track();
+
+ TrackId getId() const { return m_id; }
+
+ void setMuted(bool muted);
+ bool isMuted() const { return m_muted; }
+
+ void setPosition(int position) { m_position = position; }
+ int getPosition() const { return m_position; }
+
+ void setLabel(const std::string &label);
+ std::string getLabel() const { return m_label; }
+
+ void setPresetLabel(const std::string &label);
+ std::string getPresetLabel() const { return m_presetLabel; }
+
+ void setInstrument(InstrumentId instrument);
+ InstrumentId getInstrument() const { return m_instrument; }
+
+ // Implementation of virtual
+ //
+ virtual std::string toXmlString();
+
+ Composition* getOwningComposition() { return m_owningComposition; }
+
+ void setMidiInputDevice(DeviceId id);
+ DeviceId getMidiInputDevice() const { return m_input_device; }
+
+ void setMidiInputChannel(char ic);
+ char getMidiInputChannel() const { return m_input_channel; }
+
+ int getClef() { return m_clef; }
+ void setClef(int clef) { m_clef = clef; }
+
+ int getTranspose() { return m_transpose; }
+ void setTranspose(int transpose) { m_transpose = transpose; }
+
+ int getColor() { return m_color; }
+ void setColor(int color) { m_color = color; }
+
+ int getHighestPlayable() { return m_highestPlayable; }
+ void setHighestPlayable(int pitch) { m_highestPlayable = pitch; }
+
+ int getLowestPlayable() { return m_lowestPlayable; }
+ void setLowestPlayable(int pitch) { m_lowestPlayable = pitch; }
+
+ // Controls size of exported staff in LilyPond
+ int getStaffSize() { return m_staffSize; }
+ void setStaffSize(int index) { m_staffSize = index; }
+
+ // Staff bracketing in LilyPond
+ int getStaffBracket() { return m_staffBracket; }
+ void setStaffBracket(int index) { m_staffBracket = index; }
+
+ bool isArmed() const { return m_armed; }
+ void setArmed(bool armed);
+
+protected: // For Composition use only
+ void setOwningComposition(Composition* comp) { m_owningComposition = comp; }
+
+private:
+ //--------------- Data members ---------------------------------
+
+ TrackId m_id;
+ bool m_muted;
+ std::string m_label;
+ std::string m_presetLabel;
+ int m_position;
+ InstrumentId m_instrument;
+
+ Composition* m_owningComposition;
+
+ DeviceId m_input_device;
+ char m_input_channel;
+ bool m_armed;
+
+ // default parameters for new segments created belonging to this track
+ int m_clef;
+ int m_transpose;
+ int m_color;
+ int m_highestPlayable;
+ int m_lowestPlayable;
+
+ // staff parameters for LilyPond export
+ int m_staffSize;
+ int m_staffBracket;
+};
+
+}
+
+#endif // _TRACK_H_
+
diff --git a/src/base/TriggerSegment.cpp b/src/base/TriggerSegment.cpp
new file mode 100644
index 0000000..c4c29de
--- /dev/null
+++ b/src/base/TriggerSegment.cpp
@@ -0,0 +1,130 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include "TriggerSegment.h"
+
+#include "Segment.h"
+#include "Composition.h"
+#include "BaseProperties.h"
+
+namespace Rosegarden
+{
+
+TriggerSegmentRec::~TriggerSegmentRec()
+{
+ // nothing -- we don't delete the segment here
+}
+
+TriggerSegmentRec::TriggerSegmentRec(TriggerSegmentId id,
+ Segment *segment,
+ int basePitch,
+ int baseVelocity,
+ std::string timeAdjust,
+ bool retune) :
+ m_id(id),
+ m_segment(segment),
+ m_basePitch(basePitch),
+ m_baseVelocity(baseVelocity),
+ m_defaultTimeAdjust(timeAdjust),
+ m_defaultRetune(retune)
+{
+ if (m_defaultTimeAdjust == "") {
+ m_defaultTimeAdjust = BaseProperties::TRIGGER_SEGMENT_ADJUST_SQUISH;
+ }
+
+ calculateBases();
+ updateReferences();
+}
+
+TriggerSegmentRec::TriggerSegmentRec(const TriggerSegmentRec &rec) :
+ m_id(rec.m_id),
+ m_segment(rec.m_segment),
+ m_basePitch(rec.m_basePitch),
+ m_baseVelocity(rec.m_baseVelocity),
+ m_defaultTimeAdjust(rec.m_defaultTimeAdjust),
+ m_defaultRetune(rec.m_defaultRetune),
+ m_references(rec.m_references)
+{
+ // nothing else
+}
+
+TriggerSegmentRec &
+TriggerSegmentRec::operator=(const TriggerSegmentRec &rec)
+{
+ if (&rec == this) return *this;
+ m_id = rec.m_id;
+ m_segment = rec.m_segment;
+ m_basePitch = rec.m_basePitch;
+ m_baseVelocity = rec.m_baseVelocity;
+ m_references = rec.m_references;
+ return *this;
+}
+
+void
+TriggerSegmentRec::updateReferences()
+{
+ if (!m_segment) return;
+
+ Composition *c = m_segment->getComposition();
+ if (!c) return;
+
+ m_references.clear();
+
+ for (Composition::iterator i = c->begin(); i != c->end(); ++i) {
+ for (Segment::iterator j = (*i)->begin(); j != (*i)->end(); ++j) {
+ if ((*j)->has(BaseProperties::TRIGGER_SEGMENT_ID) &&
+ (*j)->get<Int>(BaseProperties::TRIGGER_SEGMENT_ID) == long(m_id)) {
+ m_references.insert((*i)->getRuntimeId());
+ break; // from inner loop only: go on to next segment
+ }
+ }
+ }
+}
+
+void
+TriggerSegmentRec::calculateBases()
+{
+ if (!m_segment) return;
+
+ for (Segment::iterator i = m_segment->begin();
+ m_segment->isBeforeEndMarker(i); ++i) {
+
+ if (m_basePitch >= 0 && m_baseVelocity >= 0) return;
+
+ if (m_basePitch < 0) {
+ if ((*i)->has(BaseProperties::PITCH)) {
+ m_basePitch = (*i)->get<Int>(BaseProperties::PITCH);
+ }
+ }
+
+ if (m_baseVelocity < 0) {
+ if ((*i)->has(BaseProperties::VELOCITY)) {
+ m_baseVelocity = (*i)->get<Int>(BaseProperties::VELOCITY);
+ }
+ }
+ }
+
+ if (m_basePitch < 0) m_basePitch = 60;
+ if (m_baseVelocity < 0) m_baseVelocity = 100;
+}
+
+}
+
diff --git a/src/base/TriggerSegment.h b/src/base/TriggerSegment.h
new file mode 100644
index 0000000..7095e25
--- /dev/null
+++ b/src/base/TriggerSegment.h
@@ -0,0 +1,100 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _TRIGGER_SEGMENT_H_
+#define _TRIGGER_SEGMENT_H_
+
+#include <set>
+#include <string>
+
+namespace Rosegarden
+{
+
+typedef unsigned int TriggerSegmentId;
+
+class Segment;
+
+class TriggerSegmentRec
+{
+public:
+ typedef std::set<int> SegmentRuntimeIdSet;
+ ~TriggerSegmentRec();
+ TriggerSegmentRec(const TriggerSegmentRec &);
+ TriggerSegmentRec &operator=(const TriggerSegmentRec &);
+ bool operator==(const TriggerSegmentRec &rec) { return rec.m_id == m_id; }
+
+ TriggerSegmentId getId() const { return m_id; }
+
+ Segment *getSegment() { return m_segment; }
+ const Segment *getSegment() const { return m_segment; }
+
+ int getBasePitch() const { return m_basePitch; }
+ void setBasePitch(int basePitch) { m_basePitch = basePitch; }
+
+ int getBaseVelocity() const { return m_baseVelocity; }
+ void setBaseVelocity(int baseVelocity) { m_baseVelocity = baseVelocity; }
+
+ std::string getDefaultTimeAdjust() const { return m_defaultTimeAdjust; }
+ void setDefaultTimeAdjust(std::string a) { m_defaultTimeAdjust = a; }
+
+ bool getDefaultRetune() const { return m_defaultRetune; }
+ void setDefaultRetune(bool r) { m_defaultRetune = r; }
+
+ SegmentRuntimeIdSet &getReferences() { return m_references; }
+ const SegmentRuntimeIdSet &getReferences() const { return m_references; }
+
+ void updateReferences();
+
+protected:
+ friend class Composition;
+ TriggerSegmentRec(TriggerSegmentId id, Segment *segment,
+ int basePitch = -1, int baseVelocity = -1,
+ std::string defaultTimeAdjust = "", bool defaultRetune = true);
+
+ void setReferences(const SegmentRuntimeIdSet &s) { m_references = s; }
+
+ void calculateBases();
+
+ // data members:
+
+ TriggerSegmentId m_id;
+ Segment *m_segment;
+ int m_basePitch;
+ int m_baseVelocity;
+ std::string m_defaultTimeAdjust;
+ bool m_defaultRetune;
+ SegmentRuntimeIdSet m_references;
+};
+
+struct TriggerSegmentCmp
+{
+ bool operator()(const TriggerSegmentRec &r1, const TriggerSegmentRec &r2) const {
+ return r1.getId() < r2.getId();
+ }
+ bool operator()(const TriggerSegmentRec *r1, const TriggerSegmentRec *r2) const {
+ return r1->getId() < r2->getId();
+ }
+};
+
+
+}
+
+#endif
diff --git a/src/base/ViewElement.cpp b/src/base/ViewElement.cpp
new file mode 100644
index 0000000..425bdc1
--- /dev/null
+++ b/src/base/ViewElement.cpp
@@ -0,0 +1,172 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include "ViewElement.h"
+#include <iostream>
+#include <cassert>
+
+namespace Rosegarden
+{
+
+extern const int MIN_SUBORDERING;
+
+ViewElement::ViewElement(Event *e) :
+ m_layoutX(0.0),
+ m_layoutY(0.0),
+ m_event(e)
+{
+ // nothing
+}
+
+ViewElement::~ViewElement()
+{
+ // nothing
+}
+
+//////////////////////////////////////////////////////////////////////
+
+bool
+operator<(const ViewElement &a, const ViewElement &b)
+{
+ timeT at = a.getViewAbsoluteTime(), bt = b.getViewAbsoluteTime();
+/*
+ if (at < bt) {
+ if (!(*(a.event()) < *(b.event()))) {
+ std::cerr << " types: a: " << a.event()->getType() << " b: " << b.event()->getType() << std::endl;
+ std::cerr << "performed: a: " << a.event()->getAbsoluteTime() << " b: " << b.event()->getAbsoluteTime() << std::endl;
+ std::cerr << " notated: a: " << a.getViewAbsoluteTime() << " b: " << b.getViewAbsoluteTime() << std::endl;
+// assert(*(a.event()) < *(b.event()));
+ }
+ }
+ else if (at > bt) {
+ if (*(a.event()) < *(b.event())) {
+ std::cerr << " types: a: " << a.event()->getType() << " b: " << b.event()->getType() << std::endl;
+ std::cerr << "performed: a: " << a.event()->getAbsoluteTime() << " b: " << b.event()->getAbsoluteTime() << std::endl;
+ std::cerr << " notated: a: " << a.getViewAbsoluteTime() << " b: " << b.getViewAbsoluteTime() << std::endl;
+// assert(!(*(a.event()) < *(b.event())));
+ }
+ }
+*/
+ if (at == bt) return *(a.event()) < *(b.event());
+ else return (at < bt);
+}
+
+//////////////////////////////////////////////////////////////////////
+
+
+ViewElementList::~ViewElementList()
+{
+ for (iterator i = begin(); i != end(); ++i) {
+ delete (*i);
+ }
+}
+
+void
+ViewElementList::insert(ViewElement* el)
+{
+ set_type::insert(el);
+}
+
+void
+ViewElementList::erase(iterator pos)
+{
+ delete *pos;
+ set_type::erase(pos);
+}
+
+void
+ViewElementList::erase(iterator from, iterator to)
+{
+ for (iterator i = from; i != to; ++i) {
+ delete *i;
+ }
+
+ set_type::erase(from, to);
+}
+
+void
+ViewElementList::eraseSingle(ViewElement *el)
+{
+ iterator elPos = findSingle(el);
+ if (elPos != end()) erase(elPos);
+}
+
+ViewElementList::iterator
+ViewElementList::findPrevious(const std::string &type, iterator i)
+
+{
+ // what to return on failure? I think probably
+ // end(), as begin() could be a success case
+ if (i == begin()) return end();
+ --i;
+ for (;;) {
+ if ((*i)->event()->isa(type)) return i;
+ if (i == begin()) return end();
+ --i;
+ }
+}
+
+ViewElementList::iterator
+ViewElementList::findNext(const std::string &type, iterator i)
+{
+ if (i == end()) return i;
+ for (++i; i != end() && !(*i)->event()->isa(type); ++i);
+ return i;
+}
+
+ViewElementList::iterator
+ViewElementList::findSingle(ViewElement *el)
+{
+ iterator res = end();
+
+ std::pair<iterator, iterator> interval = equal_range(el);
+
+ for (iterator i = interval.first; i != interval.second; ++i) {
+ if (*i == el) {
+ res = i;
+ break;
+ }
+ }
+
+ return res;
+}
+
+ViewElementList::iterator
+ViewElementList::findTime(timeT time)
+{
+ Event dummy("dummy", time, 0, MIN_SUBORDERING);
+ ViewElement dummyT(&dummy);
+ return lower_bound(&dummyT);
+}
+
+ViewElementList::iterator
+ViewElementList::findNearestTime(timeT t)
+{
+ iterator i = findTime(t);
+ if (i == end() || (*i)->getViewAbsoluteTime() > t) {
+ if (i == begin()) return end();
+ else --i;
+ }
+ return i;
+}
+
+}
+
diff --git a/src/base/ViewElement.h b/src/base/ViewElement.h
new file mode 100644
index 0000000..8cc3d09
--- /dev/null
+++ b/src/base/ViewElement.h
@@ -0,0 +1,164 @@
+// -*- c-basic-offset: 4 -*-
+
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _VIEWELEMENT_H_
+#define _VIEWELEMENT_H_
+
+
+#include "Event.h"
+
+#include <set>
+#include <list>
+
+namespace Rosegarden
+{
+
+/**
+ * The abstract base for classes which represent an Event as an
+ * on-screen graphic item (a note, a rectangle on a piano roll).
+ */
+
+class ViewElement
+{
+ friend class ViewElementList;
+ friend class Staff;
+
+public:
+ virtual ~ViewElement();
+
+ const Event* event() const { return m_event; }
+ Event* event() { return m_event; }
+
+ virtual timeT getViewAbsoluteTime() const { return event()->getAbsoluteTime(); }
+ virtual timeT getViewDuration() const { return event()->getDuration(); }
+
+ /**
+ * Returns the X coordinate of the element, as computed by the
+ * layout. This is not the coordinate of the associated canvas
+ * item.
+ *
+ * @see getCanvasX()
+ */
+ virtual double getLayoutX() const { return m_layoutX; }
+
+ /**
+ * Returns the Y coordinate of the element, as computed by the
+ * layout. This is not the coordinate of the associated canvas
+ * item.
+ *
+ * @see getCanvasY()
+ */
+ virtual double getLayoutY() const { return m_layoutY; }
+
+ /**
+ * Sets the X coordinate which was computed by the layout engine
+ * @see getLayoutX()
+ */
+ virtual void setLayoutX(double x) { m_layoutX = x; }
+
+ /**
+ * Sets the Y coordinate which was computed by the layout engine
+ * @see getLayoutY()
+ */
+ virtual void setLayoutY(double y) { m_layoutY = y; }
+
+ void dump(std::ostream&) const;
+
+ friend bool operator<(const ViewElement&, const ViewElement&);
+
+protected:
+ ViewElement(Event *);
+
+ double m_layoutX;
+ double m_layoutY;
+
+ Event *m_event;
+};
+
+
+
+class ViewElementComparator
+{
+public:
+ bool operator()(const ViewElement *e1, const ViewElement *e2) const {
+ return *e1 < *e2;
+ }
+};
+
+/**
+ * This class owns the objects its items are pointing at.
+ *
+ * The template argument T must be a subclass of ViewElement.
+ */
+class ViewElementList : public std::multiset<ViewElement *, ViewElementComparator >
+{
+ typedef std::multiset<ViewElement *, ViewElementComparator > set_type;
+public:
+ typedef set_type::iterator iterator;
+
+ ViewElementList() : set_type() { }
+ virtual ~ViewElementList();
+
+ void insert(ViewElement *);
+ void erase(iterator i);
+ void erase(iterator from, iterator to);
+ void eraseSingle(ViewElement *);
+
+ iterator findPrevious(const std::string &type, iterator i);
+ iterator findNext(const std::string &type, iterator i);
+
+ /**
+ * Returns an iterator pointing to that specific element,
+ * end() otherwise
+ */
+ iterator findSingle(ViewElement *);
+
+ const_iterator findSingle(ViewElement *e) const {
+ return const_iterator(((const ViewElementList *)this)->findSingle(e));
+ }
+
+ /**
+ * Returns first iterator pointing at or after the given time,
+ * end() if time is beyond the end of the list
+ */
+ iterator findTime(timeT time);
+
+ const_iterator findTime(timeT time) const {
+ return const_iterator(((const ViewElementList *)this)->findTime(time));
+ }
+
+ /**
+ * Returns iterator pointing to the first element starting at
+ * or before the given absolute time
+ */
+ iterator findNearestTime(timeT time);
+
+ const_iterator findNearestTime(timeT time) const {
+ return const_iterator(((const ViewElementList *)this)->findNearestTime(time));
+ }
+};
+
+}
+
+
+#endif
+
diff --git a/src/base/XmlExportable.cpp b/src/base/XmlExportable.cpp
new file mode 100644
index 0000000..b874340
--- /dev/null
+++ b/src/base/XmlExportable.cpp
@@ -0,0 +1,197 @@
+// -*- c-basic-offset: 4 -*-
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include "XmlExportable.h"
+#include <iostream>
+#include <cstdlib>
+#include <cstring>
+
+namespace Rosegarden
+{
+
+static std::string s1;
+static std::string multibyte;
+
+std::string XmlExportable::encode(const std::string &s0)
+{
+ static char *buffer = 0;
+ static size_t bufsiz = 0;
+ size_t buflen = 0;
+
+ static char multibyte[20];
+ size_t mblen = 0;
+
+ size_t len = s0.length();
+
+ if (bufsiz < len * 2 + 10) {
+ bufsiz = len * 2 + 10;
+ buffer = (char *)malloc(bufsiz);
+ }
+
+ // Escape any xml special characters, and also make sure we have
+ // valid utf8 -- otherwise we won't be able to re-read the xml.
+ // Amazing how complicated this gets.
+
+ bool warned = false; // no point in warning forever for long bogus strings
+
+ for (size_t i = 0; i < len; ++i) {
+
+ unsigned char c = s0[i];
+
+ if (((c & 0xc0) == 0xc0) || !(c & 0x80)) {
+
+ // 11xxxxxx or 0xxxxxxx: first byte of a character sequence
+
+ if (mblen > 0) {
+
+ // does multibyte contain a valid sequence?
+ unsigned int length =
+ (!(multibyte[0] & 0x20)) ? 2 :
+ (!(multibyte[0] & 0x10)) ? 3 :
+ (!(multibyte[0] & 0x08)) ? 4 :
+ (!(multibyte[0] & 0x04)) ? 5 : 0;
+
+ if (length == 0 || mblen == length) {
+ if (bufsiz < buflen + mblen + 1) {
+ bufsiz = 2 * buflen + mblen + 1;
+ buffer = (char *)realloc(buffer, bufsiz);
+ }
+ strncpy(buffer + buflen, multibyte, mblen);
+ buflen += mblen;
+ } else {
+ if (!warned) {
+ std::cerr
+ << "WARNING: Invalid utf8 char width in string \""
+ << s0 << "\" at index " << i << " ("
+ << mblen << " octet"
+ << (mblen != 1 ? "s" : "")
+ << ", expected " << length << ")" << std::endl;
+ warned = true;
+ }
+ // and drop the character
+ }
+ }
+
+ mblen = 0;
+
+ if (!(c & 0x80)) { // ascii
+
+ if (bufsiz < buflen + 10) {
+ bufsiz = 2 * buflen + 10;
+ buffer = (char *)realloc(buffer, bufsiz);
+ }
+
+ switch (c) {
+ case '&' : strncpy(buffer + buflen, "&amp;", 5); buflen += 5; break;
+ case '<' : strncpy(buffer + buflen, "&lt;", 4); buflen += 4; break;
+ case '>' : strncpy(buffer + buflen, "&gt;", 4); buflen += 4; break;
+ case '"' : strncpy(buffer + buflen, "&quot;", 6); buflen += 6; break;
+ case '\'' : strncpy(buffer + buflen, "&apos;", 6); buflen += 6; break;
+ case 0x9:
+ case 0xa:
+ case 0xd:
+ // convert these special cases to plain whitespace:
+ buffer[buflen++] = ' ';
+ break;
+ default:
+ if (c >= 32) buffer[buflen++] = c;
+ else {
+ if (!warned) {
+ std::cerr
+ << "WARNING: Invalid utf8 octet in string \""
+ << s0 << "\" at index " << i << " ("
+ << (int)c << " < 32)" << std::endl;
+ }
+ warned = true;
+ }
+ }
+
+ } else {
+
+ // store in multibyte rather than straight to s1, so
+ // that we know we're in the middle of something
+ // (below). At this point we know mblen == 0.
+ multibyte[mblen++] = c;
+ }
+
+ } else {
+
+ // second or subsequent byte
+
+ if (mblen == 0) { // ... without a first byte!
+ if (!warned) {
+ std::cerr
+ << "WARNING: Invalid utf8 octet sequence in string \""
+ << s0 << "\" at index " << i << std::endl;
+ warned = true;
+ }
+ } else {
+
+ if (mblen >= sizeof(multibyte)-1) {
+ if (!warned) {
+ std::cerr
+ << "WARNING: Character too wide in string \""
+ << s0 << "\" at index " << i << " (reached width of "
+ << mblen << ")" << std::endl;
+ }
+ warned = true;
+ mblen = 0;
+ } else {
+ multibyte[mblen++] = c;
+ }
+ }
+ }
+ }
+
+ if (mblen > 0) {
+ // does multibyte contain a valid sequence?
+ unsigned int length =
+ (!(multibyte[0] & 0x20)) ? 2 :
+ (!(multibyte[0] & 0x10)) ? 3 :
+ (!(multibyte[0] & 0x08)) ? 4 :
+ (!(multibyte[0] & 0x04)) ? 5 : 0;
+
+ if (length == 0 || mblen == length) {
+ if (bufsiz < buflen + mblen + 1) {
+ bufsiz = 2 * buflen + mblen + 1;
+ buffer = (char *)realloc(buffer, bufsiz);
+ }
+ strncpy(buffer + buflen, multibyte, mblen);
+ buflen += mblen;
+ } else {
+ if (!warned) {
+ std::cerr
+ << "WARNING: Invalid utf8 char width in string \""
+ << s0 << "\" at index " << len << " ("
+ << mblen << " octet"
+ << (mblen != 1 ? "s" : "")
+ << ", expected " << length << ")" << std::endl;
+ warned = true;
+ }
+ // and drop the character
+ }
+ }
+ buffer[buflen] = '\0';
+
+ return buffer;
+}
+
+}
+
diff --git a/src/base/XmlExportable.h b/src/base/XmlExportable.h
new file mode 100644
index 0000000..e619221
--- /dev/null
+++ b/src/base/XmlExportable.h
@@ -0,0 +1,55 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _XMLEXPORTABLE_H_
+#define _XMLEXPORTABLE_H_
+
+#include <string>
+
+// [rwb]
+//
+// Abstract base class that forces all derived classes
+// to implement the virtual toXmlString object.
+//
+// Yes, this is similar to the XmlStoreableEvent class
+// in gui/ but with hopes to be more general so that any
+// classes in base/ can go ahead and implement it.
+//
+//
+
+namespace Rosegarden
+{
+
+class XmlExportable
+{
+public:
+ XmlExportable() {;}
+ virtual ~XmlExportable() {;}
+
+ virtual std::string toXmlString() = 0;
+
+ static std::string encode(const std::string &);
+};
+
+}
+
+#endif // _XMLEXPORTABLE_H_
+
diff --git a/src/base/test/Makefile b/src/base/test/Makefile
new file mode 100644
index 0000000..b517955
--- /dev/null
+++ b/src/base/test/Makefile
@@ -0,0 +1,57 @@
+
+# debug flags need to be consistent with base build
+#CPPFLAGS = -O2
+CPPFLAGS = -g
+
+LIBBASE = ../../../RGbuild/libRosegardenCommon.a
+
+INCPATH = -I..
+
+SRCS := test.C pitch.C
+
+default: test utf8 colour transpose accidentals
+
+clean:
+ rm -f test test.o pitch pitch.o utf8 utf8.o colour colour.o transpose.o transpose accidentals.o accidentals
+
+%.o: %.cpp
+ $(CXX) $(CPPFLAGS) -c $< $(INCPATH) -o $@
+
+test: test.o
+ $(CXX) $< $(LIBBASE) -o $@
+
+pitch: pitch.o
+ $(CXX) $< $(LIBBASE) -o $@
+
+utf8: utf8.o
+ $(CXX) $< $(LIBBASE) -o $@
+
+colour: colour.o
+ $(CXX) $< $(LIBBASE) -o $@
+
+transpose: transpose.o
+ $(CXX) $< $(LIBBASE) -o $@
+
+accidentals: accidentals.o
+ $(CXX) $< $(LIBBASE) -o $@
+
+
+depend:
+ makedepend $(INCPATH) -- $(CPPFLAGS) -- $(SRCS)
+
+# DO NOT DELETE
+
+test.o: ../Event.h ../PropertyMap.h ../Property.h ../RealTime.h
+test.o: ../PropertyName.h ../Exception.h ../Segment.h ../Track.h
+test.o: ../XmlExportable.h ../Instrument.h ../NotationTypes.h #../StringHash.h
+test.o: ../XmlExportable.h ../Instrument.h ../NotationTypes.h
+test.o: ../RefreshStatus.h ../Composition.h ../FastVector.h
+test.o: ../Configuration.h ../ColourMap.h ../Colour.h
+test.o: ../SegmentNotationHelper.h ../SegmentPerformanceHelper.h
+test.o: ../MidiTypes.h
+pitch.o: ../NotationTypes.h ../Event.h ../PropertyMap.h ../Property.h
+pitch.o: ../RealTime.h ../PropertyName.h ../Exception.h ../Instrument.h
+pitch.o: ../XmlExportable.h #../StringHash.h
+
+transpose.o: ../NotationTypes.h
+accidentals.o: ../NotationTypes.h
diff --git a/src/base/test/accidentals.cpp b/src/base/test/accidentals.cpp
new file mode 100644
index 0000000..53dbfc8
--- /dev/null
+++ b/src/base/test/accidentals.cpp
@@ -0,0 +1,60 @@
+// -*- c-basic-offset: 4 -*-
+
+#include "NotationTypes.h"
+
+using namespace Rosegarden;
+using std::cout;
+
+// Unit test-ish tests for resolving accidentals
+//
+// Returns -1 (or crashes :)) on error, 0 on success
+void assertHasAccidental(Pitch &pitch,
+ const Accidental& accidental, const Key& key)
+{
+ Accidental calculatedAccidental =
+ pitch.getAccidental(key);
+
+ std::cout << "Got " << calculatedAccidental << " for pitch " << pitch.getPerformancePitch() << " in key " << key.getName() << std::endl;
+
+ if (calculatedAccidental != accidental)
+ {
+ std::cout << "Expected " << accidental << std::endl;
+ exit(-1);
+ }
+}
+
+void testBInEMinor()
+{
+ // a B, also in E minor, has no accidental
+ Pitch testPitch(59 % 12);
+ assertHasAccidental(testPitch,
+ Accidentals::NoAccidental, Key("E minor"));
+}
+
+/**
+ *
+ */
+void testFInBMinor()
+{
+ Pitch testPitch(77);
+ assertHasAccidental(testPitch,
+ Accidentals::NoAccidental, Key("B minor"));
+}
+
+void testInvalidSuggestion()
+{
+ // If we specify an invalid suggestion,
+ // getAccidental() should be robust against that.
+ Pitch testPitch = Pitch(59, Accidentals::Sharp);
+ assertHasAccidental(testPitch,
+ Accidentals::NoAccidental, Key("E minor"));
+}
+
+int main(int argc, char **argv)
+{
+ testBInEMinor();
+ testFInBMinor();
+ testInvalidSuggestion();
+ std::cout << "Success" << std::endl;
+ exit(0);
+}
diff --git a/src/base/test/colour.cpp b/src/base/test/colour.cpp
new file mode 100644
index 0000000..3aa7ba2
--- /dev/null
+++ b/src/base/test/colour.cpp
@@ -0,0 +1,222 @@
+// -*- c-basic-offset: 4 -*-
+
+
+/*
+ Rosegarden-4
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2003
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ This file is Copyright 2003
+ Mark Hymers <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+/*
+ If you compile this to a test program
+ g++ -o colour -I../ ../Colour.C ../ColourMap.C colour.C
+
+ you can then run it like this:
+ ./colour > temp.output
+
+ and do a diff to check that it worked:
+ diff -u temp.output colour.output
+
+ If there are any differences, there's a problem
+ (or colour.output hasn't been updated when colour.C has been changed)
+*/
+
+#include "Colour.h"
+#include "ColourMap.h"
+#include <iostream>
+
+
+using namespace Rosegarden;
+using std::cout;
+using std::string;
+
+// Some printing routines
+
+void printRC(Colour const *temp)
+{
+ cout << "red: " << temp->getRed() << " green: " << temp->getGreen() << " blue: " << temp->getBlue() << "\n";
+}
+
+void printSRC(const string *s, const Colour *c)
+{
+ cout << "name: " << *s << " ";
+ printRC(c);
+}
+
+void printSIRC(const unsigned int *i, const string *s, const Colour *c)
+{
+ cout << "index: " << *i << " ";
+ printSRC(s, c);
+}
+
+void printIteratorContents (ColourMap *input)
+{
+ RCMap::const_iterator iter = input->begin();
+ for ( ; !(iter == input->end()) ; ++iter)
+ printSIRC(&(iter->first), &(iter->second.second), &(iter->second.first));
+}
+
+// The main test program
+int main()
+{
+ cout << "TEST: Colour.C\n\n";
+ cout << "Can we create an Colour with the right default values?\n";
+ Colour *red = new Colour;
+ printRC(red);
+
+ cout << "Can we set values; green here is invalid - it should be set to 0 instead\n";
+ red->setRed(210);
+ red->setGreen(276);
+ red->setBlue(100);
+
+ cout << "Testing the copy constructor\n";
+ Colour *blue = new Colour(*red);
+ printRC(blue);
+
+ cout << "Check operator= works\n";
+ Colour green;
+ green = *red;
+ printRC(&green);
+
+ cout << "Check the setColour routine\n";
+ green.setColour(1,2,3);
+ printRC(&green);
+
+ cout << "Check the getColour routine\n";
+ unsigned int r, g, b;
+ green.getColour(r, g, b);
+ printRC(&green);
+
+ cout << "\nTEST: ColourMap.C\n\n";
+ cout << "Can we create a ColourMap with the right default Colour + String\n";
+ ColourMap *map = new ColourMap();
+
+ cout << "Can we get the default colour back out of it?\n";
+ string s1 = map->getNameByIndex(0);
+ green = map->getColourByIndex(0);
+ printSRC(&s1, &green);
+
+ cout << "Can we create a ColourMap with a specified default Colour?\n";
+ ColourMap *map2 = new ColourMap(*red);
+
+ cout << "Can we get the information back out of it?\n";
+ s1 = map2->getNameByIndex(0);
+ green = map2->getColourByIndex(0);
+ printSRC(&s1, &green);
+
+ cout << "Can we add a Colour\n";
+ s1 = "TEST1";
+ green.setColour(100, 101, 102);
+ map2->addItem(green, s1);
+
+ cout << "Can we get the info back out?\n";
+ s1 = "";
+ s1 = map2->getNameByIndex(1);
+ green = map2->getColourByIndex(1);
+ printSRC(&s1, &green);
+
+ cout << "Add a couple more colours\n";
+ s1 = "TEST2";
+ green.setColour(101, 102, 103);
+ map2->addItem(green, s1);
+ s1 = "TEST3";
+ green.setColour(102, 103, 104);
+ map2->addItem(green, s1);
+ s1 = "TEST4";
+ green.setColour(103, 104, 105);
+ map2->addItem(green, s1);
+
+ // From an iterator:
+ // iterator->first ==> Index
+ // iterator->second.first ==> Colour
+ // iterator->second.second ==> string
+ // This rather unwieldy notation is because we store a pair in the map which is made up of a pair
+ // to start with
+ printIteratorContents(map2);
+
+ cout << "Now try deleting the third item\n";
+ map2->deleteItemByIndex(3);
+
+ // Print the map again
+ printIteratorContents(map2);
+
+ cout << "Make sure we get false when we try and modify item number 3\n";
+ s1 = "NO";
+ green.setColour(199,199,199);
+ bool check = map2->modifyColourByIndex(3, green);
+ if (check) cout << "WARNING: Managed to modify colour which doesn't exist\n";
+ check = map2->modifyNameByIndex(3, s1);
+ if (check) cout << "WARNING: Managed to modify name which doesn't exist\n";
+
+ cout << "Check we can modify a colour which *is* there\n";
+ s1 = "YES";
+ green.setColour(233,233,233);
+
+ check = map2->modifyColourByIndex(4, green);
+ if (!check) cout << "WARNING: Couldn't modify colour which does exist\n";
+
+ check = map2->modifyNameByIndex(4, s1);
+ if (!check) cout << "WARNING: Couldn't modify name which does exist\n";
+
+ // Print the map again
+ printIteratorContents(map2);
+
+ cout << "Now try adding another item - it should take the place of the one we removed.\n";
+ s1 = "NEW";
+ green.setColour(211, 212, 213);
+ map2->addItem(green, s1);
+
+ // Print the map again
+ printIteratorContents(map2);
+
+ cout << "Try swapping two items:\n";
+ check = map2->swapItems(3, 4);
+ if (!check) cout << "WARNING: Couldn't swap two items which both exist\n";
+
+ // Print the map again
+ printIteratorContents(map2);
+
+ cout << "\nTEST: Generic Colour routines\n\n";
+
+ cout << "Try getting a combination colour:\n";
+ Colour blah = map2->getColourByIndex(0);
+ Colour blah2 = map2->getColourByIndex(1);
+ cout << "Original colours:\n";
+ printRC(&blah);
+ printRC(&blah2);
+ cout << "Combination colour:\n";
+ blah = getCombinationColour(blah, blah2);
+ printRC(&blah);
+
+ // Test the XML output
+ cout << "\nTEST: XML Output\n\n";
+ cout << "For a single colour:\n";
+ cout << blah.toXmlString();
+
+ cout << "For a colourmap:\n";
+ cout << map2->toXmlString(std::string("segmentmap"));
+
+
+ delete map;
+ delete map2;
+ delete red;
+ delete blue;
+
+ return 0;
+}
diff --git a/src/base/test/colour.output b/src/base/test/colour.output
new file mode 100644
index 0000000..d6dc301
--- /dev/null
+++ b/src/base/test/colour.output
@@ -0,0 +1,76 @@
+TEST: Colour.C
+
+Can we create an Colour with the right default values?
+red: 0 green: 0 blue: 0
+Can we set values; green here is invalid - it should be set to 0 instead
+Testing the copy constructor
+red: 210 green: 0 blue: 100
+Check operator= works
+red: 210 green: 0 blue: 100
+Check the setColour routine
+red: 1 green: 2 blue: 3
+Check the getColour routine
+red: 1 green: 2 blue: 3
+
+TEST: ColourMap.C
+
+Can we create a ColourMap with the right default Colour + String
+Can we get the default colour back out of it?
+name: red: 197 green: 211 blue: 125
+Can we create a ColourMap with a specified default Colour?
+Can we get the information back out of it?
+name: red: 210 green: 0 blue: 100
+Can we add a Colour
+Can we get the info back out?
+name: TEST1 red: 100 green: 101 blue: 102
+Add a couple more colours
+index: 0 name: red: 210 green: 0 blue: 100
+index: 1 name: TEST1 red: 100 green: 101 blue: 102
+index: 2 name: TEST2 red: 101 green: 102 blue: 103
+index: 3 name: TEST3 red: 102 green: 103 blue: 104
+index: 4 name: TEST4 red: 103 green: 104 blue: 105
+Now try deleting the third item
+index: 0 name: red: 210 green: 0 blue: 100
+index: 1 name: TEST1 red: 100 green: 101 blue: 102
+index: 2 name: TEST2 red: 101 green: 102 blue: 103
+index: 4 name: TEST4 red: 103 green: 104 blue: 105
+Make sure we get false when we try and modify item number 3
+Check we can modify a colour which *is* there
+index: 0 name: red: 210 green: 0 blue: 100
+index: 1 name: TEST1 red: 100 green: 101 blue: 102
+index: 2 name: TEST2 red: 101 green: 102 blue: 103
+index: 4 name: YES red: 233 green: 233 blue: 233
+Now try adding another item - it should take the place of the one we removed.
+index: 0 name: red: 210 green: 0 blue: 100
+index: 1 name: TEST1 red: 100 green: 101 blue: 102
+index: 2 name: TEST2 red: 101 green: 102 blue: 103
+index: 3 name: NEW red: 211 green: 212 blue: 213
+index: 4 name: YES red: 233 green: 233 blue: 233
+Try swapping two items:
+index: 0 name: red: 210 green: 0 blue: 100
+index: 1 name: TEST1 red: 100 green: 101 blue: 102
+index: 2 name: TEST2 red: 101 green: 102 blue: 103
+index: 3 name: YES red: 233 green: 233 blue: 233
+index: 4 name: NEW red: 211 green: 212 blue: 213
+
+TEST: Generic Colour routines
+
+Try getting a combination colour:
+Original colours:
+red: 210 green: 0 blue: 100
+red: 100 green: 101 blue: 102
+Combination colour:
+red: 155 green: 50 blue: 101
+
+TEST: XML Output
+
+For a single colour:
+<colour red="155" green="50" blue="101"/>
+For a colourmap:
+ <colourmap name="segmentmap">
+ <colourpair id="0" name="" red="210" green="0" blue="100"/>
+ <colourpair id="1" name="TEST1" red="100" green="101" blue="102"/>
+ <colourpair id="2" name="TEST2" red="101" green="102" blue="103"/>
+ <colourpair id="3" name="YES" red="233" green="233" blue="233"/>
+ <colourpair id="4" name="NEW" red="211" green="212" blue="213"/>
+ </colourmap>
diff --git a/src/base/test/pitch.cpp b/src/base/test/pitch.cpp
new file mode 100644
index 0000000..5d46f9e
--- /dev/null
+++ b/src/base/test/pitch.cpp
@@ -0,0 +1,474 @@
+// -*- c-basic-offset: 4 -*-
+
+#include "NotationRules.h"
+#include "NotationTypes.h"
+
+using namespace Rosegarden;
+using std::cout;
+using std::endl;
+using std::string;
+
+static const int verbose = 0;
+
+// This is the old NotationDisplayPitch -- this file was written for
+// regression testing when implementing the new Pitch class. It won't
+// compile any more as NotationDisplayPitch needs to be a friend of
+// Pitch for this implementation to work. Add "friend class
+// NotationDisplayPitch;" to end of Pitch in ../NotationTypes.h to
+// build it
+
+/**
+ * NotationDisplayPitch stores a note's pitch in terms of the position
+ * of the note on the staff and its associated accidental, and
+ * converts these values to and from performance (MIDI) pitches.
+ *
+ * Rationale: When we insert a note, we need to query the height of the
+ * staff line next to which it's being inserted, then translate this
+ * back to raw pitch according to the clef in force at the x-coordinate
+ * at which the note is inserted. For display, we translate from raw
+ * pitch using both the clef and the key in force.
+ *
+ * Whether an accidental should be displayed or not depends on the
+ * current key, on whether we've already shown the same accidental for
+ * that pitch in the same bar, on whether the note event explicitly
+ * requests an accidental... All we calculate here is whether the
+ * pitch "should" have an accidental, not whether it really will
+ * (e.g. if the accidental has already appeared).
+ *
+ * (See also docs/discussion/units.txt for explanation of pitch units.)
+ */
+
+class NotationDisplayPitch
+{
+public:
+ /**
+ * Construct a NotationDisplayPitch containing the given staff
+ * height and accidental
+ */
+ NotationDisplayPitch(int heightOnStaff,
+ const Accidental &accidental);
+
+ /**
+ * Construct a NotationDisplayPitch containing the height and
+ * accidental to which the given performance pitch corresponds
+ * in the given clef and key
+ */
+ NotationDisplayPitch(int pitch, const Clef &clef, const Key &key,
+ const Accidental &explicitAccidental =
+ Accidentals::NoAccidental);
+
+ int getHeightOnStaff() const { return m_heightOnStaff; }
+ Accidental getAccidental() const { return m_accidental; }
+
+ /**
+ * Calculate and return the performance (MIDI) pitch
+ * corresponding to the stored height and accidental, in the
+ * given clef and key
+ */
+ int getPerformancePitch(const Clef &clef, const Key &key) const;
+
+ /**
+ * Calculate and return the performance (MIDI) pitch
+ * corresponding to the stored height and accidental,
+ * interpreting them as Rosegarden-2.1-style values (for
+ * backward compatibility use), in the given clef and key
+ */
+ int getPerformancePitchFromRG21Pitch(const Clef &clef,
+ const Key &key) const;
+
+ /**
+ * Return the stored pitch as a string (C4, Bb2, etc...)
+ * according to http://www.harmony-central.com/MIDI/Doc/table2.html
+ *
+ * If inclOctave is false, this will return C, Bb, etc.
+ */
+ std::string getAsString(const Clef &clef, const Key &key,
+ bool inclOctave = true,
+ int octaveBase = -2) const;
+
+ /**
+ * Return the stored pitch as a description of a note in a
+ * scale. Return values are:
+ *
+ * -- placeInScale: a number from 0-6 where 0 is C and 6 is B
+ *
+ * -- accidentals: a number from -2 to 2 where -2 is double flat,
+ * -1 is flat, 0 is nothing, 1 is sharp, 2 is double sharp
+ *
+ * -- octave: MIDI octave in range -2 to 8, where pitch 0 is in
+ * octave -2 and thus middle-C is in octave 3
+ *
+ * This function is guaranteed never to return values out of
+ * the above ranges.
+ */
+ void getInScale(const Clef &clef, const Key &key,
+ int &placeInScale, int &accidentals, int &octave) const;
+
+private:
+ int m_heightOnStaff;
+ Accidental m_accidental;
+
+ static void rawPitchToDisplayPitch(int, const Clef &, const Key &,
+ int &, Accidental &);
+ static void displayPitchToRawPitch(int, Accidental, const Clef &, const Key &,
+ int &, bool ignoreOffset = false);
+};
+//////////////////////////////////////////////////////////////////////
+// NotationDisplayPitch
+//////////////////////////////////////////////////////////////////////
+
+NotationDisplayPitch::NotationDisplayPitch(int heightOnStaff,
+ const Accidental &accidental)
+ : m_heightOnStaff(heightOnStaff),
+ m_accidental(accidental)
+{
+}
+
+NotationDisplayPitch::NotationDisplayPitch(int pitch, const Clef &clef,
+ const Key &key,
+ const Accidental &explicitAccidental) :
+ m_accidental(explicitAccidental)
+{
+ rawPitchToDisplayPitch(pitch, clef, key, m_heightOnStaff, m_accidental);
+}
+
+int
+NotationDisplayPitch::getPerformancePitch(const Clef &clef, const Key &key) const
+{
+ int p = 0;
+ displayPitchToRawPitch(m_heightOnStaff, m_accidental, clef, key, p);
+ return p;
+}
+
+int
+NotationDisplayPitch::getPerformancePitchFromRG21Pitch(const Clef &clef,
+ const Key &) const
+{
+ // Rosegarden 2.1 pitches are a bit weird; see
+ // docs/data_struct/units.txt
+
+ // We pass the accidental and clef, a faked key of C major, and a
+ // flag telling displayPitchToRawPitch to ignore the clef offset
+ // and take only its octave into account
+
+ int p = 0;
+ displayPitchToRawPitch(m_heightOnStaff, m_accidental, clef, Key(), p, true);
+ return p;
+}
+
+
+void
+NotationDisplayPitch::rawPitchToDisplayPitch(int rawpitch,
+ const Clef &clef,
+ const Key &key,
+ int &height,
+ Accidental &accidental)
+{
+ Pitch::rawPitchToDisplayPitch(rawpitch, clef, key, height, accidental);
+}
+
+void
+NotationDisplayPitch::displayPitchToRawPitch(int height,
+ Accidental accidental,
+ const Clef &clef,
+ const Key &key,
+ int &pitch,
+ bool ignoreOffset)
+{
+ Pitch::displayPitchToRawPitch(height, accidental, clef, key, pitch,
+ ignoreOffset);
+}
+string
+NotationDisplayPitch::getAsString(const Clef &clef, const Key &key,
+ bool inclOctave, int octaveBase) const
+{
+ static const string noteNamesSharps[] = {
+ "C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B"
+ };
+ static const string noteNamesFlats[] = {
+ "C", "Db", "D", "Eb", "E", "F", "Gb", "G", "Ab", "A", "Bb", "B"
+ };
+
+ int performancePitch = getPerformancePitch(clef, key);
+
+ // highly unlikely, but fatal if it happened:
+ if (performancePitch < 0) performancePitch = 0;
+
+ int pitch = performancePitch % 12;
+ int octave = performancePitch / 12;
+
+ if (!inclOctave)
+ return key.isSharp() ? noteNamesSharps[pitch] : noteNamesFlats[pitch];
+
+ char tmp[1024];
+
+ if (key.isSharp())
+ sprintf(tmp, "%s%d", noteNamesSharps[pitch].c_str(),
+ octave + octaveBase);
+ else
+ sprintf(tmp, "%s%d", noteNamesFlats[pitch].c_str(),
+ octave + octaveBase);
+
+ return string(tmp);
+}
+
+void
+NotationDisplayPitch::getInScale(const Clef &clef, const Key &key,
+ int &placeInScale, int &accidentals, int &octave) const
+{
+ //!!! Maybe we should bring the logic from rawPitchToDisplayPitch down
+ // into this method, and make rawPitchToDisplayPitch wrap this
+
+ static int pitches[2][12] = {
+ { 0, 0, 1, 1, 2, 3, 3, 4, 4, 5, 5, 6 },
+ { 0, 1, 1, 2, 2, 3, 4, 4, 5, 5, 6, 6 },
+ };
+ static int accidentalsForPitches[2][12] = {
+ { 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0 },
+ { 0, -1, 0, -1, 0, 0, -1, 0, -1, 0, -1, 0 },
+ };
+
+ int performancePitch = getPerformancePitch(clef, key);
+
+ // highly unlikely, but fatal if it happened:
+ if (performancePitch < 0) performancePitch = 0;
+ if (performancePitch > 127) performancePitch = 127;
+
+ int pitch = performancePitch % 12;
+ octave = performancePitch / 12 - 2;
+
+ if (key.isSharp()) { //!!! need to [optionally?] handle minor keys (similarly in getAsString?)
+ placeInScale = pitches[0][pitch];
+ accidentals = accidentalsForPitches[0][pitch];
+ } else {
+ placeInScale = pitches[1][pitch];
+ accidentals = accidentalsForPitches[1][pitch];
+ }
+}
+
+
+
+int testNote(Accidental &acc, Key &key, int octave, int note)
+{
+ int rv = 0;
+
+ Pitch pitch(note, octave, key, acc);
+
+ static int prevPerformancePitch = -1;
+ static Accidental prevAcc = Accidentals::NoAccidental;
+ static int prevOctave = -2;
+
+ int p = pitch.getPerformancePitch();
+ if (p < prevPerformancePitch && (prevAcc == acc && prevOctave == octave)) {
+ cout << "testNote: " << note << " " << acc << ", " << key.getName() << ", octave " << octave << ": "
+ << "pitch is " << p << ", should be >= " << prevPerformancePitch << endl;
+ rv = 1;
+ }
+
+ int nis = pitch.getNoteInScale(key);
+ if (nis != note) {
+ cout << "testNote: " << note << " " << acc << ", " << key.getName() << ", octave " << octave << ": "
+ << "note in scale is " << nis << " (not " << note << ")" << endl;
+ rv = 1;
+ }
+
+ // can do special checks on C-major etc 'cos it's easy, and stuff like that
+
+ if (key == Key("C major")) {
+ if (acc == Accidentals::NoAccidental) {
+ Pitch comparative(scale_Cmajor[nis], octave);
+ if (comparative.getPerformancePitch() != p) {
+ cout << "testNote: " << note << " " << acc << ", " << key.getName() << ", octave " << octave << ": "
+ << "comparative pitch is " << comparative.getPerformancePitch() << ", should be " << p << endl;
+ rv = 1;
+ }
+ }
+ }
+
+ prevPerformancePitch = p;
+ prevOctave = octave;
+ prevAcc = acc;
+
+ if (!rv && verbose) {
+ cout << "testNote: " << note << " " << acc << ", " << key.getName() << ", octave " << octave << ": "
+ << "pitch " << p << endl;
+ }
+ return rv;
+}
+
+int testNoteName(Accidental &acc, Key &key, int octave, char noteName)
+{
+ int rv = 0;
+
+ Pitch pitch(noteName, octave, key, acc);
+
+ static int prevPerformancePitch = -1;
+ static Accidental prevAcc = Accidentals::NoAccidental;
+ static int prevOctave = -2;
+
+ int p = pitch.getPerformancePitch();
+ if (p < prevPerformancePitch && (prevAcc == acc && prevOctave == octave)) {
+ cout << "testNoteName: " << noteName << " " << acc << ", " << key.getName() << ", octave " << octave << ": "
+ << "pitch is " << p << ", should be >= " << prevPerformancePitch << endl;
+ rv = 1;
+ }
+
+ char nn = pitch.getNoteName(key);
+ if (nn != noteName) {
+ cout << "testNoteName: " << noteName << " " << acc << ", " << key.getName() << ", octave " << octave << ": "
+ << "note is " << nn << " (not " << noteName << ") (pitch was " << p << ")" << endl;
+ rv = 1;
+ }
+
+ prevPerformancePitch = p;
+ prevOctave = octave;
+ prevAcc = acc;
+
+ if (!rv && verbose) {
+ cout << "testNoteName: " << noteName << " " << acc << ", " << key.getName() << ", octave " << octave << ": "
+ << "pitch " << p << endl;
+ }
+ return rv;
+}
+
+int testPitchInOctave(Accidental &acc, Key &key, int octave, int pio)
+{
+ int rv = 0;
+
+ Pitch pitch(pio, octave, acc);
+
+ int p = pitch.getPerformancePitch();
+ if (p != (octave + 2) * 12 + pio) {
+ cout << "testPitchInOctave: " << pio << " " << acc << ", " << key.getName() << ", octave " << octave << ": "
+ << "pitch is " << p << ", should be " << ((octave + 2) * 12 + pio) << endl;
+ rv = 1;
+ }
+
+ if (!rv && verbose) {
+ cout << "testNote: " << pio << " " << acc << ", " << key.getName() << ", octave " << octave << ": "
+ << "pitch " << p << endl;
+ }
+ return rv;
+}
+
+int testPitch(Accidental &acc, Key &key, Clef &clef, int pp)
+{
+ int rv = 0;
+
+ Pitch pitch(pp, acc);
+ NotationDisplayPitch ndp(pp, clef, key, acc);
+
+ int h = pitch.getHeightOnStaff(clef, key);
+ int nh = ndp.getHeightOnStaff();
+ if (h != nh) {
+ cout << "testPitch: " << pp << ", " << acc << ", " << key.getName() << ", " << clef.getClefType() << ": "
+ << "height is " << h << " (ndp returns " << nh << ")" << endl;
+ rv = 1;
+ }
+
+ Accidental pa = pitch.getDisplayAccidental(key);
+ Accidental na = ndp.getAccidental();
+ if (pa != na) {
+ cout << "testPitch: " << pp << ", " << acc << ", " << key.getName() << ", " << clef.getClefType() << ": "
+ << "display acc is " << pa << " (ndp returns " << na << ")" << endl;
+ rv = 1;
+ }
+
+ return rv;
+}
+
+int testHeight(Accidental &acc, Key &key, Clef &clef, int height)
+{
+ int rv = 0;
+
+ Pitch pitch(height, clef, key, acc);
+ NotationDisplayPitch ndp(height, acc);
+ NotationDisplayPitch ndp2(pitch.getPerformancePitch(), clef, key, acc);
+
+ int ppp = pitch.getPerformancePitch();
+ int npp = ndp.getPerformancePitch(clef, key);
+
+ if (ppp != npp) {
+ cout << "testHeight: " << height << " " << acc << ", " << key.getName() << ", " << clef.getClefType() << ": "
+ << "pitch " << ppp << " (ndp returns " << npp << ")" << endl;
+ rv = 1;
+ }
+
+ int h = pitch.getHeightOnStaff(clef, key);
+ if (h != ndp.getHeightOnStaff() || h != height) {
+ cout << "testHeight: " << height << " " << acc << ", " << key.getName() << ", " << clef.getClefType() << ": "
+ << "height " << h << " (ndp returns " << ndp.getHeightOnStaff() << ")" << endl;
+ rv = 1;
+ }
+
+ // for NoAccidental, the Pitch object will acquire the accidental
+ // from the current key whereas NotationDisplayPitch will not --
+ // hence we skip this test for NoAccidental
+ if (acc != Accidentals::NoAccidental) {
+ Accidental nacc = ndp2.getAccidental();
+ Accidental pacc = pitch.getDisplayAccidental(key);
+ if (nacc != pacc) {
+ cout << "testHeight: " << height << " " << acc << ", " << key.getName() << ", " << clef.getClefType() << ": "
+ "acc " << pacc << " (ndp returns " << nacc << ")" << endl;
+ rv = 1;
+ }
+ }
+
+ if (!rv && verbose) {
+ cout << "testHeight: " << height << " " << acc << ", " << key.getName() << ", " << clef.getClefType() << ": "
+ << "pitch " << ppp << endl;
+ }
+ return rv;
+
+}
+
+
+int main(int argc, char **argv)
+{
+ Accidentals::AccidentalList accidentals(Accidentals::getStandardAccidentals());
+ Clef::ClefList clefs(Clef::getClefs());
+
+ Key::KeyList keys;
+ Key::KeyList majorKeys(Key::getKeys(false));
+ Key::KeyList minorKeys(Key::getKeys(true));
+ keys.insert(keys.end(), majorKeys.begin(), majorKeys.end());
+ keys.insert(keys.end(), minorKeys.begin(), minorKeys.end());
+
+ for (int a = 0; a < accidentals.size(); ++a) {
+
+ for (int k = 0; k < keys.size(); ++k) {
+
+ for (int o = -2; o < 9; ++o) {
+ for (int n = 0; n < 7; ++n) {
+ testNote(accidentals[a], keys[k], o, n);
+ }
+ }
+
+ for (int o = -2; o < 9; ++o) {
+ for (int p = 0; p < 12; ++p) {
+ testPitchInOctave(accidentals[a], keys[k], o, p);
+ }
+ }
+
+ for (int o = -2; o < 9; ++o) {
+ for (int p = 0; p < 7; ++p) {
+ testNoteName(accidentals[a], keys[k], o, Pitch::getNoteForIndex(p));
+ }
+ }
+
+ for (int c = 0; c < clefs.size(); ++c) {
+
+ for (int p = 0; p < 128; ++p) {
+ testPitch(accidentals[a], keys[k], clefs[c], p);
+ }
+
+ for (int h = -20; h < 30; ++h) {
+ testHeight(accidentals[a], keys[k], clefs[c], h);
+ }
+ }
+ }
+ }
+
+ return 0;
+}
+
diff --git a/src/base/test/seq/Makefile b/src/base/test/seq/Makefile
new file mode 100644
index 0000000..c32946e
--- /dev/null
+++ b/src/base/test/seq/Makefile
@@ -0,0 +1,6 @@
+
+all: complainer generator queue-timer queue-timer-jack
+
+%: %.c
+ cc $< -o $@ -ljack -lasound
+
diff --git a/src/base/test/seq/complainer.c b/src/base/test/seq/complainer.c
new file mode 100644
index 0000000..afe0a7f
--- /dev/null
+++ b/src/base/test/seq/complainer.c
@@ -0,0 +1,74 @@
+
+#include <alsa/asoundlib.h>
+#include <alsa/seq.h>
+#include <sys/time.h>
+#include <sched.h>
+
+void
+callback(snd_seq_t *handle)
+{
+ snd_seq_event_t *ev = 0;
+
+ do {
+ if (snd_seq_event_input(handle, &ev) > 0) {
+
+ if (ev->type == SND_SEQ_EVENT_NOTEON) {
+
+ struct timeval tv;
+ static long last_usec = 0;
+ int pitch = ev->data.note.note;
+
+ snd_seq_timestamp_t evt = ev->time;
+
+ gettimeofday(&tv, 0);
+ printf("pitch %d at %ld sec %ld usec, off by %ld usec\n",
+ pitch, tv.tv_sec, tv.tv_usec, tv.tv_usec - ((last_usec + 500000) % 1000000));
+
+ last_usec = tv.tv_usec;
+ }
+ }
+
+ } while (snd_seq_event_input_pending(handle, 0) > 0);
+}
+
+int
+main(int argc, char **argv)
+{
+ snd_seq_t *handle;
+ int portid;
+ int npfd;
+ struct pollfd *pfd;
+ struct sched_param param;
+
+ if (snd_seq_open(&handle, "hw", SND_SEQ_OPEN_DUPLEX, 0) < 0) {
+ fprintf(stderr, "failed to open ALSA sequencer interface\n");
+ return 1;
+ }
+
+ snd_seq_set_client_name(handle, "complainer");
+
+ if ((portid = snd_seq_create_simple_port
+ (handle, "complainer",
+ SND_SEQ_PORT_CAP_WRITE | SND_SEQ_PORT_CAP_SUBS_WRITE, 0)) < 0) {
+ fprintf(stderr, "failed to create ALSA sequencer port\n");
+ return 1;
+ }
+
+ npfd = snd_seq_poll_descriptors_count(handle, POLLIN);
+ pfd = (struct pollfd *)alloca(npfd * sizeof(struct pollfd));
+ snd_seq_poll_descriptors(handle, pfd, npfd, POLLIN);
+
+ param.sched_priority = 99;
+ if (sched_setscheduler(0, SCHED_FIFO, &param)) {
+ perror("failed to set high-priority scheduler");
+ }
+
+ printf("ready\n", npfd);
+
+ while (1) {
+ if (poll(pfd, npfd, 100000) > 0) {
+ callback(handle);
+ }
+ }
+}
+
diff --git a/src/base/test/seq/generator.c b/src/base/test/seq/generator.c
new file mode 100644
index 0000000..9f64d61
--- /dev/null
+++ b/src/base/test/seq/generator.c
@@ -0,0 +1,96 @@
+
+#include <alsa/asoundlib.h>
+#include <alsa/seq.h>
+#include <sys/time.h>
+
+int
+main(int argc, char **argv)
+{
+ snd_seq_t *handle;
+ int portid;
+ int npfd;
+ struct pollfd *pfd;
+ int queue;
+ int i;
+ int rval;
+ int target;
+ snd_seq_queue_timer_t *timer;
+ snd_timer_id_t *timerid;
+
+ if (argc != 2) {
+ fprintf(stderr, "usage: generator <target-client-id>\n");
+ exit(2);
+ }
+ target = atoi(argv[1]);
+
+ if (snd_seq_open(&handle, "hw", SND_SEQ_OPEN_DUPLEX, 0) < 0) {
+ fprintf(stderr, "failed to open ALSA sequencer interface\n");
+ return 1;
+ }
+
+ snd_seq_set_client_name(handle, "generator");
+
+ if ((portid = snd_seq_create_simple_port
+ (handle, "generator",
+ SND_SEQ_PORT_CAP_READ | SND_SEQ_PORT_CAP_SUBS_READ, 0)) < 0) {
+ fprintf(stderr, "failed to create ALSA sequencer port\n");
+ return 1;
+ }
+
+ if ((queue = snd_seq_alloc_queue(handle)) < 0) {
+ fprintf(stderr, "failed to create ALSA sequencer queue\n");
+ return 1;
+ }
+/*
+ snd_seq_queue_timer_alloca(&timer);
+ snd_seq_get_queue_timer(handle, queue, timer);
+ snd_timer_id_alloca(&timerid);
+ snd_timer_id_set_class(timerid, SND_TIMER_CLASS_PCM);
+ snd_timer_id_set_sclass(timerid, SND_TIMER_SCLASS_NONE);
+ snd_timer_id_set_card(timerid, 0);
+ snd_timer_id_set_device(timerid, 0);
+ snd_timer_id_set_subdevice(timerid, 0);
+ snd_seq_queue_timer_set_id(timer, timerid);
+ snd_seq_set_queue_timer(handle, queue, timer);
+*/
+ snd_seq_start_queue(handle, queue, 0);
+
+ // stuff two minutes worth of events on the queue
+ for (i = 0; i < 240; ++i) {
+ snd_seq_real_time_t rtime;
+ rtime.tv_sec = i / 2;
+ rtime.tv_nsec = (i % 2) * 500000000;
+ snd_seq_event_t ev;
+ snd_seq_ev_clear(&ev);
+ snd_seq_ev_set_source(&ev, portid);
+ snd_seq_ev_set_dest(&ev, target, 0);
+ snd_seq_ev_schedule_real(&ev, queue, 0, &rtime);
+ snd_seq_ev_set_noteon(&ev, 0, 64, 127);
+ if ((rval = snd_seq_event_output(handle, &ev)) < 0) {
+ fprintf(stderr, "failed to write event: %s", snd_strerror(rval));
+ }
+ }
+
+ snd_seq_drain_output(handle);
+
+ for (i = 0; i < 120; ++i) {
+ snd_seq_queue_status_t *status;
+ const snd_seq_real_time_t *rtime;
+ struct timeval tv;
+
+ snd_seq_queue_status_alloca(&status);
+
+ snd_seq_get_queue_status(handle, queue, status);
+ rtime = snd_seq_queue_status_get_real_time(status);
+
+ gettimeofday(&tv, 0);
+
+ fprintf(stderr, " real time: %ld sec, %ld usec\nqueue time: %ld sec, %ld usec (diff to real time %ld sec %ld usec)\n",
+ tv.tv_sec, tv.tv_usec,
+ rtime->tv_sec, rtime->tv_nsec / 1000,
+ tv.tv_sec - rtime->tv_sec, tv.tv_usec - (rtime->tv_nsec / 1000));
+
+ sleep(1);
+ }
+}
+
diff --git a/src/base/test/seq/queue-timer-jack.c b/src/base/test/seq/queue-timer-jack.c
new file mode 100644
index 0000000..2648e94
--- /dev/null
+++ b/src/base/test/seq/queue-timer-jack.c
@@ -0,0 +1,166 @@
+
+#include <alsa/asoundlib.h>
+#include <alsa/seq.h>
+#include <jack/jack.h>
+#include <sys/time.h>
+
+static jack_nframes_t sample_frames = 0;
+
+void normalize(struct timeval *tv)
+{
+ if (tv->tv_sec == 0) {
+ while (tv->tv_usec <= -1000000) { tv->tv_usec += 1000000; --tv->tv_sec; }
+ while (tv->tv_usec >= 1000000) { tv->tv_usec -= 1000000; ++tv->tv_sec; }
+ } else if (tv->tv_sec < 0) {
+ while (tv->tv_usec <= -1000000) { tv->tv_usec += 1000000; --tv->tv_sec; }
+ while (tv->tv_usec > 0) { tv->tv_usec -= 1000000; ++tv->tv_sec; }
+ } else {
+ while (tv->tv_usec >= 1000000) { tv->tv_usec -= 1000000; ++tv->tv_sec; }
+ while (tv->tv_usec < 0) { tv->tv_usec += 1000000; --tv->tv_sec; }
+ }
+}
+
+int
+jack_process(jack_nframes_t nframes, void *arg)
+{
+ sample_frames += nframes;
+}
+
+jack_nframes_t
+rt_to_frame(struct timeval tv, jack_nframes_t sample_rate)
+{
+ if (tv.tv_sec < 0) tv.tv_sec = -tv.tv_sec;
+ if (tv.tv_usec < 0) tv.tv_usec = -tv.tv_usec;
+ return
+ tv.tv_sec * sample_rate +
+ ((tv.tv_usec / 1000) * sample_rate) / 1000 +
+ ((tv.tv_usec - 1000 * (tv.tv_usec / 1000)) * sample_rate) / 1000000;
+}
+
+int
+main(int argc, char **argv)
+{
+ snd_seq_t *handle;
+ int portid;
+ int npfd;
+ struct pollfd *pfd;
+ int queue;
+ int i;
+ int rval;
+ struct timeval starttv;
+ int countdown = -1;
+ snd_seq_queue_timer_t *timer;
+ snd_timer_id_t *timerid;
+ jack_client_t *jclient;
+ jack_nframes_t sample_rate;
+
+ if ((jclient = jack_client_new("queue-timer-jack")) == 0) {
+ fprintf(stderr, "failed to connect to JACK server\n");
+ return 1;
+ }
+
+ jack_set_process_callback(jclient, jack_process, 0);
+
+ sample_rate = jack_get_sample_rate(jclient);
+
+ if (snd_seq_open(&handle, "hw", SND_SEQ_OPEN_DUPLEX, 0) < 0) {
+ fprintf(stderr, "failed to open ALSA sequencer interface\n");
+ return 1;
+ }
+
+ snd_seq_set_client_name(handle, "generator");
+
+ if ((portid = snd_seq_create_simple_port
+ (handle, "generator",
+ SND_SEQ_PORT_CAP_READ | SND_SEQ_PORT_CAP_SUBS_READ, 0)) < 0) {
+ fprintf(stderr, "failed to create ALSA sequencer port\n");
+ return 1;
+ }
+
+ if ((queue = snd_seq_alloc_queue(handle)) < 0) {
+ fprintf(stderr, "failed to create ALSA sequencer queue\n");
+ return 1;
+ }
+
+ snd_seq_queue_timer_alloca(&timer);
+ snd_seq_get_queue_timer(handle, queue, timer);
+ snd_timer_id_alloca(&timerid);
+
+ /* To test a PCM timer: */
+/*
+ snd_timer_id_set_class(timerid, SND_TIMER_CLASS_PCM);
+ snd_timer_id_set_sclass(timerid, SND_TIMER_SCLASS_NONE);
+ snd_timer_id_set_card(timerid, 0);
+ snd_timer_id_set_device(timerid, 0);
+ snd_timer_id_set_subdevice(timerid, 0);
+*/
+
+ /* To test the system timer: */
+ snd_timer_id_set_class(timerid, SND_TIMER_CLASS_GLOBAL);
+ snd_timer_id_set_sclass(timerid, SND_TIMER_SCLASS_NONE);
+ snd_timer_id_set_device(timerid, SND_TIMER_GLOBAL_SYSTEM);
+
+ snd_seq_queue_timer_set_id(timer, timerid);
+ snd_seq_set_queue_timer(handle, queue, timer);
+
+ if (jack_activate(jclient)) {
+ fprintf (stderr, "cannot activate jack client");
+ exit(1);
+ }
+
+ snd_seq_start_queue(handle, queue, 0);
+ snd_seq_drain_output(handle);
+
+ gettimeofday(&starttv, 0);
+
+ while (countdown != 0) {
+
+ snd_seq_queue_status_t *status;
+ const snd_seq_real_time_t *rtime;
+ struct timeval tv, qtv, jtv, diff, jdiff;
+ jack_nframes_t frames_now;
+
+ snd_seq_queue_status_alloca(&status);
+
+ snd_seq_get_queue_status(handle, queue, status);
+ rtime = snd_seq_queue_status_get_real_time(status);
+
+ gettimeofday(&tv, 0);
+
+ frames_now = sample_frames;
+ fprintf(stderr, " frames: %ld\n", frames_now);
+
+ qtv.tv_sec = rtime->tv_sec;
+ qtv.tv_usec = rtime->tv_nsec / 1000;
+
+ tv.tv_sec -= starttv.tv_sec;
+ tv.tv_usec -= starttv.tv_usec;
+ normalize(&tv);
+
+ jtv.tv_sec = frames_now / sample_rate;
+ frames_now -= jtv.tv_sec * sample_rate;
+ jtv.tv_usec = (int)(((float)frames_now * 1000000) / sample_rate);
+
+ diff.tv_sec = tv.tv_sec - qtv.tv_sec;
+ diff.tv_usec = tv.tv_usec - qtv.tv_usec;
+ normalize(&diff);
+
+ jdiff.tv_sec = jtv.tv_sec - qtv.tv_sec;
+ jdiff.tv_usec = jtv.tv_usec - qtv.tv_usec;
+ normalize(&jdiff);
+
+ fprintf(stderr, " real time: %12ld sec %8ld usec /%12ld frames\nqueue time: %12ld sec %8ld usec /%12ld frames\n jack time: %12ld sec %8ld usec /%12ld frames\n rq diff: %12ld sec %8ld usec /%12ld frames\n jq diff: %12ld sec %8ld usec /%12ld frames\n",
+ tv.tv_sec, tv.tv_usec, rt_to_frame(tv, sample_rate),
+ qtv.tv_sec, qtv.tv_usec, rt_to_frame(qtv, sample_rate),
+ jtv.tv_sec, jtv.tv_usec, rt_to_frame(jtv, sample_rate),
+ diff.tv_sec, diff.tv_usec, rt_to_frame(diff, sample_rate),
+ jdiff.tv_sec, jdiff.tv_usec, rt_to_frame(jdiff, sample_rate));
+
+ fprintf(stderr, "\n");
+ struct timespec ts;
+ ts.tv_sec = 1;
+ ts.tv_nsec = 0;
+ nanosleep(&ts, 0);
+ }
+}
+
diff --git a/src/base/test/seq/queue-timer.c b/src/base/test/seq/queue-timer.c
new file mode 100644
index 0000000..2b7bac4
--- /dev/null
+++ b/src/base/test/seq/queue-timer.c
@@ -0,0 +1,123 @@
+
+#include <alsa/asoundlib.h>
+#include <alsa/seq.h>
+#include <sys/time.h>
+
+void normalize(struct timeval *tv)
+{
+ if (tv->tv_sec == 0) {
+ while (tv->tv_usec <= -1000000) { tv->tv_usec += 1000000; --tv->tv_sec; }
+ while (tv->tv_usec >= 1000000) { tv->tv_usec -= 1000000; ++tv->tv_sec; }
+ } else if (tv->tv_sec < 0) {
+ while (tv->tv_usec <= -1000000) { tv->tv_usec += 1000000; --tv->tv_sec; }
+ while (tv->tv_usec > 0) { tv->tv_usec -= 1000000; ++tv->tv_sec; }
+ } else {
+ while (tv->tv_usec >= 1000000) { tv->tv_usec -= 1000000; ++tv->tv_sec; }
+ while (tv->tv_usec < 0) { tv->tv_usec += 1000000; --tv->tv_sec; }
+ }
+}
+
+int
+main(int argc, char **argv)
+{
+ snd_seq_t *handle;
+ int portid;
+ int npfd;
+ struct pollfd *pfd;
+ int queue;
+ int i;
+ int rval;
+ struct timeval starttv, prevdiff;
+ int countdown = -1;
+ snd_seq_queue_timer_t *timer;
+ snd_timer_id_t *timerid;
+
+ if (snd_seq_open(&handle, "hw", SND_SEQ_OPEN_DUPLEX, 0) < 0) {
+ fprintf(stderr, "failed to open ALSA sequencer interface\n");
+ return 1;
+ }
+
+ snd_seq_set_client_name(handle, "generator");
+
+ if ((portid = snd_seq_create_simple_port
+ (handle, "generator",
+ SND_SEQ_PORT_CAP_READ | SND_SEQ_PORT_CAP_SUBS_READ, 0)) < 0) {
+ fprintf(stderr, "failed to create ALSA sequencer port\n");
+ return 1;
+ }
+
+ if ((queue = snd_seq_alloc_queue(handle)) < 0) {
+ fprintf(stderr, "failed to create ALSA sequencer queue\n");
+ return 1;
+ }
+/*
+ snd_seq_queue_timer_alloca(&timer);
+ snd_seq_get_queue_timer(handle, queue, timer);
+ snd_timer_id_alloca(&timerid);
+ snd_timer_id_set_class(timerid, SND_TIMER_CLASS_PCM);
+ snd_timer_id_set_sclass(timerid, SND_TIMER_SCLASS_NONE);
+ snd_timer_id_set_card(timerid, 0);
+ snd_timer_id_set_device(timerid, 0);
+ snd_timer_id_set_subdevice(timerid, 0);
+ snd_seq_queue_timer_set_id(timer, timerid);
+ snd_seq_set_queue_timer(handle, queue, timer);
+*/
+ snd_seq_start_queue(handle, queue, 0);
+ snd_seq_drain_output(handle);
+
+ gettimeofday(&starttv, 0);
+ prevdiff.tv_sec = 0;
+ prevdiff.tv_usec = 0;
+
+ while (countdown != 0) {
+
+ snd_seq_queue_status_t *status;
+ const snd_seq_real_time_t *rtime;
+ struct timeval tv, diff, diffdiff;
+
+ snd_seq_queue_status_alloca(&status);
+
+ snd_seq_get_queue_status(handle, queue, status);
+ rtime = snd_seq_queue_status_get_real_time(status);
+
+ gettimeofday(&tv, 0);
+
+ tv.tv_sec -= starttv.tv_sec;
+ tv.tv_usec -= starttv.tv_usec;
+ normalize(&tv);
+
+ diff.tv_sec = tv.tv_sec - rtime->tv_sec;
+ diff.tv_usec = tv.tv_usec - rtime->tv_nsec / 1000;
+ normalize(&diff);
+
+ diffdiff.tv_sec = diff.tv_sec - prevdiff.tv_sec;
+ diffdiff.tv_usec = diff.tv_usec - prevdiff.tv_usec;
+ normalize(&diffdiff);
+ prevdiff = diff;
+
+ fprintf(stderr, " real time: %12ld sec %8ld usec\nqueue time: %12ld sec %8ld usec\n diff: %12ld sec %8ld usec\n diffdiff: %12ld sec %8ld usec\n",
+ tv.tv_sec, tv.tv_usec,
+ rtime->tv_sec, rtime->tv_nsec / 1000,
+ diff.tv_sec, diff.tv_usec,
+ diffdiff.tv_sec, diffdiff.tv_usec);
+
+ if (diffdiff.tv_usec > 5000 ||
+ diffdiff.tv_usec < -5000) {
+ fprintf(stderr, "oops! queue slipped\n");
+ if (tv.tv_sec < 5) {
+ fprintf(stderr, "(ignoring in first few seconds)\n");
+ } else {
+ countdown = 2;
+ }
+ } else {
+ if (countdown > 0) --countdown;
+ }
+
+ fprintf(stderr, "\n");
+ struct timespec ts;
+ ts.tv_sec = 1;
+ ts.tv_nsec = 0;
+ nanosleep(&ts, 0);
+ }
+}
+
diff --git a/src/base/test/test.cpp b/src/base/test/test.cpp
new file mode 100644
index 0000000..9a9b496
--- /dev/null
+++ b/src/base/test/test.cpp
@@ -0,0 +1,535 @@
+// -*- c-basic-offset: 4 -*-
+// -*- c-file-style: "bsd" -*-
+
+#define NDEBUG
+
+// This does some rather shoddy tests on a small selection of core classes.
+
+#include "Event.h"
+#include "Segment.h"
+#include "Composition.h"
+//#include "Sets.h"
+
+#define TEST_NOTATION_TYPES 1
+#define TEST_SPEED 1
+
+#ifdef TEST_NOTATION_TYPES
+#include "NotationTypes.h"
+#include "SegmentNotationHelper.h"
+#include "SegmentPerformanceHelper.h"
+#endif
+
+#include "MidiTypes.h"
+
+#include <cstdio>
+
+#include <sys/times.h>
+#include <iostream>
+
+using namespace std;
+using namespace Rosegarden;
+
+static const PropertyName DURATION_PROPERTY = "duration";
+static const PropertyName SOME_INT_PROPERTY = "someIntProp";
+static const PropertyName SOME_BOOL_PROPERTY = "someBoolProp";
+static const PropertyName SOME_STRING_PROPERTY = "someStringProp";
+static const PropertyName NONEXISTENT_PROPERTY = "nonexistentprop";
+static const PropertyName ANNOTATION_PROPERTY = "annotation";
+
+#if 0
+// Some attempts at reproducing the func-template-within-template problem
+//
+enum FooType {A, B, C};
+
+class Foo
+{
+public:
+ template<FooType T> void func();
+};
+
+template<class T>
+void Foo::func()
+{
+ // dummy code
+ T j = 0;
+ for(T i = 0; i < 100; ++i) j += i;
+}
+
+//template void Foo::func<int>();
+
+template <class R>
+class FooR
+{
+public:
+ void rfunc();
+};
+
+template<class R>
+void FooR<R>::rfunc()
+{
+ // this won't compile
+ Foo* foo;
+ foo->func<A>();
+}
+
+void templateTest()
+{
+ Foo foo;
+ foo.func<A>();
+
+// FooR<float> foor;
+// foor.rfunc();
+}
+
+
+template <class Element, class Container>
+class GenericSet // abstract base
+{
+public:
+ typedef typename Container::iterator Iterator;
+
+ /// Return true if this element, known to test() true, is a set member
+ virtual bool sample(const Iterator &i);
+};
+
+
+template <class Element, class Container>
+bool
+GenericSet<Element, Container>::sample(const Iterator &i)
+{
+ Event *e;
+ long p = e->get<Int>("blah");
+}
+
+#endif
+
+int main(int argc, char **argv)
+{
+ typedef std::vector<int> intvect;
+
+// intvect foo;
+
+// GenericSet<int, intvect> genset;
+// genset.sample(foo.begin());
+
+ clock_t st, et;
+ struct tms spare;
+
+#ifdef TEST_WIDE_STRING
+ basic_string<wchar_t> widestring(L"This is a test");
+ widestring += L" of wide character strings";
+ for (unsigned int i = 0; i < widestring.length(); ++i) {
+ if (widestring[i] == L'w' ||
+ widestring[i] == L'c') {
+ widestring[i] = toupper(widestring[i]);
+ }
+ }
+ cout << "Testing wide string: string value is \"" << widestring << "\""
+ << endl;
+ cout << "String's length is " << widestring.length() << endl;
+ cout << "and storage space is "
+ << (widestring.length() * sizeof(widestring[0]))
+ << endl;
+ cout << "Characters are: ";
+ for (unsigned int i = 0; i < widestring.length(); ++i) {
+ cout << widestring[i];
+ if (i < widestring.length()-1) cout << " ";
+ else cout << endl;
+ }
+#endif
+
+ cout << "\nTesting Event..." << endl
+ << "sizeof Event : " << sizeof(Event) << endl;
+
+ Event e("note", 0);
+ e.set<Int>(DURATION_PROPERTY, 20);
+ cout << "duration is " << e.get<Int>(DURATION_PROPERTY) << endl;
+
+ e.set<Bool>(SOME_BOOL_PROPERTY, true);
+ e.set<String>(SOME_STRING_PROPERTY, "foobar");
+
+ cout << "sizeof event after some properties set : "
+ << sizeof e << endl;
+
+ try {
+ cout << "duration is " << e.get<String>(DURATION_PROPERTY) << endl;
+ } catch (Event::BadType bt) {
+ cout << "Correctly caught BadType when trying to get<String> of duration" << endl;
+ }
+
+ string s;
+
+ if (!e.get<String>(DURATION_PROPERTY, s)) {
+ cout << "Correctly got error when trying to get<String> of duration" << endl;
+ } else {
+ cerr << "ERROR AT " << __LINE__ << endl;
+ }
+
+ try {
+ cout << "dummy prop is " << e.get<String>(NONEXISTENT_PROPERTY) << endl;
+ } catch (Event::NoData bt) {
+ cout << "Correctly caught NoData when trying to get non existent property" << endl;
+ }
+
+ if (!e.get<String>(NONEXISTENT_PROPERTY, s)) {
+ cout << "Correctly got error when trying to get<String> of non existent property" << endl;
+ } else {
+ cerr << "ERROR AT " << __LINE__ << endl;
+ }
+
+
+ e.setFromString<Int>(DURATION_PROPERTY, "30");
+ cout << "duration is " << e.get<Int>(DURATION_PROPERTY) << endl;
+
+ e.setFromString<String>(ANNOTATION_PROPERTY, "This is my house");
+ cout << "annotation is " << e.get<String>(ANNOTATION_PROPERTY) << endl;
+
+ long durationVal;
+ if (e.get<Int>(DURATION_PROPERTY, durationVal))
+ cout << "duration is " << durationVal << endl;
+ else
+ cerr << "ERROR AT " << __LINE__ << endl;
+
+ if (e.get<String>(ANNOTATION_PROPERTY, s))
+ cout << "annotation is " << s << endl;
+ else
+ cerr << "ERROR AT " << __LINE__ << endl;
+
+ cout << "\nTesting persistence & setMaybe..." << endl;
+
+ e.setMaybe<Int>(SOME_INT_PROPERTY, 1);
+ if (e.get<Int>(SOME_INT_PROPERTY) == 1) {
+ cout << "a. Correct: 1" << endl;
+ } else {
+ cout << "a. ERROR: " << e.get<Int>(SOME_INT_PROPERTY) << endl;
+ }
+
+ e.set<Int>(SOME_INT_PROPERTY, 2, false);
+ e.setMaybe<Int>(SOME_INT_PROPERTY, 3);
+ if (e.get<Int>(SOME_INT_PROPERTY) == 3) {
+ cout << "b. Correct: 3" << endl;
+ } else {
+ cout << "b. ERROR: " << e.get<Int>(SOME_INT_PROPERTY) << endl;
+ }
+
+ e.set<Int>(SOME_INT_PROPERTY, 4);
+ e.setMaybe<Int>(SOME_INT_PROPERTY, 5);
+ if (e.get<Int>(SOME_INT_PROPERTY) == 4) {
+ cout << "c. Correct: 4" << endl;
+ } else {
+ cout << "c. ERROR: " << e.get<Int>(SOME_INT_PROPERTY) << endl;
+ }
+
+ cout << "\nTesting debug dump : " << endl;
+ e.dump(cout);
+ cout << endl << "dump finished" << endl;
+
+#if TEST_SPEED
+ cout << "Testing speed of Event..." << endl;
+ int i;
+ long j;
+
+ char b[20];
+ strcpy(b, "test");
+
+#define NAME_COUNT 500
+
+ PropertyName names[NAME_COUNT];
+ for (i = 0; i < NAME_COUNT; ++i) {
+ sprintf(b+4, "%d", i);
+ names[i] = b;
+ }
+
+ Event e1("note", 0);
+ int gsCount = 200000;
+
+ st = times(&spare);
+ for (i = 0; i < gsCount; ++i) {
+ e1.set<Int>(names[i % NAME_COUNT], i);
+ }
+ et = times(&spare);
+ cout << "Event: " << gsCount << " setInts: " << (et-st)*10 << "ms\n";
+
+ st = times(&spare);
+ j = 0;
+ for (i = 0; i < gsCount; ++i) {
+ if (i%4==0) sprintf(b+4, "%d", i);
+ j += e1.get<Int>(names[i % NAME_COUNT]);
+ }
+ et = times(&spare);
+ cout << "Event: " << gsCount << " getInts: " << (et-st)*10 << "ms (result: " << j << ")\n";
+
+ st = times(&spare);
+ for (i = 0; i < 1000; ++i) {
+ Event e11(e1);
+ (void)e11.get<Int>(names[i % NAME_COUNT]);
+ }
+ et = times(&spare);
+ cout << "Event: 1000 copy ctors of " << e1.getStorageSize() << "-byte element: "
+ << (et-st)*10 << "ms\n";
+
+// gsCount = 100000;
+
+ for (i = 0; i < NAME_COUNT; ++i) {
+ sprintf(b+4, "%ds", i);
+ names[i] = b;
+ }
+
+ st = times(&spare);
+ for (i = 0; i < gsCount; ++i) {
+ e1.set<String>(names[i % NAME_COUNT], b);
+ }
+ et = times(&spare);
+ cout << "Event: " << gsCount << " setStrings: " << (et-st)*10 << "ms\n";
+
+ st = times(&spare);
+ j = 0;
+ for (i = 0; i < gsCount; ++i) {
+ if (i%4==0) sprintf(b+4, "%ds", i);
+ j += e1.get<String>(names[i % NAME_COUNT]).size();
+ }
+ et = times(&spare);
+ cout << "Event: " << gsCount << " getStrings: " << (et-st)*10 << "ms (result: " << j << ")\n";
+
+ st = times(&spare);
+ for (i = 0; i < 1000; ++i) {
+ Event e11(e1);
+ (void)e11.get<String>(names[i % NAME_COUNT]);
+ }
+ et = times(&spare);
+ cout << "Event: 1000 copy ctors of " << e1.getStorageSize() << "-byte element: "
+ << (et-st)*10 << "ms\n";
+
+ st = times(&spare);
+ for (i = 0; i < 1000; ++i) {
+ Event e11(e1);
+ (void)e11.get<String>(names[i % NAME_COUNT]);
+ (void)e11.set<String>(names[i % NAME_COUNT], "blah");
+ }
+ et = times(&spare);
+ cout << "Event: 1000 copy ctors plus set<String> of " << e1.getStorageSize() << "-byte element: "
+ << (et-st)*10 << "ms\n";
+
+// gsCount = 1000000;
+
+ st = times(&spare);
+ for (i = 0; i < gsCount; ++i) {
+ Event e21("dummy", i, 0, MIN_SUBORDERING);
+ }
+ et = times(&spare);
+ cout << "Event: " << gsCount << " event ctors alone: "
+ << (et-st)*10 << "ms\n";
+
+ st = times(&spare);
+ for (i = 0; i < gsCount; ++i) {
+ std::string s0("dummy");
+ std::string s1 = s0;
+ }
+ et = times(&spare);
+ cout << "Event: " << gsCount << " string ctors+assignents: "
+ << (et-st)*10 << "ms\n";
+
+ st = times(&spare);
+ for (i = 0; i < gsCount; ++i) {
+ Event e21("dummy", i, 0, MIN_SUBORDERING);
+ (void)e21.getAbsoluteTime();
+ (void)e21.getDuration();
+ (void)e21.getSubOrdering();
+ }
+ et = times(&spare);
+ cout << "Event: " << gsCount << " event ctors plus getAbsTime/Duration/SubOrdering: "
+ << (et-st)*10 << "ms\n";
+
+ st = times(&spare);
+ for (i = 0; i < gsCount; ++i) {
+ Event e21("dummy", i, 0, MIN_SUBORDERING);
+ (void)e21.getAbsoluteTime();
+ (void)e21.getDuration();
+ (void)e21.getSubOrdering();
+ e21.set<Int>(names[0], 40);
+ (void)e21.get<Int>(names[0]);
+ }
+ et = times(&spare);
+ cout << "Event: " << gsCount << " event ctors plus one get/set and getAbsTime/Duration/SubOrdering: "
+ << (et-st)*10 << "ms\n";
+
+
+#else
+ cout << "Skipping test speed of Event\n";
+#endif // TEST_SPEED
+
+#ifdef NOT_DEFINED
+ cout << "Testing segment shrinking\n";
+
+ Segment segment(5, 0);
+ unsigned int nbBars = segment.getNbBars();
+
+ cout << "Segment nbBars : " << nbBars << endl;
+ if (nbBars != 5) {
+ cerr << "%%%ERROR : segment nbBars should be 5\n";
+ }
+
+ Segment::iterator iter = segment.end();
+ --iter;
+ cout << "Last segment el. time : " << (*iter)->getAbsoluteTime() << endl;
+
+ cout << "Shrinking segment to 3 bars : \n";
+ segment.setNbBars(3);
+ nbBars = segment.getNbBars();
+
+ cout << "Segment new nbBars : " << nbBars << endl;
+ if (nbBars != 3) {
+ cerr << "%%%ERROR : segment new nbBars should be 3\n";
+ }
+#endif // NOT_DEFINED
+
+#ifdef TEST_NOTATION_TYPES
+ cout << "Testing duration-list stuff\n";
+
+ cout << "2/4..." << endl;
+ TimeSignature ts(2,4);
+ DurationList dlist;
+ ts.getDurationListForInterval
+ (dlist, 1209,
+ ts.getBarDuration() - Note(Note::Semiquaver, true).getDuration());
+ int acc = 0;
+ for (DurationList::iterator i = dlist.begin(); i != dlist.end(); ++i) {
+ cout << "duration: " << *i << endl;
+ acc += *i;
+ }
+ cout << "total: " << acc << " (on bar duration of " << ts.getBarDuration() << ")" << endl;
+
+
+
+ cout << "4/4 96/96..." << endl;
+ ts = TimeSignature(4,4);
+ dlist = DurationList();
+ ts.getDurationListForInterval(dlist, 96, 96);
+ acc = 0;
+ for (DurationList::iterator i = dlist.begin(); i != dlist.end(); ++i) {
+ cout << "duration: " << *i << endl;
+ acc += *i;
+ }
+ cout << "total: " << acc << " (on bar duration of " << ts.getBarDuration() << ")" << endl;
+
+
+
+ cout << "6/8..." << endl;
+ ts = TimeSignature(6,8);
+ dlist = DurationList();
+ ts.getDurationListForInterval
+ (dlist, 1209,
+ ts.getBarDuration() - Note(Note::Semiquaver, true).getDuration());
+ acc = 0;
+ for (DurationList::iterator i = dlist.begin(); i != dlist.end(); ++i) {
+ cout << "duration: " << *i << endl;
+ acc += *i;
+ }
+ cout << "total: " << acc << " (on bar duration of " << ts.getBarDuration() << ")" << endl;
+
+ cout << "3/4..." << endl;
+ ts = TimeSignature(3,4);
+ dlist = DurationList();
+ ts.getDurationListForInterval
+ (dlist, 1209,
+ ts.getBarDuration() - Note(Note::Semiquaver, true).getDuration());
+ acc = 0;
+ for (DurationList::iterator i = dlist.begin(); i != dlist.end(); ++i) {
+ cout << "duration: " << *i << endl;
+ acc += *i;
+ }
+ cout << "total: " << acc << " (on bar duration of " << ts.getBarDuration() << ")" << endl;
+
+ cout << "4/4..." << endl;
+ ts = TimeSignature(4,4);
+ dlist = DurationList();
+ ts.getDurationListForInterval
+ (dlist, 1209,
+ ts.getBarDuration() - Note(Note::Semiquaver, true).getDuration());
+ acc = 0;
+ for (DurationList::iterator i = dlist.begin(); i != dlist.end(); ++i) {
+ cout << "duration: " << *i << endl;
+ acc += *i;
+ }
+ cout << "total: " << acc << " (on bar duration of " << ts.getBarDuration() << ")" << endl;
+
+ cout << "3/8..." << endl;
+ ts = TimeSignature(3,8);
+ dlist = DurationList();
+ ts.getDurationListForInterval
+ (dlist, 1209,
+ ts.getBarDuration() - Note(Note::Semiquaver, true).getDuration());
+ acc = 0;
+ for (DurationList::iterator i = dlist.begin(); i != dlist.end(); ++i) {
+ cout << "duration: " << *i << endl;
+ acc += *i;
+ }
+ cout << "total: " << acc << " (on bar duration of " << ts.getBarDuration() << ")" << endl;
+
+ cout << "4/4 wacky placement..." << endl;
+ ts = TimeSignature(4,4);
+ dlist = DurationList();
+ ts.getDurationListForInterval(dlist, 160, 1280);
+ acc = 0;
+ for (DurationList::iterator i = dlist.begin(); i != dlist.end(); ++i) {
+ cout << "duration: " << *i << endl;
+ acc += *i;
+ }
+ cout << "total: " << acc << " (on bar duration of " << ts.getBarDuration() << ")" << endl;
+
+ cout << "Testing Segment::splitIntoTie() - splitting 384 -> 2*192\n";
+
+ Composition c;
+ Segment *ht = new Segment();
+ c.addSegment(ht);
+ Segment &t(*ht);
+ SegmentNotationHelper nh(t);
+ SegmentPerformanceHelper ph(t);
+
+ Event *ev = new Event("note", 0, 384);
+ ev->set<Int>("pitch", 60);
+ t.insert(ev);
+
+ Segment::iterator sb(t.begin());
+ nh.splitIntoTie(sb, 384/2);
+
+ for(Segment::iterator i = t.begin(); i != t.end(); ++i) {
+ cout << "Event at " << (*i)->getAbsoluteTime()
+ << " - duration : " << (*i)->getDuration()
+ << endl;
+ }
+
+ Segment::iterator half2 = t.begin(); ++half2;
+
+ cout << "Splitting 192 -> (48 + 144) : \n";
+
+ sb = t.begin();
+ nh.splitIntoTie(sb, 48);
+
+ for(Segment::iterator i = t.begin(); i != t.end(); ++i) {
+ cout << "Event at " << (*i)->getAbsoluteTime()
+ << " - duration : " << (*i)->getDuration()
+ << endl;
+ }
+
+ cout << "Splitting 192 -> (144 + 48) : \n";
+
+ nh.splitIntoTie(half2, 144);
+
+
+ for(Segment::iterator i = t.begin(); i != t.end(); ++i) {
+ cout << "Event at " << (*i)->getAbsoluteTime()
+ << " - duration : " << (*i)->getDuration()
+ << " - performance duration : " <<
+ ph.getSoundingDuration(i) << endl;
+
+ cout << endl;
+ (*i)->dump(cout);
+ cout << endl;
+ }
+
+ nh.autoBeam(t.begin(), t.end(), "beamed");
+
+#endif // TEST_NOTATION_TYPES
+};
+
diff --git a/src/base/test/thread.cpp b/src/base/test/thread.cpp
new file mode 100644
index 0000000..ab327ff
--- /dev/null
+++ b/src/base/test/thread.cpp
@@ -0,0 +1,126 @@
+// -*- c-basic-offset: 4 -*-
+// -*- c-file-style: "bsd" -*-
+
+// This does some rather shoddy tests on a small selection of core classes.
+
+#include "Lock.h"
+#include "Composition.h"
+#include "Segment.h"
+#include "Event.h"
+
+#include <cstdio>
+#include <sys/times.h>
+#include <iostream>
+
+#include <pthread.h>
+#include <unistd.h>
+
+using namespace std;
+using namespace Rosegarden;
+
+static void*
+writer_thread1(void *arg)
+{
+ pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL);
+ cout << "write_thread1 - init" << endl;
+
+ Rosegarden::Composition *comp =
+ static_cast<Rosegarden::Composition*>(arg);
+
+ Rosegarden::Composition::segmentcontainer segs = comp->getSegments();
+ Rosegarden::Composition::segmentcontainer::iterator it = segs.begin();
+ Rosegarden::Segment *segment = *it;
+
+ Rosegarden::timeT insertTime = 50000;
+ while (true)
+ {
+ usleep(90000);
+ cout << "LENGTH = " << comp->getNbBars() << endl;
+ segment->insert(new Event(Note::EventType, insertTime));
+ insertTime += 96;
+ }
+}
+
+static void*
+write_thread2(void *arg)
+{
+ pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL);
+ cout << "write_thread2 - init" << endl;
+
+ Rosegarden::Composition *comp =
+ static_cast<Rosegarden::Composition*>(arg);
+
+ Rosegarden::Composition::segmentcontainer segs = comp->getSegments();
+ Rosegarden::Composition::segmentcontainer::iterator it = segs.begin();
+ Rosegarden::Segment *segment = *it;
+
+ Rosegarden::timeT insertTime = 0;
+ while (true)
+ {
+ usleep(50);
+ cout << "LENGTH = " << comp->getNbBars() << endl;
+ segment->insert(new Event(Note::EventType, insertTime));
+ insertTime += 96;
+ }
+}
+
+
+int
+main(int argc, char **argv)
+{
+ clock_t st, et;
+ struct tms spare;
+
+ cout << "Threading test" << endl;
+
+ pthread_t thread1;
+ pthread_t thread2;
+ Rosegarden::Composition comp;
+ Rosegarden::Segment segment;
+ comp.addSegment(&segment);
+
+ if (pthread_create(&thread1, 0, writer_thread1, &comp))
+ {
+ cerr << "Couldn't start thread 1" << endl;
+ exit(1);
+ }
+ pthread_detach(thread1);
+
+ if (pthread_create(&thread2, 0, write_thread2, &comp))
+ {
+ cerr << "Couldn't start thread 2" << endl;
+ exit(1);
+ }
+ pthread_detach(thread2);
+
+ pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL);
+
+ static Lock lock;
+
+ if (lock.getWriteLock(1))
+ {
+ cout << "got write lock" << endl;
+ }
+
+ if (lock.getWriteLock(0))
+ {
+ cout << "got second write lock" << endl;
+ }
+ else
+ {
+ cout << "couldn't get second write lock" << endl;
+ }
+
+ Rosegarden::timeT insertTime = 0;
+ while(true)
+ {
+ usleep(50000);
+
+ cout << "Inserting Event at time " << insertTime << endl;
+ segment.insert(new Event(Note::EventType, insertTime));
+ insertTime += 96;
+ }
+
+};
+
+
diff --git a/src/base/test/transpose.cpp b/src/base/test/transpose.cpp
new file mode 100644
index 0000000..b1254f5
--- /dev/null
+++ b/src/base/test/transpose.cpp
@@ -0,0 +1,83 @@
+// -*- c-basic-offset: 4 -*-
+
+#include "NotationTypes.h"
+
+using namespace Rosegarden;
+using std::cout;
+
+// Unit test-ish tests for transposition.
+//
+// Returns -1 (or crashes :)) on error, 0 on success
+
+/**
+ * should be in Pitch eventually
+ */
+void testAisDisplayAccidentalInCmaj()
+{
+ Pitch ais(70, Accidentals::Sharp);
+ Key cmaj ("C major");
+ Accidental accidental = ais.getDisplayAccidental(cmaj);
+ if (accidental != Accidentals::Sharp)
+ {
+ std::cout << "Accidental for A# in Cmaj was " << accidental << " instead of expected Sharp" << std::endl;
+ exit(-1);
+ }
+}
+
+/**
+ * transpose an A# up by a major second, should
+ * yield a B# (as C would be a minor triad)
+ */
+void testAisToBis()
+{
+ std::cout << "Testing transposing A# to B#... ";
+ Pitch ais(70, Accidentals::Sharp);
+ Key cmaj ("C major");
+
+ Pitch result = ais.transpose(cmaj, 2, 1);
+
+ Accidental resultAccidental = result.getAccidental(cmaj);
+ int resultPitch = result.getPerformancePitch();
+ if (resultAccidental != Accidentals::Sharp || resultPitch != 72)
+ {
+ std::cout << "Transposing A# up by a major second didn't yield B#, but " << result.getNoteName(cmaj) << resultAccidental << std::endl;
+ exit(-1);
+ }
+ std::cout << "Success" << std::endl;
+}
+
+/**
+ * Transpose G to D in the key of D major.
+ */
+void testGToD()
+{
+ std::cout << "Testing transposing G to D... ";
+ Pitch g(67, Accidentals::Natural);
+ Key* dmaj = new Key("D major");
+
+ Pitch result = g.transpose(*dmaj, 7, 4);
+
+ Accidental resultAccidental = result.getAccidental(*dmaj);
+ int resultPitch = result.getPerformancePitch();
+ if (resultAccidental != Accidentals::NoAccidental || resultPitch != 74)
+ {
+ std::cout << "Transposing G up by a fifth didn't yield D, but " << result.getNoteName(*dmaj) << resultAccidental << std::endl;
+ exit(-1);
+ }
+ std::cout << "Success" << std::endl;
+}
+
+void testKeyTransposition()
+{
+
+}
+
+int main(int argc, char **argv)
+{
+ testAisDisplayAccidentalInCmaj();
+ testAisToBis();
+ testGToD();
+ testKeyTransposition();
+
+ return 0;
+}
diff --git a/src/base/test/utf8.cpp b/src/base/test/utf8.cpp
new file mode 100644
index 0000000..7104cc0
--- /dev/null
+++ b/src/base/test/utf8.cpp
@@ -0,0 +1,96 @@
+// -*- c-basic-offset: 4 -*-
+
+#include "XmlExportable.h"
+#include <iostream>
+#include <string>
+
+using namespace Rosegarden;
+using std::cout;
+using std::cerr;
+using std::endl;
+using std::string;
+
+
+string binary(unsigned char c)
+{
+ string s;
+ for (int i = 0; i < 8; ++i) {
+ s = ((c & 0x1) ? '1' : '0') + s;
+ c >>= 1;
+ }
+ return s;
+}
+
+
+int main(int argc, char **argv)
+{
+ string valid[] = {
+ "ニュース",
+ "주요 뉴스",
+ "Nyheter",
+ "天气",
+ "Notícias",
+ };
+
+ string escapable[] = {
+ "ニュ&ース",
+ "주요 <뉴스>",
+ "\"Nyheter\"",
+ "\'Notícias\'",
+ };
+
+ string invalid[] = {
+ "����ース",
+ "주� � 뉴스",
+ "Nyhe\004ter",
+ "�天气",
+ "Not�cias",
+ };
+
+ cout << "Testing valid strings -- should be no errors here" << endl;
+
+ for (int i = 0; i < sizeof(valid)/sizeof(valid[0]); ++i) {
+ string encoded = XmlExportable::encode(valid[i]);
+ if (encoded != valid[i]) {
+ cerr << "Encoding failed:" << endl;
+ for (int j = 0; j < valid[i].length(); ++j) {
+ cerr << (char)valid[i][j] << " ("
+ << binary(valid[i][j]) << ")" << endl;
+ }
+ exit(1);
+ }
+ }
+
+ cout << "Testing escapable strings -- should be no errors here" << endl;
+
+ for (int i = 0; i < sizeof(escapable)/sizeof(escapable[0]); ++i) {
+ string encoded = XmlExportable::encode(escapable[i]);
+ if (encoded == escapable[i]) {
+ cerr << "Escaping failed:" << endl;
+ for (int j = 0; j < escapable[i].length(); ++j) {
+ cerr << (char)escapable[i][j] << " ("
+ << binary(escapable[i][j]) << ")" << endl;
+ }
+ exit(1);
+ }
+ }
+
+ cout << "Testing invalid strings -- should be "
+ << (sizeof(invalid)/sizeof(invalid[0]))
+ << " errors here (but no fatal ones)" << endl;
+
+ for (int i = 0; i < sizeof(invalid)/sizeof(invalid[0]); ++i) {
+ string encoded = XmlExportable::encode(invalid[i]);
+ if (encoded == invalid[i]) {
+ cerr << "Encoding succeeded but should have failed:" << endl;
+ for (int j = 0; j < invalid[i].length(); ++j) {
+ cerr << (char)invalid[i][j] << " ("
+ << binary(invalid[i][j]) << ")" << endl;
+ }
+ exit(1);
+ }
+ }
+
+ exit(0);
+}
+
diff --git a/src/commands/edit/AddDotCommand.cpp b/src/commands/edit/AddDotCommand.cpp
new file mode 100644
index 0000000..b69a25c
--- /dev/null
+++ b/src/commands/edit/AddDotCommand.cpp
@@ -0,0 +1,98 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "AddDotCommand.h"
+
+#include "base/Event.h"
+#include "base/NotationTypes.h"
+#include "base/Selection.h"
+#include "document/BasicSelectionCommand.h"
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+void
+AddDotCommand::modifySegment()
+{
+ std::vector<Event *> toErase;
+ std::vector<Event *> toInsert;
+
+ EventSelection::eventcontainer::iterator i;
+ timeT endTime = getEndTime();
+
+ for (i = m_selection->getSegmentEvents().begin();
+ i != m_selection->getSegmentEvents().end(); ++i) {
+
+ if ((*i)->isa(Note::EventType)) {
+
+ Note note = Note::getNearestNote
+ ((*i)->getNotationDuration());
+ int dots = note.getDots();
+ if (++dots > 2)
+ dots = 0;
+
+ toErase.push_back(*i);
+
+ Event *e;
+
+ if (m_notationOnly) {
+ e = new Event(**i,
+ (*i)->getAbsoluteTime(),
+ (*i)->getDuration(),
+ (*i)->getSubOrdering(),
+ (*i)->getNotationAbsoluteTime(),
+ Note(note.getNoteType(),
+ dots).getDuration());
+
+ } else {
+ e = new Event(**i,
+ (*i)->getNotationAbsoluteTime(),
+ Note(note.getNoteType(),
+ dots).getDuration());
+ }
+
+ if (e->getNotationAbsoluteTime() + e->getNotationDuration() > endTime) {
+ endTime = e->getNotationAbsoluteTime() + e->getNotationDuration();
+ }
+
+ toInsert.push_back(e);
+ }
+ }
+
+ for (std::vector<Event *>::iterator i = toErase.begin(); i != toErase.end(); ++i) {
+ m_selection->getSegment().eraseSingle(*i);
+ }
+
+ for (std::vector<Event *>::iterator i = toInsert.begin(); i != toInsert.end(); ++i) {
+ m_selection->getSegment().insert(*i);
+ m_selection->addEvent(*i);
+ }
+
+ m_selection->getSegment().normalizeRests(getStartTime(), endTime);
+}
+
+}
diff --git a/src/commands/edit/AddDotCommand.h b/src/commands/edit/AddDotCommand.h
new file mode 100644
index 0000000..a88da26
--- /dev/null
+++ b/src/commands/edit/AddDotCommand.h
@@ -0,0 +1,68 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_ADDDOTCOMMAND_H_
+#define _RG_ADDDOTCOMMAND_H_
+
+#include "document/BasicSelectionCommand.h"
+#include <qstring.h>
+#include <klocale.h>
+
+
+
+
+namespace Rosegarden
+{
+
+class EventSelection;
+
+
+class AddDotCommand : public BasicSelectionCommand
+{
+public:
+ AddDotCommand(EventSelection &selection, bool notationOnly) :
+ BasicSelectionCommand(getGlobalName(), selection, true),
+ m_selection(&selection),
+ m_notationOnly(notationOnly)
+ { }
+
+ static QString getGlobalName() {
+ return i18n("&Add Dot");
+ }
+
+protected:
+ virtual void modifySegment();
+
+private:
+ EventSelection *m_selection;// only used on 1st execute (cf bruteForceRedo)
+ bool m_notationOnly;
+};
+
+
+
+
+}
+
+#endif
diff --git a/src/commands/edit/AddMarkerCommand.cpp b/src/commands/edit/AddMarkerCommand.cpp
new file mode 100644
index 0000000..b7c665a
--- /dev/null
+++ b/src/commands/edit/AddMarkerCommand.cpp
@@ -0,0 +1,67 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "AddMarkerCommand.h"
+
+#include "base/Composition.h"
+#include "base/Marker.h"
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+AddMarkerCommand::AddMarkerCommand(Composition *comp,
+ timeT time,
+ const std::string &name,
+ const std::string &description):
+ KNamedCommand(getGlobalName()),
+ m_composition(comp),
+ m_detached(true)
+{
+ m_marker = new Marker(time, name, description);
+}
+
+AddMarkerCommand::~AddMarkerCommand()
+{
+ if (m_detached)
+ delete m_marker;
+}
+
+void
+AddMarkerCommand::execute()
+{
+ m_composition->addMarker(m_marker);
+ m_detached = false;
+}
+
+void
+AddMarkerCommand::unexecute()
+{
+ m_composition->detachMarker(m_marker);
+ m_detached = true;
+}
+
+}
diff --git a/src/commands/edit/AddMarkerCommand.h b/src/commands/edit/AddMarkerCommand.h
new file mode 100644
index 0000000..80f15c1
--- /dev/null
+++ b/src/commands/edit/AddMarkerCommand.h
@@ -0,0 +1,71 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_ADDMARKERCOMMAND_H_
+#define _RG_ADDMARKERCOMMAND_H_
+
+#include <string>
+#include <kcommand.h>
+#include <qstring.h>
+#include "base/Event.h"
+#include <klocale.h>
+
+
+
+
+namespace Rosegarden
+{
+
+class Marker;
+class Composition;
+
+
+class AddMarkerCommand : public KNamedCommand
+{
+public:
+ AddMarkerCommand(Composition *comp,
+ timeT time,
+ const std::string &name,
+ const std::string &description);
+ ~AddMarkerCommand();
+
+ static QString getGlobalName() { return i18n("&Add Marker"); }
+
+ virtual void execute();
+ virtual void unexecute();
+
+protected:
+
+ Composition *m_composition;
+ Marker *m_marker;
+ bool m_detached;
+
+};
+
+
+
+}
+
+#endif
diff --git a/src/commands/edit/ChangeVelocityCommand.cpp b/src/commands/edit/ChangeVelocityCommand.cpp
new file mode 100644
index 0000000..fc1c1ea
--- /dev/null
+++ b/src/commands/edit/ChangeVelocityCommand.cpp
@@ -0,0 +1,68 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "ChangeVelocityCommand.h"
+
+#include "base/NotationTypes.h"
+#include "base/Selection.h"
+#include "document/BasicSelectionCommand.h"
+#include <qstring.h>
+#include "base/BaseProperties.h"
+
+
+namespace Rosegarden
+{
+
+using namespace BaseProperties;
+
+void
+ChangeVelocityCommand::modifySegment()
+{
+ EventSelection::eventcontainer::iterator i;
+
+ for (i = m_selection->getSegmentEvents().begin();
+ i != m_selection->getSegmentEvents().end(); ++i) {
+
+ if ((*i)->isa(Note::EventType)) {
+
+ long velocity = 100;
+ (*i)->get
+ <Int>(VELOCITY, velocity);
+
+ // round velocity up to the next multiple of delta
+ velocity /= m_delta;
+ velocity *= m_delta;
+ velocity += m_delta;
+
+ if (velocity < 0)
+ velocity = 0;
+ if (velocity > 127)
+ velocity = 127;
+ (*i)->set<Int>(VELOCITY, velocity);
+ }
+ }
+}
+
+}
diff --git a/src/commands/edit/ChangeVelocityCommand.h b/src/commands/edit/ChangeVelocityCommand.h
new file mode 100644
index 0000000..a0a51b1
--- /dev/null
+++ b/src/commands/edit/ChangeVelocityCommand.h
@@ -0,0 +1,68 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_CHANGEVELOCITYCOMMAND_H_
+#define _RG_CHANGEVELOCITYCOMMAND_H_
+
+#include "document/BasicSelectionCommand.h"
+#include <qstring.h>
+#include <klocale.h>
+
+
+
+
+namespace Rosegarden
+{
+
+class EventSelection;
+
+
+/** Add or subtract a constant from all event velocities.
+ Use SelectionPropertyCommand if you want to do something more
+ creative. */
+class ChangeVelocityCommand : public BasicSelectionCommand
+{
+public:
+ ChangeVelocityCommand(int delta, EventSelection &selection) :
+ BasicSelectionCommand(getGlobalName(delta), selection, true),
+ m_selection(&selection), m_delta(delta) { }
+
+ static QString getGlobalName(int delta = 0) {
+ if (delta > 0) return i18n("&Increase Velocity");
+ else return i18n("&Reduce Velocity");
+ }
+
+protected:
+ virtual void modifySegment();
+
+private:
+ EventSelection *m_selection;// only used on 1st execute (cf bruteForceRedo)
+ int m_delta;
+};
+
+
+}
+
+#endif
diff --git a/src/commands/edit/ClearTriggersCommand.cpp b/src/commands/edit/ClearTriggersCommand.cpp
new file mode 100644
index 0000000..3b58405
--- /dev/null
+++ b/src/commands/edit/ClearTriggersCommand.cpp
@@ -0,0 +1,53 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "ClearTriggersCommand.h"
+
+#include "base/Selection.h"
+#include "document/BasicSelectionCommand.h"
+#include <qstring.h>
+#include "base/BaseProperties.h"
+
+
+namespace Rosegarden
+{
+
+using namespace BaseProperties;
+
+void
+ClearTriggersCommand::modifySegment()
+{
+ EventSelection::eventcontainer::iterator i;
+
+ for (i = m_selection->getSegmentEvents().begin();
+ i != m_selection->getSegmentEvents().end(); ++i) {
+
+ (*i)->unset(TRIGGER_SEGMENT_ID);
+ (*i)->unset(TRIGGER_SEGMENT_RETUNE);
+ (*i)->unset(TRIGGER_SEGMENT_ADJUST_TIMES);
+ }
+}
+
+}
diff --git a/src/commands/edit/ClearTriggersCommand.h b/src/commands/edit/ClearTriggersCommand.h
new file mode 100644
index 0000000..077e270
--- /dev/null
+++ b/src/commands/edit/ClearTriggersCommand.h
@@ -0,0 +1,66 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_CLEARTRIGGERSCOMMAND_H_
+#define _RG_CLEARTRIGGERSCOMMAND_H_
+
+#include "document/BasicSelectionCommand.h"
+#include <qstring.h>
+#include <klocale.h>
+
+
+
+
+namespace Rosegarden
+{
+
+class EventSelection;
+
+
+class ClearTriggersCommand : public BasicSelectionCommand
+{
+public:
+ ClearTriggersCommand(EventSelection &selection,
+ QString name = 0) :
+ BasicSelectionCommand(name ? name : getGlobalName(), selection, true),
+ m_selection(&selection)
+ { }
+
+ static QString getGlobalName() {
+ return i18n("&Clear Triggers");
+ }
+
+protected:
+ virtual void modifySegment();
+
+private:
+ EventSelection *m_selection;// only used on 1st execute (cf bruteForceRedo)
+};
+
+
+
+}
+
+#endif
diff --git a/src/commands/edit/CollapseNotesCommand.cpp b/src/commands/edit/CollapseNotesCommand.cpp
new file mode 100644
index 0000000..225d34c
--- /dev/null
+++ b/src/commands/edit/CollapseNotesCommand.cpp
@@ -0,0 +1,79 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "CollapseNotesCommand.h"
+
+#include "base/Event.h"
+#include "base/SegmentNotationHelper.h"
+#include "base/Selection.h"
+#include "document/BasicSelectionCommand.h"
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+void
+CollapseNotesCommand::modifySegment()
+{
+ SegmentNotationHelper helper(getSegment());
+ timeT endTime = getEndTime();
+
+ // This is really nasty stuff. We can't go in forward direction
+ // using the j-iterator trick because collapseNoteAggressively may
+ // erase the following iterator as well as the preceding one. We
+ // can't go backward naively, because collapseNoteAggressively
+ // erases i from the EventSelection now that it's a
+ // SegmentObserver. We need the fancy hybrid j-iterator-backward
+ // technique applied to selections instead of segments.
+
+ EventSelection::eventcontainer::iterator i =
+ m_selection->getSegmentEvents().end();
+ EventSelection::eventcontainer::iterator j = i;
+ EventSelection::eventcontainer::iterator beg =
+ m_selection->getSegmentEvents().begin();
+ bool thisOne = false;
+
+ while (i != beg && (!thisOne || (*i != *beg))) {
+
+ --j;
+
+ if (thisOne) {
+ helper.collapseNoteAggressively(*i, endTime);
+ }
+
+ // rather than "true" one could perform a test to see
+ // whether j pointed to a candidate for collapsing:
+ thisOne = true;
+
+ i = j;
+ }
+
+ if (thisOne) {
+ helper.collapseNoteAggressively(*i, endTime);
+ }
+}
+
+}
diff --git a/src/commands/edit/CollapseNotesCommand.h b/src/commands/edit/CollapseNotesCommand.h
new file mode 100644
index 0000000..9d3a0fc
--- /dev/null
+++ b/src/commands/edit/CollapseNotesCommand.h
@@ -0,0 +1,65 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_ADJUSTMENUCOLLAPSENOTESCOMMAND_H_
+#define _RG_ADJUSTMENUCOLLAPSENOTESCOMMAND_H_
+
+#include "document/BasicSelectionCommand.h"
+#include <qstring.h>
+#include <klocale.h>
+
+
+class Collapse;
+
+
+namespace Rosegarden
+{
+
+class EventSelection;
+
+
+class CollapseNotesCommand : public BasicSelectionCommand
+{
+public:
+ CollapseNotesCommand(EventSelection &selection) :
+ BasicSelectionCommand(getGlobalName(), selection, true),
+ m_selection(&selection) { }
+
+ static QString getGlobalName() { return i18n("Collapse &Equal-Pitch Notes"); }
+
+protected:
+ virtual void modifySegment();
+
+private:
+ EventSelection *m_selection;// only used on 1st execute (cf bruteForceRedo)
+};
+
+
+// Set the (numerical) property of a selection according given pattern.
+//
+
+}
+
+#endif
diff --git a/src/commands/edit/CopyCommand.cpp b/src/commands/edit/CopyCommand.cpp
new file mode 100644
index 0000000..38aa628
--- /dev/null
+++ b/src/commands/edit/CopyCommand.cpp
@@ -0,0 +1,120 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "CopyCommand.h"
+
+#include "misc/Strings.h"
+#include "base/Clipboard.h"
+#include "base/Composition.h"
+#include "base/Selection.h"
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+CopyCommand::CopyCommand(EventSelection &selection,
+ Clipboard *clipboard) :
+ KNamedCommand(getGlobalName()),
+ m_targetClipboard(clipboard)
+{
+ m_sourceClipboard = new Clipboard;
+ m_savedClipboard = 0;
+ m_sourceClipboard->newSegment(&selection)->setLabel
+ (selection.getSegment().getLabel() + " " + qstrtostr(i18n("(excerpt)")));
+}
+
+CopyCommand::CopyCommand(SegmentSelection &selection,
+ Clipboard *clipboard) :
+ KNamedCommand(getGlobalName()),
+ m_targetClipboard(clipboard)
+{
+ m_sourceClipboard = new Clipboard;
+ m_savedClipboard = 0;
+
+ for (SegmentSelection::iterator i = selection.begin();
+ i != selection.end(); ++i) {
+ QString newLabel = strtoqstr((*i)->getLabel());
+ if (newLabel.contains(i18n("(copied)"))) {
+ m_sourceClipboard->newSegment(*i);
+ } else {
+ m_sourceClipboard->newSegment(*i)->
+ setLabel(qstrtostr(i18n("%1 (copied)").arg(newLabel)));
+ }
+ }
+}
+
+CopyCommand::CopyCommand(Composition *composition,
+ timeT beginTime,
+ timeT endTime,
+ Clipboard *clipboard) :
+ KNamedCommand(i18n("Copy Range")),
+ m_targetClipboard(clipboard)
+{
+ m_sourceClipboard = new Clipboard;
+ m_savedClipboard = 0;
+
+ for (Composition::iterator i = composition->begin();
+ i != composition->end(); ++i) {
+ if ((*i)->getStartTime() < endTime &&
+ (*i)->getRepeatEndTime() > beginTime) {
+ m_sourceClipboard->newSegment(*i, beginTime, endTime, true);
+ }
+ }
+
+ TimeSignatureSelection tsigsel
+ (*composition, beginTime, endTime, true);
+ m_sourceClipboard->setTimeSignatureSelection(tsigsel);
+
+ TempoSelection temposel
+ (*composition, beginTime, endTime, true);
+ m_sourceClipboard->setTempoSelection(temposel);
+
+ m_sourceClipboard->setNominalRange(beginTime, endTime);
+}
+
+CopyCommand::~CopyCommand()
+{
+ delete m_sourceClipboard;
+ delete m_savedClipboard;
+}
+
+void
+CopyCommand::execute()
+{
+ if (!m_savedClipboard) {
+ m_savedClipboard = new Clipboard(*m_targetClipboard);
+ }
+
+ m_targetClipboard->copyFrom(m_sourceClipboard);
+}
+
+void
+CopyCommand::unexecute()
+{
+ m_targetClipboard->copyFrom(m_savedClipboard);
+}
+
+}
diff --git a/src/commands/edit/CopyCommand.h b/src/commands/edit/CopyCommand.h
new file mode 100644
index 0000000..29d6dc7
--- /dev/null
+++ b/src/commands/edit/CopyCommand.h
@@ -0,0 +1,82 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_COPYCOMMAND_H_
+#define _RG_COPYCOMMAND_H_
+
+#include <kcommand.h>
+#include <qstring.h>
+#include "base/Event.h"
+#include <klocale.h>
+
+
+
+
+namespace Rosegarden
+{
+
+class SegmentSelection;
+class EventSelection;
+class Composition;
+class Clipboard;
+
+
+/// Copy a selection
+
+class CopyCommand : public KNamedCommand
+{
+public:
+ /// Make a CopyCommand that copies events from within a Segment
+ CopyCommand(EventSelection &selection,
+ Clipboard *clipboard);
+
+ /// Make a CopyCommand that copies whole Segments
+ CopyCommand(SegmentSelection &selection,
+ Clipboard *clipboard);
+
+ /// Make a CopyCommand that copies a range of a Composition
+ CopyCommand(Composition *composition,
+ timeT beginTime,
+ timeT endTime,
+ Clipboard *clipboard);
+
+ virtual ~CopyCommand();
+
+ static QString getGlobalName() { return i18n("&Copy"); }
+
+ virtual void execute();
+ virtual void unexecute();
+
+protected:
+ Clipboard *m_sourceClipboard;
+ Clipboard *m_targetClipboard;
+ Clipboard *m_savedClipboard;
+};
+
+
+
+}
+
+#endif
diff --git a/src/commands/edit/CutAndCloseCommand.cpp b/src/commands/edit/CutAndCloseCommand.cpp
new file mode 100644
index 0000000..a99b4ef
--- /dev/null
+++ b/src/commands/edit/CutAndCloseCommand.cpp
@@ -0,0 +1,163 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "CutAndCloseCommand.h"
+
+#include "base/Clipboard.h"
+#include "base/NotationTypes.h"
+#include "base/Segment.h"
+#include "base/Selection.h"
+#include "CutCommand.h"
+#include <qstring.h>
+#include "misc/Debug.h"
+
+
+namespace Rosegarden
+{
+
+CutAndCloseCommand::CutAndCloseCommand(EventSelection &selection,
+ Clipboard *clipboard) :
+ KMacroCommand(getGlobalName())
+{
+ addCommand(new CutCommand(selection, clipboard));
+ addCommand(new CloseCommand(&selection.getSegment(),
+ selection.getEndTime(),
+ selection.getStartTime()));
+}
+
+void
+CutAndCloseCommand::CloseCommand::execute()
+{
+ // We shift all the events from m_gapEnd to the end of the
+ // segment back so that they start at m_gapStart instead of m_gapEnd.
+
+ assert(m_gapEnd >= m_gapStart);
+ if (m_gapEnd == m_gapStart)
+ return ;
+
+ // We also need to record how many events there are already at
+ // m_gapStart so that we can leave those unchanged when we undo.
+ // (This command is executed on the understanding that the area
+ // between m_gapStart and m_gapEnd is empty of all but rests, but
+ // in practice there may be other things such as a clef at the
+ // same time as m_gapStart. This will only work for events that
+ // have smaller subordering than notes etc.)
+
+ m_staticEvents = 0;
+ for (Segment::iterator i = m_segment->findTime(m_gapStart);
+ m_segment->isBeforeEndMarker(i); ++i) {
+ if ((*i)->getAbsoluteTime() > m_gapStart)
+ break;
+ if ((*i)->isa(Note::EventRestType))
+ continue;
+ ++m_staticEvents;
+ }
+
+ std::vector<Event *> events;
+ timeT timeDifference = m_gapEnd - m_gapStart;
+
+ for (Segment::iterator i = m_segment->findTime(m_gapEnd);
+ m_segment->isBeforeEndMarker(i); ++i) {
+ events.push_back((*i)->copyMoving( -timeDifference));
+ }
+
+ timeT oldEndTime = m_segment->getEndTime();
+
+ // remove rests from target area, and everything thereafter
+ for (Segment::iterator i = m_segment->findTime(m_gapStart);
+ m_segment->isBeforeEndMarker(i); ) {
+ if ((*i)->getAbsoluteTime() >= m_gapEnd ||
+ (*i)->isa(Note::EventRestType)) {
+ Segment::iterator j(i);
+ ++j;
+ m_segment->erase(i);
+ i = j;
+ } else {
+ ++i;
+ }
+ }
+
+ for (unsigned int i = 0; i < events.size(); ++i) {
+ m_segment->insert(events[i]);
+ }
+
+ m_segment->normalizeRests(m_segment->getEndTime(), oldEndTime);
+}
+
+void
+CutAndCloseCommand::CloseCommand::unexecute()
+{
+ // We want to shift events from m_gapStart to the end of the
+ // segment forward so as to start at m_gapEnd instead of
+ // m_gapStart.
+
+ assert(m_gapEnd >= m_gapStart);
+ if (m_gapEnd == m_gapStart)
+ return ;
+
+ // May need to ignore some static events at m_gapStart.
+ // These are assumed to have smaller subordering than whatever
+ // we're not ignoring. Actually this still isn't quite right:
+ // it'll do the wrong thing where we have, say, a clef then
+ // some notes then another clef and we cut-and-close all the
+ // notes and then undo. But it's better than we were doing
+ // before.
+
+ Segment::iterator starti = m_segment->findTime(m_gapStart);
+
+ while (m_segment->isBeforeEndMarker(starti)) {
+ if (m_staticEvents == 0)
+ break;
+ if ((*starti)->getAbsoluteTime() > m_gapStart)
+ break;
+ if (!(*starti)->isa(Note::EventRestType))
+ --m_staticEvents;
+ ++starti;
+ }
+
+ std::vector<Event *> events;
+ timeT timeDifference = m_gapEnd - m_gapStart;
+
+ for (Segment::iterator i = starti; m_segment->isBeforeEndMarker(i); ) {
+ Segment::iterator j(i);
+ ++j;
+ events.push_back((*i)->copyMoving(timeDifference));
+ m_segment->erase(i);
+ i = j;
+ }
+
+ for (unsigned int i = 0; i < events.size(); ++i) {
+ m_segment->insert(events[i]);
+ }
+
+ timeT endTime = m_segment->getEndTime();
+ NOTATION_DEBUG << "setting end time to " << (endTime - timeDifference) << endl;
+ //!!! this following is not working for bugaccidentals.rg:
+ m_segment->setEndTime(endTime - timeDifference);
+
+ m_segment->normalizeRests(m_gapStart, m_gapEnd);
+}
+
+}
diff --git a/src/commands/edit/CutAndCloseCommand.h b/src/commands/edit/CutAndCloseCommand.h
new file mode 100644
index 0000000..4be5809
--- /dev/null
+++ b/src/commands/edit/CutAndCloseCommand.h
@@ -0,0 +1,82 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_CUTANDCLOSECOMMAND_H_
+#define _RG_CUTANDCLOSECOMMAND_H_
+
+#include <kcommand.h>
+#include <qstring.h>
+#include "base/Event.h"
+#include <klocale.h>
+
+
+
+
+namespace Rosegarden
+{
+
+class Segment;
+class EventSelection;
+class Clipboard;
+
+
+/// Cut a selection and close the gap
+
+class CutAndCloseCommand : public KMacroCommand
+{
+public:
+ CutAndCloseCommand(EventSelection &selection,
+ Clipboard *clipboard);
+
+ static QString getGlobalName() { return i18n("C&ut and Close"); }
+
+protected:
+ class CloseCommand : public KNamedCommand
+ {
+ public:
+ CloseCommand(Segment *segment,
+ timeT fromTime,
+ timeT toTime) :
+ KNamedCommand("Close"),
+ m_segment(segment),
+ m_gapEnd(fromTime),
+ m_gapStart(toTime) { }
+
+ virtual void execute();
+ virtual void unexecute();
+
+ private:
+ Segment *m_segment;
+ timeT m_gapEnd;
+ timeT m_gapStart;
+ int m_staticEvents;
+ };
+};
+
+
+
+}
+
+#endif
diff --git a/src/commands/edit/CutCommand.cpp b/src/commands/edit/CutCommand.cpp
new file mode 100644
index 0000000..9d54089
--- /dev/null
+++ b/src/commands/edit/CutCommand.cpp
@@ -0,0 +1,59 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "CutCommand.h"
+
+#include "base/Clipboard.h"
+#include "base/Selection.h"
+#include "commands/segment/SegmentEraseCommand.h"
+#include "CopyCommand.h"
+#include "EraseCommand.h"
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+CutCommand::CutCommand(EventSelection &selection,
+ Clipboard *clipboard) :
+ KMacroCommand(getGlobalName())
+{
+ addCommand(new CopyCommand(selection, clipboard));
+ addCommand(new EraseCommand(selection));
+}
+
+CutCommand::CutCommand(SegmentSelection &selection,
+ Clipboard *clipboard) :
+ KMacroCommand(getGlobalName())
+{
+ addCommand(new CopyCommand(selection, clipboard));
+
+ for (SegmentSelection::iterator i = selection.begin();
+ i != selection.end(); ++i) {
+ addCommand(new SegmentEraseCommand(*i));
+ }
+}
+
+}
diff --git a/src/commands/edit/CutCommand.h b/src/commands/edit/CutCommand.h
new file mode 100644
index 0000000..186736c
--- /dev/null
+++ b/src/commands/edit/CutCommand.h
@@ -0,0 +1,62 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_CUTCOMMAND_H_
+#define _RG_CUTCOMMAND_H_
+
+#include <qstring.h>
+#include <klocale.h>
+#include <kcommand.h>
+
+
+namespace Rosegarden
+{
+
+class SegmentSelection;
+class EventSelection;
+class Clipboard;
+
+
+/// Cut a selection
+
+class CutCommand : public KMacroCommand
+{
+public:
+ /// Make a CutCommand that cuts events from within a Segment
+ CutCommand(EventSelection &selection,
+ Clipboard *clipboard);
+
+ /// Make a CutCommand that cuts whole Segments
+ CutCommand(SegmentSelection &selection,
+ Clipboard *clipboard);
+
+ static QString getGlobalName() { return i18n("Cu&t"); }
+};
+
+
+
+}
+
+#endif
diff --git a/src/commands/edit/EraseCommand.cpp b/src/commands/edit/EraseCommand.cpp
new file mode 100644
index 0000000..8649885
--- /dev/null
+++ b/src/commands/edit/EraseCommand.cpp
@@ -0,0 +1,86 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "EraseCommand.h"
+
+#include "misc/Debug.h"
+#include "base/NotationTypes.h"
+#include "base/Selection.h"
+#include "document/BasicSelectionCommand.h"
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+EraseCommand::EraseCommand(EventSelection &selection) :
+ BasicSelectionCommand(getGlobalName(), selection, true),
+ m_selection(&selection),
+ m_relayoutEndTime(getEndTime())
+{
+ // nothing else
+}
+
+void
+EraseCommand::modifySegment()
+{
+ RG_DEBUG << "EraseCommand::modifySegment" << endl;
+
+ std::vector<Event *> toErase;
+ EventSelection::eventcontainer::iterator i;
+
+ for (i = m_selection->getSegmentEvents().begin();
+ i != m_selection->getSegmentEvents().end(); ++i) {
+
+ if ((*i)->isa(Clef::EventType) ||
+ (*i)->isa(Key ::EventType)) {
+ m_relayoutEndTime = getSegment().getEndTime();
+ }
+
+ // We used to do this by calling SegmentNotationHelper::deleteEvent
+ // on each event in the selection, but it's probably easier to
+ // cope with general selections by deleting everything in the
+ // selection and then normalizing the rests. The deleteEvent
+ // mechanism is still the more sensitive way to do it for single
+ // events, and it's what's used by EraseEventCommand and thus
+ // the notation eraser tool.
+
+ toErase.push_back(*i);
+ }
+
+ for (unsigned int j = 0; j < toErase.size(); ++j) {
+ getSegment().eraseSingle(toErase[j]);
+ }
+
+ getSegment().normalizeRests(getStartTime(), getEndTime());
+}
+
+timeT
+EraseCommand::getRelayoutEndTime()
+{
+ return m_relayoutEndTime;
+}
+
+}
diff --git a/src/commands/edit/EraseCommand.h b/src/commands/edit/EraseCommand.h
new file mode 100644
index 0000000..4e583ad
--- /dev/null
+++ b/src/commands/edit/EraseCommand.h
@@ -0,0 +1,66 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_ERASECOMMAND_H_
+#define _RG_ERASECOMMAND_H_
+
+#include "document/BasicSelectionCommand.h"
+#include <qstring.h>
+#include "base/Event.h"
+#include <klocale.h>
+
+
+
+
+namespace Rosegarden
+{
+
+class EventSelection;
+
+
+/// Erase a selection from within a segment
+
+class EraseCommand : public BasicSelectionCommand
+{
+public:
+ EraseCommand(EventSelection &selection);
+
+ static QString getGlobalName() { return i18n("&Erase"); }
+
+ virtual timeT getRelayoutEndTime();
+
+protected:
+ virtual void modifySegment();
+
+private:
+ EventSelection *m_selection;// only used on 1st execute (cf bruteForceRedo)
+ timeT m_relayoutEndTime;
+};
+
+
+
+}
+
+#endif
diff --git a/src/commands/edit/EventEditCommand.cpp b/src/commands/edit/EventEditCommand.cpp
new file mode 100644
index 0000000..ef31be2
--- /dev/null
+++ b/src/commands/edit/EventEditCommand.cpp
@@ -0,0 +1,64 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "EventEditCommand.h"
+
+#include "base/Event.h"
+#include "base/Segment.h"
+#include "document/BasicCommand.h"
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+EventEditCommand::EventEditCommand(Segment &segment,
+ Event *eventToModify,
+ const Event &newEvent) :
+ BasicCommand(getGlobalName(),
+ segment,
+ std::min(eventToModify->getAbsoluteTime(),
+ newEvent.getAbsoluteTime()),
+ std::max(eventToModify->getAbsoluteTime() +
+ eventToModify->getDuration(),
+ newEvent.getAbsoluteTime() +
+ newEvent.getDuration()),
+ true), // bruteForceRedo
+ m_oldEvent(eventToModify),
+ m_newEvent(newEvent)
+{
+ // nothing else to see here
+}
+
+void
+EventEditCommand::modifySegment()
+{
+ Segment &segment(getSegment());
+ segment.eraseSingle(m_oldEvent);
+ segment.insert(new Event(m_newEvent));
+ segment.normalizeRests(getStartTime(), getEndTime());
+}
+
+}
diff --git a/src/commands/edit/EventEditCommand.h b/src/commands/edit/EventEditCommand.h
new file mode 100644
index 0000000..5f22a1e
--- /dev/null
+++ b/src/commands/edit/EventEditCommand.h
@@ -0,0 +1,69 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_EVENTEDITCOMMAND_H_
+#define _RG_EVENTEDITCOMMAND_H_
+
+#include "base/Event.h"
+#include "document/BasicCommand.h"
+#include <qstring.h>
+#include <klocale.h>
+
+
+
+
+namespace Rosegarden
+{
+
+class Segment;
+
+
+/**
+ * Replace an event with another one (likely to be used in
+ * conjunction with EventEditDialog)
+ */
+
+class EventEditCommand : public BasicCommand
+{
+public:
+ EventEditCommand(Segment &segment,
+ Event *eventToModify,
+ const Event &newEvent);
+
+ static QString getGlobalName() { return i18n("Edit E&vent"); }
+
+protected:
+ virtual void modifySegment();
+
+private:
+ Event *m_oldEvent; // only used on 1st execute
+ Event m_newEvent; // only used on 1st execute
+};
+
+
+
+}
+
+#endif
diff --git a/src/commands/edit/EventInsertionCommand.cpp b/src/commands/edit/EventInsertionCommand.cpp
new file mode 100644
index 0000000..a684883
--- /dev/null
+++ b/src/commands/edit/EventInsertionCommand.cpp
@@ -0,0 +1,58 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "EventInsertionCommand.h"
+
+#include <klocale.h>
+#include "base/Event.h"
+#include "base/Segment.h"
+#include "document/BasicCommand.h"
+
+
+namespace Rosegarden
+{
+
+EventInsertionCommand::EventInsertionCommand(Segment &segment,
+ Event *event) :
+ BasicCommand(i18n("Insert Event"), segment, event->getAbsoluteTime(),
+ event->getAbsoluteTime() + event->getDuration()),
+ m_event(new Event(*event))
+{
+ // nothing
+}
+
+EventInsertionCommand::~EventInsertionCommand()
+{
+ delete m_event;
+ // don't want to delete m_lastInsertedEvent, it's just an alias
+}
+
+void EventInsertionCommand::modifySegment()
+{
+ m_lastInsertedEvent = new Event(*m_event);
+ getSegment().insert(m_lastInsertedEvent);
+}
+
+}
diff --git a/src/commands/edit/EventInsertionCommand.h b/src/commands/edit/EventInsertionCommand.h
new file mode 100644
index 0000000..aee9c8b
--- /dev/null
+++ b/src/commands/edit/EventInsertionCommand.h
@@ -0,0 +1,62 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_EVENTINSERTIONCOMMAND_H_
+#define _RG_EVENTINSERTIONCOMMAND_H_
+
+#include "document/BasicCommand.h"
+
+
+
+
+namespace Rosegarden
+{
+
+class Segment;
+class Event;
+
+
+class EventInsertionCommand : public BasicCommand
+{
+public:
+ EventInsertionCommand(Segment &segment,
+ Event *event);
+
+ virtual ~EventInsertionCommand();
+
+ Event *getLastInsertedEvent() { return m_lastInsertedEvent; }
+
+protected:
+ virtual void modifySegment();
+
+ Event *m_event;
+ Event *m_lastInsertedEvent; // an alias for another event
+};
+
+
+
+}
+
+#endif
diff --git a/src/commands/edit/EventQuantizeCommand.cpp b/src/commands/edit/EventQuantizeCommand.cpp
new file mode 100644
index 0000000..775a32f
--- /dev/null
+++ b/src/commands/edit/EventQuantizeCommand.cpp
@@ -0,0 +1,273 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "EventQuantizeCommand.h"
+
+#include <klocale.h>
+#include "base/NotationTypes.h"
+#include "base/Profiler.h"
+#include "base/Quantizer.h"
+#include "base/BasicQuantizer.h"
+#include "base/LegatoQuantizer.h"
+#include "base/NotationQuantizer.h"
+#include "base/Segment.h"
+#include "base/SegmentNotationHelper.h"
+#include "base/Selection.h"
+#include "document/BasicCommand.h"
+#include <kconfig.h>
+#include <qstring.h>
+#include "base/BaseProperties.h"
+#include "gui/application/RosegardenApplication.h"
+#include <kapplication.h>
+
+
+namespace Rosegarden
+{
+
+using namespace BaseProperties;
+
+EventQuantizeCommand::EventQuantizeCommand(Segment &segment,
+ timeT startTime,
+ timeT endTime,
+ Quantizer *quantizer):
+ BasicCommand(getGlobalName(quantizer), segment, startTime, endTime,
+ true), // bruteForceRedo
+ m_quantizer(quantizer),
+ m_selection(0)
+{
+ // nothing else
+}
+
+EventQuantizeCommand::EventQuantizeCommand(EventSelection &selection,
+ Quantizer *quantizer):
+ BasicCommand(getGlobalName(quantizer),
+ selection.getSegment(),
+ selection.getStartTime(),
+ selection.getEndTime(),
+ true), // bruteForceRedo
+ m_quantizer(quantizer),
+ m_selection(&selection)
+{
+ // nothing else
+}
+
+EventQuantizeCommand::EventQuantizeCommand(Segment &segment,
+ timeT startTime,
+ timeT endTime,
+ QString configGroup,
+ bool notation):
+ BasicCommand(getGlobalName(makeQuantizer(configGroup, notation)),
+ segment, startTime, endTime,
+ true), // bruteForceRedo
+ m_selection(0),
+ m_configGroup(configGroup)
+{
+ // nothing else -- m_quantizer set by makeQuantizer
+}
+
+EventQuantizeCommand::EventQuantizeCommand(EventSelection &selection,
+ QString configGroup,
+ bool notation):
+ BasicCommand(getGlobalName(makeQuantizer(configGroup, notation)),
+ selection.getSegment(),
+ selection.getStartTime(),
+ selection.getEndTime(),
+ true), // bruteForceRedo
+ m_selection(&selection),
+ m_configGroup(configGroup)
+{
+ // nothing else -- m_quantizer set by makeQuantizer
+}
+
+EventQuantizeCommand::~EventQuantizeCommand()
+{
+ delete m_quantizer;
+}
+
+QString
+EventQuantizeCommand::getGlobalName(Quantizer *quantizer)
+{
+ if (quantizer) {
+ if (dynamic_cast<NotationQuantizer *>(quantizer)) {
+ return i18n("Heuristic Notation &Quantize");
+ } else {
+ return i18n("Grid &Quantize");
+ }
+ }
+
+ return i18n("&Quantize...");
+}
+
+void
+EventQuantizeCommand::modifySegment()
+{
+ Profiler profiler("EventQuantizeCommand::modifySegment", true);
+
+ Segment &segment = getSegment();
+ SegmentNotationHelper helper(segment);
+
+ bool rebeam = false;
+ bool makeviable = false;
+ bool decounterpoint = false;
+
+ if (m_configGroup) {
+ //!!! need way to decide whether to do these even if no config group (i.e. through args to the command)
+ KConfig *config = kapp->config();
+ config->setGroup(m_configGroup);
+
+ rebeam = config->readBoolEntry("quantizerebeam", true);
+ makeviable = config->readBoolEntry("quantizemakeviable", false);
+ decounterpoint = config->readBoolEntry("quantizedecounterpoint", false);
+ }
+
+ if (m_selection) {
+ m_quantizer->quantize(m_selection);
+
+ } else {
+ m_quantizer->quantize(&segment,
+ segment.findTime(getStartTime()),
+ segment.findTime(getEndTime()));
+ }
+
+ if (m_progressTotal > 0) {
+ if (rebeam || makeviable || decounterpoint) {
+ emit incrementProgress(m_progressTotal / 2);
+ rgapp->refreshGUI(50);
+ } else {
+ emit incrementProgress(m_progressTotal);
+ rgapp->refreshGUI(50);
+ }
+ }
+
+ if (m_selection) {
+ EventSelection::RangeTimeList ranges(m_selection->getRangeTimes());
+ for (EventSelection::RangeTimeList::iterator i = ranges.begin();
+ i != ranges.end(); ++i) {
+ if (makeviable) {
+ helper.makeNotesViable(i->first, i->second, true);
+ }
+ if (decounterpoint) {
+ helper.deCounterpoint(i->first, i->second);
+ }
+ if (rebeam) {
+ helper.autoBeam(i->first, i->second, GROUP_TYPE_BEAMED);
+ helper.autoSlur(i->first, i->second, true);
+ }
+ }
+ } else {
+ if (makeviable) {
+ helper.makeNotesViable(getStartTime(), getEndTime(), true);
+ }
+ if (decounterpoint) {
+ helper.deCounterpoint(getStartTime(), getEndTime());
+ }
+ if (rebeam) {
+ helper.autoBeam(getStartTime(), getEndTime(), GROUP_TYPE_BEAMED);
+ helper.autoSlur(getStartTime(), getEndTime(), true);
+ }
+ }
+
+ if (m_progressTotal > 0) {
+ if (rebeam || makeviable || decounterpoint) {
+ emit incrementProgress(m_progressTotal / 2);
+ rgapp->refreshGUI(50);
+ }
+ }
+}
+
+Quantizer *
+EventQuantizeCommand::makeQuantizer(QString configGroup,
+ bool notationDefault)
+{
+ //!!! Excessive duplication with
+ // QuantizeParameters::getQuantizer in widgets.cpp
+
+ KConfig *config = kapp->config();
+ config->setGroup(configGroup);
+
+ timeT defaultUnit =
+ Note(Note::Demisemiquaver).getDuration();
+
+ int type = config->readNumEntry("quantizetype", notationDefault ? 2 : 0);
+ timeT unit = config->readNumEntry("quantizeunit", defaultUnit);
+ bool notateOnly = config->readBoolEntry("quantizenotationonly", notationDefault);
+ bool durations = config->readBoolEntry("quantizedurations", false);
+ int simplicity = config->readNumEntry("quantizesimplicity", 13);
+ int maxTuplet = config->readNumEntry("quantizemaxtuplet", 3);
+ bool counterpoint = config->readNumEntry("quantizecounterpoint", false);
+ bool articulate = config->readBoolEntry("quantizearticulate", true);
+ int swing = config->readNumEntry("quantizeswing", 0);
+ int iterate = config->readNumEntry("quantizeiterate", 100);
+
+ m_quantizer = 0;
+
+ if (type == 0) {
+ if (notateOnly) {
+ m_quantizer = new BasicQuantizer
+ (Quantizer::RawEventData,
+ Quantizer::NotationPrefix,
+ unit, durations, swing, iterate);
+ } else {
+ m_quantizer = new BasicQuantizer
+ (Quantizer::RawEventData,
+ Quantizer::RawEventData,
+ unit, durations, swing, iterate);
+ }
+ } else if (type == 1) {
+ if (notateOnly) {
+ m_quantizer = new LegatoQuantizer
+ (Quantizer::RawEventData,
+ Quantizer::NotationPrefix, unit);
+ } else {
+ m_quantizer = new LegatoQuantizer
+ (Quantizer::RawEventData,
+ Quantizer::RawEventData, unit);
+ }
+ } else {
+
+ NotationQuantizer *nq;
+
+ if (notateOnly) {
+ nq = new NotationQuantizer();
+ } else {
+ nq = new NotationQuantizer
+ (Quantizer::RawEventData,
+ Quantizer::RawEventData);
+ }
+
+ nq->setUnit(unit);
+ nq->setSimplicityFactor(simplicity);
+ nq->setMaxTuplet(maxTuplet);
+ nq->setContrapuntal(counterpoint);
+ nq->setArticulate(articulate);
+
+ m_quantizer = nq;
+ }
+
+ return m_quantizer;
+}
+
+}
+#include "EventQuantizeCommand.moc"
diff --git a/src/commands/edit/EventQuantizeCommand.h b/src/commands/edit/EventQuantizeCommand.h
new file mode 100644
index 0000000..6ae1303
--- /dev/null
+++ b/src/commands/edit/EventQuantizeCommand.h
@@ -0,0 +1,98 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_EVENTQUANTIZECOMMAND_H_
+#define _RG_EVENTQUANTIZECOMMAND_H_
+
+#include "document/BasicCommand.h"
+#include <qobject.h>
+#include <qstring.h>
+#include "base/Event.h"
+
+
+
+
+namespace Rosegarden
+{
+
+class Segment;
+class Quantizer;
+class EventSelection;
+
+
+class EventQuantizeCommand : public QObject, public BasicCommand
+{
+ Q_OBJECT
+
+public:
+ /// Quantizer must be on heap (EventQuantizeCommand dtor will delete)
+ EventQuantizeCommand(Segment &segment,
+ timeT startTime,
+ timeT endTime,
+ Quantizer *);
+
+ /// Quantizer must be on heap (EventQuantizeCommand dtor will delete)
+ EventQuantizeCommand(EventSelection &selection,
+ Quantizer *);
+
+ /// Constructs own quantizer based on KConfig data in given group
+ EventQuantizeCommand(Segment &segment,
+ timeT startTime,
+ timeT endTime,
+ QString configGroup,
+ bool notationDefault);
+
+ /// Constructs own quantizer based on KConfig data in given group
+ EventQuantizeCommand(EventSelection &selection,
+ QString configGroup,
+ bool notationDefault);
+
+ ~EventQuantizeCommand();
+
+ static QString getGlobalName(Quantizer *quantizer = 0);
+ void setProgressTotal(int total) { m_progressTotal = total; }
+
+signals:
+ void incrementProgress(int);
+
+protected:
+ virtual void modifySegment();
+
+private:
+ Quantizer *m_quantizer; // I own this
+ EventSelection *m_selection;
+ QString m_configGroup;
+ int m_progressTotal;
+
+ /// Sets to m_quantizer as well as returning value
+ Quantizer *makeQuantizer(QString, bool);
+};
+
+// Collapse equal-pitch notes into one event
+//
+
+}
+
+#endif
diff --git a/src/commands/edit/EventUnquantizeCommand.cpp b/src/commands/edit/EventUnquantizeCommand.cpp
new file mode 100644
index 0000000..5a8a07e
--- /dev/null
+++ b/src/commands/edit/EventUnquantizeCommand.cpp
@@ -0,0 +1,106 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "EventUnquantizeCommand.h"
+
+#include <klocale.h>
+#include "base/Quantizer.h"
+#include "base/Segment.h"
+#include "base/Selection.h"
+#include "document/BasicCommand.h"
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+EventUnquantizeCommand::EventUnquantizeCommand(Segment &segment,
+ timeT startTime,
+ timeT endTime,
+ Quantizer *quantizer) :
+ BasicCommand(i18n("Unquantize Events"), segment, startTime, endTime,
+ true), // bruteForceRedo
+ m_quantizer(quantizer),
+ m_selection(0)
+{
+ // nothing else
+}
+
+EventUnquantizeCommand::EventUnquantizeCommand(
+ EventSelection &selection,
+ Quantizer *quantizer) :
+ BasicCommand(i18n("Unquantize Events"),
+ selection.getSegment(),
+ selection.getStartTime(),
+ selection.getEndTime(),
+ true), // bruteForceRedo
+ m_quantizer(quantizer),
+ m_selection(&selection)
+{
+ // nothing else
+}
+
+EventUnquantizeCommand::~EventUnquantizeCommand()
+{
+ delete m_quantizer;
+}
+
+QString
+EventUnquantizeCommand::getGlobalName(Quantizer *)
+{
+ /*!!!
+ if (quantizer) {
+ switch (quantizer->getType()) {
+ case Quantizer::PositionQuantize:
+ return i18n("Position &Quantize");
+ case Quantizer::UnitQuantize:
+ return i18n("Unit &Quantize");
+ case Quantizer::NoteQuantize:
+ return i18n("Note &Quantize");
+ case Quantizer::LegatoQuantize:
+ return i18n("Smoothing &Quantize");
+ }
+ }
+ */
+ return i18n("&Quantize...");
+}
+
+void
+EventUnquantizeCommand::modifySegment()
+{
+ Segment &segment = getSegment();
+
+ if (m_selection) {
+
+ m_quantizer->unquantize(m_selection);
+
+ } else {
+ m_quantizer->unquantize(&segment,
+ segment.findTime(getStartTime()),
+ segment.findTime(getEndTime()));
+ }
+}
+
+}
diff --git a/src/commands/edit/EventUnquantizeCommand.h b/src/commands/edit/EventUnquantizeCommand.h
new file mode 100644
index 0000000..fca3a3c
--- /dev/null
+++ b/src/commands/edit/EventUnquantizeCommand.h
@@ -0,0 +1,73 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_EVENTUNQUANTIZECOMMAND_H_
+#define _RG_EVENTUNQUANTIZECOMMAND_H_
+
+#include "document/BasicCommand.h"
+#include <qstring.h>
+#include "base/Event.h"
+
+
+
+
+namespace Rosegarden
+{
+
+class Segment;
+class Quantizer;
+class EventSelection;
+
+
+class EventUnquantizeCommand : public BasicCommand
+{
+public:
+ /// Quantizer must be on heap (EventUnquantizeCommand dtor will delete)
+ EventUnquantizeCommand(Segment &segment,
+ timeT startTime,
+ timeT endTime,
+ Quantizer *);
+
+ /// Quantizer must be on heap (EventUnquantizeCommand dtor will delete)
+ EventUnquantizeCommand(EventSelection &selection,
+ Quantizer *);
+
+ ~EventUnquantizeCommand();
+
+ static QString getGlobalName(Quantizer *quantizer = 0);
+
+protected:
+ virtual void modifySegment();
+
+private:
+ Quantizer *m_quantizer;
+ EventSelection *m_selection;
+};
+
+
+
+}
+
+#endif
diff --git a/src/commands/edit/InsertTriggerNoteCommand.cpp b/src/commands/edit/InsertTriggerNoteCommand.cpp
new file mode 100644
index 0000000..65696f3
--- /dev/null
+++ b/src/commands/edit/InsertTriggerNoteCommand.cpp
@@ -0,0 +1,132 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "InsertTriggerNoteCommand.h"
+
+#include <klocale.h>
+#include "base/Event.h"
+#include "base/NotationTypes.h"
+#include "base/Segment.h"
+#include "base/SegmentMatrixHelper.h"
+#include "base/Composition.h"
+#include "base/TriggerSegment.h"
+#include "document/BasicCommand.h"
+#include "gui/editors/notation/NotationProperties.h"
+#include "gui/editors/notation/NoteStyleFactory.h"
+#include "base/BaseProperties.h"
+
+namespace Rosegarden
+{
+
+using namespace BaseProperties;
+
+InsertTriggerNoteCommand::InsertTriggerNoteCommand(Segment &segment,
+ timeT time,
+ Note note,
+ int pitch,
+ int velocity,
+ NoteStyleName noteStyle,
+ TriggerSegmentId id,
+ bool retune,
+ std::string timeAdjust,
+ Mark mark) :
+ BasicCommand(i18n("Insert Trigger Note"), segment,
+ time, time + note.getDuration()),
+ m_time(time),
+ m_note(note),
+ m_pitch(pitch),
+ m_velocity(velocity),
+ m_noteStyle(noteStyle),
+ m_id(id),
+ m_retune(retune),
+ m_timeAdjust(timeAdjust),
+ m_mark(mark)
+{
+ // nothing
+}
+
+InsertTriggerNoteCommand::~InsertTriggerNoteCommand()
+{
+ // nothing
+}
+
+void
+InsertTriggerNoteCommand::modifySegment()
+{
+ // Insert via a model event, so as to apply the note style.
+ // This is a subset of the work done by NoteInsertionCommand
+
+ Event *e = new Event(Note::EventType, m_time, m_note.getDuration());
+
+ e->set
+ <Int>(PITCH, m_pitch);
+ e->set
+ <Int>(VELOCITY, m_velocity);
+
+ if (m_noteStyle != NoteStyleFactory::DefaultStyle) {
+ e->set
+ <String>(NotationProperties::NOTE_STYLE, m_noteStyle);
+ }
+
+ e->set
+ <Int>(TRIGGER_SEGMENT_ID, m_id);
+ e->set
+ <Bool>(TRIGGER_SEGMENT_RETUNE, m_retune);
+ e->set
+ <String>(TRIGGER_SEGMENT_ADJUST_TIMES, m_timeAdjust);
+
+ if (m_mark != Marks::NoMark) {
+ Marks::addMark(*e, m_mark, true);
+ }
+
+ Segment &s(getSegment());
+ Segment::iterator i = SegmentMatrixHelper(s).insertNote(e);
+
+ Segment::iterator j = i;
+ while (++j != s.end()) {
+ if ((*j)->getAbsoluteTime() >
+ (*i)->getAbsoluteTime() + (*i)->getDuration())
+ break;
+ if ((*j)->isa(Note::EventType)) {
+ if ((*j)->getAbsoluteTime() ==
+ (*i)->getAbsoluteTime() + (*i)->getDuration()) {
+ if ((*j)->has(TIED_BACKWARD) && (*j)->get
+ <Bool>(TIED_BACKWARD) &&
+ (*j)->has(PITCH) && ((*j)->get<Int>(PITCH) == m_pitch)) {
+ (*i)->set
+ <Bool>(TIED_FORWARD, true);
+ }
+ }
+ }
+ }
+
+ TriggerSegmentRec *rec =
+ getSegment().getComposition()->getTriggerSegmentRec(m_id);
+
+ if (rec)
+ rec->updateReferences();
+}
+
+}
diff --git a/src/commands/edit/InsertTriggerNoteCommand.h b/src/commands/edit/InsertTriggerNoteCommand.h
new file mode 100644
index 0000000..4dc1b19
--- /dev/null
+++ b/src/commands/edit/InsertTriggerNoteCommand.h
@@ -0,0 +1,78 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_INSERTTRIGGERNOTECOMMAND_H_
+#define _RG_INSERTTRIGGERNOTECOMMAND_H_
+
+#include "base/NotationTypes.h"
+#include "base/TriggerSegment.h"
+#include "document/BasicCommand.h"
+#include "gui/editors/notation/NoteStyle.h"
+#include <string>
+#include "base/Event.h"
+
+
+
+
+namespace Rosegarden
+{
+
+class Segment;
+
+
+class InsertTriggerNoteCommand : public BasicCommand
+{
+public:
+ InsertTriggerNoteCommand(Segment &,
+ timeT time,
+ Note note,
+ int pitch,
+ int velocity,
+ NoteStyleName noteStyle,
+ TriggerSegmentId id,
+ bool retune,
+ std::string timeAdjust,
+ Mark mark);
+ virtual ~InsertTriggerNoteCommand();
+
+protected:
+ virtual void modifySegment();
+
+ timeT m_time;
+ Note m_note;
+ int m_pitch;
+ int m_velocity;
+ NoteStyleName m_noteStyle;
+ TriggerSegmentId m_id;
+ bool m_retune;
+ std::string m_timeAdjust;
+ Mark m_mark;
+};
+
+
+
+}
+
+#endif
diff --git a/src/commands/edit/InvertCommand.cpp b/src/commands/edit/InvertCommand.cpp
new file mode 100644
index 0000000..053bcf9
--- /dev/null
+++ b/src/commands/edit/InvertCommand.cpp
@@ -0,0 +1,85 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "InvertCommand.h"
+
+#include "base/NotationTypes.h"
+#include "base/Selection.h"
+#include "document/BasicSelectionCommand.h"
+#include <qstring.h>
+#include "base/BaseProperties.h"
+
+
+namespace Rosegarden
+{
+
+using namespace BaseProperties;
+
+void
+InvertCommand::modifySegment()
+{
+ EventSelection::eventcontainer::iterator i;
+ long highestPitch, lowestPitch;
+
+ bool firstNote = true;
+ for (i = m_selection->getSegmentEvents().begin();
+ i != m_selection->getSegmentEvents().end(); ++i) {
+
+ if ((*i)->isa(Note::EventType)) {
+ try {
+ long pitch = (*i)->get
+ <Int>(PITCH);
+ if (firstNote) {
+ highestPitch = pitch;
+ lowestPitch = pitch;
+ firstNote = false;
+ } else {
+ if (pitch > highestPitch)
+ highestPitch = pitch;
+ else if (pitch < lowestPitch)
+ lowestPitch = pitch;
+ }
+ } catch (...) { }
+ }
+ }
+
+ for (i = m_selection->getSegmentEvents().begin();
+ i != m_selection->getSegmentEvents().end(); ++i) {
+
+ if ((*i)->isa(Note::EventType)) {
+ try {
+ long pitch = (*i)->get
+ <Int>(PITCH);
+ pitch = lowestPitch + (highestPitch - pitch);
+ pitch += m_semitones;
+ (*i)->set
+ <Int>(PITCH, pitch);
+ (*i)->unset(ACCIDENTAL);
+ } catch (...) { }
+ }
+ }
+}
+
+}
diff --git a/src/commands/edit/InvertCommand.h b/src/commands/edit/InvertCommand.h
new file mode 100644
index 0000000..5bea38d
--- /dev/null
+++ b/src/commands/edit/InvertCommand.h
@@ -0,0 +1,67 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_INVERTCOMMAND_H_
+#define _RG_INVERTCOMMAND_H_
+
+#include "document/BasicSelectionCommand.h"
+#include <qstring.h>
+#include <klocale.h>
+
+
+
+
+namespace Rosegarden
+{
+
+class EventSelection;
+
+
+class InvertCommand : public BasicSelectionCommand
+{
+public:
+ InvertCommand(int semitones, EventSelection &selection) :
+ BasicSelectionCommand(getGlobalName(semitones), selection, true),
+ m_selection(&selection), m_semitones(semitones) { }
+
+ static QString getGlobalName(int semitones = 0) {
+ switch (semitones) {
+ default: return i18n("&Invert");
+ }
+ }
+
+protected:
+ virtual void modifySegment();
+
+private:
+ EventSelection *m_selection;// only used on 1st execute (cf bruteForceRedo)
+ int m_semitones;
+};
+
+
+
+}
+
+#endif
diff --git a/src/commands/edit/ModifyMarkerCommand.cpp b/src/commands/edit/ModifyMarkerCommand.cpp
new file mode 100644
index 0000000..367f545
--- /dev/null
+++ b/src/commands/edit/ModifyMarkerCommand.cpp
@@ -0,0 +1,95 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "ModifyMarkerCommand.h"
+
+#include "base/Composition.h"
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+ModifyMarkerCommand::ModifyMarkerCommand(Composition *comp,
+ int id,
+ timeT time,
+ timeT newTime,
+ const std::string &name,
+ const std::string &des):
+ KNamedCommand(getGlobalName()),
+ m_composition(comp),
+ m_id(id),
+ m_time(time),
+ m_newTime(newTime),
+ m_name(name),
+ m_description(des),
+ m_oldName(""),
+ m_oldDescription("")
+{}
+
+ModifyMarkerCommand::~ModifyMarkerCommand()
+{}
+
+void
+ModifyMarkerCommand::execute()
+{
+ Composition::markercontainer markers =
+ m_composition->getMarkers();
+
+ Composition::markerconstiterator it = markers.begin();
+
+ for (; it != markers.end(); ++it) {
+ if ((*it)->getID() == m_id) {
+ if (m_oldName.empty())
+ m_oldName = (*it)->getName();
+ if (m_oldDescription.empty())
+ m_oldDescription = (*it)->getDescription();
+
+ (*it)->setName(m_name);
+ (*it)->setDescription(m_description);
+ (*it)->setTime(m_newTime);
+ return ;
+ }
+ }
+}
+
+void
+ModifyMarkerCommand::unexecute()
+{
+ Composition::markercontainer markers =
+ m_composition->getMarkers();
+
+ Composition::markerconstiterator it = markers.begin();
+
+ for (; it != markers.end(); ++it) {
+ if ((*it)->getID() == m_id) {
+ (*it)->setName(m_oldName);
+ (*it)->setDescription(m_oldDescription);
+ (*it)->setTime(m_time);
+ }
+ }
+}
+
+}
diff --git a/src/commands/edit/ModifyMarkerCommand.h b/src/commands/edit/ModifyMarkerCommand.h
new file mode 100644
index 0000000..6a7e99f
--- /dev/null
+++ b/src/commands/edit/ModifyMarkerCommand.h
@@ -0,0 +1,78 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_MODIFYMARKERCOMMAND_H_
+#define _RG_MODIFYMARKERCOMMAND_H_
+
+#include <string>
+#include <kcommand.h>
+#include <qstring.h>
+#include "base/Event.h"
+#include <klocale.h>
+
+
+
+
+namespace Rosegarden
+{
+
+class Composition;
+
+
+class ModifyMarkerCommand : public KNamedCommand
+{
+public:
+ ModifyMarkerCommand(Composition *comp,
+ int id,
+ timeT time,
+ timeT newTime,
+ const std::string &name,
+ const std::string &des);
+ ~ModifyMarkerCommand();
+
+ static QString getGlobalName() { return i18n("&Modify Marker"); }
+
+ virtual void execute();
+ virtual void unexecute();
+
+protected:
+
+ Composition *m_composition;
+ timeT m_time;
+ timeT m_newTime;
+
+ int m_id;
+ std::string m_name;
+ std::string m_description;
+ std::string m_oldName;
+ std::string m_oldDescription;
+
+};
+
+
+
+}
+
+#endif
diff --git a/src/commands/edit/MoveAcrossSegmentsCommand.cpp b/src/commands/edit/MoveAcrossSegmentsCommand.cpp
new file mode 100644
index 0000000..3363d65
--- /dev/null
+++ b/src/commands/edit/MoveAcrossSegmentsCommand.cpp
@@ -0,0 +1,76 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "MoveAcrossSegmentsCommand.h"
+
+#include <klocale.h>
+#include "base/Clipboard.h"
+#include "base/Segment.h"
+#include "base/Selection.h"
+#include "CutCommand.h"
+#include "PasteEventsCommand.h"
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+MoveAcrossSegmentsCommand::MoveAcrossSegmentsCommand(Segment &,
+ Segment &secondSegment,
+ timeT newStartTime,
+ bool notation,
+ EventSelection &selection) :
+ KMacroCommand(getGlobalName()),
+ m_clipboard(new Clipboard())
+{
+ addCommand(new CutCommand(selection, m_clipboard));
+
+ timeT newEndTime = newStartTime + selection.getEndTime() - selection.getStartTime();
+ Segment::iterator i = secondSegment.findTime(newEndTime);
+ if (i == secondSegment.end())
+ newEndTime = secondSegment.getEndTime();
+ else
+ newEndTime = (*i)->getAbsoluteTime();
+
+ addCommand(new PasteEventsCommand(secondSegment, m_clipboard,
+ newStartTime,
+ newEndTime,
+ notation ?
+ PasteEventsCommand::NoteOverlay :
+ PasteEventsCommand::MatrixOverlay));
+}
+
+MoveAcrossSegmentsCommand::~MoveAcrossSegmentsCommand()
+{
+ delete m_clipboard;
+}
+
+QString
+MoveAcrossSegmentsCommand::getGlobalName()
+{
+ return i18n("&Move Events to Other Segment");
+}
+
+}
diff --git a/src/commands/edit/MoveAcrossSegmentsCommand.h b/src/commands/edit/MoveAcrossSegmentsCommand.h
new file mode 100644
index 0000000..ac3ee39
--- /dev/null
+++ b/src/commands/edit/MoveAcrossSegmentsCommand.h
@@ -0,0 +1,63 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_MOVEACROSSSEGMENTSCOMMAND_H_
+#define _RG_MOVEACROSSSEGMENTSCOMMAND_H_
+
+#include <qstring.h>
+#include "base/Event.h"
+#include <kcommand.h>
+
+
+
+namespace Rosegarden
+{
+
+class Segment;
+class EventSelection;
+class Clipboard;
+
+
+class MoveAcrossSegmentsCommand : public KMacroCommand
+{
+public:
+ MoveAcrossSegmentsCommand(Segment &firstSegment,
+ Segment &secondSegment,
+ timeT newStartTime,
+ bool notation,
+ EventSelection &selection);
+ virtual ~MoveAcrossSegmentsCommand();
+
+ static QString getGlobalName();
+
+private:
+ Clipboard *m_clipboard;
+};
+
+
+
+}
+
+#endif
diff --git a/src/commands/edit/MoveCommand.cpp b/src/commands/edit/MoveCommand.cpp
new file mode 100644
index 0000000..5df08a7
--- /dev/null
+++ b/src/commands/edit/MoveCommand.cpp
@@ -0,0 +1,159 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "MoveCommand.h"
+
+#include "misc/Debug.h"
+#include "base/Event.h"
+#include "base/NotationTypes.h"
+#include "base/Segment.h"
+#include "base/SegmentNotationHelper.h"
+#include "base/Selection.h"
+#include "document/BasicCommand.h"
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+MoveCommand::MoveCommand(Segment &s, timeT delta, bool useNotationTimings,
+ EventSelection &sel) :
+ BasicCommand(getGlobalName(), s,
+ delta < 0 ? sel.getStartTime() + delta : sel.getStartTime(),
+ delta < 0 ? sel.getEndTime() + 1 : sel.getEndTime() + 1 + delta,
+ true),
+ m_selection(&sel),
+ m_delta(delta),
+ m_useNotationTimings(useNotationTimings),
+ m_lastInsertedEvent(0)
+{
+ // nothing else
+}
+
+QString
+MoveCommand::getGlobalName(timeT delta)
+{
+ if (delta == 0) {
+ return "&Move Events";
+ } else if (delta < 0) {
+ return "&Move Events Back";
+ } else {
+ return "&Move Events Forward";
+ }
+}
+
+void
+MoveCommand::modifySegment()
+{
+ RG_DEBUG << "MoveCommand::modifySegment: delta is " << m_delta
+ << ", useNotationTimings " << m_useNotationTimings
+ << ", start time " << m_selection->getStartTime()
+ << ", end time " << m_selection->getEndTime() << endl;
+
+ std::vector<Event *> toErase;
+ std::vector<Event *> toInsert;
+
+ timeT a0 = m_selection->getStartTime();
+ timeT a1 = m_selection->getEndTime();
+ timeT b0 = a0 + m_delta;
+ timeT b1 = b0 + (a1 - a0);
+
+ EventSelection::eventcontainer::iterator i;
+
+ for (i = m_selection->getSegmentEvents().begin();
+ i != m_selection->getSegmentEvents().end(); ++i) {
+
+ RG_DEBUG << "MoveCommand::modifySegment: event at " << (*i)->getAbsoluteTime() << " type " << (*i)->getType() << endl;
+
+ if ((*i)->isa(Note::EventRestType))
+ continue;
+
+ toErase.push_back(*i);
+ timeT newTime =
+ (m_useNotationTimings ?
+ (*i)->getNotationAbsoluteTime() : (*i)->getAbsoluteTime()) + m_delta;
+
+ Event *e;
+ if (m_useNotationTimings) {
+ e = new Event(**i, newTime, (*i)->getDuration(), (*i)->getSubOrdering(),
+ newTime, (*i)->getNotationDuration());
+ } else {
+ e = new Event(**i, newTime);
+ }
+
+ toInsert.push_back(e);
+ }
+
+ Segment &segment(m_selection->getSegment());
+
+ for (unsigned int j = 0; j < toErase.size(); ++j) {
+ Segment::iterator jtr(segment.findSingle(toErase[j]));
+ if (jtr != segment.end()) {
+ RG_DEBUG << "found event " << j << endl;
+ segment.erase(jtr);
+ } else {
+ RG_DEBUG << "failed to find event " << j << endl;
+ }
+ }
+
+ for (unsigned int j = 0; j < toInsert.size(); ++j) {
+
+ Segment::iterator jtr = segment.end();
+
+ // somewhat like the NoteOverlay part of PasteEventsCommand::modifySegment
+ /* nah -- let's do a de-counterpoint afterwards perhaps
+ if (m_useNotationTimings && toInsert[j]->isa(Note::EventType)) {
+ long pitch = 0;
+ Accidental explicitAccidental = NoAccidental;
+ toInsert[j]->get<String>(ACCIDENTAL, explicitAccidental);
+ if (toInsert[j]->get<Int>(PITCH, pitch)) {
+ jtr = SegmentNotationHelper(segment).insertNote
+ (toInsert[j]->getAbsoluteTime(),
+ Note::getNearestNote(toInsert[j]->getDuration()),
+ pitch, explicitAccidental);
+ delete toInsert[j];
+ toInsert[j] = *jtr;
+ }
+ } else {
+ */
+ jtr = segment.insert(toInsert[j]);
+ // }
+
+ // insert new event back into selection
+ m_selection->addEvent(toInsert[j]);
+
+ if (jtr != segment.end())
+ m_lastInsertedEvent = toInsert[j];
+ }
+
+ if (m_useNotationTimings) {
+ SegmentNotationHelper(segment).deCounterpoint(b0, b1);
+ }
+
+ segment.normalizeRests(a0, a1);
+ segment.normalizeRests(b0, b1);
+}
+
+}
diff --git a/src/commands/edit/MoveCommand.h b/src/commands/edit/MoveCommand.h
new file mode 100644
index 0000000..79c0081
--- /dev/null
+++ b/src/commands/edit/MoveCommand.h
@@ -0,0 +1,69 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_MOVECOMMAND_H_
+#define _RG_MOVECOMMAND_H_
+
+#include "document/BasicCommand.h"
+#include <qstring.h>
+#include "base/Event.h"
+
+
+
+
+namespace Rosegarden
+{
+
+class Segment;
+class EventSelection;
+class Event;
+
+
+class MoveCommand : public BasicCommand
+{
+public:
+ MoveCommand(Segment &segment,
+ timeT delta,
+ bool useNotationTimings,
+ EventSelection &selection);
+
+ static QString getGlobalName(timeT delta = 0);
+
+ Event *getLastInsertedEvent() { return m_lastInsertedEvent; }
+
+protected:
+ virtual void modifySegment();
+
+private:
+ EventSelection *m_selection;// only used on 1st execute (cf bruteForceRedo)
+ timeT m_delta;
+ bool m_useNotationTimings;
+ Event *m_lastInsertedEvent;
+};
+
+
+}
+
+#endif
diff --git a/src/commands/edit/PasteEventsCommand.cpp b/src/commands/edit/PasteEventsCommand.cpp
new file mode 100644
index 0000000..f6fd323
--- /dev/null
+++ b/src/commands/edit/PasteEventsCommand.cpp
@@ -0,0 +1,321 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "PasteEventsCommand.h"
+
+#include "misc/Debug.h"
+#include "base/Clipboard.h"
+#include "base/Event.h"
+#include "base/NotationTypes.h"
+#include "base/Segment.h"
+#include "base/SegmentNotationHelper.h"
+#include "document/BasicCommand.h"
+#include <qstring.h>
+#include "base/BaseProperties.h"
+
+
+namespace Rosegarden
+{
+
+using namespace BaseProperties;
+
+PasteEventsCommand::PasteEventsCommand(Segment &segment,
+ Clipboard *clipboard,
+ timeT pasteTime,
+ PasteType pasteType) :
+ BasicCommand(getGlobalName(), segment, pasteTime,
+ getEffectiveEndTime(segment, clipboard, pasteTime)),
+ m_relayoutEndTime(getEndTime()),
+ m_clipboard(new Clipboard(*clipboard)),
+ m_pasteType(pasteType),
+ m_pastedEvents(segment)
+{
+ if (pasteType != OpenAndPaste) {
+
+ // paste clef or key -> relayout to end
+
+ if (clipboard->isSingleSegment()) {
+
+ Segment *s(clipboard->getSingleSegment());
+ for (Segment::iterator i = s->begin(); i != s->end(); ++i) {
+ if ((*i)->isa(Clef::EventType) ||
+ (*i)->isa(Key::EventType)) {
+ m_relayoutEndTime = s->getEndTime();
+ break;
+ }
+ }
+ }
+ }
+}
+
+PasteEventsCommand::PasteEventsCommand(Segment &segment,
+ Clipboard *clipboard,
+ timeT pasteTime,
+ timeT pasteEndTime,
+ PasteType pasteType) :
+ BasicCommand(getGlobalName(), segment, pasteTime, pasteEndTime),
+ m_relayoutEndTime(getEndTime()),
+ m_clipboard(new Clipboard(*clipboard)),
+ m_pasteType(pasteType),
+ m_pastedEvents(segment)
+{}
+
+PasteEventsCommand::~PasteEventsCommand()
+{
+ delete m_clipboard;
+}
+
+PasteEventsCommand::PasteTypeMap
+
+PasteEventsCommand::getPasteTypes()
+{
+ static PasteTypeMap types;
+ static bool haveTypes = false;
+ if (!haveTypes) {
+ types[Restricted] =
+ i18n("Paste into an existing gap [\"restricted\"]");
+ types[Simple] =
+ i18n("Erase existing events to make room [\"simple\"]");
+ types[OpenAndPaste] =
+ i18n("Move existing events out of the way [\"open-n-paste\"]");
+ types[NoteOverlay] =
+ i18n("Overlay notes, tying against present notes [\"note-overlay\"]");
+ types[MatrixOverlay] =
+ i18n("Overlay notes, ignoring present notes [\"matrix-overlay\"]");
+ }
+ return types;
+}
+
+timeT
+PasteEventsCommand::getEffectiveEndTime(Segment &segment,
+ Clipboard *clipboard,
+ timeT pasteTime)
+{
+ if (!clipboard->isSingleSegment()) {
+ RG_DEBUG << "PasteEventsCommand::getEffectiveEndTime: not single segment" << endl;
+ return pasteTime;
+ }
+
+ RG_DEBUG << "PasteEventsCommand::getEffectiveEndTime: clipboard "
+ << clipboard->getSingleSegment()->getStartTime()
+ << " -> "
+ << clipboard->getSingleSegment()->getEndTime() << endl;
+
+ timeT d = clipboard->getSingleSegment()->getEndTime() -
+ clipboard->getSingleSegment()->getStartTime();
+
+ if (m_pasteType == OpenAndPaste) {
+ return segment.getEndTime() + d;
+ } else {
+ Segment::iterator i = segment.findTime(pasteTime + d);
+ if (i == segment.end())
+ return segment.getEndTime();
+ else
+ return (*i)->getAbsoluteTime();
+ }
+}
+
+timeT
+PasteEventsCommand::getRelayoutEndTime()
+{
+ return m_relayoutEndTime;
+}
+
+bool
+PasteEventsCommand::isPossible()
+{
+ if (m_clipboard->isEmpty() || !m_clipboard->isSingleSegment()) {
+ return false;
+ }
+
+ if (m_pasteType != Restricted) {
+ return true;
+ }
+
+ Segment *source = m_clipboard->getSingleSegment();
+
+ timeT pasteTime = getStartTime();
+ timeT origin = source->getStartTime();
+ timeT duration = source->getEndTime() - origin;
+
+ RG_DEBUG << "PasteEventsCommand::isPossible: paste time is " << pasteTime << ", origin is " << origin << ", duration is " << duration << endl;
+
+ SegmentNotationHelper helper(getSegment());
+ return helper.removeRests(pasteTime, duration, true);
+}
+
+void
+PasteEventsCommand::modifySegment()
+{
+ RG_DEBUG << "PasteEventsCommand::modifySegment" << endl;
+
+ if (!m_clipboard->isSingleSegment())
+ return ;
+
+ Segment *source = m_clipboard->getSingleSegment();
+
+ timeT pasteTime = getStartTime();
+ timeT origin = source->getStartTime();
+ timeT duration = source->getEndTime() - origin;
+
+ Segment *destination(&getSegment());
+ SegmentNotationHelper helper(*destination);
+
+ RG_DEBUG << "PasteEventsCommand::modifySegment() : paste type = "
+ << m_pasteType << " - pasteTime = "
+ << pasteTime << " - origin = " << origin << endl;
+
+ // First check for group IDs, which we want to make unique in the
+ // copies in the destination segment
+
+ std::map<long, long> groupIdMap;
+ for (Segment::iterator i = source->begin(); i != source->end(); ++i) {
+ long groupId = -1;
+ if ((*i)->get
+ <Int>(BEAMED_GROUP_ID, groupId)) {
+ if (groupIdMap.find(groupId) == groupIdMap.end()) {
+ groupIdMap[groupId] = destination->getNextId();
+ }
+ }
+ }
+
+ switch (m_pasteType) {
+
+ // Do some preliminary work to make space or whatever;
+ // we do the actual paste after this switch statement
+ // (except where individual cases do the work and return)
+
+ case Restricted:
+ if (!helper.removeRests(pasteTime, duration))
+ return ;
+ break;
+
+ case Simple:
+ destination->erase(destination->findTime(pasteTime),
+ destination->findTime(pasteTime + duration));
+ break;
+
+ case OpenAndPaste: {
+ std::vector<Event *> copies;
+ for (Segment::iterator i = destination->findTime(pasteTime);
+ i != destination->end(); ++i) {
+ Event *e = (*i)->copyMoving(duration);
+ if (e->has(BEAMED_GROUP_ID)) {
+ e->set
+ <Int>(BEAMED_GROUP_ID, groupIdMap[e->get
+ <Int>(BEAMED_GROUP_ID)]);
+ }
+ copies.push_back(e);
+ }
+
+ destination->erase(destination->findTime(pasteTime),
+ destination->end());
+
+ for (unsigned int i = 0; i < copies.size(); ++i) {
+ destination->insert(copies[i]);
+ m_pastedEvents.addEvent(copies[i]);
+ }
+
+ break;
+ }
+
+ case NoteOverlay:
+ for (Segment::iterator i = source->begin(); i != source->end(); ++i) {
+ if ((*i)->isa(Note::EventRestType))
+ continue;
+ Event *e = (*i)->copyMoving(pasteTime - origin);
+ if (e->has(BEAMED_GROUP_ID)) {
+ e->set<Int>(BEAMED_GROUP_ID,
+ groupIdMap[e->get<Int>(BEAMED_GROUP_ID)]);
+ }
+ if ((*i)->isa(Note::EventType)) {
+ // e is model event: we retain ownership of it
+ Segment::iterator i = helper.insertNote(e);
+ delete e;
+ if (i != destination->end()) m_pastedEvents.addEvent(*i);
+ } else {
+ destination->insert(e);
+ m_pastedEvents.addEvent(e);
+ }
+ }
+
+ return ;
+
+ case MatrixOverlay:
+
+ for (Segment::iterator i = source->begin(); i != source->end(); ++i) {
+
+ if ((*i)->isa(Note::EventRestType))
+ continue;
+
+ Event *e = (*i)->copyMoving(pasteTime - origin);
+
+ if (e->has(BEAMED_GROUP_TYPE) &&
+ e->get
+ <String>(BEAMED_GROUP_TYPE) == GROUP_TYPE_BEAMED) {
+ e->unset(BEAMED_GROUP_ID);
+ e->unset(BEAMED_GROUP_TYPE);
+ }
+
+ if (e->has(BEAMED_GROUP_ID)) {
+ e->set
+ <Int>(BEAMED_GROUP_ID, groupIdMap[e->get
+ <Int>(BEAMED_GROUP_ID)]);
+ }
+
+ destination->insert(e);
+ m_pastedEvents.addEvent(e);
+ }
+
+ destination->normalizeRests
+ (source->getStartTime(), source->getEndTime());
+
+ return ;
+ }
+
+ RG_DEBUG << "PasteEventsCommand::modifySegment() - inserting\n";
+
+ for (Segment::iterator i = source->begin(); i != source->end(); ++i) {
+ Event *e = (*i)->copyMoving(pasteTime - origin);
+ if (e->has(BEAMED_GROUP_ID)) {
+ e->set
+ <Int>(BEAMED_GROUP_ID, groupIdMap[e->get
+ <Int>(BEAMED_GROUP_ID)]);
+ }
+ destination->insert(e);
+ m_pastedEvents.addEvent(e);
+ }
+
+ destination->normalizeRests
+ (source->getStartTime(), source->getEndTime());
+}
+
+EventSelection
+PasteEventsCommand::getPastedEvents()
+{
+ return m_pastedEvents;
+}
+
+}
diff --git a/src/commands/edit/PasteEventsCommand.h b/src/commands/edit/PasteEventsCommand.h
new file mode 100644
index 0000000..3a26b25
--- /dev/null
+++ b/src/commands/edit/PasteEventsCommand.h
@@ -0,0 +1,112 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_PASTEEVENTSCOMMAND_H_
+#define _RG_PASTEEVENTSCOMMAND_H_
+
+#include "document/BasicCommand.h"
+#include "base/Selection.h"
+#include <map>
+#include <qstring.h>
+#include "base/Event.h"
+#include <klocale.h>
+
+
+
+
+namespace Rosegarden
+{
+
+class Segment;
+class Clipboard;
+
+
+/// Paste from a single-segment clipboard to a segment
+
+class PasteEventsCommand : public BasicCommand
+{
+public:
+ enum PasteType {
+ Restricted, // paste into existing gap
+ Simple, // erase existing events to make room
+ OpenAndPaste, // bump up existing events to make room
+ NoteOverlay, // overlay and tie notation-style
+ MatrixOverlay // overlay raw matrix-style
+ };
+
+ typedef std::map<PasteType, QString> PasteTypeMap;
+ static PasteTypeMap getPasteTypes(); // type, descrip
+
+ /**
+ * Construct a Paste command from a clipboard that already contains
+ * the events to be pasted.
+ */
+ PasteEventsCommand(Segment &segment,
+ Clipboard *clipboard,
+ timeT pasteTime,
+ PasteType pasteType);
+
+ /**
+ * Construct a Paste command from a clipboard that will contain
+ * the events to be pasted by the time the Paste command is
+ * executed, but might not do so yet. This is necessary if the
+ * Paste command is to follow another clipboard-based command
+ * in a KMacroCommand sequence. pasteEndTime must supply the
+ * latest time in the destination segment that may be modified
+ * by the paste.
+ */
+ PasteEventsCommand(Segment &segment,
+ Clipboard *clipboard,
+ timeT pasteTime,
+ timeT pasteEndTime,
+ PasteType pasteType);
+
+ virtual ~PasteEventsCommand();
+
+ EventSelection getPastedEvents();
+
+ static QString getGlobalName() { return i18n("&Paste"); }
+
+ /// Determine whether this paste will succeed (without executing it yet)
+ bool isPossible();
+
+ virtual timeT getRelayoutEndTime();
+
+protected:
+ virtual void modifySegment();
+ timeT getEffectiveEndTime(Segment &,
+ Clipboard *,
+ timeT);
+ timeT m_relayoutEndTime;
+ Clipboard *m_clipboard;
+ PasteType m_pasteType;
+ EventSelection m_pastedEvents;
+};
+
+
+
+}
+
+#endif
diff --git a/src/commands/edit/PasteSegmentsCommand.cpp b/src/commands/edit/PasteSegmentsCommand.cpp
new file mode 100644
index 0000000..ab3372a
--- /dev/null
+++ b/src/commands/edit/PasteSegmentsCommand.cpp
@@ -0,0 +1,153 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "PasteSegmentsCommand.h"
+
+#include "base/Clipboard.h"
+#include "base/Composition.h"
+#include "base/Segment.h"
+#include "base/Track.h"
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+PasteSegmentsCommand::PasteSegmentsCommand(Composition *composition,
+ Clipboard *clipboard,
+ timeT pasteTime,
+ TrackId baseTrack,
+ bool useExactTracks) :
+ KNamedCommand(getGlobalName()),
+ m_composition(composition),
+ m_clipboard(new Clipboard(*clipboard)),
+ m_pasteTime(pasteTime),
+ m_baseTrack(baseTrack),
+ m_exactTracks(useExactTracks),
+ m_detached(false)
+{
+ // nothing else
+}
+
+PasteSegmentsCommand::~PasteSegmentsCommand()
+{
+ if (m_detached) {
+ for (unsigned int i = 0; i < m_addedSegments.size(); ++i) {
+ delete m_addedSegments[i];
+ }
+ }
+
+ delete m_clipboard;
+}
+
+void
+PasteSegmentsCommand::execute()
+{
+ if (m_addedSegments.size() > 0) {
+ // been here before
+ for (unsigned int i = 0; i < m_addedSegments.size(); ++i) {
+ m_composition->addSegment(m_addedSegments[i]);
+ }
+ return ;
+ }
+
+ if (m_clipboard->isEmpty())
+ return ;
+
+ // We want to paste such that the earliest Segment starts at
+ // m_pasteTime and the others start at the same times relative to
+ // that as they did before. Likewise for track, unless
+ // m_exactTracks is set.
+
+ timeT earliestStartTime = m_clipboard->getBaseTime();
+ timeT latestEndTime = 0;
+ int lowestTrackPos = -1;
+
+ for (Clipboard::iterator i = m_clipboard->begin();
+ i != m_clipboard->end(); ++i) {
+
+ int trackPos = m_composition->getTrackPositionById((*i)->getTrack());
+ if (trackPos >= 0 &&
+ (lowestTrackPos < 0 || trackPos < lowestTrackPos)) {
+ lowestTrackPos = trackPos;
+ }
+
+ if ((*i)->getEndMarkerTime() > latestEndTime) {
+ latestEndTime = (*i)->getEndMarkerTime();
+ }
+ }
+
+ if (m_exactTracks)
+ lowestTrackPos = 0;
+ if (lowestTrackPos < 0)
+ lowestTrackPos = 0;
+ timeT offset = m_pasteTime - earliestStartTime;
+ int baseTrackPos = m_composition->getTrackPositionById(m_baseTrack);
+ int trackOffset = baseTrackPos - lowestTrackPos;
+
+ for (Clipboard::iterator i = m_clipboard->begin();
+ i != m_clipboard->end(); ++i) {
+
+ int newTrackPos = trackOffset +
+ m_composition->getTrackPositionById((*i)->getTrack());
+
+ Track *track = m_composition->getTrackByPosition(newTrackPos);
+
+ if (!track) {
+ newTrackPos = 0;
+ track = m_composition->getTrackByPosition(newTrackPos);
+ }
+
+ TrackId newTrackId = track->getId();
+
+ Segment *segment = new Segment(**i);
+ segment->setStartTime(segment->getStartTime() + offset);
+ segment->setTrack(newTrackId);
+ m_composition->addSegment(segment);
+ if (m_clipboard->isPartial()) {
+ segment->normalizeRests(segment->getStartTime(),
+ segment->getEndMarkerTime());
+ }
+ m_addedSegments.push_back(segment);
+ }
+
+ // User preference? Update song pointer position on paste
+ m_composition->setPosition(latestEndTime
+ + m_pasteTime
+ - earliestStartTime);
+
+ m_detached = false;
+}
+
+void
+PasteSegmentsCommand::unexecute()
+{
+ for (unsigned int i = 0; i < m_addedSegments.size(); ++i) {
+ m_composition->detachSegment(m_addedSegments[i]);
+ }
+ m_detached = true;
+}
+
+}
diff --git a/src/commands/edit/PasteSegmentsCommand.h b/src/commands/edit/PasteSegmentsCommand.h
new file mode 100644
index 0000000..3f45914
--- /dev/null
+++ b/src/commands/edit/PasteSegmentsCommand.h
@@ -0,0 +1,79 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_PASTESEGMENTSCOMMAND_H_
+#define _RG_PASTESEGMENTSCOMMAND_H_
+
+#include "base/Track.h"
+#include <kcommand.h>
+#include <qstring.h>
+#include <vector>
+#include "base/Event.h"
+#include <klocale.h>
+
+
+
+
+namespace Rosegarden
+{
+
+class Segment;
+class Composition;
+class Clipboard;
+
+
+/// Paste one or more segments from the clipboard into the composition
+
+class PasteSegmentsCommand : public KNamedCommand
+{
+public:
+ PasteSegmentsCommand(Composition *composition,
+ Clipboard *clipboard,
+ timeT pasteTime,
+ TrackId baseTrack,
+ bool useExactTracks);
+
+ virtual ~PasteSegmentsCommand();
+
+ static QString getGlobalName() { return i18n("&Paste"); }
+
+ virtual void execute();
+ virtual void unexecute();
+
+protected:
+ Composition *m_composition;
+ Clipboard *m_clipboard;
+ timeT m_pasteTime;
+ TrackId m_baseTrack;
+ bool m_exactTracks;
+ std::vector<Segment *> m_addedSegments;
+ bool m_detached;
+};
+
+
+
+}
+
+#endif
diff --git a/src/commands/edit/RemoveMarkerCommand.cpp b/src/commands/edit/RemoveMarkerCommand.cpp
new file mode 100644
index 0000000..af3c839
--- /dev/null
+++ b/src/commands/edit/RemoveMarkerCommand.cpp
@@ -0,0 +1,83 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "RemoveMarkerCommand.h"
+
+#include "base/Composition.h"
+#include "base/Marker.h"
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+RemoveMarkerCommand::RemoveMarkerCommand(Composition *comp,
+ int id,
+ timeT time,
+ const std::string &name,
+ const std::string &description):
+ KNamedCommand(getGlobalName()),
+ m_composition(comp),
+ m_marker(0),
+ m_id(id),
+ m_time(time),
+ m_name(name),
+ m_descr(description),
+ m_detached(false)
+{}
+
+RemoveMarkerCommand::~RemoveMarkerCommand()
+{
+ if (m_detached)
+ delete m_marker;
+}
+
+void
+RemoveMarkerCommand::execute()
+{
+ Composition::markercontainer markers =
+ m_composition->getMarkers();
+
+ Composition::markerconstiterator it = markers.begin();
+
+ for (; it != markers.end(); ++it) {
+ if ((*it)->getID() == m_id) {
+ m_marker = (*it);
+ m_composition->detachMarker(m_marker);
+ m_detached = true;
+ return ;
+ }
+ }
+}
+
+void
+RemoveMarkerCommand::unexecute()
+{
+ if (m_marker)
+ m_composition->addMarker(m_marker);
+ m_detached = false;
+}
+
+}
diff --git a/src/commands/edit/RemoveMarkerCommand.h b/src/commands/edit/RemoveMarkerCommand.h
new file mode 100644
index 0000000..2acaf53
--- /dev/null
+++ b/src/commands/edit/RemoveMarkerCommand.h
@@ -0,0 +1,75 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_REMOVEMARKERCOMMAND_H_
+#define _RG_REMOVEMARKERCOMMAND_H_
+
+#include <string>
+#include <kcommand.h>
+#include <qstring.h>
+#include "base/Event.h"
+#include <klocale.h>
+
+
+
+
+namespace Rosegarden
+{
+
+class Marker;
+class Composition;
+
+
+class RemoveMarkerCommand : public KNamedCommand
+{
+public:
+ RemoveMarkerCommand(Composition *comp,
+ int id,
+ timeT time,
+ const std::string &name,
+ const std::string &description);
+ ~RemoveMarkerCommand();
+
+ static QString getGlobalName() { return i18n("&Remove Marker"); }
+
+ virtual void execute();
+ virtual void unexecute();
+
+protected:
+
+ Composition *m_composition;
+ Marker *m_marker;
+ int m_id;
+ timeT m_time;
+ std::string m_name;
+ std::string m_descr;
+ bool m_detached;
+
+};
+
+
+}
+
+#endif
diff --git a/src/commands/edit/RescaleCommand.cpp b/src/commands/edit/RescaleCommand.cpp
new file mode 100644
index 0000000..764969c
--- /dev/null
+++ b/src/commands/edit/RescaleCommand.cpp
@@ -0,0 +1,138 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "RescaleCommand.h"
+
+#include "base/Event.h"
+#include "base/Segment.h"
+#include "base/Selection.h"
+#include "document/BasicCommand.h"
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+RescaleCommand::RescaleCommand(EventSelection &sel,
+ timeT newDuration,
+ bool closeGap) :
+ BasicCommand(getGlobalName(), sel.getSegment(),
+ sel.getStartTime(),
+ getAffectedEndTime(sel, newDuration, closeGap),
+ true),
+ m_selection(&sel),
+ m_oldDuration(sel.getTotalDuration()),
+ m_newDuration(newDuration),
+ m_closeGap(closeGap)
+{
+ // nothing else
+}
+
+timeT
+RescaleCommand::getAffectedEndTime(EventSelection &sel,
+ timeT newDuration,
+ bool closeGap)
+{
+ timeT preScaleEnd = sel.getEndTime();
+ if (closeGap)
+ preScaleEnd = sel.getSegment().getEndMarkerTime();
+
+ // dupe of rescale(), but we can't use that here as the m_
+ // variables may not have been set
+ double d = preScaleEnd;
+ d *= newDuration;
+ d /= sel.getTotalDuration();
+ d += 0.5;
+ timeT postScaleEnd = (timeT)d;
+
+ return std::max(preScaleEnd, postScaleEnd);
+}
+
+timeT
+RescaleCommand::rescale(timeT t)
+{
+ // avoid overflows by using doubles
+ double d = t;
+ d *= m_newDuration;
+ d /= m_oldDuration;
+ d += 0.5;
+ return (timeT)d;
+}
+
+void
+RescaleCommand::modifySegment()
+{
+ if (m_oldDuration == m_newDuration)
+ return ;
+
+ timeT startTime = m_selection->getStartTime();
+ timeT diff = m_newDuration - m_oldDuration;
+ std::vector<Event *> toErase;
+ std::vector<Event *> toInsert;
+
+ Segment &segment = m_selection->getSegment();
+
+ for (EventSelection::eventcontainer::iterator i =
+ m_selection->getSegmentEvents().begin();
+ i != m_selection->getSegmentEvents().end(); ++i) {
+
+ toErase.push_back(*i);
+
+ timeT t = (*i)->getAbsoluteTime() - startTime;
+ timeT d = (*i)->getDuration();
+ t = rescale(t);
+ d = rescale(d);
+
+ toInsert.push_back(new Event(**i, startTime + t, d));
+ }
+
+ if (m_closeGap) {
+ for (Segment::iterator i = segment.findTime(startTime + m_oldDuration);
+ i != segment.end(); ++i) {
+ // move all events including any following the end marker
+ toErase.push_back(*i);
+ toInsert.push_back((*i)->copyMoving(diff));
+ }
+ }
+
+ for (std::vector<Event *>::iterator i = toErase.begin(); i != toErase.end(); ++i) {
+ m_selection->removeEvent(*i); // remove from selection
+ segment.eraseSingle(*i);
+ }
+
+ for (std::vector<Event *>::iterator i = toInsert.begin(); i != toInsert.end(); ++i) {
+ segment.insert(*i);
+ m_selection->addEvent(*i); // add to selection
+ }
+
+ if (m_closeGap && diff > 0) {
+ segment.setEndMarkerTime(startTime +
+ rescale(segment.getEndMarkerTime() - startTime));
+ }
+
+ segment.normalizeRests(getStartTime(), getEndTime());
+}
+
+}
diff --git a/src/commands/edit/RescaleCommand.h b/src/commands/edit/RescaleCommand.h
new file mode 100644
index 0000000..362de24
--- /dev/null
+++ b/src/commands/edit/RescaleCommand.h
@@ -0,0 +1,71 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_RESCALECOMMAND_H_
+#define _RG_RESCALECOMMAND_H_
+
+#include "document/BasicCommand.h"
+#include <qstring.h>
+#include "base/Event.h"
+#include <klocale.h>
+
+
+
+
+namespace Rosegarden
+{
+
+class EventSelection;
+
+
+class RescaleCommand : public BasicCommand
+{
+public:
+ RescaleCommand(EventSelection &selection,
+ timeT newDuration,
+ bool closeGap);
+
+ static QString getGlobalName() { return i18n("Stretch or S&quash..."); }
+
+protected:
+ virtual void modifySegment();
+
+private:
+ timeT rescale(timeT);
+ timeT getAffectedEndTime(EventSelection &selection,
+ timeT newDuration,
+ bool closeGap);
+
+ EventSelection *m_selection;// only used on 1st execute (cf bruteForceRedo)
+ timeT m_oldDuration;
+ timeT m_newDuration;
+ bool m_closeGap;
+};
+
+
+
+}
+
+#endif
diff --git a/src/commands/edit/RetrogradeCommand.cpp b/src/commands/edit/RetrogradeCommand.cpp
new file mode 100644
index 0000000..955f066
--- /dev/null
+++ b/src/commands/edit/RetrogradeCommand.cpp
@@ -0,0 +1,121 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "RetrogradeCommand.h"
+
+#include "base/Event.h"
+#include "misc/Debug.h"
+#include "base/NotationTypes.h"
+#include "base/Segment.h"
+#include "base/Selection.h"
+#include "document/BasicSelectionCommand.h"
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+void
+RetrogradeCommand::modifySegment()
+{
+ std::vector<Event *> toErase;
+ std::vector<Event *> toInsert;
+
+ timeT a0 = m_selection->getStartTime();
+ timeT a1 = m_selection->getEndTime();
+
+ EventSelection::eventcontainer::iterator i;
+
+ bool useNotationTimings = false;
+
+ for (i = m_selection->getSegmentEvents().begin();
+ i != m_selection->getSegmentEvents().end(); ++i) {
+
+ RG_DEBUG << "RetrogradeCommand::modifySegment: event at " << (*i)->getAbsoluteTime() << " type " << (*i)->getType() << endl;
+
+ if ((*i)->isa(Note::EventRestType))
+ continue;
+
+ toErase.push_back(*i);
+ timeT newTime = a0 + a1 - (*i)->getDuration() -
+ (useNotationTimings ?
+ (*i)->getNotationAbsoluteTime() : (*i)->getAbsoluteTime());
+
+ Event *e;
+ if (useNotationTimings) {
+ e = new Event(**i, newTime, (*i)->getDuration(), (*i)->getSubOrdering(),
+ newTime, (*i)->getNotationDuration());
+ } else {
+ e = new Event(**i, newTime);
+ }
+
+ toInsert.push_back(e);
+ }
+
+ Segment &segment(m_selection->getSegment());
+
+ for (unsigned int j = 0; j < toErase.size(); ++j) {
+ Segment::iterator jtr(segment.findSingle(toErase[j]));
+ if (jtr != segment.end()) {
+ RG_DEBUG << "found event " << j << endl;
+ segment.erase(jtr);
+ } else {
+ RG_DEBUG << "failed to find event " << j << endl;
+ }
+ }
+
+ for (unsigned int j = 0; j < toInsert.size(); ++j) {
+
+ Segment::iterator jtr = segment.end();
+
+ // somewhat like the NoteOverlay part of PasteEventsCommand::modifySegment
+ /* nah -- let's do a de-counterpoint afterwards perhaps
+ if (m_useNotationTimings && toInsert[j]->isa(Note::EventType)) {
+ long pitch = 0;
+ Accidental explicitAccidental = NoAccidental;
+ toInsert[j]->get<String>(ACCIDENTAL, explicitAccidental);
+ if (toInsert[j]->get<Int>(PITCH, pitch)) {
+ jtr = SegmentNotationHelper(segment).insertNote
+ (toInsert[j]->getAbsoluteTime(),
+ Note::getNearestNote(toInsert[j]->getDuration()),
+ pitch, explicitAccidental);
+ delete toInsert[j];
+ toInsert[j] = *jtr;
+ }
+ } else {
+ */
+ jtr = segment.insert(toInsert[j]);
+ // }
+
+ // insert new event back into selection
+ m_selection->addEvent(toInsert[j]);
+
+ // if (jtr != segment.end()) m_lastInsertedEvent = toInsert[j];
+ }
+
+ segment.normalizeRests(a0, a1);
+}
+
+}
diff --git a/src/commands/edit/RetrogradeCommand.h b/src/commands/edit/RetrogradeCommand.h
new file mode 100644
index 0000000..526a95d
--- /dev/null
+++ b/src/commands/edit/RetrogradeCommand.h
@@ -0,0 +1,67 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_RETROGRADECOMMAND_H_
+#define _RG_RETROGRADECOMMAND_H_
+
+#include "document/BasicSelectionCommand.h"
+#include <qstring.h>
+#include <klocale.h>
+
+
+
+
+namespace Rosegarden
+{
+
+class EventSelection;
+
+
+class RetrogradeCommand : public BasicSelectionCommand
+{
+public:
+ RetrogradeCommand(int semitones, EventSelection &selection) :
+ BasicSelectionCommand(getGlobalName(semitones), selection, true),
+ m_selection(&selection), m_semitones(semitones) { }
+
+ static QString getGlobalName(int semitones = 0) {
+ switch (semitones) {
+ default: return i18n("&Retrograde");
+ }
+ }
+
+protected:
+ virtual void modifySegment();
+
+private:
+ EventSelection *m_selection;// only used on 1st execute (cf bruteForceRedo)
+ int m_semitones;
+};
+
+
+
+}
+
+#endif
diff --git a/src/commands/edit/RetrogradeInvertCommand.cpp b/src/commands/edit/RetrogradeInvertCommand.cpp
new file mode 100644
index 0000000..3387c9b
--- /dev/null
+++ b/src/commands/edit/RetrogradeInvertCommand.cpp
@@ -0,0 +1,163 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "RetrogradeInvertCommand.h"
+
+#include "base/Event.h"
+#include "misc/Debug.h"
+#include "base/NotationTypes.h"
+#include "base/Segment.h"
+#include "base/Selection.h"
+#include "document/BasicSelectionCommand.h"
+#include <qstring.h>
+#include "base/BaseProperties.h"
+
+
+namespace Rosegarden
+{
+
+using namespace BaseProperties;
+
+void
+RetrogradeInvertCommand::modifySegment()
+{
+ EventSelection::eventcontainer::iterator i;
+
+ long highestPitch, lowestPitch;
+
+ bool firstNote = true;
+ for (i = m_selection->getSegmentEvents().begin();
+ i != m_selection->getSegmentEvents().end(); ++i) {
+
+ if ((*i)->isa(Note::EventType)) {
+ try {
+ long pitch = (*i)->get
+ <Int>(PITCH);
+ if (firstNote) {
+ highestPitch = pitch;
+ lowestPitch = pitch;
+ firstNote = false;
+ } else {
+ if (pitch > highestPitch)
+ highestPitch = pitch;
+ else if (pitch < lowestPitch)
+ lowestPitch = pitch;
+ }
+ } catch (...) { }
+ }
+ }
+
+ for (i = m_selection->getSegmentEvents().begin();
+ i != m_selection->getSegmentEvents().end(); ++i) {
+
+ if ((*i)->isa(Note::EventType)) {
+ try {
+ long pitch = (*i)->get
+ <Int>(PITCH);
+ pitch = lowestPitch + (highestPitch - pitch);
+ pitch += m_semitones;
+ (*i)->set
+ <Int>(PITCH, pitch);
+ (*i)->unset(ACCIDENTAL);
+ } catch (...) { }
+ }
+ }
+ std::vector<Event *> toErase;
+ std::vector<Event *> toInsert;
+
+ timeT a0 = m_selection->getStartTime();
+ timeT a1 = m_selection->getEndTime();
+
+ bool useNotationTimings = false;
+
+ for (i = m_selection->getSegmentEvents().begin();
+ i != m_selection->getSegmentEvents().end(); ++i) {
+
+ RG_DEBUG << "RetrogradeCommand::modifySegment: event at " << (*i)->getAbsoluteTime() << " type " << (*i)->getType() << endl;
+
+ if ((*i)->isa(Note::EventRestType))
+ continue;
+
+ toErase.push_back(*i);
+ timeT newTime = a0 + a1 - (*i)->getDuration() -
+ (useNotationTimings ?
+ (*i)->getNotationAbsoluteTime() : (*i)->getAbsoluteTime());
+
+ Event *e;
+ if (useNotationTimings) {
+ e = new Event(**i, newTime, (*i)->getDuration(), (*i)->getSubOrdering(),
+ newTime, (*i)->getNotationDuration());
+ } else {
+ e = new Event(**i, newTime);
+ }
+
+ toInsert.push_back(e);
+ }
+
+ Segment &segment(m_selection->getSegment());
+
+ for (unsigned int j = 0; j < toErase.size(); ++j) {
+ Segment::iterator jtr(segment.findSingle(toErase[j]));
+ if (jtr != segment.end()) {
+ RG_DEBUG << "found event " << j << endl;
+ segment.erase(jtr);
+ } else {
+ RG_DEBUG << "failed to find event " << j << endl;
+ }
+ }
+
+ for (unsigned int j = 0; j < toInsert.size(); ++j) {
+
+ Segment::iterator jtr = segment.end();
+
+ // somewhat like the NoteOverlay part of PasteEventsCommand::modifySegment
+ /* nah -- let's do a de-counterpoint afterwards perhaps
+ if (m_useNotationTimings && toInsert[j]->isa(Note::EventType)) {
+ long pitch = 0;
+ Accidental explicitAccidental = NoAccidental;
+ toInsert[j]->get<String>(ACCIDENTAL, explicitAccidental);
+ if (toInsert[j]->get<Int>(PITCH, pitch)) {
+ jtr = SegmentNotationHelper(segment).insertNote
+ (toInsert[j]->getAbsoluteTime(),
+ Note::getNearestNote(toInsert[j]->getDuration()),
+ pitch, explicitAccidental);
+ delete toInsert[j];
+ toInsert[j] = *jtr;
+ }
+ } else {
+ */
+ jtr = segment.insert(toInsert[j]);
+ // }
+
+ // insert new event back into selection
+ m_selection->addEvent(toInsert[j]);
+
+ // if (jtr != segment.end()) m_lastInsertedEvent = toInsert[j];
+ }
+
+ segment.normalizeRests(a0, a1);
+}
+
+}
diff --git a/src/commands/edit/RetrogradeInvertCommand.h b/src/commands/edit/RetrogradeInvertCommand.h
new file mode 100644
index 0000000..ea7d540
--- /dev/null
+++ b/src/commands/edit/RetrogradeInvertCommand.h
@@ -0,0 +1,67 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_RETROGRADEINVERTCOMMAND_H_
+#define _RG_RETROGRADEINVERTCOMMAND_H_
+
+#include "document/BasicSelectionCommand.h"
+#include <qstring.h>
+#include <klocale.h>
+
+
+
+
+namespace Rosegarden
+{
+
+class EventSelection;
+
+
+class RetrogradeInvertCommand : public BasicSelectionCommand
+{
+public:
+ RetrogradeInvertCommand(int semitones, EventSelection &selection) :
+ BasicSelectionCommand(getGlobalName(semitones), selection, true),
+ m_selection(&selection), m_semitones(semitones) { }
+
+ static QString getGlobalName(int semitones = 0) {
+ switch (semitones) {
+ default: return i18n("Re&trograde Invert");
+ }
+ }
+
+protected:
+ virtual void modifySegment();
+
+private:
+ EventSelection *m_selection;// only used on 1st execute (cf bruteForceRedo)
+ int m_semitones;
+};
+
+
+
+}
+
+#endif
diff --git a/src/commands/edit/SelectionPropertyCommand.cpp b/src/commands/edit/SelectionPropertyCommand.cpp
new file mode 100644
index 0000000..3501e5b
--- /dev/null
+++ b/src/commands/edit/SelectionPropertyCommand.cpp
@@ -0,0 +1,128 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "SelectionPropertyCommand.h"
+
+#include "base/Event.h"
+#include "base/PropertyName.h"
+#include "base/Selection.h"
+#include "document/BasicSelectionCommand.h"
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+SelectionPropertyCommand::SelectionPropertyCommand(
+ EventSelection *selection,
+ const PropertyName &property,
+ PropertyPattern pattern,
+ int value1,
+ int value2):
+ BasicSelectionCommand(getGlobalName(), *selection, true),
+ m_selection(selection),
+ m_property(property),
+ m_pattern(pattern),
+ m_value1(value1),
+ m_value2(value2)
+{}
+
+void
+SelectionPropertyCommand::modifySegment()
+{
+ EventSelection::eventcontainer::iterator i =
+ m_selection->getSegmentEvents().begin();
+
+ int count = 0;
+
+ timeT endTime = 0;
+ timeT startTime = 0;
+ bool haveStart = false, haveEnd = false;
+
+ // Get start and end times
+ //
+ for (;i != m_selection->getSegmentEvents().end(); ++i) {
+ if ((*i)->getAbsoluteTime() < startTime || !haveStart) {
+ startTime = (*i)->getAbsoluteTime();
+ haveStart = true;
+ }
+
+ if ((*i)->getAbsoluteTime() > endTime || !haveEnd) {
+ endTime = (*i)->getAbsoluteTime();
+ haveEnd = true;
+ }
+ }
+
+ double step = double(m_value1 - m_value2) / double(endTime - startTime);
+ double lowStep = double(m_value2) / double(endTime - startTime);
+
+ for (i = m_selection->getSegmentEvents().begin();
+ i != m_selection->getSegmentEvents().end(); ++i) {
+ // flat
+ if (m_pattern == FlatPattern)
+ (*i)->set
+ <Int>(m_property, m_value1);
+ else if (m_pattern == AlternatingPattern) {
+ if (count % 2 == 0)
+ (*i)->set
+ <Int>(m_property, m_value1);
+ else
+ (*i)->set
+ <Int>(m_property, m_value2);
+
+ // crescendo, decrescendo
+ // (determined by step, above, which is in turn influenced by whether
+ // value1 is greater than value2)
+ } else if ((m_pattern == CrescendoPattern) ||
+ (m_pattern == DecrescendoPattern)) {
+ (*i)->set
+ <Int>(m_property,
+ m_value1 -
+ int(step *
+ ((*i)->getAbsoluteTime() - startTime)));
+ // ringing
+ } else if (m_pattern == RingingPattern) {
+ if (count % 2 == 0)
+ (*i)->set
+ <Int>
+ (m_property,
+ m_value1 - int(step *
+ ((*i)->getAbsoluteTime() - startTime)));
+ else {
+ int value = m_value2 - int(lowStep *
+ ((*i)->getAbsoluteTime() - startTime));
+ if (value < 0)
+ value = 0;
+
+ (*i)->set
+ <Int>(m_property, value);
+ }
+ }
+
+ count++;
+ }
+}
+
+}
diff --git a/src/commands/edit/SelectionPropertyCommand.h b/src/commands/edit/SelectionPropertyCommand.h
new file mode 100644
index 0000000..34c5352
--- /dev/null
+++ b/src/commands/edit/SelectionPropertyCommand.h
@@ -0,0 +1,82 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_SELECTIONPROPERTYCOMMAND_H_
+#define _RG_SELECTIONPROPERTYCOMMAND_H_
+
+#include "base/PropertyName.h"
+#include "document/BasicSelectionCommand.h"
+#include <qstring.h>
+#include <klocale.h>
+
+
+class Set;
+
+
+namespace Rosegarden
+{
+
+class EventSelection;
+
+// Patterns of properties
+//
+typedef enum
+{
+ FlatPattern, // set selection to velocity 1.
+ AlternatingPattern, // alternate between velocity 1 and 2 on
+ // subsequent events.
+ CrescendoPattern, // increasing from velocity 1 to velocity 2.
+ DecrescendoPattern, // decreasing from velocity 1 to velocity 2.
+ RingingPattern // between velocity 1 and 2, dying away.
+} PropertyPattern;
+
+
+class SelectionPropertyCommand : public BasicSelectionCommand
+{
+public:
+
+ SelectionPropertyCommand(EventSelection *selection,
+ const PropertyName &property,
+ PropertyPattern pattern,
+ int value1,
+ int value2);
+
+ static QString getGlobalName() { return i18n("Set &Property"); }
+
+ virtual void modifySegment();
+
+private:
+ EventSelection *m_selection;
+ PropertyName m_property;
+ PropertyPattern m_pattern;
+ int m_value1;
+ int m_value2;
+
+};
+
+
+}
+
+#endif
diff --git a/src/commands/edit/SetLyricsCommand.cpp b/src/commands/edit/SetLyricsCommand.cpp
new file mode 100644
index 0000000..16f5be4
--- /dev/null
+++ b/src/commands/edit/SetLyricsCommand.cpp
@@ -0,0 +1,192 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "SetLyricsCommand.h"
+
+#include "base/Event.h"
+#include "misc/Strings.h"
+#include "misc/Debug.h"
+#include "base/Composition.h"
+#include "base/NotationTypes.h"
+#include "base/Segment.h"
+#include "base/BaseProperties.h"
+#include <qregexp.h>
+#include <qstring.h>
+#include <qstringlist.h>
+
+
+namespace Rosegarden
+{
+
+using namespace BaseProperties;
+
+SetLyricsCommand::SetLyricsCommand(Segment *segment, int verse, QString newLyricData) :
+ KNamedCommand(getGlobalName()),
+ m_segment(segment),
+ m_verse(verse),
+ m_newLyricData(newLyricData)
+{
+ // nothing
+}
+
+SetLyricsCommand::~SetLyricsCommand()
+{
+ for (std::vector<Event *>::iterator i = m_oldLyricEvents.begin();
+ i != m_oldLyricEvents.end(); ++i) {
+ delete *i;
+ }
+}
+
+void
+SetLyricsCommand::execute()
+{
+ // This and LyricEditDialog::unparse() are opposites that will
+ // need to be kept in sync with any changes to one another. (They
+ // should really both be in a common lyric management class.)
+
+ // first remove old lyric events
+
+ Segment::iterator i = m_segment->begin();
+
+ while (i != m_segment->end()) {
+
+ Segment::iterator j = i;
+ ++j;
+
+ if ((*i)->isa(Text::EventType)) {
+ std::string textType;
+ if ((*i)->get<String>(Text::TextTypePropertyName, textType) &&
+ textType == Text::Lyric) {
+ long verse = 0;
+ (*i)->get<Int>(Text::LyricVersePropertyName, verse);
+ if (verse == m_verse) {
+ m_oldLyricEvents.push_back(new Event(**i));
+ m_segment->erase(i);
+ }
+ }
+ }
+
+ i = j;
+ }
+
+ // now parse the new string
+
+ QStringList barStrings =
+ QStringList::split("/", m_newLyricData, true); // empties ok
+
+ Composition *comp = m_segment->getComposition();
+ int barNo = comp->getBarNumber(m_segment->getStartTime());
+
+ for (QStringList::Iterator bsi = barStrings.begin();
+ bsi != barStrings.end(); ++bsi) {
+
+ NOTATION_DEBUG << "Parsing lyrics for bar number " << barNo << ": \"" << *bsi << "\"" << endl;
+
+ std::pair<timeT, timeT> barRange = comp->getBarRange(barNo++);
+ QString syllables = *bsi;
+ syllables.replace(QRegExp("\\[\\d+\\] "), " ");
+ QStringList syllableList = QStringList::split(" ", syllables); // no empties
+
+ i = m_segment->findTime(barRange.first);
+ timeT laterThan = barRange.first - 1;
+
+ for (QStringList::Iterator ssi = syllableList.begin();
+ ssi != syllableList.end(); ++ssi) {
+
+ while (m_segment->isBeforeEndMarker(i) &&
+ (*i)->getAbsoluteTime() < barRange.second &&
+ (!(*i)->isa(Note::EventType) ||
+ (*i)->getNotationAbsoluteTime() <= laterThan ||
+ ((*i)->has(TIED_BACKWARD) &&
+ (*i)->get
+ <Bool>(TIED_BACKWARD)))) ++i;
+
+ timeT time = m_segment->getEndMarkerTime();
+ timeT notationTime = time;
+ if (m_segment->isBeforeEndMarker(i)) {
+ time = (*i)->getAbsoluteTime();
+ notationTime = (*i)->getNotationAbsoluteTime();
+ }
+
+ QString syllable = *ssi;
+ syllable.replace(QRegExp("~"), " ");
+ syllable = syllable.simplifyWhiteSpace();
+ if (syllable == "")
+ continue;
+ laterThan = notationTime + 1;
+ if (syllable == ".")
+ continue;
+
+ NOTATION_DEBUG << "Syllable \"" << syllable << "\" at time " << time << endl;
+
+ Text text(qstrtostr(syllable), Text::Lyric);
+ Event *event = text.getAsEvent(time);
+ event->set<Int>(Text::LyricVersePropertyName, m_verse);
+ m_segment->insert(event);
+ }
+ }
+}
+
+void
+SetLyricsCommand::unexecute()
+{
+ // Before we inserted the new lyric events (in execute()), we
+ // removed all the existing ones. That means we know any lyric
+ // events found now must have been inserted by execute(), so we
+ // can safely remove them before restoring the old ones.
+
+ Segment::iterator i = m_segment->begin();
+
+ while (i != m_segment->end()) {
+
+ Segment::iterator j = i;
+ ++j;
+
+ if ((*i)->isa(Text::EventType)) {
+ std::string textType;
+ if ((*i)->get<String>(Text::TextTypePropertyName, textType) &&
+ textType == Text::Lyric) {
+ long verse = 0;
+ (*i)->get<Int>(Text::LyricVersePropertyName, verse);
+ if (verse == m_verse) {
+ m_segment->erase(i);
+ }
+ }
+ }
+
+ i = j;
+ }
+
+ // Now restore the old ones and clear out the vector.
+
+ for (std::vector<Event *>::iterator i = m_oldLyricEvents.begin();
+ i != m_oldLyricEvents.end(); ++i) {
+ m_segment->insert(*i);
+ }
+
+ m_oldLyricEvents.clear();
+}
+
+}
diff --git a/src/commands/edit/SetLyricsCommand.h b/src/commands/edit/SetLyricsCommand.h
new file mode 100644
index 0000000..499f12a
--- /dev/null
+++ b/src/commands/edit/SetLyricsCommand.h
@@ -0,0 +1,66 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_SETLYRICSCOMMAND_H_
+#define _RG_SETLYRICSCOMMAND_H_
+
+#include <kcommand.h>
+#include <qstring.h>
+#include <vector>
+#include <klocale.h>
+
+
+
+
+namespace Rosegarden
+{
+
+class Segment;
+class Event;
+
+
+class SetLyricsCommand : public KNamedCommand
+{
+public:
+ SetLyricsCommand(Segment *segment, int verse, QString newLyricData);
+ ~SetLyricsCommand();
+
+ static QString getGlobalName() { return i18n("Edit L&yrics"); }
+
+ virtual void execute();
+ virtual void unexecute();
+
+private:
+ Segment *m_segment;
+ int m_verse;
+ std::vector<Event *> m_oldLyricEvents;
+ QString m_newLyricData;
+};
+
+
+
+}
+
+#endif
diff --git a/src/commands/edit/SetNoteTypeCommand.cpp b/src/commands/edit/SetNoteTypeCommand.cpp
new file mode 100644
index 0000000..4dc97b1
--- /dev/null
+++ b/src/commands/edit/SetNoteTypeCommand.cpp
@@ -0,0 +1,87 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "SetNoteTypeCommand.h"
+
+#include "base/Event.h"
+#include "base/NotationTypes.h"
+#include "base/Selection.h"
+#include "document/BasicSelectionCommand.h"
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+void
+SetNoteTypeCommand::modifySegment()
+{
+ std::vector<Event *> toErase;
+ std::vector<Event *> toInsert;
+
+ EventSelection::eventcontainer::iterator i;
+ timeT endTime = getEndTime();
+
+ for (i = m_selection->getSegmentEvents().begin();
+ i != m_selection->getSegmentEvents().end(); ++i) {
+
+ if ((*i)->isa(Note::EventType)) {
+ toErase.push_back(*i);
+
+ Event *e;
+ if (m_notationOnly) {
+ e = new Event(**i,
+ (*i)->getAbsoluteTime(),
+ (*i)->getDuration(),
+ (*i)->getSubOrdering(),
+ (*i)->getNotationAbsoluteTime(),
+ Note(m_type).getDuration());
+ } else {
+ e = new Event(**i,
+ (*i)->getNotationAbsoluteTime(),
+ Note(m_type).getDuration());
+ }
+
+ if (e->getNotationAbsoluteTime() + e->getNotationDuration() > endTime) {
+ endTime = e->getNotationAbsoluteTime() + e->getNotationDuration();
+ }
+
+ toInsert.push_back(e);
+ }
+ }
+
+ for (std::vector<Event *>::iterator i = toErase.begin(); i != toErase.end(); ++i) {
+ m_selection->getSegment().eraseSingle(*i);
+ }
+
+ for (std::vector<Event *>::iterator i = toInsert.begin(); i != toInsert.end(); ++i) {
+ m_selection->getSegment().insert(*i);
+ m_selection->addEvent(*i);
+ }
+
+ m_selection->getSegment().normalizeRests(getStartTime(), endTime);
+}
+
+}
diff --git a/src/commands/edit/SetNoteTypeCommand.h b/src/commands/edit/SetNoteTypeCommand.h
new file mode 100644
index 0000000..eec4a4c
--- /dev/null
+++ b/src/commands/edit/SetNoteTypeCommand.h
@@ -0,0 +1,72 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_SETNOTETYPECOMMAND_H_
+#define _RG_SETNOTETYPECOMMAND_H_
+
+#include "base/NotationTypes.h"
+#include "document/BasicSelectionCommand.h"
+#include <qstring.h>
+#include <klocale.h>
+
+
+
+
+namespace Rosegarden
+{
+
+class EventSelection;
+
+
+class SetNoteTypeCommand : public BasicSelectionCommand
+{
+public:
+ SetNoteTypeCommand(EventSelection &selection,
+ Note::Type type,
+ bool notationOnly) :
+ BasicSelectionCommand(getGlobalName(), selection, true),
+ m_selection(&selection),
+ m_type(type),
+ m_notationOnly(notationOnly)
+ { }
+
+ static QString getGlobalName() {
+ return i18n("&Set Note Type");
+ }
+
+protected:
+ virtual void modifySegment();
+
+private:
+ EventSelection *m_selection;// only used on 1st execute (cf bruteForceRedo)
+ Note::Type m_type;
+ bool m_notationOnly;
+};
+
+
+
+}
+
+#endif
diff --git a/src/commands/edit/SetTriggerCommand.cpp b/src/commands/edit/SetTriggerCommand.cpp
new file mode 100644
index 0000000..861796e
--- /dev/null
+++ b/src/commands/edit/SetTriggerCommand.cpp
@@ -0,0 +1,74 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "SetTriggerCommand.h"
+
+#include "base/NotationTypes.h"
+#include "base/Selection.h"
+#include "base/TriggerSegment.h"
+#include "document/BasicSelectionCommand.h"
+#include "base/BaseProperties.h"
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+using namespace BaseProperties;
+
+void
+SetTriggerCommand::modifySegment()
+{
+ EventSelection::eventcontainer::iterator i;
+
+ for (i = m_selection->getSegmentEvents().begin();
+ i != m_selection->getSegmentEvents().end(); ++i) {
+
+ if (!m_notesOnly || (*i)->isa(Note::EventType)) {
+ (*i)->set
+ <Int>(TRIGGER_SEGMENT_ID, m_triggerSegmentId);
+ (*i)->set
+ <Bool>(TRIGGER_SEGMENT_RETUNE, m_retune);
+ (*i)->set
+ <String>(TRIGGER_SEGMENT_ADJUST_TIMES, m_timeAdjust);
+ if (m_mark != Marks::NoMark) {
+ Marks::addMark(**i, m_mark, true);
+ }
+ }
+ }
+
+ // Update the rec references here, without bothering to do so in unexecute
+ // or in ClearTriggersCommand -- because it doesn't matter if a trigger
+ // has references to segments that don't actually trigger it, whereas it
+ // does matter if it loses a reference to something that does
+
+ TriggerSegmentRec *rec =
+ m_selection->getSegment().getComposition()->getTriggerSegmentRec
+ (m_triggerSegmentId);
+
+ if (rec)
+ rec->updateReferences();
+}
+
+}
diff --git a/src/commands/edit/SetTriggerCommand.h b/src/commands/edit/SetTriggerCommand.h
new file mode 100644
index 0000000..579bb61
--- /dev/null
+++ b/src/commands/edit/SetTriggerCommand.h
@@ -0,0 +1,83 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_SETTRIGGERCOMMAND_H_
+#define _RG_SETTRIGGERCOMMAND_H_
+
+#include "base/TriggerSegment.h"
+#include "document/BasicSelectionCommand.h"
+#include <string>
+#include <qstring.h>
+#include <klocale.h>
+
+
+
+
+namespace Rosegarden
+{
+
+class EventSelection;
+
+
+class SetTriggerCommand : public BasicSelectionCommand
+{
+public:
+ SetTriggerCommand(EventSelection &selection,
+ TriggerSegmentId triggerSegmentId,
+ bool notesOnly,
+ bool retune,
+ std::string timeAdjust,
+ Mark mark,
+ QString name = 0) :
+ BasicSelectionCommand(name ? name : getGlobalName(), selection, true),
+ m_selection(&selection),
+ m_triggerSegmentId(triggerSegmentId),
+ m_notesOnly(notesOnly),
+ m_retune(retune),
+ m_timeAdjust(timeAdjust),
+ m_mark(mark)
+ { }
+
+ static QString getGlobalName() {
+ return i18n("Tri&gger Segment");
+ }
+
+protected:
+ virtual void modifySegment();
+
+private:
+ EventSelection *m_selection;// only used on 1st execute (cf bruteForceRedo)
+ TriggerSegmentId m_triggerSegmentId;
+ bool m_notesOnly;
+ bool m_retune;
+ std::string m_timeAdjust;
+ Mark m_mark;
+};
+
+
+
+}
+
+#endif
diff --git a/src/commands/edit/TransposeCommand.cpp b/src/commands/edit/TransposeCommand.cpp
new file mode 100644
index 0000000..4d08079
--- /dev/null
+++ b/src/commands/edit/TransposeCommand.cpp
@@ -0,0 +1,83 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "TransposeCommand.h"
+
+#include <iostream>
+#include "base/NotationTypes.h"
+#include "base/Selection.h"
+#include "document/BasicSelectionCommand.h"
+#include <qstring.h>
+#include "base/BaseProperties.h"
+
+
+namespace Rosegarden
+{
+
+using namespace BaseProperties;
+using namespace Accidentals;
+
+void
+TransposeCommand::modifySegment()
+{
+ EventSelection::eventcontainer::iterator i;
+
+ for (i = m_selection->getSegmentEvents().begin();
+ i != m_selection->getSegmentEvents().end(); ++i) {
+
+ if ((*i)->isa(Note::EventType)) {
+
+ if (m_diatonic)
+ {
+
+ Pitch oldPitch(**i);
+
+ timeT noteTime = (*i)->getAbsoluteTime();
+ Key key = m_selection->getSegment().getKeyAtTime(noteTime);
+ Pitch newPitch = oldPitch.transpose(key, m_semitones, m_steps);
+ Event * newNoteEvent = newPitch.getAsNoteEvent(0, 0);
+ Accidental newAccidental;
+ newNoteEvent->get<String>(BaseProperties::ACCIDENTAL, newAccidental);
+
+ (*i)->set<Int>(PITCH, newPitch.getPerformancePitch());
+ (*i)->set<String>(ACCIDENTAL, newAccidental);
+ }
+ else
+ {
+ try {
+ long pitch = (*i)->get<Int>(PITCH);
+ pitch += m_semitones;
+ (*i)->set<Int>(PITCH, pitch);
+ if ((m_semitones % 12) != 0) {
+ (*i)->unset(ACCIDENTAL);
+ }
+ } catch (...) { }
+ }
+
+ }
+ }
+}
+
+}
diff --git a/src/commands/edit/TransposeCommand.h b/src/commands/edit/TransposeCommand.h
new file mode 100644
index 0000000..764f72b
--- /dev/null
+++ b/src/commands/edit/TransposeCommand.h
@@ -0,0 +1,83 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_TRANSPOSECOMMAND_H_
+#define _RG_TRANSPOSECOMMAND_H_
+
+#include "document/BasicSelectionCommand.h"
+#include <qstring.h>
+#include <klocale.h>
+
+
+
+
+namespace Rosegarden
+{
+
+class EventSelection;
+
+
+class TransposeCommand : public BasicSelectionCommand
+{
+public:
+ TransposeCommand(int semitones, EventSelection &selection) :
+ BasicSelectionCommand(getGlobalName(semitones), selection, true),
+ m_selection(&selection), m_semitones(semitones), m_diatonic(false) { }
+
+ TransposeCommand(int semitones, int steps, EventSelection &selection) :
+ BasicSelectionCommand(getDiatonicGlobalName(semitones, steps), selection, true),
+ m_selection(&selection), m_semitones(semitones), m_steps(steps), m_diatonic(true) { }
+
+ static QString getDiatonicGlobalName(int semitones = 0, int step = 0) {
+ switch (semitones) {
+ default: return i18n("Transpose by &Interval...");
+ }
+ }
+
+ static QString getGlobalName(int semitones = 0) {
+ switch (semitones) {
+ case 1: return i18n("&Up a Semitone");
+ case -1: return i18n("&Down a Semitone");
+ case 12: return i18n("Up an &Octave");
+ case -12: return i18n("Down an Octa&ve");
+ default: return i18n("&Transpose by Semitones...");
+ }
+ }
+
+protected:
+ virtual void modifySegment();
+
+private:
+ EventSelection *m_selection;// only used on 1st execute (cf bruteForceRedo)
+ int m_semitones;
+ int m_steps;
+ bool m_diatonic;
+};
+
+
+
+}
+
+#endif
diff --git a/src/commands/matrix/MatrixEraseCommand.cpp b/src/commands/matrix/MatrixEraseCommand.cpp
new file mode 100644
index 0000000..c35259e
--- /dev/null
+++ b/src/commands/matrix/MatrixEraseCommand.cpp
@@ -0,0 +1,70 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "MatrixEraseCommand.h"
+
+#include <klocale.h>
+#include "base/Event.h"
+#include "base/NotationTypes.h"
+#include "base/Segment.h"
+#include "base/SegmentMatrixHelper.h"
+#include "document/BasicCommand.h"
+
+
+namespace Rosegarden
+{
+
+MatrixEraseCommand::MatrixEraseCommand(Segment &segment,
+ Event *event) :
+ BasicCommand(i18n("Erase Note"),
+ segment,
+ event->getAbsoluteTime(),
+ event->getAbsoluteTime() + event->getDuration(),
+ true),
+ m_event(event),
+ m_relayoutEndTime(getEndTime())
+{
+ // nothing
+}
+
+timeT MatrixEraseCommand::getRelayoutEndTime()
+{
+ return m_relayoutEndTime;
+}
+
+void MatrixEraseCommand::modifySegment()
+{
+ SegmentMatrixHelper helper(getSegment());
+
+ std::string eventType = m_event->getType();
+
+ if (eventType == Note::EventType) {
+
+ helper.deleteNote(m_event, false);
+
+ }
+}
+
+}
diff --git a/src/commands/matrix/MatrixEraseCommand.h b/src/commands/matrix/MatrixEraseCommand.h
new file mode 100644
index 0000000..244c0f9
--- /dev/null
+++ b/src/commands/matrix/MatrixEraseCommand.h
@@ -0,0 +1,62 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_MATRIXERASECOMMAND_H_
+#define _RG_MATRIXERASECOMMAND_H_
+
+#include "document/BasicCommand.h"
+#include "base/Event.h"
+
+
+
+
+namespace Rosegarden
+{
+
+class Segment;
+class Event;
+
+
+class MatrixEraseCommand : public BasicCommand
+{
+public:
+ MatrixEraseCommand(Segment &segment,
+ Event *event);
+
+ virtual timeT getRelayoutEndTime();
+
+protected:
+ virtual void modifySegment();
+
+ Event *m_event; // only used on 1st execute (cf bruteForceRedo)
+ timeT m_relayoutEndTime;
+};
+
+//------------------------------
+
+
+}
+
+#endif
diff --git a/src/commands/matrix/MatrixInsertionCommand.cpp b/src/commands/matrix/MatrixInsertionCommand.cpp
new file mode 100644
index 0000000..5b03d1a
--- /dev/null
+++ b/src/commands/matrix/MatrixInsertionCommand.cpp
@@ -0,0 +1,74 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "MatrixInsertionCommand.h"
+
+#include <klocale.h>
+#include "base/Event.h"
+#include "base/Segment.h"
+#include "base/SegmentMatrixHelper.h"
+#include "document/BasicCommand.h"
+#include "base/BaseProperties.h"
+#include "misc/Debug.h"
+
+
+namespace Rosegarden
+{
+
+using namespace BaseProperties;
+
+MatrixInsertionCommand::MatrixInsertionCommand(Segment &segment,
+ timeT time,
+ timeT endTime,
+ Event *event) :
+ BasicCommand(i18n("Insert Note"), segment, time, endTime),
+ m_event(new Event(*event,
+ std::min(time, endTime),
+ (time < endTime) ? endTime - time : time - endTime))
+{
+ // nothing
+}
+
+MatrixInsertionCommand::~MatrixInsertionCommand()
+{
+ delete m_event;
+ // don't want to delete m_lastInsertedEvent, it's just an alias
+}
+
+void MatrixInsertionCommand::modifySegment()
+{
+ MATRIX_DEBUG << "MatrixInsertionCommand::modifySegment()\n";
+
+ if (!m_event->has(VELOCITY)) {
+ m_event->set
+ <Int>(VELOCITY, 100);
+ }
+
+ SegmentMatrixHelper helper(getSegment());
+ m_lastInsertedEvent = new Event(*m_event);
+ helper.insertNote(m_lastInsertedEvent);
+}
+
+}
diff --git a/src/commands/matrix/MatrixInsertionCommand.h b/src/commands/matrix/MatrixInsertionCommand.h
new file mode 100644
index 0000000..bca8e0a
--- /dev/null
+++ b/src/commands/matrix/MatrixInsertionCommand.h
@@ -0,0 +1,64 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_MATRIXINSERTIONCOMMAND_H_
+#define _RG_MATRIXINSERTIONCOMMAND_H_
+
+#include "document/BasicCommand.h"
+#include "base/Event.h"
+
+
+
+
+namespace Rosegarden
+{
+
+class Segment;
+class Event;
+
+
+class MatrixInsertionCommand : public BasicCommand
+{
+public:
+ MatrixInsertionCommand(Segment &segment,
+ timeT time,
+ timeT endTime,
+ Event *event);
+
+ virtual ~MatrixInsertionCommand();
+
+ Event *getLastInsertedEvent() { return m_lastInsertedEvent; }
+
+protected:
+ virtual void modifySegment();
+
+ Event *m_event;
+ Event *m_lastInsertedEvent; // an alias for another event
+};
+
+
+}
+
+#endif
diff --git a/src/commands/matrix/MatrixModifyCommand.cpp b/src/commands/matrix/MatrixModifyCommand.cpp
new file mode 100644
index 0000000..b78d6f3
--- /dev/null
+++ b/src/commands/matrix/MatrixModifyCommand.cpp
@@ -0,0 +1,81 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "MatrixModifyCommand.h"
+
+#include "base/Event.h"
+#include <klocale.h>
+#include "base/NotationTypes.h"
+#include "base/Segment.h"
+#include "document/BasicCommand.h"
+
+
+namespace Rosegarden
+{
+
+MatrixModifyCommand::MatrixModifyCommand(Segment &segment,
+ Event *oldEvent,
+ Event *newEvent,
+ bool isMove,
+ bool normalize):
+ BasicCommand((isMove ? i18n("Move Note") : i18n("Modify Note")),
+ segment,
+ std::min(newEvent->getAbsoluteTime(),
+ oldEvent->getAbsoluteTime()),
+ std::max(oldEvent->getAbsoluteTime() +
+ oldEvent->getDuration(),
+ newEvent->getAbsoluteTime() +
+ newEvent->getDuration()),
+ true),
+ m_normalize(normalize),
+ m_oldEvent(oldEvent),
+ m_newEvent(newEvent)
+{}
+
+void MatrixModifyCommand::modifySegment()
+{
+ std::string eventType = m_oldEvent->getType();
+
+ if (eventType == Note::EventType) {
+
+ timeT normalizeStart = std::min(m_newEvent->getAbsoluteTime(),
+ m_oldEvent->getAbsoluteTime());
+
+ timeT normalizeEnd = std::max(m_newEvent->getAbsoluteTime() +
+ m_newEvent->getDuration(),
+ m_oldEvent->getAbsoluteTime() +
+ m_oldEvent->getDuration());
+
+ Segment &segment(getSegment());
+ segment.insert(m_newEvent);
+ segment.eraseSingle(m_oldEvent);
+
+ if (m_normalize) {
+ segment.normalizeRests(normalizeStart, normalizeEnd);
+ }
+ }
+}
+
+}
diff --git a/src/commands/matrix/MatrixModifyCommand.h b/src/commands/matrix/MatrixModifyCommand.h
new file mode 100644
index 0000000..df9bdc0
--- /dev/null
+++ b/src/commands/matrix/MatrixModifyCommand.h
@@ -0,0 +1,63 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_MATRIXMODIFYCOMMAND_H_
+#define _RG_MATRIXMODIFYCOMMAND_H_
+
+#include "document/BasicCommand.h"
+
+
+
+
+namespace Rosegarden
+{
+
+class Segment;
+class Event;
+
+
+class MatrixModifyCommand : public BasicCommand
+{
+public:
+ MatrixModifyCommand(Segment &segment,
+ Event *oldEvent,
+ Event *newEvent,
+ bool isMove,
+ bool normalize);
+
+protected:
+ virtual void modifySegment();
+
+ bool m_normalize;
+
+ Event *m_oldEvent;
+ Event *m_newEvent;
+};
+
+
+
+}
+
+#endif
diff --git a/src/commands/matrix/MatrixPercussionInsertionCommand.cpp b/src/commands/matrix/MatrixPercussionInsertionCommand.cpp
new file mode 100644
index 0000000..513663d
--- /dev/null
+++ b/src/commands/matrix/MatrixPercussionInsertionCommand.cpp
@@ -0,0 +1,192 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "MatrixPercussionInsertionCommand.h"
+
+#include <klocale.h>
+#include "base/Composition.h"
+#include "base/Event.h"
+#include "base/NotationTypes.h"
+#include "base/Segment.h"
+#include "base/SegmentMatrixHelper.h"
+#include "document/BasicCommand.h"
+#include "base/BaseProperties.h"
+#include "misc/Debug.h"
+
+
+namespace Rosegarden
+{
+using namespace BaseProperties;
+
+
+MatrixPercussionInsertionCommand::MatrixPercussionInsertionCommand(Segment &segment,
+ timeT time,
+ Event *event) :
+ BasicCommand(i18n("Insert Percussion Note"), segment,
+ getEffectiveStartTime(segment, time, *event),
+ getEndTime(segment, time, *event)),
+ m_event(0),
+ m_time(time)
+{
+ timeT endTime = getEndTime(segment, time, *event);
+ m_event = new Event(*event, time, endTime - time);
+}
+
+MatrixPercussionInsertionCommand::~MatrixPercussionInsertionCommand()
+{
+ delete m_event;
+ // don't want to delete m_lastInsertedEvent, it's just an alias
+}
+
+void MatrixPercussionInsertionCommand::modifySegment()
+{
+ MATRIX_DEBUG << "MatrixPercussionInsertionCommand::modifySegment()\n";
+
+ if (!m_event->has(VELOCITY)) {
+ m_event->set
+ <Int>(VELOCITY, 100);
+ }
+
+ Segment &s = getSegment();
+
+ Segment::iterator i = s.findTime(m_time);
+
+ int pitch = 0;
+ if (m_event->has(PITCH)) {
+ pitch = m_event->get
+ <Int>(PITCH);
+ }
+
+ while (i != s.begin()) {
+
+ --i;
+
+ if ((*i)->getAbsoluteTime() < m_time &&
+ (*i)->isa(Note::EventType)) {
+
+ if ((*i)->has(PITCH) &&
+ (*i)->get
+ <Int>(PITCH) == pitch) {
+
+ if ((*i)->getAbsoluteTime() + (*i)->getDuration() > m_time) {
+ Event *newPrevious = new Event
+ (**i, (*i)->getAbsoluteTime(), m_time - (*i)->getAbsoluteTime());
+ s.erase(i);
+ i = s.insert(newPrevious);
+ } else {
+ break;
+ }
+ }
+ }
+ }
+
+ SegmentMatrixHelper helper(s);
+ m_lastInsertedEvent = new Event(*m_event);
+ helper.insertNote(m_lastInsertedEvent);
+}
+
+timeT
+MatrixPercussionInsertionCommand::getEffectiveStartTime(Segment &segment,
+ timeT time,
+ Event &event)
+{
+ timeT startTime = time;
+
+ int pitch = 0;
+ if (event.has(PITCH)) {
+ pitch = event.get<Int>(PITCH);
+ }
+
+ Segment::iterator i = segment.findTime(time);
+ while (i != segment.begin()) {
+ --i;
+
+ if ((*i)->has(PITCH) &&
+ (*i)->get
+ <Int>(PITCH) == pitch) {
+
+ if ((*i)->getAbsoluteTime() < time &&
+ (*i)->isa(Note::EventType)) {
+ if ((*i)->getAbsoluteTime() + (*i)->getDuration() > time) {
+ startTime = (*i)->getAbsoluteTime();
+ } else {
+ break;
+ }
+ }
+ }
+ }
+
+ return startTime;
+}
+
+timeT
+MatrixPercussionInsertionCommand::getEndTime(Segment &segment,
+ timeT time,
+ Event &event)
+{
+ timeT endTime =
+ time + Note(Note::Semibreve,
+ 0).getDuration();
+ timeT barEndTime = segment.getBarEndForTime(time);
+ timeT segmentEndTime = segment.getEndMarkerTime();
+
+ if (barEndTime > endTime)
+ endTime = barEndTime;
+ if (endTime > segmentEndTime)
+ endTime = segmentEndTime;
+
+ int pitch = 0;
+ if (event.has(PITCH)) {
+ pitch = event.get<Int>(PITCH);
+ }
+
+ for (Segment::iterator i = segment.findTime(time);
+ segment.isBeforeEndMarker(i); ++i) {
+
+ if ((*i)->has(PITCH) &&
+ (*i)->get
+ <Int>(PITCH) == pitch) {
+
+ if ((*i)->getAbsoluteTime() > time &&
+ (*i)->isa(Note::EventType)) {
+ endTime = (*i)->getAbsoluteTime();
+ }
+ }
+ }
+
+ Composition *comp = segment.getComposition();
+ std::pair<timeT, timeT> barRange =
+ comp->getBarRangeForTime(time);
+ timeT barDuration = barRange.second - barRange.first;
+
+
+ if (endTime > time + barDuration) {
+ endTime = time + barDuration;
+ }
+
+ return endTime;
+}
+
+}
diff --git a/src/commands/matrix/MatrixPercussionInsertionCommand.h b/src/commands/matrix/MatrixPercussionInsertionCommand.h
new file mode 100644
index 0000000..513754d
--- /dev/null
+++ b/src/commands/matrix/MatrixPercussionInsertionCommand.h
@@ -0,0 +1,73 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_MATRIXPERCUSSIONINSERTIONCOMMAND_H_
+#define _RG_MATRIXPERCUSSIONINSERTIONCOMMAND_H_
+
+#include "document/BasicCommand.h"
+#include "base/Event.h"
+
+
+
+
+namespace Rosegarden
+{
+
+class Segment;
+class Event;
+
+
+class MatrixPercussionInsertionCommand : public BasicCommand
+{
+public:
+ MatrixPercussionInsertionCommand(Segment &segment,
+ timeT time,
+ Event *event);
+
+ virtual ~MatrixPercussionInsertionCommand();
+
+ Event *getLastInsertedEvent() { return m_lastInsertedEvent; }
+
+protected:
+ virtual void modifySegment();
+
+ timeT getEffectiveStartTime(Segment &segment,
+ timeT startTime,
+ Event &event);
+ timeT getEndTime(Segment &segment,
+ timeT endTime,
+ Event &event);
+
+ Event *m_event;
+ timeT m_time;
+ Event *m_lastInsertedEvent; // an alias for another event
+};
+
+//------------------------------
+
+
+}
+
+#endif
diff --git a/src/commands/notation/AddFingeringMarkCommand.cpp b/src/commands/notation/AddFingeringMarkCommand.cpp
new file mode 100644
index 0000000..0c2e895
--- /dev/null
+++ b/src/commands/notation/AddFingeringMarkCommand.cpp
@@ -0,0 +1,119 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "AddFingeringMarkCommand.h"
+
+#include <klocale.h>
+#include "base/NotationTypes.h"
+#include "base/NotationQuantizer.h"
+#include "base/Segment.h"
+#include "base/Selection.h"
+#include "base/Sets.h"
+#include "document/BasicSelectionCommand.h"
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+QString
+AddFingeringMarkCommand::getGlobalName(QString fingering)
+{
+ if (fingering == "")
+ return i18n("Add Other &Fingering...");
+ else if (fingering == "0")
+ return i18n("Add Fingering &0 (Thumb)");
+ else
+ return i18n("Add Fingering &%1").arg(fingering);
+}
+
+void
+AddFingeringMarkCommand::modifySegment()
+{
+ EventSelection::eventcontainer::iterator i;
+ Segment &segment(m_selection->getSegment());
+
+ std::set
+ <Event *> done;
+
+ for (i = m_selection->getSegmentEvents().begin();
+ i != m_selection->getSegmentEvents().end(); ++i) {
+
+ if (done.find(*i) != done.end())
+ continue;
+ if (!(*i)->isa(Note::EventType))
+ continue;
+
+ // We should do this on a chord-by-chord basis, considering
+ // only those notes in a chord that are also in the selection.
+ // Apply this fingering to the first note in the chord that
+ // does not already have a fingering. If they all already do,
+ // then clear them all and start again.
+
+ Chord chord(segment, segment.findSingle(*i),
+ segment.getComposition()->getNotationQuantizer());
+
+ int attempt = 0;
+
+ while (attempt < 2) {
+
+ int count = 0;
+
+ for (Chord::iterator ci = chord.begin();
+ ci != chord.end(); ++ci) {
+
+ if (!m_selection->contains(**ci))
+ continue;
+
+ if (attempt < 2 &&
+ Marks::getFingeringMark(***ci) ==
+ Marks::NoMark) {
+ Marks::addMark
+ (***ci, Marks::getFingeringMark(m_text), true);
+ attempt = 2;
+ }
+
+ done.insert(**ci);
+ ++count;
+ }
+
+ if (attempt < 2) {
+ if (count == 0)
+ break;
+ for (Chord::iterator ci = chord.begin();
+ ci != chord.end(); ++ci) {
+ if (m_selection->contains(**ci)) {
+ Marks::removeMark
+ (***ci,
+ Marks::getFingeringMark(***ci));
+ }
+ }
+ ++attempt;
+ }
+ }
+ }
+}
+
+}
diff --git a/src/commands/notation/AddFingeringMarkCommand.h b/src/commands/notation/AddFingeringMarkCommand.h
new file mode 100644
index 0000000..1d95002
--- /dev/null
+++ b/src/commands/notation/AddFingeringMarkCommand.h
@@ -0,0 +1,64 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_NOTESMENUADDFINGERINGMARKCOMMAND_H_
+#define _RG_NOTESMENUADDFINGERINGMARKCOMMAND_H_
+
+#include "document/BasicSelectionCommand.h"
+#include <string>
+#include <qstring.h>
+
+
+
+
+namespace Rosegarden
+{
+
+class EventSelection;
+
+
+class AddFingeringMarkCommand : public BasicSelectionCommand
+{
+public:
+ AddFingeringMarkCommand(std::string text,
+ EventSelection &selection) :
+ BasicSelectionCommand(getGlobalName(), selection, true),
+ m_selection(&selection), m_text(text) { }
+
+ static QString getGlobalName(QString fingering = "");
+
+protected:
+ virtual void modifySegment();
+
+private:
+ EventSelection *m_selection;// only used on 1st execute (cf bruteForceRedo)
+ std::string m_text;
+};
+
+
+
+}
+
+#endif
diff --git a/src/commands/notation/AddIndicationCommand.cpp b/src/commands/notation/AddIndicationCommand.cpp
new file mode 100644
index 0000000..717463d
--- /dev/null
+++ b/src/commands/notation/AddIndicationCommand.cpp
@@ -0,0 +1,171 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "AddIndicationCommand.h"
+
+#include <klocale.h>
+#include "misc/Strings.h"
+#include "base/Event.h"
+#include "base/NotationTypes.h"
+#include "base/Segment.h"
+#include "base/SegmentNotationHelper.h"
+#include "base/Selection.h"
+#include "document/BasicCommand.h"
+#include "gui/editors/notation/NotationProperties.h"
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+AddIndicationCommand::AddIndicationCommand(std::string indicationType,
+ EventSelection &selection) :
+ BasicCommand(getGlobalName(indicationType),
+ selection.getSegment(),
+ selection.getStartTime(),
+ selection.getEndTime()),
+ m_indicationType(indicationType),
+ m_indicationDuration(selection.getEndTime() - selection.getStartTime()),
+ m_lastInsertedEvent(0)
+{
+ // nothing else
+}
+
+AddIndicationCommand::~AddIndicationCommand()
+{
+ // empty
+}
+
+bool
+AddIndicationCommand::canExecute()
+{
+ Segment &s(getSegment());
+
+ for (Segment::iterator i = s.begin(); s.isBeforeEndMarker(i); ++i) {
+
+ if ((*i)->getAbsoluteTime() >= getStartTime() + m_indicationDuration) {
+ return true;
+ }
+
+ if ((*i)->isa(Indication::EventType)) {
+
+ try {
+ Indication indication(**i);
+
+ if ((*i)->getAbsoluteTime() + indication.getIndicationDuration() <=
+ getStartTime())
+ continue;
+
+ std::string type = indication.getIndicationType();
+
+ if (type == m_indicationType) {
+ // for all indications (including slur), we reject an
+ // exact overlap
+ if ((*i)->getAbsoluteTime() == getStartTime() &&
+ indication.getIndicationDuration() == m_indicationDuration) {
+ return false;
+ }
+ } else if (m_indicationType == Indication::Slur) {
+ continue;
+ }
+
+ // for non-slur indications we reject a partial
+ // overlap such as this one, if it's an overlap with
+ // an indication of the same "sort"
+
+ if (m_indicationType == Indication::Crescendo ||
+ m_indicationType == Indication::Decrescendo) {
+ if (type == Indication::Crescendo ||
+ type == Indication::Decrescendo)
+ return false;
+ }
+
+ if (m_indicationType == Indication::QuindicesimaUp ||
+ m_indicationType == Indication::OttavaUp ||
+ m_indicationType == Indication::OttavaDown ||
+ m_indicationType == Indication::QuindicesimaDown) {
+ if (indication.isOttavaType())
+ return false;
+ }
+ } catch (...) {}
+ }
+ }
+
+ return true;
+}
+
+void
+AddIndicationCommand::modifySegment()
+{
+ SegmentNotationHelper helper(getSegment());
+
+ Indication indication(m_indicationType, m_indicationDuration);
+ Event *e = indication.getAsEvent(getStartTime());
+ helper.segment().insert(e);
+ m_lastInsertedEvent = e;
+
+ if (indication.isOttavaType()) {
+ for (Segment::iterator i = getSegment().findTime(getStartTime());
+ i != getSegment().findTime(getStartTime() + m_indicationDuration);
+ ++i) {
+ if ((*i)->isa(Note::EventType)) {
+ (*i)->setMaybe<Int>(NotationProperties::OTTAVA_SHIFT,
+ indication.getOttavaShift());
+ }
+ }
+ }
+}
+
+QString
+AddIndicationCommand::getGlobalName(std::string indicationType)
+{
+ if (indicationType == Indication::Slur) {
+ return i18n("Add S&lur");
+ } else if (indicationType == Indication::PhrasingSlur) {
+ return i18n("Add &Phrasing Slur");
+ } else if (indicationType == Indication::QuindicesimaUp) {
+ return i18n("Add Double-Octave Up");
+ } else if (indicationType == Indication::OttavaUp) {
+ return i18n("Add Octave &Up");
+ } else if (indicationType == Indication::OttavaDown) {
+ return i18n("Add Octave &Down");
+ } else if (indicationType == Indication::QuindicesimaDown) {
+ return i18n("Add Double Octave Down");
+
+ // We used to generate these ones from the internal names plus
+ // caps, but that makes them untranslateable:
+ } else if (indicationType == Indication::Crescendo) {
+ return i18n("Add &Crescendo");
+ } else if (indicationType == Indication::Decrescendo) {
+ return i18n("Add &Decrescendo");
+ } else if (indicationType == Indication::Glissando) {
+ return i18n("Add &Glissando");
+ }
+
+ QString n = i18n("Add &%1%2").arg((char)toupper(indicationType[0])).arg(strtoqstr(indicationType.substr(1)));
+ return n;
+}
+
+}
diff --git a/src/commands/notation/AddIndicationCommand.h b/src/commands/notation/AddIndicationCommand.h
new file mode 100644
index 0000000..c43dc3a
--- /dev/null
+++ b/src/commands/notation/AddIndicationCommand.h
@@ -0,0 +1,76 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_NOTESMENUADDINDICATIONCOMMAND_H_
+#define _RG_NOTESMENUADDINDICATIONCOMMAND_H_
+
+#include "document/BasicCommand.h"
+#include <string>
+#include <qstring.h>
+#include "base/Event.h"
+
+
+
+
+namespace Rosegarden
+{
+
+class EventSelection;
+class Event;
+
+
+class AddIndicationCommand : public BasicCommand
+{
+public:
+ AddIndicationCommand(std::string indicationType,
+ EventSelection &selection);
+ virtual ~AddIndicationCommand();
+
+ // tests whether the indication can be added without overlapping
+ // another one of the same type
+ bool canExecute();
+
+ Event *getLastInsertedEvent() {
+ return m_lastInsertedEvent;
+ }
+ virtual timeT getRelayoutEndTime() {
+ return getStartTime() + m_indicationDuration;
+ }
+
+ static QString getGlobalName(std::string indicationType);
+
+protected:
+ virtual void modifySegment();
+
+ std::string m_indicationType;
+ timeT m_indicationDuration;
+ Event *m_lastInsertedEvent;
+};
+
+
+
+}
+
+#endif
diff --git a/src/commands/notation/AddMarkCommand.cpp b/src/commands/notation/AddMarkCommand.cpp
new file mode 100644
index 0000000..5b30431
--- /dev/null
+++ b/src/commands/notation/AddMarkCommand.cpp
@@ -0,0 +1,112 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "AddMarkCommand.h"
+
+#include <klocale.h>
+#include "misc/Strings.h"
+#include "base/Selection.h"
+#include "document/BasicSelectionCommand.h"
+#include "base/BaseProperties.h"
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+using namespace BaseProperties;
+
+QString
+AddMarkCommand::getGlobalName(Mark markType)
+{
+ QString m = strtoqstr(markType);
+
+ // Gosh, lots of collisions
+ if (markType == Marks::Sforzando)
+ m = i18n("S&forzando");
+ else if (markType == Marks::Staccato)
+ m = i18n("Sta&ccato");
+ else if (markType == Marks::Rinforzando)
+ m = i18n("R&inforzando");
+ else if (markType == Marks::Tenuto)
+ m = i18n("T&enuto");
+ else if (markType == Marks::Trill)
+ m = i18n("Tri&ll");
+ else if (markType == Marks::LongTrill)
+ m = i18n("Trill &with Line");
+ else if (markType == Marks::TrillLine)
+ m = i18n("Trill Line");
+ else if (markType == Marks::Turn)
+ m = i18n("&Turn");
+ else if (markType == Marks::Accent)
+ m = i18n("&Accent");
+ else if (markType == Marks::Staccatissimo)
+ m = i18n("&Staccatissimo");
+ else if (markType == Marks::Marcato)
+ m = i18n("&Marcato");
+ else if (markType == Marks::Pause)
+ m = i18n("&Pause");
+ else if (markType == Marks::UpBow)
+ m = i18n("&Up-Bow");
+ else if (markType == Marks::DownBow)
+ m = i18n("&Down-Bow");
+ else if (markType == Marks::Mordent)
+ m = i18n("Mo&rdent");
+ else if (markType == Marks::MordentInverted)
+ m = i18n("Inverted Mordent");
+ else if (markType == Marks::MordentLong)
+ m = i18n("Long Mordent");
+ else if (markType == Marks::MordentLongInverted)
+ m = i18n("Lon&g Inverted Mordent");
+ else
+ m = i18n("&%1%2").arg(m[0].upper()).arg(m.right(m.length() - 1));
+ // FIXME: That last i18n has very little chance of working, unless
+ // by some miracle the exact same string was translated elsewhere already
+ // but we'll leave it as a warning
+
+ m = i18n("Add %1").arg(m);
+ return m;
+}
+
+void
+AddMarkCommand::modifySegment()
+{
+ EventSelection::eventcontainer::iterator i;
+
+ for (i = m_selection->getSegmentEvents().begin();
+ i != m_selection->getSegmentEvents().end(); ++i) {
+
+ long n = 0;
+ (*i)->get
+ <Int>(MARK_COUNT, n);
+ (*i)->set
+ <Int>(MARK_COUNT, n + 1);
+ (*i)->set
+ <String>(getMarkPropertyName(n),
+ m_mark);
+ }
+}
+
+}
diff --git a/src/commands/notation/AddMarkCommand.h b/src/commands/notation/AddMarkCommand.h
new file mode 100644
index 0000000..5bc36b4
--- /dev/null
+++ b/src/commands/notation/AddMarkCommand.h
@@ -0,0 +1,63 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_NOTESMENUADDMARKCOMMAND_H_
+#define _RG_NOTESMENUADDMARKCOMMAND_H_
+
+#include "document/BasicSelectionCommand.h"
+#include <qstring.h>
+
+
+
+
+namespace Rosegarden
+{
+
+class EventSelection;
+
+
+class AddMarkCommand : public BasicSelectionCommand
+{
+public:
+ AddMarkCommand(Mark mark,
+ EventSelection &selection) :
+ BasicSelectionCommand(getGlobalName(mark), selection, true),
+ m_selection(&selection), m_mark(mark) { }
+
+ static QString getGlobalName(Mark mark);
+
+protected:
+ virtual void modifySegment();
+
+private:
+ EventSelection *m_selection;// only used on 1st execute (cf bruteForceRedo)
+ Mark m_mark;
+};
+
+
+
+}
+
+#endif
diff --git a/src/commands/notation/AddSlashesCommand.cpp b/src/commands/notation/AddSlashesCommand.cpp
new file mode 100644
index 0000000..1e2e5a6
--- /dev/null
+++ b/src/commands/notation/AddSlashesCommand.cpp
@@ -0,0 +1,53 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "AddSlashesCommand.h"
+
+#include "base/Selection.h"
+#include "document/BasicSelectionCommand.h"
+#include "gui/editors/notation/NotationProperties.h"
+
+
+namespace Rosegarden
+{
+
+void
+AddSlashesCommand::modifySegment()
+{
+ EventSelection::eventcontainer::iterator i;
+
+ for (i = m_selection->getSegmentEvents().begin();
+ i != m_selection->getSegmentEvents().end(); ++i) {
+
+ if (m_number < 1) {
+ (*i)->unset(NotationProperties::SLASHES);
+ } else {
+ (*i)->set
+ <Int>(NotationProperties::SLASHES, m_number);
+ }
+ }
+}
+
+}
diff --git a/src/commands/notation/AddSlashesCommand.h b/src/commands/notation/AddSlashesCommand.h
new file mode 100644
index 0000000..4c85cd4
--- /dev/null
+++ b/src/commands/notation/AddSlashesCommand.h
@@ -0,0 +1,60 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_NOTESMENUADDSLASHESCOMMAND_H_
+#define _RG_NOTESMENUADDSLASHESCOMMAND_H_
+
+#include "document/BasicSelectionCommand.h"
+#include <klocale.h>
+
+
+
+
+namespace Rosegarden
+{
+
+class EventSelection;
+
+
+class AddSlashesCommand : public BasicSelectionCommand
+{
+public:
+ AddSlashesCommand(int number,
+ EventSelection &selection) :
+ BasicSelectionCommand(i18n("Slashes"), selection, true),
+ m_selection(&selection), m_number(number) { }
+
+protected:
+ virtual void modifySegment();
+
+private:
+ EventSelection *m_selection;// only used on 1st execute (cf bruteForceRedo)
+ int m_number;
+};
+
+
+}
+
+#endif
diff --git a/src/commands/notation/AddTextMarkCommand.cpp b/src/commands/notation/AddTextMarkCommand.cpp
new file mode 100644
index 0000000..d3de487
--- /dev/null
+++ b/src/commands/notation/AddTextMarkCommand.cpp
@@ -0,0 +1,58 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "AddTextMarkCommand.h"
+
+#include "base/Selection.h"
+#include "document/BasicSelectionCommand.h"
+#include "base/BaseProperties.h"
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+using namespace BaseProperties;
+
+void
+AddTextMarkCommand::modifySegment()
+{
+ EventSelection::eventcontainer::iterator i;
+
+ for (i = m_selection->getSegmentEvents().begin();
+ i != m_selection->getSegmentEvents().end(); ++i) {
+
+ long n = 0;
+ (*i)->get
+ <Int>(MARK_COUNT, n);
+ (*i)->set
+ <Int>(MARK_COUNT, n + 1);
+ (*i)->set
+ <String>(getMarkPropertyName(n),
+ Marks::getTextMark(m_text));
+ }
+}
+
+}
diff --git a/src/commands/notation/AddTextMarkCommand.h b/src/commands/notation/AddTextMarkCommand.h
new file mode 100644
index 0000000..b4037cc
--- /dev/null
+++ b/src/commands/notation/AddTextMarkCommand.h
@@ -0,0 +1,65 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_NOTESMENUADDTEXTMARKCOMMAND_H_
+#define _RG_NOTESMENUADDTEXTMARKCOMMAND_H_
+
+#include "document/BasicSelectionCommand.h"
+#include <string>
+#include <qstring.h>
+#include <klocale.h>
+
+
+
+
+namespace Rosegarden
+{
+
+class EventSelection;
+
+
+class AddTextMarkCommand : public BasicSelectionCommand
+{
+public:
+ AddTextMarkCommand(std::string text,
+ EventSelection &selection) :
+ BasicSelectionCommand(getGlobalName(), selection, true),
+ m_selection(&selection), m_text(text) { }
+
+ static QString getGlobalName() { return i18n("Add Te&xt Mark..."); }
+
+protected:
+ virtual void modifySegment();
+
+private:
+ EventSelection *m_selection;// only used on 1st execute (cf bruteForceRedo)
+ std::string m_text;
+};
+
+
+
+}
+
+#endif
diff --git a/src/commands/notation/AutoBeamCommand.cpp b/src/commands/notation/AutoBeamCommand.cpp
new file mode 100644
index 0000000..04c243d
--- /dev/null
+++ b/src/commands/notation/AutoBeamCommand.cpp
@@ -0,0 +1,48 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "AutoBeamCommand.h"
+
+#include "base/Segment.h"
+#include "base/SegmentNotationHelper.h"
+#include "base/Selection.h"
+#include "document/BasicSelectionCommand.h"
+#include "base/BaseProperties.h"
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+using namespace BaseProperties;
+
+void
+AutoBeamCommand::modifySegment()
+{
+ SegmentNotationHelper helper(getSegment());
+ helper.autoBeam(getStartTime(), getEndTime(), GROUP_TYPE_BEAMED);
+}
+
+}
diff --git a/src/commands/notation/AutoBeamCommand.h b/src/commands/notation/AutoBeamCommand.h
new file mode 100644
index 0000000..b26caf1
--- /dev/null
+++ b/src/commands/notation/AutoBeamCommand.h
@@ -0,0 +1,62 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_NOTESMENUAUTOBEAMCOMMAND_H_
+#define _RG_NOTESMENUAUTOBEAMCOMMAND_H_
+
+#include "document/BasicSelectionCommand.h"
+#include <qstring.h>
+#include <klocale.h>
+
+
+
+
+namespace Rosegarden
+{
+
+class Segment;
+class EventSelection;
+
+
+class AutoBeamCommand : public BasicSelectionCommand
+{
+public:
+ AutoBeamCommand(EventSelection &selection) :
+ BasicSelectionCommand(getGlobalName(), selection) { }
+
+ AutoBeamCommand(Segment &segment) :
+ BasicSelectionCommand(getGlobalName(), segment) { }
+
+ static QString getGlobalName() { return i18n("&Auto-Beam"); }
+
+protected:
+ virtual void modifySegment();
+};
+
+
+
+}
+
+#endif
diff --git a/src/commands/notation/BeamCommand.cpp b/src/commands/notation/BeamCommand.cpp
new file mode 100644
index 0000000..fb75dcb
--- /dev/null
+++ b/src/commands/notation/BeamCommand.cpp
@@ -0,0 +1,58 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "BeamCommand.h"
+
+#include "base/NotationTypes.h"
+#include "base/Selection.h"
+#include "document/BasicSelectionCommand.h"
+#include "base/BaseProperties.h"
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+using namespace BaseProperties;
+
+void
+BeamCommand::modifySegment()
+{
+ int id = getSegment().getNextId();
+
+ for (EventSelection::eventcontainer::iterator i =
+ m_selection->getSegmentEvents().begin();
+ i != m_selection->getSegmentEvents().end(); ++i) {
+
+ if ((*i)->isa(Note::EventType)) {
+ (*i)->set
+ <Int>(BEAMED_GROUP_ID, id);
+ (*i)->set
+ <String>(BEAMED_GROUP_TYPE, GROUP_TYPE_BEAMED);
+ }
+ }
+}
+
+}
diff --git a/src/commands/notation/BeamCommand.h b/src/commands/notation/BeamCommand.h
new file mode 100644
index 0000000..9fd112b
--- /dev/null
+++ b/src/commands/notation/BeamCommand.h
@@ -0,0 +1,60 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_NOTESMENUBEAMCOMMAND_H_
+#define _RG_NOTESMENUBEAMCOMMAND_H_
+
+#include "document/BasicSelectionCommand.h"
+#include <qstring.h>
+#include <klocale.h>
+
+
+
+
+namespace Rosegarden
+{
+
+class EventSelection;
+
+
+class BeamCommand : public BasicSelectionCommand
+{
+public:
+ BeamCommand(EventSelection &selection) :
+ BasicSelectionCommand(getGlobalName(), selection, true),
+ m_selection(&selection) { }
+
+ static QString getGlobalName() { return i18n("&Beam Group"); }
+
+protected:
+ virtual void modifySegment();
+ EventSelection *m_selection;// only used on 1st execute (cf bruteForceRedo)
+};
+
+
+
+}
+
+#endif
diff --git a/src/commands/notation/BreakCommand.cpp b/src/commands/notation/BreakCommand.cpp
new file mode 100644
index 0000000..ae74e37
--- /dev/null
+++ b/src/commands/notation/BreakCommand.cpp
@@ -0,0 +1,54 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "BreakCommand.h"
+
+#include "base/Selection.h"
+#include "document/BasicSelectionCommand.h"
+#include "gui/editors/notation/NotationProperties.h"
+#include "base/BaseProperties.h"
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+using namespace BaseProperties;
+
+void
+BreakCommand::modifySegment()
+{
+ for (EventSelection::eventcontainer::iterator i =
+ m_selection->getSegmentEvents().begin();
+ i != m_selection->getSegmentEvents().end(); ++i) {
+
+ (*i)->unset(NotationProperties::BEAMED);
+ (*i)->unset(BEAMED_GROUP_ID);
+ (*i)->unset(BEAMED_GROUP_TYPE);
+ (*i)->clearNonPersistentProperties();
+ }
+}
+
+}
diff --git a/src/commands/notation/BreakCommand.h b/src/commands/notation/BreakCommand.h
new file mode 100644
index 0000000..5c95a33
--- /dev/null
+++ b/src/commands/notation/BreakCommand.h
@@ -0,0 +1,60 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_NOTESMENUBREAKCOMMAND_H_
+#define _RG_NOTESMENUBREAKCOMMAND_H_
+
+#include "document/BasicSelectionCommand.h"
+#include <qstring.h>
+#include <klocale.h>
+
+
+
+
+namespace Rosegarden
+{
+
+class EventSelection;
+
+
+class BreakCommand : public BasicSelectionCommand
+{
+public:
+ BreakCommand(EventSelection &selection) :
+ BasicSelectionCommand(getGlobalName(), selection, true),
+ m_selection(&selection) { }
+
+ static QString getGlobalName() { return i18n("&Unbeam"); }
+
+protected:
+ virtual void modifySegment();
+ EventSelection *m_selection;// only used on 1st execute (cf bruteForceRedo)
+};
+
+
+
+}
+
+#endif
diff --git a/src/commands/notation/ChangeSlurPositionCommand.cpp b/src/commands/notation/ChangeSlurPositionCommand.cpp
new file mode 100644
index 0000000..dc2ff0b
--- /dev/null
+++ b/src/commands/notation/ChangeSlurPositionCommand.cpp
@@ -0,0 +1,58 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "ChangeSlurPositionCommand.h"
+
+#include "base/NotationTypes.h"
+#include "base/Selection.h"
+#include "document/BasicSelectionCommand.h"
+#include "gui/editors/notation/NotationProperties.h"
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+void
+ChangeSlurPositionCommand::modifySegment()
+{
+ EventSelection::eventcontainer::iterator i;
+
+ for (i = m_selection->getSegmentEvents().begin();
+ i != m_selection->getSegmentEvents().end(); ++i) {
+
+ if ((*i)->isa(Indication::EventType)) {
+ std::string indicationType;
+ if ((*i)->get<String>
+ (Indication::IndicationTypePropertyName, indicationType)
+ && (indicationType == Indication::Slur ||
+ indicationType == Indication::PhrasingSlur)) {
+ (*i)->set<Bool>(NotationProperties::SLUR_ABOVE, m_above);
+ }
+ }
+ }
+}
+
+}
diff --git a/src/commands/notation/ChangeSlurPositionCommand.h b/src/commands/notation/ChangeSlurPositionCommand.h
new file mode 100644
index 0000000..11c4bce
--- /dev/null
+++ b/src/commands/notation/ChangeSlurPositionCommand.h
@@ -0,0 +1,66 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_ADJUSTMENUCHANGESLURPOSITIONCOMMAND_H_
+#define _RG_ADJUSTMENUCHANGESLURPOSITIONCOMMAND_H_
+
+#include "document/BasicSelectionCommand.h"
+#include <qstring.h>
+#include <klocale.h>
+
+
+class Slur;
+
+
+namespace Rosegarden
+{
+
+class EventSelection;
+
+
+class ChangeSlurPositionCommand : public BasicSelectionCommand
+{
+public:
+ ChangeSlurPositionCommand(bool above, EventSelection &selection) :
+ BasicSelectionCommand(getGlobalName(above), selection, true),
+ m_selection(&selection), m_above(above) { }
+
+ static QString getGlobalName(bool above) {
+ return above ? i18n("Slur &Above") : i18n("Slur &Below");
+ }
+
+protected:
+ virtual void modifySegment();
+
+private:
+ EventSelection *m_selection;// only used on 1st execute (cf bruteForceRedo)
+ bool m_above;
+};
+
+
+
+}
+
+#endif
diff --git a/src/commands/notation/ChangeStemsCommand.cpp b/src/commands/notation/ChangeStemsCommand.cpp
new file mode 100644
index 0000000..413f9d2
--- /dev/null
+++ b/src/commands/notation/ChangeStemsCommand.cpp
@@ -0,0 +1,53 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "ChangeStemsCommand.h"
+
+#include "base/NotationTypes.h"
+#include "base/Selection.h"
+#include "document/BasicSelectionCommand.h"
+#include "gui/editors/notation/NotationProperties.h"
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+void
+ChangeStemsCommand::modifySegment()
+{
+ EventSelection::eventcontainer::iterator i;
+
+ for (i = m_selection->getSegmentEvents().begin();
+ i != m_selection->getSegmentEvents().end(); ++i) {
+
+ if ((*i)->isa(Note::EventType)) {
+ (*i)->set
+ <Bool>(NotationProperties::STEM_UP, m_up);
+ }
+ }
+}
+
+}
diff --git a/src/commands/notation/ChangeStemsCommand.h b/src/commands/notation/ChangeStemsCommand.h
new file mode 100644
index 0000000..40b48bf
--- /dev/null
+++ b/src/commands/notation/ChangeStemsCommand.h
@@ -0,0 +1,66 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_ADJUSTMENUCHANGESTEMSCOMMAND_H_
+#define _RG_ADJUSTMENUCHANGESTEMSCOMMAND_H_
+
+#include "document/BasicSelectionCommand.h"
+#include <qstring.h>
+#include <klocale.h>
+
+
+class Stems;
+
+
+namespace Rosegarden
+{
+
+class EventSelection;
+
+
+class ChangeStemsCommand : public BasicSelectionCommand
+{
+public:
+ ChangeStemsCommand(bool up, EventSelection &selection) :
+ BasicSelectionCommand(getGlobalName(up), selection, true),
+ m_selection(&selection), m_up(up) { }
+
+ static QString getGlobalName(bool up) {
+ return up ? i18n("Stems &Up") : i18n("Stems &Down");
+ }
+
+protected:
+ virtual void modifySegment();
+
+private:
+ EventSelection *m_selection;// only used on 1st execute (cf bruteForceRedo)
+ bool m_up;
+};
+
+
+
+}
+
+#endif
diff --git a/src/commands/notation/ChangeStyleCommand.cpp b/src/commands/notation/ChangeStyleCommand.cpp
new file mode 100644
index 0000000..f8d5c04
--- /dev/null
+++ b/src/commands/notation/ChangeStyleCommand.cpp
@@ -0,0 +1,66 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "ChangeStyleCommand.h"
+
+#include "misc/Strings.h"
+#include "base/NotationTypes.h"
+#include "base/Selection.h"
+#include "document/BasicSelectionCommand.h"
+#include "gui/editors/notation/NotationProperties.h"
+#include "gui/editors/notation/NoteStyleFactory.h"
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+QString
+ChangeStyleCommand::getGlobalName(NoteStyleName style)
+{
+ return strtoqstr(style);
+}
+
+void
+ChangeStyleCommand::modifySegment()
+{
+ EventSelection::eventcontainer::iterator i;
+
+ for (i = m_selection->getSegmentEvents().begin();
+ i != m_selection->getSegmentEvents().end(); ++i) {
+
+ if ((*i)->isa(Note::EventType)) {
+ if (m_style == NoteStyleFactory::DefaultStyle) {
+ (*i)->unset(NotationProperties::NOTE_STYLE);
+ } else {
+ (*i)->set
+ <String>
+ (NotationProperties::NOTE_STYLE, m_style);
+ }
+ }
+ }
+}
+
+}
diff --git a/src/commands/notation/ChangeStyleCommand.h b/src/commands/notation/ChangeStyleCommand.h
new file mode 100644
index 0000000..d5edbab
--- /dev/null
+++ b/src/commands/notation/ChangeStyleCommand.h
@@ -0,0 +1,70 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_ADJUSTMENUCHANGESTYLECOMMAND_H_
+#define _RG_ADJUSTMENUCHANGESTYLECOMMAND_H_
+
+#include "document/BasicSelectionCommand.h"
+#include "gui/editors/notation/NoteStyle.h"
+#include <qstring.h>
+#include <klocale.h>
+
+
+class Change;
+
+
+namespace Rosegarden
+{
+
+class EventSelection;
+
+
+class ChangeStyleCommand : public BasicSelectionCommand
+{
+public:
+ ChangeStyleCommand(NoteStyleName style,
+ EventSelection &selection) :
+ BasicSelectionCommand(getGlobalName(style), selection, true),
+ m_selection(&selection), m_style(style) { }
+
+ static QString getGlobalName() {
+ return i18n("Change &Note Style");
+ }
+
+ static QString getGlobalName(NoteStyleName style);
+
+protected:
+ virtual void modifySegment();
+
+private:
+ EventSelection *m_selection;// only used on 1st execute (cf bruteForceRedo)
+ NoteStyleName m_style;
+};
+
+
+
+}
+
+#endif
diff --git a/src/commands/notation/ChangeTiePositionCommand.cpp b/src/commands/notation/ChangeTiePositionCommand.cpp
new file mode 100644
index 0000000..42f67e6
--- /dev/null
+++ b/src/commands/notation/ChangeTiePositionCommand.cpp
@@ -0,0 +1,54 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "ChangeTiePositionCommand.h"
+
+#include "base/NotationTypes.h"
+#include "base/Selection.h"
+#include "base/BaseProperties.h"
+#include "document/BasicSelectionCommand.h"
+#include "gui/editors/notation/NotationProperties.h"
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+void
+ChangeTiePositionCommand::modifySegment()
+{
+ EventSelection::eventcontainer::iterator i;
+
+ for (i = m_selection->getSegmentEvents().begin();
+ i != m_selection->getSegmentEvents().end(); ++i) {
+
+ if ((*i)->has(BaseProperties::TIED_FORWARD) &&
+ (*i)->get<Bool>(BaseProperties::TIED_FORWARD)) {
+ (*i)->set<Bool>(BaseProperties::TIE_IS_ABOVE, m_above);
+ }
+ }
+}
+
+}
diff --git a/src/commands/notation/ChangeTiePositionCommand.h b/src/commands/notation/ChangeTiePositionCommand.h
new file mode 100644
index 0000000..c4c58a7
--- /dev/null
+++ b/src/commands/notation/ChangeTiePositionCommand.h
@@ -0,0 +1,62 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_ADJUSTMENUCHANGETIEPOSITIONCOMMAND_H_
+#define _RG_ADJUSTMENUCHANGETIEPOSITIONCOMMAND_H_
+
+#include "document/BasicSelectionCommand.h"
+#include <qstring.h>
+#include <klocale.h>
+
+
+namespace Rosegarden
+{
+
+class EventSelection;
+
+class ChangeTiePositionCommand : public BasicSelectionCommand
+{
+public:
+ ChangeTiePositionCommand(bool above, EventSelection &selection) :
+ BasicSelectionCommand(getGlobalName(above), selection, true),
+ m_selection(&selection), m_above(above) { }
+
+ static QString getGlobalName(bool above) {
+ return above ? i18n("Tie &Above") : i18n("Tie &Below");
+ }
+
+protected:
+ virtual void modifySegment();
+
+private:
+ EventSelection *m_selection;// only used on 1st execute (cf bruteForceRedo)
+ bool m_above;
+};
+
+
+
+}
+
+#endif
diff --git a/src/commands/notation/ClefInsertionCommand.cpp b/src/commands/notation/ClefInsertionCommand.cpp
new file mode 100644
index 0000000..f21c1b0
--- /dev/null
+++ b/src/commands/notation/ClefInsertionCommand.cpp
@@ -0,0 +1,137 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "ClefInsertionCommand.h"
+
+#include <klocale.h>
+#include "misc/Strings.h"
+#include "base/Event.h"
+#include "base/NotationTypes.h"
+#include "base/Segment.h"
+#include "base/SegmentNotationHelper.h"
+#include "base/BaseProperties.h"
+#include "document/BasicCommand.h"
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+using namespace BaseProperties;
+
+ClefInsertionCommand::ClefInsertionCommand(Segment &segment, timeT time,
+ Clef clef,
+ bool shouldChangeOctave,
+ bool shouldTranspose) :
+ BasicCommand(getGlobalName(&clef), segment, time,
+ ((shouldChangeOctave || shouldTranspose) ?
+ segment.getEndTime() : time + 1)),
+ m_clef(clef),
+ m_shouldChangeOctave(shouldChangeOctave),
+ m_shouldTranspose(shouldTranspose),
+ m_lastInsertedEvent(0)
+{
+ // nothing
+}
+
+ClefInsertionCommand::~ClefInsertionCommand()
+{
+ // nothing
+}
+
+QString
+ClefInsertionCommand::getGlobalName(Clef *)
+{
+ /* doesn't handle octave offset -- leave it for now
+ if (clef) {
+ QString name(strtoqstr(clef->getClefType()));
+ name = name.left(1).upper() + name.right(name.length()-1);
+ return i18n("Change to %1 Cle&f...").arg(name);
+ } else {
+ */
+ return i18n("Add Cle&f Change...");
+ /*
+ }
+ */
+}
+
+timeT
+ClefInsertionCommand::getRelayoutEndTime()
+{
+ // Inserting a clef can change the y-coord of every subsequent note
+ return getSegment().getEndTime();
+}
+
+void
+ClefInsertionCommand::modifySegment()
+{
+ SegmentNotationHelper helper(getSegment());
+ Clef oldClef(getSegment().getClefAtTime(getStartTime()));
+
+ Segment::iterator i = getSegment().findTime(getStartTime());
+ while (getSegment().isBeforeEndMarker(i)) {
+ if ((*i)->getAbsoluteTime() > getStartTime()) {
+ break;
+ }
+ if ((*i)->isa(Clef::EventType)) {
+ getSegment().erase(i);
+ break;
+ }
+ ++i;
+ }
+
+ i = helper.insertClef(getStartTime(), m_clef);
+ if (i != helper.segment().end())
+ m_lastInsertedEvent = *i;
+
+ if (m_clef != oldClef) {
+
+ int semitones = 0;
+
+ if (m_shouldChangeOctave) {
+ semitones += 12 * (m_clef.getOctave() - oldClef.getOctave());
+ }
+ if (m_shouldTranspose) {
+ semitones -= m_clef.getPitchOffset() - oldClef.getPitchOffset();
+ }
+
+ if (semitones != 0) {
+ while (i != helper.segment().end()) {
+ if ((*i)->isa(Note::EventType)) {
+ long pitch = 0;
+ if ((*i)->get
+ <Int>(PITCH, pitch)) {
+ pitch += semitones;
+ (*i)->set
+ <Int>(PITCH, pitch);
+ }
+ }
+ ++i;
+ }
+ }
+ }
+}
+
+}
diff --git a/src/commands/notation/ClefInsertionCommand.h b/src/commands/notation/ClefInsertionCommand.h
new file mode 100644
index 0000000..3e9b940
--- /dev/null
+++ b/src/commands/notation/ClefInsertionCommand.h
@@ -0,0 +1,72 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_CLEFINSERTIONCOMMAND_H_
+#define _RG_CLEFINSERTIONCOMMAND_H_
+
+#include "base/NotationTypes.h"
+#include "document/BasicCommand.h"
+#include <qstring.h>
+#include "base/Event.h"
+
+
+
+
+namespace Rosegarden
+{
+
+class Segment;
+class Event;
+
+
+class ClefInsertionCommand : public BasicCommand
+{
+public:
+ ClefInsertionCommand(Segment &segment,
+ timeT time,
+ Clef clef,
+ bool shouldChangeOctave = false,
+ bool shouldTranspose = false);
+ virtual ~ClefInsertionCommand();
+
+ static QString getGlobalName(Clef *clef = 0);
+ virtual timeT getRelayoutEndTime();
+
+ Event *getLastInsertedEvent() { return m_lastInsertedEvent; }
+
+protected:
+ virtual void modifySegment();
+
+ Clef m_clef;
+ bool m_shouldChangeOctave;
+ bool m_shouldTranspose;
+
+ Event *m_lastInsertedEvent;
+};
+
+
+}
+
+#endif
diff --git a/src/commands/notation/CollapseRestsCommand.cpp b/src/commands/notation/CollapseRestsCommand.cpp
new file mode 100644
index 0000000..655b3b6
--- /dev/null
+++ b/src/commands/notation/CollapseRestsCommand.cpp
@@ -0,0 +1,54 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "CollapseRestsCommand.h"
+
+#include "base/Segment.h"
+#include "base/SegmentNotationHelper.h"
+#include "base/Selection.h"
+#include "document/BasicCommand.h"
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+CollapseRestsCommand::CollapseRestsCommand
+(EventSelection &selection) :
+ BasicCommand(getGlobalName(),
+ selection.getSegment(),
+ selection.getStartTime(),
+ selection.getEndTime())
+{
+ // nothing else
+}
+
+void CollapseRestsCommand::modifySegment()
+{
+ SegmentNotationHelper helper(getSegment());
+ helper.collapseRestsAggressively(getStartTime(), getEndTime());
+}
+
+}
diff --git a/src/commands/notation/CollapseRestsCommand.h b/src/commands/notation/CollapseRestsCommand.h
new file mode 100644
index 0000000..337fe04
--- /dev/null
+++ b/src/commands/notation/CollapseRestsCommand.h
@@ -0,0 +1,63 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_ADJUSTMENUCOLLAPSERESTSCOMMAND_H_
+#define _RG_ADJUSTMENUCOLLAPSERESTSCOMMAND_H_
+
+#include "document/BasicCommand.h"
+#include <qstring.h>
+#include "base/Event.h"
+#include <klocale.h>
+
+
+
+
+namespace Rosegarden
+{
+
+class Segment;
+class EventSelection;
+
+
+class CollapseRestsCommand : public BasicCommand
+{
+public:
+ CollapseRestsCommand(Segment &s,
+ timeT startTime,
+ timeT endTime) :
+ BasicCommand(getGlobalName(), s, startTime, endTime) { }
+
+ CollapseRestsCommand(EventSelection &selection);
+
+ static QString getGlobalName() { return i18n("&Collapse Rests"); }
+
+protected:
+ virtual void modifySegment();
+};
+
+
+}
+
+#endif
diff --git a/src/commands/notation/DeCounterpointCommand.cpp b/src/commands/notation/DeCounterpointCommand.cpp
new file mode 100644
index 0000000..1f97476
--- /dev/null
+++ b/src/commands/notation/DeCounterpointCommand.cpp
@@ -0,0 +1,57 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "DeCounterpointCommand.h"
+
+#include "base/Segment.h"
+#include "base/SegmentNotationHelper.h"
+#include "base/Selection.h"
+#include "document/BasicSelectionCommand.h"
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+void
+DeCounterpointCommand::modifySegment()
+{
+ Segment &segment(getSegment());
+ SegmentNotationHelper helper(segment);
+
+ if (m_selection) {
+ EventSelection::RangeTimeList ranges(m_selection->getRangeTimes());
+ for (EventSelection::RangeTimeList::iterator i = ranges.begin();
+ i != ranges.end(); ++i) {
+ helper.deCounterpoint(i->first, i->second);
+ segment.normalizeRests(i->first, i->second);
+ }
+ } else {
+ helper.deCounterpoint(getStartTime(), getEndTime());
+ segment.normalizeRests(getStartTime(), getEndTime());
+ }
+}
+
+}
diff --git a/src/commands/notation/DeCounterpointCommand.h b/src/commands/notation/DeCounterpointCommand.h
new file mode 100644
index 0000000..e0cda37
--- /dev/null
+++ b/src/commands/notation/DeCounterpointCommand.h
@@ -0,0 +1,68 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_ADJUSTMENUDECOUNTERPOINTCOMMAND_H_
+#define _RG_ADJUSTMENUDECOUNTERPOINTCOMMAND_H_
+
+#include "document/BasicSelectionCommand.h"
+#include <qstring.h>
+#include <klocale.h>
+
+
+class Overlapping;
+
+
+namespace Rosegarden
+{
+
+class Segment;
+class EventSelection;
+
+
+class DeCounterpointCommand : public BasicSelectionCommand
+{
+public:
+ DeCounterpointCommand(EventSelection &selection) :
+ BasicSelectionCommand(getGlobalName(), selection, true),
+ m_selection(&selection) { }
+
+ DeCounterpointCommand(Segment &segment) :
+ BasicSelectionCommand(getGlobalName(), segment, true),
+ m_selection(0) { }
+
+ static QString getGlobalName() { return i18n("Split-and-Tie Overlapping &Chords"); }
+
+protected:
+ virtual void modifySegment();
+
+private:
+ EventSelection *m_selection;// only used on 1st execute (cf bruteForceRedo)
+};
+
+
+
+}
+
+#endif
diff --git a/src/commands/notation/EraseEventCommand.cpp b/src/commands/notation/EraseEventCommand.cpp
new file mode 100644
index 0000000..e599079
--- /dev/null
+++ b/src/commands/notation/EraseEventCommand.cpp
@@ -0,0 +1,105 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "EraseEventCommand.h"
+
+#include "misc/Strings.h"
+#include "base/Event.h"
+#include "base/NotationTypes.h"
+#include "base/Segment.h"
+#include "base/SegmentNotationHelper.h"
+#include "document/BasicCommand.h"
+#include "gui/editors/notation/NotationProperties.h"
+
+
+namespace Rosegarden
+{
+
+EraseEventCommand::EraseEventCommand(Segment &segment,
+ Event *event,
+ bool collapseRest) :
+ BasicCommand(strtoqstr(makeName(event->getType())),
+ segment,
+ event->getAbsoluteTime(),
+ event->getAbsoluteTime() + event->getDuration(),
+ true),
+ m_collapseRest(collapseRest),
+ m_event(event),
+ m_relayoutEndTime(getEndTime())
+{
+ // nothing
+}
+
+EraseEventCommand::~EraseEventCommand()
+{
+ // nothing
+}
+
+std::string
+EraseEventCommand::makeName(std::string e)
+{
+ std::string n = "Erase ";
+ n += (char)toupper(e[0]);
+ n += e.substr(1);
+ return n;
+}
+
+timeT
+EraseEventCommand::getRelayoutEndTime()
+{
+ return m_relayoutEndTime;
+}
+
+void
+EraseEventCommand::modifySegment()
+{
+ SegmentNotationHelper helper(getSegment());
+
+ if (m_event->isa(Clef::EventType) ||
+ m_event->isa(Key ::EventType)) {
+
+ m_relayoutEndTime = helper.segment().getEndTime();
+
+ } else if (m_event->isa(Indication::EventType)) {
+
+ try {
+ Indication indication(*m_event);
+ if (indication.isOttavaType()) {
+
+ for (Segment::iterator i = getSegment().findTime
+ (m_event->getAbsoluteTime());
+ i != getSegment().findTime
+ (m_event->getAbsoluteTime() + indication.getIndicationDuration());
+ ++i) {
+ (*i)->unset(NotationProperties::OTTAVA_SHIFT);
+ }
+ }
+ } catch (...) {}
+ }
+
+ helper.deleteEvent(m_event, m_collapseRest);
+}
+
+}
diff --git a/src/commands/notation/EraseEventCommand.h b/src/commands/notation/EraseEventCommand.h
new file mode 100644
index 0000000..07043fa
--- /dev/null
+++ b/src/commands/notation/EraseEventCommand.h
@@ -0,0 +1,71 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_ERASEEVENTCOMMAND_H_
+#define _RG_ERASEEVENTCOMMAND_H_
+
+#include "document/BasicCommand.h"
+#include <string>
+#include "base/Event.h"
+
+
+
+
+namespace Rosegarden
+{
+
+class Segment;
+class Event;
+
+
+class EraseEventCommand : public BasicCommand
+{
+public:
+ EraseEventCommand(Segment &segment,
+ Event *event,
+ bool collapseRest);
+ virtual ~EraseEventCommand();
+
+ virtual timeT getRelayoutEndTime();
+
+protected:
+ virtual void modifySegment();
+
+ bool m_collapseRest;
+
+ Event *m_event; // only used on 1st execute (cf bruteForceRedo)
+ timeT m_relayoutEndTime;
+ std::string makeName(std::string);
+};
+
+
+
+// Group menu commands
+
+
+
+}
+
+#endif
diff --git a/src/commands/notation/FixNotationQuantizeCommand.cpp b/src/commands/notation/FixNotationQuantizeCommand.cpp
new file mode 100644
index 0000000..014d610
--- /dev/null
+++ b/src/commands/notation/FixNotationQuantizeCommand.cpp
@@ -0,0 +1,87 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "FixNotationQuantizeCommand.h"
+
+#include "base/Event.h"
+#include "base/Quantizer.h"
+#include "base/Segment.h"
+#include "base/Selection.h"
+#include "document/BasicSelectionCommand.h"
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+void
+FixNotationQuantizeCommand::modifySegment()
+{
+ std::vector<Event *> toErase;
+ std::vector<Event *> toInsert;
+ Segment &segment(m_selection->getSegment());
+
+ EventSelection::eventcontainer::iterator i;
+
+ //!!! the Quantizer needs a fixQuantizedValues(EventSelection*)
+ //method, but it hasn't got one yet so for the moment we're doing
+ //this by hand.
+
+ for (i = m_selection->getSegmentEvents().begin();
+ i != m_selection->getSegmentEvents().end(); ++i) {
+
+ timeT ut = (*i)->getAbsoluteTime();
+ timeT ud = (*i)->getDuration();
+ timeT qt = (*i)->getNotationAbsoluteTime();
+ timeT qd = (*i)->getNotationDuration();
+
+ if ((ut != qt) || (ud != qd)) {
+ toErase.push_back(*i);
+ toInsert.push_back(new Event(**i, qt, qd));
+ }
+ }
+
+ for (unsigned int j = 0; j < toErase.size(); ++j) {
+ Segment::iterator jtr(segment.findSingle(toErase[j]));
+ if (jtr != segment.end())
+ segment.erase(jtr);
+ }
+
+ for (unsigned int j = 0; j < toInsert.size(); ++j) {
+ segment.insert(toInsert[j]);
+ }
+
+ /*!!!
+ Segment *segment(&m_selection->getSegment());
+ m_quantizer->fixQuantizedValues
+ (segment,
+ segment->findTime(m_selection->getStartTime()),
+ segment->findTime(m_selection->getEndTime()));
+ */
+
+ //!!! normalizeRests?
+}
+
+}
diff --git a/src/commands/notation/FixNotationQuantizeCommand.h b/src/commands/notation/FixNotationQuantizeCommand.h
new file mode 100644
index 0000000..dfce3e9
--- /dev/null
+++ b/src/commands/notation/FixNotationQuantizeCommand.h
@@ -0,0 +1,61 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_ADJUSTMENUFIXNOTATIONQUANTIZECOMMAND_H_
+#define _RG_ADJUSTMENUFIXNOTATIONQUANTIZECOMMAND_H_
+
+#include "document/BasicSelectionCommand.h"
+#include <qstring.h>
+#include <klocale.h>
+
+
+
+
+namespace Rosegarden
+{
+
+class EventSelection;
+
+
+class FixNotationQuantizeCommand : public BasicSelectionCommand
+{
+public:
+ FixNotationQuantizeCommand(EventSelection &selection) :
+ BasicSelectionCommand(getGlobalName(), selection, true),
+ m_selection(&selection) { }
+
+ static QString getGlobalName() { return i18n("Fi&x Notation Quantization"); }
+
+protected:
+ virtual void modifySegment();
+
+private:
+ EventSelection *m_selection;// only used on 1st execute (cf bruteForceRedo)
+};
+
+
+}
+
+#endif
diff --git a/src/commands/notation/GraceCommand.cpp b/src/commands/notation/GraceCommand.cpp
new file mode 100644
index 0000000..99b8e5a
--- /dev/null
+++ b/src/commands/notation/GraceCommand.cpp
@@ -0,0 +1,115 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "GraceCommand.h"
+
+#include "base/NotationTypes.h"
+#include "base/Segment.h"
+#include "base/Selection.h"
+#include "document/BasicCommand.h"
+#include "base/BaseProperties.h"
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+using namespace BaseProperties;
+
+/*!!!
+
+GraceCommand::GraceCommand(EventSelection &selection) :
+ BasicCommand(getGlobalName(),
+ selection.getSegment(),
+ selection.getStartTime(),
+ getEffectiveEndTime(selection),
+ true),
+ m_selection(&selection)
+{}
+
+timeT
+GraceCommand::getEffectiveEndTime(EventSelection &
+ selection)
+{
+ EventSelection::eventcontainer::iterator i =
+ selection.getSegmentEvents().end();
+ if (i == selection.getSegmentEvents().begin())
+ return selection.getEndTime();
+ --i;
+
+ Segment::iterator si = selection.getSegment().findTime
+ ((*i)->getAbsoluteTime() + (*i)->getDuration());
+ if (si == selection.getSegment().end())
+ return selection.getEndTime();
+ else
+ return (*si)->getAbsoluteTime() + 1;
+}
+
+void
+GraceCommand::modifySegment()
+{
+ Segment &s(getSegment());
+ timeT startTime = getStartTime();
+ timeT endOfLastGraceNote = startTime;
+ int id = s.getNextId();
+
+ // first turn the selected events into grace notes
+
+ for (EventSelection::eventcontainer::iterator i =
+ m_selection->getSegmentEvents().begin();
+ i != m_selection->getSegmentEvents().end(); ++i) {
+
+ if ((*i)->isa(Note::EventType)) {
+ (*i)->set<Bool>(IS_GRACE_NOTE, true);
+ (*i)->set<Int>(BEAMED_GROUP_ID, id);
+ (*i)->set<String>(BEAMED_GROUP_TYPE, GROUP_TYPE_GRACE);
+ }
+
+ if ((*i)->getAbsoluteTime() + (*i)->getDuration() >
+ endOfLastGraceNote) {
+ endOfLastGraceNote =
+ (*i)->getAbsoluteTime() + (*i)->getDuration();
+ }
+ }
+
+ // then indicate that the following chord has grace notes
+
+ Segment::iterator i0, i1;
+ s.getTimeSlice(endOfLastGraceNote, i0, i1);
+
+ while (i0 != i1 && i0 != s.end()) {
+ if (!(*i0)->isa(Note::EventType)) {
+ ++i0;
+ continue;
+ }
+ (*i0)->set
+ <Bool>(HAS_GRACE_NOTES, true);
+ ++i0;
+ }
+}
+
+*/
+
+}
diff --git a/src/commands/notation/GraceCommand.h b/src/commands/notation/GraceCommand.h
new file mode 100644
index 0000000..08dcd87
--- /dev/null
+++ b/src/commands/notation/GraceCommand.h
@@ -0,0 +1,60 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_ADJUSTMENUGRACECOMMAND_H_
+#define _RG_ADJUSTMENUGRACECOMMAND_H_
+
+#include "document/BasicCommand.h"
+#include <qstring.h>
+#include "base/Event.h"
+#include <klocale.h>
+
+
+class Make;
+
+
+namespace Rosegarden
+{
+
+class EventSelection;
+
+/*!!!
+class GraceCommand : public BasicCommand
+{
+public:
+ GraceCommand(EventSelection &selection);
+
+ static QString getGlobalName() { return i18n("Make &Grace Notes"); }
+
+protected:
+ virtual void modifySegment();
+ timeT getEffectiveEndTime(EventSelection &);
+ EventSelection *m_selection;// only used on 1st execute (cf bruteForceRedo)
+};
+*/
+
+}
+
+#endif
diff --git a/src/commands/notation/GuitarChordInsertionCommand.cpp b/src/commands/notation/GuitarChordInsertionCommand.cpp
new file mode 100644
index 0000000..79e2b44
--- /dev/null
+++ b/src/commands/notation/GuitarChordInsertionCommand.cpp
@@ -0,0 +1,59 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "GuitarChordInsertionCommand.h"
+
+#include <klocale.h>
+#include "base/Event.h"
+#include "base/Segment.h"
+#include "document/BasicCommand.h"
+
+
+namespace Rosegarden
+{
+
+GuitarChordInsertionCommand::GuitarChordInsertionCommand(Segment &segment,
+ timeT time,
+ const Guitar::Chord& chord) :
+ BasicCommand(i18n("Insert Guitar Chord"), segment, time, time + 1, true),
+ m_chord(chord)
+{
+ // nothing
+}
+
+GuitarChordInsertionCommand::~GuitarChordInsertionCommand()
+{}
+
+void
+
+GuitarChordInsertionCommand::modifySegment()
+{
+ Segment::iterator i = getSegment().insert(m_chord.getAsEvent(getStartTime()));
+ if (i != getSegment().end()) {
+ m_lastInsertedEvent = *i;
+ }
+}
+
+}
diff --git a/src/commands/notation/GuitarChordInsertionCommand.h b/src/commands/notation/GuitarChordInsertionCommand.h
new file mode 100644
index 0000000..0a2db02
--- /dev/null
+++ b/src/commands/notation/GuitarChordInsertionCommand.h
@@ -0,0 +1,61 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_GUITARCHORDINSERTIONCOMMAND_H_
+#define _RG_GUITARCHORDINSERTIONCOMMAND_H_
+
+#include "document/BasicCommand.h"
+#include "base/Event.h"
+#include "gui/editors/guitar/Chord.h"
+
+
+namespace Rosegarden
+{
+
+class Segment;
+class Event;
+
+
+class GuitarChordInsertionCommand : public BasicCommand
+{
+public:
+ GuitarChordInsertionCommand(Segment &segment,
+ timeT time,
+ const Guitar::Chord& chord);
+ virtual ~GuitarChordInsertionCommand();
+
+ Event *getLastInsertedEvent() { return m_lastInsertedEvent; }
+
+protected:
+ virtual void modifySegment();
+
+ Guitar::Chord m_chord;
+ Event *m_lastInsertedEvent;
+};
+
+
+}
+
+#endif
diff --git a/src/commands/notation/IncrementDisplacementsCommand.cpp b/src/commands/notation/IncrementDisplacementsCommand.cpp
new file mode 100644
index 0000000..2ac44df
--- /dev/null
+++ b/src/commands/notation/IncrementDisplacementsCommand.cpp
@@ -0,0 +1,57 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "IncrementDisplacementsCommand.h"
+
+#include "base/Selection.h"
+#include "document/BasicSelectionCommand.h"
+#include "base/BaseProperties.h"
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+using namespace BaseProperties;
+
+void
+IncrementDisplacementsCommand::modifySegment()
+{
+ EventSelection::eventcontainer::iterator i;
+
+ for (i = m_selection->getSegmentEvents().begin();
+ i != m_selection->getSegmentEvents().end(); ++i) {
+
+ long prevX = 0, prevY = 0;
+ (*i)->get
+ <Int>(DISPLACED_X, prevX);
+ (*i)->get
+ <Int>(DISPLACED_Y, prevY);
+ (*i)->setMaybe<Int>(DISPLACED_X, prevX + long(m_dx));
+ (*i)->setMaybe<Int>(DISPLACED_Y, prevY + long(m_dy));
+ }
+}
+
+}
diff --git a/src/commands/notation/IncrementDisplacementsCommand.h b/src/commands/notation/IncrementDisplacementsCommand.h
new file mode 100644
index 0000000..4272b6a
--- /dev/null
+++ b/src/commands/notation/IncrementDisplacementsCommand.h
@@ -0,0 +1,66 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_INCREMENTDISPLACEMENTSCOMMAND_H_
+#define _RG_INCREMENTDISPLACEMENTSCOMMAND_H_
+
+#include "document/BasicSelectionCommand.h"
+#include <qstring.h>
+#include <klocale.h>
+
+
+
+
+namespace Rosegarden
+{
+
+class EventSelection;
+
+
+class IncrementDisplacementsCommand : public BasicSelectionCommand
+{
+public:
+ IncrementDisplacementsCommand(EventSelection &selection,
+ long dx, long dy) :
+ BasicSelectionCommand(getGlobalName(), selection, true),
+ m_selection(&selection),
+ m_dx(dx),
+ m_dy(dy) { }
+
+ static QString getGlobalName() { return i18n("Fine Reposition"); }
+
+protected:
+ virtual void modifySegment();
+
+private:
+ EventSelection *m_selection;// only used on 1st execute (cf bruteForceRedo)
+ long m_dx;
+ long m_dy;
+};
+
+
+}
+
+#endif
diff --git a/src/commands/notation/InterpretCommand.cpp b/src/commands/notation/InterpretCommand.cpp
new file mode 100644
index 0000000..d8a82cd
--- /dev/null
+++ b/src/commands/notation/InterpretCommand.cpp
@@ -0,0 +1,602 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "InterpretCommand.h"
+
+#include "base/Composition.h"
+#include "base/Event.h"
+#include "base/NotationTypes.h"
+#include "misc/Debug.h"
+#include "base/Quantizer.h"
+#include "base/Segment.h"
+#include "base/Sets.h"
+#include "base/BaseProperties.h"
+#include "base/Selection.h"
+#include "document/BasicSelectionCommand.h"
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+using namespace BaseProperties;
+
+const int InterpretCommand::NoInterpretation = 0;
+const int InterpretCommand::GuessDirections = (1<<0);
+const int InterpretCommand::ApplyTextDynamics = (1<<1);
+const int InterpretCommand::ApplyHairpins = (1<<2);
+const int InterpretCommand::StressBeats = (1<<3);
+const int InterpretCommand::Articulate = (1<<4);
+const int InterpretCommand::AllInterpretations= (1<<5) - 1;
+
+InterpretCommand::~InterpretCommand()
+{
+ for (IndicationMap::iterator i = m_indications.begin();
+ i != m_indications.end(); ++i) {
+ delete i->second;
+ }
+}
+
+void
+InterpretCommand::modifySegment()
+{
+ // Of all the interpretations, Articulate is the only one that
+ // changes event times or durations. This means we must apply it
+ // last, as the selection cannot be used after it's been applied,
+ // because the events in the selection will have been recreated
+ // with their new timings.
+
+ // The default velocity for new notes is 100, and the range is
+ // 0-127 (in practice this seems to be roughly logarithmic rather
+ // than linear, though perhaps that's an illusion).
+
+ // We should only apply interpretation to those events actually
+ // selected, but when applying things like hairpins and text
+ // dynamics we need to take into account all dynamics that may
+ // cover our events even if they're not selected or are not within
+ // the time range of the selection at all. So first we'd better
+ // find all the likely indications, starting at (for the sake of
+ // argument) three bars before the start of the selection:
+
+ Segment &segment(getSegment());
+
+ timeT t = m_selection->getStartTime();
+ for (int i = 0; i < 3; ++i)
+ t = segment.getBarStartForTime(t);
+
+ Segment::iterator itr = segment.findTime(t);
+
+ while (itr != segment.end()) {
+ timeT eventTime = (*itr)->getAbsoluteTime();
+ if (eventTime > m_selection->getEndTime())
+ break;
+ if ((*itr)->isa(Indication::EventType)) {
+ m_indications[eventTime] = new Indication(**itr);
+ }
+ ++itr;
+ }
+
+ //!!! need the option of ignoring current velocities or adjusting
+ //them: at the moment ApplyTextDynamics ignores them and the
+ //others adjust them
+
+ if (m_interpretations & GuessDirections)
+ guessDirections();
+ if (m_interpretations & ApplyTextDynamics)
+ applyTextDynamics();
+ if (m_interpretations & ApplyHairpins)
+ applyHairpins();
+ if (m_interpretations & StressBeats)
+ stressBeats();
+ if (m_interpretations & Articulate)
+ articulate();
+
+ //!!! Finally, in future we should extend this to allow
+ // indications on one segment (e.g. top line of piano staff) to
+ // affect another (e.g. bottom line). All together now: "Even
+ // Rosegarden 2.1 could do that!"
+}
+
+void
+InterpretCommand::guessDirections()
+{
+ //...
+}
+
+void
+InterpretCommand::applyTextDynamics()
+{
+ // laborious
+
+ Segment &segment(getSegment());
+ int velocity = 100;
+
+ timeT startTime = m_selection->getStartTime();
+ timeT endTime = m_selection->getEndTime();
+
+ for (Segment::iterator i = segment.begin();
+ segment.isBeforeEndMarker(i); ++i) {
+
+ timeT t = (*i)->getAbsoluteTime();
+
+ if (t > endTime)
+ break;
+
+ if (Text::isTextOfType(*i, Text::Dynamic)) {
+
+ std::string text;
+ if ((*i)->get
+ <String>(Text::TextPropertyName, text)) {
+ velocity = getVelocityForDynamic(text);
+ }
+ }
+
+ if (t >= startTime &&
+ (*i)->isa(Note::EventType) && m_selection->contains(*i)) {
+ (*i)->set
+ <Int>(VELOCITY, velocity);
+ }
+ }
+}
+
+int
+InterpretCommand::getVelocityForDynamic(std::string text)
+{
+ int velocity = 100;
+
+ // should do case-insensitive matching with whitespace
+ // removed. can surely be cleverer about this too!
+
+ if (text == "ppppp")
+ velocity = 10;
+ else if (text == "pppp")
+ velocity = 20;
+ else if (text == "ppp")
+ velocity = 30;
+ else if (text == "pp")
+ velocity = 40;
+ else if (text == "p")
+ velocity = 60;
+ else if (text == "mp")
+ velocity = 80;
+ else if (text == "mf")
+ velocity = 90;
+ else if (text == "f")
+ velocity = 105;
+ else if (text == "ff")
+ velocity = 110;
+ else if (text == "fff")
+ velocity = 115;
+ else if (text == "ffff")
+ velocity = 120;
+ else if (text == "fffff")
+ velocity = 125;
+
+ NOTATION_DEBUG << "InterpretCommand::getVelocityForDynamic: unrecognised dynamic " << text << endl;
+
+ return velocity;
+}
+
+void
+InterpretCommand::applyHairpins()
+{
+ Segment &segment(getSegment());
+ int velocityToApply = -1;
+
+ for (EventSelection::eventcontainer::iterator ecitr =
+ m_selection->getSegmentEvents().begin();
+ ecitr != m_selection->getSegmentEvents().end(); ++ecitr) {
+
+ Event *e = *ecitr;
+ if (Text::isTextOfType(e, Text::Dynamic)) {
+ velocityToApply = -1;
+ }
+ if (!e->isa(Note::EventType))
+ continue;
+ bool crescendo = true;
+
+ IndicationMap::iterator inditr =
+ findEnclosingIndication(e, Indication::Crescendo);
+
+ // we can't be in both crescendo and decrescendo -- at least,
+ // not meaningfully
+
+ if (inditr == m_indications.end()) {
+ inditr = findEnclosingIndication(e, Indication::Decrescendo);
+ if (inditr == m_indications.end()) {
+ if (velocityToApply > 0) {
+ e->set
+ <Int>(VELOCITY, velocityToApply);
+ }
+ continue;
+ }
+ crescendo = false;
+ }
+
+ // The starting velocity for the indication is easy -- it's
+ // just the velocity of the last note at or before the
+ // indication begins that has a velocity
+
+ timeT hairpinStartTime = inditr->first;
+ // ensure we scan all of the events at this time:
+ Segment::iterator itr(segment.findTime(hairpinStartTime + 1));
+ while (itr == segment.end() ||
+ (*itr)->getAbsoluteTime() > hairpinStartTime ||
+ !(*itr)->isa(Note::EventType) ||
+ !(*itr)->has(VELOCITY)) {
+ if (itr == segment.begin()) {
+ itr = segment.end();
+ break;
+ }
+ --itr;
+ }
+
+ long startingVelocity = 100;
+ if (itr != segment.end()) {
+ (*itr)->get
+ <Int>(VELOCITY, startingVelocity);
+ }
+
+ // The ending velocity is harder. If there's a dynamic change
+ // directly after the hairpin, then we want to use that
+ // dynamic's velocity unless it opposes the hairpin's
+ // direction. If there isn't, or it does oppose the hairpin,
+ // we should probably make the degree of change caused by the
+ // hairpin depend on its total duration.
+
+ long endingVelocity = startingVelocity;
+ timeT hairpinEndTime = inditr->first +
+ inditr->second->getIndicationDuration();
+ itr = segment.findTime(hairpinEndTime);
+ while (itr != segment.end()) {
+ if (Text::isTextOfType(*itr, Text::Dynamic)) {
+ std::string text;
+ if ((*itr)->get
+ <String>(Text::TextPropertyName, text)) {
+ endingVelocity = getVelocityForDynamic(text);
+ break;
+ }
+ }
+ if ((*itr)->getAbsoluteTime() >
+ (hairpinEndTime + Note(Note::Crotchet).getDuration()))
+ break;
+ ++itr;
+ }
+
+ if (( crescendo && (endingVelocity < startingVelocity)) ||
+ (!crescendo && (endingVelocity > startingVelocity))) {
+ // we've got it wrong; prefer following the hairpin to
+ // following whatever direction we got the dynamic from
+ endingVelocity = startingVelocity;
+ // and then fall into the next conditional to set up the
+ // velocities
+ }
+
+ if (endingVelocity == startingVelocity) {
+ // calculate an ending velocity based on starting velocity
+ // and hairpin duration (okay, we'll leave that bit for later)
+ endingVelocity = startingVelocity * (crescendo ? 120 : 80) / 100;
+ }
+
+ double proportion =
+ (double(e->getAbsoluteTime() - hairpinStartTime) /
+ double(hairpinEndTime - hairpinStartTime));
+ long velocity =
+ int((endingVelocity - startingVelocity) * proportion +
+ startingVelocity);
+
+ NOTATION_DEBUG << "InterpretCommand::applyHairpins: velocity of note at " << e->getAbsoluteTime() << " is " << velocity << " (" << proportion << " through hairpin from " << startingVelocity << " to " << endingVelocity << ")" << endl;
+ if (velocity < 10)
+ velocity = 10;
+ if (velocity > 127)
+ velocity = 127;
+ e->set
+ <Int>(VELOCITY, velocity);
+ velocityToApply = velocity;
+ }
+}
+
+void
+InterpretCommand::stressBeats()
+{
+ Composition *c = getSegment().getComposition();
+
+ for (EventSelection::eventcontainer::iterator itr =
+ m_selection->getSegmentEvents().begin();
+ itr != m_selection->getSegmentEvents().end(); ++itr) {
+
+ Event *e = *itr;
+ if (!e->isa(Note::EventType))
+ continue;
+
+ timeT t = e->getNotationAbsoluteTime();
+ TimeSignature timeSig = c->getTimeSignatureAt(t);
+ timeT barStart = getSegment().getBarStartForTime(t);
+ int stress = timeSig.getEmphasisForTime(t - barStart);
+
+ // stresses are from 0 to 4, so we add 12% to the velocity
+ // at the maximum stress, subtract 4% at the minimum
+ int velocityChange = stress * 4 - 4;
+
+ // do this even if velocityChange == 0, in case the event
+ // has no velocity yet
+ long velocity = 100;
+ e->get
+ <Int>(VELOCITY, velocity);
+ velocity += velocity * velocityChange / 100;
+ if (velocity < 10)
+ velocity = 10;
+ if (velocity > 127)
+ velocity = 127;
+ e->set
+ <Int>(VELOCITY, velocity);
+ }
+}
+
+void
+InterpretCommand::articulate()
+{
+ // Basic articulations:
+ //
+ // -- Anything marked tenuto or within a slur gets 100% of its
+ // nominal duration (that's what we need the quantizer for,
+ // to get the display nominal duration), and its velocity
+ // is unchanged.
+ //
+ // -- Anything marked marcato gets 60%, or 70% if slurred (!),
+ // and gets an extra 15% of velocity.
+ //
+ // -- Anything marked staccato gets 55%, or 70% if slurred,
+ // and unchanged velocity.
+ //
+ // -- Anything marked staccatissimo gets 30%, or 50% if slurred (!),
+ // and loses 5% of velocity.
+ //
+ // -- Anything marked sforzando gains 35% of velocity.
+ //
+ // -- Anything marked with an accent gains 30% of velocity.
+ //
+ // -- Anything marked rinforzando gains 15% of velocity and has
+ // its full duration. Guess we really need to use some proper
+ // controllers here.
+ //
+ // -- Anything marked down-bow gains 5% of velocity, anything
+ // marked up-bow loses 5%.
+ //
+ // -- Anything unmarked and unslurred, or marked tenuto and
+ // slurred, gets 90% of duration.
+
+ std::set
+ <Event *> toErase;
+ std::set
+ <Event *> toInsert;
+ Segment &segment(getSegment());
+
+ for (EventSelection::eventcontainer::iterator ecitr =
+ m_selection->getSegmentEvents().begin();
+ ecitr != m_selection->getSegmentEvents().end(); ++ecitr) {
+
+ Event *e = *ecitr;
+ if (!e->isa(Note::EventType))
+ continue;
+ Segment::iterator itr = segment.findSingle(e);
+ Chord chord(segment, itr, m_quantizer);
+
+ // the things that affect duration
+ bool staccato = false;
+ bool staccatissimo = false;
+ bool marcato = false;
+ bool tenuto = false;
+ bool rinforzando = false;
+ bool slurred = false;
+
+ int velocityChange = 0;
+
+ std::vector<Mark> marks(chord.getMarksForChord());
+
+ for (std::vector<Mark>::iterator i = marks.begin();
+ i != marks.end(); ++i) {
+
+ if (*i == Marks::Accent) {
+ velocityChange += 30;
+ } else if (*i == Marks::Tenuto) {
+ tenuto = true;
+ } else if (*i == Marks::Staccato) {
+ staccato = true;
+ } else if (*i == Marks::Staccatissimo) {
+ staccatissimo = true;
+ velocityChange -= 5;
+ } else if (*i == Marks::Marcato) {
+ marcato = true;
+ velocityChange += 15;
+ } else if (*i == Marks::Sforzando) {
+ velocityChange += 35;
+ } else if (*i == Marks::Rinforzando) {
+ rinforzando = true;
+ velocityChange += 15;
+ } else if (*i == Marks::DownBow) {
+ velocityChange += 5;
+ } else if (*i == Marks::UpBow) {
+ velocityChange -= 5;
+ }
+ }
+
+ IndicationMap::iterator inditr =
+ findEnclosingIndication(e, Indication::Slur);
+
+ if (inditr != m_indications.end())
+ slurred = true;
+ if (slurred) {
+ // last note in a slur should be treated as if unslurred
+ timeT slurEnd =
+ inditr->first + inditr->second->getIndicationDuration();
+ if (slurEnd == e->getNotationAbsoluteTime() + e->getNotationDuration() ||
+ slurEnd == e->getAbsoluteTime() + e->getDuration()) {
+ slurred = false;
+ }
+ /*!!!
+ Segment::iterator slurEndItr = segment.findTime(slurEnd);
+ if (slurEndItr != segment.end() &&
+ (*slurEndItr)->getNotationAbsoluteTime() <=
+ e->getNotationAbsoluteTime()) {
+ slurred = false;
+ }
+ */
+ }
+
+ int durationChange = 0;
+
+ if (slurred) {
+ //!!! doesn't seem to be picking up slurs correctly
+ if (tenuto)
+ durationChange = -10;
+ else if (marcato || staccato)
+ durationChange = -30;
+ else if (staccatissimo)
+ durationChange = -50;
+ else
+ durationChange = 0;
+ } else {
+ if (tenuto)
+ durationChange = 0;
+ else if (marcato)
+ durationChange = -40;
+ else if (staccato)
+ durationChange = -45;
+ else if (staccatissimo)
+ durationChange = -70;
+ else if (rinforzando)
+ durationChange = 0;
+ else
+ durationChange = -10;
+ }
+
+ NOTATION_DEBUG << "InterpretCommand::modifySegment: chord has " << chord.size() << " notes in it" << endl;
+
+ for (Chord::iterator ci = chord.begin();
+ ci != chord.end(); ++ci) {
+
+ e = **ci;
+
+ NOTATION_DEBUG << "InterpretCommand::modifySegment: For note at " << e->getAbsoluteTime() << ", velocityChange is " << velocityChange << " and durationChange is " << durationChange << endl;
+
+ // do this even if velocityChange == 0, in case the event
+ // has no velocity yet
+ long velocity = 100;
+ e->get
+ <Int>(VELOCITY, velocity);
+ velocity += velocity * velocityChange / 100;
+ if (velocity < 10)
+ velocity = 10;
+ if (velocity > 127)
+ velocity = 127;
+ e->set
+ <Int>(VELOCITY, velocity);
+
+ timeT duration = e->getNotationDuration();
+
+ // don't mess with the duration of a tied note
+ bool tiedForward = false;
+ if (e->get
+ <Bool>(TIED_FORWARD, tiedForward) && tiedForward) {
+ durationChange = 0;
+ }
+
+ timeT newDuration = duration + duration * durationChange / 100;
+
+ // this comparison instead of "durationChange != 0"
+ // because we want to permit the possibility of resetting
+ // the performance duration of a note (that's perhaps been
+ // articulated wrongly) based on the notation duration:
+
+ if (e->getDuration() != newDuration) {
+
+ if (toErase.find(e) == toErase.end()) {
+
+ //!!! deal with tuplets
+
+ Event *newEvent = new Event(*e,
+ e->getAbsoluteTime(),
+ newDuration,
+ e->getSubOrdering(),
+ e->getNotationAbsoluteTime(),
+ duration);
+ toInsert.insert(newEvent);
+ toErase.insert(e);
+ }
+ }
+ }
+
+ // what we want to do here is jump our iterator to the final
+ // element in the chord -- but that doesn't work because we're
+ // iterating through the selection, not the segment. So for
+ // now we just accept the fact that notes in chords might be
+ // processed multiple times (slow) and added into the toErase
+ // set more than once (hence the nasty tests in the loop just
+ // after the close of this loop).
+ }
+
+ for (std::set
+ <Event *>::iterator j = toErase.begin(); j != toErase.end(); ++j) {
+ Segment::iterator jtr(segment.findSingle(*j));
+ if (jtr != segment.end())
+ segment.erase(jtr);
+ }
+
+ for (std::set
+ <Event *>::iterator j = toInsert.begin(); j != toInsert.end(); ++j) {
+ segment.insert(*j);
+ }
+}
+
+InterpretCommand::IndicationMap::iterator
+
+InterpretCommand::findEnclosingIndication(Event *e,
+ std::string type)
+{
+ // a bit slow, but let's wait and see whether it's a bottleneck
+ // before we worry about that
+
+ timeT t = e->getAbsoluteTime();
+ IndicationMap::iterator itr = m_indications.lower_bound(t);
+
+ while (1) {
+ if (itr != m_indications.end()) {
+
+ if (itr->second->getIndicationType() == type &&
+ itr->first <= t &&
+ itr->first + itr->second->getIndicationDuration() > t) {
+ return itr;
+ }
+ }
+ if (itr == m_indications.begin())
+ break;
+ --itr;
+ }
+
+ return m_indications.end();
+}
+
+}
diff --git a/src/commands/notation/InterpretCommand.h b/src/commands/notation/InterpretCommand.h
new file mode 100644
index 0000000..e1ace8f
--- /dev/null
+++ b/src/commands/notation/InterpretCommand.h
@@ -0,0 +1,100 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_ADJUSTMENUINTERPRETCOMMAND_H_
+#define _RG_ADJUSTMENUINTERPRETCOMMAND_H_
+
+#include "document/BasicSelectionCommand.h"
+#include <map>
+#include <string>
+#include <qstring.h>
+#include "base/Event.h"
+#include <klocale.h>
+
+
+
+
+namespace Rosegarden
+{
+
+class Quantizer;
+class Indication;
+class EventSelection;
+class Event;
+
+
+class InterpretCommand : public BasicSelectionCommand
+{
+public:
+ // bit masks: pass an OR of these to the constructor
+ static const int NoInterpretation;
+ static const int GuessDirections; // allegro, rit, pause &c: kinda bogus
+ static const int ApplyTextDynamics; // mp, ff
+ static const int ApplyHairpins; // self-evident
+ static const int StressBeats; // stress bar/beat boundaries
+ static const int Articulate; // slurs, marks, legato etc
+ static const int AllInterpretations; // all of the above
+
+ InterpretCommand(EventSelection &selection,
+ const Quantizer *quantizer,
+ int interpretations) :
+ BasicSelectionCommand(getGlobalName(), selection, true),
+ m_selection(&selection),
+ m_quantizer(quantizer),
+ m_interpretations(interpretations) { }
+
+ virtual ~InterpretCommand();
+
+ static QString getGlobalName() { return i18n("&Interpret..."); }
+
+protected:
+ virtual void modifySegment();
+
+private:
+ EventSelection *m_selection;// only used on 1st execute (cf bruteForceRedo)
+ const Quantizer *m_quantizer;
+ int m_interpretations;
+
+ typedef std::map<timeT,
+ Indication *> IndicationMap;
+ IndicationMap m_indications;
+
+ void guessDirections();
+ void applyTextDynamics();
+ void applyHairpins();
+ void stressBeats();
+ void articulate(); // must be applied last
+
+ // test if the event is within an indication of the given type, return
+ // an iterator pointing to that indication if so
+ IndicationMap::iterator findEnclosingIndication(Event *,
+ std::string type);
+ int getVelocityForDynamic(std::string dynamic);
+};
+
+
+}
+
+#endif
diff --git a/src/commands/notation/KeyInsertionCommand.cpp b/src/commands/notation/KeyInsertionCommand.cpp
new file mode 100644
index 0000000..39b87e2
--- /dev/null
+++ b/src/commands/notation/KeyInsertionCommand.cpp
@@ -0,0 +1,264 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "KeyInsertionCommand.h"
+
+#include "misc/Debug.h"
+#include "base/Event.h"
+#include "base/NotationTypes.h"
+#include "base/Segment.h"
+#include "base/SegmentNotationHelper.h"
+#include "base/Studio.h"
+#include "document/BasicCommand.h"
+#include "base/BaseProperties.h"
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+using namespace BaseProperties;
+
+
+KeyInsertionCommand::KeyInsertionCommand(Segment &segment, timeT time,
+ Key key,
+ bool convert,
+ bool transpose,
+ bool transposeKey,
+ bool ignorePercussion) :
+ BasicCommand(getGlobalName(&key), segment, time, segment.getEndTime()),
+ m_key(key),
+ m_lastInsertedEvent(0),
+ m_convert(convert),
+ m_transpose(transpose),
+ m_transposeKey(transposeKey),
+ m_ignorePercussion(ignorePercussion)
+
+{
+ // nothing
+}
+
+KeyInsertionCommand::~KeyInsertionCommand()
+{
+ // nothing
+}
+
+void
+KeyInsertionCommand::modifySegment()
+{
+ SegmentNotationHelper helper(getSegment());
+ Key oldKey;
+
+ if (m_convert || m_transpose) {
+ oldKey = getSegment().getKeyAtTime(getStartTime());
+ }
+
+ Segment::iterator i = getSegment().findTime(getStartTime());
+ while (getSegment().isBeforeEndMarker(i)) {
+ if ((*i)->getAbsoluteTime() > getStartTime()) {
+ break;
+ }
+ if ((*i)->isa(Key::EventType)) {
+ getSegment().erase(i);
+ break;
+ }
+ ++i;
+ }
+
+ // transpose if desired, according to new dialog option
+ if (m_transposeKey) {
+ // we don't really care about major/minor for this, so pass it through
+ // from the original key
+ bool keyIsMinor = m_key.isMinor();
+
+ // get whether the original key is flat or sharp, so we know what to
+ // prefer for the new key
+ bool keyIsSharp = m_key.isSharp();
+
+ // get the tonic pitch of the user-specified key, reported as a 0-11 int, then
+ // add an extra octave to it to avoid winding up with negative numbers
+ // (the octave will be stripped back off)
+ int specifiedKeyTonic = m_key.getTonicPitch() + 12;
+
+ // get the transpose factor for the segment we're working on
+ int segTranspose = getSegment().getTranspose();
+
+ // subtract the transpose factor from the tonic pitch of the
+ // user-specified key, because we want to move in the opposite
+ // direction for notation (eg. notation is in C major concert, at Bb
+ // transposition, we have -2 from the segment, and want to go +2 for
+ // the key, from tonic pitch 0 (C) to tonic pitch 2 (D) for the key as
+ // written for a Bb instrument
+ //
+ // sanity check: 0 == C; 0 + 12 == 12; (12 - -2) % 12 == 2; 2 == D
+ int transposedKeyTonic = (specifiedKeyTonic - segTranspose) % 12;
+
+ // create a new key with the new tonic pitch, and major/minor from the
+ // original key
+ std::string newKeyName = "";
+
+ switch (transposedKeyTonic) {
+ // 0 C | 1 C# | 2 D | 3 D# | 4 E | 5 F | 6 F# | 7 G | 8 G# | 9 A | 10 A# | 11 B
+ case 0 : // C
+ newKeyName = "C";
+ break;
+ case 2 : // D
+ newKeyName = "D";
+ break;
+ case 4 : // E
+ newKeyName = "E";
+ break;
+ case 5 : // F
+ newKeyName = "F";
+ break;
+ case 7 : // G
+ newKeyName = "G";
+ break;
+ case 9 : // A
+ newKeyName = "A";
+ break;
+ case 11: // B
+ newKeyName = "B";
+ break;
+ // the glorious, glorious black keys need special treatment
+ // again, so we pick flat or sharp spellings based on the
+ // condition of the original, user-specified key we're
+ // transposing
+ case 1 : // C#/Db
+ newKeyName = (keyIsSharp ? "C#" : "Db");
+ break;
+ case 3 : // D#/Eb
+ newKeyName = (keyIsSharp ? "D#" : "Eb");
+ break;
+ case 6 : // F#/Gb
+ newKeyName = (keyIsSharp ? "F#" : "Gb");
+ break;
+ case 8 : // G#/Ab
+ newKeyName = (keyIsSharp ? "G#" : "Ab");
+ break;
+ case 10: // A#/Bb
+ newKeyName = (keyIsSharp ? "A#" : "Bb");
+ break;
+ default:
+ // if this fails, we won't have a valid key name, and
+ // there will be some crashing exception I don't know how
+ // to intercept and avoid, so I'm doing this lame failsafe
+ // instead, which should never, ever actually run under
+ // any conceivable cirumstance anyway
+ RG_DEBUG << "KeyInsertionCommand: by the pricking of my thumbs, something wicked this way comes. :("
+ << endl;
+ return ;
+ }
+
+ newKeyName += (keyIsMinor ? " minor" : " major");
+
+ //for f in C# D# E# F# G# A# B# Cb Db Eb Fb Gb Ab Bb;do grep "$f
+ //major" NotationTypes.C > /dev/null||echo "invalid key: $f
+ //major";grep "$f minor" NotationTypes.C > /dev/null||echo "invalid
+ //key: $f minor";done|sort
+ //invalid key: A# major
+ //invalid key: B# major
+ //invalid key: B# minor
+ //invalid key: Cb minor
+ //invalid key: Db minor
+ //invalid key: D# major
+ //invalid key: E# major
+ //invalid key: E# minor
+ //invalid key: Fb major
+ //invalid key: Fb minor
+ //invalid key: Gb minor
+ //invalid key: G# major
+
+ // some kludgery to avoid creating invalid key names with some if/then
+ // swapping to manually respell things generated incorrectly by the
+ // above, rather than adding all kinds of nonsense to avoid this
+ // necessity
+ if (newKeyName == "A# major")
+ newKeyName = "Bb major";
+ else if (newKeyName == "B# major")
+ newKeyName = "C major";
+ else if (newKeyName == "Cb minor")
+ newKeyName = "B minor";
+ else if (newKeyName == "Db minor")
+ newKeyName = "C# minor";
+ else if (newKeyName == "D# major")
+ newKeyName = "Eb major";
+ else if (newKeyName == "E# major")
+ newKeyName = "F major";
+ else if (newKeyName == "E# minor")
+ newKeyName = "F minor";
+ else if (newKeyName == "Fb major")
+ newKeyName = "E major";
+ else if (newKeyName == "Fb minor")
+ newKeyName = "E minor";
+ else if (newKeyName == "Gb minor")
+ newKeyName = "F# minor";
+ else if (newKeyName == "G# major")
+ newKeyName = "Ab major";
+
+ // create a new key with the newly derived name, and swap it for the
+ // user-specified version
+ Key k(newKeyName);
+ RG_DEBUG << "KeyInsertCommand: inserting transposed key" << endl
+ << " user key was: " << m_key.getName() << endl
+ << " tranposed key is: " << k.getName() << endl;
+ m_key = k;
+ } // if (m_transposeKey)
+
+ i = helper.insertKey(getStartTime(), m_key);
+
+ if (i != helper.segment().end()) {
+
+ m_lastInsertedEvent = *i;
+ if (!m_convert && !m_transpose)
+ return ;
+
+ while (++i != helper.segment().end()) {
+
+ //!!! what if we get two keys at the same time...?
+ if ((*i)->isa(Key::EventType))
+ break;
+
+ if ((*i)->isa(Note::EventType) &&
+ (*i)->has(PITCH)) {
+
+ long pitch = (*i)->get
+ <Int>(PITCH);
+
+ if (m_convert) {
+ (*i)->set
+ <Int>(PITCH, m_key.convertFrom(pitch, oldKey));
+ } else {
+ (*i)->set
+ <Int>(PITCH, m_key.transposeFrom(pitch, oldKey));
+ }
+
+ (*i)->unset(ACCIDENTAL);
+ }
+ }
+ }
+}
+
+}
diff --git a/src/commands/notation/KeyInsertionCommand.h b/src/commands/notation/KeyInsertionCommand.h
new file mode 100644
index 0000000..a9caa6a
--- /dev/null
+++ b/src/commands/notation/KeyInsertionCommand.h
@@ -0,0 +1,91 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_KEYINSERTIONCOMMAND_H_
+#define _RG_KEYINSERTIONCOMMAND_H_
+
+#include "base/NotationTypes.h"
+#include "document/BasicCommand.h"
+#include <qstring.h>
+#include "base/Event.h"
+#include <klocale.h>
+#include "misc/Strings.h"
+
+
+class Add;
+
+
+namespace Rosegarden
+{
+
+class Segment;
+class Event;
+
+//!!! Note, the shouldIgnorePercussion parameter probably shouldn't have been
+// added to the individual KeyInsertionCommand in the first place, but I haven't
+// made up my mind yet for sure, and I already changed all the calls to this
+// constructor, so I'm leaving this in until after the new code is field
+// tested, and I can determine it really never will be wanted (DMM)
+class KeyInsertionCommand : public BasicCommand
+{
+public:
+ KeyInsertionCommand(Segment &segment,
+ timeT time,
+ Key key,
+ bool shouldConvert,
+ bool shouldTranspose,
+ bool shouldTransposeKey,
+ bool shouldIgnorePercussion);
+ virtual ~KeyInsertionCommand();
+
+ static QString getGlobalName(Key *key = 0) {
+ if (key) {
+ return i18n("Change to &Key %1...").arg(strtoqstr(key->getName()));
+ } else {
+ return i18n("Add &Key Change...");
+ }
+ }
+
+ Event *getLastInsertedEvent() { return m_lastInsertedEvent; }
+
+protected:
+ virtual void modifySegment();
+
+ Key m_key;
+ Event *m_lastInsertedEvent;
+ bool m_convert;
+ bool m_transpose;
+ bool m_transposeKey;
+ bool m_ignorePercussion;
+};
+
+/*
+ * Inserts a key change into multiple segments at the same time, taking
+ * individual segment transpose into account (fixes #1520716) if desired.
+ */
+
+}
+
+#endif
diff --git a/src/commands/notation/MakeAccidentalsCautionaryCommand.cpp b/src/commands/notation/MakeAccidentalsCautionaryCommand.cpp
new file mode 100644
index 0000000..5716a8b
--- /dev/null
+++ b/src/commands/notation/MakeAccidentalsCautionaryCommand.cpp
@@ -0,0 +1,68 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "MakeAccidentalsCautionaryCommand.h"
+
+#include <klocale.h>
+#include "base/NotationTypes.h"
+#include "base/Selection.h"
+#include "document/BasicSelectionCommand.h"
+#include "gui/editors/notation/NotationProperties.h"
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+QString
+MakeAccidentalsCautionaryCommand::getGlobalName(bool cautionary)
+{
+ if (cautionary)
+ return i18n("Use &Cautionary Accidentals");
+ else
+ return i18n("Cancel C&autionary Accidentals");
+}
+
+void
+MakeAccidentalsCautionaryCommand::modifySegment()
+{
+ EventSelection::eventcontainer::iterator i;
+
+ for (i = m_selection->getSegmentEvents().begin();
+ i != m_selection->getSegmentEvents().end(); ++i) {
+
+ if ((*i)->isa(Note::EventType)) {
+ if (m_cautionary) {
+ (*i)->set
+ <Bool>(NotationProperties::USE_CAUTIONARY_ACCIDENTAL,
+ true);
+ } else {
+ (*i)->unset(NotationProperties::USE_CAUTIONARY_ACCIDENTAL);
+ }
+ }
+ }
+}
+
+}
diff --git a/src/commands/notation/MakeAccidentalsCautionaryCommand.h b/src/commands/notation/MakeAccidentalsCautionaryCommand.h
new file mode 100644
index 0000000..2745dc7
--- /dev/null
+++ b/src/commands/notation/MakeAccidentalsCautionaryCommand.h
@@ -0,0 +1,63 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_MAKEACCIDENTALSCAUTIONARYCOMMAND_H_
+#define _RG_MAKEACCIDENTALSCAUTIONARYCOMMAND_H_
+
+#include "document/BasicSelectionCommand.h"
+#include <qstring.h>
+
+
+
+
+namespace Rosegarden
+{
+
+class EventSelection;
+
+
+class MakeAccidentalsCautionaryCommand : public BasicSelectionCommand
+{
+public:
+ MakeAccidentalsCautionaryCommand(bool cautionary,
+ EventSelection &selection) :
+ BasicSelectionCommand(getGlobalName(cautionary), selection, true),
+ m_selection(&selection),
+ m_cautionary(cautionary) { }
+
+ static QString getGlobalName(bool cautionary);
+
+protected:
+ virtual void modifySegment();
+
+private:
+ EventSelection *m_selection;// only used on 1st execute (cf bruteForceRedo)
+ bool m_cautionary;
+};
+
+
+}
+
+#endif
diff --git a/src/commands/notation/MakeChordCommand.cpp b/src/commands/notation/MakeChordCommand.cpp
new file mode 100644
index 0000000..668e627
--- /dev/null
+++ b/src/commands/notation/MakeChordCommand.cpp
@@ -0,0 +1,75 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "MakeChordCommand.h"
+
+#include "base/Event.h"
+#include "base/NotationTypes.h"
+#include "base/Segment.h"
+#include "base/Selection.h"
+#include "document/BasicSelectionCommand.h"
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+void
+MakeChordCommand::modifySegment()
+{
+ // find all the notes in the selection, and bring them back to align
+ // with the start of the selection, giving them the same duration as
+ // the longest note among them
+
+ std::vector<Event *> toErase;
+ std::vector<Event *> toInsert;
+ Segment &segment(m_selection->getSegment());
+
+ for (EventSelection::eventcontainer::iterator i =
+ m_selection->getSegmentEvents().begin();
+ i != m_selection->getSegmentEvents().end(); ++i) {
+
+ if ((*i)->isa(Note::EventType)) {
+ toErase.push_back(*i);
+ toInsert.push_back(new Event(**i, m_selection->getStartTime()));
+ }
+ }
+
+ for (unsigned int j = 0; j < toErase.size(); ++j) {
+ Segment::iterator jtr(segment.findSingle(toErase[j]));
+ if (jtr != segment.end())
+ segment.erase(jtr);
+ }
+
+ for (unsigned int j = 0; j < toInsert.size(); ++j) {
+ segment.insert(toInsert[j]);
+ }
+
+ segment.normalizeRests(getStartTime(), getEndTime());
+
+ //!!! should select all notes in chord now
+}
+
+}
diff --git a/src/commands/notation/MakeChordCommand.h b/src/commands/notation/MakeChordCommand.h
new file mode 100644
index 0000000..9c85ea2
--- /dev/null
+++ b/src/commands/notation/MakeChordCommand.h
@@ -0,0 +1,66 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_ADJUSTMENUMAKECHORDCOMMAND_H_
+#define _RG_ADJUSTMENUMAKECHORDCOMMAND_H_
+
+#include "document/BasicSelectionCommand.h"
+#include <qstring.h>
+#include <klocale.h>
+
+
+class Make;
+
+
+namespace Rosegarden
+{
+
+class EventSelection;
+
+
+class MakeChordCommand : public BasicSelectionCommand
+{
+public:
+ MakeChordCommand(EventSelection &selection) :
+ BasicSelectionCommand(getGlobalName(), selection, true),
+ m_selection(&selection) { }
+
+ static QString getGlobalName() { return i18n("Make &Chord"); }
+
+protected:
+ virtual void modifySegment();
+
+private:
+ EventSelection *m_selection;// only used on 1st execute (cf bruteForceRedo)
+};
+
+
+// Transforms menu commands
+
+
+
+}
+
+#endif
diff --git a/src/commands/notation/MakeNotesViableCommand.cpp b/src/commands/notation/MakeNotesViableCommand.cpp
new file mode 100644
index 0000000..26cff3c
--- /dev/null
+++ b/src/commands/notation/MakeNotesViableCommand.cpp
@@ -0,0 +1,57 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "MakeNotesViableCommand.h"
+
+#include "base/Segment.h"
+#include "base/SegmentNotationHelper.h"
+#include "base/Selection.h"
+#include "document/BasicSelectionCommand.h"
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+void
+MakeNotesViableCommand::modifySegment()
+{
+ Segment &segment(getSegment());
+ SegmentNotationHelper helper(segment);
+
+ if (m_selection) {
+ EventSelection::RangeTimeList ranges(m_selection->getRangeTimes());
+ for (EventSelection::RangeTimeList::iterator i = ranges.begin();
+ i != ranges.end(); ++i) {
+ helper.makeNotesViable(i->first, i->second, true);
+ segment.normalizeRests(i->first, i->second);
+ }
+ } else {
+ helper.makeNotesViable(getStartTime(), getEndTime(), true);
+ segment.normalizeRests(getStartTime(), getEndTime());
+ }
+}
+
+}
diff --git a/src/commands/notation/MakeNotesViableCommand.h b/src/commands/notation/MakeNotesViableCommand.h
new file mode 100644
index 0000000..f84f76d
--- /dev/null
+++ b/src/commands/notation/MakeNotesViableCommand.h
@@ -0,0 +1,67 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_ADJUSTMENUMAKENOTESVIABLECOMMAND_H_
+#define _RG_ADJUSTMENUMAKENOTESVIABLECOMMAND_H_
+
+#include "document/BasicSelectionCommand.h"
+#include <qstring.h>
+#include <klocale.h>
+
+
+
+
+namespace Rosegarden
+{
+
+class Segment;
+class EventSelection;
+
+
+/// MakeNotesViable works on a selection or entire segment
+class MakeNotesViableCommand : public BasicSelectionCommand
+{
+public:
+ MakeNotesViableCommand(EventSelection &selection) :
+ BasicSelectionCommand(getGlobalName(), selection, true),
+ m_selection(&selection) { }
+
+ MakeNotesViableCommand(Segment &segment) :
+ BasicSelectionCommand(getGlobalName(), segment, true),
+ m_selection(0) { }
+
+ static QString getGlobalName() { return i18n("Tie Notes at &Barlines"); }
+
+protected:
+ virtual void modifySegment();
+
+private:
+ EventSelection *m_selection;// only used on 1st execute (cf bruteForceRedo)
+};
+
+
+}
+
+#endif
diff --git a/src/commands/notation/MakeRegionViableCommand.cpp b/src/commands/notation/MakeRegionViableCommand.cpp
new file mode 100644
index 0000000..597b232
--- /dev/null
+++ b/src/commands/notation/MakeRegionViableCommand.cpp
@@ -0,0 +1,48 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "MakeRegionViableCommand.h"
+
+#include "base/Segment.h"
+#include "base/SegmentNotationHelper.h"
+#include "document/BasicCommand.h"
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+void
+MakeRegionViableCommand::modifySegment()
+{
+ Segment &segment(getSegment());
+ if (segment.getType() != Segment::Internal) return;
+ SegmentNotationHelper helper(segment);
+
+ helper.makeNotesViable(getStartTime(), getEndTime(), true);
+ segment.normalizeRests(getStartTime(), getEndTime());
+}
+
+}
diff --git a/src/commands/notation/MakeRegionViableCommand.h b/src/commands/notation/MakeRegionViableCommand.h
new file mode 100644
index 0000000..64762cb
--- /dev/null
+++ b/src/commands/notation/MakeRegionViableCommand.h
@@ -0,0 +1,62 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_ADJUSTMENUMAKEREGIONVIABLECOMMAND_H_
+#define _RG_ADJUSTMENUMAKEREGIONVIABLECOMMAND_H_
+
+#include "document/BasicCommand.h"
+#include <qstring.h>
+#include "base/Event.h"
+#include <klocale.h>
+
+
+
+
+namespace Rosegarden
+{
+
+class Segment;
+
+
+/// MakeRegionViable works on part of a segment
+class MakeRegionViableCommand : public BasicCommand
+{
+public:
+ MakeRegionViableCommand(Segment &segment,
+ timeT startTime,
+ timeT endTime) :
+ BasicCommand(getGlobalName(), segment, startTime, endTime) { }
+
+ static QString getGlobalName() { return i18n("Tie Notes at &Barlines"); }
+
+protected:
+ virtual void modifySegment();
+};
+
+
+
+}
+
+#endif
diff --git a/src/commands/notation/MultiKeyInsertionCommand.cpp b/src/commands/notation/MultiKeyInsertionCommand.cpp
new file mode 100644
index 0000000..77bf625
--- /dev/null
+++ b/src/commands/notation/MultiKeyInsertionCommand.cpp
@@ -0,0 +1,80 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "MultiKeyInsertionCommand.h"
+
+#include "base/Composition.h"
+#include "base/NotationTypes.h"
+#include "base/Segment.h"
+#include "KeyInsertionCommand.h"
+#include <qstring.h>
+#include "document/RosegardenGUIDoc.h"
+#include "base/Studio.h"
+#include "misc/Debug.h"
+
+
+namespace Rosegarden
+{
+
+MultiKeyInsertionCommand::MultiKeyInsertionCommand(RosegardenGUIDoc* doc,
+ timeT time,
+ Key key,
+ bool convert,
+ bool transpose,
+ bool transposeKey,
+ bool ignorePercussion) :
+ KMacroCommand(getGlobalName(&key))
+{
+ Composition &c = doc->getComposition();
+ Studio &s = doc->getStudio();
+
+ for (Composition::iterator i = c.begin(); i != c.end(); ++i) {
+ Segment *segment = *i;
+
+ Instrument *instrument = s.getInstrumentFor(segment);
+ // if (instrument) {
+ // RG_DEBUG << endl <<
+ // "PERC DEBUG: instrument->isPercussion " << instrument->isPercussion() <<
+ // " ignorePercussion " << ignorePercussion << endl << endl << endl;
+ //}
+ if (instrument) if (instrument->isPercussion() && ignorePercussion) continue;
+
+ // no harm in using getEndTime instead of getEndMarkerTime here:
+ if (segment->getStartTime() <= time && segment->getEndTime() > time) {
+ addCommand(new KeyInsertionCommand(*segment, time, key, convert, transpose, transposeKey,
+ ignorePercussion));
+ } else if (segment->getStartTime() > time) {
+ addCommand(new KeyInsertionCommand(*segment, segment->getStartTime(),
+ key, convert, transpose, transposeKey, ignorePercussion));
+ }
+ }
+}
+
+MultiKeyInsertionCommand::~MultiKeyInsertionCommand()
+{
+ // nothing
+}
+
+}
diff --git a/src/commands/notation/MultiKeyInsertionCommand.h b/src/commands/notation/MultiKeyInsertionCommand.h
new file mode 100644
index 0000000..b8ae152
--- /dev/null
+++ b/src/commands/notation/MultiKeyInsertionCommand.h
@@ -0,0 +1,73 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_MULTIKEYINSERTIONCOMMAND_H_
+#define _RG_MULTIKEYINSERTIONCOMMAND_H_
+
+#include "base/NotationTypes.h"
+#include <qstring.h>
+#include "base/Event.h"
+#include <klocale.h>
+#include "misc/Strings.h"
+#include <kcommand.h>
+#include "document/RosegardenGUIDoc.h"
+
+
+class Add;
+
+
+namespace Rosegarden
+{
+
+//class Composition;
+class RosegardenGUIDoc;
+
+
+class MultiKeyInsertionCommand : public KMacroCommand
+{
+public:
+
+ MultiKeyInsertionCommand(RosegardenGUIDoc* doc,
+ timeT time,
+ Key key,
+ bool shouldConvert,
+ bool shouldTranspose,
+ bool shouldTransposeKey,
+ bool shouldIgnorePercussion);
+ virtual ~MultiKeyInsertionCommand();
+
+ static QString getGlobalName(Key *key = 0) {
+ if (key) {
+ return i18n("Change all to &Key %1...").arg(strtoqstr(key->getName()));
+ } else {
+ return i18n("Add &Key Change...");
+ }
+ }
+};
+
+
+}
+
+#endif
diff --git a/src/commands/notation/NormalizeRestsCommand.cpp b/src/commands/notation/NormalizeRestsCommand.cpp
new file mode 100644
index 0000000..9d96586
--- /dev/null
+++ b/src/commands/notation/NormalizeRestsCommand.cpp
@@ -0,0 +1,52 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "NormalizeRestsCommand.h"
+
+#include "base/Segment.h"
+#include "base/Selection.h"
+#include "document/BasicCommand.h"
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+NormalizeRestsCommand::NormalizeRestsCommand
+(EventSelection &selection) :
+ BasicCommand(getGlobalName(),
+ selection.getSegment(),
+ selection.getStartTime(),
+ selection.getEndTime())
+{
+ // nothing else
+}
+
+void NormalizeRestsCommand::modifySegment()
+{
+ getSegment().normalizeRests(getStartTime(), getEndTime());
+}
+
+}
diff --git a/src/commands/notation/NormalizeRestsCommand.h b/src/commands/notation/NormalizeRestsCommand.h
new file mode 100644
index 0000000..db57920
--- /dev/null
+++ b/src/commands/notation/NormalizeRestsCommand.h
@@ -0,0 +1,64 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_ADJUSTMENUNORMALIZERESTSCOMMAND_H_
+#define _RG_ADJUSTMENUNORMALIZERESTSCOMMAND_H_
+
+#include "document/BasicCommand.h"
+#include <qstring.h>
+#include "base/Event.h"
+#include <klocale.h>
+
+
+
+
+namespace Rosegarden
+{
+
+class Segment;
+class EventSelection;
+
+
+class NormalizeRestsCommand : public BasicCommand
+{
+public:
+ NormalizeRestsCommand(Segment &s,
+ timeT startTime,
+ timeT endTime) :
+ BasicCommand(getGlobalName(), s, startTime, endTime) { }
+
+ NormalizeRestsCommand(EventSelection &selection);
+
+ static QString getGlobalName() { return i18n("&Normalize Rests"); }
+
+protected:
+ virtual void modifySegment();
+};
+
+
+
+}
+
+#endif
diff --git a/src/commands/notation/NoteInsertionCommand.cpp b/src/commands/notation/NoteInsertionCommand.cpp
new file mode 100644
index 0000000..cadae55
--- /dev/null
+++ b/src/commands/notation/NoteInsertionCommand.cpp
@@ -0,0 +1,296 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "NoteInsertionCommand.h"
+
+#include <cmath>
+#include <klocale.h>
+#include "base/Event.h"
+#include "base/NotationTypes.h"
+#include "base/Segment.h"
+#include "base/SegmentMatrixHelper.h"
+#include "base/SegmentNotationHelper.h"
+#include "document/BasicCommand.h"
+#include "gui/editors/notation/NotationProperties.h"
+#include "gui/editors/notation/NoteStyleFactory.h"
+#include "base/BaseProperties.h"
+
+
+namespace Rosegarden
+{
+
+using namespace BaseProperties;
+
+NoteInsertionCommand::NoteInsertionCommand(Segment &segment, timeT time,
+ timeT endTime, Note note, int pitch,
+ Accidental accidental,
+ AutoBeamMode autoBeam,
+ MatrixMode matrixType,
+ GraceMode grace,
+ float targetSubordering,
+ NoteStyleName noteStyle) :
+ BasicCommand(i18n("Insert Note"), segment,
+ getModificationStartTime(segment, time),
+ (autoBeam ? segment.getBarEndForTime(endTime) : endTime)),
+ m_insertionTime(time),
+ m_note(note),
+ m_pitch(pitch),
+ m_accidental(accidental),
+ m_autoBeam(autoBeam == AutoBeamOn),
+ m_matrixType(matrixType == MatrixModeOn),
+ m_grace(grace),
+ m_targetSubordering(targetSubordering),
+ m_noteStyle(noteStyle),
+ m_lastInsertedEvent(0)
+{
+ // nothing
+}
+
+NoteInsertionCommand::~NoteInsertionCommand()
+{
+ // nothing
+}
+
+timeT
+NoteInsertionCommand::getModificationStartTime(Segment &segment,
+ timeT time)
+{
+ // We may be splitting a rest to insert this note, so we'll have
+ // to record the change from the start of that rest rather than
+ // just the start of the note
+
+ timeT barTime = segment.getBarStartForTime(time);
+ Segment::iterator i = segment.findNearestTime(time);
+
+ if (i != segment.end() &&
+ (*i)->getAbsoluteTime() < time &&
+ (*i)->getAbsoluteTime() + (*i)->getDuration() > time &&
+ (*i)->isa(Note::EventRestType)) {
+ return std::min(barTime, (*i)->getAbsoluteTime());
+ }
+
+ return barTime;
+}
+
+void
+NoteInsertionCommand::modifySegment()
+{
+ Segment &segment(getSegment());
+ SegmentNotationHelper helper(segment);
+ Segment::iterator i, j;
+
+ // insert via a model event, so as to apply the note style
+
+ // subordering is always negative for these insertions; round it down
+ int actualSubordering = lrintf(floorf(m_targetSubordering + 0.01));
+ if ((m_grace != GraceModeOff) && actualSubordering >= 0) {
+ actualSubordering = -1;
+ }
+
+ // this is true if the subordering is "more or less" an integer,
+ // as opposed to something like -0.5
+ bool suborderingExact = (actualSubordering !=
+ (lrintf(floorf(m_targetSubordering - 0.01))));
+
+ std::cerr << "actualSubordering = " << actualSubordering
+ << " suborderingExact = " << suborderingExact << std::endl;
+
+ Event *e;
+
+ if (m_grace == GraceModeOff) {
+
+ e = new Event
+ (Note::EventType,
+ m_insertionTime,
+ m_note.getDuration(),
+ 0,
+ m_insertionTime,
+ m_note.getDuration());
+
+ } else {
+
+ e = new Event
+ (Note::EventType,
+ m_insertionTime,
+ 0,
+ actualSubordering == 0 ? -1 : actualSubordering,
+ m_insertionTime,
+ m_note.getDuration());
+ }
+
+ e->set<Int>(PITCH, m_pitch);
+ e->set<Int>(VELOCITY, 100);
+
+ if (m_accidental != Accidentals::NoAccidental) {
+ e->set<String>(ACCIDENTAL, m_accidental);
+ }
+
+ if (m_noteStyle != NoteStyleFactory::DefaultStyle) {
+ e->set<String>(NotationProperties::NOTE_STYLE, m_noteStyle);
+ }
+
+ if (m_grace != GraceModeOff) {
+
+ if (!suborderingExact) {
+
+ // Adjust suborderings of any existing grace notes, if there
+ // is at least one with the same subordering and
+ // suborderingExact is not set
+
+ segment.getTimeSlice(m_insertionTime, i, j);
+ bool collision = false;
+ for (Segment::iterator k = i; k != j; ++k) {
+ if ((*k)->getSubOrdering() == actualSubordering) {
+ collision = true;
+ break;
+ }
+ }
+
+ if (collision) {
+ std::vector<Event *> toInsert, toErase;
+ for (Segment::iterator k = i; k != j; ++k) {
+ if ((*k)->isa(Note::EventType) &&
+ (*k)->getSubOrdering() <= actualSubordering) {
+ toErase.push_back(*k);
+ toInsert.push_back
+ (new Event(**k,
+ (*k)->getAbsoluteTime(),
+ (*k)->getDuration(),
+ (*k)->getSubOrdering() - 1,
+ (*k)->getNotationAbsoluteTime(),
+ (*k)->getNotationDuration()));
+ }
+ }
+ for (std::vector<Event *>::iterator k = toErase.begin();
+ k != toErase.end(); ++k) segment.eraseSingle(*k);
+ for (std::vector<Event *>::iterator k = toInsert.begin();
+ k != toInsert.end(); ++k) segment.insert(*k);
+ }
+ }
+
+ e->set<Bool>(IS_GRACE_NOTE, true);
+ i = segment.insert(e);
+
+ Segment::iterator k;
+ segment.getTimeSlice(m_insertionTime, j, k);
+ Segment::iterator bg0 = segment.end(), bg1 = segment.end();
+ while (j != k) {
+ std::cerr << "testing for truthiness: time " << (*j)->getAbsoluteTime() << ", subordering " << (*j)->getSubOrdering() << std::endl;
+ if ((*j)->isa(Note::EventType) &&
+ (*j)->getSubOrdering() < 0 &&
+ (*j)->has(IS_GRACE_NOTE) &&
+ (*j)->get<Bool>(IS_GRACE_NOTE)) {
+ std::cerr << "truthiful" << std::endl;
+ if (bg0 == segment.end()) bg0 = j;
+ bg1 = j;
+ }
+ ++j;
+ }
+
+ if (bg0 != segment.end() && bg1 != bg0) {
+ if (bg1 != segment.end()) ++bg1;
+ int count = 0;
+ int pso = 0;
+ for (Segment::iterator i = bg0; i != bg1; ++i) {
+ (*i)->unset(BEAMED_GROUP_ID);
+ (*i)->unset(BEAMED_GROUP_TYPE);
+ (*i)->unset(BEAMED_GROUP_TUPLED_COUNT);
+ (*i)->unset(BEAMED_GROUP_UNTUPLED_COUNT);
+ if ((*i)->getSubOrdering() != pso) {
+ ++count;
+ pso = (*i)->getSubOrdering();
+ }
+ }
+ if (m_grace == GraceAndTripletModesOn) {
+ helper.makeBeamedGroupExact(bg0, bg1, GROUP_TYPE_TUPLED);
+ if (count > 1) {
+ for (Segment::iterator i = bg0; i != bg1; ++i) {
+ (*i)->set<Int>(BEAMED_GROUP_TUPLED_COUNT, count-1);
+ (*i)->set<Int>(BEAMED_GROUP_UNTUPLED_COUNT, count);
+ }
+ }
+ } else {
+ helper.makeBeamedGroupExact(bg0, bg1, GROUP_TYPE_BEAMED);
+ }
+ }
+
+ } else {
+
+ // If we're attempting to insert at the same time and pitch as
+ // an existing note, then we remove the existing note first
+ // (so as to change its duration, if the durations differ)
+ segment.getTimeSlice(m_insertionTime, i, j);
+ while (i != j) {
+ if ((*i)->isa(Note::EventType)) {
+ long pitch;
+ if ((*i)->get<Int>(PITCH, pitch) && pitch == m_pitch) {
+ helper.deleteNote(*i);
+ break;
+ }
+ }
+ ++i;
+ }
+
+ if (m_matrixType) {
+ i = SegmentMatrixHelper(segment).insertNote(e);
+ } else {
+ i = helper.insertNote(e);
+ // e is just a model for SegmentNotationHelper::insertNote
+ delete e;
+ }
+ }
+
+ if (i != segment.end()) m_lastInsertedEvent = *i;
+
+ if (m_autoBeam) {
+
+ // We auto-beam the bar if it contains no beamed groups
+ // after the insertion point and if it contains no tupled
+ // groups at all.
+
+ timeT barStartTime = segment.getBarStartForTime(m_insertionTime);
+ timeT barEndTime = segment.getBarEndForTime(m_insertionTime);
+
+ for (Segment::iterator j = i;
+ j != segment.end() && (*j)->getAbsoluteTime() < barEndTime;
+ ++j) {
+ if ((*j)->has(BEAMED_GROUP_ID))
+ return ;
+ }
+
+ for (Segment::iterator j = i;
+ j != segment.end() && (*j)->getAbsoluteTime() >= barStartTime;
+ --j) {
+ if ((*j)->has(BEAMED_GROUP_TUPLET_BASE))
+ return ;
+ if (j == segment.begin())
+ break;
+ }
+
+ helper.autoBeam(m_insertionTime, m_insertionTime, GROUP_TYPE_BEAMED);
+ }
+}
+
+}
diff --git a/src/commands/notation/NoteInsertionCommand.h b/src/commands/notation/NoteInsertionCommand.h
new file mode 100644
index 0000000..9424f1c
--- /dev/null
+++ b/src/commands/notation/NoteInsertionCommand.h
@@ -0,0 +1,98 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_NOTEINSERTIONCOMMAND_H_
+#define _RG_NOTEINSERTIONCOMMAND_H_
+
+#include "base/NotationTypes.h"
+#include "document/BasicCommand.h"
+#include "base/Event.h"
+#include "gui/editors/notation/NoteStyle.h"
+
+
+
+namespace Rosegarden
+{
+
+class Segment;
+class Event;
+
+
+class NoteInsertionCommand : public BasicCommand
+{
+public:
+ enum AutoBeamMode {
+ AutoBeamOff,
+ AutoBeamOn
+ };
+
+ enum MatrixMode {
+ MatrixModeOff,
+ MatrixModeOn
+ };
+
+ enum GraceMode {
+ GraceModeOff,
+ GraceModeOn,
+ GraceAndTripletModesOn
+ };
+
+ NoteInsertionCommand(Segment &segment,
+ timeT time,
+ timeT endTime,
+ Note note,
+ int pitch,
+ Accidental accidental,
+ AutoBeamMode autoBeam,
+ MatrixMode matrixType,
+ GraceMode grace,
+ float targetSubordering,
+ NoteStyleName noteStyle);
+ virtual ~NoteInsertionCommand();
+
+ Event *getLastInsertedEvent() { return m_lastInsertedEvent; }
+
+protected:
+ virtual void modifySegment();
+
+ timeT getModificationStartTime(Segment &, timeT);
+
+ timeT m_insertionTime;
+ Note m_note;
+ int m_pitch;
+ Accidental m_accidental;
+ bool m_autoBeam;
+ bool m_matrixType;
+ GraceMode m_grace;
+ float m_targetSubordering;
+ NoteStyleName m_noteStyle;
+
+ Event *m_lastInsertedEvent;
+};
+
+
+}
+
+#endif
diff --git a/src/commands/notation/RemoveFingeringMarksCommand.cpp b/src/commands/notation/RemoveFingeringMarksCommand.cpp
new file mode 100644
index 0000000..2b66cba
--- /dev/null
+++ b/src/commands/notation/RemoveFingeringMarksCommand.cpp
@@ -0,0 +1,54 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "RemoveFingeringMarksCommand.h"
+
+#include "base/Selection.h"
+#include "document/BasicSelectionCommand.h"
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+void
+RemoveFingeringMarksCommand::modifySegment()
+{
+ EventSelection::eventcontainer::iterator i;
+
+ for (i = m_selection->getSegmentEvents().begin();
+ i != m_selection->getSegmentEvents().end(); ++i) {
+
+ std::vector<Mark> marks = Marks::getMarks(**i);
+ for (std::vector<Mark>::iterator j = marks.begin();
+ j != marks.end(); ++j) {
+ if (Marks::isFingeringMark(*j)) {
+ Marks::removeMark(**i, *j);
+ }
+ }
+ }
+}
+
+}
diff --git a/src/commands/notation/RemoveFingeringMarksCommand.h b/src/commands/notation/RemoveFingeringMarksCommand.h
new file mode 100644
index 0000000..6e02bfc
--- /dev/null
+++ b/src/commands/notation/RemoveFingeringMarksCommand.h
@@ -0,0 +1,61 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_NOTESMENUREMOVEFINGERINGMARKSCOMMAND_H_
+#define _RG_NOTESMENUREMOVEFINGERINGMARKSCOMMAND_H_
+
+#include "document/BasicSelectionCommand.h"
+#include <qstring.h>
+#include <klocale.h>
+
+
+
+
+namespace Rosegarden
+{
+
+class EventSelection;
+
+
+class RemoveFingeringMarksCommand : public BasicSelectionCommand
+{
+public:
+ RemoveFingeringMarksCommand(EventSelection &selection) :
+ BasicSelectionCommand(getGlobalName(), selection, true),
+ m_selection(&selection) { }
+
+ static QString getGlobalName() { return i18n("&Remove Fingerings"); }
+
+protected:
+ virtual void modifySegment();
+
+private:
+ EventSelection *m_selection;// only used on 1st execute (cf bruteForceRedo)
+};
+
+
+}
+
+#endif
diff --git a/src/commands/notation/RemoveMarksCommand.cpp b/src/commands/notation/RemoveMarksCommand.cpp
new file mode 100644
index 0000000..29513c2
--- /dev/null
+++ b/src/commands/notation/RemoveMarksCommand.cpp
@@ -0,0 +1,58 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "RemoveMarksCommand.h"
+
+#include "base/Selection.h"
+#include "document/BasicSelectionCommand.h"
+#include <qstring.h>
+#include "base/BaseProperties.h"
+
+
+namespace Rosegarden
+{
+
+using namespace BaseProperties;
+
+void
+RemoveMarksCommand::modifySegment()
+{
+ EventSelection::eventcontainer::iterator i;
+
+ for (i = m_selection->getSegmentEvents().begin();
+ i != m_selection->getSegmentEvents().end(); ++i) {
+
+ long n = 0;
+ (*i)->get
+ <Int>(MARK_COUNT, n);
+ (*i)->unset(MARK_COUNT);
+
+ for (int j = 0; j < n; ++j) {
+ (*i)->unset(getMarkPropertyName(j));
+ }
+ }
+}
+
+}
diff --git a/src/commands/notation/RemoveMarksCommand.h b/src/commands/notation/RemoveMarksCommand.h
new file mode 100644
index 0000000..d04a1c9
--- /dev/null
+++ b/src/commands/notation/RemoveMarksCommand.h
@@ -0,0 +1,61 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_NOTESMENUREMOVEMARKSCOMMAND_H_
+#define _RG_NOTESMENUREMOVEMARKSCOMMAND_H_
+
+#include "document/BasicSelectionCommand.h"
+#include <qstring.h>
+#include <klocale.h>
+
+
+
+
+namespace Rosegarden
+{
+
+class EventSelection;
+
+
+class RemoveMarksCommand : public BasicSelectionCommand
+{
+public:
+ RemoveMarksCommand(EventSelection &selection) :
+ BasicSelectionCommand(getGlobalName(), selection, true),
+ m_selection(&selection) { }
+
+ static QString getGlobalName() { return i18n("&Remove All Marks"); }
+
+protected:
+ virtual void modifySegment();
+
+private:
+ EventSelection *m_selection;// only used on 1st execute (cf bruteForceRedo)
+};
+
+
+}
+
+#endif
diff --git a/src/commands/notation/RemoveNotationQuantizeCommand.cpp b/src/commands/notation/RemoveNotationQuantizeCommand.cpp
new file mode 100644
index 0000000..9b500fc
--- /dev/null
+++ b/src/commands/notation/RemoveNotationQuantizeCommand.cpp
@@ -0,0 +1,69 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "RemoveNotationQuantizeCommand.h"
+
+#include "base/Event.h"
+#include "base/Selection.h"
+#include "document/BasicSelectionCommand.h"
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+void
+RemoveNotationQuantizeCommand::modifySegment()
+{
+ EventSelection::eventcontainer::iterator i;
+
+ std::vector<Event *> toInsert;
+ std::vector<Event *> toErase;
+
+ for (i = m_selection->getSegmentEvents().begin();
+ i != m_selection->getSegmentEvents().end(); ++i) {
+
+ toInsert.push_back(new Event(**i,
+ (*i)->getAbsoluteTime(),
+ (*i)->getDuration(),
+ (*i)->getSubOrdering(),
+ (*i)->getAbsoluteTime(),
+ (*i)->getDuration()));
+
+ toErase.push_back(*i);
+ }
+
+ for (std::vector<Event *>::iterator i = toErase.begin(); i != toErase.end();
+ ++i) {
+ m_selection->getSegment().eraseSingle(*i);
+ }
+
+ for (std::vector<Event *>::iterator i = toInsert.begin(); i != toInsert.end();
+ ++i) {
+ m_selection->getSegment().insert(*i);
+ }
+}
+
+}
diff --git a/src/commands/notation/RemoveNotationQuantizeCommand.h b/src/commands/notation/RemoveNotationQuantizeCommand.h
new file mode 100644
index 0000000..bc61ff8
--- /dev/null
+++ b/src/commands/notation/RemoveNotationQuantizeCommand.h
@@ -0,0 +1,61 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_ADJUSTMENUREMOVENOTATIONQUANTIZECOMMAND_H_
+#define _RG_ADJUSTMENUREMOVENOTATIONQUANTIZECOMMAND_H_
+
+#include "document/BasicSelectionCommand.h"
+#include <qstring.h>
+#include <klocale.h>
+
+
+
+
+namespace Rosegarden
+{
+
+class EventSelection;
+
+
+class RemoveNotationQuantizeCommand : public BasicSelectionCommand
+{
+public:
+ RemoveNotationQuantizeCommand(EventSelection &selection) :
+ BasicSelectionCommand(getGlobalName(), selection, true),
+ m_selection(&selection) { }
+
+ static QString getGlobalName() { return i18n("Remo&ve Notation Quantization"); }
+
+protected:
+ virtual void modifySegment();
+
+private:
+ EventSelection *m_selection;// only used on 1st execute (cf bruteForceRedo)
+};
+
+
+}
+
+#endif
diff --git a/src/commands/notation/ResetDisplacementsCommand.cpp b/src/commands/notation/ResetDisplacementsCommand.cpp
new file mode 100644
index 0000000..dff8549
--- /dev/null
+++ b/src/commands/notation/ResetDisplacementsCommand.cpp
@@ -0,0 +1,52 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "ResetDisplacementsCommand.h"
+
+#include "base/Selection.h"
+#include "document/BasicSelectionCommand.h"
+#include "base/BaseProperties.h"
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+using namespace BaseProperties;
+
+void
+ResetDisplacementsCommand::modifySegment()
+{
+ EventSelection::eventcontainer::iterator i;
+
+ for (i = m_selection->getSegmentEvents().begin();
+ i != m_selection->getSegmentEvents().end(); ++i) {
+
+ (*i)->unset(DISPLACED_X);
+ (*i)->unset(DISPLACED_Y);
+ }
+}
+
+}
diff --git a/src/commands/notation/ResetDisplacementsCommand.h b/src/commands/notation/ResetDisplacementsCommand.h
new file mode 100644
index 0000000..b1d165b
--- /dev/null
+++ b/src/commands/notation/ResetDisplacementsCommand.h
@@ -0,0 +1,61 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_RESETDISPLACEMENTSCOMMAND_H_
+#define _RG_RESETDISPLACEMENTSCOMMAND_H_
+
+#include "document/BasicSelectionCommand.h"
+#include <qstring.h>
+#include <klocale.h>
+
+
+
+
+namespace Rosegarden
+{
+
+class EventSelection;
+
+
+class ResetDisplacementsCommand : public BasicSelectionCommand
+{
+public:
+ ResetDisplacementsCommand(EventSelection &selection) :
+ BasicSelectionCommand(getGlobalName(), selection, true),
+ m_selection(&selection) { }
+
+ static QString getGlobalName() { return i18n("Restore Positions"); }
+
+protected:
+ virtual void modifySegment();
+
+private:
+ EventSelection *m_selection;// only used on 1st execute (cf bruteForceRedo)
+};
+
+
+}
+
+#endif
diff --git a/src/commands/notation/RespellCommand.cpp b/src/commands/notation/RespellCommand.cpp
new file mode 100644
index 0000000..c410707
--- /dev/null
+++ b/src/commands/notation/RespellCommand.cpp
@@ -0,0 +1,141 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "RespellCommand.h"
+
+#include <klocale.h>
+#include "base/NotationTypes.h"
+#include "base/Selection.h"
+#include "document/BasicSelectionCommand.h"
+#include "base/BaseProperties.h"
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+using namespace BaseProperties;
+using namespace Accidentals;
+
+QString
+RespellCommand::getGlobalName(Type type, Accidental accidental)
+{
+ switch (type) {
+
+ case Set: {
+ QString s(i18n("Respell with %1"));
+ //!!! should be in notationstrings:
+ if (accidental == DoubleSharp) {
+ s = s.arg(i18n("Do&uble Sharp"));
+ } else if (accidental == Sharp) {
+ s = s.arg(i18n("&Sharp"));
+ } else if (accidental == Flat) {
+ s = s.arg(i18n("&Flat"));
+ } else if (accidental == DoubleFlat) {
+ s = s.arg(i18n("Dou&ble Flat"));
+ } else if (accidental == Natural) {
+ s = s.arg(i18n("&Natural"));
+ } else {
+ s = s.arg(i18n("N&one"));
+ }
+ return s;
+ }
+
+ case Up:
+ return i18n("Respell Accidentals &Upward");
+
+ case Down:
+ return i18n("Respell Accidentals &Downward");
+
+ case Restore:
+ return i18n("&Restore Accidentals");
+ }
+
+ return i18n("Respell Accidentals");
+}
+
+void
+RespellCommand::modifySegment()
+{
+ EventSelection::eventcontainer::iterator i;
+
+ for (i = m_selection->getSegmentEvents().begin();
+ i != m_selection->getSegmentEvents().end(); ++i) {
+
+ if ((*i)->isa(Note::EventType)) {
+
+ if (m_type == Up || m_type == Down) {
+
+ Accidental acc = NoAccidental;
+ (*i)->get
+ <String>(ACCIDENTAL, acc);
+
+ if (m_type == Down) {
+ if (acc == DoubleFlat) {
+ acc = Flat;
+ } else if (acc == Flat || acc == NoAccidental) {
+ acc = Sharp;
+ } else if (acc == Sharp) {
+ acc = DoubleSharp;
+ }
+ } else {
+ if (acc == Flat) {
+ acc = DoubleFlat;
+ } else if (acc == Sharp || acc == NoAccidental) {
+ acc = Flat;
+ } else if (acc == DoubleSharp) {
+ acc = Sharp;
+ }
+ }
+
+ (*i)->set
+ <String>(ACCIDENTAL, acc);
+
+ } else if (m_type == Set) {
+
+ // trap respelling black key notes as natural; which is
+ // impossible, and makes rawPitchToDisplayPitch() do crazy
+ // things as a consequence (fixes #1349782)
+ // 1 = C#, 3 = D#, 6 = F#, 8 = G#, 10 = A#
+ long pitch;
+ (*i)->get
+ <Int>(PITCH, pitch);
+ pitch %= 12;
+ if ((pitch == 1 || pitch == 3 || pitch == 6 || pitch == 8 || pitch == 10 )
+ && m_accidental == Natural) {
+ // fail silently; is there anything to do here?
+ } else {
+ (*i)->set
+ <String>(ACCIDENTAL, m_accidental);
+ }
+
+ } else {
+
+ (*i)->unset(ACCIDENTAL);
+ }
+ }
+ }
+}
+
+}
diff --git a/src/commands/notation/RespellCommand.h b/src/commands/notation/RespellCommand.h
new file mode 100644
index 0000000..e2c414f
--- /dev/null
+++ b/src/commands/notation/RespellCommand.h
@@ -0,0 +1,72 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_RESPELLCOMMAND_H_
+#define _RG_RESPELLCOMMAND_H_
+
+#include "document/BasicSelectionCommand.h"
+#include <qstring.h>
+
+
+
+
+namespace Rosegarden
+{
+
+class EventSelection;
+
+
+class RespellCommand : public BasicSelectionCommand
+{
+public:
+ enum Type {
+ Set,
+ Up,
+ Down,
+ Restore
+ };
+
+ RespellCommand(Type type, Accidental acc,
+ EventSelection &selection) :
+ BasicSelectionCommand(getGlobalName(type, acc), selection, true),
+ m_selection(&selection),
+ m_type(type),
+ m_accidental(acc) { }
+
+ static QString getGlobalName(Type type, Accidental acc);
+
+protected:
+ virtual void modifySegment();
+
+private:
+ EventSelection *m_selection;// only used on 1st execute (cf bruteForceRedo)
+ Type m_type;
+ Accidental m_accidental;
+};
+
+
+}
+
+#endif
diff --git a/src/commands/notation/RestInsertionCommand.cpp b/src/commands/notation/RestInsertionCommand.cpp
new file mode 100644
index 0000000..8fff336
--- /dev/null
+++ b/src/commands/notation/RestInsertionCommand.cpp
@@ -0,0 +1,65 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "RestInsertionCommand.h"
+
+#include "base/Event.h"
+#include "base/NotationTypes.h"
+#include "base/Segment.h"
+#include "base/SegmentNotationHelper.h"
+#include "document/BasicCommand.h"
+#include "gui/editors/notation/NoteStyleFactory.h"
+#include "NoteInsertionCommand.h"
+
+
+namespace Rosegarden
+{
+
+RestInsertionCommand::RestInsertionCommand(Segment &segment, timeT time,
+ timeT endTime, Note note) :
+ NoteInsertionCommand(segment, time, endTime, note, 0,
+ Accidentals::NoAccidental,
+ AutoBeamOff, MatrixModeOff, GraceModeOff, 0,
+ NoteStyleFactory::DefaultStyle)
+{
+ setName("Insert Rest");
+}
+
+RestInsertionCommand::~RestInsertionCommand()
+{
+ // nothing
+}
+
+void
+RestInsertionCommand::modifySegment()
+{
+ SegmentNotationHelper helper(getSegment());
+
+ Segment::iterator i = helper.insertRest(m_insertionTime, m_note);
+ if (i != helper.segment().end())
+ m_lastInsertedEvent = *i;
+}
+
+}
diff --git a/src/commands/notation/RestInsertionCommand.h b/src/commands/notation/RestInsertionCommand.h
new file mode 100644
index 0000000..dc3d991
--- /dev/null
+++ b/src/commands/notation/RestInsertionCommand.h
@@ -0,0 +1,58 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_RESTINSERTIONCOMMAND_H_
+#define _RG_RESTINSERTIONCOMMAND_H_
+
+#include "base/NotationTypes.h"
+#include "NoteInsertionCommand.h"
+#include "base/Event.h"
+
+
+
+
+namespace Rosegarden
+{
+
+class Segment;
+
+
+class RestInsertionCommand : public NoteInsertionCommand
+{
+public:
+ RestInsertionCommand(Segment &segment,
+ timeT time,
+ timeT endTime,
+ Note note);
+ virtual ~RestInsertionCommand();
+
+protected:
+ virtual void modifySegment();
+};
+
+
+}
+
+#endif
diff --git a/src/commands/notation/RestoreSlursCommand.cpp b/src/commands/notation/RestoreSlursCommand.cpp
new file mode 100644
index 0000000..4cb2ec8
--- /dev/null
+++ b/src/commands/notation/RestoreSlursCommand.cpp
@@ -0,0 +1,58 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "RestoreSlursCommand.h"
+
+#include "base/NotationTypes.h"
+#include "base/Selection.h"
+#include "document/BasicSelectionCommand.h"
+#include "gui/editors/notation/NotationProperties.h"
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+void
+RestoreSlursCommand::modifySegment()
+{
+ EventSelection::eventcontainer::iterator i;
+
+ for (i = m_selection->getSegmentEvents().begin();
+ i != m_selection->getSegmentEvents().end(); ++i) {
+
+ if ((*i)->isa(Indication::EventType)) {
+ std::string indicationType;
+ if ((*i)->get
+ <String>(Indication::IndicationTypePropertyName, indicationType)
+ && (indicationType == Indication::Slur ||
+ indicationType == Indication::PhrasingSlur)) {
+ (*i)->unset(NotationProperties::SLUR_ABOVE);
+ }
+ }
+ }
+}
+
+}
diff --git a/src/commands/notation/RestoreSlursCommand.h b/src/commands/notation/RestoreSlursCommand.h
new file mode 100644
index 0000000..687d016
--- /dev/null
+++ b/src/commands/notation/RestoreSlursCommand.h
@@ -0,0 +1,62 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_ADJUSTMENURESTORESLURSCOMMAND_H_
+#define _RG_ADJUSTMENURESTORESLURSCOMMAND_H_
+
+#include "document/BasicSelectionCommand.h"
+#include <qstring.h>
+#include <klocale.h>
+
+
+
+
+namespace Rosegarden
+{
+
+class EventSelection;
+
+
+class RestoreSlursCommand : public BasicSelectionCommand
+{
+public:
+ RestoreSlursCommand(EventSelection &selection) :
+ BasicSelectionCommand(getGlobalName(), selection, true),
+ m_selection(&selection) { }
+
+ static QString getGlobalName() { return i18n("&Restore Slur Positions"); }
+
+protected:
+ virtual void modifySegment();
+
+private:
+ EventSelection *m_selection;// only used on 1st execute (cf bruteForceRedo)
+};
+
+
+
+}
+
+#endif
diff --git a/src/commands/notation/RestoreStemsCommand.cpp b/src/commands/notation/RestoreStemsCommand.cpp
new file mode 100644
index 0000000..99709f3
--- /dev/null
+++ b/src/commands/notation/RestoreStemsCommand.cpp
@@ -0,0 +1,52 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "RestoreStemsCommand.h"
+
+#include "base/NotationTypes.h"
+#include "base/Selection.h"
+#include "document/BasicSelectionCommand.h"
+#include "gui/editors/notation/NotationProperties.h"
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+void
+RestoreStemsCommand::modifySegment()
+{
+ EventSelection::eventcontainer::iterator i;
+
+ for (i = m_selection->getSegmentEvents().begin();
+ i != m_selection->getSegmentEvents().end(); ++i) {
+
+ if ((*i)->isa(Note::EventType)) {
+ (*i)->unset(NotationProperties::STEM_UP);
+ }
+ }
+}
+
+}
diff --git a/src/commands/notation/RestoreStemsCommand.h b/src/commands/notation/RestoreStemsCommand.h
new file mode 100644
index 0000000..94dd0cf
--- /dev/null
+++ b/src/commands/notation/RestoreStemsCommand.h
@@ -0,0 +1,62 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_ADJUSTMENURESTORESTEMSCOMMAND_H_
+#define _RG_ADJUSTMENURESTORESTEMSCOMMAND_H_
+
+#include "document/BasicSelectionCommand.h"
+#include <qstring.h>
+#include <klocale.h>
+
+
+
+
+namespace Rosegarden
+{
+
+class EventSelection;
+
+
+class RestoreStemsCommand : public BasicSelectionCommand
+{
+public:
+ RestoreStemsCommand(EventSelection &selection) :
+ BasicSelectionCommand(getGlobalName(), selection, true),
+ m_selection(&selection) { }
+
+ static QString getGlobalName() { return i18n("&Restore Stems"); }
+
+protected:
+ virtual void modifySegment();
+
+private:
+ EventSelection *m_selection;// only used on 1st execute (cf bruteForceRedo)
+};
+
+
+
+}
+
+#endif
diff --git a/src/commands/notation/RestoreTiesCommand.cpp b/src/commands/notation/RestoreTiesCommand.cpp
new file mode 100644
index 0000000..6402361
--- /dev/null
+++ b/src/commands/notation/RestoreTiesCommand.cpp
@@ -0,0 +1,51 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "RestoreTiesCommand.h"
+
+#include "base/NotationTypes.h"
+#include "base/Selection.h"
+#include "document/BasicSelectionCommand.h"
+#include "base/BaseProperties.h"
+#include "gui/editors/notation/NotationProperties.h"
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+void
+RestoreTiesCommand::modifySegment()
+{
+ EventSelection::eventcontainer::iterator i;
+
+ for (i = m_selection->getSegmentEvents().begin();
+ i != m_selection->getSegmentEvents().end(); ++i) {
+
+ (*i)->unset(BaseProperties::TIE_IS_ABOVE);
+ }
+}
+
+}
diff --git a/src/commands/notation/RestoreTiesCommand.h b/src/commands/notation/RestoreTiesCommand.h
new file mode 100644
index 0000000..d3ffef9
--- /dev/null
+++ b/src/commands/notation/RestoreTiesCommand.h
@@ -0,0 +1,62 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_ADJUSTMENURESTORETIESCOMMAND_H_
+#define _RG_ADJUSTMENURESTORETIESCOMMAND_H_
+
+#include "document/BasicSelectionCommand.h"
+#include <qstring.h>
+#include <klocale.h>
+
+
+
+
+namespace Rosegarden
+{
+
+class EventSelection;
+
+
+class RestoreTiesCommand : public BasicSelectionCommand
+{
+public:
+ RestoreTiesCommand(EventSelection &selection) :
+ BasicSelectionCommand(getGlobalName(), selection, true),
+ m_selection(&selection) { }
+
+ static QString getGlobalName() { return i18n("&Restore Tie Positions"); }
+
+protected:
+ virtual void modifySegment();
+
+private:
+ EventSelection *m_selection;// only used on 1st execute (cf bruteForceRedo)
+};
+
+
+
+}
+
+#endif
diff --git a/src/commands/notation/SetVisibilityCommand.cpp b/src/commands/notation/SetVisibilityCommand.cpp
new file mode 100644
index 0000000..c7f49f3
--- /dev/null
+++ b/src/commands/notation/SetVisibilityCommand.cpp
@@ -0,0 +1,57 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "SetVisibilityCommand.h"
+
+#include "base/Selection.h"
+#include "document/BasicSelectionCommand.h"
+#include "base/BaseProperties.h"
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+using namespace BaseProperties;
+
+
+void
+SetVisibilityCommand::modifySegment()
+{
+ EventSelection::eventcontainer::iterator i;
+
+ for (i = m_selection->getSegmentEvents().begin();
+ i != m_selection->getSegmentEvents().end(); ++i) {
+
+ if (m_visible) {
+ (*i)->unset(INVISIBLE);
+ } else {
+ (*i)->set
+ <Bool>(INVISIBLE, true);
+ }
+ }
+}
+
+}
diff --git a/src/commands/notation/SetVisibilityCommand.h b/src/commands/notation/SetVisibilityCommand.h
new file mode 100644
index 0000000..6aef5ef
--- /dev/null
+++ b/src/commands/notation/SetVisibilityCommand.h
@@ -0,0 +1,63 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_SETVISIBILITYCOMMAND_H_
+#define _RG_SETVISIBILITYCOMMAND_H_
+
+#include "document/BasicSelectionCommand.h"
+#include <qstring.h>
+#include <klocale.h>
+
+
+
+
+namespace Rosegarden
+{
+
+class EventSelection;
+
+
+class SetVisibilityCommand : public BasicSelectionCommand
+{
+public:
+ SetVisibilityCommand(EventSelection &selection, bool visible) :
+ BasicSelectionCommand(getGlobalName(), selection, true),
+ m_selection(&selection),
+ m_visible(visible) { }
+
+ static QString getGlobalName() { return i18n("Set Visibility"); }
+
+protected:
+ virtual void modifySegment();
+
+private:
+ EventSelection *m_selection;// only used on 1st execute (cf bruteForceRedo)
+ bool m_visible;
+};
+
+
+}
+
+#endif
diff --git a/src/commands/notation/SustainInsertionCommand.cpp b/src/commands/notation/SustainInsertionCommand.cpp
new file mode 100644
index 0000000..f3c3917
--- /dev/null
+++ b/src/commands/notation/SustainInsertionCommand.cpp
@@ -0,0 +1,66 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "SustainInsertionCommand.h"
+
+#include "base/Event.h"
+#include "base/MidiTypes.h"
+#include "base/Segment.h"
+#include "document/BasicCommand.h"
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+SustainInsertionCommand::SustainInsertionCommand(Segment &segment, timeT time,
+ bool down,
+ int controllerNumber) :
+ BasicCommand(getGlobalName(down), segment, time, time),
+ m_down(down),
+ m_controllerNumber(controllerNumber),
+ m_lastInsertedEvent(0)
+{
+ // nothing
+}
+
+SustainInsertionCommand::~SustainInsertionCommand()
+{
+ // nothing
+}
+
+void
+SustainInsertionCommand::modifySegment()
+{
+ Event *e = new Event(Controller::EventType, getStartTime(), 0,
+ Controller::EventSubOrdering);
+ e->set
+ <Int>(Controller::NUMBER, m_controllerNumber);
+ e->set
+ <Int>(Controller::VALUE, m_down ? 127 : 0);
+ m_lastInsertedEvent = *getSegment().insert(e);
+}
+
+}
diff --git a/src/commands/notation/SustainInsertionCommand.h b/src/commands/notation/SustainInsertionCommand.h
new file mode 100644
index 0000000..ddb93b4
--- /dev/null
+++ b/src/commands/notation/SustainInsertionCommand.h
@@ -0,0 +1,76 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_SUSTAININSERTIONCOMMAND_H_
+#define _RG_SUSTAININSERTIONCOMMAND_H_
+
+#include "document/BasicCommand.h"
+#include <qstring.h>
+#include "base/Event.h"
+#include <klocale.h>
+
+
+class Pedal;
+
+
+namespace Rosegarden
+{
+
+class Segment;
+class Event;
+
+
+class SustainInsertionCommand : public BasicCommand
+{
+public:
+ SustainInsertionCommand(Segment &segment,
+ timeT time,
+ bool down,
+ int controllerNumber);
+ virtual ~SustainInsertionCommand();
+
+ static QString getGlobalName(bool down) {
+ if (down) {
+ return i18n("Add Pedal &Press");
+ } else {
+ return i18n("Add Pedal &Release");
+ }
+ }
+
+ Event *getLastInsertedEvent() { return m_lastInsertedEvent; }
+
+protected:
+ virtual void modifySegment();
+
+ bool m_down;
+ int m_controllerNumber;
+ Event *m_lastInsertedEvent;
+};
+
+
+
+}
+
+#endif
diff --git a/src/commands/notation/TextChangeCommand.cpp b/src/commands/notation/TextChangeCommand.cpp
new file mode 100644
index 0000000..e909839
--- /dev/null
+++ b/src/commands/notation/TextChangeCommand.cpp
@@ -0,0 +1,62 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "TextChangeCommand.h"
+
+#include <klocale.h>
+#include "base/Event.h"
+#include "base/NotationTypes.h"
+#include "base/Segment.h"
+#include "document/BasicCommand.h"
+
+
+namespace Rosegarden
+{
+
+TextChangeCommand::TextChangeCommand(Segment &segment,
+ Event *event,
+ Text text) :
+ BasicCommand(i18n("Edit Text"), segment,
+ event->getAbsoluteTime(), event->getAbsoluteTime() + 1,
+ true), // bruteForceRedo
+ m_event(event),
+ m_text(text)
+{
+ // nothing
+}
+
+TextChangeCommand::~TextChangeCommand()
+{}
+
+void
+TextChangeCommand::modifySegment()
+{
+ m_event->set
+ <String>(Text::TextTypePropertyName, m_text.getTextType());
+ m_event->set
+ <String>(Text::TextPropertyName, m_text.getText());
+}
+
+}
diff --git a/src/commands/notation/TextChangeCommand.h b/src/commands/notation/TextChangeCommand.h
new file mode 100644
index 0000000..5dce48e
--- /dev/null
+++ b/src/commands/notation/TextChangeCommand.h
@@ -0,0 +1,63 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_TEXTCHANGECOMMAND_H_
+#define _RG_TEXTCHANGECOMMAND_H_
+
+#include "base/NotationTypes.h"
+#include "document/BasicCommand.h"
+
+
+
+
+namespace Rosegarden
+{
+
+class Segment;
+class Event;
+
+
+class TextChangeCommand : public BasicCommand
+{
+public:
+ TextChangeCommand(Segment &segment,
+ Event *event,
+ Text text);
+ virtual ~TextChangeCommand();
+
+protected:
+ virtual void modifySegment();
+ Event *m_event; // only used first time through
+ Text m_text;
+};
+
+/*
+ * Inserts a key change into a single segment, taking segment transpose into
+ * account (fixes #1520716) if desired.
+ */
+
+}
+
+#endif
diff --git a/src/commands/notation/TextInsertionCommand.cpp b/src/commands/notation/TextInsertionCommand.cpp
new file mode 100644
index 0000000..8ba94c9
--- /dev/null
+++ b/src/commands/notation/TextInsertionCommand.cpp
@@ -0,0 +1,63 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "TextInsertionCommand.h"
+
+#include <klocale.h>
+#include "base/Event.h"
+#include "base/NotationTypes.h"
+#include "base/Segment.h"
+#include "base/SegmentNotationHelper.h"
+#include "document/BasicCommand.h"
+
+
+namespace Rosegarden
+{
+
+TextInsertionCommand::TextInsertionCommand(Segment &segment, timeT time,
+ Text text) :
+ BasicCommand(i18n("Insert Text"), segment, time, time + 1),
+ m_text(text),
+ m_lastInsertedEvent(0)
+{
+ // nothing
+}
+
+TextInsertionCommand::~TextInsertionCommand()
+{
+ // nothing
+}
+
+void
+TextInsertionCommand::modifySegment()
+{
+ SegmentNotationHelper helper(getSegment());
+
+ Segment::iterator i = helper.insertText(getStartTime(), m_text);
+ if (i != helper.segment().end())
+ m_lastInsertedEvent = *i;
+}
+
+}
diff --git a/src/commands/notation/TextInsertionCommand.h b/src/commands/notation/TextInsertionCommand.h
new file mode 100644
index 0000000..34b574f
--- /dev/null
+++ b/src/commands/notation/TextInsertionCommand.h
@@ -0,0 +1,63 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_TEXTINSERTIONCOMMAND_H_
+#define _RG_TEXTINSERTIONCOMMAND_H_
+
+#include "base/NotationTypes.h"
+#include "document/BasicCommand.h"
+#include "base/Event.h"
+
+
+
+
+namespace Rosegarden
+{
+
+class Segment;
+class Event;
+
+
+class TextInsertionCommand : public BasicCommand
+{
+public:
+ TextInsertionCommand(Segment &segment,
+ timeT time,
+ Text text);
+ virtual ~TextInsertionCommand();
+
+ Event *getLastInsertedEvent() { return m_lastInsertedEvent; }
+
+protected:
+ virtual void modifySegment();
+
+ Text m_text;
+ Event *m_lastInsertedEvent;
+};
+
+
+}
+
+#endif
diff --git a/src/commands/notation/TieNotesCommand.cpp b/src/commands/notation/TieNotesCommand.cpp
new file mode 100644
index 0000000..18b8188
--- /dev/null
+++ b/src/commands/notation/TieNotesCommand.cpp
@@ -0,0 +1,72 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "TieNotesCommand.h"
+
+#include "base/Segment.h"
+#include "base/SegmentNotationHelper.h"
+#include "base/Selection.h"
+#include "document/BasicSelectionCommand.h"
+#include "base/BaseProperties.h"
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+using namespace BaseProperties;
+
+void
+TieNotesCommand::modifySegment()
+{
+ Segment &segment(getSegment());
+ SegmentNotationHelper helper(segment);
+
+ //!!! move part of this to SegmentNotationHelper?
+
+ for (EventSelection::eventcontainer::iterator i =
+ m_selection->getSegmentEvents().begin();
+ i != m_selection->getSegmentEvents().end(); ++i) {
+
+ // bool tiedForward;
+ // if ((*i)->get<Bool>(TIED_FORWARD, tiedForward) && tiedForward) {
+ // continue;
+ // }
+
+ Segment::iterator si = segment.findSingle(*i);
+ Segment::iterator sj;
+ while ((sj = helper.getNextAdjacentNote(si, true, false)) !=
+ segment.end()) {
+ if (!m_selection->contains(*sj))
+ break;
+ (*si)->set<Bool>(TIED_FORWARD, true);
+ (*si)->unset(TIE_IS_ABOVE);
+ (*sj)->set<Bool>(TIED_BACKWARD, true);
+ si = sj;
+ }
+ }
+}
+
+}
diff --git a/src/commands/notation/TieNotesCommand.h b/src/commands/notation/TieNotesCommand.h
new file mode 100644
index 0000000..2f1874f
--- /dev/null
+++ b/src/commands/notation/TieNotesCommand.h
@@ -0,0 +1,62 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_NOTESMENUTIENOTESCOMMAND_H_
+#define _RG_NOTESMENUTIENOTESCOMMAND_H_
+
+#include "document/BasicSelectionCommand.h"
+#include <qstring.h>
+#include <klocale.h>
+
+
+
+
+namespace Rosegarden
+{
+
+class EventSelection;
+
+
+class TieNotesCommand : public BasicSelectionCommand
+{
+public:
+ TieNotesCommand(EventSelection &selection) :
+ BasicSelectionCommand(getGlobalName(), selection, true),
+ m_selection(&selection) { }
+
+ static QString getGlobalName() { return i18n("&Tie"); }
+
+protected:
+ virtual void modifySegment();
+
+private:
+ EventSelection *m_selection;// only used on 1st execute (cf bruteForceRedo)
+};
+
+
+
+}
+
+#endif
diff --git a/src/commands/notation/TupletCommand.cpp b/src/commands/notation/TupletCommand.cpp
new file mode 100644
index 0000000..b46fff5
--- /dev/null
+++ b/src/commands/notation/TupletCommand.cpp
@@ -0,0 +1,91 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "TupletCommand.h"
+
+#include "base/Event.h"
+#include "base/Segment.h"
+#include "base/SegmentNotationHelper.h"
+#include "document/BasicCommand.h"
+#include "base/BaseProperties.h"
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+using namespace BaseProperties;
+
+TupletCommand::TupletCommand(Segment &segment,
+ timeT startTime,
+ timeT unit,
+ int untupled, int tupled,
+ bool hasTimingAlready) :
+ BasicCommand(getGlobalName((untupled == 3) && (tupled == 2)),
+ segment, startTime, startTime + (unit * untupled)),
+ m_unit(unit),
+ m_untupled(untupled),
+ m_tupled(tupled),
+ m_hasTimingAlready(hasTimingAlready)
+{
+ // nothing else
+}
+
+void
+TupletCommand::modifySegment()
+{
+ if (m_hasTimingAlready) {
+
+ int groupId = getSegment().getNextId();
+
+ for (Segment::iterator i = getSegment().findTime(getStartTime());
+ getSegment().isBeforeEndMarker(i); ++i) {
+
+ if ((*i)->getNotationAbsoluteTime() >=
+ getStartTime() + (m_unit * m_tupled))
+ break;
+
+ Event *e = *i;
+
+ e->set
+ <Int>(BEAMED_GROUP_ID, groupId);
+ e->set
+ <String>(BEAMED_GROUP_TYPE, GROUP_TYPE_TUPLED);
+
+ e->set
+ <Int>(BEAMED_GROUP_TUPLET_BASE, m_unit);
+ e->set
+ <Int>(BEAMED_GROUP_TUPLED_COUNT, m_tupled);
+ e->set
+ <Int>(BEAMED_GROUP_UNTUPLED_COUNT, m_untupled);
+ }
+
+ } else {
+ SegmentNotationHelper helper(getSegment());
+ helper.makeTupletGroup(getStartTime(), m_untupled, m_tupled, m_unit);
+ }
+}
+
+}
diff --git a/src/commands/notation/TupletCommand.h b/src/commands/notation/TupletCommand.h
new file mode 100644
index 0000000..b08a204
--- /dev/null
+++ b/src/commands/notation/TupletCommand.h
@@ -0,0 +1,71 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_ADJUSTMENUTUPLETCOMMAND_H_
+#define _RG_ADJUSTMENUTUPLETCOMMAND_H_
+
+#include "document/BasicCommand.h"
+#include <qstring.h>
+#include "base/Event.h"
+#include <klocale.h>
+
+
+
+
+namespace Rosegarden
+{
+
+class Segment;
+
+
+class TupletCommand : public BasicCommand
+{
+public:
+ TupletCommand(Segment &segment,
+ timeT startTime,
+ timeT unit,
+ int untupled = 3, int tupled = 2,
+ bool groupHasTimingAlready = false);
+
+ static QString getGlobalName(bool simple = true) {
+ if (simple) return i18n("&Triplet");
+ else return i18n("Tu&plet...");
+ }
+
+protected:
+ virtual void modifySegment();
+
+private:
+ timeT m_unit;
+ int m_untupled;
+ int m_tupled;
+ bool m_hasTimingAlready;
+};
+
+
+
+}
+
+#endif
diff --git a/src/commands/notation/UnGraceCommand.cpp b/src/commands/notation/UnGraceCommand.cpp
new file mode 100644
index 0000000..7eb0343
--- /dev/null
+++ b/src/commands/notation/UnGraceCommand.cpp
@@ -0,0 +1,42 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "UnGraceCommand.h"
+
+#include "base/Selection.h"
+#include "document/BasicSelectionCommand.h"
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+void
+UnGraceCommand::modifySegment()
+{
+ //!!!
+}
+
+}
diff --git a/src/commands/notation/UnGraceCommand.h b/src/commands/notation/UnGraceCommand.h
new file mode 100644
index 0000000..cdaf244
--- /dev/null
+++ b/src/commands/notation/UnGraceCommand.h
@@ -0,0 +1,58 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_ADJUSTMENUUNGRACECOMMAND_H_
+#define _RG_ADJUSTMENUUNGRACECOMMAND_H_
+
+#include "document/BasicSelectionCommand.h"
+#include <qstring.h>
+#include <klocale.h>
+
+
+
+
+namespace Rosegarden
+{
+
+class EventSelection;
+
+
+class UnGraceCommand : public BasicSelectionCommand
+{
+public:
+ UnGraceCommand(EventSelection &selection) :
+ BasicSelectionCommand(getGlobalName(), selection) { }
+
+ static QString getGlobalName() { return i18n("Ung&race"); }
+
+protected:
+ virtual void modifySegment();
+};
+
+
+
+}
+
+#endif
diff --git a/src/commands/notation/UnTupletCommand.cpp b/src/commands/notation/UnTupletCommand.cpp
new file mode 100644
index 0000000..0a4b85e
--- /dev/null
+++ b/src/commands/notation/UnTupletCommand.cpp
@@ -0,0 +1,54 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "UnTupletCommand.h"
+
+#include "base/Selection.h"
+#include "document/BasicSelectionCommand.h"
+#include "base/BaseProperties.h"
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+using namespace BaseProperties;
+
+void
+UnTupletCommand::modifySegment()
+{
+ for (EventSelection::eventcontainer::iterator i =
+ m_selection->getSegmentEvents().begin();
+ i != m_selection->getSegmentEvents().end(); ++i) {
+
+ (*i)->unset(BEAMED_GROUP_ID);
+ (*i)->unset(BEAMED_GROUP_TYPE);
+ (*i)->unset(BEAMED_GROUP_TUPLET_BASE);
+ (*i)->unset(BEAMED_GROUP_TUPLED_COUNT);
+ (*i)->unset(BEAMED_GROUP_UNTUPLED_COUNT);
+ }
+}
+
+}
diff --git a/src/commands/notation/UnTupletCommand.h b/src/commands/notation/UnTupletCommand.h
new file mode 100644
index 0000000..76aabe4
--- /dev/null
+++ b/src/commands/notation/UnTupletCommand.h
@@ -0,0 +1,62 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_ADJUSTMENUUNTUPLETCOMMAND_H_
+#define _RG_ADJUSTMENUUNTUPLETCOMMAND_H_
+
+#include "document/BasicSelectionCommand.h"
+#include <qstring.h>
+#include <klocale.h>
+
+
+
+
+namespace Rosegarden
+{
+
+class EventSelection;
+
+
+class UnTupletCommand : public BasicSelectionCommand
+{
+public:
+ UnTupletCommand(EventSelection &selection) :
+ BasicSelectionCommand(getGlobalName(), selection, true),
+ m_selection(&selection) { }
+
+ static QString getGlobalName() {
+ return i18n("&Untuplet");
+ }
+
+protected:
+ virtual void modifySegment();
+ EventSelection *m_selection;// only used on 1st execute (cf bruteForceRedo)
+};
+
+
+
+}
+
+#endif
diff --git a/src/commands/notation/UntieNotesCommand.cpp b/src/commands/notation/UntieNotesCommand.cpp
new file mode 100644
index 0000000..e32d605
--- /dev/null
+++ b/src/commands/notation/UntieNotesCommand.cpp
@@ -0,0 +1,52 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "UntieNotesCommand.h"
+
+#include "base/Selection.h"
+#include "document/BasicSelectionCommand.h"
+#include <qstring.h>
+#include "base/BaseProperties.h"
+
+
+namespace Rosegarden
+{
+
+using namespace BaseProperties;
+
+void
+UntieNotesCommand::modifySegment()
+{
+ for (EventSelection::eventcontainer::iterator i =
+ m_selection->getSegmentEvents().begin();
+ i != m_selection->getSegmentEvents().end(); ++i) {
+
+ (*i)->unset(TIED_FORWARD);
+ (*i)->unset(TIE_IS_ABOVE);
+ (*i)->unset(TIED_BACKWARD);
+ }
+}
+
+}
diff --git a/src/commands/notation/UntieNotesCommand.h b/src/commands/notation/UntieNotesCommand.h
new file mode 100644
index 0000000..3f57413
--- /dev/null
+++ b/src/commands/notation/UntieNotesCommand.h
@@ -0,0 +1,62 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_ADJUSTMENUUNTIENOTESCOMMAND_H_
+#define _RG_ADJUSTMENUUNTIENOTESCOMMAND_H_
+
+#include "document/BasicSelectionCommand.h"
+#include <qstring.h>
+#include <klocale.h>
+
+
+
+
+namespace Rosegarden
+{
+
+class EventSelection;
+
+
+class UntieNotesCommand : public BasicSelectionCommand
+{
+public:
+ UntieNotesCommand(EventSelection &selection) :
+ BasicSelectionCommand(getGlobalName(), selection, true),
+ m_selection(&selection) { }
+
+ static QString getGlobalName() { return i18n("&Untie"); }
+
+protected:
+ virtual void modifySegment();
+
+private:
+ EventSelection *m_selection;// only used on 1st execute (cf bruteForceRedo)
+};
+
+
+
+}
+
+#endif
diff --git a/src/commands/segment/AddTempoChangeCommand.cpp b/src/commands/segment/AddTempoChangeCommand.cpp
new file mode 100644
index 0000000..6665215
--- /dev/null
+++ b/src/commands/segment/AddTempoChangeCommand.cpp
@@ -0,0 +1,66 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "AddTempoChangeCommand.h"
+
+#include "base/Composition.h"
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+AddTempoChangeCommand::~AddTempoChangeCommand()
+{
+ // nothing here either
+}
+
+void
+AddTempoChangeCommand::execute()
+{
+ int oldIndex = m_composition->getTempoChangeNumberAt(m_time);
+
+ if (oldIndex >= 0) {
+ std::pair<timeT, tempoT> data =
+ m_composition->getTempoChange(oldIndex);
+
+ if (data.first == m_time)
+ m_oldTempo = data.second;
+ }
+
+ m_tempoChangeIndex = m_composition->addTempoAtTime(m_time, m_tempo, m_target);
+}
+
+void
+AddTempoChangeCommand::unexecute()
+{
+ m_composition->removeTempoChange(m_tempoChangeIndex);
+
+ if (m_oldTempo != 0) {
+ m_composition->addTempoAtTime(m_time, m_oldTempo);
+ }
+}
+
+}
diff --git a/src/commands/segment/AddTempoChangeCommand.h b/src/commands/segment/AddTempoChangeCommand.h
new file mode 100644
index 0000000..07036dd
--- /dev/null
+++ b/src/commands/segment/AddTempoChangeCommand.h
@@ -0,0 +1,76 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_ADDTEMPOCHANGECOMMAND_H_
+#define _RG_ADDTEMPOCHANGECOMMAND_H_
+
+#include <kcommand.h>
+#include <qstring.h>
+#include "base/Event.h"
+#include "base/Composition.h" // for tempoT
+#include <klocale.h>
+
+
+
+
+namespace Rosegarden
+{
+
+class AddTempoChangeCommand : public KNamedCommand
+{
+public:
+ AddTempoChangeCommand(Composition *composition,
+ timeT time,
+ tempoT tempo,
+ tempoT target = -1):
+ KNamedCommand(getGlobalName()),
+ m_composition(composition),
+ m_time(time),
+ m_tempo(tempo),
+ m_target(target),
+ m_oldTempo(0),
+ m_tempoChangeIndex(0) {}
+
+ virtual ~AddTempoChangeCommand();
+
+ static QString getGlobalName() { return i18n("Add Te&mpo Change..."); }
+
+ virtual void execute();
+ virtual void unexecute();
+
+private:
+ Composition *m_composition;
+ timeT m_time;
+ tempoT m_tempo;
+ tempoT m_target;
+ tempoT m_oldTempo;
+ int m_tempoChangeIndex;
+};
+
+
+
+}
+
+#endif
diff --git a/src/commands/segment/AddTimeSignatureAndNormalizeCommand.cpp b/src/commands/segment/AddTimeSignatureAndNormalizeCommand.cpp
new file mode 100644
index 0000000..45b391b
--- /dev/null
+++ b/src/commands/segment/AddTimeSignatureAndNormalizeCommand.cpp
@@ -0,0 +1,78 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "AddTimeSignatureAndNormalizeCommand.h"
+
+#include "AddTimeSignatureCommand.h"
+#include "base/Composition.h"
+#include "base/NotationTypes.h"
+#include "commands/notation/MakeRegionViableCommand.h"
+
+
+namespace Rosegarden
+{
+
+AddTimeSignatureAndNormalizeCommand::AddTimeSignatureAndNormalizeCommand
+(Composition *composition, timeT time, TimeSignature timeSig) :
+ KMacroCommand(AddTimeSignatureCommand::getGlobalName())
+{
+ addCommand(new AddTimeSignatureCommand(composition, time, timeSig));
+
+ // only up to the next time signature
+ timeT nextTimeSigTime(composition->getDuration());
+
+ int index = composition->getTimeSignatureNumberAt(time);
+ if (composition->getTimeSignatureCount() > index + 1) {
+ nextTimeSigTime = composition->getTimeSignatureChange(index + 1).first;
+ }
+
+ for (Composition::iterator i = composition->begin();
+ i != composition->end(); ++i) {
+
+ if ((*i)->getType() != Segment::Internal) continue;
+
+ timeT startTime = (*i)->getStartTime();
+ timeT endTime = (*i)->getEndTime();
+
+ if (startTime >= nextTimeSigTime || endTime <= time)
+ continue;
+
+ // "Make Notes Viable" splits and ties notes at barlines, and
+ // also does a rest normalize. It's what we normally want
+ // when adding a time signature.
+
+ addCommand(new MakeRegionViableCommand
+ (**i,
+ std::max(startTime, time),
+ std::min(endTime, nextTimeSigTime)));
+ }
+}
+
+AddTimeSignatureAndNormalizeCommand::~AddTimeSignatureAndNormalizeCommand()
+{
+ // well, nothing really
+}
+
+}
diff --git a/src/commands/segment/AddTimeSignatureAndNormalizeCommand.h b/src/commands/segment/AddTimeSignatureAndNormalizeCommand.h
new file mode 100644
index 0000000..f22faa4
--- /dev/null
+++ b/src/commands/segment/AddTimeSignatureAndNormalizeCommand.h
@@ -0,0 +1,53 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_ADDTIMESIGNATUREANDNORMALIZECOMMAND_H_
+#define _RG_ADDTIMESIGNATUREANDNORMALIZECOMMAND_H_
+
+#include "base/NotationTypes.h"
+#include "base/Event.h"
+#include <kcommand.h>
+
+
+namespace Rosegarden
+{
+
+class Composition;
+
+
+class AddTimeSignatureAndNormalizeCommand : public KMacroCommand
+{
+public:
+ AddTimeSignatureAndNormalizeCommand(Composition *composition,
+ timeT time,
+ TimeSignature timeSig);
+ virtual ~AddTimeSignatureAndNormalizeCommand();
+};
+
+
+
+}
+
+#endif
diff --git a/src/commands/segment/AddTimeSignatureCommand.cpp b/src/commands/segment/AddTimeSignatureCommand.cpp
new file mode 100644
index 0000000..88f2d07
--- /dev/null
+++ b/src/commands/segment/AddTimeSignatureCommand.cpp
@@ -0,0 +1,78 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "AddTimeSignatureCommand.h"
+
+#include "base/Composition.h"
+#include "base/NotationTypes.h"
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+AddTimeSignatureCommand::AddTimeSignatureCommand(Composition *composition,
+ timeT time,
+ TimeSignature timeSig) :
+ KNamedCommand(getGlobalName()),
+ m_composition(composition),
+ m_time(time),
+ m_timeSignature(timeSig),
+ m_oldTimeSignature(0)
+{
+ // nothing else
+}
+
+AddTimeSignatureCommand::~AddTimeSignatureCommand()
+{
+ if (m_oldTimeSignature)
+ delete m_oldTimeSignature;
+}
+
+void
+AddTimeSignatureCommand::execute()
+{
+ int oldIndex = m_composition->getTimeSignatureNumberAt(m_time);
+ if (oldIndex >= 0) {
+ std::pair<timeT, TimeSignature> data =
+ m_composition->getTimeSignatureChange(oldIndex);
+ if (data.first == m_time) {
+ m_oldTimeSignature = new TimeSignature(data.second);
+ }
+ }
+
+ m_timeSigIndex = m_composition->addTimeSignature(m_time, m_timeSignature);
+}
+
+void
+AddTimeSignatureCommand::unexecute()
+{
+ m_composition->removeTimeSignature(m_timeSigIndex);
+ if (m_oldTimeSignature) {
+ m_composition->addTimeSignature(m_time, *m_oldTimeSignature);
+ }
+}
+
+}
diff --git a/src/commands/segment/AddTimeSignatureCommand.h b/src/commands/segment/AddTimeSignatureCommand.h
new file mode 100644
index 0000000..fbc875d
--- /dev/null
+++ b/src/commands/segment/AddTimeSignatureCommand.h
@@ -0,0 +1,71 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_ADDTIMESIGNATURECOMMAND_H_
+#define _RG_ADDTIMESIGNATURECOMMAND_H_
+
+#include "base/NotationTypes.h"
+#include <kcommand.h>
+#include <qstring.h>
+#include "base/Event.h"
+#include <klocale.h>
+
+
+
+
+namespace Rosegarden
+{
+
+class Composition;
+
+
+class AddTimeSignatureCommand : public KNamedCommand
+{
+public:
+ AddTimeSignatureCommand(Composition *composition,
+ timeT time,
+ TimeSignature timeSig);
+ virtual ~AddTimeSignatureCommand();
+
+ static QString getGlobalName() { return i18n("Add Time Si&gnature Change..."); }
+
+ virtual void execute();
+ virtual void unexecute();
+
+protected:
+ Composition *m_composition;
+ timeT m_time;
+ TimeSignature m_timeSignature;
+
+ TimeSignature *m_oldTimeSignature; // for undo
+ int m_timeSigIndex; // for undo
+};
+
+
+
+
+}
+
+#endif
diff --git a/src/commands/segment/AddTracksCommand.cpp b/src/commands/segment/AddTracksCommand.cpp
new file mode 100644
index 0000000..1f09227
--- /dev/null
+++ b/src/commands/segment/AddTracksCommand.cpp
@@ -0,0 +1,137 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "AddTracksCommand.h"
+
+#include "misc/Debug.h"
+#include "base/Composition.h"
+#include "base/MidiProgram.h"
+#include "base/Track.h"
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+AddTracksCommand::AddTracksCommand(Composition *composition,
+ unsigned int nbTracks,
+ InstrumentId id,
+ int position):
+ KNamedCommand(getGlobalName()),
+ m_composition(composition),
+ m_nbNewTracks(nbTracks),
+ m_instrumentId(id),
+ m_position(position),
+ m_detached(false)
+
+{
+}
+
+AddTracksCommand::~AddTracksCommand()
+{
+ if (m_detached) {
+ for (unsigned int i = 0; i < m_newTracks.size(); ++i)
+ delete m_newTracks[i];
+ }
+}
+
+void AddTracksCommand::execute()
+{
+ // Re-attach tracks
+ //
+ if (m_detached) {
+
+ for (unsigned int i = 0; i < m_newTracks.size(); i++) {
+ m_composition->addTrack(m_newTracks[i]);
+ }
+
+ for (TrackPositionMap::iterator i = m_oldPositions.begin();
+ i != m_oldPositions.end(); ++i) {
+
+ int newPosition = i->second + m_nbNewTracks;
+ Track *track = m_composition->getTrackById(i->first);
+ if (track) track->setPosition(newPosition);
+ }
+
+ return;
+ }
+
+ int highPosition = 0;
+
+ for (Composition::trackiterator it = m_composition->getTracks().begin();
+ it != m_composition->getTracks().end(); ++it) {
+
+ int pos = it->second->getPosition();
+
+ if (pos > highPosition) {
+ highPosition = pos;
+ }
+ }
+
+ if (m_position == -1) m_position = highPosition + 1;
+ if (m_position < 0) m_position = 0;
+ if (m_position > highPosition + 1) m_position = highPosition + 1;
+
+ for (Composition::trackiterator it = m_composition->getTracks().begin();
+ it != m_composition->getTracks().end(); ++it) {
+
+ int pos = it->second->getPosition();
+
+ if (pos >= m_position) {
+ m_oldPositions[it->first] = pos;
+ it->second->setPosition(pos + m_nbNewTracks);
+ }
+ }
+
+ for (unsigned int i = 0; i < m_nbNewTracks; ++i) {
+
+ TrackId trackId = m_composition->getNewTrackId();
+ Track *track = new Track(trackId);
+
+ track->setPosition(m_position + i);
+ track->setInstrument(m_instrumentId);
+
+ m_composition->addTrack(track);
+ m_newTracks.push_back(track);
+ }
+}
+
+void AddTracksCommand::unexecute()
+{
+ for (unsigned int i = 0; i < m_newTracks.size(); i++) {
+ m_composition->detachTrack(m_newTracks[i]);
+ }
+
+ for (TrackPositionMap::iterator i = m_oldPositions.begin();
+ i != m_oldPositions.end(); ++i) {
+
+ Track *track = m_composition->getTrackById(i->first);
+ if (track) track->setPosition(i->second);
+ }
+
+ m_detached = true;
+}
+
+}
diff --git a/src/commands/segment/AddTracksCommand.h b/src/commands/segment/AddTracksCommand.h
new file mode 100644
index 0000000..d3e09ca
--- /dev/null
+++ b/src/commands/segment/AddTracksCommand.h
@@ -0,0 +1,77 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_ADDTRACKSCOMMAND_H_
+#define _RG_ADDTRACKSCOMMAND_H_
+
+#include "base/MidiProgram.h"
+#include "base/Composition.h"
+#include <kcommand.h>
+#include <qstring.h>
+#include <vector>
+#include <map>
+#include <klocale.h>
+
+
+
+namespace Rosegarden
+{
+
+class Track;
+class Composition;
+
+
+class AddTracksCommand : public KNamedCommand
+{
+public:
+ AddTracksCommand(Composition *composition,
+ unsigned int nbTracks,
+ InstrumentId id,
+ int position); // -1 -> at end
+ virtual ~AddTracksCommand();
+
+ static QString getGlobalName() { return i18n("Add Tracks..."); }
+
+ virtual void execute();
+ virtual void unexecute();
+
+protected:
+ Composition *m_composition;
+ unsigned int m_nbNewTracks;
+ InstrumentId m_instrumentId;
+ int m_position;
+
+ typedef std::map<TrackId, int> TrackPositionMap;
+
+ std::vector<Track *> m_newTracks;
+ TrackPositionMap m_oldPositions;
+
+ bool m_detached;
+};
+
+
+}
+
+#endif
diff --git a/src/commands/segment/AddTriggerSegmentCommand.cpp b/src/commands/segment/AddTriggerSegmentCommand.cpp
new file mode 100644
index 0000000..12d406e
--- /dev/null
+++ b/src/commands/segment/AddTriggerSegmentCommand.cpp
@@ -0,0 +1,90 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "AddTriggerSegmentCommand.h"
+
+#include <klocale.h>
+#include "base/Composition.h"
+#include "base/Segment.h"
+#include "base/TriggerSegment.h"
+#include "document/RosegardenGUIDoc.h"
+
+
+namespace Rosegarden
+{
+
+AddTriggerSegmentCommand::AddTriggerSegmentCommand(RosegardenGUIDoc *doc,
+ timeT duration,
+ int basePitch,
+ int baseVelocity) :
+ KNamedCommand(i18n("Add Triggered Segment")),
+ m_composition(&doc->getComposition()),
+ m_duration(duration),
+ m_basePitch(basePitch),
+ m_baseVelocity(baseVelocity),
+ m_id(0),
+ m_segment(0),
+ m_detached(false)
+{
+ // nothing else
+}
+
+AddTriggerSegmentCommand::~AddTriggerSegmentCommand()
+{
+ if (m_detached)
+ delete m_segment;
+}
+
+TriggerSegmentId
+AddTriggerSegmentCommand::getId() const
+{
+ return m_id;
+}
+
+void
+AddTriggerSegmentCommand::execute()
+{
+ if (m_segment) {
+ m_composition->addTriggerSegment(m_segment, m_id, m_basePitch, m_baseVelocity);
+ } else {
+ m_segment = new Segment();
+ m_segment->setEndMarkerTime(m_duration);
+ TriggerSegmentRec *rec = m_composition->addTriggerSegment
+ (m_segment, m_basePitch, m_baseVelocity);
+ if (rec)
+ m_id = rec->getId();
+ }
+ m_detached = false;
+}
+
+void
+AddTriggerSegmentCommand::unexecute()
+{
+ if (m_segment)
+ m_composition->detachTriggerSegment(m_id);
+ m_detached = true;
+}
+
+}
diff --git a/src/commands/segment/AddTriggerSegmentCommand.h b/src/commands/segment/AddTriggerSegmentCommand.h
new file mode 100644
index 0000000..46d23cb
--- /dev/null
+++ b/src/commands/segment/AddTriggerSegmentCommand.h
@@ -0,0 +1,72 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_ADDTRIGGERSEGMENTCOMMAND_H_
+#define _RG_ADDTRIGGERSEGMENTCOMMAND_H_
+
+#include "base/TriggerSegment.h"
+#include <kcommand.h>
+#include "base/Event.h"
+
+
+
+
+namespace Rosegarden
+{
+
+class Segment;
+class RosegardenGUIDoc;
+class Composition;
+
+
+class AddTriggerSegmentCommand : public KNamedCommand
+{
+public:
+ AddTriggerSegmentCommand(RosegardenGUIDoc *doc,
+ timeT duration, // start time always 0
+ int basePitch = -1,
+ int baseVelocity = -1);
+ virtual ~AddTriggerSegmentCommand();
+
+ TriggerSegmentId getId() const; // after invocation
+
+ virtual void execute();
+ virtual void unexecute();
+
+private:
+ Composition *m_composition;
+ timeT m_duration;
+ int m_basePitch;
+ int m_baseVelocity;
+ TriggerSegmentId m_id;
+ Segment *m_segment;
+ bool m_detached;
+};
+
+
+
+}
+
+#endif
diff --git a/src/commands/segment/AudioSegmentAutoSplitCommand.cpp b/src/commands/segment/AudioSegmentAutoSplitCommand.cpp
new file mode 100644
index 0000000..d474b64
--- /dev/null
+++ b/src/commands/segment/AudioSegmentAutoSplitCommand.cpp
@@ -0,0 +1,191 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "AudioSegmentAutoSplitCommand.h"
+
+#include "base/Event.h"
+#include "misc/Debug.h"
+#include "misc/Strings.h"
+#include "base/Composition.h"
+#include "base/RealTime.h"
+#include "base/Segment.h"
+#include "document/RosegardenGUIDoc.h"
+#include "sound/AudioFileManager.h"
+#include "sound/PeakFileManager.h"
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+struct AutoSplitPoint
+{
+ timeT time;
+ timeT lastSoundTime;
+ Clef clef;
+ Rosegarden::Key key;
+ AutoSplitPoint(timeT t, timeT lst, Clef c, Rosegarden::Key k) :
+ time(t), lastSoundTime(lst), clef(c), key(k) { }
+};
+
+AudioSegmentAutoSplitCommand::AudioSegmentAutoSplitCommand(
+ RosegardenGUIDoc *doc,
+ Segment *segment,
+ int threshold) :
+ KNamedCommand(getGlobalName()),
+ m_segment(segment),
+ m_composition(segment->getComposition()),
+ m_audioFileManager(&(doc->getAudioFileManager())),
+ m_detached(false),
+ m_threshold(threshold)
+{}
+
+AudioSegmentAutoSplitCommand::~AudioSegmentAutoSplitCommand()
+{
+ if (m_detached) {
+ delete m_segment;
+ } else {
+ for (unsigned int i = 0; i < m_newSegments.size(); ++i) {
+ delete m_newSegments[i];
+ }
+ }
+}
+
+void
+AudioSegmentAutoSplitCommand::execute()
+{
+ if (m_newSegments.size() == 0) {
+
+ std::vector<AutoSplitPoint> splitPoints;
+
+ if (m_segment->getType() != Segment::Audio)
+ return ;
+
+ // Auto split the audio file - we ask for a minimum
+ // result file size of 0.2secs - that's probably fair
+ // enough.
+ //
+ std::vector<SplitPointPair> rtSplitPoints;
+
+ try {
+ rtSplitPoints =
+ m_audioFileManager->
+ getSplitPoints(m_segment->getAudioFileId(),
+ m_segment->getAudioStartTime(),
+ m_segment->getAudioEndTime(),
+ m_threshold,
+ RealTime(0, 200000000));
+ } catch (AudioFileManager::BadAudioPathException e) {
+ std::cerr << "ERROR: AudioSegmentAutoSplitCommand: Bad audio path: " << e.getMessage() << std::endl;
+ } catch (PeakFileManager::BadPeakFileException e) {
+ std::cerr << "ERROR: AudioSegmentAutoSplitCommand: Bad peak file: " << e.getMessage() << std::endl;
+ }
+
+ std::vector<SplitPointPair>::iterator it;
+ timeT absStartTime, absEndTime;
+
+ char splitNumber[10];
+ int splitCount = 0;
+
+ timeT origStartTime = m_segment->getStartTime();
+ RealTime audioStart = m_segment->getAudioStartTime();
+ RealTime origStartRT = m_composition->getElapsedRealTime(origStartTime);
+
+ for (it = rtSplitPoints.begin(); it != rtSplitPoints.end(); it++) {
+ // The start time for the segment is the original
+ // segment's start time, plus whatever it->first translates
+ // into as an offset from the original segment's start
+ // time
+
+ RG_DEBUG << "AudioSegmentAutoSplitCommand::execute: range " << it->first << " -> " << it->second << endl;
+
+ absStartTime = m_composition->getElapsedTimeForRealTime
+ (origStartRT - audioStart + it->first);
+
+ absEndTime = m_composition->getElapsedTimeForRealTime
+ (origStartRT - audioStart + it->second);
+
+ // absStartTime = m_segment->getStartTime() +
+ // m_composition->getElapsedTimeForRealTime(it->first - audioStart);
+
+ // absEndTime = m_segment->getStartTime() +
+ // m_composition->getElapsedTimeForRealTime(it->second - audioStart);
+
+ Segment *newSegment = new Segment(*m_segment);
+
+ newSegment->setStartTime(absStartTime);
+ newSegment->setAudioFileId(m_segment->getAudioFileId());
+ newSegment->setAudioStartTime(it->first);
+ newSegment->setAudioEndTime(it->second);
+ newSegment->setEndMarkerTime(absEndTime);
+
+ // label
+ sprintf(splitNumber, "%d", splitCount++);
+ newSegment->
+ setLabel(qstrtostr(i18n("%1 (autosplit %2)").arg
+ (strtoqstr(m_segment->getLabel())).arg
+ (splitNumber)));
+
+ newSegment->setColourIndex(m_segment->getColourIndex());
+
+ RG_DEBUG << "AudioSegmentAutoSplitCommand::execute "
+ << "abs start = " << absStartTime
+ << ", abs end = " << absEndTime
+ << ", seg start = " << newSegment->getStartTime()
+ << ", seg end = " << newSegment->getEndMarkerTime()
+ << ", audio start = " << newSegment->getAudioStartTime()
+ << ", audio end = " << newSegment->getAudioEndTime()
+ << endl;
+
+ m_newSegments.push_back(newSegment);
+ }
+ }
+
+ RG_DEBUG << "AudioSegmentAutoSplitCommand::execute: have " << m_newSegments.size() << " new segments" << endl;
+
+ for (unsigned int i = 0; i < m_newSegments.size(); ++i) {
+ m_composition->addSegment(m_newSegments[i]);
+ }
+
+ if (m_newSegments.size() > 0) {
+ m_composition->detachSegment(m_segment);
+ }
+
+ m_detached = true;
+}
+
+void
+AudioSegmentAutoSplitCommand::unexecute()
+{
+ for (unsigned int i = 0; i < m_newSegments.size(); ++i) {
+ m_composition->detachSegment(m_newSegments[i]);
+ }
+ if (m_newSegments.size() > 0) { // otherwise it was never detached
+ m_composition->addSegment(m_segment);
+ }
+ m_detached = false;
+}
+
+}
diff --git a/src/commands/segment/AudioSegmentAutoSplitCommand.h b/src/commands/segment/AudioSegmentAutoSplitCommand.h
new file mode 100644
index 0000000..a1c4b48
--- /dev/null
+++ b/src/commands/segment/AudioSegmentAutoSplitCommand.h
@@ -0,0 +1,71 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_AUDIOSEGMENTAUTOSPLITCOMMAND_H_
+#define _RG_AUDIOSEGMENTAUTOSPLITCOMMAND_H_
+
+#include <kcommand.h>
+#include <qstring.h>
+#include <vector>
+#include <klocale.h>
+
+
+
+
+namespace Rosegarden
+{
+
+class Segment;
+class RosegardenGUIDoc;
+class Composition;
+class AudioFileManager;
+
+
+class AudioSegmentAutoSplitCommand : public KNamedCommand
+{
+public:
+ AudioSegmentAutoSplitCommand(RosegardenGUIDoc *doc,
+ Segment *segment,
+ int threshold);
+ virtual ~AudioSegmentAutoSplitCommand();
+
+ virtual void execute();
+ virtual void unexecute();
+
+ static QString getGlobalName() { return i18n("&Split on Silence"); }
+
+private:
+ Segment *m_segment;
+ Composition *m_composition;
+ AudioFileManager *m_audioFileManager;
+ std::vector<Segment *> m_newSegments;
+ bool m_detached;
+ int m_threshold;
+};
+
+
+}
+
+#endif
diff --git a/src/commands/segment/AudioSegmentDistributeCommand.cpp b/src/commands/segment/AudioSegmentDistributeCommand.cpp
new file mode 100644
index 0000000..9bdfb97
--- /dev/null
+++ b/src/commands/segment/AudioSegmentDistributeCommand.cpp
@@ -0,0 +1,156 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "AudioSegmentDistributeCommand.h"
+
+#include "base/Event.h"
+#include "base/Composition.h"
+#include "base/NotationTypes.h"
+#include "base/RealTime.h"
+#include "base/Segment.h"
+#include "base/Selection.h"
+#include "sound/AudioFile.h"
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+AudioSegmentDistributeCommand::AudioSegmentDistributeCommand(
+ Composition *comp,
+ SegmentSelection &inputSelection,
+ Segment *audioSegment):
+ KNamedCommand(getGlobalName()),
+ m_composition(comp),
+ m_selection(inputSelection),
+ m_audioFile(0),
+ m_audioSegment(audioSegment),
+ m_executed(false)
+{}
+
+AudioSegmentDistributeCommand::AudioSegmentDistributeCommand(
+ Composition *comp,
+ SegmentSelection &inputSelection,
+ AudioFile *audioFile):
+ KNamedCommand(getGlobalName()),
+ m_composition(comp),
+ m_selection(inputSelection),
+ m_audioFile(audioFile),
+ m_audioSegment(0),
+ m_executed(false)
+{}
+
+AudioSegmentDistributeCommand::~AudioSegmentDistributeCommand()
+{
+ if (m_executed) {
+ for (SegmentSelection::iterator i = m_selection.begin();
+ i != m_selection.end(); ++i) {
+ delete *i;
+ }
+ } else {
+ for (unsigned int i = 0; i < m_newSegments.size(); ++i)
+ delete m_newSegments[i];
+ }
+}
+
+void
+AudioSegmentDistributeCommand::execute()
+{
+ // Store the insert times in a local vector
+ //
+ std::vector<timeT> insertTimes;
+
+ bool addNew = m_newSegments.size() == 0 ? true : false;
+
+ for (SegmentSelection::iterator i = m_selection.begin();
+ i != m_selection.end(); ++i) {
+ // For MIDI (Internal) Segments only of course
+ //
+ if ((*i)->getType() == Segment::Internal) {
+ if (addNew) {
+ for (Segment::iterator it = (*i)->begin();
+ it != (*i)->end(); ++it) {
+ if ((*it)->isa(Note::EventType)) {
+ Segment *segment =
+ new Segment(
+ Segment::Audio,
+ (*it)->getAbsoluteTime());
+ segment->setTrack((*i)->getTrack());
+
+ // If we've constructed against an AudioFile
+ //
+ if (m_audioFile) {
+ segment->setAudioFileId(m_audioFile->getId());
+ segment->setAudioStartTime(
+ RealTime::zeroTime);
+ segment->setAudioEndTime(
+ m_audioFile->getLength());
+ } else // or an audio Segment
+ {
+ segment->setAudioFileId(
+ m_audioSegment->getAudioFileId());
+ segment->setAudioStartTime(
+ m_audioSegment->getAudioStartTime());
+ segment->setAudioEndTime(
+ m_audioSegment->getAudioEndTime());
+ }
+
+ m_composition->addSegment(segment);
+ m_newSegments.push_back(segment);
+ }
+ }
+ }
+
+ // Detach original Segment
+ //
+ m_composition->detachSegment(*i);
+ }
+
+ }
+
+ if (!addNew && m_newSegments.size()) {
+ // Reattach new segments
+ //
+ for (unsigned int i = 0; i < m_newSegments.size(); ++i)
+ m_composition->addSegment(m_newSegments[i]);
+ }
+
+ m_executed = true;
+}
+
+void
+AudioSegmentDistributeCommand::unexecute()
+{
+ for (unsigned int i = 0; i < m_newSegments.size(); ++i)
+ m_composition->detachSegment(m_newSegments[i]);
+
+ for (SegmentSelection::iterator it = m_selection.begin();
+ it != m_selection.end(); ++it)
+ m_composition->addSegment(*it);
+
+ m_executed = false;
+}
+
+}
diff --git a/src/commands/segment/AudioSegmentDistributeCommand.h b/src/commands/segment/AudioSegmentDistributeCommand.h
new file mode 100644
index 0000000..d325daf
--- /dev/null
+++ b/src/commands/segment/AudioSegmentDistributeCommand.h
@@ -0,0 +1,86 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_AUDIOSEGMENTDISTRIBUTECOMMAND_H_
+#define _RG_AUDIOSEGMENTDISTRIBUTECOMMAND_H_
+
+#include "base/Selection.h"
+#include <kcommand.h>
+#include <qstring.h>
+#include <vector>
+#include <klocale.h>
+
+
+
+
+namespace Rosegarden
+{
+
+class Segment;
+class Composition;
+class AudioFile;
+
+
+/**
+ * AudioSegmentDistributeCommand - Distribute an Audio Segment triggered
+ * against the MIDI Note ons in a SegmentSelection.
+ *
+ * (I think this is actually unused --cc)
+ */
+class AudioSegmentDistributeCommand : public KNamedCommand
+{
+public:
+ AudioSegmentDistributeCommand(Composition *comp,
+ SegmentSelection &inputSelection,
+ Segment *audioSegment);
+
+ AudioSegmentDistributeCommand(Composition *comp,
+ SegmentSelection &inputSelection,
+ AudioFile *audioFile);
+
+ virtual ~AudioSegmentDistributeCommand();
+
+ static QString getGlobalName()
+ { return i18n("Distribute Audio Segments over MIDI"); }
+
+
+ virtual void execute();
+ virtual void unexecute();
+
+protected:
+ Composition *m_composition;
+ SegmentSelection m_selection;
+ AudioFile *m_audioFile;
+ Segment *m_audioSegment;
+ std::vector<Segment*> m_newSegments;
+ bool m_executed;
+
+};
+
+
+
+}
+
+#endif
diff --git a/src/commands/segment/AudioSegmentInsertCommand.cpp b/src/commands/segment/AudioSegmentInsertCommand.cpp
new file mode 100644
index 0000000..b5167f7
--- /dev/null
+++ b/src/commands/segment/AudioSegmentInsertCommand.cpp
@@ -0,0 +1,136 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "AudioSegmentInsertCommand.h"
+
+#include <klocale.h>
+#include "misc/Debug.h"
+#include "misc/Strings.h"
+#include "base/Composition.h"
+#include "base/RealTime.h"
+#include "base/Segment.h"
+#include "base/Studio.h"
+#include "base/Track.h"
+#include "document/RosegardenGUIDoc.h"
+#include "gui/general/GUIPalette.h"
+#include "sound/AudioFile.h"
+#include "sound/AudioFileManager.h"
+
+
+namespace Rosegarden
+{
+
+AudioSegmentInsertCommand::AudioSegmentInsertCommand(RosegardenGUIDoc *doc,
+ TrackId track,
+ timeT startTime,
+ AudioFileId audioFileId,
+ const RealTime &audioStartTime,
+ const RealTime &audioEndTime):
+ KNamedCommand(i18n("Create Segment")),
+ m_composition(&(doc->getComposition())),
+ m_audioFileManager(&(doc->getAudioFileManager())),
+ m_segment(0),
+ m_track(track),
+ m_startTime(startTime),
+ m_audioFileId(audioFileId),
+ m_audioStartTime(audioStartTime),
+ m_audioEndTime(audioEndTime),
+ m_detached(false)
+{}
+
+AudioSegmentInsertCommand::~AudioSegmentInsertCommand()
+{
+ if (m_detached) {
+ delete m_segment;
+ }
+}
+
+void
+AudioSegmentInsertCommand::execute()
+{
+ if (!m_segment) {
+ // Create and insert Segment
+ //
+ m_segment = new Segment(Segment::Audio);
+ m_segment->setTrack(m_track);
+ m_segment->setStartTime(m_startTime);
+ m_segment->setAudioStartTime(m_audioStartTime);
+ m_segment->setAudioEndTime(m_audioEndTime);
+ m_segment->setAudioFileId(m_audioFileId);
+
+ // Set color for audio segment (DMM)
+ //
+ m_segment->setColourIndex(GUIPalette::AudioDefaultIndex);
+
+ // Calculate end time
+ //
+ RealTime startTime =
+ m_composition->getElapsedRealTime(m_startTime);
+
+ RealTime endTime =
+ startTime + m_audioEndTime - m_audioStartTime;
+
+ timeT endTimeT = m_composition->getElapsedTimeForRealTime(endTime);
+
+ RG_DEBUG << "AudioSegmentInsertCommand::execute : start timeT "
+ << m_startTime << ", startTime " << startTime << ", audioStartTime " << m_audioStartTime << ", audioEndTime " << m_audioEndTime << ", endTime " << endTime << ", end timeT " << endTimeT << endl;
+
+ m_segment->setEndTime(endTimeT);
+
+ if (endTimeT > m_composition->getEndMarker()) {
+ m_composition->setEndMarker(m_composition->getBarEndForTime(endTimeT));
+ }
+
+ // Label by audio file name
+ //
+ std::string label = "";
+
+ AudioFile *aF =
+ m_audioFileManager->getAudioFile(m_audioFileId);
+
+ if (aF)
+ label = qstrtostr(i18n("%1 (inserted)").arg
+ (strtoqstr(aF->getName())));
+ else
+ label = qstrtostr(i18n("unknown audio file"));
+
+ m_segment->setLabel(label);
+
+ m_composition->addSegment(m_segment);
+ } else {
+ m_composition->addSegment(m_segment);
+ }
+
+ m_detached = false;
+}
+
+void
+AudioSegmentInsertCommand::unexecute()
+{
+ m_composition->detachSegment(m_segment);
+ m_detached = true;
+}
+
+}
diff --git a/src/commands/segment/AudioSegmentInsertCommand.h b/src/commands/segment/AudioSegmentInsertCommand.h
new file mode 100644
index 0000000..3510833
--- /dev/null
+++ b/src/commands/segment/AudioSegmentInsertCommand.h
@@ -0,0 +1,77 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_AUDIOSEGMENTINSERTCOMMAND_H_
+#define _RG_AUDIOSEGMENTINSERTCOMMAND_H_
+
+#include "base/RealTime.h"
+#include "base/Track.h"
+#include "sound/AudioFile.h"
+#include <kcommand.h>
+#include "base/Event.h"
+
+
+namespace Rosegarden
+{
+
+class Studio;
+class Segment;
+class RosegardenGUIDoc;
+class Composition;
+class AudioFileManager;
+
+
+class AudioSegmentInsertCommand : public KNamedCommand
+{
+public:
+ AudioSegmentInsertCommand(RosegardenGUIDoc *doc,
+ TrackId track,
+ timeT startTime,
+ AudioFileId audioFileId,
+ const RealTime &audioStartTime,
+ const RealTime &audioEndTime);
+ virtual ~AudioSegmentInsertCommand();
+
+ Segment *getNewSegment() { return m_segment; }
+
+ virtual void execute();
+ virtual void unexecute();
+
+private:
+ Composition *m_composition;
+ AudioFileManager *m_audioFileManager;
+ Segment *m_segment;
+ int m_track;
+ timeT m_startTime;
+ AudioFileId m_audioFileId;
+ RealTime m_audioStartTime;
+ RealTime m_audioEndTime;
+ bool m_detached;
+};
+
+
+}
+
+#endif
diff --git a/src/commands/segment/AudioSegmentRescaleCommand.cpp b/src/commands/segment/AudioSegmentRescaleCommand.cpp
new file mode 100644
index 0000000..1386783
--- /dev/null
+++ b/src/commands/segment/AudioSegmentRescaleCommand.cpp
@@ -0,0 +1,210 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "AudioSegmentRescaleCommand.h"
+
+#include "misc/Strings.h"
+#include "base/Event.h"
+#include "base/Composition.h"
+#include "base/NotationTypes.h"
+#include "base/Segment.h"
+#include "document/RosegardenGUIDoc.h"
+#include "sound/AudioFileTimeStretcher.h"
+#include "sound/AudioFileManager.h"
+#include "gui/widgets/ProgressDialog.h"
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+AudioSegmentRescaleCommand::AudioSegmentRescaleCommand(RosegardenGUIDoc *doc,
+ Segment *s,
+ float ratio) :
+ KNamedCommand(getGlobalName()),
+ m_afm(&doc->getAudioFileManager()),
+ m_stretcher(new AudioFileTimeStretcher(m_afm)),
+ m_segment(s),
+ m_newSegment(0),
+ m_fid(-1),
+ m_timesGiven(false),
+ m_startTime(0),
+ m_endMarkerTime(0),
+ m_ratio(ratio),
+ m_detached(false)
+{
+ // nothing
+}
+
+AudioSegmentRescaleCommand::AudioSegmentRescaleCommand(RosegardenGUIDoc *doc,
+ Segment *s,
+ float ratio,
+ timeT st,
+ timeT emt) :
+ KNamedCommand(getGlobalName()),
+ m_afm(&doc->getAudioFileManager()),
+ m_stretcher(new AudioFileTimeStretcher(m_afm)),
+ m_segment(s),
+ m_newSegment(0),
+ m_fid(-1),
+ m_timesGiven(true),
+ m_startTime(st),
+ m_endMarkerTime(emt),
+ m_ratio(ratio),
+ m_detached(false)
+{
+ // nothing
+}
+
+AudioSegmentRescaleCommand::~AudioSegmentRescaleCommand()
+{
+ delete m_stretcher;
+
+ if (m_detached) {
+ delete m_segment;
+ } else {
+ delete m_newSegment;
+ }
+}
+
+void
+AudioSegmentRescaleCommand::connectProgressDialog(ProgressDialog *dlg)
+{
+ QObject::connect(m_stretcher, SIGNAL(setProgress(int)),
+ dlg->progressBar(), SLOT(setValue(int)));
+ QObject::connect(dlg, SIGNAL(cancelClicked()),
+ m_stretcher, SLOT(slotStopTimestretch()));
+}
+
+void
+AudioSegmentRescaleCommand::disconnectProgressDialog(ProgressDialog *dlg)
+{
+ QObject::disconnect(m_stretcher, SIGNAL(setProgress(int)),
+ dlg->progressBar(), SLOT(setValue(int)));
+ QObject::disconnect(dlg, SIGNAL(cancelClicked()),
+ m_stretcher, SLOT(slotStopTimestretch()));
+}
+
+void
+AudioSegmentRescaleCommand::execute()
+{
+ timeT startTime = m_segment->getStartTime();
+
+ if (m_segment->getType() != Segment::Audio) {
+ return;
+ }
+
+ bool failed = false;
+
+ if (!m_newSegment) {
+
+ m_newSegment = new Segment(*m_segment);
+
+ QString oldLabel = strtoqstr(m_segment->getLabel());
+ if (!oldLabel.endsWith(i18n("(rescaled)"))) {
+ m_newSegment->setLabel(qstrtostr(i18n("%1 (rescaled)").arg
+ (oldLabel)));
+ }
+
+ AudioFileId sourceFileId = m_segment->getAudioFileId();
+ float absoluteRatio = m_ratio;
+
+ std::cerr << "AudioSegmentRescaleCommand: segment file id " << sourceFileId << ", given ratio " << m_ratio << std::endl;
+
+ if (m_segment->getStretchRatio() != 1.f &&
+ m_segment->getStretchRatio() != 0.f) {
+ sourceFileId = m_segment->getUnstretchedFileId();
+ absoluteRatio *= m_segment->getStretchRatio();
+ std::cerr << "AudioSegmentRescaleCommand: unstretched file id " << sourceFileId << ", prev ratio " << m_segment->getStretchRatio() << ", resulting ratio " << absoluteRatio << std::endl;
+ }
+
+ if (!m_timesGiven) {
+ m_endMarkerTime = m_segment->getStartTime() +
+ (m_segment->getEndMarkerTime() - m_segment->getStartTime()) * m_ratio;
+ }
+
+ try {
+ m_fid = m_stretcher->getStretchedAudioFile(sourceFileId,
+ absoluteRatio);
+ m_newSegment->setAudioFileId(m_fid);
+ m_newSegment->setUnstretchedFileId(sourceFileId);
+ m_newSegment->setStretchRatio(absoluteRatio);
+ m_newSegment->setAudioStartTime(m_segment->getAudioStartTime() *
+ m_ratio);
+ if (m_timesGiven) {
+ m_newSegment->setStartTime(m_startTime);
+ m_newSegment->setAudioEndTime(m_segment->getAudioEndTime() *
+ m_ratio);
+ m_newSegment->setEndMarkerTime(m_endMarkerTime);
+ } else {
+ m_newSegment->setEndMarkerTime(m_endMarkerTime);
+ m_newSegment->setAudioEndTime(m_segment->getAudioEndTime() *
+ m_ratio);
+ }
+ } catch (SoundFile::BadSoundFileException e) {
+ std::cerr << "AudioSegmentRescaleCommand: ERROR: BadSoundFileException: "
+ << e.getMessage() << std::endl;
+ delete m_newSegment;
+ m_newSegment = 0;
+ m_fid = -1;
+ failed = true;
+ } catch (AudioFileManager::BadAudioPathException e) {
+ std::cerr << "AudioSegmentRescaleCommand: ERROR: BadAudioPathException: "
+ << e.getMessage() << std::endl;
+ delete m_newSegment;
+ m_newSegment = 0;
+ m_fid = -1;
+ failed = true;
+ } catch (AudioFileTimeStretcher::CancelledException e) {
+ std::cerr << "AudioSegmentRescaleCommand: ERROR: Rescale cancelled" << std::endl;
+ delete m_newSegment;
+ m_newSegment = 0;
+ m_fid = -1;
+ failed = true;
+ }
+ }
+
+ if (failed) return;
+
+ m_segment->getComposition()->addSegment(m_newSegment);
+ m_segment->getComposition()->detachSegment(m_segment);
+
+// m_newSegment->setEndMarkerTime
+// (startTime + rescale(m_segment->getEndMarkerTime() - startTime));
+
+ m_detached = true;
+}
+
+void
+AudioSegmentRescaleCommand::unexecute()
+{
+ if (m_newSegment) {
+ m_newSegment->getComposition()->addSegment(m_segment);
+ m_newSegment->getComposition()->detachSegment(m_newSegment);
+ m_detached = false;
+ }
+}
+
+}
diff --git a/src/commands/segment/AudioSegmentRescaleCommand.h b/src/commands/segment/AudioSegmentRescaleCommand.h
new file mode 100644
index 0000000..a4edb13
--- /dev/null
+++ b/src/commands/segment/AudioSegmentRescaleCommand.h
@@ -0,0 +1,81 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_AUDIOSEGMENTRESCALECOMMAND_H_
+#define _RG_AUDIOSEGMENTRESCALECOMMAND_H_
+
+#include <kcommand.h>
+#include <qstring.h>
+#include "base/Event.h"
+#include <klocale.h>
+
+namespace Rosegarden
+{
+
+class Segment;
+class AudioFileManager;
+class AudioFileTimeStretcher;
+class RosegardenGUIDoc;
+class ProgressDialog;
+
+class AudioSegmentRescaleCommand : public KNamedCommand
+{
+public:
+ AudioSegmentRescaleCommand(RosegardenGUIDoc *doc,
+ Segment *segment, float ratio);
+ AudioSegmentRescaleCommand(RosegardenGUIDoc *doc,
+ Segment *segment, float ratio,
+ timeT newStartTime,
+ timeT newEndMarkerTime);
+ virtual ~AudioSegmentRescaleCommand();
+
+ virtual void execute();
+ virtual void unexecute();
+
+ AudioFileTimeStretcher *getStretcher() { return m_stretcher; }
+ int getNewAudioFileId() const { return m_fid; }
+
+ void connectProgressDialog(ProgressDialog *dlg);
+ void disconnectProgressDialog(ProgressDialog *dlg);
+
+ static QString getGlobalName() { return i18n("Stretch or S&quash..."); }
+
+private:
+ AudioFileManager *m_afm;
+ AudioFileTimeStretcher *m_stretcher;
+ Segment *m_segment;
+ Segment *m_newSegment;
+ bool m_timesGiven;
+ timeT m_startTime;
+ timeT m_endMarkerTime;
+ int m_fid;
+ float m_ratio;
+ bool m_detached;
+};
+
+
+
+}
+
+#endif
diff --git a/src/commands/segment/AudioSegmentResizeFromStartCommand.cpp b/src/commands/segment/AudioSegmentResizeFromStartCommand.cpp
new file mode 100644
index 0000000..5045500
--- /dev/null
+++ b/src/commands/segment/AudioSegmentResizeFromStartCommand.cpp
@@ -0,0 +1,87 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "AudioSegmentResizeFromStartCommand.h"
+
+#include <klocale.h>
+#include "base/Composition.h"
+#include "base/RealTime.h"
+#include "base/Segment.h"
+
+
+namespace Rosegarden
+{
+
+AudioSegmentResizeFromStartCommand::AudioSegmentResizeFromStartCommand(Segment *segment,
+ timeT newStartTime) :
+ KNamedCommand(i18n("Resize Segment")),
+ m_segment(segment),
+ m_newSegment(0),
+ m_detached(false),
+ m_oldStartTime(segment->getStartTime()),
+ m_newStartTime(newStartTime)
+{}
+
+AudioSegmentResizeFromStartCommand::~AudioSegmentResizeFromStartCommand()
+{
+ if (!m_detached)
+ delete m_segment;
+ else
+ delete m_newSegment;
+}
+
+void
+AudioSegmentResizeFromStartCommand::execute()
+{
+ Composition *c = m_segment->getComposition();
+
+ if (!m_newSegment) {
+ RealTime oldRT = c->getElapsedRealTime(m_oldStartTime);
+ RealTime newRT = c->getElapsedRealTime(m_newStartTime);
+
+ m_newSegment = new Segment(*m_segment);
+ m_newSegment->setStartTime(m_newStartTime);
+ m_newSegment->setAudioStartTime(m_segment->getAudioStartTime() -
+ (oldRT - newRT));
+ }
+
+ c->addSegment(m_newSegment);
+ m_newSegment->setEndMarkerTime(m_segment->getEndMarkerTime());
+ c->detachSegment(m_segment);
+
+ m_detached = false;
+}
+
+void
+AudioSegmentResizeFromStartCommand::unexecute()
+{
+ Composition *c = m_newSegment->getComposition();
+ c->addSegment(m_segment);
+ c->detachSegment(m_newSegment);
+
+ m_detached = true;
+}
+
+}
diff --git a/src/commands/segment/AudioSegmentResizeFromStartCommand.h b/src/commands/segment/AudioSegmentResizeFromStartCommand.h
new file mode 100644
index 0000000..734a6e0
--- /dev/null
+++ b/src/commands/segment/AudioSegmentResizeFromStartCommand.h
@@ -0,0 +1,66 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_AUDIOSEGMENTRESIZEFROMSTARTCOMMAND_H_
+#define _RG_AUDIOSEGMENTRESIZEFROMSTARTCOMMAND_H_
+
+#include <kcommand.h>
+#include "base/Event.h"
+
+
+
+
+namespace Rosegarden
+{
+
+class Segment;
+
+
+/**
+ * As above, but for audio segments.
+ */
+class AudioSegmentResizeFromStartCommand : public KNamedCommand
+{
+public:
+ AudioSegmentResizeFromStartCommand(Segment *segment,
+ timeT newStartTime);
+ virtual ~AudioSegmentResizeFromStartCommand();
+
+ virtual void execute();
+ virtual void unexecute();
+
+private:
+ Segment *m_segment;
+ Segment *m_newSegment;
+ bool m_detached;
+ timeT m_oldStartTime;
+ timeT m_newStartTime;
+};
+
+
+
+}
+
+#endif
diff --git a/src/commands/segment/AudioSegmentSplitCommand.cpp b/src/commands/segment/AudioSegmentSplitCommand.cpp
new file mode 100644
index 0000000..f0c462e
--- /dev/null
+++ b/src/commands/segment/AudioSegmentSplitCommand.cpp
@@ -0,0 +1,155 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "AudioSegmentSplitCommand.h"
+
+#include <klocale.h>
+#include "misc/Debug.h"
+#include "misc/Strings.h"
+#include "base/RealTime.h"
+#include "base/Composition.h"
+#include "base/Segment.h"
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+AudioSegmentSplitCommand::AudioSegmentSplitCommand(Segment *segment,
+ timeT splitTime) :
+ KNamedCommand(i18n("Split Audio Segment")),
+ m_segment(segment),
+ m_newSegment(0),
+ m_splitTime(splitTime),
+ m_previousEndMarkerTime(0),
+ m_detached(false)
+{}
+
+AudioSegmentSplitCommand::~AudioSegmentSplitCommand()
+{
+ if (m_detached) {
+ delete m_newSegment;
+ }
+ delete m_previousEndMarkerTime;
+}
+
+void
+AudioSegmentSplitCommand::execute()
+{
+ if (!m_newSegment) {
+
+ m_newSegment = new Segment(Segment::Audio);
+
+ // Basics
+ //
+ m_newSegment->setAudioFileId(m_segment->getAudioFileId());
+ m_newSegment->setTrack(m_segment->getTrack());
+
+ // Get the RealTime split time
+ //
+ RealTime splitDiff =
+ m_segment->getComposition()->getRealTimeDifference(
+ m_segment->getStartTime(), m_splitTime);
+
+ // Set audio start and end
+ //
+ m_newSegment->setAudioStartTime
+ (m_segment->getAudioStartTime() + splitDiff);
+ m_newSegment->setAudioEndTime(m_segment->getAudioEndTime());
+
+ // Insert into composition before setting end time
+ //
+ m_segment->getComposition()->addSegment(m_newSegment);
+
+ // Set start and end times
+ //
+ m_newSegment->setStartTime(m_splitTime);
+ m_newSegment->setEndTime(m_segment->getEndTime());
+
+ // Set original end time
+ //
+ // m_previousEndAudioTime = m_segment->getAudioEndTime();
+ // m_segment->setAudioEndTime(m_newSegment->getAudioStartTime());
+
+ RG_DEBUG << "AudioSegmentSplitCommand::execute: Set end audio of left segment to " << m_newSegment->getAudioStartTime() << endl;
+
+
+ // Set labels
+ //
+ m_segmentLabel = m_segment->getLabel();
+ QString newLabel = strtoqstr(m_segmentLabel);
+ if (!newLabel.endsWith(i18n(" (split)"))) {
+ newLabel = i18n("%1 (split)").arg(newLabel);
+ }
+ m_segment->setLabel(qstrtostr(newLabel));
+ m_newSegment->setLabel(m_segment->getLabel());
+
+ // Set color
+ //
+ m_newSegment->setColourIndex(m_segment->getColourIndex());
+ }
+
+ // Resize left hand Segment
+ //
+ const timeT *emt = m_segment->getRawEndMarkerTime();
+ if (emt) {
+ m_previousEndMarkerTime = new timeT(*emt);
+ } else {
+ m_previousEndMarkerTime = 0;
+ }
+
+ RG_DEBUG << "AudioSegmentSplitCommand::execute: Setting end marker of left segment to " << m_splitTime << endl;
+
+ m_segment->setEndMarkerTime(m_splitTime);
+
+ if (!m_newSegment->getComposition()) {
+ m_segment->getComposition()->addSegment(m_newSegment);
+ }
+
+ m_detached = false;
+
+}
+
+void
+AudioSegmentSplitCommand::unexecute()
+{
+ if (m_previousEndMarkerTime) {
+ RG_DEBUG << "AudioSegmentSplitCommand::unexecute: Restoring end marker of left segment to " << *m_previousEndMarkerTime << endl;
+
+ m_segment->setEndMarkerTime(*m_previousEndMarkerTime);
+ delete m_previousEndMarkerTime;
+ m_previousEndMarkerTime = 0;
+ } else {
+ m_segment->clearEndMarker();
+ }
+
+ m_segment->setLabel(m_segmentLabel);
+ // RG_DEBUG << "AudioSegmentSplitCommand::unexecute: Setting audio end time of left segment to " << m_previousEndAudioTime << endl;
+ // m_segment->setAudioEndTime(m_previousEndAudioTime);
+ m_segment->getComposition()->detachSegment(m_newSegment);
+ m_detached = true;
+}
+
+}
diff --git a/src/commands/segment/AudioSegmentSplitCommand.h b/src/commands/segment/AudioSegmentSplitCommand.h
new file mode 100644
index 0000000..ce7c59c
--- /dev/null
+++ b/src/commands/segment/AudioSegmentSplitCommand.h
@@ -0,0 +1,65 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_AUDIOSEGMENTSPLITCOMMAND_H_
+#define _RG_AUDIOSEGMENTSPLITCOMMAND_H_
+
+#include <string>
+#include <kcommand.h>
+#include "base/Event.h"
+
+
+
+
+namespace Rosegarden
+{
+
+class Segment;
+
+
+class AudioSegmentSplitCommand : public KNamedCommand
+{
+public:
+ AudioSegmentSplitCommand(Segment *segment,
+ timeT splitTime);
+ virtual ~AudioSegmentSplitCommand();
+
+ virtual void execute();
+ virtual void unexecute();
+
+private:
+ Segment *m_segment;
+ Segment *m_newSegment;
+ timeT m_splitTime;
+ timeT *m_previousEndMarkerTime;
+ bool m_detached;
+ std::string m_segmentLabel;
+// RealTime m_previousEndAudioTime;
+};
+
+
+}
+
+#endif
diff --git a/src/commands/segment/ChangeCompositionLengthCommand.cpp b/src/commands/segment/ChangeCompositionLengthCommand.cpp
new file mode 100644
index 0000000..bdeb7a5
--- /dev/null
+++ b/src/commands/segment/ChangeCompositionLengthCommand.cpp
@@ -0,0 +1,64 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "ChangeCompositionLengthCommand.h"
+
+#include "base/Composition.h"
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+ChangeCompositionLengthCommand::ChangeCompositionLengthCommand(
+ Composition *composition,
+ timeT startTime,
+ timeT endTime):
+ KNamedCommand(getGlobalName()),
+ m_composition(composition),
+ m_startTime(startTime),
+ m_endTime(endTime),
+ m_oldStartTime(m_composition->getStartMarker()),
+ m_oldEndTime(m_composition->getEndMarker())
+{}
+
+ChangeCompositionLengthCommand::~ChangeCompositionLengthCommand()
+{}
+
+void
+ChangeCompositionLengthCommand::execute()
+{
+ m_composition->setStartMarker(m_startTime);
+ m_composition->setEndMarker(m_endTime);
+}
+
+void
+ChangeCompositionLengthCommand::unexecute()
+{
+ m_composition->setStartMarker(m_oldStartTime);
+ m_composition->setEndMarker(m_oldEndTime);
+}
+
+}
diff --git a/src/commands/segment/ChangeCompositionLengthCommand.h b/src/commands/segment/ChangeCompositionLengthCommand.h
new file mode 100644
index 0000000..9e0db9b
--- /dev/null
+++ b/src/commands/segment/ChangeCompositionLengthCommand.h
@@ -0,0 +1,70 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_CHANGECOMPOSITIONLENGTHCOMMAND_H_
+#define _RG_CHANGECOMPOSITIONLENGTHCOMMAND_H_
+
+#include <kcommand.h>
+#include <qstring.h>
+#include "base/Event.h"
+#include <klocale.h>
+
+
+class Change;
+
+
+namespace Rosegarden
+{
+
+class Composition;
+
+
+class ChangeCompositionLengthCommand : public KNamedCommand
+{
+public:
+ ChangeCompositionLengthCommand(Composition *composition,
+ timeT startTime,
+ timeT endTime);
+ virtual ~ChangeCompositionLengthCommand();
+
+ static QString getGlobalName()
+ { return i18n("Change &Composition Start and End..."); }
+
+ virtual void execute();
+ virtual void unexecute();
+
+protected:
+ Composition *m_composition;
+ timeT m_startTime;
+ timeT m_endTime;
+ timeT m_oldStartTime;
+ timeT m_oldEndTime;
+
+};
+
+
+}
+
+#endif
diff --git a/src/commands/segment/CreateTempoMapFromSegmentCommand.cpp b/src/commands/segment/CreateTempoMapFromSegmentCommand.cpp
new file mode 100644
index 0000000..e548875
--- /dev/null
+++ b/src/commands/segment/CreateTempoMapFromSegmentCommand.cpp
@@ -0,0 +1,166 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "CreateTempoMapFromSegmentCommand.h"
+
+#include <klocale.h>
+#include "misc/Debug.h"
+#include "base/Composition.h"
+#include "base/NotationTypes.h"
+#include "base/RealTime.h"
+#include "base/Segment.h"
+
+
+namespace Rosegarden
+{
+
+CreateTempoMapFromSegmentCommand::CreateTempoMapFromSegmentCommand(Segment *groove) :
+ KNamedCommand(i18n("Set Tempos from Beat Segment")),
+ m_composition(groove->getComposition())
+{
+ initialise(groove);
+}
+
+CreateTempoMapFromSegmentCommand::~CreateTempoMapFromSegmentCommand()
+{
+ // nothing
+}
+
+void
+CreateTempoMapFromSegmentCommand::execute()
+{
+ for (TempoMap::iterator i = m_oldTempi.begin(); i != m_oldTempi.end(); ++i) {
+ int n = m_composition->getTempoChangeNumberAt(i->first);
+ if (n < m_composition->getTempoChangeCount()) {
+ m_composition->removeTempoChange(n);
+ }
+ }
+
+ for (TempoMap::iterator i = m_newTempi.begin(); i != m_newTempi.end(); ++i) {
+ m_composition->addTempoAtTime(i->first, i->second);
+ }
+}
+
+void
+CreateTempoMapFromSegmentCommand::unexecute()
+{
+ for (TempoMap::iterator i = m_newTempi.begin(); i != m_newTempi.end(); ++i) {
+ int n = m_composition->getTempoChangeNumberAt(i->first);
+ if (n < m_composition->getTempoChangeCount()) {
+ m_composition->removeTempoChange(n);
+ }
+ }
+
+ for (TempoMap::iterator i = m_oldTempi.begin(); i != m_oldTempi.end(); ++i) {
+ m_composition->addTempoAtTime(i->first, i->second);
+ }
+}
+
+void
+CreateTempoMapFromSegmentCommand::initialise(Segment *s)
+{
+ m_oldTempi.clear();
+ m_newTempi.clear();
+
+ //!!! need an additional option: per-chord, per-beat, per-bar.
+ // Let's work per-beat for the moment. Even for this, we should
+ // probably use TimeSignature.getDivisions()
+
+ std::vector<timeT> beatTimeTs;
+ std::vector<RealTime> beatRealTimes;
+
+ int startBar = m_composition->getBarNumber(s->getStartTime());
+ int barNo = startBar;
+ int beat = 0;
+
+ for (Segment::iterator i = s->begin(); s->isBeforeEndMarker(i); ++i) {
+ if ((*i)->isa(Note::EventType)) {
+
+ bool isNew;
+ TimeSignature sig =
+ m_composition->getTimeSignatureInBar(barNo, isNew);
+
+ beatTimeTs.push_back(m_composition->getBarStart(barNo) +
+ beat * sig.getBeatDuration());
+
+ if (++beat >= sig.getBeatsPerBar()) {
+ ++barNo;
+ beat = 0;
+ }
+
+ beatRealTimes.push_back(s->getComposition()->getElapsedRealTime
+ ((*i)->getAbsoluteTime()));
+ }
+ }
+
+ if (beatTimeTs.size() < 2)
+ return ;
+
+ tempoT prevTempo = 0;
+
+ // set up m_oldTempi and prevTempo
+
+ for (int i = m_composition->getTempoChangeNumberAt(*beatTimeTs.begin() - 1) + 1;
+ i <= m_composition->getTempoChangeNumberAt(*beatTimeTs.end() - 1); ++i) {
+
+ std::pair<timeT, tempoT> tempoChange =
+ m_composition->getTempoChange(i);
+ m_oldTempi[tempoChange.first] = tempoChange.second;
+ if (prevTempo == 0)
+ prevTempo = tempoChange.second;
+ }
+
+ RG_DEBUG << "starting tempo: " << prevTempo << endl;
+
+ timeT quarter = Note(Note::Crotchet).getDuration();
+
+ for (int beat = 1; beat < beatTimeTs.size(); ++beat) {
+
+ timeT beatTime = beatTimeTs[beat] - beatTimeTs[beat - 1];
+ RealTime beatRealTime = beatRealTimes[beat] - beatRealTimes[beat - 1];
+
+ // Calculate tempo to nearest qpm.
+ // This is 60 / {quarter note duration in seconds}
+ // = 60 / ( {beat in seconds} * {quarter in ticks} / { beat in ticks} )
+ // = ( 60 * {beat in ticks} ) / ( {beat in seconds} * {quarter in ticks} )
+ // Precision is deliberately limited to qpm to avoid silly values.
+
+ double beatSec = double(beatRealTime.sec) +
+ double(beatRealTime.usec() / 1000000.0);
+ double qpm = (60.0 * beatTime) / (beatSec * quarter);
+ tempoT tempo = Composition::getTempoForQpm(int(qpm + 0.001));
+
+ RG_DEBUG << "prev beat: " << beatTimeTs[beat] << ", prev beat real time " << beatRealTimes[beat] << endl;
+ RG_DEBUG << "time " << beatTime << ", rt " << beatRealTime << ", beatSec " << beatSec << ", tempo " << tempo << endl;
+
+ if (tempo != prevTempo) {
+ m_newTempi[beatTimeTs[beat - 1]] = tempo;
+ prevTempo = tempo;
+ }
+ }
+
+}
+
+}
diff --git a/src/commands/segment/CreateTempoMapFromSegmentCommand.h b/src/commands/segment/CreateTempoMapFromSegmentCommand.h
new file mode 100644
index 0000000..f6ea4d5
--- /dev/null
+++ b/src/commands/segment/CreateTempoMapFromSegmentCommand.h
@@ -0,0 +1,69 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_CREATETEMPOMAPFROMSEGMENTCOMMAND_H_
+#define _RG_CREATETEMPOMAPFROMSEGMENTCOMMAND_H_
+
+#include <map>
+#include <kcommand.h>
+#include "base/Event.h"
+#include "base/Composition.h" // for tempoT
+
+
+
+
+namespace Rosegarden
+{
+
+
+/**
+ * CreateTempoMapFromSegment applies timings found in a reference
+ * segment to the composition as a whole via the tempo map.
+ */
+
+class CreateTempoMapFromSegmentCommand : public KNamedCommand
+{
+public:
+ CreateTempoMapFromSegmentCommand(Segment *grooveSegment);
+ virtual ~CreateTempoMapFromSegmentCommand();
+
+ virtual void execute();
+ virtual void unexecute();
+
+private:
+ void initialise(Segment *s);
+
+ Composition *m_composition;
+
+ typedef std::map<timeT, tempoT> TempoMap;
+ TempoMap m_oldTempi;
+ TempoMap m_newTempi;
+};
+
+
+
+}
+
+#endif
diff --git a/src/commands/segment/CutRangeCommand.cpp b/src/commands/segment/CutRangeCommand.cpp
new file mode 100644
index 0000000..df91398
--- /dev/null
+++ b/src/commands/segment/CutRangeCommand.cpp
@@ -0,0 +1,47 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "CutRangeCommand.h"
+
+#include <klocale.h>
+#include "base/Clipboard.h"
+#include "base/Composition.h"
+#include "commands/edit/CopyCommand.h"
+#include "DeleteRangeCommand.h"
+
+
+namespace Rosegarden
+{
+
+CutRangeCommand::CutRangeCommand(Composition *composition,
+ timeT t0, timeT t1,
+ Clipboard *clipboard) :
+ KMacroCommand(i18n("Cut Range"))
+{
+ addCommand(new CopyCommand(composition, t0, t1, clipboard));
+ addCommand(new DeleteRangeCommand(composition, t0, t1));
+}
+
+}
diff --git a/src/commands/segment/CutRangeCommand.h b/src/commands/segment/CutRangeCommand.h
new file mode 100644
index 0000000..f2b3402
--- /dev/null
+++ b/src/commands/segment/CutRangeCommand.h
@@ -0,0 +1,53 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_CUTRANGECOMMAND_H_
+#define _RG_CUTRANGECOMMAND_H_
+
+#include "base/Event.h"
+#include <kcommand.h>
+
+
+namespace Rosegarden
+{
+
+class Composition;
+class Clipboard;
+
+
+class CutRangeCommand : public KMacroCommand
+{
+public:
+ CutRangeCommand(Composition *composition,
+ timeT begin,
+ timeT end,
+ Clipboard *clipboard);
+};
+
+
+
+}
+
+#endif
diff --git a/src/commands/segment/DeleteRangeCommand.cpp b/src/commands/segment/DeleteRangeCommand.cpp
new file mode 100644
index 0000000..05ec79f
--- /dev/null
+++ b/src/commands/segment/DeleteRangeCommand.cpp
@@ -0,0 +1,127 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "DeleteRangeCommand.h"
+
+#include "AudioSegmentSplitCommand.h"
+#include "base/Composition.h"
+#include "base/Segment.h"
+#include "base/Selection.h"
+#include "EraseSegmentsStartingInRangeCommand.h"
+#include "OpenOrCloseRangeCommand.h"
+#include "SegmentJoinCommand.h"
+#include "SegmentSplitCommand.h"
+
+
+namespace Rosegarden
+{
+
+DeleteRangeCommand::DeleteRangeCommand(Composition *composition,
+ timeT t0, timeT t1) :
+ KMacroCommand(i18n("Delete Range"))
+{
+ // First add commands to split the segments up. Make a note of
+ // segments that will need rejoining with their neighbours
+ // afterwards.
+
+ std::vector<Segment *> rejoins;
+
+ for (int e = 0; e < 2; ++e) {
+
+ // Split all segments at the range end first, then the range
+ // begin afterwards. This is because the split commands create
+ // new segments for the right part and leave the left parts in
+ // the original segments, so that we can use the same segment
+ // pointer to do the left split as we did for the right
+
+ timeT t = t1;
+ if (e == 1)
+ t = t0;
+
+ for (Composition::iterator i = composition->begin();
+ i != composition->end(); ++i) {
+
+ if ((*i)->getStartTime() >= t || (*i)->getEndMarkerTime() <= t) {
+ continue;
+ }
+
+ if ((*i)->getType() == Segment::Audio) {
+ addCommand(new AudioSegmentSplitCommand(*i, t));
+ } else {
+ addCommand(new SegmentSplitCommand(*i, t));
+
+ if (t == t0 && (*i)->getEndMarkerTime() > t1) {
+ rejoins.push_back(*i);
+ }
+ }
+ }
+ }
+
+ // Then commands to do the rest of the work
+
+ addCommand(new EraseSegmentsStartingInRangeCommand(composition, t0, t1));
+
+ addCommand(new OpenOrCloseRangeCommand(composition, t0, t1, false));
+
+ for (std::vector<Segment *>::iterator i = rejoins.begin();
+ i != rejoins.end(); ++i) {
+ addCommand(new RejoinCommand(composition, *i,
+ (*i)->getEndMarkerTime() + t0 - t1));
+ }
+}
+
+DeleteRangeCommand::~DeleteRangeCommand()
+{}
+
+void
+DeleteRangeCommand::RejoinCommand::execute()
+{
+ if (m_joinCommand) {
+ m_joinCommand->execute();
+ return ;
+ }
+
+ //!!! Need to remove the "(split)" names from the segment bits
+
+ for (Composition::iterator i = m_composition->begin();
+ i != m_composition->end(); ++i) {
+ if ((*i) == m_segment)
+ continue;
+ if ((*i)->getTrack() != m_segment->getTrack())
+ continue;
+ if ((*i)->getEndMarkerTime() != m_endMarkerTime)
+ continue;
+ if ((*i)->getStartTime() <= m_segment->getStartTime())
+ continue;
+ SegmentSelection selection;
+ selection.insert(m_segment);
+ selection.insert(*i);
+ m_joinCommand = new SegmentJoinCommand(selection);
+ m_joinCommand->execute();
+ break;
+ }
+}
+
+}
diff --git a/src/commands/segment/DeleteRangeCommand.h b/src/commands/segment/DeleteRangeCommand.h
new file mode 100644
index 0000000..6b198ea
--- /dev/null
+++ b/src/commands/segment/DeleteRangeCommand.h
@@ -0,0 +1,84 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_DELETERANGECOMMAND_H_
+#define _RG_DELETERANGECOMMAND_H_
+
+#include <kcommand.h>
+#include "base/Event.h"
+#include <klocale.h>
+
+#include "SegmentJoinCommand.h"
+
+
+namespace Rosegarden
+{
+
+class Segment;
+class Composition;
+
+
+class DeleteRangeCommand : public KMacroCommand
+{
+public:
+ DeleteRangeCommand(Composition *composition,
+ timeT begin,
+ timeT end);
+ virtual ~DeleteRangeCommand();
+
+private:
+ class RejoinCommand : public KNamedCommand
+ {
+ public:
+ // This command rejoins s on to a subsequent segment on the same
+ // track that ends at endMarkerTime (presumably the original end
+ // marker time of s, with the range duration subtracted).
+
+ RejoinCommand(Composition *c,
+ Segment *s,
+ timeT endMarkerTime) :
+ KNamedCommand(i18n("Rejoin Command")),
+ m_composition(c), m_segment(s), m_endMarkerTime(endMarkerTime),
+ m_joinCommand(0) { }
+
+ ~RejoinCommand() { delete m_joinCommand; }
+
+ void execute();
+ void unexecute() { if (m_joinCommand) m_joinCommand->unexecute(); }
+
+ private:
+ Composition *m_composition;
+ Segment *m_segment;
+ timeT m_endMarkerTime;
+
+ SegmentJoinCommand *m_joinCommand;
+ };
+};
+
+
+
+}
+
+#endif
diff --git a/src/commands/segment/DeleteTracksCommand.cpp b/src/commands/segment/DeleteTracksCommand.cpp
new file mode 100644
index 0000000..bad2be0
--- /dev/null
+++ b/src/commands/segment/DeleteTracksCommand.cpp
@@ -0,0 +1,161 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "DeleteTracksCommand.h"
+
+#include "misc/Debug.h"
+#include "base/Composition.h"
+#include "base/Segment.h"
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+DeleteTracksCommand::DeleteTracksCommand(Composition *composition,
+ std::vector<TrackId> tracks):
+ KNamedCommand(getGlobalName()),
+ m_composition(composition),
+ m_tracks(tracks),
+ m_detached(false)
+{}
+
+DeleteTracksCommand::~DeleteTracksCommand()
+{
+ if (m_detached) {
+ for (unsigned int i = 0; i < m_oldTracks.size(); ++i)
+ delete m_oldTracks[i];
+
+ for (unsigned int i = 0; i < m_oldSegments.size(); ++i)
+ delete m_oldSegments[i];
+
+ m_oldTracks.clear();
+ m_oldSegments.clear();
+ }
+}
+
+void DeleteTracksCommand::execute()
+{
+ Track *track = 0;
+ const Composition::segmentcontainer &segments =
+ m_composition->getSegments();
+
+ //cout << "DeleteTracksCommand::execute()" << endl;
+
+ m_oldSegments.clear();
+ m_oldTracks.clear();
+
+ // Remap positions and track numbers
+ //
+
+ Composition::trackiterator tit;
+ Composition::trackcontainer
+ &tracks = m_composition->getTracks();
+
+ for (unsigned int i = 0; i < m_tracks.size(); ++i) {
+ // detach segments and store tracks somewhere
+ track = m_composition->getTrackById(m_tracks[i]);
+
+ if (track) {
+ // detach all segments for that track
+ //
+ for (Composition::segmentcontainer::const_iterator
+ it = segments.begin();
+ it != segments.end(); ++it) {
+ if ((*it)->getTrack() == m_tracks[i]) {
+ m_oldSegments.push_back(*it);
+ m_composition->detachSegment(*it);
+ }
+ }
+
+ // store old tracks
+ m_oldTracks.push_back(track);
+ if (m_composition->detachTrack(track) == false) {
+ RG_DEBUG << "DeleteTracksCommand::execute - can't detach track" << endl;
+ }
+ }
+ }
+
+ std::vector<Track*>::iterator otIt;
+ for (otIt = m_oldTracks.begin(); otIt != m_oldTracks.end(); ++otIt) {
+ for (tit = tracks.begin(); tit != tracks.end(); ++tit) {
+ if ((*tit).second->getPosition() > (*otIt)->getPosition()) {
+ // If the track we've removed was after the current
+ // track then decrement the track position.
+ //
+ int newPosition = (*tit).second->getPosition() - 1;
+
+ (*tit).second->setPosition(newPosition);
+
+ }
+ }
+ }
+
+ m_detached = true;
+}
+
+void DeleteTracksCommand::unexecute()
+{
+ // Add the tracks and the segments back in
+ //
+
+ // Remap positions and track numbers
+ //
+ Composition::trackcontainer
+ &tracks = m_composition->getTracks();
+ Composition::trackiterator tit;
+
+ std::vector<Track*>::iterator otIt;
+ for (otIt = m_oldTracks.begin(); otIt != m_oldTracks.end(); ++otIt) {
+ // From the back we shuffle out the tracks to allow the new
+ // (old) track some space to come back in.
+ //
+ tit = tracks.end();
+ while (true) {
+ --tit;
+
+ if ((*tit).second->getPosition() >= (*otIt)->getPosition()) {
+ // If the track we're adding has position after the
+ // current track then increment position.
+ //
+ int newPosition = (*tit).second->getPosition() + 1;
+
+ (*tit).second->setPosition(newPosition);
+ }
+
+ if (tit == tracks.begin())
+ break;
+ }
+
+ m_composition->addTrack(*otIt);
+ }
+
+ for (unsigned int i = 0; i < m_oldSegments.size(); ++i)
+ m_composition->addSegment(m_oldSegments[i]);
+
+ m_detached = false;
+}
+
+}
diff --git a/src/commands/segment/DeleteTracksCommand.h b/src/commands/segment/DeleteTracksCommand.h
new file mode 100644
index 0000000..d1d2332
--- /dev/null
+++ b/src/commands/segment/DeleteTracksCommand.h
@@ -0,0 +1,68 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_DELETETRACKSCOMMAND_H_
+#define _RG_DELETETRACKSCOMMAND_H_
+
+#include <kcommand.h>
+#include <qstring.h>
+#include <vector>
+#include <klocale.h>
+#include "base/Track.h"
+
+
+namespace Rosegarden
+{
+
+class Track;
+class Segment;
+class Composition;
+
+
+class DeleteTracksCommand : public KNamedCommand
+{
+public:
+ DeleteTracksCommand(Composition *composition,
+ std::vector<TrackId> tracks);
+ virtual ~DeleteTracksCommand();
+
+ static QString getGlobalName() { return i18n("Delete Tracks..."); }
+
+ virtual void execute();
+ virtual void unexecute();
+
+protected:
+ Composition *m_composition;
+ std::vector<TrackId> m_tracks;
+
+ std::vector<Track*> m_oldTracks;
+ std::vector<Segment*> m_oldSegments;
+ bool m_detached;
+};
+
+
+}
+
+#endif
diff --git a/src/commands/segment/DeleteTriggerSegmentCommand.cpp b/src/commands/segment/DeleteTriggerSegmentCommand.cpp
new file mode 100644
index 0000000..3ddb4af
--- /dev/null
+++ b/src/commands/segment/DeleteTriggerSegmentCommand.cpp
@@ -0,0 +1,78 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "DeleteTriggerSegmentCommand.h"
+
+#include <klocale.h>
+#include "base/Composition.h"
+#include "base/Segment.h"
+#include "base/TriggerSegment.h"
+#include "document/RosegardenGUIDoc.h"
+
+
+namespace Rosegarden
+{
+
+DeleteTriggerSegmentCommand::DeleteTriggerSegmentCommand(RosegardenGUIDoc *doc,
+ TriggerSegmentId id) :
+ KNamedCommand(i18n("Delete Triggered Segment")),
+ m_composition(&doc->getComposition()),
+ m_id(id),
+ m_segment(0),
+ m_basePitch( -1),
+ m_baseVelocity( -1),
+ m_detached(true)
+{
+ // nothing else
+}
+
+DeleteTriggerSegmentCommand::~DeleteTriggerSegmentCommand()
+{
+ if (m_detached)
+ delete m_segment;
+}
+
+void
+DeleteTriggerSegmentCommand::execute()
+{
+ TriggerSegmentRec *rec = m_composition->getTriggerSegmentRec(m_id);
+ if (!rec)
+ return ;
+ m_segment = rec->getSegment();
+ m_basePitch = rec->getBasePitch();
+ m_baseVelocity = rec->getBaseVelocity();
+ m_composition->detachTriggerSegment(m_id);
+ m_detached = true;
+}
+
+void
+DeleteTriggerSegmentCommand::unexecute()
+{
+ if (m_segment)
+ m_composition->addTriggerSegment(m_segment, m_id, m_basePitch, m_baseVelocity);
+ m_detached = false;
+}
+
+}
diff --git a/src/commands/segment/DeleteTriggerSegmentCommand.h b/src/commands/segment/DeleteTriggerSegmentCommand.h
new file mode 100644
index 0000000..30986f7
--- /dev/null
+++ b/src/commands/segment/DeleteTriggerSegmentCommand.h
@@ -0,0 +1,66 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_DELETETRIGGERSEGMENTCOMMAND_H_
+#define _RG_DELETETRIGGERSEGMENTCOMMAND_H_
+
+#include "base/TriggerSegment.h"
+#include <kcommand.h>
+
+
+
+
+namespace Rosegarden
+{
+
+class Segment;
+class RosegardenGUIDoc;
+class Composition;
+
+
+class DeleteTriggerSegmentCommand : public KNamedCommand
+{
+public:
+ DeleteTriggerSegmentCommand(RosegardenGUIDoc *doc,
+ TriggerSegmentId);
+ virtual ~DeleteTriggerSegmentCommand();
+
+ virtual void execute();
+ virtual void unexecute();
+
+private:
+ Composition *m_composition;
+ TriggerSegmentId m_id;
+ Segment *m_segment;
+ int m_basePitch;
+ int m_baseVelocity;
+ bool m_detached;
+};
+
+
+
+}
+
+#endif
diff --git a/src/commands/segment/EraseSegmentsStartingInRangeCommand.cpp b/src/commands/segment/EraseSegmentsStartingInRangeCommand.cpp
new file mode 100644
index 0000000..35f7f10
--- /dev/null
+++ b/src/commands/segment/EraseSegmentsStartingInRangeCommand.cpp
@@ -0,0 +1,99 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "EraseSegmentsStartingInRangeCommand.h"
+
+#include <klocale.h>
+#include "base/Composition.h"
+#include "base/Segment.h"
+
+
+namespace Rosegarden
+{
+
+EraseSegmentsStartingInRangeCommand::EraseSegmentsStartingInRangeCommand(
+ Composition *composition,
+ timeT t0, timeT t1) :
+ KNamedCommand(i18n("Delete Range")),
+ m_composition(composition),
+ m_beginTime(t0),
+ m_endTime(t1),
+ m_detached(false)
+{}
+
+EraseSegmentsStartingInRangeCommand::~EraseSegmentsStartingInRangeCommand()
+{
+ if (m_detached) {
+ for (std::vector<Segment *>::iterator i = m_detaching.begin();
+ i != m_detaching.end(); ++i) {
+ delete *i;
+ }
+ }
+}
+
+void
+EraseSegmentsStartingInRangeCommand::execute()
+{
+ if (m_detaching.empty()) {
+
+ for (Composition::iterator i = m_composition->begin();
+ i != m_composition->end(); ++i) {
+
+ if ((*i)->getStartTime() >= m_beginTime &&
+ (*i)->getStartTime() < m_endTime) {
+ m_detaching.push_back(*i);
+ }
+ }
+ }
+
+ for (std::vector<Segment *>::iterator i = m_detaching.begin();
+ i != m_detaching.end(); ++i) {
+ m_composition->detachSegment(*i);
+ }
+
+ m_detached = true;
+}
+
+void
+EraseSegmentsStartingInRangeCommand::unexecute()
+{
+ for (std::vector<Segment *>::iterator i = m_detaching.begin();
+ i != m_detaching.end(); ++i) {
+
+ m_composition->addSegment(*i);
+
+ //!!! see horrible code in SegmentEraseCommand::unexecute()
+ // to restore the audio file ID association in audio file mgr
+ // when an audio segment is restored. Why is this necessary?
+ // What is the agency that removed the audio file association
+ // in the first place, and why? Need to investigate that
+ // before heedlessly duplicating the same horrors here.
+
+ }
+
+ m_detached = false;
+}
+
+}
diff --git a/src/commands/segment/EraseSegmentsStartingInRangeCommand.h b/src/commands/segment/EraseSegmentsStartingInRangeCommand.h
new file mode 100644
index 0000000..70b6978
--- /dev/null
+++ b/src/commands/segment/EraseSegmentsStartingInRangeCommand.h
@@ -0,0 +1,67 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_ERASESEGMENTSSTARTINGINRANGECOMMAND_H_
+#define _RG_ERASESEGMENTSSTARTINGINRANGECOMMAND_H_
+
+#include <kcommand.h>
+#include <vector>
+#include "base/Event.h"
+#include "gui/application/RosegardenDCOP.h"
+
+
+
+
+namespace Rosegarden
+{
+
+class Segment;
+class Composition;
+
+
+class EraseSegmentsStartingInRangeCommand : public KNamedCommand
+{
+public:
+ EraseSegmentsStartingInRangeCommand(Composition *composition,
+ timeT begin,
+ timeT end);
+ virtual ~EraseSegmentsStartingInRangeCommand();
+
+ virtual void execute();
+ virtual void unexecute();
+
+private:
+ Composition *m_composition;
+ timeT m_beginTime;
+ timeT m_endTime;
+
+ bool m_detached;
+ std::vector<Segment *> m_detaching;
+};
+
+
+}
+
+#endif
diff --git a/src/commands/segment/InsertRangeCommand.cpp b/src/commands/segment/InsertRangeCommand.cpp
new file mode 100644
index 0000000..73dc5fd
--- /dev/null
+++ b/src/commands/segment/InsertRangeCommand.cpp
@@ -0,0 +1,63 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "InsertRangeCommand.h"
+
+#include <klocale.h>
+#include "AudioSegmentSplitCommand.h"
+#include "base/Clipboard.h"
+#include "base/Composition.h"
+#include "base/Segment.h"
+#include "OpenOrCloseRangeCommand.h"
+#include "SegmentSplitCommand.h"
+
+
+namespace Rosegarden
+{
+
+InsertRangeCommand::InsertRangeCommand(Composition *composition,
+ timeT t0, timeT duration) :
+ KMacroCommand(i18n("Insert Range"))
+{
+ // Need to split segments before opening, at t0
+
+ for (Composition::iterator i = composition->begin();
+ i != composition->end(); ++i) {
+
+ if ((*i)->getStartTime() >= t0 || (*i)->getEndMarkerTime() <= t0) {
+ continue;
+ }
+
+ if ((*i)->getType() == Segment::Audio) {
+ addCommand(new AudioSegmentSplitCommand(*i, t0));
+ } else {
+ addCommand(new SegmentSplitCommand(*i, t0));
+ }
+ }
+
+ addCommand(new OpenOrCloseRangeCommand(composition, t0, t0 + duration, true));
+}
+
+}
diff --git a/src/commands/segment/InsertRangeCommand.h b/src/commands/segment/InsertRangeCommand.h
new file mode 100644
index 0000000..e3960c8
--- /dev/null
+++ b/src/commands/segment/InsertRangeCommand.h
@@ -0,0 +1,47 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_INSERTRANGECOMMAND_H_
+#define _RG_INSERTRANGECOMMAND_H_
+
+#include "base/Event.h"
+#include <kcommand.h>
+
+namespace Rosegarden
+{
+
+class Composition;
+
+class InsertRangeCommand : public KMacroCommand
+{
+public:
+ InsertRangeCommand(Composition *composition,
+ timeT startTime, timeT duration);
+};
+
+
+}
+
+#endif
diff --git a/src/commands/segment/ModifyDefaultTempoCommand.cpp b/src/commands/segment/ModifyDefaultTempoCommand.cpp
new file mode 100644
index 0000000..88360a4
--- /dev/null
+++ b/src/commands/segment/ModifyDefaultTempoCommand.cpp
@@ -0,0 +1,48 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "ModifyDefaultTempoCommand.h"
+
+#include "base/Composition.h"
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+void
+ModifyDefaultTempoCommand::execute()
+{
+ m_oldTempo = m_composition->getCompositionDefaultTempo();
+ m_composition->setCompositionDefaultTempo(m_tempo);
+}
+
+void
+ModifyDefaultTempoCommand::unexecute()
+{
+ m_composition->setCompositionDefaultTempo(m_oldTempo);
+}
+
+}
diff --git a/src/commands/segment/ModifyDefaultTempoCommand.h b/src/commands/segment/ModifyDefaultTempoCommand.h
new file mode 100644
index 0000000..50f736d
--- /dev/null
+++ b/src/commands/segment/ModifyDefaultTempoCommand.h
@@ -0,0 +1,66 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_MODIFYDEFAULTTEMPOCOMMAND_H_
+#define _RG_MODIFYDEFAULTTEMPOCOMMAND_H_
+
+#include <kcommand.h>
+#include <qstring.h>
+#include <klocale.h>
+#include "base/Composition.h" // for tempoT
+
+
+
+namespace Rosegarden
+{
+
+
+class ModifyDefaultTempoCommand : public KNamedCommand
+{
+public:
+ ModifyDefaultTempoCommand(Composition *composition,
+ tempoT tempo):
+ KNamedCommand(getGlobalName()),
+ m_composition(composition),
+ m_tempo(tempo) {}
+
+ virtual ~ModifyDefaultTempoCommand() {}
+
+ static QString getGlobalName() { return i18n("Modify &Default Tempo..."); }
+
+ virtual void execute();
+ virtual void unexecute();
+
+private:
+ Composition *m_composition;
+ tempoT m_tempo;
+ tempoT m_oldTempo;
+};
+
+
+
+}
+
+#endif
diff --git a/src/commands/segment/MoveTracksCommand.cpp b/src/commands/segment/MoveTracksCommand.cpp
new file mode 100644
index 0000000..49c089b
--- /dev/null
+++ b/src/commands/segment/MoveTracksCommand.cpp
@@ -0,0 +1,76 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "MoveTracksCommand.h"
+
+#include "base/Composition.h"
+#include "base/Track.h"
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+MoveTracksCommand::MoveTracksCommand(Composition *composition,
+ TrackId srcTrack,
+ TrackId destTrack):
+ KNamedCommand(getGlobalName()),
+ m_composition(composition),
+ m_srcTrack(srcTrack),
+ m_destTrack(destTrack)
+{}
+
+MoveTracksCommand::~MoveTracksCommand()
+{}
+
+void
+MoveTracksCommand::execute()
+{
+ Track *srcTrack = m_composition->getTrackById(m_srcTrack);
+ Track *destTrack = m_composition->getTrackById(m_destTrack);
+
+ int srcPosition = srcTrack->getPosition();
+
+ srcTrack->setPosition(destTrack->getPosition());
+ destTrack->setPosition(srcPosition);
+
+ m_composition->updateRefreshStatuses();
+}
+
+void
+MoveTracksCommand::unexecute()
+{
+ Track *srcTrack = m_composition->getTrackById(m_srcTrack);
+ Track *destTrack = m_composition->getTrackById(m_destTrack);
+
+ int srcPosition = srcTrack->getPosition();
+
+ srcTrack->setPosition(destTrack->getPosition());
+ destTrack->setPosition(srcPosition);
+
+ m_composition->updateRefreshStatuses();
+}
+
+}
diff --git a/src/commands/segment/MoveTracksCommand.h b/src/commands/segment/MoveTracksCommand.h
new file mode 100644
index 0000000..e35af5e
--- /dev/null
+++ b/src/commands/segment/MoveTracksCommand.h
@@ -0,0 +1,66 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_MOVETRACKSCOMMAND_H_
+#define _RG_MOVETRACKSCOMMAND_H_
+
+#include "base/Track.h"
+#include <kcommand.h>
+#include <qstring.h>
+#include <klocale.h>
+
+
+
+
+namespace Rosegarden
+{
+
+class Composition;
+
+
+class MoveTracksCommand : public KNamedCommand
+{
+public:
+ MoveTracksCommand(Composition *composition,
+ TrackId srcTrack,
+ TrackId destTrack);
+ virtual ~MoveTracksCommand();
+
+ static QString getGlobalName() { return i18n("Move Tracks..."); }
+
+ virtual void execute();
+ virtual void unexecute();
+
+protected:
+ Composition *m_composition;
+
+ TrackId m_srcTrack;
+ TrackId m_destTrack;
+};
+
+
+}
+
+#endif
diff --git a/src/commands/segment/OpenOrCloseRangeCommand.cpp b/src/commands/segment/OpenOrCloseRangeCommand.cpp
new file mode 100644
index 0000000..ad1db2c
--- /dev/null
+++ b/src/commands/segment/OpenOrCloseRangeCommand.cpp
@@ -0,0 +1,181 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "OpenOrCloseRangeCommand.h"
+
+#include <klocale.h>
+#include "misc/Debug.h"
+#include "base/Composition.h"
+#include "base/NotationTypes.h"
+#include "base/Segment.h"
+#include "base/Selection.h"
+
+
+namespace Rosegarden
+{
+
+OpenOrCloseRangeCommand::OpenOrCloseRangeCommand(Composition *composition,
+ timeT rangeBegin,
+ timeT rangeEnd,
+ bool open) :
+ KNamedCommand(i18n("Open or Close Range")),
+ m_composition(composition),
+ m_beginTime(rangeBegin),
+ m_endTime(rangeEnd),
+ m_prepared(false),
+ m_opening(open)
+{}
+
+OpenOrCloseRangeCommand::~OpenOrCloseRangeCommand()
+{}
+
+void
+OpenOrCloseRangeCommand::execute()
+{
+ timeT offset = m_endTime - m_beginTime;
+ if (!m_opening)
+ offset = -offset;
+
+ if (m_opening) {
+ if (offset + m_composition->getDuration() >
+ m_composition->getEndMarker()) {
+ m_composition->setEndMarker
+ (m_composition->getBarEndForTime
+ (m_composition->getDuration() + offset));
+ }
+ }
+
+ if (!m_prepared) {
+
+ timeT movingFrom = m_beginTime;
+ if (!m_opening)
+ movingFrom = m_endTime;
+
+ for (Composition::iterator i = m_composition->begin();
+ i != m_composition->end(); ++i) {
+
+ if ((*i)->getStartTime() >= movingFrom) {
+ m_moving.push_back(*i);
+ }
+ }
+
+ m_timesigsPre = TimeSignatureSelection
+ (*m_composition, movingFrom,
+ m_composition->getEndMarker(),
+ false);
+
+ m_temposPre = TempoSelection
+ (*m_composition, movingFrom,
+ m_composition->getEndMarker(),
+ false);
+
+ for (TimeSignatureSelection::timesigcontainer::const_iterator i =
+ m_timesigsPre.begin(); i != m_timesigsPre.end(); ++i) {
+
+ timeT t = i->first;
+ TimeSignature sig = i->second;
+ m_timesigsPost.addTimeSignature(t + offset, sig);
+ }
+
+ for (TempoSelection::tempocontainer::const_iterator i =
+ m_temposPre.begin(); i != m_temposPre.end(); ++i) {
+
+ timeT t = i->first;
+ TempoSelection::tempochange change = i->second;
+ m_temposPost.addTempo(t + offset, change.first, change.second);
+ }
+
+ m_prepared = true;
+ }
+
+ for (std::vector<Segment *>::iterator i = m_moving.begin();
+ i != m_moving.end(); ++i) {
+ // RG_DEBUG << "Moving segment on track " << (*i)->getTrack() << " from " << (*i)->getStartTime() << " to " << ((*i)->getStartTime() + offset) << " (current end time is " << (*i)->getEndTime() << ", end marker is " << (*i)->getEndMarkerTime() << ")" << endl;
+ (*i)->setStartTime((*i)->getStartTime() + offset);
+ }
+
+ for (TimeSignatureSelection::timesigcontainer::const_iterator i =
+ m_timesigsPre.begin(); i != m_timesigsPre.end(); ++i) {
+ int n = m_composition->getTimeSignatureNumberAt(i->first);
+ if (n >= 0)
+ m_composition->removeTimeSignature(n);
+ }
+
+ for (TimeSignatureSelection::timesigcontainer::const_iterator i =
+ m_timesigsPost.begin(); i != m_timesigsPost.end(); ++i) {
+ m_composition->addTimeSignature(i->first, i->second);
+ }
+
+ for (TempoSelection::tempocontainer::const_iterator i =
+ m_temposPre.begin(); i != m_temposPre.end(); ++i) {
+ int n = m_composition->getTempoChangeNumberAt(i->first);
+ if (n >= 0)
+ m_composition->removeTempoChange(n);
+ }
+
+ for (TempoSelection::tempocontainer::const_iterator i =
+ m_temposPost.begin(); i != m_temposPost.end(); ++i) {
+ m_composition->addTempoAtTime(i->first, i->second.first, i->second.second);
+ }
+}
+
+void
+OpenOrCloseRangeCommand::unexecute()
+{
+ timeT offset = m_beginTime - m_endTime;
+ if (!m_opening)
+ offset = -offset;
+
+ for (std::vector<Segment *>::iterator i = m_moving.begin();
+ i != m_moving.end(); ++i) {
+ (*i)->setStartTime((*i)->getStartTime() + offset);
+ }
+
+ for (TimeSignatureSelection::timesigcontainer::const_iterator i =
+ m_timesigsPost.begin(); i != m_timesigsPost.end(); ++i) {
+ int n = m_composition->getTimeSignatureNumberAt(i->first);
+ if (n >= 0)
+ m_composition->removeTimeSignature(n);
+ }
+
+ for (TimeSignatureSelection::timesigcontainer::const_iterator i =
+ m_timesigsPre.begin(); i != m_timesigsPre.end(); ++i) {
+ m_composition->addTimeSignature(i->first, i->second);
+ }
+
+ for (TempoSelection::tempocontainer::const_iterator i =
+ m_temposPost.begin(); i != m_temposPost.end(); ++i) {
+ int n = m_composition->getTempoChangeNumberAt(i->first);
+ if (n >= 0)
+ m_composition->removeTempoChange(n);
+ }
+
+ for (TempoSelection::tempocontainer::const_iterator i =
+ m_temposPre.begin(); i != m_temposPre.end(); ++i) {
+ m_composition->addTempoAtTime(i->first, i->second.first, i->second.second);
+ }
+}
+
+}
diff --git a/src/commands/segment/OpenOrCloseRangeCommand.h b/src/commands/segment/OpenOrCloseRangeCommand.h
new file mode 100644
index 0000000..6cb0f16
--- /dev/null
+++ b/src/commands/segment/OpenOrCloseRangeCommand.h
@@ -0,0 +1,84 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_OPENORCLOSERANGECOMMAND_H_
+#define _RG_OPENORCLOSERANGECOMMAND_H_
+
+#include "base/Selection.h"
+#include <kcommand.h>
+#include <vector>
+#include "base/Event.h"
+
+
+
+
+namespace Rosegarden
+{
+
+class Segment;
+class Composition;
+
+
+/**
+ * Pull all segments, time sigs, tempos etc starting after the end of
+ * a given range back by the duration of that range, so as to fill in
+ * the (presumably empty) range itself.
+ *
+ * This does not actually split any segments etc, it just moves them.
+ */
+class OpenOrCloseRangeCommand : public KNamedCommand
+{
+public:
+ OpenOrCloseRangeCommand(Composition *composition,
+ timeT rangeBegin,
+ timeT rangeEnd,
+ bool open);
+ virtual ~OpenOrCloseRangeCommand();
+
+ virtual void execute();
+ virtual void unexecute();
+
+private:
+ Composition *m_composition;
+ timeT m_beginTime;
+ timeT m_endTime;
+
+ bool m_prepared;
+ bool m_opening;
+
+ std::vector<Segment *> m_moving;
+
+ TimeSignatureSelection m_timesigsPre;
+ TimeSignatureSelection m_timesigsPost;
+
+ TempoSelection m_temposPre;
+ TempoSelection m_temposPost;
+};
+
+
+
+}
+
+#endif
diff --git a/src/commands/segment/PasteConductorDataCommand.cpp b/src/commands/segment/PasteConductorDataCommand.cpp
new file mode 100644
index 0000000..6db082f
--- /dev/null
+++ b/src/commands/segment/PasteConductorDataCommand.cpp
@@ -0,0 +1,128 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "PasteConductorDataCommand.h"
+
+#include <klocale.h>
+#include "base/Clipboard.h"
+#include "base/Composition.h"
+#include "base/NotationTypes.h"
+#include "base/Selection.h"
+
+
+namespace Rosegarden
+{
+
+PasteConductorDataCommand::PasteConductorDataCommand(Composition *composition,
+ Clipboard *clipboard,
+ timeT t) :
+ KNamedCommand(i18n("Paste Tempos and Time Signatures")),
+ m_composition(composition),
+ m_clipboard(new Clipboard(*clipboard)),
+ m_t0(t)
+{}
+
+PasteConductorDataCommand::~PasteConductorDataCommand()
+{
+ delete m_clipboard;
+}
+
+void
+PasteConductorDataCommand::execute()
+{
+ //!!! current implementation of execute and unexecute require
+ // that the target area of the composition be empty of tempo and
+ // timesig data before the command is executed
+
+ if (m_clipboard->hasTimeSignatureSelection()) {
+
+ for (TimeSignatureSelection::timesigcontainer::const_iterator i =
+ m_clipboard->getTimeSignatureSelection().begin();
+ i != m_clipboard->getTimeSignatureSelection().end(); ++i) {
+
+ timeT t = i->first;
+ t = t - m_clipboard->getBaseTime() + m_t0;
+ TimeSignature sig = i->second;
+
+ if (i == m_clipboard->getTimeSignatureSelection().begin() &&
+ m_composition->getTimeSignatureAt(t) == sig)
+ continue;
+
+ m_composition->addTimeSignature(t, sig);
+ }
+ }
+
+ if (m_clipboard->hasTempoSelection()) {
+
+ for (TempoSelection::tempocontainer::const_iterator i =
+ m_clipboard->getTempoSelection().begin();
+ i != m_clipboard->getTempoSelection().end(); ++i) {
+
+ timeT t = i->first;
+ t = t - m_clipboard->getBaseTime() + m_t0;
+ tempoT tempo = i->second.first;
+ tempoT targetTempo = i->second.second;
+
+ if (i == m_clipboard->getTempoSelection().begin() &&
+ targetTempo < 0 &&
+ m_composition->getTempoAtTime(t) == tempo)
+ continue;
+
+ m_composition->addTempoAtTime(t, tempo, targetTempo);
+ }
+ }
+}
+
+void
+PasteConductorDataCommand::unexecute()
+{
+ //!!! see note above
+
+ for (TimeSignatureSelection::timesigcontainer::const_iterator i =
+ m_clipboard->getTimeSignatureSelection().begin();
+ i != m_clipboard->getTimeSignatureSelection().end(); ++i) {
+
+ timeT t = i->first;
+ int n = m_composition->getTimeSignatureNumberAt(t);
+
+ if (n >= 0 && m_composition->getTimeSignatureChange(n).first == t) {
+ m_composition->removeTimeSignature(n);
+ }
+ }
+
+ for (TempoSelection::tempocontainer::const_iterator i =
+ m_clipboard->getTempoSelection().begin();
+ i != m_clipboard->getTempoSelection().end(); ++i) {
+
+ timeT t = i->first;
+ int n = m_composition->getTempoChangeNumberAt(t);
+
+ if (n >= 0 && m_composition->getTempoChange(n).first == t) {
+ m_composition->removeTempoChange(n);
+ }
+ }
+}
+
+}
diff --git a/src/commands/segment/PasteConductorDataCommand.h b/src/commands/segment/PasteConductorDataCommand.h
new file mode 100644
index 0000000..15b6e54
--- /dev/null
+++ b/src/commands/segment/PasteConductorDataCommand.h
@@ -0,0 +1,67 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_PASTECONDUCTORDATACOMMAND_H_
+#define _RG_PASTECONDUCTORDATACOMMAND_H_
+
+#include <kcommand.h>
+#include "base/Event.h"
+
+
+
+
+namespace Rosegarden
+{
+
+class Composition;
+class Clipboard;
+
+
+/**
+ * Paste time signature and tempo data from the given clipboard into
+ * the given composition starting at the given time.
+ */
+class PasteConductorDataCommand : public KNamedCommand
+{
+public:
+ PasteConductorDataCommand(Composition *composition,
+ Clipboard *clipboard,
+ timeT t);
+ virtual ~PasteConductorDataCommand();
+
+ virtual void execute();
+ virtual void unexecute();
+
+private:
+ Composition *m_composition;
+ Clipboard *m_clipboard;
+ timeT m_t0;
+};
+
+
+
+}
+
+#endif
diff --git a/src/commands/segment/PasteRangeCommand.cpp b/src/commands/segment/PasteRangeCommand.cpp
new file mode 100644
index 0000000..c2f9a0e
--- /dev/null
+++ b/src/commands/segment/PasteRangeCommand.cpp
@@ -0,0 +1,97 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "PasteRangeCommand.h"
+
+#include <klocale.h>
+#include "AudioSegmentSplitCommand.h"
+#include "base/Clipboard.h"
+#include "base/Composition.h"
+#include "base/Segment.h"
+#include "commands/edit/PasteSegmentsCommand.h"
+#include "OpenOrCloseRangeCommand.h"
+#include "PasteConductorDataCommand.h"
+#include "SegmentSplitCommand.h"
+
+
+namespace Rosegarden
+{
+
+PasteRangeCommand::PasteRangeCommand(Composition *composition,
+ Clipboard *clipboard,
+ timeT t0) :
+ KMacroCommand(i18n("Paste Range"))
+{
+ timeT clipBeginTime = clipboard->getBaseTime();
+
+ timeT t1 = t0;
+
+ if (clipboard->hasNominalRange()) {
+
+ clipboard->getNominalRange(clipBeginTime, t1);
+ t1 = t0 + (t1 - clipBeginTime);
+
+ } else {
+
+ timeT duration = 0;
+
+ for (Clipboard::iterator i = clipboard->begin();
+ i != clipboard->end(); ++i) {
+ timeT durationHere = (*i)->getEndMarkerTime() - clipBeginTime;
+ if (i == clipboard->begin() || durationHere > duration) {
+ duration = durationHere;
+ }
+ }
+
+ if (duration <= 0)
+ return ;
+ t1 = t0 + duration;
+ }
+
+ // Need to split segments before opening, at t0
+
+ for (Composition::iterator i = composition->begin();
+ i != composition->end(); ++i) {
+
+ if ((*i)->getStartTime() >= t0 || (*i)->getEndMarkerTime() <= t0) {
+ continue;
+ }
+
+ if ((*i)->getType() == Segment::Audio) {
+ addCommand(new AudioSegmentSplitCommand(*i, t0));
+ } else {
+ addCommand(new SegmentSplitCommand(*i, t0));
+ }
+ }
+
+ addCommand(new OpenOrCloseRangeCommand(composition, t0, t1, true));
+ addCommand(new PasteSegmentsCommand
+ (composition, clipboard, t0,
+ composition->getTrackByPosition(0)->getId(),
+ true));
+ addCommand(new PasteConductorDataCommand(composition, clipboard, t0));
+}
+
+}
diff --git a/src/commands/segment/PasteRangeCommand.h b/src/commands/segment/PasteRangeCommand.h
new file mode 100644
index 0000000..f64da24
--- /dev/null
+++ b/src/commands/segment/PasteRangeCommand.h
@@ -0,0 +1,52 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_PASTERANGECOMMAND_H_
+#define _RG_PASTERANGECOMMAND_H_
+
+#include "base/Event.h"
+#include <kcommand.h>
+
+
+namespace Rosegarden
+{
+
+class Composition;
+class Clipboard;
+
+
+class PasteRangeCommand : public KMacroCommand
+{
+public:
+ PasteRangeCommand(Composition *composition,
+ Clipboard *clipboard,
+ timeT pasteTime);
+};
+
+
+
+}
+
+#endif
diff --git a/src/commands/segment/PasteToTriggerSegmentCommand.cpp b/src/commands/segment/PasteToTriggerSegmentCommand.cpp
new file mode 100644
index 0000000..0447c40
--- /dev/null
+++ b/src/commands/segment/PasteToTriggerSegmentCommand.cpp
@@ -0,0 +1,129 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "PasteToTriggerSegmentCommand.h"
+
+#include "base/Event.h"
+#include <klocale.h>
+#include "misc/Strings.h"
+#include "base/Clipboard.h"
+#include "base/Composition.h"
+#include "base/NotationTypes.h"
+#include "base/Segment.h"
+#include "base/TriggerSegment.h"
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+PasteToTriggerSegmentCommand::PasteToTriggerSegmentCommand(Composition *composition,
+ Clipboard *clipboard,
+ QString label,
+ int basePitch,
+ int baseVelocity) :
+ KNamedCommand(i18n("Paste as New Triggered Segment")),
+ m_composition(composition),
+ m_clipboard(new Clipboard(*clipboard)),
+ m_label(label),
+ m_basePitch(basePitch),
+ m_baseVelocity(baseVelocity),
+ m_segment(0),
+ m_detached(false)
+{
+ // nothing else
+}
+
+PasteToTriggerSegmentCommand::~PasteToTriggerSegmentCommand()
+{
+ if (m_detached)
+ delete m_segment;
+ delete m_clipboard;
+}
+
+void
+PasteToTriggerSegmentCommand::execute()
+{
+ if (m_segment) {
+
+ m_composition->addTriggerSegment(m_segment, m_id, m_basePitch, m_baseVelocity);
+
+ } else {
+
+ if (m_clipboard->isEmpty())
+ return ;
+
+ m_segment = new Segment();
+
+ timeT earliestStartTime = 0;
+ timeT latestEndTime = 0;
+
+ for (Clipboard::iterator i = m_clipboard->begin();
+ i != m_clipboard->end(); ++i) {
+
+ if (i == m_clipboard->begin() ||
+ (*i)->getStartTime() < earliestStartTime) {
+ earliestStartTime = (*i)->getStartTime();
+ }
+
+ if ((*i)->getEndMarkerTime() > latestEndTime)
+ latestEndTime = (*i)->getEndMarkerTime();
+ }
+
+ for (Clipboard::iterator i = m_clipboard->begin();
+ i != m_clipboard->end(); ++i) {
+
+ for (Segment::iterator si = (*i)->begin();
+ (*i)->isBeforeEndMarker(si); ++si) {
+ if (!(*si)->isa(Note::EventRestType)) {
+ m_segment->insert
+ (new Event(**si,
+ (*si)->getAbsoluteTime() - earliestStartTime));
+ }
+ }
+ }
+
+ m_segment->setLabel(qstrtostr(m_label));
+
+ TriggerSegmentRec *rec =
+ m_composition->addTriggerSegment(m_segment, m_basePitch, m_baseVelocity);
+ if (rec)
+ m_id = rec->getId();
+ }
+
+ m_composition->getTriggerSegmentRec(m_id)->updateReferences();
+
+ m_detached = false;
+}
+
+void
+PasteToTriggerSegmentCommand::unexecute()
+{
+ if (m_segment)
+ m_composition->detachTriggerSegment(m_id);
+ m_detached = true;
+}
+
+}
diff --git a/src/commands/segment/PasteToTriggerSegmentCommand.h b/src/commands/segment/PasteToTriggerSegmentCommand.h
new file mode 100644
index 0000000..32f95e7
--- /dev/null
+++ b/src/commands/segment/PasteToTriggerSegmentCommand.h
@@ -0,0 +1,73 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_PASTETOTRIGGERSEGMENTCOMMAND_H_
+#define _RG_PASTETOTRIGGERSEGMENTCOMMAND_H_
+
+#include "base/TriggerSegment.h"
+#include <kcommand.h>
+#include <qstring.h>
+
+
+
+
+namespace Rosegarden
+{
+
+class Segment;
+class Composition;
+class Clipboard;
+
+
+class PasteToTriggerSegmentCommand : public KNamedCommand
+{
+public:
+ /// If basePitch is -1, the first pitch in the selection will be used
+ PasteToTriggerSegmentCommand(Composition *composition,
+ Clipboard *clipboard,
+ QString label,
+ int basePitch = -1,
+ int baseVelocity = -1);
+ virtual ~PasteToTriggerSegmentCommand();
+
+ virtual void execute();
+ virtual void unexecute();
+
+protected:
+ Composition *m_composition;
+ Clipboard *m_clipboard;
+ QString m_label;
+ int m_basePitch;
+ int m_baseVelocity;
+ Segment *m_segment;
+ TriggerSegmentId m_id;
+ bool m_detached;
+};
+
+
+
+}
+
+#endif
diff --git a/src/commands/segment/RemoveTempoChangeCommand.cpp b/src/commands/segment/RemoveTempoChangeCommand.cpp
new file mode 100644
index 0000000..11a89ad
--- /dev/null
+++ b/src/commands/segment/RemoveTempoChangeCommand.cpp
@@ -0,0 +1,59 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "RemoveTempoChangeCommand.h"
+
+#include "base/Composition.h"
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+void
+RemoveTempoChangeCommand::execute()
+{
+ if (m_tempoChangeIndex >= 0) {
+ std::pair<timeT, tempoT> data =
+ m_composition->getTempoChange(m_tempoChangeIndex);
+
+ // store
+ m_oldTime = data.first;
+ m_oldTempo = data.second;
+ }
+
+ // do we need to (re)store the index number?
+ //
+ m_composition->removeTempoChange(m_tempoChangeIndex);
+
+}
+
+void
+RemoveTempoChangeCommand::unexecute()
+{
+ m_composition->addTempoAtTime(m_oldTime, m_oldTempo);
+}
+
+}
diff --git a/src/commands/segment/RemoveTempoChangeCommand.h b/src/commands/segment/RemoveTempoChangeCommand.h
new file mode 100644
index 0000000..1900a8b
--- /dev/null
+++ b/src/commands/segment/RemoveTempoChangeCommand.h
@@ -0,0 +1,75 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_REMOVETEMPOCHANGECOMMAND_H_
+#define _RG_REMOVETEMPOCHANGECOMMAND_H_
+
+#include <kcommand.h>
+#include <qstring.h>
+#include "base/Event.h"
+#include "base/Composition.h" // for tempoT
+#include <klocale.h>
+
+
+class Remove;
+
+
+namespace Rosegarden
+{
+
+class Composition;
+
+
+class RemoveTempoChangeCommand : public KNamedCommand
+{
+public:
+ RemoveTempoChangeCommand(Composition *composition,
+ int index):
+ KNamedCommand(getGlobalName()),
+ m_composition(composition),
+ m_tempoChangeIndex(index),
+ m_oldTime(0),
+ m_oldTempo(0){}
+
+ virtual ~RemoveTempoChangeCommand() {}
+
+ static QString getGlobalName() { return i18n("Remove &Tempo Change..."); }
+
+ virtual void execute();
+ virtual void unexecute();
+
+private:
+ Composition *m_composition;
+ int m_tempoChangeIndex;
+ timeT m_oldTime;
+ tempoT m_oldTempo;
+};
+
+
+
+
+}
+
+#endif
diff --git a/src/commands/segment/RemoveTimeSignatureCommand.cpp b/src/commands/segment/RemoveTimeSignatureCommand.cpp
new file mode 100644
index 0000000..c6b59b1
--- /dev/null
+++ b/src/commands/segment/RemoveTimeSignatureCommand.cpp
@@ -0,0 +1,60 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "RemoveTimeSignatureCommand.h"
+
+#include "base/Composition.h"
+#include "base/NotationTypes.h"
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+void
+RemoveTimeSignatureCommand::execute()
+{
+ if (m_timeSigIndex >= 0) {
+ std::pair<timeT, TimeSignature> data =
+ m_composition->getTimeSignatureChange(m_timeSigIndex);
+
+ // store
+ m_oldTime = data.first;
+ m_oldTimeSignature = data.second;
+ }
+
+ // do we need to (re)store the index number?
+ //
+ m_composition->removeTimeSignature(m_timeSigIndex);
+
+}
+
+void
+RemoveTimeSignatureCommand::unexecute()
+{
+ m_composition->addTimeSignature(m_oldTime, m_oldTimeSignature);
+}
+
+}
diff --git a/src/commands/segment/RemoveTimeSignatureCommand.h b/src/commands/segment/RemoveTimeSignatureCommand.h
new file mode 100644
index 0000000..d29d666
--- /dev/null
+++ b/src/commands/segment/RemoveTimeSignatureCommand.h
@@ -0,0 +1,74 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_REMOVETIMESIGNATURECOMMAND_H_
+#define _RG_REMOVETIMESIGNATURECOMMAND_H_
+
+#include "base/NotationTypes.h"
+#include <kcommand.h>
+#include <qstring.h>
+#include "base/Event.h"
+#include <klocale.h>
+
+
+class Remove;
+
+
+namespace Rosegarden
+{
+
+class Composition;
+
+
+class RemoveTimeSignatureCommand : public KNamedCommand
+{
+public:
+ RemoveTimeSignatureCommand(Composition *composition,
+ int index):
+ KNamedCommand(getGlobalName()),
+ m_composition(composition),
+ m_timeSigIndex(index),
+ m_oldTime(0),
+ m_oldTimeSignature() { }
+
+ virtual ~RemoveTimeSignatureCommand() {}
+
+ static QString getGlobalName() { return i18n("Remove &Time Signature Change..."); }
+
+ virtual void execute();
+ virtual void unexecute();
+
+private:
+ Composition *m_composition;
+ int m_timeSigIndex;
+ timeT m_oldTime;
+ TimeSignature m_oldTimeSignature;
+};
+
+
+
+}
+
+#endif
diff --git a/src/commands/segment/RenameTrackCommand.cpp b/src/commands/segment/RenameTrackCommand.cpp
new file mode 100644
index 0000000..62d1d7e
--- /dev/null
+++ b/src/commands/segment/RenameTrackCommand.cpp
@@ -0,0 +1,75 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "RenameTrackCommand.h"
+
+#include "misc/Debug.h"
+#include "base/Composition.h"
+#include "base/Track.h"
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+RenameTrackCommand::RenameTrackCommand(Composition *composition,
+ TrackId trackId,
+ std::string name) :
+ KNamedCommand(getGlobalName()),
+ m_composition(composition),
+ m_track(trackId),
+ m_newName(name)
+{
+ Track *track = composition->getTrackById(m_track);
+ if (!track) {
+ RG_DEBUG << "Hey! No Track in RenameTrackCommand (track id " << track
+ << ")!" << endl;
+ return ;
+ }
+ m_oldName = track->getLabel();
+}
+
+RenameTrackCommand::~RenameTrackCommand()
+{}
+
+void
+RenameTrackCommand::execute()
+{
+ Track *track = m_composition->getTrackById(m_track);
+ if (!track)
+ return ;
+ track->setLabel(m_newName);
+}
+
+void
+RenameTrackCommand::unexecute()
+{
+ Track *track = m_composition->getTrackById(m_track);
+ if (!track)
+ return ;
+ track->setLabel(m_oldName);
+}
+
+}
diff --git a/src/commands/segment/RenameTrackCommand.h b/src/commands/segment/RenameTrackCommand.h
new file mode 100644
index 0000000..8e63a88
--- /dev/null
+++ b/src/commands/segment/RenameTrackCommand.h
@@ -0,0 +1,67 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_RENAMETRACKCOMMAND_H_
+#define _RG_RENAMETRACKCOMMAND_H_
+
+#include "base/Track.h"
+#include <string>
+#include <kcommand.h>
+#include <qstring.h>
+#include <klocale.h>
+
+
+
+
+namespace Rosegarden
+{
+
+class Composition;
+
+
+class RenameTrackCommand : public KNamedCommand
+{
+public:
+ RenameTrackCommand(Composition *composition,
+ TrackId track,
+ std::string name);
+ virtual ~RenameTrackCommand();
+
+ static QString getGlobalName() { return i18n("Rename Track"); }
+
+ virtual void execute();
+ virtual void unexecute();
+
+protected:
+ Composition *m_composition;
+ TrackId m_track;
+ std::string m_oldName;
+ std::string m_newName;
+};
+
+
+}
+
+#endif
diff --git a/src/commands/segment/SegmentAutoSplitCommand.cpp b/src/commands/segment/SegmentAutoSplitCommand.cpp
new file mode 100644
index 0000000..fbd6daa
--- /dev/null
+++ b/src/commands/segment/SegmentAutoSplitCommand.cpp
@@ -0,0 +1,205 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "SegmentAutoSplitCommand.h"
+
+#include "base/Event.h"
+#include "misc/Debug.h"
+#include "misc/Strings.h"
+#include "base/Composition.h"
+#include "base/NotationTypes.h"
+#include "base/Segment.h"
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+struct AutoSplitPoint
+{
+ timeT time;
+ timeT lastSoundTime;
+ Clef clef;
+ Rosegarden::Key key;
+ AutoSplitPoint(timeT t, timeT lst, Clef c, Rosegarden::Key k) :
+ time(t), lastSoundTime(lst), clef(c), key(k) { }
+};
+
+SegmentAutoSplitCommand::SegmentAutoSplitCommand(Segment *segment) :
+ KNamedCommand(getGlobalName()),
+ m_segment(segment),
+ m_composition(segment->getComposition()),
+ m_detached(false)
+{}
+
+SegmentAutoSplitCommand::~SegmentAutoSplitCommand()
+{
+ if (m_detached) {
+ delete m_segment;
+ } else {
+ for (unsigned int i = 0; i < m_newSegments.size(); ++i) {
+ delete m_newSegments[i];
+ }
+ }
+}
+
+void
+SegmentAutoSplitCommand::execute()
+{
+ if (m_newSegments.size() == 0) {
+
+ std::vector<AutoSplitPoint> splitPoints;
+
+ Clef clef;
+ Key key;
+ timeT segmentStart = m_segment->getStartTime();
+ timeT lastSoundTime = segmentStart;
+ timeT lastSplitTime = segmentStart - 1;
+
+ for (Segment::iterator i = m_segment->begin();
+ m_segment->isBeforeEndMarker(i); ++i) {
+
+ timeT myTime = (*i)->getAbsoluteTime();
+ int barNo = m_composition->getBarNumber(myTime);
+
+ if ((*i)->isa(Clef::EventType)) {
+ clef = Clef(**i);
+ } else if ((*i)->isa(Key::EventType)) {
+ key = Key(**i);
+ }
+
+ if (myTime <= lastSplitTime)
+ continue;
+
+ bool newTimeSig = false;
+ TimeSignature tsig =
+ m_composition->getTimeSignatureInBar(barNo, newTimeSig);
+
+ if (newTimeSig) {
+
+ // If there's a new time sig in this bar and we haven't
+ // already made a split in this bar, make one
+
+ if (splitPoints.size() == 0 ||
+ m_composition->getBarNumber
+ (splitPoints[splitPoints.size() - 1].time) < barNo) {
+
+ splitPoints.push_back(AutoSplitPoint(myTime, lastSoundTime,
+ clef, key));
+ lastSoundTime = lastSplitTime = myTime;
+ }
+
+ } else if ((*i)->isa(Note::EventRestType)) {
+
+ // Otherwise never start a subsegment on a rest
+
+ continue;
+
+ } else {
+
+ // When we meet a non-rest event, start a new split
+ // if an entire bar has passed since the last one
+
+ int lastSoundBarNo = m_composition->getBarNumber(lastSoundTime);
+
+ if (lastSoundBarNo < barNo - 1 ||
+ (lastSoundBarNo == barNo - 1 &&
+ m_composition->getBarStartForTime(lastSoundTime) ==
+ lastSoundTime &&
+ lastSoundTime > segmentStart)) {
+
+ splitPoints.push_back
+ (AutoSplitPoint
+ (m_composition->getBarStartForTime(myTime), lastSoundTime,
+ clef, key));
+ lastSplitTime = myTime;
+ }
+ }
+
+ lastSoundTime = std::max(lastSoundTime, myTime + (*i)->getDuration());
+ }
+
+ for (unsigned int split = 0; split <= splitPoints.size(); ++split) {
+
+ Segment *newSegment = new Segment();
+ newSegment->setTrack(m_segment->getTrack());
+ newSegment->setLabel(qstrtostr(i18n("%1 (part)").arg
+ (strtoqstr(m_segment->getLabel()))));
+ newSegment->setColourIndex(m_segment->getColourIndex());
+
+ timeT startTime = segmentStart;
+ if (split > 0) {
+
+ RG_DEBUG << "Auto-split point " << split - 1 << ": time "
+ << splitPoints[split - 1].time << ", lastSoundTime "
+ << splitPoints[split - 1].lastSoundTime << endl;
+
+ startTime = splitPoints[split - 1].time;
+ newSegment->insert(splitPoints[split - 1].clef.getAsEvent(startTime));
+ newSegment->insert(splitPoints[split - 1].key.getAsEvent(startTime));
+ }
+
+ Segment::iterator i = m_segment->findTime(startTime);
+
+ // A segment has to contain at least one note to be a worthy
+ // candidate for adding back into the composition
+ bool haveNotes = false;
+
+ while (m_segment->isBeforeEndMarker(i)) {
+ timeT t = (*i)->getAbsoluteTime();
+ if (split < splitPoints.size() &&
+ t >= splitPoints[split].lastSoundTime)
+ break;
+ if ((*i)->isa(Note::EventType))
+ haveNotes = true;
+ newSegment->insert(new Event(**i));
+ ++i;
+ }
+
+ if (haveNotes)
+ m_newSegments.push_back(newSegment);
+ else
+ delete newSegment;
+ }
+ }
+
+ m_composition->detachSegment(m_segment);
+ for (unsigned int i = 0; i < m_newSegments.size(); ++i) {
+ m_composition->addSegment(m_newSegments[i]);
+ }
+ m_detached = true;
+}
+
+void
+SegmentAutoSplitCommand::unexecute()
+{
+ for (unsigned int i = 0; i < m_newSegments.size(); ++i) {
+ m_composition->detachSegment(m_newSegments[i]);
+ }
+ m_composition->addSegment(m_segment);
+ m_detached = false;
+}
+
+}
diff --git a/src/commands/segment/SegmentAutoSplitCommand.h b/src/commands/segment/SegmentAutoSplitCommand.h
new file mode 100644
index 0000000..a7e54c7
--- /dev/null
+++ b/src/commands/segment/SegmentAutoSplitCommand.h
@@ -0,0 +1,66 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_SEGMENTAUTOSPLITCOMMAND_H_
+#define _RG_SEGMENTAUTOSPLITCOMMAND_H_
+
+#include <kcommand.h>
+#include <qstring.h>
+#include <vector>
+#include <klocale.h>
+
+
+
+
+namespace Rosegarden
+{
+
+class Segment;
+class Composition;
+
+
+class SegmentAutoSplitCommand : public KNamedCommand
+{
+public:
+ SegmentAutoSplitCommand(Segment *segment);
+ virtual ~SegmentAutoSplitCommand();
+
+ virtual void execute();
+ virtual void unexecute();
+
+ static QString getGlobalName() { return i18n("&Split on Silence"); }
+
+private:
+ Segment *m_segment;
+ Composition *m_composition;
+ std::vector<Segment *> m_newSegments;
+ bool m_detached;
+};
+
+
+
+}
+
+#endif
diff --git a/src/commands/segment/SegmentChangePlayableRangeCommand.cpp b/src/commands/segment/SegmentChangePlayableRangeCommand.cpp
new file mode 100644
index 0000000..b4d5d3a
--- /dev/null
+++ b/src/commands/segment/SegmentChangePlayableRangeCommand.cpp
@@ -0,0 +1,77 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2007
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "SegmentChangePlayableRangeCommand.h"
+
+#include "base/Segment.h"
+#include "gui/editors/notation/NotationStrings.h"
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+SegmentChangePlayableRangeCommand::SegmentChangePlayableRangeCommand(int low, int high, Segment *segment) :
+ KNamedCommand(getGlobalName(low, high)),
+ m_lowestPlayableNote(low),
+ m_highestPlayableNote(high),
+ m_segment(segment)
+{
+ // nothing
+}
+
+SegmentChangePlayableRangeCommand::~SegmentChangePlayableRangeCommand()
+{
+ // nothing
+}
+
+void
+SegmentChangePlayableRangeCommand::execute()
+{
+ m_oldLowestPlayableNote = m_segment->getLowestPlayable();
+ m_oldHighestPlayableNote = m_segment->getHighestPlayable();
+ m_segment->setLowestPlayable(m_lowestPlayableNote);
+ m_segment->setHighestPlayable(m_highestPlayableNote);
+}
+
+void
+SegmentChangePlayableRangeCommand::unexecute()
+{
+ m_segment->setLowestPlayable(m_oldLowestPlayableNote);
+ m_segment->setHighestPlayable(m_oldHighestPlayableNote);
+}
+
+QString
+SegmentChangePlayableRangeCommand::getGlobalName(int low, int high)
+{
+ bool unit = false; // fake code to allow trunk/ to compile!
+ if (!unit) {
+ return "Undo change playable range";
+ } else {
+ return QString("Change playable range to %1-%2").arg(low, high);
+ }
+}
+
+}
diff --git a/src/commands/segment/SegmentChangePlayableRangeCommand.h b/src/commands/segment/SegmentChangePlayableRangeCommand.h
new file mode 100644
index 0000000..d78aa5c
--- /dev/null
+++ b/src/commands/segment/SegmentChangePlayableRangeCommand.h
@@ -0,0 +1,67 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2007
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_SEGMENTCHANGEPLAYABLERANGECOMMAND_H_
+#define _RG_SEGMENTCHANGEPLAYABLERANGECOMMAND_H_
+
+#include <kcommand.h>
+#include <qstring.h>
+#include <vector>
+#include "base/Event.h"
+
+
+
+
+namespace Rosegarden
+{
+
+class Segment;
+
+
+class SegmentChangePlayableRangeCommand : public KNamedCommand
+{
+public:
+ /// Set transpose on segments.
+ SegmentChangePlayableRangeCommand(int /*low*/, int /*high*/, Segment *segment);
+ virtual ~SegmentChangePlayableRangeCommand();
+
+ virtual void execute();
+ virtual void unexecute();
+
+ static QString getGlobalName(int, int);
+
+private:
+ Segment *m_segment;
+ int m_oldLowestPlayableNote;
+ int m_oldHighestPlayableNote;
+ int m_lowestPlayableNote;
+ int m_highestPlayableNote;
+};
+
+
+
+}
+
+#endif
diff --git a/src/commands/segment/SegmentChangeQuantizationCommand.cpp b/src/commands/segment/SegmentChangeQuantizationCommand.cpp
new file mode 100644
index 0000000..22d09f4
--- /dev/null
+++ b/src/commands/segment/SegmentChangeQuantizationCommand.cpp
@@ -0,0 +1,115 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "SegmentChangeQuantizationCommand.h"
+
+#include "base/Segment.h"
+#include "base/BasicQuantizer.h"
+#include "gui/editors/notation/NotationStrings.h"
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+SegmentChangeQuantizationCommand::SegmentChangeQuantizationCommand(timeT unit) :
+ KNamedCommand(getGlobalName(unit)),
+ m_unit(unit)
+{
+ // nothing
+}
+
+SegmentChangeQuantizationCommand::~SegmentChangeQuantizationCommand()
+{
+ // nothing
+}
+
+void
+SegmentChangeQuantizationCommand::execute()
+{
+ for (unsigned int i = 0; i < m_records.size(); ++i) {
+
+ SegmentRec &rec = m_records[i];
+
+ if (m_unit) {
+
+ rec.oldUnit = rec.segment->getQuantizer()->getUnit();
+ rec.segment->setQuantizeLevel(m_unit);
+
+ rec.wasQuantized = rec.segment->hasQuantization();
+ rec.segment->setQuantization(true);
+
+ } else {
+
+ rec.wasQuantized = rec.segment->hasQuantization();
+ rec.segment->setQuantization(false);
+ }
+ }
+}
+
+void
+SegmentChangeQuantizationCommand::unexecute()
+{
+ for (unsigned int i = 0; i < m_records.size(); ++i) {
+
+ SegmentRec &rec = m_records[i];
+
+ if (m_unit) {
+
+ if (!rec.wasQuantized)
+ rec.segment->setQuantization(false);
+ rec.segment->setQuantizeLevel(rec.oldUnit);
+
+ } else {
+
+ if (rec.wasQuantized)
+ rec.segment->setQuantization(true);
+ }
+ }
+}
+
+void
+SegmentChangeQuantizationCommand::addSegment(Segment *s)
+{
+ SegmentRec rec;
+ rec.segment = s;
+ rec.oldUnit = 0; // shouldn't matter what we initialise this to
+ rec.wasQuantized = false; // shouldn't matter what we initialise this to
+ m_records.push_back(rec);
+}
+
+QString
+SegmentChangeQuantizationCommand::getGlobalName(timeT unit)
+{
+ if (!unit) {
+ return "Unquantize";
+ } else {
+ timeT error = 0;
+ QString label = NotationStrings::makeNoteMenuLabel(unit, true, error);
+ return QString("Quantize to %1").arg(label);
+ }
+}
+
+}
diff --git a/src/commands/segment/SegmentChangeQuantizationCommand.h b/src/commands/segment/SegmentChangeQuantizationCommand.h
new file mode 100644
index 0000000..e5d7a36
--- /dev/null
+++ b/src/commands/segment/SegmentChangeQuantizationCommand.h
@@ -0,0 +1,73 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_SEGMENTCHANGEQUANTIZATIONCOMMAND_H_
+#define _RG_SEGMENTCHANGEQUANTIZATIONCOMMAND_H_
+
+#include <kcommand.h>
+#include <qstring.h>
+#include <vector>
+#include "base/Event.h"
+
+
+
+
+namespace Rosegarden
+{
+
+class Segment;
+
+
+class SegmentChangeQuantizationCommand : public KNamedCommand
+{
+public:
+ /// Set quantization on segments. If unit is zero, switch quantization off
+ SegmentChangeQuantizationCommand(timeT);
+ virtual ~SegmentChangeQuantizationCommand();
+
+ void addSegment(Segment *s);
+
+ virtual void execute();
+ virtual void unexecute();
+
+ static QString getGlobalName(timeT);
+
+private:
+ struct SegmentRec {
+ Segment *segment;
+ timeT oldUnit;
+ bool wasQuantized;
+ };
+ typedef std::vector<SegmentRec> SegmentRecSet;
+ SegmentRecSet m_records;
+
+ timeT m_unit;
+};
+
+
+
+}
+
+#endif
diff --git a/src/commands/segment/SegmentChangeTransposeCommand.cpp b/src/commands/segment/SegmentChangeTransposeCommand.cpp
new file mode 100644
index 0000000..452c2d7
--- /dev/null
+++ b/src/commands/segment/SegmentChangeTransposeCommand.cpp
@@ -0,0 +1,72 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "SegmentChangeTransposeCommand.h"
+
+#include "base/Segment.h"
+#include "gui/editors/notation/NotationStrings.h"
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+SegmentChangeTransposeCommand::SegmentChangeTransposeCommand(int unit, Segment *segment) :
+ KNamedCommand(getGlobalName(unit)),
+ m_unit(unit),
+ m_segment(segment)
+{
+ // nothing
+}
+
+SegmentChangeTransposeCommand::~SegmentChangeTransposeCommand()
+{
+ // nothing
+}
+
+void
+SegmentChangeTransposeCommand::execute()
+{
+ m_oldUnit = m_segment->getTranspose();
+ m_segment->setTranspose(m_unit);
+}
+
+void
+SegmentChangeTransposeCommand::unexecute()
+{
+ m_segment->setTranspose(m_oldUnit);
+}
+
+QString
+SegmentChangeTransposeCommand::getGlobalName(int unit)
+{
+ if (!unit) {
+ return "Undo change transposition";
+ } else {
+ return QString("Change transposition to %1").arg(unit);
+ }
+}
+
+}
diff --git a/src/commands/segment/SegmentChangeTransposeCommand.h b/src/commands/segment/SegmentChangeTransposeCommand.h
new file mode 100644
index 0000000..64bd75a
--- /dev/null
+++ b/src/commands/segment/SegmentChangeTransposeCommand.h
@@ -0,0 +1,65 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_SEGMENTCHANGETRANSPOSECOMMAND_H_
+#define _RG_SEGMENTCHANGETRANSPOSECOMMAND_H_
+
+#include <kcommand.h>
+#include <qstring.h>
+#include <vector>
+#include "base/Event.h"
+
+
+
+
+namespace Rosegarden
+{
+
+class Segment;
+
+
+class SegmentChangeTransposeCommand : public KNamedCommand
+{
+public:
+ /// Set transpose on segments.
+ SegmentChangeTransposeCommand(int, Segment *segment);
+ virtual ~SegmentChangeTransposeCommand();
+
+ virtual void execute();
+ virtual void unexecute();
+
+ static QString getGlobalName(int);
+
+private:
+ Segment *m_segment;
+ int m_oldUnit;
+ int m_unit;
+};
+
+
+
+}
+
+#endif
diff --git a/src/commands/segment/SegmentColourCommand.cpp b/src/commands/segment/SegmentColourCommand.cpp
new file mode 100644
index 0000000..7dffc8f
--- /dev/null
+++ b/src/commands/segment/SegmentColourCommand.cpp
@@ -0,0 +1,65 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "SegmentColourCommand.h"
+
+#include "base/Segment.h"
+#include "base/Selection.h"
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+SegmentColourCommand::SegmentColourCommand(
+ SegmentSelection &segments,
+ const unsigned int index):
+ KNamedCommand(i18n("Change Segment Color")),
+ m_newColourIndex(index)
+{
+ for (SegmentSelection::iterator i = segments.begin(); i != segments.end(); ++i)
+ m_segments.push_back(*i);
+}
+
+SegmentColourCommand::~SegmentColourCommand()
+{}
+
+void
+SegmentColourCommand::execute()
+{
+ for (unsigned int i = 0; i < m_segments.size(); ++i) {
+ m_oldColourIndexes.push_back(m_segments[i]->getColourIndex());
+ m_segments[i]->setColourIndex(m_newColourIndex);
+ }
+}
+
+void
+SegmentColourCommand::unexecute()
+{
+ for (unsigned int i = 0; i < m_segments.size(); ++i)
+ m_segments[i]->setColourIndex(m_oldColourIndexes[i]);
+}
+
+}
diff --git a/src/commands/segment/SegmentColourCommand.h b/src/commands/segment/SegmentColourCommand.h
new file mode 100644
index 0000000..79b7d3d
--- /dev/null
+++ b/src/commands/segment/SegmentColourCommand.h
@@ -0,0 +1,66 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_SEGMENTCOLOURCOMMAND_H_
+#define _RG_SEGMENTCOLOURCOMMAND_H_
+
+#include "base/Segment.h"
+#include <kcommand.h>
+#include <qstring.h>
+#include <vector>
+#include <klocale.h>
+
+
+
+
+namespace Rosegarden
+{
+
+class SegmentSelection;
+
+
+class SegmentColourCommand : public KNamedCommand
+{
+public:
+ SegmentColourCommand(SegmentSelection &segments,
+ const unsigned int index);
+ virtual ~SegmentColourCommand();
+
+ static QString getGlobalName()
+ { return i18n("Change Segment Color..."); }
+
+ virtual void execute();
+ virtual void unexecute();
+protected:
+
+ std::vector<Segment*> m_segments;
+ std::vector<unsigned int> m_oldColourIndexes;
+ unsigned int m_newColourIndex;
+};
+
+
+}
+
+#endif
diff --git a/src/commands/segment/SegmentColourMapCommand.cpp b/src/commands/segment/SegmentColourMapCommand.cpp
new file mode 100644
index 0000000..0e09d4b
--- /dev/null
+++ b/src/commands/segment/SegmentColourMapCommand.cpp
@@ -0,0 +1,64 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "SegmentColourMapCommand.h"
+
+#include "base/ColourMap.h"
+#include "base/Segment.h"
+#include "document/RosegardenGUIDoc.h"
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+SegmentColourMapCommand::SegmentColourMapCommand(
+ RosegardenGUIDoc *doc,
+ const ColourMap &map):
+ KNamedCommand(i18n("Change Segment Color Map")),
+ m_doc(doc),
+ m_oldMap(m_doc->getComposition().getSegmentColourMap()),
+ m_newMap(map)
+{
+}
+
+SegmentColourMapCommand::~SegmentColourMapCommand()
+{}
+
+void
+SegmentColourMapCommand::execute()
+{
+ m_doc->getComposition().setSegmentColourMap(m_newMap);
+ m_doc->slotDocColoursChanged();
+}
+
+void
+SegmentColourMapCommand::unexecute()
+{
+ m_doc->getComposition().setSegmentColourMap(m_oldMap);
+ m_doc->slotDocColoursChanged();
+}
+
+}
diff --git a/src/commands/segment/SegmentColourMapCommand.h b/src/commands/segment/SegmentColourMapCommand.h
new file mode 100644
index 0000000..257cdce
--- /dev/null
+++ b/src/commands/segment/SegmentColourMapCommand.h
@@ -0,0 +1,71 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_SEGMENTCOLOURMAPCOMMAND_H_
+#define _RG_SEGMENTCOLOURMAPCOMMAND_H_
+
+#include "base/ColourMap.h"
+#include "base/Segment.h"
+#include <kcommand.h>
+#include <qstring.h>
+#include <klocale.h>
+
+
+
+
+namespace Rosegarden
+{
+
+class RosegardenGUIDoc;
+
+
+class SegmentColourMapCommand : public KNamedCommand
+{
+public:
+ SegmentColourMapCommand( RosegardenGUIDoc* doc,
+ const ColourMap& map);
+ virtual ~SegmentColourMapCommand();
+
+ static QString getGlobalName()
+ { return i18n("Change Segment Color Map..."); }
+
+ virtual void execute();
+ virtual void unexecute();
+protected:
+ RosegardenGUIDoc * m_doc;
+ ColourMap m_oldMap;
+ ColourMap m_newMap;
+};
+
+
+// Trigger Segment commands. These are the commands that create
+// and manage the triggered segments themselves. See editcommands.h
+// for SetTriggerCommand and ClearTriggersCommand which manipulate
+// the events that do the triggering.
+
+
+}
+
+#endif
diff --git a/src/commands/segment/SegmentCommand.cpp b/src/commands/segment/SegmentCommand.cpp
new file mode 100644
index 0000000..68ff846
--- /dev/null
+++ b/src/commands/segment/SegmentCommand.cpp
@@ -0,0 +1,42 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "SegmentCommand.h"
+
+#include "base/Segment.h"
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+SegmentCommand::SegmentCommand(QString name, const std::vector<Segment*>& segments)
+ : KNamedCommand(name)
+{
+ m_segments.resize(segments.size());
+ std::copy(segments.begin(), segments.end(), m_segments.begin());
+}
+
+}
diff --git a/src/commands/segment/SegmentCommand.h b/src/commands/segment/SegmentCommand.h
new file mode 100644
index 0000000..da28a04
--- /dev/null
+++ b/src/commands/segment/SegmentCommand.h
@@ -0,0 +1,59 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_SEGMENTCOMMAND_H_
+#define _RG_SEGMENTCOMMAND_H_
+
+#include <kcommand.h>
+#include <qstring.h>
+#include <vector>
+
+
+
+
+namespace Rosegarden
+{
+
+class Segment;
+
+
+/**
+ * Base class for commands from the SegmentParameterBox
+ */
+class SegmentCommand : public KNamedCommand
+{
+public:
+ SegmentCommand(QString name, const std::vector<Segment*>&);
+
+ typedef std::vector<Segment*> segmentlist;
+
+protected:
+ segmentlist m_segments;
+};
+
+
+}
+
+#endif
diff --git a/src/commands/segment/SegmentCommandRepeat.cpp b/src/commands/segment/SegmentCommandRepeat.cpp
new file mode 100644
index 0000000..4b707cb
--- /dev/null
+++ b/src/commands/segment/SegmentCommandRepeat.cpp
@@ -0,0 +1,59 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "SegmentCommandRepeat.h"
+
+#include <klocale.h>
+#include "base/Segment.h"
+#include "SegmentCommand.h"
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+SegmentCommandRepeat::SegmentCommandRepeat(const std::vector<Segment*>& segments,
+ bool repeat)
+ : SegmentCommand(i18n("Repeat Segments"), segments),
+ m_repeatState(repeat)
+{}
+
+void SegmentCommandRepeat::execute()
+{
+ segmentlist::iterator it;
+
+ for (it = m_segments.begin(); it != m_segments.end(); it++)
+ (*it)->setRepeating(m_repeatState);
+}
+
+void SegmentCommandRepeat::unexecute()
+{
+ segmentlist::iterator it;
+
+ for (it = m_segments.begin(); it != m_segments.end(); it++)
+ (*it)->setRepeating(!m_repeatState);
+}
+
+}
diff --git a/src/commands/segment/SegmentCommandRepeat.h b/src/commands/segment/SegmentCommandRepeat.h
new file mode 100644
index 0000000..0234070
--- /dev/null
+++ b/src/commands/segment/SegmentCommandRepeat.h
@@ -0,0 +1,81 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_SEGMENTCOMMANDREPEAT_H_
+#define _RG_SEGMENTCOMMANDREPEAT_H_
+
+#include "SegmentCommand.h"
+#include <vector>
+
+
+
+
+namespace Rosegarden
+{
+
+class Segment;
+
+
+/**
+ * Repeat segment command from the SegmentParameterBox
+ */
+class SegmentCommandRepeat : public SegmentCommand
+{
+public:
+ SegmentCommandRepeat(const std::vector<Segment*>&,
+ bool repeat);
+
+ virtual void execute();
+ virtual void unexecute();
+
+protected:
+ bool m_repeatState;
+};
+
+// Disabled until we find a better solution
+//
+// As it is, command creation happens on every change of the text
+// value of the combo box
+//
+//
+// class SegmentCommandChangeTransposeValue : public SegmentCommand
+// {
+// public:
+// SegmentCommandChangeTransposeValue(const std::vector<Segment*>&,
+// int transposeValue);
+
+// virtual void execute();
+// virtual void unexecute();
+
+// protected:
+// int m_transposeValue;
+// std::vector<int> m_savedValues;
+// };
+
+
+
+}
+
+#endif
diff --git a/src/commands/segment/SegmentEraseCommand.cpp b/src/commands/segment/SegmentEraseCommand.cpp
new file mode 100644
index 0000000..b15788f
--- /dev/null
+++ b/src/commands/segment/SegmentEraseCommand.cpp
@@ -0,0 +1,108 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "SegmentEraseCommand.h"
+
+#include <klocale.h>
+#include "misc/Debug.h"
+#include "base/Composition.h"
+#include "base/Segment.h"
+#include "sound/AudioFile.h"
+#include "sound/AudioFileManager.h"
+
+
+namespace Rosegarden
+{
+
+SegmentEraseCommand::SegmentEraseCommand(Segment *segment) :
+ KNamedCommand(i18n("Erase Segment")),
+ m_composition(segment->getComposition()),
+ m_segment(segment),
+ m_mgr(0),
+ m_audioFileName(""),
+ m_detached(false)
+{
+ // nothing else
+}
+
+SegmentEraseCommand::SegmentEraseCommand(Segment *segment,
+ AudioFileManager *mgr) :
+ KNamedCommand(i18n("Erase Segment")),
+ m_composition(segment->getComposition()),
+ m_segment(segment),
+ m_mgr(mgr),
+ m_detached(false)
+{
+ // If this is an audio segment, we want to make a note of
+ // its associated file name in case we need to undo and restore
+ // the file.
+ if (m_segment->getType() == Segment::Audio) {
+ unsigned int id = m_segment->getAudioFileId();
+ AudioFile *file = mgr->getAudioFile(id);
+ if (file)
+ m_audioFileName = file->getFilename();
+ }
+}
+
+SegmentEraseCommand::~SegmentEraseCommand()
+{
+ // This is the only place in this command that the Segment can
+ // safely be deleted, and then only if it is not in the
+ // Composition (i.e. if we executed more recently than we
+ // unexecuted). Can't safely call through the m_segment pointer
+ // here; someone else might have got to it first
+
+ if (m_detached) {
+ delete m_segment;
+ }
+}
+
+void
+SegmentEraseCommand::execute()
+{
+ m_composition->detachSegment(m_segment);
+ m_detached = true;
+}
+
+void
+SegmentEraseCommand::unexecute()
+{
+ m_composition->addSegment(m_segment);
+ m_detached = false;
+
+ if (m_segment->getType() == Segment::Audio &&
+ m_audioFileName != "" &&
+ m_mgr) {
+ int id = m_mgr->fileExists(m_audioFileName);
+
+ RG_DEBUG << "SegmentEraseCommand::unexecute: file is " << m_audioFileName << endl;
+
+ if (id == -1)
+ id = (int)m_mgr->addFile(m_audioFileName);
+ m_segment->setAudioFileId(id);
+ }
+}
+
+}
diff --git a/src/commands/segment/SegmentEraseCommand.h b/src/commands/segment/SegmentEraseCommand.h
new file mode 100644
index 0000000..493cd14
--- /dev/null
+++ b/src/commands/segment/SegmentEraseCommand.h
@@ -0,0 +1,70 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_SEGMENTERASECOMMAND_H_
+#define _RG_SEGMENTERASECOMMAND_H_
+
+#include <string>
+#include <kcommand.h>
+
+
+
+
+namespace Rosegarden
+{
+
+class Segment;
+class Composition;
+class AudioFileManager;
+
+
+////////////////////////////////////////////////////////////
+
+class SegmentEraseCommand : public KNamedCommand
+{
+public:
+ /// for removing segment normally
+ SegmentEraseCommand(Segment *segment);
+
+ /// for removing audio segment when removing an audio file
+ SegmentEraseCommand(Segment *segment,
+ AudioFileManager *mgr);
+ virtual ~SegmentEraseCommand();
+
+ virtual void execute();
+ virtual void unexecute();
+
+private:
+ Composition *m_composition;
+ Segment *m_segment;
+ AudioFileManager *m_mgr;
+ std::string m_audioFileName;
+ bool m_detached;
+};
+
+
+}
+
+#endif
diff --git a/src/commands/segment/SegmentInsertCommand.cpp b/src/commands/segment/SegmentInsertCommand.cpp
new file mode 100644
index 0000000..f10ef45
--- /dev/null
+++ b/src/commands/segment/SegmentInsertCommand.cpp
@@ -0,0 +1,124 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "SegmentInsertCommand.h"
+
+#include <klocale.h>
+#include "base/Composition.h"
+#include "base/Segment.h"
+#include "base/Studio.h"
+#include "base/Track.h"
+#include "document/RosegardenGUIDoc.h"
+
+
+namespace Rosegarden
+{
+
+SegmentInsertCommand::SegmentInsertCommand(RosegardenGUIDoc *doc,
+ TrackId track,
+ timeT startTime,
+ timeT endTime):
+ KNamedCommand(i18n("Create Segment")),
+ m_composition(&(doc->getComposition())),
+ m_studio(&(doc->getStudio())),
+ m_segment(0),
+ m_track(track),
+ m_startTime(startTime),
+ m_endTime(endTime),
+ m_detached(false)
+{}
+
+SegmentInsertCommand::SegmentInsertCommand(Composition *composition,
+ Segment *segment,
+ TrackId track):
+ KNamedCommand(i18n("Create Segment")),
+ m_composition(composition),
+ m_studio(0),
+ m_segment(segment),
+ m_track(track),
+ m_startTime(0),
+ m_endTime(0),
+ m_detached(false)
+{}
+
+SegmentInsertCommand::~SegmentInsertCommand()
+{
+ if (m_detached) {
+ delete m_segment;
+ }
+}
+
+Segment *
+SegmentInsertCommand::getSegment() const
+{
+ return m_segment;
+}
+
+void
+SegmentInsertCommand::execute()
+{
+ if (!m_segment) {
+ // Create and insert Segment
+ //
+ m_segment = new Segment();
+ m_segment->setTrack(m_track);
+ m_segment->setStartTime(m_startTime);
+ m_composition->addSegment(m_segment);
+ m_segment->setEndTime(m_endTime);
+
+ // Do our best to label the Segment with whatever is currently
+ // showing against it.
+ //
+ Track *track = m_composition->getTrackById(m_track);
+ std::string label;
+
+ if (track) {
+ // try to get a reasonable Segment name by Instrument
+ //
+ label = m_studio->getSegmentName(track->getInstrument());
+
+ // if not use the track label
+ //
+ if (label == "")
+ label = track->getLabel();
+
+ m_segment->setLabel(label);
+ }
+ } else {
+ m_segment->setTrack(m_track);
+ m_composition->addSegment(m_segment);
+ }
+
+ m_detached = false;
+}
+
+void
+SegmentInsertCommand::unexecute()
+{
+ m_composition->detachSegment(m_segment);
+ m_detached = true;
+}
+
+}
diff --git a/src/commands/segment/SegmentInsertCommand.h b/src/commands/segment/SegmentInsertCommand.h
new file mode 100644
index 0000000..932919a
--- /dev/null
+++ b/src/commands/segment/SegmentInsertCommand.h
@@ -0,0 +1,76 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_SEGMENTINSERTCOMMAND_H_
+#define _RG_SEGMENTINSERTCOMMAND_H_
+
+#include "base/Track.h"
+#include <kcommand.h>
+#include "base/Event.h"
+
+
+
+
+namespace Rosegarden
+{
+
+class Studio;
+class Segment;
+class RosegardenGUIDoc;
+class Composition;
+
+
+class SegmentInsertCommand : public KNamedCommand
+{
+public:
+ SegmentInsertCommand(RosegardenGUIDoc *doc,
+ TrackId track,
+ timeT startTime,
+ timeT endTime);
+ SegmentInsertCommand(Composition *composition,
+ Segment *segment,
+ TrackId track);
+ virtual ~SegmentInsertCommand();
+
+ Segment *getSegment() const; // after invocation
+
+ virtual void execute();
+ virtual void unexecute();
+
+private:
+ Composition *m_composition;
+ Studio *m_studio;
+ Segment *m_segment;
+ int m_track;
+ timeT m_startTime;
+ timeT m_endTime;
+ bool m_detached;
+};
+
+
+
+}
+
+#endif
diff --git a/src/commands/segment/SegmentJoinCommand.cpp b/src/commands/segment/SegmentJoinCommand.cpp
new file mode 100644
index 0000000..27b1bb8
--- /dev/null
+++ b/src/commands/segment/SegmentJoinCommand.cpp
@@ -0,0 +1,175 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "SegmentJoinCommand.h"
+
+#include "base/Composition.h"
+#include "base/Event.h"
+#include "base/NotationTypes.h"
+#include "base/Segment.h"
+#include "base/Selection.h"
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+SegmentJoinCommand::SegmentJoinCommand(SegmentSelection &
+ segments) :
+ KNamedCommand(getGlobalName()),
+ m_newSegment(0),
+ m_detached(false) // true if the old segments are detached, not the new
+{
+ for (SegmentSelection::iterator i = segments.begin();
+ i != segments.end(); ++i)
+ {
+ m_oldSegments.push_back(*i);
+ }
+ assert(m_oldSegments.size() > 0);
+}
+
+SegmentJoinCommand::~SegmentJoinCommand()
+{
+ if (m_detached) {
+ for (unsigned int i = 0; i < m_oldSegments.size(); ++i) {
+ delete m_oldSegments[i];
+ }
+ } else {
+ delete m_newSegment;
+ }
+}
+
+void
+SegmentJoinCommand::execute()
+{
+ Composition *composition = m_oldSegments[0]->getComposition();
+ if (!composition) {
+ std::cerr
+ << "SegmentJoinCommand::execute: ERROR: old segments are not in composition!"
+ << std::endl;
+ return ;
+ }
+
+ // we normalize rests in any overlapping areas
+ timeT overlapStart = 0, overlapEnd = 0;
+ bool haveOverlap = false;
+
+ if (!m_newSegment) {
+
+ m_newSegment = new Segment(*m_oldSegments[0]);
+
+ // that duplicated segment 0; now do the rest
+
+ for (unsigned int i = 1; i < m_oldSegments.size(); ++i) {
+
+ Segment *s = m_oldSegments[i];
+
+ timeT start = s->getStartTime(), end = s->getEndMarkerTime();
+
+ timeT os = 0, oe = 0;
+ bool haveOverlapHere = false;
+
+ if (start < m_newSegment->getEndMarkerTime() &&
+ end > m_newSegment->getStartTime()) {
+ haveOverlapHere = true;
+ os = std::max(start, m_newSegment->getStartTime());
+ oe = std::min(end, m_newSegment->getEndMarkerTime());
+ std::cerr << "overlap here, os = " << os << ", oe = " << oe << std::endl;
+ }
+
+ if (haveOverlapHere) {
+ if (haveOverlap) {
+ overlapStart = std::min(overlapStart, os);
+ overlapEnd = std::max(overlapEnd, oe);
+ } else {
+ overlapStart = os;
+ overlapEnd = oe;
+ haveOverlap = true;
+ }
+ }
+
+ if (start > m_newSegment->getEndMarkerTime()) {
+ m_newSegment->setEndMarkerTime(start);
+ }
+
+ for (Segment::iterator si = s->begin();
+ s->isBeforeEndMarker(si); ++si) {
+
+ // weed out duplicate clefs and keys
+
+ if ((*si)->isa(Clef::EventType)) {
+ try {
+ Clef newClef(**si);
+ if (m_newSegment->getClefAtTime
+ ((*si)->getAbsoluteTime() + 1) == newClef) {
+ continue;
+ }
+ } catch (...) { }
+ }
+
+ if ((*si)->isa(Key::EventType)) {
+ try {
+ Key newKey(**si);
+ if (m_newSegment->getKeyAtTime
+ ((*si)->getAbsoluteTime() + 1) == newKey) {
+ continue;
+ }
+ } catch (...) { }
+ }
+
+ m_newSegment->insert(new Event(**si));
+ }
+
+ if (end > m_newSegment->getEndMarkerTime()) {
+ m_newSegment->setEndMarkerTime(end);
+ }
+ }
+ }
+
+ composition->addSegment(m_newSegment);
+
+ if (haveOverlap) {
+ m_newSegment->normalizeRests(overlapStart, overlapEnd);
+ }
+
+ for (unsigned int i = 0; i < m_oldSegments.size(); ++i) {
+ composition->detachSegment(m_oldSegments[i]);
+ }
+
+ m_detached = true;
+}
+
+void
+SegmentJoinCommand::unexecute()
+{
+ for (unsigned int i = 0; i < m_oldSegments.size(); ++i) {
+ m_newSegment->getComposition()->addSegment(m_oldSegments[i]);
+ }
+
+ m_newSegment->getComposition()->detachSegment(m_newSegment);
+ m_detached = false;
+}
+
+}
diff --git a/src/commands/segment/SegmentJoinCommand.h b/src/commands/segment/SegmentJoinCommand.h
new file mode 100644
index 0000000..97c7924
--- /dev/null
+++ b/src/commands/segment/SegmentJoinCommand.h
@@ -0,0 +1,65 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_SEGMENTJOINCOMMAND_H_
+#define _RG_SEGMENTJOINCOMMAND_H_
+
+#include <kcommand.h>
+#include <qstring.h>
+#include <vector>
+#include <klocale.h>
+
+
+
+
+namespace Rosegarden
+{
+
+class SegmentSelection;
+class Segment;
+
+
+class SegmentJoinCommand : public KNamedCommand
+{
+public:
+ SegmentJoinCommand(SegmentSelection &segments);
+ virtual ~SegmentJoinCommand();
+
+ virtual void execute();
+ virtual void unexecute();
+
+ static QString getGlobalName() { return i18n("&Join"); }
+
+private:
+ std::vector<Segment *> m_oldSegments;
+ Segment *m_newSegment;
+ bool m_detached;
+};
+
+
+
+}
+
+#endif
diff --git a/src/commands/segment/SegmentLabelCommand.cpp b/src/commands/segment/SegmentLabelCommand.cpp
new file mode 100644
index 0000000..8bc0ff4
--- /dev/null
+++ b/src/commands/segment/SegmentLabelCommand.cpp
@@ -0,0 +1,73 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "SegmentLabelCommand.h"
+
+#include "misc/Strings.h"
+#include "base/Segment.h"
+#include "base/Selection.h"
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+SegmentLabelCommand::SegmentLabelCommand(
+ SegmentSelection &segments,
+ const QString &label):
+ KNamedCommand(i18n("Label Segments")),
+ m_newLabel(label)
+{
+ for (SegmentSelection::iterator i = segments.begin();
+ i != segments.end(); ++i)
+ m_segments.push_back(*i);
+}
+
+SegmentLabelCommand::~SegmentLabelCommand()
+{}
+
+void
+SegmentLabelCommand::execute()
+{
+ bool addLabels = false;
+ if (m_labels.size() == 0)
+ addLabels = true;
+
+ for (unsigned int i = 0; i < m_segments.size(); ++i) {
+ if (addLabels)
+ m_labels.push_back(strtoqstr(m_segments[i]->getLabel()));
+
+ m_segments[i]->setLabel(qstrtostr(m_newLabel));
+ }
+}
+
+void
+SegmentLabelCommand::unexecute()
+{
+ for (unsigned int i = 0; i < m_segments.size(); ++i)
+ m_segments[i]->setLabel(qstrtostr(m_labels[i]));
+}
+
+}
diff --git a/src/commands/segment/SegmentLabelCommand.h b/src/commands/segment/SegmentLabelCommand.h
new file mode 100644
index 0000000..1c55f3b
--- /dev/null
+++ b/src/commands/segment/SegmentLabelCommand.h
@@ -0,0 +1,67 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_SEGMENTLABELCOMMAND_H_
+#define _RG_SEGMENTLABELCOMMAND_H_
+
+#include <kcommand.h>
+#include <qstring.h>
+#include <vector>
+#include <klocale.h>
+
+
+
+
+namespace Rosegarden
+{
+
+class SegmentSelection;
+class Segment;
+
+
+class SegmentLabelCommand : public KNamedCommand
+{
+public:
+ SegmentLabelCommand(SegmentSelection &segments,
+ const QString &label);
+ virtual ~SegmentLabelCommand();
+
+ static QString getGlobalName()
+ { return i18n("Re&label..."); }
+
+ virtual void execute();
+ virtual void unexecute();
+protected:
+
+ std::vector<Segment*> m_segments;
+ std::vector<QString> m_labels;
+ QString m_newLabel;
+};
+
+
+
+}
+
+#endif
diff --git a/src/commands/segment/SegmentQuickCopyCommand.cpp b/src/commands/segment/SegmentQuickCopyCommand.cpp
new file mode 100644
index 0000000..1ce432c
--- /dev/null
+++ b/src/commands/segment/SegmentQuickCopyCommand.cpp
@@ -0,0 +1,71 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "SegmentQuickCopyCommand.h"
+
+#include "misc/Strings.h"
+#include "base/Composition.h"
+#include "base/Segment.h"
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+SegmentQuickCopyCommand::SegmentQuickCopyCommand(Segment *segment):
+ KNamedCommand(getGlobalName()),
+ m_composition(segment->getComposition()),
+ m_segmentToCopy(segment),
+ m_segment(0),
+ m_detached(false)
+{}
+
+SegmentQuickCopyCommand::~SegmentQuickCopyCommand()
+{
+ if (m_detached) {
+ delete m_segment;
+ }
+}
+
+void
+SegmentQuickCopyCommand::execute()
+{
+ if (!m_segment) {
+ m_segment = new Segment(*m_segmentToCopy);
+ m_segment->setLabel(qstrtostr(i18n("%1 (copied)").arg
+ (strtoqstr(m_segment->getLabel()))));
+ }
+ m_composition->addSegment(m_segment);
+ m_detached = false;
+}
+
+void
+SegmentQuickCopyCommand::unexecute()
+{
+ m_composition->detachSegment(m_segment);
+ m_detached = true;
+}
+
+}
diff --git a/src/commands/segment/SegmentQuickCopyCommand.h b/src/commands/segment/SegmentQuickCopyCommand.h
new file mode 100644
index 0000000..638b16a
--- /dev/null
+++ b/src/commands/segment/SegmentQuickCopyCommand.h
@@ -0,0 +1,68 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_SEGMENTQUICKCOPYCOMMAND_H_
+#define _RG_SEGMENTQUICKCOPYCOMMAND_H_
+
+#include <kcommand.h>
+#include <qstring.h>
+#include <klocale.h>
+
+
+
+
+namespace Rosegarden
+{
+
+class Segment;
+class Composition;
+
+
+class SegmentQuickCopyCommand : public KNamedCommand
+{
+public:
+ SegmentQuickCopyCommand(Segment *segment);
+ virtual ~SegmentQuickCopyCommand();
+
+ virtual void execute();
+ virtual void unexecute();
+
+ // return pointer to new copy
+ Segment* getCopy() { return m_segment; }
+
+ static QString getGlobalName() { return i18n("Quick-Copy Segment"); }
+
+private:
+ Composition *m_composition;
+ Segment *m_segmentToCopy;
+ Segment *m_segment;
+ bool m_detached;
+};
+
+
+
+}
+
+#endif
diff --git a/src/commands/segment/SegmentReconfigureCommand.cpp b/src/commands/segment/SegmentReconfigureCommand.cpp
new file mode 100644
index 0000000..ec9d1bd
--- /dev/null
+++ b/src/commands/segment/SegmentReconfigureCommand.cpp
@@ -0,0 +1,114 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "SegmentReconfigureCommand.h"
+
+#include "base/Segment.h"
+#include "base/Track.h"
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+SegmentReconfigureCommand::SegmentReconfigureCommand(QString name) :
+ KNamedCommand(name)
+{}
+
+SegmentReconfigureCommand::~SegmentReconfigureCommand()
+{}
+
+void
+SegmentReconfigureCommand::addSegment(Segment *segment,
+ timeT startTime,
+ timeT endMarkerTime,
+ TrackId track)
+{
+ SegmentRec record;
+ record.segment = segment;
+ record.startTime = startTime;
+ record.endMarkerTime = endMarkerTime;
+ record.track = track;
+ m_records.push_back(record);
+}
+
+void
+SegmentReconfigureCommand::addSegments(const SegmentRecSet &records)
+{
+ for (SegmentRecSet::const_iterator i = records.begin(); i != records.end(); ++i) {
+ m_records.push_back(*i);
+ }
+}
+
+void
+SegmentReconfigureCommand::execute()
+{
+ swap();
+}
+
+void
+SegmentReconfigureCommand::unexecute()
+{
+ swap();
+}
+
+void
+SegmentReconfigureCommand::swap()
+{
+ for (SegmentRecSet::iterator i = m_records.begin();
+ i != m_records.end(); ++i) {
+
+ // set the segment's values from the record, but set the
+ // previous values back in to the record for use in the
+ // next iteration of the execute/unexecute cycle.
+
+ // #1083496: look up both of the "old" values before we set
+ // anything, as setting the start time is likely to change the
+ // end marker time.
+
+ timeT prevStartTime = i->segment->getStartTime();
+ timeT prevEndMarkerTime = i->segment->getEndMarkerTime();
+
+ if (i->segment->getStartTime() != i->startTime) {
+ i->segment->setStartTime(i->startTime);
+ }
+
+ if (i->segment->getEndMarkerTime() != i->endMarkerTime) {
+ i->segment->setEndMarkerTime(i->endMarkerTime);
+ }
+
+ i->startTime = prevStartTime;
+ i->endMarkerTime = prevEndMarkerTime;
+
+ TrackId currentTrack = i->segment->getTrack();
+
+ if (currentTrack != i->track) {
+ i->segment->setTrack(i->track);
+ i->track = currentTrack;
+ }
+ }
+}
+
+}
diff --git a/src/commands/segment/SegmentReconfigureCommand.h b/src/commands/segment/SegmentReconfigureCommand.h
new file mode 100644
index 0000000..be82e47
--- /dev/null
+++ b/src/commands/segment/SegmentReconfigureCommand.h
@@ -0,0 +1,81 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_SEGMENTRECONFIGURECOMMAND_H_
+#define _RG_SEGMENTRECONFIGURECOMMAND_H_
+
+#include "base/Track.h"
+#include <kcommand.h>
+#include <qstring.h>
+#include <vector>
+#include "base/Event.h"
+
+
+
+
+namespace Rosegarden
+{
+
+class Segment;
+
+
+/**
+ * SegmentReconfigureCommand is a general-purpose command for
+ * moving, resizing or changing the track of one or more segments
+ */
+class SegmentReconfigureCommand : public KNamedCommand
+{
+public:
+ SegmentReconfigureCommand(QString name);
+ virtual ~SegmentReconfigureCommand();
+
+ struct SegmentRec {
+ Segment *segment;
+ timeT startTime;
+ timeT endMarkerTime;
+ TrackId track;
+ };
+ typedef std::vector<SegmentRec> SegmentRecSet;
+
+ void addSegment(Segment *segment,
+ timeT startTime,
+ timeT endMarkerTime,
+ TrackId track);
+
+ void addSegments(const SegmentRecSet &records);
+
+ void execute();
+ void unexecute();
+
+private:
+ SegmentRecSet m_records;
+ void swap();
+};
+
+
+
+}
+
+#endif
diff --git a/src/commands/segment/SegmentRecordCommand.cpp b/src/commands/segment/SegmentRecordCommand.cpp
new file mode 100644
index 0000000..f457f32
--- /dev/null
+++ b/src/commands/segment/SegmentRecordCommand.cpp
@@ -0,0 +1,67 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "SegmentRecordCommand.h"
+
+#include <klocale.h>
+#include "base/Composition.h"
+#include "base/Segment.h"
+
+
+namespace Rosegarden
+{
+
+SegmentRecordCommand::SegmentRecordCommand(Segment *s) :
+ KNamedCommand(i18n("Record")),
+ m_composition(s->getComposition()),
+ m_segment(s),
+ m_detached(false)
+{}
+
+SegmentRecordCommand::~SegmentRecordCommand()
+{
+ if (m_detached) {
+ delete m_segment;
+ }
+}
+
+void
+SegmentRecordCommand::execute()
+{
+ if (!m_segment->getComposition()) {
+ m_composition->addSegment(m_segment);
+ }
+
+ m_detached = false;
+}
+
+void
+SegmentRecordCommand::unexecute()
+{
+ m_composition->detachSegment(m_segment);
+ m_detached = true;
+}
+
+}
diff --git a/src/commands/segment/SegmentRecordCommand.h b/src/commands/segment/SegmentRecordCommand.h
new file mode 100644
index 0000000..c3f4ffe
--- /dev/null
+++ b/src/commands/segment/SegmentRecordCommand.h
@@ -0,0 +1,67 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_SEGMENTRECORDCOMMAND_H_
+#define _RG_SEGMENTRECORDCOMMAND_H_
+
+#include <kcommand.h>
+
+
+
+
+namespace Rosegarden
+{
+
+class Segment;
+class Composition;
+
+
+/**
+ * SegmentRecordCommand pretends to insert a Segment that is actually
+ * already in the Composition (the currently-being-recorded one). It's
+ * used at the end of recording, to ensure that GUI updates happen
+ * correctly, and it provides the ability to undo recording. (The
+ * unexecute does remove the segment, it doesn't just pretend to.)
+ */
+class SegmentRecordCommand : public KNamedCommand
+{
+public:
+ SegmentRecordCommand(Segment *segment);
+ virtual ~SegmentRecordCommand();
+
+ virtual void execute();
+ virtual void unexecute();
+
+private:
+ Composition *m_composition;
+ Segment *m_segment;
+ bool m_detached;
+};
+
+
+
+}
+
+#endif
diff --git a/src/commands/segment/SegmentRepeatToCopyCommand.cpp b/src/commands/segment/SegmentRepeatToCopyCommand.cpp
new file mode 100644
index 0000000..a0e0e43
--- /dev/null
+++ b/src/commands/segment/SegmentRepeatToCopyCommand.cpp
@@ -0,0 +1,106 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "SegmentRepeatToCopyCommand.h"
+
+#include "base/Event.h"
+#include <klocale.h>
+#include "base/Composition.h"
+#include "base/Segment.h"
+
+
+namespace Rosegarden
+{
+
+SegmentRepeatToCopyCommand::SegmentRepeatToCopyCommand(
+ Segment *segment):
+ KNamedCommand(i18n("Turn Repeats into Copies")),
+ m_composition(segment->getComposition()),
+ m_segment(segment),
+ m_detached(false)
+{}
+
+SegmentRepeatToCopyCommand::~SegmentRepeatToCopyCommand()
+{
+ if (m_detached) {
+ std::vector<Segment*>::iterator it =
+ m_newSegments.begin();
+
+ for (; it != m_newSegments.end(); it++)
+ delete (*it);
+ }
+}
+
+void
+SegmentRepeatToCopyCommand::execute()
+{
+ if (m_newSegments.size() == 0) {
+ timeT newStartTime = m_segment->getEndMarkerTime();
+ timeT newDuration =
+ m_segment->getEndMarkerTime() - m_segment->getStartTime();
+ Segment *newSegment;
+ timeT repeatEndTime = m_segment->getRepeatEndTime();
+
+ while (newStartTime + newDuration < repeatEndTime) {
+ // Create new segment, transpose and turn off repeat
+ //
+ newSegment = new Segment(*m_segment);
+ newSegment->setStartTime(newStartTime);
+ newSegment->setRepeating(false);
+
+ // Insert and store
+ m_composition->addSegment(newSegment);
+ m_newSegments.push_back(newSegment);
+
+ // Move onto next
+ newStartTime += newDuration;
+ }
+
+ // fill remaining partial segment
+ } else {
+ std::vector<Segment*>::iterator it =
+ m_newSegments.begin();
+
+ for (; it != m_newSegments.end(); it++)
+ m_composition->addSegment(*it);
+ }
+ m_segment->setRepeating(false);
+ m_detached = false;
+}
+
+void
+SegmentRepeatToCopyCommand::unexecute()
+{
+ std::vector<Segment*>::iterator it =
+ m_newSegments.begin();
+
+ for (; it != m_newSegments.end(); it++)
+ m_composition->detachSegment(*it);
+
+ m_detached = true;
+ m_segment->setRepeating(true);
+}
+
+}
diff --git a/src/commands/segment/SegmentRepeatToCopyCommand.h b/src/commands/segment/SegmentRepeatToCopyCommand.h
new file mode 100644
index 0000000..d0cc565
--- /dev/null
+++ b/src/commands/segment/SegmentRepeatToCopyCommand.h
@@ -0,0 +1,62 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_SEGMENTREPEATTOCOPYCOMMAND_H_
+#define _RG_SEGMENTREPEATTOCOPYCOMMAND_H_
+
+#include <kcommand.h>
+#include <vector>
+
+
+
+
+namespace Rosegarden
+{
+
+class Segment;
+class Composition;
+
+
+class SegmentRepeatToCopyCommand : public KNamedCommand
+{
+public:
+ SegmentRepeatToCopyCommand(Segment *segment);
+ virtual ~SegmentRepeatToCopyCommand();
+
+ virtual void execute();
+ virtual void unexecute();
+
+private:
+
+ Composition *m_composition;
+ Segment *m_segment;
+ std::vector<Segment*> m_newSegments;
+ bool m_detached;
+};
+
+
+}
+
+#endif
diff --git a/src/commands/segment/SegmentRescaleCommand.cpp b/src/commands/segment/SegmentRescaleCommand.cpp
new file mode 100644
index 0000000..d7a7c80
--- /dev/null
+++ b/src/commands/segment/SegmentRescaleCommand.cpp
@@ -0,0 +1,148 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "SegmentRescaleCommand.h"
+
+#include "misc/Strings.h"
+#include "base/Event.h"
+#include "base/Composition.h"
+#include "base/NotationTypes.h"
+#include "base/Segment.h"
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+SegmentRescaleCommand::SegmentRescaleCommand(Segment *s,
+ int multiplier,
+ int divisor) :
+ KNamedCommand(getGlobalName()),
+ m_segment(s),
+ m_newSegment(0),
+ m_startTimeGiven(false),
+ m_startTime(s->getStartTime()),
+ m_multiplier(multiplier),
+ m_divisor(divisor),
+ m_detached(false)
+{
+ // nothing
+}
+
+SegmentRescaleCommand::SegmentRescaleCommand(Segment *s,
+ int multiplier,
+ int divisor,
+ timeT st) :
+ KNamedCommand(getGlobalName()),
+ m_segment(s),
+ m_newSegment(0),
+ m_startTimeGiven(true),
+ m_startTime(st),
+ m_multiplier(multiplier),
+ m_divisor(divisor),
+ m_detached(false)
+{
+ // nothing
+}
+
+SegmentRescaleCommand::~SegmentRescaleCommand()
+{
+ if (m_detached) {
+ delete m_segment;
+ } else {
+ delete m_newSegment;
+ }
+}
+
+timeT
+SegmentRescaleCommand::rescale(timeT t)
+{
+ // avoid overflows by using doubles
+ double d = t;
+ d *= m_multiplier;
+ d /= m_divisor;
+ d += 0.5;
+ return (timeT)d;
+}
+
+void
+SegmentRescaleCommand::execute()
+{
+ timeT startTime = m_segment->getStartTime();
+
+ if (m_startTimeGiven) startTime = m_startTime;
+
+ if (!m_newSegment) {
+
+ m_newSegment = new Segment();
+ m_newSegment->setTrack(m_segment->getTrack());
+ QString oldLabel = strtoqstr(m_segment->getLabel());
+ if (oldLabel.endsWith(i18n("(rescaled)"))) {
+ m_newSegment->setLabel(m_segment->getLabel());
+ } else {
+ m_newSegment->setLabel(qstrtostr(i18n("%1 (rescaled)").arg
+ (oldLabel)));
+ }
+ m_newSegment->setColourIndex(m_segment->getColourIndex());
+
+ for (Segment::iterator i = m_segment->begin();
+ m_segment->isBeforeEndMarker(i); ++i) {
+
+ if ((*i)->isa(Note::EventRestType))
+ continue;
+
+ timeT dt = (*i)->getAbsoluteTime() - startTime;
+ timeT duration = (*i)->getDuration();
+
+ //!!! use doubles for this calculation where necessary
+
+ m_newSegment->insert
+ (new Event(**i,
+ startTime + rescale(dt),
+ rescale(duration)));
+ }
+ }
+
+ m_segment->getComposition()->addSegment(m_newSegment);
+ m_segment->getComposition()->detachSegment(m_segment);
+ m_newSegment->normalizeRests(m_newSegment->getStartTime(),
+ m_newSegment->getEndTime());
+
+ m_newSegment->setEndMarkerTime
+ (startTime + rescale(m_segment->getEndMarkerTime() -
+ m_segment->getStartTime()));
+
+ m_detached = true;
+}
+
+void
+SegmentRescaleCommand::unexecute()
+{
+ m_newSegment->getComposition()->addSegment(m_segment);
+ m_newSegment->getComposition()->detachSegment(m_newSegment);
+ m_detached = false;
+}
+
+}
diff --git a/src/commands/segment/SegmentRescaleCommand.h b/src/commands/segment/SegmentRescaleCommand.h
new file mode 100644
index 0000000..7a34727
--- /dev/null
+++ b/src/commands/segment/SegmentRescaleCommand.h
@@ -0,0 +1,76 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_SEGMENTRESCALECOMMAND_H_
+#define _RG_SEGMENTRESCALECOMMAND_H_
+
+#include <kcommand.h>
+#include <qstring.h>
+#include "base/Event.h"
+#include <klocale.h>
+
+
+
+
+namespace Rosegarden
+{
+
+class Segment;
+
+
+class SegmentRescaleCommand : public KNamedCommand
+{
+public:
+ SegmentRescaleCommand(Segment *segment,
+ int multiplier,
+ int divisor);
+ SegmentRescaleCommand(Segment *segment,
+ int multiplier,
+ int divisor,
+ timeT newStartTime);
+ virtual ~SegmentRescaleCommand();
+
+ virtual void execute();
+ virtual void unexecute();
+
+ static QString getGlobalName() { return i18n("Stretch or S&quash..."); }
+
+private:
+ Segment *m_segment;
+ Segment *m_newSegment;
+ bool m_startTimeGiven;
+ timeT m_startTime;
+ int m_multiplier;
+ int m_divisor;
+ bool m_detached;
+
+ timeT rescale(timeT);
+};
+
+
+
+}
+
+#endif
diff --git a/src/commands/segment/SegmentResizeFromStartCommand.cpp b/src/commands/segment/SegmentResizeFromStartCommand.cpp
new file mode 100644
index 0000000..a4157bb
--- /dev/null
+++ b/src/commands/segment/SegmentResizeFromStartCommand.cpp
@@ -0,0 +1,85 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "SegmentResizeFromStartCommand.h"
+
+#include <klocale.h>
+#include "base/Event.h"
+#include "base/Segment.h"
+#include "document/BasicCommand.h"
+
+
+namespace Rosegarden
+{
+
+SegmentResizeFromStartCommand::SegmentResizeFromStartCommand(Segment *s,
+ timeT time) :
+ BasicCommand(i18n("Resize Segment"), *s,
+ std::min(time, s->getStartTime()),
+ std::max(time, s->getStartTime())),
+ m_segment(s),
+ m_oldStartTime(s->getStartTime()),
+ m_newStartTime(time)
+{
+ // nothing else
+}
+
+SegmentResizeFromStartCommand::~SegmentResizeFromStartCommand()
+{
+ // nothing
+}
+
+void
+SegmentResizeFromStartCommand::modifySegment()
+{
+ if (m_newStartTime < m_oldStartTime) {
+ m_segment->fillWithRests(m_newStartTime, m_oldStartTime);
+ } else {
+
+ for (Segment::iterator i = m_segment->begin();
+ m_segment->isBeforeEndMarker(i); ) {
+
+ Segment::iterator j = i;
+ ++j;
+
+ if ((*i)->getAbsoluteTime() >= m_newStartTime)
+ break;
+
+ if ((*i)->getAbsoluteTime() + (*i)->getDuration() <= m_newStartTime) {
+ m_segment->erase(i);
+ } else {
+ Event *e = new Event
+ (**i, m_newStartTime,
+ (*i)->getAbsoluteTime() + (*i)->getDuration() - m_newStartTime);
+ m_segment->erase(i);
+ m_segment->insert(e);
+ }
+
+ i = j;
+ }
+ }
+}
+
+}
diff --git a/src/commands/segment/SegmentResizeFromStartCommand.h b/src/commands/segment/SegmentResizeFromStartCommand.h
new file mode 100644
index 0000000..8f0dc89
--- /dev/null
+++ b/src/commands/segment/SegmentResizeFromStartCommand.h
@@ -0,0 +1,69 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_SEGMENTRESIZEFROMSTARTCOMMAND_H_
+#define _RG_SEGMENTRESIZEFROMSTARTCOMMAND_H_
+
+#include "document/BasicCommand.h"
+#include "base/Event.h"
+
+
+
+
+namespace Rosegarden
+{
+
+class Segment;
+
+
+/**
+ * SegmentResizeFromStartCommand moves the start time of a segment
+ * leaving the events in it at the same absolute times as before, so
+ * padding with rests or deleting events as appropriate. (Distinct
+ * from Segment::setStartTime, as used by SegmentReconfigureCommand,
+ * which moves all the events in the segment.)
+ * Not for use on audio segments (see AudioSegmentResizeFromStartCommand).
+ */
+class SegmentResizeFromStartCommand : public BasicCommand
+{
+public:
+ SegmentResizeFromStartCommand(Segment *segment,
+ timeT newStartTime);
+ virtual ~SegmentResizeFromStartCommand();
+
+protected:
+ virtual void modifySegment();
+
+private:
+ Segment *m_segment;
+ timeT m_oldStartTime;
+ timeT m_newStartTime;
+};
+
+
+
+}
+
+#endif
diff --git a/src/commands/segment/SegmentSingleRepeatToCopyCommand.cpp b/src/commands/segment/SegmentSingleRepeatToCopyCommand.cpp
new file mode 100644
index 0000000..c9b92fb
--- /dev/null
+++ b/src/commands/segment/SegmentSingleRepeatToCopyCommand.cpp
@@ -0,0 +1,73 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "SegmentSingleRepeatToCopyCommand.h"
+
+#include <klocale.h>
+#include "base/Composition.h"
+#include "base/Segment.h"
+
+
+namespace Rosegarden
+{
+
+SegmentSingleRepeatToCopyCommand::SegmentSingleRepeatToCopyCommand(
+ Segment *segment,
+ timeT time):
+ KNamedCommand(i18n("Turn Single Repeat into Copy")),
+ m_composition(segment->getComposition()),
+ m_segment(segment),
+ m_newSegment(0),
+ m_time(time),
+ m_detached(false)
+{}
+
+SegmentSingleRepeatToCopyCommand::~SegmentSingleRepeatToCopyCommand()
+{
+ if (m_detached)
+ delete m_newSegment;
+}
+
+void
+SegmentSingleRepeatToCopyCommand::execute()
+{
+ if (!m_newSegment) {
+ m_newSegment = new Segment(*m_segment);
+ m_newSegment->setStartTime(m_time);
+ m_newSegment->setRepeating(true);
+ }
+
+ m_composition->addSegment(m_newSegment);
+ m_detached = false;
+}
+
+void
+SegmentSingleRepeatToCopyCommand::unexecute()
+{
+ m_composition->detachSegment(m_newSegment);
+ m_detached = true;
+}
+
+}
diff --git a/src/commands/segment/SegmentSingleRepeatToCopyCommand.h b/src/commands/segment/SegmentSingleRepeatToCopyCommand.h
new file mode 100644
index 0000000..0c4984e
--- /dev/null
+++ b/src/commands/segment/SegmentSingleRepeatToCopyCommand.h
@@ -0,0 +1,65 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_SEGMENTSINGLEREPEATTOCOPYCOMMAND_H_
+#define _RG_SEGMENTSINGLEREPEATTOCOPYCOMMAND_H_
+
+#include <kcommand.h>
+#include "base/Event.h"
+
+
+
+
+namespace Rosegarden
+{
+
+class Segment;
+class Composition;
+
+
+class SegmentSingleRepeatToCopyCommand : public KNamedCommand
+{
+public:
+ SegmentSingleRepeatToCopyCommand(Segment *segment,
+ timeT time);
+ virtual ~SegmentSingleRepeatToCopyCommand();
+
+ virtual void execute();
+ virtual void unexecute();
+
+ Segment *getNewSegment() const { return m_newSegment; }
+
+private:
+ Composition *m_composition;
+ Segment *m_segment;
+ Segment *m_newSegment;
+ timeT m_time;
+ bool m_detached;
+};
+
+
+}
+
+#endif
diff --git a/src/commands/segment/SegmentSplitByPitchCommand.cpp b/src/commands/segment/SegmentSplitByPitchCommand.cpp
new file mode 100644
index 0000000..2000a35
--- /dev/null
+++ b/src/commands/segment/SegmentSplitByPitchCommand.cpp
@@ -0,0 +1,280 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "SegmentSplitByPitchCommand.h"
+
+#include "base/BaseProperties.h"
+#include "base/Sets.h"
+#include "misc/Strings.h"
+#include "base/Composition.h"
+#include "base/Event.h"
+#include "base/NotationTypes.h"
+#include "base/NotationQuantizer.h"
+#include "base/Segment.h"
+#include "base/SegmentNotationHelper.h"
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+SegmentSplitByPitchCommand::SegmentSplitByPitchCommand(Segment *segment,
+ int p, bool r, bool d,
+ ClefHandling c) :
+ KNamedCommand(i18n("Split by Pitch")),
+ m_composition(segment->getComposition()),
+ m_segment(segment),
+ m_newSegmentA(0),
+ m_newSegmentB(0),
+ m_splitPitch(p),
+ m_ranging(r),
+ m_dupNonNoteEvents(d),
+ m_clefHandling(c),
+ m_executed(false)
+{}
+
+SegmentSplitByPitchCommand::~SegmentSplitByPitchCommand()
+{
+ if (m_executed) {
+ delete m_segment;
+ } else {
+ delete m_newSegmentA;
+ delete m_newSegmentB;
+ }
+}
+
+void
+SegmentSplitByPitchCommand::execute()
+{
+ if (!m_newSegmentA) {
+
+ m_newSegmentA = new Segment;
+ m_newSegmentB = new Segment;
+
+ m_newSegmentA->setTrack(m_segment->getTrack());
+ m_newSegmentA->setStartTime(m_segment->getStartTime());
+
+ m_newSegmentB->setTrack(m_segment->getTrack());
+ m_newSegmentB->setStartTime(m_segment->getStartTime());
+
+ int splitPitch(m_splitPitch);
+
+ for (Segment::iterator i = m_segment->begin();
+ m_segment->isBeforeEndMarker(i); ++i) {
+
+ if ((*i)->isa(Note::EventRestType))
+ continue;
+ if ((*i)->isa(Clef::EventType) &&
+ m_clefHandling != LeaveClefs)
+ continue;
+
+ if ((*i)->isa(Note::EventType)) {
+
+ if (m_ranging) {
+ splitPitch = getSplitPitchAt(i, splitPitch);
+ }
+
+ if ((*i)->has(BaseProperties::PITCH) &&
+ (*i)->get
+ <Int>(BaseProperties::PITCH) <
+ splitPitch) {
+ if (m_newSegmentB->empty()) {
+ m_newSegmentB->fillWithRests((*i)->getAbsoluteTime());
+ }
+ m_newSegmentB->insert(new Event(**i));
+ }
+ else {
+ if (m_newSegmentA->empty()) {
+ m_newSegmentA->fillWithRests((*i)->getAbsoluteTime());
+ }
+ m_newSegmentA->insert(new Event(**i));
+ }
+
+ } else {
+
+ m_newSegmentA->insert(new Event(**i));
+
+ if (m_dupNonNoteEvents) {
+ m_newSegmentB->insert(new Event(**i));
+ }
+ }
+ }
+
+ //!!! m_newSegmentA->fillWithRests(m_segment->getEndMarkerTime());
+ // m_newSegmentB->fillWithRests(m_segment->getEndMarkerTime());
+ m_newSegmentA->normalizeRests(m_segment->getStartTime(),
+ m_segment->getEndMarkerTime());
+ m_newSegmentB->normalizeRests(m_segment->getStartTime(),
+ m_segment->getEndMarkerTime());
+ }
+
+ m_composition->addSegment(m_newSegmentA);
+ m_composition->addSegment(m_newSegmentB);
+
+ SegmentNotationHelper helperA(*m_newSegmentA);
+ SegmentNotationHelper helperB(*m_newSegmentB);
+
+ if (m_clefHandling == RecalculateClefs) {
+
+ m_newSegmentA->insert
+ (helperA.guessClef(m_newSegmentA->begin(),
+ m_newSegmentA->end()).getAsEvent
+ (m_newSegmentA->getStartTime()));
+
+ m_newSegmentB->insert
+ (helperB.guessClef(m_newSegmentB->begin(),
+ m_newSegmentB->end()).getAsEvent
+ (m_newSegmentB->getStartTime()));
+
+ } else if (m_clefHandling == UseTrebleAndBassClefs) {
+
+ m_newSegmentA->insert
+ (Clef(Clef::Treble).getAsEvent
+ (m_newSegmentA->getStartTime()));
+
+ m_newSegmentB->insert
+ (Clef(Clef::Bass).getAsEvent
+ (m_newSegmentB->getStartTime()));
+ }
+
+ //!!! m_composition->getNotationQuantizer()->quantize(m_newSegmentA);
+ // m_composition->getNotationQuantizer()->quantize(m_newSegmentB);
+ helperA.autoBeam(m_newSegmentA->begin(), m_newSegmentA->end(),
+ BaseProperties::GROUP_TYPE_BEAMED);
+ helperB.autoBeam(m_newSegmentB->begin(), m_newSegmentB->end(),
+ BaseProperties::GROUP_TYPE_BEAMED);
+
+ std::string label = m_segment->getLabel();
+ m_newSegmentA->setLabel(qstrtostr(i18n("%1 (upper)").arg
+ (strtoqstr(label))));
+ m_newSegmentB->setLabel(qstrtostr(i18n("%1 (lower)").arg
+ (strtoqstr(label))));
+ m_newSegmentA->setColourIndex(m_segment->getColourIndex());
+ m_newSegmentB->setColourIndex(m_segment->getColourIndex());
+
+ m_composition->detachSegment(m_segment);
+ m_executed = true;
+}
+
+void
+SegmentSplitByPitchCommand::unexecute()
+{
+ m_composition->addSegment(m_segment);
+ m_composition->detachSegment(m_newSegmentA);
+ m_composition->detachSegment(m_newSegmentB);
+ m_executed = false;
+}
+
+int
+SegmentSplitByPitchCommand::getSplitPitchAt(Segment::iterator i,
+ int lastSplitPitch)
+{
+ typedef std::set<int>::iterator PitchItr;
+ std::set<int> pitches;
+
+ // when this algorithm appears to be working ok, we should be
+ // able to make it much quicker
+
+ const Quantizer *quantizer
+ (m_segment->getComposition()->getNotationQuantizer());
+
+ int myHighest, myLowest;
+ int prevHighest = 0, prevLowest = 0;
+ bool havePrev = false;
+
+ Chord c0(*m_segment, i, quantizer);
+ std::vector<int> c0p(c0.getPitches());
+ pitches.insert<std::vector<int>::iterator>(c0p.begin(), c0p.end());
+
+ myLowest = c0p[0];
+ myHighest = c0p[c0p.size() - 1];
+
+ Segment::iterator j(c0.getPreviousNote());
+ if (j != m_segment->end()) {
+
+ havePrev = true;
+
+ Chord c1(*m_segment, j, quantizer);
+ std::vector<int> c1p(c1.getPitches());
+ pitches.insert<std::vector<int>::iterator>(c1p.begin(), c1p.end());
+
+ prevLowest = c1p[0];
+ prevHighest = c1p[c1p.size() - 1];
+ }
+
+ if (pitches.size() < 2)
+ return lastSplitPitch;
+
+ PitchItr pi = pitches.begin();
+ int lowest(*pi);
+
+ pi = pitches.end();
+ --pi;
+ int highest(*pi);
+
+ if ((pitches.size() == 2 || highest - lowest <= 18) &&
+ myHighest > lastSplitPitch &&
+ myLowest < lastSplitPitch &&
+ prevHighest > lastSplitPitch &&
+ prevLowest < lastSplitPitch) {
+
+ if (havePrev) {
+ if ((myLowest > prevLowest && myHighest > prevHighest) ||
+ (myLowest < prevLowest && myHighest < prevHighest)) {
+ int avgDiff = ((myLowest - prevLowest) +
+ (myHighest - prevHighest)) / 2;
+ if (avgDiff < -5)
+ avgDiff = -5;
+ if (avgDiff > 5)
+ avgDiff = 5;
+ return lastSplitPitch + avgDiff;
+ }
+ }
+
+ return lastSplitPitch;
+ }
+
+ int middle = (highest - lowest) / 2 + lowest;
+
+ while (lastSplitPitch > middle && lastSplitPitch > m_splitPitch - 12) {
+ if (lastSplitPitch - lowest < 12)
+ return lastSplitPitch;
+ if (lastSplitPitch <= m_splitPitch - 12)
+ return lastSplitPitch;
+ --lastSplitPitch;
+ }
+
+ while (lastSplitPitch < middle && lastSplitPitch < m_splitPitch + 12) {
+ if (highest - lastSplitPitch < 12)
+ return lastSplitPitch;
+ if (lastSplitPitch >= m_splitPitch + 12)
+ return lastSplitPitch;
+ ++lastSplitPitch;
+ }
+
+ return lastSplitPitch;
+}
+
+}
diff --git a/src/commands/segment/SegmentSplitByPitchCommand.h b/src/commands/segment/SegmentSplitByPitchCommand.h
new file mode 100644
index 0000000..e536be6
--- /dev/null
+++ b/src/commands/segment/SegmentSplitByPitchCommand.h
@@ -0,0 +1,83 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_SEGMENTSPLITBYPITCHCOMMAND_H_
+#define _RG_SEGMENTSPLITBYPITCHCOMMAND_H_
+
+#include "base/Segment.h"
+#include <kcommand.h>
+#include <qstring.h>
+#include <klocale.h>
+#include "gui/general/ClefIndex.h"
+
+
+
+
+namespace Rosegarden
+{
+
+class Composition;
+
+
+class SegmentSplitByPitchCommand : public KNamedCommand
+{
+public:
+ enum ClefHandling {
+ LeaveClefs,
+ RecalculateClefs,
+ UseTrebleAndBassClefs
+ };
+
+ SegmentSplitByPitchCommand(Segment *segment,
+ int splitPitch,
+ bool ranging,
+ bool duplicateNonNoteEvents,
+ ClefHandling clefHandling);
+ virtual ~SegmentSplitByPitchCommand();
+
+ static QString getGlobalName()
+ { return i18n("Split by &Pitch..."); }
+
+ virtual void execute();
+ virtual void unexecute();
+
+private:
+ int getSplitPitchAt(Segment::iterator i, int lastSplitPitch);
+
+ Composition *m_composition;
+ Segment *m_segment;
+ Segment *m_newSegmentA;
+ Segment *m_newSegmentB;
+ int m_splitPitch;
+ bool m_ranging;
+ bool m_dupNonNoteEvents;
+ ClefHandling m_clefHandling;
+ bool m_executed;
+};
+
+
+}
+
+#endif
diff --git a/src/commands/segment/SegmentSplitByRecordingSrcCommand.cpp b/src/commands/segment/SegmentSplitByRecordingSrcCommand.cpp
new file mode 100644
index 0000000..fbb3c1b
--- /dev/null
+++ b/src/commands/segment/SegmentSplitByRecordingSrcCommand.cpp
@@ -0,0 +1,153 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "SegmentSplitByRecordingSrcCommand.h"
+
+#include "base/BaseProperties.h"
+#include "misc/Strings.h"
+#include "base/Composition.h"
+#include "base/Event.h"
+#include "base/NotationTypes.h"
+#include "base/Segment.h"
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+SegmentSplitByRecordingSrcCommand::SegmentSplitByRecordingSrcCommand (
+ Segment *segment, int channel, int device ) :
+ KNamedCommand(i18n("Split by Recording Source")),
+ m_composition(segment->getComposition()),
+ m_segment(segment),
+ m_newSegmentA(0),
+ m_channel(channel),
+ m_device(device),
+ m_executed(false)
+{}
+
+void
+SegmentSplitByRecordingSrcCommand::execute()
+{
+ if (!m_newSegmentA) {
+
+ m_newSegmentA = new Segment;
+ m_newSegmentB = new Segment;
+
+ m_newSegmentA->setTrack(m_segment->getTrack());
+ m_newSegmentA->setStartTime(m_segment->getStartTime());
+
+ m_newSegmentB->setTrack(m_segment->getTrack());
+ m_newSegmentB->setStartTime(m_segment->getStartTime());
+
+ bool selectedC = false;
+ bool selectedD = false;
+
+ for (Segment::iterator i = m_segment->begin();
+ m_segment->isBeforeEndMarker(i); ++i) {
+
+ if ((*i)->isa(Note::EventRestType))
+ continue;
+
+ if ( (*i)->isa(Clef::EventType) ||
+ (*i)->isa(Key::EventType) ) {
+
+ m_newSegmentA->insert(new Event(**i));
+ m_newSegmentB->insert(new Event(**i));
+ continue;
+ }
+
+ selectedC = false;
+ selectedD = false;
+
+ if ((*i)->has(BaseProperties::RECORDED_CHANNEL)) {
+ selectedC = true;
+ if (m_channel > -1)
+ selectedC = ( m_channel ==
+ (*i)->get
+ <Int>(BaseProperties::RECORDED_CHANNEL) );
+ }
+
+ if ((*i)->has(BaseProperties::RECORDED_PORT)) {
+ selectedD = true;
+ if (m_device > -1)
+ selectedD = ( m_device ==
+ (*i)->get
+ <Int>(BaseProperties::RECORDED_PORT) );
+ }
+
+ if (selectedC & selectedD) {
+ if (m_newSegmentB->empty()) {
+ m_newSegmentB->fillWithRests((*i)->getAbsoluteTime());
+ }
+ m_newSegmentB->insert(new Event(**i));
+ } else {
+ if (m_newSegmentA->empty()) {
+ m_newSegmentA->fillWithRests((*i)->getAbsoluteTime());
+ }
+ m_newSegmentA->insert(new Event(**i));
+ }
+ }
+
+ m_newSegmentA->normalizeRests(m_segment->getStartTime(),
+ m_segment->getEndMarkerTime());
+ m_newSegmentB->normalizeRests(m_segment->getStartTime(),
+ m_segment->getEndMarkerTime());
+
+ std::string label = m_segment->getLabel();
+ m_newSegmentA->setLabel(qstrtostr(i18n("%1 (split)").arg
+ (strtoqstr(label))));
+ m_newSegmentB->setLabel(qstrtostr(i18n("%1 (split)").arg
+ (strtoqstr(label))));
+ m_newSegmentA->setColourIndex(m_segment->getColourIndex());
+ m_newSegmentB->setColourIndex(m_segment->getColourIndex());
+ }
+
+ m_composition->addSegment(m_newSegmentA);
+ m_composition->addSegment(m_newSegmentB);
+ m_composition->detachSegment(m_segment);
+ m_executed = true;
+}
+
+void
+SegmentSplitByRecordingSrcCommand::unexecute()
+{
+ m_composition->addSegment(m_segment);
+ m_composition->detachSegment(m_newSegmentA);
+ m_composition->detachSegment(m_newSegmentB);
+ m_executed = false;
+}
+
+SegmentSplitByRecordingSrcCommand::~SegmentSplitByRecordingSrcCommand()
+{
+ if (m_executed) {
+ delete m_segment;
+ } else {
+ delete m_newSegmentA;
+ delete m_newSegmentB;
+ }
+}
+
+}
diff --git a/src/commands/segment/SegmentSplitByRecordingSrcCommand.h b/src/commands/segment/SegmentSplitByRecordingSrcCommand.h
new file mode 100644
index 0000000..3b087ab
--- /dev/null
+++ b/src/commands/segment/SegmentSplitByRecordingSrcCommand.h
@@ -0,0 +1,70 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_SEGMENTSPLITBYRECORDINGSRCCOMMAND_H_
+#define _RG_SEGMENTSPLITBYRECORDINGSRCCOMMAND_H_
+
+#include <kcommand.h>
+#include <qstring.h>
+#include <klocale.h>
+#include "gui/application/RosegardenDCOP.h"
+
+
+
+
+namespace Rosegarden
+{
+
+class Segment;
+class Composition;
+
+
+class SegmentSplitByRecordingSrcCommand : public KNamedCommand
+{
+public:
+ SegmentSplitByRecordingSrcCommand(Segment *segment,
+ int channel, int device);
+ virtual ~SegmentSplitByRecordingSrcCommand();
+
+ static QString getGlobalName()
+ { return i18n("Split by &Recording Source..."); }
+
+ virtual void execute();
+ virtual void unexecute();
+
+private:
+ Composition *m_composition;
+ Segment *m_segment;
+ Segment *m_newSegmentA;
+ Segment *m_newSegmentB;
+ int m_channel;
+ int m_device;
+ bool m_executed;
+};
+
+
+}
+
+#endif
diff --git a/src/commands/segment/SegmentSplitCommand.cpp b/src/commands/segment/SegmentSplitCommand.cpp
new file mode 100644
index 0000000..450ad3e
--- /dev/null
+++ b/src/commands/segment/SegmentSplitCommand.cpp
@@ -0,0 +1,185 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "SegmentSplitCommand.h"
+
+#include <klocale.h>
+#include "misc/Strings.h"
+#include "base/Event.h"
+#include "base/Composition.h"
+#include "base/NotationTypes.h"
+#include "base/Segment.h"
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+SegmentSplitCommand::SegmentSplitCommand(Segment *segment,
+ timeT splitTime) :
+ KNamedCommand(i18n("Split Segment")),
+ m_segment(segment),
+ m_newSegmentA(0),
+ m_newSegmentB(0),
+ m_splitTime(splitTime),
+ m_previousEndMarkerTime(0),
+ m_detached(true)
+{}
+
+SegmentSplitCommand::~SegmentSplitCommand()
+{
+ if (m_detached) {
+ delete m_newSegmentA;
+ delete m_newSegmentB;
+ }
+ delete m_previousEndMarkerTime;
+}
+
+void
+SegmentSplitCommand::execute()
+{
+ if (m_newSegmentA) {
+
+ m_segment->getComposition()->addSegment(m_newSegmentA);
+ m_segment->getComposition()->addSegment(m_newSegmentB);
+
+ m_segment->getComposition()->detachSegment(m_segment);
+
+ m_detached = false; // i.e. new segments are not detached
+ return;
+ }
+
+ m_newSegmentA = new Segment(*m_segment);
+ m_newSegmentB = new Segment();
+
+ m_newSegmentB->setTrack(m_segment->getTrack());
+ m_newSegmentB->setStartTime(m_splitTime);
+
+ m_segment->getComposition()->addSegment(m_newSegmentA);
+ m_segment->getComposition()->addSegment(m_newSegmentB);
+
+ Event *clefEvent = 0;
+ Event *keyEvent = 0;
+
+ // Copy the last occurrence of clef and key
+ // from the left hand side of the split (nb. timesig events
+ // don't appear in segments, only in composition)
+ //
+ Segment::iterator it = m_segment->findTime(m_splitTime);
+
+ while (it != m_segment->begin()) {
+
+ --it;
+
+ if (!clefEvent && (*it)->isa(Clef::EventType)) {
+ clefEvent = new Event(**it, m_splitTime);
+ }
+
+ if (!keyEvent && (*it)->isa(Key::EventType)) {
+ keyEvent = new Event(**it, m_splitTime);
+ }
+
+ if (clefEvent && keyEvent)
+ break;
+ }
+
+ // Insert relevant meta info if we've found some
+ //
+ if (clefEvent)
+ m_newSegmentB->insert(clefEvent);
+
+ if (keyEvent)
+ m_newSegmentB->insert(keyEvent);
+
+ // Copy through the Events
+ //
+ it = m_segment->findTime(m_splitTime);
+
+ if (it != m_segment->end() && (*it)->getAbsoluteTime() > m_splitTime) {
+ m_newSegmentB->fillWithRests((*it)->getAbsoluteTime());
+ }
+
+ while (it != m_segment->end()) {
+ m_newSegmentB->insert(new Event(**it));
+ ++it;
+ }
+ m_newSegmentB->setEndTime(m_segment->getEndTime());
+ m_newSegmentB->setEndMarkerTime(m_segment->getEndMarkerTime());
+
+ // Set labels
+ //
+ m_segmentLabel = m_segment->getLabel();
+ QString newLabel = strtoqstr(m_segmentLabel);
+ if (!newLabel.endsWith(i18n(" (split)"))) {
+ newLabel = i18n("%1 (split)").arg(newLabel);
+ }
+ m_newSegmentA->setLabel(newLabel);
+ m_newSegmentB->setLabel(newLabel);
+
+ m_newSegmentB->setColourIndex(m_segment->getColourIndex());
+ m_newSegmentB->setTranspose(m_segment->getTranspose());
+ m_newSegmentB->setDelay(m_segment->getDelay());
+
+ // Resize left hand Segment
+ //
+ std::vector<Event *> toErase, toInsert;
+ for (Segment::iterator i = m_newSegmentA->findTime(m_splitTime);
+ i != m_newSegmentA->end(); ++i) {
+ if ((*i)->getAbsoluteTime() >= m_splitTime) break;
+ if ((*i)->getAbsoluteTime() + (*i)->getDuration() > m_splitTime) {
+ Event *e = new Event(**i, (*i)->getAbsoluteTime(),
+ m_splitTime - (*i)->getAbsoluteTime());
+ toErase.push_back(*i);
+ toInsert.push_back(e);
+ }
+ }
+
+ for (int i = 0; i < toErase.size(); ++i) {
+ m_newSegmentA->eraseSingle(toErase[i]);
+ delete toErase[i];
+ }
+ for (int i = 0; i < toInsert.size(); ++i) {
+ m_newSegmentA->insert(toInsert[i]);
+ }
+
+ m_newSegmentA->setEndTime(m_splitTime);
+
+ m_segment->getComposition()->detachSegment(m_segment);
+
+ m_detached = false; // i.e. new segments are not detached
+}
+
+void
+SegmentSplitCommand::unexecute()
+{
+ m_newSegmentA->getComposition()->addSegment(m_segment);
+
+ m_segment->getComposition()->detachSegment(m_newSegmentA);
+ m_segment->getComposition()->detachSegment(m_newSegmentB);
+
+ m_detached = true; // i.e. new segments are not detached
+}
+
+}
diff --git a/src/commands/segment/SegmentSplitCommand.h b/src/commands/segment/SegmentSplitCommand.h
new file mode 100644
index 0000000..8b59b76
--- /dev/null
+++ b/src/commands/segment/SegmentSplitCommand.h
@@ -0,0 +1,65 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_SEGMENTSPLITCOMMAND_H_
+#define _RG_SEGMENTSPLITCOMMAND_H_
+
+#include <string>
+#include <kcommand.h>
+#include "base/Event.h"
+
+
+
+
+namespace Rosegarden
+{
+
+class Segment;
+
+
+class SegmentSplitCommand : public KNamedCommand
+{
+public:
+ SegmentSplitCommand(Segment *segment,
+ timeT splitTime);
+ virtual ~SegmentSplitCommand();
+
+ virtual void execute();
+ virtual void unexecute();
+
+private:
+ Segment *m_segment;
+ Segment *m_newSegmentA;
+ Segment *m_newSegmentB;
+ timeT m_splitTime;
+ timeT *m_previousEndMarkerTime;
+ bool m_detached;
+ std::string m_segmentLabel;
+};
+
+
+}
+
+#endif
diff --git a/src/commands/segment/SegmentSyncClefCommand.cpp b/src/commands/segment/SegmentSyncClefCommand.cpp
new file mode 100644
index 0000000..5e3560b
--- /dev/null
+++ b/src/commands/segment/SegmentSyncClefCommand.cpp
@@ -0,0 +1,67 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "SegmentSyncClefCommand.h"
+
+#include "base/Selection.h"
+#include "commands/notation/ClefInsertionCommand.h"
+
+namespace Rosegarden
+{
+SegmentSyncClefCommand::SegmentSyncClefCommand(Segment &segment, const Clef& clef) :
+ KMacroCommand(i18n("Sync segment clef"))
+{
+ processSegment(segment, clef);
+}
+
+void
+SegmentSyncClefCommand::processSegment(Segment &segment, const Clef& clef)
+{
+ KMacroCommand * macroCommand = this;
+
+ // TODO delete it somewhere.
+ EventSelection * wholeSegment = new EventSelection(segment, segment.getStartTime(), segment.getEndMarkerTime());
+
+ EventSelection::eventcontainer::iterator i;
+
+ for (i = wholeSegment->getSegmentEvents().begin();
+ i != wholeSegment->getSegmentEvents().end(); ++i) {
+ if ((*i)->isa(Rosegarden::Clef::EventType)) {
+ macroCommand->addCommand
+ (new ClefInsertionCommand
+ (segment,
+ (*i)->getAbsoluteTime(),
+ clef, false, false));
+ }
+ }
+
+}
+
+
+SegmentSyncClefCommand::~SegmentSyncClefCommand()
+{}
+
+
+}
diff --git a/src/commands/segment/SegmentSyncClefCommand.h b/src/commands/segment/SegmentSyncClefCommand.h
new file mode 100644
index 0000000..01b97fd
--- /dev/null
+++ b/src/commands/segment/SegmentSyncClefCommand.h
@@ -0,0 +1,55 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_SEGMENTSYNCCLEFCOMMAND_H_
+#define _RG_SEGMENTSYNCCLEFCOMMAND_H_
+
+#include <kcommand.h>
+#include "base/Event.h"
+#include "base/NotationTypes.h"
+#include "document/MultiViewCommandHistory.h"
+#include <klocale.h>
+
+namespace Rosegarden
+{
+
+class Segment;
+class SegmentSelection;
+
+
+class SegmentSyncClefCommand : public KMacroCommand
+{
+public:
+ SegmentSyncClefCommand(Segment &segment, const Clef& clef);
+
+ virtual ~SegmentSyncClefCommand();
+
+protected:
+ void processSegment(Segment &segment, const Clef& clef);
+};
+
+}
+
+#endif
diff --git a/src/commands/segment/SegmentSyncCommand.cpp b/src/commands/segment/SegmentSyncCommand.cpp
new file mode 100644
index 0000000..d5e9734
--- /dev/null
+++ b/src/commands/segment/SegmentSyncCommand.cpp
@@ -0,0 +1,103 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2007
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "SegmentSyncCommand.h"
+
+#include "base/Selection.h"
+#include "commands/notation/KeyInsertionCommand.h"
+#include "commands/edit/TransposeCommand.h"
+#include "commands/segment/SegmentChangeTransposeCommand.h"
+#include "commands/segment/SegmentTransposeCommand.h"
+#include "commands/segment/SegmentSyncClefCommand.h"
+
+namespace Rosegarden
+{
+SegmentSyncCommand::SegmentSyncCommand(Segment &segment, int newTranspose, int lowRange, int highRange, const Clef& clef) :
+ KMacroCommand(i18n("Sync segment parameters"))
+{
+ processSegment(segment, newTranspose, lowRange, highRange, clef);
+}
+
+SegmentSyncCommand::SegmentSyncCommand(SegmentSelection selection, int newTranspose, int lowRange, int highRange, const Clef& clef) :
+ KMacroCommand(i18n("Sync segment parameters"))
+{
+ for (SegmentSelection::iterator i = selection.begin();
+ i != selection.end(); ++i)
+ {
+ Segment &segment = **i;
+ processSegment(segment, newTranspose, lowRange, highRange, clef);
+ }
+}
+
+SegmentSyncCommand::SegmentSyncCommand(std::vector<Segment *> segments, int newTranspose, int lowRange, int highRange, const Clef& clef) :
+ KMacroCommand(i18n("Sync segment parameters"))
+{
+ for (int i = 0; i < segments.size(); i++) {
+ processSegment(*(segments[i]), newTranspose, lowRange, highRange, clef);
+ }
+}
+
+SegmentSyncCommand::SegmentSyncCommand(Composition::segmentcontainer& segments, TrackId selectedTrack, int newTranspose, int lowRange, int highRange, const Clef& clef) :
+ KMacroCommand(i18n("Sync segment parameters"))
+{
+ for (Composition::segmentcontainer::const_iterator si = segments.begin();
+ si != segments.end(); ++si) {
+ if ((*si)->getTrack() == selectedTrack) {
+ processSegment(**si, newTranspose, lowRange, highRange, clef);
+ }
+ }
+}
+
+void
+SegmentSyncCommand::processSegment(Segment &segment, int newTranspose, int lowRange, int highRange, const Clef& clef)
+{
+ KMacroCommand * macroCommand = this;
+
+ // if the new desired setting for 'transpose' is higher, we need to
+ // transpose the notes upwards to compensate:
+ int semitones = segment.getTranspose() - newTranspose;
+
+ // Say the old transpose was -2 and the new is 0, this corresponds to
+ // Bb and C. The height of the old transpose is 1 below the height of the new.
+ int oldHeight = Pitch(segment.getTranspose()).getHeightOnStaff(Clef::Treble, Key("C major"));
+ int newHeight = Pitch(newTranspose).getHeightOnStaff(Clef::Treble, Key("C major"));
+ int steps = oldHeight - newHeight;
+
+ SegmentTransposeCommand* command = new SegmentTransposeCommand(segment, true, steps, semitones, true);
+ macroCommand->addCommand(command);
+
+ // TODO do this in an undoable fashion:
+ segment.setLowestPlayable(lowRange);
+ segment.setHighestPlayable(highRange);
+
+ macroCommand->addCommand(new SegmentSyncClefCommand(segment, clef));
+}
+
+
+SegmentSyncCommand::~SegmentSyncCommand()
+{}
+
+
+}
diff --git a/src/commands/segment/SegmentSyncCommand.h b/src/commands/segment/SegmentSyncCommand.h
new file mode 100644
index 0000000..0d8e189
--- /dev/null
+++ b/src/commands/segment/SegmentSyncCommand.h
@@ -0,0 +1,66 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2007
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_SEGMENTSYNCCOMMAND_H_
+#define _RG_SEGMENTSYNCCOMMAND_H_
+
+#include <kcommand.h>
+#include "base/Composition.h"
+#include "base/Event.h"
+#include "base/NotationTypes.h"
+#include "document/MultiViewCommandHistory.h"
+#include <klocale.h>
+
+namespace Rosegarden
+{
+
+class Segment;
+class SegmentSelection;
+
+
+class SegmentSyncCommand : public KMacroCommand
+{
+public:
+ SegmentSyncCommand(Segment &segment,
+ int newTranspose, int lowRange, int highRange, const Clef& clef);
+
+ SegmentSyncCommand(SegmentSelection selection,
+ int newTranspose, int lowRange, int highRange, const Clef& clef);
+
+ SegmentSyncCommand(std::vector<Segment *> segments,
+ int newTranspose, int lowRange, int highRange, const Clef& clef);
+
+ SegmentSyncCommand(Composition::segmentcontainer& segments, TrackId track,
+ int newTranspose, int lowRange, int highRange, const Clef& clef);
+
+ virtual ~SegmentSyncCommand();
+
+protected:
+ void processSegment(Segment &segment, int newTranspose, int lowRange, int highRange, const Clef& clef);
+};
+
+}
+
+#endif
diff --git a/src/commands/segment/SegmentTransposeCommand.cpp b/src/commands/segment/SegmentTransposeCommand.cpp
new file mode 100644
index 0000000..d3e4221
--- /dev/null
+++ b/src/commands/segment/SegmentTransposeCommand.cpp
@@ -0,0 +1,123 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "SegmentTransposeCommand.h"
+
+#include "base/Selection.h"
+#include "commands/notation/KeyInsertionCommand.h"
+#include "commands/edit/TransposeCommand.h"
+#include "commands/segment/SegmentChangeTransposeCommand.h"
+
+namespace Rosegarden
+{
+SegmentTransposeCommand::SegmentTransposeCommand(Segment &segment, bool changeKey, int steps, int semitones, bool transposeSegmentBack) :
+ KMacroCommand(i18n("Change segment transposition"))
+{
+ processSegment(segment, changeKey, steps, semitones, transposeSegmentBack);
+}
+
+SegmentTransposeCommand::SegmentTransposeCommand(SegmentSelection selection, bool changeKey, int steps, int semitones, bool transposeSegmentBack) :
+ KMacroCommand(i18n("Change segment transposition"))
+{
+ //SegmentSelection selection(m_view->getSelection());
+ for (SegmentSelection::iterator i = selection.begin();
+ i != selection.end(); ++i)
+ {
+ Segment &segment = **i;
+ processSegment(segment, changeKey, steps, semitones, transposeSegmentBack);
+ }
+}
+
+void
+SegmentTransposeCommand::processSegment(Segment &segment, bool changeKey, int steps, int semitones, bool transposeSegmentBack)
+{
+ KMacroCommand * macroCommand = this;
+
+ // TODO delete it somewhere.
+ EventSelection * wholeSegment = new EventSelection(segment, segment.getStartTime(), segment.getEndMarkerTime());
+ macroCommand->addCommand(new TransposeCommand
+ (semitones, steps, *wholeSegment));
+
+ // Key insertion can do transposition, but a C4 to D becomes a D4, while
+ // a C4 to G becomes a G3. Because we let the user specify an explicit number
+ // of octaves to move the notes up/down, we add the keys without transposing
+ // and handle the transposition seperately:
+ if (changeKey)
+ {
+ Rosegarden::Key initialKey = segment.getKeyAtTime(segment.getStartTime());
+ Rosegarden::Key newInitialKey = initialKey.transpose(semitones, steps);
+
+ EventSelection::eventcontainer::iterator i;
+ //std::list<KeyInsertionCommand*> commands;
+
+ for (i = wholeSegment->getSegmentEvents().begin();
+ i != wholeSegment->getSegmentEvents().end(); ++i) {
+ // transpose key
+ if ((*i)->isa(Rosegarden::Key::EventType)) {
+ Rosegarden::Key trKey = (Rosegarden::Key (**i)).transpose(semitones, steps);
+ //commands.push_front
+ macroCommand->addCommand
+ (new KeyInsertionCommand
+ (segment,
+ (*i)->getAbsoluteTime(),
+ trKey,
+ false,
+ false,
+ false,
+ true));
+ }
+ }
+ std::list<KeyInsertionCommand*>::iterator ci;
+ //for (ci=commands.begin(); ci!=commands.end(); ci++)
+ //{
+ // commandHistory->addCommand(*ci);
+ //}
+
+ KeyInsertionCommand *firstKeyCommand = new KeyInsertionCommand
+ (segment,
+ segment.getStartTime(),
+ newInitialKey,
+ false,
+ false,
+ false,
+ true);
+ //commandHistory->addCommand(firstKeyCommand);
+ macroCommand->addCommand(firstKeyCommand);
+ }
+
+ if (transposeSegmentBack)
+ {
+ // Transpose segment in opposite direction
+ int newTranspose = segment.getTranspose() - semitones;
+ macroCommand->addCommand(new SegmentChangeTransposeCommand(newTranspose, &segment));
+ }
+}
+
+
+SegmentTransposeCommand::~SegmentTransposeCommand()
+{}
+
+
+}
diff --git a/src/commands/segment/SegmentTransposeCommand.h b/src/commands/segment/SegmentTransposeCommand.h
new file mode 100644
index 0000000..74af8d4
--- /dev/null
+++ b/src/commands/segment/SegmentTransposeCommand.h
@@ -0,0 +1,64 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_SEGMENTTRANSPOSECOMMAND_H_
+#define _RG_SEGMENTTRANSPOSECOMMAND_H_
+
+#include <kcommand.h>
+#include "base/Event.h"
+#include "document/MultiViewCommandHistory.h"
+#include <klocale.h>
+
+namespace Rosegarden
+{
+
+class Segment;
+class SegmentSelection;
+
+
+class SegmentTransposeCommand : public KMacroCommand
+{
+public:
+ SegmentTransposeCommand(Segment &segment,
+ bool changeKey, int steps, int semitones, bool transposeSegmentBack);
+
+ SegmentTransposeCommand(SegmentSelection selection,
+ bool changeKey, int steps, int semitones, bool transposeSegmentBack);
+
+ virtual ~SegmentTransposeCommand();
+
+ static QString getGlobalName(int semitones = 0, int step = 0) {
+ switch (semitones) {
+ default: return i18n("Transpose by &Interval...");
+ }
+ }
+
+protected:
+ void processSegment(Segment &segment, bool changeKey, int steps, int semitones, bool transposeSegmentBack);
+};
+
+}
+
+#endif
diff --git a/src/commands/segment/SetTriggerSegmentBasePitchCommand.cpp b/src/commands/segment/SetTriggerSegmentBasePitchCommand.cpp
new file mode 100644
index 0000000..9bb1bc3
--- /dev/null
+++ b/src/commands/segment/SetTriggerSegmentBasePitchCommand.cpp
@@ -0,0 +1,74 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "SetTriggerSegmentBasePitchCommand.h"
+
+#include <klocale.h>
+#include "base/Composition.h"
+#include "base/TriggerSegment.h"
+
+
+namespace Rosegarden
+{
+
+SetTriggerSegmentBasePitchCommand::SetTriggerSegmentBasePitchCommand(Composition *composition,
+ TriggerSegmentId id,
+ int newPitch) :
+ KNamedCommand(i18n("Set Base Pitch")),
+ m_composition(composition),
+ m_id(id),
+ m_newPitch(newPitch),
+ m_oldPitch( -1)
+{
+ // nothing
+}
+
+SetTriggerSegmentBasePitchCommand::~SetTriggerSegmentBasePitchCommand()
+{
+ // nothing
+}
+
+void
+SetTriggerSegmentBasePitchCommand::execute()
+{
+ TriggerSegmentRec *rec = m_composition->getTriggerSegmentRec(m_id);
+ if (!rec)
+ return ;
+ if (m_oldPitch == -1) {
+ m_oldPitch = rec->getBasePitch();
+ }
+ rec->setBasePitch(m_newPitch);
+}
+
+void
+SetTriggerSegmentBasePitchCommand::unexecute()
+{
+ TriggerSegmentRec *rec = m_composition->getTriggerSegmentRec(m_id);
+ if (!rec)
+ return ;
+ rec->setBasePitch(m_oldPitch);
+}
+
+}
diff --git a/src/commands/segment/SetTriggerSegmentBasePitchCommand.h b/src/commands/segment/SetTriggerSegmentBasePitchCommand.h
new file mode 100644
index 0000000..0d79c7c
--- /dev/null
+++ b/src/commands/segment/SetTriggerSegmentBasePitchCommand.h
@@ -0,0 +1,63 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_SETTRIGGERSEGMENTBASEPITCHCOMMAND_H_
+#define _RG_SETTRIGGERSEGMENTBASEPITCHCOMMAND_H_
+
+#include "base/TriggerSegment.h"
+#include <kcommand.h>
+
+
+
+
+namespace Rosegarden
+{
+
+class Composition;
+
+
+class SetTriggerSegmentBasePitchCommand : public KNamedCommand
+{
+public:
+ SetTriggerSegmentBasePitchCommand(Composition *composition,
+ TriggerSegmentId id,
+ int newPitch);
+ virtual ~SetTriggerSegmentBasePitchCommand();
+
+ virtual void execute();
+ virtual void unexecute();
+
+protected:
+ Composition *m_composition;
+ TriggerSegmentId m_id;
+ int m_newPitch;
+ int m_oldPitch;
+};
+
+
+
+}
+
+#endif
diff --git a/src/commands/segment/SetTriggerSegmentBaseVelocityCommand.cpp b/src/commands/segment/SetTriggerSegmentBaseVelocityCommand.cpp
new file mode 100644
index 0000000..f1bba10
--- /dev/null
+++ b/src/commands/segment/SetTriggerSegmentBaseVelocityCommand.cpp
@@ -0,0 +1,74 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "SetTriggerSegmentBaseVelocityCommand.h"
+
+#include <klocale.h>
+#include "base/Composition.h"
+#include "base/TriggerSegment.h"
+
+
+namespace Rosegarden
+{
+
+SetTriggerSegmentBaseVelocityCommand::SetTriggerSegmentBaseVelocityCommand(Composition *composition,
+ TriggerSegmentId id,
+ int newVelocity) :
+ KNamedCommand(i18n("Set Base Velocity")),
+ m_composition(composition),
+ m_id(id),
+ m_newVelocity(newVelocity),
+ m_oldVelocity( -1)
+{
+ // nothing
+}
+
+SetTriggerSegmentBaseVelocityCommand::~SetTriggerSegmentBaseVelocityCommand()
+{
+ // nothing
+}
+
+void
+SetTriggerSegmentBaseVelocityCommand::execute()
+{
+ TriggerSegmentRec *rec = m_composition->getTriggerSegmentRec(m_id);
+ if (!rec)
+ return ;
+ if (m_oldVelocity == -1) {
+ m_oldVelocity = rec->getBaseVelocity();
+ }
+ rec->setBaseVelocity(m_newVelocity);
+}
+
+void
+SetTriggerSegmentBaseVelocityCommand::unexecute()
+{
+ TriggerSegmentRec *rec = m_composition->getTriggerSegmentRec(m_id);
+ if (!rec)
+ return ;
+ rec->setBaseVelocity(m_oldVelocity);
+}
+
+}
diff --git a/src/commands/segment/SetTriggerSegmentBaseVelocityCommand.h b/src/commands/segment/SetTriggerSegmentBaseVelocityCommand.h
new file mode 100644
index 0000000..26875ec
--- /dev/null
+++ b/src/commands/segment/SetTriggerSegmentBaseVelocityCommand.h
@@ -0,0 +1,63 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_SETTRIGGERSEGMENTBASEVELOCITYCOMMAND_H_
+#define _RG_SETTRIGGERSEGMENTBASEVELOCITYCOMMAND_H_
+
+#include "base/TriggerSegment.h"
+#include <kcommand.h>
+
+
+
+
+namespace Rosegarden
+{
+
+class Composition;
+
+
+class SetTriggerSegmentBaseVelocityCommand : public KNamedCommand
+{
+public:
+ SetTriggerSegmentBaseVelocityCommand(Composition *composition,
+ TriggerSegmentId id,
+ int newVelocity);
+ virtual ~SetTriggerSegmentBaseVelocityCommand();
+
+ virtual void execute();
+ virtual void unexecute();
+
+protected:
+ Composition *m_composition;
+ TriggerSegmentId m_id;
+ int m_newVelocity;
+ int m_oldVelocity;
+};
+
+
+
+}
+
+#endif
diff --git a/src/commands/segment/SetTriggerSegmentDefaultRetuneCommand.cpp b/src/commands/segment/SetTriggerSegmentDefaultRetuneCommand.cpp
new file mode 100644
index 0000000..35ae878
--- /dev/null
+++ b/src/commands/segment/SetTriggerSegmentDefaultRetuneCommand.cpp
@@ -0,0 +1,75 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "SetTriggerSegmentDefaultRetuneCommand.h"
+
+#include <klocale.h>
+#include "base/Composition.h"
+#include "base/TriggerSegment.h"
+
+
+namespace Rosegarden
+{
+
+SetTriggerSegmentDefaultRetuneCommand::SetTriggerSegmentDefaultRetuneCommand(Composition *composition,
+ TriggerSegmentId id,
+ bool newDefaultRetune) :
+ KNamedCommand(i18n("Set Default Retune")),
+ m_composition(composition),
+ m_id(id),
+ m_newDefaultRetune(newDefaultRetune),
+ m_oldDefaultRetune(false),
+ m_haveOldDefaultRetune(false)
+{
+ // nothing
+}
+
+SetTriggerSegmentDefaultRetuneCommand::~SetTriggerSegmentDefaultRetuneCommand()
+{
+ // nothing
+}
+
+void
+SetTriggerSegmentDefaultRetuneCommand::execute()
+{
+ TriggerSegmentRec *rec = m_composition->getTriggerSegmentRec(m_id);
+ if (!rec)
+ return ;
+ if (!m_haveOldDefaultRetune) {
+ m_oldDefaultRetune = rec->getDefaultRetune();
+ }
+ rec->setDefaultRetune(m_newDefaultRetune);
+}
+
+void
+SetTriggerSegmentDefaultRetuneCommand::unexecute()
+{
+ TriggerSegmentRec *rec = m_composition->getTriggerSegmentRec(m_id);
+ if (!rec)
+ return ;
+ rec->setDefaultRetune(m_oldDefaultRetune);
+}
+
+}
diff --git a/src/commands/segment/SetTriggerSegmentDefaultRetuneCommand.h b/src/commands/segment/SetTriggerSegmentDefaultRetuneCommand.h
new file mode 100644
index 0000000..4563594
--- /dev/null
+++ b/src/commands/segment/SetTriggerSegmentDefaultRetuneCommand.h
@@ -0,0 +1,64 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_SETTRIGGERSEGMENTDEFAULTRETUNECOMMAND_H_
+#define _RG_SETTRIGGERSEGMENTDEFAULTRETUNECOMMAND_H_
+
+#include "base/TriggerSegment.h"
+#include <kcommand.h>
+
+
+
+
+namespace Rosegarden
+{
+
+class Composition;
+
+
+class SetTriggerSegmentDefaultRetuneCommand : public KNamedCommand
+{
+public:
+ SetTriggerSegmentDefaultRetuneCommand(Composition *composition,
+ TriggerSegmentId id,
+ bool newDefaultRetune);
+ virtual ~SetTriggerSegmentDefaultRetuneCommand();
+
+ virtual void execute();
+ virtual void unexecute();
+
+protected:
+ Composition *m_composition;
+ TriggerSegmentId m_id;
+ bool m_newDefaultRetune;
+ bool m_oldDefaultRetune;
+ bool m_haveOldDefaultRetune;
+};
+
+
+
+}
+
+#endif
diff --git a/src/commands/segment/SetTriggerSegmentDefaultTimeAdjustCommand.cpp b/src/commands/segment/SetTriggerSegmentDefaultTimeAdjustCommand.cpp
new file mode 100644
index 0000000..deb49a1
--- /dev/null
+++ b/src/commands/segment/SetTriggerSegmentDefaultTimeAdjustCommand.cpp
@@ -0,0 +1,74 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "SetTriggerSegmentDefaultTimeAdjustCommand.h"
+
+#include <klocale.h>
+#include "base/Composition.h"
+#include "base/TriggerSegment.h"
+
+
+namespace Rosegarden
+{
+
+SetTriggerSegmentDefaultTimeAdjustCommand::SetTriggerSegmentDefaultTimeAdjustCommand(Composition *composition,
+ TriggerSegmentId id,
+ std::string newDefaultTimeAdjust) :
+ KNamedCommand(i18n("Set Default Time Adjust")),
+ m_composition(composition),
+ m_id(id),
+ m_newDefaultTimeAdjust(newDefaultTimeAdjust),
+ m_oldDefaultTimeAdjust("")
+{
+ // nothing
+}
+
+SetTriggerSegmentDefaultTimeAdjustCommand::~SetTriggerSegmentDefaultTimeAdjustCommand()
+{
+ // nothing
+}
+
+void
+SetTriggerSegmentDefaultTimeAdjustCommand::execute()
+{
+ TriggerSegmentRec *rec = m_composition->getTriggerSegmentRec(m_id);
+ if (!rec)
+ return ;
+ if (m_oldDefaultTimeAdjust == "") {
+ m_oldDefaultTimeAdjust = rec->getDefaultTimeAdjust();
+ }
+ rec->setDefaultTimeAdjust(m_newDefaultTimeAdjust);
+}
+
+void
+SetTriggerSegmentDefaultTimeAdjustCommand::unexecute()
+{
+ TriggerSegmentRec *rec = m_composition->getTriggerSegmentRec(m_id);
+ if (!rec)
+ return ;
+ rec->setDefaultTimeAdjust(m_oldDefaultTimeAdjust);
+}
+
+}
diff --git a/src/commands/segment/SetTriggerSegmentDefaultTimeAdjustCommand.h b/src/commands/segment/SetTriggerSegmentDefaultTimeAdjustCommand.h
new file mode 100644
index 0000000..7d31b26
--- /dev/null
+++ b/src/commands/segment/SetTriggerSegmentDefaultTimeAdjustCommand.h
@@ -0,0 +1,64 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_SETTRIGGERSEGMENTDEFAULTTIMEADJUSTCOMMAND_H_
+#define _RG_SETTRIGGERSEGMENTDEFAULTTIMEADJUSTCOMMAND_H_
+
+#include "base/TriggerSegment.h"
+#include <string>
+#include <kcommand.h>
+
+
+
+
+namespace Rosegarden
+{
+
+class Composition;
+
+
+class SetTriggerSegmentDefaultTimeAdjustCommand : public KNamedCommand
+{
+public:
+ SetTriggerSegmentDefaultTimeAdjustCommand(Composition *composition,
+ TriggerSegmentId id,
+ std::string newDefaultTimeAdjust);
+ virtual ~SetTriggerSegmentDefaultTimeAdjustCommand();
+
+ virtual void execute();
+ virtual void unexecute();
+
+protected:
+ Composition *m_composition;
+ TriggerSegmentId m_id;
+ std::string m_newDefaultTimeAdjust;
+ std::string m_oldDefaultTimeAdjust;
+};
+
+
+
+}
+
+#endif
diff --git a/src/commands/studio/AddControlParameterCommand.cpp b/src/commands/studio/AddControlParameterCommand.cpp
new file mode 100644
index 0000000..35ac62a
--- /dev/null
+++ b/src/commands/studio/AddControlParameterCommand.cpp
@@ -0,0 +1,75 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "AddControlParameterCommand.h"
+
+#include "base/ControlParameter.h"
+#include "base/Device.h"
+#include "base/MidiDevice.h"
+#include "base/Studio.h"
+#include <qstring.h>
+#include <iostream>
+
+
+namespace Rosegarden
+{
+
+AddControlParameterCommand::~AddControlParameterCommand()
+{}
+
+void
+AddControlParameterCommand::execute()
+{
+ MidiDevice *md = dynamic_cast<MidiDevice *>
+ (m_studio->getDevice(m_device));
+ if (!md) {
+ std::cerr << "WARNING: AddControlParameterCommand::execute: device "
+ << m_device << " is not a MidiDevice in current studio"
+ << std::endl;
+ return ;
+ }
+
+ md->addControlParameter(m_control);
+
+ // store id of the new control
+ m_id = md->getControlParameters().size() - 1;
+}
+
+void
+AddControlParameterCommand::unexecute()
+{
+ MidiDevice *md = dynamic_cast<MidiDevice *>
+ (m_studio->getDevice(m_device));
+ if (!md) {
+ std::cerr << "WARNING: AddControlParameterCommand::unexecute: device "
+ << m_device << " is not a MidiDevice in current studio"
+ << std::endl;
+ return ;
+ }
+
+ md->removeControlParameter(m_id);
+}
+
+}
diff --git a/src/commands/studio/AddControlParameterCommand.h b/src/commands/studio/AddControlParameterCommand.h
new file mode 100644
index 0000000..fa614ac
--- /dev/null
+++ b/src/commands/studio/AddControlParameterCommand.h
@@ -0,0 +1,75 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_ADDCONTROLPARAMETERCOMMAND_H_
+#define _RG_ADDCONTROLPARAMETERCOMMAND_H_
+
+#include "base/ControlParameter.h"
+#include "base/Device.h"
+#include <kcommand.h>
+#include <qstring.h>
+#include <klocale.h>
+
+
+
+
+namespace Rosegarden
+{
+
+class Studio;
+
+
+class AddControlParameterCommand : public KNamedCommand
+{
+public:
+ AddControlParameterCommand(Studio *studio,
+ DeviceId device,
+ ControlParameter control):
+ KNamedCommand(getGlobalName()),
+ m_studio(studio),
+ m_device(device),
+ m_control(control),
+ m_id(0) { }
+
+ ~AddControlParameterCommand();
+
+ virtual void execute();
+ virtual void unexecute();
+
+ static QString getGlobalName() { return i18n("&Add Control Parameter"); }
+
+protected:
+ Studio *m_studio;
+ DeviceId m_device;
+ ControlParameter m_control;
+ int m_id;
+
+};
+
+
+
+}
+
+#endif
diff --git a/src/commands/studio/CreateOrDeleteDeviceCommand.cpp b/src/commands/studio/CreateOrDeleteDeviceCommand.cpp
new file mode 100644
index 0000000..48dc6c1
--- /dev/null
+++ b/src/commands/studio/CreateOrDeleteDeviceCommand.cpp
@@ -0,0 +1,161 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "CreateOrDeleteDeviceCommand.h"
+
+#include "misc/Debug.h"
+#include "misc/Strings.h"
+#include "base/Device.h"
+#include "base/MidiDevice.h"
+#include "base/Studio.h"
+#include <qcstring.h>
+#include <qdatastream.h>
+#include <qstring.h>
+#include "gui/application/RosegardenApplication.h"
+
+
+namespace Rosegarden
+{
+
+CreateOrDeleteDeviceCommand::CreateOrDeleteDeviceCommand(Studio *studio,
+ DeviceId id) :
+ KNamedCommand(getGlobalName(true)),
+ m_studio(studio),
+ m_deviceId(id),
+ m_deviceCreated(true)
+{
+ Device *device = m_studio->getDevice(m_deviceId);
+
+ if (device) {
+ m_name = device->getName();
+ m_type = device->getType();
+ m_direction = MidiDevice::Play;
+ MidiDevice *md =
+ dynamic_cast<MidiDevice *>(device);
+ if (md)
+ m_direction = md->getDirection();
+ m_connection = device->getConnection();
+ } else {
+ RG_DEBUG << "CreateOrDeleteDeviceCommand: No such device as "
+ << m_deviceId << endl;
+ }
+}
+
+void
+CreateOrDeleteDeviceCommand::execute()
+{
+ if (!m_deviceCreated) {
+
+ // Create
+
+ // don't want to do this again on undo even if it fails -- only on redo
+ m_deviceCreated = true;
+
+
+ QByteArray data;
+ QByteArray replyData;
+ QCString replyType;
+ QDataStream arg(data, IO_WriteOnly);
+
+ arg << (int)m_type;
+ arg << (unsigned int)m_direction;
+
+ if (!rgapp->sequencerCall("addDevice(int, unsigned int)",
+ replyType, replyData, data)) {
+ SEQMAN_DEBUG << "CreateDeviceCommand::execute - "
+ << "failure in sequencer addDevice" << endl;
+ return ;
+ }
+
+ QDataStream reply(replyData, IO_ReadOnly);
+ reply >> m_deviceId;
+
+ if (m_deviceId == Device::NO_DEVICE) {
+ SEQMAN_DEBUG << "CreateDeviceCommand::execute - "
+ << "sequencer addDevice failed" << endl;
+ return ;
+ }
+
+ SEQMAN_DEBUG << "CreateDeviceCommand::execute - "
+ << " added device " << m_deviceId << endl;
+
+ arg.device()->reset();
+ arg << (unsigned int)m_deviceId;
+ arg << strtoqstr(m_connection);
+
+ if (!rgapp->sequencerCall("setConnection(unsigned int, QString)",
+ replyType, replyData, data)) {
+ SEQMAN_DEBUG << "CreateDeviceCommand::execute - "
+ << "failure in sequencer setConnection" << endl;
+ return ;
+ }
+
+ SEQMAN_DEBUG << "CreateDeviceCommand::execute - "
+ << " reconnected device " << m_deviceId
+ << " to " << m_connection << endl;
+
+ // Add the device to the Studio now, so that we can name it --
+ // otherwise the name will be lost
+ m_studio->addDevice(m_name, m_deviceId, m_type);
+ Device *device = m_studio->getDevice(m_deviceId);
+ if (device) {
+ MidiDevice *md = dynamic_cast<MidiDevice *>
+ (device);
+ if (md)
+ md->setDirection(m_direction);
+ }
+
+ } else {
+
+ // Delete
+
+ QByteArray data;
+ QByteArray replyData;
+ QCString replyType;
+ QDataStream arg(data, IO_WriteOnly);
+
+ if (m_deviceId == Device::NO_DEVICE)
+ return ;
+
+ arg << (int)m_deviceId;
+
+ if (!rgapp->sequencerCall("removeDevice(unsigned int)",
+ replyType, replyData, data)) {
+ SEQMAN_DEBUG << "CreateDeviceCommand::execute - "
+ << "failure in sequencer addDevice" << endl;
+ return ;
+ }
+
+ SEQMAN_DEBUG << "CreateDeviceCommand::unexecute - "
+ << " removed device " << m_deviceId << endl;
+
+ m_studio->removeDevice(m_deviceId);
+
+ m_deviceId = Device::NO_DEVICE;
+ m_deviceCreated = false;
+ }
+}
+
+}
diff --git a/src/commands/studio/CreateOrDeleteDeviceCommand.h b/src/commands/studio/CreateOrDeleteDeviceCommand.h
new file mode 100644
index 0000000..2fe69a3
--- /dev/null
+++ b/src/commands/studio/CreateOrDeleteDeviceCommand.h
@@ -0,0 +1,88 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_CREATEORDELETEDEVICECOMMAND_H_
+#define _RG_CREATEORDELETEDEVICECOMMAND_H_
+
+#include "base/Device.h"
+#include "base/MidiDevice.h"
+#include <string>
+#include <kcommand.h>
+#include <qstring.h>
+#include <klocale.h>
+
+
+
+
+namespace Rosegarden
+{
+
+class Studio;
+
+
+class CreateOrDeleteDeviceCommand : public KNamedCommand
+{
+public:
+ // Creation constructor
+ CreateOrDeleteDeviceCommand(Studio *studio,
+ std::string name,
+ Device::DeviceType type,
+ MidiDevice::DeviceDirection direction,
+ std::string connection) :
+ KNamedCommand(getGlobalName(false)),
+ m_studio(studio),
+ m_name(name),
+ m_type(type),
+ m_direction(direction),
+ m_connection(connection),
+ m_deviceId(Device::NO_DEVICE),
+ m_deviceCreated(false) { }
+
+ // Deletion constructor
+ CreateOrDeleteDeviceCommand(Studio *studio,
+ DeviceId deviceId);
+
+ static QString getGlobalName(bool deletion) {
+ return (deletion ? i18n("Delete Device") : i18n("Create Device"));
+ }
+
+ virtual void execute();
+ virtual void unexecute() { execute(); }
+
+protected:
+ Studio *m_studio;
+ std::string m_name;
+ Device::DeviceType m_type;
+ MidiDevice::DeviceDirection m_direction;
+ std::string m_connection;
+ DeviceId m_deviceId;
+ bool m_deviceCreated;
+};
+
+
+
+}
+
+#endif
diff --git a/src/commands/studio/ModifyControlParameterCommand.cpp b/src/commands/studio/ModifyControlParameterCommand.cpp
new file mode 100644
index 0000000..5c8c1a2
--- /dev/null
+++ b/src/commands/studio/ModifyControlParameterCommand.cpp
@@ -0,0 +1,75 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "ModifyControlParameterCommand.h"
+
+#include "base/ControlParameter.h"
+#include "base/Device.h"
+#include "base/MidiDevice.h"
+#include "base/Studio.h"
+#include <qstring.h>
+#include <iostream>
+
+
+namespace Rosegarden
+{
+
+ModifyControlParameterCommand::~ModifyControlParameterCommand()
+{}
+
+void
+ModifyControlParameterCommand::execute()
+{
+ MidiDevice *md = dynamic_cast<MidiDevice *>
+ (m_studio->getDevice(m_device));
+ if (!md) {
+ std::cerr << "WARNING: ModifyControlParameterCommand::execute: device "
+ << m_device << " is not a MidiDevice in current studio"
+ << std::endl;
+ return ;
+ }
+
+ ControlParameter *param = md->getControlParameter(m_id);
+ if (param)
+ m_originalControl = *param;
+ md->modifyControlParameter(m_control, m_id);
+}
+
+void
+ModifyControlParameterCommand::unexecute()
+{
+ MidiDevice *md = dynamic_cast<MidiDevice *>
+ (m_studio->getDevice(m_device));
+ if (!md) {
+ std::cerr << "WARNING: ModifyControlParameterCommand::execute: device "
+ << m_device << " is not a MidiDevice in current studio"
+ << std::endl;
+ return ;
+ }
+
+ md->modifyControlParameter(m_originalControl, m_id);
+}
+
+}
diff --git a/src/commands/studio/ModifyControlParameterCommand.h b/src/commands/studio/ModifyControlParameterCommand.h
new file mode 100644
index 0000000..cd705d6
--- /dev/null
+++ b/src/commands/studio/ModifyControlParameterCommand.h
@@ -0,0 +1,74 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_MODIFYCONTROLPARAMETERCOMMAND_H_
+#define _RG_MODIFYCONTROLPARAMETERCOMMAND_H_
+
+#include "base/ControlParameter.h"
+#include "base/Device.h"
+#include <kcommand.h>
+#include <qstring.h>
+#include <klocale.h>
+
+
+
+
+namespace Rosegarden
+{
+
+class Studio;
+
+
+class ModifyControlParameterCommand : public KNamedCommand
+{
+public:
+ ModifyControlParameterCommand(Studio *studio,
+ DeviceId device,
+ ControlParameter control,
+ int id):
+ KNamedCommand(getGlobalName()),
+ m_studio(studio),
+ m_device(device),
+ m_control(control),
+ m_id(id) { }
+ ~ModifyControlParameterCommand();
+
+ virtual void execute();
+ virtual void unexecute();
+
+ static QString getGlobalName() { return i18n("&Modify Control Parameter"); }
+
+protected:
+ Studio *m_studio;
+ DeviceId m_device;
+ ControlParameter m_control;
+ int m_id;
+ ControlParameter m_originalControl;
+
+};
+
+}
+
+#endif
diff --git a/src/commands/studio/ModifyDeviceCommand.cpp b/src/commands/studio/ModifyDeviceCommand.cpp
new file mode 100644
index 0000000..d3323ac
--- /dev/null
+++ b/src/commands/studio/ModifyDeviceCommand.cpp
@@ -0,0 +1,198 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "ModifyDeviceCommand.h"
+
+#include "base/Device.h"
+#include "base/MidiDevice.h"
+#include "base/Studio.h"
+#include <qstring.h>
+#include <iostream>
+
+
+namespace Rosegarden
+{
+
+ModifyDeviceCommand::ModifyDeviceCommand(
+ Studio *studio,
+ DeviceId device,
+ const std::string &name,
+ const std::string &librarianName,
+ const std::string &librarianEmail):
+ KNamedCommand(getGlobalName()),
+ m_studio(studio),
+ m_device(device),
+ m_name(name),
+ m_librarianName(librarianName),
+ m_librarianEmail(librarianEmail),
+ m_overwrite(true),
+ m_rename(true),
+ m_changeVariation(false),
+ m_changeBanks(false),
+ m_changePrograms(false),
+ m_changeControls(false),
+ m_changeKeyMappings(false),
+ m_clearBankAndProgramList(false)
+{}
+
+void ModifyDeviceCommand::setVariation(MidiDevice::VariationType variationType)
+{
+ m_variationType = variationType;
+ m_changeVariation = true;
+}
+
+void ModifyDeviceCommand::setBankList(const BankList &bankList)
+{
+ m_bankList = bankList;
+ m_changeBanks = true;
+}
+
+void ModifyDeviceCommand::setProgramList(const ProgramList &programList)
+{
+ m_programList = programList;
+ m_changePrograms = true;
+}
+
+void ModifyDeviceCommand::setControlList(const ControlList &controlList)
+{
+ m_controlList = controlList;
+ m_changeControls = true;
+}
+
+void ModifyDeviceCommand::setKeyMappingList(const KeyMappingList &keyMappingList)
+{
+ m_keyMappingList = keyMappingList;
+ m_changeKeyMappings = true;
+}
+
+void
+ModifyDeviceCommand::execute()
+{
+ Device *device = m_studio->getDevice(m_device);
+ MidiDevice *midiDevice =
+ dynamic_cast<MidiDevice *>(device);
+
+ if (device) {
+ if (!midiDevice) {
+ std::cerr << "ERROR: ModifyDeviceCommand::execute: device "
+ << m_device << " is not a MIDI device" << std::endl;
+ return ;
+ }
+ } else {
+ std::cerr
+ << "ERROR: ModifyDeviceCommand::execute: no such device as "
+ << m_device << std::endl;
+ return ;
+ }
+
+ m_oldName = midiDevice->getName();
+ m_oldBankList = midiDevice->getBanks();
+ m_oldProgramList = midiDevice->getPrograms();
+ m_oldControlList = midiDevice->getControlParameters();
+ m_oldKeyMappingList = midiDevice->getKeyMappings();
+ m_oldLibrarianName = midiDevice->getLibrarianName();
+ m_oldLibrarianEmail = midiDevice->getLibrarianEmail();
+ m_oldVariationType = midiDevice->getVariationType();
+
+ if (m_changeVariation)
+ midiDevice->setVariationType(m_variationType);
+
+ if (m_overwrite) {
+ if (m_clearBankAndProgramList) {
+ midiDevice->clearBankList();
+ midiDevice->clearProgramList();
+ } else {
+ if (m_changeBanks)
+ midiDevice->replaceBankList(m_bankList);
+ if (m_changePrograms)
+ midiDevice->replaceProgramList(m_programList);
+ }
+
+ if (m_changeKeyMappings) {
+ midiDevice->replaceKeyMappingList(m_keyMappingList);
+ }
+
+ if (m_rename)
+ midiDevice->setName(m_name);
+ midiDevice->setLibrarian(m_librarianName, m_librarianEmail);
+ } else {
+ if (m_clearBankAndProgramList) {
+ midiDevice->clearBankList();
+ midiDevice->clearProgramList();
+ } else {
+ if (m_changeBanks)
+ midiDevice->mergeBankList(m_bankList);
+ if (m_changePrograms)
+ midiDevice->mergeProgramList(m_programList);
+ }
+
+ if (m_changeKeyMappings) {
+ midiDevice->mergeKeyMappingList(m_keyMappingList);
+ }
+
+ if (m_rename) {
+ std::string mergeName = midiDevice->getName() +
+ std::string("/") + m_name;
+ midiDevice->setName(mergeName);
+ }
+ }
+
+ //!!! merge option?
+ if (m_changeControls)
+ midiDevice->replaceControlParameters(m_controlList);
+}
+
+void
+ModifyDeviceCommand::unexecute()
+{
+ Device *device = m_studio->getDevice(m_device);
+ MidiDevice *midiDevice =
+ dynamic_cast<MidiDevice *>(device);
+
+ if (device) {
+ if (!midiDevice) {
+ std::cerr << "ERROR: ModifyDeviceCommand::unexecute: device "
+ << m_device << " is not a MIDI device" << std::endl;
+ return ;
+ }
+ } else {
+ std::cerr
+ << "ERROR: ModifyDeviceCommand::unexecute: no such device as "
+ << m_device << std::endl;
+ return ;
+ }
+
+ if (m_rename)
+ midiDevice->setName(m_oldName);
+ midiDevice->replaceBankList(m_oldBankList);
+ midiDevice->replaceProgramList(m_oldProgramList);
+ midiDevice->replaceControlParameters(m_oldControlList);
+ midiDevice->replaceKeyMappingList(m_oldKeyMappingList);
+ midiDevice->setLibrarian(m_oldLibrarianName, m_oldLibrarianEmail);
+ if (m_changeVariation)
+ midiDevice->setVariationType(m_oldVariationType);
+}
+
+}
diff --git a/src/commands/studio/ModifyDeviceCommand.h b/src/commands/studio/ModifyDeviceCommand.h
new file mode 100644
index 0000000..f8f820e
--- /dev/null
+++ b/src/commands/studio/ModifyDeviceCommand.h
@@ -0,0 +1,109 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_MODIFYDEVICECOMMAND_H_
+#define _RG_MODIFYDEVICECOMMAND_H_
+
+#include "base/Device.h"
+#include "base/MidiDevice.h"
+#include <string>
+#include <kcommand.h>
+#include <qstring.h>
+#include <klocale.h>
+
+
+class Modify;
+
+
+namespace Rosegarden
+{
+
+class Studio;
+
+
+class ModifyDeviceCommand : public KNamedCommand
+{
+public:
+ // Any of the arguments passed by pointer may be null (except for
+ // the Studio) -- in which case they will not be changed in the device.
+ ModifyDeviceCommand(Studio *studio,
+ DeviceId device,
+ const std::string &name,
+ const std::string &librarianName,
+ const std::string &librarianEmail);
+
+ void setVariation (MidiDevice::VariationType variationType);
+ void setBankList (const BankList &bankList);
+ void setProgramList(const ProgramList &programList);
+ void setControlList(const ControlList &controlList);
+ void setKeyMappingList(const KeyMappingList &keyMappingList);
+ void setOverwrite (bool overwrite) { m_overwrite = overwrite; }
+ void setRename (bool rename) { m_rename = rename; }
+
+ /// supersedes setBankList() and setProgramList()
+ void clearBankAndProgramList() { m_clearBankAndProgramList = true; }
+
+ static QString getGlobalName() { return i18n("Modify &MIDI Bank"); }
+
+ virtual void execute();
+ virtual void unexecute();
+
+protected:
+
+ Studio *m_studio;
+ int m_device;
+ std::string m_name;
+ std::string m_librarianName;
+ std::string m_librarianEmail;
+ MidiDevice::VariationType m_variationType;
+ BankList m_bankList;
+ ProgramList m_programList;
+ ControlList m_controlList;
+ KeyMappingList m_keyMappingList;
+
+ std::string m_oldName;
+ std::string m_oldLibrarianName;
+ std::string m_oldLibrarianEmail;
+ MidiDevice::VariationType m_oldVariationType;
+ BankList m_oldBankList;
+ ProgramList m_oldProgramList;
+ ControlList m_oldControlList;
+ KeyMappingList m_oldKeyMappingList;
+
+ bool m_overwrite;
+ bool m_rename;
+ bool m_changeVariation;
+ bool m_changeBanks;
+ bool m_changePrograms;
+ bool m_changeControls;
+ bool m_changeKeyMappings;
+ bool m_clearBankAndProgramList;
+
+};
+
+
+}
+
+#endif
diff --git a/src/commands/studio/ModifyDeviceMappingCommand.cpp b/src/commands/studio/ModifyDeviceMappingCommand.cpp
new file mode 100644
index 0000000..6f02d8d
--- /dev/null
+++ b/src/commands/studio/ModifyDeviceMappingCommand.cpp
@@ -0,0 +1,147 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "ModifyDeviceMappingCommand.h"
+
+#include "misc/Debug.h"
+#include "base/Composition.h"
+#include "base/Device.h"
+#include "base/Instrument.h"
+#include "base/MidiProgram.h"
+#include "base/Studio.h"
+#include "base/Track.h"
+#include "document/RosegardenGUIDoc.h"
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+ModifyDeviceMappingCommand::ModifyDeviceMappingCommand(
+ RosegardenGUIDoc *doc,
+ DeviceId fromDevice,
+ DeviceId toDevice):
+ KNamedCommand(getGlobalName()),
+ m_composition(&doc->getComposition()),
+ m_studio(&doc->getStudio()),
+ m_fromDevice(fromDevice),
+ m_toDevice(toDevice)
+{}
+
+void
+ModifyDeviceMappingCommand::execute()
+{
+ Composition::trackcontainer &tracks =
+ m_composition->getTracks();
+ Composition::trackcontainer::iterator it = tracks.begin();
+ Instrument *instr = 0;
+ int index = 0;
+
+ for (; it != tracks.end(); it++) {
+ instr = m_studio->getInstrumentById(it->second->getInstrument());
+ if (!instr || !instr->getDevice())
+ continue;
+
+ if (instr->getDevice()->getId() == m_fromDevice) {
+ // if source and target are MIDI
+ if (m_studio->getDevice(m_fromDevice)->getType() ==
+ Device::Midi &&
+ m_studio->getDevice(m_toDevice)->getType() ==
+ Device::Midi) {
+ // Try to match channels on the target device
+ //
+ MidiByte channel = instr->getMidiChannel();
+
+ InstrumentList destList = m_studio->
+ getDevice(m_toDevice)->getPresentationInstruments();
+
+ InstrumentList::iterator dIt = destList.begin();
+
+ for (; dIt != destList.end(); dIt++) {
+ if ((*dIt)->getMidiChannel() == channel) {
+ break;
+ }
+ }
+
+ // Failure to match anything and there's no Instruments
+ // at all in the destination. Skip to next source Instrument.
+ //
+ if (dIt == destList.end() || destList.size() == 0)
+ continue;
+
+
+ RG_DEBUG << " Track " << it->first
+ << ", setting Instrument to "
+ << (*dIt)->getId() << endl;
+
+ // store "to" and "from" values
+ //
+ m_mapping.push_back(
+ std::pair < TrackId,
+ InstrumentId >
+ (it->first,
+ instr->getId()));
+
+ it->second->setInstrument((*dIt)->getId());
+ } else // audio is involved in the mapping - use indexes
+ {
+ // assign by index numbers
+ InstrumentList destList = m_studio->
+ getDevice(m_toDevice)->getPresentationInstruments();
+
+ // skip if we can't match
+ //
+ if (index > (int)(destList.size() - 1))
+ continue;
+
+ m_mapping.push_back(
+ std::pair < TrackId,
+ InstrumentId >
+ (it->first,
+ instr->getId()));
+
+ it->second->setInstrument(destList[index]->getId());
+ }
+
+ index++;
+ }
+ }
+
+}
+
+void
+ModifyDeviceMappingCommand::unexecute()
+{
+ std::vector<std::pair<TrackId, InstrumentId> >
+ ::iterator it = m_mapping.begin();
+ Track *track = 0;
+
+ for (; it != m_mapping.end(); it++) {
+ track = m_composition->getTrackById(it->first);
+ track->setInstrument(it->second);
+ }
+}
+
+}
diff --git a/src/commands/studio/ModifyDeviceMappingCommand.h b/src/commands/studio/ModifyDeviceMappingCommand.h
new file mode 100644
index 0000000..150275d
--- /dev/null
+++ b/src/commands/studio/ModifyDeviceMappingCommand.h
@@ -0,0 +1,71 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_MODIFYDEVICEMAPPINGCOMMAND_H_
+#define _RG_MODIFYDEVICEMAPPINGCOMMAND_H_
+
+#include "base/Device.h"
+#include "base/Track.h"
+#include <kcommand.h>
+#include <qstring.h>
+#include <vector>
+#include <klocale.h>
+
+
+class Modify;
+
+
+namespace Rosegarden
+{
+
+class Studio;
+class RosegardenGUIDoc;
+class Composition;
+
+
+class ModifyDeviceMappingCommand : public KNamedCommand
+{
+public:
+ ModifyDeviceMappingCommand(RosegardenGUIDoc *doc,
+ DeviceId fromDevice,
+ DeviceId toDevice);
+
+ static QString getGlobalName() { return i18n("Modify &Device Mapping"); }
+
+ virtual void execute();
+ virtual void unexecute();
+protected:
+ Composition *m_composition;
+ Studio *m_studio;
+ DeviceId m_fromDevice;
+ DeviceId m_toDevice;
+
+ std::vector<std::pair<TrackId, InstrumentId> > m_mapping;
+};
+
+
+}
+
+#endif
diff --git a/src/commands/studio/ModifyInstrumentMappingCommand.cpp b/src/commands/studio/ModifyInstrumentMappingCommand.cpp
new file mode 100644
index 0000000..e6369b6
--- /dev/null
+++ b/src/commands/studio/ModifyInstrumentMappingCommand.cpp
@@ -0,0 +1,78 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "ModifyInstrumentMappingCommand.h"
+
+#include "base/Composition.h"
+#include "base/MidiProgram.h"
+#include "base/Studio.h"
+#include "base/Track.h"
+#include "document/RosegardenGUIDoc.h"
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+ModifyInstrumentMappingCommand::ModifyInstrumentMappingCommand(
+ RosegardenGUIDoc *doc,
+ InstrumentId fromInstrument,
+ InstrumentId toInstrument):
+ KNamedCommand(getGlobalName()),
+ m_composition(&doc->getComposition()),
+ m_studio(&doc->getStudio()),
+ m_fromInstrument(fromInstrument),
+ m_toInstrument(toInstrument)
+{}
+
+void
+ModifyInstrumentMappingCommand::execute()
+{
+ Composition::trackcontainer &tracks =
+ m_composition->getTracks();
+ Composition::trackcontainer::iterator it = tracks.begin();
+
+ for (; it != tracks.end(); it++) {
+ if (it->second->getInstrument() == m_fromInstrument) {
+ m_mapping.push_back(it->first);
+ it->second->setInstrument(m_toInstrument);
+ }
+ }
+
+}
+
+void
+ModifyInstrumentMappingCommand::unexecute()
+{
+ std::vector<TrackId>::iterator it = m_mapping.begin();
+ Track *track = 0;
+
+ for (; it != m_mapping.end(); it++) {
+ track = m_composition->getTrackById(*it);
+ track->setInstrument(m_fromInstrument);
+ }
+}
+
+}
diff --git a/src/commands/studio/ModifyInstrumentMappingCommand.h b/src/commands/studio/ModifyInstrumentMappingCommand.h
new file mode 100644
index 0000000..224459b
--- /dev/null
+++ b/src/commands/studio/ModifyInstrumentMappingCommand.h
@@ -0,0 +1,76 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_MODIFYINSTRUMENTMAPPINGCOMMAND_H_
+#define _RG_MODIFYINSTRUMENTMAPPINGCOMMAND_H_
+
+#include "base/MidiProgram.h"
+#include "base/Track.h"
+#include <kcommand.h>
+#include <qstring.h>
+#include <vector>
+#include <klocale.h>
+
+
+class Modify;
+
+
+namespace Rosegarden
+{
+
+class Studio;
+class RosegardenGUIDoc;
+class Composition;
+
+
+class ModifyInstrumentMappingCommand : public KNamedCommand
+{
+public:
+ ModifyInstrumentMappingCommand(RosegardenGUIDoc *doc,
+ InstrumentId fromInstrument,
+ InstrumentId toInstrument);
+
+ static QString getGlobalName() { return i18n("Modify &Instrument Mapping"); }
+
+ virtual void execute();
+ virtual void unexecute();
+
+protected:
+ Composition *m_composition;
+ Studio *m_studio;
+ InstrumentId m_fromInstrument;
+ InstrumentId m_toInstrument;
+
+ std::vector<TrackId> m_mapping;
+
+};
+
+
+// because ModifyDeviceCommand is overkill for this
+
+
+}
+
+#endif
diff --git a/src/commands/studio/ReconnectDeviceCommand.cpp b/src/commands/studio/ReconnectDeviceCommand.cpp
new file mode 100644
index 0000000..6d40ede
--- /dev/null
+++ b/src/commands/studio/ReconnectDeviceCommand.cpp
@@ -0,0 +1,98 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "ReconnectDeviceCommand.h"
+
+#include "misc/Strings.h"
+#include "misc/Debug.h"
+#include "base/Device.h"
+#include "base/Studio.h"
+#include <qcstring.h>
+#include <qdatastream.h>
+#include <qstring.h>
+#include "gui/application/RosegardenApplication.h"
+
+
+namespace Rosegarden
+{
+
+void
+ReconnectDeviceCommand::execute()
+{
+ Device *device = m_studio->getDevice(m_deviceId);
+
+ if (device) {
+ m_oldConnection = device->getConnection();
+
+ QByteArray data;
+ QByteArray replyData;
+ QCString replyType;
+ QDataStream arg(data, IO_WriteOnly);
+
+ arg << (unsigned int)m_deviceId;
+ arg << strtoqstr(m_newConnection);
+
+ if (!rgapp->sequencerCall("setConnection(unsigned int, QString)",
+ replyType, replyData, data)) {
+ SEQMAN_DEBUG << "ReconnectDeviceCommand::execute - "
+ << "failure in sequencer setConnection" << endl;
+ return ;
+ }
+
+ SEQMAN_DEBUG << "ReconnectDeviceCommand::execute - "
+ << " reconnected device " << m_deviceId
+ << " to " << m_newConnection << endl;
+ }
+}
+
+void
+ReconnectDeviceCommand::unexecute()
+{
+ Device *device = m_studio->getDevice(m_deviceId);
+
+ if (device) {
+
+ QByteArray data;
+ QByteArray replyData;
+ QCString replyType;
+ QDataStream arg(data, IO_WriteOnly);
+
+ arg << (unsigned int)m_deviceId;
+ arg << strtoqstr(m_oldConnection);
+
+ if (!rgapp->sequencerCall("setConnection(unsigned int, QString)",
+ replyType, replyData, data)) {
+ SEQMAN_DEBUG << "ReconnectDeviceCommand::unexecute - "
+ << "failure in sequencer setConnection" << endl;
+ return ;
+ }
+
+ SEQMAN_DEBUG << "ReconnectDeviceCommand::unexecute - "
+ << " reconnected device " << m_deviceId
+ << " to " << m_oldConnection << endl;
+ }
+}
+
+}
diff --git a/src/commands/studio/ReconnectDeviceCommand.h b/src/commands/studio/ReconnectDeviceCommand.h
new file mode 100644
index 0000000..910bdbf
--- /dev/null
+++ b/src/commands/studio/ReconnectDeviceCommand.h
@@ -0,0 +1,70 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_RECONNECTDEVICECOMMAND_H_
+#define _RG_RECONNECTDEVICECOMMAND_H_
+
+#include "base/Device.h"
+#include <string>
+#include <kcommand.h>
+#include <qstring.h>
+#include <klocale.h>
+
+
+
+
+namespace Rosegarden
+{
+
+class Studio;
+
+
+class ReconnectDeviceCommand : public KNamedCommand
+{
+public:
+ ReconnectDeviceCommand(Studio *studio,
+ DeviceId deviceId,
+ std::string newConnection) :
+ KNamedCommand(getGlobalName()),
+ m_studio(studio),
+ m_deviceId(deviceId),
+ m_newConnection(newConnection) { }
+
+ static QString getGlobalName() { return i18n("Reconnect Device"); }
+
+ virtual void execute();
+ virtual void unexecute();
+
+protected:
+ Studio *m_studio;
+ DeviceId m_deviceId;
+ std::string m_newConnection;
+ std::string m_oldConnection;
+};
+
+
+}
+
+#endif
diff --git a/src/commands/studio/RemoveControlParameterCommand.cpp b/src/commands/studio/RemoveControlParameterCommand.cpp
new file mode 100644
index 0000000..5f596b5
--- /dev/null
+++ b/src/commands/studio/RemoveControlParameterCommand.cpp
@@ -0,0 +1,75 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "RemoveControlParameterCommand.h"
+
+#include "base/ControlParameter.h"
+#include "base/Device.h"
+#include "base/MidiDevice.h"
+#include "base/Studio.h"
+#include <qstring.h>
+#include <iostream>
+
+
+namespace Rosegarden
+{
+
+RemoveControlParameterCommand::~RemoveControlParameterCommand()
+{}
+
+void
+RemoveControlParameterCommand::execute()
+{
+ MidiDevice *md = dynamic_cast<MidiDevice *>
+ (m_studio->getDevice(m_device));
+ if (!md) {
+ std::cerr << "WARNING: RemoveControlParameterCommand::execute: device "
+ << m_device << " is not a MidiDevice in current studio"
+ << std::endl;
+ return ;
+ }
+
+ ControlParameter *param = md->getControlParameter(m_id);
+ if (param)
+ m_oldControl = *param;
+ md->removeControlParameter(m_id);
+}
+
+void
+RemoveControlParameterCommand::unexecute()
+{
+ MidiDevice *md = dynamic_cast<MidiDevice *>
+ (m_studio->getDevice(m_device));
+ if (!md) {
+ std::cerr << "WARNING: RemoveControlParameterCommand::execute: device "
+ << m_device << " is not a MidiDevice in current studio"
+ << std::endl;
+ return ;
+ }
+
+ md->addControlParameter(m_oldControl, m_id);
+}
+
+}
diff --git a/src/commands/studio/RemoveControlParameterCommand.h b/src/commands/studio/RemoveControlParameterCommand.h
new file mode 100644
index 0000000..3143739
--- /dev/null
+++ b/src/commands/studio/RemoveControlParameterCommand.h
@@ -0,0 +1,73 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_REMOVECONTROLPARAMETERCOMMAND_H_
+#define _RG_REMOVECONTROLPARAMETERCOMMAND_H_
+
+#include "base/ControlParameter.h"
+#include "base/Device.h"
+#include <kcommand.h>
+#include <qstring.h>
+#include <klocale.h>
+
+
+
+
+namespace Rosegarden
+{
+
+class Studio;
+
+
+class RemoveControlParameterCommand : public KNamedCommand
+{
+public:
+ RemoveControlParameterCommand(Studio *studio,
+ DeviceId device,
+ int id):
+ KNamedCommand(getGlobalName()),
+ m_studio(studio),
+ m_device(device),
+ m_id(id) { }
+
+ ~RemoveControlParameterCommand();
+
+ virtual void execute();
+ virtual void unexecute();
+
+ static QString getGlobalName() { return i18n("&Remove Control Parameter"); }
+
+protected:
+ Studio *m_studio;
+ DeviceId m_device;
+ int m_id;
+ ControlParameter m_oldControl;
+
+};
+
+
+}
+
+#endif
diff --git a/src/commands/studio/RenameDeviceCommand.cpp b/src/commands/studio/RenameDeviceCommand.cpp
new file mode 100644
index 0000000..1d6c382
--- /dev/null
+++ b/src/commands/studio/RenameDeviceCommand.cpp
@@ -0,0 +1,52 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "RenameDeviceCommand.h"
+
+#include "base/Device.h"
+#include "base/Studio.h"
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+void
+RenameDeviceCommand::execute()
+{
+ Device *device = m_studio->getDevice(m_deviceId);
+ if (m_oldName == "")
+ m_oldName = device->getName();
+ device->setName(m_name);
+}
+
+void
+RenameDeviceCommand::unexecute()
+{
+ Device *device = m_studio->getDevice(m_deviceId);
+ device->setName(m_oldName);
+}
+
+}
diff --git a/src/commands/studio/RenameDeviceCommand.h b/src/commands/studio/RenameDeviceCommand.h
new file mode 100644
index 0000000..d767bca
--- /dev/null
+++ b/src/commands/studio/RenameDeviceCommand.h
@@ -0,0 +1,71 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_RENAMEDEVICECOMMAND_H_
+#define _RG_RENAMEDEVICECOMMAND_H_
+
+#include "base/Device.h"
+#include <string>
+#include <kcommand.h>
+#include <qstring.h>
+#include <klocale.h>
+
+
+
+
+namespace Rosegarden
+{
+
+class Studio;
+
+
+class RenameDeviceCommand : public KNamedCommand
+{
+public:
+ RenameDeviceCommand(Studio *studio,
+ DeviceId deviceId,
+ std::string name) :
+ KNamedCommand(getGlobalName()),
+ m_studio(studio),
+ m_deviceId(deviceId),
+ m_name(name) { }
+
+ static QString getGlobalName() { return i18n("Rename Device"); }
+
+ virtual void execute();
+ virtual void unexecute();
+
+protected:
+ Studio *m_studio;
+ DeviceId m_deviceId;
+ std::string m_name;
+ std::string m_oldName;
+};
+
+
+
+}
+
+#endif
diff --git a/src/document/BasicCommand.cpp b/src/document/BasicCommand.cpp
new file mode 100644
index 0000000..db56564
--- /dev/null
+++ b/src/document/BasicCommand.cpp
@@ -0,0 +1,171 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "BasicCommand.h"
+
+#include "base/Segment.h"
+#include <qstring.h>
+
+namespace Rosegarden
+{
+
+BasicCommand::BasicCommand(const QString &name, Segment &segment,
+ timeT start, timeT end, bool bruteForceRedo) :
+ KNamedCommand(name),
+ m_startTime(calculateStartTime(start, segment)),
+ m_endTime(calculateEndTime(end, segment)),
+ m_segment(segment),
+ m_savedEvents(segment.getType(), m_startTime),
+ m_doBruteForceRedo(false),
+ m_redoEvents(0)
+{
+ if (m_endTime == m_startTime) ++m_endTime;
+
+ if (bruteForceRedo) {
+ m_redoEvents = new Segment(segment.getType(), m_startTime);
+ }
+}
+
+BasicCommand::~BasicCommand()
+{
+ m_savedEvents.clear();
+ if (m_redoEvents) m_redoEvents->clear();
+ delete m_redoEvents;
+}
+
+timeT
+BasicCommand::calculateStartTime(timeT given, Segment &segment)
+{
+ timeT actual = given;
+ Segment::iterator i = segment.findTime(given);
+
+ while (i != segment.end() && (*i)->getAbsoluteTime() == given) {
+ timeT notation = (*i)->getNotationAbsoluteTime();
+ if (notation < given) actual = notation;
+ ++i;
+ }
+
+ return actual;
+}
+
+timeT
+BasicCommand::calculateEndTime(timeT given, Segment &segment)
+{
+ timeT actual = given;
+ Segment::iterator i = segment.findTime(given);
+
+ while (i != segment.end() && (*i)->getAbsoluteTime() == given) {
+ timeT notation = (*i)->getNotationAbsoluteTime();
+ if (notation > given) actual = notation;
+ ++i;
+ }
+
+ return actual;
+}
+
+Rosegarden::Segment& BasicCommand::getSegment()
+{
+ return m_segment;
+}
+
+Rosegarden::timeT BasicCommand::getRelayoutEndTime()
+{
+ return getEndTime();
+}
+
+void
+BasicCommand::beginExecute()
+{
+ copyTo(&m_savedEvents);
+}
+
+void
+BasicCommand::execute()
+{
+ beginExecute();
+
+ if (!m_doBruteForceRedo) {
+
+ modifySegment();
+
+ } else {
+ copyFrom(m_redoEvents);
+ }
+
+ m_segment.updateRefreshStatuses(getStartTime(), getRelayoutEndTime());
+ RG_DEBUG << "BasicCommand(" << name() << "): updated refresh statuses "
+ << getStartTime() << " -> " << getRelayoutEndTime() << endl;
+}
+
+void
+BasicCommand::unexecute()
+{
+ if (m_redoEvents) {
+ copyTo(m_redoEvents);
+ m_doBruteForceRedo = true;
+ }
+
+ copyFrom(&m_savedEvents);
+
+ m_segment.updateRefreshStatuses(getStartTime(), getRelayoutEndTime());
+}
+
+void
+BasicCommand::copyTo(Rosegarden::Segment *events)
+{
+ RG_DEBUG << "BasicCommand(" << name() << ")::copyTo: " << &m_segment << " to "
+ << events << ", range ("
+ << m_startTime << "," << m_endTime
+ << ")" << endl;
+
+ Segment::iterator from = m_segment.findTime(m_startTime);
+ Segment::iterator to = m_segment.findTime(m_endTime);
+
+ for (Segment::iterator i = from; i != m_segment.end() && i != to; ++i) {
+// RG_DEBUG << "Found event of type " << (*i)->getType() << " and duration " << (*i)->getDuration() << endl;
+ events->insert(new Event(**i));
+ }
+}
+
+void
+BasicCommand::copyFrom(Rosegarden::Segment *events)
+{
+ RG_DEBUG << "BasicCommand(" << name() << ")::copyFrom: " << events << " to "
+ << &m_segment << ", range ("
+ << m_startTime << "," << m_endTime
+ << ")" << endl;
+
+ m_segment.erase(m_segment.findTime(m_startTime),
+ m_segment.findTime(m_endTime));
+
+ for (Segment::iterator i = events->begin(); i != events->end(); ++i) {
+// RG_DEBUG << "Found event of type " << (*i)->getType() << " and duration " << (*i)->getDuration() << endl;
+ m_segment.insert(new Event(**i));
+ }
+
+ events->clear();
+}
+
+}
diff --git a/src/document/BasicCommand.h b/src/document/BasicCommand.h
new file mode 100644
index 0000000..eab9ea0
--- /dev/null
+++ b/src/document/BasicCommand.h
@@ -0,0 +1,112 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_BASICCOMMAND_H_
+#define _RG_BASICCOMMAND_H_
+
+#include "base/Segment.h"
+#include <kcommand.h>
+#include "base/Event.h"
+#include "misc/Debug.h"
+
+class QString;
+
+
+namespace Rosegarden
+{
+
+
+
+/**
+ * BasicCommand is an abstract subclass of Command that manages undo,
+ * redo and notification of changes within a contiguous region of a
+ * single Rosegarden Segment, by brute force. When a subclass
+ * of BasicCommand executes, it stores a copy of the events that are
+ * modified by the command, ready to be restored verbatim on undo.
+ */
+
+class BasicCommand : public KNamedCommand
+{
+public:
+ virtual ~BasicCommand();
+
+ virtual void execute();
+ virtual void unexecute();
+
+ virtual Segment &getSegment();
+
+ timeT getStartTime() { return m_startTime; }
+ timeT getEndTime() { return m_endTime; }
+ virtual timeT getRelayoutEndTime();
+
+protected:
+ /**
+ * You should pass "bruteForceRedoRequired = true" if your
+ * subclass's implementation of modifySegment uses discrete
+ * event pointers or segment iterators to determine which
+ * events to modify, in which case it won't work when
+ * replayed for redo because the pointers may no longer be
+ * valid. In which case, BasicCommand will implement redo
+ * much like undo, and will only call your modifySegment
+ * the very first time the command object is executed.
+ *
+ * It is always safe to pass bruteForceRedoRequired true,
+ * it's just normally a waste of memory.
+ */
+ BasicCommand(const QString &name,
+ Segment &segment,
+ timeT start, timeT end,
+ bool bruteForceRedoRequired = false);
+
+ virtual void modifySegment() = 0;
+
+ virtual void beginExecute();
+
+private:
+ //--------------- Data members ---------------------------------
+
+ void copyTo(Segment *);
+ void copyFrom(Segment *);
+
+ timeT calculateStartTime(timeT given,
+ Segment &segment);
+ timeT calculateEndTime(timeT given,
+ Segment &segment);
+
+ timeT m_startTime;
+ timeT m_endTime;
+
+ Segment &m_segment;
+ Segment m_savedEvents;
+
+ bool m_doBruteForceRedo;
+ Segment *m_redoEvents;
+};
+
+
+
+}
+
+#endif
diff --git a/src/document/BasicSelectionCommand.cpp b/src/document/BasicSelectionCommand.cpp
new file mode 100644
index 0000000..2216223
--- /dev/null
+++ b/src/document/BasicSelectionCommand.cpp
@@ -0,0 +1,66 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "BasicSelectionCommand.h"
+
+#include "base/Segment.h"
+#include "base/Selection.h"
+#include "BasicCommand.h"
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+BasicSelectionCommand::BasicSelectionCommand(const QString &name,
+ EventSelection &selection,
+ bool bruteForceRedo) :
+ BasicCommand(name,
+ selection.getSegment(),
+ selection.getStartTime(),
+ selection.getEndTime(),
+ bruteForceRedo)
+{
+ // nothing
+}
+
+BasicSelectionCommand::BasicSelectionCommand(const QString &name,
+ Segment &segment,
+ bool bruteForceRedo) :
+ BasicCommand(name,
+ segment,
+ segment.getStartTime(),
+ segment.getEndMarkerTime(),
+ bruteForceRedo)
+{
+ // nothing
+}
+
+BasicSelectionCommand::~BasicSelectionCommand()
+{
+ // nothing
+}
+
+}
diff --git a/src/document/BasicSelectionCommand.h b/src/document/BasicSelectionCommand.h
new file mode 100644
index 0000000..825955d
--- /dev/null
+++ b/src/document/BasicSelectionCommand.h
@@ -0,0 +1,67 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_BASICSELECTIONCOMMAND_H_
+#define _RG_BASICSELECTIONCOMMAND_H_
+
+#include "BasicCommand.h"
+
+
+class QString;
+
+
+namespace Rosegarden
+{
+
+class Segment;
+class EventSelection;
+
+
+/**
+ * Subclass of BasicCommand that manages the brute-force undo and redo
+ * extends based on a given selection.
+ */
+
+class BasicSelectionCommand : public BasicCommand
+{
+public:
+ virtual ~BasicSelectionCommand();
+
+protected:
+ /// selection from segment
+ BasicSelectionCommand(const QString &name,
+ EventSelection &selection,
+ bool bruteForceRedoRequired = false);
+
+ /// entire segment
+ BasicSelectionCommand(const QString &name,
+ Segment &segment,
+ bool bruteForceRedoRequired = false);
+};
+
+
+}
+
+#endif
diff --git a/src/document/ConfigGroups.cpp b/src/document/ConfigGroups.cpp
new file mode 100644
index 0000000..8e164c3
--- /dev/null
+++ b/src/document/ConfigGroups.cpp
@@ -0,0 +1,53 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include "ConfigGroups.h"
+
+namespace Rosegarden
+{
+
+ //
+ // KConfig group names
+ //
+ const char* const GeneralOptionsConfigGroup = "General Options";
+ const char* const LatencyOptionsConfigGroup = "Latency Options";
+ const char* const SequencerOptionsConfigGroup = "Sequencer Options";
+ const char* const NotationViewConfigGroup = "Notation Options";
+ const char* const AudioManagerDialogConfigGroup = "AudioManagerDialog";
+ const char* const SynthPluginManagerConfigGroup = "Synth Plugin Manager";
+ const char* const BankEditorConfigGroup = "Bank Editor";
+ const char* const ColoursConfigGroup = "coloursconfiggroup";
+ const char* const ControlEditorConfigGroup = "Control Editor";
+ const char* const DeviceManagerConfigGroup = "Device Manager";
+ const char* const EventFilterDialogConfigGroup = "EventFilter Dialog";
+ const char* const EventViewLayoutConfigGroupName = "EventList Layout";
+ const char* const EventViewConfigGroup = "EventList Options";
+ const char* const MarkerEditorConfigGroup = "Marker Editor";
+ const char* const MatrixViewConfigGroup = "Matrix Options";
+ const char* const PlayListConfigGroup = "PLAY_LIST";
+ const char* const MainWindowConfigGroup = "MainView";
+ const char* const TransportDialogConfigGroup = "Transport Controls";
+ const char* const TempoViewLayoutConfigGroupName = "TempoView Layout";
+ const char* const TempoViewConfigGroup = "TempoView Options";
+ const char* const TriggerManagerConfigGroup = "Trigger Editor";
+ const char* const EditViewConfigGroup = "Edit View";
+
+}
diff --git a/src/document/ConfigGroups.h b/src/document/ConfigGroups.h
new file mode 100644
index 0000000..d960e4d
--- /dev/null
+++ b/src/document/ConfigGroups.h
@@ -0,0 +1,56 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+/**
+ * Miscellaneous constants
+ */
+
+
+#ifndef _CONSTANTS_H_
+#define _CONSTANTS_H_
+
+namespace Rosegarden
+{
+ extern const char* const GeneralOptionsConfigGroup;
+ extern const char* const LatencyOptionsConfigGroup;
+ extern const char* const SequencerOptionsConfigGroup;
+ extern const char* const NotationViewConfigGroup;
+ extern const char* const AudioManagerDialogConfigGroup;
+ extern const char* const SynthPluginManagerConfigGroup;
+ extern const char* const BankEditorConfigGroup;
+ extern const char* const ColoursConfigGroup;
+ extern const char* const ControlEditorConfigGroup;
+ extern const char* const DeviceManagerConfigGroup;
+ extern const char* const EventFilterDialogConfigGroup;
+ extern const char* const EventViewLayoutConfigGroupName;
+ extern const char* const EventViewConfigGroup;
+ extern const char* const MarkerEditorConfigGroup;
+ extern const char* const MatrixViewConfigGroup;
+ extern const char* const PlayListConfigGroup;
+ extern const char* const MainWindowConfigGroup;
+ extern const char* const TransportDialogConfigGroup;
+ extern const char* const TempoViewLayoutConfigGroupName;
+ extern const char* const TempoViewConfigGroup;
+ extern const char* const TriggerManagerConfigGroup;
+ extern const char* const EditViewConfigGroup;
+}
+
+#endif
diff --git a/src/document/MultiViewCommandHistory.cpp b/src/document/MultiViewCommandHistory.cpp
new file mode 100644
index 0000000..f8cddeb
--- /dev/null
+++ b/src/document/MultiViewCommandHistory.cpp
@@ -0,0 +1,386 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "MultiViewCommandHistory.h"
+
+#include <klocale.h>
+#include "misc/Debug.h"
+#include <kactioncollection.h>
+#include <kaction.h>
+#include <kcommand.h>
+#include <kstdaction.h>
+#include <qobject.h>
+#include <qpopupmenu.h>
+#include <qregexp.h>
+#include <qstring.h>
+#include <kpopupmenu.h>
+
+
+namespace Rosegarden
+{
+
+MultiViewCommandHistory::MultiViewCommandHistory() :
+ m_undoLimit(50),
+ m_redoLimit(50),
+ m_savedAt(0)
+{
+ // nothing
+}
+
+MultiViewCommandHistory::~MultiViewCommandHistory()
+{
+ m_savedAt = -1;
+ clearStack(m_undoStack);
+ clearStack(m_redoStack);
+}
+
+void
+MultiViewCommandHistory::clear()
+{
+ m_savedAt = -1;
+ clearStack(m_undoStack);
+ clearStack(m_redoStack);
+}
+
+void
+MultiViewCommandHistory::attachView(KActionCollection *collection)
+{
+ if (m_views.find(collection) != m_views.end())
+ return ;
+
+ RG_DEBUG << "MultiViewCommandHistory::attachView() : setting up undo/redo actions\n";
+
+ KToolBarPopupAction *undo = dynamic_cast<KToolBarPopupAction*>(collection->action(KStdAction::stdName(KStdAction::Undo)));
+
+ if (undo) {
+ connect(undo, SIGNAL(activated()),
+ this, SLOT(slotUndo()));
+
+ connect
+ (undo->popupMenu(),
+ SIGNAL(aboutToShow()),
+ this,
+ SLOT(slotUndoAboutToShow()));
+
+ connect
+ (undo->popupMenu(),
+ SIGNAL(activated(int)),
+ this,
+ SLOT(slotUndoActivated(int)));
+ }
+
+ KToolBarPopupAction *redo = dynamic_cast<KToolBarPopupAction*>(collection->action(KStdAction::stdName(KStdAction::Redo)));
+
+ if (redo) {
+
+ connect(redo, SIGNAL(activated()),
+ this, SLOT(slotRedo()));
+
+ connect
+ (redo->popupMenu(),
+ SIGNAL(aboutToShow()),
+ this,
+ SLOT(slotRedoAboutToShow()));
+
+ connect
+ (redo->popupMenu(),
+ SIGNAL(activated(int)),
+ this,
+ SLOT(slotRedoActivated(int)));
+ }
+
+ m_views.insert(collection);
+ updateButtons();
+
+}
+
+void
+MultiViewCommandHistory::detachView(KActionCollection *collection)
+{
+ ViewSet::iterator i = m_views.find(collection);
+ if (i != m_views.end())
+ m_views.erase(collection);
+}
+
+void
+MultiViewCommandHistory::addCommand(KCommand *command, bool execute)
+{
+ if (!command)
+ return ;
+
+ RG_DEBUG << "MultiViewCommandHistory::addCommand: " << command->name() << endl;
+
+ // We can't redo after adding a command
+ clearStack(m_redoStack);
+
+ // can we reach savedAt?
+ if ((int)m_undoStack.size() < m_savedAt)
+ m_savedAt = -1; // nope
+
+ m_undoStack.push(command);
+ clipCommands();
+
+ if (execute) {
+ command->execute();
+ emit commandExecuted();
+ emit commandExecuted(command);
+ }
+
+ updateButtons();
+}
+
+void
+MultiViewCommandHistory::slotUndo()
+{
+ if (m_undoStack.empty())
+ return ;
+
+ KCommand *command = m_undoStack.top();
+ command->unexecute();
+ emit commandExecuted();
+ emit commandExecuted(command);
+
+ m_redoStack.push(command);
+ m_undoStack.pop();
+
+ clipCommands();
+ updateButtons();
+
+ if ((int)m_undoStack.size() == m_savedAt)
+ emit documentRestored();
+}
+
+void
+MultiViewCommandHistory::slotRedo()
+{
+ if (m_redoStack.empty())
+ return ;
+
+ KCommand *command = m_redoStack.top();
+ command->execute();
+ emit commandExecuted();
+ emit commandExecuted(command);
+
+ m_undoStack.push(command);
+ m_redoStack.pop();
+ // no need to clip
+ updateButtons();
+}
+
+void
+MultiViewCommandHistory::setUndoLimit(int limit)
+{
+ if (limit > 0 && limit != m_undoLimit) {
+ m_undoLimit = limit;
+ clipCommands();
+ }
+}
+
+void
+MultiViewCommandHistory::setRedoLimit(int limit)
+{
+ if (limit > 0 && limit != m_redoLimit) {
+ m_redoLimit = limit;
+ clipCommands();
+ }
+}
+
+void
+MultiViewCommandHistory::documentSaved()
+{
+ m_savedAt = m_undoStack.size();
+}
+
+void
+MultiViewCommandHistory::clipCommands()
+{
+ if ((int)m_undoStack.size() > m_undoLimit) {
+ m_savedAt -= (m_undoStack.size() - m_undoLimit);
+ }
+
+ clipStack(m_undoStack, m_undoLimit);
+ clipStack(m_redoStack, m_redoLimit);
+}
+
+void
+MultiViewCommandHistory::clipStack(CommandStack &stack, int limit)
+{
+ int i;
+
+ if ((int)stack.size() > limit) {
+
+ CommandStack tempStack;
+ for (i = 0; i < limit; ++i) {
+ KCommand *togo = stack.top();
+ KNamedCommand *named = dynamic_cast<KNamedCommand *>(togo);
+ if (named) {
+ RG_DEBUG << "MVCH::clipStack: Saving recent command: " << named->name() << " at " << togo << endl;
+ } else {
+ RG_DEBUG << "MVCH::clipStack: Saving recent unnamed command" << " at " << togo << endl;
+ }
+ tempStack.push(stack.top());
+ stack.pop();
+ }
+ clearStack(stack);
+ for (i = 0; i < m_undoLimit; ++i) {
+ stack.push(tempStack.top());
+ tempStack.pop();
+ }
+ }
+}
+
+void
+MultiViewCommandHistory::clearStack(CommandStack &stack)
+{
+ while (!stack.empty()) {
+ KCommand *togo = stack.top();
+ KNamedCommand *named = dynamic_cast<KNamedCommand *>(togo);
+ if (named) {
+ RG_DEBUG << "MVCH::clearStack: About to delete command: " << named->name() << " at " << togo << endl;
+ } else {
+ RG_DEBUG << "MVCH::clearStack: About to delete unnamed command" << " at " << togo << endl;
+ }
+ delete togo;
+ stack.pop();
+ }
+}
+
+void
+MultiViewCommandHistory::slotUndoActivated(int pos)
+{
+ for (int i = 0 ; i <= pos; ++i)
+ slotUndo();
+}
+
+void
+MultiViewCommandHistory::slotRedoActivated(int pos)
+{
+ for (int i = 0 ; i <= pos; ++i)
+ slotRedo();
+}
+
+void
+MultiViewCommandHistory::slotUndoAboutToShow()
+{
+ updateMenu(true, KStdAction::stdName(KStdAction::Undo), m_undoStack);
+}
+
+void
+MultiViewCommandHistory::slotRedoAboutToShow()
+{
+ updateMenu(false, KStdAction::stdName(KStdAction::Redo), m_redoStack);
+}
+
+void
+MultiViewCommandHistory::updateButtons()
+{
+ updateButton(true, KStdAction::stdName(KStdAction::Undo), m_undoStack);
+ updateButton(false, KStdAction::stdName(KStdAction::Redo), m_redoStack);
+}
+
+void
+MultiViewCommandHistory::updateButton(bool undo,
+ const QString &name,
+ CommandStack &stack)
+{
+ for (ViewSet::iterator i = m_views.begin(); i != m_views.end(); ++i) {
+
+ KAction *action = (*i)->action(name);
+ if (!action)
+ continue;
+ QString text;
+
+ if (stack.empty()) {
+ action->setEnabled(false);
+ if (undo)
+ text = i18n("Nothing to undo");
+ else
+ text = i18n("Nothing to redo");
+ action->setText(text);
+ } else {
+ action->setEnabled(true);
+ QString commandName = stack.top()->name();
+ commandName.replace(QRegExp("&"), "");
+ commandName.replace(QRegExp("\\.\\.\\.$"), "");
+ if (undo)
+ text = i18n("Und&o %1").arg(commandName);
+ else
+ text = i18n("Re&do %1").arg(commandName);
+ action->setText(text);
+ }
+ }
+}
+
+void
+MultiViewCommandHistory::updateMenu(bool undo,
+ const QString &name,
+ CommandStack &stack)
+{
+ for (ViewSet::iterator i = m_views.begin(); i != m_views.end(); ++i) {
+
+ KAction *action = (*i)->action(name);
+ if (!action)
+ continue;
+
+ KToolBarPopupAction *popupAction =
+ dynamic_cast<KToolBarPopupAction *>(action);
+ if (!popupAction)
+ continue;
+
+ QPopupMenu *menu = popupAction->popupMenu();
+ if (!menu)
+ continue;
+ menu->clear();
+
+ CommandStack tempStack;
+ int j = 0;
+
+ while (j < 10 && !stack.empty()) {
+
+ KCommand *command = stack.top();
+ tempStack.push(command);
+ stack.pop();
+
+ QString commandName = command->name();
+ commandName.replace(QRegExp("&"), "");
+ commandName.replace(QRegExp("\\.\\.\\.$"), "");
+
+ QString text;
+ if (undo)
+ text = i18n("Und&o %1").arg(commandName);
+ else
+ text = i18n("Re&do %1").arg(commandName);
+ menu->insertItem(text, j++);
+ }
+
+ while (!tempStack.empty()) {
+ stack.push(tempStack.top());
+ tempStack.pop();
+ }
+ }
+}
+
+}
+#include "MultiViewCommandHistory.moc"
diff --git a/src/document/MultiViewCommandHistory.h b/src/document/MultiViewCommandHistory.h
new file mode 100644
index 0000000..d122d08
--- /dev/null
+++ b/src/document/MultiViewCommandHistory.h
@@ -0,0 +1,152 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_MULTIVIEWCOMMANDHISTORY_H_
+#define _RG_MULTIVIEWCOMMANDHISTORY_H_
+
+#include <set>
+#include <stack>
+#include <qobject.h>
+
+
+class QString;
+class KCommand;
+class KActionCollection;
+
+
+namespace Rosegarden
+{
+
+
+
+/**
+ * The MultiViewCommandHistory class is much like KCommandHistory in
+ * that it stores a list of executed commands and maintains Undo and
+ * Redo actions synchronised with those commands.
+ *
+ * The difference is that MultiViewCommandHistory allows you to
+ * associate more than one Undo and Redo action with the same command
+ * history, and it keeps them all up-to-date at once. This makes it
+ * effective in systems where multiple views may be editing the same
+ * data at once.
+ */
+
+class MultiViewCommandHistory : public QObject
+{
+ Q_OBJECT
+public:
+
+ MultiViewCommandHistory();
+ virtual ~MultiViewCommandHistory();
+
+ void clear();
+
+ void attachView(KActionCollection *collection);
+ void detachView(KActionCollection *collection);
+
+ void addCommand(KCommand *command, bool execute = true);
+
+ /// @return the maximum number of items in the undo history
+ int undoLimit() { return m_undoLimit; }
+
+ /// Set the maximum number of items in the undo history
+ void setUndoLimit(int limit);
+
+ /// @return the maximum number of items in the redo history
+ int redoLimit() { return m_redoLimit; }
+
+ /// Set the maximum number of items in the redo history
+ void setRedoLimit(int limit);
+
+public slots:
+ /**
+ * Remember when you saved the document.
+ * Call this right after saving the document. As soon as
+ * the history reaches the current index again (via some
+ * undo/redo operations) it will emit @ref documentRestored
+ * If you implemented undo/redo properly the document is
+ * the same you saved before.
+ */
+ virtual void documentSaved();
+
+protected slots:
+ void slotUndo();
+ void slotRedo();
+ void slotUndoAboutToShow();
+ void slotUndoActivated(int);
+ void slotRedoAboutToShow();
+ void slotRedoActivated(int);
+
+signals:
+ /**
+ * This is emitted every time a command is executed
+ * (whether by addCommand, undo or redo).
+ * You can use this to update the GUI, for instance.
+ */
+ void commandExecuted(KCommand *);
+
+ /**
+ * This is emitted every time a command is executed
+ * (whether by addCommand, undo or redo).
+ *
+ * It should be connected to the update() slot of widgets
+ * which need to repaint after a command
+ */
+ void commandExecuted();
+
+ /**
+ * This is emitted every time we reach the index where you
+ * saved the document for the last time. See @ref documentSaved
+ */
+ void documentRestored();
+
+private:
+ //--------------- Data members ---------------------------------
+
+ typedef std::set<KActionCollection *> ViewSet;
+ ViewSet m_views;
+
+ typedef std::stack<KCommand *> CommandStack;
+ CommandStack m_undoStack;
+ CommandStack m_redoStack;
+
+ int m_undoLimit;
+ int m_redoLimit;
+ int m_savedAt;
+
+ void updateButtons();
+ void updateButton(bool undo, const QString &name, CommandStack &stack);
+ void updateMenu(bool undo, const QString &name, CommandStack &stack);
+ void clipCommands();
+
+ void clipStack(CommandStack &stack, int limit);
+ void clearStack(CommandStack &stack);
+};
+
+
+
+}
+
+#endif
diff --git a/src/document/RoseXmlHandler.cpp b/src/document/RoseXmlHandler.cpp
new file mode 100644
index 0000000..028c89a
--- /dev/null
+++ b/src/document/RoseXmlHandler.cpp
@@ -0,0 +1,2368 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "RoseXmlHandler.h"
+
+#include "sound/Midi.h"
+#include <klocale.h>
+#include "misc/Debug.h"
+#include "misc/Strings.h"
+#include "base/AudioLevel.h"
+#include "base/AudioPluginInstance.h"
+#include "base/BaseProperties.h"
+#include "base/Colour.h"
+#include "base/ColourMap.h"
+#include "base/Composition.h"
+#include "base/ControlParameter.h"
+#include "base/Device.h"
+#include "base/Instrument.h"
+#include "base/Marker.h"
+#include "base/MidiDevice.h"
+#include "base/MidiProgram.h"
+#include "base/MidiTypes.h"
+#include "base/NotationTypes.h"
+#include "base/RealTime.h"
+#include "base/Segment.h"
+#include "base/Studio.h"
+#include "base/Track.h"
+#include "base/TriggerSegment.h"
+#include "gui/application/RosegardenGUIApp.h"
+#include "gui/application/RosegardenApplication.h"
+#include "gui/dialogs/FileLocateDialog.h"
+#include "gui/general/ProgressReporter.h"
+#include "gui/kdeext/KStartupLogo.h"
+#include "gui/studio/AudioPlugin.h"
+#include "gui/studio/AudioPluginManager.h"
+#include "gui/widgets/CurrentProgressDialog.h"
+#include "gui/widgets/ProgressDialog.h"
+#include "RosegardenGUIDoc.h"
+#include "sound/AudioFileManager.h"
+#include <kfiledialog.h>
+#include <kmessagebox.h>
+#include <qcstring.h>
+#include <qdatastream.h>
+#include <qdialog.h>
+#include <qfileinfo.h>
+#include <qstring.h>
+#include <qstringlist.h>
+#include "XmlStorableEvent.h"
+#include "XmlSubHandler.h"
+
+namespace Rosegarden
+{
+
+using namespace BaseProperties;
+
+class ConfigurationXmlSubHandler : public XmlSubHandler
+{
+public:
+ ConfigurationXmlSubHandler(const QString &elementName,
+ Rosegarden::Configuration *configuration);
+
+ virtual bool startElement(const QString& namespaceURI,
+ const QString& localName,
+ const QString& qName,
+ const QXmlAttributes& atts);
+
+ virtual bool endElement(const QString& namespaceURI,
+ const QString& localName,
+ const QString& qName,
+ bool& finished);
+
+ virtual bool characters(const QString& ch);
+
+ //--------------- Data members ---------------------------------
+
+ Rosegarden::Configuration *m_configuration;
+
+ QString m_elementName;
+ QString m_propertyName;
+ QString m_propertyType;
+};
+
+ConfigurationXmlSubHandler::ConfigurationXmlSubHandler(const QString &elementName,
+ Rosegarden::Configuration *configuration)
+ : m_configuration(configuration),
+ m_elementName(elementName)
+{
+}
+
+bool ConfigurationXmlSubHandler::startElement(const QString&, const QString&,
+ const QString& lcName,
+ const QXmlAttributes& atts)
+{
+ m_propertyName = lcName;
+ m_propertyType = atts.value("type");
+
+ if (m_propertyName == "property") {
+ // handle alternative encoding for properties with arbitrary names
+ m_propertyName = atts.value("name");
+ QString value = atts.value("value");
+ if (value) {
+ m_propertyType = "String";
+ m_configuration->set<String>(qstrtostr(m_propertyName),
+ qstrtostr(value));
+ }
+ }
+
+ return true;
+}
+
+bool ConfigurationXmlSubHandler::characters(const QString& chars)
+{
+ QString ch = chars.stripWhiteSpace();
+ // this method is also called on newlines - skip these cases
+ if (ch.isEmpty()) return true;
+
+
+ if (m_propertyType == "Int") {
+ long i = ch.toInt();
+ RG_DEBUG << "\"" << m_propertyName << "\" "
+ << "value = " << i << endl;
+ m_configuration->set<Int>(qstrtostr(m_propertyName), i);
+
+ return true;
+ }
+
+ if (m_propertyType == "RealTime") {
+ Rosegarden::RealTime rt;
+ int sepIdx = ch.find(',');
+
+ rt.sec = ch.left(sepIdx).toInt();
+ rt.nsec = ch.mid(sepIdx + 1).toInt();
+
+ RG_DEBUG << "\"" << m_propertyName << "\" "
+ << "sec = " << rt.sec << ", nsec = " << rt.nsec << endl;
+
+ m_configuration->set<Rosegarden::RealTimeT>(qstrtostr(m_propertyName), rt);
+
+ return true;
+ }
+
+ if (m_propertyType == "Bool") {
+ QString chLc = ch.lower();
+
+ bool b = (chLc == "true" ||
+ chLc == "1" ||
+ chLc == "on");
+
+ m_configuration->set<Rosegarden::Bool>(qstrtostr(m_propertyName), b);
+
+ return true;
+ }
+
+ if (!m_propertyType ||
+ m_propertyType == "String") {
+
+ m_configuration->set<Rosegarden::String>(qstrtostr(m_propertyName),
+ qstrtostr(ch));
+
+ return true;
+ }
+
+
+ return true;
+}
+
+bool
+ConfigurationXmlSubHandler::endElement(const QString&,
+ const QString&,
+ const QString& lcName,
+ bool& finished)
+{
+ m_propertyName = "";
+ m_propertyType = "";
+ finished = (lcName == m_elementName);
+ return true;
+}
+
+
+//----------------------------------------
+
+
+
+RoseXmlHandler::RoseXmlHandler(RosegardenGUIDoc *doc,
+ unsigned int elementCount,
+ bool createNewDevicesWhenNeeded)
+ : ProgressReporter(0),
+ m_doc(doc),
+ m_currentSegment(0),
+ m_currentEvent(0),
+ m_currentTime(0),
+ m_chordDuration(0),
+ m_segmentEndMarkerTime(0),
+ m_inChord(false),
+ m_inGroup(false),
+ m_inComposition(false),
+ m_groupId(0),
+ m_foundTempo(false),
+ m_section(NoSection),
+ m_device(0),
+ m_deviceRunningId(Device::NO_DEVICE),
+ m_msb(0),
+ m_lsb(0),
+ m_instrument(0),
+ m_plugin(0),
+ m_pluginInBuss(false),
+ m_colourMap(0),
+ m_keyMapping(0),
+ m_pluginId(0),
+ m_totalElements(elementCount),
+ m_elementsSoFar(0),
+ m_subHandler(0),
+ m_deprecation(false),
+ m_createDevices(createNewDevicesWhenNeeded),
+ m_haveControls(false),
+ m_cancelled(false),
+ m_skipAllAudio(false),
+ m_hasActiveAudio(false)
+{}
+
+RoseXmlHandler::~RoseXmlHandler()
+{
+ delete m_subHandler;
+}
+
+Composition &
+RoseXmlHandler::getComposition()
+{
+ return m_doc->getComposition();
+}
+
+Studio &
+RoseXmlHandler::getStudio()
+{
+ return m_doc->getStudio();
+}
+
+AudioFileManager &
+RoseXmlHandler::getAudioFileManager()
+{
+ return m_doc->getAudioFileManager();
+}
+
+AudioPluginManager *
+RoseXmlHandler::getAudioPluginManager()
+{
+ return m_doc->getPluginManager();
+}
+
+bool
+RoseXmlHandler::startDocument()
+{
+ // Clear tracks
+ //
+ getComposition().clearTracks();
+
+ // And the loop
+ //
+ getComposition().setLoopStart(0);
+ getComposition().setLoopEnd(0);
+
+ // All plugins
+ //
+ m_doc->clearAllPlugins();
+
+ // reset state
+ return true;
+}
+
+bool
+RoseXmlHandler::startElement(const QString& namespaceURI,
+ const QString& localName,
+ const QString& qName, const QXmlAttributes& atts)
+{
+ // First check if user pressed cancel button on the progress
+ // dialog
+ //
+ if (isOperationCancelled()) {
+ // Ideally, we'd throw here, but at this point Qt is in the stack
+ // and Qt is very often compiled without exception support.
+ //
+ m_cancelled = true;
+ return false;
+ }
+
+ QString lcName = qName.lower();
+
+ if (getSubHandler()) {
+ return getSubHandler()->startElement(namespaceURI, localName, lcName, atts);
+ }
+
+ if (lcName == "event") {
+
+ // RG_DEBUG << "RoseXmlHandler::startElement: found event, current time is " << m_currentTime << endl;
+
+ if (m_currentEvent) {
+ RG_DEBUG << "RoseXmlHandler::startElement: Warning: new event found at time " << m_currentTime << " before previous event has ended; previous event will be lost" << endl;
+ delete m_currentEvent;
+ }
+
+ m_currentEvent = new XmlStorableEvent(atts, m_currentTime);
+
+ if (m_currentEvent->has(BEAMED_GROUP_ID)) {
+
+ // remap -- we want to ensure that the segment's nextId
+ // is always used (and incremented) in preference to the
+ // stored id
+
+ if (!m_currentSegment) {
+ m_errorString = "Got grouped event outside of a segment";
+ return false;
+ }
+
+ long storedId = m_currentEvent->get
+ <Int>(BEAMED_GROUP_ID);
+
+ if (m_groupIdMap.find(storedId) == m_groupIdMap.end()) {
+ m_groupIdMap[storedId] = m_currentSegment->getNextId();
+ }
+
+ m_currentEvent->set
+ <Int>(BEAMED_GROUP_ID, m_groupIdMap[storedId]);
+
+ } else if (m_inGroup) {
+ m_currentEvent->set
+ <Int>(BEAMED_GROUP_ID, m_groupId);
+ m_currentEvent->set
+ <String>(BEAMED_GROUP_TYPE, m_groupType);
+ if (m_groupType == GROUP_TYPE_TUPLED) {
+ m_currentEvent->set
+ <Int>
+ (BEAMED_GROUP_TUPLET_BASE, m_groupTupletBase);
+ m_currentEvent->set
+ <Int>
+ (BEAMED_GROUP_TUPLED_COUNT, m_groupTupledCount);
+ m_currentEvent->set
+ <Int>
+ (BEAMED_GROUP_UNTUPLED_COUNT, m_groupUntupledCount);
+ }
+ }
+
+ timeT duration = m_currentEvent->getDuration();
+
+ if (!m_inChord) {
+
+ m_currentTime = m_currentEvent->getAbsoluteTime() + duration;
+
+ // RG_DEBUG << "RoseXmlHandler::startElement: (we're not in a chord) " << endl;
+
+ } else if (duration != 0) {
+
+ // set chord duration to the duration of the shortest
+ // element with a non-null duration (if no such elements,
+ // leave it as 0).
+
+ if (m_chordDuration == 0 || duration < m_chordDuration) {
+ m_chordDuration = duration;
+ }
+ }
+
+ } else if (lcName == "property") {
+
+ if (!m_currentEvent) {
+ RG_DEBUG << "RoseXmlHandler::startElement: Warning: Found property outside of event at time " << m_currentTime << ", ignoring" << endl;
+ } else {
+ m_currentEvent->setPropertyFromAttributes(atts, true);
+ }
+
+ } else if (lcName == "nproperty") {
+
+ if (!m_currentEvent) {
+ RG_DEBUG << "RoseXmlHandler::startElement: Warning: Found nproperty outside of event at time " << m_currentTime << ", ignoring" << endl;
+ } else {
+ m_currentEvent->setPropertyFromAttributes(atts, false);
+ }
+
+ } else if (lcName == "chord") {
+
+ m_inChord = true;
+
+ } else if (lcName == "group") {
+
+ if (!m_currentSegment) {
+ m_errorString = "Got group outside of a segment";
+ return false;
+ }
+
+ if (!m_deprecation)
+ std::cerr << "WARNING: This Rosegarden file uses the deprecated element \"group\". We recommend re-saving the file from this version of Rosegarden to assure your ability to re-load it in future versions" << std::endl;
+ m_deprecation = true;
+
+ m_inGroup = true;
+ m_groupId = m_currentSegment->getNextId();
+ m_groupType = qstrtostr(atts.value("type"));
+
+ if (m_groupType == GROUP_TYPE_TUPLED) {
+ m_groupTupletBase = atts.value("base").toInt();
+ m_groupTupledCount = atts.value("tupled").toInt();
+ m_groupUntupledCount = atts.value("untupled").toInt();
+ }
+
+ } else if (lcName == "rosegarden-data") {
+
+ // FILE FORMAT VERSIONING -- see comments in
+ // rosegardenguidoc.cpp. We only care about major and minor
+ // here, not point.
+
+ QString version = atts.value("version");
+ QString smajor = atts.value("format-version-major");
+ QString sminor = atts.value("format-version-minor");
+
+// std::cerr << "\n\n\nRosegarden file version = \"" << version << "\"\n\n\n" << std::endl;
+
+ if (smajor) {
+
+ int major = smajor.toInt();
+ int minor = sminor.toInt();
+
+ if (major > RosegardenGUIDoc::FILE_FORMAT_VERSION_MAJOR) {
+ m_errorString = i18n("This file was written by Rosegarden %1, and it uses\na different file format that cannot be read by this version.").arg(version);
+ return false;
+ }
+
+ if (major == RosegardenGUIDoc::FILE_FORMAT_VERSION_MAJOR &&
+ minor > RosegardenGUIDoc::FILE_FORMAT_VERSION_MINOR) {
+
+ CurrentProgressDialog::freeze();
+ KStartupLogo::hideIfStillThere();
+
+ KMessageBox::information(0, i18n("This file was written by Rosegarden %1, which is more recent than this version.\nThere may be some incompatibilities with the file format.").arg(version));
+
+ CurrentProgressDialog::thaw();
+ }
+ }
+
+ } else if (lcName == "studio") {
+
+ if (m_section != NoSection) {
+ m_errorString = "Found Studio in another section";
+ return false;
+ }
+
+ // In the Studio we clear down everything apart from Devices and
+ // Instruments before we reload. Instruments are derived from
+ // the Sequencer, the bank/program information is loaded from
+ // the file we're currently examining.
+ //
+ getStudio().clearMidiBanksAndPrograms();
+ getStudio().clearBusses();
+ getStudio().clearRecordIns();
+
+ m_section = InStudio; // set top level section
+
+ // Get and set MIDI filters
+ //
+ QString thruStr = atts.value("thrufilter");
+
+ if (thruStr)
+ getStudio().setMIDIThruFilter(thruStr.toInt());
+
+ QString recordStr = atts.value("recordfilter");
+
+ if (recordStr)
+ getStudio().setMIDIRecordFilter(recordStr.toInt());
+
+ QString inputStr = atts.value("audioinputpairs");
+
+ if (inputStr) {
+ int inputs = inputStr.toInt();
+ if (inputs < 1)
+ inputs = 1; // we simply don't permit no inputs
+ while (int(getStudio().getRecordIns().size()) < inputs) {
+ getStudio().addRecordIn(new RecordIn());
+ }
+ }
+
+ QString mixerStr = atts.value("mixerdisplayoptions");
+
+ if (mixerStr) {
+ unsigned int mixer = mixerStr.toUInt();
+ getStudio().setMixerDisplayOptions(mixer);
+ }
+
+ QString metronomeStr = atts.value("metronomedevice");
+
+ if (metronomeStr) {
+ DeviceId metronome = metronomeStr.toUInt();
+ getStudio().setMetronomeDevice(metronome);
+ }
+
+ } else if (lcName == "timesignature") {
+
+ if (m_inComposition == false) {
+ m_errorString = "TimeSignature object found outside Composition";
+ return false;
+ }
+
+ timeT t = 0;
+ QString timeStr = atts.value("time");
+ if (timeStr)
+ t = timeStr.toInt();
+
+ int num = 4;
+ QString numStr = atts.value("numerator");
+ if (numStr)
+ num = numStr.toInt();
+
+ int denom = 4;
+ QString denomStr = atts.value("denominator");
+ if (denomStr)
+ denom = denomStr.toInt();
+
+ bool common = false;
+ QString commonStr = atts.value("common");
+ if (commonStr)
+ common = (commonStr == "true");
+
+ bool hidden = false;
+ QString hiddenStr = atts.value("hidden");
+ if (hiddenStr)
+ hidden = (hiddenStr == "true");
+
+ bool hiddenBars = false;
+ QString hiddenBarsStr = atts.value("hiddenbars");
+ if (hiddenBarsStr)
+ hiddenBars = (hiddenBarsStr == "true");
+
+ getComposition().addTimeSignature
+ (t, TimeSignature(num, denom, common, hidden, hiddenBars));
+
+ } else if (lcName == "tempo") {
+
+ timeT t = 0;
+ QString timeStr = atts.value("time");
+ if (timeStr)
+ t = timeStr.toInt();
+
+ tempoT tempo = Composition::getTempoForQpm(120.0);
+ QString tempoStr = atts.value("tempo");
+ QString targetStr = atts.value("target");
+ QString bphStr = atts.value("bph");
+ if (tempoStr) {
+ tempo = tempoStr.toInt();
+ } else if (bphStr) {
+ tempo = Composition::getTempoForQpm
+ (double(bphStr.toInt()) / 60.0);
+ }
+
+ if (targetStr) {
+ getComposition().addTempoAtTime(t, tempo, targetStr.toInt());
+ } else {
+ getComposition().addTempoAtTime(t, tempo);
+ }
+
+ } else if (lcName == "composition") {
+
+ if (m_section != NoSection) {
+ m_errorString = "Found Composition in another section";
+ return false;
+ }
+
+ // set Segment
+ m_section = InComposition;
+
+ // Get and set the record track
+ //
+ QString recordStr = atts.value("recordtrack");
+ if (recordStr) {
+ getComposition().setTrackRecording(recordStr.toInt(), true);
+ }
+
+ QString recordPlStr = atts.value("recordtracks");
+ if (recordPlStr) {
+ RG_DEBUG << "Record tracks: " << recordPlStr << endl;
+ QStringList recordList = QStringList::split(',', recordPlStr);
+ for (QStringList::iterator i = recordList.begin();
+ i != recordList.end(); ++i) {
+ RG_DEBUG << "Record track: " << (*i).toInt() << endl;
+ getComposition().setTrackRecording((*i).toInt(), true);
+ }
+ }
+
+ // Get and set the position pointer
+ //
+ int position = 0;
+ QString positionStr = atts.value("pointer");
+ if (positionStr) {
+ position = positionStr.toInt();
+ }
+
+ getComposition().setPosition(position);
+
+
+ // Get and (eventually) set the default tempo.
+ // We prefer the new compositionDefaultTempo over the
+ // older defaultTempo.
+ //
+ QString tempoStr = atts.value("compositionDefaultTempo");
+ if (tempoStr) {
+ tempoT tempo = tempoT(tempoStr.toInt());
+ getComposition().setCompositionDefaultTempo(tempo);
+ } else {
+ tempoStr = atts.value("defaultTempo");
+ if (tempoStr) {
+ double tempo = qstrtodouble(tempoStr);
+ getComposition().setCompositionDefaultTempo
+ (Composition::getTempoForQpm(tempo));
+ }
+ }
+
+ // set the composition flag
+ m_inComposition = true;
+
+
+ // Set the loop
+ //
+ QString loopStartStr = atts.value("loopstart");
+ QString loopEndStr = atts.value("loopend");
+
+ if (loopStartStr && loopEndStr) {
+ int loopStart = loopStartStr.toInt();
+ int loopEnd = loopEndStr.toInt();
+
+ getComposition().setLoopStart(loopStart);
+ getComposition().setLoopEnd(loopEnd);
+ }
+
+ QString selectedTrackStr = atts.value("selected");
+
+ if (selectedTrackStr) {
+ TrackId selectedTrack =
+ (TrackId)selectedTrackStr.toInt();
+
+ getComposition().setSelectedTrack(selectedTrack);
+ }
+
+ QString soloTrackStr = atts.value("solo");
+ if (soloTrackStr) {
+ if (soloTrackStr.toInt() == 1)
+ getComposition().setSolo(true);
+ else
+ getComposition().setSolo(false);
+ }
+
+
+ QString playMetStr = atts.value("playmetronome");
+ if (playMetStr) {
+ if (playMetStr.toInt())
+ getComposition().setPlayMetronome(true);
+ else
+ getComposition().setPlayMetronome(false);
+ }
+
+ QString recMetStr = atts.value("recordmetronome");
+ if (recMetStr) {
+ if (recMetStr.toInt())
+ getComposition().setRecordMetronome(true);
+ else
+ getComposition().setRecordMetronome(false);
+ }
+
+ QString nextTriggerIdStr = atts.value("nexttriggerid");
+ if (nextTriggerIdStr) {
+ getComposition().setNextTriggerSegmentId(nextTriggerIdStr.toInt());
+ }
+
+ QString copyrightStr = atts.value("copyright");
+ if (copyrightStr) {
+ getComposition().setCopyrightNote(qstrtostr(copyrightStr));
+ }
+
+ QString startMarkerStr = atts.value("startMarker");
+ QString endMarkerStr = atts.value("endMarker");
+
+ if (startMarkerStr) {
+ getComposition().setStartMarker(startMarkerStr.toInt());
+ }
+
+ if (endMarkerStr) {
+ getComposition().setEndMarker(endMarkerStr.toInt());
+ }
+
+ } else if (lcName == "track") {
+
+ if (m_section != InComposition) {
+ m_errorString = "Track object found outside Composition";
+ return false;
+ }
+
+ int id = -1;
+ int position = -1;
+ int instrument = -1;
+ std::string label;
+ bool muted = false;
+
+ QString trackNbStr = atts.value("id");
+ if (trackNbStr) {
+ id = trackNbStr.toInt();
+ }
+
+ QString labelStr = atts.value("label");
+ if (labelStr) {
+ label = qstrtostr(labelStr);
+ }
+
+ QString mutedStr = atts.value("muted");
+ if (mutedStr) {
+ if (mutedStr == "true")
+ muted = true;
+ else
+ muted = false;
+ }
+
+ QString positionStr = atts.value("position");
+ if (positionStr) {
+ position = positionStr.toInt();
+ }
+
+ QString instrumentStr = atts.value("instrument");
+ if (instrumentStr) {
+ instrument = instrumentStr.toInt();
+ }
+
+ Track *track = new Track(id,
+ instrument,
+ position,
+ label,
+ muted);
+
+ // track properties affecting newly created segments are initialized
+ // to default values in the ctor, so they don't need to be initialized
+ // here
+
+ QString presetLabelStr = atts.value("defaultLabel");
+ if (labelStr) {
+ track->setPresetLabel(presetLabelStr);
+ }
+
+ QString clefStr = atts.value("defaultClef");
+ if (clefStr) {
+ track->setClef(clefStr.toInt());
+ }
+
+ QString transposeStr = atts.value("defaultTranspose");
+ if (transposeStr) {
+ track->setTranspose(transposeStr.toInt());
+ }
+
+ QString colorStr = atts.value("defaultColour");
+ if (colorStr) {
+ track->setColor(colorStr.toInt());
+ }
+
+ QString highplayStr = atts.value("defaultHighestPlayable");
+ if (highplayStr) {
+ track->setHighestPlayable(highplayStr.toInt());
+ }
+
+ QString lowplayStr = atts.value("defaultLowestPlayable");
+ if (lowplayStr) {
+ track->setLowestPlayable(lowplayStr.toInt());
+ }
+
+ QString staffSizeStr = atts.value("staffSize");
+ if (staffSizeStr) {
+ track->setStaffSize(staffSizeStr.toInt());
+ }
+
+ QString staffBracketStr = atts.value("staffBracket");
+ if (staffBracketStr) {
+ track->setStaffBracket(staffBracketStr.toInt());
+ }
+
+ getComposition().addTrack(track);
+
+
+ } else if (lcName == "segment") {
+
+ if (m_section != NoSection) {
+ m_errorString = "Found Segment in another section";
+ return false;
+ }
+
+ // set Segment
+ m_section = InSegment;
+
+ int track = -1, startTime = 0;
+ unsigned int colourindex = 0;
+ QString trackNbStr = atts.value("track");
+ if (trackNbStr) {
+ track = trackNbStr.toInt();
+ }
+
+ QString startIdxStr = atts.value("start");
+ if (startIdxStr) {
+ startTime = startIdxStr.toInt();
+ }
+
+ QString segmentType = (atts.value("type")).lower();
+ if (segmentType) {
+ if (segmentType == "audio") {
+ int audioFileId = atts.value("file").toInt();
+
+ // check this file id exists on the AudioFileManager
+
+ if (getAudioFileManager().fileExists(audioFileId) == false) {
+ // We don't report an error as this audio file might've
+ // been excluded deliberately as we could't actually
+ // find the audio file itself.
+ //
+ return true;
+ }
+
+ // Create an Audio segment and add its reference
+ //
+ m_currentSegment = new Segment(Segment::Audio);
+ m_currentSegment->setAudioFileId(audioFileId);
+ m_currentSegment->setStartTime(startTime);
+ } else {
+ // Create a (normal) internal Segment
+ m_currentSegment = new Segment(Segment::Internal);
+ }
+
+ } else {
+ // for the moment we default
+ m_currentSegment = new Segment(Segment::Internal);
+ }
+
+ QString repeatStr = atts.value("repeat");
+ if (repeatStr.lower() == "true") {
+ m_currentSegment->setRepeating(true);
+ }
+
+ QString delayStr = atts.value("delay");
+ if (delayStr) {
+ RG_DEBUG << "Delay string is \"" << delayStr << "\"" << endl;
+ long delay = delayStr.toLong();
+ RG_DEBUG << "Delay is " << delay << endl;
+ m_currentSegment->setDelay(delay);
+ }
+
+ QString rtDelaynSec = atts.value("rtdelaynsec");
+ QString rtDelayuSec = atts.value("rtdelayusec");
+ QString rtDelaySec = atts.value("rtdelaysec");
+ if (rtDelaySec && (rtDelaynSec || rtDelayuSec)) {
+ if (rtDelaynSec) {
+ m_currentSegment->setRealTimeDelay
+ (RealTime(rtDelaySec.toInt(),
+ rtDelaynSec.toInt()));
+ } else {
+ m_currentSegment->setRealTimeDelay
+ (RealTime(rtDelaySec.toInt(),
+ rtDelayuSec.toInt() * 1000));
+ }
+ }
+
+ QString transposeStr = atts.value("transpose");
+ if (transposeStr)
+ m_currentSegment->setTranspose(transposeStr.toInt());
+
+ // fill in the label
+ QString labelStr = atts.value("label");
+ if (labelStr)
+ m_currentSegment->setLabel(qstrtostr(labelStr));
+
+ m_currentSegment->setTrack(track);
+ //m_currentSegment->setStartTime(startTime);
+
+ QString colourIndStr = atts.value("colourindex");
+ if (colourIndStr) {
+ colourindex = colourIndStr.toInt();
+ }
+
+ m_currentSegment->setColourIndex(colourindex);
+
+ QString snapGridSizeStr = atts.value("snapgridsize");
+ if (snapGridSizeStr) {
+ m_currentSegment->setSnapGridSize(snapGridSizeStr.toInt());
+ }
+
+ QString viewFeaturesStr = atts.value("viewfeatures");
+ if (viewFeaturesStr) {
+ m_currentSegment->setViewFeatures(viewFeaturesStr.toInt());
+ }
+
+ m_currentTime = startTime;
+
+ QString triggerIdStr = atts.value("triggerid");
+ QString triggerPitchStr = atts.value("triggerbasepitch");
+ QString triggerVelocityStr = atts.value("triggerbasevelocity");
+ QString triggerRetuneStr = atts.value("triggerretune");
+ QString triggerAdjustTimeStr = atts.value("triggeradjusttimes");
+
+ if (triggerIdStr) {
+ int pitch = -1;
+ if (triggerPitchStr)
+ pitch = triggerPitchStr.toInt();
+ int velocity = -1;
+ if (triggerVelocityStr)
+ velocity = triggerVelocityStr.toInt();
+ TriggerSegmentRec *rec =
+ getComposition().addTriggerSegment(m_currentSegment,
+ triggerIdStr.toInt(),
+ pitch, velocity);
+ if (rec) {
+ if (triggerRetuneStr)
+ rec->setDefaultRetune(triggerRetuneStr.lower() == "true");
+ if (triggerAdjustTimeStr)
+ rec->setDefaultTimeAdjust(qstrtostr(triggerAdjustTimeStr));
+ }
+ m_currentSegment->setStartTimeDataMember(startTime);
+ } else {
+ getComposition().addSegment(m_currentSegment);
+ getComposition().setSegmentStartTime(m_currentSegment, startTime);
+ }
+
+ QString endMarkerStr = atts.value("endmarker");
+ if (endMarkerStr) {
+ delete m_segmentEndMarkerTime;
+ m_segmentEndMarkerTime = new timeT(endMarkerStr.toInt());
+ }
+
+ m_groupIdMap.clear();
+
+ } else if (lcName == "gui") {
+
+ if (m_section != InSegment) {
+ m_errorString = "Found GUI element outside Segment";
+ return false;
+ }
+
+ } else if (lcName == "controller") {
+
+ if (m_section != InSegment) {
+ m_errorString = "Found Controller element outside Segment";
+ return false;
+ }
+
+ QString type = atts.value("type");
+ //RG_DEBUG << "RoseXmlHandler::startElement - controller type = " << type << endl;
+
+ if (type == strtoqstr(PitchBend::EventType))
+ m_currentSegment->addEventRuler(PitchBend::EventType);
+ else if (type == strtoqstr(Controller::EventType)) {
+ QString value = atts.value("value");
+
+ if (value != "")
+ m_currentSegment->addEventRuler(Controller::EventType, value.toInt());
+ }
+
+ } else if (lcName == "resync") {
+
+ if (!m_deprecation)
+ std::cerr << "WARNING: This Rosegarden file uses the deprecated element \"resync\". We recommend re-saving the file from this version of Rosegarden to assure your ability to re-load it in future versions" << std::endl;
+ m_deprecation = true;
+
+ QString time(atts.value("time"));
+ bool isNumeric;
+ int numTime = time.toInt(&isNumeric);
+ if (isNumeric)
+ m_currentTime = numTime;
+
+ } else if (lcName == "audio") {
+
+ if (m_section != InAudioFiles) {
+ m_errorString = "Audio object found outside Audio section";
+ return false;
+ }
+
+ if (m_skipAllAudio) {
+ std::cout << "SKIPPING audio file" << std::endl;
+ return true;
+ }
+
+ QString id(atts.value("id"));
+ QString file(atts.value("file"));
+ QString label(atts.value("label"));
+
+ if (id.isEmpty() || file.isEmpty() || label.isEmpty()) {
+ m_errorString = "Audio object has empty parameters";
+ return false;
+ }
+
+ m_hasActiveAudio = true;
+
+ // attempt to insert file into AudioFileManager
+ // (this checks the integrity of the file at the
+ // same time)
+ //
+ if (getAudioFileManager().insertFile(qstrtostr(label),
+ qstrtostr(file),
+ id.toInt()) == false) {
+ // Ok, now attempt to use the KFileDialog saved default
+ // value for the AudioPath.
+ //
+ QString thing;
+ KURL url = KFileDialog::getStartURL(QString(":WAVS"), thing);
+ getAudioFileManager().setAudioPath(url.path().latin1());
+
+ /*
+ RG_DEBUG << "ATTEMPTING TO FIND IN PATH = "
+ << url.path() << endl;
+ */
+
+ if (getAudioFileManager().
+ insertFile(qstrtostr(label),
+ qstrtostr(file), id.toInt()) == false) {
+
+ // Freeze the progress dialog
+ CurrentProgressDialog::freeze();
+
+ // Hide splash screen if present on startup
+ KStartupLogo::hideIfStillThere();
+
+ // Create a locate file dialog - give it the file name
+ // and the AudioFileManager path that we've already
+ // tried. If we manually locate the file then we reset
+ // the audiofilepath to the new value and see if this
+ // helps us locate the rest of the files.
+ //
+
+ QString newFilename = "";
+ QString newPath = "";
+
+ do {
+
+ FileLocateDialog fL((RosegardenGUIApp *)m_doc->parent(),
+ file,
+ QString(getAudioFileManager().getAudioPath().c_str()));
+ int result = fL.exec();
+
+ if (result == QDialog::Accepted) {
+ newFilename = fL.getFilename();
+ newPath = fL.getDirectory();
+ } else if (result == QDialog::Rejected) {
+ // just skip the file
+ break;
+ } else {
+ // don't process any more audio files
+ m_skipAllAudio = true;
+ CurrentProgressDialog::thaw();
+ return true;
+ }
+
+
+ } while (getAudioFileManager().insertFile(qstrtostr(label),
+ qstrtostr(newFilename),
+ id.toInt()) == false);
+
+ if (newPath != "") {
+ getAudioFileManager().setAudioPath(qstrtostr(newPath));
+ // Set a document post-modify flag
+ //m_doc->setModified(true);
+ }
+
+ getAudioFileManager().print();
+
+ // Restore progress dialog's normal state
+ CurrentProgressDialog::thaw();
+ } else {
+ // AudioPath is modified so set a document post modify flag
+ //
+ //m_doc->setModified(true);
+ }
+
+ }
+
+ } else if (lcName == "audiopath") {
+
+ if (m_section != InAudioFiles) {
+ m_errorString = "Audiopath object found outside AudioFiles section";
+ return false;
+ }
+
+ QString search(atts.value("value"));
+
+ if (search.isEmpty()) {
+ m_errorString = "Audiopath has no value";
+ return false;
+ }
+
+ if (!search.startsWith("/") && !search.startsWith("~")) {
+ QString docPath = m_doc->getAbsFilePath();
+ QString dirPath = QFileInfo(docPath).dirPath();
+ if (QFileInfo(dirPath).exists()) {
+ search = dirPath + "/" + search;
+ }
+ }
+
+ getAudioFileManager().setAudioPath(qstrtostr(search));
+
+ } else if (lcName == "begin") {
+
+ double marker = qstrtodouble(atts.value("index"));
+
+ if (!m_currentSegment) {
+ // Don't fail - as this segment could be defunct if we
+ // skipped loading the audio file
+ //
+ return true;
+ }
+
+ if (m_currentSegment->getType() != Segment::Audio) {
+ m_errorString = "Found audio begin index in non audio segment";
+ return false;
+ }
+
+ // convert to RealTime from float
+ int sec = (int)marker;
+ int usec = (int)((marker - ((double)sec)) * 1000000.0);
+ m_currentSegment->setAudioStartTime(RealTime(sec, usec * 1000));
+
+
+ } else if (lcName == "end") {
+
+ double marker = qstrtodouble(atts.value("index"));
+
+ if (!m_currentSegment) {
+ // Don't fail - as this segment could be defunct if we
+ // skipped loading the audio file
+ //
+ return true;
+ }
+
+ if (m_currentSegment->getType() != Segment::Audio) {
+ m_errorString = "found audio end index in non audio segment";
+ return false;
+ }
+
+ int sec = (int)marker;
+ int usec = (int)((marker - ((double)sec)) * 1000000.0);
+ RealTime markerTime(sec, usec * 1000);
+
+ if (markerTime < m_currentSegment->getAudioStartTime()) {
+ m_errorString = "Audio end index before audio start marker";
+ return false;
+ }
+
+ m_currentSegment->setAudioEndTime(markerTime);
+
+ // Ensure we set end time according to correct RealTime end of Segment
+ //
+ RealTime realEndTime = getComposition().
+ getElapsedRealTime(m_currentSegment->getStartTime()) +
+ m_currentSegment->getAudioEndTime() -
+ m_currentSegment->getAudioStartTime();
+
+ timeT absEnd = getComposition().getElapsedTimeForRealTime(realEndTime);
+ m_currentSegment->setEndTime(absEnd);
+
+ } else if (lcName == "fadein") {
+
+ if (!m_currentSegment) {
+ // Don't fail - as this segment could be defunct if we
+ // skipped loading the audio file
+ //
+ return true;
+ }
+
+ if (m_currentSegment->getType() != Segment::Audio) {
+ m_errorString = "found fade in time in non audio segment";
+ return false;
+ }
+
+ double marker = qstrtodouble(atts.value("time"));
+ int sec = (int)marker;
+ int usec = (int)((marker - ((double)sec)) * 1000000.0);
+ RealTime markerTime(sec, usec * 1000);
+
+ m_currentSegment->setFadeInTime(markerTime);
+ m_currentSegment->setAutoFade(true);
+
+
+ } else if (lcName == "fadeout") {
+
+ if (!m_currentSegment) {
+ // Don't fail - as this segment could be defunct if we
+ // skipped loading the audio file
+ //
+ return true;
+ }
+
+ if (m_currentSegment->getType() != Segment::Audio) {
+ m_errorString = "found fade out time in non audio segment";
+ return false;
+ }
+
+ double marker = qstrtodouble(atts.value("time"));
+ int sec = (int)marker;
+ int usec = (int)((marker - ((double)sec)) * 1000000.0);
+ RealTime markerTime(sec, usec * 1000);
+
+ m_currentSegment->setFadeOutTime(markerTime);
+ m_currentSegment->setAutoFade(true);
+
+ } else if (lcName == "device") {
+
+ if (m_section != InStudio) {
+ m_errorString = "Found Device outside Studio";
+ return false;
+ }
+
+ m_haveControls = false;
+
+ QString type = (atts.value("type")).lower();
+ QString idString = atts.value("id");
+ QString nameStr = atts.value("name");
+
+ if (idString.isNull()) {
+ m_errorString = "No ID on Device tag";
+ return false;
+ }
+ int id = idString.toInt();
+
+ if (type == "midi") {
+ QString direction = atts.value("direction").lower();
+
+ if (direction.isNull() ||
+ direction == "" ||
+ direction == "play") { // ignore inputs
+
+ // This will leave m_device set only if there is a
+ // valid play midi device to modify:
+ skipToNextPlayDevice();
+
+ if (m_device) {
+ if (nameStr && nameStr != "") {
+ m_device->setName(qstrtostr(nameStr));
+ }
+ } else if (nameStr && nameStr != "") {
+ addMIDIDevice(nameStr, m_createDevices); // also sets m_device
+ }
+ }
+
+ QString connection = atts.value("connection");
+ if (m_createDevices && m_device &&
+ !connection.isNull() && connection != "") {
+ setMIDIDeviceConnection(connection);
+ }
+
+ setMIDIDeviceName(nameStr);
+
+ QString vstr = atts.value("variation").lower();
+ MidiDevice::VariationType variation =
+ MidiDevice::NoVariations;
+ if (!vstr.isNull()) {
+ if (vstr == "lsb") {
+ variation = MidiDevice::VariationFromLSB;
+ } else if (vstr == "msb") {
+ variation = MidiDevice::VariationFromMSB;
+ } else if (vstr == "") {
+ variation = MidiDevice::NoVariations;
+ }
+ }
+ MidiDevice *md = dynamic_cast<MidiDevice *>
+ (m_device);
+ if (md) {
+ md->setVariationType(variation);
+ }
+ } else if (type == "softsynth") {
+ m_device = getStudio().getDevice(id);
+
+ if (m_device && m_device->getType() == Device::SoftSynth)
+ m_device->setName(qstrtostr(nameStr));
+ } else if (type == "audio") {
+ m_device = getStudio().getDevice(id);
+
+ if (m_device && m_device->getType() == Device::Audio)
+ m_device->setName(qstrtostr(nameStr));
+ } else {
+ m_errorString = "Found unknown Device type";
+ return false;
+ }
+
+ } else if (lcName == "librarian") {
+
+ // The contact details for the maintainer of the banks/programs
+ // information.
+ //
+ if (m_device && m_device->getType() == Device::Midi) {
+ QString name = atts.value("name");
+ QString email = atts.value("email");
+
+ dynamic_cast<MidiDevice*>(m_device)->
+ setLibrarian(qstrtostr(name), qstrtostr(email));
+ }
+
+ } else if (lcName == "bank") {
+
+ if (m_device) // only if we have a device
+ {
+ if (m_section != InStudio && m_section != InInstrument)
+ {
+ m_errorString = "Found Bank outside Studio or Instrument";
+ return false;
+ }
+
+ QString nameStr = atts.value("name");
+ m_percussion = (atts.value("percussion").lower() == "true");
+ m_msb = (atts.value("msb")).toInt();
+ m_lsb = (atts.value("lsb")).toInt();
+
+ // To actually create a bank
+ //
+ if (m_section == InStudio)
+ {
+ // Create a new bank
+ MidiBank bank(m_percussion,
+ m_msb,
+ m_lsb,
+ qstrtostr(nameStr));
+
+ if (m_device->getType() == Device::Midi) {
+ // Insert the bank
+ //
+ dynamic_cast<MidiDevice*>(m_device)->addBank(bank);
+ }
+ } else // otherwise we're referencing it in an instrument
+ if (m_section == InInstrument)
+ {
+ if (m_instrument) {
+ m_instrument->setPercussion(m_percussion);
+ m_instrument->setMSB(m_msb);
+ m_instrument->setLSB(m_lsb);
+ m_instrument->setSendBankSelect(true);
+ }
+ }
+ }
+
+ } else if (lcName == "program") {
+
+ if (m_device) // only if we have a device
+ {
+ if (m_section == InStudio)
+ {
+ QString nameStr = (atts.value("name"));
+ MidiByte pc = atts.value("id").toInt();
+ QString keyMappingStr = (atts.value("keymapping"));
+
+ // Create a new program
+ MidiProgram program
+ (MidiBank(m_percussion,
+ m_msb,
+ m_lsb),
+ pc,
+ qstrtostr(nameStr),
+ keyMappingStr ? qstrtostr(keyMappingStr) : "");
+
+ if (m_device->getType() == Device::Midi) {
+ // Insert the program
+ //
+ dynamic_cast<MidiDevice*>(m_device)->
+ addProgram(program);
+ }
+
+ } else if (m_section == InInstrument)
+ {
+ if (m_instrument) {
+ MidiByte id = atts.value("id").toInt();
+ m_instrument->setProgramChange(id);
+ m_instrument->setSendProgramChange(true);
+ }
+ } else
+ {
+ m_errorString = "Found Program outside Studio and Instrument";
+ return false;
+ }
+ }
+
+ } else if (lcName == "keymapping") {
+
+ if (m_section == InInstrument) {
+ RG_DEBUG << "Old-style keymapping in instrument found, ignoring" << endl;
+ } else {
+
+ if (m_section != InStudio) {
+ m_errorString = "Found Keymapping outside Studio";
+ return false;
+ }
+
+ if (m_device && (m_device->getType() == Device::Midi)) {
+ QString name = atts.value("name");
+ m_keyMapping = new MidiKeyMapping(qstrtostr(name));
+ m_keyNameMap.clear();
+ }
+ }
+
+ } else if (lcName == "key") {
+
+ if (m_keyMapping) {
+ QString numStr = atts.value("number");
+ QString namStr = atts.value("name");
+ if (numStr && namStr) {
+ m_keyNameMap[numStr.toInt()] = qstrtostr(namStr);
+ }
+ }
+
+ } else if (lcName == "controls") {
+
+ // Only clear down the controllers list if we have found some controllers in the RG file
+ //
+ if (m_device) {
+ dynamic_cast<MidiDevice*>(m_device)->clearControlList();
+ }
+
+ m_haveControls = true;
+
+ } else if (lcName == "control") {
+
+ if (m_section != InStudio) {
+ m_errorString = "Found ControlParameter outside Studio";
+ return false;
+ }
+
+ if (!m_device) {
+ //!!! ach no, we can't give this warning -- we might be in a <device> elt
+ // but have no sequencer support, for example. we need a separate m_inDevice
+ // flag
+ // m_deprecation = true;
+ // std::cerr << "WARNING: This Rosegarden file uses a deprecated control parameter structure. We recommend re-saving the file from this version of Rosegarden to assure your ability to re-load it in future versions" << std::endl;
+
+ } else if (m_device->getType() == Device::Midi) {
+
+ if (!m_haveControls) {
+ m_errorString = "Found ControlParameter outside Controls block";
+ return false;
+ }
+
+ QString name = atts.value("name");
+ QString type = atts.value("type");
+ QString descr = atts.value("description");
+ QString min = atts.value("min");
+ QString max = atts.value("max");
+ QString def = atts.value("default");
+ QString conVal = atts.value("controllervalue");
+ QString colour = atts.value("colourindex");
+ QString ipbPosition = atts.value("ipbposition");
+
+ ControlParameter con(qstrtostr(name),
+ qstrtostr(type),
+ qstrtostr(descr),
+ min.toInt(),
+ max.toInt(),
+ def.toInt(),
+ MidiByte(conVal.toInt()),
+ colour.toInt(),
+ ipbPosition.toInt());
+
+ dynamic_cast<MidiDevice*>(m_device)->
+ addControlParameter(con);
+ }
+
+ } else if (lcName == "reverb") { // deprecated but we still read 'em
+
+ if (!m_deprecation)
+ std::cerr << "WARNING: This Rosegarden file uses the deprecated element \"reverb\" (now replaced by a control parameter). We recommend re-saving the file from this version of Rosegarden to assure your ability to re-load it in future versions" << std::endl;
+ m_deprecation = true;
+
+ if (m_section != InInstrument) {
+ m_errorString = "Found Reverb outside Instrument";
+ return false;
+ }
+
+ MidiByte value = atts.value("value").toInt();
+
+ if (m_instrument)
+ m_instrument->setControllerValue(MIDI_CONTROLLER_REVERB, value);
+
+
+ } else if (lcName == "chorus") { // deprecated but we still read 'em
+
+ if (!m_deprecation)
+ std::cerr << "WARNING: This Rosegarden file uses the deprecated element \"chorus\" (now replaced by a control parameter). We recommend re-saving the file from this version of Rosegarden to assure your ability to re-load it in future versions" << std::endl;
+ m_deprecation = true;
+
+ if (m_section != InInstrument) {
+ m_errorString = "Found Chorus outside Instrument";
+ return false;
+ }
+
+ MidiByte value = atts.value("value").toInt();
+
+ if (m_instrument)
+ m_instrument->setControllerValue(MIDI_CONTROLLER_CHORUS, value);
+
+ } else if (lcName == "filter") { // deprecated but we still read 'em
+
+ if (!m_deprecation)
+ std::cerr << "WARNING: This Rosegarden file uses the deprecated element \"filter\" (now replaced by a control parameter). We recommend re-saving the file from this version of Rosegarden to assure your ability to re-load it in future versions" << std::endl;
+ m_deprecation = true;
+
+ if (m_section != InInstrument) {
+ m_errorString = "Found Filter outside Instrument";
+ return false;
+ }
+
+ MidiByte value = atts.value("value").toInt();
+
+ if (m_instrument)
+ m_instrument->setControllerValue(MIDI_CONTROLLER_FILTER, value);
+
+
+ } else if (lcName == "resonance") { // deprecated but we still read 'em
+
+ if (!m_deprecation)
+ std::cerr << "WARNING: This Rosegarden file uses the deprecated element \"resonance\" (now replaced by a control parameter). We recommend re-saving the file from this version of Rosegarden to assure your ability to re-load it in future versions" << std::endl;
+ m_deprecation = true;
+
+ if (m_section != InInstrument) {
+ m_errorString = "Found Resonance outside Instrument";
+ return false;
+ }
+
+ MidiByte value = atts.value("value").toInt();
+
+ if (m_instrument)
+ m_instrument->setControllerValue(MIDI_CONTROLLER_RESONANCE, value);
+
+
+ } else if (lcName == "attack") { // deprecated but we still read 'em
+
+ if (!m_deprecation)
+ std::cerr << "WARNING: This Rosegarden file uses the deprecated element \"attack\" (now replaced by a control parameter). We recommend re-saving the file from this version of Rosegarden to assure your ability to re-load it in future versions" << std::endl;
+ m_deprecation = true;
+
+ if (m_section != InInstrument) {
+ m_errorString = "Found Attack outside Instrument";
+ return false;
+ }
+
+ MidiByte value = atts.value("value").toInt();
+
+ if (m_instrument)
+ m_instrument->setControllerValue(MIDI_CONTROLLER_ATTACK, value);
+
+ } else if (lcName == "release") { // deprecated but we still read 'em
+
+ if (!m_deprecation)
+ std::cerr << "WARNING: This Rosegarden file uses the deprecated element \"release\" (now replaced by a control parameter). We recommend re-saving the file from this version of Rosegarden to assure your ability to re-load it in future versions" << std::endl;
+ m_deprecation = true;
+
+ if (m_section != InInstrument) {
+ m_errorString = "Found Release outside Instrument";
+ return false;
+ }
+
+ MidiByte value = atts.value("value").toInt();
+
+ if (m_instrument)
+ m_instrument->setControllerValue(MIDI_CONTROLLER_RELEASE, value);
+
+ } else if (lcName == "pan") {
+
+ if (m_section != InInstrument && m_section != InBuss) {
+ m_errorString = "Found Pan outside Instrument or Buss";
+ return false;
+ }
+
+ MidiByte value = atts.value("value").toInt();
+
+ if (m_section == InInstrument) {
+ if (m_instrument) {
+ m_instrument->setPan(value);
+ m_instrument->setSendPan(true);
+ }
+ } else if (m_section == InBuss) {
+ if (m_buss) {
+ m_buss->setPan(value);
+ }
+ }
+
+ // keep "velocity" so we're backwards compatible
+ } else if (lcName == "velocity" || lcName == "volume") {
+
+ if (lcName == "velocity") {
+ if (!m_deprecation)
+ std::cerr << "WARNING: This Rosegarden file uses the deprecated element \"velocity\" for an overall MIDI instrument level (now replaced by \"volume\"). We recommend re-saving the file from this version of Rosegarden to assure your ability to re-load it in future versions" << std::endl;
+ m_deprecation = true;
+ }
+
+ if (m_section != InInstrument) {
+ m_errorString = "Found Volume outside Instrument";
+ return false;
+ }
+
+ MidiByte value = atts.value("value").toInt();
+
+ if (m_instrument) {
+ if (m_instrument->getType() == Instrument::Audio ||
+ m_instrument->getType() == Instrument::SoftSynth) {
+ // Backward compatibility: "volume" was in a 0-127
+ // range and we now store "level" (float dB) instead.
+ // Note that we have no such compatibility for
+ // "recordLevel", whose range has changed silently.
+ if (!m_deprecation)
+ std::cerr << "WARNING: This Rosegarden file uses the deprecated element \"volume\" for an audio instrument (now replaced by \"level\"). We recommend re-saving the file from this version of Rosegarden to assure your ability to re-load it in future versions" << std::endl;
+ m_deprecation = true;
+ m_instrument->setLevel
+ (AudioLevel::multiplier_to_dB(float(value) / 100.0));
+ } else {
+ m_instrument->setVolume(value);
+ m_instrument->setSendVolume(true);
+ }
+ }
+
+ } else if (lcName == "level") {
+
+ if (m_section != InBuss &&
+ (m_section != InInstrument ||
+ (m_instrument &&
+ m_instrument->getType() != Instrument::Audio &&
+ m_instrument->getType() != Instrument::SoftSynth))) {
+ m_errorString = "Found Level outside (audio) Instrument or Buss";
+ return false;
+ }
+
+ double value = qstrtodouble(atts.value("value"));
+
+ if (m_section == InBuss) {
+ if (m_buss)
+ m_buss->setLevel(value);
+ } else {
+ if (m_instrument)
+ m_instrument->setLevel(value);
+ }
+
+ } else if (lcName == "controlchange") {
+
+ if (m_section != InInstrument) {
+ m_errorString = "Found ControlChange outside Instrument";
+ return false;
+ }
+
+ MidiByte type = atts.value("type").toInt();
+ MidiByte value = atts.value("value").toInt();
+
+ if (m_instrument) {
+ m_instrument->setControllerValue(type, value);
+ }
+
+ } else if (lcName == "plugin" || lcName == "synth") {
+
+ PluginContainer *container = 0;
+
+ if (m_section == InInstrument) {
+// std::cerr << "Found plugin in instrument" << std::endl;
+ container = m_instrument;
+ m_pluginInBuss = false;
+ } else if (m_section == InBuss) {
+// std::cerr << "Found plugin in buss" << std::endl;
+ container = m_buss;
+ m_pluginInBuss = true;
+ } else {
+ m_errorString = "Found Plugin outside Instrument or Buss";
+ return false;
+ }
+
+ // Despite being InInstrument or InBuss we might not actually
+ // have a valid one.
+ //
+ if (container) {
+
+// std::cerr << "Have container" << std::endl;
+
+ emit setOperationName(i18n("Loading plugins..."));
+ ProgressDialog::processEvents();
+
+ // Get the details
+ int position;
+ if (lcName == "synth") {
+ position = Instrument::SYNTH_PLUGIN_POSITION;
+ } else {
+ position = atts.value("position").toInt();
+ }
+
+ bool bypassed = false;
+ QString bpStr = atts.value("bypassed");
+ if (bpStr.lower() == "true")
+ bypassed = true;
+
+ std::string program = "";
+ QString progStr = atts.value("program");
+ if (progStr) {
+ program = qstrtostr(progStr);
+ }
+
+ // Plugins are identified by a structured identifier
+ // string, but we will accept a LADSPA UniqueId if there's
+ // no identifier, for backward compatibility
+
+ QString identifier = atts.value("identifier");
+
+ AudioPlugin *plugin = 0;
+ AudioPluginManager *apm = getAudioPluginManager();
+
+ if (!identifier) {
+ if (atts.value("id")) {
+ unsigned long id = atts.value("id").toULong();
+ if (apm)
+ plugin = apm->getPluginByUniqueId(id);
+ }
+ } else {
+ if (apm)
+ plugin = apm->getPluginByIdentifier(identifier);
+ }
+
+// std::cerr << "Plugin identifier " << identifier << " -> plugin " << plugin << std::endl;
+
+ // If we find the plugin all is well and good but if
+ // we don't we just skip it.
+ //
+ if (plugin) {
+ m_plugin = container->getPlugin(position);
+ if (!m_plugin) {
+ RG_DEBUG << "WARNING: RoseXmlHandler: instrument/buss "
+ << container->getId() << " has no plugin position "
+ << position << endl;
+ } else {
+ m_plugin->setAssigned(true);
+ m_plugin->setBypass(bypassed);
+ m_plugin->setIdentifier(plugin->getIdentifier().data());
+// std::cerr << "set identifier to plugin at position " << position << std::endl;
+ if (program != "") {
+ m_plugin->setProgram(program);
+ }
+ }
+ } else {
+ // we shouldn't be halting import of the RG file just because
+ // we can't match a plugin
+ //
+ if (identifier) {
+ RG_DEBUG << "WARNING: RoseXmlHandler: plugin " << identifier << " not found" << endl;
+ m_pluginsNotFound.insert(identifier);
+ } else if (atts.value("id")) {
+ RG_DEBUG << "WARNING: RoseXmlHandler: plugin uid " << atts.value("id") << " not found" << endl;
+ } else {
+ m_errorString = "No plugin identifier or uid specified";
+ return false;
+ }
+ }
+ } else { // no instrument
+
+ if (lcName == "synth") {
+ QString identifier = atts.value("identifier");
+ if (identifier) {
+ RG_DEBUG << "WARNING: RoseXmlHandler: no instrument for plugin " << identifier << endl;
+ m_pluginsNotFound.insert(identifier);
+ }
+ }
+ }
+
+ m_section = InPlugin;
+
+ } else if (lcName == "port") {
+
+ if (m_section != InPlugin) {
+ m_errorString = "Found Port outside Plugin";
+ return false;
+ }
+ unsigned long portId = atts.value("id").toULong();
+ double value = qstrtodouble(atts.value("value"));
+
+ QString changed = atts.value("changed");
+ bool changedSinceProgram = (changed == "true");
+
+ if (m_plugin) {
+ m_plugin->addPort(portId, value);
+ if (changedSinceProgram) {
+ PluginPortInstance *ppi = m_plugin->getPort(portId);
+ if (ppi)
+ ppi->changedSinceProgramChange = true;
+ }
+ }
+
+ } else if (lcName == "configure") {
+
+ if (m_section != InPlugin) {
+ m_errorString = "Found Configure outside Plugin";
+ return false;
+ }
+
+ QString key = atts.value("key");
+ QString value = atts.value("value");
+
+ if (m_plugin) {
+ m_plugin->setConfigurationValue(qstrtostr(key), qstrtostr(value));
+ }
+
+ } else if (lcName == "metronome") {
+
+ if (m_section != InStudio) {
+ m_errorString = "Found Metronome outside Studio";
+ return false;
+ }
+
+ // Only create if we have a device
+ //
+ if (m_device && m_device->getType() == Device::Midi) {
+ InstrumentId instrument =
+ atts.value("instrument").toInt();
+
+ MidiMetronome metronome(instrument);
+
+ if (atts.value("barpitch"))
+ metronome.setBarPitch(atts.value("barpitch").toInt());
+ if (atts.value("beatpitch"))
+ metronome.setBeatPitch(atts.value("beatpitch").toInt());
+ if (atts.value("subbeatpitch"))
+ metronome.setSubBeatPitch(atts.value("subbeatpitch").toInt());
+ if (atts.value("depth"))
+ metronome.setDepth(atts.value("depth").toInt());
+ if (atts.value("barvelocity"))
+ metronome.setBarVelocity(atts.value("barvelocity").toInt());
+ if (atts.value("beatvelocity"))
+ metronome.setBeatVelocity(atts.value("beatvelocity").toInt());
+ if (atts.value("subbeatvelocity"))
+ metronome.setSubBeatVelocity(atts.value("subbeatvelocity").toInt());
+
+ dynamic_cast<MidiDevice*>(m_device)->
+ setMetronome(metronome);
+ }
+
+ } else if (lcName == "instrument") {
+
+ if (m_section != InStudio) {
+ m_errorString = "Found Instrument outside Studio";
+ return false;
+ }
+
+ m_section = InInstrument;
+
+ InstrumentId id = atts.value("id").toInt();
+ std::string stringType = qstrtostr(atts.value("type"));
+ Instrument::InstrumentType type;
+
+ if (stringType == "midi")
+ type = Instrument::Midi;
+ else if (stringType == "audio")
+ type = Instrument::Audio;
+ else if (stringType == "softsynth")
+ type = Instrument::SoftSynth;
+ else {
+ m_errorString = "Found unknown Instrument type";
+ return false;
+ }
+
+ // Try and match an Instrument in the file with one in
+ // our studio
+ //
+ Instrument *instrument = getStudio().getInstrumentById(id);
+
+ // If we've got an instrument and the types match then
+ // we use it from now on.
+ //
+ if (instrument && instrument->getType() == type) {
+ m_instrument = instrument;
+
+ // We can also get the channel from this tag
+ //
+ MidiByte channel =
+ (MidiByte)atts.value("channel").toInt();
+ m_instrument->setMidiChannel(channel);
+ }
+
+ } else if (lcName == "buss") {
+
+ if (m_section != InStudio) {
+ m_errorString = "Found Buss outside Studio";
+ return false;
+ }
+
+ m_section = InBuss;
+
+ BussId id = atts.value("id").toInt();
+ Buss *buss = getStudio().getBussById(id);
+
+ // If we've got a buss then we use it from now on.
+ //
+ if (buss) {
+ m_buss = buss;
+ } else {
+ m_buss = new Buss(id);
+ getStudio().addBuss(m_buss);
+ }
+
+ } else if (lcName == "audiofiles") {
+
+ if (m_section != NoSection) {
+ m_errorString = "Found AudioFiles inside another section";
+ return false;
+ }
+
+ m_section = InAudioFiles;
+
+ int rate = atts.value("expectedRate").toInt();
+ if (rate) {
+ getAudioFileManager().setExpectedSampleRate(rate);
+ }
+
+ } else if (lcName == "configuration") {
+
+ setSubHandler(new ConfigurationXmlSubHandler
+ (lcName, &m_doc->getConfiguration()));
+
+ } else if (lcName == "metadata") {
+
+ if (m_section != InComposition) {
+ m_errorString = "Found Metadata outside Composition";
+ return false;
+ }
+
+ setSubHandler(new ConfigurationXmlSubHandler
+ (lcName, &getComposition().getMetadata()));
+
+ } else if (lcName == "recordlevel") {
+
+ if (m_section != InInstrument) {
+ m_errorString = "Found recordLevel outside Instrument";
+ return false;
+ }
+
+ double value = qstrtodouble(atts.value("value"));
+
+ // if the value retrieved is greater than (say) 15 then we
+ // must have an old-style 0-127 value instead of a shiny new
+ // dB value, so convert it
+ if (value > 15.0) {
+ value = AudioLevel::multiplier_to_dB(value / 100);
+ }
+
+ if (m_instrument)
+ m_instrument->setRecordLevel(value);
+
+ } else if (lcName == "audioinput") {
+
+ if (m_section != InInstrument) {
+ m_errorString = "Found audioInput outside Instrument";
+ return false;
+ }
+
+ int value = atts.value("value").toInt();
+ int channel = atts.value("channel").toInt();
+
+ QString type = atts.value("type");
+ if (type) {
+ if (type.lower() == "buss") {
+ if (m_instrument)
+ m_instrument->setAudioInputToBuss(value, channel);
+ } else if (type.lower() == "record") {
+ if (m_instrument)
+ m_instrument->setAudioInputToRecord(value, channel);
+ }
+ }
+
+ } else if (lcName == "audiooutput") {
+
+ if (m_section != InInstrument) {
+ m_errorString = "Found audioOutput outside Instrument";
+ return false;
+ }
+
+ int value = atts.value("value").toInt();
+ if (m_instrument)
+ m_instrument->setAudioOutput(value);
+
+ } else if (lcName == "appearance") {
+
+ m_section = InAppearance;
+
+ } else if (lcName == "colourmap") {
+
+ if (m_section == InAppearance) {
+ QString mapName = atts.value("name");
+ m_inColourMap = true;
+ if (mapName == "segmentmap") {
+ m_colourMap = &m_doc->getComposition().getSegmentColourMap();
+ } else
+ if (mapName == "generalmap") {
+ m_colourMap = &m_doc->getComposition().getGeneralColourMap();
+ } else { // This will change later once we get more of the Appearance code sorted out
+ RG_DEBUG << "RoseXmlHandler::startElement : Found colourmap with unknown name\n";
+ }
+ } else {
+ m_errorString = "Found colourmap outside Appearance";
+ return false;
+ }
+
+ } else if (lcName == "colourpair") {
+
+ if (m_inColourMap && m_colourMap) {
+ unsigned int id = atts.value("id").toInt();
+ QString name = atts.value("name");
+ unsigned int red = atts.value("red").toInt();
+ unsigned int blue = atts.value("blue").toInt();
+ unsigned int green = atts.value("green").toInt();
+ Colour colour(red, green, blue);
+ m_colourMap->addItem(colour, qstrtostr(name), id);
+ } else {
+ m_errorString = "Found colourpair outside ColourMap";
+ return false;
+ }
+
+ } else if (lcName == "markers") {
+
+ if (!m_inComposition) {
+ m_errorString = "Found Markers outside Composition";
+ return false;
+ }
+
+ // clear down any markers
+ getComposition().clearMarkers();
+
+ } else if (lcName == "marker") {
+ if (!m_inComposition) {
+ m_errorString = "Found Marker outside Composition";
+ return false;
+ }
+ int time = atts.value("time").toInt();
+ QString name = atts.value("name");
+ QString descr = atts.value("description");
+
+ Marker *marker =
+ new Marker(time,
+ qstrtostr(name),
+ qstrtostr(descr));
+
+ getComposition().addMarker(marker);
+ } else {
+ RG_DEBUG << "RoseXmlHandler::startElement : Don't know how to parse this : " << qName << endl;
+ }
+
+ return true;
+}
+
+bool
+RoseXmlHandler::endElement(const QString& namespaceURI,
+ const QString& localName,
+ const QString& qName)
+{
+ if (getSubHandler()) {
+ bool finished;
+ bool res = getSubHandler()->endElement(namespaceURI, localName, qName.lower(), finished);
+ if (finished)
+ setSubHandler(0);
+ return res;
+ }
+
+ // Set percentage done
+ //
+ if ((m_totalElements > m_elementsSoFar) &&
+ (++m_elementsSoFar % 300 == 0)) {
+
+ emit setProgress(int(double(m_elementsSoFar) / double(m_totalElements) * 100.0));
+ ProgressDialog::processEvents();
+ }
+
+ QString lcName = qName.lower();
+
+ if (lcName == "rosegarden-data") {
+
+ getComposition().updateTriggerSegmentReferences();
+
+ } else if (lcName == "event") {
+
+ if (m_currentSegment && m_currentEvent) {
+ m_currentSegment->insert(m_currentEvent);
+ m_currentEvent = 0;
+ } else if (!m_currentSegment && m_currentEvent) {
+ m_errorString = "Got event outside of a Segment";
+ return false;
+ }
+
+ } else if (lcName == "chord") {
+
+ m_currentTime += m_chordDuration;
+ m_inChord = false;
+ m_chordDuration = 0;
+
+ } else if (lcName == "group") {
+
+ m_inGroup = false;
+
+ } else if (lcName == "segment") {
+
+ if (m_currentSegment && m_segmentEndMarkerTime) {
+ m_currentSegment->setEndMarkerTime(*m_segmentEndMarkerTime);
+ delete m_segmentEndMarkerTime;
+ m_segmentEndMarkerTime = 0;
+ }
+
+ m_currentSegment = 0;
+ m_section = NoSection;
+
+ } else if (lcName == "bar-segment" || lcName == "tempo-segment") {
+
+ m_currentSegment = 0;
+
+ } else if (lcName == "composition") {
+ m_inComposition = false;
+ m_section = NoSection;
+
+ } else if (lcName == "studio") {
+
+ m_section = NoSection;
+
+ } else if (lcName == "buss") {
+
+ m_section = InStudio;
+ m_buss = 0;
+
+ } else if (lcName == "instrument") {
+
+ m_section = InStudio;
+ m_instrument = 0;
+
+ } else if (lcName == "plugin") {
+
+ if (m_pluginInBuss) {
+ m_section = InBuss;
+ } else {
+ m_section = InInstrument;
+ }
+ m_plugin = 0;
+ m_pluginId = 0;
+
+ } else if (lcName == "device") {
+
+ m_device = 0;
+
+ } else if (lcName == "keymapping") {
+
+ if (m_section == InStudio) {
+ if (m_keyMapping) {
+ if (!m_keyNameMap.empty()) {
+ MidiDevice *md = dynamic_cast<MidiDevice *>
+ (m_device);
+ if (md) {
+ m_keyMapping->setMap(m_keyNameMap);
+ md->addKeyMapping(*m_keyMapping);
+ }
+ }
+ m_keyMapping = 0;
+ }
+ }
+
+ } else if (lcName == "audiofiles") {
+
+ m_section = NoSection;
+
+ } else if (lcName == "appearance") {
+
+ m_section = NoSection;
+
+ } else if (lcName == "colourmap") {
+ m_inColourMap = false;
+ m_colourMap = 0;
+ }
+
+ return true;
+}
+
+bool
+RoseXmlHandler::characters(const QString& s)
+{
+ if (m_subHandler)
+ return m_subHandler->characters(s);
+
+ return true;
+}
+
+QString
+RoseXmlHandler::errorString()
+{
+ return m_errorString;
+}
+
+bool
+RoseXmlHandler::error(const QXmlParseException& exception)
+{
+ m_errorString = QString("%1 at line %2, column %3")
+ .arg(exception.message())
+ .arg(exception.lineNumber())
+ .arg(exception.columnNumber());
+ return QXmlDefaultHandler::error( exception );
+}
+
+bool
+RoseXmlHandler::fatalError(const QXmlParseException& exception)
+{
+ m_errorString = QString("%1 at line %2, column %3")
+ .arg(exception.message())
+ .arg(exception.lineNumber())
+ .arg(exception.columnNumber());
+ return QXmlDefaultHandler::fatalError( exception );
+}
+
+bool
+RoseXmlHandler::endDocument()
+{
+ if (m_foundTempo == false) {
+ getComposition().setCompositionDefaultTempo
+ (Composition::getTempoForQpm(120.0));
+ }
+
+ return true;
+}
+
+void
+RoseXmlHandler::setSubHandler(XmlSubHandler* sh)
+{
+ delete m_subHandler;
+ m_subHandler = sh;
+}
+
+void
+RoseXmlHandler::addMIDIDevice(QString name, bool createAtSequencer)
+{
+ unsigned int deviceId = 0;
+
+ if (createAtSequencer) {
+
+ QByteArray data;
+ QByteArray replyData;
+ QCString replyType;
+ QDataStream arg(data, IO_WriteOnly);
+
+ arg << (int)Device::Midi;
+ arg << (unsigned int)MidiDevice::Play;
+
+ if (!rgapp->sequencerCall("addDevice(int, unsigned int)", replyType, replyData, data)) {
+ SEQMAN_DEBUG << "RoseXmlHandler::addMIDIDevice - "
+ << "can't call sequencer addDevice" << endl;
+ return ;
+ }
+
+ if (replyType == "unsigned int") {
+ QDataStream reply(replyData, IO_ReadOnly);
+ reply >> deviceId;
+ } else {
+ SEQMAN_DEBUG << "RoseXmlHandler::addMIDIDevice - "
+ << "got unknown returntype from addDevice()" << endl;
+ return ;
+ }
+
+ if (deviceId == Device::NO_DEVICE) {
+ SEQMAN_DEBUG << "RoseXmlHandler::addMIDIDevice - "
+ << "sequencer addDevice failed" << endl;
+ return ;
+ }
+
+ SEQMAN_DEBUG << "RoseXmlHandler::addMIDIDevice - "
+ << " added device " << deviceId << endl;
+
+ } else {
+ // Generate a new device id at the base Studio side only.
+ // This may not correspond to any given device id at the
+ // sequencer side. We should _never_ do this in a document
+ // that's actually intended to be retained for use, only
+ // in temporary documents for device import etc.
+ int tempId = -1;
+ for (DeviceListIterator i = getStudio().getDevices()->begin();
+ i != getStudio().getDevices()->end(); ++i) {
+ if (int((*i)->getId()) > tempId)
+ tempId = int((*i)->getId());
+ }
+ deviceId = tempId + 1;
+ }
+
+ // add the device, so we can name it and set our pointer to it --
+ // instruments will be sync'd later in the natural course of things
+ getStudio().addDevice(qstrtostr(name), deviceId, Device::Midi);
+ m_device = getStudio().getDevice(deviceId);
+ m_deviceRunningId = deviceId;
+}
+
+void
+RoseXmlHandler::skipToNextPlayDevice()
+{
+ SEQMAN_DEBUG << "RoseXmlHandler::skipToNextPlayDevice; m_deviceRunningId is " << m_deviceRunningId << endl;
+
+ for (DeviceList::iterator i = getStudio().getDevices()->begin();
+ i != getStudio().getDevices()->end(); ++i) {
+
+ MidiDevice *md =
+ dynamic_cast<MidiDevice *>(*i);
+
+ if (md && md->getDirection() == MidiDevice::Play) {
+ if (m_deviceRunningId == Device::NO_DEVICE ||
+ md->getId() > m_deviceRunningId) {
+
+ SEQMAN_DEBUG << "RoseXmlHandler::skipToNextPlayDevice: found next device: id " << md->getId() << endl;
+
+ m_device = md;
+ m_deviceRunningId = md->getId();
+ return ;
+ }
+ }
+ }
+
+ SEQMAN_DEBUG << "RoseXmlHandler::skipToNextPlayDevice: fresh out of devices" << endl;
+
+ m_device = 0;
+}
+
+void
+RoseXmlHandler::setMIDIDeviceConnection(QString connection)
+{
+ SEQMAN_DEBUG << "RoseXmlHandler::setMIDIDeviceConnection(" << connection << ")" << endl;
+
+ MidiDevice *md = dynamic_cast<MidiDevice *>(m_device);
+ if (!md)
+ return ;
+
+ QByteArray data;
+ QDataStream arg(data, IO_WriteOnly);
+
+ arg << (unsigned int)md->getId();
+ arg << connection;
+
+ rgapp->sequencerSend("setPlausibleConnection(unsigned int, QString)",
+ data);
+ // connection should be sync'd later in the natural course of things
+}
+
+void
+RoseXmlHandler::setMIDIDeviceName(QString name)
+{
+ SEQMAN_DEBUG << "RoseXmlHandler::setMIDIDeviceName(" << name << ")" << endl;
+
+ MidiDevice *md = dynamic_cast<MidiDevice *>(m_device);
+ if (!md)
+ return ;
+
+ QByteArray data;
+ QDataStream arg(data, IO_WriteOnly);
+
+ arg << (unsigned int)md->getId();
+ arg << name;
+
+ std::cerr << "Renaming device " << md->getId() << " to " << name << std::endl;
+
+ rgapp->sequencerSend("renameDevice(unsigned int, QString)",
+ data);
+}
+
+}
diff --git a/src/document/RoseXmlHandler.h b/src/document/RoseXmlHandler.h
new file mode 100644
index 0000000..ab06e3a
--- /dev/null
+++ b/src/document/RoseXmlHandler.h
@@ -0,0 +1,192 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_ROSEXMLHANDLER_H_
+#define _RG_ROSEXMLHANDLER_H_
+
+#include "base/Device.h"
+#include "base/MidiProgram.h"
+#include "gui/general/ProgressReporter.h"
+#include <map>
+#include <set>
+#include <string>
+#include <qstring.h>
+#include "base/Event.h"
+#include <qxml.h>
+
+
+class QXmlParseException;
+class QXmlAttributes;
+
+
+namespace Rosegarden
+{
+
+class XmlStorableEvent;
+class XmlSubHandler;
+class Studio;
+class Segment;
+class RosegardenGUIDoc;
+class Instrument;
+class Device;
+class Composition;
+class ColourMap;
+class Buss;
+class AudioPluginManager;
+class AudioPluginInstance;
+class AudioFileManager;
+
+
+/**
+ * Handler for the Rosegarden XML format
+ */
+class RoseXmlHandler : public ProgressReporter, public QXmlDefaultHandler
+{
+public:
+
+ typedef enum
+ {
+ NoSection,
+ InComposition,
+ InSegment,
+ InStudio,
+ InInstrument,
+ InBuss,
+ InAudioFiles,
+ InPlugin,
+ InAppearance
+ } RosegardenFileSection;
+
+ /**
+ * Construct a new RoseXmlHandler which will put the data extracted
+ * from the XML file into the specified composition
+ */
+ RoseXmlHandler(RosegardenGUIDoc *doc,
+ unsigned int elementCount,
+ bool createNewDevicesWhenNeeded);
+
+ virtual ~RoseXmlHandler();
+
+ /// overloaded handler functions
+ virtual bool startDocument();
+ virtual bool startElement(const QString& namespaceURI,
+ const QString& localName,
+ const QString& qName,
+ const QXmlAttributes& atts);
+
+ virtual bool endElement(const QString& namespaceURI,
+ const QString& localName,
+ const QString& qName);
+
+ virtual bool characters(const QString& ch);
+
+ virtual bool endDocument (); // [rwb] - for tempo element catch
+
+ bool isDeprecated() { return m_deprecation; }
+
+ bool isCancelled() { return m_cancelled; }
+
+ /// Return the error string set during the parsing (if any)
+ QString errorString();
+
+ bool hasActiveAudio() const { return m_hasActiveAudio; }
+ std::set<QString> &pluginsNotFound() { return m_pluginsNotFound; }
+
+ bool error(const QXmlParseException& exception);
+ bool fatalError(const QXmlParseException& exception);
+
+protected:
+
+ // just for convenience -- just call to the document
+ //
+ Composition& getComposition();
+ Studio& getStudio();
+ AudioFileManager& getAudioFileManager();
+ AudioPluginManager* getAudioPluginManager();
+
+ void setSubHandler(XmlSubHandler* sh);
+ XmlSubHandler* getSubHandler() { return m_subHandler; }
+
+ void addMIDIDevice(QString name, bool createAtSequencer);
+ void setMIDIDeviceConnection(QString connection);
+ void setMIDIDeviceName(QString name);
+ void skipToNextPlayDevice();
+
+ //--------------- Data members ---------------------------------
+
+ RosegardenGUIDoc *m_doc;
+ Segment *m_currentSegment;
+ XmlStorableEvent *m_currentEvent;
+
+ timeT m_currentTime;
+ timeT m_chordDuration;
+ timeT *m_segmentEndMarkerTime;
+
+ bool m_inChord;
+ bool m_inGroup;
+ bool m_inComposition;
+ bool m_inColourMap;
+ std::string m_groupType;
+ int m_groupId;
+ int m_groupTupletBase;
+ int m_groupTupledCount;
+ int m_groupUntupledCount;
+ std::map<long, long> m_groupIdMap;
+
+ bool m_foundTempo;
+
+ QString m_errorString;
+ std::set<QString> m_pluginsNotFound;
+
+ RosegardenFileSection m_section;
+ Device *m_device;
+ DeviceId m_deviceRunningId;
+ bool m_percussion;
+ MidiByte m_msb;
+ MidiByte m_lsb;
+ Instrument *m_instrument;
+ Buss *m_buss;
+ AudioPluginInstance *m_plugin;
+ bool m_pluginInBuss;
+ ColourMap *m_colourMap;
+ MidiKeyMapping *m_keyMapping;
+ MidiKeyMapping::KeyNameMap m_keyNameMap;
+ unsigned int m_pluginId;
+ unsigned int m_totalElements;
+ unsigned int m_elementsSoFar;
+
+ XmlSubHandler *m_subHandler;
+ bool m_deprecation;
+ bool m_createDevices;
+ bool m_haveControls;
+ bool m_cancelled;
+ bool m_skipAllAudio;
+ bool m_hasActiveAudio;
+};
+
+
+}
+
+#endif
diff --git a/src/document/RosegardenGUIDoc.cpp b/src/document/RosegardenGUIDoc.cpp
new file mode 100644
index 0000000..f89a83f
--- /dev/null
+++ b/src/document/RosegardenGUIDoc.cpp
@@ -0,0 +1,3117 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "RosegardenGUIDoc.h"
+#include <kapplication.h>
+
+#include <qxml.h>
+#include "sound/Midi.h"
+#include "gui/editors/segment/TrackEditor.h"
+#include "gui/editors/segment/TrackButtons.h"
+#include <klocale.h>
+#include <kstddirs.h>
+#include "misc/Debug.h"
+#include "misc/Strings.h"
+#include "gui/general/ClefIndex.h"
+#include "document/ConfigGroups.h"
+#include "base/AudioDevice.h"
+#include "base/AudioPluginInstance.h"
+#include "base/BaseProperties.h"
+#include "base/Clipboard.h"
+#include "base/Composition.h"
+#include "base/Configuration.h"
+#include "base/Device.h"
+#include "base/Event.h"
+#include "base/Exception.h"
+#include "base/Instrument.h"
+#include "base/MidiDevice.h"
+#include "base/MidiProgram.h"
+#include "base/MidiTypes.h"
+#include "base/NotationTypes.h"
+#include "base/Profiler.h"
+#include "base/RealTime.h"
+#include "base/Segment.h"
+#include "base/SoftSynthDevice.h"
+#include "base/Studio.h"
+#include "base/Track.h"
+#include "base/XmlExportable.h"
+#include "commands/edit/EventQuantizeCommand.h"
+#include "commands/notation/NormalizeRestsCommand.h"
+#include "commands/segment/AddTracksCommand.h"
+#include "commands/segment/SegmentInsertCommand.h"
+#include "commands/segment/SegmentRecordCommand.h"
+#include "commands/segment/ChangeCompositionLengthCommand.h"
+#include "gui/application/RosegardenApplication.h"
+#include "gui/application/RosegardenGUIApp.h"
+#include "gui/application/RosegardenGUIView.h"
+#include "gui/dialogs/UnusedAudioSelectionDialog.h"
+#include "gui/editors/segment/segmentcanvas/AudioPreviewThread.h"
+#include "gui/editors/segment/TrackLabel.h"
+#include "gui/general/EditViewBase.h"
+#include "gui/general/GUIPalette.h"
+#include "gui/kdeext/KStartupLogo.h"
+#include "gui/seqmanager/SequenceManager.h"
+#include "gui/studio/AudioPluginManager.h"
+#include "gui/studio/StudioControl.h"
+#include "gui/widgets/CurrentProgressDialog.h"
+#include "gui/widgets/ProgressDialog.h"
+#include "MultiViewCommandHistory.h"
+#include "RoseXmlHandler.h"
+#include "sound/AudioFile.h"
+#include "sound/AudioFileManager.h"
+#include "sound/MappedCommon.h"
+#include "sound/MappedComposition.h"
+#include "sound/MappedDevice.h"
+#include "sound/MappedInstrument.h"
+#include "sound/MappedEvent.h"
+#include "sound/MappedRealTime.h"
+#include "sound/MappedStudio.h"
+#include "sound/PluginIdentifier.h"
+#include "sound/SoundDriver.h"
+#include <kcommand.h>
+#include <kconfig.h>
+#include <kfilterdev.h>
+#include <kglobal.h>
+#include <kmessagebox.h>
+#include <kprocess.h>
+#include <kprogress.h>
+#include <ktempfile.h>
+#include <qcstring.h>
+#include <qdatastream.h>
+#include <qdialog.h>
+#include <qdir.h>
+#include <qfile.h>
+#include <qfileinfo.h>
+#include <qobject.h>
+#include <qstring.h>
+#include <qstringlist.h>
+#include <qtextstream.h>
+#include <qwidget.h>
+#include "gui/widgets/ProgressBar.h"
+
+
+namespace Rosegarden
+{
+
+using namespace BaseProperties;
+
+RosegardenGUIDoc::RosegardenGUIDoc(QWidget *parent,
+ AudioPluginManager *pluginManager,
+ bool skipAutoload,
+ const char *name)
+ : QObject(parent, name),
+ m_modified(false),
+ m_autoSaved(false),
+ m_audioPreviewThread(&m_audioFileManager),
+ m_commandHistory(new MultiViewCommandHistory()),
+ m_pluginManager(pluginManager),
+ m_audioRecordLatency(0, 0),
+ m_autoSavePeriod(0),
+ m_quickMarkerTime(-1),
+ m_beingDestroyed(false)
+{
+ syncDevices();
+
+ m_viewList.setAutoDelete(false);
+ m_editViewList.setAutoDelete(false);
+
+ connect(m_commandHistory, SIGNAL(commandExecuted(KCommand *)),
+ this, SLOT(slotDocumentModified()));
+
+ connect(m_commandHistory, SIGNAL(documentRestored()),
+ this, SLOT(slotDocumentRestored()));
+
+ // autoload a new document
+ if (!skipAutoload)
+ performAutoload();
+
+ // now set it up as a "new document"
+ newDocument();
+}
+
+RosegardenGUIDoc::~RosegardenGUIDoc()
+{
+ RG_DEBUG << "~RosegardenGUIDoc()\n";
+ m_beingDestroyed = true;
+
+ m_audioPreviewThread.finish();
+ m_audioPreviewThread.wait();
+
+ deleteEditViews();
+
+ // ControlRulerCanvasRepository::clear();
+
+ delete m_commandHistory; // must be deleted before the Composition is
+}
+
+unsigned int
+RosegardenGUIDoc::getAutoSavePeriod() const
+{
+ KConfig* config = kapp->config();
+ config->setGroup(GeneralOptionsConfigGroup);
+ return config->readUnsignedNumEntry("autosaveinterval", 60);
+}
+
+void RosegardenGUIDoc::attachView(RosegardenGUIView *view)
+{
+ m_viewList.append(view);
+}
+
+void RosegardenGUIDoc::detachView(RosegardenGUIView *view)
+{
+ m_viewList.remove(view);
+}
+
+void RosegardenGUIDoc::attachEditView(EditViewBase *view)
+{
+ m_editViewList.append(view);
+}
+
+void RosegardenGUIDoc::detachEditView(EditViewBase *view)
+{
+ // auto-deletion is disabled, as
+ // the editview detaches itself when being deleted
+ m_editViewList.remove(view);
+}
+
+void RosegardenGUIDoc::deleteEditViews()
+{
+ // enabled auto-deletion : edit views will be deleted
+ m_editViewList.setAutoDelete(true);
+ m_editViewList.clear();
+}
+
+void RosegardenGUIDoc::setAbsFilePath(const QString &filename)
+{
+ m_absFilePath = filename;
+}
+
+void RosegardenGUIDoc::setTitle(const QString &_t)
+{
+ m_title = _t;
+}
+
+const QString &RosegardenGUIDoc::getAbsFilePath() const
+{
+ return m_absFilePath;
+}
+
+const QString& RosegardenGUIDoc::getTitle() const
+{
+ return m_title;
+}
+
+void RosegardenGUIDoc::slotUpdateAllViews(RosegardenGUIView *sender)
+{
+ RosegardenGUIView *w;
+
+ for (w = m_viewList.first(); w != 0; w = m_viewList.next()) {
+ if (w != sender)
+ w->repaint();
+ }
+}
+
+void RosegardenGUIDoc::setModified(bool m)
+{
+ m_modified = m;
+ RG_DEBUG << "RosegardenGUIDoc[" << this << "]::setModified(" << m << ")\n";
+}
+
+void RosegardenGUIDoc::clearModifiedStatus()
+{
+ setModified(false);
+ setAutoSaved(true);
+ emit documentModified(false);
+}
+
+void RosegardenGUIDoc::slotDocumentModified()
+{
+ RG_DEBUG << "RosegardenGUIDoc::slotDocumentModified()" << endl;
+ setModified(true);
+ setAutoSaved(false);
+ emit documentModified(true);
+}
+
+void RosegardenGUIDoc::slotDocumentRestored()
+{
+ RG_DEBUG << "RosegardenGUIDoc::slotDocumentRestored()\n";
+ setModified(false);
+}
+
+void
+RosegardenGUIDoc::setQuickMarker()
+{
+ RG_DEBUG << "RosegardenGUIDoc::setQuickMarker" << endl;
+
+ m_quickMarkerTime = getComposition().getPosition();
+}
+
+void
+RosegardenGUIDoc::jumpToQuickMarker()
+{
+ RG_DEBUG << "RosegardenGUIDoc::jumpToQuickMarker" << endl;
+
+ if (m_quickMarkerTime >= 0)
+ slotSetPointerPosition(m_quickMarkerTime);
+}
+
+QString RosegardenGUIDoc::getAutoSaveFileName()
+{
+ QString filename = getAbsFilePath();
+ if (filename.isEmpty())
+ filename = QDir::currentDirPath() + "/" + getTitle();
+
+ QString autoSaveFileName = kapp->tempSaveName(filename);
+
+ return autoSaveFileName;
+}
+
+void RosegardenGUIDoc::slotAutoSave()
+{
+ // RG_DEBUG << "RosegardenGUIDoc::slotAutoSave()\n" << endl;
+
+ if (isAutoSaved() || !isModified())
+ return ;
+
+ QString autoSaveFileName = getAutoSaveFileName();
+
+ RG_DEBUG << "RosegardenGUIDoc::slotAutoSave() - doc modified - saving '"
+ << getAbsFilePath() << "' as "
+ << autoSaveFileName << endl;
+
+ QString errMsg;
+
+ saveDocument(autoSaveFileName, errMsg, true);
+
+}
+
+bool RosegardenGUIDoc::isRegularDotRGFile()
+{
+ return getAbsFilePath().right(3).lower() == ".rg";
+}
+
+bool RosegardenGUIDoc::saveIfModified()
+{
+ RG_DEBUG << "RosegardenGUIDoc::saveIfModified()" << endl;
+ bool completed = true;
+
+ if (!isModified())
+ return completed;
+
+
+ RosegardenGUIApp *win = (RosegardenGUIApp *)parent();
+
+ int wantSave = KMessageBox::warningYesNoCancel
+ (win,
+ i18n("The current file has been modified.\n"
+ "Do you want to save it?"),
+ i18n("Warning"));
+
+ RG_DEBUG << "wantSave = " << wantSave << endl;
+
+ switch (wantSave) {
+
+ case KMessageBox::Yes:
+
+ if (!isRegularDotRGFile()) {
+
+ RG_DEBUG << "RosegardenGUIDoc::saveIfModified() : new or imported file\n";
+ completed = win->slotFileSaveAs();
+
+ } else {
+
+ RG_DEBUG << "RosegardenGUIDoc::saveIfModified() : regular file\n";
+ QString errMsg;
+ completed = saveDocument(getAbsFilePath(), errMsg);
+
+ if (!completed) {
+ if (errMsg) {
+ KMessageBox::error(0, i18n(QString("Could not save document at %1\n(%2)")
+ .arg(getAbsFilePath()).arg(errMsg)));
+ } else {
+ KMessageBox::error(0, i18n(QString("Could not save document at %1")
+ .arg(getAbsFilePath())));
+ }
+ }
+ }
+
+ break;
+
+ case KMessageBox::No:
+ // delete the autosave file so it won't annoy
+ // the user when reloading the file.
+ QFile::remove
+ (getAutoSaveFileName());
+ completed = true;
+ break;
+
+ case KMessageBox::Cancel:
+ completed = false;
+ break;
+
+ default:
+ completed = false;
+ break;
+ }
+
+ if (completed) {
+ completed = deleteOrphanedAudioFiles(wantSave == KMessageBox::No);
+ if (completed) {
+ m_audioFileManager.resetRecentlyCreatedFiles();
+ }
+ }
+
+ if (completed)
+ setModified(false);
+ return completed;
+}
+
+bool
+RosegardenGUIDoc::deleteOrphanedAudioFiles(bool documentWillNotBeSaved)
+{
+ std::vector<QString> recordedOrphans;
+ std::vector<QString> derivedOrphans;
+
+ if (documentWillNotBeSaved) {
+
+ // All audio files recorded or derived in this session are
+ // about to become orphans
+
+ for (std::vector<AudioFile *>::const_iterator i =
+ m_audioFileManager.begin();
+ i != m_audioFileManager.end(); ++i) {
+
+ if (m_audioFileManager.wasAudioFileRecentlyRecorded((*i)->getId())) {
+ recordedOrphans.push_back(strtoqstr((*i)->getFilename()));
+ }
+
+ if (m_audioFileManager.wasAudioFileRecentlyDerived((*i)->getId())) {
+ derivedOrphans.push_back(strtoqstr((*i)->getFilename()));
+ }
+ }
+ }
+
+ // Whether we save or not, explicitly orphaned (i.e. recorded in
+ // this session and then unloaded) recorded files are orphans.
+ // Make sure they are actually unknown to the audio file manager
+ // (i.e. they haven't been loaded more than once, or reloaded
+ // after orphaning).
+
+ for (std::vector<QString>::iterator i = m_orphanedRecordedAudioFiles.begin();
+ i != m_orphanedRecordedAudioFiles.end(); ++i) {
+
+ bool stillHave = false;
+
+ for (std::vector<AudioFile *>::const_iterator j =
+ m_audioFileManager.begin();
+ j != m_audioFileManager.end(); ++j) {
+ if (strtoqstr((*j)->getFilename()) == *i) {
+ stillHave = true;
+ break;
+ }
+ }
+
+ if (!stillHave) recordedOrphans.push_back(*i);
+ }
+
+ // Derived orphans get deleted whatever happens
+ //!!! Should we orphan any file derived during this session that
+ //is not currently used in a segment? Probably: we have no way to
+ //reuse them
+
+ for (std::vector<QString>::iterator i = m_orphanedDerivedAudioFiles.begin();
+ i != m_orphanedDerivedAudioFiles.end(); ++i) {
+
+ bool stillHave = false;
+
+ for (std::vector<AudioFile *>::const_iterator j =
+ m_audioFileManager.begin();
+ j != m_audioFileManager.end(); ++j) {
+ if (strtoqstr((*j)->getFilename()) == *i) {
+ stillHave = true;
+ break;
+ }
+ }
+
+ if (!stillHave) derivedOrphans.push_back(*i);
+ }
+
+ for (size_t i = 0; i < derivedOrphans.size(); ++i) {
+ QFile file(derivedOrphans[i]);
+ if (!file.remove()) {
+ std::cerr << "WARNING: Failed to remove orphaned derived audio file \"" << derivedOrphans[i] << std::endl;
+ }
+ QFile peakFile(QString("%1.pk").arg(derivedOrphans[i]));
+ peakFile.remove();
+ }
+
+ m_orphanedDerivedAudioFiles.clear();
+
+ if (recordedOrphans.empty())
+ return true;
+
+ if (documentWillNotBeSaved) {
+
+ int reply = KMessageBox::warningYesNoCancel
+ (0,
+ i18n("Delete the 1 audio file recorded during the unsaved session?",
+ "Delete the %n audio files recorded during the unsaved session?",
+ recordedOrphans.size()));
+
+ switch (reply) {
+
+ case KMessageBox::Yes:
+ break;
+
+ case KMessageBox::No:
+ return true;
+
+ default:
+ case KMessageBox::Cancel:
+ return false;
+ }
+
+ } else {
+
+ UnusedAudioSelectionDialog *dialog =
+ new UnusedAudioSelectionDialog
+ (0,
+ i18n("The following audio files were recorded during this session but have been unloaded\nfrom the audio file manager, and so are no longer in use in the document you are saving.\n\nYou may want to clean up these files to save disk space.\n\nPlease select any you wish to delete permanently from the hard disk.\n"),
+ recordedOrphans);
+
+ if (dialog->exec() != QDialog::Accepted) {
+ delete dialog;
+ return true;
+ }
+
+ recordedOrphans = dialog->getSelectedAudioFileNames();
+ delete dialog;
+ }
+
+ if (recordedOrphans.empty())
+ return true;
+
+ QString question =
+ i18n("<qt>About to delete 1 audio file permanently from the hard disk.<br>There will be no way to recover this file.<br>Are you sure?</qt>\n", "<qt>About to delete %n audio files permanently from the hard disk.<br>There will be no way to recover these files.<br>Are you sure?</qt>", recordedOrphans.size());
+
+ int reply = KMessageBox::warningContinueCancel(0, question);
+
+ if (reply == KMessageBox::Continue) {
+ for (size_t i = 0; i < recordedOrphans.size(); ++i) {
+ QFile file(recordedOrphans[i]);
+ if (!file.remove()) {
+ KMessageBox::error(0, i18n("File %1 could not be deleted.")
+ .arg(recordedOrphans[i]));
+ }
+
+ QFile peakFile(QString("%1.pk").arg(recordedOrphans[i]));
+ peakFile.remove();
+ }
+ }
+
+ return true;
+}
+
+void RosegardenGUIDoc::newDocument()
+{
+ setModified(false);
+ setAbsFilePath(QString::null);
+ setTitle(i18n("Untitled"));
+ m_commandHistory->clear();
+}
+
+void RosegardenGUIDoc::performAutoload()
+{
+ QString autoloadFile =
+ KGlobal::dirs()->findResource("appdata", "autoload.rg");
+
+ QFileInfo autoloadFileInfo(autoloadFile);
+
+ if (!autoloadFileInfo.isReadable()) {
+ RG_DEBUG << "RosegardenGUIDoc::performAutoload - "
+ << "can't find autoload file - defaulting" << endl;
+ return ;
+ }
+
+ openDocument(autoloadFile);
+
+}
+
+bool RosegardenGUIDoc::openDocument(const QString& filename,
+ bool permanent,
+ const char* /*format*/ /*=0*/)
+{
+ RG_DEBUG << "RosegardenGUIDoc::openDocument("
+ << filename << ")" << endl;
+
+ if (!filename || filename.isEmpty())
+ return false;
+
+ newDocument();
+
+ QFileInfo fileInfo(filename);
+ setTitle(fileInfo.fileName());
+
+ // Check if file readable with fileInfo ?
+ if (!fileInfo.isReadable() || fileInfo.isDir()) {
+ KStartupLogo::hideIfStillThere();
+ QString msg(i18n("Can't open file '%1'").arg(filename));
+ KMessageBox::sorry(0, msg);
+ return false;
+ }
+
+ ProgressDialog progressDlg(i18n("Reading file..."),
+ 100,
+ (QWidget*)parent());
+
+ connect(&progressDlg, SIGNAL(cancelClicked()),
+ &m_audioFileManager, SLOT(slotStopPreview()));
+
+ progressDlg.setMinimumDuration(500);
+ progressDlg.setAutoReset(true); // we're re-using it for the preview generation
+ setAbsFilePath(fileInfo.absFilePath());
+
+ QString errMsg;
+ QString fileContents;
+ bool cancelled = false, okay = true;
+
+ KFilterDev* fileCompressedDevice = static_cast<KFilterDev*>(KFilterDev::deviceForFile(filename, "application/x-gzip"));
+ if (fileCompressedDevice == 0) {
+
+ errMsg = i18n("Could not open Rosegarden file");
+
+ } else {
+ fileCompressedDevice->open(IO_ReadOnly);
+
+ unsigned int elementCount = fileInfo.size() / 4; // approx. guess
+ // RG_DEBUG << "RosegardenGUIDoc::xmlParse() : elementCount = " << elementCount
+ // << " - file size : " << file->size()
+ // << endl;
+
+
+ // Fugly work-around in case of broken rg files
+ //
+ int c = 0;
+ std::vector<char> baseBuffer;
+
+ while (c != -1) {
+ c = fileCompressedDevice->getch();
+ if (c != -1)
+ baseBuffer.push_back(c);
+ }
+
+ fileCompressedDevice->close();
+
+ QString fileContents = QString::fromUtf8(&baseBuffer[0],
+ baseBuffer.size());
+
+ // parse xml file
+ okay = xmlParse(fileContents, errMsg, &progressDlg,
+ elementCount, permanent, cancelled);
+ // okay = xmlParse(fileCompressedDevice, errMsg, &progressDlg,
+ // elementCount, permanent, cancelled);
+ delete fileCompressedDevice;
+
+ }
+
+ if (!okay) {
+ KStartupLogo::hideIfStillThere();
+ QString msg(i18n("Error when parsing file '%1': \"%2\"")
+ .arg(filename)
+ .arg(errMsg));
+
+ CurrentProgressDialog::freeze();
+ KMessageBox::sorry(0, msg);
+ CurrentProgressDialog::thaw();
+
+ return false;
+
+ } else if (cancelled) {
+ newDocument();
+ return false;
+ }
+
+ RG_DEBUG << "RosegardenGUIDoc::openDocument() end - "
+ << "m_composition : " << &m_composition
+ << " - m_composition->getNbSegments() : "
+ << m_composition.getNbSegments()
+ << " - m_composition->getDuration() : "
+ << m_composition.getDuration() << endl;
+
+ if (m_composition.begin() != m_composition.end()) {
+ RG_DEBUG << "First segment starts at " << (*m_composition.begin())->getStartTime() << endl;
+ }
+
+ // Ensure a minimum of 64 tracks
+ //
+ // unsigned int nbTracks = m_composition.getNbTracks();
+ // TrackId maxTrackId = m_composition.getMaxTrackId();
+ // InstrumentId instBase = MidiInstrumentBase;
+
+ // for(unsigned int i = nbTracks; i < MinNbOfTracks; ++i) {
+
+ // Track *track;
+
+ // track = new Track(maxTrackId + 1, // id
+ // (i + instBase) % 16, // instrument
+ // i, // position
+ // "untitled",
+ // false); // mute
+
+ // m_composition.addTrack(track);
+ // ++maxTrackId;
+ // }
+
+ // We might need a progress dialog when we generate previews,
+ // reuse the previous one
+ progressDlg.setLabel(i18n("Generating audio previews..."));
+
+ connect(&m_audioFileManager, SIGNAL(setProgress(int)),
+ progressDlg.progressBar(), SLOT(setValue(int)));
+ try {
+ // generate any audio previews after loading the files
+ m_audioFileManager.generatePreviews();
+ } catch (Exception e) {
+ KStartupLogo::hideIfStillThere();
+ CurrentProgressDialog::freeze();
+ KMessageBox::error(0, strtoqstr(e.getMessage()));
+ CurrentProgressDialog::thaw();
+ }
+
+ if (isSequencerRunning()) {
+ // Initialise the whole studio - faders, plugins etc.
+ //
+ initialiseStudio();
+
+ // Initialise the MIDI controllers (reaches through to MIDI devices
+ // to set them up)
+ //
+ initialiseControllers();
+ }
+
+ return true;
+}
+
+void
+RosegardenGUIDoc::mergeDocument(RosegardenGUIDoc *doc,
+ int options)
+{
+ KMacroCommand *command = new KMacroCommand(i18n("Merge"));
+
+ timeT time0 = 0;
+ if (options & MERGE_AT_END) {
+ time0 = getComposition().getBarEndForTime(getComposition().getDuration());
+ }
+
+ int myMaxTrack = getComposition().getNbTracks();
+ int yrMinTrack = 0;
+ int yrMaxTrack = doc->getComposition().getNbTracks();
+ int yrNrTracks = yrMaxTrack - yrMinTrack + 1;
+
+ int firstAlteredTrack = yrMinTrack;
+
+ if (options & MERGE_IN_NEW_TRACKS) {
+
+ //!!! worry about instruments and other studio stuff later... if at all
+ command->addCommand(new AddTracksCommand
+ (&getComposition(),
+ yrNrTracks,
+ MidiInstrumentBase,
+ -1));
+
+ firstAlteredTrack = myMaxTrack + 1;
+
+ } else if (yrMaxTrack > myMaxTrack) {
+
+ command->addCommand(new AddTracksCommand
+ (&getComposition(),
+ yrMaxTrack - myMaxTrack,
+ MidiInstrumentBase,
+ -1));
+ }
+
+ TrackId firstNewTrackId = getComposition().getNewTrackId();
+ timeT lastSegmentEndTime = 0;
+
+ for (Composition::iterator i = doc->getComposition().begin(), j = i;
+ i != doc->getComposition().end(); i = j) {
+
+ ++j;
+ Segment *s = *i;
+ timeT segmentEndTime = s->getEndMarkerTime();
+
+ int yrTrack = s->getTrack();
+ Track *t = doc->getComposition().getTrackById(yrTrack);
+ if (t) yrTrack = t->getPosition();
+
+ int myTrack = yrTrack;
+
+ if (options & MERGE_IN_NEW_TRACKS) {
+ myTrack = yrTrack - yrMinTrack + myMaxTrack + 1;
+ }
+
+ doc->getComposition().detachSegment(s);
+
+ if (options & MERGE_AT_END) {
+ s->setStartTime(s->getStartTime() + time0);
+ segmentEndTime += time0;
+ }
+ if (segmentEndTime > lastSegmentEndTime) {
+ lastSegmentEndTime = segmentEndTime;
+ }
+
+ Track *track = getComposition().getTrackByPosition(myTrack);
+ TrackId tid = 0;
+ if (track) tid = track->getId();
+ else tid = firstNewTrackId + yrTrack - yrMinTrack;
+
+ command->addCommand(new SegmentInsertCommand(&getComposition(), s, tid));
+ }
+
+ if (!(options & MERGE_KEEP_OLD_TIMINGS)) {
+ for (int i = getComposition().getTimeSignatureCount() - 1; i >= 0; --i) {
+ getComposition().removeTimeSignature(i);
+ }
+ for (int i = getComposition().getTempoChangeCount() - 1; i >= 0; --i) {
+ getComposition().removeTempoChange(i);
+ }
+ }
+
+ if (options & MERGE_KEEP_NEW_TIMINGS) {
+ for (int i = 0; i < doc->getComposition().getTimeSignatureCount(); ++i) {
+ std::pair<timeT, TimeSignature> ts =
+ doc->getComposition().getTimeSignatureChange(i);
+ getComposition().addTimeSignature(ts.first + time0, ts.second);
+ }
+ for (int i = 0; i < doc->getComposition().getTempoChangeCount(); ++i) {
+ std::pair<timeT, tempoT> t =
+ doc->getComposition().getTempoChange(i);
+ getComposition().addTempoAtTime(t.first + time0, t.second);
+ }
+ }
+
+ if (lastSegmentEndTime > getComposition().getEndMarker()) {
+ command->addCommand(new ChangeCompositionLengthCommand
+ (&getComposition(),
+ getComposition().getStartMarker(),
+ lastSegmentEndTime));
+ }
+
+ m_commandHistory->addCommand(command);
+
+ emit makeTrackVisible(firstAlteredTrack + yrNrTracks/2 + 1);
+}
+
+void RosegardenGUIDoc::clearStudio()
+{
+ QCString replyType;
+ QByteArray replyData;
+ rgapp->sequencerCall("clearStudio()", replyType, replyData);
+ RG_DEBUG << "cleared studio\n";
+}
+
+void RosegardenGUIDoc::initialiseStudio()
+{
+ Profiler profiler("initialiseStudio", true);
+
+ RG_DEBUG << "RosegardenGUIDoc::initialiseStudio - "
+ << "clearing down and initialising" << endl;
+
+ clearStudio();
+
+ InstrumentList list = m_studio.getAllInstruments();
+ InstrumentList::iterator it = list.begin();
+ int audioCount = 0;
+
+ BussList busses = m_studio.getBusses();
+ RecordInList recordIns = m_studio.getRecordIns();
+
+ // To reduce the number of DCOP calls at this stage, we put some
+ // of the float property values in a big list and commit in one
+ // single call at the end. We can only do this with properties
+ // that aren't depended on by other port, connection, or non-float
+ // properties during the initialisation process.
+ MappedObjectIdList ids;
+ MappedObjectPropertyList properties;
+ MappedObjectValueList values;
+
+ std::vector<PluginContainer *> pluginContainers;
+
+ for (unsigned int i = 0; i < busses.size(); ++i) {
+
+ // first one is master
+ MappedObjectId mappedId =
+ StudioControl::createStudioObject(
+ MappedObject::AudioBuss);
+
+ StudioControl::setStudioObjectProperty
+ (mappedId,
+ MappedAudioBuss::BussId,
+ MappedObjectValue(i));
+
+ ids.push_back(mappedId);
+ properties.push_back(MappedAudioBuss::Level);
+ values.push_back(MappedObjectValue(busses[i]->getLevel()));
+
+ ids.push_back(mappedId);
+ properties.push_back(MappedAudioBuss::Pan);
+ values.push_back(MappedObjectValue(busses[i]->getPan()) - 100.0);
+
+ busses[i]->setMappedId(mappedId);
+
+ pluginContainers.push_back(busses[i]);
+ }
+
+ for (unsigned int i = 0; i < recordIns.size(); ++i) {
+
+ MappedObjectId mappedId =
+ StudioControl::createStudioObject(
+ MappedObject::AudioInput);
+
+ StudioControl::setStudioObjectProperty
+ (mappedId,
+ MappedAudioInput::InputNumber,
+ MappedObjectValue(i));
+
+ recordIns[i]->setMappedId(mappedId);
+ }
+
+ for (; it != list.end(); it++) {
+ if ((*it)->getType() == Instrument::Audio ||
+ (*it)->getType() == Instrument::SoftSynth) {
+ MappedObjectId mappedId =
+ StudioControl::createStudioObject(
+ MappedObject::AudioFader);
+
+ // Set the object id against the instrument
+ //
+ (*it)->setMappedId(mappedId);
+
+ /*
+ cout << "SETTING MAPPED OBJECT ID = " << mappedId
+ << " - on Instrument " << (*it)->getId() << endl;
+ */
+
+
+ // Set the instrument id against this object
+ //
+ StudioControl::setStudioObjectProperty
+ (mappedId,
+ MappedObject::Instrument,
+ MappedObjectValue((*it)->getId()));
+
+ // Set the level
+ //
+ ids.push_back(mappedId);
+ properties.push_back(MappedAudioFader::FaderLevel);
+ values.push_back(MappedObjectValue((*it)->getLevel()));
+
+ // Set the record level
+ //
+ ids.push_back(mappedId);
+ properties.push_back(MappedAudioFader::FaderRecordLevel);
+ values.push_back(MappedObjectValue((*it)->getRecordLevel()));
+
+ // Set the number of channels
+ //
+ ids.push_back(mappedId);
+ properties.push_back(MappedAudioFader::Channels);
+ values.push_back(MappedObjectValue((*it)->getAudioChannels()));
+
+ // Set the pan - 0 based
+ //
+ ids.push_back(mappedId);
+ properties.push_back(MappedAudioFader::Pan);
+ values.push_back(MappedObjectValue(float((*it)->getPan())) - 100.0);
+
+ // Set up connections: first clear any existing ones (shouldn't
+ // be necessary, but)
+ //
+ StudioControl::disconnectStudioObject(mappedId);
+
+ // then handle the output connection
+ //
+ BussId outputBuss = (*it)->getAudioOutput();
+ if (outputBuss < busses.size()) {
+ MappedObjectId bmi = busses[outputBuss]->getMappedId();
+
+ if (bmi > 0) {
+ StudioControl::connectStudioObjects(mappedId, bmi);
+ }
+ }
+
+ // then the input
+ //
+ bool isBuss;
+ int channel;
+ int input = (*it)->getAudioInput(isBuss, channel);
+ MappedObjectId rmi = 0;
+
+ if (isBuss) {
+ if (input < int(busses.size())) {
+ rmi = busses[input]->getMappedId();
+ }
+ } else {
+ if (input < int(recordIns.size())) {
+ rmi = recordIns[input]->getMappedId();
+ }
+ }
+
+ ids.push_back(mappedId);
+ properties.push_back(MappedAudioFader::InputChannel);
+ values.push_back(MappedObjectValue(channel));
+
+ if (rmi > 0) {
+ StudioControl::connectStudioObjects(rmi, mappedId);
+ }
+
+ pluginContainers.push_back(*it);
+
+ audioCount++;
+ }
+ }
+
+ for (std::vector<PluginContainer *>::iterator pci =
+ pluginContainers.begin(); pci != pluginContainers.end(); ++pci) {
+
+ // Initialise all the plugins for this Instrument or Buss
+
+ for (PluginInstanceIterator pli = (*pci)->beginPlugins();
+ pli != (*pci)->endPlugins(); ++pli) {
+
+ AudioPluginInstance *plugin = *pli;
+
+ if (plugin->isAssigned()) {
+ // Create the plugin slot at the sequencer Studio
+ //
+ MappedObjectId pluginMappedId =
+ StudioControl::createStudioObject(
+ MappedObject::PluginSlot);
+
+ // Create the back linkage from the instance to the
+ // studio id
+ //
+ plugin->setMappedId(pluginMappedId);
+
+ //RG_DEBUG << "CREATING PLUGIN ID = "
+ //<< pluginMappedId << endl;
+
+ // Set the position
+ StudioControl::setStudioObjectProperty
+ (pluginMappedId,
+ MappedObject::Position,
+ MappedObjectValue(plugin->getPosition()));
+
+ // Set the id of this instrument or buss on the plugin
+ //
+ StudioControl::setStudioObjectProperty
+ (pluginMappedId,
+ MappedObject::Instrument,
+ (*pci)->getId());
+
+ // Set the plugin type id - this will set it up ready
+ // for the rest of the settings. String value, so can't
+ // go in the main property list.
+ //
+ StudioControl::setStudioObjectProperty
+ (pluginMappedId,
+ MappedPluginSlot::Identifier,
+ plugin->getIdentifier().c_str());
+
+ plugin->setConfigurationValue
+ (qstrtostr(PluginIdentifier::RESERVED_PROJECT_DIRECTORY_KEY),
+ getAudioFileManager().getAudioPath());
+
+ // Set opaque string configuration data (e.g. for DSSI plugin)
+ //
+ MappedObjectPropertyList config;
+ for (AudioPluginInstance::ConfigMap::const_iterator
+ i = plugin->getConfiguration().begin();
+ i != plugin->getConfiguration().end(); ++i) {
+ config.push_back(strtoqstr(i->first));
+ config.push_back(strtoqstr(i->second));
+ }
+
+ StudioControl::setStudioObjectPropertyList
+ (pluginMappedId,
+ MappedPluginSlot::Configuration,
+ config);
+
+ // Set the bypass
+ //
+ ids.push_back(pluginMappedId);
+ properties.push_back(MappedPluginSlot::Bypassed);
+ values.push_back(MappedObjectValue(plugin->isBypassed()));
+
+ // Set all the port values
+ //
+ PortInstanceIterator portIt;
+
+ for (portIt = plugin->begin();
+ portIt != plugin->end(); ++portIt) {
+ StudioControl::setStudioPluginPort
+ (pluginMappedId,
+ (*portIt)->number,
+ (*portIt)->value);
+ }
+
+ // Set the program
+ //
+ if (plugin->getProgram() != "") {
+ StudioControl::setStudioObjectProperty
+ (pluginMappedId,
+ MappedPluginSlot::Program,
+ strtoqstr(plugin->getProgram()));
+ }
+
+ // Set the post-program port values
+ //
+ for (portIt = plugin->begin();
+ portIt != plugin->end(); ++portIt) {
+ if ((*portIt)->changedSinceProgramChange) {
+ StudioControl::setStudioPluginPort
+ (pluginMappedId,
+ (*portIt)->number,
+ (*portIt)->value);
+ }
+ }
+ }
+ }
+ }
+
+ // Now commit all the remaining changes
+ StudioControl::setStudioObjectProperties(ids, properties, values);
+
+ KConfig* config = kapp->config();
+ config->setGroup(SequencerOptionsConfigGroup);
+
+ bool faderOuts = config->readBoolEntry("audiofaderouts", false);
+ bool submasterOuts = config->readBoolEntry("audiosubmasterouts", false);
+ unsigned int audioFileFormat = config->readUnsignedNumEntry("audiorecordfileformat", 1);
+
+ MidiByte ports = 0;
+ if (faderOuts) {
+ ports |= MappedEvent::FaderOuts;
+ }
+ if (submasterOuts) {
+ ports |= MappedEvent::SubmasterOuts;
+ }
+ MappedEvent mEports
+ (MidiInstrumentBase,
+ MappedEvent::SystemAudioPorts,
+ ports);
+
+ StudioControl::sendMappedEvent(mEports);
+
+ MappedEvent mEff
+ (MidiInstrumentBase,
+ MappedEvent::SystemAudioFileFormat,
+ audioFileFormat);
+ StudioControl::sendMappedEvent(mEff);
+}
+
+int RosegardenGUIDoc::FILE_FORMAT_VERSION_MAJOR = 1;
+
+int RosegardenGUIDoc::FILE_FORMAT_VERSION_MINOR = 4;
+
+int RosegardenGUIDoc::FILE_FORMAT_VERSION_POINT = 0;
+
+
+
+bool RosegardenGUIDoc::saveDocument(const QString& filename,
+ QString& errMsg,
+ bool autosave)
+{
+ if (!QFileInfo(filename).exists()) { // safe to write directly
+ return saveDocumentActual(filename, errMsg, autosave);
+ }
+
+ KTempFile temp(filename + ".", "", 0644); // will be umask'd
+
+ int status = temp.status();
+ if (status != 0) {
+ errMsg = i18n(QString("Could not create temporary file in directory of '%1': %2").arg(filename).arg(strerror(status)));
+ return false;
+ }
+
+ QString tempFileName = temp.name();
+
+ RG_DEBUG << "Temporary file name is: \"" << tempFileName << "\"" << endl;
+
+ // KTempFile creates a temporary file that is already open: close it
+ if (!temp.close()) {
+ status = temp.status();
+ errMsg = i18n(QString("Failure in temporary file handling for file '%1': %2")
+ .arg(tempFileName).arg(strerror(status)));
+ return false;
+ }
+
+ bool success = saveDocumentActual(tempFileName, errMsg, autosave);
+
+ if (!success) {
+ // errMsg should be already set
+ return false;
+ }
+
+ QDir dir(QFileInfo(tempFileName).dir());
+ if (!dir.rename(tempFileName, filename)) {
+ errMsg = i18n(QString("Failed to rename temporary output file '%1' to desired output file '%2'").arg(tempFileName).arg(filename));
+ return false;
+ }
+
+ return true;
+}
+
+
+bool RosegardenGUIDoc::saveDocumentActual(const QString& filename,
+ QString& errMsg,
+ bool autosave)
+{
+ Profiler profiler("RosegardenGUIDoc::saveDocumentActual");
+ RG_DEBUG << "RosegardenGUIDoc::saveDocumentActual(" << filename << ")\n";
+
+ KFilterDev* fileCompressedDevice = static_cast<KFilterDev*>(KFilterDev::deviceForFile(filename, "application/x-gzip"));
+ fileCompressedDevice->setOrigFileName("audio/x-rosegarden");
+ bool rc = fileCompressedDevice->open(IO_WriteOnly);
+
+ if (!rc) {
+ // do some error report
+ errMsg = i18n(QString("Could not open file '%1' for writing").arg(filename));
+ delete fileCompressedDevice;
+ return false; // couldn't open file
+ }
+
+
+ QTextStream outStream(fileCompressedDevice);
+ outStream.setEncoding(QTextStream::UnicodeUTF8);
+
+ // output XML header
+ //
+ outStream << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+ << "<!DOCTYPE rosegarden-data>\n"
+ << "<rosegarden-data version=\"" << VERSION
+ << "\" format-version-major=\"" << FILE_FORMAT_VERSION_MAJOR
+ << "\" format-version-minor=\"" << FILE_FORMAT_VERSION_MINOR
+ << "\" format-version-point=\"" << FILE_FORMAT_VERSION_POINT
+ << "\">\n";
+
+ ProgressDialog *progressDlg = 0;
+ KProgress *progress = 0;
+
+ if (!autosave) {
+
+ progressDlg = new ProgressDialog(i18n("Saving file..."),
+ 100,
+ (QWidget*)parent());
+ progress = progressDlg->progressBar();
+
+ progressDlg->setMinimumDuration(500);
+ progressDlg->setAutoReset(true);
+
+ } else {
+
+ progress = ((RosegardenGUIApp *)parent())->getProgressBar();
+ }
+
+ // Send out Composition (this includes Tracks, Instruments, Tempo
+ // and Time Signature changes and any other sub-objects)
+ //
+ outStream << strtoqstr(getComposition().toXmlString())
+ << endl << endl;
+
+ outStream << strtoqstr(getAudioFileManager().toXmlString())
+ << endl << endl;
+
+ outStream << strtoqstr(getConfiguration().toXmlString())
+ << endl << endl;
+
+ long totalEvents = 0;
+ for (Composition::iterator segitr = m_composition.begin();
+ segitr != m_composition.end(); ++segitr) {
+ totalEvents += (*segitr)->size();
+ }
+
+ for (Composition::triggersegmentcontaineriterator ci =
+ m_composition.getTriggerSegments().begin();
+ ci != m_composition.getTriggerSegments().end(); ++ci) {
+ totalEvents += (*ci)->getSegment()->size();
+ }
+
+ // output all elements
+ //
+ // Iterate on segments
+ long eventCount = 0;
+
+ for (Composition::iterator segitr = m_composition.begin();
+ segitr != m_composition.end(); ++segitr) {
+
+ Segment *segment = *segitr;
+
+ saveSegment(outStream, segment, progress, totalEvents, eventCount);
+
+ }
+
+ // Put a break in the file
+ //
+ outStream << endl << endl;
+
+ for (Composition::triggersegmentcontaineriterator ci =
+ m_composition.getTriggerSegments().begin();
+ ci != m_composition.getTriggerSegments().end(); ++ci) {
+
+ QString triggerAtts = QString
+ ("triggerid=\"%1\" triggerbasepitch=\"%2\" triggerbasevelocity=\"%3\" triggerretune=\"%4\" triggeradjusttimes=\"%5\" ")
+ .arg((*ci)->getId())
+ .arg((*ci)->getBasePitch())
+ .arg((*ci)->getBaseVelocity())
+ .arg((*ci)->getDefaultRetune())
+ .arg(strtoqstr((*ci)->getDefaultTimeAdjust()));
+
+ Segment *segment = (*ci)->getSegment();
+ saveSegment(outStream, segment, progress, totalEvents, eventCount, triggerAtts);
+ }
+
+ // Put a break in the file
+ //
+ outStream << endl << endl;
+
+ // Send out the studio - a self contained command
+ //
+ outStream << strtoqstr(m_studio.toXmlString()) << endl << endl;
+
+
+ // Send out the appearance data
+ outStream << "<appearance>" << endl;
+ outStream << strtoqstr(getComposition().getSegmentColourMap().toXmlString("segmentmap"));
+ outStream << strtoqstr(getComposition().getGeneralColourMap().toXmlString("generalmap"));
+ outStream << "</appearance>" << endl << endl << endl;
+
+ // close the top-level XML tag
+ //
+ outStream << "</rosegarden-data>\n";
+
+ // check that all went ok
+ //
+ if (fileCompressedDevice->status() != IO_Ok) {
+ errMsg = i18n(QString("Error while writing on '%1'").arg(filename));
+ delete fileCompressedDevice;
+ return false;
+ }
+
+ fileCompressedDevice->close();
+
+ delete fileCompressedDevice; // DO NOT USE outStream AFTER THIS POINT
+
+ RG_DEBUG << endl << "RosegardenGUIDoc::saveDocument() finished\n";
+
+ if (!autosave) {
+ emit documentModified(false);
+ setModified(false);
+ m_commandHistory->documentSaved();
+ delete progressDlg;
+ } else {
+ progress->setProgress(0);
+ }
+
+ setAutoSaved(true);
+
+ return true;
+}
+
+bool RosegardenGUIDoc::exportStudio(const QString& filename,
+ std::vector<DeviceId> devices)
+{
+ Profiler profiler("RosegardenGUIDoc::exportStudio");
+ RG_DEBUG << "RosegardenGUIDoc::exportStudio("
+ << filename << ")\n";
+
+ KFilterDev* fileCompressedDevice = static_cast<KFilterDev*>(KFilterDev::deviceForFile(filename, "application/x-gzip"));
+ fileCompressedDevice->setOrigFileName("audio/x-rosegarden-device");
+ fileCompressedDevice->open(IO_WriteOnly);
+ QTextStream outStream(fileCompressedDevice);
+ outStream.setEncoding(QTextStream::UnicodeUTF8);
+
+ // output XML header
+ //
+ outStream << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+ << "<!DOCTYPE rosegarden-data>\n"
+ << "<rosegarden-data version=\"" << VERSION << "\">\n";
+
+ // Send out the studio - a self contained command
+ //
+ outStream << strtoqstr(m_studio.toXmlString(devices)) << endl << endl;
+
+ // close the top-level XML tag
+ //
+ outStream << "</rosegarden-data>\n";
+
+ delete fileCompressedDevice;
+
+ RG_DEBUG << endl << "RosegardenGUIDoc::exportStudio() finished\n";
+ return true;
+}
+
+void RosegardenGUIDoc::saveSegment(QTextStream& outStream, Segment *segment,
+ KProgress* progress, long totalEvents, long &count,
+ QString extraAttributes)
+{
+ QString time;
+
+ outStream << QString("<segment track=\"%1\" start=\"%2\" ")
+ .arg(segment->getTrack())
+ .arg(segment->getStartTime());
+
+ if (extraAttributes)
+ outStream << extraAttributes << " ";
+
+ outStream << "label=\"" <<
+ strtoqstr(XmlExportable::encode(segment->getLabel()));
+
+ if (segment->isRepeating()) {
+ outStream << "\" repeat=\"true";
+ }
+
+ if (segment->getTranspose() != 0) {
+ outStream << "\" transpose=\"" << segment->getTranspose();
+ }
+
+ if (segment->getDelay() != 0) {
+ outStream << "\" delay=\"" << segment->getDelay();
+ }
+
+ if (segment->getRealTimeDelay() != RealTime::zeroTime) {
+ outStream << "\" rtdelaysec=\"" << segment->getRealTimeDelay().sec
+ << "\" rtdelaynsec=\"" << segment->getRealTimeDelay().nsec;
+ }
+
+ if (segment->getColourIndex() != 0) {
+ outStream << "\" colourindex=\"" << segment->getColourIndex();
+ }
+
+ if (segment->getSnapGridSize() != -1) {
+ outStream << "\" snapgridsize=\"" << segment->getSnapGridSize();
+ }
+
+ if (segment->getViewFeatures() != 0) {
+ outStream << "\" viewfeatures=\"" << segment->getViewFeatures();
+ }
+
+ const timeT *endMarker = segment->getRawEndMarkerTime();
+ if (endMarker) {
+ outStream << "\" endmarker=\"" << *endMarker;
+ }
+
+ if (segment->getType() == Segment::Audio) {
+
+ outStream << "\" type=\"audio\" "
+ << "file=\""
+ << segment->getAudioFileId();
+
+ if (segment->getStretchRatio() != 1.f &&
+ segment->getStretchRatio() != 0.f) {
+
+ outStream << "\" unstretched=\""
+ << segment->getUnstretchedFileId()
+ << "\" stretch=\""
+ << segment->getStretchRatio();
+ }
+
+ outStream << "\">\n";
+
+ // convert out - should do this as XmlExportable really
+ // once all this code is centralised
+ //
+ time.sprintf("%d.%06d", segment->getAudioStartTime().sec,
+ segment->getAudioStartTime().usec());
+
+ outStream << " <begin index=\""
+ << time
+ << "\"/>\n";
+
+ time.sprintf("%d.%06d", segment->getAudioEndTime().sec,
+ segment->getAudioEndTime().usec());
+
+ outStream << " <end index=\""
+ << time
+ << "\"/>\n";
+
+ if (segment->isAutoFading()) {
+ time.sprintf("%d.%06d", segment->getFadeInTime().sec,
+ segment->getFadeInTime().usec());
+
+ outStream << " <fadein time=\""
+ << time
+ << "\"/>\n";
+
+ time.sprintf("%d.%06d", segment->getFadeOutTime().sec,
+ segment->getFadeOutTime().usec());
+
+ outStream << " <fadeout time=\""
+ << time
+ << "\"/>\n";
+ }
+
+ } else // Internal type
+ {
+ outStream << "\">\n";
+
+ bool inChord = false;
+ timeT chordStart = 0, chordDuration = 0;
+ timeT expectedTime = segment->getStartTime();
+
+ for (Segment::iterator i = segment->begin();
+ i != segment->end(); ++i) {
+
+ timeT absTime = (*i)->getAbsoluteTime();
+
+ Segment::iterator nextEl = i;
+ ++nextEl;
+
+ if (nextEl != segment->end() &&
+ (*nextEl)->getAbsoluteTime() == absTime &&
+ (*i)->getDuration() != 0 &&
+ !inChord) {
+ outStream << "<chord>" << endl;
+ inChord = true;
+ chordStart = absTime;
+ chordDuration = 0;
+ }
+
+ if (inChord && (*i)->getDuration() > 0)
+ if (chordDuration == 0 || (*i)->getDuration() < chordDuration)
+ chordDuration = (*i)->getDuration();
+
+ outStream << '\t'
+ << strtoqstr((*i)->toXmlString(expectedTime)) << endl;
+
+ if (nextEl != segment->end() &&
+ (*nextEl)->getAbsoluteTime() != absTime &&
+ inChord) {
+ outStream << "</chord>\n";
+ inChord = false;
+ expectedTime = chordStart + chordDuration;
+ } else if (inChord) {
+ expectedTime = absTime;
+ } else {
+ expectedTime = absTime + (*i)->getDuration();
+ }
+
+ if ((++count % 500 == 0) && progress) {
+ progress->setValue(count * 100 / totalEvents);
+ }
+ }
+
+ if (inChord) {
+ outStream << "</chord>\n";
+ }
+
+ // Add EventRulers to segment - we call them controllers because of
+ // a historical mistake in naming them. My bad. RWB.
+ //
+ Segment::EventRulerList list = segment->getEventRulerList();
+
+ if (list.size()) {
+ outStream << "<gui>\n"; // gui elements
+ Segment::EventRulerListConstIterator it;
+ for (it = list.begin(); it != list.end(); ++it) {
+ outStream << " <controller type=\"" << strtoqstr((*it)->m_type);
+
+ if ((*it)->m_type == Controller::EventType) {
+ outStream << "\" value =\"" << (*it)->m_controllerValue;
+ }
+
+ outStream << "\"/>\n";
+ }
+ outStream << "</gui>\n";
+ }
+
+ }
+
+
+ outStream << "</segment>\n"; //-------------------------
+
+}
+
+bool RosegardenGUIDoc::isSequencerRunning()
+{
+ RosegardenGUIApp* parentApp = dynamic_cast<RosegardenGUIApp*>(parent());
+ if (!parentApp) {
+ RG_DEBUG << "RosegardenGUIDoc::isSequencerRunning() : parentApp == 0\n";
+ return false;
+ }
+
+ return parentApp->isSequencerRunning();
+}
+
+bool
+RosegardenGUIDoc::xmlParse(QString fileContents, QString &errMsg,
+ ProgressDialog *progress,
+ unsigned int elementCount,
+ bool permanent,
+ bool &cancelled)
+{
+ cancelled = false;
+
+ RoseXmlHandler handler(this, elementCount, permanent);
+
+ if (progress) {
+ connect(&handler, SIGNAL(setProgress(int)),
+ progress->progressBar(), SLOT(setValue(int)));
+ connect(&handler, SIGNAL(setOperationName(QString)),
+ progress, SLOT(slotSetOperationName(QString)));
+ connect(&handler, SIGNAL(incrementProgress(int)),
+ progress->progressBar(), SLOT(advance(int)));
+ connect(progress, SIGNAL(cancelClicked()),
+ &handler, SLOT(slotCancel()));
+ }
+
+ QXmlInputSource source;
+ source.setData(fileContents);
+ QXmlSimpleReader reader;
+ reader.setContentHandler(&handler);
+ reader.setErrorHandler(&handler);
+
+ START_TIMING;
+ bool ok = reader.parse(source);
+ PRINT_ELAPSED("RosegardenGUIDoc::xmlParse (reader.parse())");
+
+ if (!ok) {
+
+ if (handler.isCancelled()) {
+ RG_DEBUG << "File load cancelled\n";
+ KStartupLogo::hideIfStillThere();
+ KMessageBox::information(0, i18n("File load cancelled"));
+ cancelled = true;
+ return true;
+ } else {
+ errMsg = handler.errorString();
+ }
+
+ } else {
+
+ if (getSequenceManager() &&
+ !(getSequenceManager()->getSoundDriverStatus() & AUDIO_OK)) {
+
+ KStartupLogo::hideIfStillThere();
+ CurrentProgressDialog::freeze();
+
+ if (handler.hasActiveAudio() ||
+ (m_pluginManager && !handler.pluginsNotFound().empty())) {
+
+#ifdef HAVE_LIBJACK
+ KMessageBox::information
+ (0, i18n("<h3>Audio and plugins not available</h3><p>This composition uses audio files or plugins, but Rosegarden is currently running without audio because the JACK audio server was not available on startup.</p><p>Please exit Rosegarden, start the JACK audio server and re-start Rosegarden if you wish to load this complete composition.</p><p><b>WARNING:</b> If you re-save this composition, all audio and plugin data and settings in it will be lost.</p>"));
+#else
+ KMessageBox::information
+ (0, i18n("<h3>Audio and plugins not available</h3><p>This composition uses audio files or plugins, but you are running a version of Rosegarden that was compiled without audio support.</p><p><b>WARNING:</b> If you re-save this composition from this version of Rosegarden, all audio and plugin data and settings in it will be lost.</p>"));
+#endif
+ }
+ CurrentProgressDialog::thaw();
+
+ } else {
+
+ bool shownWarning = false;
+
+ int sr = 0;
+ if (getSequenceManager()) {
+ sr = getSequenceManager()->getSampleRate();
+ }
+
+ int er = m_audioFileManager.getExpectedSampleRate();
+
+ std::set<int> rates = m_audioFileManager.getActualSampleRates();
+ bool other = false;
+ bool mixed = (rates.size() > 1);
+ for (std::set<int>::iterator i = rates.begin();
+ i != rates.end(); ++i) {
+ if (*i != sr) {
+ other = true;
+ break;
+ }
+ }
+
+ if (sr != 0 &&
+ handler.hasActiveAudio() &&
+ ((er != 0 && er != sr) ||
+ (other && !mixed))) {
+
+ if (er == 0) er = *rates.begin();
+
+ KStartupLogo::hideIfStillThere();
+ CurrentProgressDialog::freeze();
+
+ KMessageBox::information(0, i18n("<h3>Incorrect audio sample rate</h3><p>This composition contains audio files that were recorded or imported with the audio server running at a different sample rate (%1 Hz) from the current JACK server sample rate (%2 Hz).</p><p>Rosegarden will play this composition at the correct speed, but any audio files in it will probably sound awful.</p><p>Please consider re-starting the JACK server at the correct rate (%3 Hz) and re-loading this composition before you do any more work with it.</p>").arg(er).arg(sr).arg(er));
+
+ CurrentProgressDialog::thaw();
+ shownWarning = true;
+
+ } else if (sr != 0 && mixed) {
+
+ KStartupLogo::hideIfStillThere();
+ CurrentProgressDialog::freeze();
+
+ KMessageBox::information(0, i18n("<h3>Inconsistent audio sample rates</h3><p>This composition contains audio files at more than one sample rate.</p><p>Rosegarden will play them at the correct speed, but any audio files that were recorded or imported at rates different from the current JACK server sample rate (%1 Hz) will probably sound awful.</p><p>Please see the audio file manager dialog for more details, and consider resampling any files that are at the wrong rate.</p>").arg(sr),
+ i18n("Inconsistent sample rates"),
+ "file-load-inconsistent-samplerates");
+
+ CurrentProgressDialog::thaw();
+ shownWarning = true;
+ }
+
+ if (m_pluginManager && !handler.pluginsNotFound().empty()) {
+
+ // We only warn if a plugin manager is present, so as
+ // to avoid warnings when importing a studio from
+ // another file (which is the normal case in which we
+ // have no plugin manager).
+
+ QString msg(i18n("<h3>Plugins not found</h3><p>The following audio plugins could not be loaded:</p><ul>"));
+
+ for (std::set<QString>::iterator i = handler.pluginsNotFound().begin();
+ i != handler.pluginsNotFound().end(); ++i) {
+ QString ident = *i;
+ QString type, soName, label;
+ PluginIdentifier::parseIdentifier(ident, type, soName, label);
+ QString pluginFileName = QFileInfo(soName).fileName();
+ msg += i18n("<li>%1 (from %2)</li>").arg(label).arg(pluginFileName);
+ }
+ msg += "</ul>";
+
+ KStartupLogo::hideIfStillThere();
+ CurrentProgressDialog::freeze();
+ KMessageBox::information(0, msg);
+ CurrentProgressDialog::thaw();
+ shownWarning = true;
+
+ }
+
+ if (handler.isDeprecated() && !shownWarning) {
+
+ QString msg(i18n("This file contains one or more old element types that are now deprecated.\nSupport for these elements may disappear in future versions of Rosegarden.\nWe recommend you re-save this file from this version of Rosegarden to ensure that it can still be re-loaded in future versions."));
+ slotDocumentModified(); // so file can be re-saved immediately
+
+ KStartupLogo::hideIfStillThere();
+ CurrentProgressDialog::freeze();
+ KMessageBox::information(0, msg);
+ CurrentProgressDialog::thaw();
+ }
+ }
+ }
+
+ return ok;
+}
+
+void
+RosegardenGUIDoc::insertRecordedMidi(const MappedComposition &mC)
+{
+ RG_DEBUG << "RosegardenGUIDoc::insertRecordedMidi: " << mC.size() << " events" << endl;
+
+ // Just create a new record Segment if we don't have one already.
+ // Make sure we don't recreate the record segment if it's already
+ // freed.
+ //
+
+ //Track *midiRecordTrack = 0;
+
+ const Composition::recordtrackcontainer &tr =
+ getComposition().getRecordTracks();
+
+ bool haveMIDIRecordTrack = false;
+
+ for (Composition::recordtrackcontainer::const_iterator i =
+ tr.begin(); i != tr.end(); ++i) {
+ TrackId tid = (*i);
+ Track *track = getComposition().getTrackById(tid);
+ if (track) {
+ Instrument *instrument =
+ m_studio.getInstrumentById(track->getInstrument());
+ if (instrument->getType() == Instrument::Midi ||
+ instrument->getType() == Instrument::SoftSynth) {
+ haveMIDIRecordTrack = true;
+ if (!m_recordMIDISegments[track->getInstrument()]) {
+ addRecordMIDISegment(track->getId());
+ }
+ break;
+ }
+ }
+ }
+
+ if (!haveMIDIRecordTrack)
+ return ;
+
+ if (mC.size() > 0) {
+ MappedComposition::const_iterator i;
+ Event *rEvent = 0;
+ timeT duration, absTime;
+ timeT updateFrom = m_composition.getDuration();
+ bool haveNotes = false;
+
+ // process all the incoming MappedEvents
+ //
+ for (i = mC.begin(); i != mC.end(); ++i) {
+ if ((*i)->getRecordedDevice() == Device::CONTROL_DEVICE) {
+ // send to GUI
+ RosegardenGUIView *v;
+ for (v = m_viewList.first(); v != 0; v = m_viewList.next()) {
+ v->slotControllerDeviceEventReceived(*i);
+ }
+ continue;
+ }
+
+ absTime = m_composition.getElapsedTimeForRealTime((*i)->getEventTime());
+
+ /* This is incorrect, unless the tempo at absTime happens to
+ be the same as the tempo at zero and there are no tempo
+ changes within the given duration after either zero or
+ absTime
+
+ duration = m_composition.getElapsedTimeForRealTime((*i)->getDuration());
+ */
+ duration = m_composition.
+ getElapsedTimeForRealTime((*i)->getEventTime() +
+ (*i)->getDuration()) - absTime;
+
+ rEvent = 0;
+ bool isNoteOn = false;
+ int pitch = 0;
+ int channel = (*i)->getRecordedChannel();
+ int device = (*i)->getRecordedDevice();
+
+ TrackId tid = (*i)->getTrackId();
+ Track *track = getComposition().getTrackById(tid);
+
+ switch ((*i)->getType()) {
+ case MappedEvent::MidiNote:
+
+ // adjust the notation by the opposite of track transpose so the
+ // resulting recording will play correctly, and notation will
+ // read correctly; tentative fix for #1597279
+ pitch = (*i)->getPitch() - track->getTranspose();
+
+ if ((*i)->getDuration() < RealTime::zeroTime) {
+
+ // it's a note-on; give it a default duration
+ // for insertion into the segment, and make a
+ // mental note to stick it in the note-on map
+ // for when we see the corresponding note-off
+
+ duration =
+ Note(Note::Crotchet).getDuration();
+ isNoteOn = true;
+
+ rEvent = new Event(Note::EventType,
+ absTime,
+ duration);
+
+ rEvent->set
+ <Int>(PITCH, pitch);
+ rEvent->set
+ <Int>(VELOCITY, (*i)->getVelocity());
+
+ } else {
+
+ // it's a note-off
+
+ //NoteOnMap::iterator mi = m_noteOnEvents.find((*i)->getPitch());
+ PitchMap *pm = &m_noteOnEvents[device][channel];
+ PitchMap::iterator mi = pm->find(pitch);
+
+ if (mi != pm->end()) {
+ // modify the previously held note-on event,
+ // instead of assigning to rEvent
+ NoteOnRecSet rec_vec = mi->second;
+ Event *oldEv = *rec_vec[0].m_segmentIterator;
+ Event *newEv = new Event
+ (*oldEv, oldEv->getAbsoluteTime(), duration);
+
+ newEv->set
+ <Int>(RECORDED_CHANNEL, channel);
+ NoteOnRecSet *replaced =
+ replaceRecordedEvent(rec_vec, newEv);
+ delete replaced;
+ pm->erase(mi);
+ if (updateFrom > newEv->getAbsoluteTime()) {
+ updateFrom = newEv->getAbsoluteTime();
+ }
+ haveNotes = true;
+ delete newEv;
+ // at this point we could quantize the bar if we were
+ // tracking in a notation view
+ } else {
+ std::cerr << " WARNING: NOTE OFF received without corresponding NOTE ON" << std::endl;
+ }
+ }
+
+ break;
+
+ case MappedEvent::MidiPitchBend:
+ rEvent = PitchBend
+ ((*i)->getData1(), (*i)->getData2()).getAsEvent(absTime);
+ rEvent->set
+ <Int>(RECORDED_CHANNEL, channel);
+ break;
+
+ case MappedEvent::MidiController:
+ rEvent = Controller
+ ((*i)->getData1(), (*i)->getData2()).getAsEvent(absTime);
+ rEvent->set
+ <Int>(RECORDED_CHANNEL, channel);
+ break;
+
+ case MappedEvent::MidiProgramChange:
+ RG_DEBUG << "RosegardenGUIDoc::insertRecordedMidi()"
+ << " - got Program Change (unsupported)"
+ << endl;
+ break;
+
+ case MappedEvent::MidiKeyPressure:
+ rEvent = KeyPressure
+ ((*i)->getData1(), (*i)->getData2()).getAsEvent(absTime);
+ rEvent->set
+ <Int>(RECORDED_CHANNEL, channel);
+ break;
+
+ case MappedEvent::MidiChannelPressure:
+ rEvent = ChannelPressure
+ ((*i)->getData1()).getAsEvent(absTime);
+ rEvent->set
+ <Int>(RECORDED_CHANNEL, channel);
+ break;
+
+ case MappedEvent::MidiSystemMessage:
+ channel = -1;
+ if ((*i)->getData1() == MIDI_SYSTEM_EXCLUSIVE) {
+ rEvent = SystemExclusive
+ (DataBlockRepository::getDataBlockForEvent((*i))).getAsEvent(absTime);
+ }
+
+ // Ignore other SystemMessage events for the moment
+ //
+
+ break;
+
+ case MappedEvent::MidiNoteOneShot:
+ RG_DEBUG << "RosegardenGUIDoc::insertRecordedMidi() - "
+ << "GOT UNEXPECTED MappedEvent::MidiNoteOneShot"
+ << endl;
+ break;
+
+ // Audio control signals - ignore these
+ case MappedEvent::Audio:
+ case MappedEvent::AudioCancel:
+ case MappedEvent::AudioLevel:
+ case MappedEvent::AudioStopped:
+ case MappedEvent::AudioGeneratePreview:
+ case MappedEvent::SystemUpdateInstruments:
+ break;
+
+ default:
+ RG_DEBUG << "RosegardenGUIDoc::insertRecordedMidi() - "
+ << "GOT UNSUPPORTED MAPPED EVENT"
+ << endl;
+ break;
+ }
+
+ // sanity check
+ //
+ if (rEvent == 0)
+ continue;
+
+ // Set the recorded input port
+ //
+ rEvent->set
+ <Int>(RECORDED_PORT, device);
+
+ // Set the proper start index (if we haven't before)
+ //
+ for ( RecordingSegmentMap::const_iterator it = m_recordMIDISegments.begin();
+ it != m_recordMIDISegments.end(); ++it) {
+ Segment *recordMIDISegment = it->second;
+ if (recordMIDISegment->size() == 0) {
+ recordMIDISegment->setStartTime (m_composition.getBarStartForTime(absTime));
+ recordMIDISegment->fillWithRests(absTime);
+ }
+ }
+
+ // Now insert the new event
+ //
+ insertRecordedEvent(rEvent, device, channel, isNoteOn);
+ delete rEvent;
+ }
+
+ if (haveNotes) {
+
+ KConfig* config = kapp->config();
+ config->setGroup(GeneralOptionsConfigGroup);
+
+ int tracking = config->readUnsignedNumEntry("recordtracking", 0);
+ if (tracking == 1) { // notation
+ for ( RecordingSegmentMap::const_iterator it = m_recordMIDISegments.begin();
+ it != m_recordMIDISegments.end(); ++it) {
+ Segment *recordMIDISegment = it->second;
+
+ EventQuantizeCommand *command = new EventQuantizeCommand
+ (*recordMIDISegment,
+ updateFrom,
+ recordMIDISegment->getEndTime(),
+ "Notation Options",
+ true);
+ // don't add to history
+ command->execute();
+ }
+ }
+
+ // this signal is currently unused - leaving just in case
+ // recording segments are updated through the SegmentObserver::eventAdded() interface
+ // emit recordMIDISegmentUpdated(m_recordMIDISegment, updateFrom);
+ }
+ }
+}
+
+void
+RosegardenGUIDoc::updateRecordingMIDISegment()
+{
+ //RG_DEBUG << "RosegardenGUIDoc::updateRecordingMIDISegment" << endl;
+
+ if (m_recordMIDISegments.size() == 0) {
+ // make this call once to create one
+ insertRecordedMidi(MappedComposition());
+ if (m_recordMIDISegments.size() == 0)
+ return ; // not recording any MIDI
+ }
+
+ //RG_DEBUG << "RosegardenGUIDoc::updateRecordingMIDISegment: have record MIDI segment" << endl;
+
+ NoteOnMap tweakedNoteOnEvents;
+ for (NoteOnMap::iterator mi = m_noteOnEvents.begin();
+ mi != m_noteOnEvents.end(); ++mi)
+ for (ChanMap::iterator cm = mi->second.begin();
+ cm != mi->second.end(); ++cm)
+ for (PitchMap::iterator pm = cm->second.begin();
+ pm != cm->second.end(); ++pm) {
+
+ // anything in the note-on map should be tweaked so as to end
+ // at the recording pointer
+ NoteOnRecSet rec_vec = pm->second;
+ if (rec_vec.size() > 0) {
+ Event *oldEv = *rec_vec[0].m_segmentIterator;
+ Event *newEv = new Event(
+ *oldEv, oldEv->getAbsoluteTime(),
+ m_composition.getPosition() - oldEv->getAbsoluteTime() );
+
+ tweakedNoteOnEvents[mi->first][cm->first][pm->first] =
+ *replaceRecordedEvent(rec_vec, newEv);
+ delete newEv;
+ }
+ }
+ m_noteOnEvents = tweakedNoteOnEvents;
+}
+
+RosegardenGUIDoc::NoteOnRecSet *
+
+RosegardenGUIDoc::replaceRecordedEvent(NoteOnRecSet& rec_vec, Event *fresh)
+{
+ NoteOnRecSet *new_vector = new NoteOnRecSet();
+ for ( NoteOnRecSet::const_iterator i = rec_vec.begin(); i != rec_vec.end(); ++i) {
+ Segment *recordMIDISegment = i->m_segment;
+ recordMIDISegment->erase(i->m_segmentIterator);
+ NoteOnRec noteRec;
+ noteRec.m_segment = recordMIDISegment;
+ noteRec.m_segmentIterator = recordMIDISegment->insert(new Event(*fresh));
+ new_vector->push_back(noteRec);
+ }
+ return new_vector;
+}
+
+void
+RosegardenGUIDoc::storeNoteOnEvent(Segment *s, Segment::iterator it, int device, int channel)
+{
+ NoteOnRec record;
+ record.m_segment = s;
+ record.m_segmentIterator = it;
+ int pitch = (*it)->get
+ <Int>(PITCH);
+ m_noteOnEvents[device][channel][pitch].push_back(record);
+}
+
+void
+RosegardenGUIDoc::insertRecordedEvent(Event *ev, int device, int channel, bool isNoteOn)
+{
+ Segment::iterator it;
+ for ( RecordingSegmentMap::const_iterator i = m_recordMIDISegments.begin();
+ i != m_recordMIDISegments.end(); ++i) {
+ Segment *recordMIDISegment = i->second;
+ TrackId tid = recordMIDISegment->getTrack();
+ Track *track = getComposition().getTrackById(tid);
+ if (track) {
+ //Instrument *instrument =
+ // m_studio.getInstrumentById(track->getInstrument());
+ int chan_filter = track->getMidiInputChannel();
+ int dev_filter = track->getMidiInputDevice();
+ if (((chan_filter < 0) || (chan_filter == channel)) &&
+ ((dev_filter == int(Device::ALL_DEVICES)) || (dev_filter == device))) {
+ it = recordMIDISegment->insert(new Event(*ev));
+ if (isNoteOn) {
+ storeNoteOnEvent(recordMIDISegment, it, device, channel);
+ }
+ RG_DEBUG << "RosegardenGUIDoc::insertRecordedEvent() - matches filter" << endl;
+ } else {
+ RG_DEBUG << "RosegardenGUIDoc::insertRecordedEvent() - unmatched event discarded" << endl;
+ }
+ }
+ }
+}
+
+void
+RosegardenGUIDoc::stopRecordingMidi()
+{
+ RG_DEBUG << "RosegardenGUIDoc::stopRecordingMidi" << endl;
+
+ Composition &c = getComposition();
+
+ timeT endTime = c.getBarEnd(0);
+
+ bool haveMeaning = false;
+ timeT earliestMeaning = 0;
+
+ std::vector<RecordingSegmentMap::iterator> toErase;
+
+ for (RecordingSegmentMap::iterator i = m_recordMIDISegments.begin();
+ i != m_recordMIDISegments.end();
+ ++i) {
+
+ Segment *s = i->second;
+
+ bool meaningless = true;
+
+ for (Segment::iterator i = s->begin(); i != s->end(); ++i) {
+
+ if ((*i)->isa(Clef::EventType)) continue;
+
+ // no rests in the segment yet, so anything else is meaningful
+ meaningless = false;
+
+ if (!haveMeaning || (*i)->getAbsoluteTime() < earliestMeaning) {
+ earliestMeaning = (*i)->getAbsoluteTime();
+ }
+
+ haveMeaning = true;
+ break;
+ }
+
+ if (meaningless) {
+ if (!c.deleteSegment(s)) delete s;
+ toErase.push_back(i);
+ } else {
+ if (endTime < s->getEndTime()) {
+ endTime = s->getEndTime();
+ }
+ }
+ }
+
+ for (int i = 0; i < toErase.size(); ++i) {
+ m_recordMIDISegments.erase(toErase[i]);
+ }
+
+ if (!haveMeaning) return;
+
+ RG_DEBUG << "RosegardenGUIDoc::stopRecordingMidi: have something" << endl;
+
+ // adjust the clef timings so as not to leave a clef stranded at
+ // the start of an otherwise empty count-in
+
+ timeT meaningfulBarStart = c.getBarStartForTime(earliestMeaning);
+
+ for (RecordingSegmentMap::iterator i = m_recordMIDISegments.begin();
+ i != m_recordMIDISegments.end();
+ ++i) {
+
+ Segment *s = i->second;
+ Segment::iterator i = s->begin();
+
+ if (i == s->end() || !(*i)->isa(Clef::EventType)) continue;
+
+ if ((*i)->getAbsoluteTime() < meaningfulBarStart) {
+ Event *e = new Event(**i, meaningfulBarStart);
+ s->erase(i);
+ s->insert(e);
+ }
+ }
+
+ for (NoteOnMap::iterator mi = m_noteOnEvents.begin();
+ mi != m_noteOnEvents.end(); ++mi) {
+
+ for (ChanMap::iterator cm = mi->second.begin();
+ cm != mi->second.end(); ++cm) {
+
+ for (PitchMap::iterator pm = cm->second.begin();
+ pm != cm->second.end(); ++pm) {
+
+ // anything remaining in the note-on map should be
+ // made to end at the end of the segment
+
+ NoteOnRecSet rec_vec = pm->second;
+
+ if (rec_vec.size() > 0) {
+ Event *oldEv = *rec_vec[0].m_segmentIterator;
+ Event *newEv = new Event
+ (*oldEv, oldEv->getAbsoluteTime(),
+ endTime - oldEv->getAbsoluteTime());
+ NoteOnRecSet *replaced =
+ replaceRecordedEvent(rec_vec, newEv);
+ delete newEv;
+ delete replaced;
+ }
+ }
+ }
+ }
+ m_noteOnEvents.clear();
+
+ while (!m_recordMIDISegments.empty()) {
+
+ Segment *s = m_recordMIDISegments.begin()->second;
+ m_recordMIDISegments.erase(m_recordMIDISegments.begin());
+
+ // the record segment will have already been added to the
+ // composition if there was anything in it; otherwise we don't
+ // need to do so
+
+ if (s->getComposition() == 0) {
+ delete s;
+ continue;
+ }
+
+ // Quantize for notation only -- doesn't affect performance timings.
+ KMacroCommand *command = new KMacroCommand(i18n("Insert Recorded MIDI"));
+
+ command->addCommand(new EventQuantizeCommand
+ (*s,
+ s->getStartTime(),
+ s->getEndTime(),
+ "Notation Options",
+ true));
+
+ command->addCommand(new NormalizeRestsCommand
+ (*s,
+ c.getBarStartForTime(s->getStartTime()),
+ c.getBarEndForTime(s->getEndTime())));
+
+ command->addCommand(new SegmentRecordCommand(s));
+
+ m_commandHistory->addCommand(command);
+ }
+
+ emit stoppedMIDIRecording();
+
+ slotUpdateAllViews(0);
+}
+
+void
+RosegardenGUIDoc::prepareAudio()
+{
+ if (!isSequencerRunning())
+ return ;
+
+ QCString replyType;
+ QByteArray replyData;
+
+ // Clear down the sequencer AudioFilePlayer object
+ //
+ rgapp->sequencerSend("clearAllAudioFiles()");
+
+ for (AudioFileManagerIterator it = m_audioFileManager.begin();
+ it != m_audioFileManager.end(); it++) {
+
+ QByteArray data;
+ QDataStream streamOut(data, IO_WriteOnly);
+
+ // We have to pass the filename as a QString
+ //
+ streamOut << QString(strtoqstr((*it)->getFilename()));
+ streamOut << (int)(*it)->getId();
+
+ rgapp->sequencerCall("addAudioFile(QString, int)", replyType, replyData, data);
+ QDataStream streamIn(replyData, IO_ReadOnly);
+ int result;
+ streamIn >> result;
+ if (!result) {
+ RG_DEBUG << "prepareAudio() - failed to add file \""
+ << (*it)->getFilename() << "\"" << endl;
+ }
+ }
+}
+
+void
+RosegardenGUIDoc::slotSetPointerPosition(timeT t)
+{
+ m_composition.setPosition(t);
+ emit pointerPositionChanged(t);
+}
+
+void
+RosegardenGUIDoc::setPlayPosition(timeT t)
+{
+ emit playPositionChanged(t);
+}
+
+void
+RosegardenGUIDoc::setLoop(timeT t0, timeT t1)
+{
+ m_composition.setLoopStart(t0);
+ m_composition.setLoopEnd(t1);
+ emit loopChanged(t0, t1);
+}
+
+void
+RosegardenGUIDoc::syncDevices()
+{
+ Profiler profiler("RosegardenGUIDoc::syncDevices", true);
+
+ // Start up the sequencer
+ //
+ int timeout = 60;
+
+ while (isSequencerRunning() && !rgapp->isSequencerRegistered() && timeout > 0) {
+ RG_DEBUG << "RosegardenGUIDoc::syncDevices - "
+ << "waiting for Sequencer to come up" << endl;
+
+ ProgressDialog::processEvents();
+ sleep(1); // 1s
+ --timeout;
+ }
+
+ if (isSequencerRunning() && !rgapp->isSequencerRegistered() && timeout == 0) {
+
+ // Give up, kill sequencer if possible, and report
+ KProcess *proc = new KProcess;
+ *proc << "/usr/bin/killall";
+ *proc << "rosegardensequencer";
+ *proc << "lt-rosegardensequencer";
+
+ proc->start(KProcess::Block, KProcess::All);
+
+ if (proc->exitStatus()) {
+ RG_DEBUG << "couldn't kill any sequencer processes" << endl;
+ }
+
+ delete proc;
+ RosegardenGUIApp *app = (RosegardenGUIApp*)parent();
+ app->slotSequencerExited(0);
+ return ;
+ }
+
+ if (!isSequencerRunning())
+ return ;
+
+ // Set the default timer first. We only do this first time and
+ // when changed in the configuration dialog.
+ static bool setTimer = false;
+ if (!setTimer) {
+ kapp->config()->setGroup(SequencerOptionsConfigGroup);
+ QString currentTimer = getCurrentTimer();
+ currentTimer = kapp->config()->readEntry("timer", currentTimer);
+ setCurrentTimer(currentTimer);
+ setTimer = true;
+ }
+
+ QByteArray replyData;
+ QCString replyType;
+
+ // Get number of devices the sequencer has found
+ //
+ rgapp->sequencerCall("getDevices()", replyType, replyData, RosegardenApplication::Empty, true);
+
+ unsigned int devices = 0;
+
+ if (replyType == "unsigned int") {
+ QDataStream reply(replyData, IO_ReadOnly);
+ reply >> devices;
+ } else {
+ RG_DEBUG << "RosegardenGUIDoc::syncDevices - "
+ << "got unknown returntype from getDevices()" << endl;
+ return ;
+ }
+
+ RG_DEBUG << "RosegardenGUIDoc::syncDevices - devices = "
+ << devices << endl;
+
+ for (unsigned int i = 0; i < devices; i++) {
+
+ RG_DEBUG << "RosegardenGUIDoc::syncDevices - i = "
+ << i << endl;
+
+ getMappedDevice(i);
+ }
+
+ RG_DEBUG << "RosegardenGUIDoc::syncDevices - "
+ << "Sequencer alive - Instruments synced" << endl;
+
+
+ // Force update of view on current track selection
+ //
+ kapp->config()->setGroup(GeneralOptionsConfigGroup);
+ bool opt = kapp->config()->readBoolEntry("Show Track labels", true);
+ TrackLabel::InstrumentTrackLabels labels = TrackLabel::ShowInstrument;
+ if (opt)
+ labels = TrackLabel::ShowTrack;
+
+ RosegardenGUIView *w;
+ for (w = m_viewList.first(); w != 0; w = m_viewList.next()) {
+ w->slotSelectTrackSegments(m_composition.getSelectedTrack());
+ w->getTrackEditor()->getTrackButtons()->changeTrackInstrumentLabels(labels);
+ }
+
+ emit devicesResyncd();
+}
+
+void
+RosegardenGUIDoc::getMappedDevice(DeviceId id)
+{
+ QByteArray data;
+ QByteArray replyData;
+ QCString replyType;
+ QDataStream arg(data, IO_WriteOnly);
+
+ arg << (unsigned int)id;
+
+ rgapp->sequencerCall("getMappedDevice(unsigned int)",
+ replyType, replyData, data);
+
+ MappedDevice *mD = new MappedDevice();
+ QDataStream reply(replyData, IO_ReadOnly);
+
+ if (replyType == "MappedDevice")
+ // unfurl
+ reply >> mD;
+ else
+ return ;
+
+ // See if we've got this device already
+ //
+ Device *device = m_studio.getDevice(id);
+
+ if (mD->getId() == Device::NO_DEVICE) {
+ if (device)
+ m_studio.removeDevice(id);
+ delete mD;
+ return ;
+ }
+
+ if (mD->size() == 0) {
+ // no instruments is OK for a record device
+ if (mD->getType() != Device::Midi ||
+ mD->getDirection() != MidiDevice::Record) {
+
+ RG_DEBUG << "RosegardenGUIDoc::getMappedDevice() - "
+ << "no instruments found" << endl;
+ if (device)
+ m_studio.removeDevice(id);
+ delete mD;
+ return ;
+ }
+ }
+
+ bool hadDeviceAlready = (device != 0);
+
+ if (!hadDeviceAlready) {
+ if (mD->getType() == Device::Midi) {
+ device =
+ new MidiDevice
+ (id,
+ mD->getName(),
+ mD->getDirection());
+
+ dynamic_cast<MidiDevice *>(device)
+ ->setRecording(mD->isRecording());
+
+ m_studio.addDevice(device);
+
+ RG_DEBUG << "RosegardenGUIDoc::getMappedDevice - "
+ << "adding MIDI Device \""
+ << device->getName() << "\" id = " << id
+ << " direction = " << mD->getDirection()
+ << " recording = " << mD->isRecording()
+ << endl;
+ } else if (mD->getType() == Device::SoftSynth) {
+ device = new SoftSynthDevice(id, mD->getName());
+ m_studio.addDevice(device);
+
+ RG_DEBUG << "RosegardenGUIDoc::getMappedDevice - "
+ << "adding soft synth Device \""
+ << device->getName() << "\" id = " << id << endl;
+ } else if (mD->getType() == Device::Audio) {
+ device = new AudioDevice(id, mD->getName());
+ m_studio.addDevice(device);
+
+ RG_DEBUG << "RosegardenGUIDoc::getMappedDevice - "
+ << "adding audio Device \""
+ << device->getName() << "\" id = " << id << endl;
+ } else {
+ RG_DEBUG << "RosegardenGUIDoc::getMappedDevice - "
+ << "unknown device - \"" << mD->getName()
+ << "\" (type = "
+ << mD->getType() << ")\n";
+ return ;
+ }
+ }
+
+ if (hadDeviceAlready) {
+ // direction might have changed
+ if (mD->getType() == Device::Midi) {
+ MidiDevice *midid =
+ dynamic_cast<MidiDevice *>(device);
+ if (midid) {
+ midid->setDirection(mD->getDirection());
+ midid->setRecording(mD->isRecording());
+ }
+ }
+ }
+
+ std::string connection(mD->getConnection());
+ RG_DEBUG << "RosegardenGUIDoc::getMappedDevice - got \"" << connection
+ << "\", direction " << mD->getDirection()
+ << " recording " << mD->isRecording()
+ << endl;
+ device->setConnection(connection);
+
+ Instrument *instrument;
+ MappedDeviceIterator it;
+
+ InstrumentList existingInstrs(device->getAllInstruments());
+
+ for (it = mD->begin(); it != mD->end(); it++) {
+ InstrumentId instrumentId = (*it)->getId();
+
+ bool haveInstrument = false;
+ for (InstrumentList::iterator iit = existingInstrs.begin();
+ iit != existingInstrs.end(); ++iit) {
+
+ if ((*iit)->getId() == instrumentId) {
+ haveInstrument = true;
+ break;
+ }
+ }
+
+ if (!haveInstrument) {
+ RG_DEBUG << "RosegardenGUIDoc::getMappedDevice: new instr " << (*it)->getId() << endl;
+ instrument = new Instrument((*it)->getId(),
+ (*it)->getType(),
+ (*it)->getName(),
+ (*it)->getChannel(),
+ device);
+ device->addInstrument(instrument);
+ }
+ }
+
+ delete mD;
+}
+
+void
+RosegardenGUIDoc::addRecordMIDISegment(TrackId tid)
+{
+ RG_DEBUG << "RosegardenGUIDoc::addRecordMIDISegment(" << tid << ")" << endl;
+// std::cerr << kdBacktrace() << std::endl;
+
+ Segment *recordMIDISegment;
+
+ recordMIDISegment = new Segment();
+ recordMIDISegment->setTrack(tid);
+ recordMIDISegment->setStartTime(m_recordStartTime);
+
+ // Set an appropriate segment label
+ //
+ std::string label = "";
+
+ Track *track = m_composition.getTrackById(tid);
+ if (track) {
+ if (track->getPresetLabel() != "") {
+ label = track->getPresetLabel();
+ } else if (track->getLabel() == "") {
+ Instrument *instr =
+ m_studio.getInstrumentById(track->getInstrument());
+ if (instr) {
+ label = m_studio.getSegmentName(instr->getId());
+ }
+ } else {
+ label = track->getLabel();
+ }
+ label = qstrtostr(i18n("%1 (recorded)").arg(strtoqstr(label)));
+ }
+
+ recordMIDISegment->setLabel(label);
+
+ Clef clef = clefIndexToClef(track->getClef());
+ recordMIDISegment->insert(clef.getAsEvent
+ (recordMIDISegment->getStartTime()));
+
+ // set segment transpose, color, highest/lowest playable from track parameters
+ recordMIDISegment->setTranspose(track->getTranspose());
+ recordMIDISegment->setColourIndex(track->getColor());
+ recordMIDISegment->setHighestPlayable(track->getHighestPlayable());
+ recordMIDISegment->setLowestPlayable(track->getLowestPlayable());
+
+ m_composition.addSegment(recordMIDISegment);
+
+ m_recordMIDISegments[track->getInstrument()] = recordMIDISegment;
+
+ RosegardenGUIView *w;
+ for (w = m_viewList.first(); w != 0; w = m_viewList.next()) {
+ w->getTrackEditor()->getTrackButtons()->slotUpdateTracks();
+ }
+
+ emit newMIDIRecordingSegment(recordMIDISegment);
+}
+
+void
+RosegardenGUIDoc::addRecordAudioSegment(InstrumentId iid,
+ AudioFileId auid)
+{
+ Segment *recordSegment = new Segment
+ (Segment::Audio);
+
+ // Find the right track
+
+ Track *recordTrack = 0;
+
+ const Composition::recordtrackcontainer &tr =
+ getComposition().getRecordTracks();
+
+ for (Composition::recordtrackcontainer::const_iterator i =
+ tr.begin(); i != tr.end(); ++i) {
+ TrackId tid = (*i);
+ Track *track = getComposition().getTrackById(tid);
+ if (track) {
+ if (iid == track->getInstrument()) {
+ recordTrack = track;
+ break;
+ }
+ }
+ }
+
+ if (!recordTrack) {
+ RG_DEBUG << "RosegardenGUIDoc::addRecordAudioSegment(" << iid << ", "
+ << auid << "): No record-armed track found for instrument!"
+ << endl;
+ return ;
+ }
+
+ recordSegment->setTrack(recordTrack->getId());
+ recordSegment->setStartTime(m_recordStartTime);
+ recordSegment->setAudioStartTime(RealTime::zeroTime);
+
+ // Set an appropriate segment label
+ //
+ std::string label = "";
+
+ if (recordTrack) {
+ if (recordTrack->getLabel() == "") {
+
+ Instrument *instr =
+ m_studio.getInstrumentById(recordTrack->getInstrument());
+
+ if (instr) {
+ label = instr->getName() + std::string(" ");
+ }
+
+ } else {
+ label = recordTrack->getLabel() + std::string(" ");
+ }
+
+ label += std::string("(recorded audio)");
+ }
+
+ recordSegment->setLabel(label);
+ recordSegment->setAudioFileId(auid);
+
+ // set color for audio segment to distinguish it from a MIDI segment on an
+ // audio track drawn with the pencil (depends on having the current
+ // autoload.rg or a file derived from it to deliever predictable results,
+ // but the worst case here is segments drawn in the wrong color when
+ // adding new segments to old files, which I don't forsee as being enough
+ // of a problem to be worth cooking up a more robust implementation of
+ // this new color for new audio segments (DMM)
+ recordSegment->setColourIndex(GUIPalette::AudioDefaultIndex);
+
+ RG_DEBUG << "RosegardenGUIDoc::addRecordAudioSegment: adding record segment for instrument " << iid << " on track " << recordTrack->getId() << endl;
+ m_recordAudioSegments[iid] = recordSegment;
+
+ RosegardenGUIView *w;
+ for (w = m_viewList.first(); w != 0; w = m_viewList.next()) {
+ w->getTrackEditor()->getTrackButtons()->slotUpdateTracks();
+ }
+
+ emit newAudioRecordingSegment(recordSegment);
+}
+
+void
+RosegardenGUIDoc::updateRecordingAudioSegments()
+{
+ const Composition::recordtrackcontainer &tr =
+ getComposition().getRecordTracks();
+
+ for (Composition::recordtrackcontainer::const_iterator i =
+ tr.begin(); i != tr.end(); ++i) {
+
+ TrackId tid = (*i);
+ Track *track = getComposition().getTrackById(tid);
+
+ if (track) {
+
+ InstrumentId iid = track->getInstrument();
+
+ if (m_recordAudioSegments[iid]) {
+
+ Segment *recordSegment = m_recordAudioSegments[iid];
+ if (!recordSegment->getComposition()) {
+
+ // always insert straight away for audio
+ m_composition.addSegment(recordSegment);
+ }
+
+ recordSegment->setAudioEndTime(
+ m_composition.getRealTimeDifference(recordSegment->getStartTime(),
+ m_composition.getPosition()));
+
+ } else {
+ // RG_DEBUG << "RosegardenGUIDoc::updateRecordingAudioSegments: no segment for instr "
+ // << iid << endl;
+ }
+ }
+ }
+}
+
+void
+RosegardenGUIDoc::stopRecordingAudio()
+{
+ RG_DEBUG << "RosegardenGUIDoc::stopRecordingAudio" << endl;
+
+ for (RecordingSegmentMap::iterator ri = m_recordAudioSegments.begin();
+ ri != m_recordAudioSegments.end(); ++ri) {
+
+ Segment *recordSegment = ri->second;
+
+ if (!recordSegment)
+ continue;
+
+ // set the audio end time
+ //
+ recordSegment->setAudioEndTime(
+ m_composition.getRealTimeDifference(recordSegment->getStartTime(),
+ m_composition.getPosition()));
+
+ // now add the Segment
+ RG_DEBUG << "RosegardenGUIDoc::stopRecordingAudio - "
+ << "got recorded segment" << endl;
+
+ // now move the segment back by the record latency
+ //
+ /*!!!
+ No. I don't like this.
+
+ The record latency doesn't always exist -- for example, if recording
+ from a synth plugin there is no record latency, and we have no way
+ here to distinguish.
+
+ The record latency is a total latency figure that actually includes
+ some play latency, and we compensate for that again on playback (see
+ bug #1378766).
+
+ The timeT conversion of record latency is approximate in frames,
+ giving potential phase error.
+
+ Cutting this out won't break any existing files, as the latency
+ compensation there is already encoded into the file.
+
+ RealTime adjustedStartTime =
+ m_composition.getElapsedRealTime(recordSegment->getStartTime()) -
+ m_audioRecordLatency;
+
+ timeT shiftedStartTime =
+ m_composition.getElapsedTimeForRealTime(adjustedStartTime);
+
+ RG_DEBUG << "RosegardenGUIDoc::stopRecordingAudio - "
+ << "shifted recorded audio segment by "
+ << recordSegment->getStartTime() - shiftedStartTime
+ << " clicks (from " << recordSegment->getStartTime()
+ << " to " << shiftedStartTime << ")" << endl;
+
+ recordSegment->setStartTime(shiftedStartTime);
+ */
+ }
+ emit stoppedAudioRecording();
+}
+
+void
+RosegardenGUIDoc::finalizeAudioFile(InstrumentId iid)
+{
+ RG_DEBUG << "RosegardenGUIDoc::finalizeAudioFile(" << iid << ")" << endl;
+
+ Segment *recordSegment = 0;
+ recordSegment = m_recordAudioSegments[iid];
+
+ if (!recordSegment) {
+ RG_DEBUG << "RosegardenGUIDoc::finalizeAudioFile: Failed to find segment" << endl;
+ return ;
+ }
+
+ AudioFile *newAudioFile = m_audioFileManager.getAudioFile
+ (recordSegment->getAudioFileId());
+ if (!newAudioFile) {
+ std::cerr << "WARNING: RosegardenGUIDoc::finalizeAudioFile: No audio file found for instrument " << iid << " (audio file id " << recordSegment->getAudioFileId() << ")" << std::endl;
+ return ;
+ }
+
+ // Create a progress dialog
+ //
+ ProgressDialog *progressDlg = new ProgressDialog
+ (i18n("Generating audio preview..."), 100, (QWidget*)parent());
+ progressDlg->setAutoClose(false);
+ progressDlg->setAutoReset(false);
+ progressDlg->show();
+
+ connect(progressDlg, SIGNAL(cancelClicked()),
+ &m_audioFileManager, SLOT(slotStopPreview()));
+
+ connect(&m_audioFileManager, SIGNAL(setProgress(int)),
+ progressDlg->progressBar(), SLOT(setValue(int)));
+
+ try {
+ m_audioFileManager.generatePreview(newAudioFile->getId());
+ //!!! mtr just for now?: or better to do this once after the fact?
+ //!!! m_audioFileManager.generatePreviews();
+ } catch (Exception e) {
+ KStartupLogo::hideIfStillThere();
+ CurrentProgressDialog::freeze();
+ KMessageBox::error(0, strtoqstr(e.getMessage()));
+ CurrentProgressDialog::thaw();
+ }
+
+ delete progressDlg;
+
+ if (!recordSegment->getComposition()) {
+ getComposition().addSegment(recordSegment);
+ }
+
+ m_commandHistory->addCommand
+ (new SegmentRecordCommand(recordSegment));
+
+ // update views
+ slotUpdateAllViews(0);
+
+ // Now install the file in the sequencer
+ //
+ // We're playing fast and loose with DCOP here - we just send
+ // this request and carry on regardless otherwise the sequencer
+ // can just hang our request. We don't risk a call() and we
+ // don't get a return type. Ugly and hacky but it appears to
+ // work for me - so hey.
+ //
+ QByteArray data;
+ QDataStream streamOut(data, IO_WriteOnly);
+ streamOut << QString(strtoqstr(newAudioFile->getFilename()));
+ streamOut << (int)newAudioFile->getId();
+ rgapp->sequencerSend("addAudioFile(QString, int)", data);
+
+ // clear down
+ m_recordAudioSegments.erase(iid);
+ emit audioFileFinalized(recordSegment);
+}
+
+RealTime
+RosegardenGUIDoc::getAudioPlayLatency()
+{
+ QCString replyType;
+ QByteArray replyData;
+
+ if (!rgapp->sequencerCall("getAudioPlayLatency()", replyType, replyData)) {
+ RG_DEBUG << "RosegardenGUIDoc::getAudioPlayLatency - "
+ << "Playback failed to contact Rosegarden sequencer"
+ << endl;
+ return RealTime::zeroTime;
+ }
+
+ // ensure the return type is ok
+ QDataStream streamIn(replyData, IO_ReadOnly);
+ MappedRealTime result;
+ streamIn >> result;
+
+ return (result.getRealTime());
+}
+
+RealTime
+RosegardenGUIDoc::getAudioRecordLatency()
+{
+ QCString replyType;
+ QByteArray replyData;
+
+ if (!rgapp->sequencerCall("getAudioRecordLatency()", replyType, replyData)) {
+ RG_DEBUG << "RosegardenGUIDoc::getAudioRecordLatency - "
+ << "Playback failed to contact Rosegarden sequencer"
+ << endl;
+ return RealTime::zeroTime;
+ }
+
+ // ensure the return type is ok
+ QDataStream streamIn(replyData, IO_ReadOnly);
+ MappedRealTime result;
+ streamIn >> result;
+
+ return (result.getRealTime());
+}
+
+void
+RosegardenGUIDoc::updateAudioRecordLatency()
+{
+ m_audioRecordLatency = getAudioRecordLatency();
+}
+
+QStringList
+RosegardenGUIDoc::getTimers()
+{
+ QStringList list;
+
+ QCString replyType;
+ QByteArray replyData;
+
+ if (!rgapp->sequencerCall("getTimers()", replyType, replyData)) {
+ RG_DEBUG << "RosegardenGUIDoc::getTimers - "
+ << "failed to contact Rosegarden sequencer" << endl;
+ return list;
+ }
+
+ if (replyType != "unsigned int") {
+ RG_DEBUG << "RosegardenGUIDoc::getTimers - "
+ << "wrong reply type (" << replyType << ") from sequencer" << endl;
+ return list;
+ }
+
+ QDataStream streamIn(replyData, IO_ReadOnly);
+ unsigned int count = 0;
+ streamIn >> count;
+
+ for (unsigned int i = 0; i < count; ++i) {
+
+ QByteArray data;
+ QDataStream streamOut(data, IO_WriteOnly);
+
+ streamOut << i;
+
+ if (!rgapp->sequencerCall("getTimer(unsigned int)",
+ replyType, replyData, data)) {
+ RG_DEBUG << "RosegardenGUIDoc::getTimers - "
+ << "failed to contact Rosegarden sequencer" << endl;
+ return list;
+ }
+
+ if (replyType != "QString") {
+ RG_DEBUG << "RosegardenGUIDoc::getTimers - "
+ << "wrong reply type (" << replyType << ") from sequencer" << endl;
+ return list;
+ }
+
+ QDataStream streamIn(replyData, IO_ReadOnly);
+ QString name;
+ streamIn >> name;
+
+ list.push_back(name);
+ }
+
+ return list;
+}
+
+QString
+RosegardenGUIDoc::getCurrentTimer()
+{
+ QCString replyType;
+ QByteArray replyData;
+
+ if (!rgapp->sequencerCall("getCurrentTimer()", replyType, replyData)) {
+ RG_DEBUG << "RosegardenGUIDoc::getCurrentTimer - "
+ << "failed to contact Rosegarden sequencer" << endl;
+ return "";
+ }
+
+ if (replyType != "QString") {
+ RG_DEBUG << "RosegardenGUIDoc::getCurrentTimer - "
+ << "wrong reply type (" << replyType << ") from sequencer" << endl;
+ return "";
+ }
+
+ QDataStream streamIn(replyData, IO_ReadOnly);
+ QString name;
+ streamIn >> name;
+ return name;
+}
+
+void
+RosegardenGUIDoc::setCurrentTimer(QString name)
+{
+ QCString replyType;
+ QByteArray replyData;
+
+ QByteArray data;
+ QDataStream streamOut(data, IO_WriteOnly);
+
+ streamOut << name;
+
+ if (!rgapp->sequencerCall("setCurrentTimer(QString)",
+ replyType, replyData, data)) {
+ RG_DEBUG << "RosegardenGUIDoc::setCurrentTimer - "
+ << "failed to contact Rosegarden sequencer" << endl;
+ }
+}
+
+void
+RosegardenGUIDoc::initialiseControllers()
+{
+ InstrumentList list = m_studio.getAllInstruments();
+ MappedComposition mC;
+ MappedEvent *mE;
+
+ InstrumentList::iterator it = list.begin();
+ for (; it != list.end(); it++) {
+ if ((*it)->getType() == Instrument::Midi) {
+ std::vector<MidiControlPair> advancedControls;
+
+ // push all the advanced static controls
+ //
+ StaticControllers &list = (*it)->getStaticControllers();
+ for (StaticControllerConstIterator cIt = list.begin(); cIt != list.end(); ++cIt) {
+ advancedControls.push_back(MidiControlPair(cIt->first, cIt->second));
+ }
+
+ advancedControls.
+ push_back(
+ MidiControlPair(MIDI_CONTROLLER_PAN,
+ (*it)->getPan()));
+ advancedControls.
+ push_back(
+ MidiControlPair(MIDI_CONTROLLER_VOLUME,
+ (*it)->getVolume()));
+
+
+ std::vector<MidiControlPair>::iterator
+ iit = advancedControls.begin();
+ for (; iit != advancedControls.end(); iit++) {
+ try {
+ mE =
+ new MappedEvent((*it)->getId(),
+ MappedEvent::MidiController,
+ iit->first,
+ iit->second);
+ } catch (...) {
+ continue;
+ }
+
+ mC.insert(mE);
+ }
+ }
+ }
+
+ StudioControl::sendMappedComposition(mC);
+}
+
+void
+RosegardenGUIDoc::clearAllPlugins()
+{
+ //RG_DEBUG << "clearAllPlugins" << endl;
+
+ InstrumentList list = m_studio.getAllInstruments();
+ MappedComposition mC;
+
+ InstrumentList::iterator it = list.begin();
+ for (; it != list.end(); it++) {
+ if ((*it)->getType() == Instrument::Audio) {
+ PluginInstanceIterator pIt = (*it)->beginPlugins();
+
+ for (; pIt != (*it)->endPlugins(); pIt++) {
+ if ((*pIt)->getMappedId() != -1) {
+ if (StudioControl::
+ destroyStudioObject((*pIt)->getMappedId()) == false) {
+ RG_DEBUG << "RosegardenGUIDoc::clearAllPlugins - "
+ << "couldn't find plugin instance "
+ << (*pIt)->getMappedId() << endl;
+ }
+ }
+ (*pIt)->clearPorts();
+ }
+ (*it)->emptyPlugins();
+
+ /*
+ RG_DEBUG << "RosegardenGUIDoc::clearAllPlugins - "
+ << "cleared " << (*it)->getName() << endl;
+ */
+ }
+ }
+}
+
+Clipboard*
+RosegardenGUIDoc::getClipboard()
+{
+ RosegardenGUIApp *app = (RosegardenGUIApp*)parent();
+ return app->getClipboard();
+}
+
+void RosegardenGUIDoc::slotDocColoursChanged()
+{
+ RG_DEBUG << "RosegardenGUIDoc::slotDocColoursChanged(): emitting docColoursChanged()" << endl;
+
+ emit docColoursChanged();
+}
+
+void
+RosegardenGUIDoc::addOrphanedRecordedAudioFile(QString fileName)
+{
+ m_orphanedRecordedAudioFiles.push_back(fileName);
+ slotDocumentModified();
+}
+
+void
+RosegardenGUIDoc::addOrphanedDerivedAudioFile(QString fileName)
+{
+ m_orphanedDerivedAudioFiles.push_back(fileName);
+ slotDocumentModified();
+}
+
+void
+RosegardenGUIDoc::notifyAudioFileRemoval(AudioFileId id)
+{
+ AudioFile *file = 0;
+
+ if (m_audioFileManager.wasAudioFileRecentlyRecorded(id)) {
+ file = m_audioFileManager.getAudioFile(id);
+ if (file) addOrphanedRecordedAudioFile(file->getFilename());
+ return;
+ }
+
+ if (m_audioFileManager.wasAudioFileRecentlyDerived(id)) {
+ file = m_audioFileManager.getAudioFile(id);
+ if (file) addOrphanedDerivedAudioFile(file->getFilename());
+ return;
+ }
+}
+
+}
+#include "RosegardenGUIDoc.moc"
diff --git a/src/document/RosegardenGUIDoc.h b/src/document/RosegardenGUIDoc.h
new file mode 100644
index 0000000..1cdc88e
--- /dev/null
+++ b/src/document/RosegardenGUIDoc.h
@@ -0,0 +1,733 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_ROSEGARDENGUIDOC_H_
+#define _RG_ROSEGARDENGUIDOC_H_
+
+#include "base/Composition.h"
+#include "base/Configuration.h"
+#include "base/Device.h"
+#include "base/MidiProgram.h"
+#include "base/RealTime.h"
+#include "base/Segment.h"
+#include "base/Studio.h"
+#include "gui/application/RosegardenGUIApp.h"
+#include "gui/editors/segment/segmentcanvas/AudioPreviewThread.h"
+#include <map>
+#include "sound/AudioFileManager.h"
+// #include <qlist.h> (fixes problem for Adam Dingle)
+#include <qobject.h>
+#include <qstring.h>
+#include <qstringlist.h>
+#include <vector>
+#include "base/Event.h"
+
+
+class QWidget;
+class QTextStream;
+class NoteOnRecSet;
+class KProgress;
+
+
+namespace Rosegarden
+{
+
+class SequenceManager;
+class RosegardenGUIView;
+class ProgressDialog;
+class MultiViewCommandHistory;
+class MappedComposition;
+class Event;
+class EditViewBase;
+class Clipboard;
+class AudioPluginManager;
+
+
+static const int MERGE_AT_END = (1 << 0);
+static const int MERGE_IN_NEW_TRACKS = (1 << 1);
+static const int MERGE_KEEP_OLD_TIMINGS = (1 << 2);
+static const int MERGE_KEEP_NEW_TIMINGS = (1 << 3);
+
+
+/**
+ * RosegardenGUIDoc provides a document object for a document-view model.
+ *
+ * The RosegardenGUIDoc class provides a document object that can be
+ * used in conjunction with the classes RosegardenGUIApp and
+ * RosegardenGUIView to create a document-view model for standard KDE
+ * applications based on KApplication and KTMainWindow. Thereby, the
+ * document object is created by the RosegardenGUIApp instance and
+ * contains the document structure with the according methods for
+ * manipulation of the document data by RosegardenGUIView
+ * objects. Also, RosegardenGUIDoc contains the methods for
+ * serialization of the document data from and to files.
+ *
+ * RosegardenGUIDoc owns the Composition in the document.
+ */
+
+class RosegardenGUIDoc : public QObject
+{
+ Q_OBJECT
+public:
+
+ /**
+ * Constructor for the fileclass of the application
+ */
+ RosegardenGUIDoc(QWidget *parent,
+ AudioPluginManager *audioPluginManager = 0,
+ bool skipAutoload = false,
+ const char *name=0);
+
+private:
+ RosegardenGUIDoc(RosegardenGUIDoc *doc);
+ RosegardenGUIDoc& operator=(const RosegardenGUIDoc &doc);
+
+public:
+ static int FILE_FORMAT_VERSION_MAJOR;
+ static int FILE_FORMAT_VERSION_MINOR;
+ static int FILE_FORMAT_VERSION_POINT;
+
+ /**
+ * Destructor for the fileclass of the application
+ */
+ ~RosegardenGUIDoc();
+
+ /**
+ * adds a view to the document which represents the document
+ * contents. Usually this is your main view.
+ */
+ void attachView(RosegardenGUIView *view);
+
+ /**
+ * removes a view from the list of currently connected views
+ */
+ void detachView(RosegardenGUIView *view);
+
+ /**
+ * adds an Edit View (notation, matrix, event list)
+ */
+ void attachEditView(EditViewBase*);
+
+ /**
+ * removes a view from the list of currently connected edit views
+ */
+ void detachEditView(EditViewBase*);
+
+ /**
+ * delete all Edit Views
+ */
+ void deleteEditViews();
+
+protected:
+ /**
+ * sets the modified flag for the document after a modifying
+ * action on the view connected to the document.
+ *
+ * this is just an accessor, other components should call
+ * slotDocumentModified() and clearModifiedStatus() instead of
+ * this method, which perform all the related housework.
+ *
+ */
+ void setModified(bool m=true);
+
+public:
+ /**
+ * returns if the document is modified or not. Use this to
+ * determine if your document needs saving by the user on closing.
+ */
+ bool isModified() const { return m_modified; };
+
+ /**
+ * clears the 'modified' status of the document (sets it back to false).
+ *
+ */
+ void clearModifiedStatus();
+
+ /**
+ * "save modified" - asks the user for saving if the document is
+ * modified
+ */
+ bool saveIfModified();
+
+ /**
+ * get the autosave interval in seconds
+ */
+ unsigned int getAutoSavePeriod() const;
+
+ /**
+ * Load the document by filename and format and emit the
+ * updateViews() signal. The "permanent" argument should be true
+ * if this document is intended to be loaded to the GUI for real
+ * editing work: in this case, any necessary device-synchronisation
+ * with the sequencer will be carried out. If permanent is false,
+ * the sequencer's device list will be left alone.
+ */
+ bool openDocument(const QString &filename, bool permanent = true,
+ const char *format=0);
+
+ /**
+ * merge another document into this one
+ */
+ void mergeDocument(RosegardenGUIDoc *doc, int options);
+
+ /**
+ * saves the document under filename and format.
+ *
+ * errMsg will be set to a user-readable error message if save fails
+ */
+ bool saveDocument(const QString &filename, QString& errMsg,
+ bool autosave = false);
+
+ /**
+ * exports all or part of the studio to a file. If devices is
+ * empty, exports all devices.
+ */
+ bool exportStudio(const QString &filename,
+ std::vector<DeviceId> devices =
+ std::vector<DeviceId>());
+
+ /**
+ * sets the path to the file connected with the document
+ */
+ void setAbsFilePath(const QString &filename);
+
+ /**
+ * returns the pathname of the current document file
+ */
+ const QString &getAbsFilePath() const;
+
+ /**
+ * sets the filename of the document
+ */
+ void setTitle(const QString &_t);
+
+ /**
+ * returns the title of the document
+ */
+ const QString &getTitle() const;
+
+ /**
+ * Returns true if the file is a regular Rosegarden ".rg" file,
+ * false if it's an imported file or a new file (not yet saved)
+ */
+ bool isRegularDotRGFile();
+
+ void setQuickMarker();
+ void jumpToQuickMarker();
+ timeT getQuickMarkerTime() { return m_quickMarkerTime; }
+
+ /**
+ * returns the global command history
+ */
+ MultiViewCommandHistory *getCommandHistory() {
+ return m_commandHistory;
+ }
+
+ /**
+ * returns the composition (the principal constituent of the document)
+ */
+ Composition& getComposition() { return m_composition; }
+
+ /**
+ * returns the composition (the principal constituent of the document)
+ */
+ const Composition& getComposition() const { return m_composition; }
+
+ /*
+ * return the Studio
+ */
+ Studio& getStudio() { return m_studio;}
+
+ const Studio& getStudio() const { return m_studio;}
+
+ /*
+ * return the AudioPreviewThread
+ */
+ AudioPreviewThread& getAudioPreviewThread()
+ { return m_audioPreviewThread; }
+
+ const AudioPreviewThread& getAudioPreviewThread() const
+ { return m_audioPreviewThread; }
+
+ /*
+ * return the AudioFileManager
+ */
+ AudioFileManager& getAudioFileManager()
+ { return m_audioFileManager; }
+
+ const AudioFileManager& getAudioFileManager() const
+ { return m_audioFileManager; }
+
+ /*
+ * return the Configuration object
+ */
+ DocumentConfiguration& getConfiguration() { return m_config; }
+
+ const DocumentConfiguration& getConfiguration() const
+ { return m_config; }
+
+ /**
+ * returns the cut/copy/paste clipboard
+ */
+ Clipboard *getClipboard();
+
+ /**
+ * Returns whether the sequencer us running
+ */
+ bool isSequencerRunning();
+
+ /**
+ * insert some recorded MIDI events into our recording Segment
+ */
+ void insertRecordedMidi(const MappedComposition &mc);
+
+ /**
+ * Update the recording progress -- called regularly from
+ * RosegardenGUIApp::slotUpdatePlaybackPosition() while recording
+ */
+ void updateRecordingMIDISegment();
+
+ /**
+ * Update the recording progress for audio
+ */
+ void updateRecordingAudioSegments();
+
+ /**
+ * Tidy up the recording SegmentItems and other post record jobs
+ */
+ void stopRecordingMidi();
+ void stopRecordingAudio();
+
+ /**
+ * Register audio samples at the sequencer
+ */
+ void prepareAudio();
+
+ /**
+ * Cause the playPositionChanged signal to be emitted and any
+ * associated internal work in the document to happen
+ */
+ void setPlayPosition(timeT);
+
+ /**
+ * Cause the loopChanged signal to be emitted and any
+ * associated internal work in the document to happen
+ */
+ void setLoop(timeT, timeT);
+
+ /**
+ * Cause the document to use the given time as the origin
+ * when inserting any subsequent recorded data
+ */
+ void setRecordStartTime(timeT t) { m_recordStartTime = t; }
+
+ /*
+ * Sync device information with sequencer
+ */
+ void syncDevices();
+
+ /*
+ * Get a MappedDevice from the sequencer and add the
+ * results to our Studio
+ */
+ void getMappedDevice(DeviceId id);
+
+ void addRecordMIDISegment(TrackId);
+ void addRecordAudioSegment(InstrumentId, AudioFileId);
+
+ // Audio play and record latencies direct from the sequencer
+ //
+ RealTime getAudioPlayLatency();
+ RealTime getAudioRecordLatency();
+ void updateAudioRecordLatency();
+
+ // Complete the add of an audio file when a new file has finished
+ // being recorded at the sequencer. This method will ensure that
+ // the audio file is added to the AudioFileManager, that
+ // a preview is generated and that the sequencer also knows to add
+ // the new file to its own hash table. Flow of control is a bit
+ // awkward around new audio files as timing is crucial - the gui can't
+ // access the file until lead-out information has been written by the
+ // sequencer.
+ //
+ // Note that the sequencer doesn't know the audio file id (yet),
+ // only the instrument it was recorded to. (It does know the
+ // filename, but the instrument id is enough for us.)
+ //
+ void finalizeAudioFile(InstrumentId instrument);
+
+ // Tell the document that an audio file has been orphaned. An
+ // orphaned audio file is a file that was created by recording in
+ // Rosegarden during the current session, but that has been
+ // unloaded from the audio file manager. It's therefore likely
+ // that no other application will be using it, and that that user
+ // doesn't want to keep it. We can offer to delete these files
+ // permanently when the document is saved.
+ //
+ void addOrphanedRecordedAudioFile(QString fileName);
+ void addOrphanedDerivedAudioFile(QString fileName);
+
+ // Consider whether to orphan the given audio file which is about
+ // to be removed from the audio file manager.
+ //
+ void notifyAudioFileRemoval(AudioFileId id);
+
+ /*
+ void setAudioRecordLatency(const RealTime &latency)
+ { m_audioRecordLatency = latency; }
+ void setAudioPlayLatency(const RealTime &latency)
+ { m_audioPlayLatency = latency; }
+ */
+
+ // Return the AudioPluginManager
+ //
+ AudioPluginManager* getPluginManager()
+ { return m_pluginManager; }
+
+ // Clear all plugins from sequencer and from gui
+ //
+ void clearAllPlugins();
+
+ // Initialise the MIDI controllers after we've loaded a file
+ //
+ void initialiseControllers();
+
+ // Clear the studio at the sequencer
+ //
+ void clearStudio();
+
+ // Initialise the Studio with a new document's settings
+ //
+ void initialiseStudio();
+
+ // Get the sequence manager from the app
+ //
+ SequenceManager* getSequenceManager()
+ { return (dynamic_cast<RosegardenGUIApp*>(parent()))
+ ->getSequenceManager(); }
+
+ //Obsolete: multitrack MIDI recording. plcl 06/2006.
+ //Segment *getRecordMIDISegment() { return m_recordMIDISegment; }
+
+ QStringList getTimers();
+ QString getCurrentTimer();
+ void setCurrentTimer(QString);
+
+ /**
+ * return the list of the views currently connected to the document
+ */
+ QList<RosegardenGUIView>& getViewList() { return m_viewList; }
+
+ bool isBeingDestroyed() { return m_beingDestroyed; }
+
+ static const unsigned int MinNbOfTracks; // 64
+
+public slots:
+ /**
+ * calls repaint() on all views connected to the document object
+ * and is called by the view by which the document has been
+ * changed. As this view normally repaints itself, it is excluded
+ * from the paintEvent.
+ */
+ void slotUpdateAllViews(RosegardenGUIView *sender);
+
+ /**
+ * set the 'modified' flag of the document to true,
+ * clears the 'autosaved' flag, emits the 'documentModified' signal.
+ *
+ * always call this when changes have occurred on the document.
+ */
+ void slotDocumentModified();
+ void slotDocumentRestored();
+
+ /**
+ * saves the document to a suitably-named backup file
+ */
+ void slotAutoSave();
+
+ void slotSetPointerPosition(timeT);
+ void slotSetPlayPosition(timeT t) { setPlayPosition(t); }
+ void slotSetLoop(timeT s, timeT e) {setLoop(s,e);}
+
+ void slotDocColoursChanged();
+
+signals:
+ /**
+ * Emitted when document is modified or saved
+ */
+ void documentModified(bool);
+
+ /**
+ * Emitted during playback, to suggest that views should track along,
+ * as well as when pointer is moved via a click on the loop ruler.
+ */
+ void pointerPositionChanged(timeT);
+
+ /**
+ * Emitted during recording, to indicate that some new notes (it's
+ * only emitted for notes) have appeared in the recording segment
+ * and anything tracking should track. updatedFrom gives the
+ * start of the new region, which is presumed to extend up to the
+ * end of the segment.
+ */
+ void recordMIDISegmentUpdated(Segment *recordSegment,
+ timeT updatedFrom);
+
+ /**
+ * Emitted when a new MIDI recording segment is set
+ */
+ void newMIDIRecordingSegment(Segment*);
+
+ /**
+ * Emitted when a new audio recording segment is set
+ */
+ void newAudioRecordingSegment(Segment*);
+
+ void makeTrackVisible(int trackPosition);
+
+ void stoppedAudioRecording();
+ void stoppedMIDIRecording();
+ void audioFileFinalized(Segment*);
+
+ void playPositionChanged(timeT);
+ void loopChanged(timeT, timeT);
+ void docColoursChanged();
+ void devicesResyncd();
+
+protected:
+ /**
+ * initializes the document generally
+ */
+ void newDocument();
+
+ /**
+ * Autoload
+ */
+ void performAutoload();
+
+ /**
+ * Parse the Rosegarden file in \a file
+ *
+ * \a errMsg will contains the error messages
+ * if parsing failed.
+ *
+ * @return false if parsing failed
+ * @see RoseXmlHandler
+ */
+ bool xmlParse(QString fileContents, QString &errMsg,
+ ProgressDialog *progress,
+ unsigned int elementCount,
+ bool permanent,
+ bool &cancelled);
+
+ /**
+ * Set the "auto saved" status of the document
+ * Doc. modification sets it to false, autosaving
+ * sets it to true
+ */
+ void setAutoSaved(bool s) { m_autoSaved = s; }
+
+ /**
+ * Returns whether the document should be auto-saved
+ */
+ bool isAutoSaved() const { return m_autoSaved; }
+
+ /**
+ * Returns the name of the autosave file
+ */
+ QString getAutoSaveFileName();
+
+ /**
+ * Save document to the given file. This function does the actual
+ * save of the file to the given filename; saveDocument() wraps
+ * this, saving to a temporary file and then renaming to the
+ * required file, so as not to lose the original if a failure
+ * occurs during overwriting.
+ */
+ bool saveDocumentActual(const QString &filename, QString& errMsg,
+ bool autosave = false);
+
+ /**
+ * Save one segment to the given text stream
+ */
+ void saveSegment(QTextStream&, Segment*, KProgress*,
+ long totalNbOfEvents, long &count,
+ QString extraAttributes = QString::null);
+
+ bool deleteOrphanedAudioFiles(bool documentWillNotBeSaved);
+
+
+ /**
+ * A struct formed by a Segment pointer and an iterator to the same
+ * Segment, used in NoteOn calculations when recording MIDI.
+ */
+ struct NoteOnRec {
+ Segment *m_segment;
+ Segment::iterator m_segmentIterator;
+ };
+
+ /**
+ * A vector of NoteOnRec elements, necessary in multitrack MIDI
+ * recording for NoteOn calculations
+ */
+ typedef std::vector<NoteOnRec> NoteOnRecSet;
+
+ /**
+ * Store a single NoteOnRec element in the m_noteOnEvents map
+ */
+ void storeNoteOnEvent( Segment *s, Segment::iterator it,
+ int device, int channel );
+
+ /**
+ * Replace recorded Note events in one or several segments, returning the
+ * resulting NoteOnRecSet
+ */
+ NoteOnRecSet* replaceRecordedEvent(NoteOnRecSet &rec_vec, Event *fresh);
+
+ /**
+ * Insert a recorded event in one or several segments
+ */
+ void insertRecordedEvent(Event *ev, int device, int channel, bool isNoteOn);
+
+ //--------------- Data members ---------------------------------
+
+ /**
+ * the list of the views currently connected to the document
+ */
+ QList<RosegardenGUIView> m_viewList;
+
+ /**
+ * the list of the edit views currently editing a part of this document
+ */
+ QList<EditViewBase> m_editViewList;
+
+ /**
+ * the modified flag of the current document
+ */
+ bool m_modified;
+
+ /**
+ * the autosaved status of the current document
+ */
+ bool m_autoSaved;
+
+ /**
+ * the title of the current document
+ */
+ QString m_title;
+
+ /**
+ * absolute file path of the current document
+ */
+ QString m_absFilePath;
+
+ /**
+ * the composition this document is wrapping
+ */
+ Composition m_composition;
+
+ /**
+ * stores AudioFile mappings
+ */
+ AudioFileManager m_audioFileManager;
+
+ /**
+ * calculates AudioFile previews
+ */
+ AudioPreviewThread m_audioPreviewThread;
+
+ typedef std::map<InstrumentId, Segment *> RecordingSegmentMap;
+
+ /**
+ * Segments onto which we can record MIDI events
+ */
+ //Segment *m_recordMIDISegment;
+ RecordingSegmentMap m_recordMIDISegments;
+
+ /**
+ * Segments for recording audio (per instrument)
+ */
+ RecordingSegmentMap m_recordAudioSegments;
+
+ /**
+ * a map[Pitch] of NoteOnRecSet elements, for NoteOn calculations
+ */
+ typedef std::map<int, NoteOnRecSet> PitchMap;
+
+ /**
+ * a map[Channel] of PitchMap
+ */
+ typedef std::map<int, PitchMap> ChanMap;
+
+ /**
+ * a map[Port] of ChanMap
+ */
+ typedef std::map<int, ChanMap> NoteOnMap;
+
+ /**
+ * During recording, we collect note-ons that haven't yet had a note-off
+ * in here
+ */
+ NoteOnMap m_noteOnEvents;
+
+
+ MultiViewCommandHistory *m_commandHistory;
+
+ /**
+ * the Studio
+ */
+ Studio m_studio;
+
+ /*
+ * A configuration object
+ *
+ */
+ DocumentConfiguration m_config;
+
+ // AudioPluginManager - sequencer and local plugin management
+ //
+ AudioPluginManager *m_pluginManager;
+
+ RealTime m_audioRecordLatency;
+
+ timeT m_recordStartTime;
+
+ timeT m_quickMarkerTime;
+
+ std::vector<QString> m_orphanedRecordedAudioFiles;
+ std::vector<QString> m_orphanedDerivedAudioFiles;
+
+ // Autosave period for this document in seconds
+ //
+ int m_autoSavePeriod;
+
+ // Set to true when the dtor starts
+ bool m_beingDestroyed;
+};
+
+
+}
+
+#endif
diff --git a/src/document/XmlStorableEvent.cpp b/src/document/XmlStorableEvent.cpp
new file mode 100644
index 0000000..7688b2a
--- /dev/null
+++ b/src/document/XmlStorableEvent.cpp
@@ -0,0 +1,188 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "XmlStorableEvent.h"
+
+#include "misc/Debug.h"
+#include "misc/Strings.h"
+#include "base/Event.h"
+#include "base/NotationTypes.h"
+#include "gui/editors/notation/NotationStrings.h"
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+XmlStorableEvent::XmlStorableEvent(const QXmlAttributes &attributes,
+ timeT &absoluteTime)
+{
+ setDuration(0);
+
+ for (int i = 0; i < attributes.length(); ++i) {
+
+ QString attrName(attributes.qName(i)),
+ attrVal(attributes.value(i));
+
+ if (attrName == "package") {
+
+ RG_DEBUG << "XmlStorableEvent::XmlStorableEvent: Warning: XML still uses deprecated \"package\" attribute" << endl;
+
+ } else if (attrName == "type") {
+
+ setType(qstrtostr(attrVal));
+
+ } else if (attrName == "subordering") {
+
+ bool isNumeric = true;
+ int o = attrVal.toInt(&isNumeric);
+
+ if (!isNumeric) {
+ RG_DEBUG << "XmlStorableEvent::XmlStorableEvent: Bad subordering: " << attrVal << endl;
+ } else {
+ if (o != 0)
+ setSubOrdering(o);
+ }
+
+ } else if (attrName == "duration") {
+
+ bool isNumeric = true;
+ timeT d = attrVal.toInt(&isNumeric);
+
+ if (!isNumeric) {
+ try {
+ Note n(NotationStrings::getNoteForName(attrVal));
+ setDuration(n.getDuration());
+ } catch (NotationStrings::MalformedNoteName m) {
+ RG_DEBUG << "XmlStorableEvent::XmlStorableEvent: Bad duration: " << attrVal << " (" << m.getMessage() << ")" << endl;
+ }
+ } else {
+ setDuration(d);
+ }
+
+ } else if (attrName == "absoluteTime") {
+
+ bool isNumeric = true;
+ timeT t = attrVal.toInt(&isNumeric);
+
+ if (!isNumeric) {
+ RG_DEBUG << "XmlStorableEvent::XmlStorableEvent: Bad absolute time: " << attrVal << endl;
+ } else {
+ absoluteTime = t;
+ }
+
+ } else if (attrName == "timeOffset") {
+
+ bool isNumeric = true;
+ timeT t = attrVal.toInt(&isNumeric);
+
+ if (!isNumeric) {
+ RG_DEBUG << "XmlStorableEvent::XmlStorableEvent: Bad time offset: " << attrVal << endl;
+ } else {
+ absoluteTime += t;
+ }
+
+ } else {
+
+ // set generic property
+ //
+ QString val(attrVal);
+
+ // Check if boolean val
+ QString valLowerCase(val.lower());
+ bool isNumeric;
+ int numVal;
+
+ if (valLowerCase == "true" || valLowerCase == "false") {
+
+ set
+ <Bool>(qstrtostr(attrName), valLowerCase == "true");
+
+ } else {
+
+ // Not a bool, check if integer val
+ numVal = val.toInt(&isNumeric);
+ if (isNumeric) {
+ set
+ <Int>(qstrtostr(attrName), numVal);
+ } else {
+ // not an int either, default to string
+ set
+ <String>(qstrtostr(attrName), qstrtostr(attrVal));
+ }
+ }
+ }
+ }
+
+ setAbsoluteTime(absoluteTime);
+}
+
+XmlStorableEvent::XmlStorableEvent(Event &e) :
+ Event(e)
+{}
+
+void
+XmlStorableEvent::setPropertyFromAttributes(const QXmlAttributes &attributes,
+ bool persistent)
+{
+ bool have = false;
+ QString name = attributes.value("name");
+ if (name == "") {
+ RG_DEBUG << "XmlStorableEvent::setProperty: no property name found, ignoring" << endl;
+ return ;
+ }
+
+ for (int i = 0; i < attributes.length(); ++i) {
+ QString attrName(attributes.qName(i)),
+ attrVal(attributes.value(i));
+
+ if (attrName == "name") {
+ continue;
+ } else if (have) {
+ RG_DEBUG << "XmlStorableEvent::setProperty: multiple values found, ignoring all but the first" << endl;
+ continue;
+ } else if (attrName == "bool") {
+ set
+ <Bool>(qstrtostr(name), attrVal.lower() == "true",
+ persistent);
+ have = true;
+ } else if (attrName == "int") {
+ set
+ <Int>(qstrtostr(name), attrVal.toInt(), persistent);
+ have = true;
+ } else if (attrName == "string") {
+ set
+ <String>(qstrtostr(name), qstrtostr(attrVal), persistent);
+ have = true;
+ } else {
+ RG_DEBUG << "XmlStorableEvent::setProperty: unknown attribute name \"" << name << "\", ignoring" << endl;
+ }
+ }
+
+ if (!have)
+ RG_DEBUG << "XmlStorableEvent::setProperty: Warning: no property value found for property " << name << endl;
+}
+
+}
diff --git a/src/document/XmlStorableEvent.h b/src/document/XmlStorableEvent.h
new file mode 100644
index 0000000..197c9cb
--- /dev/null
+++ b/src/document/XmlStorableEvent.h
@@ -0,0 +1,75 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_XMLSTORABLEEVENT_H_
+#define _RG_XMLSTORABLEEVENT_H_
+
+#include "base/Event.h"
+#include <qxml.h>
+
+
+class QXmlAttributes;
+
+
+namespace Rosegarden
+{
+
+
+
+/**
+ * An Event which can generate an XML representation of itself,
+ * or which can be constructed from a set of XML attributes
+ *
+ * @see RoseXmlHandler
+ */
+class XmlStorableEvent : public Event
+{
+public:
+ /**
+ * Construct an XmlStorableEvent out of the XML attributes \a atts.
+ * If the attributes do not include absoluteTime, use the given
+ * value plus the value of any timeOffset attribute. If the
+ * attributes include absoluteTime or timeOffset, update the given
+ * absoluteTime reference accordingly.
+ */
+ XmlStorableEvent(const QXmlAttributes& atts,
+ timeT &absoluteTime);
+
+ /**
+ * Construct an XmlStorableEvent from the specified Event.
+ */
+ XmlStorableEvent(Event&);
+
+ /**
+ * Set a property from the XML attributes \a atts
+ */
+ void setPropertyFromAttributes(const QXmlAttributes& atts,
+ bool persistent);
+};
+
+
+}
+
+#endif
diff --git a/src/document/XmlSubHandler.cpp b/src/document/XmlSubHandler.cpp
new file mode 100644
index 0000000..eef2199
--- /dev/null
+++ b/src/document/XmlSubHandler.cpp
@@ -0,0 +1,37 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include "XmlSubHandler.h"
+
+namespace Rosegarden {
+
+XmlSubHandler::XmlSubHandler()
+{
+}
+
+XmlSubHandler::~XmlSubHandler()
+{
+}
+
+}
diff --git a/src/document/XmlSubHandler.h b/src/document/XmlSubHandler.h
new file mode 100644
index 0000000..30ba784
--- /dev/null
+++ b/src/document/XmlSubHandler.h
@@ -0,0 +1,58 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_XMLSUBHANDLER_H_
+#define _RG_XMLSUBHANDLER_H_
+
+#include <qstring.h>
+#include <qxml.h>
+
+namespace Rosegarden {
+
+class XmlSubHandler
+{
+public:
+ XmlSubHandler();
+ virtual ~XmlSubHandler();
+
+ virtual bool startElement(const QString& namespaceURI,
+ const QString& localName,
+ const QString& qName,
+ const QXmlAttributes& atts) = 0;
+
+ /**
+ * @param finished : if set to true on return, means that
+ * the handler should be deleted
+ */
+ virtual bool endElement(const QString& namespaceURI,
+ const QString& localName,
+ const QString& qName,
+ bool& finished) = 0;
+
+ virtual bool characters(const QString& ch) = 0;
+};
+
+}
+
+#endif /*_RG_XMLSUBHANDLER_H_*/
diff --git a/src/document/io/CsoundExporter.cpp b/src/document/io/CsoundExporter.cpp
new file mode 100644
index 0000000..9b61372
--- /dev/null
+++ b/src/document/io/CsoundExporter.cpp
@@ -0,0 +1,154 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "CsoundExporter.h"
+
+#include "base/Event.h"
+#include "base/BaseProperties.h"
+#include "base/Composition.h"
+#include "base/NotationTypes.h"
+#include "base/Segment.h"
+#include "base/Track.h"
+#include "gui/general/ProgressReporter.h"
+#include <qobject.h>
+#include <fstream>
+#include "gui/application/RosegardenApplication.h"
+
+
+namespace Rosegarden
+{
+
+CsoundExporter::CsoundExporter(QObject *parent,
+ Composition *composition,
+ std::string fileName) :
+ ProgressReporter(parent, "csoundExporter"),
+ m_composition(composition),
+ m_fileName(fileName)
+{
+ // nothing else
+}
+
+CsoundExporter::~CsoundExporter()
+{
+ // nothing
+}
+
+static double
+convertTime(Rosegarden::timeT t)
+{
+ return double(t) / double(Note(Note::Crotchet).getDuration());
+}
+
+bool
+CsoundExporter::write()
+{
+ std::ofstream str(m_fileName.c_str(), std::ios::out);
+ if (!str) {
+ //std::cerr << "CsoundExporter::write() - can't write file" << std::endl;
+ return false;
+ }
+
+ str << ";; Csound score file written by Rosegarden\n\n";
+ if (m_composition->getCopyrightNote() != "") {
+ str << ";; Copyright note:\n;; "
+ //!!! really need to remove newlines from copyright note
+ << m_composition->getCopyrightNote() << "\n";
+ }
+
+ int trackNo = 0;
+ for (Composition::iterator i = m_composition->begin();
+ i != m_composition->end(); ++i) {
+
+ emit setProgress(int(double(trackNo++) / double(m_composition->getNbTracks()) * 100.0));
+ rgapp->refreshGUI(50);
+
+ str << "\n;; Segment: \"" << (*i)->getLabel() << "\"\n";
+ str << ";; on Track: \""
+ << m_composition->getTrackById((*i)->getTrack())->getLabel()
+ << "\"\n";
+ str << ";;\n;; Inst\tTime\tDur\tPitch\tVely\n"
+ << ";; ----\t----\t---\t-----\t----\n";
+
+ for (Segment::iterator j = (*i)->begin(); j != (*i)->end(); ++j) {
+
+ if ((*j)->isa(Note::EventType)) {
+
+ long pitch = 0;
+ (*j)->get
+ <Int>(BaseProperties::PITCH, pitch);
+
+ long velocity = 127;
+ (*j)->get
+ <Int>(BaseProperties::VELOCITY, velocity);
+
+ str << " i"
+ << (*i)->getTrack() << "\t"
+ << convertTime((*j)->getAbsoluteTime()) << "\t"
+ << convertTime((*j)->getDuration()) << "\t"
+ << 3 + (pitch / 12) << ((pitch % 12) < 10 ? ".0" : ".")
+ << pitch % 12 << "\t"
+ << velocity << "\t\n";
+
+ } else {
+ str << ";; Event type: " << (*j)->getType() << std::endl;
+ }
+ }
+ }
+
+ int tempoCount = m_composition->getTempoChangeCount();
+
+ if (tempoCount > 0) {
+
+ str << "\nt ";
+
+ for (int i = 0; i < tempoCount - 1; ++i) {
+
+ std::pair<timeT, tempoT> tempoChange =
+ m_composition->getTempoChange(i);
+
+ timeT myTime = tempoChange.first;
+ timeT nextTime = myTime;
+ if (i < m_composition->getTempoChangeCount() - 1) {
+ nextTime = m_composition->getTempoChange(i + 1).first;
+ }
+
+ int tempo = int(Composition::getTempoQpm(tempoChange.second));
+
+ str << convertTime( myTime) << " " << tempo << " "
+ << convertTime(nextTime) << " " << tempo << " ";
+ }
+
+ str << convertTime(m_composition->getTempoChange(tempoCount - 1).first)
+ << " "
+ << int(Composition::getTempoQpm(m_composition->getTempoChange(tempoCount - 1).second))
+ << std::endl;
+ }
+
+ str << "\ne" << std::endl;
+ str.close();
+ return true;
+}
+
+}
diff --git a/src/document/io/CsoundExporter.h b/src/document/io/CsoundExporter.h
new file mode 100644
index 0000000..0e8c2ac
--- /dev/null
+++ b/src/document/io/CsoundExporter.h
@@ -0,0 +1,63 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_CSOUNDEXPORTER_H_
+#define _RG_CSOUNDEXPORTER_H_
+
+#include "gui/general/ProgressReporter.h"
+#include <string>
+
+
+class QObject;
+
+
+namespace Rosegarden
+{
+
+class Composition;
+
+
+/**
+ * Csound scorefile export
+ */
+
+class CsoundExporter : public ProgressReporter
+{
+public:
+ CsoundExporter(QObject *parent, Composition *, std::string fileName);
+ ~CsoundExporter();
+
+ bool write();
+
+protected:
+ Composition *m_composition;
+ std::string m_fileName;
+};
+
+
+
+}
+
+#endif
diff --git a/src/document/io/HydrogenLoader.cpp b/src/document/io/HydrogenLoader.cpp
new file mode 100644
index 0000000..38f85fe
--- /dev/null
+++ b/src/document/io/HydrogenLoader.cpp
@@ -0,0 +1,74 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "HydrogenLoader.h"
+
+#include <qxml.h>
+#include "base/Composition.h"
+#include "base/PropertyName.h"
+#include "base/Segment.h"
+#include "base/Studio.h"
+#include "gui/general/ProgressReporter.h"
+#include "HydrogenXMLHandler.h"
+#include <qfile.h>
+#include <qobject.h>
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+HydrogenLoader::HydrogenLoader(Studio *studio,
+ QObject *parent, const char *name):
+ ProgressReporter(parent, name),
+ m_studio(studio)
+{}
+
+bool
+HydrogenLoader::load(const QString& fileName, Composition &comp)
+{
+ m_composition = &comp;
+ comp.clear();
+
+ QFile file(fileName);
+ if (!file.open(IO_ReadOnly)) {
+ return false;
+ }
+
+ m_studio->unassignAllInstruments();
+
+ HydrogenXMLHandler handler(m_composition);
+
+ QXmlInputSource source(file);
+ QXmlSimpleReader reader;
+ reader.setContentHandler(&handler);
+ reader.setErrorHandler(&handler);
+
+ bool ok = reader.parse(source);
+
+ return ok;
+}
+
+}
diff --git a/src/document/io/HydrogenLoader.h b/src/document/io/HydrogenLoader.h
new file mode 100644
index 0000000..f0cd724
--- /dev/null
+++ b/src/document/io/HydrogenLoader.h
@@ -0,0 +1,83 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_HYDROGENLOADER_H_
+#define _RG_HYDROGENLOADER_H_
+
+#include "base/PropertyName.h"
+#include "gui/general/ProgressReporter.h"
+#include <string>
+#include <vector>
+
+
+class QString;
+class QObject;
+
+
+namespace Rosegarden
+{
+
+class Studio;
+class Segment;
+class Composition;
+
+
+/**
+ * Hydrogen drum machine file importer - should work for 0.8.1 and above
+ * assuming they don't change the file spec without telling us.
+ *
+ */
+
+class HydrogenLoader : public ProgressReporter
+{
+public:
+ HydrogenLoader(Studio *,
+ QObject *parent = 0, const char *name = 0);
+
+ /**
+ * Load and parse the Hydrogen file \a fileName, and write it into the
+ * given Composition (clearing the existing segment data first).
+ * Return true for success.
+ */
+ bool load(const QString& fileName, Composition &);
+
+protected:
+ Composition *m_composition;
+ Studio *m_studio;
+ std::string m_fileName;
+
+private:
+ static const int MAX_DOTS = 4;
+ static const PropertyName SKIP_PROPERTY;
+};
+
+typedef std::vector<std::pair<std::string, Segment*> > SegmentMap;
+typedef std::vector<std::pair<std::string, Segment*> >::iterator SegmentMapIterator;
+typedef std::vector<std::pair<std::string, Segment*> >::const_iterator SegmentMapConstIterator;
+
+
+}
+
+#endif
diff --git a/src/document/io/HydrogenXMLHandler.cpp b/src/document/io/HydrogenXMLHandler.cpp
new file mode 100644
index 0000000..68e1b20
--- /dev/null
+++ b/src/document/io/HydrogenXMLHandler.cpp
@@ -0,0 +1,403 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "HydrogenXMLHandler.h"
+
+#include "base/Event.h"
+#include "base/BaseProperties.h"
+#include <klocale.h>
+#include "misc/Debug.h"
+#include "misc/Strings.h"
+#include "base/Composition.h"
+#include "base/Instrument.h"
+#include "base/MidiProgram.h"
+#include "base/NotationTypes.h"
+#include "base/Segment.h"
+#include "base/Track.h"
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+HydrogenXMLHandler::HydrogenXMLHandler(Composition *composition,
+ InstrumentId drumIns):
+ m_composition(composition),
+ m_drumInstrument(drumIns),
+ m_inNote(false),
+ m_inInstrument(false),
+ m_inPattern(false),
+ m_inSequence(false),
+ m_patternName(""),
+ m_patternSize(0),
+ m_sequenceName(""),
+ m_position(0),
+ m_velocity(0.0),
+ m_panL(0.0),
+ m_panR(0.0),
+ m_pitch(0.0),
+ m_instrument(0),
+ m_id(0),
+ m_muted(false),
+ m_fileName(""),
+ m_bpm(0),
+ m_volume(0.0),
+ m_name(""),
+ m_author(""),
+ m_notes(""),
+ m_songMode(false),
+ m_version(""),
+ m_currentProperty(""),
+ m_segment(0),
+ m_currentTrackNb(0),
+ m_segmentAdded(false),
+ m_currentBar(0),
+ m_newSegment(false)
+{}
+
+bool
+HydrogenXMLHandler::startDocument()
+{
+ RG_DEBUG << "HydrogenXMLHandler::startDocument" << endl;
+
+ m_inNote = false;
+ m_inInstrument = false;
+ m_inPattern = false;
+ m_inSequence = false;
+
+ // Pattern attributes
+ //
+ m_patternName = "";
+ m_patternSize = 0;
+
+ // Sequence attributes
+ //
+ m_sequenceName = "";
+
+ // Note attributes
+ //
+ m_position = 0;
+ m_velocity = 0.0;
+ m_panL = 0.0;
+ m_panR = 0.0;
+ m_pitch = 0.0;
+ m_instrument = 0;
+
+ // Instrument attributes
+ //
+ m_id = 0;
+ m_muted = false;
+ m_instrumentVolumes.clear();
+ m_fileName = "";
+
+ // Global attributes
+ //
+ m_bpm = 0;
+ m_volume = 0.0;
+ m_name = "";
+ m_author = "";
+ m_notes = "";
+ m_songMode = false;
+ m_version = "";
+
+ m_currentProperty = "";
+
+ m_segment = 0;
+ m_currentTrackNb = 0;
+ m_segmentAdded = 0;
+ m_currentBar = 0;
+ m_newSegment = false;
+
+ return true;
+}
+
+bool
+HydrogenXMLHandler::startElement(const QString& /*namespaceURI*/,
+ const QString& /*localName*/,
+ const QString& qName,
+ const QXmlAttributes& /*atts*/)
+{
+ QString lcName = qName.lower();
+
+ if (lcName == "note") {
+
+ if (m_inInstrument)
+ return false;
+
+ m_inNote = true;
+
+ } else if (lcName == "instrument") {
+
+ // Beware instrument attributes inside Notes
+ if (!m_inNote)
+ m_inInstrument = true;
+ } else if (lcName == "pattern") {
+ m_inPattern = true;
+ m_segmentAdded = false; // flag the segments being added
+ } else if (lcName == "sequence") {
+
+ // Create a new segment and set some flags
+ //
+ m_segment = new Segment();
+ m_newSegment = true;
+ m_inSequence = true;
+ }
+
+ m_currentProperty = lcName;
+
+ return true;
+}
+
+bool
+HydrogenXMLHandler::endElement(const QString& /*namespaceURI*/,
+ const QString& /*localName*/,
+ const QString& qName)
+{
+ QString lcName = qName.lower();
+
+ if (lcName == "note") {
+
+ RG_DEBUG << "HydrogenXMLHandler::endElement - Hydrogen Note : position = " << m_position
+ << ", velocity = " << m_velocity
+ << ", panL = " << m_panL
+ << ", panR = " << m_panR
+ << ", pitch = " << m_pitch
+ << ", instrument = " << m_instrument
+ << endl;
+
+ timeT barLength = m_composition->getBarEnd(m_currentBar) -
+ m_composition->getBarStart(m_currentBar);
+
+ timeT pos = m_composition->getBarStart(m_currentBar) +
+ timeT(
+ double(m_position) / double(m_patternSize) * double(barLength));
+
+ // Insert a rest if we've got a new segment
+ //
+ if (m_newSegment) {
+ Event *restEvent = new Event(Note::EventRestType,
+ m_composition->getBarStart(m_currentBar),
+ pos - m_composition->getBarStart(m_currentBar),
+ Note::EventRestSubOrdering);
+ m_segment->insert(restEvent);
+ m_newSegment = false;
+ }
+
+ // Create and insert this event
+ //
+ Event *noteEvent = new Event(Note::EventType,
+ pos, Note(Note::Semiquaver).getDuration());
+
+ // get drum mapping from instrument and calculate velocity
+ noteEvent->set
+ <Int>(
+ BaseProperties::PITCH, 36 + m_instrument);
+ noteEvent->set
+ <Int>(BaseProperties::VELOCITY,
+ int(127.0 * m_velocity * m_volume *
+ m_instrumentVolumes[m_instrument]));
+ m_segment->insert(noteEvent);
+
+ m_inNote = false;
+
+ } else if (lcName == "instrument" && m_inInstrument) {
+
+ RG_DEBUG << "HydrogenXMLHandler::endElement - Hydrogen Instrument : id = " << m_id
+ << ", muted = " << m_muted
+ << ", volume = " << m_instrumentVolumes[m_instrument]
+ << ", filename = \"" << m_fileName << "\""
+ << endl;
+
+ m_inInstrument = false;
+
+ } else if (lcName == "pattern") {
+ m_inPattern = false;
+
+ if (m_segmentAdded) {
+
+ // Add a blank track to demarcate patterns
+ //
+ Track *track = new Track
+ (m_currentTrackNb, m_drumInstrument, m_currentTrackNb,
+ "<blank spacer>", false);
+ m_currentTrackNb++;
+ m_composition->addTrack(track);
+
+ m_segmentAdded = false;
+
+ // Each pattern has it's own bar so that the imported
+ // song shows off each pattern a bar at a time.
+ //
+ m_currentBar++;
+ }
+
+ } else if (lcName == "sequence") {
+
+ // If we're closing out a sequencer tab and we have a m_segment then
+ // we should close up and add that segment. Only create if we have
+ // some Events in it
+ //
+ if (m_segment->size() > 0) {
+
+ m_segment->setTrack(m_currentTrackNb);
+
+ Track *track = new Track
+ (m_currentTrackNb, m_drumInstrument, m_currentTrackNb,
+ m_patternName, false);
+ m_currentTrackNb++;
+
+ // Enforce start and end markers for this bar so that we have a
+ // whole bar unit segment.
+ //
+ m_segment->setEndMarkerTime(m_composition->getBarEnd(m_currentBar));
+ QString label = QString("%1 - %2 %3 %4").arg(strtoqstr(m_patternName))
+ .arg(strtoqstr(m_sequenceName))
+ .arg(i18n(" imported from Hydrogen ")).arg(strtoqstr(m_version));
+ m_segment->setLabel(qstrtostr(label));
+
+ m_composition->addTrack(track);
+ m_composition->addSegment(m_segment);
+ m_segment = 0;
+
+ m_segmentAdded = true;
+ }
+
+ m_inSequence = false;
+
+ }
+
+ return true;
+}
+
+bool
+HydrogenXMLHandler::characters(const QString& chars)
+{
+ QString ch = chars.stripWhiteSpace();
+ if (ch == "")
+ return true;
+
+ if (m_inNote) {
+ if (m_currentProperty == "position") {
+ m_position = ch.toInt();
+ } else if (m_currentProperty == "velocity") {
+ m_velocity = qstrtodouble(ch);
+ } else if (m_currentProperty == "pan_L") {
+ m_panL = qstrtodouble(ch);
+ } else if (m_currentProperty == "pan_R") {
+ m_panR = qstrtodouble(ch);
+ } else if (m_currentProperty == "pitch") {
+ m_pitch = qstrtodouble(ch);
+ } else if (m_currentProperty == "instrument") {
+ m_instrument = ch.toInt();
+
+ // Standard kit conversion - hardcoded conversion for Hyrdogen's default
+ // drum kit. The m_instrument mapping for low values maps well onto the
+ // kick drum GM kit starting point (MIDI pitch = 36).
+ //
+ switch (m_instrument) {
+ case 11: // Cowbell
+ m_instrument = 20;
+ break;
+ case 12: // Ride Jazz
+ m_instrument = 15;
+ break;
+ case 14: // Ride Rock
+ m_instrument = 17;
+ break;
+ case 15: // Crash Jazz
+ m_instrument = 16;
+ break;
+
+ default:
+ break;
+ }
+
+ }
+ } else if (m_inInstrument) {
+ if (m_currentProperty == "id") {
+ m_id = ch.toInt();
+ } else if (m_currentProperty == "ismuted") {
+ if (ch.lower() == "true")
+ m_muted = true;
+ else
+ m_muted = false;
+ } else if (m_currentProperty == "filename") {
+ m_fileName = qstrtostr(chars); // don't strip whitespace from the filename
+ } else if (m_currentProperty == "volume") {
+ m_instrumentVolumes.push_back(qstrtodouble(ch));
+ }
+
+
+ } else if (m_inPattern) {
+
+ // Pattern attributes
+
+ if (m_currentProperty == "name") {
+ if (m_inSequence)
+ m_sequenceName = qstrtostr(chars);
+ else
+ m_patternName = qstrtostr(chars);
+ } else if (m_currentProperty == "size") {
+ m_patternSize = ch.toInt();
+ }
+
+ } else {
+
+ // Global attributes
+ if (m_currentProperty == "version") {
+ m_version = qstrtostr(chars);
+ } else if (m_currentProperty == "bpm") {
+
+ m_bpm = qstrtodouble(ch);
+ m_composition->addTempoAtTime
+ (0, Composition::getTempoForQpm(m_bpm));
+
+ } else if (m_currentProperty == "volume") {
+ m_volume = qstrtodouble(ch);
+ } else if (m_currentProperty == "name") {
+ m_name = qstrtostr(chars);
+ } else if (m_currentProperty == "author") {
+ m_author = qstrtostr(chars);
+ } else if (m_currentProperty == "notes") {
+ m_notes = qstrtostr(chars);
+ } else if (m_currentProperty == "mode") {
+ if (ch.lower() == "song")
+ m_songMode = true;
+ else
+ m_songMode = false;
+ }
+ }
+
+ return true;
+}
+
+bool
+HydrogenXMLHandler::endDocument()
+{
+ RG_DEBUG << "HydrogenXMLHandler::endDocument" << endl;
+ return true;
+}
+
+}
diff --git a/src/document/io/HydrogenXMLHandler.h b/src/document/io/HydrogenXMLHandler.h
new file mode 100644
index 0000000..0bce68b
--- /dev/null
+++ b/src/document/io/HydrogenXMLHandler.h
@@ -0,0 +1,132 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_HYDROGENXMLHANDLER_H_
+#define _RG_HYDROGENXMLHANDLER_H_
+
+#include "HydrogenLoader.h"
+#include "base/MidiProgram.h"
+#include "base/Track.h"
+#include <string>
+#include <qstring.h>
+#include <vector>
+#include <qxml.h>
+
+
+class QXmlAttributes;
+
+
+namespace Rosegarden
+{
+
+class Segment;
+class Composition;
+
+
+class HydrogenXMLHandler : public QXmlDefaultHandler
+{
+public:
+ HydrogenXMLHandler(Composition *comp,
+ InstrumentId drumInstrument = MidiInstrumentBase + 9);
+
+ /**
+ * Overloaded handler functions
+ */
+ virtual bool startDocument();
+ virtual bool startElement(const QString& namespaceURI,
+ const QString& localName,
+ const QString& qName,
+ const QXmlAttributes& atts);
+
+ virtual bool endElement(const QString& namespaceURI,
+ const QString& localName,
+ const QString& qName);
+
+ virtual bool characters(const QString& ch);
+
+ virtual bool endDocument ();
+
+protected:
+ Composition *m_composition;
+ InstrumentId m_drumInstrument;
+
+ bool m_inNote;
+ bool m_inInstrument;
+ bool m_inPattern;
+ bool m_inSequence;
+
+ // Pattern attributes
+ //
+ std::string m_patternName;
+ int m_patternSize;
+
+ // Sequence attributes
+ //
+ std::string m_sequenceName;
+
+ // Note attributes
+ //
+ int m_position;
+ double m_velocity;
+ double m_panL;
+ double m_panR;
+ double m_pitch;
+ int m_instrument;
+
+ // Instrument attributes
+ //
+ int m_id;
+ bool m_muted;
+ std::vector<double> m_instrumentVolumes;
+ std::string m_fileName;
+
+ // Global attributes
+ //
+ double m_bpm;
+ double m_volume;
+ std::string m_name;
+ std::string m_author;
+ std::string m_notes;
+ bool m_songMode; // Song mode or pattern mode?
+ std::string m_version;
+
+ //
+ QString m_currentProperty;
+
+ Segment *m_segment;
+ TrackId m_currentTrackNb;
+ bool m_segmentAdded;
+ int m_currentBar;
+ bool m_newSegment;
+
+ SegmentMap m_segmentMap;
+
+};
+
+
+
+}
+
+#endif
diff --git a/src/document/io/LilyPondExporter.cpp b/src/document/io/LilyPondExporter.cpp
new file mode 100644
index 0000000..68731f8
--- /dev/null
+++ b/src/document/io/LilyPondExporter.cpp
@@ -0,0 +1,2419 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ This file is Copyright 2002
+ Hans Kieserman <[email protected]>
+ with heavy lifting from csoundio as it was on 13/5/2002.
+
+ Numerous additions and bug fixes by
+ Michael McIntyre <[email protected]>
+
+ Some restructuring by Chris Cannam.
+
+ Massive brain surgery, fixes, improvements, and additions by
+ Heikki Junes
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "LilyPondExporter.h"
+
+#include <klocale.h>
+#include "misc/Debug.h"
+#include "misc/Strings.h"
+#include "document/ConfigGroups.h"
+#include "base/BaseProperties.h"
+#include "base/Composition.h"
+#include "base/Configuration.h"
+#include "base/Event.h"
+#include "base/Exception.h"
+#include "base/Instrument.h"
+#include "base/NotationTypes.h"
+#include "base/PropertyName.h"
+#include "base/Segment.h"
+#include "base/SegmentNotationHelper.h"
+#include "base/Sets.h"
+#include "base/Staff.h"
+#include "base/Studio.h"
+#include "base/Track.h"
+#include "base/NotationQuantizer.h"
+#include "base/Marker.h"
+#include "base/StaffExportTypes.h"
+#include "document/RosegardenGUIDoc.h"
+#include "gui/application/RosegardenApplication.h"
+#include "gui/application/RosegardenGUIView.h"
+#include "gui/editors/notation/NotationProperties.h"
+#include "gui/editors/notation/NotationView.h"
+#include "gui/editors/guitar/Chord.h"
+#include "gui/general/ProgressReporter.h"
+#include "gui/widgets/CurrentProgressDialog.h"
+#include <kconfig.h>
+#include <kmessagebox.h>
+#include <qfileinfo.h>
+#include <qobject.h>
+#include <qregexp.h>
+#include <qstring.h>
+#include <qtextcodec.h>
+#include <kapplication.h>
+#include <sstream>
+#include <algorithm>
+
+namespace Rosegarden
+{
+
+using namespace BaseProperties;
+
+const PropertyName LilyPondExporter::SKIP_PROPERTY
+ = "LilyPondExportSkipThisEvent";
+
+LilyPondExporter::LilyPondExporter(RosegardenGUIApp *parent,
+ RosegardenGUIDoc *doc,
+ std::string fileName) :
+ ProgressReporter((QObject *)parent, "lilypondExporter"),
+ m_doc(doc),
+ m_fileName(fileName),
+ m_lastClefFound(Clef::Treble)
+{
+ m_composition = &m_doc->getComposition();
+ m_studio = &m_doc->getStudio();
+ m_view = ((RosegardenGUIApp *)parent)->getView();
+ m_notationView = NULL;
+
+ readConfigVariables();
+}
+
+LilyPondExporter::LilyPondExporter(NotationView *parent,
+ RosegardenGUIDoc *doc,
+ std::string fileName) :
+ ProgressReporter((QObject *)parent, "lilypondExporter"),
+ m_doc(doc),
+ m_fileName(fileName),
+ m_lastClefFound(Clef::Treble)
+
+{
+ m_composition = &m_doc->getComposition();
+ m_studio = &m_doc->getStudio();
+ m_view = NULL;
+ m_notationView = ((NotationView *)parent);
+
+ readConfigVariables();
+}
+
+void
+LilyPondExporter::readConfigVariables(void)
+{
+ // grab config info
+ KConfig *cfg = kapp->config();
+ cfg->setGroup(NotationViewConfigGroup);
+
+ m_paperSize = cfg->readUnsignedNumEntry("lilypapersize", PAPER_A4);
+ m_paperLandscape = cfg->readBoolEntry("lilypaperlandscape", false);
+ m_fontSize = cfg->readUnsignedNumEntry("lilyfontsize", FONT_20);
+ m_raggedBottom = cfg->readBoolEntry("lilyraggedbottom", false);
+ m_exportSelection = cfg->readUnsignedNumEntry("lilyexportselection", EXPORT_NONMUTED_TRACKS);
+ m_exportLyrics = cfg->readBoolEntry("lilyexportlyrics", true);
+ m_exportMidi = cfg->readBoolEntry("lilyexportmidi", false);
+ m_exportTempoMarks = cfg->readUnsignedNumEntry("lilyexporttempomarks", EXPORT_NONE_TEMPO_MARKS);
+ m_exportPointAndClick = cfg->readBoolEntry("lilyexportpointandclick", false);
+ m_exportBeams = cfg->readBoolEntry("lilyexportbeamings", false);
+ m_exportStaffMerge = cfg->readBoolEntry("lilyexportstaffmerge", false);
+ m_exportStaffGroup = cfg->readBoolEntry("lilyexportstaffbrackets", true);
+ m_lyricsHAlignment = cfg->readBoolEntry("lilylyricshalignment", LEFT_ALIGN);
+
+ m_languageLevel = cfg->readUnsignedNumEntry("lilylanguage", LILYPOND_VERSION_2_6);
+ m_exportMarkerMode = cfg->readUnsignedNumEntry("lilyexportmarkermode", EXPORT_NO_MARKERS );
+}
+
+LilyPondExporter::~LilyPondExporter()
+{
+ // nothing
+}
+
+void
+LilyPondExporter::handleStartingEvents(eventstartlist &eventsToStart,
+ std::ofstream &str)
+{
+ eventstartlist::iterator m = eventsToStart.begin();
+
+ while (m != eventsToStart.end()) {
+
+ try {
+ Indication i(**m);
+
+ if (i.getIndicationType() == Indication::Slur) {
+ if ((*m)->get
+ <Bool>(NotationProperties::SLUR_ABOVE))
+ str << "^( ";
+ else
+ str << "_( ";
+ } else if (i.getIndicationType() == Indication::PhrasingSlur) {
+ if ((*m)->get
+ <Bool>(NotationProperties::SLUR_ABOVE))
+ str << "^\\( ";
+ else
+ str << "_\\( ";
+ } else if (i.getIndicationType() == Indication::Crescendo) {
+ str << "\\< ";
+ } else if (i.getIndicationType() == Indication::Decrescendo) {
+ str << "\\> ";
+ }
+
+ } catch (Event::BadType) {
+ // Not an indication
+ } catch (Event::NoData e) {
+ std::cerr << "Bad indication: " << e.getMessage() << std::endl;
+ }
+
+ eventstartlist::iterator n(m);
+ ++n;
+ eventsToStart.erase(m);
+ m = n;
+ }
+}
+
+void
+LilyPondExporter::handleEndingEvents(eventendlist &eventsInProgress,
+ const Segment::iterator &j,
+ std::ofstream &str)
+{
+ eventendlist::iterator k = eventsInProgress.begin();
+
+ while (k != eventsInProgress.end()) {
+
+ eventendlist::iterator l(k);
+ ++l;
+
+ // Handle and remove all the relevant events in progress
+ // This assumes all deferred events are indications
+
+ try {
+ Indication i(**k);
+
+ timeT indicationEnd =
+ (*k)->getNotationAbsoluteTime() + i.getIndicationDuration();
+ timeT eventEnd =
+ (*j)->getNotationAbsoluteTime() + (*j)->getNotationDuration();
+
+ if (indicationEnd < eventEnd ||
+ ((i.getIndicationType() == Indication::Slur ||
+ i.getIndicationType() == Indication::PhrasingSlur) &&
+ indicationEnd == eventEnd)) {
+
+ if (i.getIndicationType() == Indication::Slur) {
+ str << ") ";
+ } else if (i.getIndicationType() == Indication::PhrasingSlur) {
+ str << "\\) ";
+ } else if (i.getIndicationType() == Indication::Crescendo ||
+ i.getIndicationType() == Indication::Decrescendo) {
+ str << "\\! ";
+ }
+
+ eventsInProgress.erase(k);
+ }
+
+ } catch (Event::BadType) {
+ // not an indication
+
+ } catch (Event::NoData e) {
+ std::cerr << "Bad indication: " << e.getMessage() << std::endl;
+ }
+
+ k = l;
+ }
+}
+
+std::string
+LilyPondExporter::convertPitchToLilyNote(int pitch, Accidental accidental,
+ const Rosegarden::Key &key)
+{
+ Pitch p(pitch, accidental);
+ std::string lilyNote = "";
+
+ lilyNote += (char)tolower(p.getNoteName(key));
+ // std::cout << "lilyNote: " << lilyNote << std::endl;
+ Accidental acc = p.getAccidental(key);
+ if (acc == Accidentals::DoubleFlat)
+ lilyNote += "eses";
+ else if (acc == Accidentals::Flat)
+ lilyNote += "es";
+ else if (acc == Accidentals::Sharp)
+ lilyNote += "is";
+ else if (acc == Accidentals::DoubleSharp)
+ lilyNote += "isis";
+
+ return lilyNote;
+}
+
+std::string
+LilyPondExporter::composeLilyMark(std::string eventMark, bool stemUp)
+{
+
+ std::string inStr = "", outStr = "";
+ std::string prefix = (stemUp) ? "_" : "^";
+
+ // shoot text mark straight through unless it's sf or rf
+ if (Marks::isTextMark(eventMark)) {
+ inStr = protectIllegalChars(Marks::getTextFromMark(eventMark));
+
+ if (inStr == "sf") {
+ inStr = "\\sf";
+ } else if (inStr == "rf") {
+ inStr = "\\rfz";
+ } else {
+ inStr = "\\markup { \\italic " + inStr + " } ";
+ }
+
+ outStr = prefix + inStr;
+
+ } else if (Marks::isFingeringMark(eventMark)) {
+
+ // fingering marks: use markup syntax only for non-trivial fingerings
+
+ inStr = protectIllegalChars(Marks::getFingeringFromMark(eventMark));
+
+ if (inStr != "0" && inStr != "1" && inStr != "2" && inStr != "3" && inStr != "4" && inStr != "5" && inStr != "+" ) {
+ inStr = "\\markup { \\finger \"" + inStr + "\" } ";
+ }
+
+ outStr = prefix + inStr;
+
+ } else {
+ outStr = "-";
+
+ // use full \accent format for everything, even though some shortcuts
+ // exist, for the sake of consistency
+ if (eventMark == Marks::Accent) {
+ outStr += "\\accent";
+ } else if (eventMark == Marks::Tenuto) {
+ outStr += "\\tenuto";
+ } else if (eventMark == Marks::Staccato) {
+ outStr += "\\staccato";
+ } else if (eventMark == Marks::Staccatissimo) {
+ outStr += "\\staccatissimo";
+ } else if (eventMark == Marks::Marcato) {
+ outStr += "\\marcato";
+ } else if (eventMark == Marks::Trill) {
+ outStr += "\\trill";
+ } else if (eventMark == Marks::LongTrill) {
+ // span trill up to the next note:
+ // tweak the beginning of the next note using an invisible rest having zero length
+ outStr += "\\startTrillSpan s4*0 \\stopTrillSpan";
+ } else if (eventMark == Marks::Turn) {
+ outStr += "\\turn";
+ } else if (eventMark == Marks::Pause) {
+ outStr += "\\fermata";
+ } else if (eventMark == Marks::UpBow) {
+ outStr += "\\upbow";
+ } else if (eventMark == Marks::DownBow) {
+ outStr += "\\downbow";
+ } else {
+ outStr = "";
+ std::cerr << "LilyPondExporter::composeLilyMark() - unhandled mark: "
+ << eventMark << std::endl;
+ }
+ }
+
+ return outStr;
+}
+
+std::string
+LilyPondExporter::indent(const int &column)
+{
+ std::string outStr = "";
+ for (int c = 1; c <= column; c++) {
+ outStr += " ";
+ }
+ return outStr;
+}
+
+std::string
+LilyPondExporter::protectIllegalChars(std::string inStr)
+{
+
+ QString tmpStr = strtoqstr(inStr);
+
+ tmpStr.replace(QRegExp("&"), "\\&");
+ tmpStr.replace(QRegExp("\\^"), "\\^");
+ tmpStr.replace(QRegExp("%"), "\\%");
+ tmpStr.replace(QRegExp("<"), "\\<");
+ tmpStr.replace(QRegExp(">"), "\\>");
+ tmpStr.replace(QRegExp("\\["), "");
+ tmpStr.replace(QRegExp("\\]"), "");
+ tmpStr.replace(QRegExp("\\{"), "");
+ tmpStr.replace(QRegExp("\\}"), "");
+
+ //
+ // LilyPond uses utf8 encoding.
+ //
+ return tmpStr.utf8().data();
+}
+
+struct MarkerComp {
+ // Sort Markers by time
+ // Perhaps this should be made generic with a template?
+ bool operator()( Marker *a, Marker *b ) {
+ return a->getTime() < b->getTime();
+ }
+};
+
+bool
+LilyPondExporter::write()
+{
+ QString tmpName = strtoqstr(m_fileName);
+
+ // dmm - modified to act upon the filename itself, rather than the whole
+ // path; fixes bug #855349
+
+ // split name into parts:
+ QFileInfo nfo(tmpName);
+ QString dirName = nfo.dirPath();
+ QString baseName = nfo.fileName();
+
+ // sed LilyPond-choking chars out of the filename proper
+ bool illegalFilename = (baseName.contains(' ') || baseName.contains("\\"));
+ baseName.replace(QRegExp(" "), "");
+ baseName.replace(QRegExp("\\\\"), "");
+ baseName.replace(QRegExp("'"), "");
+ baseName.replace(QRegExp("\""), "");
+
+ // cat back together
+ tmpName = dirName + '/' + baseName;
+
+ if (illegalFilename) {
+ CurrentProgressDialog::freeze();
+ int reply = KMessageBox::warningContinueCancel(
+ 0, i18n("LilyPond does not allow spaces or backslashes in filenames.\n\n"
+ "Would you like to use\n\n %1\n\n instead?").arg(baseName));
+ if (reply != KMessageBox::Continue)
+ return false;
+ }
+
+ std::ofstream str(qstrtostr(tmpName).c_str(), std::ios::out);
+ if (!str) {
+ std::cerr << "LilyPondExporter::write() - can't write file " << tmpName << std::endl;
+ return false;
+ }
+
+ str << "% This LilyPond file was generated by Rosegarden " << protectIllegalChars(VERSION) << std::endl;
+
+ switch (m_languageLevel) {
+
+ case LILYPOND_VERSION_2_6:
+ str << "\\version \"2.6.0\"" << std::endl;
+ break;
+
+ case LILYPOND_VERSION_2_8:
+ str << "\\version \"2.8.0\"" << std::endl;
+ break;
+
+ case LILYPOND_VERSION_2_10:
+ str << "\\version \"2.10.0\"" << std::endl;
+ break;
+
+ case LILYPOND_VERSION_2_12:
+ str << "\\version \"2.12.0\"" << std::endl;
+ break;
+
+ default:
+ // force the default version if there was an error
+ std::cerr << "ERROR: Unknown language level " << m_languageLevel
+ << ", using \\version \"2.6.0\" instead" << std::endl;
+ str << "\\version \"2.6.0\"" << std::endl;
+ m_languageLevel = LILYPOND_VERSION_2_6;
+ }
+
+ // enable "point and click" debugging via pdf to make finding the
+ // unfortunately inevitable errors easier
+ if (m_exportPointAndClick) {
+ str << "% point and click debugging is enabled" << std::endl;
+ } else {
+ str << "% point and click debugging is disabled" << std::endl;
+ str << "#(ly:set-option 'point-and-click #f)" << std::endl;
+ }
+
+ // LilyPond \header block
+
+ // set indention level to make future changes to horizontal layout less
+ // tedious, ++col to indent a new level, --col to de-indent
+ int col = 0;
+
+ // grab user headers from metadata
+ Configuration metadata = m_composition->getMetadata();
+ std::vector<std::string> propertyNames = metadata.getPropertyNames();
+
+ // open \header section if there's metadata to grab, and if the user
+ // wishes it
+ if (!propertyNames.empty()) {
+ str << "\\header {" << std::endl;
+ col++; // indent+
+
+ bool userTagline = false;
+
+ for (unsigned int index = 0; index < propertyNames.size(); ++index) {
+ std::string property = propertyNames [index];
+ if (property == headerDedication || property == headerTitle ||
+ property == headerSubtitle || property == headerSubsubtitle ||
+ property == headerPoet || property == headerComposer ||
+ property == headerMeter || property == headerOpus ||
+ property == headerArranger || property == headerInstrument ||
+ property == headerPiece || property == headerCopyright ||
+ property == headerTagline) {
+ std::string header = protectIllegalChars(metadata.get<String>(property));
+ if (header != "") {
+ str << indent(col) << property << " = \"" << header << "\"" << std::endl;
+ // let users override defaults, but allow for providing
+ // defaults if they don't:
+ if (property == headerTagline)
+ userTagline = true;
+ }
+ }
+ }
+
+ // default tagline
+ if (!userTagline) {
+ str << indent(col) << "tagline = \""
+ << "Created using Rosegarden " << protectIllegalChars(VERSION) << " and LilyPond"
+ << "\"" << std::endl;
+ }
+
+ // close \header
+ str << indent(--col) << "}" << std::endl;
+ }
+
+ // LilyPond \paper block (optional)
+ if (m_raggedBottom) {
+ str << indent(col) << "\\paper {" << std::endl;
+ str << indent(++col) << "ragged-bottom=##t" << std::endl;
+ str << indent(--col) << "}" << std::endl;
+ }
+
+ // LilyPond music data! Mapping:
+ // LilyPond Voice = Rosegarden Segment
+ // LilyPond Staff = Rosegarden Track
+ // (not the cleanest output but maybe the most reliable)
+
+ // paper/font sizes
+ int font;
+ switch (m_fontSize) {
+ case 0 :
+ font = 11;
+ break;
+ case 1 :
+ font = 13;
+ break;
+ case 2 :
+ font = 16;
+ break;
+ case 3 :
+ font = 19;
+ break;
+ case 4 :
+ font = 20;
+ break;
+ case 5 :
+ font = 23;
+ break;
+ case 6 :
+ font = 26;
+ break;
+ default :
+ font = 20; // if config problem
+ }
+
+ str << indent(col) << "#(set-global-staff-size " << font << ")" << std::endl;
+
+ // write user-specified paper type as default paper size
+ std::string paper = "";
+ switch (m_paperSize) {
+ case PAPER_A3 :
+ paper += "a3";
+ break;
+ case PAPER_A4 :
+ paper += "a4";
+ break;
+ case PAPER_A5 :
+ paper += "a5";
+ break;
+ case PAPER_A6 :
+ paper += "a6";
+ break;
+ case PAPER_LEGAL :
+ paper += "legal";
+ break;
+ case PAPER_LETTER :
+ paper += "letter";
+ break;
+ case PAPER_TABLOID :
+ paper += "tabloid";
+ break;
+ case PAPER_NONE :
+ paper = "";
+ break; // "do not specify"
+ }
+ if (paper != "") {
+ str << indent(col) << "#(set-default-paper-size \"" << paper << "\""
+ << (m_paperLandscape ? " 'landscape" : "") << ")"
+ << std::endl;
+ }
+
+ // Find out the printed length of the composition
+ Composition::iterator i = m_composition->begin();
+ if ((*i) == NULL) {
+ str << indent(col) << "\\score {" << std::endl;
+ str << indent(++col) << "% no segments found" << std::endl;
+ // bind staffs with or without staff group bracket
+ str << indent(col) // indent
+ << "<<" << " s4 " << ">>" << std::endl;
+ str << indent(col) << "\\layout { }" << std::endl;
+ str << indent(--col) << "}" << std::endl;
+ return true;
+ }
+ timeT compositionStartTime = (*i)->getStartTime();
+ timeT compositionEndTime = (*i)->getEndMarkerTime();
+ for (; i != m_composition->end(); ++i) {
+ if (compositionStartTime > (*i)->getStartTime() && (*i)->getTrack() >= 0) {
+ compositionStartTime = (*i)->getStartTime();
+ }
+ if (compositionEndTime < (*i)->getEndMarkerTime()) {
+ compositionEndTime = (*i)->getEndMarkerTime();
+ }
+ }
+
+ // define global context which is common for all staffs
+ str << indent(col++) << "global = { " << std::endl;
+ TimeSignature timeSignature = m_composition->
+ getTimeSignatureAt(m_composition->getStartMarker());
+ if (m_composition->getBarStart(m_composition->getBarNumber(compositionStartTime)) < compositionStartTime) {
+ str << indent(col) << "\\partial ";
+ // Arbitrary partial durations are handled by the following way:
+ // split the partial duration to 64th notes: instead of "4" write "64*16". (hjj)
+ Note partialNote = Note::getNearestNote(1, MAX_DOTS);
+ int partialDuration = m_composition->getBarStart(m_composition->getBarNumber(compositionStartTime) + 1) - compositionStartTime;
+ writeDuration(1, str);
+ str << "*" << ((int)(partialDuration / partialNote.getDuration()))
+ << std::endl;
+ }
+ int leftBar = 0;
+ int rightBar = leftBar;
+ do {
+ bool isNew = false;
+ m_composition->getTimeSignatureInBar(rightBar + 1, isNew);
+
+ if (isNew || (m_composition->getBarStart(rightBar + 1) >= compositionEndTime)) {
+ // - set initial time signature; further time signature changes
+ // are defined within the segments, because they may be hidden
+ str << indent(col) << (leftBar == 0 ? "" : "% ") << "\\time "
+ << timeSignature.getNumerator() << "/"
+ << timeSignature.getDenominator() << std::endl;
+ // - place skips upto the end of the composition;
+ // this justifies the printed staffs
+ str << indent(col);
+ timeT leftTime = m_composition->getBarStart(leftBar);
+ timeT rightTime = m_composition->getBarStart(rightBar + 1);
+ if (leftTime < compositionStartTime) {
+ leftTime = compositionStartTime;
+ }
+ writeSkip(timeSignature, leftTime, rightTime - leftTime, false, str);
+ str << " %% " << (leftBar + 1) << "-" << (rightBar + 1) << std::endl;
+
+ timeSignature = m_composition->getTimeSignatureInBar(rightBar + 1, isNew);
+ leftBar = rightBar + 1;
+ }
+ } while (m_composition->getBarStart(++rightBar) < compositionEndTime);
+ str << indent(--col) << "}" << std::endl;
+
+ // time signatures changes are in segments, reset initial value
+ timeSignature = m_composition->
+ getTimeSignatureAt(m_composition->getStartMarker());
+
+ // All the tempo changes are included in "globalTempo" context.
+ // This context contains only skip notes between the tempo changes.
+ // First tempo marking should still be include in \midi{ } block.
+ // If tempo marks are printed in future, they should probably be
+ // included in this context and the note duration in the tempo
+ // mark should be according to the time signature. (hjj)
+ int tempoCount = m_composition->getTempoChangeCount();
+
+ if (tempoCount > 0) {
+
+ timeT prevTempoChangeTime = m_composition->getStartMarker();
+ int tempo = int(Composition::getTempoQpm(m_composition->getTempoAtTime(prevTempoChangeTime)));
+ bool tempoMarksInvisible = false;
+
+ str << indent(col++) << "globalTempo = {" << std::endl;
+ if (m_exportTempoMarks == EXPORT_NONE_TEMPO_MARKS && tempoMarksInvisible == false) {
+ str << indent(col) << "\\override Score.MetronomeMark #'transparent = ##t" << std::endl;
+ tempoMarksInvisible = true;
+ }
+ str << indent(col) << "\\tempo 4 = " << tempo << " ";
+ int prevTempo = tempo;
+
+ for (int i = 0; i < tempoCount; ++i) {
+
+ std::pair<timeT, long> tempoChange =
+ m_composition->getTempoChange(i);
+
+ timeT tempoChangeTime = tempoChange.first;
+
+ tempo = int(Composition::getTempoQpm(tempoChange.second));
+
+ // First tempo change may be before the first segment.
+ // Do not apply it before the first segment appears.
+ if (tempoChangeTime < compositionStartTime) {
+ tempoChangeTime = compositionStartTime;
+ } else if (tempoChangeTime >= compositionEndTime) {
+ tempoChangeTime = compositionEndTime;
+ }
+ if (prevTempoChangeTime < compositionStartTime) {
+ prevTempoChangeTime = compositionStartTime;
+ } else if (prevTempoChangeTime >= compositionEndTime) {
+ prevTempoChangeTime = compositionEndTime;
+ }
+ writeSkip(m_composition->getTimeSignatureAt(tempoChangeTime),
+ tempoChangeTime, tempoChangeTime - prevTempoChangeTime, false, str);
+ // add new \tempo only if tempo was changed
+ if (tempo != prevTempo) {
+ if (m_exportTempoMarks == EXPORT_FIRST_TEMPO_MARK && tempoMarksInvisible == false) {
+ str << std::endl << indent(col) << "\\override Score.MetronomeMark #'transparent = ##t";
+ tempoMarksInvisible = true;
+ }
+ str << std::endl << indent(col) << "\\tempo 4 = " << tempo << " ";
+ }
+
+ prevTempo = tempo;
+ prevTempoChangeTime = tempoChangeTime;
+ if (prevTempoChangeTime == compositionEndTime)
+ break;
+ }
+ // First tempo change may be before the first segment.
+ // Do not apply it before the first segment appears.
+ if (prevTempoChangeTime < compositionStartTime) {
+ prevTempoChangeTime = compositionStartTime;
+ }
+ writeSkip(m_composition->getTimeSignatureAt(prevTempoChangeTime),
+ prevTempoChangeTime, compositionEndTime - prevTempoChangeTime, false, str);
+ str << std::endl;
+ str << indent(--col) << "}" << std::endl;
+ }
+ // Markers
+ // Skip until marker, make sure there's only one marker per measure
+ if ( m_exportMarkerMode != EXPORT_NO_MARKERS ) {
+ str << indent(col++) << "markers = {" << std::endl;
+ timeT prevMarkerTime = 0;
+
+ // Need the markers sorted by time
+ Composition::markercontainer markers( m_composition->getMarkers() ); // copy
+ std::sort( markers.begin(), markers.end(), MarkerComp() );
+ Composition::markerconstiterator i_marker = markers.begin();
+
+ while ( i_marker != markers.end() ) {
+ timeT markerTime = m_composition->getBarStartForTime((*i_marker)->getTime());
+ RG_DEBUG << "Marker: " << (*i_marker)->getTime() << " previous: " << prevMarkerTime << endl;
+ // how to cope with time signature changes?
+ if ( markerTime > prevMarkerTime ) {
+ str << indent(col);
+ writeSkip(m_composition->getTimeSignatureAt(markerTime),
+ markerTime, markerTime - prevMarkerTime, false, str);
+ str << "\\mark ";
+ switch (m_exportMarkerMode) {
+ case EXPORT_DEFAULT_MARKERS:
+ // Use the marker name for text
+ str << "\\default %% " << (*i_marker)->getName() << std::endl;
+ break;
+ case EXPORT_TEXT_MARKERS:
+ // Raise the text above the staff as not to clash with the other stuff
+ str << "\\markup { \\hspace #0 \\raise #1.5 \"" << (*i_marker)->getName() << "\" }" << std::endl;
+ break;
+ default:
+ break;
+ }
+ prevMarkerTime = markerTime;
+ }
+ ++i_marker;
+ }
+ str << indent(--col) << "}" << std::endl;
+ }
+
+ // open \score section
+ str << "\\score {" << std::endl;
+
+ int lastTrackIndex = -1;
+ int voiceCounter = 0;
+ bool firstTrack = true;
+ int staffGroupCounter = 0;
+ int pianoStaffCounter = 0;
+ int bracket = 0;
+ int prevBracket = -1;
+
+ // Write out all segments for each Track, in track order.
+ // This involves a hell of a lot of loops through all tracks
+ // and segments, but the time spent doing that should still
+ // be relatively small in the greater scheme.
+
+ Track *track = 0;
+
+ for (int trackPos = 0;
+ (track = m_composition->getTrackByPosition(trackPos)) != 0; ++trackPos) {
+
+ for (Composition::iterator i = m_composition->begin();
+ i != m_composition->end(); ++i) {
+
+ if ((*i)->getTrack() != track->getId())
+ continue;
+
+ // handle the bracket(s) for the first track, and if no brackets
+ // present, open with a <<
+ prevBracket = bracket;
+ bracket = track->getStaffBracket();
+
+ //!!! how will all these indentions work out? Probably not well,
+ // but maybe if users always provide sensible input, this will work
+ // out sensibly. Maybe. If not, we'll need some tracking gizmos to
+ // figure out the indention, or just skip the indention for these or
+ // something. TBA.
+ if (firstTrack) {
+ // seems to be common to every case now
+ str << indent(col++) << "<< % common" << std::endl;
+ }
+
+ if (firstTrack && m_exportStaffGroup) {
+
+ if (bracket == Brackets::SquareOn) {
+ str << indent(col++) << "\\context StaffGroup = \"" << staffGroupCounter++
+ << "\" << " << std::endl; //indent+
+ } else if (bracket == Brackets::CurlyOn) {
+ str << indent(col++) << "\\context PianoStaff = \"" << pianoStaffCounter++
+ << "\" << " << std::endl; //indent+
+ } else if (bracket == Brackets::CurlySquareOn) {
+ str << indent(col++) << "\\context StaffGroup = \"" << staffGroupCounter++
+ << "\" << " << std::endl; //indent+
+ str << indent(col++) << "\\context PianoStaff = \"" << pianoStaffCounter++
+ << "\" << " << std::endl; //indent+
+ }
+
+ // Make chords offset colliding notes by default (only write for
+ // first track)
+ str << indent(++col) << "% force offset of colliding notes in chords:"
+ << std::endl;
+ str << indent(col) << "\\override Score.NoteColumn #\'force-hshift = #1.0"
+ << std::endl;
+ }
+
+ emit setProgress(int(double(trackPos) /
+ double(m_composition->getNbTracks()) * 100.0));
+ rgapp->refreshGUI(50);
+
+ bool currentSegmentSelected = false;
+ if ((m_exportSelection == EXPORT_SELECTED_SEGMENTS) &&
+ (m_view != NULL) && (m_view->haveSelection())) {
+ //
+ // Check whether the current segment is in the list of selected segments.
+ //
+ SegmentSelection selection = m_view->getSelection();
+ for (SegmentSelection::iterator it = selection.begin(); it != selection.end(); it++) {
+ if ((*it) == (*i)) currentSegmentSelected = true;
+ }
+ } else if ((m_exportSelection == EXPORT_SELECTED_SEGMENTS) && (m_notationView != NULL)) {
+ currentSegmentSelected = m_notationView->hasSegment(*i);
+ }
+
+ // Check whether the track is a non-midi track.
+ InstrumentId instrumentId = track->getInstrument();
+ bool isMidiTrack = instrumentId >= MidiInstrumentBase;
+
+ if (isMidiTrack && ( // Skip non-midi tracks.
+ (m_exportSelection == EXPORT_ALL_TRACKS) ||
+ ((m_exportSelection == EXPORT_NONMUTED_TRACKS) && (!track->isMuted())) ||
+ ((m_exportSelection == EXPORT_SELECTED_TRACK) && (m_view != NULL) &&
+ (track->getId() == m_composition->getSelectedTrack())) ||
+ ((m_exportSelection == EXPORT_SELECTED_TRACK) && (m_notationView != NULL) &&
+ (track->getId() == m_notationView->getCurrentSegment()->getTrack())) ||
+ ((m_exportSelection == EXPORT_SELECTED_SEGMENTS) && (currentSegmentSelected)))) {
+ if ((int) (*i)->getTrack() != lastTrackIndex) {
+ if (lastTrackIndex != -1) {
+ // close the old track (Staff context)
+ str << indent(--col) << ">> % Staff ends" << std::endl; //indent-
+ }
+ lastTrackIndex = (*i)->getTrack();
+
+
+ // handle any necessary bracket closures with a rude
+ // hack, because bracket closures need to be handled
+ // right under staff closures, but at this point in the
+ // loop we are one track too early for closing, so we use
+ // the bracket setting for the previous track for closing
+ // purposes (I'm not quite sure why this works, but it does)
+ if (m_exportStaffGroup) {
+ if (prevBracket == Brackets::SquareOff ||
+ prevBracket == Brackets::SquareOnOff) {
+ str << indent(--col) << ">> % StaffGroup " << staffGroupCounter
+ << std::endl; //indent-
+ } else if (prevBracket == Brackets::CurlyOff) {
+ str << indent(--col) << ">> % PianoStaff " << pianoStaffCounter
+ << std::endl; //indent-
+ } else if (prevBracket == Brackets::CurlySquareOff) {
+ str << indent(--col) << ">> % PianoStaff " << pianoStaffCounter
+ << std::endl; //indent-
+ str << indent(--col) << ">> % StaffGroup " << staffGroupCounter
+ << std::endl; //indent-
+ }
+ }
+
+ // handle any bracket start events (unless track staff
+ // brackets are being ignored, as when printing single parts
+ // out of a bigger score one by one)
+ if (!firstTrack && m_exportStaffGroup) {
+ if (bracket == Brackets::SquareOn ||
+ bracket == Brackets::SquareOnOff) {
+ str << indent(col++) << "\\context StaffGroup = \""
+ << ++staffGroupCounter << "\" <<" << std::endl;
+ } else if (bracket == Brackets::CurlyOn) {
+ str << indent(col++) << "\\context PianoStaff = \""
+ << ++pianoStaffCounter << "\" <<" << std::endl;
+ } else if (bracket == Brackets::CurlySquareOn) {
+ str << indent(col++) << "\\context StaffGroup = \""
+ << ++staffGroupCounter << "\" <<" << std::endl;
+ str << indent(col++) << "\\context PianoStaff = \""
+ << ++pianoStaffCounter << "\" <<" << std::endl;
+ }
+ }
+
+ // avoid problem with <untitled> tracks yielding a
+ // .ly file that jumbles all notes together on a
+ // single staff... every Staff context has to
+ // have a unique name, even if the
+ // Staff.instrument property is the same for
+ // multiple staffs...
+ // Added an option to merge staffs with the same, non-empty
+ // name. This option makes it possible to produce staffs
+ // with polyphonic, and polyrhytmic, music. Polyrhytmic
+ // music in a single staff is typical in piano, or
+ // guitar music. (hjj)
+ // In the case of colliding note heads, user may define
+ // - DISPLACED_X -- for a note/chord
+ // - INVISIBLE -- for a rest
+ std::ostringstream staffName;
+ staffName << protectIllegalChars(m_composition->
+ getTrackById(lastTrackIndex)->getLabel());
+
+ if (!m_exportStaffMerge || staffName.str() == "") {
+ str << std::endl << indent(col)
+ << "\\context Staff = \"track "
+ << (trackPos + 1) << "\" ";
+ } else {
+ str << std::endl << indent(col)
+ << "\\context Staff = \"" << staffName.str()
+ << "\" ";
+ }
+
+ str << "<< " << std::endl;
+
+ // The octavation is omitted in the instrument name.
+ // HJJ: Should it be automatically added to the clef: G^8 ?
+ // What if two segments have different transpose in a track?
+ std::ostringstream staffNameWithTranspose;
+ staffNameWithTranspose << "\\markup { \\column { \"" << staffName.str() << " \"";
+ if (((*i)->getTranspose() % 12) != 0) {
+ staffNameWithTranspose << " \\line { ";
+ switch ((*i)->getTranspose() % 12) {
+ case 1 : staffNameWithTranspose << "\"in D\" \\smaller \\flat"; break;
+ case 2 : staffNameWithTranspose << "\"in D\""; break;
+ case 3 : staffNameWithTranspose << "\"in E\" \\smaller \\flat"; break;
+ case 4 : staffNameWithTranspose << "\"in E\""; break;
+ case 5 : staffNameWithTranspose << "\"in F\""; break;
+ case 6 : staffNameWithTranspose << "\"in G\" \\smaller \\flat"; break;
+ case 7 : staffNameWithTranspose << "\"in G\""; break;
+ case 8 : staffNameWithTranspose << "\"in A\" \\smaller \\flat"; break;
+ case 9 : staffNameWithTranspose << "\"in A\""; break;
+ case 10 : staffNameWithTranspose << "\"in B\" \\smaller \\flat"; break;
+ case 11 : staffNameWithTranspose << "\"in B\""; break;
+ }
+ staffNameWithTranspose << " }";
+ }
+ staffNameWithTranspose << " } }";
+ if (m_languageLevel < LILYPOND_VERSION_2_10) {
+ str << indent(++col) << "\\set Staff.instrument = " << staffNameWithTranspose.str()
+ << std::endl;
+ } else {
+ str << indent(++col) << "\\set Staff.instrumentName = "
+ << staffNameWithTranspose.str() << std::endl;
+ }
+
+ if (m_exportMidi) {
+ // Set midi instrument for the Staff
+ std::ostringstream staffMidiName;
+ Instrument *instr = m_studio->getInstrumentById(
+ m_composition->getTrackById(lastTrackIndex)->getInstrument());
+ staffMidiName << instr->getProgramName();
+
+ str << indent(col) << "\\set Staff.midiInstrument = \"" << staffMidiName.str()
+ << "\"" << std::endl;
+ }
+
+ // multi measure rests are used by default
+ str << indent(col) << "\\set Score.skipBars = ##t" << std::endl;
+
+ // turn off the stupid accidental cancelling business,
+ // because we don't do that ourselves, and because my 11
+ // year old son pointed out to me that it "Looks really
+ // stupid. Why is it cancelling out four flats and then
+ // adding five flats back? That's brain damaged."
+ str << indent(col) << "\\set Staff.printKeyCancellation = ##f" << std::endl;
+ str << indent(col) << "\\new Voice \\global" << std::endl;
+ if (tempoCount > 0) {
+ str << indent(col) << "\\new Voice \\globalTempo" << std::endl;
+ }
+ if ( m_exportMarkerMode != EXPORT_NO_MARKERS ) {
+ str << indent(col) << "\\new Voice \\markers" << std::endl;
+ }
+
+ }
+
+ // Temporary storage for non-atomic events (!BOOM)
+ // ex. LilyPond expects signals when a decrescendo starts
+ // as well as when it ends
+ eventendlist eventsInProgress;
+ eventstartlist eventsToStart;
+
+ // If the segment doesn't start at 0, add a "skip" to the start
+ // No worries about overlapping segments, because Voices can overlap
+ // voiceCounter is a hack because LilyPond does not by default make
+ // them unique
+ std::ostringstream voiceNumber;
+ voiceNumber << "voice " << ++voiceCounter;
+
+ str << std::endl << indent(col++) << "\\context Voice = \"" << voiceNumber.str()
+ << "\" {"; // indent+
+
+ str << std::endl << indent(col) << "\\override Voice.TextScript #'padding = #2.0";
+ str << std::endl << indent(col) << "\\override MultiMeasureRest #'expand-limit = 1" << std::endl;
+
+ // staff notation size
+ int staffSize = track->getStaffSize();
+ if (staffSize == StaffTypes::Small) str << indent(col) << "\\small" << std::endl;
+ else if (staffSize == StaffTypes::Tiny) str << indent(col) << "\\tiny" << std::endl;
+
+ SegmentNotationHelper helper(**i);
+ helper.setNotationProperties();
+
+ int firstBar = m_composition->getBarNumber((*i)->getStartTime());
+
+ if (firstBar > 0) {
+ // Add a skip for the duration until the start of the first
+ // bar in the segment. If the segment doesn't start on a bar
+ // line, an additional skip will be written (in the form of
+ // a series of rests) at the start of writeBar, below.
+ //!!! This doesn't cope correctly yet with time signature changes
+ // during this skipped section.
+ str << std::endl << indent(col);
+ writeSkip(timeSignature, compositionStartTime,
+ m_composition->getBarStart(firstBar) - compositionStartTime,
+ false, str);
+ }
+
+ std::string lilyText = ""; // text events
+ std::string prevStyle = ""; // track note styles
+
+ Rosegarden::Key key;
+
+ bool haveRepeating = false;
+ bool haveAlternates = false;
+
+ bool nextBarIsAlt1 = false;
+ bool nextBarIsAlt2 = false;
+ bool prevBarWasAlt2 = false;
+
+ int MultiMeasureRestCount = 0;
+
+ bool nextBarIsDouble = false;
+ bool nextBarIsEnd = false;
+ bool nextBarIsDot = false;
+
+ for (int barNo = m_composition->getBarNumber((*i)->getStartTime());
+ barNo <= m_composition->getBarNumber((*i)->getEndMarkerTime());
+ ++barNo) {
+
+ timeT barStart = m_composition->getBarStart(barNo);
+ timeT barEnd = m_composition->getBarEnd(barNo);
+ if (barStart < compositionStartTime) {
+ barStart = compositionStartTime;
+ }
+
+ // open \repeat section if this is the first bar in the
+ // repeat
+ if ((*i)->isRepeating() && !haveRepeating) {
+
+ haveRepeating = true;
+
+ //!!! calculate the number of times this segment
+ //repeats and make the following variable meaningful
+ int numRepeats = 2;
+
+ str << std::endl << indent(col++) << "\\repeat volta " << numRepeats << " {";
+ }
+
+ // open the \alternative section if this bar is alternative ending 1
+ // ending (because there was an "Alt1" flag in the
+ // previous bar to the left of where we are right now)
+ //
+ // Alt1 remains in effect until we run into Alt2, which
+ // runs to the end of the segment
+ if (nextBarIsAlt1 && haveRepeating) {
+ str << std::endl << indent(--col) << "} \% repeat close (before alternatives) ";
+ str << std::endl << indent(col++) << "\\alternative {";
+ str << std::endl << indent(col++) << "{ \% open alternative 1 ";
+ nextBarIsAlt1 = false;
+ haveAlternates = true;
+ } else if (nextBarIsAlt2 && haveRepeating) {
+ if (!prevBarWasAlt2) {
+ col--;
+ // add an extra str to the following to shut up
+ // compiler warning from --ing and ++ing it in the
+ // same statement
+ str << std::endl << indent(--col) << "} \% close alternative 1 ";
+ str << std::endl << indent(col++) << "{ \% open alternative 2";
+ col++;
+ }
+ prevBarWasAlt2 = true;
+ }
+
+ // write out a bar's worth of events
+ writeBar(*i, barNo, barStart, barEnd, col, key,
+ lilyText,
+ prevStyle, eventsInProgress, str,
+ MultiMeasureRestCount,
+ nextBarIsAlt1, nextBarIsAlt2, nextBarIsDouble, nextBarIsEnd, nextBarIsDot);
+
+ }
+
+ // close \repeat
+ if (haveRepeating) {
+
+ // close \alternative section if present
+ if (haveAlternates) {
+ str << std::endl << indent(--col) << " } \% close alternative 2 ";
+ }
+
+ // close \repeat section in either case
+ str << std::endl << indent(--col) << " } \% close "
+ << (haveAlternates ? "alternatives" : "repeat");
+ }
+
+ // closing bar
+ if (((*i)->getEndMarkerTime() == compositionEndTime) && !haveRepeating) {
+ str << std::endl << indent(col) << "\\bar \"|.\"";
+ }
+
+ // close Voice context
+ str << std::endl << indent(--col) << "} % Voice" << std::endl; // indent-
+
+ //
+ // Write accumulated lyric events to the Lyric context, if desired.
+ //
+ // Sync the code below with LyricEditDialog::unparse() !!
+ //
+ if (m_exportLyrics) {
+ for (long currentVerse = 0, lastVerse = 0;
+ currentVerse <= lastVerse;
+ currentVerse++) {
+ bool haveLyric = false;
+ bool firstNote = true;
+ QString text = "";
+
+ timeT lastTime = (*i)->getStartTime();
+ for (Segment::iterator j = (*i)->begin();
+ (*i)->isBeforeEndMarker(j); ++j) {
+
+ bool isNote = (*j)->isa(Note::EventType);
+ bool isLyric = false;
+
+ if (!isNote) {
+ if ((*j)->isa(Text::EventType)) {
+ std::string textType;
+ if ((*j)->get
+ <String>(Text::TextTypePropertyName, textType) &&
+ textType == Text::Lyric) {
+ isLyric = true;
+ }
+ }
+ }
+
+ if (!isNote && !isLyric) continue;
+
+ timeT myTime = (*j)->getNotationAbsoluteTime();
+
+ if (isNote) {
+ if ((myTime > lastTime) || firstNote) {
+ if (!haveLyric)
+ text += " _";
+ lastTime = myTime;
+ haveLyric = false;
+ firstNote = false;
+ }
+ }
+
+ if (isLyric) {
+ long verse;
+ (*j)->get<Int>(Text::LyricVersePropertyName, verse);
+
+ if (verse == currentVerse) {
+ std::string ssyllable;
+ (*j)->get<String>(Text::TextPropertyName, ssyllable);
+ text += " ";
+
+ QString syllable(strtoqstr(ssyllable));
+ syllable.replace(QRegExp("\\s+"), "");
+ text += "\"" + syllable + "\"";
+ haveLyric = true;
+ } else if (verse > lastVerse) {
+ lastVerse = verse;
+ }
+ }
+ }
+
+ text.replace( QRegExp(" _+([^ ])") , " \\1" );
+ text.replace( "\"_\"" , " " );
+
+ // Do not create empty context for lyrics.
+ // Does this save some vertical space, as was written
+ // in earlier comment?
+ QRegExp rx( "\"" );
+ if ( rx.search( text ) != -1 ) {
+
+ str << indent(col) << "\\lyricsto \"" << voiceNumber.str() << "\""
+ << " \\new Lyrics \\lyricmode {" << std::endl;
+ if (m_lyricsHAlignment == RIGHT_ALIGN) {
+ str << indent(++col) << "\\override LyricText #'self-alignment-X = #RIGHT"
+ << std::endl;
+ } else if (m_lyricsHAlignment == CENTER_ALIGN) {
+ str << indent(++col) << "\\override LyricText #'self-alignment-X = #CENTER"
+ << std::endl;
+ } else {
+ str << indent(++col) << "\\override LyricText #'self-alignment-X = #LEFT"
+ << std::endl;
+ }
+ str << indent(col) << "\\set ignoreMelismata = ##t" << std::endl;
+ str << indent(col) << text.utf8() << " " << std::endl;
+ str << indent(col) << "\\unset ignoreMelismata" << std::endl;
+ str << indent(--col) << "} % Lyrics " << (currentVerse+1) << std::endl;
+ // close the Lyrics context
+ } // if ( rx.search( text....
+ } // for (long currentVerse = 0....
+ } // if (m_exportLyrics....
+ } // if (isMidiTrack....
+ firstTrack = false;
+ } // for (Composition::iterator i = m_composition->begin()....
+ } // for (int trackPos = 0....
+
+ // close the last track (Staff context)
+ if (voiceCounter > 0) {
+ str << indent(--col) << ">> % Staff (final) ends" << std::endl; // indent-
+
+ // handle any necessary final bracket closures (if brackets are being
+ // exported)
+ if (m_exportStaffGroup) {
+ if (bracket == Brackets::SquareOff ||
+ bracket == Brackets::SquareOnOff) {
+ str << indent(--col) << ">> % StaffGroup " << staffGroupCounter
+ << std::endl; //indent-
+ } else if (bracket == Brackets::CurlyOff) {
+ str << indent(--col) << ">> % PianoStaff (final) " << pianoStaffCounter
+ << std::endl; //indent-
+ } else if (bracket == Brackets::CurlySquareOff) {
+ str << indent(--col) << ">> % PianoStaff (final) " << pianoStaffCounter
+ << std::endl; //indent-
+ str << indent(--col) << ">> % StaffGroup (final) " << staffGroupCounter
+ << std::endl; //indent-
+ }
+ }
+ } else {
+ str << indent(--col) << "% (All staffs were muted.)" << std::endl;
+ }
+
+ // close \notes section
+ str << std::endl << indent(--col) << ">> % notes" << std::endl << std::endl; // indent-
+// str << std::endl << indent(col) << ">> % global wrapper" << std::endl;
+
+ // write \layout block
+ str << indent(col) << "\\layout { }" << std::endl;
+
+ // write initial tempo in Midi block, if user wishes (added per user request...
+ // makes debugging the .ly file easier because fewer "noisy" errors are
+ // produced during the process of rendering MIDI...)
+ if (m_exportMidi) {
+ int tempo = int(Composition::getTempoQpm(m_composition->getTempoAtTime(m_composition->getStartMarker())));
+ // Incomplete? Can I get away without converting tempo relative to the time
+ // signature for this purpose? we'll see...
+ str << indent(col++) << "\\midi {" << std::endl;
+ str << indent(col) << "\\tempo 4 = " << tempo << std::endl;
+ str << indent(--col) << "} " << std::endl;
+ }
+
+ // close \score section and close out the file
+ str << "} % score" << std::endl;
+ str.close();
+ return true;
+}
+
+timeT
+LilyPondExporter::calculateDuration(Segment *s,
+ const Segment::iterator &i,
+ timeT barEnd,
+ timeT &soundingDuration,
+ const std::pair<int, int> &tupletRatio,
+ bool &overlong)
+{
+ timeT duration = (*i)->getNotationDuration();
+ timeT absTime = (*i)->getNotationAbsoluteTime();
+
+ RG_DEBUG << "LilyPondExporter::calculateDuration: first duration, absTime: "
+ << duration << ", " << absTime << endl;
+
+ timeT durationCorrection = 0;
+
+ if ((*i)->isa(Note::EventType) || (*i)->isa(Note::EventRestType)) {
+ try {
+ // tuplet compensation, etc
+ Note::Type type = (*i)->get<Int>(NOTE_TYPE);
+ int dots = (*i)->get<Int>(NOTE_DOTS);
+ durationCorrection = Note(type, dots).getDuration() - duration;
+ } catch (Exception e) { // no properties
+ }
+ }
+
+ duration += durationCorrection;
+
+ RG_DEBUG << "LilyPondExporter::calculateDuration: now duration is "
+ << duration << " after correction of " << durationCorrection << endl;
+
+ soundingDuration = duration * tupletRatio.first/ tupletRatio.second;
+
+ timeT toNext = barEnd - absTime;
+ if (soundingDuration > toNext) {
+ soundingDuration = toNext;
+ duration = soundingDuration * tupletRatio.second/ tupletRatio.first;
+ overlong = true;
+ }
+
+ RG_DEBUG << "LilyPondExporter::calculateDuration: time to barEnd is "
+ << toNext << endl;
+
+ // Examine the following event, and truncate our duration
+ // if we overlap it.
+ Segment::iterator nextElt = s->end();
+ toNext = soundingDuration;
+
+ if ((*i)->isa(Note::EventType)) {
+
+ Chord chord(*s, i, m_composition->getNotationQuantizer());
+ Segment::iterator nextElt = chord.getFinalElement();
+ ++nextElt;
+
+ if (s->isBeforeEndMarker(nextElt)) {
+ // The quantizer sometimes sticks a rest at the same time
+ // as this note -- don't use that one here, and mark it as
+ // not to be exported -- it's just a heavy-handed way of
+ // rendering counterpoint in RG
+ if ((*nextElt)->isa(Note::EventRestType) &&
+ (*nextElt)->getNotationAbsoluteTime() == absTime) {
+ (*nextElt)->set<Bool>(SKIP_PROPERTY, true);
+ ++nextElt;
+ }
+ }
+
+ } else {
+ nextElt = i;
+ ++nextElt;
+ while (s->isBeforeEndMarker(nextElt)) {
+ if ((*nextElt)->isa(Controller::EventType) ||
+ (*nextElt)->isa(ProgramChange::EventType) ||
+ (*nextElt)->isa(SystemExclusive::EventType) ||
+ (*nextElt)->isa(ChannelPressure::EventType) ||
+ (*nextElt)->isa(KeyPressure::EventType) ||
+ (*nextElt)->isa(PitchBend::EventType))
+ ++nextElt;
+ else
+ break;
+ }
+ }
+
+ if (s->isBeforeEndMarker(nextElt)) {
+ RG_DEBUG << "LilyPondExporter::calculateDuration: inside conditional " << endl;
+ toNext = (*nextElt)->getNotationAbsoluteTime() - absTime;
+ // if the note was lengthened, assume it was lengthened to the left
+ // when truncating to the beginning of the next note
+ if (durationCorrection > 0) {
+ toNext += durationCorrection;
+ }
+ if (soundingDuration > toNext) {
+ soundingDuration = toNext;
+ duration = soundingDuration * tupletRatio.second/ tupletRatio.first;
+ }
+ }
+
+ RG_DEBUG << "LilyPondExporter::calculateDuration: second toNext is "
+ << toNext << endl;
+
+ RG_DEBUG << "LilyPondExporter::calculateDuration: final duration, soundingDuration: " << duration << ", " << soundingDuration << endl;
+
+ return duration;
+}
+
+void
+LilyPondExporter::writeBar(Segment *s,
+ int barNo, int barStart, int barEnd, int col,
+ Rosegarden::Key &key,
+ std::string &lilyText,
+ std::string &prevStyle,
+ eventendlist &eventsInProgress,
+ std::ofstream &str,
+ int &MultiMeasureRestCount,
+ bool &nextBarIsAlt1, bool &nextBarIsAlt2,
+ bool &nextBarIsDouble, bool &nextBarIsEnd, bool &nextBarIsDot)
+{
+ int lastStem = 0; // 0 => unset, -1 => down, 1 => up
+ int isGrace = 0;
+
+ Segment::iterator i = s->findTime(barStart);
+ if (!s->isBeforeEndMarker(i))
+ return ;
+
+ if (MultiMeasureRestCount == 0) {
+ str << std::endl;
+
+ if ((barNo + 1) % 5 == 0) {
+ str << "%% " << barNo + 1 << std::endl << indent(col);
+ } else {
+ str << indent(col);
+ }
+ }
+
+ bool isNew = false;
+ TimeSignature timeSignature = m_composition->getTimeSignatureInBar(barNo, isNew);
+ if (isNew) {
+ if (timeSignature.isHidden()) {
+ str << "\\once \\override Staff.TimeSignature #'break-visibility = #(vector #f #f #f) ";
+ }
+ str << "\\time "
+ << timeSignature.getNumerator() << "/"
+ << timeSignature.getDenominator()
+ << std::endl << indent(col);
+ }
+
+ timeT absTime = (*i)->getNotationAbsoluteTime();
+ timeT writtenDuration = 0;
+ std::pair<int,int> barDurationRatio(timeSignature.getNumerator(),timeSignature.getDenominator());
+ std::pair<int,int> durationRatioSum(0,1);
+ static std::pair<int,int> durationRatio(0,1);
+
+ if (absTime > barStart) {
+ Note note(Note::getNearestNote(absTime - barStart, MAX_DOTS));
+ writtenDuration += note.getDuration();
+ durationRatio = writeSkip(timeSignature, 0, note.getDuration(), true, str);
+ durationRatioSum = fractionSum(durationRatioSum,durationRatio);
+ // str << qstrtostr(QString(" %{ %1/%2 %} ").arg(durationRatio.first).arg(durationRatio.second)); // DEBUG
+ }
+
+ timeT prevDuration = -1;
+ eventstartlist eventsToStart;
+
+ long groupId = -1;
+ std::string groupType = "";
+ std::pair<int, int> tupletRatio(1, 1);
+
+ bool overlong = false;
+ bool newBeamedGroup = false;
+ int notesInBeamedGroup = 0;
+
+ while (s->isBeforeEndMarker(i)) {
+
+ if ((*i)->getNotationAbsoluteTime() >= barEnd)
+ break;
+
+ // First test whether we're entering or leaving a group,
+ // before we consider how to write the event itself (at least
+ // for pre-2.0 LilyPond output)
+ QString startGroupBeamingsStr = "";
+ QString endGroupBeamingsStr = "";
+
+ if ((*i)->isa(Note::EventType) || (*i)->isa(Note::EventRestType) ||
+ (*i)->isa(Clef::EventType) || (*i)->isa(Rosegarden::Key::EventType)) {
+
+ long newGroupId = -1;
+ if ((*i)->get
+ <Int>(BEAMED_GROUP_ID, newGroupId)) {
+
+ if (newGroupId != groupId) {
+ // entering a new beamed group
+
+ if (groupId != -1) {
+ // and leaving an old one
+ if (groupType == GROUP_TYPE_TUPLED) {
+ if (m_exportBeams && notesInBeamedGroup > 0)
+ endGroupBeamingsStr += "] ";
+ endGroupBeamingsStr += "} ";
+ } else if (groupType == GROUP_TYPE_BEAMED) {
+ if (m_exportBeams && notesInBeamedGroup > 0)
+ endGroupBeamingsStr += "] ";
+ }
+ }
+
+ groupId = newGroupId;
+ groupType = "";
+ (void)(*i)->get
+ <String>(BEAMED_GROUP_TYPE, groupType);
+
+ if (groupType == GROUP_TYPE_TUPLED) {
+ long numerator = 0;
+ long denominator = 0;
+ (*i)->get
+ <Int>(BEAMED_GROUP_TUPLED_COUNT, numerator);
+ (*i)->get
+ <Int>(BEAMED_GROUP_UNTUPLED_COUNT, denominator);
+ if (numerator == 0 || denominator == 0) {
+ std::cerr << "WARNING: LilyPondExporter::writeBar: "
+ << "tupled event without tupled/untupled counts"
+ << std::endl;
+ groupId = -1;
+ groupType = "";
+ } else {
+ startGroupBeamingsStr += QString("\\times %1/%2 { ").arg(numerator).arg(denominator);
+ tupletRatio = std::pair<int, int>(numerator, denominator);
+ // Require explicit beamed groups,
+ // fixes bug #1683205.
+ // HJJ: Why line below was originally present?
+ // newBeamedGroup = true;
+ notesInBeamedGroup = 0;
+ }
+ } else if (groupType == GROUP_TYPE_BEAMED) {
+ newBeamedGroup = true;
+ notesInBeamedGroup = 0;
+ // there can currently be only on group type, reset tuplet ratio
+ tupletRatio = std::pair<int, int>(1,1);
+ }
+ }
+
+ }
+ else {
+
+ if (groupId != -1) {
+ // leaving a beamed group
+ if (groupType == GROUP_TYPE_TUPLED) {
+ if (m_exportBeams && notesInBeamedGroup > 0)
+ endGroupBeamingsStr += "] ";
+ endGroupBeamingsStr += "} ";
+ tupletRatio = std::pair<int, int>(1, 1);
+ } else if (groupType == GROUP_TYPE_BEAMED) {
+ if (m_exportBeams && notesInBeamedGroup > 0)
+ endGroupBeamingsStr += "] ";
+ }
+ groupId = -1;
+ groupType = "";
+ }
+ }
+ }
+
+ // Test whether the next note is grace note or not.
+ // The start or end of beamed grouping should be put in proper places.
+ str << endGroupBeamingsStr.utf8();
+ if ((*i)->has(IS_GRACE_NOTE) && (*i)->get<Bool>(IS_GRACE_NOTE)) {
+ if (isGrace == 0) {
+ isGrace = 1;
+ str << "\\grace { ";
+ // str << "%{ grace starts %} "; // DEBUG
+ }
+ } else if (isGrace == 1) {
+ isGrace = 0;
+ // str << "%{ grace ends %} "; // DEBUG
+ str << "} ";
+ }
+ str << startGroupBeamingsStr.utf8();
+
+ timeT soundingDuration = -1;
+ timeT duration = calculateDuration
+ (s, i, barEnd, soundingDuration, tupletRatio, overlong);
+
+ if (soundingDuration == -1) {
+ soundingDuration = duration * tupletRatio.first / tupletRatio.second;
+ }
+
+ if ((*i)->has(SKIP_PROPERTY)) {
+ (*i)->unset(SKIP_PROPERTY);
+ ++i;
+ continue;
+ }
+
+ bool needsSlashRest = false;
+
+ if ((*i)->isa(Note::EventType)) {
+
+ Chord chord(*s, i, m_composition->getNotationQuantizer());
+ Event *e = *chord.getInitialNote();
+ bool tiedForward = false;
+ bool tiedUp = false;
+
+ // Examine the following event, and truncate our duration
+ // if we overlap it.
+
+ if (e->has(DISPLACED_X)) {
+ double xDisplacement = 1 + ((double) e->get
+ <Int>(DISPLACED_X)) / 1000;
+ str << "\\once \\override NoteColumn #'force-hshift = #"
+ << xDisplacement << " ";
+ }
+
+ bool hiddenNote = false;
+ if (e->has(INVISIBLE)) {
+ if (e->get
+ <Bool>(INVISIBLE)) {
+ hiddenNote = true;
+ }
+ }
+
+ if ( hiddenNote ) {
+ str << "\\hideNotes ";
+ }
+
+ if (e->has(NotationProperties::STEM_UP)) {
+ if (e->get
+ <Bool>(NotationProperties::STEM_UP)) {
+ if (lastStem != 1) {
+ str << "\\stemUp ";
+ lastStem = 1;
+ }
+ }
+ else {
+ if (lastStem != -1) {
+ str << "\\stemDown ";
+ lastStem = -1;
+ }
+ }
+ } else {
+ if (lastStem != 0) {
+ str << "\\stemNeutral ";
+ lastStem = 0;
+ }
+ }
+
+ if (chord.size() > 1)
+ str << "< ";
+
+ Segment::iterator stylei = s->end();
+
+ for (i = chord.getInitialElement(); s->isBeforeEndMarker(i); ++i) {
+
+ if ((*i)->isa(Text::EventType)) {
+ if (!handleDirective(*i, lilyText, nextBarIsAlt1, nextBarIsAlt2,
+ nextBarIsDouble, nextBarIsEnd, nextBarIsDot)) {
+
+ handleText(*i, lilyText);
+ }
+
+ } else if ((*i)->isa(Note::EventType)) {
+
+ if (m_languageLevel >= LILYPOND_VERSION_2_8) {
+ // one \tweak per each chord note
+ if (chord.size() > 1)
+ writeStyle(*i, prevStyle, col, str, true);
+ else
+ writeStyle(*i, prevStyle, col, str, false);
+ } else {
+ // only one override per chord, and that outside the <>
+ stylei = i;
+ }
+ writePitch(*i, key, str);
+
+ bool noteHasCautionaryAccidental = false;
+ (*i)->get
+ <Bool>(NotationProperties::USE_CAUTIONARY_ACCIDENTAL, noteHasCautionaryAccidental);
+ if (noteHasCautionaryAccidental)
+ str << "?";
+
+ // get TIED_FORWARD and TIE_IS_ABOVE for later
+ (*i)->get<Bool>(TIED_FORWARD, tiedForward);
+ (*i)->get<Bool>(TIE_IS_ABOVE, tiedUp);
+
+ str << " ";
+ } else if ((*i)->isa(Indication::EventType)) {
+ eventsToStart.insert(*i);
+ eventsInProgress.insert(*i);
+ }
+
+ if (i == chord.getFinalElement())
+ break;
+ }
+
+ if (chord.size() > 1)
+ str << "> ";
+
+ if (duration != prevDuration) {
+ durationRatio = writeDuration(duration, str);
+ str << " ";
+ prevDuration = duration;
+ }
+
+ if (m_languageLevel == LILYPOND_VERSION_2_6) {
+ // only one override per chord, and that outside the <>
+ if (stylei != s->end()) {
+ writeStyle(*stylei, prevStyle, col, str, false);
+ stylei = s->end();
+ }
+ }
+
+ if (lilyText != "") {
+ str << lilyText;
+ lilyText = "";
+ }
+ writeSlashes(*i, str);
+
+ writtenDuration += soundingDuration;
+ std::pair<int,int> ratio = fractionProduct(durationRatio,tupletRatio);
+ durationRatioSum = fractionSum(durationRatioSum, ratio);
+ // str << qstrtostr(QString(" %{ %1/%2 * %3/%4 = %5/%6 %} ").arg(durationRatio.first).arg(durationRatio.second).arg(tupletRatio.first).arg(tupletRatio.second).arg(ratio.first).arg(ratio.second)); // DEBUG
+
+ std::vector<Mark> marks(chord.getMarksForChord());
+ // problem here: stem direction unavailable (it's a view-local property)
+ bool stemUp = true;
+ e->get
+ <Bool>(NotationProperties::STEM_UP, stemUp);
+ for (std::vector<Mark>::iterator j = marks.begin(); j != marks.end(); ++j) {
+ str << composeLilyMark(*j, stemUp);
+ }
+ if (marks.size() > 0)
+ str << " ";
+
+ handleEndingEvents(eventsInProgress, i, str);
+ handleStartingEvents(eventsToStart, str);
+
+ if (tiedForward)
+ if (tiedUp)
+ str << "^~ ";
+ else
+ str << "_~ ";
+
+ if ( hiddenNote ) {
+ str << "\\unHideNotes ";
+ }
+
+ if (newBeamedGroup) {
+ // This is a workaround for bug #1705430:
+ // Beaming groups erroneous after merging notes
+ // There will be fewer "e4. [ ]" errors in LilyPond-compiling.
+ // HJJ: This should be fixed in notation engine,
+ // after which the workaround below should be removed.
+ Note note(Note::getNearestNote(duration, MAX_DOTS));
+
+ switch (note.getNoteType()) {
+ case Note::SixtyFourthNote:
+ case Note::ThirtySecondNote:
+ case Note::SixteenthNote:
+ case Note::EighthNote:
+ notesInBeamedGroup++;
+ break;
+ }
+ }
+ // // Old version before the workaround for bug #1705430:
+ // if (newBeamedGroup)
+ // notesInBeamedGroup++;
+ } else if ((*i)->isa(Note::EventRestType)) {
+
+ bool hiddenRest = false;
+ if ((*i)->has(INVISIBLE)) {
+ if ((*i)->get
+ <Bool>(INVISIBLE)) {
+ hiddenRest = true;
+ }
+ }
+
+ bool offsetRest = false;
+ int restOffset = 0;
+ if ((*i)->has(DISPLACED_Y)) {
+ restOffset = (*i)->get<Int>(DISPLACED_Y);
+ offsetRest = true;
+ }
+
+ if (offsetRest) {
+ std::cout << "REST OFFSET: " << restOffset << std::endl;
+ } else {
+ std::cout << "NO REST OFFSET" << std::endl;
+ }
+
+ if (MultiMeasureRestCount == 0) {
+ if (hiddenRest) {
+ str << "s";
+ } else if (duration == timeSignature.getBarDuration()) {
+ // Look ahead the segment in order to detect
+ // the number of measures in the multi measure rest.
+ Segment::iterator mm_i = i;
+ while (s->isBeforeEndMarker(++mm_i)) {
+ if ((*mm_i)->isa(Note::EventRestType) &&
+ (*mm_i)->getNotationDuration() == (*i)->getNotationDuration() &&
+ timeSignature == m_composition->getTimeSignatureAt((*mm_i)->getNotationAbsoluteTime())) {
+ MultiMeasureRestCount++;
+ } else {
+ break;
+ }
+ }
+ str << "R";
+ } else {
+ if (offsetRest) {
+ // use offset height to get an approximate corresponding
+ // height on staff
+ restOffset = restOffset / 1000;
+ restOffset -= restOffset * 2;
+
+ // use height on staff to get a MIDI pitch
+ // get clef from whatever the last clef event was
+ Rosegarden::Key k;
+ Accidental a;
+ Pitch helper(restOffset, m_lastClefFound, k, a);
+
+ // port some code from writePitch() here, rather than
+ // rewriting writePitch() to do both jobs, which
+ // somebody could conceivably clean up one day if anyone
+ // is bored
+
+ // use MIDI pitch to get a named note
+ int p = helper.getPerformancePitch();
+ std::string n = convertPitchToLilyNote(p, a, k);
+
+ // write named note
+ str << n;
+
+ // generate and write octave marks
+ std::string m = "";
+ int o = (int)(p / 12);
+
+ // mystery hack (it was always aiming too low)
+ o++;
+
+ if (o < 4) {
+ for (; o < 4; o++)
+ m += ",";
+ } else {
+ for (; o > 4; o--)
+ m += "\'";
+ }
+
+ str << m;
+
+ // defer the \rest until after any duration, because it
+ // can't come before a duration if a duration change is
+ // necessary, which is all determined a bit further on
+ needsSlashRest = true;
+
+
+ std::cout << "using pitch letter:"
+ << n << m
+ << " for offset: "
+ << restOffset
+ << " for calculated octave: "
+ << o
+ << " in clef: "
+ << m_lastClefFound.getClefType()
+ << std::endl;
+ } else {
+ str << "r";
+ }
+ }
+
+ if (duration != prevDuration) {
+ durationRatio = writeDuration(duration, str);
+ if (MultiMeasureRestCount > 0) {
+ str << "*" << (1 + MultiMeasureRestCount);
+ }
+ prevDuration = duration;
+ }
+
+ // have to add \rest to a fake rest note after any required
+ // duration change
+ if (needsSlashRest) {
+ str << "\\rest";
+ needsSlashRest = false;
+ }
+
+ if (lilyText != "") {
+ str << lilyText;
+ lilyText = "";
+ }
+
+ str << " ";
+
+ handleEndingEvents(eventsInProgress, i, str);
+ handleStartingEvents(eventsToStart, str);
+
+ if (newBeamedGroup)
+ notesInBeamedGroup++;
+ } else {
+ MultiMeasureRestCount--;
+ }
+ writtenDuration += soundingDuration;
+ std::pair<int,int> ratio = fractionProduct(durationRatio,tupletRatio);
+ durationRatioSum = fractionSum(durationRatioSum, ratio);
+ // str << qstrtostr(QString(" %{ %1/%2 * %3/%4 = %5/%6 %} ").arg(durationRatio.first).arg(durationRatio.second).arg(tupletRatio.first).arg(tupletRatio.second).arg(ratio.first).arg(ratio.second)); // DEBUG
+ } else if ((*i)->isa(Clef::EventType)) {
+
+ try {
+ // Incomplete: Set which note the clef should center on (DMM - why?)
+ // To allow octavation of the clef, enclose the clefname always with quotes.
+ str << "\\clef \"";
+
+ Clef clef(**i);
+
+ if (clef.getClefType() == Clef::Treble) {
+ str << "treble";
+ } else if (clef.getClefType() == Clef::French) {
+ str << "french";
+ } else if (clef.getClefType() == Clef::Soprano) {
+ str << "soprano";
+ } else if (clef.getClefType() == Clef::Mezzosoprano) {
+ str << "mezzosoprano";
+ } else if (clef.getClefType() == Clef::Alto) {
+ str << "alto";
+ } else if (clef.getClefType() == Clef::Tenor) {
+ str << "tenor";
+ } else if (clef.getClefType() == Clef::Baritone) {
+ str << "baritone";
+ } else if (clef.getClefType() == Clef::Varbaritone) {
+ str << "varbaritone";
+ } else if (clef.getClefType() == Clef::Bass) {
+ str << "bass";
+ } else if (clef.getClefType() == Clef::Subbass) {
+ str << "subbass";
+ }
+
+ // save clef for later use by rests that need repositioned
+ m_lastClefFound = clef;
+ std::cout << "getting clef"
+ << std::endl
+ << "clef: "
+ << clef.getClefType()
+ << " lastClefFound: "
+ << m_lastClefFound.getClefType()
+ << std::endl;
+
+ // Transpose the clef one or two octaves up or down, if specified.
+ int octaveOffset = clef.getOctaveOffset();
+ if (octaveOffset > 0) {
+ str << "^" << 8*octaveOffset;
+ } else if (octaveOffset < 0) {
+ str << "_" << -8*octaveOffset;
+ }
+
+ str << "\"" << std::endl << indent(col);
+
+ } catch (Exception e) {
+ std::cerr << "Bad clef: " << e.getMessage() << std::endl;
+ }
+
+ } else if ((*i)->isa(Rosegarden::Key::EventType)) {
+ // ignore hidden key signatures
+ bool hiddenKey = false;
+ if ((*i)->has(INVISIBLE)) {
+ (*i)->get <Bool>(INVISIBLE, hiddenKey);
+ }
+
+ if (!hiddenKey) {
+ try {
+ str << "\\key ";
+ key = Rosegarden::Key(**i);
+
+ Accidental accidental = Accidentals::NoAccidental;
+
+ str << convertPitchToLilyNote(key.getTonicPitch(), accidental, key);
+
+ if (key.isMinor()) {
+ str << " \\minor";
+ } else {
+ str << " \\major";
+ }
+ str << std::endl << indent(col);
+
+ } catch (Exception e) {
+ std::cerr << "Bad key: " << e.getMessage() << std::endl;
+ }
+ }
+
+ } else if ((*i)->isa(Text::EventType)) {
+
+ if (!handleDirective(*i, lilyText, nextBarIsAlt1, nextBarIsAlt2,
+ nextBarIsDouble, nextBarIsEnd, nextBarIsDot)) {
+ handleText(*i, lilyText);
+ }
+
+ } else if ((*i)->isa(Guitar::Chord::EventType)) {
+
+ try {
+ Guitar::Chord chord = Guitar::Chord(**i);
+ const Guitar::Fingering& fingering = chord.getFingering();
+
+ int barreStart = 0, barreEnd = 0, barreFret = 0;
+
+ //
+ // Check if there is a barre.
+ //
+ if (fingering.hasBarre()) {
+ Guitar::Fingering::Barre barre = fingering.getBarre();
+ barreStart = barre.start;
+ barreEnd = barre.end;
+ barreFret = barre.fret;
+ }
+
+ if (barreStart == 0) {
+ str << " s4*0^\\markup \\fret-diagram #\"";
+ } else {
+ str << " s4*0^\\markup \\override #'(barre-type . straight) \\fret-diagram #\"";
+ }
+ //
+ // Check each string individually.
+ // Note: LilyPond numbers strings differently.
+ //
+ for (int stringNum = 6; stringNum >= 1; --stringNum) {
+ if (barreStart == stringNum) {
+ str << "c:" << barreStart << "-" << barreEnd << "-" << barreFret << ";";
+ }
+
+ if (fingering.getStringStatus( 6-stringNum ) == Guitar::Fingering::MUTED) {
+ str << stringNum << "-x;";
+ } else if (fingering.getStringStatus( 6-stringNum ) == Guitar::Fingering::OPEN) {
+ str << stringNum << "-o;";
+ } else {
+ int stringStatus = fingering.getStringStatus(6-stringNum);
+ if ((stringNum <= barreStart) && (stringNum >= barreEnd)) {
+ str << stringNum << "-" << barreFret << ";";
+ } else {
+ str << stringNum << "-" << stringStatus << ";";
+ }
+ }
+ }
+ str << "\" ";
+
+ } catch (Exception e) { // GuitarChord ctor failed
+ RG_DEBUG << "Bad GuitarChord event in LilyPond export" << endl;
+ }
+ }
+
+ // LilyPond 2.0 introduces required postfix syntax for beaming
+ if (m_exportBeams && newBeamedGroup && notesInBeamedGroup > 0) {
+ str << "[ ";
+ newBeamedGroup = false;
+ }
+
+ if ((*i)->isa(Indication::EventType)) {
+ eventsToStart.insert(*i);
+ eventsInProgress.insert(*i);
+ }
+
+ ++i;
+ }
+
+ if (groupId != -1) {
+ if (groupType == GROUP_TYPE_TUPLED) {
+ if (m_exportBeams && notesInBeamedGroup > 0)
+ str << "] ";
+ str << "} ";
+ tupletRatio = std::pair<int, int>(1, 1);
+ } else if (groupType == GROUP_TYPE_BEAMED) {
+ if (m_exportBeams && notesInBeamedGroup > 0)
+ str << "] ";
+ }
+ }
+
+ if (isGrace == 1) {
+ isGrace = 0;
+ // str << "%{ grace ends %} "; // DEBUG
+ str << "} ";
+ }
+
+ if (lastStem != 0) {
+ str << "\\stemNeutral ";
+ }
+
+ if (overlong) {
+ str << std::endl << indent(col) <<
+ qstrtostr(QString("% %1").
+ arg(i18n("warning: overlong bar truncated here")));
+ }
+
+ if (fractionSmaller(durationRatioSum, barDurationRatio)) {
+ str << std::endl << indent(col) <<
+ qstrtostr(QString("% %1").
+ arg(i18n("warning: bar too short, padding with rests")));
+ str << std::endl << indent(col) <<
+ qstrtostr(QString("% %1/%2 < %3/%4").
+ arg(durationRatioSum.first).
+ arg(durationRatioSum.second).
+ arg(barDurationRatio.first).
+ arg(barDurationRatio.second))
+ << std::endl << indent(col);
+ durationRatio = writeSkip(timeSignature, writtenDuration,
+ (barEnd - barStart) - writtenDuration, true, str);
+ durationRatioSum = fractionSum(durationRatioSum,durationRatio);
+ }
+ //
+ // Export bar and bar checks.
+ //
+ if (nextBarIsDouble) {
+ str << "\\bar \"||\" ";
+ nextBarIsDouble = false;
+ } else if (nextBarIsEnd) {
+ str << "\\bar \"|.\" ";
+ nextBarIsEnd = false;
+ } else if (nextBarIsDot) {
+ str << "\\bar \":\" ";
+ nextBarIsDot = false;
+ } else if (MultiMeasureRestCount == 0) {
+ str << " |";
+ }
+}
+
+std::pair<int,int>
+LilyPondExporter::writeSkip(const TimeSignature &timeSig,
+ timeT offset,
+ timeT duration,
+ bool useRests,
+ std::ofstream &str)
+{
+ DurationList dlist;
+ timeSig.getDurationListForInterval(dlist, duration, offset);
+ std::pair<int,int> durationRatioSum(0,1);
+ std::pair<int,int> durationRatio(0,1);
+
+ int t = 0, count = 0;
+
+ for (DurationList::iterator i = dlist.begin(); ; ++i) {
+
+ if (i == dlist.end() || (*i) != t) {
+
+ if (count > 0) {
+
+ if (!useRests)
+ str << "\\skip ";
+ else if (t == timeSig.getBarDuration())
+ str << "R";
+ else
+ str << "r";
+
+ durationRatio = writeDuration(t, str);
+
+ if (count > 1) {
+ str << "*" << count;
+ durationRatio = fractionProduct(durationRatio,count);
+ }
+ str << " ";
+
+ durationRatioSum = fractionSum(durationRatioSum,durationRatio);
+ }
+
+ if (i != dlist.end()) {
+ t = *i;
+ count = 1;
+ }
+
+ } else {
+ ++count;
+ }
+
+ if (i == dlist.end())
+ break;
+ }
+ return durationRatioSum;
+}
+
+bool
+LilyPondExporter::handleDirective(const Event *textEvent,
+ std::string &lilyText,
+ bool &nextBarIsAlt1, bool &nextBarIsAlt2,
+ bool &nextBarIsDouble, bool &nextBarIsEnd, bool &nextBarIsDot)
+{
+ Text text(*textEvent);
+
+ if (text.getTextType() == Text::LilyPondDirective) {
+ std::string directive = text.getText();
+ if (directive == Text::Segno) {
+ lilyText += "^\\markup { \\musicglyph #\"scripts.segno\" } ";
+ } else if (directive == Text::Coda) {
+ lilyText += "^\\markup { \\musicglyph #\"scripts.coda\" } ";
+ } else if (directive == Text::Alternate1) {
+ nextBarIsAlt1 = true;
+ } else if (directive == Text::Alternate2) {
+ nextBarIsAlt1 = false;
+ nextBarIsAlt2 = true;
+ } else if (directive == Text::BarDouble) {
+ nextBarIsDouble = true;
+ } else if (directive == Text::BarEnd) {
+ nextBarIsEnd = true;
+ } else if (directive == Text::BarDot) {
+ nextBarIsDot = true;
+ } else {
+ // pass along less special directives for handling as plain text,
+ // so they can be attached to chords and whatlike without
+ // redundancy
+ return false;
+ }
+ return true;
+ } else {
+ return false;
+ }
+}
+
+void
+LilyPondExporter::handleText(const Event *textEvent,
+ std::string &lilyText)
+{
+ try {
+
+ Text text(*textEvent);
+ std::string s = text.getText();
+
+ // only protect illegal chars if this is Text, rather than
+ // LilyPondDirective
+ if ((*textEvent).isa(Text::EventType))
+ s = protectIllegalChars(s);
+
+ if (text.getTextType() == Text::Tempo) {
+
+ // print above staff, bold, large
+ lilyText += "^\\markup { \\bold \\large \"" + s + "\" } ";
+
+ } else if (text.getTextType() == Text::LocalTempo ||
+ text.getTextType() == Text::Chord) {
+
+ // print above staff, bold, small
+ lilyText += "^\\markup { \\bold \"" + s + "\" } ";
+
+ } else if (text.getTextType() == Text::Dynamic) {
+
+ // supported dynamics first
+ if (s == "ppppp" || s == "pppp" || s == "ppp" ||
+ s == "pp" || s == "p" || s == "mp" ||
+ s == "mf" || s == "f" || s == "ff" ||
+ s == "fff" || s == "ffff" || s == "rfz" ||
+ s == "sf") {
+
+ lilyText += "-\\" + s + " ";
+
+ } else {
+ // export as a plain markup:
+ // print below staff, bold italics, small
+ lilyText += "_\\markup { \\bold \\italic \"" + s + "\" } ";
+ }
+
+ } else if (text.getTextType() == Text::Direction) {
+
+ // print above staff, large
+ lilyText += "^\\markup { \\large \"" + s + "\" } ";
+
+ } else if (text.getTextType() == Text::LocalDirection) {
+
+ // print below staff, bold italics, small
+ lilyText += "_\\markup { \\bold \\italic \"" + s + "\" } ";
+
+ // LilyPond directives that don't require special handling across
+ // barlines are handled here along with ordinary text types. These
+ // can be injected wherever they happen to occur, and should get
+ // attached to the right bits in due course without extra effort.
+ //
+ } else if (text.getText() == Text::Gliss) {
+ lilyText += "\\glissando ";
+ } else if (text.getText() == Text::Arpeggio) {
+ lilyText += "\\arpeggio ";
+ } else if (text.getText() == Text::Tiny) {
+ lilyText += "\\tiny ";
+ } else if (text.getText() == Text::Small) {
+ lilyText += "\\small ";
+ } else if (text.getText() == Text::NormalSize) {
+ lilyText += "\\normalsize ";
+ } else {
+ textEvent->get
+ <String>(Text::TextTypePropertyName, s);
+ std::cerr << "LilyPondExporter::write() - unhandled text type: "
+ << s << std::endl;
+ }
+ } catch (Exception e) {
+ std::cerr << "Bad text: " << e.getMessage() << std::endl;
+ }
+}
+
+void
+LilyPondExporter::writePitch(const Event *note,
+ const Rosegarden::Key &key,
+ std::ofstream &str)
+{
+ // Note pitch (need name as well as octave)
+ // It is also possible to have "relative" pitches,
+ // but for simplicity we always use absolute pitch
+ // 60 is middle C, one unit is a half-step
+
+ long pitch = 60;
+ note->get
+ <Int>(PITCH, pitch);
+
+ Accidental accidental = Accidentals::NoAccidental;
+ note->get
+ <String>(ACCIDENTAL, accidental);
+
+ // format of LilyPond note is:
+ // name + octave + (duration) + text markup
+
+ // calculate note name and write note
+ std::string lilyNote;
+
+ lilyNote = convertPitchToLilyNote(pitch, accidental, key);
+
+ str << lilyNote;
+
+ // generate and write octave marks
+ std::string octaveMarks = "";
+ int octave = (int)(pitch / 12);
+
+ // tweak the octave break for B# / Cb
+ if ((lilyNote == "bisis") || (lilyNote == "bis")) {
+ octave--;
+ } else if ((lilyNote == "ceses") || (lilyNote == "ces")) {
+ octave++;
+ }
+
+ if (octave < 4) {
+ for (; octave < 4; octave++)
+ octaveMarks += ",";
+ } else {
+ for (; octave > 4; octave--)
+ octaveMarks += "\'";
+ }
+
+ str << octaveMarks;
+}
+
+void
+LilyPondExporter::writeStyle(const Event *note, std::string &prevStyle,
+ int col, std::ofstream &str, bool isInChord)
+{
+ // some hard-coded styles in order to provide rudimentary style export support
+ // note that this is technically bad practice, as style names are not supposed
+ // to be fixed but deduced from the style files actually present on the system
+ const std::string styleMensural = "Mensural";
+ const std::string styleTriangle = "Triangle";
+ const std::string styleCross = "Cross";
+ const std::string styleClassical = "Classical";
+
+ // handle various note styles before opening any chord
+ // brackets
+ std::string style = "";
+ note->get
+ <String>(NotationProperties::NOTE_STYLE, style);
+
+ if (style != prevStyle) {
+
+ if (style == styleClassical && prevStyle == "")
+ return ;
+
+ if (!isInChord)
+ prevStyle = style;
+
+ if (style == styleMensural) {
+ style = "mensural";
+ } else if (style == styleTriangle) {
+ style = "triangle";
+ } else if (style == styleCross) {
+ style = "cross";
+ } else {
+ style = "default"; // failsafe default or explicit
+ }
+
+ if (!isInChord) {
+ str << std::endl << indent(col) << "\\override Voice.NoteHead #'style = #'" << style << std::endl << indent(col);
+ } else {
+ str << "\\tweak #'style #'" << style << " ";
+ }
+ }
+}
+
+std::pair<int,int>
+LilyPondExporter::writeDuration(timeT duration,
+ std::ofstream &str)
+{
+ Note note(Note::getNearestNote(duration, MAX_DOTS));
+ std::pair<int,int> durationRatio(0,1);
+
+ switch (note.getNoteType()) {
+
+ case Note::SixtyFourthNote:
+ str << "64"; durationRatio = std::pair<int,int>(1,64);
+ break;
+
+ case Note::ThirtySecondNote:
+ str << "32"; durationRatio = std::pair<int,int>(1,32);
+ break;
+
+ case Note::SixteenthNote:
+ str << "16"; durationRatio = std::pair<int,int>(1,16);
+ break;
+
+ case Note::EighthNote:
+ str << "8"; durationRatio = std::pair<int,int>(1,8);
+ break;
+
+ case Note::QuarterNote:
+ str << "4"; durationRatio = std::pair<int,int>(1,4);
+ break;
+
+ case Note::HalfNote:
+ str << "2"; durationRatio = std::pair<int,int>(1,2);
+ break;
+
+ case Note::WholeNote:
+ str << "1"; durationRatio = std::pair<int,int>(1,1);
+ break;
+
+ case Note::DoubleWholeNote:
+ str << "\\breve"; durationRatio = std::pair<int,int>(2,1);
+ break;
+ }
+
+ for (int numDots = 0; numDots < note.getDots(); numDots++) {
+ str << ".";
+ }
+ durationRatio = fractionProduct(durationRatio,
+ std::pair<int,int>((1<<(note.getDots()+1))-1,1<<note.getDots()));
+ return durationRatio;
+}
+
+void
+LilyPondExporter::writeSlashes(const Event *note, std::ofstream &str)
+{
+ // write slashes after text
+ // / = 8 // = 16 /// = 32, etc.
+ long slashes = 0;
+ note->get
+ <Int>(NotationProperties::SLASHES, slashes);
+ if (slashes > 0) {
+ str << ":";
+ int length = 4;
+ for (int c = 1; c <= slashes; c++) {
+ length *= 2;
+ }
+ str << length;
+ }
+}
+
+}
diff --git a/src/document/io/LilyPondExporter.h b/src/document/io/LilyPondExporter.h
new file mode 100644
index 0000000..ffb831d
--- /dev/null
+++ b/src/document/io/LilyPondExporter.h
@@ -0,0 +1,262 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ This file is Copyright 2002
+ Hans Kieserman <[email protected]>
+ with heavy lifting from csoundio as it was on 13/5/2002.
+
+ Numerous additions and bug fixes by
+ Michael McIntyre <[email protected]>
+
+ Some restructuring by Chris Cannam.
+
+ Brain surgery to support LilyPond 2.x export by Heikki Junes.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_LILYPONDEXPORTER_H_
+#define _RG_LILYPONDEXPORTER_H_
+
+#include "base/Event.h"
+#include "base/PropertyName.h"
+#include "base/Segment.h"
+#include "gui/general/ProgressReporter.h"
+#include <fstream>
+#include <set>
+#include <string>
+#include <utility>
+
+
+class QObject;
+
+
+namespace Rosegarden
+{
+
+class TimeSignature;
+class Studio;
+class RosegardenGUIApp;
+class RosegardenGUIView;
+class RosegardenGUIDoc;
+class NotationView;
+class Key;
+class Composition;
+
+const std::string headerDedication = "dedication";
+const std::string headerTitle = "title";
+const std::string headerSubtitle = "subtitle";
+const std::string headerSubsubtitle = "subsubtitle";
+const std::string headerPoet = "poet";
+const std::string headerComposer = "composer";
+const std::string headerMeter = "meter";
+const std::string headerOpus = "opus";
+const std::string headerArranger = "arranger";
+const std::string headerInstrument = "instrument";
+const std::string headerPiece = "piece";
+const std::string headerCopyright = "copyright";
+const std::string headerTagline = "tagline";
+
+/**
+ * LilyPond scorefile export
+ */
+
+class LilyPondExporter : public ProgressReporter
+{
+public:
+ typedef std::multiset<Event*, Event::EventCmp> eventstartlist;
+ typedef std::multiset<Event*, Event::EventEndCmp> eventendlist;
+
+public:
+ LilyPondExporter(RosegardenGUIApp *parent, RosegardenGUIDoc *, std::string fileName);
+ LilyPondExporter(NotationView *parent, RosegardenGUIDoc *, std::string fileName);
+ ~LilyPondExporter();
+
+ bool write();
+
+protected:
+ RosegardenGUIView *m_view;
+ NotationView *m_notationView;
+ RosegardenGUIDoc *m_doc;
+ Composition *m_composition;
+ Studio *m_studio;
+ std::string m_fileName;
+ Clef m_lastClefFound;
+
+ void readConfigVariables(void);
+ void writeBar(Segment *, int barNo, int barStart, int barEnd, int col,
+ Rosegarden::Key &key, std::string &lilyText,
+ std::string &prevStyle, eventendlist &eventsInProgress,
+ std::ofstream &str, int &MultiMeasureRestCount,
+ bool &nextBarIsAlt1, bool &nextBarIsAlt2,
+ bool &nextBarIsDouble, bool &nextBarIsEnd, bool &nextBarIsDot);
+
+ timeT calculateDuration(Segment *s,
+ const Segment::iterator &i,
+ timeT barEnd,
+ timeT &soundingDuration,
+ const std::pair<int, int> &tupletRatio,
+ bool &overlong);
+
+ void handleStartingEvents(eventstartlist &eventsToStart, std::ofstream &str);
+ void handleEndingEvents(eventendlist &eventsInProgress,
+ const Segment::iterator &j, std::ofstream &str);
+
+ // convert note pitch into LilyPond format note string
+ std::string convertPitchToLilyNote(int pitch,
+ Accidental accidental,
+ const Rosegarden::Key &key);
+
+ // compose an appropriate LilyPond representation for various Marks
+ std::string composeLilyMark(std::string eventMark, bool stemUp);
+
+ // find/protect illegal characters in user-supplied strings
+ std::string protectIllegalChars(std::string inStr);
+
+ // return a string full of column tabs
+ std::string indent(const int &column);
+
+ std::pair<int,int> writeSkip(const TimeSignature &timeSig,
+ timeT offset,
+ timeT duration,
+ bool useRests,
+ std::ofstream &);
+
+ /*
+ * Handle LilyPond directive. Returns true if the event was a directive,
+ * so subsequent code does not bother to process the event twice
+ */
+ bool handleDirective(const Event *textEvent,
+ std::string &lilyText,
+ bool &nextBarIsAlt1, bool &nextBarIsAlt2,
+ bool &nextBarIsDouble, bool &nextBarIsEnd, bool &nextBarIsDot);
+
+ void handleText(const Event *, std::string &lilyText);
+ void writePitch(const Event *note, const Rosegarden::Key &key, std::ofstream &);
+ void writeStyle(const Event *note, std::string &prevStyle, int col, std::ofstream &, bool isInChord);
+ std::pair<int,int> writeDuration(timeT duration, std::ofstream &);
+ void writeSlashes(const Event *note, std::ofstream &);
+
+private:
+ static const int MAX_DOTS = 4;
+ static const PropertyName SKIP_PROPERTY;
+
+ unsigned int m_paperSize;
+ static const unsigned int PAPER_A3 = 0;
+ static const unsigned int PAPER_A4 = 1;
+ static const unsigned int PAPER_A5 = 2;
+ static const unsigned int PAPER_A6 = 3;
+ static const unsigned int PAPER_LEGAL = 4;
+ static const unsigned int PAPER_LETTER = 5;
+ static const unsigned int PAPER_TABLOID = 6;
+ static const unsigned int PAPER_NONE = 7;
+
+ bool m_paperLandscape;
+ unsigned int m_fontSize;
+ static const unsigned int FONT_11 = 0;
+ static const unsigned int FONT_13 = 1;
+ static const unsigned int FONT_16 = 2;
+ static const unsigned int FONT_19 = 3;
+ static const unsigned int FONT_20 = 4;
+ static const unsigned int FONT_23 = 5;
+ static const unsigned int FONT_26 = 6;
+
+ bool m_exportLyrics;
+ bool m_exportMidi;
+
+ unsigned int m_lyricsHAlignment;
+ static const unsigned int LEFT_ALIGN = 0;
+ static const unsigned int CENTER_ALIGN = 1;
+ static const unsigned int RIGHT_ALIGN = 2;
+
+ unsigned int m_exportTempoMarks;
+ static const unsigned int EXPORT_NONE_TEMPO_MARKS = 0;
+ static const unsigned int EXPORT_FIRST_TEMPO_MARK = 1;
+ static const unsigned int EXPORT_ALL_TEMPO_MARKS = 2;
+
+ unsigned int m_exportSelection;
+ static const unsigned int EXPORT_ALL_TRACKS = 0;
+ static const unsigned int EXPORT_NONMUTED_TRACKS = 1;
+ static const unsigned int EXPORT_SELECTED_TRACK = 2;
+ static const unsigned int EXPORT_SELECTED_SEGMENTS = 3;
+
+ bool m_exportPointAndClick;
+ bool m_exportBeams;
+ bool m_exportStaffGroup;
+ bool m_exportStaffMerge;
+ bool m_raggedBottom;
+
+ unsigned int m_exportMarkerMode;
+
+ static const unsigned int EXPORT_NO_MARKERS = 0;
+ static const unsigned int EXPORT_DEFAULT_MARKERS = 1;
+ static const unsigned int EXPORT_TEXT_MARKERS = 2;
+
+ int m_languageLevel;
+ static const int LILYPOND_VERSION_2_6 = 0;
+ static const int LILYPOND_VERSION_2_8 = 1;
+ static const int LILYPOND_VERSION_2_10 = 2;
+ static const int LILYPOND_VERSION_2_12 = 3;
+
+ std::pair<int,int> fractionSum(std::pair<int,int> x,std::pair<int,int> y) {
+ std::pair<int,int> z(
+ x.first * y.second + x.second * y.first,
+ x.second * y.second);
+ return fractionSimplify(z);
+ }
+ std::pair<int,int> fractionProduct(std::pair<int,int> x,std::pair<int,int> y) {
+ std::pair<int,int> z(
+ x.first * y.first,
+ x.second * y.second);
+ return fractionSimplify(z);
+ }
+ std::pair<int,int> fractionProduct(std::pair<int,int> x,int y) {
+ std::pair<int,int> z(
+ x.first * y,
+ x.second);
+ return fractionSimplify(z);
+ }
+ bool fractionSmaller(std::pair<int,int> x,std::pair<int,int> y) {
+ return (x.first * y.second < x.second * y.first);
+ }
+ std::pair<int,int> fractionSimplify(std::pair<int,int> x) {
+ return std::pair<int,int>(x.first/gcd(x.first,x.second),
+ x.second/gcd(x.first,x.second));
+ }
+ int gcd(int a, int b) {
+ // Euclid's algorithm to find the greatest common divisor
+ while ( 1 ) {
+ int r = a % b;
+ if ( r == 0 )
+ return (b == 0 ? 1 : b);
+ a = b;
+ b = r;
+ }
+ }
+};
+
+
+
+}
+
+#endif
+
diff --git a/src/document/io/MupExporter.cpp b/src/document/io/MupExporter.cpp
new file mode 100644
index 0000000..067c909
--- /dev/null
+++ b/src/document/io/MupExporter.cpp
@@ -0,0 +1,453 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "MupExporter.h"
+
+#include "misc/Debug.h"
+#include "base/BaseProperties.h"
+#include "base/Composition.h"
+#include "base/Event.h"
+#include "base/Exception.h"
+#include "base/NotationQuantizer.h"
+#include "base/NotationTypes.h"
+#include "base/Segment.h"
+#include "base/SegmentNotationHelper.h"
+#include "base/Sets.h"
+#include "base/Track.h"
+#include "gui/general/ProgressReporter.h"
+#include <qobject.h>
+
+using std::string;
+
+namespace Rosegarden
+{
+using namespace BaseProperties;
+
+MupExporter::MupExporter(QObject *parent,
+ Composition *composition,
+ string fileName) :
+ ProgressReporter(parent, "mupExporter"),
+ m_composition(composition),
+ m_fileName(fileName)
+{
+ // nothing else
+}
+
+MupExporter::~MupExporter()
+{
+ // nothing
+}
+
+bool
+MupExporter::write()
+{
+ Composition *c = m_composition;
+
+ std::ofstream str(m_fileName.c_str(), std::ios::out);
+ if (!str) {
+ std::cerr << "MupExporter::write() - can't write file " << m_fileName
+ << std::endl;
+ return false;
+ }
+
+ str << "score\n";
+ str << "\tstaffs=" << c->getNbTracks() << "\n";
+
+ int ts = c->getTimeSignatureCount();
+ std::pair<timeT, TimeSignature> tspair;
+ if (ts > 0)
+ tspair = c->getTimeSignatureChange(0);
+ str << "\ttime="
+ << tspair.second.getNumerator() << "/"
+ << tspair.second.getDenominator() << "\n";
+
+ for (int barNo = -1; barNo < c->getNbBars(); ++barNo) {
+
+ for (TrackId trackNo = c->getMinTrackId();
+ trackNo <= c->getMaxTrackId(); ++trackNo) {
+
+ if (barNo < 0) {
+ writeClefAndKey(str, trackNo);
+ continue;
+ }
+
+ if (barNo == 0 && trackNo == 0) {
+ str << "\nmusic\n";
+ }
+
+ str << "\t" << trackNo + 1 << ":";
+
+ Segment *s = 0;
+ timeT barStart = c->getBarStart(barNo);
+ timeT barEnd = c->getBarEnd(barNo);
+
+ for (Composition::iterator ci = c->begin(); ci != c->end(); ++ci) {
+ if ((*ci)->getTrack() == trackNo &&
+ (*ci)->getStartTime() < barEnd &&
+ (*ci)->getEndMarkerTime() > barStart) {
+ s = *ci;
+ break;
+ }
+ }
+
+ TimeSignature timeSig(c->getTimeSignatureAt(barStart));
+
+ if (!s) {
+ // write empty bar
+ writeInventedRests(str, timeSig, 0, barEnd - barStart);
+ continue;
+ }
+
+ if (s->getStartTime() > barStart) {
+ writeInventedRests(str, timeSig,
+ 0, s->getStartTime() - barStart);
+ }
+
+ // Mup insists that every bar has the correct duration, and won't
+ // recover if one goes wrong. Keep careful tabs on this: it means
+ // that for example we have to round chord durations down where
+ // the next chord starts too soon
+ //!!! we _really_ can't cope with time sig changes yet!
+
+ timeT writtenDuration = writeBar(str, c, s, barStart, barEnd,
+ timeSig, trackNo);
+
+ if (writtenDuration < timeSig.getBarDuration()) {
+ RG_DEBUG << "writtenDuration: " << writtenDuration
+ << ", bar duration " << timeSig.getBarDuration()
+ << endl;
+ writeInventedRests(str, timeSig, writtenDuration,
+ timeSig.getBarDuration() - writtenDuration);
+
+ } else if (writtenDuration > timeSig.getBarDuration()) {
+ std::cerr << "WARNING: overfull bar in Mup export: duration " << writtenDuration
+ << " into bar of duration " << timeSig.getBarDuration()
+ << std::endl;
+ //!!! warn user
+ }
+
+ str << "\n";
+ }
+
+ if (barNo >= 0)
+ str << "bar" << std::endl;
+ }
+
+ str << "\n" << std::endl;
+ str.close();
+ return true;
+}
+
+timeT
+MupExporter::writeBar(std::ofstream &str,
+ Composition *c,
+ Segment *s,
+ timeT barStart, timeT barEnd,
+ TimeSignature &timeSig,
+ TrackId trackNo)
+{
+ timeT writtenDuration = 0;
+ SegmentNotationHelper helper(*s);
+ helper.setNotationProperties();
+
+ long currentGroupId = -1;
+ string currentGroupType = "";
+ long currentTupletCount = 3;
+ bool first = true;
+ bool openBeamWaiting = false;
+
+ for (Segment::iterator si = s->findTime(barStart);
+ s->isBeforeEndMarker(si) &&
+ (*si)->getNotationAbsoluteTime() < barEnd; ++si) {
+
+ if ((*si)->isa(Note::EventType)) {
+
+ Chord chord(*s, si, c->getNotationQuantizer());
+ Event *e = *chord.getInitialNote();
+
+ timeT absTime = e->getNotationAbsoluteTime();
+ timeT duration = e->getNotationDuration();
+ try {
+ // tuplet compensation, etc
+ Note::Type type = e->get<Int>(NOTE_TYPE);
+ int dots = e->get
+ <Int>(NOTE_DOTS);
+ duration = Note(type, dots).getDuration();
+ } catch (Exception e) { // no properties
+ std::cerr << "WARNING: MupExporter::writeBar: incomplete note properties: " << e.getMessage() << std::endl;
+ }
+
+ timeT toNext = duration;
+ Segment::iterator nextElt = chord.getFinalElement();
+ if (s->isBeforeEndMarker(++nextElt)) {
+ toNext = (*nextElt)->getNotationAbsoluteTime() - absTime;
+ if (toNext < duration)
+ duration = toNext;
+ }
+
+ bool enteringGroup = false;
+
+ if (e->has(BEAMED_GROUP_ID) && e->has(BEAMED_GROUP_TYPE)) {
+
+ long id = e->get
+ <Int>(BEAMED_GROUP_ID);
+ string type = e->get
+ <String>(BEAMED_GROUP_TYPE);
+
+ if (id != currentGroupId) {
+
+ // leave previous group first
+ if (currentGroupId >= 0) {
+ if (!openBeamWaiting)
+ str << " ebm";
+ openBeamWaiting = false;
+
+ if (currentGroupType == GROUP_TYPE_TUPLED) {
+ str << "; }" << currentTupletCount;
+ }
+ }
+
+ currentGroupId = id;
+ currentGroupType = type;
+ enteringGroup = true;
+ }
+ } else {
+
+ if (currentGroupId >= 0) {
+ if (!openBeamWaiting)
+ str << " ebm";
+ openBeamWaiting = false;
+
+ if (currentGroupType == GROUP_TYPE_TUPLED) {
+ str << "; }" << currentTupletCount;
+ }
+
+ currentGroupId = -1;
+ currentGroupType = "";
+ }
+ }
+
+ if (openBeamWaiting)
+ str << " bm";
+ if (!first)
+ str << ";";
+ str << " ";
+
+ if (currentGroupType == GROUP_TYPE_TUPLED) {
+ e->get
+ <Int>(BEAMED_GROUP_UNTUPLED_COUNT, currentTupletCount);
+ if (enteringGroup)
+ str << "{ ";
+ //!!! duration = helper.getCompensatedNotationDuration(e);
+
+ }
+
+ writeDuration(str, duration);
+
+ if (toNext > duration && currentGroupType != GROUP_TYPE_TUPLED) {
+ writeInventedRests
+ (str, timeSig,
+ absTime + duration - barStart, toNext - duration);
+ }
+
+ writtenDuration += toNext;
+
+ for (Chord::iterator chi = chord.begin();
+ chi != chord.end(); ++chi) {
+ writePitch(str, trackNo, **chi);
+ }
+
+ openBeamWaiting = false;
+ if (currentGroupType == GROUP_TYPE_BEAMED ||
+ currentGroupType == GROUP_TYPE_TUPLED) {
+ if (enteringGroup)
+ openBeamWaiting = true;
+ }
+
+ si = chord.getFinalElement();
+
+ first = false;
+
+ } else if ((*si)->isa(Note::EventRestType)) {
+
+ if (currentGroupId >= 0) {
+
+ if (!openBeamWaiting)
+ str << " ebm";
+ openBeamWaiting = false;
+
+ if (currentGroupType == GROUP_TYPE_TUPLED) {
+ str << "; }" << currentTupletCount;
+ }
+
+ currentGroupId = -1;
+ currentGroupType = "";
+ }
+
+ if (openBeamWaiting)
+ str << " bm";
+ if (!first)
+ str << ";";
+ str << " ";
+
+ writeDuration(str, (*si)->getNotationDuration());
+ writtenDuration += (*si)->getNotationDuration();
+ str << "r";
+
+ first = false;
+ openBeamWaiting = false;
+
+ } // ignore all other sorts of events for now
+ }
+
+ if (currentGroupId >= 0) {
+ if (!openBeamWaiting)
+ str << " ebm";
+ openBeamWaiting = false;
+
+ if (currentGroupType == GROUP_TYPE_TUPLED) {
+ str << "; }" << currentTupletCount;
+ }
+ }
+
+ if (openBeamWaiting)
+ str << " bm";
+ if (!first)
+ str << ";";
+
+ return writtenDuration;
+}
+
+void
+MupExporter::writeClefAndKey(std::ofstream &str, TrackId trackNo)
+{
+ Composition *c = m_composition;
+
+ for (Composition::iterator i = c->begin(); i != c->end(); ++i) {
+ if ((*i)->getTrack() == trackNo) {
+
+ Clef clef((*i)->getClefAtTime((*i)->getStartTime()));
+ Rosegarden::Key key((*i)->getKeyAtTime((*i)->getStartTime()));
+
+
+ str << "staff " << trackNo + 1 << "\n";
+
+ if (clef.getClefType() == Clef::Treble) {
+ str << "\tclef=treble\n";
+ } else if (clef.getClefType() == Clef::Alto) {
+ str << "\tclef=alto\n";
+ } else if (clef.getClefType() == Clef::Tenor) {
+ str << "\tclef=tenor\n";
+ } else if (clef.getClefType() == Clef::Bass) {
+ str << "\tclef=bass\n";
+ }
+
+ str << "\tkey=" << key.getAccidentalCount()
+ << (key.isSharp() ? "#" : "&")
+ << (key.isMinor() ? "minor" : "major") << std::endl;
+
+ m_clefKeyMap[trackNo] = ClefKeyPair(clef, key);
+
+ return ;
+ }
+ }
+}
+
+void
+MupExporter::writeInventedRests(std::ofstream &str,
+ TimeSignature &timeSig,
+ timeT offset,
+ timeT duration)
+{
+ str << " ";
+ DurationList dlist;
+ timeSig.getDurationListForInterval(dlist, duration, offset);
+ for (DurationList::iterator i = dlist.begin();
+ i != dlist.end(); ++i) {
+ writeDuration(str, *i);
+ str << "r;";
+ }
+}
+
+void
+MupExporter::writePitch(std::ofstream &str, TrackId trackNo,
+ Event *event)
+{
+ long pitch = 0;
+ if (!event->get
+ <Int>(PITCH, pitch)) {
+ str << "c"; // have to write something, or it won't parse
+ return ;
+ }
+
+ Accidental accidental = Accidentals::NoAccidental;
+ (void)event->get
+ <String>(ACCIDENTAL, accidental);
+
+ // mup octave: treble clef is in octave 4?
+
+ ClefKeyPair ck;
+ ClefKeyMap::iterator ckmi = m_clefKeyMap.find(trackNo);
+ if (ckmi != m_clefKeyMap.end())
+ ck = ckmi->second;
+
+ Pitch p(pitch, accidental);
+ Accidental acc(p.getDisplayAccidental(ck.second));
+ char note(p.getNoteName(ck.second));
+ int octave(p.getOctave());
+
+ // just to avoid assuming that the note names returned by Pitch are in
+ // the same set as those expected by Mup -- in practice they are the same
+ // letters but this changes the case
+ str << "cdefgab"[Pitch::getIndexForNote(note)];
+
+ if (acc == Accidentals::DoubleFlat)
+ str << "&&";
+ else if (acc == Accidentals::Flat)
+ str << "&";
+ else if (acc == Accidentals::Sharp)
+ str << "#";
+ else if (acc == Accidentals::DoubleSharp)
+ str << "##";
+ else if (acc == Accidentals::Natural)
+ str << "n";
+
+ str << octave + 1;
+}
+
+void
+MupExporter::writeDuration(std::ofstream &str, timeT duration)
+{
+ Note note(Note::getNearestNote(duration, 2));
+ int n = Note::Semibreve - note.getNoteType();
+ if (n < 0)
+ str << "1/" << (1 << ( -n));
+ else
+ str << (1 << n);
+ for (int d = 0; d < note.getDots(); ++d)
+ str << ".";
+}
+
+}
diff --git a/src/document/io/MupExporter.h b/src/document/io/MupExporter.h
new file mode 100644
index 0000000..3740252
--- /dev/null
+++ b/src/document/io/MupExporter.h
@@ -0,0 +1,89 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_MUPEXPORTER_H_
+#define _RG_MUPEXPORTER_H_
+
+#include "base/Track.h"
+#include "gui/general/ProgressReporter.h"
+#include <map>
+#include <string>
+#include <utility>
+#include "base/Event.h"
+#include "base/NotationTypes.h"
+#include <fstream>
+
+
+class QObject;
+
+
+namespace Rosegarden
+{
+
+class TimeSignature;
+class Segment;
+class Event;
+class Composition;
+
+
+/**
+ * Mup file export
+ */
+
+class MupExporter : public ProgressReporter
+{
+public:
+ MupExporter(QObject *parent, Composition *, std::string fileName);
+ ~MupExporter();
+
+ bool write();
+
+protected:
+ timeT writeBar(std::ofstream &,
+ Composition *,
+ Segment *,
+ timeT, timeT,
+ TimeSignature &,
+ TrackId);
+ void writeClefAndKey(std::ofstream &, TrackId trackNo);
+ void writeInventedRests(std::ofstream &,
+ TimeSignature &timeSig,
+ timeT offset,
+ timeT duration);
+ void writePitch(std::ofstream &, TrackId, Event *event);
+ void writeDuration(std::ofstream &, timeT duration);
+
+ typedef std::pair<Clef, Rosegarden::Key> ClefKeyPair;
+ typedef std::map<TrackId, ClefKeyPair> ClefKeyMap;
+ ClefKeyMap m_clefKeyMap;
+
+ Composition *m_composition;
+ std::string m_fileName;
+};
+
+
+}
+
+#endif
diff --git a/src/document/io/MusicXmlExporter.cpp b/src/document/io/MusicXmlExporter.cpp
new file mode 100644
index 0000000..e1384c6
--- /dev/null
+++ b/src/document/io/MusicXmlExporter.cpp
@@ -0,0 +1,555 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ This file is Copyright 2002
+ Hans Kieserman <[email protected]>
+ with heavy lifting from csoundio as it was on 13/5/2002.
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "MusicXmlExporter.h"
+
+#include "base/BaseProperties.h"
+#include "base/Composition.h"
+#include "base/CompositionTimeSliceAdapter.h"
+#include "base/Event.h"
+#include "base/Instrument.h"
+#include "base/NotationTypes.h"
+#include "base/XmlExportable.h"
+#include "document/RosegardenGUIDoc.h"
+#include "gui/application/RosegardenApplication.h"
+#include "gui/general/ProgressReporter.h"
+#include <qobject.h>
+
+namespace Rosegarden
+{
+
+using namespace BaseProperties;
+
+MusicXmlExporter::MusicXmlExporter(QObject *parent,
+ RosegardenGUIDoc *doc,
+ std::string fileName) :
+ ProgressReporter(parent, "musicXmlExporter"),
+ m_doc(doc),
+ m_fileName(fileName)
+{
+ // nothing else
+}
+
+MusicXmlExporter::~MusicXmlExporter()
+{
+ // nothing
+}
+
+void
+MusicXmlExporter::writeNote(Event *e, timeT lastNoteTime,
+ AccidentalTable &accTable,
+ const Clef &clef,
+ const Rosegarden::Key &key,
+ std::ofstream &str)
+{
+ str << "\t\t\t<note>" << std::endl;
+
+ Pitch pitch(64);
+ Accidental acc;
+ Accidental displayAcc;
+ bool cautionary;
+ Accidental processedDisplayAcc;
+
+ if (e->isa(Note::EventRestType)) {
+ str << "\t\t\t\t<rest/>" << std::endl;
+
+ } else {
+
+ // Order of MusicXML elements within a note:
+ // chord
+ // pitch
+ // duration
+ // tie
+ // instrument
+ // voice
+ // type
+ // dot(s)
+ // accidental
+ // time modification
+ // stem
+ // notehead
+ // staff
+ // beam
+ // notations
+ // lyric
+
+ if (e->getNotationAbsoluteTime() == lastNoteTime) {
+ str << "\t\t\t\t<chord/>" << std::endl;
+ } else {
+ accTable.update();
+ }
+
+ str << "\t\t\t\t<pitch>" << std::endl;
+
+ long p = 0;
+ e->get<Int>(PITCH, p);
+ pitch = p;
+
+ str << "\t\t\t\t\t<step>" << pitch.getNoteName(key) << "</step>" << std::endl;
+
+ acc = pitch.getAccidental(key.isSharp());
+ displayAcc = pitch.getDisplayAccidental(key);
+
+ cautionary = false;
+ processedDisplayAcc =
+ accTable.processDisplayAccidental
+ (displayAcc, pitch.getHeightOnStaff(clef, key), cautionary);
+
+ // don't handle cautionary accidentals here:
+ if (cautionary)
+ processedDisplayAcc = Accidentals::NoAccidental;
+
+ if (acc == Accidentals::DoubleFlat) {
+ str << "\t\t\t\t\t<alter>-2</alter>" << std::endl;
+ } else if (acc == Accidentals::Flat) {
+ str << "\t\t\t\t\t<alter>-1</alter>" << std::endl;
+ } else if (acc == Accidentals::Sharp) {
+ str << "\t\t\t\t\t<alter>1</alter>" << std::endl;
+ } else if (acc == Accidentals::DoubleSharp) {
+ str << "\t\t\t\t\t<alter>2</alter>" << std::endl;
+ }
+
+ int octave = pitch.getOctave( -1);
+ str << "\t\t\t\t\t<octave>" << octave << "</octave>" << std::endl;
+
+ str << "\t\t\t\t</pitch>" << std::endl;
+ }
+
+ // Since there's no way to provide the performance absolute time
+ // for a note, there's also no point in providing the performance
+ // duration, even though it might in principle be of interest
+ str << "\t\t\t\t<duration>" << e->getNotationDuration() << "</duration>" << std::endl;
+
+ if (!e->isa(Note::EventRestType)) {
+
+ if (e->has(TIED_BACKWARD) &&
+ e->get
+ <Bool>(TIED_BACKWARD)) {
+ str << "\t\t\t\t<tie type=\"stop\"/>" << std::endl;
+ }
+ if (e->has(TIED_FORWARD) &&
+ e->get
+ <Bool>(TIED_FORWARD)) {
+ str << "\t\t\t\t<tie type=\"start\"/>" << std::endl;
+ }
+
+ // Incomplete: will RG ever use this?
+ str << "\t\t\t\t<voice>" << "1" << "</voice>" << std::endl;
+ }
+
+ Note note = Note::getNearestNote(e->getNotationDuration());
+
+ static const char *noteNames[] = {
+ "64th", "32nd", "16th", "eighth", "quarter", "half", "whole", "breve"
+ };
+
+ int noteType = note.getNoteType();
+ if (noteType < 0 || noteType >= int(sizeof(noteNames) / sizeof(noteNames[0]))) {
+ std::cerr << "WARNING: MusicXmlExporter::writeNote: bad note type "
+ << noteType << std::endl;
+ noteType = 4;
+ }
+
+ str << "\t\t\t\t<type>" << noteNames[noteType] << "</type>" << std::endl;
+ for (int i = 0; i < note.getDots(); ++i) {
+ str << "\t\t\t\t<dot/>" << std::endl;
+ }
+
+ if (!e->isa(Note::EventRestType)) {
+
+ if (processedDisplayAcc == Accidentals::DoubleFlat) {
+ str << "\t\t\t\t<accidental>flat-flat</accidental>" << std::endl;
+ } else if (processedDisplayAcc == Accidentals::Flat) {
+ str << "\t\t\t\t<accidental>flat</accidental>" << std::endl;
+ } else if (processedDisplayAcc == Accidentals::Natural) {
+ str << "\t\t\t\t<accidental>natural</accidental>" << std::endl;
+ } else if (processedDisplayAcc == Accidentals::Sharp) {
+ str << "\t\t\t\t<accidental>sharp</accidental>" << std::endl;
+ } else if (processedDisplayAcc == Accidentals::DoubleSharp) {
+ str << "\t\t\t\t<accidental>double-sharp</accidental>" << std::endl;
+ }
+
+ bool haveNotations = false;
+ if (e->has(TIED_BACKWARD) &&
+ e->get
+ <Bool>(TIED_BACKWARD)) {
+ if (!haveNotations) {
+ str << "\t\t\t\t<notations>" << std::endl;
+ haveNotations = true;
+ }
+ str << "\t\t\t\t\t<tied type=\"stop\"/>" << std::endl;
+ }
+ if (e->has(TIED_FORWARD) &&
+ e->get
+ <Bool>(TIED_FORWARD)) {
+ if (!haveNotations) {
+ str << "\t\t\t\t<notations>" << std::endl;
+ haveNotations = true;
+ }
+ str << "\t\t\t\t\t<tied type=\"start\"/>" << std::endl;
+ }
+ if (haveNotations) {
+ str << "\t\t\t\t</notations>" << std::endl;
+ }
+ }
+
+ // could also do <stem>down</stem> if you wanted
+ str << "\t\t\t</note>" << std::endl;
+}
+
+void
+MusicXmlExporter::writeKey(Rosegarden::Key whichKey, std::ofstream &str)
+{
+ str << "\t\t\t\t<key>" << std::endl;
+ str << "\t\t\t\t<fifths>"
+ << (whichKey.isSharp() ? "" : "-")
+ << (whichKey.getAccidentalCount()) << "</fifths>" << std::endl;
+ str << "\t\t\t\t<mode>";
+ if (whichKey.isMinor()) {
+ str << "minor";
+ } else {
+ str << "major";
+ }
+ str << "</mode>" << std::endl;
+ str << "\t\t\t\t</key>" << std::endl;
+}
+
+void
+MusicXmlExporter::writeTime(TimeSignature timeSignature, std::ofstream &str)
+{
+ str << "\t\t\t\t<time>" << std::endl;
+ str << "\t\t\t\t<beats>" << timeSignature.getNumerator() << "</beats>" << std::endl;
+ str << "\t\t\t\t<beat-type>" << timeSignature.getDenominator() << "</beat-type>" << std::endl;
+ str << "\t\t\t\t</time>" << std::endl;
+}
+
+void
+MusicXmlExporter::writeClef(Clef whichClef, std::ofstream &str)
+{
+ str << "\t\t\t\t<clef>" << std::endl;
+ if (whichClef == Clef::Treble) {
+ str << "\t\t\t\t<sign>G</sign>" << std::endl;
+ str << "\t\t\t\t<line>2</line>" << std::endl;
+ } else if (whichClef == Clef::Alto) {
+ str << "\t\t\t\t<sign>C</sign>" << std::endl;
+ str << "\t\t\t\t<line>3</line>" << std::endl;
+ } else if (whichClef == Clef::Tenor) {
+ str << "\t\t\t\t<sign>C</sign>" << std::endl;
+ str << "\t\t\t\t<line>4</line>" << std::endl;
+ } else if (whichClef == Clef::Bass) {
+ str << "\t\t\t\t<sign>F</sign>" << std::endl;
+ str << "\t\t\t\t<line>4</line>" << std::endl;
+ }
+ str << "\t\t\t\t</clef>" << std::endl;
+}
+
+std::string
+MusicXmlExporter::numToId(int num)
+{
+ int base = num % 52;
+ char c;
+ if (base < 26) c = 'A' + char(base);
+ else c = 'a' + char(base - 26);
+ std::string s;
+ s += c;
+ while (num / 52 > 0) {
+ s += c;
+ num /= 52;
+ }
+ return s;
+}
+
+bool
+MusicXmlExporter::write()
+{
+ Composition *composition = &m_doc->getComposition();
+
+ std::ofstream str(m_fileName.c_str(), std::ios::out);
+ if (!str) {
+ std::cerr << "MusicXmlExporter::write() - can't write file " << m_fileName << std::endl;
+ return false;
+ }
+
+ // XML header information
+ str << "<?xml version=\"1.0\"?>" << std::endl;
+ str << "<!DOCTYPE score-partwise PUBLIC \"-//Recordare//DTD MusicXML 1.1 Partwise//EN\" \"http://www.musicxml.org/dtds/partwise.dtd\">" << std::endl;
+ // MusicXml header information
+ str << "<score-partwise>" << std::endl;
+ str << "\t<work> <work-title>" << XmlExportable::encode(m_fileName)
+ << "</work-title></work> " << std::endl;
+ // Movement, etc. info goes here
+ str << "\t<identification> " << std::endl;
+ if (composition->getCopyrightNote() != "") {
+ str << "\t\t<rights>"
+ << XmlExportable::encode(composition->getCopyrightNote())
+ << "</rights>" << std::endl;
+ }
+ str << "\t\t<encoding>" << std::endl;
+ // Incomplete: Insert date!
+ // str << "\t\t\t<encoding-date>" << << "</encoding-date>" << std::endl;
+ str << "\t\t\t<software>Rosegarden v" VERSION "</software>" << std::endl;
+ str << "\t\t</encoding>" << std::endl;
+ str << "\t</identification> " << std::endl;
+
+ // MIDI information
+ str << "\t<part-list>" << std::endl;
+ Composition::trackcontainer& tracks = composition->getTracks();
+
+ int trackNo = 0;
+ timeT lastNoteTime = -1;
+
+ for (Composition::trackiterator i = tracks.begin();
+ i != tracks.end(); ++i) {
+ // Incomplete: What about all the other Midi stuff?
+ // Incomplete: (Future) GUI to set labels if they're not already
+ Instrument * trackInstrument = (&m_doc->getStudio())->getInstrumentById((*i).second->getInstrument());
+ str << "\t\t<score-part id=\"" << numToId((*i).first) << "\">" << std::endl;
+ str << "\t\t\t<part-name>" << XmlExportable::encode((*i).second->getLabel()) << "</part-name>" << std::endl;
+ if (trackInstrument) {
+/*
+ Removing this stuff for now. It doesn't work, because the ids are
+ are expected to be non-numeric names that refer to elements
+ elsewhere that define the actual instruments. I think.
+
+ str << "\t\t\t<score-instrument id=\"" << trackInstrument->getName() << "\">" << std::endl;
+ str << "\t\t\t\t<instrument-name>" << trackInstrument->getType() << "</instrument-name>" << std::endl;
+ str << "\t\t\t</score-instrument>" << std::endl;
+ str << "\t\t\t<midi-instrument id=\"" << trackInstrument->getName() << "\">" << std::endl;
+ str << "\t\t\t\t<midi-channel>" << ((unsigned int)trackInstrument->getMidiChannel() + 1) << "</midi-channel>" << std::endl;
+ if (trackInstrument->sendsProgramChange()) {
+ str << "\t\t\t\t<midi-program>" << ((unsigned int)trackInstrument->getProgramChange() + 1) << "</midi-program>" << std::endl;
+ }
+ str << "\t\t\t</midi-instrument>" << std::endl;
+*/
+ }
+ str << "\t\t</score-part>" << std::endl;
+
+ emit setProgress(int(double(trackNo++) / double(tracks.size()) * 20.0));
+ rgapp->refreshGUI(50);
+
+ } // end track iterator
+ str << "\t</part-list>" << std::endl;
+
+ // Notes!
+ // Write out all segments for each Track
+ trackNo = 0;
+
+ for (Composition::trackiterator j = tracks.begin();
+ j != tracks.end(); ++j) {
+
+ bool startedPart = false;
+
+ // Code courtesy docs/code/iterators.txt
+ CompositionTimeSliceAdapter::TrackSet trackSet;
+
+ // Incomplete: get the track info for each track (i.e. this should
+ // be in an iterator loop) into the track set
+ trackSet.insert((*j).first);
+ CompositionTimeSliceAdapter adapter(composition, trackSet);
+
+ int oldMeasureNumber = -1;
+ bool startedAttributes = false;
+ Rosegarden::Key key;
+ Clef clef;
+ AccidentalTable accTable(key, clef);
+ TimeSignature prevTimeSignature;
+
+ bool timeSigPending = false;
+ bool keyPending = false;
+ bool clefPending = false;
+
+ for (CompositionTimeSliceAdapter::iterator k = adapter.begin();
+ k != adapter.end(); ++k) {
+
+ Event *event = *k;
+ timeT absoluteTime = event->getNotationAbsoluteTime();
+
+ if (!startedPart) {
+ str << "\t<part id=\"" << numToId((*j).first) << "\">" << std::endl;
+ startedPart = true;
+ }
+
+ // Open a new measure if necessary
+ // Incomplete: How does MusicXML handle non-contiguous measures?
+
+ int measureNumber = composition->getBarNumber(absoluteTime);
+
+ TimeSignature timeSignature = composition->getTimeSignatureAt(absoluteTime);
+
+ if (measureNumber != oldMeasureNumber) {
+
+ if (startedAttributes) {
+
+ // rather bizarrely, MusicXML appears to require
+ // key, time, clef in that order
+
+ if (keyPending) {
+ writeKey(key, str);
+ keyPending = false;
+ }
+ if (timeSigPending) {
+ writeTime(prevTimeSignature, str);
+ timeSigPending = false;
+ }
+ if (clefPending) {
+ writeClef(clef, str);
+ clefPending = false;
+ }
+
+ str << "\t\t\t</attributes>" << std::endl;
+ startedAttributes = false;
+ }
+
+ while (measureNumber > oldMeasureNumber) {
+
+ bool first = (oldMeasureNumber < 0);
+
+ if (!first) {
+ if (startedAttributes) {
+ str << "\t\t\t</attributes>" << std::endl;
+ }
+ str << "\t\t</measure>\n" << std::endl;
+ }
+
+ ++oldMeasureNumber;
+
+ str << "\t\t<measure number=\"" << (oldMeasureNumber + 1) << "\">" << std::endl;
+
+ if (first) {
+ str << "\t\t\t<attributes>" << std::endl;
+ // Divisions is divisions of crotchet (quarter-note) on which all
+ // note-lengths are based
+ str << "\t\t\t\t<divisions>" << Note(Note::Crotchet).getDuration() << "</divisions>" << std::endl;
+ startedAttributes = true;
+ timeSigPending = true;
+ }
+ }
+
+ accTable = AccidentalTable(key, clef);
+ }
+
+ oldMeasureNumber = measureNumber;
+
+ if (timeSignature != prevTimeSignature) {
+ prevTimeSignature = timeSignature;
+ timeSigPending = true;
+ if (!startedAttributes) {
+ str << "\t\t\t<attributes>" << std::endl;
+ startedAttributes = true;
+ }
+ }
+
+ // process event
+ if (event->isa(Rosegarden::Key::EventType)) {
+
+ if (!startedAttributes) {
+ str << "\t\t\t<attributes>" << std::endl;
+ startedAttributes = true;
+ }
+ key = Rosegarden::Key(*event);
+ keyPending = true;
+ accTable = AccidentalTable(key, clef);
+
+ } else if (event->isa(Clef::EventType)) {
+
+ if (!startedAttributes) {
+ str << "\t\t\t<attributes>" << std::endl;
+ startedAttributes = true;
+ }
+ clef = Clef(*event);
+ clefPending = true;
+ accTable = AccidentalTable(key, clef);
+
+ } else if (event->isa(Note::EventRestType) ||
+ event->isa(Note::EventType)) {
+
+ if (startedAttributes) {
+
+ if (keyPending) {
+ writeKey(key, str);
+ keyPending = false;
+ }
+ if (timeSigPending) {
+ writeTime(prevTimeSignature, str);
+ timeSigPending = false;
+ }
+ if (clefPending) {
+ writeClef(clef, str);
+ clefPending = false;
+ }
+
+ str << "\t\t\t</attributes>" << std::endl;
+ startedAttributes = false;
+ }
+
+ writeNote(event, lastNoteTime, accTable, clef, key, str);
+
+ if (event->isa(Note::EventType)) {
+ lastNoteTime = event->getNotationAbsoluteTime();
+ } else if (event->isa(Note::EventRestType)) {
+ lastNoteTime = -1;
+ }
+ }
+ }
+
+ if (startedPart) {
+ if (startedAttributes) {
+
+ if (keyPending) {
+ writeKey(key, str);
+ keyPending = false;
+ }
+ if (timeSigPending) {
+ writeTime(prevTimeSignature, str);
+ timeSigPending = false;
+ }
+ if (clefPending) {
+ writeClef(clef, str);
+ clefPending = false;
+ }
+
+ str << "\t\t\t</attributes>" << std::endl;
+ startedAttributes = false;
+ }
+
+ str << "\t\t</measure>" << std::endl;
+ str << "\t</part>" << std::endl;
+ }
+
+ emit setProgress(20 +
+ int(double(trackNo++) / double(tracks.size()) * 80.0));
+ rgapp->refreshGUI(50);
+ }
+
+ str << "</score-partwise>" << std::endl;
+ str.close();
+ return true;
+}
+
+}
diff --git a/src/document/io/MusicXmlExporter.h b/src/document/io/MusicXmlExporter.h
new file mode 100644
index 0000000..f730de8
--- /dev/null
+++ b/src/document/io/MusicXmlExporter.h
@@ -0,0 +1,87 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ This file is Copyright 2002
+ Hans Kieserman <[email protected]>
+ with heavy lifting from csoundio as it was on 13/5/2002.
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_MUSICXMLEXPORTER_H_
+#define _RG_MUSICXMLEXPORTER_H_
+
+#include "base/Event.h"
+#include "base/NotationTypes.h"
+#include "gui/general/ProgressReporter.h"
+#include <fstream>
+#include <set>
+#include <string>
+
+
+class QObject;
+
+
+namespace Rosegarden
+{
+
+class RosegardenGUIDoc;
+class Key;
+class Clef;
+class AccidentalTable;
+
+
+/**
+ * MusicXml scorefile export
+ */
+
+class MusicXmlExporter : public ProgressReporter
+{
+public:
+ typedef std::multiset<Event*, Event::EventCmp> eventstartlist;
+ typedef std::multiset<Event*, Event::EventEndCmp> eventendlist;
+public:
+ MusicXmlExporter(QObject *parent, RosegardenGUIDoc *, std::string fileName);
+ ~MusicXmlExporter();
+
+ bool write();
+
+protected:
+ RosegardenGUIDoc *m_doc;
+ std::string m_fileName;
+ void writeClef(Rosegarden::Clef, std::ofstream &str);
+ void writeKey(Rosegarden::Key, std::ofstream &str);
+ void writeTime(TimeSignature timeSignature, std::ofstream &str);
+ void writeNote(Event *e, timeT lastNoteTime,
+ AccidentalTable &table,
+ const Clef &clef,
+ const Rosegarden::Key &key,
+ std::ofstream &str);
+
+ std::string numToId(int);
+};
+
+
+
+}
+
+#endif
diff --git a/src/document/io/RG21Loader.cpp b/src/document/io/RG21Loader.cpp
new file mode 100644
index 0000000..84f3d03
--- /dev/null
+++ b/src/document/io/RG21Loader.cpp
@@ -0,0 +1,797 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "RG21Loader.h"
+
+#include "misc/Debug.h"
+#include "misc/Strings.h"
+#include "base/Composition.h"
+#include "base/Event.h"
+#include "base/BaseProperties.h"
+#include "base/Instrument.h"
+#include "base/MidiProgram.h"
+#include "base/NotationTypes.h"
+#include "base/Segment.h"
+#include "base/Studio.h"
+#include "base/Track.h"
+#include "gui/editors/notation/NotationStrings.h"
+#include "gui/general/ProgressReporter.h"
+#include <qfile.h>
+#include <qobject.h>
+#include <qstring.h>
+#include <qstringlist.h>
+#include <qtextstream.h>
+#include <string>
+#include <vector>
+
+using std::vector;
+using std::string;
+
+
+namespace Rosegarden
+{
+
+using namespace BaseProperties;
+using namespace Accidentals;
+using namespace Marks;
+
+RG21Loader::RG21Loader(Studio *studio,
+ QObject *parent, const char* name)
+ : ProgressReporter(parent, name),
+ m_stream(0),
+ m_studio(studio),
+ m_composition(0),
+ m_currentSegment(0),
+ m_currentSegmentTime(0),
+ m_currentSegmentNb(0),
+ m_currentClef(Clef::Treble),
+ m_currentInstrumentId(MidiInstrumentBase),
+ m_inGroup(false),
+ m_tieStatus(0),
+ m_nbStaves(0)
+{}
+
+RG21Loader::~RG21Loader()
+{}
+
+bool RG21Loader::parseClef()
+{
+ if (m_tokens.count() != 3 || !m_currentSegment)
+ return false;
+
+ std::string clefName = qstrtostr(m_tokens[2].lower());
+
+ m_currentClef = Clef(clefName);
+ Event *clefEvent = m_currentClef.getAsEvent(m_currentSegmentTime);
+ m_currentSegment->insert(clefEvent);
+
+ return true;
+}
+
+bool RG21Loader::parseKey()
+{
+ if (m_tokens.count() < 3 || !m_currentSegment)
+ return false;
+
+ QString keyBase = m_tokens[2];
+ if (keyBase.length() > 1) {
+ // Deal correctly with e.g. Bb major
+ keyBase =
+ keyBase.left(1).upper() +
+ keyBase.right(keyBase.length() - 1).lower();
+ } else {
+ keyBase = keyBase.upper();
+ }
+
+ QString keyName = QString("%1 %2or")
+ .arg(keyBase)
+ .arg(m_tokens[3].lower());
+
+ m_currentKey = Rosegarden::Key(qstrtostr(keyName));
+ Event *keyEvent = m_currentKey.getAsEvent(m_currentSegmentTime);
+ m_currentSegment->insert(keyEvent);
+
+ return true;
+}
+
+bool RG21Loader::parseMetronome()
+{
+ if (m_tokens.count() < 2)
+ return false;
+ if (!m_composition)
+ return false;
+
+ QStringList::Iterator i = m_tokens.begin();
+ timeT duration = convertRG21Duration(i);
+
+ bool isNumeric = false;
+ int count = (*i).toInt(&isNumeric);
+ if (!count || !isNumeric)
+ return false;
+
+ // we need to take into account the fact that "duration" might not
+ // be a crotchet
+
+ double qpm = (count * duration) / Note(Note::Crotchet).getDuration();
+ m_composition->addTempoAtTime(m_currentSegmentTime,
+ m_composition->getTempoForQpm(qpm));
+ return true;
+}
+
+bool RG21Loader::parseChordItem()
+{
+ if (m_tokens.count() < 4)
+ return false;
+
+ QStringList::Iterator i = m_tokens.begin();
+ timeT duration = convertRG21Duration(i);
+
+ // get chord mod flags and nb of notes. chord mod is hex
+ int chordMods = (*i).toInt(0, 16);
+ ++i;
+ /*int nbNotes = (*i).toInt();*/
+ ++i;
+
+ vector<string> marks = convertRG21ChordMods(chordMods);
+
+ // now get notes
+ for (;i != m_tokens.end(); ++i) {
+
+ long pitch = (*i).toInt();
+ ++i;
+
+ // The noteMods field is nominally a hex integer. As it
+ // happens its value can never exceed 7, but I guess we
+ // should do the right thing anyway
+ int noteMods = (*i).toInt(0, 16);
+ pitch = convertRG21Pitch(pitch, noteMods);
+
+ Event *noteEvent = new Event(Note::EventType,
+ m_currentSegmentTime, duration);
+ noteEvent->set
+ <Int>(PITCH, pitch);
+
+ if (m_tieStatus == 1) {
+ noteEvent->set
+ <Bool>(TIED_FORWARD, true);
+ } else if (m_tieStatus == 2) {
+ noteEvent->set
+ <Bool>(TIED_BACKWARD, true);
+ }
+
+ if (marks.size() > 0) {
+ noteEvent->set
+ <Int>(MARK_COUNT, marks.size());
+ for (unsigned int j = 0; j < marks.size(); ++j) {
+ noteEvent->set
+ <String>(getMarkPropertyName(j), marks[j]);
+ }
+ }
+
+ // RG_DEBUG << "RG21Loader::parseChordItem() : insert note pitch " << pitch
+ // << " at time " << m_currentSegmentTime << endl;
+
+ setGroupProperties(noteEvent);
+
+ m_currentSegment->insert(noteEvent);
+ }
+
+ m_currentSegmentTime += duration;
+ if (m_tieStatus == 2)
+ m_tieStatus = 0;
+ else if (m_tieStatus == 1)
+ m_tieStatus = 2;
+
+ return true;
+}
+
+bool RG21Loader::parseRest()
+{
+ if (m_tokens.count() < 2)
+ return false;
+
+ QStringList::Iterator i = m_tokens.begin();
+ timeT duration = convertRG21Duration(i);
+
+ Event *restEvent = new Event(Note::EventRestType,
+ m_currentSegmentTime, duration,
+ Note::EventRestSubOrdering);
+
+ setGroupProperties(restEvent);
+
+ m_currentSegment->insert(restEvent);
+ m_currentSegmentTime += duration;
+
+ return true;
+}
+
+bool RG21Loader::parseText()
+{
+ if (!m_currentSegment)
+ return false;
+
+ std::string s;
+ for (unsigned int i = 1; i < m_tokens.count(); ++i) {
+ if (i > 1)
+ s += " ";
+ s += qstrtostr(m_tokens[i]);
+ }
+
+ if (!readNextLine() ||
+ m_tokens.count() != 2 || m_tokens[0].lower() != "position") {
+ return false;
+ }
+
+ int rg21posn = m_tokens[1].toInt();
+ std::string type = Text::UnspecifiedType;
+
+ switch (rg21posn) {
+
+ case TextAboveStave:
+ type = Text::LocalTempo;
+ break;
+
+ case TextAboveStaveLarge:
+ type = Text::Tempo;
+ break;
+
+ case TextAboveBarLine:
+ type = Text::Direction;
+ break;
+
+ case TextBelowStave:
+ type = Text::Lyric; // perhaps
+ break;
+
+ case TextBelowStaveItalic:
+ type = Text::LocalDirection;
+ break;
+
+ case TextChordName:
+ type = Text::ChordName;
+ break;
+
+ case TextDynamic:
+ type = Text::Dynamic;
+ break;
+ }
+
+ Text text(s, type);
+ Event *textEvent = text.getAsEvent(m_currentSegmentTime);
+ m_currentSegment->insert(textEvent);
+
+ return true;
+}
+
+void RG21Loader::setGroupProperties(Event *e)
+{
+ if (m_inGroup) {
+
+ e->set
+ <Int>(BEAMED_GROUP_ID, m_groupId);
+ e->set
+ <String>(BEAMED_GROUP_TYPE, m_groupType);
+
+ m_groupUntupledLength += e->getDuration();
+ }
+}
+
+bool RG21Loader::parseGroupStart()
+{
+ m_groupType = qstrtostr(m_tokens[0].lower());
+ m_inGroup = true;
+ m_groupId = m_currentSegment->getNextId();
+ m_groupStartTime = m_currentSegmentTime;
+
+ if (m_groupType == GROUP_TYPE_BEAMED) {
+
+ // no more to do
+
+ } else if (m_groupType == GROUP_TYPE_TUPLED) {
+
+ // RG2.1 records two figures A and B, of which A is a time
+ // value indicating the total duration of the group _after_
+ // tupling (which we would call the tupled length), and B is
+ // the count that appears above the group (which we call the
+ // untupled count). We need to know C, the total duration of
+ // the group _before_ tupling; then we can calculate the
+ // tuplet base (C / B) and tupled count (A * B / C).
+
+ m_groupTupledLength = m_tokens[1].toUInt() *
+ Note(Note::Hemidemisemiquaver).getDuration();
+
+ m_groupUntupledCount = m_tokens[2].toUInt();
+ m_groupUntupledLength = 0;
+
+ } else {
+
+ RG_DEBUG
+ << "RG21Loader::parseGroupStart: WARNING: Unknown group type "
+ << m_groupType << ", ignoring" << endl;
+ m_inGroup = false;
+ }
+
+ return true;
+}
+
+bool RG21Loader::parseIndicationStart()
+{
+ if (m_tokens.count() < 4)
+ return false;
+
+ unsigned int indicationId = m_tokens[2].toUInt();
+ std::string indicationType = qstrtostr(m_tokens[3].lower());
+
+ // RG_DEBUG << "Indication start: type is \"" << indicationType << "\"" << endl;
+
+ if (indicationType == "tie") {
+
+ if (m_tieStatus != 0) {
+ RG_DEBUG
+ << "RG21Loader:: parseIndicationStart: WARNING: Found tie within "
+ << "tie, ignoring" << endl;
+ return true;
+ }
+ // m_tieStatus = 1;
+
+ Segment::iterator i = m_currentSegment->end();
+ if (i != m_currentSegment->begin()) {
+ --i;
+ timeT t = (*i)->getAbsoluteTime();
+ while ((*i)->getAbsoluteTime() == t) {
+ (*i)->set
+ <Bool>(TIED_FORWARD, true);
+ if (i == m_currentSegment->begin())
+ break;
+ --i;
+ }
+ }
+ m_tieStatus = 2;
+
+ RG_DEBUG << "rg21io: Indication start: it's a tie" << endl;
+
+ } else {
+
+ // Jeez. Whose great idea was it to place marks _after_ the
+ // events they're marking in the RG2.1 file format?
+
+ timeT indicationTime = m_currentSegmentTime;
+ Segment::iterator i = m_currentSegment->end();
+ if (i != m_currentSegment->begin()) {
+ --i;
+ indicationTime = (*i)->getAbsoluteTime();
+ }
+
+ Indication indication(indicationType, 0);
+ Event *e = indication.getAsEvent(indicationTime);
+ e->setMaybe<Int>("indicationId", indicationId);
+ setGroupProperties(e);
+ m_indicationsExtant[indicationId] = e;
+
+ // place the indication in the segment now; don't wait for the
+ // close-indication, because some things may need to know about it
+ // before then (e.g. close-group)
+
+ m_currentSegment->insert(e);
+
+ RG_DEBUG << "rg21io: Indication start: it's a real indication; id is " << indicationId << ", event is:" << endl;
+ e->dump(std::cerr);
+
+ }
+
+ // other indications not handled yet
+ return true;
+}
+
+void RG21Loader::closeIndication()
+{
+ if (m_tokens.count() < 3)
+ return ;
+
+ unsigned int indicationId = m_tokens[2].toUInt();
+ EventIdMap::iterator i = m_indicationsExtant.find(indicationId);
+
+ RG_DEBUG << "rg21io: Indication close: indication id is " << indicationId << endl;
+
+ // this is normal (for ties):
+ if (i == m_indicationsExtant.end())
+ return ;
+
+ Event *indicationEvent = i->second;
+ m_indicationsExtant.erase(i);
+
+ indicationEvent->set
+ <Int>
+ //!!! (Indication::IndicationDurationPropertyName,
+ ("indicationduration",
+ m_currentSegmentTime - indicationEvent->getAbsoluteTime());
+}
+
+void RG21Loader::closeGroup()
+{
+ if (m_groupType == GROUP_TYPE_TUPLED) {
+
+ Segment::iterator i = m_currentSegment->end();
+ vector<Event *> toInsert;
+ vector<Segment::iterator> toErase;
+
+ if (i != m_currentSegment->begin()) {
+
+ --i;
+ long groupId;
+ timeT prev = m_groupStartTime + m_groupTupledLength;
+
+ while ((*i)->get
+ <Int>(BEAMED_GROUP_ID, groupId) &&
+ groupId == m_groupId) {
+
+ timeT absoluteTime = (*i)->getAbsoluteTime();
+ timeT offset = absoluteTime - m_groupStartTime;
+ timeT intended =
+ (offset * m_groupTupledLength) / m_groupUntupledLength;
+
+ RG_DEBUG
+ << "RG21Loader::closeGroup:"
+ << " m_groupStartTime = " << m_groupStartTime
+ << ", m_groupTupledLength = " << m_groupTupledLength
+ << ", m_groupUntupledCount = " << m_groupUntupledCount
+ << ", m_groupUntupledLength = " << m_groupUntupledLength
+ << ", absoluteTime = " << (*i)->getAbsoluteTime()
+ << ", offset = " << offset
+ << ", intended = " << intended
+ << ", new absolute time = "
+ << (absoluteTime + intended - offset)
+ << ", new duration = "
+ << (prev - absoluteTime)
+ << endl;
+
+ absoluteTime = absoluteTime + intended - offset;
+ Event *e(new Event(**i, absoluteTime, prev - absoluteTime));
+ prev = absoluteTime;
+
+ // See comment in parseGroupStart
+ e->set
+ <Int>(BEAMED_GROUP_TUPLET_BASE,
+ m_groupUntupledLength / m_groupUntupledCount);
+ e->set
+ <Int>(BEAMED_GROUP_TUPLED_COUNT,
+ m_groupTupledLength * m_groupUntupledCount /
+ m_groupUntupledLength);
+ e->set
+ <Int>(BEAMED_GROUP_UNTUPLED_COUNT, m_groupUntupledCount);
+
+ // To change the time of an event, we need to erase &
+ // re-insert it. But erasure will delete the event, and
+ // if it's an indication event that will invalidate our
+ // indicationsExtant entry. Hence this unpleasantness:
+
+ if ((*i)->isa(Indication::EventType)) {
+ long indicationId = 0;
+ if ((*i)->get
+ <Int>("indicationId", indicationId)) {
+ EventIdMap::iterator ei =
+ m_indicationsExtant.find(indicationId);
+ if (ei != m_indicationsExtant.end()) {
+ m_indicationsExtant.erase(ei);
+ m_indicationsExtant[indicationId] = e;
+ }
+ }
+ }
+
+ toInsert.push_back(e);
+ toErase.push_back(i);
+
+ if (i == m_currentSegment->begin())
+ break;
+ --i;
+ }
+ }
+
+ for (unsigned int i = 0; i < toInsert.size(); ++i) {
+ m_currentSegment->insert(toInsert[i]);
+ }
+ for (unsigned int i = 0; i < toErase.size(); ++i) {
+ m_currentSegment->erase(toErase[i]);
+ }
+
+ m_currentSegmentTime = m_groupStartTime + m_groupTupledLength;
+ }
+
+ m_inGroup = false;
+}
+
+bool RG21Loader::parseBarType()
+{
+ if (m_tokens.count() < 5)
+ return false;
+ if (!m_composition)
+ return false;
+
+ int staffNo = m_tokens[1].toInt();
+ if (staffNo > 0) {
+ RG_DEBUG
+ << "RG21Loader::parseBarType: We don't support different time\n"
+ << "signatures on different staffs; disregarding time signature for staff " << staffNo << endl;
+ return true;
+ }
+
+ // barNo is a hex integer
+ int barNo = m_tokens[2].toInt(0, 16);
+
+ int numerator = m_tokens[4].toInt();
+ int denominator = m_tokens[5].toInt();
+
+ timeT sigTime = m_composition->getBarRange(barNo).first;
+ TimeSignature timeSig(numerator, denominator);
+ m_composition->addTimeSignature(sigTime, timeSig);
+
+ return true;
+}
+
+bool RG21Loader::parseStaveType()
+{
+ //!!! tags & connected are not yet implemented
+
+ if (m_tokens.count() < 9)
+ return false;
+ if (!m_composition)
+ return false;
+
+ bool isNumeric = false;
+
+ int staffNo = m_tokens[1].toInt(&isNumeric);
+ if (!isNumeric)
+ return false;
+
+ int programNo = m_tokens[8].toInt();
+
+ if (staffNo >= (int)m_composition->getMinTrackId() &&
+ staffNo <= (int)m_composition->getMaxTrackId()) {
+
+ Track *track = m_composition->getTrackById(staffNo);
+
+ if (track) {
+ Instrument *instr =
+ m_studio->assignMidiProgramToInstrument(programNo, false);
+ if (instr)
+ track->setInstrument(instr->getId());
+ }
+ }
+
+ return true;
+}
+
+timeT RG21Loader::convertRG21Duration(QStringList::Iterator& i)
+{
+ QString durationString = (*i).lower();
+ ++i;
+
+ if (durationString == "dotted") {
+ durationString += ' ';
+ durationString += (*i).lower();
+ ++i;
+ }
+
+ try {
+
+ Note n(NotationStrings::getNoteForName(durationString));
+ return n.getDuration();
+
+ } catch (NotationStrings::MalformedNoteName m) {
+
+ RG_DEBUG << "RG21Loader::convertRG21Duration: Bad duration: "
+ << durationString << endl;
+ return 0;
+ }
+
+}
+
+void RG21Loader::closeSegment()
+{
+ if (m_currentSegment) {
+
+ TrackId trackId = m_currentSegmentNb - 1;
+
+ m_currentSegment->setTrack(trackId);
+
+ Track *track = new Track
+ (trackId, m_currentInstrumentId, trackId,
+ qstrtostr(m_currentStaffName), false);
+ m_currentInstrumentId = (++m_currentInstrumentId) % 16;
+
+ m_composition->addTrack(track);
+ m_composition->addSegment(m_currentSegment);
+ m_currentSegment = 0;
+ m_currentSegmentTime = 0;
+ m_currentClef = Clef(Clef::Treble);
+
+ } else {
+ // ??
+ }
+}
+
+long RG21Loader::convertRG21Pitch(long pitch, int noteModifier)
+{
+ Accidental accidental =
+ (noteModifier & ModSharp) ? Sharp :
+ (noteModifier & ModFlat) ? Flat :
+ (noteModifier & ModNatural) ? Natural : NoAccidental;
+
+ long rtn = Pitch::getPerformancePitchFromRG21Pitch
+ (pitch, accidental, m_currentClef, m_currentKey);
+
+ return rtn;
+}
+
+bool RG21Loader::readNextLine()
+{
+ bool inComment = false;
+
+ do {
+ inComment = false;
+
+ m_currentLine = m_stream->readLine();
+
+ if (m_stream->eof())
+ return false;
+
+ m_currentLine = m_currentLine.simplifyWhiteSpace();
+
+ if (m_currentLine[0] == '#' ||
+ m_currentLine.length() == 0) {
+ inComment = true;
+ continue; // skip comments
+ }
+
+ m_tokens = QStringList::split(' ', m_currentLine);
+
+ } while (inComment);
+
+ return true;
+}
+
+bool RG21Loader::load(const QString &fileName, Composition &comp)
+{
+ m_composition = &comp;
+ comp.clear();
+
+ QFile file(fileName);
+ if (file.open(IO_ReadOnly)) {
+ m_stream = new QTextStream(&file);
+ } else {
+ return false;
+ }
+
+ m_studio->unassignAllInstruments();
+
+ while (!m_stream->eof()) {
+
+ if (!readNextLine())
+ break;
+
+ QString firstToken = m_tokens.first();
+
+ if (firstToken == "Staves" || firstToken == "Staffs") { // nb staves
+
+ m_nbStaves = m_tokens[1].toUInt();
+
+ } else if (firstToken == "Name") { // Staff name
+
+ m_currentStaffName = m_tokens[1]; // we don't do anything with it yet
+ m_currentSegment = new Segment;
+ ++m_currentSegmentNb;
+
+ } else if (firstToken == "Clef") {
+
+ parseClef();
+
+ } else if (firstToken == "Key") {
+
+ parseKey();
+
+ } else if (firstToken == "Metronome") {
+
+ if (!readNextLine())
+ break;
+ parseMetronome();
+
+ } else if (firstToken == ":") { // chord
+
+ m_tokens.remove(m_tokens.begin()); // get rid of 1st token ':'
+ parseChordItem();
+
+ } else if (firstToken == "Rest") { // rest
+
+ if (!readNextLine())
+ break;
+
+ parseRest();
+
+ } else if (firstToken == "Text") {
+
+ if (!readNextLine())
+ break;
+
+ parseText();
+
+ } else if (firstToken == "Group") {
+
+ if (!readNextLine())
+ break;
+
+ parseGroupStart();
+
+ } else if (firstToken == "Mark") {
+
+ if (m_tokens[1] == "start")
+ parseIndicationStart();
+ else if (m_tokens[1] == "end")
+ closeIndication();
+
+ } else if (firstToken == "Bar") {
+
+ parseBarType();
+
+ } else if (firstToken == "Stave") {
+
+ parseStaveType();
+
+ } else if (firstToken == "End") {
+
+ if (m_inGroup)
+ closeGroup();
+ else
+ closeSegment();
+
+ } else {
+
+ RG_DEBUG << "RG21Loader::parse: Unsupported element type \"" << firstToken << "\", ignoring" << endl;
+ }
+ }
+
+ delete m_stream;
+ m_stream = 0;
+
+ return true;
+}
+
+vector<string> RG21Loader::convertRG21ChordMods(int chordMods)
+{
+ vector<string> marks;
+
+ // bit laborious!
+ if (chordMods & ModDot) marks.push_back(Staccato);
+ if (chordMods & ModLegato) marks.push_back(Tenuto);
+ if (chordMods & ModAccent) marks.push_back(Accent);
+ if (chordMods & ModSfz) marks.push_back(Sforzando);
+ if (chordMods & ModRfz) marks.push_back(Rinforzando);
+ if (chordMods & ModTrill) marks.push_back(Trill);
+ if (chordMods & ModTurn) marks.push_back(Turn);
+ if (chordMods & ModPause) marks.push_back(Pause);
+
+ return marks;
+}
+
+}
diff --git a/src/document/io/RG21Loader.h b/src/document/io/RG21Loader.h
new file mode 100644
index 0000000..1e944af
--- /dev/null
+++ b/src/document/io/RG21Loader.h
@@ -0,0 +1,162 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_RG21LOADER_H_
+#define _RG_RG21LOADER_H_
+
+#include "base/MidiProgram.h"
+#include "base/NotationTypes.h"
+#include "gui/general/ProgressReporter.h"
+#include <map>
+#include <string>
+#include <qstring.h>
+#include <qstringlist.h>
+#include <vector>
+#include "base/Event.h"
+
+
+class QTextStream;
+class QObject;
+class Iterator;
+
+
+namespace Rosegarden
+{
+
+class Studio;
+class Segment;
+class Event;
+class Composition;
+
+
+/**
+ * Rosegarden 2.1 file import
+ */
+class RG21Loader : public ProgressReporter
+{
+public:
+ RG21Loader(Studio *,
+ QObject *parent = 0, const char *name = 0);
+ ~RG21Loader();
+
+ /**
+ * Load and parse the RG2.1 file \a fileName, and write it into the
+ * given Composition (clearing the existing segment data first).
+ * Return true for success.
+ */
+ bool load(const QString& fileName, Composition &);
+
+protected:
+
+ // RG21 note mods
+ enum { ModSharp = (1<<0),
+ ModFlat = (1<<1),
+ ModNatural = (1<<2)
+ };
+
+ // RG21 chord mods
+ enum { ModDot = (1<<0),
+ ModLegato = (1<<1),
+ ModAccent = (1<<2),
+ ModSfz = (1<<3),
+ ModRfz = (1<<4),
+ ModTrill = (1<<5),
+ ModTurn = (1<<6),
+ ModPause = (1<<7)
+ };
+
+ // RG21 text positions
+ enum { TextAboveStave = 0,
+ TextAboveStaveLarge,
+ TextAboveBarLine,
+ TextBelowStave,
+ TextBelowStaveItalic,
+ TextChordName,
+ TextDynamic
+ };
+
+ bool parseClef();
+ bool parseKey();
+ bool parseMetronome();
+ bool parseChordItem();
+ bool parseRest();
+ bool parseText();
+ bool parseGroupStart();
+ bool parseIndicationStart();
+ bool parseBarType();
+ bool parseStaveType();
+
+ void closeGroup();
+ void closeIndication();
+ void closeSegment();
+
+ void setGroupProperties(Event *);
+
+ long convertRG21Pitch(long rg21pitch, int noteModifier);
+ timeT convertRG21Duration(QStringList::Iterator&);
+ std::vector<std::string> convertRG21ChordMods(int chordMod);
+
+ bool readNextLine();
+
+ //--------------- Data members ---------------------------------
+
+ QTextStream *m_stream;
+
+ Studio *m_studio;
+ Composition* m_composition;
+ Segment* m_currentSegment;
+ unsigned int m_currentSegmentTime;
+ unsigned int m_currentSegmentNb;
+ Clef m_currentClef;
+ Rosegarden::Key m_currentKey;
+ InstrumentId m_currentInstrumentId;
+
+ typedef std::map<int, Event *> EventIdMap;
+ EventIdMap m_indicationsExtant;
+
+ bool m_inGroup;
+ long m_groupId;
+ std::string m_groupType;
+ timeT m_groupStartTime;
+ int m_groupTupledLength;
+ int m_groupTupledCount;
+ int m_groupUntupledLength;
+ int m_groupUntupledCount;
+
+ int m_tieStatus; // 0 -> none, 1 -> tie started, 2 -> seen one note
+
+ QString m_currentLine;
+ QString m_currentStaffName;
+
+ QStringList m_tokens;
+
+ unsigned int m_nbStaves;
+};
+
+
+
+}
+
+#endif
diff --git a/src/gui/application/LircClient.cpp b/src/gui/application/LircClient.cpp
new file mode 100644
index 0000000..ae731d7
--- /dev/null
+++ b/src/gui/application/LircClient.cpp
@@ -0,0 +1,100 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ This file is Copyright 2005
+ Toni Arnold <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "LircClient.h"
+
+#ifdef HAVE_LIRC
+
+#include "misc/Debug.h"
+#include "base/Exception.h"
+#include <qobject.h>
+#include <qsocketnotifier.h>
+#include <fcntl.h>
+#include <cstdlib>
+
+namespace Rosegarden
+{
+
+LircClient::LircClient(void)
+ : QObject()
+{
+ int socketFlags;
+
+ // socket setup with nonblock
+ m_socket = lirc_init("rosegarden", 1);
+ if (m_socket == -1) {
+ throw Exception("Failed to connect to LIRC");
+ }
+
+ if (lirc_readconfig(NULL, &m_config, NULL) == -1) {
+ throw Exception("Failed reading LIRC config file");
+ }
+
+ fcntl(m_socket, F_GETOWN, getpid());
+ socketFlags = fcntl(m_socket, F_GETFL, 0);
+ if (socketFlags != -1) {
+ fcntl(socketFlags, F_SETFL, socketFlags | O_NONBLOCK);
+ }
+
+ m_socketNotifier = new QSocketNotifier(m_socket, QSocketNotifier::Read, 0);
+ connect(m_socketNotifier, SIGNAL(activated(int)), this, SLOT(readButton()) );
+
+ RG_DEBUG << "LircClient::LircClient: connected to socket: " << m_socket << endl;
+}
+
+LircClient::~LircClient()
+{
+ lirc_freeconfig(m_config);
+ delete m_socketNotifier;
+ lirc_deinit();
+
+ RG_DEBUG << "LircClient::~LircClient: cleaned up" << endl;
+}
+
+void LircClient::readButton()
+{
+ char *code;
+ int ret;
+
+ RG_DEBUG << "LircClient::readButton" << endl;
+
+ if (lirc_nextcode(&code) == 0 && code != NULL) { // no error && a string is available
+ // handle any command attached to that button
+ while ( (ret = lirc_code2char(m_config, code, &m_command)) == 0 && m_command != NULL )
+ {
+ emit buttonPressed(m_command);
+ }
+ free(code);
+ }
+}
+
+}
+
+#include "LircClient.moc"
+
+#endif
diff --git a/src/gui/application/LircClient.h b/src/gui/application/LircClient.h
new file mode 100644
index 0000000..b80d3d7
--- /dev/null
+++ b/src/gui/application/LircClient.h
@@ -0,0 +1,71 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ This file is Copyright 2005
+ Toni Arnold <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_LIRCCLIENT_H_
+#define _RG_LIRCCLIENT_H_
+
+#ifdef HAVE_LIRC
+
+#include <qobject.h>
+#include <lirc/lirc_client.h>
+
+class QSocketNotifier;
+
+
+namespace Rosegarden
+{
+
+
+
+class LircClient : public QObject
+{
+ Q_OBJECT
+public:
+ LircClient(void);
+ ~LircClient();
+
+public slots:
+ void readButton();
+
+signals:
+ void buttonPressed(char *);
+
+private:
+ int m_socket;
+ QSocketNotifier *m_socketNotifier;
+ struct lirc_config *m_config;
+ char *m_command;
+};
+
+
+
+}
+
+#endif
+
+#endif
diff --git a/src/gui/application/LircCommander.cpp b/src/gui/application/LircCommander.cpp
new file mode 100644
index 0000000..53562ca
--- /dev/null
+++ b/src/gui/application/LircCommander.cpp
@@ -0,0 +1,170 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ This file is Copyright 2005
+ Toni Arnold <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include "LircCommander.h"
+#include "LircClient.h"
+
+#ifdef HAVE_LIRC
+
+#include "misc/Debug.h"
+#include "document/RosegardenGUIDoc.h"
+#include "gui/editors/segment/TrackButtons.h"
+#include "RosegardenGUIApp.h"
+#include "RosegardenGUIView.h"
+
+#include <qobject.h>
+
+
+namespace Rosegarden
+{
+
+LircCommander::LircCommander(LircClient *lirc, RosegardenGUIApp *rgGUIApp)
+ : QObject()
+{
+ m_lirc = lirc;
+ m_rgGUIApp = rgGUIApp;
+ connect(m_lirc, SIGNAL(buttonPressed(char *)),
+ this, SLOT(slotExecute(char *)) );
+
+ connect(this, SIGNAL(play()),
+ m_rgGUIApp, SLOT(slotPlay()) );
+ connect(this, SIGNAL(stop()),
+ m_rgGUIApp, SLOT(slotStop()) );
+ connect(this, SIGNAL(record()),
+ m_rgGUIApp, SLOT(slotRecord()) );
+ connect(this, SIGNAL(rewind()),
+ m_rgGUIApp, SLOT(slotRewind()) );
+ connect(this, SIGNAL(rewindToBeginning()),
+ m_rgGUIApp, SLOT(slotRewindToBeginning()) );
+ connect(this, SIGNAL(fastForward()),
+ m_rgGUIApp, SLOT(slotFastforward()) );
+ connect(this, SIGNAL(fastForwardToEnd()),
+ m_rgGUIApp, SLOT(slotFastForwardToEnd()) );
+ connect(this, SIGNAL(toggleRecord()),
+ m_rgGUIApp, SLOT(slotToggleRecord()) );
+ connect(this, SIGNAL(trackDown()),
+ m_rgGUIApp, SLOT(slotTrackDown()) );
+ connect(this, SIGNAL(trackUp()),
+ m_rgGUIApp, SLOT(slotTrackUp()) );
+ connect(this, SIGNAL(trackMute()),
+ m_rgGUIApp, SLOT(slotToggleMutedCurrentTrack()) );
+ connect(this, SIGNAL(trackRecord()),
+ m_rgGUIApp, SLOT(slotToggleRecordCurrentTrack()) );
+}
+
+LircCommander::command LircCommander::commands[] =
+ {
+ { "FORWARD", cmd_fastForward },
+ { "FORWARDTOEND", cmd_fastForwardToEnd },
+ { "PLAY", cmd_play },
+ { "PUNCHINRECORD", cmd_toggleRecord },
+ { "RECORD", cmd_record },
+ { "REWIND", cmd_rewind },
+ { "REWINDTOBEGINNING", cmd_rewindToBeginning },
+ { "STOP", cmd_stop },
+ { "TRACK+", cmd_trackUp },
+ { "TRACK-", cmd_trackDown },
+ { "TRACK-MUTE", cmd_trackMute },
+ { "TRACK-RECORD", cmd_trackRecord },
+ };
+
+
+int LircCommander::compareCommandName(const void *c1, const void *c2)
+{
+ return (strcmp(((struct command *)c1)->name, ((struct command *)c2)->name));
+}
+
+void LircCommander::slotExecute(char *command)
+{
+ struct command tmp, *res;
+
+ RG_DEBUG << "LircCommander::slotExecute: invoking command: " << command << endl;
+
+ // find the function for the name
+ tmp.name = command;
+ res = (struct command *)bsearch(&tmp, commands,
+ sizeof(commands) / sizeof(struct command),
+ sizeof(struct command),
+ compareCommandName);
+ if (res != NULL)
+ {
+ switch (res->code)
+ {
+ case cmd_play:
+ emit play();
+ break;
+ case cmd_stop:
+ emit stop();
+ break;
+ case cmd_record:
+ emit record();
+ break;
+ case cmd_rewind:
+ emit rewind();
+ break;
+ case cmd_rewindToBeginning:
+ emit rewindToBeginning();
+ break;
+ case cmd_fastForward:
+ emit fastForward();
+ break;
+ case cmd_fastForwardToEnd:
+ emit fastForwardToEnd();
+ break;
+ case cmd_toggleRecord:
+ emit toggleRecord();
+ break;
+ case cmd_trackDown:
+ emit trackDown();
+ break;
+ case cmd_trackUp:
+ emit trackUp();
+ break;
+ case cmd_trackMute:
+ emit trackMute();
+ break;
+ case cmd_trackRecord:
+ emit trackRecord();
+ break;
+ default:
+ RG_DEBUG << "LircCommander::slotExecute: unhandled command " << command << endl;
+ return;
+ }
+ RG_DEBUG << "LircCommander::slotExecute: handled command: " << command << endl;
+ }
+ else
+ {
+ RG_DEBUG << "LircCommander::slotExecute: invoking command: " << command
+ << " failed (command not defined in LircCommander::commands[])" << endl;
+ };
+}
+
+}
+
+#include "LircCommander.moc"
+
+#endif
diff --git a/src/gui/application/LircCommander.h b/src/gui/application/LircCommander.h
new file mode 100644
index 0000000..84a857e
--- /dev/null
+++ b/src/gui/application/LircCommander.h
@@ -0,0 +1,112 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ This file is Copyright 2005
+ Toni Arnold <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_LIRCCOMMANDER_H_
+#define _RG_LIRCCOMMANDER_H_
+
+#ifdef HAVE_LIRC
+
+#include <qobject.h>
+#include "base/Track.h"
+
+
+namespace Rosegarden
+{
+
+class RosegardenGUIApp;
+class RosegardenGUIDoc;
+class TrackButtons;
+class LircClient;
+
+
+class LircCommander : public QObject
+{
+ Q_OBJECT
+public:
+ LircCommander(LircClient *lirc, RosegardenGUIApp *rgGUIApp);
+
+signals:
+ //for RosegardenGUIApp
+ void play();
+ void stop();
+ void record();
+ void rewind();
+ void rewindToBeginning();
+ void fastForward();
+ void fastForwardToEnd();
+ void toggleRecord();
+ void trackDown();
+ void trackUp();
+ void trackMute();
+ void trackRecord();
+
+private slots:
+ void slotExecute(char *);
+ //void slotDocumentChanged(RosegardenGUIDoc *);
+
+private:
+ LircClient *m_lirc;
+ RosegardenGUIApp *m_rgGUIApp;
+ //TrackButtons *m_trackButtons;
+
+ // commands invoked by lirc
+ enum commandCode {
+ cmd_play,
+ cmd_stop,
+ cmd_record,
+ cmd_rewind,
+ cmd_rewindToBeginning,
+ cmd_fastForward,
+ cmd_fastForwardToEnd,
+ cmd_toggleRecord,
+ cmd_trackDown,
+ cmd_trackUp,
+ cmd_trackMute,
+ cmd_trackRecord
+ };
+
+
+ // the command -> method mapping table
+ static struct command
+ {
+ char *name; /* command name */
+ commandCode code; /* function to process it */
+ }
+ commands[];
+
+ // utilities
+ static int compareCommandName(const void *c1, const void *c2);
+
+};
+
+
+
+}
+
+#endif
+
+#endif
diff --git a/src/gui/application/RosegardenApplication.cpp b/src/gui/application/RosegardenApplication.cpp
new file mode 100644
index 0000000..6e85aab
--- /dev/null
+++ b/src/gui/application/RosegardenApplication.cpp
@@ -0,0 +1,145 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "RosegardenApplication.h"
+
+#include "misc/Debug.h"
+#include "document/ConfigGroups.h"
+#include "document/RosegardenGUIDoc.h"
+#include "gui/application/RosegardenDCOP.h"
+#include "gui/kdeext/KTmpStatusMsg.h"
+#include "RosegardenGUIApp.h"
+#include <kcmdlineargs.h>
+#include <klocale.h>
+#include <kmainwindow.h>
+#include <kmessagebox.h>
+#include <kprocess.h>
+#include <kuniqueapplication.h>
+#include <qcstring.h>
+#include <qeventloop.h>
+#include <qsessionmanager.h>
+#include <qstring.h>
+#include <dcopclient.h>
+#include <kconfig.h>
+#include <kstatusbar.h>
+
+
+namespace Rosegarden
+{
+
+int RosegardenApplication::newInstance()
+{
+ KCmdLineArgs *args = KCmdLineArgs::parsedArgs();
+
+ if (RosegardenGUIApp::self() && args->count() &&
+ RosegardenGUIApp::self()->getDocument() &&
+ RosegardenGUIApp::self()->getDocument()->saveIfModified()) {
+ // Check for modifications and save if necessary - if cancelled
+ // then don't load the new file.
+ //
+ RosegardenGUIApp::self()->openFile(args->arg(0));
+ }
+
+ return KUniqueApplication::newInstance();
+}
+
+bool RosegardenApplication::isSequencerRegistered()
+{
+ if (noSequencerMode())
+ return false;
+ return dcopClient()->isApplicationRegistered(ROSEGARDEN_SEQUENCER_APP_NAME);
+}
+
+bool RosegardenApplication::sequencerSend(QCString dcopCall, QByteArray params)
+{
+ if (noSequencerMode())
+ return false;
+
+ return dcopClient()->send(ROSEGARDEN_SEQUENCER_APP_NAME,
+ ROSEGARDEN_SEQUENCER_IFACE_NAME,
+ dcopCall, params);
+}
+
+bool RosegardenApplication::sequencerCall(QCString dcopCall, QCString& replyType, QByteArray& replyData,
+ QByteArray params, bool useEventLoop)
+{
+ if (noSequencerMode())
+ return false;
+ return dcopClient()->call(ROSEGARDEN_SEQUENCER_APP_NAME,
+ ROSEGARDEN_SEQUENCER_IFACE_NAME,
+ dcopCall, params, replyType, replyData, useEventLoop);
+}
+
+void RosegardenApplication::sfxLoadExited(KProcess *proc)
+{
+ if (!proc->normalExit()) {
+ QString configGroup = config()->group();
+ config()->setGroup(SequencerOptionsConfigGroup);
+ QString soundFontPath = config()->readEntry("soundfontpath", "");
+ config()->setGroup(configGroup);
+
+ KMessageBox::error(mainWidget(),
+ i18n("Failed to load soundfont %1").arg(soundFontPath));
+ } else {
+ RG_DEBUG << "RosegardenApplication::sfxLoadExited() : sfxload exited normally\n";
+ }
+
+}
+
+void RosegardenApplication::slotSetStatusMessage(QString msg)
+{
+ KMainWindow* mainWindow = dynamic_cast<KMainWindow*>(mainWidget());
+ if (mainWindow) {
+ if (msg.isEmpty())
+ msg = KTmpStatusMsg::getDefaultMsg();
+ mainWindow->statusBar()->changeItem(QString(" %1").arg(msg), KTmpStatusMsg::getDefaultId());
+ }
+
+}
+
+void
+RosegardenApplication::refreshGUI(int maxTime)
+{
+ eventLoop()->processEvents(QEventLoop::ExcludeUserInput |
+ QEventLoop::ExcludeSocketNotifiers,
+ maxTime);
+}
+
+void RosegardenApplication::saveState(QSessionManager& sm)
+{
+ emit aboutToSaveState();
+ KUniqueApplication::saveState(sm);
+}
+
+RosegardenApplication* RosegardenApplication::rgApp()
+{
+ return dynamic_cast<RosegardenApplication*>(kApplication());
+}
+
+QByteArray RosegardenApplication::Empty;
+
+}
+
+#include "RosegardenApplication.moc"
diff --git a/src/gui/application/RosegardenApplication.h b/src/gui/application/RosegardenApplication.h
new file mode 100644
index 0000000..4541308
--- /dev/null
+++ b/src/gui/application/RosegardenApplication.h
@@ -0,0 +1,97 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_ROSEGARDENAPPLICATION_H_
+#define _RG_ROSEGARDENAPPLICATION_H_
+
+#include <kuniqueapplication.h>
+#include <qcstring.h>
+#include <qstring.h>
+
+
+class QSessionManager;
+class KProcess;
+
+
+namespace Rosegarden
+{
+
+
+
+/**
+ * RosegardenApplication
+ *
+ * Handles RosegardenGUIApps perceived uniqueness for us.
+ *
+ */
+class RosegardenApplication : public KUniqueApplication
+{
+ Q_OBJECT
+public:
+ RosegardenApplication(): KUniqueApplication(), m_noSequencerMode(false) {}
+
+ /**
+ * Handle the attempt at creation of a new instance -
+ * only accept new file names which we attempt to load
+ * into the existing instance (if it exists)
+ */
+ virtual int newInstance();
+
+ void refreshGUI(int maxTime);
+
+ bool isSequencerRegistered();
+ bool sequencerSend(QCString dcopCall, QByteArray params = Empty);
+ bool sequencerCall(QCString dcopCall, QCString& replyType,
+ QByteArray& replyData, QByteArray params = Empty, bool useEventLoop = false);
+
+ static RosegardenApplication* rgApp();
+
+ static QByteArray Empty;
+
+ void setNoSequencerMode(bool m=true) { m_noSequencerMode = m; }
+ bool noSequencerMode() { return m_noSequencerMode; }
+
+ virtual void saveState(QSessionManager&);
+
+signals:
+ // connect this to RosegardenGUIApp
+ void aboutToSaveState();
+
+public slots:
+ void sfxLoadExited(KProcess *proc);
+ void slotSetStatusMessage(QString txt);
+
+protected:
+ //--------------- Data members ---------------------------------
+
+ bool m_noSequencerMode;
+};
+
+#define rgapp RosegardenApplication::rgApp()
+
+
+}
+
+#endif
diff --git a/src/gui/application/RosegardenDCOP.h b/src/gui/application/RosegardenDCOP.h
new file mode 100644
index 0000000..2689945
--- /dev/null
+++ b/src/gui/application/RosegardenDCOP.h
@@ -0,0 +1,50 @@
+// -*- c-basic-offset: 4 -*-
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#ifndef _ROSEGARDEN_DCOP_H_
+#define _ROSEGARDEN_DCOP_H_
+
+
+// The names of our applications and interfaces that we share
+//
+#define ROSEGARDEN_SEQUENCER_APP_NAME "rosegardensequencer"
+#define ROSEGARDEN_SEQUENCER_IFACE_NAME "RosegardenSequencerIface"
+
+#define ROSEGARDEN_GUI_APP_NAME "rosegarden"
+#define ROSEGARDEN_GUI_IFACE_NAME "RosegardenIface"
+
+
+// Sequencer communicates its state through this enum
+//
+typedef enum
+{
+ STOPPED,
+ PLAYING,
+ RECORDING,
+ STOPPING,
+ STARTING_TO_PLAY,
+ STARTING_TO_RECORD,
+ RECORDING_ARMED, // gui only state
+ QUIT
+} TransportStatus;
+
+
+#endif // _ROSEGARDEN_DCOP_H_
diff --git a/src/gui/application/RosegardenGUIApp.cpp b/src/gui/application/RosegardenGUIApp.cpp
new file mode 100644
index 0000000..608ad58
--- /dev/null
+++ b/src/gui/application/RosegardenGUIApp.cpp
@@ -0,0 +1,8073 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "RosegardenGUIApp.h"
+#include <kapplication.h>
+
+#include "gui/editors/segment/TrackEditor.h"
+#include "gui/editors/segment/TrackButtons.h"
+#include "misc/Debug.h"
+#include "misc/Strings.h"
+#include "gui/application/RosegardenDCOP.h"
+#include "base/AnalysisTypes.h"
+#include "base/AudioPluginInstance.h"
+#include "base/Clipboard.h"
+#include "base/Composition.h"
+#include "base/CompositionTimeSliceAdapter.h"
+#include "base/Configuration.h"
+#include "base/Device.h"
+#include "base/Exception.h"
+#include "base/Instrument.h"
+#include "base/MidiDevice.h"
+#include "base/MidiProgram.h"
+#include "base/NotationTypes.h"
+#include "base/Profiler.h"
+#include "base/RealTime.h"
+#include "base/Segment.h"
+#include "base/SegmentNotationHelper.h"
+#include "base/Selection.h"
+#include "base/Studio.h"
+#include "base/Track.h"
+#include "commands/edit/CopyCommand.h"
+#include "commands/edit/CutCommand.h"
+#include "commands/edit/EventQuantizeCommand.h"
+#include "commands/edit/PasteSegmentsCommand.h"
+#include "commands/edit/TransposeCommand.h"
+#include "commands/edit/AddMarkerCommand.h"
+#include "commands/edit/ModifyMarkerCommand.h"
+#include "commands/edit/RemoveMarkerCommand.h"
+#include "commands/notation/KeyInsertionCommand.h"
+#include "commands/segment/AddTempoChangeCommand.h"
+#include "commands/segment/AddTimeSignatureAndNormalizeCommand.h"
+#include "commands/segment/AddTimeSignatureCommand.h"
+#include "commands/segment/AudioSegmentAutoSplitCommand.h"
+#include "commands/segment/AudioSegmentRescaleCommand.h"
+#include "commands/segment/AudioSegmentSplitCommand.h"
+#include "commands/segment/ChangeCompositionLengthCommand.h"
+#include "commands/segment/CreateTempoMapFromSegmentCommand.h"
+#include "commands/segment/CutRangeCommand.h"
+#include "commands/segment/DeleteRangeCommand.h"
+#include "commands/segment/InsertRangeCommand.h"
+#include "commands/segment/ModifyDefaultTempoCommand.h"
+#include "commands/segment/MoveTracksCommand.h"
+#include "commands/segment/PasteRangeCommand.h"
+#include "commands/segment/RemoveTempoChangeCommand.h"
+#include "commands/segment/SegmentAutoSplitCommand.h"
+#include "commands/segment/SegmentChangeTransposeCommand.h"
+#include "commands/segment/SegmentJoinCommand.h"
+#include "commands/segment/SegmentLabelCommand.h"
+#include "commands/segment/SegmentReconfigureCommand.h"
+#include "commands/segment/SegmentRescaleCommand.h"
+#include "commands/segment/SegmentSplitByPitchCommand.h"
+#include "commands/segment/SegmentSplitByRecordingSrcCommand.h"
+#include "commands/segment/SegmentSplitCommand.h"
+#include "commands/segment/SegmentTransposeCommand.h"
+#include "commands/studio/CreateOrDeleteDeviceCommand.h"
+#include "commands/studio/ModifyDeviceCommand.h"
+#include "document/io/CsoundExporter.h"
+#include "document/io/HydrogenLoader.h"
+#include "document/io/LilyPondExporter.h"
+#include "document/MultiViewCommandHistory.h"
+#include "document/io/RG21Loader.h"
+#include "document/io/MupExporter.h"
+#include "document/io/MusicXmlExporter.h"
+#include "document/RosegardenGUIDoc.h"
+#include "document/ConfigGroups.h"
+#include "gui/application/RosegardenApplication.h"
+#include "gui/dialogs/AddTracksDialog.h"
+#include "gui/dialogs/AudioManagerDialog.h"
+#include "gui/dialogs/AudioPluginDialog.h"
+#include "gui/dialogs/AudioSplitDialog.h"
+#include "gui/dialogs/BeatsBarsDialog.h"
+#include "gui/dialogs/CompositionLengthDialog.h"
+#include "gui/dialogs/ConfigureDialog.h"
+#include "gui/dialogs/CountdownDialog.h"
+#include "gui/dialogs/DocumentConfigureDialog.h"
+#include "gui/dialogs/FileMergeDialog.h"
+#include "gui/dialogs/IdentifyTextCodecDialog.h"
+#include "gui/dialogs/IntervalDialog.h"
+#include "gui/dialogs/LilyPondOptionsDialog.h"
+#include "gui/dialogs/ManageMetronomeDialog.h"
+#include "gui/dialogs/QuantizeDialog.h"
+#include "gui/dialogs/RescaleDialog.h"
+#include "gui/dialogs/SplitByPitchDialog.h"
+#include "gui/dialogs/SplitByRecordingSrcDialog.h"
+#include "gui/dialogs/TempoDialog.h"
+#include "gui/dialogs/TimeDialog.h"
+#include "gui/dialogs/TimeSignatureDialog.h"
+#include "gui/dialogs/TransportDialog.h"
+#include "gui/editors/parameters/InstrumentParameterBox.h"
+#include "gui/editors/parameters/RosegardenParameterArea.h"
+#include "gui/editors/parameters/SegmentParameterBox.h"
+#include "gui/editors/parameters/TrackParameterBox.h"
+#include "gui/editors/segment/segmentcanvas/CompositionView.h"
+#include "gui/editors/segment/ControlEditorDialog.h"
+#include "gui/editors/segment/MarkerEditor.h"
+#include "gui/editors/segment/PlayListDialog.h"
+#include "gui/editors/segment/PlayList.h"
+#include "gui/editors/segment/segmentcanvas/SegmentEraser.h"
+#include "gui/editors/segment/segmentcanvas/SegmentJoiner.h"
+#include "gui/editors/segment/segmentcanvas/SegmentMover.h"
+#include "gui/editors/segment/segmentcanvas/SegmentPencil.h"
+#include "gui/editors/segment/segmentcanvas/SegmentResizer.h"
+#include "gui/editors/segment/segmentcanvas/SegmentSelector.h"
+#include "gui/editors/segment/segmentcanvas/SegmentSplitter.h"
+#include "gui/editors/segment/segmentcanvas/SegmentToolBox.h"
+#include "gui/editors/segment/TrackLabel.h"
+#include "gui/editors/segment/TriggerSegmentManager.h"
+#include "gui/editors/tempo/TempoView.h"
+#include "gui/general/EditViewBase.h"
+#include "gui/kdeext/KStartupLogo.h"
+#include "gui/kdeext/KTmpStatusMsg.h"
+#include "gui/seqmanager/MidiFilterDialog.h"
+#include "gui/seqmanager/SequenceManager.h"
+#include "gui/seqmanager/SequencerMapper.h"
+#include "gui/studio/AudioMixerWindow.h"
+#include "gui/studio/AudioPlugin.h"
+#include "gui/studio/AudioPluginManager.h"
+#include "gui/studio/AudioPluginOSCGUIManager.h"
+#include "gui/studio/BankEditorDialog.h"
+#include "gui/studio/DeviceManagerDialog.h"
+#include "gui/studio/MidiMixerWindow.h"
+#include "gui/studio/RemapInstrumentDialog.h"
+#include "gui/studio/StudioControl.h"
+#include "gui/studio/SynthPluginManagerDialog.h"
+#include "gui/widgets/CurrentProgressDialog.h"
+#include "gui/widgets/ProgressBar.h"
+#include "gui/widgets/ProgressDialog.h"
+#include "LircClient.h"
+#include "LircCommander.h"
+#include "RosegardenGUIView.h"
+#include "RosegardenIface.h"
+#include "SetWaitCursor.h"
+#include "sound/AudioFile.h"
+#include "sound/AudioFileManager.h"
+#include "sound/MappedCommon.h"
+#include "sound/MappedComposition.h"
+#include "sound/MappedEvent.h"
+#include "sound/MappedStudio.h"
+#include "sound/MidiFile.h"
+#include "sound/PluginIdentifier.h"
+#include "sound/SoundDriver.h"
+#include "StartupTester.h"
+#include <dcopclient.h>
+#include <dcopobject.h>
+#include <dcopref.h>
+#include <kaction.h>
+#include <kconfig.h>
+#include <kdcopactionproxy.h>
+#include <kdockwidget.h>
+#include <kedittoolbar.h>
+#include <kfiledialog.h>
+#include <kglobal.h>
+#include <kinputdialog.h>
+#include <kio/netaccess.h>
+#include <kkeydialog.h>
+#include <klocale.h>
+#include <kmainwindow.h>
+#include <kmessagebox.h>
+#include <kmimetype.h>
+#include <kprocess.h>
+#include <kstatusbar.h>
+#include <kstdaccel.h>
+#include <kstdaction.h>
+#include <kstddirs.h>
+#include <ktempfile.h>
+#include <ktip.h>
+#include <ktoolbar.h>
+#include <kurl.h>
+#include <kxmlguiclient.h>
+#include <qaccel.h>
+#include <qcanvas.h>
+#include <qcstring.h>
+#include <qcursor.h>
+#include <qdatastream.h>
+#include <qdialog.h>
+#include <qdir.h>
+#include <qfile.h>
+#include <qfileinfo.h>
+#include <qiconset.h>
+#include <qinputdialog.h>
+#include <qlabel.h>
+#include <qobject.h>
+#include <qobjectlist.h>
+#include <qpixmap.h>
+#include <qpopupmenu.h>
+#include <qpushbutton.h>
+#include <qregexp.h>
+#include <qslider.h>
+#include <qstring.h>
+#include <qstringlist.h>
+#include <qtextcodec.h>
+#include <qtimer.h>
+#include <qvaluevector.h>
+#include <qwidget.h>
+
+#ifdef HAVE_LIBJACK
+#include <jack/jack.h>
+#endif
+
+
+namespace Rosegarden
+{
+
+RosegardenGUIApp::RosegardenGUIApp(bool useSequencer,
+ bool useExistingSequencer,
+ QObject *startupStatusMessageReceiver)
+ : DCOPObject("RosegardenIface"), RosegardenIface(this), KDockMainWindow(0),
+ m_actionsSetup(false),
+ m_fileRecent(0),
+ m_view(0),
+ m_swapView(0),
+ m_mainDockWidget(0),
+ m_dockLeft(0),
+ m_doc(0),
+ m_sequencerProcess(0),
+ m_sequencerCheckedIn(false),
+#ifdef HAVE_LIBJACK
+ m_jackProcess(0),
+#endif
+ m_zoomSlider(0),
+ m_seqManager(0),
+ m_transport(0),
+ m_audioManagerDialog(0),
+ m_originatingJump(false),
+ m_storedLoopStart(0),
+ m_storedLoopEnd(0),
+ m_useSequencer(useSequencer),
+ m_dockVisible(true),
+ m_autoSaveTimer(new QTimer(this)),
+ m_clipboard(new Clipboard),
+ m_playList(0),
+ m_deviceManager(0),
+ m_synthManager(0),
+ m_audioMixer(0),
+ m_midiMixer(0),
+ m_bankEditor(0),
+ m_markerEditor(0),
+ m_tempoView(0),
+ m_triggerSegmentManager(0),
+#ifdef HAVE_LIBLO
+ m_pluginGUIManager(new AudioPluginOSCGUIManager(this)),
+#endif
+ m_playTimer(new QTimer(this)),
+ m_stopTimer(new QTimer(this)),
+ m_startupTester(0),
+#ifdef HAVE_LIRC
+ m_lircClient(0),
+ m_lircCommander(0),
+#endif
+ m_haveAudioImporter(false),
+ m_firstRun(false),
+ m_parameterArea(0)
+{
+ m_myself = this;
+
+
+ if (startupStatusMessageReceiver) {
+ QObject::connect(this, SIGNAL(startupStatusMessage(QString)),
+ startupStatusMessageReceiver,
+ SLOT(slotShowStatusMessage(QString)));
+ }
+
+ // Try to start the sequencer
+ //
+ if (m_useSequencer) {
+
+#ifdef HAVE_LIBJACK
+#define OFFER_JACK_START_OPTION 1
+#ifdef OFFER_JACK_START_OPTION
+ // First we check if jackd is running allready
+
+ std::string jackClientName = "rosegarden";
+
+ // attempt connection to JACK server
+ //
+ jack_client_t* testJackClient;
+ testJackClient = jack_client_new(jackClientName.c_str());
+ if (testJackClient == 0 ) {
+
+ // If no connection to JACK
+ // try to launch JACK - if the configuration wants us to.
+ if (!launchJack()) {
+ KStartupLogo::hideIfStillThere();
+ KMessageBox::error(this, i18n("Attempted to launch JACK audio daemon failed. Audio will be disabled.\nPlease check configuration (Settings -> Configure Rosegarden -> Audio -> Startup)\n and restart."));
+ }
+ } else {
+ //this client was just for testing
+ jack_client_close(testJackClient);
+ }
+#endif // OFFER_JACK_START_OPTION
+#endif // HAVE_LIBJACK
+
+ emit startupStatusMessage(i18n("Starting sequencer..."));
+ launchSequencer(useExistingSequencer);
+
+ } else
+ RG_DEBUG << "RosegardenGUIApp : don't use sequencer\n";
+
+ // Plugin manager
+ //
+ emit startupStatusMessage(i18n("Initializing plugin manager..."));
+ m_pluginManager = new AudioPluginManager();
+
+ // call inits to invoke all other construction parts
+ //
+ emit startupStatusMessage(i18n("Initializing view..."));
+ initStatusBar();
+ setupActions();
+ iFaceDelayedInit(this);
+ initZoomToolbar();
+
+ QPixmap dummyPixmap; // any icon will do
+ m_mainDockWidget = createDockWidget("Rosegarden MainDockWidget", dummyPixmap, 0L, "main_dock_widget");
+ // allow others to dock to the left and right sides only
+ m_mainDockWidget->setDockSite(KDockWidget::DockLeft | KDockWidget::DockRight);
+ // forbit docking abilities of m_mainDockWidget itself
+ m_mainDockWidget->setEnableDocking(KDockWidget::DockNone);
+ setView(m_mainDockWidget); // central widget in a KDE mainwindow
+ setMainDockWidget(m_mainDockWidget); // master dockwidget
+
+ m_dockLeft = createDockWidget("params dock", dummyPixmap, 0L,
+ i18n("Special Parameters"));
+ m_dockLeft->manualDock(m_mainDockWidget, // dock target
+ KDockWidget::DockLeft, // dock site
+ 20); // relation target/this (in percent)
+
+ connect(m_dockLeft, SIGNAL(iMBeingClosed()),
+ this, SLOT(slotParametersClosed()));
+ connect(m_dockLeft, SIGNAL(hasUndocked()),
+ this, SLOT(slotParametersClosed()));
+ // Apparently, hasUndocked() is emitted when the dock widget's
+ // 'close' button on the dock handle is clicked.
+ connect(m_mainDockWidget, SIGNAL(docking(KDockWidget*, KDockWidget::DockPosition)),
+ this, SLOT(slotParametersDockedBack(KDockWidget*, KDockWidget::DockPosition)));
+
+ stateChanged("parametersbox_closed", KXMLGUIClient::StateReverse);
+
+ RosegardenGUIDoc* doc = new RosegardenGUIDoc(this, m_pluginManager);
+
+ m_parameterArea = new RosegardenParameterArea(m_dockLeft);
+ m_dockLeft->setWidget(m_parameterArea);
+
+ // Populate the parameter-box area with the respective
+ // parameter box widgets.
+
+ m_segmentParameterBox = new SegmentParameterBox(doc, m_parameterArea);
+ m_parameterArea->addRosegardenParameterBox(m_segmentParameterBox);
+ m_trackParameterBox = new TrackParameterBox(doc, m_parameterArea);
+ m_parameterArea->addRosegardenParameterBox(m_trackParameterBox);
+ m_instrumentParameterBox = new InstrumentParameterBox(doc, m_parameterArea);
+ m_parameterArea->addRosegardenParameterBox(m_instrumentParameterBox);
+
+ // Lookup the configuration parameter that specifies the default
+ // arrangement, and instantiate it.
+
+ kapp->config()->setGroup(GeneralOptionsConfigGroup);
+ m_parameterArea->setArrangement((RosegardenParameterArea::Arrangement)
+ kapp->config()->readUnsignedNumEntry("sidebarstyle",
+ RosegardenParameterArea::CLASSIC_STYLE));
+
+ m_dockLeft->update();
+
+ connect(m_instrumentParameterBox,
+ SIGNAL(selectPlugin(QWidget *, InstrumentId, int)),
+ this,
+ SLOT(slotShowPluginDialog(QWidget *, InstrumentId, int)));
+
+ connect(m_instrumentParameterBox,
+ SIGNAL(showPluginGUI(InstrumentId, int)),
+ this,
+ SLOT(slotShowPluginGUI(InstrumentId, int)));
+
+ // relay this through our own signal so that others can use it too
+ connect(m_instrumentParameterBox,
+ SIGNAL(instrumentParametersChanged(InstrumentId)),
+ this,
+ SIGNAL(instrumentParametersChanged(InstrumentId)));
+
+ connect(this,
+ SIGNAL(instrumentParametersChanged(InstrumentId)),
+ m_instrumentParameterBox,
+ SLOT(slotInstrumentParametersChanged(InstrumentId)));
+
+ connect(this,
+ SIGNAL(pluginSelected(InstrumentId, int, int)),
+ m_instrumentParameterBox,
+ SLOT(slotPluginSelected(InstrumentId, int, int)));
+
+ connect(this,
+ SIGNAL(pluginBypassed(InstrumentId, int, bool)),
+ m_instrumentParameterBox,
+ SLOT(slotPluginBypassed(InstrumentId, int, bool)));
+
+ // Load the initial document (this includes doc's own autoload)
+ //
+ setDocument(doc);
+
+ emit startupStatusMessage(i18n("Starting sequence manager..."));
+
+ // transport is created by setupActions()
+ m_seqManager = new SequenceManager(m_doc, getTransport());
+
+ if (m_useSequencer) {
+ // Check the sound driver status and warn the user of any
+ // problems. This warning has to happen early, in case it
+ // affects the ability to load plugins etc from a file on the
+ // command line.
+ m_seqManager->checkSoundDriverStatus(true);
+ }
+
+ if (m_view) {
+ connect(m_seqManager, SIGNAL(controllerDeviceEventReceived(MappedEvent *)),
+ m_view, SLOT(slotControllerDeviceEventReceived(MappedEvent *)));
+ }
+
+ if (m_seqManager->getSoundDriverStatus() & AUDIO_OK) {
+ slotStateChanged("got_audio", true);
+ } else {
+ slotStateChanged("got_audio", false);
+ }
+
+ // If we're restarting the gui then make sure any transient
+ // studio objects are cleared away.
+ emit startupStatusMessage(i18n("Clearing studio data..."));
+ m_seqManager->reinitialiseSequencerStudio();
+
+ // Send the transport control statuses for MMC and JACK
+ //
+ m_seqManager->sendTransportControlStatuses();
+
+ // Now autoload
+ //
+ stateChanged("new_file");
+ stateChanged("have_segments", KXMLGUIClient::StateReverse);
+ stateChanged("have_selection", KXMLGUIClient::StateReverse);
+ slotTestClipboard();
+
+ // Check for lack of MIDI devices and disable Studio options accordingly
+ //
+ if (!m_doc->getStudio().haveMidiDevices())
+ stateChanged("got_midi_devices", KXMLGUIClient::StateReverse);
+
+ emit startupStatusMessage(i18n("Starting..."));
+
+ setupFileDialogSpeedbar();
+ readOptions();
+
+ // All toolbars should be created before this is called
+ setAutoSaveSettings(MainWindowConfigGroup, true);
+
+#ifdef HAVE_LIRC
+
+ try {
+ m_lircClient = new LircClient();
+ } catch (Exception e) {
+ RG_DEBUG << e.getMessage().c_str() << endl;
+ // continue without
+ m_lircClient = 0;
+ }
+ if (m_lircClient) {
+ m_lircCommander = new LircCommander(m_lircClient, this);
+ }
+#endif
+
+ stateChanged("have_project_packager", KXMLGUIClient::StateReverse);
+ stateChanged("have_lilypondview", KXMLGUIClient::StateReverse);
+ QTimer::singleShot(1000, this, SLOT(slotTestStartupTester()));
+}
+
+RosegardenGUIApp::~RosegardenGUIApp()
+{
+ RG_DEBUG << "~RosegardenGUIApp()\n";
+
+ if (getView() &&
+ getView()->getTrackEditor() &&
+ getView()->getTrackEditor()->getSegmentCanvas()) {
+ getView()->getTrackEditor()->getSegmentCanvas()->endAudioPreviewGeneration();
+ }
+
+#ifdef HAVE_LIBLO
+ delete m_pluginGUIManager;
+#endif
+
+ if (isSequencerRunning() && !isSequencerExternal()) {
+ m_sequencerProcess->blockSignals(true);
+ rgapp->sequencerSend("quit()");
+ usleep(300000);
+ delete m_sequencerProcess;
+ }
+
+ delete m_jumpToQuickMarkerAction;
+ delete m_setQuickMarkerAction;
+
+ delete m_transport;
+
+ delete m_seqManager;
+
+#ifdef HAVE_LIRC
+
+ delete m_lircCommander;
+ delete m_lircClient;
+#endif
+
+ delete m_doc;
+ Profiles::getInstance()->dump();
+}
+
+void RosegardenGUIApp::setupActions()
+{
+ // setup File menu
+ // New Window ?
+ KStdAction::openNew (this, SLOT(slotFileNew()), actionCollection());
+ KStdAction::open (this, SLOT(slotFileOpen()), actionCollection());
+ m_fileRecent = KStdAction::openRecent(this,
+ SLOT(slotFileOpenRecent(const KURL&)),
+ actionCollection());
+ KStdAction::save (this, SLOT(slotFileSave()), actionCollection());
+ KStdAction::saveAs(this, SLOT(slotFileSaveAs()), actionCollection());
+ KStdAction::revert(this, SLOT(slotRevertToSaved()), actionCollection());
+ KStdAction::close (this, SLOT(slotFileClose()), actionCollection());
+ KStdAction::print (this, SLOT(slotFilePrint()), actionCollection());
+ KStdAction::printPreview (this, SLOT(slotFilePrintPreview()), actionCollection());
+
+ new KAction(i18n("Import Rosegarden &Project file..."), 0, 0, this,
+ SLOT(slotImportProject()), actionCollection(),
+ "file_import_project");
+
+ new KAction(i18n("Import &MIDI file..."), 0, 0, this,
+ SLOT(slotImportMIDI()), actionCollection(),
+ "file_import_midi");
+
+ new KAction(i18n("Import &Rosegarden 2.1 file..."), 0, 0, this,
+ SLOT(slotImportRG21()), actionCollection(),
+ "file_import_rg21");
+
+ new KAction(i18n("Import &Hydrogen file..."), 0, 0, this,
+ SLOT(slotImportHydrogen()), actionCollection(),
+ "file_import_hydrogen");
+
+ new KAction(i18n("Merge &File..."), 0, 0, this,
+ SLOT(slotMerge()), actionCollection(),
+ "file_merge");
+
+ new KAction(i18n("Merge &MIDI file..."), 0, 0, this,
+ SLOT(slotMergeMIDI()), actionCollection(),
+ "file_merge_midi");
+
+ new KAction(i18n("Merge &Rosegarden 2.1 file..."), 0, 0, this,
+ SLOT(slotMergeRG21()), actionCollection(),
+ "file_merge_rg21");
+
+ new KAction(i18n("Merge &Hydrogen file..."), 0, 0, this,
+ SLOT(slotMergeHydrogen()), actionCollection(),
+ "file_merge_hydrogen");
+
+ new KAction(i18n("Export Rosegarden &Project file..."), 0, 0, this,
+ SLOT(slotExportProject()), actionCollection(),
+ "file_export_project");
+
+ new KAction(i18n("Export &MIDI file..."), 0, 0, this,
+ SLOT(slotExportMIDI()), actionCollection(),
+ "file_export_midi");
+
+ new KAction(i18n("Export &LilyPond file..."), 0, 0, this,
+ SLOT(slotExportLilyPond()), actionCollection(),
+ "file_export_lilypond");
+
+ new KAction(i18n("Export Music&XML file..."), 0, 0, this,
+ SLOT(slotExportMusicXml()), actionCollection(),
+ "file_export_musicxml");
+
+ new KAction(i18n("Export &Csound score file..."), 0, 0, this,
+ SLOT(slotExportCsound()), actionCollection(),
+ "file_export_csound");
+
+ new KAction(i18n("Export M&up file..."), 0, 0, this,
+ SLOT(slotExportMup()), actionCollection(),
+ "file_export_mup");
+
+ new KAction(i18n("Print &with LilyPond..."), 0, 0, this,
+ SLOT(slotPrintLilyPond()), actionCollection(),
+ "file_print_lilypond");
+
+ new KAction(i18n("Preview with Lil&yPond..."), 0, 0, this,
+ SLOT(slotPreviewLilyPond()), actionCollection(),
+ "file_preview_lilypond");
+
+ new KAction(i18n("Play&list"), 0, 0, this,
+ SLOT(slotPlayList()), actionCollection(),
+ "file_show_playlist");
+
+ KStdAction::quit (this, SLOT(slotQuit()), actionCollection());
+
+ // help menu
+ new KAction(i18n("Rosegarden &Tutorial"), 0, 0, this,
+ SLOT(slotTutorial()), actionCollection(),
+ "tutorial");
+
+ new KAction(i18n("&Bug Reporting Guidelines"), 0, 0, this,
+ SLOT(slotBugGuidelines()), actionCollection(),
+ "guidelines");
+
+ // setup edit menu
+ KStdAction::cut (this, SLOT(slotEditCut()), actionCollection());
+ KStdAction::copy (this, SLOT(slotEditCopy()), actionCollection());
+ KStdAction::paste (this, SLOT(slotEditPaste()), actionCollection());
+
+ //
+ // undo/redo actions are special in that they are connected to
+ // slots later on, when the current document is set up - see
+ // MultiViewCommandHistory::attachView
+ //
+ new KToolBarPopupAction(i18n("Und&o"),
+ "undo",
+ KStdAccel::shortcut(KStdAccel::Undo),
+ actionCollection(),
+ KStdAction::stdName(KStdAction::Undo));
+
+ new KToolBarPopupAction(i18n("Re&do"),
+ "redo",
+ KStdAccel::shortcut(KStdAccel::Redo),
+ actionCollection(),
+ KStdAction::stdName(KStdAction::Redo));
+ /////
+
+
+
+ // setup Settings menu
+ //
+ m_viewToolBar = KStdAction::showToolbar (this, SLOT(slotToggleToolBar()), actionCollection(),
+ "show_stock_toolbar");
+
+ m_viewToolsToolBar = new KToggleAction(i18n("Show T&ools Toolbar"), 0, this,
+ SLOT(slotToggleToolsToolBar()), actionCollection(),
+ "show_tools_toolbar");
+
+ m_viewTracksToolBar = new KToggleAction(i18n("Show Trac&ks Toolbar"), 0, this,
+ SLOT(slotToggleTracksToolBar()), actionCollection(),
+ "show_tracks_toolbar");
+
+ m_viewEditorsToolBar = new KToggleAction(i18n("Show &Editors Toolbar"), 0, this,
+ SLOT(slotToggleEditorsToolBar()), actionCollection(),
+ "show_editors_toolbar");
+
+ m_viewTransportToolBar = new KToggleAction(i18n("Show Trans&port Toolbar"), 0, this,
+ SLOT(slotToggleTransportToolBar()), actionCollection(),
+ "show_transport_toolbar");
+
+ m_viewZoomToolBar = new KToggleAction(i18n("Show &Zoom Toolbar"), 0, this,
+ SLOT(slotToggleZoomToolBar()), actionCollection(),
+ "show_zoom_toolbar");
+
+ m_viewStatusBar = KStdAction::showStatusbar(this, SLOT(slotToggleStatusBar()),
+ actionCollection(), "show_status_bar");
+
+ m_viewTransport = new KToggleAction(i18n("Show Tra&nsport"), Key_T, this,
+ SLOT(slotToggleTransport()),
+ actionCollection(),
+ "show_transport");
+
+ m_viewTrackLabels = new KToggleAction(i18n("Show Track &Labels"), 0, this,
+ SLOT(slotToggleTrackLabels()),
+ actionCollection(),
+ "show_tracklabels");
+
+ m_viewRulers = new KToggleAction(i18n("Show Playback Position R&uler"), 0, this,
+ SLOT(slotToggleRulers()),
+ actionCollection(),
+ "show_rulers");
+
+ m_viewTempoRuler = new KToggleAction(i18n("Show Te&mpo Ruler"), 0, this,
+ SLOT(slotToggleTempoRuler()),
+ actionCollection(),
+ "show_tempo_ruler");
+
+ m_viewChordNameRuler = new KToggleAction(i18n("Show Cho&rd Name Ruler"), 0, this,
+ SLOT(slotToggleChordNameRuler()),
+ actionCollection(),
+ "show_chord_name_ruler");
+
+
+ m_viewPreviews = new KToggleAction(i18n("Show Segment Pre&views"), 0, this,
+ SLOT(slotTogglePreviews()),
+ actionCollection(),
+ "show_previews");
+
+ new KAction(i18n("Show Special &Parameters"), Key_P, this,
+ SLOT(slotDockParametersBack()),
+ actionCollection(),
+ "show_inst_segment_parameters");
+
+ KStdAction::tipOfDay( this, SLOT( slotShowTip() ), actionCollection() );
+
+ // Standard Actions
+ //
+ KStdAction::saveOptions(this,
+ SLOT(slotSaveOptions()),
+ actionCollection());
+
+ KStdAction::preferences(this,
+ SLOT(slotConfigure()),
+ actionCollection());
+
+ KStdAction::keyBindings(this,
+ SLOT(slotEditKeys()),
+ actionCollection());
+
+ KStdAction::configureToolbars(this,
+ SLOT(slotEditToolbars()),
+ actionCollection());
+
+ KRadioAction *action = 0;
+
+ // Create the select icon
+ //
+ QString pixmapDir = KGlobal::dirs()->findResource("appdata", "pixmaps/");
+ QCanvasPixmap pixmap(pixmapDir + "/toolbar/select.xpm");
+ QIconSet icon = QIconSet(pixmap);
+
+ // TODO : add some shortcuts here
+ action = new KRadioAction(i18n("&Select and Edit"), icon, Key_F2,
+ this, SLOT(slotPointerSelected()),
+ actionCollection(), "select");
+ action->setExclusiveGroup("segmenttools");
+
+ action = new KRadioAction(i18n("&Draw"), "pencil", Key_F3,
+ this, SLOT(slotDrawSelected()),
+ actionCollection(), "draw");
+ action->setExclusiveGroup("segmenttools");
+
+ action = new KRadioAction(i18n("&Erase"), "eraser", Key_F4,
+ this, SLOT(slotEraseSelected()),
+ actionCollection(), "erase");
+ action->setExclusiveGroup("segmenttools");
+
+ action = new KRadioAction(i18n("&Move"), "move", Key_F5,
+ this, SLOT(slotMoveSelected()),
+ actionCollection(), "move");
+ action->setExclusiveGroup("segmenttools");
+
+ pixmap.load(pixmapDir + "/toolbar/resize.xpm");
+ icon = QIconSet(pixmap);
+ action = new KRadioAction(i18n("&Resize"), icon, Key_F6,
+ this, SLOT(slotResizeSelected()),
+ actionCollection(), "resize");
+ action->setExclusiveGroup("segmenttools");
+
+ pixmap.load(pixmapDir + "/toolbar/split.xpm");
+ icon = QIconSet(pixmap);
+ action = new KRadioAction(i18n("&Split"), icon, Key_F7,
+ this, SLOT(slotSplitSelected()),
+ actionCollection(), "split");
+ action->setExclusiveGroup("segmenttools");
+
+ pixmap.load(pixmapDir + "/toolbar/join.xpm");
+ icon = QIconSet(pixmap);
+ action = new KRadioAction(i18n("&Join"), icon, 0,
+ this, SLOT(slotJoinSelected()),
+ actionCollection(), "join");
+ action->setExclusiveGroup("segmenttools");
+
+
+ new KAction(i18n("&Harmonize"), 0, this,
+ SLOT(slotHarmonizeSelection()), actionCollection(),
+ "harmonize_selection");
+
+ pixmap.load(pixmapDir + "/toolbar/event-insert-timesig.png");
+ icon = QIconSet(pixmap);
+ new KAction(AddTimeSignatureCommand::getGlobalName(),
+ icon, 0,
+ this, SLOT(slotEditTimeSignature()),
+ actionCollection(), "add_time_signature");
+
+ new KAction(i18n("Open Tempo and Time Signature Editor"), 0, this,
+ SLOT(slotEditTempos()), actionCollection(), "edit_tempos");
+
+ //
+ // Edit menu
+ //
+ new KAction(i18n("Cut Range"), Key_X + CTRL + SHIFT, this,
+ SLOT(slotCutRange()), actionCollection(),
+ "cut_range");
+
+ new KAction(i18n("Copy Range"), Key_C + CTRL + SHIFT, this,
+ SLOT(slotCopyRange()), actionCollection(),
+ "copy_range");
+
+ new KAction(i18n("Paste Range"), Key_V + CTRL + SHIFT, this,
+ SLOT(slotPasteRange()), actionCollection(),
+ "paste_range");
+/*
+ new KAction(i18n("Delete Range"), Key_Delete + SHIFT, this,
+ SLOT(slotDeleteRange()), actionCollection(),
+ "delete_range");
+*/
+ new KAction(i18n("Insert Range..."), Key_Insert + SHIFT, this,
+ SLOT(slotInsertRange()), actionCollection(),
+ "insert_range");
+
+ new KAction(i18n("De&lete"), Key_Delete, this,
+ SLOT(slotDeleteSelectedSegments()), actionCollection(),
+ "delete");
+
+ new KAction(i18n("Select &All Segments"), Key_A + CTRL, this,
+ SLOT(slotSelectAll()), actionCollection(),
+ "select_all");
+
+ pixmap.load(pixmapDir + "/toolbar/event-insert-tempo.png");
+ icon = QIconSet(pixmap);
+ new KAction(AddTempoChangeCommand::getGlobalName(),
+ icon, 0,
+ this, SLOT(slotEditTempo()),
+ actionCollection(), "add_tempo");
+
+ new KAction(ChangeCompositionLengthCommand::getGlobalName(),
+ 0,
+ this, SLOT(slotChangeCompositionLength()),
+ actionCollection(), "change_composition_length");
+
+ new KAction(i18n("Edit Mar&kers..."), Key_K + CTRL, this,
+ SLOT(slotEditMarkers()),
+ actionCollection(), "edit_markers");
+
+ new KAction(i18n("Edit Document P&roperties..."), 0, this,
+ SLOT(slotEditDocumentProperties()),
+ actionCollection(), "edit_doc_properties");
+
+
+ //
+ // Segments menu
+ //
+ new KAction(i18n("Open in &Default Editor"), Key_Return, this,
+ SLOT(slotEdit()), actionCollection(),
+ "edit_default");
+
+ pixmap.load(pixmapDir + "/toolbar/matrix.png");
+ icon = QIconSet(pixmap);
+ new KAction(i18n("Open in Matri&x Editor"), icon, Key_M, this,
+ SLOT(slotEditInMatrix()), actionCollection(),
+ "edit_matrix");
+
+ pixmap.load(pixmapDir + "/toolbar/matrix-percussion.png");
+ icon = QIconSet(pixmap);
+ new KAction(i18n("Open in &Percussion Matrix Editor"), icon, Key_D, this,
+ SLOT(slotEditInPercussionMatrix()), actionCollection(),
+ "edit_percussion_matrix");
+
+ pixmap.load(pixmapDir + "/toolbar/notation.png");
+ icon = QIconSet(pixmap);
+ new KAction(i18n("Open in &Notation Editor"), icon, Key_N, this,
+ SLOT(slotEditAsNotation()), actionCollection(),
+ "edit_notation");
+
+ pixmap.load(pixmapDir + "/toolbar/eventlist.png");
+ icon = QIconSet(pixmap);
+ new KAction(i18n("Open in &Event List Editor"), icon, Key_E, this,
+ SLOT(slotEditInEventList()), actionCollection(),
+ "edit_event_list");
+
+ pixmap.load(pixmapDir + "/toolbar/quantize.png");
+ icon = QIconSet(pixmap);
+ new KAction(i18n("&Quantize..."), icon, Key_Equal, this,
+ SLOT(slotQuantizeSelection()), actionCollection(),
+ "quantize_selection");
+
+ new KAction(SegmentLabelCommand::getGlobalName(),
+ 0,
+ this, SLOT(slotRelabelSegments()),
+ actionCollection(), "relabel_segment");
+
+ new KAction(SegmentTransposeCommand::getGlobalName(),
+ 0,
+ this, SLOT(slotTransposeSegments()),
+ actionCollection(), "transpose");
+
+ new KAction(i18n("Repeat Last Quantize"), Key_Plus, this,
+ SLOT(slotRepeatQuantizeSelection()), actionCollection(),
+ "repeat_quantize");
+
+ new KAction(SegmentRescaleCommand::getGlobalName(), 0, this,
+ SLOT(slotRescaleSelection()), actionCollection(),
+ "rescale");
+
+ new KAction(SegmentAutoSplitCommand::getGlobalName(), 0, this,
+ SLOT(slotAutoSplitSelection()), actionCollection(),
+ "auto_split");
+
+ new KAction(SegmentSplitByPitchCommand::getGlobalName(), 0, this,
+ SLOT(slotSplitSelectionByPitch()), actionCollection(),
+ "split_by_pitch");
+
+ new KAction(SegmentSplitByRecordingSrcCommand::getGlobalName(), 0, this,
+ SLOT(slotSplitSelectionByRecordedSrc()), actionCollection(),
+ "split_by_recording");
+
+ new KAction(i18n("Split at Time..."), 0, this,
+ SLOT(slotSplitSelectionAtTime()), actionCollection(),
+ "split_at_time");
+
+ new KAction(i18n("Jog &Left"), Key_Left + ALT, this,
+ SLOT(slotJogLeft()), actionCollection(),
+ "jog_left");
+
+ new KAction(i18n("Jog &Right"), Key_Right + ALT, this,
+ SLOT(slotJogRight()), actionCollection(),
+ "jog_right");
+
+ new KAction(i18n("Set Start Time..."), 0, this,
+ SLOT(slotSetSegmentStartTimes()), actionCollection(),
+ "set_segment_start");
+
+ new KAction(i18n("Set Duration..."), 0, this,
+ SLOT(slotSetSegmentDurations()), actionCollection(),
+ "set_segment_duration");
+
+ new KAction(SegmentJoinCommand::getGlobalName(),
+ Key_J + CTRL,
+ this, SLOT(slotJoinSegments()),
+ actionCollection(), "join_segments");
+
+ new KAction(i18n("Turn Re&peats into Copies"),
+ 0,
+ this, SLOT(slotRepeatingSegments()),
+ actionCollection(), "repeats_to_real_copies");
+
+ new KAction(i18n("Manage Tri&ggered Segments"), 0,
+ this, SLOT(slotManageTriggerSegments()),
+ actionCollection(), "manage_trigger_segments");
+
+ new KAction(i18n("Set Tempos from &Beat Segment"), 0, this,
+ SLOT(slotGrooveQuantize()), actionCollection(),
+ "groove_quantize");
+
+ new KAction(i18n("Set &Tempo to Audio Segment Duration"), 0, this,
+ SLOT(slotTempoToSegmentLength()), actionCollection(),
+ "set_tempo_to_segment_length");
+
+ pixmap.load(pixmapDir + "/toolbar/manage-audio-segments.xpm");
+ icon = QIconSet(pixmap);
+ new KAction(i18n("Manage A&udio Files"), icon,
+ Key_U + CTRL,
+ this, SLOT(slotAudioManager()),
+ actionCollection(), "audio_manager");
+
+ m_viewSegmentLabels = new KToggleAction(i18n("Show Segment Labels"), 0, this,
+ SLOT(slotToggleSegmentLabels()), actionCollection(),
+ "show_segment_labels");
+
+ //
+ // Tracks menu
+ //
+ pixmap.load(pixmapDir + "/toolbar/add_tracks.png");
+ icon = QIconSet(pixmap);
+ new KAction(i18n("Add &Track"), icon, CTRL + Key_T,
+ this, SLOT(slotAddTrack()),
+ actionCollection(), "add_track");
+
+ new KAction(i18n("&Add Tracks..."), 0,
+ this, SLOT(slotAddTracks()),
+ actionCollection(), "add_tracks");
+
+ pixmap.load(pixmapDir + "/toolbar/delete_track.png");
+ icon = QIconSet(pixmap);
+ new KAction(i18n("D&elete Track"), icon, CTRL + Key_D,
+ this, SLOT(slotDeleteTrack()),
+ actionCollection(), "delete_track");
+
+ pixmap.load(pixmapDir + "/toolbar/move_track_down.png");
+ icon = QIconSet(pixmap);
+ new KAction(i18n("Move Track &Down"), icon, SHIFT + Key_Down,
+ this, SLOT(slotMoveTrackDown()),
+ actionCollection(), "move_track_down");
+
+ pixmap.load(pixmapDir + "/toolbar/move_track_up.png");
+ icon = QIconSet(pixmap);
+ new KAction(i18n("Move Track &Up"), icon, SHIFT + Key_Up,
+ this, SLOT(slotMoveTrackUp()),
+ actionCollection(), "move_track_up");
+
+ new KAction(i18n("Select &Next Track"),
+ Key_Down,
+ this, SLOT(slotTrackDown()),
+ actionCollection(), "select_next_track");
+
+ new KAction(i18n("Select &Previous Track"),
+ Key_Up,
+ this, SLOT(slotTrackUp()),
+ actionCollection(), "select_previous_track");
+
+ new KAction(i18n("Mute or Unmute Track"),
+ Key_U,
+ this, SLOT(slotToggleMutedCurrentTrack()),
+ actionCollection(), "toggle_mute_track");
+
+ new KAction(i18n("Arm or Un-arm Track for Record"),
+ Key_R,
+ this, SLOT(slotToggleRecordCurrentTrack()),
+ actionCollection(), "toggle_arm_track");
+
+ pixmap.load(pixmapDir + "/toolbar/mute-all.png");
+ icon = QIconSet(pixmap);
+ new KAction(i18n("&Mute all Tracks"), icon, 0,
+ this, SLOT(slotMuteAllTracks()),
+ actionCollection(), "mute_all_tracks");
+
+ pixmap.load(pixmapDir + "/toolbar/un-mute-all.png");
+ icon = QIconSet(pixmap);
+ new KAction(i18n("&Unmute all Tracks"), icon, 0,
+ this, SLOT(slotUnmuteAllTracks()),
+ actionCollection(), "unmute_all_tracks");
+
+ new KAction(i18n("&Remap Instruments..."), 0, this,
+ SLOT(slotRemapInstruments()),
+ actionCollection(), "remap_instruments");
+
+ //
+ // Studio menu
+ //
+ pixmap.load(pixmapDir + "/toolbar/mixer.png");
+ icon = QIconSet(pixmap);
+ new KAction(i18n("&Audio Mixer"), icon, 0, this,
+ SLOT(slotOpenAudioMixer()),
+ actionCollection(), "audio_mixer");
+
+ pixmap.load(pixmapDir + "/toolbar/midimixer.png");
+ icon = QIconSet(pixmap);
+ new KAction(i18n("Midi Mi&xer"), icon, 0, this,
+ SLOT(slotOpenMidiMixer()),
+ actionCollection(), "midi_mixer");
+
+ pixmap.load(pixmapDir + "/toolbar/manage-midi-devices.xpm");
+ icon = QIconSet(pixmap);
+ new KAction(i18n("Manage MIDI &Devices"), icon, 0, this,
+ SLOT(slotManageMIDIDevices()),
+ actionCollection(), "manage_devices");
+
+ pixmap.load(pixmapDir + "/toolbar/manage-synth-plugins.png");
+ icon = QIconSet(pixmap);
+ new KAction(i18n("Manage S&ynth Plugins"), icon, 0, this,
+ SLOT(slotManageSynths()),
+ actionCollection(), "manage_synths");
+
+ new KAction(i18n("Modify MIDI &Filters"), "filter", 0, this,
+ SLOT(slotModifyMIDIFilters()),
+ actionCollection(), "modify_midi_filters");
+
+ m_enableMIDIrouting = new KToggleAction(i18n("MIDI Thru Routing"), 0, this,
+ SLOT(slotEnableMIDIThruRouting()),
+ actionCollection(), "enable_midi_routing");
+
+ pixmap.load(pixmapDir + "/toolbar/time-musical.png");
+ icon = QIconSet(pixmap);
+ new KAction(i18n("Manage &Metronome"), 0, this,
+ SLOT(slotManageMetronome()),
+ actionCollection(), "manage_metronome");
+
+ new KAction(i18n("&Save Current Document as Default Studio"), 0, this,
+ SLOT(slotSaveDefaultStudio()),
+ actionCollection(), "save_default_studio");
+
+ new KAction(i18n("&Import Default Studio"), 0, this,
+ SLOT(slotImportDefaultStudio()),
+ actionCollection(), "load_default_studio");
+
+ new KAction(i18n("Im&port Studio from File..."), 0, this,
+ SLOT(slotImportStudio()),
+ actionCollection(), "load_studio");
+
+ new KAction(i18n("&Reset MIDI Network"), 0, this,
+ SLOT(slotResetMidiNetwork()),
+ actionCollection(), "reset_midi_network");
+
+ m_setQuickMarkerAction = new KAction(i18n("Set Quick Marker at Playback Position"), 0, CTRL + Key_1, this,
+ SLOT(slotSetQuickMarker()), actionCollection(),
+ "set_quick_marker");
+
+ m_jumpToQuickMarkerAction = new KAction(i18n("Jump to Quick Marker"), 0, Key_1, this,
+ SLOT(slotJumpToQuickMarker()), actionCollection(),
+ "jump_to_quick_marker");
+
+ //
+ // Marker Ruler popup menu
+ //
+// new KAction(i18n("Insert Marker"), 0, 0, this,
+// SLOT(slotInsertMarkerHere()), actionCollection(),
+// "insert_marker_here");
+//
+// new KAction(i18n("Insert Marker at Playback Position"), 0, 0, this,
+// SLOT(slotInsertMarkerAtPointer()), actionCollection(),
+// "insert_marker_at_pointer");
+//
+// new KAction(i18n("Delete Marker"), 0, 0, this,
+// SLOT(slotDeleteMarker()), actionCollection(),
+// "delete_marker");
+
+
+
+ //
+ // Transport menu
+ //
+
+ // Transport controls [rwb]
+ //
+ // We set some default key bindings - with numlock off
+ // use 1 (End) and 3 (Page Down) for Rwd and Ffwd and
+ // 0 (insert) and keypad Enter for Play and Stop
+ //
+ pixmap.load(pixmapDir + "/toolbar/transport-play.png");
+ icon = QIconSet(pixmap);
+ m_playTransport = new KAction(i18n("&Play"), icon, Key_Enter, this,
+ SLOT(slotPlay()), actionCollection(),
+ "play");
+ // Alternative shortcut for Play
+ KShortcut playShortcut = m_playTransport->shortcut();
+ playShortcut.append( KKey(Key_Return + CTRL) );
+ m_playTransport->setShortcut(playShortcut);
+ m_playTransport->setGroup(TransportDialogConfigGroup);
+
+ pixmap.load(pixmapDir + "/toolbar/transport-stop.png");
+ icon = QIconSet(pixmap);
+ m_stopTransport = new KAction(i18n("&Stop"), icon, Key_Insert, this,
+ SLOT(slotStop()), actionCollection(),
+ "stop");
+ m_stopTransport->setGroup(TransportDialogConfigGroup);
+
+ pixmap.load(pixmapDir + "/toolbar/transport-ffwd.png");
+ icon = QIconSet(pixmap);
+ m_ffwdTransport = new KAction(i18n("&Fast Forward"), icon, Key_PageDown,
+ this,
+ SLOT(slotFastforward()), actionCollection(),
+ "fast_forward");
+ m_ffwdTransport->setGroup(TransportDialogConfigGroup);
+
+ pixmap.load(pixmapDir + "/toolbar/transport-rewind.png");
+ icon = QIconSet(pixmap);
+ m_rewindTransport = new KAction(i18n("Re&wind"), icon, Key_End, this,
+ SLOT(slotRewind()), actionCollection(),
+ "rewind");
+ m_rewindTransport->setGroup(TransportDialogConfigGroup);
+
+ pixmap.load(pixmapDir + "/toolbar/transport-record.png");
+ icon = QIconSet(pixmap);
+ m_recordTransport = new KAction(i18n("P&unch in Record"), icon, Key_Space, this,
+ SLOT(slotToggleRecord()), actionCollection(),
+ "recordtoggle");
+ m_recordTransport->setGroup(TransportDialogConfigGroup);
+
+ pixmap.load(pixmapDir + "/toolbar/transport-record.png");
+ icon = QIconSet(pixmap);
+ m_recordTransport = new KAction(i18n("&Record"), icon, 0, this,
+ SLOT(slotRecord()), actionCollection(),
+ "record");
+ m_recordTransport->setGroup(TransportDialogConfigGroup);
+
+ pixmap.load(pixmapDir + "/toolbar/transport-rewind-end.png");
+ icon = QIconSet(pixmap);
+ m_rewindEndTransport = new KAction(i18n("Rewind to &Beginning"), icon, 0, this,
+ SLOT(slotRewindToBeginning()), actionCollection(),
+ "rewindtobeginning");
+ m_rewindEndTransport->setGroup(TransportDialogConfigGroup);
+
+ pixmap.load(pixmapDir + "/toolbar/transport-ffwd-end.png");
+ icon = QIconSet(pixmap);
+ m_ffwdEndTransport = new KAction(i18n("Fast Forward to &End"), icon, 0, this,
+ SLOT(slotFastForwardToEnd()), actionCollection(),
+ "fastforwardtoend");
+ m_ffwdEndTransport->setGroup(TransportDialogConfigGroup);
+
+ pixmap.load(pixmapDir + "/toolbar/transport-tracking.png");
+ icon = QIconSet(pixmap);
+ (new KToggleAction(i18n("Scro&ll to Follow Playback"), icon, Key_Pause, this,
+ SLOT(slotToggleTracking()), actionCollection(),
+ "toggle_tracking"))->setChecked(true);
+
+ pixmap.load(pixmapDir + "/toolbar/transport-panic.png");
+ icon = QIconSet(pixmap);
+ new KAction( i18n("Panic"), icon, Key_P + CTRL + ALT, this, SLOT(slotPanic()),
+ actionCollection(), "panic");
+
+ // DEBUG FACILITY
+ new KAction(i18n("Segment Debug Dump "), 0, this,
+ SLOT(slotDebugDump()), actionCollection(),
+ "debug_dump_segments");
+
+ // create main gui
+ //
+ createGUI("rosegardenui.rc", false);
+
+ createAndSetupTransport();
+
+ // transport toolbar is hidden by default - TODO : this should be in options
+ //
+ //toolBar("Transport Toolbar")->hide();
+
+ QPopupMenu* setTrackInstrumentMenu = dynamic_cast<QPopupMenu*>(factory()->container("set_track_instrument", this));
+
+ if (setTrackInstrumentMenu) {
+ connect(setTrackInstrumentMenu, SIGNAL(aboutToShow()),
+ this, SLOT(slotPopulateTrackInstrumentPopup()));
+ } else {
+ RG_DEBUG << "RosegardenGUIApp::setupActions() : couldn't find set_track_instrument menu - check rosegardenui.rcn\n";
+ }
+
+ setRewFFwdToAutoRepeat();
+}
+
+void RosegardenGUIApp::setRewFFwdToAutoRepeat()
+{
+ QWidget* transportToolbar = factory()->container("Transport Toolbar", this);
+
+ if (transportToolbar) {
+ QObjectList *l = transportToolbar->queryList();
+ QObjectListIt it(*l); // iterate over the buttons
+ QObject *obj;
+
+ while ( (obj = it.current()) != 0 ) {
+ // for each found object...
+ ++it;
+ // RG_DEBUG << "obj name : " << obj->name() << endl;
+ QString objName = obj->name();
+
+ if (objName.endsWith("rewind") || objName.endsWith("fast_forward")) {
+ QButton* btn = dynamic_cast<QButton*>(obj);
+ if (!btn) {
+ RG_DEBUG << "Very strange - found widgets in transport_toolbar which aren't buttons\n";
+
+ continue;
+ }
+ btn->setAutoRepeat(true);
+ }
+
+
+ }
+ delete l;
+
+ } else {
+ RG_DEBUG << "transportToolbar == 0\n";
+ }
+
+}
+
+void RosegardenGUIApp::initZoomToolbar()
+{
+ KToolBar *zoomToolbar = toolBar("Zoom Toolbar");
+ if (!zoomToolbar) {
+ RG_DEBUG << "RosegardenGUIApp::initZoomToolbar() : "
+ << "zoom toolbar not found" << endl;
+ return ;
+ }
+
+ new QLabel(i18n(" Zoom: "), zoomToolbar, "kde toolbar widget");
+
+ std::vector<double> zoomSizes; // in units-per-pixel
+ double defaultBarWidth44 = 100.0;
+ double duration44 = TimeSignature(4, 4).getBarDuration();
+ static double factors[] = { 0.025, 0.05, 0.1, 0.2, 0.5,
+ 1.0, 1.5, 2.5, 5.0, 10.0 , 20.0 };
+
+ for (unsigned int i = 0; i < sizeof(factors) / sizeof(factors[0]); ++i) {
+ zoomSizes.push_back(duration44 / (defaultBarWidth44 * factors[i]));
+ }
+
+ // zoom labels
+ QString minZoom = QString("%1%").arg(factors[0] * 100.0);
+ QString maxZoom = QString("%1%").arg(factors[(sizeof(factors) / sizeof(factors[0])) - 1] * 100.0);
+
+ m_zoomSlider = new ZoomSlider<double>
+ (zoomSizes, -1, QSlider::Horizontal, zoomToolbar, "kde toolbar widget");
+ m_zoomSlider->setTracking(true);
+ m_zoomSlider->setFocusPolicy(QWidget::NoFocus);
+ m_zoomLabel = new QLabel(minZoom, zoomToolbar, "kde toolbar widget");
+ m_zoomLabel->setIndent(10);
+
+ connect(m_zoomSlider, SIGNAL(valueChanged(int)),
+ this, SLOT(slotChangeZoom(int)));
+
+ // set initial zoom - we might want to make this a config option
+ // m_zoomSlider->setToDefault();
+
+}
+
+void RosegardenGUIApp::initStatusBar()
+{
+ KTmpStatusMsg::setDefaultMsg("");
+ statusBar()->insertItem(KTmpStatusMsg::getDefaultMsg(),
+ KTmpStatusMsg::getDefaultId(), 1);
+ statusBar()->setItemAlignment(KTmpStatusMsg::getDefaultId(),
+ AlignLeft | AlignVCenter);
+
+ m_progressBar = new ProgressBar(100, true, statusBar());
+ // m_progressBar->setMinimumWidth(100);
+ m_progressBar->setFixedWidth(60);
+ m_progressBar->setFixedHeight(18);
+ m_progressBar->setTextEnabled(false);
+ statusBar()->addWidget(m_progressBar);
+}
+
+void RosegardenGUIApp::initView()
+{
+ ////////////////////////////////////////////////////////////////////
+ // create the main widget here that is managed by KTMainWindow's view-region and
+ // connect the widget to your document to display document contents.
+
+ RG_DEBUG << "RosegardenGUIApp::initView()" << endl;
+
+ Composition &comp = m_doc->getComposition();
+
+ // Ensure that the start and end markers for the piece are set
+ // to something reasonable
+ //
+ if (comp.getStartMarker() == 0 &&
+ comp.getEndMarker() == 0) {
+ int endMarker = comp.getBarRange(100 + comp.getNbBars()).second;
+ comp.setEndMarker(endMarker);
+ }
+
+ m_swapView = new RosegardenGUIView(m_viewTrackLabels->isChecked(),
+ m_segmentParameterBox,
+ m_instrumentParameterBox,
+ m_trackParameterBox, this);
+
+ // Connect up this signal so that we can force tool mode
+ // changes from the view
+ connect(m_swapView, SIGNAL(activateTool(QString)),
+ this, SLOT(slotActivateTool(QString)));
+
+ connect(m_swapView,
+ SIGNAL(segmentsSelected(const SegmentSelection &)),
+ SIGNAL(segmentsSelected(const SegmentSelection &)));
+
+ connect(m_swapView,
+ SIGNAL(addAudioFile(AudioFileId)),
+ SLOT(slotAddAudioFile(AudioFileId)));
+
+ connect(m_swapView, SIGNAL(toggleSolo(bool)), SLOT(slotToggleSolo(bool)));
+
+ m_doc->attachView(m_swapView);
+
+ m_mainDockWidget->setWidget(m_swapView);
+
+ // setCentralWidget(m_swapView);
+ setCaption(m_doc->getTitle());
+
+
+ // Transport setup
+ //
+ std::string transportMode = m_doc->getConfiguration().
+ get
+ <String>
+ (DocumentConfiguration::TransportMode);
+
+
+ slotEnableTransport(true);
+
+ // and the time signature
+ //
+ getTransport()->setTimeSignature(comp.getTimeSignatureAt(comp.getPosition()));
+
+ // set the tempo in the transport
+ //
+ getTransport()->setTempo(comp.getCurrentTempo());
+
+ // bring the transport to the front
+ //
+ getTransport()->raise();
+
+ // set the play metronome button
+ getTransport()->MetronomeButton()->setOn(comp.usePlayMetronome());
+
+ // Set the solo button
+ getTransport()->SoloButton()->setOn(comp.isSolo());
+
+ // set the transport mode found in the configuration
+ getTransport()->setNewMode(transportMode);
+
+ // set the pointer position
+ //
+ slotSetPointerPosition(m_doc->getComposition().getPosition());
+
+ // make sure we show
+ //
+ RosegardenGUIView *oldView = m_view;
+ m_view = m_swapView;
+
+ connect(m_view, SIGNAL(stateChange(QString, bool)),
+ this, SLOT (slotStateChanged(QString, bool)));
+
+ connect(m_view, SIGNAL(instrumentParametersChanged(InstrumentId)),
+ this, SIGNAL(instrumentParametersChanged(InstrumentId)));
+
+ // We only check for the SequenceManager to make sure
+ // we're not on the first pass though - we don't want
+ // to send these toggles twice on initialisation.
+ //
+ // Clunky but we just about get away with it for the
+ // moment.
+ //
+ if (m_seqManager != 0) {
+ slotToggleChordNameRuler();
+ slotToggleRulers();
+ slotToggleTempoRuler();
+ slotTogglePreviews();
+ slotToggleSegmentLabels();
+
+ // Reset any loop on the sequencer
+ //
+ try {
+ if (isUsingSequencer())
+ m_seqManager->setLoop(0, 0);
+ stateChanged("have_range", KXMLGUIClient::StateReverse);
+ } catch (QString s) {
+ KStartupLogo::hideIfStillThere();
+ CurrentProgressDialog::freeze();
+ KMessageBox::error(this, s);
+ CurrentProgressDialog::thaw();
+ }
+
+ connect(m_seqManager, SIGNAL(controllerDeviceEventReceived(MappedEvent *)),
+ m_view, SLOT(slotControllerDeviceEventReceived(MappedEvent *)));
+ }
+
+ // delete m_playList;
+ // m_playList = 0;
+
+ delete m_deviceManager;
+ m_deviceManager = 0;
+
+ delete m_synthManager;
+ m_synthManager = 0;
+
+ delete m_audioMixer;
+ m_audioMixer = 0;
+
+ delete m_bankEditor;
+ m_bankEditor = 0;
+
+ delete m_markerEditor;
+ m_markerEditor = 0;
+
+ delete m_tempoView;
+ m_tempoView = 0;
+
+ delete m_triggerSegmentManager;
+ m_triggerSegmentManager = 0;
+
+ delete oldView;
+
+ // set the highlighted track
+ m_view->slotSelectTrackSegments(comp.getSelectedTrack());
+
+ // play tracking on in the editor by default: turn off if need be
+ KToggleAction *trackingAction = dynamic_cast<KToggleAction *>
+ (actionCollection()->action("toggle_tracking"));
+ if (trackingAction && !trackingAction->isChecked()) {
+ m_view->getTrackEditor()->slotToggleTracking();
+ }
+
+ m_view->show();
+
+ connect(m_view->getTrackEditor()->getSegmentCanvas(),
+ SIGNAL(showContextHelp(const QString &)),
+ this,
+ SLOT(slotShowToolHelp(const QString &)));
+
+ // We have to do this to make sure that the 2nd call ("select")
+ // actually has any effect. Activating the same radio action
+ // doesn't work the 2nd time (like pressing down the same radio
+ // button twice - it doesn't have any effect), so if you load two
+ // files in a row, on the 2nd file a new SegmentCanvas will be
+ // created but its tool won't be set, even though it will appear
+ // to be selected.
+ //
+ actionCollection()->action("move")->activate();
+ if (m_doc->getComposition().getNbSegments() > 0)
+ actionCollection()->action("select")->activate();
+ else
+ actionCollection()->action("draw")->activate();
+
+ int zoomLevel = m_doc->getConfiguration().
+ get
+ <Int>
+ (DocumentConfiguration::ZoomLevel);
+
+ m_zoomSlider->setSize(double(zoomLevel) / 1000.0);
+ slotChangeZoom(zoomLevel);
+
+ //slotChangeZoom(int(m_zoomSlider->getCurrentSize()));
+
+ stateChanged("new_file");
+
+ ProgressDialog::processEvents();
+
+ if (m_viewChordNameRuler->isChecked()) {
+ SetWaitCursor swc;
+ m_view->initChordNameRuler();
+ } else {
+ m_view->initChordNameRuler();
+ }
+}
+
+void RosegardenGUIApp::setDocument(RosegardenGUIDoc* newDocument)
+{
+ if (m_doc == newDocument)
+ return ;
+
+ emit documentAboutToChange();
+ kapp->processEvents(); // to make sure all opened dialogs (mixer, midi devices...) are closed
+
+ // Take care of all subparts which depend on the document
+
+ // Caption
+ //
+ QString caption = kapp->caption();
+ setCaption(caption + ": " + newDocument->getTitle());
+
+ // // reset AudioManagerDialog
+ // //
+ // delete m_audioManagerDialog; // TODO : replace this with a connection to documentAboutToChange() sig.
+ // m_audioManagerDialog = 0;
+
+ RosegardenGUIDoc* oldDoc = m_doc;
+
+ m_doc = newDocument;
+
+ if (m_seqManager) // when we're called at startup, the seq. man. isn't created yet
+ m_seqManager->setDocument(m_doc);
+
+ if (m_markerEditor)
+ m_markerEditor->setDocument(m_doc);
+ if (m_tempoView) {
+ delete m_tempoView;
+ m_tempoView = 0;
+ }
+ if (m_triggerSegmentManager)
+ m_triggerSegmentManager->setDocument(m_doc);
+
+ m_trackParameterBox->setDocument(m_doc);
+ m_segmentParameterBox->setDocument(m_doc);
+ m_instrumentParameterBox->setDocument(m_doc);
+
+#ifdef HAVE_LIBLO
+
+ if (m_pluginGUIManager) {
+ m_pluginGUIManager->stopAllGUIs();
+ m_pluginGUIManager->setStudio(&m_doc->getStudio());
+ }
+#endif
+
+ if (getView() &&
+ getView()->getTrackEditor() &&
+ getView()->getTrackEditor()->getSegmentCanvas()) {
+ getView()->getTrackEditor()->getSegmentCanvas()->endAudioPreviewGeneration();
+ }
+
+ // this will delete all edit views
+ //
+ delete oldDoc;
+
+ // connect needed signals
+ //
+ connect(m_segmentParameterBox, SIGNAL(documentModified()),
+ m_doc, SLOT(slotDocumentModified()));
+
+ connect(m_doc, SIGNAL(pointerPositionChanged(timeT)),
+ this, SLOT(slotSetPointerPosition(timeT)));
+
+ connect(m_doc, SIGNAL(documentModified(bool)),
+ this, SLOT(slotDocumentModified(bool)));
+
+ connect(m_doc, SIGNAL(loopChanged(timeT, timeT)),
+ this, SLOT(slotSetLoop(timeT, timeT)));
+
+ m_doc->getCommandHistory()->attachView(actionCollection());
+
+ connect(m_doc->getCommandHistory(), SIGNAL(commandExecuted()),
+ SLOT(update()));
+ connect(m_doc->getCommandHistory(), SIGNAL(commandExecuted()),
+ SLOT(slotTestClipboard()));
+
+ // connect and start the autosave timer
+ connect(m_autoSaveTimer, SIGNAL(timeout()), this, SLOT(slotAutoSave()));
+ m_autoSaveTimer->start(m_doc->getAutoSavePeriod() * 1000);
+
+ // Connect the playback timer
+ //
+ connect(m_playTimer, SIGNAL(timeout()), this, SLOT(slotUpdatePlaybackPosition()));
+ connect(m_stopTimer, SIGNAL(timeout()), this, SLOT(slotUpdateMonitoring()));
+
+ // finally recreate the main view
+ //
+ initView();
+
+ if (getView() && getView()->getTrackEditor()) {
+ connect(m_doc, SIGNAL(makeTrackVisible(int)),
+ getView()->getTrackEditor(), SLOT(slotScrollToTrack(int)));
+ }
+
+ connect(m_doc, SIGNAL(devicesResyncd()),
+ this, SLOT(slotDocumentDevicesResyncd()));
+
+ m_doc->syncDevices();
+ m_doc->clearModifiedStatus();
+
+ if (newDocument->getStudio().haveMidiDevices()) {
+ stateChanged("got_midi_devices");
+ } else {
+ stateChanged("got_midi_devices", KXMLGUIClient::StateReverse);
+ }
+
+ // Ensure the sequencer knows about any audio files
+ // we've loaded as part of the new Composition
+ //
+ m_doc->prepareAudio();
+
+ // Do not reset instrument prog. changes after all.
+ // if (m_seqManager)
+ // m_seqManager->preparePlayback(true);
+
+ Composition &comp = m_doc->getComposition();
+
+ // Set any loaded loop at the Composition and
+ // on the marker on SegmentCanvas and clients
+ //
+ if (m_seqManager)
+ m_doc->setLoop(comp.getLoopStart(), comp.getLoopEnd());
+
+ emit documentChanged(m_doc);
+
+ m_doc->clearModifiedStatus(); // because it's set as modified by the various
+ // init operations
+ // TODO: this sucks, have to sort it out somehow.
+
+ // Readjust canvas size
+ //
+ m_view->getTrackEditor()->slotReadjustCanvasSize();
+
+ m_stopTimer->start(100);
+}
+
+void
+RosegardenGUIApp::openFile(QString filePath, ImportType type)
+{
+ RG_DEBUG << "RosegardenGUIApp::openFile " << filePath << endl;
+
+ if (type == ImportCheckType && filePath.endsWith(".rgp")) {
+ importProject(filePath);
+ return ;
+ }
+
+ RosegardenGUIDoc *doc = createDocument(filePath, type);
+ if (doc) {
+ setDocument(doc);
+
+ // fix # 1235755, "SPB combo not updating after document swap"
+ RG_DEBUG << "RosegardenGUIApp::openFile(): calling slotDocColoursChanged() in doc" << endl;
+ doc->slotDocColoursChanged();
+
+ kapp->config()->setGroup(GeneralOptionsConfigGroup);
+ if (kapp->config()->readBoolEntry("alwaysusedefaultstudio", false)) {
+
+ QString autoloadFile =
+ KGlobal::dirs()->findResource("appdata", "autoload.rg");
+
+ QFileInfo autoloadFileInfo(autoloadFile);
+ if (autoloadFileInfo.isReadable()) {
+
+ RG_DEBUG << "Importing default studio from " << autoloadFile << endl;
+
+ slotImportStudioFromFile(autoloadFile);
+ }
+ }
+
+ QFileInfo fInfo(filePath);
+ m_fileRecent->addURL(fInfo.absFilePath());
+ }
+}
+
+RosegardenGUIDoc*
+RosegardenGUIApp::createDocument(QString filePath, ImportType importType)
+{
+ QFileInfo info(filePath);
+ RosegardenGUIDoc *doc = 0;
+
+ if (!info.exists()) {
+ // can happen with command-line arg, so...
+ KStartupLogo::hideIfStillThere();
+ KMessageBox::sorry(this, i18n("File \"%1\" does not exist").arg(filePath));
+ return 0;
+ }
+
+ if (info.isDir()) {
+ KStartupLogo::hideIfStillThere();
+ KMessageBox::sorry(this, i18n("File \"%1\" is actually a directory"));
+ return 0;
+ }
+
+ QFile file(filePath);
+
+ if (!file.open(IO_ReadOnly)) {
+ KStartupLogo::hideIfStillThere();
+ QString errStr =
+ i18n("You do not have read permission for \"%1\"").arg(filePath);
+
+ KMessageBox::sorry(this, errStr);
+ return 0;
+ }
+
+ // Stop if playing
+ //
+ if (m_seqManager && m_seqManager->getTransportStatus() == PLAYING)
+ slotStop();
+
+ slotEnableTransport(false);
+
+ if (importType == ImportCheckType) {
+ KMimeType::Ptr fileMimeType = KMimeType::findByPath(filePath);
+ if (fileMimeType->name() == "audio/x-midi")
+ importType = ImportMIDI;
+ else if (fileMimeType->name() == "audio/x-rosegarden")
+ importType = ImportRG4;
+ else if (filePath.endsWith(".rose"))
+ importType = ImportRG21;
+ else if (filePath.endsWith(".h2song"))
+ importType = ImportHydrogen;
+ }
+
+
+ switch (importType) {
+ case ImportMIDI:
+ doc = createDocumentFromMIDIFile(filePath);
+ break;
+ case ImportRG21:
+ doc = createDocumentFromRG21File(filePath);
+ break;
+ case ImportHydrogen:
+ doc = createDocumentFromHydrogenFile(filePath);
+ break;
+ default:
+ doc = createDocumentFromRGFile(filePath);
+ }
+
+ slotEnableTransport(true);
+
+ return doc;
+}
+
+RosegardenGUIDoc*
+RosegardenGUIApp::createDocumentFromRGFile(QString filePath)
+{
+ // Check for an autosaved file to recover
+ QString effectiveFilePath = filePath;
+ bool canRecover = false;
+ QString autoSaveFileName = kapp->checkRecoverFile(filePath, canRecover);
+
+ if (canRecover) {
+ // First check if the auto-save file is more recent than the doc
+ QFileInfo docFileInfo(filePath), autoSaveFileInfo(autoSaveFileName);
+
+ if (docFileInfo.lastModified() < autoSaveFileInfo.lastModified()) {
+
+ RG_DEBUG << "RosegardenGUIApp::openFile : "
+ << "found a more recent autosave file\n";
+
+ // At this point the splash screen may still be there, hide it if
+ // it's the case
+ KStartupLogo::hideIfStillThere();
+
+ // It is, so ask the user if he wants to use the autosave file
+ int reply = KMessageBox::questionYesNo(this,
+ i18n("An auto-save file for this document has been found\nDo you want to open it instead ?"));
+
+ if (reply == KMessageBox::Yes)
+ // open the autosave file instead
+ effectiveFilePath = autoSaveFileName;
+ else {
+ // user doesn't want the autosave, so delete it
+ // so it won't bother us again if we reload
+ canRecover = false;
+ QFile::remove
+ (autoSaveFileName);
+ }
+
+ } else
+ canRecover = false;
+ }
+
+ // Create a new blank document
+ //
+ RosegardenGUIDoc *newDoc = new RosegardenGUIDoc(this, m_pluginManager,
+ true); // skipAutoload
+
+ // ignore return thingy
+ //
+ if (newDoc->openDocument(effectiveFilePath)) {
+ if (canRecover) {
+ // Mark the document as modified,
+ // set the "regular" filepath and name (not those of
+ // the autosaved doc)
+ //
+ newDoc->slotDocumentModified();
+ QFileInfo info(filePath);
+ newDoc->setAbsFilePath(info.absFilePath());
+ newDoc->setTitle(info.fileName());
+ } else {
+ newDoc->clearModifiedStatus();
+ }
+ } else {
+ delete newDoc;
+ return 0;
+ }
+
+ return newDoc;
+}
+
+void RosegardenGUIApp::slotSaveOptions()
+{
+ RG_DEBUG << "RosegardenGUIApp::slotSaveOptions()\n";
+
+#ifdef SETTING_LOG_DEBUG
+
+ _settingLog(QString("SETTING 2 : transport flap extended = %1").arg(getTransport()->isExpanded()));
+ _settingLog(QString("SETTING 2 : show track labels = %1").arg(m_viewTrackLabels->isChecked()));
+#endif
+
+ kapp->config()->setGroup(GeneralOptionsConfigGroup);
+ kapp->config()->writeEntry("Show Transport", m_viewTransport->isChecked());
+ kapp->config()->writeEntry("Expanded Transport", m_transport ? getTransport()->isExpanded() : true);
+ kapp->config()->writeEntry("Show Track labels", m_viewTrackLabels->isChecked());
+ kapp->config()->writeEntry("Show Rulers", m_viewRulers->isChecked());
+ kapp->config()->writeEntry("Show Tempo Ruler", m_viewTempoRuler->isChecked());
+ kapp->config()->writeEntry("Show Chord Name Ruler", m_viewChordNameRuler->isChecked());
+ kapp->config()->writeEntry("Show Previews", m_viewPreviews->isChecked());
+ kapp->config()->writeEntry("Show Segment Labels", m_viewSegmentLabels->isChecked());
+ kapp->config()->writeEntry("Show Parameters", m_dockVisible);
+ kapp->config()->writeEntry("MIDI Thru Routing", m_enableMIDIrouting->isChecked());
+
+#ifdef SETTING_LOG_DEBUG
+
+ RG_DEBUG << "SHOW PARAMETERS = " << m_dockVisible << endl;
+#endif
+
+ m_fileRecent->saveEntries(kapp->config());
+
+ // saveMainWindowSettings(kapp->config(), RosegardenGUIApp::MainWindowConfigGroup); - no need to, done by KMainWindow
+ kapp->config()->sync();
+}
+
+void RosegardenGUIApp::setupFileDialogSpeedbar()
+{
+ KConfig *config = kapp->config();
+
+ config->setGroup("KFileDialog Speedbar");
+
+ RG_DEBUG << "RosegardenGUIApp::setupFileDialogSpeedbar" << endl;
+
+ bool hasSetExamplesItem = config->readBoolEntry("Examples Set", false);
+
+ RG_DEBUG << "RosegardenGUIApp::setupFileDialogSpeedbar: examples set " << hasSetExamplesItem << endl;
+
+ if (!hasSetExamplesItem) {
+
+ unsigned int n = config->readUnsignedNumEntry("Number of Entries", 0);
+
+ config->writeEntry(QString("Description_%1").arg(n), i18n("Example Files"));
+ config->writeEntry(QString("IconGroup_%1").arg(n), 4);
+ config->writeEntry(QString("Icon_%1").arg(n), "folder");
+ config->writeEntry(QString("URL_%1").arg(n),
+ KGlobal::dirs()->findResource("appdata", "examples/"));
+
+ RG_DEBUG << "wrote url " << config->readEntry(QString("URL_%1").arg(n)) << endl;
+
+ config->writeEntry("Examples Set", true);
+ config->writeEntry("Number of Entries", n + 1);
+ config->sync();
+ }
+
+}
+
+void RosegardenGUIApp::readOptions()
+{
+ applyMainWindowSettings(kapp->config(), MainWindowConfigGroup);
+
+ kapp->config()->reparseConfiguration();
+
+ // Statusbar and toolbars toggling action status
+ //
+ m_viewStatusBar ->setChecked(!statusBar() ->isHidden());
+ m_viewToolBar ->setChecked(!toolBar() ->isHidden());
+ m_viewToolsToolBar ->setChecked(!toolBar("Tools Toolbar") ->isHidden());
+ m_viewTracksToolBar ->setChecked(!toolBar("Tracks Toolbar") ->isHidden());
+ m_viewEditorsToolBar ->setChecked(!toolBar("Editors Toolbar") ->isHidden());
+ m_viewTransportToolBar->setChecked(!toolBar("Transport Toolbar")->isHidden());
+ m_viewZoomToolBar ->setChecked(!toolBar("Zoom Toolbar") ->isHidden());
+
+ bool opt;
+
+ kapp->config()->setGroup(GeneralOptionsConfigGroup);
+
+ opt = kapp->config()->readBoolEntry("Show Transport", true);
+ m_viewTransport->setChecked(opt);
+ slotToggleTransport();
+
+ opt = kapp->config()->readBoolEntry("Expanded Transport", true);
+
+#ifdef SETTING_LOG_DEBUG
+
+ _settingLog(QString("SETTING 3 : transport flap extended = %1").arg(opt));
+#endif
+
+ if (opt)
+ getTransport()->slotPanelOpenButtonClicked();
+ else
+ getTransport()->slotPanelCloseButtonClicked();
+
+ opt = kapp->config()->readBoolEntry("Show Track labels", true);
+
+#ifdef SETTING_LOG_DEBUG
+
+ _settingLog(QString("SETTING 3 : show track labels = %1").arg(opt));
+#endif
+
+ m_viewTrackLabels->setChecked(opt);
+ slotToggleTrackLabels();
+
+ opt = kapp->config()->readBoolEntry("Show Rulers", true);
+ m_viewRulers->setChecked(opt);
+ slotToggleRulers();
+
+ opt = kapp->config()->readBoolEntry("Show Tempo Ruler", true);
+ m_viewTempoRuler->setChecked(opt);
+ slotToggleTempoRuler();
+
+ opt = kapp->config()->readBoolEntry("Show Chord Name Ruler", false);
+ m_viewChordNameRuler->setChecked(opt);
+ slotToggleChordNameRuler();
+
+ opt = kapp->config()->readBoolEntry("Show Previews", true);
+ m_viewPreviews->setChecked(opt);
+ slotTogglePreviews();
+
+ opt = kapp->config()->readBoolEntry("Show Segment Labels", true);
+ m_viewSegmentLabels->setChecked(opt);
+ slotToggleSegmentLabels();
+
+ opt = kapp->config()->readBoolEntry("Show Parameters", true);
+ if (!opt) {
+ m_dockLeft->undock();
+ m_dockLeft->hide();
+ stateChanged("parametersbox_closed", KXMLGUIClient::StateNoReverse);
+ m_dockVisible = false;
+ }
+
+ // MIDI Thru routing
+ opt = kapp->config()->readBoolEntry("MIDI Thru Routing", true);
+ m_enableMIDIrouting->setChecked(opt);
+ slotEnableMIDIThruRouting();
+
+ // initialise the recent file list
+ //
+ m_fileRecent->loadEntries(kapp->config());
+
+ m_actionsSetup = true;
+
+}
+
+void RosegardenGUIApp::saveGlobalProperties(KConfig *cfg)
+{
+ if (m_doc->getTitle() != i18n("Untitled") && !m_doc->isModified()) {
+ // saving to tempfile not necessary
+ } else {
+ QString filename = m_doc->getAbsFilePath();
+ cfg->writeEntry("filename", filename);
+ cfg->writeEntry("modified", m_doc->isModified());
+
+ QString tempname = kapp->tempSaveName(filename);
+ QString errMsg;
+ bool res = m_doc->saveDocument(tempname, errMsg);
+ if (!res) {
+ if (errMsg)
+ KMessageBox::error(this, i18n(QString("Could not save document at %1\nError was : %2")
+ .arg(tempname).arg(errMsg)));
+ else
+ KMessageBox::error(this, i18n(QString("Could not save document at %1")
+ .arg(tempname)));
+ }
+ }
+}
+
+void RosegardenGUIApp::readGlobalProperties(KConfig* _cfg)
+{
+ QString filename = _cfg->readEntry("filename", "");
+ bool modified = _cfg->readBoolEntry("modified", false);
+
+ if (modified) {
+ bool canRecover;
+ QString tempname = kapp->checkRecoverFile(filename, canRecover);
+
+ if (canRecover) {
+ slotEnableTransport(false);
+ m_doc->openDocument(tempname);
+ slotEnableTransport(true);
+ m_doc->slotDocumentModified();
+ QFileInfo info(filename);
+ m_doc->setAbsFilePath(info.absFilePath());
+ m_doc->setTitle(info.fileName());
+ }
+ } else {
+ if (!filename.isEmpty()) {
+ slotEnableTransport(false);
+ m_doc->openDocument(filename);
+ slotEnableTransport(true);
+ }
+ }
+
+ QString caption = kapp->caption();
+ setCaption(caption + ": " + m_doc->getTitle());
+}
+
+void RosegardenGUIApp::showEvent(QShowEvent* e)
+{
+ RG_DEBUG << "RosegardenGUIApp::showEvent()\n";
+
+ getTransport()->raise();
+ KMainWindow::showEvent(e);
+}
+
+bool RosegardenGUIApp::queryClose()
+{
+ RG_DEBUG << "RosegardenGUIApp::queryClose" << endl;
+#ifdef SETTING_LOG_DEBUG
+
+ _settingLog(QString("SETTING 1 : transport flap extended = %1").arg(getTransport()->isExpanded()));
+ _settingLog(QString("SETTING 1 : show track labels = %1").arg(m_viewTrackLabels->isChecked()));
+#endif
+
+ QString errMsg;
+
+ bool canClose = m_doc->saveIfModified();
+
+ /*
+ if (canClose && m_transport) {
+
+ // or else the closing of the transport will toggle off the
+ // 'view transport' action, and its state will be saved as
+ // 'off'
+ //
+
+ disconnect(m_transport, SIGNAL(closed()),
+ this, SLOT(slotCloseTransport()));
+ }
+ */
+
+ return canClose;
+
+}
+
+bool RosegardenGUIApp::queryExit()
+{
+ RG_DEBUG << "RosegardenGUIApp::queryExit" << endl;
+ if (m_actionsSetup)
+ slotSaveOptions();
+
+ return true;
+}
+
+void RosegardenGUIApp::slotFileNewWindow()
+{
+ KTmpStatusMsg msg(i18n("Opening a new application window..."), this);
+
+ RosegardenGUIApp *new_window = new RosegardenGUIApp();
+ new_window->show();
+}
+
+void RosegardenGUIApp::slotFileNew()
+{
+ RG_DEBUG << "RosegardenGUIApp::slotFileNew()\n";
+
+ KTmpStatusMsg msg(i18n("Creating new document..."), this);
+
+ bool makeNew = false;
+
+ if (!m_doc->isModified()) {
+ makeNew = true;
+ // m_doc->closeDocument();
+ } else if (m_doc->saveIfModified()) {
+ makeNew = true;
+ }
+
+ if (makeNew) {
+
+ setDocument(new RosegardenGUIDoc(this, m_pluginManager));
+ }
+}
+
+void RosegardenGUIApp::slotOpenDroppedURL(QString url)
+{
+ ProgressDialog::processEvents(); // or else we get a crash because the
+ // track editor is erased too soon - it is the originator of the signal
+ // this slot is connected to.
+
+ if (!m_doc->saveIfModified())
+ return ;
+
+ openURL(KURL(url));
+}
+
+void RosegardenGUIApp::openURL(QString url)
+{
+ RG_DEBUG << "RosegardenGUIApp::openURL: QString " << url << endl;
+ openURL(KURL(url));
+}
+
+void RosegardenGUIApp::openURL(const KURL& url)
+{
+ SetWaitCursor waitCursor;
+
+ QString netFile = url.prettyURL();
+ RG_DEBUG << "RosegardenGUIApp::openURL: KURL " << netFile << endl;
+
+ if (!url.isValid()) {
+ QString string;
+ string = i18n( "Malformed URL\n%1").arg(netFile);
+
+ KMessageBox::sorry(this, string);
+ return ;
+ }
+
+ QString target, caption(url.path());
+
+ if (KIO::NetAccess::download(url, target, this) == false) {
+ KMessageBox::error(this, i18n("Cannot download file %1").arg(url.prettyURL()));
+ return ;
+ }
+
+ RG_DEBUG << "RosegardenGUIApp::openURL: target : " << target << endl;
+
+ if (!m_doc->saveIfModified())
+ return ;
+
+ openFile(target);
+
+ setCaption(caption);
+}
+
+void RosegardenGUIApp::slotFileOpen()
+{
+ slotStatusHelpMsg(i18n("Opening file..."));
+
+ kapp->config()->setGroup(GeneralOptionsConfigGroup);
+
+ QString lastOpenedVersion =
+ kapp->config()->readEntry("Last File Opened Version", "none");
+
+ if (lastOpenedVersion != VERSION) {
+
+ // We haven't opened any files with this version of the
+ // program before. Default to the examples directory.
+
+ QString examplesDir = KGlobal::dirs()->findResource("appdata", "examples/");
+ kapp->config()->setGroup("Recent Dirs");
+ QString recentString = kapp->config()->readEntry("ROSEGARDEN", "");
+ kapp->config()->writeEntry
+ ("ROSEGARDEN", QString("file:%1,%2").arg(examplesDir).arg(recentString));
+ }
+
+ KURL url = KFileDialog::getOpenURL
+ (":ROSEGARDEN",
+ "audio/x-rosegarden audio/x-midi audio/x-rosegarden21", this,
+ i18n("Open File"));
+ if ( url.isEmpty() ) {
+ return ;
+ }
+
+ if (m_doc && !m_doc->saveIfModified())
+ return ;
+
+ kapp->config()->setGroup(GeneralOptionsConfigGroup);
+ kapp->config()->writeEntry("Last File Opened Version", VERSION);
+
+ openURL(url);
+}
+
+void RosegardenGUIApp::slotMerge()
+{
+ KURL url = KFileDialog::getOpenURL
+ (":ROSEGARDEN",
+ "audio/x-rosegarden audio/x-midi audio/x-rosegarden21", this,
+ i18n("Open File"));
+ if ( url.isEmpty() ) {
+ return ;
+ }
+
+
+ QString target;
+
+ if (KIO::NetAccess::download(url, target, this) == false) {
+ KMessageBox::error(this, i18n("Cannot download file %1").arg(url.prettyURL()));
+ return ;
+ }
+
+ mergeFile(target);
+
+ KIO::NetAccess::removeTempFile( target );
+}
+
+void RosegardenGUIApp::slotFileOpenRecent(const KURL &url)
+{
+ KTmpStatusMsg msg(i18n("Opening file..."), this);
+
+ if (m_doc) {
+
+ if (!m_doc->saveIfModified()) {
+ return ;
+
+ }
+ }
+
+ openURL(url);
+}
+
+void RosegardenGUIApp::slotFileSave()
+{
+ if (!m_doc /*|| !m_doc->isModified()*/)
+ return ; // ALWAYS save, even if doc is not modified.
+
+ KTmpStatusMsg msg(i18n("Saving file..."), this);
+
+ // if it's a new file (no file path), or an imported file
+ // (file path doesn't end with .rg), call saveAs
+ //
+ if (!m_doc->isRegularDotRGFile()) {
+
+ slotFileSaveAs();
+
+ } else {
+
+ SetWaitCursor waitCursor;
+ QString errMsg, docFilePath = m_doc->getAbsFilePath();
+
+ bool res = m_doc->saveDocument(docFilePath, errMsg);
+ if (!res) {
+ if (errMsg)
+ KMessageBox::error(this, i18n(QString("Could not save document at %1\nError was : %2")
+ .arg(docFilePath).arg(errMsg)));
+ else
+ KMessageBox::error(this, i18n(QString("Could not save document at %1")
+ .arg(docFilePath)));
+ }
+ }
+}
+
+QString
+RosegardenGUIApp::getValidWriteFile(QString descriptiveExtension,
+ QString label)
+{
+ // extract first extension listed in descriptiveExtension, for instance,
+ // ".rg" from "*.rg|Rosegarden files", or ".mid" from "*.mid *.midi|MIDI Files"
+ //
+ QString extension = descriptiveExtension.left(descriptiveExtension.find('|')).mid(1).section(' ', 0, 0);
+
+ RG_DEBUG << "RosegardenGUIApp::getValidWriteFile() : extension = " << extension << endl;
+
+ // It's too bad there isn't this functionality within
+ // KFileDialog::getSaveFileName
+ KFileDialog saveFileDialog(":ROSEGARDEN", descriptiveExtension, this, label, true);
+ saveFileDialog.setOperationMode(KFileDialog::Saving);
+ if (m_doc) {
+ QString saveFileName = m_doc->getAbsFilePath();
+ // Show filename without the old extension
+ int dotLoc = saveFileName.findRev('.');
+ if (dotLoc >= int(saveFileName.length() - 4)) {
+ saveFileName = saveFileName.left(dotLoc);
+ }
+ saveFileDialog.setSelection(saveFileName);
+ }
+ saveFileDialog.exec();
+ QString name = saveFileDialog.selectedFile();
+
+ // RG_DEBUG << "RosegardenGUIApp::getValidWriteFile() : KFileDialog::getSaveFileName returned "
+ // << name << endl;
+
+
+ if (name.isEmpty())
+ return name;
+
+ // Append extension if we don't have one
+ //
+ if (!extension.isEmpty()) {
+ static QRegExp rgFile("\\..{1,4}$");
+ if (rgFile.match(name) == -1) {
+ name += extension;
+ }
+ }
+
+ KURL *u = new KURL(name);
+
+ if (!u->isValid()) {
+ KMessageBox::sorry(this, i18n("This is not a valid filename.\n"));
+ return "";
+ }
+
+ if (!u->isLocalFile()) {
+ KMessageBox::sorry(this, i18n("This is not a local file.\n"));
+ return "";
+ }
+
+ QFileInfo info(name);
+
+ if (info.isDir()) {
+ KMessageBox::sorry(this, i18n("You have specified a directory"));
+ return "";
+ }
+
+ if (info.exists()) {
+ int overwrite = KMessageBox::questionYesNo
+ (this, i18n("The specified file exists. Overwrite?"));
+
+ if (overwrite != KMessageBox::Yes)
+ return "";
+ }
+
+ return name;
+}
+
+bool RosegardenGUIApp::slotFileSaveAs()
+{
+ if (!m_doc)
+ return false;
+
+ KTmpStatusMsg msg(i18n("Saving file with a new filename..."), this);
+
+ QString newName = getValidWriteFile("*.rg|" + i18n("Rosegarden files") +
+ "\n*|" + i18n("All files"),
+ i18n("Save as..."));
+ if (newName.isEmpty())
+ return false;
+
+ SetWaitCursor waitCursor;
+ QFileInfo saveAsInfo(newName);
+ m_doc->setTitle(saveAsInfo.fileName());
+ m_doc->setAbsFilePath(saveAsInfo.absFilePath());
+ QString errMsg;
+ bool res = m_doc->saveDocument(newName, errMsg);
+ if (!res) {
+ if (errMsg)
+ KMessageBox::error(this, i18n(QString("Could not save document at %1\nError was : %2")
+ .arg(newName).arg(errMsg)));
+ else
+ KMessageBox::error(this, i18n(QString("Could not save document at %1")
+ .arg(newName)));
+
+ } else {
+
+ m_fileRecent->addURL(newName);
+
+ QString caption = kapp->caption();
+ setCaption(caption + ": " + m_doc->getTitle());
+ // update the edit view's captions too
+ emit compositionStateUpdate();
+ }
+
+ return res;
+}
+
+void RosegardenGUIApp::slotFileClose()
+{
+ RG_DEBUG << "RosegardenGUIApp::slotFileClose()" << endl;
+
+ if (!m_doc)
+ return ;
+
+ KTmpStatusMsg msg(i18n("Closing file..."), this);
+
+ if (m_doc->saveIfModified()) {
+ setDocument(new RosegardenGUIDoc(this, m_pluginManager));
+ }
+
+ // Don't close the whole view (i.e. Quit), just close the doc.
+ // close();
+}
+
+void RosegardenGUIApp::slotFilePrint()
+{
+ if (m_doc->getComposition().getNbSegments() == 0) {
+ KMessageBox::sorry(0, "Please create some tracks first (until we implement menu state management)");
+ return ;
+ }
+
+ KTmpStatusMsg msg(i18n("Printing..."), this);
+
+ m_view->print(&m_doc->getComposition());
+}
+
+void RosegardenGUIApp::slotFilePrintPreview()
+{
+ if (m_doc->getComposition().getNbSegments() == 0) {
+ KMessageBox::sorry(0, "Please create some tracks first (until we implement menu state management)");
+ return ;
+ }
+
+ KTmpStatusMsg msg(i18n("Previewing..."), this);
+
+ m_view->print(&m_doc->getComposition(), true);
+}
+
+void RosegardenGUIApp::slotQuit()
+{
+ slotStatusMsg(i18n("Exiting..."));
+
+ Profiles::getInstance()->dump();
+
+ // close the first window, the list makes the next one the first again.
+ // This ensures that queryClose() is called on each window to ask for closing
+ KMainWindow* w;
+ if (memberList) {
+
+ for (w = memberList->first(); w != 0; w = memberList->next()) {
+ // only close the window if the closeEvent is accepted. If
+ // the user presses Cancel on the saveIfModified() dialog,
+ // the window and the application stay open.
+ if (!w->close())
+ break;
+ }
+ }
+}
+
+void RosegardenGUIApp::slotEditCut()
+{
+ if (!m_view->haveSelection())
+ return ;
+ KTmpStatusMsg msg(i18n("Cutting selection..."), this);
+
+ SegmentSelection selection(m_view->getSelection());
+ m_doc->getCommandHistory()->addCommand
+ (new CutCommand(selection, m_clipboard));
+}
+
+void RosegardenGUIApp::slotEditCopy()
+{
+ if (!m_view->haveSelection())
+ return ;
+ KTmpStatusMsg msg(i18n("Copying selection to clipboard..."), this);
+
+ SegmentSelection selection(m_view->getSelection());
+ m_doc->getCommandHistory()->addCommand
+ (new CopyCommand(selection, m_clipboard));
+}
+
+void RosegardenGUIApp::slotEditPaste()
+{
+ if (m_clipboard->isEmpty()) {
+ KTmpStatusMsg msg(i18n("Clipboard is empty"), this);
+ return ;
+ }
+ KTmpStatusMsg msg(i18n("Inserting clipboard contents..."), this);
+
+ // for now, but we could paste at the time of the first copied
+ // segment and then do ghosting drag or something
+ timeT insertionTime = m_doc->getComposition().getPosition();
+ m_doc->getCommandHistory()->addCommand
+ (new PasteSegmentsCommand(&m_doc->getComposition(),
+ m_clipboard, insertionTime,
+ m_doc->getComposition().getSelectedTrack(),
+ false));
+
+ // User preference? Update song pointer position on paste
+ m_doc->slotSetPointerPosition(m_doc->getComposition().getPosition());
+}
+
+void RosegardenGUIApp::slotCutRange()
+{
+ timeT t0 = m_doc->getComposition().getLoopStart();
+ timeT t1 = m_doc->getComposition().getLoopEnd();
+
+ if (t0 == t1)
+ return ;
+
+ m_doc->getCommandHistory()->addCommand
+ (new CutRangeCommand(&m_doc->getComposition(), t0, t1, m_clipboard));
+}
+
+void RosegardenGUIApp::slotCopyRange()
+{
+ timeT t0 = m_doc->getComposition().getLoopStart();
+ timeT t1 = m_doc->getComposition().getLoopEnd();
+
+ if (t0 == t1)
+ return ;
+
+ m_doc->getCommandHistory()->addCommand
+ (new CopyCommand(&m_doc->getComposition(), t0, t1, m_clipboard));
+}
+
+void RosegardenGUIApp::slotPasteRange()
+{
+ if (m_clipboard->isEmpty())
+ return ;
+
+ m_doc->getCommandHistory()->addCommand
+ (new PasteRangeCommand(&m_doc->getComposition(), m_clipboard,
+ m_doc->getComposition().getPosition()));
+
+ m_doc->setLoop(0, 0);
+}
+
+void RosegardenGUIApp::slotDeleteRange()
+{
+ timeT t0 = m_doc->getComposition().getLoopStart();
+ timeT t1 = m_doc->getComposition().getLoopEnd();
+
+ if (t0 == t1)
+ return ;
+
+ m_doc->getCommandHistory()->addCommand
+ (new DeleteRangeCommand(&m_doc->getComposition(), t0, t1));
+
+ m_doc->setLoop(0, 0);
+}
+
+void RosegardenGUIApp::slotInsertRange()
+{
+ timeT t0 = m_doc->getComposition().getPosition();
+ std::pair<timeT, timeT> r = m_doc->getComposition().getBarRangeForTime(t0);
+ TimeDialog dialog(m_view, i18n("Duration of empty range to insert"),
+ &m_doc->getComposition(), t0, r.second - r.first, false);
+ if (dialog.exec() == QDialog::Accepted) {
+ m_doc->getCommandHistory()->addCommand
+ (new InsertRangeCommand(&m_doc->getComposition(), t0, dialog.getTime()));
+ m_doc->setLoop(0, 0);
+ }
+}
+
+void RosegardenGUIApp::slotSelectAll()
+{
+ m_view->slotSelectAllSegments();
+}
+
+void RosegardenGUIApp::slotDeleteSelectedSegments()
+{
+ m_view->getTrackEditor()->slotDeleteSelectedSegments();
+}
+
+void RosegardenGUIApp::slotQuantizeSelection()
+{
+ if (!m_view->haveSelection())
+ return ;
+
+ //!!! this should all be in rosegardenguiview
+
+ QuantizeDialog dialog(m_view);
+ if (dialog.exec() != QDialog::Accepted)
+ return ;
+
+ SegmentSelection selection = m_view->getSelection();
+
+ KMacroCommand *command = new KMacroCommand
+ (EventQuantizeCommand::getGlobalName());
+
+ for (SegmentSelection::iterator i = selection.begin();
+ i != selection.end(); ++i) {
+ command->addCommand(new EventQuantizeCommand
+ (**i, (*i)->getStartTime(), (*i)->getEndTime(),
+ dialog.getQuantizer()));
+ }
+
+ m_view->slotAddCommandToHistory(command);
+}
+
+void RosegardenGUIApp::slotRepeatQuantizeSelection()
+{
+ if (!m_view->haveSelection())
+ return ;
+
+ //!!! this should all be in rosegardenguiview
+
+ SegmentSelection selection = m_view->getSelection();
+
+ KMacroCommand *command = new KMacroCommand
+ (EventQuantizeCommand::getGlobalName());
+
+ for (SegmentSelection::iterator i = selection.begin();
+ i != selection.end(); ++i) {
+ command->addCommand(new EventQuantizeCommand
+ (**i, (*i)->getStartTime(), (*i)->getEndTime(),
+ "Quantize Dialog Grid", false)); // no i18n (config group name)
+ }
+
+ m_view->slotAddCommandToHistory(command);
+}
+
+void RosegardenGUIApp::slotGrooveQuantize()
+{
+ if (!m_view->haveSelection())
+ return ;
+
+ SegmentSelection selection = m_view->getSelection();
+
+ if (selection.size() != 1) {
+ KMessageBox::sorry(this, i18n("This function needs no more than one segment to be selected."));
+ return ;
+ }
+
+ Segment *s = *selection.begin();
+ m_view->slotAddCommandToHistory(new CreateTempoMapFromSegmentCommand(s));
+}
+
+void RosegardenGUIApp::slotJoinSegments()
+{
+ if (!m_view->haveSelection())
+ return ;
+
+ //!!! this should all be in rosegardenguiview
+ //!!! should it?
+
+ SegmentSelection selection = m_view->getSelection();
+ if (selection.size() == 0)
+ return ;
+
+ for (SegmentSelection::iterator i = selection.begin();
+ i != selection.end(); ++i) {
+ if ((*i)->getType() != Segment::Internal) {
+ KMessageBox::sorry(this, i18n("Can't join Audio segments"));
+ return ;
+ }
+ }
+
+ m_view->slotAddCommandToHistory(new SegmentJoinCommand(selection));
+ m_view->updateSelectionContents();
+}
+
+void RosegardenGUIApp::slotRescaleSelection()
+{
+ if (!m_view->haveSelection())
+ return ;
+
+ //!!! this should all be in rosegardenguiview
+ //!!! should it?
+
+ SegmentSelection selection = m_view->getSelection();
+
+ timeT startTime = 0, endTime = 0;
+ for (SegmentSelection::iterator i = selection.begin();
+ i != selection.end(); ++i) {
+ if ((i == selection.begin()) || ((*i)->getStartTime() < startTime)) {
+ startTime = (*i)->getStartTime();
+ }
+ if ((i == selection.begin()) || ((*i)->getEndMarkerTime() > endTime)) {
+ endTime = (*i)->getEndMarkerTime();
+ }
+ }
+
+ RescaleDialog dialog(m_view, &m_doc->getComposition(),
+ startTime, endTime - startTime,
+ false, false);
+ if (dialog.exec() != QDialog::Accepted)
+ return ;
+
+ std::vector<AudioSegmentRescaleCommand *> asrcs;
+
+ int mult = dialog.getNewDuration();
+ int div = endTime - startTime;
+ float ratio = float(mult) / float(div);
+
+ std::cerr << "slotRescaleSelection: mult = " << mult << ", div = " << div << ", ratio = " << ratio << std::endl;
+
+ KMacroCommand *command = new KMacroCommand
+ (SegmentRescaleCommand::getGlobalName());
+
+ bool pathTested = false;
+
+ for (SegmentSelection::iterator i = selection.begin();
+ i != selection.end(); ++i) {
+ if ((*i)->getType() == Segment::Audio) {
+ if (!pathTested) {
+ testAudioPath(i18n("rescaling an audio file"));
+ pathTested = true;
+ }
+ AudioSegmentRescaleCommand *asrc = new AudioSegmentRescaleCommand
+ (m_doc, *i, ratio);
+ command->addCommand(asrc);
+ asrcs.push_back(asrc);
+ } else {
+ command->addCommand(new SegmentRescaleCommand(*i, mult, div));
+ }
+ }
+
+ ProgressDialog *progressDlg = 0;
+
+ if (!asrcs.empty()) {
+ progressDlg = new ProgressDialog
+ (i18n("Rescaling audio file..."), 100, this);
+ progressDlg->setAutoClose(false);
+ progressDlg->setAutoReset(false);
+ progressDlg->show();
+ for (size_t i = 0; i < asrcs.size(); ++i) {
+ asrcs[i]->connectProgressDialog(progressDlg);
+ }
+ }
+
+ m_view->slotAddCommandToHistory(command);
+
+ if (!asrcs.empty()) {
+
+ progressDlg->setLabel(i18n("Generating audio preview..."));
+
+ for (size_t i = 0; i < asrcs.size(); ++i) {
+ asrcs[i]->disconnectProgressDialog(progressDlg);
+ }
+
+ connect(&m_doc->getAudioFileManager(), SIGNAL(setProgress(int)),
+ progressDlg->progressBar(), SLOT(setValue(int)));
+ connect(progressDlg, SIGNAL(cancelClicked()),
+ &m_doc->getAudioFileManager(), SLOT(slotStopPreview()));
+
+ for (size_t i = 0; i < asrcs.size(); ++i) {
+ int fid = asrcs[i]->getNewAudioFileId();
+ if (fid >= 0) {
+ slotAddAudioFile(fid);
+ m_doc->getAudioFileManager().generatePreview(fid);
+ }
+ }
+ }
+
+ if (progressDlg) delete progressDlg;
+}
+
+bool
+RosegardenGUIApp::testAudioPath(QString op)
+{
+ try {
+ m_doc->getAudioFileManager().testAudioPath();
+ } catch (AudioFileManager::BadAudioPathException) {
+ if (KMessageBox::warningContinueCancel
+ (this,
+ i18n("The audio file path does not exist or is not writable.\nYou must set the audio file path to a valid directory in Document Properties before %1.\nWould you like to set it now?").arg(op),
+ i18n("Warning"),
+ i18n("Set audio file path")) == KMessageBox::Continue) {
+ slotOpenAudioPathSettings();
+ }
+ return false;
+ }
+ return true;
+}
+
+void RosegardenGUIApp::slotAutoSplitSelection()
+{
+ if (!m_view->haveSelection())
+ return ;
+
+ //!!! this should all be in rosegardenguiview
+ //!!! or should it?
+
+ SegmentSelection selection = m_view->getSelection();
+
+ KMacroCommand *command = new KMacroCommand
+ (SegmentAutoSplitCommand::getGlobalName());
+
+ for (SegmentSelection::iterator i = selection.begin();
+ i != selection.end(); ++i) {
+
+ if ((*i)->getType() == Segment::Audio) {
+ AudioSplitDialog aSD(this, (*i), m_doc);
+
+ if (aSD.exec() == QDialog::Accepted) {
+ // split to threshold
+ //
+ command->addCommand(
+ new AudioSegmentAutoSplitCommand(m_doc,
+ *i,
+ aSD.getThreshold()));
+ // dmm - verifying that widget->value() accessors *can* work without crashing
+ // std::cout << "SILVAN: getThreshold() = " << aSD.getThreshold() << std::endl;
+ }
+ } else {
+ command->addCommand(new SegmentAutoSplitCommand(*i));
+ }
+ }
+
+ m_view->slotAddCommandToHistory(command);
+}
+
+void RosegardenGUIApp::slotJogLeft()
+{
+ RG_DEBUG << "RosegardenGUIApp::slotJogLeft" << endl;
+ jogSelection( -Note(Note::Demisemiquaver).getDuration());
+}
+
+void RosegardenGUIApp::slotJogRight()
+{
+ RG_DEBUG << "RosegardenGUIApp::slotJogRight" << endl;
+ jogSelection(Note(Note::Demisemiquaver).getDuration());
+}
+
+void RosegardenGUIApp::jogSelection(timeT amount)
+{
+ if (!m_view->haveSelection())
+ return ;
+
+ SegmentSelection selection = m_view->getSelection();
+
+ SegmentReconfigureCommand *command = new SegmentReconfigureCommand(i18n("Jog Selection"));
+
+ for (SegmentSelection::iterator i = selection.begin();
+ i != selection.end(); ++i) {
+
+ command->addSegment((*i),
+ (*i)->getStartTime() + amount,
+ (*i)->getEndMarkerTime() + amount,
+ (*i)->getTrack());
+ }
+
+ m_view->slotAddCommandToHistory(command);
+}
+
+void RosegardenGUIApp::createAndSetupTransport()
+{
+ // create the Transport GUI and add the callbacks to the
+ // buttons and keyboard accelerators
+ //
+ m_transport =
+ new TransportDialog(this);
+ plugAccelerators(m_transport, m_transport->getAccelerators());
+
+ m_transport->getAccelerators()->connectItem
+ (m_transport->getAccelerators()->insertItem(Key_T),
+ this,
+ SLOT(slotHideTransport()));
+
+ // Ensure that the checkbox is unchecked if the dialog
+ // is closed
+ connect(m_transport, SIGNAL(closed()),
+ SLOT(slotCloseTransport()));
+
+ // Handle loop setting and unsetting from the transport loop button
+ //
+
+ connect(m_transport, SIGNAL(setLoop()), SLOT(slotSetLoop()));
+ connect(m_transport, SIGNAL(unsetLoop()), SLOT(slotUnsetLoop()));
+ connect(m_transport, SIGNAL(panic()), SLOT(slotPanic()));
+
+ connect(m_transport, SIGNAL(editTempo(QWidget*)),
+ SLOT(slotEditTempo(QWidget*)));
+
+ connect(m_transport, SIGNAL(editTimeSignature(QWidget*)),
+ SLOT(slotEditTimeSignature(QWidget*)));
+
+ connect(m_transport, SIGNAL(editTransportTime(QWidget*)),
+ SLOT(slotEditTransportTime(QWidget*)));
+
+ // Handle set loop start/stop time buttons.
+ //
+ connect(m_transport, SIGNAL(setLoopStartTime()), SLOT(slotSetLoopStart()));
+ connect(m_transport, SIGNAL(setLoopStopTime()), SLOT(slotSetLoopStop()));
+
+ if (m_seqManager != 0)
+ m_seqManager->setTransport(m_transport);
+
+}
+
+void RosegardenGUIApp::slotSplitSelectionByPitch()
+{
+ if (!m_view->haveSelection())
+ return ;
+
+ SplitByPitchDialog dialog(m_view);
+ if (dialog.exec() != QDialog::Accepted)
+ return ;
+
+ SegmentSelection selection = m_view->getSelection();
+
+ KMacroCommand *command = new KMacroCommand
+ (SegmentSplitByPitchCommand::getGlobalName());
+
+ bool haveSomething = false;
+
+ for (SegmentSelection::iterator i = selection.begin();
+ i != selection.end(); ++i) {
+
+ if ((*i)->getType() == Segment::Audio) {
+ // nothing
+ } else {
+ command->addCommand
+ (new SegmentSplitByPitchCommand
+ (*i,
+ dialog.getPitch(),
+ dialog.getShouldRange(),
+ dialog.getShouldDuplicateNonNoteEvents(),
+ (SegmentSplitByPitchCommand::ClefHandling)
+ dialog.getClefHandling()));
+ haveSomething = true;
+ }
+ }
+
+ if (haveSomething)
+ m_view->slotAddCommandToHistory(command);
+ //!!! else complain
+}
+
+void
+RosegardenGUIApp::slotSplitSelectionByRecordedSrc()
+{
+ if (!m_view->haveSelection())
+ return ;
+
+ SplitByRecordingSrcDialog dialog(m_view, m_doc);
+ if (dialog.exec() != QDialog::Accepted)
+ return ;
+
+ SegmentSelection selection = m_view->getSelection();
+
+ KMacroCommand *command = new KMacroCommand
+ (SegmentSplitByRecordingSrcCommand::getGlobalName());
+
+ bool haveSomething = false;
+
+ for (SegmentSelection::iterator i = selection.begin();
+ i != selection.end(); ++i) {
+
+ if ((*i)->getType() == Segment::Audio) {
+ // nothing
+ } else {
+ command->addCommand
+ (new SegmentSplitByRecordingSrcCommand(*i,
+ dialog.getChannel(),
+ dialog.getDevice()));
+ haveSomething = true;
+ }
+ }
+ if (haveSomething)
+ m_view->slotAddCommandToHistory(command);
+}
+
+void
+RosegardenGUIApp::slotSplitSelectionAtTime()
+{
+ if (!m_view->haveSelection())
+ return ;
+
+ SegmentSelection selection = m_view->getSelection();
+ if (selection.empty())
+ return ;
+
+ timeT now = m_doc->getComposition().getPosition();
+
+ QString title = i18n("Split Segment at Time",
+ "Split %n Segments at Time",
+ selection.size());
+
+ TimeDialog dialog(m_view, title,
+ &m_doc->getComposition(),
+ now, true);
+
+ KMacroCommand *command = new KMacroCommand( title );
+
+ if (dialog.exec() == QDialog::Accepted) {
+ for (SegmentSelection::iterator i = selection.begin();
+ i != selection.end(); ++i) {
+
+ if ((*i)->getType() == Segment::Audio) {
+ command->addCommand(new AudioSegmentSplitCommand(*i, dialog.getTime()));
+ } else {
+ command->addCommand(new SegmentSplitCommand(*i, dialog.getTime()));
+ }
+ }
+ m_view->slotAddCommandToHistory(command);
+ }
+}
+
+void
+RosegardenGUIApp::slotSetSegmentStartTimes()
+{
+ if (!m_view->haveSelection())
+ return ;
+
+ SegmentSelection selection = m_view->getSelection();
+ if (selection.empty())
+ return ;
+
+ timeT someTime = (*selection.begin())->getStartTime();
+
+ TimeDialog dialog(m_view, i18n("Segment Start Time"),
+ &m_doc->getComposition(),
+ someTime, false);
+
+ if (dialog.exec() == QDialog::Accepted) {
+
+ bool plural = (selection.size() > 1);
+
+ SegmentReconfigureCommand *command =
+ new SegmentReconfigureCommand(plural ?
+ i18n("Set Segment Start Times") :
+ i18n("Set Segment Start Time"));
+
+ for (SegmentSelection::iterator i = selection.begin();
+ i != selection.end(); ++i) {
+
+ command->addSegment
+ (*i, dialog.getTime(),
+ (*i)->getEndMarkerTime() - (*i)->getStartTime() + dialog.getTime(),
+ (*i)->getTrack());
+ }
+
+ m_view->slotAddCommandToHistory(command);
+ }
+}
+
+void
+RosegardenGUIApp::slotSetSegmentDurations()
+{
+ if (!m_view->haveSelection())
+ return ;
+
+ SegmentSelection selection = m_view->getSelection();
+ if (selection.empty())
+ return ;
+
+ timeT someTime =
+ (*selection.begin())->getStartTime();
+
+ timeT someDuration =
+ (*selection.begin())->getEndMarkerTime() -
+ (*selection.begin())->getStartTime();
+
+ TimeDialog dialog(m_view, i18n("Segment Duration"),
+ &m_doc->getComposition(),
+ someTime,
+ someDuration,
+ false);
+
+ if (dialog.exec() == QDialog::Accepted) {
+
+ bool plural = (selection.size() > 1);
+
+ SegmentReconfigureCommand *command =
+ new SegmentReconfigureCommand(plural ?
+ i18n("Set Segment Durations") :
+ i18n("Set Segment Duration"));
+
+ for (SegmentSelection::iterator i = selection.begin();
+ i != selection.end(); ++i) {
+
+ command->addSegment
+ (*i, (*i)->getStartTime(),
+ (*i)->getStartTime() + dialog.getTime(),
+ (*i)->getTrack());
+ }
+
+ m_view->slotAddCommandToHistory(command);
+ }
+}
+
+void RosegardenGUIApp::slotHarmonizeSelection()
+{
+ if (!m_view->haveSelection())
+ return ;
+
+ SegmentSelection selection = m_view->getSelection();
+ //!!! This should be somewhere else too
+
+ CompositionTimeSliceAdapter adapter(&m_doc->getComposition(),
+ &selection);
+
+ AnalysisHelper helper;
+ Segment *segment = new Segment;
+ helper.guessHarmonies(adapter, *segment);
+
+ //!!! do nothing with the results yet
+ delete segment;
+}
+
+void RosegardenGUIApp::slotTempoToSegmentLength()
+{
+ slotTempoToSegmentLength(this);
+}
+
+void RosegardenGUIApp::slotTempoToSegmentLength(QWidget* parent)
+{
+ RG_DEBUG << "RosegardenGUIApp::slotTempoToSegmentLength" << endl;
+
+ if (!m_view->haveSelection())
+ return ;
+
+ SegmentSelection selection = m_view->getSelection();
+
+ // Only set for a single selection
+ //
+ if (selection.size() == 1 &&
+ (*selection.begin())->getType() == Segment::Audio) {
+ Composition &comp = m_doc->getComposition();
+ Segment *seg = *selection.begin();
+
+ TimeSignature timeSig =
+ comp.getTimeSignatureAt( seg->getStartTime());
+
+ timeT endTime = seg->getEndTime();
+
+ if (seg->getRawEndMarkerTime())
+ endTime = seg->getEndMarkerTime();
+
+ RealTime segDuration =
+ seg->getAudioEndTime() - seg->getAudioStartTime();
+
+ int beats = 0;
+
+ // Get user to tell us how many beats or bars the segment contains
+ BeatsBarsDialog dialog(parent);
+ if (dialog.exec() == QDialog::Accepted) {
+ beats = dialog.getQuantity(); // beats (or bars)
+ if (dialog.getMode() == 1) // bars (multiply by time sig)
+ beats *= timeSig.getBeatsPerBar();
+#ifdef DEBUG_TEMPO_FROM_AUDIO
+
+ RG_DEBUG << "RosegardenGUIApp::slotTempoToSegmentLength - beats = " << beats
+ << " mode = " << ((dialog.getMode() == 0) ? "bars" : "beats") << endl
+ << " beats per bar = " << timeSig.getBeatsPerBar()
+ << " user quantity = " << dialog.getQuantity()
+ << " user mode = " << dialog.getMode() << endl;
+#endif
+
+ } else {
+ RG_DEBUG << "RosegardenGUIApp::slotTempoToSegmentLength - BeatsBarsDialog aborted"
+ << endl;
+ return ;
+ }
+
+ double beatLengthUsec =
+ double(segDuration.sec * 1000000 + segDuration.usec()) /
+ double(beats);
+
+ // New tempo is a minute divided by time of beat
+ // converted up (#1414252) to a sane value via getTempoFoQpm()
+ //
+ tempoT newTempo =
+ comp.getTempoForQpm(60.0 * 1000000.0 / beatLengthUsec);
+
+#ifdef DEBUG_TEMPO_FROM_AUDIO
+
+ RG_DEBUG << "RosegardenGUIApp::slotTempoToSegmentLength info: " << endl
+ << " beatLengthUsec = " << beatLengthUsec << endl
+ << " segDuration.usec = " << segDuration.usec() << endl
+ << " newTempo = " << newTempo << endl;
+#endif
+
+ KMacroCommand *macro = new KMacroCommand(i18n("Set Global Tempo"));
+
+ // Remove all tempo changes in reverse order so as the index numbers
+ // don't becoming meaningless as the command gets unwound.
+ //
+ for (int i = 0; i < comp.getTempoChangeCount(); i++)
+ macro->addCommand(new RemoveTempoChangeCommand(&comp,
+ (comp.getTempoChangeCount() - 1 - i)));
+
+ // add tempo change at time zero
+ //
+ macro->addCommand(new AddTempoChangeCommand(&comp, 0, newTempo));
+
+ // execute
+ m_doc->getCommandHistory()->addCommand(macro);
+ }
+}
+
+void RosegardenGUIApp::slotToggleSegmentLabels()
+{
+ KToggleAction* act = dynamic_cast<KToggleAction*>(actionCollection()->action("show_segment_labels"));
+ if (act) {
+ m_view->slotShowSegmentLabels(act->isChecked());
+ }
+}
+
+void RosegardenGUIApp::slotEdit()
+{
+ m_view->slotEditSegment(0);
+}
+
+void RosegardenGUIApp::slotEditAsNotation()
+{
+ m_view->slotEditSegmentNotation(0);
+}
+
+void RosegardenGUIApp::slotEditInMatrix()
+{
+ m_view->slotEditSegmentMatrix(0);
+}
+
+void RosegardenGUIApp::slotEditInPercussionMatrix()
+{
+ m_view->slotEditSegmentPercussionMatrix(0);
+}
+
+void RosegardenGUIApp::slotEditInEventList()
+{
+ m_view->slotEditSegmentEventList(0);
+}
+
+void RosegardenGUIApp::slotEditTempos()
+{
+ slotEditTempos(m_doc->getComposition().getPosition());
+}
+
+void RosegardenGUIApp::slotToggleToolBar()
+{
+ KTmpStatusMsg msg(i18n("Toggle the toolbar..."), this);
+
+ if (m_viewToolBar->isChecked())
+ toolBar("mainToolBar")->show();
+ else
+ toolBar("mainToolBar")->hide();
+}
+
+void RosegardenGUIApp::slotToggleToolsToolBar()
+{
+ KTmpStatusMsg msg(i18n("Toggle the tools toolbar..."), this);
+
+ if (m_viewToolsToolBar->isChecked())
+ toolBar("Tools Toolbar")->show();
+ else
+ toolBar("Tools Toolbar")->hide();
+}
+
+void RosegardenGUIApp::slotToggleTracksToolBar()
+{
+ KTmpStatusMsg msg(i18n("Toggle the tracks toolbar..."), this);
+
+ if (m_viewTracksToolBar->isChecked())
+ toolBar("Tracks Toolbar")->show();
+ else
+ toolBar("Tracks Toolbar")->hide();
+}
+
+void RosegardenGUIApp::slotToggleEditorsToolBar()
+{
+ KTmpStatusMsg msg(i18n("Toggle the editor toolbar..."), this);
+
+ if (m_viewEditorsToolBar->isChecked())
+ toolBar("Editors Toolbar")->show();
+ else
+ toolBar("Editors Toolbar")->hide();
+}
+
+void RosegardenGUIApp::slotToggleTransportToolBar()
+{
+ KTmpStatusMsg msg(i18n("Toggle the transport toolbar..."), this);
+
+ if (m_viewTransportToolBar->isChecked())
+ toolBar("Transport Toolbar")->show();
+ else
+ toolBar("Transport Toolbar")->hide();
+}
+
+void RosegardenGUIApp::slotToggleZoomToolBar()
+{
+ KTmpStatusMsg msg(i18n("Toggle the zoom toolbar..."), this);
+
+ if (m_viewZoomToolBar->isChecked())
+ toolBar("Zoom Toolbar")->show();
+ else
+ toolBar("Zoom Toolbar")->hide();
+}
+
+void RosegardenGUIApp::slotToggleTransport()
+{
+ KTmpStatusMsg msg(i18n("Toggle the Transport"), this);
+
+ if (m_viewTransport->isChecked()) {
+ getTransport()->show();
+ getTransport()->raise();
+ getTransport()->blockSignals(false);
+ } else {
+ getTransport()->hide();
+ getTransport()->blockSignals(true);
+ }
+}
+
+void RosegardenGUIApp::slotHideTransport()
+{
+ if (m_viewTransport->isChecked()) {
+ m_viewTransport->blockSignals(true);
+ m_viewTransport->setChecked(false);
+ m_viewTransport->blockSignals(false);
+ }
+ getTransport()->hide();
+ getTransport()->blockSignals(true);
+}
+
+void RosegardenGUIApp::slotToggleTrackLabels()
+{
+ if (m_viewTrackLabels->isChecked()) {
+#ifdef SETTING_LOG_DEBUG
+ _settingLog("toggle track labels on");
+#endif
+
+ m_view->getTrackEditor()->getTrackButtons()->
+ changeTrackInstrumentLabels(TrackLabel::ShowTrack);
+ } else {
+#ifdef SETTING_LOG_DEBUG
+ _settingLog("toggle track labels off");
+#endif
+
+ m_view->getTrackEditor()->getTrackButtons()->
+ changeTrackInstrumentLabels(TrackLabel::ShowInstrument);
+ }
+}
+
+void RosegardenGUIApp::slotToggleRulers()
+{
+ m_view->slotShowRulers(m_viewRulers->isChecked());
+}
+
+void RosegardenGUIApp::slotToggleTempoRuler()
+{
+ m_view->slotShowTempoRuler(m_viewTempoRuler->isChecked());
+}
+
+void RosegardenGUIApp::slotToggleChordNameRuler()
+{
+ m_view->slotShowChordNameRuler(m_viewChordNameRuler->isChecked());
+}
+
+void RosegardenGUIApp::slotTogglePreviews()
+{
+ m_view->slotShowPreviews(m_viewPreviews->isChecked());
+}
+
+void RosegardenGUIApp::slotDockParametersBack()
+{
+ m_dockLeft->dockBack();
+}
+
+void RosegardenGUIApp::slotParametersClosed()
+{
+ stateChanged("parametersbox_closed");
+ m_dockVisible = false;
+}
+
+void RosegardenGUIApp::slotParametersDockedBack(KDockWidget* dw, KDockWidget::DockPosition)
+{
+ if (dw == m_dockLeft) {
+ stateChanged("parametersbox_closed", KXMLGUIClient::StateReverse);
+ m_dockVisible = true;
+ }
+}
+
+void RosegardenGUIApp::slotToggleStatusBar()
+{
+ KTmpStatusMsg msg(i18n("Toggle the statusbar..."), this);
+
+ if (!m_viewStatusBar->isChecked())
+ statusBar()->hide();
+ else
+ statusBar()->show();
+}
+
+void RosegardenGUIApp::slotStatusMsg(QString text)
+{
+ ///////////////////////////////////////////////////////////////////
+ // change status message permanently
+ statusBar()->clear();
+ statusBar()->changeItem(text, EditViewBase::ID_STATUS_MSG);
+}
+
+void RosegardenGUIApp::slotStatusHelpMsg(QString text)
+{
+ ///////////////////////////////////////////////////////////////////
+ // change status message of whole statusbar temporary (text, msec)
+ statusBar()->message(text, 2000);
+}
+
+void RosegardenGUIApp::slotEnableTransport(bool enable)
+{
+ if (m_transport)
+ getTransport()->setEnabled(enable);
+}
+
+void RosegardenGUIApp::slotPointerSelected()
+{
+ m_view->selectTool(SegmentSelector::ToolName);
+}
+
+void RosegardenGUIApp::slotEraseSelected()
+{
+ m_view->selectTool(SegmentEraser::ToolName);
+}
+
+void RosegardenGUIApp::slotDrawSelected()
+{
+ m_view->selectTool(SegmentPencil::ToolName);
+}
+
+void RosegardenGUIApp::slotMoveSelected()
+{
+ m_view->selectTool(SegmentMover::ToolName);
+}
+
+void RosegardenGUIApp::slotResizeSelected()
+{
+ m_view->selectTool(SegmentResizer::ToolName);
+}
+
+void RosegardenGUIApp::slotJoinSelected()
+{
+ KMessageBox::information(this,
+ i18n("The join tool isn't implemented yet. Instead please highlight "
+ "the segments you want to join and then use the menu option:\n\n"
+ " Segments->Collapse Segments.\n"),
+ i18n("Join tool not yet implemented"));
+
+ m_view->selectTool(SegmentJoiner::ToolName);
+}
+
+void RosegardenGUIApp::slotSplitSelected()
+{
+ m_view->selectTool(SegmentSplitter::ToolName);
+}
+
+void RosegardenGUIApp::slotAddTrack()
+{
+ if (!m_view)
+ return ;
+
+ // default to the base number - might not actually exist though
+ //
+ InstrumentId id = MidiInstrumentBase;
+
+ // Get the first Internal/MIDI instrument
+ //
+ DeviceList *devices = m_doc->getStudio().getDevices();
+ bool have = false;
+
+ for (DeviceList::iterator it = devices->begin();
+ it != devices->end() && !have; it++) {
+
+ if ((*it)->getType() != Device::Midi)
+ continue;
+
+ InstrumentList instruments = (*it)->getAllInstruments();
+ for (InstrumentList::iterator iit = instruments.begin();
+ iit != instruments.end(); iit++) {
+
+ if ((*iit)->getId() >= MidiInstrumentBase) {
+ id = (*iit)->getId();
+ have = true;
+ break;
+ }
+ }
+ }
+
+ Composition &comp = m_doc->getComposition();
+ TrackId trackId = comp.getSelectedTrack();
+ Track *track = comp.getTrackById(trackId);
+
+ int pos = -1;
+ if (track) pos = track->getPosition() + 1;
+
+ m_view->slotAddTracks(1, id, pos);
+}
+
+void RosegardenGUIApp::slotAddTracks()
+{
+ if (!m_view)
+ return ;
+
+ // default to the base number - might not actually exist though
+ //
+ InstrumentId id = MidiInstrumentBase;
+
+ // Get the first Internal/MIDI instrument
+ //
+ DeviceList *devices = m_doc->getStudio().getDevices();
+ bool have = false;
+
+ for (DeviceList::iterator it = devices->begin();
+ it != devices->end() && !have; it++) {
+
+ if ((*it)->getType() != Device::Midi)
+ continue;
+
+ InstrumentList instruments = (*it)->getAllInstruments();
+ for (InstrumentList::iterator iit = instruments.begin();
+ iit != instruments.end(); iit++) {
+
+ if ((*iit)->getId() >= MidiInstrumentBase) {
+ id = (*iit)->getId();
+ have = true;
+ break;
+ }
+ }
+ }
+
+ Composition &comp = m_doc->getComposition();
+ TrackId trackId = comp.getSelectedTrack();
+ Track *track = comp.getTrackById(trackId);
+
+ int pos = 0;
+ if (track) pos = track->getPosition();
+
+ bool ok = false;
+
+ AddTracksDialog dialog(this, pos);
+
+ if (dialog.exec() == QDialog::Accepted) {
+ m_view->slotAddTracks(dialog.getTracks(), id,
+ dialog.getInsertPosition());
+ }
+}
+
+void RosegardenGUIApp::slotDeleteTrack()
+{
+ if (!m_view)
+ return ;
+
+ Composition &comp = m_doc->getComposition();
+ TrackId trackId = comp.getSelectedTrack();
+ Track *track = comp.getTrackById(trackId);
+
+ RG_DEBUG << "RosegardenGUIApp::slotDeleteTrack() : about to delete track id "
+ << trackId << endl;
+
+ if (track == 0)
+ return ;
+
+ // Always have at least one track in a composition
+ //
+ if (comp.getNbTracks() == 1)
+ return ;
+
+ // VLADA
+ if (m_view->haveSelection()) {
+
+ SegmentSelection selection = m_view->getSelection();
+ m_view->slotSelectTrackSegments(trackId);
+ m_view->getTrackEditor()->slotDeleteSelectedSegments();
+ m_view->slotPropagateSegmentSelection(selection);
+
+ } else {
+
+ m_view->slotSelectTrackSegments(trackId);
+ m_view->getTrackEditor()->slotDeleteSelectedSegments();
+ }
+ //VLADA
+
+ int position = track->getPosition();
+
+ // Delete the track
+ //
+ std::vector<TrackId> tracks;
+ tracks.push_back(trackId);
+
+ m_view->slotDeleteTracks(tracks);
+
+ // Select a new valid track
+ //
+ if (comp.getTrackByPosition(position))
+ trackId = comp.getTrackByPosition(position)->getId();
+ else if (comp.getTrackByPosition(position - 1))
+ trackId = comp.getTrackByPosition(position - 1)->getId();
+ else {
+ RG_DEBUG << "RosegardenGUIApp::slotDeleteTrack - "
+ << "can't select a highlighted track after delete"
+ << endl;
+ }
+
+ comp.setSelectedTrack(trackId);
+
+ Instrument *inst = m_doc->getStudio().
+ getInstrumentById(comp.getTrackById(trackId)->getInstrument());
+
+ //VLADA
+ // m_view->slotSelectTrackSegments(trackId);
+ //VLADA
+}
+
+void RosegardenGUIApp::slotMoveTrackDown()
+{
+ RG_DEBUG << "RosegardenGUIApp::slotMoveTrackDown" << endl;
+
+ Composition &comp = m_doc->getComposition();
+ Track *srcTrack = comp.getTrackById(comp.getSelectedTrack());
+
+ // Check for track object
+ //
+ if (srcTrack == 0)
+ return ;
+
+ // Check destination track exists
+ //
+ Track *destTrack =
+ comp.getTrackByPosition(srcTrack->getPosition() + 1);
+
+ if (destTrack == 0)
+ return ;
+
+ MoveTracksCommand *command =
+ new MoveTracksCommand(&comp, srcTrack->getId(), destTrack->getId());
+
+ m_doc->getCommandHistory()->addCommand(command);
+
+ // make sure we're showing the right selection
+ m_view->slotSelectTrackSegments(comp.getSelectedTrack());
+
+}
+
+void RosegardenGUIApp::slotMoveTrackUp()
+{
+ RG_DEBUG << "RosegardenGUIApp::slotMoveTrackUp" << endl;
+
+ Composition &comp = m_doc->getComposition();
+ Track *srcTrack = comp.getTrackById(comp.getSelectedTrack());
+
+ // Check for track object
+ //
+ if (srcTrack == 0)
+ return ;
+
+ // Check we're not at the top already
+ //
+ if (srcTrack->getPosition() == 0)
+ return ;
+
+ // Check destination track exists
+ //
+ Track *destTrack =
+ comp.getTrackByPosition(srcTrack->getPosition() - 1);
+
+ if (destTrack == 0)
+ return ;
+
+ MoveTracksCommand *command =
+ new MoveTracksCommand(&comp, srcTrack->getId(), destTrack->getId());
+
+ m_doc->getCommandHistory()->addCommand(command);
+
+ // make sure we're showing the right selection
+ m_view->slotSelectTrackSegments(comp.getSelectedTrack());
+}
+
+void RosegardenGUIApp::slotRevertToSaved()
+{
+ RG_DEBUG << "RosegardenGUIApp::slotRevertToSaved" << endl;
+
+ if (m_doc->isModified()) {
+ int revert =
+ KMessageBox::questionYesNo(this,
+ i18n("Revert modified document to previous saved version?"));
+
+ if (revert == KMessageBox::No)
+ return ;
+
+ openFile(m_doc->getAbsFilePath());
+ }
+}
+
+void RosegardenGUIApp::slotImportProject()
+{
+ if (m_doc && !m_doc->saveIfModified())
+ return ;
+
+ KURL url = KFileDialog::getOpenURL
+ (":RGPROJECT",
+ i18n("*.rgp|Rosegarden Project files\n*|All files"), this,
+ i18n("Import Rosegarden Project File"));
+ if (url.isEmpty()) {
+ return ;
+ }
+
+ QString tmpfile;
+ KIO::NetAccess::download(url, tmpfile, this);
+
+ importProject(tmpfile);
+
+ KIO::NetAccess::removeTempFile(tmpfile);
+}
+
+void RosegardenGUIApp::importProject(QString filePath)
+{
+ KProcess *proc = new KProcess;
+ *proc << "rosegarden-project-package";
+ *proc << "--unpack";
+ *proc << filePath;
+
+ KStartupLogo::hideIfStillThere();
+ proc->start(KProcess::Block, KProcess::All);
+
+ if (!proc->normalExit() || proc->exitStatus()) {
+ CurrentProgressDialog::freeze();
+ KMessageBox::sorry(this, i18n("Failed to import project file \"%1\"").arg(filePath));
+ CurrentProgressDialog::thaw();
+ delete proc;
+ return ;
+ }
+
+ delete proc;
+
+ QString rgFile = filePath;
+ rgFile.replace(QRegExp(".rg.rgp$"), ".rg");
+ rgFile.replace(QRegExp(".rgp$"), ".rg");
+ openURL(rgFile);
+}
+
+void RosegardenGUIApp::slotImportMIDI()
+{
+ if (m_doc && !m_doc->saveIfModified())
+ return ;
+
+ KURL url = KFileDialog::getOpenURL
+ (":MIDI",
+ "audio/x-midi", this,
+ i18n("Open MIDI File"));
+ if (url.isEmpty()) {
+ return ;
+ }
+
+ QString tmpfile;
+ KIO::NetAccess::download(url, tmpfile, this);
+ openFile(tmpfile, ImportMIDI); // does everything including setting the document
+
+ KIO::NetAccess::removeTempFile( tmpfile );
+}
+
+void RosegardenGUIApp::slotMergeMIDI()
+{
+ KURL url = KFileDialog::getOpenURL
+ (":MIDI",
+ "audio/x-midi", this,
+ i18n("Merge MIDI File"));
+ if (url.isEmpty()) {
+ return ;
+ }
+
+ QString tmpfile;
+ KIO::NetAccess::download(url, tmpfile, this);
+ mergeFile(tmpfile, ImportMIDI);
+
+ KIO::NetAccess::removeTempFile( tmpfile );
+}
+
+QTextCodec *
+RosegardenGUIApp::guessTextCodec(std::string text)
+{
+ QTextCodec *codec = 0;
+
+ for (int c = 0; c < text.length(); ++c) {
+ if (text[c] & 0x80) {
+
+ CurrentProgressDialog::freeze();
+ KStartupLogo::hideIfStillThere();
+
+ IdentifyTextCodecDialog dialog(0, text);
+ dialog.exec();
+
+ std::string codecName = dialog.getCodec();
+
+ CurrentProgressDialog::thaw();
+
+ if (codecName != "") {
+ codec = QTextCodec::codecForName(codecName.c_str());
+ }
+ break;
+ }
+ }
+
+ return codec;
+}
+
+void
+RosegardenGUIApp::fixTextEncodings(Composition *c)
+
+{
+ QTextCodec *codec = 0;
+
+ for (Composition::iterator i = c->begin();
+ i != c->end(); ++i) {
+
+ for (Segment::iterator j = (*i)->begin();
+ j != (*i)->end(); ++j) {
+
+ if ((*j)->isa(Text::EventType)) {
+
+ std::string text;
+
+ if ((*j)->get
+ <String>
+ (Text::TextPropertyName, text)) {
+
+ if (!codec)
+ codec = guessTextCodec(text);
+
+ if (codec) {
+ (*j)->set
+ <String>
+ (Text::TextPropertyName,
+ convertFromCodec(text, codec));
+ }
+ }
+ }
+ }
+ }
+
+ if (!codec)
+ codec = guessTextCodec(c->getCopyrightNote());
+ if (codec)
+ c->setCopyrightNote(convertFromCodec(c->getCopyrightNote(), codec));
+
+ for (Composition::trackcontainer::iterator i =
+ c->getTracks().begin(); i != c->getTracks().end(); ++i) {
+ if (!codec)
+ codec = guessTextCodec(i->second->getLabel());
+ if (codec)
+ i->second->setLabel(convertFromCodec(i->second->getLabel(), codec));
+ }
+
+ for (Composition::iterator i = c->begin(); i != c->end(); ++i) {
+ if (!codec)
+ codec = guessTextCodec((*i)->getLabel());
+ if (codec)
+ (*i)->setLabel(convertFromCodec((*i)->getLabel(), codec));
+ }
+}
+
+RosegardenGUIDoc*
+RosegardenGUIApp::createDocumentFromMIDIFile(QString file)
+{
+ //if (!merge && !m_doc->saveIfModified()) return;
+
+ // Create new document (autoload is inherent)
+ //
+ RosegardenGUIDoc *newDoc = new RosegardenGUIDoc(this, m_pluginManager);
+
+ std::string fname(QFile::encodeName(file));
+
+ MidiFile midiFile(fname,
+ &newDoc->getStudio());
+
+ KStartupLogo::hideIfStillThere();
+ ProgressDialog progressDlg(i18n("Importing MIDI file..."),
+ 200,
+ this);
+
+ CurrentProgressDialog::set
+ (&progressDlg);
+
+ connect(&midiFile, SIGNAL(setProgress(int)),
+ progressDlg.progressBar(), SLOT(setValue(int)));
+
+ connect(&midiFile, SIGNAL(incrementProgress(int)),
+ progressDlg.progressBar(), SLOT(advance(int)));
+
+ if (!midiFile.open()) {
+ CurrentProgressDialog::freeze();
+ KMessageBox::error(this, strtoqstr(midiFile.getError())); //!!! i18n
+ delete newDoc;
+ return 0;
+ }
+
+ midiFile.convertToRosegarden(newDoc->getComposition(),
+ MidiFile::CONVERT_REPLACE);
+
+ fixTextEncodings(&newDoc->getComposition());
+
+ // Set modification flag
+ //
+ newDoc->slotDocumentModified();
+
+ // Set the caption
+ //
+ newDoc->setTitle(QFileInfo(file).fileName());
+ newDoc->setAbsFilePath(QFileInfo(file).absFilePath());
+
+ // Clean up for notation purposes (after reinitialise, because that
+ // sets the composition's end marker time which is needed here)
+
+ progressDlg.slotSetOperationName(i18n("Calculating notation..."));
+ ProgressDialog::processEvents();
+
+ Composition *comp = &newDoc->getComposition();
+
+ for (Composition::iterator i = comp->begin();
+ i != comp->end(); ++i) {
+
+ Segment &segment = **i;
+ SegmentNotationHelper helper(segment);
+ segment.insert(helper.guessClef(segment.begin(),
+ segment.getEndMarker()).getAsEvent
+ (segment.getStartTime()));
+ }
+
+ progressDlg.progressBar()->setProgress(100);
+
+ for (Composition::iterator i = comp->begin();
+ i != comp->end(); ++i) {
+
+ // find first key event in each segment (we'd have done the
+ // same for clefs, except there is no MIDI clef event)
+
+ Segment &segment = **i;
+ timeT firstKeyTime = segment.getEndMarkerTime();
+
+ for (Segment::iterator si = segment.begin();
+ segment.isBeforeEndMarker(si); ++si) {
+ if ((*si)->isa(Rosegarden::Key::EventType)) {
+ firstKeyTime = (*si)->getAbsoluteTime();
+ break;
+ }
+ }
+
+ if (firstKeyTime > segment.getStartTime()) {
+ CompositionTimeSliceAdapter adapter
+ (comp, timeT(0), firstKeyTime);
+ AnalysisHelper helper;
+ segment.insert(helper.guessKey(adapter).getAsEvent
+ (segment.getStartTime()));
+ }
+ }
+
+ int progressPer = 100;
+ if (comp->getNbSegments() > 0)
+ progressPer = (int)(100.0 / double(comp->getNbSegments()));
+
+ KMacroCommand *command = new KMacroCommand(i18n("Calculate Notation"));
+
+ for (Composition::iterator i = comp->begin();
+ i != comp->end(); ++i) {
+
+ Segment &segment = **i;
+ timeT startTime(segment.getStartTime());
+ timeT endTime(segment.getEndMarkerTime());
+
+// std::cerr << "segment: start time " << segment.getStartTime() << ", end time " << segment.getEndTime() << ", end marker time " << segment.getEndMarkerTime() << ", events " << segment.size() << std::endl;
+
+ EventQuantizeCommand *subCommand = new EventQuantizeCommand
+ (segment, startTime, endTime, "Notation Options", true);
+
+ subCommand->setProgressTotal(progressPer + 1);
+ QObject::connect(subCommand, SIGNAL(incrementProgress(int)),
+ progressDlg.progressBar(), SLOT(advance(int)));
+
+ command->addCommand(subCommand);
+ }
+
+ newDoc->getCommandHistory()->addCommand(command);
+
+ if (comp->getTimeSignatureCount() == 0) {
+ CompositionTimeSliceAdapter adapter(comp);
+ AnalysisHelper analysisHelper;
+ TimeSignature timeSig =
+ analysisHelper.guessTimeSignature(adapter);
+ comp->addTimeSignature(0, timeSig);
+ }
+
+ return newDoc;
+}
+
+void RosegardenGUIApp::slotImportRG21()
+{
+ if (m_doc && !m_doc->saveIfModified())
+ return ;
+
+ KURL url = KFileDialog::getOpenURL
+ (":ROSEGARDEN21",
+ i18n("*.rose|Rosegarden-2 files\n*|All files"), this,
+ i18n("Open Rosegarden 2.1 File"));
+ if (url.isEmpty()) {
+ return ;
+ }
+
+ QString tmpfile;
+ KIO::NetAccess::download(url, tmpfile, this);
+ openFile(tmpfile, ImportRG21);
+
+ KIO::NetAccess::removeTempFile(tmpfile);
+}
+
+void RosegardenGUIApp::slotMergeRG21()
+{
+ KURL url = KFileDialog::getOpenURL
+ (":ROSEGARDEN21",
+ i18n("*.rose|Rosegarden-2 files\n*|All files"), this,
+ i18n("Open Rosegarden 2.1 File"));
+ if (url.isEmpty()) {
+ return ;
+ }
+
+ QString tmpfile;
+ KIO::NetAccess::download(url, tmpfile, this);
+ mergeFile(tmpfile, ImportRG21);
+
+ KIO::NetAccess::removeTempFile( tmpfile );
+}
+
+RosegardenGUIDoc*
+RosegardenGUIApp::createDocumentFromRG21File(QString file)
+{
+ KStartupLogo::hideIfStillThere();
+ ProgressDialog progressDlg(
+ i18n("Importing Rosegarden 2.1 file..."), 100, this);
+
+ CurrentProgressDialog::set
+ (&progressDlg);
+
+ // Inherent autoload
+ //
+ RosegardenGUIDoc *newDoc = new RosegardenGUIDoc(this, m_pluginManager);
+
+ RG21Loader rg21Loader(&newDoc->getStudio());
+
+ // TODO: make RG21Loader to actually emit these signals
+ //
+ connect(&rg21Loader, SIGNAL(setProgress(int)),
+ progressDlg.progressBar(), SLOT(setValue(int)));
+
+ connect(&rg21Loader, SIGNAL(incrementProgress(int)),
+ progressDlg.progressBar(), SLOT(advance(int)));
+
+ // "your starter for 40%" - helps the "freeze" work
+ //
+ progressDlg.progressBar()->advance(40);
+
+ if (!rg21Loader.load(file, newDoc->getComposition())) {
+ CurrentProgressDialog::freeze();
+ KMessageBox::error(this,
+ i18n("Can't load Rosegarden 2.1 file. It appears to be corrupted."));
+ delete newDoc;
+ return 0;
+ }
+
+ // Set modification flag
+ //
+ newDoc->slotDocumentModified();
+
+ // Set the caption and add recent
+ //
+ newDoc->setTitle(QFileInfo(file).fileName());
+ newDoc->setAbsFilePath(QFileInfo(file).absFilePath());
+
+ return newDoc;
+
+}
+
+void
+RosegardenGUIApp::slotImportHydrogen()
+{
+ if (m_doc && !m_doc->saveIfModified())
+ return ;
+
+ KURL url = KFileDialog::getOpenURL
+ (":HYDROGEN",
+ i18n("*.h2song|Hydrogen files\n*|All files"), this,
+ i18n("Open Hydrogen File"));
+ if (url.isEmpty()) {
+ return ;
+ }
+
+ QString tmpfile;
+ KIO::NetAccess::download(url, tmpfile, this);
+ openFile(tmpfile, ImportHydrogen);
+
+ KIO::NetAccess::removeTempFile(tmpfile);
+}
+
+void RosegardenGUIApp::slotMergeHydrogen()
+{
+ KURL url = KFileDialog::getOpenURL
+ (":HYDROGEN",
+ i18n("*.h2song|Hydrogen files\n*|All files"), this,
+ i18n("Open Hydrogen File"));
+ if (url.isEmpty()) {
+ return ;
+ }
+
+ QString tmpfile;
+ KIO::NetAccess::download(url, tmpfile, this);
+ mergeFile(tmpfile, ImportHydrogen);
+
+ KIO::NetAccess::removeTempFile( tmpfile );
+}
+
+RosegardenGUIDoc*
+RosegardenGUIApp::createDocumentFromHydrogenFile(QString file)
+{
+ KStartupLogo::hideIfStillThere();
+ ProgressDialog progressDlg(
+ i18n("Importing Hydrogen file..."), 100, this);
+
+ CurrentProgressDialog::set
+ (&progressDlg);
+
+ // Inherent autoload
+ //
+ RosegardenGUIDoc *newDoc = new RosegardenGUIDoc(this, m_pluginManager);
+
+ HydrogenLoader hydrogenLoader(&newDoc->getStudio());
+
+ // TODO: make RG21Loader to actually emit these signals
+ //
+ connect(&hydrogenLoader, SIGNAL(setProgress(int)),
+ progressDlg.progressBar(), SLOT(setValue(int)));
+
+ connect(&hydrogenLoader, SIGNAL(incrementProgress(int)),
+ progressDlg.progressBar(), SLOT(advance(int)));
+
+ // "your starter for 40%" - helps the "freeze" work
+ //
+ progressDlg.progressBar()->advance(40);
+
+ if (!hydrogenLoader.load(file, newDoc->getComposition())) {
+ CurrentProgressDialog::freeze();
+ KMessageBox::error(this,
+ i18n("Can't load Hydrogen file. It appears to be corrupted."));
+ delete newDoc;
+ return 0;
+ }
+
+ // Set modification flag
+ //
+ newDoc->slotDocumentModified();
+
+ // Set the caption and add recent
+ //
+ newDoc->setTitle(QFileInfo(file).fileName());
+ newDoc->setAbsFilePath(QFileInfo(file).absFilePath());
+
+ return newDoc;
+
+}
+
+void
+RosegardenGUIApp::mergeFile(QString filePath, ImportType type)
+{
+ RosegardenGUIDoc *doc = createDocument(filePath, type);
+
+ if (doc) {
+ if (m_doc) {
+
+ bool timingsDiffer = false;
+ Composition &c1 = m_doc->getComposition();
+ Composition &c2 = doc->getComposition();
+
+ // compare tempos and time sigs in the two -- rather laborious
+
+ if (c1.getTimeSignatureCount() != c2.getTimeSignatureCount()) {
+ timingsDiffer = true;
+ } else {
+ for (int i = 0; i < c1.getTimeSignatureCount(); ++i) {
+ std::pair<timeT, TimeSignature> t1 =
+ c1.getTimeSignatureChange(i);
+ std::pair<timeT, TimeSignature> t2 =
+ c2.getTimeSignatureChange(i);
+ if (t1.first != t2.first || t1.second != t2.second) {
+ timingsDiffer = true;
+ break;
+ }
+ }
+ }
+
+ if (c1.getTempoChangeCount() != c2.getTempoChangeCount()) {
+ timingsDiffer = true;
+ } else {
+ for (int i = 0; i < c1.getTempoChangeCount(); ++i) {
+ std::pair<timeT, tempoT> t1 = c1.getTempoChange(i);
+ std::pair<timeT, tempoT> t2 = c2.getTempoChange(i);
+ if (t1.first != t2.first || t1.second != t2.second) {
+ timingsDiffer = true;
+ break;
+ }
+ }
+ }
+
+ FileMergeDialog dialog(this, filePath, timingsDiffer);
+ if (dialog.exec() == QDialog::Accepted) {
+ m_doc->mergeDocument(doc, dialog.getMergeOptions());
+ }
+
+ delete doc;
+
+ } else {
+ setDocument(doc);
+ }
+ }
+}
+
+void
+RosegardenGUIApp::slotUpdatePlaybackPosition()
+{
+ static int callbackCount = 0;
+
+ // Either sequencer mappper or the sequence manager could be missing at
+ // this point.
+ //
+ if (!m_seqManager || !m_seqManager->getSequencerMapper())
+ return ;
+
+ SequencerMapper *mapper = m_seqManager->getSequencerMapper();
+
+ MappedEvent ev;
+ bool haveEvent = mapper->getVisual(ev);
+ if (haveEvent)
+ getTransport()->setMidiOutLabel(&ev);
+
+ RealTime position = mapper->getPositionPointer();
+
+ // std::cerr << "RosegardenGUIApp::slotUpdatePlaybackPosition: mapper pos = " << position << std::endl;
+
+ Composition &comp = m_doc->getComposition();
+ timeT elapsedTime = comp.getElapsedTimeForRealTime(position);
+
+ // std::cerr << "RosegardenGUIApp::slotUpdatePlaybackPosition: mapper timeT = " << elapsedTime << std::endl;
+
+ if (m_seqManager->getTransportStatus() == RECORDING) {
+
+ MappedComposition mC;
+ if (mapper->getRecordedEvents(mC) > 0) {
+ m_seqManager->processAsynchronousMidi(mC, 0);
+ m_doc->insertRecordedMidi(mC);
+ }
+
+ m_doc->updateRecordingMIDISegment();
+ m_doc->updateRecordingAudioSegments();
+ }
+
+ m_originatingJump = true;
+ m_doc->slotSetPointerPosition(elapsedTime);
+ m_originatingJump = false;
+
+ if (m_audioMixer && m_audioMixer->isVisible())
+ m_audioMixer->updateMeters(mapper);
+
+ if (m_midiMixer && m_midiMixer->isVisible())
+ m_midiMixer->updateMeters(mapper);
+
+ m_view->updateMeters(mapper);
+
+ if (++callbackCount == 60) {
+ slotUpdateCPUMeter(true);
+ callbackCount = 0;
+ }
+
+ // if (elapsedTime >= comp.getEndMarker())
+ // slotStop();
+}
+
+void
+RosegardenGUIApp::slotUpdateCPUMeter(bool playing)
+{
+ static std::ifstream *statstream = 0;
+ static bool modified = false;
+ static unsigned long lastBusy = 0, lastIdle = 0;
+
+ if (playing) {
+
+ if (!statstream) {
+ statstream = new std::ifstream("/proc/stat", std::ios::in);
+ }
+
+ if (!statstream || !*statstream)
+ return ;
+ statstream->seekg(0, std::ios::beg);
+
+ std::string cpu;
+ unsigned long user, nice, sys, idle;
+ *statstream >> cpu;
+ *statstream >> user;
+ *statstream >> nice;
+ *statstream >> sys;
+ *statstream >> idle;
+
+ unsigned long busy = user + nice + sys;
+ unsigned long count = 0;
+
+ if (lastBusy > 0) {
+ unsigned long bd = busy - lastBusy;
+ unsigned long id = idle - lastIdle;
+ if (bd + id > 0)
+ count = bd * 100 / (bd + id);
+ if (count > 100)
+ count = 100;
+ }
+
+ lastBusy = busy;
+ lastIdle = idle;
+
+ if (m_progressBar) {
+ if (!modified) {
+ m_progressBar->setTextEnabled(true);
+ m_progressBar->setFormat("CPU");
+ }
+ m_progressBar->setProgress(count);
+ }
+
+ modified = true;
+
+ } else if (modified) {
+ if (m_progressBar) {
+ m_progressBar->setTextEnabled(false);
+ m_progressBar->setFormat("%p%");
+ m_progressBar->setProgress(0);
+ }
+ modified = false;
+ }
+}
+
+void
+RosegardenGUIApp::slotUpdateMonitoring()
+{
+ // Either sequencer mappper or the sequence manager could be missing at
+ // this point.
+ //
+ if (!m_seqManager || !m_seqManager->getSequencerMapper())
+ return ;
+
+ SequencerMapper *mapper = m_seqManager->getSequencerMapper();
+
+ if (m_audioMixer && m_audioMixer->isVisible())
+ m_audioMixer->updateMonitorMeters(mapper);
+
+ if (m_midiMixer && m_midiMixer->isVisible())
+ m_midiMixer->updateMonitorMeter(mapper);
+
+ m_view->updateMonitorMeters(mapper);
+
+ slotUpdateCPUMeter(false);
+}
+
+void RosegardenGUIApp::slotSetPointerPosition(timeT t)
+{
+ Composition &comp = m_doc->getComposition();
+
+ // std::cerr << "RosegardenGUIApp::slotSetPointerPosition: t = " << t << std::endl;
+
+ if (m_seqManager) {
+ if ( m_seqManager->getTransportStatus() == PLAYING ||
+ m_seqManager->getTransportStatus() == RECORDING ) {
+ if (t > comp.getEndMarker()) {
+ if (m_seqManager->getTransportStatus() == PLAYING) {
+
+ slotStop();
+ t = comp.getEndMarker();
+ m_doc->slotSetPointerPosition(t); //causes this method to be re-invoked
+ return ;
+
+ } else { // if recording, increase composition duration
+ std::pair<timeT, timeT> timeRange = comp.getBarRangeForTime(t);
+ timeT barDuration = timeRange.second - timeRange.first;
+ timeT newEndMarker = t + 10 * barDuration;
+ comp.setEndMarker(newEndMarker);
+ getView()->getTrackEditor()->slotReadjustCanvasSize();
+ getView()->getTrackEditor()->updateRulers();
+ }
+ }
+ }
+
+ // cc 20050520 - jump at the sequencer even if we're not playing,
+ // because we might be a transport master of some kind
+ try {
+ if (!m_originatingJump) {
+ m_seqManager->sendSequencerJump(comp.getElapsedRealTime(t));
+ }
+ } catch (QString s) {
+ KMessageBox::error(this, s);
+ }
+ }
+
+ // set the time sig
+ getTransport()->setTimeSignature(comp.getTimeSignatureAt(t));
+
+ // and the tempo
+ getTransport()->setTempo(comp.getTempoAtTime(t));
+
+ // and the time
+ //
+ TransportDialog::TimeDisplayMode mode =
+ getTransport()->getCurrentMode();
+
+ if (mode == TransportDialog::BarMode ||
+ mode == TransportDialog::BarMetronomeMode) {
+
+ slotDisplayBarTime(t);
+
+ } else {
+
+ RealTime rT(comp.getElapsedRealTime(t));
+
+ if (getTransport()->isShowingTimeToEnd()) {
+ rT = rT - comp.getElapsedRealTime(comp.getDuration());
+ }
+
+ if (mode == TransportDialog::RealMode) {
+
+ getTransport()->displayRealTime(rT);
+
+ } else if (mode == TransportDialog::SMPTEMode) {
+
+ getTransport()->displaySMPTETime(rT);
+
+ } else {
+
+ getTransport()->displayFrameTime(rT);
+ }
+ }
+
+ // handle transport mode configuration changes
+ std::string modeAsString = getTransport()->getCurrentModeAsString();
+
+ if (m_doc->getConfiguration().get<String>
+ (DocumentConfiguration::TransportMode) != modeAsString) {
+
+ m_doc->getConfiguration().set<String>
+ (DocumentConfiguration::TransportMode, modeAsString);
+
+ //m_doc->slotDocumentModified(); to avoid being prompted for a file change when merely changing the transport display
+ }
+
+ // Update position on the marker editor if it's available
+ //
+ if (m_markerEditor)
+ m_markerEditor->updatePosition();
+}
+
+void RosegardenGUIApp::slotDisplayBarTime(timeT t)
+{
+ Composition &comp = m_doc->getComposition();
+
+ int barNo = comp.getBarNumber(t);
+ timeT barStart = comp.getBarStart(barNo);
+
+ TimeSignature timeSig = comp.getTimeSignatureAt(t);
+ timeT beatDuration = timeSig.getBeatDuration();
+
+ int beatNo = (t - barStart) / beatDuration;
+ int unitNo = (t - barStart) - (beatNo * beatDuration);
+
+ if (getTransport()->isShowingTimeToEnd()) {
+ barNo = barNo + 1 - comp.getNbBars();
+ beatNo = timeSig.getBeatsPerBar() - 1 - beatNo;
+ unitNo = timeSig.getBeatDuration() - 1 - unitNo;
+ } else {
+ // convert to 1-based display bar numbers
+ barNo += 1;
+ beatNo += 1;
+ }
+
+ // show units in hemidemis (or whatever), not in raw time ticks
+ unitNo /= Note(Note::Shortest).getDuration();
+
+ getTransport()->displayBarTime(barNo, beatNo, unitNo);
+}
+
+void RosegardenGUIApp::slotRefreshTimeDisplay()
+{
+ if ( m_seqManager->getTransportStatus() == PLAYING ||
+ m_seqManager->getTransportStatus() == RECORDING ) {
+ return ; // it'll be refreshed in a moment anyway
+ }
+ slotSetPointerPosition(m_doc->getComposition().getPosition());
+}
+
+bool
+RosegardenGUIApp::isTrackEditorPlayTracking() const
+{
+ return m_view->getTrackEditor()->isTracking();
+}
+
+void RosegardenGUIApp::slotToggleTracking()
+{
+ m_view->getTrackEditor()->slotToggleTracking();
+}
+
+void RosegardenGUIApp::slotTestStartupTester()
+{
+ RG_DEBUG << "RosegardenGUIApp::slotTestStartupTester" << endl;
+
+ if (!m_startupTester) {
+ m_startupTester = new StartupTester();
+ connect(m_startupTester, SIGNAL(newerVersionAvailable(QString)),
+ this, SLOT(slotNewerVersionAvailable(QString)));
+ m_startupTester->start();
+ QTimer::singleShot(100, this, SLOT(slotTestStartupTester()));
+ return ;
+ }
+
+ if (!m_startupTester->isReady()) {
+ QTimer::singleShot(100, this, SLOT(slotTestStartupTester()));
+ return ;
+ }
+
+ QStringList missingFeatures;
+ QStringList allMissing;
+
+ QStringList missing;
+ bool have = m_startupTester->haveProjectPackager(&missing);
+
+ stateChanged("have_project_packager",
+ have ?
+ KXMLGUIClient::StateNoReverse : KXMLGUIClient::StateReverse);
+
+ if (!have) {
+ missingFeatures.push_back(i18n("Export and import of Rosegarden Project files"));
+ if (missing.count() == 0) {
+ allMissing.push_back(i18n("The Rosegarden Project Packager helper script"));
+ } else {
+ for (int i = 0; i < missing.count(); ++i) {
+// if (missingFeatures.count() > 1) {
+ allMissing.push_back(i18n("%1 - for project file support").arg(missing[i]));
+// } else {
+// allMissing.push_back(missing[i]);
+// }
+ }
+ }
+ }
+
+ have = m_startupTester->haveLilyPondView(&missing);
+
+ stateChanged("have_lilypondview",
+ have ?
+ KXMLGUIClient::StateNoReverse : KXMLGUIClient::StateReverse);
+
+ if (!have) {
+ missingFeatures.push_back("Notation previews through LilyPond");
+ if (missing.count() == 0) {
+ allMissing.push_back(i18n("The Rosegarden LilyPondView helper script"));
+ } else {
+ for (int i = 0; i < missing.count(); ++i) {
+ if (missingFeatures.count() > 1) {
+ allMissing.push_back(i18n("%1 - for LilyPond preview support").arg(missing[i]));
+ } else {
+ allMissing.push_back(missing[i]);
+ }
+ }
+ }
+ }
+
+#ifdef HAVE_LIBJACK
+ if (m_seqManager && (m_seqManager->getSoundDriverStatus() & AUDIO_OK)) {
+
+ m_haveAudioImporter = m_startupTester->haveAudioFileImporter(&missing);
+
+ if (!m_haveAudioImporter) {
+ missingFeatures.push_back("General audio file import and conversion");
+ if (missing.count() == 0) {
+ allMissing.push_back(i18n("The Rosegarden Audio File Importer helper script"));
+ } else {
+ for (int i = 0; i < missing.count(); ++i) {
+ if (missingFeatures.count() > 1) {
+ allMissing.push_back(i18n("%1 - for audio file import").arg(missing[i]));
+ } else {
+ allMissing.push_back(missing[i]);
+ }
+ }
+ }
+ }
+ }
+#endif
+
+ if (missingFeatures.count() > 0) {
+ QString message = i18n("<h3>Helper programs not found</h3><p>Rosegarden could not find one or more helper programs which it needs to provide some features. The following features will not be available:</p>");
+ message += i18n("<ul>");
+ for (int i = 0; i < missingFeatures.count(); ++i) {
+ message += i18n("<li>%1</li>").arg(missingFeatures[i]);
+ }
+ message += i18n("</ul>");
+ message += i18n("<p>To fix this, you should install the following additional programs:</p>");
+ message += i18n("<ul>");
+ for (int i = 0; i < allMissing.count(); ++i) {
+ message += i18n("<li>%1</li>").arg(allMissing[i]);
+ }
+ message += i18n("</ul>");
+
+ awaitDialogClearance();
+
+ KMessageBox::information
+ (m_view,
+ message,
+ i18n("Helper programs not found"),
+ "startup-helpers-missing");
+ }
+
+ delete m_startupTester;
+ m_startupTester = 0;
+}
+
+void RosegardenGUIApp::slotDebugDump()
+{
+ Composition &comp = m_doc->getComposition();
+ comp.dump(std::cerr);
+}
+
+bool RosegardenGUIApp::launchSequencer(bool useExisting)
+{
+ if (!isUsingSequencer()) {
+ RG_DEBUG << "RosegardenGUIApp::launchSequencer() - not using seq. - returning\n";
+ return false; // no need to launch anything
+ }
+
+ if (isSequencerRunning()) {
+ RG_DEBUG << "RosegardenGUIApp::launchSequencer() - sequencer already running - returning\n";
+ if (m_seqManager) m_seqManager->checkSoundDriverStatus(false);
+ return true;
+ }
+
+ // Check to see if we're clearing down sequencer processes -
+ // if we're not we check DCOP for an existing sequencer and
+ // try to talk to use that (that's the "developer" mode).
+ //
+ // User mode should clear down sequencer processes.
+ //
+ if (kapp->dcopClient()->isApplicationRegistered(
+ QCString(ROSEGARDEN_SEQUENCER_APP_NAME))) {
+ RG_DEBUG << "RosegardenGUIApp::launchSequencer() - "
+ << "existing DCOP registered sequencer found\n";
+
+ if (useExisting) {
+ if (m_seqManager) m_seqManager->checkSoundDriverStatus(false);
+ m_sequencerProcess = (KProcess*)SequencerExternal;
+ return true;
+ }
+
+ KProcess *proc = new KProcess;
+ *proc << "/usr/bin/killall";
+ *proc << "rosegardensequencer";
+ *proc << "lt-rosegardensequencer";
+
+ proc->start(KProcess::Block, KProcess::All);
+
+ if (!proc->normalExit() || proc->exitStatus()) {
+ RG_DEBUG << "couldn't kill any sequencer processes" << endl;
+ }
+ delete proc;
+
+ sleep(1);
+
+ if (kapp->dcopClient()->isApplicationRegistered(
+ QCString(ROSEGARDEN_SEQUENCER_APP_NAME))) {
+ RG_DEBUG << "RosegardenGUIApp::launchSequencer() - "
+ << "failed to kill existing sequencer\n";
+
+ KProcess *proc = new KProcess;
+ *proc << "/usr/bin/killall";
+ *proc << "-9";
+ *proc << "rosegardensequencer";
+ *proc << "lt-rosegardensequencer";
+
+ proc->start(KProcess::Block, KProcess::All);
+
+ if (proc->exitStatus()) {
+ RG_DEBUG << "couldn't kill any sequencer processes" << endl;
+ }
+ delete proc;
+
+ sleep(1);
+ }
+ }
+
+ //
+ // No sequencer is running, so start one
+ //
+ KTmpStatusMsg msg(i18n("Starting the sequencer..."), this);
+
+ if (!m_sequencerProcess) {
+ m_sequencerProcess = new KProcess;
+
+ (*m_sequencerProcess) << "rosegardensequencer";
+
+ // Command line arguments
+ //
+ KConfig *config = kapp->config();
+ config->setGroup(SequencerOptionsConfigGroup);
+ QString options = config->readEntry("commandlineoptions");
+ if (!options.isEmpty()) {
+ (*m_sequencerProcess) << options;
+ RG_DEBUG << "sequencer options \"" << options << "\"" << endl;
+ }
+
+ } else {
+ RG_DEBUG << "RosegardenGUIApp::launchSequencer() - sequencer KProcess already created\n";
+ m_sequencerProcess->disconnect(); // disconnect processExit signal
+ // it will be reconnected later on
+ }
+
+ bool res = m_sequencerProcess->start();
+
+ if (!res) {
+ KMessageBox::error(0, i18n("Couldn't start the sequencer"));
+ RG_DEBUG << "Couldn't start the sequencer\n";
+ m_sequencerProcess = 0;
+ // If starting it didn't even work, fall back to no sequencer mode
+ m_useSequencer = false;
+ } else {
+ // connect processExited only after start, otherwise
+ // a failed startup will call slotSequencerExited()
+ // right away and we don't get to check the result
+ // of m_sequencerProcess->start() and thus make the distinction
+ // between the case where the sequencer was successfully launched
+ // but crashed right away, or the case where the process couldn't
+ // be launched at all (missing executable, etc...)
+ //
+ // We also re-check that the process is still running at this
+ // point in case it crashed between the moment we check res above
+ // and now.
+ //
+ //usleep(1000 * 1000); // even wait half a sec. to make sure it's actually running
+ if (m_sequencerProcess->isRunning()) {
+
+ try {
+ // if (m_seqManager) {
+ // RG_DEBUG << "RosegardenGUIApp::launchSequencer : checking sound driver status\n";
+ // m_seqManager->checkSoundDriverStatus();
+ // }
+
+ stateChanged("sequencer_running");
+ slotEnableTransport(true);
+
+ connect(m_sequencerProcess, SIGNAL(processExited(KProcess*)),
+ this, SLOT(slotSequencerExited(KProcess*)));
+
+ } catch (Exception e) {
+ m_sequencerProcess = 0;
+ m_useSequencer = false;
+ stateChanged("sequencer_running", KXMLGUIClient::StateReverse);
+ slotEnableTransport(false);
+ }
+
+ } else { // if it crashed so fast, it's probably pointless
+ // to try restarting it later, so also fall back to no
+ // sequencer mode
+ m_sequencerProcess = 0;
+ m_useSequencer = false;
+ stateChanged("sequencer_running", KXMLGUIClient::StateReverse);
+ slotEnableTransport(false);
+ }
+
+ }
+
+ // Sync current devices with the sequencer
+ //
+ if (m_doc)
+ m_doc->syncDevices();
+
+ if (m_doc && m_doc->getStudio().haveMidiDevices()) {
+ stateChanged("got_midi_devices");
+ } else {
+ stateChanged("got_midi_devices", KXMLGUIClient::StateReverse);
+ }
+
+ return res;
+}
+
+#ifdef HAVE_LIBJACK
+bool RosegardenGUIApp::launchJack()
+{
+ KConfig* config = kapp->config();
+ config->setGroup(SequencerOptionsConfigGroup);
+
+ bool startJack = config->readBoolEntry("jackstart", false);
+ if (!startJack)
+ return true; // we don't do anything
+
+ QString jackPath = config->readEntry("jackcommand", "");
+
+ emit startupStatusMessage(i18n("Clearing down jackd..."));
+
+ KProcess *proc = new KProcess; // TODO: do it in a less clumsy way
+ *proc << "/usr/bin/killall";
+ *proc << "-9";
+ *proc << "jackd";
+
+ proc->start(KProcess::Block, KProcess::All);
+
+ if (proc->exitStatus())
+ RG_DEBUG << "couldn't kill any jackd processes" << endl;
+ else
+ RG_DEBUG << "killed old jackd processes" << endl;
+
+ emit startupStatusMessage(i18n("Starting jackd..."));
+
+ if (jackPath != "") {
+
+ RG_DEBUG << "starting jack \"" << jackPath << "\"" << endl;
+
+ QStringList splitCommand;
+ splitCommand = QStringList::split(" ", jackPath);
+
+ RG_DEBUG << "RosegardenGUIApp::launchJack() : splitCommand length : "
+ << splitCommand.size() << endl;
+
+ // start jack process
+ m_jackProcess = new KProcess;
+
+ *m_jackProcess << splitCommand;
+
+ m_jackProcess->start();
+ }
+
+
+ return m_jackProcess != 0 ? m_jackProcess->isRunning() : true;
+}
+#endif
+
+void RosegardenGUIApp::slotDocumentDevicesResyncd()
+{
+ m_sequencerCheckedIn = true;
+ m_trackParameterBox->populateDeviceLists();
+}
+
+void RosegardenGUIApp::slotSequencerExited(KProcess*)
+{
+ RG_DEBUG << "RosegardenGUIApp::slotSequencerExited Sequencer exited\n";
+
+ KStartupLogo::hideIfStillThere();
+
+ if (m_sequencerCheckedIn) {
+
+ KMessageBox::error(0, i18n("The Rosegarden sequencer process has exited unexpectedly. Sound and recording will no longer be available for this session.\nPlease exit and restart Rosegarden to restore sound capability."));
+
+ } else {
+
+ KMessageBox::error(0, i18n("The Rosegarden sequencer could not be started, so sound and recording will be unavailable for this session.\nFor assistance with correct audio and MIDI configuration, go to http://rosegardenmusic.com."));
+ }
+
+ m_sequencerProcess = 0; // isSequencerRunning() will return false
+ // but isUsingSequencer() will keep returning true
+ // so pressing the play button may attempt to restart the sequencer
+}
+
+void RosegardenGUIApp::slotExportProject()
+{
+ KTmpStatusMsg msg(i18n("Exporting Rosegarden Project file..."), this);
+
+ QString fileName = getValidWriteFile
+ ("*.rgp|" + i18n("Rosegarden Project files\n") +
+ "\n*|" + i18n("All files"),
+ i18n("Export as..."));
+
+ if (fileName.isEmpty())
+ return ;
+
+ QString rgFile = fileName;
+ rgFile.replace(QRegExp(".rg.rgp$"), ".rg");
+ rgFile.replace(QRegExp(".rgp$"), ".rg");
+
+ CurrentProgressDialog::freeze();
+
+ QString errMsg;
+ if (!m_doc->saveDocument(rgFile, errMsg,
+ true)) { // pretend it's autosave
+ KMessageBox::sorry(this, i18n("Saving Rosegarden file to package failed: %1").arg(errMsg));
+ CurrentProgressDialog::thaw();
+ return ;
+ }
+
+ KProcess *proc = new KProcess;
+ *proc << "rosegarden-project-package";
+ *proc << "--pack";
+ *proc << rgFile;
+ *proc << fileName;
+
+ proc->start(KProcess::Block, KProcess::All);
+
+ if (!proc->normalExit() || proc->exitStatus()) {
+ KMessageBox::sorry(this, i18n("Failed to export to project file \"%1\"").arg(fileName));
+ CurrentProgressDialog::thaw();
+ delete proc;
+ return ;
+ }
+
+ delete proc;
+}
+
+void RosegardenGUIApp::slotExportMIDI()
+{
+ KTmpStatusMsg msg(i18n("Exporting MIDI file..."), this);
+
+ QString fileName = getValidWriteFile
+ ("*.mid *.midi|" + i18n("Standard MIDI files\n") +
+ "\n*|" + i18n("All files"),
+ i18n("Export as..."));
+
+ if (fileName.isEmpty())
+ return ;
+
+ exportMIDIFile(fileName);
+}
+
+void RosegardenGUIApp::exportMIDIFile(QString file)
+{
+ ProgressDialog progressDlg(i18n("Exporting MIDI file..."),
+ 100,
+ this);
+
+ std::string fname(QFile::encodeName(file));
+
+ MidiFile midiFile(fname,
+ &m_doc->getStudio());
+
+ connect(&midiFile, SIGNAL(setProgress(int)),
+ progressDlg.progressBar(), SLOT(setValue(int)));
+
+ connect(&midiFile, SIGNAL(incrementProgress(int)),
+ progressDlg.progressBar(), SLOT(advance(int)));
+
+ midiFile.convertToMidi(m_doc->getComposition());
+
+ if (!midiFile.write()) {
+ CurrentProgressDialog::freeze();
+ KMessageBox::sorry(this, i18n("Export failed. The file could not be opened for writing."));
+ }
+}
+
+void RosegardenGUIApp::slotExportCsound()
+{
+ KTmpStatusMsg msg(i18n("Exporting Csound score file..."), this);
+
+ QString fileName = getValidWriteFile(QString("*|") + i18n("All files"),
+ i18n("Export as..."));
+ if (fileName.isEmpty())
+ return ;
+
+ exportCsoundFile(fileName);
+}
+
+void RosegardenGUIApp::exportCsoundFile(QString file)
+{
+ ProgressDialog progressDlg(i18n("Exporting Csound score file..."),
+ 100,
+ this);
+
+ CsoundExporter e(this, &m_doc->getComposition(), std::string(QFile::encodeName(file)));
+
+ connect(&e, SIGNAL(setProgress(int)),
+ progressDlg.progressBar(), SLOT(setValue(int)));
+
+ connect(&e, SIGNAL(incrementProgress(int)),
+ progressDlg.progressBar(), SLOT(advance(int)));
+
+ if (!e.write()) {
+ CurrentProgressDialog::freeze();
+ KMessageBox::sorry(this, i18n("Export failed. The file could not be opened for writing."));
+ }
+}
+
+void RosegardenGUIApp::slotExportMup()
+{
+ KTmpStatusMsg msg(i18n("Exporting Mup file..."), this);
+
+ QString fileName = getValidWriteFile
+ ("*.mup|" + i18n("Mup files\n") + "\n*|" + i18n("All files"),
+ i18n("Export as..."));
+ if (fileName.isEmpty())
+ return ;
+
+ exportMupFile(fileName);
+}
+
+void RosegardenGUIApp::exportMupFile(QString file)
+{
+ ProgressDialog progressDlg(i18n("Exporting Mup file..."),
+ 100,
+ this);
+
+ MupExporter e(this, &m_doc->getComposition(), std::string(QFile::encodeName(file)));
+
+ connect(&e, SIGNAL(setProgress(int)),
+ progressDlg.progressBar(), SLOT(setValue(int)));
+
+ connect(&e, SIGNAL(incrementProgress(int)),
+ progressDlg.progressBar(), SLOT(advance(int)));
+
+ if (!e.write()) {
+ CurrentProgressDialog::freeze();
+ KMessageBox::sorry(this, i18n("Export failed. The file could not be opened for writing."));
+ }
+}
+
+void RosegardenGUIApp::slotExportLilyPond()
+{
+ KTmpStatusMsg msg(i18n("Exporting LilyPond file..."), this);
+
+ QString fileName = getValidWriteFile
+ (QString("*.ly|") + i18n("LilyPond files") +
+ "\n*|" + i18n("All files"),
+ i18n("Export as..."));
+
+ if (fileName.isEmpty())
+ return ;
+
+ exportLilyPondFile(fileName);
+}
+
+std::map<KProcess *, KTempFile *> RosegardenGUIApp::m_lilyTempFileMap;
+
+
+void RosegardenGUIApp::slotPrintLilyPond()
+{
+ KTmpStatusMsg msg(i18n("Printing LilyPond file..."), this);
+ KTempFile *file = new KTempFile(QString::null, ".ly");
+ file->setAutoDelete(true);
+ if (!file->name()) {
+ CurrentProgressDialog::freeze();
+ KMessageBox::sorry(this, i18n("Failed to open a temporary file for LilyPond export."));
+ delete file;
+ }
+ if (!exportLilyPondFile(file->name(), true)) {
+ return ;
+ }
+ KProcess *proc = new KProcess;
+ *proc << "rosegarden-lilypondview";
+ *proc << "--graphical";
+ *proc << "--print";
+ *proc << file->name();
+ connect(proc, SIGNAL(processExited(KProcess *)),
+ this, SLOT(slotLilyPondViewProcessExited(KProcess *)));
+ m_lilyTempFileMap[proc] = file;
+ proc->start(KProcess::NotifyOnExit);
+}
+
+void RosegardenGUIApp::slotPreviewLilyPond()
+{
+ KTmpStatusMsg msg(i18n("Previewing LilyPond file..."), this);
+ KTempFile *file = new KTempFile(QString::null, ".ly");
+ file->setAutoDelete(true);
+ if (!file->name()) {
+ CurrentProgressDialog::freeze();
+ KMessageBox::sorry(this, i18n("Failed to open a temporary file for LilyPond export."));
+ delete file;
+ }
+ if (!exportLilyPondFile(file->name(), true)) {
+ return ;
+ }
+ KProcess *proc = new KProcess;
+ *proc << "rosegarden-lilypondview";
+ *proc << "--graphical";
+ *proc << "--pdf";
+ *proc << file->name();
+ connect(proc, SIGNAL(processExited(KProcess *)),
+ this, SLOT(slotLilyPondViewProcessExited(KProcess *)));
+ m_lilyTempFileMap[proc] = file;
+ proc->start(KProcess::NotifyOnExit);
+}
+
+void RosegardenGUIApp::slotLilyPondViewProcessExited(KProcess *p)
+{
+ delete m_lilyTempFileMap[p];
+ m_lilyTempFileMap.erase(p);
+ delete p;
+}
+
+bool RosegardenGUIApp::exportLilyPondFile(QString file, bool forPreview)
+{
+ QString caption = "", heading = "";
+ if (forPreview) {
+ caption = i18n("LilyPond Preview Options");
+ heading = i18n("LilyPond preview options");
+ }
+
+ LilyPondOptionsDialog dialog(this, m_doc, caption, heading);
+ if (dialog.exec() != QDialog::Accepted) {
+ return false;
+ }
+
+ ProgressDialog progressDlg(i18n("Exporting LilyPond file..."),
+ 100,
+ this);
+
+ LilyPondExporter e(this, m_doc, std::string(QFile::encodeName(file)));
+
+ connect(&e, SIGNAL(setProgress(int)),
+ progressDlg.progressBar(), SLOT(setValue(int)));
+
+ connect(&e, SIGNAL(incrementProgress(int)),
+ progressDlg.progressBar(), SLOT(advance(int)));
+
+ if (!e.write()) {
+ CurrentProgressDialog::freeze();
+ KMessageBox::sorry(this, i18n("Export failed. The file could not be opened for writing."));
+ return false;
+ }
+
+ return true;
+}
+
+void RosegardenGUIApp::slotExportMusicXml()
+{
+ KTmpStatusMsg msg(i18n("Exporting MusicXML file..."), this);
+
+ QString fileName = getValidWriteFile
+ (QString("*.xml|") + i18n("XML files") +
+ "\n*|" + i18n("All files"), i18n("Export as..."));
+
+ if (fileName.isEmpty())
+ return ;
+
+ exportMusicXmlFile(fileName);
+}
+
+void RosegardenGUIApp::exportMusicXmlFile(QString file)
+{
+ ProgressDialog progressDlg(i18n("Exporting MusicXML file..."),
+ 100,
+ this);
+
+ MusicXmlExporter e(this, m_doc, std::string(QFile::encodeName(file)));
+
+ connect(&e, SIGNAL(setProgress(int)),
+ progressDlg.progressBar(), SLOT(setValue(int)));
+
+ connect(&e, SIGNAL(incrementProgress(int)),
+ progressDlg.progressBar(), SLOT(advance(int)));
+
+ if (!e.write()) {
+ CurrentProgressDialog::freeze();
+ KMessageBox::sorry(this, i18n("Export failed. The file could not be opened for writing."));
+ }
+}
+
+void
+RosegardenGUIApp::slotCloseTransport()
+{
+ m_viewTransport->setChecked(false);
+ slotToggleTransport(); // hides the transport
+}
+
+void
+RosegardenGUIApp::slotDeleteTransport()
+{
+ delete m_transport;
+ m_transport = 0;
+}
+
+void
+RosegardenGUIApp::slotActivateTool(QString toolName)
+{
+ if (toolName == SegmentSelector::ToolName) {
+ actionCollection()->action("select")->activate();
+ }
+}
+
+void
+RosegardenGUIApp::slotToggleMetronome()
+{
+ Composition &comp = m_doc->getComposition();
+
+ if (m_seqManager->getTransportStatus() == STARTING_TO_RECORD ||
+ m_seqManager->getTransportStatus() == RECORDING ||
+ m_seqManager->getTransportStatus() == RECORDING_ARMED) {
+ if (comp.useRecordMetronome())
+ comp.setRecordMetronome(false);
+ else
+ comp.setRecordMetronome(true);
+
+ getTransport()->MetronomeButton()->setOn(comp.useRecordMetronome());
+ } else {
+ if (comp.usePlayMetronome())
+ comp.setPlayMetronome(false);
+ else
+ comp.setPlayMetronome(true);
+
+ getTransport()->MetronomeButton()->setOn(comp.usePlayMetronome());
+ }
+}
+
+void
+RosegardenGUIApp::slotRewindToBeginning()
+{
+ // ignore requests if recording
+ //
+ if (m_seqManager->getTransportStatus() == RECORDING)
+ return ;
+
+ m_seqManager->rewindToBeginning();
+}
+
+void
+RosegardenGUIApp::slotFastForwardToEnd()
+{
+ // ignore requests if recording
+ //
+ if (m_seqManager->getTransportStatus() == RECORDING)
+ return ;
+
+ m_seqManager->fastForwardToEnd();
+}
+
+void
+RosegardenGUIApp::slotSetPlayPosition(timeT time)
+{
+ RG_DEBUG << "RosegardenGUIApp::slotSetPlayPosition(" << time << ")" << endl;
+ if (m_seqManager->getTransportStatus() == RECORDING)
+ return ;
+
+ m_doc->slotSetPointerPosition(time);
+
+ if (m_seqManager->getTransportStatus() == PLAYING)
+ return ;
+
+ slotPlay();
+}
+
+void RosegardenGUIApp::notifySequencerStatus(int status)
+{
+ stateChanged("not_playing",
+ (status == PLAYING ||
+ status == RECORDING) ?
+ KXMLGUIClient::StateReverse : KXMLGUIClient::StateNoReverse);
+
+ if (m_seqManager)
+ m_seqManager->setTransportStatus((TransportStatus) status);
+}
+
+void RosegardenGUIApp::processAsynchronousMidi(const MappedComposition &mC)
+{
+ if (!m_seqManager) {
+ return ; // probably getting this from a not-yet-killed runaway sequencer
+ }
+
+ m_seqManager->processAsynchronousMidi(mC, 0);
+ SequencerMapper *mapper = m_seqManager->getSequencerMapper();
+ if (mapper)
+ m_view->updateMeters(mapper);
+}
+
+void
+RosegardenGUIApp::slotRecord()
+{
+ if (!isUsingSequencer())
+ return ;
+
+ if (!isSequencerRunning()) {
+
+ // Try to launch sequencer and return if we fail
+ //
+ if (!launchSequencer(false))
+ return ;
+ }
+
+ if (m_seqManager->getTransportStatus() == RECORDING) {
+ slotStop();
+ return ;
+ } else if (m_seqManager->getTransportStatus() == PLAYING) {
+ slotToggleRecord();
+ return ;
+ }
+
+ // Attempt to start recording
+ //
+ try {
+ m_seqManager->record(false);
+ } catch (QString s) {
+ // We should already be stopped by this point so just unset
+ // the buttons after clicking the dialog.
+ //
+ KMessageBox::error(this, s);
+
+ getTransport()->MetronomeButton()->setOn(false);
+ getTransport()->RecordButton()->setOn(false);
+ getTransport()->PlayButton()->setOn(false);
+ return ;
+ } catch (AudioFileManager::BadAudioPathException e) {
+ if (KMessageBox::warningContinueCancel
+ (this,
+ i18n("The audio file path does not exist or is not writable.\nPlease set the audio file path to a valid directory in Document Properties before recording audio.\nWould you like to set it now?"),
+ i18n("Warning"),
+ i18n("Set audio file path")) == KMessageBox::Continue) {
+ slotOpenAudioPathSettings();
+ }
+ getTransport()->MetronomeButton()->setOn(false);
+ getTransport()->RecordButton()->setOn(false);
+ getTransport()->PlayButton()->setOn(false);
+ return ;
+ } catch (Exception e) {
+ KMessageBox::error(this, strtoqstr(e.getMessage()));
+
+ getTransport()->MetronomeButton()->setOn(false);
+ getTransport()->RecordButton()->setOn(false);
+ getTransport()->PlayButton()->setOn(false);
+ return ;
+ }
+
+ // plugin the keyboard accelerators for focus on this dialog
+ plugAccelerators(m_seqManager->getCountdownDialog(),
+ m_seqManager->getCountdownDialog()->getAccelerators());
+
+ connect(m_seqManager->getCountdownDialog(), SIGNAL(stopped()),
+ this, SLOT(slotStop()));
+
+ // Start the playback timer - this fetches the current sequencer position &c
+ //
+ m_stopTimer->stop();
+ m_playTimer->start(23); // avoid multiples of 10 just so as
+ // to avoid always having the same digit
+ // in one place on the transport. How
+ // shallow.)
+}
+
+void
+RosegardenGUIApp::slotToggleRecord()
+{
+ if (!isUsingSequencer() ||
+ (!isSequencerRunning() && !launchSequencer(false)))
+ return ;
+
+ try {
+ m_seqManager->record(true);
+ } catch (QString s) {
+ KMessageBox::error(this, s);
+ } catch (AudioFileManager::BadAudioPathException e) {
+ if (KMessageBox::warningContinueCancel
+ (this,
+ i18n("The audio file path does not exist or is not writable.\nPlease set the audio file path to a valid directory in Document Properties before you start to record audio.\nWould you like to set it now?"),
+ i18n("Error"),
+ i18n("Set audio file path")) == KMessageBox::Continue) {
+ slotOpenAudioPathSettings();
+ }
+ } catch (Exception e) {
+ KMessageBox::error(this, strtoqstr(e.getMessage()));
+ }
+
+}
+
+void
+RosegardenGUIApp::slotSetLoop(timeT lhs, timeT rhs)
+{
+ try {
+ m_doc->slotDocumentModified();
+
+ m_seqManager->setLoop(lhs, rhs);
+
+ // toggle the loop button
+ if (lhs != rhs) {
+ getTransport()->LoopButton()->setOn(true);
+ stateChanged("have_range", KXMLGUIClient::StateNoReverse);
+ } else {
+ getTransport()->LoopButton()->setOn(false);
+ stateChanged("have_range", KXMLGUIClient::StateReverse);
+ }
+ } catch (QString s) {
+ KMessageBox::error(this, s);
+ }
+}
+
+void RosegardenGUIApp::alive()
+{
+ if (m_doc)
+ m_doc->syncDevices();
+
+ if (m_doc && m_doc->getStudio().haveMidiDevices()) {
+ stateChanged("got_midi_devices");
+ } else {
+ stateChanged("got_midi_devices", KXMLGUIClient::StateReverse);
+ }
+}
+
+void RosegardenGUIApp::slotPlay()
+{
+ if (!isUsingSequencer())
+ return ;
+
+ if (!isSequencerRunning()) {
+
+ // Try to launch sequencer and return if it fails
+ //
+ if (!launchSequencer(false))
+ return ;
+ }
+
+ if (!m_seqManager)
+ return ;
+
+ // If we're armed and ready to record then do this instead (calling
+ // slotRecord ensures we don't toggle the recording state in
+ // SequenceManager)
+ //
+ if (m_seqManager->getTransportStatus() == RECORDING_ARMED) {
+ slotRecord();
+ return ;
+ }
+
+ // Send the controllers at start of playback if required
+ //
+ KConfig *config = kapp->config();
+ config->setGroup(SequencerOptionsConfigGroup);
+ bool sendControllers = config->readBoolEntry("alwayssendcontrollers", false);
+
+ if (sendControllers)
+ m_doc->initialiseControllers();
+
+ bool pausedPlayback = false;
+
+ try {
+ pausedPlayback = m_seqManager->play(); // this will stop playback (pause) if it's already running
+ // Check the new state of the transport and start or stop timer
+ // accordingly
+ //
+ if (!pausedPlayback) {
+
+ // Start the playback timer - this fetches the current sequencer position &c
+ //
+ m_stopTimer->stop();
+ m_playTimer->start(23);
+ } else {
+ m_playTimer->stop();
+ m_stopTimer->start(100);
+ }
+ } catch (QString s) {
+ KMessageBox::error(this, s);
+ m_playTimer->stop();
+ m_stopTimer->start(100);
+ } catch (Exception e) {
+ KMessageBox::error(this, e.getMessage());
+ m_playTimer->stop();
+ m_stopTimer->start(100);
+ }
+
+}
+
+void RosegardenGUIApp::slotJumpToTime(int sec, int usec)
+{
+ Composition *comp = &m_doc->getComposition();
+ timeT t = comp->getElapsedTimeForRealTime
+ (RealTime(sec, usec * 1000));
+ m_doc->slotSetPointerPosition(t);
+}
+
+void RosegardenGUIApp::slotStartAtTime(int sec, int usec)
+{
+ slotJumpToTime(sec, usec);
+ slotPlay();
+}
+
+void RosegardenGUIApp::slotStop()
+{
+ if (m_seqManager &&
+ m_seqManager->getCountdownDialog()) {
+ disconnect(m_seqManager->getCountdownDialog(), SIGNAL(stopped()),
+ this, SLOT(slotStop()));
+ disconnect(m_seqManager->getCountdownDialog(), SIGNAL(completed()),
+ this, SLOT(slotStop()));
+ }
+
+ try {
+ if (m_seqManager)
+ m_seqManager->stopping();
+ } catch (Exception e) {
+ KMessageBox::error(this, strtoqstr(e.getMessage()));
+ }
+
+ // stop the playback timer
+ m_playTimer->stop();
+ m_stopTimer->start(100);
+}
+
+void RosegardenGUIApp::slotRewind()
+{
+ // ignore requests if recording
+ //
+ if (m_seqManager->getTransportStatus() == RECORDING)
+ return ;
+ if (m_seqManager)
+ m_seqManager->rewind();
+}
+
+void RosegardenGUIApp::slotFastforward()
+{
+ // ignore requests if recording
+ //
+ if (m_seqManager->getTransportStatus() == RECORDING)
+ return ;
+
+ if (m_seqManager)
+ m_seqManager->fastforward();
+}
+
+void
+RosegardenGUIApp::slotSetLoop()
+{
+ // restore loop
+ m_doc->setLoop(m_storedLoopStart, m_storedLoopEnd);
+}
+
+void
+RosegardenGUIApp::slotUnsetLoop()
+{
+ Composition &comp = m_doc->getComposition();
+
+ // store the loop
+ m_storedLoopStart = comp.getLoopStart();
+ m_storedLoopEnd = comp.getLoopEnd();
+
+ // clear the loop at the composition and propagate to the rest
+ // of the display items
+ m_doc->setLoop(0, 0);
+}
+
+void
+RosegardenGUIApp::slotSetLoopStart()
+{
+ // Check so that start time is before endtime, othervise move upp the
+ // endtime to that same pos.
+ if ( m_doc->getComposition().getPosition() < m_doc->getComposition().getLoopEnd() ) {
+ m_doc->setLoop(m_doc->getComposition().getPosition(), m_doc->getComposition().getLoopEnd());
+ } else {
+ m_doc->setLoop(m_doc->getComposition().getPosition(), m_doc->getComposition().getPosition());
+ }
+}
+
+void
+RosegardenGUIApp::slotSetLoopStop()
+{
+ // Check so that end time is after start time, othervise move upp the
+ // start time to that same pos.
+ if ( m_doc->getComposition().getLoopStart() < m_doc->getComposition().getPosition() ) {
+ m_doc->setLoop(m_doc->getComposition().getLoopStart(), m_doc->getComposition().getPosition());
+ } else {
+ m_doc->setLoop(m_doc->getComposition().getPosition(), m_doc->getComposition().getPosition());
+ }
+}
+
+void RosegardenGUIApp::slotToggleSolo(bool value)
+{
+ RG_DEBUG << "RosegardenGUIApp::slotToggleSolo value = " << value << endl;
+
+ m_doc->getComposition().setSolo(value);
+ getTransport()->SoloButton()->setOn(value);
+
+ m_doc->slotDocumentModified();
+
+ emit compositionStateUpdate();
+}
+
+void RosegardenGUIApp::slotTrackUp()
+{
+ Composition &comp = m_doc->getComposition();
+
+ TrackId tid = comp.getSelectedTrack();
+ TrackId pos = comp.getTrackById(tid)->getPosition();
+
+ // If at top already
+ if (pos == 0)
+ return ;
+
+ Track *track = comp.getTrackByPosition(pos - 1);
+
+ // If the track exists
+ if (track) {
+ comp.setSelectedTrack(track->getId());
+ m_view->slotSelectTrackSegments(comp.getSelectedTrack());
+ }
+
+}
+
+void RosegardenGUIApp::slotTrackDown()
+{
+ Composition &comp = m_doc->getComposition();
+
+ TrackId tid = comp.getSelectedTrack();
+ TrackId pos = comp.getTrackById(tid)->getPosition();
+
+ Track *track = comp.getTrackByPosition(pos + 1);
+
+ // If the track exists
+ if (track) {
+ comp.setSelectedTrack(track->getId());
+ m_view->slotSelectTrackSegments(comp.getSelectedTrack());
+ }
+
+}
+
+void RosegardenGUIApp::slotMuteAllTracks()
+{
+ RG_DEBUG << "RosegardenGUIApp::slotMuteAllTracks" << endl;
+
+ Composition &comp = m_doc->getComposition();
+
+ Composition::trackcontainer tracks = comp.getTracks();
+ Composition::trackiterator tit;
+ for (tit = tracks.begin(); tit != tracks.end(); ++tit)
+ m_view->slotSetMute((*tit).second->getInstrument(), true);
+}
+
+void RosegardenGUIApp::slotUnmuteAllTracks()
+{
+ RG_DEBUG << "RosegardenGUIApp::slotUnmuteAllTracks" << endl;
+
+ Composition &comp = m_doc->getComposition();
+
+ Composition::trackcontainer tracks = comp.getTracks();
+ Composition::trackiterator tit;
+ for (tit = tracks.begin(); tit != tracks.end(); ++tit)
+ m_view->slotSetMute((*tit).second->getInstrument(), false);
+}
+
+void RosegardenGUIApp::slotToggleMutedCurrentTrack()
+{
+ Composition &comp = m_doc->getComposition();
+ TrackId tid = comp.getSelectedTrack();
+ Track *track = comp.getTrackById(tid);
+ // If the track exists
+ if (track) {
+ bool isMuted = track->isMuted();
+ m_view->slotSetMuteButton(tid, !isMuted);
+ }
+}
+
+void RosegardenGUIApp::slotToggleRecordCurrentTrack()
+{
+ Composition &comp = m_doc->getComposition();
+ TrackId tid = comp.getSelectedTrack();
+ int pos = comp.getTrackPositionById(tid);
+ m_view->getTrackEditor()->getTrackButtons()->slotToggleRecordTrack(pos);
+}
+
+
+void RosegardenGUIApp::slotConfigure()
+{
+ RG_DEBUG << "RosegardenGUIApp::slotConfigure\n";
+
+ ConfigureDialog *configDlg =
+ new ConfigureDialog(m_doc, kapp->config(), this);
+
+ connect(configDlg, SIGNAL(updateAutoSaveInterval(unsigned int)),
+ this, SLOT(slotUpdateAutoSaveInterval(unsigned int)));
+ connect(configDlg, SIGNAL(updateSidebarStyle(unsigned int)),
+ this, SLOT(slotUpdateSidebarStyle(unsigned int)));
+
+ configDlg->show();
+}
+
+void RosegardenGUIApp::slotEditDocumentProperties()
+{
+ RG_DEBUG << "RosegardenGUIApp::slotEditDocumentProperties\n";
+
+ DocumentConfigureDialog *configDlg =
+ new DocumentConfigureDialog(m_doc, this);
+
+ configDlg->show();
+}
+
+void RosegardenGUIApp::slotOpenAudioPathSettings()
+{
+ RG_DEBUG << "RosegardenGUIApp::slotOpenAudioPathSettings\n";
+
+ DocumentConfigureDialog *configDlg =
+ new DocumentConfigureDialog(m_doc, this);
+
+ configDlg->showAudioPage();
+ configDlg->show();
+}
+
+void RosegardenGUIApp::slotEditKeys()
+{
+ KKeyDialog::configure(actionCollection());
+}
+
+void RosegardenGUIApp::slotEditToolbars()
+{
+ KEditToolbar dlg(actionCollection(), "rosegardenui.rc");
+
+ connect(&dlg, SIGNAL(newToolbarConfig()),
+ SLOT(slotUpdateToolbars()));
+
+ dlg.exec();
+}
+
+void RosegardenGUIApp::slotUpdateToolbars()
+{
+ createGUI("rosegardenui.rc");
+ m_viewToolBar->setChecked(!toolBar()->isHidden());
+}
+
+void RosegardenGUIApp::slotEditTempo()
+{
+ slotEditTempo(this);
+}
+
+void RosegardenGUIApp::slotEditTempo(timeT atTime)
+{
+ slotEditTempo(this, atTime);
+}
+
+void RosegardenGUIApp::slotEditTempo(QWidget *parent)
+{
+ slotEditTempo(parent, m_doc->getComposition().getPosition());
+}
+
+void RosegardenGUIApp::slotEditTempo(QWidget *parent, timeT atTime)
+{
+ RG_DEBUG << "RosegardenGUIApp::slotEditTempo\n";
+
+ TempoDialog tempoDialog(parent, m_doc);
+
+ connect(&tempoDialog,
+ SIGNAL(changeTempo(timeT,
+ tempoT,
+ tempoT,
+ TempoDialog::TempoDialogAction)),
+ SLOT(slotChangeTempo(timeT,
+ tempoT,
+ tempoT,
+ TempoDialog::TempoDialogAction)));
+
+ tempoDialog.setTempoPosition(atTime);
+ tempoDialog.exec();
+}
+
+void RosegardenGUIApp::slotEditTimeSignature()
+{
+ slotEditTimeSignature(this);
+}
+
+void RosegardenGUIApp::slotEditTimeSignature(timeT atTime)
+{
+ slotEditTimeSignature(this, atTime);
+}
+
+void RosegardenGUIApp::slotEditTimeSignature(QWidget *parent)
+{
+ slotEditTimeSignature(parent, m_doc->getComposition().getPosition());
+}
+
+void RosegardenGUIApp::slotEditTimeSignature(QWidget *parent,
+ timeT time)
+{
+ Composition &composition(m_doc->getComposition());
+
+ TimeSignature sig = composition.getTimeSignatureAt(time);
+
+ TimeSignatureDialog dialog(parent, &composition, time, sig);
+
+ if (dialog.exec() == QDialog::Accepted) {
+
+ time = dialog.getTime();
+
+ if (dialog.shouldNormalizeRests()) {
+ m_doc->getCommandHistory()->addCommand
+ (new AddTimeSignatureAndNormalizeCommand
+ (&composition, time, dialog.getTimeSignature()));
+ } else {
+ m_doc->getCommandHistory()->addCommand
+ (new AddTimeSignatureCommand
+ (&composition, time, dialog.getTimeSignature()));
+ }
+ }
+}
+
+void RosegardenGUIApp::slotEditTransportTime()
+{
+ slotEditTransportTime(this);
+}
+
+void RosegardenGUIApp::slotEditTransportTime(QWidget *parent)
+{
+ TimeDialog dialog(parent, i18n("Move playback pointer to time"),
+ &m_doc->getComposition(),
+ m_doc->getComposition().getPosition(),
+ true);
+ if (dialog.exec() == QDialog::Accepted) {
+ m_doc->slotSetPointerPosition(dialog.getTime());
+ }
+}
+
+void RosegardenGUIApp::slotChangeZoom(int)
+{
+ double duration44 = TimeSignature(4, 4).getBarDuration();
+ double value = double(m_zoomSlider->getCurrentSize());
+ m_zoomLabel->setText(i18n("%1%").arg(duration44 / value));
+
+ RG_DEBUG << "RosegardenGUIApp::slotChangeZoom : zoom size = "
+ << m_zoomSlider->getCurrentSize() << endl;
+
+ // initZoomToolbar sets the zoom value. With some old versions of
+ // Qt3.0, this can cause slotChangeZoom() to be called while the
+ // view hasn't been initialized yet, so we need to check it's not
+ // null
+ //
+ if (m_view)
+ m_view->setZoomSize(m_zoomSlider->getCurrentSize());
+
+ long newZoom = int(m_zoomSlider->getCurrentSize() * 1000.0);
+
+ if (m_doc->getConfiguration().get<Int>
+ (DocumentConfiguration::ZoomLevel) != newZoom) {
+
+ m_doc->getConfiguration().set<Int>
+ (DocumentConfiguration::ZoomLevel, newZoom);
+
+ m_doc->slotDocumentModified();
+ }
+}
+
+void
+RosegardenGUIApp::slotZoomIn()
+{
+ m_zoomSlider->increment();
+}
+
+void
+RosegardenGUIApp::slotZoomOut()
+{
+ m_zoomSlider->decrement();
+}
+
+void
+RosegardenGUIApp::slotChangeTempo(timeT time,
+ tempoT value,
+ tempoT target,
+ TempoDialog::TempoDialogAction action)
+{
+ //!!! handle target
+
+ Composition &comp = m_doc->getComposition();
+
+ // We define a macro command here and build up the command
+ // label as we add commands on.
+ //
+ if (action == TempoDialog::AddTempo) {
+ m_doc->getCommandHistory()->addCommand
+ (new AddTempoChangeCommand(&comp, time, value, target));
+ } else if (action == TempoDialog::ReplaceTempo) {
+ int index = comp.getTempoChangeNumberAt(time);
+
+ // if there's no previous tempo change then just set globally
+ //
+ if (index == -1) {
+ m_doc->getCommandHistory()->addCommand
+ (new AddTempoChangeCommand(&comp, 0, value, target));
+ return ;
+ }
+
+ // get time of previous tempo change
+ timeT prevTime = comp.getTempoChange(index).first;
+
+ KMacroCommand *macro =
+ new KMacroCommand(i18n("Replace Tempo Change at %1").arg(time));
+
+ macro->addCommand(new RemoveTempoChangeCommand(&comp, index));
+ macro->addCommand(new AddTempoChangeCommand(&comp, prevTime, value,
+ target));
+
+ m_doc->getCommandHistory()->addCommand(macro);
+
+ } else if (action == TempoDialog::AddTempoAtBarStart) {
+ m_doc->getCommandHistory()->addCommand(new
+ AddTempoChangeCommand(&comp, comp.getBarStartForTime(time),
+ value, target));
+ } else if (action == TempoDialog::GlobalTempo ||
+ action == TempoDialog::GlobalTempoWithDefault) {
+ KMacroCommand *macro = new KMacroCommand(i18n("Set Global Tempo"));
+
+ // Remove all tempo changes in reverse order so as the index numbers
+ // don't becoming meaningless as the command gets unwound.
+ //
+ for (int i = 0; i < comp.getTempoChangeCount(); i++)
+ macro->addCommand(new RemoveTempoChangeCommand(&comp,
+ (comp.getTempoChangeCount() - 1 - i)));
+
+ // add tempo change at time zero
+ //
+ macro->addCommand(new AddTempoChangeCommand(&comp, 0, value, target));
+
+ // are we setting default too?
+ //
+ if (action == TempoDialog::GlobalTempoWithDefault) {
+ macro->setName(i18n("Set Global and Default Tempo"));
+ macro->addCommand(new ModifyDefaultTempoCommand(&comp, value));
+ }
+
+ m_doc->getCommandHistory()->addCommand(macro);
+
+ } else {
+ RG_DEBUG << "RosegardenGUIApp::slotChangeTempo() - "
+ << "unrecognised tempo command" << endl;
+ }
+}
+
+void
+RosegardenGUIApp::slotMoveTempo(timeT oldTime,
+ timeT newTime)
+{
+ Composition &comp = m_doc->getComposition();
+ int index = comp.getTempoChangeNumberAt(oldTime);
+
+ if (index < 0)
+ return ;
+
+ KMacroCommand *macro =
+ new KMacroCommand(i18n("Move Tempo Change"));
+
+ std::pair<timeT, tempoT> tc =
+ comp.getTempoChange(index);
+ std::pair<bool, tempoT> tr =
+ comp.getTempoRamping(index, false);
+
+ macro->addCommand(new RemoveTempoChangeCommand(&comp, index));
+ macro->addCommand(new AddTempoChangeCommand(&comp,
+ newTime,
+ tc.second,
+ tr.first ? tr.second : -1));
+
+ m_doc->getCommandHistory()->addCommand(macro);
+}
+
+void
+RosegardenGUIApp::slotDeleteTempo(timeT t)
+{
+ Composition &comp = m_doc->getComposition();
+ int index = comp.getTempoChangeNumberAt(t);
+
+ if (index < 0)
+ return ;
+
+ m_doc->getCommandHistory()->addCommand(new RemoveTempoChangeCommand
+ (&comp, index));
+}
+
+void
+RosegardenGUIApp::slotAddMarker(timeT time)
+{
+ AddMarkerCommand *command =
+ new AddMarkerCommand(&m_doc->getComposition(),
+ time,
+ i18n("new marker"),
+ i18n("no description"));
+
+ m_doc->getCommandHistory()->addCommand(command);
+}
+
+void
+RosegardenGUIApp::slotDeleteMarker(int id, timeT time, QString name, QString description)
+{
+ RemoveMarkerCommand *command =
+ new RemoveMarkerCommand(&m_doc->getComposition(),
+ id,
+ time,
+ qstrtostr(name),
+ qstrtostr(description));
+
+ m_doc->getCommandHistory()->addCommand(command);
+}
+
+void
+RosegardenGUIApp::slotDocumentModified(bool m)
+{
+ RG_DEBUG << "RosegardenGUIApp::slotDocumentModified(" << m << ") - doc path = "
+ << m_doc->getAbsFilePath() << endl;
+
+ if (!m_doc->getAbsFilePath().isEmpty()) {
+ slotStateChanged("saved_file_modified", m);
+ } else {
+ slotStateChanged("new_file_modified", m);
+ }
+
+}
+
+void
+RosegardenGUIApp::slotStateChanged(QString s,
+ bool noReverse)
+{
+ // RG_DEBUG << "RosegardenGUIApp::slotStateChanged " << s << "," << noReverse << endl;
+
+ stateChanged(s, noReverse ? KXMLGUIClient::StateNoReverse : KXMLGUIClient::StateReverse);
+}
+
+void
+RosegardenGUIApp::slotTestClipboard()
+{
+ if (m_clipboard->isEmpty()) {
+ stateChanged("have_clipboard", KXMLGUIClient::StateReverse);
+ stateChanged("have_clipboard_single_segment",
+ KXMLGUIClient::StateReverse);
+ } else {
+ stateChanged("have_clipboard", KXMLGUIClient::StateNoReverse);
+ stateChanged("have_clipboard_single_segment",
+ (m_clipboard->isSingleSegment() ?
+ KXMLGUIClient::StateNoReverse :
+ KXMLGUIClient::StateReverse));
+ }
+}
+
+void
+RosegardenGUIApp::plugAccelerators(QWidget *widget, QAccel *acc)
+{
+
+ acc->connectItem(acc->insertItem(Key_Enter),
+ this,
+ SLOT(slotPlay()));
+ // Alternative shortcut for Play
+ acc->connectItem(acc->insertItem(Key_Return + CTRL),
+ this,
+ SLOT(slotPlay()));
+
+ acc->connectItem(acc->insertItem(Key_Insert),
+ this,
+ SLOT(slotStop()));
+
+ acc->connectItem(acc->insertItem(Key_PageDown),
+ this,
+ SLOT(slotFastforward()));
+
+ acc->connectItem(acc->insertItem(Key_End),
+ this,
+ SLOT(slotRewind()));
+
+ acc->connectItem(acc->insertItem(Key_Space),
+ this,
+ SLOT(slotToggleRecord()));
+
+ TransportDialog *transport =
+ dynamic_cast<TransportDialog*>(widget);
+
+ if (transport) {
+ acc->connectItem(acc->insertItem(m_jumpToQuickMarkerAction->shortcut()),
+ this,
+ SLOT(slotJumpToQuickMarker()));
+
+ acc->connectItem(acc->insertItem(m_setQuickMarkerAction->shortcut()),
+ this,
+ SLOT(slotSetQuickMarker()));
+
+ connect(transport->PlayButton(),
+ SIGNAL(clicked()),
+ this,
+ SLOT(slotPlay()));
+
+ connect(transport->StopButton(),
+ SIGNAL(clicked()),
+ this,
+ SLOT(slotStop()));
+
+ connect(transport->FfwdButton(),
+ SIGNAL(clicked()),
+ SLOT(slotFastforward()));
+
+ connect(transport->RewindButton(),
+ SIGNAL(clicked()),
+ this,
+ SLOT(slotRewind()));
+
+ connect(transport->RecordButton(),
+ SIGNAL(clicked()),
+ this,
+ SLOT(slotRecord()));
+
+ connect(transport->RewindEndButton(),
+ SIGNAL(clicked()),
+ this,
+ SLOT(slotRewindToBeginning()));
+
+ connect(transport->FfwdEndButton(),
+ SIGNAL(clicked()),
+ this,
+ SLOT(slotFastForwardToEnd()));
+
+ connect(transport->MetronomeButton(),
+ SIGNAL(clicked()),
+ this,
+ SLOT(slotToggleMetronome()));
+
+ connect(transport->SoloButton(),
+ SIGNAL(toggled(bool)),
+ this,
+ SLOT(slotToggleSolo(bool)));
+
+ connect(transport->TimeDisplayButton(),
+ SIGNAL(clicked()),
+ this,
+ SLOT(slotRefreshTimeDisplay()));
+
+ connect(transport->ToEndButton(),
+ SIGNAL(clicked()),
+ SLOT(slotRefreshTimeDisplay()));
+ }
+}
+
+void
+RosegardenGUIApp::setCursor(const QCursor& cursor)
+{
+ KDockMainWindow::setCursor(cursor);
+
+ // play it safe, so we can use this class at anytime even very early in the app init
+ if ((getView() &&
+ getView()->getTrackEditor() &&
+ getView()->getTrackEditor()->getSegmentCanvas() &&
+ getView()->getTrackEditor()->getSegmentCanvas()->viewport())) {
+
+ getView()->getTrackEditor()->getSegmentCanvas()->viewport()->setCursor(cursor);
+ }
+
+ // view, main window...
+ //
+ getView()->setCursor(cursor);
+
+ // toolbars...
+ //
+ QPtrListIterator<KToolBar> tbIter = toolBarIterator();
+ KToolBar* tb = 0;
+ while ((tb = tbIter.current()) != 0) {
+ tb->setCursor(cursor);
+ ++tbIter;
+ }
+
+ m_dockLeft->setCursor(cursor);
+}
+
+QString
+RosegardenGUIApp::createNewAudioFile()
+{
+ AudioFile *aF = 0;
+ try {
+ aF = m_doc->getAudioFileManager().createRecordingAudioFile();
+ if (!aF) {
+ // createRecordingAudioFile doesn't actually write to the disk,
+ // and in principle it shouldn't fail
+ std::cerr << "ERROR: RosegardenGUIApp::createNewAudioFile: Failed to create recording audio file" << std::endl;
+ return "";
+ } else {
+ return aF->getFilename().c_str();
+ }
+ } catch (AudioFileManager::BadAudioPathException e) {
+ delete aF;
+ std::cerr << "ERROR: RosegardenGUIApp::createNewAudioFile: Failed to create recording audio file: " << e.getMessage() << std::endl;
+ return "";
+ }
+}
+
+QValueVector<QString>
+RosegardenGUIApp::createRecordAudioFiles(const QValueVector<InstrumentId> &recordInstruments)
+{
+ QValueVector<QString> qv;
+ for (unsigned int i = 0; i < recordInstruments.size(); ++i) {
+ AudioFile *aF = 0;
+ try {
+ aF = m_doc->getAudioFileManager().createRecordingAudioFile();
+ if (aF) {
+ // createRecordingAudioFile doesn't actually write to the disk,
+ // and in principle it shouldn't fail
+ qv.push_back(aF->getFilename().c_str());
+ m_doc->addRecordAudioSegment(recordInstruments[i],
+ aF->getId());
+ } else {
+ std::cerr << "ERROR: RosegardenGUIApp::createRecordAudioFiles: Failed to create recording audio file" << std::endl;
+ return qv;
+ }
+ } catch (AudioFileManager::BadAudioPathException e) {
+ delete aF;
+ std::cerr << "ERROR: RosegardenGUIApp::createRecordAudioFiles: Failed to create recording audio file: " << e.getMessage() << std::endl;
+ return qv;
+ }
+ }
+ return qv;
+}
+
+QString
+RosegardenGUIApp::getAudioFilePath()
+{
+ return QString(m_doc->getAudioFileManager().getAudioPath().c_str());
+}
+
+QValueVector<InstrumentId>
+RosegardenGUIApp::getArmedInstruments()
+{
+ std::set
+ <InstrumentId> iid;
+
+ const Composition::recordtrackcontainer &tr =
+ m_doc->getComposition().getRecordTracks();
+
+ for (Composition::recordtrackcontainer::const_iterator i =
+ tr.begin(); i != tr.end(); ++i) {
+ TrackId tid = (*i);
+ Track *track = m_doc->getComposition().getTrackById(tid);
+ if (track) {
+ iid.insert(track->getInstrument());
+ } else {
+ std::cerr << "Warning: RosegardenGUIApp::getArmedInstruments: Armed track " << tid << " not found in Composition" << std::endl;
+ }
+ }
+
+ QValueVector<InstrumentId> iv;
+ for (std::set
+ <InstrumentId>::iterator ii = iid.begin();
+ ii != iid.end(); ++ii) {
+ iv.push_back(*ii);
+ }
+ return iv;
+}
+
+void
+RosegardenGUIApp::showError(QString error)
+{
+ KStartupLogo::hideIfStillThere();
+ CurrentProgressDialog::freeze();
+
+ // This is principally used for return values from DSSI plugin
+ // configure() calls. It seems some plugins return a string
+ // telling you when everything's OK, as well as error strings, but
+ // dssi.h does make it reasonably clear that configure() should
+ // only return a string when there is actually a problem, so we're
+ // going to stick with a sorry dialog here rather than an
+ // information one
+
+ KMessageBox::sorry(0, error);
+
+ CurrentProgressDialog::thaw();
+}
+
+void
+RosegardenGUIApp::slotAudioManager()
+{
+ if (m_audioManagerDialog) {
+ m_audioManagerDialog->show();
+ m_audioManagerDialog->raise();
+ m_audioManagerDialog->setActiveWindow();
+ return ;
+ }
+
+ m_audioManagerDialog =
+ new AudioManagerDialog(this, m_doc);
+
+ connect(m_audioManagerDialog,
+ SIGNAL(playAudioFile(AudioFileId,
+ const RealTime &,
+ const RealTime&)),
+ SLOT(slotPlayAudioFile(AudioFileId,
+ const RealTime &,
+ const RealTime &)));
+
+ connect(m_audioManagerDialog,
+ SIGNAL(addAudioFile(AudioFileId)),
+ SLOT(slotAddAudioFile(AudioFileId)));
+
+ connect(m_audioManagerDialog,
+ SIGNAL(deleteAudioFile(AudioFileId)),
+ SLOT(slotDeleteAudioFile(AudioFileId)));
+
+ //
+ // Sync segment selection between audio man. dialog and main window
+ //
+
+ // from dialog to us...
+ connect(m_audioManagerDialog,
+ SIGNAL(segmentsSelected(const SegmentSelection&)),
+ m_view,
+ SLOT(slotPropagateSegmentSelection(const SegmentSelection&)));
+
+ // and from us to dialog
+ connect(this, SIGNAL(segmentsSelected(const SegmentSelection&)),
+ m_audioManagerDialog,
+ SLOT(slotSegmentSelection(const SegmentSelection&)));
+
+
+ connect(m_audioManagerDialog,
+ SIGNAL(deleteSegments(const SegmentSelection&)),
+ SLOT(slotDeleteSegments(const SegmentSelection&)));
+
+ connect(m_audioManagerDialog,
+ SIGNAL(insertAudioSegment(AudioFileId,
+ const RealTime&,
+ const RealTime&)),
+ m_view,
+ SLOT(slotAddAudioSegmentDefaultPosition(AudioFileId,
+ const RealTime&,
+ const RealTime&)));
+ connect(m_audioManagerDialog,
+ SIGNAL(cancelPlayingAudioFile(AudioFileId)),
+ SLOT(slotCancelAudioPlayingFile(AudioFileId)));
+
+ connect(m_audioManagerDialog,
+ SIGNAL(deleteAllAudioFiles()),
+ SLOT(slotDeleteAllAudioFiles()));
+
+ // Make sure we know when the audio man. dialog is closing
+ //
+ connect(m_audioManagerDialog,
+ SIGNAL(closing()),
+ SLOT(slotAudioManagerClosed()));
+
+ // And that it goes away when the current document is changing
+ //
+ connect(this, SIGNAL(documentAboutToChange()),
+ m_audioManagerDialog, SLOT(close()));
+
+ m_audioManagerDialog->setAudioSubsystemStatus(
+ m_seqManager->getSoundDriverStatus() & AUDIO_OK);
+
+ plugAccelerators(m_audioManagerDialog,
+ m_audioManagerDialog->getAccelerators());
+
+ m_audioManagerDialog->show();
+}
+
+void
+RosegardenGUIApp::slotPlayAudioFile(unsigned int id,
+ const RealTime &startTime,
+ const RealTime &duration)
+{
+ AudioFile *aF = m_doc->getAudioFileManager().getAudioFile(id);
+
+ if (aF == 0)
+ return ;
+
+ MappedEvent mE(m_doc->getStudio().
+ getAudioPreviewInstrument(),
+ id,
+ RealTime( -120, 0),
+ duration, // duration
+ startTime); // start index
+
+ StudioControl::sendMappedEvent(mE);
+
+}
+
+void
+RosegardenGUIApp::slotAddAudioFile(unsigned int id)
+{
+ AudioFile *aF = m_doc->getAudioFileManager().getAudioFile(id);
+
+ if (aF == 0)
+ return ;
+
+ QCString replyType;
+ QByteArray replyData;
+ QByteArray data;
+ QDataStream streamOut(data, IO_WriteOnly);
+
+ // We have to pass the filename as a QString
+ //
+ streamOut << QString(strtoqstr(aF->getFilename()));
+ streamOut << (int)aF->getId();
+
+ if (rgapp->sequencerCall("addAudioFile(QString, int)", replyType, replyData, data)) {
+ QDataStream streamIn(replyData, IO_ReadOnly);
+ int result;
+ streamIn >> result;
+ if (!result) {
+ KMessageBox::error(this, i18n("Sequencer failed to add audio file %1").arg(aF->getFilename().c_str()));
+ }
+ }
+}
+
+void
+RosegardenGUIApp::slotDeleteAudioFile(unsigned int id)
+{
+ if (m_doc->getAudioFileManager().removeFile(id) == false)
+ return ;
+
+ QCString replyType;
+ QByteArray replyData;
+ QByteArray data;
+ QDataStream streamOut(data, IO_WriteOnly);
+
+ // file id
+ //
+ streamOut << (int)id;
+
+ if (rgapp->sequencerCall("removeAudioFile(int)", replyType, replyData, data)) {
+ QDataStream streamIn(replyData, IO_ReadOnly);
+ int result;
+ streamIn >> result;
+ if (!result) {
+ KMessageBox::error(this, i18n("Sequencer failed to remove audio file id %1").arg(id));
+ }
+ }
+}
+
+void
+RosegardenGUIApp::slotDeleteSegments(const SegmentSelection &selection)
+{
+ m_view->slotPropagateSegmentSelection(selection);
+ slotDeleteSelectedSegments();
+}
+
+void
+RosegardenGUIApp::slotCancelAudioPlayingFile(AudioFileId id)
+{
+ AudioFile *aF = m_doc->getAudioFileManager().getAudioFile(id);
+
+ if (aF == 0)
+ return ;
+
+ MappedEvent mE(m_doc->getStudio().
+ getAudioPreviewInstrument(),
+ MappedEvent::AudioCancel,
+ id);
+
+ StudioControl::sendMappedEvent(mE);
+}
+
+void
+RosegardenGUIApp::slotDeleteAllAudioFiles()
+{
+ m_doc->getAudioFileManager().clear();
+
+ // Clear at the sequencer
+ //
+ QCString replyType;
+ QByteArray replyData;
+ QByteArray data;
+
+ rgapp->sequencerCall("clearAllAudioFiles()", replyType, replyData, data);
+}
+
+void
+RosegardenGUIApp::slotRepeatingSegments()
+{
+ m_view->getTrackEditor()->slotTurnRepeatingSegmentToRealCopies();
+}
+
+void
+RosegardenGUIApp::slotRelabelSegments()
+{
+ if (!m_view->haveSelection())
+ return ;
+
+ SegmentSelection selection(m_view->getSelection());
+ QString editLabel;
+
+ if (selection.size() == 0)
+ return ;
+ else if (selection.size() == 1)
+ editLabel = i18n("Modify Segment label");
+ else
+ editLabel = i18n("Modify Segments label");
+
+ KTmpStatusMsg msg(i18n("Relabelling selection..."), this);
+
+ // Generate label
+ QString label = strtoqstr((*selection.begin())->getLabel());
+
+ for (SegmentSelection::iterator i = selection.begin();
+ i != selection.end(); ++i) {
+ if (strtoqstr((*i)->getLabel()) != label)
+ label = "";
+ }
+
+ bool ok = false;
+
+ QString newLabel = KInputDialog::getText(editLabel,
+ i18n("Enter new label"),
+ label,
+ &ok,
+ this);
+
+ if (ok) {
+ m_doc->getCommandHistory()->addCommand
+ (new SegmentLabelCommand(selection, newLabel));
+ m_view->getTrackEditor()->getSegmentCanvas()->slotUpdateSegmentsDrawBuffer();
+ }
+}
+
+void
+RosegardenGUIApp::slotTransposeSegments()
+{
+ if (!m_view->haveSelection())
+ return ;
+
+ IntervalDialog intervalDialog(this, true, true);
+ int ok = intervalDialog.exec();
+
+ int semitones = intervalDialog.getChromaticDistance();
+ int steps = intervalDialog.getDiatonicDistance();
+
+ if (!ok || (semitones == 0 && steps == 0)) return;
+
+ m_doc->getCommandHistory()->addCommand
+ (new SegmentTransposeCommand(m_view->getSelection(), intervalDialog.getChangeKey(), steps, semitones, intervalDialog.getTransposeSegmentBack()));
+}
+
+void
+RosegardenGUIApp::slotChangeCompositionLength()
+{
+ CompositionLengthDialog dialog(this, &m_doc->getComposition());
+
+ if (dialog.exec() == QDialog::Accepted) {
+ ChangeCompositionLengthCommand *command
+ = new ChangeCompositionLengthCommand(
+ &m_doc->getComposition(),
+ dialog.getStartMarker(),
+ dialog.getEndMarker());
+
+ m_view->getTrackEditor()->getSegmentCanvas()->clearSegmentRectsCache(true);
+ m_doc->getCommandHistory()->addCommand(command);
+ }
+}
+
+void
+RosegardenGUIApp::slotManageMIDIDevices()
+{
+ if (m_deviceManager) {
+ m_deviceManager->show();
+ m_deviceManager->raise();
+ m_deviceManager->setActiveWindow();
+ return ;
+ }
+
+ m_deviceManager = new DeviceManagerDialog(this, m_doc);
+
+ connect(m_deviceManager, SIGNAL(closing()),
+ this, SLOT(slotDeviceManagerClosed()));
+
+ connect(this, SIGNAL(documentAboutToChange()),
+ m_deviceManager, SLOT(close()));
+
+ // Cheating way of updating the track/instrument list
+ //
+ connect(m_deviceManager, SIGNAL(deviceNamesChanged()),
+ m_view, SLOT(slotSynchroniseWithComposition()));
+
+ connect(m_deviceManager, SIGNAL(editBanks(DeviceId)),
+ this, SLOT(slotEditBanks(DeviceId)));
+
+ connect(m_deviceManager, SIGNAL(editControllers(DeviceId)),
+ this, SLOT(slotEditControlParameters(DeviceId)));
+
+ if (m_midiMixer) {
+ connect(m_deviceManager, SIGNAL(deviceNamesChanged()),
+ m_midiMixer, SLOT(slotSynchronise()));
+
+ }
+
+
+ m_deviceManager->show();
+}
+
+void
+RosegardenGUIApp::slotManageSynths()
+{
+ if (m_synthManager) {
+ m_synthManager->show();
+ m_synthManager->raise();
+ m_synthManager->setActiveWindow();
+ return ;
+ }
+
+ m_synthManager = new SynthPluginManagerDialog(this, m_doc
+#ifdef HAVE_LIBLO
+ , m_pluginGUIManager
+#endif
+ );
+
+ connect(m_synthManager, SIGNAL(closing()),
+ this, SLOT(slotSynthPluginManagerClosed()));
+
+ connect(this, SIGNAL(documentAboutToChange()),
+ m_synthManager, SLOT(close()));
+
+ connect(m_synthManager,
+ SIGNAL(pluginSelected(InstrumentId, int, int)),
+ this,
+ SLOT(slotPluginSelected(InstrumentId, int, int)));
+
+ connect(m_synthManager,
+ SIGNAL(showPluginDialog(QWidget *, InstrumentId, int)),
+ this,
+ SLOT(slotShowPluginDialog(QWidget *, InstrumentId, int)));
+
+ connect(m_synthManager,
+ SIGNAL(showPluginGUI(InstrumentId, int)),
+ this,
+ SLOT(slotShowPluginGUI(InstrumentId, int)));
+
+ m_synthManager->show();
+}
+
+void
+RosegardenGUIApp::slotOpenAudioMixer()
+{
+ if (m_audioMixer) {
+ m_audioMixer->show();
+ m_audioMixer->raise();
+ m_audioMixer->setActiveWindow();
+ return ;
+ }
+
+ m_audioMixer = new AudioMixerWindow(this, m_doc);
+
+ connect(m_audioMixer, SIGNAL(windowActivated()),
+ m_view, SLOT(slotActiveMainWindowChanged()));
+
+ connect(m_view, SIGNAL(controllerDeviceEventReceived(MappedEvent *, const void *)),
+ m_audioMixer, SLOT(slotControllerDeviceEventReceived(MappedEvent *, const void *)));
+
+ connect(m_audioMixer, SIGNAL(closing()),
+ this, SLOT(slotAudioMixerClosed()));
+
+ connect(m_audioMixer, SIGNAL(selectPlugin(QWidget *, InstrumentId, int)),
+ this, SLOT(slotShowPluginDialog(QWidget *, InstrumentId, int)));
+
+ connect(this,
+ SIGNAL(pluginSelected(InstrumentId, int, int)),
+ m_audioMixer,
+ SLOT(slotPluginSelected(InstrumentId, int, int)));
+
+ connect(this,
+ SIGNAL(pluginBypassed(InstrumentId, int, bool)),
+ m_audioMixer,
+ SLOT(slotPluginBypassed(InstrumentId, int, bool)));
+
+ connect(this, SIGNAL(documentAboutToChange()),
+ m_audioMixer, SLOT(close()));
+
+ connect(m_view, SIGNAL(checkTrackAssignments()),
+ m_audioMixer, SLOT(slotTrackAssignmentsChanged()));
+
+ connect(m_audioMixer, SIGNAL(play()),
+ this, SLOT(slotPlay()));
+ connect(m_audioMixer, SIGNAL(stop()),
+ this, SLOT(slotStop()));
+ connect(m_audioMixer, SIGNAL(fastForwardPlayback()),
+ this, SLOT(slotFastforward()));
+ connect(m_audioMixer, SIGNAL(rewindPlayback()),
+ this, SLOT(slotRewind()));
+ connect(m_audioMixer, SIGNAL(fastForwardPlaybackToEnd()),
+ this, SLOT(slotFastForwardToEnd()));
+ connect(m_audioMixer, SIGNAL(rewindPlaybackToBeginning()),
+ this, SLOT(slotRewindToBeginning()));
+ connect(m_audioMixer, SIGNAL(record()),
+ this, SLOT(slotRecord()));
+ connect(m_audioMixer, SIGNAL(panic()),
+ this, SLOT(slotPanic()));
+
+ connect(m_audioMixer,
+ SIGNAL(instrumentParametersChanged(InstrumentId)),
+ this,
+ SIGNAL(instrumentParametersChanged(InstrumentId)));
+
+ connect(this,
+ SIGNAL(instrumentParametersChanged(InstrumentId)),
+ m_audioMixer,
+ SLOT(slotUpdateInstrument(InstrumentId)));
+
+ if (m_synthManager) {
+ connect(m_synthManager,
+ SIGNAL(pluginSelected(InstrumentId, int, int)),
+ m_audioMixer,
+ SLOT(slotPluginSelected(InstrumentId, int, int)));
+ }
+
+ plugAccelerators(m_audioMixer, m_audioMixer->getAccelerators());
+
+ m_audioMixer->show();
+}
+
+void
+RosegardenGUIApp::slotOpenMidiMixer()
+{
+ if (m_midiMixer) {
+ m_midiMixer->show();
+ m_midiMixer->raise();
+ m_midiMixer->setActiveWindow();
+ return ;
+ }
+
+ m_midiMixer = new MidiMixerWindow(this, m_doc);
+
+ connect(m_midiMixer, SIGNAL(windowActivated()),
+ m_view, SLOT(slotActiveMainWindowChanged()));
+
+ connect(m_view, SIGNAL(controllerDeviceEventReceived(MappedEvent *, const void *)),
+ m_midiMixer, SLOT(slotControllerDeviceEventReceived(MappedEvent *, const void *)));
+
+ connect(m_midiMixer, SIGNAL(closing()),
+ this, SLOT(slotMidiMixerClosed()));
+
+ connect(this, SIGNAL(documentAboutToChange()),
+ m_midiMixer, SLOT(close()));
+
+ connect(m_midiMixer, SIGNAL(play()),
+ this, SLOT(slotPlay()));
+ connect(m_midiMixer, SIGNAL(stop()),
+ this, SLOT(slotStop()));
+ connect(m_midiMixer, SIGNAL(fastForwardPlayback()),
+ this, SLOT(slotFastforward()));
+ connect(m_midiMixer, SIGNAL(rewindPlayback()),
+ this, SLOT(slotRewind()));
+ connect(m_midiMixer, SIGNAL(fastForwardPlaybackToEnd()),
+ this, SLOT(slotFastForwardToEnd()));
+ connect(m_midiMixer, SIGNAL(rewindPlaybackToBeginning()),
+ this, SLOT(slotRewindToBeginning()));
+ connect(m_midiMixer, SIGNAL(record()),
+ this, SLOT(slotRecord()));
+ connect(m_midiMixer, SIGNAL(panic()),
+ this, SLOT(slotPanic()));
+
+ connect(m_midiMixer,
+ SIGNAL(instrumentParametersChanged(InstrumentId)),
+ this,
+ SIGNAL(instrumentParametersChanged(InstrumentId)));
+
+ connect(this,
+ SIGNAL(instrumentParametersChanged(InstrumentId)),
+ m_midiMixer,
+ SLOT(slotUpdateInstrument(InstrumentId)));
+
+ plugAccelerators(m_midiMixer, m_midiMixer->getAccelerators());
+
+ m_midiMixer->show();
+}
+
+void
+RosegardenGUIApp::slotEditControlParameters(DeviceId device)
+{
+ for (std::set
+ <ControlEditorDialog *>::iterator i = m_controlEditors.begin();
+ i != m_controlEditors.end(); ++i) {
+ if ((*i)->getDevice() == device) {
+ (*i)->show();
+ (*i)->raise();
+ (*i)->setActiveWindow();
+ return ;
+ }
+ }
+
+ ControlEditorDialog *controlEditor = new ControlEditorDialog(this, m_doc,
+ device);
+ m_controlEditors.insert(controlEditor);
+
+ RG_DEBUG << "inserting control editor dialog, have " << m_controlEditors.size() << " now" << endl;
+
+ connect(controlEditor, SIGNAL(closing()),
+ SLOT(slotControlEditorClosed()));
+
+ connect(this, SIGNAL(documentAboutToChange()),
+ controlEditor, SLOT(close()));
+
+ connect(m_doc, SIGNAL(devicesResyncd()),
+ controlEditor, SLOT(slotUpdate()));
+
+ controlEditor->show();
+}
+
+void
+RosegardenGUIApp::slotEditBanks()
+{
+ slotEditBanks(Device::NO_DEVICE);
+}
+
+void
+RosegardenGUIApp::slotEditBanks(DeviceId device)
+{
+ if (m_bankEditor) {
+ if (device != Device::NO_DEVICE)
+ m_bankEditor->setCurrentDevice(device);
+ m_bankEditor->show();
+ m_bankEditor->raise();
+ m_bankEditor->setActiveWindow();
+ return ;
+ }
+
+ m_bankEditor = new BankEditorDialog(this, m_doc, device);
+
+ connect(m_bankEditor, SIGNAL(closing()),
+ this, SLOT(slotBankEditorClosed()));
+
+ connect(this, SIGNAL(documentAboutToChange()),
+ m_bankEditor, SLOT(slotFileClose()));
+
+ // Cheating way of updating the track/instrument list
+ //
+ connect(m_bankEditor, SIGNAL(deviceNamesChanged()),
+ m_view, SLOT(slotSynchroniseWithComposition()));
+
+ m_bankEditor->show();
+}
+
+void
+RosegardenGUIApp::slotManageTriggerSegments()
+{
+ if (m_triggerSegmentManager) {
+ m_triggerSegmentManager->show();
+ m_triggerSegmentManager->raise();
+ m_triggerSegmentManager->setActiveWindow();
+ return ;
+ }
+
+ m_triggerSegmentManager = new TriggerSegmentManager(this, m_doc);
+
+ connect(m_triggerSegmentManager, SIGNAL(closing()),
+ SLOT(slotTriggerManagerClosed()));
+
+ connect(m_triggerSegmentManager, SIGNAL(editTriggerSegment(int)),
+ m_view, SLOT(slotEditTriggerSegment(int)));
+
+ m_triggerSegmentManager->show();
+}
+
+void
+RosegardenGUIApp::slotTriggerManagerClosed()
+{
+ RG_DEBUG << "RosegardenGUIApp::slotTriggerManagerClosed" << endl;
+
+ m_triggerSegmentManager = 0;
+}
+
+void
+RosegardenGUIApp::slotEditMarkers()
+{
+ if (m_markerEditor) {
+ m_markerEditor->show();
+ m_markerEditor->raise();
+ m_markerEditor->setActiveWindow();
+ return ;
+ }
+
+ m_markerEditor = new MarkerEditor(this, m_doc);
+
+ connect(m_markerEditor, SIGNAL(closing()),
+ SLOT(slotMarkerEditorClosed()));
+
+ connect(m_markerEditor, SIGNAL(jumpToMarker(timeT)),
+ m_doc, SLOT(slotSetPointerPosition(timeT)));
+
+ plugAccelerators(m_markerEditor, m_markerEditor->getAccelerators());
+
+ m_markerEditor->show();
+}
+
+void
+RosegardenGUIApp::slotMarkerEditorClosed()
+{
+ RG_DEBUG << "RosegardenGUIApp::slotMarkerEditorClosed" << endl;
+
+ m_markerEditor = 0;
+}
+
+void
+RosegardenGUIApp::slotEditTempos(timeT t)
+{
+ if (m_tempoView) {
+ m_tempoView->show();
+ m_tempoView->raise();
+ m_tempoView->setActiveWindow();
+ return ;
+ }
+
+ m_tempoView = new TempoView(m_doc, getView(), t);
+
+ connect(m_tempoView, SIGNAL(closing()),
+ SLOT(slotTempoViewClosed()));
+
+ connect(m_tempoView, SIGNAL(windowActivated()),
+ getView(), SLOT(slotActiveMainWindowChanged()));
+
+ connect(m_tempoView,
+ SIGNAL(changeTempo(timeT,
+ tempoT,
+ tempoT,
+ TempoDialog::TempoDialogAction)),
+ this,
+ SLOT(slotChangeTempo(timeT,
+ tempoT,
+ tempoT,
+ TempoDialog::TempoDialogAction)));
+
+ connect(m_tempoView, SIGNAL(saveFile()), this, SLOT(slotFileSave()));
+
+ plugAccelerators(m_tempoView, m_tempoView->getAccelerators());
+
+ m_tempoView->show();
+}
+
+void
+RosegardenGUIApp::slotTempoViewClosed()
+{
+ RG_DEBUG << "RosegardenGUIApp::slotTempoViewClosed" << endl;
+
+ m_tempoView = 0;
+}
+
+void
+RosegardenGUIApp::slotControlEditorClosed()
+{
+ const QObject *s = sender();
+
+ RG_DEBUG << "RosegardenGUIApp::slotControlEditorClosed" << endl;
+
+ for (std::set
+ <ControlEditorDialog *>::iterator i = m_controlEditors.begin();
+ i != m_controlEditors.end(); ++i) {
+ if (*i == s) {
+ m_controlEditors.erase(i);
+ RG_DEBUG << "removed control editor dialog, have " << m_controlEditors.size() << " left" << endl;
+ return ;
+ }
+ }
+
+ std::cerr << "WARNING: control editor " << s << " closed, but couldn't find it in our control editor list (we have " << m_controlEditors.size() << " editors)" << std::endl;
+}
+
+void
+RosegardenGUIApp::slotShowPluginDialog(QWidget *parent,
+ InstrumentId instrumentId,
+ int index)
+{
+ if (!parent)
+ parent = this;
+
+ int key = (index << 16) + instrumentId;
+
+ if (m_pluginDialogs[key]) {
+ m_pluginDialogs[key]->show();
+ m_pluginDialogs[key]->raise();
+ m_pluginDialogs[key]->setActiveWindow();
+ return ;
+ }
+
+ PluginContainer *container = 0;
+
+ container = m_doc->getStudio().getContainerById(instrumentId);
+ if (!container) {
+ RG_DEBUG << "RosegardenGUIApp::slotShowPluginDialog - "
+ << "no instrument or buss of id " << instrumentId << endl;
+ return ;
+ }
+
+ // only create a dialog if we've got a plugin instance
+ AudioPluginInstance *inst =
+ container->getPlugin(index);
+
+ if (!inst) {
+ RG_DEBUG << "RosegardenGUIApp::slotShowPluginDialog - "
+ << "no AudioPluginInstance found for index "
+ << index << endl;
+ return ;
+ }
+
+ // Create the plugin dialog
+ //
+ AudioPluginDialog *dialog =
+ new AudioPluginDialog(parent,
+ m_doc->getPluginManager(),
+#ifdef HAVE_LIBLO
+ m_pluginGUIManager,
+#endif
+ container,
+ index);
+
+ connect(dialog, SIGNAL(windowActivated()),
+ m_view, SLOT(slotActiveMainWindowChanged()));
+
+/* This feature isn't provided by the plugin dialog
+ connect(m_view, SIGNAL(controllerDeviceEventReceived(MappedEvent *, const void *)),
+ dialog, SLOT(slotControllerDeviceEventReceived(MappedEvent *, const void *)));
+*/
+
+ // Plug the new dialog into the standard keyboard accelerators so
+ // that we can use them still while the plugin has focus.
+ //
+ plugAccelerators(dialog, dialog->getAccelerators());
+
+ connect(dialog,
+ SIGNAL(pluginSelected(InstrumentId, int, int)),
+ this,
+ SLOT(slotPluginSelected(InstrumentId, int, int)));
+
+ connect(dialog,
+ SIGNAL(pluginPortChanged(InstrumentId, int, int)),
+ this,
+ SLOT(slotPluginPortChanged(InstrumentId, int, int)));
+
+ connect(dialog,
+ SIGNAL(pluginProgramChanged(InstrumentId, int)),
+ this,
+ SLOT(slotPluginProgramChanged(InstrumentId, int)));
+
+ connect(dialog,
+ SIGNAL(changePluginConfiguration(InstrumentId, int, bool, QString, QString)),
+ this,
+ SLOT(slotChangePluginConfiguration(InstrumentId, int, bool, QString, QString)));
+
+ connect(dialog,
+ SIGNAL(showPluginGUI(InstrumentId, int)),
+ this,
+ SLOT(slotShowPluginGUI(InstrumentId, int)));
+
+ connect(dialog,
+ SIGNAL(stopPluginGUI(InstrumentId, int)),
+ this,
+ SLOT(slotStopPluginGUI(InstrumentId, int)));
+
+ connect(dialog,
+ SIGNAL(bypassed(InstrumentId, int, bool)),
+ this,
+ SLOT(slotPluginBypassed(InstrumentId, int, bool)));
+
+ connect(dialog,
+ SIGNAL(destroyed(InstrumentId, int)),
+ this,
+ SLOT(slotPluginDialogDestroyed(InstrumentId, int)));
+
+ connect(this, SIGNAL(documentAboutToChange()), dialog, SLOT(close()));
+
+ m_pluginDialogs[key] = dialog;
+ m_pluginDialogs[key]->show();
+
+ // Set modified
+ m_doc->slotDocumentModified();
+}
+
+void
+RosegardenGUIApp::slotPluginSelected(InstrumentId instrumentId,
+ int index, int plugin)
+{
+ const QObject *s = sender();
+
+ bool fromSynthMgr = (s == m_synthManager);
+
+ // It's assumed that ports etc will already have been set up on
+ // the AudioPluginInstance before this is invoked.
+
+ PluginContainer *container = 0;
+
+ container = m_doc->getStudio().getContainerById(instrumentId);
+ if (!container) {
+ RG_DEBUG << "RosegardenGUIApp::slotPluginSelected - "
+ << "no instrument or buss of id " << instrumentId << endl;
+ return ;
+ }
+
+ AudioPluginInstance *inst =
+ container->getPlugin(index);
+
+ if (!inst) {
+ RG_DEBUG << "RosegardenGUIApp::slotPluginSelected - "
+ << "got index of unknown plugin!" << endl;
+ return ;
+ }
+
+ if (plugin == -1) {
+ // Destroy plugin instance
+ //!!! seems iffy -- why can't we just unassign it?
+
+ if (StudioControl::
+ destroyStudioObject(inst->getMappedId())) {
+ RG_DEBUG << "RosegardenGUIApp::slotPluginSelected - "
+ << "cannot destroy Studio object "
+ << inst->getMappedId() << endl;
+ }
+
+ inst->setAssigned(false);
+ } else {
+ // If unassigned then create a sequencer instance of this
+ // AudioPluginInstance.
+ //
+ if (inst->isAssigned()) {
+ RG_DEBUG << "RosegardenGUIApp::slotPluginSelected - "
+ << " setting identifier for mapper id " << inst->getMappedId()
+ << " to " << inst->getIdentifier() << endl;
+
+ StudioControl::setStudioObjectProperty
+ (inst->getMappedId(),
+ MappedPluginSlot::Identifier,
+ strtoqstr(inst->getIdentifier()));
+ } else {
+ // create a studio object at the sequencer
+ MappedObjectId newId =
+ StudioControl::createStudioObject
+ (MappedObject::PluginSlot);
+
+ RG_DEBUG << "RosegardenGUIApp::slotPluginSelected - "
+ << " new MappedObjectId = " << newId << endl;
+
+ // set the new Mapped ID and that this instance
+ // is assigned
+ inst->setMappedId(newId);
+ inst->setAssigned(true);
+
+ // set the instrument id
+ StudioControl::setStudioObjectProperty
+ (newId,
+ MappedObject::Instrument,
+ MappedObjectValue(instrumentId));
+
+ // set the position
+ StudioControl::setStudioObjectProperty
+ (newId,
+ MappedObject::Position,
+ MappedObjectValue(index));
+
+ // set the plugin id
+ StudioControl::setStudioObjectProperty
+ (newId,
+ MappedPluginSlot::Identifier,
+ strtoqstr(inst->getIdentifier()));
+ }
+ }
+
+ int pluginMappedId = inst->getMappedId();
+
+ //!!! much code duplicated here from RosegardenGUIDoc::initialiseStudio
+
+ inst->setConfigurationValue
+ (qstrtostr(PluginIdentifier::RESERVED_PROJECT_DIRECTORY_KEY),
+ m_doc->getAudioFileManager().getAudioPath());
+
+ // Set opaque string configuration data (e.g. for DSSI plugin)
+ //
+ MappedObjectPropertyList config;
+ for (AudioPluginInstance::ConfigMap::const_iterator
+ i = inst->getConfiguration().begin();
+ i != inst->getConfiguration().end(); ++i) {
+ config.push_back(strtoqstr(i->first));
+ config.push_back(strtoqstr(i->second));
+ }
+ StudioControl::setStudioObjectPropertyList
+ (pluginMappedId,
+ MappedPluginSlot::Configuration,
+ config);
+
+ // Set the bypass
+ //
+ StudioControl::setStudioObjectProperty
+ (pluginMappedId,
+ MappedPluginSlot::Bypassed,
+ MappedObjectValue(inst->isBypassed()));
+
+ // Set the program
+ //
+ if (inst->getProgram() != "") {
+ StudioControl::setStudioObjectProperty
+ (pluginMappedId,
+ MappedPluginSlot::Program,
+ strtoqstr(inst->getProgram()));
+ }
+
+ // Set all the port values
+ //
+ PortInstanceIterator portIt;
+
+ for (portIt = inst->begin();
+ portIt != inst->end(); ++portIt) {
+ StudioControl::setStudioPluginPort
+ (pluginMappedId,
+ (*portIt)->number,
+ (*portIt)->value);
+ }
+
+ if (fromSynthMgr) {
+ int key = (index << 16) + instrumentId;
+ if (m_pluginDialogs[key]) {
+ m_pluginDialogs[key]->updatePlugin(plugin);
+ }
+ } else if (m_synthManager) {
+ m_synthManager->updatePlugin(instrumentId, plugin);
+ }
+
+ emit pluginSelected(instrumentId, index, plugin);
+
+ // Set modified
+ m_doc->slotDocumentModified();
+}
+
+void
+RosegardenGUIApp::slotChangePluginPort(InstrumentId instrumentId,
+ int pluginIndex,
+ int portIndex,
+ float value)
+{
+ PluginContainer *container = 0;
+
+ container = m_doc->getStudio().getContainerById(instrumentId);
+ if (!container) {
+ RG_DEBUG << "RosegardenGUIApp::slotChangePluginPort - "
+ << "no instrument or buss of id " << instrumentId << endl;
+ return ;
+ }
+
+ AudioPluginInstance *inst = container->getPlugin(pluginIndex);
+ if (!inst) {
+ RG_DEBUG << "RosegardenGUIApp::slotChangePluginPort - "
+ << "no plugin at index " << pluginIndex << " on " << instrumentId << endl;
+ return ;
+ }
+
+ PluginPortInstance *port = inst->getPort(portIndex);
+ if (!port) {
+ RG_DEBUG << "RosegardenGUIApp::slotChangePluginPort - no port "
+ << portIndex << endl;
+ return ;
+ }
+
+ RG_DEBUG << "RosegardenGUIApp::slotPluginPortChanged - "
+ << "setting plugin port (" << inst->getMappedId()
+ << ", " << portIndex << ") from " << port->value
+ << " to " << value << endl;
+
+ port->setValue(value);
+
+ StudioControl::setStudioPluginPort(inst->getMappedId(),
+ portIndex, port->value);
+
+ m_doc->slotDocumentModified();
+
+ // This modification came from The Outside!
+ int key = (pluginIndex << 16) + instrumentId;
+ if (m_pluginDialogs[key]) {
+ m_pluginDialogs[key]->updatePluginPortControl(portIndex);
+ }
+}
+
+void
+RosegardenGUIApp::slotPluginPortChanged(InstrumentId instrumentId,
+ int pluginIndex,
+ int portIndex)
+{
+ PluginContainer *container = 0;
+
+ container = m_doc->getStudio().getContainerById(instrumentId);
+ if (!container) {
+ RG_DEBUG << "RosegardenGUIApp::slotPluginPortChanged - "
+ << "no instrument or buss of id " << instrumentId << endl;
+ return ;
+ }
+
+ AudioPluginInstance *inst = container->getPlugin(pluginIndex);
+ if (!inst) {
+ RG_DEBUG << "RosegardenGUIApp::slotPluginPortChanged - "
+ << "no plugin at index " << pluginIndex << " on " << instrumentId << endl;
+ return ;
+ }
+
+ PluginPortInstance *port = inst->getPort(portIndex);
+ if (!port) {
+ RG_DEBUG << "RosegardenGUIApp::slotPluginPortChanged - no port "
+ << portIndex << endl;
+ return ;
+ }
+
+ RG_DEBUG << "RosegardenGUIApp::slotPluginPortChanged - "
+ << "setting plugin port (" << inst->getMappedId()
+ << ", " << portIndex << ") to " << port->value << endl;
+
+ StudioControl::setStudioPluginPort(inst->getMappedId(),
+ portIndex, port->value);
+
+ m_doc->slotDocumentModified();
+
+#ifdef HAVE_LIBLO
+ // This modification came from our own plugin dialog, so update
+ // any external GUIs
+ if (m_pluginGUIManager) {
+ m_pluginGUIManager->updatePort(instrumentId,
+ pluginIndex,
+ portIndex);
+ }
+#endif
+}
+
+void
+RosegardenGUIApp::slotChangePluginProgram(InstrumentId instrumentId,
+ int pluginIndex,
+ QString program)
+{
+ PluginContainer *container = 0;
+
+ container = m_doc->getStudio().getContainerById(instrumentId);
+ if (!container) {
+ RG_DEBUG << "RosegardenGUIApp::slotChangePluginProgram - "
+ << "no instrument or buss of id " << instrumentId << endl;
+ return ;
+ }
+
+ AudioPluginInstance *inst = container->getPlugin(pluginIndex);
+ if (!inst) {
+ RG_DEBUG << "RosegardenGUIApp::slotChangePluginProgram - "
+ << "no plugin at index " << pluginIndex << " on " << instrumentId << endl;
+ return ;
+ }
+
+ RG_DEBUG << "RosegardenGUIApp::slotChangePluginProgram - "
+ << "setting plugin program ("
+ << inst->getMappedId() << ") from " << inst->getProgram()
+ << " to " << program << endl;
+
+ inst->setProgram(qstrtostr(program));
+
+ StudioControl::
+ setStudioObjectProperty(inst->getMappedId(),
+ MappedPluginSlot::Program,
+ program);
+
+ PortInstanceIterator portIt;
+
+ for (portIt = inst->begin();
+ portIt != inst->end(); ++portIt) {
+ float value = StudioControl::getStudioPluginPort
+ (inst->getMappedId(),
+ (*portIt)->number);
+ (*portIt)->value = value;
+ }
+
+ // Set modified
+ m_doc->slotDocumentModified();
+
+ int key = (pluginIndex << 16) + instrumentId;
+ if (m_pluginDialogs[key]) {
+ m_pluginDialogs[key]->updatePluginProgramControl();
+ }
+}
+
+void
+RosegardenGUIApp::slotPluginProgramChanged(InstrumentId instrumentId,
+ int pluginIndex)
+{
+ PluginContainer *container = 0;
+
+ container = m_doc->getStudio().getContainerById(instrumentId);
+ if (!container) {
+ RG_DEBUG << "RosegardenGUIApp::slotPluginProgramChanged - "
+ << "no instrument or buss of id " << instrumentId << endl;
+ return ;
+ }
+
+ AudioPluginInstance *inst = container->getPlugin(pluginIndex);
+ if (!inst) {
+ RG_DEBUG << "RosegardenGUIApp::slotPluginProgramChanged - "
+ << "no plugin at index " << pluginIndex << " on " << instrumentId << endl;
+ return ;
+ }
+
+ QString program = strtoqstr(inst->getProgram());
+
+ RG_DEBUG << "RosegardenGUIApp::slotPluginProgramChanged - "
+ << "setting plugin program ("
+ << inst->getMappedId() << ") to " << program << endl;
+
+ StudioControl::
+ setStudioObjectProperty(inst->getMappedId(),
+ MappedPluginSlot::Program,
+ program);
+
+ PortInstanceIterator portIt;
+
+ for (portIt = inst->begin();
+ portIt != inst->end(); ++portIt) {
+ float value = StudioControl::getStudioPluginPort
+ (inst->getMappedId(),
+ (*portIt)->number);
+ (*portIt)->value = value;
+ }
+
+ // Set modified
+ m_doc->slotDocumentModified();
+
+#ifdef HAVE_LIBLO
+
+ if (m_pluginGUIManager)
+ m_pluginGUIManager->updateProgram(instrumentId,
+ pluginIndex);
+#endif
+}
+
+void
+RosegardenGUIApp::slotChangePluginConfiguration(InstrumentId instrumentId,
+ int index,
+ bool global,
+ QString key,
+ QString value)
+{
+ PluginContainer *container = 0;
+
+ container = m_doc->getStudio().getContainerById(instrumentId);
+ if (!container) {
+ RG_DEBUG << "RosegardenGUIApp::slotChangePluginConfiguration - "
+ << "no instrument or buss of id " << instrumentId << endl;
+ return ;
+ }
+
+ AudioPluginInstance *inst = container->getPlugin(index);
+
+ if (global && inst) {
+
+ // Set the same configuration on other plugins in the same
+ // instance group
+
+ AudioPlugin *pl =
+ m_pluginManager->getPluginByIdentifier(strtoqstr(inst->getIdentifier()));
+
+ if (pl && pl->isGrouped()) {
+
+ InstrumentList il =
+ m_doc->getStudio().getAllInstruments();
+
+ for (InstrumentList::iterator i = il.begin();
+ i != il.end(); ++i) {
+
+ for (PluginInstanceIterator pli =
+ (*i)->beginPlugins();
+ pli != (*i)->endPlugins(); ++pli) {
+
+ if (*pli && (*pli)->isAssigned() &&
+ (*pli)->getIdentifier() == inst->getIdentifier() &&
+ (*pli) != inst) {
+
+ slotChangePluginConfiguration
+ ((*i)->getId(), (*pli)->getPosition(),
+ false, key, value);
+
+#ifdef HAVE_LIBLO
+
+ m_pluginGUIManager->updateConfiguration
+ ((*i)->getId(), (*pli)->getPosition(), key);
+#endif
+
+ }
+ }
+ }
+ }
+ }
+
+ if (inst) {
+
+ inst->setConfigurationValue(qstrtostr(key), qstrtostr(value));
+
+ MappedObjectPropertyList config;
+ for (AudioPluginInstance::ConfigMap::const_iterator
+ i = inst->getConfiguration().begin();
+ i != inst->getConfiguration().end(); ++i) {
+ config.push_back(strtoqstr(i->first));
+ config.push_back(strtoqstr(i->second));
+ }
+
+ RG_DEBUG << "RosegardenGUIApp::slotChangePluginConfiguration: setting new config on mapped id " << inst->getMappedId() << endl;
+
+ StudioControl::setStudioObjectPropertyList
+ (inst->getMappedId(),
+ MappedPluginSlot::Configuration,
+ config);
+
+ // Set modified
+ m_doc->slotDocumentModified();
+
+ int key = (index << 16) + instrumentId;
+ if (m_pluginDialogs[key]) {
+ m_pluginDialogs[key]->updatePluginProgramList();
+ }
+ }
+}
+
+void
+RosegardenGUIApp::slotPluginDialogDestroyed(InstrumentId instrumentId,
+ int index)
+{
+ int key = (index << 16) + instrumentId;
+ m_pluginDialogs[key] = 0;
+}
+
+void
+RosegardenGUIApp::slotPluginBypassed(InstrumentId instrumentId,
+ int pluginIndex, bool bp)
+{
+ PluginContainer *container = 0;
+
+ container = m_doc->getStudio().getContainerById(instrumentId);
+ if (!container) {
+ RG_DEBUG << "RosegardenGUIApp::slotPluginBypassed - "
+ << "no instrument or buss of id " << instrumentId << endl;
+ return ;
+ }
+
+ AudioPluginInstance *inst = container->getPlugin(pluginIndex);
+
+ if (inst) {
+ StudioControl::setStudioObjectProperty
+ (inst->getMappedId(),
+ MappedPluginSlot::Bypassed,
+ MappedObjectValue(bp));
+
+ // Set the bypass on the instance
+ //
+ inst->setBypass(bp);
+
+ // Set modified
+ m_doc->slotDocumentModified();
+ }
+
+ emit pluginBypassed(instrumentId, pluginIndex, bp);
+}
+
+void
+RosegardenGUIApp::slotShowPluginGUI(InstrumentId instrument,
+ int index)
+{
+#ifdef HAVE_LIBLO
+ m_pluginGUIManager->showGUI(instrument, index);
+#endif
+}
+
+void
+RosegardenGUIApp::slotStopPluginGUI(InstrumentId instrument,
+ int index)
+{
+#ifdef HAVE_LIBLO
+ m_pluginGUIManager->stopGUI(instrument, index);
+#endif
+}
+
+void
+RosegardenGUIApp::slotPluginGUIExited(InstrumentId instrument,
+ int index)
+{
+ int key = (index << 16) + instrument;
+ if (m_pluginDialogs[key]) {
+ m_pluginDialogs[key]->guiExited();
+ }
+}
+
+void
+RosegardenGUIApp::slotPlayList()
+{
+ if (!m_playList) {
+ m_playList = new PlayListDialog(i18n("Play List"), this);
+ connect(m_playList, SIGNAL(closing()),
+ SLOT(slotPlayListClosed()));
+ connect(m_playList->getPlayList(), SIGNAL(play(QString)),
+ SLOT(slotPlayListPlay(QString)));
+ }
+
+ m_playList->show();
+}
+
+void
+RosegardenGUIApp::slotPlayListPlay(QString url)
+{
+ slotStop();
+ openURL(url);
+ slotPlay();
+}
+
+void
+RosegardenGUIApp::slotPlayListClosed()
+{
+ RG_DEBUG << "RosegardenGUIApp::slotPlayListClosed()\n";
+ m_playList = 0;
+}
+
+void
+RosegardenGUIApp::slotTutorial()
+{
+ QString exe = KStandardDirs::findExe( "x-www-browser" );
+
+ if( exe )
+ {
+ KProcess *proc = new KProcess;
+ *proc << "x-www-browser";
+ *proc << "http://rosegarden.sourceforge.net/tutorial/en/chapter-0.html";
+
+ proc->start(KProcess::DontCare);
+ proc->detach();
+ delete proc;
+ }
+ else
+ {
+ QString tutorialURL = i18n("http://rosegarden.sourceforge.net/tutorial/en/chapter-0.html");
+ kapp->invokeBrowser(tutorialURL);
+ }
+}
+
+void
+RosegardenGUIApp::slotBugGuidelines()
+{
+ QString exe = KStandardDirs::findExe( "x-www-browser" );
+
+ if( exe )
+ {
+ KProcess *proc = new KProcess;
+ *proc << "x-www-browser";
+ *proc << "http://rosegarden.sourceforge.net/tutorial/bug-guidelines.html";
+
+ proc->start(KProcess::DontCare);
+ proc->detach();
+ delete proc;
+ }
+ else
+ {
+ QString tutorialURL = i18n("http://rosegarden.sourceforge.net/tutorial/bug-guidelines.html");
+ kapp->invokeBrowser(tutorialURL);
+ }
+}
+
+void
+RosegardenGUIApp::slotBankEditorClosed()
+{
+ RG_DEBUG << "RosegardenGUIApp::slotBankEditorClosed()\n";
+
+ if (m_doc->isModified()) {
+ if (m_view)
+ m_view->slotSelectTrackSegments(m_doc->getComposition().getSelectedTrack());
+ }
+
+ m_bankEditor = 0;
+}
+
+void
+RosegardenGUIApp::slotDeviceManagerClosed()
+{
+ RG_DEBUG << "RosegardenGUIApp::slotDeviceManagerClosed()\n";
+
+ if (m_doc->isModified()) {
+ if (m_view)
+ m_view->slotSelectTrackSegments(m_doc->getComposition().getSelectedTrack());
+ }
+
+ m_deviceManager = 0;
+}
+
+void
+RosegardenGUIApp::slotSynthPluginManagerClosed()
+{
+ RG_DEBUG << "RosegardenGUIApp::slotSynthPluginManagerClosed()\n";
+
+ m_synthManager = 0;
+}
+
+void
+RosegardenGUIApp::slotAudioMixerClosed()
+{
+ RG_DEBUG << "RosegardenGUIApp::slotAudioMixerClosed()\n";
+
+ m_audioMixer = 0;
+}
+
+void
+RosegardenGUIApp::slotMidiMixerClosed()
+{
+ RG_DEBUG << "RosegardenGUIApp::slotMidiMixerClosed()\n";
+
+ m_midiMixer = 0;
+}
+
+void
+RosegardenGUIApp::slotAudioManagerClosed()
+{
+ RG_DEBUG << "RosegardenGUIApp::slotAudioManagerClosed()\n";
+
+ if (m_doc->isModified()) {
+ if (m_view)
+ m_view->slotSelectTrackSegments(m_doc->getComposition().getSelectedTrack());
+ }
+
+ m_audioManagerDialog = 0;
+}
+
+void
+RosegardenGUIApp::slotPanic()
+{
+ if (m_seqManager) {
+ // Stop the transport before we send a panic as the
+ // playback goes all to hell anyway.
+ //
+ slotStop();
+
+ ProgressDialog progressDlg(i18n("Queueing MIDI panic events for tranmission..."),
+ 100,
+ this);
+ CurrentProgressDialog::set
+ (&progressDlg);
+ ProgressDialog::processEvents();
+
+ connect(m_seqManager, SIGNAL(setProgress(int)),
+ progressDlg.progressBar(), SLOT(setValue(int)));
+ connect(m_seqManager, SIGNAL(incrementProgress(int)),
+ progressDlg.progressBar(), SLOT(advance(int)));
+
+ m_seqManager->panic();
+
+ }
+}
+
+void
+RosegardenGUIApp::slotPopulateTrackInstrumentPopup()
+{
+ RG_DEBUG << "RosegardenGUIApp::slotSetTrackInstrument\n";
+ Composition &comp = m_doc->getComposition();
+ Track *track = comp.getTrackById(comp.getSelectedTrack());
+
+ if (!track) {
+ RG_DEBUG << "Weird: no track available for instrument popup!" << endl;
+ return ;
+ }
+
+ Instrument* instrument = m_doc->getStudio().getInstrumentById(track->getInstrument());
+
+ QPopupMenu* popup = dynamic_cast<QPopupMenu*>(factory()->container("set_track_instrument", this));
+
+ m_view->getTrackEditor()->getTrackButtons()->populateInstrumentPopup(instrument, popup);
+}
+
+void
+RosegardenGUIApp::slotRemapInstruments()
+{
+ RG_DEBUG << "RosegardenGUIApp::slotRemapInstruments\n";
+ RemapInstrumentDialog dialog(this, m_doc);
+
+ connect(&dialog, SIGNAL(applyClicked()),
+ m_view->getTrackEditor()->getTrackButtons(),
+ SLOT(slotSynchroniseWithComposition()));
+
+ if (dialog.exec() == QDialog::Accepted) {
+ RG_DEBUG << "slotRemapInstruments - accepted\n";
+ }
+
+}
+
+void
+RosegardenGUIApp::slotSaveDefaultStudio()
+{
+ RG_DEBUG << "RosegardenGUIApp::slotSaveDefaultStudio\n";
+
+ int reply = KMessageBox::warningYesNo
+ (this, i18n("Are you sure you want to save this as your default studio?"));
+
+ if (reply != KMessageBox::Yes)
+ return ;
+
+ KTmpStatusMsg msg(i18n("Saving current document as default studio..."), this);
+
+ QString autoloadFile = ::locateLocal("appdata", "autoload.rg");
+
+ RG_DEBUG << "RosegardenGUIApp::slotSaveDefaultStudio : saving studio in "
+ << autoloadFile << endl;
+
+ SetWaitCursor waitCursor;
+ QString errMsg;
+ bool res = m_doc->saveDocument(autoloadFile, errMsg);
+ if (!res) {
+ if (errMsg)
+ KMessageBox::error(this, i18n(QString("Could not auto-save document at %1\nError was : %2")
+ .arg(autoloadFile).arg(errMsg)));
+ else
+ KMessageBox::error(this, i18n(QString("Could not auto-save document at %1")
+ .arg(autoloadFile)));
+
+ }
+}
+
+void
+RosegardenGUIApp::slotImportDefaultStudio()
+{
+ int reply = KMessageBox::warningYesNo
+ (this, i18n("Are you sure you want to import your default studio and lose the current one?"));
+
+ if (reply != KMessageBox::Yes)
+ return ;
+
+ QString autoloadFile =
+ KGlobal::dirs()->findResource("appdata", "autoload.rg");
+
+ QFileInfo autoloadFileInfo(autoloadFile);
+
+ if (!autoloadFileInfo.isReadable()) {
+ RG_DEBUG << "RosegardenGUIDoc::slotImportDefaultStudio - "
+ << "can't find autoload file - defaulting" << endl;
+ return ;
+ }
+
+ slotImportStudioFromFile(autoloadFile);
+}
+
+void
+RosegardenGUIApp::slotImportStudio()
+{
+ RG_DEBUG << "RosegardenGUIApp::slotImportStudio()\n";
+
+ QString studioDir = KGlobal::dirs()->findResource("appdata", "library/");
+ QDir dir(studioDir);
+ if (!dir.exists()) {
+ studioDir = ":ROSEGARDENDEVICE";
+ } else {
+ studioDir = "file://" + studioDir;
+ }
+
+ KURL url = KFileDialog::getOpenURL
+ (studioDir,
+ "audio/x-rosegarden-device audio/x-rosegarden",
+ this, i18n("Import Studio from File"));
+
+ if (url.isEmpty())
+ return ;
+
+ QString target;
+ if (KIO::NetAccess::download(url, target, this) == false) {
+ KMessageBox::error(this, i18n("Cannot download file %1")
+ .arg(url.prettyURL()));
+ return ;
+ }
+
+ slotImportStudioFromFile(target);
+}
+
+void
+RosegardenGUIApp::slotImportStudioFromFile(const QString &file)
+{
+ RosegardenGUIDoc *doc = new RosegardenGUIDoc(this, 0, true); // skipAutoload
+
+ Studio &oldStudio = m_doc->getStudio();
+ Studio &newStudio = doc->getStudio();
+
+ // Add some dummy devices for when we open the document. We guess
+ // that the file won't have more than 32 devices.
+ //
+ // for (unsigned int i = 0; i < 32; i++) {
+ // newStudio.addDevice("", i, Device::Midi);
+ // }
+
+ if (doc->openDocument(file, true)) { // true because we actually
+ // do want to create devices
+ // on the sequencer here
+
+ KMacroCommand *command = new KMacroCommand(i18n("Import Studio"));
+ doc->syncDevices();
+
+ // We actually only copy across MIDI play devices... for now
+ std::vector<DeviceId> midiPlayDevices;
+
+ for (DeviceList::const_iterator i =
+ oldStudio.begin(); i != oldStudio.end(); ++i) {
+
+ MidiDevice *md =
+ dynamic_cast<MidiDevice *>(*i);
+
+ if (md && (md->getDirection() == MidiDevice::Play)) {
+ midiPlayDevices.push_back((*i)->getId());
+ }
+ }
+
+ std::vector<DeviceId>::iterator di(midiPlayDevices.begin());
+
+ for (DeviceList::const_iterator i =
+ newStudio.begin(); i != newStudio.end(); ++i) {
+
+ MidiDevice *md =
+ dynamic_cast<MidiDevice *>(*i);
+
+ if (md && (md->getDirection() == MidiDevice::Play)) {
+ if (di != midiPlayDevices.end()) {
+ MidiDevice::VariationType variation
+ (md->getVariationType());
+ BankList bl(md->getBanks());
+ ProgramList pl(md->getPrograms());
+ ControlList cl(md->getControlParameters());
+
+ ModifyDeviceCommand* mdCommand = new ModifyDeviceCommand(&oldStudio,
+ *di,
+ md->getName(),
+ md->getLibrarianName(),
+ md->getLibrarianEmail());
+ mdCommand->setVariation(variation);
+ mdCommand->setBankList(bl);
+ mdCommand->setProgramList(pl);
+ mdCommand->setControlList(cl);
+ mdCommand->setOverwrite(true);
+ mdCommand->setRename(md->getName() != "");
+
+ command->addCommand(mdCommand);
+ ++di;
+ }
+ }
+ }
+
+ while (di != midiPlayDevices.end()) {
+ command->addCommand(new CreateOrDeleteDeviceCommand
+ (&oldStudio,
+ *di));
+ }
+
+ oldStudio.setMIDIThruFilter(newStudio.getMIDIThruFilter());
+ oldStudio.setMIDIRecordFilter(newStudio.getMIDIRecordFilter());
+
+ m_doc->getCommandHistory()->addCommand(command);
+ m_doc->syncDevices();
+ m_doc->initialiseStudio(); // The other document will have reset it
+ }
+
+ delete doc;
+}
+
+void
+RosegardenGUIApp::slotResetMidiNetwork()
+{
+ if (m_seqManager) {
+
+ m_seqManager->preparePlayback(true);
+
+ m_seqManager->resetMidiNetwork();
+ }
+
+}
+
+void
+RosegardenGUIApp::slotModifyMIDIFilters()
+{
+ RG_DEBUG << "RosegardenGUIApp::slotModifyMIDIFilters" << endl;
+
+ MidiFilterDialog dialog(this, m_doc);
+
+ if (dialog.exec() == QDialog::Accepted) {
+ RG_DEBUG << "slotModifyMIDIFilters - accepted" << endl;
+ }
+}
+
+void
+RosegardenGUIApp::slotManageMetronome()
+{
+ RG_DEBUG << "RosegardenGUIApp::slotManageMetronome" << endl;
+
+ ManageMetronomeDialog dialog(this, m_doc);
+
+ if (dialog.exec() == QDialog::Accepted) {
+ RG_DEBUG << "slotManageMetronome - accepted" << endl;
+ }
+}
+
+void
+RosegardenGUIApp::slotAutoSave()
+{
+ if (!m_seqManager ||
+ m_seqManager->getTransportStatus() == PLAYING ||
+ m_seqManager->getTransportStatus() == RECORDING)
+ return ;
+
+ KConfig* config = kapp->config();
+ config->setGroup(GeneralOptionsConfigGroup);
+ if (!config->readBoolEntry("autosave", true))
+ return ;
+
+ m_doc->slotAutoSave();
+}
+
+void
+RosegardenGUIApp::slotUpdateAutoSaveInterval(unsigned int interval)
+{
+ RG_DEBUG << "RosegardenGUIApp::slotUpdateAutoSaveInterval - "
+ << "changed interval to " << interval << endl;
+ m_autoSaveTimer->changeInterval(int(interval) * 1000);
+}
+
+void
+RosegardenGUIApp::slotUpdateSidebarStyle(unsigned int style)
+{
+ RG_DEBUG << "RosegardenGUIApp::slotUpdateSidebarStyle - "
+ << "changed style to " << style << endl;
+ m_parameterArea->setArrangement((RosegardenParameterArea::Arrangement) style);
+}
+
+void
+RosegardenGUIApp::slotShowTip()
+{
+ RG_DEBUG << "RosegardenGUIApp::slotShowTip" << endl;
+ KTipDialog::showTip(this, locate("data", "rosegarden/tips"), true);
+}
+
+void RosegardenGUIApp::slotShowToolHelp(const QString &s)
+{
+ QString msg = s;
+ if (msg != "") msg = " " + msg;
+ slotStatusMsg(msg);
+}
+
+void
+RosegardenGUIApp::slotEnableMIDIThruRouting()
+{
+ m_seqManager->enableMIDIThruRouting(m_enableMIDIrouting->isChecked());
+}
+
+TransportDialog* RosegardenGUIApp::getTransport()
+{
+ if (m_transport == 0)
+ createAndSetupTransport();
+
+ return m_transport;
+}
+
+RosegardenGUIDoc *RosegardenGUIApp::getDocument() const
+{
+ return m_doc;
+}
+
+void
+RosegardenGUIApp::awaitDialogClearance()
+{
+ bool haveDialog = true;
+
+ std::cerr << "RosegardenGUIApp::awaitDialogClearance: entering" << std::endl;
+
+ while (haveDialog) {
+
+ const QObjectList *c = children();
+ if (!c) return;
+
+ haveDialog = false;
+ for (QObjectList::const_iterator i = c->begin(); i != c->end(); ++i) {
+ QDialog *dialog = dynamic_cast<QDialog *>(*i);
+ if (dialog && dialog->isVisible()) {
+ haveDialog = true;
+ break;
+ }
+ }
+
+// std::cerr << "RosegardenGUIApp::awaitDialogClearance: have dialog = "
+// << haveDialog << std::endl;
+
+ if (haveDialog) kapp->processEvents();
+ }
+
+ std::cerr << "RosegardenGUIApp::awaitDialogClearance: exiting" << std::endl;
+}
+
+void
+RosegardenGUIApp::slotNewerVersionAvailable(QString v)
+{
+ if (m_firstRun) return;
+ KStartupLogo::hideIfStillThere();
+ CurrentProgressDialog::freeze();
+ awaitDialogClearance();
+ KMessageBox::information
+ (this,
+ i18n("<h3>Newer version available</h3><p>A newer version of Rosegarden may be available.<br>Please consult the <a href=\"http://www.rosegardenmusic.com/getting/\">Rosegarden website</a> for more information.</p>"),
+ i18n("Newer version available"),
+ QString("version-%1-available-show").arg(v),
+ KMessageBox::AllowLink);
+ CurrentProgressDialog::thaw();
+}
+
+void
+RosegardenGUIApp::slotSetQuickMarker()
+{
+ RG_DEBUG << "RosegardenGUIApp::slotSetQuickMarker" << endl;
+
+ m_doc->setQuickMarker();
+ getView()->getTrackEditor()->updateRulers();
+}
+
+void
+RosegardenGUIApp::slotJumpToQuickMarker()
+{
+ RG_DEBUG << "RosegardenGUIApp::slotJumpToQuickMarker" << endl;
+
+ m_doc->jumpToQuickMarker();
+}
+
+const void* RosegardenGUIApp::SequencerExternal = (void*)-1;
+RosegardenGUIApp *RosegardenGUIApp::m_myself = 0;
+
+}
+#include "RosegardenGUIApp.moc"
diff --git a/src/gui/application/RosegardenGUIApp.cpp.orig b/src/gui/application/RosegardenGUIApp.cpp.orig
new file mode 100644
index 0000000..fa98530
--- /dev/null
+++ b/src/gui/application/RosegardenGUIApp.cpp.orig
@@ -0,0 +1,8043 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "RosegardenGUIApp.h"
+#include <kapplication.h>
+
+#include "gui/editors/segment/TrackEditor.h"
+#include "gui/editors/segment/TrackButtons.h"
+#include "misc/Debug.h"
+#include "misc/Strings.h"
+#include "gui/application/RosegardenDCOP.h"
+#include "base/AnalysisTypes.h"
+#include "base/AudioPluginInstance.h"
+#include "base/Clipboard.h"
+#include "base/Composition.h"
+#include "base/CompositionTimeSliceAdapter.h"
+#include "base/Configuration.h"
+#include "base/Device.h"
+#include "base/Exception.h"
+#include "base/Instrument.h"
+#include "base/MidiDevice.h"
+#include "base/MidiProgram.h"
+#include "base/NotationTypes.h"
+#include "base/Profiler.h"
+#include "base/RealTime.h"
+#include "base/Segment.h"
+#include "base/SegmentNotationHelper.h"
+#include "base/Selection.h"
+#include "base/Studio.h"
+#include "base/Track.h"
+#include "commands/edit/CopyCommand.h"
+#include "commands/edit/CutCommand.h"
+#include "commands/edit/EventQuantizeCommand.h"
+#include "commands/edit/PasteSegmentsCommand.h"
+#include "commands/edit/TransposeCommand.h"
+#include "commands/edit/AddMarkerCommand.h"
+#include "commands/edit/ModifyMarkerCommand.h"
+#include "commands/edit/RemoveMarkerCommand.h"
+#include "commands/notation/KeyInsertionCommand.h"
+#include "commands/segment/AddTempoChangeCommand.h"
+#include "commands/segment/AddTimeSignatureAndNormalizeCommand.h"
+#include "commands/segment/AddTimeSignatureCommand.h"
+#include "commands/segment/AudioSegmentAutoSplitCommand.h"
+#include "commands/segment/AudioSegmentRescaleCommand.h"
+#include "commands/segment/AudioSegmentSplitCommand.h"
+#include "commands/segment/ChangeCompositionLengthCommand.h"
+#include "commands/segment/CreateTempoMapFromSegmentCommand.h"
+#include "commands/segment/CutRangeCommand.h"
+#include "commands/segment/DeleteRangeCommand.h"
+#include "commands/segment/InsertRangeCommand.h"
+#include "commands/segment/ModifyDefaultTempoCommand.h"
+#include "commands/segment/MoveTracksCommand.h"
+#include "commands/segment/PasteRangeCommand.h"
+#include "commands/segment/RemoveTempoChangeCommand.h"
+#include "commands/segment/SegmentAutoSplitCommand.h"
+#include "commands/segment/SegmentChangeTransposeCommand.h"
+#include "commands/segment/SegmentJoinCommand.h"
+#include "commands/segment/SegmentLabelCommand.h"
+#include "commands/segment/SegmentReconfigureCommand.h"
+#include "commands/segment/SegmentRescaleCommand.h"
+#include "commands/segment/SegmentSplitByPitchCommand.h"
+#include "commands/segment/SegmentSplitByRecordingSrcCommand.h"
+#include "commands/segment/SegmentSplitCommand.h"
+#include "commands/segment/SegmentTransposeCommand.h"
+#include "commands/studio/CreateOrDeleteDeviceCommand.h"
+#include "commands/studio/ModifyDeviceCommand.h"
+#include "document/io/CsoundExporter.h"
+#include "document/io/HydrogenLoader.h"
+#include "document/io/LilyPondExporter.h"
+#include "document/MultiViewCommandHistory.h"
+#include "document/io/RG21Loader.h"
+#include "document/io/MupExporter.h"
+#include "document/io/MusicXmlExporter.h"
+#include "document/RosegardenGUIDoc.h"
+#include "document/ConfigGroups.h"
+#include "gui/application/RosegardenApplication.h"
+#include "gui/dialogs/AddTracksDialog.h"
+#include "gui/dialogs/AudioManagerDialog.h"
+#include "gui/dialogs/AudioPluginDialog.h"
+#include "gui/dialogs/AudioSplitDialog.h"
+#include "gui/dialogs/BeatsBarsDialog.h"
+#include "gui/dialogs/CompositionLengthDialog.h"
+#include "gui/dialogs/ConfigureDialog.h"
+#include "gui/dialogs/CountdownDialog.h"
+#include "gui/dialogs/DocumentConfigureDialog.h"
+#include "gui/dialogs/FileMergeDialog.h"
+#include "gui/dialogs/IdentifyTextCodecDialog.h"
+#include "gui/dialogs/IntervalDialog.h"
+#include "gui/dialogs/LilyPondOptionsDialog.h"
+#include "gui/dialogs/ManageMetronomeDialog.h"
+#include "gui/dialogs/QuantizeDialog.h"
+#include "gui/dialogs/RescaleDialog.h"
+#include "gui/dialogs/SplitByPitchDialog.h"
+#include "gui/dialogs/SplitByRecordingSrcDialog.h"
+#include "gui/dialogs/TempoDialog.h"
+#include "gui/dialogs/TimeDialog.h"
+#include "gui/dialogs/TimeSignatureDialog.h"
+#include "gui/dialogs/TransportDialog.h"
+#include "gui/editors/parameters/InstrumentParameterBox.h"
+#include "gui/editors/parameters/RosegardenParameterArea.h"
+#include "gui/editors/parameters/SegmentParameterBox.h"
+#include "gui/editors/parameters/TrackParameterBox.h"
+#include "gui/editors/segment/segmentcanvas/CompositionView.h"
+#include "gui/editors/segment/ControlEditorDialog.h"
+#include "gui/editors/segment/MarkerEditor.h"
+#include "gui/editors/segment/PlayListDialog.h"
+#include "gui/editors/segment/PlayList.h"
+#include "gui/editors/segment/segmentcanvas/SegmentEraser.h"
+#include "gui/editors/segment/segmentcanvas/SegmentJoiner.h"
+#include "gui/editors/segment/segmentcanvas/SegmentMover.h"
+#include "gui/editors/segment/segmentcanvas/SegmentPencil.h"
+#include "gui/editors/segment/segmentcanvas/SegmentResizer.h"
+#include "gui/editors/segment/segmentcanvas/SegmentSelector.h"
+#include "gui/editors/segment/segmentcanvas/SegmentSplitter.h"
+#include "gui/editors/segment/segmentcanvas/SegmentToolBox.h"
+#include "gui/editors/segment/TrackLabel.h"
+#include "gui/editors/segment/TriggerSegmentManager.h"
+#include "gui/editors/tempo/TempoView.h"
+#include "gui/general/EditViewBase.h"
+#include "gui/kdeext/KStartupLogo.h"
+#include "gui/kdeext/KTmpStatusMsg.h"
+#include "gui/seqmanager/MidiFilterDialog.h"
+#include "gui/seqmanager/SequenceManager.h"
+#include "gui/seqmanager/SequencerMapper.h"
+#include "gui/studio/AudioMixerWindow.h"
+#include "gui/studio/AudioPlugin.h"
+#include "gui/studio/AudioPluginManager.h"
+#include "gui/studio/AudioPluginOSCGUIManager.h"
+#include "gui/studio/BankEditorDialog.h"
+#include "gui/studio/DeviceManagerDialog.h"
+#include "gui/studio/MidiMixerWindow.h"
+#include "gui/studio/RemapInstrumentDialog.h"
+#include "gui/studio/StudioControl.h"
+#include "gui/studio/SynthPluginManagerDialog.h"
+#include "gui/widgets/CurrentProgressDialog.h"
+#include "gui/widgets/ProgressBar.h"
+#include "gui/widgets/ProgressDialog.h"
+#include "LircClient.h"
+#include "LircCommander.h"
+#include "RosegardenGUIView.h"
+#include "RosegardenIface.h"
+#include "SetWaitCursor.h"
+#include "sound/AudioFile.h"
+#include "sound/AudioFileManager.h"
+#include "sound/MappedCommon.h"
+#include "sound/MappedComposition.h"
+#include "sound/MappedEvent.h"
+#include "sound/MappedStudio.h"
+#include "sound/MidiFile.h"
+#include "sound/PluginIdentifier.h"
+#include "sound/SoundDriver.h"
+#include "StartupTester.h"
+#include <dcopclient.h>
+#include <dcopobject.h>
+#include <dcopref.h>
+#include <kaction.h>
+#include <kconfig.h>
+#include <kdcopactionproxy.h>
+#include <kdockwidget.h>
+#include <kedittoolbar.h>
+#include <kfiledialog.h>
+#include <kglobal.h>
+#include <kinputdialog.h>
+#include <kio/netaccess.h>
+#include <kkeydialog.h>
+#include <klocale.h>
+#include <kmainwindow.h>
+#include <kmessagebox.h>
+#include <kmimetype.h>
+#include <kprocess.h>
+#include <kstatusbar.h>
+#include <kstdaccel.h>
+#include <kstdaction.h>
+#include <kstddirs.h>
+#include <ktempfile.h>
+#include <ktip.h>
+#include <ktoolbar.h>
+#include <kurl.h>
+#include <kxmlguiclient.h>
+#include <qaccel.h>
+#include <qcanvas.h>
+#include <qcstring.h>
+#include <qcursor.h>
+#include <qdatastream.h>
+#include <qdialog.h>
+#include <qdir.h>
+#include <qfile.h>
+#include <qfileinfo.h>
+#include <qiconset.h>
+#include <qinputdialog.h>
+#include <qlabel.h>
+#include <qobject.h>
+#include <qobjectlist.h>
+#include <qpixmap.h>
+#include <qpopupmenu.h>
+#include <qpushbutton.h>
+#include <qregexp.h>
+#include <qslider.h>
+#include <qstring.h>
+#include <qstringlist.h>
+#include <qtextcodec.h>
+#include <qtimer.h>
+#include <qvaluevector.h>
+#include <qwidget.h>
+
+#ifdef HAVE_LIBJACK
+#include <jack/jack.h>
+#endif
+
+
+namespace Rosegarden
+{
+
+RosegardenGUIApp::RosegardenGUIApp(bool useSequencer,
+ bool useExistingSequencer,
+ QObject *startupStatusMessageReceiver)
+ : DCOPObject("RosegardenIface"), RosegardenIface(this), KDockMainWindow(0),
+ m_actionsSetup(false),
+ m_fileRecent(0),
+ m_view(0),
+ m_swapView(0),
+ m_mainDockWidget(0),
+ m_dockLeft(0),
+ m_doc(0),
+ m_sequencerProcess(0),
+ m_sequencerCheckedIn(false),
+#ifdef HAVE_LIBJACK
+ m_jackProcess(0),
+#endif
+ m_zoomSlider(0),
+ m_seqManager(0),
+ m_transport(0),
+ m_audioManagerDialog(0),
+ m_originatingJump(false),
+ m_storedLoopStart(0),
+ m_storedLoopEnd(0),
+ m_useSequencer(useSequencer),
+ m_dockVisible(true),
+ m_autoSaveTimer(new QTimer(this)),
+ m_clipboard(new Clipboard),
+ m_playList(0),
+ m_deviceManager(0),
+ m_synthManager(0),
+ m_audioMixer(0),
+ m_midiMixer(0),
+ m_bankEditor(0),
+ m_markerEditor(0),
+ m_tempoView(0),
+ m_triggerSegmentManager(0),
+#ifdef HAVE_LIBLO
+ m_pluginGUIManager(new AudioPluginOSCGUIManager(this)),
+#endif
+ m_playTimer(new QTimer(this)),
+ m_stopTimer(new QTimer(this)),
+ m_startupTester(0),
+#ifdef HAVE_LIRC
+ m_lircClient(0),
+ m_lircCommander(0),
+#endif
+ m_haveAudioImporter(false),
+ m_firstRun(false),
+ m_parameterArea(0)
+{
+ m_myself = this;
+
+
+ if (startupStatusMessageReceiver) {
+ QObject::connect(this, SIGNAL(startupStatusMessage(QString)),
+ startupStatusMessageReceiver,
+ SLOT(slotShowStatusMessage(QString)));
+ }
+
+ // Try to start the sequencer
+ //
+ if (m_useSequencer) {
+
+#ifdef HAVE_LIBJACK
+#define OFFER_JACK_START_OPTION 1
+#ifdef OFFER_JACK_START_OPTION
+ // First we check if jackd is running allready
+
+ std::string jackClientName = "rosegarden";
+
+ // attempt connection to JACK server
+ //
+ jack_client_t* testJackClient;
+ testJackClient = jack_client_new(jackClientName.c_str());
+ if (testJackClient == 0 ) {
+
+ // If no connection to JACK
+ // try to launch JACK - if the configuration wants us to.
+ if (!launchJack()) {
+ KStartupLogo::hideIfStillThere();
+ KMessageBox::error(this, i18n("Attempted to launch JACK audio daemon failed. Audio will be disabled.\nPlease check configuration (Settings -> Configure Rosegarden -> Audio -> Startup)\n and restart."));
+ }
+ } else {
+ //this client was just for testing
+ jack_client_close(testJackClient);
+ }
+#endif // OFFER_JACK_START_OPTION
+#endif // HAVE_LIBJACK
+
+ emit startupStatusMessage(i18n("Starting sequencer..."));
+ launchSequencer(useExistingSequencer);
+
+ } else
+ RG_DEBUG << "RosegardenGUIApp : don't use sequencer\n";
+
+ // Plugin manager
+ //
+ emit startupStatusMessage(i18n("Initializing plugin manager..."));
+ m_pluginManager = new AudioPluginManager();
+
+ // call inits to invoke all other construction parts
+ //
+ emit startupStatusMessage(i18n("Initializing view..."));
+ initStatusBar();
+ setupActions();
+ iFaceDelayedInit(this);
+ initZoomToolbar();
+
+ QPixmap dummyPixmap; // any icon will do
+ m_mainDockWidget = createDockWidget("Rosegarden MainDockWidget", dummyPixmap, 0L, "main_dock_widget");
+ // allow others to dock to the left and right sides only
+ m_mainDockWidget->setDockSite(KDockWidget::DockLeft | KDockWidget::DockRight);
+ // forbit docking abilities of m_mainDockWidget itself
+ m_mainDockWidget->setEnableDocking(KDockWidget::DockNone);
+ setView(m_mainDockWidget); // central widget in a KDE mainwindow
+ setMainDockWidget(m_mainDockWidget); // master dockwidget
+
+ m_dockLeft = createDockWidget("params dock", dummyPixmap, 0L,
+ i18n("Special Parameters"));
+ m_dockLeft->manualDock(m_mainDockWidget, // dock target
+ KDockWidget::DockLeft, // dock site
+ 20); // relation target/this (in percent)
+
+ connect(m_dockLeft, SIGNAL(iMBeingClosed()),
+ this, SLOT(slotParametersClosed()));
+ connect(m_dockLeft, SIGNAL(hasUndocked()),
+ this, SLOT(slotParametersClosed()));
+ // Apparently, hasUndocked() is emitted when the dock widget's
+ // 'close' button on the dock handle is clicked.
+ connect(m_mainDockWidget, SIGNAL(docking(KDockWidget*, KDockWidget::DockPosition)),
+ this, SLOT(slotParametersDockedBack(KDockWidget*, KDockWidget::DockPosition)));
+
+ stateChanged("parametersbox_closed", KXMLGUIClient::StateReverse);
+
+ RosegardenGUIDoc* doc = new RosegardenGUIDoc(this, m_pluginManager);
+
+ m_parameterArea = new RosegardenParameterArea(m_dockLeft);
+ m_dockLeft->setWidget(m_parameterArea);
+
+ // Populate the parameter-box area with the respective
+ // parameter box widgets.
+
+ m_segmentParameterBox = new SegmentParameterBox(doc, m_parameterArea);
+ m_parameterArea->addRosegardenParameterBox(m_segmentParameterBox);
+ m_trackParameterBox = new TrackParameterBox(doc, m_parameterArea);
+ m_parameterArea->addRosegardenParameterBox(m_trackParameterBox);
+ m_instrumentParameterBox = new InstrumentParameterBox(doc, m_parameterArea);
+ m_parameterArea->addRosegardenParameterBox(m_instrumentParameterBox);
+
+ // Lookup the configuration parameter that specifies the default
+ // arrangement, and instantiate it.
+
+ kapp->config()->setGroup(GeneralOptionsConfigGroup);
+ m_parameterArea->setArrangement((RosegardenParameterArea::Arrangement)
+ kapp->config()->readUnsignedNumEntry("sidebarstyle",
+ RosegardenParameterArea::CLASSIC_STYLE));
+
+ m_dockLeft->update();
+
+ connect(m_instrumentParameterBox,
+ SIGNAL(selectPlugin(QWidget *, InstrumentId, int)),
+ this,
+ SLOT(slotShowPluginDialog(QWidget *, InstrumentId, int)));
+
+ connect(m_instrumentParameterBox,
+ SIGNAL(showPluginGUI(InstrumentId, int)),
+ this,
+ SLOT(slotShowPluginGUI(InstrumentId, int)));
+
+ // relay this through our own signal so that others can use it too
+ connect(m_instrumentParameterBox,
+ SIGNAL(instrumentParametersChanged(InstrumentId)),
+ this,
+ SIGNAL(instrumentParametersChanged(InstrumentId)));
+
+ connect(this,
+ SIGNAL(instrumentParametersChanged(InstrumentId)),
+ m_instrumentParameterBox,
+ SLOT(slotInstrumentParametersChanged(InstrumentId)));
+
+ connect(this,
+ SIGNAL(pluginSelected(InstrumentId, int, int)),
+ m_instrumentParameterBox,
+ SLOT(slotPluginSelected(InstrumentId, int, int)));
+
+ connect(this,
+ SIGNAL(pluginBypassed(InstrumentId, int, bool)),
+ m_instrumentParameterBox,
+ SLOT(slotPluginBypassed(InstrumentId, int, bool)));
+
+ // Load the initial document (this includes doc's own autoload)
+ //
+ setDocument(doc);
+
+ emit startupStatusMessage(i18n("Starting sequence manager..."));
+
+ // transport is created by setupActions()
+ m_seqManager = new SequenceManager(m_doc, getTransport());
+
+ if (m_useSequencer) {
+ // Check the sound driver status and warn the user of any
+ // problems. This warning has to happen early, in case it
+ // affects the ability to load plugins etc from a file on the
+ // command line.
+ m_seqManager->checkSoundDriverStatus(true);
+ }
+
+ if (m_view) {
+ connect(m_seqManager, SIGNAL(controllerDeviceEventReceived(MappedEvent *)),
+ m_view, SLOT(slotControllerDeviceEventReceived(MappedEvent *)));
+ }
+
+ if (m_seqManager->getSoundDriverStatus() & AUDIO_OK) {
+ slotStateChanged("got_audio", true);
+ } else {
+ slotStateChanged("got_audio", false);
+ }
+
+ // If we're restarting the gui then make sure any transient
+ // studio objects are cleared away.
+ emit startupStatusMessage(i18n("Clearing studio data..."));
+ m_seqManager->reinitialiseSequencerStudio();
+
+ // Send the transport control statuses for MMC and JACK
+ //
+ m_seqManager->sendTransportControlStatuses();
+
+ // Now autoload
+ //
+ stateChanged("new_file");
+ stateChanged("have_segments", KXMLGUIClient::StateReverse);
+ stateChanged("have_selection", KXMLGUIClient::StateReverse);
+ slotTestClipboard();
+
+ // Check for lack of MIDI devices and disable Studio options accordingly
+ //
+ if (!m_doc->getStudio().haveMidiDevices())
+ stateChanged("got_midi_devices", KXMLGUIClient::StateReverse);
+
+ emit startupStatusMessage(i18n("Starting..."));
+
+ setupFileDialogSpeedbar();
+ readOptions();
+
+ // All toolbars should be created before this is called
+ setAutoSaveSettings(MainWindowConfigGroup, true);
+
+#ifdef HAVE_LIRC
+
+ try {
+ m_lircClient = new LircClient();
+ } catch (Exception e) {
+ RG_DEBUG << e.getMessage().c_str() << endl;
+ // continue without
+ m_lircClient = 0;
+ }
+ if (m_lircClient) {
+ m_lircCommander = new LircCommander(m_lircClient, this);
+ }
+#endif
+
+ stateChanged("have_project_packager", KXMLGUIClient::StateReverse);
+ stateChanged("have_lilypondview", KXMLGUIClient::StateReverse);
+ QTimer::singleShot(1000, this, SLOT(slotTestStartupTester()));
+}
+
+RosegardenGUIApp::~RosegardenGUIApp()
+{
+ RG_DEBUG << "~RosegardenGUIApp()\n";
+
+ if (getView() &&
+ getView()->getTrackEditor() &&
+ getView()->getTrackEditor()->getSegmentCanvas()) {
+ getView()->getTrackEditor()->getSegmentCanvas()->endAudioPreviewGeneration();
+ }
+
+#ifdef HAVE_LIBLO
+ delete m_pluginGUIManager;
+#endif
+
+ if (isSequencerRunning() && !isSequencerExternal()) {
+ m_sequencerProcess->blockSignals(true);
+ rgapp->sequencerSend("quit()");
+ usleep(300000);
+ delete m_sequencerProcess;
+ }
+
+ delete m_jumpToQuickMarkerAction;
+ delete m_setQuickMarkerAction;
+
+ delete m_transport;
+
+ delete m_seqManager;
+
+#ifdef HAVE_LIRC
+
+ delete m_lircCommander;
+ delete m_lircClient;
+#endif
+
+ delete m_doc;
+ Profiles::getInstance()->dump();
+}
+
+void RosegardenGUIApp::setupActions()
+{
+ // setup File menu
+ // New Window ?
+ KStdAction::openNew (this, SLOT(slotFileNew()), actionCollection());
+ KStdAction::open (this, SLOT(slotFileOpen()), actionCollection());
+ m_fileRecent = KStdAction::openRecent(this,
+ SLOT(slotFileOpenRecent(const KURL&)),
+ actionCollection());
+ KStdAction::save (this, SLOT(slotFileSave()), actionCollection());
+ KStdAction::saveAs(this, SLOT(slotFileSaveAs()), actionCollection());
+ KStdAction::revert(this, SLOT(slotRevertToSaved()), actionCollection());
+ KStdAction::close (this, SLOT(slotFileClose()), actionCollection());
+ KStdAction::print (this, SLOT(slotFilePrint()), actionCollection());
+ KStdAction::printPreview (this, SLOT(slotFilePrintPreview()), actionCollection());
+
+ new KAction(i18n("Import Rosegarden &Project file..."), 0, 0, this,
+ SLOT(slotImportProject()), actionCollection(),
+ "file_import_project");
+
+ new KAction(i18n("Import &MIDI file..."), 0, 0, this,
+ SLOT(slotImportMIDI()), actionCollection(),
+ "file_import_midi");
+
+ new KAction(i18n("Import &Rosegarden 2.1 file..."), 0, 0, this,
+ SLOT(slotImportRG21()), actionCollection(),
+ "file_import_rg21");
+
+ new KAction(i18n("Import &Hydrogen file..."), 0, 0, this,
+ SLOT(slotImportHydrogen()), actionCollection(),
+ "file_import_hydrogen");
+
+ new KAction(i18n("Merge &File..."), 0, 0, this,
+ SLOT(slotMerge()), actionCollection(),
+ "file_merge");
+
+ new KAction(i18n("Merge &MIDI file..."), 0, 0, this,
+ SLOT(slotMergeMIDI()), actionCollection(),
+ "file_merge_midi");
+
+ new KAction(i18n("Merge &Rosegarden 2.1 file..."), 0, 0, this,
+ SLOT(slotMergeRG21()), actionCollection(),
+ "file_merge_rg21");
+
+ new KAction(i18n("Merge &Hydrogen file..."), 0, 0, this,
+ SLOT(slotMergeHydrogen()), actionCollection(),
+ "file_merge_hydrogen");
+
+ new KAction(i18n("Export Rosegarden &Project file..."), 0, 0, this,
+ SLOT(slotExportProject()), actionCollection(),
+ "file_export_project");
+
+ new KAction(i18n("Export &MIDI file..."), 0, 0, this,
+ SLOT(slotExportMIDI()), actionCollection(),
+ "file_export_midi");
+
+ new KAction(i18n("Export &LilyPond file..."), 0, 0, this,
+ SLOT(slotExportLilyPond()), actionCollection(),
+ "file_export_lilypond");
+
+ new KAction(i18n("Export Music&XML file..."), 0, 0, this,
+ SLOT(slotExportMusicXml()), actionCollection(),
+ "file_export_musicxml");
+
+ new KAction(i18n("Export &Csound score file..."), 0, 0, this,
+ SLOT(slotExportCsound()), actionCollection(),
+ "file_export_csound");
+
+ new KAction(i18n("Export M&up file..."), 0, 0, this,
+ SLOT(slotExportMup()), actionCollection(),
+ "file_export_mup");
+
+ new KAction(i18n("Print &with LilyPond..."), 0, 0, this,
+ SLOT(slotPrintLilyPond()), actionCollection(),
+ "file_print_lilypond");
+
+ new KAction(i18n("Preview with Lil&yPond..."), 0, 0, this,
+ SLOT(slotPreviewLilyPond()), actionCollection(),
+ "file_preview_lilypond");
+
+ new KAction(i18n("Play&list"), 0, 0, this,
+ SLOT(slotPlayList()), actionCollection(),
+ "file_show_playlist");
+
+ KStdAction::quit (this, SLOT(slotQuit()), actionCollection());
+
+ // help menu
+ new KAction(i18n("Rosegarden &Tutorial"), 0, 0, this,
+ SLOT(slotTutorial()), actionCollection(),
+ "tutorial");
+
+ new KAction(i18n("&Bug Reporting Guidelines"), 0, 0, this,
+ SLOT(slotBugGuidelines()), actionCollection(),
+ "guidelines");
+
+ // setup edit menu
+ KStdAction::cut (this, SLOT(slotEditCut()), actionCollection());
+ KStdAction::copy (this, SLOT(slotEditCopy()), actionCollection());
+ KStdAction::paste (this, SLOT(slotEditPaste()), actionCollection());
+
+ //
+ // undo/redo actions are special in that they are connected to
+ // slots later on, when the current document is set up - see
+ // MultiViewCommandHistory::attachView
+ //
+ new KToolBarPopupAction(i18n("Und&o"),
+ "undo",
+ KStdAccel::shortcut(KStdAccel::Undo),
+ actionCollection(),
+ KStdAction::stdName(KStdAction::Undo));
+
+ new KToolBarPopupAction(i18n("Re&do"),
+ "redo",
+ KStdAccel::shortcut(KStdAccel::Redo),
+ actionCollection(),
+ KStdAction::stdName(KStdAction::Redo));
+ /////
+
+
+
+ // setup Settings menu
+ //
+ m_viewToolBar = KStdAction::showToolbar (this, SLOT(slotToggleToolBar()), actionCollection(),
+ "show_stock_toolbar");
+
+ m_viewToolsToolBar = new KToggleAction(i18n("Show T&ools Toolbar"), 0, this,
+ SLOT(slotToggleToolsToolBar()), actionCollection(),
+ "show_tools_toolbar");
+
+ m_viewTracksToolBar = new KToggleAction(i18n("Show Trac&ks Toolbar"), 0, this,
+ SLOT(slotToggleTracksToolBar()), actionCollection(),
+ "show_tracks_toolbar");
+
+ m_viewEditorsToolBar = new KToggleAction(i18n("Show &Editors Toolbar"), 0, this,
+ SLOT(slotToggleEditorsToolBar()), actionCollection(),
+ "show_editors_toolbar");
+
+ m_viewTransportToolBar = new KToggleAction(i18n("Show Trans&port Toolbar"), 0, this,
+ SLOT(slotToggleTransportToolBar()), actionCollection(),
+ "show_transport_toolbar");
+
+ m_viewZoomToolBar = new KToggleAction(i18n("Show &Zoom Toolbar"), 0, this,
+ SLOT(slotToggleZoomToolBar()), actionCollection(),
+ "show_zoom_toolbar");
+
+ m_viewStatusBar = KStdAction::showStatusbar(this, SLOT(slotToggleStatusBar()),
+ actionCollection(), "show_status_bar");
+
+ m_viewTransport = new KToggleAction(i18n("Show Tra&nsport"), Key_T, this,
+ SLOT(slotToggleTransport()),
+ actionCollection(),
+ "show_transport");
+
+ m_viewTrackLabels = new KToggleAction(i18n("Show Track &Labels"), 0, this,
+ SLOT(slotToggleTrackLabels()),
+ actionCollection(),
+ "show_tracklabels");
+
+ m_viewRulers = new KToggleAction(i18n("Show Playback Position R&uler"), 0, this,
+ SLOT(slotToggleRulers()),
+ actionCollection(),
+ "show_rulers");
+
+ m_viewTempoRuler = new KToggleAction(i18n("Show Te&mpo Ruler"), 0, this,
+ SLOT(slotToggleTempoRuler()),
+ actionCollection(),
+ "show_tempo_ruler");
+
+ m_viewChordNameRuler = new KToggleAction(i18n("Show Cho&rd Name Ruler"), 0, this,
+ SLOT(slotToggleChordNameRuler()),
+ actionCollection(),
+ "show_chord_name_ruler");
+
+
+ m_viewPreviews = new KToggleAction(i18n("Show Segment Pre&views"), 0, this,
+ SLOT(slotTogglePreviews()),
+ actionCollection(),
+ "show_previews");
+
+ new KAction(i18n("Show Special &Parameters"), Key_P, this,
+ SLOT(slotDockParametersBack()),
+ actionCollection(),
+ "show_inst_segment_parameters");
+
+ KStdAction::tipOfDay( this, SLOT( slotShowTip() ), actionCollection() );
+
+ // Standard Actions
+ //
+ KStdAction::saveOptions(this,
+ SLOT(slotSaveOptions()),
+ actionCollection());
+
+ KStdAction::preferences(this,
+ SLOT(slotConfigure()),
+ actionCollection());
+
+ KStdAction::keyBindings(this,
+ SLOT(slotEditKeys()),
+ actionCollection());
+
+ KStdAction::configureToolbars(this,
+ SLOT(slotEditToolbars()),
+ actionCollection());
+
+ KRadioAction *action = 0;
+
+ // Create the select icon
+ //
+ QString pixmapDir = KGlobal::dirs()->findResource("appdata", "pixmaps/");
+ QCanvasPixmap pixmap(pixmapDir + "/toolbar/select.xpm");
+ QIconSet icon = QIconSet(pixmap);
+
+ // TODO : add some shortcuts here
+ action = new KRadioAction(i18n("&Select and Edit"), icon, Key_F2,
+ this, SLOT(slotPointerSelected()),
+ actionCollection(), "select");
+ action->setExclusiveGroup("segmenttools");
+
+ action = new KRadioAction(i18n("&Draw"), "pencil", Key_F3,
+ this, SLOT(slotDrawSelected()),
+ actionCollection(), "draw");
+ action->setExclusiveGroup("segmenttools");
+
+ action = new KRadioAction(i18n("&Erase"), "eraser", Key_F4,
+ this, SLOT(slotEraseSelected()),
+ actionCollection(), "erase");
+ action->setExclusiveGroup("segmenttools");
+
+ action = new KRadioAction(i18n("&Move"), "move", Key_F5,
+ this, SLOT(slotMoveSelected()),
+ actionCollection(), "move");
+ action->setExclusiveGroup("segmenttools");
+
+ pixmap.load(pixmapDir + "/toolbar/resize.xpm");
+ icon = QIconSet(pixmap);
+ action = new KRadioAction(i18n("&Resize"), icon, Key_F6,
+ this, SLOT(slotResizeSelected()),
+ actionCollection(), "resize");
+ action->setExclusiveGroup("segmenttools");
+
+ pixmap.load(pixmapDir + "/toolbar/split.xpm");
+ icon = QIconSet(pixmap);
+ action = new KRadioAction(i18n("&Split"), icon, Key_F7,
+ this, SLOT(slotSplitSelected()),
+ actionCollection(), "split");
+ action->setExclusiveGroup("segmenttools");
+
+ pixmap.load(pixmapDir + "/toolbar/join.xpm");
+ icon = QIconSet(pixmap);
+ action = new KRadioAction(i18n("&Join"), icon, 0,
+ this, SLOT(slotJoinSelected()),
+ actionCollection(), "join");
+ action->setExclusiveGroup("segmenttools");
+
+
+ new KAction(i18n("&Harmonize"), 0, this,
+ SLOT(slotHarmonizeSelection()), actionCollection(),
+ "harmonize_selection");
+
+ pixmap.load(pixmapDir + "/toolbar/event-insert-timesig.png");
+ icon = QIconSet(pixmap);
+ new KAction(AddTimeSignatureCommand::getGlobalName(),
+ icon, 0,
+ this, SLOT(slotEditTimeSignature()),
+ actionCollection(), "add_time_signature");
+
+ new KAction(i18n("Open Tempo and Time Signature Editor"), 0, this,
+ SLOT(slotEditTempos()), actionCollection(), "edit_tempos");
+
+ //
+ // Edit menu
+ //
+ new KAction(i18n("Cut Range"), Key_X + CTRL + SHIFT, this,
+ SLOT(slotCutRange()), actionCollection(),
+ "cut_range");
+
+ new KAction(i18n("Copy Range"), Key_C + CTRL + SHIFT, this,
+ SLOT(slotCopyRange()), actionCollection(),
+ "copy_range");
+
+ new KAction(i18n("Paste Range"), Key_V + CTRL + SHIFT, this,
+ SLOT(slotPasteRange()), actionCollection(),
+ "paste_range");
+/*
+ new KAction(i18n("Delete Range"), Key_Delete + SHIFT, this,
+ SLOT(slotDeleteRange()), actionCollection(),
+ "delete_range");
+*/
+ new KAction(i18n("Insert Range..."), Key_Insert + SHIFT, this,
+ SLOT(slotInsertRange()), actionCollection(),
+ "insert_range");
+
+ new KAction(i18n("De&lete"), Key_Delete, this,
+ SLOT(slotDeleteSelectedSegments()), actionCollection(),
+ "delete");
+
+ new KAction(i18n("Select &All Segments"), Key_A + CTRL, this,
+ SLOT(slotSelectAll()), actionCollection(),
+ "select_all");
+
+ pixmap.load(pixmapDir + "/toolbar/event-insert-tempo.png");
+ icon = QIconSet(pixmap);
+ new KAction(AddTempoChangeCommand::getGlobalName(),
+ icon, 0,
+ this, SLOT(slotEditTempo()),
+ actionCollection(), "add_tempo");
+
+ new KAction(ChangeCompositionLengthCommand::getGlobalName(),
+ 0,
+ this, SLOT(slotChangeCompositionLength()),
+ actionCollection(), "change_composition_length");
+
+ new KAction(i18n("Edit Mar&kers..."), Key_K + CTRL, this,
+ SLOT(slotEditMarkers()),
+ actionCollection(), "edit_markers");
+
+ new KAction(i18n("Edit Document P&roperties..."), 0, this,
+ SLOT(slotEditDocumentProperties()),
+ actionCollection(), "edit_doc_properties");
+
+
+ //
+ // Segments menu
+ //
+ new KAction(i18n("Open in &Default Editor"), Key_Return, this,
+ SLOT(slotEdit()), actionCollection(),
+ "edit_default");
+
+ pixmap.load(pixmapDir + "/toolbar/matrix.png");
+ icon = QIconSet(pixmap);
+ new KAction(i18n("Open in Matri&x Editor"), icon, Key_M, this,
+ SLOT(slotEditInMatrix()), actionCollection(),
+ "edit_matrix");
+
+ pixmap.load(pixmapDir + "/toolbar/matrix-percussion.png");
+ icon = QIconSet(pixmap);
+ new KAction(i18n("Open in &Percussion Matrix Editor"), icon, Key_D, this,
+ SLOT(slotEditInPercussionMatrix()), actionCollection(),
+ "edit_percussion_matrix");
+
+ pixmap.load(pixmapDir + "/toolbar/notation.png");
+ icon = QIconSet(pixmap);
+ new KAction(i18n("Open in &Notation Editor"), icon, Key_N, this,
+ SLOT(slotEditAsNotation()), actionCollection(),
+ "edit_notation");
+
+ pixmap.load(pixmapDir + "/toolbar/eventlist.png");
+ icon = QIconSet(pixmap);
+ new KAction(i18n("Open in &Event List Editor"), icon, Key_E, this,
+ SLOT(slotEditInEventList()), actionCollection(),
+ "edit_event_list");
+
+ pixmap.load(pixmapDir + "/toolbar/quantize.png");
+ icon = QIconSet(pixmap);
+ new KAction(i18n("&Quantize..."), icon, Key_Equal, this,
+ SLOT(slotQuantizeSelection()), actionCollection(),
+ "quantize_selection");
+
+ new KAction(SegmentLabelCommand::getGlobalName(),
+ 0,
+ this, SLOT(slotRelabelSegments()),
+ actionCollection(), "relabel_segment");
+
+ new KAction(SegmentTransposeCommand::getGlobalName(),
+ 0,
+ this, SLOT(slotTransposeSegments()),
+ actionCollection(), "transpose");
+
+ new KAction(i18n("Repeat Last Quantize"), Key_Plus, this,
+ SLOT(slotRepeatQuantizeSelection()), actionCollection(),
+ "repeat_quantize");
+
+ new KAction(SegmentRescaleCommand::getGlobalName(), 0, this,
+ SLOT(slotRescaleSelection()), actionCollection(),
+ "rescale");
+
+ new KAction(SegmentAutoSplitCommand::getGlobalName(), 0, this,
+ SLOT(slotAutoSplitSelection()), actionCollection(),
+ "auto_split");
+
+ new KAction(SegmentSplitByPitchCommand::getGlobalName(), 0, this,
+ SLOT(slotSplitSelectionByPitch()), actionCollection(),
+ "split_by_pitch");
+
+ new KAction(SegmentSplitByRecordingSrcCommand::getGlobalName(), 0, this,
+ SLOT(slotSplitSelectionByRecordedSrc()), actionCollection(),
+ "split_by_recording");
+
+ new KAction(i18n("Split at Time..."), 0, this,
+ SLOT(slotSplitSelectionAtTime()), actionCollection(),
+ "split_at_time");
+
+ new KAction(i18n("Jog &Left"), Key_Left + ALT, this,
+ SLOT(slotJogLeft()), actionCollection(),
+ "jog_left");
+
+ new KAction(i18n("Jog &Right"), Key_Right + ALT, this,
+ SLOT(slotJogRight()), actionCollection(),
+ "jog_right");
+
+ new KAction(i18n("Set Start Time..."), 0, this,
+ SLOT(slotSetSegmentStartTimes()), actionCollection(),
+ "set_segment_start");
+
+ new KAction(i18n("Set Duration..."), 0, this,
+ SLOT(slotSetSegmentDurations()), actionCollection(),
+ "set_segment_duration");
+
+ new KAction(SegmentJoinCommand::getGlobalName(),
+ Key_J + CTRL,
+ this, SLOT(slotJoinSegments()),
+ actionCollection(), "join_segments");
+
+ new KAction(i18n("Turn Re&peats into Copies"),
+ 0,
+ this, SLOT(slotRepeatingSegments()),
+ actionCollection(), "repeats_to_real_copies");
+
+ new KAction(i18n("Manage Tri&ggered Segments"), 0,
+ this, SLOT(slotManageTriggerSegments()),
+ actionCollection(), "manage_trigger_segments");
+
+ new KAction(i18n("Set Tempos from &Beat Segment"), 0, this,
+ SLOT(slotGrooveQuantize()), actionCollection(),
+ "groove_quantize");
+
+ new KAction(i18n("Set &Tempo to Audio Segment Duration"), 0, this,
+ SLOT(slotTempoToSegmentLength()), actionCollection(),
+ "set_tempo_to_segment_length");
+
+ pixmap.load(pixmapDir + "/toolbar/manage-audio-segments.xpm");
+ icon = QIconSet(pixmap);
+ new KAction(i18n("Manage A&udio Files"), icon,
+ Key_U + CTRL,
+ this, SLOT(slotAudioManager()),
+ actionCollection(), "audio_manager");
+
+ m_viewSegmentLabels = new KToggleAction(i18n("Show Segment Labels"), 0, this,
+ SLOT(slotToggleSegmentLabels()), actionCollection(),
+ "show_segment_labels");
+
+ //
+ // Tracks menu
+ //
+ pixmap.load(pixmapDir + "/toolbar/add_tracks.png");
+ icon = QIconSet(pixmap);
+ new KAction(i18n("Add &Track"), icon, CTRL + Key_T,
+ this, SLOT(slotAddTrack()),
+ actionCollection(), "add_track");
+
+ new KAction(i18n("&Add Tracks..."), 0,
+ this, SLOT(slotAddTracks()),
+ actionCollection(), "add_tracks");
+
+ pixmap.load(pixmapDir + "/toolbar/delete_track.png");
+ icon = QIconSet(pixmap);
+ new KAction(i18n("D&elete Track"), icon, CTRL + Key_D,
+ this, SLOT(slotDeleteTrack()),
+ actionCollection(), "delete_track");
+
+ pixmap.load(pixmapDir + "/toolbar/move_track_down.png");
+ icon = QIconSet(pixmap);
+ new KAction(i18n("Move Track &Down"), icon, SHIFT + Key_Down,
+ this, SLOT(slotMoveTrackDown()),
+ actionCollection(), "move_track_down");
+
+ pixmap.load(pixmapDir + "/toolbar/move_track_up.png");
+ icon = QIconSet(pixmap);
+ new KAction(i18n("Move Track &Up"), icon, SHIFT + Key_Up,
+ this, SLOT(slotMoveTrackUp()),
+ actionCollection(), "move_track_up");
+
+ new KAction(i18n("Select &Next Track"),
+ Key_Down,
+ this, SLOT(slotTrackDown()),
+ actionCollection(), "select_next_track");
+
+ new KAction(i18n("Select &Previous Track"),
+ Key_Up,
+ this, SLOT(slotTrackUp()),
+ actionCollection(), "select_previous_track");
+
+ new KAction(i18n("Mute or Unmute Track"),
+ Key_U,
+ this, SLOT(slotToggleMutedCurrentTrack()),
+ actionCollection(), "toggle_mute_track");
+
+ new KAction(i18n("Arm or Un-arm Track for Record"),
+ Key_R,
+ this, SLOT(slotToggleRecordCurrentTrack()),
+ actionCollection(), "toggle_arm_track");
+
+ pixmap.load(pixmapDir + "/toolbar/mute-all.png");
+ icon = QIconSet(pixmap);
+ new KAction(i18n("&Mute all Tracks"), icon, 0,
+ this, SLOT(slotMuteAllTracks()),
+ actionCollection(), "mute_all_tracks");
+
+ pixmap.load(pixmapDir + "/toolbar/un-mute-all.png");
+ icon = QIconSet(pixmap);
+ new KAction(i18n("&Unmute all Tracks"), icon, 0,
+ this, SLOT(slotUnmuteAllTracks()),
+ actionCollection(), "unmute_all_tracks");
+
+ new KAction(i18n("&Remap Instruments..."), 0, this,
+ SLOT(slotRemapInstruments()),
+ actionCollection(), "remap_instruments");
+
+ //
+ // Studio menu
+ //
+ pixmap.load(pixmapDir + "/toolbar/mixer.png");
+ icon = QIconSet(pixmap);
+ new KAction(i18n("&Audio Mixer"), icon, 0, this,
+ SLOT(slotOpenAudioMixer()),
+ actionCollection(), "audio_mixer");
+
+ pixmap.load(pixmapDir + "/toolbar/midimixer.png");
+ icon = QIconSet(pixmap);
+ new KAction(i18n("Midi Mi&xer"), icon, 0, this,
+ SLOT(slotOpenMidiMixer()),
+ actionCollection(), "midi_mixer");
+
+ pixmap.load(pixmapDir + "/toolbar/manage-midi-devices.xpm");
+ icon = QIconSet(pixmap);
+ new KAction(i18n("Manage MIDI &Devices"), icon, 0, this,
+ SLOT(slotManageMIDIDevices()),
+ actionCollection(), "manage_devices");
+
+ pixmap.load(pixmapDir + "/toolbar/manage-synth-plugins.png");
+ icon = QIconSet(pixmap);
+ new KAction(i18n("Manage S&ynth Plugins"), icon, 0, this,
+ SLOT(slotManageSynths()),
+ actionCollection(), "manage_synths");
+
+ new KAction(i18n("Modify MIDI &Filters"), "filter", 0, this,
+ SLOT(slotModifyMIDIFilters()),
+ actionCollection(), "modify_midi_filters");
+
+ m_enableMIDIrouting = new KToggleAction(i18n("MIDI Thru Routing"), 0, this,
+ SLOT(slotEnableMIDIThruRouting()),
+ actionCollection(), "enable_midi_routing");
+
+ pixmap.load(pixmapDir + "/toolbar/time-musical.png");
+ icon = QIconSet(pixmap);
+ new KAction(i18n("Manage &Metronome"), 0, this,
+ SLOT(slotManageMetronome()),
+ actionCollection(), "manage_metronome");
+
+ new KAction(i18n("&Save Current Document as Default Studio"), 0, this,
+ SLOT(slotSaveDefaultStudio()),
+ actionCollection(), "save_default_studio");
+
+ new KAction(i18n("&Import Default Studio"), 0, this,
+ SLOT(slotImportDefaultStudio()),
+ actionCollection(), "load_default_studio");
+
+ new KAction(i18n("Im&port Studio from File..."), 0, this,
+ SLOT(slotImportStudio()),
+ actionCollection(), "load_studio");
+
+ new KAction(i18n("&Reset MIDI Network"), 0, this,
+ SLOT(slotResetMidiNetwork()),
+ actionCollection(), "reset_midi_network");
+
+ m_setQuickMarkerAction = new KAction(i18n("Set Quick Marker at Playback Position"), 0, CTRL + Key_1, this,
+ SLOT(slotSetQuickMarker()), actionCollection(),
+ "set_quick_marker");
+
+ m_jumpToQuickMarkerAction = new KAction(i18n("Jump to Quick Marker"), 0, Key_1, this,
+ SLOT(slotJumpToQuickMarker()), actionCollection(),
+ "jump_to_quick_marker");
+
+ //
+ // Marker Ruler popup menu
+ //
+// new KAction(i18n("Insert Marker"), 0, 0, this,
+// SLOT(slotInsertMarkerHere()), actionCollection(),
+// "insert_marker_here");
+//
+// new KAction(i18n("Insert Marker at Playback Position"), 0, 0, this,
+// SLOT(slotInsertMarkerAtPointer()), actionCollection(),
+// "insert_marker_at_pointer");
+//
+// new KAction(i18n("Delete Marker"), 0, 0, this,
+// SLOT(slotDeleteMarker()), actionCollection(),
+// "delete_marker");
+
+
+
+ //
+ // Transport menu
+ //
+
+ // Transport controls [rwb]
+ //
+ // We set some default key bindings - with numlock off
+ // use 1 (End) and 3 (Page Down) for Rwd and Ffwd and
+ // 0 (insert) and keypad Enter for Play and Stop
+ //
+ pixmap.load(pixmapDir + "/toolbar/transport-play.png");
+ icon = QIconSet(pixmap);
+ m_playTransport = new KAction(i18n("&Play"), icon, Key_Enter, this,
+ SLOT(slotPlay()), actionCollection(),
+ "play");
+ // Alternative shortcut for Play
+ KShortcut playShortcut = m_playTransport->shortcut();
+ playShortcut.append( KKey(Key_Return + CTRL) );
+ m_playTransport->setShortcut(playShortcut);
+ m_playTransport->setGroup(TransportDialogConfigGroup);
+
+ pixmap.load(pixmapDir + "/toolbar/transport-stop.png");
+ icon = QIconSet(pixmap);
+ m_stopTransport = new KAction(i18n("&Stop"), icon, Key_Insert, this,
+ SLOT(slotStop()), actionCollection(),
+ "stop");
+ m_stopTransport->setGroup(TransportDialogConfigGroup);
+
+ pixmap.load(pixmapDir + "/toolbar/transport-ffwd.png");
+ icon = QIconSet(pixmap);
+ m_ffwdTransport = new KAction(i18n("&Fast Forward"), icon, Key_PageDown,
+ this,
+ SLOT(slotFastforward()), actionCollection(),
+ "fast_forward");
+ m_ffwdTransport->setGroup(TransportDialogConfigGroup);
+
+ pixmap.load(pixmapDir + "/toolbar/transport-rewind.png");
+ icon = QIconSet(pixmap);
+ m_rewindTransport = new KAction(i18n("Re&wind"), icon, Key_End, this,
+ SLOT(slotRewind()), actionCollection(),
+ "rewind");
+ m_rewindTransport->setGroup(TransportDialogConfigGroup);
+
+ pixmap.load(pixmapDir + "/toolbar/transport-record.png");
+ icon = QIconSet(pixmap);
+ m_recordTransport = new KAction(i18n("P&unch in Record"), icon, Key_Space, this,
+ SLOT(slotToggleRecord()), actionCollection(),
+ "recordtoggle");
+ m_recordTransport->setGroup(TransportDialogConfigGroup);
+
+ pixmap.load(pixmapDir + "/toolbar/transport-record.png");
+ icon = QIconSet(pixmap);
+ m_recordTransport = new KAction(i18n("&Record"), icon, 0, this,
+ SLOT(slotRecord()), actionCollection(),
+ "record");
+ m_recordTransport->setGroup(TransportDialogConfigGroup);
+
+ pixmap.load(pixmapDir + "/toolbar/transport-rewind-end.png");
+ icon = QIconSet(pixmap);
+ m_rewindEndTransport = new KAction(i18n("Rewind to &Beginning"), icon, 0, this,
+ SLOT(slotRewindToBeginning()), actionCollection(),
+ "rewindtobeginning");
+ m_rewindEndTransport->setGroup(TransportDialogConfigGroup);
+
+ pixmap.load(pixmapDir + "/toolbar/transport-ffwd-end.png");
+ icon = QIconSet(pixmap);
+ m_ffwdEndTransport = new KAction(i18n("Fast Forward to &End"), icon, 0, this,
+ SLOT(slotFastForwardToEnd()), actionCollection(),
+ "fastforwardtoend");
+ m_ffwdEndTransport->setGroup(TransportDialogConfigGroup);
+
+ pixmap.load(pixmapDir + "/toolbar/transport-tracking.png");
+ icon = QIconSet(pixmap);
+ (new KToggleAction(i18n("Scro&ll to Follow Playback"), icon, Key_Pause, this,
+ SLOT(slotToggleTracking()), actionCollection(),
+ "toggle_tracking"))->setChecked(true);
+
+ pixmap.load(pixmapDir + "/toolbar/transport-panic.png");
+ icon = QIconSet(pixmap);
+ new KAction( i18n("Panic"), icon, Key_P + CTRL + ALT, this, SLOT(slotPanic()),
+ actionCollection(), "panic");
+
+ // DEBUG FACILITY
+ new KAction(i18n("Segment Debug Dump "), 0, this,
+ SLOT(slotDebugDump()), actionCollection(),
+ "debug_dump_segments");
+
+ // create main gui
+ //
+ createGUI("rosegardenui.rc", false);
+
+ createAndSetupTransport();
+
+ // transport toolbar is hidden by default - TODO : this should be in options
+ //
+ //toolBar("Transport Toolbar")->hide();
+
+ QPopupMenu* setTrackInstrumentMenu = dynamic_cast<QPopupMenu*>(factory()->container("set_track_instrument", this));
+
+ if (setTrackInstrumentMenu) {
+ connect(setTrackInstrumentMenu, SIGNAL(aboutToShow()),
+ this, SLOT(slotPopulateTrackInstrumentPopup()));
+ } else {
+ RG_DEBUG << "RosegardenGUIApp::setupActions() : couldn't find set_track_instrument menu - check rosegardenui.rcn\n";
+ }
+
+ setRewFFwdToAutoRepeat();
+}
+
+void RosegardenGUIApp::setRewFFwdToAutoRepeat()
+{
+ QWidget* transportToolbar = factory()->container("Transport Toolbar", this);
+
+ if (transportToolbar) {
+ QObjectList *l = transportToolbar->queryList();
+ QObjectListIt it(*l); // iterate over the buttons
+ QObject *obj;
+
+ while ( (obj = it.current()) != 0 ) {
+ // for each found object...
+ ++it;
+ // RG_DEBUG << "obj name : " << obj->name() << endl;
+ QString objName = obj->name();
+
+ if (objName.endsWith("rewind") || objName.endsWith("fast_forward")) {
+ QButton* btn = dynamic_cast<QButton*>(obj);
+ if (!btn) {
+ RG_DEBUG << "Very strange - found widgets in transport_toolbar which aren't buttons\n";
+
+ continue;
+ }
+ btn->setAutoRepeat(true);
+ }
+
+
+ }
+ delete l;
+
+ } else {
+ RG_DEBUG << "transportToolbar == 0\n";
+ }
+
+}
+
+void RosegardenGUIApp::initZoomToolbar()
+{
+ KToolBar *zoomToolbar = toolBar("Zoom Toolbar");
+ if (!zoomToolbar) {
+ RG_DEBUG << "RosegardenGUIApp::initZoomToolbar() : "
+ << "zoom toolbar not found" << endl;
+ return ;
+ }
+
+ new QLabel(i18n(" Zoom: "), zoomToolbar, "kde toolbar widget");
+
+ std::vector<double> zoomSizes; // in units-per-pixel
+ double defaultBarWidth44 = 100.0;
+ double duration44 = TimeSignature(4, 4).getBarDuration();
+ static double factors[] = { 0.025, 0.05, 0.1, 0.2, 0.5,
+ 1.0, 1.5, 2.5, 5.0, 10.0 , 20.0 };
+
+ for (unsigned int i = 0; i < sizeof(factors) / sizeof(factors[0]); ++i) {
+ zoomSizes.push_back(duration44 / (defaultBarWidth44 * factors[i]));
+ }
+
+ // zoom labels
+ QString minZoom = QString("%1%").arg(factors[0] * 100.0);
+ QString maxZoom = QString("%1%").arg(factors[(sizeof(factors) / sizeof(factors[0])) - 1] * 100.0);
+
+ m_zoomSlider = new ZoomSlider<double>
+ (zoomSizes, -1, QSlider::Horizontal, zoomToolbar, "kde toolbar widget");
+ m_zoomSlider->setTracking(true);
+ m_zoomSlider->setFocusPolicy(QWidget::NoFocus);
+ m_zoomLabel = new QLabel(minZoom, zoomToolbar, "kde toolbar widget");
+ m_zoomLabel->setIndent(10);
+
+ connect(m_zoomSlider, SIGNAL(valueChanged(int)),
+ this, SLOT(slotChangeZoom(int)));
+
+ // set initial zoom - we might want to make this a config option
+ // m_zoomSlider->setToDefault();
+
+}
+
+void RosegardenGUIApp::initStatusBar()
+{
+ KTmpStatusMsg::setDefaultMsg("");
+ statusBar()->insertItem(KTmpStatusMsg::getDefaultMsg(),
+ KTmpStatusMsg::getDefaultId(), 1);
+ statusBar()->setItemAlignment(KTmpStatusMsg::getDefaultId(),
+ AlignLeft | AlignVCenter);
+
+ m_progressBar = new ProgressBar(100, true, statusBar());
+ // m_progressBar->setMinimumWidth(100);
+ m_progressBar->setFixedWidth(60);
+ m_progressBar->setFixedHeight(18);
+ m_progressBar->setTextEnabled(false);
+ statusBar()->addWidget(m_progressBar);
+}
+
+void RosegardenGUIApp::initView()
+{
+ ////////////////////////////////////////////////////////////////////
+ // create the main widget here that is managed by KTMainWindow's view-region and
+ // connect the widget to your document to display document contents.
+
+ RG_DEBUG << "RosegardenGUIApp::initView()" << endl;
+
+ Composition &comp = m_doc->getComposition();
+
+ // Ensure that the start and end markers for the piece are set
+ // to something reasonable
+ //
+ if (comp.getStartMarker() == 0 &&
+ comp.getEndMarker() == 0) {
+ int endMarker = comp.getBarRange(100 + comp.getNbBars()).second;
+ comp.setEndMarker(endMarker);
+ }
+
+ m_swapView = new RosegardenGUIView(m_viewTrackLabels->isChecked(),
+ m_segmentParameterBox,
+ m_instrumentParameterBox,
+ m_trackParameterBox, this);
+
+ // Connect up this signal so that we can force tool mode
+ // changes from the view
+ connect(m_swapView, SIGNAL(activateTool(QString)),
+ this, SLOT(slotActivateTool(QString)));
+
+ connect(m_swapView,
+ SIGNAL(segmentsSelected(const SegmentSelection &)),
+ SIGNAL(segmentsSelected(const SegmentSelection &)));
+
+ connect(m_swapView,
+ SIGNAL(addAudioFile(AudioFileId)),
+ SLOT(slotAddAudioFile(AudioFileId)));
+
+ connect(m_swapView, SIGNAL(toggleSolo(bool)), SLOT(slotToggleSolo(bool)));
+
+ m_doc->attachView(m_swapView);
+
+ m_mainDockWidget->setWidget(m_swapView);
+
+ // setCentralWidget(m_swapView);
+ setCaption(m_doc->getTitle());
+
+
+ // Transport setup
+ //
+ std::string transportMode = m_doc->getConfiguration().
+ get
+ <String>
+ (DocumentConfiguration::TransportMode);
+
+
+ slotEnableTransport(true);
+
+ // and the time signature
+ //
+ getTransport()->setTimeSignature(comp.getTimeSignatureAt(comp.getPosition()));
+
+ // set the tempo in the transport
+ //
+ getTransport()->setTempo(comp.getCurrentTempo());
+
+ // bring the transport to the front
+ //
+ getTransport()->raise();
+
+ // set the play metronome button
+ getTransport()->MetronomeButton()->setOn(comp.usePlayMetronome());
+
+ // Set the solo button
+ getTransport()->SoloButton()->setOn(comp.isSolo());
+
+ // set the transport mode found in the configuration
+ getTransport()->setNewMode(transportMode);
+
+ // set the pointer position
+ //
+ slotSetPointerPosition(m_doc->getComposition().getPosition());
+
+ // make sure we show
+ //
+ RosegardenGUIView *oldView = m_view;
+ m_view = m_swapView;
+
+ connect(m_view, SIGNAL(stateChange(QString, bool)),
+ this, SLOT (slotStateChanged(QString, bool)));
+
+ connect(m_view, SIGNAL(instrumentParametersChanged(InstrumentId)),
+ this, SIGNAL(instrumentParametersChanged(InstrumentId)));
+
+ // We only check for the SequenceManager to make sure
+ // we're not on the first pass though - we don't want
+ // to send these toggles twice on initialisation.
+ //
+ // Clunky but we just about get away with it for the
+ // moment.
+ //
+ if (m_seqManager != 0) {
+ slotToggleChordNameRuler();
+ slotToggleRulers();
+ slotToggleTempoRuler();
+ slotTogglePreviews();
+ slotToggleSegmentLabels();
+
+ // Reset any loop on the sequencer
+ //
+ try {
+ if (isUsingSequencer())
+ m_seqManager->setLoop(0, 0);
+ stateChanged("have_range", KXMLGUIClient::StateReverse);
+ } catch (QString s) {
+ KStartupLogo::hideIfStillThere();
+ CurrentProgressDialog::freeze();
+ KMessageBox::error(this, s);
+ CurrentProgressDialog::thaw();
+ }
+
+ connect(m_seqManager, SIGNAL(controllerDeviceEventReceived(MappedEvent *)),
+ m_view, SLOT(slotControllerDeviceEventReceived(MappedEvent *)));
+ }
+
+ // delete m_playList;
+ // m_playList = 0;
+
+ delete m_deviceManager;
+ m_deviceManager = 0;
+
+ delete m_synthManager;
+ m_synthManager = 0;
+
+ delete m_audioMixer;
+ m_audioMixer = 0;
+
+ delete m_bankEditor;
+ m_bankEditor = 0;
+
+ delete m_markerEditor;
+ m_markerEditor = 0;
+
+ delete m_tempoView;
+ m_tempoView = 0;
+
+ delete m_triggerSegmentManager;
+ m_triggerSegmentManager = 0;
+
+ delete oldView;
+
+ // set the highlighted track
+ m_view->slotSelectTrackSegments(comp.getSelectedTrack());
+
+ // play tracking on in the editor by default: turn off if need be
+ KToggleAction *trackingAction = dynamic_cast<KToggleAction *>
+ (actionCollection()->action("toggle_tracking"));
+ if (trackingAction && !trackingAction->isChecked()) {
+ m_view->getTrackEditor()->slotToggleTracking();
+ }
+
+ m_view->show();
+
+ connect(m_view->getTrackEditor()->getSegmentCanvas(),
+ SIGNAL(showContextHelp(const QString &)),
+ this,
+ SLOT(slotShowToolHelp(const QString &)));
+
+ // We have to do this to make sure that the 2nd call ("select")
+ // actually has any effect. Activating the same radio action
+ // doesn't work the 2nd time (like pressing down the same radio
+ // button twice - it doesn't have any effect), so if you load two
+ // files in a row, on the 2nd file a new SegmentCanvas will be
+ // created but its tool won't be set, even though it will appear
+ // to be selected.
+ //
+ actionCollection()->action("move")->activate();
+ if (m_doc->getComposition().getNbSegments() > 0)
+ actionCollection()->action("select")->activate();
+ else
+ actionCollection()->action("draw")->activate();
+
+ int zoomLevel = m_doc->getConfiguration().
+ get
+ <Int>
+ (DocumentConfiguration::ZoomLevel);
+
+ m_zoomSlider->setSize(double(zoomLevel) / 1000.0);
+ slotChangeZoom(zoomLevel);
+
+ //slotChangeZoom(int(m_zoomSlider->getCurrentSize()));
+
+ stateChanged("new_file");
+
+ ProgressDialog::processEvents();
+
+ if (m_viewChordNameRuler->isChecked()) {
+ SetWaitCursor swc;
+ m_view->initChordNameRuler();
+ } else {
+ m_view->initChordNameRuler();
+ }
+}
+
+void RosegardenGUIApp::setDocument(RosegardenGUIDoc* newDocument)
+{
+ if (m_doc == newDocument)
+ return ;
+
+ emit documentAboutToChange();
+ kapp->processEvents(); // to make sure all opened dialogs (mixer, midi devices...) are closed
+
+ // Take care of all subparts which depend on the document
+
+ // Caption
+ //
+ QString caption = kapp->caption();
+ setCaption(caption + ": " + newDocument->getTitle());
+
+ // // reset AudioManagerDialog
+ // //
+ // delete m_audioManagerDialog; // TODO : replace this with a connection to documentAboutToChange() sig.
+ // m_audioManagerDialog = 0;
+
+ RosegardenGUIDoc* oldDoc = m_doc;
+
+ m_doc = newDocument;
+
+ if (m_seqManager) // when we're called at startup, the seq. man. isn't created yet
+ m_seqManager->setDocument(m_doc);
+
+ if (m_markerEditor)
+ m_markerEditor->setDocument(m_doc);
+ if (m_tempoView) {
+ delete m_tempoView;
+ m_tempoView = 0;
+ }
+ if (m_triggerSegmentManager)
+ m_triggerSegmentManager->setDocument(m_doc);
+
+ m_trackParameterBox->setDocument(m_doc);
+ m_segmentParameterBox->setDocument(m_doc);
+ m_instrumentParameterBox->setDocument(m_doc);
+
+#ifdef HAVE_LIBLO
+
+ if (m_pluginGUIManager) {
+ m_pluginGUIManager->stopAllGUIs();
+ m_pluginGUIManager->setStudio(&m_doc->getStudio());
+ }
+#endif
+
+ if (getView() &&
+ getView()->getTrackEditor() &&
+ getView()->getTrackEditor()->getSegmentCanvas()) {
+ getView()->getTrackEditor()->getSegmentCanvas()->endAudioPreviewGeneration();
+ }
+
+ // this will delete all edit views
+ //
+ delete oldDoc;
+
+ // connect needed signals
+ //
+ connect(m_segmentParameterBox, SIGNAL(documentModified()),
+ m_doc, SLOT(slotDocumentModified()));
+
+ connect(m_doc, SIGNAL(pointerPositionChanged(timeT)),
+ this, SLOT(slotSetPointerPosition(timeT)));
+
+ connect(m_doc, SIGNAL(documentModified(bool)),
+ this, SLOT(slotDocumentModified(bool)));
+
+ connect(m_doc, SIGNAL(loopChanged(timeT, timeT)),
+ this, SLOT(slotSetLoop(timeT, timeT)));
+
+ m_doc->getCommandHistory()->attachView(actionCollection());
+
+ connect(m_doc->getCommandHistory(), SIGNAL(commandExecuted()),
+ SLOT(update()));
+ connect(m_doc->getCommandHistory(), SIGNAL(commandExecuted()),
+ SLOT(slotTestClipboard()));
+
+ // connect and start the autosave timer
+ connect(m_autoSaveTimer, SIGNAL(timeout()), this, SLOT(slotAutoSave()));
+ m_autoSaveTimer->start(m_doc->getAutoSavePeriod() * 1000);
+
+ // Connect the playback timer
+ //
+ connect(m_playTimer, SIGNAL(timeout()), this, SLOT(slotUpdatePlaybackPosition()));
+ connect(m_stopTimer, SIGNAL(timeout()), this, SLOT(slotUpdateMonitoring()));
+
+ // finally recreate the main view
+ //
+ initView();
+
+ if (getView() && getView()->getTrackEditor()) {
+ connect(m_doc, SIGNAL(makeTrackVisible(int)),
+ getView()->getTrackEditor(), SLOT(slotScrollToTrack(int)));
+ }
+
+ connect(m_doc, SIGNAL(devicesResyncd()),
+ this, SLOT(slotDocumentDevicesResyncd()));
+
+ m_doc->syncDevices();
+ m_doc->clearModifiedStatus();
+
+ if (newDocument->getStudio().haveMidiDevices()) {
+ stateChanged("got_midi_devices");
+ } else {
+ stateChanged("got_midi_devices", KXMLGUIClient::StateReverse);
+ }
+
+ // Ensure the sequencer knows about any audio files
+ // we've loaded as part of the new Composition
+ //
+ m_doc->prepareAudio();
+
+ // Do not reset instrument prog. changes after all.
+ // if (m_seqManager)
+ // m_seqManager->preparePlayback(true);
+
+ Composition &comp = m_doc->getComposition();
+
+ // Set any loaded loop at the Composition and
+ // on the marker on SegmentCanvas and clients
+ //
+ if (m_seqManager)
+ m_doc->setLoop(comp.getLoopStart(), comp.getLoopEnd());
+
+ emit documentChanged(m_doc);
+
+ m_doc->clearModifiedStatus(); // because it's set as modified by the various
+ // init operations
+ // TODO: this sucks, have to sort it out somehow.
+
+ // Readjust canvas size
+ //
+ m_view->getTrackEditor()->slotReadjustCanvasSize();
+
+ m_stopTimer->start(100);
+}
+
+void
+RosegardenGUIApp::openFile(QString filePath, ImportType type)
+{
+ RG_DEBUG << "RosegardenGUIApp::openFile " << filePath << endl;
+
+ if (type == ImportCheckType && filePath.endsWith(".rgp")) {
+ importProject(filePath);
+ return ;
+ }
+
+ RosegardenGUIDoc *doc = createDocument(filePath, type);
+ if (doc) {
+ setDocument(doc);
+
+ // fix # 1235755, "SPB combo not updating after document swap"
+ RG_DEBUG << "RosegardenGUIApp::openFile(): calling slotDocColoursChanged() in doc" << endl;
+ doc->slotDocColoursChanged();
+
+ kapp->config()->setGroup(GeneralOptionsConfigGroup);
+ if (kapp->config()->readBoolEntry("alwaysusedefaultstudio", false)) {
+
+ QString autoloadFile =
+ KGlobal::dirs()->findResource("appdata", "autoload.rg");
+
+ QFileInfo autoloadFileInfo(autoloadFile);
+ if (autoloadFileInfo.isReadable()) {
+
+ RG_DEBUG << "Importing default studio from " << autoloadFile << endl;
+
+ slotImportStudioFromFile(autoloadFile);
+ }
+ }
+
+ QFileInfo fInfo(filePath);
+ m_fileRecent->addURL(fInfo.absFilePath());
+ }
+}
+
+RosegardenGUIDoc*
+RosegardenGUIApp::createDocument(QString filePath, ImportType importType)
+{
+ QFileInfo info(filePath);
+ RosegardenGUIDoc *doc = 0;
+
+ if (!info.exists()) {
+ // can happen with command-line arg, so...
+ KStartupLogo::hideIfStillThere();
+ KMessageBox::sorry(this, i18n("File \"%1\" does not exist").arg(filePath));
+ return 0;
+ }
+
+ if (info.isDir()) {
+ KStartupLogo::hideIfStillThere();
+ KMessageBox::sorry(this, i18n("File \"%1\" is actually a directory"));
+ return 0;
+ }
+
+ QFile file(filePath);
+
+ if (!file.open(IO_ReadOnly)) {
+ KStartupLogo::hideIfStillThere();
+ QString errStr =
+ i18n("You do not have read permission for \"%1\"").arg(filePath);
+
+ KMessageBox::sorry(this, errStr);
+ return 0;
+ }
+
+ // Stop if playing
+ //
+ if (m_seqManager && m_seqManager->getTransportStatus() == PLAYING)
+ slotStop();
+
+ slotEnableTransport(false);
+
+ if (importType == ImportCheckType) {
+ KMimeType::Ptr fileMimeType = KMimeType::findByPath(filePath);
+ if (fileMimeType->name() == "audio/x-midi")
+ importType = ImportMIDI;
+ else if (fileMimeType->name() == "audio/x-rosegarden")
+ importType = ImportRG4;
+ else if (filePath.endsWith(".rose"))
+ importType = ImportRG21;
+ else if (filePath.endsWith(".h2song"))
+ importType = ImportHydrogen;
+ }
+
+
+ switch (importType) {
+ case ImportMIDI:
+ doc = createDocumentFromMIDIFile(filePath);
+ break;
+ case ImportRG21:
+ doc = createDocumentFromRG21File(filePath);
+ break;
+ case ImportHydrogen:
+ doc = createDocumentFromHydrogenFile(filePath);
+ break;
+ default:
+ doc = createDocumentFromRGFile(filePath);
+ }
+
+ slotEnableTransport(true);
+
+ return doc;
+}
+
+RosegardenGUIDoc*
+RosegardenGUIApp::createDocumentFromRGFile(QString filePath)
+{
+ // Check for an autosaved file to recover
+ QString effectiveFilePath = filePath;
+ bool canRecover = false;
+ QString autoSaveFileName = kapp->checkRecoverFile(filePath, canRecover);
+
+ if (canRecover) {
+ // First check if the auto-save file is more recent than the doc
+ QFileInfo docFileInfo(filePath), autoSaveFileInfo(autoSaveFileName);
+
+ if (docFileInfo.lastModified() < autoSaveFileInfo.lastModified()) {
+
+ RG_DEBUG << "RosegardenGUIApp::openFile : "
+ << "found a more recent autosave file\n";
+
+ // At this point the splash screen may still be there, hide it if
+ // it's the case
+ KStartupLogo::hideIfStillThere();
+
+ // It is, so ask the user if he wants to use the autosave file
+ int reply = KMessageBox::questionYesNo(this,
+ i18n("An auto-save file for this document has been found\nDo you want to open it instead ?"));
+
+ if (reply == KMessageBox::Yes)
+ // open the autosave file instead
+ effectiveFilePath = autoSaveFileName;
+ else {
+ // user doesn't want the autosave, so delete it
+ // so it won't bother us again if we reload
+ canRecover = false;
+ QFile::remove
+ (autoSaveFileName);
+ }
+
+ } else
+ canRecover = false;
+ }
+
+ // Create a new blank document
+ //
+ RosegardenGUIDoc *newDoc = new RosegardenGUIDoc(this, m_pluginManager,
+ true); // skipAutoload
+
+ // ignore return thingy
+ //
+ if (newDoc->openDocument(effectiveFilePath)) {
+ if (canRecover) {
+ // Mark the document as modified,
+ // set the "regular" filepath and name (not those of
+ // the autosaved doc)
+ //
+ newDoc->slotDocumentModified();
+ QFileInfo info(filePath);
+ newDoc->setAbsFilePath(info.absFilePath());
+ newDoc->setTitle(info.fileName());
+ } else {
+ newDoc->clearModifiedStatus();
+ }
+ } else {
+ delete newDoc;
+ return 0;
+ }
+
+ return newDoc;
+}
+
+void RosegardenGUIApp::slotSaveOptions()
+{
+ RG_DEBUG << "RosegardenGUIApp::slotSaveOptions()\n";
+
+#ifdef SETTING_LOG_DEBUG
+
+ _settingLog(QString("SETTING 2 : transport flap extended = %1").arg(getTransport()->isExpanded()));
+ _settingLog(QString("SETTING 2 : show track labels = %1").arg(m_viewTrackLabels->isChecked()));
+#endif
+
+ kapp->config()->setGroup(GeneralOptionsConfigGroup);
+ kapp->config()->writeEntry("Show Transport", m_viewTransport->isChecked());
+ kapp->config()->writeEntry("Expanded Transport", m_transport ? getTransport()->isExpanded() : true);
+ kapp->config()->writeEntry("Show Track labels", m_viewTrackLabels->isChecked());
+ kapp->config()->writeEntry("Show Rulers", m_viewRulers->isChecked());
+ kapp->config()->writeEntry("Show Tempo Ruler", m_viewTempoRuler->isChecked());
+ kapp->config()->writeEntry("Show Chord Name Ruler", m_viewChordNameRuler->isChecked());
+ kapp->config()->writeEntry("Show Previews", m_viewPreviews->isChecked());
+ kapp->config()->writeEntry("Show Segment Labels", m_viewSegmentLabels->isChecked());
+ kapp->config()->writeEntry("Show Parameters", m_dockVisible);
+ kapp->config()->writeEntry("MIDI Thru Routing", m_enableMIDIrouting->isChecked());
+
+#ifdef SETTING_LOG_DEBUG
+
+ RG_DEBUG << "SHOW PARAMETERS = " << m_dockVisible << endl;
+#endif
+
+ m_fileRecent->saveEntries(kapp->config());
+
+ // saveMainWindowSettings(kapp->config(), RosegardenGUIApp::MainWindowConfigGroup); - no need to, done by KMainWindow
+ kapp->config()->sync();
+}
+
+void RosegardenGUIApp::setupFileDialogSpeedbar()
+{
+ KConfig *config = kapp->config();
+
+ config->setGroup("KFileDialog Speedbar");
+
+ RG_DEBUG << "RosegardenGUIApp::setupFileDialogSpeedbar" << endl;
+
+ bool hasSetExamplesItem = config->readBoolEntry("Examples Set", false);
+
+ RG_DEBUG << "RosegardenGUIApp::setupFileDialogSpeedbar: examples set " << hasSetExamplesItem << endl;
+
+ if (!hasSetExamplesItem) {
+
+ unsigned int n = config->readUnsignedNumEntry("Number of Entries", 0);
+
+ config->writeEntry(QString("Description_%1").arg(n), i18n("Example Files"));
+ config->writeEntry(QString("IconGroup_%1").arg(n), 4);
+ config->writeEntry(QString("Icon_%1").arg(n), "folder");
+ config->writeEntry(QString("URL_%1").arg(n),
+ KGlobal::dirs()->findResource("appdata", "examples/"));
+
+ RG_DEBUG << "wrote url " << config->readEntry(QString("URL_%1").arg(n)) << endl;
+
+ config->writeEntry("Examples Set", true);
+ config->writeEntry("Number of Entries", n + 1);
+ config->sync();
+ }
+
+}
+
+void RosegardenGUIApp::readOptions()
+{
+ applyMainWindowSettings(kapp->config(), MainWindowConfigGroup);
+
+ kapp->config()->reparseConfiguration();
+
+ // Statusbar and toolbars toggling action status
+ //
+ m_viewStatusBar ->setChecked(!statusBar() ->isHidden());
+ m_viewToolBar ->setChecked(!toolBar() ->isHidden());
+ m_viewToolsToolBar ->setChecked(!toolBar("Tools Toolbar") ->isHidden());
+ m_viewTracksToolBar ->setChecked(!toolBar("Tracks Toolbar") ->isHidden());
+ m_viewEditorsToolBar ->setChecked(!toolBar("Editors Toolbar") ->isHidden());
+ m_viewTransportToolBar->setChecked(!toolBar("Transport Toolbar")->isHidden());
+ m_viewZoomToolBar ->setChecked(!toolBar("Zoom Toolbar") ->isHidden());
+
+ bool opt;
+
+ kapp->config()->setGroup(GeneralOptionsConfigGroup);
+
+ opt = kapp->config()->readBoolEntry("Show Transport", true);
+ m_viewTransport->setChecked(opt);
+ slotToggleTransport();
+
+ opt = kapp->config()->readBoolEntry("Expanded Transport", true);
+
+#ifdef SETTING_LOG_DEBUG
+
+ _settingLog(QString("SETTING 3 : transport flap extended = %1").arg(opt));
+#endif
+
+ if (opt)
+ getTransport()->slotPanelOpenButtonClicked();
+ else
+ getTransport()->slotPanelCloseButtonClicked();
+
+ opt = kapp->config()->readBoolEntry("Show Track labels", true);
+
+#ifdef SETTING_LOG_DEBUG
+
+ _settingLog(QString("SETTING 3 : show track labels = %1").arg(opt));
+#endif
+
+ m_viewTrackLabels->setChecked(opt);
+ slotToggleTrackLabels();
+
+ opt = kapp->config()->readBoolEntry("Show Rulers", true);
+ m_viewRulers->setChecked(opt);
+ slotToggleRulers();
+
+ opt = kapp->config()->readBoolEntry("Show Tempo Ruler", true);
+ m_viewTempoRuler->setChecked(opt);
+ slotToggleTempoRuler();
+
+ opt = kapp->config()->readBoolEntry("Show Chord Name Ruler", false);
+ m_viewChordNameRuler->setChecked(opt);
+ slotToggleChordNameRuler();
+
+ opt = kapp->config()->readBoolEntry("Show Previews", true);
+ m_viewPreviews->setChecked(opt);
+ slotTogglePreviews();
+
+ opt = kapp->config()->readBoolEntry("Show Segment Labels", true);
+ m_viewSegmentLabels->setChecked(opt);
+ slotToggleSegmentLabels();
+
+ opt = kapp->config()->readBoolEntry("Show Parameters", true);
+ if (!opt) {
+ m_dockLeft->undock();
+ m_dockLeft->hide();
+ stateChanged("parametersbox_closed", KXMLGUIClient::StateNoReverse);
+ m_dockVisible = false;
+ }
+
+ // MIDI Thru routing
+ opt = kapp->config()->readBoolEntry("MIDI Thru Routing", true);
+ m_enableMIDIrouting->setChecked(opt);
+ slotEnableMIDIThruRouting();
+
+ // initialise the recent file list
+ //
+ m_fileRecent->loadEntries(kapp->config());
+
+ m_actionsSetup = true;
+
+}
+
+void RosegardenGUIApp::saveGlobalProperties(KConfig *cfg)
+{
+ if (m_doc->getTitle() != i18n("Untitled") && !m_doc->isModified()) {
+ // saving to tempfile not necessary
+ } else {
+ QString filename = m_doc->getAbsFilePath();
+ cfg->writeEntry("filename", filename);
+ cfg->writeEntry("modified", m_doc->isModified());
+
+ QString tempname = kapp->tempSaveName(filename);
+ QString errMsg;
+ bool res = m_doc->saveDocument(tempname, errMsg);
+ if (!res) {
+ if (errMsg)
+ KMessageBox::error(this, i18n(QString("Could not save document at %1\nError was : %2")
+ .arg(tempname).arg(errMsg)));
+ else
+ KMessageBox::error(this, i18n(QString("Could not save document at %1")
+ .arg(tempname)));
+ }
+ }
+}
+
+void RosegardenGUIApp::readGlobalProperties(KConfig* _cfg)
+{
+ QString filename = _cfg->readEntry("filename", "");
+ bool modified = _cfg->readBoolEntry("modified", false);
+
+ if (modified) {
+ bool canRecover;
+ QString tempname = kapp->checkRecoverFile(filename, canRecover);
+
+ if (canRecover) {
+ slotEnableTransport(false);
+ m_doc->openDocument(tempname);
+ slotEnableTransport(true);
+ m_doc->slotDocumentModified();
+ QFileInfo info(filename);
+ m_doc->setAbsFilePath(info.absFilePath());
+ m_doc->setTitle(info.fileName());
+ }
+ } else {
+ if (!filename.isEmpty()) {
+ slotEnableTransport(false);
+ m_doc->openDocument(filename);
+ slotEnableTransport(true);
+ }
+ }
+
+ QString caption = kapp->caption();
+ setCaption(caption + ": " + m_doc->getTitle());
+}
+
+void RosegardenGUIApp::showEvent(QShowEvent* e)
+{
+ RG_DEBUG << "RosegardenGUIApp::showEvent()\n";
+
+ getTransport()->raise();
+ KMainWindow::showEvent(e);
+}
+
+bool RosegardenGUIApp::queryClose()
+{
+ RG_DEBUG << "RosegardenGUIApp::queryClose" << endl;
+#ifdef SETTING_LOG_DEBUG
+
+ _settingLog(QString("SETTING 1 : transport flap extended = %1").arg(getTransport()->isExpanded()));
+ _settingLog(QString("SETTING 1 : show track labels = %1").arg(m_viewTrackLabels->isChecked()));
+#endif
+
+ QString errMsg;
+
+ bool canClose = m_doc->saveIfModified();
+
+ /*
+ if (canClose && m_transport) {
+
+ // or else the closing of the transport will toggle off the
+ // 'view transport' action, and its state will be saved as
+ // 'off'
+ //
+
+ disconnect(m_transport, SIGNAL(closed()),
+ this, SLOT(slotCloseTransport()));
+ }
+ */
+
+ return canClose;
+
+}
+
+bool RosegardenGUIApp::queryExit()
+{
+ RG_DEBUG << "RosegardenGUIApp::queryExit" << endl;
+ if (m_actionsSetup)
+ slotSaveOptions();
+
+ return true;
+}
+
+void RosegardenGUIApp::slotFileNewWindow()
+{
+ KTmpStatusMsg msg(i18n("Opening a new application window..."), this);
+
+ RosegardenGUIApp *new_window = new RosegardenGUIApp();
+ new_window->show();
+}
+
+void RosegardenGUIApp::slotFileNew()
+{
+ RG_DEBUG << "RosegardenGUIApp::slotFileNew()\n";
+
+ KTmpStatusMsg msg(i18n("Creating new document..."), this);
+
+ bool makeNew = false;
+
+ if (!m_doc->isModified()) {
+ makeNew = true;
+ // m_doc->closeDocument();
+ } else if (m_doc->saveIfModified()) {
+ makeNew = true;
+ }
+
+ if (makeNew) {
+
+ setDocument(new RosegardenGUIDoc(this, m_pluginManager));
+ }
+}
+
+void RosegardenGUIApp::slotOpenDroppedURL(QString url)
+{
+ ProgressDialog::processEvents(); // or else we get a crash because the
+ // track editor is erased too soon - it is the originator of the signal
+ // this slot is connected to.
+
+ if (!m_doc->saveIfModified())
+ return ;
+
+ openURL(KURL(url));
+}
+
+void RosegardenGUIApp::openURL(QString url)
+{
+ RG_DEBUG << "RosegardenGUIApp::openURL: QString " << url << endl;
+ openURL(KURL(url));
+}
+
+void RosegardenGUIApp::openURL(const KURL& url)
+{
+ SetWaitCursor waitCursor;
+
+ QString netFile = url.prettyURL();
+ RG_DEBUG << "RosegardenGUIApp::openURL: KURL " << netFile << endl;
+
+ if (!url.isValid()) {
+ QString string;
+ string = i18n( "Malformed URL\n%1").arg(netFile);
+
+ KMessageBox::sorry(this, string);
+ return ;
+ }
+
+ QString target, caption(url.path());
+
+ if (KIO::NetAccess::download(url, target, this) == false) {
+ KMessageBox::error(this, i18n("Cannot download file %1").arg(url.prettyURL()));
+ return ;
+ }
+
+ RG_DEBUG << "RosegardenGUIApp::openURL: target : " << target << endl;
+
+ if (!m_doc->saveIfModified())
+ return ;
+
+ openFile(target);
+
+ setCaption(caption);
+}
+
+void RosegardenGUIApp::slotFileOpen()
+{
+ slotStatusHelpMsg(i18n("Opening file..."));
+
+ kapp->config()->setGroup(GeneralOptionsConfigGroup);
+
+ QString lastOpenedVersion =
+ kapp->config()->readEntry("Last File Opened Version", "none");
+
+ if (lastOpenedVersion != VERSION) {
+
+ // We haven't opened any files with this version of the
+ // program before. Default to the examples directory.
+
+ QString examplesDir = KGlobal::dirs()->findResource("appdata", "examples/");
+ kapp->config()->setGroup("Recent Dirs");
+ QString recentString = kapp->config()->readEntry("ROSEGARDEN", "");
+ kapp->config()->writeEntry
+ ("ROSEGARDEN", QString("file:%1,%2").arg(examplesDir).arg(recentString));
+ }
+
+ KURL url = KFileDialog::getOpenURL
+ (":ROSEGARDEN",
+ "audio/x-rosegarden audio/x-midi audio/x-rosegarden21", this,
+ i18n("Open File"));
+ if ( url.isEmpty() ) {
+ return ;
+ }
+
+ if (m_doc && !m_doc->saveIfModified())
+ return ;
+
+ kapp->config()->setGroup(GeneralOptionsConfigGroup);
+ kapp->config()->writeEntry("Last File Opened Version", VERSION);
+
+ openURL(url);
+}
+
+void RosegardenGUIApp::slotMerge()
+{
+ KURL url = KFileDialog::getOpenURL
+ (":ROSEGARDEN",
+ "audio/x-rosegarden audio/x-midi audio/x-rosegarden21", this,
+ i18n("Open File"));
+ if ( url.isEmpty() ) {
+ return ;
+ }
+
+
+ QString target;
+
+ if (KIO::NetAccess::download(url, target, this) == false) {
+ KMessageBox::error(this, i18n("Cannot download file %1").arg(url.prettyURL()));
+ return ;
+ }
+
+ mergeFile(target);
+
+ KIO::NetAccess::removeTempFile( target );
+}
+
+void RosegardenGUIApp::slotFileOpenRecent(const KURL &url)
+{
+ KTmpStatusMsg msg(i18n("Opening file..."), this);
+
+ if (m_doc) {
+
+ if (!m_doc->saveIfModified()) {
+ return ;
+
+ }
+ }
+
+ openURL(url);
+}
+
+void RosegardenGUIApp::slotFileSave()
+{
+ if (!m_doc /*|| !m_doc->isModified()*/)
+ return ; // ALWAYS save, even if doc is not modified.
+
+ KTmpStatusMsg msg(i18n("Saving file..."), this);
+
+ // if it's a new file (no file path), or an imported file
+ // (file path doesn't end with .rg), call saveAs
+ //
+ if (!m_doc->isRegularDotRGFile()) {
+
+ slotFileSaveAs();
+
+ } else {
+
+ SetWaitCursor waitCursor;
+ QString errMsg, docFilePath = m_doc->getAbsFilePath();
+
+ bool res = m_doc->saveDocument(docFilePath, errMsg);
+ if (!res) {
+ if (errMsg)
+ KMessageBox::error(this, i18n(QString("Could not save document at %1\nError was : %2")
+ .arg(docFilePath).arg(errMsg)));
+ else
+ KMessageBox::error(this, i18n(QString("Could not save document at %1")
+ .arg(docFilePath)));
+ }
+ }
+}
+
+QString
+RosegardenGUIApp::getValidWriteFile(QString descriptiveExtension,
+ QString label)
+{
+ // extract first extension listed in descriptiveExtension, for instance,
+ // ".rg" from "*.rg|Rosegarden files", or ".mid" from "*.mid *.midi|MIDI Files"
+ //
+ QString extension = descriptiveExtension.left(descriptiveExtension.find('|')).mid(1).section(' ', 0, 0);
+
+ RG_DEBUG << "RosegardenGUIApp::getValidWriteFile() : extension = " << extension << endl;
+
+ // It's too bad there isn't this functionality within
+ // KFileDialog::getSaveFileName
+ KFileDialog saveFileDialog(":ROSEGARDEN", descriptiveExtension, this, label, true);
+ saveFileDialog.setOperationMode(KFileDialog::Saving);
+ if (m_doc) {
+ QString saveFileName = m_doc->getAbsFilePath();
+ // Show filename without the old extension
+ int dotLoc = saveFileName.findRev('.');
+ if (dotLoc >= int(saveFileName.length() - 4)) {
+ saveFileName = saveFileName.left(dotLoc);
+ }
+ saveFileDialog.setSelection(saveFileName);
+ }
+ saveFileDialog.exec();
+ QString name = saveFileDialog.selectedFile();
+
+ // RG_DEBUG << "RosegardenGUIApp::getValidWriteFile() : KFileDialog::getSaveFileName returned "
+ // << name << endl;
+
+
+ if (name.isEmpty())
+ return name;
+
+ // Append extension if we don't have one
+ //
+ if (!extension.isEmpty()) {
+ static QRegExp rgFile("\\..{1,4}$");
+ if (rgFile.match(name) == -1) {
+ name += extension;
+ }
+ }
+
+ KURL *u = new KURL(name);
+
+ if (!u->isValid()) {
+ KMessageBox::sorry(this, i18n("This is not a valid filename.\n"));
+ return "";
+ }
+
+ if (!u->isLocalFile()) {
+ KMessageBox::sorry(this, i18n("This is not a local file.\n"));
+ return "";
+ }
+
+ QFileInfo info(name);
+
+ if (info.isDir()) {
+ KMessageBox::sorry(this, i18n("You have specified a directory"));
+ return "";
+ }
+
+ if (info.exists()) {
+ int overwrite = KMessageBox::questionYesNo
+ (this, i18n("The specified file exists. Overwrite?"));
+
+ if (overwrite != KMessageBox::Yes)
+ return "";
+ }
+
+ return name;
+}
+
+bool RosegardenGUIApp::slotFileSaveAs()
+{
+ if (!m_doc)
+ return false;
+
+ KTmpStatusMsg msg(i18n("Saving file with a new filename..."), this);
+
+ QString newName = getValidWriteFile("*.rg|" + i18n("Rosegarden files") +
+ "\n*|" + i18n("All files"),
+ i18n("Save as..."));
+ if (newName.isEmpty())
+ return false;
+
+ SetWaitCursor waitCursor;
+ QFileInfo saveAsInfo(newName);
+ m_doc->setTitle(saveAsInfo.fileName());
+ m_doc->setAbsFilePath(saveAsInfo.absFilePath());
+ QString errMsg;
+ bool res = m_doc->saveDocument(newName, errMsg);
+ if (!res) {
+ if (errMsg)
+ KMessageBox::error(this, i18n(QString("Could not save document at %1\nError was : %2")
+ .arg(newName).arg(errMsg)));
+ else
+ KMessageBox::error(this, i18n(QString("Could not save document at %1")
+ .arg(newName)));
+
+ } else {
+
+ m_fileRecent->addURL(newName);
+
+ QString caption = kapp->caption();
+ setCaption(caption + ": " + m_doc->getTitle());
+ // update the edit view's captions too
+ emit compositionStateUpdate();
+ }
+
+ return res;
+}
+
+void RosegardenGUIApp::slotFileClose()
+{
+ RG_DEBUG << "RosegardenGUIApp::slotFileClose()" << endl;
+
+ if (!m_doc)
+ return ;
+
+ KTmpStatusMsg msg(i18n("Closing file..."), this);
+
+ if (m_doc->saveIfModified()) {
+ setDocument(new RosegardenGUIDoc(this, m_pluginManager));
+ }
+
+ // Don't close the whole view (i.e. Quit), just close the doc.
+ // close();
+}
+
+void RosegardenGUIApp::slotFilePrint()
+{
+ if (m_doc->getComposition().getNbSegments() == 0) {
+ KMessageBox::sorry(0, "Please create some tracks first (until we implement menu state management)");
+ return ;
+ }
+
+ KTmpStatusMsg msg(i18n("Printing..."), this);
+
+ m_view->print(&m_doc->getComposition());
+}
+
+void RosegardenGUIApp::slotFilePrintPreview()
+{
+ if (m_doc->getComposition().getNbSegments() == 0) {
+ KMessageBox::sorry(0, "Please create some tracks first (until we implement menu state management)");
+ return ;
+ }
+
+ KTmpStatusMsg msg(i18n("Previewing..."), this);
+
+ m_view->print(&m_doc->getComposition(), true);
+}
+
+void RosegardenGUIApp::slotQuit()
+{
+ slotStatusMsg(i18n("Exiting..."));
+
+ Profiles::getInstance()->dump();
+
+ // close the first window, the list makes the next one the first again.
+ // This ensures that queryClose() is called on each window to ask for closing
+ KMainWindow* w;
+ if (memberList) {
+
+ for (w = memberList->first(); w != 0; w = memberList->next()) {
+ // only close the window if the closeEvent is accepted. If
+ // the user presses Cancel on the saveIfModified() dialog,
+ // the window and the application stay open.
+ if (!w->close())
+ break;
+ }
+ }
+}
+
+void RosegardenGUIApp::slotEditCut()
+{
+ if (!m_view->haveSelection())
+ return ;
+ KTmpStatusMsg msg(i18n("Cutting selection..."), this);
+
+ SegmentSelection selection(m_view->getSelection());
+ m_doc->getCommandHistory()->addCommand
+ (new CutCommand(selection, m_clipboard));
+}
+
+void RosegardenGUIApp::slotEditCopy()
+{
+ if (!m_view->haveSelection())
+ return ;
+ KTmpStatusMsg msg(i18n("Copying selection to clipboard..."), this);
+
+ SegmentSelection selection(m_view->getSelection());
+ m_doc->getCommandHistory()->addCommand
+ (new CopyCommand(selection, m_clipboard));
+}
+
+void RosegardenGUIApp::slotEditPaste()
+{
+ if (m_clipboard->isEmpty()) {
+ KTmpStatusMsg msg(i18n("Clipboard is empty"), this);
+ return ;
+ }
+ KTmpStatusMsg msg(i18n("Inserting clipboard contents..."), this);
+
+ // for now, but we could paste at the time of the first copied
+ // segment and then do ghosting drag or something
+ timeT insertionTime = m_doc->getComposition().getPosition();
+ m_doc->getCommandHistory()->addCommand
+ (new PasteSegmentsCommand(&m_doc->getComposition(),
+ m_clipboard, insertionTime,
+ m_doc->getComposition().getSelectedTrack(),
+ false));
+
+ // User preference? Update song pointer position on paste
+ m_doc->slotSetPointerPosition(m_doc->getComposition().getPosition());
+}
+
+void RosegardenGUIApp::slotCutRange()
+{
+ timeT t0 = m_doc->getComposition().getLoopStart();
+ timeT t1 = m_doc->getComposition().getLoopEnd();
+
+ if (t0 == t1)
+ return ;
+
+ m_doc->getCommandHistory()->addCommand
+ (new CutRangeCommand(&m_doc->getComposition(), t0, t1, m_clipboard));
+}
+
+void RosegardenGUIApp::slotCopyRange()
+{
+ timeT t0 = m_doc->getComposition().getLoopStart();
+ timeT t1 = m_doc->getComposition().getLoopEnd();
+
+ if (t0 == t1)
+ return ;
+
+ m_doc->getCommandHistory()->addCommand
+ (new CopyCommand(&m_doc->getComposition(), t0, t1, m_clipboard));
+}
+
+void RosegardenGUIApp::slotPasteRange()
+{
+ if (m_clipboard->isEmpty())
+ return ;
+
+ m_doc->getCommandHistory()->addCommand
+ (new PasteRangeCommand(&m_doc->getComposition(), m_clipboard,
+ m_doc->getComposition().getPosition()));
+
+ m_doc->setLoop(0, 0);
+}
+
+void RosegardenGUIApp::slotDeleteRange()
+{
+ timeT t0 = m_doc->getComposition().getLoopStart();
+ timeT t1 = m_doc->getComposition().getLoopEnd();
+
+ if (t0 == t1)
+ return ;
+
+ m_doc->getCommandHistory()->addCommand
+ (new DeleteRangeCommand(&m_doc->getComposition(), t0, t1));
+
+ m_doc->setLoop(0, 0);
+}
+
+void RosegardenGUIApp::slotInsertRange()
+{
+ timeT t0 = m_doc->getComposition().getPosition();
+ std::pair<timeT, timeT> r = m_doc->getComposition().getBarRangeForTime(t0);
+ TimeDialog dialog(m_view, i18n("Duration of empty range to insert"),
+ &m_doc->getComposition(), t0, r.second - r.first, false);
+ if (dialog.exec() == QDialog::Accepted) {
+ m_doc->getCommandHistory()->addCommand
+ (new InsertRangeCommand(&m_doc->getComposition(), t0, dialog.getTime()));
+ m_doc->setLoop(0, 0);
+ }
+}
+
+void RosegardenGUIApp::slotSelectAll()
+{
+ m_view->slotSelectAllSegments();
+}
+
+void RosegardenGUIApp::slotDeleteSelectedSegments()
+{
+ m_view->getTrackEditor()->slotDeleteSelectedSegments();
+}
+
+void RosegardenGUIApp::slotQuantizeSelection()
+{
+ if (!m_view->haveSelection())
+ return ;
+
+ //!!! this should all be in rosegardenguiview
+
+ QuantizeDialog dialog(m_view);
+ if (dialog.exec() != QDialog::Accepted)
+ return ;
+
+ SegmentSelection selection = m_view->getSelection();
+
+ KMacroCommand *command = new KMacroCommand
+ (EventQuantizeCommand::getGlobalName());
+
+ for (SegmentSelection::iterator i = selection.begin();
+ i != selection.end(); ++i) {
+ command->addCommand(new EventQuantizeCommand
+ (**i, (*i)->getStartTime(), (*i)->getEndTime(),
+ dialog.getQuantizer()));
+ }
+
+ m_view->slotAddCommandToHistory(command);
+}
+
+void RosegardenGUIApp::slotRepeatQuantizeSelection()
+{
+ if (!m_view->haveSelection())
+ return ;
+
+ //!!! this should all be in rosegardenguiview
+
+ SegmentSelection selection = m_view->getSelection();
+
+ KMacroCommand *command = new KMacroCommand
+ (EventQuantizeCommand::getGlobalName());
+
+ for (SegmentSelection::iterator i = selection.begin();
+ i != selection.end(); ++i) {
+ command->addCommand(new EventQuantizeCommand
+ (**i, (*i)->getStartTime(), (*i)->getEndTime(),
+ "Quantize Dialog Grid", false)); // no i18n (config group name)
+ }
+
+ m_view->slotAddCommandToHistory(command);
+}
+
+void RosegardenGUIApp::slotGrooveQuantize()
+{
+ if (!m_view->haveSelection())
+ return ;
+
+ SegmentSelection selection = m_view->getSelection();
+
+ if (selection.size() != 1) {
+ KMessageBox::sorry(this, i18n("This function needs no more than one segment to be selected."));
+ return ;
+ }
+
+ Segment *s = *selection.begin();
+ m_view->slotAddCommandToHistory(new CreateTempoMapFromSegmentCommand(s));
+}
+
+void RosegardenGUIApp::slotJoinSegments()
+{
+ if (!m_view->haveSelection())
+ return ;
+
+ //!!! this should all be in rosegardenguiview
+ //!!! should it?
+
+ SegmentSelection selection = m_view->getSelection();
+ if (selection.size() == 0)
+ return ;
+
+ for (SegmentSelection::iterator i = selection.begin();
+ i != selection.end(); ++i) {
+ if ((*i)->getType() != Segment::Internal) {
+ KMessageBox::sorry(this, i18n("Can't join Audio segments"));
+ return ;
+ }
+ }
+
+ m_view->slotAddCommandToHistory(new SegmentJoinCommand(selection));
+ m_view->updateSelectionContents();
+}
+
+void RosegardenGUIApp::slotRescaleSelection()
+{
+ if (!m_view->haveSelection())
+ return ;
+
+ //!!! this should all be in rosegardenguiview
+ //!!! should it?
+
+ SegmentSelection selection = m_view->getSelection();
+
+ timeT startTime = 0, endTime = 0;
+ for (SegmentSelection::iterator i = selection.begin();
+ i != selection.end(); ++i) {
+ if ((i == selection.begin()) || ((*i)->getStartTime() < startTime)) {
+ startTime = (*i)->getStartTime();
+ }
+ if ((i == selection.begin()) || ((*i)->getEndMarkerTime() > endTime)) {
+ endTime = (*i)->getEndMarkerTime();
+ }
+ }
+
+ RescaleDialog dialog(m_view, &m_doc->getComposition(),
+ startTime, endTime - startTime,
+ false, false);
+ if (dialog.exec() != QDialog::Accepted)
+ return ;
+
+ std::vector<AudioSegmentRescaleCommand *> asrcs;
+
+ int mult = dialog.getNewDuration();
+ int div = endTime - startTime;
+ float ratio = float(mult) / float(div);
+
+ std::cerr << "slotRescaleSelection: mult = " << mult << ", div = " << div << ", ratio = " << ratio << std::endl;
+
+ KMacroCommand *command = new KMacroCommand
+ (SegmentRescaleCommand::getGlobalName());
+
+ bool pathTested = false;
+
+ for (SegmentSelection::iterator i = selection.begin();
+ i != selection.end(); ++i) {
+ if ((*i)->getType() == Segment::Audio) {
+ if (!pathTested) {
+ testAudioPath(i18n("rescaling an audio file"));
+ pathTested = true;
+ }
+ AudioSegmentRescaleCommand *asrc = new AudioSegmentRescaleCommand
+ (m_doc, *i, ratio);
+ command->addCommand(asrc);
+ asrcs.push_back(asrc);
+ } else {
+ command->addCommand(new SegmentRescaleCommand(*i, mult, div));
+ }
+ }
+
+ ProgressDialog *progressDlg = 0;
+
+ if (!asrcs.empty()) {
+ progressDlg = new ProgressDialog
+ (i18n("Rescaling audio file..."), 100, this);
+ progressDlg->setAutoClose(false);
+ progressDlg->setAutoReset(false);
+ progressDlg->show();
+ for (size_t i = 0; i < asrcs.size(); ++i) {
+ asrcs[i]->connectProgressDialog(progressDlg);
+ }
+ }
+
+ m_view->slotAddCommandToHistory(command);
+
+ if (!asrcs.empty()) {
+
+ progressDlg->setLabel(i18n("Generating audio preview..."));
+
+ for (size_t i = 0; i < asrcs.size(); ++i) {
+ asrcs[i]->disconnectProgressDialog(progressDlg);
+ }
+
+ connect(&m_doc->getAudioFileManager(), SIGNAL(setProgress(int)),
+ progressDlg->progressBar(), SLOT(setValue(int)));
+ connect(progressDlg, SIGNAL(cancelClicked()),
+ &m_doc->getAudioFileManager(), SLOT(slotStopPreview()));
+
+ for (size_t i = 0; i < asrcs.size(); ++i) {
+ int fid = asrcs[i]->getNewAudioFileId();
+ if (fid >= 0) {
+ slotAddAudioFile(fid);
+ m_doc->getAudioFileManager().generatePreview(fid);
+ }
+ }
+ }
+
+ if (progressDlg) delete progressDlg;
+}
+
+bool
+RosegardenGUIApp::testAudioPath(QString op)
+{
+ try {
+ m_doc->getAudioFileManager().testAudioPath();
+ } catch (AudioFileManager::BadAudioPathException) {
+ if (KMessageBox::warningContinueCancel
+ (this,
+ i18n("The audio file path does not exist or is not writable.\nYou must set the audio file path to a valid directory in Document Properties before %1.\nWould you like to set it now?").arg(op),
+ i18n("Warning"),
+ i18n("Set audio file path")) == KMessageBox::Continue) {
+ slotOpenAudioPathSettings();
+ }
+ return false;
+ }
+ return true;
+}
+
+void RosegardenGUIApp::slotAutoSplitSelection()
+{
+ if (!m_view->haveSelection())
+ return ;
+
+ //!!! this should all be in rosegardenguiview
+ //!!! or should it?
+
+ SegmentSelection selection = m_view->getSelection();
+
+ KMacroCommand *command = new KMacroCommand
+ (SegmentAutoSplitCommand::getGlobalName());
+
+ for (SegmentSelection::iterator i = selection.begin();
+ i != selection.end(); ++i) {
+
+ if ((*i)->getType() == Segment::Audio) {
+ AudioSplitDialog aSD(this, (*i), m_doc);
+
+ if (aSD.exec() == QDialog::Accepted) {
+ // split to threshold
+ //
+ command->addCommand(
+ new AudioSegmentAutoSplitCommand(m_doc,
+ *i,
+ aSD.getThreshold()));
+ // dmm - verifying that widget->value() accessors *can* work without crashing
+ // std::cout << "SILVAN: getThreshold() = " << aSD.getThreshold() << std::endl;
+ }
+ } else {
+ command->addCommand(new SegmentAutoSplitCommand(*i));
+ }
+ }
+
+ m_view->slotAddCommandToHistory(command);
+}
+
+void RosegardenGUIApp::slotJogLeft()
+{
+ RG_DEBUG << "RosegardenGUIApp::slotJogLeft" << endl;
+ jogSelection( -Note(Note::Demisemiquaver).getDuration());
+}
+
+void RosegardenGUIApp::slotJogRight()
+{
+ RG_DEBUG << "RosegardenGUIApp::slotJogRight" << endl;
+ jogSelection(Note(Note::Demisemiquaver).getDuration());
+}
+
+void RosegardenGUIApp::jogSelection(timeT amount)
+{
+ if (!m_view->haveSelection())
+ return ;
+
+ SegmentSelection selection = m_view->getSelection();
+
+ SegmentReconfigureCommand *command = new SegmentReconfigureCommand(i18n("Jog Selection"));
+
+ for (SegmentSelection::iterator i = selection.begin();
+ i != selection.end(); ++i) {
+
+ command->addSegment((*i),
+ (*i)->getStartTime() + amount,
+ (*i)->getEndMarkerTime() + amount,
+ (*i)->getTrack());
+ }
+
+ m_view->slotAddCommandToHistory(command);
+}
+
+void RosegardenGUIApp::createAndSetupTransport()
+{
+ // create the Transport GUI and add the callbacks to the
+ // buttons and keyboard accelerators
+ //
+ m_transport =
+ new TransportDialog(this);
+ plugAccelerators(m_transport, m_transport->getAccelerators());
+
+ m_transport->getAccelerators()->connectItem
+ (m_transport->getAccelerators()->insertItem(Key_T),
+ this,
+ SLOT(slotHideTransport()));
+
+ // Ensure that the checkbox is unchecked if the dialog
+ // is closed
+ connect(m_transport, SIGNAL(closed()),
+ SLOT(slotCloseTransport()));
+
+ // Handle loop setting and unsetting from the transport loop button
+ //
+
+ connect(m_transport, SIGNAL(setLoop()), SLOT(slotSetLoop()));
+ connect(m_transport, SIGNAL(unsetLoop()), SLOT(slotUnsetLoop()));
+ connect(m_transport, SIGNAL(panic()), SLOT(slotPanic()));
+
+ connect(m_transport, SIGNAL(editTempo(QWidget*)),
+ SLOT(slotEditTempo(QWidget*)));
+
+ connect(m_transport, SIGNAL(editTimeSignature(QWidget*)),
+ SLOT(slotEditTimeSignature(QWidget*)));
+
+ connect(m_transport, SIGNAL(editTransportTime(QWidget*)),
+ SLOT(slotEditTransportTime(QWidget*)));
+
+ // Handle set loop start/stop time buttons.
+ //
+ connect(m_transport, SIGNAL(setLoopStartTime()), SLOT(slotSetLoopStart()));
+ connect(m_transport, SIGNAL(setLoopStopTime()), SLOT(slotSetLoopStop()));
+
+ if (m_seqManager != 0)
+ m_seqManager->setTransport(m_transport);
+
+}
+
+void RosegardenGUIApp::slotSplitSelectionByPitch()
+{
+ if (!m_view->haveSelection())
+ return ;
+
+ SplitByPitchDialog dialog(m_view);
+ if (dialog.exec() != QDialog::Accepted)
+ return ;
+
+ SegmentSelection selection = m_view->getSelection();
+
+ KMacroCommand *command = new KMacroCommand
+ (SegmentSplitByPitchCommand::getGlobalName());
+
+ bool haveSomething = false;
+
+ for (SegmentSelection::iterator i = selection.begin();
+ i != selection.end(); ++i) {
+
+ if ((*i)->getType() == Segment::Audio) {
+ // nothing
+ } else {
+ command->addCommand
+ (new SegmentSplitByPitchCommand
+ (*i,
+ dialog.getPitch(),
+ dialog.getShouldRange(),
+ dialog.getShouldDuplicateNonNoteEvents(),
+ (SegmentSplitByPitchCommand::ClefHandling)
+ dialog.getClefHandling()));
+ haveSomething = true;
+ }
+ }
+
+ if (haveSomething)
+ m_view->slotAddCommandToHistory(command);
+ //!!! else complain
+}
+
+void
+RosegardenGUIApp::slotSplitSelectionByRecordedSrc()
+{
+ if (!m_view->haveSelection())
+ return ;
+
+ SplitByRecordingSrcDialog dialog(m_view, m_doc);
+ if (dialog.exec() != QDialog::Accepted)
+ return ;
+
+ SegmentSelection selection = m_view->getSelection();
+
+ KMacroCommand *command = new KMacroCommand
+ (SegmentSplitByRecordingSrcCommand::getGlobalName());
+
+ bool haveSomething = false;
+
+ for (SegmentSelection::iterator i = selection.begin();
+ i != selection.end(); ++i) {
+
+ if ((*i)->getType() == Segment::Audio) {
+ // nothing
+ } else {
+ command->addCommand
+ (new SegmentSplitByRecordingSrcCommand(*i,
+ dialog.getChannel(),
+ dialog.getDevice()));
+ haveSomething = true;
+ }
+ }
+ if (haveSomething)
+ m_view->slotAddCommandToHistory(command);
+}
+
+void
+RosegardenGUIApp::slotSplitSelectionAtTime()
+{
+ if (!m_view->haveSelection())
+ return ;
+
+ SegmentSelection selection = m_view->getSelection();
+ if (selection.empty())
+ return ;
+
+ timeT now = m_doc->getComposition().getPosition();
+
+ QString title = i18n("Split Segment at Time",
+ "Split %n Segments at Time",
+ selection.size());
+
+ TimeDialog dialog(m_view, title,
+ &m_doc->getComposition(),
+ now, true);
+
+ KMacroCommand *command = new KMacroCommand( title );
+
+ if (dialog.exec() == QDialog::Accepted) {
+ for (SegmentSelection::iterator i = selection.begin();
+ i != selection.end(); ++i) {
+
+ if ((*i)->getType() == Segment::Audio) {
+ command->addCommand(new AudioSegmentSplitCommand(*i, dialog.getTime()));
+ } else {
+ command->addCommand(new SegmentSplitCommand(*i, dialog.getTime()));
+ }
+ }
+ m_view->slotAddCommandToHistory(command);
+ }
+}
+
+void
+RosegardenGUIApp::slotSetSegmentStartTimes()
+{
+ if (!m_view->haveSelection())
+ return ;
+
+ SegmentSelection selection = m_view->getSelection();
+ if (selection.empty())
+ return ;
+
+ timeT someTime = (*selection.begin())->getStartTime();
+
+ TimeDialog dialog(m_view, i18n("Segment Start Time"),
+ &m_doc->getComposition(),
+ someTime, false);
+
+ if (dialog.exec() == QDialog::Accepted) {
+
+ bool plural = (selection.size() > 1);
+
+ SegmentReconfigureCommand *command =
+ new SegmentReconfigureCommand(plural ?
+ i18n("Set Segment Start Times") :
+ i18n("Set Segment Start Time"));
+
+ for (SegmentSelection::iterator i = selection.begin();
+ i != selection.end(); ++i) {
+
+ command->addSegment
+ (*i, dialog.getTime(),
+ (*i)->getEndMarkerTime() - (*i)->getStartTime() + dialog.getTime(),
+ (*i)->getTrack());
+ }
+
+ m_view->slotAddCommandToHistory(command);
+ }
+}
+
+void
+RosegardenGUIApp::slotSetSegmentDurations()
+{
+ if (!m_view->haveSelection())
+ return ;
+
+ SegmentSelection selection = m_view->getSelection();
+ if (selection.empty())
+ return ;
+
+ timeT someTime =
+ (*selection.begin())->getStartTime();
+
+ timeT someDuration =
+ (*selection.begin())->getEndMarkerTime() -
+ (*selection.begin())->getStartTime();
+
+ TimeDialog dialog(m_view, i18n("Segment Duration"),
+ &m_doc->getComposition(),
+ someTime,
+ someDuration,
+ false);
+
+ if (dialog.exec() == QDialog::Accepted) {
+
+ bool plural = (selection.size() > 1);
+
+ SegmentReconfigureCommand *command =
+ new SegmentReconfigureCommand(plural ?
+ i18n("Set Segment Durations") :
+ i18n("Set Segment Duration"));
+
+ for (SegmentSelection::iterator i = selection.begin();
+ i != selection.end(); ++i) {
+
+ command->addSegment
+ (*i, (*i)->getStartTime(),
+ (*i)->getStartTime() + dialog.getTime(),
+ (*i)->getTrack());
+ }
+
+ m_view->slotAddCommandToHistory(command);
+ }
+}
+
+void RosegardenGUIApp::slotHarmonizeSelection()
+{
+ if (!m_view->haveSelection())
+ return ;
+
+ SegmentSelection selection = m_view->getSelection();
+ //!!! This should be somewhere else too
+
+ CompositionTimeSliceAdapter adapter(&m_doc->getComposition(),
+ &selection);
+
+ AnalysisHelper helper;
+ Segment *segment = new Segment;
+ helper.guessHarmonies(adapter, *segment);
+
+ //!!! do nothing with the results yet
+ delete segment;
+}
+
+void RosegardenGUIApp::slotTempoToSegmentLength()
+{
+ slotTempoToSegmentLength(this);
+}
+
+void RosegardenGUIApp::slotTempoToSegmentLength(QWidget* parent)
+{
+ RG_DEBUG << "RosegardenGUIApp::slotTempoToSegmentLength" << endl;
+
+ if (!m_view->haveSelection())
+ return ;
+
+ SegmentSelection selection = m_view->getSelection();
+
+ // Only set for a single selection
+ //
+ if (selection.size() == 1 &&
+ (*selection.begin())->getType() == Segment::Audio) {
+ Composition &comp = m_doc->getComposition();
+ Segment *seg = *selection.begin();
+
+ TimeSignature timeSig =
+ comp.getTimeSignatureAt( seg->getStartTime());
+
+ timeT endTime = seg->getEndTime();
+
+ if (seg->getRawEndMarkerTime())
+ endTime = seg->getEndMarkerTime();
+
+ RealTime segDuration =
+ seg->getAudioEndTime() - seg->getAudioStartTime();
+
+ int beats = 0;
+
+ // Get user to tell us how many beats or bars the segment contains
+ BeatsBarsDialog dialog(parent);
+ if (dialog.exec() == QDialog::Accepted) {
+ beats = dialog.getQuantity(); // beats (or bars)
+ if (dialog.getMode() == 1) // bars (multiply by time sig)
+ beats *= timeSig.getBeatsPerBar();
+#ifdef DEBUG_TEMPO_FROM_AUDIO
+
+ RG_DEBUG << "RosegardenGUIApp::slotTempoToSegmentLength - beats = " << beats
+ << " mode = " << ((dialog.getMode() == 0) ? "bars" : "beats") << endl
+ << " beats per bar = " << timeSig.getBeatsPerBar()
+ << " user quantity = " << dialog.getQuantity()
+ << " user mode = " << dialog.getMode() << endl;
+#endif
+
+ } else {
+ RG_DEBUG << "RosegardenGUIApp::slotTempoToSegmentLength - BeatsBarsDialog aborted"
+ << endl;
+ return ;
+ }
+
+ double beatLengthUsec =
+ double(segDuration.sec * 1000000 + segDuration.usec()) /
+ double(beats);
+
+ // New tempo is a minute divided by time of beat
+ // converted up (#1414252) to a sane value via getTempoFoQpm()
+ //
+ tempoT newTempo =
+ comp.getTempoForQpm(60.0 * 1000000.0 / beatLengthUsec);
+
+#ifdef DEBUG_TEMPO_FROM_AUDIO
+
+ RG_DEBUG << "RosegardenGUIApp::slotTempoToSegmentLength info: " << endl
+ << " beatLengthUsec = " << beatLengthUsec << endl
+ << " segDuration.usec = " << segDuration.usec() << endl
+ << " newTempo = " << newTempo << endl;
+#endif
+
+ KMacroCommand *macro = new KMacroCommand(i18n("Set Global Tempo"));
+
+ // Remove all tempo changes in reverse order so as the index numbers
+ // don't becoming meaningless as the command gets unwound.
+ //
+ for (int i = 0; i < comp.getTempoChangeCount(); i++)
+ macro->addCommand(new RemoveTempoChangeCommand(&comp,
+ (comp.getTempoChangeCount() - 1 - i)));
+
+ // add tempo change at time zero
+ //
+ macro->addCommand(new AddTempoChangeCommand(&comp, 0, newTempo));
+
+ // execute
+ m_doc->getCommandHistory()->addCommand(macro);
+ }
+}
+
+void RosegardenGUIApp::slotToggleSegmentLabels()
+{
+ KToggleAction* act = dynamic_cast<KToggleAction*>(actionCollection()->action("show_segment_labels"));
+ if (act) {
+ m_view->slotShowSegmentLabels(act->isChecked());
+ }
+}
+
+void RosegardenGUIApp::slotEdit()
+{
+ m_view->slotEditSegment(0);
+}
+
+void RosegardenGUIApp::slotEditAsNotation()
+{
+ m_view->slotEditSegmentNotation(0);
+}
+
+void RosegardenGUIApp::slotEditInMatrix()
+{
+ m_view->slotEditSegmentMatrix(0);
+}
+
+void RosegardenGUIApp::slotEditInPercussionMatrix()
+{
+ m_view->slotEditSegmentPercussionMatrix(0);
+}
+
+void RosegardenGUIApp::slotEditInEventList()
+{
+ m_view->slotEditSegmentEventList(0);
+}
+
+void RosegardenGUIApp::slotEditTempos()
+{
+ slotEditTempos(m_doc->getComposition().getPosition());
+}
+
+void RosegardenGUIApp::slotToggleToolBar()
+{
+ KTmpStatusMsg msg(i18n("Toggle the toolbar..."), this);
+
+ if (m_viewToolBar->isChecked())
+ toolBar("mainToolBar")->show();
+ else
+ toolBar("mainToolBar")->hide();
+}
+
+void RosegardenGUIApp::slotToggleToolsToolBar()
+{
+ KTmpStatusMsg msg(i18n("Toggle the tools toolbar..."), this);
+
+ if (m_viewToolsToolBar->isChecked())
+ toolBar("Tools Toolbar")->show();
+ else
+ toolBar("Tools Toolbar")->hide();
+}
+
+void RosegardenGUIApp::slotToggleTracksToolBar()
+{
+ KTmpStatusMsg msg(i18n("Toggle the tracks toolbar..."), this);
+
+ if (m_viewTracksToolBar->isChecked())
+ toolBar("Tracks Toolbar")->show();
+ else
+ toolBar("Tracks Toolbar")->hide();
+}
+
+void RosegardenGUIApp::slotToggleEditorsToolBar()
+{
+ KTmpStatusMsg msg(i18n("Toggle the editor toolbar..."), this);
+
+ if (m_viewEditorsToolBar->isChecked())
+ toolBar("Editors Toolbar")->show();
+ else
+ toolBar("Editors Toolbar")->hide();
+}
+
+void RosegardenGUIApp::slotToggleTransportToolBar()
+{
+ KTmpStatusMsg msg(i18n("Toggle the transport toolbar..."), this);
+
+ if (m_viewTransportToolBar->isChecked())
+ toolBar("Transport Toolbar")->show();
+ else
+ toolBar("Transport Toolbar")->hide();
+}
+
+void RosegardenGUIApp::slotToggleZoomToolBar()
+{
+ KTmpStatusMsg msg(i18n("Toggle the zoom toolbar..."), this);
+
+ if (m_viewZoomToolBar->isChecked())
+ toolBar("Zoom Toolbar")->show();
+ else
+ toolBar("Zoom Toolbar")->hide();
+}
+
+void RosegardenGUIApp::slotToggleTransport()
+{
+ KTmpStatusMsg msg(i18n("Toggle the Transport"), this);
+
+ if (m_viewTransport->isChecked()) {
+ getTransport()->show();
+ getTransport()->raise();
+ getTransport()->blockSignals(false);
+ } else {
+ getTransport()->hide();
+ getTransport()->blockSignals(true);
+ }
+}
+
+void RosegardenGUIApp::slotHideTransport()
+{
+ if (m_viewTransport->isChecked()) {
+ m_viewTransport->blockSignals(true);
+ m_viewTransport->setChecked(false);
+ m_viewTransport->blockSignals(false);
+ }
+ getTransport()->hide();
+ getTransport()->blockSignals(true);
+}
+
+void RosegardenGUIApp::slotToggleTrackLabels()
+{
+ if (m_viewTrackLabels->isChecked()) {
+#ifdef SETTING_LOG_DEBUG
+ _settingLog("toggle track labels on");
+#endif
+
+ m_view->getTrackEditor()->getTrackButtons()->
+ changeTrackInstrumentLabels(TrackLabel::ShowTrack);
+ } else {
+#ifdef SETTING_LOG_DEBUG
+ _settingLog("toggle track labels off");
+#endif
+
+ m_view->getTrackEditor()->getTrackButtons()->
+ changeTrackInstrumentLabels(TrackLabel::ShowInstrument);
+ }
+}
+
+void RosegardenGUIApp::slotToggleRulers()
+{
+ m_view->slotShowRulers(m_viewRulers->isChecked());
+}
+
+void RosegardenGUIApp::slotToggleTempoRuler()
+{
+ m_view->slotShowTempoRuler(m_viewTempoRuler->isChecked());
+}
+
+void RosegardenGUIApp::slotToggleChordNameRuler()
+{
+ m_view->slotShowChordNameRuler(m_viewChordNameRuler->isChecked());
+}
+
+void RosegardenGUIApp::slotTogglePreviews()
+{
+ m_view->slotShowPreviews(m_viewPreviews->isChecked());
+}
+
+void RosegardenGUIApp::slotDockParametersBack()
+{
+ m_dockLeft->dockBack();
+}
+
+void RosegardenGUIApp::slotParametersClosed()
+{
+ stateChanged("parametersbox_closed");
+ m_dockVisible = false;
+}
+
+void RosegardenGUIApp::slotParametersDockedBack(KDockWidget* dw, KDockWidget::DockPosition)
+{
+ if (dw == m_dockLeft) {
+ stateChanged("parametersbox_closed", KXMLGUIClient::StateReverse);
+ m_dockVisible = true;
+ }
+}
+
+void RosegardenGUIApp::slotToggleStatusBar()
+{
+ KTmpStatusMsg msg(i18n("Toggle the statusbar..."), this);
+
+ if (!m_viewStatusBar->isChecked())
+ statusBar()->hide();
+ else
+ statusBar()->show();
+}
+
+void RosegardenGUIApp::slotStatusMsg(QString text)
+{
+ ///////////////////////////////////////////////////////////////////
+ // change status message permanently
+ statusBar()->clear();
+ statusBar()->changeItem(text, EditViewBase::ID_STATUS_MSG);
+}
+
+void RosegardenGUIApp::slotStatusHelpMsg(QString text)
+{
+ ///////////////////////////////////////////////////////////////////
+ // change status message of whole statusbar temporary (text, msec)
+ statusBar()->message(text, 2000);
+}
+
+void RosegardenGUIApp::slotEnableTransport(bool enable)
+{
+ if (m_transport)
+ getTransport()->setEnabled(enable);
+}
+
+void RosegardenGUIApp::slotPointerSelected()
+{
+ m_view->selectTool(SegmentSelector::ToolName);
+}
+
+void RosegardenGUIApp::slotEraseSelected()
+{
+ m_view->selectTool(SegmentEraser::ToolName);
+}
+
+void RosegardenGUIApp::slotDrawSelected()
+{
+ m_view->selectTool(SegmentPencil::ToolName);
+}
+
+void RosegardenGUIApp::slotMoveSelected()
+{
+ m_view->selectTool(SegmentMover::ToolName);
+}
+
+void RosegardenGUIApp::slotResizeSelected()
+{
+ m_view->selectTool(SegmentResizer::ToolName);
+}
+
+void RosegardenGUIApp::slotJoinSelected()
+{
+ KMessageBox::information(this,
+ i18n("The join tool isn't implemented yet. Instead please highlight "
+ "the segments you want to join and then use the menu option:\n\n"
+ " Segments->Collapse Segments.\n"),
+ i18n("Join tool not yet implemented"));
+
+ m_view->selectTool(SegmentJoiner::ToolName);
+}
+
+void RosegardenGUIApp::slotSplitSelected()
+{
+ m_view->selectTool(SegmentSplitter::ToolName);
+}
+
+void RosegardenGUIApp::slotAddTrack()
+{
+ if (!m_view)
+ return ;
+
+ // default to the base number - might not actually exist though
+ //
+ InstrumentId id = MidiInstrumentBase;
+
+ // Get the first Internal/MIDI instrument
+ //
+ DeviceList *devices = m_doc->getStudio().getDevices();
+ bool have = false;
+
+ for (DeviceList::iterator it = devices->begin();
+ it != devices->end() && !have; it++) {
+
+ if ((*it)->getType() != Device::Midi)
+ continue;
+
+ InstrumentList instruments = (*it)->getAllInstruments();
+ for (InstrumentList::iterator iit = instruments.begin();
+ iit != instruments.end(); iit++) {
+
+ if ((*iit)->getId() >= MidiInstrumentBase) {
+ id = (*iit)->getId();
+ have = true;
+ break;
+ }
+ }
+ }
+
+ Composition &comp = m_doc->getComposition();
+ TrackId trackId = comp.getSelectedTrack();
+ Track *track = comp.getTrackById(trackId);
+
+ int pos = -1;
+ if (track) pos = track->getPosition() + 1;
+
+ m_view->slotAddTracks(1, id, pos);
+}
+
+void RosegardenGUIApp::slotAddTracks()
+{
+ if (!m_view)
+ return ;
+
+ // default to the base number - might not actually exist though
+ //
+ InstrumentId id = MidiInstrumentBase;
+
+ // Get the first Internal/MIDI instrument
+ //
+ DeviceList *devices = m_doc->getStudio().getDevices();
+ bool have = false;
+
+ for (DeviceList::iterator it = devices->begin();
+ it != devices->end() && !have; it++) {
+
+ if ((*it)->getType() != Device::Midi)
+ continue;
+
+ InstrumentList instruments = (*it)->getAllInstruments();
+ for (InstrumentList::iterator iit = instruments.begin();
+ iit != instruments.end(); iit++) {
+
+ if ((*iit)->getId() >= MidiInstrumentBase) {
+ id = (*iit)->getId();
+ have = true;
+ break;
+ }
+ }
+ }
+
+ Composition &comp = m_doc->getComposition();
+ TrackId trackId = comp.getSelectedTrack();
+ Track *track = comp.getTrackById(trackId);
+
+ int pos = 0;
+ if (track) pos = track->getPosition();
+
+ bool ok = false;
+
+ AddTracksDialog dialog(this, pos);
+
+ if (dialog.exec() == QDialog::Accepted) {
+ m_view->slotAddTracks(dialog.getTracks(), id,
+ dialog.getInsertPosition());
+ }
+}
+
+void RosegardenGUIApp::slotDeleteTrack()
+{
+ if (!m_view)
+ return ;
+
+ Composition &comp = m_doc->getComposition();
+ TrackId trackId = comp.getSelectedTrack();
+ Track *track = comp.getTrackById(trackId);
+
+ RG_DEBUG << "RosegardenGUIApp::slotDeleteTrack() : about to delete track id "
+ << trackId << endl;
+
+ if (track == 0)
+ return ;
+
+ // Always have at least one track in a composition
+ //
+ if (comp.getNbTracks() == 1)
+ return ;
+
+ // VLADA
+ if (m_view->haveSelection()) {
+
+ SegmentSelection selection = m_view->getSelection();
+ m_view->slotSelectTrackSegments(trackId);
+ m_view->getTrackEditor()->slotDeleteSelectedSegments();
+ m_view->slotPropagateSegmentSelection(selection);
+
+ } else {
+
+ m_view->slotSelectTrackSegments(trackId);
+ m_view->getTrackEditor()->slotDeleteSelectedSegments();
+ }
+ //VLADA
+
+ int position = track->getPosition();
+
+ // Delete the track
+ //
+ std::vector<TrackId> tracks;
+ tracks.push_back(trackId);
+
+ m_view->slotDeleteTracks(tracks);
+
+ // Select a new valid track
+ //
+ if (comp.getTrackByPosition(position))
+ trackId = comp.getTrackByPosition(position)->getId();
+ else if (comp.getTrackByPosition(position - 1))
+ trackId = comp.getTrackByPosition(position - 1)->getId();
+ else {
+ RG_DEBUG << "RosegardenGUIApp::slotDeleteTrack - "
+ << "can't select a highlighted track after delete"
+ << endl;
+ }
+
+ comp.setSelectedTrack(trackId);
+
+ Instrument *inst = m_doc->getStudio().
+ getInstrumentById(comp.getTrackById(trackId)->getInstrument());
+
+ //VLADA
+ // m_view->slotSelectTrackSegments(trackId);
+ //VLADA
+}
+
+void RosegardenGUIApp::slotMoveTrackDown()
+{
+ RG_DEBUG << "RosegardenGUIApp::slotMoveTrackDown" << endl;
+
+ Composition &comp = m_doc->getComposition();
+ Track *srcTrack = comp.getTrackById(comp.getSelectedTrack());
+
+ // Check for track object
+ //
+ if (srcTrack == 0)
+ return ;
+
+ // Check destination track exists
+ //
+ Track *destTrack =
+ comp.getTrackByPosition(srcTrack->getPosition() + 1);
+
+ if (destTrack == 0)
+ return ;
+
+ MoveTracksCommand *command =
+ new MoveTracksCommand(&comp, srcTrack->getId(), destTrack->getId());
+
+ m_doc->getCommandHistory()->addCommand(command);
+
+ // make sure we're showing the right selection
+ m_view->slotSelectTrackSegments(comp.getSelectedTrack());
+
+}
+
+void RosegardenGUIApp::slotMoveTrackUp()
+{
+ RG_DEBUG << "RosegardenGUIApp::slotMoveTrackUp" << endl;
+
+ Composition &comp = m_doc->getComposition();
+ Track *srcTrack = comp.getTrackById(comp.getSelectedTrack());
+
+ // Check for track object
+ //
+ if (srcTrack == 0)
+ return ;
+
+ // Check we're not at the top already
+ //
+ if (srcTrack->getPosition() == 0)
+ return ;
+
+ // Check destination track exists
+ //
+ Track *destTrack =
+ comp.getTrackByPosition(srcTrack->getPosition() - 1);
+
+ if (destTrack == 0)
+ return ;
+
+ MoveTracksCommand *command =
+ new MoveTracksCommand(&comp, srcTrack->getId(), destTrack->getId());
+
+ m_doc->getCommandHistory()->addCommand(command);
+
+ // make sure we're showing the right selection
+ m_view->slotSelectTrackSegments(comp.getSelectedTrack());
+}
+
+void RosegardenGUIApp::slotRevertToSaved()
+{
+ RG_DEBUG << "RosegardenGUIApp::slotRevertToSaved" << endl;
+
+ if (m_doc->isModified()) {
+ int revert =
+ KMessageBox::questionYesNo(this,
+ i18n("Revert modified document to previous saved version?"));
+
+ if (revert == KMessageBox::No)
+ return ;
+
+ openFile(m_doc->getAbsFilePath());
+ }
+}
+
+void RosegardenGUIApp::slotImportProject()
+{
+ if (m_doc && !m_doc->saveIfModified())
+ return ;
+
+ KURL url = KFileDialog::getOpenURL
+ (":RGPROJECT",
+ i18n("*.rgp|Rosegarden Project files\n*|All files"), this,
+ i18n("Import Rosegarden Project File"));
+ if (url.isEmpty()) {
+ return ;
+ }
+
+ QString tmpfile;
+ KIO::NetAccess::download(url, tmpfile, this);
+
+ importProject(tmpfile);
+
+ KIO::NetAccess::removeTempFile(tmpfile);
+}
+
+void RosegardenGUIApp::importProject(QString filePath)
+{
+ KProcess *proc = new KProcess;
+ *proc << "rosegarden-project-package";
+ *proc << "--unpack";
+ *proc << filePath;
+
+ KStartupLogo::hideIfStillThere();
+ proc->start(KProcess::Block, KProcess::All);
+
+ if (!proc->normalExit() || proc->exitStatus()) {
+ CurrentProgressDialog::freeze();
+ KMessageBox::sorry(this, i18n("Failed to import project file \"%1\"").arg(filePath));
+ CurrentProgressDialog::thaw();
+ delete proc;
+ return ;
+ }
+
+ delete proc;
+
+ QString rgFile = filePath;
+ rgFile.replace(QRegExp(".rg.rgp$"), ".rg");
+ rgFile.replace(QRegExp(".rgp$"), ".rg");
+ openURL(rgFile);
+}
+
+void RosegardenGUIApp::slotImportMIDI()
+{
+ if (m_doc && !m_doc->saveIfModified())
+ return ;
+
+ KURL url = KFileDialog::getOpenURL
+ (":MIDI",
+ "audio/x-midi", this,
+ i18n("Open MIDI File"));
+ if (url.isEmpty()) {
+ return ;
+ }
+
+ QString tmpfile;
+ KIO::NetAccess::download(url, tmpfile, this);
+ openFile(tmpfile, ImportMIDI); // does everything including setting the document
+
+ KIO::NetAccess::removeTempFile( tmpfile );
+}
+
+void RosegardenGUIApp::slotMergeMIDI()
+{
+ KURL url = KFileDialog::getOpenURL
+ (":MIDI",
+ "audio/x-midi", this,
+ i18n("Merge MIDI File"));
+ if (url.isEmpty()) {
+ return ;
+ }
+
+ QString tmpfile;
+ KIO::NetAccess::download(url, tmpfile, this);
+ mergeFile(tmpfile, ImportMIDI);
+
+ KIO::NetAccess::removeTempFile( tmpfile );
+}
+
+QTextCodec *
+RosegardenGUIApp::guessTextCodec(std::string text)
+{
+ QTextCodec *codec = 0;
+
+ for (int c = 0; c < text.length(); ++c) {
+ if (text[c] & 0x80) {
+
+ CurrentProgressDialog::freeze();
+ KStartupLogo::hideIfStillThere();
+
+ IdentifyTextCodecDialog dialog(0, text);
+ dialog.exec();
+
+ std::string codecName = dialog.getCodec();
+
+ CurrentProgressDialog::thaw();
+
+ if (codecName != "") {
+ codec = QTextCodec::codecForName(codecName.c_str());
+ }
+ break;
+ }
+ }
+
+ return codec;
+}
+
+void
+RosegardenGUIApp::fixTextEncodings(Composition *c)
+
+{
+ QTextCodec *codec = 0;
+
+ for (Composition::iterator i = c->begin();
+ i != c->end(); ++i) {
+
+ for (Segment::iterator j = (*i)->begin();
+ j != (*i)->end(); ++j) {
+
+ if ((*j)->isa(Text::EventType)) {
+
+ std::string text;
+
+ if ((*j)->get
+ <String>
+ (Text::TextPropertyName, text)) {
+
+ if (!codec)
+ codec = guessTextCodec(text);
+
+ if (codec) {
+ (*j)->set
+ <String>
+ (Text::TextPropertyName,
+ convertFromCodec(text, codec));
+ }
+ }
+ }
+ }
+ }
+
+ if (!codec)
+ codec = guessTextCodec(c->getCopyrightNote());
+ if (codec)
+ c->setCopyrightNote(convertFromCodec(c->getCopyrightNote(), codec));
+
+ for (Composition::trackcontainer::iterator i =
+ c->getTracks().begin(); i != c->getTracks().end(); ++i) {
+ if (!codec)
+ codec = guessTextCodec(i->second->getLabel());
+ if (codec)
+ i->second->setLabel(convertFromCodec(i->second->getLabel(), codec));
+ }
+
+ for (Composition::iterator i = c->begin(); i != c->end(); ++i) {
+ if (!codec)
+ codec = guessTextCodec((*i)->getLabel());
+ if (codec)
+ (*i)->setLabel(convertFromCodec((*i)->getLabel(), codec));
+ }
+}
+
+RosegardenGUIDoc*
+RosegardenGUIApp::createDocumentFromMIDIFile(QString file)
+{
+ //if (!merge && !m_doc->saveIfModified()) return;
+
+ // Create new document (autoload is inherent)
+ //
+ RosegardenGUIDoc *newDoc = new RosegardenGUIDoc(this, m_pluginManager);
+
+ std::string fname(QFile::encodeName(file));
+
+ MidiFile midiFile(fname,
+ &newDoc->getStudio());
+
+ KStartupLogo::hideIfStillThere();
+ ProgressDialog progressDlg(i18n("Importing MIDI file..."),
+ 200,
+ this);
+
+ CurrentProgressDialog::set
+ (&progressDlg);
+
+ connect(&midiFile, SIGNAL(setProgress(int)),
+ progressDlg.progressBar(), SLOT(setValue(int)));
+
+ connect(&midiFile, SIGNAL(incrementProgress(int)),
+ progressDlg.progressBar(), SLOT(advance(int)));
+
+ if (!midiFile.open()) {
+ CurrentProgressDialog::freeze();
+ KMessageBox::error(this, strtoqstr(midiFile.getError())); //!!! i18n
+ delete newDoc;
+ return 0;
+ }
+
+ midiFile.convertToRosegarden(newDoc->getComposition(),
+ MidiFile::CONVERT_REPLACE);
+
+ fixTextEncodings(&newDoc->getComposition());
+
+ // Set modification flag
+ //
+ newDoc->slotDocumentModified();
+
+ // Set the caption
+ //
+ newDoc->setTitle(QFileInfo(file).fileName());
+ newDoc->setAbsFilePath(QFileInfo(file).absFilePath());
+
+ // Clean up for notation purposes (after reinitialise, because that
+ // sets the composition's end marker time which is needed here)
+
+ progressDlg.slotSetOperationName(i18n("Calculating notation..."));
+ ProgressDialog::processEvents();
+
+ Composition *comp = &newDoc->getComposition();
+
+ for (Composition::iterator i = comp->begin();
+ i != comp->end(); ++i) {
+
+ Segment &segment = **i;
+ SegmentNotationHelper helper(segment);
+ segment.insert(helper.guessClef(segment.begin(),
+ segment.getEndMarker()).getAsEvent
+ (segment.getStartTime()));
+ }
+
+ progressDlg.progressBar()->setProgress(100);
+
+ for (Composition::iterator i = comp->begin();
+ i != comp->end(); ++i) {
+
+ // find first key event in each segment (we'd have done the
+ // same for clefs, except there is no MIDI clef event)
+
+ Segment &segment = **i;
+ timeT firstKeyTime = segment.getEndMarkerTime();
+
+ for (Segment::iterator si = segment.begin();
+ segment.isBeforeEndMarker(si); ++si) {
+ if ((*si)->isa(Rosegarden::Key::EventType)) {
+ firstKeyTime = (*si)->getAbsoluteTime();
+ break;
+ }
+ }
+
+ if (firstKeyTime > segment.getStartTime()) {
+ CompositionTimeSliceAdapter adapter
+ (comp, timeT(0), firstKeyTime);
+ AnalysisHelper helper;
+ segment.insert(helper.guessKey(adapter).getAsEvent
+ (segment.getStartTime()));
+ }
+ }
+
+ int progressPer = 100;
+ if (comp->getNbSegments() > 0)
+ progressPer = (int)(100.0 / double(comp->getNbSegments()));
+
+ KMacroCommand *command = new KMacroCommand(i18n("Calculate Notation"));
+
+ for (Composition::iterator i = comp->begin();
+ i != comp->end(); ++i) {
+
+ Segment &segment = **i;
+ timeT startTime(segment.getStartTime());
+ timeT endTime(segment.getEndMarkerTime());
+
+// std::cerr << "segment: start time " << segment.getStartTime() << ", end time " << segment.getEndTime() << ", end marker time " << segment.getEndMarkerTime() << ", events " << segment.size() << std::endl;
+
+ EventQuantizeCommand *subCommand = new EventQuantizeCommand
+ (segment, startTime, endTime, "Notation Options", true);
+
+ subCommand->setProgressTotal(progressPer + 1);
+ QObject::connect(subCommand, SIGNAL(incrementProgress(int)),
+ progressDlg.progressBar(), SLOT(advance(int)));
+
+ command->addCommand(subCommand);
+ }
+
+ newDoc->getCommandHistory()->addCommand(command);
+
+ if (comp->getTimeSignatureCount() == 0) {
+ CompositionTimeSliceAdapter adapter(comp);
+ AnalysisHelper analysisHelper;
+ TimeSignature timeSig =
+ analysisHelper.guessTimeSignature(adapter);
+ comp->addTimeSignature(0, timeSig);
+ }
+
+ return newDoc;
+}
+
+void RosegardenGUIApp::slotImportRG21()
+{
+ if (m_doc && !m_doc->saveIfModified())
+ return ;
+
+ KURL url = KFileDialog::getOpenURL
+ (":ROSEGARDEN21",
+ i18n("*.rose|Rosegarden-2 files\n*|All files"), this,
+ i18n("Open Rosegarden 2.1 File"));
+ if (url.isEmpty()) {
+ return ;
+ }
+
+ QString tmpfile;
+ KIO::NetAccess::download(url, tmpfile, this);
+ openFile(tmpfile, ImportRG21);
+
+ KIO::NetAccess::removeTempFile(tmpfile);
+}
+
+void RosegardenGUIApp::slotMergeRG21()
+{
+ KURL url = KFileDialog::getOpenURL
+ (":ROSEGARDEN21",
+ i18n("*.rose|Rosegarden-2 files\n*|All files"), this,
+ i18n("Open Rosegarden 2.1 File"));
+ if (url.isEmpty()) {
+ return ;
+ }
+
+ QString tmpfile;
+ KIO::NetAccess::download(url, tmpfile, this);
+ mergeFile(tmpfile, ImportRG21);
+
+ KIO::NetAccess::removeTempFile( tmpfile );
+}
+
+RosegardenGUIDoc*
+RosegardenGUIApp::createDocumentFromRG21File(QString file)
+{
+ KStartupLogo::hideIfStillThere();
+ ProgressDialog progressDlg(
+ i18n("Importing Rosegarden 2.1 file..."), 100, this);
+
+ CurrentProgressDialog::set
+ (&progressDlg);
+
+ // Inherent autoload
+ //
+ RosegardenGUIDoc *newDoc = new RosegardenGUIDoc(this, m_pluginManager);
+
+ RG21Loader rg21Loader(&newDoc->getStudio());
+
+ // TODO: make RG21Loader to actually emit these signals
+ //
+ connect(&rg21Loader, SIGNAL(setProgress(int)),
+ progressDlg.progressBar(), SLOT(setValue(int)));
+
+ connect(&rg21Loader, SIGNAL(incrementProgress(int)),
+ progressDlg.progressBar(), SLOT(advance(int)));
+
+ // "your starter for 40%" - helps the "freeze" work
+ //
+ progressDlg.progressBar()->advance(40);
+
+ if (!rg21Loader.load(file, newDoc->getComposition())) {
+ CurrentProgressDialog::freeze();
+ KMessageBox::error(this,
+ i18n("Can't load Rosegarden 2.1 file. It appears to be corrupted."));
+ delete newDoc;
+ return 0;
+ }
+
+ // Set modification flag
+ //
+ newDoc->slotDocumentModified();
+
+ // Set the caption and add recent
+ //
+ newDoc->setTitle(QFileInfo(file).fileName());
+ newDoc->setAbsFilePath(QFileInfo(file).absFilePath());
+
+ return newDoc;
+
+}
+
+void
+RosegardenGUIApp::slotImportHydrogen()
+{
+ if (m_doc && !m_doc->saveIfModified())
+ return ;
+
+ KURL url = KFileDialog::getOpenURL
+ (":HYDROGEN",
+ i18n("*.h2song|Hydrogen files\n*|All files"), this,
+ i18n("Open Hydrogen File"));
+ if (url.isEmpty()) {
+ return ;
+ }
+
+ QString tmpfile;
+ KIO::NetAccess::download(url, tmpfile, this);
+ openFile(tmpfile, ImportHydrogen);
+
+ KIO::NetAccess::removeTempFile(tmpfile);
+}
+
+void RosegardenGUIApp::slotMergeHydrogen()
+{
+ KURL url = KFileDialog::getOpenURL
+ (":HYDROGEN",
+ i18n("*.h2song|Hydrogen files\n*|All files"), this,
+ i18n("Open Hydrogen File"));
+ if (url.isEmpty()) {
+ return ;
+ }
+
+ QString tmpfile;
+ KIO::NetAccess::download(url, tmpfile, this);
+ mergeFile(tmpfile, ImportHydrogen);
+
+ KIO::NetAccess::removeTempFile( tmpfile );
+}
+
+RosegardenGUIDoc*
+RosegardenGUIApp::createDocumentFromHydrogenFile(QString file)
+{
+ KStartupLogo::hideIfStillThere();
+ ProgressDialog progressDlg(
+ i18n("Importing Hydrogen file..."), 100, this);
+
+ CurrentProgressDialog::set
+ (&progressDlg);
+
+ // Inherent autoload
+ //
+ RosegardenGUIDoc *newDoc = new RosegardenGUIDoc(this, m_pluginManager);
+
+ HydrogenLoader hydrogenLoader(&newDoc->getStudio());
+
+ // TODO: make RG21Loader to actually emit these signals
+ //
+ connect(&hydrogenLoader, SIGNAL(setProgress(int)),
+ progressDlg.progressBar(), SLOT(setValue(int)));
+
+ connect(&hydrogenLoader, SIGNAL(incrementProgress(int)),
+ progressDlg.progressBar(), SLOT(advance(int)));
+
+ // "your starter for 40%" - helps the "freeze" work
+ //
+ progressDlg.progressBar()->advance(40);
+
+ if (!hydrogenLoader.load(file, newDoc->getComposition())) {
+ CurrentProgressDialog::freeze();
+ KMessageBox::error(this,
+ i18n("Can't load Hydrogen file. It appears to be corrupted."));
+ delete newDoc;
+ return 0;
+ }
+
+ // Set modification flag
+ //
+ newDoc->slotDocumentModified();
+
+ // Set the caption and add recent
+ //
+ newDoc->setTitle(QFileInfo(file).fileName());
+ newDoc->setAbsFilePath(QFileInfo(file).absFilePath());
+
+ return newDoc;
+
+}
+
+void
+RosegardenGUIApp::mergeFile(QString filePath, ImportType type)
+{
+ RosegardenGUIDoc *doc = createDocument(filePath, type);
+
+ if (doc) {
+ if (m_doc) {
+
+ bool timingsDiffer = false;
+ Composition &c1 = m_doc->getComposition();
+ Composition &c2 = doc->getComposition();
+
+ // compare tempos and time sigs in the two -- rather laborious
+
+ if (c1.getTimeSignatureCount() != c2.getTimeSignatureCount()) {
+ timingsDiffer = true;
+ } else {
+ for (int i = 0; i < c1.getTimeSignatureCount(); ++i) {
+ std::pair<timeT, TimeSignature> t1 =
+ c1.getTimeSignatureChange(i);
+ std::pair<timeT, TimeSignature> t2 =
+ c2.getTimeSignatureChange(i);
+ if (t1.first != t2.first || t1.second != t2.second) {
+ timingsDiffer = true;
+ break;
+ }
+ }
+ }
+
+ if (c1.getTempoChangeCount() != c2.getTempoChangeCount()) {
+ timingsDiffer = true;
+ } else {
+ for (int i = 0; i < c1.getTempoChangeCount(); ++i) {
+ std::pair<timeT, tempoT> t1 = c1.getTempoChange(i);
+ std::pair<timeT, tempoT> t2 = c2.getTempoChange(i);
+ if (t1.first != t2.first || t1.second != t2.second) {
+ timingsDiffer = true;
+ break;
+ }
+ }
+ }
+
+ FileMergeDialog dialog(this, filePath, timingsDiffer);
+ if (dialog.exec() == QDialog::Accepted) {
+ m_doc->mergeDocument(doc, dialog.getMergeOptions());
+ }
+
+ delete doc;
+
+ } else {
+ setDocument(doc);
+ }
+ }
+}
+
+void
+RosegardenGUIApp::slotUpdatePlaybackPosition()
+{
+ static int callbackCount = 0;
+
+ // Either sequencer mappper or the sequence manager could be missing at
+ // this point.
+ //
+ if (!m_seqManager || !m_seqManager->getSequencerMapper())
+ return ;
+
+ SequencerMapper *mapper = m_seqManager->getSequencerMapper();
+
+ MappedEvent ev;
+ bool haveEvent = mapper->getVisual(ev);
+ if (haveEvent)
+ getTransport()->setMidiOutLabel(&ev);
+
+ RealTime position = mapper->getPositionPointer();
+
+ // std::cerr << "RosegardenGUIApp::slotUpdatePlaybackPosition: mapper pos = " << position << std::endl;
+
+ Composition &comp = m_doc->getComposition();
+ timeT elapsedTime = comp.getElapsedTimeForRealTime(position);
+
+ // std::cerr << "RosegardenGUIApp::slotUpdatePlaybackPosition: mapper timeT = " << elapsedTime << std::endl;
+
+ if (m_seqManager->getTransportStatus() == RECORDING) {
+
+ MappedComposition mC;
+ if (mapper->getRecordedEvents(mC) > 0) {
+ m_seqManager->processAsynchronousMidi(mC, 0);
+ m_doc->insertRecordedMidi(mC);
+ }
+
+ m_doc->updateRecordingMIDISegment();
+ m_doc->updateRecordingAudioSegments();
+ }
+
+ m_originatingJump = true;
+ m_doc->slotSetPointerPosition(elapsedTime);
+ m_originatingJump = false;
+
+ if (m_audioMixer && m_audioMixer->isVisible())
+ m_audioMixer->updateMeters(mapper);
+
+ if (m_midiMixer && m_midiMixer->isVisible())
+ m_midiMixer->updateMeters(mapper);
+
+ m_view->updateMeters(mapper);
+
+ if (++callbackCount == 60) {
+ slotUpdateCPUMeter(true);
+ callbackCount = 0;
+ }
+
+ // if (elapsedTime >= comp.getEndMarker())
+ // slotStop();
+}
+
+void
+RosegardenGUIApp::slotUpdateCPUMeter(bool playing)
+{
+ static std::ifstream *statstream = 0;
+ static bool modified = false;
+ static unsigned long lastBusy = 0, lastIdle = 0;
+
+ if (playing) {
+
+ if (!statstream) {
+ statstream = new std::ifstream("/proc/stat", std::ios::in);
+ }
+
+ if (!statstream || !*statstream)
+ return ;
+ statstream->seekg(0, std::ios::beg);
+
+ std::string cpu;
+ unsigned long user, nice, sys, idle;
+ *statstream >> cpu;
+ *statstream >> user;
+ *statstream >> nice;
+ *statstream >> sys;
+ *statstream >> idle;
+
+ unsigned long busy = user + nice + sys;
+ unsigned long count = 0;
+
+ if (lastBusy > 0) {
+ unsigned long bd = busy - lastBusy;
+ unsigned long id = idle - lastIdle;
+ if (bd + id > 0)
+ count = bd * 100 / (bd + id);
+ if (count > 100)
+ count = 100;
+ }
+
+ lastBusy = busy;
+ lastIdle = idle;
+
+ if (m_progressBar) {
+ if (!modified) {
+ m_progressBar->setTextEnabled(true);
+ m_progressBar->setFormat("CPU");
+ }
+ m_progressBar->setProgress(count);
+ }
+
+ modified = true;
+
+ } else if (modified) {
+ if (m_progressBar) {
+ m_progressBar->setTextEnabled(false);
+ m_progressBar->setFormat("%p%");
+ m_progressBar->setProgress(0);
+ }
+ modified = false;
+ }
+}
+
+void
+RosegardenGUIApp::slotUpdateMonitoring()
+{
+ // Either sequencer mappper or the sequence manager could be missing at
+ // this point.
+ //
+ if (!m_seqManager || !m_seqManager->getSequencerMapper())
+ return ;
+
+ SequencerMapper *mapper = m_seqManager->getSequencerMapper();
+
+ if (m_audioMixer && m_audioMixer->isVisible())
+ m_audioMixer->updateMonitorMeters(mapper);
+
+ if (m_midiMixer && m_midiMixer->isVisible())
+ m_midiMixer->updateMonitorMeter(mapper);
+
+ m_view->updateMonitorMeters(mapper);
+
+ slotUpdateCPUMeter(false);
+}
+
+void RosegardenGUIApp::slotSetPointerPosition(timeT t)
+{
+ Composition &comp = m_doc->getComposition();
+
+ // std::cerr << "RosegardenGUIApp::slotSetPointerPosition: t = " << t << std::endl;
+
+ if (m_seqManager) {
+ if ( m_seqManager->getTransportStatus() == PLAYING ||
+ m_seqManager->getTransportStatus() == RECORDING ) {
+ if (t > comp.getEndMarker()) {
+ if (m_seqManager->getTransportStatus() == PLAYING) {
+
+ slotStop();
+ t = comp.getEndMarker();
+ m_doc->slotSetPointerPosition(t); //causes this method to be re-invoked
+ return ;
+
+ } else { // if recording, increase composition duration
+ std::pair<timeT, timeT> timeRange = comp.getBarRangeForTime(t);
+ timeT barDuration = timeRange.second - timeRange.first;
+ timeT newEndMarker = t + 10 * barDuration;
+ comp.setEndMarker(newEndMarker);
+ getView()->getTrackEditor()->slotReadjustCanvasSize();
+ getView()->getTrackEditor()->updateRulers();
+ }
+ }
+ }
+
+ // cc 20050520 - jump at the sequencer even if we're not playing,
+ // because we might be a transport master of some kind
+ try {
+ if (!m_originatingJump) {
+ m_seqManager->sendSequencerJump(comp.getElapsedRealTime(t));
+ }
+ } catch (QString s) {
+ KMessageBox::error(this, s);
+ }
+ }
+
+ // set the time sig
+ getTransport()->setTimeSignature(comp.getTimeSignatureAt(t));
+
+ // and the tempo
+ getTransport()->setTempo(comp.getTempoAtTime(t));
+
+ // and the time
+ //
+ TransportDialog::TimeDisplayMode mode =
+ getTransport()->getCurrentMode();
+
+ if (mode == TransportDialog::BarMode ||
+ mode == TransportDialog::BarMetronomeMode) {
+
+ slotDisplayBarTime(t);
+
+ } else {
+
+ RealTime rT(comp.getElapsedRealTime(t));
+
+ if (getTransport()->isShowingTimeToEnd()) {
+ rT = rT - comp.getElapsedRealTime(comp.getDuration());
+ }
+
+ if (mode == TransportDialog::RealMode) {
+
+ getTransport()->displayRealTime(rT);
+
+ } else if (mode == TransportDialog::SMPTEMode) {
+
+ getTransport()->displaySMPTETime(rT);
+
+ } else {
+
+ getTransport()->displayFrameTime(rT);
+ }
+ }
+
+ // handle transport mode configuration changes
+ std::string modeAsString = getTransport()->getCurrentModeAsString();
+
+ if (m_doc->getConfiguration().get<String>
+ (DocumentConfiguration::TransportMode) != modeAsString) {
+
+ m_doc->getConfiguration().set<String>
+ (DocumentConfiguration::TransportMode, modeAsString);
+
+ //m_doc->slotDocumentModified(); to avoid being prompted for a file change when merely changing the transport display
+ }
+
+ // Update position on the marker editor if it's available
+ //
+ if (m_markerEditor)
+ m_markerEditor->updatePosition();
+}
+
+void RosegardenGUIApp::slotDisplayBarTime(timeT t)
+{
+ Composition &comp = m_doc->getComposition();
+
+ int barNo = comp.getBarNumber(t);
+ timeT barStart = comp.getBarStart(barNo);
+
+ TimeSignature timeSig = comp.getTimeSignatureAt(t);
+ timeT beatDuration = timeSig.getBeatDuration();
+
+ int beatNo = (t - barStart) / beatDuration;
+ int unitNo = (t - barStart) - (beatNo * beatDuration);
+
+ if (getTransport()->isShowingTimeToEnd()) {
+ barNo = barNo + 1 - comp.getNbBars();
+ beatNo = timeSig.getBeatsPerBar() - 1 - beatNo;
+ unitNo = timeSig.getBeatDuration() - 1 - unitNo;
+ } else {
+ // convert to 1-based display bar numbers
+ barNo += 1;
+ beatNo += 1;
+ }
+
+ // show units in hemidemis (or whatever), not in raw time ticks
+ unitNo /= Note(Note::Shortest).getDuration();
+
+ getTransport()->displayBarTime(barNo, beatNo, unitNo);
+}
+
+void RosegardenGUIApp::slotRefreshTimeDisplay()
+{
+ if ( m_seqManager->getTransportStatus() == PLAYING ||
+ m_seqManager->getTransportStatus() == RECORDING ) {
+ return ; // it'll be refreshed in a moment anyway
+ }
+ slotSetPointerPosition(m_doc->getComposition().getPosition());
+}
+
+bool
+RosegardenGUIApp::isTrackEditorPlayTracking() const
+{
+ return m_view->getTrackEditor()->isTracking();
+}
+
+void RosegardenGUIApp::slotToggleTracking()
+{
+ m_view->getTrackEditor()->slotToggleTracking();
+}
+
+void RosegardenGUIApp::slotTestStartupTester()
+{
+ RG_DEBUG << "RosegardenGUIApp::slotTestStartupTester" << endl;
+
+ if (!m_startupTester) {
+ m_startupTester = new StartupTester();
+ connect(m_startupTester, SIGNAL(newerVersionAvailable(QString)),
+ this, SLOT(slotNewerVersionAvailable(QString)));
+ m_startupTester->start();
+ QTimer::singleShot(100, this, SLOT(slotTestStartupTester()));
+ return ;
+ }
+
+ if (!m_startupTester->isReady()) {
+ QTimer::singleShot(100, this, SLOT(slotTestStartupTester()));
+ return ;
+ }
+
+ QStringList missingFeatures;
+ QStringList allMissing;
+
+ QStringList missing;
+ bool have = m_startupTester->haveProjectPackager(&missing);
+
+ stateChanged("have_project_packager",
+ have ?
+ KXMLGUIClient::StateNoReverse : KXMLGUIClient::StateReverse);
+
+ if (!have) {
+ missingFeatures.push_back(i18n("Export and import of Rosegarden Project files"));
+ if (missing.count() == 0) {
+ allMissing.push_back(i18n("The Rosegarden Project Packager helper script"));
+ } else {
+ for (int i = 0; i < missing.count(); ++i) {
+// if (missingFeatures.count() > 1) {
+ allMissing.push_back(i18n("%1 - for project file support").arg(missing[i]));
+// } else {
+// allMissing.push_back(missing[i]);
+// }
+ }
+ }
+ }
+
+ have = m_startupTester->haveLilyPondView(&missing);
+
+ stateChanged("have_lilypondview",
+ have ?
+ KXMLGUIClient::StateNoReverse : KXMLGUIClient::StateReverse);
+
+ if (!have) {
+ missingFeatures.push_back("Notation previews through LilyPond");
+ if (missing.count() == 0) {
+ allMissing.push_back(i18n("The Rosegarden LilyPondView helper script"));
+ } else {
+ for (int i = 0; i < missing.count(); ++i) {
+ if (missingFeatures.count() > 1) {
+ allMissing.push_back(i18n("%1 - for LilyPond preview support").arg(missing[i]));
+ } else {
+ allMissing.push_back(missing[i]);
+ }
+ }
+ }
+ }
+
+#ifdef HAVE_LIBJACK
+ if (m_seqManager && (m_seqManager->getSoundDriverStatus() & AUDIO_OK)) {
+
+ m_haveAudioImporter = m_startupTester->haveAudioFileImporter(&missing);
+
+ if (!m_haveAudioImporter) {
+ missingFeatures.push_back("General audio file import and conversion");
+ if (missing.count() == 0) {
+ allMissing.push_back(i18n("The Rosegarden Audio File Importer helper script"));
+ } else {
+ for (int i = 0; i < missing.count(); ++i) {
+ if (missingFeatures.count() > 1) {
+ allMissing.push_back(i18n("%1 - for audio file import").arg(missing[i]));
+ } else {
+ allMissing.push_back(missing[i]);
+ }
+ }
+ }
+ }
+ }
+#endif
+
+ if (missingFeatures.count() > 0) {
+ QString message = i18n("<h3>Helper programs not found</h3><p>Rosegarden could not find one or more helper programs which it needs to provide some features. The following features will not be available:</p>");
+ message += i18n("<ul>");
+ for (int i = 0; i < missingFeatures.count(); ++i) {
+ message += i18n("<li>%1</li>").arg(missingFeatures[i]);
+ }
+ message += i18n("</ul>");
+ message += i18n("<p>To fix this, you should install the following additional programs:</p>");
+ message += i18n("<ul>");
+ for (int i = 0; i < allMissing.count(); ++i) {
+ message += i18n("<li>%1</li>").arg(allMissing[i]);
+ }
+ message += i18n("</ul>");
+
+ awaitDialogClearance();
+
+ KMessageBox::information
+ (m_view,
+ message,
+ i18n("Helper programs not found"),
+ "startup-helpers-missing");
+ }
+
+ delete m_startupTester;
+ m_startupTester = 0;
+}
+
+void RosegardenGUIApp::slotDebugDump()
+{
+ Composition &comp = m_doc->getComposition();
+ comp.dump(std::cerr);
+}
+
+bool RosegardenGUIApp::launchSequencer(bool useExisting)
+{
+ if (!isUsingSequencer()) {
+ RG_DEBUG << "RosegardenGUIApp::launchSequencer() - not using seq. - returning\n";
+ return false; // no need to launch anything
+ }
+
+ if (isSequencerRunning()) {
+ RG_DEBUG << "RosegardenGUIApp::launchSequencer() - sequencer already running - returning\n";
+ if (m_seqManager) m_seqManager->checkSoundDriverStatus(false);
+ return true;
+ }
+
+ // Check to see if we're clearing down sequencer processes -
+ // if we're not we check DCOP for an existing sequencer and
+ // try to talk to use that (that's the "developer" mode).
+ //
+ // User mode should clear down sequencer processes.
+ //
+ if (kapp->dcopClient()->isApplicationRegistered(
+ QCString(ROSEGARDEN_SEQUENCER_APP_NAME))) {
+ RG_DEBUG << "RosegardenGUIApp::launchSequencer() - "
+ << "existing DCOP registered sequencer found\n";
+
+ if (useExisting) {
+ if (m_seqManager) m_seqManager->checkSoundDriverStatus(false);
+ m_sequencerProcess = (KProcess*)SequencerExternal;
+ return true;
+ }
+
+ KProcess *proc = new KProcess;
+ *proc << "/usr/bin/killall";
+ *proc << "rosegardensequencer";
+ *proc << "lt-rosegardensequencer";
+
+ proc->start(KProcess::Block, KProcess::All);
+
+ if (!proc->normalExit() || proc->exitStatus()) {
+ RG_DEBUG << "couldn't kill any sequencer processes" << endl;
+ }
+ delete proc;
+
+ sleep(1);
+
+ if (kapp->dcopClient()->isApplicationRegistered(
+ QCString(ROSEGARDEN_SEQUENCER_APP_NAME))) {
+ RG_DEBUG << "RosegardenGUIApp::launchSequencer() - "
+ << "failed to kill existing sequencer\n";
+
+ KProcess *proc = new KProcess;
+ *proc << "/usr/bin/killall";
+ *proc << "-9";
+ *proc << "rosegardensequencer";
+ *proc << "lt-rosegardensequencer";
+
+ proc->start(KProcess::Block, KProcess::All);
+
+ if (proc->exitStatus()) {
+ RG_DEBUG << "couldn't kill any sequencer processes" << endl;
+ }
+ delete proc;
+
+ sleep(1);
+ }
+ }
+
+ //
+ // No sequencer is running, so start one
+ //
+ KTmpStatusMsg msg(i18n("Starting the sequencer..."), this);
+
+ if (!m_sequencerProcess) {
+ m_sequencerProcess = new KProcess;
+
+ (*m_sequencerProcess) << "rosegardensequencer";
+
+ // Command line arguments
+ //
+ KConfig *config = kapp->config();
+ config->setGroup(SequencerOptionsConfigGroup);
+ QString options = config->readEntry("commandlineoptions");
+ if (!options.isEmpty()) {
+ (*m_sequencerProcess) << options;
+ RG_DEBUG << "sequencer options \"" << options << "\"" << endl;
+ }
+
+ } else {
+ RG_DEBUG << "RosegardenGUIApp::launchSequencer() - sequencer KProcess already created\n";
+ m_sequencerProcess->disconnect(); // disconnect processExit signal
+ // it will be reconnected later on
+ }
+
+ bool res = m_sequencerProcess->start();
+
+ if (!res) {
+ KMessageBox::error(0, i18n("Couldn't start the sequencer"));
+ RG_DEBUG << "Couldn't start the sequencer\n";
+ m_sequencerProcess = 0;
+ // If starting it didn't even work, fall back to no sequencer mode
+ m_useSequencer = false;
+ } else {
+ // connect processExited only after start, otherwise
+ // a failed startup will call slotSequencerExited()
+ // right away and we don't get to check the result
+ // of m_sequencerProcess->start() and thus make the distinction
+ // between the case where the sequencer was successfully launched
+ // but crashed right away, or the case where the process couldn't
+ // be launched at all (missing executable, etc...)
+ //
+ // We also re-check that the process is still running at this
+ // point in case it crashed between the moment we check res above
+ // and now.
+ //
+ //usleep(1000 * 1000); // even wait half a sec. to make sure it's actually running
+ if (m_sequencerProcess->isRunning()) {
+
+ try {
+ // if (m_seqManager) {
+ // RG_DEBUG << "RosegardenGUIApp::launchSequencer : checking sound driver status\n";
+ // m_seqManager->checkSoundDriverStatus();
+ // }
+
+ stateChanged("sequencer_running");
+ slotEnableTransport(true);
+
+ connect(m_sequencerProcess, SIGNAL(processExited(KProcess*)),
+ this, SLOT(slotSequencerExited(KProcess*)));
+
+ } catch (Exception e) {
+ m_sequencerProcess = 0;
+ m_useSequencer = false;
+ stateChanged("sequencer_running", KXMLGUIClient::StateReverse);
+ slotEnableTransport(false);
+ }
+
+ } else { // if it crashed so fast, it's probably pointless
+ // to try restarting it later, so also fall back to no
+ // sequencer mode
+ m_sequencerProcess = 0;
+ m_useSequencer = false;
+ stateChanged("sequencer_running", KXMLGUIClient::StateReverse);
+ slotEnableTransport(false);
+ }
+
+ }
+
+ // Sync current devices with the sequencer
+ //
+ if (m_doc)
+ m_doc->syncDevices();
+
+ if (m_doc && m_doc->getStudio().haveMidiDevices()) {
+ stateChanged("got_midi_devices");
+ } else {
+ stateChanged("got_midi_devices", KXMLGUIClient::StateReverse);
+ }
+
+ return res;
+}
+
+#ifdef HAVE_LIBJACK
+bool RosegardenGUIApp::launchJack()
+{
+ KConfig* config = kapp->config();
+ config->setGroup(SequencerOptionsConfigGroup);
+
+ bool startJack = config->readBoolEntry("jackstart", false);
+ if (!startJack)
+ return true; // we don't do anything
+
+ QString jackPath = config->readEntry("jackcommand", "");
+
+ emit startupStatusMessage(i18n("Clearing down jackd..."));
+
+ KProcess *proc = new KProcess; // TODO: do it in a less clumsy way
+ *proc << "/usr/bin/killall";
+ *proc << "-9";
+ *proc << "jackd";
+
+ proc->start(KProcess::Block, KProcess::All);
+
+ if (proc->exitStatus())
+ RG_DEBUG << "couldn't kill any jackd processes" << endl;
+ else
+ RG_DEBUG << "killed old jackd processes" << endl;
+
+ emit startupStatusMessage(i18n("Starting jackd..."));
+
+ if (jackPath != "") {
+
+ RG_DEBUG << "starting jack \"" << jackPath << "\"" << endl;
+
+ QStringList splitCommand;
+ splitCommand = QStringList::split(" ", jackPath);
+
+ RG_DEBUG << "RosegardenGUIApp::launchJack() : splitCommand length : "
+ << splitCommand.size() << endl;
+
+ // start jack process
+ m_jackProcess = new KProcess;
+
+ *m_jackProcess << splitCommand;
+
+ m_jackProcess->start();
+ }
+
+
+ return m_jackProcess != 0 ? m_jackProcess->isRunning() : true;
+}
+#endif
+
+void RosegardenGUIApp::slotDocumentDevicesResyncd()
+{
+ m_sequencerCheckedIn = true;
+ m_trackParameterBox->populateDeviceLists();
+}
+
+void RosegardenGUIApp::slotSequencerExited(KProcess*)
+{
+ RG_DEBUG << "RosegardenGUIApp::slotSequencerExited Sequencer exited\n";
+
+ KStartupLogo::hideIfStillThere();
+
+ if (m_sequencerCheckedIn) {
+
+ KMessageBox::error(0, i18n("The Rosegarden sequencer process has exited unexpectedly. Sound and recording will no longer be available for this session.\nPlease exit and restart Rosegarden to restore sound capability."));
+
+ } else {
+
+ KMessageBox::error(0, i18n("The Rosegarden sequencer could not be started, so sound and recording will be unavailable for this session.\nFor assistance with correct audio and MIDI configuration, go to http://rosegardenmusic.com."));
+ }
+
+ m_sequencerProcess = 0; // isSequencerRunning() will return false
+ // but isUsingSequencer() will keep returning true
+ // so pressing the play button may attempt to restart the sequencer
+}
+
+void RosegardenGUIApp::slotExportProject()
+{
+ KTmpStatusMsg msg(i18n("Exporting Rosegarden Project file..."), this);
+
+ QString fileName = getValidWriteFile
+ ("*.rgp|" + i18n("Rosegarden Project files\n") +
+ "\n*|" + i18n("All files"),
+ i18n("Export as..."));
+
+ if (fileName.isEmpty())
+ return ;
+
+ QString rgFile = fileName;
+ rgFile.replace(QRegExp(".rg.rgp$"), ".rg");
+ rgFile.replace(QRegExp(".rgp$"), ".rg");
+
+ CurrentProgressDialog::freeze();
+
+ QString errMsg;
+ if (!m_doc->saveDocument(rgFile, errMsg,
+ true)) { // pretend it's autosave
+ KMessageBox::sorry(this, i18n("Saving Rosegarden file to package failed: %1").arg(errMsg));
+ CurrentProgressDialog::thaw();
+ return ;
+ }
+
+ KProcess *proc = new KProcess;
+ *proc << "rosegarden-project-package";
+ *proc << "--pack";
+ *proc << rgFile;
+ *proc << fileName;
+
+ proc->start(KProcess::Block, KProcess::All);
+
+ if (!proc->normalExit() || proc->exitStatus()) {
+ KMessageBox::sorry(this, i18n("Failed to export to project file \"%1\"").arg(fileName));
+ CurrentProgressDialog::thaw();
+ delete proc;
+ return ;
+ }
+
+ delete proc;
+}
+
+void RosegardenGUIApp::slotExportMIDI()
+{
+ KTmpStatusMsg msg(i18n("Exporting MIDI file..."), this);
+
+ QString fileName = getValidWriteFile
+ ("*.mid *.midi|" + i18n("Standard MIDI files\n") +
+ "\n*|" + i18n("All files"),
+ i18n("Export as..."));
+
+ if (fileName.isEmpty())
+ return ;
+
+ exportMIDIFile(fileName);
+}
+
+void RosegardenGUIApp::exportMIDIFile(QString file)
+{
+ ProgressDialog progressDlg(i18n("Exporting MIDI file..."),
+ 100,
+ this);
+
+ std::string fname(QFile::encodeName(file));
+
+ MidiFile midiFile(fname,
+ &m_doc->getStudio());
+
+ connect(&midiFile, SIGNAL(setProgress(int)),
+ progressDlg.progressBar(), SLOT(setValue(int)));
+
+ connect(&midiFile, SIGNAL(incrementProgress(int)),
+ progressDlg.progressBar(), SLOT(advance(int)));
+
+ midiFile.convertToMidi(m_doc->getComposition());
+
+ if (!midiFile.write()) {
+ CurrentProgressDialog::freeze();
+ KMessageBox::sorry(this, i18n("Export failed. The file could not be opened for writing."));
+ }
+}
+
+void RosegardenGUIApp::slotExportCsound()
+{
+ KTmpStatusMsg msg(i18n("Exporting Csound score file..."), this);
+
+ QString fileName = getValidWriteFile(QString("*|") + i18n("All files"),
+ i18n("Export as..."));
+ if (fileName.isEmpty())
+ return ;
+
+ exportCsoundFile(fileName);
+}
+
+void RosegardenGUIApp::exportCsoundFile(QString file)
+{
+ ProgressDialog progressDlg(i18n("Exporting Csound score file..."),
+ 100,
+ this);
+
+ CsoundExporter e(this, &m_doc->getComposition(), std::string(QFile::encodeName(file)));
+
+ connect(&e, SIGNAL(setProgress(int)),
+ progressDlg.progressBar(), SLOT(setValue(int)));
+
+ connect(&e, SIGNAL(incrementProgress(int)),
+ progressDlg.progressBar(), SLOT(advance(int)));
+
+ if (!e.write()) {
+ CurrentProgressDialog::freeze();
+ KMessageBox::sorry(this, i18n("Export failed. The file could not be opened for writing."));
+ }
+}
+
+void RosegardenGUIApp::slotExportMup()
+{
+ KTmpStatusMsg msg(i18n("Exporting Mup file..."), this);
+
+ QString fileName = getValidWriteFile
+ ("*.mup|" + i18n("Mup files\n") + "\n*|" + i18n("All files"),
+ i18n("Export as..."));
+ if (fileName.isEmpty())
+ return ;
+
+ exportMupFile(fileName);
+}
+
+void RosegardenGUIApp::exportMupFile(QString file)
+{
+ ProgressDialog progressDlg(i18n("Exporting Mup file..."),
+ 100,
+ this);
+
+ MupExporter e(this, &m_doc->getComposition(), std::string(QFile::encodeName(file)));
+
+ connect(&e, SIGNAL(setProgress(int)),
+ progressDlg.progressBar(), SLOT(setValue(int)));
+
+ connect(&e, SIGNAL(incrementProgress(int)),
+ progressDlg.progressBar(), SLOT(advance(int)));
+
+ if (!e.write()) {
+ CurrentProgressDialog::freeze();
+ KMessageBox::sorry(this, i18n("Export failed. The file could not be opened for writing."));
+ }
+}
+
+void RosegardenGUIApp::slotExportLilyPond()
+{
+ KTmpStatusMsg msg(i18n("Exporting LilyPond file..."), this);
+
+ QString fileName = getValidWriteFile
+ (QString("*.ly|") + i18n("LilyPond files") +
+ "\n*|" + i18n("All files"),
+ i18n("Export as..."));
+
+ if (fileName.isEmpty())
+ return ;
+
+ exportLilyPondFile(fileName);
+}
+
+std::map<KProcess *, KTempFile *> RosegardenGUIApp::m_lilyTempFileMap;
+
+
+void RosegardenGUIApp::slotPrintLilyPond()
+{
+ KTmpStatusMsg msg(i18n("Printing LilyPond file..."), this);
+ KTempFile *file = new KTempFile(QString::null, ".ly");
+ file->setAutoDelete(true);
+ if (!file->name()) {
+ CurrentProgressDialog::freeze();
+ KMessageBox::sorry(this, i18n("Failed to open a temporary file for LilyPond export."));
+ delete file;
+ }
+ if (!exportLilyPondFile(file->name(), true)) {
+ return ;
+ }
+ KProcess *proc = new KProcess;
+ *proc << "rosegarden-lilypondview";
+ *proc << "--graphical";
+ *proc << "--print";
+ *proc << file->name();
+ connect(proc, SIGNAL(processExited(KProcess *)),
+ this, SLOT(slotLilyPondViewProcessExited(KProcess *)));
+ m_lilyTempFileMap[proc] = file;
+ proc->start(KProcess::NotifyOnExit);
+}
+
+void RosegardenGUIApp::slotPreviewLilyPond()
+{
+ KTmpStatusMsg msg(i18n("Previewing LilyPond file..."), this);
+ KTempFile *file = new KTempFile(QString::null, ".ly");
+ file->setAutoDelete(true);
+ if (!file->name()) {
+ CurrentProgressDialog::freeze();
+ KMessageBox::sorry(this, i18n("Failed to open a temporary file for LilyPond export."));
+ delete file;
+ }
+ if (!exportLilyPondFile(file->name(), true)) {
+ return ;
+ }
+ KProcess *proc = new KProcess;
+ *proc << "rosegarden-lilypondview";
+ *proc << "--graphical";
+ *proc << "--pdf";
+ *proc << file->name();
+ connect(proc, SIGNAL(processExited(KProcess *)),
+ this, SLOT(slotLilyPondViewProcessExited(KProcess *)));
+ m_lilyTempFileMap[proc] = file;
+ proc->start(KProcess::NotifyOnExit);
+}
+
+void RosegardenGUIApp::slotLilyPondViewProcessExited(KProcess *p)
+{
+ delete m_lilyTempFileMap[p];
+ m_lilyTempFileMap.erase(p);
+ delete p;
+}
+
+bool RosegardenGUIApp::exportLilyPondFile(QString file, bool forPreview)
+{
+ QString caption = "", heading = "";
+ if (forPreview) {
+ caption = i18n("LilyPond Preview Options");
+ heading = i18n("LilyPond preview options");
+ }
+
+ LilyPondOptionsDialog dialog(this, m_doc, caption, heading);
+ if (dialog.exec() != QDialog::Accepted) {
+ return false;
+ }
+
+ ProgressDialog progressDlg(i18n("Exporting LilyPond file..."),
+ 100,
+ this);
+
+ LilyPondExporter e(this, m_doc, std::string(QFile::encodeName(file)));
+
+ connect(&e, SIGNAL(setProgress(int)),
+ progressDlg.progressBar(), SLOT(setValue(int)));
+
+ connect(&e, SIGNAL(incrementProgress(int)),
+ progressDlg.progressBar(), SLOT(advance(int)));
+
+ if (!e.write()) {
+ CurrentProgressDialog::freeze();
+ KMessageBox::sorry(this, i18n("Export failed. The file could not be opened for writing."));
+ return false;
+ }
+
+ return true;
+}
+
+void RosegardenGUIApp::slotExportMusicXml()
+{
+ KTmpStatusMsg msg(i18n("Exporting MusicXML file..."), this);
+
+ QString fileName = getValidWriteFile
+ (QString("*.xml|") + i18n("XML files") +
+ "\n*|" + i18n("All files"), i18n("Export as..."));
+
+ if (fileName.isEmpty())
+ return ;
+
+ exportMusicXmlFile(fileName);
+}
+
+void RosegardenGUIApp::exportMusicXmlFile(QString file)
+{
+ ProgressDialog progressDlg(i18n("Exporting MusicXML file..."),
+ 100,
+ this);
+
+ MusicXmlExporter e(this, m_doc, std::string(QFile::encodeName(file)));
+
+ connect(&e, SIGNAL(setProgress(int)),
+ progressDlg.progressBar(), SLOT(setValue(int)));
+
+ connect(&e, SIGNAL(incrementProgress(int)),
+ progressDlg.progressBar(), SLOT(advance(int)));
+
+ if (!e.write()) {
+ CurrentProgressDialog::freeze();
+ KMessageBox::sorry(this, i18n("Export failed. The file could not be opened for writing."));
+ }
+}
+
+void
+RosegardenGUIApp::slotCloseTransport()
+{
+ m_viewTransport->setChecked(false);
+ slotToggleTransport(); // hides the transport
+}
+
+void
+RosegardenGUIApp::slotDeleteTransport()
+{
+ delete m_transport;
+ m_transport = 0;
+}
+
+void
+RosegardenGUIApp::slotActivateTool(QString toolName)
+{
+ if (toolName == SegmentSelector::ToolName) {
+ actionCollection()->action("select")->activate();
+ }
+}
+
+void
+RosegardenGUIApp::slotToggleMetronome()
+{
+ Composition &comp = m_doc->getComposition();
+
+ if (m_seqManager->getTransportStatus() == STARTING_TO_RECORD ||
+ m_seqManager->getTransportStatus() == RECORDING ||
+ m_seqManager->getTransportStatus() == RECORDING_ARMED) {
+ if (comp.useRecordMetronome())
+ comp.setRecordMetronome(false);
+ else
+ comp.setRecordMetronome(true);
+
+ getTransport()->MetronomeButton()->setOn(comp.useRecordMetronome());
+ } else {
+ if (comp.usePlayMetronome())
+ comp.setPlayMetronome(false);
+ else
+ comp.setPlayMetronome(true);
+
+ getTransport()->MetronomeButton()->setOn(comp.usePlayMetronome());
+ }
+}
+
+void
+RosegardenGUIApp::slotRewindToBeginning()
+{
+ // ignore requests if recording
+ //
+ if (m_seqManager->getTransportStatus() == RECORDING)
+ return ;
+
+ m_seqManager->rewindToBeginning();
+}
+
+void
+RosegardenGUIApp::slotFastForwardToEnd()
+{
+ // ignore requests if recording
+ //
+ if (m_seqManager->getTransportStatus() == RECORDING)
+ return ;
+
+ m_seqManager->fastForwardToEnd();
+}
+
+void
+RosegardenGUIApp::slotSetPlayPosition(timeT time)
+{
+ RG_DEBUG << "RosegardenGUIApp::slotSetPlayPosition(" << time << ")" << endl;
+ if (m_seqManager->getTransportStatus() == RECORDING)
+ return ;
+
+ m_doc->slotSetPointerPosition(time);
+
+ if (m_seqManager->getTransportStatus() == PLAYING)
+ return ;
+
+ slotPlay();
+}
+
+void RosegardenGUIApp::notifySequencerStatus(int status)
+{
+ stateChanged("not_playing",
+ (status == PLAYING ||
+ status == RECORDING) ?
+ KXMLGUIClient::StateReverse : KXMLGUIClient::StateNoReverse);
+
+ if (m_seqManager)
+ m_seqManager->setTransportStatus((TransportStatus) status);
+}
+
+void RosegardenGUIApp::processAsynchronousMidi(const MappedComposition &mC)
+{
+ if (!m_seqManager) {
+ return ; // probably getting this from a not-yet-killed runaway sequencer
+ }
+
+ m_seqManager->processAsynchronousMidi(mC, 0);
+ SequencerMapper *mapper = m_seqManager->getSequencerMapper();
+ if (mapper)
+ m_view->updateMeters(mapper);
+}
+
+void
+RosegardenGUIApp::slotRecord()
+{
+ if (!isUsingSequencer())
+ return ;
+
+ if (!isSequencerRunning()) {
+
+ // Try to launch sequencer and return if we fail
+ //
+ if (!launchSequencer(false))
+ return ;
+ }
+
+ if (m_seqManager->getTransportStatus() == RECORDING) {
+ slotStop();
+ return ;
+ } else if (m_seqManager->getTransportStatus() == PLAYING) {
+ slotToggleRecord();
+ return ;
+ }
+
+ // Attempt to start recording
+ //
+ try {
+ m_seqManager->record(false);
+ } catch (QString s) {
+ // We should already be stopped by this point so just unset
+ // the buttons after clicking the dialog.
+ //
+ KMessageBox::error(this, s);
+
+ getTransport()->MetronomeButton()->setOn(false);
+ getTransport()->RecordButton()->setOn(false);
+ getTransport()->PlayButton()->setOn(false);
+ return ;
+ } catch (AudioFileManager::BadAudioPathException e) {
+ if (KMessageBox::warningContinueCancel
+ (this,
+ i18n("The audio file path does not exist or is not writable.\nPlease set the audio file path to a valid directory in Document Properties before recording audio.\nWould you like to set it now?"),
+ i18n("Warning"),
+ i18n("Set audio file path")) == KMessageBox::Continue) {
+ slotOpenAudioPathSettings();
+ }
+ getTransport()->MetronomeButton()->setOn(false);
+ getTransport()->RecordButton()->setOn(false);
+ getTransport()->PlayButton()->setOn(false);
+ return ;
+ } catch (Exception e) {
+ KMessageBox::error(this, strtoqstr(e.getMessage()));
+
+ getTransport()->MetronomeButton()->setOn(false);
+ getTransport()->RecordButton()->setOn(false);
+ getTransport()->PlayButton()->setOn(false);
+ return ;
+ }
+
+ // plugin the keyboard accelerators for focus on this dialog
+ plugAccelerators(m_seqManager->getCountdownDialog(),
+ m_seqManager->getCountdownDialog()->getAccelerators());
+
+ connect(m_seqManager->getCountdownDialog(), SIGNAL(stopped()),
+ this, SLOT(slotStop()));
+
+ // Start the playback timer - this fetches the current sequencer position &c
+ //
+ m_stopTimer->stop();
+ m_playTimer->start(23); // avoid multiples of 10 just so as
+ // to avoid always having the same digit
+ // in one place on the transport. How
+ // shallow.)
+}
+
+void
+RosegardenGUIApp::slotToggleRecord()
+{
+ if (!isUsingSequencer() ||
+ (!isSequencerRunning() && !launchSequencer(false)))
+ return ;
+
+ try {
+ m_seqManager->record(true);
+ } catch (QString s) {
+ KMessageBox::error(this, s);
+ } catch (AudioFileManager::BadAudioPathException e) {
+ if (KMessageBox::warningContinueCancel
+ (this,
+ i18n("The audio file path does not exist or is not writable.\nPlease set the audio file path to a valid directory in Document Properties before you start to record audio.\nWould you like to set it now?"),
+ i18n("Error"),
+ i18n("Set audio file path")) == KMessageBox::Continue) {
+ slotOpenAudioPathSettings();
+ }
+ } catch (Exception e) {
+ KMessageBox::error(this, strtoqstr(e.getMessage()));
+ }
+
+}
+
+void
+RosegardenGUIApp::slotSetLoop(timeT lhs, timeT rhs)
+{
+ try {
+ m_doc->slotDocumentModified();
+
+ m_seqManager->setLoop(lhs, rhs);
+
+ // toggle the loop button
+ if (lhs != rhs) {
+ getTransport()->LoopButton()->setOn(true);
+ stateChanged("have_range", KXMLGUIClient::StateNoReverse);
+ } else {
+ getTransport()->LoopButton()->setOn(false);
+ stateChanged("have_range", KXMLGUIClient::StateReverse);
+ }
+ } catch (QString s) {
+ KMessageBox::error(this, s);
+ }
+}
+
+void RosegardenGUIApp::alive()
+{
+ if (m_doc)
+ m_doc->syncDevices();
+
+ if (m_doc && m_doc->getStudio().haveMidiDevices()) {
+ stateChanged("got_midi_devices");
+ } else {
+ stateChanged("got_midi_devices", KXMLGUIClient::StateReverse);
+ }
+}
+
+void RosegardenGUIApp::slotPlay()
+{
+ if (!isUsingSequencer())
+ return ;
+
+ if (!isSequencerRunning()) {
+
+ // Try to launch sequencer and return if it fails
+ //
+ if (!launchSequencer(false))
+ return ;
+ }
+
+ if (!m_seqManager)
+ return ;
+
+ // If we're armed and ready to record then do this instead (calling
+ // slotRecord ensures we don't toggle the recording state in
+ // SequenceManager)
+ //
+ if (m_seqManager->getTransportStatus() == RECORDING_ARMED) {
+ slotRecord();
+ return ;
+ }
+
+ // Send the controllers at start of playback if required
+ //
+ KConfig *config = kapp->config();
+ config->setGroup(SequencerOptionsConfigGroup);
+ bool sendControllers = config->readBoolEntry("alwayssendcontrollers", false);
+
+ if (sendControllers)
+ m_doc->initialiseControllers();
+
+ bool pausedPlayback = false;
+
+ try {
+ pausedPlayback = m_seqManager->play(); // this will stop playback (pause) if it's already running
+ // Check the new state of the transport and start or stop timer
+ // accordingly
+ //
+ if (!pausedPlayback) {
+
+ // Start the playback timer - this fetches the current sequencer position &c
+ //
+ m_stopTimer->stop();
+ m_playTimer->start(23);
+ } else {
+ m_playTimer->stop();
+ m_stopTimer->start(100);
+ }
+ } catch (QString s) {
+ KMessageBox::error(this, s);
+ m_playTimer->stop();
+ m_stopTimer->start(100);
+ } catch (Exception e) {
+ KMessageBox::error(this, e.getMessage());
+ m_playTimer->stop();
+ m_stopTimer->start(100);
+ }
+
+}
+
+void RosegardenGUIApp::slotJumpToTime(int sec, int usec)
+{
+ Composition *comp = &m_doc->getComposition();
+ timeT t = comp->getElapsedTimeForRealTime
+ (RealTime(sec, usec * 1000));
+ m_doc->slotSetPointerPosition(t);
+}
+
+void RosegardenGUIApp::slotStartAtTime(int sec, int usec)
+{
+ slotJumpToTime(sec, usec);
+ slotPlay();
+}
+
+void RosegardenGUIApp::slotStop()
+{
+ if (m_seqManager &&
+ m_seqManager->getCountdownDialog()) {
+ disconnect(m_seqManager->getCountdownDialog(), SIGNAL(stopped()),
+ this, SLOT(slotStop()));
+ disconnect(m_seqManager->getCountdownDialog(), SIGNAL(completed()),
+ this, SLOT(slotStop()));
+ }
+
+ try {
+ if (m_seqManager)
+ m_seqManager->stopping();
+ } catch (Exception e) {
+ KMessageBox::error(this, strtoqstr(e.getMessage()));
+ }
+
+ // stop the playback timer
+ m_playTimer->stop();
+ m_stopTimer->start(100);
+}
+
+void RosegardenGUIApp::slotRewind()
+{
+ // ignore requests if recording
+ //
+ if (m_seqManager->getTransportStatus() == RECORDING)
+ return ;
+ if (m_seqManager)
+ m_seqManager->rewind();
+}
+
+void RosegardenGUIApp::slotFastforward()
+{
+ // ignore requests if recording
+ //
+ if (m_seqManager->getTransportStatus() == RECORDING)
+ return ;
+
+ if (m_seqManager)
+ m_seqManager->fastforward();
+}
+
+void
+RosegardenGUIApp::slotSetLoop()
+{
+ // restore loop
+ m_doc->setLoop(m_storedLoopStart, m_storedLoopEnd);
+}
+
+void
+RosegardenGUIApp::slotUnsetLoop()
+{
+ Composition &comp = m_doc->getComposition();
+
+ // store the loop
+ m_storedLoopStart = comp.getLoopStart();
+ m_storedLoopEnd = comp.getLoopEnd();
+
+ // clear the loop at the composition and propagate to the rest
+ // of the display items
+ m_doc->setLoop(0, 0);
+}
+
+void
+RosegardenGUIApp::slotSetLoopStart()
+{
+ // Check so that start time is before endtime, othervise move upp the
+ // endtime to that same pos.
+ if ( m_doc->getComposition().getPosition() < m_doc->getComposition().getLoopEnd() ) {
+ m_doc->setLoop(m_doc->getComposition().getPosition(), m_doc->getComposition().getLoopEnd());
+ } else {
+ m_doc->setLoop(m_doc->getComposition().getPosition(), m_doc->getComposition().getPosition());
+ }
+}
+
+void
+RosegardenGUIApp::slotSetLoopStop()
+{
+ // Check so that end time is after start time, othervise move upp the
+ // start time to that same pos.
+ if ( m_doc->getComposition().getLoopStart() < m_doc->getComposition().getPosition() ) {
+ m_doc->setLoop(m_doc->getComposition().getLoopStart(), m_doc->getComposition().getPosition());
+ } else {
+ m_doc->setLoop(m_doc->getComposition().getPosition(), m_doc->getComposition().getPosition());
+ }
+}
+
+void RosegardenGUIApp::slotToggleSolo(bool value)
+{
+ RG_DEBUG << "RosegardenGUIApp::slotToggleSolo value = " << value << endl;
+
+ m_doc->getComposition().setSolo(value);
+ getTransport()->SoloButton()->setOn(value);
+
+ m_doc->slotDocumentModified();
+
+ emit compositionStateUpdate();
+}
+
+void RosegardenGUIApp::slotTrackUp()
+{
+ Composition &comp = m_doc->getComposition();
+
+ TrackId tid = comp.getSelectedTrack();
+ TrackId pos = comp.getTrackById(tid)->getPosition();
+
+ // If at top already
+ if (pos == 0)
+ return ;
+
+ Track *track = comp.getTrackByPosition(pos - 1);
+
+ // If the track exists
+ if (track) {
+ comp.setSelectedTrack(track->getId());
+ m_view->slotSelectTrackSegments(comp.getSelectedTrack());
+ }
+
+}
+
+void RosegardenGUIApp::slotTrackDown()
+{
+ Composition &comp = m_doc->getComposition();
+
+ TrackId tid = comp.getSelectedTrack();
+ TrackId pos = comp.getTrackById(tid)->getPosition();
+
+ Track *track = comp.getTrackByPosition(pos + 1);
+
+ // If the track exists
+ if (track) {
+ comp.setSelectedTrack(track->getId());
+ m_view->slotSelectTrackSegments(comp.getSelectedTrack());
+ }
+
+}
+
+void RosegardenGUIApp::slotMuteAllTracks()
+{
+ RG_DEBUG << "RosegardenGUIApp::slotMuteAllTracks" << endl;
+
+ Composition &comp = m_doc->getComposition();
+
+ Composition::trackcontainer tracks = comp.getTracks();
+ Composition::trackiterator tit;
+ for (tit = tracks.begin(); tit != tracks.end(); ++tit)
+ m_view->slotSetMute((*tit).second->getInstrument(), true);
+}
+
+void RosegardenGUIApp::slotUnmuteAllTracks()
+{
+ RG_DEBUG << "RosegardenGUIApp::slotUnmuteAllTracks" << endl;
+
+ Composition &comp = m_doc->getComposition();
+
+ Composition::trackcontainer tracks = comp.getTracks();
+ Composition::trackiterator tit;
+ for (tit = tracks.begin(); tit != tracks.end(); ++tit)
+ m_view->slotSetMute((*tit).second->getInstrument(), false);
+}
+
+void RosegardenGUIApp::slotToggleMutedCurrentTrack()
+{
+ Composition &comp = m_doc->getComposition();
+ TrackId tid = comp.getSelectedTrack();
+ Track *track = comp.getTrackById(tid);
+ // If the track exists
+ if (track) {
+ bool isMuted = track->isMuted();
+ m_view->slotSetMuteButton(tid, !isMuted);
+ }
+}
+
+void RosegardenGUIApp::slotToggleRecordCurrentTrack()
+{
+ Composition &comp = m_doc->getComposition();
+ TrackId tid = comp.getSelectedTrack();
+ int pos = comp.getTrackPositionById(tid);
+ m_view->getTrackEditor()->getTrackButtons()->slotToggleRecordTrack(pos);
+}
+
+
+void RosegardenGUIApp::slotConfigure()
+{
+ RG_DEBUG << "RosegardenGUIApp::slotConfigure\n";
+
+ ConfigureDialog *configDlg =
+ new ConfigureDialog(m_doc, kapp->config(), this);
+
+ connect(configDlg, SIGNAL(updateAutoSaveInterval(unsigned int)),
+ this, SLOT(slotUpdateAutoSaveInterval(unsigned int)));
+ connect(configDlg, SIGNAL(updateSidebarStyle(unsigned int)),
+ this, SLOT(slotUpdateSidebarStyle(unsigned int)));
+
+ configDlg->show();
+}
+
+void RosegardenGUIApp::slotEditDocumentProperties()
+{
+ RG_DEBUG << "RosegardenGUIApp::slotEditDocumentProperties\n";
+
+ DocumentConfigureDialog *configDlg =
+ new DocumentConfigureDialog(m_doc, this);
+
+ configDlg->show();
+}
+
+void RosegardenGUIApp::slotOpenAudioPathSettings()
+{
+ RG_DEBUG << "RosegardenGUIApp::slotOpenAudioPathSettings\n";
+
+ DocumentConfigureDialog *configDlg =
+ new DocumentConfigureDialog(m_doc, this);
+
+ configDlg->showAudioPage();
+ configDlg->show();
+}
+
+void RosegardenGUIApp::slotEditKeys()
+{
+ KKeyDialog::configure(actionCollection());
+}
+
+void RosegardenGUIApp::slotEditToolbars()
+{
+ KEditToolbar dlg(actionCollection(), "rosegardenui.rc");
+
+ connect(&dlg, SIGNAL(newToolbarConfig()),
+ SLOT(slotUpdateToolbars()));
+
+ dlg.exec();
+}
+
+void RosegardenGUIApp::slotUpdateToolbars()
+{
+ createGUI("rosegardenui.rc");
+ m_viewToolBar->setChecked(!toolBar()->isHidden());
+}
+
+void RosegardenGUIApp::slotEditTempo()
+{
+ slotEditTempo(this);
+}
+
+void RosegardenGUIApp::slotEditTempo(timeT atTime)
+{
+ slotEditTempo(this, atTime);
+}
+
+void RosegardenGUIApp::slotEditTempo(QWidget *parent)
+{
+ slotEditTempo(parent, m_doc->getComposition().getPosition());
+}
+
+void RosegardenGUIApp::slotEditTempo(QWidget *parent, timeT atTime)
+{
+ RG_DEBUG << "RosegardenGUIApp::slotEditTempo\n";
+
+ TempoDialog tempoDialog(parent, m_doc);
+
+ connect(&tempoDialog,
+ SIGNAL(changeTempo(timeT,
+ tempoT,
+ tempoT,
+ TempoDialog::TempoDialogAction)),
+ SLOT(slotChangeTempo(timeT,
+ tempoT,
+ tempoT,
+ TempoDialog::TempoDialogAction)));
+
+ tempoDialog.setTempoPosition(atTime);
+ tempoDialog.exec();
+}
+
+void RosegardenGUIApp::slotEditTimeSignature()
+{
+ slotEditTimeSignature(this);
+}
+
+void RosegardenGUIApp::slotEditTimeSignature(timeT atTime)
+{
+ slotEditTimeSignature(this, atTime);
+}
+
+void RosegardenGUIApp::slotEditTimeSignature(QWidget *parent)
+{
+ slotEditTimeSignature(parent, m_doc->getComposition().getPosition());
+}
+
+void RosegardenGUIApp::slotEditTimeSignature(QWidget *parent,
+ timeT time)
+{
+ Composition &composition(m_doc->getComposition());
+
+ TimeSignature sig = composition.getTimeSignatureAt(time);
+
+ TimeSignatureDialog dialog(parent, &composition, time, sig);
+
+ if (dialog.exec() == QDialog::Accepted) {
+
+ time = dialog.getTime();
+
+ if (dialog.shouldNormalizeRests()) {
+ m_doc->getCommandHistory()->addCommand
+ (new AddTimeSignatureAndNormalizeCommand
+ (&composition, time, dialog.getTimeSignature()));
+ } else {
+ m_doc->getCommandHistory()->addCommand
+ (new AddTimeSignatureCommand
+ (&composition, time, dialog.getTimeSignature()));
+ }
+ }
+}
+
+void RosegardenGUIApp::slotEditTransportTime()
+{
+ slotEditTransportTime(this);
+}
+
+void RosegardenGUIApp::slotEditTransportTime(QWidget *parent)
+{
+ TimeDialog dialog(parent, i18n("Move playback pointer to time"),
+ &m_doc->getComposition(),
+ m_doc->getComposition().getPosition(),
+ true);
+ if (dialog.exec() == QDialog::Accepted) {
+ m_doc->slotSetPointerPosition(dialog.getTime());
+ }
+}
+
+void RosegardenGUIApp::slotChangeZoom(int)
+{
+ double duration44 = TimeSignature(4, 4).getBarDuration();
+ double value = double(m_zoomSlider->getCurrentSize());
+ m_zoomLabel->setText(i18n("%1%").arg(duration44 / value));
+
+ RG_DEBUG << "RosegardenGUIApp::slotChangeZoom : zoom size = "
+ << m_zoomSlider->getCurrentSize() << endl;
+
+ // initZoomToolbar sets the zoom value. With some old versions of
+ // Qt3.0, this can cause slotChangeZoom() to be called while the
+ // view hasn't been initialized yet, so we need to check it's not
+ // null
+ //
+ if (m_view)
+ m_view->setZoomSize(m_zoomSlider->getCurrentSize());
+
+ long newZoom = int(m_zoomSlider->getCurrentSize() * 1000.0);
+
+ if (m_doc->getConfiguration().get<Int>
+ (DocumentConfiguration::ZoomLevel) != newZoom) {
+
+ m_doc->getConfiguration().set<Int>
+ (DocumentConfiguration::ZoomLevel, newZoom);
+
+ m_doc->slotDocumentModified();
+ }
+}
+
+void
+RosegardenGUIApp::slotZoomIn()
+{
+ m_zoomSlider->increment();
+}
+
+void
+RosegardenGUIApp::slotZoomOut()
+{
+ m_zoomSlider->decrement();
+}
+
+void
+RosegardenGUIApp::slotChangeTempo(timeT time,
+ tempoT value,
+ tempoT target,
+ TempoDialog::TempoDialogAction action)
+{
+ //!!! handle target
+
+ Composition &comp = m_doc->getComposition();
+
+ // We define a macro command here and build up the command
+ // label as we add commands on.
+ //
+ if (action == TempoDialog::AddTempo) {
+ m_doc->getCommandHistory()->addCommand
+ (new AddTempoChangeCommand(&comp, time, value, target));
+ } else if (action == TempoDialog::ReplaceTempo) {
+ int index = comp.getTempoChangeNumberAt(time);
+
+ // if there's no previous tempo change then just set globally
+ //
+ if (index == -1) {
+ m_doc->getCommandHistory()->addCommand
+ (new AddTempoChangeCommand(&comp, 0, value, target));
+ return ;
+ }
+
+ // get time of previous tempo change
+ timeT prevTime = comp.getTempoChange(index).first;
+
+ KMacroCommand *macro =
+ new KMacroCommand(i18n("Replace Tempo Change at %1").arg(time));
+
+ macro->addCommand(new RemoveTempoChangeCommand(&comp, index));
+ macro->addCommand(new AddTempoChangeCommand(&comp, prevTime, value,
+ target));
+
+ m_doc->getCommandHistory()->addCommand(macro);
+
+ } else if (action == TempoDialog::AddTempoAtBarStart) {
+ m_doc->getCommandHistory()->addCommand(new
+ AddTempoChangeCommand(&comp, comp.getBarStartForTime(time),
+ value, target));
+ } else if (action == TempoDialog::GlobalTempo ||
+ action == TempoDialog::GlobalTempoWithDefault) {
+ KMacroCommand *macro = new KMacroCommand(i18n("Set Global Tempo"));
+
+ // Remove all tempo changes in reverse order so as the index numbers
+ // don't becoming meaningless as the command gets unwound.
+ //
+ for (int i = 0; i < comp.getTempoChangeCount(); i++)
+ macro->addCommand(new RemoveTempoChangeCommand(&comp,
+ (comp.getTempoChangeCount() - 1 - i)));
+
+ // add tempo change at time zero
+ //
+ macro->addCommand(new AddTempoChangeCommand(&comp, 0, value, target));
+
+ // are we setting default too?
+ //
+ if (action == TempoDialog::GlobalTempoWithDefault) {
+ macro->setName(i18n("Set Global and Default Tempo"));
+ macro->addCommand(new ModifyDefaultTempoCommand(&comp, value));
+ }
+
+ m_doc->getCommandHistory()->addCommand(macro);
+
+ } else {
+ RG_DEBUG << "RosegardenGUIApp::slotChangeTempo() - "
+ << "unrecognised tempo command" << endl;
+ }
+}
+
+void
+RosegardenGUIApp::slotMoveTempo(timeT oldTime,
+ timeT newTime)
+{
+ Composition &comp = m_doc->getComposition();
+ int index = comp.getTempoChangeNumberAt(oldTime);
+
+ if (index < 0)
+ return ;
+
+ KMacroCommand *macro =
+ new KMacroCommand(i18n("Move Tempo Change"));
+
+ std::pair<timeT, tempoT> tc =
+ comp.getTempoChange(index);
+ std::pair<bool, tempoT> tr =
+ comp.getTempoRamping(index, false);
+
+ macro->addCommand(new RemoveTempoChangeCommand(&comp, index));
+ macro->addCommand(new AddTempoChangeCommand(&comp,
+ newTime,
+ tc.second,
+ tr.first ? tr.second : -1));
+
+ m_doc->getCommandHistory()->addCommand(macro);
+}
+
+void
+RosegardenGUIApp::slotDeleteTempo(timeT t)
+{
+ Composition &comp = m_doc->getComposition();
+ int index = comp.getTempoChangeNumberAt(t);
+
+ if (index < 0)
+ return ;
+
+ m_doc->getCommandHistory()->addCommand(new RemoveTempoChangeCommand
+ (&comp, index));
+}
+
+void
+RosegardenGUIApp::slotAddMarker(timeT time)
+{
+ AddMarkerCommand *command =
+ new AddMarkerCommand(&m_doc->getComposition(),
+ time,
+ i18n("new marker"),
+ i18n("no description"));
+
+ m_doc->getCommandHistory()->addCommand(command);
+}
+
+void
+RosegardenGUIApp::slotDeleteMarker(int id, timeT time, QString name, QString description)
+{
+ RemoveMarkerCommand *command =
+ new RemoveMarkerCommand(&m_doc->getComposition(),
+ id,
+ time,
+ qstrtostr(name),
+ qstrtostr(description));
+
+ m_doc->getCommandHistory()->addCommand(command);
+}
+
+void
+RosegardenGUIApp::slotDocumentModified(bool m)
+{
+ RG_DEBUG << "RosegardenGUIApp::slotDocumentModified(" << m << ") - doc path = "
+ << m_doc->getAbsFilePath() << endl;
+
+ if (!m_doc->getAbsFilePath().isEmpty()) {
+ slotStateChanged("saved_file_modified", m);
+ } else {
+ slotStateChanged("new_file_modified", m);
+ }
+
+}
+
+void
+RosegardenGUIApp::slotStateChanged(QString s,
+ bool noReverse)
+{
+ // RG_DEBUG << "RosegardenGUIApp::slotStateChanged " << s << "," << noReverse << endl;
+
+ stateChanged(s, noReverse ? KXMLGUIClient::StateNoReverse : KXMLGUIClient::StateReverse);
+}
+
+void
+RosegardenGUIApp::slotTestClipboard()
+{
+ if (m_clipboard->isEmpty()) {
+ stateChanged("have_clipboard", KXMLGUIClient::StateReverse);
+ stateChanged("have_clipboard_single_segment",
+ KXMLGUIClient::StateReverse);
+ } else {
+ stateChanged("have_clipboard", KXMLGUIClient::StateNoReverse);
+ stateChanged("have_clipboard_single_segment",
+ (m_clipboard->isSingleSegment() ?
+ KXMLGUIClient::StateNoReverse :
+ KXMLGUIClient::StateReverse));
+ }
+}
+
+void
+RosegardenGUIApp::plugAccelerators(QWidget *widget, QAccel *acc)
+{
+
+ acc->connectItem(acc->insertItem(Key_Enter),
+ this,
+ SLOT(slotPlay()));
+ // Alternative shortcut for Play
+ acc->connectItem(acc->insertItem(Key_Return + CTRL),
+ this,
+ SLOT(slotPlay()));
+
+ acc->connectItem(acc->insertItem(Key_Insert),
+ this,
+ SLOT(slotStop()));
+
+ acc->connectItem(acc->insertItem(Key_PageDown),
+ this,
+ SLOT(slotFastforward()));
+
+ acc->connectItem(acc->insertItem(Key_End),
+ this,
+ SLOT(slotRewind()));
+
+ acc->connectItem(acc->insertItem(Key_Space),
+ this,
+ SLOT(slotToggleRecord()));
+
+ TransportDialog *transport =
+ dynamic_cast<TransportDialog*>(widget);
+
+ if (transport) {
+ acc->connectItem(acc->insertItem(m_jumpToQuickMarkerAction->shortcut()),
+ this,
+ SLOT(slotJumpToQuickMarker()));
+
+ acc->connectItem(acc->insertItem(m_setQuickMarkerAction->shortcut()),
+ this,
+ SLOT(slotSetQuickMarker()));
+
+ connect(transport->PlayButton(),
+ SIGNAL(clicked()),
+ this,
+ SLOT(slotPlay()));
+
+ connect(transport->StopButton(),
+ SIGNAL(clicked()),
+ this,
+ SLOT(slotStop()));
+
+ connect(transport->FfwdButton(),
+ SIGNAL(clicked()),
+ SLOT(slotFastforward()));
+
+ connect(transport->RewindButton(),
+ SIGNAL(clicked()),
+ this,
+ SLOT(slotRewind()));
+
+ connect(transport->RecordButton(),
+ SIGNAL(clicked()),
+ this,
+ SLOT(slotRecord()));
+
+ connect(transport->RewindEndButton(),
+ SIGNAL(clicked()),
+ this,
+ SLOT(slotRewindToBeginning()));
+
+ connect(transport->FfwdEndButton(),
+ SIGNAL(clicked()),
+ this,
+ SLOT(slotFastForwardToEnd()));
+
+ connect(transport->MetronomeButton(),
+ SIGNAL(clicked()),
+ this,
+ SLOT(slotToggleMetronome()));
+
+ connect(transport->SoloButton(),
+ SIGNAL(toggled(bool)),
+ this,
+ SLOT(slotToggleSolo(bool)));
+
+ connect(transport->TimeDisplayButton(),
+ SIGNAL(clicked()),
+ this,
+ SLOT(slotRefreshTimeDisplay()));
+
+ connect(transport->ToEndButton(),
+ SIGNAL(clicked()),
+ SLOT(slotRefreshTimeDisplay()));
+ }
+}
+
+void
+RosegardenGUIApp::setCursor(const QCursor& cursor)
+{
+ KDockMainWindow::setCursor(cursor);
+
+ // play it safe, so we can use this class at anytime even very early in the app init
+ if ((getView() &&
+ getView()->getTrackEditor() &&
+ getView()->getTrackEditor()->getSegmentCanvas() &&
+ getView()->getTrackEditor()->getSegmentCanvas()->viewport())) {
+
+ getView()->getTrackEditor()->getSegmentCanvas()->viewport()->setCursor(cursor);
+ }
+
+ // view, main window...
+ //
+ getView()->setCursor(cursor);
+
+ // toolbars...
+ //
+ QPtrListIterator<KToolBar> tbIter = toolBarIterator();
+ KToolBar* tb = 0;
+ while ((tb = tbIter.current()) != 0) {
+ tb->setCursor(cursor);
+ ++tbIter;
+ }
+
+ m_dockLeft->setCursor(cursor);
+}
+
+QString
+RosegardenGUIApp::createNewAudioFile()
+{
+ AudioFile *aF = 0;
+ try {
+ aF = m_doc->getAudioFileManager().createRecordingAudioFile();
+ if (!aF) {
+ // createRecordingAudioFile doesn't actually write to the disk,
+ // and in principle it shouldn't fail
+ std::cerr << "ERROR: RosegardenGUIApp::createNewAudioFile: Failed to create recording audio file" << std::endl;
+ return "";
+ } else {
+ return aF->getFilename().c_str();
+ }
+ } catch (AudioFileManager::BadAudioPathException e) {
+ delete aF;
+ std::cerr << "ERROR: RosegardenGUIApp::createNewAudioFile: Failed to create recording audio file: " << e.getMessage() << std::endl;
+ return "";
+ }
+}
+
+QValueVector<QString>
+RosegardenGUIApp::createRecordAudioFiles(const QValueVector<InstrumentId> &recordInstruments)
+{
+ QValueVector<QString> qv;
+ for (unsigned int i = 0; i < recordInstruments.size(); ++i) {
+ AudioFile *aF = 0;
+ try {
+ aF = m_doc->getAudioFileManager().createRecordingAudioFile();
+ if (aF) {
+ // createRecordingAudioFile doesn't actually write to the disk,
+ // and in principle it shouldn't fail
+ qv.push_back(aF->getFilename().c_str());
+ m_doc->addRecordAudioSegment(recordInstruments[i],
+ aF->getId());
+ } else {
+ std::cerr << "ERROR: RosegardenGUIApp::createRecordAudioFiles: Failed to create recording audio file" << std::endl;
+ return qv;
+ }
+ } catch (AudioFileManager::BadAudioPathException e) {
+ delete aF;
+ std::cerr << "ERROR: RosegardenGUIApp::createRecordAudioFiles: Failed to create recording audio file: " << e.getMessage() << std::endl;
+ return qv;
+ }
+ }
+ return qv;
+}
+
+QString
+RosegardenGUIApp::getAudioFilePath()
+{
+ return QString(m_doc->getAudioFileManager().getAudioPath().c_str());
+}
+
+QValueVector<InstrumentId>
+RosegardenGUIApp::getArmedInstruments()
+{
+ std::set
+ <InstrumentId> iid;
+
+ const Composition::recordtrackcontainer &tr =
+ m_doc->getComposition().getRecordTracks();
+
+ for (Composition::recordtrackcontainer::const_iterator i =
+ tr.begin(); i != tr.end(); ++i) {
+ TrackId tid = (*i);
+ Track *track = m_doc->getComposition().getTrackById(tid);
+ if (track) {
+ iid.insert(track->getInstrument());
+ } else {
+ std::cerr << "Warning: RosegardenGUIApp::getArmedInstruments: Armed track " << tid << " not found in Composition" << std::endl;
+ }
+ }
+
+ QValueVector<InstrumentId> iv;
+ for (std::set
+ <InstrumentId>::iterator ii = iid.begin();
+ ii != iid.end(); ++ii) {
+ iv.push_back(*ii);
+ }
+ return iv;
+}
+
+void
+RosegardenGUIApp::showError(QString error)
+{
+ KStartupLogo::hideIfStillThere();
+ CurrentProgressDialog::freeze();
+
+ // This is principally used for return values from DSSI plugin
+ // configure() calls. It seems some plugins return a string
+ // telling you when everything's OK, as well as error strings, but
+ // dssi.h does make it reasonably clear that configure() should
+ // only return a string when there is actually a problem, so we're
+ // going to stick with a sorry dialog here rather than an
+ // information one
+
+ KMessageBox::sorry(0, error);
+
+ CurrentProgressDialog::thaw();
+}
+
+void
+RosegardenGUIApp::slotAudioManager()
+{
+ if (m_audioManagerDialog) {
+ m_audioManagerDialog->show();
+ m_audioManagerDialog->raise();
+ m_audioManagerDialog->setActiveWindow();
+ return ;
+ }
+
+ m_audioManagerDialog =
+ new AudioManagerDialog(this, m_doc);
+
+ connect(m_audioManagerDialog,
+ SIGNAL(playAudioFile(AudioFileId,
+ const RealTime &,
+ const RealTime&)),
+ SLOT(slotPlayAudioFile(AudioFileId,
+ const RealTime &,
+ const RealTime &)));
+
+ connect(m_audioManagerDialog,
+ SIGNAL(addAudioFile(AudioFileId)),
+ SLOT(slotAddAudioFile(AudioFileId)));
+
+ connect(m_audioManagerDialog,
+ SIGNAL(deleteAudioFile(AudioFileId)),
+ SLOT(slotDeleteAudioFile(AudioFileId)));
+
+ //
+ // Sync segment selection between audio man. dialog and main window
+ //
+
+ // from dialog to us...
+ connect(m_audioManagerDialog,
+ SIGNAL(segmentsSelected(const SegmentSelection&)),
+ m_view,
+ SLOT(slotPropagateSegmentSelection(const SegmentSelection&)));
+
+ // and from us to dialog
+ connect(this, SIGNAL(segmentsSelected(const SegmentSelection&)),
+ m_audioManagerDialog,
+ SLOT(slotSegmentSelection(const SegmentSelection&)));
+
+
+ connect(m_audioManagerDialog,
+ SIGNAL(deleteSegments(const SegmentSelection&)),
+ SLOT(slotDeleteSegments(const SegmentSelection&)));
+
+ connect(m_audioManagerDialog,
+ SIGNAL(insertAudioSegment(AudioFileId,
+ const RealTime&,
+ const RealTime&)),
+ m_view,
+ SLOT(slotAddAudioSegmentDefaultPosition(AudioFileId,
+ const RealTime&,
+ const RealTime&)));
+ connect(m_audioManagerDialog,
+ SIGNAL(cancelPlayingAudioFile(AudioFileId)),
+ SLOT(slotCancelAudioPlayingFile(AudioFileId)));
+
+ connect(m_audioManagerDialog,
+ SIGNAL(deleteAllAudioFiles()),
+ SLOT(slotDeleteAllAudioFiles()));
+
+ // Make sure we know when the audio man. dialog is closing
+ //
+ connect(m_audioManagerDialog,
+ SIGNAL(closing()),
+ SLOT(slotAudioManagerClosed()));
+
+ // And that it goes away when the current document is changing
+ //
+ connect(this, SIGNAL(documentAboutToChange()),
+ m_audioManagerDialog, SLOT(close()));
+
+ m_audioManagerDialog->setAudioSubsystemStatus(
+ m_seqManager->getSoundDriverStatus() & AUDIO_OK);
+
+ plugAccelerators(m_audioManagerDialog,
+ m_audioManagerDialog->getAccelerators());
+
+ m_audioManagerDialog->show();
+}
+
+void
+RosegardenGUIApp::slotPlayAudioFile(unsigned int id,
+ const RealTime &startTime,
+ const RealTime &duration)
+{
+ AudioFile *aF = m_doc->getAudioFileManager().getAudioFile(id);
+
+ if (aF == 0)
+ return ;
+
+ MappedEvent mE(m_doc->getStudio().
+ getAudioPreviewInstrument(),
+ id,
+ RealTime( -120, 0),
+ duration, // duration
+ startTime); // start index
+
+ StudioControl::sendMappedEvent(mE);
+
+}
+
+void
+RosegardenGUIApp::slotAddAudioFile(unsigned int id)
+{
+ AudioFile *aF = m_doc->getAudioFileManager().getAudioFile(id);
+
+ if (aF == 0)
+ return ;
+
+ QCString replyType;
+ QByteArray replyData;
+ QByteArray data;
+ QDataStream streamOut(data, IO_WriteOnly);
+
+ // We have to pass the filename as a QString
+ //
+ streamOut << QString(strtoqstr(aF->getFilename()));
+ streamOut << (int)aF->getId();
+
+ if (rgapp->sequencerCall("addAudioFile(QString, int)", replyType, replyData, data)) {
+ QDataStream streamIn(replyData, IO_ReadOnly);
+ int result;
+ streamIn >> result;
+ if (!result) {
+ KMessageBox::error(this, i18n("Sequencer failed to add audio file %1").arg(aF->getFilename().c_str()));
+ }
+ }
+}
+
+void
+RosegardenGUIApp::slotDeleteAudioFile(unsigned int id)
+{
+ if (m_doc->getAudioFileManager().removeFile(id) == false)
+ return ;
+
+ QCString replyType;
+ QByteArray replyData;
+ QByteArray data;
+ QDataStream streamOut(data, IO_WriteOnly);
+
+ // file id
+ //
+ streamOut << (int)id;
+
+ if (rgapp->sequencerCall("removeAudioFile(int)", replyType, replyData, data)) {
+ QDataStream streamIn(replyData, IO_ReadOnly);
+ int result;
+ streamIn >> result;
+ if (!result) {
+ KMessageBox::error(this, i18n("Sequencer failed to remove audio file id %1").arg(id));
+ }
+ }
+}
+
+void
+RosegardenGUIApp::slotDeleteSegments(const SegmentSelection &selection)
+{
+ m_view->slotPropagateSegmentSelection(selection);
+ slotDeleteSelectedSegments();
+}
+
+void
+RosegardenGUIApp::slotCancelAudioPlayingFile(AudioFileId id)
+{
+ AudioFile *aF = m_doc->getAudioFileManager().getAudioFile(id);
+
+ if (aF == 0)
+ return ;
+
+ MappedEvent mE(m_doc->getStudio().
+ getAudioPreviewInstrument(),
+ MappedEvent::AudioCancel,
+ id);
+
+ StudioControl::sendMappedEvent(mE);
+}
+
+void
+RosegardenGUIApp::slotDeleteAllAudioFiles()
+{
+ m_doc->getAudioFileManager().clear();
+
+ // Clear at the sequencer
+ //
+ QCString replyType;
+ QByteArray replyData;
+ QByteArray data;
+
+ rgapp->sequencerCall("clearAllAudioFiles()", replyType, replyData, data);
+}
+
+void
+RosegardenGUIApp::slotRepeatingSegments()
+{
+ m_view->getTrackEditor()->slotTurnRepeatingSegmentToRealCopies();
+}
+
+void
+RosegardenGUIApp::slotRelabelSegments()
+{
+ if (!m_view->haveSelection())
+ return ;
+
+ SegmentSelection selection(m_view->getSelection());
+ QString editLabel;
+
+ if (selection.size() == 0)
+ return ;
+ else if (selection.size() == 1)
+ editLabel = i18n("Modify Segment label");
+ else
+ editLabel = i18n("Modify Segments label");
+
+ KTmpStatusMsg msg(i18n("Relabelling selection..."), this);
+
+ // Generate label
+ QString label = strtoqstr((*selection.begin())->getLabel());
+
+ for (SegmentSelection::iterator i = selection.begin();
+ i != selection.end(); ++i) {
+ if (strtoqstr((*i)->getLabel()) != label)
+ label = "";
+ }
+
+ bool ok = false;
+
+ QString newLabel = KInputDialog::getText(editLabel,
+ i18n("Enter new label"),
+ label,
+ &ok,
+ this);
+
+ if (ok) {
+ m_doc->getCommandHistory()->addCommand
+ (new SegmentLabelCommand(selection, newLabel));
+ m_view->getTrackEditor()->getSegmentCanvas()->slotUpdateSegmentsDrawBuffer();
+ }
+}
+
+void
+RosegardenGUIApp::slotTransposeSegments()
+{
+ if (!m_view->haveSelection())
+ return ;
+
+ IntervalDialog intervalDialog(this, true, true);
+ int ok = intervalDialog.exec();
+
+ int semitones = intervalDialog.getChromaticDistance();
+ int steps = intervalDialog.getDiatonicDistance();
+
+ if (!ok || (semitones == 0 && steps == 0)) return;
+
+ m_doc->getCommandHistory()->addCommand
+ (new SegmentTransposeCommand(m_view->getSelection(), intervalDialog.getChangeKey(), steps, semitones, intervalDialog.getTransposeSegmentBack()));
+}
+
+void
+RosegardenGUIApp::slotChangeCompositionLength()
+{
+ CompositionLengthDialog dialog(this, &m_doc->getComposition());
+
+ if (dialog.exec() == QDialog::Accepted) {
+ ChangeCompositionLengthCommand *command
+ = new ChangeCompositionLengthCommand(
+ &m_doc->getComposition(),
+ dialog.getStartMarker(),
+ dialog.getEndMarker());
+
+ m_view->getTrackEditor()->getSegmentCanvas()->clearSegmentRectsCache(true);
+ m_doc->getCommandHistory()->addCommand(command);
+ }
+}
+
+void
+RosegardenGUIApp::slotManageMIDIDevices()
+{
+ if (m_deviceManager) {
+ m_deviceManager->show();
+ m_deviceManager->raise();
+ m_deviceManager->setActiveWindow();
+ return ;
+ }
+
+ m_deviceManager = new DeviceManagerDialog(this, m_doc);
+
+ connect(m_deviceManager, SIGNAL(closing()),
+ this, SLOT(slotDeviceManagerClosed()));
+
+ connect(this, SIGNAL(documentAboutToChange()),
+ m_deviceManager, SLOT(close()));
+
+ // Cheating way of updating the track/instrument list
+ //
+ connect(m_deviceManager, SIGNAL(deviceNamesChanged()),
+ m_view, SLOT(slotSynchroniseWithComposition()));
+
+ connect(m_deviceManager, SIGNAL(editBanks(DeviceId)),
+ this, SLOT(slotEditBanks(DeviceId)));
+
+ connect(m_deviceManager, SIGNAL(editControllers(DeviceId)),
+ this, SLOT(slotEditControlParameters(DeviceId)));
+
+ if (m_midiMixer) {
+ connect(m_deviceManager, SIGNAL(deviceNamesChanged()),
+ m_midiMixer, SLOT(slotSynchronise()));
+
+ }
+
+
+ m_deviceManager->show();
+}
+
+void
+RosegardenGUIApp::slotManageSynths()
+{
+ if (m_synthManager) {
+ m_synthManager->show();
+ m_synthManager->raise();
+ m_synthManager->setActiveWindow();
+ return ;
+ }
+
+ m_synthManager = new SynthPluginManagerDialog(this, m_doc
+#ifdef HAVE_LIBLO
+ , m_pluginGUIManager
+#endif
+ );
+
+ connect(m_synthManager, SIGNAL(closing()),
+ this, SLOT(slotSynthPluginManagerClosed()));
+
+ connect(this, SIGNAL(documentAboutToChange()),
+ m_synthManager, SLOT(close()));
+
+ connect(m_synthManager,
+ SIGNAL(pluginSelected(InstrumentId, int, int)),
+ this,
+ SLOT(slotPluginSelected(InstrumentId, int, int)));
+
+ connect(m_synthManager,
+ SIGNAL(showPluginDialog(QWidget *, InstrumentId, int)),
+ this,
+ SLOT(slotShowPluginDialog(QWidget *, InstrumentId, int)));
+
+ connect(m_synthManager,
+ SIGNAL(showPluginGUI(InstrumentId, int)),
+ this,
+ SLOT(slotShowPluginGUI(InstrumentId, int)));
+
+ m_synthManager->show();
+}
+
+void
+RosegardenGUIApp::slotOpenAudioMixer()
+{
+ if (m_audioMixer) {
+ m_audioMixer->show();
+ m_audioMixer->raise();
+ m_audioMixer->setActiveWindow();
+ return ;
+ }
+
+ m_audioMixer = new AudioMixerWindow(this, m_doc);
+
+ connect(m_audioMixer, SIGNAL(windowActivated()),
+ m_view, SLOT(slotActiveMainWindowChanged()));
+
+ connect(m_view, SIGNAL(controllerDeviceEventReceived(MappedEvent *, const void *)),
+ m_audioMixer, SLOT(slotControllerDeviceEventReceived(MappedEvent *, const void *)));
+
+ connect(m_audioMixer, SIGNAL(closing()),
+ this, SLOT(slotAudioMixerClosed()));
+
+ connect(m_audioMixer, SIGNAL(selectPlugin(QWidget *, InstrumentId, int)),
+ this, SLOT(slotShowPluginDialog(QWidget *, InstrumentId, int)));
+
+ connect(this,
+ SIGNAL(pluginSelected(InstrumentId, int, int)),
+ m_audioMixer,
+ SLOT(slotPluginSelected(InstrumentId, int, int)));
+
+ connect(this,
+ SIGNAL(pluginBypassed(InstrumentId, int, bool)),
+ m_audioMixer,
+ SLOT(slotPluginBypassed(InstrumentId, int, bool)));
+
+ connect(this, SIGNAL(documentAboutToChange()),
+ m_audioMixer, SLOT(close()));
+
+ connect(m_view, SIGNAL(checkTrackAssignments()),
+ m_audioMixer, SLOT(slotTrackAssignmentsChanged()));
+
+ connect(m_audioMixer, SIGNAL(play()),
+ this, SLOT(slotPlay()));
+ connect(m_audioMixer, SIGNAL(stop()),
+ this, SLOT(slotStop()));
+ connect(m_audioMixer, SIGNAL(fastForwardPlayback()),
+ this, SLOT(slotFastforward()));
+ connect(m_audioMixer, SIGNAL(rewindPlayback()),
+ this, SLOT(slotRewind()));
+ connect(m_audioMixer, SIGNAL(fastForwardPlaybackToEnd()),
+ this, SLOT(slotFastForwardToEnd()));
+ connect(m_audioMixer, SIGNAL(rewindPlaybackToBeginning()),
+ this, SLOT(slotRewindToBeginning()));
+ connect(m_audioMixer, SIGNAL(record()),
+ this, SLOT(slotRecord()));
+ connect(m_audioMixer, SIGNAL(panic()),
+ this, SLOT(slotPanic()));
+
+ connect(m_audioMixer,
+ SIGNAL(instrumentParametersChanged(InstrumentId)),
+ this,
+ SIGNAL(instrumentParametersChanged(InstrumentId)));
+
+ connect(this,
+ SIGNAL(instrumentParametersChanged(InstrumentId)),
+ m_audioMixer,
+ SLOT(slotUpdateInstrument(InstrumentId)));
+
+ if (m_synthManager) {
+ connect(m_synthManager,
+ SIGNAL(pluginSelected(InstrumentId, int, int)),
+ m_audioMixer,
+ SLOT(slotPluginSelected(InstrumentId, int, int)));
+ }
+
+ plugAccelerators(m_audioMixer, m_audioMixer->getAccelerators());
+
+ m_audioMixer->show();
+}
+
+void
+RosegardenGUIApp::slotOpenMidiMixer()
+{
+ if (m_midiMixer) {
+ m_midiMixer->show();
+ m_midiMixer->raise();
+ m_midiMixer->setActiveWindow();
+ return ;
+ }
+
+ m_midiMixer = new MidiMixerWindow(this, m_doc);
+
+ connect(m_midiMixer, SIGNAL(windowActivated()),
+ m_view, SLOT(slotActiveMainWindowChanged()));
+
+ connect(m_view, SIGNAL(controllerDeviceEventReceived(MappedEvent *, const void *)),
+ m_midiMixer, SLOT(slotControllerDeviceEventReceived(MappedEvent *, const void *)));
+
+ connect(m_midiMixer, SIGNAL(closing()),
+ this, SLOT(slotMidiMixerClosed()));
+
+ connect(this, SIGNAL(documentAboutToChange()),
+ m_midiMixer, SLOT(close()));
+
+ connect(m_midiMixer, SIGNAL(play()),
+ this, SLOT(slotPlay()));
+ connect(m_midiMixer, SIGNAL(stop()),
+ this, SLOT(slotStop()));
+ connect(m_midiMixer, SIGNAL(fastForwardPlayback()),
+ this, SLOT(slotFastforward()));
+ connect(m_midiMixer, SIGNAL(rewindPlayback()),
+ this, SLOT(slotRewind()));
+ connect(m_midiMixer, SIGNAL(fastForwardPlaybackToEnd()),
+ this, SLOT(slotFastForwardToEnd()));
+ connect(m_midiMixer, SIGNAL(rewindPlaybackToBeginning()),
+ this, SLOT(slotRewindToBeginning()));
+ connect(m_midiMixer, SIGNAL(record()),
+ this, SLOT(slotRecord()));
+ connect(m_midiMixer, SIGNAL(panic()),
+ this, SLOT(slotPanic()));
+
+ connect(m_midiMixer,
+ SIGNAL(instrumentParametersChanged(InstrumentId)),
+ this,
+ SIGNAL(instrumentParametersChanged(InstrumentId)));
+
+ connect(this,
+ SIGNAL(instrumentParametersChanged(InstrumentId)),
+ m_midiMixer,
+ SLOT(slotUpdateInstrument(InstrumentId)));
+
+ plugAccelerators(m_midiMixer, m_midiMixer->getAccelerators());
+
+ m_midiMixer->show();
+}
+
+void
+RosegardenGUIApp::slotEditControlParameters(DeviceId device)
+{
+ for (std::set
+ <ControlEditorDialog *>::iterator i = m_controlEditors.begin();
+ i != m_controlEditors.end(); ++i) {
+ if ((*i)->getDevice() == device) {
+ (*i)->show();
+ (*i)->raise();
+ (*i)->setActiveWindow();
+ return ;
+ }
+ }
+
+ ControlEditorDialog *controlEditor = new ControlEditorDialog(this, m_doc,
+ device);
+ m_controlEditors.insert(controlEditor);
+
+ RG_DEBUG << "inserting control editor dialog, have " << m_controlEditors.size() << " now" << endl;
+
+ connect(controlEditor, SIGNAL(closing()),
+ SLOT(slotControlEditorClosed()));
+
+ connect(this, SIGNAL(documentAboutToChange()),
+ controlEditor, SLOT(close()));
+
+ connect(m_doc, SIGNAL(devicesResyncd()),
+ controlEditor, SLOT(slotUpdate()));
+
+ controlEditor->show();
+}
+
+void
+RosegardenGUIApp::slotEditBanks()
+{
+ slotEditBanks(Device::NO_DEVICE);
+}
+
+void
+RosegardenGUIApp::slotEditBanks(DeviceId device)
+{
+ if (m_bankEditor) {
+ if (device != Device::NO_DEVICE)
+ m_bankEditor->setCurrentDevice(device);
+ m_bankEditor->show();
+ m_bankEditor->raise();
+ m_bankEditor->setActiveWindow();
+ return ;
+ }
+
+ m_bankEditor = new BankEditorDialog(this, m_doc, device);
+
+ connect(m_bankEditor, SIGNAL(closing()),
+ this, SLOT(slotBankEditorClosed()));
+
+ connect(this, SIGNAL(documentAboutToChange()),
+ m_bankEditor, SLOT(slotFileClose()));
+
+ // Cheating way of updating the track/instrument list
+ //
+ connect(m_bankEditor, SIGNAL(deviceNamesChanged()),
+ m_view, SLOT(slotSynchroniseWithComposition()));
+
+ m_bankEditor->show();
+}
+
+void
+RosegardenGUIApp::slotManageTriggerSegments()
+{
+ if (m_triggerSegmentManager) {
+ m_triggerSegmentManager->show();
+ m_triggerSegmentManager->raise();
+ m_triggerSegmentManager->setActiveWindow();
+ return ;
+ }
+
+ m_triggerSegmentManager = new TriggerSegmentManager(this, m_doc);
+
+ connect(m_triggerSegmentManager, SIGNAL(closing()),
+ SLOT(slotTriggerManagerClosed()));
+
+ connect(m_triggerSegmentManager, SIGNAL(editTriggerSegment(int)),
+ m_view, SLOT(slotEditTriggerSegment(int)));
+
+ m_triggerSegmentManager->show();
+}
+
+void
+RosegardenGUIApp::slotTriggerManagerClosed()
+{
+ RG_DEBUG << "RosegardenGUIApp::slotTriggerManagerClosed" << endl;
+
+ m_triggerSegmentManager = 0;
+}
+
+void
+RosegardenGUIApp::slotEditMarkers()
+{
+ if (m_markerEditor) {
+ m_markerEditor->show();
+ m_markerEditor->raise();
+ m_markerEditor->setActiveWindow();
+ return ;
+ }
+
+ m_markerEditor = new MarkerEditor(this, m_doc);
+
+ connect(m_markerEditor, SIGNAL(closing()),
+ SLOT(slotMarkerEditorClosed()));
+
+ connect(m_markerEditor, SIGNAL(jumpToMarker(timeT)),
+ m_doc, SLOT(slotSetPointerPosition(timeT)));
+
+ plugAccelerators(m_markerEditor, m_markerEditor->getAccelerators());
+
+ m_markerEditor->show();
+}
+
+void
+RosegardenGUIApp::slotMarkerEditorClosed()
+{
+ RG_DEBUG << "RosegardenGUIApp::slotMarkerEditorClosed" << endl;
+
+ m_markerEditor = 0;
+}
+
+void
+RosegardenGUIApp::slotEditTempos(timeT t)
+{
+ if (m_tempoView) {
+ m_tempoView->show();
+ m_tempoView->raise();
+ m_tempoView->setActiveWindow();
+ return ;
+ }
+
+ m_tempoView = new TempoView(m_doc, getView(), t);
+
+ connect(m_tempoView, SIGNAL(closing()),
+ SLOT(slotTempoViewClosed()));
+
+ connect(m_tempoView, SIGNAL(windowActivated()),
+ getView(), SLOT(slotActiveMainWindowChanged()));
+
+ connect(m_tempoView,
+ SIGNAL(changeTempo(timeT,
+ tempoT,
+ tempoT,
+ TempoDialog::TempoDialogAction)),
+ this,
+ SLOT(slotChangeTempo(timeT,
+ tempoT,
+ tempoT,
+ TempoDialog::TempoDialogAction)));
+
+ connect(m_tempoView, SIGNAL(saveFile()), this, SLOT(slotFileSave()));
+
+ plugAccelerators(m_tempoView, m_tempoView->getAccelerators());
+
+ m_tempoView->show();
+}
+
+void
+RosegardenGUIApp::slotTempoViewClosed()
+{
+ RG_DEBUG << "RosegardenGUIApp::slotTempoViewClosed" << endl;
+
+ m_tempoView = 0;
+}
+
+void
+RosegardenGUIApp::slotControlEditorClosed()
+{
+ const QObject *s = sender();
+
+ RG_DEBUG << "RosegardenGUIApp::slotControlEditorClosed" << endl;
+
+ for (std::set
+ <ControlEditorDialog *>::iterator i = m_controlEditors.begin();
+ i != m_controlEditors.end(); ++i) {
+ if (*i == s) {
+ m_controlEditors.erase(i);
+ RG_DEBUG << "removed control editor dialog, have " << m_controlEditors.size() << " left" << endl;
+ return ;
+ }
+ }
+
+ std::cerr << "WARNING: control editor " << s << " closed, but couldn't find it in our control editor list (we have " << m_controlEditors.size() << " editors)" << std::endl;
+}
+
+void
+RosegardenGUIApp::slotShowPluginDialog(QWidget *parent,
+ InstrumentId instrumentId,
+ int index)
+{
+ if (!parent)
+ parent = this;
+
+ int key = (index << 16) + instrumentId;
+
+ if (m_pluginDialogs[key]) {
+ m_pluginDialogs[key]->show();
+ m_pluginDialogs[key]->raise();
+ m_pluginDialogs[key]->setActiveWindow();
+ return ;
+ }
+
+ PluginContainer *container = 0;
+
+ container = m_doc->getStudio().getContainerById(instrumentId);
+ if (!container) {
+ RG_DEBUG << "RosegardenGUIApp::slotShowPluginDialog - "
+ << "no instrument or buss of id " << instrumentId << endl;
+ return ;
+ }
+
+ // only create a dialog if we've got a plugin instance
+ AudioPluginInstance *inst =
+ container->getPlugin(index);
+
+ if (!inst) {
+ RG_DEBUG << "RosegardenGUIApp::slotShowPluginDialog - "
+ << "no AudioPluginInstance found for index "
+ << index << endl;
+ return ;
+ }
+
+ // Create the plugin dialog
+ //
+ AudioPluginDialog *dialog =
+ new AudioPluginDialog(parent,
+ m_doc->getPluginManager(),
+#ifdef HAVE_LIBLO
+ m_pluginGUIManager,
+#endif
+ container,
+ index);
+
+ connect(dialog, SIGNAL(windowActivated()),
+ m_view, SLOT(slotActiveMainWindowChanged()));
+
+/* This feature isn't provided by the plugin dialog
+ connect(m_view, SIGNAL(controllerDeviceEventReceived(MappedEvent *, const void *)),
+ dialog, SLOT(slotControllerDeviceEventReceived(MappedEvent *, const void *)));
+*/
+
+ // Plug the new dialog into the standard keyboard accelerators so
+ // that we can use them still while the plugin has focus.
+ //
+ plugAccelerators(dialog, dialog->getAccelerators());
+
+ connect(dialog,
+ SIGNAL(pluginSelected(InstrumentId, int, int)),
+ this,
+ SLOT(slotPluginSelected(InstrumentId, int, int)));
+
+ connect(dialog,
+ SIGNAL(pluginPortChanged(InstrumentId, int, int)),
+ this,
+ SLOT(slotPluginPortChanged(InstrumentId, int, int)));
+
+ connect(dialog,
+ SIGNAL(pluginProgramChanged(InstrumentId, int)),
+ this,
+ SLOT(slotPluginProgramChanged(InstrumentId, int)));
+
+ connect(dialog,
+ SIGNAL(changePluginConfiguration(InstrumentId, int, bool, QString, QString)),
+ this,
+ SLOT(slotChangePluginConfiguration(InstrumentId, int, bool, QString, QString)));
+
+ connect(dialog,
+ SIGNAL(showPluginGUI(InstrumentId, int)),
+ this,
+ SLOT(slotShowPluginGUI(InstrumentId, int)));
+
+ connect(dialog,
+ SIGNAL(stopPluginGUI(InstrumentId, int)),
+ this,
+ SLOT(slotStopPluginGUI(InstrumentId, int)));
+
+ connect(dialog,
+ SIGNAL(bypassed(InstrumentId, int, bool)),
+ this,
+ SLOT(slotPluginBypassed(InstrumentId, int, bool)));
+
+ connect(dialog,
+ SIGNAL(destroyed(InstrumentId, int)),
+ this,
+ SLOT(slotPluginDialogDestroyed(InstrumentId, int)));
+
+ connect(this, SIGNAL(documentAboutToChange()), dialog, SLOT(close()));
+
+ m_pluginDialogs[key] = dialog;
+ m_pluginDialogs[key]->show();
+
+ // Set modified
+ m_doc->slotDocumentModified();
+}
+
+void
+RosegardenGUIApp::slotPluginSelected(InstrumentId instrumentId,
+ int index, int plugin)
+{
+ const QObject *s = sender();
+
+ bool fromSynthMgr = (s == m_synthManager);
+
+ // It's assumed that ports etc will already have been set up on
+ // the AudioPluginInstance before this is invoked.
+
+ PluginContainer *container = 0;
+
+ container = m_doc->getStudio().getContainerById(instrumentId);
+ if (!container) {
+ RG_DEBUG << "RosegardenGUIApp::slotPluginSelected - "
+ << "no instrument or buss of id " << instrumentId << endl;
+ return ;
+ }
+
+ AudioPluginInstance *inst =
+ container->getPlugin(index);
+
+ if (!inst) {
+ RG_DEBUG << "RosegardenGUIApp::slotPluginSelected - "
+ << "got index of unknown plugin!" << endl;
+ return ;
+ }
+
+ if (plugin == -1) {
+ // Destroy plugin instance
+ //!!! seems iffy -- why can't we just unassign it?
+
+ if (StudioControl::
+ destroyStudioObject(inst->getMappedId())) {
+ RG_DEBUG << "RosegardenGUIApp::slotPluginSelected - "
+ << "cannot destroy Studio object "
+ << inst->getMappedId() << endl;
+ }
+
+ inst->setAssigned(false);
+ } else {
+ // If unassigned then create a sequencer instance of this
+ // AudioPluginInstance.
+ //
+ if (inst->isAssigned()) {
+ RG_DEBUG << "RosegardenGUIApp::slotPluginSelected - "
+ << " setting identifier for mapper id " << inst->getMappedId()
+ << " to " << inst->getIdentifier() << endl;
+
+ StudioControl::setStudioObjectProperty
+ (inst->getMappedId(),
+ MappedPluginSlot::Identifier,
+ strtoqstr(inst->getIdentifier()));
+ } else {
+ // create a studio object at the sequencer
+ MappedObjectId newId =
+ StudioControl::createStudioObject
+ (MappedObject::PluginSlot);
+
+ RG_DEBUG << "RosegardenGUIApp::slotPluginSelected - "
+ << " new MappedObjectId = " << newId << endl;
+
+ // set the new Mapped ID and that this instance
+ // is assigned
+ inst->setMappedId(newId);
+ inst->setAssigned(true);
+
+ // set the instrument id
+ StudioControl::setStudioObjectProperty
+ (newId,
+ MappedObject::Instrument,
+ MappedObjectValue(instrumentId));
+
+ // set the position
+ StudioControl::setStudioObjectProperty
+ (newId,
+ MappedObject::Position,
+ MappedObjectValue(index));
+
+ // set the plugin id
+ StudioControl::setStudioObjectProperty
+ (newId,
+ MappedPluginSlot::Identifier,
+ strtoqstr(inst->getIdentifier()));
+ }
+ }
+
+ int pluginMappedId = inst->getMappedId();
+
+ //!!! much code duplicated here from RosegardenGUIDoc::initialiseStudio
+
+ inst->setConfigurationValue
+ (qstrtostr(PluginIdentifier::RESERVED_PROJECT_DIRECTORY_KEY),
+ m_doc->getAudioFileManager().getAudioPath());
+
+ // Set opaque string configuration data (e.g. for DSSI plugin)
+ //
+ MappedObjectPropertyList config;
+ for (AudioPluginInstance::ConfigMap::const_iterator
+ i = inst->getConfiguration().begin();
+ i != inst->getConfiguration().end(); ++i) {
+ config.push_back(strtoqstr(i->first));
+ config.push_back(strtoqstr(i->second));
+ }
+ StudioControl::setStudioObjectPropertyList
+ (pluginMappedId,
+ MappedPluginSlot::Configuration,
+ config);
+
+ // Set the bypass
+ //
+ StudioControl::setStudioObjectProperty
+ (pluginMappedId,
+ MappedPluginSlot::Bypassed,
+ MappedObjectValue(inst->isBypassed()));
+
+ // Set the program
+ //
+ if (inst->getProgram() != "") {
+ StudioControl::setStudioObjectProperty
+ (pluginMappedId,
+ MappedPluginSlot::Program,
+ strtoqstr(inst->getProgram()));
+ }
+
+ // Set all the port values
+ //
+ PortInstanceIterator portIt;
+
+ for (portIt = inst->begin();
+ portIt != inst->end(); ++portIt) {
+ StudioControl::setStudioPluginPort
+ (pluginMappedId,
+ (*portIt)->number,
+ (*portIt)->value);
+ }
+
+ if (fromSynthMgr) {
+ int key = (index << 16) + instrumentId;
+ if (m_pluginDialogs[key]) {
+ m_pluginDialogs[key]->updatePlugin(plugin);
+ }
+ } else if (m_synthManager) {
+ m_synthManager->updatePlugin(instrumentId, plugin);
+ }
+
+ emit pluginSelected(instrumentId, index, plugin);
+
+ // Set modified
+ m_doc->slotDocumentModified();
+}
+
+void
+RosegardenGUIApp::slotChangePluginPort(InstrumentId instrumentId,
+ int pluginIndex,
+ int portIndex,
+ float value)
+{
+ PluginContainer *container = 0;
+
+ container = m_doc->getStudio().getContainerById(instrumentId);
+ if (!container) {
+ RG_DEBUG << "RosegardenGUIApp::slotChangePluginPort - "
+ << "no instrument or buss of id " << instrumentId << endl;
+ return ;
+ }
+
+ AudioPluginInstance *inst = container->getPlugin(pluginIndex);
+ if (!inst) {
+ RG_DEBUG << "RosegardenGUIApp::slotChangePluginPort - "
+ << "no plugin at index " << pluginIndex << " on " << instrumentId << endl;
+ return ;
+ }
+
+ PluginPortInstance *port = inst->getPort(portIndex);
+ if (!port) {
+ RG_DEBUG << "RosegardenGUIApp::slotChangePluginPort - no port "
+ << portIndex << endl;
+ return ;
+ }
+
+ RG_DEBUG << "RosegardenGUIApp::slotPluginPortChanged - "
+ << "setting plugin port (" << inst->getMappedId()
+ << ", " << portIndex << ") from " << port->value
+ << " to " << value << endl;
+
+ port->setValue(value);
+
+ StudioControl::setStudioPluginPort(inst->getMappedId(),
+ portIndex, port->value);
+
+ m_doc->slotDocumentModified();
+
+ // This modification came from The Outside!
+ int key = (pluginIndex << 16) + instrumentId;
+ if (m_pluginDialogs[key]) {
+ m_pluginDialogs[key]->updatePluginPortControl(portIndex);
+ }
+}
+
+void
+RosegardenGUIApp::slotPluginPortChanged(InstrumentId instrumentId,
+ int pluginIndex,
+ int portIndex)
+{
+ PluginContainer *container = 0;
+
+ container = m_doc->getStudio().getContainerById(instrumentId);
+ if (!container) {
+ RG_DEBUG << "RosegardenGUIApp::slotPluginPortChanged - "
+ << "no instrument or buss of id " << instrumentId << endl;
+ return ;
+ }
+
+ AudioPluginInstance *inst = container->getPlugin(pluginIndex);
+ if (!inst) {
+ RG_DEBUG << "RosegardenGUIApp::slotPluginPortChanged - "
+ << "no plugin at index " << pluginIndex << " on " << instrumentId << endl;
+ return ;
+ }
+
+ PluginPortInstance *port = inst->getPort(portIndex);
+ if (!port) {
+ RG_DEBUG << "RosegardenGUIApp::slotPluginPortChanged - no port "
+ << portIndex << endl;
+ return ;
+ }
+
+ RG_DEBUG << "RosegardenGUIApp::slotPluginPortChanged - "
+ << "setting plugin port (" << inst->getMappedId()
+ << ", " << portIndex << ") to " << port->value << endl;
+
+ StudioControl::setStudioPluginPort(inst->getMappedId(),
+ portIndex, port->value);
+
+ m_doc->slotDocumentModified();
+
+#ifdef HAVE_LIBLO
+ // This modification came from our own plugin dialog, so update
+ // any external GUIs
+ if (m_pluginGUIManager) {
+ m_pluginGUIManager->updatePort(instrumentId,
+ pluginIndex,
+ portIndex);
+ }
+#endif
+}
+
+void
+RosegardenGUIApp::slotChangePluginProgram(InstrumentId instrumentId,
+ int pluginIndex,
+ QString program)
+{
+ PluginContainer *container = 0;
+
+ container = m_doc->getStudio().getContainerById(instrumentId);
+ if (!container) {
+ RG_DEBUG << "RosegardenGUIApp::slotChangePluginProgram - "
+ << "no instrument or buss of id " << instrumentId << endl;
+ return ;
+ }
+
+ AudioPluginInstance *inst = container->getPlugin(pluginIndex);
+ if (!inst) {
+ RG_DEBUG << "RosegardenGUIApp::slotChangePluginProgram - "
+ << "no plugin at index " << pluginIndex << " on " << instrumentId << endl;
+ return ;
+ }
+
+ RG_DEBUG << "RosegardenGUIApp::slotChangePluginProgram - "
+ << "setting plugin program ("
+ << inst->getMappedId() << ") from " << inst->getProgram()
+ << " to " << program << endl;
+
+ inst->setProgram(qstrtostr(program));
+
+ StudioControl::
+ setStudioObjectProperty(inst->getMappedId(),
+ MappedPluginSlot::Program,
+ program);
+
+ PortInstanceIterator portIt;
+
+ for (portIt = inst->begin();
+ portIt != inst->end(); ++portIt) {
+ float value = StudioControl::getStudioPluginPort
+ (inst->getMappedId(),
+ (*portIt)->number);
+ (*portIt)->value = value;
+ }
+
+ // Set modified
+ m_doc->slotDocumentModified();
+
+ int key = (pluginIndex << 16) + instrumentId;
+ if (m_pluginDialogs[key]) {
+ m_pluginDialogs[key]->updatePluginProgramControl();
+ }
+}
+
+void
+RosegardenGUIApp::slotPluginProgramChanged(InstrumentId instrumentId,
+ int pluginIndex)
+{
+ PluginContainer *container = 0;
+
+ container = m_doc->getStudio().getContainerById(instrumentId);
+ if (!container) {
+ RG_DEBUG << "RosegardenGUIApp::slotPluginProgramChanged - "
+ << "no instrument or buss of id " << instrumentId << endl;
+ return ;
+ }
+
+ AudioPluginInstance *inst = container->getPlugin(pluginIndex);
+ if (!inst) {
+ RG_DEBUG << "RosegardenGUIApp::slotPluginProgramChanged - "
+ << "no plugin at index " << pluginIndex << " on " << instrumentId << endl;
+ return ;
+ }
+
+ QString program = strtoqstr(inst->getProgram());
+
+ RG_DEBUG << "RosegardenGUIApp::slotPluginProgramChanged - "
+ << "setting plugin program ("
+ << inst->getMappedId() << ") to " << program << endl;
+
+ StudioControl::
+ setStudioObjectProperty(inst->getMappedId(),
+ MappedPluginSlot::Program,
+ program);
+
+ PortInstanceIterator portIt;
+
+ for (portIt = inst->begin();
+ portIt != inst->end(); ++portIt) {
+ float value = StudioControl::getStudioPluginPort
+ (inst->getMappedId(),
+ (*portIt)->number);
+ (*portIt)->value = value;
+ }
+
+ // Set modified
+ m_doc->slotDocumentModified();
+
+#ifdef HAVE_LIBLO
+
+ if (m_pluginGUIManager)
+ m_pluginGUIManager->updateProgram(instrumentId,
+ pluginIndex);
+#endif
+}
+
+void
+RosegardenGUIApp::slotChangePluginConfiguration(InstrumentId instrumentId,
+ int index,
+ bool global,
+ QString key,
+ QString value)
+{
+ PluginContainer *container = 0;
+
+ container = m_doc->getStudio().getContainerById(instrumentId);
+ if (!container) {
+ RG_DEBUG << "RosegardenGUIApp::slotChangePluginConfiguration - "
+ << "no instrument or buss of id " << instrumentId << endl;
+ return ;
+ }
+
+ AudioPluginInstance *inst = container->getPlugin(index);
+
+ if (global && inst) {
+
+ // Set the same configuration on other plugins in the same
+ // instance group
+
+ AudioPlugin *pl =
+ m_pluginManager->getPluginByIdentifier(strtoqstr(inst->getIdentifier()));
+
+ if (pl && pl->isGrouped()) {
+
+ InstrumentList il =
+ m_doc->getStudio().getAllInstruments();
+
+ for (InstrumentList::iterator i = il.begin();
+ i != il.end(); ++i) {
+
+ for (PluginInstanceIterator pli =
+ (*i)->beginPlugins();
+ pli != (*i)->endPlugins(); ++pli) {
+
+ if (*pli && (*pli)->isAssigned() &&
+ (*pli)->getIdentifier() == inst->getIdentifier() &&
+ (*pli) != inst) {
+
+ slotChangePluginConfiguration
+ ((*i)->getId(), (*pli)->getPosition(),
+ false, key, value);
+
+#ifdef HAVE_LIBLO
+
+ m_pluginGUIManager->updateConfiguration
+ ((*i)->getId(), (*pli)->getPosition(), key);
+#endif
+
+ }
+ }
+ }
+ }
+ }
+
+ if (inst) {
+
+ inst->setConfigurationValue(qstrtostr(key), qstrtostr(value));
+
+ MappedObjectPropertyList config;
+ for (AudioPluginInstance::ConfigMap::const_iterator
+ i = inst->getConfiguration().begin();
+ i != inst->getConfiguration().end(); ++i) {
+ config.push_back(strtoqstr(i->first));
+ config.push_back(strtoqstr(i->second));
+ }
+
+ RG_DEBUG << "RosegardenGUIApp::slotChangePluginConfiguration: setting new config on mapped id " << inst->getMappedId() << endl;
+
+ StudioControl::setStudioObjectPropertyList
+ (inst->getMappedId(),
+ MappedPluginSlot::Configuration,
+ config);
+
+ // Set modified
+ m_doc->slotDocumentModified();
+
+ int key = (index << 16) + instrumentId;
+ if (m_pluginDialogs[key]) {
+ m_pluginDialogs[key]->updatePluginProgramList();
+ }
+ }
+}
+
+void
+RosegardenGUIApp::slotPluginDialogDestroyed(InstrumentId instrumentId,
+ int index)
+{
+ int key = (index << 16) + instrumentId;
+ m_pluginDialogs[key] = 0;
+}
+
+void
+RosegardenGUIApp::slotPluginBypassed(InstrumentId instrumentId,
+ int pluginIndex, bool bp)
+{
+ PluginContainer *container = 0;
+
+ container = m_doc->getStudio().getContainerById(instrumentId);
+ if (!container) {
+ RG_DEBUG << "RosegardenGUIApp::slotPluginBypassed - "
+ << "no instrument or buss of id " << instrumentId << endl;
+ return ;
+ }
+
+ AudioPluginInstance *inst = container->getPlugin(pluginIndex);
+
+ if (inst) {
+ StudioControl::setStudioObjectProperty
+ (inst->getMappedId(),
+ MappedPluginSlot::Bypassed,
+ MappedObjectValue(bp));
+
+ // Set the bypass on the instance
+ //
+ inst->setBypass(bp);
+
+ // Set modified
+ m_doc->slotDocumentModified();
+ }
+
+ emit pluginBypassed(instrumentId, pluginIndex, bp);
+}
+
+void
+RosegardenGUIApp::slotShowPluginGUI(InstrumentId instrument,
+ int index)
+{
+#ifdef HAVE_LIBLO
+ m_pluginGUIManager->showGUI(instrument, index);
+#endif
+}
+
+void
+RosegardenGUIApp::slotStopPluginGUI(InstrumentId instrument,
+ int index)
+{
+#ifdef HAVE_LIBLO
+ m_pluginGUIManager->stopGUI(instrument, index);
+#endif
+}
+
+void
+RosegardenGUIApp::slotPluginGUIExited(InstrumentId instrument,
+ int index)
+{
+ int key = (index << 16) + instrument;
+ if (m_pluginDialogs[key]) {
+ m_pluginDialogs[key]->guiExited();
+ }
+}
+
+void
+RosegardenGUIApp::slotPlayList()
+{
+ if (!m_playList) {
+ m_playList = new PlayListDialog(i18n("Play List"), this);
+ connect(m_playList, SIGNAL(closing()),
+ SLOT(slotPlayListClosed()));
+ connect(m_playList->getPlayList(), SIGNAL(play(QString)),
+ SLOT(slotPlayListPlay(QString)));
+ }
+
+ m_playList->show();
+}
+
+void
+RosegardenGUIApp::slotPlayListPlay(QString url)
+{
+ slotStop();
+ openURL(url);
+ slotPlay();
+}
+
+void
+RosegardenGUIApp::slotPlayListClosed()
+{
+ RG_DEBUG << "RosegardenGUIApp::slotPlayListClosed()\n";
+ m_playList = 0;
+}
+
+void
+RosegardenGUIApp::slotTutorial()
+{
+ QString tutorialURL = i18n("http://rosegarden.sourceforge.net/tutorial/en/chapter-0.html");
+ kapp->invokeBrowser(tutorialURL);
+}
+
+void
+RosegardenGUIApp::slotBugGuidelines()
+{
+ QString glURL = i18n("http://rosegarden.sourceforge.net/tutorial/bug-guidelines.html");
+ kapp->invokeBrowser(glURL);
+}
+
+void
+RosegardenGUIApp::slotBankEditorClosed()
+{
+ RG_DEBUG << "RosegardenGUIApp::slotBankEditorClosed()\n";
+
+ if (m_doc->isModified()) {
+ if (m_view)
+ m_view->slotSelectTrackSegments(m_doc->getComposition().getSelectedTrack());
+ }
+
+ m_bankEditor = 0;
+}
+
+void
+RosegardenGUIApp::slotDeviceManagerClosed()
+{
+ RG_DEBUG << "RosegardenGUIApp::slotDeviceManagerClosed()\n";
+
+ if (m_doc->isModified()) {
+ if (m_view)
+ m_view->slotSelectTrackSegments(m_doc->getComposition().getSelectedTrack());
+ }
+
+ m_deviceManager = 0;
+}
+
+void
+RosegardenGUIApp::slotSynthPluginManagerClosed()
+{
+ RG_DEBUG << "RosegardenGUIApp::slotSynthPluginManagerClosed()\n";
+
+ m_synthManager = 0;
+}
+
+void
+RosegardenGUIApp::slotAudioMixerClosed()
+{
+ RG_DEBUG << "RosegardenGUIApp::slotAudioMixerClosed()\n";
+
+ m_audioMixer = 0;
+}
+
+void
+RosegardenGUIApp::slotMidiMixerClosed()
+{
+ RG_DEBUG << "RosegardenGUIApp::slotMidiMixerClosed()\n";
+
+ m_midiMixer = 0;
+}
+
+void
+RosegardenGUIApp::slotAudioManagerClosed()
+{
+ RG_DEBUG << "RosegardenGUIApp::slotAudioManagerClosed()\n";
+
+ if (m_doc->isModified()) {
+ if (m_view)
+ m_view->slotSelectTrackSegments(m_doc->getComposition().getSelectedTrack());
+ }
+
+ m_audioManagerDialog = 0;
+}
+
+void
+RosegardenGUIApp::slotPanic()
+{
+ if (m_seqManager) {
+ // Stop the transport before we send a panic as the
+ // playback goes all to hell anyway.
+ //
+ slotStop();
+
+ ProgressDialog progressDlg(i18n("Queueing MIDI panic events for tranmission..."),
+ 100,
+ this);
+ CurrentProgressDialog::set
+ (&progressDlg);
+ ProgressDialog::processEvents();
+
+ connect(m_seqManager, SIGNAL(setProgress(int)),
+ progressDlg.progressBar(), SLOT(setValue(int)));
+ connect(m_seqManager, SIGNAL(incrementProgress(int)),
+ progressDlg.progressBar(), SLOT(advance(int)));
+
+ m_seqManager->panic();
+
+ }
+}
+
+void
+RosegardenGUIApp::slotPopulateTrackInstrumentPopup()
+{
+ RG_DEBUG << "RosegardenGUIApp::slotSetTrackInstrument\n";
+ Composition &comp = m_doc->getComposition();
+ Track *track = comp.getTrackById(comp.getSelectedTrack());
+
+ if (!track) {
+ RG_DEBUG << "Weird: no track available for instrument popup!" << endl;
+ return ;
+ }
+
+ Instrument* instrument = m_doc->getStudio().getInstrumentById(track->getInstrument());
+
+ QPopupMenu* popup = dynamic_cast<QPopupMenu*>(factory()->container("set_track_instrument", this));
+
+ m_view->getTrackEditor()->getTrackButtons()->populateInstrumentPopup(instrument, popup);
+}
+
+void
+RosegardenGUIApp::slotRemapInstruments()
+{
+ RG_DEBUG << "RosegardenGUIApp::slotRemapInstruments\n";
+ RemapInstrumentDialog dialog(this, m_doc);
+
+ connect(&dialog, SIGNAL(applyClicked()),
+ m_view->getTrackEditor()->getTrackButtons(),
+ SLOT(slotSynchroniseWithComposition()));
+
+ if (dialog.exec() == QDialog::Accepted) {
+ RG_DEBUG << "slotRemapInstruments - accepted\n";
+ }
+
+}
+
+void
+RosegardenGUIApp::slotSaveDefaultStudio()
+{
+ RG_DEBUG << "RosegardenGUIApp::slotSaveDefaultStudio\n";
+
+ int reply = KMessageBox::warningYesNo
+ (this, i18n("Are you sure you want to save this as your default studio?"));
+
+ if (reply != KMessageBox::Yes)
+ return ;
+
+ KTmpStatusMsg msg(i18n("Saving current document as default studio..."), this);
+
+ QString autoloadFile = ::locateLocal("appdata", "autoload.rg");
+
+ RG_DEBUG << "RosegardenGUIApp::slotSaveDefaultStudio : saving studio in "
+ << autoloadFile << endl;
+
+ SetWaitCursor waitCursor;
+ QString errMsg;
+ bool res = m_doc->saveDocument(autoloadFile, errMsg);
+ if (!res) {
+ if (errMsg)
+ KMessageBox::error(this, i18n(QString("Could not auto-save document at %1\nError was : %2")
+ .arg(autoloadFile).arg(errMsg)));
+ else
+ KMessageBox::error(this, i18n(QString("Could not auto-save document at %1")
+ .arg(autoloadFile)));
+
+ }
+}
+
+void
+RosegardenGUIApp::slotImportDefaultStudio()
+{
+ int reply = KMessageBox::warningYesNo
+ (this, i18n("Are you sure you want to import your default studio and lose the current one?"));
+
+ if (reply != KMessageBox::Yes)
+ return ;
+
+ QString autoloadFile =
+ KGlobal::dirs()->findResource("appdata", "autoload.rg");
+
+ QFileInfo autoloadFileInfo(autoloadFile);
+
+ if (!autoloadFileInfo.isReadable()) {
+ RG_DEBUG << "RosegardenGUIDoc::slotImportDefaultStudio - "
+ << "can't find autoload file - defaulting" << endl;
+ return ;
+ }
+
+ slotImportStudioFromFile(autoloadFile);
+}
+
+void
+RosegardenGUIApp::slotImportStudio()
+{
+ RG_DEBUG << "RosegardenGUIApp::slotImportStudio()\n";
+
+ QString studioDir = KGlobal::dirs()->findResource("appdata", "library/");
+ QDir dir(studioDir);
+ if (!dir.exists()) {
+ studioDir = ":ROSEGARDENDEVICE";
+ } else {
+ studioDir = "file://" + studioDir;
+ }
+
+ KURL url = KFileDialog::getOpenURL
+ (studioDir,
+ "audio/x-rosegarden-device audio/x-rosegarden",
+ this, i18n("Import Studio from File"));
+
+ if (url.isEmpty())
+ return ;
+
+ QString target;
+ if (KIO::NetAccess::download(url, target, this) == false) {
+ KMessageBox::error(this, i18n("Cannot download file %1")
+ .arg(url.prettyURL()));
+ return ;
+ }
+
+ slotImportStudioFromFile(target);
+}
+
+void
+RosegardenGUIApp::slotImportStudioFromFile(const QString &file)
+{
+ RosegardenGUIDoc *doc = new RosegardenGUIDoc(this, 0, true); // skipAutoload
+
+ Studio &oldStudio = m_doc->getStudio();
+ Studio &newStudio = doc->getStudio();
+
+ // Add some dummy devices for when we open the document. We guess
+ // that the file won't have more than 32 devices.
+ //
+ // for (unsigned int i = 0; i < 32; i++) {
+ // newStudio.addDevice("", i, Device::Midi);
+ // }
+
+ if (doc->openDocument(file, true)) { // true because we actually
+ // do want to create devices
+ // on the sequencer here
+
+ KMacroCommand *command = new KMacroCommand(i18n("Import Studio"));
+ doc->syncDevices();
+
+ // We actually only copy across MIDI play devices... for now
+ std::vector<DeviceId> midiPlayDevices;
+
+ for (DeviceList::const_iterator i =
+ oldStudio.begin(); i != oldStudio.end(); ++i) {
+
+ MidiDevice *md =
+ dynamic_cast<MidiDevice *>(*i);
+
+ if (md && (md->getDirection() == MidiDevice::Play)) {
+ midiPlayDevices.push_back((*i)->getId());
+ }
+ }
+
+ std::vector<DeviceId>::iterator di(midiPlayDevices.begin());
+
+ for (DeviceList::const_iterator i =
+ newStudio.begin(); i != newStudio.end(); ++i) {
+
+ MidiDevice *md =
+ dynamic_cast<MidiDevice *>(*i);
+
+ if (md && (md->getDirection() == MidiDevice::Play)) {
+ if (di != midiPlayDevices.end()) {
+ MidiDevice::VariationType variation
+ (md->getVariationType());
+ BankList bl(md->getBanks());
+ ProgramList pl(md->getPrograms());
+ ControlList cl(md->getControlParameters());
+
+ ModifyDeviceCommand* mdCommand = new ModifyDeviceCommand(&oldStudio,
+ *di,
+ md->getName(),
+ md->getLibrarianName(),
+ md->getLibrarianEmail());
+ mdCommand->setVariation(variation);
+ mdCommand->setBankList(bl);
+ mdCommand->setProgramList(pl);
+ mdCommand->setControlList(cl);
+ mdCommand->setOverwrite(true);
+ mdCommand->setRename(md->getName() != "");
+
+ command->addCommand(mdCommand);
+ ++di;
+ }
+ }
+ }
+
+ while (di != midiPlayDevices.end()) {
+ command->addCommand(new CreateOrDeleteDeviceCommand
+ (&oldStudio,
+ *di));
+ }
+
+ oldStudio.setMIDIThruFilter(newStudio.getMIDIThruFilter());
+ oldStudio.setMIDIRecordFilter(newStudio.getMIDIRecordFilter());
+
+ m_doc->getCommandHistory()->addCommand(command);
+ m_doc->syncDevices();
+ m_doc->initialiseStudio(); // The other document will have reset it
+ }
+
+ delete doc;
+}
+
+void
+RosegardenGUIApp::slotResetMidiNetwork()
+{
+ if (m_seqManager) {
+
+ m_seqManager->preparePlayback(true);
+
+ m_seqManager->resetMidiNetwork();
+ }
+
+}
+
+void
+RosegardenGUIApp::slotModifyMIDIFilters()
+{
+ RG_DEBUG << "RosegardenGUIApp::slotModifyMIDIFilters" << endl;
+
+ MidiFilterDialog dialog(this, m_doc);
+
+ if (dialog.exec() == QDialog::Accepted) {
+ RG_DEBUG << "slotModifyMIDIFilters - accepted" << endl;
+ }
+}
+
+void
+RosegardenGUIApp::slotManageMetronome()
+{
+ RG_DEBUG << "RosegardenGUIApp::slotManageMetronome" << endl;
+
+ ManageMetronomeDialog dialog(this, m_doc);
+
+ if (dialog.exec() == QDialog::Accepted) {
+ RG_DEBUG << "slotManageMetronome - accepted" << endl;
+ }
+}
+
+void
+RosegardenGUIApp::slotAutoSave()
+{
+ if (!m_seqManager ||
+ m_seqManager->getTransportStatus() == PLAYING ||
+ m_seqManager->getTransportStatus() == RECORDING)
+ return ;
+
+ KConfig* config = kapp->config();
+ config->setGroup(GeneralOptionsConfigGroup);
+ if (!config->readBoolEntry("autosave", true))
+ return ;
+
+ m_doc->slotAutoSave();
+}
+
+void
+RosegardenGUIApp::slotUpdateAutoSaveInterval(unsigned int interval)
+{
+ RG_DEBUG << "RosegardenGUIApp::slotUpdateAutoSaveInterval - "
+ << "changed interval to " << interval << endl;
+ m_autoSaveTimer->changeInterval(int(interval) * 1000);
+}
+
+void
+RosegardenGUIApp::slotUpdateSidebarStyle(unsigned int style)
+{
+ RG_DEBUG << "RosegardenGUIApp::slotUpdateSidebarStyle - "
+ << "changed style to " << style << endl;
+ m_parameterArea->setArrangement((RosegardenParameterArea::Arrangement) style);
+}
+
+void
+RosegardenGUIApp::slotShowTip()
+{
+ RG_DEBUG << "RosegardenGUIApp::slotShowTip" << endl;
+ KTipDialog::showTip(this, locate("data", "rosegarden/tips"), true);
+}
+
+void RosegardenGUIApp::slotShowToolHelp(const QString &s)
+{
+ QString msg = s;
+ if (msg != "") msg = " " + msg;
+ slotStatusMsg(msg);
+}
+
+void
+RosegardenGUIApp::slotEnableMIDIThruRouting()
+{
+ m_seqManager->enableMIDIThruRouting(m_enableMIDIrouting->isChecked());
+}
+
+TransportDialog* RosegardenGUIApp::getTransport()
+{
+ if (m_transport == 0)
+ createAndSetupTransport();
+
+ return m_transport;
+}
+
+RosegardenGUIDoc *RosegardenGUIApp::getDocument() const
+{
+ return m_doc;
+}
+
+void
+RosegardenGUIApp::awaitDialogClearance()
+{
+ bool haveDialog = true;
+
+ std::cerr << "RosegardenGUIApp::awaitDialogClearance: entering" << std::endl;
+
+ while (haveDialog) {
+
+ const QObjectList *c = children();
+ if (!c) return;
+
+ haveDialog = false;
+ for (QObjectList::const_iterator i = c->begin(); i != c->end(); ++i) {
+ QDialog *dialog = dynamic_cast<QDialog *>(*i);
+ if (dialog && dialog->isVisible()) {
+ haveDialog = true;
+ break;
+ }
+ }
+
+// std::cerr << "RosegardenGUIApp::awaitDialogClearance: have dialog = "
+// << haveDialog << std::endl;
+
+ if (haveDialog) kapp->processEvents();
+ }
+
+ std::cerr << "RosegardenGUIApp::awaitDialogClearance: exiting" << std::endl;
+}
+
+void
+RosegardenGUIApp::slotNewerVersionAvailable(QString v)
+{
+ if (m_firstRun) return;
+ KStartupLogo::hideIfStillThere();
+ CurrentProgressDialog::freeze();
+ awaitDialogClearance();
+ KMessageBox::information
+ (this,
+ i18n("<h3>Newer version available</h3><p>A newer version of Rosegarden may be available.<br>Please consult the <a href=\"http://www.rosegardenmusic.com/getting/\">Rosegarden website</a> for more information.</p>"),
+ i18n("Newer version available"),
+ QString("version-%1-available-show").arg(v),
+ KMessageBox::AllowLink);
+ CurrentProgressDialog::thaw();
+}
+
+void
+RosegardenGUIApp::slotSetQuickMarker()
+{
+ RG_DEBUG << "RosegardenGUIApp::slotSetQuickMarker" << endl;
+
+ m_doc->setQuickMarker();
+ getView()->getTrackEditor()->updateRulers();
+}
+
+void
+RosegardenGUIApp::slotJumpToQuickMarker()
+{
+ RG_DEBUG << "RosegardenGUIApp::slotJumpToQuickMarker" << endl;
+
+ m_doc->jumpToQuickMarker();
+}
+
+const void* RosegardenGUIApp::SequencerExternal = (void*)-1;
+RosegardenGUIApp *RosegardenGUIApp::m_myself = 0;
+
+}
+#include "RosegardenGUIApp.moc"
diff --git a/src/gui/application/RosegardenGUIApp.h b/src/gui/application/RosegardenGUIApp.h
new file mode 100644
index 0000000..502d195
--- /dev/null
+++ b/src/gui/application/RosegardenGUIApp.h
@@ -0,0 +1,1691 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_ROSEGARDENGUIAPP_H_
+#define _RG_ROSEGARDENGUIAPP_H_
+
+#include <map>
+#include <set>
+#include "base/MidiProgram.h"
+#include "gui/dialogs/TempoDialog.h"
+#include "gui/widgets/ZoomSlider.h"
+#include "RosegardenIface.h"
+#include "base/Event.h"
+#include "sound/AudioFile.h"
+#include "sound/Midi.h"
+#include <kdockwidget.h>
+#include <qstring.h>
+#include <qvaluevector.h>
+
+
+class QWidget;
+class QTimer;
+class QTextCodec;
+class QShowEvent;
+class QObject;
+class QLabel;
+class QCursor;
+class QAccel;
+class KURL;
+class KTempFile;
+class KToggleAction;
+class KRecentFilesAction;
+class KProcess;
+class KConfig;
+class KAction;
+
+
+namespace Rosegarden
+{
+
+class TriggerSegmentManager;
+class TransportDialog;
+class TrackParameterBox;
+class TempoView;
+class SynthPluginManagerDialog;
+class StartupTester;
+class SequenceManager;
+class SegmentSelection;
+class SegmentParameterBox;
+class RosegardenParameterArea;
+class RosegardenGUIView;
+class RosegardenGUIDoc;
+class RealTime;
+class ProgressBar;
+class PlayListDialog;
+class MidiMixerWindow;
+class MarkerEditor;
+class MappedComposition;
+class LircCommander;
+class LircClient;
+class InstrumentParameterBox;
+class DeviceManagerDialog;
+class ControlEditorDialog;
+class Composition;
+class Clipboard;
+class BankEditorDialog;
+class AudioPluginOSCGUIManager;
+class AudioPluginManager;
+class AudioPluginDialog;
+class AudioMixerWindow;
+class AudioManagerDialog;
+
+/**
+ * The base class for RosegardenGUI application windows. It sets up the main
+ * window and reads the config file as well as providing a menubar, toolbar
+ * and statusbar. An instance of RosegardenGUIView creates your center view, which is connected
+ * to the window's Doc object.
+ * RosegardenGUIApp reimplements the methods that KTMainWindow provides for main window handling and supports
+ * full session management as well as keyboard accelerator configuration by using KAccel.
+ * @see KTMainWindow
+ * @see KApplication
+ * @see KConfig
+ * @see KAccel
+ *
+ * @author Source Framework Automatically Generated by KDevelop, (c) The KDevelop Team.
+ * @version KDevelop version 0.4 code generation
+ */
+class RosegardenGUIApp : public KDockMainWindow, virtual public RosegardenIface
+{
+ Q_OBJECT
+
+ friend class RosegardenGUIView;
+
+public:
+
+ /**
+ * construtor of RosegardenGUIApp, calls all init functions to
+ * create the application.
+ * \arg useSequencer : if true, the sequencer is launched
+ * @see initMenuBar initToolBar
+ */
+ RosegardenGUIApp(bool useSequencer = true,
+ bool useExistingSequencer = false,
+ QObject *startupStatusMessageReceiver = 0);
+
+ virtual ~RosegardenGUIApp();
+
+ /*
+ * Get the current copy of the app object
+ */
+ static RosegardenGUIApp *self() { return m_myself; }
+
+ /**
+ * returns a pointer to the current document connected to the
+ * KTMainWindow instance and is used by * the View class to access
+ * the document object's methods
+ */
+ RosegardenGUIDoc *getDocument() const;
+
+ RosegardenGUIView* getView() { return m_view; }
+
+ TransportDialog* getTransport();
+
+ enum ImportType { ImportRG4, ImportMIDI, ImportRG21, ImportHydrogen, ImportCheckType };
+
+ /**
+ * open a Rosegarden file
+ */
+ virtual void openFile(QString filePath) { openFile(filePath, ImportCheckType); }
+
+ /**
+ * open a file, explicitly specifying its type
+ */
+ void openFile(QString filePath, ImportType type);
+
+ /**
+ * decode and open a project file
+ */
+ void importProject(QString filePath);
+
+ /**
+ * open a URL
+ */
+ virtual void openURL(QString url);
+
+ /**
+ * merge a file with the existing document
+ */
+ virtual void mergeFile(QString filePath) { mergeFile(filePath, ImportCheckType); }
+
+ /**
+ * merge a file, explicitly specifying its type
+ */
+ void mergeFile(QString filePath, ImportType type);
+
+ /**
+ * open a URL
+ */
+ void openURL(const KURL &url);
+
+ /**
+ * export a MIDI file
+ */
+ void exportMIDIFile(QString url);
+
+ /**
+ * export a Csound scorefile
+ */
+ void exportCsoundFile(QString url);
+
+ /**
+ * export a Mup file
+ */
+ void exportMupFile(QString url);
+
+ /**
+ * export a LilyPond file
+ */
+ bool exportLilyPondFile(QString url, bool forPreview = false);
+
+ /**
+ * export a MusicXml file
+ */
+ void exportMusicXmlFile(QString url);
+
+ /**
+ * Get the sequence manager object
+ */
+ SequenceManager* getSequenceManager() { return m_seqManager; }
+
+ /**
+ * Get a progress bar
+ */
+ ProgressBar *getProgressBar() { return m_progressBar; }
+
+ /**
+ * Equivalents of the GUI slots, for DCOP use
+ */
+ virtual void fileNew() { slotFileNew(); }
+ virtual void fileSave() { slotFileSave(); }
+ virtual void fileClose() { slotFileClose(); }
+ virtual void quit() { slotQuit(); }
+
+ virtual void play() { slotPlay(); }
+ virtual void stop() { slotStop(); }
+ virtual void rewind() { slotRewind(); }
+ virtual void fastForward() { slotFastforward(); }
+ virtual void record() { slotRecord(); }
+ virtual void rewindToBeginning() { slotRewindToBeginning(); }
+ virtual void fastForwardToEnd() { slotFastForwardToEnd(); }
+ virtual void jumpToTime(int sec, int usec) { slotJumpToTime(sec, usec); }
+ virtual void startAtTime(int sec, int usec) { slotStartAtTime(sec, usec); }
+
+ virtual void trackUp() { slotTrackUp(); }
+ virtual void trackDown() { slotTrackDown(); }
+ virtual void toggleMutedCurrentTrack() { slotToggleMutedCurrentTrack(); }
+ virtual void toggleRecordCurrentTrack() { slotToggleRecordCurrentTrack(); }
+
+ /**
+ * Start the sequencer auxiliary process
+ * (built in the 'sequencer' directory)
+ *
+ * @see slotSequencerExited()
+ */
+ bool launchSequencer(bool useExistingSequencer);
+
+#ifdef HAVE_LIBJACK
+ /*
+ * Launch and control JACK if required to by configuration
+ */
+ bool launchJack();
+
+#endif // HAVE_LIBJACK
+
+
+ /**
+ * Returns whether we're using a sequencer.
+ * false if the '--nosequencer' option was given
+ * true otherwise.
+ * This doesn't give the state of the sequencer
+ * @see #isSequencerRunning
+ */
+ bool isUsingSequencer() { return m_useSequencer; }
+
+ /**
+ * Returns whether there's a sequencer running.
+ * The result is dynamically updated depending on the sequencer's
+ * status.
+ */
+ bool isSequencerRunning() { return m_useSequencer && (m_sequencerProcess != 0); }
+
+ /**
+ * Returns true if the sequencer wasn't started by us
+ */
+ bool isSequencerExternal() { return m_useSequencer && (m_sequencerProcess == SequencerExternal); }
+
+ /**
+ * Set the sequencer status - pass through DCOP as an int
+ */
+ virtual void notifySequencerStatus(int status);
+
+ /**
+ * Handle some random incoming MIDI events.
+ */
+ virtual void processAsynchronousMidi(const MappedComposition &);
+
+ /*
+ * The sequencer calls this method when it's running to
+ * allow us to sync data with it.
+ *
+ */
+ virtual void alive();
+
+ /*
+ * Tell the application whether this is the first time this
+ * version of RG has been run
+ */
+ void setIsFirstRun(bool first) { m_firstRun = first; }
+
+ /*
+ * Wait in a sub-event-loop until all modal dialogs from the main
+ * window have been cleared
+ */
+ void awaitDialogClearance();
+
+ /*
+ * Return the clipboard
+ */
+ Clipboard* getClipboard() { return m_clipboard; }
+
+#ifdef HAVE_LIBLO
+ /**
+ * Return the plugin native GUI manager, if we have one
+ */
+ AudioPluginOSCGUIManager *getPluginGUIManager() { return m_pluginGUIManager; }
+#endif
+
+ /**
+ * Plug a widget into our common accelerators
+ */
+ void plugAccelerators(QWidget *widget, QAccel *accel);
+
+ /**
+ * Override from QWidget
+ * Toolbars and docks need special treatment
+ */
+ virtual void setCursor(const QCursor&);
+
+ bool isTrackEditorPlayTracking() const;
+
+ bool testAudioPath(QString op); // and open the dialog to set it if unset
+ bool haveAudioImporter() const { return m_haveAudioImporter; }
+
+protected:
+
+ /**** File handling code that we don't want the outside world to use ****/
+ /**/
+ /**/
+
+ /**
+ * Create document from a file
+ */
+ RosegardenGUIDoc* createDocument(QString filePath, ImportType type = ImportRG4);
+
+ /**
+ * Create a document from RG file
+ */
+ RosegardenGUIDoc* createDocumentFromRGFile(QString filePath);
+
+ /**
+ * Create document from MIDI file
+ */
+ RosegardenGUIDoc* createDocumentFromMIDIFile(QString filePath);
+
+ /**
+ * Create document from RG21 file
+ */
+ RosegardenGUIDoc* createDocumentFromRG21File(QString filePath);
+
+ /**
+ * Create document from Hydrogen drum machine file
+ */
+ RosegardenGUIDoc* createDocumentFromHydrogenFile(QString filePath);
+
+ /**/
+ /**/
+ /***********************************************************************/
+
+ /**
+ * Set the 'Rewind' and 'Fast Forward' buttons in the transport
+ * toolbar to AutoRepeat
+ */
+ void setRewFFwdToAutoRepeat();
+
+ static const void* SequencerExternal;
+
+ /// Raise the transport along
+ virtual void showEvent(QShowEvent*);
+
+ /**
+ * read general Options again and initialize all variables like
+ * the recent file list
+ */
+ void readOptions();
+
+ /**
+ * add an item pointing to the example files in the KFileDialog speedbar
+ */
+ void setupFileDialogSpeedbar();
+
+ /**
+ * create menus and toolbars
+ */
+ void setupActions();
+
+ /**
+ * sets up the zoom toolbar
+ */
+ void initZoomToolbar();
+
+ /**
+ * sets up the statusbar for the main window by initialzing a
+ * statuslabel.
+ */
+ void initStatusBar();
+
+ /**
+ * creates the centerwidget of the KTMainWindow instance and sets
+ * it as the view
+ */
+ void initView();
+
+ /**
+ * queryClose is called by KTMainWindow on each closeEvent of a
+ * window. Against the default implementation (only returns true),
+ * this calls saveModified() on the document object to ask if the
+ * document shall be saved if Modified; on cancel the closeEvent
+ * is rejected.
+ *
+ * @see KTMainWindow#queryClose
+ * @see KTMainWindow#closeEvent
+ */
+ virtual bool queryClose();
+
+ /**
+ * queryExit is called by KTMainWindow when the last window of the
+ * application is going to be closed during the closeEvent().
+ * Against the default implementation that just returns true, this
+ * calls saveOptions() to save the settings of the last window's
+ * properties.
+ *
+ * @see KTMainWindow#queryExit
+ * @see KTMainWindow#closeEvent
+ */
+ virtual bool queryExit();
+
+ /**
+ * saves the window properties for each open window during session
+ * end to the session config file, including saving the currently
+ * opened file by a temporary filename provided by KApplication.
+ *
+ * @see KTMainWindow#saveProperties
+ */
+ virtual void saveGlobalProperties(KConfig *_cfg);
+
+ /**
+ * reads the session config file and restores the application's
+ * state including the last opened files and documents by reading
+ * the temporary files saved by saveProperties()
+ *
+ * @see KTMainWindow#readProperties
+ */
+ virtual void readGlobalProperties(KConfig *_cfg);
+
+ /**
+ * Create a new audio file for the sequencer and return the
+ * path to it as a QString.
+ */
+ QString createNewAudioFile();
+ QValueVector<QString> createRecordAudioFiles(const QValueVector<InstrumentId> &);
+
+ QString getAudioFilePath();
+
+ //!!!mtr
+ QValueVector<InstrumentId> getArmedInstruments();
+
+ /**
+ * Show a sequencer error to the user. This is for errors from
+ * the framework code; the playback code uses mapped compositions
+ * to send these things back asynchronously.
+ */
+ void showError(QString error);
+
+ /*
+ * Return AudioManagerDialog
+ */
+ AudioManagerDialog* getAudioManagerDialog() { return m_audioManagerDialog; }
+
+ /**
+ * Ask the user for a file to save to, and check that it's
+ * good and that (if it exists) the user agrees to overwrite.
+ * Return a null string if the write should not go ahead.
+ */
+ QString getValidWriteFile(QString extension, QString label);
+
+ /**
+ * Find any non-ASCII strings in a composition that has been
+ * generated by MIDI import or any other procedure that produces
+ * events with unknown text encoding, and ask the user what
+ * encoding to translate them from. This assumes all text strings
+ * in the composition are of the same encoding, and that it is not
+ * (known to be) utf8 (in which case no transcoding would be
+ * necessary).
+ */
+ void fixTextEncodings(Composition *);
+ QTextCodec *guessTextCodec(std::string);
+
+ /**
+ * Set the current document
+ *
+ * Do all the needed housework when the current document changes
+ * (like closing edit views, emitting documentChanged signal, etc...)
+ */
+ void setDocument(RosegardenGUIDoc*);
+
+ /**
+ * Jog a selection of segments by an amount
+ */
+ void jogSelection(timeT amount);
+
+ void createAndSetupTransport();
+
+signals:
+ void startupStatusMessage(QString message);
+
+ /// emitted just before the document is changed
+ void documentAboutToChange();
+
+ /// emitted when the current document changes
+ void documentChanged(RosegardenGUIDoc*);
+
+ /// emitted when the set of selected segments changes (relayed from RosegardenGUIView)
+ void segmentsSelected(const SegmentSelection &);
+
+ /// emitted when the composition state (selected track, solo, etc...) changes
+ void compositionStateUpdate();
+
+ /// emitted when instrument parameters change (relayed from InstrumentParameterBox)
+ void instrumentParametersChanged(InstrumentId);
+
+ /// emitted when a plugin dialog selects a plugin
+ void pluginSelected(InstrumentId, int, int);
+
+ /// emitted when a plugin dialog (un)bypasses a plugin
+ void pluginBypassed(InstrumentId, int, bool);
+
+public slots:
+
+ /**
+ * open a URL - used for Dn'D
+ *
+ * @param url : a string containing a url (protocol://foo/bar/file.rg)
+ */
+ virtual void slotOpenDroppedURL(QString url);
+
+ /**
+ * Open the document properties dialog on the Audio page
+ */
+ virtual void slotOpenAudioPathSettings();
+
+ /**
+ * open a new application window by creating a new instance of
+ * RosegardenGUIApp
+ */
+ void slotFileNewWindow();
+
+ /**
+ * clears the document in the actual view to reuse it as the new
+ * document
+ */
+ void slotFileNew();
+
+ /**
+ * open a file and load it into the document
+ */
+ void slotFileOpen();
+
+ /**
+ * opens a file from the recent files menu
+ */
+ void slotFileOpenRecent(const KURL&);
+
+ /**
+ * save a document
+ */
+ void slotFileSave();
+
+ /**
+ * save a document by a new filename
+ */
+ bool slotFileSaveAs();
+
+ /**
+ * asks for saving if the file is modified, then closes the actual
+ * file and window
+ */
+ void slotFileClose();
+
+ /**
+ * print the actual file
+ */
+ void slotFilePrint();
+
+ /**
+ * print preview
+ */
+ void slotFilePrintPreview();
+
+ /**
+ * Let the user select a Rosegarden Project file for import
+ */
+ void slotImportProject();
+
+ /**
+ * Let the user select a MIDI file for import
+ */
+ void slotImportMIDI();
+
+ /**
+ * Revert to last loaded file
+ */
+ void slotRevertToSaved();
+
+ /**
+ * Let the user select a Rosegarden 2.1 file for import
+ */
+ void slotImportRG21();
+
+ /**
+ * Select a Hydrogen drum machine file for import
+ */
+ void slotImportHydrogen();
+
+ /**
+ * Let the user select a MIDI file for merge
+ */
+ void slotMerge();
+
+ /**
+ * Let the user select a MIDI file for merge
+ */
+ void slotMergeMIDI();
+
+ /**
+ * Let the user select a MIDI file for merge
+ */
+ void slotMergeRG21();
+
+ /**
+ * Select a Hydrogen drum machine file for merge
+ */
+ void slotMergeHydrogen();
+
+ /**
+ * Let the user export a Rosegarden Project file
+ */
+ void slotExportProject();
+
+ /**
+ * Let the user enter a MIDI file to export to
+ */
+ void slotExportMIDI();
+
+ /**
+ * Let the user enter a Csound scorefile to export to
+ */
+ void slotExportCsound();
+
+ /**
+ * Let the user enter a Mup file to export to
+ */
+ void slotExportMup();
+
+ /**
+ * Let the user enter a LilyPond file to export to
+ */
+ void slotExportLilyPond();
+
+ /**
+ * Export to a temporary file and process
+ */
+ void slotPrintLilyPond();
+ void slotPreviewLilyPond();
+ void slotLilyPondViewProcessExited(KProcess *);
+
+ /**
+ * Let the user enter a MusicXml file to export to
+ */
+ void slotExportMusicXml();
+
+ /**
+ * closes all open windows by calling close() on each memberList
+ * item until the list is empty, then quits the application. If
+ * queryClose() returns false because the user canceled the
+ * saveModified() dialog, the closing breaks.
+ */
+ void slotQuit();
+
+ /**
+ * put the marked text/object into the clipboard and remove * it
+ * from the document
+ */
+ void slotEditCut();
+
+ /**
+ * put the marked text/object into the clipboard
+ */
+ void slotEditCopy();
+
+ /**
+ * paste the clipboard into the document
+ */
+ void slotEditPaste();
+
+ /**
+ * Cut a time range (sections of segments, tempo, and time
+ * signature events within that range).
+ */
+ void slotCutRange();
+
+ /**
+ * Copy a time range.
+ */
+ void slotCopyRange();
+
+ /**
+ * Paste the clipboard at the current pointer position, moving all
+ * subsequent material along to make space.
+ */
+ void slotPasteRange();
+
+ /**
+ * Delete a time range.
+ */
+ void slotDeleteRange();
+
+ /**
+ * Insert a time range (asking the user for a duration).
+ */
+ void slotInsertRange();
+
+ /**
+ * select all segments on all tracks
+ */
+ void slotSelectAll();
+
+ /**
+ * delete selected segments, duh
+ */
+ void slotDeleteSelectedSegments();
+
+ /**
+ * Quantize the selected segments (after asking the user how)
+ */
+ void slotQuantizeSelection();
+
+ /**
+ * Quantize the selected segments by repeating the last iterative quantize
+ */
+ void slotRepeatQuantizeSelection();
+
+ /**
+ * Calculate timing/tempo info based on selected segment
+ */
+ void slotGrooveQuantize();
+
+ /**
+ * Rescale the selected segments by a factor requested from
+ * the user
+ */
+ void slotRescaleSelection();
+
+ /**
+ * Split the selected segments on silences (or new timesig, etc)
+ */
+ void slotAutoSplitSelection();
+
+ /**
+ * Jog a selection left or right by an amount
+ */
+ void slotJogRight();
+ void slotJogLeft();
+
+ /**
+ * Split the selected segments by pitch
+ */
+ void slotSplitSelectionByPitch();
+
+ /**
+ * Split the selected segments by recorded source
+ */
+ void slotSplitSelectionByRecordedSrc();
+
+ /**
+ * Split the selected segments at some time
+ */
+ void slotSplitSelectionAtTime();
+
+ /**
+ * Produce a harmony segment from the selected segments
+ */
+ void slotHarmonizeSelection();
+
+ /**
+ * Set the start times of the selected segments
+ */
+ void slotSetSegmentStartTimes();
+
+ /**
+ * Set the durations of the selected segments
+ */
+ void slotSetSegmentDurations();
+
+ /**
+ * Merge the selected segments
+ */
+ void slotJoinSegments();
+
+ /**
+ * Tempo to Segment length
+ */
+ void slotTempoToSegmentLength();
+ void slotTempoToSegmentLength(QWidget* parent);
+
+ /**
+ * toggle segment labels
+ */
+ void slotToggleSegmentLabels();
+
+ /**
+ * open the default editor for each of the currently-selected segments
+ */
+ void slotEdit();
+
+ /**
+ * open an event list view for each of the currently-selected segments
+ */
+ void slotEditInEventList();
+
+ /**
+ * open a matrix view for each of the currently-selected segments
+ */
+ void slotEditInMatrix();
+
+ /**
+ * open a percussion matrix view for each of the currently-selected segments
+ */
+ void slotEditInPercussionMatrix();
+
+ /**
+ * open a notation view with all currently-selected segments in it
+ */
+ void slotEditAsNotation();
+
+ /**
+ * open a tempo/timesig edit view
+ */
+ void slotEditTempos();
+ void slotEditTempos(timeT openAtTime);
+
+ /**
+ * Edit the tempo - called from a Transport signal
+ */
+ void slotEditTempo();
+ void slotEditTempo(timeT atTime);
+ void slotEditTempo(QWidget *parent);
+ void slotEditTempo(QWidget *parent, timeT atTime);
+
+ /**
+ * Edit the time signature - called from a Transport signal
+ */
+ void slotEditTimeSignature();
+ void slotEditTimeSignature(timeT atTime);
+ void slotEditTimeSignature(QWidget *parent);
+ void slotEditTimeSignature(QWidget *parent, timeT atTime);
+
+ /**
+ * Edit the playback pointer position - called from a Transport signal
+ */
+ void slotEditTransportTime();
+ void slotEditTransportTime(QWidget *parent);
+
+ /**
+ * Change the length of the composition
+ */
+ void slotChangeCompositionLength();
+
+ /**
+ * open a dialog for document properties
+ */
+ void slotEditDocumentProperties();
+
+ /**
+ * Manage MIDI Devices
+ */
+ void slotManageMIDIDevices();
+
+ /**
+ * Manage plugin synths
+ */
+ void slotManageSynths();
+
+ /**
+ * Show the mixers
+ */
+ void slotOpenAudioMixer();
+ void slotOpenMidiMixer();
+
+ /**
+ * Edit Banks/Programs
+ */
+ void slotEditBanks();
+
+ /**
+ * Edit Banks/Programs for a particular device
+ */
+ void slotEditBanks(DeviceId);
+
+ /**
+ * Edit Control Parameters for a particular device
+ */
+ void slotEditControlParameters(DeviceId);
+
+ /**
+ * Edit Document Markers
+ */
+ void slotEditMarkers();
+
+ /**
+ * Not an actual action slot : populates the set_track_instrument sub menu
+ */
+ void slotPopulateTrackInstrumentPopup();
+
+ /**
+ * Remap instruments
+ */
+ void slotRemapInstruments();
+
+ /**
+ * Modify MIDI filters
+ */
+ void slotModifyMIDIFilters();
+
+ /**
+ * Manage Metronome
+ */
+ void slotManageMetronome();
+
+ /**
+ * Save Studio as Default
+ */
+ void slotSaveDefaultStudio();
+
+ /**
+ * Import Studio from File
+ */
+ void slotImportStudio();
+
+ /**
+ * Import Studio from Autoload
+ */
+ void slotImportDefaultStudio();
+
+ /**
+ * Import Studio from File
+ */
+ void slotImportStudioFromFile(const QString &file);
+
+ /**
+ * Send MIDI_RESET to all MIDI devices
+ */
+ void slotResetMidiNetwork();
+
+ /**
+ * toggles the toolbar
+ */
+ void slotToggleToolBar();
+
+ /**
+ * toggles the transport window
+ */
+ void slotToggleTransport();
+
+ /**
+ * hides the transport window
+ */
+ void slotHideTransport();
+
+ /**
+ * toggles the tools toolbar
+ */
+ void slotToggleToolsToolBar();
+
+ /**
+ * toggles the tracks toolbar
+ */
+ void slotToggleTracksToolBar();
+
+ /**
+ * toggles the editors toolbar
+ */
+ void slotToggleEditorsToolBar();
+
+ /**
+ * toggles the transport toolbar
+ */
+ void slotToggleTransportToolBar();
+
+ /**
+ * toggles the zoom toolbar
+ */
+ void slotToggleZoomToolBar();
+
+ /**
+ * toggles the statusbar
+ */
+ void slotToggleStatusBar();
+
+ /**
+ * changes the statusbar contents for the standard label
+ * permanently, used to indicate current actions.
+ *
+ * @param text the text that is displayed in the statusbar
+ */
+ void slotStatusMsg(QString text);
+
+ /**
+ * changes the status message of the whole statusbar for two
+ * seconds, then restores the last status. This is used to display
+ * statusbar messages that give information about actions for
+ * toolbar icons and menuentries.
+ *
+ * @param text the text that is displayed in the statusbar
+ */
+ void slotStatusHelpMsg(QString text);
+
+ /**
+ * enables/disables the transport window
+ */
+ void slotEnableTransport(bool);
+
+ /**
+ * segment select tool
+ */
+ void slotPointerSelected();
+
+ /**
+ * segment eraser tool is selected
+ */
+ void slotEraseSelected();
+
+ /**
+ * segment draw tool is selected
+ */
+ void slotDrawSelected();
+
+ /**
+ * segment move tool is selected
+ */
+ void slotMoveSelected();
+
+ /**
+ * segment resize tool is selected
+ */
+ void slotResizeSelected();
+
+ /*
+ * Segment join tool
+ *
+ */
+ void slotJoinSelected();
+
+ /*
+ * Segment split tool
+ *
+ */
+ void slotSplitSelected();
+
+ /**
+ * Add one new track
+ */
+ void slotAddTrack();
+
+ /**
+ * Add new tracks
+ */
+ void slotAddTracks();
+
+ /*
+ * Delete Tracks
+ */
+ void slotDeleteTrack();
+
+ /*
+ * Modify track position
+ */
+ void slotMoveTrackUp();
+ void slotMoveTrackDown();
+
+ /**
+ * timeT version of the same
+ */
+ void slotSetPointerPosition(timeT t);
+
+ /**
+ * Set the pointer position and start playing (from LoopRuler)
+ */
+ void slotSetPlayPosition(timeT position);
+
+ /**
+ * Set a loop
+ */
+ void slotSetLoop(timeT lhs, timeT rhs);
+
+
+ /**
+ * Update the transport with the bar, beat and unit times for
+ * a given timeT
+ */
+ void slotDisplayBarTime(timeT t);
+
+
+ /**
+ * Transport controls
+ */
+ void slotPlay();
+ void slotStop();
+ void slotRewind();
+ void slotFastforward();
+ void slotRecord();
+ void slotToggleRecord();
+ void slotRewindToBeginning();
+ void slotFastForwardToEnd();
+ void slotJumpToTime(int sec, int usec);
+ void slotStartAtTime(int sec, int usec);
+ void slotRefreshTimeDisplay();
+ void slotToggleTracking();
+
+ /**
+ * Called when the sequencer auxiliary process exits
+ */
+ void slotSequencerExited(KProcess*);
+
+ /// When the transport closes
+ void slotCloseTransport();
+
+ /**
+ * called by RosegardenApplication when session management tells
+ * it to save its state. This is to avoid saving the transport as
+ * a 2nd main window
+ */
+ void slotDeleteTransport();
+
+ /**
+ * Put the GUI into a given Tool edit mode
+ */
+ void slotActivateTool(QString toolName);
+
+ /**
+ * Toggles either the play or record metronome according
+ * to Transport status
+ */
+ void slotToggleMetronome();
+
+ /*
+ * Toggle the solo mode
+ */
+ void slotToggleSolo(bool);
+
+ /**
+ * Set and unset the loop from the transport loop button with
+ * these slots.
+ */
+ void slotSetLoop();
+ void slotUnsetLoop();
+
+ /**
+ * Set and unset the loop start/end time from the transport loop start/stop buttons with
+ * these slots.
+ */
+ void slotSetLoopStart();
+ void slotSetLoopStop();
+
+ /**
+ * Toggle the track labels on the TrackEditor
+ */
+ void slotToggleTrackLabels();
+
+ /**
+ * Toggle the rulers on the TrackEditor
+ * (aka bar buttons)
+ */
+ void slotToggleRulers();
+
+ /**
+ * Toggle the tempo ruler on the TrackEditor
+ */
+ void slotToggleTempoRuler();
+
+ /**
+ * Toggle the chord-name ruler on the TrackEditor
+ */
+ void slotToggleChordNameRuler();
+
+ /**
+ * Toggle the segment canvas previews
+ */
+ void slotTogglePreviews();
+
+ /**
+ * Re-dock the parameters box to its initial position
+ */
+ void slotDockParametersBack();
+
+ /**
+ * The parameters box was closed
+ */
+ void slotParametersClosed();
+
+ /**
+ * The parameters box was docked back
+ */
+ void slotParametersDockedBack(KDockWidget*, KDockWidget::DockPosition);
+
+ /**
+ * Display tip-of-day dialog on demand
+ */
+ void slotShowTip();
+
+ /*
+ * Select Track up or down
+ */
+ void slotTrackUp();
+ void slotTrackDown();
+
+ /**
+ * Mute/Unmute
+ */
+ void slotMuteAllTracks();
+ void slotUnmuteAllTracks();
+ void slotToggleMutedCurrentTrack();
+
+ /**
+ * Toggle arm (record) current track
+ */
+ void slotToggleRecordCurrentTrack();
+
+ /**
+ * save general Options like all bar positions and status as well
+ * as the geometry and the recent file list to the configuration
+ * file
+ */
+ void slotSaveOptions();
+
+ /**
+ * Show the configure dialog
+ */
+ void slotConfigure();
+
+ /**
+ * Show the key mappings
+ *
+ */
+ void slotEditKeys();
+
+ /**
+ * Edit toolbars
+ */
+ void slotEditToolbars();
+
+ /**
+ * Update the toolbars after edition
+ */
+ void slotUpdateToolbars();
+
+ /**
+ * Zoom slider moved
+ */
+ void slotChangeZoom(int index);
+
+ void slotZoomIn();
+ void slotZoomOut();
+
+ /**
+ * Modify tempo
+ */
+ void slotChangeTempo(timeT time,
+ tempoT value,
+ tempoT target,
+ TempoDialog::TempoDialogAction action);
+
+ /**
+ * Move a tempo change
+ */
+ void slotMoveTempo(timeT oldTime,
+ timeT newTime);
+
+ /**
+ * Remove a tempo change
+ */
+ void slotDeleteTempo(timeT time);
+
+ /**
+ * Add marker
+ */
+ void slotAddMarker(timeT time);
+
+ /**
+ * Remove a marker
+ */
+ void slotDeleteMarker(int id,
+ timeT time,
+ QString name,
+ QString description);
+
+ /**
+ * Document modified
+ */
+ void slotDocumentModified(bool modified = true);
+
+
+ /**
+ * This slot is here to be connected to RosegardenGUIView's
+ * stateChange signal. We use a bool for the 2nd arg rather than a
+ * KXMLGUIClient::ReverseStateChange to spare the include of
+ * kxmlguiclient.h just for one typedef.
+ *
+ * Hopefully we'll be able to get rid of this eventually,
+ * I should slip this in KMainWindow for KDE 4.
+ */
+ void slotStateChanged(QString, bool noReverse);
+
+ /**
+ * A command has happened; check the clipboard in case we
+ * need to change state
+ */
+ void slotTestClipboard();
+
+ /**
+ * Show a 'play list' dialog
+ */
+ void slotPlayList();
+
+ /**
+ * Play the requested URL
+ *
+ * Stop current playback, close current document,
+ * open specified document and play it.
+ */
+ void slotPlayListPlay(QString url);
+
+ /**
+ * Call up the online tutorial
+ */
+ void slotTutorial();
+
+ /**
+ * Surf to the bug reporting guidelines
+ */
+ void slotBugGuidelines();
+
+ /**
+ * View the trigger segments manager
+ */
+ void slotManageTriggerSegments();
+
+ /**
+ * View the audio file manager - and some associated actions
+ */
+ void slotAudioManager();
+
+ void slotAddAudioFile(AudioFileId);
+ void slotDeleteAudioFile(AudioFileId);
+ void slotPlayAudioFile(AudioFileId,
+ const RealTime &,
+ const RealTime &);
+ void slotCancelAudioPlayingFile(AudioFileId);
+ void slotDeleteAllAudioFiles();
+
+ /**
+ * Reflect segment deletion from the audio manager
+ */
+ void slotDeleteSegments(const SegmentSelection&);
+
+ void slotRepeatingSegments();
+ void slotRelabelSegments();
+ void slotTransposeSegments();
+
+ /// Panic button pressed
+ void slotPanic();
+
+ // Auto-save
+ //
+ void slotAutoSave();
+
+ // Auto-save update interval changes
+ //
+ void slotUpdateAutoSaveInterval(unsigned int interval);
+
+ // Update the side-bar when the configuration page changes its style.
+ //
+ void slotUpdateSidebarStyle(unsigned int style);
+
+ /**
+ * called when the PlayList is being closed
+ */
+ void slotPlayListClosed();
+
+ /**
+ * called when the BankEditor is being closed
+ */
+ void slotBankEditorClosed();
+
+ /**
+ * called when the Device Manager is being closed
+ */
+ void slotDeviceManagerClosed();
+
+ /**
+ * called when the synth manager is being closed
+ */
+ void slotSynthPluginManagerClosed();
+
+ /**
+ * called when the Mixer is being closed
+ */
+ void slotAudioMixerClosed();
+ void slotMidiMixerClosed();
+
+ /**
+ * when ControlEditor is being closed
+ */
+ void slotControlEditorClosed();
+
+ /**
+ * when MarkerEditor is being closed
+ */
+ void slotMarkerEditorClosed();
+
+ /**
+ * when TempoView is being closed
+ */
+ void slotTempoViewClosed();
+
+ /**
+ * when TriggerManager is being closed
+ */
+ void slotTriggerManagerClosed();
+
+ /**
+ * when AudioManagerDialog is being closed
+ */
+ void slotAudioManagerClosed();
+
+ /**
+ * Update the pointer position from the sequencer mmapped file when playing
+ */
+ void slotUpdatePlaybackPosition();
+
+ /**
+ * Update the CPU level meter
+ */
+ void slotUpdateCPUMeter(bool playing);
+
+ /**
+ * Update the monitor levels from the sequencer mmapped file when not playing
+ * (slotUpdatePlaybackPosition does this among other things when playing)
+ */
+ void slotUpdateMonitoring();
+
+ /**
+ * Create a plugin dialog for a given instrument and slot, or
+ * raise an exising one.
+ */
+ void slotShowPluginDialog(QWidget *parent,
+ InstrumentId instrument,
+ int index);
+
+ void slotPluginSelected(InstrumentId instrument,
+ int index, int plugin);
+
+ /**
+ * An external GUI has requested a port change.
+ */
+ void slotChangePluginPort(InstrumentId instrument,
+ int index, int portIndex, float value);
+
+ /**
+ * Our internal GUI has made a port change -- the
+ * PluginPortInstance already contains the new value, but we need
+ * to inform the sequencer and update external GUIs.
+ */
+ void slotPluginPortChanged(InstrumentId instrument,
+ int index, int portIndex);
+
+ /**
+ * An external GUI has requested a program change.
+ */
+ void slotChangePluginProgram(InstrumentId instrument,
+ int index, QString program);
+
+ /**
+ * Our internal GUI has made a program change -- the
+ * AudioPluginInstance already contains the new program, but we
+ * need to inform the sequencer, update external GUIs, and update
+ * the port values for the new program.
+ */
+ void slotPluginProgramChanged(InstrumentId instrument,
+ int index);
+
+ /**
+ * An external GUI has requested a configure call. (This can only
+ * happen from an external GUI, we have no way to manage these
+ * internally.)
+ */
+ void slotChangePluginConfiguration(InstrumentId, int index,
+ bool global, QString key, QString value);
+ void slotPluginDialogDestroyed(InstrumentId instrument,
+ int index);
+ void slotPluginBypassed(InstrumentId,
+ int index, bool bypassed);
+
+ void slotShowPluginGUI(InstrumentId, int index);
+ void slotStopPluginGUI(InstrumentId, int index);
+ void slotPluginGUIExited(InstrumentId, int index);
+
+ void slotDocumentDevicesResyncd();
+
+ void slotTestStartupTester();
+
+ void slotDebugDump();
+
+ /**
+ * Enable or disable the internal MIDI Thru routing.
+ *
+ * This policy is implemented at the sequencer side, controlled
+ * by this flag and also by the MIDI Thru filters.
+ *
+ * @see ControlBlock::isMidiRoutingEnabled()
+ * @see RosegardenSequencerApp::processAsynchronousEvents()
+ * @see RosegardenSequencerApp::processRecordedEvents()
+ */
+ void slotEnableMIDIThruRouting();
+
+ void slotShowToolHelp(const QString &);
+
+ void slotNewerVersionAvailable(QString);
+
+ void slotSetQuickMarker();
+
+ void slotJumpToQuickMarker();
+
+private:
+
+
+ //--------------- Data members ---------------------------------
+
+ bool m_actionsSetup;
+
+ KRecentFilesAction* m_fileRecent;
+
+ /**
+ * view is the main widget which represents your working area. The
+ * View class should handle all events of the view widget. It is
+ * kept empty so you can create your view according to your
+ * application's needs by changing the view class.
+ */
+ RosegardenGUIView* m_view;
+ RosegardenGUIView* m_swapView;
+
+ KDockWidget* m_mainDockWidget;
+ KDockWidget* m_dockLeft;
+
+ /**
+ * doc represents your actual document and is created only
+ * once. It keeps information such as filename and does the
+ * serialization of your files.
+ */
+ RosegardenGUIDoc* m_doc;
+
+ /**
+ * KAction pointers to enable/disable actions
+ */
+ KRecentFilesAction* m_fileOpenRecent;
+
+ KToggleAction* m_viewToolBar;
+ KToggleAction* m_viewToolsToolBar;
+ KToggleAction* m_viewTracksToolBar;
+ KToggleAction* m_viewEditorsToolBar;
+ KToggleAction* m_viewZoomToolBar;
+ KToggleAction* m_viewStatusBar;
+ KToggleAction* m_viewTransport;
+ KToggleAction* m_viewTransportToolBar;
+ KToggleAction* m_viewTrackLabels;
+ KToggleAction* m_viewRulers;
+ KToggleAction* m_viewTempoRuler;
+ KToggleAction* m_viewChordNameRuler;
+ KToggleAction* m_viewPreviews;
+ KToggleAction* m_viewSegmentLabels;
+ KToggleAction* m_enableMIDIrouting;
+
+ KAction *m_playTransport;
+ KAction *m_stopTransport;
+ KAction *m_rewindTransport;
+ KAction *m_ffwdTransport;
+ KAction *m_recordTransport;
+ KAction *m_rewindEndTransport;
+ KAction *m_ffwdEndTransport;
+
+ KProcess* m_sequencerProcess;
+ bool m_sequencerCheckedIn;
+
+#ifdef HAVE_LIBJACK
+ KProcess* m_jackProcess;
+#endif // HAVE_LIBJACK
+
+ ZoomSlider<double> *m_zoomSlider;
+ QLabel *m_zoomLabel;
+
+ ProgressBar *m_progressBar;
+
+ // SequenceManager
+ //
+ SequenceManager *m_seqManager;
+
+ // Transport dialog pointer
+ //
+ TransportDialog *m_transport;
+
+ // Dialogs which depend on the document
+
+ // Audio file manager
+ //
+ AudioManagerDialog *m_audioManagerDialog;
+
+ bool m_originatingJump;
+
+ // Use these in conjucntion with the loop button to
+ // remember where a loop was if we've ever set one.
+ timeT m_storedLoopStart;
+ timeT m_storedLoopEnd;
+
+ bool m_useSequencer;
+ bool m_dockVisible;
+
+ AudioPluginManager *m_pluginManager;
+
+ QTimer* m_autoSaveTimer;
+
+ Clipboard *m_clipboard;
+
+ SegmentParameterBox *m_segmentParameterBox;
+ InstrumentParameterBox *m_instrumentParameterBox;
+ TrackParameterBox *m_trackParameterBox;
+
+ PlayListDialog *m_playList;
+ DeviceManagerDialog *m_deviceManager;
+ SynthPluginManagerDialog *m_synthManager;
+ AudioMixerWindow *m_audioMixer;
+ MidiMixerWindow *m_midiMixer;
+ BankEditorDialog *m_bankEditor;
+ MarkerEditor *m_markerEditor;
+ TempoView *m_tempoView;
+ TriggerSegmentManager *m_triggerSegmentManager;
+ std::set<ControlEditorDialog *> m_controlEditors;
+ std::map<int, AudioPluginDialog*> m_pluginDialogs;
+#ifdef HAVE_LIBLO
+ AudioPluginOSCGUIManager *m_pluginGUIManager;
+#endif
+
+ static RosegardenGUIApp *m_myself;
+
+ static std::map<KProcess *, KTempFile *> m_lilyTempFileMap;
+
+ // Used to fetch the current sequencer position from the mmapped sequencer information file
+ //
+ QTimer *m_playTimer;
+ QTimer *m_stopTimer;
+
+ StartupTester *m_startupTester;
+
+ bool m_firstRun;
+ bool m_haveAudioImporter;
+
+ RosegardenParameterArea *m_parameterArea;
+
+ KAction *m_setQuickMarkerAction;
+ KAction *m_jumpToQuickMarkerAction;
+
+#ifdef HAVE_LIRC
+ LircClient *m_lircClient;
+ LircCommander *m_lircCommander;
+#endif
+};
+
+
+}
+
+#endif
diff --git a/src/gui/application/RosegardenGUIView.cpp b/src/gui/application/RosegardenGUIView.cpp
new file mode 100644
index 0000000..c61b51e
--- /dev/null
+++ b/src/gui/application/RosegardenGUIView.cpp
@@ -0,0 +1,2041 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "RosegardenGUIView.h"
+#include <kapplication.h>
+
+#include "sound/Midi.h"
+#include "gui/editors/segment/TrackButtons.h"
+#include <klocale.h>
+#include "misc/Debug.h"
+#include "misc/Strings.h"
+#include "document/ConfigGroups.h"
+#include "gui/application/RosegardenDCOP.h"
+#include "base/AudioLevel.h"
+#include "base/Composition.h"
+#include "base/Instrument.h"
+#include "base/MidiDevice.h"
+#include "base/MidiProgram.h"
+#include "base/NotationTypes.h"
+#include "base/RealTime.h"
+#include "base/RulerScale.h"
+#include "base/Segment.h"
+#include "base/Selection.h"
+#include "base/Studio.h"
+#include "base/Track.h"
+#include "commands/segment/AudioSegmentAutoSplitCommand.h"
+#include "commands/segment/AudioSegmentInsertCommand.h"
+#include "commands/segment/SegmentSingleRepeatToCopyCommand.h"
+#include "document/MultiViewCommandHistory.h"
+#include "document/RosegardenGUIDoc.h"
+#include "RosegardenApplication.h"
+#include "gui/configuration/GeneralConfigurationPage.h"
+#include "gui/configuration/AudioConfigurationPage.h"
+#include "gui/dialogs/AudioSplitDialog.h"
+#include "gui/dialogs/AudioManagerDialog.h"
+#include "gui/dialogs/DocumentConfigureDialog.h"
+#include "gui/dialogs/TempoDialog.h"
+#include "gui/editors/eventlist/EventView.h"
+#include "gui/editors/matrix/MatrixView.h"
+#include "gui/editors/notation/NotationView.h"
+#include "gui/editors/parameters/InstrumentParameterBox.h"
+#include "gui/editors/parameters/SegmentParameterBox.h"
+#include "gui/editors/parameters/TrackParameterBox.h"
+#include "gui/editors/segment/segmentcanvas/CompositionView.h"
+#include "gui/editors/segment/segmentcanvas/SegmentSelector.h"
+#include "gui/editors/segment/TrackEditor.h"
+#include "gui/seqmanager/SequenceManager.h"
+#include "gui/seqmanager/SequencerMapper.h"
+#include "gui/rulers/ChordNameRuler.h"
+#include "gui/rulers/LoopRuler.h"
+#include "gui/rulers/TempoRuler.h"
+#include "gui/rulers/StandardRuler.h"
+#include "gui/widgets/ProgressDialog.h"
+#include "gui/widgets/CurrentProgressDialog.h"
+#include "RosegardenGUIApp.h"
+#include "SetWaitCursor.h"
+#include "sound/AudioFile.h"
+#include "sound/AudioFileManager.h"
+#include "sound/MappedEvent.h"
+#include <kcommand.h>
+#include <kconfig.h>
+#include <kmessagebox.h>
+#include <kprocess.h>
+#include <qapplication.h>
+#include <qcursor.h>
+#include <qdialog.h>
+#include <qfileinfo.h>
+#include <qobject.h>
+#include <qstring.h>
+#include <qvbox.h>
+#include <qwidget.h>
+
+
+namespace Rosegarden
+{
+
+// Use this to define the basic unit of the main QCanvas size.
+//
+// This apparently arbitrary figure is what we think is an
+// appropriate width in pixels for a 4/4 bar. Beware of making it
+// too narrow, as shorter bars will be proportionally smaller --
+// the visual difference between 2/4 and 4/4 is perhaps greater
+// than it sounds.
+//
+static double barWidth44 = 100.0;
+
+const QWidget *RosegardenGUIView::m_lastActiveMainWindow = 0;
+
+// This is the maximum number of matrix, event view or percussion
+// matrix editors to open in a single operation (not the maximum that
+// can be open at a time -- there isn't one)
+//
+static int maxEditorsToOpen = 8;
+
+RosegardenGUIView::RosegardenGUIView(bool showTrackLabels,
+ SegmentParameterBox* segmentParameterBox,
+ InstrumentParameterBox* instrumentParameterBox,
+ TrackParameterBox* trackParameterBox,
+ QWidget *parent,
+ const char* /*name*/)
+ : QVBox(parent),
+ m_rulerScale(0),
+ m_trackEditor(0),
+ m_segmentParameterBox(segmentParameterBox),
+ m_instrumentParameterBox(instrumentParameterBox),
+ m_trackParameterBox(trackParameterBox)
+{
+ RosegardenGUIDoc* doc = getDocument();
+ Composition *comp = &doc->getComposition();
+
+ double unitsPerPixel =
+ TimeSignature(4, 4).getBarDuration() / barWidth44;
+ m_rulerScale = new SimpleRulerScale(comp, 0, unitsPerPixel);
+
+ // Construct the trackEditor first so we can then
+ // query it for placement information
+ //
+ m_trackEditor = new TrackEditor(doc, this,
+ m_rulerScale, showTrackLabels, unitsPerPixel, this /*hbox*/);
+
+ connect(m_trackEditor->getSegmentCanvas(),
+ SIGNAL(editSegment(Segment*)),
+ SLOT(slotEditSegment(Segment*)));
+
+ connect(m_trackEditor->getSegmentCanvas(),
+ SIGNAL(editSegmentNotation(Segment*)),
+ SLOT(slotEditSegmentNotation(Segment*)));
+
+ connect(m_trackEditor->getSegmentCanvas(),
+ SIGNAL(editSegmentMatrix(Segment*)),
+ SLOT(slotEditSegmentMatrix(Segment*)));
+
+ connect(m_trackEditor->getSegmentCanvas(),
+ SIGNAL(editSegmentAudio(Segment*)),
+ SLOT(slotEditSegmentAudio(Segment*)));
+
+ connect(m_trackEditor->getSegmentCanvas(),
+ SIGNAL(audioSegmentAutoSplit(Segment*)),
+ SLOT(slotSegmentAutoSplit(Segment*)));
+
+ connect(m_trackEditor->getSegmentCanvas(),
+ SIGNAL(editSegmentEventList(Segment*)),
+ SLOT(slotEditSegmentEventList(Segment*)));
+
+ connect(m_trackEditor->getSegmentCanvas(),
+ SIGNAL(editRepeat(Segment*, timeT)),
+ SLOT(slotEditRepeat(Segment*, timeT)));
+
+ connect(m_trackEditor->getSegmentCanvas(),
+ SIGNAL(setPointerPosition(timeT)),
+ doc, SLOT(slotSetPointerPosition(timeT)));
+
+ connect(m_trackEditor,
+ SIGNAL(droppedDocument(QString)),
+ parent,
+ SLOT(slotOpenDroppedURL(QString)));
+
+ connect(m_trackEditor,
+ SIGNAL(droppedAudio(QString)),
+ this,
+ SLOT(slotDroppedAudio(QString)));
+
+ connect(m_trackEditor,
+ SIGNAL(droppedNewAudio(QString)),
+ this,
+ SLOT(slotDroppedNewAudio(QString)));
+
+ connect(m_instrumentParameterBox,
+ SIGNAL(changeInstrumentLabel(InstrumentId, QString)),
+ this,
+ SLOT(slotChangeInstrumentLabel(InstrumentId, QString)));
+
+ connect(m_instrumentParameterBox,
+ SIGNAL(changeInstrumentLabel(InstrumentId, QString)),
+ m_trackParameterBox,
+ SLOT(slotInstrumentLabelChanged(InstrumentId, QString)));
+
+ connect(m_trackEditor->getTrackButtons(),
+ SIGNAL(nameChanged()),
+ m_trackParameterBox,
+ SLOT(slotSelectedTrackNameChanged()));
+
+ connect(m_trackEditor->getTrackButtons(),
+ SIGNAL(instrumentSelected(int)),
+ m_trackParameterBox,
+ SLOT(slotUpdateControls(int)));
+
+ connect(m_trackParameterBox,
+ SIGNAL(instrumentSelected(TrackId, int)),
+ m_trackEditor->getTrackButtons(),
+ SLOT(slotTrackInstrumentSelection(TrackId, int)));
+
+ connect(this, SIGNAL(controllerDeviceEventReceived(MappedEvent *, const void *)),
+ this, SLOT(slotControllerDeviceEventReceived(MappedEvent *, const void *)));
+
+ if (doc) {
+ /* signal no longer exists
+ connect(doc, SIGNAL(recordingSegmentUpdated(Segment *,
+ timeT)),
+ this, SLOT(slotUpdateRecordingSegment(Segment *,
+ timeT)));
+ */
+
+ QObject::connect
+ (getCommandHistory(), SIGNAL(commandExecuted()),
+ m_trackEditor->getSegmentCanvas(), SLOT(slotUpdateSegmentsDrawBuffer()));
+ }
+}
+
+RosegardenGUIView::~RosegardenGUIView()
+{
+ RG_DEBUG << "~RosegardenGUIView()" << endl;
+ delete m_rulerScale;
+}
+
+RosegardenGUIDoc*
+RosegardenGUIView::getDocument() const
+{
+ return RosegardenGUIApp::self()->getDocument();
+}
+
+void RosegardenGUIView::print(Composition* p, bool previewOnly)
+{
+ SetWaitCursor waitCursor;
+
+ std::vector<Segment *> segmentsToEdit;
+
+ for (Composition::iterator i = p->begin(); i != p->end(); ++i) {
+ if ((*i)->getType() != Segment::Audio) {
+ segmentsToEdit.push_back(*i);
+ }
+ }
+
+ if (segmentsToEdit.empty()) {
+ KMessageBox::sorry(this, i18n("No non-audio segments in composition"));
+ return ;
+ }
+
+ NotationView *notationView = new NotationView(getDocument(),
+ segmentsToEdit,
+ this,
+ (NotationView *)0);
+
+ if (!notationView->isOK()) {
+ RG_DEBUG << "RosegardenGUIView::print : operation cancelled" << endl;
+ delete notationView;
+ return ;
+ }
+
+ notationView->print(previewOnly);
+
+ delete notationView;
+}
+
+void RosegardenGUIView::selectTool(const QString toolName)
+{
+ m_trackEditor->getSegmentCanvas()->slotSetTool(toolName);
+}
+
+bool
+RosegardenGUIView::haveSelection()
+{
+ return m_trackEditor->getSegmentCanvas()->haveSelection();
+}
+
+SegmentSelection
+RosegardenGUIView::getSelection()
+{
+ return m_trackEditor->getSegmentCanvas()->getSelectedSegments();
+}
+
+void RosegardenGUIView::updateSelectionContents()
+{
+ m_trackEditor->getSegmentCanvas()->updateSelectionContents();
+}
+
+/* hjj: WHAT DO DO WITH THIS ?
+void
+RosegardenGUIView::slotEditMetadata(QString name)
+{
+ const QWidget *ww = dynamic_cast<const QWidget *>(sender());
+ QWidget *w = const_cast<QWidget *>(ww);
+
+ DocumentConfigureDialog *configDlg =
+ new DocumentConfigureDialog(getDocument(), w ? w : this);
+
+ configDlg->selectMetadata(name);
+
+ configDlg->show();
+}
+*/
+
+void RosegardenGUIView::slotEditSegment(Segment* segment)
+{
+ Segment::SegmentType type = Segment::Internal;
+
+ if (segment) {
+ type = segment->getType();
+ } else {
+ if (haveSelection()) {
+
+ bool haveType = false;
+
+ SegmentSelection selection = getSelection();
+ for (SegmentSelection::iterator i = selection.begin();
+ i != selection.end(); ++i) {
+
+ Segment::SegmentType myType = (*i)->getType();
+ if (haveType) {
+ if (myType != type) {
+ KMessageBox::sorry(this, i18n("Selection must contain only audio or non-audio segments"));
+ return ;
+ }
+ } else {
+ type = myType;
+ haveType = true;
+ segment = *i;
+ }
+ }
+ } else
+ return ;
+ }
+
+ if (type == Segment::Audio) {
+ slotEditSegmentAudio(segment);
+ } else {
+
+ KConfig* config = kapp->config();
+ config->setGroup(GeneralOptionsConfigGroup);
+ GeneralConfigurationPage::DoubleClickClient
+ client =
+ (GeneralConfigurationPage::DoubleClickClient)
+ (config->readUnsignedNumEntry("doubleclickclient",
+ (unsigned int)GeneralConfigurationPage::NotationView));
+
+ if (client == GeneralConfigurationPage::MatrixView) {
+
+ bool isPercussion = false;
+ Track *track = getDocument()->getComposition().getTrackById
+ (segment->getTrack());
+ if (track) {
+ InstrumentId iid = track->getInstrument();
+ Instrument *instrument =
+ getDocument()->getStudio().getInstrumentById(iid);
+ if (instrument && instrument->isPercussion()) isPercussion = true;
+ }
+
+ if (isPercussion) {
+ slotEditSegmentPercussionMatrix(segment);
+ } else {
+ slotEditSegmentMatrix(segment);
+ }
+
+ } else if (client == GeneralConfigurationPage::EventView) {
+ slotEditSegmentEventList(segment);
+ } else {
+ slotEditSegmentNotation(segment);
+ }
+ }
+}
+
+void RosegardenGUIView::slotEditRepeat(Segment *segment,
+ timeT time)
+{
+ SegmentSingleRepeatToCopyCommand *command =
+ new SegmentSingleRepeatToCopyCommand(segment, time);
+ slotAddCommandToHistory(command);
+}
+
+void RosegardenGUIView::slotEditSegmentNotation(Segment* p)
+{
+ SetWaitCursor waitCursor;
+ std::vector<Segment *> segmentsToEdit;
+
+ RG_DEBUG << "\n\n\n\nRosegardenGUIView::slotEditSegmentNotation: p is " << p << endl;
+
+ // The logic here is: If we're calling for this operation to
+ // happen on a particular segment, then open that segment and if
+ // it's part of a selection open all other selected segments too.
+ // If we're not calling for any particular segment, then open all
+ // selected segments if there are any.
+
+ if (haveSelection()) {
+
+ SegmentSelection selection = getSelection();
+
+ if (!p || (selection.find(p) != selection.end())) {
+ for (SegmentSelection::iterator i = selection.begin();
+ i != selection.end(); ++i) {
+ if ((*i)->getType() != Segment::Audio) {
+ segmentsToEdit.push_back(*i);
+ }
+ }
+ } else {
+ if (p->getType() != Segment::Audio) {
+ segmentsToEdit.push_back(p);
+ }
+ }
+
+ } else if (p) {
+ if (p->getType() != Segment::Audio) {
+ segmentsToEdit.push_back(p);
+ }
+ } else {
+ return ;
+ }
+
+ if (segmentsToEdit.empty()) {
+ KMessageBox::sorry(this, i18n("No non-audio segments selected"));
+ return ;
+ }
+
+ slotEditSegmentsNotation(segmentsToEdit);
+}
+
+void RosegardenGUIView::slotEditSegmentsNotation(std::vector<Segment *> segmentsToEdit)
+{
+ NotationView *view = createNotationView(segmentsToEdit);
+ if (view)
+ view->show();
+}
+
+NotationView *
+RosegardenGUIView::createNotationView(std::vector<Segment *> segmentsToEdit)
+{
+ NotationView *notationView =
+ new NotationView(getDocument(), segmentsToEdit, this, true);
+
+ if (!notationView->isOK()) {
+ RG_DEBUG << "slotEditSegmentNotation : operation cancelled" << endl;
+ delete notationView;
+ return 0;
+ }
+
+ // For tempo changes (ugh -- it'd be nicer to make a tempo change
+ // command that could interpret all this stuff from the dialog)
+ //
+ connect(notationView, SIGNAL(changeTempo(timeT,
+ tempoT,
+ tempoT,
+ TempoDialog::TempoDialogAction)),
+ RosegardenGUIApp::self(), SLOT(slotChangeTempo(timeT,
+ tempoT,
+ tempoT,
+ TempoDialog::TempoDialogAction)));
+
+
+ connect(notationView, SIGNAL(windowActivated()),
+ this, SLOT(slotActiveMainWindowChanged()));
+
+ connect(notationView, SIGNAL(selectTrack(int)),
+ this, SLOT(slotSelectTrackSegments(int)));
+
+ connect(notationView, SIGNAL(play()),
+ RosegardenGUIApp::self(), SLOT(slotPlay()));
+ connect(notationView, SIGNAL(stop()),
+ RosegardenGUIApp::self(), SLOT(slotStop()));
+ connect(notationView, SIGNAL(fastForwardPlayback()),
+ RosegardenGUIApp::self(), SLOT(slotFastforward()));
+ connect(notationView, SIGNAL(rewindPlayback()),
+ RosegardenGUIApp::self(), SLOT(slotRewind()));
+ connect(notationView, SIGNAL(fastForwardPlaybackToEnd()),
+ RosegardenGUIApp::self(), SLOT(slotFastForwardToEnd()));
+ connect(notationView, SIGNAL(rewindPlaybackToBeginning()),
+ RosegardenGUIApp::self(), SLOT(slotRewindToBeginning()));
+ connect(notationView, SIGNAL(panic()),
+ RosegardenGUIApp::self(), SLOT(slotPanic()));
+
+ connect(notationView, SIGNAL(saveFile()),
+ RosegardenGUIApp::self(), SLOT(slotFileSave()));
+ connect(notationView, SIGNAL(jumpPlaybackTo(timeT)),
+ getDocument(), SLOT(slotSetPointerPosition(timeT)));
+ connect(notationView, SIGNAL(openInNotation(std::vector<Segment *>)),
+ this, SLOT(slotEditSegmentsNotation(std::vector<Segment *>)));
+ connect(notationView, SIGNAL(openInMatrix(std::vector<Segment *>)),
+ this, SLOT(slotEditSegmentsMatrix(std::vector<Segment *>)));
+ connect(notationView, SIGNAL(openInPercussionMatrix(std::vector<Segment *>)),
+ this, SLOT(slotEditSegmentsPercussionMatrix(std::vector<Segment *>)));
+ connect(notationView, SIGNAL(openInEventList(std::vector<Segment *>)),
+ this, SLOT(slotEditSegmentsEventList(std::vector<Segment *>)));
+/* hjj: WHAT DO DO WITH THIS ?
+ connect(notationView, SIGNAL(editMetadata(QString)),
+ this, SLOT(slotEditMetadata(QString)));
+*/
+ connect(notationView, SIGNAL(editTriggerSegment(int)),
+ this, SLOT(slotEditTriggerSegment(int)));
+ connect(notationView, SIGNAL(staffLabelChanged(TrackId, QString)),
+ this, SLOT(slotChangeTrackLabel(TrackId, QString)));
+ connect(notationView, SIGNAL(toggleSolo(bool)),
+ RosegardenGUIApp::self(), SLOT(slotToggleSolo(bool)));
+ connect(notationView, SIGNAL(editTimeSignature(timeT)),
+ RosegardenGUIApp::self(), SLOT(slotEditTempos(timeT)));
+
+ SequenceManager *sM = getDocument()->getSequenceManager();
+
+ connect(sM, SIGNAL(insertableNoteOnReceived(int, int)),
+ notationView, SLOT(slotInsertableNoteOnReceived(int, int)));
+ connect(sM, SIGNAL(insertableNoteOffReceived(int, int)),
+ notationView, SLOT(slotInsertableNoteOffReceived(int, int)));
+
+ connect(notationView, SIGNAL(stepByStepTargetRequested(QObject *)),
+ this, SIGNAL(stepByStepTargetRequested(QObject *)));
+ connect(this, SIGNAL(stepByStepTargetRequested(QObject *)),
+ notationView, SLOT(slotStepByStepTargetRequested(QObject *)));
+ connect(RosegardenGUIApp::self(), SIGNAL(compositionStateUpdate()),
+ notationView, SLOT(slotCompositionStateUpdate()));
+ connect(this, SIGNAL(compositionStateUpdate()),
+ notationView, SLOT(slotCompositionStateUpdate()));
+
+ // Encourage the notation view window to open to the same
+ // interval as the current segment view
+ if (m_trackEditor->getSegmentCanvas()->horizontalScrollBar()->value() > 1) { // don't scroll unless we need to
+ // first find the time at the center of the visible segment canvas
+ int centerX = (int)(m_trackEditor->getSegmentCanvas()->contentsX() +
+ m_trackEditor->getSegmentCanvas()->visibleWidth() / 2);
+ timeT centerSegmentView = m_trackEditor->getRulerScale()->getTimeForX(centerX);
+ // then scroll the notation view to that time, "localized" for the current segment
+ notationView->scrollToTime(centerSegmentView);
+ notationView->updateView();
+ }
+
+ return notationView;
+}
+
+void RosegardenGUIView::slotEditSegmentMatrix(Segment* p)
+{
+ SetWaitCursor waitCursor;
+
+ std::vector<Segment *> segmentsToEdit;
+
+ // unlike notation, if we're calling for this on a particular
+ // segment we don't open all the other selected segments as well
+ // (fine in notation because they're in a single window)
+
+ if (p) {
+ if (p->getType() != Segment::Audio) {
+ segmentsToEdit.push_back(p);
+ }
+ } else {
+ int count = 0;
+ SegmentSelection selection = getSelection();
+ for (SegmentSelection::iterator i = selection.begin();
+ i != selection.end(); ++i) {
+ if ((*i)->getType() != Segment::Audio) {
+ slotEditSegmentMatrix(*i);
+ if (++count == maxEditorsToOpen)
+ break;
+ }
+ }
+ return ;
+ }
+
+ if (segmentsToEdit.empty()) {
+ KMessageBox::sorry(this, i18n("No non-audio segments selected"));
+ return ;
+ }
+
+ slotEditSegmentsMatrix(segmentsToEdit);
+}
+
+void RosegardenGUIView::slotEditSegmentPercussionMatrix(Segment* p)
+{
+ SetWaitCursor waitCursor;
+
+ std::vector<Segment *> segmentsToEdit;
+
+ // unlike notation, if we're calling for this on a particular
+ // segment we don't open all the other selected segments as well
+ // (fine in notation because they're in a single window)
+
+ if (p) {
+ if (p->getType() != Segment::Audio) {
+ segmentsToEdit.push_back(p);
+ }
+ } else {
+ int count = 0;
+ SegmentSelection selection = getSelection();
+ for (SegmentSelection::iterator i = selection.begin();
+ i != selection.end(); ++i) {
+ if ((*i)->getType() != Segment::Audio) {
+ slotEditSegmentPercussionMatrix(*i);
+ if (++count == maxEditorsToOpen)
+ break;
+ }
+ }
+ return ;
+ }
+
+ if (segmentsToEdit.empty()) {
+ KMessageBox::sorry(this, i18n("No non-audio segments selected"));
+ return ;
+ }
+
+ slotEditSegmentsPercussionMatrix(segmentsToEdit);
+}
+
+void RosegardenGUIView::slotEditSegmentsMatrix(std::vector<Segment *> segmentsToEdit)
+{
+ int count = 0;
+ for (std::vector<Segment *>::iterator i = segmentsToEdit.begin();
+ i != segmentsToEdit.end(); ++i) {
+ std::vector<Segment *> tmpvec;
+ tmpvec.push_back(*i);
+ MatrixView *view = createMatrixView(tmpvec, false);
+ if (view) {
+ view->show();
+ if (++count == maxEditorsToOpen)
+ break;
+ }
+ }
+}
+
+void RosegardenGUIView::slotEditSegmentsPercussionMatrix(std::vector<Segment *> segmentsToEdit)
+{
+ int count = 0;
+ for (std::vector<Segment *>::iterator i = segmentsToEdit.begin();
+ i != segmentsToEdit.end(); ++i) {
+ std::vector<Segment *> tmpvec;
+ tmpvec.push_back(*i);
+ MatrixView *view = createMatrixView(tmpvec, true);
+ if (view) {
+ view->show();
+ if (++count == maxEditorsToOpen)
+ break;
+ }
+ }
+}
+
+MatrixView *
+RosegardenGUIView::createMatrixView(std::vector<Segment *> segmentsToEdit, bool drumMode)
+{
+ MatrixView *matrixView = new MatrixView(getDocument(),
+ segmentsToEdit,
+ this,
+ drumMode);
+
+ // For tempo changes (ugh -- it'd be nicer to make a tempo change
+ // command that could interpret all this stuff from the dialog)
+ //
+ connect(matrixView, SIGNAL(changeTempo(timeT,
+ tempoT,
+ tempoT,
+ TempoDialog::TempoDialogAction)),
+ RosegardenGUIApp::self(), SLOT(slotChangeTempo(timeT,
+ tempoT,
+ tempoT,
+ TempoDialog::TempoDialogAction)));
+
+ connect(matrixView, SIGNAL(windowActivated()),
+ this, SLOT(slotActiveMainWindowChanged()));
+
+ connect(matrixView, SIGNAL(selectTrack(int)),
+ this, SLOT(slotSelectTrackSegments(int)));
+
+ connect(matrixView, SIGNAL(play()),
+ RosegardenGUIApp::self(), SLOT(slotPlay()));
+ connect(matrixView, SIGNAL(stop()),
+ RosegardenGUIApp::self(), SLOT(slotStop()));
+ connect(matrixView, SIGNAL(fastForwardPlayback()),
+ RosegardenGUIApp::self(), SLOT(slotFastforward()));
+ connect(matrixView, SIGNAL(rewindPlayback()),
+ RosegardenGUIApp::self(), SLOT(slotRewind()));
+ connect(matrixView, SIGNAL(fastForwardPlaybackToEnd()),
+ RosegardenGUIApp::self(), SLOT(slotFastForwardToEnd()));
+ connect(matrixView, SIGNAL(rewindPlaybackToBeginning()),
+ RosegardenGUIApp::self(), SLOT(slotRewindToBeginning()));
+ connect(matrixView, SIGNAL(panic()),
+ RosegardenGUIApp::self(), SLOT(slotPanic()));
+
+ connect(matrixView, SIGNAL(saveFile()),
+ RosegardenGUIApp::self(), SLOT(slotFileSave()));
+ connect(matrixView, SIGNAL(jumpPlaybackTo(timeT)),
+ getDocument(), SLOT(slotSetPointerPosition(timeT)));
+ connect(matrixView, SIGNAL(openInNotation(std::vector<Segment *>)),
+ this, SLOT(slotEditSegmentsNotation(std::vector<Segment *>)));
+ connect(matrixView, SIGNAL(openInMatrix(std::vector<Segment *>)),
+ this, SLOT(slotEditSegmentsMatrix(std::vector<Segment *>)));
+ connect(matrixView, SIGNAL(openInEventList(std::vector<Segment *>)),
+ this, SLOT(slotEditSegmentsEventList(std::vector<Segment *>)));
+ connect(matrixView, SIGNAL(editTriggerSegment(int)),
+ this, SLOT(slotEditTriggerSegment(int)));
+ connect(matrixView, SIGNAL(toggleSolo(bool)),
+ RosegardenGUIApp::self(), SLOT(slotToggleSolo(bool)));
+ connect(matrixView, SIGNAL(editTimeSignature(timeT)),
+ RosegardenGUIApp::self(), SLOT(slotEditTempos(timeT)));
+
+ SequenceManager *sM = getDocument()->getSequenceManager();
+
+ connect(sM, SIGNAL(insertableNoteOnReceived(int, int)),
+ matrixView, SLOT(slotInsertableNoteOnReceived(int, int)));
+ connect(sM, SIGNAL(insertableNoteOffReceived(int, int)),
+ matrixView, SLOT(slotInsertableNoteOffReceived(int, int)));
+
+ connect(matrixView, SIGNAL(stepByStepTargetRequested(QObject *)),
+ this, SIGNAL(stepByStepTargetRequested(QObject *)));
+ connect(this, SIGNAL(stepByStepTargetRequested(QObject *)),
+ matrixView, SLOT(slotStepByStepTargetRequested(QObject *)));
+ connect(RosegardenGUIApp::self(), SIGNAL(compositionStateUpdate()),
+ matrixView, SLOT(slotCompositionStateUpdate()));
+ connect(this, SIGNAL(compositionStateUpdate()),
+ matrixView, SLOT(slotCompositionStateUpdate()));
+ connect(this,
+ SIGNAL(instrumentLevelsChanged(InstrumentId,
+ const LevelInfo &)),
+ matrixView,
+ SLOT(slotInstrumentLevelsChanged(InstrumentId,
+ const LevelInfo &)));
+
+ // Encourage the matrix view window to open to the same
+ // interval as the current segment view
+ if (m_trackEditor->getSegmentCanvas()->horizontalScrollBar()->value() > 1) { // don't scroll unless we need to
+ // first find the time at the center of the visible segment canvas
+ int centerX = (int)(m_trackEditor->getSegmentCanvas()->contentsX());
+ // Seems to work better for matrix view to scroll to left side
+ // + m_trackEditor->getSegmentCanvas()->visibleWidth() / 2);
+ timeT centerSegmentView = m_trackEditor->getRulerScale()->getTimeForX(centerX);
+ // then scroll the notation view to that time, "localized" for the current segment
+ matrixView->scrollToTime(centerSegmentView);
+ matrixView->updateView();
+ }
+
+ return matrixView;
+}
+
+void RosegardenGUIView::slotEditSegmentEventList(Segment *p)
+{
+ SetWaitCursor waitCursor;
+
+ std::vector<Segment *> segmentsToEdit;
+
+ // unlike notation, if we're calling for this on a particular
+ // segment we don't open all the other selected segments as well
+ // (fine in notation because they're in a single window)
+
+ if (p) {
+ if (p->getType() != Segment::Audio) {
+ segmentsToEdit.push_back(p);
+ }
+ } else {
+ int count = 0;
+ SegmentSelection selection = getSelection();
+ for (SegmentSelection::iterator i = selection.begin();
+ i != selection.end(); ++i) {
+ if ((*i)->getType() != Segment::Audio) {
+ slotEditSegmentEventList(*i);
+ if (++count == maxEditorsToOpen)
+ break;
+ }
+ }
+ return ;
+ }
+
+ if (segmentsToEdit.empty()) {
+ KMessageBox::sorry(this, i18n("No non-audio segments selected"));
+ return ;
+ }
+
+ slotEditSegmentsEventList(segmentsToEdit);
+}
+
+void RosegardenGUIView::slotEditSegmentsEventList(std::vector<Segment *> segmentsToEdit)
+{
+ int count = 0;
+ for (std::vector<Segment *>::iterator i = segmentsToEdit.begin();
+ i != segmentsToEdit.end(); ++i) {
+ std::vector<Segment *> tmpvec;
+ tmpvec.push_back(*i);
+ EventView *view = createEventView(tmpvec);
+ if (view) {
+ view->show();
+ if (++count == maxEditorsToOpen)
+ break;
+ }
+ }
+}
+
+void RosegardenGUIView::slotEditTriggerSegment(int id)
+{
+ SetWaitCursor waitCursor;
+
+ std::vector<Segment *> segmentsToEdit;
+
+ Segment *s = getDocument()->getComposition().getTriggerSegment(id);
+
+ if (s) {
+ segmentsToEdit.push_back(s);
+ } else {
+ return ;
+ }
+
+ slotEditSegmentsEventList(segmentsToEdit);
+}
+
+void RosegardenGUIView::slotSegmentAutoSplit(Segment *segment)
+{
+ AudioSplitDialog aSD(this, segment, getDocument());
+
+ if (aSD.exec() == QDialog::Accepted) {
+ KCommand *command =
+ new AudioSegmentAutoSplitCommand(getDocument(),
+ segment, aSD.getThreshold());
+ slotAddCommandToHistory(command);
+ }
+}
+
+void RosegardenGUIView::slotEditSegmentAudio(Segment *segment)
+{
+ std::cout << "RosegardenGUIView::slotEditSegmentAudio() - "
+ << "starting external audio editor" << std::endl;
+
+ KConfig* config = kapp->config();
+ config->setGroup(GeneralOptionsConfigGroup);
+
+ QString application = config->readEntry("externalaudioeditor", "");
+
+ if (application == "") {
+ application = AudioConfigurationPage::getBestAvailableAudioEditor();
+ }
+
+ QStringList splitCommand = QStringList::split(" ", application);
+
+ if (splitCommand.size() == 0) {
+
+ std::cerr << "RosegardenGUIView::slotEditSegmentAudio() - "
+ << "external editor \"" << application.data()
+ << "\" not found" << std::endl;
+
+ KMessageBox::sorry(this,
+ i18n("You've not yet defined an audio editor for Rosegarden to use.\nSee Settings -> Configure Rosegarden -> Audio."));
+
+ return ;
+ }
+
+ QFileInfo *appInfo = new QFileInfo(splitCommand[0]);
+ if (appInfo->exists() == false || appInfo->isExecutable() == false) {
+ std::cerr << "RosegardenGUIView::slotEditSegmentAudio() - "
+ << "can't execute \"" << splitCommand[0] << "\""
+ << std::endl;
+ return;
+ }
+
+ AudioFile *aF = getDocument()->getAudioFileManager().
+ getAudioFile(segment->getAudioFileId());
+ if (aF == 0) {
+ std::cerr << "RosegardenGUIView::slotEditSegmentAudio() - "
+ << "can't find audio file" << std::endl;
+ return ;
+ }
+
+ // wait cursor
+ QApplication::setOverrideCursor(QCursor(Qt::waitCursor));
+
+ // Prepare the process
+ //
+ KProcess *process = new KProcess();
+ (*process) << splitCommand;
+ (*process) << QString(aF->getFilename().c_str());
+
+ // Start it
+ //
+ if (!process->start()) {
+ std::cerr << "RosegardenGUIView::slotEditSegmentAudio() - "
+ << "can't start external editor" << std::endl;
+ }
+
+ // restore cursor
+ QApplication::restoreOverrideCursor();
+
+}
+
+void RosegardenGUIView::setZoomSize(double size)
+{
+ m_rulerScale->setUnitsPerPixel(size);
+
+ double duration44 = TimeSignature(4, 4).getBarDuration();
+
+ double xScale = duration44 / (size * barWidth44);
+ RG_DEBUG << "RosegardenGUIView::setZoomSize - xScale = " << xScale << endl;
+
+ m_trackEditor->slotSetPointerPosition
+ (getDocument()->getComposition().getPosition());
+
+ m_trackEditor->getSegmentCanvas()->clearSegmentRectsCache(true);
+ m_trackEditor->getSegmentCanvas()->slotUpdateSize();
+ m_trackEditor->getSegmentCanvas()->slotUpdateSegmentsDrawBuffer();
+
+ if (m_trackEditor->getTempoRuler()) {
+ m_trackEditor->getTempoRuler()->repaint();
+ }
+
+ if (m_trackEditor->getChordNameRuler()) {
+ m_trackEditor->getChordNameRuler()->repaint();
+ }
+
+ if (m_trackEditor->getTopStandardRuler()) {
+ m_trackEditor->getTopStandardRuler()->repaint();
+ }
+
+ if (m_trackEditor->getBottomStandardRuler()) {
+ m_trackEditor->getBottomStandardRuler()->repaint();
+ }
+}
+
+void RosegardenGUIView::slotSelectTrackSegments(int trackId)
+{
+ // update the instrument parameter box
+ Composition &comp = getDocument()->getComposition();
+ Track *track = comp.getTrackById(trackId);
+
+ if (track == 0)
+ return ;
+
+ // Show the selection on the track buttons. Find the position.
+ //
+ m_trackEditor->getTrackButtons()->selectLabel(track->getPosition());
+ m_trackEditor->slotScrollToTrack(track->getPosition());
+
+ SegmentSelection segments;
+
+ for (Composition::iterator i =
+ getDocument()->getComposition().begin();
+ i != getDocument()->getComposition().end(); i++) {
+ if (((int)(*i)->getTrack()) == trackId)
+ segments.insert(*i);
+ }
+
+ // Store the selected Track in the Composition
+ //
+ comp.setSelectedTrack(trackId);
+
+ m_trackParameterBox->slotSelectedTrackChanged();
+
+ slotUpdateInstrumentParameterBox(comp.getTrackById(trackId)->
+ getInstrument());
+
+
+ slotPropagateSegmentSelection(segments);
+
+ // inform
+ emit segmentsSelected(segments);
+ emit compositionStateUpdate();
+}
+
+void RosegardenGUIView::slotPropagateSegmentSelection(const SegmentSelection &segments)
+{
+ // Send this signal to the GUI to activate the correct tool
+ // on the toolbar so that we have a SegmentSelector object
+ // to write the Segments into
+ //
+ if (!segments.empty()) {
+ emit activateTool(SegmentSelector::ToolName);
+ }
+
+ // Send the segment list even if it's empty as we
+ // use that to clear any current selection
+ //
+ m_trackEditor->getSegmentCanvas()->slotSelectSegments(segments);
+
+ // update the segment parameter box
+ m_segmentParameterBox->useSegments(segments);
+
+ if (!segments.empty()) {
+ emit stateChange("have_selection", true);
+ if (!segments.hasNonAudioSegment()) {
+ emit stateChange("audio_segment_selected", true);
+ }
+ } else {
+ emit stateChange("have_selection", false);
+ }
+}
+
+void RosegardenGUIView::slotSelectAllSegments()
+{
+ SegmentSelection segments;
+
+ InstrumentId instrument = 0;
+ bool haveInstrument = false;
+ bool multipleInstruments = false;
+
+ Composition &comp = getDocument()->getComposition();
+
+ for (Composition::iterator i = comp.begin(); i != comp.end(); ++i) {
+
+ InstrumentId myInstrument =
+ comp.getTrackById((*i)->getTrack())->getInstrument();
+
+ if (haveInstrument) {
+ if (myInstrument != instrument) {
+ multipleInstruments = true;
+ }
+ } else {
+ instrument = myInstrument;
+ haveInstrument = true;
+ }
+
+ segments.insert(*i);
+ }
+
+ // Send this signal to the GUI to activate the correct tool
+ // on the toolbar so that we have a SegmentSelector object
+ // to write the Segments into
+ //
+ if (!segments.empty()) {
+ emit activateTool(SegmentSelector::ToolName);
+ }
+
+ // Send the segment list even if it's empty as we
+ // use that to clear any current selection
+ //
+ m_trackEditor->getSegmentCanvas()->slotSelectSegments(segments);
+
+ // update the segment parameter box
+ m_segmentParameterBox->useSegments(segments);
+
+ // update the instrument parameter box
+ if (haveInstrument && !multipleInstruments) {
+ slotUpdateInstrumentParameterBox(instrument);
+ } else {
+ m_instrumentParameterBox->useInstrument(0);
+ }
+
+ //!!! similarly, how to set no selected track?
+ //comp.setSelectedTrack(trackId);
+
+ if (!segments.empty()) {
+ emit stateChange("have_selection", true);
+ if (!segments.hasNonAudioSegment()) {
+ emit stateChange("audio_segment_selected", true);
+ }
+ } else {
+ emit stateChange("have_selection", false);
+ }
+
+ // inform
+ //!!! inform what? is this signal actually used?
+ emit segmentsSelected(segments);
+}
+
+void RosegardenGUIView::slotUpdateInstrumentParameterBox(int id)
+{
+ Studio &studio = getDocument()->getStudio();
+ Instrument *instrument = studio.getInstrumentById(id);
+ Composition &comp = getDocument()->getComposition();
+
+ Track *track = comp.getTrackById(comp.getSelectedTrack());
+
+ // Reset the instrument
+ //
+ m_instrumentParameterBox->useInstrument(instrument);
+
+ // Then do this instrument/track fiddling
+ //
+ /*
+ if (track && instrument &&
+ instrument->getType() == Instrument::Audio)
+ {
+ // Set the mute status
+ m_instrumentParameterBox->setMute(track->isMuted());
+
+ // Set the record track
+ m_instrumentParameterBox->setRecord(
+ track->getId() == comp.getRecordTrack());
+
+ // Set solo
+ m_instrumentParameterBox->setSolo(
+ comp.isSolo() && (track->getId() == comp.getSelectedTrack()));
+ }
+ */
+ emit checkTrackAssignments();
+}
+
+void RosegardenGUIView::showVisuals(const MappedEvent *mE)
+{
+ double valueLeft = ((double)mE->getData1()) / 127.0;
+ double valueRight = ((double)mE->getData2()) / 127.0;
+
+ if (mE->getType() == MappedEvent::AudioLevel) {
+
+ // Send to the high sensitivity instrument parameter box
+ // (if any)
+ //
+ if (m_instrumentParameterBox->getSelectedInstrument() &&
+ mE->getInstrument() ==
+ m_instrumentParameterBox->getSelectedInstrument()->getId()) {
+ float dBleft = AudioLevel::fader_to_dB
+ (mE->getData1(), 127, AudioLevel::LongFader);
+ float dBright = AudioLevel::fader_to_dB
+ (mE->getData2(), 127, AudioLevel::LongFader);
+
+ m_instrumentParameterBox->setAudioMeter(dBleft, dBright,
+ AudioLevel::DB_FLOOR,
+ AudioLevel::DB_FLOOR);
+ }
+
+ // Don't always send all audio levels so we don't
+ // get vu meter flickering on track meters
+ //
+ if (valueLeft < 0.05 && valueRight < 0.05)
+ return ;
+
+ } else if (mE->getType() != MappedEvent::MidiNote)
+ return ;
+
+ m_trackEditor->getTrackButtons()->
+ slotSetMetersByInstrument((valueLeft + valueRight) / 2,
+ mE->getInstrument());
+
+}
+
+void
+RosegardenGUIView::updateMeters(SequencerMapper *mapper)
+{
+ const int unknownState = 0, oldState = 1, newState = 2;
+
+ typedef std::map<InstrumentId, int> StateMap;
+ static StateMap states;
+ static StateMap recStates;
+
+ typedef std::map<InstrumentId, LevelInfo> LevelMap;
+ static LevelMap levels;
+ static LevelMap recLevels;
+
+ for (StateMap::iterator i = states.begin(); i != states.end(); ++i) {
+ i->second = unknownState;
+ }
+ for (StateMap::iterator i = recStates.begin(); i != recStates.end(); ++i) {
+ i->second = unknownState;
+ }
+
+ for (Composition::trackcontainer::iterator i =
+ getDocument()->getComposition().getTracks().begin();
+ i != getDocument()->getComposition().getTracks().end(); ++i) {
+
+ Track *track = i->second;
+ if (!track)
+ continue;
+
+ InstrumentId instrumentId = track->getInstrument();
+
+ if (states[instrumentId] == unknownState) {
+ bool isNew = mapper->getInstrumentLevel(instrumentId,
+ levels[instrumentId]);
+ states[instrumentId] = (isNew ? newState : oldState);
+ }
+
+ if (recStates[instrumentId] == unknownState) {
+ bool isNew = mapper->getInstrumentRecordLevel(instrumentId,
+ recLevels[instrumentId]);
+ recStates[instrumentId] = (isNew ? newState : oldState);
+ }
+
+ if (states[instrumentId] == oldState &&
+ recStates[instrumentId] == oldState)
+ continue;
+
+ Instrument *instrument =
+ getDocument()->getStudio().getInstrumentById(instrumentId);
+ if (!instrument)
+ continue;
+
+ // This records the level of this instrument, not neccessarily
+ // caused by notes on this particular track.
+ LevelInfo &info = levels[instrumentId];
+ LevelInfo &recInfo = recLevels[instrumentId];
+
+ if (instrument->getType() == Instrument::Audio ||
+ instrument->getType() == Instrument::SoftSynth) {
+
+ float dBleft = AudioLevel::DB_FLOOR;
+ float dBright = AudioLevel::DB_FLOOR;
+ float recDBleft = AudioLevel::DB_FLOOR;
+ float recDBright = AudioLevel::DB_FLOOR;
+
+ bool toSet = false;
+
+ if (states[instrumentId] == newState &&
+ (getDocument()->getSequenceManager()->getTransportStatus()
+ != STOPPED)) {
+
+ if (info.level != 0 || info.levelRight != 0) {
+ dBleft = AudioLevel::fader_to_dB
+ (info.level, 127, AudioLevel::LongFader);
+ dBright = AudioLevel::fader_to_dB
+ (info.levelRight, 127, AudioLevel::LongFader);
+ }
+ toSet = true;
+ m_trackEditor->getTrackButtons()->slotSetTrackMeter
+ ((info.level + info.levelRight) / 254.0, track->getPosition());
+ }
+
+ if (recStates[instrumentId] == newState &&
+ instrument->getType() == Instrument::Audio &&
+ (getDocument()->getSequenceManager()->getTransportStatus()
+ != PLAYING)) {
+
+ if (recInfo.level != 0 || recInfo.levelRight != 0) {
+ recDBleft = AudioLevel::fader_to_dB
+ (recInfo.level, 127, AudioLevel::LongFader);
+ recDBright = AudioLevel::fader_to_dB
+ (recInfo.levelRight, 127, AudioLevel::LongFader);
+ }
+ toSet = true;
+ }
+
+ if (toSet &&
+ m_instrumentParameterBox->getSelectedInstrument() &&
+ instrument->getId() ==
+ m_instrumentParameterBox->getSelectedInstrument()->getId()) {
+
+ m_instrumentParameterBox->setAudioMeter(dBleft, dBright,
+ recDBleft, recDBright);
+ }
+
+ } else {
+ // Not audio or softsynth
+ if (info.level == 0)
+ continue;
+
+ if (getDocument()->getSequenceManager()->getTransportStatus()
+ != STOPPED) {
+
+ // The information in 'info' is specific for this instrument, not
+ // for this track.
+ //m_trackEditor->getTrackButtons()->slotSetTrackMeter
+ // (info.level / 127.0, track->getPosition());
+ m_trackEditor->getTrackButtons()->slotSetMetersByInstrument
+ (info.level / 127.0, instrumentId);
+ }
+ }
+ }
+
+ for (StateMap::iterator i = states.begin(); i != states.end(); ++i) {
+ if (i->second == newState) {
+ emit instrumentLevelsChanged(i->first, levels[i->first]);
+ }
+ }
+}
+
+void
+RosegardenGUIView::updateMonitorMeters(SequencerMapper *mapper)
+{
+ Instrument *instrument =
+ m_instrumentParameterBox->getSelectedInstrument();
+ if (!instrument ||
+ (instrument->getType() != Instrument::Audio))
+ return ;
+
+ LevelInfo level;
+ if (!mapper->getInstrumentRecordLevel(instrument->getId(), level))
+ return ;
+
+ float dBleft = AudioLevel::fader_to_dB
+ (level.level, 127, AudioLevel::LongFader);
+ float dBright = AudioLevel::fader_to_dB
+ (level.levelRight, 127, AudioLevel::LongFader);
+
+ m_instrumentParameterBox->setAudioMeter
+ (AudioLevel::DB_FLOOR, AudioLevel::DB_FLOOR,
+ dBleft, dBright);
+}
+
+void
+RosegardenGUIView::slotSelectedSegments(const SegmentSelection &segments)
+{
+ // update the segment parameter box
+ m_segmentParameterBox->useSegments(segments);
+
+ if (!segments.empty()) {
+ emit stateChange("have_selection", true);
+ if (!segments.hasNonAudioSegment())
+ emit stateChange("audio_segment_selected", true);
+ } else {
+ emit stateChange("have_selection", false);
+ }
+
+ emit segmentsSelected(segments);
+}
+
+void RosegardenGUIView::slotShowRulers(bool v)
+{
+ if (v) {
+ m_trackEditor->getTopStandardRuler()->getLoopRuler()->show();
+ m_trackEditor->getBottomStandardRuler()->getLoopRuler()->show();
+ } else {
+ m_trackEditor->getTopStandardRuler()->getLoopRuler()->hide();
+ m_trackEditor->getBottomStandardRuler()->getLoopRuler()->hide();
+ }
+}
+
+void RosegardenGUIView::slotShowTempoRuler(bool v)
+{
+ if (v) {
+ m_trackEditor->getTempoRuler()->show();
+ } else {
+ m_trackEditor->getTempoRuler()->hide();
+ }
+}
+
+void RosegardenGUIView::slotShowChordNameRuler(bool v)
+{
+ if (v) {
+ m_trackEditor->getChordNameRuler()->setStudio(&getDocument()->getStudio());
+ m_trackEditor->getChordNameRuler()->show();
+ } else {
+ m_trackEditor->getChordNameRuler()->hide();
+ }
+}
+
+void RosegardenGUIView::slotShowPreviews(bool v)
+{
+ m_trackEditor->getSegmentCanvas()->setShowPreviews(v);
+ m_trackEditor->getSegmentCanvas()->slotUpdateSegmentsDrawBuffer();
+}
+
+void RosegardenGUIView::slotShowSegmentLabels(bool v)
+{
+ m_trackEditor->getSegmentCanvas()->setShowSegmentLabels(v);
+ m_trackEditor->getSegmentCanvas()->slotUpdateSegmentsDrawBuffer();
+}
+
+void RosegardenGUIView::slotAddTracks(unsigned int nbTracks,
+ InstrumentId id, int pos)
+{
+ RG_DEBUG << "RosegardenGUIView::slotAddTracks(" << nbTracks << ", " << pos << ")" << endl;
+ m_trackEditor->slotAddTracks(nbTracks, id, pos);
+}
+
+void RosegardenGUIView::slotDeleteTracks(
+ std::vector<TrackId> tracks)
+{
+ RG_DEBUG << "RosegardenGUIView::slotDeleteTracks - "
+ << "deleting " << tracks.size() << " tracks"
+ << endl;
+
+ m_trackEditor->slotDeleteTracks(tracks);
+}
+
+MultiViewCommandHistory*
+RosegardenGUIView::getCommandHistory()
+{
+ return getDocument()->getCommandHistory();
+}
+
+void
+RosegardenGUIView::slotAddCommandToHistory(KCommand *command)
+{
+ getCommandHistory()->addCommand(command);
+}
+
+void
+RosegardenGUIView::slotChangeInstrumentLabel(InstrumentId id,
+ QString label)
+{
+ m_trackEditor->getTrackButtons()->changeInstrumentLabel(id, label);
+}
+
+void
+RosegardenGUIView::slotChangeTrackLabel(TrackId id,
+ QString label)
+{
+ m_trackEditor->getTrackButtons()->changeTrackLabel(id, label);
+}
+
+void
+RosegardenGUIView::slotAddAudioSegment(AudioFileId audioId,
+ TrackId trackId,
+ timeT position,
+ const RealTime &startTime,
+ const RealTime &endTime)
+{
+ AudioSegmentInsertCommand *command =
+ new AudioSegmentInsertCommand(getDocument(),
+ trackId,
+ position,
+ audioId,
+ startTime,
+ endTime);
+ slotAddCommandToHistory(command);
+
+ Segment *newSegment = command->getNewSegment();
+ if (newSegment) {
+ SegmentSelection selection;
+ selection.insert(newSegment);
+ slotPropagateSegmentSelection(selection);
+ emit segmentsSelected(selection);
+ }
+}
+
+void
+RosegardenGUIView::slotAddAudioSegmentCurrentPosition(AudioFileId audioFileId,
+ const RealTime &startTime,
+ const RealTime &endTime)
+{
+ Composition &comp = getDocument()->getComposition();
+
+ AudioSegmentInsertCommand *command =
+ new AudioSegmentInsertCommand(getDocument(),
+ comp.getSelectedTrack(),
+ comp.getPosition(),
+ audioFileId,
+ startTime,
+ endTime);
+ slotAddCommandToHistory(command);
+
+ Segment *newSegment = command->getNewSegment();
+ if (newSegment) {
+ SegmentSelection selection;
+ selection.insert(newSegment);
+ slotPropagateSegmentSelection(selection);
+ emit segmentsSelected(selection);
+ }
+}
+
+void
+RosegardenGUIView::slotAddAudioSegmentDefaultPosition(AudioFileId audioFileId,
+ const RealTime &startTime,
+ const RealTime &endTime)
+{
+ // Add at current track if it's an audio track, otherwise at first
+ // empty audio track if there is one, otherwise at first audio track.
+ // This behaviour should be of no interest to proficient users (who
+ // should have selected the right track already, or be using drag-
+ // and-drop) but it should save beginners from inserting an audio
+ // segment and being quite unable to work out why it won't play
+
+ Composition &comp = getDocument()->getComposition();
+ Studio &studio = getDocument()->getStudio();
+
+ TrackId currentTrackId = comp.getSelectedTrack();
+ Track *track = comp.getTrackById(currentTrackId);
+
+ if (track) {
+ InstrumentId ii = track->getInstrument();
+ Instrument *instrument = studio.getInstrumentById(ii);
+
+ if (instrument &&
+ instrument->getType() == Instrument::Audio) {
+ slotAddAudioSegment(audioFileId, currentTrackId,
+ comp.getPosition(), startTime, endTime);
+ return ;
+ }
+ }
+
+ // current track is not an audio track, find a more suitable one
+
+ TrackId bestSoFar = currentTrackId;
+
+ for (Composition::trackcontainer::const_iterator
+ ti = comp.getTracks().begin();
+ ti != comp.getTracks().end(); ++ti) {
+
+ InstrumentId ii = ti->second->getInstrument();
+ Instrument *instrument = studio.getInstrumentById(ii);
+
+ if (instrument &&
+ instrument->getType() == Instrument::Audio) {
+
+ if (bestSoFar == currentTrackId)
+ bestSoFar = ti->first;
+ bool haveSegment = false;
+
+ for (Composition::segmentcontainer::const_iterator si =
+ comp.getSegments().begin();
+ si != comp.getSegments().end(); ++si) {
+ if ((*si)->getTrack() == ti->first) {
+ // there's a segment on this track
+ haveSegment = true;
+ break;
+ }
+ }
+
+ if (!haveSegment) { // perfect
+ slotAddAudioSegment(audioFileId, ti->first,
+ comp.getPosition(), startTime, endTime);
+ return ;
+ }
+ }
+ }
+
+ slotAddAudioSegment(audioFileId, bestSoFar,
+ comp.getPosition(), startTime, endTime);
+ return ;
+}
+
+void
+RosegardenGUIView::slotDroppedNewAudio(QString audioDesc)
+{
+ QTextIStream s(&audioDesc);
+
+ QString url;
+ int trackId;
+ timeT time;
+ url = s.readLine();
+ s >> trackId;
+ s >> time;
+
+ std::cerr << "RosegardenGUIView::slotDroppedNewAudio: url " << url << ", trackId " << trackId << ", time " << time << std::endl;
+
+ RosegardenGUIApp *app = RosegardenGUIApp::self();
+ AudioFileManager &aFM = getDocument()->getAudioFileManager();
+
+ AudioFileId audioFileId = 0;
+
+ int sampleRate = 0;
+ if (getDocument()->getSequenceManager()) {
+ sampleRate = getDocument()->getSequenceManager()->getSampleRate();
+ }
+
+ KURL kurl(url);
+ if (!kurl.isLocalFile()) {
+ if (!RosegardenGUIApp::self()->testAudioPath("importing a remote audio file")) return;
+ } else if (aFM.fileNeedsConversion(qstrtostr(kurl.path()), sampleRate)) {
+ if (!RosegardenGUIApp::self()->testAudioPath("importing an audio file that needs to be converted or resampled")) return;
+ }
+
+ ProgressDialog progressDlg(i18n("Adding audio file..."),
+ 100,
+ this);
+
+ CurrentProgressDialog::set(&progressDlg);
+ progressDlg.progressBar()->hide();
+ progressDlg.show();
+
+ // Connect the progress dialog
+ //
+ connect(&aFM, SIGNAL(setProgress(int)),
+ progressDlg.progressBar(), SLOT(setValue(int)));
+ connect(&aFM, SIGNAL(setOperationName(QString)),
+ &progressDlg, SLOT(slotSetOperationName(QString)));
+ connect(&progressDlg, SIGNAL(cancelClicked()),
+ &aFM, SLOT(slotStopImport()));
+
+ try {
+ audioFileId = aFM.importURL(kurl, sampleRate);
+ } catch (AudioFileManager::BadAudioPathException e) {
+ CurrentProgressDialog::freeze();
+ QString errorString = i18n("Can't add dropped file. ") + strtoqstr(e.getMessage());
+ KMessageBox::sorry(this, errorString);
+ return ;
+ } catch (SoundFile::BadSoundFileException e) {
+ CurrentProgressDialog::freeze();
+ QString errorString = i18n("Can't add dropped file. ") + strtoqstr(e.getMessage());
+ KMessageBox::sorry(this, errorString);
+ return ;
+ }
+
+ disconnect(&progressDlg, SIGNAL(cancelClicked()),
+ &aFM, SLOT(slotStopImport()));
+ connect(&progressDlg, SIGNAL(cancelClicked()),
+ &aFM, SLOT(slotStopPreview()));
+ progressDlg.progressBar()->show();
+ progressDlg.slotSetOperationName(i18n("Generating audio preview..."));
+
+ try {
+ aFM.generatePreview(audioFileId);
+ } catch (Exception e) {
+ CurrentProgressDialog::freeze();
+ QString message = strtoqstr(e.getMessage()) + "\n\n" +
+ i18n("Try copying this file to a directory where you have write permission and re-add it");
+ KMessageBox::information(this, message);
+ //return false;
+ }
+
+ disconnect(&progressDlg, SIGNAL(cancelClicked()),
+ &aFM, SLOT(slotStopPreview()));
+
+ // add the file at the sequencer
+ emit addAudioFile(audioFileId);
+
+ // Now fetch file details
+ //
+ AudioFile *aF = aFM.getAudioFile(audioFileId);
+
+ if (aF) {
+ slotAddAudioSegment(audioFileId, trackId, time,
+ RealTime(0, 0), aF->getLength());
+
+ RG_DEBUG << "RosegardenGUIView::slotDroppedNewAudio("
+ << "file = " << url
+ << ", trackid = " << trackId
+ << ", time = " << time << endl;
+ }
+}
+
+void
+RosegardenGUIView::slotDroppedAudio(QString audioDesc)
+{
+ QTextIStream s(&audioDesc);
+
+ AudioFileId audioFileId;
+ TrackId trackId;
+ timeT position;
+ RealTime startTime, endTime;
+
+ // read the audio info
+ s >> audioFileId;
+ s >> trackId;
+ s >> position;
+ s >> startTime.sec;
+ s >> startTime.nsec;
+ s >> endTime.sec;
+ s >> endTime.nsec;
+
+ RG_DEBUG << "RosegardenGUIView::slotDroppedAudio("
+ //<< audioDesc
+ << ") : audioFileId = " << audioFileId
+ << " - trackId = " << trackId
+ << " - position = " << position
+ << " - startTime.sec = " << startTime.sec
+ << " - startTime.nsec = " << startTime.nsec
+ << " - endTime.sec = " << endTime.sec
+ << " - endTime.nsec = " << endTime.nsec
+ << endl;
+
+ slotAddAudioSegment(audioFileId, trackId, position, startTime, endTime);
+}
+
+void
+RosegardenGUIView::slotSetMuteButton(TrackId track, bool value)
+{
+ RG_DEBUG << "RosegardenGUIView::slotSetMuteButton - track id = " << track
+ << ", value = " << value << endl;
+
+ m_trackEditor->getTrackButtons()->setMuteButton(track, value);
+ Track *trackObj = getDocument()->
+ getComposition().getTrackById(track);
+ /*
+ // to fix 739544
+ if (m_instrumentParameterBox->getSelectedInstrument() &&
+ m_instrumentParameterBox->getSelectedInstrument()->getId() ==
+ trackObj->getInstrument())
+ {
+ m_instrumentParameterBox->setMute(value);
+ }
+ */
+ // set the value in the composition
+ trackObj->setMuted(value);
+
+ getDocument()->slotDocumentModified(); // set the modification flag
+
+}
+
+void
+RosegardenGUIView::slotSetMute(InstrumentId id, bool value)
+{
+ RG_DEBUG << "RosegardenGUIView::slotSetMute - "
+ << "id = " << id
+ << ",value = " << value << endl;
+
+ Composition &comp = getDocument()->getComposition();
+ Composition::trackcontainer &tracks = comp.getTracks();
+ Composition::trackiterator it;
+
+ for (it = tracks.begin(); it != tracks.end(); ++it) {
+ if ((*it).second->getInstrument() == id)
+ slotSetMuteButton((*it).second->getId(), value);
+ }
+
+}
+
+void
+RosegardenGUIView::slotSetRecord(InstrumentId id, bool value)
+{
+ RG_DEBUG << "RosegardenGUIView::slotSetRecord - "
+ << "id = " << id
+ << ",value = " << value << endl;
+ /*
+ // IPB
+ //
+ m_instrumentParameterBox->setRecord(value);
+ */
+ Composition &comp = getDocument()->getComposition();
+ Composition::trackcontainer &tracks = comp.getTracks();
+ Composition::trackiterator it;
+#ifdef NOT_DEFINED
+
+ for (it = tracks.begin(); it != tracks.end(); ++it) {
+ if (comp.getSelectedTrack() == (*it).second->getId()) {
+ //!!! MTR m_trackEditor->getTrackButtons()->
+ // setRecordTrack((*it).second->getPosition());
+ //!!! MTR is this needed? I think probably not
+ slotUpdateInstrumentParameterBox((*it).second->getInstrument());
+ }
+ }
+#endif
+ Studio &studio = getDocument()->getStudio();
+ Instrument *instr = studio.getInstrumentById(id);
+}
+
+void
+RosegardenGUIView::slotSetSolo(InstrumentId id, bool value)
+{
+ RG_DEBUG << "RosegardenGUIView::slotSetSolo - "
+ << "id = " << id
+ << ",value = " << value << endl;
+
+ emit toggleSolo(value);
+}
+
+void
+RosegardenGUIView::slotUpdateRecordingSegment(Segment *segment,
+ timeT )
+{
+ // We're only interested in this on the first call per recording segment,
+ // when we possibly create a view for it
+ static Segment *lastRecordingSegment = 0;
+
+ if (segment == lastRecordingSegment)
+ return ;
+ lastRecordingSegment = segment;
+
+ KConfig* config = kapp->config();
+ config->setGroup(GeneralOptionsConfigGroup);
+
+ int tracking = config->readUnsignedNumEntry("recordtracking", 0);
+ if (tracking != 1)
+ return ;
+
+ RG_DEBUG << "RosegardenGUIView::slotUpdateRecordingSegment: segment is " << segment << ", lastRecordingSegment is " << lastRecordingSegment << ", opening a new view" << endl;
+
+ std::vector<Segment *> segments;
+ segments.push_back(segment);
+
+ NotationView *view = createNotationView(segments);
+ if (!view)
+ return ;
+
+ /* signal no longer exists
+ QObject::connect
+ (getDocument(), SIGNAL(recordingSegmentUpdated(Segment *, timeT)),
+ view, SLOT(slotUpdateRecordingSegment(Segment *, timeT)));
+ */
+
+ view->show();
+}
+
+void
+RosegardenGUIView::slotSynchroniseWithComposition()
+{
+ // Track buttons
+ //
+ m_trackEditor->getTrackButtons()->slotSynchroniseWithComposition();
+
+ // Update all IPBs
+ //
+ Composition &comp = getDocument()->getComposition();
+ Track *track = comp.getTrackById(comp.getSelectedTrack());
+ slotUpdateInstrumentParameterBox(track->getInstrument());
+
+ m_instrumentParameterBox->slotUpdateAllBoxes();
+}
+
+void
+RosegardenGUIView::windowActivationChange(bool)
+{
+ if (isActiveWindow()) {
+ slotActiveMainWindowChanged(this);
+ }
+}
+
+void
+RosegardenGUIView::slotActiveMainWindowChanged(const QWidget *w)
+{
+ m_lastActiveMainWindow = w;
+}
+
+void
+RosegardenGUIView::slotActiveMainWindowChanged()
+{
+ const QWidget *w = dynamic_cast<const QWidget *>(sender());
+ if (w)
+ slotActiveMainWindowChanged(w);
+}
+
+void
+RosegardenGUIView::slotControllerDeviceEventReceived(MappedEvent *e)
+{
+ RG_DEBUG << "Controller device event received - send to " << (void *)m_lastActiveMainWindow << " (I am " << this << ")" << endl;
+
+ //!!! So, what _should_ we do with these?
+
+ // -- external controller that sends e.g. volume control for each
+ // of a number of channels -> if mixer present, use control to adjust
+ // tracks on mixer
+
+ // -- external controller that sends e.g. separate controllers on
+ // the same channel for adjusting various parameters -> if IPB
+ // visible, adjust it. Should we use the channel to select the
+ // track? maybe as an option
+
+ // do we actually need the last active main window for either of
+ // these? -- yes, to determine whether to send to mixer or to IPB
+ // in the first place. Send to audio mixer if active, midi mixer
+ // if active, plugin dialog if active, otherwise keep it for
+ // ourselves for the IPB. But, we'll do that by having the edit
+ // views pass it back to us.
+
+ // -- then we need to send back out to device.
+
+ //!!! special cases: controller 81 received by any window ->
+ // select window 0->main, 1->audio mix, 2->midi mix
+
+ //!!! controller 82 received by main window -> select track
+
+ //!!! these obviously should be configurable
+
+ if (e->getType() == MappedEvent::MidiController) {
+
+ if (e->getData1() == 81) {
+
+ // select window
+ int window = e->getData2();
+
+ if (window < 10) { // me
+
+ show();
+ raise();
+ setActiveWindow();
+
+ } else if (window < 20) {
+
+ RosegardenGUIApp::self()->slotOpenAudioMixer();
+
+ } else if (window < 30) {
+
+ RosegardenGUIApp::self()->slotOpenMidiMixer();
+ }
+ }
+ }
+
+ emit controllerDeviceEventReceived(e, m_lastActiveMainWindow);
+}
+
+void
+RosegardenGUIView::slotControllerDeviceEventReceived(MappedEvent *e, const void *preferredCustomer)
+{
+ if (preferredCustomer != this)
+ return ;
+ RG_DEBUG << "RosegardenGUIView::slotControllerDeviceEventReceived: this one's for me" << endl;
+ raise();
+
+ RG_DEBUG << "Event is type: " << int(e->getType()) << ", channel " << int(e->getRecordedChannel()) << ", data1 " << int(e->getData1()) << ", data2 " << int(e->getData2()) << endl;
+
+ Composition &comp = getDocument()->getComposition();
+ Studio &studio = getDocument()->getStudio();
+
+ TrackId currentTrackId = comp.getSelectedTrack();
+ Track *track = comp.getTrackById(currentTrackId);
+
+ // If the event is a control change on channel n, then (if
+ // follow-channel is on) switch to the nth track of the same type
+ // as the current track -- or the first track of the given
+ // channel?, and set the control appropriately. Any controls in
+ // IPB are supported for a MIDI device plus program and bank; only
+ // volume and pan are supported for audio/synth devices.
+ //!!! complete this
+
+ if (e->getType() != MappedEvent::MidiController) {
+
+ if (e->getType() == MappedEvent::MidiProgramChange) {
+ int program = e->getData1();
+ if (!track)
+ return ;
+ InstrumentId ii = track->getInstrument();
+ Instrument *instrument = studio.getInstrumentById(ii);
+ if (!instrument)
+ return ;
+ instrument->setProgramChange(program);
+ emit instrumentParametersChanged(ii);
+ }
+ return ;
+ }
+
+ unsigned int channel = e->getRecordedChannel();
+ MidiByte controller = e->getData1();
+ MidiByte value = e->getData2();
+
+ if (controller == 82) { //!!! magic select-track controller
+ int tracks = comp.getNbTracks();
+ Track *track = comp.getTrackByPosition(value * tracks / 127);
+ if (track) {
+ slotSelectTrackSegments(track->getId());
+ }
+ return ;
+ }
+
+ if (!track)
+ return ;
+
+ InstrumentId ii = track->getInstrument();
+ Instrument *instrument = studio.getInstrumentById(ii);
+
+ if (!instrument)
+ return ;
+
+ switch (instrument->getType()) {
+
+ case Instrument::Midi: {
+ MidiDevice *md = dynamic_cast<MidiDevice *>
+ (instrument->getDevice());
+ if (!md) {
+ std::cerr << "WARNING: MIDI instrument has no MIDI device in slotControllerDeviceEventReceived" << std::endl;
+ return ;
+ }
+
+ //!!! we need a central clearing house for these changes,
+ // for a proper mvc structure. reqd for automation post-1.2.
+ // in the mean time this duplicates much of
+ // MIDIInstrumentParameterPanel::slotControllerChanged etc
+
+ switch (controller) {
+
+ case MIDI_CONTROLLER_VOLUME:
+ RG_DEBUG << "Setting volume for instrument " << instrument->getId() << " to " << value << endl;
+ instrument->setVolume(value);
+ break;
+
+ case MIDI_CONTROLLER_PAN:
+ RG_DEBUG << "Setting pan for instrument " << instrument->getId() << " to " << value << endl;
+ instrument->setPan(value);
+ break;
+
+ default: {
+ ControlList cl = md->getIPBControlParameters();
+ for (ControlList::const_iterator i = cl.begin();
+ i != cl.end(); ++i) {
+ if ((*i).getControllerValue() == controller) {
+ RG_DEBUG << "Setting controller " << controller << " for instrument " << instrument->getId() << " to " << value << endl;
+ instrument->setControllerValue(controller, value);
+ break;
+ }
+ }
+ break;
+ }
+ }
+
+ break;
+ }
+
+ case Instrument::SoftSynth:
+ case Instrument::Audio:
+
+ switch (controller) {
+
+ case MIDI_CONTROLLER_VOLUME:
+ RG_DEBUG << "Setting volume for instrument " << instrument->getId() << " to " << value << endl;
+ instrument->setLevel(AudioLevel::fader_to_dB
+ (value, 127, AudioLevel::ShortFader));
+ break;
+
+ case MIDI_CONTROLLER_PAN:
+ RG_DEBUG << "Setting pan for instrument " << instrument->getId() << " to " << value << endl;
+ instrument->setPan(MidiByte((value / 64.0) * 100.0 + 0.01));
+ break;
+
+ default:
+ break;
+ }
+
+ break;
+ }
+
+ emit instrumentParametersChanged(instrument->getId());
+
+ //!!! send out updates via MIDI
+}
+
+void
+RosegardenGUIView::initChordNameRuler()
+{
+ getTrackEditor()->getChordNameRuler()->setReady();
+}
+
+EventView *
+RosegardenGUIView::createEventView(std::vector<Segment *> segmentsToEdit)
+{
+ EventView *eventView = new EventView(getDocument(),
+ segmentsToEdit,
+ this);
+
+ connect(eventView, SIGNAL(windowActivated()),
+ this, SLOT(slotActiveMainWindowChanged()));
+
+ connect(eventView, SIGNAL(selectTrack(int)),
+ this, SLOT(slotSelectTrackSegments(int)));
+
+ connect(eventView, SIGNAL(saveFile()),
+ RosegardenGUIApp::self(), SLOT(slotFileSave()));
+
+ connect(eventView, SIGNAL(openInNotation(std::vector<Segment *>)),
+ this, SLOT(slotEditSegmentsNotation(std::vector<Segment *>)));
+ connect(eventView, SIGNAL(openInMatrix(std::vector<Segment *>)),
+ this, SLOT(slotEditSegmentsMatrix(std::vector<Segment *>)));
+ connect(eventView, SIGNAL(openInPercussionMatrix(std::vector<Segment *>)),
+ this, SLOT(slotEditSegmentsPercussionMatrix(std::vector<Segment *>)));
+ connect(eventView, SIGNAL(openInEventList(std::vector<Segment *>)),
+ this, SLOT(slotEditSegmentsEventList(std::vector<Segment *>)));
+ connect(eventView, SIGNAL(editTriggerSegment(int)),
+ this, SLOT(slotEditTriggerSegment(int)));
+ connect(this, SIGNAL(compositionStateUpdate()),
+ eventView, SLOT(slotCompositionStateUpdate()));
+ connect(RosegardenGUIApp::self(), SIGNAL(compositionStateUpdate()),
+ eventView, SLOT(slotCompositionStateUpdate()));
+ connect(eventView, SIGNAL(toggleSolo(bool)),
+ RosegardenGUIApp::self(), SLOT(slotToggleSolo(bool)));
+
+ // create keyboard accelerators on view
+ //
+ RosegardenGUIApp *par = dynamic_cast<RosegardenGUIApp*>(parent());
+
+ if (par) {
+ par->plugAccelerators(eventView, eventView->getAccelerators());
+ }
+
+ return eventView;
+}
+
+}
+#include "RosegardenGUIView.moc"
diff --git a/src/gui/application/RosegardenGUIView.h b/src/gui/application/RosegardenGUIView.h
new file mode 100644
index 0000000..b3727f3
--- /dev/null
+++ b/src/gui/application/RosegardenGUIView.h
@@ -0,0 +1,347 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_ROSEGARDENGUIVIEW_H_
+#define _RG_ROSEGARDENGUIVIEW_H_
+
+#include "base/Event.h"
+#include "base/MidiProgram.h"
+#include "base/Selection.h"
+#include "base/Track.h"
+#include "sound/AudioFile.h"
+#include "gui/editors/segment/TrackEditor.h"
+#include <qstring.h>
+#include <qvbox.h>
+
+
+class QWidget;
+class QObject;
+class LevelInfo;
+class KCommand;
+
+
+namespace Rosegarden
+{
+
+class TrackParameterBox;
+class TrackEditor;
+class SimpleRulerScale;
+class SequencerMapper;
+class SegmentParameterBox;
+class Segment;
+class RosegardenGUIDoc;
+class RealTime;
+class NotationView;
+class MultiViewCommandHistory;
+class MatrixView;
+class MappedEvent;
+class InstrumentParameterBox;
+class EventView;
+class Composition;
+class LevelInfo;
+
+/**
+ * The RosegardenGUIView class provides the view widget for the
+ * RosegardenGUIApp instance. The View instance inherits QWidget as a
+ * base class and represents the view object of a KTMainWindow. As
+ * RosegardenGUIView is part of the docuement-view model, it needs a
+ * reference to the document object connected with it by the
+ * RosegardenGUIApp class to manipulate and display the document
+ * structure provided by the RosegardenGUIDoc class.
+ *
+ * @author Source Framework Automatically Generated by KDevelop, (c) The KDevelop Team.
+ * @version KDevelop version 0.4 code generation
+ */
+class RosegardenGUIView : public QVBox
+{
+ Q_OBJECT
+public:
+
+ /**p
+ * Constructor for the main view
+ */
+ RosegardenGUIView(bool showTrackLabels,
+ SegmentParameterBox*,
+ InstrumentParameterBox*,
+ TrackParameterBox*,
+ QWidget *parent = 0,
+ const char *name=0);
+
+ /**
+ * Destructor for the main view
+ */
+ ~RosegardenGUIView();
+
+ /**
+ * returns a pointer to the document connected to the view
+ * instance. Mind that this method requires a RosegardenGUIApp
+ * instance as a parent widget to get to the window document
+ * pointer by calling the RosegardenGUIApp::getDocument() method.
+ *
+ * @see RosegardenGUIApp#getDocument
+ */
+ RosegardenGUIDoc* getDocument() const;
+
+ /**
+ * Command history
+ */
+ MultiViewCommandHistory* getCommandHistory();
+
+ TrackEditor* getTrackEditor() { return m_trackEditor; }
+
+ /**
+ * contains the implementation for printing functionality
+ */
+ void print(Composition*, bool previewOnly = false);
+
+ // the following aren't slots because they're called from
+ // RosegardenGUIApp
+
+ /**
+ * Select a tool at the SegmentCanvas
+ */
+ void selectTool(QString toolName);
+
+ /**
+ * Show output levels
+ */
+ void showVisuals(const MappedEvent *mE);
+
+ void updateMeters(SequencerMapper *mapper);
+ void updateMonitorMeters(SequencerMapper *mapper);
+
+ /**
+ * Change zoom size -- set the RulerScale's units-per-pixel to size
+ */
+ void setZoomSize(double size);
+
+ void initChordNameRuler();
+
+ bool haveSelection();
+ SegmentSelection getSelection();
+ void updateSelectionContents();
+
+ static bool isMainWindowLastActive(const QWidget *w) {
+ return w == m_lastActiveMainWindow;
+ }
+
+public slots:
+ void slotEditSegment(Segment*);
+ void slotEditSegmentNotation(Segment*);
+ void slotEditSegmentsNotation(std::vector<Segment*>);
+ void slotEditSegmentMatrix(Segment*);
+ void slotEditSegmentsMatrix(std::vector<Segment*>);
+ void slotEditSegmentPercussionMatrix(Segment*);
+ void slotEditSegmentsPercussionMatrix(std::vector<Segment*>);
+ void slotEditSegmentEventList(Segment*);
+ void slotEditSegmentsEventList(std::vector<Segment*>);
+ void slotEditTriggerSegment(int);
+ void slotEditSegmentAudio(Segment*);
+ void slotSegmentAutoSplit(Segment*);
+ void slotEditRepeat(Segment*, timeT);
+/* hjj: WHAT DO DO WITH THIS ?
+ void slotEditMetadata(QString);
+*/
+
+ /**
+ * Highlight all the Segments on a Track because the Track has
+ * been selected * We have to ensure we create a Selector object
+ * before we can highlight * these tracks.
+ *
+ * Called by signal from Track selection routine to highlight
+ * all available Segments on a Track
+ */
+ void slotSelectTrackSegments(int);
+
+ void slotSelectAllSegments();
+
+ void slotUpdateInstrumentParameterBox(int id);
+
+ // This is called from the canvas (actually the selector tool) moving out
+ //
+ void slotSelectedSegments(const SegmentSelection &segments);
+
+ // And this one from the user interface going down
+ //
+ void slotPropagateSegmentSelection(const SegmentSelection &segments);
+
+ void slotShowRulers(bool);
+
+ void slotShowTempoRuler(bool);
+
+ void slotShowChordNameRuler(bool);
+
+ void slotShowPreviews(bool);
+
+ void slotShowSegmentLabels(bool);
+
+ void slotAddTracks(unsigned int count, InstrumentId instrument, int position);
+
+ void slotDeleteTracks(std::vector<TrackId> tracks);
+
+ void slotAddAudioSegmentCurrentPosition(AudioFileId,
+ const RealTime &startTime,
+ const RealTime &endTime);
+
+ void slotAddAudioSegmentDefaultPosition(AudioFileId,
+ const RealTime &startTime,
+ const RealTime &endTime);
+
+ void slotAddAudioSegment(AudioFileId audioId,
+ TrackId trackId,
+ timeT position,
+ const RealTime &startTime,
+ const RealTime &endTime);
+
+ void slotDroppedAudio(QString audioDesc);
+ void slotDroppedNewAudio(QString audioDesc);
+
+ /*
+ * Commands
+ *
+ */
+ void slotAddCommandToHistory(KCommand *command);
+
+ /*
+ * Change the Instrument Label
+ */
+ void slotChangeInstrumentLabel(InstrumentId id, QString label);
+
+ /*
+ * Change the Track Label
+ */
+ void slotChangeTrackLabel(TrackId id, QString label);
+
+ /*
+ * Set the mute button on the track buttons and on the instrument
+ * parameter box
+ */
+ void slotSetMuteButton(TrackId track, bool value);
+
+ /*
+ * Set mute, record and solo by instrument id
+ */
+ void slotSetMute(InstrumentId, bool);
+ void slotSetRecord(InstrumentId, bool);
+ void slotSetSolo(InstrumentId, bool);
+
+ /**
+ * To indicate that we should track the recording segment (despite
+ * no commands being issued on it)
+ */
+ void slotUpdateRecordingSegment(Segment *segment,
+ timeT updatedFrom);
+
+ /**
+ * A manual fudgy way of creating a view update for certain
+ * semi-static data (devices/instrument labels mainly)
+ */
+ void slotSynchroniseWithComposition();
+
+ /**
+ * To indicate that an edit view, mixer, etc (something that might
+ * want to receive MIDI input) has become active. We only send
+ * inputs such as MIDI to a single one of these, in most cases,
+ * and it's whichever was most recently made active. (It doesn't
+ * have to still _be_ active -- we want to allow moving focus to
+ * another application entirely but still receiving MIDI etc in
+ * Rosegarden.)
+ */
+ void slotActiveMainWindowChanged(const QWidget *);
+ void slotActiveMainWindowChanged(); // uses sender()
+
+ /**
+ * An event has been received from a device connected to the
+ * external controller port.
+ */
+ void slotControllerDeviceEventReceived(MappedEvent *);
+ void slotControllerDeviceEventReceived(MappedEvent *, const void *);
+
+signals:
+ void activateTool(QString toolName);
+
+ void stateChange(QString, bool);
+
+ // Inform that we've got a SegmentSelection
+ //
+ void segmentsSelected(const SegmentSelection&);
+
+ void toggleSolo(bool);
+
+ /**
+ * Current used to dispatch things like track select changes, solo, etc...
+ * to edit views
+ */
+ void compositionStateUpdate();
+
+
+ /**
+ * This signal is used to dispatch a notification for a request to
+ * set the step-by-step-editing target window to all candidate targets,
+ * so that they can either know that their request has been granted
+ * (if they match the QObject passed) or else deactivate any step-by-
+ * step editing currently active in their own window (otherwise).
+ */
+ void stepByStepTargetRequested(QObject *);
+
+ /*
+ * Add an audio file at the sequencer - when we drop a new file
+ * on the segment canvas.
+ */
+ void addAudioFile(AudioFileId);
+
+ void checkTrackAssignments();
+
+ void instrumentLevelsChanged(InstrumentId,
+ const LevelInfo &);
+
+ void controllerDeviceEventReceived(MappedEvent *,
+ const void *);
+
+ void instrumentParametersChanged(InstrumentId);
+
+protected:
+ NotationView *createNotationView(std::vector<Segment *>);
+ MatrixView *createMatrixView (std::vector<Segment *>, bool drumMode);
+ EventView *createEventView (std::vector<Segment *>);
+
+ virtual void windowActivationChange(bool);
+
+ //--------------- Data members ---------------------------------
+
+ SimpleRulerScale *m_rulerScale;
+ TrackEditor *m_trackEditor;
+
+ SegmentParameterBox *m_segmentParameterBox;
+ InstrumentParameterBox *m_instrumentParameterBox;
+ TrackParameterBox *m_trackParameterBox;
+
+ static const QWidget *m_lastActiveMainWindow;
+};
+
+
+}
+
+#endif
diff --git a/src/gui/application/RosegardenIface.cpp b/src/gui/application/RosegardenIface.cpp
new file mode 100644
index 0000000..7e07f14
--- /dev/null
+++ b/src/gui/application/RosegardenIface.cpp
@@ -0,0 +1,82 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Parts of this file are from KDE Konqueror : KonqMainWindowIface
+ Copyright (C) 2000 Simon Hausmann <[email protected]>
+ Copyright (C) 2000 David Faure <[email protected]>
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "RosegardenIface.h"
+
+#include "sound/MappedComposition.h"
+#include <dcopobject.h>
+#include <dcopref.h>
+#include <kaction.h>
+#include <kdcopactionproxy.h>
+#include <kmainwindow.h>
+#include <qcstring.h>
+#include <qstring.h>
+#include <qvaluelist.h>
+#include <kapplication.h>
+#include <dcopclient.h>
+
+
+namespace Rosegarden
+{
+
+RosegardenIface::RosegardenIface(KMainWindow* mainWindow)
+ : DCOPObject(mainWindow->name()),
+ m_dcopActionProxy(0)
+{}
+
+void RosegardenIface::iFaceDelayedInit(KMainWindow* mainWindow)
+{
+ m_dcopActionProxy = new KDCOPActionProxy(mainWindow->actionCollection(),
+ this);
+}
+
+DCOPRef RosegardenIface::action(const QCString &name)
+{
+ return DCOPRef(kapp->dcopClient()->appId(),
+ m_dcopActionProxy->actionObjectId(name));
+}
+
+QCStringList RosegardenIface::actions()
+{
+ QCStringList res;
+ QValueList<KAction *> lst = m_dcopActionProxy->actions();
+ QValueList<KAction *>::ConstIterator it = lst.begin();
+ QValueList<KAction *>::ConstIterator end = lst.end();
+ for (; it != end; ++it )
+ res.append( (*it)->name() );
+
+ return res;
+}
+
+QMap<QCString,DCOPRef> RosegardenIface::actionMap()
+{
+ return m_dcopActionProxy->actionMap();
+}
+
+}
diff --git a/src/gui/application/RosegardenIface.h b/src/gui/application/RosegardenIface.h
new file mode 100644
index 0000000..baa8b4e
--- /dev/null
+++ b/src/gui/application/RosegardenIface.h
@@ -0,0 +1,130 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Parts of this file are from KDE Konqueror : KonqMainWindowIface
+ Copyright (C) 2000 Simon Hausmann <[email protected]>
+ Copyright (C) 2000 David Faure <[email protected]>
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_ROSEGARDENIFACE_H_
+#define _RG_ROSEGARDENIFACE_H_
+
+#include <dcopobject.h>
+#include <dcopref.h>
+#include <qmap.h>
+#include <qstring.h>
+#include <qvaluevector.h>
+
+#include "base/Instrument.h"
+#include "sound/MappedComposition.h"
+
+class QCString;
+class KMainWindow;
+class KDCOPActionProxy;
+
+
+namespace Rosegarden
+{
+
+
+/**
+ * RosegardenGUI DCOP Interface
+ */
+class RosegardenIface : virtual public DCOPObject
+{
+ K_DCOP
+
+public:
+ RosegardenIface(KMainWindow*);
+ void iFaceDelayedInit(KMainWindow*);
+
+k_dcop:
+ virtual void openFile(QString file) = 0;
+ virtual void openURL(QString url) = 0;
+ virtual void mergeFile(QString file) = 0;
+ virtual void fileNew() = 0;
+ virtual void fileSave() = 0;
+ virtual void fileClose() = 0;
+ virtual void quit() = 0;
+
+ virtual void play() = 0;
+ virtual void stop() = 0;
+ virtual void rewind() = 0;
+ virtual void fastForward() = 0;
+ virtual void record() = 0;
+ virtual void rewindToBeginning() = 0;
+ virtual void fastForwardToEnd() = 0;
+ virtual void jumpToTime(int sec, int usec) = 0;
+ virtual void startAtTime(int sec, int usec) = 0;
+
+ // Extra functions used by Infrared Remotes
+ virtual void trackDown() = 0;
+ virtual void trackUp() = 0;
+ virtual void toggleMutedCurrentTrack() = 0;
+ virtual void toggleRecordCurrentTrack() = 0;
+
+ // Sequencer updates GUI with status
+ //
+ virtual void notifySequencerStatus(int status) = 0;
+
+ // Used to map unexpected (async) MIDI events to the user interface.
+ // We can show these on the Transport or on a MIDI Mixer.
+ //
+ virtual void processAsynchronousMidi(const MappedComposition &mC) = 0;
+
+ // The sequencer tries to call this action until it can - then
+ // we can go on and retrive device information
+ //
+ virtual void alive() = 0;
+
+ // The sequencer requests that a new audio file is created - the
+ // gui does so and returns the path of the new file so that the
+ // sequencer can use it.
+ //
+ virtual QString createNewAudioFile() = 0;
+ virtual QValueVector<QString> createRecordAudioFiles
+ (const QValueVector<InstrumentId> &recordInstruments) = 0;
+ virtual QString getAudioFilePath() = 0;
+
+ virtual QValueVector<InstrumentId> getArmedInstruments() = 0;
+
+ virtual void showError(QString error) = 0;
+
+ // Actions proxy
+ //
+ DCOPRef action( const QCString &name );
+ QCStringList actions();
+ QMap<QCString,DCOPRef> actionMap();
+
+protected:
+ //--------------- Data members ---------------------------------
+
+ KDCOPActionProxy *m_dcopActionProxy;
+
+};
+
+
+}
+
+#endif
diff --git a/src/gui/application/SetWaitCursor.cpp b/src/gui/application/SetWaitCursor.cpp
new file mode 100644
index 0000000..7fc0053
--- /dev/null
+++ b/src/gui/application/SetWaitCursor.cpp
@@ -0,0 +1,95 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "SetWaitCursor.h"
+
+#include "gui/editors/segment/TrackEditor.h"
+#include "gui/editors/segment/segmentcanvas/CompositionView.h"
+#include "misc/Debug.h"
+#include "RosegardenGUIApp.h"
+#include "RosegardenGUIView.h"
+#include <kcursor.h>
+#include <qcursor.h>
+#include <qwidget.h>
+#include <kapplication.h>
+
+namespace Rosegarden
+{
+
+SetWaitCursor::SetWaitCursor()
+ : m_guiApp(dynamic_cast<RosegardenGUIApp*>(kapp->mainWidget()))
+{
+ if (m_guiApp) {
+
+ // play it safe, so we can use this class at anytime even very early in the app init
+ if ((m_guiApp->getView() &&
+ m_guiApp->getView()->getTrackEditor() &&
+ m_guiApp->getView()->getTrackEditor()->getSegmentCanvas() &&
+ m_guiApp->getView()->getTrackEditor()->getSegmentCanvas()->viewport())) {
+
+ m_saveSegmentCanvasCursor = m_guiApp->getView()->getTrackEditor()->getSegmentCanvas()->viewport()->cursor();
+
+ }
+
+ RG_DEBUG << "SetWaitCursor::SetWaitCursor() : setting waitCursor\n";
+ m_saveCursor = m_guiApp->cursor();
+
+ m_guiApp->setCursor(KCursor::waitCursor());
+ }
+}
+
+SetWaitCursor::~SetWaitCursor()
+{
+ if (m_guiApp) {
+
+ RG_DEBUG << "SetWaitCursor::SetWaitCursor() : restoring normal cursor\n";
+ QWidget* viewport = 0;
+ QCursor currentSegmentCanvasCursor;
+
+ if ((m_guiApp->getView() &&
+ m_guiApp->getView()->getTrackEditor() &&
+ m_guiApp->getView()->getTrackEditor()->getSegmentCanvas() &&
+ m_guiApp->getView()->getTrackEditor()->getSegmentCanvas()->viewport())) {
+ viewport = m_guiApp->getView()->getTrackEditor()->getSegmentCanvas()->viewport();
+ currentSegmentCanvasCursor = viewport->cursor();
+ }
+
+ m_guiApp->setCursor(m_saveCursor);
+
+ if (viewport) {
+ if (currentSegmentCanvasCursor.shape() == KCursor::waitCursor().shape()) {
+ viewport->setCursor(m_saveSegmentCanvasCursor);
+ } else {
+ viewport->setCursor(currentSegmentCanvasCursor); // because m_guiApp->setCursor() has replaced it
+ }
+ }
+
+ // otherwise, it's been modified elsewhere, so leave it as is
+
+ }
+
+}
+
+}
diff --git a/src/gui/application/SetWaitCursor.h b/src/gui/application/SetWaitCursor.h
new file mode 100644
index 0000000..38687c5
--- /dev/null
+++ b/src/gui/application/SetWaitCursor.h
@@ -0,0 +1,58 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_SETWAITCURSOR_H_
+#define _RG_SETWAITCURSOR_H_
+
+#include <qcursor.h>
+
+
+
+
+namespace Rosegarden
+{
+
+class RosegardenGUIApp;
+
+
+/**
+ * Temporarily change the global cursor to waitCursor
+ */
+class SetWaitCursor
+{
+public:
+ SetWaitCursor();
+ ~SetWaitCursor();
+
+protected:
+ RosegardenGUIApp* m_guiApp;
+ QCursor m_saveCursor;
+ QCursor m_saveSegmentCanvasCursor;
+};
+
+
+}
+
+#endif
diff --git a/src/gui/application/StartupTester.cpp b/src/gui/application/StartupTester.cpp
new file mode 100644
index 0000000..15940b6
--- /dev/null
+++ b/src/gui/application/StartupTester.cpp
@@ -0,0 +1,248 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "StartupTester.h"
+
+#include "misc/Debug.h"
+#include "gui/dialogs/LilyPondOptionsDialog.h"
+
+#include <kprocess.h>
+#include <qmutex.h>
+#include <qthread.h>
+#include <qregexp.h>
+
+
+namespace Rosegarden
+{
+
+StartupTester::StartupTester() :
+ m_ready(false),
+ m_haveProjectPackager(false),
+ m_haveLilyPondView(false),
+ m_haveAudioFileImporter(false)
+{
+ QHttp *http = new QHttp();
+ connect(http, SIGNAL(responseHeaderReceived(const QHttpResponseHeader &)),
+ this, SLOT(slotHttpResponseHeaderReceived(const QHttpResponseHeader &)));
+ connect(http, SIGNAL(done(bool)),
+ this, SLOT(slotHttpDone(bool)));
+ m_versionHttpFailed = false;
+ http->setHost("www.rosegardenmusic.com");
+ http->get("/latest-version.txt");
+}
+
+StartupTester::~StartupTester()
+{
+}
+
+void
+StartupTester::run()
+{
+ m_projectPackagerMutex.lock();
+ m_lilyPondViewMutex.lock();
+ m_audioFileImporterMutex.lock();
+ m_ready = true;
+
+ KProcess *proc = new KProcess();
+ m_stdoutBuffer = "";
+ QObject::connect(proc, SIGNAL(receivedStdout(KProcess *, char *, int)),
+ this, SLOT(stdoutReceived(KProcess *, char *, int)));
+ *proc << "rosegarden-audiofile-importer";
+ *proc << "--conftest";
+ proc->start(KProcess::Block, KProcess::All);
+ if (!proc->normalExit() || proc->exitStatus()) {
+ RG_DEBUG << "StartupTester - No audio file importer available" << endl;
+ m_haveAudioFileImporter = false;
+ parseStdoutBuffer(m_audioFileImporterMissing);
+ } else {
+ RG_DEBUG << "StartupTester - Audio file importer OK" << endl;
+ m_haveAudioFileImporter = true;
+ }
+ delete proc;
+ m_audioFileImporterMutex.unlock();
+
+ proc = new KProcess;
+ m_stdoutBuffer = "";
+ QObject::connect(proc, SIGNAL(receivedStdout(KProcess *, char *, int)),
+ this, SLOT(stdoutReceived(KProcess *, char *, int)));
+ *proc << "rosegarden-project-package";
+ *proc << "--conftest";
+ proc->start(KProcess::Block, KProcess::All);
+ if (!proc->normalExit() || proc->exitStatus()) {
+ m_haveProjectPackager = false;
+ // rosegarden-project-package ran but exited with an error code
+ RG_DEBUG << "StartupTester - No project packager available" << endl;
+ m_haveProjectPackager = false;
+ parseStdoutBuffer(m_projectPackagerMissing);
+ } else {
+ RG_DEBUG << "StartupTester - Project packager OK" << endl;
+ m_haveProjectPackager = true;
+ }
+ delete proc;
+ m_projectPackagerMutex.unlock();
+
+ proc = new KProcess();
+ m_stdoutBuffer = "";
+ QObject::connect(proc, SIGNAL(receivedStdout(KProcess *, char *, int)),
+ this, SLOT(stdoutReceived(KProcess *, char *, int)));
+ *proc << "rosegarden-lilypondview";
+ *proc << "--conftest";
+ proc->start(KProcess::Block, KProcess::All);
+ if (!proc->normalExit() || proc->exitStatus()) {
+ RG_DEBUG << "StartupTester - No lilypondview available" << endl;
+ m_haveLilyPondView = false;
+ parseStdoutBuffer(m_lilyPondViewMissing);
+ } else {
+ RG_DEBUG << "StartupTester - lilypondview OK" << endl;
+ m_haveLilyPondView = true;
+ QRegExp re("LilyPond version: ([^\n]*)");
+ if (re.search(m_stdoutBuffer) != -1) {
+ LilyPondOptionsDialog::setDefaultLilyPondVersion(re.cap(1));
+ }
+ }
+ delete proc;
+ m_lilyPondViewMutex.unlock();
+}
+
+bool
+StartupTester::isReady()
+{
+ while (!m_ready)
+ usleep(10000);
+ if (m_projectPackagerMutex.tryLock()) {
+ m_projectPackagerMutex.unlock();
+ } else {
+ return false;
+ }
+ if (m_lilyPondViewMutex.tryLock()) {
+ m_lilyPondViewMutex.unlock();
+ } else {
+ return false;
+ }
+ return true;
+}
+
+void
+StartupTester::stdoutReceived(KProcess *, char *buffer, int len)
+{
+ m_stdoutBuffer += QString::fromLatin1(buffer, len);
+}
+
+void
+StartupTester::parseStdoutBuffer(QStringList &target)
+{
+ QRegExp re("Required: ([^\n]*)");
+ if (re.search(m_stdoutBuffer) != -1) {
+ target = QStringList::split(", ", re.cap(1));
+ }
+}
+
+bool
+StartupTester::haveProjectPackager(QStringList *missing)
+{
+ while (!m_ready)
+ usleep(10000);
+ QMutexLocker locker(&m_projectPackagerMutex);
+ if (missing) *missing = m_projectPackagerMissing;
+ return m_haveProjectPackager;
+}
+
+bool
+StartupTester::haveLilyPondView(QStringList *missing)
+{
+ while (!m_ready)
+ usleep(10000);
+ QMutexLocker locker(&m_lilyPondViewMutex);
+ if (missing) *missing = m_lilyPondViewMissing;
+ return m_haveLilyPondView;
+}
+
+bool
+StartupTester::haveAudioFileImporter(QStringList *missing)
+{
+ while (!m_ready)
+ usleep(10000);
+ QMutexLocker locker(&m_audioFileImporterMutex);
+ if (missing) *missing = m_audioFileImporterMissing;
+ return m_haveAudioFileImporter;
+}
+
+bool
+StartupTester::isVersionNewerThan(QString a, QString b)
+{
+ QRegExp re("[._-]");
+ QStringList alist = QStringList::split(re, a);
+ QStringList blist = QStringList::split(re, b);
+ int ae = alist.size();
+ int be = blist.size();
+ int e = std::max(ae, be);
+ for (int i = 0; i < e; ++i) {
+ int an = 0, bn = 0;
+ if (i < ae) {
+ an = alist[i].toInt();
+ if (an == 0) an = -1; // non-numeric field -> "-pre1" etc
+ }
+ if (i < be) {
+ bn = blist[i].toInt();
+ if (bn == 0) bn = -1;
+ }
+ if (an < bn) return false;
+ if (an > bn) return true;
+ }
+ return false;
+}
+
+void
+StartupTester::slotHttpResponseHeaderReceived(const QHttpResponseHeader &h)
+{
+ if (h.statusCode() / 100 != 2) m_versionHttpFailed = true;
+}
+
+void
+StartupTester::slotHttpDone(bool error)
+{
+ QHttp *http = const_cast<QHttp *>(dynamic_cast<const QHttp *>(sender()));
+ if (!http) return;
+ http->deleteLater();
+ if (error) return;
+
+ QByteArray responseData = http->readAll();
+ QString str = QString::fromUtf8(responseData.data());
+ QStringList lines = QStringList::split('\n', str);
+ if (lines.empty()) return;
+
+ QString latestVersion = lines[0];
+ std::cerr << "Comparing current version \"" << VERSION
+ << "\" with latest version \"" << latestVersion << "\""
+ << std::endl;
+ if (isVersionNewerThan(latestVersion, VERSION)) {
+ emit newerVersionAvailable(latestVersion);
+ }
+}
+
+}
+
+#include "StartupTester.moc"
+
diff --git a/src/gui/application/StartupTester.h b/src/gui/application/StartupTester.h
new file mode 100644
index 0000000..9c82e07
--- /dev/null
+++ b/src/gui/application/StartupTester.h
@@ -0,0 +1,88 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_STARTUPTESTER_H_
+#define _RG_STARTUPTESTER_H_
+
+#include <qmutex.h>
+#include <qthread.h>
+#include <qstringlist.h>
+#include <qobject.h>
+#include <qhttp.h>
+
+class KProcess;
+
+namespace Rosegarden
+{
+
+class StartupTester : public QObject, public QThread
+{
+ Q_OBJECT
+
+public:
+ StartupTester();
+ virtual ~StartupTester();
+
+ virtual void run();
+
+ bool isReady();
+
+ // If you call one of these methods before the startup test has
+ // completed in the background, then it will block.
+
+ bool haveProjectPackager(QStringList *missingApplications);
+ bool haveLilyPondView(QStringList *missingApplications);
+ bool haveAudioFileImporter(QStringList *missingApplications);
+
+signals:
+ void newerVersionAvailable(QString);
+
+protected slots:
+ void stdoutReceived(KProcess *, char *, int);
+
+ void slotHttpResponseHeaderReceived(const QHttpResponseHeader &);
+ void slotHttpDone(bool);
+
+protected:
+ bool m_ready;
+ QMutex m_projectPackagerMutex;
+ QMutex m_lilyPondViewMutex;
+ QMutex m_audioFileImporterMutex;
+ bool m_haveProjectPackager;
+ QStringList m_projectPackagerMissing;
+ bool m_haveLilyPondView;
+ QStringList m_lilyPondViewMissing;
+ bool m_haveAudioFileImporter;
+ QStringList m_audioFileImporterMissing;
+ QString m_stdoutBuffer;
+ bool m_versionHttpFailed;
+ void parseStdoutBuffer(QStringList &target);
+ bool isVersionNewerThan(QString, QString);
+};
+
+
+}
+
+#endif
diff --git a/src/gui/application/main.cpp b/src/gui/application/main.cpp
new file mode 100644
index 0000000..d7b5779
--- /dev/null
+++ b/src/gui/application/main.cpp
@@ -0,0 +1,741 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include <qtimer.h>
+#include <kapplication.h>
+#include <sys/time.h>
+#include "base/RealTime.h"
+
+#include <kcmdlineargs.h>
+#include <kaboutdata.h>
+#include <klocale.h>
+#include <dcopclient.h>
+#include <kconfig.h>
+#include <kmessagebox.h>
+#include <kstddirs.h>
+#include <ktip.h>
+#include <kprocess.h>
+#include <kglobalsettings.h>
+
+#include <qstringlist.h>
+#include <qregexp.h>
+#include <qvbox.h>
+#include <qlabel.h>
+
+#include "document/ConfigGroups.h"
+#include "misc/Strings.h"
+#include "misc/Debug.h"
+#include "gui/application/RosegardenGUIApp.h"
+#include "gui/widgets/CurrentProgressDialog.h"
+#include "document/RosegardenGUIDoc.h"
+#include "gui/kdeext/KStartupLogo.h"
+
+#include "gui/application/RosegardenApplication.h"
+#include "gui/application/RosegardenDCOP.h"
+
+#include "gui/kdeext/klearlook.h"
+
+using namespace Rosegarden;
+
+/*! \mainpage Rosegarden global design
+
+Rosegarden is split into 3 main parts:
+
+\section base Base
+
+The base library holds all of the fundamental "music handling"
+structures, of which the primary ones are Event, Segment, Track,
+Instrument and Composition. It also contains a selection of utility
+and helper classes of a kind that is not specific to any particular
+GUI. Everything here is part of the Rosegarden namespace, and there
+are no dependencies on KDE or Qt (although it uses the STL heavily).
+
+The keyword for the basic structures in use is "flexibility". Our
+Event objects can be extended arbitrarily for the convenience of GUI
+or performance code without having to change their declaration or
+modify anything in the base library. And most of our assumptions
+about the use of the container classes can be violated without
+disastrous side-effects.
+
+\subsection musicstructs Music Structures
+
+ - \link Event Event\endlink is the basic musical element. It's more or less a
+ generalization of the MIDI event. Each note or rest, each key
+ change or tempo change, is an event: there's no "note class" or
+ "rest class" as such, they are simply represented by events whose
+ type happens to be "note" or "rest".
+ Each Event has a type code, absolute time (the moment at which the
+ Event starts, relative only to the start of the Composition) and
+ duration (usually non-zero only for notes and rests), together
+ with an arbitrary set of named and typed properties that can be
+ assigned and queried dynamically by other parts of the
+ application. So, for example, a note event is likely to have an
+ integer property called "pitch", and probably a "velocity", as
+ well as potentially many others -- but this is not fixed anywhere,
+ and there's no definition of what exactly a note is: client code
+ is simply expected to ignore any unrecognised events or properties
+ and to cope if properties that should be there are not.
+
+ - \link Segment Segment\endlink is a series of consecutive Events found on the same Track,
+ automatically ordered by their absolute time. It's the usual
+ container for Events. A Segment has a starting time that can be
+ changed, and a duration that is based solely on the end time of
+ the last Event it contains. Note that in order to facilitate
+ musical notation editing, we explicitly store silences as series
+ of rest Events; thus a Segment really should contain no gaps
+ between its Events. (This isn't checked anywhere and nothing will
+ break very badly if there are gaps, but notation won't quite work
+ correctly.)
+
+ - \link Track Track \endlink is much the same thing as on a mixing table, usually
+ assigned to an instrument, a voice, etc. Although a Track is not
+ a container of Events and is not strictly a container of Segments
+ either, it is referred to by a set of Segments that are therefore
+ mutually associated with the same instruments and parameters. In
+ GUI terms, the Track is a horizontal row on the main Rosegarden
+ window, whereas a Segment is a single blue box within that row, of
+ which there may be any number.
+
+ - \link Instrument Instrument \endlink corresponds broadly to a MIDI or Audio channel, and is
+ the destination for a performed Event. Each Track is mapped to a
+ single Instrument (although many Tracks may have the same
+ Instrument), and the Instrument is indicated in the header at the
+ left of the Track's row in the GUI.
+
+ - \link Composition Composition\endlink is the container for the entire piece of music. It
+ consists of a set of Segments, together with a set of Tracks that
+ the Segments may or may not be associated with, a set of
+ Instruments, and some information about time signature and tempo
+ changes. (The latter are not stored in Segments; they are only
+ stored in the top-level Composition. You can't have differing
+ time signatures or tempos in different Segments.) Any code that
+ wants to know about the locations of bar lines, or request
+ real-time calculations based on tempo changes, talks to the
+ Composition.
+
+
+See also docs/data_struct/units.txt for an explanation of the units we
+use for time and pitch values. See docs/discussion/names.txt for some
+name-related discussion. See docs/code/creating_events.txt for an
+explanation of how to create new Events and add properties to them.
+
+The base directory also contains various music-related helper classes:
+
+ - The NotationTypes.[Ch] files contain classes that help with
+ creating and manipulating events. It's very important to realise
+ that these classes are not the events themselves: although there
+ is a Note class in this file, and a TimeSignature class, and Clef
+ and Key classes, instances of these are rarely stored anywhere.
+ Instead they're created on-the-fly in order to do calculation
+ related to note durations or time signatures or whatever, and they
+ contain getAsEvent() methods that may be used when an event for
+ storage is required. But the class of a stored event is always
+ simply Event.
+
+ The NotationTypes classes also define important constants for the
+ names of common properties in Events. For example, the Note class
+ contains Note::EventType, which is the type of a note Event, and
+ Note::EventRestType, the type of a rest Event; and Key contains
+ Key::EventType, the type of a key change Event, KeyPropertyName,
+ the name of the property that defines the key change, and a set
+ of the valid strings for key changes.
+
+ - BaseProperties.[Ch] contains a set of "standard"-ish Event
+ property names that are not basic enough to go in NotationTypes.
+
+ - \link SegmentNotationHelper SegmentNotationHelper\endlink
+ and \link SegmentPerformanceHelper SegmentPerformanceHelper\endlink
+ do tasks that
+ may be useful to notation-type code and performer code
+ respectively. For example, SegmentNotationHelper is used to
+ manage rests when inserting and deleting notes in a score editor,
+ and to create beamed groups and suchlike; SegmentPerformanceHelper
+ generally does calculations involving real performance time of
+ notes (taking into account tied notes, tuplets and tempo changes).
+ These two lightweight helper classes are also usually constructed
+ on-the-fly for use on the events in a given Segment and then
+ discarded after use.
+
+ - \link Quantizer Quantizer\endlink is used to quantize event timings and set quantized
+ timing properties on those events. Note that quantization is
+ non-destructive, as it takes advantage of the ability to set new
+ Event properties to simply assign the quantized values as separate
+ properties from the original absolute time and duration.
+
+
+\section gui GUI
+
+The GUI directory builds into a KDE/Qt application. Like most KDE
+applications, it follows a document/view model. The document (class
+RosegardenGUIDoc, which wraps a Composition) can have several views
+(class RosegardenGUIView), although at the moment only a single one is
+used.
+
+This view is the TrackEditor, which shows all the Composition's
+Segments organized in Tracks. Each Segment can be edited in two ways:
+notation (score) or matrix (piano roll).
+
+All editor views are derived from EditView. An EditView is the class
+dealing with the edition per se of the events. It uses several
+components:
+
+ - Layout classes, horizontal and vertical: these are the classes
+ which determine the x and y coordinates of the graphic items
+ representing the events (notes or piano-roll rectangles). They
+ are derived from the LayoutEngine base-class in the base library.
+
+ - Tools, which implement each editing function at the GUI (such as
+ insert, erase, cut and paste). These are the tools which appear on
+ the EditView's toolbar.
+
+ - Toolbox, which is a simple string => tool map.
+
+ - Commands, which are the fundamental implementations of editing
+ operations (both menu functions and tool operations) subclassed
+ from KDE's Command and used for undo and redo.
+
+ - a canvas view. Although this isn't a part of the EditView's
+ definition, both of the existing edit views (notation and matrix)
+ use one, because they both use a QCanvas to represent data.
+
+ - LinedStaff, a staff with lines. Like the canvas view, this isn't
+ part of the EditView definition, but both views use one.
+
+
+There are currently two editor views:
+
+ - NotationView, with accompanying classes NotationHLayout,
+ NotationVLayout, NotationStaff, and all the classes in the
+ notationtool and notationcommands files. These are also closely
+ associated with the NotePixmapFactory and NoteFont classes, which
+ are used to generate notes from component pixmap files.
+
+ - MatrixView, with accompanying classes MatrixHLayout,
+ MatrixVLayout, MatrixStaff and other classes in the matrixview
+ files.
+
+The editing process works as follows:
+
+[NOTE : in the following, we're talking both about events as UI events
+or user events (mouse button clicks, mouse move, keystrokes, etc...)
+and Events (our basic music element). To help lift the ambiguity,
+"events" is for UI events, Events is for Event.]
+
+ -# The canvas view gets the user events (see
+ NotationCanvasView::contentsMousePressEvent(QMouseEvent*) for an
+ example). It locates where the event occured in terms of musical
+ element: which note or staff line the user clicked on, which pitch
+ and time this corresponds to, that kind of stuff. (In the
+ Notation and Matrix views, the LinedStaff calculates mappings
+ between coordinates and staff lines: the former is especially
+ complicated because of its support for page layout.)\n
+ -# The canvas view transmits this kind of info as a signal, which is
+ connected to a slot in the parent EditView.
+ -# The EditView delegates action to the current tool.\n
+ -# The tool performs the actual job (inserting or deleting a note,
+ etc...).
+
+Since this action is usually complex (merely inserting a note requires
+dealing with the surrounding Events, rests or notes), it does it
+through a SegmentHelper (for instance, base/SegmentNotationHelper)
+which "wraps" the complexity into simple calls and performs all the
+hidden tasks.
+
+The EditView also maintains (obviously) its visual appearance with the
+layout classes, applying them when appropriate.
+
+\section sequencer Sequencer
+
+The sequencer directory also builds into a KDE/Qt application, but one
+which doesn't have a gui. The Sequencer can be started automatically
+by the main Rosegarden GUI or manually if testing - it's sometimes
+more convenient to do the latter as the Sequencer needs to be connected
+up to the underlying sound system every time it is started.
+
+The Sequencer interfaces directly with \link AlsaDriver ALSA\endlink
+and provides MIDI "play" and "record" ports which can be connected to
+other MIDI clients (MIDI IN and OUT hardware ports or ALSA synth devices)
+using any ALSA MIDI Connection Manager. The Sequencer also supports
+playing and recording of Audio sample files using \link JackDriver Jack\endlink
+
+The GUI and Sequencer communicate using the KDE DCOP communication framework.
+Look in:
+ - \link rosegardenguiiface.h gui/rosegardenguiiface.h\endlink
+ - \link rosegardensequenceriface.h sequencer/rosegardensequenceriface.h\endlink
+
+for definitions of the DCOP interfaces pertinent to the Sequencer
+and GUI. The main DCOP operations from the GUI involve starting and
+stopping the Sequencer, playing and recording, fast forwarding and
+rewinding. Once a play or record cycle is enabled it's the Sequencer
+that does most of the hard work. Events are read from (or written to, when recording)
+a set of mmapped files.
+
+The Sequencer makes use of two libraries libRosegardenSequencer
+and libRosegardenSound:
+
+ - libRosegardenSequencer holds everything pertinent to sequencing
+ for Rosegarden including the
+ Sequencer class itself. This library is only linked into the
+ Rosegarden Sequencer.
+
+ - libRosegardenSound holds the MidiFile class (writing and reading
+ MIDI files) and the MappedEvent and MappedComposition classes (the
+ communication class for transferring events back and forth across
+ DCOP). This library is needed by the GUI as well as the Sequencer.
+
+The main Sequencer state machine is a good starting point and clearly
+visible at the bottom of rosegarden/sequencer/main.cpp.
+
+
+*/
+
+static const char *description =
+ I18N_NOOP("Rosegarden - A sequencer and musical notation editor");
+
+static KCmdLineOptions options[] =
+ {
+ { "nosequencer", I18N_NOOP("Don't use the sequencer (support editing only)"), 0 },
+ { "nosplash", I18N_NOOP("Don't show the splash screen"), 0 },
+ { "nofork", I18N_NOOP("Don't automatically run in the background"), 0 },
+ { "existingsequencer", I18N_NOOP("Attach to a running sequencer process, if found"), 0 },
+ { "ignoreversion", I18N_NOOP("Ignore installed version - for devs only"), 0 },
+ { "+[File]", I18N_NOOP("file to open"), 0 },
+ { 0, 0, 0 }
+ };
+
+
+// -----------------------------------------------------------------
+
+#ifdef Q_WS_X11
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>
+#include <X11/Xatom.h>
+#include <X11/SM/SMlib.h>
+
+static int _x_errhandler( Display *dpy, XErrorEvent *err )
+{
+ char errstr[256];
+ XGetErrorText( dpy, err->error_code, errstr, 256 );
+ if ( err->error_code != BadWindow )
+ kdWarning() << "Rosegarden: detected X Error: " << errstr << " " << err->error_code
+ << "\n Major opcode: " << err->request_code << endl;
+ return 0;
+}
+#endif
+
+// NOTE: to get a dump of the stack trace from KDE during program execution:
+// std::cerr << kdBacktrace() << std::endl
+// (see kdebug.h)
+
+void testInstalledVersion()
+{
+ QString versionLocation = locate("appdata", "version.txt");
+ QString installedVersion;
+
+ if (versionLocation) {
+ QFile versionFile(versionLocation);
+ if (versionFile.open(IO_ReadOnly)) {
+ QTextStream text(&versionFile);
+ QString s = text.readLine().stripWhiteSpace();
+ versionFile.close();
+ if (s) {
+ if (s == VERSION) return;
+ installedVersion = s;
+ }
+ }
+ }
+
+ if (installedVersion) {
+
+ KMessageBox::detailedError
+ (0,
+ i18n("Installation contains the wrong version of Rosegarden."),
+ i18n(" The wrong versions of Rosegarden's data files were\n"
+ " found in the standard KDE installation directories.\n"
+ " (I am %1, but the installed files are for version %2.)\n\n"
+ " This may mean one of the following:\n\n"
+ " 1. This is a new upgrade of Rosegarden, and it has not yet been\n"
+ " installed. If you compiled it yourself, check that you have\n"
+ " run \"make install\" and that the procedure completed\n"
+ " successfully.\n\n"
+ " 2. The upgrade was installed in a non-standard directory,\n"
+ " and an old version was found in a standard directory. If so,\n"
+ " you will need to add the correct directory to your KDEDIRS\n"
+ " environment variable before you can run it.").arg(VERSION).arg(installedVersion),
+ i18n("Installation problem"));
+
+ } else {
+
+ KMessageBox::detailedError
+ (0,
+ i18n("Rosegarden does not appear to have been installed."),
+ i18n(" One or more of Rosegarden's data files could not be\n"
+ " found in the standard KDE installation directories.\n\n"
+ " This may mean one of the following:\n\n"
+ " 1. Rosegarden has not been correctly installed. If you compiled\n"
+ " it yourself, check that you have run \"make install\" and that\n"
+ " the procedure completed successfully.\n\n"
+ " 2. Rosegarden has been installed in a non-standard directory,\n"
+ " and you need to add this directory to your KDEDIRS environment\n"
+ " variable before you can run it. This may be the case if you\n"
+ " installed into $HOME or a local third-party package directory\n"
+ " like /usr/local or /opt."),
+ i18n("Installation problem"));
+ }
+
+ exit(1);
+}
+
+
+int main(int argc, char *argv[])
+{
+ setsid(); // acquire shiny new process group
+
+ srandom((unsigned int)time(0) * (unsigned int)getpid());
+
+ KAboutData aboutData( "rosegarden", I18N_NOOP("Rosegarden"),
+ VERSION, description, KAboutData::License_GPL,
+ I18N_NOOP("Copyright 2000 - 2008 Guillaume Laurent, Chris Cannam, Richard Bown\nParts copyright 1994 - 2004 Chris Cannam, Andy Green, Richard Bown, Guillaume Laurent\nLilyPond fonts copyright 1997 - 2005 Han-Wen Nienhuys and Jan Nieuwenhuizen"),
+ 0,
+ "http://www.rosegardenmusic.com/",
+
+ aboutData.addAuthor("Guillaume Laurent (lead)", 0, "[email protected]", "http://telegraph-road.org");
+ aboutData.addAuthor("Chris Cannam (lead)", 0, "[email protected]", "http://all-day-breakfast.com");
+ aboutData.addAuthor("Richard Bown (lead)", 0, "[email protected]");
+ aboutData.addAuthor("D. Michael McIntyre", 0, "[email protected]");
+ aboutData.addAuthor("Pedro Lopez-Cabanillas", 0, "[email protected]");
+ aboutData.addAuthor("Heikki Johannes Junes", 0, "[email protected]");
+
+ aboutData.addCredit("Randall Farmer", I18N_NOOP("Chord labelling code"), " [email protected]");
+ aboutData.addCredit("Hans Kieserman", I18N_NOOP("LilyPond output\nassorted other patches\ni18n-ization"), "[email protected]");
+ aboutData.addCredit("Levi Burton", I18N_NOOP("UI improvements\nbug fixes"), "[email protected]");
+ aboutData.addCredit("Mark Hymers", I18N_NOOP("Segment colours\nOther UI and bug fixes"), "<[email protected]>");
+ aboutData.addCredit("Alexandre Prokoudine", I18N_NOOP("Russian translation\ni18n-ization"), "[email protected]");
+ aboutData.addCredit("Jörg Schumann", I18N_NOOP("German translation"), "[email protected]");
+ aboutData.addCredit("Eckhard Jokisch", I18N_NOOP("German translation"), "[email protected]");
+ aboutData.addCredit("Kevin Donnelly", I18N_NOOP("Welsh translation"));
+ aboutData.addCredit("Didier Burli", I18N_NOOP("French translation"), "[email protected]");
+ aboutData.addCredit("Yves Guillemot", I18N_NOOP("French translation\nBug fixes"), "[email protected]");
+ aboutData.addCredit("Daniele Medri", I18N_NOOP("Italian translation"), "[email protected]");
+ aboutData.addCredit("Alessandro Musesti", I18N_NOOP("Italian translation"), "[email protected]");
+ aboutData.addCredit("Stefan Asserhäll", I18N_NOOP("Swedish translation"), "[email protected]");
+ aboutData.addCredit("Erik Magnus Johansson", I18N_NOOP("Swedish translation"), "[email protected]");
+ aboutData.addCredit("Hasso Tepper", I18N_NOOP("Estonian translation"), "[email protected]");
+ aboutData.addCredit("Jelmer Vernooij", I18N_NOOP("Dutch translation"), "[email protected]");
+ aboutData.addCredit("Jasper Stein", I18N_NOOP("Dutch translation"), "[email protected]");
+ aboutData.addCredit("Kevin Liang", I18N_NOOP("HSpinBox class"), "[email protected]");
+ aboutData.addCredit("Arnout Engelen", I18N_NOOP("Transposition by interval"));
+ aboutData.addCredit("Thorsten Wilms", I18N_NOOP("Original designs for rotary controllers"), "[email protected]");
+ aboutData.addCredit("Oota Toshiya", I18N_NOOP("Japanese translation"), "[email protected]");
+ aboutData.addCredit("William", I18N_NOOP("Auto-scroll deceleration\nRests outside staves and other bug fixes"), "rosegarden4p AT orthoset.com");
+ aboutData.addCredit("Liu Songhe", I18N_NOOP("Simplified Chinese translation"), "[email protected]");
+ aboutData.addCredit("Toni Arnold", I18N_NOOP("LIRC infrared remote-controller support"), "<[email protected]>");
+ aboutData.addCredit("Vince Negri", I18N_NOOP("MTC slave timing implementation"), "[email protected]");
+ aboutData.addCredit("Jan Bína", I18N_NOOP("Czech translation"), "[email protected]");
+ aboutData.addCredit("Thomas Nagy", I18N_NOOP("SCons/bksys building system"), "[email protected]");
+ aboutData.addCredit("Vladimir Savic", I18N_NOOP("icons, icons, icons"), "[email protected]");
+ aboutData.addCredit("Marcos Germán Guglielmetti", I18N_NOOP("Spanish translation"), "[email protected]");
+ aboutData.addCredit("Lisandro Damián Nicanor Pérez Meyer", I18N_NOOP("Spanish translation"), "[email protected]");
+ aboutData.addCredit("Javier Castrillo", I18N_NOOP("Spanish translation"), "[email protected]");
+ aboutData.addCredit("Lucas Godoy", I18N_NOOP("Spanish translation"), "[email protected]");
+ aboutData.addCredit("Feliu Ferrer", I18N_NOOP("Catalan translation"), "[email protected]");
+ aboutData.addCredit("Quim Perez i Noguer", I18N_NOOP("Catalan translation"), "[email protected]");
+ aboutData.addCredit("Carolyn McIntyre", I18N_NOOP("1.2.3 splash screen photo\nGave birth to D. Michael McIntyre, bought him a good flute once\nupon a time, and always humored him when he came over to play her\nsome new instrument, even though she really hated his playing.\nBorn October 19, 1951, died September 21, 2007, R. I. P."), "DECEASED");
+ aboutData.addCredit("Stephen Torri", I18N_NOOP("Initial guitar chord editing code"), "[email protected]");
+ aboutData.addCredit("Piotr Sawicki", I18N_NOOP("Polish translation"), "[email protected]");
+ aboutData.addCredit("David García-Abad", I18N_NOOP("Basque translation"), "[email protected]");
+ aboutData.addCredit("Joerg C. Koenig, Craig Drummond, Bernhard Rosenkränzer, Preston Brown, Than Ngo", I18N_NOOP("Klearlook theme"), "[email protected]");
+
+ aboutData.setTranslator(I18N_NOOP("_: NAME OF TRANSLATORS\nYour names") , I18N_NOOP("_: EMAIL OF TRANSLATORS\nYour emails"));
+
+ KCmdLineArgs::init( argc, argv, &aboutData );
+ KCmdLineArgs::addCmdLineOptions( options ); // Add our own options.
+ KUniqueApplication::addCmdLineOptions(); // Add KUniqueApplication options.
+
+ if (!RosegardenApplication::start())
+ return 0;
+
+ RosegardenApplication app;
+
+ //
+ // Ensure quit on last window close
+ // Register main DCOP interface
+ //
+ QObject::connect(&app, SIGNAL(lastWindowClosed()), &app, SLOT(quit()));
+ app.dcopClient()->registerAs(app.name(), false);
+ app.dcopClient()->setDefaultObject(ROSEGARDEN_GUI_IFACE_NAME);
+
+ // Parse cmd line args
+ //
+ KCmdLineArgs *args = KCmdLineArgs::parsedArgs();
+
+ if (!args->isSet("ignoreversion")) {
+ // Give up immediately if we haven't been installed or if the
+ // installation is out of date
+ //
+ testInstalledVersion();
+ }
+
+ KConfig *config = kapp->config();
+
+ config->setGroup(GeneralOptionsConfigGroup);
+ QString lastVersion = config->readEntry("lastversion", "");
+ bool newVersion = (lastVersion != VERSION);
+ if (newVersion) {
+ std::cerr << "*** This is the first time running this Rosegarden version" << std::endl;
+ config->writeEntry("lastversion", VERSION);
+ }
+
+ // If there is no config setting for the startup window size, set
+ // one now. But base the default on the appropriate desktop size
+ // (i.e. not the entire desktop, if Xinerama is in use). This is
+ // obtained from KGlobalSettings::desktopGeometry(), but we can't
+ // give it a meaningful point to measure from at this stage so we
+ // always use the "leftmost" display (point 0,0).
+
+ // The config keys are "Height X" and "Width Y" where X and Y are
+ // the sizes of the available desktop (i.e. the whole shebang if
+ // under Xinerama). These are obtained from QDesktopWidget.
+
+ config->setGroup("MainView");
+ int windowWidth = 0, windowHeight = 0;
+
+ QDesktopWidget *desktop = KApplication::desktop();
+ if (desktop) {
+ QRect totalRect(desktop->screenGeometry());
+ QRect desktopRect = KGlobalSettings::desktopGeometry(QPoint(0, 0));
+ QSize startupSize;
+ if (desktopRect.height() <= 800) {
+ startupSize = QSize((desktopRect.width() * 6) / 7,
+ (desktopRect.height() * 6) / 7);
+ } else {
+ startupSize = QSize((desktopRect.width() * 4) / 5,
+ (desktopRect.height() * 4) / 5);
+ }
+ QString widthKey = QString("Width %1").arg(totalRect.width());
+ QString heightKey = QString("Height %1").arg(totalRect.height());
+ windowWidth = config->readUnsignedNumEntry
+ (widthKey, startupSize.width());
+ windowHeight = config->readUnsignedNumEntry
+ (heightKey, startupSize.height());
+ }
+
+ config->setGroup("KDE Action Restrictions");
+ config->writeEntry("action/help_report_bug", false);
+
+ config->setGroup(GeneralOptionsConfigGroup);
+ int install = config->readNumEntry("Install Own Theme", 1);
+ if (install == 2 || (install == 1 && !getenv("KDE_FULL_SESSION"))) {
+ kapp->setStyle(new KlearlookStyle);
+ }
+
+ // Show Startup logo
+ // (this code borrowed from KDevelop 2.0,
+ // (c) The KDevelop Development Team
+ //
+ config->setGroup(GeneralOptionsConfigGroup);
+ KStartupLogo* startLogo = 0L;
+
+ // See if the config wants us to control JACK
+ //
+ if (config->readBoolEntry("Logo", true) && (!kapp->isRestored() && args->isSet("splash")) ) {
+ RG_DEBUG << k_funcinfo << "Showing startup logo\n";
+ startLogo = KStartupLogo::getInstance();
+ startLogo->setShowTip(!newVersion);
+ startLogo->show();
+ }
+
+ struct timeval logoShowTime;
+ gettimeofday(&logoShowTime, 0);
+
+ //
+ // Start application
+ //
+ RosegardenGUIApp *rosegardengui = 0;
+
+ if (app.isRestored()) {
+ RG_DEBUG << "Restoring from session\n";
+
+ // RESTORE(RosegardenGUIApp);
+ int n = 1;
+ while (KMainWindow::canBeRestored(n)) {
+ // memory leak if more than one can be restored?
+ RG_DEBUG << "Restoring from session - restoring app #" << n << endl;
+ (rosegardengui = new RosegardenGUIApp)->restore(n);
+ n++;
+ }
+
+ } else {
+
+#ifndef NO_SOUND
+ app.setNoSequencerMode(!args->isSet("sequencer"));
+#else
+
+ app.setNoSequencerMode(true);
+#endif // NO_SOUND
+
+ rosegardengui = new RosegardenGUIApp(!app.noSequencerMode(),
+ args->isSet("existingsequencer"),
+ startLogo);
+
+ rosegardengui->setIsFirstRun(newVersion);
+
+ app.setMainWidget(rosegardengui);
+
+ if (windowWidth != 0 && windowHeight != 0) {
+ rosegardengui->resize(windowWidth, windowHeight);
+ }
+
+ rosegardengui->show();
+
+ // raise start logo
+ //
+ if (startLogo) {
+ startLogo->raise();
+ startLogo->setHideEnabled(true);
+ QApplication::flushX();
+ }
+
+ if (args->count()) {
+ rosegardengui->openFile(QFile::decodeName(args->arg(0)), RosegardenGUIApp::ImportCheckType);
+ } else {
+ // rosegardengui->openDocumentFile();
+ }
+
+ args->clear();
+
+ }
+
+ QObject::connect(&app, SIGNAL(aboutToSaveState()),
+ rosegardengui, SLOT(slotDeleteTransport()));
+
+ // Now that we've started up, raise start logo
+ //
+ if (startLogo) {
+ startLogo->raise();
+ startLogo->setHideEnabled(true);
+ QApplication::flushX();
+ }
+
+ // Check for sequencer and launch if needed
+ //
+ try {
+ rosegardengui->launchSequencer(args->isSet("existingsequencer"));
+ } catch (std::string e) {
+ RG_DEBUG << "RosegardenGUI - " << e << endl;
+ } catch (QString e) {
+ RG_DEBUG << "RosegardenGUI - " << e << endl;
+ } catch (Exception e) {
+ RG_DEBUG << "RosegardenGUI - " << e.getMessage() << endl;
+ }
+
+
+ config->setGroup(SequencerOptionsConfigGroup);
+
+ // See if the config wants us to load a soundfont
+ //
+ if (config->readBoolEntry("sfxloadenabled", false)) {
+ QString sfxLoadPath = config->readEntry("sfxloadpath", "/bin/sfxload");
+ QString soundFontPath = config->readEntry("soundfontpath", "");
+ QFileInfo sfxLoadInfo(sfxLoadPath), soundFontInfo(soundFontPath);
+ if (sfxLoadInfo.isExecutable() && soundFontInfo.isReadable()) {
+ KProcess* sfxLoadProcess = new KProcess;
+ (*sfxLoadProcess) << sfxLoadPath << soundFontPath;
+ RG_DEBUG << "Starting sfxload : " << sfxLoadPath << " " << soundFontPath << endl;
+
+ QObject::connect(sfxLoadProcess, SIGNAL(processExited(KProcess*)),
+ &app, SLOT(sfxLoadExited(KProcess*)));
+
+ sfxLoadProcess->start();
+ } else {
+ RG_DEBUG << "sfxload not executable or soundfont not readable : "
+ << sfxLoadPath << " " << soundFontPath << endl;
+ }
+
+ } else {
+ RG_DEBUG << "sfxload disabled\n";
+ }
+
+
+#ifdef Q_WS_X11
+ XSetErrorHandler( _x_errhandler );
+#endif
+
+ if (startLogo) {
+
+ // pause to ensure the logo has been visible for a reasonable
+ // length of time, just 'cos it looks a bit silly to show it
+ // and remove it immediately
+
+ struct timeval now;
+ gettimeofday(&now, 0);
+
+ RealTime visibleFor =
+ RealTime(now.tv_sec, now.tv_usec * 1000) -
+ RealTime(logoShowTime.tv_sec, logoShowTime.tv_usec * 1000);
+
+ if (visibleFor < RealTime(2, 0)) {
+ int waitTime = visibleFor.sec * 1000 + visibleFor.msec();
+ QTimer::singleShot(2500 - waitTime, startLogo, SLOT(close()));
+ } else {
+ startLogo->close();
+ }
+
+ } else {
+
+ // if the start logo is there, it's responsible for showing this;
+ // otherwise we have to
+
+ if (!newVersion) {
+ RosegardenGUIApp::self()->awaitDialogClearance();
+ KTipDialog::showTip(locate("data", "rosegarden/tips"));
+ }
+ }
+
+ if (newVersion) {
+ KStartupLogo::hideIfStillThere();
+ CurrentProgressDialog::freeze();
+
+ KDialogBase *dialog = new KDialogBase(rosegardengui, "welcome",
+ true, i18n("Welcome!"),
+ KDialogBase::Ok,
+ KDialogBase::Ok, false);
+ QVBox *mw = dialog->makeVBoxMainWidget();
+ QHBox *hb = new QHBox(mw);
+ QLabel *image = new QLabel(hb);
+ image->setAlignment(Qt::AlignTop);
+ QString iconFile = locate("appdata", "pixmaps/misc/welcome-icon.png");
+ if (iconFile) {
+ image->setPixmap(QPixmap(iconFile));
+ }
+ QLabel *label = new QLabel(hb);
+ label->setText(i18n("<h2>Welcome to Rosegarden!</h2><p>Welcome to the Rosegarden audio and MIDI sequencer and musical notation editor.</p><ul><li>If you have not already done so, you may wish to install some DSSI synth plugins, or a separate synth program such as QSynth. Rosegarden does not synthesize sounds from MIDI on its own, so without these you will hear nothing.</li><br><br><li>Rosegarden uses the JACK audio server for recording and playback of audio, and for playback from DSSI synth plugins. These features will only be available if the JACK server is running.</li><br><br><li>Rosegarden has comprehensive documentation: see the Help menu for the handbook, tutorials, and other information!</li></ul><p>Rosegarden was brought to you by a team of volunteers across the world. To learn more, go to <a href=\"http://www.rosegardenmusic.com/\">http://www.rosegardenmusic.com/</a>.</p>"));
+ dialog->showButtonOK(true);
+ rosegardengui->awaitDialogClearance();
+ dialog->exec();
+
+ CurrentProgressDialog::thaw();
+ }
+
+ return kapp->exec();
+}
+
diff --git a/src/gui/configuration/AudioConfigurationPage.cpp b/src/gui/configuration/AudioConfigurationPage.cpp
new file mode 100644
index 0000000..28aff71
--- /dev/null
+++ b/src/gui/configuration/AudioConfigurationPage.cpp
@@ -0,0 +1,323 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "AudioConfigurationPage.h"
+
+#include "sound/Midi.h"
+#include "sound/SoundDriver.h"
+#include "document/ConfigGroups.h"
+#include "base/MidiProgram.h"
+#include "base/Studio.h"
+#include "ConfigurationPage.h"
+#include "document/RosegardenGUIDoc.h"
+#include "gui/dialogs/ShowSequencerStatusDialog.h"
+#include "gui/seqmanager/SequenceManager.h"
+#include "gui/application/RosegardenApplication.h"
+#include "gui/studio/StudioControl.h"
+#include "sound/MappedEvent.h"
+#include "TabbedConfigurationPage.h"
+#include <kcombobox.h>
+#include <kconfig.h>
+#include <kfiledialog.h>
+#include <qcheckbox.h>
+#include <qcombobox.h>
+#include <qcstring.h>
+#include <qdatastream.h>
+#include <qframe.h>
+#include <qlabel.h>
+#include <qlineedit.h>
+#include <qobject.h>
+#include <qpushbutton.h>
+#include <qlayout.h>
+#include <qslider.h>
+#include <qspinbox.h>
+#include <qstring.h>
+#include <qstringlist.h>
+#include <qtabwidget.h>
+#include <qtooltip.h>
+#include <qwidget.h>
+#include <kmessagebox.h>
+
+
+namespace Rosegarden
+{
+
+AudioConfigurationPage::AudioConfigurationPage(
+ RosegardenGUIDoc *doc,
+ KConfig *cfg,
+ QWidget *parent,
+ const char *name):
+ TabbedConfigurationPage(cfg, parent, name),
+ m_externalAudioEditorPath(0)
+{
+ // set the document in the super class
+ m_doc = doc;
+
+ m_cfg->setGroup(SequencerOptionsConfigGroup);
+
+ QFrame *frame = new QFrame(m_tabWidget);
+ QGridLayout *layout = new QGridLayout(frame, 7, 2, 10, 5);
+
+ QLabel *label = 0;
+
+ int row = 0;
+
+ m_cfg->setGroup(GeneralOptionsConfigGroup);
+
+ layout->setRowSpacing(row, 15);
+ ++row;
+
+ layout->addWidget(new QLabel(i18n("Audio preview scale"),
+ frame), row, 0);
+
+ m_previewStyle = new KComboBox(frame);
+ m_previewStyle->insertItem(i18n("Linear - easier to see loud peaks"));
+ m_previewStyle->insertItem(i18n("Meter scaling - easier to see quiet activity"));
+ m_previewStyle->setCurrentItem(m_cfg->readUnsignedNumEntry("audiopreviewstyle", 1));
+ layout->addMultiCellWidget(m_previewStyle, row, row, 1, 2);
+ ++row;
+
+#ifdef HAVE_LIBJACK
+ m_cfg->setGroup(SequencerOptionsConfigGroup);
+
+ label = new QLabel(i18n("Record audio files as"), frame);
+ m_audioRecFormat = new KComboBox(frame);
+ m_audioRecFormat->insertItem(i18n("16-bit PCM WAV format (smaller files)"));
+ m_audioRecFormat->insertItem(i18n("32-bit float WAV format (higher quality)"));
+ m_audioRecFormat->setCurrentItem(m_cfg->readUnsignedNumEntry("audiorecordfileformat", 1));
+ layout->addWidget(label, row, 0);
+ layout->addMultiCellWidget(m_audioRecFormat, row, row, 1, 2);
+ ++row;
+#endif
+
+ m_cfg->setGroup(GeneralOptionsConfigGroup);
+
+ layout->addWidget(new QLabel(i18n("External audio editor"), frame),
+ row, 0);
+
+ QString defaultAudioEditor = getBestAvailableAudioEditor();
+
+ std::cerr << "defaultAudioEditor = " << defaultAudioEditor << std::endl;
+
+ QString externalAudioEditor = m_cfg->readEntry("externalaudioeditor",
+ defaultAudioEditor);
+
+ if (externalAudioEditor == "") {
+ externalAudioEditor = defaultAudioEditor;
+ m_cfg->writeEntry("externalaudioeditor", externalAudioEditor);
+ }
+
+ m_externalAudioEditorPath = new QLineEdit(externalAudioEditor, frame);
+// m_externalAudioEditorPath->setMinimumWidth(150);
+ layout->addWidget(m_externalAudioEditorPath, row, 1);
+
+ QPushButton *changePathButton =
+ new QPushButton(i18n("Choose..."), frame);
+
+ layout->addWidget(changePathButton, row, 2);
+ connect(changePathButton, SIGNAL(clicked()), SLOT(slotFileDialog()));
+ ++row;
+
+ m_cfg->setGroup(SequencerOptionsConfigGroup);
+
+ layout->addWidget(new QLabel(i18n("Create JACK outputs"), frame),
+ row, 0);
+// ++row;
+
+#ifdef HAVE_LIBJACK
+ m_createFaderOuts = new QCheckBox(i18n("for individual audio instruments"), frame);
+ m_createFaderOuts->setChecked(m_cfg->readBoolEntry("audiofaderouts", false));
+
+// layout->addWidget(label, row, 0, Qt::AlignRight);
+ layout->addWidget(m_createFaderOuts, row, 1);
+ ++row;
+
+ m_createSubmasterOuts = new QCheckBox(i18n("for submasters"), frame);
+ m_createSubmasterOuts->setChecked(m_cfg->readBoolEntry("audiosubmasterouts",
+ false));
+
+// layout->addWidget(label, row, 0, Qt::AlignRight);
+ layout->addWidget(m_createSubmasterOuts, row, 1);
+ ++row;
+#endif
+
+ layout->setRowStretch(row, 10);
+
+ addTab(frame, i18n("General"));
+
+ // --------------------- Startup control ----------------------
+ //
+#ifdef HAVE_LIBJACK
+#define OFFER_JACK_START_OPTION 1
+#ifdef OFFER_JACK_START_OPTION
+
+ frame = new QFrame(m_tabWidget);
+ layout = new QGridLayout(frame, 8, 4, 10, 5);
+
+ row = 0;
+
+ layout->setRowSpacing(row, 15);
+ ++row;
+
+ label = new QLabel(i18n("Rosegarden can start the JACK audio daemon (jackd) for you automatically if it isn't already running when Rosegarden starts.\n\nThis is recommended for beginners and those who use Rosegarden as their main audio application, but it might not be to the liking of advanced users.\n\nIf you want to start JACK automatically, make sure the command includes a full path where necessary as well as any command-line arguments you want to use.\n\nFor example: /usr/local/bin/jackd -d alsa -d hw -r44100 -p 2048 -n 2\n\n"), frame);
+ label->setAlignment(Qt::WordBreak);
+
+ layout->addMultiCellWidget(label, row, row, 0, 3);
+ ++row;
+
+ // JACK control things
+ //
+ bool startJack = m_cfg->readBoolEntry("jackstart", false);
+ m_startJack = new QCheckBox(frame);
+ m_startJack->setChecked(startJack);
+
+ layout->addWidget(new QLabel(i18n("Start JACK when Rosegarden starts"), frame), 2, 0);
+
+ layout->addWidget(m_startJack, row, 1);
+ ++row;
+
+ layout->addWidget(new QLabel(i18n("JACK command"), frame),
+ row, 0);
+
+ QString jackPath = m_cfg->readEntry("jackcommand",
+ // "/usr/local/bin/jackd -d alsa -d hw -r 44100 -p 2048 -n 2");
+ "/usr/bin/qjackctl -s");
+ m_jackPath = new QLineEdit(jackPath, frame);
+
+ layout->addMultiCellWidget(m_jackPath, row, row, 1, 3);
+ ++row;
+
+ layout->setRowStretch(row, 10);
+
+ addTab(frame, i18n("JACK Startup"));
+
+#endif // OFFER_JACK_START_OPTION
+#endif // HAVE_LIBJACK
+
+}
+
+void
+AudioConfigurationPage::slotFileDialog()
+{
+ QString path = KFileDialog::getOpenFileName(QString::null, QString::null, this, i18n("External audio editor path"));
+ m_externalAudioEditorPath->setText(path);
+}
+
+void
+AudioConfigurationPage::apply()
+{
+ m_cfg->setGroup(SequencerOptionsConfigGroup);
+
+#ifdef HAVE_LIBJACK
+#ifdef OFFER_JACK_START_OPTION
+ // Jack control
+ //
+ m_cfg->writeEntry("jackstart", m_startJack->isChecked());
+ m_cfg->writeEntry("jackcommand", m_jackPath->text());
+#endif // OFFER_JACK_START_OPTION
+
+ // Jack audio inputs
+ //
+ m_cfg->writeEntry("audiofaderouts", m_createFaderOuts->isChecked());
+ m_cfg->writeEntry("audiosubmasterouts", m_createSubmasterOuts->isChecked());
+ m_cfg->writeEntry("audiorecordfileformat", m_audioRecFormat->currentItem());
+#endif
+
+ m_cfg->setGroup(GeneralOptionsConfigGroup);
+
+ int previewstyle = m_previewStyle->currentItem();
+ m_cfg->writeEntry("audiopreviewstyle", previewstyle);
+
+ QString externalAudioEditor = getExternalAudioEditor();
+
+ QStringList extlist = QStringList::split(" ", externalAudioEditor);
+ QString extpath = "";
+ if (extlist.size() > 0) extpath = extlist[0];
+
+ if (extpath != "") {
+ QFileInfo info(extpath);
+ if (!info.exists() || !info.isExecutable()) {
+ KMessageBox::error(0, i18n("External audio editor \"%1\" not found or not executable").arg(extpath));
+ m_cfg->writeEntry("externalaudioeditor", "");
+ } else {
+ m_cfg->writeEntry("externalaudioeditor", externalAudioEditor);
+ }
+ } else {
+ m_cfg->writeEntry("externalaudioeditor", "");
+ }
+}
+
+QString
+AudioConfigurationPage::getBestAvailableAudioEditor()
+{
+ static QString result = "";
+ static bool haveResult = false;
+
+ if (haveResult) return result;
+
+ QString path;
+ const char *cpath = getenv("PATH");
+ if (cpath) path = cpath;
+ else path = "/usr/bin:/bin";
+
+ QStringList pathList = QStringList::split(":", path);
+
+ const char *candidates[] = {
+ "mhwaveedit",
+ "rezound",
+ "audacity"
+ };
+
+ for (int i = 0;
+ i < sizeof(candidates)/sizeof(candidates[0]) && result == "";
+ i++) {
+
+ QString n(candidates[i]);
+
+ for (int j = 0;
+ j < pathList.size() && result == "";
+ j++) {
+
+ QDir dir(pathList[j]);
+ QString fp(dir.filePath(n));
+ QFileInfo fi(fp);
+
+ if (fi.exists() && fi.isExecutable()) {
+ if (n == "rezound") {
+ result = QString("%1 --audio-method=jack").arg(fp);
+ } else {
+ result = fp;
+ }
+ }
+ }
+ }
+
+ haveResult = true;
+ return result;
+}
+
+}
+#include "AudioConfigurationPage.moc"
+
diff --git a/src/gui/configuration/AudioConfigurationPage.h b/src/gui/configuration/AudioConfigurationPage.h
new file mode 100644
index 0000000..bd71df6
--- /dev/null
+++ b/src/gui/configuration/AudioConfigurationPage.h
@@ -0,0 +1,107 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_AUDIOCONFIGURATIONPAGE_H_
+#define _RG_AUDIOCONFIGURATIONPAGE_H_
+
+#include "TabbedConfigurationPage.h"
+#include <qstring.h>
+#include <klocale.h>
+#include <qlineedit.h>
+
+class QWidget;
+class QSpinBox;
+class QSlider;
+class QPushButton;
+class QLabel;
+class QComboBox;
+class QCheckBox;
+class KConfig;
+class KComboBox;
+
+
+namespace Rosegarden
+{
+
+class RosegardenGUIDoc;
+
+
+class AudioConfigurationPage : public TabbedConfigurationPage
+{
+ Q_OBJECT
+public:
+ AudioConfigurationPage(RosegardenGUIDoc *doc,
+ KConfig *cfg,
+ QWidget *parent=0,
+ const char *name=0);
+
+ virtual void apply();
+
+ static QString iconLabel() { return i18n("Audio"); }
+ static QString title() { return i18n("Audio Settings"); }
+ static QString iconName() { return "configure-audio"; }
+
+#ifdef HAVE_LIBJACK
+ QString getJackPath() { return m_jackPath->text(); }
+#endif // HAVE_LIBJACK
+
+ static QString getBestAvailableAudioEditor();
+
+protected slots:
+ void slotFileDialog();
+
+protected:
+ QString getExternalAudioEditor() { return m_externalAudioEditorPath->text(); }
+
+
+ //--------------- Data members ---------------------------------
+
+#ifdef HAVE_LIBJACK
+ QCheckBox *m_startJack;
+ QLineEdit *m_jackPath;
+#endif // HAVE_LIBJACK
+
+
+#ifdef HAVE_LIBJACK
+ // Number of JACK input ports our RG client creates -
+ // this decides how many audio input destinations
+ // we have.
+ //
+ QCheckBox *m_createFaderOuts;
+ QCheckBox *m_createSubmasterOuts;
+
+ QComboBox *m_audioRecFormat;
+
+#endif // HAVE_LIBJACK
+
+ QLineEdit* m_externalAudioEditorPath;
+ QComboBox* m_previewStyle;
+
+};
+
+
+
+}
+
+#endif
diff --git a/src/gui/configuration/AudioPropertiesPage.cpp b/src/gui/configuration/AudioPropertiesPage.cpp
new file mode 100644
index 0000000..65d574e
--- /dev/null
+++ b/src/gui/configuration/AudioPropertiesPage.cpp
@@ -0,0 +1,184 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "AudioPropertiesPage.h"
+
+#include "misc/Strings.h"
+#include "ConfigurationPage.h"
+#include "document/RosegardenGUIDoc.h"
+#include "gui/application/RosegardenApplication.h"
+#include "gui/studio/AudioPluginManager.h"
+#include "sound/AudioFileManager.h"
+#include "TabbedConfigurationPage.h"
+#include <kconfig.h>
+#include <kdiskfreesp.h>
+#include <kfiledialog.h>
+#include <kfile.h>
+#include <qcstring.h>
+#include <qdatastream.h>
+#include <qdialog.h>
+#include <qframe.h>
+#include <qlabel.h>
+#include <qpushbutton.h>
+#include <qstring.h>
+#include <qtabwidget.h>
+#include <qwidget.h>
+#include <qlayout.h>
+
+
+namespace Rosegarden
+{
+
+AudioPropertiesPage::AudioPropertiesPage(RosegardenGUIDoc *doc,
+ QWidget *parent,
+ const char *name)
+ : TabbedConfigurationPage(doc, parent, name)
+{
+ AudioFileManager &afm = doc->getAudioFileManager();
+
+ QFrame *frame = new QFrame(m_tabWidget);
+ QGridLayout *layout = new QGridLayout(frame, 4, 3, 10, 5);
+ layout->addWidget(new QLabel(i18n("Audio file path:"), frame), 0, 0);
+ m_path = new QLabel(QString(afm.getAudioPath().c_str()), frame);
+ layout->addWidget(m_path, 0, 1);
+
+ m_changePathButton =
+ new QPushButton(i18n("Choose..."), frame);
+
+ layout->addWidget(m_changePathButton, 0, 2);
+
+ m_diskSpace = new QLabel(frame);
+ layout->addWidget(new QLabel(i18n("Disk space remaining:"), frame), 1, 0);
+ layout->addWidget(m_diskSpace, 1, 1);
+
+ m_minutesAtStereo = new QLabel(frame);
+ layout->addWidget(
+ new QLabel(i18n("Equivalent minutes of 16-bit stereo:"),
+ frame), 2, 0);
+
+ layout->addWidget(m_minutesAtStereo, 2, 1, AlignCenter);
+
+ layout->setRowStretch(3, 2);
+
+ calculateStats();
+
+ connect(m_changePathButton, SIGNAL(released()),
+ SLOT(slotFileDialog()));
+
+ addTab(frame, i18n("Modify audio path"));
+}
+
+void
+AudioPropertiesPage::calculateStats()
+{
+ // This stolen from KDE libs kfile/kpropertiesdialog.cpp
+ //
+ QString mountPoint = KIO::findPathMountPoint(m_path->text());
+ KDiskFreeSp * job = new KDiskFreeSp;
+ connect(job, SIGNAL(foundMountPoint(const QString&, unsigned long, unsigned long,
+ unsigned long)),
+ this, SLOT(slotFoundMountPoint(const QString&, unsigned long, unsigned long,
+ unsigned long)));
+ job->readDF(mountPoint);
+}
+
+void
+AudioPropertiesPage::slotFoundMountPoint(const QString&,
+ unsigned long kBSize,
+ unsigned long /*kBUsed*/,
+ unsigned long kBAvail )
+{
+ m_diskSpace->setText(i18n("%1 out of %2 (%3% used)")
+ .arg(KIO::convertSizeFromKB(kBAvail))
+ .arg(KIO::convertSizeFromKB(kBSize))
+ .arg( 100 - (int)(100.0 * kBAvail / kBSize) ));
+
+
+ AudioPluginManager *apm = m_doc->getPluginManager();
+
+ int sampleRate = 48000;
+ QCString replyType;
+ QByteArray replyData;
+
+ if (rgapp->sequencerCall("getSampleRate()", replyType, replyData)) {
+
+ QDataStream streamIn(replyData, IO_ReadOnly);
+ unsigned int result;
+ streamIn >> result;
+ sampleRate = result;
+ }
+
+ // Work out total bytes and divide this by the sample rate times the
+ // number of channels (2) times the number of bytes per sample (2)
+ // times 60 seconds.
+ //
+ float stereoMins = ( float(kBAvail) * 1024.0 ) /
+ ( float(sampleRate) * 2.0 * 2.0 * 60.0 );
+ QString minsStr;
+ minsStr.sprintf("%8.1f", stereoMins);
+
+ m_minutesAtStereo->
+ setText(QString("%1 %2 %3Hz").arg(minsStr)
+ .arg(i18n("minutes at"))
+ .arg(sampleRate));
+}
+
+void
+AudioPropertiesPage::slotFileDialog()
+{
+ AudioFileManager &afm = m_doc->getAudioFileManager();
+
+ KFileDialog *fileDialog = new KFileDialog(QString(afm.getAudioPath().c_str()),
+ QString::null,
+ this, "file dialog", true);
+ fileDialog->setMode(KFile::Directory);
+
+ connect(fileDialog, SIGNAL(fileSelected(const QString&)),
+ SLOT(slotFileSelected(const QString&)));
+
+ connect(fileDialog, SIGNAL(destroyed()),
+ SLOT(slotDirectoryDialogClosed()));
+
+ if (fileDialog->exec() == QDialog::Accepted) {
+ m_path->setText(fileDialog->selectedFile());
+ calculateStats();
+ }
+ delete fileDialog;
+}
+
+void
+AudioPropertiesPage::apply()
+{
+ AudioFileManager &afm = m_doc->getAudioFileManager();
+ QString newDir = m_path->text();
+
+ if (!newDir.isNull()) {
+ afm.setAudioPath(qstrtostr(newDir));
+ m_doc->slotDocumentModified();
+ }
+}
+
+}
+#include "AudioPropertiesPage.moc"
diff --git a/src/gui/configuration/AudioPropertiesPage.h b/src/gui/configuration/AudioPropertiesPage.h
new file mode 100644
index 0000000..f21fecc
--- /dev/null
+++ b/src/gui/configuration/AudioPropertiesPage.h
@@ -0,0 +1,89 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_AUDIOPROPERTIESPAGE_H_
+#define _RG_AUDIOPROPERTIESPAGE_H_
+
+#include "TabbedConfigurationPage.h"
+#include <qstring.h>
+#include <klocale.h>
+
+
+class QWidget;
+class QPushButton;
+class QLabel;
+
+
+namespace Rosegarden
+{
+
+class RosegardenGUIDoc;
+
+
+/**
+ * Audio Properties page
+ *
+ * (document-wide settings)
+ */
+class AudioPropertiesPage : public TabbedConfigurationPage
+{
+ Q_OBJECT
+public:
+ AudioPropertiesPage(RosegardenGUIDoc *doc,
+ QWidget *parent=0, const char *name=0);
+ virtual void apply();
+
+ static QString iconLabel() { return i18n("Audio"); }
+ static QString title() { return i18n("Audio Settings"); }
+ static QString iconName() { return "configure-audio"; }
+
+protected slots:
+ void slotFileDialog();
+
+ // Work out and display remaining disk space and time left
+ // at current path.
+ //
+ void calculateStats();
+
+ void slotFoundMountPoint(const QString&,
+ unsigned long kBSize,
+ unsigned long kBUsed,
+ unsigned long kBAvail);
+
+protected:
+
+ //--------------- Data members ---------------------------------
+
+ QLabel *m_path;
+ QLabel *m_diskSpace;
+ QLabel *m_minutesAtStereo;
+
+ QPushButton *m_changePathButton;
+};
+
+
+}
+
+#endif
diff --git a/src/gui/configuration/ColourConfigurationPage.cpp b/src/gui/configuration/ColourConfigurationPage.cpp
new file mode 100644
index 0000000..f87cf20
--- /dev/null
+++ b/src/gui/configuration/ColourConfigurationPage.cpp
@@ -0,0 +1,165 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "ColourConfigurationPage.h"
+
+#include "misc/Debug.h"
+#include "misc/Strings.h"
+#include "base/Colour.h"
+#include "base/ColourMap.h"
+#include "commands/segment/SegmentColourMapCommand.h"
+#include "ConfigurationPage.h"
+#include "document/RosegardenGUIDoc.h"
+#include "document/MultiViewCommandHistory.h"
+#include "gui/general/GUIPalette.h"
+#include "gui/widgets/ColourTable.h"
+#include "TabbedConfigurationPage.h"
+#include <kcolordialog.h>
+#include <kconfig.h>
+#include <kinputdialog.h>
+#include <qcolor.h>
+#include <qframe.h>
+#include <qpushbutton.h>
+#include <qstring.h>
+#include <qtabwidget.h>
+#include <qwidget.h>
+#include <qlayout.h>
+
+
+namespace Rosegarden
+{
+
+ColourConfigurationPage::ColourConfigurationPage(RosegardenGUIDoc *doc,
+ QWidget *parent,
+ const char *name)
+ : TabbedConfigurationPage(doc, parent, name)
+{
+ QFrame *frame = new QFrame(m_tabWidget);
+ QGridLayout *layout = new QGridLayout(frame, 2, 2,
+ 10, 5);
+
+ m_map = m_doc->getComposition().getSegmentColourMap();
+
+ m_colourtable = new ColourTable(frame, m_map, m_listmap);
+ m_colourtable->setFixedHeight(280);
+
+ layout->addMultiCellWidget(m_colourtable, 0, 0, 0, 1);
+
+ QPushButton* addColourButton = new QPushButton(i18n("Add New Color"),
+ frame);
+ layout->addWidget(addColourButton, 1, 0, Qt::AlignHCenter);
+
+ QPushButton* deleteColourButton = new QPushButton(i18n("Delete Color"),
+ frame);
+ layout->addWidget(deleteColourButton, 1, 1, Qt::AlignHCenter);
+
+ connect(addColourButton, SIGNAL(clicked()),
+ this, SLOT(slotAddNew()));
+
+ connect(deleteColourButton, SIGNAL(clicked()),
+ this, SLOT(slotDelete()));
+
+ connect(this, SIGNAL(docColoursChanged()),
+ m_doc, SLOT(slotDocColoursChanged()));
+
+ connect(m_colourtable, SIGNAL(entryTextChanged(unsigned int, QString)),
+ this, SLOT(slotTextChanged(unsigned int, QString)));
+
+ connect(m_colourtable, SIGNAL(entryColourChanged(unsigned int, QColor)),
+ this, SLOT(slotColourChanged(unsigned int, QColor)));
+
+ addTab(frame, i18n("Color Map"));
+
+}
+
+void
+ColourConfigurationPage::slotTextChanged(unsigned int index, QString string)
+{
+ m_map.modifyNameByIndex(m_listmap[index], string.ascii());
+ m_colourtable->populate_table(m_map, m_listmap);
+}
+
+void
+ColourConfigurationPage::slotColourChanged(unsigned int index, QColor color)
+{
+ m_map.modifyColourByIndex(m_listmap[index], GUIPalette::convertColour(color));
+ m_colourtable->populate_table(m_map, m_listmap);
+}
+
+void
+ColourConfigurationPage::apply()
+{
+ SegmentColourMapCommand *command = new SegmentColourMapCommand(m_doc, m_map);
+ m_doc->getCommandHistory()->addCommand(command);
+
+ RG_DEBUG << "ColourConfigurationPage::apply() emitting docColoursChanged()" << endl;
+ emit docColoursChanged();
+}
+
+void
+ColourConfigurationPage::slotAddNew()
+{
+ QColor temp;
+
+ bool ok = false;
+
+ QString newName = KInputDialog::getText(i18n("New Color Name"),
+ i18n("Enter new name"),
+ i18n("New"),
+ &ok);
+
+ if ((ok == true) && (!newName.isEmpty())) {
+ KColorDialog box(this, "", true);
+
+ int result = box.getColor( temp );
+
+ if (result == KColorDialog::Accepted) {
+ Colour temp2 = GUIPalette::convertColour(temp);
+ m_map.addItem(temp2, qstrtostr(newName));
+ m_colourtable->populate_table(m_map, m_listmap);
+ }
+ // Else we don't do anything as they either didn't give a name
+ // or didn't give a colour
+ }
+
+}
+
+void
+ColourConfigurationPage::slotDelete()
+{
+ QTableSelection temp = m_colourtable->selection(0);
+
+ if ((!temp.isActive()) || (temp.topRow() == 0))
+ return ;
+
+ unsigned int toDel = temp.topRow();
+
+ m_map.deleteItemByIndex(m_listmap[toDel]);
+ m_colourtable->populate_table(m_map, m_listmap);
+
+}
+
+}
+#include "ColourConfigurationPage.moc"
diff --git a/src/gui/configuration/ColourConfigurationPage.h b/src/gui/configuration/ColourConfigurationPage.h
new file mode 100644
index 0000000..9ef4ae0
--- /dev/null
+++ b/src/gui/configuration/ColourConfigurationPage.h
@@ -0,0 +1,87 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_COLOURCONFIGURATIONPAGE_H_
+#define _RG_COLOURCONFIGURATIONPAGE_H_
+
+#include "base/ColourMap.h"
+#include "gui/widgets/ColourTable.h"
+#include "TabbedConfigurationPage.h"
+#include <qstring.h>
+#include <klocale.h>
+
+
+class QWidget;
+
+
+namespace Rosegarden
+{
+
+class RosegardenGUIDoc;
+
+
+/**
+ * Colour Configuration Page
+ *
+ * (document-wide settings)
+ */
+class ColourConfigurationPage : public TabbedConfigurationPage
+{
+ Q_OBJECT
+public:
+ ColourConfigurationPage(RosegardenGUIDoc *doc,
+ QWidget *parent=0, const char *name=0);
+ virtual void apply();
+
+ void populate_table();
+
+ static QString iconLabel() { return i18n("Color"); }
+ static QString title() { return i18n("Color Settings"); }
+ static QString iconName() { return "colorize"; }
+
+signals:
+ void docColoursChanged();
+
+protected slots:
+ void slotAddNew();
+ void slotDelete();
+ void slotTextChanged(unsigned int, QString);
+ void slotColourChanged(unsigned int, QColor);
+
+protected:
+ ColourTable *m_colourtable;
+
+ ColourMap m_map;
+ ColourTable::ColourList m_listmap;
+
+};
+
+// ----------- SequencerConfigurationage -----------------
+//
+
+
+}
+
+#endif
diff --git a/src/gui/configuration/ConfigurationPage.cpp b/src/gui/configuration/ConfigurationPage.cpp
new file mode 100644
index 0000000..3f3730b
--- /dev/null
+++ b/src/gui/configuration/ConfigurationPage.cpp
@@ -0,0 +1,37 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "ConfigurationPage.h"
+
+#include "document/RosegardenGUIDoc.h"
+#include <kconfig.h>
+#include <qwidget.h>
+#include <algorithm>
+
+
+namespace Rosegarden
+{
+}
+#include "ConfigurationPage.moc"
diff --git a/src/gui/configuration/ConfigurationPage.h b/src/gui/configuration/ConfigurationPage.h
new file mode 100644
index 0000000..4a93195
--- /dev/null
+++ b/src/gui/configuration/ConfigurationPage.h
@@ -0,0 +1,104 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Parts of the configuration classes are taken from KMail.
+ Copyright (C) 2000 The KMail Development Team.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_CONFIGURATIONPAGE_H_
+#define _RG_CONFIGURATIONPAGE_H_
+
+#include <qwidget.h>
+
+
+class KConfig;
+
+
+namespace Rosegarden
+{
+
+class RosegardenGUIDoc;
+
+
+/**
+ * This class borrowed from KMail
+ * (c) 2000 The KMail Development Team
+ */
+class ConfigurationPage : public QWidget
+{
+ Q_OBJECT
+
+public:
+ ConfigurationPage(RosegardenGUIDoc *doc,
+ QWidget *parent=0, const char *name=0)
+ : QWidget(parent, name), m_doc(doc), m_cfg(0), m_pageIndex(0) {}
+
+ ConfigurationPage(KConfig *cfg,
+ QWidget *parent=0, const char *name=0)
+ : QWidget(parent, name), m_doc(0), m_cfg(cfg), m_pageIndex(0) {}
+
+ ConfigurationPage(RosegardenGUIDoc *doc, KConfig *cfg,
+ QWidget *parent=0, const char *name=0)
+ : QWidget(parent, name), m_doc(doc), m_cfg(cfg), m_pageIndex(0) {}
+
+ virtual ~ConfigurationPage() {};
+
+ /**
+ * Should set the page up (ie. read the setting from the @ref
+ * KConfig object into the widgets) after creating it in the
+ * constructor. Called from @ref ConfigureDialog.
+ */
+// virtual void setup() = 0;
+
+ /**
+ * Should apply the changed settings (ie. read the settings from
+ * the widgets into the @ref KConfig object). Called from @ref
+ * ConfigureDialog.
+ */
+ virtual void apply() = 0;
+
+ /**
+ * Should cleanup any temporaries after cancel. The default
+ * implementation does nothing. Called from @ref
+ * ConfigureDialog.
+ */
+ virtual void dismiss() {}
+
+ void setPageIndex( int aPageIndex ) { m_pageIndex = aPageIndex; }
+ int pageIndex() const { return m_pageIndex; }
+
+protected:
+
+ //--------------- Data members ---------------------------------
+
+ RosegardenGUIDoc* m_doc;
+ KConfig* m_cfg;
+
+ int m_pageIndex;
+};
+
+
+}
+
+#endif
diff --git a/src/gui/configuration/DocumentMetaConfigurationPage.cpp b/src/gui/configuration/DocumentMetaConfigurationPage.cpp
new file mode 100644
index 0000000..9f5064b
--- /dev/null
+++ b/src/gui/configuration/DocumentMetaConfigurationPage.cpp
@@ -0,0 +1,366 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "DocumentMetaConfigurationPage.h"
+
+#include "base/Event.h"
+#include "base/BaseProperties.h"
+#include "misc/Strings.h"
+#include "base/Colour.h"
+#include "base/Composition.h"
+#include "base/Configuration.h"
+#include "base/NotationTypes.h"
+#include "base/PropertyName.h"
+#include "base/BasicQuantizer.h"
+#include "base/RealTime.h"
+#include "base/Segment.h"
+#include "ConfigurationPage.h"
+#include "document/RosegardenGUIDoc.h"
+#include "gui/editors/notation/NotationStrings.h"
+#include "gui/configuration/HeadersConfigurationPage.h"
+#include "gui/general/GUIPalette.h"
+#include "TabbedConfigurationPage.h"
+#include <kconfig.h>
+#include <klistview.h>
+#include <qframe.h>
+#include <qlabel.h>
+#include <qlistview.h>
+#include <qpixmap.h>
+#include <qpushbutton.h>
+#include <qstring.h>
+#include <qtable.h>
+#include <qtabwidget.h>
+#include <qwidget.h>
+#include <qlayout.h>
+
+
+namespace Rosegarden
+{
+
+static QString durationToString(Rosegarden::Composition &comp,
+ Rosegarden::timeT absTime,
+ Rosegarden::timeT duration,
+ Rosegarden::RealTime rt)
+{
+ return i18n("%1 minutes %2.%3%4 seconds (%5 units, %6 measures)") // TODO - PLURAL
+ .arg(rt.sec / 60).arg(rt.sec % 60)
+ .arg(rt.msec() / 100).arg((rt.msec() / 10) % 10)
+ .arg(duration).arg(comp.getBarNumber(absTime + duration) -
+ comp.getBarNumber(absTime));
+}
+
+class SegmentDataItem : public QTableItem
+{
+public:
+ SegmentDataItem(QTable *t, QString s) :
+ QTableItem(t, QTableItem::Never, s) { }
+ virtual int alignment() const { return Qt::AlignCenter; }
+
+ virtual QString key() const {
+
+ // It doesn't seem to be possible to specify a comparator so
+ // as to get the right sorting for numeric items (what am I
+ // missing here?), only to override this function to return a
+ // string for comparison. So for integer items we'll return a
+ // string that starts with a single digit corresponding to the
+ // number of digits in the integer, which should ensure that
+ // dictionary sorting works correctly.
+ //
+ // This relies on the assumption that any item whose text
+ // starts with a digit will contain nothing other than a
+ // single non-negative integer of no more than 9 digits. That
+ // assumption should hold for all current uses of this class,
+ // but may need checking for future uses...
+
+ QString s(text());
+ if (s[0].digitValue() >= 0) {
+ return QString("%1%2").arg(s.length()).arg(s);
+ } else {
+ return s;
+ }
+ }
+};
+
+DocumentMetaConfigurationPage::DocumentMetaConfigurationPage(RosegardenGUIDoc *doc,
+ QWidget *parent,
+ const char *name) :
+ TabbedConfigurationPage(doc, parent, name)
+{
+ m_headersPage = new HeadersConfigurationPage(this, doc);
+ addTab(m_headersPage, i18n("Headers"));
+
+ Composition &comp = doc->getComposition();
+ std::set
+ <TrackId> usedTracks;
+
+ int audioSegments = 0, internalSegments = 0;
+ for (Composition::iterator ci = comp.begin();
+ ci != comp.end(); ++ci) {
+ usedTracks.insert((*ci)->getTrack());
+ if ((*ci)->getType() == Segment::Audio)
+ ++audioSegments;
+ else
+ ++internalSegments;
+ }
+
+ QFrame *frame = new QFrame(m_tabWidget);
+ QGridLayout *layout = new QGridLayout(frame,
+ 6, 2,
+ 10, 5);
+
+ layout->addWidget(new QLabel(i18n("Filename:"), frame), 0, 0);
+ layout->addWidget(new QLabel(doc->getTitle(), frame), 0, 1);
+
+ layout->addWidget(new QLabel(i18n("Formal duration (to end marker):"), frame), 1, 0);
+ timeT d = comp.getEndMarker();
+ RealTime rtd = comp.getElapsedRealTime(d);
+ layout->addWidget(new QLabel(durationToString(comp, 0, d, rtd), frame), 1, 1);
+
+ layout->addWidget(new QLabel(i18n("Playing duration:"), frame), 2, 0);
+ d = comp.getDuration();
+ rtd = comp.getElapsedRealTime(d);
+ layout->addWidget(new QLabel(durationToString(comp, 0, d, rtd), frame), 2, 1);
+
+ layout->addWidget(new QLabel(i18n("Tracks:"), frame), 3, 0);
+ layout->addWidget(new QLabel(i18n("%1 used, %2 total")
+ .arg(usedTracks.size())
+ .arg(comp.getNbTracks()),
+ frame), 3, 1);
+
+ layout->addWidget(new QLabel(i18n("Segments:"), frame), 4, 0);
+ layout->addWidget(new QLabel(i18n("%1 MIDI, %2 audio, %3 total")
+ .arg(internalSegments)
+ .arg(audioSegments)
+ .arg(internalSegments + audioSegments),
+ frame), 4, 1);
+
+ layout->setRowStretch(5, 2);
+
+ addTab(frame, i18n("Statistics"));
+
+ frame = new QFrame(m_tabWidget);
+ layout = new QGridLayout(frame, 1, 1, 10, 5);
+
+ QTable *table = new QTable(1, 11, frame, "Segment Table");
+ table->setSelectionMode(QTable::NoSelection);
+ table->setSorting(true);
+ table->horizontalHeader()->setLabel(0, i18n("Type"));
+ table->horizontalHeader()->setLabel(1, i18n("Track"));
+ table->horizontalHeader()->setLabel(2, i18n("Label"));
+ table->horizontalHeader()->setLabel(3, i18n("Time"));
+ table->horizontalHeader()->setLabel(4, i18n("Duration"));
+ table->horizontalHeader()->setLabel(5, i18n("Events"));
+ table->horizontalHeader()->setLabel(6, i18n("Polyphony"));
+ table->horizontalHeader()->setLabel(7, i18n("Repeat"));
+ table->horizontalHeader()->setLabel(8, i18n("Quantize"));
+ table->horizontalHeader()->setLabel(9, i18n("Transpose"));
+ table->horizontalHeader()->setLabel(10, i18n("Delay"));
+ table->setNumRows(audioSegments + internalSegments);
+
+ table->setColumnWidth(0, 50);
+ table->setColumnWidth(1, 50);
+ table->setColumnWidth(2, 150);
+ table->setColumnWidth(3, 80);
+ table->setColumnWidth(4, 80);
+ table->setColumnWidth(5, 80);
+ table->setColumnWidth(6, 80);
+ table->setColumnWidth(7, 80);
+ table->setColumnWidth(8, 80);
+ table->setColumnWidth(9, 80);
+ table->setColumnWidth(10, 80);
+
+ int i = 0;
+
+ for (Composition::iterator ci = comp.begin();
+ ci != comp.end(); ++ci) {
+
+ Segment *s = *ci;
+
+ table->setItem(i, 0, new SegmentDataItem
+ (table,
+ s->getType() == Segment::Audio ?
+ i18n("Audio") : i18n("MIDI")));
+
+ table->setItem(i, 1, new SegmentDataItem
+ (table,
+ QString("%1").arg(s->getTrack() + 1)));
+
+ QPixmap colourPixmap(16, 16);
+ Colour colour =
+ comp.getSegmentColourMap().getColourByIndex(s->getColourIndex());
+ colourPixmap.fill(GUIPalette::convertColour(colour));
+
+ table->setItem(i, 2,
+ new QTableItem(table, QTableItem::Never,
+ strtoqstr(s->getLabel()),
+ colourPixmap));
+
+ table->setItem(i, 3, new SegmentDataItem
+ (table,
+ QString("%1").arg(s->getStartTime())));
+
+ table->setItem(i, 4, new SegmentDataItem
+ (table,
+ QString("%1").arg(s->getEndMarkerTime() -
+ s->getStartTime())));
+
+ std::set<long> notesOn;
+ std::multimap<timeT, long> noteOffs;
+ int events = 0, notes = 0, poly = 0, maxPoly = 0;
+
+ for (Segment::iterator si = s->begin();
+ s->isBeforeEndMarker(si); ++si) {
+ ++events;
+ if ((*si)->isa(Note::EventType)) {
+ ++notes;
+ timeT startTime = (*si)->getAbsoluteTime();
+ timeT endTime = startTime + (*si)->getDuration();
+ if (endTime == startTime) continue;
+ while (!noteOffs.empty() &&
+ (startTime >= noteOffs.begin()->first)) {
+ notesOn.erase(noteOffs.begin()->second);
+ noteOffs.erase(noteOffs.begin());
+ }
+ long pitch = 0;
+ (*si)->get<Int>(BaseProperties::PITCH, pitch);
+ notesOn.insert(pitch);
+ noteOffs.insert(std::multimap<timeT, long>::value_type(endTime, pitch));
+ poly = notesOn.size();
+ if (poly > maxPoly) maxPoly = poly;
+ }
+ }
+
+ table->setItem(i, 5, new SegmentDataItem
+ (table,
+ QString("%1").arg(events)));
+
+ table->setItem(i, 6, new SegmentDataItem
+ (table,
+ QString("%1").arg(maxPoly)));
+
+ table->setItem(i, 7, new SegmentDataItem
+ (table,
+ s->isRepeating() ? i18n("Yes") : i18n("No")));
+
+ timeT discard;
+
+ if (s->getQuantizer() && s->hasQuantization()) {
+ timeT unit = s->getQuantizer()->getUnit();
+ table->setItem(i, 8, new SegmentDataItem
+ (table,
+ NotationStrings::makeNoteMenuLabel
+ (unit, true, discard, false)));
+ } else {
+ table->setItem(i, 8, new SegmentDataItem
+ (table,
+ i18n("Off")));
+ }
+
+ table->setItem(i, 9, new SegmentDataItem
+ (table,
+ QString("%1").arg(s->getTranspose())));
+
+ if (s->getDelay() != 0) {
+ if (s->getRealTimeDelay() != RealTime::zeroTime) {
+ table->setItem(i, 10, new SegmentDataItem
+ (table,
+ QString("%1 + %2 ms")
+ .arg(NotationStrings::makeNoteMenuLabel
+ (s->getDelay(), true, discard, false))
+ .arg(s->getRealTimeDelay().sec * 1000 +
+ s->getRealTimeDelay().msec())));
+ } else {
+ table->setItem(i, 10, new SegmentDataItem
+ (table,
+ NotationStrings::makeNoteMenuLabel
+ (s->getDelay(), true, discard, false)));
+ }
+ } else if (s->getRealTimeDelay() != RealTime::zeroTime) {
+ table->setItem(i, 10, new SegmentDataItem
+ (table,
+ QString("%2 ms")
+ .arg(s->getRealTimeDelay().sec * 1000 +
+ s->getRealTimeDelay().msec())));
+ } else {
+ table->setItem(i, 10, new SegmentDataItem
+ (table,
+ i18n("None")));
+ }
+
+ ++i;
+ }
+
+ layout->addWidget(table, 0, 0);
+
+ addTab(frame, i18n("Segment Summary"));
+
+}
+
+void
+DocumentMetaConfigurationPage::apply()
+{
+ m_headersPage->apply();
+
+ m_doc->slotDocumentModified();
+}
+
+/* hjj: WHAT TO DO WITH THIS ?
+void
+DocumentMetaConfigurationPage::selectMetadata(QString name)
+{
+ std::vector<PropertyName> fixedKeys =
+ CompositionMetadataKeys::getFixedKeys();
+ std::vector<PropertyName>::iterator i = fixedKeys.begin();
+
+ for (QListViewItem *item = m_fixed->firstChild();
+ item != 0; item = item->nextSibling()) {
+
+ if (i == fixedKeys.end())
+ break;
+
+ if (name == strtoqstr(i->getName())) {
+ m_fixed->setSelected(item, true);
+ m_fixed->setCurrentItem(item);
+ return ;
+ }
+
+ ++i;
+ }
+
+ for (QListViewItem *item = m_metadata->firstChild();
+ item != 0; item = item->nextSibling()) {
+
+ if (item->text(0).lower() != name)
+ continue;
+
+ m_metadata->setSelected(item, true);
+ m_metadata->setCurrentItem(item);
+ return ;
+ }
+}
+*/
+
+}
+#include "DocumentMetaConfigurationPage.moc"
diff --git a/src/gui/configuration/DocumentMetaConfigurationPage.h b/src/gui/configuration/DocumentMetaConfigurationPage.h
new file mode 100644
index 0000000..db26f54
--- /dev/null
+++ b/src/gui/configuration/DocumentMetaConfigurationPage.h
@@ -0,0 +1,76 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_DOCUMENTMETACONFIGURATIONPAGE_H_
+#define _RG_DOCUMENTMETACONFIGURATIONPAGE_H_
+
+#include "TabbedConfigurationPage.h"
+#include <qstring.h>
+#include <klocale.h>
+
+
+class QWidget;
+class KListView;
+
+
+namespace Rosegarden
+{
+
+class RosegardenGUIDoc;
+class HeadersConfigurationPage;
+
+/**
+ * Document Meta-information page
+ *
+ * (document-wide settings)
+ */
+class DocumentMetaConfigurationPage : public TabbedConfigurationPage
+{
+ Q_OBJECT
+public:
+ DocumentMetaConfigurationPage(RosegardenGUIDoc *doc,
+ QWidget *parent = 0, const char *name = 0);
+ virtual void apply();
+
+ static QString iconLabel() { return i18n("About"); }
+ static QString title() { return i18n("About"); }
+ static QString iconName() { return "contents"; }
+
+/* hjj: WHAT TO DO WITH THIS ?
+ void selectMetadata(QString name);
+*/
+
+protected:
+
+ //--------------- Data members ---------------------------------
+
+ HeadersConfigurationPage *m_headersPage;
+};
+
+
+
+}
+
+#endif
diff --git a/src/gui/configuration/GeneralConfigurationPage.cpp b/src/gui/configuration/GeneralConfigurationPage.cpp
new file mode 100644
index 0000000..22915ed
--- /dev/null
+++ b/src/gui/configuration/GeneralConfigurationPage.cpp
@@ -0,0 +1,429 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "GeneralConfigurationPage.h"
+
+#include "document/ConfigGroups.h"
+#include "ConfigurationPage.h"
+#include "document/RosegardenGUIDoc.h"
+#include "gui/editors/eventlist/EventView.h"
+#include "gui/editors/parameters/RosegardenParameterArea.h"
+#include "gui/studio/StudioControl.h"
+#include "gui/dialogs/ShowSequencerStatusDialog.h"
+#include "gui/seqmanager/SequenceManager.h"
+#include "sound/SoundDriver.h"
+#include "TabbedConfigurationPage.h"
+#include <kcombobox.h>
+#include <kconfig.h>
+#include <kfiledialog.h>
+#include <kmessagebox.h>
+#include <qcheckbox.h>
+#include <qcombobox.h>
+#include <qfileinfo.h>
+#include <qframe.h>
+#include <qlabel.h>
+#include <qlineedit.h>
+#include <qpushbutton.h>
+#include <qspinbox.h>
+#include <qstring.h>
+#include <qtabwidget.h>
+#include <qvbox.h>
+#include <qwidget.h>
+#include <qlayout.h>
+
+
+namespace Rosegarden
+{
+
+GeneralConfigurationPage::GeneralConfigurationPage(RosegardenGUIDoc *doc,
+ KConfig *cfg,
+ QWidget *parent, const char *name)
+ : TabbedConfigurationPage(cfg, parent, name),
+ m_doc(doc),
+ m_client(0),
+ m_countIn(0),
+ m_nameStyle(0)
+{
+ m_cfg->setGroup(GeneralOptionsConfigGroup);
+
+ QFrame *frame;
+ QGridLayout *layout;
+ QLabel *label = 0;
+ int row = 0;
+
+ //
+ // "Behavior" tab
+ //
+ frame = new QFrame(m_tabWidget);
+ layout = new QGridLayout(frame,
+ 6, 2, // nbrow, nbcol
+ 10, 5);
+
+ layout->setRowSpacing(row, 15);
+ ++row;
+
+ layout->addWidget(new QLabel(i18n("Double-click opens segment in"),
+ frame), row, 0);
+
+ m_client = new KComboBox(frame);
+ m_client->insertItem(i18n("Notation editor"));
+ m_client->insertItem(i18n("Matrix editor"));
+ m_client->insertItem(i18n("Event List editor"));
+ m_client->setCurrentItem(m_cfg->readUnsignedNumEntry("doubleclickclient", NotationView));
+
+ layout->addMultiCellWidget(m_client, row, row, 1, 2);
+ ++row;
+
+ layout->addWidget(new QLabel(i18n("Number of count-in measures when recording"),
+ frame), row, 0);
+
+ m_countIn = new QSpinBox(frame);
+ m_countIn->setValue(m_cfg->readUnsignedNumEntry("countinbars", 0));
+ m_countIn->setMaxValue(10);
+ m_countIn->setMinValue(0);
+ layout->addMultiCellWidget(m_countIn, row, row, 1, 2);
+ ++row;
+
+ layout->addWidget(new QLabel(i18n("Auto-save interval"), frame), row, 0);
+
+ m_autoSave = new KComboBox(frame);
+ m_autoSave->insertItem(i18n("Every 30 seconds"));
+ m_autoSave->insertItem(i18n("Every minute"));
+ m_autoSave->insertItem(i18n("Every five minutes"));
+ m_autoSave->insertItem(i18n("Every half an hour"));
+ m_autoSave->insertItem(i18n("Never"));
+
+ bool doAutoSave = m_cfg->readBoolEntry("autosave", true);
+ int autoSaveInterval = m_cfg->readUnsignedNumEntry("autosaveinterval", 300);
+ if (!doAutoSave || autoSaveInterval == 0) {
+ m_autoSave->setCurrentItem(4); // off
+ } else if (autoSaveInterval < 45) {
+ m_autoSave->setCurrentItem(0);
+ } else if (autoSaveInterval < 150) {
+ m_autoSave->setCurrentItem(1);
+ } else if (autoSaveInterval < 900) {
+ m_autoSave->setCurrentItem(2);
+ } else {
+ m_autoSave->setCurrentItem(3);
+ }
+
+ layout->addMultiCellWidget(m_autoSave, row, row, 1, 2);
+ ++row;
+
+ // JACK Transport
+ //
+#ifdef HAVE_LIBJACK
+ m_cfg->setGroup(SequencerOptionsConfigGroup);
+
+ label = new QLabel(i18n("Use JACK transport"), frame);
+ layout->addWidget(label, row, 0);
+
+ m_jackTransport = new QCheckBox(frame);
+ layout->addMultiCellWidget(m_jackTransport, row, row, 1, 2);
+
+// m_jackTransport->insertItem(i18n("Ignore JACK transport"));
+// m_jackTransport->insertItem(i18n("Sync"));
+
+ /*!!! Removed as not yet implemented
+ m_jackTransport->insertItem(i18n("Sync, and offer timebase master"));
+ */
+
+ bool jackMaster = m_cfg->readBoolEntry("jackmaster", false);
+ bool jackTransport = m_cfg->readBoolEntry("jacktransport", false);
+/*
+ if (jackTransport)
+ m_jackTransport->setCurrentItem(1);
+ else
+ m_jackTransport->setCurrentItem(0);
+*/
+ m_jackTransport->setChecked(jackTransport);
+
+ ++row;
+
+ m_cfg->setGroup(GeneralOptionsConfigGroup);
+#endif
+
+ layout->setRowSpacing(row, 20);
+ ++row;
+
+ layout->addWidget(new QLabel(i18n("Sequencer status"), frame), row, 0);
+
+ QString status(i18n("Unknown"));
+ SequenceManager *mgr = doc->getSequenceManager();
+ if (mgr) {
+ int driverStatus = mgr->getSoundDriverStatus() & (AUDIO_OK | MIDI_OK);
+ switch (driverStatus) {
+ case AUDIO_OK:
+ status = i18n("No MIDI, audio OK");
+ break;
+ case MIDI_OK:
+ status = i18n("MIDI OK, no audio");
+ break;
+ case AUDIO_OK | MIDI_OK:
+ status = i18n("MIDI OK, audio OK");
+ break;
+ default:
+ status = i18n("No driver");
+ break;
+ }
+ }
+
+ layout->addWidget(new QLabel(status, frame), row, 1);
+
+ QPushButton *showStatusButton = new QPushButton(i18n("Details..."),
+ frame);
+ QObject::connect(showStatusButton, SIGNAL(clicked()),
+ this, SLOT(slotShowStatus()));
+ layout->addWidget(showStatusButton, row, 2, Qt::AlignRight);
+ ++row;
+
+ layout->setRowStretch(row, 10);
+
+ addTab(frame, i18n("Behavior"));
+
+ //
+ // "Appearance" tab
+ //
+ frame = new QFrame(m_tabWidget);
+ layout = new QGridLayout(frame,
+ 7, 4, // nbrow, nbcol -- one extra row improves layout
+ 10, 5);
+
+ row = 0;
+
+ layout->setRowSpacing(row, 15);
+ ++row;
+
+ layout->addWidget(new QLabel(i18n("Side-bar parameter box layout"),
+ frame), row, 0);
+
+ m_sidebarStyle = new KComboBox(frame);
+ m_sidebarStyle->insertItem(i18n("Vertically stacked"),
+ RosegardenParameterArea::CLASSIC_STYLE);
+ m_sidebarStyle->insertItem(i18n("Tabbed"),
+ RosegardenParameterArea::TAB_BOX_STYLE);
+
+ m_sidebarStyle->setCurrentItem(m_cfg->readUnsignedNumEntry("sidebarstyle",
+ 0));
+ layout->addMultiCellWidget(m_sidebarStyle, row, row, 1, 3);
+ ++row;
+
+ layout->addWidget(new QLabel(i18n("Note name style"),
+ frame), row, 0);
+
+ m_nameStyle = new KComboBox(frame);
+ m_nameStyle->insertItem(i18n("Always use US names (e.g. quarter, 8th)"));
+ m_nameStyle->insertItem(i18n("Localized (where available)"));
+ m_nameStyle->setCurrentItem(m_cfg->readUnsignedNumEntry("notenamestyle", Local));
+ layout->addMultiCellWidget(m_nameStyle, row, row, 1, 3);
+ ++row;
+/*
+ layout->addWidget(new QLabel(i18n("Show tool context help in status bar"), frame), row, 0);
+
+ m_toolContextHelp = new QCheckBox(frame);
+ layout->addWidget(m_toolContextHelp, row, 1);
+ m_toolContextHelp->setChecked(m_cfg->readBoolEntry
+ ("toolcontexthelp", true));
+ ++row;
+*/
+
+ layout->addWidget(new QLabel(i18n("Show textured background on"), frame), row, 0);
+
+ m_backgroundTextures = new QCheckBox(i18n("Main window"), frame);
+ layout->addWidget(m_backgroundTextures, row, 1);
+
+ m_matrixBackgroundTextures = new QCheckBox(i18n("Matrix"), frame);
+ layout->addWidget(m_matrixBackgroundTextures, row, 2);
+
+ m_notationBackgroundTextures = new QCheckBox(i18n("Notation"), frame);
+ layout->addWidget(m_notationBackgroundTextures, row, 3);
+
+ m_backgroundTextures->setChecked(m_cfg->readBoolEntry
+ ("backgroundtextures", true));
+
+ m_cfg->setGroup(MatrixViewConfigGroup);
+ m_matrixBackgroundTextures->setChecked(m_cfg->readBoolEntry
+ ("backgroundtextures-1.6-plus", true));
+ m_cfg->setGroup(NotationViewConfigGroup);
+ m_notationBackgroundTextures->setChecked(m_cfg->readBoolEntry
+ ("backgroundtextures", true));
+ m_cfg->setGroup(GeneralOptionsConfigGroup);
+ ++row;
+
+ layout->addWidget(new QLabel(i18n("Use bundled Klearlook theme"), frame), row, 0);
+ m_globalStyle = new KComboBox(frame);
+ m_globalStyle->insertItem(i18n("Never"));
+ m_globalStyle->insertItem(i18n("When not running under KDE"));
+ m_globalStyle->insertItem(i18n("Always"));
+ m_globalStyle->setCurrentItem(m_cfg->readUnsignedNumEntry("Install Own Theme", 1));
+ layout->addMultiCellWidget(m_globalStyle, row, row, 1, 3);
+
+ ++row;
+
+ layout->setRowStretch(row, 10);
+
+ addTab(frame, i18n("Presentation"));
+
+}
+
+void
+GeneralConfigurationPage::slotShowStatus()
+{
+ ShowSequencerStatusDialog dialog(this);
+ dialog.exec();
+}
+
+void GeneralConfigurationPage::apply()
+{
+ m_cfg->setGroup(GeneralOptionsConfigGroup);
+
+ int countIn = getCountInSpin();
+ m_cfg->writeEntry("countinbars", countIn);
+
+ int client = getDblClickClient();
+ m_cfg->writeEntry("doubleclickclient", client);
+
+ int globalstyle = m_globalStyle->currentItem();
+ m_cfg->writeEntry("Install Own Theme", globalstyle);
+
+ int namestyle = getNoteNameStyle();
+ m_cfg->writeEntry("notenamestyle", namestyle);
+/*
+ m_cfg->writeEntry("toolcontexthelp", m_toolContextHelp->isChecked());
+*/
+ bool texturesChanged = false;
+ bool mainTextureChanged = false;
+ m_cfg->setGroup(GeneralOptionsConfigGroup);
+
+ if (m_cfg->readBoolEntry("backgroundtextures", true) !=
+ m_backgroundTextures->isChecked()) {
+ texturesChanged = true;
+ mainTextureChanged = true;
+ } else {
+ m_cfg->setGroup(MatrixViewConfigGroup);
+ if (m_cfg->readBoolEntry("backgroundtextures-1.6-plus", false) !=
+ m_matrixBackgroundTextures->isChecked()) {
+ texturesChanged = true;
+ } else {
+ m_cfg->setGroup(NotationViewConfigGroup);
+ if (m_cfg->readBoolEntry("backgroundtextures", true) !=
+ m_notationBackgroundTextures->isChecked()) {
+ texturesChanged = true;
+ }
+ }
+ }
+
+ m_cfg->setGroup(GeneralOptionsConfigGroup);
+ m_cfg->writeEntry("backgroundtextures", m_backgroundTextures->isChecked());
+
+ m_cfg->setGroup(MatrixViewConfigGroup);
+ m_cfg->writeEntry("backgroundtextures-1.6-plus", m_matrixBackgroundTextures->isChecked());
+
+ m_cfg->setGroup(NotationViewConfigGroup);
+ m_cfg->writeEntry("backgroundtextures", m_notationBackgroundTextures->isChecked());
+
+ m_cfg->setGroup(GeneralOptionsConfigGroup);
+
+ int sidebarStyle = m_sidebarStyle->currentItem();
+ m_cfg->writeEntry("sidebarstyle", sidebarStyle);
+ emit updateSidebarStyle(sidebarStyle);
+
+ unsigned int interval = 0;
+
+ if (m_autoSave->currentItem() == 4) {
+ m_cfg->writeEntry("autosave", false);
+ } else {
+ m_cfg->writeEntry("autosave", true);
+ if (m_autoSave->currentItem() == 0) {
+ interval = 30;
+ } else if (m_autoSave->currentItem() == 1) {
+ interval = 60;
+ } else if (m_autoSave->currentItem() == 2) {
+ interval = 300;
+ } else {
+ interval = 1800;
+ }
+ m_cfg->writeEntry("autosaveinterval", interval);
+ emit updateAutoSaveInterval(interval);
+ }
+
+#ifdef HAVE_LIBJACK
+ m_cfg->setGroup(SequencerOptionsConfigGroup);
+
+ // Write the JACK entry
+ //
+/*
+ int jackValue = m_jackTransport->currentItem();
+ bool jackTransport, jackMaster;
+
+ switch (jackValue) {
+ case 2:
+ jackTransport = true;
+ jackMaster = true;
+ break;
+
+ case 1:
+ jackTransport = true;
+ jackMaster = false;
+ break;
+
+ default:
+ jackValue = 0;
+
+ case 0:
+ jackTransport = false;
+ jackMaster = false;
+ break;
+ }
+*/
+
+ bool jackTransport = m_jackTransport->isChecked();
+ bool jackMaster = false;
+
+ int jackValue = 0; // 0 -> nothing, 1 -> sync, 2 -> master
+ if (jackTransport) jackValue = 1;
+
+ // Write the items
+ //
+ m_cfg->writeEntry("jacktransport", jackTransport);
+ m_cfg->writeEntry("jackmaster", jackMaster);
+
+ // Now send it
+ //
+ MappedEvent mEjackValue(MidiInstrumentBase, // InstrumentId
+ MappedEvent::SystemJackTransport,
+ MidiByte(jackValue));
+
+ StudioControl::sendMappedEvent(mEjackValue);
+#endif // HAVE_LIBJACK
+
+ if (mainTextureChanged) {
+ KMessageBox::information(this, i18n("Changes to the textured background in the main window will not take effect until you restart Rosegarden."));
+ }
+
+}
+
+}
+#include "GeneralConfigurationPage.moc"
diff --git a/src/gui/configuration/GeneralConfigurationPage.h b/src/gui/configuration/GeneralConfigurationPage.h
new file mode 100644
index 0000000..7d3203d
--- /dev/null
+++ b/src/gui/configuration/GeneralConfigurationPage.h
@@ -0,0 +1,116 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_GENERALCONFIGURATIONPAGE_H_
+#define _RG_GENERALCONFIGURATIONPAGE_H_
+
+#include "TabbedConfigurationPage.h"
+#include "gui/editors/eventlist/EventView.h"
+#include <qstring.h>
+#include <qcheckbox.h>
+#include <qspinbox.h>
+#include <qcombobox.h>
+#include <qlineedit.h>
+#include <klocale.h>
+#include <kiconloader.h>
+
+class QWidget;
+class KConfig;
+
+
+namespace Rosegarden
+{
+
+class RosegardenGUIDoc;
+
+
+/**
+ * General Rosegarden Configuration page
+ *
+ * (application-wide settings)
+ */
+class GeneralConfigurationPage : public TabbedConfigurationPage
+{
+ Q_OBJECT
+
+public:
+ enum DoubleClickClient
+ {
+ NotationView,
+ MatrixView,
+ EventView
+ };
+
+ enum NoteNameStyle
+ {
+ American,
+ Local
+ };
+
+ GeneralConfigurationPage(RosegardenGUIDoc *doc,
+ KConfig *cfg,
+ QWidget *parent=0, const char *name=0);
+
+ virtual void apply();
+
+ static QString iconLabel() { return i18n("General"); }
+ static QString title() { return i18n("General Configuration"); }
+ static QString iconName() { return "configure-general"; }
+
+signals:
+ void updateAutoSaveInterval(unsigned int);
+ void updateSidebarStyle(unsigned int);
+
+protected slots:
+ void slotShowStatus();
+
+protected:
+ int getCountInSpin() { return m_countIn->value(); }
+ int getDblClickClient() { return m_client->currentItem(); }
+ int getNoteNameStyle() { return m_nameStyle->currentItem(); }
+
+ //--------------- Data members ---------------------------------
+ RosegardenGUIDoc* m_doc;
+
+ QComboBox* m_client;
+ QSpinBox* m_countIn;
+ QCheckBox* m_toolContextHelp;
+ QCheckBox* m_backgroundTextures;
+ QCheckBox* m_notationBackgroundTextures;
+ QCheckBox* m_matrixBackgroundTextures;
+ QComboBox *m_autoSave;
+ QComboBox* m_nameStyle;
+ QComboBox* m_sidebarStyle;
+ QComboBox* m_globalStyle;
+ QCheckBox *m_jackTransport;
+
+};
+
+
+
+
+}
+
+#endif
diff --git a/src/gui/configuration/HeadersConfigurationPage.cpp b/src/gui/configuration/HeadersConfigurationPage.cpp
new file mode 100644
index 0000000..0571fb5
--- /dev/null
+++ b/src/gui/configuration/HeadersConfigurationPage.cpp
@@ -0,0 +1,294 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include "HeadersConfigurationPage.h"
+
+#include "document/ConfigGroups.h"
+#include "document/RosegardenGUIDoc.h"
+#include "document/io/LilyPondExporter.h"
+#include "gui/widgets/CollapsingFrame.h"
+#include "misc/Strings.h"
+
+#include <kapplication.h>
+#include <kconfig.h>
+#include <klistview.h>
+#include <klocale.h>
+#include <qgroupbox.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qlineedit.h>
+#include <qpushbutton.h>
+#include <qstring.h>
+#include <qtabwidget.h>
+#include <qtooltip.h>
+#include <qvbox.h>
+#include <qwidget.h>
+#include <qfont.h>
+
+namespace Rosegarden
+{
+
+HeadersConfigurationPage::HeadersConfigurationPage(QWidget *parent,
+ RosegardenGUIDoc *doc) :
+ QVBox(parent),
+ m_doc(doc)
+{
+ //
+ // LilyPond export: Printable headers
+ //
+
+ QGroupBox *headersBox = new QGroupBox
+ (1, Horizontal,
+ i18n("Printable headers"), this);
+ QFrame *frameHeaders = new QFrame(headersBox);
+ QGridLayout *layoutHeaders = new QGridLayout(frameHeaders, 10, 6, 10, 5);
+
+ // grab user headers from metadata
+ Configuration metadata = (&m_doc->getComposition())->getMetadata();
+ std::vector<std::string> propertyNames = metadata.getPropertyNames();
+ std::vector<PropertyName> fixedKeys =
+ CompositionMetadataKeys::getFixedKeys();
+
+ std::set<std::string> shown;
+
+ for (unsigned int index = 0; index < fixedKeys.size(); index++) {
+ std::string key = fixedKeys[index].getName();
+ std::string header = "";
+ for (unsigned int i = 0; i < propertyNames.size(); ++i) {
+ std::string property = propertyNames [i];
+ if (property == key) {
+ header = metadata.get<String>(property);
+ }
+ }
+
+ unsigned int row = 0, col = 0, width = 1;
+ QLineEdit *editHeader = new QLineEdit(strtoqstr( header ), frameHeaders);
+ QString trName;
+ if (key == headerDedication) {
+ m_editDedication = editHeader;
+ row = 0; col = 2; width = 2;
+ trName = i18n("Dedication");
+ } else if (key == headerTitle) {
+ m_editTitle = editHeader;
+ row = 1; col = 1; width = 4;
+ trName = i18n("Title");
+ } else if (key == headerSubtitle) {
+ m_editSubtitle = editHeader;
+ row = 2; col = 1; width = 4;
+ trName = i18n("Subtitle");
+ } else if (key == headerSubsubtitle) {
+ m_editSubsubtitle = editHeader;
+ row = 3; col = 2; width = 2;
+ trName = i18n("Subsubtitle");
+ } else if (key == headerPoet) {
+ m_editPoet = editHeader;
+ row = 4; col = 0; width = 2;
+ trName = i18n("Poet");
+ } else if (key == headerInstrument) {
+ m_editInstrument = editHeader;
+ row = 4; col = 2; width = 2;
+ trName = i18n("Instrument");
+ } else if (key == headerComposer) {
+ m_editComposer = editHeader;
+ row = 4; col = 4; width = 2;
+ trName = i18n("Composer");
+ } else if (key == headerMeter) {
+ m_editMeter = editHeader;
+ row = 5; col = 0; width = 3;
+ trName = i18n("Meter");
+ } else if (key == headerArranger) {
+ m_editArranger = editHeader;
+ row = 5; col = 3; width = 3;
+ trName = i18n("Arranger");
+ } else if (key == headerPiece) {
+ m_editPiece = editHeader;
+ row = 6; col = 0; width = 3;
+ trName = i18n("Piece");
+ } else if (key == headerOpus) {
+ m_editOpus = editHeader;
+ row = 6; col = 3; width = 3;
+ trName = i18n("Opus");
+ } else if (key == headerCopyright) {
+ m_editCopyright = editHeader;
+ row = 8; col = 1; width = 4;
+ trName = i18n("Copyright");
+ } else if (key == headerTagline) {
+ m_editTagline = editHeader;
+ row = 9; col = 1; width = 4;
+ trName = i18n("Tagline");
+ }
+
+ // editHeader->setReadOnly( true );
+ editHeader->setAlignment( (col == 0 ? Qt::AlignLeft : (col >= 3 ? Qt::AlignRight : Qt::AlignCenter) ));
+
+ layoutHeaders->addMultiCellWidget(editHeader, row, row, col, col+(width-1) );
+
+ //
+ // ToolTips
+ //
+ QToolTip::add( editHeader, trName );
+
+ shown.insert(key);
+ }
+ QLabel *separator = new QLabel(i18n("The composition comes here."), frameHeaders);
+ separator->setAlignment( Qt::AlignCenter );
+ layoutHeaders->addMultiCellWidget(separator, 7, 7, 1, 4 );
+
+ //
+ // LilyPond export: Non-printable headers
+ //
+
+ // set default expansion to false for this group -- what a faff
+ KConfig *config = kapp->config();
+ QString groupTemp = config->group();
+ config->setGroup("CollapsingFrame");
+ bool expanded = config->readBoolEntry("nonprintableheaders", false);
+ config->writeEntry("nonprintableheaders", expanded);
+ config->setGroup(groupTemp);
+
+ CollapsingFrame *otherHeadersBox = new CollapsingFrame
+ (i18n("Non-printable headers"), this, "nonprintableheaders");
+ QFrame *frameOtherHeaders = new QFrame(otherHeadersBox);
+ otherHeadersBox->setWidgetFill(true);
+ QFont font(otherHeadersBox->font());
+ font.setBold(false);
+ otherHeadersBox->setFont(font);
+ otherHeadersBox->setWidget(frameOtherHeaders);
+
+ QGridLayout *layoutOtherHeaders = new QGridLayout(frameOtherHeaders, 2, 2, 10, 5);
+
+ m_metadata = new KListView(frameOtherHeaders);
+ m_metadata->addColumn(i18n("Name"));
+ m_metadata->addColumn(i18n("Value"));
+ m_metadata->setFullWidth(true);
+ m_metadata->setItemsRenameable(true);
+ m_metadata->setRenameable(0);
+ m_metadata->setRenameable(1);
+ m_metadata->setItemMargin(5);
+ m_metadata->setDefaultRenameAction(QListView::Accept);
+ m_metadata->setShowSortIndicator(true);
+
+ std::vector<std::string> names(metadata.getPropertyNames());
+
+ for (unsigned int i = 0; i < names.size(); ++i) {
+
+ if (shown.find(names[i]) != shown.end())
+ continue;
+
+ QString name(strtoqstr(names[i]));
+
+ // property names stored in lower case
+ name = name.left(1).upper() + name.right(name.length() - 1);
+
+ new KListViewItem(m_metadata, name,
+ strtoqstr(metadata.get<String>(names[i])));
+
+ shown.insert(names[i]);
+ }
+
+ layoutOtherHeaders->addMultiCellWidget(m_metadata, 0, 0, 0, 1);
+
+ QPushButton* addPropButton = new QPushButton(i18n("Add New Property"),
+ frameOtherHeaders);
+ layoutOtherHeaders->addWidget(addPropButton, 1, 0, Qt::AlignHCenter);
+
+ QPushButton* deletePropButton = new QPushButton(i18n("Delete Property"),
+ frameOtherHeaders);
+ layoutOtherHeaders->addWidget(deletePropButton, 1, 1, Qt::AlignHCenter);
+
+ connect(addPropButton, SIGNAL(clicked()),
+ this, SLOT(slotAddNewProperty()));
+
+ connect(deletePropButton, SIGNAL(clicked()),
+ this, SLOT(slotDeleteProperty()));
+}
+
+void
+HeadersConfigurationPage::slotAddNewProperty()
+{
+ QString propertyName;
+ int i = 0;
+
+ while (1) {
+ propertyName =
+ (i > 0 ? i18n("{new property %1}").arg(i) : i18n("{new property}"));
+ if (!m_doc->getComposition().getMetadata().has(qstrtostr(propertyName)) &&
+ m_metadata->findItem(qstrtostr(propertyName),0) == 0)
+ break;
+ ++i;
+ }
+
+ new KListViewItem(m_metadata, propertyName, i18n("{undefined}"));
+}
+
+void
+HeadersConfigurationPage::slotDeleteProperty()
+{
+ delete m_metadata->currentItem();
+}
+
+void HeadersConfigurationPage::apply()
+{
+ KConfig *config = kapp->config();
+ config->setGroup(NotationViewConfigGroup);
+
+ // If one of the items still has focus, it won't remember edits.
+ // Switch between two fields in order to lose the current focus.
+ m_editTitle->setFocus();
+ m_metadata->setFocus();
+
+ //
+ // Update header fields
+ //
+
+ Configuration &metadata = (&m_doc->getComposition())->getMetadata();
+ metadata.clear();
+
+ metadata.set<String>(CompositionMetadataKeys::Dedication, qstrtostr(m_editDedication->text()));
+ metadata.set<String>(CompositionMetadataKeys::Title, qstrtostr(m_editTitle->text()));
+ metadata.set<String>(CompositionMetadataKeys::Subtitle, qstrtostr(m_editSubtitle->text()));
+ metadata.set<String>(CompositionMetadataKeys::Subsubtitle, qstrtostr(m_editSubsubtitle->text()));
+ metadata.set<String>(CompositionMetadataKeys::Poet, qstrtostr(m_editPoet->text()));
+ metadata.set<String>(CompositionMetadataKeys::Composer, qstrtostr(m_editComposer->text()));
+ metadata.set<String>(CompositionMetadataKeys::Meter, qstrtostr(m_editMeter->text()));
+ metadata.set<String>(CompositionMetadataKeys::Opus, qstrtostr(m_editOpus->text()));
+ metadata.set<String>(CompositionMetadataKeys::Arranger, qstrtostr(m_editArranger->text()));
+ metadata.set<String>(CompositionMetadataKeys::Instrument, qstrtostr(m_editInstrument->text()));
+ metadata.set<String>(CompositionMetadataKeys::Piece, qstrtostr(m_editPiece->text()));
+ metadata.set<String>(CompositionMetadataKeys::Copyright, qstrtostr(m_editCopyright->text()));
+ metadata.set<String>(CompositionMetadataKeys::Tagline, qstrtostr(m_editTagline->text()));
+
+ for (QListViewItem *item = m_metadata->firstChild();
+ item != 0; item = item->nextSibling()) {
+
+ metadata.set<String>(qstrtostr(item->text(0).lower()),
+ qstrtostr(item->text(1)));
+ }
+
+ m_doc->slotDocumentModified();
+}
+
+}
+#include "HeadersConfigurationPage.moc"
diff --git a/src/gui/configuration/HeadersConfigurationPage.h b/src/gui/configuration/HeadersConfigurationPage.h
new file mode 100644
index 0000000..403d412
--- /dev/null
+++ b/src/gui/configuration/HeadersConfigurationPage.h
@@ -0,0 +1,80 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_HEADERSCONFIGURATIONPAGE_H_
+#define _RG_HEADERSCONFIGURATIONPAGE_H_
+
+#include <qvbox.h>
+
+class QVBox;
+class QWidget;
+class QLineEdit;
+class KListView;
+
+namespace Rosegarden
+{
+
+class RosegardenGUIDoc;
+
+class HeadersConfigurationPage : public QVBox
+{
+ Q_OBJECT
+
+public:
+ HeadersConfigurationPage(QWidget *parent = 0,
+ RosegardenGUIDoc *doc = 0);
+
+public slots:
+ void apply();
+
+protected slots:
+ void slotAddNewProperty();
+ void slotDeleteProperty();
+
+protected:
+ RosegardenGUIDoc *m_doc;
+
+ // Header fields
+ QLineEdit *m_editDedication;
+ QLineEdit *m_editTitle;
+ QLineEdit *m_editSubtitle;
+ QLineEdit *m_editSubsubtitle;
+ QLineEdit *m_editPoet;
+ QLineEdit *m_editComposer;
+ QLineEdit *m_editMeter;
+ QLineEdit *m_editOpus;
+ QLineEdit *m_editArranger;
+ QLineEdit *m_editInstrument;
+ QLineEdit *m_editPiece;
+ QLineEdit *m_editCopyright;
+ QLineEdit *m_editTagline;
+
+ KListView *m_metadata;
+};
+
+
+}
+
+#endif
diff --git a/src/gui/configuration/LatencyConfigurationPage.cpp b/src/gui/configuration/LatencyConfigurationPage.cpp
new file mode 100644
index 0000000..ff89edb
--- /dev/null
+++ b/src/gui/configuration/LatencyConfigurationPage.cpp
@@ -0,0 +1,157 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "LatencyConfigurationPage.h"
+#include <qlayout.h>
+
+#include "document/ConfigGroups.h"
+#include "ConfigurationPage.h"
+#include "document/RosegardenGUIDoc.h"
+#include "TabbedConfigurationPage.h"
+#include <kconfig.h>
+#include <qframe.h>
+#include <qlabel.h>
+#include <qpushbutton.h>
+#include <qslider.h>
+#include <qstring.h>
+#include <qtabwidget.h>
+#include <qwidget.h>
+
+
+namespace Rosegarden
+{
+
+LatencyConfigurationPage::LatencyConfigurationPage(RosegardenGUIDoc *doc,
+ KConfig *cfg,
+ QWidget *parent,
+ const char *name)
+ : TabbedConfigurationPage(doc, cfg, parent, name)
+{
+ // Configuration &config = doc->getConfiguration();
+ m_cfg->setGroup(LatencyOptionsConfigGroup);
+
+#ifdef NOT_DEFINED
+#ifdef HAVE_LIBJACK
+
+ frame = new QFrame(m_tabWidget, i18n("JACK latency"));
+ layout = new QGridLayout(frame, 6, 5, 10, 10);
+
+ layout->addMultiCellWidget(new QLabel(i18n("Use the \"Fetch JACK latencies\" button to discover the latency values set at\nthe sequencer. It's recommended that you use the returned values but it's also\npossible to override them manually using the sliders. Note that if you change\nyour JACK server parameters you should always fetch the latency values again.\nThe latency values will be stored by Rosegarden for use next time."), frame),
+ 0, 0,
+ 0, 3);
+
+ layout->addWidget(new QLabel(i18n("JACK playback latency (in ms)"), frame), 1, 0);
+ layout->addWidget(new QLabel(i18n("JACK record latency (in ms)"), frame), 3, 0);
+
+ m_fetchLatencyValues = new QPushButton(i18n("Fetch JACK latencies"),
+ frame);
+
+ layout->addWidget(m_fetchLatencyValues, 1, 3);
+
+ connect(m_fetchLatencyValues, SIGNAL(released()),
+ SLOT(slotFetchLatencyValues()));
+
+ int jackPlaybackValue = (m_cfg->readLongNumEntry(
+ "jackplaybacklatencyusec", 0) / 1000) +
+ (m_cfg->readLongNumEntry(
+ "jackplaybacklatencysec", 0) * 1000);
+
+ m_jackPlayback = new QSlider(Horizontal, frame);
+ m_jackPlayback->setTickmarks(QSlider::Below);
+ layout->addMultiCellWidget(m_jackPlayback, 3, 3, 2, 3);
+
+ QLabel *jackPlaybackLabel = new QLabel(QString("%1").arg(jackPlaybackValue),
+ frame);
+ layout->addWidget(jackPlaybackLabel, 2, 2, Qt::AlignHCenter);
+ connect(m_jackPlayback, SIGNAL(valueChanged(int)),
+ jackPlaybackLabel, SLOT(setNum(int)));
+
+ m_jackPlayback->setMinValue(0);
+ layout->addWidget(new QLabel("0", frame), 3, 1, Qt::AlignRight);
+
+ m_jackPlayback->setMaxValue(500);
+ layout->addWidget(new QLabel("500", frame), 3, 4, Qt::AlignLeft);
+
+ m_jackPlayback->setValue(jackPlaybackValue);
+
+ int jackRecordValue = (m_cfg->readLongNumEntry(
+ "jackrecordlatencyusec", 0) / 1000) +
+ (m_cfg->readLongNumEntry(
+ "jackrecordlatencysec", 0) * 1000);
+
+ m_jackRecord = new QSlider(Horizontal, frame);
+ m_jackRecord->setTickmarks(QSlider::Below);
+ layout->addMultiCellWidget(m_jackRecord, 5, 5, 2, 3);
+
+ QLabel *jackRecordLabel = new QLabel(QString("%1").arg(jackRecordValue),
+ frame);
+ layout->addWidget(jackRecordLabel, 4, 2, Qt::AlignHCenter);
+ connect(m_jackRecord, SIGNAL(valueChanged(int)),
+ jackRecordLabel, SLOT(setNum(int)));
+
+ m_jackRecord->setMinValue(0);
+ layout->addWidget(new QLabel("0", frame), 5, 1, Qt::AlignRight);
+
+ m_jackRecord->setMaxValue(500);
+ m_jackRecord->setValue(jackRecordValue);
+ layout->addWidget(new QLabel("500", frame), 5, 4, Qt::AlignLeft);
+
+ addTab(frame, i18n("JACK Latency"));
+#endif // HAVE_LIBJACK
+#endif // NOT_DEFINED
+
+}
+
+void LatencyConfigurationPage::apply()
+{
+ m_cfg->setGroup(LatencyOptionsConfigGroup);
+
+#ifdef HAVE_LIBJACK
+
+ int jackPlayback = getJACKPlaybackValue();
+ m_cfg->writeEntry("jackplaybacklatencysec", jackPlayback / 1000);
+ m_cfg->writeEntry("jackplaybacklatencyusec", jackPlayback * 1000);
+
+ int jackRecord = getJACKRecordValue();
+ m_cfg->writeEntry("jackrecordlatencysec", jackRecord / 1000);
+ m_cfg->writeEntry("jackrecordlatencyusec", jackRecord * 1000);
+
+#endif // HAVE_LIBJACK
+}
+
+void LatencyConfigurationPage::slotFetchLatencyValues()
+{
+ int jackPlaybackValue = m_doc->getAudioPlayLatency().msec() +
+ m_doc->getAudioPlayLatency().sec * 1000;
+
+ m_jackPlayback->setValue(jackPlaybackValue);
+
+ int jackRecordValue = m_doc->getAudioRecordLatency().msec() +
+ m_doc->getAudioRecordLatency().sec * 1000;
+ m_jackRecord->setValue(jackRecordValue);
+}
+
+}
+#include "LatencyConfigurationPage.moc"
diff --git a/src/gui/configuration/LatencyConfigurationPage.h b/src/gui/configuration/LatencyConfigurationPage.h
new file mode 100644
index 0000000..6caba88
--- /dev/null
+++ b/src/gui/configuration/LatencyConfigurationPage.h
@@ -0,0 +1,87 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_LATENCYCONFIGURATIONPAGE_H_
+#define _RG_LATENCYCONFIGURATIONPAGE_H_
+
+#include "TabbedConfigurationPage.h"
+#include <qstring.h>
+#include <klocale.h>
+#include <qslider.h>
+
+
+class QWidget;
+class QPushButton;
+class KConfig;
+
+
+namespace Rosegarden
+{
+
+class RosegardenGUIDoc;
+
+
+/**
+ * Latency Configuration page
+ *
+ * (application-wide settings)
+ */
+class LatencyConfigurationPage : public TabbedConfigurationPage
+{
+ Q_OBJECT
+
+public:
+ LatencyConfigurationPage(RosegardenGUIDoc *doc,
+ KConfig *cfg,
+ QWidget *parent=0, const char *name=0);
+
+ virtual void apply();
+
+ static QString iconLabel() { return i18n("Latency"); }
+ static QString title() { return i18n("Sequencer Latency"); }
+
+ int getJACKPlaybackValue() { return m_jackPlayback->value(); }
+ int getJACKRecordValue() { return m_jackRecord->value(); }
+
+protected slots:
+ // Get the latest latency values from the sequencer
+ //
+ void slotFetchLatencyValues();
+
+protected:
+
+ //--------------- Data members ---------------------------------
+
+ QSlider* m_jackPlayback;
+ QSlider* m_jackRecord;
+
+ QPushButton* m_fetchLatencyValues;
+};
+
+
+
+}
+
+#endif
diff --git a/src/gui/configuration/MIDIConfigurationPage.cpp b/src/gui/configuration/MIDIConfigurationPage.cpp
new file mode 100644
index 0000000..3d46841
--- /dev/null
+++ b/src/gui/configuration/MIDIConfigurationPage.cpp
@@ -0,0 +1,400 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "MIDIConfigurationPage.h"
+
+#include "sound/Midi.h"
+#include "sound/SoundDriver.h"
+#include "document/ConfigGroups.h"
+#include "base/MidiProgram.h"
+#include "base/Studio.h"
+#include "ConfigurationPage.h"
+#include "document/RosegardenGUIDoc.h"
+#include "gui/dialogs/ShowSequencerStatusDialog.h"
+#include "gui/seqmanager/SequenceManager.h"
+#include "gui/application/RosegardenApplication.h"
+#include "gui/studio/StudioControl.h"
+#include "sound/MappedEvent.h"
+#include "TabbedConfigurationPage.h"
+#include <kcombobox.h>
+#include <kconfig.h>
+#include <kfiledialog.h>
+#include <qcheckbox.h>
+#include <qcombobox.h>
+#include <qcstring.h>
+#include <qdatastream.h>
+#include <qframe.h>
+#include <qlabel.h>
+#include <qlineedit.h>
+#include <qobject.h>
+#include <qpushbutton.h>
+#include <qlayout.h>
+#include <qslider.h>
+#include <qspinbox.h>
+#include <qstring.h>
+#include <qstringlist.h>
+#include <qtabwidget.h>
+#include <qtooltip.h>
+#include <qwidget.h>
+#include <qcheckbox.h>
+#include <qhbox.h>
+
+namespace Rosegarden
+{
+
+MIDIConfigurationPage::MIDIConfigurationPage(
+ RosegardenGUIDoc *doc,
+ KConfig *cfg,
+ QWidget *parent,
+ const char *name):
+ TabbedConfigurationPage(cfg, parent, name),
+ m_midiPitchOctave(0)
+{
+ // set the document in the super class
+ m_doc = doc;
+
+ // ---------------- General tab ------------------
+ //
+ QFrame *frame = new QFrame(m_tabWidget);
+ QGridLayout *layout = new QGridLayout(frame, 9, 4, 10, 5);
+
+ int row = 0;
+
+ layout->setRowSpacing(row, 15);
+ ++row;
+
+ QLabel *label = 0;
+
+ m_cfg->setGroup(GeneralOptionsConfigGroup);
+
+ layout->addMultiCellWidget(new QLabel(i18n("Base octave number for MIDI pitch display"),
+ frame), row, row, 0, 1);
+
+ m_midiPitchOctave = new QSpinBox(frame);
+ m_midiPitchOctave->setMaxValue(10);
+ m_midiPitchOctave->setMinValue( -10);
+ m_midiPitchOctave->setValue(m_cfg->readNumEntry("midipitchoctave", -2));
+ layout->addMultiCellWidget(m_midiPitchOctave, row, row, 2, 3);
+ ++row;
+
+ layout->setRowSpacing(row, 20);
+ ++row;
+
+ m_cfg->setGroup(GeneralOptionsConfigGroup);
+
+ layout->addMultiCellWidget(new QLabel(i18n("Always use default studio when loading files"),
+ frame), row, row, 0, 1);
+
+ m_studio = new QCheckBox(frame);
+ m_studio->setChecked(m_cfg->readBoolEntry("alwaysusedefaultstudio", false));
+ layout->addWidget(m_studio, row, 2);
+ ++row;
+
+ // Send Controllers
+ //
+ m_cfg->setGroup(SequencerOptionsConfigGroup);
+
+ label = new QLabel(i18n("Send all MIDI Controllers at start of each playback"), frame);
+
+ QString controllerTip = i18n("Rosegarden can send all MIDI Controllers (Pan, Reverb etc) to all MIDI devices every\ntime you hit play if you so wish. Please note that this option will usually incur a\ndelay at the start of playback due to the amount of data being transmitted.");
+ QToolTip::add
+ (label, controllerTip);
+ layout->addMultiCellWidget(label, row, row, 0, 1);
+
+ m_sendControllersAtPlay = new QCheckBox(frame);
+ bool sendControllers = m_cfg->readBoolEntry("alwayssendcontrollers", false);
+ m_sendControllersAtPlay->setChecked(sendControllers);
+ QToolTip::add
+ (m_sendControllersAtPlay, controllerTip);
+ layout->addWidget(m_sendControllersAtPlay, row, 2);
+ ++row;
+
+ // Timer selection
+ //
+ m_cfg->setGroup(SequencerOptionsConfigGroup);
+
+ label = new QLabel(i18n("Sequencer timing source"), frame);
+ layout->addMultiCellWidget(label, row, row, 0, 1);
+
+ m_timer = new KComboBox(frame);
+ layout->addMultiCellWidget(m_timer, row, row, 2, 3);
+
+ QStringList timers = m_doc->getTimers();
+ m_origTimer = m_doc->getCurrentTimer();
+ QString currentTimer = m_cfg->readEntry("timer", m_origTimer);
+
+ for (unsigned int i = 0; i < timers.size(); ++i) {
+ m_timer->insertItem(timers[i]);
+ if (timers[i] == currentTimer)
+ m_timer->setCurrentItem(i);
+ }
+
+ ++row;
+
+ layout->setRowSpacing(row, 20);
+ ++row;
+
+ m_cfg->setGroup(SequencerOptionsConfigGroup);
+
+ // SoundFont loading
+ //
+ QLabel* lbl = new QLabel(i18n("Load SoundFont to SoundBlaster card at startup"), frame);
+ QString tooltip = i18n("Check this box to enable soundfont loading on EMU10K-based cards when Rosegarden is launched");
+ QToolTip::add(lbl, tooltip);
+ layout->addMultiCellWidget(lbl, row, row, 0, 1);
+
+ m_sfxLoadEnabled = new QCheckBox(frame);
+ layout->addWidget(m_sfxLoadEnabled, row, 2);
+ QToolTip::add(m_sfxLoadEnabled, tooltip);
+ ++row;
+
+ layout->addWidget(new QLabel(i18n("Path to 'asfxload' or 'sfxload' command"), frame), row, 0);
+ m_sfxLoadPath = new QLineEdit(m_cfg->readEntry("sfxloadpath", "/bin/sfxload"), frame);
+ layout->addMultiCellWidget(m_sfxLoadPath, row, row, 1, 2);
+ m_sfxLoadChoose = new QPushButton("Choose...", frame);
+ layout->addWidget(m_sfxLoadChoose, row, 3);
+ ++row;
+
+ layout->addWidget(new QLabel(i18n("SoundFont"), frame), row, 0);
+ m_soundFontPath = new QLineEdit(m_cfg->readEntry("soundfontpath", ""), frame);
+ layout->addMultiCellWidget(m_soundFontPath, row, row, 1, 2);
+ m_soundFontChoose = new QPushButton("Choose...", frame);
+ layout->addWidget(m_soundFontChoose, row, 3);
+ ++row;
+
+ bool sfxLoadEnabled = m_cfg->readBoolEntry("sfxloadenabled", false);
+ m_sfxLoadEnabled->setChecked(sfxLoadEnabled);
+ if (!sfxLoadEnabled) {
+ m_sfxLoadPath->setEnabled(false);
+ m_sfxLoadChoose->setEnabled(false);
+ m_soundFontPath->setEnabled(false);
+ m_soundFontChoose->setEnabled(false);
+ }
+
+ connect(m_sfxLoadEnabled, SIGNAL(toggled(bool)),
+ this, SLOT(slotSoundFontToggled(bool)));
+
+ connect(m_sfxLoadChoose, SIGNAL(clicked()),
+ this, SLOT(slotSfxLoadPathChoose()));
+
+ connect(m_soundFontChoose, SIGNAL(clicked()),
+ this, SLOT(slotSoundFontChoose()));
+
+ layout->setRowStretch(row, 10);
+
+ addTab(frame, i18n("General"));
+
+ m_cfg->setGroup(SequencerOptionsConfigGroup);
+
+ // -------------- Synchronisation tab -----------------
+ //
+ frame = new QFrame(m_tabWidget);
+ layout = new QGridLayout(frame, 7, 2, 10, 5);
+
+ row = 0;
+
+ layout->setRowSpacing(row, 15);
+ ++row;
+
+ // MIDI Clock and System Realtime Messages
+ //
+ label = new QLabel(i18n("MIDI Clock and System messages"), frame);
+ layout->addWidget(label, row, 0);
+ m_midiSync = new KComboBox(frame);
+ layout->addWidget(m_midiSync, row, 1);
+
+ m_midiSync->insertItem(i18n("Off"));
+ m_midiSync->insertItem(i18n("Send MIDI Clock, Start and Stop"));
+ m_midiSync->insertItem(i18n("Accept Start, Stop and Continue"));
+
+ int midiClock = m_cfg->readNumEntry("midiclock", 0);
+ if (midiClock < 0 || midiClock > 2)
+ midiClock = 0;
+ m_midiSync->setCurrentItem(midiClock);
+
+ ++row;
+
+ // MMC Transport
+ //
+ label = new QLabel(i18n("MIDI Machine Control mode"), frame);
+ layout->addWidget(label, row, 0);
+
+ m_mmcTransport = new KComboBox(frame);
+ layout->addWidget(m_mmcTransport, row, 1); //, Qt::AlignHCenter);
+
+ m_mmcTransport->insertItem(i18n("Off"));
+ m_mmcTransport->insertItem(i18n("MMC Master"));
+ m_mmcTransport->insertItem(i18n("MMC Slave"));
+
+ int mmcMode = m_cfg->readNumEntry("mmcmode", 0);
+ if (mmcMode < 0 || mmcMode > 2)
+ mmcMode = 0;
+ m_mmcTransport->setCurrentItem(mmcMode);
+
+ ++row;
+
+ // MTC transport
+ //
+ label = new QLabel(i18n("MIDI Time Code mode"), frame);
+ layout->addWidget(label, row, 0);
+
+ m_mtcTransport = new KComboBox(frame);
+ layout->addWidget(m_mtcTransport, row, 1);
+
+ m_mtcTransport->insertItem(i18n("Off"));
+ m_mtcTransport->insertItem(i18n("MTC Master"));
+ m_mtcTransport->insertItem(i18n("MTC Slave"));
+
+ int mtcMode = m_cfg->readNumEntry("mtcmode", 0);
+ if (mtcMode < 0 || mtcMode > 2)
+ mtcMode = 0;
+ m_mtcTransport->setCurrentItem(mtcMode);
+
+ ++row;
+
+ QHBox *hbox = new QHBox(frame);
+ hbox->setSpacing(5);
+ layout->addMultiCellWidget(hbox, row, row, 0, 1);
+
+ label = new QLabel(i18n("Automatically connect sync output to all devices in use"), hbox);
+// layout->addWidget(label, row, 0);
+ m_midiSyncAuto = new QCheckBox(hbox);
+// layout->addWidget(m_midiSyncAuto, row, 1);
+
+ m_midiSyncAuto->setChecked(m_cfg->readBoolEntry("midisyncautoconnect", false));
+
+ ++row;
+
+ layout->setRowStretch(row, 10);
+
+ addTab(frame, i18n("MIDI Sync"));
+}
+
+
+void
+MIDIConfigurationPage::slotSoundFontToggled(bool isChecked)
+{
+ m_sfxLoadPath->setEnabled(isChecked);
+ m_sfxLoadChoose->setEnabled(isChecked);
+ m_soundFontPath->setEnabled(isChecked);
+ m_soundFontChoose->setEnabled(isChecked);
+}
+
+void
+MIDIConfigurationPage::slotSfxLoadPathChoose()
+{
+ QString path = KFileDialog::getOpenFileName(":SFXLOAD", QString::null, this, i18n("sfxload path"));
+ m_sfxLoadPath->setText(path);
+}
+
+void
+MIDIConfigurationPage::slotSoundFontChoose()
+{
+ QString path = KFileDialog::getOpenFileName(":SOUNDFONTS", "*.sb *.sf2 *.SF2 *.SB", this, i18n("Soundfont path"));
+ m_soundFontPath->setText(path);
+}
+
+void
+MIDIConfigurationPage::apply()
+{
+ m_cfg->setGroup(SequencerOptionsConfigGroup);
+
+ m_cfg->writeEntry("alwayssendcontrollers",
+ m_sendControllersAtPlay->isChecked());
+
+ m_cfg->writeEntry("sfxloadenabled", m_sfxLoadEnabled->isChecked());
+ m_cfg->writeEntry("sfxloadpath", m_sfxLoadPath->text());
+ m_cfg->writeEntry("soundfontpath", m_soundFontPath->text());
+
+ m_cfg->writeEntry("timer", m_timer->currentText());
+ if (m_timer->currentText() != m_origTimer) {
+ m_doc->setCurrentTimer(m_timer->currentText());
+ }
+
+ // Write the entries
+ //
+ m_cfg->writeEntry("mmcmode", m_mmcTransport->currentItem());
+ m_cfg->writeEntry("mtcmode", m_mtcTransport->currentItem());
+ m_cfg->writeEntry("midisyncautoconnect", m_midiSyncAuto->isChecked());
+
+ // Now send
+ //
+ MappedEvent mEmccValue(MidiInstrumentBase, // InstrumentId
+ MappedEvent::SystemMMCTransport,
+ MidiByte(m_mmcTransport->currentItem()));
+
+ StudioControl::sendMappedEvent(mEmccValue);
+
+ MappedEvent mEmtcValue(MidiInstrumentBase, // InstrumentId
+ MappedEvent::SystemMTCTransport,
+ MidiByte(m_mtcTransport->currentItem()));
+
+ StudioControl::sendMappedEvent(mEmtcValue);
+
+ MappedEvent mEmsaValue(MidiInstrumentBase, // InstrumentId
+ MappedEvent::SystemMIDISyncAuto,
+ MidiByte(m_midiSyncAuto->isChecked() ? 1 : 0));
+
+ StudioControl::sendMappedEvent(mEmsaValue);
+
+
+ // ------------- MIDI Clock and System messages ------------
+ //
+ int midiClock = m_midiSync->currentItem();
+ m_cfg->writeEntry("midiclock", midiClock);
+
+ // Now send it (OLD METHOD - to be removed)
+ //!!! No, don't remove -- this controls SPP as well doesn't it?
+ //
+ MappedEvent mEMIDIClock(MidiInstrumentBase, // InstrumentId
+ MappedEvent::SystemMIDIClock,
+ MidiByte(midiClock));
+
+ StudioControl::sendMappedEvent(mEMIDIClock);
+
+
+ // Now update the metronome mapped segment with new clock ticks
+ // if needed.
+ //
+ Studio &studio = m_doc->getStudio();
+ const MidiMetronome *metronome = studio.
+ getMetronomeFromDevice(studio.getMetronomeDevice());
+
+ if (metronome) {
+ InstrumentId instrument = metronome->getInstrument();
+ m_doc->getSequenceManager()->metronomeChanged(instrument, true);
+ }
+
+ m_cfg->setGroup(GeneralOptionsConfigGroup);
+
+ bool deftstudio = getUseDefaultStudio();
+ m_cfg->writeEntry("alwaysusedefaultstudio", deftstudio);
+
+ int octave = m_midiPitchOctave->value();
+ m_cfg->writeEntry("midipitchoctave", octave);
+}
+
+}
+#include "MIDIConfigurationPage.moc"
diff --git a/src/gui/configuration/MIDIConfigurationPage.h b/src/gui/configuration/MIDIConfigurationPage.h
new file mode 100644
index 0000000..243f041
--- /dev/null
+++ b/src/gui/configuration/MIDIConfigurationPage.h
@@ -0,0 +1,104 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_MIDICONFIGURATIONPAGE_H_
+#define _RG_MIDICONFIGURATIONPAGE_H_
+
+#include "TabbedConfigurationPage.h"
+#include <qstring.h>
+#include <klocale.h>
+#include <qlineedit.h>
+#include <qcheckbox.h>
+
+
+class QWidget;
+class QSpinBox;
+class QSlider;
+class QPushButton;
+class QLabel;
+class QComboBox;
+class KConfig;
+class KComboBox;
+
+
+namespace Rosegarden
+{
+
+class RosegardenGUIDoc;
+
+
+class MIDIConfigurationPage : public TabbedConfigurationPage
+{
+ Q_OBJECT
+public:
+ MIDIConfigurationPage(RosegardenGUIDoc *doc,
+ KConfig *cfg,
+ QWidget *parent=0,
+ const char *name=0);
+
+ virtual void apply();
+
+ static QString iconLabel() { return i18n("MIDI"); }
+ static QString title() { return i18n("MIDI Settings"); }
+ static QString iconName() { return "configure-midi"; }
+
+protected slots:
+ void slotSoundFontToggled(bool);
+ void slotSfxLoadPathChoose();
+ void slotSoundFontChoose();
+
+protected:
+ bool getUseDefaultStudio() { return m_studio->isChecked(); }
+
+ //--------------- Data members ---------------------------------
+
+ // General
+ QCheckBox *m_sendControllersAtPlay;
+
+ QCheckBox *m_sfxLoadEnabled;
+ QLineEdit *m_sfxLoadPath;
+ QPushButton *m_sfxLoadChoose;
+ QLineEdit *m_soundFontPath;
+ QPushButton *m_soundFontChoose;
+
+ // Sync and timing
+ //
+ //QCheckBox *m_midiClockEnabled;
+ QComboBox *m_midiSync;
+ QString m_origTimer;
+ QComboBox *m_timer;
+ QComboBox *m_mmcTransport;
+ QComboBox *m_mtcTransport;
+ QCheckBox *m_midiSyncAuto;
+
+ QCheckBox* m_studio;
+ QSpinBox* m_midiPitchOctave;
+
+};
+
+
+
+}
+
+#endif
diff --git a/src/gui/configuration/MatrixConfigurationPage.cpp b/src/gui/configuration/MatrixConfigurationPage.cpp
new file mode 100644
index 0000000..e21f3fd
--- /dev/null
+++ b/src/gui/configuration/MatrixConfigurationPage.cpp
@@ -0,0 +1,68 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "MatrixConfigurationPage.h"
+
+#include "document/ConfigGroups.h"
+#include "ConfigurationPage.h"
+#include "document/RosegardenGUIDoc.h"
+#include "document/ConfigGroups.h"
+#include "gui/editors/matrix/MatrixView.h"
+#include "TabbedConfigurationPage.h"
+#include <kconfig.h>
+#include <qframe.h>
+#include <qlabel.h>
+#include <qstring.h>
+#include <qtabwidget.h>
+#include <qwidget.h>
+#include <qlayout.h>
+
+namespace Rosegarden
+{
+
+MatrixConfigurationPage::MatrixConfigurationPage(KConfig *cfg,
+ QWidget *parent,
+ const char *name) :
+ TabbedConfigurationPage(cfg, parent, name)
+{
+ m_cfg->setGroup(MatrixViewConfigGroup);
+
+ QFrame *frame = new QFrame(m_tabWidget);
+ QGridLayout *layout = new QGridLayout(frame,
+ 4, 2, // nbrow, nbcol
+ 10, 5);
+
+ layout->addWidget(new QLabel("Nothing here yet", frame), 0, 0);
+
+ addTab(frame, i18n("General"));
+}
+
+void MatrixConfigurationPage::apply()
+{
+ m_cfg->setGroup(MatrixViewConfigGroup);
+}
+
+}
+#include "MatrixConfigurationPage.moc"
diff --git a/src/gui/configuration/MatrixConfigurationPage.h b/src/gui/configuration/MatrixConfigurationPage.h
new file mode 100644
index 0000000..9c4b3fc
--- /dev/null
+++ b/src/gui/configuration/MatrixConfigurationPage.h
@@ -0,0 +1,69 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_MATRIXCONFIGURATIONPAGE_H_
+#define _RG_MATRIXCONFIGURATIONPAGE_H_
+
+#include "TabbedConfigurationPage.h"
+#include <qstring.h>
+#include <klocale.h>
+
+
+class QWidget;
+class KConfig;
+
+
+namespace Rosegarden
+{
+
+
+
+/**
+ * Notation Configuration page
+ */
+class MatrixConfigurationPage : public TabbedConfigurationPage
+{
+ Q_OBJECT
+
+public:
+ MatrixConfigurationPage(KConfig *cfg,
+ QWidget *parent = 0, const char *name=0);
+
+ virtual void apply();
+
+ static QString iconLabel() { return i18n("Matrix"); }
+ static QString title() { return i18n("Matrix"); }
+
+protected slots:
+
+protected:
+
+ //--------------- Data members ---------------------------------
+};
+
+
+}
+
+#endif
diff --git a/src/gui/configuration/NotationConfigurationPage.cpp b/src/gui/configuration/NotationConfigurationPage.cpp
new file mode 100644
index 0000000..a828fe7
--- /dev/null
+++ b/src/gui/configuration/NotationConfigurationPage.cpp
@@ -0,0 +1,741 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "NotationConfigurationPage.h"
+#include <qlayout.h>
+
+#include "misc/Strings.h"
+#include "document/ConfigGroups.h"
+#include "base/Exception.h"
+#include "base/NotationTypes.h"
+#include "commands/edit/PasteEventsCommand.h"
+#include "ConfigurationPage.h"
+#include "document/RosegardenGUIDoc.h"
+#include "gui/editors/notation/HeadersGroup.h"
+#include "gui/editors/notation/NotationHLayout.h"
+#include "gui/editors/notation/NoteFontFactory.h"
+#include "gui/editors/notation/NoteFont.h"
+#include "gui/editors/notation/NoteFontMap.h"
+#include "gui/editors/notation/NoteFontViewer.h"
+#include "gui/editors/notation/NotePixmapFactory.h"
+#include "gui/editors/notation/NoteStyleFactory.h"
+#include "gui/widgets/QuantizeParameters.h"
+#include "TabbedConfigurationPage.h"
+#include <kcombobox.h>
+#include <kconfig.h>
+#include <kfontrequester.h>
+#include <kmessagebox.h>
+#include <qcheckbox.h>
+#include <qcombobox.h>
+#include <qfont.h>
+#include <qframe.h>
+#include <qgroupbox.h>
+#include <qhbox.h>
+#include <qlabel.h>
+#include <qobject.h>
+#include <qpushbutton.h>
+#include <qstring.h>
+#include <qstringlist.h>
+#include <qtabwidget.h>
+#include <qwidget.h>
+#include <qtooltip.h>
+#include <algorithm>
+
+namespace Rosegarden
+{
+
+NotationConfigurationPage::NotationConfigurationPage(KConfig *cfg,
+ QWidget *parent,
+ const char *name) :
+ TabbedConfigurationPage(cfg, parent, name)
+{
+ m_cfg->setGroup(NotationViewConfigGroup);
+
+ QFrame *frame;
+ QGridLayout *layout;
+
+ frame = new QFrame(m_tabWidget);
+ layout = new QGridLayout(frame, 9, 3, 10, 5);
+
+ int row = 0;
+
+ layout->setRowSpacing(row, 15);
+ ++row;
+
+ layout->addWidget(new QLabel(i18n("Default layout mode"), frame), row, 0);
+
+ m_layoutMode = new KComboBox(frame);
+ m_layoutMode->setEditable(false);
+ m_layoutMode->insertItem(i18n("Linear layout"));
+ m_layoutMode->insertItem(i18n("Continuous page layout"));
+ m_layoutMode->insertItem(i18n("Multiple page layout"));
+ int defaultLayoutMode = m_cfg->readNumEntry("layoutmode", 0);
+ if (defaultLayoutMode >= 0 && defaultLayoutMode <= 2) {
+ m_layoutMode->setCurrentItem(defaultLayoutMode);
+ }
+ layout->addMultiCellWidget(m_layoutMode, row, row, 1, 2);
+ ++row;
+
+ layout->addWidget(new QLabel(i18n("Default spacing"), frame), row, 0);
+
+ m_spacing = new KComboBox(frame);
+ m_spacing->setEditable(false);
+
+ std::vector<int> s = NotationHLayout::getAvailableSpacings();
+ int defaultSpacing = m_cfg->readNumEntry("spacing", 100);
+
+ for (std::vector<int>::iterator i = s.begin(); i != s.end(); ++i) {
+
+ QString text("%1 %");
+ if (*i == 100)
+ text = "%1 % (normal)";
+ m_spacing->insertItem(text.arg(*i));
+
+ if (*i == defaultSpacing) {
+ m_spacing->setCurrentItem(m_spacing->count() - 1);
+ }
+ }
+
+ layout->addMultiCellWidget(m_spacing, row, row, 1, 2);
+
+ ++row;
+
+ layout->addWidget(new QLabel(i18n("Default duration factor"), frame), row, 0);
+
+ m_proportion = new KComboBox(frame);
+ m_proportion->setEditable(false);
+
+ s = NotationHLayout::getAvailableProportions();
+ int defaultProportion = m_cfg->readNumEntry("proportion", 60);
+
+ for (std::vector<int>::iterator i = s.begin(); i != s.end(); ++i) {
+
+ QString text = QString("%1 %").arg(*i);
+ if (*i == 40)
+ text = "40 % (normal)";
+ else if (*i == 0)
+ text = i18n("None");
+ else if (*i == 100)
+ text = i18n("Full");
+ m_proportion->insertItem(text);
+
+ if (*i == defaultProportion) {
+ m_proportion->setCurrentItem(m_proportion->count() - 1);
+ }
+ }
+
+ layout->addMultiCellWidget(m_proportion, row, row, 1, 2);
+ ++row;
+
+ layout->addWidget(new QLabel(i18n("Show track headers (linear layout only)"),
+ frame), row, 0);
+
+ m_showTrackHeaders = new KComboBox(frame);
+ m_showTrackHeaders->setEditable(false);
+ m_showTrackHeaders->insertItem(i18n("Never"), HeadersGroup::ShowNever);
+ m_showTrackHeaders->insertItem(i18n("When needed"), HeadersGroup::ShowWhenNeeded);
+ m_showTrackHeaders->insertItem(i18n("Always"), HeadersGroup::ShowAlways);
+ int defaultShowTrackHeaders = m_cfg->readNumEntry("shownotationheader",
+ HeadersGroup::DefaultShowMode);
+ if (HeadersGroup::isValidShowMode(defaultShowTrackHeaders)) {
+ m_showTrackHeaders->setCurrentItem(defaultShowTrackHeaders);
+ }
+ QToolTip::add(m_showTrackHeaders, QString(i18n(
+ "\"Always\" and \"Never\" mean what they usually mean\n"
+ "\"When needed\" means \"when staves are too many to all fit"
+ " in the current window\"")));
+
+ layout->addMultiCellWidget(m_showTrackHeaders, row, row, 1, 2);
+ ++row;
+
+ layout->setRowSpacing(row, 20);
+ ++row;
+
+ layout->addMultiCellWidget
+ (new QLabel
+ (i18n("Show non-notation events as question marks"), frame),
+ row, row, 0, 1);
+ m_showUnknowns = new QCheckBox(frame);
+ bool defaultShowUnknowns = m_cfg->readBoolEntry("showunknowns", false);
+ m_showUnknowns->setChecked(defaultShowUnknowns);
+ layout->addWidget(m_showUnknowns, row, 2);
+ ++row;
+
+ layout->addMultiCellWidget
+ (new QLabel
+ (i18n("Show notation-quantized notes in a different color"), frame),
+ row, row, 0, 1);
+ m_colourQuantize = new QCheckBox(frame);
+ bool defaultColourQuantize = m_cfg->readBoolEntry("colourquantize", false);
+ m_colourQuantize->setChecked(defaultColourQuantize);
+ layout->addWidget(m_colourQuantize, row, 2);
+ ++row;
+
+ layout->addMultiCellWidget
+ (new QLabel
+ (i18n("Show \"invisible\" events in grey"), frame),
+ row, row, 0, 1);
+ m_showInvisibles = new QCheckBox(frame);
+ bool defaultShowInvisibles = m_cfg->readBoolEntry("showinvisibles", true);
+ m_showInvisibles->setChecked(defaultShowInvisibles);
+ layout->addWidget(m_showInvisibles, row, 2);
+ ++row;
+
+ layout->addMultiCellWidget
+ (new QLabel
+ (i18n("Show notes outside suggested playable range in red"), frame),
+ row, row, 0, 1);
+ m_showRanges = new QCheckBox(frame);
+ bool defaultShowRanges = m_cfg->readBoolEntry("showranges", true);
+ m_showRanges->setChecked(defaultShowRanges);
+ layout->addWidget(m_showRanges, row, 2);
+ ++row;
+
+ layout->addMultiCellWidget
+ (new QLabel
+ (i18n("Highlight superimposed notes with a halo effect"), frame),
+ row, row, 0, 1);
+ m_showCollisions = new QCheckBox(frame);
+ bool defaultShowCollisions = m_cfg->readBoolEntry("showcollisions", true);
+ m_showCollisions->setChecked(defaultShowCollisions);
+ layout->addWidget(m_showCollisions, row, 2);
+ ++row;
+
+ layout->setRowSpacing(row, 20);
+ ++row;
+
+ layout->addMultiCellWidget
+ (new QLabel
+ (i18n("When recording MIDI, split-and-tie long notes at barlines"), frame),
+ row, row, 0, 1);
+ m_splitAndTie = new QCheckBox(frame);
+ bool defaultSplitAndTie = m_cfg->readBoolEntry("quantizemakeviable", false);
+ m_splitAndTie->setChecked(defaultSplitAndTie);
+ layout->addWidget(m_splitAndTie, row, 2);
+ ++row;
+
+ layout->setRowStretch(row, 10);
+
+
+ addTab(frame, i18n("Layout"));
+
+
+
+ frame = new QFrame(m_tabWidget);
+ layout = new QGridLayout(frame, 6, 3, 10, 5);
+
+ row = 0;
+
+ layout->setRowSpacing(row, 15);
+ ++row;
+
+ layout->addMultiCellWidget
+ (new QLabel(i18n("Default note style for new notes"), frame),
+ row, row, 0, 1);
+
+ layout->setColStretch(2, 10);
+
+ m_noteStyle = new KComboBox(frame);
+ m_noteStyle->setEditable(false);
+ m_untranslatedNoteStyle.clear();
+
+ QString defaultStyle =
+ m_cfg->readEntry("style", strtoqstr(NoteStyleFactory::DefaultStyle));
+ std::vector<NoteStyleName> styles
+ (NoteStyleFactory::getAvailableStyleNames());
+
+ for (std::vector<NoteStyleName>::iterator i = styles.begin();
+ i != styles.end(); ++i) {
+
+ QString styleQName(strtoqstr(*i));
+ m_untranslatedNoteStyle.append(styleQName);
+ m_noteStyle->insertItem(i18n(styleQName.utf8()));
+ if (styleQName == defaultStyle) {
+ m_noteStyle->setCurrentItem(m_noteStyle->count() - 1);
+ }
+ }
+
+ layout->addWidget(m_noteStyle, row, 2);
+ ++row;
+
+ layout->setRowSpacing(row, 20);
+ ++row;
+
+ layout->addWidget
+ (new QLabel(i18n("When inserting notes..."), frame), row, 0);
+
+ int defaultInsertType = m_cfg->readNumEntry("inserttype", 0);
+
+ m_insertType = new KComboBox(frame);
+ m_insertType->setEditable(false);
+ m_insertType->insertItem
+ (i18n("Split notes into ties to make durations match"));
+ m_insertType->insertItem(i18n("Ignore existing durations"));
+ m_insertType->setCurrentItem(defaultInsertType);
+
+ layout->addMultiCellWidget(m_insertType, row, row, 1, 2);
+ ++row;
+
+ bool autoBeam = m_cfg->readBoolEntry("autobeam", true);
+
+ layout->addMultiCellWidget
+ (new QLabel
+ (i18n("Auto-beam on insert when appropriate"), frame),
+ row, row, 0, 1);
+ m_autoBeam = new QCheckBox(frame);
+ m_autoBeam->setChecked(autoBeam);
+ layout->addMultiCellWidget(m_autoBeam, row, row, 2, 2);
+
+ ++row;
+
+ bool collapse = m_cfg->readBoolEntry("collapse", false);
+
+ layout->addMultiCellWidget
+ (new QLabel
+ (i18n("Collapse rests after erase"), frame),
+ row, row, 0, 1);
+ m_collapseRests = new QCheckBox(frame);
+ m_collapseRests->setChecked(collapse);
+ layout->addMultiCellWidget(m_collapseRests, row, row, 2, 2);
+ ++row;
+
+ layout->setRowSpacing(row, 20);
+ ++row;
+
+ layout->addWidget
+ (new QLabel(i18n("Default paste type"), frame), row, 0);
+
+ m_pasteType = new KComboBox(frame);
+ m_pasteType->setEditable(false);
+
+ unsigned int defaultPasteType = m_cfg->readUnsignedNumEntry
+ ("pastetype", PasteEventsCommand::Restricted);
+
+ PasteEventsCommand::PasteTypeMap pasteTypes =
+ PasteEventsCommand::getPasteTypes();
+
+ for (PasteEventsCommand::PasteTypeMap::iterator i = pasteTypes.begin();
+ i != pasteTypes.end(); ++i) {
+ m_pasteType->insertItem(i->second);
+ }
+
+ m_pasteType->setCurrentItem(defaultPasteType);
+ layout->addMultiCellWidget(m_pasteType, row, row, 1, 2);
+ ++row;
+
+ layout->setRowStretch(row, 10);
+
+ addTab(frame, i18n("Editing"));
+
+
+
+ frame = new QFrame(m_tabWidget);
+ layout = new QGridLayout(frame, 4, 2, 10, 5);
+
+ row = 0;
+
+ layout->setRowSpacing(row, 15);
+ ++row;
+
+ layout->addWidget(new QLabel(i18n("Accidentals in one octave..."), frame), row, 0);
+ m_accOctavePolicy = new KComboBox(frame);
+ m_accOctavePolicy->insertItem(i18n("Affect only that octave"));
+ m_accOctavePolicy->insertItem(i18n("Require cautionaries in other octaves"));
+ m_accOctavePolicy->insertItem(i18n("Affect all subsequent octaves"));
+ int accOctaveMode = m_cfg->readNumEntry("accidentaloctavemode", 1);
+ if (accOctaveMode >= 0 && accOctaveMode < 3) {
+ m_accOctavePolicy->setCurrentItem(accOctaveMode);
+ }
+ layout->addWidget(m_accOctavePolicy, row, 1);
+ ++row;
+
+ layout->addWidget(new QLabel(i18n("Accidentals in one bar..."), frame), row, 0);
+ m_accBarPolicy = new KComboBox(frame);
+ m_accBarPolicy->insertItem(i18n("Affect only that bar"));
+ m_accBarPolicy->insertItem(i18n("Require cautionary resets in following bar"));
+ m_accBarPolicy->insertItem(i18n("Require explicit resets in following bar"));
+ int accBarMode = m_cfg->readNumEntry("accidentalbarmode", 0);
+ if (accBarMode >= 0 && accBarMode < 3) {
+ m_accBarPolicy->setCurrentItem(accBarMode);
+ }
+ layout->addWidget(m_accBarPolicy, row, 1);
+ ++row;
+
+ layout->addWidget(new QLabel(i18n("Key signature cancellation style"), frame), row, 0);
+ m_keySigCancelMode = new KComboBox(frame);
+ m_keySigCancelMode->insertItem(i18n("Cancel only when entering C major or A minor"));
+ m_keySigCancelMode->insertItem(i18n("Cancel whenever removing sharps or flats"));
+ m_keySigCancelMode->insertItem(i18n("Cancel always"));
+ int cancelMode = m_cfg->readNumEntry("keysigcancelmode", 1);
+ if (cancelMode >= 0 && cancelMode < 3) {
+ m_keySigCancelMode->setCurrentItem(cancelMode);
+ }
+ layout->addWidget(m_keySigCancelMode, row, 1);
+ ++row;
+
+ layout->setRowStretch(row, 10);
+
+ addTab(frame, i18n("Accidentals"));
+
+/*
+ QString preamble =
+ (i18n("Rosegarden can apply automatic quantization to recorded "
+ "or imported MIDI data for notation purposes only. "
+ "This does not affect playback, and does not affect "
+ "editing in any of the views except notation."));
+
+ // force to default of 2 if not used before
+ int quantizeType = m_cfg->readNumEntry("quantizetype", 2);
+ m_cfg->writeEntry("quantizetype", quantizeType);
+ m_cfg->writeEntry("quantizenotationonly", true);
+
+ m_quantizeFrame = new QuantizeParameters
+ (m_tabWidget, QuantizeParameters::Notation,
+ false, false, "Notation Options", preamble);
+
+ addTab(m_quantizeFrame, i18n("Quantize"));
+*/
+ row = 0;
+
+// QFrame *mainFrame = new QFrame(m_tabWidget);
+// QGridLayout *mainLayout = new QGridLayout(mainFrame, 2, 4, 10, 5);
+
+// QGroupBox *noteFontBox = new QGroupBox(1, Horizontal, i18n("Notation font"), mainFrame);
+// QGroupBox *otherFontBox = new QGroupBox(1, Horizontal, i18n("Other fonts"), mainFrame);
+// QGroupBox *descriptionBox = new QGroupBox(1, Horizontal, i18n("Description"), mainFrame);
+
+// mainLayout->addWidget(noteFontBox, 0, 0);
+// mainLayout->addWidget(otherFontBox, 1, 0);
+
+// QFrame *mainFrame = new QFrame(m_tabWidget);
+ frame = new QFrame(m_tabWidget);
+ layout = new QGridLayout(frame, 2, 4, 10, 5);
+
+// frame = new QFrame(noteFontBox);
+// layout = new QGridLayout(frame, 5, 2, 10, 5);
+
+ m_viewButton = 0;
+
+ layout->addWidget(new QLabel(i18n("Notation font"), frame), 0, 0);
+
+ m_font = new KComboBox(frame);
+
+#ifdef HAVE_XFT
+ m_viewButton = new QPushButton(i18n("View"), frame);
+ layout->addMultiCellWidget(m_font, row, row, 1, 2);
+ layout->addWidget(m_viewButton, row, 3);
+ QObject::connect(m_viewButton, SIGNAL(clicked()),
+ this, SLOT(slotViewButtonPressed()));
+#else
+ layout->addMultiCellWidget(m_font, row, row, 1, 3);
+#endif
+ m_font->setEditable(false);
+ QObject::connect(m_font, SIGNAL(activated(int)),
+ this, SLOT(slotFontComboChanged(int)));
+ ++row;
+
+ QFrame *subFrame = new QFrame(frame);
+ QGridLayout *subLayout = new QGridLayout(subFrame,
+ 4, 2, // nbrow, nbcol
+ 12, 2);
+
+ QFont font = m_font->font();
+ font.setPointSize((font.pointSize() * 9) / 10);
+
+ QLabel *originLabel = new QLabel(i18n("Origin:"), subFrame);
+ originLabel->setFont(font);
+ subLayout->addWidget(originLabel, 0, 0);
+
+ QLabel *copyrightLabel = new QLabel(i18n("Copyright:"), subFrame);
+ copyrightLabel->setFont(font);
+ subLayout->addWidget(copyrightLabel, 1, 0);
+
+ QLabel *mappedLabel = new QLabel(i18n("Mapped by:"), subFrame);
+ mappedLabel->setFont(font);
+ subLayout->addWidget(mappedLabel, 2, 0);
+
+ QLabel *typeLabel = new QLabel(i18n("Type:"), subFrame);
+ typeLabel->setFont(font);
+ subLayout->addWidget(typeLabel, 3, 0);
+
+ m_fontOriginLabel = new QLabel(subFrame);
+ m_fontOriginLabel->setAlignment(Qt::WordBreak);
+ m_fontOriginLabel->setFont(font);
+// m_fontOriginLabel->setFixedWidth(250);
+ m_fontCopyrightLabel = new QLabel(subFrame);
+ m_fontCopyrightLabel->setAlignment(Qt::WordBreak);
+ m_fontCopyrightLabel->setFont(font);
+// m_fontCopyrightLabel->setFixedWidth(250);
+ m_fontMappedByLabel = new QLabel(subFrame);
+ m_fontMappedByLabel->setFont(font);
+ m_fontTypeLabel = new QLabel(subFrame);
+ m_fontTypeLabel->setFont(font);
+ subLayout->addWidget(m_fontOriginLabel, 0, 1);
+ subLayout->addWidget(m_fontCopyrightLabel, 1, 1);
+ subLayout->addWidget(m_fontMappedByLabel, 2, 1);
+ subLayout->addWidget(m_fontTypeLabel, 3, 1);
+
+ subLayout->setColStretch(1, 10);
+
+ layout->addMultiCellWidget(subFrame,
+ row, row,
+ 0, 3);
+ ++row;
+
+ layout->addMultiCellWidget
+ (new QLabel(i18n("Font size for single-staff views"), frame),
+ row, row, 0, 1);
+ m_singleStaffSize = new KComboBox(frame);
+ m_singleStaffSize->setEditable(false);
+ layout->addMultiCellWidget(m_singleStaffSize, row, row, 2, 2);
+ ++row;
+
+ layout->addMultiCellWidget
+ (new QLabel(i18n("Font size for multi-staff views"), frame),
+ row, row, 0, 1);
+ m_multiStaffSize = new KComboBox(frame);
+ m_multiStaffSize->setEditable(false);
+ layout->addMultiCellWidget(m_multiStaffSize, row, row, 2, 2);
+ ++row;
+
+ layout->addMultiCellWidget
+ (new QLabel(i18n("Font size for printing (pt)"), frame),
+ row, row, 0, 1);
+ m_printingSize = new KComboBox(frame);
+ m_printingSize->setEditable(false);
+ layout->addMultiCellWidget(m_printingSize, row, row, 2, 2);
+ ++row;
+
+ slotPopulateFontCombo(false);
+
+ layout->setRowSpacing(row, 15);
+ ++row;
+
+ QFont defaultTextFont(NotePixmapFactory::defaultSerifFontFamily),
+ defaultSansFont(NotePixmapFactory::defaultSansSerifFontFamily),
+ defaultTimeSigFont(NotePixmapFactory::defaultTimeSigFontFamily);
+
+ layout->addWidget
+ (new QLabel(i18n("Text font"), frame), row, 0);
+ m_textFont = new KFontRequester(frame);
+ QFont textFont = m_cfg->readFontEntry("textfont", &defaultTextFont);
+ m_textFont->setFont(textFont);
+ layout->addMultiCellWidget(m_textFont, row, row, 1, 3);
+ ++row;
+
+ layout->addWidget
+ (new QLabel(i18n("Sans-serif font"), frame), row, 0);
+ m_sansFont = new KFontRequester(frame);
+ QFont sansFont = m_cfg->readFontEntry("sansfont", &defaultSansFont);
+ m_sansFont->setFont(sansFont);
+ layout->addMultiCellWidget(m_sansFont, row, row, 1, 3);
+ ++row;
+
+/*!!! No -- not much point in having the time sig font here: it's only
+ * used if the time sig characters are not found in the notation font,
+ * and our default notation font has all the characters we need
+
+ layout->addWidget
+ (new QLabel(i18n("Time Signature font"), frame), row, 0);
+ m_timeSigFont = new KFontRequester(frame);
+ QFont timeSigFont = m_cfg->readFontEntry("timesigfont", &defaultTimeSigFont);
+ m_timeSigFont->setFont(timeSigFont);
+ layout->addMultiCellWidget(m_timeSigFont, row, row, 1, 3);
+ ++row;
+*/
+
+// addTab(mainFrame, i18n("Font"));
+ addTab(frame, i18n("Font"));
+
+
+}
+
+void
+NotationConfigurationPage::slotViewButtonPressed()
+{
+#ifdef HAVE_XFT
+ std::string fontName = qstrtostr(m_untranslatedFont[m_font->currentItem()]);
+
+ try {
+ NoteFont *noteFont = NoteFontFactory::getFont
+ (fontName, NoteFontFactory::getDefaultSize(fontName));
+ const NoteFontMap &map(noteFont->getNoteFontMap());
+ QStringList systemFontNames(map.getSystemFontNames());
+ if (systemFontNames.count() == 0) {
+ m_viewButton->setEnabled(false); // oops
+ } else {
+ NoteFontViewer *viewer =
+ new NoteFontViewer(0, m_untranslatedFont[m_font->currentItem()],
+ systemFontNames, 24);
+ (void)viewer->exec(); // no return value
+ }
+ } catch (Exception f) {
+ KMessageBox::error(0, i18n(strtoqstr(f.getMessage())));
+ }
+#endif
+}
+
+void
+NotationConfigurationPage::slotPopulateFontCombo(bool rescan)
+{
+ QString defaultFont = m_cfg->readEntry
+ ("notefont", strtoqstr(NoteFontFactory::getDefaultFontName()));
+
+ try {
+ (void)NoteFontFactory::getFont
+ (qstrtostr(defaultFont),
+ NoteFontFactory::getDefaultSize(qstrtostr(defaultFont)));
+ } catch (Exception e) {
+ defaultFont = strtoqstr(NoteFontFactory::getDefaultFontName());
+ }
+
+ std::set
+ <std::string> fs(NoteFontFactory::getFontNames(rescan));
+ std::vector<std::string> f(fs.begin(), fs.end());
+ std::sort(f.begin(), f.end());
+
+ m_untranslatedFont.clear();
+ m_font->clear();
+
+ for (std::vector<std::string>::iterator i = f.begin(); i != f.end(); ++i) {
+ QString s(strtoqstr(*i));
+ m_untranslatedFont.append(s);
+ m_font->insertItem(i18n(s.utf8()));
+ if (s == defaultFont)
+ m_font->setCurrentItem(m_font->count() - 1);
+ }
+
+ slotFontComboChanged(m_font->currentItem());
+}
+
+void
+NotationConfigurationPage::slotFontComboChanged(int index)
+{
+ std::string fontStr = qstrtostr(m_untranslatedFont[index]);
+
+ populateSizeCombo(m_singleStaffSize, fontStr,
+ m_cfg->readUnsignedNumEntry
+ ("singlestaffnotesize",
+ NoteFontFactory::getDefaultSize(fontStr)));
+ populateSizeCombo(m_multiStaffSize, fontStr,
+ m_cfg->readUnsignedNumEntry
+ ("multistaffnotesize",
+ NoteFontFactory::getDefaultSize(fontStr)));
+
+ int printpt = m_cfg->readUnsignedNumEntry("printingnotesize", 5);
+ for (int i = 2; i < 16; ++i) {
+ m_printingSize->insertItem(QString("%1").arg(i));
+ if (i == printpt) {
+ m_printingSize->setCurrentItem(m_printingSize->count() - 1);
+ }
+ }
+
+ try {
+ NoteFont *noteFont = NoteFontFactory::getFont
+ (fontStr, NoteFontFactory::getDefaultSize(fontStr));
+ const NoteFontMap &map(noteFont->getNoteFontMap());
+ m_fontOriginLabel->setText(i18n(strtoqstr(map.getOrigin())));
+ m_fontCopyrightLabel->setText(i18n(strtoqstr(map.getCopyright())));
+ m_fontMappedByLabel->setText(i18n(strtoqstr(map.getMappedBy())));
+ if (map.isSmooth()) {
+ m_fontTypeLabel->setText(
+ i18n("%1 (smooth)").arg(i18n(strtoqstr(map.getType()))));
+ } else {
+ m_fontTypeLabel->setText(
+ i18n("%1 (jaggy)").arg(i18n(strtoqstr(map.getType()))));
+ }
+ if (m_viewButton) {
+ m_viewButton->setEnabled(map.getSystemFontNames().count() > 0);
+ }
+ } catch (Exception f) {
+ KMessageBox::error(0, i18n(strtoqstr(f.getMessage())));
+ }
+}
+
+void
+NotationConfigurationPage::populateSizeCombo(QComboBox *combo,
+ std::string font,
+ int defaultSize)
+{
+ std::vector<int> sizes = NoteFontFactory::getScreenSizes(font);
+ combo->clear();
+
+ for (std::vector<int>::iterator i = sizes.begin(); i != sizes.end(); ++i) {
+ combo->insertItem(QString("%1").arg(*i));
+ if (*i == defaultSize)
+ combo->setCurrentItem(combo->count() - 1);
+ }
+}
+
+void
+NotationConfigurationPage::apply()
+{
+ m_cfg->setGroup(NotationViewConfigGroup);
+
+ m_cfg->writeEntry("notefont", m_untranslatedFont[m_font->currentItem()]);
+ m_cfg->writeEntry("singlestaffnotesize",
+ m_singleStaffSize->currentText().toUInt());
+ m_cfg->writeEntry("multistaffnotesize",
+ m_multiStaffSize->currentText().toUInt());
+ m_cfg->writeEntry("printingnotesize",
+ m_printingSize->currentText().toUInt());
+ m_cfg->writeEntry("textfont",
+ m_textFont->font());
+ m_cfg->writeEntry("sansfont",
+ m_sansFont->font());
+/*!!!
+ m_cfg->writeEntry("timesigfont",
+ m_timeSigFont->font());
+*/
+ std::vector<int> s = NotationHLayout::getAvailableSpacings();
+ m_cfg->writeEntry("spacing", s[m_spacing->currentItem()]);
+
+ s = NotationHLayout::getAvailableProportions();
+ m_cfg->writeEntry("proportion", s[m_proportion->currentItem()]);
+
+ m_cfg->writeEntry("layoutmode", m_layoutMode->currentItem());
+ m_cfg->writeEntry("colourquantize", m_colourQuantize->isChecked());
+ m_cfg->writeEntry("showunknowns", m_showUnknowns->isChecked());
+ m_cfg->writeEntry("showinvisibles", m_showInvisibles->isChecked());
+ m_cfg->writeEntry("showranges", m_showRanges->isChecked());
+ m_cfg->writeEntry("showcollisions", m_showCollisions->isChecked());
+ m_cfg->writeEntry("shownotationheader",
+ m_showTrackHeaders->currentItem());
+ m_cfg->writeEntry("style", m_untranslatedNoteStyle[m_noteStyle->currentItem()]);
+ m_cfg->writeEntry("inserttype", m_insertType->currentItem());
+ m_cfg->writeEntry("autobeam", m_autoBeam->isChecked());
+ m_cfg->writeEntry("collapse", m_collapseRests->isChecked());
+ m_cfg->writeEntry("pastetype", m_pasteType->currentItem());
+ m_cfg->writeEntry("accidentaloctavemode", m_accOctavePolicy->currentItem());
+ m_cfg->writeEntry("accidentalbarmode", m_accBarPolicy->currentItem());
+ m_cfg->writeEntry("keysigcancelmode", m_keySigCancelMode->currentItem());
+
+ m_cfg->writeEntry("quantizemakeviable", m_splitAndTie->isChecked());
+
+// (void)m_quantizeFrame->getQuantizer(); // this also writes to the config
+}
+
+}
+#include "NotationConfigurationPage.moc"
diff --git a/src/gui/configuration/NotationConfigurationPage.h b/src/gui/configuration/NotationConfigurationPage.h
new file mode 100644
index 0000000..a3d3dc5
--- /dev/null
+++ b/src/gui/configuration/NotationConfigurationPage.h
@@ -0,0 +1,117 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_NOTATIONCONFIGURATIONPAGE_H_
+#define _RG_NOTATIONCONFIGURATIONPAGE_H_
+
+#include <string>
+#include "TabbedConfigurationPage.h"
+#include <qstring.h>
+#include <qstringlist.h>
+#include <klocale.h>
+
+
+class QWidget;
+class QPushButton;
+class QLabel;
+class QComboBox;
+class QCheckBox;
+class KFontRequester;
+class KConfig;
+
+
+namespace Rosegarden
+{
+
+class QuantizeParameters;
+
+
+/**
+ * Notation Configuration page
+ */
+class NotationConfigurationPage : public TabbedConfigurationPage
+{
+ Q_OBJECT
+
+public:
+ NotationConfigurationPage(KConfig *cfg,
+ QWidget *parent = 0, const char *name=0);
+
+ virtual void apply();
+
+ static QString iconLabel() { return i18n("Notation"); }
+ static QString title() { return i18n("Notation"); }
+ static QString iconName() { return "configure-notation"; }
+
+protected slots:
+ void slotFontComboChanged(int);
+ void slotPopulateFontCombo(bool rescan);
+ void slotViewButtonPressed();
+
+protected:
+
+ //--------------- Data members ---------------------------------
+
+ QComboBox *m_font;
+ QComboBox *m_singleStaffSize;
+ QComboBox *m_multiStaffSize;
+ QComboBox *m_printingSize;
+ KFontRequester* m_textFont;
+ KFontRequester* m_sansFont;
+ KFontRequester* m_timeSigFont;
+ QPushButton *m_viewButton;
+ QLabel *m_fontOriginLabel;
+ QLabel *m_fontCopyrightLabel;
+ QLabel *m_fontMappedByLabel;
+ QLabel *m_fontTypeLabel;
+ QComboBox *m_layoutMode;
+ QComboBox *m_spacing;
+ QComboBox *m_proportion;
+ QCheckBox *m_colourQuantize;
+ QCheckBox *m_showUnknowns;
+ QCheckBox *m_showInvisibles;
+ QCheckBox *m_showRanges;
+ QCheckBox *m_showCollisions;
+ QComboBox *m_showTrackHeaders;
+ QComboBox *m_noteStyle;
+ QComboBox *m_insertType;
+ QCheckBox *m_autoBeam;
+ QCheckBox *m_collapseRests;
+ QComboBox *m_pasteType;
+ QComboBox *m_accOctavePolicy;
+ QComboBox *m_accBarPolicy;
+ QComboBox *m_keySigCancelMode;
+ QCheckBox *m_splitAndTie;
+ QuantizeParameters *m_quantizeFrame;
+ QStringList m_untranslatedFont;
+ QStringList m_untranslatedNoteStyle;
+
+ void populateSizeCombo(QComboBox *combo, std::string font, int dfltSize);
+};
+
+
+}
+
+#endif
diff --git a/src/gui/configuration/TabbedConfigurationPage.cpp b/src/gui/configuration/TabbedConfigurationPage.cpp
new file mode 100644
index 0000000..cc808a9
--- /dev/null
+++ b/src/gui/configuration/TabbedConfigurationPage.cpp
@@ -0,0 +1,79 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "TabbedConfigurationPage.h"
+
+#include "ConfigurationPage.h"
+#include "document/RosegardenGUIDoc.h"
+#include <kconfig.h>
+#include <kdialog.h>
+#include <qstring.h>
+#include <qtabwidget.h>
+#include <qwidget.h>
+#include <qlayout.h>
+
+
+namespace Rosegarden
+{
+
+TabbedConfigurationPage::TabbedConfigurationPage(RosegardenGUIDoc *doc,
+ QWidget *parent,
+ const char *name)
+ : ConfigurationPage(doc, parent, name)
+{
+ init();
+}
+
+TabbedConfigurationPage::TabbedConfigurationPage(KConfig *cfg,
+ QWidget *parent,
+ const char *name)
+ : ConfigurationPage(cfg, parent, name)
+{
+ init();
+}
+
+TabbedConfigurationPage::TabbedConfigurationPage(RosegardenGUIDoc *doc,
+ KConfig *cfg,
+ QWidget *parent,
+ const char *name)
+ : ConfigurationPage(doc, cfg, parent, name)
+{
+ init();
+}
+
+void TabbedConfigurationPage::init()
+{
+ QVBoxLayout *vlay = new QVBoxLayout(this, 0, KDialog::spacingHint());
+ m_tabWidget = new QTabWidget(this);
+ vlay->addWidget(m_tabWidget);
+}
+
+void TabbedConfigurationPage::addTab(QWidget *tab, const QString &title)
+{
+ m_tabWidget->addTab(tab, title);
+}
+
+}
+#include "TabbedConfigurationPage.moc"
diff --git a/src/gui/configuration/TabbedConfigurationPage.h b/src/gui/configuration/TabbedConfigurationPage.h
new file mode 100644
index 0000000..8c370d5
--- /dev/null
+++ b/src/gui/configuration/TabbedConfigurationPage.h
@@ -0,0 +1,78 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_TABBEDCONFIGURATIONPAGE_H_
+#define _RG_TABBEDCONFIGURATIONPAGE_H_
+
+#include "ConfigurationPage.h"
+#include <qstring.h>
+
+
+class QWidget;
+class QTabWidget;
+class KConfig;
+
+
+namespace Rosegarden
+{
+
+class RosegardenGUIDoc;
+
+
+/**
+ * This class borrowed from KMail
+ * (c) 2000 The KMail Development Team
+ */
+class TabbedConfigurationPage : public ConfigurationPage
+{
+ Q_OBJECT
+
+public:
+ TabbedConfigurationPage(RosegardenGUIDoc *doc,
+ QWidget *parent=0, const char *name=0);
+
+ TabbedConfigurationPage(KConfig *cfg,
+ QWidget *parent=0, const char *name=0);
+
+ TabbedConfigurationPage(RosegardenGUIDoc *doc,
+ KConfig *cfg,
+ QWidget *parent=0, const char *name=0);
+
+ static QString iconName() { return "misc"; }
+
+protected:
+ void init();
+ void addTab(QWidget *tab, const QString &title);
+
+ //--------------- Data members ---------------------------------
+
+ QTabWidget *m_tabWidget;
+
+};
+
+
+}
+
+#endif
diff --git a/src/gui/dialogs/AddTracksDialog.cpp b/src/gui/dialogs/AddTracksDialog.cpp
new file mode 100644
index 0000000..67e5412
--- /dev/null
+++ b/src/gui/dialogs/AddTracksDialog.cpp
@@ -0,0 +1,110 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "AddTracksDialog.h"
+
+#include <klocale.h>
+#include <kdialogbase.h>
+#include <qhbox.h>
+#include <qlabel.h>
+#include <qspinbox.h>
+#include <kcombobox.h>
+#include <qvbox.h>
+#include <qwidget.h>
+#include <kapp.h>
+#include <kconfig.h>
+
+#include "document/ConfigGroups.h"
+
+
+namespace Rosegarden
+{
+
+AddTracksDialog::AddTracksDialog(QWidget *parent, int currentTrack) :
+ KDialogBase(parent, 0, true, i18n("Add Tracks"),
+ Ok | Cancel),
+ m_currentTrack(currentTrack)
+{
+ QVBox *vBox = makeVBoxMainWidget();
+
+ QHBox *countBox = new QHBox(vBox);
+ countBox->setSpacing(4);
+ new QLabel(i18n("How many tracks do you want to add?"), countBox);
+ m_count = new QSpinBox(countBox);
+ m_count->setMinValue(1);
+ m_count->setMaxValue(32);
+ m_count->setValue(1);
+
+ QHBox *posBox = new QHBox(vBox);
+ posBox->setSpacing(4);
+ new QLabel(i18n("Add tracks"), posBox);
+ m_position = new KComboBox(posBox);
+ m_position->insertItem(i18n("At the top"));
+ m_position->insertItem(i18n("Above the current selected track"));
+ m_position->insertItem(i18n("Below the current selected track"));
+ m_position->insertItem(i18n("At the bottom"));
+
+ KConfig *config = kapp->config();
+ config->setGroup(GeneralOptionsConfigGroup);
+ m_position->setCurrentItem(config->readUnsignedNumEntry("lastaddtracksposition", 2));
+}
+
+int
+AddTracksDialog::getTracks()
+{
+ return m_count->value();
+}
+
+int
+AddTracksDialog::getInsertPosition()
+{
+ int opt = m_position->currentItem();
+
+ KConfig *config = kapp->config();
+ config->setGroup(GeneralOptionsConfigGroup);
+ config->writeEntry("lastaddtracksposition", opt);
+
+ int pos = 0;
+
+ switch (opt) {
+ case 0: // at top
+ pos = 0;
+ break;
+ case 1: // above current track
+ pos = m_currentTrack;
+ break;
+ case 2: // below current track
+ pos = m_currentTrack + 1;
+ break;
+ case 3: // at bottom
+ pos = -1;
+ break;
+ }
+
+ return pos;
+}
+
+}
+#include "AddTracksDialog.moc"
diff --git a/src/gui/dialogs/AddTracksDialog.h b/src/gui/dialogs/AddTracksDialog.h
new file mode 100644
index 0000000..9930e46
--- /dev/null
+++ b/src/gui/dialogs/AddTracksDialog.h
@@ -0,0 +1,57 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_ADDTRACKSDIALOG_H_
+#define _RG_ADDTRACKSDIALOG_H_
+
+#include <kdialogbase.h>
+
+class QWidget;
+class QSpinBox;
+class QComboBox;
+
+namespace Rosegarden
+{
+
+class AddTracksDialog : public KDialogBase
+{
+ Q_OBJECT
+
+public:
+ AddTracksDialog(QWidget *parent, int currentTrack = -1);
+
+ int getTracks();
+ int getInsertPosition();
+
+protected:
+ int m_currentTrack;
+ QSpinBox *m_count;
+ QComboBox *m_position;
+};
+
+
+
+}
+
+#endif
diff --git a/src/gui/dialogs/AudioManagerDialog.cpp b/src/gui/dialogs/AudioManagerDialog.cpp
new file mode 100644
index 0000000..5982632
--- /dev/null
+++ b/src/gui/dialogs/AudioManagerDialog.cpp
@@ -0,0 +1,1257 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "AudioManagerDialog.h"
+#include <kapplication.h>
+
+#include "base/Event.h"
+#include "misc/Debug.h"
+#include "misc/Strings.h"
+#include "AudioPlayingDialog.h"
+#include "base/Composition.h"
+#include "base/Exception.h"
+#include "base/Instrument.h"
+#include "base/MidiProgram.h"
+#include "base/NotationTypes.h"
+#include "base/RealTime.h"
+#include "base/Segment.h"
+#include "base/Selection.h"
+#include "base/Studio.h"
+#include "base/Track.h"
+#include "document/MultiViewCommandHistory.h"
+#include "document/RosegardenGUIDoc.h"
+#include "document/ConfigGroups.h"
+#include "gui/application/RosegardenGUIView.h"
+#include "gui/application/RosegardenApplication.h"
+#include "gui/widgets/AudioListItem.h"
+#include "gui/widgets/AudioListView.h"
+#include "gui/widgets/CurrentProgressDialog.h"
+#include "gui/widgets/ProgressDialog.h"
+#include "sound/AudioFile.h"
+#include "sound/AudioFileManager.h"
+#include "sound/WAVAudioFile.h"
+#include "UnusedAudioSelectionDialog.h"
+#include <klocale.h>
+#include <kstddirs.h>
+#include <kaction.h>
+#include <kcommand.h>
+#include <kfiledialog.h>
+#include <kglobal.h>
+#include <klineeditdlg.h>
+#include <klistview.h>
+#include <kmainwindow.h>
+#include <kmessagebox.h>
+#include <kstdaction.h>
+#include <kurl.h>
+#include <kxmlguiclient.h>
+#include <kio/netaccess.h>
+#include <qaccel.h>
+#include <qcstring.h>
+#include <qdatastream.h>
+#include <qdialog.h>
+#include <qdragobject.h>
+#include <qfile.h>
+#include <qfileinfo.h>
+#include <qiconset.h>
+#include <qlabel.h>
+#include <qlistview.h>
+#include <qpainter.h>
+#include <qpixmap.h>
+#include <qstring.h>
+#include <qstrlist.h>
+#include <qtimer.h>
+#include <qvbox.h>
+#include <qwidget.h>
+
+
+namespace Rosegarden
+{
+
+const int AudioManagerDialog::m_maxPreviewWidth = 100;
+const int AudioManagerDialog::m_previewHeight = 30;
+const char* const AudioManagerDialog::m_listViewLayoutName = "AudioManagerDialog Layout";
+
+AudioManagerDialog::AudioManagerDialog(QWidget *parent,
+ RosegardenGUIDoc *doc):
+ KMainWindow(parent, "audioManagerDialog"),
+ m_doc(doc),
+ m_playingAudioFile(0),
+ m_audioPlayingDialog(0),
+ m_playTimer(new QTimer(this)),
+ m_audiblePreview(true)
+{
+ setCaption(i18n("Audio File Manager"));
+ setWFlags(WDestructiveClose);
+
+ QVBox *box = new QVBox(this);
+ setCentralWidget(box);
+ box->setMargin(10);
+ box->setSpacing(5);
+
+ m_sampleRate = 0;
+
+ QCString replyType;
+ QByteArray replyData;
+ if (rgapp->sequencerCall("getSampleRate()", replyType, replyData)) {
+ QDataStream streamIn(replyData, IO_ReadOnly);
+ unsigned int result;
+ streamIn >> result;
+ m_sampleRate = result;
+ }
+
+ m_fileList = new AudioListView(box);
+
+ m_wrongSampleRates = new QLabel(i18n("* Some audio files are encoded at a sample rate different from that of the JACK audio server.\nRosegarden will play them at the correct speed, but they will sound terrible.\nPlease consider resampling such files externally, or adjusting the sample rate of the JACK server."), box);
+ m_wrongSampleRates->hide();
+
+ QString pixmapDir = KGlobal::dirs()->findResource("appdata", "pixmaps/");
+ QIconSet icon(QPixmap(pixmapDir + "/toolbar/transport-play.xpm"));
+
+ new KAction(i18n("&Add Audio File..."), "fileopen", 0, this,
+ SLOT(slotAdd()), actionCollection(), "add_audio");
+
+ new KAction(i18n("&Unload Audio File"), "editdelete", 0, this,
+ SLOT(slotRemove()),
+ actionCollection(), "remove_audio");
+
+ icon = QIconSet(QPixmap(pixmapDir + "/toolbar/transport-play.xpm"));
+ new KAction(i18n("&Play Preview"), icon, 0, this,
+ SLOT(slotPlayPreview()),
+ actionCollection(), "preview_audio");
+
+ /*!!! Not actually implemented -- this never worked right!
+ new KAction(i18n("Re&label"), 0, 0, this,
+ SLOT(slotRename()),
+ actionCollection(), "rename_audio");
+ */
+
+ icon = QIconSet(QPixmap(pixmapDir + "/toolbar/insert_audio_into_track.xpm"));
+ new KAction(i18n("&Insert into Selected Audio Track"),
+ icon, 0, this, SLOT(slotInsert()),
+ actionCollection(), "insert_audio");
+
+ new KAction(i18n("Unload &all Audio Files"), 0, 0, this,
+ SLOT(slotRemoveAll()),
+ actionCollection(), "remove_all_audio");
+
+ new KAction(i18n("Unload all &Unused Audio Files"), 0, 0, this,
+ SLOT(slotRemoveAllUnused()),
+ actionCollection(), "remove_all_unused_audio");
+
+ new KAction(i18n("&Delete Unused Audio Files..."), 0, 0, this,
+ SLOT(slotDeleteUnused()),
+ actionCollection(), "delete_unused_audio");
+
+ new KAction(i18n("&Export Audio File..."), "fileexport", 0, this,
+ SLOT(slotExportAudio()),
+ actionCollection(), "export_audio");
+/*
+ new KAction(i18n("Distribute Audio on &MIDI"),
+ 0, 0, this,
+ SLOT(slotDistributeOnMidiSegment()),
+ actionCollection(),
+ "distribute_audio");
+*/
+ // Set the column names
+ //
+ m_fileList->addColumn(i18n("Name")); // 0
+ m_fileList->addColumn(i18n("Duration")); // 1
+ m_fileList->addColumn(i18n("Envelope")); // 2
+ m_fileList->addColumn(i18n("Sample rate")); // 3
+ m_fileList->addColumn(i18n("Channels")); // 4
+ m_fileList->addColumn(i18n("Resolution")); // 5
+ m_fileList->addColumn(i18n("File")); // 6
+
+ m_fileList->setColumnAlignment(1, Qt::AlignHCenter);
+ m_fileList->setColumnAlignment(2, Qt::AlignHCenter);
+ m_fileList->setColumnAlignment(3, Qt::AlignHCenter);
+ m_fileList->setColumnAlignment(4, Qt::AlignHCenter);
+ m_fileList->setColumnAlignment(5, Qt::AlignHCenter);
+
+ m_fileList->restoreLayout(kapp->config(), m_listViewLayoutName);
+
+ // a minimum width for the list box
+ //m_fileList->setMinimumWidth(300);
+
+ // show focus across all columns
+ m_fileList->setAllColumnsShowFocus(true);
+
+ // show tooltips when columns are partially hidden
+ m_fileList->setShowToolTips(true);
+
+ // connect selection mechanism
+ connect(m_fileList, SIGNAL(selectionChanged(QListViewItem*)),
+ SLOT(slotSelectionChanged(QListViewItem*)));
+
+ connect(m_fileList, SIGNAL(dropped(QDropEvent*, QListViewItem*)),
+ SLOT(slotDropped(QDropEvent*, QListViewItem*)));
+
+ // setup local accelerators
+ //
+ m_accelerators = new QAccel(this);
+
+ // delete
+ //
+ m_accelerators->connectItem(m_accelerators->insertItem(Key_Delete),
+ this,
+ SLOT(slotRemove()));
+
+ slotPopulateFileList();
+
+ // Connect command history for updates
+ //
+ connect(getCommandHistory(), SIGNAL(commandExecuted(KCommand *)),
+ this, SLOT(slotCommandExecuted(KCommand *)));
+
+ //setInitialSize(configDialogSize(AudioManagerDialogConfigGroup));
+
+ connect(m_playTimer, SIGNAL(timeout()),
+ this, SLOT(slotCancelPlayingAudio()));
+
+ KStdAction::close(this,
+ SLOT(slotClose()),
+ actionCollection());
+
+ createGUI("audiomanager.rc");
+
+ updateActionState(false);
+}
+
+AudioManagerDialog::~AudioManagerDialog()
+{
+ RG_DEBUG << "\n*** AudioManagerDialog::~AudioManagerDialog\n" << endl;
+ m_fileList->saveLayout(kapp->config(), m_listViewLayoutName);
+ //saveDialogSize(AudioManagerDialogConfigGroup);
+}
+
+void
+AudioManagerDialog::slotPopulateFileList()
+{
+ // create pixmap of given size
+ QPixmap *audioPixmap = new QPixmap(m_maxPreviewWidth, m_previewHeight);
+
+ // Store last selected item if we have one
+ //
+ AudioListItem *selectedItem =
+ dynamic_cast<AudioListItem*>(m_fileList->selectedItem());
+ AudioFileId lastId = 0;
+ Segment *lastSegment = 0;
+ bool findSelection = false;
+ bool foundSelection = false;
+
+ if (selectedItem) {
+ lastId = selectedItem->getId();
+ lastSegment = selectedItem->getSegment();
+ findSelection = true;
+ }
+
+ // We don't want the selection changes to be propagated
+ // to the main view
+ //
+ m_fileList->blockSignals(true);
+
+ // clear file list and disable associated action buttons
+ m_fileList->clear();
+
+ if (m_doc->getAudioFileManager().begin() ==
+ m_doc->getAudioFileManager().end()) {
+ // Turn off selection and report empty list
+ //
+ new AudioListItem(m_fileList, i18n("<no audio files>"), 0);
+ m_fileList->setSelectionMode(QListView::NoSelection);
+ m_fileList->setRootIsDecorated(false);
+
+ m_fileList->blockSignals(false);
+ updateActionState(false);
+ return ;
+ }
+
+ // show tree hierarchy
+ m_fileList->setRootIsDecorated(true);
+
+ // enable selection
+ m_fileList->setSelectionMode(QListView::Single);
+
+ // for the sample file length
+ QString msecs, sRate;
+ RealTime length;
+
+ // Create a vector of audio Segments only
+ //
+ std::vector<Segment*> segments;
+ std::vector<Segment*>::const_iterator iit;
+
+ for (Composition::iterator it = m_doc->getComposition().begin();
+ it != m_doc->getComposition().end(); ++it) {
+ if ((*it)->getType() == Segment::Audio)
+ segments.push_back(*it);
+ }
+
+ // duration
+ RealTime segmentDuration;
+ bool wrongSampleRates = false;
+
+ for (std::vector<AudioFile*>::const_iterator
+ it = m_doc->getAudioFileManager().begin();
+ it != m_doc->getAudioFileManager().end();
+ ++it) {
+ try {
+ m_doc->getAudioFileManager().
+ drawPreview((*it)->getId(),
+ RealTime::zeroTime,
+ (*it)->getLength(),
+ audioPixmap);
+ } catch (Exception e) {
+ audioPixmap->fill(); // white
+ QPainter p(audioPixmap);
+ p.setPen(Qt::black);
+ p.drawText(10, m_previewHeight / 2, QString("<no preview>"));
+ }
+
+ //!!! Why isn't the label the label the user assigned to the file?
+ // Why do we allow the user to assign a label at all, then?
+
+ QString label = QString((*it)->getShortFilename().c_str());
+
+ // Set the label, duration, envelope pixmap and filename
+ //
+ AudioListItem *item = new AudioListItem(m_fileList, label,
+ (*it)->getId());
+ // Duration
+ //
+ length = (*it)->getLength();
+ msecs.sprintf("%03d", length.nsec / 1000000);
+ item->setText(1, QString("%1.%2s").arg(length.sec).arg(msecs));
+
+ // set start time and duration
+ item->setStartTime(RealTime::zeroTime);
+ item->setDuration(length);
+
+ // Envelope pixmap
+ //
+ item->setPixmap(2, *audioPixmap);
+
+ // File location
+ //
+ item->setText(6, QString(
+ m_doc->getAudioFileManager().
+ substituteHomeForTilde((*it)->getFilename()).c_str()));
+
+ // Resolution
+ //
+ item->setText(5, QString("%1 bits").arg((*it)->getBitsPerSample()));
+
+ // Channels
+ //
+ item->setText(4, QString("%1").arg((*it)->getChannels()));
+
+ // Sample rate
+ //
+ if (m_sampleRate != 0 && (*it)->getSampleRate() != m_sampleRate) {
+ sRate.sprintf("%.1f KHz *", float((*it)->getSampleRate()) / 1000.0);
+ wrongSampleRates = true;
+ } else {
+ sRate.sprintf("%.1f KHz", float((*it)->getSampleRate()) / 1000.0);
+ }
+ item->setText(3, sRate);
+
+ // Test audio file element for selection criteria
+ //
+ if (findSelection && lastSegment == 0 && lastId == (*it)->getId()) {
+ m_fileList->setSelected(item, true);
+ findSelection = false;
+ }
+
+ // Add children
+ //
+ for (iit = segments.begin(); iit != segments.end(); iit++) {
+ if ((*iit)->getAudioFileId() == (*it)->getId()) {
+ AudioListItem *childItem =
+ new AudioListItem(item,
+ QString((*iit)->getLabel().c_str()),
+ (*it)->getId());
+ segmentDuration = (*iit)->getAudioEndTime() -
+ (*iit)->getAudioStartTime();
+
+ // store the start time
+ //
+ childItem->setStartTime((*iit)->getAudioStartTime());
+ childItem->setDuration(segmentDuration);
+
+ // Write segment duration
+ //
+ msecs.sprintf("%03d", segmentDuration.nsec / 1000000);
+ childItem->setText(1, QString("%1.%2s")
+ .arg(segmentDuration.sec)
+ .arg(msecs));
+
+ try {
+ m_doc->getAudioFileManager().
+ drawHighlightedPreview((*it)->getId(),
+ RealTime::zeroTime,
+ (*it)->getLength(),
+ (*iit)->getAudioStartTime(),
+ (*iit)->getAudioEndTime(),
+ audioPixmap);
+ } catch (Exception e) {
+ // should already be set to "no file"
+ }
+
+ // set pixmap
+ //
+ childItem->setPixmap(2, *audioPixmap);
+
+ // set segment
+ //
+ childItem->setSegment(*iit);
+
+ if (findSelection && lastSegment == (*iit)) {
+ m_fileList->setSelected(childItem, true);
+ findSelection = false;
+ foundSelection = true;
+ }
+
+ // Add children
+ }
+ }
+ }
+
+ updateActionState(foundSelection);
+
+ if (wrongSampleRates) {
+ m_wrongSampleRates->show();
+ } else {
+ m_wrongSampleRates->hide();
+ }
+
+ m_fileList->blockSignals(false);
+}
+
+AudioFile*
+AudioManagerDialog::getCurrentSelection()
+{
+ // try and get the selected item
+ AudioListItem *item =
+ dynamic_cast<AudioListItem*>(m_fileList->selectedItem());
+ if (item == 0)
+ return 0;
+
+ std::vector<AudioFile*>::const_iterator it;
+
+ for (it = m_doc->getAudioFileManager().begin();
+ it != m_doc->getAudioFileManager().end();
+ ++it) {
+ // If we match then return the valid AudioFile
+ //
+ if (item->getId() == (*it)->getId())
+ return (*it);
+ }
+
+ return 0;
+}
+
+void
+AudioManagerDialog::slotExportAudio()
+{
+ WAVAudioFile *sourceFile
+ = dynamic_cast<WAVAudioFile*>(getCurrentSelection());
+
+ AudioListItem *item =
+ dynamic_cast<AudioListItem*>(m_fileList->selectedItem());
+
+ Segment *segment = item->getSegment();
+
+ QString saveFile =
+ KFileDialog::getSaveFileName(":WAVS",
+ i18n("*.wav|WAV files (*.wav)"),
+ this, i18n("Choose a name to save this file as"));
+
+ if (sourceFile == 0 || item == 0 || saveFile.isEmpty())
+ return ;
+
+ // Check for a dot extension and append ".wav" if not found
+ //
+ if (saveFile.contains(".") == 0)
+ saveFile += ".wav";
+
+ ProgressDialog progressDlg(i18n("Exporting audio file..."),
+ 100,
+ this);
+
+ progressDlg.progressBar()->setProgress(0);
+
+ RealTime clipStartTime = RealTime::zeroTime;
+ RealTime clipDuration = sourceFile->getLength();
+
+ if (segment) {
+ clipStartTime = segment->getAudioStartTime();
+ clipDuration = segment->getAudioEndTime() - clipStartTime;
+ }
+
+ WAVAudioFile *destFile
+ = new WAVAudioFile(qstrtostr(saveFile),
+ sourceFile->getChannels(),
+ sourceFile->getSampleRate(),
+ sourceFile->getBytesPerSecond(),
+ sourceFile->getBytesPerFrame(),
+ sourceFile->getBitsPerSample());
+
+ if (sourceFile->open() == false) {
+ delete destFile;
+ return ;
+ }
+
+ destFile->write();
+
+ sourceFile->scanTo(clipStartTime);
+ destFile->appendSamples(sourceFile->getSampleFrameSlice(clipDuration));
+
+ destFile->close();
+ sourceFile->close();
+ delete destFile;
+
+ progressDlg.progressBar()->setProgress(100);
+}
+
+void
+AudioManagerDialog::slotRemove()
+{
+ AudioFile *audioFile = getCurrentSelection();
+ AudioListItem *item =
+ dynamic_cast<AudioListItem*>(m_fileList->selectedItem());
+
+ if (audioFile == 0 || item == 0)
+ return ;
+
+ // If we're on a Segment then delete it at the Composition
+ // and refresh the list.
+ //
+ if (item->getSegment()) {
+ // Get the next item to highlight
+ //
+ QListViewItem *newItem = item->itemBelow();
+
+ // Or try above
+ //
+ if (newItem == 0)
+ newItem = item->itemAbove();
+
+ // Or the parent
+ //
+ if (newItem == 0)
+ newItem = item->parent();
+
+ // Get the id and segment of the next item so that we can
+ // match against it
+ //
+ AudioFileId id = 0;
+ Segment *segment = 0;
+ AudioListItem *aItem = dynamic_cast<AudioListItem*>(newItem);
+
+ if (aItem) {
+ segment = aItem->getSegment();
+ id = aItem->getId();
+ }
+
+ // Jump to new selection
+ //
+ if (newItem)
+ setSelected(id, segment, true); // propagate
+
+ // Do it - will force update
+ //
+ SegmentSelection selection;
+ selection.insert(item->getSegment());
+ emit deleteSegments(selection);
+
+ return ;
+ }
+
+ // remove segments along with audio file
+ //
+ AudioFileId id = audioFile->getId();
+ SegmentSelection selection;
+ Composition &comp = m_doc->getComposition();
+
+ bool haveSegments = false;
+ for (Composition::iterator it = comp.begin(); it != comp.end(); ++it) {
+ if ((*it)->getType() == Segment::Audio &&
+ (*it)->getAudioFileId() == id) {
+ haveSegments = true;
+ break;
+ }
+ }
+
+ if (haveSegments) {
+
+ QString question = i18n("This will unload audio file \"%1\" and remove all associated segments. Are you sure?")
+ .arg(QString(audioFile->getFilename().c_str()));
+
+ // Ask the question
+ int reply = KMessageBox::warningContinueCancel(this, question);
+
+ if (reply != KMessageBox::Continue)
+ return ;
+ }
+
+ for (Composition::iterator it = comp.begin(); it != comp.end(); ++it) {
+ if ((*it)->getType() == Segment::Audio &&
+ (*it)->getAudioFileId() == id)
+ selection.insert(*it);
+ }
+ emit deleteSegments(selection);
+
+ m_doc->notifyAudioFileRemoval(id);
+
+ m_doc->getAudioFileManager().removeFile(id);
+
+ // tell the sequencer
+ emit deleteAudioFile(id);
+
+ // repopulate
+ slotPopulateFileList();
+}
+
+void
+AudioManagerDialog::slotPlayPreview()
+{
+ AudioFile *audioFile = getCurrentSelection();
+ AudioListItem *item =
+ dynamic_cast<AudioListItem*>(m_fileList->selectedItem());
+
+ if (item == 0 || audioFile == 0)
+ return ;
+
+ // store the audio file we're playing
+ m_playingAudioFile = audioFile->getId();
+
+ // tell the sequencer
+ emit playAudioFile(audioFile->getId(),
+ item->getStartTime(),
+ item->getDuration());
+
+ // now open up the playing dialog
+ //
+ m_audioPlayingDialog =
+ new AudioPlayingDialog(this, QString(audioFile->getFilename().c_str()));
+
+ // Setup timer to pop down dialog after file has completed
+ //
+ int msecs = item->getDuration().sec * 1000 +
+ item->getDuration().nsec / 1000000;
+ m_playTimer->start(msecs, true); // single shot
+
+ // just execute
+ //
+ if (m_audioPlayingDialog->exec() == QDialog::Rejected)
+ emit cancelPlayingAudioFile(m_playingAudioFile);
+
+ delete m_audioPlayingDialog;
+ m_audioPlayingDialog = 0;
+
+ m_playTimer->stop();
+
+}
+
+void
+AudioManagerDialog::slotCancelPlayingAudio()
+{
+ //std::cout << "AudioManagerDialog::slotCancelPlayingAudio" << std::endl;
+ if (m_audioPlayingDialog) {
+ m_playTimer->stop();
+ delete m_audioPlayingDialog;
+ m_audioPlayingDialog = 0;
+ }
+}
+
+void
+AudioManagerDialog::slotAdd()
+{
+ QString extensionList = i18n("*.wav|WAV files (*.wav)\n*.*|All files");
+
+ if (RosegardenGUIApp::self()->haveAudioImporter()) {
+ //!!! This list really needs to come from the importer helper program
+ // (which has an option to supply it -- we just haven't recorded it)
+ extensionList = i18n("*.wav *.flac *.ogg *.mp3|Audio files (*.wav *.flac *.ogg *.mp3)\n*.wav|WAV files (*.wav)\n*.flac|FLAC files (*.flac)\n*.ogg|Ogg files (*.ogg)\n*.mp3|MP3 files (*.mp3)\n*.*|All files");
+ }
+
+ KURL::List kurlList =
+ KFileDialog::getOpenURLs(":WAVS",
+ extensionList,
+ // i18n("*.wav|WAV files (*.wav)\n*.mp3|MP3 files (*.mp3)"),
+ this, i18n("Select one or more audio files"));
+
+ KURL::List::iterator it;
+
+ for (it = kurlList.begin(); it != kurlList.end(); ++it)
+ addFile(*it);
+}
+
+void
+AudioManagerDialog::updateActionState(bool haveSelection)
+{
+ if (m_doc->getAudioFileManager().begin() ==
+ m_doc->getAudioFileManager().end()) {
+ stateChanged("have_audio_files", KXMLGUIClient::StateReverse);
+ } else {
+ stateChanged("have_audio_files", KXMLGUIClient::StateNoReverse);
+ }
+
+ if (haveSelection) {
+
+ stateChanged("have_audio_selected", KXMLGUIClient::StateNoReverse);
+
+ if (m_audiblePreview) {
+ stateChanged("have_audible_preview", KXMLGUIClient::StateNoReverse);
+ } else {
+ stateChanged("have_audible_preview", KXMLGUIClient::StateReverse);
+ }
+
+ if (isSelectedTrackAudio()) {
+ stateChanged("have_audio_insertable", KXMLGUIClient::StateNoReverse);
+ } else {
+ stateChanged("have_audio_insertable", KXMLGUIClient::StateReverse);
+ }
+
+ } else {
+ stateChanged("have_audio_selected", KXMLGUIClient::StateReverse);
+ stateChanged("have_audio_insertable", KXMLGUIClient::StateReverse);
+ stateChanged("have_audible_preview", KXMLGUIClient::StateReverse);
+ }
+}
+
+void
+AudioManagerDialog::slotInsert()
+{
+ AudioFile *audioFile = getCurrentSelection();
+ if (audioFile == 0)
+ return ;
+
+ RG_DEBUG << "AudioManagerDialog::slotInsert\n";
+
+ emit insertAudioSegment(audioFile->getId(),
+ RealTime::zeroTime,
+ audioFile->getLength());
+}
+
+void
+AudioManagerDialog::slotRemoveAll()
+{
+ QString question =
+ i18n("This will unload all audio files and remove their associated segments.\nThis action cannot be undone, and associations with these files will be lost.\nFiles will not be removed from your disk.\nAre you sure?");
+
+ int reply = KMessageBox::warningContinueCancel(this, question);
+
+ if (reply != KMessageBox::Continue)
+ return ;
+
+ SegmentSelection selection;
+ Composition &comp = m_doc->getComposition();
+
+ for (Composition::iterator it = comp.begin(); it != comp.end(); ++it) {
+ if ((*it)->getType() == Segment::Audio)
+ selection.insert(*it);
+ }
+ // delete segments
+ emit deleteSegments(selection);
+
+ for (std::vector<AudioFile*>::const_iterator
+ aIt = m_doc->getAudioFileManager().begin();
+ aIt != m_doc->getAudioFileManager().end(); ++aIt) {
+ m_doc->notifyAudioFileRemoval((*aIt)->getId());
+ }
+
+ m_doc->getAudioFileManager().clear();
+
+ // and now the audio files
+ emit deleteAllAudioFiles();
+
+ // clear the file list
+ m_fileList->clear();
+ slotPopulateFileList();
+}
+
+void
+AudioManagerDialog::slotRemoveAllUnused()
+{
+ QString question =
+ i18n("This will unload all audio files that are not associated with any segments in this composition.\nThis action cannot be undone, and associations with these files will be lost.\nFiles will not be removed from your disk.\nAre you sure?");
+
+ int reply = KMessageBox::warningContinueCancel(this, question);
+
+ if (reply != KMessageBox::Continue)
+ return ;
+
+ std::set
+ <AudioFileId> audioFiles;
+ Composition &comp = m_doc->getComposition();
+
+ for (Composition::iterator it = comp.begin(); it != comp.end(); ++it) {
+ if ((*it)->getType() == Segment::Audio)
+ audioFiles.insert((*it)->getAudioFileId());
+ }
+
+ std::vector<AudioFileId> toDelete;
+ for (std::vector<AudioFile*>::const_iterator
+ aIt = m_doc->getAudioFileManager().begin();
+ aIt != m_doc->getAudioFileManager().end(); ++aIt) {
+ if (audioFiles.find((*aIt)->getId()) == audioFiles.end())
+ toDelete.push_back((*aIt)->getId());
+ }
+
+ // Delete the audio files from the AFM
+ //
+ for (std::vector<AudioFileId>::iterator dIt = toDelete.begin();
+ dIt != toDelete.end(); ++dIt) {
+
+ m_doc->notifyAudioFileRemoval(*dIt);
+ m_doc->getAudioFileManager().removeFile(*dIt);
+ emit deleteAudioFile(*dIt);
+ }
+
+ // clear the file list
+ m_fileList->clear();
+ slotPopulateFileList();
+}
+
+void
+AudioManagerDialog::slotDeleteUnused()
+{
+ std::set
+ <AudioFileId> audioFiles;
+ Composition &comp = m_doc->getComposition();
+
+ for (Composition::iterator it = comp.begin(); it != comp.end(); ++it) {
+ if ((*it)->getType() == Segment::Audio)
+ audioFiles.insert((*it)->getAudioFileId());
+ }
+
+ std::vector<QString> toDelete;
+ std::map<QString, AudioFileId> nameMap;
+
+ for (std::vector<AudioFile*>::const_iterator
+ aIt = m_doc->getAudioFileManager().begin();
+ aIt != m_doc->getAudioFileManager().end(); ++aIt) {
+ if (audioFiles.find((*aIt)->getId()) == audioFiles.end()) {
+ toDelete.push_back(strtoqstr((*aIt)->getFilename()));
+ nameMap[strtoqstr((*aIt)->getFilename())] = (*aIt)->getId();
+ }
+ }
+
+ UnusedAudioSelectionDialog *dialog = new UnusedAudioSelectionDialog
+ (this,
+ i18n("The following audio files are not used in the current composition.\n\nPlease select the ones you wish to delete permanently from the hard disk.\n"),
+ toDelete);
+
+ if (dialog->exec() == QDialog::Accepted) {
+
+ std::vector<QString> names = dialog->getSelectedAudioFileNames();
+
+ if (names.size() > 0) {
+
+ QString question =
+ i18n("<qt>About to delete 1 audio file permanently from the hard disk.<br>This action cannot be undone, and there will be no way to recover this file.<br>Are you sure?</qt>\n", "<qt>About to delete %n audio files permanently from the hard disk.<br>This action cannot be undone, and there will be no way to recover these files.<br>Are you sure?</qt>", names.size());
+
+ int reply = KMessageBox::warningContinueCancel(this, question);
+
+ if (reply != KMessageBox::Continue) {
+ delete dialog;
+ return ;
+ }
+
+ for (int i = 0; i < names.size(); ++i) {
+ std::cerr << i << ": " << names[i] << std::endl;
+ QFile file(names[i]);
+ if (!file.remove()) {
+ KMessageBox::error(this, i18n("File %1 could not be deleted.").arg(names[i]));
+ } else {
+ if (nameMap.find(names[i]) != nameMap.end()) {
+ m_doc->getAudioFileManager().removeFile(nameMap[names[i]]);
+ emit deleteAudioFile(nameMap[names[i]]);
+ } else {
+ std::cerr << "WARNING: Audio file name " << names[i] << " not in name map" << std::endl;
+ }
+
+ QFile peakFile(QString("%1.pk").arg(names[i]));
+ peakFile.remove();
+ }
+ }
+ }
+ }
+
+ m_fileList->clear();
+ slotPopulateFileList();
+
+ delete dialog;
+}
+
+void
+AudioManagerDialog::slotRename()
+{
+ AudioFile *audioFile = getCurrentSelection();
+
+ if (audioFile == 0)
+ return ;
+
+ bool ok = false;
+
+ QString newText = KLineEditDlg::getText(
+ i18n("Change Audio File label"),
+ i18n("Enter new label"),
+ QString(audioFile->getName().c_str()),
+ &ok,
+ this);
+
+ if ( ok && !newText.isEmpty() )
+ audioFile->setName(qstrtostr(newText));
+
+ slotPopulateFileList();
+}
+
+void
+AudioManagerDialog::slotSelectionChanged(QListViewItem *item)
+{
+ AudioListItem *aItem = dynamic_cast<AudioListItem*>(item);
+
+ // If we're on a segment then send a "select" signal
+ // and enable appropriate buttons.
+ //
+ if (aItem && aItem->getSegment()) {
+ SegmentSelection selection;
+ selection.insert(aItem->getSegment());
+ emit segmentsSelected(selection);
+ }
+
+ updateActionState(aItem != 0);
+}
+
+void
+AudioManagerDialog::setSelected(AudioFileId id,
+ const Segment *segment,
+ bool propagate)
+{
+ QListViewItem *it = m_fileList->firstChild();
+ QListViewItem *chIt = 0;
+ AudioListItem *aItem;
+
+ while (it) {
+ // If we're looking for a top level audio file
+ if (segment == 0) {
+ aItem = dynamic_cast<AudioListItem*>(it);
+
+ if (aItem->getId() == id) {
+ selectFileListItemNoSignal(it);
+ return ;
+ }
+ } else // look for a child
+ {
+ if (it->childCount() > 0)
+ chIt = it->firstChild();
+
+ while (chIt) {
+ aItem = dynamic_cast<AudioListItem*>(chIt);
+
+ if (aItem) {
+ if (aItem->getId() == id && aItem->getSegment() == segment) {
+ selectFileListItemNoSignal(chIt);
+
+ // Only propagate to segmentcanvas if asked to
+ if (propagate) {
+ SegmentSelection selection;
+ selection.insert(aItem->getSegment());
+ emit segmentsSelected(selection);
+ }
+
+ return ;
+ }
+ }
+ chIt = chIt->nextSibling();
+ }
+ }
+
+ it = it->nextSibling();
+ }
+
+}
+
+void
+AudioManagerDialog::selectFileListItemNoSignal(QListViewItem* it)
+{
+ m_fileList->blockSignals(true);
+
+ if (it) {
+ m_fileList->ensureItemVisible(it);
+ m_fileList->setSelected(it, true);
+ } else {
+ m_fileList->clearSelection();
+ }
+
+ m_fileList->blockSignals(false);
+}
+
+MultiViewCommandHistory*
+AudioManagerDialog::getCommandHistory()
+{
+ return m_doc->getCommandHistory();
+}
+
+void
+AudioManagerDialog::slotCommandExecuted(KCommand*)
+{
+ slotPopulateFileList();
+}
+
+void
+AudioManagerDialog::slotSegmentSelection(
+ const SegmentSelection &segments)
+{
+ const Segment *segment = 0;
+
+ for (SegmentSelection::const_iterator it = segments.begin();
+ it != segments.end(); ++it) {
+ if ((*it)->getType() == Segment::Audio) {
+ // Only get one audio segment
+ if (segment == 0)
+ segment = *it;
+ else
+ segment = 0;
+ }
+
+ }
+
+ if (segment) {
+ // We don't propagate this segment setting to the canvas
+ // as we probably got called from there.
+ //
+ setSelected(segment->getAudioFileId(), segment, false);
+ } else {
+ selectFileListItemNoSignal(0);
+ }
+
+}
+
+void
+AudioManagerDialog::slotCancelPlayingAudioFile()
+{
+ emit cancelPlayingAudioFile(m_playingAudioFile);
+}
+
+void
+AudioManagerDialog::closePlayingDialog(AudioFileId id)
+{
+ //std::cout << "AudioManagerDialog::closePlayingDialog" << std::endl;
+ if (m_audioPlayingDialog && id == m_playingAudioFile) {
+ m_playTimer->stop();
+ delete m_audioPlayingDialog;
+ m_audioPlayingDialog = 0;
+ }
+
+}
+
+bool
+AudioManagerDialog::addFile(const KURL& kurl)
+{
+ AudioFileId id = 0;
+
+ AudioFileManager &aFM = m_doc->getAudioFileManager();
+
+ if (!kurl.isLocalFile()) {
+ if (!RosegardenGUIApp::self()->testAudioPath("importing a remote audio file")) return false;
+ } else if (aFM.fileNeedsConversion(qstrtostr(kurl.path()), m_sampleRate)) {
+ if (!RosegardenGUIApp::self()->testAudioPath("importing an audio file that needs to be converted or resampled")) return false;
+ }
+
+ ProgressDialog progressDlg(i18n("Adding audio file..."),
+ 100,
+ this);
+
+ CurrentProgressDialog::set(&progressDlg);
+ progressDlg.progressBar()->hide();
+ progressDlg.show();
+
+ // Connect the progress dialog
+ //
+ connect(&aFM, SIGNAL(setProgress(int)),
+ progressDlg.progressBar(), SLOT(setValue(int)));
+ connect(&aFM, SIGNAL(setOperationName(QString)),
+ &progressDlg, SLOT(slotSetOperationName(QString)));
+ connect(&progressDlg, SIGNAL(cancelClicked()),
+ &aFM, SLOT(slotStopImport()));
+
+ try {
+ id = aFM.importURL(kurl, m_sampleRate);
+ } catch (AudioFileManager::BadAudioPathException e) {
+ CurrentProgressDialog::freeze();
+ QString errorString = i18n("Failed to add audio file. ") + strtoqstr(e.getMessage());
+ KMessageBox::sorry(this, errorString);
+ return false;
+ } catch (SoundFile::BadSoundFileException e) {
+ CurrentProgressDialog::freeze();
+ QString errorString = i18n("Failed to add audio file. ") + strtoqstr(e.getMessage());
+ KMessageBox::sorry(this, errorString);
+ return false;
+ }
+
+ disconnect(&progressDlg, SIGNAL(cancelClicked()),
+ &aFM, SLOT(slotStopImport()));
+ connect(&progressDlg, SIGNAL(cancelClicked()),
+ &aFM, SLOT(slotStopPreview()));
+ progressDlg.progressBar()->show();
+ progressDlg.slotSetOperationName(i18n("Generating audio preview..."));
+
+ try {
+ aFM.generatePreview(id);
+ } catch (Exception e) {
+ CurrentProgressDialog::freeze();
+
+ QString message = strtoqstr(e.getMessage()) + "\n\n" +
+ i18n("Try copying this file to a directory where you have write permission and re-add it");
+ KMessageBox::information(this, message);
+ }
+
+ disconnect(&progressDlg, SIGNAL(cancelClicked()),
+ &aFM, SLOT(slotStopPreview()));
+
+ slotPopulateFileList();
+
+ // tell the sequencer
+ emit addAudioFile(id);
+
+ return true;
+}
+
+void
+AudioManagerDialog::slotDropped(QDropEvent *event, QListViewItem*)
+{
+ QStrList uri;
+
+ // see if we can decode a URI.. if not, just ignore it
+ if (QUriDrag::decode(event, uri)) {
+ // okay, we have a URI.. process it
+ for (QString url = uri.first(); url; url = uri.next()) {
+
+ RG_DEBUG << "AudioManagerDialog::dropEvent() : got "
+ << url << endl;
+
+ addFile(KURL(url));
+ }
+
+ }
+}
+
+void
+AudioManagerDialog::closeEvent(QCloseEvent *e)
+{
+ RG_DEBUG << "AudioManagerDialog::closeEvent()\n";
+ emit closing();
+ KMainWindow::closeEvent(e);
+}
+
+void
+AudioManagerDialog::slotClose()
+{
+ emit closing();
+ close();
+ //KDockMainWindow::slotClose();
+ // delete this;
+}
+
+void
+AudioManagerDialog::setAudioSubsystemStatus(bool ok)
+{
+ // We can do something more fancy in the future but for the moment
+ // this will suffice.
+ //
+ m_audiblePreview = ok;
+}
+
+bool
+AudioManagerDialog::addAudioFile(const QString &filePath)
+{
+ return addFile(QFileInfo(filePath).absFilePath());
+}
+
+bool
+AudioManagerDialog::isSelectedTrackAudio()
+{
+ Composition &comp = m_doc->getComposition();
+ Studio &studio = m_doc->getStudio();
+
+ TrackId currentTrackId = comp.getSelectedTrack();
+ Track *track = comp.getTrackById(currentTrackId);
+
+ if (track) {
+ InstrumentId ii = track->getInstrument();
+ Instrument *instrument = studio.getInstrumentById(ii);
+
+ if (instrument &&
+ instrument->getType() == Instrument::Audio)
+ return true;
+ }
+
+ return false;
+
+}
+
+void
+AudioManagerDialog::slotDistributeOnMidiSegment()
+{
+ RG_DEBUG << "AudioManagerDialog::slotDistributeOnMidiSegment" << endl;
+
+ //Composition &comp = m_doc->getComposition();
+
+ QList<RosegardenGUIView>& viewList = m_doc->getViewList();
+ RosegardenGUIView *w = 0;
+ SegmentSelection selection;
+
+ for (w = viewList.first(); w != 0; w = viewList.next()) {
+ selection = w->getSelection();
+ }
+
+ // Store the insert times in a local vector
+ //
+ std::vector<timeT> insertTimes;
+
+ for (SegmentSelection::iterator i = selection.begin();
+ i != selection.end(); ++i) {
+ // For MIDI (Internal) Segments only of course
+ //
+ if ((*i)->getType() == Segment::Internal) {
+ for (Segment::iterator it = (*i)->begin(); it != (*i)->end(); ++it) {
+ if ((*it)->isa(Note::EventType))
+ insertTimes.push_back((*it)->getAbsoluteTime());
+ }
+ }
+ }
+
+ for (unsigned int i = 0; i < insertTimes.size(); ++i) {
+ RG_DEBUG << "AudioManagerDialog::slotDistributeOnMidiSegment - "
+ << "insert audio segment at " << insertTimes[i]
+ << endl;
+ }
+}
+
+}
+#include "AudioManagerDialog.moc"
diff --git a/src/gui/dialogs/AudioManagerDialog.h b/src/gui/dialogs/AudioManagerDialog.h
new file mode 100644
index 0000000..728b700
--- /dev/null
+++ b/src/gui/dialogs/AudioManagerDialog.h
@@ -0,0 +1,206 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_AUDIOMANAGERDIALOG_H_
+#define _RG_AUDIOMANAGERDIALOG_H_
+
+#include "sound/AudioFile.h"
+#include <kmainwindow.h>
+#include "document/ConfigGroups.h"
+
+
+class QWidget;
+class QTimer;
+class QString;
+class QListViewItem;
+class QLabel;
+class QDropEvent;
+class QCloseEvent;
+class QAccel;
+class KURL;
+class KListView;
+class KCommand;
+
+
+namespace Rosegarden
+{
+
+class SegmentSelection;
+class Segment;
+class RosegardenGUIDoc;
+class RealTime;
+class MultiViewCommandHistory;
+class AudioPlayingDialog;
+class AudioFile;
+
+
+class AudioManagerDialog : public KMainWindow
+{
+ Q_OBJECT
+
+public:
+ AudioManagerDialog(QWidget *parent,
+ RosegardenGUIDoc *doc);
+ ~AudioManagerDialog();
+
+ // Populate the file list from the AudioFileManager
+ //
+
+ // Return a pointer to the currently selected AudioFile -
+ // returns 0 if nothing is selected
+ //
+ AudioFile* getCurrentSelection();
+
+ // Scroll and expand to show this selected item
+ //
+ void setSelected(AudioFileId id,
+ const Segment *segment,
+ bool propagate); // if true then we tell the segmentcanvas
+
+ MultiViewCommandHistory *getCommandHistory();
+
+ // Pop down playing dialog if it's currently up
+ //
+ void closePlayingDialog(AudioFileId id);
+
+ // Can we playback audio currently?
+ //
+ void setAudioSubsystemStatus(bool ok);
+
+ // Return the accelerator object
+ //
+ QAccel* getAccelerators() { return m_accelerators; }
+
+ // Add a new file to the audio file manager
+ //
+ bool addAudioFile(const QString &filePath);
+
+
+public slots:
+ void slotAdd();
+ void slotPlayPreview();
+ void slotRename();
+ void slotInsert();
+ void slotRemove();
+ void slotRemoveAll();
+ void slotRemoveAllUnused();
+ void slotDeleteUnused();
+ void slotExportAudio();
+
+ // get selection
+ void slotSelectionChanged(QListViewItem *);
+
+ // Repopulate
+ //
+ void slotPopulateFileList();
+
+ // Commands
+ //
+ void slotCommandExecuted(KCommand *);
+
+ /**
+ * Accept a list of Segments and highlight accordingly
+ * Used to reflect a selection on the main view
+ * (when the user selects an audio track, the corresponding item
+ * in the audio manager should be selected in turn)
+ *
+ * We check for embedded audio segments and if we find exactly one
+ * we highlight it. If we don't we unselect everything.
+ *
+ */
+ void slotSegmentSelection(const SegmentSelection &);
+
+ /**
+ * Cancel the currently playing audio file
+ */
+ void slotCancelPlayingAudioFile();
+
+ void slotClose();
+
+ /**
+ * Turn a MIDI segment into a set of audio segments triggered
+ * by the MIDI Note Ons
+ */
+ void slotDistributeOnMidiSegment();
+
+signals:
+
+ // Control signals so we can tell the sequencer about our changes
+ // or actions.
+ //
+ void addAudioFile(AudioFileId);
+ void deleteAudioFile(AudioFileId);
+ void playAudioFile(AudioFileId,
+ const RealTime &,
+ const RealTime &);
+ void cancelPlayingAudioFile(AudioFileId);
+ void deleteAllAudioFiles();
+
+ // We've selected a segment here, make the canvas select it too
+ //
+ void segmentsSelected(const SegmentSelection&);
+ void deleteSegments(const SegmentSelection&);
+ void insertAudioSegment(AudioFileId,
+ const RealTime &,
+ const RealTime &);
+
+ void closing();
+protected slots:
+ void slotDropped(QDropEvent*, QListViewItem*);
+ void slotCancelPlayingAudio();
+
+protected:
+ bool addFile(const KURL& kurl);
+ bool isSelectedTrackAudio();
+ void selectFileListItemNoSignal(QListViewItem*);
+ void updateActionState(bool haveSelection);
+
+ virtual void closeEvent(QCloseEvent *);
+
+ //--------------- Data members ---------------------------------
+
+ KListView *m_fileList;
+ QLabel *m_wrongSampleRates;
+ RosegardenGUIDoc *m_doc;
+
+ QAccel *m_accelerators;
+
+ AudioFileId m_playingAudioFile;
+ AudioPlayingDialog *m_audioPlayingDialog;
+ QTimer *m_playTimer;
+
+ static const char* const m_listViewLayoutName;
+ static const int m_maxPreviewWidth;
+ static const int m_previewHeight;
+
+ bool m_audiblePreview;
+ int m_sampleRate;
+};
+
+
+
+}
+
+#endif
diff --git a/src/gui/dialogs/AudioPlayingDialog.cpp b/src/gui/dialogs/AudioPlayingDialog.cpp
new file mode 100644
index 0000000..0915ef2
--- /dev/null
+++ b/src/gui/dialogs/AudioPlayingDialog.cpp
@@ -0,0 +1,55 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "AudioPlayingDialog.h"
+
+#include <klocale.h>
+#include <kdialogbase.h>
+#include <qhbox.h>
+#include <qlabel.h>
+#include <qstring.h>
+#include <qwidget.h>
+
+
+namespace Rosegarden
+{
+
+AudioPlayingDialog::AudioPlayingDialog(QWidget *parent,
+ const QString &name):
+ KDialogBase(parent, 0, true,
+ i18n("Playing audio file"),
+ Cancel)
+{
+ QHBox *w = makeHBoxMainWidget();
+ QLabel *label = new
+ QLabel(i18n("Playing audio file \"%1\"").arg(name), w);
+
+ label->setMinimumHeight(80);
+
+
+}
+
+}
+#include "AudioPlayingDialog.moc"
diff --git a/src/gui/dialogs/AudioPlayingDialog.h b/src/gui/dialogs/AudioPlayingDialog.h
new file mode 100644
index 0000000..880d0bd
--- /dev/null
+++ b/src/gui/dialogs/AudioPlayingDialog.h
@@ -0,0 +1,56 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_AUDIOPLAYINGDIALOG_H_
+#define _RG_AUDIOPLAYINGDIALOG_H_
+
+#include <kdialogbase.h>
+#include "gui/application/RosegardenDCOP.h"
+
+
+class QWidget;
+class QString;
+
+
+namespace Rosegarden
+{
+
+
+
+class AudioPlayingDialog : public KDialogBase
+{
+ Q_OBJECT
+
+public:
+ AudioPlayingDialog(QWidget *parent, const QString &label);
+
+signals:
+
+};
+
+
+}
+
+#endif
diff --git a/src/gui/dialogs/AudioPluginDialog.cpp b/src/gui/dialogs/AudioPluginDialog.cpp
new file mode 100644
index 0000000..7f54f71
--- /dev/null
+++ b/src/gui/dialogs/AudioPluginDialog.cpp
@@ -0,0 +1,916 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "AudioPluginDialog.h"
+#include <qlayout.h>
+
+#include <klocale.h>
+#include "misc/Debug.h"
+#include "misc/Strings.h"
+#include "base/AudioPluginInstance.h"
+#include "base/Instrument.h"
+#include "base/MidiProgram.h"
+#include "gui/studio/AudioPluginClipboard.h"
+#include "gui/studio/AudioPlugin.h"
+#include "gui/studio/AudioPluginManager.h"
+#include "gui/studio/AudioPluginOSCGUIManager.h"
+#include "gui/studio/StudioControl.h"
+#include "gui/widgets/PluginControl.h"
+#include "sound/MappedStudio.h"
+#include "sound/PluginIdentifier.h"
+#include <kcombobox.h>
+#include <kdialogbase.h>
+#include <qaccel.h>
+#include <qcheckbox.h>
+#include <qframe.h>
+#include <qgroupbox.h>
+#include <qhbox.h>
+#include <qlabel.h>
+#include <qpushbutton.h>
+#include <qsizepolicy.h>
+#include <qstring.h>
+#include <qstringlist.h>
+#include <qtooltip.h>
+#include <qvbox.h>
+#include <qwidget.h>
+#include <set>
+
+namespace Rosegarden
+{
+
+AudioPluginDialog::AudioPluginDialog(QWidget *parent,
+ AudioPluginManager *aPM,
+#ifdef HAVE_LIBLO
+ AudioPluginOSCGUIManager *aGM,
+#endif
+ PluginContainer *pluginContainer,
+ int index):
+ KDialogBase(parent, "", false, i18n("Audio Plugin"),
+#ifdef HAVE_LIBLO
+ Close | Details | Help),
+#else
+ Close | Help),
+#endif
+ m_pluginManager(aPM),
+#ifdef HAVE_LIBLO
+ m_pluginGUIManager(aGM),
+#endif
+ m_pluginContainer(pluginContainer),
+ m_containerId(pluginContainer->getId()),
+ m_programLabel(0),
+ m_index(index),
+ m_generating(true),
+ m_guiShown(false)
+{
+ setHelp("studio-plugins");
+
+ setSizePolicy(QSizePolicy(QSizePolicy::Preferred,
+ QSizePolicy::Fixed));
+
+#ifdef HAVE_LIBLO
+
+ setButtonText(Details, i18n("Editor"));
+#endif
+
+ QVBox *vbox = makeVBoxMainWidget();
+
+ QGroupBox *pluginSelectionBox = new QGroupBox
+ (1, Horizontal, i18n("Plugin"), vbox);
+
+ makePluginParamsBox(vbox, 0, 10);
+
+ m_pluginCategoryBox = new QHBox(pluginSelectionBox);
+ new QLabel(i18n("Category:"), m_pluginCategoryBox);
+ m_pluginCategoryList = new KComboBox(m_pluginCategoryBox);
+ m_pluginCategoryList->setSizeLimit(20);
+
+ QHBox *hbox = new QHBox(pluginSelectionBox);
+ m_pluginLabel = new QLabel(i18n("Plugin:"), hbox);
+ m_pluginList = new KComboBox(hbox);
+ m_pluginList->setSizeLimit(20);
+ QToolTip::add
+ (m_pluginList, i18n("Select a plugin from this list."));
+
+ QHBox *h = new QHBox(pluginSelectionBox);
+
+// top line
+ m_bypass = new QCheckBox(i18n("Bypass"), h);
+ QToolTip::add
+ (m_bypass, i18n("Bypass this plugin."));
+
+ connect(m_bypass, SIGNAL(toggled(bool)),
+ this, SLOT(slotBypassChanged(bool)));
+
+
+ m_insOuts = new QLabel(i18n("<ports>"), h);
+ m_insOuts->setAlignment(AlignRight);
+ QToolTip::add
+ (m_insOuts, i18n("Input and output port counts."));
+
+ m_pluginId = new QLabel(i18n("<id>"), h);
+ m_pluginId->setAlignment(AlignRight);
+ QToolTip::add
+ (m_pluginId, i18n("Unique ID of plugin."));
+
+ connect(m_pluginList, SIGNAL(activated(int)),
+ this, SLOT(slotPluginSelected(int)));
+
+ connect(m_pluginCategoryList, SIGNAL(activated(int)),
+ this, SLOT(slotCategorySelected(int)));
+
+// new line
+ h = new QHBox(pluginSelectionBox);
+ m_copyButton = new QPushButton(i18n("Copy"), h);
+ connect(m_copyButton, SIGNAL(clicked()),
+ this, SLOT(slotCopy()));
+ QToolTip::add
+ (m_copyButton, i18n("Copy plugin parameters"));
+
+ m_pasteButton = new QPushButton(i18n("Paste"), h);
+ connect(m_pasteButton, SIGNAL(clicked()),
+ this, SLOT(slotPaste()));
+ QToolTip::add
+ (m_pasteButton, i18n("Paste plugin parameters"));
+
+ m_defaultButton = new QPushButton(i18n("Default"), h);
+ connect(m_defaultButton, SIGNAL(clicked()),
+ this, SLOT(slotDefault()));
+ QToolTip::add
+ (m_defaultButton, i18n("Set to defaults"));
+
+ populatePluginCategoryList();
+ populatePluginList();
+
+ m_generating = false;
+
+ m_accelerators = new QAccel(this);
+}
+
+#ifdef HAVE_LIBLO
+
+void
+AudioPluginDialog::slotDetails()
+{
+ slotShowGUI();
+}
+#endif
+
+void
+AudioPluginDialog::slotShowGUI()
+{
+ emit showPluginGUI(m_containerId, m_index);
+ m_guiShown = true;
+
+ //!!! need to get notification of when a plugin gui exits from the
+ //gui manager
+}
+
+void
+AudioPluginDialog::populatePluginCategoryList()
+{
+ AudioPluginInstance *inst = m_pluginContainer->getPlugin(m_index);
+ std::set
+ <QString> categories;
+ QString currentCategory;
+
+ for (PluginIterator i = m_pluginManager->begin();
+ i != m_pluginManager->end(); ++i) {
+
+ if (( isSynth() && (*i)->isSynth()) ||
+ (!isSynth() && (*i)->isEffect())) {
+
+ if ((*i)->getCategory() != "") {
+ categories.insert((*i)->getCategory());
+ }
+
+ if (inst && inst->isAssigned() &&
+ ((*i)->getIdentifier() == inst->getIdentifier().c_str())) {
+ currentCategory = (*i)->getCategory();
+ }
+ }
+ }
+
+ if (inst) {
+ RG_DEBUG << "AudioPluginDialog::populatePluginCategoryList: inst id " << inst->getIdentifier() << ", cat " << currentCategory << endl;
+ }
+
+ if (categories.empty()) {
+ m_pluginCategoryBox->hide();
+ m_pluginLabel->hide();
+ }
+
+ m_pluginCategoryList->clear();
+ m_pluginCategoryList->insertItem(i18n("(any)"));
+ m_pluginCategoryList->insertItem(i18n("(unclassified)"));
+ m_pluginCategoryList->setCurrentItem(0);
+
+ for (std::set
+ <QString>::iterator i = categories.begin();
+ i != categories.end(); ++i) {
+
+ m_pluginCategoryList->insertItem(*i);
+
+ if (*i == currentCategory) {
+ m_pluginCategoryList->setCurrentItem(m_pluginCategoryList->count() - 1);
+ }
+ }
+}
+
+void
+AudioPluginDialog::populatePluginList()
+{
+ m_pluginList->clear();
+ m_pluginsInList.clear();
+
+ m_pluginList->insertItem(i18n("(none)"));
+ m_pluginsInList.push_back(0);
+
+ QString category;
+ bool needCategory = false;
+
+ if (m_pluginCategoryList->currentItem() > 0) {
+ needCategory = true;
+ if (m_pluginCategoryList->currentItem() == 1) {
+ category = "";
+ } else {
+ category = m_pluginCategoryList->currentText();
+ }
+ }
+
+ // Check for plugin and setup as required
+ AudioPluginInstance *inst = m_pluginContainer->getPlugin(m_index);
+ if (inst)
+ m_bypass->setChecked(inst->isBypassed());
+
+ // Use this temporary map to ensure that the plugins are sorted
+ // by name when they go into the combobox
+ typedef std::pair<int, AudioPlugin *> PluginPair;
+ typedef std::map<QString, PluginPair> PluginMap;
+ PluginMap plugins;
+ int count = 0;
+
+ for (PluginIterator i = m_pluginManager->begin();
+ i != m_pluginManager->end(); ++i) {
+
+ ++count;
+
+ if (( isSynth() && (*i)->isSynth()) ||
+ (!isSynth() && (*i)->isEffect())) {
+
+ if (needCategory) {
+ QString cat = "";
+ if ((*i)->getCategory())
+ cat = (*i)->getCategory();
+ if (cat != category)
+ continue;
+ }
+
+ QString name = (*i)->getName();
+ bool store = true;
+
+ if (plugins.find(name) != plugins.end()) {
+ // We already have a plugin of this name. If it's a
+ // LADSPA plugin, replace it (this one might be
+ // something better); otherwise leave it alone.
+ QString id = plugins[name].second->getIdentifier();
+ QString type, soname, label;
+ PluginIdentifier::parseIdentifier(id, type, soname, label);
+ if (type != "ladspa") {
+ store = false;
+ }
+ }
+
+ if (store) {
+ plugins[(*i)->getName()] = PluginPair(count, *i);
+ }
+ }
+ }
+
+ const char *currentId = 0;
+ if (inst && inst->isAssigned())
+ currentId = inst->getIdentifier().c_str();
+
+ for (PluginMap::iterator i = plugins.begin(); i != plugins.end(); ++i) {
+
+ QString name = i->first;
+ if (name.endsWith(" VST"))
+ name = name.left(name.length() - 4);
+
+ m_pluginList->insertItem(name);
+ m_pluginsInList.push_back(i->second.first);
+
+ if (currentId && currentId == i->second.second->getIdentifier()) {
+ m_pluginList->setCurrentItem(m_pluginList->count() - 1);
+ }
+ }
+
+ slotPluginSelected(m_pluginList->currentItem());
+}
+
+void
+AudioPluginDialog::makePluginParamsBox(QWidget *parent, int portCount,
+ int tooManyPorts)
+{
+ m_pluginParamsBox = new QFrame(parent);
+
+ int columns = 2;
+ if (portCount > tooManyPorts) {
+ columns = 2;
+ } else if (portCount > 24) {
+ if (portCount > 60) {
+ columns = (portCount - 1) / 16 + 1;
+ } else {
+ columns = (portCount - 1) / 12 + 1;
+ }
+ }
+
+ int perColumn = 4;
+ if (portCount > 48) { // no bounds will be shown
+ perColumn = 2;
+ }
+
+ m_gridLayout = new QGridLayout(m_pluginParamsBox,
+ 1, // rows (will expand)
+ columns * perColumn,
+ 5); // margin
+
+ m_gridLayout->setColStretch(3, 2);
+ m_gridLayout->setColStretch(7, 2);
+}
+
+void
+AudioPluginDialog::slotCategorySelected(int)
+{
+ populatePluginList();
+}
+
+void
+AudioPluginDialog::slotPluginSelected(int i)
+{
+ bool guiWasShown = m_guiShown;
+
+ if (m_guiShown) {
+ emit stopPluginGUI(m_containerId, m_index);
+ m_guiShown = false;
+ }
+
+ int number = m_pluginsInList[i];
+
+ RG_DEBUG << "AudioPluginDialog::::slotPluginSelected - "
+ << "setting up plugin from position " << number << " at menu item " << i << endl;
+
+ QString caption =
+ strtoqstr(m_pluginContainer->getName()) +
+ QString(" [ %1 ] - ").arg(m_index + 1);
+
+ if (number == 0) {
+ setCaption(caption + i18n("<no plugin>"));
+ m_insOuts->setText(i18n("<ports>"));
+ m_pluginId->setText(i18n("<id>"));
+
+ QToolTip::hide();
+ QToolTip::remove
+ (m_pluginList);
+
+ QToolTip::add
+ (m_pluginList, i18n("Select a plugin from this list."));
+ }
+
+ AudioPlugin *plugin = m_pluginManager->getPlugin(number - 1);
+
+ // Destroy old param widgets
+ //
+ QWidget* parent = dynamic_cast<QWidget*>(m_pluginParamsBox->parent());
+
+ delete m_pluginParamsBox;
+ m_pluginWidgets.clear(); // The widgets are deleted with the parameter box
+ m_programCombo = 0;
+
+ int portCount = 0;
+ if (plugin) {
+ for (AudioPlugin::PortIterator it = plugin->begin(); it != plugin->end(); ++it) {
+ if (((*it)->getType() & PluginPort::Control) &&
+ ((*it)->getType() & PluginPort::Input))
+ ++portCount;
+ }
+ }
+
+ int tooManyPorts = 96;
+ makePluginParamsBox(parent, portCount, tooManyPorts);
+ bool showBounds = (portCount <= 48);
+
+ if (portCount > tooManyPorts) {
+
+ m_gridLayout->addMultiCellWidget(
+ new QLabel(i18n("This plugin has too many controls to edit here."),
+ m_pluginParamsBox),
+ 1, 1, 0, m_gridLayout->numCols() - 1, Qt::AlignCenter);
+ }
+
+ AudioPluginInstance *inst = m_pluginContainer->getPlugin(m_index);
+ if (!inst)
+ return ;
+
+ if (plugin) {
+ setCaption(caption + plugin->getName());
+ m_pluginId->setText(i18n("Id: %1").arg(plugin->getUniqueId()));
+
+ QString pluginInfo = plugin->getAuthor() + QString("\n") +
+ plugin->getCopyright();
+
+ QToolTip::hide();
+ QToolTip::remove
+ (m_pluginList);
+ QToolTip::add
+ (m_pluginList, pluginInfo);
+
+ std::string identifier = plugin->getIdentifier().data();
+
+ // Only clear ports &c if this method is accessed by user
+ // action (after the constructor)
+ //
+ if (m_generating == false) {
+ inst->clearPorts();
+ if (inst->getIdentifier() != identifier) {
+ inst->clearConfiguration();
+ }
+ }
+
+ inst->setIdentifier(identifier);
+
+ AudioPlugin::PortIterator it = plugin->begin();
+ int count = 0;
+ int ins = 0, outs = 0;
+
+ for (; it != plugin->end(); ++it) {
+ if (((*it)->getType() & PluginPort::Control) &&
+ ((*it)->getType() & PluginPort::Input)) {
+ // Check for port existence and create with default value
+ // if it doesn't exist. Modification occurs through the
+ // slotPluginPortChanged signal.
+ //
+ if (inst->getPort(count) == 0) {
+ inst->addPort(count, (float)(*it)->getDefaultValue());
+// std::cerr << "Plugin port name " << (*it)->getName() << ", default: " << (*it)->getDefaultValue() << std::endl;
+ }
+
+ } else if ((*it)->getType() & PluginPort::Audio) {
+ if ((*it)->getType() & PluginPort::Input)
+ ++ins;
+ else if ((*it)->getType() & PluginPort::Output)
+ ++outs;
+ }
+
+ ++count;
+ }
+
+ if (ins == 1 && outs == 1)
+ m_insOuts->setText(i18n("mono"));
+ else if (ins == 2 && outs == 2)
+ m_insOuts->setText(i18n("stereo"));
+ else
+ m_insOuts->setText(i18n("%1 in, %2 out").arg(ins).arg(outs));
+
+ QString shortName(plugin->getName());
+ int parenIdx = shortName.find(" (");
+ if (parenIdx > 0) {
+ shortName = shortName.left(parenIdx);
+ if (shortName == "Null")
+ shortName = "Plugin";
+ }
+ }
+
+ adjustSize();
+ setFixedSize(minimumSizeHint());
+
+ // tell the sequencer
+ emit pluginSelected(m_containerId, m_index, number - 1);
+
+ if (plugin) {
+
+ int current = -1;
+ QStringList programs = getProgramsForInstance(inst, current);
+
+ if (programs.count() > 0) {
+
+ m_programLabel = new QLabel(i18n("Program: "), m_pluginParamsBox);
+
+ m_programCombo = new KComboBox(m_pluginParamsBox);
+ m_programCombo->setSizeLimit(20);
+ m_programCombo->insertItem(i18n("<none selected>"));
+ m_gridLayout->addMultiCellWidget(m_programLabel,
+ 0, 0, 0, 0, Qt::AlignRight);
+ m_gridLayout->addMultiCellWidget(m_programCombo,
+ 0, 0, 1, m_gridLayout->numCols() - 1,
+ Qt::AlignLeft);
+ connect(m_programCombo, SIGNAL(activated(const QString &)),
+ this, SLOT(slotPluginProgramChanged(const QString &)));
+
+ m_programCombo->clear();
+ m_programCombo->insertItem(i18n("<none selected>"));
+ m_programCombo->insertStringList(programs);
+ m_programCombo->setCurrentItem(current + 1);
+ m_programCombo->adjustSize();
+
+ m_programLabel->show();
+ m_programCombo->show();
+ }
+
+ AudioPlugin::PortIterator it = plugin->begin();
+ int count = 0;
+
+ for (; it != plugin->end(); ++it) {
+ if (((*it)->getType() & PluginPort::Control) &&
+ ((*it)->getType() & PluginPort::Input)) {
+ PluginControl *control =
+ new PluginControl(m_pluginParamsBox,
+ m_gridLayout,
+ PluginControl::Rotary,
+ *it,
+ m_pluginManager,
+ count,
+ inst->getPort(count)->value,
+ showBounds,
+ portCount > tooManyPorts);
+
+ connect(control, SIGNAL(valueChanged(float)),
+ this, SLOT(slotPluginPortChanged(float)));
+
+ m_pluginWidgets.push_back(control);
+ }
+
+ ++count;
+ }
+
+ m_pluginParamsBox->show();
+ }
+
+ if (guiWasShown) {
+ emit showPluginGUI(m_containerId, m_index);
+ m_guiShown = true;
+ }
+
+#ifdef HAVE_LIBLO
+ bool gui = m_pluginGUIManager->hasGUI(m_containerId, m_index);
+ actionButton(Details)->setEnabled(gui);
+#endif
+
+}
+
+QStringList
+AudioPluginDialog::getProgramsForInstance(AudioPluginInstance *inst, int &current)
+{
+ QStringList list;
+ int mappedId = inst->getMappedId();
+ QString currentProgram = strtoqstr(inst->getProgram());
+
+ MappedObjectPropertyList propertyList = StudioControl::getStudioObjectProperty
+ (mappedId, MappedPluginSlot::Programs);
+
+ current = -1;
+
+ for (MappedObjectPropertyList::iterator i = propertyList.begin();
+ i != propertyList.end(); ++i) {
+ if (*i == currentProgram)
+ current = list.count();
+ list.append(*i);
+ }
+
+ return list;
+}
+
+void
+AudioPluginDialog::slotPluginPortChanged(float value)
+{
+ const QObject* object = sender();
+
+ const PluginControl* control = dynamic_cast<const PluginControl*>(object);
+
+ if (!control)
+ return ;
+
+ // store the new value
+ AudioPluginInstance *inst = m_pluginContainer->getPlugin(m_index);
+ inst->getPort(control->getIndex())->setValue(value);
+
+ emit pluginPortChanged(m_containerId, m_index, control->getIndex());
+}
+
+void
+AudioPluginDialog::slotPluginProgramChanged(const QString &value)
+{
+ // store the new value
+ AudioPluginInstance *inst = m_pluginContainer->getPlugin(m_index);
+
+ if (m_programCombo && value == m_programCombo->text(0)) { // "<none set>"
+ inst->setProgram("");
+ } else {
+ inst->setProgram(qstrtostr(value));
+ emit pluginProgramChanged(m_containerId, m_index);
+ }
+}
+
+void
+AudioPluginDialog::updatePlugin(int number)
+{
+ for (unsigned int i = 0; i < m_pluginsInList.size(); ++i) {
+ if (m_pluginsInList[i] == number + 1) {
+ blockSignals(true);
+ m_pluginList->setCurrentItem(i);
+ blockSignals(false);
+ return ;
+ }
+ }
+}
+
+void
+AudioPluginDialog::updatePluginPortControl(int port)
+{
+ AudioPluginInstance *inst = m_pluginContainer->getPlugin(m_index);
+ if (inst) {
+ PluginPortInstance *pti = inst->getPort(port);
+ if (pti) {
+ for (std::vector<PluginControl *>::iterator i = m_pluginWidgets.begin();
+ i != m_pluginWidgets.end(); ++i) {
+ if ((*i)->getIndex() == port) {
+ (*i)->setValue(pti->value, false); // don't emit
+ return ;
+ }
+ }
+ }
+ }
+}
+
+void
+AudioPluginDialog::updatePluginProgramControl()
+{
+ AudioPluginInstance *inst = m_pluginContainer->getPlugin(m_index);
+ if (inst) {
+ std::string program = inst->getProgram();
+ if (m_programCombo) {
+ m_programCombo->blockSignals(true);
+ m_programCombo->setCurrentText(strtoqstr(program));
+ m_programCombo->blockSignals(false);
+ }
+ for (std::vector<PluginControl *>::iterator i = m_pluginWidgets.begin();
+ i != m_pluginWidgets.end(); ++i) {
+ PluginPortInstance *pti = inst->getPort((*i)->getIndex());
+ if (pti) {
+ (*i)->setValue(pti->value, false); // don't emit
+ }
+ }
+ }
+}
+
+void
+AudioPluginDialog::updatePluginProgramList()
+{
+ if (!m_programLabel)
+ return ;
+
+ AudioPluginInstance *inst = m_pluginContainer->getPlugin(m_index);
+ if (!inst)
+ return ;
+
+ if (!m_programCombo) {
+
+ int current = -1;
+ QStringList programs = getProgramsForInstance(inst, current);
+
+ if (programs.count() > 0) {
+
+ m_programLabel = new QLabel(i18n("Program: "), m_pluginParamsBox);
+
+ m_programCombo = new KComboBox(m_pluginParamsBox);
+ m_programCombo->setSizeLimit(20);
+ m_programCombo->insertItem(i18n("<none selected>"));
+ m_gridLayout->addMultiCellWidget(m_programLabel,
+ 0, 0, 0, 0, Qt::AlignRight);
+ m_gridLayout->addMultiCellWidget(m_programCombo,
+ 0, 0, 1, m_gridLayout->numCols() - 1,
+ Qt::AlignLeft);
+
+ m_programCombo->clear();
+ m_programCombo->insertItem(i18n("<none selected>"));
+ m_programCombo->insertStringList(programs);
+ m_programCombo->setCurrentItem(current + 1);
+ m_programCombo->adjustSize();
+
+ m_programLabel->show();
+ m_programCombo->show();
+
+ m_programCombo->blockSignals(true);
+ connect(m_programCombo, SIGNAL(activated(const QString &)),
+ this, SLOT(slotPluginProgramChanged(const QString &)));
+
+ } else {
+ return ;
+ }
+ } else {
+ }
+
+ while (m_programCombo->count() > 0) {
+ m_programCombo->removeItem(0);
+ }
+
+ int current = -1;
+ QStringList programs = getProgramsForInstance(inst, current);
+
+ if (programs.count() > 0) {
+ m_programCombo->show();
+ m_programLabel->show();
+ m_programCombo->clear();
+ m_programCombo->insertItem(i18n("<none selected>"));
+ m_programCombo->insertStringList(programs);
+ m_programCombo->setCurrentItem(current + 1);
+ } else {
+ m_programLabel->hide();
+ m_programCombo->hide();
+ }
+
+ m_programCombo->blockSignals(false);
+}
+
+void
+AudioPluginDialog::slotBypassChanged(bool bp)
+{
+ AudioPluginInstance *inst = m_pluginContainer->getPlugin(m_index);
+
+ if (inst)
+ inst->setBypass(bp);
+
+ emit bypassed(m_containerId, m_index, bp);
+}
+
+void
+AudioPluginDialog::windowActivationChange(bool oldState)
+{
+ if (isActiveWindow()) {
+ emit windowActivated();
+ }
+}
+
+void
+AudioPluginDialog::closeEvent(QCloseEvent *e)
+{
+ e->accept();
+ emit destroyed(m_containerId, m_index);
+}
+
+void
+AudioPluginDialog::slotClose()
+{
+ emit destroyed(m_containerId, m_index);
+ reject();
+}
+
+void
+AudioPluginDialog::slotCopy()
+{
+ int item = m_pluginList->currentItem();
+ int number = m_pluginsInList[item] - 1;
+
+ if (number >= 0) {
+ AudioPluginClipboard *clipboard =
+ m_pluginManager->getPluginClipboard();
+
+ clipboard->m_pluginNumber = number;
+
+ AudioPluginInstance *inst = m_pluginContainer->getPlugin(m_index);
+ if (inst) {
+ clipboard->m_configuration = inst->getConfiguration();
+ } else {
+ clipboard->m_configuration.clear();
+ }
+
+ std::cout << "AudioPluginDialog::slotCopy - plugin number = " << number
+ << std::endl;
+
+ if (m_programCombo && m_programCombo->currentItem() > 0) {
+ clipboard->m_program = qstrtostr(m_programCombo->currentText());
+ } else {
+ clipboard->m_program = "";
+ }
+
+ clipboard->m_controlValues.clear();
+ std::vector<PluginControl*>::iterator it;
+ for (it = m_pluginWidgets.begin(); it != m_pluginWidgets.end(); ++it) {
+ std::cout << "AudioPluginDialog::slotCopy - "
+ << "value = " << (*it)->getValue() << std::endl;
+
+ clipboard->m_controlValues.push_back((*it)->getValue());
+ }
+ }
+}
+
+void
+AudioPluginDialog::slotPaste()
+{
+ AudioPluginClipboard *clipboard = m_pluginManager->getPluginClipboard();
+
+ std::cout << "AudioPluginDialog::slotPaste - paste plugin id "
+ << clipboard->m_pluginNumber << std::endl;
+
+ if (clipboard->m_pluginNumber != -1) {
+ int count = 0;
+ for (std::vector<int>::iterator it = m_pluginsInList.begin();
+ it != m_pluginsInList.end(); ++it) {
+ if ((*it) == clipboard->m_pluginNumber + 1)
+ break;
+ count++;
+ }
+
+ if (count >= int(m_pluginsInList.size()))
+ return ;
+
+ // now select the plugin
+ //
+ m_pluginList->setCurrentItem(count);
+ slotPluginSelected(count);
+
+ // set configuration data
+ //
+ for (std::map<std::string, std::string>::const_iterator i =
+ clipboard->m_configuration.begin();
+ i != clipboard->m_configuration.end(); ++i) {
+ emit changePluginConfiguration(m_containerId,
+ m_index,
+ false,
+ strtoqstr(i->first),
+ strtoqstr(i->second));
+ }
+
+ // and set the program
+ //
+ if (m_programCombo && clipboard->m_program != "") {
+ m_programCombo->setCurrentText(strtoqstr(clipboard->m_program));
+ slotPluginProgramChanged(strtoqstr(clipboard->m_program));
+ }
+
+ // and ports
+ //
+ count = 0;
+
+ for (std::vector<PluginControl *>::iterator i = m_pluginWidgets.begin();
+ i != m_pluginWidgets.end(); ++i) {
+
+ if (count < clipboard->m_controlValues.size()) {
+ (*i)->setValue(clipboard->m_controlValues[count], true);
+ }
+ ++count;
+ }
+ }
+}
+
+void
+AudioPluginDialog::slotDefault()
+{
+ AudioPluginInstance *inst = m_pluginContainer->getPlugin(m_index);
+ if (!inst)
+ return ;
+
+ int i = m_pluginList->currentItem();
+ int n = m_pluginsInList[i];
+ if (n == 0)
+ return ;
+
+ AudioPlugin *plugin = m_pluginManager->getPlugin(n - 1);
+ if (!plugin)
+ return ;
+
+ for (std::vector<PluginControl *>::iterator i = m_pluginWidgets.begin();
+ i != m_pluginWidgets.end(); ++i) {
+
+ for (AudioPlugin::PortIterator pi = plugin->begin(); pi != plugin->end(); ++pi) {
+ if ((*pi)->getNumber() == (*i)->getIndex()) {
+ (*i)->setValue((*pi)->getDefaultValue(), true); // and emit
+ break;
+ }
+ }
+ }
+}
+
+}
+#include "AudioPluginDialog.moc"
diff --git a/src/gui/dialogs/AudioPluginDialog.h b/src/gui/dialogs/AudioPluginDialog.h
new file mode 100644
index 0000000..bc8a38b
--- /dev/null
+++ b/src/gui/dialogs/AudioPluginDialog.h
@@ -0,0 +1,167 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_AUDIOPLUGINDIALOG_H_
+#define _RG_AUDIOPLUGINDIALOG_H_
+
+#include "base/Instrument.h"
+#include "base/MidiProgram.h"
+#include <kdialogbase.h>
+#include <qstring.h>
+#include <qstringlist.h>
+#include <vector>
+
+
+class QWidget;
+class QPushButton;
+class QLabel;
+class QGridLayout;
+class QFrame;
+class QCloseEvent;
+class QCheckBox;
+class QAccel;
+class KComboBox;
+
+
+namespace Rosegarden
+{
+
+class PluginControl;
+class PluginContainer;
+class AudioPluginOSCGUIManager;
+class AudioPluginManager;
+class AudioPluginInstance;
+
+
+class AudioPluginDialog : public KDialogBase
+{
+ Q_OBJECT
+
+public:
+ AudioPluginDialog(QWidget *parent,
+ AudioPluginManager *aPM,
+#ifdef HAVE_LIBLO
+ AudioPluginOSCGUIManager *aGM,
+#endif
+ PluginContainer *instrument,
+ int index);
+
+ PluginContainer* getPluginContainer() const { return m_pluginContainer; }
+
+ QAccel* getAccelerators() { return m_accelerators; }
+
+ bool isSynth() { return m_index == int(Instrument::SYNTH_PLUGIN_POSITION); }
+
+ void updatePlugin(int number);
+ void updatePluginPortControl(int port);
+ void updatePluginProgramControl();
+ void updatePluginProgramList();
+ void guiExited() { m_guiShown = false; }
+
+public slots:
+ void slotCategorySelected(int);
+ void slotPluginSelected(int index);
+ void slotPluginPortChanged(float value);
+ void slotPluginProgramChanged(const QString &value);
+ void slotBypassChanged(bool);
+ void slotCopy();
+ void slotPaste();
+ void slotDefault();
+ void slotShowGUI();
+
+#ifdef HAVE_LIBLO
+ virtual void slotDetails();
+#endif
+
+signals:
+ void pluginSelected(InstrumentId, int pluginIndex, int plugin);
+ void pluginPortChanged(InstrumentId, int pluginIndex, int portIndex);
+ void pluginProgramChanged(InstrumentId, int pluginIndex);
+ void changePluginConfiguration(InstrumentId, int pluginIndex,
+ bool global, QString key, QString value);
+ void showPluginGUI(InstrumentId, int pluginIndex);
+ void stopPluginGUI(InstrumentId, int pluginIndex);
+
+ // is the plugin being bypassed
+ void bypassed(InstrumentId, int pluginIndex, bool bp);
+ void destroyed(InstrumentId, int index);
+
+ void windowActivated();
+
+protected slots:
+ virtual void slotClose();
+
+protected:
+ virtual void closeEvent(QCloseEvent *e);
+ virtual void windowActivationChange(bool);
+
+ void makePluginParamsBox(QWidget*, int portCount, int tooManyPorts);
+ QStringList getProgramsForInstance(AudioPluginInstance *inst, int &current);
+
+ //--------------- Data members ---------------------------------
+
+ AudioPluginManager *m_pluginManager;
+#ifdef HAVE_LIBLO
+ AudioPluginOSCGUIManager *m_pluginGUIManager;
+#endif
+ PluginContainer *m_pluginContainer;
+ InstrumentId m_containerId;
+
+ QFrame *m_pluginParamsBox;
+ QWidget *m_pluginCategoryBox;
+ KComboBox *m_pluginCategoryList;
+ QLabel *m_pluginLabel;
+ KComboBox *m_pluginList;
+ std::vector<int> m_pluginsInList;
+ QLabel *m_insOuts;
+ QLabel *m_pluginId;
+ QCheckBox *m_bypass;
+ QPushButton *m_copyButton;
+ QPushButton *m_pasteButton;
+ QPushButton *m_defaultButton;
+ QPushButton *m_guiButton;
+
+ QLabel *m_programLabel;
+ KComboBox *m_programCombo;
+ std::vector<PluginControl*> m_pluginWidgets;
+ QGridLayout *m_gridLayout;
+
+ int m_index;
+
+ bool m_generating;
+ bool m_guiShown;
+
+ QAccel *m_accelerators;
+
+ void populatePluginCategoryList();
+ void populatePluginList();
+};
+
+
+} // end of namespace
+
+
+
+#endif
diff --git a/src/gui/dialogs/AudioSplitDialog.cpp b/src/gui/dialogs/AudioSplitDialog.cpp
new file mode 100644
index 0000000..42290b3
--- /dev/null
+++ b/src/gui/dialogs/AudioSplitDialog.cpp
@@ -0,0 +1,339 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "AudioSplitDialog.h"
+#include <kapplication.h>
+
+#include <klocale.h>
+#include "misc/Debug.h"
+#include "misc/Strings.h"
+#include "base/Exception.h"
+#include "base/RealTime.h"
+#include "base/Segment.h"
+#include "document/RosegardenGUIDoc.h"
+#include "gui/application/RosegardenApplication.h"
+#include "sound/AudioFileManager.h"
+#include <kdialogbase.h>
+#include <qcanvas.h>
+#include <qhbox.h>
+#include <qlabel.h>
+#include <qpalette.h>
+#include <qscrollview.h>
+#include <qspinbox.h>
+#include <qstring.h>
+#include <qvbox.h>
+#include <qwidget.h>
+
+
+namespace Rosegarden
+{
+
+AudioSplitDialog::AudioSplitDialog(QWidget *parent,
+ Segment *segment,
+ RosegardenGUIDoc *doc):
+ KDialogBase(parent, 0, true,
+ i18n("Autosplit Audio Segment"), Ok | Cancel),
+ m_doc(doc),
+ m_segment(segment),
+ m_canvasWidth(500),
+ m_canvasHeight(200),
+ m_previewWidth(400),
+ m_previewHeight(100)
+{
+ if (!segment || segment->getType() != Segment::Audio)
+ reject();
+
+ QVBox *w = makeVBoxMainWidget();
+
+ new QLabel(i18n("AutoSplit Segment \"") +
+ strtoqstr(m_segment->getLabel()) + QString("\""), w);
+
+ m_canvas = new QCanvas(w);
+ m_canvas->resize(m_canvasWidth, m_canvasHeight);
+ m_canvasView = new QCanvasView(m_canvas, w);
+ m_canvasView->setFixedWidth(m_canvasWidth);
+ m_canvasView->setFixedHeight(m_canvasHeight);
+
+ m_canvasView->setHScrollBarMode(QScrollView::AlwaysOff);
+ m_canvasView->setVScrollBarMode(QScrollView::AlwaysOff);
+ m_canvasView->setDragAutoScroll(false);
+
+ QHBox *hbox = new QHBox(w);
+ new QLabel(i18n("Threshold"), hbox);
+ m_thresholdSpin = new QSpinBox(hbox);
+ m_thresholdSpin->setSuffix(" %");
+ connect(m_thresholdSpin, SIGNAL(valueChanged(int)),
+ SLOT(slotThresholdChanged(int)));
+
+ // ensure this is cleared
+ m_previewBoxes.clear();
+
+ // Set thresholds
+ //
+ int threshold = 1;
+ m_thresholdSpin->setValue(threshold);
+ drawPreview();
+ drawSplits(1);
+}
+
+void
+AudioSplitDialog::drawPreview()
+{
+ // Delete everything on the canvas
+ //
+ QCanvasItemList list = m_canvas->allItems();
+ for (QCanvasItemList::Iterator it = list.begin(); it != list.end(); it++)
+ delete *it;
+
+ // empty the preview boxes
+ m_previewBoxes.erase(m_previewBoxes.begin(), m_previewBoxes.end());
+
+ // Draw a bounding box
+ //
+ int border = 5;
+ QCanvasRectangle *rect = new QCanvasRectangle(m_canvas);
+ rect->setSize(m_canvasWidth - border * 2, m_canvasHeight - border * 2);
+ rect->setX(border);
+ rect->setY(border);
+ rect->setZ(1);
+ rect->setPen(kapp->palette().color(QPalette::Active, QColorGroup::Dark));
+ rect->setBrush(kapp->palette().color(QPalette::Active, QColorGroup::Base));
+ rect->setVisible(true);
+
+ // Get preview in vector form
+ //
+ AudioFileManager &aFM = m_doc->getAudioFileManager();
+ int channels = aFM.getAudioFile(m_segment->getAudioFileId())->getChannels();
+
+ std::vector<float> values;
+
+ try {
+ values = aFM.getPreview(m_segment->getAudioFileId(),
+ m_segment->getAudioStartTime(),
+ m_segment->getAudioEndTime(),
+ m_previewWidth,
+ false);
+ } catch (Exception e) {
+ QCanvasText *text = new QCanvasText(m_canvas);
+ text->setColor(kapp->palette().
+ color(QPalette::Active, QColorGroup::Shadow));
+ text->setText(i18n("<no preview generated for this audio file>"));
+ text->setX(30);
+ text->setY(30);
+ text->setZ(4);
+ text->setVisible(true);
+ m_canvas->update();
+ return ;
+ }
+
+ int startX = (m_canvasWidth - m_previewWidth) / 2;
+ int halfHeight = m_canvasHeight / 2;
+ float h1, h2;
+ std::vector<float>::iterator it = values.begin();
+
+ // Draw preview
+ //
+ for (int i = 0; i < m_previewWidth; i++) {
+ if (channels == 1) {
+ h1 = *(it++);
+ h2 = h1;
+ } else {
+ h1 = *(it++);
+ h2 = *(it++);
+ }
+
+
+ int startY = halfHeight + int(h1 * float(m_previewHeight / 2));
+ int endY = halfHeight - int(h2 * float(m_previewHeight / 2));
+
+ if ( startY < 0 ) {
+ RG_DEBUG << "AudioSplitDialog::AudioSplitDialog - "
+ << "startY - out of negative range"
+ << endl;
+ startY = 0;
+ }
+
+ if (endY < 0) {
+ RG_DEBUG << "AudioSplitDialog::AudioSplitDialog - "
+ << "endY - out of negative range"
+ << endl;
+ endY = 0;
+ }
+
+ QCanvasLine *line = new QCanvasLine(m_canvas);
+ line->setPoints(startX + i,
+ startY,
+ startX + i,
+ endY);
+ line->setZ(3);
+ line->setPen(kapp->
+ palette().color(QPalette::Active, QColorGroup::Shadow));
+ line->setBrush(kapp->
+ palette().color(QPalette::Active, QColorGroup::Shadow));
+ line->setVisible(true);
+
+ }
+
+ // Draw zero dc line
+ //
+ rect = new QCanvasRectangle(m_canvas);
+ rect->setX(startX);
+ rect->setY(halfHeight - 1);
+ rect->setSize(m_previewWidth, 2);
+ rect->setPen(kapp->palette().color(QPalette::Active, QColorGroup::Shadow));
+ rect->setBrush(kapp->palette().color(QPalette::Active, QColorGroup::Shadow));
+ rect->setZ(4);
+ rect->setVisible(true);
+
+ // Start time
+ //
+ char msecs[100];
+ sprintf(msecs, "%03d", m_segment->getAudioStartTime().msec());
+ QString startText = QString("%1.%2s")
+ .arg(m_segment->getAudioStartTime().sec)
+ .arg(msecs);
+ QCanvasText *text = new QCanvasText(m_canvas);
+ text->setColor(
+ kapp->palette().color(QPalette::Active, QColorGroup::Shadow));
+ text->setText(startText);
+ text->setX(startX - 20);
+ text->setY(m_canvasHeight / 2 - m_previewHeight / 2 - 35);
+ text->setZ(3);
+ text->setVisible(true);
+
+ rect = new QCanvasRectangle(m_canvas);
+ rect->setX(startX - 1);
+ rect->setY(m_canvasHeight / 2 - m_previewHeight / 2 - 14);
+ rect->setSize(1, m_previewHeight + 28);
+ rect->setPen(kapp->palette().color(QPalette::Active, QColorGroup::Shadow));
+ rect->setZ(3);
+ rect->setVisible(true);
+
+ // End time
+ //
+ sprintf(msecs, "%03d", m_segment->getAudioEndTime().msec());
+ QString endText = QString("%1.%2s")
+ .arg(m_segment->getAudioEndTime().sec)
+ .arg(msecs);
+ text = new QCanvasText(m_canvas);
+ text->setColor(
+ kapp->palette().color(QPalette::Active, QColorGroup::Shadow));
+ text->setText(endText);
+ text->setX(startX + m_previewWidth - 20);
+ text->setY(m_canvasHeight / 2 - m_previewHeight / 2 - 35);
+ text->setZ(3);
+ text->setVisible(true);
+
+ rect = new QCanvasRectangle(m_canvas);
+ rect->setX(startX + m_previewWidth - 1);
+ rect->setY(m_canvasHeight / 2 - m_previewHeight / 2 - 14);
+ rect->setSize(1, m_previewHeight + 28);
+ rect->setPen(kapp->palette().color(QPalette::Active, QColorGroup::Shadow));
+ rect->setZ(3);
+ rect->setVisible(true);
+
+ m_canvas->update();
+}
+
+void
+AudioSplitDialog::drawSplits(int threshold)
+{
+ // Now get the current split points and paint them
+ //
+ RealTime startTime = m_segment->getAudioStartTime();
+ RealTime endTime = m_segment->getAudioEndTime();
+
+ AudioFileManager &aFM = m_doc->getAudioFileManager();
+ std::vector<SplitPointPair> splitPoints =
+ aFM.getSplitPoints(m_segment->getAudioFileId(),
+ startTime,
+ endTime,
+ threshold);
+
+ std::vector<SplitPointPair>::iterator it;
+ std::vector<QCanvasRectangle*> tempRects;
+
+ RealTime length = endTime - startTime;
+ double ticksPerUsec = double(m_previewWidth) /
+ double((length.sec * 1000000.0) + length.usec());
+
+ int startX = (m_canvasWidth - m_previewWidth) / 2;
+ int halfHeight = m_canvasHeight / 2;
+ int x1, x2;
+ int overlapHeight = 10;
+
+ for (it = splitPoints.begin(); it != splitPoints.end(); it++) {
+ RealTime splitStart = it->first - startTime;
+ RealTime splitEnd = it->second - startTime;
+
+ x1 = int(ticksPerUsec * double(double(splitStart.sec) *
+ 1000000.0 + (double)splitStart.usec()));
+
+ x2 = int(ticksPerUsec * double(double(splitEnd.sec) *
+ 1000000.0 + double(splitEnd.usec())));
+
+ QCanvasRectangle *rect = new QCanvasRectangle(m_canvas);
+ rect->setX(startX + x1);
+ rect->setY(halfHeight - m_previewHeight / 2 - overlapHeight / 2);
+ rect->setZ(2);
+ rect->setSize(x2 - x1, m_previewHeight + overlapHeight);
+ rect->setPen(kapp->
+ palette().color(QPalette::Active, QColorGroup::Mid));
+ rect->setBrush(kapp->
+ palette().color(QPalette::Active, QColorGroup::Mid));
+ rect->setVisible(true);
+ tempRects.push_back(rect);
+ }
+
+ std::vector<QCanvasRectangle*>::iterator pIt;
+
+ // We've written the new Rects, now delete the old ones
+ //
+ if (m_previewBoxes.size()) {
+ // clear any previous preview boxes
+ //
+ for (pIt = m_previewBoxes.begin(); pIt != m_previewBoxes.end(); pIt++) {
+ //(*pIt)->setVisible(false);
+ delete (*pIt);
+ }
+ m_previewBoxes.erase(m_previewBoxes.begin(), m_previewBoxes.end());
+ m_canvas->update();
+ }
+ m_canvas->update();
+
+ // Now store the new ones
+ //
+ for (pIt = tempRects.begin(); pIt != tempRects.end(); pIt++)
+ m_previewBoxes.push_back(*pIt);
+}
+
+void
+AudioSplitDialog::slotThresholdChanged(int threshold)
+{
+ drawSplits(threshold);
+}
+
+}
+#include "AudioSplitDialog.moc"
diff --git a/src/gui/dialogs/AudioSplitDialog.h b/src/gui/dialogs/AudioSplitDialog.h
new file mode 100644
index 0000000..7dc52c0
--- /dev/null
+++ b/src/gui/dialogs/AudioSplitDialog.h
@@ -0,0 +1,88 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_AUDIOSPLITDIALOG_H_
+#define _RG_AUDIOSPLITDIALOG_H_
+
+#include <kdialogbase.h>
+#include <vector>
+#include <qspinbox.h>
+
+
+class QWidget;
+class QCanvasView;
+class QCanvasRectangle;
+class QCanvas;
+
+
+namespace Rosegarden
+{
+
+class Segment;
+class RosegardenGUIDoc;
+
+
+class AudioSplitDialog : public KDialogBase
+{
+ Q_OBJECT
+public:
+ AudioSplitDialog(QWidget *parent,
+ Segment *segment,
+ RosegardenGUIDoc *doc);
+
+ // Draw an audio preview over the segment and draw
+ // the potential splits along it.
+ //
+ void drawPreview();
+ void drawSplits(int threshold);
+
+ // Get the threshold
+ //
+ int getThreshold() { return m_thresholdSpin->value(); }
+
+public slots:
+ void slotThresholdChanged(int);
+
+protected:
+ RosegardenGUIDoc *m_doc;
+ Segment *m_segment;
+ QCanvas *m_canvas;
+ QCanvasView *m_canvasView;
+ QSpinBox *m_thresholdSpin;
+
+ int m_canvasWidth;
+ int m_canvasHeight;
+ int m_previewWidth;
+ int m_previewHeight;
+
+ std::vector<QCanvasRectangle*> m_previewBoxes;
+
+};
+
+
+
+}
+
+#endif
diff --git a/src/gui/dialogs/BeatsBarsDialog.cpp b/src/gui/dialogs/BeatsBarsDialog.cpp
new file mode 100644
index 0000000..774ddb9
--- /dev/null
+++ b/src/gui/dialogs/BeatsBarsDialog.cpp
@@ -0,0 +1,66 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "BeatsBarsDialog.h"
+#include <qlayout.h>
+
+#include <klocale.h>
+#include "base/Segment.h"
+#include <kcombobox.h>
+#include <kdialogbase.h>
+#include <qframe.h>
+#include <qgroupbox.h>
+#include <qhbox.h>
+#include <qspinbox.h>
+#include <qwidget.h>
+
+
+namespace Rosegarden
+{
+
+BeatsBarsDialog::BeatsBarsDialog(QWidget* parent) :
+ KDialogBase(parent, 0, true, i18n("Audio Segment Duration"),
+ Ok | Cancel, Ok)
+{
+ QHBox *hbox = makeHBoxMainWidget();
+
+ QGroupBox *gbox = new QGroupBox(1, Horizontal,
+ i18n("The selected audio segment contains:"), hbox);
+
+ QFrame *frame = new QFrame(gbox);
+ QGridLayout *layout = new QGridLayout(frame, 1, 2, 5, 5);
+
+ m_spinBox = new QSpinBox(1, INT_MAX, 1, frame, "glee");
+ layout->addWidget(m_spinBox, 0, 0);
+
+ m_comboBox = new KComboBox(false, frame);
+ m_comboBox->insertItem(i18n("beat(s)"));
+ m_comboBox->insertItem(i18n("bar(s)"));
+ m_comboBox->setCurrentItem(0);
+ layout->addWidget(m_comboBox, 0, 1);
+}
+
+}
+#include "BeatsBarsDialog.moc"
diff --git a/src/gui/dialogs/BeatsBarsDialog.h b/src/gui/dialogs/BeatsBarsDialog.h
new file mode 100644
index 0000000..6546f01
--- /dev/null
+++ b/src/gui/dialogs/BeatsBarsDialog.h
@@ -0,0 +1,63 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_BEATSBARSDIALOG_H_
+#define _RG_BEATSBARSDIALOG_H_
+
+#include <kdialogbase.h>
+#include <qspinbox.h>
+#include <kcombobox.h>
+
+class QWidget;
+
+
+namespace Rosegarden
+{
+
+/**
+ * ask the user to give us information about the selected audio segment for
+ * Tempo calculations
+ */
+class BeatsBarsDialog : public KDialogBase
+{
+ Q_OBJECT
+
+public:
+ BeatsBarsDialog();
+ BeatsBarsDialog(QWidget *parent);
+
+ int getQuantity() { return m_spinBox->value(); }
+ int getMode() { return m_comboBox->currentItem(); }
+
+protected:
+ QSpinBox *m_spinBox;
+ KComboBox *m_comboBox;
+};
+
+
+
+}
+
+#endif
diff --git a/src/gui/dialogs/ClefDialog.cpp b/src/gui/dialogs/ClefDialog.cpp
new file mode 100644
index 0000000..8f802b0
--- /dev/null
+++ b/src/gui/dialogs/ClefDialog.cpp
@@ -0,0 +1,273 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "ClefDialog.h"
+
+#include "base/NotationTypes.h"
+#include "gui/editors/notation/NotePixmapFactory.h"
+#include "gui/widgets/BigArrowButton.h"
+#include <klocale.h>
+#include <kdialogbase.h>
+#include <qbuttongroup.h>
+#include <qgroupbox.h>
+#include <qhbox.h>
+#include <qlabel.h>
+#include <qobject.h>
+#include <qpixmap.h>
+#include <qradiobutton.h>
+#include <qstring.h>
+#include <qtooltip.h>
+#include <qvbox.h>
+#include <qwidget.h>
+
+
+namespace Rosegarden
+{
+
+ClefDialog::ClefDialog(QWidget *parent,
+ NotePixmapFactory *npf,
+ Clef defaultClef,
+ bool showConversionOptions) :
+ KDialogBase(parent, 0, true, i18n("Clef"), Ok | Cancel | Help),
+ m_notePixmapFactory(npf),
+ m_clef(defaultClef)
+{
+ setHelp("nv-signatures-clef");
+
+ QVBox *vbox = makeVBoxMainWidget();
+
+ QGroupBox *clefFrame = new QGroupBox
+ (1, Horizontal, i18n("Clef"), vbox);
+
+ QButtonGroup *conversionFrame = new QButtonGroup
+ (1, Horizontal, i18n("Existing notes following clef change"), vbox);
+
+ QHBox *clefBox = new QHBox(clefFrame);
+
+ BigArrowButton *clefDown = new BigArrowButton(clefBox, Qt::LeftArrow);
+ QToolTip::add
+ (clefDown, i18n("Lower clef"));
+
+ QHBox *clefLabelBox = new QVBox(clefBox);
+
+ m_octaveUp = new BigArrowButton(clefLabelBox, Qt::UpArrow);
+ QToolTip::add
+ (m_octaveUp, i18n("Up an Octave"));
+
+ m_clefLabel = new QLabel(i18n("Clef"), clefLabelBox);
+ m_clefLabel->setAlignment(AlignVCenter | AlignHCenter);
+
+ m_octaveDown = new BigArrowButton(clefLabelBox, Qt::DownArrow);
+ QToolTip::add
+ (m_octaveDown, i18n("Down an Octave"));
+
+ BigArrowButton *clefUp = new BigArrowButton(clefBox, Qt::RightArrow);
+ QToolTip::add
+ (clefUp, i18n("Higher clef"));
+
+ m_clefNameLabel = new QLabel(i18n("Clef"), clefLabelBox);
+ m_clefNameLabel->setAlignment(AlignVCenter | AlignHCenter);
+
+ if (showConversionOptions) {
+ m_noConversionButton =
+ new QRadioButton
+ (i18n("Maintain current pitches"), conversionFrame);
+ m_changeOctaveButton =
+ new QRadioButton
+ (i18n("Transpose into appropriate octave"), conversionFrame);
+ m_transposeButton = 0;
+
+ //!!! why aren't we offering this option? does it not work? too difficult to describe?
+ // m_transposeButton =
+ // new QRadioButton
+ // (i18n("Maintain current positions on the staff"), conversionFrame);
+ m_changeOctaveButton->setChecked(true);
+ } else {
+ m_noConversionButton = 0;
+ m_changeOctaveButton = 0;
+ m_transposeButton = 0;
+ conversionFrame->hide();
+ }
+
+ QObject::connect(clefUp, SIGNAL(clicked()), this, SLOT(slotClefUp()));
+ QObject::connect(clefDown, SIGNAL(clicked()), this, SLOT(slotClefDown()));
+ QObject::connect(m_octaveUp, SIGNAL(clicked()), this, SLOT(slotOctaveUp()));
+ QObject::connect(m_octaveDown, SIGNAL(clicked()), this, SLOT(slotOctaveDown()));
+
+ redrawClefPixmap();
+}
+
+Clef
+ClefDialog::getClef() const
+{
+ return m_clef;
+}
+
+ClefDialog::ConversionType
+
+ClefDialog::getConversionType() const
+{
+ if (m_noConversionButton && m_noConversionButton->isChecked()) {
+ return NoConversion;
+ } else if (m_changeOctaveButton && m_changeOctaveButton->isChecked()) {
+ return ChangeOctave;
+ } else if (m_transposeButton && m_transposeButton->isChecked()) {
+ return Transpose;
+ }
+ return NoConversion;
+}
+
+void
+ClefDialog::slotClefUp()
+{
+ int octaveOffset = m_clef.getOctaveOffset();
+ Clef::ClefList clefs(Clef::getClefs());
+
+ for (Clef::ClefList::iterator i = clefs.begin();
+ i != clefs.end(); ++i) {
+
+ if (m_clef.getClefType() == i->getClefType()) {
+ if (++i == clefs.end())
+ i = clefs.begin();
+ m_clef = Clef(i->getClefType(), octaveOffset);
+ break;
+ }
+ }
+
+ redrawClefPixmap();
+}
+
+void
+ClefDialog::slotClefDown()
+{
+ int octaveOffset = m_clef.getOctaveOffset();
+ Clef::ClefList clefs(Clef::getClefs());
+
+ for (Clef::ClefList::iterator i = clefs.begin();
+ i != clefs.end(); ++i) {
+
+ if (m_clef.getClefType() == i->getClefType()) {
+ if (i == clefs.begin())
+ i = clefs.end();
+ --i;
+ m_clef = Clef(i->getClefType(), octaveOffset);
+ break;
+ }
+ }
+
+ redrawClefPixmap();
+}
+
+void
+ClefDialog::slotOctaveUp()
+{
+ int octaveOffset = m_clef.getOctaveOffset();
+ if (octaveOffset == 2)
+ return ;
+
+ ++octaveOffset;
+
+ m_octaveDown->setEnabled(true);
+ if (octaveOffset == 2) {
+ m_octaveUp->setEnabled(false);
+ }
+
+ m_clef = Clef(m_clef.getClefType(), octaveOffset);
+ redrawClefPixmap();
+}
+
+void
+ClefDialog::slotOctaveDown()
+{
+ int octaveOffset = m_clef.getOctaveOffset();
+ if (octaveOffset == -2)
+ return ;
+
+ --octaveOffset;
+
+ m_octaveUp->setEnabled(true);
+ if (octaveOffset == 2) {
+ m_octaveDown->setEnabled(false);
+ }
+
+ m_clef = Clef(m_clef.getClefType(), octaveOffset);
+ redrawClefPixmap();
+}
+
+void
+ClefDialog::redrawClefPixmap()
+{
+ QPixmap pmap = NotePixmapFactory::toQPixmap
+ (m_notePixmapFactory->makeClefDisplayPixmap(m_clef));
+ m_clefLabel->setPixmap(pmap);
+
+ QString name;
+ int octave = m_clef.getOctaveOffset();
+
+ switch (octave) {
+ case - 1:
+ name = i18n("%1 down an octave");
+ break;
+ case - 2:
+ name = i18n("%1 down two octaves");
+ break;
+ case 1:
+ name = i18n("%1 up an octave");
+ break;
+ case 2:
+ name = i18n("%1 up two octaves");
+ break;
+ default:
+ name = "%1";
+ break;
+ }
+
+ std::string type = m_clef.getClefType();
+ if (type == Clef::Treble)
+ name = name.arg(i18n("Treble"));
+ else if (type == Clef::French)
+ name = name.arg(i18n("French violin"));
+ else if (type == Clef::Soprano)
+ name = name.arg(i18n("Soprano"));
+ else if (type == Clef::Mezzosoprano)
+ name = name.arg(i18n("Mezzo-soprano"));
+ else if (type == Clef::Alto)
+ name = name.arg(i18n("Alto"));
+ else if (type == Clef::Tenor)
+ name = name.arg(i18n("Tenor"));
+ else if (type == Clef::Baritone)
+ name = name.arg(i18n("C-baritone"));
+ else if (type == Clef::Varbaritone)
+ name = name.arg(i18n("F-baritone"));
+ else if (type == Clef::Bass)
+ name = name.arg(i18n("Bass"));
+ else if (type == Clef::Subbass)
+ name = name.arg(i18n("Sub-bass"));
+
+ m_clefNameLabel->setText(name);
+}
+
+}
+#include "ClefDialog.moc"
diff --git a/src/gui/dialogs/ClefDialog.h b/src/gui/dialogs/ClefDialog.h
new file mode 100644
index 0000000..771cd4a
--- /dev/null
+++ b/src/gui/dialogs/ClefDialog.h
@@ -0,0 +1,93 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_CLEFDIALOG_H_
+#define _RG_CLEFDIALOG_H_
+
+#include "base/NotationTypes.h"
+#include <kdialogbase.h>
+
+
+class QWidget;
+class QRadioButton;
+class QLabel;
+
+
+namespace Rosegarden
+{
+
+class BigArrowButton;
+class NotePixmapFactory;
+
+
+class ClefDialog : public KDialogBase
+{
+ Q_OBJECT
+
+public:
+ enum ConversionType {
+ NoConversion,
+ ChangeOctave,
+ Transpose,
+ };
+
+ ClefDialog(QWidget *parent,
+ NotePixmapFactory *npf,
+ Clef defaultClef,
+ bool showConversionOptions = true);
+
+ Clef getClef() const;
+ ConversionType getConversionType() const;
+
+public slots:
+ void slotClefUp();
+ void slotClefDown();
+ void slotOctaveUp();
+ void slotOctaveDown();
+
+protected:
+ void redrawClefPixmap();
+
+ //--------------- Data members ---------------------------------
+
+ NotePixmapFactory *m_notePixmapFactory;
+ Clef m_clef;
+
+ QLabel *m_clefLabel;
+ QLabel *m_clefNameLabel;
+
+ BigArrowButton *m_octaveUp;
+ BigArrowButton *m_octaveDown;
+
+ QRadioButton *m_noConversionButton;
+ QRadioButton *m_changeOctaveButton;
+ QRadioButton *m_transposeButton;
+};
+
+
+
+}
+
+#endif
diff --git a/src/gui/dialogs/CompositionLengthDialog.cpp b/src/gui/dialogs/CompositionLengthDialog.cpp
new file mode 100644
index 0000000..24a3107
--- /dev/null
+++ b/src/gui/dialogs/CompositionLengthDialog.cpp
@@ -0,0 +1,84 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "CompositionLengthDialog.h"
+
+#include <klocale.h>
+#include "base/Composition.h"
+#include <kdialogbase.h>
+#include <qhbox.h>
+#include <qlabel.h>
+#include <qspinbox.h>
+#include <qvbox.h>
+#include <qwidget.h>
+
+
+namespace Rosegarden
+{
+
+CompositionLengthDialog::CompositionLengthDialog(
+ QWidget *parent,
+ Composition *composition):
+ KDialogBase(parent, 0, true, i18n("Change Composition Length"),
+ Ok | Cancel),
+ m_composition(composition)
+{
+ QVBox *vBox = makeVBoxMainWidget();
+
+ new QLabel(i18n("Set the Start and End bar markers for this Composition"),
+ vBox);
+
+ QHBox *startBox = new QHBox(vBox);
+ new QLabel(i18n("Start Bar"), startBox);
+ m_startMarkerSpinBox = new QSpinBox(startBox);
+ m_startMarkerSpinBox->setMinValue( -10);
+ m_startMarkerSpinBox->setMaxValue(10000);
+ m_startMarkerSpinBox->setValue(
+ m_composition->getBarNumber(m_composition->getStartMarker()) + 1);
+
+ QHBox *endBox = new QHBox(vBox);
+ new QLabel(i18n("End Bar"), endBox);
+ m_endMarkerSpinBox = new QSpinBox(endBox);
+ m_endMarkerSpinBox->setMinValue( -10);
+ m_endMarkerSpinBox->setMaxValue(10000);
+ m_endMarkerSpinBox->setValue(
+ m_composition->getBarNumber(m_composition->getEndMarker()));
+
+}
+
+timeT
+CompositionLengthDialog::getStartMarker()
+{
+ return m_composition->getBarStart(m_startMarkerSpinBox->value() - 1);
+}
+
+timeT
+CompositionLengthDialog::getEndMarker()
+{
+ return m_composition->getBarStart(m_endMarkerSpinBox->value());
+}
+
+}
+#include "CompositionLengthDialog.moc"
diff --git a/src/gui/dialogs/CompositionLengthDialog.h b/src/gui/dialogs/CompositionLengthDialog.h
new file mode 100644
index 0000000..e6d688c
--- /dev/null
+++ b/src/gui/dialogs/CompositionLengthDialog.h
@@ -0,0 +1,64 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_COMPOSITIONLENGTHDIALOG_H_
+#define _RG_COMPOSITIONLENGTHDIALOG_H_
+
+#include <kdialogbase.h>
+#include "base/Event.h"
+
+
+class QWidget;
+class QSpinBox;
+
+
+namespace Rosegarden
+{
+
+class Composition;
+
+
+class CompositionLengthDialog : public KDialogBase
+{
+ Q_OBJECT
+public:
+ CompositionLengthDialog(QWidget *parent,
+ Composition *composition);
+
+ timeT getStartMarker();
+ timeT getEndMarker();
+
+protected:
+
+ QSpinBox *m_startMarkerSpinBox;
+ QSpinBox *m_endMarkerSpinBox;
+ Composition *m_composition;
+};
+
+
+
+}
+
+#endif
diff --git a/src/gui/dialogs/ConfigureDialog.cpp b/src/gui/dialogs/ConfigureDialog.cpp
new file mode 100644
index 0000000..1bdd3b4
--- /dev/null
+++ b/src/gui/dialogs/ConfigureDialog.cpp
@@ -0,0 +1,118 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "ConfigureDialog.h"
+#include <qlayout.h>
+
+#include <klocale.h>
+#include "ConfigureDialogBase.h"
+#include "document/RosegardenGUIDoc.h"
+#include "gui/configuration/GeneralConfigurationPage.h"
+#include "gui/configuration/NotationConfigurationPage.h"
+#include "gui/configuration/AudioConfigurationPage.h"
+#include "gui/configuration/MIDIConfigurationPage.h"
+#include <kconfig.h>
+#include <kdialogbase.h>
+#include <kstddirs.h>
+#include <qstring.h>
+#include <qwidget.h>
+
+
+namespace Rosegarden
+{
+
+static QPixmap loadIcon(const char *name)
+{
+ QString pixmapDir = KGlobal::dirs()->findResource("appdata", "pixmaps/");
+ QString fileBase = pixmapDir + "/misc/";
+ fileBase += name;
+ if (QFile(fileBase + ".png").exists()) {
+ return QPixmap(fileBase + ".png");
+ } else if (QFile(fileBase + ".xpm").exists()) {
+ return QPixmap(fileBase + ".xpm");
+ }
+ QPixmap pmap = KGlobal::instance()->iconLoader()
+ ->loadIcon(QString::fromLatin1(name), KIcon::NoGroup, KIcon::SizeMedium);
+ return pmap;
+}
+
+
+ConfigureDialog::ConfigureDialog(RosegardenGUIDoc *doc,
+ KConfig* cfg,
+ QWidget *parent,
+ const char *name)
+ : ConfigureDialogBase(parent, i18n("Configure Rosegarden"), name)
+{
+ QWidget *pageWidget = 0;
+ QVBoxLayout *vlay = 0;
+ ConfigurationPage* page = 0;
+
+ // General Page
+ //
+ pageWidget = addPage(GeneralConfigurationPage::iconLabel(),
+ GeneralConfigurationPage::title(),
+ loadIcon(GeneralConfigurationPage::iconName()));
+ vlay = new QVBoxLayout(pageWidget, 0, spacingHint());
+ page = new GeneralConfigurationPage(doc, cfg, pageWidget);
+ vlay->addWidget(page);
+ page->setPageIndex(pageIndex(pageWidget));
+ m_configurationPages.push_back(page);
+
+ connect(page, SIGNAL(updateAutoSaveInterval(unsigned int)),
+ this, SIGNAL(updateAutoSaveInterval(unsigned int)));
+ connect(page, SIGNAL(updateSidebarStyle(unsigned int)),
+ this, SIGNAL(updateSidebarStyle(unsigned int)));
+
+ pageWidget = addPage(MIDIConfigurationPage::iconLabel(),
+ MIDIConfigurationPage::title(),
+ loadIcon(MIDIConfigurationPage::iconName()));
+ vlay = new QVBoxLayout(pageWidget, 0, spacingHint());
+ page = new MIDIConfigurationPage(doc, cfg, pageWidget);
+ vlay->addWidget(page);
+ page->setPageIndex(pageIndex(pageWidget));
+ m_configurationPages.push_back(page);
+
+ pageWidget = addPage(AudioConfigurationPage::iconLabel(),
+ AudioConfigurationPage::title(),
+ loadIcon(AudioConfigurationPage::iconName()));
+ vlay = new QVBoxLayout(pageWidget, 0, spacingHint());
+ page = new AudioConfigurationPage(doc, cfg, pageWidget);
+ vlay->addWidget(page);
+ page->setPageIndex(pageIndex(pageWidget));
+ m_configurationPages.push_back(page);
+
+ // Notation Page
+ pageWidget = addPage(NotationConfigurationPage::iconLabel(),
+ NotationConfigurationPage::title(),
+ loadIcon(NotationConfigurationPage::iconName()));
+ vlay = new QVBoxLayout(pageWidget, 0, spacingHint());
+ page = new NotationConfigurationPage(cfg, pageWidget);
+ vlay->addWidget(page);
+ page->setPageIndex(pageIndex(pageWidget));
+ m_configurationPages.push_back(page);
+}
+
+}
+#include "ConfigureDialog.moc"
diff --git a/src/gui/dialogs/ConfigureDialog.h b/src/gui/dialogs/ConfigureDialog.h
new file mode 100644
index 0000000..4dd6fff
--- /dev/null
+++ b/src/gui/dialogs/ConfigureDialog.h
@@ -0,0 +1,58 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_CONFIGUREDIALOG_H_
+#define _RG_CONFIGUREDIALOG_H_
+
+#include "ConfigureDialogBase.h"
+
+
+class QWidget;
+class KConfig;
+
+
+namespace Rosegarden
+{
+
+class RosegardenGUIDoc;
+
+
+class ConfigureDialog : public ConfigureDialogBase
+{
+ Q_OBJECT
+public:
+ ConfigureDialog(RosegardenGUIDoc *doc,
+ KConfig* cfg,
+ QWidget *parent=0,
+ const char *name=0);
+signals:
+ void updateAutoSaveInterval(unsigned int);
+ void updateSidebarStyle(unsigned int);
+};
+
+
+}
+
+#endif
diff --git a/src/gui/dialogs/ConfigureDialogBase.cpp b/src/gui/dialogs/ConfigureDialogBase.cpp
new file mode 100644
index 0000000..7d5555a
--- /dev/null
+++ b/src/gui/dialogs/ConfigureDialogBase.cpp
@@ -0,0 +1,76 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "ConfigureDialogBase.h"
+
+#include <klocale.h>
+#include "gui/configuration/ConfigurationPage.h"
+#include <kdialogbase.h>
+#include <qstring.h>
+#include <qwidget.h>
+
+
+namespace Rosegarden
+{
+
+ConfigureDialogBase::ConfigureDialogBase(QWidget *parent,
+ QString label,
+ const char *name):
+ KDialogBase(IconList, label ? label : i18n("Configure"), Help | Apply | Ok | Cancel,
+ Ok, parent, name, true) // modal
+{
+ setWFlags(WDestructiveClose);
+}
+
+ConfigureDialogBase::~ConfigureDialogBase()
+{}
+
+void
+ConfigureDialogBase::slotApply()
+{
+ for (configurationpages::iterator i = m_configurationPages.begin();
+ i != m_configurationPages.end(); ++i)
+ (*i)->apply();
+}
+
+void
+ConfigureDialogBase::slotActivateApply()
+{
+ // ApplyButton->setDisabled(false);
+}
+
+void
+ConfigureDialogBase::slotOk()
+{
+ slotApply();
+ accept();
+}
+
+void
+ConfigureDialogBase::slotCancelOrClose()
+{}
+
+}
+#include "ConfigureDialogBase.moc"
diff --git a/src/gui/dialogs/ConfigureDialogBase.h b/src/gui/dialogs/ConfigureDialogBase.h
new file mode 100644
index 0000000..fe05ebe
--- /dev/null
+++ b/src/gui/dialogs/ConfigureDialogBase.h
@@ -0,0 +1,69 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_CONFIGUREDIALOGBASE_H_
+#define _RG_CONFIGUREDIALOGBASE_H_
+
+#include <kdialogbase.h>
+#include <qstring.h>
+#include <vector>
+
+
+class QWidget;
+
+
+namespace Rosegarden
+{
+
+class ConfigurationPage;
+
+
+class ConfigureDialogBase : public KDialogBase
+{
+ Q_OBJECT
+public:
+ ConfigureDialogBase(QWidget *parent=0,
+ QString label = 0,
+ const char *name=0);
+ virtual ~ConfigureDialogBase();
+
+ typedef std::vector<ConfigurationPage*> configurationpages;
+
+protected slots:
+ virtual void slotOk();
+ virtual void slotApply();
+ virtual void slotCancelOrClose();
+
+ virtual void slotActivateApply();
+
+protected:
+
+ configurationpages m_configurationPages;
+};
+
+
+}
+
+#endif
diff --git a/src/gui/dialogs/CountdownBar.cpp b/src/gui/dialogs/CountdownBar.cpp
new file mode 100644
index 0000000..cfad3d8
--- /dev/null
+++ b/src/gui/dialogs/CountdownBar.cpp
@@ -0,0 +1,68 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "CountdownBar.h"
+
+#include "gui/general/GUIPalette.h"
+#include <qframe.h>
+#include <qpainter.h>
+#include <qwidget.h>
+
+
+namespace Rosegarden
+{
+
+CountdownBar::CountdownBar(QWidget *parent, int width, int height):
+ QFrame(parent), m_width(width), m_height(height), m_position(0)
+{
+ resize(m_width, m_height);
+ repaint();
+}
+
+void
+CountdownBar::paintEvent(QPaintEvent *e)
+{
+ QPainter p(this);
+
+ p.setClipRegion(e->region());
+ p.setClipRect(e->rect().normalize());
+
+ p.setPen(GUIPalette::getColour(GUIPalette::AudioCountdownBackground));
+ p.setBrush(GUIPalette::getColour(GUIPalette::AudioCountdownBackground));
+ p.drawRect(0, 0, m_position, m_height);
+ p.setPen(GUIPalette::getColour(GUIPalette::AudioCountdownForeground));
+ p.setBrush(GUIPalette::getColour(GUIPalette::AudioCountdownForeground));
+ p.drawRect(m_position, 0, m_width, m_height);
+}
+
+void
+CountdownBar::setPosition(int position)
+{
+ m_position = position;
+ repaint();
+}
+
+}
+#include "CountdownBar.moc"
diff --git a/src/gui/dialogs/CountdownBar.h b/src/gui/dialogs/CountdownBar.h
new file mode 100644
index 0000000..364d0cf
--- /dev/null
+++ b/src/gui/dialogs/CountdownBar.h
@@ -0,0 +1,59 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_COUNTDOWNBAR_H_
+#define _RG_COUNTDOWNBAR_H_
+
+#include <qframe.h>
+
+
+class QWidget;
+class QPaintEvent;
+
+
+namespace Rosegarden
+{
+
+
+
+class CountdownBar : public QFrame
+{
+ Q_OBJECT
+public:
+ CountdownBar(QWidget *parent, int width, int height);
+ void setPosition(int position);
+
+protected:
+ virtual void paintEvent(QPaintEvent *e);
+
+ int m_width;
+ int m_height;
+ int m_position;
+};
+
+
+}
+
+#endif
diff --git a/src/gui/dialogs/CountdownDialog.cpp b/src/gui/dialogs/CountdownDialog.cpp
new file mode 100644
index 0000000..f624aba
--- /dev/null
+++ b/src/gui/dialogs/CountdownDialog.cpp
@@ -0,0 +1,159 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "CountdownDialog.h"
+#include <qlayout.h>
+
+#include <klocale.h>
+#include "CountdownBar.h"
+#include <qaccel.h>
+#include <qdialog.h>
+#include <qhbox.h>
+#include <qlabel.h>
+#include <qpushbutton.h>
+#include <qstring.h>
+#include <qwidget.h>
+#include "misc/Debug.h"
+
+
+namespace Rosegarden
+{
+
+CountdownDialog::CountdownDialog(QWidget *parent, int seconds):
+ QDialog(parent, "", false, WStyle_StaysOnTop | WStyle_DialogBorder),
+ m_pastEndMode(false),
+ m_totalTime(seconds),
+ m_progressBarWidth(150),
+ m_progressBarHeight(15)
+{
+ QBoxLayout *layout = new QBoxLayout(this, QBoxLayout::TopToBottom, 10, 14);
+ setCaption(i18n("Recording..."));
+
+ QHBox *hBox = new QHBox(this);
+ m_label = new QLabel(hBox);
+ m_time = new QLabel(hBox);
+
+ layout->addWidget(hBox, 0, AlignCenter);
+
+ m_label->setText(i18n("Recording time remaining: "));
+ m_progressBar =
+ new CountdownBar(this, m_progressBarWidth, m_progressBarHeight);
+
+ m_progressBar->setFixedSize(m_progressBarWidth, m_progressBarHeight);
+
+ // Simply re-emit from Stop button
+ //
+ m_stopButton = new QPushButton(i18n("Stop"), this);
+ m_stopButton->setFixedWidth(60);
+
+ layout->addWidget(m_progressBar, 0, AlignCenter);
+ layout->addWidget(m_stopButton, 0, AlignRight);
+
+ connect (m_stopButton, SIGNAL(released()), this, SIGNAL(stopped()));
+
+ // Set the total time to show the bar in initial position
+ //
+ setElapsedTime(0);
+
+ m_accelerators = new QAccel(this);
+
+}
+
+void
+CountdownDialog::setLabel(const QString &label)
+{
+ m_label->setText(label);
+}
+
+void
+CountdownDialog::setTotalTime(int seconds)
+{
+ m_totalTime = seconds;
+ setElapsedTime(0); // clear
+}
+
+void
+CountdownDialog::setElapsedTime(int elapsedSeconds)
+{
+ int seconds = m_totalTime - elapsedSeconds;
+
+ if (seconds < 0) {
+ seconds = - seconds;
+ if (!m_pastEndMode)
+ setPastEndMode();
+ }
+
+ QString h, m, s;
+ h.sprintf("%02d", seconds / 3600);
+ m.sprintf("%02d", seconds / 60);
+ s.sprintf("%02d", seconds % 60);
+
+ if (seconds < 3600) // less than an hour
+ {
+ m_time->setText(QString("%1:%2").arg(m).arg(s));
+ } else if (seconds < 86400) // less than a day
+ {
+ m_time->setText(QString("%1:%2:%3").arg(h).arg(m).arg(s));
+ } else {
+ m_time->setText(i18n("Just how big is your hard disk?"));
+ }
+
+ // Draw the progress bar
+ //
+ if (m_pastEndMode) {
+ m_progressBar->setPosition(m_progressBarWidth);
+ } else {
+ // Attempt a simplistic fix for #1838190. In the context of an isolated
+ // test example, I'm fairly sure m_totalTime was 0, causing a divide by
+ // zero error, though the trace just listed it as an "Arithmetic
+ // exception."
+ if (m_totalTime == 0) {
+ RG_DEBUG << "CountdownDialog::setElapsedTime: FAILSAFE CODE FIRED, see bug #1838190 for details" << endl;
+ m_totalTime = 1;
+ }
+ int barPosition = m_progressBarWidth -
+ (elapsedSeconds * m_progressBarWidth) / m_totalTime;
+ m_progressBar->setPosition(barPosition);
+ }
+
+ // Dialog complete if the display time is zero
+ if (seconds == 0)
+ emit completed();
+
+}
+
+void
+CountdownDialog::setPastEndMode()
+{
+ if (m_pastEndMode) // already called
+ return ;
+
+ m_pastEndMode = true;
+ m_label->setText(i18n("Recording beyond end of composition: "));
+
+}
+
+}
+#include "CountdownDialog.moc"
diff --git a/src/gui/dialogs/CountdownDialog.h b/src/gui/dialogs/CountdownDialog.h
new file mode 100644
index 0000000..00aa6e0
--- /dev/null
+++ b/src/gui/dialogs/CountdownDialog.h
@@ -0,0 +1,87 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_COUNTDOWNDIALOG_H_
+#define _RG_COUNTDOWNDIALOG_H_
+
+#include <kdialogbase.h>
+#include <qdialog.h>
+
+
+class QWidget;
+class QString;
+class QPushButton;
+class QLabel;
+class QAccel;
+
+
+namespace Rosegarden
+{
+
+class CountdownBar;
+
+
+class CountdownDialog : public QDialog // KDialogBase
+{
+ Q_OBJECT
+
+public:
+ CountdownDialog(QWidget *parent, int seconds = 300);
+
+ void setLabel(const QString &label);
+ void setElapsedTime(int seconds);
+
+ int getTotalTime() const { return m_totalTime; }
+ void setTotalTime(int seconds);
+
+ QAccel* getAccelerators() { return m_accelerators; }
+
+signals:
+ void completed(); // m_totalTime has elapsed
+ void stopped(); // someone pushed the stop button
+
+protected:
+ void setPastEndMode();
+
+ bool m_pastEndMode;
+
+ int m_totalTime;
+
+ QLabel *m_label;
+ QLabel *m_time;
+ CountdownBar *m_progressBar;
+
+ QPushButton *m_stopButton;
+
+ int m_progressBarWidth;
+ int m_progressBarHeight;
+
+ QAccel *m_accelerators;
+};
+
+
+}
+
+#endif
diff --git a/src/gui/dialogs/DocumentConfigureDialog.cpp b/src/gui/dialogs/DocumentConfigureDialog.cpp
new file mode 100644
index 0000000..5f79f33
--- /dev/null
+++ b/src/gui/dialogs/DocumentConfigureDialog.cpp
@@ -0,0 +1,151 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "DocumentConfigureDialog.h"
+#include <qlayout.h>
+
+#include <klocale.h>
+#include "ConfigureDialogBase.h"
+#include "document/RosegardenGUIDoc.h"
+#include "gui/configuration/AudioPropertiesPage.h"
+#include "gui/configuration/ColourConfigurationPage.h"
+#include "gui/configuration/DocumentMetaConfigurationPage.h"
+#include "gui/configuration/GeneralConfigurationPage.h"
+#include <kdialogbase.h>
+#include <qstring.h>
+#include <qwidget.h>
+#include <kstddirs.h>
+
+
+namespace Rosegarden
+{
+static QPixmap loadIcon(const char *name)
+{
+ QString pixmapDir = KGlobal::dirs()->findResource("appdata", "pixmaps/");
+ QString fileBase = pixmapDir + "/misc/";
+ fileBase += name;
+ if (QFile(fileBase + ".png").exists()) {
+ return QPixmap(fileBase + ".png");
+ } else if (QFile(fileBase + ".xpm").exists()) {
+ return QPixmap(fileBase + ".xpm");
+ }
+
+ QPixmap pmap = KGlobal::instance()->iconLoader()
+ ->loadIcon(QString::fromLatin1(name), KIcon::NoGroup, KIcon::SizeMedium);
+ return pmap;
+}
+
+
+DocumentConfigureDialog::DocumentConfigureDialog(RosegardenGUIDoc *doc,
+ QWidget *parent,
+ const char *name)
+ : ConfigureDialogBase(parent, i18n("Document Properties"), name)
+{
+ QWidget *pageWidget = 0;
+ QVBoxLayout *vlay = 0;
+ ConfigurationPage* page = 0;
+
+ // Document Meta Page
+ //
+ pageWidget = addPage(DocumentMetaConfigurationPage::iconLabel(),
+ DocumentMetaConfigurationPage::title(),
+ loadIcon(DocumentMetaConfigurationPage::iconName()));
+ vlay = new QVBoxLayout(pageWidget, 0, spacingHint());
+ page = new DocumentMetaConfigurationPage(doc, pageWidget);
+ vlay->addWidget(page);
+ page->setPageIndex(pageIndex(pageWidget));
+ m_configurationPages.push_back(page);
+
+ // Audio Page
+ //
+ pageWidget = addPage(AudioPropertiesPage::iconLabel(),
+ AudioPropertiesPage::title(),
+ loadIcon(AudioPropertiesPage::iconName()));
+ vlay = new QVBoxLayout(pageWidget, 0, spacingHint());
+ page = new AudioPropertiesPage(doc, pageWidget);
+ vlay->addWidget(page);
+ page->setPageIndex(pageIndex(pageWidget));
+ m_configurationPages.push_back(page);
+
+ // Colour Page
+ pageWidget = addPage(ColourConfigurationPage::iconLabel(),
+ ColourConfigurationPage::title(),
+ loadIcon(ColourConfigurationPage::iconName()));
+
+ vlay = new QVBoxLayout(pageWidget, 0, spacingHint());
+ page = new ColourConfigurationPage(doc, pageWidget);
+ vlay->addWidget(page);
+ page->setPageIndex(pageIndex(pageWidget));
+ m_configurationPages.push_back(page);
+
+ resize(minimumSize());
+}
+
+void
+DocumentConfigureDialog::showAudioPage()
+{
+ int index = 0;
+
+ for (configurationpages::iterator i = m_configurationPages.begin();
+ i != m_configurationPages.end(); ++i) {
+
+ AudioPropertiesPage *page =
+ dynamic_cast<AudioPropertiesPage *>(*i);
+
+ if (!page) {
+ ++index;
+ continue;
+ }
+
+ showPage(index);
+ return ;
+ }
+}
+
+/* hjj: WHAT TO DO WITH THIS ?
+void
+DocumentConfigureDialog::selectMetadata(QString name)
+{
+ int index = 0;
+
+ for (configurationpages::iterator i = m_configurationPages.begin();
+ i != m_configurationPages.end(); ++i) {
+
+ DocumentMetaConfigurationPage *page =
+ dynamic_cast<DocumentMetaConfigurationPage *>(*i);
+
+ if (!page) {
+ ++index;
+ continue;
+ }
+
+ page->selectMetadata(name);
+ showPage(index);
+ return ;
+ }
+}
+*/
+
+}
diff --git a/src/gui/dialogs/DocumentConfigureDialog.h b/src/gui/dialogs/DocumentConfigureDialog.h
new file mode 100644
index 0000000..6713047
--- /dev/null
+++ b/src/gui/dialogs/DocumentConfigureDialog.h
@@ -0,0 +1,60 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_DOCUMENTCONFIGUREDIALOG_H_
+#define _RG_DOCUMENTCONFIGUREDIALOG_H_
+
+#include "ConfigureDialogBase.h"
+#include <qstring.h>
+
+
+class QWidget;
+
+
+namespace Rosegarden
+{
+
+class RosegardenGUIDoc;
+
+
+class DocumentConfigureDialog : public ConfigureDialogBase
+{
+public:
+ DocumentConfigureDialog(RosegardenGUIDoc *doc,
+ QWidget *parent=0,
+ const char *name=0);
+
+ void showAudioPage();
+
+/* hjj: WHAT TO DO WITH THIS ?
+ void selectMetadata(QString name);
+*/
+};
+
+
+
+
+}
+
+#endif
diff --git a/src/gui/dialogs/EventEditDialog.cpp b/src/gui/dialogs/EventEditDialog.cpp
new file mode 100644
index 0000000..c9991f1
--- /dev/null
+++ b/src/gui/dialogs/EventEditDialog.cpp
@@ -0,0 +1,528 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "EventEditDialog.h"
+
+#include <klocale.h>
+#include "misc/Strings.h"
+#include "base/Event.h"
+#include "base/MidiTypes.h"
+#include "base/NotationTypes.h"
+#include "base/PropertyName.h"
+#include "base/RealTime.h"
+#include "gui/editors/notation/NotePixmapFactory.h"
+#include <kdialogbase.h>
+#include <kmessagebox.h>
+#include <qcheckbox.h>
+#include <qfont.h>
+#include <qgrid.h>
+#include <qgroupbox.h>
+#include <qhbox.h>
+#include <qlabel.h>
+#include <qlineedit.h>
+#include <qobject.h>
+#include <qobjectlist.h>
+#include <qpushbutton.h>
+#include <qscrollview.h>
+#include <qsize.h>
+#include <qspinbox.h>
+#include <qstring.h>
+#include <qtooltip.h>
+#include <qvbox.h>
+#include <qwidget.h>
+
+
+namespace Rosegarden
+{
+
+EventEditDialog::EventEditDialog(QWidget *parent,
+ const Event &event,
+ bool editable) :
+ KDialogBase(parent, 0, true, i18n(editable ? "Advanced Event Edit" : "Advanced Event Viewer"),
+ (editable ? (Ok | Cancel) : Ok)),
+ m_durationDisplay(0),
+ m_durationDisplayAux(0),
+ m_persistentGrid(0),
+ m_nonPersistentGrid(0),
+ m_nonPersistentView(0),
+ m_originalEvent(event),
+ m_event(event),
+ m_type(event.getType()),
+ m_absoluteTime(event.getAbsoluteTime()),
+ m_duration(event.getDuration()),
+ m_subOrdering(event.getSubOrdering()),
+ m_modified(false)
+{
+ QVBox *vbox = makeVBoxMainWidget();
+
+ QGroupBox *intrinsicBox = new QGroupBox
+ (1, Horizontal, i18n("Intrinsics"), vbox);
+
+ QGrid *intrinsicGrid = new QGrid(4, QGrid::Horizontal, intrinsicBox);
+
+ new QLabel(i18n("Event type: "), intrinsicGrid);
+ new QLabel("", intrinsicGrid);
+ new QLabel("", intrinsicGrid);
+ QLineEdit *lineEdit = new QLineEdit(intrinsicGrid);
+ lineEdit->setText(strtoqstr(event.getType()));
+
+ new QLabel(i18n("Absolute time: "), intrinsicGrid);
+ new QLabel("", intrinsicGrid);
+ new QLabel("", intrinsicGrid);
+ QSpinBox *absoluteTime = new QSpinBox
+ (INT_MIN, INT_MAX, Note(Note::Shortest).getDuration(), intrinsicGrid);
+ absoluteTime->setValue(event.getAbsoluteTime());
+ QObject::connect(absoluteTime, SIGNAL(valueChanged(int)),
+ this, SLOT(slotAbsoluteTimeChanged(int)));
+ slotAbsoluteTimeChanged(event.getAbsoluteTime());
+
+ new QLabel(i18n("Duration: "), intrinsicGrid);
+ m_durationDisplay = new QLabel("(note)", intrinsicGrid);
+ m_durationDisplay->setMinimumWidth(20);
+ m_durationDisplayAux = new QLabel("(note)", intrinsicGrid);
+ m_durationDisplayAux->setMinimumWidth(20);
+
+ QSpinBox *duration = new QSpinBox
+ (0, INT_MAX, Note(Note::Shortest).getDuration(), intrinsicGrid);
+ duration->setValue(event.getDuration());
+ QObject::connect(duration, SIGNAL(valueChanged(int)),
+ this, SLOT(slotDurationChanged(int)));
+ slotDurationChanged(event.getDuration());
+
+ new QLabel(i18n("Sub-ordering: "), intrinsicGrid);
+ new QLabel("", intrinsicGrid);
+ new QLabel("", intrinsicGrid);
+
+ QSpinBox *subOrdering = new QSpinBox( -100, 100, 1, intrinsicGrid);
+ subOrdering->setValue(event.getSubOrdering());
+ QObject::connect(subOrdering, SIGNAL(valueChanged(int)),
+ this, SLOT(slotSubOrderingChanged(int)));
+ slotSubOrderingChanged(event.getSubOrdering());
+
+ QGroupBox *persistentBox = new QGroupBox
+ (1, Horizontal, i18n("Persistent properties"), vbox);
+ m_persistentGrid = new QGrid(4, QGrid::Horizontal, persistentBox);
+
+ QLabel *label = new QLabel(i18n("Name"), m_persistentGrid);
+ QFont font(label->font());
+ font.setItalic(true);
+ label->setFont(font);
+
+ label = new QLabel(i18n("Type"), m_persistentGrid);
+ label->setFont(font);
+ label = new QLabel(i18n("Value"), m_persistentGrid);
+ label->setFont(font);
+ label = new QLabel("", m_persistentGrid);
+ label->setFont(font);
+
+ Event::PropertyNames p = event.getPersistentPropertyNames();
+
+ for (Event::PropertyNames::iterator i = p.begin();
+ i != p.end(); ++i) {
+ addPersistentProperty(*i);
+ }
+
+ p = event.getNonPersistentPropertyNames();
+
+ if (p.begin() == p.end()) {
+ m_nonPersistentView = 0;
+ m_nonPersistentGrid = 0;
+ } else {
+
+ QGroupBox *nonPersistentBox = new QGroupBox
+ (1, Horizontal, i18n("Non-persistent properties"), vbox);
+ new QLabel(i18n("These are cached values, lost if the event is modified."),
+ nonPersistentBox);
+
+ m_nonPersistentView = new QScrollView(nonPersistentBox);
+ //m_nonPersistentView->setHScrollBarMode(QScrollView::AlwaysOff);
+ m_nonPersistentView->setResizePolicy(QScrollView::AutoOneFit);
+
+ m_nonPersistentGrid = new QGrid
+ (4, QGrid::Horizontal, m_nonPersistentView->viewport());
+ m_nonPersistentView->addChild(m_nonPersistentGrid);
+
+ m_nonPersistentGrid->setSpacing(4);
+ m_nonPersistentGrid->setMargin(5);
+
+ label = new QLabel(i18n("Name "), m_nonPersistentGrid);
+ label->setFont(font);
+ label = new QLabel(i18n("Type "), m_nonPersistentGrid);
+ label->setFont(font);
+ label = new QLabel(i18n("Value "), m_nonPersistentGrid);
+ label->setFont(font);
+ label = new QLabel("", m_nonPersistentGrid);
+ label->setFont(font);
+
+ for (Event::PropertyNames::iterator i = p.begin();
+ i != p.end(); ++i) {
+
+ new QLabel(strtoqstr(*i), m_nonPersistentGrid, strtoqstr(*i));
+ new QLabel(strtoqstr(event.getPropertyTypeAsString(*i)), m_nonPersistentGrid, strtoqstr(*i));
+ new QLabel(strtoqstr(event.getAsString(*i)), m_nonPersistentGrid, strtoqstr(*i));
+ QPushButton *button = new QPushButton("P", m_nonPersistentGrid, strtoqstr(*i));
+ button->setFixedSize(QSize(24, 24));
+ QToolTip::add
+ (button, i18n("Make persistent"));
+ QObject::connect(button, SIGNAL(clicked()),
+ this, SLOT(slotPropertyMadePersistent()));
+ }
+ }
+}
+
+void
+EventEditDialog::addPersistentProperty(const PropertyName &name)
+{
+ QLabel *label = new QLabel(strtoqstr(name), m_persistentGrid, strtoqstr(name));
+ label->show();
+ label = new QLabel(strtoqstr(m_originalEvent.getPropertyTypeAsString(name)),
+ m_persistentGrid, strtoqstr(name));
+ label->show();
+
+ PropertyType type(m_originalEvent.getPropertyType(name));
+ switch (type) {
+
+ case Int: {
+ int min = INT_MIN, max = INT_MAX;
+ // DMM - constrain program changes to a useful range of values
+ // Might other types have a similar need for such limits?
+ if (m_originalEvent.isa(ProgramChange::EventType)) {
+ min = 0;
+ max = 127;
+ }
+ QSpinBox *spinBox = new QSpinBox
+ (min, max, 1, m_persistentGrid, strtoqstr(name));
+ spinBox->setValue(m_originalEvent.get<Int>(name));
+ QObject::connect(spinBox, SIGNAL(valueChanged(int)),
+ this, SLOT(slotIntPropertyChanged(int)));
+ spinBox->show();
+ break;
+ }
+case UInt: {
+ int min = 0;
+ int max = UINT_MAX;
+ if (m_originalEvent.isa(ProgramChange::EventType)) {
+ min = 0;
+ max = 65535;
+ }
+ QSpinBox *spinBox = new QSpinBox
+ (min, max, 1, m_persistentGrid, strtoqstr(name));
+ spinBox->setValue(m_originalEvent.get<UInt>(name));
+ QObject::connect(spinBox, SIGNAL(valueChanged(int)),
+ this, SLOT(slotIntPropertyChanged(int)));
+ spinBox->show();
+ break;
+ }
+ case RealTimeT: {
+ RealTime realTime = m_originalEvent.get<RealTimeT>(name);
+
+ QHBox* hbox = new QHBox(m_persistentGrid);
+
+ // seconds
+ //
+ QSpinBox *spinBox = new QSpinBox
+ (INT_MIN, INT_MAX, 1,
+ hbox, strtoqstr(name) + "%sec");
+ spinBox->setValue(realTime.sec);
+
+ QObject::connect(spinBox, SIGNAL(valueChanged(int)),
+ this, SLOT(slotRealTimePropertyChanged(int)));
+
+ // nseconds
+ //
+ spinBox = new QSpinBox
+ (INT_MIN, INT_MAX, 1,
+ hbox, strtoqstr(name) + "%nsec");
+ spinBox->setValue(realTime.nsec);
+
+ QObject::connect(spinBox, SIGNAL(valueChanged(int)),
+ this, SLOT(slotRealTimePropertyChanged(int)));
+ spinBox->show();
+ break;
+ }
+
+ case Bool: {
+ QCheckBox *checkBox = new QCheckBox
+ ("", m_persistentGrid, strtoqstr(name));
+ checkBox->setChecked(m_originalEvent.get<Bool>(name));
+ QObject::connect(checkBox, SIGNAL(activated()),
+ this, SLOT(slotBoolPropertyChanged()));
+ checkBox->show();
+ break;
+ }
+
+ case String: {
+ QLineEdit *lineEdit = new QLineEdit
+ (strtoqstr(m_originalEvent.get<String>(name)),
+ m_persistentGrid,
+ strtoqstr(name));
+ QObject::connect(lineEdit, SIGNAL(textChanged(const QString &)),
+ this, SLOT(slotStringPropertyChanged(const QString &)));
+ lineEdit->show();
+ break;
+ }
+ }
+
+ QPushButton *button = new QPushButton("X", m_persistentGrid,
+ strtoqstr(name));
+ button->setFixedSize(QSize(24, 24));
+ QToolTip::add
+ (button, i18n("Delete this property"));
+ QObject::connect(button, SIGNAL(clicked()),
+ this, SLOT(slotPropertyDeleted()));
+ button->show();
+}
+
+Event
+EventEditDialog::getEvent() const
+{
+ return Event(m_event, m_absoluteTime, m_duration, m_subOrdering);
+}
+
+void
+EventEditDialog::slotEventTypeChanged(const QString &type)
+{
+ std::string t(qstrtostr(type));
+ if (t != m_type) {
+ m_modified = true;
+ m_type = t;
+ }
+}
+
+void
+EventEditDialog::slotAbsoluteTimeChanged(int value)
+{
+ if (value == m_absoluteTime)
+ return ;
+ m_modified = true;
+ m_absoluteTime = value;
+}
+
+void
+EventEditDialog::slotDurationChanged(int value)
+{
+ timeT error = 0;
+ m_durationDisplay->setPixmap
+ (NotePixmapFactory::toQPixmap(m_notePixmapFactory.makeNoteMenuPixmap(timeT(value), error)));
+
+ if (error >= value / 2) {
+ m_durationDisplayAux->setText("++ ");
+ } else if (error > 0) {
+ m_durationDisplayAux->setText("+ ");
+ } else if (error < 0) {
+ m_durationDisplayAux->setText("- ");
+ } else {
+ m_durationDisplayAux->setText(" ");
+ }
+
+ if (timeT(value) == m_duration)
+ return ;
+
+ m_modified = true;
+ m_duration = value;
+}
+
+void
+EventEditDialog::slotSubOrderingChanged(int value)
+{
+ if (value == m_subOrdering)
+ return ;
+ m_modified = true;
+ m_subOrdering = value;
+}
+
+void
+EventEditDialog::slotIntPropertyChanged(int value)
+{
+ const QObject *s = sender();
+ const QSpinBox *spinBox = dynamic_cast<const QSpinBox *>(s);
+ if (!spinBox)
+ return ;
+
+ m_modified = true;
+ QString propertyName = spinBox->name();
+ m_event.set<Int>(qstrtostr(propertyName), value);
+}
+
+void
+EventEditDialog::slotRealTimePropertyChanged(int value)
+{
+ const QObject *s = sender();
+ const QSpinBox *spinBox = dynamic_cast<const QSpinBox *>(s);
+ if (!spinBox)
+ return ;
+
+ m_modified = true;
+ QString propertyFullName = spinBox->name();
+
+ QString propertyName = propertyFullName.section('%', 0, 0),
+ nsecOrSec = propertyFullName.section('%', 1, 1);
+
+ RealTime realTime = m_event.get<RealTimeT>(qstrtostr(propertyName));
+
+ if (nsecOrSec == "sec")
+ realTime.sec = value;
+ else
+ realTime.nsec = value;
+
+ m_event.set<Int>(qstrtostr(propertyName), value);
+}
+
+void
+EventEditDialog::slotBoolPropertyChanged()
+{
+ const QObject *s = sender();
+ const QCheckBox *checkBox = dynamic_cast<const QCheckBox *>(s);
+ if (!checkBox)
+ return ;
+
+ m_modified = true;
+ QString propertyName = checkBox->name();
+ bool checked = checkBox->isChecked();
+
+ m_event.set<Bool>(qstrtostr(propertyName), checked);
+}
+
+void
+EventEditDialog::slotStringPropertyChanged(const QString &value)
+{
+ const QObject *s = sender();
+ const QLineEdit *lineEdit = dynamic_cast<const QLineEdit *>(s);
+ if (!lineEdit)
+ return ;
+
+ m_modified = true;
+ QString propertyName = lineEdit->name();
+ m_event.set<String>(qstrtostr(propertyName), qstrtostr(value));
+}
+
+void
+EventEditDialog::slotPropertyDeleted()
+{
+ const QObject *s = sender();
+ const QPushButton *pushButton = dynamic_cast<const QPushButton *>(s);
+ if (!pushButton)
+ return ;
+
+ QString propertyName = pushButton->name();
+
+ if (KMessageBox::warningContinueCancel
+ (this,
+ i18n("Are you sure you want to delete the \"%1\" property?\n\n"
+ "Removing necessary properties may cause unexpected behavior.").
+ arg(propertyName),
+ i18n("Edit Event"),
+ i18n("&Delete")) != KMessageBox::Continue)
+ return ;
+
+ m_modified = true;
+ QObjectList *list = m_persistentGrid->queryList(0, propertyName, false);
+ QObjectListIt i(*list);
+ QObject *obj;
+ while ((obj = i.current()) != 0) {
+ ++i;
+ delete obj;
+ }
+ delete list;
+
+ m_event.unset(qstrtostr(propertyName));
+}
+
+void
+EventEditDialog::slotPropertyMadePersistent()
+{
+ const QObject *s = sender();
+ const QPushButton *pushButton = dynamic_cast<const QPushButton *>(s);
+ if (!pushButton)
+ return ;
+
+ QString propertyName = pushButton->name();
+
+ if (KMessageBox::warningContinueCancel
+ (this,
+ i18n("Are you sure you want to make the \"%1\" property persistent?\n\n"
+ "This could cause problems if it overrides a different "
+ "computed value later on.").
+ arg(propertyName),
+ i18n("Edit Event"),
+ i18n("Make &Persistent")) != KMessageBox::Continue)
+ return ;
+
+ QObjectList *list = m_nonPersistentGrid->queryList(0, propertyName, false);
+ QObjectListIt i(*list);
+ QObject *obj;
+ while ((obj = i.current()) != 0) {
+ ++i;
+ delete obj;
+ }
+ delete list;
+
+ m_modified = true;
+ addPersistentProperty(qstrtostr(propertyName));
+
+ PropertyType type =
+ m_originalEvent.getPropertyType(qstrtostr(propertyName));
+
+ switch (type) {
+
+ case Int:
+ m_event.set<Int>
+ (qstrtostr(propertyName),
+ m_originalEvent.get<Int>
+ (qstrtostr(propertyName)));
+ break;
+
+ case UInt:
+ m_event.set<UInt>
+ (qstrtostr(propertyName),
+ m_originalEvent.get<UInt>
+ (qstrtostr(propertyName)));
+ break;
+
+ case RealTimeT:
+ m_event.set<RealTimeT>
+ (qstrtostr(propertyName),
+ m_originalEvent.get<RealTimeT>
+ (qstrtostr(propertyName)));
+ break;
+
+ case Bool:
+ m_event.set<Bool>
+ (qstrtostr(propertyName),
+ m_originalEvent.get<Bool>
+ (qstrtostr(propertyName)));
+ break;
+
+ case String:
+ m_event.set<String>
+ (qstrtostr(propertyName),
+ m_originalEvent.get<String>
+ (qstrtostr(propertyName)));
+ break;
+ }
+}
+
+}
+#include "EventEditDialog.moc"
diff --git a/src/gui/dialogs/EventEditDialog.h b/src/gui/dialogs/EventEditDialog.h
new file mode 100644
index 0000000..337a190
--- /dev/null
+++ b/src/gui/dialogs/EventEditDialog.h
@@ -0,0 +1,113 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_EVENTEDITDIALOG_H_
+#define _RG_EVENTEDITDIALOG_H_
+
+#include "base/Event.h"
+#include "gui/editors/notation/NotePixmapFactory.h"
+#include <string>
+#include <kdialogbase.h>
+
+
+class QWidget;
+class QString;
+class QScrollView;
+class QLabel;
+class QGrid;
+
+
+namespace Rosegarden
+{
+
+class PropertyName;
+
+
+class EventEditDialog : public KDialogBase
+{
+ Q_OBJECT
+
+public:
+ /**
+ * Construct an event-edit dialog showing the properties of the
+ * given event. If editable is false, the user will not be allowed
+ * to modify the event; otherwise the event will be editable and
+ * the resulting edited version can subsequently be queried
+ * through getEvent().
+ */
+ EventEditDialog(QWidget *parent,
+ const Event &event,
+ bool editable = true);
+
+ bool isModified() const { return m_modified; }
+ Event getEvent() const;
+
+public slots:
+ void slotEventTypeChanged(const QString &);
+ void slotAbsoluteTimeChanged(int value);
+ void slotDurationChanged(int value);
+ void slotSubOrderingChanged(int value);
+
+ void slotIntPropertyChanged(int);
+ void slotRealTimePropertyChanged(int);
+ void slotBoolPropertyChanged();
+ void slotStringPropertyChanged(const QString &);
+
+ void slotPropertyDeleted();
+ void slotPropertyMadePersistent();
+
+protected:
+ void addPersistentProperty(const PropertyName &);
+
+ //--------------- Data members ---------------------------------
+ NotePixmapFactory m_notePixmapFactory;
+
+ QLabel *m_durationDisplay;
+ QLabel *m_durationDisplayAux;
+
+ QGrid *m_persistentGrid;
+ QGrid *m_nonPersistentGrid;
+
+ QScrollView *m_nonPersistentView;
+
+ const Event &m_originalEvent;
+ Event m_event;
+
+ std::string m_type;
+ timeT m_absoluteTime;
+ timeT m_duration;
+ int m_subOrdering;
+
+ bool m_modified;
+};
+
+/*
+ * A simpler event editor for use by the EventView and MatrixView
+ * and people who want to remain sane.
+ */
+
+}
+
+#endif
diff --git a/src/gui/dialogs/EventFilterDialog.cpp b/src/gui/dialogs/EventFilterDialog.cpp
new file mode 100644
index 0000000..7b0c15c
--- /dev/null
+++ b/src/gui/dialogs/EventFilterDialog.cpp
@@ -0,0 +1,476 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ This file is Copyright 2003-2006
+ D. Michael McIntyre <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "EventFilterDialog.h"
+
+#include "misc/Debug.h"
+#include "base/BaseProperties.h"
+#include "base/Event.h"
+#include "base/NotationTypes.h"
+#include "base/BasicQuantizer.h"
+#include "gui/dialogs/PitchPickerDialog.h"
+#include "gui/editors/notation/NotationStrings.h"
+#include "gui/editors/notation/NotePixmapFactory.h"
+#include "document/ConfigGroups.h"
+#include <kapplication.h>
+#include <kconfig.h>
+#include <kdialogbase.h>
+#include <klocale.h>
+#include <qcheckbox.h>
+#include <qcombobox.h>
+#include <qdialog.h>
+#include <qframe.h>
+#include <qgroupbox.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qpixmap.h>
+#include <qpushbutton.h>
+#include <qsizepolicy.h>
+#include <qspinbox.h>
+#include <qstring.h>
+#include <qtooltip.h>
+#include <qvbox.h>
+#include <qwidget.h>
+
+
+namespace Rosegarden
+{
+
+EventFilterDialog::EventFilterDialog(QWidget* parent)
+ : KDialogBase(parent, "eventfilerdialog", true, i18n("Event Filter"), Ok | Cancel, Ok),
+ m_standardQuantizations(BasicQuantizer::getStandardQuantizations())
+{
+ cfg = kapp->config();
+ initDialog();
+}
+
+EventFilterDialog::~EventFilterDialog()
+{
+ // nothing here
+}
+
+void
+EventFilterDialog::initDialog()
+{
+ QVBox* mainWidget = makeVBoxMainWidget();
+
+
+ //----------[ Note Filter Widgets ]-------------------------
+
+ // Frame
+ QGroupBox* noteFrame = new QGroupBox(i18n("Note Events"), mainWidget);
+ QGridLayout* noteFrameLayout = new QGridLayout(noteFrame, 1, 1, 20, 6);
+
+ // Labels
+ QLabel* pitchFromLabel = new QLabel(i18n("lowest:"), noteFrame);
+ noteFrameLayout->addWidget(pitchFromLabel, 0, 2);
+
+ QLabel* pitchToLabel = new QLabel(i18n("highest:"), noteFrame);
+ noteFrameLayout->addWidget(pitchToLabel, 0, 4);
+
+ QLabel* pitchLabel = new QLabel(i18n("Pitch:"), noteFrame);
+ noteFrameLayout->addWidget(pitchLabel, 1, 1);
+
+ QLabel* velocityLabel = new QLabel(i18n("Velocity:"), noteFrame);
+ noteFrameLayout->addWidget(velocityLabel, 2, 1);
+
+ QLabel* durationLabel = new QLabel(i18n("Duration:"), noteFrame);
+ noteFrameLayout->addWidget(durationLabel, 3, 1);
+
+ // Include Boxes
+ m_notePitchIncludeComboBox = new QComboBox(0, noteFrame);
+ m_notePitchIncludeComboBox->insertItem(i18n("include"));
+ m_notePitchIncludeComboBox->insertItem(i18n("exclude"));
+ cfg->setGroup(EventFilterDialogConfigGroup);
+ m_notePitchIncludeComboBox->setCurrentItem(cfg->readBoolEntry("pitchinclude", 0));
+ noteFrameLayout->addWidget(m_notePitchIncludeComboBox, 1, 0);
+
+ m_noteVelocityIncludeComboBox = new QComboBox(0, noteFrame);
+ m_noteVelocityIncludeComboBox->insertItem(i18n("include"));
+ m_noteVelocityIncludeComboBox->insertItem(i18n("exclude"));
+ cfg->setGroup(EventFilterDialogConfigGroup);
+ m_noteVelocityIncludeComboBox->setCurrentItem(cfg->readBoolEntry("velocityinclude", 0));
+ noteFrameLayout->addWidget(m_noteVelocityIncludeComboBox, 2, 0);
+
+ m_noteDurationIncludeComboBox = new QComboBox(0, noteFrame);
+ m_noteDurationIncludeComboBox->insertItem(i18n("include"));
+ m_noteDurationIncludeComboBox->insertItem(i18n("exclude"));
+ cfg->setGroup(EventFilterDialogConfigGroup);
+ m_noteDurationIncludeComboBox->setCurrentItem(cfg->readBoolEntry("durationinclude", 0));
+ noteFrameLayout->addWidget(m_noteDurationIncludeComboBox, 3, 0);
+
+ // Pitch From
+ m_pitchFromSpinBox = new QSpinBox(noteFrame);
+ m_pitchFromSpinBox->setMaxValue(127);
+ cfg->setGroup(EventFilterDialogConfigGroup);
+ m_pitchFromSpinBox->setValue(cfg->readUnsignedNumEntry("pitchfrom", 0));
+ noteFrameLayout->addWidget(m_pitchFromSpinBox, 1, 2);
+ connect(m_pitchFromSpinBox, SIGNAL(valueChanged(int)),
+ SLOT(slotPitchFromChanged(int)));
+
+ m_pitchFromChooserButton = new QPushButton(i18n("edit"), noteFrame);
+ m_pitchFromChooserButton->setSizePolicy(QSizePolicy((QSizePolicy::SizeType)0,
+ (QSizePolicy::SizeType)0, 0, 0, m_pitchFromChooserButton->
+ sizePolicy().hasHeightForWidth()));
+ QToolTip::add
+ (m_pitchFromChooserButton, i18n("choose a pitch using a staff"));
+ noteFrameLayout->addWidget(m_pitchFromChooserButton, 1, 3);
+ connect(m_pitchFromChooserButton, SIGNAL(clicked()),
+ SLOT(slotPitchFromChooser()));
+
+ // Pitch To
+ m_pitchToSpinBox = new QSpinBox(noteFrame);
+ m_pitchToSpinBox->setMaxValue(127);
+ cfg->setGroup(EventFilterDialogConfigGroup);
+ m_pitchToSpinBox->setValue(cfg->readUnsignedNumEntry("pitchto", 127));
+ noteFrameLayout->addWidget(m_pitchToSpinBox, 1, 4);
+ connect(m_pitchToSpinBox, SIGNAL(valueChanged(int)),
+ SLOT(slotPitchToChanged(int)));
+
+ m_pitchToChooserButton = new QPushButton(i18n("edit"), noteFrame);
+ QToolTip::add
+ (m_pitchToChooserButton, i18n("choose a pitch using a staff"));
+ noteFrameLayout->addWidget(m_pitchToChooserButton, 1, 5);
+ connect(m_pitchToChooserButton, SIGNAL(clicked()),
+ SLOT(slotPitchToChooser()));
+
+ // Velocity From/To
+ m_velocityFromSpinBox = new QSpinBox(noteFrame);
+ m_velocityFromSpinBox->setMaxValue(127);
+ cfg->setGroup(EventFilterDialogConfigGroup);
+ m_velocityFromSpinBox->setValue(cfg->readUnsignedNumEntry("velocityfrom", 0));
+ noteFrameLayout->addWidget(m_velocityFromSpinBox, 2, 2);
+ connect(m_velocityFromSpinBox, SIGNAL(valueChanged(int)),
+ SLOT(slotVelocityFromChanged(int)));
+
+ m_velocityToSpinBox = new QSpinBox(noteFrame);
+ m_velocityToSpinBox->setMaxValue(127);
+ cfg->setGroup(EventFilterDialogConfigGroup);
+ m_velocityToSpinBox->setValue(cfg->readUnsignedNumEntry("velocityto", 127));
+ noteFrameLayout->addWidget( m_velocityToSpinBox, 2, 4 );
+ connect(m_velocityToSpinBox, SIGNAL(valueChanged(int)),
+ SLOT(slotVelocityToChanged(int)));
+
+
+ // Duration From/To
+ m_noteDurationFromComboBox = new QComboBox(0, noteFrame);
+ m_noteDurationFromComboBox->insertItem(i18n("longest"));
+ noteFrameLayout->addWidget(m_noteDurationFromComboBox, 3, 2);
+ connect(m_noteDurationFromComboBox, SIGNAL(activated(int)),
+ SLOT(slotDurationFromChanged(int)));
+
+ m_noteDurationToComboBox = new QComboBox(0, noteFrame);
+ m_noteDurationToComboBox->insertItem(i18n("longest"));
+ noteFrameLayout->addWidget(m_noteDurationToComboBox, 3, 4);
+ connect(m_noteDurationToComboBox, SIGNAL(activated(int)),
+ SLOT(slotDurationToChanged(int)));
+
+ populateDurationCombos();
+
+
+ //---------[ Buttons ]--------------------------------------
+ QFrame* privateLayoutWidget = new QFrame(mainWidget);
+ QGridLayout* buttonLayout = new QGridLayout(privateLayoutWidget, 1, 1, 20, 6);
+
+ m_buttonAll = new QPushButton(i18n("Include all"), privateLayoutWidget);
+ m_buttonAll->setAutoDefault(true);
+ QToolTip::add
+ (m_buttonAll, i18n("Include entire range of values"));
+ buttonLayout->addWidget( m_buttonAll, 0, 0 );
+
+ m_buttonNone = new QPushButton(i18n("Exclude all"), privateLayoutWidget);
+ m_buttonNone->setAutoDefault(true);
+ QToolTip::add
+ (m_buttonNone, i18n("Exclude entire range of values"));
+ buttonLayout->addWidget( m_buttonNone, 0, 1 );
+
+ connect(m_buttonAll, SIGNAL(clicked()), this, SLOT(slotToggleAll()));
+ connect(m_buttonNone, SIGNAL(clicked()), this, SLOT(slotToggleNone()));
+
+
+}
+
+void
+EventFilterDialog::populateDurationCombos()
+{
+ QPixmap noMap = NotePixmapFactory::toQPixmap
+ (NotePixmapFactory::makeToolbarPixmap("menu-no-note"));
+
+ for (unsigned int i = 0; i < m_standardQuantizations.size(); ++i) {
+ timeT time = m_standardQuantizations[i];
+ timeT error = 0;
+ QString label = NotationStrings::makeNoteMenuLabel(time, true, error);
+ QPixmap pmap = NotePixmapFactory::toQPixmap
+ (NotePixmapFactory::makeNoteMenuPixmap(time, error));
+ m_noteDurationFromComboBox->insertItem(error ? noMap : pmap, label);
+ m_noteDurationToComboBox ->insertItem(error ? noMap : pmap, label);
+ }
+ m_noteDurationFromComboBox->insertItem(noMap, i18n("shortest"));
+ m_noteDurationToComboBox->insertItem(noMap, i18n("shortest"));
+
+ cfg->setGroup(EventFilterDialogConfigGroup);
+ m_noteDurationFromComboBox->setCurrentItem(
+ cfg->readUnsignedNumEntry("durationfrom", 0));
+ m_noteDurationToComboBox->setCurrentItem(
+ cfg->readUnsignedNumEntry("durationto", (m_noteDurationToComboBox->count() - 1)));
+}
+
+void
+EventFilterDialog::slotToggleAll()
+{
+ RG_DEBUG << "EventFilterDialog::slotToggleAll()" << endl;
+ m_pitchFromSpinBox ->setValue(0);
+ m_pitchToSpinBox ->setValue(127);
+ m_velocityFromSpinBox ->setValue(0);
+ m_velocityToSpinBox ->setValue(127);
+ m_noteDurationFromComboBox ->setCurrentItem(11); // hard coded; should be variable
+ m_noteDurationToComboBox ->setCurrentItem(0); // 0 = unlimited; 11 = 0
+}
+
+void
+EventFilterDialog::slotToggleNone()
+{
+ RG_DEBUG << "EventFilterDialog::slotToggleNone()" << endl;
+ m_pitchFromSpinBox ->setValue(0);
+ m_pitchToSpinBox ->setValue(0);
+ m_velocityFromSpinBox ->setValue(0);
+ m_velocityToSpinBox ->setValue(0);
+ m_noteDurationFromComboBox ->setCurrentItem(11);
+ m_noteDurationToComboBox ->setCurrentItem(11);
+}
+
+void
+EventFilterDialog::slotOk()
+{
+ cfg->setGroup(EventFilterDialogConfigGroup);
+
+ cfg->writeEntry("pitchinclude", m_notePitchIncludeComboBox->currentItem());
+ cfg->writeEntry("pitchfrom", m_pitchFromSpinBox->value());
+ cfg->writeEntry("pitchto", m_pitchToSpinBox->value());
+
+ cfg->writeEntry("velocityinclude", m_noteVelocityIncludeComboBox->currentItem());
+ cfg->writeEntry("velocityfrom", m_velocityFromSpinBox->value());
+ cfg->writeEntry("velocityto", m_velocityToSpinBox->value());
+
+ cfg->writeEntry("durationinclude", m_noteDurationIncludeComboBox->currentItem());
+ cfg->writeEntry("durationfrom", m_noteDurationFromComboBox->currentItem());
+ cfg->writeEntry("durationto", m_noteDurationToComboBox->currentItem());
+
+ accept();
+}
+
+void
+EventFilterDialog::slotPitchFromChanged(int pitch)
+{
+ if (pitch > m_pitchToSpinBox->value())
+ m_pitchToSpinBox->setValue(pitch);
+}
+
+void
+EventFilterDialog::slotPitchToChanged(int pitch)
+{
+ if (pitch < m_pitchFromSpinBox->value())
+ m_pitchFromSpinBox->setValue(pitch);
+}
+
+void
+EventFilterDialog::slotVelocityFromChanged(int velocity)
+{
+ if (velocity > m_velocityToSpinBox->value())
+ m_velocityToSpinBox->setValue(velocity);
+}
+
+void
+EventFilterDialog::slotVelocityToChanged(int velocity)
+{
+ if (velocity < m_velocityFromSpinBox->value())
+ m_velocityFromSpinBox->setValue(velocity);
+}
+
+void
+EventFilterDialog::slotDurationFromChanged(int index)
+{
+ if (index < m_noteDurationToComboBox->currentItem())
+ m_noteDurationToComboBox->setCurrentItem(index);
+}
+
+void
+EventFilterDialog::slotDurationToChanged(int index)
+{
+ if (index > m_noteDurationFromComboBox->currentItem())
+ m_noteDurationFromComboBox->setCurrentItem(index);
+}
+
+
+void
+EventFilterDialog::slotPitchFromChooser()
+{
+ PitchPickerDialog dialog(this, m_pitchFromSpinBox->value(), i18n("Lowest pitch"));
+
+ if (dialog.exec() == QDialog::Accepted) {
+ m_pitchFromSpinBox->setValue(dialog.getPitch());
+ }
+}
+
+void
+EventFilterDialog::slotPitchToChooser()
+{
+ PitchPickerDialog dialog(this, m_pitchToSpinBox->value(), i18n("Highest pitch"));
+
+ if (dialog.exec() == QDialog::Accepted) {
+ m_pitchToSpinBox->setValue(dialog.getPitch());
+ }
+}
+
+long
+EventFilterDialog::getDurationFromIndex(int index)
+{
+ switch (index) {
+ // 0
+ case 11:
+ return 0;
+ // 1/96
+ case 10:
+ return long(Note(Note::SixtyFourthNote).getDuration() / 3);
+ // 1/64
+ case 9 :
+ return long(Note(Note::SixtyFourthNote).getDuration());
+ // 1/48
+ case 8 :
+ return long(Note(Note::ThirtySecondNote).getDuration() / 3);
+ // 1/32
+ case 7 :
+ return long(Note(Note::ThirtySecondNote).getDuration());
+ // 1/24
+ case 6 :
+ return long(Note(Note::SixteenthNote).getDuration() / 3);
+ // 1/16
+ case 5 :
+ return long(Note(Note::SixteenthNote).getDuration());
+ // 1/8
+ case 4 :
+ return long(Note(Note::EighthNote).getDuration());
+ // 1/4
+ case 3 :
+ return long(Note(Note::QuarterNote).getDuration());
+ // 1/2
+ case 2 :
+ return long(Note(Note::HalfNote).getDuration());
+ // 1/1
+ case 1 :
+ return long(Note(Note::WholeNote).getDuration());
+ // unlimited
+ case 0 :
+ return LONG_MAX;
+ }
+ // failsafe
+ return LONG_MAX;
+}
+
+void
+EventFilterDialog::invert(EventFilterDialog::filterRange &foo)
+{
+ long c = foo.first;
+ foo.first = foo.second;
+ foo.second = c;
+}
+
+EventFilterDialog::filterRange
+EventFilterDialog::getPitch()
+{
+ EventFilterDialog::filterRange foo;
+ foo.first = m_pitchFromSpinBox->value();
+ foo.second = m_pitchToSpinBox ->value();
+ if (!pitchIsInclusive())
+ invert(foo);
+ return foo;
+}
+
+EventFilterDialog::filterRange
+EventFilterDialog::getVelocity()
+{
+ EventFilterDialog::filterRange foo;
+ foo.first = m_velocityFromSpinBox->value();
+ foo.second = m_velocityToSpinBox ->value();
+ if (!velocityIsInclusive())
+ invert(foo);
+ return foo;
+}
+
+EventFilterDialog::filterRange
+EventFilterDialog::getDuration()
+{
+ EventFilterDialog::filterRange foo;
+ foo.first = getDurationFromIndex(m_noteDurationFromComboBox->currentItem());
+ foo.second = getDurationFromIndex(m_noteDurationToComboBox ->currentItem());
+ if (!durationIsInclusive())
+ invert(foo);
+ return foo;
+}
+
+bool
+EventFilterDialog::keepEvent(Event* const &e)
+{
+ if ((*e).isa(Note::EventType)) {
+ long property = 0;
+
+ // pitch
+ (*e).get<Int>(BaseProperties::PITCH, property);
+ if (!eventInRange(getPitch(), property)) {
+ RG_DEBUG << "EventFilterDialog::keepEvent(): rejecting event; pitch " << property
+ << " out of range." << endl;
+ return false;
+ }
+ property = 0;
+
+ // velocity
+ (*e).get<Int>(BaseProperties::VELOCITY, property);
+ if (!EventFilterDialog::eventInRange(getVelocity(), property)) {
+ RG_DEBUG << "EventFilterDialog::keepEvent(): rejecting event; velocity " << property
+ << " out of range." << endl;
+ return false;
+ }
+ property = 0;
+
+ // duration
+ property = (*e).getNotationDuration();
+ if (!EventFilterDialog::eventInRange(getDuration(), property)) {
+ RG_DEBUG << "EventFilterDialog::keepEvent(): rejecting event; duration " << property
+ << " out of range." << endl;
+ return false;
+ }
+ property = 0;
+
+ return true;
+ }
+ return false;
+}
+
+}
+
+#include "EventFilterDialog.moc"
diff --git a/src/gui/dialogs/EventFilterDialog.h b/src/gui/dialogs/EventFilterDialog.h
new file mode 100644
index 0000000..0d3eb05
--- /dev/null
+++ b/src/gui/dialogs/EventFilterDialog.h
@@ -0,0 +1,170 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ This file is Copyright 2003-2006
+ D. Michael McIntyre <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_EVENTFILTERDIALOG_H_
+#define _RG_EVENTFILTERDIALOG_H_
+
+#include <kdialogbase.h>
+#include <utility>
+#include <vector>
+#include "base/Event.h"
+#include <qcheckbox.h>
+#include <qcombobox.h>
+
+class QWidget;
+class QSpinBox;
+class QPushButton;
+class QGridLayout;
+class KConfig;
+
+
+namespace Rosegarden
+{
+
+class Event;
+
+
+/**
+ * Creates a dialog box to allow the user to dial up various selection
+ * criteria used for removing events from a selection. It is up to the caller
+ * to actually manipulate the selection. After the dialog has been accepted,
+ * its filterEvent() method can be used to decide whether a particular event
+ * should continue to be selected. See matrixview.cpp slotFilterSelection()
+ * for an example of how to use this.
+ */
+class EventFilterDialog : public KDialogBase
+{
+ Q_OBJECT
+
+public:
+
+ EventFilterDialog(QWidget* parent);
+ ~EventFilterDialog();
+
+ KConfig *cfg;
+
+ //-------[ accessor functions ]------------------------
+
+ // NOTE: the filterRange type is used to return an A B pair with A and B set
+ // according to the state of the related include/exclude combo. If A > B
+ // then this is an inclusive range. If A < B then it's an exclusive
+ // range. This saves passing around a third variable.
+ typedef std::pair<long, long> filterRange;
+
+ filterRange getPitch();
+ filterRange getVelocity();
+ filterRange getDuration();
+
+ // returns TRUE if the property value falls with in the filterRange
+ bool eventInRange(filterRange foo, long property) {
+ if (foo.first > foo.second)
+ return (property <= foo.second || property >= foo.first);
+ else
+ return (property >= foo.first && property <= foo.second); }
+
+ // Used to do the work of deciding whether to keep or reject an event
+ // based on the state of the dialog's widgets. Returns TRUE if an event
+ // should continue to be selected. This method is the heart of the
+ // EventFilterDialog's public interface.
+ bool keepEvent(Event* const &e);
+
+protected:
+
+ //--------[ member functions ]-------------------------
+
+ // initialize the dialog
+ void initDialog();
+
+ // populate the duration combos
+ void populateDurationCombos();
+
+ // convert duration from combobox index into actual RG duration
+ // between 0 and LONG_MAX
+ long getDurationFromIndex(int index);
+
+ // simple A B swap used to flip inclusive/exclusive values
+ void invert (filterRange &);
+
+ // return inclusive/exclusive toggle states concisely for tidy code
+ bool pitchIsInclusive() { return (m_notePitchIncludeComboBox->currentItem() == 0); }
+ bool velocityIsInclusive() { return (m_noteVelocityIncludeComboBox->currentItem() == 0); }
+ bool durationIsInclusive() { return (m_noteDurationIncludeComboBox->currentItem() == 0); }
+
+protected slots:
+
+ // set widget values to include everything
+ void slotToggleAll();
+
+ // set widget values to include nothing
+ void slotToggleNone();
+
+ // write out settings to kconfig data for next time and call accept()
+ virtual void slotOk();
+
+ // update note name text display and ensure From <= To
+ void slotPitchFromChanged(int pitch);
+ void slotPitchToChanged(int pitch);
+
+ // ensure From <= To to guarantee a logical range for these sets
+ void slotVelocityFromChanged(int velocity);
+ void slotVelocityToChanged(int velocity);
+ void slotDurationFromChanged(int index);
+ void slotDurationToChanged(int index);
+
+ // create a pitch chooser widget sub-dialog to show pitch on staff
+ void slotPitchFromChooser();
+ void slotPitchToChooser();
+
+private:
+ //---------[ data members ]-----------------------------
+
+ QGridLayout* layout;
+
+ QComboBox* m_noteDurationFromComboBox;
+ QComboBox* m_noteDurationIncludeComboBox;
+ QComboBox* m_noteDurationToComboBox;
+ QComboBox* m_notePitchIncludeComboBox;
+ QComboBox* m_noteVelocityIncludeComboBox;
+
+ QPushButton* m_pitchFromChooserButton;
+ QPushButton* m_pitchToChooserButton;
+ QPushButton* m_buttonAll;
+ QPushButton* m_buttonNone;
+
+ QSpinBox* m_pitchFromSpinBox;
+ QSpinBox* m_pitchToSpinBox;
+ QSpinBox* m_velocityFromSpinBox;
+ QSpinBox* m_velocityToSpinBox;
+
+ std::vector<timeT> m_standardQuantizations;
+
+};
+
+
+}
+
+#endif
diff --git a/src/gui/dialogs/EventParameterDialog.cpp b/src/gui/dialogs/EventParameterDialog.cpp
new file mode 100644
index 0000000..036491e
--- /dev/null
+++ b/src/gui/dialogs/EventParameterDialog.cpp
@@ -0,0 +1,185 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "EventParameterDialog.h"
+
+#include <klocale.h>
+#include "misc/Debug.h"
+#include "misc/Strings.h"
+#include "base/PropertyName.h"
+#include <kcombobox.h>
+#include <kdialogbase.h>
+#include <qhbox.h>
+#include <qlabel.h>
+#include <qstring.h>
+#include <qvbox.h>
+#include <qwidget.h>
+
+
+namespace Rosegarden
+{
+
+EventParameterDialog::EventParameterDialog(
+ QWidget *parent,
+ const QString &name,
+ const PropertyName &property,
+ int startValue):
+ KDialogBase(parent, 0, true, name, Ok | Cancel),
+ m_property(property)
+{
+ QVBox *vBox = makeVBoxMainWidget();
+
+ QHBox *topBox = new QHBox(vBox);
+ QLabel *explainLabel = new QLabel(topBox);
+ QString text = i18n("Set the %1 property of the event selection:").
+ arg(strtoqstr(property));
+ explainLabel->setText(text);
+
+ QHBox *patternBox = new QHBox(vBox);
+ new QLabel(i18n("Pattern"), patternBox);
+ m_patternCombo = new KComboBox(patternBox);
+
+ // create options
+ // 0 flat
+ text = i18n("Flat - set %1 to value").arg(strtoqstr(property));
+ m_patternCombo->insertItem(text);
+
+ // 1 alternating
+ text = i18n("Alternating - set %1 to max and min on alternate events").arg(strtoqstr(property));
+ m_patternCombo->insertItem(text);
+
+ // 2 crescendo
+ text = i18n("Crescendo - set %1 rising from min to max").arg(strtoqstr(property));
+ m_patternCombo->insertItem(text);
+
+ // 3 diminuendo
+ text = i18n("Diminuendo - set %1 falling from max to min").arg(strtoqstr(property));
+ m_patternCombo->insertItem(text);
+
+ // 4 ringing
+ text = i18n("Ringing - set %1 alternating from max to min with both dying to zero").arg(strtoqstr(property));
+ m_patternCombo->insertItem(text);
+
+ connect(m_patternCombo, SIGNAL(activated(int)),
+ this, SLOT(slotPatternSelected(int)));
+
+ QHBox *value1Box = new QHBox(vBox);
+ m_value1Label = new QLabel(i18n("Value"), value1Box);
+ m_value1Combo = new KComboBox(value1Box);
+
+ QHBox *value2Box = new QHBox(vBox);
+ m_value2Label = new QLabel(i18n("Value"), value2Box);
+ m_value2Combo = new KComboBox(value2Box);
+
+ for (unsigned int i = 0; i < 128; i++) {
+ m_value1Combo->insertItem(QString("%1").arg(i));
+ m_value2Combo->insertItem(QString("%1").arg(i));
+ }
+ m_value1Combo->setCurrentItem(127);
+
+ slotPatternSelected(0);
+
+ // start value
+ m_value1Combo->setCurrentItem(startValue);
+ m_value2Combo->setCurrentItem(startValue);
+
+}
+
+void
+EventParameterDialog::slotPatternSelected(int value)
+{
+ switch (value) {
+ case 0: // flat
+ m_value1Label->setText(i18n("Value"));
+ m_value1Label->show();
+ m_value1Combo->show();
+ m_value2Label->hide();
+ m_value2Combo->hide();
+ break;
+
+ case 1: // alternating
+ m_value1Label->setText(i18n("First Value"));
+ m_value2Label->setText(i18n("Second Value"));
+ m_value1Label->show();
+ m_value1Combo->show();
+ m_value2Label->show();
+ m_value2Combo->show();
+ break;
+
+ case 2: // crescendo
+ m_value1Label->setText(i18n("Low Value"));
+ m_value2Label->setText(i18n("High Value"));
+ m_value1Label->show();
+ m_value1Combo->show();
+ m_value2Label->show();
+ m_value2Combo->show();
+ break;
+
+ case 3: // decrescendo
+ m_value1Label->setText(i18n("High Value"));
+ m_value2Label->setText(i18n("Low Value"));
+ m_value1Label->show();
+ m_value1Combo->show();
+ m_value2Label->show();
+ m_value2Combo->show();
+ break;
+
+ case 4: // ringing
+ m_value1Label->setText(i18n("First Value"));
+ m_value2Label->setText(i18n("Second Value"));
+ m_value1Label->show();
+ m_value1Combo->show();
+ m_value2Label->show();
+ m_value2Combo->show();
+ break;
+
+ default:
+ RG_DEBUG << "EventParameterDialog::slotPatternSelected - "
+ << "unrecognised pattern number" << endl;
+ break;
+ }
+
+}
+
+PropertyPattern
+EventParameterDialog::getPattern()
+{
+ return PropertyPattern(m_patternCombo->currentItem());
+}
+
+int
+EventParameterDialog::getValue1()
+{
+ return m_value1Combo->currentItem();
+}
+
+int
+EventParameterDialog::getValue2()
+{
+ return m_value2Combo->currentItem();
+}
+
+}
+#include "EventParameterDialog.moc"
diff --git a/src/gui/dialogs/EventParameterDialog.h b/src/gui/dialogs/EventParameterDialog.h
new file mode 100644
index 0000000..040e2f9
--- /dev/null
+++ b/src/gui/dialogs/EventParameterDialog.h
@@ -0,0 +1,80 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_EVENTPARAMETERDIALOG_H_
+#define _RG_EVENTPARAMETERDIALOG_H_
+
+#include "base/PropertyName.h"
+#include <kdialogbase.h>
+#include "commands/edit/SelectionPropertyCommand.h"
+
+class QWidget;
+class QString;
+class QLabel;
+class KComboBox;
+
+
+namespace Rosegarden
+{
+
+
+
+class EventParameterDialog : public KDialogBase
+{
+ Q_OBJECT
+
+public:
+ EventParameterDialog(QWidget *parent,
+ const QString &name, // name
+ const PropertyName &property, // property
+ int startValue); // start
+
+ int getValue1();
+ int getValue2();
+ PropertyPattern getPattern();
+
+public slots:
+ void slotPatternSelected(int value);
+
+protected:
+ //--------------- Data members ---------------------------------
+ PropertyName m_property;
+ PropertyPattern m_pattern;
+
+ KComboBox *m_value1Combo;
+ KComboBox *m_value2Combo;
+ KComboBox *m_patternCombo;
+
+ QLabel *m_value1Label;
+ QLabel *m_value2Label;
+
+};
+
+
+// ---------------- CompositionLengthDialog -----------
+
+}
+
+#endif
diff --git a/src/gui/dialogs/ExportDeviceDialog.cpp b/src/gui/dialogs/ExportDeviceDialog.cpp
new file mode 100644
index 0000000..ce5f52e
--- /dev/null
+++ b/src/gui/dialogs/ExportDeviceDialog.cpp
@@ -0,0 +1,66 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "ExportDeviceDialog.h"
+
+#include <klocale.h>
+#include <kdialogbase.h>
+#include <qbuttongroup.h>
+#include <qlabel.h>
+#include <qradiobutton.h>
+#include <qstring.h>
+#include <qvbox.h>
+#include <qwidget.h>
+
+
+namespace Rosegarden
+{
+
+ExportDeviceDialog::ExportDeviceDialog(QWidget *parent, QString deviceName) :
+ KDialogBase(parent, "exportdevicedialog", true, i18n("Export Devices..."),
+ Ok | Cancel, Ok)
+{
+ QVBox *vbox = makeVBoxMainWidget();
+ QButtonGroup *bg = new QButtonGroup(1, Qt::Horizontal,
+ i18n("Export devices"),
+ vbox);
+ m_exportAll = new QRadioButton(i18n("Export all devices"), bg);
+ m_exportOne = new QRadioButton(i18n("Export selected device only"), bg);
+ new QLabel(i18n(" (\"%1\")").arg(deviceName), bg);
+
+ m_exportOne->setChecked(true);
+}
+
+ExportDeviceDialog::ExportType
+
+ExportDeviceDialog::getExportType()
+{
+ if (m_exportAll->isChecked())
+ return ExportAll;
+ else
+ return ExportOne;
+}
+
+}
diff --git a/src/gui/dialogs/ExportDeviceDialog.h b/src/gui/dialogs/ExportDeviceDialog.h
new file mode 100644
index 0000000..21fc183
--- /dev/null
+++ b/src/gui/dialogs/ExportDeviceDialog.h
@@ -0,0 +1,60 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_EXPORTDEVICEDIALOG_H_
+#define _RG_EXPORTDEVICEDIALOG_H_
+
+#include <kdialogbase.h>
+#include <qstring.h>
+
+
+class QWidget;
+class QRadioButton;
+
+
+namespace Rosegarden
+{
+
+
+
+class ExportDeviceDialog : public KDialogBase
+{
+public:
+ enum ExportType { ExportOne, ExportAll };
+
+ ExportDeviceDialog(QWidget *parent, QString deviceName);
+
+ ExportType getExportType();
+
+protected:
+ QRadioButton *m_exportAll;
+ QRadioButton *m_exportOne;
+};
+
+
+
+}
+
+#endif
diff --git a/src/gui/dialogs/FileLocateDialog.cpp b/src/gui/dialogs/FileLocateDialog.cpp
new file mode 100644
index 0000000..4f153c8
--- /dev/null
+++ b/src/gui/dialogs/FileLocateDialog.cpp
@@ -0,0 +1,104 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "FileLocateDialog.h"
+
+#include <klocale.h>
+#include "misc/Debug.h"
+#include <kdialogbase.h>
+#include <kfiledialog.h>
+#include <qfileinfo.h>
+#include <qhbox.h>
+#include <qlabel.h>
+#include <qstring.h>
+#include <qwidget.h>
+
+
+namespace Rosegarden
+{
+
+FileLocateDialog::FileLocateDialog(QWidget *parent,
+ const QString &file,
+ const QString & /*path*/):
+ KDialogBase(parent, 0, true,
+ i18n("Locate audio file"),
+ User1 | User2 | User3,
+ Ok,
+ false,
+ i18n("&Skip"),
+ i18n("Skip &All"),
+ i18n("&Locate")),
+ m_file(file)
+{
+ QHBox *w = makeHBoxMainWidget();
+ QString label =
+ i18n("Can't find file \"%1\".\n"
+ "Would you like to try and locate this file or skip it?").arg(m_file);
+
+ QLabel *labelW = new QLabel(label, w);
+ labelW->setAlignment(Qt::AlignCenter);
+ labelW->setMinimumHeight(60);
+}
+
+void
+FileLocateDialog::slotUser3()
+{
+ if (!m_file.isEmpty()) {
+ m_file = KFileDialog::getOpenFileName
+ (":WAVS",
+ i18n("%1|Requested file (%2)\n*.wav|WAV files (*.wav)")
+ .arg(QFileInfo(m_file).fileName())
+ .arg(QFileInfo(m_file).fileName()),
+ this, i18n("Select an Audio File"));
+
+ RG_DEBUG << "FileLocateDialog::slotUser3() : m_file = " << m_file << endl;
+
+ if (m_file.isEmpty()) {
+ RG_DEBUG << "FileLocateDialog::slotUser3() : reject\n";
+ reject();
+ } else {
+ QFileInfo fileInfo(m_file);
+ m_path = fileInfo.dirPath();
+ accept();
+ }
+
+ } else
+ reject();
+}
+
+void
+FileLocateDialog::slotUser1()
+{
+ reject();
+}
+
+void
+FileLocateDialog::slotUser2()
+{
+ done( -1);
+}
+
+}
+#include "FileLocateDialog.moc"
diff --git a/src/gui/dialogs/FileLocateDialog.h b/src/gui/dialogs/FileLocateDialog.h
new file mode 100644
index 0000000..1786221
--- /dev/null
+++ b/src/gui/dialogs/FileLocateDialog.h
@@ -0,0 +1,66 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_FILELOCATEDIALOG_H_
+#define _RG_FILELOCATEDIALOG_H_
+
+#include <kdialogbase.h>
+#include <qstring.h>
+
+
+class QWidget;
+
+
+namespace Rosegarden
+{
+
+
+
+class FileLocateDialog : public KDialogBase
+{
+ Q_OBJECT
+
+public:
+ FileLocateDialog(QWidget *parent,
+ const QString &file,
+ const QString &path);
+
+ QString getDirectory() { return m_path; }
+ QString getFilename() { return m_file; }
+
+protected:
+ virtual void slotUser1();
+ virtual void slotUser2();
+ virtual void slotUser3();
+
+ QString m_file;
+ QString m_path;
+
+};
+
+
+}
+
+#endif
diff --git a/src/gui/dialogs/FileMergeDialog.cpp b/src/gui/dialogs/FileMergeDialog.cpp
new file mode 100644
index 0000000..d997327
--- /dev/null
+++ b/src/gui/dialogs/FileMergeDialog.cpp
@@ -0,0 +1,84 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "FileMergeDialog.h"
+
+#include <klocale.h>
+#include <kcombobox.h>
+#include <kdialogbase.h>
+#include <qcheckbox.h>
+#include <qhbox.h>
+#include <qlabel.h>
+#include <qstring.h>
+#include <qvbox.h>
+#include <qwidget.h>
+#include "document/RosegardenGUIDoc.h"
+
+
+namespace Rosegarden
+{
+
+FileMergeDialog::FileMergeDialog(QWidget *parent,
+ QString /*fileName*/,
+ bool timingsDiffer) :
+ KDialogBase(parent, 0, true, i18n("Merge File"), Ok | Cancel | Help)
+{
+ setHelp("file-merge");
+
+ QVBox *vbox = makeVBoxMainWidget();
+
+ QHBox *hbox = new QHBox(vbox);
+ new QLabel(i18n("Merge new file "), hbox);
+
+ m_choice = new KComboBox(hbox);
+ m_choice->insertItem(i18n("At start of existing composition"));
+ m_choice->insertItem(i18n("From end of existing composition"));
+ m_useTimings = 0;
+
+ if (timingsDiffer) {
+ new QLabel(i18n("The file has different time signatures or tempos."), vbox);
+ m_useTimings = new QCheckBox(i18n("Import these as well"), vbox);
+ m_useTimings->setChecked(false);
+ }
+}
+
+int
+FileMergeDialog::getMergeOptions()
+{
+ int options = MERGE_KEEP_OLD_TIMINGS | MERGE_IN_NEW_TRACKS;
+
+ if (m_choice->currentItem() == 1) {
+ options |= MERGE_AT_END;
+ }
+
+ if (m_useTimings && m_useTimings->isChecked()) {
+ options |= MERGE_KEEP_NEW_TIMINGS;
+ }
+
+ return options;
+}
+
+}
+#include "FileMergeDialog.moc"
diff --git a/src/gui/dialogs/FileMergeDialog.h b/src/gui/dialogs/FileMergeDialog.h
new file mode 100644
index 0000000..f305cae
--- /dev/null
+++ b/src/gui/dialogs/FileMergeDialog.h
@@ -0,0 +1,63 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_FILEMERGEDIALOG_H_
+#define _RG_FILEMERGEDIALOG_H_
+
+#include <kdialogbase.h>
+#include <qstring.h>
+
+
+class QWidget;
+class QCheckBox;
+class KComboBox;
+
+
+namespace Rosegarden
+{
+
+
+
+class FileMergeDialog : public KDialogBase
+{
+ Q_OBJECT
+
+public:
+ FileMergeDialog(QWidget *parent, QString fileName, bool timingsDiffer);
+
+ int getMergeOptions();
+
+private:
+ KComboBox *m_choice;
+ QCheckBox *m_useTimings;
+};
+
+
+// Locate a file
+//
+
+}
+
+#endif
diff --git a/src/gui/dialogs/FloatEdit.cpp b/src/gui/dialogs/FloatEdit.cpp
new file mode 100644
index 0000000..06e8aa3
--- /dev/null
+++ b/src/gui/dialogs/FloatEdit.cpp
@@ -0,0 +1,72 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "FloatEdit.h"
+
+#include "gui/widgets/HSpinBox.h"
+#include <kdialogbase.h>
+#include <qgroupbox.h>
+#include <qlabel.h>
+#include <qstring.h>
+#include <qvbox.h>
+#include <qwidget.h>
+#include <cmath>
+
+namespace Rosegarden
+{
+
+FloatEdit::FloatEdit(QWidget *parent,
+ const QString &title,
+ const QString &text,
+ float min,
+ float max,
+ float value,
+ float step):
+ KDialogBase(parent, "rosegardenFloatEdit", true, title, Ok | Cancel, Ok)
+{
+ QVBox *vbox = makeVBoxMainWidget();
+ QGroupBox *groupBox = new QGroupBox(1, Horizontal, text, vbox);
+ QVBox *inVbox = new QVBox(groupBox);
+
+ // Calculate decimal points according to the step size
+ //
+ double calDP = log10(step);
+ int dps = 0;
+ if (calDP < 0.0)
+ dps = int( -calDP);
+ //std::cout << "CAL DP = " << calDP << ", dps = " << dps << std::endl;
+
+ m_spin = new HSpinBox(inVbox, value, 1, min, max, dps);
+ new QLabel(QString("(min: %1, max: %2)").arg(min).arg(max), inVbox);
+}
+
+float
+FloatEdit::getValue() const
+{
+ return m_spin->valuef();
+}
+
+}
+#include "FloatEdit.moc"
diff --git a/src/gui/dialogs/FloatEdit.h b/src/gui/dialogs/FloatEdit.h
new file mode 100644
index 0000000..24f1b2c
--- /dev/null
+++ b/src/gui/dialogs/FloatEdit.h
@@ -0,0 +1,68 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_ROSEGARDENFLOATEDIT_H_
+#define _RG_ROSEGARDENFLOATEDIT_H_
+
+#include <kdialogbase.h>
+
+
+class QWidget;
+class QString;
+class QLabel;
+
+
+namespace Rosegarden
+{
+
+class HSpinBox;
+
+
+class FloatEdit : public KDialogBase
+{
+ Q_OBJECT
+
+public:
+ FloatEdit(QWidget *parent,
+ const QString &title,
+ const QString &text,
+ float min,
+ float max,
+ float value,
+ float step);
+
+ float getValue() const;
+
+protected:
+
+ QLabel *m_text;
+ HSpinBox *m_spin;
+};
+
+
+
+}
+
+#endif
diff --git a/src/gui/dialogs/IdentifyTextCodecDialog.cpp b/src/gui/dialogs/IdentifyTextCodecDialog.cpp
new file mode 100644
index 0000000..07b5ec1
--- /dev/null
+++ b/src/gui/dialogs/IdentifyTextCodecDialog.cpp
@@ -0,0 +1,173 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "IdentifyTextCodecDialog.h"
+
+#include <klocale.h>
+#include "misc/Strings.h"
+#include "base/NotationTypes.h"
+#include <kcombobox.h>
+#include <kdialogbase.h>
+#include <qfont.h>
+#include <qlabel.h>
+#include <qstring.h>
+#include <qtextcodec.h>
+#include <qvbox.h>
+#include <qwidget.h>
+
+
+namespace Rosegarden
+{
+
+IdentifyTextCodecDialog::IdentifyTextCodecDialog(QWidget *parent,
+ std::string text) :
+ KDialogBase(parent, 0, true, i18n("Choose Text Encoding"), Ok),
+ m_text(text)
+{
+ QVBox *vbox = makeVBoxMainWidget();
+ new QLabel(i18n("\nThis file contains text in an unknown language encoding.\n\nPlease select one of the following estimated text encodings\nfor use with the text in this file:\n"), vbox);
+
+ KComboBox *codecs = new KComboBox(vbox);
+
+ std::string defaultCodec;
+ QTextCodec *cc = QTextCodec::codecForContent(text.c_str(), text.length());
+ QTextCodec *codec = 0;
+
+ std::cerr << "cc is " << (cc ? cc->name() : "null") << std::endl;
+
+ std::map<std::string, QString> codecDescriptions;
+ codecDescriptions["SJIS"] = i18n("Japanese Shift-JIS");
+ codecDescriptions["UTF-8"] = i18n("Unicode variable-width");
+ codecDescriptions["ISO 8859-1"] = i18n("Western Europe");
+ codecDescriptions["ISO 8859-15"] = i18n("Western Europe + Euro");
+ codecDescriptions["ISO 8859-2"] = i18n("Eastern Europe");
+ codecDescriptions["ISO 8859-3"] = i18n("Southern Europe");
+ codecDescriptions["ISO 8859-4"] = i18n("Northern Europe");
+ codecDescriptions["ISO 8859-5"] = i18n("Cyrillic");
+ codecDescriptions["ISO 8859-6"] = i18n("Arabic");
+ codecDescriptions["ISO 8859-7"] = i18n("Greek");
+ codecDescriptions["ISO 8859-8"] = i18n("Hebrew");
+ codecDescriptions["ISO 8859-9"] = i18n("Turkish");
+ codecDescriptions["ISO 8859-10"] = i18n("Nordic");
+ codecDescriptions["ISO 8859-11"] = i18n("Thai");
+ codecDescriptions["ISO 8859-13"] = i18n("Baltic");
+ codecDescriptions["ISO 8859-14"] = i18n("Celtic");
+ codecDescriptions["SJIS"] = i18n("Japanese Shift-JIS");
+ codecDescriptions["Big5"] = i18n("Traditional Chinese");
+ codecDescriptions["GB18030"] = i18n("Simplified Chinese");
+ codecDescriptions["KOI8-R"] = i18n("Russian");
+ codecDescriptions["KOI8-U"] = i18n("Ukrainian");
+ codecDescriptions["TSCII"] = i18n("Tamil");
+
+ int i = 0;
+ int current = -1;
+
+ int selectedProbability = 0;
+ if (cc) {
+ selectedProbability = cc->heuristicContentMatch
+ (m_text.c_str(), m_text.length());
+ }
+
+ while ((codec = QTextCodec::codecForIndex(i)) != 0) {
+
+ int probability = codec->heuristicContentMatch
+ (m_text.c_str(), m_text.length());
+
+ if (probability <= 0) {
+ ++i;
+ continue;
+ }
+
+ std::string name = codec->name();
+
+ std::cerr << "codec " << name << " probability " << probability << std::endl;
+
+ if (name == "UTF-8" &&
+ (!cc || (cc->name() != name)) &&
+ probability > selectedProbability/2) {
+ std::cerr << "UTF-8 has a decent probability, selecting it instead to promote global harmony" << std::endl;
+ cc = codec;
+ }
+
+ QString description = codecDescriptions[name];
+ if (description == "") {
+ if (strtoqstr(name).left(3) == "CP ") {
+ description = i18n("Microsoft Code Page %1").
+ arg(strtoqstr(name).right(name.length() - 3));
+ }
+ }
+
+ if (description != "") {
+ description = i18n("%1 (%2)").arg(strtoqstr(name)).arg(description);
+ } else {
+ description = strtoqstr(name);
+ }
+
+ codecs->insertItem(description, 0);
+ m_codecs.push_front(name);
+ if (current >= 0) ++current;
+
+ if (cc && (name == cc->name())) {
+ current = 0;
+ }
+
+ ++i;
+ }
+
+ connect(codecs, SIGNAL(activated(int)),
+ this, SLOT(slotCodecSelected(int)));
+
+ new QLabel(i18n("\nExample text from file:"), vbox);
+ m_example = new QLabel("", vbox);
+ QFont font;
+ font.setStyleHint(QFont::TypeWriter);
+ m_example->setFont(font);
+ m_example->setPaletteForegroundColor(Qt::blue);
+ std::cerr << "calling slotCodecSelected(" << current << ")" << std::endl;
+ if (current < 0) current = 0;
+ codecs->setCurrentItem(current);
+ slotCodecSelected(current);
+}
+
+void
+IdentifyTextCodecDialog::slotCodecSelected(int i)
+{
+// std::cerr << "codec index = " << i << std::endl;
+ if (i < 0 || i >= m_codecs.size()) return;
+ std::string name = m_codecs[i];
+// std::cerr << "codecs: ";
+// for (int j = 0; j < m_codecs.size(); ++j) std::cerr << m_codecs[j] << " ";
+// std::cerr << std::endl;
+ QTextCodec *codec = QTextCodec::codecForName(strtoqstr(name));
+ if (!codec) return;
+ m_codec = qstrtostr(codec->name());
+ std::cerr << "Applying codec " << m_codec << std::endl;
+ QString outText = codec->toUnicode(m_text.c_str(), m_text.length());
+ if (outText.length() > 80) outText = outText.left(80);
+ m_example->setText("\"" + outText + "\"");
+}
+
+}
+#include "IdentifyTextCodecDialog.moc"
diff --git a/src/gui/dialogs/IdentifyTextCodecDialog.h b/src/gui/dialogs/IdentifyTextCodecDialog.h
new file mode 100644
index 0000000..288cd17
--- /dev/null
+++ b/src/gui/dialogs/IdentifyTextCodecDialog.h
@@ -0,0 +1,71 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_IDENTIFYTEXTCODECDIALOG_H_
+#define _RG_IDENTIFYTEXTCODECDIALOG_H_
+
+#include <string>
+#include <kdialogbase.h>
+#include <deque>
+
+
+class QWidget;
+class QLabel;
+
+
+namespace Rosegarden
+{
+
+
+
+class IdentifyTextCodecDialog : public KDialogBase
+{
+ Q_OBJECT
+
+public:
+ IdentifyTextCodecDialog(QWidget *parent, std::string text);
+
+ std::string getCodec() const { return m_codec; }
+
+protected slots:
+ void slotCodecSelected(int);
+
+protected:
+ std::string m_text;
+ std::string m_codec;
+ std::deque<std::string> m_codecs;
+ QLabel *m_example;
+};
+
+
+/*
+ * Creates a small dialog box containing a PitchChooser widget. The
+ * info paramter provides extra information as a reminder what this particular
+ * picker is for, eg. Highest, Lowest, From, To
+ */
+
+}
+
+#endif
diff --git a/src/gui/dialogs/ImportDeviceDialog.cpp b/src/gui/dialogs/ImportDeviceDialog.cpp
new file mode 100644
index 0000000..58a6ce5
--- /dev/null
+++ b/src/gui/dialogs/ImportDeviceDialog.cpp
@@ -0,0 +1,389 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "ImportDeviceDialog.h"
+#include <qlayout.h>
+#include <kapplication.h>
+
+#include <klocale.h>
+#include "misc/Strings.h"
+#include "document/ConfigGroups.h"
+#include "base/MidiDevice.h"
+#include "base/MidiProgram.h"
+#include "document/RosegardenGUIDoc.h"
+#include "sound/SF2PatchExtractor.h"
+#include <kcombobox.h>
+#include <kconfig.h>
+#include <kdialogbase.h>
+#include <kmessagebox.h>
+#include <kurl.h>
+#include <kio/netaccess.h>
+#include <qbuttongroup.h>
+#include <qcheckbox.h>
+#include <qgroupbox.h>
+#include <qhbox.h>
+#include <qlabel.h>
+#include <qradiobutton.h>
+#include <qstring.h>
+#include <qvbox.h>
+#include <qwidget.h>
+
+
+namespace Rosegarden
+{
+
+ImportDeviceDialog::ImportDeviceDialog(QWidget *parent, KURL url) :
+ KDialogBase(parent, "importdevicedialog", true,
+ i18n("Import from Device..."),
+ Ok | Cancel, Ok),
+ m_url(url),
+ m_fileDoc(0),
+ m_device(0)
+{}
+
+ImportDeviceDialog::~ImportDeviceDialog()
+{
+ if (m_fileDoc) {
+ delete m_fileDoc;
+ } else {
+ delete m_device;
+ }
+}
+
+bool
+ImportDeviceDialog::doImport()
+{
+ QVBox *mainFrame = makeVBoxMainWidget();
+
+ if (m_url.isEmpty()) {
+ reject();
+ return false;
+ }
+
+ QString target;
+ if (KIO::NetAccess::download(m_url, target) == false) {
+ KMessageBox::error(this, i18n("Cannot download file %1").arg(m_url.prettyURL()));
+ return false;
+ }
+
+ bool fileRead = false;
+ if (SF2PatchExtractor::isSF2File(target.data())) {
+ fileRead = importFromSF2(target);
+ } else {
+ fileRead = importFromRG(target);
+ }
+ if (!fileRead) {
+ KMessageBox::error
+ (this, i18n("Cannot open file %1").arg(m_url.prettyURL()));
+ reject();
+ close();
+ return false;
+ }
+ if (m_devices.size() == 0) {
+ KMessageBox::sorry
+ (this, i18n("No devices found in file %1").arg(m_url.prettyURL()));
+ reject();
+ close();
+ return false;
+ }
+
+ QGroupBox *groupBox = new QGroupBox(2, Qt::Horizontal,
+ i18n("Source device"),
+ mainFrame);
+
+ QHBox *deviceBox = new QHBox(groupBox);
+ QHBoxLayout *bl = new QHBoxLayout(deviceBox);
+ bl->addWidget(new QLabel(i18n("Import from: "), deviceBox));
+
+ bool showRenameOption = false;
+
+ if (m_devices.size() > 1) {
+ m_deviceCombo = new KComboBox(deviceBox);
+ m_deviceLabel = 0;
+ bl->addWidget(m_deviceCombo);
+ } else {
+ m_deviceCombo = 0;
+ m_deviceLabel = new QLabel(deviceBox);
+ bl->addWidget(m_deviceLabel);
+ }
+
+ bl->addStretch(10);
+
+ int count = 1;
+ for (std::vector<MidiDevice *>::iterator i = m_devices.begin();
+ i != m_devices.end(); ++i) {
+ if ((*i)->getName() != "") {
+ showRenameOption = true;
+ } else {
+ (*i)->setName(qstrtostr(i18n("Device %1").arg(count)));
+ }
+ if (m_devices.size() > 1) {
+ m_deviceCombo->insertItem(strtoqstr((*i)->getName()));
+ } else {
+ m_deviceLabel->setText(strtoqstr((*i)->getName()));
+ }
+ ++count;
+ }
+
+ QHBox *optionsBox = new QHBox(mainFrame);
+
+ QGroupBox *gb = new QGroupBox(1, Horizontal, i18n("Options"),
+ optionsBox);
+
+ m_importBanks = new QCheckBox(i18n("Import banks"), gb);
+ m_importKeyMappings = new QCheckBox(i18n("Import key mappings"), gb);
+ m_importControllers = new QCheckBox(i18n("Import controllers"), gb);
+
+ if (showRenameOption) {
+ m_rename = new QCheckBox(i18n("Import device name"), gb);
+ } else {
+ m_rename = 0;
+ }
+
+ m_buttonGroup = new QButtonGroup(1, Qt::Horizontal,
+ i18n("Bank import behavior"),
+ optionsBox);
+ m_mergeBanks = new QRadioButton(i18n("Merge banks"), m_buttonGroup);
+ m_overwriteBanks = new QRadioButton(i18n("Overwrite banks"), m_buttonGroup);
+
+ KConfig *config = kapp->config();
+ config->setGroup(GeneralOptionsConfigGroup);
+
+ m_importBanks->setChecked(config->readBoolEntry("importbanks", true));
+ m_importKeyMappings->setChecked(config->readBoolEntry("importkeymappings", true));
+ m_importControllers->setChecked(config->readBoolEntry("importcontrollers", true));
+
+ bool rename = config->readBoolEntry("importbanksrename", true);
+ if (m_rename)
+ m_rename->setChecked(rename);
+
+ bool overwrite = config->readBoolEntry("importbanksoverwrite", true);
+ if (overwrite)
+ m_buttonGroup->setButton(1);
+ else
+ m_buttonGroup->setButton(0);
+
+ return true;
+}
+
+void
+ImportDeviceDialog::slotOk()
+{
+ int index = 0;
+ if (m_deviceCombo)
+ index = m_deviceCombo->currentItem();
+ m_device = m_devices[index];
+
+ int v = m_buttonGroup->id(m_buttonGroup->selected());
+ KConfig *config = kapp->config();
+ config->setGroup(GeneralOptionsConfigGroup);
+ config->writeEntry("importbanksoverwrite", v == 1);
+ if (m_rename)
+ config->writeEntry("importbanksrename", m_rename->isChecked());
+ accept();
+}
+
+void
+ImportDeviceDialog::slotCancel()
+{
+ reject();
+}
+
+std::string ImportDeviceDialog::getDeviceName() const
+{
+ return m_device->getName();
+}
+
+const BankList& ImportDeviceDialog::getBanks() const
+{
+ return m_device->getBanks();
+}
+
+const ProgramList& ImportDeviceDialog::getPrograms() const
+{
+ return m_device->getPrograms();
+}
+
+const KeyMappingList& ImportDeviceDialog::getKeyMappings() const
+{
+ return m_device->getKeyMappings();
+}
+
+const ControlList& ImportDeviceDialog::getControllers() const
+{
+ return m_device->getControlParameters();
+}
+
+std::string ImportDeviceDialog::getLibrarianName() const
+{
+ return m_device->getLibrarianName();
+}
+
+std::string ImportDeviceDialog::getLibrarianEmail() const
+{
+ return m_device->getLibrarianEmail();
+}
+
+MidiDevice::VariationType
+ImportDeviceDialog::getVariationType() const
+{
+ return m_device->getVariationType();
+}
+
+bool
+ImportDeviceDialog::shouldImportBanks() const
+{
+ return m_importBanks->isChecked();
+}
+
+bool
+ImportDeviceDialog::shouldImportKeyMappings() const
+{
+ return m_importKeyMappings->isChecked();
+}
+
+bool
+ImportDeviceDialog::shouldImportControllers() const
+{
+ return m_importControllers->isChecked();
+}
+
+bool
+ImportDeviceDialog::shouldOverwriteBanks() const
+{
+ return m_buttonGroup->id(m_buttonGroup->selected()) != 0;
+}
+
+bool
+ImportDeviceDialog::shouldRename() const
+{
+ return m_rename ? m_rename->isChecked() : false;
+}
+
+bool
+ImportDeviceDialog::importFromRG(QString fileName)
+{
+ m_fileDoc = new RosegardenGUIDoc(RosegardenGUIApp::self(), 0, true); // skipAutoload
+
+ // Add some dummy devices for bank population when we open the document.
+ // We guess that the file won't have more than 32 devices.
+ //
+ // for (unsigned int i = 0; i < 32; i++) {
+ // m_fileDoc->getStudio().addDevice("", i, Device::Midi);
+ // }
+
+ if (!m_fileDoc->openDocument(fileName, false)) {
+ return false;
+ }
+
+ m_devices.clear();
+
+ DeviceList *list = m_fileDoc->getStudio().getDevices();
+ if (list->size() == 0) {
+ return true; // true because we successfully read the document
+ }
+
+ for (DeviceListIterator it = list->begin();
+ it != list->end(); ++it) {
+
+ MidiDevice *device =
+ dynamic_cast<MidiDevice*>(*it);
+
+ if (device) {
+ std::vector<MidiBank> banks =
+ device->getBanks();
+
+ // DMM - check for controllers too, because some users have
+ // created .rgd files that contain only controllers
+ // see bug #1183522
+ //
+ std::vector<ControlParameter> controllers =
+ device->getControlParameters();
+
+ // We've got a bank on a Device fom this file
+ // (or a device that contains controllers or key mappings)
+ //
+ if (banks.size() ||
+ controllers.size() ||
+ device->getKeyMappings().size())
+ m_devices.push_back(device);
+ }
+ }
+
+ return true;
+}
+
+bool
+ImportDeviceDialog::importFromSF2(QString filename)
+{
+ SF2PatchExtractor::Device sf2device;
+ try {
+ sf2device = SF2PatchExtractor::read(filename.data());
+
+ // These exceptions shouldn't happen -- the isSF2File call before this
+ // one should have weeded them out
+ } catch (SF2PatchExtractor::FileNotFoundException e) {
+ return false;
+ } catch (SF2PatchExtractor::WrongFileFormatException e) {
+ return false;
+ }
+
+ std::vector<MidiBank> banks;
+ std::vector<MidiProgram> programs;
+
+ for (SF2PatchExtractor::Device::const_iterator i = sf2device.begin();
+ i != sf2device.end(); ++i) {
+
+ int bankNumber = i->first;
+ const SF2PatchExtractor::Bank &sf2bank = i->second;
+
+ int msb = bankNumber / 128;
+ int lsb = bankNumber % 128;
+
+ MidiBank bank
+ (msb == 1, msb, lsb,
+ qstrtostr(i18n("Bank %1:%2").arg(msb).arg(lsb)));
+
+ banks.push_back(bank);
+
+ for (SF2PatchExtractor::Bank::const_iterator j = sf2bank.begin();
+ j != sf2bank.end(); ++j) {
+
+ MidiProgram program(bank, j->first, j->second);
+ programs.push_back(program);
+ }
+ }
+
+ MidiDevice *device = new MidiDevice
+ (0, "", MidiDevice::Play);
+ device->replaceBankList(banks);
+ device->replaceProgramList(programs);
+ m_devices.push_back(device);
+
+ return true;
+}
+
+}
+#include "ImportDeviceDialog.moc"
diff --git a/src/gui/dialogs/ImportDeviceDialog.h b/src/gui/dialogs/ImportDeviceDialog.h
new file mode 100644
index 0000000..bb79e3b
--- /dev/null
+++ b/src/gui/dialogs/ImportDeviceDialog.h
@@ -0,0 +1,110 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_IMPORTDEVICEDIALOG_H_
+#define _RG_IMPORTDEVICEDIALOG_H_
+
+#include "base/MidiDevice.h"
+#include <string>
+#include <kdialogbase.h>
+#include <qstring.h>
+#include <vector>
+#include <kurl.h>
+
+
+class QWidget;
+class QRadioButton;
+class QLabel;
+class QCheckBox;
+class QButtonGroup;
+class ProgramList;
+class KeyMappingList;
+class KComboBox;
+class ControlList;
+class BankList;
+
+
+namespace Rosegarden
+{
+
+class RosegardenGUIDoc;
+
+
+class ImportDeviceDialog : public KDialogBase
+{
+ Q_OBJECT
+
+public:
+ ImportDeviceDialog(QWidget *parent, KURL url);
+ virtual ~ImportDeviceDialog();
+
+ bool doImport();
+
+ bool shouldImportBanks() const;
+ bool shouldImportKeyMappings() const;
+ bool shouldImportControllers() const;
+ bool shouldOverwriteBanks() const;
+ bool shouldRename() const;
+
+ std::string getDeviceName() const;
+ const BankList &getBanks() const;
+ const ProgramList &getPrograms() const;
+ const KeyMappingList &getKeyMappings() const;
+ const ControlList &getControllers() const;
+ std::string getLibrarianName() const;
+ std::string getLibrarianEmail() const;
+ MidiDevice::VariationType getVariationType() const;
+
+public slots:
+ void slotOk();
+ void slotCancel();
+
+protected:
+ bool importFromRG(QString fileName);
+ bool importFromSF2(QString fileName);
+
+ KURL m_url;
+
+ KComboBox *m_deviceCombo;
+ QLabel *m_deviceLabel;
+
+ QCheckBox *m_importBanks;
+ QCheckBox *m_importKeyMappings;
+ QCheckBox *m_importControllers;
+ QCheckBox *m_rename;
+
+ QButtonGroup *m_buttonGroup;
+ QRadioButton *m_mergeBanks;
+ QRadioButton *m_overwriteBanks;
+
+ RosegardenGUIDoc *m_fileDoc;
+ std::vector<MidiDevice *> m_devices;
+ MidiDevice *m_device;
+};
+
+
+}
+
+#endif
diff --git a/src/gui/dialogs/InterpretDialog.cpp b/src/gui/dialogs/InterpretDialog.cpp
new file mode 100644
index 0000000..b11e3c4
--- /dev/null
+++ b/src/gui/dialogs/InterpretDialog.cpp
@@ -0,0 +1,123 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "InterpretDialog.h"
+#include <kapplication.h>
+
+#include <klocale.h>
+#include "document/ConfigGroups.h"
+#include "commands/notation/InterpretCommand.h"
+#include <kconfig.h>
+#include <kdialogbase.h>
+#include <qcheckbox.h>
+#include <qgroupbox.h>
+#include <qvbox.h>
+#include <qwidget.h>
+
+
+namespace Rosegarden
+{
+
+InterpretDialog::InterpretDialog(QWidget *parent) :
+ KDialogBase(parent, 0, true, i18n("Interpret"), Ok | Cancel | Help)
+{
+ setHelp("nv-interpret");
+
+ QVBox *vbox = makeVBoxMainWidget();
+ QGroupBox *groupBox = new QGroupBox
+ (1, Horizontal, i18n("Interpretations to apply"), vbox);
+
+ m_applyTextDynamics = new QCheckBox
+ (i18n("Apply text dynamics (p, mf, ff etc)"), groupBox);
+ m_applyHairpins = new QCheckBox
+ (i18n("Apply hairpin dynamics"), groupBox);
+ m_stressBeats = new QCheckBox
+ (i18n("Stress beats"), groupBox);
+ m_articulate = new QCheckBox
+ (i18n("Articulate slurs, staccato, tenuto etc"), groupBox);
+ m_allInterpretations = new QCheckBox
+ (i18n("All available interpretations"), groupBox);
+
+ KConfig *config = kapp->config();
+ config->setGroup(NotationViewConfigGroup);
+
+ m_allInterpretations->setChecked
+ (config->readBoolEntry("interpretall", true));
+ m_applyTextDynamics->setChecked
+ (config->readBoolEntry("interprettextdynamics", true));
+ m_applyHairpins->setChecked
+ (config->readBoolEntry("interprethairpins", true));
+ m_stressBeats->setChecked
+ (config->readBoolEntry("interpretstressbeats", true));
+ m_articulate->setChecked
+ (config->readBoolEntry("interpretarticulate", true));
+
+ connect(m_allInterpretations,
+ SIGNAL(clicked()), this, SLOT(slotAllBoxChanged()));
+
+ slotAllBoxChanged();
+}
+
+void
+InterpretDialog::slotAllBoxChanged()
+{
+ bool all = m_allInterpretations->isChecked();
+ m_applyTextDynamics->setEnabled(!all);
+ m_applyHairpins->setEnabled(!all);
+ m_stressBeats->setEnabled(!all);
+ m_articulate->setEnabled(!all);
+}
+
+int
+InterpretDialog::getInterpretations()
+{
+ KConfig *config = kapp->config();
+ config->setGroup(NotationViewConfigGroup);
+
+ config->writeEntry("interpretall", m_allInterpretations->isChecked());
+ config->writeEntry("interprettextdynamics", m_applyTextDynamics->isChecked());
+ config->writeEntry("interprethairpins", m_applyHairpins->isChecked());
+ config->writeEntry("interpretstressbeats", m_stressBeats->isChecked());
+ config->writeEntry("interpretarticulate", m_articulate->isChecked());
+
+ if (m_allInterpretations->isChecked()) {
+ return InterpretCommand::AllInterpretations;
+ } else {
+ int in = 0;
+ if (m_applyTextDynamics->isChecked())
+ in |= InterpretCommand::ApplyTextDynamics;
+ if (m_applyHairpins->isChecked())
+ in |= InterpretCommand::ApplyHairpins;
+ if (m_stressBeats->isChecked())
+ in |= InterpretCommand::StressBeats;
+ if (m_articulate->isChecked()) {
+ in |= InterpretCommand::Articulate;
+ }
+ return in;
+ }
+}
+
+}
+#include "InterpretDialog.moc"
diff --git a/src/gui/dialogs/InterpretDialog.h b/src/gui/dialogs/InterpretDialog.h
new file mode 100644
index 0000000..75c8694
--- /dev/null
+++ b/src/gui/dialogs/InterpretDialog.h
@@ -0,0 +1,65 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_INTERPRETDIALOG_H_
+#define _RG_INTERPRETDIALOG_H_
+
+#include <kdialogbase.h>
+
+
+class QWidget;
+class QCheckBox;
+
+
+namespace Rosegarden
+{
+
+
+
+class InterpretDialog : public KDialogBase
+{
+ Q_OBJECT
+public:
+ InterpretDialog(QWidget *parent);
+
+ // an OR from InterpretCommand's constants
+ int getInterpretations();
+
+protected slots:
+ void slotAllBoxChanged();
+
+private:
+ QCheckBox *m_allInterpretations;
+ QCheckBox *m_applyTextDynamics;
+ QCheckBox *m_applyHairpins;
+ QCheckBox *m_stressBeats;
+ QCheckBox *m_articulate;
+};
+
+
+
+}
+
+#endif
diff --git a/src/gui/dialogs/IntervalDialog.cpp b/src/gui/dialogs/IntervalDialog.cpp
new file mode 100644
index 0000000..061fc31
--- /dev/null
+++ b/src/gui/dialogs/IntervalDialog.cpp
@@ -0,0 +1,367 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "IntervalDialog.h"
+#include <qlayout.h>
+
+#include <iostream>
+#include <klocale.h>
+#include "misc/Strings.h"
+#include "base/MidiDevice.h"
+#include "base/NotationRules.h"
+#include <kcombobox.h>
+#include <kdialogbase.h>
+#include <qframe.h>
+#include <qgroupbox.h>
+#include <qcheckbox.h>
+#include <qlabel.h>
+#include <qradiobutton.h>
+#include <qbuttongroup.h>
+#include <qsizepolicy.h>
+#include <qstring.h>
+#include <qvbox.h>
+#include <qwidget.h>
+
+
+namespace Rosegarden
+{
+
+IntervalDialog::IntervalDialog(QWidget *parent, bool askChangeKey, bool askTransposeSegmentBack) :
+ KDialogBase(parent, 0, true, i18n("Specify Interval"), Ok | Cancel )
+{
+ QVBox *vBox = makeVBoxMainWidget();
+
+ QHBox *hBox = new QHBox( vBox );
+
+ m_referencenote = new DiatonicPitchChooser( i18n("Reference note:"), hBox );
+ m_targetnote = new DiatonicPitchChooser( i18n("Target note:"), hBox );
+
+ intervalChromatic = 0;
+ intervalDiatonic = 0;
+
+ //m_intervalPitchLabel = new QLabel( i18n("Pitch: %1").arg(intervalChromatic), hBox);
+ //m_intervalOctavesLabel = new QLabel( i18n("Octaves: %1").arg(intervalDiatonic / 7), hBox);
+ //m_intervalStepsLabel = new QLabel( i18n("Steps: %1").arg(intervalDiatonic % 7), hBox);
+
+ m_intervalLabel = new QLabel( i18n("a perfect unison"), vBox);
+ m_intervalLabel->setAlignment(Qt::AlignCenter);
+ QFont font(m_intervalLabel->font());
+ font.setItalic(true);
+ m_intervalLabel->setFont(font);
+
+ if (askChangeKey)
+ {
+ QButtonGroup *affectKeyGroup = new QButtonGroup(1, Horizontal, i18n("Effect on Key"), vBox);
+ m_transposeWithinKey = new QRadioButton(i18n("Transpose within key"), affectKeyGroup);
+ m_transposeWithinKey->setChecked(true);
+ m_transposeChangingKey = new QRadioButton(i18n("Change key for selection"), affectKeyGroup);
+ }
+ else
+ {
+ m_transposeChangingKey = NULL;
+ m_transposeWithinKey = NULL;
+ }
+
+ if (askTransposeSegmentBack)
+ {
+ m_transposeSegmentBack = new QCheckBox( i18n("Adjust segment transposition in opposite direction (maintain audible pitch)"), vBox );
+ m_transposeSegmentBack->setTristate(false);
+ m_transposeSegmentBack->setChecked(false);
+ }
+ else
+ {
+ m_transposeSegmentBack = NULL;
+ }
+
+ connect(m_referencenote, SIGNAL(noteChanged(int,int,int)),
+ this, SLOT(slotSetReferenceNote(int,int,int)));
+
+ connect(m_targetnote, SIGNAL(noteChanged(int,int,int)),
+ this, SLOT(slotSetTargetNote(int,int,int)));
+}
+
+// number of octaves the notes are apart
+int
+IntervalDialog::getOctaveDistance()
+{
+ return m_targetnote->getOctave() - m_referencenote->getOctave();
+}
+
+// chromatic distance between the steps, not taking account octaves or
+// accidentals
+int
+IntervalDialog::getStepDistanceChromatic()
+{
+ return scale_Cmajor[m_targetnote->getStep()] - scale_Cmajor[m_referencenote->getStep()];
+ // - getChromaticStepValue(m_referencestep->currentItem());
+ //return m_targetnote->getPitch() - m_referencenote->getPitch();
+}
+
+// correction due to accidentals
+int
+IntervalDialog::getAccidentalCorrectionChromatic()
+{
+ return m_targetnote->getAccidental() - m_referencenote->getAccidental();
+}
+
+int
+IntervalDialog::getDiatonicDistance()
+{
+ return getOctaveDistance() * 7 + m_targetnote->getStep() - m_referencenote->getStep();
+}
+
+int
+IntervalDialog::getChromaticDistance()
+{
+ return getOctaveDistance() * 12 + getStepDistanceChromatic() + getAccidentalCorrectionChromatic();
+}
+
+QString
+IntervalDialog::getIntervalName(int intervalDiatonic, int intervalChromatic)
+{
+ // displayInterval: an intervalDiatonic of -3 will yield a displayInterval of 3 and
+ // set the boolean 'down' to true.
+ int displayIntervalDiatonic = intervalDiatonic;
+ int displayIntervalChromatic = intervalChromatic;
+ bool down = (intervalDiatonic < 0 ||
+ (intervalDiatonic == 0 &&
+ intervalChromatic < 0));
+ if (down)
+ {
+ displayIntervalDiatonic = -displayIntervalDiatonic;
+ displayIntervalChromatic = -displayIntervalChromatic;
+ }
+
+ int octaves = displayIntervalDiatonic / 7;
+ int deviation = displayIntervalChromatic % 12 - scale_Cmajor[displayIntervalDiatonic % 7];
+ // Note (hjj):
+ // "1 octave and a diminished octave" is better than
+ // "2 octaves and a diminished unison"
+ if (displayIntervalDiatonic % 7 == 0) {
+ if (octaves > 0) {
+ deviation = (deviation < 5 ? deviation : deviation - 12);
+ } else if (octaves < 0) {
+ deviation = (deviation < 5 ? -deviation : 12 - deviation);
+ }
+ } else if (down) {
+ // Note (hjj):
+ // an augmented prime down, NOT a diminished prime down
+ deviation = -deviation;
+ }
+
+ // show the step for an unison only if the octave doesn't change, any other interval
+ // always, and augmented/dimnished unisons (modulo octaves) always.
+ bool showStep = displayIntervalDiatonic == 0 ||
+ displayIntervalDiatonic % 7 != 0 || deviation != 0;
+
+ QString textInterval = "";
+ QString textIntervalDeviated = "";
+ if (showStep)
+ {
+ switch (displayIntervalDiatonic % 7)
+ {
+ // First the diminished/perfect/augmented:
+ case 0: // unison or octaves
+ case 3: // fourth
+ case 4: // fifth
+ if (deviation == -1)
+ textIntervalDeviated += i18n("a diminished");
+ else if (deviation == 1)
+ textIntervalDeviated += i18n("an augmented");
+ else if (deviation == -2)
+ textIntervalDeviated += i18n("a doubly diminished");
+ else if (deviation == 2)
+ textIntervalDeviated += i18n("a doubly augmented");
+ else if (deviation == -3)
+ textIntervalDeviated += i18n("a triply diminished");
+ else if (deviation == 3)
+ textIntervalDeviated += i18n("a triply augmented");
+ else if (deviation == -4)
+ textIntervalDeviated += i18n("a quadruply diminished");
+ else if (deviation == 4)
+ textIntervalDeviated += i18n("a quadruply augmented");
+ else if (deviation == 0)
+ textIntervalDeviated += i18n("a perfect");
+ else
+ textIntervalDeviated += i18n("an (unknown, %1)").arg(deviation);
+ break;
+ // Then the major/minor:
+ case 1: // second
+ case 2: // third
+ case 5: // sixth
+ case 6: // seventh
+ if (deviation == -1)
+ textIntervalDeviated += i18n("a minor");
+ else if (deviation == 0)
+ textIntervalDeviated += i18n("a major");
+ else if (deviation == -2)
+ textIntervalDeviated += i18n("a diminished");
+ else if (deviation == 1)
+ textIntervalDeviated += i18n("an augmented");
+ else if (deviation == -3)
+ textIntervalDeviated += i18n("a doubly diminished");
+ else if (deviation == 2)
+ textIntervalDeviated += i18n("a doubly augmented");
+ else if (deviation == -4)
+ textIntervalDeviated += i18n("a triply diminished");
+ else if (deviation == 3)
+ textIntervalDeviated += i18n("a triply augmented");
+ else if (deviation == 4)
+ textIntervalDeviated += i18n("a quadruply augmented");
+ else if (deviation == 0)
+ textIntervalDeviated += i18n("a perfect");
+ else
+ textIntervalDeviated += i18n("an (unknown, %1)").arg(deviation);
+ break;
+ default:
+ textIntervalDeviated += i18n("an (unknown)");
+ }
+ switch (displayIntervalDiatonic % 7)
+ {
+ case 0:
+ // Note (hjj):
+ // "1 octave and a diminished octave" is better than
+ // "2 octaves and a diminished unison"
+ if (octaves > 0) {
+ textInterval += i18n("%1 octave").arg(textIntervalDeviated);
+ octaves--;
+ } else if (octaves < 0) {
+ textInterval += i18n("%1 octave").arg(textIntervalDeviated);
+ octaves++;
+ } else {
+ textInterval += i18n("%1 unison").arg(textIntervalDeviated);
+ }
+ break;
+ case 1:
+ textInterval += i18n("%1 second").arg(textIntervalDeviated);
+ break;
+ case 2:
+ textInterval += i18n("%1 third").arg(textIntervalDeviated);
+ break;
+ case 3:
+ textInterval += i18n("%1 fourth").arg(textIntervalDeviated);
+ break;
+ case 4:
+ textInterval += i18n("%1 fifth").arg(textIntervalDeviated);
+ break;
+ case 5:
+ textInterval += i18n("%1 sixth").arg(textIntervalDeviated);
+ break;
+ case 6:
+ textInterval += i18n("%1 seventh").arg(textIntervalDeviated);
+ break;
+ default:
+ textInterval += i18n("%1").arg(textIntervalDeviated);
+ }
+ }
+
+ if (displayIntervalChromatic != 0 || displayIntervalDiatonic != 0)
+ {
+ if (!down)
+ {
+ if (octaves != 0) {
+ if (showStep) {
+ return i18n("up 1 octave and %1",
+ "up %n octaves and %1",
+ octaves).arg(textInterval);
+ } else {
+ return i18n("up 1 octave",
+ "up %n octaves",
+ octaves);
+ }
+ } else {
+ return i18n("up %1").arg(textInterval);
+ }
+ }
+ else
+ {
+ if (octaves != 0) {
+ if (showStep) {
+ return i18n("down 1 octave and %1",
+ "down %n octaves and %1",
+ octaves).arg(textInterval);
+ } else {
+ return i18n("down 1 octave",
+ "down %n octaves",
+ octaves);
+ }
+ } else {
+ return i18n("down %1").arg(textInterval);
+ }
+ }
+ } else {
+ return i18n("a perfect unison");
+ }
+}
+
+void
+IntervalDialog::slotSetTargetNote(int pitch, int octave, int step)
+{
+ intervalChromatic = pitch - m_referencenote->getPitch();
+ intervalDiatonic = (octave * 7 + step) - (m_referencenote->getOctave() * 7 + m_referencenote->getStep());
+
+ m_intervalLabel->setText( getIntervalName( intervalDiatonic, intervalChromatic ) );
+}
+
+void
+IntervalDialog::slotSetReferenceNote(int pitch, int octave, int step)
+{
+ // recalculate target note based on reference note and current interval
+ int pitch_new = pitch + intervalChromatic;
+ int diatonic_new = (octave * 7 + step) + intervalDiatonic;
+ int octave_new = diatonic_new / 7;
+ int step_new = diatonic_new % 7;
+
+ m_targetnote->slotSetNote( pitch_new, octave_new, step_new );
+}
+
+bool
+IntervalDialog::getChangeKey()
+{
+ if (m_transposeChangingKey == NULL)
+ {
+ return false;
+ }
+ else
+ {
+ return m_transposeChangingKey->isChecked();
+ }
+}
+
+bool
+IntervalDialog::getTransposeSegmentBack()
+{
+ if (m_transposeSegmentBack == NULL)
+ {
+ return false;
+ }
+ else
+ {
+ return m_transposeSegmentBack->isChecked();
+ }
+}
+
+}
+#include "IntervalDialog.moc"
diff --git a/src/gui/dialogs/IntervalDialog.h b/src/gui/dialogs/IntervalDialog.h
new file mode 100644
index 0000000..b9927d2
--- /dev/null
+++ b/src/gui/dialogs/IntervalDialog.h
@@ -0,0 +1,94 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_INTERVALDIALOG_H_
+#define _RG_INTERVALDIALOG_H_
+
+#include <kdialogbase.h>
+#include <vector>
+#include "gui/application/RosegardenDCOP.h"
+#include "gui/widgets/DiatonicPitchChooser.h"
+
+
+class QWidget;
+class KComboBox;
+class QRadioButton;
+class QCheckBox;
+
+
+namespace Rosegarden
+{
+
+class RosegardenGUIDoc;
+
+
+class IntervalDialog : public KDialogBase
+{
+ Q_OBJECT
+public:
+ IntervalDialog(QWidget *parent, bool askChangeKey = false, bool askTransposeSegmentBack = false);
+
+ // Distance in semitones
+ int getChromaticDistance();
+
+ // Distance in steps
+ int getDiatonicDistance();
+
+ // Transpose within key or change the key?
+ bool getChangeKey();
+
+ // Transpose the segment itself in the opposite direction?
+ bool getTransposeSegmentBack();
+
+ static QString getIntervalName(int intervalDiatonic, int intervalChromatic);
+
+public slots:
+ void slotSetReferenceNote(int,int,int);
+ void slotSetTargetNote(int,int,int);
+
+private:
+ int getOctaveDistance();
+ int getStepDistanceChromatic();
+ int getAccidentalCorrectionChromatic();
+
+ DiatonicPitchChooser *m_referencenote;
+ DiatonicPitchChooser *m_targetnote;
+
+ QRadioButton *m_transposeWithinKey;
+ QRadioButton *m_transposeChangingKey;
+ bool changeKey;
+
+ QCheckBox *m_transposeSegmentBack;
+
+ int intervalChromatic;
+ int intervalDiatonic;
+ QLabel *m_intervalLabel;
+
+};
+
+
+}
+
+#endif
diff --git a/src/gui/dialogs/KeySignatureDialog.cpp b/src/gui/dialogs/KeySignatureDialog.cpp
new file mode 100644
index 0000000..c703c0a
--- /dev/null
+++ b/src/gui/dialogs/KeySignatureDialog.cpp
@@ -0,0 +1,402 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "KeySignatureDialog.h"
+
+#include <klocale.h>
+#include "misc/Strings.h"
+#include "base/NotationTypes.h"
+#include "gui/editors/notation/NotePixmapFactory.h"
+#include "gui/widgets/BigArrowButton.h"
+#include <kcombobox.h>
+#include <kdialogbase.h>
+#include <qbuttongroup.h>
+#include <qgroupbox.h>
+#include <qhbox.h>
+#include <qlabel.h>
+#include <qobject.h>
+#include <qpixmap.h>
+#include <qradiobutton.h>
+#include <qstring.h>
+#include <qtooltip.h>
+#include <qvbox.h>
+#include <qwidget.h>
+#include <qcheckbox.h>
+#include <algorithm>
+
+namespace Rosegarden
+{
+
+KeySignatureDialog::KeySignatureDialog(QWidget *parent,
+ NotePixmapFactory *npf,
+ Clef clef,
+ Rosegarden::Key defaultKey,
+ bool showApplyToAll,
+ bool showConversionOptions,
+ QString explanatoryText) :
+ KDialogBase(parent, 0, true, i18n("Key Change"), Ok | Cancel | Help),
+ m_notePixmapFactory(npf),
+ m_key(defaultKey),
+ m_clef(clef),
+ m_valid(true),
+ m_ignoreComboChanges(false),
+ m_explanatoryLabel(0),
+ m_applyToAllButton(0),
+ m_noPercussionCheckBox(0)
+{
+ setHelp("nv-signatures-key");
+
+ QVBox *vbox = makeVBoxMainWidget();
+
+ QHBox *keyBox = 0;
+ QHBox *nameBox = 0;
+
+ QGroupBox *keyFrame = new QGroupBox
+ (1, Horizontal, i18n("Key signature"), vbox);
+
+ QGroupBox *transposeFrame = new QButtonGroup
+ (1, Horizontal, i18n("Key transposition"), vbox);
+
+ QGroupBox *buttonFrame = new QButtonGroup
+ (1, Horizontal, i18n("Scope"), vbox);
+
+ QButtonGroup *conversionFrame = new QButtonGroup
+ (1, Horizontal, i18n("Existing notes following key change"), vbox);
+
+ keyBox = new QHBox(keyFrame);
+ nameBox = new QHBox(keyFrame);
+
+ QLabel *explanatoryLabel = 0;
+ if (explanatoryText) {
+ explanatoryLabel = new QLabel(explanatoryText, keyFrame);
+ }
+
+ BigArrowButton *keyDown = new BigArrowButton(keyBox, Qt::LeftArrow);
+ QToolTip::add
+ (keyDown, i18n("Flatten"));
+
+ m_keyLabel = new QLabel(i18n("Key"), keyBox);
+ m_keyLabel->setAlignment(AlignVCenter | AlignHCenter);
+
+ BigArrowButton *keyUp = new BigArrowButton(keyBox, Qt::RightArrow);
+ QToolTip::add
+ (keyUp, i18n("Sharpen"));
+
+ m_keyCombo = new KComboBox(nameBox);
+ m_majorMinorCombo = new KComboBox(nameBox);
+ m_majorMinorCombo->insertItem(i18n("Major"));
+ m_majorMinorCombo->insertItem(i18n("Minor"));
+ if (m_key.isMinor()) {
+ m_majorMinorCombo->setCurrentItem(m_majorMinorCombo->count() - 1);
+ }
+
+ regenerateKeyCombo();
+ redrawKeyPixmap();
+ m_explanatoryLabel = explanatoryLabel;
+
+ m_keyLabel->setMinimumWidth(m_keyLabel->pixmap()->width());
+ m_keyLabel->setMinimumHeight(m_keyLabel->pixmap()->height());
+
+ m_yesTransposeButton =
+ new QRadioButton(i18n("Transpose key according to segment transposition"),
+ transposeFrame);
+ QRadioButton *noTransposeButton =
+ new QRadioButton(i18n("Use specified key. Do not transpose"), transposeFrame);
+ m_yesTransposeButton->setChecked(true);
+
+ // just to shut up the compiler warning about unused variable:
+ noTransposeButton->setChecked(false);
+
+ if (showApplyToAll) {
+ QRadioButton *applyToOneButton =
+ new QRadioButton(i18n("Apply to current segment only"),
+ buttonFrame);
+ m_applyToAllButton =
+ new QRadioButton(i18n("Apply to all segments at this time"),
+ buttonFrame);
+ applyToOneButton->setChecked(true);
+ m_noPercussionCheckBox =
+ new QCheckBox(i18n("Exclude percussion segments"), buttonFrame);
+ m_noPercussionCheckBox->setChecked(true);
+
+ } else {
+ m_applyToAllButton = 0;
+ buttonFrame->hide();
+ }
+
+ if (showConversionOptions) {
+ m_noConversionButton =
+ new QRadioButton
+ (i18n("Maintain current pitches"), conversionFrame);
+ m_convertButton =
+ new QRadioButton
+ (i18n("Maintain current accidentals"), conversionFrame);
+ m_transposeButton =
+ new QRadioButton
+ (i18n("Transpose into this key"), conversionFrame);
+ m_noConversionButton->setChecked(true);
+ } else {
+ m_noConversionButton = 0;
+ m_convertButton = 0;
+ m_transposeButton = 0;
+ conversionFrame->hide();
+ }
+
+ QObject::connect(keyUp, SIGNAL(clicked()), this, SLOT(slotKeyUp()));
+ QObject::connect(keyDown, SIGNAL(clicked()), this, SLOT(slotKeyDown()));
+ QObject::connect(m_keyCombo, SIGNAL(activated(const QString &)),
+ this, SLOT(slotKeyNameChanged(const QString &)));
+ QObject::connect(m_keyCombo, SIGNAL(textChanged(const QString &)),
+ this, SLOT(slotKeyNameChanged(const QString &)));
+ QObject::connect(m_majorMinorCombo, SIGNAL(activated(const QString &)),
+ this, SLOT(slotMajorMinorChanged(const QString &)));
+}
+
+KeySignatureDialog::ConversionType
+
+KeySignatureDialog::getConversionType() const
+{
+ if (m_noConversionButton && m_noConversionButton->isChecked()) {
+ return NoConversion;
+ } else if (m_convertButton && m_convertButton->isChecked()) {
+ return Convert;
+ } else if (m_transposeButton && m_transposeButton->isChecked()) {
+ return Transpose;
+ }
+ return NoConversion;
+}
+
+bool
+KeySignatureDialog::shouldApplyToAll() const
+{
+ return m_applyToAllButton && m_applyToAllButton->isChecked();
+}
+
+bool
+KeySignatureDialog::shouldBeTransposed() const
+{
+ return m_yesTransposeButton && m_yesTransposeButton->isChecked();
+}
+
+bool
+KeySignatureDialog::shouldIgnorePercussion() const
+{
+ return m_noPercussionCheckBox && m_noPercussionCheckBox->isChecked();
+}
+
+void
+KeySignatureDialog::slotKeyUp()
+{
+ bool sharp = m_key.isSharp();
+ int ac = m_key.getAccidentalCount();
+ if (ac == 0)
+ sharp = true;
+ if (sharp) {
+ if (++ac > 7)
+ ac = 7;
+ } else {
+ if (--ac < 1) {
+ ac = 0;
+ sharp = true;
+ }
+ }
+
+ try {
+ m_key = Rosegarden::Key(ac, sharp, m_key.isMinor());
+ setValid(true);
+ } catch (Rosegarden::Key::BadKeySpec s) {
+ std::cerr << s.getMessage() << std::endl;
+ setValid(false);
+ }
+
+ regenerateKeyCombo();
+ redrawKeyPixmap();
+}
+
+void
+KeySignatureDialog::slotKeyDown()
+{
+ bool sharp = m_key.isSharp();
+ int ac = m_key.getAccidentalCount();
+ if (ac == 0)
+ sharp = false;
+ if (sharp) {
+ if (--ac < 0) {
+ ac = 1;
+ sharp = false;
+ }
+ } else {
+ if (++ac > 7)
+ ac = 7;
+ }
+
+ try {
+ m_key = Rosegarden::Key(ac, sharp, m_key.isMinor());
+ setValid(true);
+ } catch (Rosegarden::Key::BadKeySpec s) {
+ std::cerr << s.getMessage() << std::endl;
+ setValid(false);
+ }
+
+ regenerateKeyCombo();
+ redrawKeyPixmap();
+}
+
+struct KeyNameComparator
+{
+ bool operator()(const Rosegarden::Key &k1, const Rosegarden::Key &k2) {
+ return (k1.getName() < k2.getName());
+ }
+};
+
+
+void
+KeySignatureDialog::regenerateKeyCombo()
+{
+ if (m_explanatoryLabel)
+ m_explanatoryLabel->hide();
+
+ m_ignoreComboChanges = true;
+ QString currentText = m_keyCombo->currentText();
+ Rosegarden::Key::KeyList keys(Rosegarden::Key::getKeys(m_key.isMinor()));
+ m_keyCombo->clear();
+
+ std::sort(keys.begin(), keys.end(), KeyNameComparator());
+ bool textSet = false;
+
+ for (Rosegarden::Key::KeyList::iterator i = keys.begin();
+ i != keys.end(); ++i) {
+
+ QString name(strtoqstr(i->getName()));
+ int space = name.find(' ');
+ if (space > 0)
+ name = name.left(space);
+
+ m_keyCombo->insertItem(name);
+
+ if (m_valid && (*i == m_key)) {
+ m_keyCombo->setCurrentItem(m_keyCombo->count() - 1);
+ textSet = true;
+ }
+ }
+
+ if (!textSet) {
+ m_keyCombo->setEditText(currentText);
+ }
+ m_ignoreComboChanges = false;
+}
+
+bool
+KeySignatureDialog::isValid() const
+{
+ return m_valid;
+}
+
+Rosegarden::Key
+KeySignatureDialog::getKey() const
+{
+ return m_key;
+}
+
+void
+KeySignatureDialog::redrawKeyPixmap()
+{
+ if (m_valid) {
+ QPixmap pmap =
+ NotePixmapFactory::toQPixmap(m_notePixmapFactory->makeKeyDisplayPixmap(m_key, m_clef));
+ m_keyLabel->setPixmap(pmap);
+ } else {
+ m_keyLabel->setText(i18n("No such key"));
+ }
+}
+
+void
+KeySignatureDialog::slotKeyNameChanged(const QString &s)
+{
+ if (m_ignoreComboChanges)
+ return ;
+
+ if (m_explanatoryLabel)
+ m_explanatoryLabel->hide();
+
+ std::string name(getKeyName(s, m_key.isMinor()));
+
+ try {
+ m_key = Rosegarden::Key(name);
+ setValid(true);
+
+ int space = name.find(' ');
+ if (space > 0)
+ name = name.substr(0, space);
+ m_keyCombo->setEditText(strtoqstr(name));
+
+ } catch (Rosegarden::Key::BadKeyName s) {
+ std::cerr << s.getMessage() << std::endl;
+ setValid(false);
+ }
+
+ redrawKeyPixmap();
+}
+
+void
+KeySignatureDialog::slotMajorMinorChanged(const QString &s)
+{
+ if (m_ignoreComboChanges)
+ return ;
+
+ std::string name(getKeyName(m_keyCombo->currentText(), s == i18n("Minor")));
+
+ try {
+ m_key = Rosegarden::Key(name);
+ setValid(true);
+ } catch (Rosegarden::Key::BadKeyName s) {
+ std::cerr << s.getMessage() << std::endl;
+ setValid(false);
+ }
+
+ regenerateKeyCombo();
+ redrawKeyPixmap();
+}
+
+void
+KeySignatureDialog::setValid(bool valid)
+{
+ m_valid = valid;
+ enableButton(Ok, m_valid);
+}
+
+std::string
+KeySignatureDialog::getKeyName(const QString &s, bool minor)
+{
+ QString u((s.length() >= 1) ? (s.left(1).upper() + s.right(s.length() - 1))
+ : s);
+
+ std::string name(qstrtostr(u));
+ name = name + " " + (minor ? "minor" : "major");
+ return name;
+}
+
+}
+#include "KeySignatureDialog.moc"
diff --git a/src/gui/dialogs/KeySignatureDialog.h b/src/gui/dialogs/KeySignatureDialog.h
new file mode 100644
index 0000000..cd4a340
--- /dev/null
+++ b/src/gui/dialogs/KeySignatureDialog.h
@@ -0,0 +1,118 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_KEYSIGNATUREDIALOG_H_
+#define _RG_KEYSIGNATUREDIALOG_H_
+
+#include "base/NotationTypes.h"
+#include <string>
+#include <kdialogbase.h>
+#include <qstring.h>
+#include <qcheckbox.h>
+
+
+class QWidget;
+class QRadioButton;
+class QLabel;
+class KComboBox;
+class QCheckBox;
+
+
+namespace Rosegarden
+{
+
+class NotePixmapFactory;
+
+
+class KeySignatureDialog : public KDialogBase
+{
+ Q_OBJECT
+
+public:
+ enum ConversionType {
+ NoConversion,
+ Convert,
+ Transpose
+ };
+
+ KeySignatureDialog(QWidget *parent,
+ NotePixmapFactory *npf,
+ Clef clef,
+ Rosegarden::Key defaultKey =
+ Rosegarden::Key::DefaultKey,
+ bool showApplyToAll = true,
+ bool showConversionOptions = true,
+ QString explanatoryText = 0);
+
+ bool isValid() const;
+ ::Rosegarden::Key getKey() const;
+
+ bool shouldApplyToAll() const;
+ bool shouldBeTransposed() const;
+ ConversionType getConversionType() const;
+ bool shouldIgnorePercussion() const;
+
+public slots:
+ void slotKeyUp();
+ void slotKeyDown();
+ void slotKeyNameChanged(const QString &);
+ void slotMajorMinorChanged(const QString &);
+
+protected:
+
+ void redrawKeyPixmap();
+ void regenerateKeyCombo();
+ void setValid(bool valid);
+ std::string getKeyName(const QString &s, bool minor);
+
+ //--------------- Data members ---------------------------------
+
+ NotePixmapFactory *m_notePixmapFactory;
+
+ Rosegarden::Key m_key;
+ Clef m_clef;
+ bool m_valid;
+ bool m_ignoreComboChanges;
+
+ QLabel *m_keyLabel;
+ KComboBox *m_keyCombo;
+ KComboBox *m_majorMinorCombo;
+ QLabel *m_explanatoryLabel;
+
+ QRadioButton *m_applyToAllButton;
+ QRadioButton *m_yesTransposeButton;
+
+ QRadioButton *m_noConversionButton;
+ QRadioButton *m_convertButton;
+ QRadioButton *m_transposeButton;
+
+ QCheckBox *m_noPercussionCheckBox;
+};
+
+
+
+}
+
+#endif
diff --git a/src/gui/dialogs/LilyPondOptionsDialog.cpp b/src/gui/dialogs/LilyPondOptionsDialog.cpp
new file mode 100644
index 0000000..f693467
--- /dev/null
+++ b/src/gui/dialogs/LilyPondOptionsDialog.cpp
@@ -0,0 +1,363 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "LilyPondOptionsDialog.h"
+#include "document/io/LilyPondExporter.h"
+#include "gui/configuration/HeadersConfigurationPage.h"
+
+#include <qlayout.h>
+#include <kapplication.h>
+
+#include "document/ConfigGroups.h"
+#include "document/RosegardenGUIDoc.h"
+#include "misc/Strings.h"
+#include <kcombobox.h>
+#include <klineedit.h>
+#include <kconfig.h>
+#include <kdialogbase.h>
+#include <kglobal.h>
+#include <klocale.h>
+#include <qcheckbox.h>
+#include <qcombobox.h>
+#include <qframe.h>
+#include <qgroupbox.h>
+#include <qlabel.h>
+#include <qstring.h>
+#include <qtabwidget.h>
+#include <qtooltip.h>
+#include <qvbox.h>
+#include <qwidget.h>
+#include <iostream>
+
+namespace Rosegarden
+{
+
+LilyPondOptionsDialog::LilyPondOptionsDialog(QWidget *parent,
+ RosegardenGUIDoc *doc,
+ QString windowCaption,
+ QString heading) :
+ KDialogBase(parent, 0, true,
+ (windowCaption = "" ? i18n("LilyPond Export/Preview") : windowCaption),
+ Apply | Ok | Cancel),
+ m_doc(doc)
+{
+ setHelp("file-printing");
+
+ KConfig *config = kapp->config();
+ config->setGroup(NotationViewConfigGroup);
+
+ QVBox * mainbox = makeVBoxMainWidget();
+
+ //
+ // Arrange options in "General" and "Advanced" tabs.
+ //
+
+ QTabWidget * tabWidget = new QTabWidget(mainbox);
+
+ QFrame *generalFrame;
+ QFrame *advancedFrame;
+ QGridLayout *generalGrid;
+ QGridLayout *advancedGrid;
+
+ generalFrame = new QFrame();
+ tabWidget->addTab(generalFrame, i18n("General options"));
+
+ generalGrid = new QGridLayout(generalFrame, 1, 1, 5, 5);
+
+ advancedFrame = new QFrame();
+ tabWidget->addTab(advancedFrame, i18n("Advanced options"));
+
+ advancedGrid = new QGridLayout(advancedFrame, 1, 1, 5, 5);
+
+ m_headersPage = new HeadersConfigurationPage(this, m_doc);
+ tabWidget->addTab(m_headersPage, i18n("Headers"));
+
+ m_headersPage->setSpacing(5);
+ m_headersPage->setMargin(5);
+
+ //
+ // LilyPond export: Basic options
+ //
+
+ QGroupBox *basicOptionsBox = new QGroupBox
+ (1, Horizontal,
+ i18n("Basic options"), generalFrame);
+ generalGrid->addWidget(basicOptionsBox, 0, 0);
+
+ QFrame *frameBasic = new QFrame(basicOptionsBox);
+ QGridLayout *layoutBasic = new QGridLayout(frameBasic, 3, 2, 10, 5);
+
+ layoutBasic->addWidget(new QLabel(
+ i18n("Compatibility level"), frameBasic), 0, 0);
+
+ m_lilyLanguage = new KComboBox(frameBasic);
+ // See also setDefaultLilyPondVersion below
+ m_lilyLanguage->insertItem(i18n("LilyPond %1").arg("2.6"));
+ m_lilyLanguage->insertItem(i18n("LilyPond %1").arg("2.8"));
+ m_lilyLanguage->insertItem(i18n("LilyPond %1").arg("2.10"));
+ m_lilyLanguage->insertItem(i18n("LilyPond %1").arg("2.12"));
+ m_lilyLanguage->setCurrentItem(config->readUnsignedNumEntry("lilylanguage", 0));
+ layoutBasic->addWidget(m_lilyLanguage, 0, 1);
+
+ layoutBasic->addWidget(new QLabel(
+ i18n("Paper size"), frameBasic), 1, 0);
+
+ QHBoxLayout *hboxPaper = new QHBoxLayout( frameBasic );
+ m_lilyPaperSize = new KComboBox(frameBasic);
+ m_lilyPaperSize->insertItem(i18n("A3"));
+ m_lilyPaperSize->insertItem(i18n("A4"));
+ m_lilyPaperSize->insertItem(i18n("A5"));
+ m_lilyPaperSize->insertItem(i18n("A6"));
+ m_lilyPaperSize->insertItem(i18n("Legal"));
+ m_lilyPaperSize->insertItem(i18n("US Letter"));
+ m_lilyPaperSize->insertItem(i18n("Tabloid"));
+ m_lilyPaperSize->insertItem(i18n("do not specify"));
+ int defaultPaperSize = 1; // A4
+ if (KGlobal::locale()->country() == "us" ||
+ KGlobal::locale()->country() == "US") defaultPaperSize = 5; // Letter
+ m_lilyPaperSize->setCurrentItem(config->readUnsignedNumEntry
+ ("lilypapersize", defaultPaperSize));
+
+ m_lilyPaperLandscape = new QCheckBox(i18n("Landscape"), frameBasic);
+ m_lilyPaperLandscape->setChecked(config->readBoolEntry("lilypaperlandscape", false));
+
+ hboxPaper->addWidget( m_lilyPaperSize );
+ hboxPaper->addWidget( new QLabel( " ", frameBasic ) ); // fixed-size spacer
+ hboxPaper->addWidget( m_lilyPaperLandscape );
+ layoutBasic->addLayout(hboxPaper, 1, 1);
+
+ layoutBasic->addWidget(new QLabel(
+ i18n("Font size"), frameBasic), 2, 0);
+
+ m_lilyFontSize = new KComboBox(frameBasic);
+ int sizes[] = { 11, 13, 16, 19, 20, 23, 26 };
+ for (int i = 0; i < sizeof(sizes)/sizeof(sizes[0]); ++i) {
+ m_lilyFontSize->insertItem(i18n("%1 pt").arg(sizes[i]));
+ }
+ m_lilyFontSize->setCurrentItem(config->readUnsignedNumEntry
+ ("lilyfontsize", 4));
+ layoutBasic->addWidget(m_lilyFontSize, 2, 1);
+
+ //
+ // LilyPond export: Staff level options
+ //
+
+ QGroupBox *staffOptionsBox = new QGroupBox
+ (1, Horizontal,
+ i18n("Staff level options"), generalFrame);
+ generalGrid->addWidget(staffOptionsBox, 1, 0);
+
+ QFrame *frameStaff = new QFrame(staffOptionsBox);
+ QGridLayout *layoutStaff = new QGridLayout(frameStaff, 2, 2, 10, 5);
+
+ layoutStaff->addWidget(new QLabel(
+ i18n("Export content"), frameStaff), 0, 0);
+
+ m_lilyExportSelection = new KComboBox(frameStaff);
+ m_lilyExportSelection->insertItem(i18n("All tracks"));
+ m_lilyExportSelection->insertItem(i18n("Non-muted tracks"));
+ m_lilyExportSelection->insertItem(i18n("Selected track"));
+ m_lilyExportSelection->insertItem(i18n("Selected segments"));
+ m_lilyExportSelection->setCurrentItem(config->readUnsignedNumEntry("lilyexportselection", 1));
+
+ layoutStaff->addWidget(m_lilyExportSelection, 0, 1);
+
+ m_lilyExportStaffMerge = new QCheckBox(
+ i18n("Merge tracks that have the same name"), frameStaff);
+ m_lilyExportStaffMerge->setChecked(config->readBoolEntry("lilyexportstaffmerge", false));
+ layoutStaff->addMultiCellWidget(m_lilyExportStaffMerge, 1, 1, 0, 1);
+
+ //
+ // LilyPond export: Notation options
+ //
+
+ QGroupBox *notationOptionsBox = new QGroupBox
+ (1, Horizontal,
+ i18n("Notation options"), generalFrame);
+ generalGrid->addWidget(notationOptionsBox, 2, 0);
+
+ QFrame *frameNotation = new QFrame(notationOptionsBox);
+ QGridLayout *layoutNotation = new QGridLayout(frameNotation, 4, 2, 10, 5);
+
+ m_lilyTempoMarks = new KComboBox( frameNotation );
+ m_lilyTempoMarks->insertItem(i18n("None"));
+ m_lilyTempoMarks->insertItem(i18n("First"));
+ m_lilyTempoMarks->insertItem(i18n("All"));
+ m_lilyTempoMarks->setCurrentItem(config->readUnsignedNumEntry("lilyexporttempomarks", 0));
+
+ layoutNotation->addWidget( new QLabel(
+ i18n("Export tempo marks "), frameNotation), 0, 0 );
+ layoutNotation->addWidget(m_lilyTempoMarks, 0, 1);
+
+ m_lilyExportLyrics = new QCheckBox(
+ i18n("Export lyrics"), frameNotation);
+ // default to lyric export == false because if you export the default
+ // empty "- - -" lyrics, crap results ensue, and people will know if they
+ // do need to export the lyrics - DMM
+ // fixed, no "- - -" lyrics are generated for an empty lyrics
+ // default again into lyrics - HJJ
+ m_lilyExportLyrics->setChecked(config->readBoolEntry("lilyexportlyrics", true));
+ layoutNotation->addMultiCellWidget(m_lilyExportLyrics, 1, 1, 0, 1);
+
+ m_lilyExportBeams = new QCheckBox(
+ i18n("Export beamings"), frameNotation);
+ m_lilyExportBeams->setChecked(config->readBoolEntry("lilyexportbeamings", false));
+ layoutNotation->addMultiCellWidget(m_lilyExportBeams, 2, 2, 0, 1);
+
+ // recycle this for a new option to ignore the track brackets (so it is less
+ // obnoxious to print single parts where brackets are in place)
+ m_lilyExportStaffGroup = new QCheckBox(
+ i18n("Export track staff brackets"), frameNotation);
+ m_lilyExportStaffGroup->setChecked(config->readBoolEntry("lilyexportstaffbrackets", true));
+ layoutNotation->addMultiCellWidget(m_lilyExportStaffGroup, 3, 3, 0, 1);
+
+ generalGrid->setRowStretch(4, 10);
+
+ //
+ // LilyPond export: Advanced options
+ //
+
+ QGroupBox *advancedLayoutOptionsBox = new QGroupBox
+ (1, Horizontal,
+ i18n("Layout options"), advancedFrame);
+ advancedGrid->addWidget(advancedLayoutOptionsBox, 0, 0);
+
+ QFrame *frameAdvancedLayout = new QFrame(advancedLayoutOptionsBox);
+ QGridLayout *layoutAdvancedLayout = new QGridLayout(frameAdvancedLayout, 2, 2, 10, 5);
+
+ m_lilyLyricsHAlignment = new KComboBox( frameAdvancedLayout );
+ m_lilyLyricsHAlignment->insertItem(i18n("Left"));
+ m_lilyLyricsHAlignment->insertItem(i18n("Center"));
+ m_lilyLyricsHAlignment->insertItem(i18n("Right"));
+ m_lilyLyricsHAlignment->setCurrentItem(config->readUnsignedNumEntry("lilylyricshalignment", 0));
+
+ layoutAdvancedLayout->addWidget(new QLabel(
+ i18n("Lyrics alignment"), frameAdvancedLayout), 0, 0);
+ layoutAdvancedLayout->addWidget(m_lilyLyricsHAlignment, 0, 1);
+
+ m_lilyRaggedBottom = new QCheckBox(
+ i18n("Ragged bottom (systems will not be spread vertically across the page)"), frameAdvancedLayout);
+ m_lilyRaggedBottom->setChecked(config->readBoolEntry("lilyraggedbottom", false));
+ layoutAdvancedLayout->addMultiCellWidget(m_lilyRaggedBottom, 1, 2, 0, 1);
+
+ QGroupBox *miscOptionsBox = new QGroupBox
+ (1, Horizontal,
+ i18n("Miscellaneous options"), advancedFrame);
+ advancedGrid->addWidget(miscOptionsBox, 1, 0);
+
+ QFrame *frameMisc = new QFrame(miscOptionsBox);
+ QGridLayout *layoutMisc = new QGridLayout(frameMisc, 2, 2, 10, 5);
+
+ m_lilyExportPointAndClick = new QCheckBox(
+ i18n("Enable \"point and click\" debugging"), frameMisc);
+ m_lilyExportPointAndClick->setChecked(config->readBoolEntry("lilyexportpointandclick", false));
+ layoutMisc->addMultiCellWidget(m_lilyExportPointAndClick, 0, 0, 0, 1);
+
+ m_lilyExportMidi = new QCheckBox(
+ i18n("Export \\midi block"), frameMisc);
+ m_lilyExportMidi->setChecked(config->readBoolEntry("lilyexportmidi", false));
+ layoutMisc->addMultiCellWidget(m_lilyExportMidi, 1, 1, 0, 1);
+
+ m_lilyMarkerMode = new KComboBox(frameMisc);
+ m_lilyMarkerMode->insertItem(i18n("No markers"));
+ m_lilyMarkerMode->insertItem(i18n("Rehearsal marks"));
+ m_lilyMarkerMode->insertItem(i18n("Marker text"));
+ m_lilyMarkerMode->setCurrentItem(config->readUnsignedNumEntry("lilyexportmarkermode", 0));
+
+ layoutMisc->addWidget( new QLabel(
+ i18n("Export markers"), frameMisc),2, 0 );
+ layoutMisc->addWidget(m_lilyMarkerMode, 2, 1);
+
+ advancedGrid->setRowStretch(2, 10);
+
+ resize(minimumSize());
+}
+
+void
+LilyPondOptionsDialog::slotApply()
+{
+ KConfig *config = kapp->config();
+ config->setGroup(NotationViewConfigGroup);
+
+ config->writeEntry("lilylanguage", m_lilyLanguage->currentItem());
+ config->writeEntry("lilypapersize", m_lilyPaperSize->currentItem());
+ config->writeEntry("lilypaperlandscape", m_lilyPaperLandscape->isChecked());
+ config->writeEntry("lilyfontsize", m_lilyFontSize->currentItem());
+ config->writeEntry("lilyraggedbottom", m_lilyRaggedBottom->isChecked());
+ config->writeEntry("lilyexportlyrics", m_lilyExportLyrics->isChecked());
+ config->writeEntry("lilyexportmidi", m_lilyExportMidi->isChecked());
+ config->writeEntry("lilyexporttempomarks", m_lilyTempoMarks->currentItem());
+ config->writeEntry("lilyexportselection", m_lilyExportSelection->currentItem());
+ config->writeEntry("lilyexportpointandclick", m_lilyExportPointAndClick->isChecked());
+ config->writeEntry("lilyexportbeamings", m_lilyExportBeams->isChecked());
+ config->writeEntry("lilyexportstaffmerge", m_lilyExportStaffMerge->isChecked());
+ config->writeEntry("lilyexportstaffbrackets", m_lilyExportStaffGroup->isChecked());
+ config->writeEntry("lilylyricshalignment", m_lilyLyricsHAlignment->currentItem());
+ config->writeEntry("lilyexportmarkermode", m_lilyMarkerMode->currentItem());
+ m_headersPage->apply();
+}
+
+void
+LilyPondOptionsDialog::slotOk()
+{
+ slotApply();
+ accept();
+}
+
+void
+LilyPondOptionsDialog::setDefaultLilyPondVersion(QString version)
+{
+ KConfig *config = kapp->config();
+ config->setGroup(NotationViewConfigGroup);
+ int index = -1;
+ bool unstable = false;
+ if (version == "2.6" || version.startsWith("2.6.")) {
+ index = 0;
+ } else if (version == "2.7" || version.startsWith("2.7.")) {
+ unstable = true;
+ index = 1;
+ } else if (version == "2.8" || version.startsWith("2.8.")) {
+ index = 1;
+ } else if (version == "2.9" || version.startsWith("2.9.")) {
+ unstable = true;
+ index = 2;
+ } else if (version == "2.10" || version.startsWith("2.10.")) {
+ index = 2;
+ } else if (version == "2.11" || version.startsWith("2.11.")) {
+ unstable = true;
+ index = 3;
+ } else if (version == "2.12" || version.startsWith("2.12.")) {
+ index = 3;
+ }
+ if (unstable) {
+ std::cerr << "\nWARNING: Unstable LilyPond version detected, selecting next language version up\n" << std::endl;
+ }
+ if (index >= 0) {
+ config->writeEntry("lilylanguage", index);
+ }
+}
+
+}
+#include "LilyPondOptionsDialog.moc"
diff --git a/src/gui/dialogs/LilyPondOptionsDialog.h b/src/gui/dialogs/LilyPondOptionsDialog.h
new file mode 100644
index 0000000..a8f2476
--- /dev/null
+++ b/src/gui/dialogs/LilyPondOptionsDialog.h
@@ -0,0 +1,86 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_LILYPONDOPTIONSDIALOG_H_
+#define _RG_LILYPONDOPTIONSDIALOG_H_
+
+#include <kdialogbase.h>
+#include <qstring.h>
+
+#include "gui/configuration/HeadersConfigurationPage.h"
+
+class QWidget;
+class QCheckBox;
+class QComboBox;
+class QLineEdit;
+class QLineEdit;
+
+namespace Rosegarden
+{
+
+class RosegardenGUIDoc;
+class HeadersConfigurationPage;
+
+class LilyPondOptionsDialog : public KDialogBase
+{
+ Q_OBJECT
+
+public:
+ LilyPondOptionsDialog(QWidget *parent,
+ RosegardenGUIDoc *doc,
+ QString windowCaption = "",
+ QString heading = "");
+
+ static void setDefaultLilyPondVersion(QString version);
+
+public slots:
+ void slotApply();
+ void slotOk();
+
+protected:
+ RosegardenGUIDoc *m_doc;
+ QComboBox *m_lilyLanguage;
+ QComboBox *m_lilyPaperSize;
+ QComboBox *m_lilyFontSize;
+ QComboBox *m_lilyTempoMarks;
+ QComboBox *m_lilyExportSelection;
+ QComboBox *m_lilyLyricsHAlignment;
+ QCheckBox *m_lilyPaperLandscape;
+ QCheckBox *m_lilyRaggedBottom;
+ QCheckBox *m_lilyExportLyrics;
+ QCheckBox *m_lilyExportMidi;
+ QCheckBox *m_lilyExportPointAndClick;
+ QCheckBox *m_lilyExportBeams;
+ QCheckBox *m_lilyExportStaffMerge;
+ QCheckBox *m_lilyExportStaffGroup;
+ QComboBox *m_lilyMarkerMode;
+ HeadersConfigurationPage *m_headersPage;
+
+};
+
+
+
+}
+
+#endif
diff --git a/src/gui/dialogs/LyricEditDialog.cpp b/src/gui/dialogs/LyricEditDialog.cpp
new file mode 100644
index 0000000..4dfeba2
--- /dev/null
+++ b/src/gui/dialogs/LyricEditDialog.cpp
@@ -0,0 +1,253 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "LyricEditDialog.h"
+
+#include "base/Event.h"
+#include "base/BaseProperties.h"
+#include <klocale.h>
+#include "misc/Strings.h"
+#include "misc/Debug.h"
+#include "base/Composition.h"
+#include "base/NotationTypes.h"
+#include "base/Segment.h"
+#include <kdialogbase.h>
+#include <qgroupbox.h>
+#include <qregexp.h>
+#include <qstring.h>
+#include <qtextedit.h>
+#include <qvbox.h>
+#include <qwidget.h>
+#include <kcombobox.h>
+#include <qlabel.h>
+#include <qpushbutton.h>
+
+
+namespace Rosegarden
+{
+
+LyricEditDialog::LyricEditDialog(QWidget *parent,
+ Segment *segment) :
+ KDialogBase(parent, 0, true, i18n("Edit Lyrics"), Ok | Cancel | Help),
+ m_segment(segment),
+ m_verseCount(0)
+{
+ setHelp("nv-text-lyrics");
+
+ QVBox *vbox = makeVBoxMainWidget();
+
+ QGroupBox *groupBox = new QGroupBox
+ (1, Horizontal, i18n("Lyrics for this segment"), vbox);
+
+ QHBox *hbox = new QHBox(groupBox);
+ hbox->setSpacing(5);
+// new QLabel(i18n("Verse:"), hbox);
+ m_verseNumber = new KComboBox(hbox);
+ m_verseNumber->setEditable(false);
+ connect(m_verseNumber, SIGNAL(activated(int)), this, SLOT(slotVerseNumberChanged(int)));
+ m_verseAddButton = new QPushButton(i18n("Add Verse"), hbox);
+ connect(m_verseAddButton, SIGNAL(clicked()), this, SLOT(slotAddVerse()));
+ QFrame *f = new QFrame(hbox);
+ hbox->setStretchFactor(f, 10);
+
+ m_textEdit = new QTextEdit(groupBox);
+ m_textEdit->setTextFormat(Qt::PlainText);
+
+ m_textEdit->setMinimumWidth(300);
+ m_textEdit->setMinimumHeight(200);
+
+ unparse();
+
+ for (int i = 0; i < m_verseCount; ++i) {
+ m_verseNumber->insertItem(i18n("Verse %1").arg(i + 1));
+ }
+ m_currentVerse = 0;
+ if (m_verseCount == 12) m_verseAddButton->setEnabled(false);
+}
+
+void
+LyricEditDialog::slotVerseNumberChanged(int verse)
+{
+ NOTATION_DEBUG << "LyricEditDialog::slotVerseNumberChanged(" << verse << ")" << endl;
+ QString text = m_textEdit->text();
+ m_texts[m_currentVerse] = text;
+ m_textEdit->setText(m_texts[verse]);
+ m_currentVerse = verse;
+}
+
+void
+LyricEditDialog::slotAddVerse()
+{
+ NOTATION_DEBUG << "LyricEditDialog::slotAddVerse" << endl;
+ m_verseCount++;
+ m_texts.push_back(m_skeleton);
+ m_verseNumber->insertItem(i18n("Verse %1").arg(m_verseCount));
+ m_verseNumber->setCurrentItem(m_verseCount - 1);
+ slotVerseNumberChanged(m_verseCount - 1);
+ if (m_verseCount == 12) m_verseAddButton->setEnabled(false);
+}
+
+void
+LyricEditDialog::countVerses()
+{
+ m_verseCount = 1;
+
+ for (Segment::iterator i = m_segment->begin();
+ m_segment->isBeforeEndMarker(i); ++i) {
+
+ if ((*i)->isa(Text::EventType)) {
+
+ std::string textType;
+ if ((*i)->get<String>(Text::TextTypePropertyName, textType) &&
+ textType == Text::Lyric) {
+
+ long verse = 0;
+ (*i)->get<Int>(Text::LyricVersePropertyName, verse);
+
+ if (verse >= m_verseCount) m_verseCount = verse + 1;
+ }
+ }
+ }
+}
+
+void
+LyricEditDialog::unparse()
+{
+ // This and SetLyricsCommand::execute() are opposites that will
+ // need to be kept in sync with any changes in one another. (They
+ // should really both be in a common lyric management class.)
+
+ countVerses();
+
+ Composition *comp = m_segment->getComposition();
+
+ bool firstNote = true;
+ timeT lastTime = m_segment->getStartTime();
+ int lastBarNo = comp->getBarNumber(lastTime);
+ std::map<int, bool> haveLyric;
+
+ QString fragment = QString("[%1] ").arg(lastBarNo + 1);
+
+ m_skeleton = fragment;
+ m_texts.clear();
+ for (size_t v = 0; v < m_verseCount; ++v) {
+ m_texts.push_back(fragment);
+ haveLyric[v] = false;
+ }
+
+ for (Segment::iterator i = m_segment->begin();
+ m_segment->isBeforeEndMarker(i); ++i) {
+
+ bool isNote = (*i)->isa(Note::EventType);
+ bool isLyric = false;
+
+ if (!isNote) {
+ if ((*i)->isa(Text::EventType)) {
+ std::string textType;
+ if ((*i)->get<String>(Text::TextTypePropertyName, textType) &&
+ textType == Text::Lyric) {
+ isLyric = true;
+ }
+ }
+ } else {
+ if ((*i)->has(BaseProperties::TIED_BACKWARD) &&
+ (*i)->get<Bool>(BaseProperties::TIED_BACKWARD)) {
+ continue;
+ }
+ }
+
+ if (!isNote && !isLyric) continue;
+
+ timeT myTime = (*i)->getNotationAbsoluteTime();
+ int myBarNo = comp->getBarNumber(myTime);
+
+ if (myBarNo > lastBarNo) {
+
+ fragment = "";
+
+ while (myBarNo > lastBarNo) {
+ fragment += " /";
+ ++lastBarNo;
+ }
+
+ fragment += QString("\n[%1] ").arg(myBarNo + 1);
+
+ m_skeleton += fragment;
+ for (size_t v = 0; v < m_verseCount; ++v) m_texts[v] += fragment;
+ }
+
+ if (isNote) {
+ if ((myTime > lastTime) || firstNote) {
+ m_skeleton += " .";
+ for (size_t v = 0; v < m_verseCount; ++v) {
+ if (!haveLyric[v]) m_texts[v] += " .";
+ haveLyric[v] = false;
+ }
+ lastTime = myTime;
+ firstNote = false;
+ }
+ }
+
+ if (isLyric) {
+
+ std::string ssyllable;
+ (*i)->get<String>(Text::TextPropertyName, ssyllable);
+
+ long verse = 0;
+ (*i)->get<Int>(Text::LyricVersePropertyName, verse);
+
+ QString syllable(strtoqstr(ssyllable));
+ syllable.replace(QRegExp("\\s+"), "~");
+
+ m_texts[verse] += " " + syllable;
+ haveLyric[verse] = true;
+ }
+ }
+
+ if (!m_texts.empty()) {
+ m_textEdit->setText(m_texts[0]);
+ } else {
+ m_texts.push_back(m_skeleton);
+ }
+}
+
+int
+LyricEditDialog::getVerseCount() const
+{
+ return m_verseCount;
+}
+
+QString
+LyricEditDialog::getLyricData(int verse) const
+{
+ if (verse == m_verseNumber->currentItem()) {
+ return m_textEdit->text();
+ } else {
+ return m_texts[verse];
+ }
+}
+
+}
+#include "LyricEditDialog.moc"
diff --git a/src/gui/dialogs/LyricEditDialog.h b/src/gui/dialogs/LyricEditDialog.h
new file mode 100644
index 0000000..f4a5154
--- /dev/null
+++ b/src/gui/dialogs/LyricEditDialog.h
@@ -0,0 +1,78 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_LYRICEDITDIALOG_H_
+#define _RG_LYRICEDITDIALOG_H_
+
+#include <kdialogbase.h>
+#include <qstring.h>
+#include <vector>
+
+
+class QWidget;
+class QTextEdit;
+class QComboBox;
+class QPushButton;
+
+
+namespace Rosegarden
+{
+
+class Segment;
+
+
+class LyricEditDialog : public KDialogBase
+{
+ Q_OBJECT
+
+public:
+ LyricEditDialog(QWidget *parent, Segment *segment);
+
+ int getVerseCount() const;
+ QString getLyricData(int verse) const;
+
+protected slots:
+ void slotVerseNumberChanged(int);
+ void slotAddVerse();
+
+protected:
+ Segment *m_segment;
+
+ int m_currentVerse;
+ QComboBox *m_verseNumber;
+ QTextEdit *m_textEdit;
+ QPushButton *m_verseAddButton;
+
+ int m_verseCount;
+ std::vector<QString> m_texts;
+ QString m_skeleton;
+
+ void countVerses();
+ void unparse();
+};
+
+}
+
+#endif
diff --git a/src/gui/dialogs/MakeOrnamentDialog.cpp b/src/gui/dialogs/MakeOrnamentDialog.cpp
new file mode 100644
index 0000000..7e82a22
--- /dev/null
+++ b/src/gui/dialogs/MakeOrnamentDialog.cpp
@@ -0,0 +1,73 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "MakeOrnamentDialog.h"
+
+#include <klocale.h>
+#include "gui/widgets/PitchChooser.h"
+#include <kdialogbase.h>
+#include <qgroupbox.h>
+#include <qhbox.h>
+#include <qlabel.h>
+#include <qlineedit.h>
+#include <qstring.h>
+#include <qvbox.h>
+#include <qwidget.h>
+
+
+namespace Rosegarden
+{
+
+MakeOrnamentDialog::MakeOrnamentDialog(QWidget *parent, QString defaultName,
+ int defaultBasePitch) :
+ KDialogBase(parent, "makeornamentdialog", true, i18n("Make Ornament"),
+ Ok | Cancel, Ok)
+{
+ QVBox *vbox = makeVBoxMainWidget();
+ QGroupBox *nameBox = new QGroupBox(2, Vertical, i18n("Name"), vbox);
+
+ new QLabel(i18n("The name is used to identify both the ornament\nand the triggered segment that stores\nthe ornament's notes."), nameBox);
+
+ QHBox *hbox = new QHBox(nameBox);
+ new QLabel(i18n("Name: "), hbox);
+ m_name = new QLineEdit(defaultName, hbox);
+
+ m_pitch = new PitchChooser(i18n("Base pitch"), vbox, defaultBasePitch);
+}
+
+QString
+MakeOrnamentDialog::getName() const
+{
+ return m_name->text();
+}
+
+int
+MakeOrnamentDialog::getBasePitch() const
+{
+ return m_pitch->getPitch();
+}
+
+}
+#include "MakeOrnamentDialog.moc"
diff --git a/src/gui/dialogs/MakeOrnamentDialog.h b/src/gui/dialogs/MakeOrnamentDialog.h
new file mode 100644
index 0000000..3f1957b
--- /dev/null
+++ b/src/gui/dialogs/MakeOrnamentDialog.h
@@ -0,0 +1,62 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_MAKEORNAMENTDIALOG_H_
+#define _RG_MAKEORNAMENTDIALOG_H_
+
+#include <kdialogbase.h>
+#include <qstring.h>
+
+
+class QWidget;
+class QLineEdit;
+
+
+namespace Rosegarden
+{
+
+class PitchChooser;
+
+
+class MakeOrnamentDialog : public KDialogBase
+{
+ Q_OBJECT
+
+public:
+ MakeOrnamentDialog(QWidget *parent, QString defaultName, int defaultBasePitch);
+
+ QString getName() const;
+ int getBasePitch() const;
+
+protected:
+ QLineEdit *m_name;
+ PitchChooser *m_pitch;
+};
+
+
+
+}
+
+#endif
diff --git a/src/gui/dialogs/ManageMetronomeDialog.cpp b/src/gui/dialogs/ManageMetronomeDialog.cpp
new file mode 100644
index 0000000..a0f73d6
--- /dev/null
+++ b/src/gui/dialogs/ManageMetronomeDialog.cpp
@@ -0,0 +1,508 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "ManageMetronomeDialog.h"
+#include <qlayout.h>
+
+#include <klocale.h>
+#include "misc/Debug.h"
+#include "misc/Strings.h"
+#include "base/Composition.h"
+#include "base/Device.h"
+#include "base/Instrument.h"
+#include "base/MidiDevice.h"
+#include "base/MidiProgram.h"
+#include "base/RealTime.h"
+#include "base/Studio.h"
+#include "document/RosegardenGUIDoc.h"
+#include "gui/editors/parameters/InstrumentParameterBox.h"
+#include "gui/seqmanager/SequenceManager.h"
+#include "gui/studio/StudioControl.h"
+#include "gui/widgets/PitchChooser.h"
+#include "sound/MappedEvent.h"
+#include <kcombobox.h>
+#include <kdialogbase.h>
+#include <qcheckbox.h>
+#include <qframe.h>
+#include <qgroupbox.h>
+#include <qhbox.h>
+#include <qlabel.h>
+#include <qspinbox.h>
+#include <qstring.h>
+#include <qvbox.h>
+#include <qwidget.h>
+
+
+namespace Rosegarden
+{
+
+ManageMetronomeDialog::ManageMetronomeDialog(QWidget *parent,
+ RosegardenGUIDoc *doc) :
+ KDialogBase(parent, 0, true, i18n("Metronome"), Ok | Apply | Close | Help),
+ m_doc(doc)
+{
+ setHelp("studio-metronome");
+
+ QHBox *hbox = makeHBoxMainWidget();
+
+ // I think having this as well probably just overcomplicates things
+ m_instrumentParameterBox = 0;
+ // m_instrumentParameterBox = new InstrumentParameterBox(doc, hbox);
+
+ QVBox *vbox = new QVBox(hbox);
+
+ QGroupBox *deviceBox = new QGroupBox
+ (1, Horizontal, i18n("Metronome Instrument"), vbox);
+
+ QFrame *frame = new QFrame(deviceBox);
+ QGridLayout *layout = new QGridLayout(frame, 2, 2, 10, 5);
+
+ layout->addWidget(new QLabel(i18n("Device"), frame), 0, 0);
+ m_metronomeDevice = new KComboBox(frame);
+ layout->addWidget(m_metronomeDevice, 0, 1);
+
+ DeviceList *devices = doc->getStudio().getDevices();
+ DeviceListConstIterator it;
+
+ Studio &studio = m_doc->getStudio();
+ DeviceId deviceId = studio.getMetronomeDevice();
+
+ for (it = devices->begin(); it != devices->end(); it++) {
+ MidiDevice *dev =
+ dynamic_cast<MidiDevice*>(*it);
+
+ if (dev && dev->getDirection() == MidiDevice::Play) {
+ QString label = strtoqstr(dev->getName());
+ QString connection = strtoqstr(dev->getConnection());
+ label += " - ";
+ if (connection == "")
+ label += i18n("No connection");
+ else
+ label += connection;
+ m_metronomeDevice->insertItem(label);
+ if (dev->getId() == deviceId) {
+ m_metronomeDevice->setCurrentItem(m_metronomeDevice->count() - 1);
+ }
+ }
+ }
+
+ layout->addWidget(new QLabel(i18n("Instrument"), frame), 1, 0);
+ m_metronomeInstrument = new KComboBox(frame);
+ connect(m_metronomeInstrument, SIGNAL(activated(int)), this, SLOT(slotSetModified()));
+ connect(m_metronomeInstrument, SIGNAL(activated(int)), this, SLOT(slotInstrumentChanged(int)));
+ layout->addWidget(m_metronomeInstrument, 1, 1);
+
+ QGroupBox *beatBox = new QGroupBox
+ (1, Horizontal, i18n("Beats"), vbox);
+
+ frame = new QFrame(beatBox);
+ layout = new QGridLayout(frame, 4, 2, 10, 5);
+
+ layout->addWidget(new QLabel(i18n("Resolution"), frame), 0, 0);
+ m_metronomeResolution = new KComboBox(frame);
+ m_metronomeResolution->insertItem(i18n("None"));
+ m_metronomeResolution->insertItem(i18n("Bars only"));
+ m_metronomeResolution->insertItem(i18n("Bars and beats"));
+ m_metronomeResolution->insertItem(i18n("Bars, beats, and divisions"));
+ connect(m_metronomeResolution, SIGNAL(activated(int)), this, SLOT(slotResolutionChanged(int)));
+ layout->addWidget(m_metronomeResolution, 0, 1);
+
+ layout->addWidget(new QLabel(i18n("Bar velocity"), frame), 1, 0);
+ m_metronomeBarVely = new QSpinBox(frame);
+ m_metronomeBarVely->setMinValue(0);
+ m_metronomeBarVely->setMaxValue(127);
+ connect(m_metronomeBarVely, SIGNAL(valueChanged(int)), this, SLOT(slotSetModified()));
+ layout->addWidget(m_metronomeBarVely, 1, 1);
+
+ layout->addWidget(new QLabel(i18n("Beat velocity"), frame), 2, 0);
+ m_metronomeBeatVely = new QSpinBox(frame);
+ m_metronomeBeatVely->setMinValue(0);
+ m_metronomeBeatVely->setMaxValue(127);
+ connect(m_metronomeBeatVely, SIGNAL(valueChanged(int)), this, SLOT(slotSetModified()));
+ layout->addWidget(m_metronomeBeatVely, 2, 1);
+
+ layout->addWidget(new QLabel(i18n("Sub-beat velocity"), frame), 3, 0);
+ m_metronomeSubBeatVely = new QSpinBox(frame);
+ m_metronomeSubBeatVely->setMinValue(0);
+ m_metronomeSubBeatVely->setMaxValue(127);
+ connect(m_metronomeSubBeatVely, SIGNAL(valueChanged(int)), this, SLOT(slotSetModified()));
+ layout->addWidget(m_metronomeSubBeatVely, 3, 1);
+
+ vbox = new QVBox(hbox);
+
+ m_metronomePitch = new PitchChooser(i18n("Pitch"), vbox, 60);
+ connect(m_metronomePitch, SIGNAL(pitchChanged(int)), this, SLOT(slotPitchChanged(int)));
+ connect(m_metronomePitch, SIGNAL(preview(int)), this, SLOT(slotPreviewPitch(int)));
+
+ m_metronomePitchSelector = new KComboBox(m_metronomePitch);
+ m_metronomePitchSelector->insertItem(i18n("for Bar"));
+ m_metronomePitchSelector->insertItem(i18n("for Beat"));
+ m_metronomePitchSelector->insertItem(i18n("for Sub-beat"));
+ connect(m_metronomePitchSelector, SIGNAL(activated(int)), this, SLOT(slotPitchSelectorChanged(int)));
+
+ QGroupBox *enableBox = new QGroupBox
+ (1, Horizontal, i18n("Metronome Activated"), vbox);
+ m_playEnabled = new QCheckBox(i18n("Playing"), enableBox);
+ m_recordEnabled = new QCheckBox(i18n("Recording"), enableBox);
+ connect(m_playEnabled, SIGNAL(clicked()), this, SLOT(slotSetModified()));
+ connect(m_recordEnabled, SIGNAL(clicked()), this, SLOT(slotSetModified()));
+
+ // populate the dialog
+ populate(m_metronomeDevice->currentItem());
+
+ // connect up the device list
+ connect(m_metronomeDevice, SIGNAL(activated(int)),
+ this, SLOT(populate(int)));
+ // connect up the device list
+ connect(m_metronomeDevice, SIGNAL(activated(int)),
+ this, SLOT(slotSetModified()));
+
+ setModified(false);
+}
+
+void
+ManageMetronomeDialog::slotResolutionChanged(int depth)
+{
+ m_metronomeBeatVely->setEnabled(depth > 1);
+ m_metronomeSubBeatVely->setEnabled(depth > 2);
+ slotSetModified();
+}
+
+void
+ManageMetronomeDialog::populate(int deviceIndex)
+{
+ m_metronomeInstrument->clear();
+
+ DeviceList *devices = m_doc->getStudio().getDevices();
+ DeviceListConstIterator it;
+ int count = 0;
+ MidiDevice *dev = 0;
+
+ for (it = devices->begin(); it != devices->end(); it++) {
+ dev = dynamic_cast<MidiDevice*>(*it);
+
+ if (dev && dev->getDirection() == MidiDevice::Play) {
+ if (count == deviceIndex)
+ break;
+
+ count++;
+ }
+ }
+
+ // sanity
+ if (count < 0 || dev == 0) {
+ if (m_instrumentParameterBox)
+ m_instrumentParameterBox->useInstrument(0);
+ return ;
+ }
+
+ // populate instrument list
+ InstrumentList list = dev->getPresentationInstruments();
+ InstrumentList::iterator iit;
+
+ const MidiMetronome *metronome = dev->getMetronome();
+
+ // if we've got no metronome against this device then create one
+ if (metronome == 0) {
+ InstrumentId id = SystemInstrumentBase;
+
+ for (iit = list.begin(); iit != list.end(); ++iit) {
+ if ((*iit)->isPercussion()) {
+ id = (*iit)->getId();
+ break;
+ }
+ }
+
+ dev->setMetronome(MidiMetronome(id));
+
+ metronome = dev->getMetronome();
+ }
+
+ // metronome should now be set but we still check it
+ if (metronome) {
+ int position = 0;
+ int count = 0;
+ for (iit = list.begin(); iit != list.end(); ++iit) {
+ QString iname(strtoqstr((*iit)->getPresentationName()));
+ QString pname(strtoqstr((*iit)->getProgramName()));
+ if (pname != "")
+ iname += " (" + pname + ")";
+
+ bool used = false;
+ for (Composition::trackcontainer::iterator tit =
+ m_doc->getComposition().getTracks().begin();
+ tit != m_doc->getComposition().getTracks().end(); ++tit) {
+
+ if (tit->second->getInstrument() == (*iit)->getId()) {
+ used = true;
+ break;
+ }
+ }
+
+ // if (used) iname = i18n("%1 [used]").arg(iname);
+
+ m_metronomeInstrument->insertItem(iname);
+
+ if ((*iit)->getId() == metronome->getInstrument()) {
+ position = count;
+ }
+ count++;
+ }
+ m_metronomeInstrument->setCurrentItem(position);
+ slotInstrumentChanged(position);
+
+ m_barPitch = metronome->getBarPitch();
+ m_beatPitch = metronome->getBeatPitch();
+ m_subBeatPitch = metronome->getSubBeatPitch();
+ slotPitchSelectorChanged(0);
+ m_metronomeResolution->setCurrentItem(metronome->getDepth());
+ m_metronomeBarVely->setValue(metronome->getBarVelocity());
+ m_metronomeBeatVely->setValue(metronome->getBeatVelocity());
+ m_metronomeSubBeatVely->setValue(metronome->getSubBeatVelocity());
+ m_playEnabled->setChecked(m_doc->getComposition().usePlayMetronome());
+ m_recordEnabled->setChecked(m_doc->getComposition().useRecordMetronome());
+ slotResolutionChanged(metronome->getDepth());
+ }
+}
+
+void
+ManageMetronomeDialog::slotInstrumentChanged(int i)
+{
+ if (!m_instrumentParameterBox)
+ return ;
+
+ int deviceIndex = m_metronomeDevice->currentItem();
+
+ DeviceList *devices = m_doc->getStudio().getDevices();
+ DeviceListConstIterator it;
+ int count = 0;
+ MidiDevice *dev = 0;
+
+ for (it = devices->begin(); it != devices->end(); it++) {
+ dev = dynamic_cast<MidiDevice*>(*it);
+
+ if (dev && dev->getDirection() == MidiDevice::Play) {
+ if (count == deviceIndex)
+ break;
+
+ count++;
+ }
+ }
+
+ // sanity
+ if (count < 0 || dev == 0) {
+ m_instrumentParameterBox->useInstrument(0);
+ return ;
+ }
+
+ // populate instrument list
+ InstrumentList list = dev->getPresentationInstruments();
+
+ if (i < 0 || i >= (int)list.size())
+ return ;
+
+ m_instrumentParameterBox->useInstrument(list[i]);
+}
+
+void
+ManageMetronomeDialog::slotOk()
+{
+ slotApply();
+ accept();
+}
+
+void
+ManageMetronomeDialog::slotSetModified()
+{
+ setModified(true);
+}
+
+void
+ManageMetronomeDialog::setModified(bool value)
+{
+ if (m_modified == value)
+ return ;
+
+ if (value) {
+ enableButtonApply(true);
+ } else {
+ enableButtonApply(false);
+ }
+
+ m_modified = value;
+}
+
+void
+ManageMetronomeDialog::slotApply()
+{
+ Studio &studio = m_doc->getStudio();
+
+ DeviceList *devices = m_doc->getStudio().getDevices();
+ DeviceListConstIterator it;
+ int count = 0;
+ MidiDevice *dev = 0;
+
+ for (it = devices->begin(); it != devices->end(); it++) {
+ dev = dynamic_cast<MidiDevice*>(*it);
+
+ if (dev && dev->getDirection() == MidiDevice::Play) {
+ if (count == m_metronomeDevice->currentItem())
+ break;
+
+ count++;
+ }
+ }
+
+ if (!dev) {
+ std::cerr << "Warning: ManageMetronomeDialog::slotApply: no " << m_metronomeDevice->currentItem() << "th device" << std::endl;
+ return ;
+ }
+
+ DeviceId deviceId = dev->getId();
+ studio.setMetronomeDevice(deviceId);
+
+ if (dev->getMetronome() == 0)
+ return ;
+ MidiMetronome metronome(*dev->getMetronome());
+
+ // get instrument
+ InstrumentList list = dev->getPresentationInstruments();
+
+ Instrument *inst =
+ list[m_metronomeInstrument->currentItem()];
+
+ if (inst) {
+ metronome.setInstrument(inst->getId());
+ }
+
+ metronome.setBarPitch(m_barPitch);
+ metronome.setBeatPitch(m_beatPitch);
+ metronome.setSubBeatPitch(m_subBeatPitch);
+
+ metronome.setDepth(
+ m_metronomeResolution->currentItem());
+
+ metronome.setBarVelocity(
+ MidiByte(m_metronomeBarVely->value()));
+
+ metronome.setBeatVelocity(
+ MidiByte(m_metronomeBeatVely->value()));
+
+ metronome.setSubBeatVelocity(
+ MidiByte(m_metronomeSubBeatVely->value()));
+
+ dev->setMetronome(metronome);
+
+ m_doc->getComposition().setPlayMetronome(m_playEnabled->isChecked());
+ m_doc->getComposition().setRecordMetronome(m_recordEnabled->isChecked());
+
+ m_doc->getSequenceManager()->metronomeChanged(inst->getId(), true);
+ m_doc->slotDocumentModified();
+ setModified(false);
+}
+
+void
+ManageMetronomeDialog::slotPreviewPitch(int pitch)
+{
+ RG_DEBUG << "ManageMetronomeDialog::slotPreviewPitch" << endl;
+
+ DeviceList *devices = m_doc->getStudio().getDevices();
+ DeviceListConstIterator it;
+ int count = 0;
+ MidiDevice *dev = 0;
+
+ for (it = devices->begin(); it != devices->end(); it++) {
+ dev = dynamic_cast<MidiDevice*>(*it);
+
+ if (dev && dev->getDirection() == MidiDevice::Play) {
+ if (count == m_metronomeDevice->currentItem())
+ break;
+
+ count++;
+ }
+ }
+
+ if (!dev)
+ return ;
+
+ const MidiMetronome *metronome = dev->getMetronome();
+ if (metronome == 0)
+ return ;
+
+ InstrumentList list = dev->getPresentationInstruments();
+
+ Instrument *inst =
+ list[m_metronomeInstrument->currentItem()];
+
+ if (inst) {
+ RG_DEBUG << "ManageMetronomeDialog::slotPreviewPitch"
+ << " - previewing" << endl;
+ MappedEvent mE(inst->getId(),
+ MappedEvent::MidiNoteOneShot,
+ pitch,
+ MidiMaxValue,
+ RealTime::zeroTime,
+ RealTime(0, 10000000),
+ RealTime::zeroTime);
+
+ StudioControl::sendMappedEvent(mE);
+ }
+}
+
+void
+ManageMetronomeDialog::slotPitchChanged(int pitch)
+{
+ switch (m_metronomePitchSelector->currentItem()) {
+ case 0:
+ m_barPitch = pitch;
+ break;
+ case 1:
+ m_beatPitch = pitch;
+ break;
+ case 2:
+ m_subBeatPitch = pitch;
+ break;
+ }
+ setModified(true);
+}
+
+void
+ManageMetronomeDialog::slotPitchSelectorChanged(int selection)
+{
+ switch (selection) {
+ case 0:
+ m_metronomePitch->slotSetPitch(m_barPitch);
+ break;
+ case 1:
+ m_metronomePitch->slotSetPitch(m_beatPitch);
+ break;
+ case 2:
+ m_metronomePitch->slotSetPitch(m_subBeatPitch);
+ break;
+ }
+}
+
+}
+#include "ManageMetronomeDialog.moc"
diff --git a/src/gui/dialogs/ManageMetronomeDialog.h b/src/gui/dialogs/ManageMetronomeDialog.h
new file mode 100644
index 0000000..08b806c
--- /dev/null
+++ b/src/gui/dialogs/ManageMetronomeDialog.h
@@ -0,0 +1,94 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_MANAGEMETRONOMEDIALOG_H_
+#define _RG_MANAGEMETRONOMEDIALOG_H_
+
+#include "base/MidiProgram.h"
+#include <kdialogbase.h>
+
+
+class QWidget;
+class QSpinBox;
+class QCheckBox;
+class KComboBox;
+
+
+namespace Rosegarden
+{
+
+class RosegardenGUIDoc;
+class PitchChooser;
+class InstrumentParameterBox;
+
+
+class ManageMetronomeDialog : public KDialogBase
+{
+ Q_OBJECT
+
+public:
+ ManageMetronomeDialog(QWidget *parent, RosegardenGUIDoc *doc);
+
+ void setModified(bool value);
+
+public slots:
+ void slotOk();
+ void slotApply();
+ void slotSetModified();
+ void slotResolutionChanged(int);
+ void slotPreviewPitch(int);
+ void slotInstrumentChanged(int);
+ void slotPitchSelectorChanged(int);
+ void slotPitchChanged(int);
+ void populate(int dev);
+
+protected:
+
+ //--------------- Data members ---------------------------------
+
+ RosegardenGUIDoc *m_doc;
+
+ KComboBox *m_metronomeDevice;
+ KComboBox *m_metronomeInstrument;
+ KComboBox *m_metronomeResolution;
+ KComboBox *m_metronomePitchSelector;
+ PitchChooser *m_metronomePitch;
+ QSpinBox *m_metronomeBarVely;
+ QSpinBox *m_metronomeBeatVely;
+ QSpinBox *m_metronomeSubBeatVely;
+ InstrumentParameterBox *m_instrumentParameterBox;
+ QCheckBox *m_playEnabled;
+ QCheckBox *m_recordEnabled;
+
+ bool m_modified;
+ MidiByte m_barPitch;
+ MidiByte m_beatPitch;
+ MidiByte m_subBeatPitch;
+};
+
+
+}
+
+#endif
diff --git a/src/gui/dialogs/MarkerModifyDialog.cpp b/src/gui/dialogs/MarkerModifyDialog.cpp
new file mode 100644
index 0000000..69e658b
--- /dev/null
+++ b/src/gui/dialogs/MarkerModifyDialog.cpp
@@ -0,0 +1,113 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "MarkerModifyDialog.h"
+#include <qlayout.h>
+
+#include <klocale.h>
+#include "base/Composition.h"
+#include "document/RosegardenGUIDoc.h"
+#include "gui/widgets/TimeWidget.h"
+#include <kdialogbase.h>
+#include <qframe.h>
+#include <qgroupbox.h>
+#include <qlabel.h>
+#include <qlineedit.h>
+#include <qspinbox.h>
+#include <qstring.h>
+#include <qvbox.h>
+#include <qwidget.h>
+#include "misc/Strings.h"
+
+
+namespace Rosegarden
+{
+
+MarkerModifyDialog::MarkerModifyDialog(QWidget *parent,
+ Composition *composition,
+ int time,
+ const QString &name,
+ const QString &des):
+ KDialogBase(parent, 0, true, i18n("Edit Marker"), Ok | Cancel)
+{
+ initialise(composition, time, name, des);
+}
+
+MarkerModifyDialog::MarkerModifyDialog(QWidget *parent,
+ Composition *composition,
+ Marker *marker) :
+ KDialogBase(parent, 0, true, i18n("Edit Marker"), Ok | Cancel)
+{
+ initialise(composition, marker->getTime(),
+ strtoqstr(marker->getName()),
+ strtoqstr(marker->getDescription()));
+}
+
+void
+MarkerModifyDialog::initialise(Composition *composition,
+ int time,
+ const QString &name,
+ const QString &des)
+{
+ m_originalTime = time;
+
+ QVBox *vbox = makeVBoxMainWidget();
+
+ m_timeEdit = new TimeWidget(i18n("Marker Time"), vbox, composition,
+ time);
+
+ /*!!!
+
+ layout->addWidget(new QLabel(i18n("Absolute Time:"), frame), 0, 0);
+ m_timeEdit = new QSpinBox(frame);
+ layout->addWidget(m_timeEdit, 0, 1);
+
+ m_timeEdit->setMinValue(INT_MIN);
+ m_timeEdit->setMaxValue(INT_MAX);
+ m_timeEdit->setLineStep(
+ Note(Note::Shortest).getDuration());
+ m_timeEdit->setValue(time);
+ */
+ QGroupBox *groupBox = new QGroupBox
+ (1, Horizontal, i18n("Marker Properties"), vbox);
+
+ QFrame *frame = new QFrame(groupBox);
+
+ QGridLayout *layout = new QGridLayout(frame, 2, 2, 5, 5);
+
+ layout->addWidget(new QLabel(i18n("Text:"), frame), 0, 0);
+ m_nameEdit = new QLineEdit(name, frame);
+ layout->addWidget(m_nameEdit, 0, 1);
+
+ layout->addWidget(new QLabel(i18n("Description:"), frame), 1, 0);
+ m_desEdit = new QLineEdit(des, frame);
+ layout->addWidget(m_desEdit, 1, 1);
+
+ m_nameEdit->selectAll();
+ m_nameEdit->setFocus();
+}
+
+}
+#include "MarkerModifyDialog.moc"
diff --git a/src/gui/dialogs/MarkerModifyDialog.h b/src/gui/dialogs/MarkerModifyDialog.h
new file mode 100644
index 0000000..5b87b14
--- /dev/null
+++ b/src/gui/dialogs/MarkerModifyDialog.h
@@ -0,0 +1,84 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_MARKERMODIFYDIALOG_H_
+#define _RG_MARKERMODIFYDIALOG_H_
+
+#include <kdialogbase.h>
+#include <qstring.h>
+#include <qlineedit.h>
+
+#include "base/Marker.h"
+#include "gui/widgets/TimeWidget.h"
+
+
+namespace Rosegarden
+{
+
+class TimeWidget;
+class RosegardenGUIDoc;
+class Composition;
+
+
+class MarkerModifyDialog : public KDialogBase
+{
+ Q_OBJECT
+public:
+ MarkerModifyDialog(QWidget *parent,
+ Composition *composition,
+ int time,
+ const QString &name,
+ const QString &des);
+
+ MarkerModifyDialog(QWidget *parent,
+ Composition *composition,
+ Marker *marker);
+
+ QString getName() const { return m_nameEdit->text(); }
+ QString getDescription() const { return m_desEdit->text(); }
+ int getTime() const { return m_timeEdit->getTime(); }
+ int getOriginalTime() const { return m_originalTime; }
+
+protected:
+ void initialise(Composition *composition,
+ int time,
+ const QString &name,
+ const QString &des);
+
+ RosegardenGUIDoc *m_doc;
+
+ TimeWidget *m_timeEdit;
+ QLineEdit *m_nameEdit;
+ QLineEdit *m_desEdit;
+
+ int m_originalTime;
+};
+
+
+
+
+}
+
+#endif
diff --git a/src/gui/dialogs/PasteNotationDialog.cpp b/src/gui/dialogs/PasteNotationDialog.cpp
new file mode 100644
index 0000000..0c725d5
--- /dev/null
+++ b/src/gui/dialogs/PasteNotationDialog.cpp
@@ -0,0 +1,101 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "PasteNotationDialog.h"
+
+#include <klocale.h>
+#include "commands/edit/PasteEventsCommand.h"
+#include <kdialogbase.h>
+#include <qbuttongroup.h>
+#include <qcheckbox.h>
+#include <qobject.h>
+#include <qradiobutton.h>
+#include <qvbox.h>
+#include <qwidget.h>
+
+
+namespace Rosegarden
+{
+
+PasteNotationDialog::PasteNotationDialog(QWidget *parent,
+ PasteEventsCommand::PasteType defaultType) :
+ KDialogBase(parent, 0, true, i18n("Paste"), Ok | Cancel | Help ),
+ m_defaultType(defaultType)
+{
+ setHelp("nv-paste-types");
+
+ QVBox *vbox = makeVBoxMainWidget();
+
+ QButtonGroup *pasteTypeGroup = new QButtonGroup
+ (1, Horizontal, i18n("Paste type"), vbox);
+
+ PasteEventsCommand::PasteTypeMap pasteTypes =
+ PasteEventsCommand::getPasteTypes();
+
+ for (PasteEventsCommand::PasteTypeMap::iterator i = pasteTypes.begin();
+ i != pasteTypes.end(); ++i) {
+
+ QRadioButton *button = new QRadioButton(i->second, pasteTypeGroup);
+ button->setChecked(m_defaultType == i->first);
+ QObject::connect(button, SIGNAL(clicked()),
+ this, SLOT(slotPasteTypeChanged()));
+
+ m_pasteTypeButtons.push_back(button);
+ }
+
+ QButtonGroup *setAsDefaultGroup = new QButtonGroup
+ (1, Horizontal, i18n("Options"), vbox);
+
+ m_setAsDefaultButton = new QCheckBox
+ (i18n("Make this the default paste type"), setAsDefaultGroup);
+ m_setAsDefaultButton->setChecked(true);
+}
+
+PasteEventsCommand::PasteType
+PasteNotationDialog::getPasteType() const
+{
+ for (unsigned int i = 0; i < m_pasteTypeButtons.size(); ++i) {
+ if (m_pasteTypeButtons[i]->isChecked()) {
+ return (PasteEventsCommand::PasteType)i;
+ }
+ }
+
+ return PasteEventsCommand::Restricted;
+}
+
+bool
+PasteNotationDialog::setAsDefault() const
+{
+ return m_setAsDefaultButton->isChecked();
+}
+
+void
+PasteNotationDialog::slotPasteTypeChanged()
+{
+ m_setAsDefaultButton->setChecked(m_defaultType == getPasteType());
+}
+
+}
+#include "PasteNotationDialog.moc"
diff --git a/src/gui/dialogs/PasteNotationDialog.h b/src/gui/dialogs/PasteNotationDialog.h
new file mode 100644
index 0000000..213eaf8
--- /dev/null
+++ b/src/gui/dialogs/PasteNotationDialog.h
@@ -0,0 +1,72 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_PASTENOTATIONDIALOG_H_
+#define _RG_PASTENOTATIONDIALOG_H_
+
+#include "commands/edit/PasteEventsCommand.h"
+#include <kdialogbase.h>
+#include <vector>
+
+
+class QWidget;
+class QRadioButton;
+class QCheckBox;
+
+
+namespace Rosegarden
+{
+
+
+
+class PasteNotationDialog : public KDialogBase
+{
+ Q_OBJECT
+
+public:
+ PasteNotationDialog(QWidget *parent,
+ PasteEventsCommand::PasteType defaultType);
+
+ PasteEventsCommand::PasteType getPasteType() const;
+ bool setAsDefault() const;
+
+public slots:
+ void slotPasteTypeChanged();
+
+protected:
+
+ //--------------- Data members ---------------------------------
+
+ std::vector<QRadioButton *> m_pasteTypeButtons;
+ QCheckBox *m_setAsDefaultButton;
+
+ PasteEventsCommand::PasteType m_defaultType;
+};
+
+
+
+}
+
+#endif
diff --git a/src/gui/dialogs/PitchDialog.cpp b/src/gui/dialogs/PitchDialog.cpp
new file mode 100644
index 0000000..05fed08
--- /dev/null
+++ b/src/gui/dialogs/PitchDialog.cpp
@@ -0,0 +1,57 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "PitchDialog.h"
+
+#include <klocale.h>
+#include "gui/widgets/PitchChooser.h"
+#include <kdialogbase.h>
+#include <qstring.h>
+#include <qvbox.h>
+#include <qwidget.h>
+
+
+namespace Rosegarden
+{
+
+PitchDialog::PitchDialog(QWidget *parent, QString title, int defaultPitch) :
+ KDialogBase(parent, 0, true, title, User1 | Ok)
+{
+ QVBox *vbox = makeVBoxMainWidget();
+ m_pitchChooser = new PitchChooser(title, vbox, defaultPitch);
+
+ setButtonText(User1, i18n("Reset"));
+ connect(this, SIGNAL(user1Clicked()),
+ m_pitchChooser, SLOT(slotResetToDefault()));
+}
+
+int
+PitchDialog::getPitch() const
+{
+ return m_pitchChooser->getPitch();
+}
+
+}
+#include "PitchDialog.moc"
diff --git a/src/gui/dialogs/PitchDialog.h b/src/gui/dialogs/PitchDialog.h
new file mode 100644
index 0000000..72e6381
--- /dev/null
+++ b/src/gui/dialogs/PitchDialog.h
@@ -0,0 +1,58 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_PITCHDIALOG_H_
+#define _RG_PITCHDIALOG_H_
+
+#include <kdialogbase.h>
+#include <qstring.h>
+
+
+class QWidget;
+
+
+namespace Rosegarden
+{
+
+class PitchChooser;
+
+
+class PitchDialog : public KDialogBase
+{
+ Q_OBJECT
+public:
+ PitchDialog(QWidget *parent, QString title, int defaultPitch = 60);
+
+ int getPitch() const;
+
+protected:
+ PitchChooser *m_pitchChooser;
+};
+
+
+
+}
+
+#endif
diff --git a/src/gui/dialogs/PitchPickerDialog.cpp b/src/gui/dialogs/PitchPickerDialog.cpp
new file mode 100644
index 0000000..ddd1f23
--- /dev/null
+++ b/src/gui/dialogs/PitchPickerDialog.cpp
@@ -0,0 +1,58 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "PitchPickerDialog.h"
+#include <klocale.h>
+#include <kdialogbase.h>
+#include <qlayout.h>
+#include <qframe.h>
+#include <qstring.h>
+#include <qvbox.h>
+#include <qwidget.h>
+
+
+namespace Rosegarden
+{
+
+PitchPickerDialog::PitchPickerDialog(QWidget *parent, int initialPitch, QString text) :
+ KDialogBase(parent, 0, true, i18n("Pitch Selector"), Ok | Cancel)
+{
+ QVBox *vBox = makeVBoxMainWidget();
+
+ QFrame *frame = new QFrame(vBox);
+
+ QGridLayout *layout = new QGridLayout(frame, 4, 3, 10, 5);
+
+ m_pitch = new PitchChooser(text, frame, initialPitch);
+ layout->addMultiCellWidget(m_pitch, 0, 0, 0, 2, Qt::AlignHCenter);
+}
+
+PitchPickerDialog::~PitchPickerDialog()
+{
+ // Nothing here...
+}
+
+}
+#include "PitchPickerDialog.moc"
diff --git a/src/gui/dialogs/PitchPickerDialog.h b/src/gui/dialogs/PitchPickerDialog.h
new file mode 100644
index 0000000..ebd0a6d
--- /dev/null
+++ b/src/gui/dialogs/PitchPickerDialog.h
@@ -0,0 +1,57 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_PITCHPICKERDIALOG_H_
+#define _RG_PITCHPICKERDIALOG_H_
+
+#include "gui/widgets/PitchChooser.h"
+#include <kdialogbase.h>
+
+
+class QWidget;
+
+
+namespace Rosegarden
+{
+
+class PitchPickerDialog : public KDialogBase
+{
+ Q_OBJECT
+
+public:
+
+ PitchPickerDialog(QWidget* parent, int initialPitch, QString text);
+ ~PitchPickerDialog();
+
+ int getPitch() { return m_pitch->getPitch(); }
+
+private:
+ PitchChooser* m_pitch;
+};
+
+
+}
+
+#endif
diff --git a/src/gui/dialogs/QuantizeDialog.cpp b/src/gui/dialogs/QuantizeDialog.cpp
new file mode 100644
index 0000000..b934dd5
--- /dev/null
+++ b/src/gui/dialogs/QuantizeDialog.cpp
@@ -0,0 +1,68 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "QuantizeDialog.h"
+
+#include <klocale.h>
+#include "base/Quantizer.h"
+#include "gui/widgets/QuantizeParameters.h"
+#include <kdialogbase.h>
+#include <qvbox.h>
+#include <qwidget.h>
+
+
+namespace Rosegarden
+{
+
+QuantizeDialog::QuantizeDialog(QWidget *parent, bool inNotation) :
+ KDialogBase(parent, 0, true, i18n("Quantize"), Ok | Cancel | Details | Help)
+{
+ setHelp("quantization");
+
+ QVBox *vbox = makeVBoxMainWidget();
+
+ m_quantizeFrame =
+ new QuantizeParameters
+ (vbox, inNotation ? QuantizeParameters::Notation :
+ QuantizeParameters::Grid,
+ true, false, 0);
+
+ setButtonText(Details, i18n("Advanced"));
+ setDetailsWidget(m_quantizeFrame->getAdvancedWidget());
+ m_quantizeFrame->getAdvancedWidget()->hide();
+
+ m_quantizeFrame->adjustSize();
+ vbox->adjustSize();
+ adjustSize();
+}
+
+Quantizer *
+QuantizeDialog::getQuantizer() const
+{
+ return m_quantizeFrame->getQuantizer();
+}
+
+}
+#include "QuantizeDialog.moc"
diff --git a/src/gui/dialogs/QuantizeDialog.h b/src/gui/dialogs/QuantizeDialog.h
new file mode 100644
index 0000000..a787dd1
--- /dev/null
+++ b/src/gui/dialogs/QuantizeDialog.h
@@ -0,0 +1,60 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_QUANTIZEDIALOG_H_
+#define _RG_QUANTIZEDIALOG_H_
+
+#include <kdialogbase.h>
+
+
+class QWidget;
+
+
+namespace Rosegarden
+{
+
+class Quantizer;
+class QuantizeParameters;
+
+
+class QuantizeDialog : public KDialogBase
+{
+ Q_OBJECT
+
+public:
+ QuantizeDialog(QWidget *parent, bool inNotation = false);
+
+ /// Returned quantizer object is on heap -- caller must delete
+ Quantizer *getQuantizer() const;
+
+protected:
+ QuantizeParameters *m_quantizeFrame;
+};
+
+
+
+}
+
+#endif
diff --git a/src/gui/dialogs/RescaleDialog.cpp b/src/gui/dialogs/RescaleDialog.cpp
new file mode 100644
index 0000000..d99a6fb
--- /dev/null
+++ b/src/gui/dialogs/RescaleDialog.cpp
@@ -0,0 +1,131 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "RescaleDialog.h"
+
+#include <klocale.h>
+#include "document/ConfigGroups.h"
+#include "base/Composition.h"
+#include "gui/widgets/TimeWidget.h"
+#include <kconfig.h>
+#include <kdialogbase.h>
+#include <qcheckbox.h>
+#include <qgroupbox.h>
+#include <qstring.h>
+#include <qvbox.h>
+#include <qwidget.h>
+#include <kapplication.h>
+
+
+namespace Rosegarden
+{
+
+RescaleDialog::RescaleDialog(QWidget *parent,
+ Composition *composition,
+ timeT startTime,
+ timeT originalDuration,
+ bool showCloseGapOption,
+ bool constrainToCompositionDuration) :
+ KDialogBase(parent, 0, true, i18n("Rescale"), User1 | Ok | Cancel)
+{
+ QVBox *vbox = makeVBoxMainWidget();
+
+ m_newDuration = new TimeWidget
+ (i18n("Duration of selection"), vbox, composition,
+ startTime, originalDuration, true,
+ constrainToCompositionDuration);
+
+ if (showCloseGapOption) {
+ QGroupBox *optionBox = new QGroupBox(1, Horizontal, i18n("Options"), vbox);
+ m_closeGap = new QCheckBox(i18n("Adjust times of following events accordingly"),
+ optionBox);
+ KConfig *config = kapp->config();
+ config->setGroup(GeneralOptionsConfigGroup);
+ m_closeGap->setChecked
+ (config->readBoolEntry("rescaledialogadjusttimes", true));
+ } else {
+ m_closeGap = 0;
+ }
+
+ setButtonText(User1, i18n("Reset"));
+ connect(this, SIGNAL(user1Clicked()),
+ m_newDuration, SLOT(slotResetToDefault()));
+}
+
+timeT
+RescaleDialog::getNewDuration()
+{
+ return m_newDuration->getTime();
+}
+
+bool
+RescaleDialog::shouldCloseGap()
+{
+ if (m_closeGap) {
+ KConfig *config = kapp->config();
+ config->setGroup(GeneralOptionsConfigGroup);
+ config->writeEntry("rescaledialogadjusttimes", m_closeGap->isChecked());
+ return m_closeGap->isChecked();
+ } else {
+ return true;
+ }
+}
+
+/*
+int
+RescaleDialog::getMultiplier()
+{
+ return m_to;
+}
+
+int
+RescaleDialog::getDivisor()
+{
+ return m_from;
+}
+
+void
+RescaleDialog::slotFromChanged(int i)
+{
+ m_from = i + 1;
+ int perTenThou = m_to * 10000 / m_from;
+ m_percent->setText(QString("%1.%2%").
+ arg(perTenThou / 100).
+ arg(perTenThou % 100));
+}
+
+void
+RescaleDialog::slotToChanged(int i)
+{
+ m_to = i + 1;
+ int perTenThou = m_to * 10000 / m_from;
+ m_percent->setText(QString("%1.%2%").
+ arg(perTenThou / 100).
+ arg(perTenThou % 100));
+}
+*/
+
+}
+#include "RescaleDialog.moc"
diff --git a/src/gui/dialogs/RescaleDialog.h b/src/gui/dialogs/RescaleDialog.h
new file mode 100644
index 0000000..196dd87
--- /dev/null
+++ b/src/gui/dialogs/RescaleDialog.h
@@ -0,0 +1,68 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_RESCALEDIALOG_H_
+#define _RG_RESCALEDIALOG_H_
+
+#include <kdialogbase.h>
+#include "base/Event.h"
+
+
+class QWidget;
+class QCheckBox;
+
+
+namespace Rosegarden
+{
+
+class TimeWidget;
+class Composition;
+
+
+class RescaleDialog : public KDialogBase
+{
+ Q_OBJECT
+
+public:
+ RescaleDialog(QWidget *parent,
+ Composition *composition, // for TimeWidget calculations
+ timeT startTime,
+ timeT originalDuration,
+ bool showCloseGapOption,
+ bool constrainToCompositionDuration);
+
+ timeT getNewDuration();
+ bool shouldCloseGap();
+
+protected:
+ TimeWidget *m_newDuration;
+ QCheckBox *m_closeGap;
+};
+
+
+
+}
+
+#endif
diff --git a/src/gui/dialogs/ShowSequencerStatusDialog.cpp b/src/gui/dialogs/ShowSequencerStatusDialog.cpp
new file mode 100644
index 0000000..d98933c
--- /dev/null
+++ b/src/gui/dialogs/ShowSequencerStatusDialog.cpp
@@ -0,0 +1,79 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "ShowSequencerStatusDialog.h"
+
+#include <klocale.h>
+#include <kdialogbase.h>
+#include <qcstring.h>
+#include <qdatastream.h>
+#include <qlabel.h>
+#include <qstring.h>
+#include <qtextedit.h>
+#include <qvbox.h>
+#include <qwidget.h>
+#include "gui/application/RosegardenApplication.h"
+
+
+namespace Rosegarden
+{
+
+ShowSequencerStatusDialog::ShowSequencerStatusDialog(QWidget *parent) :
+ KDialogBase(parent, 0, true, i18n("Sequencer status"), Close)
+{
+ QVBox *vbox = makeVBoxMainWidget();
+
+ new QLabel(i18n("Sequencer status:"), vbox);
+
+ QString status(i18n("Status not available."));
+
+ QCString replyType;
+ QByteArray replyData;
+ QByteArray data;
+
+ if (!rgapp->sequencerCall("getStatusLog()", replyType, replyData)) {
+ status = i18n("Sequencer is not running or is not responding.");
+ }
+
+ QDataStream streamIn(replyData, IO_ReadOnly);
+ QString result;
+ streamIn >> result;
+ if (!result) {
+ status = i18n("Sequencer is not returning a valid status report.");
+ } else {
+ status = result;
+ }
+
+ QTextEdit *text = new QTextEdit(vbox);
+ text->setTextFormat(Qt::PlainText);
+ text->setReadOnly(true);
+ text->setMinimumWidth(500);
+ text->setMinimumHeight(200);
+
+ text->setText(status);
+}
+
+}
+#include "ShowSequencerStatusDialog.moc"
diff --git a/src/gui/dialogs/ShowSequencerStatusDialog.h b/src/gui/dialogs/ShowSequencerStatusDialog.h
new file mode 100644
index 0000000..ce21ab1
--- /dev/null
+++ b/src/gui/dialogs/ShowSequencerStatusDialog.h
@@ -0,0 +1,54 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_SHOWSEQUENCERSTATUSDIALOG_H_
+#define _RG_SHOWSEQUENCERSTATUSDIALOG_H_
+
+#include <kdialogbase.h>
+
+
+class QWidget;
+
+
+namespace Rosegarden
+{
+
+
+
+class ShowSequencerStatusDialog : public KDialogBase
+{
+ Q_OBJECT
+public:
+ ShowSequencerStatusDialog(QWidget *parent);
+};
+
+
+// Timer dialog for counting down
+//
+
+
+}
+
+#endif
diff --git a/src/gui/dialogs/SimpleEventEditDialog.cpp b/src/gui/dialogs/SimpleEventEditDialog.cpp
new file mode 100644
index 0000000..ca6b76a
--- /dev/null
+++ b/src/gui/dialogs/SimpleEventEditDialog.cpp
@@ -0,0 +1,1061 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "SimpleEventEditDialog.h"
+#include <qlayout.h>
+
+#include "base/BaseProperties.h"
+#include "base/Event.h"
+#include "base/MidiTypes.h"
+#include "base/NotationTypes.h"
+#include "document/RosegardenGUIDoc.h"
+#include "gui/editors/guitar/Chord.h"
+#include "misc/Strings.h"
+#include "PitchDialog.h"
+#include "TimeDialog.h"
+#include <kcombobox.h>
+#include <kdialogbase.h>
+#include <kfiledialog.h>
+#include <klocale.h>
+#include <qcheckbox.h>
+#include <qdialog.h>
+#include <qfile.h>
+#include <qframe.h>
+#include <qgroupbox.h>
+#include <qlabel.h>
+#include <qlineedit.h>
+#include <qpushbutton.h>
+#include <qspinbox.h>
+#include <qstring.h>
+#include <qvbox.h>
+#include <qwidget.h>
+
+
+namespace Rosegarden
+{
+
+SimpleEventEditDialog::SimpleEventEditDialog(QWidget *parent,
+ RosegardenGUIDoc *doc,
+ const Event &event,
+ bool inserting) :
+ KDialogBase(parent, 0, true,
+ i18n(inserting ? "Insert Event" : "Edit Event"), Ok | Cancel),
+ m_event(event),
+ m_doc(doc),
+ m_type(event.getType()),
+ m_absoluteTime(event.getAbsoluteTime()),
+ m_duration(event.getDuration()),
+ m_modified(false)
+{
+ QVBox *vbox = makeVBoxMainWidget();
+
+ QGroupBox *groupBox = new QGroupBox
+ (1, Horizontal, i18n("Event Properties"), vbox);
+
+ QFrame *frame = new QFrame(groupBox);
+
+ QGridLayout *layout = new QGridLayout(frame, 7, 3, 5, 5);
+
+ layout->addWidget(new QLabel(i18n("Event type:"), frame), 0, 0);
+
+ if (inserting) {
+
+ m_typeLabel = 0;
+
+ m_typeCombo = new KComboBox(frame);
+ layout->addWidget(m_typeCombo, 0, 1);
+
+ m_typeCombo->insertItem(strtoqstr(Note::EventType));
+ m_typeCombo->insertItem(strtoqstr(Controller::EventType));
+ m_typeCombo->insertItem(strtoqstr(KeyPressure::EventType));
+ m_typeCombo->insertItem(strtoqstr(ChannelPressure::EventType));
+ m_typeCombo->insertItem(strtoqstr(ProgramChange::EventType));
+ m_typeCombo->insertItem(strtoqstr(SystemExclusive::EventType));
+ m_typeCombo->insertItem(strtoqstr(PitchBend::EventType));
+ m_typeCombo->insertItem(strtoqstr(Indication::EventType));
+ m_typeCombo->insertItem(strtoqstr(Text::EventType));
+ m_typeCombo->insertItem(strtoqstr(Note::EventRestType));
+ m_typeCombo->insertItem(strtoqstr(Clef::EventType));
+ m_typeCombo->insertItem(strtoqstr(::Rosegarden::Key::EventType));
+ m_typeCombo->insertItem(strtoqstr(Guitar::Chord::EventType));
+
+ // Connect up the combos
+ //
+ connect(m_typeCombo, SIGNAL(activated(int)),
+ SLOT(slotEventTypeChanged(int)));
+
+ } else {
+
+ m_typeCombo = 0;
+
+ m_typeLabel = new QLabel(frame);
+ layout->addWidget(m_typeLabel, 0, 1);
+ }
+
+ m_timeLabel = new QLabel(i18n("Absolute time:"), frame);
+ layout->addWidget(m_timeLabel, 1, 0);
+ m_timeSpinBox = new QSpinBox(INT_MIN, INT_MAX, Note(Note::Shortest).getDuration(), frame);
+ m_timeEditButton = new QPushButton("edit", frame);
+ layout->addWidget(m_timeSpinBox, 1, 1);
+ layout->addWidget(m_timeEditButton, 1, 2);
+
+ connect(m_timeSpinBox, SIGNAL(valueChanged(int)),
+ SLOT(slotAbsoluteTimeChanged(int)));
+ connect(m_timeEditButton, SIGNAL(released()),
+ SLOT(slotEditAbsoluteTime()));
+
+ m_durationLabel = new QLabel(i18n("Duration:"), frame);
+ layout->addWidget(m_durationLabel, 2, 0);
+ m_durationSpinBox = new QSpinBox(0, INT_MAX, Note(Note::Shortest).getDuration(), frame);
+ m_durationEditButton = new QPushButton("edit", frame);
+ layout->addWidget(m_durationSpinBox, 2, 1);
+ layout->addWidget(m_durationEditButton, 2, 2);
+
+ connect(m_durationSpinBox, SIGNAL(valueChanged(int)),
+ SLOT(slotDurationChanged(int)));
+ connect(m_durationEditButton, SIGNAL(released()),
+ SLOT(slotEditDuration()));
+
+ m_pitchLabel = new QLabel(i18n("Pitch:"), frame);
+ layout->addWidget(m_pitchLabel, 3, 0);
+ m_pitchSpinBox = new QSpinBox(frame);
+ m_pitchEditButton = new QPushButton("edit", frame);
+ layout->addWidget(m_pitchSpinBox, 3, 1);
+ layout->addWidget(m_pitchEditButton, 3, 2);
+
+ connect(m_pitchSpinBox, SIGNAL(valueChanged(int)),
+ SLOT(slotPitchChanged(int)));
+ connect(m_pitchEditButton, SIGNAL(released()),
+ SLOT(slotEditPitch()));
+
+ m_pitchSpinBox->setMinValue(MidiMinValue);
+ m_pitchSpinBox->setMaxValue(MidiMaxValue);
+
+ m_controllerLabel = new QLabel(i18n("Controller name:"), frame);
+ m_controllerLabelValue = new QLabel(i18n("<none>"), frame);
+ m_controllerLabelValue->setAlignment(QLabel::AlignRight);
+
+ layout->addWidget(m_controllerLabel, 4, 0);
+ layout->addWidget(m_controllerLabelValue, 4, 1);
+
+ m_velocityLabel = new QLabel(i18n("Velocity:"), frame);
+ layout->addWidget(m_velocityLabel, 5, 0);
+ m_velocitySpinBox = new QSpinBox(frame);
+ layout->addWidget(m_velocitySpinBox, 5, 1);
+
+ connect(m_velocitySpinBox, SIGNAL(valueChanged(int)),
+ SLOT(slotVelocityChanged(int)));
+
+ m_velocitySpinBox->setMinValue(MidiMinValue);
+ m_velocitySpinBox->setMaxValue(MidiMaxValue);
+
+ m_metaLabel = new QLabel(i18n("Meta string:"), frame);
+ layout->addWidget(m_metaLabel, 6, 0);
+ m_metaEdit = new QLineEdit(frame);
+ layout->addWidget(m_metaEdit, 6, 1);
+
+ m_sysexLoadButton = new QPushButton(i18n("Load data"), frame);
+ layout->addWidget(m_sysexLoadButton, 6, 2);
+ m_sysexSaveButton = new QPushButton(i18n("Save data"), frame);
+ layout->addWidget(m_sysexSaveButton, 4, 2);
+
+ connect(m_metaEdit, SIGNAL(textChanged(const QString &)),
+ SLOT(slotMetaChanged(const QString &)));
+ connect(m_sysexLoadButton, SIGNAL(released()),
+ SLOT(slotSysexLoad()));
+ connect(m_sysexSaveButton, SIGNAL(released()),
+ SLOT(slotSysexSave()));
+
+ m_notationGroupBox = new QGroupBox
+ (1, Horizontal, i18n("Notation Properties"), vbox);
+
+ frame = new QFrame(m_notationGroupBox);
+
+ layout = new QGridLayout(frame, 3, 3, 5, 5);
+
+ m_lockNotationValues = new QCheckBox(i18n("Lock to changes in performed values"), frame);
+ layout->addMultiCellWidget(m_lockNotationValues, 0, 0, 0, 2);
+ m_lockNotationValues->setChecked(true);
+
+ connect(m_lockNotationValues, SIGNAL(released()),
+ SLOT(slotLockNotationChanged()));
+
+ m_notationTimeLabel = new QLabel(i18n("Notation time:"), frame);
+ layout->addWidget(m_notationTimeLabel, 1, 0);
+ m_notationTimeSpinBox = new QSpinBox(INT_MIN, INT_MAX, Note(Note::Shortest).getDuration(), frame);
+ m_notationTimeEditButton = new QPushButton("edit", frame);
+ layout->addWidget(m_notationTimeSpinBox, 1, 1);
+ layout->addWidget(m_notationTimeEditButton, 1, 2);
+
+ connect(m_notationTimeSpinBox, SIGNAL(valueChanged(int)),
+ SLOT(slotNotationAbsoluteTimeChanged(int)));
+ connect(m_notationTimeEditButton, SIGNAL(released()),
+ SLOT(slotEditNotationAbsoluteTime()));
+
+ m_notationDurationLabel = new QLabel(i18n("Notation duration:"), frame);
+ layout->addWidget(m_notationDurationLabel, 2, 0);
+ m_notationDurationSpinBox = new QSpinBox(0, INT_MAX, Note(Note::Shortest).getDuration(), frame);
+ m_notationDurationEditButton = new QPushButton("edit", frame);
+ layout->addWidget(m_notationDurationSpinBox, 2, 1);
+ layout->addWidget(m_notationDurationEditButton, 2, 2);
+
+ connect(m_notationDurationSpinBox, SIGNAL(valueChanged(int)),
+ SLOT(slotNotationDurationChanged(int)));
+ connect(m_notationDurationEditButton, SIGNAL(released()),
+ SLOT(slotEditNotationDuration()));
+
+ setupForEvent();
+}
+
+void
+SimpleEventEditDialog::setupForEvent()
+{
+ using BaseProperties::PITCH;
+ using BaseProperties::VELOCITY;
+
+ if (m_typeCombo) {
+ m_typeCombo->blockSignals(true);
+ }
+ m_timeSpinBox->blockSignals(true);
+ m_notationTimeSpinBox->blockSignals(true);
+ m_durationSpinBox->blockSignals(true);
+ m_notationDurationSpinBox->blockSignals(true);
+ m_pitchSpinBox->blockSignals(true);
+ m_velocitySpinBox->blockSignals(true);
+ m_metaEdit->blockSignals(true);
+
+ m_pitchSpinBox->setMinValue(MidiMinValue);
+ m_pitchSpinBox->setMaxValue(MidiMaxValue);
+
+ // Some common settings
+ //
+ m_durationLabel->setText(i18n("Absolute time:"));
+ m_timeLabel->show();
+ m_timeSpinBox->show();
+ m_timeEditButton->show();
+ m_timeSpinBox->setValue(m_event.getAbsoluteTime());
+
+ m_durationLabel->setText(i18n("Duration:"));
+ m_durationLabel->show();
+ m_durationSpinBox->show();
+ m_durationEditButton->show();
+ m_durationSpinBox->setValue(m_event.getDuration());
+
+ m_notationGroupBox->hide();
+ m_lockNotationValues->setChecked(true);
+
+ if (m_typeLabel)
+ m_typeLabel->setText(strtoqstr(m_event.getType()));
+
+ m_absoluteTime = m_event.getAbsoluteTime();
+ m_notationAbsoluteTime = m_event.getNotationAbsoluteTime();
+ m_duration = m_event.getDuration();
+ m_notationDuration = m_event.getNotationDuration();
+
+ m_sysexLoadButton->hide();
+ m_sysexSaveButton->hide();
+
+ if (m_type == Note::EventType) {
+ m_notationGroupBox->show();
+ m_notationTimeSpinBox->setValue(m_notationAbsoluteTime);
+ m_notationDurationSpinBox->setValue(m_notationDuration);
+
+ m_pitchLabel->show();
+ m_pitchLabel->setText(i18n("Note pitch:"));
+ m_pitchSpinBox->show();
+ m_pitchEditButton->show();
+
+ m_controllerLabel->hide();
+ m_controllerLabelValue->hide();
+
+ m_velocityLabel->show();
+ m_velocityLabel->setText(i18n("Note velocity:"));
+ m_velocitySpinBox->show();
+
+ m_metaLabel->hide();
+ m_metaEdit->hide();
+
+ try {
+ m_pitchSpinBox->setValue(m_event.get<Int>(PITCH));
+ } catch (Event::NoData) {
+ m_pitchSpinBox->setValue(60);
+ }
+
+ try {
+ m_velocitySpinBox->setValue(m_event.get<Int>(VELOCITY));
+ } catch (Event::NoData) {
+ m_velocitySpinBox->setValue(100);
+ }
+
+ if (m_typeCombo)
+ m_typeCombo->setCurrentItem(0);
+
+ } else if (m_type == Controller::EventType) {
+
+ m_durationLabel->hide();
+ m_durationSpinBox->hide();
+ m_durationEditButton->hide();
+
+ m_pitchLabel->show();
+ m_pitchLabel->setText(i18n("Controller number:"));
+ m_pitchSpinBox->show();
+ m_pitchEditButton->hide();
+
+ m_controllerLabel->show();
+ m_controllerLabelValue->show();
+ m_controllerLabel->setText(i18n("Controller name:"));
+
+ m_velocityLabel->show();
+ m_velocityLabel->setText(i18n("Controller value:"));
+ m_velocitySpinBox->show();
+
+ m_metaLabel->hide();
+ m_metaEdit->hide();
+
+ try {
+ m_pitchSpinBox->setValue(m_event.get<Int>
+ (Controller::NUMBER));
+ } catch (Event::NoData) {
+ m_pitchSpinBox->setValue(0);
+ }
+
+ try {
+ m_velocitySpinBox->setValue(m_event.get<Int>
+ (Controller::VALUE));
+ } catch (Event::NoData) {
+ m_velocitySpinBox->setValue(0);
+ }
+
+ if (m_typeCombo)
+ m_typeCombo->setCurrentItem(1);
+
+ } else if (m_type == KeyPressure::EventType) {
+
+ m_durationLabel->hide();
+ m_durationSpinBox->hide();
+ m_durationEditButton->hide();
+
+ m_pitchLabel->show();
+ m_pitchLabel->setText(i18n("Key pitch:"));
+ m_pitchSpinBox->show();
+ m_pitchEditButton->show();
+
+ m_controllerLabel->hide();
+ m_controllerLabelValue->hide();
+
+ m_velocityLabel->show();
+ m_velocityLabel->setText(i18n("Key pressure:"));
+ m_velocitySpinBox->show();
+
+ m_metaLabel->hide();
+ m_metaEdit->hide();
+
+ try {
+ m_pitchSpinBox->setValue(m_event.get<Int>
+ (KeyPressure::PITCH));
+ } catch (Event::NoData) {
+ m_pitchSpinBox->setValue(0);
+ }
+
+ try {
+ m_velocitySpinBox->setValue(m_event.get<Int>
+ (KeyPressure::PRESSURE));
+ } catch (Event::NoData) {
+ m_velocitySpinBox->setValue(0);
+ }
+
+ if (m_typeCombo)
+ m_typeCombo->setCurrentItem(2);
+
+ } else if (m_type == ChannelPressure::EventType) {
+
+ m_durationLabel->hide();
+ m_durationSpinBox->hide();
+ m_durationEditButton->hide();
+
+ m_pitchLabel->show();
+ m_pitchLabel->setText(i18n("Channel pressure:"));
+ m_pitchSpinBox->show();
+ m_pitchEditButton->hide();
+
+ m_controllerLabel->hide();
+ m_controllerLabelValue->hide();
+
+ m_velocityLabel->hide();
+ m_velocitySpinBox->hide();
+
+ m_metaLabel->hide();
+ m_metaEdit->hide();
+
+ try {
+ m_pitchSpinBox->setValue(m_event.get<Int>
+ (ChannelPressure::PRESSURE));
+ } catch (Event::NoData) {
+ m_pitchSpinBox->setValue(0);
+ }
+
+ if (m_typeCombo)
+ m_typeCombo->setCurrentItem(3);
+
+ } else if (m_type == ProgramChange::EventType) {
+
+ m_durationLabel->hide();
+ m_durationSpinBox->hide();
+ m_durationEditButton->hide();
+
+ m_pitchSpinBox->setMinValue(MidiMinValue + 1);
+ m_pitchSpinBox->setMaxValue(MidiMaxValue + 1);
+
+ m_pitchLabel->show();
+ m_pitchLabel->setText(i18n("Program change:"));
+ m_pitchSpinBox->show();
+ m_pitchEditButton->hide();
+
+ m_controllerLabel->hide();
+ m_controllerLabelValue->hide();
+
+ m_velocityLabel->hide();
+ m_velocitySpinBox->hide();
+
+ m_metaLabel->hide();
+ m_metaEdit->hide();
+
+ try {
+ m_pitchSpinBox->setValue(m_event.get<Int>
+ (ProgramChange::PROGRAM) + 1);
+ } catch (Event::NoData) {
+ m_pitchSpinBox->setValue(0);
+ }
+
+ if (m_typeCombo)
+ m_typeCombo->setCurrentItem(4);
+
+ } else if (m_type == SystemExclusive::EventType) {
+
+ m_durationLabel->hide();
+ m_durationSpinBox->hide();
+ m_durationEditButton->hide();
+
+ m_pitchLabel->hide();
+ m_pitchSpinBox->hide();
+ m_pitchEditButton->hide();
+
+ m_controllerLabel->show();
+ m_controllerLabelValue->show();
+
+ m_velocityLabel->hide();
+ m_velocitySpinBox->hide();
+
+ m_metaLabel->show();
+ m_metaEdit->show();
+
+ m_sysexLoadButton->show();
+ m_sysexSaveButton->show();
+
+ m_controllerLabel->setText(i18n("Data length:"));
+ m_metaLabel->setText(i18n("Data:"));
+ try {
+ SystemExclusive sysEx(m_event);
+ m_controllerLabelValue->setText(QString("%1").
+ arg(sysEx.getRawData().length()));
+ m_metaEdit->setText(strtoqstr(sysEx.getHexData()));
+ } catch (...) {
+ m_controllerLabelValue->setText("0");
+ }
+
+ if (m_typeCombo)
+ m_typeCombo->setCurrentItem(5);
+
+ } else if (m_type == PitchBend::EventType) {
+
+ m_durationLabel->hide();
+ m_durationSpinBox->hide();
+ m_durationEditButton->hide();
+
+ m_pitchLabel->show();
+ m_pitchLabel->setText(i18n("Pitchbend MSB:"));
+ m_pitchSpinBox->show();
+ m_pitchEditButton->hide();
+
+ m_controllerLabel->hide();
+ m_controllerLabelValue->hide();
+
+ m_velocityLabel->show();
+ m_velocityLabel->setText(i18n("Pitchbend LSB:"));
+ m_velocitySpinBox->show();
+
+ m_metaLabel->hide();
+ m_metaEdit->hide();
+
+ try {
+ m_pitchSpinBox->setValue(m_event.get<Int>
+ (PitchBend::MSB));
+ } catch (Event::NoData) {
+ m_pitchSpinBox->setValue(0);
+ }
+
+ try {
+ m_velocitySpinBox->setValue(m_event.get<Int>
+ (PitchBend::LSB));
+ } catch (Event::NoData) {
+ m_velocitySpinBox->setValue(0);
+ }
+
+ if (m_typeCombo)
+ m_typeCombo->setCurrentItem(6);
+
+ } else if (m_type == Indication::EventType) {
+
+ m_pitchLabel->hide();
+ m_pitchSpinBox->hide();
+ m_pitchEditButton->hide();
+
+ m_controllerLabel->hide();
+ m_controllerLabelValue->hide();
+
+ m_velocityLabel->hide();
+ m_velocitySpinBox->hide();
+
+ m_metaLabel->show();
+ m_metaEdit->show();
+ m_metaLabel->setText(i18n("Indication:"));
+
+ try {
+ Indication ind(m_event);
+ m_metaEdit->setText(strtoqstr(ind.getIndicationType()));
+ m_durationSpinBox->setValue(ind.getIndicationDuration());
+ } catch (...) {
+ m_metaEdit->setText(i18n("<none>"));
+ }
+
+ if (m_typeCombo)
+ m_typeCombo->setCurrentItem(7);
+
+ } else if (m_type == Text::EventType) {
+
+ m_durationLabel->hide();
+ m_durationSpinBox->hide();
+ m_durationEditButton->hide();
+
+ m_pitchLabel->hide();
+ m_pitchSpinBox->hide();
+ m_pitchEditButton->hide();
+
+ m_controllerLabel->show();
+ m_controllerLabelValue->show();
+
+ m_velocityLabel->hide();
+ m_velocitySpinBox->hide();
+
+ m_metaLabel->show();
+ m_metaEdit->show();
+
+ m_controllerLabel->setText(i18n("Text type:"));
+ m_metaLabel->setText(i18n("Text:"));
+
+ // get the text event
+ try {
+ Text text(m_event);
+ m_controllerLabelValue->setText(strtoqstr(text.getTextType()));
+ m_metaEdit->setText(strtoqstr(text.getText()));
+ } catch (...) {
+ m_controllerLabelValue->setText(i18n("<none>"));
+ m_metaEdit->setText(i18n("<none>"));
+ }
+
+ if (m_typeCombo)
+ m_typeCombo->setCurrentItem(8);
+
+ } else if (m_type == Note::EventRestType) {
+
+ m_pitchLabel->hide();
+ m_pitchSpinBox->hide();
+ m_pitchEditButton->hide();
+
+ m_controllerLabel->hide();
+ m_controllerLabelValue->hide();
+
+ m_velocityLabel->hide();
+ m_velocitySpinBox->hide();
+
+ m_metaLabel->hide();
+ m_metaEdit->hide();
+
+ if (m_typeCombo)
+ m_typeCombo->setCurrentItem(9);
+
+ } else if (m_type == Clef::EventType) {
+
+ m_durationLabel->hide();
+ m_durationSpinBox->hide();
+ m_durationEditButton->hide();
+
+ m_pitchLabel->hide();
+ m_pitchSpinBox->hide();
+ m_pitchEditButton->hide();
+
+ m_controllerLabel->show();
+ m_controllerLabelValue->show();
+
+ m_controllerLabel->setText(i18n("Clef type:"));
+
+ try {
+ Clef clef(m_event);
+ m_controllerLabelValue->setText(strtoqstr(clef.getClefType()));
+ } catch (...) {
+ m_controllerLabelValue->setText(i18n("<none>"));
+ }
+
+ m_velocityLabel->hide();
+ m_velocitySpinBox->hide();
+
+ m_metaLabel->hide();
+ m_metaEdit->hide();
+
+ if (m_typeCombo)
+ m_typeCombo->setCurrentItem(10);
+
+ } else if (m_type == ::Rosegarden::Key::EventType) {
+
+ m_durationLabel->hide();
+ m_durationSpinBox->hide();
+ m_durationEditButton->hide();
+
+ m_pitchLabel->hide();
+ m_pitchSpinBox->hide();
+ m_pitchEditButton->hide();
+
+ m_controllerLabel->show();
+ m_controllerLabelValue->show();
+
+ m_controllerLabel->setText(i18n("Key name:"));
+
+ try {
+ ::Rosegarden::Key key(m_event);
+ m_controllerLabelValue->setText(strtoqstr(key.getName()));
+ } catch (...) {
+ m_controllerLabelValue->setText(i18n("<none>"));
+ }
+
+ m_velocityLabel->hide();
+ m_velocitySpinBox->hide();
+
+ m_metaLabel->hide();
+ m_metaEdit->hide();
+
+ if (m_typeCombo)
+ m_typeCombo->setCurrentItem(11);
+
+ } else if (m_type == Guitar::Chord::EventType) {
+
+ m_durationLabel->hide();
+ m_durationSpinBox->hide();
+ m_durationEditButton->hide();
+
+ m_pitchLabel->hide();
+ m_pitchSpinBox->hide();
+ m_pitchEditButton->hide();
+
+ m_controllerLabel->hide();
+ m_controllerLabelValue->hide();
+
+ m_velocityLabel->hide();
+ m_velocitySpinBox->hide();
+
+ m_metaLabel->hide();
+ m_metaEdit->hide();
+
+ // m_controllerLabel->setText(i18n("Text type:"));
+ // m_metaLabel->setText(i18n("Chord:"));
+
+ // get the fingering event
+ try {
+ Guitar::Chord chord( m_event );
+ } catch (...) {
+ // m_controllerLabelValue->setText(i18n("<none>"));
+ // m_metaEdit->setText(i18n("<none>"));
+ }
+
+ if (m_typeCombo)
+ m_typeCombo->setCurrentItem(12);
+
+ } else {
+
+ m_durationLabel->setText(i18n("Unsupported event type:"));
+ m_durationLabel->show();
+ m_durationSpinBox->hide();
+ m_durationEditButton->hide();
+
+ m_pitchLabel->hide();
+ m_pitchSpinBox->hide();
+ m_pitchEditButton->hide();
+
+ m_controllerLabel->hide();
+ m_controllerLabelValue->show();
+ m_controllerLabelValue->setText(strtoqstr(m_type));
+
+ m_velocityLabel->hide();
+ m_velocitySpinBox->hide();
+
+ m_metaLabel->hide();
+ m_metaEdit->hide();
+
+ if (m_typeCombo)
+ m_typeCombo->setEnabled(false);
+ }
+
+ if (m_typeCombo)
+ m_typeCombo->blockSignals(false);
+ m_timeSpinBox->blockSignals(false);
+ m_notationTimeSpinBox->blockSignals(false);
+ m_durationSpinBox->blockSignals(false);
+ m_notationDurationSpinBox->blockSignals(false);
+ m_pitchSpinBox->blockSignals(false);
+ m_velocitySpinBox->blockSignals(false);
+ m_metaEdit->blockSignals(false);
+
+ slotLockNotationChanged();
+}
+
+Event
+SimpleEventEditDialog::getEvent()
+{
+ bool useSeparateNotationValues =
+ (m_event.getType() == Note::EventType);
+
+ if (m_typeCombo) {
+
+ int subordering = 0;
+ if (m_type == Indication::EventType) {
+ subordering = Indication::EventSubOrdering;
+ } else if (m_type == Clef::EventType) {
+ subordering = Clef::EventSubOrdering;
+ } else if (m_type == ::Rosegarden::Key::EventType) {
+ subordering = ::Rosegarden::Key::EventSubOrdering;
+ } else if (m_type == Text::EventType) {
+ subordering = Text::EventSubOrdering;
+ } else if (m_type == Note::EventRestType) {
+ subordering = Note::EventRestSubOrdering;
+ } else if (m_type == PitchBend::EventType) {
+ subordering = PitchBend::EventSubOrdering;
+ } else if (m_type == Controller::EventType) {
+ subordering = Controller::EventSubOrdering;
+ } else if (m_type == KeyPressure::EventType) {
+ subordering = KeyPressure::EventSubOrdering;
+ } else if (m_type == ChannelPressure::EventType) {
+ subordering = ChannelPressure::EventSubOrdering;
+ } else if (m_type == ProgramChange::EventType) {
+ subordering = ProgramChange::EventSubOrdering;
+ } else if (m_type == SystemExclusive::EventType) {
+ subordering = SystemExclusive::EventSubOrdering;
+ }
+
+ m_event = Event(m_type,
+ m_absoluteTime,
+ m_duration,
+ subordering,
+ (useSeparateNotationValues ?
+ m_notationAbsoluteTime : m_absoluteTime),
+ (useSeparateNotationValues ?
+ m_notationDuration : m_duration));
+
+ // ensure these are set on m_event correctly
+ slotPitchChanged(m_pitchSpinBox->value());
+ slotVelocityChanged(m_velocitySpinBox->value());
+ }
+
+ Event event(m_event,
+ m_absoluteTime,
+ m_duration,
+ m_event.getSubOrdering(),
+ (useSeparateNotationValues ?
+ m_notationAbsoluteTime : m_absoluteTime),
+ (useSeparateNotationValues ?
+ m_notationDuration : m_duration));
+
+ // Values from the pitch and velocity spin boxes should already
+ // have been set on m_event (and thus on event) by slotPitchChanged
+ // and slotVelocityChanged. Absolute time and duration were set in
+ // the event ctor above; that just leaves the meta values.
+
+ if (m_type == Indication::EventType) {
+
+ event.set<String>(Indication::IndicationTypePropertyName,
+ qstrtostr(m_metaEdit->text()));
+
+ } else if (m_type == Text::EventType) {
+
+ event.set<String>(Text::TextTypePropertyName,
+ qstrtostr(m_controllerLabelValue->text()));
+ event.set<String>(Text::TextPropertyName,
+ qstrtostr(m_metaEdit->text()));
+
+ } else if (m_type == Clef::EventType) {
+
+ event.set<String>(Clef::ClefPropertyName,
+ qstrtostr(m_controllerLabelValue->text()));
+
+ } else if (m_type == ::Rosegarden::Key::EventType) {
+
+ event.set<String>(::Rosegarden::Key::KeyPropertyName,
+ qstrtostr(m_controllerLabelValue->text()));
+
+ } else if (m_type == SystemExclusive::EventType) {
+
+ event.set<String>(SystemExclusive::DATABLOCK,
+ qstrtostr(m_metaEdit->text()));
+
+ }
+
+ return event;
+}
+
+void
+SimpleEventEditDialog::slotEventTypeChanged(int value)
+{
+ m_type = qstrtostr(m_typeCombo->text(value));
+ m_modified = true;
+
+ if (m_type != m_event.getType())
+ Event m_event(m_type, m_absoluteTime, m_duration);
+
+ setupForEvent();
+
+ // update whatever pitch and velocity correspond to
+ if (!m_pitchSpinBox->isHidden())
+ slotPitchChanged(m_pitchSpinBox->value());
+ if (!m_velocitySpinBox->isHidden())
+ slotVelocityChanged(m_velocitySpinBox->value());
+}
+
+void
+SimpleEventEditDialog::slotAbsoluteTimeChanged(int value)
+{
+ m_absoluteTime = value;
+
+ if (m_notationGroupBox->isHidden()) {
+ m_notationAbsoluteTime = value;
+ } else if (m_lockNotationValues->isChecked()) {
+ m_notationAbsoluteTime = value;
+ m_notationTimeSpinBox->setValue(value);
+ }
+
+ m_modified = true;
+}
+
+void
+SimpleEventEditDialog::slotNotationAbsoluteTimeChanged(int value)
+{
+ m_notationAbsoluteTime = value;
+ m_modified = true;
+}
+
+void
+SimpleEventEditDialog::slotDurationChanged(int value)
+{
+ m_duration = value;
+
+ if (m_notationGroupBox->isHidden()) {
+ m_notationDuration = value;
+ } else if (m_lockNotationValues->isChecked()) {
+ m_notationDuration = value;
+ m_notationDurationSpinBox->setValue(value);
+ }
+
+ m_modified = true;
+}
+
+void
+SimpleEventEditDialog::slotNotationDurationChanged(int value)
+{
+ m_notationDuration = value;
+ m_modified = true;
+}
+
+void
+SimpleEventEditDialog::slotPitchChanged(int value)
+{
+ m_modified = true;
+
+ if (m_type == Note::EventType) {
+ m_event.set<Int>(BaseProperties::PITCH, value);
+
+ } else if (m_type == Controller::EventType) {
+ m_event.set<Int>(Controller::NUMBER, value);
+
+ } else if (m_type == KeyPressure::EventType) {
+ m_event.set<Int>(KeyPressure::PITCH, value);
+
+ } else if (m_type == ChannelPressure::EventType) {
+ m_event.set<Int>(ChannelPressure::PRESSURE, value);
+
+ } else if (m_type == ProgramChange::EventType) {
+ if (value < 1)
+ value = 1;
+ m_event.set<Int>(ProgramChange::PROGRAM, value - 1);
+
+ } else if (m_type == PitchBend::EventType) {
+ m_event.set<Int>(PitchBend::MSB, value);
+ }
+ //!!!??? sysex?
+}
+
+void
+SimpleEventEditDialog::slotVelocityChanged(int value)
+{
+ m_modified = true;
+
+ if (m_type == Note::EventType) {
+ m_event.set<Int>(BaseProperties::VELOCITY, value);
+
+ } else if (m_type == Controller::EventType) {
+ m_event.set<Int>(Controller::VALUE, value);
+
+ } else if (m_type == KeyPressure::EventType) {
+ m_event.set<Int>(KeyPressure::PRESSURE, value);
+
+ } else if (m_type == PitchBend::EventType) {
+ m_event.set<Int>(PitchBend::LSB, value);
+ }
+}
+
+void
+SimpleEventEditDialog::slotMetaChanged(const QString &)
+{
+ m_modified = true;
+}
+
+void
+SimpleEventEditDialog::slotLockNotationChanged()
+{
+ bool enable = !m_lockNotationValues->isChecked();
+ m_notationTimeSpinBox->setEnabled(enable);
+ m_notationTimeEditButton->setEnabled(enable);
+ m_notationDurationSpinBox->setEnabled(enable);
+ m_notationDurationEditButton->setEnabled(enable);
+}
+
+void
+SimpleEventEditDialog::slotEditAbsoluteTime()
+{
+ TimeDialog dialog(this, i18n("Edit Event Time"),
+ &m_doc->getComposition(),
+ m_timeSpinBox->value(),
+ true);
+ if (dialog.exec() == QDialog::Accepted) {
+ m_timeSpinBox->setValue(dialog.getTime());
+ }
+}
+
+void
+SimpleEventEditDialog::slotEditNotationAbsoluteTime()
+{
+ TimeDialog dialog(this, i18n("Edit Event Notation Time"),
+ &m_doc->getComposition(),
+ m_notationTimeSpinBox->value(),
+ true);
+ if (dialog.exec() == QDialog::Accepted) {
+ m_notationTimeSpinBox->setValue(dialog.getTime());
+ }
+}
+
+void
+SimpleEventEditDialog::slotEditDuration()
+{
+ TimeDialog dialog(this, i18n("Edit Duration"),
+ &m_doc->getComposition(),
+ m_timeSpinBox->value(),
+ m_durationSpinBox->value(),
+ true);
+ if (dialog.exec() == QDialog::Accepted) {
+ m_durationSpinBox->setValue(dialog.getTime());
+ }
+}
+
+void
+SimpleEventEditDialog::slotEditNotationDuration()
+{
+ TimeDialog dialog(this, i18n("Edit Notation Duration"),
+ &m_doc->getComposition(),
+ m_notationTimeSpinBox->value(),
+ m_notationDurationSpinBox->value(),
+ true);
+ if (dialog.exec() == QDialog::Accepted) {
+ m_notationDurationSpinBox->setValue(dialog.getTime());
+ }
+}
+
+void
+SimpleEventEditDialog::slotEditPitch()
+{
+ PitchDialog dialog(this, i18n("Edit Pitch"), m_pitchSpinBox->value());
+ if (dialog.exec() == QDialog::Accepted) {
+ m_pitchSpinBox->setValue(dialog.getPitch());
+ }
+}
+
+void
+SimpleEventEditDialog::slotSysexLoad()
+{
+ QString path = KFileDialog::getOpenFileName(":SYSTEMEXCLUSIVE",
+ i18n("*.syx|System exclusive files (*.syx)"),
+ this, i18n("Load System Exclusive data in File"));
+ if (path.isNull())
+ return ;
+
+ QFile file(path);
+ file.open(IO_ReadOnly);
+ std::string s;
+ unsigned char c;
+ while (((c = (unsigned char)file.getch()) != 0xf0) && (file.status() == IO_Ok))
+ ;
+ while ( file.status() == IO_Ok ) {
+ s += c;
+ if (c == 0xf7 )
+ break;
+ c = (unsigned char)file.getch();
+ }
+ file.close();
+ m_metaEdit->setText(strtoqstr(SystemExclusive::toHex(s)));
+}
+
+void
+SimpleEventEditDialog::slotSysexSave()
+{
+ QString path = KFileDialog::getSaveFileName(":SYSTEMEXCLUSIVE",
+ i18n("*.syx|System exclusive files (*.syx)"),
+ this, i18n("Save System Exclusive data to..."));
+ if (path.isNull())
+ return ;
+
+ QFile file(path);
+ file.open(IO_WriteOnly);
+ SystemExclusive sysEx(m_event);
+ file.writeBlock(sysEx.getRawData().c_str(), sysEx.getRawData().length());
+ file.close();
+}
+
+}
+#include "SimpleEventEditDialog.moc"
diff --git a/src/gui/dialogs/SimpleEventEditDialog.h b/src/gui/dialogs/SimpleEventEditDialog.h
new file mode 100644
index 0000000..60b8441
--- /dev/null
+++ b/src/gui/dialogs/SimpleEventEditDialog.h
@@ -0,0 +1,134 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_SIMPLEEVENTEDITDIALOG_H_
+#define _RG_SIMPLEEVENTEDITDIALOG_H_
+
+#include "base/Event.h"
+#include <string>
+#include <kdialogbase.h>
+
+
+class QWidget;
+class QString;
+class QSpinBox;
+class QPushButton;
+class QLineEdit;
+class QLabel;
+class QGroupBox;
+class QCheckBox;
+class KComboBox;
+
+
+namespace Rosegarden
+{
+
+class RosegardenGUIDoc;
+
+
+class SimpleEventEditDialog : public KDialogBase
+{
+ Q_OBJECT
+public:
+ SimpleEventEditDialog(QWidget *parent,
+ RosegardenGUIDoc *doc,
+ const Event &event,
+ bool inserting = false); // inserting or editing
+
+ bool isModified() const { return m_modified; }
+ Event getEvent();
+
+ // Setup the dialog for a new event type
+ void setupForEvent();
+
+public slots:
+ void slotEventTypeChanged(int value);
+ void slotAbsoluteTimeChanged(int value);
+ void slotDurationChanged(int value);
+ void slotNotationAbsoluteTimeChanged(int value);
+ void slotNotationDurationChanged(int value);
+ void slotPitchChanged(int value);
+ void slotVelocityChanged(int value);
+ void slotMetaChanged(const QString &);
+ void slotEditAbsoluteTime();
+ void slotEditNotationAbsoluteTime();
+ void slotEditDuration();
+ void slotEditNotationDuration();
+ void slotLockNotationChanged();
+ void slotEditPitch();
+ void slotSysexLoad();
+ void slotSysexSave();
+
+protected:
+ Event m_event;
+ RosegardenGUIDoc *m_doc;
+
+ std::string m_type;
+ timeT m_absoluteTime;
+ timeT m_notationAbsoluteTime;
+ timeT m_duration;
+ timeT m_notationDuration;
+
+ KComboBox *m_typeCombo;
+ QLabel *m_typeLabel;
+
+ QLabel *m_timeLabel;
+ QLabel *m_durationLabel;
+ QLabel *m_pitchLabel;
+ QLabel *m_velocityLabel;
+ QLabel *m_metaLabel;
+ QLabel *m_controllerLabel;
+ QLabel *m_controllerLabelValue;
+
+ QSpinBox *m_timeSpinBox;
+ QSpinBox *m_durationSpinBox;
+ QSpinBox *m_pitchSpinBox;
+ QSpinBox *m_velocitySpinBox;
+
+ QPushButton *m_timeEditButton;
+ QPushButton *m_durationEditButton;
+ QPushButton *m_pitchEditButton;
+ QPushButton *m_sysexLoadButton;
+ QPushButton *m_sysexSaveButton;
+
+ QGroupBox *m_notationGroupBox;
+ QLabel *m_notationTimeLabel;
+ QLabel *m_notationDurationLabel;
+ QSpinBox *m_notationTimeSpinBox;
+ QSpinBox *m_notationDurationSpinBox;
+ QPushButton *m_notationTimeEditButton;
+ QPushButton *m_notationDurationEditButton;
+ QCheckBox *m_lockNotationValues;
+
+ QLineEdit *m_metaEdit;
+
+ bool m_modified;
+};
+
+
+
+}
+
+#endif
diff --git a/src/gui/dialogs/SplitByPitchDialog.cpp b/src/gui/dialogs/SplitByPitchDialog.cpp
new file mode 100644
index 0000000..9b3dffa
--- /dev/null
+++ b/src/gui/dialogs/SplitByPitchDialog.cpp
@@ -0,0 +1,111 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "SplitByPitchDialog.h"
+
+#include <klocale.h>
+#include "commands/segment/SegmentSplitByPitchCommand.h"
+#include "gui/general/ClefIndex.h"
+#include "gui/widgets/PitchChooser.h"
+#include <kcombobox.h>
+#include <kdialogbase.h>
+#include <qcheckbox.h>
+#include <qframe.h>
+#include <qlabel.h>
+#include <qvbox.h>
+#include <qwidget.h>
+#include <qlayout.h>
+
+
+namespace Rosegarden
+{
+
+SplitByPitchDialog::SplitByPitchDialog(QWidget *parent) :
+ KDialogBase(parent, 0, true, i18n("Split by Pitch"), Ok | Cancel)
+{
+ QVBox *vBox = makeVBoxMainWidget();
+
+ QFrame *frame = new QFrame(vBox);
+
+ QGridLayout *layout = new QGridLayout(frame, 4, 3, 10, 5);
+
+ m_pitch = new PitchChooser(i18n("Starting split pitch"), frame, 60);
+ layout->addMultiCellWidget(m_pitch, 0, 0, 0, 2, Qt::AlignHCenter);
+
+ m_range = new QCheckBox(i18n("Range up and down to follow music"), frame);
+ layout->addMultiCellWidget(m_range,
+ 1, 1, // fromRow, toRow
+ 0, 2 // fromCol, toCol
+ );
+
+ m_duplicate = new QCheckBox(i18n("Duplicate non-note events"), frame);
+ layout->addMultiCellWidget(m_duplicate, 2, 2, 0, 2);
+
+ layout->addWidget(new QLabel(i18n("Clef handling:"), frame), 3, 0);
+
+ m_clefs = new KComboBox(frame);
+ m_clefs->insertItem(i18n("Leave clefs alone"));
+ m_clefs->insertItem(i18n("Guess new clefs"));
+ m_clefs->insertItem(i18n("Use treble and bass clefs"));
+ layout->addMultiCellWidget(m_clefs, 3, 3, 1, 2);
+
+ m_range->setChecked(true);
+ m_duplicate->setChecked(true);
+ m_clefs->setCurrentItem(2);
+}
+
+int
+SplitByPitchDialog::getPitch()
+{
+ return m_pitch->getPitch();
+}
+
+bool
+SplitByPitchDialog::getShouldRange()
+{
+ return m_range->isChecked();
+}
+
+bool
+SplitByPitchDialog::getShouldDuplicateNonNoteEvents()
+{
+ return m_duplicate->isChecked();
+}
+
+int
+SplitByPitchDialog::getClefHandling()
+{
+ switch (m_clefs->currentItem()) {
+ case 0:
+ return (int)SegmentSplitByPitchCommand::LeaveClefs;
+ case 1:
+ return (int)SegmentSplitByPitchCommand::RecalculateClefs;
+ default:
+ return (int)SegmentSplitByPitchCommand::UseTrebleAndBassClefs;
+ }
+}
+
+}
+#include "SplitByPitchDialog.moc"
diff --git a/src/gui/dialogs/SplitByPitchDialog.h b/src/gui/dialogs/SplitByPitchDialog.h
new file mode 100644
index 0000000..40a6fb8
--- /dev/null
+++ b/src/gui/dialogs/SplitByPitchDialog.h
@@ -0,0 +1,67 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_SPLITBYPITCHDIALOG_H_
+#define _RG_SPLITBYPITCHDIALOG_H_
+
+#include <kdialogbase.h>
+
+
+class QWidget;
+class QCheckBox;
+class KComboBox;
+
+
+namespace Rosegarden
+{
+
+class PitchChooser;
+
+
+class SplitByPitchDialog : public KDialogBase
+{
+ Q_OBJECT
+public:
+ SplitByPitchDialog(QWidget *parent);
+
+ int getPitch();
+
+ bool getShouldRange();
+ bool getShouldDuplicateNonNoteEvents();
+ int getClefHandling(); // actually SegmentSplitByPitchCommand::ClefHandling
+
+private:
+ PitchChooser *m_pitch;
+
+ QCheckBox *m_range;
+ QCheckBox *m_duplicate;
+ KComboBox *m_clefs;
+};
+
+
+
+}
+
+#endif
diff --git a/src/gui/dialogs/SplitByRecordingSrcDialog.cpp b/src/gui/dialogs/SplitByRecordingSrcDialog.cpp
new file mode 100644
index 0000000..cc61bfa
--- /dev/null
+++ b/src/gui/dialogs/SplitByRecordingSrcDialog.cpp
@@ -0,0 +1,114 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "SplitByRecordingSrcDialog.h"
+#include <qlayout.h>
+
+#include <klocale.h>
+#include "misc/Strings.h"
+#include "base/MidiDevice.h"
+#include "document/RosegardenGUIDoc.h"
+#include <kcombobox.h>
+#include <kdialogbase.h>
+#include <qframe.h>
+#include <qgroupbox.h>
+#include <qlabel.h>
+#include <qsizepolicy.h>
+#include <qstring.h>
+#include <qvbox.h>
+#include <qwidget.h>
+
+
+namespace Rosegarden
+{
+
+SplitByRecordingSrcDialog::SplitByRecordingSrcDialog(QWidget *parent, RosegardenGUIDoc *doc) :
+ KDialogBase(parent, 0, true, i18n("Split by Recording Source"), Ok | Cancel )
+{
+ QVBox *vBox = makeVBoxMainWidget();
+
+ QGroupBox *groupBox = new QGroupBox
+ (1, Horizontal, i18n("Recording Source"), vBox);
+ QFrame *frame = new QFrame(groupBox);
+ QGridLayout *layout = new QGridLayout(frame, 2, 2, 10, 5);
+
+ layout->addWidget(new QLabel( i18n("Channel:"), frame ), 0, 0);
+ m_channel = new KComboBox( frame );
+ m_channel->setSizeLimit( 17 );
+ layout->addWidget(m_channel, 0, 1);
+ QSpacerItem *spacer = new QSpacerItem( 1, 1, QSizePolicy::Expanding, QSizePolicy::Minimum );
+ layout->addItem( spacer, 0, 2 );
+
+ m_channel->insertItem(i18n("any"));
+ for (int i = 1; i < 17; ++i) {
+ m_channel->insertItem(QString::number(i));
+ }
+
+ layout->addWidget(new QLabel( i18n("Device:"), frame ), 1, 0);
+ m_device = new KComboBox( frame );
+ layout->addMultiCellWidget( m_device, 1, 1, 1, 2 );
+
+ m_deviceIds.clear();
+ m_deviceIds.push_back( -1);
+ m_device->insertItem(i18n("any"));
+
+ DeviceList *devices = doc->getStudio().getDevices();
+ DeviceListConstIterator it;
+ for (it = devices->begin(); it != devices->end(); it++) {
+ MidiDevice *dev =
+ dynamic_cast<MidiDevice*>(*it);
+ if (dev && dev->getDirection() == MidiDevice::Record) {
+ QString label = QString::number(dev->getId());
+ label += ": ";
+ label += strtoqstr(dev->getName());
+ QString connection = strtoqstr(dev->getConnection());
+ label += " - ";
+ if (connection == "")
+ label += i18n("No connection");
+ else
+ label += connection;
+ m_device->insertItem(label);
+ m_deviceIds.push_back(dev->getId());
+ }
+ }
+
+ m_channel->setCurrentItem(0);
+ m_device->setCurrentItem(0);
+}
+
+int
+SplitByRecordingSrcDialog::getChannel()
+{
+ return m_channel->currentItem() - 1;
+}
+
+int
+SplitByRecordingSrcDialog::getDevice()
+{
+ return m_deviceIds[m_device->currentItem()];
+}
+
+}
+#include "SplitByRecordingSrcDialog.moc"
diff --git a/src/gui/dialogs/SplitByRecordingSrcDialog.h b/src/gui/dialogs/SplitByRecordingSrcDialog.h
new file mode 100644
index 0000000..af982a2
--- /dev/null
+++ b/src/gui/dialogs/SplitByRecordingSrcDialog.h
@@ -0,0 +1,62 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_SPLITBYRECORDINGSRCDIALOG_H_
+#define _RG_SPLITBYRECORDINGSRCDIALOG_H_
+
+#include <kdialogbase.h>
+#include <vector>
+#include "gui/application/RosegardenDCOP.h"
+
+
+class QWidget;
+class KComboBox;
+
+
+namespace Rosegarden
+{
+
+class RosegardenGUIDoc;
+
+
+class SplitByRecordingSrcDialog : public KDialogBase
+{
+ Q_OBJECT
+public:
+ SplitByRecordingSrcDialog(QWidget *parent, RosegardenGUIDoc *doc);
+
+ int getChannel();
+ int getDevice();
+
+private:
+ std::vector<int> m_deviceIds;
+ KComboBox *m_channel;
+ KComboBox *m_device;
+};
+
+
+}
+
+#endif
diff --git a/src/gui/dialogs/TempoDialog.cpp b/src/gui/dialogs/TempoDialog.cpp
new file mode 100644
index 0000000..3896fde
--- /dev/null
+++ b/src/gui/dialogs/TempoDialog.cpp
@@ -0,0 +1,475 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "TempoDialog.h"
+#include <qlayout.h>
+
+#include <klocale.h>
+#include "misc/Debug.h"
+#include "base/Composition.h"
+#include "base/NotationTypes.h"
+#include "base/RealTime.h"
+#include "document/RosegardenGUIDoc.h"
+#include "gui/editors/notation/NotePixmapFactory.h"
+#include "gui/widgets/TimeWidget.h"
+#include "gui/widgets/HSpinBox.h"
+#include <kdialogbase.h>
+#include <qbuttongroup.h>
+#include <qcheckbox.h>
+#include <qframe.h>
+#include <qgroupbox.h>
+#include <qhbox.h>
+#include <qlabel.h>
+#include <qradiobutton.h>
+#include <qstring.h>
+#include <qvbox.h>
+#include <qwidget.h>
+
+
+namespace Rosegarden
+{
+
+TempoDialog::TempoDialog(QWidget *parent, RosegardenGUIDoc *doc,
+ bool timeEditable):
+ KDialogBase(parent, 0, true, i18n("Insert Tempo Change"), Ok | Cancel | Help),
+ m_doc(doc),
+ m_tempoTime(0)
+{
+ setHelp("tempo");
+
+ QVBox *vbox = makeVBoxMainWidget();
+ QGroupBox *groupBox = new QGroupBox(1, Horizontal, i18n("Tempo"), vbox);
+
+ QFrame *frame = new QFrame(groupBox);
+ QGridLayout *layout = new QGridLayout(frame, 4, 3, 5, 5);
+
+ // Set tempo
+ layout->addWidget(new QLabel(i18n("New tempo:"), frame), 0, 1);
+ m_tempoValueSpinBox = new HSpinBox(frame, 0, 100000, 0.0, 1000.0, 5);
+ layout->addWidget(m_tempoValueSpinBox, 0, 2);
+
+ connect(m_tempoValueSpinBox, SIGNAL(valueChanged(const QString &)),
+ SLOT(slotTempoChanged(const QString &)));
+
+ m_tempoTap= new QPushButton(i18n("Tap"), frame);
+ layout->addWidget(m_tempoTap, 0, 3);
+ connect(m_tempoTap, SIGNAL(clicked()), SLOT(slotTapClicked()));
+
+
+ m_tempoConstant = new QRadioButton(i18n("Tempo is fixed until the following tempo change"), frame);
+ m_tempoRampToNext = new QRadioButton(i18n("Tempo ramps to the following tempo"), frame);
+ m_tempoRampToTarget = new QRadioButton(i18n("Tempo ramps to:"), frame);
+
+ // m_tempoTargetCheckBox = new QCheckBox(i18n("Ramping to:"), frame);
+ m_tempoTargetSpinBox = new HSpinBox(frame, 0, 100000, 0.0, 1000.0, 5);
+
+ // layout->addMultiCellWidget(m_tempoTargetCheckBox, 1, 1, 0, 1, AlignRight);
+ // layout->addWidget(m_tempoTargetSpinBox, 1, 2);
+
+ layout->addMultiCellWidget(m_tempoConstant, 1, 1, 1, 2);
+ layout->addMultiCellWidget(m_tempoRampToNext, 2, 2, 1, 2);
+ layout->addWidget(m_tempoRampToTarget, 3, 1);
+ layout->addWidget(m_tempoTargetSpinBox, 3, 2);
+
+ // connect(m_tempoTargetCheckBox, SIGNAL(clicked()),
+ // SLOT(slotTargetCheckBoxClicked()));
+ connect(m_tempoConstant, SIGNAL(clicked()),
+ SLOT(slotTempoConstantClicked()));
+ connect(m_tempoRampToNext, SIGNAL(clicked()),
+ SLOT(slotTempoRampToNextClicked()));
+ connect(m_tempoRampToTarget, SIGNAL(clicked()),
+ SLOT(slotTempoRampToTargetClicked()));
+ connect(m_tempoTargetSpinBox, SIGNAL(valueChanged(const QString &)),
+ SLOT(slotTargetChanged(const QString &)));
+
+ m_tempoBeatLabel = new QLabel(frame);
+ layout->addWidget(m_tempoBeatLabel, 0, 4);
+
+ m_tempoBeat = new QLabel(frame);
+ layout->addWidget(m_tempoBeat, 0, 5);
+
+ m_tempoBeatsPerMinute = new QLabel(frame);
+ layout->addWidget(m_tempoBeatsPerMinute, 0, 6);
+
+ m_timeEditor = 0;
+
+ if (timeEditable) {
+ m_timeEditor = new TimeWidget
+ (i18n("Time of tempo change"),
+ vbox, &m_doc->getComposition(), 0, true);
+ populateTempo();
+ return ;
+ }
+
+ // Scope Box
+ QButtonGroup *scopeGroup = new QButtonGroup(1, Horizontal,
+ i18n("Scope"), vbox);
+
+// new QLabel(scopeBox);
+
+ QVBox *scopeBox = new QVBox(scopeGroup);
+
+ scopeBox->setSpacing(5);
+ scopeBox->setMargin(5);
+
+ QHBox *currentBox = new QHBox(scopeBox);
+ new QLabel(i18n("The pointer is currently at "), currentBox);
+ m_tempoTimeLabel = new QLabel(currentBox);
+ m_tempoBarLabel = new QLabel(currentBox);
+ QLabel *spare = new QLabel(currentBox);
+ currentBox->setStretchFactor(spare, 20);
+
+ m_tempoStatusLabel = new QLabel(scopeBox);
+
+// new QLabel(scopeBox);
+
+ QHBox *changeWhereBox = new QHBox(scopeBox);
+ spare = new QLabel(" ", changeWhereBox);
+ QVBox *changeWhereVBox = new QVBox(changeWhereBox);
+ changeWhereBox->setStretchFactor(changeWhereVBox, 20);
+
+ m_tempoChangeHere = new QRadioButton
+ (i18n("Apply this tempo from here onwards"),
+ changeWhereVBox);
+
+ m_tempoChangeBefore = new QRadioButton
+ (i18n("Replace the last tempo change"),
+ changeWhereVBox);
+ m_tempoChangeBeforeAt = new QLabel(changeWhereVBox);
+ m_tempoChangeBeforeAt->hide();
+
+ m_tempoChangeStartOfBar = new QRadioButton
+ (i18n("Apply this tempo from the start of this bar"), changeWhereVBox);
+
+ m_tempoChangeGlobal = new QRadioButton
+ (i18n("Apply this tempo to the whole composition"), changeWhereVBox);
+
+ QHBox *optionHBox = new QHBox(changeWhereVBox);
+ new QLabel(" ", optionHBox);
+ m_defaultBox = new QCheckBox
+ (i18n("Also make this the default tempo"), optionHBox);
+ spare = new QLabel(optionHBox);
+ optionHBox->setStretchFactor(spare, 20);
+
+// new QLabel(scopeBox);
+
+ connect(m_tempoChangeHere, SIGNAL(clicked()),
+ SLOT(slotActionChanged()));
+ connect(m_tempoChangeBefore, SIGNAL(clicked()),
+ SLOT(slotActionChanged()));
+ connect(m_tempoChangeStartOfBar, SIGNAL(clicked()),
+ SLOT(slotActionChanged()));
+ connect(m_tempoChangeGlobal, SIGNAL(clicked()),
+ SLOT(slotActionChanged()));
+
+ m_tempoChangeHere->setChecked(true);
+
+ // disable initially
+ m_defaultBox->setEnabled(false);
+
+ populateTempo();
+}
+
+TempoDialog::~TempoDialog()
+{}
+
+void
+TempoDialog::setTempoPosition(timeT time)
+{
+ m_tempoTime = time;
+ populateTempo();
+}
+
+void
+TempoDialog::populateTempo()
+{
+ Composition &comp = m_doc->getComposition();
+ tempoT tempo = comp.getTempoAtTime(m_tempoTime);
+ std::pair<bool, tempoT> ramping(false, tempo);
+
+ int tempoChangeNo = comp.getTempoChangeNumberAt(m_tempoTime);
+ if (tempoChangeNo >= 0) {
+ tempo = comp.getTempoChange(tempoChangeNo).second;
+ ramping = comp.getTempoRamping(tempoChangeNo, false);
+ }
+
+ m_tempoValueSpinBox->setValue(tempo);
+
+ if (ramping.first) {
+ if (ramping.second) {
+ m_tempoTargetSpinBox->setEnabled(true);
+ m_tempoTargetSpinBox->setValue(ramping.second);
+ m_tempoConstant->setChecked(false);
+ m_tempoRampToNext->setChecked(false);
+ m_tempoRampToTarget->setChecked(true);
+ } else {
+ ramping = comp.getTempoRamping(tempoChangeNo, true);
+ m_tempoTargetSpinBox->setEnabled(false);
+ m_tempoTargetSpinBox->setValue(ramping.second);
+ m_tempoConstant->setChecked(false);
+ m_tempoRampToNext->setChecked(true);
+ m_tempoRampToTarget->setChecked(false);
+ }
+ } else {
+ m_tempoTargetSpinBox->setEnabled(false);
+ m_tempoTargetSpinBox->setValue(tempo);
+ m_tempoConstant->setChecked(true);
+ m_tempoRampToNext->setChecked(false);
+ m_tempoRampToTarget->setChecked(false);
+ }
+
+ // m_tempoTargetCheckBox->setChecked(ramping.first);
+ m_tempoTargetSpinBox->setEnabled(ramping.first);
+
+ updateBeatLabels(comp.getTempoQpm(tempo));
+
+ if (m_timeEditor) {
+ m_timeEditor->slotSetTime(m_tempoTime);
+ return ;
+ }
+
+ RealTime tempoTime = comp.getElapsedRealTime(m_tempoTime);
+ QString milliSeconds;
+ milliSeconds.sprintf("%03d", tempoTime.msec());
+ m_tempoTimeLabel->setText(i18n("%1.%2 s,").arg(tempoTime.sec)
+ .arg(milliSeconds));
+
+ int barNo = comp.getBarNumber(m_tempoTime);
+ if (comp.getBarStart(barNo) == m_tempoTime) {
+ m_tempoBarLabel->setText
+ (i18n("at the start of measure %1.").arg(barNo + 1));
+ m_tempoChangeStartOfBar->setEnabled(false);
+ } else {
+ m_tempoBarLabel->setText(
+ i18n("in the middle of measure %1.").arg(barNo + 1));
+ m_tempoChangeStartOfBar->setEnabled(true);
+ }
+
+ m_tempoChangeBefore->setEnabled(false);
+ m_tempoChangeBeforeAt->setEnabled(false);
+
+ bool havePrecedingTempo = false;
+
+ if (tempoChangeNo >= 0) {
+
+ timeT lastTempoTime = comp.getTempoChange(tempoChangeNo).first;
+ if (lastTempoTime < m_tempoTime) {
+
+ RealTime lastRT = comp.getElapsedRealTime(lastTempoTime);
+ QString lastms;
+ lastms.sprintf("%03d", lastRT.msec());
+ int lastBar = comp.getBarNumber(lastTempoTime);
+ m_tempoChangeBeforeAt->setText
+ (i18n(" (at %1.%2 s, in measure %3)").arg(lastRT.sec)
+ .arg(lastms).arg(lastBar + 1));
+ m_tempoChangeBeforeAt->show();
+
+ m_tempoChangeBefore->setEnabled(true);
+ m_tempoChangeBeforeAt->setEnabled(true);
+
+ havePrecedingTempo = true;
+ }
+ }
+
+ if (comp.getTempoChangeCount() > 0) {
+
+ if (havePrecedingTempo) {
+ m_tempoStatusLabel->hide();
+ } else {
+ m_tempoStatusLabel->setText
+ (i18n("There are no preceding tempo changes."));
+ }
+
+ m_tempoChangeGlobal->setEnabled(true);
+
+ } else {
+
+ m_tempoStatusLabel->setText
+ (i18n("There are no other tempo changes."));
+
+ m_tempoChangeGlobal->setEnabled(false);
+ }
+
+ m_defaultBox->setEnabled(false);
+}
+
+void
+TempoDialog::updateBeatLabels(double qpm)
+{
+ Composition &comp = m_doc->getComposition();
+
+ // If the time signature's beat is not a crotchet, need to show
+ // bpm separately
+
+ timeT beat = comp.getTimeSignatureAt(m_tempoTime).getBeatDuration();
+ if (beat == Note(Note::Crotchet).getDuration()) {
+ m_tempoBeatLabel->setText(i18n(" bpm"));
+ m_tempoBeatLabel->show();
+ m_tempoBeat->hide();
+ m_tempoBeatsPerMinute->hide();
+ } else {
+ // m_tempoBeatLabel->setText(" (");
+ m_tempoBeatLabel->setText(" ");
+
+ timeT error = 0;
+ m_tempoBeat->setPixmap(NotePixmapFactory::toQPixmap
+ (NotePixmapFactory::makeNoteMenuPixmap(beat, error)));
+ m_tempoBeat->setMaximumWidth(25);
+ if (error)
+ m_tempoBeat->setPixmap(NotePixmapFactory::toQPixmap
+ (NotePixmapFactory::makeToolbarPixmap
+ ("menu-no-note")));
+
+ m_tempoBeatsPerMinute->setText
+ // (QString("= %1 )").arg
+ (QString("= %1 ").arg
+ (int(qpm * Note(Note::Crotchet).getDuration() / beat)));
+ m_tempoBeatLabel->show();
+ m_tempoBeat->show();
+ m_tempoBeatsPerMinute->show();
+ }
+}
+
+void
+TempoDialog::slotTempoChanged(const QString &)
+{
+ updateBeatLabels(double(m_tempoValueSpinBox->valuef()));
+}
+
+void
+TempoDialog::slotTargetChanged(const QString &)
+{
+ //...
+}
+
+void
+TempoDialog::slotTempoConstantClicked()
+{
+ m_tempoRampToNext->setChecked(false);
+ m_tempoRampToTarget->setChecked(false);
+ m_tempoTargetSpinBox->setEnabled(false);
+}
+
+void
+TempoDialog::slotTempoRampToNextClicked()
+{
+ m_tempoConstant->setChecked(false);
+ m_tempoRampToTarget->setChecked(false);
+ m_tempoTargetSpinBox->setEnabled(false);
+}
+
+void
+TempoDialog::slotTempoRampToTargetClicked()
+{
+ m_tempoConstant->setChecked(false);
+ m_tempoRampToNext->setChecked(false);
+ m_tempoTargetSpinBox->setEnabled(true);
+}
+
+void
+TempoDialog::slotActionChanged()
+{
+ m_defaultBox->setEnabled(m_tempoChangeGlobal->isChecked());
+}
+
+void
+TempoDialog::slotOk()
+{
+ tempoT tempo = m_tempoValueSpinBox->value();
+ RG_DEBUG << "Tempo is " << tempo << endl;
+
+ tempoT target = -1;
+ if (m_tempoRampToNext->isChecked()) {
+ target = 0;
+ } else if (m_tempoRampToTarget->isChecked()) {
+ target = m_tempoTargetSpinBox->value();
+ }
+
+ RG_DEBUG << "Target is " << target << endl;
+
+ if (m_timeEditor) {
+
+ emit changeTempo(m_timeEditor->getTime(),
+ tempo,
+ target,
+ AddTempo);
+
+ } else {
+
+ TempoDialogAction action = AddTempo;
+
+ if (m_tempoChangeBefore->isChecked()) {
+ action = ReplaceTempo;
+ } else if (m_tempoChangeStartOfBar->isChecked()) {
+ action = AddTempoAtBarStart;
+ } else if (m_tempoChangeGlobal->isChecked()) {
+ action = GlobalTempo;
+ if (m_defaultBox->isChecked()) {
+ action = GlobalTempoWithDefault;
+ }
+ }
+
+ emit changeTempo(m_tempoTime,
+ tempo,
+ target,
+ action);
+ }
+
+ KDialogBase::slotOk();
+}
+
+void
+TempoDialog::slotTapClicked()
+{
+ QTime now = QTime::currentTime();
+
+ if (m_tapMinusOne != QTime()) {
+
+ int ms1 = m_tapMinusOne.msecsTo(now);
+
+ if (ms1 < 10000) {
+
+ int msec = ms1;
+
+ if (m_tapMinusTwo != QTime()) {
+ int ms2 = m_tapMinusTwo.msecsTo(m_tapMinusOne);
+ if (ms2 < 10000) {
+ msec = (ms1 + ms2) / 2;
+ }
+ }
+
+ int bpm = 60000 / msec;
+ m_tempoValueSpinBox->setValue(bpm * 100000);
+ }
+ }
+
+ m_tapMinusTwo = m_tapMinusOne;
+ m_tapMinusOne = now;
+}
+
+
+}
+
+#include "TempoDialog.moc"
diff --git a/src/gui/dialogs/TempoDialog.h b/src/gui/dialogs/TempoDialog.h
new file mode 100644
index 0000000..dd3edf1
--- /dev/null
+++ b/src/gui/dialogs/TempoDialog.h
@@ -0,0 +1,128 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_TEMPODIALOG_H_
+#define _RG_TEMPODIALOG_H_
+
+#include <kdialogbase.h>
+#include "base/Event.h"
+#include "base/Composition.h"
+#include <qpushbutton.h>
+#include <qdatetime.h>
+
+
+class QWidget;
+class QString;
+class QRadioButton;
+class QLabel;
+class QCheckBox;
+
+
+namespace Rosegarden
+{
+
+class TimeWidget;
+class RosegardenGUIDoc;
+class HSpinBox;
+
+
+class TempoDialog : public KDialogBase
+{
+ Q_OBJECT
+public:
+ enum TempoDialogAction {
+ AddTempo,
+ ReplaceTempo,
+ AddTempoAtBarStart,
+ GlobalTempo,
+ GlobalTempoWithDefault
+ };
+
+ TempoDialog(QWidget *parent, RosegardenGUIDoc *doc,
+ bool timeEditable = false);
+ ~TempoDialog();
+
+ // Set the position at which we're checking the tempo
+ //
+ void setTempoPosition(timeT time);
+
+public slots:
+ virtual void slotOk();
+ void slotActionChanged();
+ void slotTempoChanged(const QString &);
+ void slotTempoConstantClicked();
+ void slotTempoRampToNextClicked();
+ void slotTempoRampToTargetClicked();
+ void slotTargetChanged(const QString &);
+ void slotTapClicked();
+
+signals:
+ // Return results in this signal
+ //
+ void changeTempo(timeT, // tempo change time
+ tempoT, // tempo value
+ tempoT, // target tempo value
+ TempoDialog::TempoDialogAction); // tempo action
+
+protected:
+ void populateTempo();
+ void updateBeatLabels(double newTempo);
+
+ //--------------- Data members ---------------------------------
+
+ RosegardenGUIDoc *m_doc;
+ timeT m_tempoTime;
+ HSpinBox *m_tempoValueSpinBox;
+ QPushButton *m_tempoTap;
+ QTime m_tapMinusTwo;
+ QTime m_tapMinusOne;
+
+ QRadioButton *m_tempoConstant;
+ QRadioButton *m_tempoRampToNext;
+ QRadioButton *m_tempoRampToTarget;
+ HSpinBox *m_tempoTargetSpinBox;
+
+ QLabel *m_tempoBeatLabel;
+ QLabel *m_tempoBeat;
+ QLabel *m_tempoBeatsPerMinute;
+
+ TimeWidget *m_timeEditor;
+
+ QLabel *m_tempoTimeLabel;
+ QLabel *m_tempoBarLabel;
+ QLabel *m_tempoStatusLabel;
+
+ QRadioButton *m_tempoChangeHere;
+ QRadioButton *m_tempoChangeBefore;
+ QLabel *m_tempoChangeBeforeAt;
+ QRadioButton *m_tempoChangeStartOfBar;
+ QRadioButton *m_tempoChangeGlobal;
+ QCheckBox *m_defaultBox;
+};
+
+
+}
+
+#endif
diff --git a/src/gui/dialogs/TextEventDialog.cpp b/src/gui/dialogs/TextEventDialog.cpp
new file mode 100644
index 0000000..156b5d1
--- /dev/null
+++ b/src/gui/dialogs/TextEventDialog.cpp
@@ -0,0 +1,593 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "TextEventDialog.h"
+#include <kapplication.h>
+
+#include <klocale.h>
+#include "misc/Strings.h"
+#include "document/ConfigGroups.h"
+#include "base/NotationTypes.h"
+#include "gui/editors/notation/NotePixmapFactory.h"
+#include <kcombobox.h>
+#include <kconfig.h>
+#include <kdialogbase.h>
+#include <qbitmap.h>
+#include <qgrid.h>
+#include <qgroupbox.h>
+#include <qlabel.h>
+#include <qlineedit.h>
+#include <qobject.h>
+#include <qpainter.h>
+#include <qpixmap.h>
+#include <qstring.h>
+#include <qvbox.h>
+#include <qwidget.h>
+#include <qspinbox.h>
+
+namespace Rosegarden
+{
+
+TextEventDialog::TextEventDialog(QWidget *parent,
+ NotePixmapFactory *npf,
+ Text defaultText,
+ int maxLength) :
+ KDialogBase(parent, 0, true, i18n("Text"), Ok | Cancel | Help),
+ m_notePixmapFactory(npf),
+ m_styles(Text::getUserStyles()) /*,
+ //m_directives(Text::getLilyPondDirectives()) */
+{
+ setHelp("nv-text");
+ QVBox *vbox = makeVBoxMainWidget();
+
+ QGroupBox *entryBox = new QGroupBox
+ (1, Horizontal, i18n("Specification"), vbox);
+ QGroupBox *exampleBox = new QGroupBox
+ (1, Horizontal, i18n("Preview"), vbox);
+
+ QGrid *entryGrid = new QGrid(2, QGrid::Horizontal, entryBox);
+
+ new QLabel(i18n("Text: "), entryGrid);
+ m_text = new QLineEdit(entryGrid);
+ m_text->setText(strtoqstr(defaultText.getText()));
+ if (maxLength > 0)
+ m_text->setMaxLength(maxLength);
+
+ // style combo
+ new QLabel(i18n("Style: "), entryGrid);
+ m_typeCombo = new KComboBox(entryGrid);
+
+ for (unsigned int i = 0; i < m_styles.size(); ++i)
+ {
+
+ std::string style = m_styles[i];
+
+ // if the style is in this list, we can i18n it (kludgy):
+
+ if (style == Text::Dynamic) { // index //
+ m_typeCombo->insertItem(i18n("Dynamic")); // 0
+
+ } else if (style == Text::Direction) {
+ m_typeCombo->insertItem(i18n("Direction")); // 1
+
+ } else if (style == Text::LocalDirection) {
+ m_typeCombo->insertItem(i18n("Local Direction")); // 2
+
+ } else if (style == Text::Tempo) {
+ m_typeCombo->insertItem(i18n("Tempo")); // 3
+
+ } else if (style == Text::LocalTempo) {
+ m_typeCombo->insertItem(i18n("Local Tempo")); // 4
+
+ } else if (style == Text::Lyric) {
+ m_typeCombo->insertItem(i18n("Lyric")); // 5
+
+ } else if (style == Text::Chord) {
+ m_typeCombo->insertItem(i18n("Chord")); // 6
+
+ } else if (style == Text::Annotation) {
+ m_typeCombo->insertItem(i18n("Annotation")); // 7
+
+ } else if (style == Text::LilyPondDirective) {
+ m_typeCombo->insertItem(i18n("LilyPond Directive")); // 8
+
+ } else {
+ // not i18n()-able
+
+ std::string styleName;
+ styleName += (char)toupper(style[0]);
+ styleName += style.substr(1);
+
+ int uindex = styleName.find('_');
+ if (uindex > 0) {
+ styleName =
+ styleName.substr(0, uindex) + " " +
+ styleName.substr(uindex + 1);
+ }
+
+ m_typeCombo->insertItem(strtoqstr(styleName));
+ }
+
+ if (style == defaultText.getTextType()) {
+ m_typeCombo->setCurrentItem(m_typeCombo->count() - 1);
+ }
+ }
+
+ m_verseLabel = new QLabel(i18n("Verse: "), entryGrid);
+ m_verseLabel->hide();
+ m_verseSpin = new QSpinBox(entryGrid);
+ m_verseSpin->setMinValue(1);
+ m_verseSpin->setMaxValue(12);
+ m_verseSpin->setLineStep(1);
+ m_verseSpin->setValue(defaultText.getVerse() + 1);
+ m_verseSpin->hide();
+
+ // dynamic shortcuts combo
+ m_dynamicShortcutLabel = new QLabel(i18n("Dynamic: "), entryGrid);
+ m_dynamicShortcutLabel->hide();
+
+ m_dynamicShortcutCombo = new KComboBox(entryGrid);
+ m_dynamicShortcutCombo->insertItem(i18n("ppp"));
+ m_dynamicShortcutCombo->insertItem(i18n("pp"));
+ m_dynamicShortcutCombo->insertItem(i18n("p"));
+ m_dynamicShortcutCombo->insertItem(i18n("mp"));
+ m_dynamicShortcutCombo->insertItem(i18n("mf"));
+ m_dynamicShortcutCombo->insertItem(i18n("f"));
+ m_dynamicShortcutCombo->insertItem(i18n("ff"));
+ m_dynamicShortcutCombo->insertItem(i18n("fff"));
+ m_dynamicShortcutCombo->insertItem(i18n("rfz"));
+ m_dynamicShortcutCombo->insertItem(i18n("sf"));
+ m_dynamicShortcutCombo->hide();
+
+ // direction shortcuts combo
+ m_directionShortcutLabel = new QLabel(i18n("Direction: "), entryGrid);
+ m_directionShortcutLabel->hide();
+
+ m_directionShortcutCombo = new KComboBox(entryGrid);
+ // note, the " ," is a breath mark; the extra spaces are a cheap hack to
+ // try to improve the probability of Rosegarden drawing the blasted thing
+ // where it's supposed to go, without the need to micro-diddle each and
+ // every bliffin' one. (Micro-diddling is not exportable to LilyPond
+ // either, is it? I rather doubt it.)
+ m_directionShortcutCombo->insertItem(i18n(" ,"));
+ m_directionShortcutCombo->insertItem(i18n("D.C. al Fine"));
+ m_directionShortcutCombo->insertItem(i18n("D.S. al Fine"));
+ m_directionShortcutCombo->insertItem(i18n("Fine"));
+ m_directionShortcutCombo->insertItem(i18n("D.S. al Coda"));
+ m_directionShortcutCombo->insertItem(i18n("to Coda"));
+ m_directionShortcutCombo->insertItem(i18n("Coda"));
+ m_directionShortcutCombo->hide();
+
+ // local direction shortcuts combo
+ m_localDirectionShortcutLabel = new QLabel(i18n("Local Direction: "), entryGrid);
+ m_localDirectionShortcutLabel->hide();
+
+ m_localDirectionShortcutCombo = new KComboBox(entryGrid);
+ m_localDirectionShortcutCombo->insertItem(i18n("accel."));
+ m_localDirectionShortcutCombo->insertItem(i18n("ritard."));
+ m_localDirectionShortcutCombo->insertItem(i18n("ralletando"));
+ m_localDirectionShortcutCombo->insertItem(i18n("a tempo"));
+ m_localDirectionShortcutCombo->insertItem(i18n("legato"));
+ m_localDirectionShortcutCombo->insertItem(i18n("simile"));
+ m_localDirectionShortcutCombo->insertItem(i18n("pizz."));
+ m_localDirectionShortcutCombo->insertItem(i18n("arco"));
+ m_localDirectionShortcutCombo->insertItem(i18n("non vib."));
+ m_localDirectionShortcutCombo->insertItem(i18n("sul pont."));
+ m_localDirectionShortcutCombo->insertItem(i18n("sul tasto"));
+ m_localDirectionShortcutCombo->insertItem(i18n("con legno"));
+ m_localDirectionShortcutCombo->insertItem(i18n("sul tasto"));
+ m_localDirectionShortcutCombo->insertItem(i18n("sul G"));
+ m_localDirectionShortcutCombo->insertItem(i18n("ordinario"));
+ m_localDirectionShortcutCombo->insertItem(i18n("Muta in "));
+ m_localDirectionShortcutCombo->insertItem(i18n("volti subito "));
+ m_localDirectionShortcutCombo->insertItem(i18n("soli"));
+ m_localDirectionShortcutCombo->insertItem(i18n("div."));
+ m_localDirectionShortcutCombo->hide();
+
+ // tempo shortcuts combo
+ m_tempoShortcutLabel = new QLabel(i18n("Tempo: "), entryGrid);
+ m_tempoShortcutLabel->hide();
+
+ m_tempoShortcutCombo = new KComboBox(entryGrid);
+ m_tempoShortcutCombo->insertItem(i18n("Grave"));
+ m_tempoShortcutCombo->insertItem(i18n("Adagio"));
+ m_tempoShortcutCombo->insertItem(i18n("Largo"));
+ m_tempoShortcutCombo->insertItem(i18n("Lento"));
+ m_tempoShortcutCombo->insertItem(i18n("Andante"));
+ m_tempoShortcutCombo->insertItem(i18n("Moderato"));
+ m_tempoShortcutCombo->insertItem(i18n("Allegretto"));
+ m_tempoShortcutCombo->insertItem(i18n("Allegro"));
+ m_tempoShortcutCombo->insertItem(i18n("Vivace"));
+ m_tempoShortcutCombo->insertItem(i18n("Presto"));
+ m_tempoShortcutCombo->insertItem(i18n("Prestissimo"));
+ m_tempoShortcutCombo->insertItem(i18n("Maestoso"));
+ m_tempoShortcutCombo->insertItem(i18n("Sostenuto"));
+ m_tempoShortcutCombo->insertItem(i18n("Tempo Primo"));
+ m_tempoShortcutCombo->hide();
+
+ // local tempo shortcuts combo (duplicates the non-local version, because
+ // nobody is actually sure what is supposed to distinguish Tempo from
+ // Local Tempo, or what this text style is supposed to be good for in the
+ // way of standard notation)
+ m_localTempoShortcutLabel = new QLabel(i18n("Local Tempo: "), entryGrid);
+ m_localTempoShortcutLabel->hide();
+
+ m_localTempoShortcutCombo = new KComboBox(entryGrid);
+ m_localTempoShortcutCombo->insertItem(i18n("Grave"));
+ m_localTempoShortcutCombo->insertItem(i18n("Adagio"));
+ m_localTempoShortcutCombo->insertItem(i18n("Largo"));
+ m_localTempoShortcutCombo->insertItem(i18n("Lento"));
+ m_localTempoShortcutCombo->insertItem(i18n("Andante"));
+ m_localTempoShortcutCombo->insertItem(i18n("Moderato"));
+ m_localTempoShortcutCombo->insertItem(i18n("Allegretto"));
+ m_localTempoShortcutCombo->insertItem(i18n("Allegro"));
+ m_localTempoShortcutCombo->insertItem(i18n("Vivace"));
+ m_localTempoShortcutCombo->insertItem(i18n("Presto"));
+ m_localTempoShortcutCombo->insertItem(i18n("Prestissimo"));
+ m_localTempoShortcutCombo->insertItem(i18n("Maestoso"));
+ m_localTempoShortcutCombo->insertItem(i18n("Sostenuto"));
+ m_localTempoShortcutCombo->insertItem(i18n("Tempo Primo"));
+ m_localTempoShortcutCombo->hide();
+
+ // LilyPond directive combo
+ m_directiveLabel = new QLabel(i18n("Directive: "), entryGrid);
+ m_directiveLabel->hide();
+
+ m_lilyPondDirectiveCombo = new KComboBox(entryGrid);
+ m_lilyPondDirectiveCombo->hide();
+
+ // not i18nable, because the directive exporter currently depends on the
+ // textual contents of these strings, not some more abstract associated
+ // type label
+ m_lilyPondDirectiveCombo->insertItem(Text::Segno);
+ m_lilyPondDirectiveCombo->insertItem(Text::Coda);
+ m_lilyPondDirectiveCombo->insertItem(Text::Alternate1);
+ m_lilyPondDirectiveCombo->insertItem(Text::Alternate2);
+ m_lilyPondDirectiveCombo->insertItem(Text::BarDouble);
+ m_lilyPondDirectiveCombo->insertItem(Text::BarEnd);
+ m_lilyPondDirectiveCombo->insertItem(Text::BarDot);
+ m_lilyPondDirectiveCombo->insertItem(Text::Gliss);
+ m_lilyPondDirectiveCombo->insertItem(Text::Arpeggio);
+ // m_lilyPondDirectiveCombo->insertItem(Text::ArpeggioUp);
+ // m_lilyPondDirectiveCombo->insertItem(Text::ArpeggioDn);
+ m_lilyPondDirectiveCombo->insertItem(Text::Tiny);
+ m_lilyPondDirectiveCombo->insertItem(Text::Small);
+ m_lilyPondDirectiveCombo->insertItem(Text::NormalSize);
+
+ QVBox *exampleVBox = new QVBox(exampleBox);
+
+ int ls = m_notePixmapFactory->getLineSpacing();
+
+ int mapWidth = 200;
+ QPixmap map(mapWidth, ls * 5 + 1);
+ QBitmap mask(mapWidth, ls * 5 + 1);
+
+ map.fill();
+ mask.fill(Qt::color0);
+
+ QPainter p, pm;
+
+ p.begin(&map);
+ pm.begin(&mask);
+
+ p.setPen(Qt::black);
+ pm.setPen(Qt::white);
+
+ for (int i = 0; i < 5; ++i)
+ {
+ p.drawLine(0, ls * i, mapWidth - 1, ls * i);
+ pm.drawLine(0, ls * i, mapWidth - 1, ls * i);
+ }
+
+ p.end();
+ pm.end();
+
+ map.setMask(mask);
+
+ m_staffAboveLabel = new QLabel("staff", exampleVBox);
+ m_staffAboveLabel->setPixmap(map);
+
+ m_textExampleLabel = new QLabel(i18n("Example"), exampleVBox);
+
+ m_staffBelowLabel = new QLabel("staff", exampleVBox);
+ m_staffBelowLabel->setPixmap(map);
+
+ // restore last setting for shortcut combos
+ KConfig *config = kapp->config();
+ config->setGroup(NotationViewConfigGroup);
+
+ m_dynamicShortcutCombo->setCurrentItem(config->readNumEntry("dynamic_shortcut", 0));
+ m_directionShortcutCombo->setCurrentItem(config->readNumEntry("direction_shortcut", 0));
+ m_localDirectionShortcutCombo->setCurrentItem(config->readNumEntry("local_direction_shortcut", 0));
+ m_tempoShortcutCombo->setCurrentItem(config->readNumEntry("tempo_shortcut", 0));
+ m_localTempoShortcutCombo->setCurrentItem(config->readNumEntry("local_tempo_shortcut", 0));
+ m_lilyPondDirectiveCombo->setCurrentItem(config->readNumEntry("lilyPond_directive_combo", 0));
+
+ m_prevChord = config->readEntry("previous_chord", "");
+ m_prevLyric = config->readEntry("previous_lyric", "");
+ m_prevAnnotation = config->readEntry("previous_annotation", "");
+
+ QObject::connect(m_text, SIGNAL(textChanged(const QString &)),
+ this, SLOT(slotTextChanged(const QString &)));
+ QObject::connect(m_typeCombo, SIGNAL(activated(const QString &)),
+ this, SLOT(slotTypeChanged(const QString &)));
+ QObject::connect(this, SIGNAL(okClicked()), this, SLOT(slotOK()));
+ QObject::connect(m_dynamicShortcutCombo, SIGNAL(activated(const QString &)),
+ this, SLOT(slotDynamicShortcutChanged(const QString &)));
+ QObject::connect(m_directionShortcutCombo, SIGNAL(activated(const QString &)),
+ this, SLOT(slotDirectionShortcutChanged(const QString &)));
+ QObject::connect(m_localDirectionShortcutCombo, SIGNAL(activated(const QString &)),
+ this, SLOT(slotLocalDirectionShortcutChanged(const QString &)));
+ QObject::connect(m_tempoShortcutCombo, SIGNAL(activated(const QString &)),
+ this, SLOT(slotTempoShortcutChanged(const QString &)));
+ QObject::connect(m_localTempoShortcutCombo, SIGNAL(activated(const QString &)),
+ this, SLOT(slotLocalTempoShortcutChanged(const QString &)));
+ QObject::connect(m_lilyPondDirectiveCombo, SIGNAL(activated(const QString &)),
+ this, SLOT(slotLilyPondDirectiveChanged(const QString &)));
+
+ m_text->setFocus();
+ slotTypeChanged(strtoqstr(getTextType()));
+
+ // a hacky little fix for #1512143, to restore the capability to edit
+ // existing annotations and other whatnots
+ //!!! tacking another one of these on the bottom strikes me as lame in the
+ // extreme, but it works, and it costs little, and other solutions I can
+ // imagine would cost so much more.
+ m_text->setText(strtoqstr(defaultText.getText()));
+}
+
+Text
+TextEventDialog::getText() const
+{
+ Text text(getTextString(), getTextType());
+ text.setVerse(m_verseSpin->value() - 1);
+ return text;
+}
+
+std::string
+TextEventDialog::getTextType() const
+{
+ return m_styles[m_typeCombo->currentItem()];
+}
+
+std::string
+TextEventDialog::getTextString() const
+{
+ return std::string(qstrtostr(m_text->text()));
+}
+
+void
+TextEventDialog::slotTextChanged(const QString &qtext)
+{
+ std::string type(getTextType());
+
+ QString qtrunc(qtext);
+ if (qtrunc.length() > 20)
+ qtrunc = qtrunc.left(20) + "...";
+ std::string text(qstrtostr(qtrunc));
+ if (text == "")
+ text = "Sample";
+
+ Text rtext(text, type);
+ m_textExampleLabel->setPixmap
+ (NotePixmapFactory::toQPixmap(m_notePixmapFactory->makeTextPixmap(rtext)));
+}
+
+void
+TextEventDialog::slotTypeChanged(const QString &)
+{
+ std::string type(getTextType());
+
+ QString qtrunc(m_text->text());
+ if (qtrunc.length() > 20)
+ qtrunc = qtrunc.left(20) + "...";
+ std::string text(qstrtostr(qtrunc));
+ if (text == "")
+ text = "Sample";
+
+ Text rtext(text, type);
+ m_textExampleLabel->setPixmap
+ (NotePixmapFactory::toQPixmap(m_notePixmapFactory->makeTextPixmap(rtext)));
+
+ //
+ // swap widgets in and out, depending on the current text type
+ //
+ if (type == Text::Dynamic) {
+ m_dynamicShortcutLabel->show();
+ m_dynamicShortcutCombo->show();
+ slotDynamicShortcutChanged(text);
+ } else {
+ m_dynamicShortcutLabel->hide();
+ m_dynamicShortcutCombo->hide();
+ }
+
+ if (type == Text::Direction) {
+ m_directionShortcutLabel->show();
+ m_directionShortcutCombo->show();
+ slotDirectionShortcutChanged(text);
+ } else {
+ m_directionShortcutLabel->hide();
+ m_directionShortcutCombo->hide();
+ }
+
+ if (type == Text::LocalDirection) {
+ m_localDirectionShortcutLabel->show();
+ m_localDirectionShortcutCombo->show();
+ slotLocalDirectionShortcutChanged(text);
+ } else {
+ m_localDirectionShortcutLabel->hide();
+ m_localDirectionShortcutCombo->hide();
+ }
+
+ if (type == Text::Tempo) {
+ m_tempoShortcutLabel->show();
+ m_tempoShortcutCombo->show();
+ slotTempoShortcutChanged(text);
+ } else {
+ m_tempoShortcutLabel->hide();
+ m_tempoShortcutCombo->hide();
+ }
+
+ if (type == Text::LocalTempo) {
+ m_localTempoShortcutLabel->show();
+ m_localTempoShortcutCombo->show();
+ slotLocalTempoShortcutChanged(text);
+ } else {
+ m_localTempoShortcutLabel->hide();
+ m_localTempoShortcutCombo->hide();
+ }
+
+ // restore previous text of appropriate type
+ if (type == Text::Lyric)
+ m_text->setText(m_prevLyric);
+ else if (type == Text::Chord)
+ m_text->setText(m_prevChord);
+ else if (type == Text::Annotation)
+ m_text->setText(m_prevAnnotation);
+
+ //
+ // LilyPond directives only taking temporary residence here; will move out
+ // into some new class eventually
+ //
+ if (type == Text::LilyPondDirective) {
+ m_lilyPondDirectiveCombo->show();
+ m_directiveLabel->show();
+ m_staffAboveLabel->hide();
+ m_staffBelowLabel->show();
+ m_text->setReadOnly(true);
+ m_text->setEnabled(false);
+ slotLilyPondDirectiveChanged(text);
+ } else {
+ m_lilyPondDirectiveCombo->hide();
+ m_directiveLabel->hide();
+ m_text->setReadOnly(false);
+ m_text->setEnabled(true);
+
+ if (type == Text::Dynamic ||
+ type == Text::LocalDirection ||
+ type == Text::UnspecifiedType ||
+ type == Text::Lyric ||
+ type == Text::Annotation) {
+
+ m_staffAboveLabel->show();
+ m_staffBelowLabel->hide();
+
+ } else {
+ m_staffAboveLabel->hide();
+ m_staffBelowLabel->show();
+
+ }
+
+ if (type == Text::Lyric) {
+ m_verseLabel->show();
+ m_verseSpin->show();
+ }
+ }
+}
+
+void
+TextEventDialog::slotOK()
+{
+ // store last setting for shortcut combos
+ KConfig *config = kapp->config();
+ config->setGroup(NotationViewConfigGroup);
+
+ config->writeEntry("dynamic_shortcut", m_dynamicShortcutCombo->currentItem());
+ config->writeEntry("direction_shortcut", m_directionShortcutCombo->currentItem());
+ config->writeEntry("local_direction_shortcut", m_localDirectionShortcutCombo->currentItem());
+ config->writeEntry("tempo_shortcut", m_tempoShortcutCombo->currentItem());
+ config->writeEntry("local_tempo_shortcut", m_localTempoShortcutCombo->currentItem());
+ // temporary home:
+ config->writeEntry("lilyPond_directive_combo", m_lilyPondDirectiveCombo->currentItem());
+
+ // store last chord, lyric, annotation, depending on what's currently in
+ // the text entry widget
+ int index = m_typeCombo->currentItem();
+ if (index == 5)
+ config->writeEntry("previous_chord", m_text->text());
+ else if (index == 6)
+ config->writeEntry("previous_lyric", m_text->text());
+ else if (index == 7)
+ config->writeEntry("previous_annotation", m_text->text());
+}
+
+void
+TextEventDialog::slotDynamicShortcutChanged(const QString &text)
+{
+ if (text == "" || text == "Sample") {
+ m_text->setText(strtoqstr(m_dynamicShortcutCombo->currentText()));
+ } else {
+ m_text->setText(text);
+ }
+}
+
+void
+TextEventDialog::slotDirectionShortcutChanged(const QString &text)
+{
+ if (text == "" || text == "Sample") {
+ m_text->setText(strtoqstr(m_directionShortcutCombo->currentText()));
+ } else {
+ m_text->setText(text);
+ }
+}
+
+void
+TextEventDialog::slotLocalDirectionShortcutChanged(const QString &text)
+{
+ if (text == "" || text == "Sample") {
+ m_text->setText(strtoqstr(m_localDirectionShortcutCombo->currentText()));
+ } else {
+ m_text->setText(text);
+ }
+}
+
+void
+TextEventDialog::slotTempoShortcutChanged(const QString &text)
+{
+ if (text == "" || text == "Sample") {
+ m_text->setText(strtoqstr(m_tempoShortcutCombo->currentText()));
+ } else {
+ m_text->setText(text);
+ }
+}
+
+void
+TextEventDialog::slotLocalTempoShortcutChanged(const QString &text)
+{
+ if (text == "" || text == "Sample") {
+ m_text->setText(strtoqstr(m_localTempoShortcutCombo->currentText()));
+ } else {
+ m_text->setText(text);
+ }
+}
+
+void
+TextEventDialog::slotLilyPondDirectiveChanged(const QString &)
+{
+ m_text->setText(strtoqstr(m_lilyPondDirectiveCombo->currentText()));
+}
+
+}
+#include "TextEventDialog.moc"
diff --git a/src/gui/dialogs/TextEventDialog.h b/src/gui/dialogs/TextEventDialog.h
new file mode 100644
index 0000000..0f389b0
--- /dev/null
+++ b/src/gui/dialogs/TextEventDialog.h
@@ -0,0 +1,129 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_TEXTEVENTDIALOG_H_
+#define _RG_TEXTEVENTDIALOG_H_
+
+#include "base/NotationTypes.h"
+#include <string>
+#include <kdialogbase.h>
+#include <qstring.h>
+#include <vector>
+
+
+class QWidget;
+class QLineEdit;
+class QLabel;
+class KComboBox;
+class QSpinBox;
+
+namespace Rosegarden
+{
+
+class NotePixmapFactory;
+
+
+class TextEventDialog : public KDialogBase
+{
+ Q_OBJECT
+
+public:
+ TextEventDialog(QWidget *parent,
+ NotePixmapFactory *npf,
+ Text defaultText,
+ int maxLength = -1); // for Qt default
+
+ Text getText() const;
+
+public slots:
+ void slotTextChanged(const QString &);
+ void slotTypeChanged(const QString &);
+
+ /*
+ * Save previous state of assorted widgets for restoration in the next
+ * instance
+ */
+ void slotOK();
+
+ // convenience canned texts
+ void slotDynamicShortcutChanged(const QString &);
+ void slotDirectionShortcutChanged(const QString &);
+ void slotLocalDirectionShortcutChanged(const QString &);
+ void slotTempoShortcutChanged(const QString &);
+ void slotLocalTempoShortcutChanged(const QString &);
+
+ //
+ // special LilyPond directives, initial phase, as cheap text events; will
+ // eventually move out of Text, and out of this dialog into
+ // some other less cheesy interface
+ //
+ void slotLilyPondDirectiveChanged(const QString &);
+
+protected:
+
+ std::string getTextType() const;
+ std::string getTextString() const;
+
+ //--------------- Data members ---------------------------------
+
+ QLineEdit *m_text;
+ KComboBox *m_typeCombo;
+ QSpinBox *m_verseSpin;
+ KComboBox *m_dynamicShortcutCombo;
+ KComboBox *m_directionShortcutCombo;
+ KComboBox *m_localDirectionShortcutCombo;
+ KComboBox *m_tempoShortcutCombo;
+ KComboBox *m_localTempoShortcutCombo;
+ // temporary home:
+ KComboBox *m_lilyPondDirectiveCombo;
+
+
+ QLabel *m_staffAboveLabel;
+ QLabel *m_textExampleLabel;
+ QLabel *m_staffBelowLabel;
+ QLabel *m_dynamicShortcutLabel;
+ QLabel *m_directionShortcutLabel;
+ QLabel *m_localDirectionShortcutLabel;
+ QLabel *m_tempoShortcutLabel;
+ QLabel *m_localTempoShortcutLabel;
+ QLabel *m_verseLabel;
+ // temporary home:
+ QLabel *m_directiveLabel;
+
+ QString m_prevChord;
+ QString m_prevLyric;
+ QString m_prevAnnotation;
+
+ NotePixmapFactory *m_notePixmapFactory;
+ std::vector<std::string> m_styles;
+// std::vector<std::string> m_directives;
+
+};
+
+
+
+}
+
+#endif
diff --git a/src/gui/dialogs/TimeDialog.cpp b/src/gui/dialogs/TimeDialog.cpp
new file mode 100644
index 0000000..40d1da2
--- /dev/null
+++ b/src/gui/dialogs/TimeDialog.cpp
@@ -0,0 +1,80 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "TimeDialog.h"
+
+#include <klocale.h>
+#include "base/Composition.h"
+#include "gui/widgets/TimeWidget.h"
+#include <kdialogbase.h>
+#include <qstring.h>
+#include <qvbox.h>
+#include <qwidget.h>
+
+
+namespace Rosegarden
+{
+
+TimeDialog::TimeDialog(QWidget *parent, QString title,
+ Composition *composition,
+ timeT defaultTime,
+ bool constrainToCompositionDuration) :
+ KDialogBase(parent, 0, true, title, User1 | Ok | Cancel)
+{
+ QVBox *vbox = makeVBoxMainWidget();
+ m_timeWidget = new TimeWidget
+ (title, vbox, composition, defaultTime, true,
+ constrainToCompositionDuration);
+
+ setButtonText(User1, i18n("Reset"));
+ connect(this, SIGNAL(user1Clicked()),
+ m_timeWidget, SLOT(slotResetToDefault()));
+}
+
+TimeDialog::TimeDialog(QWidget *parent, QString title,
+ Composition *composition,
+ timeT startTime,
+ timeT defaultTime,
+ bool constrainToCompositionDuration) :
+ KDialogBase(parent, 0, true, title, User1 | Ok | Cancel)
+{
+ QVBox *vbox = makeVBoxMainWidget();
+ m_timeWidget = new TimeWidget
+ (title, vbox, composition, startTime, defaultTime, true,
+ constrainToCompositionDuration);
+
+ setButtonText(User1, i18n("Reset"));
+ connect(this, SIGNAL(user1Clicked()),
+ m_timeWidget, SLOT(slotResetToDefault()));
+}
+
+timeT
+TimeDialog::getTime() const
+{
+ return m_timeWidget->getTime();
+}
+
+}
+#include "TimeDialog.moc"
diff --git a/src/gui/dialogs/TimeDialog.h b/src/gui/dialogs/TimeDialog.h
new file mode 100644
index 0000000..e12a007
--- /dev/null
+++ b/src/gui/dialogs/TimeDialog.h
@@ -0,0 +1,67 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_TIMEDIALOG_H_
+#define _RG_TIMEDIALOG_H_
+
+#include <kdialogbase.h>
+#include <qstring.h>
+#include "base/Event.h"
+
+
+class QWidget;
+
+
+namespace Rosegarden
+{
+
+class TimeWidget;
+class Composition;
+
+
+class TimeDialog : public KDialogBase
+{
+ Q_OBJECT
+public:
+ /// for absolute times
+ TimeDialog(QWidget *parent, QString title, Composition *composition,
+ timeT defaultTime, bool constrainToCompositionDuration);
+
+ /// for durations
+ TimeDialog(QWidget *parent, QString title, Composition *composition,
+ timeT startTime, timeT defaultDuration,
+ bool constrainToCompositionDuration);
+
+ timeT getTime() const;
+
+protected:
+ TimeWidget *m_timeWidget;
+};
+
+
+
+}
+
+#endif
diff --git a/src/gui/dialogs/TimeSignatureDialog.cpp b/src/gui/dialogs/TimeSignatureDialog.cpp
new file mode 100644
index 0000000..082f123
--- /dev/null
+++ b/src/gui/dialogs/TimeSignatureDialog.cpp
@@ -0,0 +1,316 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "TimeSignatureDialog.h"
+#include <kapplication.h>
+
+#include <klocale.h>
+#include "document/ConfigGroups.h"
+#include "base/Composition.h"
+#include "base/NotationTypes.h"
+#include "gui/widgets/TimeWidget.h"
+#include "gui/widgets/BigArrowButton.h"
+#include <kconfig.h>
+#include <kdialogbase.h>
+#include <qbuttongroup.h>
+#include <qcheckbox.h>
+#include <qfont.h>
+#include <qgroupbox.h>
+#include <qhbox.h>
+#include <qlabel.h>
+#include <qobject.h>
+#include <qradiobutton.h>
+#include <qstring.h>
+#include <qvbox.h>
+#include <qwidget.h>
+
+
+namespace Rosegarden
+{
+
+TimeSignatureDialog::TimeSignatureDialog(QWidget *parent,
+ Composition *composition,
+ timeT insertionTime,
+ TimeSignature sig,
+ bool timeEditable,
+ QString explanatoryText) :
+ KDialogBase(parent, 0, true, i18n("Time Signature"), Ok | Cancel | Help),
+ m_composition(composition),
+ m_timeSignature(sig),
+ m_time(insertionTime),
+ m_numLabel(0),
+ m_denomLabel(0),
+ m_explanatoryLabel(0),
+ m_commonTimeButton(0),
+ m_hideSignatureButton(0),
+ m_normalizeRestsButton(0),
+ m_asGivenButton(0),
+ m_startOfBarButton(0),
+ m_timeEditor(0)
+{
+ static QFont *timeSigFont = 0;
+
+ if (timeSigFont == 0) {
+ timeSigFont = new QFont("new century schoolbook", 8, QFont::Bold);
+ timeSigFont->setPixelSize(20);
+ }
+
+ QVBox *vbox = makeVBoxMainWidget();
+ QGroupBox *groupBox = new QGroupBox
+ (1, Horizontal, i18n("Time signature"), vbox);
+ QHBox *numBox = new QHBox(groupBox);
+ QHBox *denomBox = new QHBox(groupBox);
+
+ QLabel *explanatoryLabel = 0;
+ if (explanatoryText) {
+ explanatoryLabel = new QLabel(explanatoryText, groupBox);
+ }
+
+ BigArrowButton *numDown = new BigArrowButton(numBox, Qt::LeftArrow);
+ BigArrowButton *denomDown = new BigArrowButton(denomBox, Qt::LeftArrow);
+
+ m_numLabel = new QLabel
+ (QString("%1").arg(m_timeSignature.getNumerator()), numBox);
+ m_denomLabel = new QLabel
+ (QString("%1").arg(m_timeSignature.getDenominator()), denomBox);
+
+ m_numLabel->setAlignment(AlignHCenter | AlignVCenter);
+ m_denomLabel->setAlignment(AlignHCenter | AlignVCenter);
+
+ m_numLabel->setFont(*timeSigFont);
+ m_denomLabel->setFont(*timeSigFont);
+
+ BigArrowButton *numUp = new BigArrowButton(numBox, Qt::RightArrow);
+ BigArrowButton *denomUp = new BigArrowButton(denomBox, Qt::RightArrow);
+
+ QObject::connect(numDown, SIGNAL(clicked()), this, SLOT(slotNumDown()));
+ QObject::connect(numUp, SIGNAL(clicked()), this, SLOT(slotNumUp()));
+ QObject::connect(denomDown, SIGNAL(clicked()), this, SLOT(slotDenomDown()));
+ QObject::connect(denomUp, SIGNAL(clicked()), this, SLOT(slotDenomUp()));
+
+ if (timeEditable) {
+
+ m_timeEditor = new TimeWidget
+ (i18n("Time where signature takes effect"),
+ vbox,
+ composition,
+ m_time,
+ true);
+
+ m_asGivenButton = 0;
+ m_startOfBarButton = 0;
+
+ } else {
+
+ m_timeEditor = 0;
+
+ groupBox = new QButtonGroup(1, Horizontal, i18n("Scope"), vbox);
+
+ int barNo = composition->getBarNumber(m_time);
+ bool atStartOfBar = (m_time == composition->getBarStart(barNo));
+
+ if (!atStartOfBar) {
+
+ QString scopeText;
+
+ if (barNo != 0 || !atStartOfBar) {
+ if (atStartOfBar) {
+ scopeText = QString
+ (i18n("Insertion point is at start of measure %1."))
+ .arg(barNo + 1);
+ } else {
+ scopeText = QString
+ (i18n("Insertion point is in the middle of measure %1."))
+ .arg(barNo + 1);
+ }
+ } else {
+ scopeText = QString
+ (i18n("Insertion point is at start of composition."));
+ }
+
+ new QLabel(scopeText, groupBox);
+ m_asGivenButton = new QRadioButton
+ (i18n("Start measure %1 here").arg(barNo + 2), groupBox);
+
+ if (!atStartOfBar) {
+ m_startOfBarButton = new QRadioButton
+ (i18n("Change time from start of measure %1")
+ .arg(barNo + 1), groupBox);
+ m_startOfBarButton->setChecked(true);
+ } else {
+ m_asGivenButton->setChecked(true);
+ }
+ } else {
+ new QLabel(i18n("Time change will take effect at the start of measure %1.")
+ .arg(barNo + 1), groupBox);
+ }
+ }
+
+ groupBox = new QGroupBox(1, Horizontal, i18n("Options"), vbox);
+ KConfig *config = kapp->config();
+ config->setGroup(GeneralOptionsConfigGroup);
+
+ m_hideSignatureButton = new QCheckBox
+ (i18n("Hide the time signature"), groupBox);
+ m_hideSignatureButton->setChecked
+ (config->readBoolEntry("timesigdialogmakehidden", false));
+
+ m_hideBarsButton = new QCheckBox
+ (i18n("Hide the affected bar lines"), groupBox);
+ m_hideBarsButton->setChecked
+ (config->readBoolEntry("timesigdialogmakehiddenbars", false));
+
+ m_commonTimeButton = new QCheckBox
+ (i18n("Show as common time"), groupBox);
+ m_commonTimeButton->setChecked
+ (config->readBoolEntry("timesigdialogshowcommon", true));
+
+ m_normalizeRestsButton = new QCheckBox
+ (i18n("Correct the durations of following measures"), groupBox);
+ m_normalizeRestsButton->setChecked
+ (config->readBoolEntry("timesigdialognormalize", true));
+
+ QObject::connect(m_hideSignatureButton, SIGNAL(clicked()), this,
+ SLOT(slotUpdateCommonTimeButton()));
+ slotUpdateCommonTimeButton();
+ m_explanatoryLabel = explanatoryLabel;
+
+ setHelp("time-signature");
+}
+
+TimeSignature
+TimeSignatureDialog::getTimeSignature() const
+{
+ KConfig *config = kapp->config();
+ config->setGroup(GeneralOptionsConfigGroup);
+
+ config->writeEntry("timesigdialogmakehidden", m_hideSignatureButton->isChecked());
+ config->writeEntry("timesigdialogmakehiddenbars", m_hideBarsButton->isChecked());
+ config->writeEntry("timesigdialogshowcommon", m_commonTimeButton->isChecked());
+ config->writeEntry("timesigdialognormalize", m_normalizeRestsButton->isChecked());
+
+ TimeSignature ts(m_timeSignature.getNumerator(),
+ m_timeSignature.getDenominator(),
+ (m_commonTimeButton &&
+ m_commonTimeButton->isEnabled() &&
+ m_commonTimeButton->isChecked()),
+ (m_hideSignatureButton &&
+ m_hideSignatureButton->isEnabled() &&
+ m_hideSignatureButton->isChecked()),
+ (m_hideBarsButton &&
+ m_hideBarsButton->isEnabled() &&
+ m_hideBarsButton->isChecked()));
+ return ts;
+}
+
+void
+TimeSignatureDialog::slotNumDown()
+{
+ int n = m_timeSignature.getNumerator();
+ if (--n >= 1) {
+ m_timeSignature = TimeSignature(n, m_timeSignature.getDenominator());
+ m_numLabel->setText(QString("%1").arg(n));
+ }
+ slotUpdateCommonTimeButton();
+}
+
+void
+TimeSignatureDialog::slotNumUp()
+{
+ int n = m_timeSignature.getNumerator();
+ if (++n <= 99) {
+ m_timeSignature = TimeSignature(n, m_timeSignature.getDenominator());
+ m_numLabel->setText(QString("%1").arg(n));
+ }
+ slotUpdateCommonTimeButton();
+}
+
+void
+TimeSignatureDialog::slotDenomDown()
+{
+ int n = m_timeSignature.getDenominator();
+ if ((n /= 2) >= 1) {
+ m_timeSignature = TimeSignature(m_timeSignature.getNumerator(), n);
+ m_denomLabel->setText(QString("%1").arg(n));
+ }
+ slotUpdateCommonTimeButton();
+}
+
+void
+TimeSignatureDialog::slotDenomUp()
+{
+ int n = m_timeSignature.getDenominator();
+ if ((n *= 2) <= 64) {
+ m_timeSignature = TimeSignature(m_timeSignature.getNumerator(), n);
+ m_denomLabel->setText(QString("%1").arg(n));
+ }
+ slotUpdateCommonTimeButton();
+}
+
+void
+TimeSignatureDialog::slotUpdateCommonTimeButton()
+{
+ if (m_explanatoryLabel)
+ m_explanatoryLabel->hide();
+ if (!m_hideSignatureButton || !m_hideSignatureButton->isChecked()) {
+ if (m_timeSignature.getDenominator() == m_timeSignature.getNumerator()) {
+ if (m_timeSignature.getNumerator() == 4) {
+ m_commonTimeButton->setText(i18n("Display as common time"));
+ m_commonTimeButton->setEnabled(true);
+ return ;
+ } else if (m_timeSignature.getNumerator() == 2) {
+ m_commonTimeButton->setText(i18n("Display as cut common time"));
+ m_commonTimeButton->setEnabled(true);
+ return ;
+ }
+ }
+ }
+ m_commonTimeButton->setEnabled(false);
+}
+
+timeT
+TimeSignatureDialog::getTime() const
+{
+ if (m_timeEditor) {
+ return m_timeEditor->getTime();
+ } else if (m_asGivenButton && m_asGivenButton->isChecked()) {
+ return m_time;
+ } else if (m_startOfBarButton && m_startOfBarButton->isChecked()) {
+ int barNo = m_composition->getBarNumber(m_time);
+ return m_composition->getBarStart(barNo);
+ } else {
+ return m_time;
+ }
+}
+
+bool
+TimeSignatureDialog::shouldNormalizeRests() const
+{
+ return (m_normalizeRestsButton && m_normalizeRestsButton->isEnabled() &&
+ m_normalizeRestsButton->isChecked());
+}
+
+}
+#include "TimeSignatureDialog.moc"
diff --git a/src/gui/dialogs/TimeSignatureDialog.h b/src/gui/dialogs/TimeSignatureDialog.h
new file mode 100644
index 0000000..330134c
--- /dev/null
+++ b/src/gui/dialogs/TimeSignatureDialog.h
@@ -0,0 +1,99 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_TIMESIGNATUREDIALOG_H_
+#define _RG_TIMESIGNATUREDIALOG_H_
+
+#include "base/NotationTypes.h"
+#include <kdialogbase.h>
+#include <qstring.h>
+#include "base/Event.h"
+
+
+class QWidget;
+class QRadioButton;
+class QLabel;
+class QCheckBox;
+
+
+namespace Rosegarden
+{
+
+class TimeWidget;
+class Composition;
+
+
+class TimeSignatureDialog : public KDialogBase
+{
+ Q_OBJECT
+
+public:
+ TimeSignatureDialog(QWidget *parent,
+ Composition *composition,
+ timeT insertionTime,
+ TimeSignature defaultSig =
+ TimeSignature::DefaultTimeSignature,
+ bool timeEditable = false,
+ QString explanatoryText = 0);
+
+ TimeSignature getTimeSignature() const;
+
+ timeT getTime() const;
+ bool shouldNormalizeRests() const;
+
+public slots:
+ void slotNumUp();
+ void slotNumDown();
+ void slotDenomUp();
+ void slotDenomDown();
+ void slotUpdateCommonTimeButton();
+
+protected:
+ //--------------- Data members ---------------------------------
+
+ Composition *m_composition;
+ TimeSignature m_timeSignature;
+ timeT m_time;
+
+ QLabel *m_numLabel;
+ QLabel *m_denomLabel;
+ QLabel *m_explanatoryLabel;
+
+ QCheckBox *m_commonTimeButton;
+ QCheckBox *m_hideSignatureButton;
+ QCheckBox *m_hideBarsButton;
+ QCheckBox *m_normalizeRestsButton;
+
+ QRadioButton *m_asGivenButton;
+ QRadioButton *m_startOfBarButton;
+
+ TimeWidget *m_timeEditor;
+};
+
+
+
+}
+
+#endif
diff --git a/src/gui/dialogs/TransportDialog.cpp b/src/gui/dialogs/TransportDialog.cpp
new file mode 100644
index 0000000..115a528
--- /dev/null
+++ b/src/gui/dialogs/TransportDialog.cpp
@@ -0,0 +1,1164 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "TransportDialog.h"
+
+#include <klocale.h>
+#include <kstddirs.h>
+#include "base/Composition.h"
+#include "base/NotationTypes.h"
+#include "base/RealTime.h"
+#include "misc/Debug.h"
+#include "gui/application/RosegardenApplication.h"
+#include "gui/general/MidiPitchLabel.h"
+#include "gui/studio/StudioControl.h"
+#include "gui/widgets/Label.h"
+#include "sound/MappedEvent.h"
+#include "document/ConfigGroups.h"
+#include <kconfig.h>
+#include <kglobal.h>
+#include <qaccel.h>
+#include <qcolor.h>
+#include <qcstring.h>
+#include <qdatastream.h>
+#include <qfont.h>
+#include <qhbox.h>
+#include <qlabel.h>
+#include <qpalette.h>
+#include <qpixmap.h>
+#include <qpushbutton.h>
+#include <qstring.h>
+#include <qtimer.h>
+#include <qwidget.h>
+
+
+namespace Rosegarden
+{
+
+TransportDialog::TransportDialog(QWidget *parent,
+ const char *name,
+ WFlags flags):
+ QWidget(parent, name, WType_TopLevel | WStyle_DialogBorder | WStyle_Minimize | WStyle_SysMenu | WDestructiveClose),
+ m_transport(0),
+ m_lastTenHours(0),
+ m_lastUnitHours(0),
+ m_lastTenMinutes(0),
+ m_lastUnitMinutes(0),
+ m_lastTenSeconds(0),
+ m_lastUnitSeconds(0),
+ m_lastTenths(0),
+ m_lastHundreths(0),
+ m_lastThousandths(0),
+ m_lastTenThousandths(0),
+ m_lastNegative(false),
+ m_lastMode(RealMode),
+ m_currentMode(RealMode),
+ m_tempo(0),
+ m_numerator(0),
+ m_denominator(0),
+ m_framesPerSecond(24),
+ m_bitsPerFrame(80),
+ m_isExpanded(true),
+ m_haveOriginalBackground(false),
+ m_isBackgroundSet(false),
+ m_sampleRate(0)
+{
+ m_transport = new RosegardenTransport(this);
+
+ setCaption(i18n("Rosegarden Transport"));
+
+ resetFonts();
+
+ initModeMap();
+
+ // set the LCD frame background to black
+ //
+ m_transport->LCDBoxFrame->setBackgroundColor(Qt::black);
+
+ // set all the pixmap backgrounds to black to avoid
+ // flickering when we update
+ //
+ m_transport->TenThousandthsPixmap->setBackgroundColor(Qt::black);
+ m_transport->ThousandthsPixmap->setBackgroundColor(Qt::black);
+ m_transport->HundredthsPixmap->setBackgroundColor(Qt::black);
+ m_transport->TenthsPixmap->setBackgroundColor(Qt::black);
+ m_transport->UnitSecondsPixmap->setBackgroundColor(Qt::black);
+ m_transport->TenSecondsPixmap->setBackgroundColor(Qt::black);
+ m_transport->UnitMinutesPixmap->setBackgroundColor(Qt::black);
+ m_transport->TenMinutesPixmap->setBackgroundColor(Qt::black);
+ m_transport->UnitHoursPixmap->setBackgroundColor(Qt::black);
+ m_transport->TenHoursPixmap->setBackgroundColor(Qt::black);
+ m_transport->NegativePixmap->setBackgroundColor(Qt::black);
+
+ // unset the negative sign to begin with
+ m_transport->NegativePixmap->clear();
+
+ // Set our toggle buttons
+ //
+ m_transport->PlayButton->setToggleButton(true);
+ m_transport->RecordButton->setToggleButton(true);
+
+// Disable the loop button if JACK transport enabled, because this
+// causes a nasty race condition, and it just seems our loops are not JACK compatible
+// #1240039 - DMM
+// KConfig* config = rgapp->config();
+// config->setGroup(SequencerOptionsConfigGroup);
+// if (config->readBoolEntry("jacktransport", false))
+// {
+// m_transport->LoopButton->setEnabled(false);
+// }
+
+ // fix and hold the size of the dialog
+ //
+ setMinimumSize(m_transport->width(), m_transport->height());
+ setMaximumSize(m_transport->width(), m_transport->height());
+
+ loadPixmaps();
+
+ // Create Midi label timers
+ m_midiInTimer = new QTimer(this);
+ m_midiOutTimer = new QTimer(this);
+ m_clearMetronomeTimer = new QTimer(this);
+
+ connect(m_midiInTimer, SIGNAL(timeout()),
+ SLOT(slotClearMidiInLabel()));
+
+ connect(m_midiOutTimer, SIGNAL(timeout()),
+ SLOT(slotClearMidiOutLabel()));
+
+ connect(m_clearMetronomeTimer, SIGNAL(timeout()),
+ SLOT(slotResetBackground()));
+
+ m_transport->TimeDisplayLabel->hide();
+ m_transport->ToEndLabel->hide();
+
+ connect(m_transport->TimeDisplayButton, SIGNAL(clicked()),
+ SLOT(slotChangeTimeDisplay()));
+
+ connect(m_transport->ToEndButton, SIGNAL(clicked()),
+ SLOT(slotChangeToEnd()));
+
+ connect(m_transport->LoopButton, SIGNAL(clicked()),
+ SLOT(slotLoopButtonClicked()));
+
+ connect(m_transport->PanelOpenButton, SIGNAL(clicked()),
+ SLOT(slotPanelOpenButtonClicked()));
+
+ connect(m_transport->PanelCloseButton, SIGNAL(clicked()),
+ SLOT(slotPanelCloseButtonClicked()));
+
+ connect(m_transport->PanicButton, SIGNAL(clicked()), SIGNAL(panic()));
+
+ m_panelOpen = *m_transport->PanelOpenButton->pixmap();
+ m_panelClosed = *m_transport->PanelCloseButton->pixmap();
+
+
+ connect(m_transport->SetStartLPButton, SIGNAL(clicked()), SLOT(slotSetStartLoopingPointAtMarkerPos()));
+ connect(m_transport->SetStopLPButton, SIGNAL(clicked()), SLOT(slotSetStopLoopingPointAtMarkerPos()));
+
+ // clear labels
+ //
+ slotClearMidiInLabel();
+ slotClearMidiOutLabel();
+
+ // and by default we close the lower panel
+ //
+ int rfh = m_transport->RecordingFrame->height();
+ m_transport->RecordingFrame->hide();
+ setFixedSize(width(), height() - rfh);
+ m_transport->PanelOpenButton->setPixmap(m_panelClosed);
+
+ // and since by default we show real time (not SMPTE), by default
+ // we hide the small colon pixmaps
+ //
+ m_transport->SecondColonPixmap->hide();
+ m_transport->HundredthColonPixmap->hide();
+
+ // We have to specify these settings in this class (copied
+ // from rosegardentransport.cpp) as we're using a specialised
+ // widgets for TempoDisplay. Ugly but works - does mean that
+ // if the rest of the Transport ever changes then this code
+ // will have to as well.
+ //
+ QPalette pal;
+ pal.setColor(QColorGroup::Foreground, QColor(192, 216, 255));
+
+ m_transport->TempoDisplay->setPalette(pal);
+ m_transport->TempoDisplay->setAlignment(int(QLabel::AlignVCenter | QLabel::AlignRight));
+
+ m_transport->TimeSigDisplay->setPalette(pal);
+ m_transport->TimeSigDisplay->setAlignment(int(QLabel::AlignVCenter | QLabel::AlignRight));
+
+ QFont localFont(m_transport->OutDisplay->font() );
+ localFont.setFamily( "lucida" );
+ localFont.setBold( TRUE );
+
+ m_transport->TempoDisplay->setFont( localFont );
+ m_transport->TimeSigDisplay->setFont( localFont );
+
+ connect(m_transport->TempoDisplay, SIGNAL(doubleClicked()),
+ this, SLOT(slotEditTempo()));
+
+ connect(m_transport->TempoDisplay, SIGNAL(scrollWheel(int)),
+ this, SIGNAL(scrollTempo(int)));
+
+ connect(m_transport->TimeSigDisplay, SIGNAL(doubleClicked()),
+ this, SLOT(slotEditTimeSignature()));
+
+ // toil through the individual pixmaps
+ connect(m_transport->NegativePixmap, SIGNAL(doubleClicked()),
+ this, SLOT(slotEditTime()));
+ connect(m_transport->TenHoursPixmap, SIGNAL(doubleClicked()),
+ this, SLOT(slotEditTime()));
+ connect(m_transport->UnitHoursPixmap, SIGNAL(doubleClicked()),
+ this, SLOT(slotEditTime()));
+ connect(m_transport->HourColonPixmap, SIGNAL(doubleClicked()),
+ this, SLOT(slotEditTime()));
+ connect(m_transport->TenMinutesPixmap, SIGNAL(doubleClicked()),
+ this, SLOT(slotEditTime()));
+ connect(m_transport->UnitMinutesPixmap, SIGNAL(doubleClicked()),
+ this, SLOT(slotEditTime()));
+ connect(m_transport->MinuteColonPixmap, SIGNAL(doubleClicked()),
+ this, SLOT(slotEditTime()));
+ connect(m_transport->TenSecondsPixmap, SIGNAL(doubleClicked()),
+ this, SLOT(slotEditTime()));
+ connect(m_transport->UnitSecondsPixmap, SIGNAL(doubleClicked()),
+ this, SLOT(slotEditTime()));
+ connect(m_transport->SecondColonPixmap, SIGNAL(doubleClicked()),
+ this, SLOT(slotEditTime()));
+ connect(m_transport->TenthsPixmap, SIGNAL(doubleClicked()),
+ this, SLOT(slotEditTime()));
+ connect(m_transport->HundredthsPixmap, SIGNAL(doubleClicked()),
+ this, SLOT(slotEditTime()));
+ connect(m_transport->HundredthColonPixmap, SIGNAL(doubleClicked()),
+ this, SLOT(slotEditTime()));
+ connect(m_transport->TenThousandthsPixmap, SIGNAL(doubleClicked()),
+ this, SLOT(slotEditTime()));
+ connect(m_transport->ThousandthsPixmap, SIGNAL(doubleClicked()),
+ this, SLOT(slotEditTime()));
+
+ // accelerator object
+ //
+ m_accelerators = new QAccel(this);
+}
+
+TransportDialog::~TransportDialog()
+{
+ if (isVisible()) {
+ KConfig* config = rgapp->config();
+ config->setGroup(GeneralOptionsConfigGroup);
+ config->writeEntry("transportx", x());
+ config->writeEntry("transporty", y());
+ }
+}
+
+std::string
+TransportDialog::getCurrentModeAsString()
+{
+ bool found = false;
+ for (std::map<std::string, TimeDisplayMode>::iterator iter = m_modeMap.begin();
+ iter != m_modeMap.end() && !found;
+ iter++)
+ {
+ if (iter->second == m_currentMode) {
+ return iter->first;
+ }
+ }
+
+ // we shouldn't get here unless the map is not well-configured
+ RG_DEBUG << "TransportDialog::getCurrentModeAsString: could not map current mode "
+ << m_currentMode << " to string." << endl;
+ throw Exception("could not map current mode to string.");
+}
+
+void
+TransportDialog::initModeMap()
+{
+ m_modeMap["RealMode"] = RealMode;
+ m_modeMap["SMPTEMode"] = SMPTEMode;
+ m_modeMap["BarMode"] = BarMode;
+ m_modeMap["BarMetronomeMode"] = BarMetronomeMode;
+ m_modeMap["FrameMode"] = FrameMode;
+}
+
+void
+TransportDialog::show()
+{
+ KConfig* config = rgapp->config();
+ config->setGroup(GeneralOptionsConfigGroup);
+ int x = config->readNumEntry("transportx", -1);
+ int y = config->readNumEntry("transporty", -1);
+ if (x >= 0 && y >= 0) {
+ int dw = QApplication::desktop()->availableGeometry(QPoint(x, y)).width();
+ int dh = QApplication::desktop()->availableGeometry(QPoint(x, y)).height();
+ if (x + m_transport->width() > dw) x = dw - m_transport->width();
+ if (y + m_transport->height() > dh) y = dh - m_transport->height();
+ move(x, y);
+// std::cerr << "TransportDialog::show(): moved to " << x << "," << y << std::endl;
+ QWidget::show();
+// std::cerr << "TransportDialog::show(): now at " << this->x() << "," << this->y() << std::endl;
+ } else {
+ QWidget::show();
+ }
+}
+
+void
+TransportDialog::hide()
+{
+ if (isVisible()) {
+ KConfig* config = rgapp->config();
+ config->setGroup(GeneralOptionsConfigGroup);
+ config->writeEntry("transportx", x());
+ config->writeEntry("transporty", y());
+ }
+ QWidget::hide();
+}
+
+void
+TransportDialog::loadPixmaps()
+{
+ m_lcdList.clear();
+ QString fileName;
+ QString pixmapDir = KGlobal::dirs()->findResource("appdata", "pixmaps/");
+
+ for (int i = 0; i < 10; i++) {
+ fileName = QString("%1/transport/led-%2.xpm").arg(pixmapDir).arg(i);
+ if (!m_lcdList[i].load(fileName)) {
+ std::cerr << "TransportDialog - failed to load pixmap \""
+ << fileName << "\"" << std::endl;
+ }
+ }
+
+ // Load the "negative" sign pixmap
+ //
+ fileName = QString("%1/transport/led--.xpm").arg(pixmapDir);
+ m_lcdNegative.load(fileName);
+
+}
+
+void
+TransportDialog::resetFonts()
+{
+ resetFont(m_transport->TimeSigLabel);
+ resetFont(m_transport->TimeSigDisplay);
+ resetFont(m_transport->TempoLabel);
+ resetFont(m_transport->TempoDisplay);
+ resetFont(m_transport->DivisionLabel);
+ resetFont(m_transport->DivisionDisplay);
+ resetFont(m_transport->InLabel);
+ resetFont(m_transport->InDisplay);
+ resetFont(m_transport->OutLabel);
+ resetFont(m_transport->OutDisplay);
+ resetFont(m_transport->ToEndLabel);
+ resetFont(m_transport->TimeDisplayLabel);
+}
+
+void
+TransportDialog::resetFont(QWidget *w)
+{
+ QFont font = w->font();
+ font.setPixelSize(10);
+ w->setFont(font);
+}
+
+void
+TransportDialog::setSMPTEResolution(int framesPerSecond,
+ int bitsPerFrame)
+{
+ m_framesPerSecond = framesPerSecond;
+ m_bitsPerFrame = bitsPerFrame;
+}
+
+void
+TransportDialog::getSMPTEResolution(int &framesPerSecond,
+ int &bitsPerFrame)
+{
+ framesPerSecond = m_framesPerSecond;
+ bitsPerFrame = m_bitsPerFrame;
+}
+
+void
+TransportDialog::computeSampleRate()
+{
+ if (m_sampleRate == 0) {
+
+ QCString replyType;
+ QByteArray replyData;
+ m_sampleRate = 0;
+
+ if (rgapp->sequencerCall("getSampleRate()", replyType, replyData)) {
+ QDataStream streamIn(replyData, IO_ReadOnly);
+ unsigned int result;
+ streamIn >> result;
+ m_sampleRate = result;
+ } else {
+ m_sampleRate = -1;
+ }
+ }
+
+}
+
+void
+TransportDialog::cycleThroughModes()
+{
+ switch (m_currentMode) {
+
+ case RealMode:
+ if (m_sampleRate > 0)
+ m_currentMode = FrameMode;
+ else
+ m_currentMode = BarMode;
+ break;
+
+ case FrameMode:
+ m_currentMode = BarMode;
+ break;
+
+ case SMPTEMode:
+ m_currentMode = BarMode;
+ break;
+
+ case BarMode:
+ m_currentMode = BarMetronomeMode;
+ break;
+
+ case BarMetronomeMode:
+ m_currentMode = RealMode;
+ break;
+ }
+}
+
+void
+TransportDialog::displayTime()
+{
+ switch (m_currentMode) {
+ case RealMode:
+ m_clearMetronomeTimer->stop();
+ m_transport->TimeDisplayLabel->hide();
+ break;
+
+ case SMPTEMode:
+ m_clearMetronomeTimer->stop();
+ m_transport->TimeDisplayLabel->setText("SMPTE"); // DO NOT i18n
+ m_transport->TimeDisplayLabel->show();
+ break;
+
+ case BarMode:
+ m_clearMetronomeTimer->stop();
+ m_transport->TimeDisplayLabel->setText("BAR"); // DO NOT i18n
+ m_transport->TimeDisplayLabel->show();
+ break;
+
+ case BarMetronomeMode:
+ m_clearMetronomeTimer->start(1700, FALSE);
+ m_transport->TimeDisplayLabel->setText("MET"); // DO NOT i18n
+ m_transport->TimeDisplayLabel->show();
+ break;
+
+ case FrameMode:
+ m_clearMetronomeTimer->stop();
+ m_transport->TimeDisplayLabel->setText(QString("%1").arg(m_sampleRate));
+ m_transport->TimeDisplayLabel->show();
+ break;
+ }
+}
+
+void
+TransportDialog::setNewMode(const std::string& newModeAsString)
+{
+ TimeDisplayMode newMode = RealMode; // default value if not found
+
+ std::map<std::string, TimeDisplayMode>::iterator iter =
+ m_modeMap.find(newModeAsString);
+
+ if (iter != m_modeMap.end()) {
+ // value found
+ newMode = iter->second;
+ } else {
+ // don't fail: use default value set at declaration
+ }
+
+ setNewMode(newMode);
+}
+
+void
+TransportDialog::setNewMode(const TimeDisplayMode& newMode)
+{
+ computeSampleRate();
+
+ m_currentMode = newMode;
+
+ displayTime();
+}
+
+
+void
+TransportDialog::slotChangeTimeDisplay()
+{
+ computeSampleRate();
+
+ cycleThroughModes();
+
+ displayTime();
+}
+
+void
+TransportDialog::slotChangeToEnd()
+{
+ if (m_transport->ToEndButton->isOn()) {
+ m_transport->ToEndLabel->show();
+ } else {
+ m_transport->ToEndLabel->hide();
+ }
+}
+
+bool
+TransportDialog::isShowingTimeToEnd()
+{
+ return m_transport->ToEndButton->isOn();
+}
+
+void
+TransportDialog::displayRealTime(const RealTime &rt)
+{
+ RealTime st = rt;
+
+ slotResetBackground();
+
+ if (m_lastMode != RealMode) {
+ m_transport->HourColonPixmap->show();
+ m_transport->MinuteColonPixmap->show();
+ m_transport->SecondColonPixmap->hide();
+ m_transport->HundredthColonPixmap->hide();
+ m_lastMode = RealMode;
+ }
+
+ // If time is negative then reverse the time and set the minus flag
+ //
+ if (st < RealTime::zeroTime) {
+ st = RealTime::zeroTime - st;
+ if (!m_lastNegative) {
+ m_transport->NegativePixmap->setPixmap(m_lcdNegative);
+ m_lastNegative = true;
+ }
+ } else // don't show the flag
+ {
+ if (m_lastNegative) {
+ m_transport->NegativePixmap->clear();
+ m_lastNegative = false;
+ }
+ }
+
+ m_tenThousandths = ( st.usec() / 100 ) % 10;
+ m_thousandths = ( st.usec() / 1000 ) % 10;
+ m_hundreths = ( st.usec() / 10000 ) % 10;
+ m_tenths = ( st.usec() / 100000 ) % 10;
+
+ m_unitSeconds = ( st.sec ) % 10;
+ m_tenSeconds = ( st.sec / 10 ) % 6;
+
+ m_unitMinutes = ( st.sec / 60 ) % 10;
+ m_tenMinutes = ( st.sec / 600 ) % 6;
+
+ m_unitHours = ( st.sec / 3600 ) % 10;
+ m_tenHours = (st.sec / 36000 ) % 10;
+
+ updateTimeDisplay();
+}
+
+void
+TransportDialog::displayFrameTime(const RealTime &rt)
+{
+ RealTime st = rt;
+
+ slotResetBackground();
+
+ if (m_lastMode != FrameMode) {
+ m_transport->HourColonPixmap->hide();
+ m_transport->MinuteColonPixmap->hide();
+ m_transport->SecondColonPixmap->hide();
+ m_transport->HundredthColonPixmap->hide();
+ m_lastMode = FrameMode;
+ }
+
+ // If time is negative then reverse the time and set the minus flag
+ //
+ if (st < RealTime::zeroTime) {
+ st = RealTime::zeroTime - st;
+ if (!m_lastNegative) {
+ m_transport->NegativePixmap->setPixmap(m_lcdNegative);
+ m_lastNegative = true;
+ }
+ } else // don't show the flag
+ {
+ if (m_lastNegative) {
+ m_transport->NegativePixmap->clear();
+ m_lastNegative = false;
+ }
+ }
+
+ long frame = RealTime::realTime2Frame(st, m_sampleRate);
+
+ m_tenThousandths = frame % 10;
+ frame /= 10;
+ m_thousandths = frame % 10;
+ frame /= 10;
+ m_hundreths = frame % 10;
+ frame /= 10;
+ m_tenths = frame % 10;
+ frame /= 10;
+ m_unitSeconds = frame % 10;
+ frame /= 10;
+ m_tenSeconds = frame % 10;
+ frame /= 10;
+ m_unitMinutes = frame % 10;
+ frame /= 10;
+ m_tenMinutes = frame % 10;
+ frame /= 10;
+ m_unitHours = frame % 10;
+ frame /= 10;
+ m_tenHours = frame % 10;
+ frame /= 10;
+
+ updateTimeDisplay();
+}
+
+void
+TransportDialog::displaySMPTETime(const RealTime &rt)
+{
+ RealTime st = rt;
+
+ slotResetBackground();
+
+ if (m_lastMode != SMPTEMode) {
+ m_transport->HourColonPixmap->show();
+ m_transport->MinuteColonPixmap->show();
+ m_transport->SecondColonPixmap->show();
+ m_transport->HundredthColonPixmap->show();
+ m_lastMode = SMPTEMode;
+ }
+
+ // If time is negative then reverse the time and set the minus flag
+ //
+ if (st < RealTime::zeroTime) {
+ st = RealTime::zeroTime - st;
+ if (!m_lastNegative) {
+ m_transport->NegativePixmap->setPixmap(m_lcdNegative);
+ m_lastNegative = true;
+ }
+ } else // don't show the flag
+ {
+ if (m_lastNegative) {
+ m_transport->NegativePixmap->clear();
+ m_lastNegative = false;
+ }
+ }
+
+ m_tenThousandths =
+ (( st.usec() * m_framesPerSecond * m_bitsPerFrame) / 1000000 ) % 10;
+ m_thousandths =
+ (( st.usec() * m_framesPerSecond * m_bitsPerFrame) / 10000000 ) %
+ (m_bitsPerFrame / 10);
+ m_hundreths =
+ (( st.usec() * m_framesPerSecond) / 1000000 ) % 10;
+ m_tenths =
+ (( st.usec() * m_framesPerSecond) / 10000000 ) % 10;
+
+ m_unitSeconds = ( st.sec ) % 10;
+ m_tenSeconds = ( st.sec / 10 ) % 6;
+
+ m_unitMinutes = ( st.sec / 60 ) % 10;
+ m_tenMinutes = ( st.sec / 600 ) % 6;
+
+ m_unitHours = ( st.sec / 3600 ) % 10;
+ m_tenHours = ( st.sec / 36000 ) % 10;
+
+ updateTimeDisplay();
+}
+
+void
+TransportDialog::displayBarTime(int bar, int beat, int unit)
+{
+ if (m_lastMode != BarMode) {
+ m_transport->HourColonPixmap->hide();
+ m_transport->MinuteColonPixmap->show();
+ m_transport->SecondColonPixmap->hide();
+ m_transport->HundredthColonPixmap->hide();
+ m_lastMode = BarMode;
+ }
+
+ // If time is negative then reverse the time and set the minus flag
+ //
+ if (bar < 0) {
+ bar = -bar;
+ if (!m_lastNegative) {
+ m_transport->NegativePixmap->setPixmap(m_lcdNegative);
+ m_lastNegative = true;
+ }
+ } else // don't show the flag
+ {
+ if (m_lastNegative) {
+ m_transport->NegativePixmap->clear();
+ m_lastNegative = false;
+ }
+ }
+
+ if (m_currentMode == BarMetronomeMode && unit < 2) {
+ if (beat == 1) {
+ slotSetBackground(Qt::red);
+ } else {
+ slotSetBackground(Qt::cyan);
+ }
+ } else {
+ slotResetBackground();
+ }
+
+ m_tenThousandths = ( unit ) % 10;
+ m_thousandths = ( unit / 10 ) % 10;
+ m_hundreths = ( unit / 100 ) % 10;
+ m_tenths = ( unit / 1000 ) % 10;
+
+ if (m_tenths == 0) {
+ m_tenths = -1;
+ if (m_hundreths == 0) {
+ m_hundreths = -1;
+ if (m_thousandths == 0) {
+ m_thousandths = -1;
+ }
+ }
+ }
+
+ m_unitSeconds = ( beat ) % 10;
+ m_tenSeconds = ( beat / 10 ) % 6;
+
+ if (m_tenSeconds == 0) {
+ m_tenSeconds = -1;
+ }
+
+ m_unitMinutes = ( bar ) % 10;
+ m_tenMinutes = ( bar / 10 ) % 10;
+
+ m_unitHours = ( bar / 100 ) % 10;
+ m_tenHours = ( bar / 1000 ) % 10;
+
+ if (m_tenHours == 0) {
+ m_tenHours = -1;
+ if (m_unitHours == 0) {
+ m_unitHours = -1;
+ if (m_tenMinutes == 0) {
+ m_tenMinutes = -1;
+ }
+ }
+ }
+
+ updateTimeDisplay();
+}
+
+void
+TransportDialog::updateTimeDisplay()
+{
+ if (m_tenThousandths != m_lastTenThousandths) {
+ if (m_tenThousandths < 0)
+ m_transport->TenThousandthsPixmap->clear();
+ else
+ m_transport->TenThousandthsPixmap->setPixmap(m_lcdList[m_tenThousandths]);
+ m_lastTenThousandths = m_tenThousandths;
+ }
+
+ if (m_thousandths != m_lastThousandths) {
+ if (m_thousandths < 0)
+ m_transport->ThousandthsPixmap->clear();
+ else
+ m_transport->ThousandthsPixmap->setPixmap(m_lcdList[m_thousandths]);
+ m_lastThousandths = m_thousandths;
+ }
+
+ if (m_hundreths != m_lastHundreths) {
+ if (m_hundreths < 0)
+ m_transport->HundredthsPixmap->clear();
+ else
+ m_transport->HundredthsPixmap->setPixmap(m_lcdList[m_hundreths]);
+ m_lastHundreths = m_hundreths;
+ }
+
+ if (m_tenths != m_lastTenths) {
+ if (m_tenths < 0)
+ m_transport->TenthsPixmap->clear();
+ else
+ m_transport->TenthsPixmap->setPixmap(m_lcdList[m_tenths]);
+ m_lastTenths = m_tenths;
+ }
+
+ if (m_unitSeconds != m_lastUnitSeconds) {
+ if (m_unitSeconds < 0)
+ m_transport->UnitSecondsPixmap->clear();
+ else
+ m_transport->UnitSecondsPixmap->setPixmap(m_lcdList[m_unitSeconds]);
+ m_lastUnitSeconds = m_unitSeconds;
+ }
+
+ if (m_tenSeconds != m_lastTenSeconds) {
+ if (m_tenSeconds < 0)
+ m_transport->TenSecondsPixmap->clear();
+ else
+ m_transport->TenSecondsPixmap->setPixmap(m_lcdList[m_tenSeconds]);
+ m_lastTenSeconds = m_tenSeconds;
+ }
+
+ if (m_unitMinutes != m_lastUnitMinutes) {
+ if (m_unitMinutes < 0)
+ m_transport->UnitMinutesPixmap->clear();
+ else
+ m_transport->UnitMinutesPixmap->setPixmap(m_lcdList[m_unitMinutes]);
+ m_lastUnitMinutes = m_unitMinutes;
+ }
+
+ if (m_tenMinutes != m_lastTenMinutes) {
+ if (m_tenMinutes < 0)
+ m_transport->TenMinutesPixmap->clear();
+ else
+ m_transport->TenMinutesPixmap->setPixmap(m_lcdList[m_tenMinutes]);
+ m_lastTenMinutes = m_tenMinutes;
+ }
+
+ if (m_unitHours != m_lastUnitHours) {
+ if (m_unitHours < 0)
+ m_transport->UnitHoursPixmap->clear();
+ else
+ m_transport->UnitHoursPixmap->setPixmap(m_lcdList[m_unitHours]);
+ m_lastUnitHours = m_unitHours;
+ }
+
+ if (m_tenHours != m_lastTenHours) {
+ if (m_tenHours < 0)
+ m_transport->TenHoursPixmap->clear();
+ else
+ m_transport->TenHoursPixmap->setPixmap(m_lcdList[m_tenHours]);
+ m_lastTenHours = m_tenHours;
+ }
+}
+
+void
+TransportDialog::setTempo(const tempoT &tempo)
+{
+ if (m_tempo == tempo)
+ return ;
+ m_tempo = tempo;
+
+ // Send the quarter note length to the sequencer - shouldn't
+ // really hang this off here but at least it's a single point
+ // where the tempo should always be consistent. Quarter Note
+ // Length is sent (MIDI CLOCK) at 24ppqn.
+ //
+ double qnD = 60.0 / Composition::getTempoQpm(tempo);
+ RealTime qnTime =
+ RealTime(long(qnD),
+ long((qnD - double(long(qnD))) * 1000000000.0));
+
+ StudioControl::sendQuarterNoteLength(qnTime);
+
+ QString tempoString;
+ tempoString.sprintf("%4.3f", Composition::getTempoQpm(tempo));
+
+ m_transport->TempoDisplay->setText(tempoString);
+}
+
+void
+TransportDialog::setTimeSignature(const TimeSignature &timeSig)
+{
+ int numerator = timeSig.getNumerator();
+ int denominator = timeSig.getDenominator();
+ if (m_numerator == numerator && m_denominator == denominator)
+ return ;
+ m_numerator = numerator;
+ m_denominator = denominator;
+
+ QString timeSigString;
+ timeSigString.sprintf("%d/%d", numerator, denominator);
+ m_transport->TimeSigDisplay->setText(timeSigString);
+}
+
+void
+TransportDialog::setMidiInLabel(const MappedEvent *mE)
+{
+ assert(mE > 0);
+
+ switch (mE->getType()) {
+ case MappedEvent::MidiNote:
+ case MappedEvent::MidiNoteOneShot:
+ {
+ // don't do anything if we've got an effective NOTE OFF
+ //
+ if (mE->getVelocity() == 0)
+ return ;
+
+ MidiPitchLabel mPL(mE->getPitch());
+ m_transport->InDisplay->setText
+ (mPL.getQString() +
+ QString(" %1").arg(mE->getVelocity()));
+ }
+ break;
+
+ case MappedEvent::MidiPitchBend:
+ m_transport->InDisplay->setText(i18n("PITCH WHEEL"));
+ break;
+
+ case MappedEvent::MidiController:
+ m_transport->InDisplay->setText(i18n("CONTROLLER"));
+ break;
+
+ case MappedEvent::MidiProgramChange:
+ m_transport->InDisplay->setText(i18n("PROG CHNGE"));
+ break;
+
+ case MappedEvent::MidiKeyPressure:
+ case MappedEvent::MidiChannelPressure:
+ m_transport->InDisplay->setText(i18n("PRESSURE"));
+ break;
+
+ case MappedEvent::MidiSystemMessage:
+ m_transport->InDisplay->setText(i18n("SYS MESSAGE"));
+ break;
+
+ default: // do nothing
+ return ;
+ }
+
+ // Reset the timer if it's already running
+ //
+ if (m_midiInTimer->isActive())
+ m_midiInTimer->stop();
+
+ // 1.5 second timeout for MIDI event
+ //
+ m_midiInTimer->start(1500, true);
+}
+
+void
+TransportDialog::slotClearMidiInLabel()
+{
+ m_transport->InDisplay->setText(i18n(QString("NO EVENTS")));
+
+ // also, just to be sure:
+ slotResetBackground();
+}
+
+void
+TransportDialog::setMidiOutLabel(const MappedEvent *mE)
+{
+ assert(mE > 0);
+
+ switch (mE->getType()) {
+ case MappedEvent::MidiNote:
+ case MappedEvent::MidiNoteOneShot:
+ {
+ MidiPitchLabel mPL(mE->getPitch());
+ m_transport->OutDisplay->setText
+ (mPL.getQString() +
+ QString(" %1").arg(mE->getVelocity()));
+ }
+ break;
+
+ case MappedEvent::MidiPitchBend:
+ m_transport->OutDisplay->setText(i18n("PITCH WHEEL"));
+ break;
+
+ case MappedEvent::MidiController:
+ m_transport->OutDisplay->setText(i18n("CONTROLLER"));
+ break;
+
+ case MappedEvent::MidiProgramChange:
+ m_transport->OutDisplay->setText(i18n("PROG CHNGE"));
+ break;
+
+ case MappedEvent::MidiKeyPressure:
+ case MappedEvent::MidiChannelPressure:
+ m_transport->OutDisplay->setText(i18n("PRESSURE"));
+ break;
+
+ case MappedEvent::MidiSystemMessage:
+ m_transport->OutDisplay->setText(i18n("SYS MESSAGE"));
+ break;
+
+ default: // do nothing
+ return ;
+ }
+
+ // Reset the timer if it's already running
+ //
+ if (m_midiOutTimer->isActive())
+ m_midiOutTimer->stop();
+
+ // 200 millisecond timeout
+ //
+ m_midiOutTimer->start(200, true);
+}
+
+void
+TransportDialog::slotClearMidiOutLabel()
+{
+ m_transport->OutDisplay->setText(i18n(QString("NO EVENTS")));
+}
+
+void
+TransportDialog::closeEvent (QCloseEvent * /*e*/)
+{
+ //e->accept(); // accept the close event here
+ emit closed();
+}
+
+void
+TransportDialog::slotLoopButtonClicked()
+{
+ // disable if JACK transport has been set #1240039 - DMM
+ // KConfig* config = rgapp->config();
+ // config->setGroup(SequencerOptionsConfigGroup);
+ // if (config->readBoolEntry("jacktransport", false))
+ // {
+ // //!!! - this will fail silently
+ // m_transport->LoopButton->setEnabled(false);
+ // m_transport->LoopButton->setOn(false);
+ // return;
+ // }
+
+ if (m_transport->LoopButton->isOn()) {
+ emit setLoop();
+ } else {
+ emit unsetLoop();
+ }
+}
+
+void
+TransportDialog::slotSetStartLoopingPointAtMarkerPos()
+{
+ emit setLoopStartTime();
+}
+
+void
+TransportDialog::slotSetStopLoopingPointAtMarkerPos()
+{
+ emit setLoopStopTime();
+}
+
+void
+TransportDialog::slotPanelOpenButtonClicked()
+{
+ int rfh = m_transport->RecordingFrame->height();
+
+ if (m_transport->RecordingFrame->isVisible()) {
+ m_transport->RecordingFrame->hide();
+ setFixedSize(width(), height() - rfh);
+ m_transport->PanelOpenButton->setPixmap(m_panelClosed);
+ m_isExpanded = false;
+ } else {
+ setFixedSize(width(), height() + rfh);
+ m_transport->RecordingFrame->show();
+ m_transport->PanelOpenButton->setPixmap(m_panelOpen);
+ m_isExpanded = true;
+ }
+}
+
+void
+TransportDialog::slotPanelCloseButtonClicked()
+{
+ int rfh = m_transport->RecordingFrame->height();
+
+ if (m_transport->RecordingFrame->isVisible()) {
+ m_transport->RecordingFrame->hide();
+ setFixedSize(width(), height() - rfh);
+ m_transport->PanelOpenButton->setPixmap(m_panelClosed);
+ m_isExpanded = false;
+ }
+}
+
+bool
+TransportDialog::isExpanded()
+{
+ return m_isExpanded;
+}
+
+void
+TransportDialog::slotEditTempo()
+{
+ emit editTempo(this);
+}
+
+void
+TransportDialog::slotEditTimeSignature()
+{
+ emit editTimeSignature(this);
+}
+
+void
+TransportDialog::slotEditTime()
+{
+ emit editTransportTime(this);
+}
+
+void
+TransportDialog::slotSetBackground(QColor c)
+{
+ if (!m_haveOriginalBackground) {
+ m_originalBackground = m_transport->LCDBoxFrame->paletteBackgroundColor();
+ m_haveOriginalBackground = true;
+ }
+
+ m_transport->LCDBoxFrame->setPaletteBackgroundColor(c);
+ m_transport->NegativePixmap->setPaletteBackgroundColor(c);
+ m_transport->TenHoursPixmap->setPaletteBackgroundColor(c);
+ m_transport->UnitHoursPixmap->setPaletteBackgroundColor(c);
+ m_transport->TimeDisplayLabel->setPaletteBackgroundColor(c);
+
+ /* this is a bit more thorough, but too slow and flickery:
+
+ const QObjectList *children = m_transport->LCDBoxFrame->children();
+ QObjectListIt it(*children);
+ QObject *obj;
+
+ while ((obj = it.current()) != 0) {
+
+ QWidget *w = dynamic_cast<QWidget *>(obj);
+ if (w) {
+ w->setPaletteBackgroundColor(c);
+ }
+ ++it;
+ }
+
+ */
+
+ m_isBackgroundSet = true;
+}
+
+void
+TransportDialog::slotResetBackground()
+{
+ if (m_isBackgroundSet) {
+ slotSetBackground(m_originalBackground);
+ }
+ m_isBackgroundSet = false;
+}
+
+}
+#include "TransportDialog.moc"
diff --git a/src/gui/dialogs/TransportDialog.h b/src/gui/dialogs/TransportDialog.h
new file mode 100644
index 0000000..e5c4948
--- /dev/null
+++ b/src/gui/dialogs/TransportDialog.h
@@ -0,0 +1,231 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_ROSEGARDENTRANSPORTDIALOG_H_
+#define _RG_ROSEGARDENTRANSPORTDIALOG_H_
+
+#include <map>
+#include <kdockwidget.h>
+#include <qcolor.h>
+#include <qpixmap.h>
+#include "base/Composition.h" // for tempoT
+#include "RosegardenTransport.h" // generated by uic
+
+class RosegardenTransport;
+class QWidget;
+class QTimer;
+class QPushButton;
+class QCloseEvent;
+class QAccel;
+
+
+namespace Rosegarden
+{
+
+class TimeSignature;
+class RealTime;
+class MappedEvent;
+
+
+class TransportDialog : public QWidget
+{
+Q_OBJECT
+public:
+ TransportDialog(QWidget *parent=0,
+ const char *name=0,
+ WFlags flags = /*Qt::WStyle_StaysOnTop |*/
+ Qt::WStyle_NormalBorder);
+ ~TransportDialog();
+
+ enum TimeDisplayMode { RealMode, SMPTEMode, BarMode, BarMetronomeMode, FrameMode };
+
+ std::string getCurrentModeAsString();
+ TimeDisplayMode getCurrentMode() { return m_currentMode; }
+ void setNewMode(const std::string& newModeAsString);
+ void setNewMode(const TimeDisplayMode& newMode);
+ bool isShowingTimeToEnd();
+ bool isExpanded();
+
+ void displayRealTime(const RealTime &rt);
+ void displaySMPTETime(const RealTime &rt);
+ void displayFrameTime(const RealTime &rt);
+ void displayBarTime(int bar, int beat, int unit);
+
+ void setTempo(const tempoT &tempo);
+ void setTimeSignature(const TimeSignature &timeSig);
+
+ void setSMPTEResolution(int framesPerSecond, int bitsPerFrame);
+ void getSMPTEResolution(int &framesPerSecond, int &bitsPerFrame);
+
+ // Called indirectly from the sequencer and from the GUI to
+ // show incoming and outgoing MIDI events on the Transport
+ //
+ void setMidiInLabel(const MappedEvent *mE);
+ void setMidiOutLabel(const MappedEvent *mE);
+
+ // Return the accelerator object
+ //
+ QAccel* getAccelerators() { return m_accelerators; }
+
+ // RosegardenTransport member accessors
+ QPushButton* MetronomeButton() { return m_transport->MetronomeButton; }
+ QPushButton* SoloButton() { return m_transport->SoloButton; }
+ QPushButton* LoopButton() { return m_transport->LoopButton; }
+ QPushButton* PlayButton() { return m_transport->PlayButton; }
+ QPushButton* StopButton() { return m_transport->StopButton; }
+ QPushButton* FfwdButton() { return m_transport->FfwdButton; }
+ QPushButton* RewindButton() { return m_transport->RewindButton; }
+ QPushButton* RecordButton() { return m_transport->RecordButton; }
+ QPushButton* RewindEndButton() { return m_transport->RewindEndButton; }
+ QPushButton* FfwdEndButton() { return m_transport->FfwdEndButton; }
+ QPushButton* TimeDisplayButton() { return m_transport->TimeDisplayButton; }
+ QPushButton* ToEndButton() { return m_transport->ToEndButton; }
+
+ virtual void show();
+ virtual void hide();
+
+protected:
+ virtual void closeEvent(QCloseEvent * e);
+ void computeSampleRate();
+ void cycleThroughModes();
+ void displayTime();
+
+public slots:
+
+ // These two slots are activated by QTimers
+ //
+ void slotClearMidiInLabel();
+ void slotClearMidiOutLabel();
+
+ // These just change the little labels that say what
+ // mode we're in, nothing else
+ //
+ void slotChangeTimeDisplay();
+ void slotChangeToEnd();
+
+ void slotLoopButtonClicked();
+
+ void slotPanelOpenButtonClicked();
+ void slotPanelCloseButtonClicked();
+
+ void slotEditTempo();
+ void slotEditTimeSignature();
+ void slotEditTime();
+
+ void slotSetBackground(QColor);
+ void slotResetBackground();
+
+ void slotSetStartLoopingPointAtMarkerPos();
+ void slotSetStopLoopingPointAtMarkerPos();
+
+signals:
+ void closed();
+
+ // Set and unset the loop at the RosegardenGUIApp
+ //
+ void setLoop();
+ void unsetLoop();
+ void setLoopStartTime();
+ void setLoopStopTime();
+
+ void editTempo(QWidget *);
+ void editTimeSignature(QWidget *);
+ void editTransportTime(QWidget *);
+ void scrollTempo(int);
+ void panic();
+
+private:
+ void loadPixmaps();
+ void resetFonts();
+ void resetFont(QWidget *);
+ void initModeMap();
+
+ //--------------- Data members ---------------------------------
+
+ RosegardenTransport* m_transport;
+
+ std::map<int, QPixmap> m_lcdList;
+ QPixmap m_lcdNegative;
+
+ int m_lastTenHours;
+ int m_lastUnitHours;
+ int m_lastTenMinutes;
+ int m_lastUnitMinutes;
+ int m_lastTenSeconds;
+ int m_lastUnitSeconds;
+ int m_lastTenths;
+ int m_lastHundreths;
+ int m_lastThousandths;
+ int m_lastTenThousandths;
+
+ bool m_lastNegative;
+ TimeDisplayMode m_lastMode;
+ TimeDisplayMode m_currentMode;
+
+ int m_tenHours;
+ int m_unitHours;
+ int m_tenMinutes;
+ int m_unitMinutes;
+ int m_tenSeconds;
+ int m_unitSeconds;
+ int m_tenths;
+ int m_hundreths;
+ int m_thousandths;
+ int m_tenThousandths;
+
+ tempoT m_tempo;
+ int m_numerator;
+ int m_denominator;
+
+ int m_framesPerSecond;
+ int m_bitsPerFrame;
+
+ QTimer *m_midiInTimer;
+ QTimer *m_midiOutTimer;
+ QTimer *m_clearMetronomeTimer;
+
+ QPixmap m_panelOpen;
+ QPixmap m_panelClosed;
+
+ void updateTimeDisplay();
+
+ QAccel *m_accelerators;
+ bool m_isExpanded;
+
+ bool m_haveOriginalBackground;
+ bool m_isBackgroundSet;
+ QColor m_originalBackground;
+
+ int m_sampleRate;
+
+ std::map<std::string, TimeDisplayMode> m_modeMap;
+};
+
+
+
+
+
+}
+
+#endif
diff --git a/src/gui/dialogs/TriggerSegmentDialog.cpp b/src/gui/dialogs/TriggerSegmentDialog.cpp
new file mode 100644
index 0000000..a5064e1
--- /dev/null
+++ b/src/gui/dialogs/TriggerSegmentDialog.cpp
@@ -0,0 +1,181 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "TriggerSegmentDialog.h"
+#include <kapplication.h>
+
+#include "base/BaseProperties.h"
+#include <klocale.h>
+#include "misc/Strings.h"
+#include "document/ConfigGroups.h"
+#include "base/Composition.h"
+#include "base/TriggerSegment.h"
+#include <kcombobox.h>
+#include <kconfig.h>
+#include <kdialogbase.h>
+#include <qcheckbox.h>
+#include <qframe.h>
+#include <qlabel.h>
+#include <qstring.h>
+#include <qvbox.h>
+#include <qwidget.h>
+#include <qlayout.h>
+
+
+namespace Rosegarden
+{
+
+TriggerSegmentDialog::TriggerSegmentDialog(QWidget *parent,
+ Composition *composition) :
+ KDialogBase(parent, "triggersegmentdialog", true, i18n("Trigger Segment"),
+ Ok | Cancel, Ok),
+ m_composition(composition)
+{
+ QVBox *vbox = makeVBoxMainWidget();
+
+ QFrame *frame = new QFrame(vbox);
+ QGridLayout *layout = new QGridLayout(frame, 3, 2, 5, 5);
+
+ QLabel *label = new QLabel(i18n("Trigger segment: "), frame);
+ layout->addWidget(label, 0, 0);
+
+ m_segment = new KComboBox(frame);
+ layout->addWidget(m_segment, 0, 1);
+
+ int n = 1;
+ for (Composition::triggersegmentcontaineriterator i =
+ m_composition->getTriggerSegments().begin();
+ i != m_composition->getTriggerSegments().end(); ++i) {
+ m_segment->insertItem
+ (QString("%1. %2").arg(n++).arg(strtoqstr((*i)->getSegment()->getLabel())));
+ }
+
+ label = new QLabel(i18n("Perform with timing: "), frame);
+ layout->addWidget(label, 1, 0);
+
+ m_adjustTime = new KComboBox(frame);
+ layout->addWidget(m_adjustTime, 1, 1);
+
+ m_adjustTime->insertItem(i18n("As stored"));
+ m_adjustTime->insertItem(i18n("Truncate if longer than note"));
+ m_adjustTime->insertItem(i18n("End at same time as note"));
+ m_adjustTime->insertItem(i18n("Stretch or squash segment to note duration"));
+
+ m_retune = new QCheckBox(i18n("Adjust pitch to note"), frame);
+ m_retune->setChecked(true);
+
+ layout->addWidget(m_retune, 2, 1);
+
+ setupFromConfig();
+}
+
+void
+TriggerSegmentDialog::setupFromConfig()
+{
+ KConfig *config = kapp->config();
+ config->setGroup(GeneralOptionsConfigGroup);
+
+ int seg = config->readNumEntry("triggersegmentlastornament", 0);
+ std::string timing = qstrtostr
+ (config->readEntry
+ ("triggersegmenttiming",
+ strtoqstr(BaseProperties::TRIGGER_SEGMENT_ADJUST_SQUISH)));
+ bool retune = config->readBoolEntry("triggersegmentretune", true);
+
+ if (seg >= 0 && seg < m_segment->count())
+ m_segment->setCurrentItem(seg);
+
+ if (timing == BaseProperties::TRIGGER_SEGMENT_ADJUST_NONE) {
+ m_adjustTime->setCurrentItem(0);
+ } else if (timing == BaseProperties::TRIGGER_SEGMENT_ADJUST_SQUISH) {
+ m_adjustTime->setCurrentItem(3);
+ } else if (timing == BaseProperties::TRIGGER_SEGMENT_ADJUST_SYNC_START) {
+ m_adjustTime->setCurrentItem(1);
+ } else if (timing == BaseProperties::TRIGGER_SEGMENT_ADJUST_SYNC_END) {
+ m_adjustTime->setCurrentItem(2);
+ }
+
+ m_retune->setChecked(retune);
+}
+
+TriggerSegmentId
+TriggerSegmentDialog::getId() const
+{
+ int ix = m_segment->currentItem();
+
+ for (Composition::triggersegmentcontaineriterator i =
+ m_composition->getTriggerSegments().begin();
+ i != m_composition->getTriggerSegments().end(); ++i) {
+
+ if (ix == 0)
+ return (*i)->getId();
+ --ix;
+ }
+
+ return 0;
+}
+
+bool
+TriggerSegmentDialog::getRetune() const
+{
+ return m_retune->isChecked();
+}
+
+std::string
+TriggerSegmentDialog::getTimeAdjust() const
+{
+ int option = m_adjustTime->currentItem();
+
+ switch (option) {
+
+ case 0:
+ return BaseProperties::TRIGGER_SEGMENT_ADJUST_NONE;
+ case 1:
+ return BaseProperties::TRIGGER_SEGMENT_ADJUST_SYNC_START;
+ case 2:
+ return BaseProperties::TRIGGER_SEGMENT_ADJUST_SYNC_END;
+ case 3:
+ return BaseProperties::TRIGGER_SEGMENT_ADJUST_SQUISH;
+
+ default:
+ return BaseProperties::TRIGGER_SEGMENT_ADJUST_NONE;
+ }
+}
+
+void
+TriggerSegmentDialog::slotOk()
+{
+ KConfig *config = kapp->config();
+ config->setGroup(GeneralOptionsConfigGroup);
+
+ config->writeEntry("triggersegmenttiming", strtoqstr(getTimeAdjust()));
+ config->writeEntry("triggersegmentretune", m_retune->isChecked());
+ config->writeEntry("triggersegmentlastornament", m_segment->currentItem());
+
+ accept();
+}
+
+}
+#include "TriggerSegmentDialog.moc"
diff --git a/src/gui/dialogs/TriggerSegmentDialog.h b/src/gui/dialogs/TriggerSegmentDialog.h
new file mode 100644
index 0000000..3f74f45
--- /dev/null
+++ b/src/gui/dialogs/TriggerSegmentDialog.h
@@ -0,0 +1,71 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_TRIGGERSEGMENTDIALOG_H_
+#define _RG_TRIGGERSEGMENTDIALOG_H_
+
+#include "base/TriggerSegment.h"
+#include <string>
+#include <kdialogbase.h>
+
+
+class QWidget;
+class QCheckBox;
+class KComboBox;
+
+
+namespace Rosegarden
+{
+
+class Composition;
+
+
+class TriggerSegmentDialog : public KDialogBase
+{
+ Q_OBJECT
+
+public:
+ TriggerSegmentDialog(QWidget *parent, Composition *);
+
+ TriggerSegmentId getId() const;
+ bool getRetune() const;
+ std::string getTimeAdjust() const;
+
+public slots:
+ void slotOk();
+
+protected:
+ void setupFromConfig();
+
+ Composition *m_composition;
+ KComboBox *m_segment;
+ QCheckBox *m_retune;
+ KComboBox *m_adjustTime;
+};
+
+
+}
+
+#endif
diff --git a/src/gui/dialogs/TupletDialog.cpp b/src/gui/dialogs/TupletDialog.cpp
new file mode 100644
index 0000000..ed1c583
--- /dev/null
+++ b/src/gui/dialogs/TupletDialog.cpp
@@ -0,0 +1,365 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "TupletDialog.h"
+#include <qlayout.h>
+
+#include <klocale.h>
+#include "base/NotationTypes.h"
+#include "gui/editors/notation/NotationStrings.h"
+#include "gui/editors/notation/NotePixmapFactory.h"
+#include <kcombobox.h>
+#include <kdialogbase.h>
+#include <qcheckbox.h>
+#include <qframe.h>
+#include <qgrid.h>
+#include <qgroupbox.h>
+#include <qlabel.h>
+#include <qobject.h>
+#include <qstring.h>
+#include <qvbox.h>
+#include <qwidget.h>
+
+
+namespace Rosegarden
+{
+
+TupletDialog::TupletDialog(QWidget *parent, Note::Type defaultUnitType,
+ timeT maxDuration) :
+ KDialogBase(parent, 0, true, i18n("Tuplet"), Ok | Cancel | Help),
+ m_maxDuration(maxDuration)
+{
+ setHelp("nv-tuplets");
+ QVBox *vbox = makeVBoxMainWidget();
+
+ QGroupBox *timingBox = new QGroupBox
+ (1, Horizontal, i18n("New timing for tuplet group"), vbox);
+
+ if (m_maxDuration > 0) {
+
+ // bit of a sanity check
+ if (maxDuration < Note(Note::Semiquaver).getDuration()) {
+ maxDuration = Note(Note::Semiquaver).getDuration();
+ }
+
+ Note::Type maxUnitType =
+ Note::getNearestNote(maxDuration / 2, 0).getNoteType();
+ if (defaultUnitType > maxUnitType)
+ defaultUnitType = maxUnitType;
+ }
+
+ QFrame *timingFrame = new QFrame(timingBox);
+ QGridLayout *timingLayout = new QGridLayout(timingFrame, 3, 3, 5, 5);
+
+ timingLayout->addWidget(new QLabel(i18n("Play "), timingFrame), 0, 0);
+
+ m_untupledCombo = new KComboBox(timingFrame);
+ timingLayout->addWidget(m_untupledCombo, 0, 1);
+
+ m_unitCombo = new KComboBox(timingFrame);
+ timingLayout->addWidget(m_unitCombo, 0, 2);
+
+ for (Note::Type t = Note::Shortest; t <= Note::Longest; ++t) {
+ Note note(t);
+ timeT duration(note.getDuration());
+ if (maxDuration > 0 && (2 * duration > maxDuration))
+ break;
+ timeT e; // error factor, ignore
+ m_unitCombo->insertItem(NotePixmapFactory::toQPixmap
+ (NotePixmapFactory::makeNoteMenuPixmap(duration, e)),
+ NotationStrings::makeNoteMenuLabel(duration, false, e, true));
+ if (defaultUnitType == t) {
+ m_unitCombo->setCurrentItem(m_unitCombo->count() - 1);
+ }
+ }
+
+ timingLayout->addWidget(new QLabel(i18n("in the time of "), timingFrame), 1, 0);
+
+ m_tupledCombo = new KComboBox(timingFrame);
+ timingLayout->addWidget(m_tupledCombo, 1, 1);
+
+ m_hasTimingAlready = new QCheckBox
+ (i18n("Timing is already correct: update display only"), timingFrame);
+ m_hasTimingAlready->setChecked(false);
+ timingLayout->addMultiCellWidget(m_hasTimingAlready, 2, 2, 0, 2);
+
+ connect(m_hasTimingAlready, SIGNAL(clicked()), this, SLOT(slotHasTimingChanged()));
+
+ updateUntupledCombo();
+ updateTupledCombo();
+
+ m_timingDisplayBox = new QGroupBox
+ (1, Horizontal, i18n("Timing calculations"), vbox);
+
+ QGrid *timingDisplayGrid = new QGrid(3, QGrid::Horizontal, m_timingDisplayBox);
+
+ if (maxDuration > 0) {
+
+ new QLabel(i18n("Selected region:"), timingDisplayGrid);
+ new QLabel("", timingDisplayGrid);
+ m_selectionDurationDisplay = new QLabel("x", timingDisplayGrid);
+ m_selectionDurationDisplay->setAlignment(int(QLabel::AlignVCenter |
+ QLabel::AlignRight));
+ } else {
+ m_selectionDurationDisplay = 0;
+ }
+
+ new QLabel(i18n("Group with current timing:"), timingDisplayGrid);
+ m_untupledDurationCalculationDisplay = new QLabel("x", timingDisplayGrid);
+ m_untupledDurationDisplay = new QLabel("x", timingDisplayGrid);
+ m_untupledDurationDisplay->setAlignment(int(QLabel::AlignVCenter |
+ QLabel::AlignRight));
+
+ new QLabel(i18n("Group with new timing:"), timingDisplayGrid);
+ m_tupledDurationCalculationDisplay = new QLabel("x", timingDisplayGrid);
+ m_tupledDurationDisplay = new QLabel("x", timingDisplayGrid);
+ m_tupledDurationDisplay->setAlignment(int(QLabel::AlignVCenter |
+ QLabel::AlignRight));
+
+ new QLabel(i18n("Gap created by timing change:"), timingDisplayGrid);
+ m_newGapDurationCalculationDisplay = new QLabel("x", timingDisplayGrid);
+ m_newGapDurationDisplay = new QLabel("x", timingDisplayGrid);
+ m_newGapDurationDisplay->setAlignment(int(QLabel::AlignVCenter |
+ QLabel::AlignRight));
+
+ if (maxDuration > 0) {
+
+ new QLabel(i18n("Unchanged at end of selection:"), timingDisplayGrid);
+ m_unchangedDurationCalculationDisplay = new QLabel
+ ("x", timingDisplayGrid);
+ m_unchangedDurationDisplay = new QLabel("x", timingDisplayGrid);
+ m_unchangedDurationDisplay->setAlignment(int(QLabel::AlignVCenter |
+ QLabel::AlignRight));
+
+ } else {
+ m_unchangedDurationDisplay = 0;
+ }
+
+ updateTimingDisplays();
+
+ QObject::connect(m_unitCombo, SIGNAL(activated(const QString &)),
+ this, SLOT(slotUnitChanged(const QString &)));
+
+ QObject::connect(m_untupledCombo, SIGNAL(activated(const QString &)),
+ this, SLOT(slotUntupledChanged(const QString &)));
+ QObject::connect(m_untupledCombo, SIGNAL(textChanged(const QString &)),
+ this, SLOT(slotUntupledChanged(const QString &)));
+
+ QObject::connect(m_tupledCombo, SIGNAL(activated(const QString &)),
+ this, SLOT(slotTupledChanged(const QString &)));
+ QObject::connect(m_tupledCombo, SIGNAL(textChanged(const QString &)),
+ this, SLOT(slotTupledChanged(const QString &)));
+}
+
+void
+TupletDialog::slotHasTimingChanged()
+{
+ updateUntupledCombo();
+ updateTupledCombo();
+ m_timingDisplayBox->setEnabled(!m_hasTimingAlready->isChecked());
+}
+
+Note::Type
+TupletDialog::getUnitType() const
+{
+ return Note::Shortest + m_unitCombo->currentItem();
+}
+
+int
+TupletDialog::getUntupledCount() const
+{
+ bool isNumeric = true;
+ int count = m_untupledCombo->currentText().toInt(&isNumeric);
+ if (count == 0 || !isNumeric)
+ return 1;
+ else
+ return count;
+}
+
+int
+TupletDialog::getTupledCount() const
+{
+ bool isNumeric = true;
+ int count = m_tupledCombo->currentText().toInt(&isNumeric);
+ if (count == 0 || !isNumeric)
+ return 1;
+ else
+ return count;
+}
+
+bool
+TupletDialog::hasTimingAlready() const
+{
+ return m_hasTimingAlready->isChecked();
+}
+
+void
+TupletDialog::updateUntupledCombo()
+{
+ // Untupled combo can contain numbers up to the maximum
+ // duration divided by the unit duration. If there's no
+ // maximum, we'll have to put in some likely values and
+ // allow the user to edit it. Both the numerical combos
+ // should possibly be spinboxes, except I think I like
+ // being able to "suggest" a few values
+
+ int maxValue = 12;
+
+ if (m_maxDuration) {
+ if (m_hasTimingAlready->isChecked()) {
+ maxValue = (m_maxDuration * 2) / Note(getUnitType()).getDuration();
+ } else {
+ maxValue = m_maxDuration / Note(getUnitType()).getDuration();
+ }
+ }
+
+ QString previousText = m_untupledCombo->currentText();
+ if (previousText.toInt() == 0) {
+ if (maxValue < 3)
+ previousText = QString("%1").arg(maxValue);
+ else
+ previousText = "3";
+ }
+
+ m_untupledCombo->clear();
+ bool setText = false;
+
+ for (int i = 1; i <= maxValue; ++i) {
+ QString text = QString("%1").arg(i);
+ m_untupledCombo->insertItem(text);
+ if (m_hasTimingAlready->isChecked()) {
+ if (i == (m_maxDuration * 3) / (Note(getUnitType()).getDuration()*2)) {
+ m_untupledCombo->setCurrentItem(m_untupledCombo->count() - 1);
+ }
+ } else if (text == previousText) {
+ m_untupledCombo->setCurrentItem(m_untupledCombo->count() - 1);
+ setText = true;
+ }
+ }
+
+ if (!setText) {
+ m_untupledCombo->setEditText(previousText);
+ }
+}
+
+void
+TupletDialog::updateTupledCombo()
+{
+ // should contain all positive integers less than the
+ // largest value in the untupled combo. In principle
+ // we can support values larger, but we can't quite
+ // do the tupleting transformation yet
+
+ int untupled = getUntupledCount();
+
+ QString previousText = m_tupledCombo->currentText();
+ if (previousText.toInt() == 0 ||
+ previousText.toInt() > untupled) {
+ if (untupled < 2)
+ previousText = QString("%1").arg(untupled);
+ else
+ previousText = "2";
+ }
+
+ m_tupledCombo->clear();
+
+ for (int i = 1; i < untupled; ++i) {
+ QString text = QString("%1").arg(i);
+ m_tupledCombo->insertItem(text);
+ if (m_hasTimingAlready->isChecked()) {
+ if (i == m_maxDuration / Note(getUnitType()).getDuration()) {
+ m_tupledCombo->setCurrentItem(m_tupledCombo->count() - 1);
+ }
+ } else if (text == previousText) {
+ m_tupledCombo->setCurrentItem(m_tupledCombo->count() - 1);
+ }
+ }
+}
+
+void
+TupletDialog::updateTimingDisplays()
+{
+ timeT unitDuration = Note(getUnitType()).getDuration();
+
+ int untupledCount = getUntupledCount();
+ int tupledCount = getTupledCount();
+
+ timeT untupledDuration = unitDuration * untupledCount;
+ timeT tupledDuration = unitDuration * tupledCount;
+
+ if (m_selectionDurationDisplay) {
+ m_selectionDurationDisplay->setText(QString("%1").arg(m_maxDuration));
+ }
+
+ m_untupledDurationCalculationDisplay->setText
+ (QString(" %1 x %2 = ").arg(untupledCount).arg(unitDuration));
+ m_untupledDurationDisplay->setText
+ (QString("%1").arg(untupledDuration));
+
+ m_tupledDurationCalculationDisplay->setText
+ (QString(" %1 x %2 = ").arg(tupledCount).arg(unitDuration));
+ m_tupledDurationDisplay->setText
+ (QString("%1").arg(tupledDuration));
+
+ m_newGapDurationCalculationDisplay->setText
+ (QString(" %1 - %2 = ").arg(untupledDuration).arg(tupledDuration));
+ m_newGapDurationDisplay->setText
+ (QString("%1").arg(untupledDuration - tupledDuration));
+
+ if (m_selectionDurationDisplay && m_unchangedDurationDisplay) {
+ if (m_maxDuration != untupledDuration) {
+ m_unchangedDurationCalculationDisplay->setText
+ (QString(" %1 - %2 = ").arg(m_maxDuration).arg(untupledDuration));
+ } else {
+ m_unchangedDurationCalculationDisplay->setText("");
+ }
+ m_unchangedDurationDisplay->setText
+ (QString("%1").arg(m_maxDuration - untupledDuration));
+ }
+}
+
+void
+TupletDialog::slotUnitChanged(const QString &)
+{
+ updateUntupledCombo();
+ updateTupledCombo();
+ updateTimingDisplays();
+}
+
+void
+TupletDialog::slotUntupledChanged(const QString &)
+{
+ updateTupledCombo();
+ updateTimingDisplays();
+}
+
+void
+TupletDialog::slotTupledChanged(const QString &)
+{
+ updateTimingDisplays();
+}
+
+}
+#include "TupletDialog.moc"
diff --git a/src/gui/dialogs/TupletDialog.h b/src/gui/dialogs/TupletDialog.h
new file mode 100644
index 0000000..bc7252b
--- /dev/null
+++ b/src/gui/dialogs/TupletDialog.h
@@ -0,0 +1,99 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_TUPLETDIALOG_H_
+#define _RG_TUPLETDIALOG_H_
+
+#include "base/NotationTypes.h"
+#include <kdialogbase.h>
+#include "base/Event.h"
+
+
+class QWidget;
+class QString;
+class QLabel;
+class QGroupBox;
+class QCheckBox;
+class KComboBox;
+
+
+namespace Rosegarden
+{
+
+
+
+class TupletDialog : public KDialogBase
+{
+ Q_OBJECT
+
+public:
+ TupletDialog(QWidget *parent,
+ Note::Type defaultUnitType,
+ timeT maxDuration = 0);
+
+ Note::Type getUnitType() const;
+ int getUntupledCount() const;
+ int getTupledCount() const;
+ bool hasTimingAlready() const;
+
+public slots:
+ void slotUnitChanged(const QString &);
+ void slotUntupledChanged(const QString &);
+ void slotTupledChanged(const QString &);
+ void slotHasTimingChanged();
+
+protected:
+
+ void updateUntupledCombo();
+ void updateTupledCombo();
+ void updateTimingDisplays();
+
+ //--------------- Data members ---------------------------------
+
+ KComboBox *m_unitCombo;
+ KComboBox *m_untupledCombo;
+ KComboBox *m_tupledCombo;
+
+ QCheckBox *m_hasTimingAlready;
+
+ QGroupBox *m_timingDisplayBox;
+ QLabel *m_selectionDurationDisplay;
+ QLabel *m_untupledDurationCalculationDisplay;
+ QLabel *m_untupledDurationDisplay;
+ QLabel *m_tupledDurationCalculationDisplay;
+ QLabel *m_tupledDurationDisplay;
+ QLabel *m_newGapDurationCalculationDisplay;
+ QLabel *m_newGapDurationDisplay;
+ QLabel *m_unchangedDurationCalculationDisplay;
+ QLabel *m_unchangedDurationDisplay;
+
+ timeT m_maxDuration;
+};
+
+
+
+}
+
+#endif
diff --git a/src/gui/dialogs/UnusedAudioSelectionDialog.cpp b/src/gui/dialogs/UnusedAudioSelectionDialog.cpp
new file mode 100644
index 0000000..0a44168
--- /dev/null
+++ b/src/gui/dialogs/UnusedAudioSelectionDialog.cpp
@@ -0,0 +1,92 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "UnusedAudioSelectionDialog.h"
+
+#include <klocale.h>
+#include <kdialogbase.h>
+#include <klistview.h>
+#include <qfileinfo.h>
+#include <qlabel.h>
+#include <qlistview.h>
+#include <qstring.h>
+#include <qvbox.h>
+#include <qwidget.h>
+
+
+namespace Rosegarden
+{
+
+UnusedAudioSelectionDialog::UnusedAudioSelectionDialog(QWidget *parent,
+ QString introductoryText,
+ std::vector<QString> fileNames,
+ bool offerCancel) :
+ KDialogBase(parent, 0, true, i18n("Select Unused Audio Files"), (offerCancel ? (Ok | Cancel) : Ok))
+{
+ QVBox *vbox = makeVBoxMainWidget();
+ new QLabel(introductoryText, vbox);
+
+ m_listView = new KListView(vbox);
+
+ m_listView->addColumn(i18n("File name"));
+ m_listView->addColumn(i18n("File size"));
+ m_listView->addColumn(i18n("Last modified date"));
+
+ for (unsigned int i = 0; i < fileNames.size(); ++i) {
+ QString fileName = fileNames[i];
+ QFileInfo info(fileName);
+ QString fileSize = i18n(" (not found) ");
+ QString fileDate;
+ if (info.exists()) {
+ fileSize = QString(" %1 ").arg(info.size());
+ fileDate = QString(" %1 ").arg(info.lastModified().toString());
+ }
+ QListViewItem *item = new KListViewItem
+ (m_listView, fileName, fileSize, fileDate);
+ }
+
+ m_listView->setSelectionMode(QListView::Multi);
+}
+
+std::vector<QString>
+UnusedAudioSelectionDialog::getSelectedAudioFileNames() const
+{
+ std::vector<QString> selectedNames;
+
+ QListViewItem *item = m_listView->firstChild();
+
+ while (item) {
+
+ if (m_listView->isSelected(item)) {
+ selectedNames.push_back(item->text(0));
+ }
+
+ item = item->nextSibling();
+ }
+
+ return selectedNames;
+}
+
+}
diff --git a/src/gui/dialogs/UnusedAudioSelectionDialog.h b/src/gui/dialogs/UnusedAudioSelectionDialog.h
new file mode 100644
index 0000000..e11301a
--- /dev/null
+++ b/src/gui/dialogs/UnusedAudioSelectionDialog.h
@@ -0,0 +1,62 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_UNUSEDAUDIOSELECTIONDIALOG_H_
+#define _RG_UNUSEDAUDIOSELECTIONDIALOG_H_
+
+#include <kdialogbase.h>
+#include <qstring.h>
+#include <vector>
+
+
+class QWidget;
+class QListView;
+
+
+namespace Rosegarden
+{
+
+
+
+class UnusedAudioSelectionDialog : public KDialogBase
+{
+public:
+ UnusedAudioSelectionDialog(QWidget *,
+ QString introductoryText,
+ std::vector<QString> fileNames,
+ bool offerCancel = true);
+
+ std::vector<QString> getSelectedAudioFileNames() const;
+
+protected:
+ QListView *m_listView;
+};
+
+
+
+
+}
+
+#endif
diff --git a/src/gui/dialogs/UseOrnamentDialog.cpp b/src/gui/dialogs/UseOrnamentDialog.cpp
new file mode 100644
index 0000000..971f170
--- /dev/null
+++ b/src/gui/dialogs/UseOrnamentDialog.cpp
@@ -0,0 +1,264 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "UseOrnamentDialog.h"
+#include <qlayout.h>
+#include <kapplication.h>
+
+#include "base/BaseProperties.h"
+#include <klocale.h>
+#include "misc/Strings.h"
+#include "document/ConfigGroups.h"
+#include "base/Composition.h"
+#include "base/NotationTypes.h"
+#include "base/TriggerSegment.h"
+#include "gui/editors/notation/NotePixmapFactory.h"
+#include <kcombobox.h>
+#include <kconfig.h>
+#include <kdialogbase.h>
+#include <qcheckbox.h>
+#include <qframe.h>
+#include <qgroupbox.h>
+#include <qlabel.h>
+#include <qlineedit.h>
+#include <qstring.h>
+#include <qvbox.h>
+#include <qwidget.h>
+
+
+namespace Rosegarden
+{
+
+UseOrnamentDialog::UseOrnamentDialog(QWidget *parent,
+ Composition *composition) :
+ KDialogBase(parent, "useornamentdialog", true, i18n("Use Ornament"),
+ Ok | Cancel, Ok),
+ m_composition(composition)
+{
+ QVBox *vbox = makeVBoxMainWidget();
+ QLabel *label;
+
+ QGroupBox *notationBox = new QGroupBox(1, Horizontal, i18n("Notation"), vbox);
+
+ QFrame *frame = new QFrame(notationBox);
+ QGridLayout *layout = new QGridLayout(frame, 4, 1, 5, 5);
+
+ label = new QLabel(i18n("Display as: "), frame);
+ layout->addWidget(label, 0, 0);
+
+ m_mark = new KComboBox(frame);
+ layout->addWidget(m_mark, 0, 1);
+
+ m_marks.push_back(Marks::Trill);
+ m_marks.push_back(Marks::LongTrill);
+ m_marks.push_back(Marks::TrillLine);
+ m_marks.push_back(Marks::Turn);
+ m_marks.push_back(Marks::Mordent);
+ m_marks.push_back(Marks::MordentInverted);
+ m_marks.push_back(Marks::MordentLong);
+ m_marks.push_back(Marks::MordentLongInverted);
+
+ const QString markLabels[] = {
+ i18n("Trill"), i18n("Trill with line"), i18n("Trill line only"),
+ i18n("Turn"), i18n("Mordent"), i18n("Inverted mordent"),
+ i18n("Long mordent"), i18n("Long inverted mordent"),
+ };
+
+ for (size_t i = 0; i < m_marks.size(); ++i) {
+ m_mark->insertItem(NotePixmapFactory::toQPixmap
+ (NotePixmapFactory::makeMarkMenuPixmap(m_marks[i])),
+ markLabels[i]);
+ }
+ m_mark->insertItem(i18n("Text mark"));
+
+ connect(m_mark, SIGNAL(activated(int)), this, SLOT(slotMarkChanged(int)));
+
+ m_textLabel = new QLabel(i18n(" Text: "), frame);
+ layout->addWidget(m_textLabel, 0, 2);
+
+ m_text = new QLineEdit(frame);
+ layout->addWidget(m_text, 0, 3);
+
+ QGroupBox *performBox = new QGroupBox(1, Horizontal, i18n("Performance"), vbox);
+
+ frame = new QFrame(performBox);
+ layout = new QGridLayout(frame, 3, 2, 5, 5);
+
+ label = new QLabel(i18n("Perform using triggered segment: "), frame);
+ layout->addWidget(label, 0, 0);
+
+ m_ornament = new KComboBox(frame);
+ layout->addWidget(m_ornament, 0, 1);
+
+ int n = 1;
+ for (Composition::triggersegmentcontaineriterator i =
+ m_composition->getTriggerSegments().begin();
+ i != m_composition->getTriggerSegments().end(); ++i) {
+ m_ornament->insertItem
+ (QString("%1. %2").arg(n++).arg(strtoqstr((*i)->getSegment()->getLabel())));
+ }
+
+ label = new QLabel(i18n("Perform with timing: "), frame);
+ layout->addWidget(label, 1, 0);
+
+ m_adjustTime = new KComboBox(frame);
+ layout->addWidget(m_adjustTime, 1, 1);
+
+ m_adjustTime->insertItem(i18n("As stored"));
+ m_adjustTime->insertItem(i18n("Truncate if longer than note"));
+ m_adjustTime->insertItem(i18n("End at same time as note"));
+ m_adjustTime->insertItem(i18n("Stretch or squash segment to note duration"));
+
+ m_retune = new QCheckBox(i18n("Adjust pitch to note"), frame);
+ m_retune->setChecked(true);
+
+ layout->addWidget(m_retune, 2, 1);
+
+ setupFromConfig();
+}
+
+void
+UseOrnamentDialog::setupFromConfig()
+{
+ KConfig *config = kapp->config();
+ config->setGroup(NotationViewConfigGroup);
+
+ Mark mark = qstrtostr(config->readEntry("useornamentmark", "trill"));
+ int seg = config->readNumEntry("useornamentlastornament", 0);
+ std::string timing = qstrtostr
+ (config->readEntry
+ ("useornamenttiming",
+ strtoqstr(BaseProperties::TRIGGER_SEGMENT_ADJUST_SQUISH)));
+ bool retune = config->readBoolEntry("useornamentretune", true);
+
+ size_t i = 0;
+ for (i = 0; i < m_marks.size(); ++i) {
+ if (mark == m_marks[i]) {
+ m_mark->setCurrentItem(i);
+ m_text->setEnabled(false);
+ break;
+ }
+ }
+ if (i >= m_marks.size()) {
+ m_mark->setCurrentItem(m_marks.size());
+ m_text->setEnabled(true);
+ m_text->setText(strtoqstr(Marks::getTextFromMark(mark)));
+ }
+
+ if (seg >= 0 && seg < m_ornament->count())
+ m_ornament->setCurrentItem(seg);
+
+ if (timing == BaseProperties::TRIGGER_SEGMENT_ADJUST_NONE) {
+ m_adjustTime->setCurrentItem(0);
+ } else if (timing == BaseProperties::TRIGGER_SEGMENT_ADJUST_SQUISH) {
+ m_adjustTime->setCurrentItem(3);
+ } else if (timing == BaseProperties::TRIGGER_SEGMENT_ADJUST_SYNC_START) {
+ m_adjustTime->setCurrentItem(1);
+ } else if (timing == BaseProperties::TRIGGER_SEGMENT_ADJUST_SYNC_END) {
+ m_adjustTime->setCurrentItem(2);
+ }
+
+ m_retune->setChecked(retune);
+}
+
+TriggerSegmentId
+UseOrnamentDialog::getId() const
+{
+ int ix = m_ornament->currentItem();
+
+ for (Composition::triggersegmentcontaineriterator i =
+ m_composition->getTriggerSegments().begin();
+ i != m_composition->getTriggerSegments().end(); ++i) {
+
+ if (ix == 0)
+ return (*i)->getId();
+ --ix;
+ }
+
+ return 0;
+}
+
+Mark
+UseOrnamentDialog::getMark() const
+{
+ if (int(m_marks.size()) > m_mark->currentItem())
+ return m_marks[m_mark->currentItem()];
+ else
+ return Marks::getTextMark(qstrtostr(m_text->text()));
+}
+
+bool
+UseOrnamentDialog::getRetune() const
+{
+ return m_retune->isChecked();
+}
+
+std::string
+UseOrnamentDialog::getTimeAdjust() const
+{
+ int option = m_adjustTime->currentItem();
+
+ switch (option) {
+
+ case 0:
+ return BaseProperties::TRIGGER_SEGMENT_ADJUST_NONE;
+ case 1:
+ return BaseProperties::TRIGGER_SEGMENT_ADJUST_SYNC_START;
+ case 2:
+ return BaseProperties::TRIGGER_SEGMENT_ADJUST_SYNC_END;
+ case 3:
+ return BaseProperties::TRIGGER_SEGMENT_ADJUST_SQUISH;
+
+ default:
+ return BaseProperties::TRIGGER_SEGMENT_ADJUST_NONE;
+ }
+}
+
+void
+UseOrnamentDialog::slotMarkChanged(int i)
+{
+ if (i == 2) {
+ m_text->setEnabled(true);
+ } else {
+ m_text->setEnabled(false);
+ }
+}
+
+void
+UseOrnamentDialog::slotOk()
+{
+ KConfig *config = kapp->config();
+ config->setGroup(NotationViewConfigGroup);
+
+ config->writeEntry("useornamentmark", strtoqstr(getMark()));
+ config->writeEntry("useornamenttiming", strtoqstr(getTimeAdjust()));
+ config->writeEntry("useornamentretune", m_retune->isChecked());
+ config->writeEntry("useornamentlastornament", m_ornament->currentItem());
+
+ accept();
+}
+
+}
+#include "UseOrnamentDialog.moc"
diff --git a/src/gui/dialogs/UseOrnamentDialog.h b/src/gui/dialogs/UseOrnamentDialog.h
new file mode 100644
index 0000000..d721329
--- /dev/null
+++ b/src/gui/dialogs/UseOrnamentDialog.h
@@ -0,0 +1,82 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_USEORNAMENTDIALOG_H_
+#define _RG_USEORNAMENTDIALOG_H_
+
+#include "base/TriggerSegment.h"
+#include "base/NotationTypes.h"
+#include <string>
+#include <kdialogbase.h>
+#include <vector>
+
+
+class QWidget;
+class QLineEdit;
+class QLabel;
+class QCheckBox;
+class KComboBox;
+
+
+namespace Rosegarden
+{
+
+class Composition;
+
+
+class UseOrnamentDialog : public KDialogBase
+{
+ Q_OBJECT
+
+public:
+ UseOrnamentDialog(QWidget *parent, Composition *);
+
+ TriggerSegmentId getId() const;
+ Mark getMark() const;
+ bool getRetune() const;
+ std::string getTimeAdjust() const;
+
+public slots:
+ void slotOk();
+ void slotMarkChanged(int);
+
+protected:
+ void setupFromConfig();
+
+ std::vector<Mark> m_marks;
+
+ Composition *m_composition;
+ KComboBox *m_ornament;
+ KComboBox *m_mark;
+ QLabel *m_textLabel;
+ QLineEdit *m_text;
+ QCheckBox *m_retune;
+ KComboBox *m_adjustTime;
+};
+
+
+}
+
+#endif
diff --git a/src/gui/editors/eventlist/EventView.cpp b/src/gui/editors/eventlist/EventView.cpp
new file mode 100644
index 0000000..13bd294
--- /dev/null
+++ b/src/gui/editors/eventlist/EventView.cpp
@@ -0,0 +1,1606 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "EventView.h"
+#include "EventViewItem.h"
+#include "TrivialVelocityDialog.h"
+#include "base/BaseProperties.h"
+#include "misc/Debug.h"
+#include "misc/Strings.h"
+#include "base/Clipboard.h"
+#include "base/Event.h"
+#include "base/MidiTypes.h"
+#include "base/NotationTypes.h"
+#include "base/RealTime.h"
+#include "base/Segment.h"
+#include "base/SegmentPerformanceHelper.h"
+#include "base/Selection.h"
+#include "base/Track.h"
+#include "base/TriggerSegment.h"
+#include "commands/edit/CopyCommand.h"
+#include "commands/edit/CutCommand.h"
+#include "commands/edit/EraseCommand.h"
+#include "commands/edit/EventEditCommand.h"
+#include "commands/edit/PasteEventsCommand.h"
+#include "commands/edit/EventInsertionCommand.h"
+#include "commands/segment/SegmentLabelCommand.h"
+#include "commands/segment/SetTriggerSegmentBasePitchCommand.h"
+#include "commands/segment/SetTriggerSegmentBaseVelocityCommand.h"
+#include "commands/segment/SetTriggerSegmentDefaultRetuneCommand.h"
+#include "commands/segment/SetTriggerSegmentDefaultTimeAdjustCommand.h"
+#include "document/RosegardenGUIDoc.h"
+#include "document/ConfigGroups.h"
+#include "gui/dialogs/EventEditDialog.h"
+#include "gui/dialogs/PitchDialog.h"
+#include "gui/dialogs/SimpleEventEditDialog.h"
+#include "gui/general/EditViewBase.h"
+#include "gui/general/MidiPitchLabel.h"
+#include "gui/kdeext/KTmpStatusMsg.h"
+#include "gui/dialogs/EventFilterDialog.h"
+#include <kaction.h>
+#include <kconfig.h>
+#include <klocale.h>
+#include <kstatusbar.h>
+#include <kstddirs.h>
+#include <kglobal.h>
+#include <klineeditdlg.h>
+#include <klistview.h>
+#include <kxmlguiclient.h>
+#include <qbuttongroup.h>
+#include <qcanvas.h>
+#include <qcheckbox.h>
+#include <qdialog.h>
+#include <qframe.h>
+#include <qgroupbox.h>
+#include <qiconset.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qlistview.h>
+#include <qpixmap.h>
+#include <qpoint.h>
+#include <qpopupmenu.h>
+#include <qpushbutton.h>
+#include <qsize.h>
+#include <qstring.h>
+#include <qwidget.h>
+#include <algorithm>
+
+
+namespace Rosegarden
+{
+
+int
+EventView::m_lastSetEventFilter = -1;
+
+
+EventView::EventView(RosegardenGUIDoc *doc,
+ std::vector<Segment *> segments,
+ QWidget *parent):
+ EditViewBase(doc, segments, 2, parent, "eventview"),
+ m_eventFilter(Note | Text | SystemExclusive | Controller |
+ ProgramChange | PitchBend | Indication | Other),
+ m_menu(0)
+{
+ m_isTriggerSegment = false;
+ m_triggerName = m_triggerPitch = m_triggerVelocity = 0;
+
+ if (!segments.empty()) {
+ Segment *s = *segments.begin();
+ if (s->getComposition()) {
+ int id = s->getComposition()->getTriggerSegmentId(s);
+ if (id >= 0)
+ m_isTriggerSegment = true;
+ }
+ }
+
+ if (m_lastSetEventFilter < 0)
+ m_lastSetEventFilter = m_eventFilter;
+ else
+ m_eventFilter = m_lastSetEventFilter;
+
+ initStatusBar();
+ setupActions();
+
+ // define some note filtering buttons in a group
+ //
+ m_filterGroup =
+ new QButtonGroup(1, Horizontal, i18n("Event filters"), getCentralWidget());
+
+ m_noteCheckBox = new QCheckBox(i18n("Note"), m_filterGroup);
+ m_programCheckBox = new QCheckBox(i18n("Program Change"), m_filterGroup);
+ m_controllerCheckBox = new QCheckBox(i18n("Controller"), m_filterGroup);
+ m_pitchBendCheckBox = new QCheckBox(i18n("Pitch Bend"), m_filterGroup);
+ m_sysExCheckBox = new QCheckBox(i18n("System Exclusive"), m_filterGroup);
+ m_keyPressureCheckBox = new QCheckBox(i18n("Key Pressure"), m_filterGroup);
+ m_channelPressureCheckBox = new QCheckBox(i18n("Channel Pressure"), m_filterGroup);
+ m_restCheckBox = new QCheckBox(i18n("Rest"), m_filterGroup);
+ m_indicationCheckBox = new QCheckBox(i18n("Indication"), m_filterGroup);
+ m_textCheckBox = new QCheckBox(i18n("Text"), m_filterGroup);
+ m_otherCheckBox = new QCheckBox(i18n("Other"), m_filterGroup);
+ m_grid->addWidget(m_filterGroup, 2, 0);
+
+ // Connect up
+ //
+ connect(m_filterGroup, SIGNAL(released(int)),
+ SLOT(slotModifyFilter(int)));
+
+ m_eventList = new KListView(getCentralWidget());
+ m_eventList->setItemsRenameable(true);
+
+ m_grid->addWidget(m_eventList, 2, 1);
+
+ if (m_isTriggerSegment) {
+
+ int id = segments[0]->getComposition()->getTriggerSegmentId(segments[0]);
+ TriggerSegmentRec *rec =
+ segments[0]->getComposition()->getTriggerSegmentRec(id);
+
+ QGroupBox *groupBox = new QGroupBox
+ (1, Horizontal, i18n("Triggered Segment Properties"), getCentralWidget());
+
+ QFrame *frame = new QFrame(groupBox);
+ QGridLayout *layout = new QGridLayout(frame, 5, 3, 5, 5);
+
+ layout->addWidget(new QLabel(i18n("Label: "), frame), 0, 0);
+ QString label = strtoqstr(segments[0]->getLabel());
+ if (label == "")
+ label = i18n("<no label>");
+ m_triggerName = new QLabel(label, frame);
+ layout->addWidget(m_triggerName, 0, 1);
+ QPushButton *editButton = new QPushButton(i18n("edit"), frame);
+ layout->addWidget(editButton, 0, 2);
+ connect(editButton, SIGNAL(clicked()), this, SLOT(slotEditTriggerName()));
+
+ layout->addWidget(new QLabel(i18n("Base pitch: "), frame), 1, 0);
+ m_triggerPitch = new QLabel(QString("%1").arg(rec->getBasePitch()), frame);
+ layout->addWidget(m_triggerPitch, 1, 1);
+ editButton = new QPushButton(i18n("edit"), frame);
+ layout->addWidget(editButton, 1, 2);
+ connect(editButton, SIGNAL(clicked()), this, SLOT(slotEditTriggerPitch()));
+
+ layout->addWidget(new QLabel(i18n("Base velocity: "), frame), 2, 0);
+ m_triggerVelocity = new QLabel(QString("%1").arg(rec->getBaseVelocity()), frame);
+ layout->addWidget(m_triggerVelocity, 2, 1);
+ editButton = new QPushButton(i18n("edit"), frame);
+ layout->addWidget(editButton, 2, 2);
+ connect(editButton, SIGNAL(clicked()), this, SLOT(slotEditTriggerVelocity()));
+
+ /*!!! Comment out these two options, which are not yet used
+ anywhere else -- intended for use with library ornaments, not
+ yet implemented
+
+ layout->addWidget(new QLabel(i18n("Default timing: "), frame), 3, 0);
+
+ KComboBox *adjust = new KComboBox(frame);
+ layout->addMultiCellWidget(adjust, 3, 3, 1, 2);
+ adjust->insertItem(i18n("As stored"));
+ adjust->insertItem(i18n("Truncate if longer than note"));
+ adjust->insertItem(i18n("End at same time as note"));
+ adjust->insertItem(i18n("Stretch or squash segment to note duration"));
+
+ std::string timing = rec->getDefaultTimeAdjust();
+ if (timing == BaseProperties::TRIGGER_SEGMENT_ADJUST_NONE) {
+ adjust->setCurrentItem(0);
+ } else if (timing == BaseProperties::TRIGGER_SEGMENT_ADJUST_SQUISH) {
+ adjust->setCurrentItem(3);
+ } else if (timing == BaseProperties::TRIGGER_SEGMENT_ADJUST_SYNC_START) {
+ adjust->setCurrentItem(1);
+ } else if (timing == BaseProperties::TRIGGER_SEGMENT_ADJUST_SYNC_END) {
+ adjust->setCurrentItem(2);
+ }
+
+ connect(adjust, SIGNAL(activated(int)), this, SLOT(slotTriggerTimeAdjustChanged(int)));
+
+ QCheckBox *retune = new QCheckBox(i18n("Adjust pitch to trigger note by default"), frame);
+ retune->setChecked(rec->getDefaultRetune());
+ connect(retune, SIGNAL(clicked()), this, SLOT(slotTriggerRetuneChanged()));
+ layout->addMultiCellWidget(retune, 4, 4, 1, 2);
+
+ */
+
+ m_grid->addWidget(groupBox, 2, 2);
+
+ }
+
+ updateViewCaption();
+
+ for (unsigned int i = 0; i < m_segments.size(); ++i) {
+ m_segments[i]->addObserver(this);
+ }
+
+ // Connect double clicker
+ //
+ connect(m_eventList, SIGNAL(doubleClicked(QListViewItem*)),
+ SLOT(slotPopupEventEditor(QListViewItem*)));
+
+ connect(m_eventList,
+ SIGNAL(rightButtonPressed(QListViewItem*, const QPoint&, int)),
+ SLOT(slotPopupMenu(QListViewItem*, const QPoint&, int)));
+
+ m_eventList->setAllColumnsShowFocus(true);
+ m_eventList->setSelectionMode(QListView::Extended);
+
+ m_eventList->addColumn(i18n("Time "));
+ m_eventList->addColumn(i18n("Duration "));
+ m_eventList->addColumn(i18n("Event Type "));
+ m_eventList->addColumn(i18n("Pitch "));
+ m_eventList->addColumn(i18n("Velocity "));
+ m_eventList->addColumn(i18n("Type (Data1) "));
+ m_eventList->addColumn(i18n("Value (Data2) "));
+
+ for (int col = 0; col < m_eventList->columns(); ++col)
+ m_eventList->setRenameable(col, true);
+
+ readOptions();
+ setButtonsToFilter();
+ applyLayout();
+
+ makeInitialSelection(doc->getComposition().getPosition());
+
+ slotCompositionStateUpdate();
+
+ setOutOfCtor();
+}
+
+EventView::~EventView()
+{
+ for (unsigned int i = 0; i < m_segments.size(); ++i) {
+ RG_DEBUG << "~EventView - removing this observer from " << m_segments[i] << endl;
+ m_segments[i]->removeObserver(this);
+ }
+}
+
+void
+EventView::eventRemoved(const Segment *, Event *e)
+{
+ m_deletedEvents.insert(e);
+}
+
+void
+EventView::segmentDeleted(const Segment *s)
+{
+ std::vector<Segment *>::iterator i = std::find(m_segments.begin(), m_segments.end(), s);
+
+ if (i != m_segments.end()) {
+ m_segments.erase(i);
+ } else {
+ RG_DEBUG << "%%% WARNING - EventView::segmentDeleted() called on non-registered segment - should not happen\n";
+ }
+
+}
+
+bool
+EventView::applyLayout(int /*staffNo*/)
+{
+ // If no selection has already been set then we copy what's
+ // already set and try to replicate this after the rebuild
+ // of the view.
+ //
+ if (m_listSelection.size() == 0) {
+ QPtrList<QListViewItem> selection = m_eventList->selectedItems();
+
+ if (selection.count()) {
+ QPtrListIterator<QListViewItem> it(selection);
+ QListViewItem *listItem;
+
+ while ((listItem = it.current()) != 0) {
+ m_listSelection.push_back(m_eventList->itemIndex(*it));
+ ++it;
+ }
+ }
+ }
+
+ // Ok, recreate list
+ //
+ m_eventList->clear();
+
+ m_config->setGroup(EventViewConfigGroup);
+ int timeMode = m_config->readNumEntry("timemode", 0);
+
+ for (unsigned int i = 0; i < m_segments.size(); i++) {
+ SegmentPerformanceHelper helper(*m_segments[i]);
+
+ for (Segment::iterator it = m_segments[i]->begin();
+ m_segments[i]->isBeforeEndMarker(it); it++) {
+ timeT eventTime =
+ helper.getSoundingAbsoluteTime(it);
+
+ QString velyStr;
+ QString pitchStr;
+ QString data1Str = "";
+ QString data2Str = "";
+ QString durationStr;
+
+ // Event filters
+ //
+
+ if ((*it)->isa(Note::EventRestType)) {
+ if (!(m_eventFilter & Rest))
+ continue;
+
+ } else if ((*it)->isa(Note::EventType)) {
+ if (!(m_eventFilter & Note))
+ continue;
+
+ } else if ((*it)->isa(Indication::EventType)) {
+ if (!(m_eventFilter & Indication))
+ continue;
+
+ } else if ((*it)->isa(PitchBend::EventType)) {
+ if (!(m_eventFilter & PitchBend))
+ continue;
+
+ } else if ((*it)->isa(SystemExclusive::EventType)) {
+ if (!(m_eventFilter & SystemExclusive))
+ continue;
+
+ } else if ((*it)->isa(ProgramChange::EventType)) {
+ if (!(m_eventFilter & ProgramChange))
+ continue;
+
+ } else if ((*it)->isa(ChannelPressure::EventType)) {
+ if (!(m_eventFilter & ChannelPressure))
+ continue;
+
+ } else if ((*it)->isa(KeyPressure::EventType)) {
+ if (!(m_eventFilter & KeyPressure))
+ continue;
+
+ } else if ((*it)->isa(Controller::EventType)) {
+ if (!(m_eventFilter & Controller))
+ continue;
+
+ } else if ((*it)->isa(Text::EventType)) {
+ if (!(m_eventFilter & Text))
+ continue;
+
+ } else {
+ if (!(m_eventFilter & Other))
+ continue;
+ }
+
+ // avoid debug stuff going to stderr if no properties found
+
+ if ((*it)->has(BaseProperties::PITCH)) {
+ int p = (*it)->get
+ <Int>(BaseProperties::PITCH);
+ pitchStr = QString("%1 %2 ")
+ .arg(p).arg(MidiPitchLabel(p).getQString());
+ } else if ((*it)->isa(Note::EventType)) {
+ pitchStr = "<not set>";
+ }
+
+ if ((*it)->has(BaseProperties::VELOCITY)) {
+ velyStr = QString("%1 ").
+ arg((*it)->get
+ <Int>(BaseProperties::VELOCITY));
+ } else if ((*it)->isa(Note::EventType)) {
+ velyStr = "<not set>";
+ }
+
+ if ((*it)->has(Controller::NUMBER)) {
+ data1Str = QString("%1 ").
+ arg((*it)->get
+ <Int>(Controller::NUMBER));
+ } else if ((*it)->has(Text::TextTypePropertyName)) {
+ data1Str = QString("%1 ").
+ arg(strtoqstr((*it)->get
+ <String>
+ (Text::TextTypePropertyName)));
+ } else if ((*it)->has(Indication::
+ IndicationTypePropertyName)) {
+ data1Str = QString("%1 ").
+ arg(strtoqstr((*it)->get
+ <String>
+ (Indication::
+ IndicationTypePropertyName)));
+ } else if ((*it)->has(::Rosegarden::Key::KeyPropertyName)) {
+ data1Str = QString("%1 ").
+ arg(strtoqstr((*it)->get
+ <String>
+ (::Rosegarden::Key::KeyPropertyName)));
+ } else if ((*it)->has(Clef::ClefPropertyName)) {
+ data1Str = QString("%1 ").
+ arg(strtoqstr((*it)->get
+ <String>
+ (Clef::ClefPropertyName)));
+ } else if ((*it)->has(PitchBend::MSB)) {
+ data1Str = QString("%1 ").
+ arg((*it)->get
+ <Int>(PitchBend::MSB));
+ } else if ((*it)->has(BaseProperties::BEAMED_GROUP_TYPE)) {
+ data1Str = QString("%1 ").
+ arg(strtoqstr((*it)->get
+ <String>
+ (BaseProperties::BEAMED_GROUP_TYPE)));
+ }
+
+ if ((*it)->has(Controller::VALUE)) {
+ data2Str = QString("%1 ").
+ arg((*it)->get
+ <Int>(Controller::VALUE));
+ } else if ((*it)->has(Text::TextPropertyName)) {
+ data2Str = QString("%1 ").
+ arg(strtoqstr((*it)->get
+ <String>
+ (Text::TextPropertyName)));
+ /*!!!
+ } else if ((*it)->has(Indication::
+ IndicationTypePropertyName)) {
+ data2Str = QString("%1 ").
+ arg((*it)->get<Int>(Indication::
+ IndicationDurationPropertyName));
+ */
+ } else if ((*it)->has(PitchBend::LSB)) {
+ data2Str = QString("%1 ").
+ arg((*it)->get
+ <Int>(PitchBend::LSB));
+ } else if ((*it)->has(BaseProperties::BEAMED_GROUP_ID)) {
+ data2Str = i18n("(group %1) ").
+ arg((*it)->get
+ <Int>(BaseProperties::BEAMED_GROUP_ID));
+ }
+
+ if ((*it)->has(ProgramChange::PROGRAM)) {
+ data1Str = QString("%1 ").
+ arg((*it)->get
+ <Int>(ProgramChange::PROGRAM) + 1);
+ }
+
+ if ((*it)->has(ChannelPressure::PRESSURE)) {
+ data1Str = QString("%1 ").
+ arg((*it)->get
+ <Int>(ChannelPressure::PRESSURE));
+ }
+
+ if ((*it)->isa(KeyPressure::EventType) &&
+ (*it)->has(KeyPressure::PITCH)) {
+ data1Str = QString("%1 ").
+ arg((*it)->get
+ <Int>(KeyPressure::PITCH));
+ }
+
+ if ((*it)->has(KeyPressure::PRESSURE)) {
+ data2Str = QString("%1 ").
+ arg((*it)->get
+ <Int>(KeyPressure::PRESSURE));
+ }
+
+
+ if ((*it)->getDuration() > 0 ||
+ (*it)->isa(Note::EventType) ||
+ (*it)->isa(Note::EventRestType)) {
+ durationStr = makeDurationString(eventTime,
+ (*it)->getDuration(),
+ timeMode);
+ }
+
+ QString timeStr = makeTimeString(eventTime, timeMode);
+
+ new EventViewItem(m_segments[i],
+ *it,
+ m_eventList,
+ timeStr,
+ durationStr,
+ strtoqstr((*it)->getType()),
+ pitchStr,
+ velyStr,
+ data1Str,
+ data2Str);
+ }
+ }
+
+
+ if (m_eventList->childCount() == 0) {
+ if (m_segments.size())
+ new QListViewItem(m_eventList,
+ i18n("<no events at this filter level>"));
+ else
+ new QListViewItem(m_eventList, i18n("<no events>"));
+
+ m_eventList->setSelectionMode(QListView::NoSelection);
+ stateChanged("have_selection", KXMLGUIClient::StateReverse);
+ } else {
+ m_eventList->setSelectionMode(QListView::Extended);
+
+ // If no selection then select the first event
+ if (m_listSelection.size() == 0)
+ m_listSelection.push_back(0);
+
+ stateChanged("have_selection", KXMLGUIClient::StateNoReverse);
+ }
+
+ // Set a selection from a range of indexes
+ //
+ std::vector<int>::iterator sIt = m_listSelection.begin();
+ int index = 0;
+
+ for (; sIt != m_listSelection.end(); ++sIt) {
+ index = *sIt;
+
+ while (index > 0 && !m_eventList->itemAtIndex(index))
+ index--;
+
+ m_eventList->setSelected(m_eventList->itemAtIndex(index), true);
+ m_eventList->setCurrentItem(m_eventList->itemAtIndex(index));
+
+ // ensure visible
+ m_eventList->ensureItemVisible(m_eventList->itemAtIndex(index));
+ }
+
+ m_listSelection.clear();
+ m_deletedEvents.clear();
+
+ return true;
+}
+
+void
+EventView::makeInitialSelection(timeT time)
+{
+ m_listSelection.clear();
+
+ EventViewItem *goodItem = 0;
+ int goodItemNo = 0;
+
+ int i = 0;
+
+ for (QListViewItem *child = m_eventList->firstChild();
+ child;
+ child = child->nextSibling()) {
+
+ EventViewItem * item = dynamic_cast<EventViewItem *>(child);
+
+ if (item) {
+ if (item->getEvent()->getAbsoluteTime() > time)
+ break;
+ goodItem = item;
+ goodItemNo = i;
+ }
+
+ ++i;
+ }
+ /*!!!
+ for (int i = 0; m_eventList->itemAtIndex(i); ++i) {
+
+ EventViewItem *item = dynamic_cast<EventViewItem *>
+ (m_eventList->itemAtIndex(i));
+
+ if (item) {
+ if (item->getEvent()->getAbsoluteTime() > time) break;
+ goodItem = item;
+ goodItemNo = i;
+ }
+ }
+ */
+ if (goodItem) {
+ m_listSelection.push_back(goodItemNo);
+ m_eventList->setSelected(goodItem, true);
+ m_eventList->ensureItemVisible(goodItem);
+ }
+}
+
+QString
+EventView::makeTimeString(timeT time, int timeMode)
+{
+ switch (timeMode) {
+
+ case 0: // musical time
+ {
+ int bar, beat, fraction, remainder;
+ getDocument()->getComposition().getMusicalTimeForAbsoluteTime
+ (time, bar, beat, fraction, remainder);
+ ++bar;
+ return QString("%1%2%3-%4%5-%6%7-%8%9 ")
+ .arg(bar / 100)
+ .arg((bar % 100) / 10)
+ .arg(bar % 10)
+ .arg(beat / 10)
+ .arg(beat % 10)
+ .arg(fraction / 10)
+ .arg(fraction % 10)
+ .arg(remainder / 10)
+ .arg(remainder % 10);
+ }
+
+ case 1: // real time
+ {
+ RealTime rt =
+ getDocument()->getComposition().getElapsedRealTime(time);
+ // return QString("%1 ").arg(rt.toString().c_str());
+ return QString("%1 ").arg(rt.toText().c_str());
+ }
+
+ default:
+ return QString("%1 ").arg(time);
+ }
+}
+
+QString
+EventView::makeDurationString(timeT time,
+ timeT duration, int timeMode)
+{
+ switch (timeMode) {
+
+ case 0: // musical time
+ {
+ int bar, beat, fraction, remainder;
+ getDocument()->getComposition().getMusicalTimeForDuration
+ (time, duration, bar, beat, fraction, remainder);
+ return QString("%1%2%3-%4%5-%6%7-%8%9 ")
+ .arg(bar / 100)
+ .arg((bar % 100) / 10)
+ .arg(bar % 10)
+ .arg(beat / 10)
+ .arg(beat % 10)
+ .arg(fraction / 10)
+ .arg(fraction % 10)
+ .arg(remainder / 10)
+ .arg(remainder % 10);
+ }
+
+ case 1: // real time
+ {
+ RealTime rt =
+ getDocument()->getComposition().getRealTimeDifference
+ (time, time + duration);
+ // return QString("%1 ").arg(rt.toString().c_str());
+ return QString("%1 ").arg(rt.toText().c_str());
+ }
+
+ default:
+ return QString("%1 ").arg(duration);
+ }
+}
+
+void
+EventView::refreshSegment(Segment * /*segment*/,
+ timeT /*startTime*/,
+ timeT /*endTime*/)
+{
+ RG_DEBUG << "EventView::refreshSegment" << endl;
+ applyLayout(0);
+}
+
+void
+EventView::updateView()
+{
+ m_eventList->update();
+}
+
+void
+EventView::slotEditTriggerName()
+{
+ bool ok = false;
+ QString newLabel = KLineEditDlg::getText(i18n("Segment label"), i18n("Label:"),
+ strtoqstr(m_segments[0]->getLabel()),
+ &ok, this);
+
+ if (ok) {
+ SegmentSelection selection;
+ selection.insert(m_segments[0]);
+ SegmentLabelCommand *cmd = new SegmentLabelCommand(selection, newLabel);
+ addCommandToHistory(cmd);
+ m_triggerName->setText(newLabel);
+ }
+}
+
+void
+EventView::slotEditTriggerPitch()
+{
+ int id = m_segments[0]->getComposition()->getTriggerSegmentId(m_segments[0]);
+
+ TriggerSegmentRec *rec =
+ m_segments[0]->getComposition()->getTriggerSegmentRec(id);
+
+ PitchDialog *dlg = new PitchDialog(this, i18n("Base pitch"), rec->getBasePitch());
+
+ if (dlg->exec() == QDialog::Accepted) {
+ addCommandToHistory(new SetTriggerSegmentBasePitchCommand
+ (&getDocument()->getComposition(), id, dlg->getPitch()));
+ m_triggerPitch->setText(QString("%1").arg(dlg->getPitch()));
+ }
+}
+
+void
+EventView::slotEditTriggerVelocity()
+{
+ int id = m_segments[0]->getComposition()->getTriggerSegmentId(m_segments[0]);
+
+ TriggerSegmentRec *rec =
+ m_segments[0]->getComposition()->getTriggerSegmentRec(id);
+
+ TrivialVelocityDialog *dlg = new TrivialVelocityDialog
+ (this, i18n("Base velocity"), rec->getBaseVelocity());
+
+ if (dlg->exec() == QDialog::Accepted) {
+ addCommandToHistory(new SetTriggerSegmentBaseVelocityCommand
+ (&getDocument()->getComposition(), id, dlg->getVelocity()));
+ m_triggerVelocity->setText(QString("%1").arg(dlg->getVelocity()));
+ }
+}
+
+void
+EventView::slotTriggerTimeAdjustChanged(int option)
+{
+ std::string adjust = BaseProperties::TRIGGER_SEGMENT_ADJUST_SQUISH;
+
+ switch (option) {
+
+ case 0:
+ adjust = BaseProperties::TRIGGER_SEGMENT_ADJUST_NONE;
+ break;
+ case 1:
+ adjust = BaseProperties::TRIGGER_SEGMENT_ADJUST_SYNC_START;
+ break;
+ case 2:
+ adjust = BaseProperties::TRIGGER_SEGMENT_ADJUST_SYNC_END;
+ break;
+ case 3:
+ adjust = BaseProperties::TRIGGER_SEGMENT_ADJUST_SQUISH;
+ break;
+
+ default:
+ break;
+ }
+
+ int id = m_segments[0]->getComposition()->getTriggerSegmentId(m_segments[0]);
+
+ TriggerSegmentRec *rec =
+ m_segments[0]->getComposition()->getTriggerSegmentRec(id);
+
+ addCommandToHistory(new SetTriggerSegmentDefaultTimeAdjustCommand
+ (&getDocument()->getComposition(), id, adjust));
+}
+
+void
+EventView::slotTriggerRetuneChanged()
+{
+ int id = m_segments[0]->getComposition()->getTriggerSegmentId(m_segments[0]);
+
+ TriggerSegmentRec *rec =
+ m_segments[0]->getComposition()->getTriggerSegmentRec(id);
+
+ addCommandToHistory(new SetTriggerSegmentDefaultRetuneCommand
+ (&getDocument()->getComposition(), id, !rec->getDefaultRetune()));
+}
+
+void
+EventView::slotEditCut()
+{
+ QPtrList<QListViewItem> selection = m_eventList->selectedItems();
+
+ if (selection.count() == 0)
+ return ;
+
+ RG_DEBUG << "EventView::slotEditCut - cutting "
+ << selection.count() << " items" << endl;
+
+ QPtrListIterator<QListViewItem> it(selection);
+ QListViewItem *listItem;
+ EventViewItem *item;
+ EventSelection *cutSelection = 0;
+ int itemIndex = -1;
+
+ while ((listItem = it.current()) != 0) {
+ item = dynamic_cast<EventViewItem*>((*it));
+
+ if (itemIndex == -1)
+ itemIndex = m_eventList->itemIndex(*it);
+
+ if (item) {
+ if (cutSelection == 0)
+ cutSelection =
+ new EventSelection(*(item->getSegment()));
+
+ cutSelection->addEvent(item->getEvent());
+ }
+ ++it;
+ }
+
+ if (cutSelection) {
+ if (itemIndex >= 0) {
+ m_listSelection.clear();
+ m_listSelection.push_back(itemIndex);
+ }
+
+ addCommandToHistory(new CutCommand(*cutSelection,
+ getDocument()->getClipboard()));
+ }
+}
+
+void
+EventView::slotEditCopy()
+{
+ QPtrList<QListViewItem> selection = m_eventList->selectedItems();
+
+ if (selection.count() == 0)
+ return ;
+
+ RG_DEBUG << "EventView::slotEditCopy - copying "
+ << selection.count() << " items" << endl;
+
+ QPtrListIterator<QListViewItem> it(selection);
+ QListViewItem *listItem;
+ EventViewItem *item;
+ EventSelection *copySelection = 0;
+
+ // clear the selection for post modification updating
+ //
+ m_listSelection.clear();
+
+ while ((listItem = it.current()) != 0) {
+ item = dynamic_cast<EventViewItem*>((*it));
+
+ m_listSelection.push_back(m_eventList->itemIndex(*it));
+
+ if (item) {
+ if (copySelection == 0)
+ copySelection =
+ new EventSelection(*(item->getSegment()));
+
+ copySelection->addEvent(item->getEvent());
+ }
+ ++it;
+ }
+
+ if (copySelection) {
+ addCommandToHistory(new CopyCommand(*copySelection,
+ getDocument()->getClipboard()));
+ }
+}
+
+void
+EventView::slotEditPaste()
+{
+ if (getDocument()->getClipboard()->isEmpty()) {
+ slotStatusHelpMsg(i18n("Clipboard is empty"));
+ return ;
+ }
+
+ KTmpStatusMsg msg(i18n("Inserting clipboard contents..."), this);
+
+ timeT insertionTime = 0;
+
+ QPtrList<QListViewItem> selection = m_eventList->selectedItems();
+ if (selection.count()) {
+ EventViewItem *item = dynamic_cast<EventViewItem*>(selection.at(0));
+
+ if (item)
+ insertionTime = item->getEvent()->getAbsoluteTime();
+
+ // remember the selection
+ //
+ m_listSelection.clear();
+
+ QPtrListIterator<QListViewItem> it(selection);
+ QListViewItem *listItem;
+
+ while ((listItem = it.current()) != 0) {
+ m_listSelection.push_back(m_eventList->itemIndex(*it));
+ ++it;
+ }
+ }
+
+
+ PasteEventsCommand *command = new PasteEventsCommand
+ (*m_segments[0], getDocument()->getClipboard(),
+ insertionTime, PasteEventsCommand::MatrixOverlay);
+
+ if (!command->isPossible()) {
+ slotStatusHelpMsg(i18n("Couldn't paste at this point"));
+ } else
+ addCommandToHistory(command);
+
+ RG_DEBUG << "EventView::slotEditPaste - pasting "
+ << selection.count() << " items" << endl;
+}
+
+void
+EventView::slotEditDelete()
+{
+ QPtrList<QListViewItem> selection = m_eventList->selectedItems();
+ if (selection.count() == 0)
+ return ;
+
+ RG_DEBUG << "EventView::slotEditDelete - deleting "
+ << selection.count() << " items" << endl;
+
+ QPtrListIterator<QListViewItem> it(selection);
+ QListViewItem *listItem;
+ EventViewItem *item;
+ EventSelection *deleteSelection = 0;
+ int itemIndex = -1;
+
+ while ((listItem = it.current()) != 0) {
+ item = dynamic_cast<EventViewItem*>((*it));
+
+ if (itemIndex == -1)
+ itemIndex = m_eventList->itemIndex(*it);
+
+ if (item) {
+ if (m_deletedEvents.find(item->getEvent()) != m_deletedEvents.end()) {
+ ++it;
+ continue;
+ }
+
+ if (deleteSelection == 0)
+ deleteSelection =
+ new EventSelection(*m_segments[0]);
+
+ deleteSelection->addEvent(item->getEvent());
+ }
+ ++it;
+ }
+
+ if (deleteSelection) {
+
+ if (itemIndex >= 0) {
+ m_listSelection.clear();
+ m_listSelection.push_back(itemIndex);
+ }
+
+ addCommandToHistory(new EraseCommand(*deleteSelection));
+
+ }
+}
+
+void
+EventView::slotEditInsert()
+{
+ RG_DEBUG << "EventView::slotEditInsert" << endl;
+
+ timeT insertTime = m_segments[0]->getStartTime();
+ timeT insertDuration = 960;
+
+ QPtrList<QListViewItem> selection = m_eventList->selectedItems();
+
+ if (selection.count() > 0) {
+ EventViewItem *item =
+ dynamic_cast<EventViewItem*>(selection.getFirst());
+
+ if (item) {
+ insertTime = item->getEvent()->getAbsoluteTime();
+ insertDuration = item->getEvent()->getDuration();
+ }
+ }
+
+ // Create default event
+ //
+ Event *event =
+ new Event(Note::EventType,
+ insertTime,
+ insertDuration);
+ event->set
+ <Int>(BaseProperties::PITCH, 70);
+ event->set
+ <Int>(BaseProperties::VELOCITY, 100);
+
+ SimpleEventEditDialog dialog(this, getDocument(), *event, true);
+
+ if (dialog.exec() == QDialog::Accepted) {
+ EventInsertionCommand *command =
+ new EventInsertionCommand(*m_segments[0],
+ new Event(dialog.getEvent()));
+ addCommandToHistory(command);
+ }
+}
+
+void
+EventView::slotEditEvent()
+{
+ RG_DEBUG << "EventView::slotEditEvent" << endl;
+
+ QPtrList<QListViewItem> selection = m_eventList->selectedItems();
+
+ if (selection.count() > 0) {
+ EventViewItem *item =
+ dynamic_cast<EventViewItem*>(selection.getFirst());
+
+ if (item) {
+ Event *event = item->getEvent();
+ SimpleEventEditDialog dialog(this, getDocument(), *event, false);
+
+ if (dialog.exec() == QDialog::Accepted && dialog.isModified()) {
+ EventEditCommand *command =
+ new EventEditCommand(*(item->getSegment()),
+ event,
+ dialog.getEvent());
+
+ addCommandToHistory(command);
+ }
+ }
+ }
+}
+
+void
+EventView::slotEditEventAdvanced()
+{
+ RG_DEBUG << "EventView::slotEditEventAdvanced" << endl;
+
+ QPtrList<QListViewItem> selection = m_eventList->selectedItems();
+
+ if (selection.count() > 0) {
+ EventViewItem *item =
+ dynamic_cast<EventViewItem*>(selection.getFirst());
+
+ if (item) {
+ Event *event = item->getEvent();
+ EventEditDialog dialog(this, *event);
+
+ if (dialog.exec() == QDialog::Accepted && dialog.isModified()) {
+ EventEditCommand *command =
+ new EventEditCommand(*(item->getSegment()),
+ event,
+ dialog.getEvent());
+
+ addCommandToHistory(command);
+ }
+ }
+ }
+}
+
+void
+EventView::slotSelectAll()
+{
+ m_listSelection.clear();
+ for (int i = 0; m_eventList->itemAtIndex(i); ++i) {
+ m_listSelection.push_back(i);
+ m_eventList->setSelected(m_eventList->itemAtIndex(i), true);
+ }
+}
+
+void
+EventView::slotClearSelection()
+{
+ m_listSelection.clear();
+ for (int i = 0; m_eventList->itemAtIndex(i); ++i) {
+ m_eventList->setSelected(m_eventList->itemAtIndex(i), false);
+ }
+}
+
+void
+EventView::slotFilterSelection()
+{
+ m_listSelection.clear();
+ QPtrList<QListViewItem> selection = m_eventList->selectedItems();
+ if (selection.count() == 0)
+ return ;
+
+ EventFilterDialog dialog(this);
+ if (dialog.exec() == QDialog::Accepted) {
+
+ QPtrListIterator<QListViewItem> it(selection);
+ QListViewItem *listItem;
+
+ while ((listItem = it.current()) != 0) {
+
+ EventViewItem * item = dynamic_cast<EventViewItem*>(*it);
+ if (!item) {
+ ++it;
+ continue;
+ }
+
+ if (!dialog.keepEvent(item->getEvent())) {
+ m_listSelection.push_back(m_eventList->itemIndex(*it));
+ m_eventList->setSelected(item, false);
+ }
+
+ ++it;
+ }
+ }
+}
+
+void
+EventView::setupActions()
+{
+ EditViewBase::setupActions("eventlist.rc");
+
+ QString pixmapDir = KGlobal::dirs()->findResource("appdata", "pixmaps/");
+ QIconSet icon(QPixmap(pixmapDir + "/toolbar/event-insert.png"));
+
+ new KAction(i18n("&Insert Event"), icon, Key_I, this,
+ SLOT(slotEditInsert()), actionCollection(),
+ "insert");
+
+ QCanvasPixmap pixmap(pixmapDir + "/toolbar/event-delete.png");
+ icon = QIconSet(pixmap);
+
+ new KAction(i18n("&Delete Event"), icon, Key_Delete, this,
+ SLOT(slotEditDelete()), actionCollection(),
+ "delete");
+
+ pixmap.load(pixmapDir + "/toolbar/event-edit.png");
+ icon = QIconSet(pixmap);
+
+ new KAction(i18n("&Edit Event"), icon, Key_E, this,
+ SLOT(slotEditEvent()), actionCollection(),
+ "edit_simple");
+
+ pixmap.load(pixmapDir + "/toolbar/event-edit-advanced.png");
+ icon = QIconSet(pixmap);
+
+ new KAction(i18n("&Advanced Event Editor"), icon, Key_A, this,
+ SLOT(slotEditEventAdvanced()), actionCollection(),
+ "edit_advanced");
+
+ // icon = QIconSet(QCanvasPixmap(pixmapDir + "/toolbar/eventfilter.xpm"));
+ new KAction(i18n("&Filter Selection"), "filter", Key_F, this,
+ SLOT(slotFilterSelection()), actionCollection(),
+ "filter_selection");
+
+ new KAction(i18n("Select &All"), Key_A + CTRL, this,
+ SLOT(slotSelectAll()), actionCollection(),
+ "select_all");
+
+ new KAction(i18n("Clear Selection"), Key_Escape, this,
+ SLOT(slotClearSelection()), actionCollection(),
+ "clear_selection");
+
+ m_config->setGroup(EventViewConfigGroup);
+ int timeMode = m_config->readNumEntry("timemode", 0);
+
+ KRadioAction *action;
+
+ pixmap.load(pixmapDir + "/toolbar/time-musical.png");
+ icon = QIconSet(pixmap);
+
+ action = new KRadioAction(i18n("&Musical Times"), icon, 0, this,
+ SLOT(slotMusicalTime()),
+ actionCollection(), "time_musical");
+ action->setExclusiveGroup("timeMode");
+ if (timeMode == 0)
+ action->setChecked(true);
+
+ pixmap.load(pixmapDir + "/toolbar/time-real.png");
+ icon = QIconSet(pixmap);
+
+ action = new KRadioAction(i18n("&Real Times"), icon, 0, this,
+ SLOT(slotRealTime()),
+ actionCollection(), "time_real");
+ action->setExclusiveGroup("timeMode");
+ if (timeMode == 1)
+ action->setChecked(true);
+
+ pixmap.load(pixmapDir + "/toolbar/time-raw.png");
+ icon = QIconSet(pixmap);
+
+ action = new KRadioAction(i18n("Ra&w Times"), icon, 0, this,
+ SLOT(slotRawTime()),
+ actionCollection(), "time_raw");
+ action->setExclusiveGroup("timeMode");
+ if (timeMode == 2)
+ action->setChecked(true);
+
+ if (m_isTriggerSegment) {
+ KAction *action = actionCollection()->action("open_in_matrix");
+ if (action)
+ delete action;
+ action = actionCollection()->action("open_in_notation");
+ if (action)
+ delete action;
+ }
+
+ createGUI(getRCFileName());
+}
+
+void
+EventView::initStatusBar()
+{
+ KStatusBar* sb = statusBar();
+
+ /*
+ m_hoveredOverNoteName = new QLabel(sb);
+ m_hoveredOverAbsoluteTime = new QLabel(sb);
+
+ m_hoveredOverNoteName->setMinimumWidth(32);
+ m_hoveredOverAbsoluteTime->setMinimumWidth(160);
+
+ sb->addWidget(m_hoveredOverAbsoluteTime);
+ sb->addWidget(m_hoveredOverNoteName);
+ */
+
+ sb->insertItem(KTmpStatusMsg::getDefaultMsg(),
+ KTmpStatusMsg::getDefaultId(), 1);
+ sb->setItemAlignment(KTmpStatusMsg::getDefaultId(),
+ AlignLeft | AlignVCenter);
+
+ //m_selectionCounter = new QLabel(sb);
+ //sb->addWidget(m_selectionCounter);
+}
+
+QSize
+EventView::getViewSize()
+{
+ return m_eventList->size();
+}
+
+void
+EventView::setViewSize(QSize s)
+{
+ m_eventList->setFixedSize(s);
+}
+
+void
+EventView::readOptions()
+{
+ m_config->setGroup(EventViewConfigGroup);
+ EditViewBase::readOptions();
+ m_eventFilter = m_config->readNumEntry("eventfilter", m_eventFilter);
+ m_eventList->restoreLayout(m_config, EventViewLayoutConfigGroupName);
+}
+
+void
+EventView::slotSaveOptions()
+{
+ m_config->setGroup(EventViewConfigGroup);
+ m_config->writeEntry("eventfilter", m_eventFilter);
+ m_eventList->saveLayout(m_config, EventViewLayoutConfigGroupName);
+}
+
+Segment *
+EventView::getCurrentSegment()
+{
+ if (m_segments.empty())
+ return 0;
+ else
+ return *m_segments.begin();
+}
+
+void
+EventView::slotModifyFilter(int button)
+{
+ QCheckBox *checkBox = dynamic_cast<QCheckBox*>(m_filterGroup->find(button));
+
+ if (checkBox == 0)
+ return ;
+
+ if (checkBox->isChecked()) {
+ switch (button) {
+ case 0:
+ m_eventFilter |= EventView::Note;
+ break;
+
+ case 1:
+ m_eventFilter |= EventView::ProgramChange;
+ break;
+
+ case 2:
+ m_eventFilter |= EventView::Controller;
+ break;
+
+ case 3:
+ m_eventFilter |= EventView::PitchBend;
+ break;
+
+ case 4:
+ m_eventFilter |= EventView::SystemExclusive;
+ break;
+
+ case 5:
+ m_eventFilter |= EventView::KeyPressure;
+ break;
+
+ case 6:
+ m_eventFilter |= EventView::ChannelPressure;
+ break;
+
+ case 7:
+ m_eventFilter |= EventView::Rest;
+ break;
+
+ case 8:
+ m_eventFilter |= EventView::Indication;
+ break;
+
+ case 9:
+ m_eventFilter |= EventView::Text;
+ break;
+
+ case 10:
+ m_eventFilter |= EventView::Other;
+ break;
+
+ default:
+ break;
+ }
+
+ } else {
+ switch (button) {
+ case 0:
+ m_eventFilter ^= EventView::Note;
+ break;
+
+ case 1:
+ m_eventFilter ^= EventView::ProgramChange;
+ break;
+
+ case 2:
+ m_eventFilter ^= EventView::Controller;
+ break;
+
+ case 3:
+ m_eventFilter ^= EventView::PitchBend;
+ break;
+
+ case 4:
+ m_eventFilter ^= EventView::SystemExclusive;
+ break;
+
+ case 5:
+ m_eventFilter ^= EventView::KeyPressure;
+ break;
+
+ case 6:
+ m_eventFilter ^= EventView::ChannelPressure;
+ break;
+
+ case 7:
+ m_eventFilter ^= EventView::Rest;
+ break;
+
+ case 8:
+ m_eventFilter ^= EventView::Indication;
+ break;
+
+ case 9:
+ m_eventFilter ^= EventView::Text;
+ break;
+
+ case 10:
+ m_eventFilter ^= EventView::Other;
+ break;
+
+ default:
+ break;
+ }
+ }
+
+ m_lastSetEventFilter = m_eventFilter;
+
+ applyLayout(0);
+}
+
+void
+EventView::setButtonsToFilter()
+{
+ if (m_eventFilter & Note)
+ m_noteCheckBox->setChecked(true);
+ else
+ m_noteCheckBox->setChecked(false);
+
+ if (m_eventFilter & ProgramChange)
+ m_programCheckBox->setChecked(true);
+ else
+ m_programCheckBox->setChecked(false);
+
+ if (m_eventFilter & Controller)
+ m_controllerCheckBox->setChecked(true);
+ else
+ m_controllerCheckBox->setChecked(false);
+
+ if (m_eventFilter & SystemExclusive)
+ m_sysExCheckBox->setChecked(true);
+ else
+ m_sysExCheckBox->setChecked(false);
+
+ if (m_eventFilter & Text)
+ m_textCheckBox->setChecked(true);
+ else
+ m_textCheckBox->setChecked(false);
+
+ if (m_eventFilter & Rest)
+ m_restCheckBox->setChecked(true);
+ else
+ m_restCheckBox->setChecked(false);
+
+ if (m_eventFilter & PitchBend)
+ m_pitchBendCheckBox->setChecked(true);
+ else
+ m_pitchBendCheckBox->setChecked(false);
+
+ if (m_eventFilter & ChannelPressure)
+ m_channelPressureCheckBox->setChecked(true);
+ else
+ m_channelPressureCheckBox->setChecked(false);
+
+ if (m_eventFilter & KeyPressure)
+ m_keyPressureCheckBox->setChecked(true);
+ else
+ m_keyPressureCheckBox->setChecked(false);
+
+ if (m_eventFilter & Indication) {
+ m_indicationCheckBox->setChecked(true);
+ } else {
+ m_indicationCheckBox->setChecked(false);
+ }
+
+ if (m_eventFilter & Other) {
+ m_otherCheckBox->setChecked(true);
+ } else {
+ m_otherCheckBox->setChecked(false);
+ }
+}
+
+void
+EventView::slotMusicalTime()
+{
+ m_config->setGroup(EventViewConfigGroup);
+ m_config->writeEntry("timemode", 0);
+ applyLayout();
+}
+
+void
+EventView::slotRealTime()
+{
+ m_config->setGroup(EventViewConfigGroup);
+ m_config->writeEntry("timemode", 1);
+ applyLayout();
+}
+
+void
+EventView::slotRawTime()
+{
+ m_config->setGroup(EventViewConfigGroup);
+ m_config->writeEntry("timemode", 2);
+ applyLayout();
+}
+
+void
+EventView::slotPopupEventEditor(QListViewItem *item)
+{
+ EventViewItem *eItem = dynamic_cast<EventViewItem*>(item);
+
+ //!!! trigger events
+
+ if (eItem) {
+ Event *event = eItem->getEvent();
+ SimpleEventEditDialog *dialog =
+ new SimpleEventEditDialog(this, getDocument(), *event, false);
+
+ if (dialog->exec() == QDialog::Accepted && dialog->isModified()) {
+ EventEditCommand *command =
+ new EventEditCommand(*(eItem->getSegment()),
+ event,
+ dialog->getEvent());
+
+ addCommandToHistory(command);
+ }
+
+ }
+}
+
+void
+EventView::slotPopupMenu(QListViewItem *item, const QPoint &pos, int)
+{
+ if (!item)
+ return ;
+
+ EventViewItem *eItem = dynamic_cast<EventViewItem*>(item);
+ if (!eItem || !eItem->getEvent())
+ return ;
+
+ if (!m_menu)
+ createMenu();
+
+ if (m_menu)
+ //m_menu->exec(QCursor::pos());
+ m_menu->exec(pos);
+ else
+ RG_DEBUG << "EventView::showMenu() : no menu to show\n";
+}
+
+void
+EventView::createMenu()
+{
+ m_menu = new QPopupMenu(this);
+ m_menu->insertItem(i18n("Open in Event Editor"), 0);
+ m_menu->insertItem(i18n("Open in Expert Event Editor"), 1);
+
+ connect(m_menu, SIGNAL(activated(int)),
+ SLOT(slotMenuActivated(int)));
+}
+
+void
+EventView::slotMenuActivated(int value)
+{
+ RG_DEBUG << "EventView::slotMenuActivated - value = " << value << endl;
+
+ if (value == 0) {
+ EventViewItem *eItem = dynamic_cast<EventViewItem*>
+ (m_eventList->currentItem());
+
+ if (eItem) {
+ Event *event = eItem->getEvent();
+ SimpleEventEditDialog *dialog =
+ new SimpleEventEditDialog(this, getDocument(), *event, false);
+
+ if (dialog->exec() == QDialog::Accepted && dialog->isModified()) {
+ EventEditCommand *command =
+ new EventEditCommand(*(eItem->getSegment()),
+ event,
+ dialog->getEvent());
+
+ addCommandToHistory(command);
+ }
+
+ }
+ } else if (value == 1) {
+ EventViewItem *eItem = dynamic_cast<EventViewItem*>
+ (m_eventList->currentItem());
+
+ if (eItem) {
+ Event *event = eItem->getEvent();
+ EventEditDialog *dialog = new EventEditDialog(this, *event);
+
+ if (dialog->exec() == QDialog::Accepted && dialog->isModified()) {
+ EventEditCommand *command =
+ new EventEditCommand(*(eItem->getSegment()),
+ event,
+ dialog->getEvent());
+
+ addCommandToHistory(command);
+ }
+
+ }
+ }
+
+ return ;
+}
+
+void
+EventView::updateViewCaption()
+{
+ if (m_isTriggerSegment) {
+
+ setCaption(i18n("%1 - Triggered Segment: %2")
+ .arg(getDocument()->getTitle())
+ .arg(strtoqstr(m_segments[0]->getLabel())));
+
+
+ } else if (m_segments.size() == 1) {
+
+ TrackId trackId = m_segments[0]->getTrack();
+ Track *track =
+ m_segments[0]->getComposition()->getTrackById(trackId);
+
+ int trackPosition = -1;
+ if (track)
+ trackPosition = track->getPosition();
+
+ setCaption(i18n("%1 - Segment Track #%2 - Event List")
+ .arg(getDocument()->getTitle())
+ .arg(trackPosition + 1));
+
+ } else {
+
+ setCaption(i18n("%1 - %2 Segments - Event List")
+ .arg(getDocument()->getTitle())
+ .arg(m_segments.size()));
+ }
+
+}
+
+}
+#include "EventView.moc"
diff --git a/src/gui/editors/eventlist/EventView.h b/src/gui/editors/eventlist/EventView.h
new file mode 100644
index 0000000..4c540e6
--- /dev/null
+++ b/src/gui/editors/eventlist/EventView.h
@@ -0,0 +1,205 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_EVENTVIEW_H_
+#define _RG_EVENTVIEW_H_
+
+#include "base/MidiTypes.h"
+#include "base/NotationTypes.h"
+#include "base/Segment.h"
+#include "gui/general/EditViewBase.h"
+#include <set>
+#include <qsize.h>
+#include <qstring.h>
+#include <vector>
+#include "base/Event.h"
+
+
+class QWidget;
+class QPopupMenu;
+class QPoint;
+class QListViewItem;
+class QLabel;
+class QCheckBox;
+class QButtonGroup;
+class KListView;
+
+
+namespace Rosegarden
+{
+
+class Segment;
+class RosegardenGUIDoc;
+class Event;
+
+
+class EventView : public EditViewBase, public SegmentObserver
+{
+ Q_OBJECT
+
+ // Event filters
+ //
+ enum EventFilter
+ {
+ None = 0x0000,
+ Note = 0x0001,
+ Rest = 0x0002,
+ Text = 0x0004,
+ SystemExclusive = 0x0008,
+ Controller = 0x0010,
+ ProgramChange = 0x0020,
+ PitchBend = 0x0040,
+ ChannelPressure = 0x0080,
+ KeyPressure = 0x0100,
+ Indication = 0x0200,
+ Other = 0x0400
+ };
+
+public:
+ EventView(RosegardenGUIDoc *doc,
+ std::vector<Segment *> segments,
+ QWidget *parent);
+
+ virtual ~EventView();
+
+ virtual bool applyLayout(int staffNo = -1);
+
+ virtual void refreshSegment(Segment *segment,
+ timeT startTime = 0,
+ timeT endTime = 0);
+
+ virtual void updateView();
+
+ virtual void setupActions();
+ virtual void initStatusBar();
+ virtual QSize getViewSize();
+ virtual void setViewSize(QSize);
+
+ // Set the button states to the current filter positions
+ //
+ void setButtonsToFilter();
+
+ // Menu creation and show
+ //
+ void createMenu();
+
+public slots:
+
+ // standard slots
+ virtual void slotEditCut();
+ virtual void slotEditCopy();
+ virtual void slotEditPaste();
+
+ // other edit slots
+ void slotEditDelete();
+ void slotEditInsert();
+ void slotEditEvent();
+ void slotEditEventAdvanced();
+
+ void slotFilterSelection();
+ void slotSelectAll();
+ void slotClearSelection();
+
+ void slotMusicalTime();
+ void slotRealTime();
+ void slotRawTime();
+
+ // Show RMB menu
+ //
+ void slotPopupMenu(QListViewItem*, const QPoint&, int);
+ void slotMenuActivated(int);
+
+ // on double click on the event list
+ //
+ void slotPopupEventEditor(QListViewItem*);
+
+ // Change filter parameters
+ //
+ void slotModifyFilter(int);
+
+ virtual void eventAdded(const Segment *, Event *) { }
+ virtual void eventRemoved(const Segment *, Event *);
+ virtual void endMarkerTimeChanged(const Segment *, bool) { }
+ virtual void segmentDeleted(const Segment *);
+
+signals:
+ void editTriggerSegment(int);
+
+protected slots:
+ virtual void slotSaveOptions();
+
+ void slotEditTriggerName();
+ void slotEditTriggerPitch();
+ void slotEditTriggerVelocity();
+ void slotTriggerTimeAdjustChanged(int);
+ void slotTriggerRetuneChanged();
+
+protected:
+
+ virtual void readOptions();
+ void makeInitialSelection(timeT);
+ QString makeTimeString(timeT time, int timeMode);
+ QString makeDurationString(timeT time,
+ timeT duration, int timeMode);
+ virtual Segment *getCurrentSegment();
+
+ virtual void updateViewCaption();
+
+ //--------------- Data members ---------------------------------
+
+ bool m_isTriggerSegment;
+ QLabel *m_triggerName;
+ QLabel *m_triggerPitch;
+ QLabel *m_triggerVelocity;
+
+ KListView *m_eventList;
+ int m_eventFilter;
+
+ static int m_lastSetEventFilter;
+
+ QButtonGroup *m_filterGroup;
+ QCheckBox *m_noteCheckBox;
+ QCheckBox *m_textCheckBox;
+ QCheckBox *m_sysExCheckBox;
+ QCheckBox *m_programCheckBox;
+ QCheckBox *m_controllerCheckBox;
+ QCheckBox *m_restCheckBox;
+ QCheckBox *m_pitchBendCheckBox;
+ QCheckBox *m_keyPressureCheckBox;
+ QCheckBox *m_channelPressureCheckBox;
+ QCheckBox *m_indicationCheckBox;
+ QCheckBox *m_otherCheckBox;
+
+ std::vector<int> m_listSelection;
+ std::set<Event *> m_deletedEvents; // deleted since last refresh
+
+ QPopupMenu *m_menu;
+
+};
+
+
+}
+
+#endif
diff --git a/src/gui/editors/eventlist/EventViewItem.cpp b/src/gui/editors/eventlist/EventViewItem.cpp
new file mode 100644
index 0000000..4435a2b
--- /dev/null
+++ b/src/gui/editors/eventlist/EventViewItem.cpp
@@ -0,0 +1,68 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include "EventViewItem.h"
+#include "base/Event.h"
+
+namespace Rosegarden
+{
+
+// Reimplementation of sort for numeric columns - taking the
+// right hand argument from the left is equivalent to the
+// the QString compare().
+//
+int
+EventViewItem::compare(QListViewItem *i, int col, bool ascending) const
+{
+ EventViewItem *ei = dynamic_cast<EventViewItem *>(i);
+ if (!ei) return QListViewItem::compare(i, col, ascending);
+
+ if (col == 0) { // time
+ Rosegarden::Event &e1 = *m_event;
+ Rosegarden::Event &e2 = *ei->m_event;
+ if (e2 < e1) return 1;
+ else if (e1 < e2) return -1;
+ else return 0;
+ } else if (col == 2 || col == 5 || col == 6) { // event type, data1, data2
+ // we have to do string compares even for data1/data2 which are
+ // often numeric, just because they aren't _always_ numeric and
+ // we don't want to prevent the user being able to separate
+ // e.g. crescendo from decrescendo
+ if (key(col, ascending).compare(i->key(col, ascending)) == 0) {
+ return compare(i, 0, ascending);
+ } else {
+ return key(col, ascending).compare(i->key(col, ascending));
+ }
+ } else if (col == 3) { // pitch
+ // numeric comparison for pitch used to work when we only
+ // showed the numeric pitch number, but then we added the MIDI
+ // pitch name as well and that broke plain numeric comparison
+ return key(col, ascending).section(' ', 0, 0).toInt() -
+ i->key(col, ascending).section(' ', 0, 0).toInt();
+ } else { // numeric comparison
+ return key(col, ascending).toInt() - i->key(col, ascending).toInt();
+ }
+}
+
+}
diff --git a/src/gui/editors/eventlist/EventViewItem.h b/src/gui/editors/eventlist/EventViewItem.h
new file mode 100644
index 0000000..832e652
--- /dev/null
+++ b/src/gui/editors/eventlist/EventViewItem.h
@@ -0,0 +1,101 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_EVENTVIEWITEM_H_
+#define _RG_EVENTVIEWITEM_H_
+
+#include <klistview.h>
+
+namespace Rosegarden
+{
+
+class Segment;
+class Event;
+
+// EventView specialisation of a QListViewItem with the
+// addition of a segment pointer
+//
+class EventViewItem : public KListViewItem
+{
+public:
+ EventViewItem(Rosegarden::Segment *segment,
+ Rosegarden::Event *event,
+ KListView *parent) :
+ KListViewItem(parent),
+ m_segment(segment),
+ m_event(event) {;}
+
+ EventViewItem(Rosegarden::Segment *segment,
+ Rosegarden::Event *event,
+ KListViewItem *parent) :
+ KListViewItem(parent),
+ m_segment(segment),
+ m_event(event) {;}
+
+ EventViewItem(Rosegarden::Segment *segment,
+ Rosegarden::Event *event,
+ QListView *parent, QString label1,
+ QString label2 = QString::null,
+ QString label3 = QString::null,
+ QString label4 = QString::null,
+ QString label5 = QString::null,
+ QString label6 = QString::null,
+ QString label7 = QString::null,
+ QString label8 = QString::null) :
+ KListViewItem(parent, label1, label2, label3, label4,
+ label5, label6, label7, label8),
+ m_segment(segment),
+ m_event(event) {;}
+
+ EventViewItem(Rosegarden::Segment *segment,
+ Rosegarden::Event *event,
+ KListViewItem *parent, QString label1,
+ QString label2 = QString::null,
+ QString label3 = QString::null,
+ QString label4 = QString::null,
+ QString label5 = QString::null,
+ QString label6 = QString::null,
+ QString label7 = QString::null,
+ QString label8 = QString::null) :
+ KListViewItem(parent, label1, label2, label3, label4,
+ label5, label6, label7, label8),
+ m_segment(segment),
+ m_event(event) {;}
+
+ Rosegarden::Segment* getSegment() { return m_segment; }
+ Rosegarden::Event* getEvent() { return m_event; }
+
+ // Reimplement so that we can sort numerically
+ //
+ virtual int compare(QListViewItem *i, int col, bool ascending) const;
+
+protected:
+
+ Rosegarden::Segment *m_segment;
+ Rosegarden::Event *m_event;
+};
+
+}
+
+#endif /*EVENTVIEWITEM_H_*/
diff --git a/src/gui/editors/eventlist/TrivialVelocityDialog.cpp b/src/gui/editors/eventlist/TrivialVelocityDialog.cpp
new file mode 100644
index 0000000..4e609d4
--- /dev/null
+++ b/src/gui/editors/eventlist/TrivialVelocityDialog.cpp
@@ -0,0 +1,48 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include "TrivialVelocityDialog.h"
+
+#include <qspinbox.h>
+#include <qlabel.h>
+#include <qhbox.h>
+
+namespace Rosegarden {
+
+TrivialVelocityDialog::TrivialVelocityDialog(QWidget *parent, QString label, int deft) :
+ KDialogBase(parent, 0, true, label, Ok | Cancel)
+ {
+ QHBox *hbox = makeHBoxMainWidget();
+ new QLabel(label, hbox);
+ m_spin = new QSpinBox(0, 127, 1, hbox);
+ m_spin->setValue(deft);
+ }
+
+int
+TrivialVelocityDialog::getVelocity()
+{
+ return m_spin->value();
+}
+
+}
diff --git a/src/gui/editors/eventlist/TrivialVelocityDialog.h b/src/gui/editors/eventlist/TrivialVelocityDialog.h
new file mode 100644
index 0000000..ca19de9
--- /dev/null
+++ b/src/gui/editors/eventlist/TrivialVelocityDialog.h
@@ -0,0 +1,48 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_TRIVIALVELOCITYDIALOG_H_
+#define _RG_TRIVIALVELOCITYDIALOG_H_
+
+#include <kdialogbase.h>
+
+class QHBox;
+class QSpinBox;
+
+namespace Rosegarden {
+
+class TrivialVelocityDialog : public KDialogBase
+{
+public:
+ TrivialVelocityDialog(QWidget *parent, QString label, int deft);
+
+ int getVelocity();
+
+protected:
+ QSpinBox *m_spin;
+};
+
+}
+
+#endif /*TRIVIALVELOCITYDIALOG_H_*/
diff --git a/src/gui/editors/guitar/Chord.cpp b/src/gui/editors/guitar/Chord.cpp
new file mode 100644
index 0000000..23efe7d
--- /dev/null
+++ b/src/gui/editors/guitar/Chord.cpp
@@ -0,0 +1,113 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include "Chord.h"
+#include "base/Event.h"
+
+#include <qstring.h>
+
+namespace Rosegarden
+{
+
+namespace Guitar
+{
+const std::string Chord::EventType = "guitarchord";
+const short Chord::EventSubOrdering = -60;
+const PropertyName Chord::RootPropertyName = "root";
+const PropertyName Chord::ExtPropertyName = "ext";
+const PropertyName Chord::FingeringPropertyName = "fingering";
+
+
+Chord::Chord()
+ : m_isUserChord(false)
+{
+}
+
+Chord::Chord(const QString& root, const QString& ext)
+ : m_root(root),
+ m_ext(ext),
+ m_isUserChord(false)
+{
+ if (m_ext.isEmpty())
+ m_ext = QString::null;
+}
+
+Chord::Chord(const Event& e)
+ : m_isUserChord(false)
+{
+ std::string f;
+ bool ok;
+
+ ok = e.get<String>(RootPropertyName, f);
+ if (ok)
+ m_root = f;
+
+ ok = e.get<String>(ExtPropertyName, f);
+ if (ok) {
+ if (f.length() == 0)
+ m_ext = QString::null;
+ else
+ m_ext = f;
+ }
+
+ ok = e.get<String>(FingeringPropertyName, f);
+ if (ok) {
+ QString qf(f);
+ QString errString;
+
+ Fingering fingering = Fingering::parseFingering(qf, errString);
+ setFingering(fingering);
+ }
+}
+
+Event* Chord::getAsEvent(timeT absoluteTime) const
+{
+ Event *e = new Event(EventType, absoluteTime, 0, EventSubOrdering);
+ e->set<String>(RootPropertyName, m_root);
+ e->set<String>(ExtPropertyName, m_ext);
+ e->set<String>(FingeringPropertyName, getFingering().toString());
+ return e;
+}
+
+const QRegExp Chord::ALT_BASS_REGEXP("/[A-G]");
+
+bool operator<(const Chord& a, const Chord& b)
+{
+ if (a.m_root != b.m_root) {
+ return a.m_root < b.m_root;
+ } else if (a.m_ext != b.m_ext) {
+ if (a.m_ext.isEmpty()) // chords with no ext need to be stored first
+ return true;
+ if (b.m_ext.isEmpty())
+ return false;
+ return a.m_ext < b.m_ext;
+ } else {
+ return a.m_fingering < b.m_fingering;
+ }
+
+}
+
+}
+
+}
diff --git a/src/gui/editors/guitar/Chord.h b/src/gui/editors/guitar/Chord.h
new file mode 100644
index 0000000..9e84cc3
--- /dev/null
+++ b/src/gui/editors/guitar/Chord.h
@@ -0,0 +1,106 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_CHORD_H_
+#define _RG_CHORD_H_
+
+#include "Fingering.h"
+#include "base/Event.h"
+#include "misc/Debug.h"
+
+#include <vector>
+#include <qstring.h>
+#include <qregexp.h>
+
+namespace Rosegarden
+{
+
+class Event;
+
+namespace Guitar
+{
+
+class Chord
+{
+ friend bool operator<(const Chord&, const Chord&);
+
+public:
+ static const std::string EventType;
+ static const short EventSubOrdering;
+ static const PropertyName RootPropertyName;
+ static const PropertyName ExtPropertyName;
+ static const PropertyName FingeringPropertyName;
+
+ Chord();
+ Chord(const QString& root, const QString& ext = QString::null);
+ Chord(const Event&);
+
+ Event* getAsEvent(timeT absoluteTime) const;
+
+ bool isEmpty() const { return m_root.isEmpty(); }
+ bool operator!() const { return !m_root; }
+
+ bool isUserChord() const { return m_isUserChord; }
+ void setUserChord(bool c) { m_isUserChord = c; }
+
+ QString getRoot() const { return m_root; }
+ void setRoot(QString r) { m_root = r; }
+
+ QString getExt() const { return m_ext; }
+ void setExt(QString r) { m_ext = r.isEmpty() ? QString::null : r; }
+
+ bool hasAltBass() const { return m_ext.contains(ALT_BASS_REGEXP); }
+
+ Fingering getFingering() const { return m_fingering; }
+ void setFingering(Fingering f) { m_fingering = f; }
+
+ struct ChordCmp
+ {
+ bool operator()(const Chord &e1, const Chord &e2) const {
+ return e1 < e2;
+ }
+ bool operator()(const Chord *e1, const Chord *e2) const {
+ return *e1 < *e2;
+ }
+ };
+
+protected:
+
+ static const QRegExp ALT_BASS_REGEXP;
+
+ QString m_root;
+ QString m_ext;
+
+ Fingering m_fingering;
+
+ bool m_isUserChord;
+};
+
+bool operator<(const Chord&, const Chord&);
+
+}
+
+}
+
+#endif /*_RG_CHORD2_H_*/
diff --git a/src/gui/editors/guitar/ChordMap.cpp b/src/gui/editors/guitar/ChordMap.cpp
new file mode 100644
index 0000000..06662d9
--- /dev/null
+++ b/src/gui/editors/guitar/ChordMap.cpp
@@ -0,0 +1,223 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include "misc/Debug.h"
+#include "ChordMap.h"
+
+#include <qfile.h>
+#include <qtextstream.h>
+
+namespace Rosegarden
+{
+
+namespace Guitar
+{
+
+ChordMap::ChordMap()
+ : m_needSave(false)
+{
+}
+
+void ChordMap::insert(const Chord& c)
+{
+ m_map.insert(c);
+ m_needSave = true;
+}
+
+
+ChordMap::chordarray
+ChordMap::getChords(const QString& root, const QString& ext) const
+{
+ chordarray res;
+
+ Chord tmp(root, ext);
+ NOTATION_DEBUG << "ChordMap::getChords : chord = " << tmp << " - ext is empty : " << ext.isEmpty() << endl;
+
+ for (chordset::const_iterator i = m_map.lower_bound(tmp); i != m_map.end(); ++i) {
+ NOTATION_DEBUG << "ChordMap::getChords : checking chord " << *i << endl;
+
+ if (i->getRoot() != root)
+ break;
+
+ if (/* ext.isNull() || */ i->getExt() == ext) {
+ NOTATION_DEBUG << "ChordMap::getChords : adding chord " << *i << endl;
+ res.push_back(*i);
+ } else {
+ break;
+ }
+ }
+
+ return res;
+}
+
+QStringList
+ChordMap::getRootList() const
+{
+ static QStringList rootNotes;
+
+ if (rootNotes.count() == 0) {
+ rootNotes = QStringList::split(QString(","), "A,A#/Bb,B,C,C#/Db,D,D#/Eb,E,F,F#/Gb,G,G#/Ab");
+ }
+
+ // extract roots from map itself - not a very good idea
+ //
+// QString currentRoot;
+//
+// for(chordset::const_iterator i = m_map.begin(); i != m_map.end(); ++i) {
+// const Chord& chord = *i;
+// if (chord.getRoot() != currentRoot) {
+// rootNotes.push_back(chord.getRoot());
+// currentRoot = chord.getRoot();
+// }
+// }
+
+ return rootNotes;
+}
+
+QStringList
+ChordMap::getExtList(const QString& root) const
+{
+ QStringList extList;
+ QString currentExt = "ZZ";
+
+ Chord tmp(root);
+
+ for(chordset::const_iterator i = m_map.lower_bound(tmp); i != m_map.end(); ++i) {
+ const Chord& chord = *i;
+// NOTATION_DEBUG << "ChordMap::getExtList : chord = " << chord << endl;
+
+ if (chord.getRoot() != root)
+ break;
+
+ if (chord.getExt() != currentExt) {
+// NOTATION_DEBUG << "ChordMap::getExtList : adding ext " << chord.getExt() << " for root " << root << endl;
+ extList.push_back(chord.getExt());
+ currentExt = chord.getExt();
+ }
+ }
+
+ return extList;
+}
+
+void
+ChordMap::substitute(const Chord& oldChord, const Chord& newChord)
+{
+ remove(oldChord);
+ insert(newChord);
+}
+
+void
+ChordMap::remove(const Chord& c)
+{
+ m_map.erase(c);
+ m_needSave = true;
+}
+
+bool ChordMap::saveDocument(const QString& filename, bool userChordsOnly, QString& errMsg)
+{
+ QFile file(filename);
+ file.open(IO_WriteOnly);
+
+ QTextStream outStream(&file);
+
+ outStream.setEncoding(QTextStream::UnicodeUTF8);
+
+ outStream << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+ << "<!DOCTYPE rosegarden-chord-data>\n"
+ << "<rosegarden-chord-data version=\"" << VERSION
+ << "\" format-version-major=\"" << FILE_FORMAT_VERSION_MAJOR
+ << "\" format-version-minor=\"" << FILE_FORMAT_VERSION_MINOR
+ << "\" format-version-point=\"" << FILE_FORMAT_VERSION_POINT
+ << "\">\n";
+
+ outStream << "<chords>\n";
+
+ QString currentExt, currentRoot;
+
+ for(iterator i = begin(); i != end(); ++i) {
+ const Chord& chord = *i;
+
+ if (userChordsOnly && !chord.isUserChord())
+ continue; // skip non-user chords
+
+ if (chord.getRoot() != currentRoot) {
+
+ currentRoot = chord.getRoot();
+
+ // close current chordset (if there was one)
+ if (i != begin())
+ outStream << "\n</chordset>\n";
+
+ // open new chordset
+ outStream << "<chordset root=\"" << chord.getRoot() << "\">\n";
+ currentExt = "NEWEXT"; // to make sure we open a new chord right after that
+ }
+
+ if (chord.getExt() != currentExt) {
+
+ currentExt = chord.getExt();
+
+ // close current chord (if there was one)
+ if (i != begin())
+ outStream << "</chord>\n";
+
+ // open new chord
+ outStream << "<chord";
+ if (!chord.getExt().isEmpty())
+ outStream << " ext=\"" << chord.getExt() << "\"";
+ if (chord.isUserChord())
+ outStream << " user=\"true\"";
+
+ outStream << ">\n";
+ }
+
+ outStream << "<fingering>" << chord.getFingering().toString() << "</fingering>\n";
+ }
+
+ if (!m_map.empty())
+ outStream << "</chord>\n"; // close last written chord
+
+ outStream << "</chords>\n";
+ outStream << "</rosegarden-chord-data>\n";
+
+ return outStream.device()->status() == IO_Ok;
+}
+
+int ChordMap::FILE_FORMAT_VERSION_MAJOR = 1;
+int ChordMap::FILE_FORMAT_VERSION_MINOR = 0;
+int ChordMap::FILE_FORMAT_VERSION_POINT = 0;
+
+
+void
+ChordMap::debugDump() const
+{
+ for(chordset::const_iterator i = m_map.begin(); i != m_map.end(); ++i) {
+ Chord chord = *i;
+ NOTATION_DEBUG << "ChordMap::debugDump " << chord << endl;
+ }
+}
+
+}
+
+}
diff --git a/src/gui/editors/guitar/ChordMap.h b/src/gui/editors/guitar/ChordMap.h
new file mode 100644
index 0000000..5b7488d
--- /dev/null
+++ b/src/gui/editors/guitar/ChordMap.h
@@ -0,0 +1,87 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_CHORDMAP_H_
+#define _RG_CHORDMAP_H_
+
+#include "Chord.h"
+
+#include <qstringlist.h>
+#include <set>
+
+namespace Rosegarden
+{
+
+namespace Guitar
+{
+
+class ChordMap
+{
+ typedef std::set<Chord, Chord::ChordCmp> chordset;
+
+public:
+ typedef std::vector<Chord> chordarray;
+
+ typedef chordset::iterator iterator;
+ typedef chordset::const_iterator const_iterator;
+
+ static int FILE_FORMAT_VERSION_MAJOR;
+ static int FILE_FORMAT_VERSION_MINOR;
+ static int FILE_FORMAT_VERSION_POINT;
+
+ ChordMap();
+
+ void insert(const Chord&);
+ void substitute(const Chord& oldChord, const Chord& newChord);
+ void remove(const Chord&);
+
+ chordarray getChords(const QString& root, const QString& ext) const;
+
+ QStringList getRootList() const;
+ QStringList getExtList(const QString& root) const;
+
+ void debugDump() const;
+
+ bool needSave() const { return m_needSave; }
+ void clearNeedSave() { m_needSave = false; }
+
+ bool saveDocument(const QString& filename, bool userChordsOnly, QString& errMsg);
+
+ iterator begin() { return m_map.begin(); }
+ iterator end() { return m_map.end(); }
+ const_iterator begin() const { return m_map.begin(); }
+ const_iterator end() const { return m_map.end(); }
+
+protected:
+
+ chordset m_map;
+
+ bool m_needSave;
+};
+
+}
+
+}
+
+#endif /*_RG_CHORDMAP2_H_*/
diff --git a/src/gui/editors/guitar/ChordXmlHandler.cpp b/src/gui/editors/guitar/ChordXmlHandler.cpp
new file mode 100644
index 0000000..701c43c
--- /dev/null
+++ b/src/gui/editors/guitar/ChordXmlHandler.cpp
@@ -0,0 +1,154 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include "ChordXmlHandler.h"
+#include "misc/Debug.h"
+
+namespace Rosegarden
+{
+
+ChordXmlHandler::ChordXmlHandler(Guitar::ChordMap& map)
+ : ProgressReporter(0),
+ m_chordMap(map)
+{
+}
+
+ChordXmlHandler::~ChordXmlHandler()
+{
+}
+
+bool ChordXmlHandler::startDocument()
+{
+ // nothing to do ?
+ return true;
+}
+
+bool ChordXmlHandler::startElement(const QString& namespaceURI,
+ const QString& localName,
+ const QString& qName,
+ const QXmlAttributes& atts)
+{
+ QString lcName = qName.lower();
+
+ if (lcName == "chordset") {
+ // start new chord set
+ m_currentRoot = atts.value("root").stripWhiteSpace();
+
+ } else if (lcName == "chord") {
+
+ m_currentChord = Guitar::Chord(m_currentRoot);
+
+ if (atts.index("ext") >= 0)
+ m_currentChord.setExt(atts.value("ext").stripWhiteSpace());
+
+ if (atts.index("user") >= 0) {
+ QString userVal = atts.value("user").stripWhiteSpace().lower();
+ bool res = (userVal == "yes" || userVal == "1" || userVal == "true");
+ m_currentChord.setUserChord(res);
+ } else {
+ m_currentChord.setUserChord(false);
+ }
+
+ } else if (lcName == "fingering") {
+ m_inFingering = true;
+ }
+
+ return true;
+}
+
+bool ChordXmlHandler::endElement(const QString& namespaceURI,
+ const QString& localName,
+ const QString& qName)
+{
+ QString lcName = qName.lower();
+
+ if (lcName == "fingering") {
+
+ m_inFingering = false;
+ m_chordMap.insert(m_currentChord);
+ NOTATION_DEBUG << "ChordXmlHandler::endElement (fingering) : adding chord " << m_currentChord << endl;
+
+ } else if (lcName == "chord") {
+
+ // adding is done after each parsing of fingering
+ //
+// m_chordMap.insert(m_currentChord);
+
+ }
+
+ return true;
+}
+
+bool ChordXmlHandler::characters(const QString& ch)
+{
+ QString ch2 = ch.simplifyWhiteSpace();
+
+ if (!ch2.isEmpty() && m_inFingering) {
+ if (!parseFingering(ch2))
+ return false;
+ }
+
+ return true;
+}
+
+bool ChordXmlHandler::endDocument()
+{
+ return true;
+}
+
+bool ChordXmlHandler::parseFingering(const QString& ch) {
+
+ QString errString;
+
+ Guitar::Fingering fingering = Guitar::Fingering::parseFingering(ch, errString);
+
+ if (m_errorString.isEmpty()) {
+ NOTATION_DEBUG << "ChordXmlHandler::parseFingering : fingering " << ch << endl;
+ m_currentChord.setFingering(fingering);
+ return true;
+ } else {
+ m_errorString = errString;
+ return false;
+ }
+}
+
+bool
+ChordXmlHandler::error(const QXmlParseException& exception)
+{
+ m_errorString = QString("%1 at line %2, column %3")
+ .arg(exception.message())
+ .arg(exception.lineNumber())
+ .arg(exception.columnNumber());
+ return QXmlDefaultHandler::error( exception );
+}
+
+bool
+ChordXmlHandler::fatalError(const QXmlParseException& exception)
+{
+ m_errorString = QString("%1 at line %2, column %3")
+ .arg(exception.message())
+ .arg(exception.lineNumber())
+ .arg(exception.columnNumber());
+ return QXmlDefaultHandler::fatalError( exception );
+}
+
+
+}
diff --git a/src/gui/editors/guitar/ChordXmlHandler.h b/src/gui/editors/guitar/ChordXmlHandler.h
new file mode 100644
index 0000000..ca25168
--- /dev/null
+++ b/src/gui/editors/guitar/ChordXmlHandler.h
@@ -0,0 +1,78 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#ifndef _RG_CHORDXMLHANDLER_H_
+#define _RG_CHORDXMLHANDLER_H_
+
+#include "gui/general/ProgressReporter.h"
+#include "Chord.h"
+#include "ChordMap.h"
+
+#include <qxml.h>
+
+
+namespace Rosegarden
+{
+
+class ChordXmlHandler : public ProgressReporter, public QXmlDefaultHandler
+{
+public:
+ ChordXmlHandler(Guitar::ChordMap&);
+ virtual ~ChordXmlHandler();
+
+ /// overloaded handler functions
+ virtual bool startDocument();
+ virtual bool startElement(const QString& namespaceURI,
+ const QString& localName,
+ const QString& qName,
+ const QXmlAttributes& atts);
+
+ virtual bool endElement(const QString& namespaceURI,
+ const QString& localName,
+ const QString& qName);
+
+ virtual bool characters(const QString& ch);
+
+ virtual bool endDocument ();
+
+ /// Return the error string set during the parsing (if any)
+ QString errorString() { return m_errorString; }
+ bool error(const QXmlParseException& exception);
+ bool fatalError(const QXmlParseException& exception);
+
+protected:
+
+ bool parseFingering(const QString& ch);
+
+ Guitar::Chord m_currentChord;
+ QString m_currentRoot;
+ QString m_errorString;
+ bool m_inFingering;
+ Guitar::ChordMap& m_chordMap;
+};
+
+}
+
+#endif /*_RG_CHORDXMLHANDLER_H_*/
diff --git a/src/gui/editors/guitar/Fingering.cpp b/src/gui/editors/guitar/Fingering.cpp
new file mode 100644
index 0000000..dd1edbd
--- /dev/null
+++ b/src/gui/editors/guitar/Fingering.cpp
@@ -0,0 +1,152 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include "Fingering.h"
+
+#include "misc/Debug.h"
+
+#include <qstringlist.h>
+#include <sstream>
+#include <algorithm>
+#include <klocale.h>
+
+namespace Rosegarden
+{
+
+namespace Guitar
+{
+
+Fingering::Fingering(unsigned int nbStrings) :
+ m_strings(nbStrings, MUTED)
+{
+}
+
+Fingering::Fingering(QString s)
+{
+ QString errString;
+ Fingering t = parseFingering(s, errString);
+ m_strings = t.m_strings;
+}
+
+unsigned int
+Fingering::getStartFret() const
+{
+ int min = 999, max = 0;
+ for(std::vector<int>::const_iterator i = m_strings.begin(); i != m_strings.end(); ++i) {
+ if (*i < min && *i > 0)
+ min = *i;
+ if (*i > max)
+ max = *i;
+ }
+
+ if (max < 4)
+ min = 1;
+
+ return min == 999 ? 1 : min;
+}
+
+bool
+Fingering::hasBarre() const
+{
+ int lastStringStatus = m_strings[getNbStrings() - 1];
+
+ return ((m_strings[0] > OPEN && m_strings[0] == lastStringStatus) ||
+ (m_strings[1] > OPEN && m_strings[1] == lastStringStatus) ||
+ (m_strings[2] > OPEN && m_strings[2] == lastStringStatus));
+}
+
+Fingering::Barre
+Fingering::getBarre() const
+{
+ int lastStringStatus = m_strings[getNbStrings() - 1];
+
+ Barre res;
+
+ res.fret = lastStringStatus;
+
+ for(unsigned int i = 0; i < 3; ++i) {
+ if (m_strings[i] > OPEN && m_strings[i] == lastStringStatus)
+ res.start = i;
+ break;
+ }
+
+ res.end = 5;
+
+ return res;
+}
+
+Fingering
+Fingering::parseFingering(const QString& ch, QString& errorString)
+{
+ QStringList tokens = QStringList::split(' ', ch);
+
+ unsigned int idx = 0;
+ Fingering fingering;
+
+ for(QStringList::iterator i = tokens.begin(); i != tokens.end() && idx < fingering.getNbStrings(); ++i, ++idx) {
+ QString t = *i;
+ bool b = false;
+ unsigned int fn = t.toUInt(&b);
+ if (b) {
+// NOTATION_DEBUG << "Fingering::parseFingering : '" << t << "' = " << fn << endl;
+ fingering[idx] = fn;
+ } else if (t.lower() == "x") {
+// NOTATION_DEBUG << "Fingering::parseFingering : '" << t << "' = MUTED\n";
+ fingering[idx] = MUTED;
+ } else {
+ errorString = i18n("couldn't parse fingering '%1' in '%2'").arg(t).arg(ch);
+ }
+ }
+
+ return fingering;
+}
+
+
+std::string Fingering::toString() const
+{
+ std::stringstream s;
+
+ for(std::vector<int>::const_iterator i = m_strings.begin(); i != m_strings.end(); ++i) {
+ if (*i >= 0)
+ s << *i << ' ';
+ else
+ s << "x ";
+ }
+
+ return s.str();
+}
+
+bool operator<(const Fingering& a, const Fingering& b)
+{
+ for(unsigned int i = 0; i < Fingering::DEFAULT_NB_STRINGS; ++i) {
+ if (a.getStringStatus(i) != b.getStringStatus(i)) {
+ return a.getStringStatus(i) < b.getStringStatus(i);
+ }
+ }
+ return false;
+}
+
+}
+
+}
diff --git a/src/gui/editors/guitar/Fingering.h b/src/gui/editors/guitar/Fingering.h
new file mode 100644
index 0000000..41d9799
--- /dev/null
+++ b/src/gui/editors/guitar/Fingering.h
@@ -0,0 +1,95 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_FINGERING_H_
+#define _RG_FINGERING_H_
+
+#include <vector>
+#include <qstring.h>
+#include "base/Event.h"
+
+namespace Rosegarden
+{
+
+namespace Guitar
+{
+
+class Fingering
+{
+public:
+ friend bool operator<(const Fingering&, const Fingering&);
+
+ typedef std::vector<int>::iterator iterator;
+ typedef std::vector<int>::const_iterator const_iterator;
+
+ struct Barre {
+ unsigned int fret;
+ unsigned int start;
+ unsigned int end;
+ };
+
+ static const unsigned int DEFAULT_NB_STRINGS = 6;
+
+ Fingering(unsigned int nbStrings = DEFAULT_NB_STRINGS);
+ Fingering(QString);
+
+ enum { MUTED = -1, OPEN = 0 };
+
+ /**
+ * returns the fret number on which the string is pressed, or one of MUTED and OPEN
+ *
+ */
+ int getStringStatus(int stringNb) const { return m_strings[stringNb]; }
+ void setStringStatus(int stringNb, int status) { m_strings[stringNb] = status; }
+ unsigned int getStartFret() const;
+ unsigned int getNbStrings() const { return m_strings.size(); }
+
+ bool hasBarre() const;
+ Barre getBarre() const;
+
+ int operator[](int i) const { return m_strings[i]; }
+ int& operator[](int i) { return m_strings[i]; }
+
+ bool operator==(const Fingering& o) const { return m_strings == o.m_strings; }
+
+ iterator begin() { return m_strings.begin(); }
+ iterator end() { return m_strings.end(); }
+ const_iterator begin() const { return m_strings.begin(); }
+ const_iterator end() const { return m_strings.end(); }
+
+ static Fingering parseFingering(const QString&, QString& errorString);
+ std::string toString() const;
+
+protected:
+
+ std::vector<int> m_strings;
+};
+
+bool operator<(const Fingering&, const Fingering&);
+
+}
+
+}
+
+#endif /*_RG_FINGERING2_H_*/
diff --git a/src/gui/editors/guitar/FingeringBox.cpp b/src/gui/editors/guitar/FingeringBox.cpp
new file mode 100644
index 0000000..885ba83
--- /dev/null
+++ b/src/gui/editors/guitar/FingeringBox.cpp
@@ -0,0 +1,293 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "FingeringBox.h"
+#include "Fingering.h"
+
+#include "misc/Debug.h"
+
+namespace Rosegarden
+{
+
+FingeringBox::FingeringBox(unsigned int nbFrets, unsigned int nbStrings, bool editable, QWidget *parent, const char* name)
+ : QFrame(parent, name),
+ m_nbFretsDisplayed(nbFrets),
+ m_startFret(1),
+ m_nbStrings(nbStrings),
+ m_transientFretNb(0),
+ m_transientStringNb(0),
+ m_editable(editable),
+ m_noteSymbols(m_nbStrings, m_nbFretsDisplayed)
+{
+ init();
+}
+
+FingeringBox::FingeringBox(bool editable, QWidget *parent, const char* name)
+ : QFrame(parent, name),
+ m_nbFretsDisplayed(DEFAULT_NB_DISPLAYED_FRETS),
+ m_startFret(1),
+ m_nbStrings(Guitar::Fingering::DEFAULT_NB_STRINGS),
+ m_editable(editable),
+ m_noteSymbols(m_nbStrings, m_nbFretsDisplayed)
+{
+ init();
+}
+
+void
+FingeringBox::init()
+{
+ setFrameStyle(QFrame::StyledPanel | QFrame::Sunken);
+ setFixedSize(IMG_WIDTH, IMG_HEIGHT);
+ setBackgroundMode(PaletteBase);
+ if (m_editable)
+ setMouseTracking(true);
+
+}
+
+void
+FingeringBox::drawContents(QPainter* p)
+{
+// NOTATION_DEBUG << "FingeringBox::drawContents()" << endl;
+
+ // For all strings on guitar
+ // check state of string
+ // If pressed display note
+ // Else display muted or open symbol
+ // For all bars
+ // display bar
+ // Horizontal separator line
+
+ // draw guitar chord fingering
+ //
+ m_noteSymbols.drawFretNumber(p, m_startFret);
+ m_noteSymbols.drawFrets(p);
+ m_noteSymbols.drawStrings(p);
+
+ unsigned int stringNb = 0;
+
+ // draw notes
+ //
+ for (Guitar::Fingering::const_iterator pos = m_fingering.begin();
+ pos != m_fingering.end();
+ ++pos, ++stringNb) {
+
+ switch (*pos) {
+ case Guitar::Fingering::OPEN:
+// NOTATION_DEBUG << "Fingering::drawContents - drawing Open symbol on string " << stringNb << endl;
+ m_noteSymbols.drawOpenSymbol(p, stringNb);
+ break;
+
+ case Guitar::Fingering::MUTED:
+// NOTATION_DEBUG << "Fingering::drawContents - drawing Mute symbol on string" << stringNb << endl;
+ m_noteSymbols.drawMuteSymbol(p, stringNb);
+ break;
+
+ default:
+// NOTATION_DEBUG << "Fingering::drawContents - drawing note symbol at " << *pos << " on string " << stringNb << endl;
+ m_noteSymbols.drawNoteSymbol(p, stringNb, *pos - (m_startFret - 1), false);
+ break;
+ }
+ }
+
+ // TODO: detect barres and draw them in a special way ?
+
+ // draw transient note (visual feedback for mouse move)
+ //
+ if (hasMouse() &&
+ m_transientFretNb > 0 && m_transientFretNb <= m_nbFretsDisplayed &&
+ m_transientStringNb >= 0 && m_transientStringNb <= m_nbStrings) {
+ m_noteSymbols.drawNoteSymbol(p, m_transientStringNb, m_transientFretNb - (m_startFret - 1), true);
+ }
+
+ // DEBUG
+// p->save();
+// p->setPen(Qt::red);
+// unsigned int topBorderY = m_noteSymbols.getTopBorder(maximumHeight());
+// p->drawLine(0, topBorderY, 20, topBorderY);
+// p->drawRect(m_r1);
+// p->setPen(Qt::blue);
+// p->drawRect(m_r2);
+// p->restore();
+}
+
+void
+FingeringBox::setFingering(const Guitar::Fingering& f) {
+ m_fingering = f;
+ m_startFret = m_fingering.getStartFret();
+ update();
+}
+
+unsigned int
+FingeringBox::getStringNumber(const QPoint& pos)
+{
+ PositionPair result = m_noteSymbols.getStringNumber(maximumHeight(),
+ pos.x(),
+ m_nbStrings);
+ unsigned int stringNum = -1;
+
+ if(result.first){
+ stringNum = result.second;
+// RG_DEBUG << "FingeringBox::getStringNumber : res = " << stringNum << endl;
+ }
+
+ return stringNum;
+}
+
+unsigned int
+FingeringBox::getFretNumber(const QPoint& pos)
+{
+ unsigned int fretNum = 0;
+
+ if(true || pos.y() > m_noteSymbols.getTopBorder(maximumHeight())) {
+ // If fret position is below the top line of the guitar chord image.
+ PositionPair result = m_noteSymbols.getFretNumber(maximumWidth(),
+ pos.y(),
+ m_nbFretsDisplayed);
+
+ if(result.first) {
+ fretNum = result.second + (m_startFret - 1);
+// RG_DEBUG << "FingeringBox::getFretNumber : res = " << fretNum << " startFret = " << m_startFret << endl;
+ } else {
+// RG_DEBUG << "FingeringBox::getFretNumber : no res\n";
+ }
+ }
+
+ return fretNum;
+}
+
+void
+FingeringBox::mousePressEvent(QMouseEvent *event)
+{
+ if (!m_editable)
+ return;
+
+ if((event->button() == LeftButton) && m_editable) {
+
+ // Find string position
+ m_press_string_num = getStringNumber(event->pos());
+
+ // Find fret position
+ m_press_fret_num = getFretNumber(event->pos());
+ }
+}
+
+void
+FingeringBox::mouseReleaseEvent(QMouseEvent *event)
+{
+ if(!m_editable)
+ return ;
+
+ unsigned int release_string_num = getStringNumber(event->pos());
+ unsigned int release_fret_num = getFretNumber(event->pos());
+
+ processMouseRelease(release_string_num, release_fret_num);
+}
+
+void
+FingeringBox::processMouseRelease(unsigned int release_string_num,
+ unsigned int release_fret_num)
+{
+ if(m_press_fret_num == release_fret_num) {
+ // If press string & fret pos == release string & fret position, display chord
+ if(m_press_string_num == release_string_num) {
+
+ if(m_press_fret_num < (m_startFret + m_nbFretsDisplayed)) {
+
+ unsigned int aVal = m_press_fret_num;
+
+ if(m_press_fret_num == 0) {
+
+ int stringStatus = m_fingering.getStringStatus(m_press_string_num);
+
+ if (stringStatus == Guitar::Fingering::OPEN)
+ aVal = Guitar::Fingering::MUTED;
+ else if (stringStatus > Guitar::Fingering::OPEN)
+ aVal = Guitar::Fingering::OPEN;
+
+ }
+
+ m_fingering.setStringStatus(m_press_string_num, aVal);
+
+ update();
+ }
+ }
+ // else if press fret pos == release fret pos & press string pos != release string pos, display bar
+ else {
+ if(((m_press_string_num > 0)&&(release_string_num > 0)) &&
+ (( m_press_string_num <= m_nbStrings)&&
+ (release_string_num <= m_nbStrings)) &&
+ (( m_press_fret_num <(m_startFret + m_nbFretsDisplayed)) &&
+ (release_fret_num <(m_startFret + m_nbFretsDisplayed)))) {
+
+ // TODO deal with barre later on
+
+ }
+ }
+ }
+}
+
+
+void
+FingeringBox::mouseMoveEvent( QMouseEvent *event )
+{
+ if (!m_editable)
+ return;
+
+ unsigned int transientStringNb = getStringNumber(event->pos());
+ unsigned int transientFretNb = getFretNumber(event->pos());
+
+ if (transientStringNb != m_transientStringNb ||
+ transientFretNb != m_transientFretNb) {
+
+ QRect r1 = m_noteSymbols.getTransientNoteSymbolRect(size(),
+ m_transientStringNb,
+ m_transientFretNb - (m_startFret - 1));
+ m_transientStringNb = transientStringNb;
+ m_transientFretNb = transientFretNb;
+ QRect r2 = m_noteSymbols.getTransientNoteSymbolRect(size(),
+ m_transientStringNb,
+ m_transientFretNb - (m_startFret - 1));
+
+ m_r1 = r1;
+ m_r2 = r2;
+
+// RG_DEBUG << "Fingering::updateTransientPos r1 = " << r1 << " - r2 = " << r2 << endl;
+
+// QRect updateRect = r1 | r2;
+// update(updateRect);
+
+ update();
+
+ }
+
+}
+
+void
+FingeringBox::leaveEvent(QEvent*)
+{
+ update();
+}
+
+}
diff --git a/src/gui/editors/guitar/FingeringBox.h b/src/gui/editors/guitar/FingeringBox.h
new file mode 100644
index 0000000..b54c0a8
--- /dev/null
+++ b/src/gui/editors/guitar/FingeringBox.h
@@ -0,0 +1,106 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+
+#ifndef _RG_FINGERINGBOX_H_
+#define _RG_FINGERINGBOX_H_
+
+#include <qframe.h>
+
+#include "NoteSymbols.h"
+#include "Fingering.h"
+
+namespace Rosegarden
+{
+
+class Fingering;
+
+class FingeringBox : public QFrame
+{
+ static const unsigned int IMG_WIDTH = 200;
+ static const unsigned int IMG_HEIGHT = 200;
+
+public:
+ FingeringBox(unsigned int nbFrets, unsigned int nbStrings, bool editable, QWidget *parent, const char* name = 0);
+ FingeringBox(bool editable, QWidget *parent, const char* name = 0);
+
+ void setStartFret(unsigned int f) { m_startFret = f; update(); }
+ unsigned int getStartFret() const { return m_startFret; }
+
+ void setFingering(const Guitar::Fingering&);
+ const Guitar::Fingering& getFingering() { return m_fingering; }
+
+ const Guitar::NoteSymbols& getNoteSymbols() const { return m_noteSymbols; }
+
+ static const unsigned int DEFAULT_NB_DISPLAYED_FRETS = 4;
+
+protected:
+ void init();
+
+ virtual void drawContents(QPainter*);
+
+ virtual void mousePressEvent(QMouseEvent*);
+ virtual void mouseReleaseEvent(QMouseEvent*);
+ virtual void mouseMoveEvent(QMouseEvent*);
+ virtual void leaveEvent(QEvent*);
+
+ void processMouseRelease( unsigned int release_string_num, unsigned int release_fret_num);
+
+ typedef std::pair<bool, unsigned int> PositionPair;
+
+ unsigned int getStringNumber(const QPoint&);
+
+ unsigned int getFretNumber(const QPoint&);
+
+ //! Maximum number of frets displayed by FingeringBox
+ unsigned int m_nbFretsDisplayed;
+
+ unsigned int m_startFret;
+
+ unsigned int m_nbStrings;
+
+ unsigned int m_transientFretNb;
+ unsigned int m_transientStringNb;
+
+ //! Present mode
+ bool m_editable;
+
+ //! Handle to the present fingering
+ Guitar::Fingering m_fingering;
+
+ //! String number where a mouse press event was located
+ unsigned int m_press_string_num;
+
+ //! Fret number where a mouse press event was located
+ unsigned int m_press_fret_num;
+
+ Guitar::NoteSymbols m_noteSymbols;
+
+ QRect m_r1, m_r2;
+};
+
+}
+
+#endif /*_RG_FINGERINGBOX2_H_*/
diff --git a/src/gui/editors/guitar/FingeringListBoxItem.cpp b/src/gui/editors/guitar/FingeringListBoxItem.cpp
new file mode 100644
index 0000000..31b92e9
--- /dev/null
+++ b/src/gui/editors/guitar/FingeringListBoxItem.cpp
@@ -0,0 +1,36 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "FingeringListBoxItem.h"
+
+namespace Rosegarden {
+
+FingeringListBoxItem::FingeringListBoxItem(const Guitar::Chord& chord, QListBox* parent, QPixmap pixmap, QString fingeringString)
+ : QListBoxPixmap(parent, pixmap, fingeringString),
+ m_chord(chord)
+{
+}
+
+}
diff --git a/src/gui/editors/guitar/FingeringListBoxItem.h b/src/gui/editors/guitar/FingeringListBoxItem.h
new file mode 100644
index 0000000..b7625e2
--- /dev/null
+++ b/src/gui/editors/guitar/FingeringListBoxItem.h
@@ -0,0 +1,46 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#ifndef _RG_FINGERINGLISTBOXITEM_H_
+#define _RG_FINGERINGLISTBOXITEM_H_
+
+#include <qlistbox.h>
+#include "Chord.h"
+
+namespace Rosegarden {
+
+class FingeringListBoxItem : public QListBoxPixmap
+{
+public:
+ FingeringListBoxItem(const Guitar::Chord& chord, QListBox* parent, QPixmap pixmap, QString fingeringString);
+
+ const Guitar::Chord& getChord() { return m_chord; }
+protected:
+ Guitar::Chord m_chord;
+};
+
+}
+
+#endif /*_RG_FINGERINGLISTBOXITEM_H_*/
diff --git a/src/gui/editors/guitar/GuitarChordEditorDialog.cpp b/src/gui/editors/guitar/GuitarChordEditorDialog.cpp
new file mode 100644
index 0000000..60da8b6
--- /dev/null
+++ b/src/gui/editors/guitar/GuitarChordEditorDialog.cpp
@@ -0,0 +1,109 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include "GuitarChordEditorDialog.h"
+#include "FingeringBox.h"
+#include "Chord.h"
+#include "ChordMap.h"
+
+#include <klineedit.h>
+#include <qcombobox.h>
+#include <qspinbox.h>
+#include <klocale.h>
+#include <kmessagebox.h>
+#include <kstddirs.h>
+#include <qlayout.h>
+#include <qlabel.h>
+
+namespace Rosegarden
+{
+
+GuitarChordEditorDialog::GuitarChordEditorDialog(Guitar::Chord& chord, const Guitar::ChordMap& chordMap, QWidget *parent)
+ : KDialogBase(parent, "GuitarChordEditor", true, i18n("Guitar Chord Editor"), Ok|Cancel),
+ m_chord(chord),
+ m_chordMap(chordMap)
+{
+ QWidget *page = new QWidget(this);
+ setMainWidget(page);
+ QGridLayout *topLayout = new QGridLayout(page, 7, 2, spacingHint());
+
+ topLayout->addWidget(new QLabel(i18n("Start fret"), page), 0, 1);
+ m_startFret = new QSpinBox(1, 24, 1, page);
+ topLayout->addWidget(m_startFret, 1, 1);
+
+ connect(m_startFret, SIGNAL(valueChanged(int)),
+ this, SLOT(slotStartFretChanged(int)));
+
+ topLayout->addWidget(new QLabel(i18n("Root"), page), 2, 1);
+ m_rootNotesList = new QComboBox(page);
+ topLayout->addWidget(m_rootNotesList, 3, 1);
+
+ topLayout->addWidget(new QLabel(i18n("Extension"), page), 4, 1);
+ m_ext = new QComboBox(true, page);
+ topLayout->addWidget(m_ext, 5, 1);
+
+ topLayout->addItem(new QSpacerItem(1, 1), 6, 1);
+
+ m_fingeringBox = new FingeringBox(true, page);
+ m_fingeringBox->setFingering(m_chord.getFingering());
+ topLayout->addMultiCellWidget(m_fingeringBox, 0, 7, 0, 0);
+
+ NOTATION_DEBUG << "GuitarChordEditorDialog : chord = " << m_chord << endl;
+
+
+ QStringList rootList = m_chordMap.getRootList();
+ if (rootList.count() > 0) {
+ m_rootNotesList->insertStringList(rootList);
+ m_rootNotesList->setCurrentItem(rootList.findIndex(m_chord.getRoot()));
+ }
+
+ QStringList extList = m_chordMap.getExtList(m_chord.getRoot());
+ if (extList.count() > 0) {
+ m_ext->insertStringList(extList);
+ m_ext->setCurrentItem(extList.findIndex(m_chord.getExt()));
+ }
+
+}
+
+void
+GuitarChordEditorDialog::slotStartFretChanged(int startFret)
+{
+ m_fingeringBox->setStartFret(startFret);
+}
+
+void
+GuitarChordEditorDialog::slotOk()
+{
+ m_chord.setFingering(m_fingeringBox->getFingering());
+ m_chord.setExt(m_ext->currentText());
+ m_chord.setRoot(m_rootNotesList->currentText());
+ m_chord.setUserChord(true);
+ KDialogBase::slotOk();
+}
+
+
+}
+
+#include "GuitarChordEditorDialog.moc"
+
diff --git a/src/gui/editors/guitar/GuitarChordEditorDialog.h b/src/gui/editors/guitar/GuitarChordEditorDialog.h
new file mode 100644
index 0000000..fc01605
--- /dev/null
+++ b/src/gui/editors/guitar/GuitarChordEditorDialog.h
@@ -0,0 +1,67 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_GUITARCHORDEDITOR2_H_
+#define _RG_GUITARCHORDEDITOR2_H_
+
+#include <kdialogbase.h>
+
+#include "Chord.h"
+#include "ChordMap.h"
+
+class QComboBox;
+class QSpinBox;
+
+namespace Rosegarden
+{
+
+class FingeringBox;
+
+
+class GuitarChordEditorDialog : public KDialogBase
+{
+ Q_OBJECT
+
+public:
+ GuitarChordEditorDialog(Guitar::Chord&, const Guitar::ChordMap& chordMap, QWidget *parent=0);
+
+protected slots:
+ void slotStartFretChanged(int);
+ virtual void slotOk();
+
+protected:
+
+ void populateExtensions(const QStringList&);
+
+ FingeringBox* m_fingeringBox;
+ QComboBox* m_rootNotesList;
+ QSpinBox* m_startFret;
+ QComboBox* m_ext;
+ Guitar::Chord& m_chord;
+ const Guitar::ChordMap& m_chordMap;
+};
+
+}
+
+#endif /*_RG_GUITARCHORDEDITOR2_H_*/
diff --git a/src/gui/editors/guitar/GuitarChordSelectorDialog.cpp b/src/gui/editors/guitar/GuitarChordSelectorDialog.cpp
new file mode 100644
index 0000000..bd62c1f
--- /dev/null
+++ b/src/gui/editors/guitar/GuitarChordSelectorDialog.cpp
@@ -0,0 +1,475 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include "GuitarChordSelectorDialog.h"
+#include "GuitarChordEditorDialog.h"
+#include "ChordXmlHandler.h"
+#include "FingeringBox.h"
+#include "FingeringListBoxItem.h"
+
+#include "misc/Debug.h"
+#include <qlistbox.h>
+#include <qlayout.h>
+#include <qcombobox.h>
+#include <qpushbutton.h>
+#include <qlabel.h>
+#include <klocale.h>
+#include <kmessagebox.h>
+#include <kstddirs.h>
+
+namespace Rosegarden
+{
+
+GuitarChordSelectorDialog::GuitarChordSelectorDialog(QWidget *parent)
+ : KDialogBase(parent, "GuitarChordSelector", true, i18n("Guitar Chord Selector"), Ok|Cancel)
+{
+ QWidget *page = new QWidget(this);
+ setMainWidget(page);
+ QGridLayout *topLayout = new QGridLayout(page, 3, 4, spacingHint());
+
+ topLayout->addWidget(new QLabel(i18n("Root"), page), 0, 0);
+ m_rootNotesList = new QListBox(page);
+ topLayout->addWidget(m_rootNotesList, 1, 0);
+
+ topLayout->addWidget(new QLabel(i18n("Extension"), page), 0, 1);
+ m_chordExtList = new QListBox(page);
+ topLayout->addWidget(m_chordExtList, 1, 1);
+
+ m_newFingeringButton = new QPushButton(i18n("New"), page);
+ m_deleteFingeringButton = new QPushButton(i18n("Delete"), page);
+ m_editFingeringButton = new QPushButton(i18n("Edit"), page);
+
+ m_chordComplexityCombo = new QComboBox(page);
+ m_chordComplexityCombo->insertItem(i18n("beginner"));
+ m_chordComplexityCombo->insertItem(i18n("common"));
+ m_chordComplexityCombo->insertItem(i18n("all"));
+
+ connect(m_chordComplexityCombo, SIGNAL(activated(int)),
+ this, SLOT(slotComplexityChanged(int)));
+
+ QVBoxLayout* vboxLayout = new QVBoxLayout(page, 5);
+ topLayout->addMultiCellLayout(vboxLayout, 1, 3, 2, 2);
+ vboxLayout->addWidget(m_chordComplexityCombo);
+ vboxLayout->addStretch(10);
+ vboxLayout->addWidget(m_newFingeringButton);
+ vboxLayout->addWidget(m_deleteFingeringButton);
+ vboxLayout->addWidget(m_editFingeringButton);
+
+ connect(m_newFingeringButton, SIGNAL(clicked()),
+ this, SLOT(slotNewFingering()));
+ connect(m_deleteFingeringButton, SIGNAL(clicked()),
+ this, SLOT(slotDeleteFingering()));
+ connect(m_editFingeringButton, SIGNAL(clicked()),
+ this, SLOT(slotEditFingering()));
+
+ topLayout->addWidget(new QLabel(i18n("Fingerings"), page), 0, 3);
+ m_fingeringsList = new QListBox(page);
+ topLayout->addMultiCellWidget(m_fingeringsList, 1, 2, 3, 3);
+
+ m_fingeringBox = new FingeringBox(false, page);
+ topLayout->addMultiCellWidget(m_fingeringBox, 2, 2, 0, 1);
+
+ connect(m_rootNotesList, SIGNAL(highlighted(int)),
+ this, SLOT(slotRootHighlighted(int)));
+ connect(m_chordExtList, SIGNAL(highlighted(int)),
+ this, SLOT(slotChordExtHighlighted(int)));
+ connect(m_fingeringsList, SIGNAL(highlighted(QListBoxItem*)),
+ this, SLOT(slotFingeringHighlighted(QListBoxItem*)));
+}
+
+void
+GuitarChordSelectorDialog::init()
+{
+ // populate the listboxes
+ //
+ std::vector<QString> chordFiles = getAvailableChordFiles();
+
+ parseChordFiles(chordFiles);
+
+// m_chordMap.debugDump();
+
+ populate();
+}
+
+void
+GuitarChordSelectorDialog::populate()
+{
+ QStringList rootList = m_chordMap.getRootList();
+ if (rootList.count() > 0) {
+ m_rootNotesList->insertStringList(rootList);
+
+ QStringList extList = m_chordMap.getExtList(rootList.first());
+ populateExtensions(extList);
+
+ Guitar::ChordMap::chordarray chords = m_chordMap.getChords(rootList.first(), extList.first());
+ populateFingerings(chords);
+
+ m_chord.setRoot(rootList.first());
+ m_chord.setExt(extList.first());
+ }
+
+ m_rootNotesList->sort();
+
+ m_rootNotesList->setCurrentItem(0);
+}
+
+void
+GuitarChordSelectorDialog::clear()
+{
+ m_rootNotesList->clear();
+ m_chordExtList->clear();
+ m_fingeringsList->clear();
+}
+
+void
+GuitarChordSelectorDialog::refresh()
+{
+ clear();
+ populate();
+}
+
+void
+GuitarChordSelectorDialog::slotRootHighlighted(int i)
+{
+ NOTATION_DEBUG << "GuitarChordSelectorDialog::slotRootHighlighted " << i << endl;
+
+ m_chord.setRoot(m_rootNotesList->text(i));
+
+ QStringList extList = m_chordMap.getExtList(m_chord.getRoot());
+ populateExtensions(extList);
+ if (m_chordExtList->count() > 0)
+ m_chordExtList->setCurrentItem(0);
+ else
+ m_fingeringsList->clear(); // clear any previous fingerings
+}
+
+void
+GuitarChordSelectorDialog::slotChordExtHighlighted(int i)
+{
+ NOTATION_DEBUG << "GuitarChordSelectorDialog::slotChordExtHighlighted " << i << endl;
+
+ Guitar::ChordMap::chordarray chords = m_chordMap.getChords(m_chord.getRoot(), m_chordExtList->text(i));
+ populateFingerings(chords);
+
+ m_fingeringsList->setCurrentItem(0);
+}
+
+void
+GuitarChordSelectorDialog::slotFingeringHighlighted(QListBoxItem* listBoxItem)
+{
+ NOTATION_DEBUG << "GuitarChordSelectorDialog::slotFingeringHighlighted\n";
+
+ FingeringListBoxItem* fingeringItem = dynamic_cast<FingeringListBoxItem*>(listBoxItem);
+ if (fingeringItem) {
+ m_chord = fingeringItem->getChord();
+ m_fingeringBox->setFingering(m_chord.getFingering());
+ setEditionEnabled(m_chord.isUserChord());
+ }
+}
+
+void
+GuitarChordSelectorDialog::slotComplexityChanged(int)
+{
+ // simply repopulate the extension list box
+ //
+ QStringList extList = m_chordMap.getExtList(m_chord.getRoot());
+ populateExtensions(extList);
+ if (m_chordExtList->count() > 0)
+ m_chordExtList->setCurrentItem(0);
+ else
+ m_fingeringsList->clear(); // clear any previous fingerings
+}
+
+void
+GuitarChordSelectorDialog::slotNewFingering()
+{
+ Guitar::Chord newChord;
+ newChord.setRoot(m_chord.getRoot());
+ newChord.setExt(m_chord.getExt());
+
+ GuitarChordEditorDialog* chordEditorDialog = new GuitarChordEditorDialog(newChord, m_chordMap, this);
+
+ if (chordEditorDialog->exec() == QDialog::Accepted) {
+ m_chordMap.insert(newChord);
+ // populate lists
+ //
+ if (!m_rootNotesList->findItem(newChord.getRoot(), Qt::ExactMatch)) {
+ m_rootNotesList->insertItem(newChord.getRoot());
+ m_rootNotesList->sort();
+ }
+
+ if (!m_chordExtList->findItem(newChord.getExt(), Qt::ExactMatch)) {
+ m_chordExtList->insertItem(newChord.getExt());
+ m_chordExtList->sort();
+ }
+ }
+
+ delete chordEditorDialog;
+
+ refresh();
+}
+
+void
+GuitarChordSelectorDialog::slotDeleteFingering()
+{
+ if (m_chord.isUserChord()) {
+ m_chordMap.remove(m_chord);
+ delete m_fingeringsList->selectedItem();
+ }
+}
+
+void
+GuitarChordSelectorDialog::slotEditFingering()
+{
+ Guitar::Chord newChord = m_chord;
+ GuitarChordEditorDialog* chordEditorDialog = new GuitarChordEditorDialog(newChord, m_chordMap, this);
+
+ if (chordEditorDialog->exec() == QDialog::Accepted) {
+ NOTATION_DEBUG << "GuitarChordSelectorDialog::slotEditFingering() - current map state :\n";
+ m_chordMap.debugDump();
+ m_chordMap.substitute(m_chord, newChord);
+ NOTATION_DEBUG << "GuitarChordSelectorDialog::slotEditFingering() - new map state :\n";
+ m_chordMap.debugDump();
+ setChord(newChord);
+ }
+
+ delete chordEditorDialog;
+
+ refresh();
+}
+
+void
+GuitarChordSelectorDialog::slotOk()
+{
+ if (m_chordMap.needSave()) {
+ saveUserChordMap();
+ m_chordMap.clearNeedSave();
+ }
+
+ KDialogBase::slotOk();
+}
+
+void
+GuitarChordSelectorDialog::setChord(const Guitar::Chord& chord)
+{
+ NOTATION_DEBUG << "GuitarChordSelectorDialog::setChord " << chord << endl;
+
+ m_chord = chord;
+
+ // select the chord's root
+ //
+ m_rootNotesList->setCurrentItem(0);
+ QListBoxItem* correspondingRoot = m_rootNotesList->findItem(chord.getRoot(), Qt::ExactMatch);
+ if (correspondingRoot)
+ m_rootNotesList->setSelected(correspondingRoot, true);
+
+ // update the dialog's complexity setting if needed, then populate the extension list
+ //
+ QString chordExt = chord.getExt();
+ int complexityLevel = m_chordComplexityCombo->currentItem();
+ int chordComplexity = evaluateChordComplexity(chordExt);
+
+ if (chordComplexity > complexityLevel) {
+ m_chordComplexityCombo->setCurrentItem(chordComplexity);
+ }
+
+ QStringList extList = m_chordMap.getExtList(chord.getRoot());
+ populateExtensions(extList);
+
+ // select the chord's extension
+ //
+ if (chordExt.isEmpty()) {
+ chordExt = "";
+ m_chordExtList->setSelected(0, true);
+ } else {
+ QListBoxItem* correspondingExt = m_chordExtList->findItem(chordExt, Qt::ExactMatch);
+ if (correspondingExt)
+ m_chordExtList->setSelected(correspondingExt, true);
+ }
+
+ // populate fingerings and pass the current chord's fingering so it is selected
+ //
+ Guitar::ChordMap::chordarray similarChords = m_chordMap.getChords(chord.getRoot(), chord.getExt());
+ populateFingerings(similarChords, chord.getFingering());
+}
+
+void
+GuitarChordSelectorDialog::populateFingerings(const Guitar::ChordMap::chordarray& chords, const Guitar::Fingering& refFingering)
+{
+ m_fingeringsList->clear();
+
+ for(Guitar::ChordMap::chordarray::const_iterator i = chords.begin(); i != chords.end(); ++i) {
+ const Guitar::Chord& chord = *i;
+ QString fingeringString = chord.getFingering().toString();
+ NOTATION_DEBUG << "GuitarChordSelectorDialog::populateFingerings " << chord << endl;
+ QPixmap fingeringPixmap = getFingeringPixmap(chord.getFingering());
+ FingeringListBoxItem *item = new FingeringListBoxItem(chord, m_fingeringsList, fingeringPixmap, fingeringString);
+ if (refFingering == chord.getFingering()) {
+ NOTATION_DEBUG << "GuitarChordSelectorDialog::populateFingerings - fingering found " << fingeringString << endl;
+ m_fingeringsList->setSelected(item, true);
+ }
+ }
+
+}
+
+
+QPixmap
+GuitarChordSelectorDialog::getFingeringPixmap(const Guitar::Fingering& fingering) const
+{
+ QPixmap pixmap(FINGERING_PIXMAP_WIDTH, FINGERING_PIXMAP_HEIGHT);
+ pixmap.fill();
+
+ QPainter pp(&pixmap);
+ QPainter *p = &pp;
+
+ p->setViewport(FINGERING_PIXMAP_H_MARGIN, FINGERING_PIXMAP_W_MARGIN,
+ FINGERING_PIXMAP_WIDTH - FINGERING_PIXMAP_W_MARGIN,
+ FINGERING_PIXMAP_HEIGHT - FINGERING_PIXMAP_H_MARGIN);
+
+ Guitar::NoteSymbols::drawFingeringPixmap(fingering, m_fingeringBox->getNoteSymbols(), p);
+
+ return pixmap;
+}
+
+void
+GuitarChordSelectorDialog::populateExtensions(const QStringList& extList)
+{
+ m_chordExtList->clear();
+
+ if (m_chordComplexityCombo->currentItem() != COMPLEXITY_ALL) {
+ // some filtering needs to be done
+ int complexityLevel = m_chordComplexityCombo->currentItem();
+
+ QStringList filteredList;
+ for(QStringList::const_iterator i = extList.constBegin(); i != extList.constEnd(); ++i) {
+ if (evaluateChordComplexity((*i).lower().stripWhiteSpace()) <= complexityLevel) {
+ NOTATION_DEBUG << "GuitarChordSelectorDialog::populateExtensions - adding '" << *i << "'\n";
+ filteredList.append(*i);
+ }
+ }
+
+ m_chordExtList->insertStringList(filteredList);
+
+ } else {
+ m_chordExtList->insertStringList(extList);
+ }
+}
+
+int
+GuitarChordSelectorDialog::evaluateChordComplexity(const QString& ext)
+{
+ if (ext.isEmpty() ||
+ ext == "7" ||
+ ext == "m" ||
+ ext == "5")
+ return COMPLEXITY_BEGINNER;
+
+ if (ext == "dim" ||
+ ext == "dim7" ||
+ ext == "aug" ||
+ ext == "sus2" ||
+ ext == "sus4" ||
+ ext == "maj7" ||
+ ext == "m7" ||
+ ext == "mmaj7" ||
+ ext == "m7b5" ||
+ ext == "7sus4")
+
+ return COMPLEXITY_COMMON;
+
+ return COMPLEXITY_ALL;
+}
+
+void
+GuitarChordSelectorDialog::parseChordFiles(const std::vector<QString>& chordFiles)
+{
+ for(std::vector<QString>::const_iterator i = chordFiles.begin(); i != chordFiles.end(); ++i) {
+ parseChordFile(*i);
+ }
+}
+
+void
+GuitarChordSelectorDialog::parseChordFile(const QString& chordFileName)
+{
+ ChordXmlHandler handler(m_chordMap);
+ QFile chordFile(chordFileName);
+ bool ok = chordFile.open(IO_ReadOnly);
+ if (!ok)
+ KMessageBox::error(0, i18n("couldn't open file '%1'").arg(handler.errorString()));
+
+ QXmlInputSource source(chordFile);
+ QXmlSimpleReader reader;
+ reader.setContentHandler(&handler);
+ reader.setErrorHandler(&handler);
+ NOTATION_DEBUG << "GuitarChordSelectorDialog::parseChordFile() parsing " << chordFileName << endl;
+ reader.parse(source);
+ if (!ok)
+ KMessageBox::error(0, i18n("couldn't parse chord dictionnary : %1").arg(handler.errorString()));
+
+}
+
+void
+GuitarChordSelectorDialog::setEditionEnabled(bool enabled)
+{
+ m_deleteFingeringButton->setEnabled(enabled);
+ m_editFingeringButton->setEnabled(enabled);
+}
+
+std::vector<QString>
+GuitarChordSelectorDialog::getAvailableChordFiles()
+{
+ std::vector<QString> names;
+
+ // Read config for default directory
+ QStringList chordDictFiles = KGlobal::dirs()->findAllResources("appdata", "chords/*.xml");
+
+ for(QStringList::iterator i = chordDictFiles.begin(); i != chordDictFiles.end(); ++i) {
+ NOTATION_DEBUG << "GuitarChordSelectorDialog::getAvailableChordFiles : adding file " << *i << endl;
+ names.push_back(*i);
+ }
+
+ return names;
+}
+
+bool
+GuitarChordSelectorDialog::saveUserChordMap()
+{
+ // Read config for user directory
+ QString userDir = KGlobal::dirs()->saveLocation("appdata", "chords/");
+
+ QString userChordDictPath = userDir + "/user_chords.xml";
+
+ NOTATION_DEBUG << "GuitarChordSelectorDialog::saveUserChordMap() : saving user chord map to " << userChordDictPath << endl;
+ QString errMsg;
+
+ m_chordMap.saveDocument(userChordDictPath, true, errMsg);
+
+ return errMsg.isEmpty();
+}
+
+
+}
+
+
+#include "GuitarChordSelectorDialog.moc"
diff --git a/src/gui/editors/guitar/GuitarChordSelectorDialog.h b/src/gui/editors/guitar/GuitarChordSelectorDialog.h
new file mode 100644
index 0000000..6c8f1ad
--- /dev/null
+++ b/src/gui/editors/guitar/GuitarChordSelectorDialog.h
@@ -0,0 +1,120 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#ifndef _RG_GUITARCHORDSELECTORDIALOG_H_
+#define _RG_GUITARCHORDSELECTORDIALOG_H_
+
+#include "Chord.h"
+#include "ChordMap.h"
+
+#include <kdialogbase.h>
+#include <qstring.h>
+#include <vector>
+
+class QListBox;
+class QListBoxItem;
+class QComboBox;
+class QPushButton;
+
+namespace Rosegarden
+{
+
+class FingeringBox;
+
+class GuitarChordSelectorDialog : public KDialogBase
+{
+ Q_OBJECT
+
+ enum { COMPLEXITY_BEGINNER, COMPLEXITY_COMMON, COMPLEXITY_ALL };
+
+public:
+ GuitarChordSelectorDialog(QWidget *parent=0);
+
+ void init();
+
+ const Guitar::Chord& getChord() const { return m_chord; }
+
+ void setChord(const Guitar::Chord&);
+
+protected slots:
+ void slotRootHighlighted(int);
+ void slotChordExtHighlighted(int);
+ void slotFingeringHighlighted(QListBoxItem*);
+ void slotComplexityChanged(int);
+
+ void slotNewFingering();
+ void slotDeleteFingering();
+ void slotEditFingering();
+
+ virtual void slotOk();
+
+protected:
+
+ void parseChordFiles(const std::vector<QString>& chordFiles);
+ void parseChordFile(const QString& chordFileName);
+ void populateFingerings(const Guitar::ChordMap::chordarray&, const Guitar::Fingering& refFingering=Guitar::Fingering(0));
+ void populateExtensions(const QStringList& extList);
+
+ /// set enabled state of edit/delete buttons
+ void setEditionEnabled(bool);
+
+ void populate();
+ void clear();
+ void refresh();
+
+ bool saveUserChordMap();
+ int evaluateChordComplexity(const QString& ext);
+
+ QPixmap getFingeringPixmap(const Guitar::Fingering& fingering) const;
+
+ /// Find all chord list files on the system
+ std::vector<QString> getAvailableChordFiles();
+
+ Guitar::ChordMap m_chordMap;
+
+ /// current selected chord
+ Guitar::Chord m_chord;
+
+ // Chord data
+ QListBox* m_rootNotesList;
+ QListBox* m_chordExtList;
+ QListBox* m_fingeringsList;
+ FingeringBox* m_fingeringBox;
+
+ QComboBox* m_chordComplexityCombo;
+ QPushButton* m_newFingeringButton;
+ QPushButton* m_deleteFingeringButton;
+ QPushButton* m_editFingeringButton;
+
+ static const unsigned int FINGERING_PIXMAP_HEIGHT = 75;
+ static const unsigned int FINGERING_PIXMAP_WIDTH = 75;
+ static const unsigned int FINGERING_PIXMAP_H_MARGIN = 5;
+ static const unsigned int FINGERING_PIXMAP_W_MARGIN = 5;
+
+};
+
+}
+
+#endif /*_RG_GUITARCHORDSELECTORDIALOG_H_*/
diff --git a/src/gui/editors/guitar/NoteSymbols.cpp b/src/gui/editors/guitar/NoteSymbols.cpp
new file mode 100644
index 0000000..14379de
--- /dev/null
+++ b/src/gui/editors/guitar/NoteSymbols.cpp
@@ -0,0 +1,486 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ This file contains code from
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include "NoteSymbols.h"
+#include "Fingering.h"
+#include "misc/Debug.h"
+
+namespace Rosegarden
+{
+
+namespace Guitar
+{
+NoteSymbols::posPair
+NoteSymbols::getX ( int imgWidth, unsigned int stringNb, unsigned int nbOfStrings ) const
+{
+ /*
+ std::cout << "NoteSymbols::getX - input values" << std::endl
+ << " position: " << position << std::endl
+ << " string #: " << string_num << std::endl
+ << " scale: " << scale << std::endl;
+ */
+ unsigned int lBorder = getLeftBorder( imgWidth );
+ unsigned int guitarChordWidth = getGuitarChordWidth( imgWidth );
+ unsigned int columnWidth = guitarChordWidth / nbOfStrings;
+ return std::make_pair( ( stringNb * columnWidth + lBorder ), columnWidth );
+}
+
+NoteSymbols::posPair
+NoteSymbols::getY ( int imgHeight, unsigned int fretNb, unsigned int nbOfFrets ) const
+{
+ /*
+ std::cout << "NoteSymbols::getY - input values" << std::endl
+ << " position: " << fret_pos << std::endl
+ << " max frets: " << maxFretNum << std::endl
+ << " scale: " << scale << std::endl;
+ */
+ unsigned int tBorder = getTopBorder( imgHeight );
+ unsigned int guitarChordHeight = getGuitarChordHeight( imgHeight );
+ unsigned int rowHeight = guitarChordHeight / nbOfFrets;
+ return std::make_pair( ( ( fretNb * rowHeight ) + tBorder ), rowHeight );
+}
+
+void
+NoteSymbols::drawMuteSymbol ( QPainter* p,
+ unsigned int position ) const
+{
+ QRect v = p->viewport();
+
+ posPair x_pos = getX ( v.width(), position, m_nbOfStrings );
+ unsigned int y_pos = getTopBorder( v.height() ) / 2;
+ double columnWidth = x_pos.second;
+ unsigned int width = static_cast<unsigned int>( columnWidth * 0.7 );
+ unsigned int height = static_cast<unsigned int>( columnWidth * 0.7 );
+
+ //std::cout << "NoteSymbols::drawMuteSymbol - drawing Mute symbol at string #" << position
+ //<< std::endl;
+
+ p->drawLine ( x_pos.first - ( width / 2 ),
+ y_pos - ( height / 2 ),
+ ( x_pos.first + ( width / 2 ) ),
+ y_pos + ( height / 2 ) );
+
+ p->drawLine( x_pos.first + ( width / 2 ),
+ y_pos - ( height / 2 ),
+ ( x_pos.first - ( width / 2 ) ),
+ y_pos + ( height / 2 ) );
+}
+
+void
+NoteSymbols::drawOpenSymbol ( QPainter* p,
+ unsigned int position ) const
+{
+ QRect v = p->viewport();
+ posPair x_pos = getX ( v.width(), position, m_nbOfStrings );
+ unsigned int y_pos = getTopBorder( v.height() ) / 2;
+ double columnWidth = x_pos.second;
+ unsigned int radius = static_cast<unsigned int>( columnWidth * 0.7 );
+
+ //std::cout << "NoteSymbols::drawOpenSymbol - drawing Open symbol at string #" << position
+ //<< std::endl;
+
+ p->setBrush( QBrush(p->brush().color(), Qt::NoBrush) );
+ p->drawEllipse( x_pos.first - ( radius / 2 ),
+ y_pos - ( radius / 2 ),
+ radius,
+ radius );
+}
+
+void
+NoteSymbols::drawNoteSymbol ( QPainter* p,
+ unsigned int stringNb,
+ int fretNb,
+ bool transient ) const
+{
+// NOTATION_DEBUG << "NoteSymbols::drawNoteSymbol - string: " << stringNb << ", fret:" << fretNb << endl;
+
+ QRect v = p->viewport();
+ posPair x_pos = getX ( v.width(), stringNb, m_nbOfStrings );
+ posPair y_pos = getY ( v.height(), fretNb, m_nbOfFrets );
+ double columnWidth = x_pos.second;
+ unsigned int radius;
+
+ if (transient) {
+ radius = static_cast<unsigned int>( columnWidth /* * 0.9 */ );
+ p->setBrush( QBrush(p->brush().color(), Qt::NoBrush) );
+ } else {
+ radius = static_cast<unsigned int>( columnWidth * 0.7 );
+ p->setBrush( QBrush(p->brush().color(), Qt::SolidPattern) );
+ }
+
+ int x = x_pos.first - ( radius / 2 ),
+ y = y_pos.first + ( (y_pos.second - radius) / 2) - y_pos.second + TOP_GUITAR_CHORD_MARGIN;
+
+// y = y_pos.first - (radius / 2) - y_pos.second + TOP_GUITAR_CHORD_MARGIN;
+
+// RG_DEBUG << "NoteSymbols::drawNoteSymbol : rect = " << QRect(x,y, radius, radius) << endl;
+
+ p->drawEllipse( x,
+ y,
+ radius,
+ radius );
+
+// p->save();
+// p->setPen(Qt::red);
+// p->drawRect( x, y, radius, radius );
+// p->restore();
+}
+
+void
+NoteSymbols::drawBarreSymbol ( QPainter* p,
+ int fretNb,
+ unsigned int start,
+ unsigned int end ) const
+{
+
+ //std::cout << "NoteSymbols::drawBarreSymbol - start: " << start << ", end:" << end << std::endl;
+
+ drawNoteSymbol ( p, start, fretNb );
+
+ if ( ( end - start ) >= 1 ) {
+ QRect v = p->viewport();
+ posPair startXPos = getX ( v.width(), start, m_nbOfStrings );
+ posPair endXPos = getX ( v.width(), end, m_nbOfStrings );
+ posPair y_pos = getY ( v.height(), fretNb, m_nbOfFrets );
+ double columnWidth = startXPos.second;
+ unsigned int thickness = static_cast<unsigned int>( columnWidth * 0.7 );
+
+ p->drawRect( startXPos.first,
+ y_pos.first + ( y_pos.second / 4 ) + TOP_GUITAR_CHORD_MARGIN,
+ endXPos.first - startXPos.first,
+ thickness );
+ }
+
+ drawNoteSymbol ( p, end, fretNb );
+}
+
+void
+NoteSymbols::drawFretNumber ( QPainter* p,
+ unsigned int fret_num ) const
+{
+ if ( fret_num > 1 ) {
+ QRect v = p->viewport();
+ unsigned int imgWidth = v.width();
+ unsigned int imgHeight = v.height();
+
+ p->save();
+ QFont font;
+ font.setPixelSize(getFontPixelSize(v.width(), v.height()));
+ p->setFont(font);
+
+ QString tmp;
+ tmp.setNum( fret_num );
+
+ // Use NoteSymbols to grab X and Y for first fret
+ posPair y_pos = getY( imgHeight, 0, m_nbOfFrets );
+
+ p->drawText( getLeftBorder( imgWidth ) / 4,
+ y_pos.first + ( y_pos.second / 2 ),
+ tmp );
+
+ p->restore();
+ }
+}
+
+void
+NoteSymbols::drawFrets ( QPainter* p ) const
+{
+ /*
+ std::cout << "NoteSymbols::drawFretHorizontalLines" << std::endl
+ << " scale: " << scale << std::endl
+ << " frets: " << fretsDisplayed << std::endl
+ << " max string: " << maxStringNum << std::endl;
+ */
+
+ QRect v = p->viewport();
+ unsigned int imgWidth = v.width();
+ unsigned int imgHeight = v.height();
+ //unsigned int endXPos = getGuitarChordWidth(imgWidth) + getLeftBorder(imgWidth);
+ posPair endXPos = getX ( imgWidth, m_nbOfStrings - 1, m_nbOfStrings );
+
+ unsigned int yGuitarChord = getGuitarChordHeight( imgHeight );
+ unsigned int rowHeight = yGuitarChord / m_nbOfFrets;
+
+ QPen pen(p->pen());
+ pen.setWidth(imgHeight >= 100 ? FRET_PEN_WIDTH : FRET_PEN_WIDTH / 2);
+ p->save();
+ p->setPen(pen);
+ unsigned int y_pos = (getY ( imgHeight, 0, m_nbOfFrets )).first + TOP_GUITAR_CHORD_MARGIN;
+
+// NOTATION_DEBUG << "NoteSymbols::drawFrets : " << m_nbOfFrets << endl;
+
+ // Horizontal lines
+ for ( unsigned int i = 0; i <= m_nbOfFrets; ++i ) {
+
+ /* This code borrowed from KGuitar 0.5 */
+ p->drawLine( getLeftBorder( imgWidth ),
+ y_pos,
+ endXPos.first,
+ y_pos);
+// NOTATION_DEBUG << "NoteSymbols::drawFrets : " << QPoint(getLeftBorder(imgWidth), y_pos)
+// << " to " << QPoint(endXPos.first, y_pos) << endl;
+
+
+ y_pos += rowHeight;
+ }
+
+ p->restore();
+
+}
+
+void
+NoteSymbols::drawStrings ( QPainter* p ) const
+{
+ // Vertical lines
+ QRect v = p->viewport();
+ int imgHeight = v.height();
+ int imgWidth = v.width();
+
+ unsigned int startPos = getTopBorder( imgHeight ) + TOP_GUITAR_CHORD_MARGIN;
+ unsigned int endPos = (getY ( imgHeight, m_nbOfFrets, m_nbOfFrets )).first + TOP_GUITAR_CHORD_MARGIN;
+
+ unsigned int guitarChordWidth = getGuitarChordWidth( imgWidth );
+ unsigned int columnWidth = guitarChordWidth / m_nbOfStrings;
+
+ unsigned int x_pos = (getX ( imgWidth, 0, m_nbOfStrings )).first;
+
+ QPen pen(p->pen());
+ pen.setWidth(imgWidth >= 100 ? STRING_PEN_WIDTH : STRING_PEN_WIDTH / 2);
+ p->save();
+ p->setPen(pen);
+
+ for ( unsigned int i = 0; i < m_nbOfStrings; ++i ) {
+
+ /* This code borrowed from KGuitar 0.5 */
+ p->drawLine( x_pos,
+ startPos,
+ x_pos,
+ endPos );
+
+ x_pos += columnWidth;
+ }
+
+ p->restore();
+
+}
+
+QRect NoteSymbols::getTransientNoteSymbolRect(QSize guitarChordSize,
+ unsigned int stringNb,
+ int fretNb) const
+{
+ posPair x_pos = getX ( guitarChordSize.width(), stringNb, m_nbOfStrings );
+ posPair y_pos = getY ( guitarChordSize.height(), fretNb, m_nbOfFrets );
+ double columnWidth = x_pos.second;
+ unsigned int radius = static_cast<unsigned int>( columnWidth /* * 0.9 */ );
+
+ int x = x_pos.first - ( radius / 2 ),
+ y = y_pos.first + ( (y_pos.second - radius) / 2) - y_pos.second + TOP_GUITAR_CHORD_MARGIN;
+
+ return QRect(x, y, radius, radius);
+}
+
+unsigned int
+NoteSymbols::getTopBorder ( unsigned int imgHeight ) const
+{
+ return static_cast<unsigned int>( TOP_BORDER_PERCENTAGE * imgHeight );
+}
+
+unsigned int
+NoteSymbols::getBottomBorder ( unsigned int imgHeight ) const
+{
+ return static_cast<unsigned int>( imgHeight * BOTTOM_BORDER_PERCENTAGE );
+}
+
+unsigned int
+NoteSymbols::getLeftBorder ( unsigned int imgWidth ) const
+{
+ unsigned int left = static_cast<unsigned int>( imgWidth * LEFT_BORDER_PERCENTAGE );
+ if ( left < 15 ) {
+ left = 15;
+ }
+ return left;
+}
+
+unsigned int
+NoteSymbols::getRightBorder ( unsigned int imgWidth ) const
+{
+ return static_cast<unsigned int>( imgWidth * RIGHT_BORDER_PERCENTAGE );
+}
+
+unsigned int
+NoteSymbols::getGuitarChordWidth ( int imgWidth ) const
+{
+ return static_cast<unsigned int>( imgWidth * GUITAR_CHORD_WIDTH_PERCENTAGE );
+}
+
+unsigned int
+NoteSymbols::getGuitarChordHeight ( int imgHeight ) const
+{
+ return static_cast<unsigned int>( imgHeight * GUITAR_CHORD_HEIGHT_PERCENTAGE );
+}
+
+unsigned int
+NoteSymbols::getFontPixelSize ( int imgWidth, int imgHeight ) const
+{
+ return std::max(8, imgHeight / 10);
+}
+
+std::pair<bool, unsigned int>
+NoteSymbols::getStringNumber ( int imgWidth,
+ unsigned int x_pos,
+ unsigned int maxStringNum ) const
+{
+ /*
+ std::cout << "NoteSymbols::getNumberOfStrings - input values" << std::endl
+ << " X position: " << x_pos << std::endl
+ << " string #: " << maxStringNum << std::endl
+ << " image width: " << imgWidth << std::endl;
+ */
+ bool valueOk = false;
+
+ posPair xPairPos;
+ unsigned int min = 0;
+ unsigned int max = 0;
+ unsigned int result = 0;
+
+ for ( unsigned int i = 0; i < maxStringNum; ++i ) {
+ xPairPos = getX ( imgWidth, i, maxStringNum );
+
+ // If the counter equals zero then we are at the first
+ // string to the left
+ if ( i == 0 ) {
+ // Add 10 pixel buffer to range comparison
+ min = xPairPos.first - 10;
+ } else {
+ min = xPairPos.first - xPairPos.second / 2;
+ }
+
+ // If the counter equals the maxString number -1 then we are at the last
+ // string to the right
+ if ( i == ( maxStringNum - 1 ) ) {
+ // Add 10 pixel buffer to range comparison
+ max = xPairPos.first + 10;
+ } else {
+ max = xPairPos.first + xPairPos.second / 2;
+ }
+
+ if ( ( x_pos >= min ) && ( x_pos <= max ) ) {
+ result = i;
+ valueOk = true;
+ break;
+ }
+ }
+
+ //std::cout << "NoteSymbols::getNumberOfStrings - string: #" << result << std::endl;
+ return std::make_pair( valueOk, result );
+}
+
+std::pair<bool, unsigned int>
+NoteSymbols::getFretNumber ( int imgHeight,
+ unsigned int y_pos,
+ unsigned int maxFretNum ) const
+{
+ /*
+ std::cout << "NoteSymbols::getNumberOfFrets - input values" << std::endl
+ << " Y position: " << y_pos << std::endl
+ << " max frets: " << maxFretNum << std::endl
+ << " image height: " << imgHeight << std::endl;
+ */
+
+ bool valueOk = false;
+ unsigned int tBorder = getTopBorder( imgHeight );
+ unsigned int result = 0;
+
+ if ( y_pos < tBorder ) {
+ // User pressing above the guitar chord to mark line muted or opened
+ valueOk = true;
+ } else {
+ typedef std::pair<unsigned int, unsigned int> RangePair;
+
+ posPair min_pos;
+ posPair max_pos;
+
+ for ( unsigned int i = 0; i < maxFretNum; ++i ) {
+ min_pos = getY ( imgHeight, i, maxFretNum );
+ max_pos = getY ( imgHeight, i + 1, maxFretNum );
+
+ if ( ( y_pos >= min_pos.first ) && y_pos <= max_pos.first - 1 ) {
+ result = i + 1;
+ valueOk = true;
+ break;
+ }
+ }
+ }
+ // std::cout << " fret #: " << result << std::endl;
+ return std::make_pair( valueOk, result );
+}
+
+void
+NoteSymbols::drawFingeringPixmap(const Guitar::Fingering& fingering, const Guitar::NoteSymbols& noteSymbols, QPainter *p)
+{
+ unsigned int startFret = fingering.getStartFret();
+
+ noteSymbols.drawFretNumber(p, startFret);
+ noteSymbols.drawFrets(p);
+ noteSymbols.drawStrings(p);
+
+ unsigned int stringNb = 0;
+
+ for (Fingering::const_iterator pos = fingering.begin();
+ pos != fingering.end();
+ ++pos, ++stringNb) {
+
+ switch (*pos) {
+ case Fingering::OPEN:
+ noteSymbols.drawOpenSymbol(p, stringNb);
+ break;
+
+ case Fingering::MUTED:
+ noteSymbols.drawMuteSymbol(p, stringNb);
+ break;
+
+ default:
+ noteSymbols.drawNoteSymbol(p, stringNb, *pos - (startFret - 1), false);
+ break;
+ }
+ }
+
+}
+
+
+float const NoteSymbols::LEFT_BORDER_PERCENTAGE = 0.2;
+float const NoteSymbols::RIGHT_BORDER_PERCENTAGE = 0.1;
+float const NoteSymbols::GUITAR_CHORD_WIDTH_PERCENTAGE = 0.8;
+float const NoteSymbols::TOP_BORDER_PERCENTAGE = 0.1;
+float const NoteSymbols::BOTTOM_BORDER_PERCENTAGE = 0.1;
+float const NoteSymbols::GUITAR_CHORD_HEIGHT_PERCENTAGE = 0.8;
+int const NoteSymbols::TOP_GUITAR_CHORD_MARGIN = 5;
+int const NoteSymbols::FRET_PEN_WIDTH = 2;
+int const NoteSymbols::STRING_PEN_WIDTH = 2;
+
+} /* namespace Guitar */
+
+}
+
diff --git a/src/gui/editors/guitar/NoteSymbols.h b/src/gui/editors/guitar/NoteSymbols.h
new file mode 100644
index 0000000..f90fefb
--- /dev/null
+++ b/src/gui/editors/guitar/NoteSymbols.h
@@ -0,0 +1,192 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ This file contains code from
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#ifndef _RG_SYMBOLS_H_
+#define _RG_SYMBOLS_H_
+
+#include <qbrush.h>
+#include <qpainter.h>
+
+namespace Rosegarden
+{
+
+/**
+ *----------------------------------------
+ * Finding X position on guitar chord pixmap
+ *----------------------------------------
+ *
+ * Originally x = position * scale + FC::BORDER + FC::CIRCBORD + FC::FRETTEXT
+ *
+ * The last three can be condense into on term called XBorder
+ * XBorder = FC::BORDER + FC::CIRCBORD + FC::FRETTEXT
+ * = 5 + 2 + 10 (see fingers.h)
+ * = 17
+ *
+ * The drawable guitar chord space on the x-axis:
+ * XGuitarChord = pixmap width - XBorder
+ * = width - 17
+ *
+ * The guitar chord x-axis is broken up into colums which represent the drawable
+ * space for a guitar chord component (e.g. note, barre)
+ * Column Width = XGuitarChord / number of strings
+ *
+ * Therefore a new x can be calculated from the position and the column width
+ * x = (position * Column Width) + XBorder
+ *
+ *-------------------------------------------
+ * Finding Y position on guitar chord pixmap
+ *-------------------------------------------
+ *
+ * Originally y = (FC::BORDER * scale) + (2 * FC::SPACER) + (fret * scale) + FC::CIRCBORD
+ *
+ * As with the x-axis the equation can be separated into the position plus the border. In
+ * this case YBorder
+ * YBorder = (FC::BORDER*scale) + (2*FC::SPACER) + FC::CIRCBORD
+ * = 17 (If we want to use the same border as the x-axis)
+ *
+ * The drawable guitar chord space on the y-axis:
+ * YGuitarChord = pixmap height - YBorder
+ *
+ * The guitar chord y-axis is broken up into rows which represent the drawable
+ * space for a guitar chord component (e.g. note, barre)
+ * Row Height = YGuitarChord / number of frets
+ *
+ * Therefore a new y can be calculated from the fret position and the row height
+ * y = fret * Row Height
+ **/
+
+namespace Guitar
+{
+
+class Fingering;
+
+
+class NoteSymbols
+{
+private:
+ typedef std::pair<unsigned int, unsigned int> posPair;
+
+ static float const LEFT_BORDER_PERCENTAGE;
+ static float const RIGHT_BORDER_PERCENTAGE;
+ static float const GUITAR_CHORD_WIDTH_PERCENTAGE;
+ static float const TOP_BORDER_PERCENTAGE;
+ static float const BOTTOM_BORDER_PERCENTAGE;
+ static float const GUITAR_CHORD_HEIGHT_PERCENTAGE;
+ static int const TOP_GUITAR_CHORD_MARGIN;
+ static int const FRET_PEN_WIDTH;
+ static int const STRING_PEN_WIDTH;
+
+public:
+
+ NoteSymbols(unsigned int nbOfStrings, unsigned int nbOfFrets) :
+ m_nbOfStrings(nbOfStrings),
+ m_nbOfFrets(nbOfFrets) {};
+
+ //! Display a mute symbol in the QPainter object
+ void
+ drawMuteSymbol ( QPainter* p,
+ unsigned int position ) const;
+
+ /* This code borrowed from KGuitar 0.5 */
+ //! Display a open symbol in the QPainter object (KGuitar)
+ void drawOpenSymbol ( QPainter* p,
+ unsigned int position ) const;
+
+ /* This code borrowed from KGuitar 0.5 */
+ //! Display a note symbol in the QPainter object (KGuitar)
+ void drawNoteSymbol ( QPainter* p,
+ unsigned int stringNb,
+ int fretNb,
+ bool transient = false ) const;
+
+ /* This code borrowed from KGuitar 0.5 */
+ /**
+ * Display a bar symbol in the QPainter object (KGuitar)
+ * The code from the KGuitar project was modified to display a bar. This feature was not
+ * available in that project
+ */
+ void drawBarreSymbol ( QPainter* p,
+ int fretNb,
+ unsigned int start,
+ unsigned int end ) const;
+
+ void drawFretNumber ( QPainter* p,
+ unsigned int fret_num ) const;
+
+ void drawFrets ( QPainter* p ) const;
+
+ void drawStrings ( QPainter* p ) const;
+
+ unsigned int getTopBorder ( unsigned int imgHeight ) const;
+
+ unsigned int getBottomBorder ( unsigned int imgHeight ) const;
+
+ unsigned int getLeftBorder ( unsigned int imgWidth ) const;
+
+ unsigned int getRightBorder ( unsigned int imgWidth ) const;
+
+ unsigned int getGuitarChordWidth ( int imgWidth ) const;
+
+ unsigned int getGuitarChordHeight ( int imgHeight ) const;
+
+ unsigned int getFontPixelSize ( int imgWidth, int imgHeight ) const;
+
+ std::pair<bool, unsigned int>
+ getStringNumber ( int imgWidth,
+ unsigned int x_pos,
+ unsigned int string_num ) const;
+
+ std::pair<bool, unsigned int>
+ getFretNumber ( int imgHeight,
+ unsigned int y_pos,
+ unsigned int maxFretNum ) const;
+
+ QRect getTransientNoteSymbolRect(QSize guitarChordSize,
+ unsigned int stringNb,
+ int fretNb) const;
+
+ static void drawFingeringPixmap(const Fingering& fingering, const NoteSymbols& noteSymbols, QPainter *p);
+
+private:
+
+ posPair
+ getX ( int imgWidth, unsigned int stringNb, unsigned int nbOfStrings ) const;
+
+ posPair
+ getY ( int imgHeight, unsigned int fretNb, unsigned int nbOfFrets ) const;
+
+
+ unsigned int m_nbOfStrings;
+ unsigned int m_nbOfFrets;
+
+};
+
+} /* namespace Guitar */
+
+}
+
+#endif /* SYMBOLS_H_ */
+
diff --git a/src/gui/editors/matrix/MatrixCanvasView.cpp b/src/gui/editors/matrix/MatrixCanvasView.cpp
new file mode 100644
index 0000000..c92b4aa
--- /dev/null
+++ b/src/gui/editors/matrix/MatrixCanvasView.cpp
@@ -0,0 +1,302 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "MatrixCanvasView.h"
+
+#include "base/SnapGrid.h"
+#include "gui/general/MidiPitchLabel.h"
+#include "gui/general/RosegardenCanvasView.h"
+#include "MatrixElement.h"
+#include "MatrixStaff.h"
+#include "QCanvasMatrixRectangle.h"
+#include "QCanvasMatrixDiamond.h"
+#include <qcanvas.h>
+#include <qpoint.h>
+#include <qwidget.h>
+#include "misc/Debug.h"
+
+
+
+namespace Rosegarden
+{
+
+MatrixCanvasView::MatrixCanvasView(MatrixStaff& staff,
+ SnapGrid *snapGrid,
+ bool drumMode,
+ QCanvas *viewing, QWidget *parent,
+ const char *name, WFlags f)
+ : RosegardenCanvasView(viewing, parent, name, f),
+ m_staff(staff),
+ m_snapGrid(snapGrid),
+ m_drumMode(drumMode),
+ m_previousEvTime(0),
+ m_previousEvPitch(0),
+ m_mouseWasPressed(false),
+ m_ignoreClick(false),
+ m_smoothModifier(Qt::ShiftButton),
+ m_lastSnap(SnapGrid::SnapToBeat),
+ m_isSnapTemporary(false)
+{
+ viewport()->setMouseTracking(true);
+}
+
+MatrixCanvasView::~MatrixCanvasView()
+{}
+
+void MatrixCanvasView::contentsMousePressEvent(QMouseEvent* e)
+{
+ QPoint p = inverseMapPoint(e->pos());
+
+ updateGridSnap(e);
+
+ MATRIX_DEBUG << "MatrixCanvasView::contentsMousePressEvent: snap time is " << m_snapGrid->getSnapTime(double(p.x())) << endl;
+
+ timeT evTime;
+
+ if (m_drumMode) {
+ evTime = m_snapGrid->snapX(p.x(), SnapGrid::SnapEither);
+ MATRIX_DEBUG << "MatrixCanvasView: drum mode: snapEither " << p.x() << " -> " << evTime << endl;
+ } else {
+ evTime = m_snapGrid->snapX(p.x(), SnapGrid::SnapLeft);
+ MATRIX_DEBUG << "MatrixCanvasView: normal mode: snapLeft " << p.x() << " -> " << evTime << endl;
+ }
+
+ int evPitch = m_staff.getHeightAtCanvasCoords(p.x(), p.y());
+
+ timeT emTime = m_staff.getSegment().getEndMarkerTime();
+ if (evTime > emTime)
+ evTime = emTime;
+ timeT esTime = m_staff.getSegment().getStartTime();
+ if (evTime < esTime)
+ evTime = esTime;
+
+// std::cerr << "MatrixCanvasView::contentsMousePressEvent() at pitch "
+// << evPitch << ", time " << evTime << std::endl;
+
+ QCanvasItemList itemList = canvas()->collisions(p);
+ QCanvasItemList::Iterator it;
+ MatrixElement* mel = 0;
+ QCanvasItem* activeItem = 0;
+
+ for (it = itemList.begin(); it != itemList.end(); ++it) {
+
+ QCanvasItem *item = *it;
+
+ QCanvasMatrixRectangle *mRect = 0;
+
+ if (item->active()) {
+ activeItem = item;
+ break;
+ }
+
+ if ((mRect = dynamic_cast<QCanvasMatrixRectangle*>(item))) {
+
+// std::cerr << "MatrixCanvasView: looking at element with rect " << mRect->rect().x() << "," << mRect->rect().y() << " (" << mRect->rect().width() << "x" << mRect->rect().height() << ")" << std::endl;
+
+// std::cerr << "MatrixCanvasView: point is " << p.x() << "," << p.y()<< std::endl;
+
+ QRect rect = mRect->rect();
+ if (dynamic_cast<QCanvasMatrixDiamond*>(mRect)) {
+ rect = QRect(rect.x() - rect.height()/2,
+ rect.y(),
+ rect.width(),
+ rect.height());
+ }
+
+// std::cerr << "MatrixCanvasView: adjusted rect " << rect.x() << "," << rect.y() << " (" << rect.width() << "x" << rect.height() << ")" << std::endl;
+
+ // QCanvas::collisions() can be a bit optimistic and report
+ // items which are close to the point but not actually under it.
+ // So a little sanity check helps.
+ if (!rect.contains(p, true)) continue;
+
+ mel = &(mRect->getMatrixElement());
+// std::cerr << "MatrixCanvasView::contentsMousePressEvent: collision with an existing matrix element" << std::endl;
+ break;
+ }
+ }
+
+ if (activeItem) { // active item takes precedence over notation elements
+ emit activeItemPressed(e, activeItem);
+ m_mouseWasPressed = true;
+ return ;
+ }
+
+ emit mousePressed(evTime, evPitch, e, mel);
+ m_mouseWasPressed = true;
+
+ // Ignore click if it was above the staff and not
+ // on an active item
+ //
+ if (!m_staff.containsCanvasCoords(p.x(), p.y()) && !activeItem)
+ m_ignoreClick = true;
+}
+
+void MatrixCanvasView::contentsMouseMoveEvent(QMouseEvent* e)
+{
+ QPoint p = inverseMapPoint(e->pos());
+ /*
+ if (m_snapGrid->getSnapTime(double(p.x())))
+ m_lastSnap = m_snapGrid->getSnapTime(double(p.x()));
+ */
+ updateGridSnap(e);
+
+ if (m_ignoreClick)
+ return ;
+
+ timeT evTime;
+ if (m_drumMode) {
+ evTime = m_snapGrid->snapX(p.x(), SnapGrid::SnapEither);
+ } else {
+ evTime = m_snapGrid->snapX(p.x(), SnapGrid::SnapLeft);
+ }
+
+ int evPitch = m_staff.getHeightAtCanvasCoords(p.x(), p.y());
+
+ timeT emTime = m_staff.getSegment().getEndMarkerTime();
+ if (evTime > emTime)
+ evTime = emTime;
+
+ timeT stTime = m_staff.getSegment().getStartTime();
+ if (evTime < stTime)
+ evTime = stTime;
+
+ if (evTime != m_previousEvTime) {
+ emit hoveredOverAbsoluteTimeChanged(evTime);
+ m_previousEvTime = evTime;
+ }
+
+ QCanvasItemList itemList = canvas()->collisions(p);
+ MatrixElement* mel = 0;
+
+ for (QCanvasItemList::iterator it = itemList.begin();
+ it != itemList.end(); ++it) {
+
+ QCanvasItem *item = *it;
+ QCanvasMatrixRectangle *mRect = 0;
+
+ if ((mRect = dynamic_cast<QCanvasMatrixRectangle*>(item))) {
+ if (!mRect->rect().contains(p, true))
+ continue;
+ mel = &(mRect->getMatrixElement());
+ MATRIX_DEBUG << "have element" << endl;
+ break;
+ }
+ }
+
+ if (!m_mouseWasPressed && // if mouse pressed, leave this to the tool
+ (evPitch != m_previousEvPitch || mel)) {
+ MidiPitchLabel label(evPitch);
+ if (mel) {
+ emit hoveredOverNoteChanged(evPitch, true,
+ mel->event()->getAbsoluteTime());
+ } else {
+ emit hoveredOverNoteChanged(evPitch, false, 0);
+ }
+ m_previousEvPitch = evPitch;
+ }
+
+// if (m_mouseWasPressed)
+ emit mouseMoved(evTime, evPitch, e);
+
+}
+
+void MatrixCanvasView::contentsMouseDoubleClickEvent (QMouseEvent* e)
+{
+ QPoint p = inverseMapPoint(e->pos());
+
+ if (!m_staff.containsCanvasCoords(p.x(), p.y())) {
+ m_ignoreClick = true;
+ return ;
+ }
+
+ contentsMousePressEvent(e);
+}
+
+void MatrixCanvasView::contentsMouseReleaseEvent(QMouseEvent* e)
+{
+ QPoint p = inverseMapPoint(e->pos());
+
+ if (m_ignoreClick) {
+ m_ignoreClick = false;
+ return ;
+ }
+
+ timeT evTime;
+ if (m_drumMode) {
+ evTime = m_snapGrid->snapX(p.x(), SnapGrid::SnapEither);
+ } else {
+ evTime = m_snapGrid->snapX(p.x(), SnapGrid::SnapLeft);
+ }
+
+ int evPitch = m_staff.getHeightAtCanvasCoords(p.x(), p.y());
+
+ timeT emTime = m_staff.getSegment().getEndMarkerTime();
+ if (evTime > emTime)
+ evTime = emTime;
+
+ emit mouseReleased(evTime, evPitch, e);
+ m_mouseWasPressed = false;
+}
+
+void MatrixCanvasView::slotExternalWheelEvent(QWheelEvent* e)
+{
+ wheelEvent(e);
+}
+
+void MatrixCanvasView::updateGridSnap(QMouseEvent *e)
+{
+ Qt::ButtonState bs = e->state();
+
+ // MATRIX_DEBUG << "MatrixCanvasView::updateGridSnap : bs = "
+ // << bs << " - sm = " << getSmoothModifier() << ", is temporary " << m_isSnapTemporary << ", saved is " << m_lastSnap << endl;
+
+ if (bs & getSmoothModifier()) {
+
+ if (!m_isSnapTemporary) {
+ m_lastSnap = m_snapGrid->getSnapSetting();
+ }
+ m_snapGrid->setSnapTime(SnapGrid::NoSnap);
+ m_isSnapTemporary = true;
+
+ } else if (m_isSnapTemporary) {
+
+ m_snapGrid->setSnapTime(m_lastSnap);
+ m_isSnapTemporary = false;
+ }
+}
+
+void MatrixCanvasView::enterEvent(QEvent *e)
+{
+ emit mouseEntered();
+}
+
+void MatrixCanvasView::leaveEvent(QEvent *e)
+{
+ emit mouseLeft();
+}
+
+}
+#include "MatrixCanvasView.moc"
diff --git a/src/gui/editors/matrix/MatrixCanvasView.h b/src/gui/editors/matrix/MatrixCanvasView.h
new file mode 100644
index 0000000..2ec4c7e
--- /dev/null
+++ b/src/gui/editors/matrix/MatrixCanvasView.h
@@ -0,0 +1,162 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_MATRIXCANVASVIEW_H_
+#define _RG_MATRIXCANVASVIEW_H_
+
+#include "gui/general/RosegardenCanvasView.h"
+#include "base/Event.h"
+
+
+class QWidget;
+class QWheelEvent;
+class QMouseEvent;
+class QCanvasItem;
+class QCanvas;
+
+
+namespace Rosegarden
+{
+
+class SnapGrid;
+class MatrixStaff;
+class MatrixElement;
+
+
+class MatrixCanvasView : public RosegardenCanvasView
+{
+ Q_OBJECT
+
+public:
+ MatrixCanvasView(MatrixStaff&,
+ SnapGrid *,
+ bool drumMode,
+ QCanvas *viewing,
+ QWidget *parent=0, const char *name=0, WFlags f=0);
+
+ ~MatrixCanvasView();
+
+ void setSmoothModifier(Qt::ButtonState s) { m_smoothModifier = s; }
+ Qt::ButtonState getSmoothModifier() { return m_smoothModifier; }
+
+signals:
+
+ /**
+ * Emitted when the user clicks on a QCanvasItem which is active
+ *
+ * @see QCanvasItem#setActive
+ */
+ void activeItemPressed(QMouseEvent*,
+ QCanvasItem* item);
+
+ /**
+ * Emitted when the mouse cursor moves to a different height
+ * on the staff. Returns the new pitch.
+ */
+ void hoveredOverNoteChanged(int evPitch, bool haveEvent,
+ timeT evTime);
+
+ /**
+ * Emitted when the mouse cursor moves to a note which is at a
+ * different time
+ *
+ * \a time is set to the absolute time of the note the cursor is
+ * hovering on
+ */
+ void hoveredOverAbsoluteTimeChanged(unsigned int time);
+
+ void mousePressed(timeT time, int pitch,
+ QMouseEvent*, MatrixElement*);
+
+ void mouseMoved(timeT time, int pitch, QMouseEvent*);
+
+ void mouseReleased(timeT time, int pitch, QMouseEvent*);
+
+ void mouseEntered();
+ void mouseLeft();
+
+public slots:
+ void slotExternalWheelEvent(QWheelEvent*);
+
+protected:
+ /**
+ * Callback for a mouse button press event in the canvas
+ */
+ virtual void contentsMousePressEvent(QMouseEvent*);
+
+ /**
+ * Callback for a mouse move event in the canvas
+ */
+ virtual void contentsMouseMoveEvent(QMouseEvent*);
+
+ /**
+ * Callback for a mouse button release event in the canvas
+ */
+ virtual void contentsMouseReleaseEvent(QMouseEvent*);
+
+ /**
+ * Callback for a mouse double-click event in the canvas
+ *
+ * NOTE: a double click event is always preceded by a mouse press
+ * event
+ */
+ virtual void contentsMouseDoubleClickEvent(QMouseEvent*);
+
+ virtual void enterEvent(QEvent *);
+ virtual void leaveEvent(QEvent *);
+
+ /**
+ * Update the value of snap grid according to the button's state
+ *
+ * If the button was pressed with the 'smooth' modifier, set the
+ * grid so it won't snap time.
+ *
+ * @see #setSmoothModifier
+ * @see #getSmoothModifier
+ */
+ void updateGridSnap(QMouseEvent *e);
+
+ //--------------- Data members ---------------------------------
+
+ MatrixStaff &m_staff;
+ SnapGrid *m_snapGrid;
+ bool m_drumMode;
+
+ timeT m_previousEvTime;
+ int m_previousEvPitch;
+
+ bool m_mouseWasPressed;
+ bool m_ignoreClick;
+
+ Qt::ButtonState m_smoothModifier;
+ timeT m_lastSnap;
+ bool m_isSnapTemporary;
+};
+
+
+
+}
+
+#endif
diff --git a/src/gui/editors/matrix/MatrixElement.cpp b/src/gui/editors/matrix/MatrixElement.cpp
new file mode 100644
index 0000000..1101284
--- /dev/null
+++ b/src/gui/editors/matrix/MatrixElement.cpp
@@ -0,0 +1,160 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "MatrixElement.h"
+#include "misc/Debug.h"
+
+#include "base/Event.h"
+#include "base/NotationTypes.h"
+#include "base/ViewElement.h"
+#include "gui/general/GUIPalette.h"
+#include "QCanvasMatrixDiamond.h"
+#include "QCanvasMatrixRectangle.h"
+#include <qbrush.h>
+#include <qcanvas.h>
+#include <qcolor.h>
+
+
+namespace Rosegarden
+{
+
+MatrixElement::MatrixElement(Event *event, bool drum) :
+ ViewElement(event),
+ m_canvasRect(drum ?
+ new QCanvasMatrixDiamond(*this, 0) :
+ new QCanvasMatrixRectangle(*this, 0)),
+ m_overlapRectangles(NULL)
+{
+ // MATRIX_DEBUG << "new MatrixElement "
+ // << this << " wrapping " << event << endl;
+}
+
+MatrixElement::~MatrixElement()
+{
+ // MATRIX_DEBUG << "MatrixElement " << this << "::~MatrixElement() wrapping "
+ // << event() << endl;
+
+ m_canvasRect->hide();
+ delete m_canvasRect;
+
+ removeOverlapRectangles();
+}
+
+void MatrixElement::setCanvas(QCanvas* c)
+{
+ if (!m_canvasRect->canvas()) {
+
+ m_canvasRect->setCanvas(c);
+
+ // We set this by velocity now (matrixstaff.cpp)
+ //
+ //m_canvasRect->setBrush(RosegardenGUIColours::MatrixElementBlock);
+
+ m_canvasRect->setPen(GUIPalette::getColour(GUIPalette::MatrixElementBorder));
+ m_canvasRect->show();
+ }
+}
+
+bool MatrixElement::isNote() const
+{
+ return event()->isa(Note::EventType);
+}
+
+void MatrixElement::drawOverlapRectangles()
+{
+ if (m_overlapRectangles) removeOverlapRectangles();
+
+ QRect elRect = m_canvasRect->rect();
+ QCanvasItemList
+ itemList = m_canvasRect->canvas()->collisions(elRect);
+ QCanvasItemList::Iterator it;
+ MatrixElement* mel = 0;
+
+
+ for (it = itemList.begin(); it != itemList.end(); ++it) {
+
+ QCanvasMatrixRectangle *mRect = 0;
+ if ((mRect = dynamic_cast<QCanvasMatrixRectangle*>(*it))) {
+
+ // Element does'nt collide with itself
+ if (mRect == m_canvasRect) continue;
+
+ QRect rect = mRect->rect() & elRect;
+ if (!rect.isEmpty()) {
+ if (!m_overlapRectangles) {
+ m_overlapRectangles = new OverlapRectangles();
+ }
+
+ QCanvasRectangle *
+ overlap = new QCanvasRectangle(rect, m_canvasRect->canvas());
+ overlap->setBrush(GUIPalette::getColour(GUIPalette::MatrixOverlapBlock));
+ overlap->setZ(getCanvasZ() + 1);
+ overlap->show();
+ m_overlapRectangles->push_back(overlap);
+ }
+ }
+ }
+}
+
+void MatrixElement::redrawOverlaps(QRect rect)
+{
+ QCanvasItemList
+ itemList = m_canvasRect->canvas()->collisions(rect);
+ QCanvasItemList::Iterator it;
+ MatrixElement* mel = 0;
+
+ for (it = itemList.begin(); it != itemList.end(); ++it) {
+ QCanvasMatrixRectangle *mRect = 0;
+ if ((mRect = dynamic_cast<QCanvasMatrixRectangle*>(*it))) {
+ mRect->getMatrixElement().drawOverlapRectangles();
+ }
+ }
+}
+
+void MatrixElement::removeOverlapRectangles()
+{
+ if (!m_overlapRectangles) return;
+
+ OverlapRectangles::iterator it;
+ for (it = m_overlapRectangles->begin(); it != m_overlapRectangles->end(); ++it) {
+ (*it)->hide();
+ delete *it;
+ }
+
+ delete m_overlapRectangles;
+ m_overlapRectangles = NULL;
+}
+
+bool MatrixElement::getVisibleRectangle(QRect &rectangle)
+{
+ if (m_canvasRect && m_canvasRect->isVisible()) {
+ rectangle = m_canvasRect->rect();
+ return true;
+ }
+ return false;
+}
+
+
+}
diff --git a/src/gui/editors/matrix/MatrixElement.h b/src/gui/editors/matrix/MatrixElement.h
new file mode 100644
index 0000000..d330991
--- /dev/null
+++ b/src/gui/editors/matrix/MatrixElement.h
@@ -0,0 +1,138 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_MATRIXELEMENT_H_
+#define _RG_MATRIXELEMENT_H_
+
+#include "base/ViewElement.h"
+#include <qbrush.h>
+#include <qcanvas.h>
+#include "QCanvasMatrixRectangle.h"
+
+class QColor;
+
+
+namespace Rosegarden
+{
+
+class Event;
+
+class MatrixElement : public ViewElement
+{
+
+ typedef std::vector <QCanvasRectangle *> OverlapRectangles;
+
+
+public:
+ MatrixElement(Event *event, bool drum);
+
+ virtual ~MatrixElement();
+
+ void setCanvas(QCanvas* c);
+
+ /**
+ * Returns the actual x coordinate of the element on the canvas
+ */
+ double getCanvasX() const { return m_canvasRect->x(); }
+
+ /**
+ * Returns the actual y coordinate of the element on the canvas
+ */
+ double getCanvasY() const { return m_canvasRect->y(); }
+
+ double getCanvasZ() const { return m_canvasRect->z(); }
+
+ /**
+ * Sets the x coordinate of the element on the canvas
+ */
+ void setCanvasX(double x) { m_canvasRect->setX(x); }
+
+ /**
+ * Sets the y coordinate of the element on the canvas
+ */
+ void setCanvasY(double y) { m_canvasRect->setY(y); }
+
+ void setCanvasZ(double z) { m_canvasRect->setZ(z); }
+
+ /**
+ * Sets the width of the rectangle on the canvas
+ */
+ void setWidth(int w) { m_canvasRect->setSize(w, m_canvasRect->height()); }
+ int getWidth() { return m_canvasRect->width(); }
+
+ /**
+ * Sets the height of the rectangle on the canvas
+ */
+ void setHeight(int h) { m_canvasRect->setSize(m_canvasRect->width(), h); }
+ int getHeight() { return m_canvasRect->height(); }
+
+ /// Returns true if the wrapped event is a note
+ bool isNote() const;
+
+ /*
+ * Set the colour of the element
+ */
+ void setColour(const QColor &colour)
+ { m_canvasRect->setBrush(QBrush(colour)); }
+
+ /**
+ * Draws overlap rectangles (if any)
+ * (should not be called in drum mode)
+ */
+ void drawOverlapRectangles();
+
+ /**
+ * Removes overlap rectangles if any
+ */
+ void removeOverlapRectangles();
+
+ /**
+ * If element rectangle is currently visible gets its size and returns true.
+ * Returns false if element rectangle is undefined or not visible.
+ */
+ bool getVisibleRectangle(QRect &rectangle);
+
+ /**
+ * Redraw overlap rectangles of all matrix elements colliding with rect
+ */
+ void redrawOverlaps(QRect rect);
+
+protected:
+
+ //--------------- Data members ---------------------------------
+
+ QCanvasMatrixRectangle *m_canvasRect;
+
+ OverlapRectangles *m_overlapRectangles;
+
+};
+
+
+typedef ViewElementList MatrixElementList;
+
+
+}
+
+#endif
diff --git a/src/gui/editors/matrix/MatrixEraser.cpp b/src/gui/editors/matrix/MatrixEraser.cpp
new file mode 100644
index 0000000..6c2373e
--- /dev/null
+++ b/src/gui/editors/matrix/MatrixEraser.cpp
@@ -0,0 +1,110 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "MatrixEraser.h"
+#include "misc/Debug.h"
+
+#include <klocale.h>
+#include <kstddirs.h>
+#include "base/ViewElement.h"
+#include "commands/matrix/MatrixEraseCommand.h"
+#include "gui/general/EditTool.h"
+#include "MatrixStaff.h"
+#include "MatrixTool.h"
+#include "MatrixView.h"
+#include <kaction.h>
+#include <kglobal.h>
+#include <qiconset.h>
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+MatrixEraser::MatrixEraser(MatrixView* parent)
+ : MatrixTool("MatrixEraser", parent),
+ m_currentStaff(0)
+{
+ QString pixmapDir = KGlobal::dirs()->findResource("appdata", "pixmaps/");
+ QCanvasPixmap pixmap(pixmapDir + "/toolbar/select.xpm");
+ QIconSet icon = QIconSet(pixmap);
+
+ new KAction(i18n("Switch to Select Tool"), icon, 0, this,
+ SLOT(slotSelectSelected()), actionCollection(),
+ "select");
+
+ new KAction(i18n("Switch to Draw Tool"), "pencil", 0, this,
+ SLOT(slotDrawSelected()), actionCollection(),
+ "draw");
+
+ new KAction(i18n("Switch to Move Tool"), "move", 0, this,
+ SLOT(slotMoveSelected()), actionCollection(),
+ "move");
+
+ pixmap.load(pixmapDir + "/toolbar/resize.xpm");
+ icon = QIconSet(pixmap);
+ new KAction(i18n("Switch to Resize Tool"), icon, 0, this,
+ SLOT(slotResizeSelected()), actionCollection(),
+ "resize");
+
+ createMenu("matrixeraser.rc");
+}
+
+void MatrixEraser::handleLeftButtonPress(timeT,
+ int,
+ int staffNo,
+ QMouseEvent*,
+ ViewElement* el)
+{
+ MATRIX_DEBUG << "MatrixEraser::handleLeftButtonPress : el = "
+ << el << endl;
+
+ if (!el)
+ return ; // nothing to erase
+
+ m_currentStaff = m_mParentView->getStaff(staffNo);
+
+ MatrixEraseCommand* command =
+ new MatrixEraseCommand(m_currentStaff->getSegment(), el->event());
+
+ m_mParentView->addCommandToHistory(command);
+
+ m_mParentView->update();
+}
+
+void MatrixEraser::ready()
+{
+ m_mParentView->setCanvasCursor(Qt::pointingHandCursor);
+ setBasicContextHelp();
+}
+
+void MatrixEraser::setBasicContextHelp()
+{
+ setContextHelp(i18n("Click on a note to delete it"));
+}
+
+const QString MatrixEraser::ToolName = "eraser";
+
+}
diff --git a/src/gui/editors/matrix/MatrixEraser.h b/src/gui/editors/matrix/MatrixEraser.h
new file mode 100644
index 0000000..4e3d65f
--- /dev/null
+++ b/src/gui/editors/matrix/MatrixEraser.h
@@ -0,0 +1,69 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_MATRIXERASER_H_
+#define _RG_MATRIXERASER_H_
+
+#include "MatrixTool.h"
+#include <qstring.h>
+
+class QMouseEvent;
+
+
+namespace Rosegarden
+{
+
+class ViewElement;
+class MatrixView;
+class MatrixStaff;
+
+
+class MatrixEraser : public MatrixTool
+{
+ friend class MatrixToolBox;
+
+public:
+
+ virtual void handleLeftButtonPress(timeT,
+ int height,
+ int staffNo,
+ QMouseEvent *event,
+ ViewElement*);
+
+ static const QString ToolName;
+
+ virtual void ready();
+
+protected:
+ MatrixEraser(MatrixView*);
+
+ void setBasicContextHelp();
+
+ MatrixStaff* m_currentStaff;
+};
+
+}
+
+#endif
diff --git a/src/gui/editors/matrix/MatrixHLayout.cpp b/src/gui/editors/matrix/MatrixHLayout.cpp
new file mode 100644
index 0000000..99b89c2
--- /dev/null
+++ b/src/gui/editors/matrix/MatrixHLayout.cpp
@@ -0,0 +1,220 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "MatrixHLayout.h"
+#include "MatrixElement.h"
+#include "misc/Debug.h"
+
+#include "base/Composition.h"
+#include "base/LayoutEngine.h"
+#include "base/NotationTypes.h"
+#include "base/Profiler.h"
+#include "base/Segment.h"
+#include "base/Staff.h"
+#include "MatrixStaff.h"
+
+#include <cmath>
+
+
+namespace Rosegarden
+{
+
+MatrixHLayout::MatrixHLayout(Composition *c) :
+ HorizontalLayoutEngine(c),
+ m_totalWidth(0.0),
+ m_firstBar(0)
+{}
+
+MatrixHLayout::~MatrixHLayout()
+{}
+
+void MatrixHLayout::reset()
+{}
+
+void MatrixHLayout::resetStaff(Staff&, timeT, timeT)
+{}
+
+void MatrixHLayout::scanStaff(Staff &staffBase,
+ timeT startTime, timeT endTime)
+{
+ Profiler profiler("MatrixHLayout::scanStaff", true);
+
+ // The Matrix layout is not currently designed to be able to lay
+ // out more than one staff, because we have no requirement to show
+ // more than one at once in the Matrix view. To make it work for
+ // multiple staffs should be straightforward; we just need to bear
+ // in mind that they might start and end at different times (hence
+ // the total width and bar list can't just be calculated from the
+ // last staff scanned as they are now).
+
+ MatrixStaff &staff = static_cast<MatrixStaff &>(staffBase);
+ bool isFullScan = (startTime == endTime);
+
+ MatrixElementList *notes = staff.getViewElementList();
+ MatrixElementList::iterator startItr = notes->begin();
+ MatrixElementList::iterator endItr = notes->end();
+
+ if (!isFullScan) {
+ startItr = notes->findNearestTime(startTime);
+ if (startItr == notes->end())
+ startItr = notes->begin();
+ endItr = notes->findTime(endTime);
+ }
+
+ if (endItr == notes->end() && startItr == notes->begin()) {
+ isFullScan = true;
+ }
+
+ // Do this in two parts: bar lines separately from elements.
+ // (We don't need to do all that stuff notationhlayout has to do,
+ // scanning the notes bar-by-bar; we can just place the bar lines
+ // in the theoretically-correct places and do the same with the
+ // notes quite independently.)
+
+ Segment &segment = staff.getSegment();
+ Composition *composition = segment.getComposition();
+ m_firstBar = composition->getBarNumber(segment.getStartTime());
+ timeT from = composition->getBarStart(m_firstBar),
+ to = composition->getBarEndForTime(segment.getEndMarkerTime());
+
+ double startPosition = from;
+
+ // 1. Bar lines and time signatures. We only re-make these on
+ // full scans.
+
+ if (isFullScan || m_barData.size() == 0) {
+
+ m_barData.clear();
+ int barNo = m_firstBar;
+
+ MATRIX_DEBUG << "MatrixHLayout::scanStaff() : start time = " << startTime << ", first bar = " << m_firstBar << ", end time = " << endTime << ", end marker time = " << segment.getEndMarkerTime() << ", from = " << from << ", to = " << to << endl;
+
+ // hack for partial bars
+ //
+ timeT adjTo = to;
+
+ if (composition->getBarStartForTime(segment.getEndMarkerTime())
+ != segment.getEndMarkerTime())
+ adjTo++;
+
+ while (from < adjTo) {
+
+ bool isNew = false;
+ TimeSignature timeSig =
+ composition->getTimeSignatureInBar(barNo, isNew);
+
+ if (isNew || barNo == m_firstBar) {
+ m_barData.push_back(BarData((from - startPosition) *
+ staff.getTimeScaleFactor(),
+ TimeSigData(true, timeSig)));
+ } else {
+ m_barData.push_back(BarData((from - startPosition) *
+ staff.getTimeScaleFactor(),
+ TimeSigData(false, timeSig)));
+ }
+
+ from = composition->getBarEndForTime(from);
+ ++barNo;
+ }
+
+ m_barData.push_back(BarData(to * staff.getTimeScaleFactor(),
+ TimeSigData(false, TimeSignature())));
+ }
+
+ // 2. Elements
+
+ m_totalWidth = 0.0;
+ MatrixElementList::iterator i = startItr;
+
+ while (i != endItr) {
+
+ (*i)->setLayoutX(((*i)->getViewAbsoluteTime() - startPosition)
+ * staff.getTimeScaleFactor());
+
+ double width = (*i)->getViewDuration() * staff.getTimeScaleFactor();
+
+ // Make sure that very small elements can still be seen
+ //
+ if (width < 3) width = 3;
+ else width += 1; // fiddle factor
+
+ static_cast<MatrixElement*>((*i))->setWidth(lrint(width));
+
+ if (isFullScan) {
+ m_totalWidth = (*i)->getLayoutX() + width;
+ } else {
+ m_totalWidth = std::max(m_totalWidth, (*i)->getLayoutX() + width);
+ }
+
+ ++i;
+ }
+}
+
+double MatrixHLayout::getTotalWidth() const
+{
+ return m_totalWidth;
+}
+
+int MatrixHLayout::getFirstVisibleBar() const
+{
+ return m_firstBar;
+}
+
+int MatrixHLayout::getLastVisibleBar() const
+{
+ int barNo = m_firstBar + m_barData.size() - 2;
+ if (barNo < m_firstBar + 1)
+ barNo = m_firstBar + 1;
+
+ return barNo;
+}
+
+double MatrixHLayout::getBarPosition(int barNo) const
+{
+ if (barNo < getFirstVisibleBar()) {
+ return getBarPosition(getFirstVisibleBar());
+ }
+
+ if (barNo > getLastVisibleBar()) {
+ return getBarPosition(getLastVisibleBar());
+ }
+
+ return m_barData[barNo - m_firstBar].first;
+}
+
+bool MatrixHLayout::getTimeSignaturePosition(Staff &,
+ int barNo,
+ TimeSignature &timeSig,
+ double &timeSigX)
+{
+ timeSig = m_barData[barNo - m_firstBar].second.second;
+ timeSigX = m_barData[barNo - m_firstBar].first;
+ return m_barData[barNo - m_firstBar].second.first;
+}
+
+void MatrixHLayout::finishLayout(timeT, timeT)
+{}
+
+}
diff --git a/src/gui/editors/matrix/MatrixHLayout.h b/src/gui/editors/matrix/MatrixHLayout.h
new file mode 100644
index 0000000..76f1b31
--- /dev/null
+++ b/src/gui/editors/matrix/MatrixHLayout.h
@@ -0,0 +1,150 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_MATRIXHLAYOUT_H_
+#define _RG_MATRIXHLAYOUT_H_
+
+#include "base/FastVector.h"
+#include "base/LayoutEngine.h"
+#include <utility>
+#include "base/Event.h"
+
+#include "gui/general/HZoomable.h"
+
+
+
+namespace Rosegarden
+{
+
+class TimeSignature;
+class Staff;
+class Composition;
+
+
+class MatrixHLayout : public HorizontalLayoutEngine
+{
+public:
+ MatrixHLayout(Composition *c);
+ virtual ~MatrixHLayout();
+
+ /**
+ * Resets internal data stores for all staffs
+ */
+ virtual void reset();
+
+ /**
+ * Resets internal data stores for a specific staff
+ */
+ virtual void resetStaff(Staff &staff,
+ timeT = 0,
+ timeT = 0);
+
+ /**
+ * Returns the total length of all elements once layout is done.
+ * This is the x-coord of the end of the last element on the
+ * longest staff
+ */
+ virtual double getTotalWidth() const;
+
+ /**
+ * Returns the number of the first visible bar line
+ */
+ virtual int getFirstVisibleBar() const;
+
+ /**
+ * Returns the number of the first visible bar line
+ */
+ virtual int getLastVisibleBar() const;
+
+ /**
+ * Returns the x-coordinate of the given bar number
+ */
+ virtual double getBarPosition(int barNo) const;
+
+ /**
+ * Precomputes layout data for a single staff, updating any
+ * internal data stores associated with that staff and updating
+ * any layout-related properties in the events on the staff's
+ * segment.
+ */
+ virtual void scanStaff(Staff&,
+ timeT = 0,
+ timeT = 0);
+
+ /**
+ * Computes any layout data that may depend on the results of
+ * scanning more than one staff. This may mean doing most of
+ * the layout (likely for horizontal layout) or nothing at all
+ * (likely for vertical layout).
+ */
+ virtual void finishLayout(timeT = 0,
+ timeT = 0);
+
+ /**
+ * Returns true if there is a new time signature in the given bar,
+ * setting timeSignature appropriately and setting timeSigX to its
+ * x-coord
+ */
+ virtual bool getTimeSignaturePosition(Staff &staff,
+ int barNo,
+ TimeSignature &timeSig,
+ double &timeSigX);
+
+protected:
+
+ //--------------- Data members ---------------------------------
+
+ // pair of has-time-sig and time-sig
+ typedef std::pair<bool, TimeSignature> TimeSigData;
+ // pair of layout-x and time-signature if there is one
+ typedef std::pair<double, TimeSigData> BarData;
+ typedef FastVector<BarData> BarDataList;
+ BarDataList m_barData;
+ double m_totalWidth;
+ int m_firstBar;
+};
+
+/**
+ * "zoomable" version of the above, used in the MatrixView
+ * to properly scale Tempo and Chord rulers.
+ *
+ */
+class ZoomableMatrixHLayoutRulerScale : public RulerScale, public HZoomable {
+public:
+ ZoomableMatrixHLayoutRulerScale(MatrixHLayout& layout) : RulerScale(layout.getComposition()), m_referenceHLayout(layout) {};
+
+ virtual double getBarPosition(int n) const { return m_referenceHLayout.getBarPosition(n) * getHScaleFactor(); }
+ virtual double getXForTime(timeT time) const { return m_referenceHLayout.getXForTime(time) * getHScaleFactor(); }
+ virtual timeT getTimeForX(double x) const { return m_referenceHLayout.getTimeForX(x / getHScaleFactor()); }
+ virtual double getBarWidth(int n) const { return m_referenceHLayout.getBarWidth(n) * getHScaleFactor(); }
+ virtual int getLastVisibleBar() const { return m_referenceHLayout.getLastVisibleBar(); }
+
+protected:
+ MatrixHLayout& m_referenceHLayout;
+};
+
+}
+
+#endif
diff --git a/src/gui/editors/matrix/MatrixMover.cpp b/src/gui/editors/matrix/MatrixMover.cpp
new file mode 100644
index 0000000..d725f16
--- /dev/null
+++ b/src/gui/editors/matrix/MatrixMover.cpp
@@ -0,0 +1,481 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "MatrixMover.h"
+
+#include "base/BaseProperties.h"
+#include <klocale.h>
+#include <kstddirs.h>
+#include "base/Event.h"
+#include "base/Segment.h"
+#include "base/Selection.h"
+#include "base/SnapGrid.h"
+#include "base/ViewElement.h"
+#include "commands/matrix/MatrixModifyCommand.h"
+#include "commands/matrix/MatrixInsertionCommand.h"
+#include "commands/notation/NormalizeRestsCommand.h"
+#include "gui/general/EditTool.h"
+#include "gui/general/RosegardenCanvasView.h"
+#include "MatrixElement.h"
+#include "MatrixStaff.h"
+#include "MatrixTool.h"
+#include "MatrixView.h"
+#include "MatrixVLayout.h"
+#include <kaction.h>
+#include <kglobal.h>
+#include <qiconset.h>
+#include <qpoint.h>
+#include <qstring.h>
+#include "misc/Debug.h"
+
+
+namespace Rosegarden
+{
+
+MatrixMover::MatrixMover(MatrixView* parent) :
+ MatrixTool("MatrixMover", parent),
+ m_currentElement(0),
+ m_currentStaff(0),
+ m_lastPlayedPitch(-1)
+{
+ QString pixmapDir = KGlobal::dirs()->findResource("appdata", "pixmaps/");
+ QCanvasPixmap pixmap(pixmapDir + "/toolbar/select.xpm");
+ QIconSet icon = QIconSet(pixmap);
+
+ new KAction(i18n("Switch to Select Tool"), icon, 0, this,
+ SLOT(slotSelectSelected()), actionCollection(),
+ "select");
+
+ new KAction(i18n("Switch to Draw Tool"), "pencil", 0, this,
+ SLOT(slotDrawSelected()), actionCollection(),
+ "draw");
+
+ new KAction(i18n("Switch to Erase Tool"), "eraser", 0, this,
+ SLOT(slotEraseSelected()), actionCollection(),
+ "erase");
+
+ pixmap.load(pixmapDir + "/toolbar/resize.xpm");
+ icon = QIconSet(pixmap);
+ new KAction(i18n("Switch to Resize Tool"), icon, 0, this,
+ SLOT(slotResizeSelected()), actionCollection(),
+ "resize");
+
+ createMenu("matrixmover.rc");
+}
+
+void MatrixMover::handleEventRemoved(Event *event)
+{
+ if (m_currentElement && m_currentElement->event() == event) {
+ m_currentElement = 0;
+ }
+}
+
+void MatrixMover::handleLeftButtonPress(timeT time,
+ int pitch,
+ int staffNo,
+ QMouseEvent* e,
+ ViewElement* el)
+{
+ MATRIX_DEBUG << "MatrixMover::handleLeftButtonPress() : time = " << time << ", el = " << el << endl;
+ if (!el) return;
+
+ m_quickCopy = (e->state() & Qt::ControlButton);
+
+ if (!m_duplicateElements.empty()) {
+ for (size_t i = 0; i < m_duplicateElements.size(); ++i) {
+ delete m_duplicateElements[i]->event();
+ delete m_duplicateElements[i];
+ }
+ m_duplicateElements.clear();
+ }
+
+ m_currentElement = dynamic_cast<MatrixElement*>(el);
+ m_currentStaff = m_mParentView->getStaff(staffNo);
+
+ if (m_currentElement) {
+
+ // Add this element and allow movement
+ //
+ EventSelection* selection = m_mParentView->getCurrentSelection();
+
+ if (selection) {
+ EventSelection *newSelection;
+
+ if ((e->state() & Qt::ShiftButton) ||
+ selection->contains(m_currentElement->event()))
+ newSelection = new EventSelection(*selection);
+ else
+ newSelection = new EventSelection(m_currentStaff->getSegment());
+
+ // if the selection already contains the event, remove it from the
+ // selection if shift is pressed
+ if (selection->contains(m_currentElement->event())){
+ if (e->state() & Qt::ShiftButton)
+ newSelection->removeEvent(m_currentElement->event());
+ } else {
+ newSelection->addEvent(m_currentElement->event());
+ }
+ m_mParentView->setCurrentSelection(newSelection, true, true);
+ m_mParentView->canvas()->update();
+ selection = newSelection;
+ } else {
+ m_mParentView->setSingleSelectedEvent(m_currentStaff->getSegment(),
+ m_currentElement->event(),
+ true);
+ m_mParentView->canvas()->update();
+ }
+
+ long velocity = m_mParentView->getCurrentVelocity();
+ m_currentElement->event()->get<Int>(BaseProperties::VELOCITY, velocity);
+ m_mParentView->playNote(m_currentStaff->getSegment(), pitch, velocity);
+ m_lastPlayedPitch = pitch;
+
+ if (m_quickCopy && selection) {
+ for (EventSelection::eventcontainer::iterator i =
+ selection->getSegmentEvents().begin();
+ i != selection->getSegmentEvents().end(); ++i) {
+
+ MatrixElement *element = m_currentStaff->getElement(*i);
+ if (!element) continue;
+
+ MatrixElement *duplicate = new MatrixElement
+ (new Event(**i), m_mParentView->isDrumMode());
+ duplicate->setLayoutY(element->getLayoutY());
+ duplicate->setLayoutX(element->getLayoutX());
+ duplicate->setWidth(element->getWidth());
+ duplicate->setHeight(element->getHeight());
+ duplicate->setCanvasZ(-1);
+ m_currentStaff->positionElement(duplicate);
+ m_duplicateElements.push_back(duplicate);
+ }
+ }
+ }
+
+ m_clickX = m_mParentView->inverseMapPoint(e->pos()).x();
+}
+
+timeT
+MatrixMover::getDragTime(QMouseEvent *e, timeT candidate)
+{
+ int x = m_mParentView->inverseMapPoint(e->pos()).x();
+ int xdiff = x - m_clickX;
+
+ const SnapGrid &grid = getSnapGrid();
+ const RulerScale &scale = *grid.getRulerScale();
+
+ timeT eventTime = m_currentElement->getViewAbsoluteTime();
+ int eventX = scale.getXForTime(eventTime);
+ timeT preSnapTarget = scale.getTimeForX(eventX + xdiff);
+
+ candidate = grid.snapTime(preSnapTarget, SnapGrid::SnapEither);
+
+ if (xdiff == 0 ||
+ (abs(eventTime - preSnapTarget) < abs(candidate - preSnapTarget))) {
+ candidate = eventTime;
+ }
+
+ return candidate;
+}
+
+int MatrixMover::handleMouseMove(timeT newTime,
+ int newPitch,
+ QMouseEvent *e)
+{
+ MATRIX_DEBUG << "MatrixMover::handleMouseMove() time = "
+ << newTime << endl;
+
+ if (e) {
+ setBasicContextHelp(e->state() & Qt::ControlButton);
+ }
+
+ if (!m_currentElement || !m_currentStaff)
+ return RosegardenCanvasView::NoFollow;
+
+ if (getSnapGrid().getSnapSetting() != SnapGrid::NoSnap) {
+ setContextHelp(i18n("Hold Shift to avoid snapping to beat grid"));
+ } else {
+ clearContextHelp();
+ }
+
+ if (e) newTime = getDragTime(e, newTime);
+
+ emit hoveredOverNoteChanged(newPitch, true, newTime);
+
+ using BaseProperties::PITCH;
+ int diffPitch = 0;
+ if (m_currentElement->event()->has(PITCH)) {
+ diffPitch = newPitch - m_currentElement->event()->get<Int>(PITCH);
+ }
+
+ int diffY =
+ int(((m_currentStaff->getLayoutYForHeight(newPitch) -
+ m_currentStaff->getElementHeight() / 2) -
+ m_currentElement->getLayoutY()));
+
+ EventSelection* selection = m_mParentView->getCurrentSelection();
+ EventSelection::eventcontainer::iterator it =
+ selection->getSegmentEvents().begin();
+
+ MatrixElement *element = 0;
+ int maxY = m_currentStaff->getCanvasYForHeight(0);
+
+ for (; it != selection->getSegmentEvents().end(); it++) {
+ element = m_currentStaff->getElement(*it);
+
+ if (element) {
+
+ timeT diffTime = element->getViewAbsoluteTime() -
+ m_currentElement->getViewAbsoluteTime();
+
+ int newX = getSnapGrid().getRulerScale()->
+ getXForTime(newTime + diffTime);
+
+ if (newX < 0) newX = 0;
+
+ int newY = int(element->getLayoutY() + diffY);
+
+ if (newY < 0) newY = 0;
+ if (newY > maxY) newY = maxY;
+
+ element->setLayoutX(newX);
+ element->setLayoutY(newY);
+
+ m_currentStaff->positionElement(element);
+ }
+ }
+
+ if (newPitch != m_lastPlayedPitch) {
+ long velocity = m_mParentView->getCurrentVelocity();
+ m_currentElement->event()->get<Int>(BaseProperties::VELOCITY, velocity);
+ m_mParentView->playNote(m_currentStaff->getSegment(), newPitch, velocity);
+ m_lastPlayedPitch = newPitch;
+ }
+
+ m_mParentView->canvas()->update();
+ return RosegardenCanvasView::FollowHorizontal |
+ RosegardenCanvasView::FollowVertical;
+}
+
+void MatrixMover::handleMouseRelease(timeT newTime,
+ int newPitch,
+ QMouseEvent *e)
+{
+ MATRIX_DEBUG << "MatrixMover::handleMouseRelease() - newPitch = "
+ << newPitch << endl;
+
+ if (!m_currentElement || !m_currentStaff)
+ return;
+
+ if (newPitch > MatrixVLayout::maxMIDIPitch)
+ newPitch = MatrixVLayout::maxMIDIPitch;
+ if (newPitch < 0)
+ newPitch = 0;
+
+ if (e) newTime = getDragTime(e, newTime);
+
+ using BaseProperties::PITCH;
+ timeT diffTime = newTime - m_currentElement->getViewAbsoluteTime();
+ int diffPitch = 0;
+ if (m_currentElement->event()->has(PITCH)) {
+ diffPitch = newPitch - m_currentElement->event()->get<Int>(PITCH);
+ }
+
+ EventSelection *selection = m_mParentView->getCurrentSelection();
+
+ if ((diffTime == 0 && diffPitch == 0) || selection->getAddedEvents() == 0) {
+ for (size_t i = 0; i < m_duplicateElements.size(); ++i) {
+ delete m_duplicateElements[i]->event();
+ delete m_duplicateElements[i];
+ }
+ m_duplicateElements.clear();
+ m_mParentView->canvas()->update();
+ m_currentElement = 0;
+ return;
+ }
+
+ if (newPitch != m_lastPlayedPitch) {
+ long velocity = m_mParentView->getCurrentVelocity();
+ m_currentElement->event()->get<Int>(BaseProperties::VELOCITY, velocity);
+ m_mParentView->playNote(m_currentStaff->getSegment(), newPitch, velocity);
+ m_lastPlayedPitch = newPitch;
+ }
+
+ QString commandLabel;
+ if (m_quickCopy) {
+ if (selection->getAddedEvents() < 2) {
+ commandLabel = i18n("Copy and Move Event");
+ } else {
+ commandLabel = i18n("Copy and Move Events");
+ }
+ } else {
+ if (selection->getAddedEvents() < 2) {
+ commandLabel = i18n("Move Event");
+ } else {
+ commandLabel = i18n("Move Events");
+ }
+ }
+
+ KMacroCommand *macro = new KMacroCommand(commandLabel);
+
+ EventSelection::eventcontainer::iterator it =
+ selection->getSegmentEvents().begin();
+
+ Segment &segment = m_currentStaff->getSegment();
+
+ EventSelection *newSelection = new EventSelection(segment);
+
+ timeT normalizeStart = selection->getStartTime();
+ timeT normalizeEnd = selection->getEndTime();
+
+ if (m_quickCopy) {
+ for (size_t i = 0; i < m_duplicateElements.size(); ++i) {
+ timeT time = m_duplicateElements[i]->getViewAbsoluteTime();
+ timeT endTime = time + m_duplicateElements[i]->getViewDuration();
+ if (time < normalizeStart) normalizeStart = time;
+ if (endTime > normalizeEnd) normalizeEnd = endTime;
+ macro->addCommand(new MatrixInsertionCommand
+ (segment, time, endTime,
+ m_duplicateElements[i]->event()));
+ delete m_duplicateElements[i]->event();
+ delete m_duplicateElements[i];
+ }
+ m_duplicateElements.clear();
+ m_quickCopy = false;
+ }
+
+ for (; it != selection->getSegmentEvents().end(); it++) {
+
+ timeT newTime = (*it)->getAbsoluteTime() + diffTime;
+
+ int newPitch = 60;
+ if ((*it)->has(PITCH)) {
+ newPitch = (*it)->get<Int>(PITCH) + diffPitch;
+ }
+
+ Event *newEvent = 0;
+
+ if (newTime < segment.getStartTime()) {
+ newTime = segment.getStartTime();
+ }
+
+ if (newTime + (*it)->getDuration() >= segment.getEndMarkerTime()) {
+ timeT limit = getSnapGrid().snapTime
+ (segment.getEndMarkerTime() - 1, SnapGrid::SnapLeft);
+ if (newTime > limit) newTime = limit;
+ timeT newDuration = std::min
+ ((*it)->getDuration(), segment.getEndMarkerTime() - newTime);
+ newEvent = new Event(**it, newTime, newDuration);
+ } else {
+ newEvent = new Event(**it, newTime);
+ }
+
+ newEvent->set<Int>(BaseProperties::PITCH, newPitch);
+
+ macro->addCommand(new MatrixModifyCommand(segment,
+ (*it),
+ newEvent,
+ true,
+ false));
+ newSelection->addEvent(newEvent);
+ }
+
+ normalizeStart = std::min(normalizeStart, newSelection->getStartTime());
+ normalizeEnd = std::max(normalizeEnd, newSelection->getEndTime());
+
+ macro->addCommand(new NormalizeRestsCommand(segment,
+ normalizeStart,
+ normalizeEnd));
+
+ m_mParentView->setCurrentSelection(0, false, false);
+ m_mParentView->addCommandToHistory(macro);
+ m_mParentView->setCurrentSelection(newSelection, false, false);
+
+ m_mParentView->canvas()->update();
+ m_currentElement = 0;
+
+ setBasicContextHelp();
+}
+
+void MatrixMover::ready()
+{
+ connect(m_parentView->getCanvasView(), SIGNAL(contentsMoving (int, int)),
+ this, SLOT(slotMatrixScrolled(int, int)));
+ connect(this, SIGNAL(hoveredOverNoteChanged(int, bool, timeT)),
+ m_mParentView, SLOT(slotHoveredOverNoteChanged(int, bool, timeT)));
+ m_mParentView->setCanvasCursor(Qt::sizeAllCursor);
+ setBasicContextHelp();
+}
+
+void MatrixMover::stow()
+{
+ disconnect(m_parentView->getCanvasView(), SIGNAL(contentsMoving (int, int)),
+ this, SLOT(slotMatrixScrolled(int, int)));
+ disconnect(this, SIGNAL(hoveredOverNoteChanged(int, bool, timeT)),
+ m_mParentView, SLOT(slotHoveredOverNoteChanged(int, bool, timeT)));
+}
+
+void MatrixMover::slotMatrixScrolled(int newX, int newY)
+{
+ if (!m_currentElement)
+ return ;
+
+ QPoint newP1(newX, newY), oldP1(m_parentView->getCanvasView()->contentsX(),
+ m_parentView->getCanvasView()->contentsY());
+
+ QPoint offset = newP1 - oldP1;
+
+ offset = m_mParentView->inverseMapPoint(offset);
+
+ QPoint p(m_currentElement->getCanvasX(), m_currentElement->getCanvasY());
+ p += offset;
+
+ timeT newTime = getSnapGrid().snapX(p.x());
+ int newPitch = m_currentStaff->getHeightAtCanvasCoords(p.x(), p.y());
+
+ handleMouseMove(newTime, newPitch, 0);
+}
+
+void MatrixMover::setBasicContextHelp(bool ctrlPressed)
+{
+ EventSelection *selection = m_mParentView->getCurrentSelection();
+ if (!selection || selection->getAddedEvents() < 2) {
+ if (!ctrlPressed) {
+ setContextHelp(i18n("Click and drag to move a note; hold Ctrl as well to copy it"));
+ } else {
+ setContextHelp(i18n("Click and drag to copy a note"));
+ }
+ } else {
+ if (!ctrlPressed) {
+ setContextHelp(i18n("Click and drag to move selected notes; hold Ctrl as well to copy"));
+ } else {
+ setContextHelp(i18n("Click and drag to copy selected notes"));
+ }
+ }
+}
+
+const QString MatrixMover::ToolName = "mover";
+
+}
+#include "MatrixMover.moc"
diff --git a/src/gui/editors/matrix/MatrixMover.h b/src/gui/editors/matrix/MatrixMover.h
new file mode 100644
index 0000000..ac95c5f
--- /dev/null
+++ b/src/gui/editors/matrix/MatrixMover.h
@@ -0,0 +1,112 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_MATRIXMOVER_H_
+#define _RG_MATRIXMOVER_H_
+
+#include "MatrixTool.h"
+#include <qstring.h>
+#include "base/Event.h"
+
+
+class QMouseEvent;
+
+
+namespace Rosegarden
+{
+
+class ViewElement;
+class MatrixView;
+class MatrixStaff;
+class MatrixElement;
+class Event;
+
+
+class MatrixMover : public MatrixTool
+{
+ Q_OBJECT
+
+ friend class MatrixToolBox;
+
+public:
+ virtual void handleLeftButtonPress(timeT,
+ int height,
+ int staffNo,
+ QMouseEvent *event,
+ ViewElement*);
+
+ /**
+ * Set the duration of the element
+ */
+ virtual int handleMouseMove(timeT,
+ int height,
+ QMouseEvent*);
+
+ /**
+ * Actually insert the new element
+ */
+ virtual void handleMouseRelease(timeT,
+ int height,
+ QMouseEvent*);
+
+ static const QString ToolName;
+
+ /**
+ * Respond to an event being deleted -- it may be the one the tool
+ * is remembering as the current event.
+ */
+ virtual void handleEventRemoved(Event *event);
+
+ virtual void ready();
+ virtual void stow();
+
+signals:
+ void hoveredOverNoteChanged(int evPitch, bool haveEvent, timeT evTime);
+
+protected slots:
+ void slotMatrixScrolled(int x, int y);
+
+protected:
+ MatrixMover(MatrixView*);
+
+ void setBasicContextHelp(bool ctrlPressed = false);
+
+ timeT getDragTime(QMouseEvent *e, timeT candidate);
+
+ MatrixElement* m_currentElement;
+ MatrixStaff* m_currentStaff;
+
+ std::vector<MatrixElement *> m_duplicateElements;
+ bool m_quickCopy;
+
+ int m_lastPlayedPitch;
+ int m_clickX;
+};
+
+
+
+}
+
+#endif
diff --git a/src/gui/editors/matrix/MatrixPainter.cpp b/src/gui/editors/matrix/MatrixPainter.cpp
new file mode 100644
index 0000000..be63bd7
--- /dev/null
+++ b/src/gui/editors/matrix/MatrixPainter.cpp
@@ -0,0 +1,370 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "MatrixPainter.h"
+
+#include "base/BaseProperties.h"
+#include <klocale.h>
+#include <kstddirs.h>
+#include "base/Event.h"
+#include "base/NotationTypes.h"
+#include "base/SegmentMatrixHelper.h"
+#include "base/SnapGrid.h"
+#include "base/ViewElement.h"
+#include "commands/matrix/MatrixInsertionCommand.h"
+#include "commands/matrix/MatrixEraseCommand.h"
+#include "commands/matrix/MatrixPercussionInsertionCommand.h"
+#include "gui/general/EditTool.h"
+#include "gui/general/RosegardenCanvasView.h"
+#include "MatrixElement.h"
+#include "MatrixStaff.h"
+#include "MatrixTool.h"
+#include "MatrixView.h"
+#include <kaction.h>
+#include <kglobal.h>
+#include <qiconset.h>
+#include <qpoint.h>
+#include <qstring.h>
+#include "misc/Debug.h"
+
+
+namespace Rosegarden
+{
+
+MatrixPainter::MatrixPainter(MatrixView* parent)
+ : MatrixTool("MatrixPainter", parent),
+ m_currentElement(0),
+ m_currentStaff(0)
+{
+ QString pixmapDir = KGlobal::dirs()->findResource("appdata", "pixmaps/");
+ QCanvasPixmap pixmap(pixmapDir + "/toolbar/select.xpm");
+ QIconSet icon = QIconSet(pixmap);
+
+ new KAction(i18n("Switch to Select Tool"), icon, 0, this,
+ SLOT(slotSelectSelected()), actionCollection(),
+ "select");
+
+ new KAction(i18n("Switch to Erase Tool"), "eraser", 0, this,
+ SLOT(slotEraseSelected()), actionCollection(),
+ "erase");
+
+ new KAction(i18n("Switch to Move Tool"), "move", 0, this,
+ SLOT(slotMoveSelected()), actionCollection(),
+ "move");
+
+ pixmap.load(pixmapDir + "/toolbar/resize.xpm");
+ icon = QIconSet(pixmap);
+ new KAction(i18n("Switch to Resize Tool"), icon, 0, this,
+ SLOT(slotResizeSelected()), actionCollection(),
+ "resize");
+
+ createMenu("matrixpainter.rc");
+}
+
+MatrixPainter::MatrixPainter(QString name, MatrixView* parent)
+ : MatrixTool(name, parent),
+ m_currentElement(0),
+ m_currentStaff(0)
+{}
+
+void MatrixPainter::handleEventRemoved(Event *event)
+{
+ if (m_currentElement && m_currentElement->event() == event) {
+ m_currentElement = 0;
+ }
+}
+
+void MatrixPainter::handleLeftButtonPress(timeT time,
+ int pitch,
+ int staffNo,
+ QMouseEvent *e,
+ ViewElement *element)
+{
+ MATRIX_DEBUG << "MatrixPainter::handleLeftButtonPress : pitch = "
+ << pitch << ", time : " << time << endl;
+
+ QPoint p = m_mParentView->inverseMapPoint(e->pos());
+
+ m_currentStaff = m_mParentView->getStaff(staffNo);
+
+ // Don't create an overlapping event on the same note on the same channel
+ if (dynamic_cast<MatrixElement*>(element)) {
+ std::cerr << "MatrixPainter::handleLeftButtonPress : overlap with an other matrix element" << std::endl;
+ // In percussion matrix, we delete the existing event rather
+ // than just ignoring it -- this is reasonable as the event
+ // has no meaningful duration, so we can just toggle it on and
+ // off with repeated clicks
+ if (m_mParentView->isDrumMode()) {
+ if (element->event()) {
+ MatrixEraseCommand *command =
+ new MatrixEraseCommand(m_currentStaff->getSegment(),
+ element->event());
+ m_mParentView->addCommandToHistory(command);
+ }
+ }
+ m_currentElement = 0;
+ return ;
+ }
+
+ // This is needed for the event duration rounding
+ SnapGrid grid(getSnapGrid());
+
+ Event *ev = new Event(Note::EventType, time,
+ grid.getSnapTime(double(p.x())));
+ ev->set<Int>(BaseProperties::PITCH, pitch);
+ ev->set<Int>(BaseProperties::VELOCITY, m_mParentView->getCurrentVelocity());
+
+ m_currentElement = new MatrixElement(ev, m_mParentView->isDrumMode());
+
+ int y = m_currentStaff->getLayoutYForHeight(pitch) -
+ m_currentStaff->getElementHeight() / 2;
+
+ m_currentElement->setLayoutY(y);
+ m_currentElement->setLayoutX(grid.getRulerScale()->getXForTime(time));
+ m_currentElement->setHeight(m_currentStaff->getElementHeight());
+
+ int width = grid.getRulerScale()->getXForTime(time + ev->getDuration())
+ - m_currentElement->getLayoutX() + 1;
+
+ m_currentElement->setWidth(width);
+
+ m_currentStaff->positionElement(m_currentElement);
+ m_mParentView->update();
+
+ // preview
+ m_mParentView->playNote(ev);
+}
+
+int MatrixPainter::handleMouseMove(timeT time,
+ int pitch,
+ QMouseEvent *e)
+{
+ // sanity check
+ if (!m_currentElement)
+ return RosegardenCanvasView::NoFollow;
+
+ if (getSnapGrid().getSnapSetting() != SnapGrid::NoSnap) {
+ setContextHelp(i18n("Hold Shift to avoid snapping to beat grid"));
+ } else {
+ clearContextHelp();
+ }
+
+ // We don't want to use the time passed in, because it's snapped
+ // to the left and we want a more particular policy
+
+ if (e) {
+ QPoint p = m_mParentView->inverseMapPoint(e->pos());
+ time = getSnapGrid().snapX(p.x(), SnapGrid::SnapEither);
+ if (time >= m_currentElement->getViewAbsoluteTime()) {
+ time = getSnapGrid().snapX(p.x(), SnapGrid::SnapRight);
+ } else {
+ time = getSnapGrid().snapX(p.x(), SnapGrid::SnapLeft);
+ }
+ }
+
+ MATRIX_DEBUG << "MatrixPainter::handleMouseMove : pitch = "
+ << pitch << ", time : " << time << endl;
+
+ using BaseProperties::PITCH;
+
+ if (time == m_currentElement->getViewAbsoluteTime()) {
+ time =
+ m_currentElement->getViewAbsoluteTime() +
+ m_currentElement->getViewDuration();
+ }
+
+ int width = getSnapGrid().getRulerScale()->getXForTime(time)
+ - getSnapGrid().getRulerScale()->getXForTime
+ (m_currentElement->getViewAbsoluteTime()) + 1;
+
+ m_currentElement->setWidth(width);
+// std::cerr << "current element width "<< width << std::endl;
+
+ if (m_currentElement->event()->has(PITCH) &&
+ pitch != m_currentElement->event()->get<Int>(PITCH)) {
+
+ m_currentElement->event()->set<Int>(PITCH, pitch);
+
+ int y = m_currentStaff->getLayoutYForHeight(pitch) -
+ m_currentStaff->getElementHeight() / 2;
+
+ m_currentElement->setLayoutY(y);
+
+ m_currentStaff->positionElement(m_currentElement);
+
+ // preview
+ m_mParentView->playNote(m_currentElement->event());
+ }
+
+ m_mParentView->update();
+
+ return RosegardenCanvasView::FollowHorizontal |
+ RosegardenCanvasView::FollowVertical;
+}
+
+void MatrixPainter::handleMouseRelease(timeT endTime,
+ int,
+ QMouseEvent *e)
+{
+ // This can happen in case of screen/window capture -
+ // we only get a mouse release, the window snapshot tool
+ // got the mouse down
+ if (!m_currentElement)
+ return ;
+
+ // We don't want to use the time passed in, because it's snapped
+ // to the left and we want a more particular policy
+
+ if (e) {
+ QPoint p = m_mParentView->inverseMapPoint(e->pos());
+ endTime = getSnapGrid().snapX(p.x(), SnapGrid::SnapEither);
+ if (endTime >= m_currentElement->getViewAbsoluteTime()) {
+ endTime = getSnapGrid().snapX(p.x(), SnapGrid::SnapRight);
+ } else {
+ endTime = getSnapGrid().snapX(p.x(), SnapGrid::SnapLeft);
+ }
+ }
+
+ timeT time = m_currentElement->getViewAbsoluteTime();
+ timeT segmentEndTime = m_currentStaff->getSegment().getEndMarkerTime();
+
+ if (m_mParentView->isDrumMode()) {
+
+ if (time > segmentEndTime)
+ time = segmentEndTime;
+
+ MatrixPercussionInsertionCommand *command =
+ new MatrixPercussionInsertionCommand(m_currentStaff->getSegment(),
+ time,
+ m_currentElement->event());
+ m_mParentView->addCommandToHistory(command);
+
+ Event* ev = m_currentElement->event();
+ delete m_currentElement;
+ delete ev;
+
+ ev = command->getLastInsertedEvent();
+ if (ev)
+ m_mParentView->setSingleSelectedEvent(m_currentStaff->getSegment(),
+ ev);
+ } else {
+
+ // Insert element if it has a non null duration,
+ // discard it otherwise
+ //
+ if (time > endTime)
+ std::swap(time, endTime);
+
+ if (endTime == time)
+ endTime = time + m_currentElement->getViewDuration();
+
+ if (time < segmentEndTime) {
+
+ if (endTime > segmentEndTime)
+ endTime = segmentEndTime;
+
+ SegmentMatrixHelper helper(m_currentStaff->getSegment());
+ MATRIX_DEBUG << "MatrixPainter::handleMouseRelease() : helper.insertNote()" << endl;
+
+ MatrixInsertionCommand* command =
+ new MatrixInsertionCommand(m_currentStaff->getSegment(),
+ time,
+ endTime,
+ m_currentElement->event());
+
+ m_mParentView->addCommandToHistory(command);
+
+ Event* ev = m_currentElement->event();
+ delete m_currentElement;
+ delete ev;
+
+ ev = command->getLastInsertedEvent();
+ if (ev)
+ m_mParentView->setSingleSelectedEvent(m_currentStaff->getSegment(),
+ ev);
+ } else {
+
+ Event* ev = m_currentElement->event();
+ delete m_currentElement;
+ delete ev;
+ }
+ }
+
+ m_mParentView->update();
+ m_currentElement = 0;
+
+ setBasicContextHelp();
+}
+
+void MatrixPainter::ready()
+{
+ connect(m_parentView->getCanvasView(), SIGNAL(contentsMoving (int, int)),
+ this, SLOT(slotMatrixScrolled(int, int)));
+
+ m_mParentView->setCanvasCursor(Qt::crossCursor);
+
+ setBasicContextHelp();
+}
+
+void MatrixPainter::stow()
+{
+ disconnect(m_parentView->getCanvasView(), SIGNAL(contentsMoving (int, int)),
+ this, SLOT(slotMatrixScrolled(int, int)));
+}
+
+void MatrixPainter::slotMatrixScrolled(int newX, int newY)
+{
+ if (!m_currentElement)
+ return ;
+
+ QPoint newP1(newX, newY), oldP1(m_parentView->getCanvasView()->contentsX(),
+ m_parentView->getCanvasView()->contentsY());
+
+ QPoint offset = newP1 - oldP1;
+
+ offset = m_mParentView->inverseMapPoint(offset);
+
+ QPoint p(m_currentElement->getCanvasX() + m_currentElement->getWidth(), m_currentElement->getCanvasY());
+ p += offset;
+
+ timeT newTime = getSnapGrid().snapX(p.x());
+ int newPitch = m_currentStaff->getHeightAtCanvasCoords(p.x(), p.y());
+
+ handleMouseMove(newTime, newPitch, 0);
+}
+
+void MatrixPainter::setBasicContextHelp()
+{
+ if (getSnapGrid().getSnapSetting() != SnapGrid::NoSnap) {
+ setContextHelp(i18n("Click and drag to draw a note; Shift to avoid snapping to grid"));
+ } else {
+ setContextHelp(i18n("Click and drag to draw a note"));
+ }
+}
+
+const QString MatrixPainter::ToolName = "painter";
+
+}
+#include "MatrixPainter.moc"
diff --git a/src/gui/editors/matrix/MatrixPainter.h b/src/gui/editors/matrix/MatrixPainter.h
new file mode 100644
index 0000000..570243a
--- /dev/null
+++ b/src/gui/editors/matrix/MatrixPainter.h
@@ -0,0 +1,105 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_MATRIXPAINTER_H_
+#define _RG_MATRIXPAINTER_H_
+
+#include "MatrixTool.h"
+#include <qstring.h>
+#include "base/Event.h"
+
+
+class QMouseEvent;
+
+
+namespace Rosegarden
+{
+
+class ViewElement;
+class MatrixView;
+class MatrixStaff;
+class MatrixElement;
+class Event;
+
+
+class MatrixPainter : public MatrixTool
+{
+ Q_OBJECT
+
+ friend class MatrixToolBox;
+
+public:
+
+ virtual void handleLeftButtonPress(timeT,
+ int height,
+ int staffNo,
+ QMouseEvent *event,
+ ViewElement*);
+
+ /**
+ * Set the duration of the element
+ */
+ virtual int handleMouseMove(timeT,
+ int height,
+ QMouseEvent*);
+
+ /**
+ * Actually insert the new element
+ */
+ virtual void handleMouseRelease(timeT,
+ int height,
+ QMouseEvent*);
+
+ static const QString ToolName;
+
+ /**
+ * Respond to an event being deleted -- it may be the one the tool
+ * is remembering as the current event.
+ */
+ virtual void handleEventRemoved(Event *event);
+
+ virtual void ready();
+ virtual void stow();
+
+protected slots:
+
+ void slotMatrixScrolled(int x, int y);
+
+protected:
+ MatrixPainter(MatrixView*);
+ MatrixPainter(QString name, MatrixView*);
+
+ void setBasicContextHelp();
+
+ MatrixElement* m_currentElement;
+ MatrixStaff* m_currentStaff;
+};
+
+
+
+
+}
+
+#endif
diff --git a/src/gui/editors/matrix/MatrixParameterBox.cpp b/src/gui/editors/matrix/MatrixParameterBox.cpp
new file mode 100644
index 0000000..c330b94
--- /dev/null
+++ b/src/gui/editors/matrix/MatrixParameterBox.cpp
@@ -0,0 +1,99 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "MatrixParameterBox.h"
+
+#include "base/Instrument.h"
+#include "base/BasicQuantizer.h"
+#include "base/Selection.h"
+#include "document/RosegardenGUIDoc.h"
+#include "gui/editors/parameters/InstrumentParameterBox.h"
+#include <kcombobox.h>
+#include <qfont.h>
+#include <qfontmetrics.h>
+#include <qframe.h>
+#include <qlayout.h>
+#include <qwidget.h>
+
+
+namespace Rosegarden
+{
+
+MatrixParameterBox::MatrixParameterBox(RosegardenGUIDoc *doc,
+ QWidget *parent, const char* name):
+ QFrame(parent, name),
+ m_quantizations(BasicQuantizer::getStandardQuantizations()),
+ m_doc(doc)
+{
+ setFrameStyle(NoFrame);
+ initBox();
+}
+
+MatrixParameterBox::~MatrixParameterBox()
+{}
+
+void
+MatrixParameterBox::initBox()
+{
+ QFont boldFont;
+ boldFont.setPointSize(int(boldFont.pointSize() * 9.5 / 10.0 + 0.5));
+ boldFont.setBold(true);
+
+ QFont plainFont;
+ plainFont.setPointSize(plainFont.pointSize() * 9 / 10);
+ QFont font = plainFont;
+
+ QFontMetrics fontMetrics(font);
+ // magic numbers: 13 is the height of the menu pixmaps, 10 is just 10
+ //int comboHeight = std::max(fontMetrics.height(), 13) + 10;
+
+ QGridLayout *gridLayout = new QGridLayout(this, 20, 3, 8, 1);
+
+ m_instrumentParameterBox = new InstrumentParameterBox(m_doc, this);
+ gridLayout->addMultiCellWidget(m_instrumentParameterBox, 0, 7, 0, 2);
+
+}
+
+void
+MatrixParameterBox::setSelection(EventSelection *selection)
+{
+ if (!selection)
+ return ;
+
+ EventSelection::eventcontainer::iterator
+ it = selection->getSegmentEvents().begin();
+
+for (; it != selection->getSegmentEvents().end(); it++) {}
+
+}
+
+void
+MatrixParameterBox::useInstrument(Instrument *instrument)
+{
+ m_instrumentParameterBox->useInstrument(instrument);
+}
+
+}
+#include "MatrixParameterBox.moc"
diff --git a/src/gui/editors/matrix/MatrixParameterBox.h b/src/gui/editors/matrix/MatrixParameterBox.h
new file mode 100644
index 0000000..d8d4a4d
--- /dev/null
+++ b/src/gui/editors/matrix/MatrixParameterBox.h
@@ -0,0 +1,76 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_MATRIXPARAMETERBOX_H_
+#define _RG_MATRIXPARAMETERBOX_H_
+
+#include <qframe.h>
+#include <vector>
+#include "base/Event.h"
+
+
+class QWidget;
+class KComboBox;
+
+
+namespace Rosegarden
+{
+
+class RosegardenGUIDoc;
+class InstrumentParameterBox;
+class Instrument;
+class EventSelection;
+
+
+class MatrixParameterBox : public QFrame
+{
+ Q_OBJECT
+
+public:
+ MatrixParameterBox(RosegardenGUIDoc *doc=0, QWidget *parent=0, const char* name=0);
+ ~MatrixParameterBox();
+
+ void initBox();
+ void setSelection(EventSelection *);
+ void useInstrument(Instrument *instrument);
+
+protected:
+
+ KComboBox *m_quantizeCombo;
+ KComboBox *m_snapGridCombo;
+ InstrumentParameterBox *m_instrumentParameterBox;
+
+ std::vector<timeT> m_quantizations;
+ std::vector<timeT> m_snapValues;
+
+ RosegardenGUIDoc *m_doc;
+
+};
+
+
+
+}
+
+#endif
diff --git a/src/gui/editors/matrix/MatrixResizer.cpp b/src/gui/editors/matrix/MatrixResizer.cpp
new file mode 100644
index 0000000..2fab5e8
--- /dev/null
+++ b/src/gui/editors/matrix/MatrixResizer.cpp
@@ -0,0 +1,333 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "MatrixResizer.h"
+
+#include <klocale.h>
+#include <kstddirs.h>
+#include "base/Event.h"
+#include "base/Segment.h"
+#include "base/Selection.h"
+#include "base/SnapGrid.h"
+#include "base/ViewElement.h"
+#include "commands/matrix/MatrixModifyCommand.h"
+#include "commands/notation/NormalizeRestsCommand.h"
+#include "gui/general/EditTool.h"
+#include "gui/general/RosegardenCanvasView.h"
+#include "MatrixElement.h"
+#include "MatrixStaff.h"
+#include "MatrixTool.h"
+#include "MatrixView.h"
+#include <kaction.h>
+#include <kglobal.h>
+#include <qiconset.h>
+#include <qpoint.h>
+#include <qstring.h>
+#include "misc/Debug.h"
+
+
+namespace Rosegarden
+{
+
+MatrixResizer::MatrixResizer(MatrixView* parent)
+ : MatrixTool("MatrixResizer", parent),
+ m_currentElement(0),
+ m_currentStaff(0)
+{
+ QString pixmapDir = KGlobal::dirs()->findResource("appdata", "pixmaps/");
+ QCanvasPixmap pixmap(pixmapDir + "/toolbar/select.xpm");
+ QIconSet icon = QIconSet(pixmap);
+
+ new KAction(i18n("Switch to Select Tool"), icon, 0, this,
+ SLOT(slotSelectSelected()), actionCollection(),
+ "select");
+
+ new KAction(i18n("Switch to Draw Tool"), "pencil", 0, this,
+ SLOT(slotDrawSelected()), actionCollection(),
+ "draw");
+
+ new KAction(i18n("Switch to Erase Tool"), "eraser", 0, this,
+ SLOT(slotEraseSelected()), actionCollection(),
+ "erase");
+
+ new KAction(i18n("Switch to Move Tool"), "move", 0, this,
+ SLOT(slotMoveSelected()), actionCollection(),
+ "move");
+
+ createMenu("matrixresizer.rc");
+}
+
+void MatrixResizer::handleEventRemoved(Event *event)
+{
+ if (m_currentElement && m_currentElement->event() == event) {
+ m_currentElement = 0;
+ }
+}
+
+void MatrixResizer::handleLeftButtonPress(timeT,
+ int,
+ int staffNo,
+ QMouseEvent* e,
+ ViewElement* el)
+{
+ MATRIX_DEBUG << "MatrixResizer::handleLeftButtonPress() : el = "
+ << el << endl;
+
+ if (!el)
+ return ; // nothing to erase
+
+ m_currentElement = dynamic_cast<MatrixElement*>(el);
+ m_currentStaff = m_mParentView->getStaff(staffNo);
+
+ if (m_currentElement) {
+
+ // Add this element and allow movement
+ //
+ EventSelection* selection = m_mParentView->getCurrentSelection();
+
+ if (selection) {
+ EventSelection *newSelection;
+
+ if ((e->state() & Qt::ShiftButton) ||
+ selection->contains(m_currentElement->event()))
+ newSelection = new EventSelection(*selection);
+ else
+ newSelection = new EventSelection(m_currentStaff->getSegment());
+
+ newSelection->addEvent(m_currentElement->event());
+ m_mParentView->setCurrentSelection(newSelection, true, true);
+ m_mParentView->canvas()->update();
+ } else {
+ m_mParentView->setSingleSelectedEvent(m_currentStaff->getSegment(),
+ m_currentElement->event(),
+ true);
+ m_mParentView->canvas()->update();
+ }
+ }
+}
+
+int MatrixResizer::handleMouseMove(timeT newTime,
+ int,
+ QMouseEvent *e)
+{
+ setBasicContextHelp();
+
+ if (!m_currentElement || !m_currentStaff)
+ return RosegardenCanvasView::NoFollow;
+
+ if (getSnapGrid().getSnapSetting() != SnapGrid::NoSnap) {
+ setContextHelp(i18n("Hold Shift to avoid snapping to beat grid"));
+ } else {
+ clearContextHelp();
+ }
+
+ // For the resizer we normally don't want to use the official
+ // time, because it's snapped to the left and we want to snap in
+ // the closest direction instead
+
+ if (e) {
+ QPoint p = m_mParentView->inverseMapPoint(e->pos());
+ newTime = getSnapGrid().snapX(p.x(), SnapGrid::SnapEither);
+ }
+
+ timeT newDuration = newTime - m_currentElement->getViewAbsoluteTime();
+
+ if (newDuration == 0) {
+ newDuration += getSnapGrid().getSnapTime
+ (m_currentElement->getViewAbsoluteTime());
+ }
+
+ int width = getSnapGrid().getRulerScale()->getXForTime
+ (m_currentElement->getViewAbsoluteTime() + newDuration)
+ - m_currentElement->getLayoutX() + 1;
+
+ int initialWidth = m_currentElement->getWidth();
+
+ int diffWidth = initialWidth - width;
+
+ EventSelection* selection = m_mParentView->getCurrentSelection();
+ EventSelection::eventcontainer::iterator it =
+ selection->getSegmentEvents().begin();
+
+ MatrixElement *element = 0;
+ for (; it != selection->getSegmentEvents().end(); it++) {
+ element = m_currentStaff->getElement(*it);
+
+ if (element) {
+ int newWidth = element->getWidth() - diffWidth;
+
+ MATRIX_DEBUG << "MatrixResizer::handleMouseMove - "
+ << "new width = " << newWidth << endl;
+
+ element->setWidth(newWidth);
+ m_currentStaff->positionElement(element);
+ }
+ }
+
+ m_mParentView->canvas()->update();
+ return RosegardenCanvasView::FollowHorizontal;
+}
+
+void MatrixResizer::handleMouseRelease(timeT newTime,
+ int,
+ QMouseEvent *e)
+{
+ if (!m_currentElement || !m_currentStaff)
+ return ;
+
+ // For the resizer we don't want to use the time passed in,
+ // because it's snapped to the left and we want to snap in the
+ // closest direction instead
+
+ if (e) {
+ QPoint p = m_mParentView->inverseMapPoint(e->pos());
+ newTime = getSnapGrid().snapX(p.x(), SnapGrid::SnapEither);
+ }
+
+ timeT diffDuration =
+ newTime - m_currentElement->getViewAbsoluteTime() -
+ m_currentElement->getViewDuration();
+
+ EventSelection *selection = m_mParentView->getCurrentSelection();
+
+ if (selection->getAddedEvents() == 0)
+ return ;
+ else {
+ QString commandLabel = i18n("Resize Event");
+
+ if (selection->getAddedEvents() > 1)
+ commandLabel = i18n("Resize Events");
+
+ KMacroCommand *macro = new KMacroCommand(commandLabel);
+
+ EventSelection::eventcontainer::iterator it =
+ selection->getSegmentEvents().begin();
+
+ Segment &segment = m_currentStaff->getSegment();
+
+ EventSelection *newSelection = new EventSelection(segment);
+
+ timeT normalizeStart = selection->getStartTime();
+ timeT normalizeEnd = selection->getEndTime();
+
+ for (; it != selection->getSegmentEvents().end(); it++) {
+ timeT eventTime = (*it)->getAbsoluteTime();
+ timeT eventDuration = (*it)->getDuration() + diffDuration;
+
+
+ MATRIX_DEBUG << "MatrixResizer::handleMouseRelease - "
+ << "Time = " << eventTime
+ << ", Duration = " << eventDuration << endl;
+
+
+ if (eventDuration < 0) {
+ eventTime += eventDuration;
+ eventDuration = -eventDuration;
+ }
+
+ if (eventDuration == 0) {
+ eventDuration += getSnapGrid().getSnapTime(eventTime);
+ }
+
+ if (eventTime + eventDuration >= segment.getEndMarkerTime()) {
+ eventDuration = std::min(eventDuration,
+ segment.getEndMarkerTime() - eventTime);
+ }
+
+ Event *newEvent =
+ new Event(**it,
+ eventTime,
+ eventDuration);
+
+ macro->addCommand(new MatrixModifyCommand(segment,
+ *it,
+ newEvent,
+ false,
+ false));
+
+ newSelection->addEvent(newEvent);
+ }
+
+ normalizeStart = std::min(normalizeStart, newSelection->getStartTime());
+ normalizeEnd = std::max(normalizeEnd, newSelection->getEndTime());
+
+ macro->addCommand(new NormalizeRestsCommand(segment,
+ normalizeStart,
+ normalizeEnd));
+
+ m_mParentView->setCurrentSelection(0, false, false);
+ m_mParentView->addCommandToHistory(macro);
+ m_mParentView->setCurrentSelection(newSelection, false, false);
+ }
+
+ m_mParentView->update();
+ m_currentElement = 0;
+ setBasicContextHelp();
+}
+
+void MatrixResizer::ready()
+{
+ connect(m_parentView->getCanvasView(), SIGNAL(contentsMoving (int, int)),
+ this, SLOT(slotMatrixScrolled(int, int)));
+ m_mParentView->setCanvasCursor(Qt::sizeHorCursor);
+ setBasicContextHelp();
+}
+
+void MatrixResizer::stow()
+{
+ disconnect(m_parentView->getCanvasView(), SIGNAL(contentsMoving (int, int)),
+ this, SLOT(slotMatrixScrolled(int, int)));
+}
+
+void MatrixResizer::slotMatrixScrolled(int newX, int newY)
+{
+ QPoint newP1(newX, newY), oldP1(m_parentView->getCanvasView()->contentsX(),
+ m_parentView->getCanvasView()->contentsY());
+
+ QPoint p(newX, newY);
+
+ if (newP1.x() > oldP1.x()) {
+ p.setX(newX + m_parentView->getCanvasView()->visibleWidth());
+ }
+
+ p = m_mParentView->inverseMapPoint(p);
+ int newTime = getSnapGrid().snapX(p.x());
+ handleMouseMove(newTime, 0, 0);
+}
+
+void MatrixResizer::setBasicContextHelp()
+{
+ EventSelection *selection = m_mParentView->getCurrentSelection();
+ if (selection && selection->getAddedEvents() > 1) {
+ setContextHelp(i18n("Click and drag to resize selected notes"));
+ } else {
+ setContextHelp(i18n("Click and drag to resize a note"));
+ }
+}
+
+const QString MatrixResizer::ToolName = "resizer";
+
+}
+#include "MatrixResizer.moc"
diff --git a/src/gui/editors/matrix/MatrixResizer.h b/src/gui/editors/matrix/MatrixResizer.h
new file mode 100644
index 0000000..e623cac
--- /dev/null
+++ b/src/gui/editors/matrix/MatrixResizer.h
@@ -0,0 +1,102 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_MATRIXRESIZER_H_
+#define _RG_MATRIXRESIZER_H_
+
+#include "MatrixTool.h"
+#include <qstring.h>
+#include "base/Event.h"
+
+
+class QMouseEvent;
+
+
+namespace Rosegarden
+{
+
+class ViewElement;
+class MatrixView;
+class MatrixStaff;
+class MatrixElement;
+class Event;
+
+
+class MatrixResizer : public MatrixTool
+{
+ Q_OBJECT
+
+ friend class MatrixToolBox;
+
+public:
+ virtual void handleLeftButtonPress(timeT,
+ int height,
+ int staffNo,
+ QMouseEvent *event,
+ ViewElement*);
+
+ /**
+ * Set the duration of the element
+ */
+ virtual int handleMouseMove(timeT,
+ int height,
+ QMouseEvent*);
+
+ /**
+ * Actually insert the new element
+ */
+ virtual void handleMouseRelease(timeT,
+ int height,
+ QMouseEvent*);
+
+ static const QString ToolName;
+
+ /**
+ * Respond to an event being deleted -- it may be the one the tool
+ * is remembering as the current event.
+ */
+ virtual void handleEventRemoved(Event *event);
+
+ virtual void ready();
+ virtual void stow();
+
+protected slots:
+
+ void slotMatrixScrolled(int x, int y);
+
+protected:
+ MatrixResizer(MatrixView*);
+
+ void setBasicContextHelp();
+
+ MatrixElement* m_currentElement;
+ MatrixStaff* m_currentStaff;
+};
+
+
+
+}
+
+#endif
diff --git a/src/gui/editors/matrix/MatrixSelector.cpp b/src/gui/editors/matrix/MatrixSelector.cpp
new file mode 100644
index 0000000..fbb9689
--- /dev/null
+++ b/src/gui/editors/matrix/MatrixSelector.cpp
@@ -0,0 +1,629 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "MatrixSelector.h"
+
+#include "base/BaseProperties.h"
+#include <klocale.h>
+#include <kstddirs.h>
+#include "base/Event.h"
+#include "base/NotationTypes.h"
+#include "base/Selection.h"
+#include "base/ViewElement.h"
+#include "commands/edit/EventEditCommand.h"
+#include "gui/dialogs/EventEditDialog.h"
+#include "gui/dialogs/SimpleEventEditDialog.h"
+#include "gui/general/EditTool.h"
+#include "gui/general/EditToolBox.h"
+#include "gui/general/GUIPalette.h"
+#include "gui/general/RosegardenCanvasView.h"
+#include "MatrixElement.h"
+#include "MatrixMover.h"
+#include "MatrixPainter.h"
+#include "MatrixResizer.h"
+#include "MatrixStaff.h"
+#include "MatrixTool.h"
+#include "MatrixView.h"
+#include <kaction.h>
+#include <kglobal.h>
+#include <kapplication.h>
+#include <kconfig.h>
+#include <qdialog.h>
+#include <qiconset.h>
+#include <qpoint.h>
+#include <qstring.h>
+#include "misc/Debug.h"
+
+
+namespace Rosegarden
+{
+
+MatrixSelector::MatrixSelector(MatrixView* view)
+ : MatrixTool("MatrixSelector", view),
+ m_selectionRect(0),
+ m_updateRect(false),
+ m_currentStaff(0),
+ m_clickedElement(0),
+ m_dispatchTool(0),
+ m_justSelectedBar(false),
+ m_matrixView(view),
+ m_selectionToMerge(0)
+{
+ connect(m_parentView, SIGNAL(usedSelection()),
+ this, SLOT(slotHideSelection()));
+
+ new KAction(i18n("Switch to Draw Tool"), "pencil", 0, this,
+ SLOT(slotDrawSelected()), actionCollection(),
+ "draw");
+
+ new KAction(i18n("Switch to Erase Tool"), "eraser", 0, this,
+ SLOT(slotEraseSelected()), actionCollection(),
+ "erase");
+
+ new KAction(i18n("Switch to Move Tool"), "move", 0, this,
+ SLOT(slotMoveSelected()), actionCollection(),
+ "move");
+
+ QString pixmapDir = KGlobal::dirs()->findResource("appdata", "pixmaps/");
+ QCanvasPixmap pixmap(pixmapDir + "/toolbar/resize.xpm");
+ QIconSet icon = QIconSet(pixmap);
+
+ new KAction(i18n("Switch to Resize Tool"), icon, 0, this,
+ SLOT(slotResizeSelected()), actionCollection(),
+ "resize");
+
+ createMenu("matrixselector.rc");
+}
+
+void MatrixSelector::handleEventRemoved(Event *event)
+{
+ if (m_dispatchTool)
+ m_dispatchTool->handleEventRemoved(event);
+ if (m_clickedElement && m_clickedElement->event() == event) {
+ m_clickedElement = 0;
+ }
+}
+
+void MatrixSelector::slotClickTimeout()
+{
+ m_justSelectedBar = false;
+}
+
+void MatrixSelector::handleLeftButtonPress(timeT time,
+ int height,
+ int staffNo,
+ QMouseEvent* e,
+ ViewElement *element)
+{
+ MATRIX_DEBUG << "MatrixSelector::handleMousePress" << endl;
+
+ if (m_justSelectedBar) {
+ handleMouseTripleClick(time, height, staffNo, e, element);
+ m_justSelectedBar = false;
+ return ;
+ }
+
+ QPoint p = m_mParentView->inverseMapPoint(e->pos());
+
+ m_currentStaff = m_mParentView->getStaff(staffNo);
+
+ // Do the merge selection thing
+ //
+ delete m_selectionToMerge; // you can safely delete 0, you know?
+ const EventSelection *selectionToMerge = 0;
+ if (e->state() & Qt::ShiftButton)
+ selectionToMerge = m_mParentView->getCurrentSelection();
+
+ m_selectionToMerge =
+ (selectionToMerge ? new EventSelection(*selectionToMerge) : 0);
+
+ // Now the rest of the element stuff
+ //
+ m_clickedElement = dynamic_cast<MatrixElement*>(element);
+
+ if (m_clickedElement) {
+ int x = int(m_clickedElement->getLayoutX());
+ int width = m_clickedElement->getWidth();
+ int resizeStart = int(double(width) * 0.85) + x;
+
+ // max size of 10
+ if ((x + width ) - resizeStart > 10)
+ resizeStart = x + width - 10;
+
+ if (p.x() > resizeStart) {
+ m_dispatchTool = m_parentView->
+ getToolBox()->getTool(MatrixResizer::ToolName);
+ } else {
+ m_dispatchTool = m_parentView->
+ getToolBox()->getTool(MatrixMover::ToolName);
+ }
+
+ m_dispatchTool->ready();
+
+ m_dispatchTool->handleLeftButtonPress(time,
+ height,
+ staffNo,
+ e,
+ element);
+ return ;
+
+ } else if (e->state() & Qt::ControlButton) {
+
+ handleMidButtonPress(time, height, staffNo, e, element);
+ return;
+
+ } else {
+
+ // Workaround for #930420 Positional error in sweep-selection box
+ // boundary
+ int zoomValue = (int)m_matrixView->m_hZoomSlider->getCurrentSize();
+ MatrixStaff *staff = m_mParentView->getStaff(staffNo);
+ int pitch = m_currentStaff->getHeightAtCanvasCoords(p.x(), p.y());
+ int pitchCentreHeight = staff->getTotalHeight() -
+ pitch * staff->getLineSpacing() - 2; // 2 or ?
+ int pitchLineHeight = pitchCentreHeight + staff->getLineSpacing() / 2;
+ int drawHeight = p.y();
+ if (drawHeight <= pitchLineHeight + 1 &&
+ drawHeight >= pitchLineHeight - 1) {
+ if (drawHeight == pitchLineHeight)
+ drawHeight += 2;
+ else
+ drawHeight += 2 * (drawHeight - pitchLineHeight);
+ }
+ MATRIX_DEBUG << "#### MatrixSelector::handleLeftButtonPress() : zoom "
+ << zoomValue
+ << " pitch " << pitch
+ << " pitchCentreHeight " << pitchCentreHeight
+ << " pitchLineHeight " << pitchLineHeight
+ << " lineSpacing " << staff->getLineSpacing()
+ << " drawHeight " << drawHeight << endl;
+ m_selectionRect->setX(int(p.x() / 4)*4); // more workaround for #930420
+ m_selectionRect->setY(drawHeight);
+ m_selectionRect->setSize(0, 0);
+
+ m_selectionRect->show();
+ m_updateRect = true;
+
+ // Clear existing selection if we're not merging
+ //
+ if (!m_selectionToMerge) {
+ m_mParentView->setCurrentSelection(0, false, true);
+ m_mParentView->canvas()->update();
+ }
+ }
+
+ //m_parentView->setCursorPosition(p.x());
+}
+
+void MatrixSelector::handleMidButtonPress(timeT time,
+ int height,
+ int staffNo,
+ QMouseEvent* e,
+ ViewElement *element)
+{
+ m_clickedElement = 0; // should be used for left-button clicks only
+
+ // Don't allow overlapping elements on the same channel
+ if (dynamic_cast<MatrixElement*>(element))
+ return ;
+
+ m_dispatchTool = m_parentView->
+ getToolBox()->getTool(MatrixPainter::ToolName);
+
+ m_dispatchTool->ready();
+
+ m_dispatchTool->handleLeftButtonPress(time, height, staffNo, e, element);
+}
+
+void MatrixSelector::handleMouseDoubleClick(timeT ,
+ int ,
+ int staffNo,
+ QMouseEvent *ev,
+ ViewElement *element)
+{
+ /*
+ if (m_dispatchTool)
+ {
+ m_dispatchTool->handleMouseDoubleClick(time, height, staffNo, e, element);
+ }
+ */
+
+ m_clickedElement = dynamic_cast<MatrixElement*>(element);
+
+ MatrixStaff *staff = m_mParentView->getStaff(staffNo);
+ if (!staff)
+ return ;
+
+ if (m_clickedElement) {
+
+ if (m_clickedElement->event()->isa(Note::EventType) &&
+ m_clickedElement->event()->has(BaseProperties::TRIGGER_SEGMENT_ID)) {
+
+ int id = m_clickedElement->event()->get
+ <Int>
+ (BaseProperties::TRIGGER_SEGMENT_ID);
+ emit editTriggerSegment(id);
+ return ;
+ }
+
+ if (ev->state() & ShiftButton) { // advanced edit
+
+ EventEditDialog dialog(m_mParentView, *m_clickedElement->event(), true);
+
+ if (dialog.exec() == QDialog::Accepted &&
+ dialog.isModified()) {
+
+ EventEditCommand *command = new EventEditCommand
+ (staff->getSegment(),
+ m_clickedElement->event(),
+ dialog.getEvent());
+
+ m_mParentView->addCommandToHistory(command);
+ }
+ } else {
+
+ SimpleEventEditDialog dialog(m_mParentView, m_mParentView->getDocument(),
+ *m_clickedElement->event(), false);
+
+ if (dialog.exec() == QDialog::Accepted &&
+ dialog.isModified()) {
+
+ EventEditCommand *command = new EventEditCommand
+ (staff->getSegment(),
+ m_clickedElement->event(),
+ dialog.getEvent());
+
+ m_mParentView->addCommandToHistory(command);
+ }
+ }
+
+ } /*
+
+ #988167: Matrix:Multiclick select methods don't work in matrix editor
+ Postponing this, as it falls foul of world-matrix transformation
+ etiquette and other such niceties
+
+ else {
+
+ QRect rect = staff->getBarExtents(ev->x(), ev->y());
+
+ m_selectionRect->setX(rect.x() + 2);
+ m_selectionRect->setY(rect.y());
+ m_selectionRect->setSize(rect.width() - 4, rect.height());
+
+ m_selectionRect->show();
+ m_updateRect = false;
+
+ m_justSelectedBar = true;
+ QTimer::singleShot(QApplication::doubleClickInterval(), this,
+ SLOT(slotClickTimeout()));
+ } */
+}
+
+void MatrixSelector::handleMouseTripleClick(timeT t,
+ int height,
+ int staffNo,
+ QMouseEvent *ev,
+ ViewElement *element)
+{
+ if (!m_justSelectedBar)
+ return ;
+ m_justSelectedBar = false;
+
+ MatrixStaff *staff = m_mParentView->getStaff(staffNo);
+ if (!staff)
+ return ;
+
+ if (m_clickedElement) {
+
+ // should be safe, as we've already set m_justSelectedBar false
+ handleLeftButtonPress(t, height, staffNo, ev, element);
+ return ;
+
+ } else {
+
+ m_selectionRect->setX(staff->getX());
+ m_selectionRect->setY(staff->getY());
+ m_selectionRect->setSize(int(staff->getTotalWidth()) - 1,
+ staff->getTotalHeight() - 1);
+
+ m_selectionRect->show();
+ m_updateRect = false;
+ }
+}
+
+int MatrixSelector::handleMouseMove(timeT time, int height,
+ QMouseEvent *e)
+{
+ QPoint p = m_mParentView->inverseMapPoint(e->pos());
+
+ if (m_dispatchTool) {
+ return m_dispatchTool->handleMouseMove(time, height, e);
+ }
+
+
+ if (!m_updateRect) {
+ setContextHelpFor(e->pos(),
+ getSnapGrid().getSnapSetting() == SnapGrid::NoSnap);
+ return RosegardenCanvasView::NoFollow;
+ } else {
+ clearContextHelp();
+ }
+
+ int w = int(p.x() - m_selectionRect->x());
+ int h = int(p.y() - m_selectionRect->y());
+
+ // Qt rectangle dimensions appear to be 1-based
+ if (w > 0)
+ ++w;
+ else
+ --w;
+ if (h > 0)
+ ++h;
+ else
+ --h;
+
+ // Workaround for #930420 Positional error in sweep-selection box boundary
+ int wFix = (w > 0) ? 3 : 0;
+ int hFix = (h > 0) ? 3 : 0;
+ int xFix = (w < 0) ? 3 : 0;
+ m_selectionRect->setSize(w - wFix, h - hFix);
+ m_selectionRect->setX(m_selectionRect->x() + xFix);
+ setViewCurrentSelection();
+ m_selectionRect->setSize(w, h);
+ m_selectionRect->setX(m_selectionRect->x() - xFix);
+ m_mParentView->canvas()->update();
+
+ return RosegardenCanvasView::FollowHorizontal | RosegardenCanvasView::FollowVertical;
+}
+
+void MatrixSelector::handleMouseRelease(timeT time, int height, QMouseEvent *e)
+{
+ MATRIX_DEBUG << "MatrixSelector::handleMouseRelease" << endl;
+
+ if (m_dispatchTool) {
+ m_dispatchTool->handleMouseRelease(time, height, e);
+
+ m_dispatchTool->stow();
+ ready();
+
+ // don't delete the tool as it's still part of the toolbox
+ m_dispatchTool = 0;
+
+ return ;
+ }
+
+ m_updateRect = false;
+
+ if (m_clickedElement) {
+ m_mParentView->setSingleSelectedEvent(m_currentStaff->getSegment(),
+ m_clickedElement->event(),
+ false, true);
+ m_mParentView->canvas()->update();
+ m_clickedElement = 0;
+
+ } else if (m_selectionRect) {
+ setViewCurrentSelection();
+ m_selectionRect->hide();
+ m_mParentView->canvas()->update();
+ }
+
+ // Tell anyone who's interested that the selection has changed
+ emit gotSelection();
+
+ setContextHelpFor(e->pos());
+}
+
+void MatrixSelector::ready()
+{
+ if (m_mParentView) {
+ m_selectionRect = new QCanvasRectangle(m_mParentView->canvas());
+ m_selectionRect->hide();
+ m_selectionRect->setPen(QPen(GUIPalette::getColour(GUIPalette::SelectionRectangle), 2));
+
+ m_mParentView->setCanvasCursor(Qt::arrowCursor);
+ //m_mParentView->setPositionTracking(false);
+ }
+
+ connect(m_parentView->getCanvasView(), SIGNAL(contentsMoving (int, int)),
+ this, SLOT(slotMatrixScrolled(int, int)));
+
+ setContextHelp(i18n("Click and drag to select; middle-click and drag to draw new note"));
+}
+
+void MatrixSelector::stow()
+{
+ if (m_selectionRect) {
+ delete m_selectionRect;
+ m_selectionRect = 0;
+ m_mParentView->canvas()->update();
+ }
+
+ disconnect(m_parentView->getCanvasView(), SIGNAL(contentsMoving (int, int)),
+ this, SLOT(slotMatrixScrolled(int, int)));
+
+}
+
+void MatrixSelector::slotHideSelection()
+{
+ if (!m_selectionRect)
+ return ;
+ m_selectionRect->hide();
+ m_selectionRect->setSize(0, 0);
+ m_mParentView->canvas()->update();
+}
+
+void MatrixSelector::slotMatrixScrolled(int newX, int newY)
+{
+ if (m_updateRect) {
+ int offsetX = newX - m_parentView->getCanvasView()->contentsX();
+ int offsetY = newY - m_parentView->getCanvasView()->contentsY();
+
+ int w = int(m_selectionRect->width() + offsetX);
+ int h = int(m_selectionRect->height() + offsetY);
+
+ // Qt rectangle dimensions appear to be 1-based
+ if (w > 0)
+ ++w;
+ else
+ --w;
+ if (h > 0)
+ ++h;
+ else
+ --h;
+
+ m_selectionRect->setSize(w, h);
+ setViewCurrentSelection();
+ m_mParentView->canvas()->update();
+ }
+}
+
+void MatrixSelector::setViewCurrentSelection()
+{
+ EventSelection* selection = getSelection();
+
+ if (m_selectionToMerge && selection &&
+ m_selectionToMerge->getSegment() == selection->getSegment()) {
+
+ selection->addFromSelection(m_selectionToMerge);
+ m_mParentView->setCurrentSelection(selection, true, true);
+
+ } else if (!m_selectionToMerge) {
+
+ m_mParentView->setCurrentSelection(selection, true, true);
+
+ }
+
+}
+
+EventSelection* MatrixSelector::getSelection()
+{
+ if (!m_selectionRect->visible()) return 0;
+
+ Segment& originalSegment = m_currentStaff->getSegment();
+ EventSelection* selection = new EventSelection(originalSegment);
+
+ // get the selections
+ //
+ QCanvasItemList l = m_selectionRect->collisions(true);
+
+ if (l.count())
+ {
+ for (QCanvasItemList::Iterator it=l.begin(); it!=l.end(); ++it)
+ {
+ QCanvasItem *item = *it;
+ QCanvasMatrixRectangle *matrixRect = 0;
+
+ if ((matrixRect = dynamic_cast<QCanvasMatrixRectangle*>(item)))
+ {
+ MatrixElement *mE = &matrixRect->getMatrixElement();
+ selection->addEvent(mE->event());
+ }
+ }
+ }
+
+ if (selection->getAddedEvents() > 0) {
+ return selection;
+ } else {
+ delete selection;
+ return 0;
+ }
+}
+
+void MatrixSelector::setContextHelpFor(QPoint p, bool ctrlPressed)
+{
+ kapp->config()->setGroup(GeneralOptionsConfigGroup);
+ if (!kapp->config()->readBoolEntry("toolcontexthelp", true)) return;
+
+ p = m_mParentView->inverseMapPoint(p);
+
+ // same logic as in MatrixCanvasView::contentsMousePressEvent
+
+ QCanvasItemList itemList = m_mParentView->canvas()->collisions(p);
+ QCanvasItemList::Iterator it;
+ MatrixElement* mel = 0;
+ QCanvasItem* activeItem = 0;
+
+ for (it = itemList.begin(); it != itemList.end(); ++it) {
+
+ QCanvasItem *item = *it;
+ QCanvasMatrixRectangle *mRect = 0;
+
+ if (item->active()) {
+ break;
+ }
+
+ if ((mRect = dynamic_cast<QCanvasMatrixRectangle*>(item))) {
+ if (! mRect->rect().contains(p, true)) continue;
+ mel = &(mRect->getMatrixElement());
+ break;
+ }
+ }
+
+ if (!mel) {
+ setContextHelp(i18n("Click and drag to select; middle-click and drag to draw new note"));
+
+ } else {
+
+ // same logic as in handleMouseButtonPress
+
+ int x = int(mel->getLayoutX());
+ int width = mel->getWidth();
+ int resizeStart = int(double(width) * 0.85) + x;
+
+ // max size of 10
+ if ((x + width ) - resizeStart > 10)
+ resizeStart = x + width - 10;
+
+ EventSelection *s = m_mParentView->getCurrentSelection();
+
+ if (p.x() > resizeStart) {
+ if (s && s->getAddedEvents() > 1) {
+ setContextHelp(i18n("Click and drag to resize selected notes"));
+ } else {
+ setContextHelp(i18n("Click and drag to resize note"));
+ }
+ } else {
+ if (s && s->getAddedEvents() > 1) {
+ if (!ctrlPressed) {
+ setContextHelp(i18n("Click and drag to move selected notes; hold Ctrl as well to copy"));
+ } else {
+ setContextHelp(i18n("Click and drag to copy selected notes"));
+ }
+ } else {
+ if (!ctrlPressed) {
+ setContextHelp(i18n("Click and drag to move note; hold Ctrl as well to copy"));
+ } else {
+ setContextHelp(i18n("Click and drag to copy note"));
+ }
+ }
+ }
+ }
+}
+
+const QString MatrixSelector::ToolName = "selector";
+
+}
+#include "MatrixSelector.moc"
diff --git a/src/gui/editors/matrix/MatrixSelector.h b/src/gui/editors/matrix/MatrixSelector.h
new file mode 100644
index 0000000..a1d1ca4
--- /dev/null
+++ b/src/gui/editors/matrix/MatrixSelector.h
@@ -0,0 +1,177 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_MATRIXSELECTOR_H_
+#define _RG_MATRIXSELECTOR_H_
+
+#include "MatrixTool.h"
+#include <qstring.h>
+#include "base/Event.h"
+
+
+class QMouseEvent;
+class QCanvasRectangle;
+
+
+namespace Rosegarden
+{
+
+class ViewElement;
+class MatrixView;
+class MatrixStaff;
+class MatrixElement;
+class EventSelection;
+class Event;
+class EditTool;
+
+
+class MatrixSelector : public MatrixTool
+{
+ Q_OBJECT
+
+ friend class MatrixToolBox;
+
+public:
+
+ virtual void handleLeftButtonPress(timeT time,
+ int height,
+ int staffNo,
+ QMouseEvent *event,
+ ViewElement *element);
+
+ virtual void handleMidButtonPress(timeT time,
+ int height,
+ int staffNo,
+ QMouseEvent *event,
+ ViewElement *element);
+
+ virtual int handleMouseMove(timeT time,
+ int height,
+ QMouseEvent *event);
+
+ virtual void handleMouseRelease(timeT,
+ int height,
+ QMouseEvent *event);
+
+ /**
+ * Double-click: edit an event or make a whole-bar selection
+ */
+ virtual void handleMouseDoubleClick(timeT time,
+ int height,
+ int staffNo,
+ QMouseEvent* event,
+ ViewElement *element);
+
+ /**
+ * Triple-click: maybe make a whole-staff selection
+ */
+ virtual void handleMouseTripleClick(timeT time,
+ int height,
+ int staffNo,
+ QMouseEvent* event,
+ ViewElement *element);
+
+
+ /**
+ * Create the selection rect
+ *
+ * We need this because MatrixView deletes all QCanvasItems
+ * along with it. This happens before the MatrixSelector is
+ * deleted, so we can't delete the selection rect in
+ * ~MatrixSelector because that leads to double deletion.
+ */
+ virtual void ready();
+
+ /**
+ * Delete the selection rect.
+ */
+ virtual void stow();
+
+ /**
+ * Returns the currently selected events
+ *
+ * The returned result is owned by the caller
+ */
+ EventSelection* getSelection();
+
+ /**
+ * Respond to an event being deleted -- it may be the one the tool
+ * is remembering as the current event.
+ */
+ virtual void handleEventRemoved(Event *event);
+
+ static const QString ToolName;
+
+public slots:
+ /**
+ * Hide the selection rectangle
+ *
+ * Should be called after a cut or a copy has been
+ * performed
+ */
+ void slotHideSelection();
+
+ void slotClickTimeout();
+
+protected slots:
+
+ void slotMatrixScrolled(int x, int y);
+
+signals:
+ void gotSelection(); // inform that we've got a new selection
+ void editTriggerSegment(int);
+
+protected:
+ MatrixSelector(MatrixView*);
+
+ void setContextHelpFor(QPoint p, bool ctrlPressed = false);
+
+ void setViewCurrentSelection();
+
+ //--------------- Data members ---------------------------------
+
+ QCanvasRectangle* m_selectionRect;
+ bool m_updateRect;
+
+ int m_clickedStaff;
+ MatrixStaff* m_currentStaff;
+
+ MatrixElement* m_clickedElement;
+
+ // tool to delegate to
+ EditTool* m_dispatchTool;
+
+ bool m_justSelectedBar;
+
+ MatrixView * m_matrixView;
+
+ EventSelection *m_selectionToMerge;
+};
+
+
+
+}
+
+#endif
diff --git a/src/gui/editors/matrix/MatrixStaff.cpp b/src/gui/editors/matrix/MatrixStaff.cpp
new file mode 100644
index 0000000..b6be79f
--- /dev/null
+++ b/src/gui/editors/matrix/MatrixStaff.cpp
@@ -0,0 +1,232 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "MatrixStaff.h"
+#include "misc/Debug.h"
+
+#include "base/BaseProperties.h"
+#include "base/Composition.h"
+#include "base/Event.h"
+#include "base/Instrument.h"
+#include "base/MidiProgram.h"
+#include "base/NotationTypes.h"
+#include "base/Segment.h"
+#include "base/Selection.h"
+#include "base/SnapGrid.h"
+#include "base/Staff.h"
+#include "base/Track.h"
+#include "base/ViewElement.h"
+#include "base/SegmentMatrixHelper.h"
+#include "document/RosegardenGUIDoc.h"
+#include "gui/general/GUIPalette.h"
+#include "gui/general/LinedStaff.h"
+#include "gui/rulers/DefaultVelocityColour.h"
+#include "MatrixElement.h"
+#include "MatrixView.h"
+#include "MatrixVLayout.h"
+#include <qcanvas.h>
+
+
+namespace Rosegarden
+{
+
+MatrixStaff::MatrixStaff(QCanvas *canvas,
+ Segment *segment,
+ SnapGrid *snapGrid,
+ int id,
+ int vResolution,
+ MatrixView *view) :
+ LinedStaff(canvas, segment, snapGrid, id, vResolution, 1),
+ m_scaleFactor(2.0 /
+ Note(Note::Shortest).getDuration()),
+ m_view(view)
+{}
+
+MatrixStaff::~MatrixStaff()
+{
+ // nothing
+}
+
+int MatrixStaff::getLineCount() const
+{
+ // MATRIX_DEBUG << "MatrixStaff::getLineCount: isDrumMode " << m_view->isDrumMode() << ", key mapping " << (getKeyMapping() ? getKeyMapping()->getName() : "<none>") << endl;
+
+ if (m_view->isDrumMode()) {
+ const MidiKeyMapping *km = getKeyMapping();
+ if (km)
+ return km->getPitchExtent() + 1;
+ }
+ return MatrixVLayout::maxMIDIPitch + 2;
+}
+
+int MatrixStaff::getLegerLineCount() const
+{
+ return 0;
+}
+
+int MatrixStaff::getBottomLineHeight() const
+{
+ if (m_view->isDrumMode()) {
+ const MidiKeyMapping *km = getKeyMapping();
+ if (km)
+ return km->getPitchForOffset(0);
+ }
+ return 0;
+}
+
+int MatrixStaff::getHeightPerLine() const
+{
+ return 1;
+}
+
+bool MatrixStaff::elementsInSpaces() const
+{
+ return true;
+}
+
+bool MatrixStaff::showBeatLines() const
+{
+ return true;
+}
+
+bool MatrixStaff::wrapEvent(Event* e)
+{
+ // Changed from "Note or Time signature" to just "Note" because
+ // there should be no time signature events in any ordinary
+ // segments, they're only in the composition's ref segment
+
+ return e->isa(Note::EventType) &&
+ Staff::wrapEvent(e);
+}
+
+void
+MatrixStaff::positionElements(timeT from, timeT to)
+{
+ MatrixElementList *mel = getViewElementList();
+
+ MatrixElementList::iterator beginAt = mel->findTime(from);
+ if (beginAt != mel->begin())
+ --beginAt;
+
+ MatrixElementList::iterator endAt = mel->findTime(to);
+
+ for (MatrixElementList::iterator i = beginAt; i != endAt; ++i) {
+ positionElement(*i);
+ }
+}
+
+void MatrixStaff::positionElement(ViewElement* vel)
+{
+ MatrixElement* el = dynamic_cast<MatrixElement*>(vel);
+
+ // Memorize initial rectangle position. May be some overlap rectangles
+ // belonging to other notes are here and should be refreshed after
+ // current element is moved.
+ QRect initialRect;
+ bool rectWasVisible;
+ if (! m_view->isDrumMode())
+ rectWasVisible = el->getVisibleRectangle(initialRect);
+
+ LinedStaffCoords coords = getCanvasCoordsForLayoutCoords
+ (el->getLayoutX(), int(el->getLayoutY()));
+
+ // Get velocity for colouring
+ //
+ using BaseProperties::VELOCITY;
+ long velocity = 127;
+ if (el->event()->has(VELOCITY))
+ el->event()->get
+ <Int>(VELOCITY, velocity);
+
+ el->setCanvas(m_canvas);
+
+ // Is the event currently selected? Colour accordingly.
+ //
+ EventSelection *selection = m_view->getCurrentSelection();
+
+ if (selection && selection->contains(el->event()))
+ el->setColour(GUIPalette::getColour(GUIPalette::SelectedElement));
+ else if (el->event()->has(BaseProperties::TRIGGER_SEGMENT_ID))
+ el->setColour(Qt::gray);
+ else
+ el->setColour(DefaultVelocityColour::getInstance()->getColour(velocity));
+
+ el->setCanvasX(coords.first);
+ el->setCanvasY((double)coords.second);
+
+ // Display overlaps
+ if (m_view->isDrumMode()) {
+ SegmentMatrixHelper helper(m_segment);
+ if (helper.isDrumColliding(el->event()))
+ el->setColour(GUIPalette::getColour(GUIPalette::MatrixOverlapBlock));
+ } else {
+ el->drawOverlapRectangles();
+
+ // Refresh other overlap rectangles
+ if (rectWasVisible) el->redrawOverlaps(initialRect);
+ }
+
+}
+
+MatrixElement*
+MatrixStaff::getElement(Event *event)
+{
+ ViewElementList::iterator i = findEvent(event);
+ if (i == m_viewElementList->end())
+ return 0;
+ return dynamic_cast<MatrixElement*>(*i);
+}
+
+void
+MatrixStaff::eventRemoved(const Segment *segment,
+ Event *event)
+{
+ LinedStaff::eventRemoved(segment, event);
+ m_view->handleEventRemoved(event);
+}
+
+ViewElement*
+MatrixStaff::makeViewElement(Event* e)
+{
+ return new MatrixElement(e, m_view->isDrumMode());
+}
+
+const MidiKeyMapping*
+MatrixStaff::getKeyMapping() const
+{
+ Composition *comp = getSegment().getComposition();
+ if (!comp)
+ return 0;
+ TrackId trackId = getSegment().getTrack();
+ Track *track = comp->getTrackById(trackId);
+ Instrument *instr = m_view->getDocument()->getStudio().
+ getInstrumentById(track->getInstrument());
+ if (!instr)
+ return 0;
+ return m_view->getKeyMapping();
+}
+
+
+}
diff --git a/src/gui/editors/matrix/MatrixStaff.h b/src/gui/editors/matrix/MatrixStaff.h
new file mode 100644
index 0000000..cd0a9dc
--- /dev/null
+++ b/src/gui/editors/matrix/MatrixStaff.h
@@ -0,0 +1,111 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_MATRIXSTAFF_H_
+#define _RG_MATRIXSTAFF_H_
+
+#include "base/Staff.h"
+#include "gui/general/LinedStaff.h"
+#include "base/Event.h"
+
+
+class QCanvas;
+
+
+namespace Rosegarden
+{
+
+class ViewElement;
+class SnapGrid;
+class Segment;
+class MidiKeyMapping;
+class MatrixView;
+class MatrixElement;
+class Event;
+
+
+class MatrixStaff : public LinedStaff
+{
+public:
+ MatrixStaff(QCanvas *canvas,
+ Segment *segment,
+ SnapGrid *snapGrid,
+ int id,
+ int vResolution,
+ MatrixView *view);
+ virtual ~MatrixStaff();
+
+protected:
+ virtual int getLineCount() const;
+ virtual int getLegerLineCount() const;
+ virtual int getBottomLineHeight() const;
+ virtual int getHeightPerLine() const;
+ virtual bool elementsInSpaces() const;
+ virtual bool showBeatLines() const;
+
+ const MidiKeyMapping *getKeyMapping() const;
+
+ /**
+ * Override from Staff<T>
+ * Wrap only notes
+ */
+ virtual bool wrapEvent(Event*);
+
+ /**
+ * Override from Staff<T>
+ * Let tools know if their current element has gone
+ */
+ virtual void eventRemoved(const Segment *, Event *);
+
+ virtual ViewElement* makeViewElement(Event*);
+
+public:
+ LinedStaff::setResolution;
+
+// double getTimeScaleFactor() const { return m_scaleFactor * 2; } // TODO: GROSS HACK to enhance matrix resolution (see also in matrixview.cpp) - BREAKS MATRIX VIEW, see bug 1000595
+ double getTimeScaleFactor() const { return m_scaleFactor; }
+ void setTimeScaleFactor(double f) { m_scaleFactor = f; }
+
+ int getElementHeight() { return m_resolution; }
+
+ virtual void positionElements(timeT from,
+ timeT to);
+
+ virtual void positionElement(ViewElement*);
+
+ // Get an element for an Event
+ //
+ MatrixElement* getElement(Event *event);
+
+private:
+ double m_scaleFactor;
+
+ MatrixView *m_view;
+};
+
+
+}
+
+#endif
diff --git a/src/gui/editors/matrix/MatrixTool.cpp b/src/gui/editors/matrix/MatrixTool.cpp
new file mode 100644
index 0000000..b036559
--- /dev/null
+++ b/src/gui/editors/matrix/MatrixTool.cpp
@@ -0,0 +1,79 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "MatrixTool.h"
+
+#include "gui/general/EditTool.h"
+#include "MatrixView.h"
+#include <kaction.h>
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+MatrixTool::MatrixTool(const QString& menuName, MatrixView* parent)
+ : EditTool(menuName, parent),
+ m_mParentView(parent)
+{}
+
+void
+MatrixTool::slotSelectSelected()
+{
+ m_parentView->actionCollection()->action("select")->activate();
+}
+
+void
+MatrixTool::slotMoveSelected()
+{
+ m_parentView->actionCollection()->action("move")->activate();
+}
+
+void
+MatrixTool::slotEraseSelected()
+{
+ m_parentView->actionCollection()->action("erase")->activate();
+}
+
+void
+MatrixTool::slotResizeSelected()
+{
+ m_parentView->actionCollection()->action("resize")->activate();
+}
+
+void
+MatrixTool::slotDrawSelected()
+{
+ m_parentView->actionCollection()->action("draw")->activate();
+}
+
+const SnapGrid &
+MatrixTool::getSnapGrid() const
+{
+ return m_mParentView->getSnapGrid();
+}
+
+}
+#include "MatrixTool.moc"
diff --git a/src/gui/editors/matrix/MatrixTool.h b/src/gui/editors/matrix/MatrixTool.h
new file mode 100644
index 0000000..5127f57
--- /dev/null
+++ b/src/gui/editors/matrix/MatrixTool.h
@@ -0,0 +1,74 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_MATRIXTOOL_H_
+#define _RG_MATRIXTOOL_H_
+
+#include "gui/general/EditTool.h"
+
+
+class QString;
+
+
+namespace Rosegarden
+{
+
+class MatrixView;
+class SnapGrid;
+
+
+//////////////////////////////////////////////////////////////////////
+
+class MatrixTool : public EditTool
+{
+ Q_OBJECT
+
+public:
+// virtual void ready();
+
+protected slots:
+
+ // For switching between tools on RMB
+ //
+ void slotSelectSelected();
+ void slotMoveSelected();
+ void slotEraseSelected();
+ void slotResizeSelected();
+ void slotDrawSelected();
+
+ const SnapGrid &getSnapGrid() const;
+
+protected:
+ MatrixTool(const QString& menuName, MatrixView*);
+
+ //--------------- Data members ---------------------------------
+
+ MatrixView* m_mParentView;
+};
+
+
+}
+
+#endif
diff --git a/src/gui/editors/matrix/MatrixToolBox.cpp b/src/gui/editors/matrix/MatrixToolBox.cpp
new file mode 100644
index 0000000..466cfea
--- /dev/null
+++ b/src/gui/editors/matrix/MatrixToolBox.cpp
@@ -0,0 +1,87 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "MatrixToolBox.h"
+
+#include "gui/general/EditToolBox.h"
+#include "gui/general/EditTool.h"
+#include "MatrixView.h"
+#include "MatrixPainter.h"
+#include "MatrixEraser.h"
+#include "MatrixSelector.h"
+#include "MatrixMover.h"
+#include "MatrixResizer.h"
+
+#include <qstring.h>
+#include <kmessagebox.h>
+
+namespace Rosegarden
+{
+
+MatrixToolBox::MatrixToolBox(MatrixView* parent)
+ : EditToolBox(parent),
+ m_mParentView(parent)
+{}
+
+EditTool* MatrixToolBox::createTool(const QString& toolName)
+{
+ MatrixTool* tool = 0;
+
+ QString toolNamelc = toolName.lower();
+
+ if (toolNamelc == MatrixPainter::ToolName)
+
+ tool = new MatrixPainter(m_mParentView);
+
+ else if (toolNamelc == MatrixEraser::ToolName)
+
+ tool = new MatrixEraser(m_mParentView);
+
+ else if (toolNamelc == MatrixSelector::ToolName)
+
+ tool = new MatrixSelector(m_mParentView);
+
+ else if (toolNamelc == MatrixMover::ToolName)
+
+ tool = new MatrixMover(m_mParentView);
+
+ else if (toolNamelc == MatrixResizer::ToolName)
+
+ tool = new MatrixResizer(m_mParentView);
+
+ else {
+ KMessageBox::error(0, QString("MatrixToolBox::createTool : unrecognised toolname %1 (%2)")
+ .arg(toolName).arg(toolNamelc));
+ return 0;
+ }
+
+ m_tools.insert(toolName, tool);
+
+ return tool;
+
+}
+
+}
+#include "MatrixToolBox.moc"
diff --git a/src/gui/editors/matrix/MatrixToolBox.h b/src/gui/editors/matrix/MatrixToolBox.h
new file mode 100644
index 0000000..3bf0818
--- /dev/null
+++ b/src/gui/editors/matrix/MatrixToolBox.h
@@ -0,0 +1,60 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_MATRIXTOOLBOX_H_
+#define _RG_MATRIXTOOLBOX_H_
+
+#include "gui/general/EditToolBox.h"
+
+class QString;
+
+
+namespace Rosegarden
+{
+
+class EditTool;
+class MatrixView;
+class MatrixElement;
+class MatrixStaff;
+
+class MatrixToolBox : public EditToolBox
+{
+ Q_OBJECT
+public:
+ MatrixToolBox(MatrixView* parent);
+
+protected:
+
+ virtual EditTool* createTool(const QString& toolName);
+
+ //--------------- Data members ---------------------------------
+
+ MatrixView* m_mParentView;
+};
+
+
+}
+
+#endif
diff --git a/src/gui/editors/matrix/MatrixVLayout.cpp b/src/gui/editors/matrix/MatrixVLayout.cpp
new file mode 100644
index 0000000..aadcdf3
--- /dev/null
+++ b/src/gui/editors/matrix/MatrixVLayout.cpp
@@ -0,0 +1,100 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "MatrixVLayout.h"
+#include "misc/Debug.h"
+
+#include "base/BaseProperties.h"
+#include "base/LayoutEngine.h"
+#include "base/Staff.h"
+#include "MatrixElement.h"
+#include "MatrixStaff.h"
+
+
+namespace Rosegarden
+{
+
+MatrixVLayout::MatrixVLayout()
+{}
+
+MatrixVLayout::~MatrixVLayout()
+{}
+
+void MatrixVLayout::reset()
+{}
+
+void MatrixVLayout::resetStaff(Staff&, timeT, timeT)
+{}
+
+void MatrixVLayout::scanStaff(Staff& staffBase,
+ timeT startTime, timeT endTime)
+{
+ MatrixStaff& staff = dynamic_cast<MatrixStaff&>(staffBase);
+
+ using BaseProperties::PITCH;
+
+ MatrixElementList *notes = staff.getViewElementList();
+
+ MatrixElementList::iterator from = notes->begin();
+ MatrixElementList::iterator to = notes->end();
+ MatrixElementList::iterator i;
+
+ if (startTime != endTime) {
+ from = notes->findNearestTime(startTime);
+ if (from == notes->end())
+ from = notes->begin();
+ to = notes->findTime(endTime);
+ }
+
+ MATRIX_DEBUG << "MatrixVLayout::scanStaff : id = "
+ << staff.getId() << endl;
+
+
+ for (i = from; i != to; ++i) {
+
+ MatrixElement *el = dynamic_cast<MatrixElement*>((*i));
+
+ if (!el->isNote())
+ continue; // notes only
+
+ long pitch = 60;
+ el->event()->get
+ <Int>(PITCH, pitch);
+
+ int y = staff.getLayoutYForHeight(pitch) - staff.getElementHeight() / 2;
+
+ el->setLayoutY(y);
+ el->setHeight(staff.getElementHeight());
+ }
+
+}
+
+void MatrixVLayout::finishLayout(timeT, timeT)
+{}
+
+const int MatrixVLayout::minMIDIPitch = 0;
+const int MatrixVLayout::maxMIDIPitch = 127;
+
+}
diff --git a/src/gui/editors/matrix/MatrixVLayout.h b/src/gui/editors/matrix/MatrixVLayout.h
new file mode 100644
index 0000000..a33e0d1
--- /dev/null
+++ b/src/gui/editors/matrix/MatrixVLayout.h
@@ -0,0 +1,91 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_MATRIXVLAYOUT_H_
+#define _RG_MATRIXVLAYOUT_H_
+
+#include "base/LayoutEngine.h"
+#include "base/Event.h"
+
+
+
+
+namespace Rosegarden
+{
+
+class Staff;
+
+
+class MatrixVLayout : public VerticalLayoutEngine
+{
+public:
+ MatrixVLayout();
+
+ virtual ~MatrixVLayout();
+
+ /**
+ * Resets internal data stores for all staffs
+ */
+ virtual void reset();
+
+ /**
+ * Resets internal data stores for a specific staff
+ */
+ virtual void resetStaff(Staff &staff,
+ timeT = 0,
+ timeT = 0);
+
+ /**
+ * Precomputes layout data for a single staff, updating any
+ * internal data stores associated with that staff and updating
+ * any layout-related properties in the events on the staff's
+ * segment.
+ */
+ virtual void scanStaff(Staff &staff,
+ timeT = 0,
+ timeT = 0);
+
+ /**
+ * Computes any layout data that may depend on the results of
+ * scanning more than one staff. This may mean doing most of
+ * the layout (likely for horizontal layout) or nothing at all
+ * (likely for vertical layout).
+ */
+ virtual void finishLayout(timeT = 0,
+ timeT = 0);
+
+ static const int minMIDIPitch;
+ static const int maxMIDIPitch;
+
+protected:
+ //--------------- Data members ---------------------------------
+
+
+};
+
+
+}
+
+#endif
diff --git a/src/gui/editors/matrix/MatrixView.cpp b/src/gui/editors/matrix/MatrixView.cpp
new file mode 100644
index 0000000..38abe20
--- /dev/null
+++ b/src/gui/editors/matrix/MatrixView.cpp
@@ -0,0 +1,3076 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "MatrixView.h"
+
+#include "base/BaseProperties.h"
+#include "misc/Debug.h"
+#include "misc/Strings.h"
+#include "base/AudioLevel.h"
+#include "base/Clipboard.h"
+#include "base/Composition.h"
+#include "base/Event.h"
+#include "base/Instrument.h"
+#include "base/LayoutEngine.h"
+#include "base/MidiProgram.h"
+#include "base/NotationTypes.h"
+#include "base/Profiler.h"
+#include "base/PropertyName.h"
+#include "base/BasicQuantizer.h"
+#include "base/LegatoQuantizer.h"
+#include "base/RealTime.h"
+#include "base/RulerScale.h"
+#include "base/Segment.h"
+#include "base/Selection.h"
+#include "base/SnapGrid.h"
+#include "base/Staff.h"
+#include "base/Studio.h"
+#include "base/Track.h"
+#include "commands/edit/ChangeVelocityCommand.h"
+#include "commands/edit/ClearTriggersCommand.h"
+#include "commands/edit/CollapseNotesCommand.h"
+#include "commands/edit/CopyCommand.h"
+#include "commands/edit/CutCommand.h"
+#include "commands/edit/EraseCommand.h"
+#include "commands/edit/EventQuantizeCommand.h"
+#include "commands/edit/EventUnquantizeCommand.h"
+#include "commands/edit/PasteEventsCommand.h"
+#include "commands/edit/SelectionPropertyCommand.h"
+#include "commands/edit/SetTriggerCommand.h"
+#include "commands/matrix/MatrixInsertionCommand.h"
+#include "document/RosegardenGUIDoc.h"
+#include "document/ConfigGroups.h"
+#include "gui/application/RosegardenGUIApp.h"
+#include "gui/dialogs/EventFilterDialog.h"
+#include "gui/dialogs/EventParameterDialog.h"
+#include "gui/dialogs/QuantizeDialog.h"
+#include "gui/dialogs/TriggerSegmentDialog.h"
+#include "gui/editors/guitar/Chord.h"
+#include "gui/editors/notation/NotationElement.h"
+#include "gui/editors/notation/NotationStrings.h"
+#include "gui/editors/notation/NotePixmapFactory.h"
+#include "gui/editors/parameters/InstrumentParameterBox.h"
+#include "gui/rulers/StandardRuler.h"
+#include "gui/general/ActiveItem.h"
+#include "gui/general/EditViewBase.h"
+#include "gui/general/EditView.h"
+#include "gui/general/GUIPalette.h"
+#include "gui/general/MidiPitchLabel.h"
+#include "gui/kdeext/KTmpStatusMsg.h"
+#include "gui/rulers/ChordNameRuler.h"
+#include "gui/rulers/LoopRuler.h"
+#include "gui/rulers/PercussionPitchRuler.h"
+#include "gui/rulers/PitchRuler.h"
+#include "gui/rulers/PropertyBox.h"
+#include "gui/rulers/PropertyViewRuler.h"
+#include "gui/rulers/TempoRuler.h"
+#include "gui/studio/StudioControl.h"
+#include "gui/widgets/QDeferScrollView.h"
+#include "MatrixCanvasView.h"
+#include "MatrixElement.h"
+#include "MatrixEraser.h"
+#include "MatrixHLayout.h"
+#include "MatrixMover.h"
+#include "MatrixPainter.h"
+#include "MatrixResizer.h"
+#include "MatrixSelector.h"
+#include "MatrixStaff.h"
+#include "MatrixToolBox.h"
+#include "MatrixVLayout.h"
+#include "PianoKeyboard.h"
+#include "sound/MappedEvent.h"
+#include "sound/SequencerDataBlock.h"
+#include <klocale.h>
+#include <kstddirs.h>
+#include <kaction.h>
+#include <kcombobox.h>
+#include <kconfig.h>
+#include <kdockwidget.h>
+#include <kglobal.h>
+#include <kmessagebox.h>
+#include <kstatusbar.h>
+#include <ktoolbar.h>
+#include <kxmlguiclient.h>
+#include <qcanvas.h>
+#include <qcursor.h>
+#include <qdialog.h>
+#include <qlayout.h>
+#include <qiconset.h>
+#include <qlabel.h>
+#include <qpixmap.h>
+#include <qpoint.h>
+#include <qscrollview.h>
+#include <qsize.h>
+#include <qslider.h>
+#include <qstring.h>
+#include <qwidget.h>
+#include <qwmatrix.h>
+
+
+namespace Rosegarden
+{
+
+static double xorigin = 0.0;
+
+
+MatrixView::MatrixView(RosegardenGUIDoc *doc,
+ std::vector<Segment *> segments,
+ QWidget *parent,
+ bool drumMode)
+ : EditView(doc, segments, 3, parent, "matrixview"),
+ m_hlayout(&doc->getComposition()),
+ m_referenceRuler(new ZoomableMatrixHLayoutRulerScale(m_hlayout)),
+ m_vlayout(),
+ m_snapGrid(new SnapGrid(&m_hlayout)),
+ m_lastEndMarkerTime(0),
+ m_hoveredOverAbsoluteTime(0),
+ m_hoveredOverNoteName(0),
+ m_selectionCounter(0),
+ m_insertModeLabel(0),
+ m_haveHoveredOverNote(false),
+ m_previousEvPitch(0),
+ m_dockLeft(0),
+ m_canvasView(0),
+ m_pianoView(0),
+ m_localMapping(0),
+ m_lastNote(0),
+ m_quantizations(BasicQuantizer::getStandardQuantizations()),
+ m_chordNameRuler(0),
+ m_tempoRuler(0),
+ m_playTracking(true),
+ m_dockVisible(true),
+ m_drumMode(drumMode),
+ m_mouseInCanvasView(false)
+{
+ RG_DEBUG << "MatrixView ctor: drumMode " << drumMode << "\n";
+
+ QString pixmapDir = KGlobal::dirs()->findResource("appdata", "pixmaps/toolbar");
+ QPixmap matrixPixmap(pixmapDir + "/matrix.xpm");
+
+ m_dockLeft = createDockWidget("params dock", matrixPixmap, 0L,
+ i18n("Instrument Parameters"));
+ m_dockLeft->manualDock(m_mainDockWidget, // dock target
+ KDockWidget::DockLeft, // dock site
+ 20); // relation target/this (in percent)
+
+ connect(m_dockLeft, SIGNAL(iMBeingClosed()),
+ this, SLOT(slotParametersClosed()));
+ connect(m_dockLeft, SIGNAL(hasUndocked()),
+ this, SLOT(slotParametersClosed()));
+ // Apparently, hasUndocked() is emitted when the dock widget's
+ // 'close' button on the dock handle is clicked.
+ connect(m_mainDockWidget, SIGNAL(docking(KDockWidget*, KDockWidget::DockPosition)),
+ this, SLOT(slotParametersDockedBack(KDockWidget*, KDockWidget::DockPosition)));
+
+ Composition &comp = doc->getComposition();
+
+ m_toolBox = new MatrixToolBox(this);
+
+ initStatusBar();
+
+ connect(m_toolBox, SIGNAL(showContextHelp(const QString &)),
+ this, SLOT(slotToolHelpChanged(const QString &)));
+
+ QCanvas *tCanvas = new QCanvas(this);
+
+ m_config->setGroup(MatrixViewConfigGroup);
+ if (m_config->readBoolEntry("backgroundtextures-1.6-plus", true)) {
+ QPixmap background;
+ QString pixmapDir =
+ KGlobal::dirs()->findResource("appdata", "pixmaps/");
+ // We now use a lined background for the non-percussion matrix,
+ // suggested and supplied by Alessandro Preziosi
+ QString backgroundPixmap = isDrumMode() ? "bg-paper-white.xpm" : "bg-matrix-lines.xpm";
+ if (background.load(QString("%1/misc/%2").
+ arg(pixmapDir, backgroundPixmap))) {
+ tCanvas->setBackgroundPixmap(background);
+ }
+ }
+
+ MATRIX_DEBUG << "MatrixView : creating staff\n";
+
+ Track *track =
+ comp.getTrackById(segments[0]->getTrack());
+
+ Instrument *instr = getDocument()->getStudio().
+ getInstrumentById(track->getInstrument());
+
+ int resolution = 8;
+
+ if (isDrumMode() && instr && instr->getKeyMapping()) {
+ resolution = 11;
+ }
+
+ for (unsigned int i = 0; i < segments.size(); ++i) {
+ m_staffs.push_back(new MatrixStaff(tCanvas,
+ segments[i],
+ m_snapGrid,
+ i,
+ resolution,
+ this));
+ // staff has one too many rows to avoid a half-row at the top:
+ m_staffs[i]->setY( -resolution / 2);
+ //!!! if (isDrumMode()) m_staffs[i]->setX(resolution);
+ if (i == 0)
+ m_staffs[i]->setCurrent(true);
+ }
+
+ MATRIX_DEBUG << "MatrixView : creating canvas view\n";
+
+ const MidiKeyMapping *mapping = 0;
+
+ if (instr) {
+ mapping = instr->getKeyMapping();
+ if (mapping) {
+ RG_DEBUG << "MatrixView: Instrument has key mapping: "
+ << mapping->getName() << endl;
+ m_localMapping = new MidiKeyMapping(*mapping);
+ extendKeyMapping();
+ } else {
+ RG_DEBUG << "MatrixView: Instrument has no key mapping\n";
+ }
+ }
+
+ m_pianoView = new QDeferScrollView(getCentralWidget());
+
+ QWidget* vport = m_pianoView->viewport();
+
+ if (isDrumMode() && mapping &&
+ !m_localMapping->getMap().empty()) {
+ m_pitchRuler = new PercussionPitchRuler(vport,
+ m_localMapping,
+ resolution); // line spacing
+ } else {
+ m_pitchRuler = new PianoKeyboard(vport);
+ }
+
+ m_pianoView->setVScrollBarMode(QScrollView::AlwaysOff);
+ m_pianoView->setHScrollBarMode(QScrollView::AlwaysOff);
+ m_pianoView->addChild(m_pitchRuler);
+ m_pianoView->setFixedWidth(m_pianoView->contentsWidth());
+
+ m_grid->addWidget(m_pianoView, CANVASVIEW_ROW, 1);
+
+ m_parameterBox = new InstrumentParameterBox(getDocument(), m_dockLeft);
+ m_dockLeft->setWidget(m_parameterBox);
+
+ RosegardenGUIApp *app = RosegardenGUIApp::self();
+ connect(app,
+ SIGNAL(pluginSelected(InstrumentId, int, int)),
+ m_parameterBox,
+ SLOT(slotPluginSelected(InstrumentId, int, int)));
+ connect(app,
+ SIGNAL(pluginBypassed(InstrumentId, int, bool)),
+ m_parameterBox,
+ SLOT(slotPluginBypassed(InstrumentId, int, bool)));
+ connect(app,
+ SIGNAL(instrumentParametersChanged(InstrumentId)),
+ m_parameterBox,
+ SLOT(slotInstrumentParametersChanged(InstrumentId)));
+ connect(m_parameterBox,
+ SIGNAL(instrumentParametersChanged(InstrumentId)),
+ app,
+ SIGNAL(instrumentParametersChanged(InstrumentId)));
+ connect(m_parameterBox,
+ SIGNAL(selectPlugin(QWidget *, InstrumentId, int)),
+ app,
+ SLOT(slotShowPluginDialog(QWidget *, InstrumentId, int)));
+ connect(m_parameterBox,
+ SIGNAL(showPluginGUI(InstrumentId, int)),
+ app,
+ SLOT(slotShowPluginGUI(InstrumentId, int)));
+ connect(parent, // RosegardenGUIView
+ SIGNAL(checkTrackAssignments()),
+ this,
+ SLOT(slotCheckTrackAssignments()));
+
+ // Assign the instrument
+ //
+ m_parameterBox->useInstrument(instr);
+
+ if (m_drumMode) {
+ connect(m_parameterBox,
+ SIGNAL(instrumentPercussionSetChanged(Instrument *)),
+ this,
+ SLOT(slotPercussionSetChanged(Instrument *)));
+ }
+
+ // Set the snap grid from the stored size in the segment
+ //
+ int snapGridSize = m_staffs[0]->getSegment().getSnapGridSize();
+
+ MATRIX_DEBUG << "MatrixView : Snap Grid Size = " << snapGridSize << endl;
+
+ if (snapGridSize != -1) {
+ m_snapGrid->setSnapTime(snapGridSize);
+ } else {
+ m_config->setGroup(MatrixViewConfigGroup);
+ snapGridSize = m_config->readNumEntry
+ ("Snap Grid Size", SnapGrid::SnapToBeat);
+ m_snapGrid->setSnapTime(snapGridSize);
+ m_staffs[0]->getSegment().setSnapGridSize(snapGridSize);
+ }
+
+ m_canvasView = new MatrixCanvasView(*m_staffs[0],
+ m_snapGrid,
+ m_drumMode,
+ tCanvas,
+ getCentralWidget());
+ setCanvasView(m_canvasView);
+
+ // do this after we have a canvas
+ setupActions();
+ setupAddControlRulerMenu();
+
+ stateChanged("parametersbox_closed", KXMLGUIClient::StateReverse);
+
+ // tool bars
+ initActionsToolbar();
+ initZoomToolbar();
+
+ // Connect vertical scrollbars between matrix and piano
+ //
+ connect(m_canvasView->verticalScrollBar(), SIGNAL(valueChanged(int)),
+ this, SLOT(slotVerticalScrollPianoKeyboard(int)));
+
+ connect(m_canvasView->verticalScrollBar(), SIGNAL(sliderMoved(int)),
+ this, SLOT(slotVerticalScrollPianoKeyboard(int)));
+
+ connect(m_canvasView, SIGNAL(zoomIn()), this, SLOT(slotZoomIn()));
+ connect(m_canvasView, SIGNAL(zoomOut()), this, SLOT(slotZoomOut()));
+
+ connect(m_pianoView, SIGNAL(gotWheelEvent(QWheelEvent*)),
+ m_canvasView, SLOT(slotExternalWheelEvent(QWheelEvent*)));
+
+ // ensure the piano keyb keeps the right margins when the user toggles
+ // the canvas view rulers
+ //
+ connect(m_canvasView, SIGNAL(bottomWidgetHeightChanged(int)),
+ this, SLOT(slotCanvasBottomWidgetHeightChanged(int)));
+
+ connect(m_canvasView, SIGNAL(mouseEntered()),
+ this, SLOT(slotMouseEnteredCanvasView()));
+
+ connect(m_canvasView, SIGNAL(mouseLeft()),
+ this, SLOT(slotMouseLeftCanvasView()));
+
+ /*
+ QObject::connect
+ (getCanvasView(), SIGNAL(activeItemPressed(QMouseEvent*, QCanvasItem*)),
+ this, SLOT (activeItemPressed(QMouseEvent*, QCanvasItem*)));
+ */
+
+ QObject::connect
+ (getCanvasView(),
+ SIGNAL(mousePressed(timeT,
+ int, QMouseEvent*, MatrixElement*)),
+ this,
+ SLOT(slotMousePressed(timeT,
+ int, QMouseEvent*, MatrixElement*)));
+
+ QObject::connect
+ (getCanvasView(),
+ SIGNAL(mouseMoved(timeT, int, QMouseEvent*)),
+ this,
+ SLOT(slotMouseMoved(timeT, int, QMouseEvent*)));
+
+ QObject::connect
+ (getCanvasView(),
+ SIGNAL(mouseReleased(timeT, int, QMouseEvent*)),
+ this,
+ SLOT(slotMouseReleased(timeT, int, QMouseEvent*)));
+
+ QObject::connect
+ (getCanvasView(), SIGNAL(hoveredOverNoteChanged(int, bool, timeT)),
+ this, SLOT(slotHoveredOverNoteChanged(int, bool, timeT)));
+
+ QObject::connect
+ (m_pitchRuler, SIGNAL(hoveredOverKeyChanged(unsigned int)),
+ this, SLOT (slotHoveredOverKeyChanged(unsigned int)));
+
+ QObject::connect
+ (m_pitchRuler, SIGNAL(keyPressed(unsigned int, bool)),
+ this, SLOT (slotKeyPressed(unsigned int, bool)));
+
+ QObject::connect
+ (m_pitchRuler, SIGNAL(keySelected(unsigned int, bool)),
+ this, SLOT (slotKeySelected(unsigned int, bool)));
+
+ QObject::connect
+ (m_pitchRuler, SIGNAL(keyReleased(unsigned int, bool)),
+ this, SLOT (slotKeyReleased(unsigned int, bool)));
+
+ QObject::connect
+ (getCanvasView(), SIGNAL(hoveredOverAbsoluteTimeChanged(unsigned int)),
+ this, SLOT (slotHoveredOverAbsoluteTimeChanged(unsigned int)));
+
+ QObject::connect
+ (doc, SIGNAL(pointerPositionChanged(timeT)),
+ this, SLOT(slotSetPointerPosition(timeT)));
+
+ MATRIX_DEBUG << "MatrixView : applying layout\n";
+
+ bool layoutApplied = applyLayout();
+ if (!layoutApplied)
+ KMessageBox::sorry(0, i18n("Couldn't apply piano roll layout"));
+ else {
+ MATRIX_DEBUG << "MatrixView : rendering elements\n";
+ for (unsigned int i = 0; i < m_staffs.size(); ++i) {
+
+ m_staffs[i]->positionAllElements();
+ m_staffs[i]->getSegment().getRefreshStatus
+ (m_segmentsRefreshStatusIds[i]).setNeedsRefresh(false);
+ }
+ }
+
+ StandardRuler *topStandardRuler = new StandardRuler(getDocument(),
+ &m_hlayout, int(xorigin), 25,
+ false, getCentralWidget());
+ topStandardRuler->setSnapGrid(m_snapGrid);
+ setTopStandardRuler(topStandardRuler);
+
+ StandardRuler *bottomStandardRuler = new StandardRuler(getDocument(),
+ &m_hlayout, 0, 25,
+ true, getBottomWidget());
+ bottomStandardRuler->setSnapGrid(m_snapGrid);
+ setBottomStandardRuler(bottomStandardRuler);
+
+ topStandardRuler->connectRulerToDocPointer(doc);
+ bottomStandardRuler->connectRulerToDocPointer(doc);
+
+ // Disconnect the default connections for this signal from the
+ // top ruler, and connect our own instead
+
+ QObject::disconnect
+ (topStandardRuler->getLoopRuler(),
+ SIGNAL(setPointerPosition(timeT)), 0, 0);
+
+ QObject::connect
+ (topStandardRuler->getLoopRuler(),
+ SIGNAL(setPointerPosition(timeT)),
+ this, SLOT(slotSetInsertCursorPosition(timeT)));
+
+ QObject::connect
+ (topStandardRuler,
+ SIGNAL(dragPointerToPosition(timeT)),
+ this, SLOT(slotSetInsertCursorPosition(timeT)));
+
+ topStandardRuler->getLoopRuler()->setBackgroundColor
+ (GUIPalette::getColour(GUIPalette::InsertCursorRuler));
+
+ connect(topStandardRuler->getLoopRuler(), SIGNAL(startMouseMove(int)),
+ m_canvasView, SLOT(startAutoScroll(int)));
+ connect(topStandardRuler->getLoopRuler(), SIGNAL(stopMouseMove()),
+ m_canvasView, SLOT(stopAutoScroll()));
+
+ connect(bottomStandardRuler->getLoopRuler(), SIGNAL(startMouseMove(int)),
+ m_canvasView, SLOT(startAutoScroll(int)));
+ connect(bottomStandardRuler->getLoopRuler(), SIGNAL(stopMouseMove()),
+ m_canvasView, SLOT(stopAutoScroll()));
+ connect(m_bottomStandardRuler, SIGNAL(dragPointerToPosition(timeT)),
+ this, SLOT(slotSetPointerPosition(timeT)));
+
+ // Force height for the moment
+ //
+ m_pitchRuler->setFixedHeight(canvas()->height());
+
+
+ updateViewCaption();
+
+ // Add a velocity ruler
+ //
+ //!!! addPropertyViewRuler(BaseProperties::VELOCITY);
+
+ m_chordNameRuler = new ChordNameRuler
+ (m_referenceRuler, doc, segments, 0, 20, getCentralWidget());
+ m_chordNameRuler->setStudio(&getDocument()->getStudio());
+ addRuler(m_chordNameRuler);
+
+ m_tempoRuler = new TempoRuler
+ (m_referenceRuler, doc, this, 0, 24, false, getCentralWidget());
+ static_cast<TempoRuler *>(m_tempoRuler)->connectSignals();
+ addRuler(m_tempoRuler);
+
+ stateChanged("have_selection", KXMLGUIClient::StateReverse);
+ slotTestClipboard();
+
+ timeT start = doc->getComposition().getLoopStart();
+ timeT end = doc->getComposition().getLoopEnd();
+ m_topStandardRuler->getLoopRuler()->slotSetLoopMarker(start, end);
+ m_bottomStandardRuler->getLoopRuler()->slotSetLoopMarker(start, end);
+
+ setCurrentSelection(0, false);
+
+ // Change this if the matrix view ever has its own page
+ // in the config dialog.
+ setConfigDialogPageIndex(0);
+
+ // default zoom
+ m_config->setGroup(MatrixViewConfigGroup);
+ double zoom = m_config->readDoubleNumEntry("Zoom Level",
+ m_hZoomSlider->getCurrentSize());
+ m_hZoomSlider->setSize(zoom);
+ m_referenceRuler->setHScaleFactor(zoom);
+
+ // Scroll view to centre middle-C and warp to pointer position
+ //
+ m_canvasView->scrollBy(0, m_staffs[0]->getCanvasYForHeight(60) / 2);
+
+ slotSetPointerPosition(comp.getPosition());
+
+ // All toolbars should be created before this is called
+ setAutoSaveSettings("MatrixView", true);
+
+ readOptions();
+ setOutOfCtor();
+
+ // Property and Control Rulers
+ //
+ if (getCurrentSegment()->getViewFeatures())
+ slotShowVelocityControlRuler();
+ setupControllerTabs();
+
+ setRewFFwdToAutoRepeat();
+ slotCompositionStateUpdate();
+}
+
+MatrixView::~MatrixView()
+{
+ slotSaveOptions();
+
+ delete m_chordNameRuler;
+
+ for (unsigned int i = 0; i < m_staffs.size(); ++i) {
+ delete m_staffs[i]; // this will erase all "notes" canvas items
+ }
+
+ // This looks silly but the reason is that on destruction of the
+ // MatrixCanvasView, setCanvas() is called (this is in
+ // ~QCanvasView so we can't do anything about it). This calls
+ // QCanvasView::updateContentsSize(), which in turn updates the
+ // view's scrollbars, hence calling QScrollBar::setValue(), and
+ // sending the QSCrollbar::valueChanged() signal. But we have a
+ // slot connected to that signal
+ // (MatrixView::slotVerticalScrollPianoKeyboard), which scrolls
+ // the pianoView. However at this stage the pianoView has already
+ // been deleted, so a likely outcome is a crash.
+ //
+ // A solution is to zero out m_pianoView here, and to check if
+ // it's non null in slotVerticalScrollPianoKeyboard.
+ //
+ m_pianoView = 0;
+
+ delete m_snapGrid;
+
+ if (m_localMapping)
+ delete m_localMapping;
+}
+
+void MatrixView::slotSaveOptions()
+{
+ m_config->setGroup(MatrixViewConfigGroup);
+
+ m_config->writeEntry("Show Chord Name Ruler", getToggleAction("show_chords_ruler")->isChecked());
+ m_config->writeEntry("Show Tempo Ruler", getToggleAction("show_tempo_ruler")->isChecked());
+ m_config->writeEntry("Show Parameters", m_dockVisible);
+ //getToggleAction("m_dockLeft->isVisible());
+
+ m_config->sync();
+}
+
+void MatrixView::readOptions()
+{
+ EditView::readOptions();
+ m_config->setGroup(MatrixViewConfigGroup);
+
+ bool opt = false;
+
+ opt = m_config->readBoolEntry("Show Chord Name Ruler", false);
+ getToggleAction("show_chords_ruler")->setChecked(opt);
+ slotToggleChordsRuler();
+
+ opt = m_config->readBoolEntry("Show Tempo Ruler", true);
+ getToggleAction("show_tempo_ruler")->setChecked(opt);
+ slotToggleTempoRuler();
+
+ opt = m_config->readBoolEntry("Show Parameters", true);
+ if (!opt) {
+ m_dockLeft->undock();
+ m_dockLeft->hide();
+ stateChanged("parametersbox_closed", KXMLGUIClient::StateNoReverse);
+ m_dockVisible = false;
+ }
+
+}
+
+void MatrixView::setupActions()
+{
+ EditViewBase::setupActions("matrix.rc");
+ EditView::setupActions();
+
+ //
+ // Edition tools (eraser, selector...)
+ //
+ KRadioAction* toolAction = 0;
+
+ QString pixmapDir = KGlobal::dirs()->findResource("appdata", "pixmaps/");
+ QIconSet icon(QPixmap(pixmapDir + "/toolbar/select.xpm"));
+
+ toolAction = new KRadioAction(i18n("&Select and Edit"), icon, Key_F2,
+ this, SLOT(slotSelectSelected()),
+ actionCollection(), "select");
+ toolAction->setExclusiveGroup("tools");
+
+ toolAction = new KRadioAction(i18n("&Draw"), "pencil", Key_F3,
+ this, SLOT(slotPaintSelected()),
+ actionCollection(), "draw");
+ toolAction->setExclusiveGroup("tools");
+
+ toolAction = new KRadioAction(i18n("&Erase"), "eraser", Key_F4,
+ this, SLOT(slotEraseSelected()),
+ actionCollection(), "erase");
+ toolAction->setExclusiveGroup("tools");
+
+ toolAction = new KRadioAction(i18n("&Move"), "move", Key_F5,
+ this, SLOT(slotMoveSelected()),
+ actionCollection(), "move");
+ toolAction->setExclusiveGroup("tools");
+
+ QCanvasPixmap pixmap(pixmapDir + "/toolbar/resize.xpm");
+ icon = QIconSet(pixmap);
+ toolAction = new KRadioAction(i18n("Resi&ze"), icon, Key_F6,
+ this, SLOT(slotResizeSelected()),
+ actionCollection(), "resize");
+ toolAction->setExclusiveGroup("tools");
+
+ icon = QIconSet(NotePixmapFactory::toQPixmap(NotePixmapFactory::makeToolbarPixmap("chord")));
+ (new KToggleAction(i18n("C&hord Insert Mode"), icon, Key_H,
+ this, SLOT(slotUpdateInsertModeStatus()),
+ actionCollection(), "chord_mode"))->
+ setChecked(false);
+
+ pixmap.load(pixmapDir + "/toolbar/step_by_step.xpm");
+ icon = QIconSet(pixmap);
+ new KToggleAction(i18n("Ste&p Recording"), icon, 0, this,
+ SLOT(slotToggleStepByStep()), actionCollection(),
+ "toggle_step_by_step");
+
+ pixmap.load(pixmapDir + "/toolbar/quantize.png");
+ icon = QIconSet(pixmap);
+ new KAction(EventQuantizeCommand::getGlobalName(), icon, Key_Equal, this,
+ SLOT(slotTransformsQuantize()), actionCollection(),
+ "quantize");
+
+ new KAction(i18n("Repeat Last Quantize"), Key_Plus, this,
+ SLOT(slotTransformsRepeatQuantize()), actionCollection(),
+ "repeat_quantize");
+
+ new KAction(CollapseNotesCommand::getGlobalName(), Key_Equal + CTRL, this,
+ SLOT(slotTransformsCollapseNotes()), actionCollection(),
+ "collapse_notes");
+
+ new KAction(i18n("&Legato"), Key_Minus, this,
+ SLOT(slotTransformsLegato()), actionCollection(),
+ "legatoize");
+
+ new KAction(ChangeVelocityCommand::getGlobalName(10), 0,
+ Key_Up + SHIFT, this,
+ SLOT(slotVelocityUp()), actionCollection(),
+ "velocity_up");
+
+ new KAction(ChangeVelocityCommand::getGlobalName( -10), 0,
+ Key_Down + SHIFT, this,
+ SLOT(slotVelocityDown()), actionCollection(),
+ "velocity_down");
+
+ new KAction(i18n("Set to Current Velocity"), 0, this,
+ SLOT(slotSetVelocitiesToCurrent()), actionCollection(),
+ "set_to_current_velocity");
+
+ new KAction(i18n("Set Event &Velocities..."), 0, this,
+ SLOT(slotSetVelocities()), actionCollection(),
+ "set_velocities");
+
+ new KAction(i18n("Trigger Se&gment..."), 0, this,
+ SLOT(slotTriggerSegment()), actionCollection(),
+ "trigger_segment");
+
+ new KAction(i18n("Remove Triggers..."), 0, this,
+ SLOT(slotRemoveTriggers()), actionCollection(),
+ "remove_trigger");
+
+ new KAction(i18n("Select &All"), Key_A + CTRL, this,
+ SLOT(slotSelectAll()), actionCollection(),
+ "select_all");
+
+ new KAction(i18n("&Delete"), Key_Delete, this,
+ SLOT(slotEditDelete()), actionCollection(),
+ "delete");
+
+ new KAction(i18n("Cursor &Back"), 0, Key_Left, this,
+ SLOT(slotStepBackward()), actionCollection(),
+ "cursor_back");
+
+ new KAction(i18n("Cursor &Forward"), 0, Key_Right, this,
+ SLOT(slotStepForward()), actionCollection(),
+ "cursor_forward");
+
+ new KAction(i18n("Cursor Ba&ck Bar"), 0, Key_Left + CTRL, this,
+ SLOT(slotJumpBackward()), actionCollection(),
+ "cursor_back_bar");
+
+ new KAction(i18n("Cursor For&ward Bar"), 0, Key_Right + CTRL, this,
+ SLOT(slotJumpForward()), actionCollection(),
+ "cursor_forward_bar");
+
+ new KAction(i18n("Cursor Back and Se&lect"), SHIFT + Key_Left, this,
+ SLOT(slotExtendSelectionBackward()), actionCollection(),
+ "extend_selection_backward");
+
+ new KAction(i18n("Cursor Forward and &Select"), SHIFT + Key_Right, this,
+ SLOT(slotExtendSelectionForward()), actionCollection(),
+ "extend_selection_forward");
+
+ new KAction(i18n("Cursor Back Bar and Select"), SHIFT + CTRL + Key_Left, this,
+ SLOT(slotExtendSelectionBackwardBar()), actionCollection(),
+ "extend_selection_backward_bar");
+
+ new KAction(i18n("Cursor Forward Bar and Select"), SHIFT + CTRL + Key_Right, this,
+ SLOT(slotExtendSelectionForwardBar()), actionCollection(),
+ "extend_selection_forward_bar");
+
+ new KAction(i18n("Cursor to St&art"), 0,
+ /* #1025717: conflicting meanings for ctrl+a - dupe with Select All
+ Key_A + CTRL, */ this,
+ SLOT(slotJumpToStart()), actionCollection(),
+ "cursor_start");
+
+ new KAction(i18n("Cursor to &End"), 0, Key_E + CTRL, this,
+ SLOT(slotJumpToEnd()), actionCollection(),
+ "cursor_end");
+
+ icon = QIconSet(NotePixmapFactory::toQPixmap(NotePixmapFactory::makeToolbarPixmap
+ ("transport-cursor-to-pointer")));
+ new KAction(i18n("Cursor to &Playback Pointer"), icon, 0, this,
+ SLOT(slotJumpCursorToPlayback()), actionCollection(),
+ "cursor_to_playback_pointer");
+
+ icon = QIconSet(NotePixmapFactory::toQPixmap(NotePixmapFactory::makeToolbarPixmap
+ ("transport-play")));
+ KAction *play = new KAction(i18n("&Play"), icon, Key_Enter, this,
+ SIGNAL(play()), actionCollection(), "play");
+ // Alternative shortcut for Play
+ KShortcut playShortcut = play->shortcut();
+ playShortcut.append( KKey(Key_Return + CTRL) );
+ play->setShortcut(playShortcut);
+
+ icon = QIconSet(NotePixmapFactory::toQPixmap(NotePixmapFactory::makeToolbarPixmap
+ ("transport-stop")));
+ new KAction(i18n("&Stop"), icon, Key_Insert, this,
+ SIGNAL(stop()), actionCollection(), "stop");
+
+ icon = QIconSet(NotePixmapFactory::toQPixmap(NotePixmapFactory::makeToolbarPixmap
+ ("transport-rewind")));
+ new KAction(i18n("Re&wind"), icon, Key_End, this,
+ SIGNAL(rewindPlayback()), actionCollection(),
+ "playback_pointer_back_bar");
+
+ icon = QIconSet(NotePixmapFactory::toQPixmap(NotePixmapFactory::makeToolbarPixmap
+ ("transport-ffwd")));
+ new KAction(i18n("&Fast Forward"), icon, Key_PageDown, this,
+ SIGNAL(fastForwardPlayback()), actionCollection(),
+ "playback_pointer_forward_bar");
+
+ icon = QIconSet(NotePixmapFactory::toQPixmap(NotePixmapFactory::makeToolbarPixmap
+ ("transport-rewind-end")));
+ new KAction(i18n("Rewind to &Beginning"), icon, 0, this,
+ SIGNAL(rewindPlaybackToBeginning()), actionCollection(),
+ "playback_pointer_start");
+
+ icon = QIconSet(NotePixmapFactory::toQPixmap(NotePixmapFactory::makeToolbarPixmap
+ ("transport-ffwd-end")));
+ new KAction(i18n("Fast Forward to &End"), icon, 0, this,
+ SIGNAL(fastForwardPlaybackToEnd()), actionCollection(),
+ "playback_pointer_end");
+
+ icon = QIconSet(NotePixmapFactory::toQPixmap(NotePixmapFactory::makeToolbarPixmap
+ ("transport-pointer-to-cursor")));
+ new KAction(i18n("Playback Pointer to &Cursor"), icon, 0, this,
+ SLOT(slotJumpPlaybackToCursor()), actionCollection(),
+ "playback_pointer_to_cursor");
+
+ icon = QIconSet(NotePixmapFactory::toQPixmap(NotePixmapFactory::makeToolbarPixmap
+ ("transport-solo")));
+ new KToggleAction(i18n("&Solo"), icon, 0, this,
+ SLOT(slotToggleSolo()), actionCollection(),
+ "toggle_solo");
+
+ icon = QIconSet(NotePixmapFactory::toQPixmap(NotePixmapFactory::makeToolbarPixmap
+ ("transport-tracking")));
+ (new KToggleAction(i18n("Scro&ll to Follow Playback"), icon, Key_Pause, this,
+ SLOT(slotToggleTracking()), actionCollection(),
+ "toggle_tracking"))->setChecked(m_playTracking);
+
+ icon = QIconSet(NotePixmapFactory::toQPixmap(NotePixmapFactory::makeToolbarPixmap
+ ("transport-panic")));
+ new KAction(i18n("Panic"), icon, Key_P + CTRL + ALT, this,
+ SIGNAL(panic()), actionCollection(), "panic");
+
+ new KAction(i18n("Set Loop to Selection"), Key_Semicolon + CTRL, this,
+ SLOT(slotPreviewSelection()), actionCollection(),
+ "preview_selection");
+
+ new KAction(i18n("Clear L&oop"), Key_Colon + CTRL, this,
+ SLOT(slotClearLoop()), actionCollection(),
+ "clear_loop");
+
+ new KAction(i18n("Clear Selection"), Key_Escape, this,
+ SLOT(slotClearSelection()), actionCollection(),
+ "clear_selection");
+
+ // icon = QIconSet(QCanvasPixmap(pixmapDir + "/toolbar/eventfilter.xpm"));
+ new KAction(i18n("&Filter Selection"), "filter", Key_F + CTRL, this,
+ SLOT(slotFilterSelection()), actionCollection(),
+ "filter_selection");
+
+ timeT crotchetDuration = Note(Note::Crotchet).getDuration();
+ m_snapValues.push_back(SnapGrid::NoSnap);
+ m_snapValues.push_back(SnapGrid::SnapToUnit);
+ m_snapValues.push_back(crotchetDuration / 16);
+ m_snapValues.push_back(crotchetDuration / 12);
+ m_snapValues.push_back(crotchetDuration / 8);
+ m_snapValues.push_back(crotchetDuration / 6);
+ m_snapValues.push_back(crotchetDuration / 4);
+ m_snapValues.push_back(crotchetDuration / 3);
+ m_snapValues.push_back(crotchetDuration / 2);
+ m_snapValues.push_back(crotchetDuration);
+ m_snapValues.push_back((crotchetDuration * 3) / 2);
+ m_snapValues.push_back(crotchetDuration * 2);
+ m_snapValues.push_back(SnapGrid::SnapToBeat);
+ m_snapValues.push_back(SnapGrid::SnapToBar);
+
+ for (unsigned int i = 0; i < m_snapValues.size(); i++) {
+
+ timeT d = m_snapValues[i];
+
+ if (d == SnapGrid::NoSnap) {
+ new KAction(i18n("&No Snap"), 0, this,
+ SLOT(slotSetSnapFromAction()),
+ actionCollection(), "snap_none");
+ } else if (d == SnapGrid::SnapToUnit) {
+ } else if (d == SnapGrid::SnapToBeat) {
+ new KAction(i18n("Snap to Bea&t"), Key_1, this,
+ SLOT(slotSetSnapFromAction()),
+ actionCollection(), "snap_beat");
+ } else if (d == SnapGrid::SnapToBar) {
+ new KAction(i18n("Snap to &Bar"), Key_5, this,
+ SLOT(slotSetSnapFromAction()),
+ actionCollection(), "snap_bar");
+ } else {
+
+ timeT err = 0;
+ QString label = NotationStrings::makeNoteMenuLabel(d, true, err);
+ QPixmap pixmap = NotePixmapFactory::toQPixmap
+ (NotePixmapFactory::makeNoteMenuPixmap(d, err));
+
+ KShortcut cut = 0;
+ if (d == crotchetDuration / 16) cut = Key_0;
+ else if (d == crotchetDuration / 8) cut = Key_3;
+ else if (d == crotchetDuration / 4) cut = Key_6;
+ else if (d == crotchetDuration / 2) cut = Key_8;
+ else if (d == crotchetDuration) cut = Key_4;
+ else if (d == crotchetDuration * 2) cut = Key_2;
+
+ QString actionName = QString("snap_%1").arg(int((crotchetDuration * 4) / d));
+ if (d == (crotchetDuration * 3) / 2) actionName = "snap_3";
+ new KAction(i18n("Snap to %1").arg(label), pixmap, cut, this,
+ SLOT(slotSetSnapFromAction()), actionCollection(),
+ actionName);
+ }
+ }
+
+ //
+ // Settings menu
+ //
+ new KAction(i18n("Show Instrument Parameters"), 0, this,
+ SLOT(slotDockParametersBack()),
+ actionCollection(),
+ "show_inst_parameters");
+
+ new KToggleAction(i18n("Show Ch&ord Name Ruler"), 0, this,
+ SLOT(slotToggleChordsRuler()),
+ actionCollection(), "show_chords_ruler");
+
+ new KToggleAction(i18n("Show &Tempo Ruler"), 0, this,
+ SLOT(slotToggleTempoRuler()),
+ actionCollection(), "show_tempo_ruler");
+
+ createGUI(getRCFileName(), false);
+
+ if (getSegmentsOnlyRestsAndClefs())
+ actionCollection()->action("draw")->activate();
+ else
+ actionCollection()->action("select")->activate();
+}
+
+bool
+MatrixView::isInChordMode()
+{
+ return ((KToggleAction *)actionCollection()->action("chord_mode"))->
+ isChecked();
+}
+
+void MatrixView::slotDockParametersBack()
+{
+ m_dockLeft->dockBack();
+}
+
+void MatrixView::slotParametersClosed()
+{
+ stateChanged("parametersbox_closed");
+ m_dockVisible = false;
+}
+
+void MatrixView::slotParametersDockedBack(KDockWidget* dw, KDockWidget::DockPosition)
+{
+ if (dw == m_dockLeft) {
+ stateChanged("parametersbox_closed", KXMLGUIClient::StateReverse);
+ m_dockVisible = true;
+ }
+}
+
+void MatrixView::slotCheckTrackAssignments()
+{
+ Track *track =
+ m_staffs[0]->getSegment().getComposition()->
+ getTrackById(m_staffs[0]->getSegment().getTrack());
+
+ Instrument *instr = getDocument()->getStudio().
+ getInstrumentById(track->getInstrument());
+
+ m_parameterBox->useInstrument(instr);
+}
+
+void MatrixView::initStatusBar()
+{
+ KStatusBar* sb = statusBar();
+
+ m_hoveredOverAbsoluteTime = new QLabel(sb);
+ m_hoveredOverNoteName = new QLabel(sb);
+
+ m_hoveredOverAbsoluteTime->setMinimumWidth(175);
+ m_hoveredOverNoteName->setMinimumWidth(65);
+
+ sb->addWidget(m_hoveredOverAbsoluteTime);
+ sb->addWidget(m_hoveredOverNoteName);
+
+ m_insertModeLabel = new QLabel(sb);
+ m_insertModeLabel->setMinimumWidth(20);
+ sb->addWidget(m_insertModeLabel);
+
+ sb->insertItem(KTmpStatusMsg::getDefaultMsg(),
+ KTmpStatusMsg::getDefaultId(), 1);
+ sb->setItemAlignment(KTmpStatusMsg::getDefaultId(),
+ AlignLeft | AlignVCenter);
+
+ m_selectionCounter = new QLabel(sb);
+ sb->addWidget(m_selectionCounter);
+}
+
+void MatrixView::slotToolHelpChanged(const QString &s)
+{
+ QString msg = " " + s;
+ if (m_toolContextHelp == msg) return;
+ m_toolContextHelp = msg;
+
+ m_config->setGroup(GeneralOptionsConfigGroup);
+ if (!m_config->readBoolEntry("toolcontexthelp", true)) return;
+
+ if (m_mouseInCanvasView) statusBar()->changeItem(m_toolContextHelp, 1);
+}
+
+void MatrixView::slotMouseEnteredCanvasView()
+{
+ m_config->setGroup(GeneralOptionsConfigGroup);
+ if (!m_config->readBoolEntry("toolcontexthelp", true)) return;
+
+ m_mouseInCanvasView = true;
+ statusBar()->changeItem(m_toolContextHelp, 1);
+}
+
+void MatrixView::slotMouseLeftCanvasView()
+{
+ m_mouseInCanvasView = false;
+ statusBar()->changeItem(KTmpStatusMsg::getDefaultMsg(), 1);
+}
+
+bool MatrixView::applyLayout(int staffNo,
+ timeT startTime,
+ timeT endTime)
+{
+ Profiler profiler("MatrixView::applyLayout", true);
+
+ m_hlayout.reset();
+ m_vlayout.reset();
+
+ for (unsigned int i = 0; i < m_staffs.size(); ++i) {
+
+ if (staffNo >= 0 && (int)i != staffNo)
+ continue;
+
+ m_hlayout.scanStaff(*m_staffs[i], startTime, endTime);
+ m_vlayout.scanStaff(*m_staffs[i], startTime, endTime);
+ }
+
+ m_hlayout.finishLayout();
+ m_vlayout.finishLayout();
+
+ if (m_staffs[0]->getSegment().getEndMarkerTime() != m_lastEndMarkerTime ||
+ m_lastEndMarkerTime == 0 ||
+ isCompositionModified()) {
+ readjustCanvasSize();
+ m_lastEndMarkerTime = m_staffs[0]->getSegment().getEndMarkerTime();
+ }
+
+ return true;
+}
+
+void MatrixView::refreshSegment(Segment *segment,
+ timeT startTime, timeT endTime)
+{
+ Profiler profiler("MatrixView::refreshSegment", true);
+
+ MATRIX_DEBUG << "MatrixView::refreshSegment(" << startTime
+ << ", " << endTime << ")\n";
+
+ applyLayout( -1, startTime, endTime);
+
+ if (!segment)
+ segment = m_segments[0];
+
+ if (endTime == 0)
+ endTime = segment->getEndTime();
+ else if (startTime == endTime) {
+ startTime = segment->getStartTime();
+ endTime = segment->getEndTime();
+ }
+
+ m_staffs[0]->positionElements(startTime, endTime);
+ repaintRulers();
+}
+
+QSize MatrixView::getViewSize()
+{
+ return canvas()->size();
+}
+
+void MatrixView::setViewSize(QSize s)
+{
+ MATRIX_DEBUG << "MatrixView::setViewSize() w = " << s.width() << endl;
+
+ canvas()->resize(getXbyInverseWorldMatrix(s.width()), s.height());
+ getCanvasView()->resizeContents(s.width(), s.height());
+
+ MATRIX_DEBUG << "MatrixView::setViewSize() contentsWidth = " << getCanvasView()->contentsWidth() << endl;
+}
+
+void MatrixView::repaintRulers()
+{
+ for (unsigned int i = 0; i != m_propertyViewRulers.size(); i++)
+ m_propertyViewRulers[i].first->repaint();
+}
+
+void MatrixView::updateView()
+{
+ canvas()->update();
+}
+
+void MatrixView::setCurrentSelection(EventSelection* s, bool preview,
+ bool redrawNow)
+{
+ //!!! rather too much here shared with notationview -- could much of
+ // this be in editview?
+
+ if (m_currentEventSelection == s) {
+ updateQuantizeCombo();
+ return ;
+ }
+
+ if (m_currentEventSelection) {
+ getStaff(0)->positionElements(m_currentEventSelection->getStartTime(),
+ m_currentEventSelection->getEndTime());
+ }
+
+ EventSelection *oldSelection = m_currentEventSelection;
+ m_currentEventSelection = s;
+
+ timeT startA, endA, startB, endB;
+
+ if (oldSelection) {
+ startA = oldSelection->getStartTime();
+ endA = oldSelection->getEndTime();
+ startB = s ? s->getStartTime() : startA;
+ endB = s ? s->getEndTime() : endA;
+ } else {
+ // we know they can't both be null -- first thing we tested above
+ startA = startB = s->getStartTime();
+ endA = endB = s->getEndTime();
+ }
+
+ // refreshSegment takes start==end to mean refresh everything
+ if (startA == endA)
+ ++endA;
+ if (startB == endB)
+ ++endB;
+
+ bool updateRequired = true;
+
+ if (s) {
+
+ bool foundNewEvent = false;
+
+ for (EventSelection::eventcontainer::iterator i =
+ s->getSegmentEvents().begin();
+ i != s->getSegmentEvents().end(); ++i) {
+
+ if (oldSelection && oldSelection->getSegment() == s->getSegment()
+ && oldSelection->contains(*i))
+ continue;
+
+ foundNewEvent = true;
+
+ if (preview) {
+ long pitch;
+ if ((*i)->get<Int>(BaseProperties::PITCH, pitch)) {
+ long velocity = -1;
+ (void)((*i)->get<Int>(BaseProperties::VELOCITY, velocity));
+ if (!((*i)->has(BaseProperties::TIED_BACKWARD) &&
+ (*i)->get<Bool>(BaseProperties::TIED_BACKWARD)))
+ playNote(s->getSegment(), pitch, velocity);
+ }
+ }
+ }
+
+ if (!foundNewEvent) {
+ if (oldSelection &&
+ oldSelection->getSegment() == s->getSegment() &&
+ oldSelection->getSegmentEvents().size() ==
+ s->getSegmentEvents().size())
+ updateRequired = false;
+ }
+ }
+
+ if (updateRequired) {
+
+ if ((endA >= startB && endB >= startA) &&
+ (!s || !oldSelection ||
+ oldSelection->getSegment() == s->getSegment())) {
+
+ Segment &segment(s ? s->getSegment() :
+ oldSelection->getSegment());
+
+ if (redrawNow) {
+ // recolour the events now
+ getStaff(segment)->positionElements(std::min(startA, startB),
+ std::max(endA, endB));
+ } else {
+ // mark refresh status and then request a repaint
+ segment.getRefreshStatus
+ (m_segmentsRefreshStatusIds
+ [getStaff(segment)->getId()]).
+ push(std::min(startA, startB), std::max(endA, endB));
+ }
+
+ } else {
+ // do two refreshes, one for each -- here we know neither is null
+
+ if (redrawNow) {
+ // recolour the events now
+ getStaff(oldSelection->getSegment())->positionElements(startA,
+ endA);
+
+ getStaff(s->getSegment())->positionElements(startB, endB);
+ } else {
+ // mark refresh status and then request a repaint
+
+ oldSelection->getSegment().getRefreshStatus
+ (m_segmentsRefreshStatusIds
+ [getStaff(oldSelection->getSegment())->getId()]).
+ push(startA, endA);
+
+ s->getSegment().getRefreshStatus
+ (m_segmentsRefreshStatusIds
+ [getStaff(s->getSegment())->getId()]).
+ push(startB, endB);
+ }
+ }
+ }
+
+ delete oldSelection;
+
+ if (s) {
+
+ int eventsSelected = s->getSegmentEvents().size();
+ m_selectionCounter->setText
+ (i18n(" 1 event selected ",
+ " %n events selected ", eventsSelected));
+
+ } else {
+ m_selectionCounter->setText(i18n(" No selection "));
+ }
+
+ m_selectionCounter->update();
+
+ slotSetCurrentVelocityFromSelection();
+
+ // Clear states first, then enter only those ones that apply
+ // (so as to avoid ever clearing one after entering another, in
+ // case the two overlap at all)
+ stateChanged("have_selection", KXMLGUIClient::StateReverse);
+ stateChanged("have_notes_in_selection", KXMLGUIClient::StateReverse);
+ stateChanged("have_rests_in_selection", KXMLGUIClient::StateReverse);
+
+ if (s) {
+ stateChanged("have_selection", KXMLGUIClient::StateNoReverse);
+ if (s->contains(Note::EventType)) {
+ stateChanged("have_notes_in_selection",
+ KXMLGUIClient::StateNoReverse);
+ }
+ if (s->contains(Note::EventRestType)) {
+ stateChanged("have_rests_in_selection",
+ KXMLGUIClient::StateNoReverse);
+ }
+ }
+
+ updateQuantizeCombo();
+
+ if (redrawNow)
+ updateView();
+ else
+ update();
+}
+
+void MatrixView::updateQuantizeCombo()
+{
+ timeT unit = 0;
+
+ if (m_currentEventSelection) {
+ unit =
+ BasicQuantizer::getStandardQuantization
+ (m_currentEventSelection);
+ } else {
+ unit =
+ BasicQuantizer::getStandardQuantization
+ (&(m_staffs[0]->getSegment()));
+ }
+
+ for (unsigned int i = 0; i < m_quantizations.size(); ++i) {
+ if (unit == m_quantizations[i]) {
+ m_quantizeCombo->setCurrentItem(i);
+ return ;
+ }
+ }
+
+ m_quantizeCombo->setCurrentItem(m_quantizeCombo->count() - 1); // "Off"
+}
+
+void MatrixView::slotPaintSelected()
+{
+ EditTool* painter = m_toolBox->getTool(MatrixPainter::ToolName);
+
+ setTool(painter);
+}
+
+void MatrixView::slotEraseSelected()
+{
+ EditTool* eraser = m_toolBox->getTool(MatrixEraser::ToolName);
+
+ setTool(eraser);
+}
+
+void MatrixView::slotSelectSelected()
+{
+ EditTool* selector = m_toolBox->getTool(MatrixSelector::ToolName);
+
+ connect(selector, SIGNAL(gotSelection()),
+ this, SLOT(slotNewSelection()));
+
+ connect(selector, SIGNAL(editTriggerSegment(int)),
+ this, SIGNAL(editTriggerSegment(int)));
+
+ setTool(selector);
+}
+
+void MatrixView::slotMoveSelected()
+{
+ EditTool* mover = m_toolBox->getTool(MatrixMover::ToolName);
+
+ setTool(mover);
+}
+
+void MatrixView::slotResizeSelected()
+{
+ EditTool* resizer = m_toolBox->getTool(MatrixResizer::ToolName);
+
+ setTool(resizer);
+}
+
+void MatrixView::slotTransformsQuantize()
+{
+ if (!m_currentEventSelection)
+ return ;
+
+ QuantizeDialog dialog(this);
+
+ if (dialog.exec() == QDialog::Accepted) {
+ KTmpStatusMsg msg(i18n("Quantizing..."), this);
+ addCommandToHistory(new EventQuantizeCommand
+ (*m_currentEventSelection,
+ dialog.getQuantizer()));
+ }
+}
+
+void MatrixView::slotTransformsRepeatQuantize()
+{
+ if (!m_currentEventSelection)
+ return ;
+
+ KTmpStatusMsg msg(i18n("Quantizing..."), this);
+ addCommandToHistory(new EventQuantizeCommand
+ (*m_currentEventSelection,
+ "Quantize Dialog Grid", false)); // no i18n (config group name)
+}
+
+void MatrixView::slotTransformsCollapseNotes()
+{
+ if (!m_currentEventSelection)
+ return ;
+ KTmpStatusMsg msg(i18n("Collapsing notes..."), this);
+
+ addCommandToHistory(new CollapseNotesCommand
+ (*m_currentEventSelection));
+}
+
+void MatrixView::slotTransformsLegato()
+{
+ if (!m_currentEventSelection)
+ return ;
+
+ KTmpStatusMsg msg(i18n("Making legato..."), this);
+ addCommandToHistory(new EventQuantizeCommand
+ (*m_currentEventSelection,
+ new LegatoQuantizer(0))); // no quantization
+}
+
+void MatrixView::slotMousePressed(timeT time, int pitch,
+ QMouseEvent* e, MatrixElement* el)
+{
+ MATRIX_DEBUG << "MatrixView::mousePressed at pitch "
+ << pitch << ", time " << time << endl;
+
+ // Don't allow moving/insertion before the beginning of the
+ // segment
+ timeT curSegmentStartTime = getCurrentSegment()->getStartTime();
+ if (curSegmentStartTime > time)
+ time = curSegmentStartTime;
+
+ m_tool->handleMousePress(time, pitch, 0, e, el);
+
+ if (e->button() != RightButton) {
+ getCanvasView()->startAutoScroll();
+ }
+
+ // play a preview
+ //playPreview(pitch);
+}
+
+void MatrixView::slotMouseMoved(timeT time, int pitch, QMouseEvent* e)
+{
+ // Don't allow moving/insertion before the beginning of the
+ // segment
+ timeT curSegmentStartTime = getCurrentSegment()->getStartTime();
+ if (curSegmentStartTime > time)
+ time = curSegmentStartTime;
+
+ if (activeItem()) {
+ activeItem()->handleMouseMove(e);
+ updateView();
+ } else {
+ int follow = m_tool->handleMouseMove(time, pitch, e);
+ getCanvasView()->setScrollDirectionConstraint(follow);
+
+ // if (follow != RosegardenCanvasView::NoFollow) {
+ // getCanvasView()->doAutoScroll();
+ // }
+
+ // play a preview
+ if (pitch != m_previousEvPitch) {
+ //playPreview(pitch);
+ m_previousEvPitch = pitch;
+ }
+ }
+
+}
+
+void MatrixView::slotMouseReleased(timeT time, int pitch, QMouseEvent* e)
+{
+ // Don't allow moving/insertion before the beginning of the
+ // segment
+ timeT curSegmentStartTime = getCurrentSegment()->getStartTime();
+ if (curSegmentStartTime > time)
+ time = curSegmentStartTime;
+
+ if (activeItem()) {
+ activeItem()->handleMouseRelease(e);
+ setActiveItem(0);
+ updateView();
+ }
+
+ // send the real event time now (not adjusted for beginning of bar)
+ m_tool->handleMouseRelease(time, pitch, e);
+ m_previousEvPitch = 0;
+ getCanvasView()->stopAutoScroll();
+}
+
+void
+MatrixView::slotHoveredOverNoteChanged(int evPitch,
+ bool haveEvent,
+ timeT evTime)
+{
+ MidiPitchLabel label(evPitch);
+
+ if (haveEvent) {
+
+ m_haveHoveredOverNote = true;
+
+ int bar, beat, fraction, remainder;
+ getDocument()->getComposition().getMusicalTimeForAbsoluteTime
+ (evTime, bar, beat, fraction, remainder);
+
+ RealTime rt =
+ getDocument()->getComposition().getElapsedRealTime(evTime);
+ long ms = rt.msec();
+
+ QString msg = i18n("Note: %1 (%2.%3s)")
+ .arg(QString("%1-%2-%3-%4")
+ .arg(QString("%1").arg(bar + 1).rightJustify(3, '0'))
+ .arg(QString("%1").arg(beat).rightJustify(2, '0'))
+ .arg(QString("%1").arg(fraction).rightJustify(2, '0'))
+ .arg(QString("%1").arg(remainder).rightJustify(2, '0')))
+ .arg(rt.sec)
+ .arg(QString("%1").arg(ms).rightJustify(3, '0'));
+
+ m_hoveredOverAbsoluteTime->setText(msg);
+ }
+
+ m_haveHoveredOverNote = false;
+
+ m_hoveredOverNoteName->setText(i18n("%1 (%2)")
+ .arg(label.getQString())
+ .arg(evPitch));
+
+ m_pitchRuler->drawHoverNote(evPitch);
+}
+
+void
+MatrixView::slotHoveredOverKeyChanged(unsigned int y)
+{
+ MatrixStaff& staff = *(m_staffs[0]);
+
+ int evPitch = staff.getHeightAtCanvasCoords( -1, y);
+
+ if (evPitch != m_previousEvPitch) {
+ MidiPitchLabel label(evPitch);
+ m_hoveredOverNoteName->setText(QString("%1 (%2)").
+ arg(label.getQString()).arg(evPitch));
+ m_previousEvPitch = evPitch;
+ }
+}
+
+void
+MatrixView::slotHoveredOverAbsoluteTimeChanged(unsigned int time)
+{
+ if (m_haveHoveredOverNote) return;
+
+ timeT t = time;
+
+ int bar, beat, fraction, remainder;
+ getDocument()->getComposition().getMusicalTimeForAbsoluteTime
+ (t, bar, beat, fraction, remainder);
+
+ RealTime rt =
+ getDocument()->getComposition().getElapsedRealTime(t);
+ long ms = rt.msec();
+
+ // At the advice of doc.trolltech.com/3.0/qstring.html#sprintf
+ // we replaced this QString format("%ld (%ld.%03lds)");
+ // to support Unicode
+
+ QString message = i18n("Time: %1 (%2.%3s)")
+ .arg(QString("%1-%2-%3-%4")
+ .arg(QString("%1").arg(bar + 1).rightJustify(3, '0'))
+ .arg(QString("%1").arg(beat).rightJustify(2, '0'))
+ .arg(QString("%1").arg(fraction).rightJustify(2, '0'))
+ .arg(QString("%1").arg(remainder).rightJustify(2, '0')))
+ .arg(rt.sec)
+ .arg(QString("%1").arg(ms).rightJustify(3, '0'));
+
+ m_hoveredOverAbsoluteTime->setText(message);
+}
+
+void
+MatrixView::slotSetPointerPosition(timeT time)
+{
+ slotSetPointerPosition(time, m_playTracking);
+}
+
+void
+MatrixView::slotSetPointerPosition(timeT time, bool scroll)
+{
+ Composition &comp = getDocument()->getComposition();
+ int barNo = comp.getBarNumber(time);
+
+ if (barNo >= m_hlayout.getLastVisibleBarOnStaff(*m_staffs[0])) {
+
+ Segment &seg = m_staffs[0]->getSegment();
+
+ if (seg.isRepeating() && time < seg.getRepeatEndTime()) {
+ time =
+ seg.getStartTime() +
+ ((time - seg.getStartTime()) %
+ (seg.getEndMarkerTime() - seg.getStartTime()));
+ m_staffs[0]->setPointerPosition(m_hlayout, time);
+ } else {
+ m_staffs[0]->hidePointer();
+ scroll = false;
+ }
+ } else if (barNo < m_hlayout.getFirstVisibleBarOnStaff(*m_staffs[0])) {
+ m_staffs[0]->hidePointer();
+ scroll = false;
+ } else {
+ m_staffs[0]->setPointerPosition(m_hlayout, time);
+ }
+
+ if (scroll && !getCanvasView()->isAutoScrolling())
+ getCanvasView()->slotScrollHoriz(static_cast<int>(getXbyWorldMatrix(m_hlayout.getXForTime(time))));
+
+ updateView();
+}
+
+void
+MatrixView::slotSetInsertCursorPosition(timeT time, bool scroll)
+{
+ //!!! For now. Probably unlike slotSetPointerPosition this one
+ // should snap to the nearest event or grid line.
+
+ m_staffs[0]->setInsertCursorPosition(m_hlayout, time);
+
+ if (scroll && !getCanvasView()->isAutoScrolling()) {
+ getCanvasView()->slotScrollHoriz
+ (static_cast<int>(getXbyWorldMatrix(m_hlayout.getXForTime(time))));
+ }
+
+ updateView();
+}
+
+void MatrixView::slotEditCut()
+{
+ MATRIX_DEBUG << "MatrixView::slotEditCut()\n";
+
+ if (!m_currentEventSelection)
+ return ;
+ KTmpStatusMsg msg(i18n("Cutting selection to clipboard..."), this);
+
+ addCommandToHistory(new CutCommand(*m_currentEventSelection,
+ getDocument()->getClipboard()));
+}
+
+void MatrixView::slotEditCopy()
+{
+ if (!m_currentEventSelection)
+ return ;
+ KTmpStatusMsg msg(i18n("Copying selection to clipboard..."), this);
+
+ addCommandToHistory(new CopyCommand(*m_currentEventSelection,
+ getDocument()->getClipboard()));
+
+ emit usedSelection();
+}
+
+void MatrixView::slotEditPaste()
+{
+ if (getDocument()->getClipboard()->isEmpty()) {
+ slotStatusHelpMsg(i18n("Clipboard is empty"));
+ return ;
+ }
+
+ KTmpStatusMsg msg(i18n("Inserting clipboard contents..."), this);
+
+ PasteEventsCommand *command = new PasteEventsCommand
+ (m_staffs[0]->getSegment(), getDocument()->getClipboard(),
+ getInsertionTime(), PasteEventsCommand::MatrixOverlay);
+
+ if (!command->isPossible()) {
+ slotStatusHelpMsg(i18n("Couldn't paste at this point"));
+ } else {
+ addCommandToHistory(command);
+ setCurrentSelection(new EventSelection(command->getPastedEvents()));
+ }
+}
+
+void MatrixView::slotEditDelete()
+{
+ if (!m_currentEventSelection)
+ return ;
+ KTmpStatusMsg msg(i18n("Deleting selection..."), this);
+
+ addCommandToHistory(new EraseCommand(*m_currentEventSelection));
+
+ // clear and clear
+ setCurrentSelection(0, false);
+}
+
+void MatrixView::slotKeyPressed(unsigned int y, bool repeating)
+{
+ slotHoveredOverKeyChanged(y);
+
+ getCanvasView()->slotScrollVertSmallSteps(y);
+
+ Composition &comp = getDocument()->getComposition();
+ Studio &studio = getDocument()->getStudio();
+
+ MatrixStaff& staff = *(m_staffs[0]);
+ MidiByte evPitch = staff.getHeightAtCanvasCoords( -1, y);
+
+ // Don't do anything if we're part of a run up the keyboard
+ // and the pitch hasn't changed
+ //
+ if (m_lastNote == evPitch && repeating)
+ return ;
+
+ // Save value
+ m_lastNote = evPitch;
+ if (!repeating)
+ m_firstNote = evPitch;
+
+ Track *track = comp.getTrackById(
+ staff.getSegment().getTrack());
+
+ Instrument *ins =
+ studio.getInstrumentById(track->getInstrument());
+
+ // check for null instrument
+ //
+ if (ins == 0)
+ return ;
+
+ MappedEvent mE(ins->getId(),
+ MappedEvent::MidiNote,
+ evPitch + staff.getSegment().getTranspose(),
+ MidiMaxValue,
+ RealTime::zeroTime,
+ RealTime::zeroTime,
+ RealTime::zeroTime);
+ StudioControl::sendMappedEvent(mE);
+
+}
+
+void MatrixView::slotKeySelected(unsigned int y, bool repeating)
+{
+ slotHoveredOverKeyChanged(y);
+
+ getCanvasView()->slotScrollVertSmallSteps(y);
+
+ MatrixStaff& staff = *(m_staffs[0]);
+ Segment &segment(staff.getSegment());
+ MidiByte evPitch = staff.getHeightAtCanvasCoords( -1, y);
+
+ // Don't do anything if we're part of a run up the keyboard
+ // and the pitch hasn't changed
+ //
+ if (m_lastNote == evPitch && repeating)
+ return ;
+
+ // Save value
+ m_lastNote = evPitch;
+ if (!repeating)
+ m_firstNote = evPitch;
+
+ EventSelection *s = new EventSelection(segment);
+
+ for (Segment::iterator i = segment.begin();
+ segment.isBeforeEndMarker(i); ++i) {
+
+ if ((*i)->isa(Note::EventType) &&
+ (*i)->has(BaseProperties::PITCH)) {
+
+ MidiByte p = (*i)->get
+ <Int>
+ (BaseProperties::PITCH);
+ if (p >= std::min(m_firstNote, evPitch) &&
+ p <= std::max(m_firstNote, evPitch)) {
+ s->addEvent(*i);
+ }
+ }
+ }
+
+ if (m_currentEventSelection) {
+ // allow addFromSelection to deal with eliminating duplicates
+ s->addFromSelection(m_currentEventSelection);
+ }
+
+ setCurrentSelection(s, false);
+
+ // now play the note as well
+
+ Composition &comp = getDocument()->getComposition();
+ Studio &studio = getDocument()->getStudio();
+ Track *track = comp.getTrackById(segment.getTrack());
+ Instrument *ins =
+ studio.getInstrumentById(track->getInstrument());
+
+ // check for null instrument
+ //
+ if (ins == 0)
+ return ;
+
+ MappedEvent mE(ins->getId(),
+ MappedEvent::MidiNoteOneShot,
+ evPitch + segment.getTranspose(),
+ MidiMaxValue,
+ RealTime::zeroTime,
+ RealTime(0, 250000000),
+ RealTime::zeroTime);
+ StudioControl::sendMappedEvent(mE);
+}
+
+void MatrixView::slotKeyReleased(unsigned int y, bool repeating)
+{
+ MatrixStaff& staff = *(m_staffs[0]);
+ int evPitch = staff.getHeightAtCanvasCoords(-1, y);
+
+ if (m_lastNote == evPitch && repeating)
+ return;
+
+ Rosegarden::Segment &segment(staff.getSegment());
+
+ // send note off (note on at zero velocity)
+
+ Rosegarden::Composition &comp = getDocument()->getComposition();
+ Rosegarden::Studio &studio = getDocument()->getStudio();
+ Rosegarden::Track *track = comp.getTrackById(segment.getTrack());
+ Rosegarden::Instrument *ins =
+ studio.getInstrumentById(track->getInstrument());
+
+ // check for null instrument
+ //
+ if (ins == 0)
+ return;
+
+ evPitch = evPitch + segment.getTranspose();
+ if (evPitch < 0 || evPitch > 127) return;
+
+ Rosegarden::MappedEvent mE(ins->getId(),
+ Rosegarden::MappedEvent::MidiNote,
+ evPitch,
+ 0,
+ Rosegarden::RealTime::zeroTime,
+ Rosegarden::RealTime::zeroTime,
+ Rosegarden::RealTime::zeroTime);
+ Rosegarden::StudioControl::sendMappedEvent(mE);
+}
+
+void MatrixView::slotVerticalScrollPianoKeyboard(int y)
+{
+ if (m_pianoView) // check that the piano view still exists (see dtor)
+ m_pianoView->setContentsPos(0, y);
+}
+
+void MatrixView::slotInsertNoteFromAction()
+{
+ const QObject *s = sender();
+ QString name = s->name();
+
+ Segment &segment = *getCurrentSegment();
+ int pitch = 0;
+
+ Accidental accidental =
+ Accidentals::NoAccidental;
+
+ timeT time(getInsertionTime());
+ ::Rosegarden::Key key = segment.getKeyAtTime(time);
+ Clef clef = segment.getClefAtTime(time);
+
+ try {
+
+ pitch = getPitchFromNoteInsertAction(name, accidental, clef, key);
+
+ } catch (...) {
+
+ KMessageBox::sorry
+ (this, i18n("Unknown note insert action %1").arg(name));
+ return ;
+ }
+
+ KTmpStatusMsg msg(i18n("Inserting note"), this);
+
+ MATRIX_DEBUG << "Inserting note at pitch " << pitch << endl;
+
+ Event modelEvent(Note::EventType, 0, 1);
+ modelEvent.set<Int>(BaseProperties::PITCH, pitch);
+ modelEvent.set<String>(BaseProperties::ACCIDENTAL, accidental);
+ timeT endTime(time + m_snapGrid->getSnapTime(time));
+
+ MatrixInsertionCommand* command =
+ new MatrixInsertionCommand(segment, time, endTime, &modelEvent);
+
+ addCommandToHistory(command);
+
+ if (!isInChordMode()) {
+ slotSetInsertCursorPosition(endTime);
+ }
+}
+
+void MatrixView::closeWindow()
+{
+ delete this;
+}
+
+bool MatrixView::canPreviewAnotherNote()
+{
+ static time_t lastCutOff = 0;
+ static int sinceLastCutOff = 0;
+
+ time_t now = time(0);
+ ++sinceLastCutOff;
+
+ if ((now - lastCutOff) > 0) {
+ sinceLastCutOff = 0;
+ lastCutOff = now;
+ } else {
+ if (sinceLastCutOff >= 20) {
+ // don't permit more than 20 notes per second, to avoid
+ // gungeing up the sound drivers
+ MATRIX_DEBUG << "Rejecting preview (too busy)" << endl;
+ return false;
+ }
+ }
+
+ return true;
+}
+
+void MatrixView::playNote(Event *event)
+{
+ // Only play note events
+ //
+ if (!event->isa(Note::EventType))
+ return ;
+
+ Composition &comp = getDocument()->getComposition();
+ Studio &studio = getDocument()->getStudio();
+
+ // Get the Instrument
+ //
+ Track *track = comp.getTrackById(
+ m_staffs[0]->getSegment().getTrack());
+
+ Instrument *ins =
+ studio.getInstrumentById(track->getInstrument());
+
+ if (ins == 0)
+ return ;
+
+ if (!canPreviewAnotherNote())
+ return ;
+
+ // Get a velocity
+ //
+ MidiByte velocity = MidiMaxValue / 4; // be easy on the user's ears
+ long eventVelocity = 0;
+ if (event->get
+ <Int>(BaseProperties::VELOCITY, eventVelocity))
+ velocity = eventVelocity;
+
+ RealTime duration =
+ comp.getElapsedRealTime(event->getDuration());
+
+ // create
+ MappedEvent mE(ins->getId(),
+ MappedEvent::MidiNoteOneShot,
+ (MidiByte)
+ event->get
+ <Int>
+ (BaseProperties::PITCH) +
+ m_staffs[0]->getSegment().getTranspose(),
+ velocity,
+ RealTime::zeroTime,
+ duration,
+ RealTime::zeroTime);
+
+ StudioControl::sendMappedEvent(mE);
+}
+
+void MatrixView::playNote(const Segment &segment, int pitch,
+ int velocity)
+{
+ Composition &comp = getDocument()->getComposition();
+ Studio &studio = getDocument()->getStudio();
+
+ Track *track = comp.getTrackById(segment.getTrack());
+
+ Instrument *ins =
+ studio.getInstrumentById(track->getInstrument());
+
+ // check for null instrument
+ //
+ if (ins == 0)
+ return ;
+
+ if (velocity < 0)
+ velocity = getCurrentVelocity();
+
+ MappedEvent mE(ins->getId(),
+ MappedEvent::MidiNoteOneShot,
+ pitch + segment.getTranspose(),
+ velocity,
+ RealTime::zeroTime,
+ RealTime(0, 250000000),
+ RealTime::zeroTime);
+
+ StudioControl::sendMappedEvent(mE);
+}
+
+MatrixStaff*
+MatrixView::getStaff(const Segment &segment)
+{
+ for (unsigned int i = 0; i < m_staffs.size(); ++i) {
+ if (&(m_staffs[i]->getSegment()) == &segment)
+ return m_staffs[i];
+ }
+
+ return 0;
+}
+
+void
+MatrixView::setSingleSelectedEvent(int staffNo, Event *event,
+ bool preview, bool redrawNow)
+{
+ setSingleSelectedEvent(getStaff(staffNo)->getSegment(), event,
+ preview, redrawNow);
+}
+
+void
+MatrixView::setSingleSelectedEvent(Segment &segment,
+ Event *event,
+ bool preview, bool redrawNow)
+{
+ setCurrentSelection(0, false);
+
+ EventSelection *selection = new EventSelection(segment);
+ selection->addEvent(event);
+
+ //!!!
+ // this used to say
+ // setCurrentSelection(selection, true)
+ // since the default arg for preview is false, this changes the
+ // default semantics -- test what circumstance this matters in
+ // and choose an acceptable solution for both matrix & notation
+ setCurrentSelection(selection, preview, redrawNow);
+}
+
+void
+MatrixView::slotNewSelection()
+{
+ MATRIX_DEBUG << "MatrixView::slotNewSelection\n";
+
+ // m_parameterBox->setSelection(m_currentEventSelection);
+}
+
+void
+MatrixView::slotSetSnapFromIndex(int s)
+{
+ slotSetSnap(m_snapValues[s]);
+}
+
+void
+MatrixView::slotSetSnapFromAction()
+{
+ const QObject *s = sender();
+ QString name = s->name();
+
+ if (name.left(5) == "snap_") {
+ int snap = name.right(name.length() - 5).toInt();
+ if (snap > 0) {
+ slotSetSnap(Note(Note::Semibreve).getDuration() / snap);
+ } else if (name == "snap_none") {
+ slotSetSnap(SnapGrid::NoSnap);
+ } else if (name == "snap_beat") {
+ slotSetSnap(SnapGrid::SnapToBeat);
+ } else if (name == "snap_bar") {
+ slotSetSnap(SnapGrid::SnapToBar);
+ } else if (name == "snap_unit") {
+ slotSetSnap(SnapGrid::SnapToUnit);
+ } else {
+ MATRIX_DEBUG << "Warning: MatrixView::slotSetSnapFromAction: unrecognised action " << name << endl;
+ }
+ }
+}
+
+void
+MatrixView::slotSetSnap(timeT t)
+{
+ MATRIX_DEBUG << "MatrixView::slotSetSnap: time is " << t << endl;
+ m_snapGrid->setSnapTime(t);
+
+ for (unsigned int i = 0; i < m_snapValues.size(); ++i) {
+ if (m_snapValues[i] == t) {
+ m_snapGridCombo->setCurrentItem(i);
+ break;
+ }
+ }
+
+ for (unsigned int i = 0; i < m_staffs.size(); ++i)
+ m_staffs[i]->sizeStaff(m_hlayout);
+
+ m_segments[0]->setSnapGridSize(t);
+
+ m_config->setGroup(MatrixViewConfigGroup);
+ m_config->writeEntry("Snap Grid Size", t);
+
+ updateView();
+}
+
+void
+MatrixView::slotQuantizeSelection(int q)
+{
+ MATRIX_DEBUG << "MatrixView::slotQuantizeSelection\n";
+
+ timeT unit =
+ ((unsigned int)q < m_quantizations.size() ? m_quantizations[q] : 0);
+
+ Quantizer *quant =
+ new BasicQuantizer
+ (unit ? unit :
+ Note(Note::Shortest).getDuration(), false);
+
+ if (unit) {
+ KTmpStatusMsg msg(i18n("Quantizing..."), this);
+ if (m_currentEventSelection &&
+ m_currentEventSelection->getAddedEvents()) {
+ addCommandToHistory(new EventQuantizeCommand
+ (*m_currentEventSelection, quant));
+ } else {
+ Segment &s = m_staffs[0]->getSegment();
+ addCommandToHistory(new EventQuantizeCommand
+ (s, s.getStartTime(), s.getEndMarkerTime(),
+ quant));
+ }
+ } else {
+ KTmpStatusMsg msg(i18n("Unquantizing..."), this);
+ if (m_currentEventSelection &&
+ m_currentEventSelection->getAddedEvents()) {
+ addCommandToHistory(new EventUnquantizeCommand
+ (*m_currentEventSelection, quant));
+ } else {
+ Segment &s = m_staffs[0]->getSegment();
+ addCommandToHistory(new EventUnquantizeCommand
+ (s, s.getStartTime(), s.getEndMarkerTime(),
+ quant));
+ }
+ }
+}
+
+void
+MatrixView::initActionsToolbar()
+{
+ MATRIX_DEBUG << "MatrixView::initActionsToolbar" << endl;
+
+ KToolBar *actionsToolbar = toolBar("Actions Toolbar");
+
+ if (!actionsToolbar) {
+ MATRIX_DEBUG << "MatrixView::initActionsToolbar - "
+ << "tool bar not found" << endl;
+ return ;
+ }
+
+ // The SnapGrid combo and Snap To... menu items
+ //
+ QLabel *sLabel = new QLabel(i18n(" Grid: "), actionsToolbar, "kde toolbar widget");
+ sLabel->setIndent(10);
+
+ QPixmap noMap = NotePixmapFactory::toQPixmap(NotePixmapFactory::makeToolbarPixmap("menu-no-note"));
+
+ m_snapGridCombo = new KComboBox(actionsToolbar);
+
+ for (unsigned int i = 0; i < m_snapValues.size(); i++) {
+
+ timeT d = m_snapValues[i];
+
+ if (d == SnapGrid::NoSnap) {
+ m_snapGridCombo->insertItem(i18n("None"));
+ } else if (d == SnapGrid::SnapToUnit) {
+ m_snapGridCombo->insertItem(i18n("Unit"));
+ } else if (d == SnapGrid::SnapToBeat) {
+ m_snapGridCombo->insertItem(i18n("Beat"));
+ } else if (d == SnapGrid::SnapToBar) {
+ m_snapGridCombo->insertItem(i18n("Bar"));
+ } else {
+ timeT err = 0;
+ QString label = NotationStrings::makeNoteMenuLabel(d, true, err);
+ QPixmap pixmap = NotePixmapFactory::toQPixmap
+ (NotePixmapFactory::makeNoteMenuPixmap(d, err));
+ m_snapGridCombo->insertItem((err ? noMap : pixmap), label);
+ }
+
+ if (d == m_snapGrid->getSnapSetting()) {
+ m_snapGridCombo->setCurrentItem(m_snapGridCombo->count() - 1);
+ }
+ }
+
+ connect(m_snapGridCombo, SIGNAL(activated(int)),
+ this, SLOT(slotSetSnapFromIndex(int)));
+
+ // Velocity combo. Not a spin box, because the spin box is too
+ // slow to use unless we make it typeable into, and then it takes
+ // focus away from our more important widgets
+
+ QLabel *vlabel = new QLabel(i18n(" Velocity: "), actionsToolbar, "kde toolbar widget");
+ vlabel->setIndent(10);
+
+ m_velocityCombo = new KComboBox(actionsToolbar);
+ for (int i = 0; i <= 127; ++i) {
+ m_velocityCombo->insertItem(QString("%1").arg(i));
+ }
+ m_velocityCombo->setCurrentItem(100); //!!! associate with segment
+
+ // Quantize combo
+ //
+ QLabel *qLabel = new QLabel(i18n(" Quantize: "), actionsToolbar, "kde toolbar widget");
+ qLabel->setIndent(10);
+
+ m_quantizeCombo = new KComboBox(actionsToolbar);
+
+ for (unsigned int i = 0; i < m_quantizations.size(); ++i) {
+
+ timeT time = m_quantizations[i];
+ timeT error = 0;
+ QString label = NotationStrings::makeNoteMenuLabel(time, true, error);
+ QPixmap pmap = NotePixmapFactory::toQPixmap(NotePixmapFactory::makeNoteMenuPixmap(time, error));
+ m_quantizeCombo->insertItem(error ? noMap : pmap, label);
+ }
+
+ m_quantizeCombo->insertItem(noMap, i18n("Off"));
+
+ connect(m_quantizeCombo, SIGNAL(activated(int)),
+ this, SLOT(slotQuantizeSelection(int)));
+}
+
+void
+MatrixView::initZoomToolbar()
+{
+ MATRIX_DEBUG << "MatrixView::initZoomToolbar" << endl;
+
+ KToolBar *zoomToolbar = toolBar("Zoom Toolbar");
+
+ if (!zoomToolbar) {
+ MATRIX_DEBUG << "MatrixView::initZoomToolbar - "
+ << "tool bar not found" << endl;
+ return ;
+ }
+
+ std::vector<double> zoomSizes; // in units-per-pixel
+
+ //double defaultBarWidth44 = 100.0;
+ //double duration44 = TimeSignature(4,4).getBarDuration();
+
+ static double factors[] = { 0.025, 0.05, 0.1, 0.2, 0.5,
+ 1.0, 1.5, 2.5, 5.0, 10.0, 20.0 };
+ // Zoom labels
+ //
+ for (unsigned int i = 0; i < sizeof(factors) / sizeof(factors[0]); ++i) {
+// zoomSizes.push_back(duration44 / (defaultBarWidth44 * factors[i]));
+
+// zoomSizes.push_back(factors[i] / 2); // GROSS HACK - see in matrixstaff.h - BREAKS MATRIX VIEW, see bug 1000595
+ zoomSizes.push_back(factors[i]);
+ }
+
+ m_hZoomSlider = new ZoomSlider<double>
+ (zoomSizes, -1, QSlider::Horizontal, zoomToolbar, "kde toolbar widget");
+ m_hZoomSlider->setTracking(true);
+ m_hZoomSlider->setFocusPolicy(QWidget::NoFocus);
+
+ m_zoomLabel = new QLabel(zoomToolbar, "kde toolbar widget");
+ m_zoomLabel->setIndent(10);
+ m_zoomLabel->setFixedWidth(80);
+
+ connect(m_hZoomSlider,
+ SIGNAL(valueChanged(int)),
+ SLOT(slotChangeHorizontalZoom(int)));
+
+}
+
+void
+MatrixView::slotChangeHorizontalZoom(int)
+{
+ double zoomValue = m_hZoomSlider->getCurrentSize();
+
+ // m_zoomLabel->setText(i18n("%1%").arg(zoomValue*100.0 * 2)); // GROSS HACK - see in matrixstaff.h - BREAKS MATRIX VIEW, see bug 1000595
+ m_zoomLabel->setText(i18n("%1%").arg(zoomValue*100.0));
+
+ MATRIX_DEBUG << "MatrixView::slotChangeHorizontalZoom() : zoom factor = "
+ << zoomValue << endl;
+
+ m_referenceRuler->setHScaleFactor(zoomValue);
+
+ if (m_tempoRuler)
+ m_tempoRuler->repaint();
+ if (m_chordNameRuler)
+ m_chordNameRuler->repaint();
+
+ // Set zoom matrix
+ //
+ QWMatrix zoomMatrix;
+ zoomMatrix.scale(zoomValue, 1.0);
+ m_canvasView->setWorldMatrix(zoomMatrix);
+
+ // make control rulers zoom too
+ //
+ setControlRulersZoom(zoomMatrix);
+
+ if (m_topStandardRuler)
+ m_topStandardRuler->setHScaleFactor(zoomValue);
+ if (m_bottomStandardRuler)
+ m_bottomStandardRuler->setHScaleFactor(zoomValue);
+
+ for (unsigned int i = 0; i < m_propertyViewRulers.size(); ++i) {
+ m_propertyViewRulers[i].first->setHScaleFactor(zoomValue);
+ m_propertyViewRulers[i].first->repaint();
+ }
+
+ if (m_topStandardRuler)
+ m_topStandardRuler->update();
+ if (m_bottomStandardRuler)
+ m_bottomStandardRuler->update();
+
+ m_config->setGroup(MatrixViewConfigGroup);
+ m_config->writeEntry("Zoom Level", zoomValue);
+
+ // If you do adjust the viewsize then please remember to
+ // either re-center() or remember old scrollbar position
+ // and restore.
+ //
+
+ int newWidth = computePostLayoutWidth();
+
+ // int newWidth = int(getXbyWorldMatrix(getCanvasView()->canvas()->width()));
+
+ // We DO NOT resize the canvas(), only the area it's displaying on
+ //
+ getCanvasView()->resizeContents(newWidth, getViewSize().height());
+
+ // This forces a refresh of the h. scrollbar, even if the canvas width
+ // hasn't changed
+ //
+ getCanvasView()->polish();
+
+ getCanvasView()->slotScrollHoriz
+ (getXbyWorldMatrix(m_staffs[0]->getLayoutXOfInsertCursor()));
+}
+
+void
+MatrixView::slotZoomIn()
+{
+ m_hZoomSlider->increment();
+}
+
+void
+MatrixView::slotZoomOut()
+{
+ m_hZoomSlider->decrement();
+}
+
+void
+MatrixView::scrollToTime(timeT t)
+{
+ double layoutCoord = m_hlayout.getXForTime(t);
+ getCanvasView()->slotScrollHoriz(int(layoutCoord));
+}
+
+int
+MatrixView::getCurrentVelocity() const
+{
+ return m_velocityCombo->currentItem();
+}
+
+void
+MatrixView::slotSetCurrentVelocity(int value)
+{
+ m_velocityCombo->setCurrentItem(value);
+}
+
+
+void
+MatrixView::slotSetCurrentVelocityFromSelection()
+{
+ if (!m_currentEventSelection) return;
+
+ float totalVelocity = 0;
+ int count = 0;
+
+ for (EventSelection::eventcontainer::iterator i =
+ m_currentEventSelection->getSegmentEvents().begin();
+ i != m_currentEventSelection->getSegmentEvents().end(); ++i) {
+
+ if ((*i)->has(BaseProperties::VELOCITY)) {
+ totalVelocity += (*i)->get<Int>(BaseProperties::VELOCITY);
+ ++count;
+ }
+ }
+
+ if (count > 0) {
+ slotSetCurrentVelocity((totalVelocity / count) + 0.5);
+ }
+}
+
+unsigned int
+MatrixView::addPropertyViewRuler(const PropertyName &property)
+{
+ // Try and find this controller if it exists
+ //
+ for (unsigned int i = 0; i != m_propertyViewRulers.size(); i++) {
+ if (m_propertyViewRulers[i].first->getPropertyName() == property)
+ return i;
+ }
+
+ int height = 20;
+
+ PropertyViewRuler *newRuler = new PropertyViewRuler(&m_hlayout,
+ m_segments[0],
+ property,
+ xorigin,
+ height,
+ getCentralWidget());
+
+ addRuler(newRuler);
+
+ PropertyBox *newControl = new PropertyBox(strtoqstr(property),
+ m_parameterBox->width() + m_pitchRuler->width(),
+ height,
+ getCentralWidget());
+
+ addPropertyBox(newControl);
+
+ m_propertyViewRulers.push_back(
+ std::pair<PropertyViewRuler*, PropertyBox*>(newRuler, newControl));
+
+ return m_propertyViewRulers.size() - 1;
+}
+
+bool
+MatrixView::removePropertyViewRuler(unsigned int number)
+{
+ if (number > m_propertyViewRulers.size() - 1)
+ return false;
+
+ std::vector<std::pair<PropertyViewRuler*, PropertyBox*> >::iterator it
+ = m_propertyViewRulers.begin();
+ while (number--)
+ it++;
+
+ delete it->first;
+ delete it->second;
+ m_propertyViewRulers.erase(it);
+
+ return true;
+}
+
+RulerScale*
+MatrixView::getHLayout()
+{
+ return &m_hlayout;
+}
+
+Staff*
+MatrixView::getCurrentStaff()
+{
+ return getStaff(0);
+}
+
+Segment *
+MatrixView::getCurrentSegment()
+{
+ MatrixStaff *staff = getStaff(0);
+ return (staff ? &staff->getSegment() : 0);
+}
+
+timeT
+MatrixView::getInsertionTime()
+{
+ MatrixStaff *staff = m_staffs[0];
+ return staff->getInsertCursorTime(m_hlayout);
+}
+
+void
+MatrixView::slotStepBackward()
+{
+ timeT time(getInsertionTime());
+ slotSetInsertCursorPosition(SnapGrid(&m_hlayout).snapTime
+ (time - 1,
+ SnapGrid::SnapLeft));
+}
+
+void
+MatrixView::slotStepForward()
+{
+ timeT time(getInsertionTime());
+ slotSetInsertCursorPosition(SnapGrid(&m_hlayout).snapTime
+ (time + 1,
+ SnapGrid::SnapRight));
+}
+
+void
+MatrixView::slotJumpCursorToPlayback()
+{
+ slotSetInsertCursorPosition(getDocument()->getComposition().getPosition());
+}
+
+void
+MatrixView::slotJumpPlaybackToCursor()
+{
+ emit jumpPlaybackTo(getInsertionTime());
+}
+
+void
+MatrixView::slotToggleTracking()
+{
+ m_playTracking = !m_playTracking;
+}
+
+void
+MatrixView::slotSelectAll()
+{
+ Segment *segment = m_segments[0];
+ Segment::iterator it = segment->begin();
+ EventSelection *selection = new EventSelection(*segment);
+
+ for (; segment->isBeforeEndMarker(it); it++)
+ if ((*it)->isa(Note::EventType))
+ selection->addEvent(*it);
+
+ setCurrentSelection(selection, false);
+}
+
+void MatrixView::slotPreviewSelection()
+{
+ if (!m_currentEventSelection)
+ return ;
+
+ getDocument()->slotSetLoop(m_currentEventSelection->getStartTime(),
+ m_currentEventSelection->getEndTime());
+}
+
+void MatrixView::slotClearLoop()
+{
+ getDocument()->slotSetLoop(0, 0);
+}
+
+void MatrixView::slotClearSelection()
+{
+ // Actually we don't clear the selection immediately: if we're
+ // using some tool other than the select tool, then the first
+ // press switches us back to the select tool.
+
+ MatrixSelector *selector = dynamic_cast<MatrixSelector *>(m_tool);
+
+ if (!selector) {
+ slotSelectSelected();
+ } else {
+ setCurrentSelection(0);
+ }
+}
+
+void MatrixView::slotFilterSelection()
+{
+ RG_DEBUG << "MatrixView::slotFilterSelection" << endl;
+
+ Segment *segment = getCurrentSegment();
+ EventSelection *existingSelection = m_currentEventSelection;
+ if (!segment || !existingSelection)
+ return ;
+
+ EventFilterDialog dialog(this);
+ if (dialog.exec() == QDialog::Accepted) {
+ RG_DEBUG << "slotFilterSelection- accepted" << endl;
+
+ bool haveEvent = false;
+
+ EventSelection *newSelection = new EventSelection(*segment);
+ EventSelection::eventcontainer &ec =
+ existingSelection->getSegmentEvents();
+ for (EventSelection::eventcontainer::iterator i =
+ ec.begin(); i != ec.end(); ++i) {
+ if (dialog.keepEvent(*i)) {
+ haveEvent = true;
+ newSelection->addEvent(*i);
+ }
+ }
+
+ if (haveEvent)
+ setCurrentSelection(newSelection);
+ else
+ setCurrentSelection(0);
+ }
+}
+
+void
+MatrixView::readjustCanvasSize()
+{
+ int maxHeight = 0;
+
+ for (unsigned int i = 0; i < m_staffs.size(); ++i) {
+
+ MatrixStaff &staff = *m_staffs[i];
+
+ staff.sizeStaff(m_hlayout);
+
+ // if (staff.getTotalWidth() + staff.getX() > maxWidth) {
+ // maxWidth = staff.getTotalWidth() + staff.getX() + 1;
+ // }
+
+ if (staff.getTotalHeight() + staff.getY() > maxHeight) {
+ if (isDrumMode()) {
+ maxHeight = staff.getTotalHeight() + staff.getY() + 5;
+ } else {
+ maxHeight = staff.getTotalHeight() + staff.getY() + 1;
+ }
+ }
+
+ }
+
+ int newWidth = computePostLayoutWidth();
+
+ // now get the EditView to do the biz
+ readjustViewSize(QSize(newWidth, maxHeight), true);
+
+ repaintRulers();
+}
+
+void MatrixView::slotVelocityUp()
+{
+ if (!m_currentEventSelection)
+ return ;
+ KTmpStatusMsg msg(i18n("Raising velocities..."), this);
+
+ addCommandToHistory
+ (new ChangeVelocityCommand(10, *m_currentEventSelection));
+
+ slotSetCurrentVelocityFromSelection();
+}
+
+void MatrixView::slotVelocityDown()
+{
+ if (!m_currentEventSelection)
+ return ;
+ KTmpStatusMsg msg(i18n("Lowering velocities..."), this);
+
+ addCommandToHistory
+ (new ChangeVelocityCommand( -10, *m_currentEventSelection));
+
+ slotSetCurrentVelocityFromSelection();
+}
+
+void
+MatrixView::slotSetVelocities()
+{
+ if (!m_currentEventSelection)
+ return ;
+
+ EventParameterDialog dialog(this,
+ i18n("Set Event Velocities"),
+ BaseProperties::VELOCITY,
+ getCurrentVelocity());
+
+ if (dialog.exec() == QDialog::Accepted) {
+ KTmpStatusMsg msg(i18n("Setting Velocities..."), this);
+ addCommandToHistory(new SelectionPropertyCommand
+ (m_currentEventSelection,
+ BaseProperties::VELOCITY,
+ dialog.getPattern(),
+ dialog.getValue1(),
+ dialog.getValue2()));
+ }
+}
+
+void
+MatrixView::slotSetVelocitiesToCurrent()
+{
+ if (!m_currentEventSelection) return;
+
+ addCommandToHistory(new SelectionPropertyCommand
+ (m_currentEventSelection,
+ BaseProperties::VELOCITY,
+ FlatPattern,
+ getCurrentVelocity(),
+ getCurrentVelocity()));
+}
+
+void
+MatrixView::slotTriggerSegment()
+{
+ if (!m_currentEventSelection)
+ return ;
+
+ TriggerSegmentDialog dialog(this, &getDocument()->getComposition());
+ if (dialog.exec() != QDialog::Accepted)
+ return ;
+
+ addCommandToHistory(new SetTriggerCommand(*m_currentEventSelection,
+ dialog.getId(),
+ true,
+ dialog.getRetune(),
+ dialog.getTimeAdjust(),
+ Marks::NoMark,
+ i18n("Trigger Segment")));
+}
+
+void
+MatrixView::slotRemoveTriggers()
+{
+ if (!m_currentEventSelection)
+ return ;
+
+ addCommandToHistory(new ClearTriggersCommand(*m_currentEventSelection,
+ i18n("Remove Triggers")));
+}
+
+void
+MatrixView::slotToggleChordsRuler()
+{
+ toggleWidget(m_chordNameRuler, "show_chords_ruler");
+}
+
+void
+MatrixView::slotToggleTempoRuler()
+{
+ toggleWidget(m_tempoRuler, "show_tempo_ruler");
+}
+
+void
+MatrixView::paintEvent(QPaintEvent* e)
+{
+ //!!! There's a lot of code shared between matrix and notation for
+ // dealing with step recording (the insertable note event stuff).
+ // It should probably be factored out into a base class, but I'm
+ // not sure I wouldn't rather wait until the functionality is all
+ // sorted in both matrix and notation so we can be sure how much
+ // of it is actually common.
+
+ EditView::paintEvent(e);
+
+ // now deal with any backlog of insertable notes that appeared
+ // during paint (because it's not safe to modify a segment from
+ // within a sub-event-loop in a processEvents call from a paint)
+ if (!m_pendingInsertableNotes.empty()) {
+ std::vector<std::pair<int, int> > notes = m_pendingInsertableNotes;
+ m_pendingInsertableNotes.clear();
+ for (unsigned int i = 0; i < notes.size(); ++i) {
+ slotInsertableNoteEventReceived(notes[i].first, notes[i].second, true);
+ }
+ }
+}
+
+void
+MatrixView::updateViewCaption()
+{
+ // Set client label
+ //
+ QString view = i18n("Matrix");
+ if (isDrumMode())
+ view = i18n("Percussion");
+
+ if (m_segments.size() == 1) {
+
+ TrackId trackId = m_segments[0]->getTrack();
+ Track *track =
+ m_segments[0]->getComposition()->getTrackById(trackId);
+
+ int trackPosition = -1;
+ if (track)
+ trackPosition = track->getPosition();
+
+ setCaption(i18n("%1 - Segment Track #%2 - %3")
+ .arg(getDocument()->getTitle())
+ .arg(trackPosition + 1)
+ .arg(view));
+
+ } else if (m_segments.size() == getDocument()->getComposition().getNbSegments()) {
+
+ setCaption(i18n("%1 - All Segments - %2")
+ .arg(getDocument()->getTitle())
+ .arg(view));
+
+ } else {
+
+ setCaption(i18n("%1 - 1 Segment - %2",
+ "%1 - %n Segments - %2",
+ m_segments.size())
+ .arg(getDocument()->getTitle())
+ .arg(view));
+ }
+}
+
+int MatrixView::computePostLayoutWidth()
+{
+ Segment *segment = m_segments[0];
+ Composition *composition = segment->getComposition();
+ int endX = int(m_hlayout.getXForTime
+ (composition->getBarEndForTime
+ (segment->getEndMarkerTime())));
+ int startX = int(m_hlayout.getXForTime
+ (composition->getBarStartForTime
+ (segment->getStartTime())));
+
+ int newWidth = int(getXbyWorldMatrix(endX - startX));
+
+ MATRIX_DEBUG << "MatrixView::readjustCanvasSize() : startX = "
+ << startX
+ << " endX = " << endX
+ << " newWidth = " << newWidth
+ << " endmarkertime : " << segment->getEndMarkerTime()
+ << " barEnd for time : " << composition->getBarEndForTime(segment->getEndMarkerTime())
+ << endl;
+
+ newWidth += 12;
+ if (isDrumMode())
+ newWidth += 12;
+
+ return newWidth;
+}
+
+bool MatrixView::getMinMaxPitches(int& minPitch, int& maxPitch)
+{
+ minPitch = MatrixVLayout::maxMIDIPitch + 1;
+ maxPitch = MatrixVLayout::minMIDIPitch - 1;
+
+ std::vector<MatrixStaff*>::iterator sit;
+ for (sit = m_staffs.begin(); sit != m_staffs.end(); ++sit) {
+
+ MatrixElementList *mel = (*sit)->getViewElementList();
+ MatrixElementList::iterator eit;
+ for (eit = mel->begin(); eit != mel->end(); ++eit) {
+
+ NotationElement *el = static_cast<NotationElement*>(*eit);
+ if (el->isNote()) {
+ Event* ev = el->event();
+ int pitch = ev->get
+ <Int>
+ (BaseProperties::PITCH);
+ if (minPitch > pitch)
+ minPitch = pitch;
+ if (maxPitch < pitch)
+ maxPitch = pitch;
+ }
+ }
+ }
+
+ return maxPitch >= minPitch;
+}
+
+void MatrixView::extendKeyMapping()
+{
+ int minStaffPitch, maxStaffPitch;
+ if (getMinMaxPitches(minStaffPitch, maxStaffPitch)) {
+ int minKMPitch = m_localMapping->getPitchForOffset(0);
+ int maxKMPitch = m_localMapping->getPitchForOffset(0)
+ + m_localMapping->getPitchExtent() - 1;
+ if (minStaffPitch < minKMPitch)
+ m_localMapping->getMap()[minStaffPitch] = std::string("");
+ if (maxStaffPitch > maxKMPitch)
+ m_localMapping->getMap()[maxStaffPitch] = std::string("");
+ }
+}
+
+void
+MatrixView::slotInsertableNoteEventReceived(int pitch, int velocity, bool noteOn)
+{
+ // hjj:
+ // The default insertion mode is implemented equivalently in
+ // notationviewslots.cpp:
+ // - proceed if notes do not overlap
+ // - make the chord if notes do overlap, and do not proceed
+
+ static int numberOfNotesOn = 0;
+ static time_t lastInsertionTime = 0;
+ if (!noteOn) {
+ numberOfNotesOn--;
+ return ;
+ }
+
+ KToggleAction *action = dynamic_cast<KToggleAction *>
+ (actionCollection()->action("toggle_step_by_step"));
+ if (!action) {
+ MATRIX_DEBUG << "WARNING: No toggle_step_by_step action" << endl;
+ return ;
+ }
+ if (!action->isChecked())
+ return ;
+
+ if (m_inPaintEvent) {
+ m_pendingInsertableNotes.push_back(std::pair<int, int>(pitch, velocity));
+ return ;
+ }
+
+ Segment &segment = *getCurrentSegment();
+
+ // If the segment is transposed, we want to take that into
+ // account. But the note has already been played back to the user
+ // at its untransposed pitch, because that's done by the MIDI THRU
+ // code in the sequencer which has no way to know whether a note
+ // was intended for step recording. So rather than adjust the
+ // pitch for playback according to the transpose setting, we have
+ // to adjust the stored pitch in the opposite direction.
+
+ pitch -= segment.getTranspose();
+
+ KTmpStatusMsg msg(i18n("Inserting note"), this);
+
+ MATRIX_DEBUG << "Inserting note at pitch " << pitch << endl;
+
+ Event modelEvent(Note::EventType, 0, 1);
+ modelEvent.set<Int>(BaseProperties::PITCH, pitch);
+ static timeT insertionTime(getInsertionTime());
+ if (insertionTime >= segment.getEndMarkerTime()) {
+ MATRIX_DEBUG << "WARNING: off end of segment" << endl;
+ return ;
+ }
+ time_t now;
+ time (&now);
+ double elapsed = difftime(now, lastInsertionTime);
+ time (&lastInsertionTime);
+
+ if (numberOfNotesOn <= 0 || elapsed > 10.0 ) {
+ numberOfNotesOn = 0;
+ insertionTime = getInsertionTime();
+ }
+ numberOfNotesOn++;
+ timeT endTime(insertionTime + m_snapGrid->getSnapTime(insertionTime));
+
+ if (endTime <= insertionTime) {
+ static bool showingError = false;
+ if (showingError)
+ return ;
+ showingError = true;
+ KMessageBox::sorry(this, i18n("Can't insert note: No grid duration selected"));
+ showingError = false;
+ return ;
+ }
+
+ MatrixInsertionCommand* command =
+ new MatrixInsertionCommand(segment, insertionTime, endTime, &modelEvent);
+
+ addCommandToHistory(command);
+
+ if (!isInChordMode()) {
+ slotSetInsertCursorPosition(endTime);
+ }
+}
+
+void
+MatrixView::slotInsertableNoteOnReceived(int pitch, int velocity)
+{
+ MATRIX_DEBUG << "MatrixView::slotInsertableNoteOnReceived: " << pitch << endl;
+ slotInsertableNoteEventReceived(pitch, velocity, true);
+}
+
+void
+MatrixView::slotInsertableNoteOffReceived(int pitch, int velocity)
+{
+ MATRIX_DEBUG << "MatrixView::slotInsertableNoteOffReceived: " << pitch << endl;
+ slotInsertableNoteEventReceived(pitch, velocity, false);
+}
+
+void
+MatrixView::slotToggleStepByStep()
+{
+ KToggleAction *action = dynamic_cast<KToggleAction *>
+ (actionCollection()->action("toggle_step_by_step"));
+ if (!action) {
+ MATRIX_DEBUG << "WARNING: No toggle_step_by_step action" << endl;
+ return ;
+ }
+ if (action->isChecked()) { // after toggling, that is
+ emit stepByStepTargetRequested(this);
+ } else {
+ emit stepByStepTargetRequested(0);
+ }
+}
+
+void
+MatrixView::slotUpdateInsertModeStatus()
+{
+ QString message;
+ if (isInChordMode()) {
+ message = i18n(" Chord ");
+ } else {
+ message = "";
+ }
+ m_insertModeLabel->setText(message);
+}
+
+void
+MatrixView::slotStepByStepTargetRequested(QObject *obj)
+{
+ KToggleAction *action = dynamic_cast<KToggleAction *>
+ (actionCollection()->action("toggle_step_by_step"));
+ if (!action) {
+ MATRIX_DEBUG << "WARNING: No toggle_step_by_step action" << endl;
+ return ;
+ }
+ action->setChecked(obj == this);
+}
+
+void
+MatrixView::slotInstrumentLevelsChanged(InstrumentId id,
+ const LevelInfo &info)
+{
+ if (!m_parameterBox)
+ return ;
+
+ Composition &comp = getDocument()->getComposition();
+
+ Track *track =
+ comp.getTrackById(m_staffs[0]->getSegment().getTrack());
+ if (!track || track->getInstrument() != id)
+ return ;
+
+ Instrument *instr = getDocument()->getStudio().
+ getInstrumentById(track->getInstrument());
+ if (!instr || instr->getType() != Instrument::SoftSynth)
+ return ;
+
+ float dBleft = AudioLevel::fader_to_dB
+ (info.level, 127, AudioLevel::LongFader);
+ float dBright = AudioLevel::fader_to_dB
+ (info.levelRight, 127, AudioLevel::LongFader);
+
+ m_parameterBox->setAudioMeter(dBleft, dBright,
+ AudioLevel::DB_FLOOR,
+ AudioLevel::DB_FLOOR);
+}
+
+void
+MatrixView::slotPercussionSetChanged(Instrument * newInstr)
+{
+ // Must be called only when in drum mode
+ assert(m_drumMode);
+
+ int resolution = 8;
+ if (newInstr && newInstr->getKeyMapping()) {
+ resolution = 11;
+ }
+
+ const MidiKeyMapping *mapping = 0;
+ if (newInstr) {
+ mapping = newInstr->getKeyMapping();
+ }
+
+ // Construct a local new keymapping :
+ if (m_localMapping)
+ delete m_localMapping;
+ if (mapping) {
+ m_localMapping = new MidiKeyMapping(*mapping);
+ extendKeyMapping();
+ } else {
+ m_localMapping = 0;
+ }
+
+ m_staffs[0]->setResolution(resolution);
+
+ delete m_pitchRuler;
+
+ QWidget *vport = m_pianoView->viewport();
+
+ // Create a new pitchruler widget
+ PitchRuler *pitchRuler;
+ if (newInstr && newInstr->getKeyMapping() &&
+ !newInstr->getKeyMapping()->getMap().empty()) {
+ pitchRuler = new PercussionPitchRuler(vport,
+ m_localMapping,
+ resolution); // line spacing
+ } else {
+ pitchRuler = new PianoKeyboard(vport);
+ }
+
+
+ QObject::connect
+ (pitchRuler, SIGNAL(hoveredOverKeyChanged(unsigned int)),
+ this, SLOT (slotHoveredOverKeyChanged(unsigned int)));
+
+ QObject::connect
+ (pitchRuler, SIGNAL(keyPressed(unsigned int, bool)),
+ this, SLOT (slotKeyPressed(unsigned int, bool)));
+
+ QObject::connect
+ (pitchRuler, SIGNAL(keySelected(unsigned int, bool)),
+ this, SLOT (slotKeySelected(unsigned int, bool)));
+
+ QObject::connect
+ (pitchRuler, SIGNAL(keyReleased(unsigned int, bool)),
+ this, SLOT (slotKeyReleased(unsigned int, bool)));
+
+ // Replace the old pitchruler widget
+ m_pitchRuler = pitchRuler;
+ m_pianoView->addChild(m_pitchRuler);
+ m_pitchRuler->show();
+ m_pianoView->setFixedWidth(pitchRuler->sizeHint().width());
+
+ // Update matrix canvas
+ readjustCanvasSize();
+ bool layoutApplied = applyLayout();
+ if (!layoutApplied)
+ KMessageBox::sorry(0, i18n("Couldn't apply piano roll layout"));
+ else {
+ MATRIX_DEBUG << "MatrixView : rendering elements\n";
+ m_staffs[0]->positionAllElements();
+ m_staffs[0]->getSegment().getRefreshStatus
+ (m_segmentsRefreshStatusIds[0]).setNeedsRefresh(false);
+ update();
+ }
+}
+
+void
+MatrixView::slotCanvasBottomWidgetHeightChanged(int newHeight)
+{
+ m_pianoView->setBottomMargin(newHeight +
+ m_canvasView->horizontalScrollBar()->height());
+}
+
+MatrixCanvasView* MatrixView::getCanvasView()
+{
+ return dynamic_cast<MatrixCanvasView *>(m_canvasView);
+}
+
+}
+#include "MatrixView.moc"
diff --git a/src/gui/editors/matrix/MatrixView.h b/src/gui/editors/matrix/MatrixView.h
new file mode 100644
index 0000000..49e0358
--- /dev/null
+++ b/src/gui/editors/matrix/MatrixView.h
@@ -0,0 +1,692 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_MATRIXVIEW_H_
+#define _RG_MATRIXVIEW_H_
+
+#include "base/MidiProgram.h"
+#include "base/PropertyName.h"
+#include "base/SnapGrid.h"
+#include "gui/general/EditView.h"
+#include "gui/widgets/ZoomSlider.h"
+#include "MatrixHLayout.h"
+#include "MatrixVLayout.h"
+#include "MatrixCanvasView.h"
+#include <kdockwidget.h>
+#include <qpoint.h>
+#include <qsize.h>
+#include <vector>
+#include "base/Event.h"
+#include "document/ConfigGroups.h"
+
+
+class QWidget;
+class QPaintEvent;
+class QObject;
+class QMouseEvent;
+class QLabel;
+class QCursor;
+class QCanvas;
+class KComboBox;
+
+
+namespace Rosegarden
+{
+
+class Staff;
+class Segment;
+class RulerScale;
+class RosegardenGUIDoc;
+class QDeferScrollView;
+class PropertyViewRuler;
+class PropertyBox;
+class PitchRuler;
+class MidiKeyMapping;
+class MatrixStaff;
+class MatrixElement;
+class InstrumentParameterBox;
+class Instrument;
+class EventSelection;
+class Event;
+class ChordNameRuler;
+class LevelInfo;
+
+
+/**
+ * Matrix ("Piano Roll") View
+ *
+ * Note: we currently display only one staff
+ */
+class MatrixView : public EditView
+{
+ Q_OBJECT
+
+ friend class MatrixSelector;
+
+public:
+ MatrixView(RosegardenGUIDoc *doc,
+ std::vector<Segment *> segments,
+ QWidget *parent, bool drumMode);
+
+ virtual ~MatrixView();
+
+ virtual bool applyLayout(int staffNo = -1,
+ timeT startTime = 0,
+ timeT endTime = 0);
+
+ virtual void refreshSegment(Segment *segment,
+ timeT startTime = 0,
+ timeT endTime = 0);
+
+ QCanvas* canvas() { return getCanvasView()->canvas(); }
+
+ void setCanvasCursor(const QCursor &cursor) {
+ getCanvasView()->viewport()->setCursor(cursor);
+ }
+
+ MatrixStaff* getStaff(int i)
+ {
+ if (i >= 0 && unsigned(i) < m_staffs.size()) return m_staffs[i];
+ else return 0;
+ }
+
+ MatrixStaff *getStaff(const Segment &segment);
+
+ virtual void updateView();
+
+ bool isDrumMode() { return m_drumMode; }
+
+ /**
+ * Discover whether chord-mode insertions are enabled (as opposed
+ * to the default melody-mode)
+ */
+ bool isInChordMode();
+
+ /**
+ * Set the current event selection.
+ *
+ * If preview is true, sound the selection as well.
+ *
+ * If redrawNow is true, recolour the elements on the canvas;
+ * otherwise just line up a refresh for the next paint event.
+ *
+ * (If the selection has changed as part of a modification to a
+ * segment, redrawNow should be unnecessary and undesirable, as a
+ * paint event will occur in the next event loop following the
+ * command invocation anyway.)
+ */
+ virtual void setCurrentSelection(EventSelection* s,
+ bool preview = false,
+ bool redrawNow = false);
+
+ /**
+ * Set the current event selection to a single event
+ */
+ void setSingleSelectedEvent(int staffNo,
+ Event *event,
+ bool preview = false,
+ bool redrawNow = false);
+
+ /**
+ * Set the current event selection to a single event
+ */
+ void setSingleSelectedEvent(Segment &segment,
+ Event *event,
+ bool preview = false,
+ bool redrawNow = false);
+
+
+ /**
+ * Play a Note Event using the keyPressed() signal
+ */
+ void playNote(Event *event);
+
+ /**
+ * Play a preview (same as above but a simpler interface)
+ */
+ void playNote(const Segment &segment, int pitch, int velocity = -1);
+
+ /**
+ * Get the SnapGrid
+ */
+ const SnapGrid &getSnapGrid() const { return *m_snapGrid; }
+
+ /**
+ * Add a ruler that allows control of a single property -
+ * return the number of the added ruler
+ *
+ */
+ unsigned int addPropertyViewRuler(const PropertyName &property);
+
+ /**
+ * Remove a control ruler - return true if it's a valid ruler number
+ */
+ bool removePropertyViewRuler(unsigned int number);
+
+ /**
+ * Adjust an X coord by world matrix
+ */
+ double getXbyWorldMatrix(double value)
+ { return m_canvasView->worldMatrix().m11() * value; }
+
+ double getXbyInverseWorldMatrix(double value)
+ { return m_canvasView->inverseWorldMatrix().m11() * value; }
+
+ QPoint inverseMapPoint(const QPoint& p) { return m_canvasView->inverseMapPoint(p); }
+
+ /*
+ * Repaint the control rulers
+ *
+ */
+ void repaintRulers();
+
+ /*
+ * Readjust the canvas size
+ *
+ */
+ void readjustCanvasSize();
+
+ /*
+ * Scrolls the view such that the given time is centered
+ */
+ void scrollToTime(timeT t);
+
+ /**
+ * Get the local keyMapping (when in drum mode)
+ */
+ MidiKeyMapping *getKeyMapping() { return m_localMapping; }
+
+ /**
+ * Get the velocity currently set in the velocity menu.
+ */
+ int getCurrentVelocity() const;
+
+signals:
+ /**
+ * Emitted when the selection has been cut or copied
+ *
+ * @see MatrixSelector#hideSelection
+ */
+ void usedSelection();
+
+ void play();
+ void stop();
+ void fastForwardPlayback();
+ void rewindPlayback();
+ void fastForwardPlaybackToEnd();
+ void rewindPlaybackToBeginning();
+ void jumpPlaybackTo(timeT);
+ void panic();
+
+ void stepByStepTargetRequested(QObject *);
+
+ void editTriggerSegment(int);
+
+ void editTimeSignature(timeT);
+
+public slots:
+
+ /**
+ * put the indicationed text/object into the clipboard and remove * it
+ * from the document
+ */
+ virtual void slotEditCut();
+
+ /**
+ * put the indicationed text/object into the clipboard
+ */
+ virtual void slotEditCopy();
+
+ /**
+ * paste the clipboard into the document
+ */
+ virtual void slotEditPaste();
+
+ /**
+ * Delete the current selection
+ */
+ void slotEditDelete();
+
+ virtual void slotStepBackward(); // override from EditView
+ virtual void slotStepForward(); // override from EditView
+
+ void slotPreviewSelection();
+ void slotClearLoop();
+ void slotClearSelection();
+
+ /**
+ * Filter selection by event type
+ */
+ void slotFilterSelection(); // dummy - not actually functional yet
+
+ /// edition tools
+ void slotPaintSelected();
+ void slotEraseSelected();
+ void slotSelectSelected();
+ void slotMoveSelected();
+ void slotResizeSelected();
+
+ void slotToggleStepByStep();
+
+ /// status stuff
+ void slotUpdateInsertModeStatus();
+
+ /// transforms
+ void slotTransformsQuantize();
+ void slotTransformsRepeatQuantize();
+ void slotTransformsLegato();
+ void slotVelocityUp();
+ void slotVelocityDown();
+
+ /// settings
+ void slotToggleChordsRuler();
+ void slotToggleTempoRuler();
+
+ /// cursor moves
+ void slotJumpCursorToPlayback();
+ void slotJumpPlaybackToCursor();
+ void slotToggleTracking();
+
+ /// Canvas actions slots
+
+ /**
+ * Called when a mouse press occurred on a matrix element
+ * or somewhere on the staff
+ */
+ void slotMousePressed(timeT time, int pitch,
+ QMouseEvent*, MatrixElement*);
+
+ void slotMouseMoved(timeT time, int pitch, QMouseEvent*);
+ void slotMouseReleased(timeT time, int pitch, QMouseEvent*);
+
+ /**
+ * Called when the mouse cursor moves over a different height on
+ * the staff
+ *
+ * @see MatrixCanvasView#hoveredOverNoteChanged()
+ */
+ void slotHoveredOverNoteChanged(int evPitch, bool haveEvent,
+ timeT evTime);
+
+ /**
+ * Called when the mouse cursor moves over a different key on
+ * the piano keyboard
+ *
+ * @see PianoKeyboard#hoveredOverKeyChanged()
+ */
+ void slotHoveredOverKeyChanged(unsigned int);
+
+ /**
+ * Called when the mouse cursor moves over a note which is at a
+ * different time on the staff
+ *
+ * @see MatrixCanvasView#hoveredOverNoteChange()
+ */
+ void slotHoveredOverAbsoluteTimeChanged(unsigned int);
+
+ /**
+ * Set the time pointer position during playback
+ */
+ void slotSetPointerPosition(timeT time);
+
+ /**
+ * Set the time pointer position during playback
+ */
+ void slotSetPointerPosition(timeT time,
+ bool scroll);
+
+ /**
+ * Set the insertion pointer position (from the bottom LoopRuler)
+ */
+ void slotSetInsertCursorPosition(timeT position, bool scroll);
+
+ virtual void slotSetInsertCursorPosition(timeT position) {
+ slotSetInsertCursorPosition(position, true);
+ }
+
+ /**
+ * Catch the keyboard being pressed
+ */
+ void slotKeyPressed(unsigned int y, bool repeating);
+
+ /**
+ * Catch the keyboard being released
+ */
+ void slotKeyReleased(unsigned int y, bool repeating);
+
+ /**
+ * Catch the keyboard being pressed with selection modifier
+ */
+ void slotKeySelected(unsigned int y, bool repeating);
+
+ /**
+ * Handle scrolling between view and PianoKeyboard
+ */
+ void slotVerticalScrollPianoKeyboard(int y);
+
+ /**
+ * Close
+ */
+ void closeWindow();
+
+ /**
+ * A new selection has been acquired by a tool
+ */
+ void slotNewSelection();
+
+ /**
+ * Set the snaptime of the grid from an item in the snap combo
+ */
+ void slotSetSnapFromIndex(int);
+
+ /**
+ * Set the snaptime of the grid based on the name of the invoking action
+ */
+ void slotSetSnapFromAction();
+
+ /**
+ * Set the snaptime of the grid
+ */
+ void slotSetSnap(timeT);
+
+ /**
+ * Quantize a selection to a given level
+ */
+ void slotQuantizeSelection(int);
+
+ /**
+ * Collapse equal pitch notes
+ */
+ void slotTransformsCollapseNotes();
+
+ /**
+ * Pop-up the velocity modification dialog
+ */
+ void slotSetVelocities();
+
+ /**
+ * Set selected event velocities to whatever's in the velocity widget
+ */
+ void slotSetVelocitiesToCurrent();
+
+ /**
+ * Pop-up the select trigger segment dialog
+ */
+ void slotTriggerSegment();
+
+ /**
+ * Clear triggers from selection
+ */
+ void slotRemoveTriggers();
+
+ /**
+ * Change horizontal zoom
+ */
+ void slotChangeHorizontalZoom(int);
+
+ void slotZoomIn();
+ void slotZoomOut();
+
+ /**
+ * Select all
+ */
+ void slotSelectAll();
+
+ /**
+ * Keyboard insert
+ */
+ void slotInsertNoteFromAction();
+
+ /// Note-on received asynchronously -- consider step-by-step editing
+ void slotInsertableNoteOnReceived(int pitch, int velocity);
+
+ /// Note-off received asynchronously -- consider step-by-step editing
+ void slotInsertableNoteOffReceived(int pitch, int velocity);
+
+ /// Note-on or note-off received asynchronously -- as above
+ void slotInsertableNoteEventReceived(int pitch, int velocity, bool noteOn);
+
+ /// The given QObject has originated a step-by-step-editing request
+ void slotStepByStepTargetRequested(QObject *);
+
+ void slotInstrumentLevelsChanged(InstrumentId,
+ const LevelInfo &);
+
+ /// Set the velocity menu to the given value
+ void slotSetCurrentVelocity(int);
+ void slotSetCurrentVelocityFromSelection();
+
+protected slots:
+ void slotCanvasBottomWidgetHeightChanged(int newHeight);
+
+ /**
+ * A new percussion key mapping has to be displayed
+ */
+ void slotPercussionSetChanged(Instrument *);
+
+ /**
+ * Re-dock the parameters box to its initial position
+ */
+ void slotDockParametersBack();
+
+ /**
+ * The parameters box was closed
+ */
+ void slotParametersClosed();
+
+ /**
+ * The parameters box was docked back
+ */
+ void slotParametersDockedBack(KDockWidget*, KDockWidget::DockPosition);
+
+ /**
+ * The instrument for this track may have changed
+ */
+ void slotCheckTrackAssignments();
+
+ void slotToolHelpChanged(const QString &);
+ void slotMouseEnteredCanvasView();
+ void slotMouseLeftCanvasView();
+
+protected:
+ virtual RulerScale* getHLayout();
+
+ virtual Segment *getCurrentSegment();
+ virtual Staff *getCurrentStaff();
+ virtual timeT getInsertionTime();
+
+ /**
+ * save general Options like all bar positions and status as well
+ * as the geometry and the recent file list to the configuration
+ * file
+ */
+ virtual void slotSaveOptions();
+
+ /**
+ * read general Options again and initialize all variables like the recent file list
+ */
+ virtual void readOptions();
+
+ /**
+ * create menus and toolbars
+ */
+ virtual void setupActions();
+
+ /**
+ * setup status bar
+ */
+ virtual void initStatusBar();
+
+ /**
+ * update the current quantize level from selection or entire segment
+ */
+ virtual void updateQuantizeCombo();
+
+ /**
+ * Return the size of the MatrixCanvasView
+ */
+ virtual QSize getViewSize();
+
+ /**
+ * Set the size of the MatrixCanvasView
+ */
+ virtual void setViewSize(QSize);
+
+ virtual MatrixCanvasView *getCanvasView();
+
+ /**
+ * Init matrix actions toolbar
+ */
+ void initActionsToolbar();
+
+ /**
+ * Zoom toolbar
+ */
+ void initZoomToolbar();
+
+ /**
+ * Test whether we've had too many preview notes recently
+ */
+ bool canPreviewAnotherNote();
+
+ virtual void paintEvent(QPaintEvent* e);
+
+ virtual void updateViewCaption();
+
+ int computePostLayoutWidth();
+
+ /**
+ * Get min and max pitches of notes on matrix.
+ * Return false if no notes.
+ */
+ bool getMinMaxPitches(int& minPitch, int& maxPitch);
+
+ /**
+ * If necessary, extend local keymapping to contain
+ * all notes currently on staff
+ */
+ void extendKeyMapping();
+
+ //--------------- Data members ---------------------------------
+
+ std::vector<MatrixStaff*> m_staffs;
+
+ MatrixHLayout m_hlayout;
+ MatrixVLayout m_vlayout;
+ SnapGrid *m_snapGrid;
+
+ timeT m_lastEndMarkerTime;
+
+ // Status bar elements
+ QLabel* m_hoveredOverAbsoluteTime;
+ QLabel* m_hoveredOverNoteName;
+ QLabel *m_selectionCounter;
+ QLabel *m_insertModeLabel;
+ bool m_haveHoveredOverNote;
+
+ /**
+ * used in slotHoveredOverKeyChanged to track moves over the piano
+ * keyboard
+ */
+ int m_previousEvPitch;
+
+ KDockWidget *m_dockLeft;
+ MatrixCanvasView *m_canvasView;
+ QDeferScrollView *m_pianoView;
+ PitchRuler *m_pitchRuler;
+
+ MidiKeyMapping *m_localMapping;
+
+ // The last note we sent in case we're swooshing up and
+ // down the keyboard and don't want repeat notes sending
+ //
+ MidiByte m_lastNote;
+
+ // The first note we sent in similar case (only used for
+ // doing effective sweep selections
+ //
+ MidiByte m_firstNote;
+
+ PropertyName m_selectedProperty;
+
+ // The parameter box
+ //
+ InstrumentParameterBox *m_parameterBox;
+
+ // Toolbar flora
+ //
+ KComboBox *m_velocityCombo;
+ KComboBox *m_quantizeCombo;
+ KComboBox *m_snapGridCombo;
+ ZoomSlider<double> *m_hZoomSlider;
+ ZoomSlider<double> *m_vZoomSlider;
+ QLabel *m_zoomLabel;
+
+ // Hold our matrix quantization values and snap values
+ //
+ std::vector<timeT> m_quantizations;
+ std::vector<timeT> m_snapValues;
+
+ std::vector<std::pair<PropertyViewRuler*, PropertyBox*> > m_propertyViewRulers;
+
+ ChordNameRuler *m_chordNameRuler;
+ QWidget *m_tempoRuler;
+
+ // ruler used to scale tempo and chord name ruler
+ ZoomableMatrixHLayoutRulerScale* m_referenceRuler;
+
+ std::vector<std::pair<int, int> > m_pendingInsertableNotes;
+
+ bool m_playTracking;
+ bool m_dockVisible;
+ bool m_drumMode;
+
+ bool m_mouseInCanvasView;
+ QString m_toolContextHelp;
+};
+
+// Commented this out - was a MatrixView inner class, but we get a warning
+// that Q_OBJECT can't be used in an inner class - gl
+//
+
+// class NoteSender : public QObject
+// {
+// Q_OBJECT
+
+// public:
+// NoteSender(int i, int p) : m_insid(i), m_pitch(p) { }
+// virtual ~NoteSender();
+
+// public slots:
+// void sendNote();
+
+// private:
+// int m_insid, m_pitch;
+// };
+
+
+}
+
+#endif
diff --git a/src/gui/editors/matrix/PianoKeyboard.cpp b/src/gui/editors/matrix/PianoKeyboard.cpp
new file mode 100644
index 0000000..e4641d0
--- /dev/null
+++ b/src/gui/editors/matrix/PianoKeyboard.cpp
@@ -0,0 +1,299 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "PianoKeyboard.h"
+#include "misc/Debug.h"
+
+#include "gui/general/GUIPalette.h"
+#include "gui/general/MidiPitchLabel.h"
+#include "gui/rulers/PitchRuler.h"
+#include "MatrixStaff.h"
+#include "MatrixView.h"
+#include <qcolor.h>
+#include <qcursor.h>
+#include <qevent.h>
+#include <qfont.h>
+#include <qpainter.h>
+#include <qsize.h>
+#include <qwidget.h>
+
+
+namespace Rosegarden
+{
+
+const unsigned int _smallWhiteKeyHeight = 14;
+const unsigned int _whiteKeyHeight = 18;
+
+PianoKeyboard::PianoKeyboard(QWidget *parent, int keys)
+ : PitchRuler(parent),
+ m_keySize(48, 18),
+ m_blackKeySize(24, 8),
+ m_nbKeys(keys),
+ m_mouseDown(false),
+ m_hoverHighlight(new QWidget(this)),
+ m_lastHoverHighlight(0),
+ m_lastKeyPressed(0)
+{
+ m_hoverHighlight->hide();
+ m_hoverHighlight->setPaletteBackgroundColor(GUIPalette::getColour(GUIPalette::MatrixKeyboardFocus));
+
+ setPaletteBackgroundColor(QColor(238, 238, 224));
+
+ computeKeyPos();
+ setMouseTracking(true);
+}
+
+QSize PianoKeyboard::sizeHint() const
+{
+ return QSize(m_keySize.width(),
+ m_keySize.height() * m_nbKeys);
+}
+
+QSize PianoKeyboard::minimumSizeHint() const
+{
+ return m_keySize;
+}
+
+void PianoKeyboard::computeKeyPos()
+{
+ // int y = -9;
+ int y = -4;
+
+ unsigned int posInOctave = 0,
+ keyHeight = _smallWhiteKeyHeight;
+
+ for (unsigned int i = 0; i < m_nbKeys; ++i) {
+ posInOctave = (i + 5) % 7;
+
+ if (y >= 0) {
+ m_whiteKeyPos.push_back(y);
+ m_allKeyPos.push_back(y);
+ }
+
+ if (posInOctave == 2)
+ m_labelKeyPos.push_back(y + (keyHeight * 3 / 4) - 2);
+
+ if (posInOctave == 0 ||
+ posInOctave == 2 ||
+ posInOctave == 6 ||
+ posInOctave == 3) { // draw shorter white key
+
+
+ keyHeight = _smallWhiteKeyHeight;
+
+ if (posInOctave == 2 ||
+ posInOctave == 6)
+ --keyHeight;
+
+ } else {
+
+ keyHeight = _whiteKeyHeight;
+ }
+
+ if (posInOctave != 2 && posInOctave != 6) { // draw black key
+
+ unsigned int bY = y + keyHeight - m_blackKeySize.height() / 2;
+
+ m_blackKeyPos.push_back(bY);
+ m_allKeyPos.push_back(bY);
+
+ }
+
+ y += keyHeight;
+ }
+}
+
+void PianoKeyboard::paintEvent(QPaintEvent*)
+{
+ static QFont *pFont = 0;
+ if (!pFont) {
+ pFont = new QFont();
+ pFont->setPixelSize(9);
+ }
+
+ QPainter paint(this);
+
+ paint.setFont(*pFont);
+
+ for (unsigned int i = 0; i < m_whiteKeyPos.size(); ++i)
+ paint.drawLine(0, m_whiteKeyPos[i],
+ m_keySize.width(), m_whiteKeyPos[i]);
+
+ for (unsigned int i = 0; i < m_labelKeyPos.size(); ++i) {
+
+ int pitch = (m_labelKeyPos.size() - i) * 12;
+
+ // for some reason I don't immediately comprehend,
+ // m_labelKeyPos contains two more octaves than we need
+ pitch -= 24;
+
+ MidiPitchLabel label(pitch);
+ paint.drawText(m_blackKeySize.width(), m_labelKeyPos[i],
+ label.getQString());
+ }
+
+ paint.setBrush(colorGroup().foreground());
+
+ for (unsigned int i = 0; i < m_blackKeyPos.size(); ++i)
+ paint.drawRect(0, m_blackKeyPos[i],
+ m_blackKeySize.width(), m_blackKeySize.height());
+}
+
+void PianoKeyboard::enterEvent(QEvent *)
+{
+ //drawHoverNote(e->y());
+}
+
+void PianoKeyboard::leaveEvent(QEvent*)
+{
+ m_hoverHighlight->hide();
+
+ int pos = mapFromGlobal( cursor().pos() ).x();
+ if ( pos > m_keySize.width() - 5 || pos < 0 ) { // bit of a hack
+ emit keyReleased(m_lastKeyPressed, false);
+ }
+}
+
+void PianoKeyboard::drawHoverNote(int evPitch)
+{
+ if (m_lastHoverHighlight != evPitch) {
+ //MATRIX_DEBUG << "PianoKeyboard::drawHoverNote : note = " << evPitch << endl;
+ m_lastHoverHighlight = evPitch;
+
+ int count = 0;
+ std::vector<unsigned int>::iterator it;
+ for (it = m_allKeyPos.begin(); it != m_allKeyPos.end(); ++it, ++count) {
+ if (126 - evPitch == count) {
+ int width = m_keySize.width() - 8;
+ int yPos = *it + 5;
+
+ // check if this is a black key
+ //
+ std::vector<unsigned int>::iterator bIt;
+ bool isBlack = false;
+ for (bIt = m_blackKeyPos.begin(); bIt != m_blackKeyPos.end(); ++bIt) {
+ if (*bIt == *it) {
+ isBlack = true;
+ break;
+ }
+ }
+
+ // Adjust for black note
+ //
+ if (isBlack) {
+ width = m_blackKeySize.width() - 8;
+ yPos -= 3;
+ } else {
+ // If a white note then ensure that we allow for short/tall ones
+ //
+ std::vector<unsigned int>::iterator wIt = m_whiteKeyPos.begin(), tIt;
+
+ while (wIt != m_whiteKeyPos.end()) {
+ if (*wIt == *it) {
+ tIt = wIt;
+
+ if (++tIt != m_whiteKeyPos.end()) {
+ //MATRIX_DEBUG << "WHITE KEY HEIGHT = " << *tIt - *wIt << endl;
+ if (*tIt - *wIt == _whiteKeyHeight) {
+ yPos += 2;
+ }
+
+ }
+ }
+
+ ++wIt;
+ }
+
+
+ }
+
+ m_hoverHighlight->setFixedSize(width, 4);
+ m_hoverHighlight->move(3, yPos);
+ m_hoverHighlight->show();
+
+ return ;
+ }
+ }
+ }
+
+
+}
+
+void PianoKeyboard::mouseMoveEvent(QMouseEvent* e)
+{
+ // The routine to work out where this should appear doesn't coincide with the note
+ // that we send to the sequencer - hence this is a bit pointless and crap at the moment.
+ // My own fault it's so crap but there you go.
+ //
+ // RWB (20040220)
+ //
+ MatrixView *matrixView = dynamic_cast<MatrixView*>(topLevelWidget());
+ if (matrixView) {
+ MatrixStaff *staff = matrixView->getStaff(0);
+
+ if (staff) {
+ drawHoverNote(staff->getHeightAtCanvasCoords(e->x(), e->y()));
+ }
+ }
+
+ if (e->state() & Qt::LeftButton) {
+ if (m_selecting)
+ emit keySelected(e->y(), true);
+ else
+ emit keyPressed(e->y(), true); // we're swooshing
+
+ emit keyReleased(m_lastKeyPressed, true);
+ m_lastKeyPressed = e->y();
+ } else
+ emit hoveredOverKeyChanged(e->y());
+}
+
+void PianoKeyboard::mousePressEvent(QMouseEvent *e)
+{
+ Qt::ButtonState bs = e->state();
+
+ if (e->button() == LeftButton) {
+ m_mouseDown = true;
+ m_selecting = (bs & Qt::ShiftButton);
+ m_lastKeyPressed = e->y();
+
+ if (m_selecting)
+ emit keySelected(e->y(), false);
+ else
+ emit keyPressed(e->y(), false);
+ }
+}
+
+void PianoKeyboard::mouseReleaseEvent(QMouseEvent *e)
+{
+ if (e->button() == LeftButton) {
+ m_mouseDown = false;
+ m_selecting = false;
+ emit keyReleased(e->y(), false);
+ }
+}
+
+}
+#include "PianoKeyboard.moc"
diff --git a/src/gui/editors/matrix/PianoKeyboard.h b/src/gui/editors/matrix/PianoKeyboard.h
new file mode 100644
index 0000000..e8b06bb
--- /dev/null
+++ b/src/gui/editors/matrix/PianoKeyboard.h
@@ -0,0 +1,133 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_PIANOKEYBOARD_H_
+#define _RG_PIANOKEYBOARD_H_
+
+#include "gui/rulers/PitchRuler.h"
+#include <qsize.h>
+#include <vector>
+
+
+class QWidget;
+class QPaintEvent;
+class QMouseEvent;
+class QEvent;
+
+
+namespace Rosegarden
+{
+
+
+
+class PianoKeyboard : public PitchRuler
+{
+ Q_OBJECT
+public:
+ PianoKeyboard(QWidget *parent, int keys = 88);
+
+ virtual QSize sizeHint() const;
+ virtual QSize minimumSizeHint() const;
+
+ /*
+ * We want to be able to call this from the matrix view
+ */
+ void drawHoverNote(int evPitch);
+
+signals:
+
+ /**
+ * A key has been clicked on the keyboard.
+ *
+ * The repeating flag is there to tell the MatrixView not to send
+ * the same note again as we're in the middle of a swoosh.
+ * MatrixView does the y -> Note calculation.
+ */
+ void keyPressed(unsigned int y, bool repeating);
+
+ /**
+ * A key has been clicked with the selection modifier pressed.
+ * The MatrixView will probably interpret this as meaning to
+ * select all notes of that pitch.
+ *
+ * The repeating flag is there to tell the MatrixView not to
+ * clear the selection as we're in the middle of a swoosh.
+ * MatrixView does the y -> Note calculation.
+ */
+ void keySelected(unsigned int y, bool repeating);
+
+ /**
+ * A key has been released on the keyboard.
+ *
+ * The repeating flag is there to tell the MatrixView not to send
+ * the same note again as we're in the middle of a swoosh.
+ * MatrixView does the y -> Note calculation.
+ */
+ void keyReleased(unsigned int y, bool repeating);
+
+ /**
+ * Emitted when the mouse cursor moves to a different key when
+ * not clicking or selecting.
+ * MatrixView does the y -> Note calculation.
+ */
+ void hoveredOverKeyChanged(unsigned int y);
+
+protected:
+
+ virtual void paintEvent(QPaintEvent*);
+
+ virtual void mouseMoveEvent(QMouseEvent*);
+ virtual void mousePressEvent(QMouseEvent*);
+ virtual void mouseReleaseEvent(QMouseEvent*);
+ virtual void enterEvent(QEvent *);
+ virtual void leaveEvent(QEvent *);
+
+ // compute all key positions and store them
+ //
+ void computeKeyPos();
+
+ //--------------- Data members ---------------------------------
+ QSize m_keySize;
+ QSize m_blackKeySize;
+ unsigned int m_nbKeys;
+
+ std::vector<unsigned int> m_whiteKeyPos;
+ std::vector<unsigned int> m_blackKeyPos;
+ std::vector<unsigned int> m_labelKeyPos;
+ std::vector<unsigned int> m_allKeyPos;
+
+ bool m_mouseDown;
+ bool m_selecting;
+
+ // highlight element on the keyboard
+ QWidget *m_hoverHighlight;
+ int m_lastHoverHighlight;
+ int m_lastKeyPressed;
+};
+
+
+}
+
+#endif
diff --git a/src/gui/editors/matrix/QCanvasMatrixDiamond.cpp b/src/gui/editors/matrix/QCanvasMatrixDiamond.cpp
new file mode 100644
index 0000000..582b53a
--- /dev/null
+++ b/src/gui/editors/matrix/QCanvasMatrixDiamond.cpp
@@ -0,0 +1,82 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "QCanvasMatrixDiamond.h"
+
+#include "MatrixElement.h"
+#include "QCanvasMatrixRectangle.h"
+#include <qcanvas.h>
+#include <qpainter.h>
+#include <qpointarray.h>
+#include <qpoint.h>
+
+
+namespace Rosegarden
+{
+
+QCanvasMatrixDiamond::QCanvasMatrixDiamond(MatrixElement &n,
+ QCanvas* canvas) :
+ QCanvasMatrixRectangle(n, canvas)
+{}
+
+QCanvasMatrixDiamond::~QCanvasMatrixDiamond()
+{
+ hide();
+}
+
+QPointArray QCanvasMatrixDiamond::areaPoints() const
+{
+ QPointArray pa(4);
+ int pw = (pen().width() + 1) / 2;
+ if ( pw < 1 )
+ pw = 1;
+ if ( pen() == NoPen )
+ pw = 0;
+ pa[0] = QPoint((int)x() - height() / 2 - pw, (int)y() - pw);
+ pa[1] = pa[0] + QPoint(height() + pw * 2, 0);
+ pa[2] = pa[1] + QPoint(0, height() + pw * 2);
+ pa[3] = pa[0] + QPoint(0, height() + pw * 2);
+ return pa;
+}
+
+void QCanvasMatrixDiamond::drawShape(QPainter & p)
+{
+ p.save();
+ p.setWorldXForm(false);
+
+ QPointArray pa(4);
+ int q = height() / 2 + 2;
+ QPoint mapPos = p.worldMatrix().map(QPoint(int(x()), int(y())));
+
+ pa[0] = QPoint(mapPos.x(), mapPos.y() - 3);
+ pa[1] = QPoint(mapPos.x() + q, mapPos.y() - 3 + q);
+ pa[2] = pa[0] + QPoint(0, q * 2);
+ pa[3] = pa[1] - QPoint(q * 2, 0);
+ p.drawConvexPolygon(pa);
+
+ p.restore();
+}
+
+}
diff --git a/src/gui/editors/matrix/QCanvasMatrixDiamond.h b/src/gui/editors/matrix/QCanvasMatrixDiamond.h
new file mode 100644
index 0000000..5163b12
--- /dev/null
+++ b/src/gui/editors/matrix/QCanvasMatrixDiamond.h
@@ -0,0 +1,61 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_QCANVASMATRIXDIAMOND_H_
+#define _RG_QCANVASMATRIXDIAMOND_H_
+
+#include "QCanvasMatrixRectangle.h"
+#include <qpointarray.h>
+
+
+class QPainter;
+class QCanvas;
+
+
+namespace Rosegarden
+{
+
+class MatrixElement;
+
+
+/**
+ * A QCanvas diamond shape referencing a MatrixElement
+ */
+class QCanvasMatrixDiamond : public QCanvasMatrixRectangle
+{
+public:
+ QCanvasMatrixDiamond(MatrixElement&, QCanvas *);
+ ~QCanvasMatrixDiamond();
+
+ QPointArray areaPoints() const;
+
+protected:
+ void drawShape(QPainter &);
+};
+
+
+}
+
+#endif
diff --git a/src/gui/editors/matrix/QCanvasMatrixRectangle.cpp b/src/gui/editors/matrix/QCanvasMatrixRectangle.cpp
new file mode 100644
index 0000000..a27b480
--- /dev/null
+++ b/src/gui/editors/matrix/QCanvasMatrixRectangle.cpp
@@ -0,0 +1,44 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "QCanvasMatrixRectangle.h"
+
+#include "MatrixElement.h"
+#include <qcanvas.h>
+
+
+namespace Rosegarden
+{
+
+QCanvasMatrixRectangle::QCanvasMatrixRectangle(MatrixElement& n,
+ QCanvas* canvas)
+ : QCanvasRectangle(canvas),
+ m_matrixElement(n)
+{}
+
+QCanvasMatrixRectangle::~QCanvasMatrixRectangle()
+{}
+
+}
diff --git a/src/gui/editors/matrix/QCanvasMatrixRectangle.h b/src/gui/editors/matrix/QCanvasMatrixRectangle.h
new file mode 100644
index 0000000..64b6e65
--- /dev/null
+++ b/src/gui/editors/matrix/QCanvasMatrixRectangle.h
@@ -0,0 +1,60 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_QCANVASMATRIXRECTANGLE_H_
+#define _RG_QCANVASMATRIXRECTANGLE_H_
+
+#include <qcanvas.h>
+
+
+namespace Rosegarden
+{
+
+class MatrixElement;
+
+
+/**
+ * A QCanvasRectangle referencing a MatrixElement
+ */
+class QCanvasMatrixRectangle : public QCanvasRectangle
+{
+public:
+ QCanvasMatrixRectangle(MatrixElement&, QCanvas*);
+
+ virtual ~QCanvasMatrixRectangle();
+
+ MatrixElement& getMatrixElement() { return m_matrixElement; }
+
+protected:
+ //--------------- Data members ---------------------------------
+
+ MatrixElement& m_matrixElement;
+
+};
+
+
+}
+
+#endif
diff --git a/src/gui/editors/notation/ClefInserter.cpp b/src/gui/editors/notation/ClefInserter.cpp
new file mode 100644
index 0000000..f39327e
--- /dev/null
+++ b/src/gui/editors/notation/ClefInserter.cpp
@@ -0,0 +1,132 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "ClefInserter.h"
+
+#include <klocale.h>
+#include "base/Event.h"
+#include "base/NotationTypes.h"
+#include "base/ViewElement.h"
+#include "commands/notation/ClefInsertionCommand.h"
+#include "gui/general/EditTool.h"
+#include "gui/general/LinedStaff.h"
+#include "NotationElement.h"
+#include "NotationTool.h"
+#include "NotationView.h"
+#include "NotePixmapFactory.h"
+#include <kaction.h>
+#include <qiconset.h>
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+ClefInserter::ClefInserter(NotationView* view)
+ : NotationTool("ClefInserter", view),
+ m_clef(Clef::Treble)
+{
+ QIconSet icon = QIconSet(NotePixmapFactory::toQPixmap(NotePixmapFactory::
+ makeToolbarPixmap("select")));
+ new KAction(i18n("Switch to Select Tool"), icon, 0, this,
+ SLOT(slotSelectSelected()), actionCollection(),
+ "select");
+
+ new KAction(i18n("Switch to Erase Tool"), "eraser", 0, this,
+ SLOT(slotEraseSelected()), actionCollection(),
+ "erase");
+
+ icon = QIconSet
+ (NotePixmapFactory::toQPixmap(NotePixmapFactory::
+ makeToolbarPixmap("crotchet")));
+ new KAction(i18n("Switch to Inserting Notes"), icon, 0, this,
+ SLOT(slotNotesSelected()), actionCollection(),
+ "notes");
+
+ createMenu("clefinserter.rc");
+}
+
+void ClefInserter::slotNotesSelected()
+{
+ m_nParentView->slotLastNoteAction();
+}
+
+void ClefInserter::slotEraseSelected()
+{
+ m_parentView->actionCollection()->action("erase")->activate();
+}
+
+void ClefInserter::slotSelectSelected()
+{
+ m_parentView->actionCollection()->action("select")->activate();
+}
+
+void ClefInserter::ready()
+{
+ m_nParentView->setCanvasCursor(Qt::crossCursor);
+ m_nParentView->setHeightTracking(false);
+}
+
+void ClefInserter::setClef(std::string clefType)
+{
+ m_clef = clefType;
+}
+
+void ClefInserter::handleLeftButtonPress(timeT,
+ int,
+ int staffNo,
+ QMouseEvent* e,
+ ViewElement*)
+{
+ if (staffNo < 0)
+ return ;
+ Event *clef = 0, *key = 0;
+
+ LinedStaff *staff = m_nParentView->getLinedStaff(staffNo);
+
+ NotationElementList::iterator closestElement =
+ staff->getClosestElementToCanvasCoords(e->x(), (int)e->y(),
+ clef, key, false, -1);
+
+ if (closestElement == staff->getViewElementList()->end())
+ return ;
+
+ timeT time = (*closestElement)->event()->getAbsoluteTime(); // not getViewAbsoluteTime()
+
+
+ ClefInsertionCommand *command =
+ new ClefInsertionCommand(staff->getSegment(), time, m_clef);
+
+ m_nParentView->addCommandToHistory(command);
+
+ Event *event = command->getLastInsertedEvent();
+ if (event)
+ m_nParentView->setSingleSelectedEvent(staffNo, event);
+}
+
+const QString ClefInserter::ToolName = "clefinserter";
+
+}
+#include "ClefInserter.moc"
diff --git a/src/gui/editors/notation/ClefInserter.h b/src/gui/editors/notation/ClefInserter.h
new file mode 100644
index 0000000..460bfa5
--- /dev/null
+++ b/src/gui/editors/notation/ClefInserter.h
@@ -0,0 +1,83 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_CLEFINSERTER_H_
+#define _RG_CLEFINSERTER_H_
+
+#include "base/NotationTypes.h"
+#include "NotationTool.h"
+#include <qstring.h>
+#include "base/Event.h"
+
+
+class QMouseEvent;
+
+
+namespace Rosegarden
+{
+
+class ViewElement;
+class NotationView;
+
+
+/**
+ * This tool will insert clefs on mouse click events
+ */
+class ClefInserter : public NotationTool
+{
+ Q_OBJECT
+
+ friend class NotationToolBox;
+
+public:
+ void setClef(std::string clefType);
+
+ virtual void ready();
+
+ virtual void handleLeftButtonPress(timeT,
+ int height,
+ int staffNo,
+ QMouseEvent*,
+ ViewElement* el);
+ static const QString ToolName;
+
+protected slots:
+ void slotNotesSelected();
+ void slotEraseSelected();
+ void slotSelectSelected();
+
+protected:
+ ClefInserter(NotationView*);
+
+ //--------------- Data members ---------------------------------
+
+ Clef m_clef;
+};
+
+
+
+}
+
+#endif
diff --git a/src/gui/editors/notation/FontViewFrame.cpp b/src/gui/editors/notation/FontViewFrame.cpp
new file mode 100644
index 0000000..ab0498f
--- /dev/null
+++ b/src/gui/editors/notation/FontViewFrame.cpp
@@ -0,0 +1,252 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "FontViewFrame.h"
+#include <kapplication.h>
+
+#include <klocale.h>
+#include <kmessagebox.h>
+#include <qfontmetrics.h>
+#include <qframe.h>
+#include <qsize.h>
+#include <qstring.h>
+#include <qwidget.h>
+#include <qpainter.h>
+
+#ifdef HAVE_XFT
+#include <ft2build.h>
+#include FT_FREETYPE_H
+#include FT_OUTLINE_H
+#include FT_GLYPH_H
+#include <X11/Xft/Xft.h>
+#endif
+
+namespace Rosegarden
+{
+
+FontViewFrame::FontViewFrame( int pixelSize, QWidget* parent, const char* name ) :
+ QFrame(parent, name),
+ m_fontSize(pixelSize),
+ m_tableFont(0)
+{
+ setBackgroundMode(PaletteBase);
+ setFrameStyle(Panel | Sunken);
+ setMargin(8);
+ setRow(0);
+}
+
+FontViewFrame::~FontViewFrame()
+{
+ // empty
+}
+
+void
+FontViewFrame::setFont(QString font)
+{
+ m_fontName = font;
+ loadFont();
+ update();
+}
+
+void
+FontViewFrame::loadFont()
+{
+#ifdef HAVE_XFT
+ if (m_tableFont) {
+ XftFontClose(x11AppDisplay(), (XftFont *)m_tableFont);
+ }
+ m_tableFont = 0;
+
+ static bool haveDir = false;
+ if (!haveDir) {
+ FcConfigAppFontAddDir(FcConfigGetCurrent(),
+ (const FcChar8 *)"/opt/kde3/share/apps/rosegarden/fonts");
+ haveDir = true;
+ }
+
+ FcPattern *pattern = FcPatternCreate();
+ FcPatternAddString(pattern, FC_FAMILY, (FcChar8 *)m_fontName.latin1());
+ FcPatternAddInteger(pattern, FC_PIXEL_SIZE, m_fontSize);
+
+ FcConfigSubstitute(FcConfigGetCurrent(), pattern, FcMatchPattern);
+
+ FcResult result = FcResultMatch;
+ FcPattern *match = FcFontMatch(FcConfigGetCurrent(), pattern, &result);
+ FcPatternDestroy(pattern);
+
+ if (!match || result != FcResultMatch) {
+ KMessageBox::error(this, i18n("Error: Unable to match font name %1").arg(m_fontName));
+ return ;
+ }
+
+ FcChar8 *matchFamily;
+ FcPatternGetString(match, FC_FAMILY, 0, &matchFamily);
+
+ if (QString((const char *)matchFamily).lower() != m_fontName.lower()) {
+ KMessageBox::sorry(this, i18n("Warning: No good match for font name %1 (best is %2)").
+ arg(m_fontName).arg(QString((const char *)matchFamily)));
+ m_fontName = (const char *)matchFamily;
+ }
+
+ m_tableFont = XftFontOpenPattern(x11AppDisplay(), match);
+
+ if (!m_tableFont) {
+ KMessageBox::error(this, i18n("Error: Unable to open best-match font %1").
+ arg(QString((const char *)matchFamily)));
+ }
+#endif
+}
+
+void FontViewFrame::setGlyphs(bool glyphs)
+{
+ m_glyphs = glyphs;
+ update();
+}
+
+QSize FontViewFrame::sizeHint() const
+{
+ return QSize(16 * m_fontSize * 3 / 2 + margin() + 2 * frameWidth(),
+ 16 * m_fontSize * 3 / 2 + margin() + 2 * frameWidth());
+}
+
+QSize FontViewFrame::cellSize() const
+{
+ QFontMetrics fm = fontMetrics();
+ return QSize( fm.maxWidth(), fm.lineSpacing() + 1 );
+}
+
+void FontViewFrame::paintEvent( QPaintEvent* e )
+{
+#ifdef HAVE_XFT
+ if (!m_tableFont)
+ return ;
+
+ QFrame::paintEvent(e);
+ QPainter p(this);
+
+ int ll = 25;
+ int ml = frameWidth() + margin() + ll + 1;
+ int mt = frameWidth() + margin();
+ QSize cell((width() - 16 - ml) / 17, (height() - 16 - mt) / 17);
+
+ if ( !cell.width() || !cell.height() )
+ return ;
+
+ QColor body(255, 255, 192);
+ QColor negative(255, 192, 192);
+ QColor positive(192, 192, 255);
+ QColor rnegative(255, 128, 128);
+ QColor rpositive(128, 128, 255);
+
+ Drawable drawable = (Drawable)handle();
+ XftDraw *draw = XftDrawCreate(x11AppDisplay(), drawable,
+ (Visual *)x11Visual(), x11Colormap());
+
+ QColor pen(Qt::black);
+ XftColor col;
+ col.color.red = pen.red () | pen.red() << 8;
+ col.color.green = pen.green () | pen.green() << 8;
+ col.color.blue = pen.blue () | pen.blue() << 8;
+ col.color.alpha = 0xffff;
+ col.pixel = pen.pixel();
+
+ for (int j = 0; j <= 16; j++) {
+ for (int i = 0; i <= 16; i++) {
+
+ int x = i * cell.width();
+ int y = j * cell.height();
+
+ x += ml;
+ y += mt; // plus ascent
+
+ if (i == 0) {
+ if (j == 0)
+ continue;
+ p.setFont(kapp->font());
+ QFontMetrics afm(kapp->font());
+ QString s = QString("%1").arg(m_row * 256 + (j - 1) * 16);
+ p.drawText(x - afm.width(s), y, s);
+ p.setPen(QColor(190, 190, 255));
+ p.drawLine(0, y, width(), y);
+ p.setPen(Qt::black);
+ continue;
+ } else if (j == 0) {
+ p.setFont(kapp->font());
+ QString s = QString("%1").arg(i - 1);
+ p.drawText(x, y, s);
+ p.setPen(QColor(190, 190, 255));
+ p.drawLine(x, 0, x, height());
+ p.setPen(Qt::black);
+ continue;
+ }
+
+ p.save();
+
+ if (m_glyphs) {
+ FT_UInt ui = m_row * 256 + (j - 1) * 16 + i - 1;
+ XftDrawGlyphs(draw, &col, (XftFont *)m_tableFont, x, y, &ui, 1);
+ } else {
+ FcChar32 ch = m_row * 256 + (j - 1) * 16 + i - 1;
+ if (XftCharExists(x11AppDisplay(), (XftFont *)m_tableFont, ch)) {
+ XftDrawString32(draw, &col, (XftFont *)m_tableFont, x, y, &ch, 1);
+ }
+ }
+
+ p.restore();
+ }
+ }
+#endif
+}
+
+bool
+FontViewFrame::hasRow(int r) const
+{
+#ifdef HAVE_XFT
+ if (m_glyphs) {
+
+ if (r < 256)
+ return true;
+
+ } else {
+
+ for (int c = 0; c < 256; ++c) {
+ FcChar32 ch = r * 256 + c;
+ if (XftCharExists(x11AppDisplay(), (XftFont *)m_tableFont, ch)) {
+ return true;
+ }
+ }
+ }
+#endif
+ return false;
+}
+
+void FontViewFrame::setRow(int row)
+{
+ m_row = row;
+ update();
+}
+
+}
+#include "FontViewFrame.moc"
diff --git a/src/gui/editors/notation/FontViewFrame.h b/src/gui/editors/notation/FontViewFrame.h
new file mode 100644
index 0000000..8a1a946
--- /dev/null
+++ b/src/gui/editors/notation/FontViewFrame.h
@@ -0,0 +1,77 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_FONTVIEWFRAME_H_
+#define _RG_FONTVIEWFRAME_H_
+
+#include <qframe.h>
+#include <qsize.h>
+#include <qstring.h>
+
+
+class QWidget;
+class QPaintEvent;
+
+
+namespace Rosegarden
+{
+
+
+
+class FontViewFrame : public QFrame
+{
+ Q_OBJECT
+
+public:
+ FontViewFrame(int pixelSize, QWidget *parent = 0, const char *name = 0);
+ virtual ~FontViewFrame();
+
+ QSize sizeHint() const;
+ bool hasRow(int row) const;
+
+public slots:
+ void setFont(QString name);
+ void setRow(int);
+ void setGlyphs(bool glyphs);
+
+protected:
+ QSize cellSize() const;
+ void paintEvent( QPaintEvent* );
+ void loadFont();
+
+private:
+ QString m_fontName;
+ int m_fontSize;
+ void *m_tableFont;
+ int m_row;
+ bool m_glyphs;
+};
+
+
+
+
+}
+
+#endif
diff --git a/src/gui/editors/notation/GuitarChordInserter.cpp b/src/gui/editors/notation/GuitarChordInserter.cpp
new file mode 100644
index 0000000..2482b87
--- /dev/null
+++ b/src/gui/editors/notation/GuitarChordInserter.cpp
@@ -0,0 +1,185 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "GuitarChordInserter.h"
+
+#include <klocale.h>
+#include "base/Event.h"
+#include "base/Exception.h"
+#include "base/Staff.h"
+#include "base/ViewElement.h"
+#include "commands/notation/EraseEventCommand.h"
+#include "commands/notation/GuitarChordInsertionCommand.h"
+#include "gui/general/EditTool.h"
+#include "gui/general/LinedStaff.h"
+#include "gui/editors/guitar/GuitarChordSelectorDialog.h"
+#include "misc/Debug.h"
+#include "NotationElement.h"
+#include "NotationTool.h"
+#include "NotationView.h"
+#include "NotePixmapFactory.h"
+#include <kaction.h>
+#include <qdialog.h>
+#include <qiconset.h>
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+GuitarChordInserter::GuitarChordInserter(NotationView* view)
+ : NotationTool("GuitarChordInserter", view),
+ m_guitarChordSelector(0)
+{
+ QIconSet icon = QIconSet(NotePixmapFactory::toQPixmap(NotePixmapFactory::
+ makeToolbarPixmap("select")));
+
+ new KAction(i18n("Switch to Select Tool"), icon, 0, this,
+ SLOT(slotSelectSelected()), actionCollection(),
+ "select");
+
+ new KAction(i18n("Switch to Erase Tool"), "eraser", 0, this,
+ SLOT(slotEraseSelected()), actionCollection(),
+ "erase");
+
+ icon = QIconSet
+ (NotePixmapFactory::toQPixmap(NotePixmapFactory::
+ makeToolbarPixmap("crotchet")));
+
+ new KAction(i18n("Switch to Inserting Notes"), icon, 0, this,
+ SLOT(slotNoteSelected()), actionCollection(),
+ "notes");
+
+ m_guitarChordSelector = new GuitarChordSelectorDialog(m_nParentView);
+ m_guitarChordSelector->init();
+ createMenu("guitarchordinserter.rc");
+}
+
+void GuitarChordInserter::slotGuitarChordSelected()
+{
+ // Switch to last selected Guitar Chord
+ // m_nParentView->slotLastGuitarChordAction();
+}
+
+void GuitarChordInserter::slotEraseSelected()
+{
+ m_parentView->actionCollection()->action("erase")->activate();
+}
+
+void GuitarChordInserter::slotSelectSelected()
+{
+ m_parentView->actionCollection()->action("select")->activate();
+}
+
+void GuitarChordInserter::handleLeftButtonPress(timeT,
+ int,
+ int staffNo,
+ QMouseEvent* e,
+ ViewElement *element)
+{
+ NOTATION_DEBUG << "GuitarChordInserter::handleLeftButtonPress" << endl;
+
+ if (staffNo < 0) {
+ return ;
+ }
+
+ Staff *staff = m_nParentView->getStaff(staffNo);
+
+ if (element && element->event()->isa(Guitar::Chord::EventType)) {
+ handleSelectedGuitarChord (element, staff);
+ } else {
+ createNewGuitarChord (element, staff, e);
+ }
+}
+
+bool GuitarChordInserter::processDialog( Staff* staff,
+ timeT& insertionTime)
+{
+ bool result = false;
+
+ if (m_guitarChordSelector->exec() == QDialog::Accepted) {
+ Guitar::Chord chord = m_guitarChordSelector->getChord();
+
+ GuitarChordInsertionCommand *command =
+ new GuitarChordInsertionCommand
+ (staff->getSegment(), insertionTime, chord);
+
+ m_nParentView->addCommandToHistory(command);
+ result = true;
+ }
+
+ return result;
+}
+
+void GuitarChordInserter::handleSelectedGuitarChord (ViewElement* element, Staff *staff)
+{
+ NOTATION_DEBUG << "GuitarChordInserter::handleSelectedGuitarChord" << endl;
+
+
+ // Get time of where guitar chord is inserted
+ timeT insertionTime = element->event()->getAbsoluteTime(); // not getViewAbsoluteTime()
+
+ // edit an existing guitar chord, if that's what we clicked on
+ try {
+ Guitar::Chord chord(*(element->event()));
+
+ m_guitarChordSelector->setChord(chord);
+
+ if ( processDialog( staff, insertionTime ) ) {
+ // Erase old guitar chord
+ EraseEventCommand *command =
+ new EraseEventCommand(staff->getSegment(),
+ element->event(),
+ false);
+
+ m_nParentView->addCommandToHistory(command);
+ }
+ } catch (Exception e) {}
+}
+
+void GuitarChordInserter::createNewGuitarChord (ViewElement* element, Staff *staff, QMouseEvent* e)
+{
+ NOTATION_DEBUG << "GuitarChordInserter::createNewGuitarChord" << endl;
+ Event *clef = 0, *key = 0;
+
+ LinedStaff *s = dynamic_cast<LinedStaff *>(staff);
+
+ NotationElementList::iterator closestElement =
+ s->getClosestElementToCanvasCoords(e->x(), (int)e->y(),
+ clef, key, false, -1);
+
+ if (closestElement == staff->getViewElementList()->end()) {
+ return ;
+ }
+
+ timeT insertionTime = (*closestElement)->event()->getAbsoluteTime(); // not getViewAbsoluteTime()
+
+ processDialog( staff, insertionTime );
+}
+
+const QString GuitarChordInserter::ToolName = "guitarchordinserter";
+
+}
+#include "GuitarChordInserter.moc"
diff --git a/src/gui/editors/notation/GuitarChordInserter.h b/src/gui/editors/notation/GuitarChordInserter.h
new file mode 100644
index 0000000..3bd5660
--- /dev/null
+++ b/src/gui/editors/notation/GuitarChordInserter.h
@@ -0,0 +1,96 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_GUITAR_CHORD_INSERTER_H_
+#define _RG_GUITAR_CHORD_INSERTER_H_
+
+#include "NotationTool.h"
+#include <qstring.h>
+#include "base/Event.h"
+
+
+class QMouseEvent;
+
+
+namespace Rosegarden
+{
+
+class ViewElement;
+class Staff;
+class NotationView;
+class GuitarChordSelectorDialog;
+
+/**
+ * This tool will insert guitar chord on mouse click events
+*/
+class GuitarChordInserter : public NotationTool
+{
+ Q_OBJECT
+
+ friend class NotationToolBox;
+
+public:
+
+ virtual void handleLeftButtonPress(timeT t,
+ int height,
+ int staffNo,
+ QMouseEvent* e,
+ ViewElement *element);
+
+/*
+ virtual void handleMouseDoubleClick(timeT,
+ int height, int staffNo,
+ QMouseEvent*,
+ ViewElement* el);
+*/
+
+ static const QString ToolName;
+
+protected slots:
+ void slotGuitarChordSelected();
+ void slotEraseSelected();
+ void slotSelectSelected();
+
+protected:
+ GuitarChordSelectorDialog* m_guitarChordSelector;
+
+ GuitarChordInserter(NotationView*);
+
+private:
+ void handleSelectedGuitarChord (ViewElement* element,
+ Staff *staff);
+
+ void createNewGuitarChord (ViewElement* element,
+ Staff *staff,
+ QMouseEvent* e);
+
+ bool processDialog (Staff *staff,
+ timeT& insertionTime);
+};
+
+
+}
+
+#endif
diff --git a/src/gui/editors/notation/HeadersGroup.cpp b/src/gui/editors/notation/HeadersGroup.cpp
new file mode 100644
index 0000000..c0a2de0
--- /dev/null
+++ b/src/gui/editors/notation/HeadersGroup.cpp
@@ -0,0 +1,160 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ This file is Copyright 2007-2008
+ Yves Guillemot <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include <limits>
+#include <qsize.h>
+#include <qwidget.h>
+#include <qvbox.h>
+#include <qlabel.h>
+
+#include "HeadersGroup.h"
+#include "TrackHeader.h"
+#include "NotationView.h"
+#include "NotePixmapFactory.h"
+
+
+namespace Rosegarden
+{
+
+
+HeadersGroup::
+HeadersGroup(QWidget *parent, NotationView * nv, Composition * comp) :
+ QVBox(parent),
+ m_notationView(nv),
+ m_composition(comp),
+ m_usedHeight(0),
+ m_filler(0),
+ m_lastX(INT_MIN),
+ m_lastWidth(-1)
+{
+}
+
+void
+HeadersGroup::removeAllHeaders()
+{
+ TrackHeaderVector::iterator i;
+ for (i=m_headers.begin(); i!=m_headers.end(); i++) {
+ delete *i;
+ }
+ m_headers.erase(m_headers.begin(), m_headers.end());
+
+ if (m_filler) {
+ delete m_filler;
+ m_filler = 0;
+ }
+ m_usedHeight = 0;
+ m_lastWidth = -1;
+}
+
+void
+HeadersGroup::addHeader(int trackId, int height, int ypos, double xcur)
+{
+ TrackHeader * sh = new TrackHeader(this, trackId, height, ypos);
+ m_headers.push_back(sh);
+ m_usedHeight += height;
+}
+
+void
+HeadersGroup::completeToHeight(int height)
+{
+ if (height > m_usedHeight) {
+ if (!m_filler) m_filler = new QLabel(this);
+ m_filler->setFixedHeight(height - m_usedHeight);
+ }
+}
+
+void
+HeadersGroup::slotUpdateAllHeaders(int x, int y, bool force)
+{
+ // Minimum header width
+ int headerMinWidth = m_notationView->getHeadersTopFrameMinWidth();
+
+ // Maximum header width (may be overriden by clef and key width)
+ int headerMaxWidth = (m_notationView->getCanvasVisibleWidth() * 10) / 100;
+
+ if ((x != m_lastX) || force) {
+ m_lastX = x;
+ TrackHeaderVector::iterator i;
+ int neededWidth = 0;
+
+ // Pass 1 : get the max width needed
+ for (i=m_headers.begin(); i!=m_headers.end(); i++) {
+ int w = (*i)->lookAtStaff(x, headerMaxWidth);
+ if (w > neededWidth) neededWidth = w;
+ }
+
+ if (neededWidth < headerMinWidth) neededWidth = headerMinWidth;
+
+ // Only when m_lastWidth is valid (the first time, m_lastWidth = -1)
+ if (m_lastWidth > 0) {
+ // Don't redraw the headers when change of width is very small
+ const int treshold = 10; // Treshold value should be refined ...
+ int deltaWidth = m_lastWidth - neededWidth;
+ if ((deltaWidth < treshold) && (deltaWidth > -treshold))
+ neededWidth = m_lastWidth;
+ }
+
+ // Pass 2 : redraw the headers when necessary
+ for (i=m_headers.begin(); i!=m_headers.end(); i++) {
+ (*i)->updateHeader(neededWidth);
+ }
+
+ if (neededWidth != m_lastWidth) {
+ setFixedWidth(neededWidth);
+ m_lastWidth = neededWidth;
+
+ // Suppress vertical white stripes on canvas when headers
+ // width changes while scrolling
+ /// TODO : Limit "setChanged()" to the useful part of canvas
+ m_notationView->canvas()->setAllChanged();
+ m_notationView->canvas()->update();
+ }
+ }
+}
+
+
+
+
+void
+HeadersGroup::setCurrent(TrackId trackId)
+{
+ TrackHeaderVector::iterator i;
+ for (i=m_headers.begin(); i!=m_headers.end(); i++)
+ (*i)->setCurrent((*i)->getId() == trackId);
+}
+
+void
+HeadersGroup::resizeEvent(QResizeEvent * ev)
+{
+ // Needed to avoid gray zone at the right of headers
+ // when width is decreasing
+ emit headersResized(ev->size().width());
+}
+
+}
+#include "HeadersGroup.moc"
diff --git a/src/gui/editors/notation/HeadersGroup.h b/src/gui/editors/notation/HeadersGroup.h
new file mode 100644
index 0000000..22d25da
--- /dev/null
+++ b/src/gui/editors/notation/HeadersGroup.h
@@ -0,0 +1,144 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ This file is Copyright 2007-2008
+ Yves Guillemot <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#ifndef _RG_HEADERSGROUP_H_
+#define _RG_HEADERSGROUP_H_
+
+#include "base/Track.h"
+
+#include <vector>
+#include <qsize.h>
+#include <qwidget.h>
+#include <qvbox.h>
+
+
+class QLabel;
+class QResizeEvent;
+
+
+namespace Rosegarden
+{
+
+
+class NotationView;
+class Composition;
+class TrackHeader;
+
+
+class HeadersGroup : public QVBox
+{
+ Q_OBJECT
+public:
+ /**
+ * Create an empty headers group
+ */
+ HeadersGroup(QWidget *parent, NotationView * nv, Composition * comp);
+
+ void removeAllHeaders();
+
+ void addHeader(int trackId, int height, int ypos, double xcur);
+
+ /**
+ * Resize a filler at bottom of group to set the headersGroup height
+ * to the value specified in parameter.
+ * (Used to give to the headers group exactly the same height as the
+ * canvas. Necessary to get synchronous vertical scroll.)
+ */
+ void completeToHeight(int height);
+
+ NotationView * getNotationView()
+ { return m_notationView;
+ }
+
+ Composition * getComposition()
+ { return m_composition;
+ }
+
+ /**
+ * Return the total height of all the headers (without the filler).
+ */
+ int getUsedHeight()
+ { return m_usedHeight;
+ }
+
+ /**
+ * Highlight as "current" the header of the specified track.
+ */
+ void setCurrent(TrackId trackId);
+
+ /**
+ * Highlight as "current" the header of the specified track.
+ */
+ int getWidth()
+ {
+ return m_lastWidth;
+ }
+
+ typedef enum { ShowNever, ShowWhenNeeded, ShowAlways } ShowHeadersModeType;
+
+ // Used to ensure to have one default value and only one.
+ static const ShowHeadersModeType DefaultShowMode = ShowAlways;
+
+ // Useful in configuration dialog.
+ static bool isValidShowMode(int mode)
+ {
+ return ((mode >= ShowNever) && (mode <= ShowAlways));
+ }
+
+public slots :
+ /**
+ * Called when notation canvas moves.
+ * Setting force to true forces the headers to be redrawn even
+ * if x has not changed since the last call.
+ */
+ void slotUpdateAllHeaders(int x, int y, bool force = false);
+
+signals :
+ void headersResized(int newWidth);
+
+private:
+ void resizeEvent(QResizeEvent * ev);
+
+ NotationView * m_notationView;
+ Composition * m_composition;
+
+ typedef std::vector<TrackHeader *> TrackHeaderVector;
+ TrackHeaderVector m_headers;
+
+ int m_usedHeight;
+ QLabel * m_filler;
+ int m_lastX;
+ int m_lastWidth;
+
+};
+
+
+}
+
+#endif
diff --git a/src/gui/editors/notation/NotationCanvasView.cpp b/src/gui/editors/notation/NotationCanvasView.cpp
new file mode 100644
index 0000000..55e63ac
--- /dev/null
+++ b/src/gui/editors/notation/NotationCanvasView.cpp
@@ -0,0 +1,485 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "NotationCanvasView.h"
+#include "misc/Debug.h"
+
+#include "misc/Strings.h"
+#include "gui/general/LinedStaffManager.h"
+#include "gui/general/RosegardenCanvasView.h"
+#include "gui/kdeext/QCanvasGroupableItem.h"
+#include "gui/kdeext/QCanvasSimpleSprite.h"
+#include "NotationElement.h"
+#include "NotationProperties.h"
+#include "NotationStaff.h"
+#include <qcanvas.h>
+#include <qcolor.h>
+#include <qpainter.h>
+#include <qpen.h>
+#include <qpoint.h>
+#include <qrect.h>
+#include <qsize.h>
+#include <qstring.h>
+#include <qwidget.h>
+
+
+namespace Rosegarden
+{
+
+NotationCanvasView::NotationCanvasView(const LinedStaffManager &staffmgr,
+ QCanvas *viewing, QWidget *parent,
+ const char *name, WFlags f) :
+ RosegardenCanvasView(viewing, parent, name, f),
+ m_linedStaffManager(staffmgr),
+ m_lastYPosNearStaff(0),
+ m_currentStaff(0),
+ m_currentHeight( -1000),
+ m_legerLineOffset(false),
+ m_heightTracking(false)
+{
+ // -- switching mandolin-sonatina first staff to page mode:
+ // default params (I think 16,100): render 1000ms position 1070ms
+ // 64,100: 1000ms 980ms
+ // 8, 100: 1140ms 1140ms
+ // 128, 100: 1060ms 980ms
+ // 256, 100: 1060ms 980ms / 930ms 920ms
+
+ // canvas()->retune(256, 100);
+
+ viewport()->setMouseTracking(true);
+
+ m_heightMarker = new QCanvasItemGroup(viewing);
+
+ m_vert1 = new QCanvasLineGroupable(viewing, m_heightMarker);
+ m_vert1->setPoints(0, 0, 0, 8);
+ m_vert1->setPen(QPen(QColor(64, 64, 64), 1));
+
+ m_vert2 = new QCanvasLineGroupable(viewing, m_heightMarker);
+ m_vert2->setPoints(17, 0, 17, 8);
+ m_vert2->setPen(QPen(QColor(64, 64, 64), 1));
+
+ m_heightMarker->hide();
+}
+
+NotationCanvasView::~NotationCanvasView()
+{
+ // All canvas items are deleted in ~NotationView()
+}
+
+void
+NotationCanvasView::setHeightTracking(bool t)
+{
+ m_heightTracking = t;
+ if (!t) {
+ m_heightMarker->hide();
+ canvas()->update();
+ }
+}
+
+void
+NotationCanvasView::contentsMouseReleaseEvent(QMouseEvent *e)
+{
+ emit mouseReleased(e);
+}
+
+void
+NotationCanvasView::contentsMouseMoveEvent(QMouseEvent *e)
+{
+ NotationStaff *prevStaff = m_currentStaff;
+ int prevHeight = m_currentHeight;
+
+ m_currentStaff = dynamic_cast<NotationStaff *>
+ (m_linedStaffManager.getStaffForCanvasCoords(e->x(), e->y()));
+
+ if (!m_currentStaff) {
+
+ emit hoveredOverNoteChanged(QString::null);
+ if (prevStaff) {
+ m_heightMarker->hide();
+ canvas()->update();
+ }
+
+ } else {
+
+ m_currentHeight = m_currentStaff->getHeightAtCanvasCoords(e->x(), e->y());
+
+ int x = e->x() - 8; // magic based on mouse cursor size
+ bool needUpdate = (m_heightTracking && (m_heightMarker->x() != x));
+ m_heightMarker->setX(x);
+
+ if (prevStaff != m_currentStaff ||
+ prevHeight != m_currentHeight) {
+
+ if (m_heightTracking) {
+ setHeightMarkerHeight(e);
+ m_heightMarker->show();
+ needUpdate = true;
+ }
+
+ emit hoveredOverNoteChanged
+ (strtoqstr
+ (m_currentStaff->getNoteNameAtCanvasCoords(e->x(), e->y())));
+ }
+
+ if (needUpdate)
+ canvas()->update();
+ }
+
+ NotationElement *elt = getElementAtXCoord(e);
+ if (elt) {
+ emit hoveredOverAbsoluteTimeChanged(elt->getViewAbsoluteTime());
+ }
+
+ // if(tracking) ??
+ emit mouseMoved(e);
+}
+
+void NotationCanvasView::contentsMousePressEvent(QMouseEvent *e)
+{
+ NOTATION_DEBUG << "NotationCanvasView::contentsMousePressEvent() - btn : "
+ << e->button() << " - state : " << e->state()
+ << endl;
+
+ QCanvasItemList itemList = canvas()->collisions(e->pos());
+
+ // We don't want to use m_currentStaff/Height, because we want
+ // to make sure the event happens at the point we clicked at
+ // rather than the last point for which contentsMouseMoveEvent
+ // happened to be called
+
+ NotationStaff *staff = dynamic_cast<NotationStaff *>
+ (m_linedStaffManager.getStaffForCanvasCoords(e->x(), e->y()));
+
+ QCanvasItemList::Iterator it;
+ NotationElement *clickedNote = 0;
+ NotationElement *clickedVagueNote = 0;
+ NotationElement *clickedNonNote = 0;
+
+ bool haveClickHeight = false;
+ int clickHeight = 0;
+ if (staff) {
+ clickHeight = staff->getHeightAtCanvasCoords(e->x(), e->y());
+ haveClickHeight = true;
+ }
+
+ for (it = itemList.begin(); it != itemList.end(); ++it) {
+
+ if ((*it)->active()) {
+ emit activeItemPressed(e, *it);
+ return ;
+ }
+
+ QCanvasNotationSprite *sprite =
+ dynamic_cast<QCanvasNotationSprite*>(*it);
+ if (!sprite) {
+ if (dynamic_cast<QCanvasNonElementSprite *>(*it)) {
+ emit nonNotationItemPressed(e, *it);
+ return ;
+ } else if (dynamic_cast<QCanvasText *>(*it)) {
+ emit textItemPressed(e, *it);
+ return ;
+ }
+ continue;
+ }
+
+ NotationElement &el = sprite->getNotationElement();
+
+ // #957364 (Notation: Hard to select upper note in chords of
+ // seconds) -- adjust x-coord for shifted note head
+
+ double cx = el.getCanvasX();
+ int nbw = 10;
+
+ if (staff) {
+ nbw = staff->getNotePixmapFactory(false).getNoteBodyWidth();
+ bool shifted = false;
+
+ if (el.event()->get
+ <Bool>
+ (staff->getProperties().NOTE_HEAD_SHIFTED, shifted) && shifted) {
+ cx += nbw;
+ }
+ }
+
+ if (el.isNote() && haveClickHeight) {
+ long eventHeight = 0;
+ if (el.event()->get
+ <Int>
+ (NotationProperties::HEIGHT_ON_STAFF, eventHeight)) {
+
+ if (eventHeight == clickHeight) {
+
+ if (!clickedNote &&
+ e->x() >= cx &&
+ e->x() <= cx + nbw) {
+ clickedNote = &el;
+ } else if (!clickedVagueNote &&
+ e->x() >= cx - 2 &&
+ e->x() <= cx + nbw + 2) {
+ clickedVagueNote = &el;
+ }
+
+ } else if (eventHeight - 1 == clickHeight ||
+ eventHeight + 1 == clickHeight) {
+ if (!clickedVagueNote)
+ clickedVagueNote = &el;
+ }
+ }
+ } else if (!el.isNote()) {
+ if (!clickedNonNote)
+ clickedNonNote = &el;
+ }
+ }
+
+ int staffNo = -1;
+ if (staff)
+ staffNo = staff->getId();
+
+ if (clickedNote)
+ handleMousePress(clickHeight, staffNo, e, clickedNote);
+ else if (clickedNonNote)
+ handleMousePress(clickHeight, staffNo, e, clickedNonNote);
+ else if (clickedVagueNote)
+ handleMousePress(clickHeight, staffNo, e, clickedVagueNote);
+ else
+ handleMousePress(clickHeight, staffNo, e);
+}
+
+void NotationCanvasView::contentsMouseDoubleClickEvent(QMouseEvent* e)
+{
+ NOTATION_DEBUG << "NotationCanvasView::contentsMouseDoubleClickEvent()\n";
+
+ contentsMousePressEvent(e);
+}
+
+void
+NotationCanvasView::processActiveItems(QMouseEvent* e,
+ QCanvasItemList itemList)
+{
+ QCanvasItem* pressedItem = 0;
+ QCanvasItemList::Iterator it;
+
+ for (it = itemList.begin(); it != itemList.end(); ++it) {
+
+ QCanvasItem *item = *it;
+ if (item->active() && !pressedItem) {
+ NOTATION_DEBUG << "mousepress : got active item\n";
+ pressedItem = item;
+ }
+ }
+
+ if (pressedItem)
+ emit activeItemPressed(e, pressedItem);
+
+}
+
+void
+NotationCanvasView::handleMousePress(int height,
+ int staffNo,
+ QMouseEvent *e,
+ NotationElement *el)
+{
+ NOTATION_DEBUG << "NotationCanvasView::handleMousePress() at height "
+ << height << endl;
+
+ emit itemPressed(height, staffNo, e, el);
+}
+
+bool
+NotationCanvasView::posIsTooFarFromStaff(const QPoint &pos)
+{
+ // return true if pos.y is more than m_staffLineThreshold away from
+ // the last pos for which a collision was detected
+ //
+ return (pos.y() > m_lastYPosNearStaff) ?
+ (pos.y() - m_lastYPosNearStaff) > (int)m_staffLineThreshold :
+ (m_lastYPosNearStaff - pos.y()) > (int)m_staffLineThreshold;
+
+}
+
+int
+NotationCanvasView::getLegerLineCount(int height, bool &offset)
+{
+ //!!! This is far too specifically notation-related to be here, really
+
+ if (height < 0) {
+
+ offset = (( -height % 2) == 1);
+ return height / 2;
+
+ } else if (height > 8) {
+
+ offset = ((height % 2) == 1);
+ return (height - 8) / 2;
+ }
+
+ return 0;
+}
+
+void
+NotationCanvasView::setHeightMarkerHeight(QMouseEvent *e)
+{
+ NotationStaff *staff = dynamic_cast<NotationStaff *>
+ (m_linedStaffManager.getStaffForCanvasCoords(e->x(), e->y()));
+
+ int height = staff->getHeightAtCanvasCoords(e->x(), e->y());
+ int lineY = staff->getCanvasYForHeight(height, e->x(), e->y());
+
+ // NOTATION_DEBUG << "NotationCanvasView::setHeightMarkerHeight: "
+ // << e->y() << " snapped to line -> " << lineY
+ // << " (height " << height << ")" << endl;
+
+ int spacing = staff->getLineSpacing() - 1;
+
+ m_staffLineThreshold = spacing;
+ m_vert1->setPoints(0, -spacing / 2, 0, spacing / 2);
+ m_vert2->setPoints(17, -spacing / 2, 17, spacing / 2); // magic based on mouse cursor size
+ m_heightMarker->setY(lineY);
+
+ bool legerLineOffset = false;
+ int legerLineCount = getLegerLineCount(height, legerLineOffset);
+
+ if (legerLineCount != (int)m_legerLines.size() ||
+ legerLineOffset != m_legerLineOffset) {
+
+ bool above = false;
+ if (legerLineCount < 0) {
+ above = true;
+ legerLineCount = -legerLineCount;
+ }
+
+ int i;
+ for (i = 0; i < (int)m_legerLines.size(); ++i) {
+ delete m_legerLines[i];
+ }
+ m_legerLines.clear();
+
+ for (i = 0; i < legerLineCount; ++i) {
+
+ QCanvasLineGroupable *line =
+ new QCanvasLineGroupable(canvas(), m_heightMarker);
+
+ line->setPen(QPen(QColor(64, 64, 64), 1));
+
+ int y = (int)m_heightMarker->y() +
+ (above ? -1 : 1) * (i * (spacing + 1));
+ int x = (int)m_heightMarker->x() + 1;
+
+ if (legerLineOffset) {
+ if (above)
+ y -= spacing / 2 + 1;
+ else
+ y += spacing / 2;
+ }
+
+ line->setPoints(x, y, x + 15, y); // magic based on mouse cursor size
+ m_legerLines.push_back(line);
+ }
+
+ m_legerLineOffset = legerLineOffset;
+ }
+}
+
+NotationElement *
+NotationCanvasView::getElementAtXCoord(QMouseEvent *e) // any old element
+{
+ QRect threshold(e->pos(), QSize(4, 100)); //!!!
+ threshold.moveCenter(e->pos());
+
+ QCanvasItemList itemList = canvas()->collisions(threshold);
+
+ QCanvasItemList::Iterator it;
+ QCanvasNotationSprite* sprite = 0;
+
+ for (it = itemList.begin(); it != itemList.end(); ++it)
+ {
+
+ QCanvasItem *item = *it;
+
+ if ((sprite = dynamic_cast<QCanvasNotationSprite*>(item))) {
+ return & (sprite->getNotationElement());
+ }
+ }
+
+ return 0;
+}
+
+void
+NotationCanvasView::viewportPaintEvent(QPaintEvent *e)
+{
+ int cx(e->rect().x()),
+ cy(e->rect().y()),
+ cw(e->rect().width()) /*,
+ ch(e->rect().height())*/;
+ // NOTATION_DEBUG << "NotationCanvasView::viewportPaintEvent: (" << cx << ","
+ // << cy << ") size (" << cw << "x" << ch << ")" << endl;
+ QCanvasView::viewportPaintEvent(e);
+
+ cx += contentsX();
+ cy += contentsY();
+ m_lastRender = e->rect();
+ emit renderRequired(std::min(contentsX(), cx),
+ std::max(contentsX() + visibleWidth(), cx + cw));
+}
+
+void
+NotationCanvasView::drawContents(QPainter *p, int cx, int cy, int cw, int ch)
+{
+ /*
+ m_lastRender = QRect(cx, cy, cw, ch);
+ NOTATION_DEBUG << "NotationCanvasView::drawContents: (" << cx << ","
+ << cy << ") size (" << cw << "x" << ch << ")" << endl;
+ */
+ QCanvasView::drawContents(p, cx, cy, cw, ch);
+ /*
+ emit renderRequired(std::min(contentsX(), cx),
+ std::max(contentsX() + visibleWidth(), cx + cw));
+ */
+}
+
+void
+NotationCanvasView::slotRenderComplete()
+{
+ /* QPainter painter(viewport());
+ int cx(m_lastRender.x()),
+ cy(m_lastRender.y()),
+ cw(m_lastRender.width()),
+ ch(m_lastRender.height());
+ NOTATION_DEBUG << "NotationCanvasView::slotRenderComplete: (" << cx << ","
+ << cy << ") size (" << cw << "x" << ch << ")" << endl;
+ QCanvasView::drawContents(&painter, cx, cy, cw, ch);
+ */
+ QPaintEvent ev(m_lastRender);
+ QCanvasView::viewportPaintEvent(&ev);
+}
+
+void
+NotationCanvasView::slotExternalWheelEvent(QWheelEvent* e)
+{
+ wheelEvent(e);
+}
+
+}
+#include "NotationCanvasView.moc"
diff --git a/src/gui/editors/notation/NotationCanvasView.h b/src/gui/editors/notation/NotationCanvasView.h
new file mode 100644
index 0000000..5c88fb0
--- /dev/null
+++ b/src/gui/editors/notation/NotationCanvasView.h
@@ -0,0 +1,218 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_NOTATIONCANVASVIEW_H_
+#define _RG_NOTATIONCANVASVIEW_H_
+
+#include "gui/general/RosegardenCanvasView.h"
+#include <qrect.h>
+#include <vector>
+
+
+class QWidget;
+class QString;
+class QPoint;
+class QPaintEvent;
+class QPainter;
+class QMouseEvent;
+class QCanvasLineGroupable;
+class QCanvasItemGroup;
+class QCanvasItem;
+class QCanvas;
+
+
+namespace Rosegarden
+{
+
+class NotationStaff;
+class NotationElement;
+class LinedStaffManager;
+
+
+/**
+ * Central widget for the NotationView window
+ *
+ * This class only takes care of the event handling
+ * (see the various signals).
+ *
+ * It does not deal with any canvas element. All elements are added by
+ * the NotationView.
+ *
+ *@see NotationView
+ */
+
+class NotationCanvasView : public RosegardenCanvasView
+{
+ Q_OBJECT
+
+public:
+ NotationCanvasView(const LinedStaffManager &staffmgr,
+ QCanvas *viewing, QWidget *parent=0,
+ const char *name=0, WFlags f=0);
+
+ ~NotationCanvasView();
+
+ void setHeightTracking(bool t);
+
+signals:
+
+ /**
+ * Emitted when the user clicks on a staff (e.g. mouse button press)
+ * \a pitch is set to the MIDI pitch on which the click occurred
+ * \a staffNo is set to the staff on which the click occurred
+ * \a point is set to the coordinates of the click event
+ * \a el points to the NotationElement which was clicked on, if any
+ */
+ void itemPressed(int pitch, int staffNo,
+ QMouseEvent*,
+ NotationElement* el);
+
+ /**
+ * Emitted when the user clicks on a QCanvasItem which is active
+ *
+ * @see QCanvasItem#setActive
+ */
+ void activeItemPressed(QMouseEvent*,
+ QCanvasItem* item);
+
+ /**
+ * Emitted when the user clicks on a QCanvasItem which is neither
+ * active nor a notation element
+ */
+ void nonNotationItemPressed(QMouseEvent *,
+ QCanvasItem *);
+
+ /**
+ * Emitted when the user clicks on a QCanvasItem which is a
+ * plain QCanvasText
+ */
+ void textItemPressed(QMouseEvent *,
+ QCanvasItem *);
+
+ /**
+ * Emitted when the mouse cursor moves to a different height
+ * on the staff
+ *
+ * \a noteName contains the MIDI name of the corresponding note
+ */
+ void hoveredOverNoteChanged(const QString &noteName);
+
+ /**
+ * Emitted when the mouse cursor moves to a note which is at a
+ * different time
+ *
+ * \a time is set to the absolute time of the note the cursor is
+ * hovering on
+ */
+ void hoveredOverAbsoluteTimeChanged(unsigned int time);
+
+ /**
+ * Emitted when the mouse cursor moves (used by the selection tool)
+ */
+ void mouseMoved(QMouseEvent*);
+
+ /**
+ * Emitted when the mouse button is released
+ */
+ void mouseReleased(QMouseEvent*);
+
+ /**
+ * Emitted when a region is about to be drawn by the canvas view.
+ * Indicates that any on-demand rendering for that region should
+ * be carried out.
+ */
+ void renderRequired(double cx0, double cx1);
+
+public slots:
+ void slotRenderComplete();
+
+ void slotExternalWheelEvent(QWheelEvent* e);
+
+protected:
+
+ virtual void viewportPaintEvent(QPaintEvent *e);
+ virtual void drawContents(QPainter *p, int cx, int cy, int cw, int ch);
+
+ const LinedStaffManager &m_linedStaffManager;
+
+ /**
+ * Callback for a mouse button press event in the canvas
+ */
+ virtual void contentsMousePressEvent(QMouseEvent*);
+
+ /**
+ * Callback for a mouse button release event in the canvas
+ */
+ virtual void contentsMouseReleaseEvent(QMouseEvent*);
+
+ /**
+ * Callback for a mouse move event in the canvas
+ */
+ virtual void contentsMouseMoveEvent(QMouseEvent*);
+
+ /**
+ * Callback for a mouse double click event in the canvas
+ */
+ virtual void contentsMouseDoubleClickEvent(QMouseEvent*);
+
+ void processActiveItems(QMouseEvent*, QCanvasItemList);
+
+ void handleMousePress(int height, int staffNo,
+ QMouseEvent*,
+ NotationElement* pressedNotationElement = 0);
+
+ bool posIsTooFarFromStaff(const QPoint &pos);
+
+ int getLegerLineCount(int height, bool &offset);
+
+ void setHeightMarkerHeight(QMouseEvent *e);
+
+ NotationElement *getElementAtXCoord(QMouseEvent *e);
+
+ //--------------- Data members ---------------------------------
+
+ int m_lastYPosNearStaff;
+
+ unsigned int m_staffLineThreshold;
+
+ NotationStaff *m_currentStaff;
+ int m_currentHeight;
+
+ QCanvasItemGroup *m_heightMarker;
+ QCanvasLineGroupable *m_vert1;
+ QCanvasLineGroupable *m_vert2;
+ std::vector<QCanvasLineGroupable *> m_legerLines;
+ bool m_legerLineOffset;
+
+ bool m_heightTracking;
+
+ QRect m_lastRender;
+};
+
+
+
+}
+
+#endif
diff --git a/src/gui/editors/notation/NotationChord.cpp b/src/gui/editors/notation/NotationChord.cpp
new file mode 100644
index 0000000..7b0a263
--- /dev/null
+++ b/src/gui/editors/notation/NotationChord.cpp
@@ -0,0 +1,335 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "NotationChord.h"
+
+#include "base/Sets.h"
+#include "base/Event.h"
+#include "base/NotationRules.h"
+#include "base/NotationTypes.h"
+#include "base/Quantizer.h"
+#include "NotationProperties.h"
+#include "NoteStyleFactory.h"
+
+namespace Rosegarden
+{
+
+template <>
+Event *
+AbstractSet<NotationElement, NotationElementList>::getAsEvent(const NotationElementList::iterator &i)
+{
+ return (*i)->event();
+}
+
+NotationChord::NotationChord(NotationElementList &c,
+ NotationElementList::iterator i,
+ const Quantizer *quantizer,
+ const NotationProperties &properties,
+ const Clef &clef,
+ const ::Rosegarden::Key &key) :
+ GenericChord < NotationElement,
+ NotationElementList, true > (c, i, quantizer,
+ NotationProperties::STEM_UP),
+ m_properties(properties),
+ m_clef(clef),
+ m_key(key)
+{
+ // nothing else
+}
+
+int
+NotationChord::getHeight(const Iterator &i) const
+{
+ //!!! We use HEIGHT_ON_STAFF in preference to the passed clef/key,
+ //but what if the clef/key changed since HEIGHT_ON_STAFF was
+ //written? Who updates the properties then? Check this.
+
+ long h = 0;
+ if (getAsEvent(i)->get
+ <Int>(NotationProperties::HEIGHT_ON_STAFF, h)) {
+ return h;
+ }
+
+ try {
+ Pitch pitch(*getAsEvent(i));
+ h = pitch.getHeightOnStaff(m_clef, m_key);
+ } catch (...) {
+ // no pitch!
+ }
+
+ // set non-persistent, not setMaybe, as we know the property is absent:
+ getAsEvent(i)->set
+ <Int>(NotationProperties::HEIGHT_ON_STAFF, h, false);
+ return h;
+}
+
+bool
+NotationChord::hasStem() const
+{
+ // true if any of the notes is stemmed
+
+ Iterator i(getInitialNote());
+ for (;;) {
+ long note;
+ if (!getAsEvent(i)->get
+ <Int>(BaseProperties::NOTE_TYPE, note)) return true;
+ if (NoteStyleFactory::getStyleForEvent(getAsEvent(i))->hasStem(note))
+ return true;
+ if (i == getFinalNote())
+ return false;
+ ++i;
+ }
+ return false;
+}
+
+bool
+NotationChord::hasStemUp() const
+{
+ NotationRules rules;
+
+ // believe anything found in any of the notes, if in a persistent
+ // property or a property apparently set by the beaming algorithm
+
+ Iterator i(getInitialNote());
+
+ for (;;) {
+ Event *e = getAsEvent(i);
+ /*!!!
+ if (e->has(m_properties.VIEW_LOCAL_STEM_UP)) {
+ return e->get<Bool>(m_properties.VIEW_LOCAL_STEM_UP);
+ }
+ */
+ if (e->has(NotationProperties::STEM_UP)) {
+ return e->get
+ <Bool>(NotationProperties::STEM_UP);
+ }
+
+ if (e->has(NotationProperties::BEAM_ABOVE)) {
+ if (e->has(NotationProperties::BEAMED) &&
+ e->get
+ <Bool>(NotationProperties::BEAMED)) {
+ return e->get
+ <Bool>(NotationProperties::BEAM_ABOVE);
+ }
+ else {
+ return !e->get
+ <Bool>(NotationProperties::BEAM_ABOVE);
+ }
+ }
+
+ if (i == getFinalNote())
+ break;
+ ++i;
+ }
+
+ return rules.isStemUp(getHighestNoteHeight(),getLowestNoteHeight());
+}
+
+bool
+NotationChord::hasNoteHeadShifted() const
+{
+ int ph = 10000;
+
+ for (unsigned int i = 0; i < size(); ++i) {
+ int h = getHeight((*this)[i]);
+ if (h == ph + 1)
+ return true;
+ ph = h;
+ }
+
+ return false;
+}
+
+bool
+NotationChord::isNoteHeadShifted(const Iterator &itr) const
+{
+ unsigned int i;
+ for (i = 0; i < size(); ++i) {
+ if ((*this)[i] == itr)
+ break;
+ }
+
+ if (i == size()) {
+ std::cerr << "NotationChord::isNoteHeadShifted: Warning: Unable to find note head " << getAsEvent(itr) << std::endl;
+ return false;
+ }
+
+ int h = getHeight((*this)[i]);
+
+ if (hasStemUp()) {
+ if ((i > 0) && (h == getHeight((*this)[i - 1]) + 1)) {
+ return (!isNoteHeadShifted((*this)[i - 1]));
+ }
+ } else {
+ if ((i < size() - 1) && (h == getHeight((*this)[i + 1]) - 1)) {
+ return (!isNoteHeadShifted((*this)[i + 1]));
+ }
+ }
+
+ return false;
+}
+
+void
+NotationChord::applyAccidentalShiftProperties()
+{
+ // Some rules:
+ //
+ // The top accidental always gets the minimum shift (i.e. normally
+ // right next to the note head or stem).
+ //
+ // The bottom accidental gets the next least: the same, if the
+ // interval is more than a sixth, or the next shift out otherwise.
+ //
+ // We then progress up from the bottom accidental upwards.
+ //
+ // These rules aren't really enough, but they might do for now!
+
+ //!!! Uh-oh... we have a catch-22 here. We can't determine the
+ // proper minimum shift until we know which way the stem goes,
+ // because if we have a shifted note head and the stem goes down,
+ // we need to shift one place further than otherwise. But we
+ // don't know for sure which way the stem goes until we've
+ // calculated the beam, and we don't do that until after we've
+ // worked out the x-coordinates based on (among other things) the
+ // accidental shift.
+
+ int minShift = 0;
+ bool extra = false;
+
+ if (!hasStemUp() && hasNoteHeadShifted()) {
+ minShift = 1; // lazy
+ extra = true;
+ }
+
+ int lastShift = minShift;
+ int lastHeight = 0, maxHeight = 999;
+ int lastWidth = 1;
+
+ for (iterator i = end(); i != begin(); ) {
+
+ --i;
+ Event *e = getAsEvent(*i);
+
+ Accidental acc;
+ if (e->get
+ <String>(m_properties.DISPLAY_ACCIDENTAL, acc) &&
+ acc != Accidentals::NoAccidental) {
+ e->setMaybe<Int>(m_properties.ACCIDENTAL_SHIFT, minShift);
+ e->setMaybe<Bool>(m_properties.ACCIDENTAL_EXTRA_SHIFT, extra);
+ maxHeight = lastHeight = getHeight(*i);
+ break;
+ }
+ }
+
+ if (maxHeight == 999) {
+ return ;
+ }
+
+ for (iterator i = begin(); i != end(); ++i) {
+
+ Event *e = getAsEvent(*i);
+ int height = getHeight(*i);
+
+ if (height == maxHeight && e->has(m_properties.ACCIDENTAL_SHIFT)) {
+ // finished -- we've come around to the highest one again
+ break;
+ }
+
+ Accidental acc;
+
+ if (e->get
+ <String>(m_properties.DISPLAY_ACCIDENTAL, acc) &&
+ acc != Accidentals::NoAccidental) {
+
+ int shift = lastShift;
+
+ if (height < lastHeight) { // lastHeight was the first, up top
+ if (lastHeight - height < 6) {
+ shift = lastShift + lastWidth;
+ }
+ } else {
+ if (height - lastHeight >= 6) {
+ if (maxHeight - height >= 6) {
+ shift = minShift;
+ } else {
+ shift = minShift + 1;
+ }
+ } else {
+ shift = lastShift + lastWidth;
+ }
+ }
+
+ e->setMaybe<Int>(m_properties.ACCIDENTAL_SHIFT, shift);
+
+ lastHeight = height;
+ lastShift = shift;
+
+ lastWidth = 1;
+ bool c = false;
+ if (e->get
+ <Bool>(m_properties.DISPLAY_ACCIDENTAL_IS_CAUTIONARY, c)
+ && c) {
+ lastWidth = 2;
+ }
+ }
+ }
+}
+
+int
+NotationChord::getMaxAccidentalShift(bool &extra) const
+{
+ int maxShift = 0;
+
+ for (const_iterator i = begin(); i != end(); ++i) {
+ Event *e = getAsEvent(*i);
+ if (e->has(m_properties.ACCIDENTAL_SHIFT)) {
+ int shift = e->get
+ <Int>(m_properties.ACCIDENTAL_SHIFT);
+ if (shift > maxShift) {
+ maxShift = shift;
+ e->get
+ <Bool>(m_properties.ACCIDENTAL_EXTRA_SHIFT, extra);
+ }
+ }
+ }
+
+ return maxShift;
+}
+
+int
+NotationChord::getAccidentalShift(const Iterator &i, bool &extra) const
+{
+ if (getAsEvent(i)->has(m_properties.ACCIDENTAL_SHIFT)) {
+ int shift = getAsEvent(i)->get
+ <Int>(m_properties.ACCIDENTAL_SHIFT);
+ getAsEvent(i)->get
+ <Bool>(m_properties.ACCIDENTAL_EXTRA_SHIFT, extra);
+ return shift;
+ } else {
+ return 0;
+ }
+}
+
+}
diff --git a/src/gui/editors/notation/NotationChord.h b/src/gui/editors/notation/NotationChord.h
new file mode 100644
index 0000000..7ce12fd
--- /dev/null
+++ b/src/gui/editors/notation/NotationChord.h
@@ -0,0 +1,90 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_NOTATIONCHORD_H_
+#define _RG_NOTATIONCHORD_H_
+
+#include "base/NotationTypes.h"
+#include "base/Sets.h"
+#include "NotationElement.h"
+
+class Iterator;
+
+
+namespace Rosegarden
+{
+
+class Quantizer;
+class NotationProperties;
+
+
+class NotationChord : public GenericChord<NotationElement,
+ NotationElementList,
+ true>
+{
+public:
+ NotationChord(NotationElementList &c,
+ NotationElementList::iterator i,
+ const Quantizer *quantizer,
+ const NotationProperties &properties,
+ const Clef &clef = Clef::DefaultClef,
+ const Key &key = Key::DefaultKey);
+
+ virtual ~NotationChord() { }
+
+ virtual int getHighestNoteHeight() const {
+ return getHeight(getHighestNote());
+ }
+ virtual int getLowestNoteHeight() const {
+ return getHeight(getLowestNote());
+ }
+
+ virtual bool hasStem() const;
+ virtual bool hasStemUp() const;
+
+ virtual bool hasNoteHeadShifted() const;
+ virtual bool isNoteHeadShifted(const NotationElementList::iterator &itr)
+ const;
+
+ void applyAccidentalShiftProperties();
+
+ virtual int getMaxAccidentalShift(bool &extra) const;
+ virtual int getAccidentalShift(const NotationElementList::iterator &itr,
+ bool &extra) const;
+
+protected:
+ const NotationProperties &m_properties;
+ Clef m_clef;
+ Key m_key;
+
+
+ int getHeight(const Iterator&) const;
+};
+
+
+
+}
+
+#endif
diff --git a/src/gui/editors/notation/NotationElement.cpp b/src/gui/editors/notation/NotationElement.cpp
new file mode 100644
index 0000000..7df1cd5
--- /dev/null
+++ b/src/gui/editors/notation/NotationElement.cpp
@@ -0,0 +1,198 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "NotationElement.h"
+#include "misc/Debug.h"
+
+#include "base/BaseProperties.h"
+#include "base/Event.h"
+#include "base/Exception.h"
+#include "base/NotationTypes.h"
+#include "base/ViewElement.h"
+
+#include <qcanvas.h>
+
+namespace Rosegarden
+{
+
+NotationElement::NotationElement(Event *event)
+ : ViewElement(event),
+ m_recentlyRegenerated(false),
+ m_isColliding(false),
+ m_canvasItem(0),
+ m_extraItems(0)
+{
+ // NOTATION_DEBUG << "new NotationElement "
+ // << this << " wrapping " << event << endl;
+}
+
+NotationElement::~NotationElement()
+{
+ removeCanvasItem();
+}
+
+timeT
+NotationElement::getViewAbsoluteTime() const
+{
+ return event()->getNotationAbsoluteTime();
+}
+
+timeT
+NotationElement::getViewDuration() const
+{
+ return event()->getNotationDuration();
+}
+
+double
+NotationElement::getCanvasX()
+{
+ if (m_canvasItem)
+ return m_canvasItem->x();
+ else {
+ std::cerr << "ERROR: No canvas item for this notation element:";
+ event()->dump(std::cerr);
+ throw NoCanvasItem("No canvas item for notation element of type " +
+ event()->getType(), __FILE__, __LINE__);
+ }
+}
+
+double
+NotationElement::getCanvasY()
+{
+ if (m_canvasItem)
+ return m_canvasItem->y();
+ else {
+ std::cerr << "ERROR: No canvas item for this notation element:";
+ event()->dump(std::cerr);
+ throw NoCanvasItem("No canvas item for notation element of type " +
+ event()->getType(), __FILE__, __LINE__);
+ }
+}
+
+bool
+NotationElement::isRest() const
+{
+ return event()->isa(Note::EventRestType);
+}
+
+bool
+NotationElement::isNote() const
+{
+ return event()->isa(Note::EventType);
+}
+
+bool
+NotationElement::isTuplet() const
+{
+ return event()->has(BaseProperties::BEAMED_GROUP_TUPLET_BASE);
+}
+
+bool
+NotationElement::isGrace() const
+{
+ return event()->has(BaseProperties::IS_GRACE_NOTE) &&
+ event()->get
+ <Bool>(BaseProperties::IS_GRACE_NOTE);
+}
+
+void
+NotationElement::setCanvasItem(QCanvasItem *e, double canvasX, double canvasY)
+{
+ removeCanvasItem();
+ m_recentlyRegenerated = true;
+ m_canvasItem = e;
+ e->move(canvasX, canvasY);
+}
+
+void
+NotationElement::addCanvasItem(QCanvasItem *e, double canvasX, double canvasY)
+{
+ if (!m_canvasItem) {
+ std::cerr << "ERROR: Attempt to add extra canvas item to element without main canvas item:";
+ event()->dump(std::cerr);
+ throw NoCanvasItem("No canvas item for notation element of type " +
+ event()->getType(), __FILE__, __LINE__);
+ }
+ if (!m_extraItems) {
+ m_extraItems = new ItemList;
+ }
+ e->move(canvasX, canvasY);
+ m_extraItems->push_back(e);
+}
+
+void
+NotationElement::removeCanvasItem()
+{
+ m_recentlyRegenerated = false;
+
+ delete m_canvasItem;
+ m_canvasItem = 0;
+
+ if (m_extraItems) {
+
+ for (ItemList::iterator i = m_extraItems->begin();
+ i != m_extraItems->end(); ++i)
+ delete *i;
+ m_extraItems->clear();
+
+ delete m_extraItems;
+ m_extraItems = 0;
+ }
+}
+
+void
+NotationElement::reposition(double canvasX, double canvasY)
+{
+ m_recentlyRegenerated = false;
+ if (!m_canvasItem)
+ return ;
+
+ double dx = canvasX - m_canvasItem->x();
+ double dy = canvasY - m_canvasItem->y();
+ m_canvasItem->move(canvasX, canvasY);
+
+ if (m_extraItems) {
+ for (ItemList::iterator i = m_extraItems->begin();
+ i != m_extraItems->end(); ++i) {
+ (*i)->moveBy(dx, dy);
+ }
+ }
+}
+
+bool
+NotationElement::isSelected()
+{
+ return m_canvasItem ? m_canvasItem->selected() : false;
+}
+
+void
+NotationElement::setSelected(bool selected)
+{
+ m_recentlyRegenerated = false;
+ if (m_canvasItem)
+ m_canvasItem->setSelected(selected);
+}
+
+}
diff --git a/src/gui/editors/notation/NotationElement.h b/src/gui/editors/notation/NotationElement.h
new file mode 100644
index 0000000..c756641
--- /dev/null
+++ b/src/gui/editors/notation/NotationElement.h
@@ -0,0 +1,176 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_NOTATIONELEMENT_H_
+#define _RG_NOTATIONELEMENT_H_
+
+#include "base/Exception.h"
+#include "base/ViewElement.h"
+#include <vector>
+#include "base/Event.h"
+
+
+class QCanvasItem;
+class ItemList;
+
+
+namespace Rosegarden
+{
+
+class Event;
+
+
+/**
+ * The Notation H and V layout is performed on a
+ * NotationElementList. Once this is done, each NotationElement is
+ * affected a QCanvasItem which is set at these coords.
+ *
+ * @see NotationView#showElements()
+ */
+
+class NotationElement : public ViewElement
+{
+public:
+ typedef Exception NoCanvasItem;
+
+ NotationElement(Event *event);
+
+ ~NotationElement();
+
+ virtual timeT getViewAbsoluteTime() const;
+ virtual timeT getViewDuration() const;
+
+ void getLayoutAirspace(double &x, double &width) {
+ x = m_airX;
+ width = m_airWidth;
+ }
+
+ void getCanvasAirspace(double &x, double &width) {
+ x = m_airX - getLayoutX() + getCanvasX();
+ width = m_airWidth;
+ }
+
+ /// returns the x pos of the associated canvas item
+ double getCanvasX();
+
+ /// returns the y pos of the associated canvas item
+ double getCanvasY();
+
+ /**
+ * Sets the X coordinate and width of the space "underneath"
+ * this element, i.e. the extents within which a mouse click
+ * or some such might be considered to be interested in this
+ * element as opposed to any other. These are layout coords
+ */
+ void setLayoutAirspace(double x, double width) {
+ m_airX = x; m_airWidth = width;
+ }
+
+ /// Returns true if the wrapped event is a rest
+ bool isRest() const;
+
+ /// Returns true if the wrapped event is a note
+ bool isNote() const;
+
+ /// Returns true if the wrapped event is a tuplet
+ bool isTuplet() const;
+
+ /// Returns true if the wrapped event is a grace note
+ bool isGrace() const;
+
+ /**
+ * Sets the canvas item representing this notation element on screen.
+ *
+ * NOTE: The object takes ownership of its canvas item.
+ */
+ void setCanvasItem(QCanvasItem *e, double canvasX, double canvasY);
+
+ /**
+ * Add an extra canvas item associated with this element, for
+ * example where an element has been split across two or more
+ * staff rows.
+ *
+ * The element will take ownership of these canvas items and
+ * delete them when it deletes the main canvas item.
+ */
+ void addCanvasItem(QCanvasItem *e, double canvasX, double canvasY);
+
+ /**
+ * Remove the main canvas item and any additional ones.
+ */
+ void removeCanvasItem();
+
+ /**
+ * Reset the position of the canvas item (which is assumed to
+ * exist already).
+ */
+ void reposition(double canvasX, double canvasY);
+
+ /**
+ * Return true if setCanvasItem has been called more recently
+ * than reposition. If true, any code that positions this
+ * element will probably not need to regenerate its sprite as
+ * well, even if other indications suggest otherwise.
+ */
+ bool isRecentlyRegenerated() { return m_recentlyRegenerated; }
+
+ bool isSelected();
+ void setSelected(bool selected);
+
+ /**
+ * Return true if the element is a note which lies at the exactly
+ * same place than another note.
+ * Only valid after NotationVLayout::scanStaff() call.
+ * Only a returned true is meaningful (when 2 notes are colliding, the
+ * first element returns false and the second one returns true).
+ */
+ bool isColliding() { return m_isColliding; }
+
+ void setIsColliding(bool value) { m_isColliding = value; }
+
+ /// Returns the associated canvas item
+ QCanvasItem* getCanvasItem() { return m_canvasItem; }
+
+protected:
+ //--------------- Data members ---------------------------------
+
+ double m_airX;
+ double m_airWidth;
+ bool m_recentlyRegenerated;
+ bool m_isColliding;
+
+ QCanvasItem *m_canvasItem;
+
+ typedef std::vector<QCanvasItem *> ItemList;
+ ItemList *m_extraItems;
+};
+
+typedef ViewElementList NotationElementList;
+
+
+
+}
+
+#endif
diff --git a/src/gui/editors/notation/NotationEraser.cpp b/src/gui/editors/notation/NotationEraser.cpp
new file mode 100644
index 0000000..4124e44
--- /dev/null
+++ b/src/gui/editors/notation/NotationEraser.cpp
@@ -0,0 +1,115 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "NotationEraser.h"
+#include <kapplication.h>
+
+#include <klocale.h>
+#include "document/ConfigGroups.h"
+#include "base/ViewElement.h"
+#include "commands/notation/EraseEventCommand.h"
+#include "gui/general/EditTool.h"
+#include "NotationTool.h"
+#include "NotationView.h"
+#include "NotePixmapFactory.h"
+#include <kaction.h>
+#include <kconfig.h>
+#include <qiconset.h>
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+NotationEraser::NotationEraser(NotationView* view)
+ : NotationTool("NotationEraser", view),
+ m_collapseRest(false)
+{
+ KConfig *config = kapp->config();
+ config->setGroup(NotationViewConfigGroup);
+ m_collapseRest = config->readBoolEntry("collapse", false);
+
+ new KToggleAction(i18n("Collapse rests after erase"), 0, this,
+ SLOT(slotToggleRestCollapse()), actionCollection(),
+ "toggle_rest_collapse");
+
+ QIconSet icon
+ (NotePixmapFactory::toQPixmap(NotePixmapFactory::
+ makeToolbarPixmap("crotchet")));
+ new KAction(i18n("Switch to Insert Tool"), icon, 0, this,
+ SLOT(slotInsertSelected()), actionCollection(),
+ "insert");
+
+ icon = QIconSet(NotePixmapFactory::toQPixmap(NotePixmapFactory::
+ makeToolbarPixmap("select")));
+ new KAction(i18n("Switch to Select Tool"), icon, 0, this,
+ SLOT(slotSelectSelected()), actionCollection(),
+ "select");
+
+ createMenu("notationeraser.rc");
+}
+
+void NotationEraser::ready()
+{
+ m_nParentView->setCanvasCursor(Qt::pointingHandCursor);
+ m_nParentView->setHeightTracking(false);
+}
+
+void NotationEraser::handleLeftButtonPress(timeT,
+ int,
+ int staffNo,
+ QMouseEvent*,
+ ViewElement* element)
+{
+ if (!element || staffNo < 0)
+ return ;
+
+ EraseEventCommand *command =
+ new EraseEventCommand(m_nParentView->getStaff(staffNo)->getSegment(),
+ element->event(),
+ m_collapseRest);
+
+ m_nParentView->addCommandToHistory(command);
+}
+
+void NotationEraser::slotToggleRestCollapse()
+{
+ m_collapseRest = !m_collapseRest;
+}
+
+void NotationEraser::slotInsertSelected()
+{
+ m_nParentView->slotLastNoteAction();
+}
+
+void NotationEraser::slotSelectSelected()
+{
+ m_parentView->actionCollection()->action("select")->activate();
+}
+
+const QString NotationEraser::ToolName = "notationeraser";
+
+}
+#include "NotationEraser.moc"
diff --git a/src/gui/editors/notation/NotationEraser.h b/src/gui/editors/notation/NotationEraser.h
new file mode 100644
index 0000000..9efdd13
--- /dev/null
+++ b/src/gui/editors/notation/NotationEraser.h
@@ -0,0 +1,81 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_NOTATIONERASER_H_
+#define _RG_NOTATIONERASER_H_
+
+#include "NotationTool.h"
+#include <qstring.h>
+#include "base/Event.h"
+
+
+class QMouseEvent;
+
+
+namespace Rosegarden
+{
+
+class ViewElement;
+class NotationView;
+
+
+/**
+ * This tool will erase a note on mouse click events
+ */
+class NotationEraser : public NotationTool
+{
+ Q_OBJECT
+
+ friend class NotationToolBox;
+
+public:
+
+ virtual void ready();
+
+ virtual void handleLeftButtonPress(timeT,
+ int height,
+ int staffNo,
+ QMouseEvent*,
+ ViewElement* el);
+ static const QString ToolName;
+
+public slots:
+ void slotToggleRestCollapse();
+
+ void slotInsertSelected();
+ void slotSelectSelected();
+
+protected:
+ NotationEraser(NotationView*);
+
+ //--------------- Data members ---------------------------------
+
+ bool m_collapseRest;
+};
+
+
+}
+
+#endif
diff --git a/src/gui/editors/notation/NotationGroup.cpp b/src/gui/editors/notation/NotationGroup.cpp
new file mode 100644
index 0000000..78525d9
--- /dev/null
+++ b/src/gui/editors/notation/NotationGroup.cpp
@@ -0,0 +1,979 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "NotationGroup.h"
+#include "misc/Debug.h"
+
+#include "base/Equation.h"
+#include "base/Event.h"
+#include "base/NotationRules.h"
+#include "base/NotationTypes.h"
+#include "base/Quantizer.h"
+#include "NotationChord.h"
+#include "NotationElement.h"
+#include "NotationProperties.h"
+#include "NotationStaff.h"
+#include "NoteStyleFactory.h"
+#include "NotePixmapFactory.h"
+
+
+namespace Rosegarden
+{
+
+NotationGroup::NotationGroup(NotationElementList &nel,
+ NELIterator i, const Quantizer *q,
+ std::pair<timeT, timeT> barRange,
+ const NotationProperties &p,
+ const Clef &clef, const Key &key) :
+ AbstractSet<NotationElement, NotationElementList>(nel, i, q),
+ m_barRange(barRange),
+ //!!! What if the clef and/or key change in the course of the group?
+ m_clef(clef),
+ m_key(key),
+ m_weightAbove(0),
+ m_weightBelow(0),
+ m_userSamples(false),
+ m_type(Beamed),
+ m_properties(p)
+{
+ if (!(*i)->event()->get<Int>
+ (BaseProperties::BEAMED_GROUP_ID, m_groupNo)) m_groupNo = -1;
+
+ initialise();
+
+ /*
+ NOTATION_DEBUG << "NotationGroup::NotationGroup: id is " << m_groupNo << endl;
+ i = getInitialElement();
+ while (i != getContainer().end()) {
+ long gid = -1;
+ (*i)->event()->get<Int>(BEAMED_GROUP_ID, gid);
+ NOTATION_DEBUG << "Found element with group id "
+ << gid << endl;
+ if (i == getFinalElement()) break;
+ ++i;
+ }
+ */
+}
+
+NotationGroup::NotationGroup(NotationElementList &nel,
+ const Quantizer *q,
+ const NotationProperties &p,
+ const Clef &clef, const Key &key) :
+ AbstractSet<NotationElement, NotationElementList>(nel, nel.end(), q),
+ m_barRange(0, 0),
+ //!!! What if the clef and/or key change in the course of the group?
+ m_clef(clef),
+ m_key(key),
+ m_weightAbove(0),
+ m_weightBelow(0),
+ m_userSamples(true),
+ m_groupNo( -1),
+ m_type(Beamed),
+ m_properties(p)
+{
+ //...
+}
+
+NotationGroup::~NotationGroup()
+{}
+
+bool NotationGroup::test(const NELIterator &i)
+{
+ // An event is a candidate for being within the bounds of the
+ // set if it's simply within the same bar as the original event.
+ // (Groups may contain other groups, so our bounds may enclose
+ // events that aren't members of the group: we reject those in
+ // sample rather than test, so as to avoid erroneously ending
+ // the group too soon.)
+
+ return ((*i)->getViewAbsoluteTime() >= m_barRange.first &&
+ (*i)->getViewAbsoluteTime() < m_barRange.second);
+}
+
+bool
+NotationGroup::sample(const NELIterator &i, bool goingForwards)
+{
+ if (m_baseIterator == getContainer().end()) {
+ m_baseIterator = i;
+ if (m_userSamples)
+ m_initial = i;
+ }
+ if (m_userSamples)
+ m_final = i;
+
+ std::string t;
+ if (!(*i)->event()->get<String>(BaseProperties::BEAMED_GROUP_TYPE, t)) {
+ NOTATION_DEBUG << "NotationGroup::NotationGroup: Rejecting sample() for non-beamed element" << endl;
+ return false;
+ }
+
+ long n;
+ if (!(*i)->event()->get<Int>(BaseProperties::BEAMED_GROUP_ID, n)) return false;
+ if (m_groupNo == -1) {
+ m_groupNo = n;
+ } else if (n != m_groupNo) {
+ NOTATION_DEBUG << "NotationGroup::NotationGroup: Rejecting sample() for event with group id " << n << " (mine is " << m_groupNo << ")" << endl;
+ return false;
+ }
+
+ if (t == BaseProperties::GROUP_TYPE_BEAMED) {
+ m_type = Beamed;
+ } else if (t == BaseProperties::GROUP_TYPE_TUPLED) {
+ m_type = Tupled;
+ } else if (t == BaseProperties::GROUP_TYPE_GRACE) {
+ std::cerr << "NotationGroup::NotationGroup: WARNING: Obsolete group type Grace found" << std::endl;
+ return false;
+ } else {
+ NOTATION_DEBUG << "NotationGroup::NotationGroup: Warning: Rejecting sample() for unknown GroupType \"" << t << "\"" << endl;
+ return false;
+ }
+
+ NOTATION_DEBUG << "NotationGroup::sample: group id is " << m_groupNo << endl;
+
+ AbstractSet<NotationElement, NotationElementList>::sample
+ (i, goingForwards);
+
+ // If the sum of the distances from the middle line to the notes
+ // above the middle line exceeds the sum of the distances from the
+ // middle line to the notes below, then the beam goes below. We
+ // can calculate the weightings here, as we construct the group.
+
+ if (!static_cast<NotationElement*>(*i)->isNote())
+ return true;
+ if (m_userSamples) {
+ if (m_initialNote == getContainer().end()) m_initialNote = i;
+ m_finalNote = i;
+ }
+
+ // The code that uses the Group should not rely on the presence of
+ // e.g. BEAM_GRADIENT to indicate that a beam should be drawn;
+ // it's possible the gradient might be left over from a previous
+ // calculation and the group might have changed since. Instead it
+ // should test BEAMED, which may be false even if there is a
+ // gradient present.
+ (*i)->event()->setMaybe<Bool>(NotationProperties::BEAMED, false);
+
+ int h = height(i);
+ if (h > 4)
+ m_weightAbove += h - 4;
+ if (h < 4)
+ m_weightBelow += 4 - h;
+
+ return true;
+}
+
+bool
+NotationGroup::contains(const NELIterator &i) const
+{
+ NELIterator j(getInitialElement()),
+ k( getFinalElement());
+
+ for (;;) {
+ if (j == i)
+ return true;
+ if (j == k)
+ return false;
+ ++j;
+ }
+}
+
+int
+NotationGroup::height(const NELIterator &i) const
+{
+ long h = 0;
+ if ((*i)->event()->get<Int>(NotationProperties::HEIGHT_ON_STAFF, h)) {
+ return h;
+ }
+
+ //!!! int pitch = (*i)->event()->get<Int>(PITCH);
+ // NotationDisplayPitch p(pitch, m_clef, m_key);
+ // h = p.getHeightOnStaff();
+
+ try {
+ Pitch pitch(*getAsEvent(i));
+ h = pitch.getHeightOnStaff(m_clef, m_key);
+ } catch (...) {
+ // no pitch!
+ }
+
+ // not setMaybe, as we know the property is absent:
+ (*i)->event()->set<Int>(NotationProperties::HEIGHT_ON_STAFF, h, false);
+ return h;
+}
+
+void
+NotationGroup::applyStemProperties()
+{
+ NotationRules rules;
+
+ NELIterator
+ initialNote(getInitialNote()),
+ finalNote(getFinalNote());
+
+ if (initialNote == getContainer().end() ||
+ initialNote == finalNote) {
+ //!!! This is not true -- if initialNote == finalNote there is
+ // one note in the group, not none. But we still won't have a
+ // beam.
+ NOTATION_DEBUG << "NotationGroup::applyStemProperties: no notes in group"
+ << endl;
+ return; // no notes, no case to answer
+ }
+
+ if (getHighestNote() == getContainer().end()) {
+ std::cerr << "ERROR: NotationGroup::applyStemProperties: no highest note!" << std::endl;
+ abort();
+ }
+
+ if (getLowestNote() == getContainer().end()) {
+ std::cerr << "ERROR: NotationGroup::applyStemProperties: no lowest note!" << std::endl;
+ abort();
+ }
+
+ int up = 0, down = 0;
+
+ for (NELIterator i = initialNote; i != getContainer().end(); ++i) {
+ NotationElement* el = static_cast<NotationElement*>(*i);
+ if (el->isNote()) {
+ if (el->event()->has(NotationProperties::STEM_UP)) {
+ if (el->event()->get<Bool>(NotationProperties::STEM_UP)) ++up;
+ else ++down;
+ }
+ }
+
+ if (i == finalNote) break;
+ }
+
+ NOTATION_DEBUG << "NotationGroup::applyStemProperties: weightAbove "
+ << m_weightAbove << ", weightBelow " << m_weightBelow
+ << ", up " << up << ", down " << down << endl;
+
+ bool aboveNotes = rules.isBeamAbove(height(getHighestNote()),
+ height(getLowestNote()),
+ m_weightAbove,
+ m_weightBelow);
+ if (up != down) {
+ if (up > down) aboveNotes = true;
+ else aboveNotes = false;
+ }
+
+ NOTATION_DEBUG << "NotationGroup::applyStemProperties: hence aboveNotes "
+ << aboveNotes << endl;
+
+ /*!!!
+ if ((*initialNote)->event()->has(STEM_UP) &&
+ (*initialNote)->event()->isPersistent<Bool>(STEM_UP)) {
+ aboveNotes = (*initialNote)->event()->get<Bool>(STEM_UP);
+ }
+
+ if ((*initialNote)->event()->has(NotationProperties::BEAM_ABOVE) &&
+ (*initialNote)->event()->isPersistent<Bool>(NotationProperties::BEAM_ABOVE)) {
+ aboveNotes = (*initialNote)->event()->get<Bool>
+ (NotationProperties::BEAM_ABOVE);
+ }
+ */
+ for (NELIterator i = initialNote; i != getContainer().end(); ++i) {
+
+ NotationElement* el = static_cast<NotationElement*>(*i);
+
+ el->event()->setMaybe<Bool>(NotationProperties::BEAM_ABOVE, aboveNotes);
+
+ if (el->isNote() &&
+ el->event()->has(BaseProperties::NOTE_TYPE) &&
+ el->event()->get<Int>(BaseProperties::NOTE_TYPE) < Note::Crotchet &&
+ el->event()->has(BaseProperties::BEAMED_GROUP_ID) &&
+ el->event()->get<Int>(BaseProperties::BEAMED_GROUP_ID) == m_groupNo) {
+
+ el->event()->setMaybe<Bool>(NotationProperties::BEAMED, true);
+ // el->event()->setMaybe<Bool>(m_properties.VIEW_LOCAL_STEM_UP, aboveNotes);
+
+ } else if (el->isNote()) {
+
+ if (i == initialNote || i == finalNote) {
+ (*i)->event()->setMaybe<Bool>
+ (m_properties.VIEW_LOCAL_STEM_UP, aboveNotes);
+ } else {
+ (*i)->event()->setMaybe<Bool>
+ (m_properties.VIEW_LOCAL_STEM_UP, !aboveNotes);
+ }
+ }
+
+ if (i == finalNote) break;
+ }
+}
+
+bool
+NotationGroup::haveInternalRest()
+const
+{
+ bool inside = false;
+ bool found = false;
+
+ for (NELIterator i = getInitialNote(); i != getContainer().end(); ++i) {
+ NotationElement* el = static_cast<NotationElement*>(*i);
+
+ if (el->isNote() &&
+ el->event()->has(BaseProperties::NOTE_TYPE) &&
+ el->event()->get<Int>(BaseProperties::NOTE_TYPE) < Note::Crotchet &&
+ el->event()->has(BaseProperties::BEAMED_GROUP_ID) &&
+ el->event()->get<Int>(BaseProperties::BEAMED_GROUP_ID) == m_groupNo) {
+ if (found) return true; // a rest is wholly enclosed by beamed notes
+ inside = true;
+ }
+
+ if (el->isRest() && inside) found = true;
+
+ if (i == getFinalNote()) break;
+ }
+
+ return false;
+}
+
+NotationGroup::Beam
+NotationGroup::calculateBeam(NotationStaff &staff)
+{
+ NotationRules rules;
+
+ Beam beam;
+ beam.aboveNotes = true;
+ beam.startY = 0;
+ beam.gradient = 0;
+ beam.necessary = false;
+
+ NELIterator
+ initialNote(getInitialNote()),
+ finalNote(getFinalNote());
+
+ if (initialNote == getContainer().end() ||
+ initialNote == finalNote) {
+ return beam; // no notes, or at most one: no case to answer
+ }
+
+ beam.aboveNotes = rules.isBeamAbove(height(getHighestNote()),
+ height(getLowestNote()),
+ m_weightAbove,
+ m_weightBelow);
+
+ if ((*initialNote)->event()->has(NotationProperties::BEAM_ABOVE)) {
+ beam.aboveNotes = (*initialNote)->event()->get
+ <Bool>
+ (NotationProperties::BEAM_ABOVE);
+ }
+
+ timeT crotchet = Note(Note::Crotchet).getDuration();
+
+ beam.necessary =
+ (*initialNote)->getViewDuration() < crotchet &&
+ (*finalNote)->getViewDuration() < crotchet;
+
+ beam.necessary = beam.necessary &&
+ (((*finalNote)->getViewAbsoluteTime() >
+ (*initialNote)->getViewAbsoluteTime()) ||
+ (((*finalNote)->getViewAbsoluteTime() ==
+ (*initialNote)->getViewAbsoluteTime()) &&
+ ((*finalNote)->event()->getSubOrdering() >
+ (*initialNote)->event()->getSubOrdering())));
+
+ // We continue even if the beam is not necessary, because the
+ // same data is used to generate the tupling line in tupled
+ // groups that do not have beams
+
+ // if (!beam.necessary) return beam;
+
+ NOTATION_DEBUG << "NotationGroup::calculateBeam: beam necessariness: " << beam.necessary << endl;
+
+ NotationChord initialChord(getContainer(), initialNote, &getQuantizer(),
+ m_properties, m_clef, m_key),
+ finalChord(getContainer(), finalNote, &getQuantizer(),
+ m_properties, m_clef, m_key);
+
+ if (initialChord.getInitialElement() == finalChord.getInitialElement()) {
+ return beam;
+ }
+
+ bool isGrace =
+ (*initialNote)->event()->has(BaseProperties::IS_GRACE_NOTE) &&
+ (*initialNote)->event()->get<Bool>(BaseProperties::IS_GRACE_NOTE);
+
+ int initialHeight, finalHeight, extremeHeight;
+ NELIterator extremeNote;
+
+ if (beam.aboveNotes) {
+
+ initialHeight = height(initialChord.getHighestNote());
+ finalHeight = height( finalChord.getHighestNote());
+ extremeHeight = height( getHighestNote());
+ extremeNote = getHighestNote();
+
+ } else {
+ initialHeight = height(initialChord.getLowestNote());
+ finalHeight = height( finalChord.getLowestNote());
+ extremeHeight = height( getLowestNote());
+ extremeNote = getLowestNote();
+ }
+
+ int diff = initialHeight - finalHeight;
+ if (diff < 0) diff = -diff;
+
+ bool linear =
+ (beam.aboveNotes ?
+ (extremeHeight <= std::max(initialHeight, finalHeight)) :
+ (extremeHeight >= std::min(initialHeight, finalHeight)));
+
+ if (!linear) {
+ if (diff > 2)
+ diff = 1;
+ else
+ diff = 0;
+ }
+
+ // Now, we need to judge the height of the beam such that the
+ // nearest note of the whole group, the nearest note of the first
+ // chord and the nearest note of the final chord are all at least
+ // two note-body-heights away from it, and at least one of the
+ // start and end points is at least the usual note stem-length
+ // away from it. This is a straight-line equation y = mx + c,
+ // where we have m and two x,y pairs and need to find c.
+
+ //!!! If we find that making one extreme a sensible distance from
+ //the note head makes the other extreme way too far away from it
+ //in the direction of the gradient, then we should flatten the
+ //gradient. There may be a better heuristic for this.
+
+ int initialX = (int)(*initialNote)->getLayoutX();
+ int finalDX = (int) (*finalNote)->getLayoutX() - initialX;
+ int extremeDX = (int)(*extremeNote)->getLayoutX() - initialX;
+
+ int spacing = staff.getNotePixmapFactory(isGrace).getLineSpacing();
+
+ beam.gradient = 0;
+ if (finalDX > 0) {
+ do {
+ if (diff == 0)
+ break;
+ else if (diff > 3)
+ diff = 3;
+ else
+ --diff;
+ beam.gradient = (diff * spacing * 100) / (finalDX * 2);
+ } while (beam.gradient > 18);
+ } else {
+ beam.gradient = 0;
+ }
+ if (initialHeight < finalHeight)
+ beam.gradient = -beam.gradient;
+
+ int finalY = staff.getLayoutYForHeight(finalHeight);
+ int extremeY = staff.getLayoutYForHeight(extremeHeight);
+
+ int c0 = staff.getLayoutYForHeight(initialHeight), c1, c2;
+ double dgrad = (double)beam.gradient / 100.0;
+
+ Equation::solve(Equation::C, extremeY, dgrad, extremeDX, c1);
+ Equation::solve(Equation::C, finalY, dgrad, finalDX, c2);
+
+ using std::max;
+ using std::min;
+ long shortestNoteType = Note::Quaver;
+ if (!(*getShortestElement())->event()->get
+ <Int>(BaseProperties::NOTE_TYPE,
+ shortestNoteType)) {
+ NOTATION_DEBUG << "NotationGroup::calculateBeam: WARNING: Shortest element has no note-type; should this be possible?" << endl;
+ NOTATION_DEBUG << "(Event dump follows)" << endl;
+ (*getShortestElement())->event()->dump(std::cerr);
+ }
+
+ // minimal stem lengths at start, middle-extreme and end of beam
+ int sl = staff.getNotePixmapFactory(isGrace).getStemLength();
+ int ml = spacing * 2;
+ int el = sl;
+
+ NOTATION_DEBUG << "c0: " << c0 << ", c1: " << c1 << ", c2: " << c2 << endl;
+ NOTATION_DEBUG << "sl: " << sl << ", ml: " << ml << ", el: " << el << endl;
+
+ // If the stems are down, we will need to ensure they end at
+ // heights lower than 0 if there's an internal rest -- likewise
+ // with stems up and an internal rest we need to ensure they end
+ // at higher than 8.
+ // [Avoid doing expensive haveInternalRest() test where possible]
+
+ if (beam.aboveNotes) {
+
+ int topY = staff.getLayoutYForHeight(8);
+
+ if ((c0 - sl > topY) || (c1 - ml > topY) || (c2 - el > topY)) {
+ if (haveInternalRest()) {
+ if (c0 - sl > topY) sl = c0 - topY;
+ if (c1 - ml > topY) ml = c1 - topY;
+ if (c2 - el > topY) el = c2 - topY;
+ NOTATION_DEBUG << "made internal rest adjustment for above notes" << endl;
+ NOTATION_DEBUG << "sl: " << sl << ", ml: " << ml << ", el: " << el << endl;
+ }
+ }
+ } else {
+ int bottomY = staff.getLayoutYForHeight(0);
+
+ if ((c0 + sl < bottomY) || (c1 + ml < bottomY) || (c2 + el < bottomY)) {
+ if (haveInternalRest()) {
+ if (c0 + sl < bottomY) sl = bottomY - c0;
+ if (c1 + ml < bottomY) ml = bottomY - c1;
+ if (c2 + el < bottomY) el = bottomY - c2;
+ NOTATION_DEBUG << "made internal rest adjustment for below notes" << endl;
+ NOTATION_DEBUG << "sl: " << sl << ", ml: " << ml << ", el: " << el << endl;
+ }
+ }
+ }
+
+
+ if (shortestNoteType < Note::Semiquaver) {
+ int off = spacing * (Note::Semiquaver - shortestNoteType);
+ sl += off;
+ el += off;
+ }
+
+ if (shortestNoteType < Note::Quaver) {
+ int off = spacing * (Note::Quaver - shortestNoteType);
+ ml += off;
+ }
+
+
+ int midY = staff.getLayoutYForHeight(4);
+
+ // ensure extended to middle line if necessary, and assign suitable stem length
+ if (beam.aboveNotes) {
+ if (c0 - sl > midY) sl = c0 - midY;
+ if (c1 - ml > midY) ml = c1 - midY;
+ if (c2 - el > midY) el = c2 - midY;
+ if (extremeDX > 1.0 || extremeDX < -1.0) {
+ // beam.gradient = int(100 * double(c2 - c0) / double(extremeDX));
+ }
+ beam.startY = min(min(c0 - sl, c1 - ml), c2 - el);
+ } else {
+ if (c0 + sl < midY) sl = midY - c0;
+ if (c1 + ml < midY) ml = midY - c1;
+ if (c2 + el < midY) el = midY - c2;
+ if (extremeDX > 1.0 || extremeDX < -1.0) {
+ // beam.gradient = int(100 * double(c2 - c0) / double(extremeDX));
+ }
+ beam.startY = max(max(c0 + sl, c1 + ml), c2 + el);
+ }
+ /*
+ NOTATION_DEBUG << "NotationGroup::calculateBeam: beam data:" << endl
+ << "gradient: " << beam.gradient << endl
+ << "(c0 " << c0 << ", c2 " << c2 << ", extremeDX " << extremeDX << ")" << endl
+ << "startY: " << beam.startY << endl
+ << "aboveNotes: " << beam.aboveNotes << endl
+ << "shortestNoteType: " << shortestNoteType << endl
+ << "necessary: " << beam.necessary << endl;
+ */
+ return beam;
+}
+
+void
+NotationGroup::applyBeam(NotationStaff &staff)
+{
+ // NOTATION_DEBUG << "NotationGroup::applyBeam, group no is " << m_groupNo << endl;
+ /*
+ NOTATION_DEBUG << "\nNotationGroup::applyBeam" << endl;
+ NOTATION_DEBUG << "Group id: " << m_groupNo << ", type " << m_type << endl;
+ NOTATION_DEBUG << "Coverage:" << endl;
+ int i = 0;
+ for (NELIterator i = getInitialElement(); i != getContainer().end(); ++i) {
+ (*i)->event()->dump(cerr);
+ if (i == getFinalElement()) break;
+ }
+ {
+ NELIterator i(getInitialNote());
+ NOTATION_DEBUG << "Initial note: " << (i == getContainer().end() ? -1 : (*i)->event()->getAbsoluteTime()) << endl;
+ }
+ {
+ NELIterator i(getFinalNote());
+ NOTATION_DEBUG << "Final note: " << (i == getContainer().end() ? -1 : (*i)->event()->getAbsoluteTime()) << endl;
+ }
+ {
+ NELIterator i(getHighestNote());
+ NOTATION_DEBUG << "Highest note: " << (i == getContainer().end() ? -1 : (*i)->event()->getAbsoluteTime()) << endl;
+ }
+ {
+ NELIterator i(getLowestNote());
+ NOTATION_DEBUG << "Lowest note: " << (i == getContainer().end() ? -1 : (*i)->event()->getAbsoluteTime()) << endl;
+ }
+ */
+ Beam beam(calculateBeam(staff));
+ if (!beam.necessary) {
+ for (NELIterator i = getInitialNote(); i != getContainer().end(); ++i) {
+ (*i)->event()->unset(NotationProperties::BEAMED);
+ (*i)->event()->unset(m_properties.TUPLING_LINE_MY_Y);
+ if (i == getFinalNote())
+ break;
+ }
+ return ;
+ }
+
+ // NOTATION_DEBUG << "NotationGroup::applyBeam: Beam is necessary" << endl;
+
+ NELIterator initialNote(getInitialNote()),
+ finalNote( getFinalNote());
+ int initialX = (int)(*initialNote)->getLayoutX();
+ timeT finalTime = (*finalNote)->getViewAbsoluteTime();
+
+ // For each chord in the group, we nominate the note head furthest
+ // from the beam as the primary note, the one that "owns" the stem
+ // and the section of beam up to the following chord. For this
+ // note, we need to:
+ //
+ // * Set the start height, start x-coord and gradient of the beam
+ // (we can't set the stem length for this note directly, because
+ // we don't know its y-coordinate yet)
+ //
+ // * Set width of this section of beam
+ //
+ // * Set the number of beams required for the following note (one
+ // slight complication here: a beamed group in which the very
+ // first chord is shorter than the following one. Here the first
+ // chord needs to know it's the first, or else it can't draw the
+ // part-beams immediately to its right correctly.)
+ //
+ // For the rest of the notes in the chord, we just need to
+ // indicate that they aren't part of the beam-drawing process and
+ // don't need to draw a stem.
+
+ NELIterator prev = getContainer().end(), prevprev = getContainer().end();
+ double gradient = (double)beam.gradient / 100.0;
+
+ // NOTATION_DEBUG << "NotationGroup::applyBeam starting for group "<< this << endl;
+
+ for (NELIterator i = getInitialNote(); i != getContainer().end(); ++i) {
+ NotationElement* el = static_cast<NotationElement*>(*i);
+
+ // Clear tuplingness for all events in the group, to be
+ // reinstated by any subsequent call to applyTuplingLine. We
+ // do this because applyTuplingLine doesn't clear these
+ // properties from notes that don't need them; it only applies
+ // them to notes that do.
+ el->event()->unset(m_properties.TUPLING_LINE_MY_Y);
+
+ if (el->isNote() &&
+ el->event()->has(BaseProperties::NOTE_TYPE) &&
+ el->event()->get
+ <Int>(BaseProperties::NOTE_TYPE) < Note::Crotchet &&
+ el->event()->has(BaseProperties::BEAMED_GROUP_ID) &&
+ el->event()->get<Int>(BaseProperties::BEAMED_GROUP_ID) == m_groupNo) {
+
+ NotationChord chord(getContainer(), i, &getQuantizer(),
+ m_properties, m_clef, m_key);
+ unsigned int j;
+
+ // NOTATION_DEBUG << "NotationGroup::applyBeam: Found chord" << endl;
+
+ bool hasShifted = chord.hasNoteHeadShifted();
+
+ for (j = 0; j < chord.size(); ++j) {
+ NotationElement *el = static_cast<NotationElement*>(*chord[j]);
+
+ el->event()->setMaybe<Bool>
+ (m_properties.CHORD_PRIMARY_NOTE, false);
+
+ el->event()->setMaybe<Bool>
+ (m_properties.DRAW_FLAG, false);
+
+ el->event()->setMaybe<Bool>
+ (NotationProperties::BEAMED, true);
+
+ el->event()->setMaybe<Bool>
+ (NotationProperties::BEAM_ABOVE, beam.aboveNotes);
+
+ el->event()->setMaybe<Bool>
+ (m_properties.VIEW_LOCAL_STEM_UP, beam.aboveNotes);
+
+ bool shifted = chord.isNoteHeadShifted(chord[j]);
+ el->event()->setMaybe<Bool>
+ (m_properties.NOTE_HEAD_SHIFTED, shifted);
+
+ long dots = 0;
+ (void)el->event()->get
+ <Int>(BaseProperties::NOTE_DOTS, dots);
+
+ el->event()->setMaybe<Bool>
+ (m_properties.NOTE_DOT_SHIFTED, false);
+ if (hasShifted && beam.aboveNotes) {
+ long dots = 0;
+ (void)el->event()->get
+ <Int>(BaseProperties::NOTE_DOTS, dots);
+ if (dots > 0) {
+ el->event()->setMaybe<Bool>
+ (m_properties.NOTE_DOT_SHIFTED, true);
+ }
+ }
+
+ el->event()->setMaybe<Bool>
+ (m_properties.NEEDS_EXTRA_SHIFT_SPACE,
+ chord.hasNoteHeadShifted() && !beam.aboveNotes);
+ }
+
+ if (beam.aboveNotes)
+ j = 0;
+ else
+ j = chord.size() - 1;
+
+ NotationElement *el = static_cast<NotationElement*>(*chord[j]);
+ el->event()->setMaybe<Bool>(NotationProperties::BEAMED, false); // set later
+ el->event()->setMaybe<Bool>(m_properties.DRAW_FLAG, true); // set later
+
+ int x = (int)el->getLayoutX();
+ int myY = (int)(gradient * (x - initialX)) + beam.startY;
+
+ int beamCount =
+ NoteStyleFactory::getStyleForEvent(el->event())->
+ getFlagCount(el->event()->get
+ <Int>(BaseProperties::NOTE_TYPE));
+
+ // If THIS_PART_BEAMS is true, then when drawing the
+ // chord, if it requires more beams than the following
+ // chord then they should be added as partial beams to the
+ // right of the stem.
+
+ // If NEXT_PART_BEAMS is true, then when drawing the
+ // chord, if it requires fewer beams than the following
+ // chord then the difference should be added as partial
+ // beams to the left of the following chord's stem.
+
+ // Procedure for setting these: If we have more beams than
+ // the preceding chord, then the preceding chord should
+ // have NEXT_PART_BEAMS set, until possibly unset again on
+ // the next iteration. If we have at least as many beams
+ // as the preceding chord, then the preceding chord should
+ // have THIS_PART_BEAMS unset and the one before it should
+ // have NEXT_PART_BEAMS unset. The first chord should
+ // have THIS_PART_BEAMS set, until possibly unset again on
+ // the next iteration.
+
+ if (prev != getContainer().end()) {
+
+ NotationElement *prevEl = static_cast<NotationElement*>(*prev);
+ int secWidth = x - (int)prevEl->getLayoutX();
+
+ // prevEl->event()->setMaybe<Int>(BEAM_NEXT_Y, myY);
+
+ prevEl->event()->setMaybe<Int>
+ (m_properties.BEAM_SECTION_WIDTH, secWidth);
+ prevEl->event()->setMaybe<Int>
+ (m_properties.BEAM_NEXT_BEAM_COUNT, beamCount);
+
+ int prevBeamCount =
+ NoteStyleFactory::getStyleForEvent(prevEl->event())->
+ getFlagCount(prevEl->event()->get
+ <Int>(BaseProperties::NOTE_TYPE));
+
+ if ((beamCount > 0) && (prevBeamCount > 0)) {
+ el->event()->setMaybe<Bool>(m_properties.BEAMED, true);
+ el->event()->setMaybe<Bool>(m_properties.DRAW_FLAG, false);
+ prevEl->event()->setMaybe<Bool>(m_properties.BEAMED, true);
+ prevEl->event()->setMaybe<Bool>(m_properties.DRAW_FLAG, false);
+ }
+
+ if (beamCount >= prevBeamCount) {
+ prevEl->event()->setMaybe<Bool>
+ (m_properties.BEAM_THIS_PART_BEAMS, false);
+ if (prevprev != getContainer().end()) {
+ (*prevprev)->event()->setMaybe<Bool>
+ (m_properties.BEAM_NEXT_PART_BEAMS, false);
+ }
+ }
+
+ if (beamCount > prevBeamCount) {
+ prevEl->event()->setMaybe<Bool>
+ (m_properties.BEAM_NEXT_PART_BEAMS, true);
+ }
+
+ } else {
+ el->event()->setMaybe<Bool>(m_properties.BEAM_THIS_PART_BEAMS, true);
+ }
+
+ el->event()->setMaybe<Bool>(m_properties.CHORD_PRIMARY_NOTE, true);
+
+ el->event()->setMaybe<Int>(m_properties.BEAM_MY_Y, myY);
+ el->event()->setMaybe<Int>(m_properties.BEAM_GRADIENT, beam.gradient);
+
+ // until they're set next time around the loop, as (*prev)->...
+ // el->event()->setMaybe<Int>(m_properties.BEAM_NEXT_Y, myY);
+ el->event()->setMaybe<Int>(m_properties.BEAM_SECTION_WIDTH, 0);
+ el->event()->setMaybe<Int>(m_properties.BEAM_NEXT_BEAM_COUNT, 1);
+
+ prevprev = prev;
+ prev = chord[j];
+ i = chord.getFinalElement();
+
+ }
+ else if (el->isNote()) {
+
+ //!!! should we really be setting these here as well as in
+ // applyStemProperties?
+ /*
+ if (i == initialNote || i == finalNote) {
+ (*i)->event()->setMaybe<Bool>(m_properties.VIEW_LOCAL_STEM_UP, beam.aboveNotes);
+ } else {
+ (*i)->event()->setMaybe<Bool>(m_properties.VIEW_LOCAL_STEM_UP, !beam.aboveNotes);
+ }
+ */
+ }
+
+ if (i == finalNote || el->getViewAbsoluteTime() > finalTime) break;
+ }
+}
+
+void
+NotationGroup::applyTuplingLine(NotationStaff &staff)
+{
+ // NOTATION_DEBUG << "NotationGroup::applyTuplingLine, group no is " << m_groupNo << ", group type is " << m_type << endl;
+
+ if (m_type != Tupled)
+ return ;
+
+ // NOTATION_DEBUG << "NotationGroup::applyTuplingLine: line is necessary" << endl;
+
+ Beam beam(calculateBeam(staff));
+
+ NELIterator
+ initialNote(getInitialNote()),
+ finalNote(getFinalNote()),
+ initialElement(getInitialElement()),
+ finalElement(getFinalElement());
+
+ NELIterator initialNoteOrRest(initialElement);
+ NotationElement* initialNoteOrRestEl = static_cast<NotationElement*>(*initialNoteOrRest);
+
+ while (initialNoteOrRest != finalElement &&
+ !(initialNoteOrRestEl->isNote() ||
+ initialNoteOrRestEl->isRest())) {
+ ++initialNoteOrRest;
+ initialNoteOrRestEl = static_cast<NotationElement*>(*initialNoteOrRest);
+ }
+
+ if (!initialNoteOrRestEl->isRest()) {
+ initialNoteOrRest = initialNote;
+ initialNoteOrRestEl = static_cast<NotationElement*>(*initialNoteOrRest);
+ }
+
+ if (initialNoteOrRest == staff.getViewElementList()->end()) return;
+
+ bool isGrace = false;
+ if (initialNote != staff.getViewElementList()->end()) {
+ isGrace =
+ (*initialNote)->event()->has(BaseProperties::IS_GRACE_NOTE) &&
+ (*initialNote)->event()->get<Bool>(BaseProperties::IS_GRACE_NOTE);
+ }
+
+ // NOTATION_DEBUG << "NotationGroup::applyTuplingLine: first element is " << (initialNoteOrRestEl->isNote() ? "Note" : "Non-Note") << ", last is " << (static_cast<NotationElement*>(*finalElement)->isNote() ? "Note" : "Non-Note") << endl;
+
+ int initialX = (int)(*initialNoteOrRest)->getLayoutX();
+ int finalX = (int)(*finalElement)->getLayoutX();
+
+ if (initialNote == staff.getViewElementList()->end() &&
+ finalNote == staff.getViewElementList()->end()) {
+
+ Event *e = (*initialNoteOrRest)->event();
+ e->setMaybe<Int>(m_properties.TUPLING_LINE_MY_Y,
+ staff.getLayoutYForHeight(12));
+ e->setMaybe<Int>(m_properties.TUPLING_LINE_WIDTH, finalX - initialX);
+ e->setMaybe<Int>(m_properties.TUPLING_LINE_GRADIENT, 0);
+
+ } else {
+
+ // only notes have height
+ int initialY = staff.getLayoutYForHeight(height(initialNote));
+ int finalY = staff.getLayoutYForHeight(height( finalNote));
+
+ // if we have a beam and both end-points of it are notes,
+ // place the tupling number over it (that is, make the tupling
+ // line follow the beam and say so); otherwise make the line
+ // follow the gradient a beam would have, but on the other
+ // side of the notes
+ bool followBeam =
+ (beam.necessary &&
+ (*initialNoteOrRest)->event()->isa(Note::EventType) &&
+ (finalNote == finalElement));
+
+ int startY = (followBeam ? beam.startY :
+ initialY - (beam.startY - initialY));
+
+ int endY = startY + (int)((finalX - initialX) *
+ ((double)beam.gradient / 100.0));
+
+ // NOTATION_DEBUG << "applyTuplingLine: beam.startY is " << beam.startY << ", initialY is " << initialY << " so my startY is " << startY << ", endY " << endY << ", beam.gradient " << beam.gradient << endl;
+
+ int nh = staff.getNotePixmapFactory(isGrace).getNoteBodyHeight();
+
+ if (followBeam) { // adjust to move text slightly away from beam
+
+ int maxEndBeamCount = 1;
+ long bc;
+ if ((*initialNoteOrRest)->event()->get<Int>
+ (m_properties.BEAM_NEXT_BEAM_COUNT, bc)) {
+ if (bc > maxEndBeamCount)
+ maxEndBeamCount = bc;
+ }
+ if ((*finalNote)->event()->get<Int>
+ (m_properties.BEAM_NEXT_BEAM_COUNT, bc)) {
+ if (bc > maxEndBeamCount)
+ maxEndBeamCount = bc;
+ }
+
+ int extraBeamSpace = maxEndBeamCount * nh + nh / 2;
+
+ if (beam.aboveNotes) {
+ startY -= extraBeamSpace;
+ endY -= extraBeamSpace;
+ finalX += nh;
+ } else {
+ startY += extraBeamSpace;
+ endY += extraBeamSpace;
+ finalX -= nh;
+ }
+
+ } else { // adjust to place close to note heads
+
+ if (startY < initialY) {
+ if (initialY - startY > nh * 3)
+ startY = initialY - nh * 3;
+ if ( finalY - endY < nh * 2)
+ startY -= nh * 2 - (finalY - endY);
+ } else {
+ if (startY - initialY > nh * 3)
+ startY = initialY + nh * 3;
+ if ( endY - finalY < nh * 2)
+ startY += nh * 2 - (endY - finalY);
+ }
+ }
+
+ Event *e = (*initialNoteOrRest)->event();
+ e->setMaybe<Int>(m_properties.TUPLING_LINE_MY_Y, startY);
+ e->setMaybe<Int>(m_properties.TUPLING_LINE_WIDTH, finalX - initialX);
+ e->setMaybe<Int>(m_properties.TUPLING_LINE_GRADIENT, beam.gradient);
+ e->setMaybe<Bool>(m_properties.TUPLING_LINE_FOLLOWS_BEAM, followBeam);
+ }
+}
+
+}
diff --git a/src/gui/editors/notation/NotationGroup.h b/src/gui/editors/notation/NotationGroup.h
new file mode 100644
index 0000000..c7b1134
--- /dev/null
+++ b/src/gui/editors/notation/NotationGroup.h
@@ -0,0 +1,133 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_NOTATIONGROUP_H_
+#define _RG_NOTATIONGROUP_H_
+
+#include "base/Sets.h"
+#include <utility>
+#include "base/Event.h"
+#include "NotationElement.h"
+
+
+
+
+namespace Rosegarden
+{
+
+class Quantizer;
+class NotationStaff;
+class NotationProperties;
+class Key;
+class Clef;
+
+
+/// Several sorts of "Beamed Group"
+
+class NotationGroup : public AbstractSet<NotationElement,
+ NotationElementList>
+{
+public:
+ typedef NotationElementList::iterator NELIterator;
+
+ enum Type { Beamed, Tupled };
+
+ /// Group contents will be sampled from elements surrounding elementInGroup
+ NotationGroup(NotationElementList &nel, NELIterator elementInGroup,
+ const Quantizer *,
+ std::pair<timeT, timeT> barRange,
+ const NotationProperties &properties,
+ const Clef &clef, const Key &key);
+
+ /// Caller intends to call sample() for each item in the group, _in order_
+ NotationGroup(NotationElementList &nel,
+ const Quantizer *,
+ const NotationProperties &properties,
+ const Clef &clef, const Key &key);
+
+ virtual ~NotationGroup();
+
+ Type getGroupType() const { return m_type; }
+
+ /**
+ * Writes the BEAMED, BEAM_ABOVE, and STEM_UP properties into the
+ * notes in the group, as appropriate. Does not require layout x
+ * coordinates to have been set.
+ */
+ void applyStemProperties();
+
+ /**
+ * Writes beam data into each note in the group. Notes' layout x
+ * coordinates must already have been set. Does not require
+ * applyStemProperties to have already been called.
+ */
+ void applyBeam(NotationStaff &);
+
+ /**
+ * Writes tupling line data into each note in the group. Notes'
+ * layout x coordinates must already have been set. Does nothing
+ * if this is not a tupled group.
+ */
+ void applyTuplingLine(NotationStaff &);
+
+ virtual bool contains(const NELIterator &) const;
+
+ virtual bool sample(const NELIterator &i, bool goingForwards);
+
+protected:
+ virtual bool test(const NELIterator &i);
+
+private:
+ struct Beam
+ { // if a beam has a line equation y = mx + c,
+ int gradient; // -- then this is m*100 (i.e. a percentage)
+ int startY; // -- and this is c
+ bool aboveNotes;
+ bool necessary;
+ };
+
+ Beam calculateBeam(NotationStaff &);
+
+ int height(const NELIterator&) const;
+
+ bool haveInternalRest() const;
+
+ //--------------- Data members ---------------------------------
+
+ std::pair<timeT, timeT> m_barRange;
+ const Clef &m_clef;
+ const Key &m_key;
+ int m_weightAbove, m_weightBelow;
+ bool m_userSamples;
+ long m_groupNo;
+ Type m_type;
+
+ const NotationProperties &m_properties;
+};
+
+
+}
+
+#endif
diff --git a/src/gui/editors/notation/NotationHLayout.cpp b/src/gui/editors/notation/NotationHLayout.cpp
new file mode 100644
index 0000000..1b13765
--- /dev/null
+++ b/src/gui/editors/notation/NotationHLayout.cpp
@@ -0,0 +1,2110 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "NotationHLayout.h"
+#include "misc/Debug.h"
+#include <kapplication.h>
+
+#include "base/Composition.h"
+#include "base/LayoutEngine.h"
+#include "base/NotationTypes.h"
+#include "base/Profiler.h"
+#include "base/NotationQuantizer.h"
+#include "base/RulerScale.h"
+#include "base/Segment.h"
+#include "base/SegmentNotationHelper.h"
+#include "base/Staff.h"
+#include "base/ViewElement.h"
+#include "gui/editors/guitar/Chord.h"
+#include "gui/general/ProgressReporter.h"
+#include "gui/widgets/ProgressDialog.h"
+#include "NotationChord.h"
+#include "NotationElement.h"
+#include "NotationGroup.h"
+#include "NotationProperties.h"
+#include "NotationStaff.h"
+#include "NotePixmapFactory.h"
+#include <kconfig.h>
+#include <qobject.h>
+#include <cmath>
+
+namespace Rosegarden
+{
+
+using namespace BaseProperties;
+
+
+NotationHLayout::NotationHLayout(Composition *c, NotePixmapFactory *npf,
+ const NotationProperties &properties,
+ QObject* parent, const char* name) :
+ ProgressReporter(parent, name),
+ HorizontalLayoutEngine(c),
+ m_totalWidth(0.),
+ m_pageMode(false),
+ m_pageWidth(0.),
+ m_spacing(100),
+ m_proportion(60),
+ m_keySigCancelMode(1),
+ m_npf(npf),
+ m_notationQuantizer(c->getNotationQuantizer()),
+ m_properties(properties),
+ m_timePerProgressIncrement(0),
+ m_staffCount(0)
+{
+ // NOTATION_DEBUG << "NotationHLayout::NotationHLayout()" << endl;
+
+ KConfig *config = kapp->config();
+ config->setGroup("Notation Options");
+ m_keySigCancelMode = config->readNumEntry("keysigcancelmode", 1);
+}
+
+NotationHLayout::~NotationHLayout()
+{
+ // empty
+}
+
+std::vector<int>
+NotationHLayout::getAvailableSpacings()
+{
+ if (m_availableSpacings.size() == 0) {
+ m_availableSpacings.push_back(30);
+ m_availableSpacings.push_back(60);
+ m_availableSpacings.push_back(85);
+ m_availableSpacings.push_back(100);
+ m_availableSpacings.push_back(130);
+ m_availableSpacings.push_back(170);
+ m_availableSpacings.push_back(220);
+ }
+ return m_availableSpacings;
+}
+
+std::vector<int>
+NotationHLayout::getAvailableProportions()
+{
+ if (m_availableProportions.size() == 0) {
+ m_availableProportions.push_back(0);
+ m_availableProportions.push_back(20);
+ m_availableProportions.push_back(40);
+ m_availableProportions.push_back(60);
+ m_availableProportions.push_back(80);
+ m_availableProportions.push_back(100);
+ }
+ return m_availableProportions;
+}
+
+NotationHLayout::BarDataList &
+
+NotationHLayout::getBarData(Staff &staff)
+{
+ BarDataMap::iterator i = m_barData.find(&staff);
+ if (i == m_barData.end()) {
+ m_barData[&staff] = BarDataList();
+ }
+
+ return m_barData[&staff];
+}
+
+const NotationHLayout::BarDataList &
+
+NotationHLayout::getBarData(Staff &staff) const
+{
+ return ((NotationHLayout *)this)->getBarData(staff);
+}
+
+NotationElementList::iterator
+NotationHLayout::getStartOfQuantizedSlice(NotationElementList *notes,
+ timeT t)
+const
+{
+ NotationElementList::iterator i = notes->findTime(t);
+ NotationElementList::iterator j(i);
+
+ while (true) {
+ if (i == notes->begin())
+ return i;
+ --j;
+ if ((*j)->getViewAbsoluteTime() < t)
+ return i;
+ i = j;
+ }
+}
+
+NotePixmapFactory *
+NotationHLayout::getNotePixmapFactory(Staff &staff)
+{
+ NotationStaff *ns = dynamic_cast<NotationStaff *>(&staff);
+ if (ns) return &ns->getNotePixmapFactory(false);
+ else return 0;
+}
+
+NotePixmapFactory *
+NotationHLayout::getGraceNotePixmapFactory(Staff &staff)
+{
+ NotationStaff *ns = dynamic_cast<NotationStaff *>(&staff);
+ if (ns) return &ns->getNotePixmapFactory(true);
+ else return 0;
+}
+
+void
+NotationHLayout::scanStaff(Staff &staff, timeT startTime, timeT endTime)
+{
+ throwIfCancelled();
+ Profiler profiler("NotationHLayout::scanStaff");
+
+ Segment &segment(staff.getSegment());
+ bool isFullScan = (startTime == endTime);
+ int startBarOfStaff = getComposition()->getBarNumber(segment.getStartTime());
+
+ if (isFullScan) {
+ clearBarList(staff);
+ startTime = segment.getStartTime();
+ endTime = segment.getEndMarkerTime();
+ } else {
+ startTime = getComposition()->getBarStartForTime(startTime);
+ endTime = getComposition()->getBarEndForTime(endTime);
+ }
+
+ NotationElementList *notes = staff.getViewElementList();
+ BarDataList &barList(getBarData(staff));
+
+ NotePixmapFactory *npf = getNotePixmapFactory(staff);
+
+ int startBarNo = getComposition()->getBarNumber(startTime);
+ int endBarNo = getComposition()->getBarNumber(endTime);
+ /*
+ if (endBarNo > startBarNo &&
+ getComposition()->getBarStart(endBarNo) == segment.getEndMarkerTime()) {
+ --endBarNo;
+ }
+ */
+ std::string name =
+ segment.getComposition()->
+ getTrackById(segment.getTrack())->getLabel();
+ m_staffNameWidths[&staff] =
+ npf->getNoteBodyWidth() * 2 +
+ npf->getTextWidth(Text(name, Text::StaffName));
+
+ NOTATION_DEBUG << "NotationHLayout::scanStaff: full scan " << isFullScan << ", times " << startTime << "->" << endTime << ", bars " << startBarNo << "->" << endBarNo << ", staff name \"" << segment.getLabel() << "\", width " << m_staffNameWidths[&staff] << endl;
+
+ SegmentNotationHelper helper(segment);
+ if (isFullScan) {
+ helper.setNotationProperties();
+ } else {
+ helper.setNotationProperties(startTime, endTime);
+ }
+
+ ::Rosegarden::Key key = segment.getKeyAtTime(startTime);
+ Clef clef = segment.getClefAtTime(startTime);
+ TimeSignature timeSignature =
+ segment.getComposition()->getTimeSignatureAt(startTime);
+ bool barCorrect = true;
+
+ int ottavaShift = 0;
+ timeT ottavaEnd = segment.getEndMarkerTime();
+
+ if (isFullScan) {
+
+ NOTATION_DEBUG << "full scan: setting haveOttava false" << endl;
+
+ m_haveOttavaSomewhere[&staff] = false;
+
+ } else if (m_haveOttavaSomewhere[&staff]) {
+
+ NOTATION_DEBUG << "not full scan but ottava is listed" << endl;
+
+ Segment::iterator i = segment.findTime(startTime);
+ while (1) {
+ if ((*i)->isa(Indication::EventType)) {
+ try {
+ Indication indication(**i);
+ if (indication.isOttavaType()) {
+ ottavaShift = indication.getOttavaShift();
+ ottavaEnd = (*i)->getAbsoluteTime() +
+ indication.getIndicationDuration();
+ break;
+ }
+ } catch (...) { }
+ }
+ if (i == segment.begin())
+ break;
+ --i;
+ }
+ }
+
+ NOTATION_DEBUG << "ottava shift at start:" << ottavaShift << ", ottavaEnd " << ottavaEnd << endl;
+
+ KConfig *config = kapp->config();
+ config->setGroup("Notation Options");
+
+ int accOctaveMode = config->readNumEntry("accidentaloctavemode", 1);
+ AccidentalTable::OctaveType octaveType =
+ (accOctaveMode == 0 ? AccidentalTable::OctavesIndependent :
+ accOctaveMode == 1 ? AccidentalTable::OctavesCautionary :
+ AccidentalTable::OctavesEquivalent);
+
+ int accBarMode = config->readNumEntry("accidentalbarmode", 0);
+ AccidentalTable::BarResetType barResetType =
+ (accBarMode == 0 ? AccidentalTable::BarResetNone :
+ accBarMode == 1 ? AccidentalTable::BarResetCautionary :
+ AccidentalTable::BarResetExplicit);
+
+ bool showInvisibles = config->readBoolEntry("showinvisibles", true);
+
+ if (barResetType != AccidentalTable::BarResetNone) {
+ //!!! very crude and expensive way of making sure we see the
+ // accidentals from previous bar:
+ if (startBarNo > segment.getComposition()->getBarNumber(segment.getStartTime())) {
+ --startBarNo;
+ }
+ }
+
+ AccidentalTable accTable(key, clef, octaveType, barResetType);
+
+ for (int barNo = startBarNo; barNo <= endBarNo; ++barNo) {
+
+ std::pair<timeT, timeT> barTimes =
+ getComposition()->getBarRange(barNo);
+
+ if (barTimes.first >= segment.getEndMarkerTime()) {
+ // clear data if we have any old stuff
+ BarDataList::iterator i(barList.find(barNo));
+ if (i != barList.end()) {
+ barList.erase(i);
+ }
+ continue; // so as to erase any further bars next time around
+ }
+
+ NotationElementList::iterator from =
+ getStartOfQuantizedSlice(notes, barTimes.first);
+
+ NOTATION_DEBUG << "getStartOfQuantizedSlice returned " <<
+ (from != notes->end() ? (*from)->getViewAbsoluteTime() : -1)
+ << " from " << barTimes.first << endl;
+
+ NotationElementList::iterator to =
+ getStartOfQuantizedSlice(notes, barTimes.second);
+
+ if (barTimes.second >= segment.getEndMarkerTime()) {
+ to = notes->end();
+ }
+
+ bool newTimeSig = false;
+ timeSignature = getComposition()->getTimeSignatureInBar
+ (barNo, newTimeSig);
+ NOTATION_DEBUG << "bar " << barNo << ", startBarOfStaff " << startBarOfStaff
+ << ", newTimeSig " << newTimeSig << endl;
+
+ float fixedWidth = 0.0;
+ if (newTimeSig && !timeSignature.isHidden()) {
+ fixedWidth += npf->getNoteBodyWidth() +
+ npf->getTimeSigWidth(timeSignature);
+ }
+
+ setBarBasicData(staff, barNo, from, barCorrect, timeSignature, newTimeSig);
+ BarDataList::iterator bdli(barList.find(barNo));
+ bdli->second.layoutData.needsLayout = true;
+
+ ChunkList &chunks = bdli->second.chunks;
+ chunks.clear();
+
+ float lyricWidth = 0;
+ int graceCount = 0;
+
+ typedef std::set
+ <long> GroupIdSet;
+ GroupIdSet groupIds;
+
+ NOTATION_DEBUG << "NotationHLayout::scanStaff: bar " << barNo << ", from " << barTimes.first << ", to " << barTimes.second << " (end " << segment.getEndMarkerTime() << "); from is at " << (from == notes->end() ? -1 : (*from)->getViewAbsoluteTime()) << ", to is at " << (to == notes->end() ? -1 : (*to)->getViewAbsoluteTime()) << endl;
+
+ timeT actualBarEnd = barTimes.first;
+
+ accTable.newBar();
+
+ for (NotationElementList::iterator itr = from; itr != to; ++itr) {
+
+ NotationElement *el = static_cast<NotationElement*>((*itr));
+ NOTATION_DEBUG << "element is a " << el->event()->getType() << endl;
+
+ if (ottavaShift != 0) {
+ if (el->event()->getAbsoluteTime() >= ottavaEnd) {
+ NOTATION_DEBUG << "reached end of ottava" << endl;
+ ottavaShift = 0;
+ }
+ }
+
+ bool invisible = false;
+ if (el->event()->get<Bool>(INVISIBLE, invisible) && invisible) {
+ if (!showInvisibles)
+ continue;
+ }
+
+ if (el->event()->has(BEAMED_GROUP_ID)) {
+ NOTATION_DEBUG << "element is beamed" << endl;
+ long groupId = el->event()->get<Int>(BEAMED_GROUP_ID);
+ if (groupIds.find(groupId) == groupIds.end()) {
+ NOTATION_DEBUG << "it's a new beamed group, applying stem properties" << endl;
+ NotationGroup group(*staff.getViewElementList(),
+ itr,
+ m_notationQuantizer,
+ barTimes,
+ m_properties,
+ clef, key);
+ group.applyStemProperties();
+ groupIds.insert(groupId);
+ }
+ }
+
+ if (el->event()->isa(Clef::EventType)) {
+
+ // NOTATION_DEBUG << "Found clef" << endl;
+ chunks.push_back(Chunk(el->event()->getSubOrdering(),
+ getLayoutWidth(*el, npf, key)));
+
+ clef = Clef(*el->event());
+ accTable.newClef(clef);
+
+ } else if (el->event()->isa(::Rosegarden::Key::EventType)) {
+
+ // NOTATION_DEBUG << "Found key" << endl;
+ chunks.push_back(Chunk(el->event()->getSubOrdering(),
+ getLayoutWidth(*el, npf, key)));
+
+ key = ::Rosegarden::Key(*el->event());
+
+ accTable = AccidentalTable
+ (key, clef, octaveType, barResetType);
+
+ } else if (el->event()->isa(Text::EventType)) {
+
+ // the only text events of interest are lyrics, which
+ // contribute to a fixed area following the next chord
+
+ if (el->event()->has(Text::TextTypePropertyName) &&
+ el->event()->get<String>(Text::TextTypePropertyName) ==
+ Text::Lyric) {
+ lyricWidth = std::max
+ (lyricWidth, float(npf->getTextWidth(Text(*el->event()))));
+ NOTATION_DEBUG << "Setting lyric width to " << lyricWidth
+ << " for text " << el->event()->get<String>(Text::TextPropertyName) << endl;
+ }
+ chunks.push_back(Chunk(el->event()->getSubOrdering(), 0));
+
+ } else if (el->isNote()) {
+
+ NotePixmapFactory *cnpf = npf;
+ if (el->isGrace()) cnpf = getGraceNotePixmapFactory(staff);
+
+ scanChord(notes, itr, clef, key, accTable,
+ lyricWidth, chunks, cnpf, ottavaShift, to);
+
+ } else if (el->isRest()) {
+
+ chunks.push_back(Chunk(el->getViewDuration(),
+ el->event()->getSubOrdering(),
+ 0,
+ getLayoutWidth(*el, npf, key)));
+
+ } else if (el->event()->isa(Indication::EventType)) {
+
+ // NOTATION_DEBUG << "Found indication" << endl;
+
+ chunks.push_back(Chunk(el->event()->getSubOrdering(), 0));
+
+ try {
+ Indication indication(*el->event());
+ if (indication.isOttavaType()) {
+ ottavaShift = indication.getOttavaShift();
+ ottavaEnd = el->event()->getAbsoluteTime() +
+ indication.getIndicationDuration();
+ m_haveOttavaSomewhere[&staff] = true;
+ }
+ } catch (...) {
+ NOTATION_DEBUG << "Bad indication!" << endl;
+ }
+
+ } else {
+
+// NOTATION_DEBUG << "Found something I don't know about (type is " << el->event()->getType() << ")" << endl;
+ chunks.push_back(Chunk(el->event()->getSubOrdering(),
+ getLayoutWidth(*el, npf, key)));
+ }
+
+ actualBarEnd = el->getViewAbsoluteTime() + el->getViewDuration();
+ }
+
+ if (actualBarEnd == barTimes.first)
+ actualBarEnd = barTimes.second;
+ barCorrect = (actualBarEnd == barTimes.second);
+
+ setBarSizeData(staff, barNo, fixedWidth,
+ actualBarEnd - barTimes.first);
+
+ if ((endTime > startTime) && (barNo % 20 == 0)) {
+ emit setProgress((barTimes.second - startTime) * 95 /
+ (endTime - startTime));
+ ProgressDialog::processEvents();
+ }
+
+ throwIfCancelled();
+ }
+ /*
+ BarDataList::iterator ei(barList.end());
+ while (ei != barList.begin() && (--ei)->first > endBarNo) {
+ barList.erase(ei);
+ ei = barList.end();
+ }
+ */
+}
+
+void
+NotationHLayout::clearBarList(Staff &staff)
+{
+ BarDataList &bdl = m_barData[&staff];
+ bdl.clear();
+}
+
+void
+NotationHLayout::setBarBasicData(Staff &staff,
+ int barNo,
+ NotationElementList::iterator start,
+ bool correct,
+ TimeSignature timeSig,
+ bool newTimeSig)
+{
+ // NOTATION_DEBUG << "setBarBasicData for " << barNo << endl;
+
+ BarDataList &bdl(m_barData[&staff]);
+
+ BarDataList::iterator i(bdl.find(barNo));
+ if (i == bdl.end()) {
+ NotationElementList::iterator endi = staff.getViewElementList()->end();
+ bdl.insert(BarDataPair(barNo, BarData(endi, true,
+ TimeSignature(), false)));
+ i = bdl.find(barNo);
+ }
+
+ i->second.basicData.start = start;
+ i->second.basicData.correct = correct;
+ i->second.basicData.timeSignature = timeSig;
+ i->second.basicData.newTimeSig = newTimeSig;
+}
+
+void
+NotationHLayout::setBarSizeData(Staff &staff,
+ int barNo,
+ float fixedWidth,
+ timeT actualDuration)
+{
+ // NOTATION_DEBUG << "setBarSizeData for " << barNo << endl;
+
+ BarDataList &bdl(m_barData[&staff]);
+
+ BarDataList::iterator i(bdl.find(barNo));
+ if (i == bdl.end()) {
+ NotationElementList::iterator endi = staff.getViewElementList()->end();
+ bdl.insert(BarDataPair(barNo, BarData(endi, true,
+ TimeSignature(), false)));
+ i = bdl.find(barNo);
+ }
+
+ i->second.sizeData.actualDuration = actualDuration;
+ i->second.sizeData.idealWidth = 0.0;
+ i->second.sizeData.reconciledWidth = 0.0;
+ i->second.sizeData.clefKeyWidth = 0;
+ i->second.sizeData.fixedWidth = fixedWidth;
+}
+
+void
+NotationHLayout::scanChord(NotationElementList *notes,
+ NotationElementList::iterator &itr,
+ const Clef &clef,
+ const ::Rosegarden::Key &key,
+ AccidentalTable &accTable,
+ float &lyricWidth,
+ ChunkList &chunks,
+ NotePixmapFactory *npf,
+ int ottavaShift,
+ NotationElementList::iterator &to)
+{
+ NotationChord chord(*notes, itr, m_notationQuantizer, m_properties);
+ Accidental someAccidental = Accidentals::NoAccidental;
+ bool someCautionary = false;
+ bool barEndsInChord = false;
+ bool grace = false;
+
+// std::cerr << "NotationHLayout::scanChord: "
+// << chord.size() << "-voice chord at "
+// << (*itr)->event()->getAbsoluteTime()
+// << " unquantized, "
+// << (*itr)->getViewAbsoluteTime()
+// << " quantized" << std::endl;
+
+// NOTATION_DEBUG << "Contents:" << endl;
+
+ /*
+ for (NotationElementList::iterator i = chord.getInitialElement();
+ i != notes->end(); ++i) {
+ (*i)->event()->dump(std::cerr);
+ if (i == chord.getFinalElement()) break;
+ }
+ */
+ // We don't need to get the chord's notes in pitch order here,
+ // but we do need to ensure we see any random non-note events
+ // that may crop up in the middle of it.
+
+ for (NotationElementList::iterator i = chord.getInitialElement();
+ i != notes->end(); ++i) {
+
+ NotationElement *el = static_cast<NotationElement*>(*i);
+ if (el->isRest()) {
+ el->event()->setMaybe<Bool>(m_properties.REST_TOO_SHORT, true);
+ if (i == chord.getFinalElement())
+ break;
+ continue;
+ }
+
+ if (el->isGrace()) {
+ grace = true;
+ }
+
+ long pitch = 64;
+ if (!el->event()->get<Int>(PITCH, pitch)) {
+ NOTATION_DEBUG <<
+ "WARNING: NotationHLayout::scanChord: couldn't get pitch for element, using default pitch of " << pitch << endl;
+ }
+
+ Accidental explicitAccidental = Accidentals::NoAccidental;
+ (void)el->event()->get<String>(ACCIDENTAL, explicitAccidental);
+
+ Pitch p(pitch, explicitAccidental);
+ int h = p.getHeightOnStaff(clef, key);
+ Accidental acc = p.getDisplayAccidental(key);
+
+ h -= 7 * ottavaShift;
+
+ el->event()->setMaybe<Int>(NotationProperties::OTTAVA_SHIFT, ottavaShift);
+ el->event()->setMaybe<Int>(NotationProperties::HEIGHT_ON_STAFF, h);
+ el->event()->setMaybe<String>(m_properties.CALCULATED_ACCIDENTAL, acc);
+
+ // update display acc for note according to the accTable
+ // (accidentals in force when the last chord ended) and tell
+ // accTable about accidentals from this note.
+
+ bool cautionary = false;
+ if (el->event()->has(m_properties.USE_CAUTIONARY_ACCIDENTAL)) {
+ cautionary = el->event()->get<Bool>(m_properties.USE_CAUTIONARY_ACCIDENTAL);
+ }
+ Accidental dacc = accTable.processDisplayAccidental(acc, h, cautionary);
+ el->event()->setMaybe<String>(m_properties.DISPLAY_ACCIDENTAL, dacc);
+ el->event()->setMaybe<Bool>(m_properties.DISPLAY_ACCIDENTAL_IS_CAUTIONARY,
+ cautionary);
+ if (cautionary) {
+ someCautionary = true;
+ }
+
+ if (someAccidental == Accidentals::NoAccidental)
+ someAccidental = dacc;
+
+ if (i == to)
+ barEndsInChord = true;
+
+ if (i == chord.getFinalElement())
+ break;
+ }
+
+ // tell accTable the chord has ended, so to bring its accidentals
+ // into force for future chords
+ accTable.update();
+
+ chord.applyAccidentalShiftProperties();
+
+ float extraWidth = 0;
+
+ if (someAccidental != Accidentals::NoAccidental) {
+ bool extraShift = false;
+ int shift = chord.getMaxAccidentalShift(extraShift);
+ int e = npf->getAccidentalWidth(someAccidental, shift, extraShift);
+ if (someAccidental != Accidentals::Sharp) {
+ e = std::max(e, npf->getAccidentalWidth(Accidentals::Sharp, shift, extraShift));
+ }
+ if (someCautionary) {
+ e += npf->getNoteBodyWidth();
+ }
+ extraWidth += e;
+ }
+
+ float layoutExtra = 0;
+ if (chord.hasNoteHeadShifted()) {
+ if (chord.hasStemUp()) {
+ layoutExtra += npf->getNoteBodyWidth();
+ } else {
+ extraWidth = std::max(extraWidth, float(npf->getNoteBodyWidth()));
+ }
+ }
+/*!!!
+ if (grace) {
+ std::cerr << "Grace note: subordering " << chord.getSubOrdering() << std::endl;
+ chunks.push_back(Chunk(-10 + graceCount,
+ extraWidth + npf->getNoteBodyWidth()));
+ if (graceCount < 9) ++graceCount;
+ return;
+ } else {
+ std::cerr << "Non-grace note (grace count was " << graceCount << ")" << std::endl;
+ graceCount = 0;
+ }
+*/
+ NotationElementList::iterator myLongest = chord.getLongestElement();
+ if (myLongest == notes->end()) {
+ NOTATION_DEBUG << "WARNING: NotationHLayout::scanChord: No longest element in chord!" << endl;
+ }
+
+ timeT d = (*myLongest)->getViewDuration();
+
+ NOTATION_DEBUG << "Lyric width is " << lyricWidth << endl;
+
+ if (grace) {
+ chunks.push_back(Chunk(d, chord.getSubOrdering(),
+ extraWidth + layoutExtra
+ + getLayoutWidth(**myLongest, npf, key)
+ - npf->getNoteBodyWidth(), // tighten up
+ 0));
+ } else {
+ chunks.push_back(Chunk(d, 0, extraWidth,
+ std::max(layoutExtra +
+ getLayoutWidth(**myLongest, npf, key),
+ lyricWidth)));
+ lyricWidth = 0;
+ }
+
+ itr = chord.getFinalElement();
+ if (barEndsInChord) {
+ to = itr;
+ ++to;
+ }
+}
+
+struct ChunkLocation {
+ timeT time;
+ short subordering;
+ ChunkLocation(timeT t, short s) : time(t), subordering(s) { }
+};
+
+bool operator<(const ChunkLocation &l0, const ChunkLocation &l1) {
+ return ((l0.time < l1.time) ||
+ ((l0.time == l1.time) && (l0.subordering < l1.subordering)));
+}
+
+
+
+void
+NotationHLayout::preSquishBar(int barNo)
+{
+ typedef std::vector<Chunk *> ChunkRefList;
+ typedef std::map<ChunkLocation, ChunkRefList> ColumnMap;
+ static ColumnMap columns;
+ bool haveSomething = false;
+
+ columns.clear();
+
+ for (BarDataMap::iterator mi = m_barData.begin();
+ mi != m_barData.end(); ++mi) {
+
+ BarDataList &bdl = mi->second;
+ BarDataList::iterator bdli = bdl.find(barNo);
+
+ if (bdli != bdl.end()) {
+
+ haveSomething = true;
+ ChunkList &cl(bdli->second.chunks);
+ timeT aggregateTime = 0;
+
+ for (ChunkList::iterator cli = cl.begin(); cli != cl.end(); ++cli) {
+
+ // Subordering is typically zero for notes, positive
+ // for rests and negative for other stuff. We want to
+ // handle notes and rests together, but not the others.
+
+ int subordering = cli->subordering;
+ if (subordering > 0)
+ subordering = 0;
+
+ columns[ChunkLocation(aggregateTime, subordering)].push_back(&(*cli));
+
+ aggregateTime += cli->duration;
+ }
+ }
+ }
+
+ if (!haveSomething)
+ return ;
+
+ // now modify chunks in-place
+
+ // What we want to do here is idle along the whole set of chunk
+ // lists, inspecting all the chunks that occur at each moment in
+ // turn and choosing a "rate" from the "slowest" of these
+ // (i.e. most space per time)
+
+ float x = 0.0;
+ timeT prevTime = 0;
+ double prevRate = 0.0;
+ float maxStretchy = 0.0;
+
+ NOTATION_DEBUG << "NotationHLayout::preSquishBar(" << barNo << "): have "
+ << columns.size() << " columns" << endl;
+
+ for (ColumnMap::iterator i = columns.begin(); i != columns.end(); ++i) {
+
+ timeT time = i->first.time;
+ ChunkRefList &list = i->second;
+
+ NOTATION_DEBUG << "NotationHLayout::preSquishBar: "
+ << "column at " << time << " : " << i->first.subordering << endl;
+
+
+ double minRate = -1.0;
+ float totalFixed = 0.0;
+ maxStretchy = 0.0;
+
+ for (ChunkRefList::iterator j = list.begin(); j != list.end(); ++j) {
+ if ((*j)->stretchy > 0.0) {
+ double rate = (*j)->duration / (*j)->stretchy; // time per px
+ NOTATION_DEBUG << "NotationHLayout::preSquishBar: rate " << rate << endl;
+ if (minRate < 0.0 || rate < minRate)
+ minRate = rate;
+ } else {
+ NOTATION_DEBUG << "NotationHLayout::preSquishBar: not stretchy" << endl;
+ }
+
+ maxStretchy = std::max(maxStretchy, (*j)->stretchy);
+ totalFixed = std::max(totalFixed, (*j)->fixed);
+ }
+
+ NOTATION_DEBUG << "NotationHLayout::preSquishBar: minRate " << minRate << ", maxStretchy " << maxStretchy << ", totalFixed " << totalFixed << endl;
+
+ // we have the rate from this point, but we want to assign
+ // these elements an x coord based on the rate and distance
+ // from the previous point, plus fixed space for this point
+ // if it's a note (otherwise fixed space goes afterwards)
+
+ if (i->first.subordering == 0)
+ x += totalFixed;
+ if (prevRate > 0.0)
+ x += (time - prevTime) / prevRate;
+
+ for (ChunkRefList::iterator j = list.begin(); j != list.end(); ++j) {
+ NOTATION_DEBUG << "Setting x for time " << time << " to " << x << " in chunk at " << *j << endl;
+ (*j)->x = x;
+ }
+
+ if (i->first.subordering != 0)
+ x += totalFixed;
+
+ prevTime = time;
+ prevRate = minRate;
+ }
+
+ x += maxStretchy;
+
+ for (BarDataMap::iterator mi = m_barData.begin();
+ mi != m_barData.end(); ++mi) {
+
+ BarDataList &bdl = mi->second;
+ BarDataList::iterator bdli = bdl.find(barNo);
+ if (bdli != bdl.end()) {
+
+ bdli->second.sizeData.idealWidth =
+ bdli->second.sizeData.fixedWidth + x;
+
+ if (!bdli->second.basicData.timeSignature.hasHiddenBars()) {
+ bdli->second.sizeData.idealWidth += getBarMargin();
+ } else if (bdli->second.basicData.newTimeSig) {
+ bdli->second.sizeData.idealWidth += getPostBarMargin();
+ }
+
+ bdli->second.sizeData.reconciledWidth =
+ bdli->second.sizeData.idealWidth;
+
+ bdli->second.layoutData.needsLayout = true;
+ }
+ }
+}
+
+Staff *
+NotationHLayout::getStaffWithWidestBar(int barNo)
+{
+ float maxWidth = -1;
+ Staff *widest = 0;
+
+ for (BarDataMap::iterator mi = m_barData.begin();
+ mi != m_barData.end(); ++mi) {
+
+ BarDataList &list = mi->second;
+ BarDataList::iterator li = list.find(barNo);
+ if (li != list.end()) {
+
+ NOTATION_DEBUG << "getStaffWithWidestBar: idealWidth is " << li->second.sizeData.idealWidth << endl;
+
+ if (li->second.sizeData.idealWidth == 0.0) {
+ NOTATION_DEBUG << "getStaffWithWidestBar(" << barNo << "): found idealWidth of zero, presquishing" << endl;
+ preSquishBar(barNo);
+ }
+
+ if (li->second.sizeData.idealWidth > maxWidth) {
+ maxWidth = li->second.sizeData.idealWidth;
+ widest = mi->first;
+ }
+ }
+ }
+
+ return widest;
+}
+
+int
+NotationHLayout::getMaxRepeatedClefAndKeyWidth(int barNo)
+{
+ int max = 0;
+
+ timeT barStart = 0;
+
+ for (BarDataMap::iterator mi = m_barData.begin();
+ mi != m_barData.end(); ++mi) {
+
+ Staff *staff = mi->first;
+ if (mi == m_barData.begin()) {
+ barStart = staff->getSegment().getComposition()->getBarStart(barNo);
+ }
+
+ timeT t;
+ int w = 0;
+
+ Clef clef = staff->getSegment().getClefAtTime(barStart, t);
+ if (t < barStart)
+ w += m_npf->getClefWidth(clef);
+
+ ::Rosegarden::Key key = staff->getSegment().getKeyAtTime(barStart, t);
+ if (t < barStart)
+ w += m_npf->getKeyWidth(key);
+
+ if (w > max)
+ max = w;
+ }
+
+ NOTATION_DEBUG << "getMaxRepeatedClefAndKeyWidth(" << barNo << "): " << max
+ << endl;
+
+ if (max > 0)
+ return max + getFixedItemSpacing() * 2;
+ else
+ return 0;
+}
+
+void
+NotationHLayout::reconcileBarsLinear()
+{
+ Profiler profiler("NotationHLayout::reconcileBarsLinear");
+
+ // Ensure that concurrent bars on all staffs have the same width,
+ // which for now we make the maximum width required for this bar
+ // on any staff. These days getStaffWithWidestBar actually does
+ // most of the work in its call to preSquishBar, but this function
+ // still sets the bar line positions etc.
+
+ int barNo = getFirstVisibleBar();
+
+ m_totalWidth = 0.0;
+ for (StaffIntMap::iterator i = m_staffNameWidths.begin();
+ i != m_staffNameWidths.end(); ++i) {
+ if (i->second > m_totalWidth)
+ m_totalWidth = double(i->second);
+ }
+
+ for (;;) {
+
+ Staff *widest = getStaffWithWidestBar(barNo);
+
+ if (!widest) {
+ // have we reached the end of the piece?
+ if (barNo >= getLastVisibleBar()) { // yes
+ break;
+ } else {
+ m_totalWidth += m_spacing / 3;
+ NOTATION_DEBUG << "Setting bar position for degenerate bar "
+ << barNo << " to " << m_totalWidth << endl;
+
+ m_barPositions[barNo] = m_totalWidth;
+ ++barNo;
+ continue;
+ }
+ }
+
+ float maxWidth = m_barData[widest].find(barNo)->second.sizeData.idealWidth;
+ if (m_pageWidth > 0.1 && maxWidth > m_pageWidth) {
+ maxWidth = m_pageWidth;
+ }
+
+ NOTATION_DEBUG << "Setting bar position for bar " << barNo
+ << " to " << m_totalWidth << endl;
+
+ m_barPositions[barNo] = m_totalWidth;
+ m_totalWidth += maxWidth;
+
+ // Now apply width to this bar on all staffs
+
+ for (BarDataMap::iterator i = m_barData.begin();
+ i != m_barData.end(); ++i) {
+
+ BarDataList &list = i->second;
+ BarDataList::iterator bdli = list.find(barNo);
+ if (bdli != list.end()) {
+
+ BarData::SizeData &bd(bdli->second.sizeData);
+
+ NOTATION_DEBUG << "Changing width from " << bd.reconciledWidth << " to " << maxWidth << endl;
+
+ double diff = maxWidth - bd.reconciledWidth;
+ if (diff < -0.1 || diff > 0.1) {
+ NOTATION_DEBUG << "(So needsLayout becomes true)" << endl;
+ bdli->second.layoutData.needsLayout = true;
+ }
+ bd.reconciledWidth = maxWidth;
+ }
+ }
+
+ ++barNo;
+ }
+
+ NOTATION_DEBUG << "Setting bar position for bar " << barNo
+ << " to " << m_totalWidth << endl;
+
+ m_barPositions[barNo] = m_totalWidth;
+}
+
+void
+NotationHLayout::reconcileBarsPage()
+{
+ Profiler profiler("NotationHLayout::reconcileBarsPage");
+
+ int barNo = getFirstVisibleBar();
+ int barNoThisRow = 0;
+
+ // pair of the recommended number of bars with those bars'
+ // original total width, for each row
+ std::vector<std::pair<int, double> > rowData;
+
+ double stretchFactor = 10.0;
+ double maxStaffNameWidth = 0.0;
+
+ for (StaffIntMap::iterator i = m_staffNameWidths.begin();
+ i != m_staffNameWidths.end(); ++i) {
+ if (i->second > maxStaffNameWidth) {
+ maxStaffNameWidth = double(i->second);
+ }
+ }
+
+ double pageWidthSoFar = maxStaffNameWidth;
+ m_totalWidth = maxStaffNameWidth + getPreBarMargin();
+
+ NOTATION_DEBUG << "NotationHLayout::reconcileBarsPage: pageWidthSoFar is " << pageWidthSoFar << endl;
+
+ for (;;) {
+
+ Staff *widest = getStaffWithWidestBar(barNo);
+ double maxWidth = m_spacing / 3;
+
+ if (!widest) {
+ // have we reached the end of the piece?
+ if (barNo >= getLastVisibleBar())
+ break; // yes
+ } else {
+ maxWidth =
+ m_barData[widest].find(barNo)->second.sizeData.idealWidth;
+ }
+
+ // Work on the assumption that this bar is the last in the
+ // row. How would that make things look?
+
+ double nextPageWidth = pageWidthSoFar + maxWidth;
+ double nextStretchFactor = m_pageWidth / nextPageWidth;
+
+ NOTATION_DEBUG << "barNo is " << barNo << ", maxWidth " << maxWidth << ", nextPageWidth " << nextPageWidth << ", nextStretchFactor " << nextStretchFactor << ", m_pageWidth " << m_pageWidth << endl;
+
+ // We have to have at least one bar per row
+
+ bool tooFar = false;
+
+ if (barNoThisRow >= 1) {
+
+ // If this stretch factor is "worse" than the previous
+ // one, we've come too far and have too many bars
+
+ if (fabs(1.0 - nextStretchFactor) > fabs(1.0 - stretchFactor)) {
+ tooFar = true;
+ }
+
+ // If the next stretch factor is less than 1 and would
+ // make this bar on any of the staffs narrower than it can
+ // afford to be, then we've got too many bars
+ //!!! rework this -- we have no concept of "too narrow"
+ // any more but we can declare we don't want it any
+ // narrower than e.g. 90% or something based on the spacing
+ /*!!!
+ if (!tooFar && (nextStretchFactor < 1.0)) {
+
+ for (BarDataMap::iterator i = m_barData.begin();
+ i != m_barData.end(); ++i) {
+
+ BarDataList &list = i->second;
+ BarDataList::iterator bdli = list.find(barNo);
+ if (bdli != list.end()) {
+ BarData::SizeData &bd(bdli->second.sizeData);
+ if ((nextStretchFactor * bd.idealWidth) <
+ (double)(bd.fixedWidth + bd.baseWidth)) {
+ tooFar = true;
+ break;
+ }
+ }
+ }
+ }
+ */
+ }
+
+ if (tooFar) {
+ rowData.push_back(std::pair<int, double>(barNoThisRow,
+ pageWidthSoFar));
+ barNoThisRow = 1;
+
+ // When we start a new row, we always need to allow for the
+ // repeated clef and key at the start of it.
+ int maxClefKeyWidth = getMaxRepeatedClefAndKeyWidth(barNo);
+
+ for (BarDataMap::iterator i = m_barData.begin();
+ i != m_barData.end(); ++i) {
+
+ BarDataList &list = i->second;
+ BarDataList::iterator bdli = list.find(barNo);
+
+ if (bdli != list.end()) {
+ bdli->second.sizeData.clefKeyWidth = maxClefKeyWidth;
+ }
+ }
+
+ pageWidthSoFar = maxWidth + maxClefKeyWidth;
+ stretchFactor = m_pageWidth / pageWidthSoFar;
+ } else {
+ ++barNoThisRow;
+ pageWidthSoFar = nextPageWidth;
+ stretchFactor = nextStretchFactor;
+ }
+
+ ++barNo;
+ }
+
+ if (barNoThisRow > 0) {
+ rowData.push_back(std::pair<int, double>(barNoThisRow,
+ pageWidthSoFar));
+ }
+
+ // Now we need to actually apply the widths
+
+ barNo = getFirstVisibleBar();
+
+ for (unsigned int row = 0; row < rowData.size(); ++row) {
+
+ barNoThisRow = barNo;
+ int finalBarThisRow = barNo + rowData[row].first - 1;
+
+ pageWidthSoFar = (row > 0 ? 0 : maxStaffNameWidth + getPreBarMargin());
+ stretchFactor = m_pageWidth / rowData[row].second;
+
+ for (; barNoThisRow <= finalBarThisRow; ++barNoThisRow, ++barNo) {
+
+ bool finalRow = (row == rowData.size() - 1);
+
+ Staff *widest = getStaffWithWidestBar(barNo);
+ if (finalRow && (stretchFactor > 1.0))
+ stretchFactor = 1.0;
+ double maxWidth = 0.0;
+
+ if (!widest) {
+ // have we reached the end of the piece? (shouldn't happen)
+ if (barNo >= getLastVisibleBar())
+ break; // yes
+ else
+ maxWidth = stretchFactor * (m_spacing / 3);
+ } else {
+ BarData &bd = m_barData[widest].find(barNo)->second;
+ maxWidth = (stretchFactor * bd.sizeData.idealWidth) +
+ bd.sizeData.clefKeyWidth;
+ NOTATION_DEBUG << "setting maxWidth to " << (stretchFactor * bd.sizeData.idealWidth) << " + " << bd.sizeData.clefKeyWidth << " = " << maxWidth << endl;
+ }
+
+ if (barNoThisRow == finalBarThisRow) {
+ if (!finalRow ||
+ (maxWidth > (m_pageWidth - pageWidthSoFar))) {
+ maxWidth = m_pageWidth - pageWidthSoFar;
+ NOTATION_DEBUG << "reset maxWidth to " << m_pageWidth << " - " << pageWidthSoFar << " = " << maxWidth << endl;
+ }
+ }
+
+ m_barPositions[barNo] = m_totalWidth;
+ m_totalWidth += maxWidth;
+
+ for (BarDataMap::iterator i = m_barData.begin();
+ i != m_barData.end(); ++i) {
+
+ BarDataList &list = i->second;
+ BarDataList::iterator bdli = list.find(barNo);
+ if (bdli != list.end()) {
+ BarData::SizeData &bd(bdli->second.sizeData);
+ double diff = maxWidth - bd.reconciledWidth;
+ if (diff < -0.1 || diff > 0.1) {
+ bdli->second.layoutData.needsLayout = true;
+ }
+ bd.reconciledWidth = maxWidth;
+ }
+ }
+
+ pageWidthSoFar += maxWidth;
+ }
+ }
+
+ m_barPositions[barNo] = m_totalWidth;
+}
+
+void
+NotationHLayout::finishLayout(timeT startTime, timeT endTime)
+{
+ Profiler profiler("NotationHLayout::finishLayout");
+ m_barPositions.clear();
+
+ bool isFullLayout = (startTime == endTime);
+ if (m_pageMode && (m_pageWidth > 0.1))
+ reconcileBarsPage();
+ else
+ reconcileBarsLinear();
+
+ int staffNo = 0;
+
+ for (BarDataMap::iterator i(m_barData.begin());
+ i != m_barData.end(); ++i) {
+
+ emit setProgress(100 * staffNo / m_barData.size());
+ ProgressDialog::processEvents();
+
+ throwIfCancelled();
+
+ timeT timeCovered = endTime - startTime;
+
+ if (isFullLayout) {
+ NotationElementList *notes = i->first->getViewElementList();
+ if (notes->begin() != notes->end()) {
+ NotationElementList::iterator j(notes->end());
+ timeCovered =
+ (*--j)->getViewAbsoluteTime() -
+ (*notes->begin())->getViewAbsoluteTime();
+ }
+ }
+
+ m_timePerProgressIncrement = timeCovered / (100 / m_barData.size());
+
+ layout(i, startTime, endTime);
+ ++staffNo;
+ }
+}
+
+void
+NotationHLayout::layout(BarDataMap::iterator i, timeT startTime, timeT endTime)
+{
+ Profiler profiler("NotationHLayout::layout");
+
+ Staff &staff = *(i->first);
+ NotationElementList *notes = staff.getViewElementList();
+ BarDataList &barList(getBarData(staff));
+ NotationStaff &notationStaff = dynamic_cast<NotationStaff &>(staff);
+
+ bool isFullLayout = (startTime == endTime);
+
+ // these two are for partial layouts:
+ // bool haveSimpleOffset = false;
+ // double simpleOffset = 0;
+
+ NOTATION_DEBUG << "NotationHLayout::layout: full layout " << isFullLayout << ", times " << startTime << "->" << endTime << endl;
+
+ double x = 0, barX = 0;
+ TieMap tieMap;
+
+ timeT lastIncrement =
+ (isFullLayout && (notes->begin() != notes->end())) ?
+ (*notes->begin())->getViewAbsoluteTime() : startTime;
+
+ ::Rosegarden::Key key = notationStaff.getSegment().getKeyAtTime(lastIncrement);
+ Clef clef = notationStaff.getSegment().getClefAtTime(lastIncrement);
+ TimeSignature timeSignature;
+
+ int startBar = getComposition()->getBarNumber(startTime);
+
+ KConfig *config = kapp->config();
+ config->setGroup("Notation Options");
+ bool showInvisibles = config->readBoolEntry("showinvisibles", true);
+
+ for (BarPositionList::iterator bpi = m_barPositions.begin();
+ bpi != m_barPositions.end(); ++bpi) {
+
+ int barNo = bpi->first;
+ if (!isFullLayout && barNo < startBar)
+ continue;
+
+ NOTATION_DEBUG << "NotationHLayout::looking for bar "
+ << bpi->first << endl;
+ BarDataList::iterator bdi = barList.find(barNo);
+ if (bdi == barList.end())
+ continue;
+ barX = bpi->second;
+
+ NotationElementList::iterator from = bdi->second.basicData.start;
+ NotationElementList::iterator to;
+
+ NOTATION_DEBUG << "NotationHLayout::layout(): starting bar " << barNo << ", x = " << barX << ", width = " << bdi->second.sizeData.idealWidth << ", time = " << (from == notes->end() ? -1 : (*from)->getViewAbsoluteTime()) << endl;
+
+ BarDataList::iterator nbdi(bdi);
+ if (++nbdi == barList.end()) {
+ to = notes->end();
+ } else {
+ to = nbdi->second.basicData.start;
+ }
+
+ if (from == notes->end()) {
+ NOTATION_DEBUG << "Start is end" << endl;
+ }
+ if (from == to) {
+ NOTATION_DEBUG << "Start is to" << endl;
+ }
+
+ if (!bdi->second.layoutData.needsLayout) {
+
+ double offset = barX - bdi->second.layoutData.x;
+
+ NOTATION_DEBUG << "NotationHLayout::layout(): bar " << barNo << " has needsLayout false and offset of " << offset << endl;
+
+ if (offset > -0.1 && offset < 0.1) {
+ NOTATION_DEBUG << "NotationHLayout::layout(): no offset, ignoring" << endl;
+ continue;
+ }
+
+ bdi->second.layoutData.x += offset;
+
+ if (bdi->second.basicData.newTimeSig)
+ bdi->second.layoutData.timeSigX += (int)offset;
+
+ for (NotationElementList::iterator it = from;
+ it != to && it != notes->end(); ++it) {
+
+ NotationElement* nel = static_cast<NotationElement*>(*it);
+ NOTATION_DEBUG << "NotationHLayout::layout(): shifting element's x to " << ((*it)->getLayoutX() + offset) << " (was " << (*it)->getLayoutX() << ")" << endl;
+ nel->setLayoutX((*it)->getLayoutX() + offset);
+ double airX, airWidth;
+ nel->getLayoutAirspace(airX, airWidth);
+ nel->setLayoutAirspace(airX + offset, airWidth);
+ }
+
+ continue;
+ }
+
+ bdi->second.layoutData.x = barX;
+ // x = barX + getPostBarMargin();
+
+ bool timeSigToPlace = false;
+ if (bdi->second.basicData.newTimeSig) {
+ timeSignature = bdi->second.basicData.timeSignature;
+ timeSigToPlace = !bdi->second.basicData.timeSignature.isHidden();
+ }
+ if (timeSigToPlace) {
+ NOTATION_DEBUG << "NotationHLayout::layout(): there's a time sig in this bar" << endl;
+ }
+
+ bool repeatClefAndKey = false;
+ if (bdi->second.sizeData.clefKeyWidth > 0) {
+ repeatClefAndKey = true;
+ }
+ if (repeatClefAndKey) {
+ NOTATION_DEBUG << "NotationHLayout::layout(): need to repeat clef & key in this bar" << endl;
+ }
+
+ double barInset = notationStaff.getBarInset(barNo, repeatClefAndKey);
+
+ NotationElement *lastDynamicText = 0;
+ int fretboardCount = 0;
+ int count = 0;
+
+ double offset = 0.0;
+ double reconciledWidth = bdi->second.sizeData.reconciledWidth;
+
+ if (repeatClefAndKey) {
+ offset = bdi->second.sizeData.clefKeyWidth;
+ reconciledWidth -= offset;
+ }
+
+ if (bdi->second.basicData.newTimeSig ||
+ !bdi->second.basicData.timeSignature.hasHiddenBars()) {
+ offset += getPostBarMargin();
+ }
+
+ ChunkList &chunks = bdi->second.chunks;
+ ChunkList::iterator chunkitr = chunks.begin();
+ double reconcileRatio = 1.0;
+ if (bdi->second.sizeData.idealWidth > 0.0) {
+ reconcileRatio = reconciledWidth / bdi->second.sizeData.idealWidth;
+ }
+
+ NOTATION_DEBUG << "have " << chunks.size() << " chunks, reconciledWidth " << bdi->second.sizeData.reconciledWidth << ", idealWidth " << bdi->second.sizeData.idealWidth << ", ratio " << reconcileRatio << endl;
+
+ double delta = 0;
+ float sigx = 0.f;
+
+ for (NotationElementList::iterator it = from; it != to; ++it) {
+
+ NotationElement *el = static_cast<NotationElement*>(*it);
+ delta = 0;
+ float fixed = 0;
+
+ if (el->event()->isa(Note::EventType)) {
+ long pitch = 0;
+ el->event()->get<Int>(PITCH, pitch);
+ NOTATION_DEBUG << "element is a " << el->event()->getType() << " (pitch " << pitch << ")" << endl;
+ } else {
+ NOTATION_DEBUG << "element is a " << el->event()->getType() << endl;
+ }
+
+ bool invisible = false;
+ if (el->event()->get<Bool>(INVISIBLE, invisible) && invisible) {
+ if (!showInvisibles)
+ continue;
+ }
+
+// float sigx = 0;
+
+ if (chunkitr != chunks.end()) {
+ NOTATION_DEBUG << "new chunk: addr " << &(*chunkitr) << " duration=" << (*chunkitr).duration << " subordering=" << (*chunkitr).subordering << " fixed=" << (*chunkitr).fixed << " stretchy=" << (*chunkitr).stretchy << " x=" << (*chunkitr).x << endl;
+ x = barX + offset + reconcileRatio * (*chunkitr).x;
+ fixed = (*chunkitr).fixed;
+// sigx = barX + offset - fixed;
+// sigx = x - fixed;
+ NOTATION_DEBUG << "adjusted x is " << x << ", fixed is " << fixed << endl;
+
+ if (timeSigToPlace) {
+ if (el->event()->isa(Clef::EventType) ||
+ el->event()->isa(Rosegarden::Key::EventType)) {
+ sigx = x + (*chunkitr).fixed + (*chunkitr).stretchy;
+ }
+ }
+
+ ChunkList::iterator chunkscooter(chunkitr);
+ if (++chunkscooter != chunks.end()) {
+ delta = (*chunkscooter).x - (*chunkitr).x;
+ } else {
+ delta = reconciledWidth -
+ bdi->second.sizeData.fixedWidth - (*chunkitr).x;
+ }
+ delta *= reconcileRatio;
+
+ ++chunkitr;
+ } else {
+ x = barX + reconciledWidth - getPreBarMargin();
+// sigx = x;
+ delta = 0;
+ }
+
+ if (timeSigToPlace &&
+ !el->event()->isa(Clef::EventType) &&
+ !el->event()->isa(::Rosegarden::Key::EventType)) {
+
+ if (sigx == 0.f) {
+ sigx = barX + offset;
+ }
+
+// NOTATION_DEBUG << "Placing timesig at " << (x - fixed) << endl;
+// bdi->second.layoutData.timeSigX = (int)(x - fixed);
+ NOTATION_DEBUG << "Placing timesig at " << sigx << " (would previously have been " << int(x-fixed) << "?)" << endl;
+ bdi->second.layoutData.timeSigX = (int)sigx;
+ double shift = getFixedItemSpacing() +
+ m_npf->getTimeSigWidth(timeSignature);
+ offset += shift;
+ x += shift;
+ NOTATION_DEBUG << "and moving next elt to " << x << endl;
+ timeSigToPlace = false;
+ }
+
+ if (barInset >= 1.0) {
+ if (el->event()->isa(Clef::EventType) ||
+ el->event()->isa(::Rosegarden::Key::EventType)) {
+ NOTATION_DEBUG << "Pulling clef/key back by " << getPreBarMargin() << endl;
+ x -= getPostBarMargin() * 2 / 3;
+ } else {
+ barInset = 0.0;
+ }
+ }
+
+ NOTATION_DEBUG << "NotationHLayout::layout(): setting element's x to " << x << " (was " << el->getLayoutX() << ")" << endl;
+
+ double displacedX = 0.0;
+ long dxRaw = 0;
+ el->event()->get<Int>(DISPLACED_X, dxRaw);
+ displacedX = double(dxRaw * m_npf->getNoteBodyWidth()) / 1000.0;
+
+ el->setLayoutX(x + displacedX);
+ el->setLayoutAirspace(x, int(delta));
+
+ // #704958 (multiple tuplet spanners created when entering
+ // triplet chord) -- only do this here for non-notes,
+ // notes get it from positionChord
+ if (!el->isNote()) {
+ sampleGroupElement(staff, clef, key, it);
+ }
+
+ if (el->isNote()) {
+
+ // This modifies "it" and "tieMap"
+ positionChord(staff, it, clef, key, tieMap, to);
+
+ } else if (el->isRest()) {
+
+ // nothing to do
+
+ } else if (el->event()->isa(Clef::EventType)) {
+
+ clef = Clef(*el->event());
+
+ } else if (el->event()->isa(::Rosegarden::Key::EventType)) {
+
+ key = ::Rosegarden::Key(*el->event());
+
+ } else if (el->event()->isa(Text::EventType)) {
+
+ // if it's a dynamic, make a note of it in case a
+ // hairpin immediately follows it
+
+ if (el->event()->has(Text::TextTypePropertyName) &&
+ el->event()->get<String>(Text::TextTypePropertyName) ==
+ Text::Dynamic) {
+ lastDynamicText = el;
+ }
+
+ } else if (el->event()->isa(Indication::EventType)) {
+
+ std::string type;
+ double ix = x;
+
+ // Check for a dynamic text at the same time as the
+ // indication and if found, move the indication to the
+ // right to make room. We know the text should have
+ // preceded the indication in the staff because it has
+ // a smaller subordering
+
+ if (el->event()->get<String>
+ (Indication::IndicationTypePropertyName, type) &&
+ (type == Indication::Crescendo ||
+ type == Indication::Decrescendo) &&
+ lastDynamicText &&
+ lastDynamicText->getViewAbsoluteTime() ==
+ el->getViewAbsoluteTime()) {
+
+ ix = x + m_npf->getTextWidth
+ (Text(*lastDynamicText->event())) +
+ m_npf->getNoteBodyWidth() / 4;
+ }
+
+ el->setLayoutX(ix + displacedX);
+ el->setLayoutAirspace(ix, delta - (ix - x));
+
+ } else if (el->event()->isa(Guitar::Chord::EventType)) {
+
+ int guitarChordWidth = m_npf->getLineSpacing() * 6;
+ el->setLayoutX(x - (guitarChordWidth / 2)
+ + fretboardCount * (guitarChordWidth +
+ m_npf->getNoteBodyWidth()/2)
+ + displacedX);
+ ++fretboardCount;
+
+ } else {
+
+ // nothing else
+ }
+
+ if (m_timePerProgressIncrement > 0 && (++count == 100)) {
+ count = 0;
+ timeT sinceIncrement = el->getViewAbsoluteTime() - lastIncrement;
+ if (sinceIncrement > m_timePerProgressIncrement) {
+ emit incrementProgress
+ (sinceIncrement / m_timePerProgressIncrement);
+ lastIncrement +=
+ (sinceIncrement / m_timePerProgressIncrement)
+ * m_timePerProgressIncrement;
+ throwIfCancelled();
+ }
+ }
+ }
+
+ if (timeSigToPlace) {
+ // no other events in this bar, so we never managed to place it
+ x = barX + offset;
+ NOTATION_DEBUG << "Placing timesig reluctantly at " << x << endl;
+ bdi->second.layoutData.timeSigX = (int)(x);
+ timeSigToPlace = false;
+ }
+
+ for (NotationGroupMap::iterator mi = m_groupsExtant.begin();
+ mi != m_groupsExtant.end(); ++mi) {
+ mi->second->applyBeam(notationStaff);
+ mi->second->applyTuplingLine(notationStaff);
+ delete mi->second;
+ }
+ m_groupsExtant.clear();
+
+ bdi->second.layoutData.needsLayout = false;
+ }
+}
+
+void
+NotationHLayout::sampleGroupElement(Staff &staff,
+ const Clef &clef,
+ const ::Rosegarden::Key &key,
+ const NotationElementList::iterator &itr)
+{
+ NotationElement *el = static_cast<NotationElement *>(*itr);
+
+ if (el->event()->has(BEAMED_GROUP_ID)) {
+
+ //!!! Gosh. We need some clever logic to establish whether
+ // one group is happening while another has not yet ended --
+ // perhaps we decide one has ended if we see another, and then
+ // re-open the case of the first if we meet another note that
+ // claims to be in it. Then we need to hint to both of the
+ // groups that they should choose appropriate stem directions
+ // -- we could just use HEIGHT_ON_STAFF of their first notes
+ // to determine this, as if that doesn't work, nothing will
+
+ long groupId = el->event()->get<Int>(BEAMED_GROUP_ID);
+ NOTATION_DEBUG << "group id: " << groupId << endl;
+ if (m_groupsExtant.find(groupId) == m_groupsExtant.end()) {
+ NOTATION_DEBUG << "(new group)" << endl;
+ m_groupsExtant[groupId] =
+ new NotationGroup(*staff.getViewElementList(),
+ m_notationQuantizer,
+ m_properties, clef, key);
+ }
+ m_groupsExtant[groupId]->sample(itr, true);
+ }
+}
+
+timeT
+NotationHLayout::getSpacingDuration(Staff &staff,
+ const NotationElementList::iterator &i)
+{
+ SegmentNotationHelper helper(staff.getSegment());
+ timeT t((*i)->getViewAbsoluteTime());
+ timeT d((*i)->getViewDuration());
+
+ if (d > 0 && (*i)->event()->getDuration() == 0) return d; // grace note
+
+ NotationElementList::iterator j(i), e(staff.getViewElementList()->end());
+ while (j != e && ((*j)->getViewAbsoluteTime() == t ||
+ (*j)->getViewDuration() == 0)) {
+ ++j;
+ }
+ if (j == e) {
+ return d;
+ } else {
+ return (*j)->getViewAbsoluteTime() - (*i)->getViewAbsoluteTime();
+ }
+}
+
+timeT
+NotationHLayout::getSpacingDuration(Staff &staff,
+ const NotationChord &chord)
+{
+ SegmentNotationHelper helper(staff.getSegment());
+
+ NotationElementList::iterator i = chord.getShortestElement();
+ timeT d((*i)->getViewDuration());
+
+ if (d > 0 && (*i)->event()->getDuration() == 0) return d; // grace note
+
+ NotationElementList::iterator j(i), e(staff.getViewElementList()->end());
+ while (j != e && (chord.contains(j) || (*j)->getViewDuration() == 0))
+ ++j;
+
+ if (j != e) {
+ d = (*j)->getViewAbsoluteTime() - (*i)->getViewAbsoluteTime();
+ }
+
+ return d;
+}
+
+void
+NotationHLayout::positionChord(Staff &staff,
+ NotationElementList::iterator &itr,
+ const Clef &clef, const ::Rosegarden::Key &key,
+ TieMap &tieMap,
+ NotationElementList::iterator &to)
+{
+ NotationChord chord(*staff.getViewElementList(), itr, m_notationQuantizer,
+ m_properties, clef, key);
+ double baseX, delta;
+ (static_cast<NotationElement *>(*itr))->getLayoutAirspace(baseX, delta);
+
+ bool barEndsInChord = false;
+
+ NOTATION_DEBUG << "NotationHLayout::positionChord: x = " << baseX << endl;
+
+ // #938545 (Broken notation: Duplicated note can float outside
+ // stave) -- We need to iterate over all elements in the chord
+ // range here, not just the ordered set of notes actually in the
+ // chord. They all have the same x-coord, so there's no
+ // particular complication here.
+
+ for (NotationElementList::iterator citr = chord.getInitialElement();
+ citr != staff.getViewElementList()->end(); ++citr) {
+
+ if (citr == to)
+ barEndsInChord = true;
+
+ // #704958 (multiple tuplet spanners created when entering
+ // triplet chord) -- layout() updates the beamed group data
+ // for non-notes, but we have to do it for notes so as to
+ // ensure every note in the chord is accounted for
+ sampleGroupElement(staff, clef, key, citr);
+
+ NotationElement *elt = static_cast<NotationElement*>(*citr);
+
+ double displacedX = 0.0;
+ long dxRaw = 0;
+ elt->event()->get<Int>(DISPLACED_X, dxRaw);
+ displacedX = double(dxRaw * m_npf->getNoteBodyWidth()) / 1000.0;
+
+ elt->setLayoutX(baseX + displacedX);
+ elt->setLayoutAirspace(baseX, delta);
+
+ NOTATION_DEBUG << "NotationHLayout::positionChord: assigned x to elt at " << elt->getViewAbsoluteTime() << endl;
+
+ if (citr == chord.getFinalElement())
+ break;
+ }
+
+ // Check for any ties going back, and if so work out how long they
+ // must have been and assign accordingly.
+
+ for (NotationElementList::iterator citr = chord.getInitialElement();
+ citr != staff.getViewElementList()->end(); ++citr) {
+
+ NotationElement *note = static_cast<NotationElement*>(*citr);
+ if (!note->isNote()) {
+ if (citr == chord.getFinalElement())
+ break;
+ continue;
+ }
+
+ bool tiedForwards = false;
+ bool tiedBack = false;
+
+ note->event()->get<Bool>(TIED_FORWARD, tiedForwards);
+ note->event()->get<Bool>(TIED_BACKWARD, tiedBack);
+
+ if (!note->event()->has(PITCH))
+ continue;
+ int pitch = note->event()->get<Int>(PITCH);
+
+ if (tiedBack) {
+ TieMap::iterator ti(tieMap.find(pitch));
+
+ if (ti != tieMap.end()) {
+ NotationElementList::iterator otherItr(ti->second);
+
+ if ((*otherItr)->getViewAbsoluteTime() +
+ (*otherItr)->getViewDuration() ==
+ note->getViewAbsoluteTime()) {
+
+ NOTATION_DEBUG << "Second note in tie at " << note->getViewAbsoluteTime() << ": found first note, it matches" << endl;
+
+ (*otherItr)->event()->setMaybe<Int>
+ (m_properties.TIE_LENGTH,
+ (int)(baseX - (*otherItr)->getLayoutX()));
+
+ } else {
+ NOTATION_DEBUG << "Second note in tie at " << note->getViewAbsoluteTime() << ": found first note but it ends at " << ((*otherItr)->getViewAbsoluteTime() + (*otherItr)->getViewDuration()) << endl;
+
+ tieMap.erase(pitch);
+ }
+ }
+ }
+
+ if (tiedForwards) {
+ note->event()->setMaybe<Int>(m_properties.TIE_LENGTH, 0);
+ tieMap[pitch] = citr;
+ } else {
+ note->event()->unset(m_properties.TIE_LENGTH);
+ }
+
+ if (citr == chord.getFinalElement())
+ break;
+ }
+
+ itr = chord.getFinalElement();
+ if (barEndsInChord) {
+ to = itr;
+ ++to;
+ }
+}
+
+float
+NotationHLayout::getLayoutWidth(ViewElement &ve,
+ NotePixmapFactory *npf,
+ const ::Rosegarden::Key &previousKey) const
+{
+ NotationElement& e = static_cast<NotationElement&>(ve);
+
+ if ((e.isNote() || e.isRest()) && e.event()->has(NOTE_TYPE)) {
+
+ long noteType = e.event()->get<Int>(NOTE_TYPE);
+ long dots = 0;
+ (void)e.event()->get<Int>(NOTE_DOTS, dots);
+
+ double bw = 0;
+
+ if (e.isNote()) {
+ bw = m_npf->getNoteBodyWidth(noteType)
+ + m_npf->getDotWidth() * dots;
+ } else {
+ bw = m_npf->getRestWidth(Note(noteType, dots));
+ }
+
+ double multiplier = double(Note(noteType, dots).getDuration()) /
+ double(Note(Note::Quaver).getDuration());
+ multiplier -= 1.0;
+ multiplier *= m_proportion / 100.0;
+ multiplier += 1.0;
+
+ double gap = m_npf->getNoteBodyWidth(noteType) * multiplier;
+
+ NOTATION_DEBUG << "note type " << noteType << ", isNote " << e.isNote() << ", dots " << dots << ", multiplier " << multiplier << ", gap " << gap << ", result " << (bw + gap * m_spacing / 100.0) << endl;
+
+ gap = gap * m_spacing / 100.0;
+ return bw + gap;
+
+ } else {
+
+ double w = getFixedItemSpacing();
+
+ if (e.event()->isa(Clef::EventType)) {
+
+ w += m_npf->getClefWidth(Clef(*e.event()));
+
+ } else if (e.event()->isa(::Rosegarden::Key::EventType)) {
+
+ ::Rosegarden::Key key(*e.event());
+
+ ::Rosegarden::Key cancelKey = previousKey;
+
+ if (m_keySigCancelMode == 0) { // only when entering C maj / A min
+
+ if (key.getAccidentalCount() != 0)
+ cancelKey = ::Rosegarden::Key();
+
+ } else if (m_keySigCancelMode == 1) { // only when reducing acc count
+
+ if (!(key.isSharp() == cancelKey.isSharp() &&
+ key.getAccidentalCount() < cancelKey.getAccidentalCount())) {
+ cancelKey = ::Rosegarden::Key();
+ }
+ }
+
+ w += m_npf->getKeyWidth(key, cancelKey);
+
+ } else if (e.event()->isa(Indication::EventType) ||
+ e.event()->isa(Text::EventType)) {
+
+ w = 0;
+
+ } else {
+ // NOTATION_DEBUG << "NotationHLayout::getLayoutWidth(): no case for event type " << e.event()->getType() << endl;
+ // w += 24;
+ w = 0;
+ }
+
+ return w;
+ }
+}
+
+int NotationHLayout::getBarMargin() const
+{
+ return (int)(m_npf->getBarMargin() * m_spacing / 100.0);
+}
+
+int NotationHLayout::getPreBarMargin() const
+{
+ return getBarMargin() / 3;
+}
+
+int NotationHLayout::getPostBarMargin() const
+{
+ return getBarMargin() - getPreBarMargin();
+}
+
+int NotationHLayout::getFixedItemSpacing() const
+{
+ return (int)((m_npf->getNoteBodyWidth() * 2.0 / 3.0) * m_spacing / 100.0);
+}
+
+void
+NotationHLayout::reset()
+{
+ for (BarDataMap::iterator i = m_barData.begin();
+ i != m_barData.end(); ++i) {
+ clearBarList(*i->first);
+ }
+
+ m_barData.clear();
+ m_barPositions.clear();
+ m_totalWidth = 0;
+}
+
+void
+NotationHLayout::resetStaff(Staff &staff, timeT startTime, timeT endTime)
+{
+ if (startTime == endTime) {
+ getBarData(staff).clear();
+ m_totalWidth = 0;
+ }
+}
+
+int
+NotationHLayout::getFirstVisibleBar() const
+{
+ int bar = 0;
+ bool haveBar = false;
+ for (BarDataMap::const_iterator i = m_barData.begin(); i != m_barData.end(); ++i) {
+ if (i->second.begin() == i->second.end())
+ continue;
+ int barHere = i->second.begin()->first;
+ if (barHere < bar || !haveBar) {
+ bar = barHere;
+ haveBar = true;
+ }
+ }
+
+ // NOTATION_DEBUG << "NotationHLayout::getFirstVisibleBar: returning " << bar << endl;
+
+ return bar;
+}
+
+int
+NotationHLayout::getFirstVisibleBarOnStaff(Staff &staff)
+{
+ BarDataList &bdl(getBarData(staff));
+
+ int bar = 0;
+ if (bdl.begin() != bdl.end())
+ bar = bdl.begin()->first;
+
+ // NOTATION_DEBUG << "NotationHLayout::getFirstVisibleBarOnStaff: returning " << bar << endl;
+
+ return bar;
+}
+
+int
+NotationHLayout::getLastVisibleBar() const
+{
+ int bar = 0;
+ bool haveBar = false;
+ for (BarDataMap::const_iterator i = m_barData.begin();
+ i != m_barData.end(); ++i) {
+ if (i->second.begin() == i->second.end())
+ continue;
+ int barHere = getLastVisibleBarOnStaff(*i->first);
+ if (barHere > bar || !haveBar) {
+ bar = barHere;
+ haveBar = true;
+ }
+ }
+
+ // NOTATION_DEBUG << "NotationHLayout::getLastVisibleBar: returning " << bar << endl;
+
+ return bar;
+}
+
+int
+NotationHLayout::getLastVisibleBarOnStaff(Staff &staff) const
+{
+ const BarDataList &bdl(getBarData(staff));
+ int bar = 0;
+
+ if (bdl.begin() != bdl.end()) {
+ BarDataList::const_iterator i = bdl.end();
+ bar = ((--i)->first) + 1; // last visible bar_line_
+ }
+
+ // NOTATION_DEBUG << "NotationHLayout::getLastVisibleBarOnStaff: returning " << bar << endl;
+
+ return bar;
+}
+
+double
+NotationHLayout::getBarPosition(int bar) const
+{
+ double position = 0.0;
+
+ BarPositionList::const_iterator i = m_barPositions.find(bar);
+
+ if (i != m_barPositions.end()) {
+
+ position = i->second;
+
+ } else {
+
+ i = m_barPositions.begin();
+ if (i != m_barPositions.end()) {
+ if (bar < i->first)
+ position = i->second;
+ else {
+ i = m_barPositions.end();
+ --i;
+ if (bar > i->first)
+ position = i->second;
+ }
+ }
+ }
+
+ // NOTATION_DEBUG << "NotationHLayout::getBarPosition: returning " << position << " for bar " << bar << endl;
+
+ return position;
+}
+
+bool
+NotationHLayout::isBarCorrectOnStaff(Staff &staff, int i)
+{
+ BarDataList &bdl(getBarData(staff));
+ ++i;
+
+ BarDataList::iterator bdli(bdl.find(i));
+ if (bdli != bdl.end())
+ return bdli->second.basicData.correct;
+ else
+ return true;
+}
+
+bool NotationHLayout::getTimeSignaturePosition(Staff &staff,
+ int i,
+ TimeSignature &timeSig,
+ double &timeSigX)
+{
+ BarDataList &bdl(getBarData(staff));
+
+ BarDataList::iterator bdli(bdl.find(i));
+ if (bdli != bdl.end()) {
+ timeSig = bdli->second.basicData.timeSignature;
+ timeSigX = (double)(bdli->second.layoutData.timeSigX);
+ return bdli->second.basicData.newTimeSig;
+ } else
+ return 0;
+}
+
+timeT
+NotationHLayout::getTimeForX(double x) const
+{
+ return RulerScale::getTimeForX(x);
+}
+
+double
+NotationHLayout::getXForTime(timeT t) const
+{
+ return RulerScale::getXForTime(t);
+}
+
+double
+NotationHLayout::getXForTimeByEvent(timeT time) const
+{
+ // NOTATION_DEBUG << "NotationHLayout::getXForTime(" << time << ")" << endl;
+
+ for (BarDataMap::const_iterator i = m_barData.begin(); i != m_barData.end(); ++i) {
+
+ Staff *staff = i->first;
+
+ if (staff->getSegment().getStartTime() <= time &&
+ staff->getSegment().getEndMarkerTime() > time) {
+
+ ViewElementList::iterator vli =
+ staff->getViewElementList()->findNearestTime(time);
+
+ bool found = false;
+ double x = 0.0, dx = 0.0;
+ timeT t = 0, dt = 0;
+
+ while (!found) {
+ if (vli == staff->getViewElementList()->end())
+ break;
+ NotationElement *element = static_cast<NotationElement *>(*vli);
+ if (element->getCanvasItem()) {
+ x = element->getLayoutX();
+ double temp;
+ element->getLayoutAirspace(temp, dx);
+ t = element->event()->getNotationAbsoluteTime();
+ dt = element->event()->getNotationDuration();
+ found = true;
+ break;
+ }
+ ++vli;
+ }
+
+ if (found) {
+ if (time > t) {
+
+ while (vli != staff->getViewElementList()->end() &&
+ ((*vli)->event()->getNotationAbsoluteTime() < time ||
+ !((static_cast<NotationElement *>(*vli))->getCanvasItem())))
+ ++vli;
+
+ if (vli != staff->getViewElementList()->end()) {
+ NotationElement *element = static_cast<NotationElement *>(*vli);
+ dx = element->getLayoutX() - x;
+ dt = element->event()->getNotationAbsoluteTime() - t;
+ }
+
+ if (dt > 0 && dx > 0) {
+ return x + dx * (time - t) / dt;
+ }
+ }
+
+ return x - 3;
+ }
+ }
+ }
+
+ return RulerScale::getXForTime(time);
+}
+
+std::vector<int> NotationHLayout::m_availableSpacings;
+std::vector<int> NotationHLayout::m_availableProportions;
+
+}
diff --git a/src/gui/editors/notation/NotationHLayout.h b/src/gui/editors/notation/NotationHLayout.h
new file mode 100644
index 0000000..9d7366b
--- /dev/null
+++ b/src/gui/editors/notation/NotationHLayout.h
@@ -0,0 +1,446 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_NOTATIONHLAYOUT_H_
+#define _RG_NOTATIONHLAYOUT_H_
+
+#include "base/LayoutEngine.h"
+#include "base/NotationTypes.h"
+#include "NotationElement.h"
+#include "gui/general/ProgressReporter.h"
+#include <map>
+#include <vector>
+#include "base/Event.h"
+
+
+class TieMap;
+class QObject;
+
+
+namespace Rosegarden
+{
+
+class ViewElement;
+class Staff;
+class Quantizer;
+class NotePixmapFactory;
+class NotationProperties;
+class NotationGroup;
+class NotationChord;
+class Key;
+class Composition;
+class Clef;
+class AccidentalTable;
+
+
+/**
+ * Horizontal notation layout
+ *
+ * computes the X coordinates of notation elements
+ */
+
+class NotationHLayout : public ProgressReporter,
+ public HorizontalLayoutEngine
+{
+public:
+ NotationHLayout(Composition *c,
+ NotePixmapFactory *npf,
+ const NotationProperties &properties,
+ QObject* parent, const char* name = 0);
+
+ virtual ~NotationHLayout();
+
+ void setNotePixmapFactory(NotePixmapFactory *npf) {
+ m_npf = npf;
+ }
+
+ /**
+ * Precomputes layout data for a single staff. The resulting data
+ * is stored in the BarDataMap, keyed from the staff reference;
+ * the entire map is then used by reconcileBars() and layout().
+ * The map should be cleared (by calling reset()) before a full
+ * set of staffs is preparsed.
+ */
+ virtual void scanStaff(Staff &staff,
+ timeT startTime = 0,
+ timeT endTime = 0);
+
+ /**
+ * Resets internal data stores, notably the BarDataMap that is
+ * used to retain the data computed by scanStaff().
+ */
+ virtual void reset();
+
+ /**
+ * Resets internal data stores, notably the given staff's entry
+ * in the BarDataMap used to retain the data computed by scanStaff().
+ */
+ virtual void resetStaff(Staff &staff,
+ timeT startTime = 0,
+ timeT endTime = 0);
+
+ /**
+ * Lays out all staffs that have been scanned
+ */
+ virtual void finishLayout(timeT startTime = 0,
+ timeT endTime = 0);
+
+ /**
+ * Set page mode
+ */
+ virtual void setPageMode(bool pageMode) { m_pageMode = pageMode; }
+
+ /**
+ * Get the page mode setting
+ */
+ virtual bool isPageMode() { return m_pageMode; }
+
+ /**
+ * Set a page width
+ */
+ virtual void setPageWidth(double pageWidth) { m_pageWidth = pageWidth; }
+
+ /**
+ * Get the page width
+ */
+ virtual double getPageWidth() { return m_pageWidth; }
+
+ /**
+ * Gets the current spacing factor (100 == "normal" spacing)
+ */
+ int getSpacing() const { return m_spacing; }
+
+ /**
+ * Sets the current spacing factor (100 == "normal" spacing)
+ */
+ void setSpacing(int spacing) { m_spacing = spacing; }
+
+ /**
+ * Gets the range of "standard" spacing factors (you can
+ * setSpacing() to anything you want, but it makes sense to
+ * have a standard list for GUI use). The only guaranteed
+ * property of the returned list is that 100 will be in it.
+ */
+ static std::vector<int> getAvailableSpacings();
+
+ /**
+ * Gets the current proportion (100 == spaces proportional to
+ * durations, 0 == equal spacings)
+ */
+ int getProportion() const { return m_proportion; }
+
+ /**
+ * Sets the current proportion (100 == spaces proportional to
+ * durations, 0 == equal spacings)
+ */
+ void setProportion(int proportion) { m_proportion = proportion; }
+
+ /**
+ * Gets the range of "standard" proportion factors (you can
+ * setProportion() to anything you want, but it makes sense to
+ * have a standard list for GUI use). The only guaranteed
+ * property of the returned list is that 0, 100, and whatever the
+ * default proportion is will be in it.
+ */
+ static std::vector<int> getAvailableProportions();
+
+ /**
+ * Returns the total length of all elements once layout is done
+ * This is the x-coord of the end of the last element on the longest
+ * staff, plus the space allocated to that element
+ */
+ virtual double getTotalWidth() const { return m_totalWidth; }
+
+ /**
+ * Returns the number of the first visible bar line on the given
+ * staff
+ */
+ virtual int getFirstVisibleBarOnStaff(Staff &staff);
+
+ /**
+ * Returns the number of the first visible bar line on any
+ * staff
+ */
+ virtual int getFirstVisibleBar() const;
+
+ /**
+ * Returns the number of the last visible bar line on the given
+ * staff
+ */
+ virtual int getLastVisibleBarOnStaff(Staff &staff) const;
+
+ /**
+ * Returns the number of the first visible bar line on any
+ * staff
+ */
+ virtual int getLastVisibleBar() const;
+
+ /**
+ * Returns the x-coordinate of the given bar number
+ */
+ virtual double getBarPosition(int barNo) const;
+
+ /**
+ * Returns the nearest time value to the given X coord.
+ */
+ virtual timeT getTimeForX(double x) const;
+
+ /**
+ * Returns the X coord corresponding to the given time value.
+ * This RulerScale method works by interpolating between bar lines
+ * (the inverse of the way getTimeForX works), and should be used
+ * for any rulers associated with the layout.
+ */
+ virtual double getXForTime(timeT time) const;
+
+ /**
+ * Returns the X coord corresponding to the given time value.
+ * This method works by interpolating between event positions, and
+ * should be used for position pointer tracking during playback.
+ */
+ virtual double getXForTimeByEvent(timeT time) const;
+
+ /**
+ * Returns true if the specified bar has the correct length
+ */
+ virtual bool isBarCorrectOnStaff(Staff &staff, int barNo);
+
+ /**
+ * Returns true if there is a new time signature in the given bar,
+ * setting timeSignature appropriately and setting timeSigX to its
+ * x-coord
+ */
+ virtual bool getTimeSignaturePosition
+ (Staff &staff, int barNo,
+ TimeSignature &timeSig, double &timeSigX);
+
+ /// purely optional, used only for progress reporting
+ void setStaffCount(int staffCount) {
+ m_staffCount = staffCount;
+ }
+
+protected:
+
+ struct Chunk {
+ timeT duration;
+ short subordering;
+ float fixed;
+ float stretchy;
+ float x;
+
+ Chunk(timeT d, short sub, float f, float s) :
+ duration(d), subordering(sub), fixed(f), stretchy(s), x(0) { }
+ Chunk(short sub, float f) :
+ duration(0), subordering(sub), fixed(f), stretchy(0), x(0) { }
+ };
+ typedef std::vector<Chunk> ChunkList;
+
+ /**
+ * Inner class for bar data, used by scanStaff()
+ */
+ struct BarData
+ {
+ ChunkList chunks;
+
+ struct BasicData
+ { // slots that can be filled at construction time
+
+ NotationElementList::iterator start; // i.e. event following barline
+ bool correct; // bar preceding barline has correct duration
+ TimeSignature timeSignature;
+ bool newTimeSig;
+
+ } basicData;
+
+ struct SizeData
+ { // slots that can be filled when the following bar has been scanned
+
+ float idealWidth; // theoretical width of bar following barline
+ float reconciledWidth;
+ float fixedWidth; // width of non-chunk items in bar
+ int clefKeyWidth;
+ timeT actualDuration; // may exceed nominal duration
+
+ } sizeData;
+
+ struct LayoutData
+ { // slots either assumed, or only known at layout time
+ bool needsLayout;
+ double x; // coordinate for display of barline
+ int timeSigX;
+
+ } layoutData;
+
+ BarData(NotationElementList::iterator i,
+ bool correct, TimeSignature timeSig, bool newTimeSig) {
+ basicData.start = i;
+ basicData.correct = correct;
+ basicData.timeSignature = timeSig;
+ basicData.newTimeSig = newTimeSig;
+ sizeData.idealWidth = 0;
+ sizeData.reconciledWidth = 0;
+ sizeData.fixedWidth = 0;
+ sizeData.clefKeyWidth = 0;
+ sizeData.actualDuration = 0;
+ layoutData.needsLayout = true;
+ layoutData.x = -1;
+ layoutData.timeSigX = -1;
+ }
+ };
+
+ typedef std::map<int, BarData> BarDataList;
+ typedef BarDataList::value_type BarDataPair;
+ typedef std::map<Staff *, BarDataList> BarDataMap;
+ typedef std::map<int, double> BarPositionList;
+
+ typedef std::map<Staff *, int> StaffIntMap;
+ typedef std::map<long, NotationGroup *> NotationGroupMap;
+
+ void clearBarList(Staff &);
+
+
+ /**
+ * Set the basic data for the given barNo. If barNo is
+ * beyond the end of the existing bar data list, create new
+ * records and/or fill with empty ones as appropriate.
+ */
+ void setBarBasicData(Staff &staff, int barNo,
+ NotationElementList::iterator start, bool correct,
+ TimeSignature timeSig, bool newTimeSig);
+
+ /**
+ * Set the size data for the given barNo. If barNo is
+ * beyond the end of the existing bar data list, create new
+ * records and/or fill with empty ones as appropriate.
+ */
+ void setBarSizeData(Staff &staff, int barNo,
+ float fixedWidth, timeT actualDuration);
+
+ /**
+ * Returns the bar positions for a given staff, provided that
+ * staff has been preparsed since the last reset
+ */
+ BarDataList& getBarData(Staff &staff);
+ const BarDataList& getBarData(Staff &staff) const;
+
+ /// Find the staff in which bar "barNo" is widest
+ Staff *getStaffWithWidestBar(int barNo);
+
+ /// Find width of clef+key in the staff in which they're widest in this bar
+ int getMaxRepeatedClefAndKeyWidth(int barNo);
+
+ /// For a single bar, makes sure synchronisation points align in all staves
+ void preSquishBar(int barNo);
+
+ /// Tries to harmonize the bar positions for all the staves (linear mode)
+ void reconcileBarsLinear();
+
+ /// Tries to harmonize the bar positions for all the staves (page mode)
+ void reconcileBarsPage();
+
+ void layout(BarDataMap::iterator,
+ timeT startTime,
+ timeT endTime);
+
+ /// Find earliest element with quantized time of t or greater
+ NotationElementList::iterator getStartOfQuantizedSlice
+ (NotationElementList *, timeT t) const;
+
+ void scanChord
+ (NotationElementList *notes, NotationElementList::iterator &i,
+ const Clef &, const ::Rosegarden::Key &,
+ AccidentalTable &, float &lyricWidth,
+ ChunkList &chunks, NotePixmapFactory *, int ottavaShift,
+ NotationElementList::iterator &to);
+
+ typedef std::map<int, NotationElementList::iterator> TieMap;
+
+ // This modifies the NotationElementList::iterator passed to it,
+ // moving it on to the last note in the chord; updates the TieMap;
+ // and may modify the to-iterator if it turns out to point at a
+ // note within the chord
+ void positionChord
+ (Staff &staff,
+ NotationElementList::iterator &, const Clef &clef,
+ const ::Rosegarden::Key &key, TieMap &, NotationElementList::iterator &to);
+
+ void sampleGroupElement
+ (Staff &staff, const Clef &clef,
+ const ::Rosegarden::Key &key, const NotationElementList::iterator &);
+
+ /// Difference between absolute time of next event and of this
+ timeT getSpacingDuration
+ (Staff &staff, const NotationElementList::iterator &);
+
+ /// Difference between absolute time of chord and of first event not in it
+ timeT getSpacingDuration
+ (Staff &staff, const NotationChord &);
+
+ float getLayoutWidth(ViewElement &,
+ NotePixmapFactory *,
+ const ::Rosegarden::Key &) const;
+
+ int getBarMargin() const;
+ int getPreBarMargin() const;
+ int getPostBarMargin() const;
+ int getFixedItemSpacing() const;
+
+ NotePixmapFactory *getNotePixmapFactory(Staff &);
+ NotePixmapFactory *getGraceNotePixmapFactory(Staff &);
+
+ //--------------- Data members ---------------------------------
+
+ BarDataMap m_barData;
+ StaffIntMap m_staffNameWidths;
+ BarPositionList m_barPositions;
+ NotationGroupMap m_groupsExtant;
+
+ double m_totalWidth;
+ bool m_pageMode;
+ double m_pageWidth;
+ int m_spacing;
+ int m_proportion;
+ int m_keySigCancelMode;
+
+ //!!! This should not be here -- different staffs may have
+ //different sizes in principle, so we should always be referring
+ //to the npf of a particular staff
+ NotePixmapFactory *m_npf;
+
+ static std::vector<int> m_availableSpacings;
+ static std::vector<int> m_availableProportions;
+
+ const Quantizer *m_notationQuantizer;
+ const NotationProperties &m_properties;
+
+ int m_timePerProgressIncrement;
+ std::map<Staff *, bool> m_haveOttavaSomewhere;
+ int m_staffCount; // purely for progress reporting
+};
+
+
+}
+
+#endif
diff --git a/src/gui/editors/notation/NotationProperties.cpp b/src/gui/editors/notation/NotationProperties.cpp
new file mode 100644
index 0000000..8c87cc3
--- /dev/null
+++ b/src/gui/editors/notation/NotationProperties.cpp
@@ -0,0 +1,85 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "NotationProperties.h"
+
+#include "base/PropertyName.h"
+
+
+namespace Rosegarden
+{
+
+const PropertyName NotationProperties::NOTE_STYLE = "NoteStyle";
+const PropertyName NotationProperties::HEIGHT_ON_STAFF = "HeightOnStaff";
+const PropertyName NotationProperties::BEAMED = "Beamed";
+const PropertyName NotationProperties::BEAM_ABOVE = "BeamAbove";
+const PropertyName NotationProperties::SLASHES = "Slashes";
+const PropertyName NotationProperties::STEM_UP = "NoteStemUp";
+const PropertyName NotationProperties::USE_CAUTIONARY_ACCIDENTAL = "UseCautionaryAccidental";
+const PropertyName NotationProperties::OTTAVA_SHIFT = "OttavaShift";
+const PropertyName NotationProperties::SLUR_ABOVE = "SlurAbove";
+
+NotationProperties::NotationProperties(const std::string &prefix) :
+
+ VIEW_LOCAL_STEM_UP (prefix + "StemUp"),
+
+ MIN_WIDTH (prefix + "MinWidth"),
+
+ CALCULATED_ACCIDENTAL (prefix + "NoteCalculatedAccidental"),
+ DISPLAY_ACCIDENTAL (prefix + "NoteDisplayAccidental"),
+ DISPLAY_ACCIDENTAL_IS_CAUTIONARY(prefix + "NoteDisplayAccidentalIsCautionary"),
+ ACCIDENTAL_SHIFT (prefix + "NoteAccidentalShift"),
+ ACCIDENTAL_EXTRA_SHIFT (prefix + "NoteAccidentalExtraShift"),
+ UNBEAMED_STEM_LENGTH (prefix + "UnbeamedStemLength"),
+ DRAW_FLAG (prefix + "NoteDrawFlag"),
+ NOTE_HEAD_SHIFTED (prefix + "NoteHeadShifted"),
+ NEEDS_EXTRA_SHIFT_SPACE (prefix + "NeedsExtraShiftSpace"),
+ NOTE_DOT_SHIFTED (prefix + "NoteDotShifted"),
+ CHORD_PRIMARY_NOTE (prefix + "ChordPrimaryNote"),
+ CHORD_MARK_COUNT (prefix + "ChordMarkCount"),
+ TIE_LENGTH (prefix + "TieLength"),
+ SLUR_Y_DELTA (prefix + "SlurYDelta"),
+ SLUR_LENGTH (prefix + "SlurLength"),
+ LYRIC_EXTRA_WIDTH (prefix + "LyricExtraWidth"),
+ REST_TOO_SHORT (prefix + "RestTooShort"),
+ REST_OUTSIDE_STAVE (prefix + "RestOutsideStave"),
+
+ BEAM_GRADIENT (prefix + "BeamGradient"),
+ BEAM_SECTION_WIDTH (prefix + "BeamSectionWidth"),
+ BEAM_NEXT_BEAM_COUNT (prefix + "BeamNextBeamCount"),
+ BEAM_NEXT_PART_BEAMS (prefix + "BeamNextPartBeams"),
+ BEAM_THIS_PART_BEAMS (prefix + "BeamThisPartBeams"),
+ BEAM_MY_Y (prefix + "BeamMyY"),
+
+ TUPLING_LINE_MY_Y (prefix + "TuplingLineMyY"),
+ TUPLING_LINE_WIDTH (prefix + "TuplingLineWidth"),
+ TUPLING_LINE_GRADIENT (prefix + "TuplingLineGradient"),
+ TUPLING_LINE_FOLLOWS_BEAM (prefix + "TuplingLineFollowsBeam")
+
+{
+ // nothing else
+}
+
+}
diff --git a/src/gui/editors/notation/NotationProperties.h b/src/gui/editors/notation/NotationProperties.h
new file mode 100644
index 0000000..69a26cf
--- /dev/null
+++ b/src/gui/editors/notation/NotationProperties.h
@@ -0,0 +1,108 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_NOTATIONPROPERTIES_H_
+#define _RG_NOTATIONPROPERTIES_H_
+
+#include "base/PropertyName.h"
+#include <string>
+
+
+
+
+namespace Rosegarden
+{
+
+
+
+/**
+ * Property names for properties that are computed and cached within
+ * the notation module, but that need not necessarily be saved with
+ * the file.
+ *
+ * If you add something here, remember to add the definition to
+ * notationproperties.cpp as well...
+ */
+
+class NotationProperties
+{
+public:
+ NotationProperties(const std::string &prefix);
+
+ // These are only of interest to notation views, but are the
+ // same across all notation views.
+
+ static const PropertyName HEIGHT_ON_STAFF;
+ static const PropertyName NOTE_STYLE;
+ static const PropertyName BEAMED;
+ static const PropertyName BEAM_ABOVE;
+ static const PropertyName SLASHES;
+ static const PropertyName STEM_UP;
+ static const PropertyName USE_CAUTIONARY_ACCIDENTAL;
+ static const PropertyName OTTAVA_SHIFT;
+ static const PropertyName SLUR_ABOVE;
+
+ // The rest are, or may be, view-local
+
+ const PropertyName VIEW_LOCAL_STEM_UP;
+ const PropertyName MIN_WIDTH;
+ const PropertyName CALCULATED_ACCIDENTAL;
+ const PropertyName DISPLAY_ACCIDENTAL;
+ const PropertyName DISPLAY_ACCIDENTAL_IS_CAUTIONARY;
+ const PropertyName ACCIDENTAL_SHIFT;
+ const PropertyName ACCIDENTAL_EXTRA_SHIFT;
+ const PropertyName UNBEAMED_STEM_LENGTH;
+ const PropertyName DRAW_FLAG;
+ const PropertyName NOTE_HEAD_SHIFTED;
+ const PropertyName NEEDS_EXTRA_SHIFT_SPACE;
+ const PropertyName NOTE_DOT_SHIFTED;
+ const PropertyName CHORD_PRIMARY_NOTE;
+ const PropertyName CHORD_MARK_COUNT;
+ const PropertyName TIE_LENGTH;
+ const PropertyName SLUR_Y_DELTA;
+ const PropertyName SLUR_LENGTH;
+ const PropertyName LYRIC_EXTRA_WIDTH;
+ const PropertyName REST_TOO_SHORT;
+ const PropertyName REST_OUTSIDE_STAVE;
+
+ // Set in applyBeam in notationsets.cpp:
+
+ const PropertyName BEAM_GRADIENT;
+ const PropertyName BEAM_SECTION_WIDTH;
+ const PropertyName BEAM_NEXT_BEAM_COUNT;
+ const PropertyName BEAM_NEXT_PART_BEAMS;
+ const PropertyName BEAM_THIS_PART_BEAMS;
+ const PropertyName BEAM_MY_Y;
+ const PropertyName TUPLING_LINE_MY_Y;
+ const PropertyName TUPLING_LINE_WIDTH;
+ const PropertyName TUPLING_LINE_GRADIENT;
+ const PropertyName TUPLING_LINE_FOLLOWS_BEAM;
+
+};
+
+
+}
+
+#endif
diff --git a/src/gui/editors/notation/NotationSelectionPaster.cpp b/src/gui/editors/notation/NotationSelectionPaster.cpp
new file mode 100644
index 0000000..3b008f2
--- /dev/null
+++ b/src/gui/editors/notation/NotationSelectionPaster.cpp
@@ -0,0 +1,89 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "NotationSelectionPaster.h"
+
+#include <klocale.h>
+#include "base/Event.h"
+#include "base/Selection.h"
+#include "base/ViewElement.h"
+#include "commands/edit/PasteEventsCommand.h"
+#include "gui/general/EditTool.h"
+#include "gui/general/LinedStaff.h"
+#include "document/RosegardenGUIDoc.h"
+#include "NotationTool.h"
+#include "NotationView.h"
+#include "NotationElement.h"
+
+
+namespace Rosegarden
+{
+
+NotationSelectionPaster::NotationSelectionPaster(EventSelection& es,
+ NotationView* view)
+ : NotationTool("NotationPaster", view),
+ m_selection(es)
+{
+ m_nParentView->setCanvasCursor(Qt::crossCursor);
+}
+
+NotationSelectionPaster::~NotationSelectionPaster()
+{}
+
+void NotationSelectionPaster::handleLeftButtonPress(timeT,
+ int,
+ int staffNo,
+ QMouseEvent* e,
+ ViewElement*)
+{
+ if (staffNo < 0)
+ return ;
+ Event *clef = 0, *key = 0;
+
+ LinedStaff *staff = m_nParentView->getLinedStaff(staffNo);
+
+ NotationElementList::iterator closestElement =
+ staff->getClosestElementToCanvasCoords(e->x(), (int)e->y(),
+ clef, key, false, -1);
+
+ if (closestElement == staff->getViewElementList()->end())
+ return ;
+
+ timeT time = (*closestElement)->getViewAbsoluteTime();
+
+ Segment& segment = staff->getSegment();
+ PasteEventsCommand *command = new PasteEventsCommand
+ (segment, m_parentView->getDocument()->getClipboard(), time,
+ PasteEventsCommand::Restricted);
+
+ if (!command->isPossible()) {
+ m_parentView->slotStatusHelpMsg(i18n("Couldn't paste at this point"));
+ } else {
+ m_parentView->addCommandToHistory(command);
+ m_parentView->slotStatusHelpMsg(i18n("Ready."));
+ }
+}
+
+}
diff --git a/src/gui/editors/notation/NotationSelectionPaster.h b/src/gui/editors/notation/NotationSelectionPaster.h
new file mode 100644
index 0000000..e6a80dd
--- /dev/null
+++ b/src/gui/editors/notation/NotationSelectionPaster.h
@@ -0,0 +1,72 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_NOTATIONSELECTIONPASTER_H_
+#define _RG_NOTATIONSELECTIONPASTER_H_
+
+#include "NotationTool.h"
+#include "base/Event.h"
+
+
+class QMouseEvent;
+
+
+namespace Rosegarden
+{
+
+class ViewElement;
+class NotationView;
+class EventSelection;
+
+
+/**
+ * Selection pasting - unused at the moment
+ */
+class NotationSelectionPaster : public NotationTool
+{
+public:
+
+ ~NotationSelectionPaster();
+
+ virtual void handleLeftButtonPress(timeT,
+ int height, int staffNo,
+ QMouseEvent*,
+ ViewElement* el);
+
+protected:
+ NotationSelectionPaster(EventSelection&,
+ NotationView*);
+
+ //--------------- Data members ---------------------------------
+
+ EventSelection& m_selection;
+
+};
+
+
+
+}
+
+#endif
diff --git a/src/gui/editors/notation/NotationSelector.cpp b/src/gui/editors/notation/NotationSelector.cpp
new file mode 100644
index 0000000..221fbe3
--- /dev/null
+++ b/src/gui/editors/notation/NotationSelector.cpp
@@ -0,0 +1,957 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "NotationSelector.h"
+#include "misc/Debug.h"
+
+#include <klocale.h>
+#include "base/Event.h"
+#include "base/NotationTypes.h"
+#include "base/PropertyName.h"
+#include "base/Selection.h"
+#include "base/ViewElement.h"
+#include "base/BaseProperties.h"
+#include "commands/edit/MoveAcrossSegmentsCommand.h"
+#include "commands/edit/MoveCommand.h"
+#include "commands/edit/TransposeCommand.h"
+#include "commands/notation/IncrementDisplacementsCommand.h"
+#include "gui/general/EditTool.h"
+#include "gui/general/GUIPalette.h"
+#include "gui/general/LinedStaff.h"
+#include "gui/general/RosegardenCanvasView.h"
+#include "gui/kdeext/QCanvasSimpleSprite.h"
+#include "NotationElement.h"
+#include "NotationProperties.h"
+#include "NotationStaff.h"
+#include "NotationTool.h"
+#include "NotationView.h"
+#include "NotePixmapFactory.h"
+#include <kaction.h>
+#include <qapplication.h>
+#include <qiconset.h>
+#include <qrect.h>
+#include <qstring.h>
+#include <qtimer.h>
+
+
+namespace Rosegarden
+{
+
+using namespace BaseProperties;
+
+NotationSelector::NotationSelector(NotationView* view)
+ : NotationTool("NotationSelector", view),
+ m_selectionRect(0),
+ m_updateRect(false),
+ m_selectedStaff(0),
+ m_clickedElement(0),
+ m_selectionToMerge(0),
+ m_justSelectedBar(false),
+ m_wholeStaffSelectionComplete(false)
+{
+ connect(m_parentView, SIGNAL(usedSelection()),
+ this, SLOT(slotHideSelection()));
+
+ connect(this, SIGNAL(editElement(NotationStaff *, NotationElement *, bool)),
+ m_parentView, SLOT(slotEditElement(NotationStaff *, NotationElement *, bool)));
+
+ QIconSet icon
+ (NotePixmapFactory::toQPixmap(NotePixmapFactory::
+ makeToolbarPixmap("crotchet")));
+ new KToggleAction(i18n("Switch to Insert Tool"), icon, 0, this,
+ SLOT(slotInsertSelected()), actionCollection(),
+ "insert");
+
+ new KAction(i18n("Switch to Erase Tool"), "eraser", 0, this,
+ SLOT(slotEraseSelected()), actionCollection(),
+ "erase");
+
+ // (this crashed, and it might be superfluous with ^N anyway, so I'm
+ // commenting it out, but leaving it here in case I change my mind about
+ // fooling with it.) (DMM)
+ // new KAction(i18n("Normalize Rests"), 0, 0, this,
+ // SLOT(slotCollapseRests()), actionCollection(),
+ // "collapse_rests");
+
+ new KAction(i18n("Collapse Rests"), 0, 0, this,
+ SLOT(slotCollapseRestsHard()), actionCollection(),
+ "collapse_rests_aggressively");
+
+ new KAction(i18n("Respell as Flat"), 0, 0, this,
+ SLOT(slotRespellFlat()), actionCollection(),
+ "respell_flat");
+
+ new KAction(i18n("Respell as Sharp"), 0, 0, this,
+ SLOT(slotRespellSharp()), actionCollection(),
+ "respell_sharp");
+
+ new KAction(i18n("Respell as Natural"), 0, 0, this,
+ SLOT(slotRespellNatural()), actionCollection(),
+ "respell_natural");
+
+ new KAction(i18n("Collapse Notes"), 0, 0, this,
+ SLOT(slotCollapseNotes()), actionCollection(),
+ "collapse_notes");
+
+ new KAction(i18n("Interpret"), 0, 0, this,
+ SLOT(slotInterpret()), actionCollection(),
+ "interpret");
+
+ new KAction(i18n("Move to Staff Above"), 0, 0, this,
+ SLOT(slotStaffAbove()), actionCollection(),
+ "move_events_up_staff");
+
+ new KAction(i18n("Move to Staff Below"), 0, 0, this,
+ SLOT(slotStaffBelow()), actionCollection(),
+ "move_events_down_staff");
+
+ new KAction(i18n("Make Invisible"), 0, 0, this,
+ SLOT(slotMakeInvisible()), actionCollection(),
+ "make_invisible");
+
+ new KAction(i18n("Make Visible"), 0, 0, this,
+ SLOT(slotMakeVisible()), actionCollection(),
+ "make_visible");
+
+ createMenu("notationselector.rc");
+}
+
+NotationSelector::~NotationSelector()
+{
+ delete m_selectionToMerge;
+}
+
+void NotationSelector::handleLeftButtonPress(timeT t,
+ int height,
+ int staffNo,
+ QMouseEvent* e,
+ ViewElement *element)
+{
+ std::cerr << "NotationSelector::handleMousePress: time is " << t << ", staffNo is "
+ << staffNo << ", e and element are " << e << " and " << element << std::endl;
+
+ if (m_justSelectedBar) {
+ handleMouseTripleClick(t, height, staffNo, e, element);
+ m_justSelectedBar = false;
+ return ;
+ }
+
+ m_wholeStaffSelectionComplete = false;
+
+ delete m_selectionToMerge;
+ const EventSelection *selectionToMerge = 0;
+ if (e->state() & ShiftButton) {
+ m_clickedShift = true;
+ selectionToMerge = m_nParentView->getCurrentSelection();
+ } else {
+ m_clickedShift = false;
+ }
+ m_selectionToMerge =
+ (selectionToMerge ? new EventSelection(*selectionToMerge) : 0);
+
+ m_clickedElement = dynamic_cast<NotationElement*>(element);
+ if (m_clickedElement) {
+ m_selectedStaff = getStaffForElement(m_clickedElement);
+ m_lastDragPitch = -400;
+ m_lastDragTime = m_clickedElement->event()->getNotationAbsoluteTime();
+ } else {
+ m_selectedStaff = 0; // don't know yet; wait until we have an element
+ }
+
+ m_selectionRect->setX(e->x());
+ m_selectionRect->setY(e->y());
+ m_selectionRect->setSize(0, 0);
+
+ m_selectionRect->show();
+ m_updateRect = true;
+ m_startedFineDrag = false;
+
+ //m_parentView->setCursorPosition(p.x());
+}
+
+void NotationSelector::handleRightButtonPress(timeT t,
+ int height,
+ int staffNo,
+ QMouseEvent* e,
+ ViewElement *element)
+{
+ std::cerr << "NotationSelector::handleRightButtonPress" << std::endl;
+
+ const EventSelection *sel = m_nParentView->getCurrentSelection();
+
+ if (!sel || sel->getSegmentEvents().empty()) {
+
+ // if nothing selected, permit the possibility of selecting
+ // something before showing the menu
+
+ if (element) {
+ m_clickedElement = dynamic_cast<NotationElement*>(element);
+ m_selectedStaff = getStaffForElement(m_clickedElement);
+ m_nParentView->setSingleSelectedEvent
+ (m_selectedStaff->getId(), m_clickedElement->event(),
+ true, true);
+ }
+
+ handleLeftButtonPress(t, height, staffNo, e, element);
+ }
+
+ EditTool::handleRightButtonPress(t, height, staffNo, e, element);
+}
+
+void NotationSelector::slotClickTimeout()
+{
+ m_justSelectedBar = false;
+}
+
+void NotationSelector::handleMouseDoubleClick(timeT,
+ int,
+ int staffNo,
+ QMouseEvent* e,
+ ViewElement *element)
+{
+ NOTATION_DEBUG << "NotationSelector::handleMouseDoubleClick" << endl;
+ m_clickedElement = dynamic_cast<NotationElement*>(element);
+
+ NotationStaff *staff = m_nParentView->getNotationStaff(staffNo);
+ if (!staff)
+ return ;
+ m_selectedStaff = staff;
+
+ bool advanced = (e->state() & ShiftButton);
+
+ if (m_clickedElement) {
+
+ emit editElement(staff, m_clickedElement, advanced);
+
+ } else {
+
+ QRect rect = staff->getBarExtents(e->x(), e->y());
+
+ m_selectionRect->setX(rect.x() + 1);
+ m_selectionRect->setY(rect.y());
+ m_selectionRect->setSize(rect.width() - 1, rect.height());
+
+ m_selectionRect->show();
+ m_updateRect = false;
+
+ m_justSelectedBar = true;
+ QTimer::singleShot(QApplication::doubleClickInterval(), this,
+ SLOT(slotClickTimeout()));
+ }
+
+ return ;
+}
+
+void NotationSelector::handleMouseTripleClick(timeT t,
+ int height,
+ int staffNo,
+ QMouseEvent* e,
+ ViewElement *element)
+{
+ if (!m_justSelectedBar)
+ return ;
+ m_justSelectedBar = false;
+
+ NOTATION_DEBUG << "NotationSelector::handleMouseTripleClick" << endl;
+ m_clickedElement = dynamic_cast<NotationElement*>(element);
+
+ NotationStaff *staff = m_nParentView->getNotationStaff(staffNo);
+ if (!staff)
+ return ;
+ m_selectedStaff = staff;
+
+ if (m_clickedElement) {
+
+ // should be safe, as we've already set m_justSelectedBar false
+ handleLeftButtonPress(t, height, staffNo, e, element);
+ return ;
+
+ } else {
+
+ m_selectionRect->setX(staff->getX());
+ m_selectionRect->setY(staff->getY());
+ m_selectionRect->setSize(int(staff->getTotalWidth()) - 1,
+ staff->getTotalHeight() - 1);
+
+ m_selectionRect->show();
+ m_updateRect = false;
+ }
+
+ m_wholeStaffSelectionComplete = true;
+
+ return ;
+}
+
+int NotationSelector::handleMouseMove(timeT, int,
+ QMouseEvent* e)
+{
+ if (!m_updateRect)
+ return RosegardenCanvasView::NoFollow;
+
+ int w = int(e->x() - m_selectionRect->x());
+ int h = int(e->y() - m_selectionRect->y());
+
+ if (m_clickedElement /* && !m_clickedElement->isRest() */) {
+
+ if (m_startedFineDrag) {
+ dragFine(e->x(), e->y(), false);
+ } else if (m_clickedShift) {
+ if (w > 2 || w < -2 || h > 2 || h < -2) {
+ dragFine(e->x(), e->y(), false);
+ }
+ } else if (w > 3 || w < -3 || h > 3 || h < -3) {
+ drag(e->x(), e->y(), false);
+ }
+
+ } else {
+
+ // Qt rectangle dimensions appear to be 1-based
+ if (w > 0)
+ ++w;
+ else
+ --w;
+ if (h > 0)
+ ++h;
+ else
+ --h;
+
+ m_selectionRect->setSize(w, h);
+ setViewCurrentSelection(true);
+ m_nParentView->canvas()->update();
+ }
+
+ return RosegardenCanvasView::FollowHorizontal | RosegardenCanvasView::FollowVertical;
+}
+
+void NotationSelector::handleMouseRelease(timeT, int, QMouseEvent *e)
+{
+ NOTATION_DEBUG << "NotationSelector::handleMouseRelease" << endl;
+ m_updateRect = false;
+
+ NOTATION_DEBUG << "selectionRect width, height: " << m_selectionRect->width()
+ << ", " << m_selectionRect->height() << endl;
+
+ // Test how far we've moved from the original click position -- not
+ // how big the rectangle is (if we were dragging an event, the
+ // rectangle size will still be zero).
+
+ if (((e->x() - m_selectionRect->x()) > -3 &&
+ (e->x() - m_selectionRect->x()) < 3 &&
+ (e->y() - m_selectionRect->y()) > -3 &&
+ (e->y() - m_selectionRect->y()) < 3) &&
+ !m_startedFineDrag) {
+
+ if (m_clickedElement != 0 && m_selectedStaff) {
+
+ // If we didn't drag out a meaningful area, but _did_
+ // click on an individual event, then select just that
+ // event
+
+ if (m_selectionToMerge &&
+ m_selectionToMerge->getSegment() ==
+ m_selectedStaff->getSegment()) {
+
+ // if the event was already part of the selection, we want to
+ // remove it
+ if (m_selectionToMerge->contains(m_clickedElement->event())) {
+ m_selectionToMerge->removeEvent(m_clickedElement->event());
+ } else {
+ m_selectionToMerge->addEvent(m_clickedElement->event());
+ }
+
+ m_nParentView->setCurrentSelection(m_selectionToMerge,
+ true, true);
+ m_selectionToMerge = 0;
+
+ } else {
+
+ m_nParentView->setSingleSelectedEvent
+ (m_selectedStaff->getId(), m_clickedElement->event(),
+ true, true);
+ }
+ /*
+ } else if (m_selectedStaff) {
+
+ // If we clicked on no event but on a staff, move the
+ // insertion cursor to the point where we clicked.
+ // Actually we only really want this to happen if
+ // we aren't double-clicking -- consider using a timer
+ // to establish whether a double-click is going to happen
+
+ m_nParentView->slotSetInsertCursorPosition(e->x(), (int)e->y());
+ */
+ } else {
+ setViewCurrentSelection(false);
+ }
+
+ } else {
+
+ if (m_startedFineDrag) {
+ dragFine(e->x(), e->y(), true);
+ } else if (m_clickedElement /* && !m_clickedElement->isRest() */) {
+ drag(e->x(), e->y(), true);
+ } else {
+ setViewCurrentSelection(false);
+ }
+ }
+
+ m_clickedElement = 0;
+ m_selectionRect->hide();
+ m_wholeStaffSelectionComplete = false;
+ m_nParentView->canvas()->update();
+}
+
+void NotationSelector::drag(int x, int y, bool final)
+{
+ NOTATION_DEBUG << "NotationSelector::drag " << x << ", " << y << endl;
+
+ if (!m_clickedElement || !m_selectedStaff)
+ return ;
+
+ EventSelection *selection = m_nParentView->getCurrentSelection();
+ if (!selection || !selection->contains(m_clickedElement->event())) {
+ selection = new EventSelection(m_selectedStaff->getSegment());
+ selection->addEvent(m_clickedElement->event());
+ }
+ m_nParentView->setCurrentSelection(selection);
+
+ LinedStaff *targetStaff = m_nParentView->getStaffForCanvasCoords(x, y);
+ if (!targetStaff)
+ targetStaff = m_selectedStaff;
+
+ // Calculate time and height
+
+ timeT clickedTime = m_clickedElement->event()->getNotationAbsoluteTime();
+
+ Accidental clickedAccidental = Accidentals::NoAccidental;
+ (void)m_clickedElement->event()->get<String>(ACCIDENTAL, clickedAccidental);
+
+ long clickedPitch = 0;
+ (void)m_clickedElement->event()->get<Int>(PITCH, clickedPitch);
+
+ long clickedHeight = 0;
+ (void)m_clickedElement->event()->get<Int>
+ (NotationProperties::HEIGHT_ON_STAFF, clickedHeight);
+
+ Event *clefEvt = 0, *keyEvt = 0;
+ Clef clef;
+ ::Rosegarden::Key key;
+
+ timeT dragTime = clickedTime;
+ double layoutX = m_clickedElement->getLayoutX();
+ timeT duration = m_clickedElement->getViewDuration();
+
+ NotationElementList::iterator itr =
+ targetStaff->getElementUnderCanvasCoords(x, y, clefEvt, keyEvt);
+
+ if (itr != targetStaff->getViewElementList()->end()) {
+
+ NotationElement *elt = dynamic_cast<NotationElement *>(*itr);
+ dragTime = elt->getViewAbsoluteTime();
+ layoutX = elt->getLayoutX();
+
+ if (elt->isRest() && duration > 0 && elt->getCanvasItem()) {
+
+ double restX = 0, restWidth = 0;
+ elt->getCanvasAirspace(restX, restWidth);
+
+ timeT restDuration = elt->getViewDuration();
+
+ if (restWidth > 0 &&
+ restDuration >= duration * 2) {
+
+ int parts = restDuration / duration;
+ double encroachment = x - restX;
+ NOTATION_DEBUG << "encroachment is " << encroachment << ", restWidth is " << restWidth << endl;
+ int part = (int)((encroachment / restWidth) * parts);
+ if (part >= parts)
+ part = parts - 1;
+
+ dragTime += part * restDuration / parts;
+ layoutX += part * restWidth / parts +
+ (restX - elt->getCanvasX());
+ }
+ }
+ }
+
+ if (clefEvt)
+ clef = Clef(*clefEvt);
+ if (keyEvt)
+ key = ::Rosegarden::Key(*keyEvt);
+
+ int height = targetStaff->getHeightAtCanvasCoords(x, y);
+ int pitch = clickedPitch;
+
+ if (height != clickedHeight)
+ pitch =
+ Pitch
+ (height, clef, key, clickedAccidental).getPerformancePitch();
+
+ if (pitch < clickedPitch) {
+ if (height < -10) {
+ height = -10;
+ pitch = Pitch
+ (height, clef, key, clickedAccidental).getPerformancePitch();
+ }
+ } else if (pitch > clickedPitch) {
+ if (height > 18) {
+ height = 18;
+ pitch = Pitch
+ (height, clef, key, clickedAccidental).getPerformancePitch();
+ }
+ }
+
+ bool singleNonNotePreview = !m_clickedElement->isNote() &&
+ selection->getSegmentEvents().size() == 1;
+
+ if (!final && !singleNonNotePreview) {
+
+ if ((pitch != m_lastDragPitch || dragTime != m_lastDragTime) &&
+ m_clickedElement->isNote()) {
+
+ m_nParentView->showPreviewNote(targetStaff->getId(),
+ layoutX, pitch, height,
+ Note::getNearestNote(duration),
+ m_clickedElement->isGrace());
+ m_lastDragPitch = pitch;
+ m_lastDragTime = dragTime;
+ }
+
+ } else {
+
+ m_nParentView->clearPreviewNote();
+
+ KMacroCommand *command = new KMacroCommand(MoveCommand::getGlobalName());
+ bool haveSomething = false;
+
+ MoveCommand *mc = 0;
+ Event *lastInsertedEvent = 0;
+
+ if (pitch != clickedPitch && m_clickedElement->isNote()) {
+ command->addCommand(new TransposeCommand(pitch - clickedPitch,
+ *selection));
+ haveSomething = true;
+ }
+
+ if (targetStaff != m_selectedStaff) {
+ command->addCommand(new MoveAcrossSegmentsCommand
+ (m_selectedStaff->getSegment(),
+ targetStaff->getSegment(),
+ dragTime - clickedTime + selection->getStartTime(),
+ true,
+ *selection));
+ haveSomething = true;
+ } else {
+ if (dragTime != clickedTime) {
+ mc = new MoveCommand
+ (m_selectedStaff->getSegment(), //!!!sort
+ dragTime - clickedTime, true, *selection);
+ command->addCommand(mc);
+ haveSomething = true;
+ }
+ }
+
+ if (haveSomething) {
+
+ m_nParentView->addCommandToHistory(command);
+
+ if (mc && singleNonNotePreview) {
+
+ lastInsertedEvent = mc->getLastInsertedEvent();
+
+ if (lastInsertedEvent) {
+ m_nParentView->setSingleSelectedEvent(targetStaff->getId(),
+ lastInsertedEvent);
+
+ ViewElementList::iterator vli =
+ targetStaff->findEvent(lastInsertedEvent);
+
+ if (vli != targetStaff->getViewElementList()->end()) {
+ m_clickedElement = dynamic_cast<NotationElement *>(*vli);
+ } else {
+ m_clickedElement = 0;
+ }
+
+ m_selectionRect->setX(x);
+ m_selectionRect->setY(y);
+ }
+ }
+ } else {
+ delete command;
+ }
+ }
+}
+
+void NotationSelector::dragFine(int x, int y, bool final)
+{
+ NOTATION_DEBUG << "NotationSelector::drag " << x << ", " << y << endl;
+
+ if (!m_clickedElement || !m_selectedStaff)
+ return ;
+
+ EventSelection *selection = m_nParentView->getCurrentSelection();
+ if (!selection)
+ selection = new EventSelection(m_selectedStaff->getSegment());
+ if (!selection->contains(m_clickedElement->event()))
+ selection->addEvent(m_clickedElement->event());
+ m_nParentView->setCurrentSelection(selection);
+
+ // Fine drag modifies the DISPLACED_X and DISPLACED_Y properties on
+ // each event. The modifications have to be relative to the previous
+ // values of these properties, not to zero, so for each event we need
+ // to store the previous value at the time the drag starts.
+
+ static PropertyName xProperty("temporary-displaced-x");
+ static PropertyName yProperty("temporary-displaced-y");
+
+ if (!m_startedFineDrag) {
+ // back up original properties
+
+ for (EventSelection::eventcontainer::iterator i =
+ selection->getSegmentEvents().begin();
+ i != selection->getSegmentEvents().end(); ++i) {
+ long prevX = 0, prevY = 0;
+ (*i)->get
+ <Int>(DISPLACED_X, prevX);
+ (*i)->get
+ <Int>(DISPLACED_Y, prevY);
+ (*i)->setMaybe<Int>(xProperty, prevX);
+ (*i)->setMaybe<Int>(yProperty, prevY);
+ }
+
+ m_startedFineDrag = true;
+ }
+
+ // We want the displacements in 1/1000ths of a staff space
+
+ double dx = x - m_selectionRect->x();
+ double dy = y - m_selectionRect->y();
+
+ double noteBodyWidth = m_nParentView->getNotePixmapFactory()->getNoteBodyWidth();
+ double lineSpacing = m_nParentView->getNotePixmapFactory()->getLineSpacing();
+ dx = (1000.0 * dx) / noteBodyWidth;
+ dy = (1000.0 * dy) / lineSpacing;
+
+ if (final) {
+
+ // reset original values (and remove backup values) before
+ // applying command
+
+ for (EventSelection::eventcontainer::iterator i =
+ selection->getSegmentEvents().begin();
+ i != selection->getSegmentEvents().end(); ++i) {
+ long prevX = 0, prevY = 0;
+ (*i)->get
+ <Int>(xProperty, prevX);
+ (*i)->get
+ <Int>(yProperty, prevY);
+ (*i)->setMaybe<Int>(DISPLACED_X, prevX);
+ (*i)->setMaybe<Int>(DISPLACED_Y, prevY);
+ (*i)->unset(xProperty);
+ (*i)->unset(yProperty);
+ }
+
+ IncrementDisplacementsCommand *command = new IncrementDisplacementsCommand
+ (*selection, long(dx), long(dy));
+ m_nParentView->addCommandToHistory(command);
+
+ } else {
+
+ timeT startTime = 0, endTime = 0;
+
+ for (EventSelection::eventcontainer::iterator i =
+ selection->getSegmentEvents().begin();
+ i != selection->getSegmentEvents().end(); ++i) {
+ long prevX = 0, prevY = 0;
+ (*i)->get
+ <Int>(xProperty, prevX);
+ (*i)->get
+ <Int>(yProperty, prevY);
+ (*i)->setMaybe<Int>(DISPLACED_X, prevX + long(dx));
+ (*i)->setMaybe<Int>(DISPLACED_Y, prevY + long(dy));
+ if (i == selection->getSegmentEvents().begin()) {
+ startTime = (*i)->getAbsoluteTime();
+ }
+ endTime = (*i)->getAbsoluteTime() + (*i)->getDuration();
+ }
+
+ if (startTime == endTime)
+ ++endTime;
+ selection->getSegment().updateRefreshStatuses(startTime, endTime);
+ m_nParentView->update();
+ }
+}
+
+void NotationSelector::ready()
+{
+ m_selectionRect = new QCanvasRectangle(m_nParentView->canvas());
+
+ m_selectionRect->hide();
+ m_selectionRect->setPen(GUIPalette::getColour(GUIPalette::SelectionRectangle));
+
+ m_nParentView->setCanvasCursor(Qt::arrowCursor);
+ m_nParentView->setHeightTracking(false);
+}
+
+void NotationSelector::stow()
+{
+ delete m_selectionRect;
+ m_selectionRect = 0;
+ m_nParentView->canvas()->update();
+}
+
+void NotationSelector::slotHideSelection()
+{
+ if (!m_selectionRect)
+ return ;
+ m_selectionRect->hide();
+ m_selectionRect->setSize(0, 0);
+ m_nParentView->canvas()->update();
+}
+
+void NotationSelector::slotInsertSelected()
+{
+ m_nParentView->slotLastNoteAction();
+}
+
+void NotationSelector::slotEraseSelected()
+{
+ m_parentView->actionCollection()->action("erase")->activate();
+}
+
+void NotationSelector::slotCollapseRestsHard()
+{
+ m_parentView->actionCollection()->action("collapse_rests_aggressively")->activate();
+}
+
+void NotationSelector::slotRespellFlat()
+{
+ m_parentView->actionCollection()->action("respell_flat")->activate();
+}
+
+void NotationSelector::slotRespellSharp()
+{
+ m_parentView->actionCollection()->action("respell_sharp")->activate();
+}
+
+void NotationSelector::slotRespellNatural()
+{
+ m_parentView->actionCollection()->action("respell_natural")->activate();
+}
+
+void NotationSelector::slotCollapseNotes()
+{
+ m_parentView->actionCollection()->action("collapse_notes")->activate();
+}
+
+void NotationSelector::slotInterpret()
+{
+ m_parentView->actionCollection()->action("interpret")->activate();
+}
+
+void NotationSelector::slotStaffAbove()
+{
+ m_parentView->actionCollection()->action("move_events_up_staff")->activate();
+}
+
+void NotationSelector::slotStaffBelow()
+{
+ m_parentView->actionCollection()->action("move_events_down_staff")->activate();
+}
+
+void NotationSelector::slotMakeInvisible()
+{
+ m_parentView->actionCollection()->action("make_invisible")->activate();
+}
+
+void NotationSelector::slotMakeVisible()
+{
+ m_parentView->actionCollection()->action("make_visible")->activate();
+}
+
+void NotationSelector::setViewCurrentSelection(bool preview)
+{
+ EventSelection *selection = getSelection();
+
+ if (m_selectionToMerge) {
+ if (selection &&
+ m_selectionToMerge->getSegment() == selection->getSegment()) {
+ selection->addFromSelection(m_selectionToMerge);
+ } else {
+ return ;
+ }
+ }
+
+ m_nParentView->setCurrentSelection(selection, preview, true);
+}
+
+NotationStaff *
+NotationSelector::getStaffForElement(NotationElement *elt)
+{
+ for (int i = 0; i < m_nParentView->getStaffCount(); ++i) {
+ NotationStaff *staff = m_nParentView->getNotationStaff(i);
+ if (staff->getSegment().findSingle(elt->event()) !=
+ staff->getSegment().end())
+ return staff;
+ }
+ return 0;
+}
+
+EventSelection* NotationSelector::getSelection()
+{
+ // If selection rect is not visible or too small,
+ // return 0
+ //
+ if (!m_selectionRect->visible()) return 0;
+
+ // NOTATION_DEBUG << "Selection x,y: " << m_selectionRect->x() << ","
+ // << m_selectionRect->y() << "; w,h: " << m_selectionRect->width() << "," << m_selectionRect->height() << endl;
+
+ if (m_selectionRect->width() > -3 &&
+ m_selectionRect->width() < 3 &&
+ m_selectionRect->height() > -3 &&
+ m_selectionRect->height() < 3) return 0;
+
+ QCanvasItemList itemList = m_selectionRect->collisions(false);
+ QCanvasItemList::Iterator it;
+
+ QRect rect = m_selectionRect->rect().normalize();
+ QCanvasNotationSprite *sprite = 0;
+
+ if (!m_selectedStaff) {
+
+ // Scan the list of collisions, looking for a valid notation
+ // element; if we find one, initialise m_selectedStaff from it.
+ // If we don't find one, we have no selection. This is a little
+ // inefficient but we only do it for the first event in the
+ // selection.
+
+ for (it = itemList.begin(); it != itemList.end(); ++it) {
+
+ if ((sprite = dynamic_cast<QCanvasNotationSprite*>(*it))) {
+
+ NotationElement &el = sprite->getNotationElement();
+
+ NotationStaff *staff = getStaffForElement(&el);
+ if (!staff) continue;
+
+ int x = (int)(*it)->x();
+ bool shifted = false;
+ int nbw = staff->getNotePixmapFactory(false).getNoteBodyWidth();
+
+
+ // #957364 (Notation: Hard to select upper note in
+ // chords of seconds) -- adjust x-coord for shifted
+ // note head
+ if (el.event()->get<Rosegarden::Bool>
+ (staff->getProperties().NOTE_HEAD_SHIFTED, shifted) && shifted) {
+ x += nbw;
+ }
+
+ if (!rect.contains(x, int((*it)->y()), true)) {
+ // #988217 (Notation: Special column of pixels
+ // prevents sweep selection) -- for notes, test
+ // again with centred x-coord
+ if (!el.isNote() || !rect.contains(x + nbw/2, int((*it)->y()), true)) {
+ continue;
+ }
+ }
+
+ m_selectedStaff = staff;
+ break;
+ }
+ }
+ }
+
+ if (!m_selectedStaff) return 0;
+ Segment& originalSegment = m_selectedStaff->getSegment();
+
+ // If we selected the whole staff, force that to happen explicitly
+ // rather than relying on collisions with the rectangle -- because
+ // events way off the currently visible area might not even have
+ // been drawn yet, and so will not appear in the collision list.
+ // (We did still need the collision list to determine which staff
+ // to use though.)
+
+ if (m_wholeStaffSelectionComplete) {
+ EventSelection *selection = new EventSelection(originalSegment,
+ originalSegment.getStartTime(),
+ originalSegment.getEndMarkerTime());
+ return selection;
+ }
+
+ EventSelection* selection = new EventSelection(originalSegment);
+
+ for (it = itemList.begin(); it != itemList.end(); ++it) {
+
+ if ((sprite = dynamic_cast<QCanvasNotationSprite*>(*it))) {
+
+ NotationElement &el = sprite->getNotationElement();
+
+ int x = (int)(*it)->x();
+ bool shifted = false;
+ int nbw = m_selectedStaff->getNotePixmapFactory(false).getNoteBodyWidth();
+
+ // #957364 (Notation: Hard to select upper note in chords
+ // of seconds) -- adjust x-coord for shifted note head
+ if (el.event()->get<Rosegarden::Bool>
+ (m_selectedStaff->getProperties().NOTE_HEAD_SHIFTED, shifted)
+ && shifted) {
+ x += nbw;
+ }
+
+ // check if the element's rect
+ // is actually included in the selection rect.
+ //
+ if (!rect.contains(x, int((*it)->y()), true)) {
+ // #988217 (Notation: Special column of pixels
+ // prevents sweep selection) -- for notes, test again
+ // with centred x-coord
+ if (!el.isNote() || !rect.contains(x + nbw/2, int((*it)->y()), true)) {
+ continue;
+ }
+ }
+
+ // must be in the same segment as we first started on,
+ // we can't select events across multiple segments
+ if (selection->getSegment().findSingle(el.event()) !=
+ selection->getSegment().end()) {
+ selection->addEvent(el.event());
+ }
+ }
+ }
+
+ if (selection->getAddedEvents() > 0) {
+ return selection;
+ } else {
+ delete selection;
+ return 0;
+ }
+}
+
+const QString NotationSelector::ToolName = "notationselector";
+
+}
+#include "NotationSelector.moc"
diff --git a/src/gui/editors/notation/NotationSelector.h b/src/gui/editors/notation/NotationSelector.h
new file mode 100644
index 0000000..7266fd5
--- /dev/null
+++ b/src/gui/editors/notation/NotationSelector.h
@@ -0,0 +1,197 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_NOTATIONSELECTOR_H_
+#define _RG_NOTATIONSELECTOR_H_
+
+#include "NotationTool.h"
+#include "NotationElement.h"
+#include <qstring.h>
+#include "base/Event.h"
+
+
+class QMouseEvent;
+class QCanvasRectangle;
+class m_clickedElement;
+
+
+namespace Rosegarden
+{
+
+class ViewElement;
+class NotationView;
+class NotationStaff;
+class NotationElement;
+class EventSelection;
+class Event;
+
+
+/**
+ * Rectangular note selection
+ */
+class NotationSelector : public NotationTool
+{
+ Q_OBJECT
+
+ friend class NotationToolBox;
+
+public:
+
+ ~NotationSelector();
+
+ virtual void handleLeftButtonPress(timeT,
+ int height,
+ int staffNo,
+ QMouseEvent*,
+ ViewElement* el);
+
+ virtual void handleRightButtonPress(timeT time,
+ int height,
+ int staffNo,
+ QMouseEvent*,
+ ViewElement*);
+
+ virtual int handleMouseMove(timeT,
+ int height,
+ QMouseEvent*);
+
+ virtual void handleMouseRelease(timeT time,
+ int height,
+ QMouseEvent*);
+
+ virtual void handleMouseDoubleClick(timeT,
+ int height,
+ int staffNo,
+ QMouseEvent*,
+ ViewElement*);
+
+ virtual void handleMouseTripleClick(timeT,
+ int height,
+ int staffNo,
+ QMouseEvent*,
+ ViewElement*);
+
+ /**
+ * Create the selection rect
+ *
+ * We need this because NotationView deletes all QCanvasItems
+ * along with it. This happens before the NotationSelector is
+ * deleted, so we can't delete the selection rect in
+ * ~NotationSelector because that leads to double deletion.
+ */
+ virtual void ready();
+
+ /**
+ * Delete the selection rect.
+ */
+ virtual void stow();
+
+ /**
+ * Returns the currently selected events
+ *
+ * The returned result is owned by the caller
+ */
+ EventSelection* getSelection();
+
+ /**
+ * Respond to an event being deleted -- it may be the one the tool
+ * is remembering as the current event.
+ */
+ virtual void handleEventRemoved(Event *event) {
+ if (m_clickedElement && m_clickedElement->event() == event) {
+ m_clickedElement = 0;
+ }
+ }
+
+ static const QString ToolName;
+
+signals:
+ void editElement(NotationStaff *, NotationElement *, bool advanced);
+
+public slots:
+ /**
+ * Hide the selection rectangle
+ *
+ * Should be called after a cut or a copy has been
+ * performed
+ */
+ void slotHideSelection();
+
+ void slotInsertSelected();
+ void slotEraseSelected();
+// void slotCollapseRests();
+ void slotCollapseRestsHard();
+ void slotRespellFlat();
+ void slotRespellSharp();
+ void slotRespellNatural();
+ void slotCollapseNotes();
+ void slotInterpret();
+ void slotStaffAbove();
+ void slotStaffBelow();
+ void slotMakeInvisible();
+ void slotMakeVisible();
+
+ void slotClickTimeout();
+
+protected:
+ NotationSelector(NotationView*);
+
+ /**
+ * Set the current selection on the parent NotationView
+ */
+ void setViewCurrentSelection(bool preview);
+
+ /**
+ * Look up the staff containing the given notation element
+ */
+ NotationStaff *getStaffForElement(NotationElement *elt);
+
+ void drag(int x, int y, bool final);
+ void dragFine(int x, int y, bool final);
+
+ //--------------- Data members ---------------------------------
+
+ QCanvasRectangle* m_selectionRect;
+ bool m_updateRect;
+
+ NotationStaff *m_selectedStaff;
+ NotationElement *m_clickedElement;
+ bool m_clickedShift;
+ bool m_startedFineDrag;
+
+ EventSelection *m_selectionToMerge;
+
+ long m_lastDragPitch;
+ timeT m_lastDragTime;
+
+ bool m_justSelectedBar;
+ bool m_wholeStaffSelectionComplete;
+};
+
+
+
+}
+
+#endif
diff --git a/src/gui/editors/notation/NotationStaff.cpp b/src/gui/editors/notation/NotationStaff.cpp
new file mode 100644
index 0000000..c5219b4
--- /dev/null
+++ b/src/gui/editors/notation/NotationStaff.cpp
@@ -0,0 +1,2300 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "NotationStaff.h"
+#include "misc/Debug.h"
+#include <kapplication.h>
+
+#include <klocale.h>
+#include "misc/Strings.h"
+#include "document/ConfigGroups.h"
+#include "base/Composition.h"
+#include "base/Device.h"
+#include "base/Event.h"
+#include "base/Exception.h"
+#include "base/Instrument.h"
+#include "base/MidiDevice.h"
+#include "base/MidiTypes.h"
+#include "base/NotationQuantizer.h"
+#include "base/NotationRules.h"
+#include "base/NotationTypes.h"
+#include "base/Profiler.h"
+#include "base/Segment.h"
+#include "base/Selection.h"
+#include "base/SnapGrid.h"
+#include "base/Staff.h"
+#include "base/Studio.h"
+#include "base/Track.h"
+#include "base/ViewElement.h"
+#include "document/RosegardenGUIDoc.h"
+#include "gui/editors/guitar/Chord.h"
+#include "gui/general/LinedStaff.h"
+#include "gui/general/PixmapFunctions.h"
+#include "gui/general/ProgressReporter.h"
+#include "gui/kdeext/QCanvasSimpleSprite.h"
+#include "NotationChord.h"
+#include "NotationElement.h"
+#include "NotationProperties.h"
+#include "NotationView.h"
+#include "NoteFontFactory.h"
+#include "NotePixmapFactory.h"
+#include "NotePixmapParameters.h"
+#include "NoteStyleFactory.h"
+#include <kconfig.h>
+#include <kmessagebox.h>
+#include <qcanvas.h>
+#include <qpainter.h>
+#include <qpoint.h>
+#include <qrect.h>
+
+
+namespace Rosegarden
+{
+
+NotationStaff::NotationStaff(QCanvas *canvas, Segment *segment,
+ SnapGrid *snapGrid, int id,
+ NotationView *view,
+ std::string fontName, int resolution) :
+ ProgressReporter(0),
+ LinedStaff(canvas, segment, snapGrid, id, resolution,
+ resolution / 16 + 1, // line thickness
+ LinearMode, 0, 0, // pageMode, pageWidth and pageHeight set later
+ 0 // row spacing
+ ),
+ m_notePixmapFactory(0),
+ m_graceNotePixmapFactory(0),
+ m_previewSprite(0),
+ m_staffName(0),
+ m_notationView(view),
+ m_legerLineCount(8),
+ m_barNumbersEvery(0),
+ m_colourQuantize(true),
+ m_showUnknowns(true),
+ m_showRanges(true),
+ m_showCollisions(true),
+ m_printPainter(0),
+ m_ready(false),
+ m_lastRenderedBar(0)
+{
+ KConfig *config = kapp->config();
+ config->setGroup(NotationViewConfigGroup);
+ m_colourQuantize = config->readBoolEntry("colourquantize", false);
+
+ // Shouldn't change these during the lifetime of the staff, really:
+ m_showUnknowns = config->readBoolEntry("showunknowns", false);
+ m_showRanges = config->readBoolEntry("showranges", true);
+ m_showCollisions = config->readBoolEntry("showcollisions", true);
+
+ m_keySigCancelMode = config->readNumEntry("keysigcancelmode", 1);
+
+ changeFont(fontName, resolution);
+}
+
+NotationStaff::~NotationStaff()
+{
+ deleteTimeSignatures();
+ delete m_notePixmapFactory;
+ delete m_graceNotePixmapFactory;
+}
+
+void
+NotationStaff::changeFont(std::string fontName, int size)
+{
+ setResolution(size);
+
+ delete m_notePixmapFactory;
+ m_notePixmapFactory = new NotePixmapFactory(fontName, size);
+
+ std::vector<int> sizes = NoteFontFactory::getScreenSizes(fontName);
+ int graceSize = size;
+ for (unsigned int i = 0; i < sizes.size(); ++i) {
+ if (sizes[i] == size || sizes[i] > size*3 / 4)
+ break;
+ graceSize = sizes[i];
+ }
+ delete m_graceNotePixmapFactory;
+ m_graceNotePixmapFactory = new NotePixmapFactory(fontName, graceSize);
+
+ setLineThickness(m_notePixmapFactory->getStaffLineThickness());
+}
+
+void
+NotationStaff::insertTimeSignature(double layoutX,
+ const TimeSignature &timeSig)
+{
+ if (timeSig.isHidden())
+ return ;
+
+ m_notePixmapFactory->setSelected(false);
+ QCanvasPixmap *pixmap = m_notePixmapFactory->makeTimeSigPixmap(timeSig);
+ QCanvasTimeSigSprite *sprite =
+ new QCanvasTimeSigSprite(layoutX, pixmap, m_canvas);
+
+ LinedStaffCoords sigCoords =
+ getCanvasCoordsForLayoutCoords(layoutX, getLayoutYForHeight(4));
+
+ sprite->move(sigCoords.first, (double)sigCoords.second);
+ sprite->show();
+ m_timeSigs.insert(sprite);
+}
+
+void
+NotationStaff::deleteTimeSignatures()
+{
+ // NOTATION_DEBUG << "NotationStaff::deleteTimeSignatures()" << endl;
+
+ for (SpriteSet::iterator i = m_timeSigs.begin();
+ i != m_timeSigs.end(); ++i) {
+ delete *i;
+ }
+
+ m_timeSigs.clear();
+}
+
+void
+NotationStaff::insertRepeatedClefAndKey(double layoutX, int barNo)
+{
+ bool needClef = false, needKey = false;
+ timeT t;
+
+ timeT barStart = getSegment().getComposition()->getBarStart(barNo);
+
+ Clef clef = getSegment().getClefAtTime(barStart, t);
+ if (t < barStart)
+ needClef = true;
+
+ ::Rosegarden::Key key = getSegment().getKeyAtTime(barStart, t);
+ if (t < barStart)
+ needKey = true;
+
+ double dx = m_notePixmapFactory->getBarMargin() / 2;
+
+ if (!m_notationView->isInPrintMode())
+ m_notePixmapFactory->setShaded(true);
+
+ if (needClef) {
+
+ int layoutY = getLayoutYForHeight(clef.getAxisHeight());
+
+ LinedStaffCoords coords =
+ getCanvasCoordsForLayoutCoords(layoutX + dx, layoutY);
+
+ QCanvasPixmap *pixmap = m_notePixmapFactory->makeClefPixmap(clef);
+
+ QCanvasNonElementSprite *sprite =
+ new QCanvasNonElementSprite(pixmap, m_canvas);
+
+ sprite->move(coords.first, coords.second);
+ sprite->show();
+ m_repeatedClefsAndKeys.insert(sprite);
+
+ dx += pixmap->width() + m_notePixmapFactory->getNoteBodyWidth() * 2 / 3;
+ }
+
+ if (needKey) {
+
+ int layoutY = getLayoutYForHeight(12);
+
+ LinedStaffCoords coords =
+ getCanvasCoordsForLayoutCoords(layoutX + dx, layoutY);
+
+ QCanvasPixmap *pixmap = m_notePixmapFactory->makeKeyPixmap(key, clef);
+
+ QCanvasNonElementSprite *sprite =
+ new QCanvasNonElementSprite(pixmap, m_canvas);
+
+ sprite->move(coords.first, coords.second);
+ sprite->show();
+ m_repeatedClefsAndKeys.insert(sprite);
+
+ dx += pixmap->width();
+ }
+
+ /* attempt to blot out things like slurs & ties that overrun this area: doesn't work
+
+ if (m_notationView->isInPrintMode() && (needClef || needKey)) {
+
+ int layoutY = getLayoutYForHeight(14);
+ int h = getLayoutYForHeight(-8) - layoutY;
+
+ LinedStaffCoords coords =
+ getCanvasCoordsForLayoutCoords(layoutX, layoutY);
+
+ QCanvasRectangle *rect = new QCanvasRectangle(coords.first, coords.second,
+ dx, h, m_canvas);
+ rect->setPen(Qt::black);
+ rect->setBrush(Qt::white);
+ rect->setZ(1);
+ rect->show();
+
+ m_repeatedClefsAndKeys.insert(rect);
+ }
+ */
+
+ m_notePixmapFactory->setShaded(false);
+}
+
+void
+NotationStaff::deleteRepeatedClefsAndKeys()
+{
+ for (ItemSet::iterator i = m_repeatedClefsAndKeys.begin();
+ i != m_repeatedClefsAndKeys.end(); ++i) {
+ delete *i;
+ }
+
+ m_repeatedClefsAndKeys.clear();
+}
+
+void
+NotationStaff::drawStaffName()
+{
+ delete m_staffName;
+
+ m_staffNameText =
+ getSegment().getComposition()->
+ getTrackById(getSegment().getTrack())->getLabel();
+
+ QCanvasPixmap *map =
+ m_notePixmapFactory->makeTextPixmap
+ (Text(m_staffNameText, Text::StaffName));
+
+ m_staffName = new QCanvasStaffNameSprite(map, m_canvas);
+
+ int layoutY = getLayoutYForHeight(3);
+ LinedStaffCoords coords = getCanvasCoordsForLayoutCoords(0, layoutY);
+ m_staffName->move(getX() + getMargin() + m_notePixmapFactory->getNoteBodyWidth(),
+ coords.second - map->height() / 2);
+ m_staffName->show();
+}
+
+bool
+NotationStaff::isStaffNameUpToDate()
+{
+ return (m_staffNameText ==
+ getSegment().getComposition()->
+ getTrackById(getSegment().getTrack())->getLabel());
+}
+
+timeT
+NotationStaff::getTimeAtCanvasCoords(double cx, int cy) const
+{
+ LinedStaffCoords layoutCoords = getLayoutCoordsForCanvasCoords(cx, cy);
+ RulerScale * rs = m_notationView->getHLayout();
+ return rs->getTimeForX(layoutCoords.first);
+}
+
+void
+NotationStaff::getClefAndKeyAtCanvasCoords(double cx, int cy,
+ Clef &clef,
+ ::Rosegarden::Key &key) const
+{
+ LinedStaffCoords layoutCoords = getLayoutCoordsForCanvasCoords(cx, cy);
+ int i;
+
+ for (i = 0; i < m_clefChanges.size(); ++i) {
+ if (m_clefChanges[i].first > layoutCoords.first)
+ break;
+ clef = m_clefChanges[i].second;
+ }
+
+ for (i = 0; i < m_keyChanges.size(); ++i) {
+ if (m_keyChanges[i].first > layoutCoords.first)
+ break;
+ key = m_keyChanges[i].second;
+ }
+}
+
+ViewElementList::iterator
+NotationStaff::getClosestElementToLayoutX(double x,
+ Event *&clef,
+ Event *&key,
+ bool notesAndRestsOnly,
+ int proximityThreshold)
+{
+ START_TIMING;
+
+ double minDist = 10e9, prevDist = 10e9;
+
+ NotationElementList *notes = getViewElementList();
+ NotationElementList::iterator it, result;
+
+ // TODO: this is grossly inefficient
+
+ for (it = notes->begin(); it != notes->end(); ++it) {
+ NotationElement *el = static_cast<NotationElement*>(*it);
+
+ bool before = ((*it)->getLayoutX() < x);
+
+ if (!el->isNote() && !el->isRest()) {
+ if (before) {
+ if ((*it)->event()->isa(Clef::EventType)) {
+ clef = (*it)->event();
+ } else if ((*it)->event()->isa(::Rosegarden::Key::EventType)) {
+ key = (*it)->event();
+ }
+ }
+ if (notesAndRestsOnly)
+ continue;
+ }
+
+ double dx = x - (*it)->getLayoutX();
+ if (dx < 0)
+ dx = -dx;
+
+ if (dx < minDist) {
+ minDist = dx;
+ result = it;
+ } else if (!before) {
+ break;
+ }
+
+ prevDist = dx;
+ }
+
+ if (proximityThreshold > 0 && minDist > proximityThreshold) {
+ NOTATION_DEBUG << "NotationStaff::getClosestElementToLayoutX() : element is too far away : "
+ << minDist << endl;
+ return notes->end();
+ }
+
+ NOTATION_DEBUG << "NotationStaff::getClosestElementToLayoutX: found element at layout " << (*result)->getLayoutX() << " - we're at layout " << x << endl;
+
+ PRINT_ELAPSED("NotationStaff::getClosestElementToLayoutX");
+
+ return result;
+}
+
+ViewElementList::iterator
+NotationStaff::getElementUnderLayoutX(double x,
+ Event *&clef,
+ Event *&key)
+{
+ NotationElementList *notes = getViewElementList();
+ NotationElementList::iterator it;
+
+ // TODO: this is grossly inefficient
+
+ for (it = notes->begin(); it != notes->end(); ++it) {
+ NotationElement* el = static_cast<NotationElement*>(*it);
+
+ bool before = ((*it)->getLayoutX() <= x);
+
+ if (!el->isNote() && !el->isRest()) {
+ if (before) {
+ if ((*it)->event()->isa(Clef::EventType)) {
+ clef = (*it)->event();
+ } else if ((*it)->event()->isa(::Rosegarden::Key::EventType)) {
+ key = (*it)->event();
+ }
+ }
+ }
+
+ double airX, airWidth;
+ el->getLayoutAirspace(airX, airWidth);
+ if (x >= airX && x < airX + airWidth) {
+ return it;
+ } else if (!before) {
+ if (it != notes->begin())
+ --it;
+ return it;
+ }
+ }
+
+ return notes->end();
+}
+
+std::string
+NotationStaff::getNoteNameAtCanvasCoords(double x, int y,
+ Accidental) const
+{
+ Clef clef;
+ ::Rosegarden::Key key;
+ getClefAndKeyAtCanvasCoords(x, y, clef, key);
+
+ KConfig *config = kapp->config();
+ config->setGroup(GeneralOptionsConfigGroup);
+ int baseOctave = config->readNumEntry("midipitchoctave", -2);
+
+ Pitch p(getHeightAtCanvasCoords(x, y), clef, key);
+ //!!! i18n() how?
+ return p.getAsString(key.isSharp(), true, baseOctave);
+}
+
+void
+NotationStaff::renderElements(NotationElementList::iterator from,
+ NotationElementList::iterator to)
+{
+ // NOTATION_DEBUG << "NotationStaff " << this << "::renderElements()" << endl;
+ Profiler profiler("NotationStaff::renderElements");
+
+ emit setOperationName(i18n("Rendering staff %1...").arg(getId() + 1));
+ emit setProgress(0);
+
+ throwIfCancelled();
+
+ // These are only used when rendering keys, and we don't have the
+ // right start data here so we choose not to render keys at all in
+ // this method (see below) so that we can pass bogus clef and key
+ // data to renderSingleElement
+ Clef currentClef;
+ ::Rosegarden::Key currentKey;
+
+ int elementCount = 0;
+ timeT endTime =
+ (to != getViewElementList()->end() ? (*to)->getViewAbsoluteTime() :
+ getSegment().getEndMarkerTime());
+ timeT startTime = (from != to ? (*from)->getViewAbsoluteTime() : endTime);
+
+ for (NotationElementList::iterator it = from, nextIt = from;
+ it != to; it = nextIt) {
+
+ ++nextIt;
+
+ if (isDirectlyPrintable(*it)) {
+ // notes are renderable direct to the printer, so don't render
+ // them to the canvas here
+ continue;
+ }
+
+ if ((*it)->event()->isa(::Rosegarden::Key::EventType)) {
+ // force rendering in positionElements instead
+ NotationElement* el = static_cast<NotationElement*>(*it);
+ el->removeCanvasItem();
+ continue;
+ }
+
+ bool selected = isSelected(it);
+ // NOTATION_DEBUG << "Rendering at " << (*it)->getAbsoluteTime()
+ // << " (selected = " << selected << ")" << endl;
+
+ renderSingleElement(it, currentClef, currentKey, selected);
+
+ if ((endTime > startTime) &&
+ (++elementCount % 200 == 0)) {
+
+ timeT myTime = (*it)->getViewAbsoluteTime();
+ emit setProgress((myTime - startTime) * 100 / (endTime - startTime));
+ throwIfCancelled();
+ }
+ }
+
+ // NOTATION_DEBUG << "NotationStaff " << this << "::renderElements: "
+ // << elementCount << " elements rendered" << endl;
+}
+
+void
+NotationStaff::renderPrintable(timeT from, timeT to)
+{
+ if (!m_printPainter)
+ return ;
+
+ Profiler profiler("NotationStaff::renderElements");
+
+ emit setOperationName(i18n("Rendering notes on staff %1...").arg(getId() + 1));
+ emit setProgress(0);
+
+ throwIfCancelled();
+
+ // These are only used when rendering keys, and we don't do that
+ // here, so we don't care what they are
+ Clef currentClef;
+ ::Rosegarden::Key currentKey;
+
+ Composition *composition = getSegment().getComposition();
+ NotationElementList::iterator beginAt =
+ getViewElementList()->findTime(composition->getBarStartForTime(from));
+ NotationElementList::iterator endAt =
+ getViewElementList()->findTime(composition->getBarEndForTime(to));
+
+ int elementCount = 0;
+
+ for (NotationElementList::iterator it = beginAt, nextIt = beginAt;
+ it != endAt; it = nextIt) {
+
+ ++nextIt;
+
+ if (!isDirectlyPrintable(*it)) {
+ continue;
+ }
+
+ bool selected = isSelected(it);
+ // NOTATION_DEBUG << "Rendering at " << (*it)->getAbsoluteTime()
+ // << " (selected = " << selected << ")" << endl;
+
+ renderSingleElement(it, currentClef, currentKey, selected);
+
+ if ((to > from) && (++elementCount % 200 == 0)) {
+
+ timeT myTime = (*it)->getViewAbsoluteTime();
+ emit setProgress((myTime - from) * 100 / (to - from));
+ throwIfCancelled();
+ }
+ }
+
+ // NOTATION_DEBUG << "NotationStaff " << this << "::renderElements: "
+ // << elementCount << " elements rendered" << endl;
+}
+
+const NotationProperties &
+NotationStaff::getProperties() const
+{
+ return m_notationView->getProperties();
+}
+
+void
+NotationStaff::positionElements(timeT from, timeT to)
+{
+ // NOTATION_DEBUG << "NotationStaff " << this << "::positionElements()"
+ // << from << " -> " << to << endl;
+ Profiler profiler("NotationStaff::positionElements");
+
+ // Following 4 lines are a workaround to not have m_clefChanges and
+ // m_keyChanges truncated when positionElements() is called with
+ // args outside current segment.
+ // Maybe a better fix would be not to call positionElements() with
+ // such args ...
+ int startTime = getSegment().getStartTime();
+ if (from < startTime) from = startTime;
+ if (to < startTime) to = startTime;
+ if (to == from) return;
+
+ emit setOperationName(i18n("Positioning staff %1...").arg(getId() + 1));
+ emit setProgress(0);
+ throwIfCancelled();
+
+ const NotationProperties &properties(getProperties());
+
+ int elementsPositioned = 0;
+ int elementsRendered = 0; // diagnostic
+
+ Composition *composition = getSegment().getComposition();
+
+ timeT nextBarTime = composition->getBarEndForTime(to);
+
+ NotationElementList::iterator beginAt =
+ getViewElementList()->findTime(composition->getBarStartForTime(from));
+
+ NotationElementList::iterator endAt =
+ getViewElementList()->findTime(composition->getBarEndForTime(to));
+
+ if (beginAt == getViewElementList()->end())
+ return ;
+
+ truncateClefsAndKeysAt(static_cast<int>((*beginAt)->getLayoutX()));
+
+ Clef currentClef; // used for rendering key sigs
+ bool haveCurrentClef = false;
+
+ ::Rosegarden::Key currentKey;
+ bool haveCurrentKey = false;
+
+ for (NotationElementList::iterator it = beginAt, nextIt = beginAt;
+ it != endAt; it = nextIt) {
+
+ NotationElement * el = static_cast<NotationElement*>(*it);
+
+ ++nextIt;
+
+ if (el->event()->isa(Clef::EventType)) {
+
+ currentClef = Clef(*el->event());
+ m_clefChanges.push_back(ClefChange(int(el->getLayoutX()),
+ currentClef));
+ haveCurrentClef = true;
+
+ } else if (el->event()->isa(::Rosegarden::Key::EventType)) {
+
+ m_keyChanges.push_back
+ (KeyChange(int(el->getLayoutX()),
+ ::Rosegarden::Key(*el->event())));
+
+ if (!haveCurrentClef) { // need this to know how to present the key
+ currentClef = getSegment().getClefAtTime
+ (el->event()->getAbsoluteTime());
+ haveCurrentClef = true;
+ }
+
+ if (!haveCurrentKey) { // stores the key _before_ this one
+ currentKey = getSegment().getKeyAtTime
+ (el->event()->getAbsoluteTime() - 1);
+ haveCurrentKey = true;
+ }
+
+ } else if (isDirectlyPrintable(el)) {
+ // these are rendered by renderPrintable for printing
+ continue;
+ }
+
+ bool selected = isSelected(it);
+ bool needNewSprite = (selected != el->isSelected());
+
+ if (!el->getCanvasItem()) {
+
+ needNewSprite = true;
+
+ } else if (el->isNote() && !el->isRecentlyRegenerated()) {
+
+ // If the note's y-coordinate has changed, we should
+ // redraw it -- its stem direction may have changed, or it
+ // may need leger lines. This will happen e.g. if the
+ // user inserts a new clef; unfortunately this means
+ // inserting clefs is rather slow.
+
+ needNewSprite = needNewSprite || !elementNotMovedInY(el);
+
+ if (!needNewSprite) {
+
+ // If the event is a beamed or tied-forward note, then
+ // we might need a new sprite if the distance from
+ // this note to the next has changed (because the beam
+ // or tie is part of the note's sprite).
+
+ bool spanning = false;
+ (void)(el->event()->get
+ <Bool>
+ (properties.BEAMED, spanning));
+ if (!spanning) {
+ (void)(el->event()->get
+ <Bool>(BaseProperties::TIED_FORWARD, spanning));
+ }
+
+ if (spanning) {
+ needNewSprite =
+ (el->getViewAbsoluteTime() < nextBarTime ||
+ !elementShiftedOnly(it));
+ }
+ }
+
+ } else if (el->event()->isa(Indication::EventType) &&
+ !el->isRecentlyRegenerated()) {
+ needNewSprite = true;
+ }
+
+ if (needNewSprite) {
+ renderSingleElement(it, currentClef, currentKey, selected);
+ ++elementsRendered;
+ }
+
+ if (el->event()->isa(::Rosegarden::Key::EventType)) {
+ // update currentKey after rendering, not before
+ currentKey = ::Rosegarden::Key(*el->event());
+ }
+
+ if (!needNewSprite) {
+ LinedStaffCoords coords = getCanvasCoordsForLayoutCoords
+ (el->getLayoutX(), (int)el->getLayoutY());
+ el->reposition(coords.first, (double)coords.second);
+ }
+
+ el->setSelected(selected);
+
+ if ((to > from) &&
+ (++elementsPositioned % 300 == 0)) {
+ timeT myTime = el->getViewAbsoluteTime();
+ emit setProgress((myTime - from) * 100 / (to - from));
+ throwIfCancelled();
+ }
+ }
+
+ // NOTATION_DEBUG << "NotationStaff " << this << "::positionElements "
+ // << from << " -> " << to << ": "
+ // << elementsPositioned << " elements positioned, "
+ // << elementsRendered << " re-rendered"
+ // << endl;
+
+ // NotePixmapFactory::dumpStats(std::cerr);
+}
+
+void
+NotationStaff::truncateClefsAndKeysAt(int x)
+{
+ for (FastVector<ClefChange>::iterator i = m_clefChanges.begin();
+ i != m_clefChanges.end(); ++i) {
+ if (i->first >= x) {
+ m_clefChanges.erase(i, m_clefChanges.end());
+ break;
+ }
+ }
+
+ for (FastVector<KeyChange>::iterator i = m_keyChanges.begin();
+ i != m_keyChanges.end(); ++i) {
+ if (i->first >= x) {
+ m_keyChanges.erase(i, m_keyChanges.end());
+ break;
+ }
+ }
+}
+
+NotationElementList::iterator
+NotationStaff::findUnchangedBarStart(timeT from)
+{
+ NotationElementList *nel = (NotationElementList *)getViewElementList();
+
+ // Track back bar-by-bar until we find one whose start position
+ // hasn't changed
+
+ NotationElementList::iterator beginAt = nel->begin();
+ do {
+ from = getSegment().getComposition()->getBarStartForTime(from - 1);
+ beginAt = nel->findTime(from);
+ } while (beginAt != nel->begin() &&
+ (beginAt == nel->end() || !elementNotMoved(static_cast<NotationElement*>(*beginAt))));
+
+ return beginAt;
+}
+
+NotationElementList::iterator
+NotationStaff::findUnchangedBarEnd(timeT to)
+{
+ NotationElementList *nel = (NotationElementList *)getViewElementList();
+
+ // Track forward to the end, similarly. Here however it's very
+ // common for all the positions to have changed right up to the
+ // end of the piece; so we save time by assuming that to be the
+ // case if we get more than (arbitrary) 3 changed bars.
+
+ // We also record the start of the bar following the changed
+ // section, for later use.
+
+ NotationElementList::iterator endAt = nel->end();
+
+ int changedBarCount = 0;
+ NotationElementList::iterator candidate = nel->end();
+ do {
+ candidate = nel->findTime(getSegment().getBarEndForTime(to));
+ if (candidate != nel->end()) {
+ to = (*candidate)->getViewAbsoluteTime();
+ }
+ ++changedBarCount;
+ } while (changedBarCount < 4 &&
+ candidate != nel->end() &&
+ !elementNotMoved(static_cast<NotationElement*>(*candidate)));
+
+ if (changedBarCount < 4)
+ return candidate;
+ else
+ return endAt;
+}
+
+bool
+NotationStaff::elementNotMoved(NotationElement *elt)
+{
+ if (!elt->getCanvasItem())
+ return false;
+
+ LinedStaffCoords coords = getCanvasCoordsForLayoutCoords
+ (elt->getLayoutX(), (int)elt->getLayoutY());
+
+ bool ok =
+ (int)(elt->getCanvasX()) == (int)(coords.first) &&
+ (int)(elt->getCanvasY()) == (int)(coords.second);
+
+ if (!ok) {
+ NOTATION_DEBUG
+ << "elementNotMoved: elt at " << elt->getViewAbsoluteTime() <<
+ ", ok is " << ok << endl;
+ NOTATION_DEBUG << "(cf " << (int)(elt->getCanvasX()) << " vs "
+ << (int)(coords.first) << ", "
+ << (int)(elt->getCanvasY()) << " vs "
+ << (int)(coords.second) << ")" << endl;
+ } else {
+ NOTATION_DEBUG << "elementNotMoved: elt at " << elt->getViewAbsoluteTime()
+ << " is ok" << endl;
+ }
+
+ return ok;
+}
+
+bool
+NotationStaff::elementNotMovedInY(NotationElement *elt)
+{
+ if (!elt->getCanvasItem())
+ return false;
+
+ LinedStaffCoords coords = getCanvasCoordsForLayoutCoords
+ (elt->getLayoutX(), (int)elt->getLayoutY());
+
+ bool ok = (int)(elt->getCanvasY()) == (int)(coords.second);
+
+ // if (!ok) {
+ // NOTATION_DEBUG
+ // << "elementNotMovedInY: elt at " << elt->getAbsoluteTime() <<
+ // ", ok is " << ok << endl;
+ // NOTATION_DEBUG << "(cf " << (int)(elt->getCanvasY()) << " vs "
+ // << (int)(coords.second) << ")" << std::endl;
+ // }
+ return ok;
+}
+
+bool
+NotationStaff::elementShiftedOnly(NotationElementList::iterator i)
+{
+ int shift = 0;
+ bool ok = false;
+
+ for (NotationElementList::iterator j = i;
+ j != getViewElementList()->end(); ++j) {
+
+ NotationElement *elt = static_cast<NotationElement*>(*j);
+ if (!elt->getCanvasItem())
+ break;
+
+ LinedStaffCoords coords = getCanvasCoordsForLayoutCoords
+ (elt->getLayoutX(), (int)elt->getLayoutY());
+
+ // regard any shift in y as suspicious
+ if ((int)(elt->getCanvasY()) != (int)(coords.second))
+ break;
+
+ int myShift = (int)(elt->getCanvasX()) - (int)(coords.first);
+ if (j == i)
+ shift = myShift;
+ else if (myShift != shift)
+ break;
+
+ if (elt->getViewAbsoluteTime() > (*i)->getViewAbsoluteTime()) {
+ // all events up to and including this one have passed
+ ok = true;
+ break;
+ }
+ }
+
+ if (!ok) {
+ NOTATION_DEBUG
+ << "elementShiftedOnly: elt at " << (*i)->getViewAbsoluteTime()
+ << ", ok is " << ok << endl;
+ }
+
+ return ok;
+}
+
+bool
+NotationStaff::isDirectlyPrintable(ViewElement *velt)
+{
+ if (!m_printPainter)
+ return false;
+ return (velt->event()->isa(Note::EventType) ||
+ velt->event()->isa(Note::EventRestType) ||
+ velt->event()->isa(Text::EventType) ||
+ velt->event()->isa(Indication::EventType));
+}
+
+void
+NotationStaff::renderSingleElement(ViewElementList::iterator &vli,
+ const Clef &currentClef,
+ const ::Rosegarden::Key &currentKey,
+ bool selected)
+{
+ const NotationProperties &properties(getProperties());
+ static NotePixmapParameters restParams(Note::Crotchet, 0);
+
+ NotationElement* elt = static_cast<NotationElement*>(*vli);
+
+ bool invisible = false;
+ if (elt->event()->get
+ <Bool>(BaseProperties::INVISIBLE, invisible) && invisible) {
+ if (m_printPainter)
+ return ;
+ KConfig *config = kapp->config();
+ config->setGroup("Notation Options");
+ bool showInvisibles = config->readBoolEntry("showinvisibles", true);
+ if (!showInvisibles)
+ return ;
+ }
+
+ try {
+ m_notePixmapFactory->setNoteStyle
+ (NoteStyleFactory::getStyleForEvent(elt->event()));
+
+ } catch (NoteStyleFactory::StyleUnavailable u) {
+
+ std::cerr << "WARNING: Note style unavailable: "
+ << u.getMessage() << std::endl;
+
+ static bool warned = false;
+ if (!warned) {
+ KMessageBox::error(0, i18n(strtoqstr(u.getMessage())));
+ warned = true;
+ }
+ }
+
+ try {
+
+ QCanvasPixmap *pixmap = 0;
+
+ m_notePixmapFactory->setSelected(selected);
+ m_notePixmapFactory->setShaded(invisible);
+ int z = selected ? 3 : 0;
+
+ // these are actually only used for the printer stuff
+ LinedStaffCoords coords;
+ if (m_printPainter)
+ coords = getCanvasCoordsForLayoutCoords
+ (elt->getLayoutX(), (int)elt->getLayoutY());
+
+ FitPolicy policy = PretendItFittedAllAlong;
+
+ if (elt->isNote()) {
+
+ renderNote(vli);
+
+ } else if (elt->isRest()) {
+
+ bool ignoreRest = false;
+ // NotationHLayout sets this property if it finds the rest
+ // in the middle of a chord -- Quantizer still sometimes gets
+ // this wrong
+ elt->event()->get
+ <Bool>(properties.REST_TOO_SHORT, ignoreRest);
+
+ if (!ignoreRest) {
+
+ Note::Type note = elt->event()->get
+ <Int>(BaseProperties::NOTE_TYPE);
+ int dots = elt->event()->get
+ <Int>(BaseProperties::NOTE_DOTS);
+ restParams.setNoteType(note);
+ restParams.setDots(dots);
+ setTuplingParameters(elt, restParams);
+ restParams.setQuantized(false);
+ bool restOutside = false;
+ elt->event()->get
+ <Bool>(properties.REST_OUTSIDE_STAVE,
+ restOutside);
+ restParams.setRestOutside(restOutside);
+ if (restOutside) {
+ NOTATION_DEBUG << "NotationStaff::renderSingleElement() : rest outside staff" << endl;
+ if (note == Note::DoubleWholeNote) {
+ NOTATION_DEBUG << "NotationStaff::renderSingleElement() : breve rest needs leger lines" << endl;
+ restParams.setLegerLines(5);
+ }
+ }
+
+ if (m_printPainter) {
+ m_notePixmapFactory->drawRest
+ (restParams,
+ *m_printPainter, int(coords.first), coords.second);
+ } else {
+ pixmap = m_notePixmapFactory->makeRestPixmap(restParams);
+ }
+ }
+
+ } else if (elt->event()->isa(Clef::EventType)) {
+
+ pixmap = m_notePixmapFactory->makeClefPixmap
+ (Clef(*elt->event()));
+
+ } else if (elt->event()->isa(::Rosegarden::Key::EventType)) {
+
+ ::Rosegarden::Key key(*elt->event());
+ ::Rosegarden::Key cancelKey = currentKey;
+
+ if (m_keySigCancelMode == 0) { // only when entering C maj / A min
+
+ if (key.getAccidentalCount() != 0)
+ cancelKey = ::Rosegarden::Key();
+
+ } else if (m_keySigCancelMode == 1) { // only when reducing acc count
+
+ if (!(key.isSharp() == cancelKey.isSharp() &&
+ key.getAccidentalCount() < cancelKey.getAccidentalCount())) {
+ cancelKey = ::Rosegarden::Key();
+ }
+ }
+
+ pixmap = m_notePixmapFactory->makeKeyPixmap
+ (key, currentClef, cancelKey);
+
+ } else if (elt->event()->isa(Text::EventType)) {
+
+ policy = MoveBackToFit;
+
+ if (elt->event()->has(Text::TextTypePropertyName) &&
+ elt->event()->get
+ <String>
+ (Text::TextTypePropertyName) ==
+ Text::Annotation &&
+ !m_notationView->areAnnotationsVisible()) {
+
+ // nothing I guess
+
+ }
+ else if (elt->event()->has(Text::TextTypePropertyName) &&
+ elt->event()->get
+ <String>
+ (Text::TextTypePropertyName) ==
+ Text::LilyPondDirective &&
+ !m_notationView->areLilyPondDirectivesVisible()) {
+
+ // nothing here either
+
+ }
+ else {
+
+ try {
+ if (m_printPainter) {
+ Text text(*elt->event());
+ int length = m_notePixmapFactory->getTextWidth(text);
+ for (double w = -1, inc = 0; w != 0; inc += w) {
+ w = setPainterClipping(m_printPainter,
+ elt->getLayoutX(),
+ int(elt->getLayoutY()),
+ int(inc), length, coords,
+ policy);
+ m_notePixmapFactory->drawText
+ (text, *m_printPainter, int(coords.first), coords.second);
+ m_printPainter->restore();
+ }
+ } else {
+ pixmap = m_notePixmapFactory->makeTextPixmap
+ (Text(*elt->event()));
+ }
+ } catch (Exception e) { // Text ctor failed
+ NOTATION_DEBUG << "Bad text event" << endl;
+ }
+ }
+
+ } else if (elt->event()->isa(Indication::EventType)) {
+
+ policy = SplitToFit;
+
+ try {
+ Indication indication(*elt->event());
+
+ timeT indicationDuration = indication.getIndicationDuration();
+ timeT indicationEndTime =
+ elt->getViewAbsoluteTime() + indicationDuration;
+
+ NotationElementList::iterator indicationEnd =
+ getViewElementList()->findTime(indicationEndTime);
+
+ std::string indicationType = indication.getIndicationType();
+
+ int length, y1;
+
+ if ((indicationType == Indication::Slur ||
+ indicationType == Indication::PhrasingSlur) &&
+ indicationEnd != getViewElementList()->begin()) {
+ --indicationEnd;
+ }
+
+ if ((indicationType != Indication::Slur &&
+ indicationType != Indication::PhrasingSlur) &&
+ indicationEnd != getViewElementList()->begin() &&
+ (indicationEnd == getViewElementList()->end() ||
+ indicationEndTime ==
+ getSegment().getBarStartForTime(indicationEndTime))) {
+
+ while (indicationEnd == getViewElementList()->end() ||
+ (*indicationEnd)->getViewAbsoluteTime() >= indicationEndTime)
+ --indicationEnd;
+
+ double x, w;
+ static_cast<NotationElement *>(*indicationEnd)->
+ getLayoutAirspace(x, w);
+ length = (int)(x + w - elt->getLayoutX() -
+ m_notePixmapFactory->getBarMargin());
+
+ } else {
+
+ length = (int)((*indicationEnd)->getLayoutX() -
+ elt->getLayoutX());
+
+ if (indication.isOttavaType()) {
+ length -= m_notePixmapFactory->getNoteBodyWidth();
+ }
+ }
+
+ y1 = (int)(*indicationEnd)->getLayoutY();
+
+ if (length < m_notePixmapFactory->getNoteBodyWidth()) {
+ length = m_notePixmapFactory->getNoteBodyWidth();
+ }
+
+ if (indicationType == Indication::Crescendo ||
+ indicationType == Indication::Decrescendo) {
+
+ if (m_printPainter) {
+ for (double w = -1, inc = 0; w != 0; inc += w) {
+ w = setPainterClipping(m_printPainter,
+ elt->getLayoutX(),
+ int(elt->getLayoutY()),
+ int(inc), length, coords,
+ policy);
+ m_notePixmapFactory->drawHairpin
+ (length, indicationType == Indication::Crescendo,
+ *m_printPainter, int(coords.first), coords.second);
+ m_printPainter->restore();
+ }
+ } else {
+ pixmap = m_notePixmapFactory->makeHairpinPixmap
+ (length, indicationType == Indication::Crescendo);
+ }
+
+ } else if (indicationType == Indication::Slur ||
+ indicationType == Indication::PhrasingSlur) {
+
+ bool above = true;
+ long dy = 0;
+ long length = 10;
+
+ elt->event()->get
+ <Bool>(properties.SLUR_ABOVE, above);
+ elt->event()->get
+ <Int>(properties.SLUR_Y_DELTA, dy);
+ elt->event()->get
+ <Int>(properties.SLUR_LENGTH, length);
+
+ if (m_printPainter) {
+ for (double w = -1, inc = 0; w != 0; inc += w) {
+ w = setPainterClipping(m_printPainter,
+ elt->getLayoutX(),
+ int(elt->getLayoutY()),
+ int(inc), length, coords,
+ policy);
+ m_notePixmapFactory->drawSlur
+ (length, dy, above,
+ indicationType == Indication::PhrasingSlur,
+ *m_printPainter, int(coords.first), coords.second);
+ m_printPainter->restore();
+ }
+ } else {
+ pixmap = m_notePixmapFactory->makeSlurPixmap
+ (length, dy, above,
+ indicationType == Indication::PhrasingSlur);
+ }
+
+ } else {
+
+ int octaves = indication.getOttavaShift();
+
+ if (octaves != 0) {
+ if (m_printPainter) {
+ for (double w = -1, inc = 0; w != 0; inc += w) {
+ w = setPainterClipping(m_printPainter,
+ elt->getLayoutX(),
+ int(elt->getLayoutY()),
+ int(inc), length, coords,
+ policy);
+ m_notePixmapFactory->drawOttava
+ (length, octaves,
+ *m_printPainter, int(coords.first), coords.second);
+ m_printPainter->restore();
+ }
+ } else {
+ pixmap = m_notePixmapFactory->makeOttavaPixmap
+ (length, octaves);
+ }
+ } else {
+
+ NOTATION_DEBUG
+ << "Unrecognised indicationType " << indicationType << endl;
+ if (m_showUnknowns) {
+ pixmap = m_notePixmapFactory->makeUnknownPixmap();
+ }
+ }
+ }
+ } catch (...) {
+ NOTATION_DEBUG << "Bad indication!" << endl;
+ }
+
+ } else if (elt->event()->isa(Controller::EventType)) {
+
+ bool isSustain = false;
+
+ long controlNumber = 0;
+ elt->event()->get
+ <Int>(Controller::NUMBER, controlNumber);
+
+ Studio *studio = &m_notationView->getDocument()->getStudio();
+ Track *track = getSegment().getComposition()->getTrackById
+ (getSegment().getTrack());
+
+ if (track) {
+
+ Instrument *instrument = studio->getInstrumentById
+ (track->getInstrument());
+ if (instrument) {
+ MidiDevice *device = dynamic_cast<MidiDevice *>
+ (instrument->getDevice());
+ if (device) {
+ for (ControlList::const_iterator i =
+ device->getControlParameters().begin();
+ i != device->getControlParameters().end(); ++i) {
+ if (i->getType() == Controller::EventType &&
+ i->getControllerValue() == controlNumber) {
+ if (i->getName() == "Sustain" ||
+ strtoqstr(i->getName()) == i18n("Sustain")) {
+ isSustain = true;
+ }
+ break;
+ }
+ }
+ } else if (instrument->getDevice() &&
+ instrument->getDevice()->getType() == Device::SoftSynth) {
+ if (controlNumber == 64) {
+ isSustain = true;
+ }
+ }
+ }
+ }
+
+ if (isSustain) {
+ long value = 0;
+ elt->event()->get
+ <Int>(Controller::VALUE, value);
+ if (value > 0) {
+ pixmap = m_notePixmapFactory->makePedalDownPixmap();
+ } else {
+ pixmap = m_notePixmapFactory->makePedalUpPixmap();
+ }
+
+ } else {
+
+ if (m_showUnknowns) {
+ pixmap = m_notePixmapFactory->makeUnknownPixmap();
+ }
+ }
+ } else if (elt->event()->isa(Guitar::Chord::EventType)) {
+
+ // Create a guitar chord pixmap
+ try {
+
+ Guitar::Chord chord (*elt->event());
+
+ /* UNUSED - for printing, just use a large pixmap as below
+ if (m_printPainter) {
+
+ int length = m_notePixmapFactory->getTextWidth(text);
+ for (double w = -1, inc = 0; w != 0; inc += w) {
+ w = setPainterClipping(m_printPainter,
+ elt->getLayoutX(),
+ int(elt->getLayoutY()),
+ int(inc), length, coords,
+ policy);
+ m_notePixmapFactory->drawText
+ (text, *m_printPainter, int(coords.first), coords.second);
+ m_printPainter->restore();
+ }
+ } else {
+ */
+
+ pixmap = m_notePixmapFactory->makeGuitarChordPixmap (chord.getFingering(),
+ int(coords.first),
+ coords.second);
+ // }
+ } catch (Exception e) { // GuitarChord ctor failed
+ NOTATION_DEBUG << "Bad guitar chord event" << endl;
+ }
+
+ } else {
+
+ if (m_showUnknowns) {
+ pixmap = m_notePixmapFactory->makeUnknownPixmap();
+ }
+ }
+
+ // Show the result, one way or another
+
+ if (elt->isNote()) {
+
+ // No need, we already set and showed it in renderNote
+
+ } else if (pixmap) {
+
+ setPixmap(elt, pixmap, z, policy);
+
+ } else {
+ elt->removeCanvasItem();
+ }
+
+ // NOTATION_DEBUG << "NotationStaff::renderSingleElement: Setting selected at " << elt->getAbsoluteTime() << " to " << selected << endl;
+
+ } catch (...) {
+ std::cerr << "Event lacks the proper properties: "
+ << std::endl;
+ elt->event()->dump(std::cerr);
+ }
+
+ m_notePixmapFactory->setSelected(false);
+ m_notePixmapFactory->setShaded(false);
+}
+
+double
+NotationStaff::setPainterClipping(QPainter *painter, double lx, int ly,
+ double dx, double w, LinedStaffCoords &coords,
+ FitPolicy policy)
+{
+ painter->save();
+
+ // NOTATION_DEBUG << "NotationStaff::setPainterClipping: lx " << lx << ", dx " << dx << ", w " << w << endl;
+
+ coords = getCanvasCoordsForLayoutCoords(lx + dx, ly);
+ int row = getRowForLayoutX(lx + dx);
+ double rightMargin = getCanvasXForRightOfRow(row);
+ double available = rightMargin - coords.first;
+
+ // NOTATION_DEBUG << "NotationStaff::setPainterClipping: row " << row << ", rightMargin " << rightMargin << ", available " << available << endl;
+
+ switch (policy) {
+
+ case SplitToFit: {
+ bool fit = (w - dx <= available + m_notePixmapFactory->getNoteBodyWidth());
+ if (dx > 0.01 || !fit) {
+ int clipLeft = int(coords.first), clipWidth = int(available);
+ if (dx < 0.01) {
+ // never clip the left side of the first part of something
+ clipWidth += clipLeft;
+ clipLeft = 0;
+ }
+ QRect clip(clipLeft, coords.second - getRowSpacing() / 2,
+ clipWidth, getRowSpacing());
+ painter->setClipRect(clip, QPainter::CoordPainter);
+ coords.first -= dx;
+ }
+ if (fit) {
+ return 0.0;
+ }
+ return available;
+ }
+
+ case MoveBackToFit:
+ if (w - dx > available + m_notePixmapFactory->getNoteBodyWidth()) {
+ coords.first -= (w - dx) - available;
+ }
+ return 0.0;
+
+ default:
+ return 0.0;
+ }
+}
+
+void
+NotationStaff::setPixmap(NotationElement *elt, QCanvasPixmap *pixmap, int z,
+ FitPolicy policy)
+{
+ double layoutX = elt->getLayoutX();
+ int layoutY = (int)elt->getLayoutY();
+
+ elt->removeCanvasItem();
+
+ while (1) {
+
+ LinedStaffCoords coords =
+ getCanvasCoordsForLayoutCoords(layoutX, layoutY);
+
+ double canvasX = coords.first;
+ int canvasY = coords.second;
+
+ QCanvasItem *item = 0;
+
+ if (m_pageMode == LinearMode || policy == PretendItFittedAllAlong) {
+
+ item = new QCanvasNotationSprite(*elt, pixmap, m_canvas);
+
+ } else {
+
+ int row = getRowForLayoutX(layoutX);
+ double rightMargin = getCanvasXForRightOfRow(row);
+ double extent = canvasX + pixmap->width();
+
+ // NOTATION_DEBUG << "NotationStaff::setPixmap: row " << row << ", right margin " << rightMargin << ", extent " << extent << endl;
+
+ if (extent > rightMargin + m_notePixmapFactory->getNoteBodyWidth()) {
+
+ if (policy == SplitToFit) {
+
+ // NOTATION_DEBUG << "splitting at " << (rightMargin-canvasX) << endl;
+
+ std::pair<QPixmap, QPixmap> split =
+ PixmapFunctions::splitPixmap(*pixmap,
+ int(rightMargin - canvasX));
+
+ QCanvasPixmap *leftCanvasPixmap = new QCanvasPixmap
+ (split.first, QPoint(pixmap->offsetX(), pixmap->offsetY()));
+
+ QCanvasPixmap *rightCanvasPixmap = new QCanvasPixmap
+ (split.second, QPoint(0, pixmap->offsetY()));
+
+ item = new QCanvasNotationSprite(*elt, leftCanvasPixmap, m_canvas);
+ item->setZ(z);
+
+ if (elt->getCanvasItem()) {
+ elt->addCanvasItem(item, canvasX, canvasY);
+ } else {
+ elt->setCanvasItem(item, canvasX, canvasY);
+ }
+
+ item->show();
+
+ delete pixmap;
+ pixmap = rightCanvasPixmap;
+
+ layoutX += rightMargin - canvasX + 0.01; // ensure flip to next row
+
+ continue;
+
+ } else { // policy == MoveBackToFit
+
+ item = new QCanvasNotationSprite(*elt, pixmap, m_canvas);
+ elt->setLayoutX(elt->getLayoutX() - (extent - rightMargin));
+ coords = getCanvasCoordsForLayoutCoords(layoutX, layoutY);
+ canvasX = coords.first;
+ }
+ } else {
+ item = new QCanvasNotationSprite(*elt, pixmap, m_canvas);
+ }
+ }
+
+ item->setZ(z);
+ if (elt->getCanvasItem()) {
+ elt->addCanvasItem(item, canvasX, canvasY);
+ } else {
+ elt->setCanvasItem(item, canvasX, canvasY);
+ }
+ item->show();
+ break;
+ }
+}
+
+void
+NotationStaff::renderNote(ViewElementList::iterator &vli)
+{
+ NotationElement* elt = static_cast<NotationElement*>(*vli);
+
+ const NotationProperties &properties(getProperties());
+ static NotePixmapParameters params(Note::Crotchet, 0);
+
+ Note::Type note = elt->event()->get
+ <Int>(BaseProperties::NOTE_TYPE);
+ int dots = elt->event()->get
+ <Int>(BaseProperties::NOTE_DOTS);
+
+ Accidental accidental = Accidentals::NoAccidental;
+ (void)elt->event()->get
+ <String>(properties.DISPLAY_ACCIDENTAL, accidental);
+
+ bool cautionary = false;
+ if (accidental != Accidentals::NoAccidental) {
+ (void)elt->event()->get
+ <Bool>(properties.DISPLAY_ACCIDENTAL_IS_CAUTIONARY,
+ cautionary);
+ }
+
+ bool up = true;
+ // (void)(elt->event()->get<Bool>(properties.STEM_UP, up));
+ (void)(elt->event()->get
+ <Bool>(properties.VIEW_LOCAL_STEM_UP, up));
+
+ bool flag = true;
+ (void)(elt->event()->get
+ <Bool>(properties.DRAW_FLAG, flag));
+
+ bool beamed = false;
+ (void)(elt->event()->get
+ <Bool>(properties.BEAMED, beamed));
+
+ bool shifted = false;
+ (void)(elt->event()->get
+ <Bool>(properties.NOTE_HEAD_SHIFTED, shifted));
+
+ bool dotShifted = false;
+ (void)(elt->event()->get
+ <Bool>(properties.NOTE_DOT_SHIFTED, dotShifted));
+
+ long stemLength = m_notePixmapFactory->getNoteBodyHeight();
+ (void)(elt->event()->get
+ <Int>(properties.UNBEAMED_STEM_LENGTH, stemLength));
+
+ long heightOnStaff = 0;
+ int legerLines = 0;
+
+ (void)(elt->event()->get
+ <Int>(properties.HEIGHT_ON_STAFF, heightOnStaff));
+ if (heightOnStaff < 0) {
+ legerLines = heightOnStaff;
+ } else if (heightOnStaff > 8) {
+ legerLines = heightOnStaff - 8;
+ }
+
+ long slashes = 0;
+ (void)(elt->event()->get
+ <Int>(properties.SLASHES, slashes));
+
+ bool quantized = false;
+ if (m_colourQuantize && !elt->isTuplet()) {
+ quantized =
+ (elt->getViewAbsoluteTime() != elt->event()->getAbsoluteTime() ||
+ elt->getViewDuration() != elt->event()->getDuration());
+ }
+ params.setQuantized(quantized);
+
+ bool trigger = false;
+ if (elt->event()->has(BaseProperties::TRIGGER_SEGMENT_ID))
+ trigger = true;
+ params.setTrigger(trigger);
+
+ bool inRange = true;
+ Pitch p(*elt->event());
+ Segment *segment = &getSegment();
+ if (m_showRanges) {
+ int pitch = p.getPerformancePitch();
+ if (pitch > segment->getHighestPlayable() ||
+ pitch < segment->getLowestPlayable()) {
+ inRange = false;
+ }
+ }
+ params.setInRange(inRange);
+
+ params.setNoteType(note);
+ params.setDots(dots);
+ params.setAccidental(accidental);
+ params.setAccidentalCautionary(cautionary);
+ params.setNoteHeadShifted(shifted);
+ params.setNoteDotShifted(dotShifted);
+ params.setDrawFlag(flag);
+ params.setDrawStem(true);
+ params.setStemGoesUp(up);
+ params.setLegerLines(legerLines);
+ params.setSlashes(slashes);
+ params.setBeamed(false);
+ params.setIsOnLine(heightOnStaff % 2 == 0);
+ params.removeMarks();
+ params.setSafeVertDistance(0);
+
+ bool primary = false;
+ int safeVertDistance = 0;
+
+ if (elt->event()->get
+ <Bool>(properties.CHORD_PRIMARY_NOTE, primary)
+ && primary) {
+
+ long marks = 0;
+ elt->event()->get
+ <Int>(properties.CHORD_MARK_COUNT, marks);
+ if (marks) {
+ NotationChord chord(*getViewElementList(), vli,
+ m_segment.getComposition()->getNotationQuantizer(),
+ properties);
+ params.setMarks(chord.getMarksForChord());
+ }
+
+ // params.setMarks(Marks::getMarks(*elt->event()));
+
+ if (up && note < Note::Semibreve) {
+ safeVertDistance = m_notePixmapFactory->getStemLength();
+ safeVertDistance = std::max(safeVertDistance, int(stemLength));
+ }
+ }
+
+ long tieLength = 0;
+ (void)(elt->event()->get<Int>(properties.TIE_LENGTH, tieLength));
+ if (tieLength > 0) {
+ params.setTied(true);
+ params.setTieLength(tieLength);
+ } else {
+ params.setTied(false);
+ }
+
+ if (elt->event()->has(BaseProperties::TIE_IS_ABOVE)) {
+ params.setTiePosition
+ (true, elt->event()->get<Bool>(BaseProperties::TIE_IS_ABOVE));
+ } else {
+ params.setTiePosition(false, false); // the default
+ }
+
+ long accidentalShift = 0;
+ bool accidentalExtra = false;
+ if (elt->event()->get<Int>(properties.ACCIDENTAL_SHIFT, accidentalShift)) {
+ elt->event()->get<Bool>(properties.ACCIDENTAL_EXTRA_SHIFT, accidentalExtra);
+ }
+ params.setAccidentalShift(accidentalShift);
+ params.setAccExtraShift(accidentalExtra);
+
+ double airX, airWidth;
+ elt->getLayoutAirspace(airX, airWidth);
+ params.setWidth(int(airWidth));
+
+ if (beamed) {
+
+ if (elt->event()->get<Bool>(properties.CHORD_PRIMARY_NOTE, primary)
+ && primary) {
+
+ int myY = elt->event()->get<Int>(properties.BEAM_MY_Y);
+
+ stemLength = myY - (int)elt->getLayoutY();
+ if (stemLength < 0)
+ stemLength = -stemLength;
+
+ int nextBeamCount =
+ elt->event()->get
+ <Int>(properties.BEAM_NEXT_BEAM_COUNT);
+ int width =
+ elt->event()->get
+ <Int>(properties.BEAM_SECTION_WIDTH);
+ int gradient =
+ elt->event()->get
+ <Int>(properties.BEAM_GRADIENT);
+
+ bool thisPartialBeams(false), nextPartialBeams(false);
+ (void)elt->event()->get
+ <Bool>
+ (properties.BEAM_THIS_PART_BEAMS, thisPartialBeams);
+ (void)elt->event()->get
+ <Bool>
+ (properties.BEAM_NEXT_PART_BEAMS, nextPartialBeams);
+
+ params.setBeamed(true);
+ params.setNextBeamCount(nextBeamCount);
+ params.setThisPartialBeams(thisPartialBeams);
+ params.setNextPartialBeams(nextPartialBeams);
+ params.setWidth(width);
+ params.setGradient((double)gradient / 100.0);
+ if (up)
+ safeVertDistance = stemLength;
+
+ }
+ else {
+ params.setBeamed(false);
+ params.setDrawStem(false);
+ }
+ }
+
+ if (heightOnStaff < 7) {
+ int gap = (((7 - heightOnStaff) * m_notePixmapFactory->getLineSpacing()) / 2);
+ if (safeVertDistance < gap)
+ safeVertDistance = gap;
+ }
+
+ params.setStemLength(stemLength);
+ params.setSafeVertDistance(safeVertDistance);
+ setTuplingParameters(elt, params);
+
+ NotePixmapFactory *factory = m_notePixmapFactory;
+
+ if (elt->isGrace()) {
+ // lift this code from elsewhere to fix #1930309, and it seems to work a
+ // treat, as y'all Wrongpondians are wont to say
+ params.setLegerLines(heightOnStaff < 0 ? heightOnStaff :
+ heightOnStaff > 8 ? heightOnStaff - 8 : 0);
+ m_graceNotePixmapFactory->setSelected(m_notePixmapFactory->isSelected());
+ m_graceNotePixmapFactory->setShaded(m_notePixmapFactory->isShaded());
+ factory = m_graceNotePixmapFactory;
+ }
+
+ if (m_printPainter) {
+
+ // Return no canvas item, but instead render straight to
+ // the printer.
+
+ LinedStaffCoords coords = getCanvasCoordsForLayoutCoords
+ (elt->getLayoutX(), (int)elt->getLayoutY());
+
+ // We don't actually know how wide the note drawing will be,
+ // but we should be able to use a fairly pessimistic estimate
+ // without causing any problems
+ int length = tieLength + 10 * m_notePixmapFactory->getNoteBodyWidth();
+
+ for (double w = -1, inc = 0; w != 0; inc += w) {
+
+ w = setPainterClipping(m_printPainter,
+ elt->getLayoutX(),
+ int(elt->getLayoutY()),
+ int(inc), length, coords,
+ SplitToFit);
+
+ factory->drawNote
+ (params, *m_printPainter, int(coords.first), coords.second);
+
+ m_printPainter->restore(); // save() called by setPainterClipping
+ }
+
+ } else {
+
+ // The normal on-screen case
+
+ bool collision = false;
+ QCanvasItem * haloItem = 0;
+ if (m_showCollisions) {
+ collision = elt->isColliding();
+ if (collision) {
+ // Make collision halo
+ QCanvasPixmap *haloPixmap = factory->makeNoteHaloPixmap(params);
+ haloItem = new QCanvasNotationSprite(*elt, haloPixmap, m_canvas);
+ haloItem->setZ(-1);
+ }
+ }
+
+ QCanvasPixmap *pixmap = factory->makeNotePixmap(params);
+
+ int z = 0;
+ if (factory->isSelected())
+ z = 3;
+ else if (quantized)
+ z = 2;
+
+ setPixmap(elt, pixmap, z, SplitToFit);
+
+ if (collision) {
+ // Display collision halo
+ LinedStaffCoords coords =
+ getCanvasCoordsForLayoutCoords(elt->getLayoutX(),
+ elt->getLayoutY());
+ double canvasX = coords.first;
+ int canvasY = coords.second;
+ elt->addCanvasItem(haloItem, canvasX, canvasY);
+ haloItem->show();
+ }
+ }
+}
+
+void
+NotationStaff::setTuplingParameters(NotationElement *elt,
+ NotePixmapParameters &params)
+{
+ const NotationProperties &properties(getProperties());
+
+ params.setTupletCount(0);
+ long tuplingLineY = 0;
+ bool tupled = (elt->event()->get
+ <Int>(properties.TUPLING_LINE_MY_Y, tuplingLineY));
+
+ if (tupled) {
+
+ long tuplingLineWidth = 0;
+ if (!elt->event()->get
+ <Int>(properties.TUPLING_LINE_WIDTH, tuplingLineWidth)) {
+ std::cerr << "WARNING: Tupled event at " << elt->event()->getAbsoluteTime() << " has no tupling line width" << std::endl;
+ }
+
+ long tuplingLineGradient = 0;
+ if (!(elt->event()->get
+ <Int>(properties.TUPLING_LINE_GRADIENT,
+ tuplingLineGradient))) {
+ std::cerr << "WARNING: Tupled event at " << elt->event()->getAbsoluteTime() << " has no tupling line gradient" << std::endl;
+ }
+
+ bool tuplingLineFollowsBeam = false;
+ elt->event()->get
+ <Bool>(properties.TUPLING_LINE_FOLLOWS_BEAM,
+ tuplingLineFollowsBeam);
+
+ long tupletCount;
+ if (elt->event()->get<Int>
+ (BaseProperties::BEAMED_GROUP_UNTUPLED_COUNT, tupletCount)) {
+
+ params.setTupletCount(tupletCount);
+ params.setTuplingLineY(tuplingLineY - (int)elt->getLayoutY());
+ params.setTuplingLineWidth(tuplingLineWidth);
+ params.setTuplingLineGradient(double(tuplingLineGradient) / 100.0);
+ params.setTuplingLineFollowsBeam(tuplingLineFollowsBeam);
+ }
+ }
+}
+
+bool
+NotationStaff::isSelected(NotationElementList::iterator it)
+{
+ const EventSelection *selection =
+ m_notationView->getCurrentSelection();
+ return selection && selection->contains((*it)->event());
+}
+
+void
+NotationStaff::showPreviewNote(double layoutX, int heightOnStaff,
+ const Note &note, bool grace)
+{
+ NotePixmapFactory *npf = m_notePixmapFactory;
+ if (grace) npf = m_graceNotePixmapFactory;
+
+ NotePixmapParameters params(note.getNoteType(), note.getDots());
+ NotationRules rules;
+
+ params.setAccidental(Accidentals::NoAccidental);
+ params.setNoteHeadShifted(false);
+ params.setDrawFlag(true);
+ params.setDrawStem(true);
+ params.setStemGoesUp(rules.isStemUp(heightOnStaff));
+ params.setLegerLines(heightOnStaff < 0 ? heightOnStaff :
+ heightOnStaff > 8 ? heightOnStaff - 8 : 0);
+ params.setBeamed(false);
+ params.setIsOnLine(heightOnStaff % 2 == 0);
+ params.setTied(false);
+ params.setBeamed(false);
+ params.setTupletCount(0);
+ params.setSelected(false);
+ params.setHighlighted(true);
+
+ delete m_previewSprite;
+ m_previewSprite = new QCanvasSimpleSprite
+ (npf->makeNotePixmap(params), m_canvas);
+
+ int layoutY = getLayoutYForHeight(heightOnStaff);
+ LinedStaffCoords coords = getCanvasCoordsForLayoutCoords(layoutX, layoutY);
+
+ m_previewSprite->move(coords.first, (double)coords.second);
+ m_previewSprite->setZ(4);
+ m_previewSprite->show();
+ m_canvas->update();
+}
+
+void
+NotationStaff::clearPreviewNote()
+{
+ delete m_previewSprite;
+ m_previewSprite = 0;
+}
+
+bool
+NotationStaff::wrapEvent(Event *e)
+{
+ bool wrap = true;
+
+ /*!!! always wrap unknowns, just don't necessarily render them?
+
+ if (!m_showUnknowns) {
+ std::string etype = e->getType();
+ if (etype != Note::EventType &&
+ etype != Note::EventRestType &&
+ etype != Clef::EventType &&
+ etype != Key::EventType &&
+ etype != Indication::EventType &&
+ etype != Text::EventType) {
+ wrap = false;
+ }
+ }
+ */
+
+ if (wrap)
+ wrap = Staff::wrapEvent(e);
+
+ return wrap;
+}
+
+void
+NotationStaff::eventRemoved(const Segment *segment,
+ Event *event)
+{
+ LinedStaff::eventRemoved(segment, event);
+ m_notationView->handleEventRemoved(event);
+}
+
+void
+NotationStaff::markChanged(timeT from, timeT to, bool movedOnly)
+{
+ // first time through this, m_ready is false -- we mark it true
+
+ NOTATION_DEBUG << "NotationStaff::markChanged (" << from << " -> " << to << ") " << movedOnly << endl;
+
+ drawStaffName();//!!!
+
+ if (from == to) {
+
+ m_status.clear();
+
+ if (!movedOnly && m_ready) { // undo all the rendering we've already done
+ for (NotationElementList::iterator i = getViewElementList()->begin();
+ i != getViewElementList()->end(); ++i) {
+ static_cast<NotationElement *>(*i)->removeCanvasItem();
+ }
+
+ m_clefChanges.clear();
+ m_keyChanges.clear();
+ }
+
+ drawStaffName();
+
+ } else {
+
+ Segment *segment = &getSegment();
+ Composition *composition = segment->getComposition();
+
+ NotationElementList::iterator unchanged = findUnchangedBarEnd(to);
+
+ int finalBar;
+ if (unchanged == getViewElementList()->end()) {
+ finalBar = composition->getBarNumber(segment->getEndMarkerTime());
+ } else {
+ finalBar = composition->getBarNumber((*unchanged)->getViewAbsoluteTime());
+ }
+
+ int fromBar = composition->getBarNumber(from);
+ int toBar = composition->getBarNumber(to);
+ if (finalBar < toBar)
+ finalBar = toBar;
+
+ for (int bar = fromBar; bar <= finalBar; ++bar) {
+
+ if (bar > toBar)
+ movedOnly = true;
+
+ // NOTATION_DEBUG << "bar " << bar << " status " << m_status[bar] << endl;
+
+ if (bar >= m_lastRenderCheck.first &&
+ bar <= m_lastRenderCheck.second) {
+
+ // NOTATION_DEBUG << "bar " << bar << " rendering and positioning" << endl;
+
+ if (!movedOnly || m_status[bar] == UnRendered) {
+ renderElements
+ (getViewElementList()->findTime(composition->getBarStart(bar)),
+ getViewElementList()->findTime(composition->getBarEnd(bar)));
+ }
+ positionElements(composition->getBarStart(bar),
+ composition->getBarEnd(bar));
+ m_status[bar] = Positioned;
+
+ } else if (!m_ready) {
+ // NOTATION_DEBUG << "bar " << bar << " rendering and positioning" << endl;
+
+ // first time through -- we don't need a separate render phase,
+ // only to mark as not yet positioned
+ m_status[bar] = Rendered;
+
+ } else if (movedOnly) {
+ if (m_status[bar] == Positioned) {
+ // NOTATION_DEBUG << "bar " << bar << " marking unpositioned" << endl;
+ m_status[bar] = Rendered;
+ }
+
+ } else {
+ // NOTATION_DEBUG << "bar " << bar << " marking unrendered" << endl;
+
+ m_status[bar] = UnRendered;
+ }
+ }
+ }
+
+ m_ready = true;
+}
+
+void
+NotationStaff::setPrintPainter(QPainter *painter)
+{
+ m_printPainter = painter;
+}
+
+bool
+NotationStaff::checkRendered(timeT from, timeT to)
+{
+ if (!m_ready)
+ return false;
+ Composition *composition = getSegment().getComposition();
+ if (!composition) {
+ NOTATION_DEBUG << "NotationStaff::checkRendered: warning: segment has no composition -- is my paint event late?" << endl;
+ return false;
+ }
+
+ // NOTATION_DEBUG << "NotationStaff::checkRendered: " << from << " -> " << to << endl;
+
+ int fromBar = composition->getBarNumber(from);
+ int toBar = composition->getBarNumber(to);
+ bool something = false;
+
+ if (fromBar > toBar)
+ std::swap(fromBar, toBar);
+
+ for (int bar = fromBar; bar <= toBar; ++bar) {
+ // NOTATION_DEBUG << "NotationStaff::checkRendered: bar " << bar << " status "
+ // << m_status[bar] << endl;
+
+ switch (m_status[bar]) {
+
+ case UnRendered:
+ renderElements
+ (getViewElementList()->findTime(composition->getBarStart(bar)),
+ getViewElementList()->findTime(composition->getBarEnd(bar)));
+
+ case Rendered:
+ positionElements
+ (composition->getBarStart(bar),
+ composition->getBarEnd(bar));
+ m_lastRenderedBar = bar;
+
+ something = true;
+
+ case Positioned:
+ break;
+ }
+
+ m_status[bar] = Positioned;
+ }
+
+ m_lastRenderCheck = std::pair<int, int>(fromBar, toBar);
+ return something;
+}
+
+bool
+NotationStaff::doRenderWork(timeT from, timeT to)
+{
+ if (!m_ready)
+ return true;
+ Composition *composition = getSegment().getComposition();
+
+ int fromBar = composition->getBarNumber(from);
+ int toBar = composition->getBarNumber(to);
+
+ if (fromBar > toBar)
+ std::swap(fromBar, toBar);
+
+ for (int bar = fromBar; bar <= toBar; ++bar) {
+
+ switch (m_status[bar]) {
+
+ case UnRendered:
+ renderElements
+ (getViewElementList()->findTime(composition->getBarStart(bar)),
+ getViewElementList()->findTime(composition->getBarEnd(bar)));
+ m_status[bar] = Rendered;
+ return true;
+
+ case Rendered:
+ positionElements
+ (composition->getBarStart(bar),
+ composition->getBarEnd(bar));
+ m_status[bar] = Positioned;
+ m_lastRenderedBar = bar;
+ return true;
+
+ case Positioned:
+ // The bars currently displayed are rendered before the others.
+ // Later, when preceding bars are rendered, truncateClefsAndKeysAt()
+ // is called and possible clefs and/or keys from the bars previously
+ // rendered may be lost. Following code should restore these clefs
+ // and keys in m_clefChanges and m_keyChanges lists.
+ if (bar > m_lastRenderedBar)
+ checkAndCompleteClefsAndKeys(bar);
+ continue;
+ }
+ }
+
+ return false;
+}
+
+void
+NotationStaff::checkAndCompleteClefsAndKeys(int bar)
+{
+ // Look for Clef or Key in current bar
+ Composition *composition = getSegment().getComposition();
+ timeT barStartTime = composition->getBarStart(bar);
+ timeT barEndTime = composition->getBarEnd(bar);
+
+ for (ViewElementList::iterator it =
+ getViewElementList()->findTime(barStartTime);
+ (it != getViewElementList()->end())
+ && ((*it)->getViewAbsoluteTime() < barEndTime); ++it) {
+ if ((*it)->event()->isa(Clef::EventType)) {
+ // Clef found
+ Clef clef = *(*it)->event();
+
+ // Is this clef already in m_clefChanges list ?
+ int xClef = int((*it)->getLayoutX());
+ bool found = false;
+ for (int i = 0; i < m_clefChanges.size(); ++i) {
+ if ( (m_clefChanges[i].first == xClef)
+ && (m_clefChanges[i].second == clef)) {
+ found = true;
+ break;
+ }
+ }
+
+ // If not, add it
+ if (!found) {
+ m_clefChanges.push_back(ClefChange(xClef, clef));
+ }
+
+ } else if ((*it)->event()->isa(::Rosegarden::Key::EventType)) {
+ ::Rosegarden::Key key = *(*it)->event();
+
+ // Is this key already in m_keyChanges list ?
+ int xKey = int((*it)->getLayoutX());
+ bool found = false;
+ for (int i = 0; i < m_keyChanges.size(); ++i) {
+ if ( (m_keyChanges[i].first == xKey)
+ && (m_keyChanges[i].second == key)) {
+ found = true;
+ break;
+ }
+ }
+
+ // If not, add it
+ if (!found) {
+ m_keyChanges.push_back(KeyChange(xKey, key));
+ }
+ }
+ }
+}
+
+LinedStaff::BarStyle
+NotationStaff::getBarStyle(int barNo) const
+{
+ const Segment *s = &getSegment();
+ Composition *c = s->getComposition();
+
+ int firstBar = c->getBarNumber(s->getStartTime());
+ int lastNonEmptyBar = c->getBarNumber(s->getEndMarkerTime() - 1);
+
+ // Currently only the first and last bar in a segment have any
+ // possibility of getting special treatment:
+ if (barNo > firstBar && barNo <= lastNonEmptyBar)
+ return PlainBar;
+
+ // First and last bar in a repeating segment get repeat bars.
+
+ if (s->isRepeating()) {
+ if (barNo == firstBar)
+ return RepeatStartBar;
+ else if (barNo == lastNonEmptyBar + 1)
+ return RepeatEndBar;
+ }
+
+ if (barNo <= lastNonEmptyBar)
+ return PlainBar;
+
+ // Last bar on a given track gets heavy double bars. Exploit the
+ // fact that Composition's iterator returns segments in track
+ // order.
+
+ Segment *lastSegmentOnTrack = 0;
+
+ for (Composition::iterator i = c->begin(); i != c->end(); ++i) {
+ if ((*i)->getTrack() == s->getTrack()) {
+ lastSegmentOnTrack = *i;
+ } else if (lastSegmentOnTrack != 0) {
+ break;
+ }
+ }
+
+ if (&getSegment() == lastSegmentOnTrack)
+ return HeavyDoubleBar;
+ else
+ return PlainBar;
+}
+
+double
+NotationStaff::getBarInset(int barNo, bool isFirstBarInRow) const
+{
+ LinedStaff::BarStyle style = getBarStyle(barNo);
+
+ NOTATION_DEBUG << "getBarInset(" << barNo << "," << isFirstBarInRow << ")" << endl;
+
+ if (!(style == RepeatStartBar || style == RepeatBothBar))
+ return 0.0;
+
+ const Segment &s = getSegment();
+ Composition *composition = s.getComposition();
+ timeT barStart = composition->getBarStart(barNo);
+
+ double inset = 0.0;
+
+ NOTATION_DEBUG << "ready" << endl;
+
+ bool haveKey = false, haveClef = false;
+
+ ::Rosegarden::Key key;
+ ::Rosegarden::Key cancelKey;
+ Clef clef;
+
+ for (Segment::iterator i = s.findTime(barStart);
+ s.isBeforeEndMarker(i) && ((*i)->getNotationAbsoluteTime() == barStart);
+ ++i) {
+
+ NOTATION_DEBUG << "type " << (*i)->getType() << " at " << (*i)->getNotationAbsoluteTime() << endl;
+
+ if ((*i)->isa(::Rosegarden::Key::EventType)) {
+
+ try {
+ key = ::Rosegarden::Key(**i);
+
+ if (barNo > composition->getBarNumber(s.getStartTime())) {
+ cancelKey = s.getKeyAtTime(barStart - 1);
+ }
+
+ if (m_keySigCancelMode == 0) { // only when entering C maj / A min
+
+ if (key.getAccidentalCount() != 0)
+ cancelKey = ::Rosegarden::Key();
+
+ } else if (m_keySigCancelMode == 1) { // only when reducing acc count
+
+ if (!(key.isSharp() == cancelKey.isSharp() &&
+ key.getAccidentalCount() < cancelKey.getAccidentalCount())) {
+ cancelKey = ::Rosegarden::Key();
+ }
+ }
+
+ haveKey = true;
+
+ } catch (...) {
+ NOTATION_DEBUG << "getBarInset: Bad key in event" << endl;
+ }
+
+ } else if ((*i)->isa(Clef::EventType)) {
+
+ try {
+ clef = Clef(**i);
+ haveClef = true;
+ } catch (...) {
+ NOTATION_DEBUG << "getBarInset: Bad clef in event" << endl;
+ }
+ }
+ }
+
+ if (isFirstBarInRow) {
+ if (!haveKey) {
+ key = s.getKeyAtTime(barStart);
+ haveKey = true;
+ }
+ if (!haveClef) {
+ clef = s.getClefAtTime(barStart);
+ haveClef = true;
+ }
+ }
+
+ if (haveKey) {
+ inset += m_notePixmapFactory->getKeyWidth(key, cancelKey);
+ }
+ if (haveClef) {
+ inset += m_notePixmapFactory->getClefWidth(clef);
+ }
+ if (haveClef || haveKey) {
+ inset += m_notePixmapFactory->getBarMargin() / 3;
+ }
+ if (haveClef && haveKey) {
+ inset += m_notePixmapFactory->getNoteBodyWidth() / 2;
+ }
+
+ NOTATION_DEBUG << "getBarInset(" << barNo << "," << isFirstBarInRow << "): inset " << inset << endl;
+
+
+ return inset;
+}
+
+Rosegarden::ViewElement* NotationStaff::makeViewElement(Rosegarden::Event* e)
+{
+ return new NotationElement(e);
+}
+
+}
diff --git a/src/gui/editors/notation/NotationStaff.h b/src/gui/editors/notation/NotationStaff.h
new file mode 100644
index 0000000..4a0302c
--- /dev/null
+++ b/src/gui/editors/notation/NotationStaff.h
@@ -0,0 +1,488 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_NOTATIONSTAFF_H_
+#define _RG_NOTATIONSTAFF_H_
+
+#include "base/FastVector.h"
+#include "base/Staff.h"
+#include "base/ViewElement.h"
+#include "gui/general/LinedStaff.h"
+#include "gui/general/ProgressReporter.h"
+#include <map>
+#include <set>
+#include <string>
+#include <utility>
+#include "base/Event.h"
+#include "NotationElement.h"
+
+
+class QPainter;
+class QCanvasPixmap;
+class QCanvasItem;
+class QCanvas;
+class LinedStaffCoords;
+
+
+namespace Rosegarden
+{
+
+class ViewElement;
+class TimeSignature;
+class SnapGrid;
+class Segment;
+class QCanvasSimpleSprite;
+class NotePixmapParameters;
+class NotePixmapFactory;
+class Note;
+class NotationView;
+class NotationProperties;
+class Key;
+class Event;
+class Clef;
+
+
+/**
+ * The Staff is a repository for information about the notation
+ * representation of a single Segment. This includes all of the
+ * NotationElements representing the Events on that Segment, the staff
+ * lines, as well as basic positional and size data. This class
+ * used to be in gui/staff.h, but it's been moved and renamed
+ * following the introduction of the core Staff base class, and
+ * much of the functionality has been extracted into the LinedStaff
+ * base class.
+ */
+
+class NotationStaff : public ProgressReporter, public LinedStaff
+{
+public:
+
+ /**
+ * Creates a new NotationStaff for the specified Segment
+ * \a id is the id of the staff in the NotationView
+ */
+ NotationStaff(QCanvas *, Segment *, SnapGrid *,
+ int id, NotationView *view,
+ std::string fontName, int resolution);
+ virtual ~NotationStaff();
+
+ /**
+ * Changes the resolution of the note pixmap factory and the
+ * staff lines, etc
+ */
+ virtual void changeFont(std::string fontName, int resolution);
+
+ void setLegerLineCount(int legerLineCount) {
+ if (legerLineCount == -1) m_legerLineCount = 8;
+ else m_legerLineCount = legerLineCount;
+ }
+
+ void setBarNumbersEvery(int barNumbersEvery) {
+ m_barNumbersEvery = barNumbersEvery;
+ }
+
+ LinedStaff::setPageMode;
+ LinedStaff::setPageWidth;
+ LinedStaff::setRowsPerPage;
+ LinedStaff::setRowSpacing;
+ LinedStaff::setConnectingLineLength;
+
+ /**
+ * Gets a read-only reference to the pixmap factory used by the
+ * staff. (For use by NotationHLayout, principally.) This
+ * reference isn't const because the NotePixmapFactory maintains
+ * too much state for its methods to be const, but you should
+ * treat the returned reference as if it were const anyway.
+ */
+ virtual NotePixmapFactory& getNotePixmapFactory(bool grace) {
+ return grace ? *m_graceNotePixmapFactory : *m_notePixmapFactory;
+ }
+
+ /**
+ * Generate or re-generate sprites for all the elements between
+ * from and to. Call this when you've just made a change,
+ * specifying the extents of the change in the from and to
+ * parameters.
+ *
+ * This method does not reposition any elements outside the given
+ * range -- so after any edit that may change the visible extents
+ * of a range, you will then need to call positionElements for the
+ * changed range and the entire remainder of the staff.
+ */
+ virtual void renderElements(NotationElementList::iterator from,
+ NotationElementList::iterator to);
+
+
+ /**
+ * Assign suitable coordinates to the elements on the staff,
+ * based entirely on the layout X and Y coordinates they were
+ * given by the horizontal and vertical layout processes.
+ *
+ * This is necessary because the sprites that are being positioned
+ * may have been created either after the layout process completed
+ * (by renderElements) or before (by the previous renderElements
+ * call, if the sprites are unchanged but have moved) -- so
+ * neither the layout nor renderElements can authoritatively set
+ * their final positions.
+ *
+ * This method also updates the selected-ness of any elements it
+ * sees (i.e. it turns the selected ones blue and the unselected
+ * ones black), and re-generates sprites for any elements for
+ * which it seems necessary. In general it will only notice a
+ * element needs regenerating if its position has changed, not if
+ * the nature of the element has changed, so this is no substitute
+ * for calling renderElements.
+ *
+ * The from and to arguments are used to indicate the extents of a
+ * changed area within the staff. The actual area within which the
+ * elements end up being repositioned will begin at the start of
+ * the bar containing the changed area's start, and will end at the
+ * start of the next bar whose first element hasn't moved, after
+ * the changed area's end.
+ *
+ * Call this after renderElements, or after changing the selection,
+ * passing from and to arguments corresponding to the times of those
+ * passed to renderElements.
+ */
+ virtual void positionElements(timeT from,
+ timeT to);
+
+ /**
+ * Re-render and position elements as necessary, based on the
+ * given extents and any information obtained from calls to
+ * markChanged(). This provides a render-on-demand mechanism. If
+ * you are going to use this rendering mechanism, it's generally
+ * wise to avoid explicitly calling
+ * renderElements/positionElements as well.
+ *
+ * Returns true if something needed re-rendering.
+ */
+ virtual bool checkRendered(timeT from,
+ timeT to);
+
+ /**
+ * Find something between the given times that has not yet been
+ * rendered, and render a small amount of it. Return true if it
+ * found something to do. This is to be used as a background work
+ * procedure for rendering not-yet-visible areas of notation.
+ */
+ virtual bool doRenderWork(timeT from,
+ timeT to);
+
+ /**
+ * Mark a region of staff as changed, for use by the on-demand
+ * rendering mechanism. If fromBar == toBar == -1, mark the
+ * entire staff as changed (and recover the memory used for its
+ * elements). Pass movedOnly as true to indicate that elements
+ * have not changed but only been repositioned, for example as a
+ * consequence of a modification on another staff that caused a
+ * relayout.
+ */
+ virtual void markChanged(timeT from = 0,
+ timeT to = 0,
+ bool movedOnly = false);
+
+ /**
+ * Set a painter as the printer output. If this painter is
+ * non-null, subsequent renderElements calls will only render
+ * those elements that cannot be rendered directly to a print
+ * painter; those that can, will be rendered by renderPrintable()
+ * instead.
+ */
+ virtual void setPrintPainter(QPainter *painter);
+
+ /**
+ * Render to the current print painter those elements that can be
+ * rendered directly to a print painter. If no print painter is
+ * set, do nothing.
+ */
+ virtual void renderPrintable(timeT from,
+ timeT to);
+
+ /**
+ * Insert time signature at x-coordinate \a x.
+ */
+ virtual void insertTimeSignature(double layoutX,
+ const TimeSignature &timeSig);
+
+ /**
+ * Delete all time signatures
+ */
+ virtual void deleteTimeSignatures();
+
+ /**
+ * Insert repeated clef and key at start of new line, at x-coordinate \a x.
+ */
+ virtual void insertRepeatedClefAndKey(double layoutX, int barNo);
+
+ /**
+ * Delete all repeated clefs and keys.
+ */
+ virtual void deleteRepeatedClefsAndKeys();
+
+ /**
+ * (Re)draw the staff name from the track's current name
+ */
+ virtual void drawStaffName();
+
+ /**
+ * Return true if the staff name as currently drawn is up-to-date
+ * with that in the composition
+ */
+ virtual bool isStaffNameUpToDate();
+
+ /**
+ * Return the clef and key in force at the given canvas
+ * coordinates
+ */
+ virtual void getClefAndKeyAtCanvasCoords(double x, int y,
+ Clef &clef,
+ ::Rosegarden::Key &key) const;
+
+ /**
+ * Return the note name (C4, Bb3, whatever) corresponding to the
+ * given canvas coordinates
+ */
+ virtual std::string getNoteNameAtCanvasCoords
+ (double x, int y,
+ Accidental accidental =
+ Accidentals::NoAccidental) const;
+
+ /**
+ * Find the NotationElement whose layout x-coord is closest to x,
+ * without regard to its y-coord.
+ *
+ * If notesAndRestsOnly is true, will return the closest note
+ * or rest but will never return any other kind of element.
+ *
+ * If the closest event is further than \a proximityThreshold
+ * horizontally away from x, in pixels, end() is returned.
+ * (If proximityThreshold is negative, there will be no limit
+ * to the distances that will be considered.)
+ *
+ * Also returns the clef and key in force at the given coordinate.
+ */
+ virtual ViewElementList::iterator getClosestElementToLayoutX
+ (double x, Event *&clef, Event *&key,
+ bool notesAndRestsOnly = false,
+ int proximityThreshold = 10);
+
+ /**
+ * Find the NotationElement "under" the given layout x-coord,
+ * without regard to its y-coord.
+ *
+ * Also returns the clef and key in force at the given coordinates.
+ */
+ virtual ViewElementList::iterator getElementUnderLayoutX
+ (double x, Event *&clef, Event *&key);
+
+ /**
+ * Draw a note on the staff to show an insert position prior to
+ * an insert.
+ */
+ virtual void showPreviewNote(double layoutX, int heightOnStaff,
+ const Note &note, bool grace);
+
+ /**
+ * Remove any visible preview note.
+ */
+ virtual void clearPreviewNote();
+
+ /**
+ * Overridden from Staff<T>.
+ * We want to avoid wrapping things like controller events, if
+ * our showUnknowns preference is off
+ */
+ virtual bool wrapEvent(Event *);
+
+ /**
+ * Override from Staff<T>
+ * Let tools know if their current element has gone
+ */
+ virtual void eventRemoved(const Segment *, Event *);
+
+ /**
+ * Return the view-local PropertyName definitions for this staff's view
+ */
+ const NotationProperties &getProperties() const;
+
+ virtual double getBarInset(int barNo, bool isFirstBarInRow) const;
+
+ /**
+ * Return the time at the given canvas coordinates
+ */
+ timeT getTimeAtCanvasCoords(double x, int y) const;
+
+protected:
+
+ virtual ViewElement* makeViewElement(Event*);
+
+ // definition of staff
+ virtual int getLineCount() const { return 5; }
+ virtual int getLegerLineCount() const { return m_legerLineCount; }
+ virtual int getBottomLineHeight() const { return 0; }
+ virtual int getHeightPerLine() const { return 2; }
+ virtual int showBarNumbersEvery() const { return m_barNumbersEvery; }
+
+ virtual BarStyle getBarStyle(int barNo) const;
+
+ /**
+ * Assign a suitable sprite to the given element (the clef is
+ * needed in case it's a key event, in which case we need to judge
+ * the correct pitch for the key)
+ */
+ virtual void renderSingleElement(ViewElementList::iterator &,
+ const Clef &,
+ const ::Rosegarden::Key &,
+ bool selected);
+
+ bool isDirectlyPrintable(ViewElement *elt);
+
+ void setTuplingParameters(NotationElement *, NotePixmapParameters &);
+
+ /**
+ * Set a sprite representing the given note event to the given notation element
+ */
+ virtual void renderNote(ViewElementList::iterator &);
+
+ /**
+ * Return a NotationElementList::iterator pointing to the
+ * start of a bar prior to the given time that doesn't appear
+ * to have been affected by any changes around that time
+ */
+ NotationElementList::iterator findUnchangedBarStart(timeT);
+
+ /**
+ * Return a NotationElementList::iterator pointing to the
+ * end of a bar subsequent to the given time that doesn't appear
+ * to have been affected by any changes around that time
+ */
+ NotationElementList::iterator findUnchangedBarEnd(timeT);
+
+ /**
+ * Return true if the element has a canvas item that is already
+ * at the correct coordinates
+ */
+ virtual bool elementNotMoved(NotationElement *);
+
+ /**
+ * Return true if the element has a canvas item that is already
+ * at the correct y-coordinate
+ */
+ virtual bool elementNotMovedInY(NotationElement *);
+
+ /**
+ * Returns true if the item at the given iterator appears to have
+ * moved horizontally without the spacing around it changing.
+ *
+ * In practice, calculates the offset between the intended layout
+ * and current canvas coordinates of the item at the given
+ * iterator, and returns true if this offset is equal to those of
+ * all other following iterators at the same time as well as the
+ * first iterator found at a greater time.
+ */
+ virtual bool elementShiftedOnly(NotationElementList::iterator);
+
+ enum FitPolicy {
+ PretendItFittedAllAlong = 0,
+ MoveBackToFit,
+ SplitToFit
+ };
+
+ /**
+ * Prepare a painter to draw an object of logical width w at
+ * layout-x coord x, starting at offset dx into the object, by
+ * setting the painter's clipping so as to crop the object at the
+ * right edge of the row if it would otherwise overrun. The
+ * return value is the amount of the object visible on this row
+ * (i.e. the increment in offset for the next call to this method)
+ * or zero if no crop was necessary. The canvas coords at which
+ * the object should subsequently be drawn are returned in coords.
+ *
+ * This function calls painter.save(), and the caller must call
+ * painter.restore() after use.
+ */
+ virtual double setPainterClipping(QPainter *, double layoutX, int layoutY,
+ double dx, double w, LinedStaffCoords &coords,
+ FitPolicy policy);
+
+ /**
+ * Set a single pixmap to a notation element, or split it into
+ * bits if it overruns the end of a row and set the bits
+ * separately.
+ */
+ virtual void setPixmap(NotationElement *, QCanvasPixmap *, int z,
+ FitPolicy policy);
+
+ bool isSelected(NotationElementList::iterator);
+
+ typedef std::set<QCanvasSimpleSprite *> SpriteSet;
+ SpriteSet m_timeSigs;
+
+ typedef std::set<QCanvasItem *> ItemSet;
+ ItemSet m_repeatedClefsAndKeys;
+
+ typedef std::pair<int, Clef> ClefChange;
+ FastVector<ClefChange> m_clefChanges;
+
+ typedef std::pair<int, ::Rosegarden::Key> KeyChange;
+ FastVector<KeyChange> m_keyChanges;
+
+ void truncateClefsAndKeysAt(int);
+
+ /** Verify that a possible Clef or Key in bar is already inserted
+ * in m_clefChange or m_keyChange.
+ * If not, do the insertion.
+ */
+ void checkAndCompleteClefsAndKeys(int bar);
+
+ NotePixmapFactory *m_notePixmapFactory;
+ NotePixmapFactory *m_graceNotePixmapFactory;
+ QCanvasSimpleSprite *m_previewSprite;
+ QCanvasSimpleSprite *m_staffName;
+ std::string m_staffNameText;
+ NotationView *m_notationView;
+ int m_legerLineCount;
+ int m_barNumbersEvery;
+ bool m_colourQuantize;
+ bool m_showUnknowns;
+ bool m_showRanges;
+ bool m_showCollisions;
+ int m_keySigCancelMode;
+
+ QPainter *m_printPainter;
+
+ enum BarStatus { UnRendered = 0, Rendered, Positioned };
+ typedef std::map<int, BarStatus> BarStatusMap;
+ BarStatusMap m_status;
+ std::pair<int, int> m_lastRenderCheck;
+ bool m_ready;
+
+ int m_lastRenderedBar;
+};
+
+
+}
+
+#endif
diff --git a/src/gui/editors/notation/NotationStrings.cpp b/src/gui/editors/notation/NotationStrings.cpp
new file mode 100644
index 0000000..6f8defd
--- /dev/null
+++ b/src/gui/editors/notation/NotationStrings.cpp
@@ -0,0 +1,301 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "NotationStrings.h"
+#include <kapplication.h>
+
+#include <klocale.h>
+#include "misc/Strings.h"
+#include "document/ConfigGroups.h"
+#include "base/Exception.h"
+#include "base/NotationTypes.h"
+#include "gui/configuration/GeneralConfigurationPage.h"
+#include <kconfig.h>
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+QString
+NotationStrings::addDots(QString s, int dots,
+ bool hyphenate, bool internationalize)
+{
+ if (!dots)
+ return s;
+
+ if (internationalize) {
+ if (dots > 1) {
+ if (hyphenate)
+ return i18n("%1-dotted-%2").arg(dots).arg(s);
+ else
+ return i18n("%1-dotted %2").arg(dots).arg(s);
+ } else {
+ if (hyphenate)
+ return i18n("dotted-%1").arg(s);
+ else
+ return i18n("dotted %1").arg(s);
+ }
+ } else {
+ if (dots > 1) {
+ if (hyphenate)
+ return QString("%1-dotted-%2").arg(dots).arg(s);
+ else
+ return QString("%1-dotted %2").arg(dots).arg(s);
+ } else {
+ if (hyphenate)
+ return QString("dotted-%1").arg(s);
+ else
+ return QString("dotted %1").arg(s);
+ }
+ }
+}
+
+QString
+NotationStrings::getNoteName(Note note, bool plural, bool triplet)
+{
+ Note::Type type = note.getNoteType();
+ int dots = note.getDots();
+
+ static const QString names[] = {
+ i18n("sixty-fourth note"), i18n("thirty-second note"),
+ i18n("sixteenth note"), i18n("eighth note"),
+ i18n("quarter note"), i18n("half note"),
+ i18n("whole note"), i18n("double whole note")
+ };
+ static const QString pluralnames[] = {
+ i18n("sixty-fourth notes"), i18n("thirty-second notes"),
+ i18n("sixteenth notes"), i18n("eighth notes"),
+ i18n("quarter notes"), i18n("half notes"),
+ i18n("whole notes"), i18n("double whole notes")
+ };
+
+ if (plural && triplet) {
+ return addDots(i18n("%1 triplets").arg(names[type]), dots, false, true); // TODO PLURAL - this is broken because it assumes there's only 1 plural form
+ } else if (plural) {
+ return addDots(pluralnames[type], dots, false, true);
+ } else if (triplet) {
+ return addDots(i18n("%1 triplet").arg(names[type]), dots, false, true);
+ } else {
+ return addDots(names[type], dots, false, true);
+ }
+}
+
+QString
+NotationStrings::getAmericanName(Note note, bool plural, bool triplet)
+{
+ Note::Type type = note.getNoteType();
+ int dots = note.getDots();
+
+ static const QString names[] = {
+ "sixty-fourth note", "thirty-second note",
+ "sixteenth note", "eighth note",
+ "quarter note", "half note",
+ "whole note", "double whole note"
+ };
+ static const QString pluralnames[] = {
+ "sixty-fourth notes", "thirty-second notes",
+ "sixteenth notes", "eighth notes",
+ "quarter notes", "half notes",
+ "whole notes", "double whole notes"
+ };
+
+ if (plural && triplet) {
+ return addDots(QString("%1 triplets").arg(names[type]), dots, false, false);
+ } else if (plural) {
+ return addDots(pluralnames[type], dots, false, false);
+ } else if (triplet) {
+ return addDots(QString("%1 triplet").arg(names[type]), dots, false, false);
+ } else {
+ return addDots(names[type], dots, false, false);
+ }
+}
+
+QString
+NotationStrings::getShortNoteName(Note note, bool plural, bool triplet)
+{
+ Note::Type type = note.getNoteType();
+ int dots = note.getDots();
+
+ static const QString names[] = {
+ i18n("64th"), i18n("32nd"), i18n("16th"), i18n("8th"),
+ i18n("quarter"), i18n("half"), i18n("whole"),
+ i18n("double whole")
+ };
+ static const QString pluralnames[] = {
+ i18n("64ths"), i18n("32nds"), i18n("16ths"), i18n("8ths"),
+ i18n("quarters"), i18n("halves"), i18n("wholes"),
+ i18n("double wholes")
+ };
+
+ if (plural && triplet) {
+ return addDots(i18n("%1 triplets").arg(names[type]), dots, false, true); // TODO - this is broken because it assumes there's only 1 plural form
+ } else if (plural) {
+ return addDots(pluralnames[type], dots, false, true);
+ } else if (triplet) {
+ return addDots(i18n("%1 triplet").arg(names[type]), dots, false, true);
+ } else {
+ return addDots(names[type], dots, false, true);
+ }
+}
+
+QString
+NotationStrings::getReferenceName(Note note, bool isRest)
+{
+ Note::Type type = note.getNoteType();
+ int dots = note.getDots();
+
+ static const QString names[] = {
+ "hemidemisemi", "demisemi", "semiquaver",
+ "quaver", "crotchet", "minim", "semibreve", "breve"
+ };
+
+ QString name(names[type]);
+ if (isRest)
+ name = "rest-" + name;
+ return addDots(name, dots, true, false);
+}
+
+Note
+NotationStrings::getNoteForName(QString name)
+{
+ std::string origName(qstrtostr(name));
+ int pos = name.find('-');
+ int dots = 0;
+
+ if (pos > 0 && pos < 6 && pos < int(name.length()) - 1) {
+ dots = name.left(pos).toInt();
+ name = name.right(name.length() - pos - 1);
+ if (dots < 2) {
+ throw MalformedNoteName("Non-numeric or invalid dot count in \"" +
+ origName + "\"");
+ }
+ }
+
+ if (name.length() > 7 &&
+ (name.left(7) == "dotted " || name.left(7) == "dotted-")) {
+ if (dots == 0)
+ dots = 1;
+ name = name.right(name.length() - 7);
+ } else {
+ if (dots > 1) {
+ throw MalformedNoteName("Dot count without dotted tag in \"" +
+ origName + "\"");
+ }
+ }
+
+ if (name.length() > 5 && name.right(5) == " note") {
+ name = name.left(name.length() - 5);
+ }
+
+ Note::Type type;
+
+ static const char *names[][4] = {
+ { "64th", "sixty-fourth", "hemidemisemi", "hemidemisemiquaver"
+ },
+ { "32nd", "thirty-second", "demisemi", "demisemiquaver" },
+ { "16th", "sixteenth", "semi", "semiquaver" },
+ { "8th", "eighth", 0, "quaver" },
+ { "quarter", 0, 0, "crotchet", },
+ { "half", 0, 0, "minim" },
+ { "whole", 0, 0, "semibreve" },
+ { "double whole", 0, 0, "breve" }
+ };
+
+ for (type = Note::Shortest; type <= Note::Longest; ++type) {
+ for (int i = 0; i < 4; ++i) {
+ if (!names[type][i])
+ continue;
+ if (name == names[type][i])
+ return Note(type, dots);
+ }
+ }
+
+ throw MalformedNoteName("Can't parse note name \"" + origName + "\"");
+}
+
+QString
+NotationStrings::makeNoteMenuLabel(timeT duration,
+ bool brief,
+ timeT &errorReturn,
+ bool plural)
+{
+ Note nearestNote = Note::getNearestNote(duration);
+ bool triplet = false;
+ errorReturn = 0;
+
+ if (duration == 0)
+ return "0";
+
+ if (nearestNote.getDuration() != duration) {
+ Note tripletNote = Note::getNearestNote(duration * 3 / 2);
+ if (tripletNote.getDuration() == duration * 3 / 2) {
+ nearestNote = tripletNote;
+ triplet = true;
+ } else {
+ errorReturn = duration - nearestNote.getDuration();
+ duration = nearestNote.getDuration();
+ }
+ }
+
+ KConfig *config = kapp->config();
+ config->setGroup(GeneralOptionsConfigGroup);
+ GeneralConfigurationPage::NoteNameStyle noteNameStyle =
+ (GeneralConfigurationPage::NoteNameStyle)
+ config->readUnsignedNumEntry
+ ("notenamestyle", GeneralConfigurationPage::Local);
+
+ if (brief) {
+
+ timeT wholeNote = Note(Note::Semibreve).getDuration();
+ if ((wholeNote / duration) * duration == wholeNote) {
+ return QString("1/%1").arg(wholeNote / duration);
+ } else if ((duration / wholeNote) * wholeNote == duration) {
+ return QString("%1/1").arg(duration / wholeNote);
+ } else {
+ return i18n("%1 ticks").arg(duration);
+ plural = false;
+ }
+
+ } else {
+ QString noteName;
+
+ switch (noteNameStyle) {
+
+ case GeneralConfigurationPage::American:
+ noteName = getAmericanName(nearestNote, plural, triplet);
+ break;
+
+ case GeneralConfigurationPage::Local:
+ noteName = getNoteName(nearestNote, plural, triplet);
+ break;
+ }
+
+ // Already internationalised, if appropriate
+ return noteName;
+ }
+}
+
+}
diff --git a/src/gui/editors/notation/NotationStrings.h b/src/gui/editors/notation/NotationStrings.h
new file mode 100644
index 0000000..d79dff3
--- /dev/null
+++ b/src/gui/editors/notation/NotationStrings.h
@@ -0,0 +1,121 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_NOTATIONSTRINGS_H_
+#define _RG_NOTATIONSTRINGS_H_
+
+#include "base/Exception.h"
+#include "base/NotationTypes.h"
+#include <qstring.h>
+#include "base/Event.h"
+
+
+
+
+namespace Rosegarden
+{
+
+
+
+/**
+ * String factory for note names, etc. used in the GUI
+ * Replaces use of base/NotationTypes.h strings which should
+ * be used only for non-user purposes.
+ */
+class NotationStrings
+{
+public:
+ NotationStrings();
+ ~NotationStrings();
+
+
+ /**
+ * Get the name of a note. The default return values are American
+ * (e.g. quarter note, dotted sixteenth note). If the app is
+ * internationalised, you will get return names local to your
+ * region. Note that this includes English note names- set your
+ * LC_LANG to en_GB.
+ */
+ static QString getNoteName(Note note,
+ bool plural = false, bool triplet = false);
+
+ /**
+ * Get the UNTRANSLATED American name of a note. This may be
+ * useful if the user has specified that they'd prefer American
+ * names to local names.
+ */
+ static QString getAmericanName(Note note,
+ bool plural = false, bool triplet = false);
+
+ /**
+ * Get the short name of a note. The default return values are
+ * American (e.g. quarter, dotted 16th). If the app is
+ * internationalised, you will get return names local to your
+ * region. Note that this includes English note names- set your
+ * LC_LANG to en_GB.
+ */
+ static QString getShortNoteName(Note note,
+ bool plural = false, bool triplet = false);
+
+
+ /**
+ * Get the UNTRANSLATED reference name of a note or rest. This is the
+ * formal name used to name pixmap files and the like, so the exact
+ * values of these strings are pretty sensitive.
+ */
+ static QString getReferenceName(Note note, bool isRest = false);
+
+ typedef Exception MalformedNoteName;
+
+ /**
+ * Get the note corresponding to the given string, which must be a
+ * reference name or an untranslated British, American or short name.
+ * May throw MalformedNoteName.
+ */
+ static Note getNoteForName(QString name);
+
+ /**
+ * Construct a label to describe the given duration as a note name in
+ * the proper locale. Uses the nearest available note to the duration
+ * and returns a non-zero value in errorReturn if it was not an exact
+ * match for the required duration.
+ */
+ static QString makeNoteMenuLabel(timeT duration,
+ bool brief,
+ timeT &errorReturn,
+ bool plural = false);
+
+private:
+ /**
+ * Return a string representing the dotted version of the input str.
+ */
+ static QString addDots(QString s, int dots,
+ bool hyphenate, bool internationalize);
+
+};
+
+}
+
+#endif
diff --git a/src/gui/editors/notation/NotationTool.cpp b/src/gui/editors/notation/NotationTool.cpp
new file mode 100644
index 0000000..8e82107
--- /dev/null
+++ b/src/gui/editors/notation/NotationTool.cpp
@@ -0,0 +1,57 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "NotationTool.h"
+#include "misc/Debug.h"
+
+#include "gui/general/EditTool.h"
+#include "NotationView.h"
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+NotationTool::NotationTool(const QString& menuName, NotationView* view)
+ : EditTool(menuName, view),
+ m_nParentView(view)
+{}
+
+NotationTool::~NotationTool()
+{
+ NOTATION_DEBUG << "NotationTool::~NotationTool()" << endl;
+
+ // delete m_menu;
+ // m_parentView->factory()->removeClient(this);
+ // m_instance = 0;
+}
+
+void NotationTool::ready()
+{
+ m_nParentView->setCanvasCursor(Qt::arrowCursor);
+ m_nParentView->setHeightTracking(false);
+}
+
+}
diff --git a/src/gui/editors/notation/NotationTool.h b/src/gui/editors/notation/NotationTool.h
new file mode 100644
index 0000000..ab1020a
--- /dev/null
+++ b/src/gui/editors/notation/NotationTool.h
@@ -0,0 +1,93 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_NOTATIONTOOL_H_
+#define _RG_NOTATIONTOOL_H_
+
+#include "gui/general/EditTool.h"
+
+
+class QString;
+
+
+namespace Rosegarden
+{
+
+class NotationView;
+
+
+/**
+ * Notation tool base class.
+ *
+ * A NotationTool represents one of the items on the notation toolbars
+ * (notes, rests, clefs, eraser, etc...). It handle mouse click events
+ * for the NotationView ('State' design pattern).
+ *
+ * A NotationTool can have a menu, normally activated through a right
+ * mouse button click. This menu is defined in an XML file, see
+ * NoteInserter and noteinserter.rc for an example.
+ *
+ * This class is a "semi-singleton", that is, only one instance per
+ * NotationView window is created. This is because menu creation is
+ * slow, and the fact that a tool can trigger the setting of another
+ * tool through a menu choice). This is maintained with the
+ * NotationToolBox class This means we can't rely on the ctor/dtor to
+ * perform setting up, like mouse cursor changes for instance. Use the
+ * ready() and stow() method for this.
+ *
+ * @see NotationView#setTool()
+ * @see NotationToolBox
+ */
+class NotationTool : public EditTool
+{
+ friend class NotationToolBox;
+
+public:
+ virtual ~NotationTool();
+
+ /**
+ * Is called by NotationView when the tool is set as current
+ * Add any setup here
+ */
+ virtual void ready();
+
+protected:
+ /**
+ * Create a new NotationTool
+ *
+ * \a menuName : the name of the menu defined in the XML rc file
+ */
+ NotationTool(const QString& menuName, NotationView*);
+
+ //--------------- Data members ---------------------------------
+
+ NotationView* m_nParentView;
+};
+
+
+
+}
+
+#endif
diff --git a/src/gui/editors/notation/NotationToolBox.cpp b/src/gui/editors/notation/NotationToolBox.cpp
new file mode 100644
index 0000000..769bcaf
--- /dev/null
+++ b/src/gui/editors/notation/NotationToolBox.cpp
@@ -0,0 +1,102 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "NotationToolBox.h"
+
+#include "gui/general/EditToolBox.h"
+#include "gui/general/EditTool.h"
+#include "NotationView.h"
+#include "NoteInserter.h"
+#include "RestInserter.h"
+#include "ClefInserter.h"
+#include "TextInserter.h"
+#include "GuitarChordInserter.h"
+#include "NotationEraser.h"
+#include "NotationSelector.h"
+
+#include <qstring.h>
+#include <kmessagebox.h>
+
+namespace Rosegarden
+{
+
+NotationToolBox::NotationToolBox(NotationView *parent)
+ : EditToolBox(parent),
+ m_nParentView(parent)
+{
+ //m_tools.setAutoDelete(true);
+}
+
+EditTool* NotationToolBox::createTool(const QString& toolName)
+{
+ NotationTool* tool = 0;
+
+ QString toolNamelc = toolName.lower();
+
+ if (toolNamelc == NoteInserter::ToolName)
+
+ tool = new NoteInserter(m_nParentView);
+
+ else if (toolNamelc == RestInserter::ToolName)
+
+ tool = new RestInserter(m_nParentView);
+
+ else if (toolNamelc == ClefInserter::ToolName)
+
+ tool = new ClefInserter(m_nParentView);
+
+ else if (toolNamelc == TextInserter::ToolName)
+
+ tool = new TextInserter(m_nParentView);
+
+ else if (toolNamelc == GuitarChordInserter::ToolName)
+
+ tool = new GuitarChordInserter(m_nParentView);
+
+/* else if (toolNamelc == LilyPondDirectiveInserter::ToolName)
+
+ tool = new LilyPondDirectiveInserter(m_nParentView);*/
+
+ else if (toolNamelc == NotationEraser::ToolName)
+
+ tool = new NotationEraser(m_nParentView);
+
+ else if (toolNamelc == NotationSelector::ToolName)
+
+ tool = new NotationSelector(m_nParentView);
+
+ else {
+ KMessageBox::error(0, QString("NotationToolBox::createTool : unrecognised toolname %1 (%2)")
+ .arg(toolName).arg(toolNamelc));
+ return 0;
+ }
+
+ m_tools.insert(toolName, tool);
+
+ return tool;
+}
+
+}
+#include "NotationToolBox.moc"
diff --git a/src/gui/editors/notation/NotationToolBox.h b/src/gui/editors/notation/NotationToolBox.h
new file mode 100644
index 0000000..48b1202
--- /dev/null
+++ b/src/gui/editors/notation/NotationToolBox.h
@@ -0,0 +1,65 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_NOTATIONTOOLBOX_H_
+#define _RG_NOTATIONTOOLBOX_H_
+
+#include "gui/general/EditToolBox.h"
+
+
+class QString;
+
+
+namespace Rosegarden
+{
+
+class NotationView;
+class EditTool;
+
+
+/**
+ * NotationToolBox : maintains a single instance of each registered tool
+ *
+ * Tools are fetched from a name
+ */
+class NotationToolBox : public EditToolBox
+{
+ Q_OBJECT
+public:
+ NotationToolBox(NotationView* parent);
+
+protected:
+ virtual EditTool* createTool(const QString& toolName);
+
+ //--------------- Data members ---------------------------------
+
+ NotationView* m_nParentView;
+};
+
+
+
+}
+
+#endif
diff --git a/src/gui/editors/notation/NotationVLayout.cpp b/src/gui/editors/notation/NotationVLayout.cpp
new file mode 100644
index 0000000..c746a30
--- /dev/null
+++ b/src/gui/editors/notation/NotationVLayout.cpp
@@ -0,0 +1,731 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include <cmath>
+#include "NotationVLayout.h"
+#include "misc/Debug.h"
+
+#include <klocale.h>
+#include "base/Composition.h"
+#include "base/Event.h"
+#include "base/LayoutEngine.h"
+#include "base/NotationRules.h"
+#include "base/NotationTypes.h"
+#include "base/NotationQuantizer.h"
+#include "base/Staff.h"
+#include "gui/general/ProgressReporter.h"
+#include "gui/editors/guitar/Chord.h"
+#include "NotationChord.h"
+#include "NotationElement.h"
+#include "NotationProperties.h"
+#include "NotationStaff.h"
+#include "NotePixmapFactory.h"
+#include <kmessagebox.h>
+#include <qobject.h>
+#include <qstring.h>
+#include <qwidget.h>
+
+
+namespace Rosegarden
+{
+
+using namespace BaseProperties;
+
+
+NotationVLayout::NotationVLayout(Composition *c, NotePixmapFactory *npf,
+ const NotationProperties &properties,
+ QObject* parent, const char* name) :
+ ProgressReporter(parent, name),
+ m_composition(c),
+ m_npf(npf),
+ m_notationQuantizer(c->getNotationQuantizer()),
+ m_properties(properties)
+{
+ // empty
+}
+
+NotationVLayout::~NotationVLayout()
+{
+ // empty
+}
+
+NotationVLayout::SlurList &
+
+NotationVLayout::getSlurList(Staff &staff)
+{
+ SlurListMap::iterator i = m_slurs.find(&staff);
+ if (i == m_slurs.end()) {
+ m_slurs[&staff] = SlurList();
+ }
+
+ return m_slurs[&staff];
+}
+
+void
+NotationVLayout::reset()
+{
+ m_slurs.clear();
+}
+
+void
+NotationVLayout::resetStaff(Staff &staff, timeT, timeT)
+{
+ getSlurList(staff).clear();
+}
+
+void
+NotationVLayout::scanStaff(Staff &staffBase, timeT, timeT)
+{
+ START_TIMING;
+
+ NotationStaff &staff = dynamic_cast<NotationStaff &>(staffBase);
+ NotationElementList *notes = staff.getViewElementList();
+
+ NotationElementList::iterator from = notes->begin();
+ NotationElementList::iterator to = notes->end();
+ NotationElementList::iterator i;
+
+ for (i = from; i != to; ++i) {
+
+ NotationElement *el = static_cast<NotationElement*>(*i);
+
+ // Displaced Y will only be used for certain events -- in
+ // particular not for notes, whose y-coord is obviously kind
+ // of meaningful.
+ double displacedY = 0.0;
+ long dyRaw = 0;
+ el->event()->get<Int>(DISPLACED_Y, dyRaw);
+ displacedY = double(dyRaw * m_npf->getLineSpacing()) / 1000.0;
+
+ el->setLayoutY(staff.getLayoutYForHeight( -9) + displacedY);
+
+ if (el->isRest()) {
+
+ // rests for notes longer than the minim have hotspots
+ // aligned with the line above the middle line; the rest
+ // are aligned with the middle line
+
+ long noteType;
+ bool hasNoteType = el->event()->get
+ <Int>(NOTE_TYPE, noteType);
+ if (hasNoteType && noteType > Note::Minim) {
+ el->setLayoutY(staff.getLayoutYForHeight(6) + displacedY);
+ } else {
+ el->setLayoutY(staff.getLayoutYForHeight(4) + displacedY);
+ }
+
+ // Fix for bug 1090767 Rests outside staves have wrong glyphs
+ // by William <rosegarden4c AT orthoset.com>
+ // We use a "rest-outside-stave" glyph for any minim/semibreve/breve
+ // rest that has been displaced vertically e.g. by fine-positioning
+ // outside the stave. For small vertical displacements that keep
+ // the rest inside the stave, we use the "rest-inside-stave" glyph
+ // and also discretise the displacement into multiples of the
+ // stave-line spacing. The outside-stave glyphs match the character
+ // numbers 1D13A, 1D13B and 1D13C in the Unicode 4.0 standard.
+
+ if (hasNoteType && (displacedY > 0.1 || displacedY < -0.1)) {
+
+ // a fiddly check for transition from inside to outside:
+
+ int min = -1, max = 1;
+
+ switch (noteType) {
+ case Note::Breve:
+ min = -1;
+ max = 2;
+ break;
+ case Note::Semibreve:
+ min = -1;
+ max = 3;
+ break;
+ case Note::Minim:
+ min = -2;
+ max = 2;
+ break;
+ case Note::Crotchet:
+ min = -1;
+ max = 3;
+ break;
+ case Note::Quaver:
+ min = -2;
+ max = 3;
+ break;
+ case Note::Semiquaver:
+ min = -3;
+ max = 3;
+ break;
+ case Note::Demisemiquaver:
+ min = -3;
+ max = 4;
+ break;
+ case Note::Hemidemisemiquaver:
+ min = -4;
+ max = 4;
+ break;
+ }
+
+ bool outside = false;
+
+ if (noteType == Note::Breve) {
+ if (nearbyint(displacedY) < min * m_npf->getLineSpacing() ||
+ nearbyint(displacedY) > max * m_npf->getLineSpacing()) {
+ outside = true;
+ }
+ } else {
+ if ((int)displacedY < min * m_npf->getLineSpacing() ||
+ (int)displacedY > max * m_npf->getLineSpacing()) {
+ outside = true;
+ }
+ }
+
+ el->event()->setMaybe<Bool>(m_properties.REST_OUTSIDE_STAVE,
+ outside);
+
+ if (!outside) {
+ displacedY = (double)m_npf->getLineSpacing() *
+ (int(nearbyint((double)displacedY /
+ m_npf->getLineSpacing())));
+ if (noteType > Note::Minim)
+ el->setLayoutY(staff.getLayoutYForHeight(6) + displacedY);
+ else
+ el->setLayoutY(staff.getLayoutYForHeight(4) + displacedY);
+ }
+
+ // if (displacedY != 0.0)
+ // NOTATION_DEBUG << "REST_OUTSIDE_STAVE AFTER "
+ // << " : displacedY : " << displacedY
+ // << " line-spacing : " << m_npf->getLineSpacing()
+ // << " time : " << (el->getViewAbsoluteTime())
+ // << endl;
+ } else {
+ el->event()->setMaybe<Bool>(m_properties.REST_OUTSIDE_STAVE,
+ false);
+ }
+
+ } else if (el->isNote()) {
+
+ NotationChord chord(*notes, i, m_notationQuantizer, m_properties);
+ if (chord.size() == 0)
+ continue;
+
+ std::vector<int> h;
+ for (unsigned int j = 0; j < chord.size(); ++j) {
+ long height = 0;
+ if (!(*chord[j])->event()->get
+ <Int>
+ (m_properties.HEIGHT_ON_STAFF, height)) {
+ std::cerr << QString("ERROR: Event in chord at %1 has no HEIGHT_ON_STAFF property!\nThis is a bug (the program would previously have crashed by now)").arg((*chord[j])->getViewAbsoluteTime()) << std::endl;
+ (*chord[j])->event()->dump(std::cerr);
+ }
+ h.push_back(height);
+ }
+ bool stemmed = chord.hasStem();
+ bool stemUp = chord.hasStemUp();
+ bool hasNoteHeadShifted = chord.hasNoteHeadShifted();
+
+ unsigned int flaggedNote = (stemUp ? chord.size() - 1 : 0);
+
+ bool hasShifted = chord.hasNoteHeadShifted();
+
+ double y0 = -1E50; // A very unlikely Y layout value
+
+ for (unsigned int j = 0; j < chord.size(); ++j) {
+
+ el = static_cast<NotationElement*>(*chord[j]);
+ el->setLayoutY(staff.getLayoutYForHeight(h[j]));
+
+ // Look for collision
+ const double eps = 0.001;
+ Event *eel = el->event();
+ double y = el->getLayoutY();
+ if (eel->has("pitch")) {
+ el->setIsColliding(fabs(y - y0) < eps);
+ y0 = y;
+ }
+
+
+ // These calculations and assignments are pretty much final
+ // if the chord is not in a beamed group, but if it is then
+ // they will be reworked by NotationGroup::applyBeam, which
+ // is called from NotationHLayout::layout, which is called
+ // after this. Any inaccuracies here for beamed groups
+ // should be stamped out there.
+
+ // el->event()->setMaybe<Bool>(STEM_UP, stemUp);
+ el->event()->setMaybe<Bool>(m_properties.VIEW_LOCAL_STEM_UP, stemUp);
+
+ bool primary =
+ ((stemmed && stemUp) ? (j == 0) : (j == chord.size() - 1));
+ el->event()->setMaybe<Bool>
+ (m_properties.CHORD_PRIMARY_NOTE, primary);
+
+ if (primary) {
+ el->event()->setMaybe<Int>
+ (m_properties.CHORD_MARK_COUNT, chord.getMarkCountForChord());
+ }
+
+ bool shifted = chord.isNoteHeadShifted(chord[j]);
+ el->event()->setMaybe<Bool>
+ (m_properties.NOTE_HEAD_SHIFTED, shifted);
+
+ el->event()->setMaybe<Bool>
+ (m_properties.NOTE_DOT_SHIFTED, false);
+ if (hasShifted && stemUp) {
+ long dots = 0;
+ (void)el->event()->get
+ <Int>(NOTE_DOTS, dots);
+ if (dots > 0) {
+ el->event()->setMaybe<Bool>
+ (m_properties.NOTE_DOT_SHIFTED, true);
+ }
+ }
+
+ el->event()->setMaybe<Bool>
+ (m_properties.NEEDS_EXTRA_SHIFT_SPACE,
+ hasNoteHeadShifted && !stemUp);
+
+ el->event()->setMaybe<Bool>
+ (m_properties.DRAW_FLAG, j == flaggedNote);
+
+ int stemLength = -1;
+ if (j != flaggedNote) {
+ stemLength = staff.getLayoutYForHeight(h[flaggedNote]) -
+ staff.getLayoutYForHeight(h[j]);
+ if (stemLength < 0)
+ stemLength = -stemLength;
+ // NOTATION_DEBUG << "Setting stem length to "
+ // << stemLength << endl;
+ } else {
+ int minStemLength = stemLength;
+ if (h[j] < -2 && stemUp) {
+ //!!! needs tuning, & applying for beamed stems too
+ minStemLength = staff.getLayoutYForHeight(h[j]) -
+ staff.getLayoutYForHeight(4);
+ } else if (h[j] > 10 && !stemUp) {
+ minStemLength = staff.getLayoutYForHeight(4) -
+ staff.getLayoutYForHeight(h[j]);
+ }
+ stemLength = std::max(minStemLength, stemLength);
+ }
+
+ el->event()->setMaybe<Int>
+ (m_properties.UNBEAMED_STEM_LENGTH, stemLength);
+ }
+
+
+ // #938545 (Broken notation: Duplicated note can float
+ // outside stave) -- Need to cope with the case where a
+ // note that's not a member of a chord (different stem
+ // direction &c) falls between notes that are members.
+ // Not optimal, as we can end up scanning the chord
+ // multiple times (we'll return to it after scanning the
+ // contained note). [We can't just iterate over all
+ // elements within the chord (as we can in hlayout)
+ // because we need them in height order.]
+
+ i = chord.getFirstElementNotInChord();
+ if (i == notes->end())
+ i = chord.getFinalElement();
+ else
+ --i;
+
+ } else {
+
+ if (el->event()->isa(Clef::EventType)) {
+
+ // clef pixmaps have the hotspot placed to coincide
+ // with the pitch of the clef -- so the alto clef
+ // should be "on" the middle line, the treble clef
+ // "on" the line below the middle, etc
+
+ el->setLayoutY(staff.getLayoutYForHeight
+ (Clef(*el->event()).getAxisHeight()));
+
+ } else if (el->event()->isa(Rosegarden::Key::EventType)) {
+
+ el->setLayoutY(staff.getLayoutYForHeight(12));
+
+ } else if (el->event()->isa(Text::EventType)) {
+
+ std::string type = Text::UnspecifiedType;
+ el->event()->get<String>(Text::TextTypePropertyName, type);
+
+ if (type == Text::Dynamic ||
+ type == Text::LocalDirection ||
+ type == Text::UnspecifiedType) {
+ el->setLayoutY(staff.getLayoutYForHeight(-7) + displacedY);
+ } else if (type == Text::Lyric) {
+ long verse = 0;
+ el->event()->get<Int>(Text::LyricVersePropertyName, verse);
+ el->setLayoutY(staff.getLayoutYForHeight(-10 - 3 * verse) + displacedY);
+ } else if (type == Text::Annotation) {
+ el->setLayoutY(staff.getLayoutYForHeight(-13) + displacedY);
+ } else {
+ el->setLayoutY(staff.getLayoutYForHeight(22) + displacedY);
+ }
+
+ } else if (el->event()->isa(Indication::EventType)) {
+
+ try {
+ std::string indicationType =
+ el->event()->get
+ <String>(Indication::IndicationTypePropertyName);
+
+ if (indicationType == Indication::Slur ||
+ indicationType == Indication::PhrasingSlur) {
+ getSlurList(staff).push_back(i);
+ }
+
+ if (indicationType == Indication::OttavaUp ||
+ indicationType == Indication::QuindicesimaUp) {
+ el->setLayoutY(staff.getLayoutYForHeight(15) + displacedY);
+ } else {
+ el->setLayoutY(staff.getLayoutYForHeight( -9) + displacedY);
+ }
+ } catch (...) {
+ el->setLayoutY(staff.getLayoutYForHeight( -9) + displacedY);
+ }
+
+ } else if (el->event()->isa(Guitar::Chord::EventType)) {
+
+ el->setLayoutY(staff.getLayoutYForHeight(22) + displacedY);
+ }
+ }
+ }
+
+ PRINT_ELAPSED("NotationVLayout::scanStaff");
+}
+
+void
+NotationVLayout::finishLayout(timeT, timeT)
+{
+ START_TIMING;
+
+ for (SlurListMap::iterator mi = m_slurs.begin();
+ mi != m_slurs.end(); ++mi) {
+
+ for (SlurList::iterator si = mi->second.begin();
+ si != mi->second.end(); ++si) {
+
+ NotationElementList::iterator i = *si;
+ NotationStaff &staff = dynamic_cast<NotationStaff &>(*(mi->first));
+
+ positionSlur(staff, i);
+ }
+ }
+
+ PRINT_ELAPSED("NotationVLayout::finishLayout");
+}
+
+void
+NotationVLayout::positionSlur(NotationStaff &staff,
+ NotationElementList::iterator i)
+{
+ NotationRules rules;
+
+ bool phrasing = ((*i)->event()->get
+ <String>(Indication::IndicationTypePropertyName)
+ == Indication::PhrasingSlur);
+
+ NotationElementList::iterator scooter = i;
+
+ timeT slurDuration = (*i)->event()->getDuration();
+ if (slurDuration == 0 && (*i)->event()->has("indicationduration")) {
+ slurDuration = (*i)->event()->get
+ <Int>("indicationduration"); // obs property
+ }
+ timeT endTime = (*i)->getViewAbsoluteTime() + slurDuration;
+
+ bool haveStart = false;
+
+ int startTopHeight = 4, endTopHeight = 4,
+ startBottomHeight = 4, endBottomHeight = 4,
+ maxTopHeight = 4, minBottomHeight = 4,
+ maxCount = 0, minCount = 0;
+
+ int startX = (int)(*i)->getLayoutX(), endX = startX + 10;
+ bool startStemUp = false, endStemUp = false;
+ long startMarks = 0, endMarks = 0;
+ bool startTied = false, endTied = false;
+ bool beamAbove = false, beamBelow = false;
+ bool dynamic = false;
+
+ std::vector<Event *> stemUpNotes, stemDownNotes;
+
+ // Scan the notes spanned by the slur, recording the top and
+ // bottom heights of the first and last chords, plus the presence
+ // of any troublesome beams and high or low notes in the body.
+
+ while (scooter != staff.getViewElementList()->end()) {
+
+ if ((*scooter)->getViewAbsoluteTime() >= endTime)
+ break;
+ Event *event = (*scooter)->event();
+
+ if (event->isa(Note::EventType)) {
+
+ long h = 0;
+ if (!event->get
+ <Int>(m_properties.HEIGHT_ON_STAFF, h)) {
+ KMessageBox::sorry
+ ((QWidget *)parent(), i18n("Spanned note at %1 has no HEIGHT_ON_STAFF property!\nThis is a bug (the program would previously have crashed by now)").arg((*scooter)->getViewAbsoluteTime()));
+ event->dump(std::cerr);
+ }
+
+ bool stemUp = rules.isStemUp(h);
+ event->get
+ <Bool>(m_properties.VIEW_LOCAL_STEM_UP, stemUp);
+
+ bool beamed = false;
+ event->get
+ <Bool>(m_properties.BEAMED, beamed);
+
+ bool primary = false;
+
+ if (event->get
+ <Bool>
+ (m_properties.CHORD_PRIMARY_NOTE, primary) && primary) {
+
+ NotationChord chord(*(staff.getViewElementList()), scooter,
+ m_notationQuantizer, m_properties);
+
+ if (beamed) {
+ if (stemUp)
+ beamAbove = true;
+ else
+ beamBelow = true;
+ }
+
+ if (!haveStart) {
+
+ startBottomHeight = chord.getLowestNoteHeight();
+ startTopHeight = chord.getHighestNoteHeight();
+ minBottomHeight = startBottomHeight;
+ maxTopHeight = startTopHeight;
+
+ startX = (int)(*scooter)->getLayoutX();
+ startStemUp = stemUp;
+ startMarks = chord.getMarkCountForChord();
+
+ bool tied = false;
+ if ((event->get
+ <Bool>(TIED_FORWARD, tied) && tied) ||
+ (event->get<Bool>(TIED_BACKWARD, tied) && tied)) {
+ startTied = true;
+ }
+
+ haveStart = true;
+
+ } else {
+ if (chord.getLowestNoteHeight() < minBottomHeight) {
+ minBottomHeight = chord.getLowestNoteHeight();
+ ++minCount;
+ }
+ if (chord.getHighestNoteHeight() > maxTopHeight) {
+ maxTopHeight = chord.getHighestNoteHeight();
+ ++maxCount;
+ }
+ }
+
+ endBottomHeight = chord.getLowestNoteHeight();
+ endTopHeight = chord.getHighestNoteHeight();
+ endX = (int)(*scooter)->getLayoutX();
+ endStemUp = stemUp;
+ endMarks = chord.getMarkCountForChord();
+
+ bool tied = false;
+ if ((event->get
+ <Bool>(TIED_FORWARD, tied) && tied) ||
+ (event->get<Bool>(TIED_BACKWARD, tied) && tied)) {
+ endTied = true;
+ }
+ }
+
+ if (!beamed) {
+ if (stemUp)
+ stemUpNotes.push_back(event);
+ else
+ stemDownNotes.push_back(event);
+ }
+
+ } else if (event->isa(Indication::EventType)) {
+
+ try {
+ std::string indicationType =
+ event->get
+ <String>(Indication::IndicationTypePropertyName);
+
+ if (indicationType == Indication::Crescendo ||
+ indicationType == Indication::Decrescendo)
+ dynamic = true;
+ } catch (...) { }
+ }
+
+ ++scooter;
+ }
+
+ bool above = true;
+
+ if ((*i)->event()->has(NotationProperties::SLUR_ABOVE) &&
+ (*i)->event()->isPersistent<Bool>(NotationProperties::SLUR_ABOVE)) {
+
+ (*i)->event()->get
+ <Bool>(NotationProperties::SLUR_ABOVE, above);
+
+ } else if (phrasing) {
+
+ int score = 0; // for "above"
+
+ if (dynamic)
+ score += 2;
+
+ if (startStemUp == endStemUp) {
+ if (startStemUp)
+ score -= 2;
+ else
+ score += 2;
+ } else if (beamBelow != beamAbove) {
+ if (beamAbove)
+ score -= 2;
+ else
+ score += 2;
+ }
+
+ if (maxTopHeight < 6)
+ score += 1;
+ else if (minBottomHeight > 2)
+ score -= 1;
+
+ if (stemUpNotes.size() != stemDownNotes.size()) {
+ if (stemUpNotes.size() < stemDownNotes.size())
+ score += 1;
+ else
+ score -= 1;
+ }
+
+ above = (score >= 0);
+
+ } else {
+
+ if (startStemUp == endStemUp) {
+ above = !startStemUp;
+ } else if (beamBelow) {
+ above = true;
+ } else if (beamAbove) {
+ above = false;
+ } else if (stemUpNotes.size() != stemDownNotes.size()) {
+ above = (stemUpNotes.size() < stemDownNotes.size());
+ } else {
+ above = ((startTopHeight - 4) + (endTopHeight - 4) +
+ (4 - startBottomHeight) + (4 - endBottomHeight) <= 8);
+ }
+ }
+
+ // now choose the actual y-coord of the slur based on the side
+ // we've decided to put it on
+
+ int startHeight, endHeight;
+ int startOffset = 2, endOffset = 2;
+
+ if (above) {
+
+ if (!startStemUp)
+ startOffset += startMarks * 2;
+ else
+ startOffset += 5;
+
+ if (!endStemUp)
+ endOffset += startMarks * 2;
+ else
+ endOffset += 5;
+
+ startHeight = startTopHeight + startOffset;
+ endHeight = endTopHeight + endOffset;
+
+ bool maxRelevant = ((maxTopHeight != endTopHeight) || (maxCount > 1));
+ if (maxRelevant) {
+ int midHeight = (startHeight + endHeight) / 2;
+ if (maxTopHeight > midHeight - 1) {
+ startHeight += maxTopHeight - midHeight + 1;
+ endHeight += maxTopHeight - midHeight + 1;
+ }
+ }
+
+ } else {
+
+ if (startStemUp)
+ startOffset += startMarks * 2;
+ else
+ startOffset += 5;
+
+ if (endStemUp)
+ endOffset += startMarks * 2;
+ else
+ endOffset += 5;
+
+ startHeight = startBottomHeight - startOffset;
+ endHeight = endBottomHeight - endOffset;
+
+ bool minRelevant = ((minBottomHeight != endBottomHeight) || (minCount > 1));
+ if (minRelevant) {
+ int midHeight = (startHeight + endHeight) / 2;
+ if (minBottomHeight < midHeight + 1) {
+ startHeight -= midHeight - minBottomHeight + 1;
+ endHeight -= midHeight - minBottomHeight + 1;
+ }
+ }
+ }
+
+ int y0 = staff.getLayoutYForHeight(startHeight),
+ y1 = staff.getLayoutYForHeight(endHeight);
+
+ int dy = y1 - y0;
+ int length = endX - startX;
+ int diff = staff.getLayoutYForHeight(0) - staff.getLayoutYForHeight(3);
+ if (length < diff*10)
+ diff /= 2;
+ if (length > diff*3)
+ length -= diff / 2;
+ startX += diff;
+
+ (*i)->event()->setMaybe<Bool>(NotationProperties::SLUR_ABOVE, above);
+ (*i)->event()->setMaybe<Int>(m_properties.SLUR_Y_DELTA, dy);
+ (*i)->event()->setMaybe<Int>(m_properties.SLUR_LENGTH, length);
+
+ double displacedX = 0.0, displacedY = 0.0;
+
+ long dxRaw = 0;
+ (*i)->event()->get<Int>(DISPLACED_X, dxRaw);
+ displacedX = double(dxRaw * m_npf->getNoteBodyWidth()) / 1000.0;
+
+ long dyRaw = 0;
+ (*i)->event()->get<Int>(DISPLACED_Y, dyRaw);
+ displacedY = double(dyRaw * m_npf->getLineSpacing()) / 1000.0;
+
+ (*i)->setLayoutX(startX + displacedX);
+ (*i)->setLayoutY(y0 + displacedY);
+}
+
+}
diff --git a/src/gui/editors/notation/NotationVLayout.h b/src/gui/editors/notation/NotationVLayout.h
new file mode 100644
index 0000000..83a16c1
--- /dev/null
+++ b/src/gui/editors/notation/NotationVLayout.h
@@ -0,0 +1,122 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_NOTATIONVLAYOUT_H_
+#define _RG_NOTATIONVLAYOUT_H_
+
+#include "base/FastVector.h"
+#include "base/LayoutEngine.h"
+#include "gui/general/ProgressReporter.h"
+#include <map>
+#include "base/Event.h"
+
+#include "NotationElement.h"
+
+
+class SlurList;
+class QObject;
+
+
+namespace Rosegarden
+{
+
+class Staff;
+class Quantizer;
+class Composition;
+class NotePixmapFactory;
+class NotationStaff;
+class NotationProperties;
+class Composition;
+
+
+/**
+ * Vertical notation layout
+ *
+ * computes the Y coordinate of notation elements
+ */
+
+class NotationVLayout : public ProgressReporter,
+ public VerticalLayoutEngine
+{
+public:
+ NotationVLayout(Composition *c, NotePixmapFactory *npf,
+ const NotationProperties &properties,
+ QObject* parent, const char* name = 0);
+
+ virtual ~NotationVLayout();
+
+ void setNotePixmapFactory(NotePixmapFactory *npf) {
+ m_npf = npf;
+ }
+
+ /**
+ * Resets internal data stores for all staffs
+ */
+ virtual void reset();
+
+ /**
+ * Resets internal data stores for a specific staff
+ */
+ virtual void resetStaff(Staff &,
+ timeT = 0,
+ timeT = 0);
+
+ /**
+ * Lay out a single staff.
+ */
+ virtual void scanStaff(Staff &,
+ timeT = 0,
+ timeT = 0);
+
+ /**
+ * Do any layout dependent on more than one staff. As it
+ * happens, we have none, but we do have some layout that
+ * depends on the final results from the horizontal layout
+ * (for slurs), so we should do that here
+ */
+ virtual void finishLayout(timeT = 0,
+ timeT = 0);
+
+private:
+ void positionSlur(NotationStaff &staff, NotationElementList::iterator i);
+
+ typedef FastVector<NotationElementList::iterator> SlurList;
+ typedef std::map<Staff *, SlurList> SlurListMap;
+
+ //--------------- Data members ---------------------------------
+
+ SlurListMap m_slurs;
+ SlurList &getSlurList(Staff &);
+
+ Composition *m_composition;
+ NotePixmapFactory *m_npf;
+ const Quantizer *m_notationQuantizer;
+ const NotationProperties &m_properties;
+};
+
+
+}
+
+#endif
diff --git a/src/gui/editors/notation/NotationView.cpp b/src/gui/editors/notation/NotationView.cpp
new file mode 100644
index 0000000..66cb4b3
--- /dev/null
+++ b/src/gui/editors/notation/NotationView.cpp
@@ -0,0 +1,7552 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "NotationView.h"
+#include <list>
+#include <qlayout.h>
+#include "misc/Debug.h"
+#include <kapplication.h>
+
+#include "gui/editors/segment/TrackEditor.h"
+#include "gui/editors/segment/TrackButtons.h"
+#include "base/BaseProperties.h"
+#include <klocale.h>
+#include <kstddirs.h>
+#include "misc/Strings.h"
+#include "base/AnalysisTypes.h"
+#include "base/Clipboard.h"
+#include "base/Composition.h"
+#include "base/CompositionTimeSliceAdapter.h"
+#include "base/Configuration.h"
+#include "base/Device.h"
+#include "base/Event.h"
+#include "base/Exception.h"
+#include "base/Instrument.h"
+#include "base/MidiDevice.h"
+#include "base/MidiTypes.h"
+#include "base/NotationTypes.h"
+#include "base/Profiler.h"
+#include "base/PropertyName.h"
+#include "base/NotationQuantizer.h"
+#include "base/RealTime.h"
+#include "base/RulerScale.h"
+#include "base/Segment.h"
+#include "base/Selection.h"
+#include "base/Staff.h"
+#include "base/Studio.h"
+#include "base/Track.h"
+#include "ClefInserter.h"
+#include "commands/edit/AddDotCommand.h"
+#include "commands/edit/ClearTriggersCommand.h"
+#include "commands/edit/CollapseNotesCommand.h"
+#include "commands/edit/CopyCommand.h"
+#include "commands/edit/CutAndCloseCommand.h"
+#include "commands/edit/CutCommand.h"
+#include "commands/edit/EraseCommand.h"
+#include "commands/edit/EventEditCommand.h"
+#include "commands/edit/EventQuantizeCommand.h"
+#include "commands/edit/InsertTriggerNoteCommand.h"
+#include "commands/edit/PasteEventsCommand.h"
+#include "commands/edit/SetLyricsCommand.h"
+#include "commands/edit/SetNoteTypeCommand.h"
+#include "commands/edit/SetTriggerCommand.h"
+#include "commands/edit/TransposeCommand.h"
+#include "commands/notation/AddFingeringMarkCommand.h"
+#include "commands/notation/AddIndicationCommand.h"
+#include "commands/notation/AddMarkCommand.h"
+#include "commands/notation/AddSlashesCommand.h"
+#include "commands/notation/AddTextMarkCommand.h"
+#include "commands/notation/AutoBeamCommand.h"
+#include "commands/notation/BeamCommand.h"
+#include "commands/notation/BreakCommand.h"
+#include "commands/notation/ChangeSlurPositionCommand.h"
+#include "commands/notation/ChangeTiePositionCommand.h"
+#include "commands/notation/ChangeStemsCommand.h"
+#include "commands/notation/ChangeStyleCommand.h"
+#include "commands/notation/ClefInsertionCommand.h"
+#include "commands/notation/CollapseRestsCommand.h"
+#include "commands/notation/DeCounterpointCommand.h"
+#include "commands/notation/EraseEventCommand.h"
+#include "commands/notation/FixNotationQuantizeCommand.h"
+#include "commands/notation/IncrementDisplacementsCommand.h"
+#include "commands/notation/InterpretCommand.h"
+#include "commands/notation/KeyInsertionCommand.h"
+#include "commands/notation/MakeAccidentalsCautionaryCommand.h"
+#include "commands/notation/MakeChordCommand.h"
+#include "commands/notation/MakeNotesViableCommand.h"
+#include "commands/notation/MultiKeyInsertionCommand.h"
+#include "commands/notation/NormalizeRestsCommand.h"
+#include "commands/notation/RemoveFingeringMarksCommand.h"
+#include "commands/notation/RemoveMarksCommand.h"
+#include "commands/notation/RemoveNotationQuantizeCommand.h"
+#include "commands/notation/ResetDisplacementsCommand.h"
+#include "commands/notation/RespellCommand.h"
+#include "commands/notation/RestoreSlursCommand.h"
+#include "commands/notation/RestoreTiesCommand.h"
+#include "commands/notation/RestoreStemsCommand.h"
+#include "commands/notation/SetVisibilityCommand.h"
+#include "commands/notation/SustainInsertionCommand.h"
+#include "commands/notation/TextInsertionCommand.h"
+#include "commands/notation/TieNotesCommand.h"
+#include "commands/notation/TupletCommand.h"
+#include "commands/notation/UntieNotesCommand.h"
+#include "commands/notation/UnTupletCommand.h"
+#include "commands/segment/PasteToTriggerSegmentCommand.h"
+#include "commands/segment/SegmentSyncCommand.h"
+#include "commands/segment/SegmentTransposeCommand.h"
+#include "commands/segment/RenameTrackCommand.h"
+#include "document/RosegardenGUIDoc.h"
+#include "document/ConfigGroups.h"
+#include "document/io/LilyPondExporter.h"
+#include "GuitarChordInserter.h"
+#include "gui/application/SetWaitCursor.h"
+#include "gui/application/RosegardenGUIView.h"
+#include "gui/dialogs/ClefDialog.h"
+#include "gui/dialogs/EventEditDialog.h"
+#include "gui/dialogs/InterpretDialog.h"
+#include "gui/dialogs/IntervalDialog.h"
+#include "gui/dialogs/KeySignatureDialog.h"
+#include "gui/dialogs/LilyPondOptionsDialog.h"
+#include "gui/dialogs/LyricEditDialog.h"
+#include "gui/dialogs/MakeOrnamentDialog.h"
+#include "gui/dialogs/PasteNotationDialog.h"
+#include "gui/dialogs/QuantizeDialog.h"
+#include "gui/dialogs/SimpleEventEditDialog.h"
+#include "gui/dialogs/TextEventDialog.h"
+#include "gui/dialogs/TupletDialog.h"
+#include "gui/dialogs/UseOrnamentDialog.h"
+#include "gui/rulers/StandardRuler.h"
+#include "gui/general/ActiveItem.h"
+#include "gui/general/ClefIndex.h"
+#include "gui/general/EditViewBase.h"
+#include "gui/general/EditView.h"
+#include "gui/general/GUIPalette.h"
+#include "gui/general/LinedStaff.h"
+#include "gui/general/LinedStaffManager.h"
+#include "gui/general/ProgressReporter.h"
+#include "gui/general/PresetHandlerDialog.h"
+#include "gui/general/RosegardenCanvasView.h"
+#include "gui/kdeext/KTmpStatusMsg.h"
+#include "gui/kdeext/QCanvasSimpleSprite.h"
+#include "gui/rulers/ChordNameRuler.h"
+#include "gui/rulers/RawNoteRuler.h"
+#include "gui/rulers/TempoRuler.h"
+#include "gui/rulers/LoopRuler.h"
+#include "gui/studio/StudioControl.h"
+#include "gui/dialogs/EventFilterDialog.h"
+#include "gui/widgets/ProgressBar.h"
+#include "gui/widgets/ProgressDialog.h"
+#include "gui/widgets/ScrollBoxDialog.h"
+#include "gui/widgets/ScrollBox.h"
+#include "gui/widgets/QDeferScrollView.h"
+#include "NotationCanvasView.h"
+#include "NotationElement.h"
+#include "NotationEraser.h"
+#include "NotationHLayout.h"
+#include "NotationProperties.h"
+#include "NotationSelector.h"
+#include "NotationStaff.h"
+#include "NotationStrings.h"
+#include "NotationToolBox.h"
+#include "NotationVLayout.h"
+#include "NoteFontFactory.h"
+#include "NoteInserter.h"
+#include "NotePixmapFactory.h"
+#include "NoteStyleFactory.h"
+#include "NoteStyle.h"
+#include "RestInserter.h"
+#include "sound/MappedEvent.h"
+#include "TextInserter.h"
+#include "HeadersGroup.h"
+#include <kaction.h>
+#include <kcombobox.h>
+#include <kconfig.h>
+#include <kglobal.h>
+#include <klineeditdlg.h>
+#include <kmessagebox.h>
+#include <kprinter.h>
+#include <kprocess.h>
+#include <kprogress.h>
+#include <kstatusbar.h>
+#include <kstdaction.h>
+#include <ktempfile.h>
+#include <ktoolbar.h>
+#include <kxmlguiclient.h>
+#include <qbrush.h>
+#include <qcanvas.h>
+#include <qcursor.h>
+#include <qdialog.h>
+#include <qevent.h>
+#include <qfont.h>
+#include <qfontmetrics.h>
+#include <qhbox.h>
+#include <qiconset.h>
+#include <qlabel.h>
+#include <qobject.h>
+#include <qpaintdevicemetrics.h>
+#include <qpainter.h>
+#include <qpixmap.h>
+#include <qpoint.h>
+#include <qprinter.h>
+#include <qrect.h>
+#include <qregexp.h>
+#include <qsize.h>
+#include <qstring.h>
+#include <qtimer.h>
+#include <qwidget.h>
+#include <qvalidator.h>
+#include <algorithm>
+#include <qpushbutton.h>
+#include <qtooltip.h>
+
+
+namespace Rosegarden
+{
+
+class NoteActionData
+{
+public:
+ NoteActionData();
+ NoteActionData(const QString& _title,
+ QString _actionName,
+ QString _pixmapName,
+ int _keycode,
+ bool _rest,
+ Note::Type _noteType,
+ int _dots);
+
+ QString title;
+ QString actionName;
+ QString pixmapName;
+ int keycode;
+ bool rest;
+ Note::Type noteType;
+ int dots;
+};
+
+NoteActionData::NoteActionData()
+ : title(0),
+ actionName(0),
+ pixmapName(0),
+ keycode(0),
+ rest(false),
+ noteType(0),
+ dots(0)
+{
+}
+
+NoteActionData::NoteActionData(const QString& _title,
+ QString _actionName,
+ QString _pixmapName,
+ int _keycode,
+ bool _rest,
+ Note::Type _noteType,
+ int _dots)
+ : title(_title),
+ actionName(_actionName),
+ pixmapName(_pixmapName),
+ keycode(_keycode),
+ rest(_rest),
+ noteType(_noteType),
+ dots(_dots)
+{
+}
+
+
+class NoteChangeActionData
+{
+public:
+ NoteChangeActionData();
+ NoteChangeActionData(const QString &_title,
+ QString _actionName,
+ QString _pixmapName,
+ int _keycode,
+ bool _notationOnly,
+ Note::Type _noteType);
+
+ QString title;
+ QString actionName;
+ QString pixmapName;
+ int keycode;
+ bool notationOnly;
+ Note::Type noteType;
+};
+
+NoteChangeActionData::NoteChangeActionData()
+ : title(0),
+ actionName(0),
+ pixmapName(0),
+ keycode(0),
+ notationOnly(false),
+ noteType(0)
+{
+}
+
+NoteChangeActionData::NoteChangeActionData(const QString& _title,
+ QString _actionName,
+ QString _pixmapName,
+ int _keycode,
+ bool _notationOnly,
+ Note::Type _noteType)
+ : title(_title),
+ actionName(_actionName),
+ pixmapName(_pixmapName),
+ keycode(_keycode),
+ notationOnly(_notationOnly),
+ noteType(_noteType)
+{
+}
+
+
+class MarkActionData
+{
+public:
+ MarkActionData() :
+ title(0),
+ actionName(0),
+ keycode(0) { }
+
+ MarkActionData(const QString &_title,
+ QString _actionName,
+ int _keycode,
+ Mark _mark) :
+ title(_title),
+ actionName(_actionName),
+ keycode(_keycode),
+ mark(_mark) { }
+
+ QString title;
+ QString actionName;
+ int keycode;
+ Mark mark;
+};
+
+
+NotationView::NotationView(RosegardenGUIDoc *doc,
+ std::vector<Segment *> segments,
+ QWidget *parent,
+ bool showProgressive) :
+ EditView(doc, segments, 2, parent, "notationview"),
+ m_properties(getViewLocalPropertyPrefix()),
+ m_selectionCounter(0),
+ m_insertModeLabel(0),
+ m_annotationsLabel(0),
+ m_lilyPondDirectivesLabel(0),
+ m_progressBar(0),
+ m_currentNotePixmap(0),
+ m_hoveredOverNoteName(0),
+ m_hoveredOverAbsoluteTime(0),
+ m_currentStaff( -1),
+ m_lastFinishingStaff( -1),
+ m_title(0),
+ m_subtitle(0),
+ m_composer(0),
+ m_copyright(0),
+ m_insertionTime(0),
+ m_deferredCursorMove(NoCursorMoveNeeded),
+ m_lastNoteAction("crotchet"),
+ m_fontName(NoteFontFactory::getDefaultFontName()),
+ m_fontSize(NoteFontFactory::getDefaultSize(m_fontName)),
+ m_pageMode(LinedStaff::LinearMode),
+ m_leftGutter(20),
+ m_notePixmapFactory(new NotePixmapFactory(m_fontName, m_fontSize)),
+ m_hlayout(new NotationHLayout(&doc->getComposition(), m_notePixmapFactory,
+ m_properties, this)),
+ m_vlayout(new NotationVLayout(&doc->getComposition(), m_notePixmapFactory,
+ m_properties, this)),
+ m_chordNameRuler(0),
+ m_tempoRuler(0),
+ m_rawNoteRuler(0),
+ m_annotationsVisible(false),
+ m_lilyPondDirectivesVisible(false),
+ m_selectDefaultNote(0),
+ m_fontCombo(0),
+ m_fontSizeCombo(0),
+ m_spacingCombo(0),
+ m_fontSizeActionMenu(0),
+ m_pannerDialog(new ScrollBoxDialog(this, ScrollBox::FixHeight)),
+ m_renderTimer(0),
+ m_playTracking(true),
+ m_progressDisplayer(PROGRESS_NONE),
+ m_inhibitRefresh(true),
+ m_ok(false),
+ m_printMode(false),
+ m_printSize(8), // set in positionStaffs
+ m_showHeadersGroup(0),
+ m_headersGroupView(0),
+ m_headersGroup(0),
+ m_headersTopFrame(0),
+ m_showHeadersMenuEntry(0)
+{
+ initActionDataMaps(); // does something only the 1st time it's called
+
+ m_toolBox = new NotationToolBox(this);
+
+ assert(segments.size() > 0);
+ NOTATION_DEBUG << "NotationView ctor" << endl;
+
+
+ // Initialise the display-related defaults that will be needed
+ // by both the actions and the layout toolbar
+
+ m_config->setGroup(NotationViewConfigGroup);
+
+ m_showHeadersGroup = m_config->readNumEntry("shownotationheader",
+ HeadersGroup::DefaultShowMode);
+
+ m_fontName = qstrtostr(m_config->readEntry
+ ("notefont",
+ strtoqstr(NoteFontFactory::getDefaultFontName())));
+
+ try
+ {
+ (void)NoteFontFactory::getFont
+ (m_fontName,
+ NoteFontFactory::getDefaultSize(m_fontName));
+ } catch (Exception e)
+ {
+ m_fontName = NoteFontFactory::getDefaultFontName();
+ }
+
+ m_fontSize = m_config->readUnsignedNumEntry
+ ((segments.size() > 1 ? "multistaffnotesize" : "singlestaffnotesize"),
+ NoteFontFactory::getDefaultSize(m_fontName));
+
+ int defaultSpacing = m_config->readNumEntry("spacing", 100);
+ m_hlayout->setSpacing(defaultSpacing);
+
+ int defaultProportion = m_config->readNumEntry("proportion", 60);
+ m_hlayout->setProportion(defaultProportion);
+
+ delete m_notePixmapFactory;
+ m_notePixmapFactory = new NotePixmapFactory(m_fontName, m_fontSize);
+ m_hlayout->setNotePixmapFactory(m_notePixmapFactory);
+ m_vlayout->setNotePixmapFactory(m_notePixmapFactory);
+
+ setupActions();
+ // setupAddControlRulerMenu(); - too early for notation, moved to end of ctor.
+ initLayoutToolbar();
+ initStatusBar();
+
+ setBackgroundMode(PaletteBase);
+
+ QCanvas *tCanvas = new QCanvas(this);
+ tCanvas->resize(width() * 2, height() * 2);
+
+ setCanvasView(new NotationCanvasView(*this, tCanvas, getCentralWidget()));
+
+ updateViewCaption();
+
+ m_chordNameRuler = new ChordNameRuler
+ (m_hlayout, doc, segments, m_leftGutter, 20, getCentralWidget());
+ addRuler(m_chordNameRuler);
+ if (showProgressive)
+ m_chordNameRuler->show();
+
+ m_tempoRuler = new TempoRuler
+ (m_hlayout, doc, this, m_leftGutter, 24, false, getCentralWidget());
+ addRuler(m_tempoRuler);
+ m_tempoRuler->hide();
+ static_cast<TempoRuler *>(m_tempoRuler)->connectSignals();
+
+ m_rawNoteRuler = new RawNoteRuler
+ (m_hlayout, segments[0], m_leftGutter, 20, getCentralWidget());
+ addRuler(m_rawNoteRuler);
+ m_rawNoteRuler->show();
+
+ // All toolbars should be created before this is called
+ setAutoSaveSettings("NotationView", true);
+
+ // All rulers must have been created before this is called,
+ // or the program will crash
+ readOptions();
+
+
+ setBottomStandardRuler(new StandardRuler(getDocument(), m_hlayout, m_leftGutter, 25,
+ true, getBottomWidget()));
+
+ for (unsigned int i = 0; i < segments.size(); ++i)
+ {
+ m_staffs.push_back(new NotationStaff
+ (canvas(), segments[i], 0, // snap
+ i, this,
+ m_fontName, m_fontSize));
+ }
+
+
+ // HeadersGroup ctor must not be called before m_staffs initialization
+ m_headersGroupView = new QDeferScrollView(getCentralWidget());
+ QWidget * vport = m_headersGroupView->viewport();
+ m_headersGroup = new HeadersGroup(vport, this, &doc->getComposition());
+ m_headersGroupView->setVScrollBarMode(QScrollView::AlwaysOff);
+ m_headersGroupView->setHScrollBarMode(QScrollView::AlwaysOff);
+ m_headersGroupView->setFixedWidth(m_headersGroupView->contentsWidth());
+ m_canvasView->setLeftFixedWidget(m_headersGroupView);
+
+ // Add a close button just above the track headers.
+ // The grid layout is only here to maintain the button in a
+ // right place
+ m_headersTopFrame = new QFrame(getCentralWidget());
+ QGridLayout * headersTopGrid
+ = new QGridLayout(m_headersTopFrame, 2, 2);
+ QString pixmapDir = KGlobal::dirs()->findResource("appdata", "pixmaps/");
+ QCanvasPixmap pixmap(pixmapDir + "/misc/close.xpm");
+ QPushButton * hideHeadersButton
+ = new QPushButton(m_headersTopFrame);
+ headersTopGrid->addWidget(hideHeadersButton, 1, 1,
+ Qt::AlignRight | Qt::AlignBottom);
+ hideHeadersButton->setIconSet(QIconSet(pixmap));
+ hideHeadersButton->setFlat(true);
+ QToolTip::add(hideHeadersButton, i18n("Close track headers"));
+ headersTopGrid->setMargin(4);
+ setTopStandardRuler(new StandardRuler(getDocument(),
+ m_hlayout, m_leftGutter, 25,
+ false, getCentralWidget()), m_headersTopFrame);
+
+ m_topStandardRuler->getLoopRuler()->setBackgroundColor
+ (GUIPalette::getColour(GUIPalette::InsertCursorRuler));
+
+ connect(m_topStandardRuler->getLoopRuler(), SIGNAL(startMouseMove(int)),
+ m_canvasView, SLOT(startAutoScroll(int)));
+ connect(m_topStandardRuler->getLoopRuler(), SIGNAL(stopMouseMove()),
+ m_canvasView, SLOT(stopAutoScroll()));
+
+ connect(m_bottomStandardRuler->getLoopRuler(), SIGNAL(startMouseMove(int)),
+ m_canvasView, SLOT(startAutoScroll(int)));
+ connect(m_bottomStandardRuler->getLoopRuler(), SIGNAL(stopMouseMove()),
+ m_canvasView, SLOT(stopAutoScroll()));
+
+ // Following connection have to be done before calling setPageMode())
+ connect(m_headersGroup, SIGNAL(headersResized(int)),
+ this, SLOT(slotHeadersWidthChanged(int)));
+
+
+ //
+ // layout
+ //
+ ProgressDialog* progressDlg = 0;
+
+ if (showProgressive)
+ {
+ show();
+ ProgressDialog::processEvents();
+
+ NOTATION_DEBUG << "NotationView : setting up progress dialog" << endl;
+
+ progressDlg = new ProgressDialog(i18n("Starting..."),
+ 100, this);
+ progressDlg->setAutoClose(false);
+ progressDlg->setAutoReset(true);
+ progressDlg->setMinimumDuration(1000);
+ setupProgress(progressDlg);
+
+ m_progressDisplayer = PROGRESS_DIALOG;
+ }
+
+ m_chordNameRuler->setStudio(&getDocument()->getStudio());
+
+ m_currentStaff = 0;
+ m_staffs[0]->setCurrent(true);
+
+ m_config->setGroup(NotationViewConfigGroup);
+ int layoutMode = m_config->readNumEntry("layoutmode", 0);
+
+ try
+ {
+
+ LinedStaff::PageMode mode = LinedStaff::LinearMode;
+ if (layoutMode == 1)
+ mode = LinedStaff::ContinuousPageMode;
+ else if (layoutMode == 2)
+ mode = LinedStaff::MultiPageMode;
+
+ setPageMode(mode);
+
+ for (unsigned int i = 0; i < m_staffs.size(); ++i) {
+ m_staffs[i]->getSegment().getRefreshStatus
+ (m_segmentsRefreshStatusIds[i]).setNeedsRefresh(false);
+ }
+
+ m_ok = true;
+
+ } catch (ProgressReporter::Cancelled c)
+ {
+ // when cancelled, m_ok is false -- checked by calling method
+ NOTATION_DEBUG << "NotationView ctor : layout Cancelled" << endl;
+ }
+
+ NOTATION_DEBUG << "NotationView ctor : m_ok = " << m_ok << endl;
+
+ delete progressDlg;
+
+ // at this point we can return if operation was cancelled
+ if (!isOK())
+ {
+ setOutOfCtor();
+ return ;
+ }
+
+
+ // otherwise, carry on
+ setupDefaultProgress();
+
+ //
+ // Connect signals
+ //
+
+ QObject::connect
+ (getCanvasView(), SIGNAL(renderRequired(double, double)),
+ this, SLOT(slotCheckRendered(double, double)));
+
+ m_topStandardRuler->connectRulerToDocPointer(doc);
+ m_bottomStandardRuler->connectRulerToDocPointer(doc);
+
+ // Disconnect the default connection for this signal from the
+ // top ruler, and connect our own instead
+
+ QObject::disconnect
+ (m_topStandardRuler->getLoopRuler(),
+ SIGNAL(setPointerPosition(timeT)), 0, 0);
+
+ QObject::connect
+ (m_topStandardRuler->getLoopRuler(),
+ SIGNAL(setPointerPosition(timeT)),
+ this, SLOT(slotSetInsertCursorPosition(timeT)));
+
+ QObject::connect
+ (m_topStandardRuler,
+ SIGNAL(dragPointerToPosition(timeT)),
+ this, SLOT(slotSetInsertCursorPosition(timeT)));
+
+ connect(m_bottomStandardRuler, SIGNAL(dragPointerToPosition(timeT)),
+ this, SLOT(slotSetPointerPosition(timeT)));
+
+ QObject::connect
+ (getCanvasView(), SIGNAL(itemPressed(int, int, QMouseEvent*, NotationElement*)),
+ this, SLOT (slotItemPressed(int, int, QMouseEvent*, NotationElement*)));
+
+ QObject::connect
+ (getCanvasView(), SIGNAL(activeItemPressed(QMouseEvent*, QCanvasItem*)),
+ this, SLOT (slotActiveItemPressed(QMouseEvent*, QCanvasItem*)));
+
+ QObject::connect
+ (getCanvasView(), SIGNAL(nonNotationItemPressed(QMouseEvent*, QCanvasItem*)),
+ this, SLOT (slotNonNotationItemPressed(QMouseEvent*, QCanvasItem*)));
+
+ QObject::connect
+ (getCanvasView(), SIGNAL(textItemPressed(QMouseEvent*, QCanvasItem*)),
+ this, SLOT (slotTextItemPressed(QMouseEvent*, QCanvasItem*)));
+
+ QObject::connect
+ (getCanvasView(), SIGNAL(mouseMoved(QMouseEvent*)),
+ this, SLOT (slotMouseMoved(QMouseEvent*)));
+
+ QObject::connect
+ (getCanvasView(), SIGNAL(mouseReleased(QMouseEvent*)),
+ this, SLOT (slotMouseReleased(QMouseEvent*)));
+
+ QObject::connect
+ (getCanvasView(), SIGNAL(hoveredOverNoteChanged(const QString&)),
+ this, SLOT (slotHoveredOverNoteChanged(const QString&)));
+
+ QObject::connect
+ (getCanvasView(), SIGNAL(hoveredOverAbsoluteTimeChanged(unsigned int)),
+ this, SLOT (slotHoveredOverAbsoluteTimeChanged(unsigned int)));
+
+ QObject::connect
+ (getCanvasView(), SIGNAL(zoomIn()), this, SLOT(slotZoomIn()));
+
+ QObject::connect
+ (getCanvasView(), SIGNAL(zoomOut()), this, SLOT(slotZoomOut()));
+
+ QObject::connect
+ (m_pannerDialog->scrollbox(), SIGNAL(valueChanged(const QPoint &)),
+ getCanvasView(), SLOT(slotSetScrollPos(const QPoint &)));
+
+ QObject::connect
+ (getCanvasView()->horizontalScrollBar(), SIGNAL(valueChanged(int)),
+ m_pannerDialog->scrollbox(), SLOT(setViewX(int)));
+
+ QObject::connect
+ (getCanvasView()->verticalScrollBar(), SIGNAL(valueChanged(int)),
+ m_pannerDialog->scrollbox(), SLOT(setViewY(int)));
+
+ QObject::connect
+ (doc, SIGNAL(pointerPositionChanged(timeT)),
+ this, SLOT(slotSetPointerPosition(timeT)));
+
+ //
+ // Connect vertical scrollbars between canvas and notation header
+ QObject::connect
+ (getCanvasView()->verticalScrollBar(), SIGNAL(valueChanged(int)),
+ this, SLOT(slotVerticalScrollHeadersGroup(int)));
+
+ QObject::connect
+ (getCanvasView()->verticalScrollBar(), SIGNAL(sliderMoved(int)),
+ this, SLOT(slotVerticalScrollHeadersGroup(int)));
+
+ QObject::connect
+ (m_headersGroupView, SIGNAL(gotWheelEvent(QWheelEvent*)),
+ getCanvasView(), SLOT(slotExternalWheelEvent(QWheelEvent*)));
+
+ // Ensure notation header keeps the right bottom margin when user
+ // toggles the canvas view bottom rulers
+ connect(getCanvasView(), SIGNAL(bottomWidgetHeightChanged(int)),
+ this, SLOT(slotCanvasBottomWidgetHeightChanged(int)));
+
+ // Signal canvas horizontal scroll to notation header
+ QObject::connect
+ (getCanvasView(), SIGNAL(contentsMoving(int, int)),
+ this, SLOT(slotUpdateHeaders(int, int)));
+
+ // Connect the close notation headers button
+ QObject::connect(hideHeadersButton, SIGNAL(clicked()),
+ this, SLOT(slotHideHeadersGroup()));
+
+ stateChanged("have_selection", KXMLGUIClient::StateReverse);
+ stateChanged("have_notes_in_selection", KXMLGUIClient::StateReverse);
+ stateChanged("have_rests_in_selection", KXMLGUIClient::StateReverse);
+ stateChanged("have_multiple_staffs",
+ (m_staffs.size() > 1 ? KXMLGUIClient::StateNoReverse :
+ KXMLGUIClient::StateReverse));
+ stateChanged("rest_insert_tool_current", KXMLGUIClient::StateReverse);
+ slotTestClipboard();
+
+ if (getSegmentsOnlyRestsAndClefs())
+ {
+ m_selectDefaultNote->activate();
+ stateChanged("note_insert_tool_current",
+ KXMLGUIClient::StateNoReverse);
+ } else
+ {
+ actionCollection()->action("select")->activate();
+ stateChanged("note_insert_tool_current",
+ KXMLGUIClient::StateReverse);
+ }
+
+ timeT start = doc->getComposition().getLoopStart();
+ timeT end = doc->getComposition().getLoopEnd();
+ m_topStandardRuler->getLoopRuler()->slotSetLoopMarker(start, end);
+ m_bottomStandardRuler->getLoopRuler()->slotSetLoopMarker(start, end);
+
+ slotSetInsertCursorPosition(0);
+ slotSetPointerPosition(doc->getComposition().getPosition());
+ setCurrentSelection(0, false, true);
+ slotUpdateInsertModeStatus();
+ m_chordNameRuler->repaint();
+ m_tempoRuler->repaint();
+ m_rawNoteRuler->repaint();
+ m_inhibitRefresh = false;
+
+ // slotCheckRendered(0, getCanvasView()->visibleWidth());
+ // getCanvasView()->repaintContents();
+ updateView();
+
+ QObject::connect
+ (this, SIGNAL(renderComplete()),
+ getCanvasView(), SLOT(slotRenderComplete()));
+
+ if (parent)
+ {
+ const TrackButtons * trackLabels =
+ ((RosegardenGUIView*)parent)->getTrackEditor()->getTrackButtons();
+ QObject::connect
+ (trackLabels, SIGNAL(nameChanged()),
+ this, SLOT(slotUpdateStaffName()));
+ }
+
+ setConfigDialogPageIndex(3);
+ setOutOfCtor();
+
+ // Property and Control Rulers
+ //
+ if (getCurrentSegment()->getViewFeatures())
+ slotShowVelocityControlRuler();
+ setupControllerTabs();
+
+ setupAddControlRulerMenu();
+ setRewFFwdToAutoRepeat();
+
+ slotCompositionStateUpdate();
+
+ NOTATION_DEBUG << "NotationView ctor exiting" << endl;
+}
+
+NotationView::NotationView(RosegardenGUIDoc *doc,
+ std::vector<Segment *> segments,
+ QWidget *parent,
+ NotationView *referenceView)
+ : EditView(doc, segments, 1, 0, "printview"),
+ m_properties(getViewLocalPropertyPrefix()),
+ m_selectionCounter(0),
+ m_currentNotePixmap(0),
+ m_hoveredOverNoteName(0),
+ m_hoveredOverAbsoluteTime(0),
+ m_lastFinishingStaff( -1),
+ m_title(0),
+ m_subtitle(0),
+ m_composer(0),
+ m_copyright(0),
+ m_insertionTime(0),
+ m_deferredCursorMove(NoCursorMoveNeeded),
+ m_lastNoteAction("crotchet"),
+ m_fontName(NoteFontFactory::getDefaultFontName()),
+ m_fontSize(NoteFontFactory::getDefaultSize(m_fontName)),
+ m_pageMode(LinedStaff::LinearMode),
+ m_leftGutter(0),
+ m_notePixmapFactory(new NotePixmapFactory(m_fontName, m_fontSize)),
+ m_hlayout(new NotationHLayout(&doc->getComposition(), m_notePixmapFactory,
+ m_properties, this)),
+ m_vlayout(new NotationVLayout(&doc->getComposition(), m_notePixmapFactory,
+ m_properties, this)),
+ m_chordNameRuler(0),
+ m_tempoRuler(0),
+ m_rawNoteRuler(0),
+ m_annotationsVisible(false),
+ m_lilyPondDirectivesVisible(false),
+ m_selectDefaultNote(0),
+ m_fontCombo(0),
+ m_fontSizeCombo(0),
+ m_spacingCombo(0),
+ m_fontSizeActionMenu(0),
+ m_pannerDialog(0),
+ m_renderTimer(0),
+ m_playTracking(false),
+ m_progressDisplayer(PROGRESS_NONE),
+ m_inhibitRefresh(true),
+ m_ok(false),
+ m_printMode(true),
+ m_printSize(8), // set in positionStaffs
+ m_showHeadersGroup(0),
+ m_headersGroupView(0),
+ m_headersGroup(0),
+ m_headersTopFrame(0),
+ m_showHeadersMenuEntry(0)
+{
+ assert(segments.size() > 0);
+ NOTATION_DEBUG << "NotationView print ctor" << endl;
+
+
+ // Initialise the display-related defaults that will be needed
+ // by both the actions and the layout toolbar
+
+ m_config->setGroup(NotationViewConfigGroup);
+
+ if (referenceView)
+ {
+ m_fontName = referenceView->m_fontName;
+ } else
+ {
+ m_fontName = qstrtostr(m_config->readEntry
+ ("notefont",
+ strtoqstr(NoteFontFactory::getDefaultFontName())));
+ }
+
+
+ // Force largest font size
+ std::vector<int> sizes = NoteFontFactory::getAllSizes(m_fontName);
+ m_fontSize = sizes[sizes.size() - 1];
+
+ if (referenceView)
+ {
+ m_hlayout->setSpacing(referenceView->m_hlayout->getSpacing());
+ m_hlayout->setProportion(referenceView->m_hlayout->getProportion());
+ } else
+ {
+ int defaultSpacing = m_config->readNumEntry("spacing", 100);
+ m_hlayout->setSpacing(defaultSpacing);
+ int defaultProportion = m_config->readNumEntry("proportion", 60);
+ m_hlayout->setProportion(defaultProportion);
+ }
+
+ delete m_notePixmapFactory;
+ m_notePixmapFactory = new NotePixmapFactory(m_fontName, m_fontSize);
+ m_hlayout->setNotePixmapFactory(m_notePixmapFactory);
+ m_vlayout->setNotePixmapFactory(m_notePixmapFactory);
+
+ setBackgroundMode(PaletteBase);
+ m_config->setGroup(NotationViewConfigGroup);
+
+ QCanvas *tCanvas = new QCanvas(this);
+ tCanvas->resize(width() * 2, height() * 2); //!!!
+
+ setCanvasView(new NotationCanvasView(*this, tCanvas, getCentralWidget()));
+ canvas()->retune(128); // tune for larger canvas
+
+ for (unsigned int i = 0; i < segments.size(); ++i)
+ {
+ m_staffs.push_back(new NotationStaff(canvas(), segments[i], 0, // snap
+ i, this,
+ m_fontName, m_fontSize));
+ }
+
+ m_currentStaff = 0;
+ m_staffs[0]->setCurrent(true);
+
+ ProgressDialog* progressDlg = 0;
+
+ if (parent)
+ {
+
+ ProgressDialog::processEvents();
+
+ NOTATION_DEBUG << "NotationView : setting up progress dialog" << endl;
+
+ progressDlg = new ProgressDialog(i18n("Preparing to print..."),
+ 100, parent);
+ progressDlg->setAutoClose(false);
+ progressDlg->setAutoReset(true);
+ progressDlg->setMinimumDuration(1000);
+ setupProgress(progressDlg);
+
+ m_progressDisplayer = PROGRESS_DIALOG;
+ }
+
+ try
+ {
+
+ setPageMode(LinedStaff::MultiPageMode); // also positions and renders the staffs!
+
+ for (unsigned int i = 0; i < m_staffs.size(); ++i) {
+ m_staffs[i]->getSegment().getRefreshStatus
+ (m_segmentsRefreshStatusIds[i]).setNeedsRefresh(false);
+ }
+
+ m_ok = true;
+
+ } catch (ProgressReporter::Cancelled c)
+ {
+ // when cancelled, m_ok is false -- checked by calling method
+ NOTATION_DEBUG << "NotationView ctor : layout Cancelled" << endl;
+ }
+
+ NOTATION_DEBUG << "NotationView ctor : m_ok = " << m_ok << endl;
+
+ delete progressDlg;
+
+ if (!isOK())
+ {
+ setOutOfCtor();
+ return ; // In case more code is added there later
+ }
+
+ setOutOfCtor(); // keep this as last call in the ctor
+}
+
+NotationView::~NotationView()
+{
+ NOTATION_DEBUG << "-> ~NotationView()" << endl;
+
+ if (!m_printMode && m_ok)
+ slotSaveOptions();
+
+ delete m_chordNameRuler;
+
+ delete m_renderTimer;
+
+ for (unsigned int i = 0; i < m_staffs.size(); ++i) {
+ for (Segment::iterator j = m_staffs[i]->getSegment().begin();
+ j != m_staffs[i]->getSegment().end(); ++j) {
+ removeViewLocalProperties(*j);
+ }
+ delete m_staffs[i]; // this will erase all "notes" canvas items
+ }
+
+ PixmapArrayGC::deleteAll();
+ Profiles::getInstance()->dump();
+
+ NOTATION_DEBUG << "<- ~NotationView()" << endl;
+}
+
+void
+NotationView::removeViewLocalProperties(Event *e)
+{
+ Event::PropertyNames names(e->getPropertyNames());
+ std::string prefix(getViewLocalPropertyPrefix());
+
+ for (Event::PropertyNames::iterator i = names.begin();
+ i != names.end(); ++i) {
+ if (i->getName().substr(0, prefix.size()) == prefix) {
+ e->unset(*i);
+ }
+ }
+}
+
+const NotationProperties &
+NotationView::getProperties() const
+{
+ return m_properties;
+}
+
+void NotationView::positionStaffs()
+{
+ NOTATION_DEBUG << "NotationView::positionStaffs" << endl;
+
+ m_config->setGroup(NotationViewConfigGroup);
+ m_printSize = m_config->readUnsignedNumEntry("printingnotesize", 5);
+
+ int minTrack = 0, maxTrack = 0;
+ bool haveMinTrack = false;
+ typedef std::map<int, int> TrackIntMap;
+ TrackIntMap trackHeights;
+ TrackIntMap trackCoords;
+
+ int pageWidth, pageHeight, leftMargin, topMargin;
+ pageWidth = getPageWidth();
+ pageHeight = getPageHeight();
+ leftMargin = 0, topMargin = 0;
+ getPageMargins(leftMargin, topMargin);
+
+ int accumulatedHeight;
+ int rowsPerPage = 1;
+ int legerLines = 8;
+ if (m_pageMode != LinedStaff::LinearMode)
+ legerLines = 7;
+ int rowGapPercent = (m_staffs.size() > 1 ? 40 : 10);
+ int aimFor = -1;
+
+ bool done = false;
+
+ int titleHeight = 0;
+
+ if (m_title)
+ delete m_title;
+ if (m_subtitle)
+ delete m_subtitle;
+ if (m_composer)
+ delete m_composer;
+ if (m_copyright)
+ delete m_copyright;
+ m_title = m_subtitle = m_composer = m_copyright = 0;
+
+ if (m_pageMode == LinedStaff::MultiPageMode) {
+
+ const Configuration &metadata =
+ getDocument()->getComposition().getMetadata();
+
+ QFont defaultFont(NotePixmapFactory::defaultSerifFontFamily);
+ m_config->setGroup(NotationViewConfigGroup);
+ QFont font = m_config->readFontEntry("textfont", &defaultFont);
+ font.setPixelSize(m_fontSize * 5);
+ QFontMetrics metrics(font);
+
+ if (metadata.has(CompositionMetadataKeys::Title)) {
+ QString title(strtoqstr(metadata.get<String>
+ (CompositionMetadataKeys::Title)));
+ m_title = new QCanvasText(title, font, canvas());
+ m_title->setX(m_leftGutter + pageWidth / 2 - metrics.width(title) / 2);
+ m_title->setY(20 + topMargin / 4 + metrics.ascent());
+ m_title->show();
+ titleHeight += metrics.height() * 3 / 2 + topMargin / 4;
+ }
+
+ font.setPixelSize(m_fontSize * 3);
+ metrics = QFontMetrics(font);
+
+ if (metadata.has(CompositionMetadataKeys::Subtitle)) {
+ QString subtitle(strtoqstr(metadata.get<String>
+ (CompositionMetadataKeys::Subtitle)));
+ m_subtitle = new QCanvasText(subtitle, font, canvas());
+ m_subtitle->setX(m_leftGutter + pageWidth / 2 - metrics.width(subtitle) / 2);
+ m_subtitle->setY(20 + titleHeight + metrics.ascent());
+ m_subtitle->show();
+ titleHeight += metrics.height() * 3 / 2;
+ }
+
+ if (metadata.has(CompositionMetadataKeys::Composer)) {
+ QString composer(strtoqstr(metadata.get<String>
+ (CompositionMetadataKeys::Composer)));
+ m_composer = new QCanvasText(composer, font, canvas());
+ m_composer->setX(m_leftGutter + pageWidth - metrics.width(composer) - leftMargin);
+ m_composer->setY(20 + titleHeight + metrics.ascent());
+ m_composer->show();
+ titleHeight += metrics.height() * 3 / 2;
+ }
+
+ font.setPixelSize(m_fontSize * 2);
+ metrics = QFontMetrics(font);
+
+ if (metadata.has(CompositionMetadataKeys::Copyright)) {
+ QString copyright(strtoqstr(metadata.get<String>
+ (CompositionMetadataKeys::Copyright)));
+ m_copyright = new QCanvasText(copyright, font, canvas());
+ m_copyright->setX(m_leftGutter + leftMargin);
+ m_copyright->setY(20 + pageHeight - topMargin - metrics.descent());
+ m_copyright->show();
+ }
+ }
+
+ while (1) {
+
+ accumulatedHeight = 0;
+ int maxTrackHeight = 0;
+
+ trackHeights.clear();
+
+ for (unsigned int i = 0; i < m_staffs.size(); ++i) {
+
+ m_staffs[i]->setLegerLineCount(legerLines);
+
+ int height = m_staffs[i]->getHeightOfRow();
+ TrackId trackId = m_staffs[i]->getSegment().getTrack();
+ Track *track =
+ m_staffs[i]->getSegment().getComposition()->
+ getTrackById(trackId);
+
+ if (!track)
+ continue; // This Should Not Happen, My Friend
+
+ int trackPosition = track->getPosition();
+
+ TrackIntMap::iterator hi = trackHeights.find(trackPosition);
+ if (hi == trackHeights.end()) {
+ trackHeights.insert(TrackIntMap::value_type
+ (trackPosition, height));
+ } else if (height > hi->second) {
+ hi->second = height;
+ }
+
+ if (height > maxTrackHeight)
+ maxTrackHeight = height;
+
+ if (trackPosition < minTrack || !haveMinTrack) {
+ minTrack = trackPosition;
+ haveMinTrack = true;
+ }
+ if (trackPosition > maxTrack) {
+ maxTrack = trackPosition;
+ }
+ }
+
+ for (int i = minTrack; i <= maxTrack; ++i) {
+ TrackIntMap::iterator hi = trackHeights.find(i);
+ if (hi != trackHeights.end()) {
+ trackCoords[i] = accumulatedHeight;
+ accumulatedHeight += hi->second;
+ }
+ }
+
+ accumulatedHeight += maxTrackHeight * rowGapPercent / 100;
+
+ if (done)
+ break;
+
+ if (m_pageMode != LinedStaff::MultiPageMode) {
+
+ rowsPerPage = 0;
+ done = true;
+ break;
+
+ } else {
+
+ // Check how well all this stuff actually fits on the
+ // page. If things don't fit as well as we'd like, modify
+ // at most one parameter so as to save some space, then
+ // loop around again and see if it worked. This iterative
+ // approach is inefficient but the time spent here is
+ // neglible in context, and it's a simple way to code it.
+
+ int staffPageHeight = pageHeight - topMargin * 2 - titleHeight;
+ rowsPerPage = staffPageHeight / accumulatedHeight;
+
+ if (rowsPerPage < 1) {
+
+ if (legerLines > 5)
+ --legerLines;
+ else if (rowGapPercent > 20)
+ rowGapPercent -= 10;
+ else if (legerLines > 4)
+ --legerLines;
+ else if (rowGapPercent > 0)
+ rowGapPercent -= 10;
+ else if (legerLines > 3)
+ --legerLines;
+ else if (m_printSize > 3)
+ --m_printSize;
+ else { // just accept that we'll have to overflow
+ rowsPerPage = 1;
+ done = true;
+ }
+
+ } else {
+
+ if (aimFor == rowsPerPage) {
+
+ titleHeight +=
+ (staffPageHeight - (rowsPerPage * accumulatedHeight)) / 2;
+
+ done = true;
+
+ } else {
+
+ if (aimFor == -1)
+ aimFor = rowsPerPage + 1;
+
+ // we can perhaps accommodate another row, with care
+ if (legerLines > 5)
+ --legerLines;
+ else if (rowGapPercent > 20)
+ rowGapPercent -= 10;
+ else if (legerLines > 3)
+ --legerLines;
+ else if (rowGapPercent > 0)
+ rowGapPercent -= 10;
+ else { // no, we can't
+ rowGapPercent = 0;
+ legerLines = 8;
+ done = true;
+ }
+ }
+ }
+ }
+ }
+
+ m_hlayout->setPageWidth(pageWidth - leftMargin * 2);
+
+ int topGutter = 0;
+
+ if (m_pageMode == LinedStaff::MultiPageMode) {
+
+ topGutter = 20;
+
+ } else if (m_pageMode == LinedStaff::ContinuousPageMode) {
+
+ // fewer leger lines above staff than in linear mode --
+ // compensate for this on the top staff
+ topGutter = m_notePixmapFactory->getLineSpacing() * 2;
+ }
+
+ for (unsigned int i = 0; i < m_staffs.size(); ++i) {
+
+ TrackId trackId = m_staffs[i]->getSegment().getTrack();
+ Track *track =
+ m_staffs[i]->getSegment().getComposition()->
+ getTrackById(trackId);
+
+ if (!track)
+ continue; // Once Again, My Friend, You Should Never See Me Here
+
+ int trackPosition = track->getPosition();
+
+ m_staffs[i]->setTitleHeight(titleHeight);
+ m_staffs[i]->setRowSpacing(accumulatedHeight);
+
+ if (trackPosition < maxTrack) {
+ m_staffs[i]->setConnectingLineLength(trackHeights[trackPosition]);
+ }
+
+ if (trackPosition == minTrack &&
+ m_pageMode != LinedStaff::LinearMode) {
+ m_staffs[i]->setBarNumbersEvery(5);
+ } else {
+ m_staffs[i]->setBarNumbersEvery(0);
+ }
+
+ m_staffs[i]->setX(m_leftGutter);
+ m_staffs[i]->setY(topGutter + trackCoords[trackPosition] + topMargin);
+ m_staffs[i]->setPageWidth(pageWidth - leftMargin * 2);
+ m_staffs[i]->setRowsPerPage(rowsPerPage);
+ m_staffs[i]->setPageMode(m_pageMode);
+ m_staffs[i]->setMargin(leftMargin);
+
+ NOTATION_DEBUG << "NotationView::positionStaffs: set staff's page width to "
+ << (pageWidth - leftMargin * 2) << endl;
+
+ }
+
+
+ if (!m_printMode) {
+ // Destroy then recreate all track headers
+ hideHeadersGroup();
+ m_headersGroup->removeAllHeaders();
+ if (m_pageMode == LinedStaff::LinearMode) {
+ for (int i = minTrack; i <= maxTrack; ++i) {
+ TrackIntMap::iterator hi = trackHeights.find(i);
+ if (hi != trackHeights.end()) {
+ TrackId trackId = getDocument()->getComposition()
+ .getTrackByPosition(i)->getId();
+ m_headersGroup->addHeader(trackId, trackHeights[i],
+ trackCoords[i], getCanvasLeftX());
+ }
+ }
+
+ m_headersGroup->completeToHeight(canvas()->height());
+
+ m_headersGroupView->addChild(m_headersGroup);
+
+ getCanvasView()->updateLeftWidgetGeometry();
+
+ if ( (m_showHeadersGroup == HeadersGroup::ShowAlways)
+ || ( (m_showHeadersGroup == HeadersGroup::ShowWhenNeeded)
+ && (m_headersGroup->getUsedHeight()
+ > getCanvasView()->visibleHeight()))) {
+ m_headersGroup->slotUpdateAllHeaders(getCanvasLeftX(), 0, true);
+ showHeadersGroup();
+
+ // Disable menu entry when headers are shown
+ m_showHeadersMenuEntry->setEnabled(false);
+ } else {
+ // Enable menu entry when headers are hidden
+ m_showHeadersMenuEntry->setEnabled(true);
+ }
+ } else {
+ // Disable menu entry when not in linear mode
+ m_showHeadersMenuEntry->setEnabled(false);
+ }
+ }
+}
+
+void NotationView::slotCanvasBottomWidgetHeightChanged(int newHeight)
+{
+ getCanvasView()->updateLeftWidgetGeometry();
+}
+
+void NotationView::positionPages()
+{
+ if (m_printMode)
+ return ;
+
+ QPixmap background;
+ QPixmap deskBackground;
+ bool haveBackground = false;
+
+ m_config->setGroup(NotationViewConfigGroup);
+ if (m_config->readBoolEntry("backgroundtextures", true)) {
+ QString pixmapDir =
+ KGlobal::dirs()->findResource("appdata", "pixmaps/");
+ if (background.load(QString("%1/misc/bg-paper-cream.xpm").
+ arg(pixmapDir))) {
+ haveBackground = true;
+ }
+ // we're happy to ignore errors from this one:
+ deskBackground.load(QString("%1/misc/bg-desktop.xpm").arg(pixmapDir));
+ }
+
+ int pageWidth = getPageWidth();
+ int pageHeight = getPageHeight();
+ int leftMargin = 0, topMargin = 0;
+ getPageMargins(leftMargin, topMargin);
+ int maxPageCount = 1;
+
+ for (unsigned int i = 0; i < m_staffs.size(); ++i) {
+ int pageCount = m_staffs[i]->getPageCount();
+ if (pageCount > maxPageCount)
+ maxPageCount = pageCount;
+ }
+
+ for (unsigned int i = 0; i < m_pages.size(); ++i) {
+ delete m_pages[i];
+ delete m_pageNumbers[i];
+ }
+ m_pages.clear();
+ m_pageNumbers.clear();
+
+ if (m_pageMode != LinedStaff::MultiPageMode) {
+ if (haveBackground) {
+ canvas()->setBackgroundPixmap(background);
+ getCanvasView()->setBackgroundMode(Qt::FixedPixmap);
+ getCanvasView()->setPaletteBackgroundPixmap(background);
+ getCanvasView()->setErasePixmap(background);
+ }
+ } else {
+ if (haveBackground) {
+ canvas()->setBackgroundPixmap(deskBackground);
+ getCanvasView()->setBackgroundMode(Qt::FixedPixmap);
+ getCanvasView()->setPaletteBackgroundPixmap(background);
+ getCanvasView()->setErasePixmap(background);
+ }
+
+ QFont pageNumberFont;
+ pageNumberFont.setPixelSize(m_fontSize * 2);
+ QFontMetrics pageNumberMetrics(pageNumberFont);
+
+ for (int page = 0; page < maxPageCount; ++page) {
+
+ int x = m_leftGutter + pageWidth * page + leftMargin / 4;
+ int y = 20;
+ int w = pageWidth - leftMargin / 2;
+ int h = pageHeight;
+
+ QString str = QString("%1").arg(page + 1);
+ QCanvasText *text = new QCanvasText(str, pageNumberFont, canvas());
+ text->setX(m_leftGutter + pageWidth * page + pageWidth - pageNumberMetrics.width(str) - leftMargin);
+ text->setY(y + h - pageNumberMetrics.descent() - topMargin);
+ text->setZ( -999);
+ text->show();
+ m_pageNumbers.push_back(text);
+
+ QCanvasRectangle *rect = new QCanvasRectangle(x, y, w, h, canvas());
+ if (haveBackground)
+ rect->setBrush(QBrush(Qt::white, background));
+ rect->setPen(Qt::black);
+ rect->setZ( -1000);
+ rect->show();
+ m_pages.push_back(rect);
+ }
+
+ updateThumbnails(false);
+ }
+
+ m_config->setGroup(NotationViewConfigGroup);
+}
+
+void NotationView::slotUpdateStaffName()
+{
+ LinedStaff *staff = getLinedStaff(m_currentStaff);
+ staff->drawStaffName();
+ m_headersGroup->slotUpdateAllHeaders(getCanvasLeftX(), 0, true);
+}
+
+void NotationView::slotSaveOptions()
+{
+ m_config->setGroup(NotationViewConfigGroup);
+
+ m_config->writeEntry("Show Chord Name Ruler", getToggleAction("show_chords_ruler")->isChecked());
+ m_config->writeEntry("Show Raw Note Ruler", getToggleAction("show_raw_note_ruler")->isChecked());
+ m_config->writeEntry("Show Tempo Ruler", getToggleAction("show_tempo_ruler")->isChecked());
+ m_config->writeEntry("Show Annotations", m_annotationsVisible);
+ m_config->writeEntry("Show LilyPond Directives", m_lilyPondDirectivesVisible);
+
+ m_config->sync();
+}
+
+void NotationView::setOneToolbar(const char *actionName,
+ const char *toolbarName)
+{
+ KToggleAction *action = getToggleAction(actionName);
+ if (!action) {
+ std::cerr << "WARNING: No such action as " << actionName << std::endl;
+ return ;
+ }
+ QWidget *toolbar = toolBar(toolbarName);
+ if (!toolbar) {
+ std::cerr << "WARNING: No such toolbar as " << toolbarName << std::endl;
+ return ;
+ }
+ action->setChecked(!toolbar->isHidden());
+}
+
+void NotationView::readOptions()
+{
+ EditView::readOptions();
+
+ setOneToolbar("show_tools_toolbar", "Tools Toolbar");
+ setOneToolbar("show_notes_toolbar", "Notes Toolbar");
+ setOneToolbar("show_rests_toolbar", "Rests Toolbar");
+ setOneToolbar("show_clefs_toolbar", "Clefs Toolbar");
+ setOneToolbar("show_group_toolbar", "Group Toolbar");
+ setOneToolbar("show_marks_toolbar", "Marks Toolbar");
+ setOneToolbar("show_layout_toolbar", "Layout Toolbar");
+ setOneToolbar("show_transport_toolbar", "Transport Toolbar");
+ setOneToolbar("show_accidentals_toolbar", "Accidentals Toolbar");
+ setOneToolbar("show_meta_toolbar", "Meta Toolbar");
+
+ m_config->setGroup(NotationViewConfigGroup);
+
+ bool opt;
+
+ opt = m_config->readBoolEntry("Show Chord Name Ruler", false);
+ getToggleAction("show_chords_ruler")->setChecked(opt);
+ slotToggleChordsRuler();
+
+ opt = m_config->readBoolEntry("Show Raw Note Ruler", true);
+ getToggleAction("show_raw_note_ruler")->setChecked(opt);
+ slotToggleRawNoteRuler();
+
+ opt = m_config->readBoolEntry("Show Tempo Ruler", true);
+ getToggleAction("show_tempo_ruler")->setChecked(opt);
+ slotToggleTempoRuler();
+
+ opt = m_config->readBoolEntry("Show Annotations", true);
+ m_annotationsVisible = opt;
+ getToggleAction("show_annotations")->setChecked(opt);
+ slotUpdateAnnotationsStatus();
+ // slotToggleAnnotations();
+
+ opt = m_config->readBoolEntry("Show LilyPond Directives", true);
+ m_lilyPondDirectivesVisible = opt;
+ getToggleAction("show_lilypond_directives")->setChecked(opt);
+ slotUpdateLilyPondDirectivesStatus();
+}
+
+void NotationView::setupActions()
+{
+ KStdAction::print(this, SLOT(slotFilePrint()), actionCollection());
+ KStdAction::printPreview(this, SLOT(slotFilePrintPreview()),
+ actionCollection());
+
+ new KAction(i18n("Print &with LilyPond..."), 0, 0, this,
+ SLOT(slotPrintLilyPond()), actionCollection(),
+ "file_print_lilypond");
+
+ new KAction(i18n("Preview with Lil&yPond..."), 0, 0, this,
+ SLOT(slotPreviewLilyPond()), actionCollection(),
+ "file_preview_lilypond");
+
+ EditViewBase::setupActions("notation.rc");
+ EditView::setupActions();
+
+ KRadioAction* noteAction = 0;
+
+ // View menu stuff
+
+ KActionMenu *fontActionMenu =
+ new KActionMenu(i18n("Note &Font"), this, "note_font_actionmenu");
+
+ std::set
+ <std::string> fs(NoteFontFactory::getFontNames());
+ std::vector<std::string> f(fs.begin(), fs.end());
+ std::sort(f.begin(), f.end());
+
+ for (std::vector<std::string>::iterator i = f.begin(); i != f.end(); ++i) {
+
+ QString fontQName(strtoqstr(*i));
+
+ KToggleAction *fontAction =
+ new KToggleAction
+ (fontQName, 0, this, SLOT(slotChangeFontFromAction()),
+ actionCollection(), "note_font_" + fontQName);
+
+ fontAction->setChecked(*i == m_fontName);
+ fontActionMenu->insert(fontAction);
+ }
+
+ actionCollection()->insert(fontActionMenu);
+
+ m_fontSizeActionMenu =
+ new KActionMenu(i18n("Si&ze"), this, "note_font_size_actionmenu");
+ setupFontSizeMenu();
+
+ actionCollection()->insert(m_fontSizeActionMenu);
+
+ m_showHeadersMenuEntry
+ = new KAction(i18n("Show Track Headers"), 0, this,
+ SLOT(slotShowHeadersGroup()),
+ actionCollection(), "show_track_headers");
+
+ KActionMenu *spacingActionMenu =
+ new KActionMenu(i18n("S&pacing"), this, "stretch_actionmenu");
+
+ int defaultSpacing = m_hlayout->getSpacing();
+ std::vector<int> spacings = NotationHLayout::getAvailableSpacings();
+
+ for (std::vector<int>::iterator i = spacings.begin();
+ i != spacings.end(); ++i) {
+
+ KToggleAction *spacingAction =
+ new KToggleAction
+ (QString("%1%").arg(*i), 0, this,
+ SLOT(slotChangeSpacingFromAction()),
+ actionCollection(), QString("spacing_%1").arg(*i));
+
+ spacingAction->setExclusiveGroup("spacing");
+ spacingAction->setChecked(*i == defaultSpacing);
+ spacingActionMenu->insert(spacingAction);
+ }
+
+ actionCollection()->insert(spacingActionMenu);
+
+ KActionMenu *proportionActionMenu =
+ new KActionMenu(i18n("Du&ration Factor"), this, "proportion_actionmenu");
+
+ int defaultProportion = m_hlayout->getProportion();
+ std::vector<int> proportions = NotationHLayout::getAvailableProportions();
+
+ for (std::vector<int>::iterator i = proportions.begin();
+ i != proportions.end(); ++i) {
+
+ QString name = QString("%1%").arg(*i);
+ if (*i == 0)
+ name = i18n("None");
+
+ KToggleAction *proportionAction =
+ new KToggleAction
+ (name, 0, this,
+ SLOT(slotChangeProportionFromAction()),
+ actionCollection(), QString("proportion_%1").arg(*i));
+
+ proportionAction->setExclusiveGroup("proportion");
+ proportionAction->setChecked(*i == defaultProportion);
+ proportionActionMenu->insert(proportionAction);
+ }
+
+ actionCollection()->insert(proportionActionMenu);
+
+ KActionMenu *styleActionMenu =
+ new KActionMenu(i18n("Note &Style"), this, "note_style_actionmenu");
+
+ std::vector<NoteStyleName> styles
+ (NoteStyleFactory::getAvailableStyleNames());
+
+ for (std::vector<NoteStyleName>::iterator i = styles.begin();
+ i != styles.end(); ++i) {
+
+ QString styleQName(strtoqstr(*i));
+
+ KAction *styleAction =
+ new KAction
+ (styleQName, 0, this, SLOT(slotSetStyleFromAction()),
+ actionCollection(), "style_" + styleQName);
+
+ styleActionMenu->insert(styleAction);
+ }
+
+ actionCollection()->insert(styleActionMenu);
+
+ KActionMenu *ornamentActionMenu =
+ new KActionMenu(i18n("Use Ornament"), this, "ornament_actionmenu");
+
+
+
+ new KAction
+ (i18n("Insert Rest"), Key_P, this, SLOT(slotInsertRest()),
+ actionCollection(), QString("insert_rest"));
+
+ new KAction
+ (i18n("Switch from Note to Rest"), Key_T, this,
+ SLOT(slotSwitchFromNoteToRest()),
+ actionCollection(), QString("switch_from_note_to_rest"));
+
+ new KAction
+ (i18n("Switch from Rest to Note"), Key_Y, this,
+ SLOT(slotSwitchFromRestToNote()),
+ actionCollection(), QString("switch_from_rest_to_note"));
+
+
+ // setup Notes menu & toolbar
+ QIconSet icon;
+
+ for (NoteActionDataMap::Iterator actionDataIter = m_noteActionDataMap->begin();
+ actionDataIter != m_noteActionDataMap->end();
+ ++actionDataIter) {
+
+ NoteActionData noteActionData = **actionDataIter;
+
+ icon = QIconSet
+ (NotePixmapFactory::toQPixmap(NotePixmapFactory::makeToolbarPixmap
+ (noteActionData.pixmapName)));
+ noteAction = new KRadioAction(noteActionData.title,
+ icon,
+ noteActionData.keycode,
+ this,
+ SLOT(slotNoteAction()),
+ actionCollection(),
+ noteActionData.actionName);
+ noteAction->setExclusiveGroup("notes");
+
+ if (noteActionData.noteType == Note::Crotchet &&
+ noteActionData.dots == 0 && !noteActionData.rest) {
+ m_selectDefaultNote = noteAction;
+ }
+ }
+
+ // Note duration change actions
+ for (NoteChangeActionDataMap::Iterator actionDataIter = m_noteChangeActionDataMap->begin();
+ actionDataIter != m_noteChangeActionDataMap->end();
+ ++actionDataIter) {
+
+ NoteChangeActionData data = **actionDataIter;
+
+ icon = QIconSet
+ (NotePixmapFactory::toQPixmap(NotePixmapFactory::makeToolbarPixmap
+ (data.pixmapName)));
+
+ KAction *action = new KAction(data.title,
+ icon,
+ data.keycode,
+ this,
+ SLOT(slotNoteChangeAction()),
+ actionCollection(),
+ data.actionName);
+ }
+
+ //
+ // Accidentals
+ //
+ static QString actionsAccidental[][4] =
+ {
+ { i18n("No accidental"), "1slotNoAccidental()", "no_accidental", "accidental-none" },
+ { i18n("Follow previous accidental"), "1slotFollowAccidental()", "follow_accidental", "accidental-follow" },
+ { i18n("Sharp"), "1slotSharp()", "sharp_accidental", "accidental-sharp" },
+ { i18n("Flat"), "1slotFlat()", "flat_accidental", "accidental-flat" },
+ { i18n("Natural"), "1slotNatural()", "natural_accidental", "accidental-natural" },
+ { i18n("Double sharp"), "1slotDoubleSharp()", "double_sharp_accidental", "accidental-doublesharp" },
+ { i18n("Double flat"), "1slotDoubleFlat()", "double_flat_accidental", "accidental-doubleflat" }
+ };
+
+ for (unsigned int i = 0;
+ i < sizeof(actionsAccidental) / sizeof(actionsAccidental[0]); ++i) {
+
+ icon = QIconSet(NotePixmapFactory::toQPixmap(NotePixmapFactory::makeToolbarPixmap
+ (actionsAccidental[i][3])));
+ noteAction = new KRadioAction(actionsAccidental[i][0], icon, 0, this,
+ actionsAccidental[i][1],
+ actionCollection(), actionsAccidental[i][2]);
+ noteAction->setExclusiveGroup("accidentals");
+ }
+
+
+ //
+ // Clefs
+ //
+
+ // Treble
+ icon = QIconSet(NotePixmapFactory::toQPixmap(NotePixmapFactory::makeToolbarPixmap("clef-treble")));
+ noteAction = new KRadioAction(i18n("&Treble Clef"), icon, 0, this,
+ SLOT(slotTrebleClef()),
+ actionCollection(), "treble_clef");
+ noteAction->setExclusiveGroup("notes");
+
+ // Alto
+ icon = QIconSet(NotePixmapFactory::toQPixmap(NotePixmapFactory::makeToolbarPixmap("clef-alto")));
+ noteAction = new KRadioAction(i18n("&Alto Clef"), icon, 0, this,
+ SLOT(slotAltoClef()),
+ actionCollection(), "alto_clef");
+ noteAction->setExclusiveGroup("notes");
+
+ // Tenor
+ icon = QIconSet(NotePixmapFactory::toQPixmap(NotePixmapFactory::makeToolbarPixmap("clef-tenor")));
+ noteAction = new KRadioAction(i18n("Te&nor Clef"), icon, 0, this,
+ SLOT(slotTenorClef()),
+ actionCollection(), "tenor_clef");
+ noteAction->setExclusiveGroup("notes");
+
+ // Bass
+ icon = QIconSet(NotePixmapFactory::toQPixmap(NotePixmapFactory::makeToolbarPixmap("clef-bass")));
+ noteAction = new KRadioAction(i18n("&Bass Clef"), icon, 0, this,
+ SLOT(slotBassClef()),
+ actionCollection(), "bass_clef");
+ noteAction->setExclusiveGroup("notes");
+
+
+ icon = QIconSet(NotePixmapFactory::toQPixmap(NotePixmapFactory::makeToolbarPixmap("text")));
+ noteAction = new KRadioAction(i18n("&Text"), icon, Key_F8, this,
+ SLOT(slotText()),
+ actionCollection(), "text");
+ noteAction->setExclusiveGroup("notes");
+
+ icon = QIconSet(NotePixmapFactory::toQPixmap(NotePixmapFactory::makeToolbarPixmap("guitarchord")));
+ noteAction = new KRadioAction(i18n("&Guitar Chord"), icon, Key_F9, this,
+ SLOT(slotGuitarChord()),
+ actionCollection(), "guitarchord");
+ noteAction->setExclusiveGroup("notes");
+
+ /* icon = QIconSet(NotePixmapFactory::toQPixmap(NotePixmapFactory::makeToolbarPixmap("lilypond")));
+ noteAction = new KRadioAction(i18n("Lil&ypond Directive"), icon, Key_F9, this,
+ SLOT(slotLilyPondDirective()),
+ actionCollection(), "lilypond_directive");
+ noteAction->setExclusiveGroup("notes"); */
+
+
+ //
+ // Edition tools (eraser, selector...)
+ //
+ noteAction = new KRadioAction(i18n("&Erase"), "eraser", Key_F4,
+ this, SLOT(slotEraseSelected()),
+ actionCollection(), "erase");
+ noteAction->setExclusiveGroup("notes");
+
+ icon = QIconSet(NotePixmapFactory::toQPixmap(NotePixmapFactory::makeToolbarPixmap("select")));
+ noteAction = new KRadioAction(i18n("&Select and Edit"), icon, Key_F2,
+ this, SLOT(slotSelectSelected()),
+ actionCollection(), "select");
+ noteAction->setExclusiveGroup("notes");
+
+ icon = QIconSet(NotePixmapFactory::toQPixmap(NotePixmapFactory::makeToolbarPixmap("step_by_step")));
+ new KToggleAction(i18n("Ste&p Recording"), icon, 0, this,
+ SLOT(slotToggleStepByStep()), actionCollection(),
+ "toggle_step_by_step");
+
+
+ // Edit menu
+ new KAction(i18n("Select from Sta&rt"), 0, this,
+ SLOT(slotEditSelectFromStart()), actionCollection(),
+ "select_from_start");
+
+ new KAction(i18n("Select to &End"), 0, this,
+ SLOT(slotEditSelectToEnd()), actionCollection(),
+ "select_to_end");
+
+ new KAction(i18n("Select Whole St&aff"), Key_A + CTRL, this,
+ SLOT(slotEditSelectWholeStaff()), actionCollection(),
+ "select_whole_staff");
+
+ new KAction(i18n("C&ut and Close"), CTRL + SHIFT + Key_X, this,
+ SLOT(slotEditCutAndClose()), actionCollection(),
+ "cut_and_close");
+
+ new KAction(i18n("Pa&ste..."), CTRL + SHIFT + Key_V, this,
+ SLOT(slotEditGeneralPaste()), actionCollection(),
+ "general_paste");
+
+ new KAction(i18n("De&lete"), Key_Delete, this,
+ SLOT(slotEditDelete()), actionCollection(),
+ "delete");
+
+ new KAction(i18n("Move to Staff Above"), 0, this,
+ SLOT(slotMoveEventsUpStaff()), actionCollection(),
+ "move_events_up_staff");
+
+ new KAction(i18n("Move to Staff Below"), 0, this,
+ SLOT(slotMoveEventsDownStaff()), actionCollection(),
+ "move_events_down_staff");
+
+ //
+ // Settings menu
+ //
+ int layoutMode = m_config->readNumEntry("layoutmode", 0);
+
+ QString pixmapDir = KGlobal::dirs()->findResource("appdata", "pixmaps/");
+
+ QCanvasPixmap pixmap(pixmapDir + "/toolbar/linear-layout.xpm");
+ icon = QIconSet(pixmap);
+ KRadioAction *linearModeAction = new KRadioAction
+ (i18n("&Linear Layout"), icon, 0, this, SLOT(slotLinearMode()),
+ actionCollection(), "linear_mode");
+ linearModeAction->setExclusiveGroup("layoutMode");
+ if (layoutMode == 0)
+ linearModeAction->setChecked(true);
+
+ pixmap.load(pixmapDir + "/toolbar/continuous-page-mode.xpm");
+ icon = QIconSet(pixmap);
+ KRadioAction *continuousPageModeAction = new KRadioAction
+ (i18n("&Continuous Page Layout"), icon, 0, this, SLOT(slotContinuousPageMode()),
+ actionCollection(), "continuous_page_mode");
+ continuousPageModeAction->setExclusiveGroup("layoutMode");
+ if (layoutMode == 1)
+ continuousPageModeAction->setChecked(true);
+
+ pixmap.load(pixmapDir + "/toolbar/multi-page-mode.xpm");
+ icon = QIconSet(pixmap);
+ KRadioAction *multiPageModeAction = new KRadioAction
+ (i18n("&Multiple Page Layout"), icon, 0, this, SLOT(slotMultiPageMode()),
+ actionCollection(), "multi_page_mode");
+ multiPageModeAction->setExclusiveGroup("layoutMode");
+ if (layoutMode == 2)
+ multiPageModeAction->setChecked(true);
+
+ new KToggleAction(i18n("Show Ch&ord Name Ruler"), 0, this,
+ SLOT(slotToggleChordsRuler()),
+ actionCollection(), "show_chords_ruler");
+
+ new KToggleAction(i18n("Show Ra&w Note Ruler"), 0, this,
+ SLOT(slotToggleRawNoteRuler()),
+ actionCollection(), "show_raw_note_ruler");
+
+ new KToggleAction(i18n("Show &Tempo Ruler"), 0, this,
+ SLOT(slotToggleTempoRuler()),
+ actionCollection(), "show_tempo_ruler");
+
+ new KToggleAction(i18n("Show &Annotations"), 0, this,
+ SLOT(slotToggleAnnotations()),
+ actionCollection(), "show_annotations");
+
+ new KToggleAction(i18n("Show Lily&Pond Directives"), 0, this,
+ SLOT(slotToggleLilyPondDirectives()),
+ actionCollection(), "show_lilypond_directives");
+
+ new KAction(i18n("Open L&yric Editor"), 0, this, SLOT(slotEditLyrics()),
+ actionCollection(), "lyric_editor");
+
+ //
+ // Group menu
+ //
+ icon = QIconSet
+ (NotePixmapFactory::toQPixmap(NotePixmapFactory::makeToolbarPixmap
+ ("group-beam")));
+
+ new KAction(BeamCommand::getGlobalName(), icon, Key_B + CTRL, this,
+ SLOT(slotGroupBeam()), actionCollection(), "beam");
+
+ new KAction(AutoBeamCommand::getGlobalName(), 0, this,
+ SLOT(slotGroupAutoBeam()), actionCollection(), "auto_beam");
+
+ icon = QIconSet
+ (NotePixmapFactory::toQPixmap(NotePixmapFactory::makeToolbarPixmap
+ ("group-unbeam")));
+
+ new KAction(BreakCommand::getGlobalName(), icon, Key_U + CTRL, this,
+ SLOT(slotGroupBreak()), actionCollection(), "break_group");
+
+ icon = QIconSet
+ (NotePixmapFactory::toQPixmap(NotePixmapFactory::makeToolbarPixmap
+ ("group-simple-tuplet")));
+
+ new KAction(TupletCommand::getGlobalName(true), icon, Key_R + CTRL, this,
+ SLOT(slotGroupSimpleTuplet()), actionCollection(), "simple_tuplet");
+
+ icon = QIconSet
+ (NotePixmapFactory::toQPixmap(NotePixmapFactory::makeToolbarPixmap
+ ("group-tuplet")));
+
+ new KAction(TupletCommand::getGlobalName(false), icon, Key_T + CTRL, this,
+ SLOT(slotGroupGeneralTuplet()), actionCollection(), "tuplet");
+
+ new KAction(UnTupletCommand::getGlobalName(), 0, this,
+ SLOT(slotGroupUnTuplet()), actionCollection(), "break_tuplets");
+
+ icon = QIconSet(NotePixmapFactory::toQPixmap
+ (NotePixmapFactory::makeToolbarPixmap("triplet")));
+ (new KToggleAction(i18n("Trip&let Insert Mode"), icon, Key_G,
+ this, SLOT(slotUpdateInsertModeStatus()),
+ actionCollection(), "triplet_mode"))->
+ setChecked(false);
+
+ icon = QIconSet(NotePixmapFactory::toQPixmap
+ (NotePixmapFactory::makeToolbarPixmap("chord")));
+ (new KToggleAction(i18n("C&hord Insert Mode"), icon, Key_H,
+ this, SLOT(slotUpdateInsertModeStatus()),
+ actionCollection(), "chord_mode"))->
+ setChecked(false);
+
+ icon = QIconSet(NotePixmapFactory::toQPixmap
+ (NotePixmapFactory::makeToolbarPixmap("group-grace")));
+ (new KToggleAction(i18n("Grace Insert Mode"), icon, 0,
+ this, SLOT(slotUpdateInsertModeStatus()),
+ actionCollection(), "grace_mode"))->
+ setChecked(false);
+/*!!!
+ icon = QIconSet
+ (NotePixmapFactory::toQPixmap(NotePixmapFactory::makeToolbarPixmap
+ ("group-grace")));
+
+ new KAction(GraceCommand::getGlobalName(), icon, 0, this,
+ SLOT(slotGroupGrace()), actionCollection(), "grace");
+
+ new KAction(UnGraceCommand::getGlobalName(), 0, this,
+ SLOT(slotGroupUnGrace()), actionCollection(), "ungrace");
+*/
+ icon = QIconSet
+ (NotePixmapFactory::toQPixmap(NotePixmapFactory::makeToolbarPixmap
+ ("group-slur")));
+
+ new KAction(AddIndicationCommand::getGlobalName
+ (Indication::Slur), icon, Key_ParenRight, this,
+ SLOT(slotGroupSlur()), actionCollection(), "slur");
+
+ new KAction(AddIndicationCommand::getGlobalName
+ (Indication::PhrasingSlur), 0, Key_ParenRight + CTRL, this,
+ SLOT(slotGroupPhrasingSlur()), actionCollection(), "phrasing_slur");
+
+ icon = QIconSet
+ (NotePixmapFactory::toQPixmap(NotePixmapFactory::makeToolbarPixmap
+ ("group-glissando")));
+
+ new KAction(AddIndicationCommand::getGlobalName
+ (Indication::Glissando), icon, 0, this,
+ SLOT(slotGroupGlissando()), actionCollection(), "glissando");
+
+ icon = QIconSet
+ (NotePixmapFactory::toQPixmap(NotePixmapFactory::makeToolbarPixmap
+ ("group-crescendo")));
+
+ new KAction(AddIndicationCommand::getGlobalName
+ (Indication::Crescendo), icon, Key_Less, this,
+ SLOT(slotGroupCrescendo()), actionCollection(), "crescendo");
+
+ icon = QIconSet
+ (NotePixmapFactory::toQPixmap(NotePixmapFactory::makeToolbarPixmap
+ ("group-decrescendo")));
+
+ new KAction(AddIndicationCommand::getGlobalName
+ (Indication::Decrescendo), icon, Key_Greater, this,
+ SLOT(slotGroupDecrescendo()), actionCollection(), "decrescendo");
+
+ new KAction(AddIndicationCommand::getGlobalName
+ (Indication::QuindicesimaUp), 0, 0, this,
+ SLOT(slotGroupOctave2Up()), actionCollection(), "octave_2up");
+
+ icon = QIconSet
+ (NotePixmapFactory::toQPixmap(NotePixmapFactory::makeToolbarPixmap
+ ("group-ottava")));
+
+ new KAction(AddIndicationCommand::getGlobalName
+ (Indication::OttavaUp), icon, 0, this,
+ SLOT(slotGroupOctaveUp()), actionCollection(), "octave_up");
+
+ new KAction(AddIndicationCommand::getGlobalName
+ (Indication::OttavaDown), 0, 0, this,
+ SLOT(slotGroupOctaveDown()), actionCollection(), "octave_down");
+
+ new KAction(AddIndicationCommand::getGlobalName
+ (Indication::QuindicesimaDown), 0, 0, this,
+ SLOT(slotGroupOctave2Down()), actionCollection(), "octave_2down");
+
+ icon = QIconSet
+ (NotePixmapFactory::toQPixmap(NotePixmapFactory::makeToolbarPixmap
+ ("group-chord")));
+ new KAction(MakeChordCommand::getGlobalName(), icon, 0, this,
+ SLOT(slotGroupMakeChord()), actionCollection(), "make_chord");
+
+ // setup Transforms menu
+ new KAction(NormalizeRestsCommand::getGlobalName(), Key_N + CTRL, this,
+ SLOT(slotTransformsNormalizeRests()), actionCollection(),
+ "normalize_rests");
+
+ new KAction(CollapseRestsCommand::getGlobalName(), 0, this,
+ SLOT(slotTransformsCollapseRests()), actionCollection(),
+ "collapse_rests_aggressively");
+
+ new KAction(CollapseNotesCommand::getGlobalName(), Key_Equal + CTRL, this,
+ SLOT(slotTransformsCollapseNotes()), actionCollection(),
+ "collapse_notes");
+
+ icon = QIconSet
+ (NotePixmapFactory::toQPixmap(NotePixmapFactory::makeToolbarPixmap
+ ("transforms-tie")));
+
+ new KAction(TieNotesCommand::getGlobalName(), icon, Key_AsciiTilde, this,
+ SLOT(slotTransformsTieNotes()), actionCollection(),
+ "tie_notes");
+
+ new KAction(UntieNotesCommand::getGlobalName(), 0, this,
+ SLOT(slotTransformsUntieNotes()), actionCollection(),
+ "untie_notes");
+
+ new KAction(MakeNotesViableCommand::getGlobalName(), 0, this,
+ SLOT(slotTransformsMakeNotesViable()), actionCollection(),
+ "make_notes_viable");
+
+ icon = QIconSet
+ (NotePixmapFactory::toQPixmap(NotePixmapFactory::makeToolbarPixmap
+ ("transforms-decounterpoint")));
+
+ new KAction(DeCounterpointCommand::getGlobalName(), icon, 0, this,
+ SLOT(slotTransformsDeCounterpoint()), actionCollection(),
+ "de_counterpoint");
+
+ new KAction(ChangeStemsCommand::getGlobalName(true),
+ 0, Key_PageUp + CTRL, this,
+ SLOT(slotTransformsStemsUp()), actionCollection(),
+ "stems_up");
+
+ new KAction(ChangeStemsCommand::getGlobalName(false),
+ 0, Key_PageDown + CTRL, this,
+ SLOT(slotTransformsStemsDown()), actionCollection(),
+ "stems_down");
+
+ new KAction(RestoreStemsCommand::getGlobalName(), 0, this,
+ SLOT(slotTransformsRestoreStems()), actionCollection(),
+ "restore_stems");
+
+ new KAction(ChangeSlurPositionCommand::getGlobalName(true),
+ 0, this,
+ SLOT(slotTransformsSlursAbove()), actionCollection(),
+ "slurs_above");
+
+ new KAction(ChangeSlurPositionCommand::getGlobalName(false),
+ 0, this,
+ SLOT(slotTransformsSlursBelow()), actionCollection(),
+ "slurs_below");
+
+ new KAction(RestoreSlursCommand::getGlobalName(), 0, this,
+ SLOT(slotTransformsRestoreSlurs()), actionCollection(),
+ "restore_slurs");
+
+ new KAction(ChangeTiePositionCommand::getGlobalName(true),
+ 0, this,
+ SLOT(slotTransformsTiesAbove()), actionCollection(),
+ "ties_above");
+
+ new KAction(ChangeTiePositionCommand::getGlobalName(false),
+ 0, this,
+ SLOT(slotTransformsTiesBelow()), actionCollection(),
+ "ties_below");
+
+ new KAction(RestoreTiesCommand::getGlobalName(), 0, this,
+ SLOT(slotTransformsRestoreTies()), actionCollection(),
+ "restore_ties");
+
+ icon = QIconSet
+ (NotePixmapFactory::toQPixmap(NotePixmapFactory::makeToolbarPixmap
+ ("accmenu-doubleflat")));
+
+ new KAction(RespellCommand::getGlobalName
+ (RespellCommand::Set, Accidentals::DoubleFlat),
+ icon, 0, this,
+ SLOT(slotRespellDoubleFlat()), actionCollection(),
+ "respell_doubleflat");
+
+ icon = QIconSet
+ (NotePixmapFactory::toQPixmap(NotePixmapFactory::makeToolbarPixmap
+ ("accmenu-flat")));
+
+ new KAction(RespellCommand::getGlobalName
+ (RespellCommand::Set, Accidentals::Flat),
+ icon, 0, this,
+ SLOT(slotRespellFlat()), actionCollection(),
+ "respell_flat");
+
+ icon = QIconSet
+ (NotePixmapFactory::toQPixmap(NotePixmapFactory::makeToolbarPixmap
+ ("accmenu-natural")));
+
+ new KAction(RespellCommand::getGlobalName
+ (RespellCommand::Set, Accidentals::Natural),
+ icon, 0, this,
+ SLOT(slotRespellNatural()), actionCollection(),
+ "respell_natural");
+
+ icon = QIconSet
+ (NotePixmapFactory::toQPixmap(NotePixmapFactory::makeToolbarPixmap
+ ("accmenu-sharp")));
+
+ new KAction(RespellCommand::getGlobalName
+ (RespellCommand::Set, Accidentals::Sharp),
+ icon, 0, this,
+ SLOT(slotRespellSharp()), actionCollection(),
+ "respell_sharp");
+
+ icon = QIconSet
+ (NotePixmapFactory::toQPixmap(NotePixmapFactory::makeToolbarPixmap
+ ("accmenu-doublesharp")));
+
+ new KAction(RespellCommand::getGlobalName
+ (RespellCommand::Set, Accidentals::DoubleSharp),
+ icon, 0, this,
+ SLOT(slotRespellDoubleSharp()), actionCollection(),
+ "respell_doublesharp");
+
+ new KAction(RespellCommand::getGlobalName
+ (RespellCommand::Up, Accidentals::NoAccidental),
+ Key_Up + CTRL + SHIFT, this,
+ SLOT(slotRespellUp()), actionCollection(),
+ "respell_up");
+
+ new KAction(RespellCommand::getGlobalName
+ (RespellCommand::Down, Accidentals::NoAccidental),
+ Key_Down + CTRL + SHIFT, this,
+ SLOT(slotRespellDown()), actionCollection(),
+ "respell_down");
+
+ new KAction(RespellCommand::getGlobalName
+ (RespellCommand::Restore, Accidentals::NoAccidental),
+ 0, this,
+ SLOT(slotRespellRestore()), actionCollection(),
+ "respell_restore");
+
+ new KAction(MakeAccidentalsCautionaryCommand::getGlobalName(true),
+ 0, this,
+ SLOT(slotShowCautionary()), actionCollection(),
+ "show_cautionary");
+
+ new KAction(MakeAccidentalsCautionaryCommand::getGlobalName(false),
+ 0, this,
+ SLOT(slotCancelCautionary()), actionCollection(),
+ "cancel_cautionary");
+
+ icon = QIconSet
+ (NotePixmapFactory::toQPixmap(NotePixmapFactory::makeToolbarPixmap
+ ("quantize")));
+
+ new KAction(EventQuantizeCommand::getGlobalName(), icon, Key_Equal, this,
+ SLOT(slotTransformsQuantize()), actionCollection(),
+ "quantize");
+
+ new KAction(FixNotationQuantizeCommand::getGlobalName(), 0,
+ this, SLOT(slotTransformsFixQuantization()), actionCollection(),
+ "fix_quantization");
+
+ new KAction(RemoveNotationQuantizeCommand::getGlobalName(), 0,
+ this, SLOT(slotTransformsRemoveQuantization()), actionCollection(),
+ "remove_quantization");
+
+ new KAction(InterpretCommand::getGlobalName(), 0,
+ this, SLOT(slotTransformsInterpret()), actionCollection(),
+ "interpret");
+
+ new KAction(i18n("&Dump selected events to stderr"), 0, this,
+ SLOT(slotDebugDump()), actionCollection(), "debug_dump");
+
+ for (MarkActionDataMap::Iterator i = m_markActionDataMap->begin();
+ i != m_markActionDataMap->end(); ++i) {
+
+ const MarkActionData &markActionData = **i;
+
+ icon = QIconSet(NotePixmapFactory::toQPixmap
+ (NotePixmapFactory::makeMarkMenuPixmap(markActionData.mark)));
+
+ new KAction(markActionData.title,
+ icon,
+ markActionData.keycode,
+ this,
+ SLOT(slotAddMark()),
+ actionCollection(),
+ markActionData.actionName);
+ }
+
+ icon = QIconSet
+ (NotePixmapFactory::toQPixmap(NotePixmapFactory::makeToolbarPixmap
+ ("text-mark")));
+
+ new KAction(AddTextMarkCommand::getGlobalName(), icon, 0, this,
+ SLOT(slotMarksAddTextMark()), actionCollection(),
+ "add_text_mark");
+
+ new KAction(AddFingeringMarkCommand::getGlobalName("0"), 0, Key_0 + ALT, this,
+ SLOT(slotMarksAddFingeringMarkFromAction()), actionCollection(),
+ "add_fingering_0");
+
+ new KAction(AddFingeringMarkCommand::getGlobalName("1"), 0, Key_1 + ALT, this,
+ SLOT(slotMarksAddFingeringMarkFromAction()), actionCollection(),
+ "add_fingering_1");
+
+ new KAction(AddFingeringMarkCommand::getGlobalName("2"), 0, Key_2 + ALT, this,
+ SLOT(slotMarksAddFingeringMarkFromAction()), actionCollection(),
+ "add_fingering_2");
+
+ new KAction(AddFingeringMarkCommand::getGlobalName("3"), 0, Key_3 + ALT, this,
+ SLOT(slotMarksAddFingeringMarkFromAction()), actionCollection(),
+ "add_fingering_3");
+
+ new KAction(AddFingeringMarkCommand::getGlobalName("4"), 0, Key_4 + ALT, this,
+ SLOT(slotMarksAddFingeringMarkFromAction()), actionCollection(),
+ "add_fingering_4");
+
+ new KAction(AddFingeringMarkCommand::getGlobalName("5"), 0, Key_5 + ALT, this,
+ SLOT(slotMarksAddFingeringMarkFromAction()), actionCollection(),
+ "add_fingering_5");
+
+ new KAction(AddFingeringMarkCommand::getGlobalName("+"), 0, Key_9 + ALT, this,
+ SLOT(slotMarksAddFingeringMarkFromAction()), actionCollection(),
+ "add_fingering_plus");
+
+ new KAction(AddFingeringMarkCommand::getGlobalName(), 0, 0, this,
+ SLOT(slotMarksAddFingeringMark()), actionCollection(),
+ "add_fingering_mark");
+
+ new KAction(RemoveMarksCommand::getGlobalName(), 0, this,
+ SLOT(slotMarksRemoveMarks()), actionCollection(),
+ "remove_marks");
+
+ new KAction(RemoveFingeringMarksCommand::getGlobalName(), 0, this,
+ SLOT(slotMarksRemoveFingeringMarks()), actionCollection(),
+ "remove_fingering_marks");
+
+ new KAction(i18n("Ma&ke Ornament..."), 0, this,
+ SLOT(slotMakeOrnament()), actionCollection(),
+ "make_ornament");
+
+ new KAction(i18n("Trigger &Ornament..."), 0, this,
+ SLOT(slotUseOrnament()), actionCollection(),
+ "use_ornament");
+
+ new KAction(i18n("Remove Ornament..."), 0, this,
+ SLOT(slotRemoveOrnament()), actionCollection(),
+ "remove_ornament");
+
+ static QString slashTitles[] = {
+ i18n("&None"), "&1", "&2", "&3", "&4", "&5"
+ };
+ for (int i = 0; i <= 5; ++i) {
+ new KAction(slashTitles[i], 0, this,
+ SLOT(slotAddSlashes()), actionCollection(),
+ QString("slashes_%1").arg(i));
+ }
+
+ new KAction(ClefInsertionCommand::getGlobalName(), 0, this,
+ SLOT(slotEditAddClef()), actionCollection(),
+ "add_clef");
+
+ new KAction(KeyInsertionCommand::getGlobalName(), 0, this,
+ SLOT(slotEditAddKeySignature()), actionCollection(),
+ "add_key_signature");
+
+ new KAction(SustainInsertionCommand::getGlobalName(true), 0, this,
+ SLOT(slotEditAddSustainDown()), actionCollection(),
+ "add_sustain_down");
+
+ new KAction(SustainInsertionCommand::getGlobalName(false), 0, this,
+ SLOT(slotEditAddSustainUp()), actionCollection(),
+ "add_sustain_up");
+
+ new KAction(TransposeCommand::getDiatonicGlobalName(false), 0, this,
+ SLOT(slotEditTranspose()), actionCollection(),
+ "transpose_segment");
+
+ new KAction(i18n("Convert Notation For..."), 0, this,
+ SLOT(slotEditSwitchPreset()), actionCollection(),
+ "switch_preset");
+
+
+ // setup Settings menu
+ static QString actionsToolbars[][4] =
+ {
+ { i18n("Show T&ools Toolbar"), "1slotToggleToolsToolBar()", "show_tools_toolbar", "palette-tools" },
+ { i18n("Show &Notes Toolbar"), "1slotToggleNotesToolBar()", "show_notes_toolbar", "palette-notes" },
+ { i18n("Show &Rests Toolbar"), "1slotToggleRestsToolBar()", "show_rests_toolbar", "palette-rests" },
+ { i18n("Show &Accidentals Toolbar"), "1slotToggleAccidentalsToolBar()", "show_accidentals_toolbar", "palette-accidentals" },
+ { i18n("Show Cle&fs Toolbar"), "1slotToggleClefsToolBar()", "show_clefs_toolbar",
+ "palette-clefs" },
+ { i18n("Show &Marks Toolbar"), "1slotToggleMarksToolBar()", "show_marks_toolbar",
+ "palette-marks" },
+ { i18n("Show &Group Toolbar"), "1slotToggleGroupToolBar()", "show_group_toolbar",
+ "palette-group" },
+ { i18n("Show &Layout Toolbar"), "1slotToggleLayoutToolBar()", "show_layout_toolbar",
+ "palette-font" },
+ { i18n("Show Trans&port Toolbar"), "1slotToggleTransportToolBar()", "show_transport_toolbar",
+ "palette-transport" },
+ { i18n("Show M&eta Toolbar"), "1slotToggleMetaToolBar()", "show_meta_toolbar",
+ "palette-meta" }
+ };
+
+ for (unsigned int i = 0;
+ i < sizeof(actionsToolbars) / sizeof(actionsToolbars[0]); ++i) {
+
+ icon = QIconSet(NotePixmapFactory::toQPixmap(NotePixmapFactory::makeToolbarPixmap(actionsToolbars[i][3])));
+
+ new KToggleAction(actionsToolbars[i][0], icon, 0,
+ this, actionsToolbars[i][1],
+ actionCollection(), actionsToolbars[i][2]);
+ }
+
+ new KAction(i18n("Cursor &Back"), 0, Key_Left, this,
+ SLOT(slotStepBackward()), actionCollection(),
+ "cursor_back");
+
+ new KAction(i18n("Cursor &Forward"), 0, Key_Right, this,
+ SLOT(slotStepForward()), actionCollection(),
+ "cursor_forward");
+
+ new KAction(i18n("Cursor Ba&ck Bar"), 0, Key_Left + CTRL, this,
+ SLOT(slotJumpBackward()), actionCollection(),
+ "cursor_back_bar");
+
+ new KAction(i18n("Cursor For&ward Bar"), 0, Key_Right + CTRL, this,
+ SLOT(slotJumpForward()), actionCollection(),
+ "cursor_forward_bar");
+
+ new KAction(i18n("Cursor Back and Se&lect"), SHIFT + Key_Left, this,
+ SLOT(slotExtendSelectionBackward()), actionCollection(),
+ "extend_selection_backward");
+
+ new KAction(i18n("Cursor Forward and &Select"), SHIFT + Key_Right, this,
+ SLOT(slotExtendSelectionForward()), actionCollection(),
+ "extend_selection_forward");
+
+ new KAction(i18n("Cursor Back Bar and Select"), SHIFT + CTRL + Key_Left, this,
+ SLOT(slotExtendSelectionBackwardBar()), actionCollection(),
+ "extend_selection_backward_bar");
+
+ new KAction(i18n("Cursor Forward Bar and Select"), SHIFT + CTRL + Key_Right, this,
+ SLOT(slotExtendSelectionForwardBar()), actionCollection(),
+ "extend_selection_forward_bar");
+
+ /*!!! not here yet
+ new KAction(i18n("Move Selection Left"), Key_Minus, this,
+ SLOT(slotMoveSelectionLeft()), actionCollection(),
+ "move_selection_left");
+ */
+
+ new KAction(i18n("Cursor to St&art"), 0,
+ /* #1025717: conflicting meanings for ctrl+a - dupe with Select All
+ Key_A + CTRL, */ this,
+ SLOT(slotJumpToStart()), actionCollection(),
+ "cursor_start");
+
+ new KAction(i18n("Cursor to &End"), 0, Key_E + CTRL, this,
+ SLOT(slotJumpToEnd()), actionCollection(),
+ "cursor_end");
+
+ new KAction(i18n("Cursor &Up Staff"), 0, Key_Up + SHIFT, this,
+ SLOT(slotCurrentStaffUp()), actionCollection(),
+ "cursor_up_staff");
+
+ new KAction(i18n("Cursor &Down Staff"), 0, Key_Down + SHIFT, this,
+ SLOT(slotCurrentStaffDown()), actionCollection(),
+ "cursor_down_staff");
+
+ new KAction(i18n("Cursor Pre&vious Segment"), 0, Key_Prior + ALT, this,
+ SLOT(slotCurrentSegmentPrior()), actionCollection(),
+ "cursor_prior_segment");
+
+ new KAction(i18n("Cursor Ne&xt Segment"), 0, Key_Next + ALT, this,
+ SLOT(slotCurrentSegmentNext()), actionCollection(),
+ "cursor_next_segment");
+
+ icon = QIconSet(NotePixmapFactory::toQPixmap(NotePixmapFactory::makeToolbarPixmap
+ ("transport-cursor-to-pointer")));
+ new KAction(i18n("Cursor to &Playback Pointer"), icon, 0, this,
+ SLOT(slotJumpCursorToPlayback()), actionCollection(),
+ "cursor_to_playback_pointer");
+
+ icon = QIconSet(NotePixmapFactory::toQPixmap(NotePixmapFactory::makeToolbarPixmap
+ ("transport-play")));
+ KAction *play = new KAction(i18n("&Play"), icon, Key_Enter, this,
+ SIGNAL(play()), actionCollection(), "play");
+ // Alternative shortcut for Play
+ KShortcut playShortcut = play->shortcut();
+ playShortcut.append( KKey(Key_Return + CTRL) );
+ play->setShortcut(playShortcut);
+
+ icon = QIconSet(NotePixmapFactory::toQPixmap(NotePixmapFactory::makeToolbarPixmap
+ ("transport-stop")));
+ new KAction(i18n("&Stop"), icon, Key_Insert, this,
+ SIGNAL(stop()), actionCollection(), "stop");
+
+ icon = QIconSet(NotePixmapFactory::toQPixmap(NotePixmapFactory::makeToolbarPixmap
+ ("transport-rewind")));
+ new KAction(i18n("Re&wind"), icon, Key_End, this,
+ SIGNAL(rewindPlayback()), actionCollection(),
+ "playback_pointer_back_bar");
+
+ icon = QIconSet(NotePixmapFactory::toQPixmap(NotePixmapFactory::makeToolbarPixmap
+ ("transport-ffwd")));
+ new KAction(i18n("&Fast Forward"), icon, Key_PageDown, this,
+ SIGNAL(fastForwardPlayback()), actionCollection(),
+ "playback_pointer_forward_bar");
+
+ icon = QIconSet(NotePixmapFactory::toQPixmap(NotePixmapFactory::makeToolbarPixmap
+ ("transport-rewind-end")));
+ new KAction(i18n("Rewind to &Beginning"), icon, 0, this,
+ SIGNAL(rewindPlaybackToBeginning()), actionCollection(),
+ "playback_pointer_start");
+
+ icon = QIconSet(NotePixmapFactory::toQPixmap(NotePixmapFactory::makeToolbarPixmap
+ ("transport-ffwd-end")));
+ new KAction(i18n("Fast Forward to &End"), icon, 0, this,
+ SIGNAL(fastForwardPlaybackToEnd()), actionCollection(),
+ "playback_pointer_end");
+
+ icon = QIconSet(NotePixmapFactory::toQPixmap(NotePixmapFactory::makeToolbarPixmap
+ ("transport-pointer-to-cursor")));
+ new KAction(i18n("Playback Pointer to &Cursor"), icon, 0, this,
+ SLOT(slotJumpPlaybackToCursor()), actionCollection(),
+ "playback_pointer_to_cursor");
+
+ icon = QIconSet(NotePixmapFactory::toQPixmap(NotePixmapFactory::makeToolbarPixmap
+ ("transport-solo")));
+ new KToggleAction(i18n("&Solo"), icon, 0, this,
+ SLOT(slotToggleSolo()), actionCollection(),
+ "toggle_solo");
+
+ icon = QIconSet(NotePixmapFactory::toQPixmap(NotePixmapFactory::makeToolbarPixmap
+ ("transport-tracking")));
+ (new KToggleAction(i18n("Scro&ll to Follow Playback"), icon, Key_Pause, this,
+ SLOT(slotToggleTracking()), actionCollection(),
+ "toggle_tracking"))->setChecked(m_playTracking);
+
+ icon = QIconSet(NotePixmapFactory::toQPixmap(NotePixmapFactory::makeToolbarPixmap
+ ("transport-panic")));
+ new KAction(i18n("Panic"), icon, Key_P + CTRL + ALT, this,
+ SIGNAL(panic()), actionCollection(), "panic");
+
+ new KAction(i18n("Set Loop to Selection"), Key_Semicolon + CTRL, this,
+ SLOT(slotPreviewSelection()), actionCollection(),
+ "preview_selection");
+
+ new KAction(i18n("Clear L&oop"), Key_Colon + CTRL, this,
+ SLOT(slotClearLoop()), actionCollection(),
+ "clear_loop");
+
+ new KAction(i18n("Clear Selection"), Key_Escape, this,
+ SLOT(slotClearSelection()), actionCollection(),
+ "clear_selection");
+
+ // QString pixmapDir =
+ // KGlobal::dirs()->findResource("appdata", "pixmaps/");
+ // icon = QIconSet(QCanvasPixmap(pixmapDir + "/toolbar/eventfilter.xpm"));
+ new KAction(i18n("&Filter Selection"), "filter", Key_F + CTRL, this,
+ SLOT(slotFilterSelection()), actionCollection(),
+ "filter_selection");
+
+ new KAction(i18n("Push &Left"), 0, this,
+ SLOT(slotFinePositionLeft()), actionCollection(),
+ "fine_position_left");
+
+ new KAction(i18n("Push &Right"), 0, this,
+ SLOT(slotFinePositionRight()), actionCollection(),
+ "fine_position_right");
+
+ new KAction(i18n("Push &Up"), 0, this,
+ SLOT(slotFinePositionUp()), actionCollection(),
+ "fine_position_up");
+
+ new KAction(i18n("Push &Down"), 0, this,
+ SLOT(slotFinePositionDown()), actionCollection(),
+ "fine_position_down");
+
+ new KAction(i18n("&Restore Positions"), 0, this,
+ SLOT(slotFinePositionRestore()), actionCollection(),
+ "fine_position_restore");
+
+ new KAction(i18n("Make &Invisible"), 0, this,
+ SLOT(slotMakeInvisible()), actionCollection(),
+ "make_invisible");
+
+ new KAction(i18n("Make &Visible"), 0, this,
+ SLOT(slotMakeVisible()), actionCollection(),
+ "make_visible");
+
+ new KAction(i18n("Toggle Dot"), Key_Period, this,
+ SLOT(slotToggleDot()), actionCollection(),
+ "toggle_dot");
+
+ new KAction(i18n("Add Dot"), Key_Period + CTRL, this,
+ SLOT(slotAddDot()), actionCollection(),
+ "add_dot");
+
+ new KAction(i18n("Add Dot"), Key_Period + CTRL + ALT, this,
+ SLOT(slotAddDotNotationOnly()), actionCollection(),
+ "add_notation_dot");
+
+ createGUI(getRCFileName(), false);
+}
+
+bool
+NotationView::isInChordMode()
+{
+ return ((KToggleAction *)actionCollection()->action("chord_mode"))->
+ isChecked();
+}
+
+bool
+NotationView::isInTripletMode()
+{
+ return ((KToggleAction *)actionCollection()->action("triplet_mode"))->
+ isChecked();
+}
+
+bool
+NotationView::isInGraceMode()
+{
+ return ((KToggleAction *)actionCollection()->action("grace_mode"))->
+ isChecked();
+}
+
+void
+NotationView::setupFontSizeMenu(std::string oldFontName)
+{
+ if (oldFontName != "") {
+
+ std::vector<int> sizes = NoteFontFactory::getScreenSizes(oldFontName);
+
+ for (unsigned int i = 0; i < sizes.size(); ++i) {
+ KAction *action =
+ actionCollection()->action
+ (QString("note_font_size_%1").arg(sizes[i]));
+ m_fontSizeActionMenu->remove
+ (action);
+
+ // Don't delete -- that could cause a crash when this
+ // function is called from the action itself. Instead
+ // we reuse and reinsert existing actions below.
+ }
+ }
+
+ std::vector<int> sizes = NoteFontFactory::getScreenSizes(m_fontName);
+
+ for (unsigned int i = 0; i < sizes.size(); ++i) {
+
+ QString actionName = QString("note_font_size_%1").arg(sizes[i]);
+
+ KToggleAction *sizeAction = dynamic_cast<KToggleAction *>
+ (actionCollection()->action(actionName));
+
+ if (!sizeAction) {
+ sizeAction =
+ new KToggleAction(i18n("1 pixel", "%n pixels", sizes[i]),
+ 0, this,
+ SLOT(slotChangeFontSizeFromAction()),
+ actionCollection(), actionName);
+ }
+
+ sizeAction->setChecked(sizes[i] == m_fontSize);
+ m_fontSizeActionMenu->insert(sizeAction);
+ }
+}
+
+LinedStaff *
+NotationView::getLinedStaff(int i)
+{
+ return getNotationStaff(i);
+}
+
+LinedStaff *
+NotationView::getLinedStaff(const Segment &segment)
+{
+ return getNotationStaff(segment);
+}
+
+NotationStaff *
+NotationView::getNotationStaff(const Segment &segment)
+{
+ for (unsigned int i = 0; i < m_staffs.size(); ++i) {
+ if (&(m_staffs[i]->getSegment()) == &segment)
+ return m_staffs[i];
+ }
+ return 0;
+}
+
+bool NotationView::isCurrentStaff(int i)
+{
+ return getCurrentSegment() == &(m_staffs[i]->getSegment());
+}
+
+void NotationView::initLayoutToolbar()
+{
+ KToolBar *layoutToolbar = toolBar("Layout Toolbar");
+
+ if (!layoutToolbar) {
+ std::cerr
+ << "NotationView::initLayoutToolbar() : layout toolbar not found"
+ << std::endl;
+ return ;
+ }
+
+ new QLabel(i18n(" Font: "), layoutToolbar, "font label");
+
+ //
+ // font combo
+ //
+ m_fontCombo = new KComboBox(layoutToolbar);
+ m_fontCombo->setEditable(false);
+
+ std::set
+ <std::string> fs(NoteFontFactory::getFontNames());
+ std::vector<std::string> f(fs.begin(), fs.end());
+ std::sort(f.begin(), f.end());
+
+ bool foundFont = false;
+
+ for (std::vector<std::string>::iterator i = f.begin(); i != f.end(); ++i) {
+
+ QString fontQName(strtoqstr(*i));
+
+ m_fontCombo->insertItem(fontQName);
+ if (fontQName.lower() == strtoqstr(m_fontName).lower()) {
+ m_fontCombo->setCurrentItem(m_fontCombo->count() - 1);
+ foundFont = true;
+ }
+ }
+
+ if (!foundFont) {
+ KMessageBox::sorry
+ (this, i18n("Unknown font \"%1\", using default").arg
+ (strtoqstr(m_fontName)));
+ m_fontName = NoteFontFactory::getDefaultFontName();
+ }
+
+ connect(m_fontCombo, SIGNAL(activated(const QString &)),
+ this, SLOT(slotChangeFont(const QString &)));
+
+ new QLabel(i18n(" Size: "), layoutToolbar, "size label");
+
+ QString value;
+
+ //
+ // font size combo
+ //
+ std::vector<int> sizes = NoteFontFactory::getScreenSizes(m_fontName);
+ m_fontSizeCombo = new KComboBox(layoutToolbar, "font size combo");
+
+ for (std::vector<int>::iterator i = sizes.begin(); i != sizes.end(); ++i) {
+
+ value.setNum(*i);
+ m_fontSizeCombo->insertItem(value);
+ }
+ // set combo's current value to default
+ value.setNum(m_fontSize);
+ m_fontSizeCombo->setCurrentText(value);
+
+ connect(m_fontSizeCombo, SIGNAL(activated(const QString&)),
+ this, SLOT(slotChangeFontSizeFromStringValue(const QString&)));
+
+ new QLabel(i18n(" Spacing: "), layoutToolbar, "spacing label");
+
+ //
+ // spacing combo
+ //
+ int defaultSpacing = m_hlayout->getSpacing();
+ std::vector<int> spacings = NotationHLayout::getAvailableSpacings();
+
+ m_spacingCombo = new KComboBox(layoutToolbar, "spacing combo");
+ for (std::vector<int>::iterator i = spacings.begin(); i != spacings.end(); ++i) {
+
+ value.setNum(*i);
+ value += "%";
+ m_spacingCombo->insertItem(value);
+ }
+ // set combo's current value to default
+ value.setNum(defaultSpacing);
+ value += "%";
+ m_spacingCombo->setCurrentText(value);
+
+ connect(m_spacingCombo, SIGNAL(activated(const QString&)),
+ this, SLOT(slotChangeSpacingFromStringValue(const QString&)));
+}
+
+void NotationView::initStatusBar()
+{
+ KStatusBar* sb = statusBar();
+
+ m_hoveredOverNoteName = new QLabel(sb);
+ m_hoveredOverNoteName->setMinimumWidth(32);
+
+ m_hoveredOverAbsoluteTime = new QLabel(sb);
+ m_hoveredOverAbsoluteTime->setMinimumWidth(160);
+
+ sb->addWidget(m_hoveredOverAbsoluteTime);
+ sb->addWidget(m_hoveredOverNoteName);
+
+ QHBox *hbox = new QHBox(sb);
+ m_currentNotePixmap = new QLabel(hbox);
+ m_currentNotePixmap->setMinimumWidth(20);
+ m_insertModeLabel = new QLabel(hbox);
+ m_annotationsLabel = new QLabel(hbox);
+ m_lilyPondDirectivesLabel = new QLabel(hbox);
+ sb->addWidget(hbox);
+
+ sb->insertItem(KTmpStatusMsg::getDefaultMsg(),
+ KTmpStatusMsg::getDefaultId(), 1);
+ sb->setItemAlignment(KTmpStatusMsg::getDefaultId(),
+ AlignLeft | AlignVCenter);
+
+ m_selectionCounter = new QLabel(sb);
+ sb->addWidget(m_selectionCounter);
+
+ m_progressBar = new ProgressBar(100, true, sb);
+ m_progressBar->setMinimumWidth(100);
+ sb->addWidget(m_progressBar);
+}
+
+QSize NotationView::getViewSize()
+{
+ return canvas()->size();
+}
+
+void NotationView::setViewSize(QSize s)
+{
+ canvas()->resize(s.width(), s.height());
+
+ if ( (m_pageMode == LinedStaff::LinearMode)
+ && (m_showHeadersGroup != HeadersGroup::ShowNever)) {
+ m_headersGroup->completeToHeight(s.height());
+ }
+}
+
+void
+NotationView::setPageMode(LinedStaff::PageMode pageMode)
+{
+ m_pageMode = pageMode;
+
+ if (pageMode != LinedStaff::LinearMode) {
+ if (m_topStandardRuler)
+ m_topStandardRuler->hide();
+ if (m_bottomStandardRuler)
+ m_bottomStandardRuler->hide();
+ if (m_chordNameRuler)
+ m_chordNameRuler->hide();
+ if (m_rawNoteRuler)
+ m_rawNoteRuler->hide();
+ if (m_tempoRuler)
+ m_tempoRuler->hide();
+ hideHeadersGroup();
+ } else {
+ if (m_topStandardRuler)
+ m_topStandardRuler->show();
+ if (m_bottomStandardRuler)
+ m_bottomStandardRuler->show();
+ if (m_chordNameRuler && getToggleAction("show_chords_ruler")->isChecked())
+ m_chordNameRuler->show();
+ if (m_rawNoteRuler && getToggleAction("show_raw_note_ruler")->isChecked())
+ m_rawNoteRuler->show();
+ if (m_tempoRuler && getToggleAction("show_tempo_ruler")->isChecked())
+ m_tempoRuler->show();
+ showHeadersGroup();
+ }
+
+ stateChanged("linear_mode",
+ (pageMode == LinedStaff::LinearMode ? KXMLGUIClient::StateNoReverse :
+ KXMLGUIClient::StateReverse));
+
+ int pageWidth = getPageWidth();
+ int topMargin = 0, leftMargin = 0;
+ getPageMargins(leftMargin, topMargin);
+
+ m_hlayout->setPageMode(pageMode != LinedStaff::LinearMode);
+ m_hlayout->setPageWidth(pageWidth - leftMargin * 2);
+
+ NOTATION_DEBUG << "NotationView::setPageMode: set layout's page width to "
+ << (pageWidth - leftMargin * 2) << endl;
+
+ positionStaffs();
+
+ bool layoutApplied = applyLayout();
+ if (!layoutApplied)
+ KMessageBox::sorry(0, "Couldn't apply layout");
+ else {
+ for (unsigned int i = 0; i < m_staffs.size(); ++i) {
+ m_staffs[i]->markChanged();
+ }
+ }
+
+ if (!m_printMode) {
+ // Layout is done : Time related to left of canvas should now
+ // correctly be determined and track headers contents be drawn.
+ m_headersGroup->slotUpdateAllHeaders(0, 0, true);
+ }
+
+ positionPages();
+
+ if (!m_printMode) {
+ updateView();
+ slotSetInsertCursorPosition(getInsertionTime(), false, false);
+ slotSetPointerPosition(getDocument()->getComposition().getPosition(), false);
+ }
+
+ Profiles::getInstance()->dump();
+}
+
+int
+NotationView::getPageWidth()
+{
+ if (m_pageMode != LinedStaff::MultiPageMode) {
+
+ if (isInPrintMode() && getCanvasView() && getCanvasView()->canvas())
+ return getCanvasView()->canvas()->width();
+
+ if (getCanvasView()) {
+ return
+ getCanvasView()->width() -
+ getCanvasView()->verticalScrollBar()->width() -
+ m_leftGutter - 10;
+ }
+
+ return width() - 50;
+
+ } else {
+
+ //!!! For the moment we use A4 for this calculation
+
+ double printSizeMm = 25.4 * ((double)m_printSize / 72.0);
+ double mmPerPixel = printSizeMm / (double)m_notePixmapFactory->getSize();
+ return (int)(210.0 / mmPerPixel);
+ }
+}
+
+int
+NotationView::getPageHeight()
+{
+ if (m_pageMode != LinedStaff::MultiPageMode) {
+
+ if (isInPrintMode() && getCanvasView() && getCanvasView()->canvas())
+ return getCanvasView()->canvas()->height();
+
+ if (getCanvasView()) {
+ return getCanvasView()->height();
+ }
+
+ return (height() > 200 ? height() - 100 : height());
+
+ } else {
+
+ //!!! For the moment we use A4 for this calculation
+
+ double printSizeMm = 25.4 * ((double)m_printSize / 72.0);
+ double mmPerPixel = printSizeMm / (double)m_notePixmapFactory->getSize();
+ return (int)(297.0 / mmPerPixel);
+ }
+}
+
+void
+NotationView::getPageMargins(int &left, int &top)
+{
+ if (m_pageMode != LinedStaff::MultiPageMode) {
+
+ left = 0;
+ top = 0;
+
+ } else {
+
+ //!!! For the moment we use A4 for this calculation
+
+ double printSizeMm = 25.4 * ((double)m_printSize / 72.0);
+ double mmPerPixel = printSizeMm / (double)m_notePixmapFactory->getSize();
+ left = (int)(20.0 / mmPerPixel);
+ top = (int)(15.0 / mmPerPixel);
+ }
+}
+
+void
+NotationView::scrollToTime(timeT t)
+{
+
+ double notationViewLayoutCoord = m_hlayout->getXForTime(t);
+
+ // Doesn't appear to matter which staff we use
+ //!!! actually it probably does matter, if they don't have the same extents
+ double notationViewCanvasCoord =
+ getLinedStaff(0)->getCanvasCoordsForLayoutCoords
+ (notationViewLayoutCoord, 0).first;
+
+ // HK: I could have sworn I saw a hard-coded scroll happen somewhere
+ // (i.e. a default extra scroll to make up for the staff not beginning on
+ // the left edge) but now I can't find it.
+ getCanvasView()->slotScrollHorizSmallSteps
+ (int(notationViewCanvasCoord)); // + DEFAULT_STAFF_OFFSET);
+}
+
+RulerScale*
+NotationView::getHLayout()
+{
+ return m_hlayout;
+}
+
+void
+NotationView::paintEvent(QPaintEvent *e)
+{
+ m_inPaintEvent = true;
+
+ // This is duplicated here from EditViewBase, because (a) we need
+ // to know about the segment being removed before we try to check
+ // the staff names etc., and (b) it's not safe to call close()
+ // from EditViewBase::paintEvent if we're then going to try to do
+ // some more work afterwards in this function
+
+ if (isCompositionModified()) {
+
+ // Check if one of the segments we display has been removed
+ // from the composition.
+ //
+ // For the moment we'll have to close the view if any of the
+ // segments we handle has been deleted.
+
+ for (unsigned int i = 0; i < m_segments.size(); ++i) {
+
+ if (!m_segments[i]->getComposition()) {
+ // oops, I think we've been deleted
+ close();
+ return ;
+ }
+ }
+ }
+
+ int topMargin = 0, leftMargin = 0;
+ getPageMargins(leftMargin, topMargin);
+
+ if (m_pageMode == LinedStaff::ContinuousPageMode) {
+ // relayout if the window width changes significantly in continuous page mode
+ int diff = int(getPageWidth() - leftMargin * 2 - m_hlayout->getPageWidth());
+ if (diff < -10 || diff > 10) {
+ setPageMode(m_pageMode);
+ refreshSegment(0, 0, 0);
+ }
+
+ } else if (m_pageMode == LinedStaff::LinearMode) {
+ // resize canvas again if the window height has changed significantly
+ if (getCanvasView() && getCanvasView()->canvas()) {
+ int diff = int(getPageHeight() - getCanvasView()->canvas()->height());
+ if (diff > 10) {
+ readjustCanvasSize();
+ }
+ }
+ }
+
+ // check for staff name changes
+ for (unsigned int i = 0; i < m_staffs.size(); ++i) {
+ if (!m_staffs[i]->isStaffNameUpToDate()) {
+ refreshSegment(0);
+ break;
+ }
+ }
+
+ m_inPaintEvent = false;
+
+ EditView::paintEvent(e);
+
+ m_inPaintEvent = false;
+
+ // now deal with any backlog of insertable notes that appeared
+ // during paint (because it's not safe to modify a segment from
+ // within a sub-event-loop in a processEvents call from a paint)
+ if (!m_pendingInsertableNotes.empty()) {
+ std::vector<std::pair<int, int> > notes = m_pendingInsertableNotes;
+ m_pendingInsertableNotes.clear();
+ for (unsigned int i = 0; i < notes.size(); ++i) {
+ slotInsertableNoteEventReceived(notes[i].first, notes[i].second, true);
+ }
+ }
+
+ slotSetOperationNameAndStatus(i18n(" Ready."));
+}
+
+bool NotationView::applyLayout(int staffNo, timeT startTime, timeT endTime)
+{
+ slotSetOperationNameAndStatus(i18n("Laying out score..."));
+ ProgressDialog::processEvents();
+
+ m_hlayout->setStaffCount(m_staffs.size());
+
+ Profiler profiler("NotationView::applyLayout");
+ unsigned int i;
+
+ for (i = 0; i < m_staffs.size(); ++i) {
+
+ if (staffNo >= 0 && (int)i != staffNo)
+ continue;
+
+ slotSetOperationNameAndStatus(i18n("Laying out staff %1...").arg(i + 1));
+ ProgressDialog::processEvents();
+
+ m_hlayout->resetStaff(*m_staffs[i], startTime, endTime);
+ m_vlayout->resetStaff(*m_staffs[i], startTime, endTime);
+ m_hlayout->scanStaff(*m_staffs[i], startTime, endTime);
+ m_vlayout->scanStaff(*m_staffs[i], startTime, endTime);
+ }
+
+ slotSetOperationNameAndStatus(i18n("Reconciling staffs..."));
+ ProgressDialog::processEvents();
+
+ m_hlayout->finishLayout(startTime, endTime);
+ m_vlayout->finishLayout(startTime, endTime);
+
+ // find the last finishing staff for future use
+
+ timeT lastFinishingStaffEndTime = 0;
+ bool haveEndTime = false;
+ m_lastFinishingStaff = -1;
+
+ timeT firstStartingStaffStartTime = 0;
+ bool haveStartTime = false;
+ int firstStartingStaff = -1;
+
+ for (i = 0; i < m_staffs.size(); ++i) {
+
+ timeT thisStartTime = m_staffs[i]->getSegment().getStartTime();
+ if (thisStartTime < firstStartingStaffStartTime || !haveStartTime) {
+ firstStartingStaffStartTime = thisStartTime;
+ haveStartTime = true;
+ firstStartingStaff = i;
+ }
+
+ timeT thisEndTime = m_staffs[i]->getSegment().getEndTime();
+ if (thisEndTime > lastFinishingStaffEndTime || !haveEndTime) {
+ lastFinishingStaffEndTime = thisEndTime;
+ haveEndTime = true;
+ m_lastFinishingStaff = i;
+ }
+ }
+
+ readjustCanvasSize();
+ if (m_topStandardRuler) {
+ m_topStandardRuler->update();
+ }
+ if (m_bottomStandardRuler) {
+ m_bottomStandardRuler->update();
+ }
+ if (m_tempoRuler && m_tempoRuler->isVisible()) {
+ m_tempoRuler->update();
+ }
+ if (m_rawNoteRuler && m_rawNoteRuler->isVisible()) {
+ m_rawNoteRuler->update();
+ }
+
+ return true;
+}
+
+void NotationView::setCurrentSelectedNote(const char *pixmapName,
+ bool rest, Note::Type n, int dots)
+{
+ NoteInserter* inserter = 0;
+
+ if (rest)
+ inserter = dynamic_cast<NoteInserter*>(m_toolBox->getTool(RestInserter::ToolName));
+ else
+ inserter = dynamic_cast<NoteInserter*>(m_toolBox->getTool(NoteInserter::ToolName));
+
+ inserter->slotSetNote(n);
+ inserter->slotSetDots(dots);
+
+ setTool(inserter);
+
+ m_currentNotePixmap->setPixmap
+ (NotePixmapFactory::toQPixmap
+ (NotePixmapFactory::makeToolbarPixmap(pixmapName, true)));
+
+ emit changeCurrentNote(rest, n);
+}
+
+void NotationView::setCurrentSelectedNote(const NoteActionData &noteAction)
+{
+ setCurrentSelectedNote(noteAction.pixmapName,
+ noteAction.rest,
+ noteAction.noteType,
+ noteAction.dots);
+}
+
+void NotationView::setCurrentSelection(EventSelection* s, bool preview,
+ bool redrawNow)
+{
+ //!!! rather too much here shared with matrixview -- could much of
+ // this be in editview?
+
+ if (m_currentEventSelection == s)
+ return ;
+ NOTATION_DEBUG << "XXX " << endl;
+
+ EventSelection *oldSelection = m_currentEventSelection;
+ m_currentEventSelection = s;
+
+ // positionElements is overkill here, but we hope it's not too
+ // much overkill (if that's not a contradiction)
+
+ timeT startA, endA, startB, endB;
+
+ if (oldSelection) {
+ startA = oldSelection->getStartTime();
+ endA = oldSelection->getEndTime();
+ startB = s ? s->getStartTime() : startA;
+ endB = s ? s->getEndTime() : endA;
+ } else {
+ // we know they can't both be null -- first thing we tested above
+ startA = startB = s->getStartTime();
+ endA = endB = s->getEndTime();
+ }
+
+ // refreshSegment takes start==end to mean refresh everything
+ if (startA == endA)
+ ++endA;
+ if (startB == endB)
+ ++endB;
+
+ bool updateRequired = true;
+
+ // play previews if appropriate -- also permits an optimisation
+ // for the case where the selection is unchanged (quite likely
+ // when sweeping)
+
+ if (s && preview) {
+
+ bool foundNewEvent = false;
+
+ for (EventSelection::eventcontainer::iterator i =
+ s->getSegmentEvents().begin();
+ i != s->getSegmentEvents().end(); ++i) {
+
+ if (oldSelection && oldSelection->getSegment() == s->getSegment()
+ && oldSelection->contains(*i))
+ continue;
+
+ foundNewEvent = true;
+
+ long pitch;
+ if (!(*i)->get
+ <Int>(BaseProperties::PITCH,
+ pitch)) continue;
+
+ long velocity = -1;
+ (void)(*i)->get
+ <Int>(BaseProperties::VELOCITY,
+ velocity);
+
+ if (!((*i)->has(BaseProperties::TIED_BACKWARD) &&
+ (*i)->get
+ <Bool>
+ (BaseProperties::TIED_BACKWARD)))
+ playNote(s->getSegment(), pitch, velocity);
+ }
+
+ if (!foundNewEvent) {
+ if (oldSelection &&
+ oldSelection->getSegment() == s->getSegment() &&
+ oldSelection->getSegmentEvents().size() ==
+ s->getSegmentEvents().size())
+ updateRequired = false;
+ }
+ }
+
+ if (updateRequired) {
+
+ if (!s || !oldSelection ||
+ (endA >= startB && endB >= startA &&
+ oldSelection->getSegment() == s->getSegment())) {
+
+ // the regions overlap: use their union and just do one refresh
+
+ Segment &segment(s ? s->getSegment() :
+ oldSelection->getSegment());
+
+ if (redrawNow) {
+ // recolour the events now
+ getLinedStaff(segment)->positionElements(std::min(startA, startB),
+ std::max(endA, endB));
+ } else {
+ // mark refresh status and then request a repaint
+ segment.getRefreshStatus
+ (m_segmentsRefreshStatusIds
+ [getLinedStaff(segment)->getId()]).
+ push(std::min(startA, startB), std::max(endA, endB));
+ }
+
+ } else {
+ // do two refreshes, one for each -- here we know neither is null
+
+ if (redrawNow) {
+ // recolour the events now
+ getLinedStaff(oldSelection->getSegment())->positionElements(startA,
+ endA);
+
+ getLinedStaff(s->getSegment())->positionElements(startB, endB);
+ } else {
+ // mark refresh status and then request a repaint
+
+ oldSelection->getSegment().getRefreshStatus
+ (m_segmentsRefreshStatusIds
+ [getLinedStaff(oldSelection->getSegment())->getId()]).
+ push(startA, endA);
+
+ s->getSegment().getRefreshStatus
+ (m_segmentsRefreshStatusIds
+ [getLinedStaff(s->getSegment())->getId()]).
+ push(startB, endB);
+ }
+ }
+
+ if (s) {
+ // make the staff containing the selection current
+ int staffId = getLinedStaff(s->getSegment())->getId();
+ if (staffId != m_currentStaff)
+ slotSetCurrentStaff(staffId);
+ }
+ }
+
+ delete oldSelection;
+
+ statusBar()->changeItem(KTmpStatusMsg::getDefaultMsg(),
+ KTmpStatusMsg::getDefaultId());
+
+ if (s) {
+ int eventsSelected = s->getSegmentEvents().size();
+ m_selectionCounter->setText
+ (i18n(" 1 event selected ",
+ " %n events selected ", eventsSelected));
+ } else {
+ m_selectionCounter->setText(i18n(" No selection "));
+ }
+ m_selectionCounter->update();
+
+ setMenuStates();
+
+ if (redrawNow)
+ updateView();
+ else
+ update();
+
+ NOTATION_DEBUG << "XXX " << endl;
+}
+
+void NotationView::setSingleSelectedEvent(int staffNo, Event *event,
+ bool preview, bool redrawNow)
+{
+ setSingleSelectedEvent(getStaff(staffNo)->getSegment(), event,
+ preview, redrawNow);
+}
+
+void NotationView::setSingleSelectedEvent(Segment &segment, Event *event,
+ bool preview, bool redrawNow)
+{
+ EventSelection *selection = new EventSelection(segment);
+ selection->addEvent(event);
+ setCurrentSelection(selection, preview, redrawNow);
+}
+
+bool NotationView::canPreviewAnotherNote()
+{
+ static time_t lastCutOff = 0;
+ static int sinceLastCutOff = 0;
+
+ time_t now = time(0);
+ ++sinceLastCutOff;
+
+ if ((now - lastCutOff) > 0) {
+ sinceLastCutOff = 0;
+ lastCutOff = now;
+ NOTATION_DEBUG << "NotationView::canPreviewAnotherNote: reset" << endl;
+ } else {
+ if (sinceLastCutOff >= 20) {
+ // don't permit more than 20 notes per second or so, to
+ // avoid gungeing up the sound drivers
+ NOTATION_DEBUG << "Rejecting preview (too busy)" << endl;
+ return false;
+ }
+ NOTATION_DEBUG << "NotationView::canPreviewAnotherNote: ok" << endl;
+ }
+
+ return true;
+}
+
+void NotationView::playNote(Segment &s, int pitch, int velocity)
+{
+ Composition &comp = getDocument()->getComposition();
+ Studio &studio = getDocument()->getStudio();
+ Track *track = comp.getTrackById(s.getTrack());
+
+ Instrument *ins =
+ studio.getInstrumentById(track->getInstrument());
+
+ // check for null instrument
+ //
+ if (ins == 0)
+ return ;
+
+ if (!canPreviewAnotherNote())
+ return ;
+
+ if (velocity < 0)
+ velocity = MidiMaxValue;
+
+ MappedEvent mE(ins->getId(),
+ MappedEvent::MidiNoteOneShot,
+ pitch + s.getTranspose(),
+ velocity,
+ RealTime::zeroTime,
+ RealTime(0, 250000000),
+ RealTime::zeroTime);
+
+ StudioControl::sendMappedEvent(mE);
+}
+
+void NotationView::showPreviewNote(int staffNo, double layoutX,
+ int pitch, int height,
+ const Note &note, bool grace,
+ int velocity)
+{
+ m_staffs[staffNo]->showPreviewNote(layoutX, height, note, grace);
+ playNote(m_staffs[staffNo]->getSegment(), pitch, velocity);
+}
+
+void NotationView::clearPreviewNote()
+{
+ for (unsigned int i = 0; i < m_staffs.size(); ++i) {
+ m_staffs[i]->clearPreviewNote();
+ }
+}
+
+void NotationView::setNotePixmapFactory(NotePixmapFactory* f)
+{
+ delete m_notePixmapFactory;
+ m_notePixmapFactory = f;
+ if (m_hlayout)
+ m_hlayout->setNotePixmapFactory(m_notePixmapFactory);
+ if (m_vlayout)
+ m_vlayout->setNotePixmapFactory(m_notePixmapFactory);
+}
+
+Segment *
+NotationView::getCurrentSegment()
+{
+ Staff *staff = getCurrentStaff();
+ return (staff ? &staff->getSegment() : 0);
+}
+
+bool
+NotationView::hasSegment(Segment *segment)
+{
+ for (unsigned int i = 0; i < m_segments.size(); ++i) {
+ if (segment == m_segments[i]) return true;
+ }
+ return false;
+}
+
+
+LinedStaff *
+NotationView::getCurrentLinedStaff()
+{
+ return getLinedStaff(m_currentStaff);
+}
+
+LinedStaff *
+NotationView::getStaffAbove()
+{
+ if (m_staffs.size() < 2) return 0;
+
+ Composition *composition =
+ m_staffs[m_currentStaff]->getSegment().getComposition();
+
+ Track *track = composition->
+ getTrackById(m_staffs[m_currentStaff]->getSegment().getTrack());
+ if (!track) return 0;
+
+ int position = track->getPosition();
+ Track *newTrack = 0;
+
+ while ((newTrack = composition->getTrackByPosition(--position))) {
+ for (unsigned int i = 0; i < m_staffs.size(); ++i) {
+ if (m_staffs[i]->getSegment().getTrack() == newTrack->getId()) {
+ return m_staffs[i];
+ }
+ }
+ }
+
+ return 0;
+}
+
+LinedStaff *
+NotationView::getStaffBelow()
+{
+ if (m_staffs.size() < 2) return 0;
+
+ Composition *composition =
+ m_staffs[m_currentStaff]->getSegment().getComposition();
+
+ Track *track = composition->
+ getTrackById(m_staffs[m_currentStaff]->getSegment().getTrack());
+ if (!track) return 0;
+
+ int position = track->getPosition();
+ Track *newTrack = 0;
+
+ while ((newTrack = composition->getTrackByPosition(++position))) {
+ for (unsigned int i = 0; i < m_staffs.size(); ++i) {
+ if (m_staffs[i]->getSegment().getTrack() == newTrack->getId()) {
+ return m_staffs[i];
+ }
+ }
+ }
+
+ return 0;
+}
+
+timeT
+NotationView::getInsertionTime()
+{
+ return m_insertionTime;
+}
+
+timeT
+NotationView::getInsertionTime(Clef &clef,
+ Rosegarden::Key &key)
+{
+ // This fuss is solely to recover the clef and key: we already
+ // set m_insertionTime to the right value when we first placed
+ // the insert cursor. We could get clef and key directly from
+ // the segment but the staff has a more efficient lookup
+
+ LinedStaff *staff = m_staffs[m_currentStaff];
+ double layoutX = staff->getLayoutXOfInsertCursor();
+ if (layoutX < 0) layoutX = 0;
+ Event *clefEvt = 0, *keyEvt = 0;
+ (void)staff->getElementUnderLayoutX(layoutX, clefEvt, keyEvt);
+
+ if (clefEvt) clef = Clef(*clefEvt);
+ else clef = Clef();
+
+ if (keyEvt) key = Rosegarden::Key(*keyEvt);
+ else key = Rosegarden::Key();
+
+ return m_insertionTime;
+}
+
+LinedStaff*
+NotationView::getStaffForCanvasCoords(int x, int y) const
+{
+ // (i) Do not change staff, if mouse was clicked within the current staff.
+ LinedStaff *s = m_staffs[m_currentStaff];
+ if (s->containsCanvasCoords(x, y)) {
+ LinedStaff::LinedStaffCoords coords =
+ s->getLayoutCoordsForCanvasCoords(x, y);
+
+ timeT t = m_hlayout->getTimeForX(coords.first);
+ // In order to find the correct starting and ending bar of the segment,
+ // make infinitesimal shifts (+1 and -1) towards its center.
+ timeT t0 = getDocument()->getComposition().getBarStartForTime(m_staffs[m_currentStaff]->getSegment().getStartTime()+1);
+ timeT t1 = getDocument()->getComposition().getBarEndForTime(m_staffs[m_currentStaff]->getSegment().getEndTime()-1);
+ if (t >= t0 && t < t1) {
+ return m_staffs[m_currentStaff];
+ }
+ }
+ // (ii) Find staff under cursor, if clicked outside the current staff.
+ for (unsigned int i = 0; i < m_staffs.size(); ++i) {
+
+ LinedStaff *s = m_staffs[i];
+
+ if (s->containsCanvasCoords(x, y)) {
+
+ LinedStaff::LinedStaffCoords coords =
+ s->getLayoutCoordsForCanvasCoords(x, y);
+
+ timeT t = m_hlayout->getTimeForX(coords.first);
+ // In order to find the correct starting and ending bar of the segment,
+ // make infinitesimal shifts (+1 and -1) towards its center.
+ timeT t0 = getDocument()->getComposition().getBarStartForTime(m_staffs[i]->getSegment().getStartTime()+1);
+ timeT t1 = getDocument()->getComposition().getBarEndForTime(m_staffs[i]->getSegment().getEndTime()-1);
+ if (t >= t0 && t < t1) {
+ return m_staffs[i];
+ }
+ }
+ }
+
+ return 0;
+}
+
+void NotationView::updateView()
+{
+ slotCheckRendered
+ (getCanvasView()->contentsX(),
+ getCanvasView()->contentsX() + getCanvasView()->visibleWidth());
+ canvas()->update();
+}
+
+void NotationView::print(bool previewOnly)
+{
+ if (m_staffs.size() == 0) {
+ KMessageBox::error(0, "Nothing to print");
+ return ;
+ }
+
+ Profiler profiler("NotationView::print");
+
+ // We need to be in multi-page mode at this point
+
+ int pageWidth = getPageWidth();
+ int pageHeight = getPageHeight();
+ int leftMargin = 0, topMargin = 0;
+ getPageMargins(leftMargin, topMargin);
+ int maxPageCount = 1;
+
+ for (unsigned int i = 0; i < m_staffs.size(); ++i) {
+ int pageCount = m_staffs[i]->getPageCount();
+ NOTATION_DEBUG << "NotationView::print(): staff " << i << " reports " << pageCount << " pages " << endl;
+ if (pageCount > maxPageCount)
+ maxPageCount = pageCount;
+ }
+
+ KPrinter printer(true, QPrinter::HighResolution);
+
+ printer.setPageSelection(KPrinter::ApplicationSide);
+ printer.setMinMax(1, maxPageCount + 1);
+
+ if (previewOnly)
+ printer.setPreviewOnly(true);
+ else if (!printer.setup((QWidget *)parent()))
+ return ;
+
+ QPaintDeviceMetrics pdm(&printer);
+ QPainter printpainter(&printer);
+
+ // Ideally we should aim to retain the aspect ratio and to move the
+ // staffs so as to be centred after scaling. But because we haven't
+ // got around to the latter, let's lose the former too and just
+ // expand to fit.
+
+ // Retain aspect ratio when scaling
+ double ratioX = (double)pdm.width() / (double)(pageWidth - leftMargin * 2),
+ ratioY = (double)pdm.height() / (double)(pageHeight - topMargin * 2);
+ double ratio = std::min(ratioX, ratioY);
+ printpainter.scale(ratio, ratio);
+
+ // printpainter.scale((double)pdm.width() / (double)(pageWidth - leftMargin*2),
+ // (double)pdm.height() / (double)(pageHeight - topMargin*2));
+ printpainter.translate( -leftMargin, -topMargin);
+
+ QValueList<int> pages = printer.pageList();
+
+ for (QValueList<int>::Iterator pli = pages.begin();
+ pli != pages.end(); ) { // incremented just below
+
+ int page = *pli - 1;
+ ++pli;
+ if (page < 0 || page >= maxPageCount)
+ continue;
+
+ NOTATION_DEBUG << "Printing page " << page << endl;
+
+ QRect pageRect(m_leftGutter + leftMargin + pageWidth * page,
+ topMargin,
+ pageWidth - leftMargin,
+ pageHeight - topMargin);
+
+ for (size_t i = 0; i < m_staffs.size(); ++i) {
+
+ LinedStaff *staff = m_staffs[i];
+
+ LinedStaff::LinedStaffCoords cc0 = staff->getLayoutCoordsForCanvasCoords
+ (pageRect.x(), pageRect.y());
+
+ LinedStaff::LinedStaffCoords cc1 = staff->getLayoutCoordsForCanvasCoords
+ (pageRect.x() + pageRect.width(), pageRect.y() + pageRect.height());
+
+ timeT t0 = m_hlayout->getTimeForX(cc0.first);
+ timeT t1 = m_hlayout->getTimeForX(cc1.first);
+
+ m_staffs[i]->setPrintPainter(&printpainter);
+ m_staffs[i]->checkRendered(t0, t1);
+ }
+
+ // Supplying doublebuffer==true to this method appears to
+ // slow down printing considerably but without it we get
+ // all sorts of horrible artifacts (possibly related to
+ // mishandling of pixmap masks?) in qt-3.0. Let's permit
+ // it as a "hidden" option.
+
+ m_config->setGroup(NotationViewConfigGroup);
+
+ NOTATION_DEBUG << "NotationView::print: calling QCanvas::drawArea" << endl;
+
+ {
+ Profiler profiler("NotationView::print(QCanvas::drawArea)");
+
+ if (m_config->readBoolEntry("forcedoublebufferprinting", false)) {
+ getCanvasView()->canvas()->drawArea(pageRect, &printpainter, true);
+ } else {
+#if QT_VERSION >= 0x030100
+ getCanvasView()->canvas()->drawArea(pageRect, &printpainter, false);
+#else
+
+ getCanvasView()->canvas()->drawArea(pageRect, &printpainter, true);
+#endif
+
+ }
+
+ }
+
+ NOTATION_DEBUG << "NotationView::print: QCanvas::drawArea done" << endl;
+
+ for (size_t i = 0; i < m_staffs.size(); ++i) {
+
+ LinedStaff *staff = m_staffs[i];
+
+ LinedStaff::LinedStaffCoords cc0 = staff->getLayoutCoordsForCanvasCoords
+ (pageRect.x(), pageRect.y());
+
+ LinedStaff::LinedStaffCoords cc1 = staff->getLayoutCoordsForCanvasCoords
+ (pageRect.x() + pageRect.width(), pageRect.y() + pageRect.height());
+
+ timeT t0 = m_hlayout->getTimeForX(cc0.first);
+ timeT t1 = m_hlayout->getTimeForX(cc1.first);
+
+ m_staffs[i]->renderPrintable(t0, t1);
+ }
+
+ printpainter.translate( -pageWidth, 0);
+
+ if (pli != pages.end() && *pli - 1 < maxPageCount)
+ printer.newPage();
+
+ for (size_t i = 0; i < m_staffs.size(); ++i) {
+ m_staffs[i]->markChanged(); // recover any memory used for this page
+ PixmapArrayGC::deleteAll();
+ }
+ }
+
+ for (size_t i = 0; i < m_staffs.size(); ++i) {
+ for (Segment::iterator j = m_staffs[i]->getSegment().begin();
+ j != m_staffs[i]->getSegment().end(); ++j) {
+ removeViewLocalProperties(*j);
+ }
+ delete m_staffs[i];
+ }
+ m_staffs.clear();
+
+ printpainter.end();
+
+ Profiles::getInstance()->dump();
+}
+
+void
+NotationView::updateThumbnails(bool complete)
+{
+ if (m_pageMode != LinedStaff::MultiPageMode)
+ return ;
+
+ int pageWidth = getPageWidth();
+ int pageHeight = getPageHeight();
+ int leftMargin = 0, topMargin = 0;
+ getPageMargins(leftMargin, topMargin);
+ int maxPageCount = 1;
+
+ for (unsigned int i = 0; i < m_staffs.size(); ++i) {
+ int pageCount = m_staffs[i]->getPageCount();
+ if (pageCount > maxPageCount)
+ maxPageCount = pageCount;
+ }
+
+ int thumbScale = 20;
+ QPixmap thumbnail(canvas()->width() / thumbScale,
+ canvas()->height() / thumbScale);
+ thumbnail.fill(Qt::white);
+ QPainter thumbPainter(&thumbnail);
+
+ if (complete) {
+
+ thumbPainter.scale(1.0 / double(thumbScale), 1.0 / double(thumbScale));
+ thumbPainter.setPen(Qt::black);
+ thumbPainter.setBrush(Qt::white);
+
+ /*
+ QCanvas *canvas = getCanvasView()->canvas();
+ canvas->drawArea(QRect(0, 0, canvas->width(), canvas->height()),
+ &thumbPainter, false);
+ */
+ // hide small texts, as we get a crash in Xft when trying to
+ // render them at this scale
+ if (m_title)
+ m_title->hide();
+ if (m_subtitle)
+ m_subtitle->hide();
+ if (m_composer)
+ m_composer->hide();
+ if (m_copyright)
+ m_copyright->hide();
+
+ for (size_t page = 0; page < static_cast<size_t>(maxPageCount); ++page) {
+
+ bool havePageNumber = ((m_pageNumbers.size() > page) &&
+ (m_pageNumbers[page] != 0));
+ if (havePageNumber)
+ m_pageNumbers[page]->hide();
+
+ QRect pageRect(m_leftGutter + leftMargin * 2 + pageWidth * page,
+ topMargin * 2,
+ pageWidth - leftMargin*3,
+ pageHeight - topMargin*3);
+
+ QCanvas *canvas = getCanvasView()->canvas();
+ canvas->drawArea(pageRect, &thumbPainter, false);
+
+ if (havePageNumber)
+ m_pageNumbers[page]->show();
+ }
+
+ if (m_title)
+ m_title->show();
+ if (m_subtitle)
+ m_subtitle->show();
+ if (m_composer)
+ m_composer->show();
+ if (m_copyright)
+ m_copyright->show();
+
+ } else {
+
+ thumbPainter.setPen(Qt::black);
+
+ for (int page = 0; page < maxPageCount; ++page) {
+
+ int x = m_leftGutter + pageWidth * page + leftMargin / 4;
+ int y = 20;
+ int w = pageWidth - leftMargin / 2;
+ int h = pageHeight;
+
+ QString str = QString("%1").arg(page + 1);
+
+ thumbPainter.drawRect(x / thumbScale, y / thumbScale,
+ w / thumbScale, h / thumbScale);
+
+ int tx = (x + w / 2) / thumbScale, ty = (y + h / 2) / thumbScale;
+ tx -= thumbPainter.fontMetrics().width(str) / 2;
+ thumbPainter.drawText(tx, ty, str);
+ }
+ }
+
+ thumbPainter.end();
+ if (m_pannerDialog)
+ m_pannerDialog->scrollbox()->setThumbnail(thumbnail);
+}
+
+void NotationView::refreshSegment(Segment *segment,
+ timeT startTime, timeT endTime)
+{
+ NOTATION_DEBUG << "*** " << endl;
+
+ if (m_inhibitRefresh)
+ return ;
+ NOTATION_DEBUG << "NotationView::refreshSegment(" << segment << "," << startTime << "," << endTime << ")" << endl;
+ Profiler foo("NotationView::refreshSegment");
+
+ emit usedSelection();
+
+ if (segment) {
+ LinedStaff *staff = getLinedStaff(*segment);
+ if (staff)
+ applyLayout(staff->getId(), startTime, endTime);
+ } else {
+ applyLayout( -1, startTime, endTime);
+ }
+
+ for (unsigned int i = 0; i < m_staffs.size(); ++i) {
+
+ Segment *ssegment = &m_staffs[i]->getSegment();
+ bool thisStaff = (ssegment == segment || segment == 0);
+ m_staffs[i]->markChanged(startTime, endTime, !thisStaff);
+ }
+
+ PixmapArrayGC::deleteAll();
+
+ statusBar()->changeItem(KTmpStatusMsg::getDefaultMsg(),
+ KTmpStatusMsg::getDefaultId());
+
+ Event::dumpStats(std::cerr);
+ if (m_deferredCursorMove == NoCursorMoveNeeded) {
+ slotSetInsertCursorPosition(getInsertionTime(), false, false);
+ } else {
+ doDeferredCursorMove();
+ }
+ slotSetPointerPosition(getDocument()->getComposition().getPosition(), false);
+
+ if (m_currentEventSelection &&
+ m_currentEventSelection->getSegmentEvents().size() == 0) {
+ delete m_currentEventSelection;
+ m_currentEventSelection = 0;
+ //!!!??? was that the right thing to do?
+ }
+
+ setMenuStates();
+ slotSetOperationNameAndStatus(i18n(" Ready."));
+ NOTATION_DEBUG << "*** " << endl;
+}
+
+void NotationView::setMenuStates()
+{
+ // 1. set selection-related states
+
+ // Clear states first, then enter only those ones that apply
+ // (so as to avoid ever clearing one after entering another, in
+ // case the two overlap at all)
+ stateChanged("have_selection", KXMLGUIClient::StateReverse);
+ stateChanged("have_notes_in_selection", KXMLGUIClient::StateReverse);
+ stateChanged("have_rests_in_selection", KXMLGUIClient::StateReverse);
+
+ if (m_currentEventSelection) {
+
+ NOTATION_DEBUG << "NotationView::setMenuStates: Have selection; it's " << m_currentEventSelection << " covering range from " << m_currentEventSelection->getStartTime() << " to " << m_currentEventSelection->getEndTime() << " (" << m_currentEventSelection->getSegmentEvents().size() << " events)" << endl;
+
+ stateChanged("have_selection", KXMLGUIClient::StateNoReverse);
+ if (m_currentEventSelection->contains
+ (Note::EventType)) {
+ stateChanged("have_notes_in_selection",
+ KXMLGUIClient::StateNoReverse);
+ }
+ if (m_currentEventSelection->contains
+ (Note::EventRestType)) {
+ stateChanged("have_rests_in_selection",
+ KXMLGUIClient::StateNoReverse);
+ }
+ }
+
+ // 2. set inserter-related states
+
+ // #1372863 -- RestInserter is a subclass of NoteInserter, so we
+ // need to test dynamic_cast<RestInserter *> before
+ // dynamic_cast<NoteInserter *> (which will succeed for both)
+
+ if (dynamic_cast<RestInserter *>(m_tool)) {
+ NOTATION_DEBUG << "Have rest inserter " << endl;
+ stateChanged("note_insert_tool_current", StateReverse);
+ stateChanged("rest_insert_tool_current", StateNoReverse);
+ } else if (dynamic_cast<NoteInserter *>(m_tool)) {
+ NOTATION_DEBUG << "Have note inserter " << endl;
+ stateChanged("note_insert_tool_current", StateNoReverse);
+ stateChanged("rest_insert_tool_current", StateReverse);
+ } else {
+ NOTATION_DEBUG << "Have neither inserter " << endl;
+ stateChanged("note_insert_tool_current", StateReverse);
+ stateChanged("rest_insert_tool_current", StateReverse);
+ }
+}
+
+#define UPDATE_PROGRESS(n) \
+ progressCount += (n); \
+ if (progressTotal > 0) { \
+ emit setProgress(progressCount * 100 / progressTotal); \
+ ProgressDialog::processEvents(); \
+ }
+
+void NotationView::readjustCanvasSize()
+{
+ Profiler profiler("NotationView::readjustCanvasSize");
+
+ double maxWidth = 0.0;
+ int maxHeight = 0;
+
+ slotSetOperationNameAndStatus(i18n("Sizing and allocating canvas..."));
+ ProgressDialog::processEvents();
+
+ int progressTotal = m_staffs.size() + 2;
+ int progressCount = 0;
+
+ for (unsigned int i = 0; i < m_staffs.size(); ++i) {
+
+ LinedStaff &staff = *m_staffs[i];
+
+ staff.sizeStaff(*m_hlayout);
+ UPDATE_PROGRESS(1);
+
+ if (staff.getTotalWidth() + staff.getX() > maxWidth) {
+ maxWidth = staff.getTotalWidth() + staff.getX() + 1;
+ }
+
+ if (staff.getTotalHeight() + staff.getY() > maxHeight) {
+ maxHeight = staff.getTotalHeight() + staff.getY() + 1;
+ }
+ }
+
+ int topMargin = 0, leftMargin = 0;
+ getPageMargins(leftMargin, topMargin);
+
+ int pageWidth = getPageWidth();
+ int pageHeight = getPageHeight();
+
+ NOTATION_DEBUG << "NotationView::readjustCanvasSize: maxHeight is "
+ << maxHeight << ", page height is " << pageHeight << endl
+ << " - maxWidth is " << maxWidth << ", page width is " << pageWidth << endl;
+
+
+ if (m_pageMode == LinedStaff::LinearMode) {
+ maxWidth = ((maxWidth / pageWidth) + 1) * pageWidth;
+ if (maxHeight < pageHeight)
+ maxHeight = pageHeight;
+ } else {
+ if (maxWidth < pageWidth)
+ maxWidth = pageWidth;
+ if (maxHeight < pageHeight + topMargin*2)
+ maxHeight = pageHeight + topMargin * 2;
+ }
+
+ // now get the EditView to do the biz
+ readjustViewSize(QSize(int(maxWidth), maxHeight), true);
+
+ UPDATE_PROGRESS(2);
+
+ if (m_pannerDialog) {
+
+ if (m_pageMode != LinedStaff::MultiPageMode) {
+ m_pannerDialog->hide();
+
+ } else {
+
+ m_pannerDialog->show();
+
+ m_pannerDialog->setPageSize
+ (QSize(canvas()->width(),
+ canvas()->height()));
+
+ m_pannerDialog->scrollbox()->setViewSize
+ (QSize(getCanvasView()->width(),
+ getCanvasView()->height()));
+ }
+ }
+
+ // Give a correct vertical alignment to track headers
+ if ((m_pageMode == LinedStaff::LinearMode) && m_showHeadersGroup) {
+ m_headersGroupView->setContentsPos(0, getCanvasView()->contentsY());
+ }
+}
+
+void NotationView::slotNoteAction()
+{
+ const QObject* sigSender = sender();
+
+ NoteActionDataMap::Iterator noteAct =
+ m_noteActionDataMap->find(sigSender->name());
+
+ if (noteAct != m_noteActionDataMap->end()) {
+ m_lastNoteAction = sigSender->name();
+ setCurrentSelectedNote(**noteAct);
+ setMenuStates();
+ } else {
+ std::cerr << "NotationView::slotNoteAction() : couldn't find NoteActionData named '"
+ << sigSender->name() << "'\n";
+ }
+}
+
+void NotationView::slotLastNoteAction()
+{
+ KAction *action = actionCollection()->action(m_lastNoteAction);
+ if (!action)
+ action = actionCollection()->action("crotchet");
+
+ if (action) {
+ action->activate();
+ } else {
+ std::cerr << "NotationView::slotNoteAction() : couldn't find action named '"
+ << m_lastNoteAction << "' or 'crotchet'\n";
+ }
+}
+
+void NotationView::slotAddMark()
+{
+ const QObject *s = sender();
+ if (!m_currentEventSelection)
+ return ;
+
+ MarkActionDataMap::Iterator i = m_markActionDataMap->find(s->name());
+
+ if (i != m_markActionDataMap->end()) {
+ addCommandToHistory(new AddMarkCommand
+ ((**i).mark, *m_currentEventSelection));
+ }
+}
+
+void NotationView::slotNoteChangeAction()
+{
+ const QObject* sigSender = sender();
+
+ NoteChangeActionDataMap::Iterator noteAct =
+ m_noteChangeActionDataMap->find(sigSender->name());
+
+ if (noteAct != m_noteChangeActionDataMap->end()) {
+ slotSetNoteDurations((**noteAct).noteType, (**noteAct).notationOnly);
+ } else {
+ std::cerr << "NotationView::slotNoteChangeAction() : couldn't find NoteChangeAction named '"
+ << sigSender->name() << "'\n";
+ }
+}
+
+void NotationView::initActionDataMaps()
+{
+ static bool called = false;
+ static int keys[] =
+ { Key_0, Key_3, Key_6, Key_8, Key_4, Key_2, Key_1, Key_5 };
+
+ if (called)
+ return ;
+ called = true;
+
+ m_noteActionDataMap = new NoteActionDataMap;
+
+ for (int rest = 0; rest < 2; ++rest) {
+ for (int dots = 0; dots < 2; ++dots) {
+ for (int type = Note::Longest; type >= Note::Shortest; --type) {
+ if (dots && (type == Note::Longest))
+ continue;
+
+ QString refName
+ (NotationStrings::getReferenceName(Note(type, dots), rest == 1));
+
+ QString shortName(refName);
+ shortName.replace(QRegExp("-"), "_");
+
+ QString titleName
+ (NotationStrings::getNoteName(Note(type, dots)));
+
+ titleName = titleName.left(1).upper() +
+ titleName.right(titleName.length() - 1);
+
+ if (rest) {
+ titleName.replace(QRegExp(i18n("note")), i18n("rest"));
+ }
+
+ int keycode = keys[type - Note::Shortest];
+ if (dots) // keycode += CTRL; -- used below for note change action
+ keycode = 0;
+ if (rest) // keycode += SHIFT; -- can't do shift+numbers
+ keycode = 0;
+
+ m_noteActionDataMap->insert
+ (shortName, new NoteActionData
+ (titleName, shortName, refName, keycode,
+ rest > 0, type, dots));
+ }
+ }
+ }
+
+ m_noteChangeActionDataMap = new NoteChangeActionDataMap;
+
+ for (int notationOnly = 0; notationOnly <= 1; ++notationOnly) {
+ for (int type = Note::Longest; type >= Note::Shortest; --type) {
+
+ QString refName
+ (NotationStrings::getReferenceName(Note(type, 0), false));
+
+ QString shortName(QString("change_%1%2")
+ .arg(notationOnly ? "notation_" : "").arg(refName));
+ shortName.replace(QRegExp("-"), "_");
+
+ QString titleName
+ (NotationStrings::getNoteName(Note(type, 0)));
+
+ titleName = titleName.left(1).upper() +
+ titleName.right(titleName.length() - 1);
+
+ int keycode = keys[type - Note::Shortest];
+ keycode += CTRL;
+ if (notationOnly)
+ keycode += ALT;
+
+ m_noteChangeActionDataMap->insert
+ (shortName, new NoteChangeActionData
+ (titleName, shortName, refName, keycode,
+ notationOnly ? true : false, type));
+ }
+ }
+
+ m_markActionDataMap = new MarkActionDataMap;
+
+ std::vector<Mark> marks = Marks::getStandardMarks();
+ for (unsigned int i = 0; i < marks.size(); ++i) {
+
+ Mark mark = marks[i];
+ QString markName(strtoqstr(mark));
+ QString actionName = QString("add_%1").arg(markName);
+
+ m_markActionDataMap->insert
+ (actionName, new MarkActionData
+ (AddMarkCommand::getGlobalName(mark),
+ actionName, 0, mark));
+ }
+
+}
+
+void NotationView::setupProgress(KProgress* bar)
+{
+ if (bar) {
+ NOTATION_DEBUG << "NotationView::setupProgress(bar)\n";
+
+ connect(m_hlayout, SIGNAL(setProgress(int)),
+ bar, SLOT(setValue(int)));
+
+ connect(m_hlayout, SIGNAL(incrementProgress(int)),
+ bar, SLOT(advance(int)));
+
+ connect(this, SIGNAL(setProgress(int)),
+ bar, SLOT(setValue(int)));
+
+ connect(this, SIGNAL(incrementProgress(int)),
+ bar, SLOT(advance(int)));
+
+ for (unsigned int i = 0; i < m_staffs.size(); ++i) {
+ connect(m_staffs[i], SIGNAL(setProgress(int)),
+ bar, SLOT(setValue(int)));
+
+ connect(m_staffs[i], SIGNAL(incrementProgress(int)),
+ bar, SLOT(advance(int)));
+ }
+ }
+
+}
+
+void NotationView::setupProgress(ProgressDialog* dialog)
+{
+ NOTATION_DEBUG << "NotationView::setupProgress(dialog)" << endl;
+ disconnectProgress();
+
+ if (dialog) {
+ setupProgress(dialog->progressBar());
+
+ connect(dialog, SIGNAL(cancelClicked()),
+ m_hlayout, SLOT(slotCancel()));
+
+ for (unsigned int i = 0; i < m_staffs.size(); ++i) {
+ connect(m_staffs[i], SIGNAL(setOperationName(QString)),
+ this, SLOT(slotSetOperationNameAndStatus(QString)));
+
+ connect(dialog, SIGNAL(cancelClicked()),
+ m_staffs[i], SLOT(slotCancel()));
+ }
+
+ connect(this, SIGNAL(setOperationName(QString)),
+ dialog, SLOT(slotSetOperationName(QString)));
+ m_progressDisplayer = PROGRESS_DIALOG;
+ }
+
+}
+
+void NotationView::slotSetOperationNameAndStatus(QString name)
+{
+ emit setOperationName(name);
+ statusBar()->changeItem(QString(" %1").arg(name),
+ KTmpStatusMsg::getDefaultId());
+}
+
+void NotationView::disconnectProgress()
+{
+ NOTATION_DEBUG << "NotationView::disconnectProgress()" << endl;
+
+ m_hlayout->disconnect();
+ disconnect(SIGNAL(setProgress(int)));
+ disconnect(SIGNAL(incrementProgress(int)));
+ disconnect(SIGNAL(setOperationName(QString)));
+
+ for (unsigned int i = 0; i < m_staffs.size(); ++i) {
+ m_staffs[i]->disconnect();
+ }
+}
+
+void NotationView::setupDefaultProgress()
+{
+ if (m_progressDisplayer != PROGRESS_BAR) {
+ NOTATION_DEBUG << "NotationView::setupDefaultProgress()" << endl;
+ disconnectProgress();
+ setupProgress(m_progressBar);
+ m_progressDisplayer = PROGRESS_BAR;
+ }
+}
+
+void NotationView::updateViewCaption()
+{
+ if (m_segments.size() == 1) {
+
+ TrackId trackId = m_segments[0]->getTrack();
+ Track *track =
+ m_segments[0]->getComposition()->getTrackById(trackId);
+
+ int trackPosition = -1;
+ if (track)
+ trackPosition = track->getPosition();
+ // std::cout << std::endl << std::endl << std::endl << "DEBUG TITLE BAR: " << getDocument()->getTitle() << std::endl << std::endl << std::endl;
+ setCaption(i18n("%1 - Segment Track #%2 - Notation")
+ .arg(getDocument()->getTitle())
+ .arg(trackPosition + 1));
+
+ } else if (m_segments.size() == getDocument()->getComposition().getNbSegments()) {
+
+ setCaption(i18n("%1 - All Segments - Notation")
+ .arg(getDocument()->getTitle()));
+
+ } else {
+
+ setCaption(i18n("%1 - Segment - Notation", "%1 - %n Segments - Notation", m_segments.size())
+ .arg(getDocument()->getTitle()));
+
+ }
+}
+
+NotationView::NoteActionDataMap* NotationView::m_noteActionDataMap = 0;
+
+NotationView::NoteChangeActionDataMap* NotationView::m_noteChangeActionDataMap = 0;
+
+NotationView::MarkActionDataMap* NotationView::m_markActionDataMap = 0;
+
+
+/// SLOTS
+
+
+void
+NotationView::slotUpdateInsertModeStatus()
+{
+ QString tripletMessage = i18n("Triplet");
+ QString chordMessage = i18n("Chord");
+ QString graceMessage = i18n("Grace");
+ QString message;
+
+ if (isInTripletMode()) {
+ message = i18n("%1 %2").arg(message).arg(tripletMessage);
+ }
+
+ if (isInChordMode()) {
+ message = i18n("%1 %2").arg(message).arg(chordMessage);
+ }
+
+ if (isInGraceMode()) {
+ message = i18n("%1 %2").arg(message).arg(graceMessage);
+ }
+
+ m_insertModeLabel->setText(message);
+}
+
+void
+NotationView::slotUpdateAnnotationsStatus()
+{
+ if (!areAnnotationsVisible()) {
+ for (int i = 0; i < getStaffCount(); ++i) {
+ Segment &s = getStaff(i)->getSegment();
+ for (Segment::iterator j = s.begin(); j != s.end(); ++j) {
+ if ((*j)->isa(Text::EventType) &&
+ ((*j)->get<String>(Text::TextTypePropertyName)
+ == Text::Annotation)) {
+ m_annotationsLabel->setText(i18n("Hidden annotations"));
+ return ;
+ }
+ }
+ }
+ }
+ m_annotationsLabel->setText("");
+ getToggleAction("show_annotations")->setChecked(areAnnotationsVisible());
+}
+
+void
+NotationView::slotUpdateLilyPondDirectivesStatus()
+{
+ if (!areLilyPondDirectivesVisible()) {
+ for (int i = 0; i < getStaffCount(); ++i) {
+ Segment &s = getStaff(i)->getSegment();
+ for (Segment::iterator j = s.begin(); j != s.end(); ++j) {
+ if ((*j)->isa(Text::EventType) &&
+ ((*j)->get
+ <String>
+ (Text::TextTypePropertyName)
+ == Text::LilyPondDirective)) {
+ m_lilyPondDirectivesLabel->setText(i18n("Hidden LilyPond directives"));
+ return ;
+ }
+ }
+ }
+ }
+ m_lilyPondDirectivesLabel->setText("");
+ getToggleAction("show_lilypond_directives")->setChecked(areLilyPondDirectivesVisible());
+}
+
+void
+NotationView::slotChangeSpacingFromStringValue(const QString& spacingT)
+{
+ // spacingT has a '%' at the end
+ //
+ int spacing = spacingT.left(spacingT.length() - 1).toInt();
+ slotChangeSpacing(spacing);
+}
+
+void
+NotationView::slotChangeSpacingFromAction()
+{
+ const QObject *s = sender();
+ QString name = s->name();
+
+ if (name.left(8) == "spacing_") {
+ int spacing = name.right(name.length() - 8).toInt();
+
+ if (spacing > 0)
+ slotChangeSpacing(spacing);
+
+ } else {
+ KMessageBox::sorry
+ (this, i18n("Unknown spacing action %1").arg(name));
+ }
+}
+
+void
+NotationView::slotChangeSpacing(int spacing)
+{
+ if (m_hlayout->getSpacing() == spacing)
+ return ;
+
+ m_hlayout->setSpacing(spacing);
+
+ // m_spacingSlider->setSize(spacing);
+
+ KToggleAction *action = dynamic_cast<KToggleAction *>
+ (actionCollection()->action(QString("spacing_%1").arg(spacing)));
+ if (action)
+ action->setChecked(true);
+ else {
+ std::cerr
+ << "WARNING: Expected action \"spacing_" << spacing
+ << "\" to be a KToggleAction, but it isn't (or doesn't exist)"
+ << std::endl;
+ }
+
+ positionStaffs();
+ applyLayout();
+
+ for (unsigned int i = 0; i < m_staffs.size(); ++i) {
+ m_staffs[i]->markChanged();
+ }
+
+ positionPages();
+ updateControlRulers(true);
+ updateView();
+}
+
+void
+NotationView::slotChangeProportionFromIndex(int n)
+{
+ std::vector<int> proportions = m_hlayout->getAvailableProportions();
+ if (n >= (int)proportions.size())
+ n = proportions.size() - 1;
+ slotChangeProportion(proportions[n]);
+}
+
+void
+NotationView::slotChangeProportionFromAction()
+{
+ const QObject *s = sender();
+ QString name = s->name();
+
+ if (name.left(11) == "proportion_") {
+ int proportion = name.right(name.length() - 11).toInt();
+ slotChangeProportion(proportion);
+
+ } else {
+ KMessageBox::sorry
+ (this, i18n("Unknown proportion action %1").arg(name));
+ }
+}
+
+void
+NotationView::slotChangeProportion(int proportion)
+{
+ if (m_hlayout->getProportion() == proportion)
+ return ;
+
+ m_hlayout->setProportion(proportion);
+
+ // m_proportionSlider->setSize(proportion);
+
+ KToggleAction *action = dynamic_cast<KToggleAction *>
+ (actionCollection()->action(QString("proportion_%1").arg(proportion)));
+ if (action)
+ action->setChecked(true);
+ else {
+ std::cerr
+ << "WARNING: Expected action \"proportion_" << proportion
+ << "\" to be a KToggleAction, but it isn't (or doesn't exist)"
+ << std::endl;
+ }
+
+ positionStaffs();
+ applyLayout();
+
+ for (unsigned int i = 0; i < m_staffs.size(); ++i) {
+ m_staffs[i]->markChanged();
+ }
+
+ positionPages();
+ updateControlRulers(true);
+ updateView();
+}
+
+void
+NotationView::slotChangeFontFromAction()
+{
+ const QObject *s = sender();
+ QString name = s->name();
+ if (name.left(10) == "note_font_") {
+ name = name.right(name.length() - 10);
+ slotChangeFont(name);
+ } else {
+ KMessageBox::sorry
+ (this, i18n("Unknown font action %1").arg(name));
+ }
+}
+
+void
+NotationView::slotChangeFontSizeFromAction()
+{
+ const QObject *s = sender();
+ QString name = s->name();
+
+ if (name.left(15) == "note_font_size_") {
+ name = name.right(name.length() - 15);
+ bool ok = false;
+ int size = name.toInt(&ok);
+ if (ok)
+ slotChangeFont(m_fontName, size);
+ else {
+ KMessageBox::sorry
+ (this, i18n("Unknown font size %1").arg(name));
+ }
+ } else {
+ KMessageBox::sorry
+ (this, i18n("Unknown font size action %1").arg(name));
+ }
+}
+
+void
+NotationView::slotChangeFont(const QString &newName)
+{
+ NOTATION_DEBUG << "changeFont: " << newName << endl;
+ slotChangeFont(std::string(newName.utf8()));
+}
+
+void
+NotationView::slotChangeFont(std::string newName)
+{
+ int newSize = m_fontSize;
+
+ if (!NoteFontFactory::isAvailableInSize(newName, newSize)) {
+
+ int defaultSize = NoteFontFactory::getDefaultSize(newName);
+ newSize = m_config->readUnsignedNumEntry
+ ((getStaffCount() > 1 ?
+ "multistaffnotesize" : "singlestaffnotesize"), defaultSize);
+
+ if (!NoteFontFactory::isAvailableInSize(newName, newSize)) {
+ newSize = defaultSize;
+ }
+ }
+
+ slotChangeFont(newName, newSize);
+}
+
+void
+NotationView::slotChangeFontSize(int newSize)
+{
+ slotChangeFont(m_fontName, newSize);
+}
+
+void
+NotationView::slotChangeFontSizeFromStringValue(const QString& sizeT)
+{
+ int size = sizeT.toInt();
+ slotChangeFont(m_fontName, size);
+}
+
+void
+NotationView::slotZoomIn()
+{
+ std::vector<int> sizes = NoteFontFactory::getScreenSizes(m_fontName);
+ for (int i = 0; i + 1 < sizes.size(); ++i) {
+ if (sizes[i] == m_fontSize) {
+ slotChangeFontSize(sizes[i + 1]);
+ return ;
+ }
+ }
+}
+
+void
+NotationView::slotZoomOut()
+{
+ std::vector<int> sizes = NoteFontFactory::getScreenSizes(m_fontName);
+ for (int i = 1; i < sizes.size(); ++i) {
+ if (sizes[i] == m_fontSize) {
+ slotChangeFontSize(sizes[i - 1]);
+ return ;
+ }
+ }
+}
+
+void
+NotationView::slotChangeFont(std::string newName, int newSize)
+{
+ if (newName == m_fontName && newSize == m_fontSize)
+ return ;
+
+ NotePixmapFactory* npf = 0;
+
+ try {
+ npf = new NotePixmapFactory(newName, newSize);
+ } catch (...) {
+ return ;
+ }
+
+ bool changedFont = (newName != m_fontName || newSize != m_fontSize);
+
+ std::string oldName = m_fontName;
+ m_fontName = newName;
+ m_fontSize = newSize;
+ setNotePixmapFactory(npf);
+
+ // update the various GUI elements
+
+ std::set<std::string> fs(NoteFontFactory::getFontNames());
+ std::vector<std::string> f(fs.begin(), fs.end());
+ std::sort(f.begin(), f.end());
+
+ for (unsigned int i = 0; i < f.size(); ++i) {
+ bool thisOne = (f[i] == m_fontName);
+ if (thisOne)
+ m_fontCombo->setCurrentItem(i);
+ KToggleAction *action = dynamic_cast<KToggleAction *>
+ (actionCollection()->action("note_font_" + strtoqstr(f[i])));
+ NOTATION_DEBUG << "inspecting " << f[i] << (action ? ", have action" : ", no action") << endl;
+ if (action)
+ action->setChecked(thisOne);
+ else {
+ std::cerr
+ << "WARNING: Expected action \"note_font_" << f[i]
+ << "\" to be a KToggleAction, but it isn't (or doesn't exist)"
+ << std::endl;
+ }
+ }
+
+ NOTATION_DEBUG << "about to reinitialise sizes" << endl;
+
+ std::vector<int> sizes = NoteFontFactory::getScreenSizes(m_fontName);
+ m_fontSizeCombo->clear();
+ QString value;
+ for (std::vector<int>::iterator i = sizes.begin(); i != sizes.end(); ++i) {
+ value.setNum(*i);
+ m_fontSizeCombo->insertItem(value);
+ }
+ value.setNum(m_fontSize);
+ m_fontSizeCombo->setCurrentText(value);
+
+ setupFontSizeMenu(oldName);
+
+ if (!changedFont)
+ return ; // might have been called to initialise menus etc
+
+ NOTATION_DEBUG << "about to change font" << endl;
+
+ if (m_pageMode == LinedStaff::MultiPageMode) {
+
+ int pageWidth = getPageWidth();
+ int topMargin = 0, leftMargin = 0;
+ getPageMargins(leftMargin, topMargin);
+
+ m_hlayout->setPageWidth(pageWidth - leftMargin * 2);
+ }
+
+ for (unsigned int i = 0; i < m_staffs.size(); ++i) {
+ m_staffs[i]->changeFont(m_fontName, m_fontSize);
+ }
+
+ NOTATION_DEBUG << "about to position staffs" << endl;
+
+ positionStaffs();
+
+ bool layoutApplied = applyLayout();
+ if (!layoutApplied)
+ KMessageBox::sorry(0, "Couldn't apply layout");
+ else {
+ for (unsigned int i = 0; i < m_staffs.size(); ++i) {
+ m_staffs[i]->markChanged();
+ }
+ }
+
+ positionPages();
+ updateControlRulers(true);
+ updateView();
+}
+
+void
+NotationView::slotFilePrint()
+{
+ KTmpStatusMsg msg(i18n("Printing..."), this);
+
+ SetWaitCursor waitCursor;
+ NotationView printingView(getDocument(), m_segments,
+ (QWidget *)parent(), this);
+
+ if (!printingView.isOK()) {
+ NOTATION_DEBUG << "Print : operation cancelled\n";
+ return ;
+ }
+
+ printingView.print();
+}
+
+void
+NotationView::slotFilePrintPreview()
+{
+ KTmpStatusMsg msg(i18n("Previewing..."), this);
+
+ SetWaitCursor waitCursor;
+ NotationView printingView(getDocument(), m_segments,
+ (QWidget *)parent(), this);
+
+ if (!printingView.isOK()) {
+ NOTATION_DEBUG << "Print preview : operation cancelled\n";
+ return ;
+ }
+
+ printingView.print(true);
+}
+
+std::map<KProcess *, KTempFile *> NotationView::m_lilyTempFileMap;
+
+void NotationView::slotPrintLilyPond()
+{
+ KTmpStatusMsg msg(i18n("Printing LilyPond file..."), this);
+ KTempFile *file = new KTempFile(QString::null, ".ly");
+ file->setAutoDelete(true);
+ if (!file->name()) {
+ // CurrentProgressDialog::freeze();
+ KMessageBox::sorry(this, i18n("Failed to open a temporary file for LilyPond export."));
+ delete file;
+ }
+ if (!exportLilyPondFile(file->name(), true)) {
+ return ;
+ }
+ KProcess *proc = new KProcess;
+ *proc << "rosegarden-lilypondview";
+ *proc << "--graphical";
+ *proc << "--print";
+ *proc << file->name();
+ connect(proc, SIGNAL(processExited(KProcess *)),
+ this, SLOT(slotLilyPondViewProcessExited(KProcess *)));
+ m_lilyTempFileMap[proc] = file;
+ proc->start(KProcess::NotifyOnExit);
+}
+
+void NotationView::slotPreviewLilyPond()
+{
+ KTmpStatusMsg msg(i18n("Previewing LilyPond file..."), this);
+ KTempFile *file = new KTempFile(QString::null, ".ly");
+ file->setAutoDelete(true);
+ if (!file->name()) {
+ // CurrentProgressDialog::freeze();
+ KMessageBox::sorry(this, i18n("Failed to open a temporary file for LilyPond export."));
+ delete file;
+ }
+ if (!exportLilyPondFile(file->name(), true)) {
+ return ;
+ }
+ KProcess *proc = new KProcess;
+ *proc << "rosegarden-lilypondview";
+ *proc << "--graphical";
+ *proc << "--pdf";
+ *proc << file->name();
+ connect(proc, SIGNAL(processExited(KProcess *)),
+ this, SLOT(slotLilyPondViewProcessExited(KProcess *)));
+ m_lilyTempFileMap[proc] = file;
+ proc->start(KProcess::NotifyOnExit);
+}
+
+void NotationView::slotLilyPondViewProcessExited(KProcess *p)
+{
+ delete m_lilyTempFileMap[p];
+ m_lilyTempFileMap.erase(p);
+ delete p;
+}
+
+bool NotationView::exportLilyPondFile(QString file, bool forPreview)
+{
+ QString caption = "", heading = "";
+ if (forPreview) {
+ caption = i18n("LilyPond Preview Options");
+ heading = i18n("LilyPond preview options");
+ }
+
+ LilyPondOptionsDialog dialog(this, m_doc, caption, heading);
+ if (dialog.exec() != QDialog::Accepted) {
+ return false;
+ }
+
+ ProgressDialog progressDlg(i18n("Exporting LilyPond file..."),
+ 100,
+ this);
+
+ LilyPondExporter e(this, m_doc, std::string(QFile::encodeName(file)));
+
+ connect(&e, SIGNAL(setProgress(int)),
+ progressDlg.progressBar(), SLOT(setValue(int)));
+
+ connect(&e, SIGNAL(incrementProgress(int)),
+ progressDlg.progressBar(), SLOT(advance(int)));
+
+ if (!e.write()) {
+ // CurrentProgressDialog::freeze();
+ KMessageBox::sorry(this, i18n("Export failed. The file could not be opened for writing."));
+ return false;
+ }
+
+ return true;
+}
+
+void NotationView::slotEditCut()
+{
+ if (!m_currentEventSelection)
+ return ;
+ KTmpStatusMsg msg(i18n("Cutting selection to clipboard..."), this);
+
+ addCommandToHistory(new CutCommand(*m_currentEventSelection,
+ getDocument()->getClipboard()));
+}
+
+void NotationView::slotEditDelete()
+{
+ if (!m_currentEventSelection)
+ return ;
+ KTmpStatusMsg msg(i18n("Deleting selection..."), this);
+
+ addCommandToHistory(new EraseCommand(*m_currentEventSelection));
+}
+
+void NotationView::slotEditCopy()
+{
+ if (!m_currentEventSelection)
+ return ;
+ KTmpStatusMsg msg(i18n("Copying selection to clipboard..."), this);
+
+ addCommandToHistory(new CopyCommand(*m_currentEventSelection,
+ getDocument()->getClipboard()));
+}
+
+void NotationView::slotEditCutAndClose()
+{
+ if (!m_currentEventSelection)
+ return ;
+ KTmpStatusMsg msg(i18n("Cutting selection to clipboard..."), this);
+
+ addCommandToHistory(new CutAndCloseCommand(*m_currentEventSelection,
+ getDocument()->getClipboard()));
+}
+
+static const QString RESTRICTED_PASTE_FAILED_DESCRIPTION = i18n(
+ "The Restricted paste type requires enough empty " \
+ "space (containing only rests) at the paste position " \
+ "to hold all of the events to be pasted.\n" \
+ "Not enough space was found.\n" \
+ "If you want to paste anyway, consider using one of " \
+ "the other paste types from the \"Paste...\" option " \
+ "on the Edit menu. You can also change the default " \
+ "paste type to something other than Restricted if " \
+ "you wish."
+ );
+
+void NotationView::slotEditPaste()
+{
+ Clipboard * clipboard = getDocument()->getClipboard();
+
+ if (clipboard->isEmpty()) {
+ slotStatusHelpMsg(i18n("Clipboard is empty"));
+ return ;
+ }
+ if (!clipboard->isSingleSegment()) {
+ slotStatusHelpMsg(i18n("Can't paste multiple Segments into one"));
+ return ;
+ }
+
+ slotStatusHelpMsg(i18n("Inserting clipboard contents..."));
+
+ LinedStaff *staff = getCurrentLinedStaff();
+ Segment &segment = staff->getSegment();
+
+ // Paste at cursor position
+ //
+ timeT insertionTime = getInsertionTime();
+ timeT endTime = insertionTime +
+ (clipboard->getSingleSegment()->getEndTime() -
+ clipboard->getSingleSegment()->getStartTime());
+
+ KConfig *config = kapp->config();
+ config->setGroup(NotationViewConfigGroup);
+ PasteEventsCommand::PasteType defaultType = (PasteEventsCommand::PasteType)
+ config->readUnsignedNumEntry("pastetype",
+ PasteEventsCommand::Restricted);
+
+ PasteEventsCommand *command = new PasteEventsCommand
+ (segment, clipboard, insertionTime, defaultType);
+
+ if (!command->isPossible()) {
+ KMessageBox::detailedError
+ (this,
+ i18n("Couldn't paste at this point."), RESTRICTED_PASTE_FAILED_DESCRIPTION);
+ } else {
+ addCommandToHistory(command);
+ setCurrentSelection(new EventSelection(command->getPastedEvents()));
+ slotSetInsertCursorPosition(endTime, true, false);
+ }
+}
+
+void NotationView::slotEditGeneralPaste()
+{
+ Clipboard *clipboard = getDocument()->getClipboard();
+
+ if (clipboard->isEmpty()) {
+ slotStatusHelpMsg(i18n("Clipboard is empty"));
+ return ;
+ }
+
+ slotStatusHelpMsg(i18n("Inserting clipboard contents..."));
+
+ LinedStaff *staff = getCurrentLinedStaff();
+ Segment &segment = staff->getSegment();
+
+ KConfig *config = kapp->config();
+ config->setGroup(NotationViewConfigGroup);
+ PasteEventsCommand::PasteType defaultType = (PasteEventsCommand::PasteType)
+ config->readUnsignedNumEntry("pastetype",
+ PasteEventsCommand::Restricted);
+
+ PasteNotationDialog dialog(this, defaultType);
+
+ if (dialog.exec() == QDialog::Accepted) {
+
+ PasteEventsCommand::PasteType type = dialog.getPasteType();
+ if (dialog.setAsDefault()) {
+ config->setGroup(NotationViewConfigGroup);
+ config->writeEntry("pastetype", type);
+ }
+
+ timeT insertionTime = getInsertionTime();
+ timeT endTime = insertionTime +
+ (clipboard->getSingleSegment()->getEndTime() -
+ clipboard->getSingleSegment()->getStartTime());
+
+ PasteEventsCommand *command = new PasteEventsCommand
+ (segment, clipboard, insertionTime, type);
+
+ if (!command->isPossible()) {
+ KMessageBox::detailedError
+ (this,
+ i18n("Couldn't paste at this point."),
+ i18n(RESTRICTED_PASTE_FAILED_DESCRIPTION));
+ } else {
+ addCommandToHistory(command);
+ setCurrentSelection(new EventSelection
+ (segment, insertionTime, endTime));
+ slotSetInsertCursorPosition(endTime, true, false);
+ }
+ }
+}
+
+void
+NotationView::slotMoveEventsUpStaff()
+{
+ LinedStaff *targetStaff = getStaffAbove();
+ if (!targetStaff) return;
+ if (!m_currentEventSelection) return;
+ Segment &targetSegment = targetStaff->getSegment();
+
+ KMacroCommand *command = new KMacroCommand(i18n("Move Events to Staff Above"));
+
+ timeT insertionTime = m_currentEventSelection->getStartTime();
+
+ Clipboard *c = new Clipboard;
+ CopyCommand *cc = new CopyCommand(*m_currentEventSelection, c);
+ cc->execute();
+
+ command->addCommand(new EraseCommand(*m_currentEventSelection));;
+
+ command->addCommand(new PasteEventsCommand
+ (targetSegment, c,
+ insertionTime,
+ PasteEventsCommand::NoteOverlay));
+
+ addCommandToHistory(command);
+
+ delete c;
+}
+
+void
+NotationView::slotMoveEventsDownStaff()
+{
+ LinedStaff *targetStaff = getStaffBelow();
+ if (!targetStaff) return;
+ if (!m_currentEventSelection) return;
+ Segment &targetSegment = targetStaff->getSegment();
+
+ KMacroCommand *command = new KMacroCommand(i18n("Move Events to Staff Below"));
+
+ timeT insertionTime = m_currentEventSelection->getStartTime();
+
+ Clipboard *c = new Clipboard;
+ CopyCommand *cc = new CopyCommand(*m_currentEventSelection, c);
+ cc->execute();
+
+ command->addCommand(new EraseCommand(*m_currentEventSelection));;
+
+ command->addCommand(new PasteEventsCommand
+ (targetSegment, c,
+ insertionTime,
+ PasteEventsCommand::NoteOverlay));
+
+ addCommandToHistory(command);
+
+ delete c;
+}
+
+void NotationView::slotPreviewSelection()
+{
+ if (!m_currentEventSelection)
+ return ;
+
+ getDocument()->slotSetLoop(m_currentEventSelection->getStartTime(),
+ m_currentEventSelection->getEndTime());
+}
+
+void NotationView::slotClearLoop()
+{
+ getDocument()->slotSetLoop(0, 0);
+}
+
+void NotationView::slotClearSelection()
+{
+ // Actually we don't clear the selection immediately: if we're
+ // using some tool other than the select tool, then the first
+ // press switches us back to the select tool.
+
+ NotationSelector *selector = dynamic_cast<NotationSelector *>(m_tool);
+
+ if (!selector) {
+ slotSelectSelected();
+ } else {
+ setCurrentSelection(0);
+ }
+}
+
+void NotationView::slotEditSelectFromStart()
+{
+ timeT t = getInsertionTime();
+ Segment &segment = m_staffs[m_currentStaff]->getSegment();
+ setCurrentSelection(new EventSelection(segment,
+ segment.getStartTime(),
+ t));
+}
+
+void NotationView::slotEditSelectToEnd()
+{
+ timeT t = getInsertionTime();
+ Segment &segment = m_staffs[m_currentStaff]->getSegment();
+ setCurrentSelection(new EventSelection(segment,
+ t,
+ segment.getEndMarkerTime()));
+}
+
+void NotationView::slotEditSelectWholeStaff()
+{
+ Segment &segment = m_staffs[m_currentStaff]->getSegment();
+ setCurrentSelection(new EventSelection(segment,
+ segment.getStartTime(),
+ segment.getEndMarkerTime()));
+}
+
+void NotationView::slotFilterSelection()
+{
+ NOTATION_DEBUG << "NotationView::slotFilterSelection" << endl;
+
+ Segment *segment = getCurrentSegment();
+ EventSelection *existingSelection = m_currentEventSelection;
+ if (!segment || !existingSelection)
+ return ;
+
+ EventFilterDialog dialog(this);
+ if (dialog.exec() == QDialog::Accepted) {
+ NOTATION_DEBUG << "slotFilterSelection- accepted" << endl;
+
+ bool haveEvent = false;
+
+ EventSelection *newSelection = new EventSelection(*segment);
+ EventSelection::eventcontainer &ec =
+ existingSelection->getSegmentEvents();
+ for (EventSelection::eventcontainer::iterator i =
+ ec.begin(); i != ec.end(); ++i) {
+ if (dialog.keepEvent(*i)) {
+ haveEvent = true;
+ newSelection->addEvent(*i);
+ }
+ }
+
+ if (haveEvent)
+ setCurrentSelection(newSelection);
+ else
+ setCurrentSelection(0);
+ }
+}
+
+void NotationView::slotFinePositionLeft()
+{
+ if (!m_currentEventSelection)
+ return ;
+ KTmpStatusMsg msg(i18n("Pushing selection left..."), this);
+
+ // half a note body width
+ addCommandToHistory(new IncrementDisplacementsCommand
+ (*m_currentEventSelection, -500, 0));
+}
+
+void NotationView::slotFinePositionRight()
+{
+ if (!m_currentEventSelection)
+ return ;
+ KTmpStatusMsg msg(i18n("Pushing selection right..."), this);
+
+ // half a note body width
+ addCommandToHistory(new IncrementDisplacementsCommand
+ (*m_currentEventSelection, 500, 0));
+}
+
+void NotationView::slotFinePositionUp()
+{
+ if (!m_currentEventSelection)
+ return ;
+ KTmpStatusMsg msg(i18n("Pushing selection up..."), this);
+
+ // half line height
+ addCommandToHistory(new IncrementDisplacementsCommand
+ (*m_currentEventSelection, 0, -500));
+}
+
+void NotationView::slotFinePositionDown()
+{
+ if (!m_currentEventSelection)
+ return ;
+ KTmpStatusMsg msg(i18n("Pushing selection down..."), this);
+
+ // half line height
+ addCommandToHistory(new IncrementDisplacementsCommand
+ (*m_currentEventSelection, 0, 500));
+}
+
+void NotationView::slotFinePositionRestore()
+{
+ if (!m_currentEventSelection)
+ return ;
+ KTmpStatusMsg msg(i18n("Restoring computed positions..."), this);
+
+ addCommandToHistory(new ResetDisplacementsCommand(*m_currentEventSelection));
+}
+
+void NotationView::slotMakeVisible()
+{
+ if (!m_currentEventSelection)
+ return ;
+ KTmpStatusMsg msg(i18n("Making visible..."), this);
+
+ addCommandToHistory(new SetVisibilityCommand(*m_currentEventSelection, true));
+}
+
+void NotationView::slotMakeInvisible()
+{
+ if (!m_currentEventSelection)
+ return ;
+ KTmpStatusMsg msg(i18n("Making invisible..."), this);
+
+ addCommandToHistory(new SetVisibilityCommand(*m_currentEventSelection, false));
+}
+
+void NotationView::slotToggleToolsToolBar()
+{
+ toggleNamedToolBar("Tools Toolbar");
+}
+
+void NotationView::slotToggleNotesToolBar()
+{
+ toggleNamedToolBar("Notes Toolbar");
+}
+
+void NotationView::slotToggleRestsToolBar()
+{
+ toggleNamedToolBar("Rests Toolbar");
+}
+
+void NotationView::slotToggleAccidentalsToolBar()
+{
+ toggleNamedToolBar("Accidentals Toolbar");
+}
+
+void NotationView::slotToggleClefsToolBar()
+{
+ toggleNamedToolBar("Clefs Toolbar");
+}
+
+void NotationView::slotToggleMetaToolBar()
+{
+ toggleNamedToolBar("Meta Toolbar");
+}
+
+void NotationView::slotToggleMarksToolBar()
+{
+ toggleNamedToolBar("Marks Toolbar");
+}
+
+void NotationView::slotToggleGroupToolBar()
+{
+ toggleNamedToolBar("Group Toolbar");
+}
+
+void NotationView::slotToggleLayoutToolBar()
+{
+ toggleNamedToolBar("Layout Toolbar");
+}
+
+void NotationView::slotToggleTransportToolBar()
+{
+ toggleNamedToolBar("Transport Toolbar");
+}
+
+void NotationView::toggleNamedToolBar(const QString& toolBarName, bool* force)
+{
+ KToolBar *namedToolBar = toolBar(toolBarName);
+
+ if (!namedToolBar) {
+ NOTATION_DEBUG << "NotationView::toggleNamedToolBar() : toolBar "
+ << toolBarName << " not found" << endl;
+ return ;
+ }
+
+ if (!force) {
+
+ if (namedToolBar->isVisible())
+ namedToolBar->hide();
+ else
+ namedToolBar->show();
+ } else {
+
+ if (*force)
+ namedToolBar->show();
+ else
+ namedToolBar->hide();
+ }
+
+ setSettingsDirty();
+
+}
+
+void NotationView::slotGroupBeam()
+{
+ if (!m_currentEventSelection)
+ return ;
+ KTmpStatusMsg msg(i18n("Beaming group..."), this);
+
+ addCommandToHistory(new BeamCommand
+ (*m_currentEventSelection));
+}
+
+void NotationView::slotGroupAutoBeam()
+{
+ if (!m_currentEventSelection)
+ return ;
+ KTmpStatusMsg msg(i18n("Auto-beaming selection..."), this);
+
+ addCommandToHistory(new AutoBeamCommand
+ (*m_currentEventSelection));
+}
+
+void NotationView::slotGroupBreak()
+{
+ if (!m_currentEventSelection)
+ return ;
+ KTmpStatusMsg msg(i18n("Breaking groups..."), this);
+
+ addCommandToHistory(new BreakCommand
+ (*m_currentEventSelection));
+}
+
+void NotationView::slotGroupSimpleTuplet()
+{
+ slotGroupTuplet(true);
+}
+
+void NotationView::slotGroupGeneralTuplet()
+{
+ slotGroupTuplet(false);
+}
+
+void NotationView::slotGroupTuplet(bool simple)
+{
+ timeT t = 0;
+ timeT unit = 0;
+ int tupled = 2;
+ int untupled = 3;
+ Segment *segment = 0;
+ bool hasTimingAlready = false;
+
+ if (m_currentEventSelection) {
+
+ t = m_currentEventSelection->getStartTime();
+
+ timeT duration = m_currentEventSelection->getTotalDuration();
+ Note::Type unitType =
+ Note::getNearestNote(duration / 3, 0).getNoteType();
+ unit = Note(unitType).getDuration();
+
+ if (!simple) {
+ TupletDialog dialog(this, unitType, duration);
+ if (dialog.exec() != QDialog::Accepted)
+ return ;
+ unit = Note(dialog.getUnitType()).getDuration();
+ tupled = dialog.getTupledCount();
+ untupled = dialog.getUntupledCount();
+ hasTimingAlready = dialog.hasTimingAlready();
+ }
+
+ segment = &m_currentEventSelection->getSegment();
+
+ } else {
+
+ t = getInsertionTime();
+
+ NoteInserter *currentInserter = dynamic_cast<NoteInserter *>
+ (m_toolBox->getTool(NoteInserter::ToolName));
+
+ Note::Type unitType;
+
+ if (currentInserter) {
+ unitType = currentInserter->getCurrentNote().getNoteType();
+ } else {
+ unitType = Note::Quaver;
+ }
+
+ unit = Note(unitType).getDuration();
+
+ if (!simple) {
+ TupletDialog dialog(this, unitType);
+ if (dialog.exec() != QDialog::Accepted)
+ return ;
+ unit = Note(dialog.getUnitType()).getDuration();
+ tupled = dialog.getTupledCount();
+ untupled = dialog.getUntupledCount();
+ hasTimingAlready = dialog.hasTimingAlready();
+ }
+
+ segment = &m_staffs[m_currentStaff]->getSegment();
+ }
+
+ addCommandToHistory(new TupletCommand
+ (*segment, t, unit, untupled, tupled, hasTimingAlready));
+
+ if (!hasTimingAlready) {
+ slotSetInsertCursorPosition(t + (unit * tupled), true, false);
+ }
+}
+
+void NotationView::slotGroupUnTuplet()
+{
+ if (!m_currentEventSelection)
+ return ;
+ KTmpStatusMsg msg(i18n("Untupleting..."), this);
+
+ addCommandToHistory(new UnTupletCommand
+ (*m_currentEventSelection));
+}
+
+void NotationView::slotGroupSlur()
+{
+ KTmpStatusMsg msg(i18n("Adding slur..."), this);
+ slotAddIndication(Indication::Slur, i18n("slur"));
+}
+
+void NotationView::slotGroupPhrasingSlur()
+{
+ KTmpStatusMsg msg(i18n("Adding phrasing slur..."), this);
+ slotAddIndication(Indication::PhrasingSlur, i18n("phrasing slur"));
+}
+
+void NotationView::slotGroupGlissando()
+{
+ KTmpStatusMsg msg(i18n("Adding glissando..."), this);
+ slotAddIndication(Indication::Glissando, i18n("glissando"));
+}
+
+void NotationView::slotGroupCrescendo()
+{
+ KTmpStatusMsg msg(i18n("Adding crescendo..."), this);
+ slotAddIndication(Indication::Crescendo, i18n("dynamic"));
+}
+
+void NotationView::slotGroupDecrescendo()
+{
+ KTmpStatusMsg msg(i18n("Adding decrescendo..."), this);
+ slotAddIndication(Indication::Decrescendo, i18n("dynamic"));
+}
+
+void NotationView::slotGroupOctave2Up()
+{
+ KTmpStatusMsg msg(i18n("Adding octave..."), this);
+ slotAddIndication(Indication::QuindicesimaUp, i18n("ottava"));
+}
+
+void NotationView::slotGroupOctaveUp()
+{
+ KTmpStatusMsg msg(i18n("Adding octave..."), this);
+ slotAddIndication(Indication::OttavaUp, i18n("ottava"));
+}
+
+void NotationView::slotGroupOctaveDown()
+{
+ KTmpStatusMsg msg(i18n("Adding octave..."), this);
+ slotAddIndication(Indication::OttavaDown, i18n("ottava"));
+}
+
+void NotationView::slotGroupOctave2Down()
+{
+ KTmpStatusMsg msg(i18n("Adding octave..."), this);
+ slotAddIndication(Indication::QuindicesimaDown, i18n("ottava"));
+}
+
+void NotationView::slotAddIndication(std::string type, QString desc)
+{
+ if (!m_currentEventSelection)
+ return ;
+
+ AddIndicationCommand *command =
+ new AddIndicationCommand(type, *m_currentEventSelection);
+
+ if (command->canExecute()) {
+ addCommandToHistory(command);
+ setSingleSelectedEvent(m_currentEventSelection->getSegment(),
+ command->getLastInsertedEvent());
+ } else {
+ KMessageBox::sorry(this, i18n("Can't add overlapping %1 indications").arg(desc)); // TODO PLURAL - how many 'indications' ?
+ delete command;
+ }
+}
+
+void NotationView::slotGroupMakeChord()
+{
+ if (!m_currentEventSelection)
+ return ;
+ KTmpStatusMsg msg(i18n("Making chord..."), this);
+
+ MakeChordCommand *command =
+ new MakeChordCommand(*m_currentEventSelection);
+
+ addCommandToHistory(command);
+}
+
+void NotationView::slotTransformsNormalizeRests()
+{
+ if (!m_currentEventSelection)
+ return ;
+ KTmpStatusMsg msg(i18n("Normalizing rests..."), this);
+
+ addCommandToHistory(new NormalizeRestsCommand
+ (*m_currentEventSelection));
+}
+
+void NotationView::slotTransformsCollapseRests()
+{
+ if (!m_currentEventSelection)
+ return ;
+ KTmpStatusMsg msg(i18n("Collapsing rests..."), this);
+
+ addCommandToHistory(new CollapseRestsCommand
+ (*m_currentEventSelection));
+}
+
+void NotationView::slotTransformsCollapseNotes()
+{
+ if (!m_currentEventSelection)
+ return ;
+ KTmpStatusMsg msg(i18n("Collapsing notes..."), this);
+
+ addCommandToHistory(new CollapseNotesCommand
+ (*m_currentEventSelection));
+}
+
+void NotationView::slotTransformsTieNotes()
+{
+ if (!m_currentEventSelection)
+ return ;
+ KTmpStatusMsg msg(i18n("Tying notes..."), this);
+
+ addCommandToHistory(new TieNotesCommand
+ (*m_currentEventSelection));
+}
+
+void NotationView::slotTransformsUntieNotes()
+{
+ if (!m_currentEventSelection)
+ return ;
+ KTmpStatusMsg msg(i18n("Untying notes..."), this);
+
+ addCommandToHistory(new UntieNotesCommand
+ (*m_currentEventSelection));
+}
+
+void NotationView::slotTransformsMakeNotesViable()
+{
+ if (!m_currentEventSelection)
+ return ;
+ KTmpStatusMsg msg(i18n("Making notes viable..."), this);
+
+ addCommandToHistory(new MakeNotesViableCommand
+ (*m_currentEventSelection));
+}
+
+void NotationView::slotTransformsDeCounterpoint()
+{
+ if (!m_currentEventSelection)
+ return ;
+ KTmpStatusMsg msg(i18n("Removing counterpoint..."), this);
+
+ addCommandToHistory(new DeCounterpointCommand
+ (*m_currentEventSelection));
+}
+
+void NotationView::slotTransformsStemsUp()
+{
+ if (!m_currentEventSelection)
+ return ;
+ KTmpStatusMsg msg(i18n("Pointing stems up..."), this);
+
+ addCommandToHistory(new ChangeStemsCommand
+ (true, *m_currentEventSelection));
+}
+
+void NotationView::slotTransformsStemsDown()
+{
+ if (!m_currentEventSelection)
+ return ;
+ KTmpStatusMsg msg(i18n("Pointing stems down..."), this);
+
+ addCommandToHistory(new ChangeStemsCommand
+ (false, *m_currentEventSelection));
+
+}
+
+void NotationView::slotTransformsRestoreStems()
+{
+ if (!m_currentEventSelection)
+ return ;
+ KTmpStatusMsg msg(i18n("Restoring computed stem directions..."), this);
+
+ addCommandToHistory(new RestoreStemsCommand
+ (*m_currentEventSelection));
+}
+
+void NotationView::slotTransformsSlursAbove()
+{
+ if (!m_currentEventSelection)
+ return ;
+ KTmpStatusMsg msg(i18n("Positioning slurs..."), this);
+
+ addCommandToHistory(new ChangeSlurPositionCommand
+ (true, *m_currentEventSelection));
+}
+
+void NotationView::slotTransformsSlursBelow()
+{
+ if (!m_currentEventSelection)
+ return ;
+ KTmpStatusMsg msg(i18n("Positioning slurs..."), this);
+
+ addCommandToHistory(new ChangeSlurPositionCommand
+ (false, *m_currentEventSelection));
+
+}
+
+void NotationView::slotTransformsRestoreSlurs()
+{
+ if (!m_currentEventSelection)
+ return ;
+ KTmpStatusMsg msg(i18n("Restoring slur positions..."), this);
+
+ addCommandToHistory(new RestoreSlursCommand
+ (*m_currentEventSelection));
+}
+
+void NotationView::slotTransformsTiesAbove()
+{
+ if (!m_currentEventSelection)
+ return ;
+ KTmpStatusMsg msg(i18n("Positioning ties..."), this);
+
+ addCommandToHistory(new ChangeTiePositionCommand
+ (true, *m_currentEventSelection));
+}
+
+void NotationView::slotTransformsTiesBelow()
+{
+ if (!m_currentEventSelection)
+ return ;
+ KTmpStatusMsg msg(i18n("Positioning ties..."), this);
+
+ addCommandToHistory(new ChangeTiePositionCommand
+ (false, *m_currentEventSelection));
+
+}
+
+void NotationView::slotTransformsRestoreTies()
+{
+ if (!m_currentEventSelection)
+ return ;
+ KTmpStatusMsg msg(i18n("Restoring tie positions..."), this);
+
+ addCommandToHistory(new RestoreTiesCommand
+ (*m_currentEventSelection));
+}
+
+void NotationView::slotTransformsFixQuantization()
+{
+ if (!m_currentEventSelection)
+ return ;
+ KTmpStatusMsg msg(i18n("Fixing notation quantization..."), this);
+
+ addCommandToHistory(new FixNotationQuantizeCommand
+ (*m_currentEventSelection));
+}
+
+void NotationView::slotTransformsRemoveQuantization()
+{
+ if (!m_currentEventSelection)
+ return ;
+ KTmpStatusMsg msg(i18n("Removing notation quantization..."), this);
+
+ addCommandToHistory(new RemoveNotationQuantizeCommand
+ (*m_currentEventSelection));
+}
+
+void NotationView::slotSetStyleFromAction()
+{
+ const QObject *s = sender();
+ QString name = s->name();
+
+ if (!m_currentEventSelection)
+ return ;
+
+ if (name.left(6) == "style_") {
+ name = name.right(name.length() - 6);
+
+ KTmpStatusMsg msg(i18n("Changing to %1 style...").arg(name),
+ this);
+
+ addCommandToHistory(new ChangeStyleCommand
+ (NoteStyleName(qstrtostr(name)),
+ *m_currentEventSelection));
+ } else {
+ KMessageBox::sorry
+ (this, i18n("Unknown style action %1").arg(name));
+ }
+}
+
+void NotationView::slotInsertNoteFromAction()
+{
+ const QObject *s = sender();
+ QString name = s->name();
+
+ Segment &segment = m_staffs[m_currentStaff]->getSegment();
+
+ NoteInserter *noteInserter = dynamic_cast<NoteInserter *>(m_tool);
+ if (!noteInserter) {
+ KMessageBox::sorry(this, i18n("No note duration selected"));
+ return ;
+ }
+
+ int pitch = 0;
+ Accidental accidental =
+ Accidentals::NoAccidental;
+
+ timeT time(getInsertionTime());
+ Rosegarden::Key key = segment.getKeyAtTime(time);
+ Clef clef = segment.getClefAtTime(time);
+
+ try {
+
+ pitch = getPitchFromNoteInsertAction(name, accidental, clef, key);
+
+ } catch (...) {
+
+ KMessageBox::sorry
+ (this, i18n("Unknown note insert action %1").arg(name));
+ return ;
+ }
+
+ KTmpStatusMsg msg(i18n("Inserting note"), this);
+
+ NOTATION_DEBUG << "Inserting note at pitch " << pitch << endl;
+
+ noteInserter->insertNote(segment, time, pitch, accidental);
+}
+
+void NotationView::slotInsertRest()
+{
+ Segment &segment = m_staffs[m_currentStaff]->getSegment();
+ timeT time = getInsertionTime();
+
+ RestInserter *restInserter = dynamic_cast<RestInserter *>(m_tool);
+
+ if (!restInserter) {
+
+ NoteInserter *noteInserter = dynamic_cast<NoteInserter *>(m_tool);
+ if (!noteInserter) {
+ KMessageBox::sorry(this, i18n("No note duration selected"));
+ return ;
+ }
+
+ Note note(noteInserter->getCurrentNote());
+
+ restInserter = dynamic_cast<RestInserter*>
+ (m_toolBox->getTool(RestInserter::ToolName));
+
+ restInserter->slotSetNote(note.getNoteType());
+ restInserter->slotSetDots(note.getDots());
+ }
+
+ restInserter->insertNote(segment, time,
+ 0, Accidentals::NoAccidental, true);
+}
+
+void NotationView::slotSwitchFromRestToNote()
+{
+ RestInserter *restInserter = dynamic_cast<RestInserter *>(m_tool);
+ if (!restInserter) {
+ KMessageBox::sorry(this, i18n("No rest duration selected"));
+ return ;
+ }
+
+ Note note(restInserter->getCurrentNote());
+
+ QString actionName = NotationStrings::getReferenceName(note, false);
+ actionName = actionName.replace("-", "_");
+
+ KRadioAction *action = dynamic_cast<KRadioAction *>
+ (actionCollection()->action(actionName));
+
+ if (!action) {
+ std::cerr << "WARNING: Failed to find note action \""
+ << actionName << "\"" << std::endl;
+ } else {
+ action->activate();
+ }
+
+ NoteInserter *noteInserter = dynamic_cast<NoteInserter*>
+ (m_toolBox->getTool(NoteInserter::ToolName));
+
+ if (noteInserter) {
+ noteInserter->slotSetNote(note.getNoteType());
+ noteInserter->slotSetDots(note.getDots());
+ setTool(noteInserter);
+ }
+
+ setMenuStates();
+}
+
+void NotationView::slotSwitchFromNoteToRest()
+{
+ NoteInserter *noteInserter = dynamic_cast<NoteInserter *>(m_tool);
+ if (!noteInserter) {
+ KMessageBox::sorry(this, i18n("No note duration selected"));
+ return ;
+ }
+
+ Note note(noteInserter->getCurrentNote());
+
+ QString actionName = NotationStrings::getReferenceName(note, true);
+ actionName = actionName.replace("-", "_");
+
+ KRadioAction *action = dynamic_cast<KRadioAction *>
+ (actionCollection()->action(actionName));
+
+ if (!action) {
+ std::cerr << "WARNING: Failed to find rest action \""
+ << actionName << "\"" << std::endl;
+ } else {
+ action->activate();
+ }
+
+ RestInserter *restInserter = dynamic_cast<RestInserter*>
+ (m_toolBox->getTool(RestInserter::ToolName));
+
+ if (restInserter) {
+ restInserter->slotSetNote(note.getNoteType());
+ restInserter->slotSetDots(note.getDots());
+ setTool(restInserter);
+ }
+
+ setMenuStates();
+}
+
+void NotationView::slotToggleDot()
+{
+ NoteInserter *noteInserter = dynamic_cast<NoteInserter *>(m_tool);
+ if (noteInserter) {
+ Note note(noteInserter->getCurrentNote());
+ if (note.getNoteType() == Note::Shortest ||
+ note.getNoteType() == Note::Longest)
+ return ;
+ noteInserter->slotSetDots(note.getDots() ? 0 : 1);
+ setTool(noteInserter);
+ } else {
+ RestInserter *restInserter = dynamic_cast<RestInserter *>(m_tool);
+ if (restInserter) {
+ Note note(restInserter->getCurrentNote());
+ if (note.getNoteType() == Note::Shortest ||
+ note.getNoteType() == Note::Longest)
+ return ;
+ restInserter->slotSetDots(note.getDots() ? 0 : 1);
+ setTool(restInserter);
+ } else {
+ KMessageBox::sorry(this, i18n("No note or rest duration selected"));
+ }
+ }
+
+ setMenuStates();
+}
+
+void NotationView::slotRespellDoubleFlat()
+{
+ if (!m_currentEventSelection)
+ return ;
+ KTmpStatusMsg msg(i18n("Forcing accidentals..."), this);
+
+ addCommandToHistory(new RespellCommand(RespellCommand::Set,
+ Accidentals::DoubleFlat,
+ *m_currentEventSelection));
+}
+
+void NotationView::slotRespellFlat()
+{
+ if (!m_currentEventSelection)
+ return ;
+ KTmpStatusMsg msg(i18n("Forcing accidentals..."), this);
+
+ addCommandToHistory(new RespellCommand(RespellCommand::Set,
+ Accidentals::Flat,
+ *m_currentEventSelection));
+}
+
+void NotationView::slotRespellNatural()
+{
+ if (!m_currentEventSelection)
+ return ;
+ KTmpStatusMsg msg(i18n("Forcing accidentals..."), this);
+
+ addCommandToHistory(new RespellCommand(RespellCommand::Set,
+ Accidentals::Natural,
+ *m_currentEventSelection));
+}
+
+void NotationView::slotRespellSharp()
+{
+ if (!m_currentEventSelection)
+ return ;
+ KTmpStatusMsg msg(i18n("Forcing accidentals..."), this);
+
+ addCommandToHistory(new RespellCommand(RespellCommand::Set,
+ Accidentals::Sharp,
+ *m_currentEventSelection));
+}
+
+void NotationView::slotRespellDoubleSharp()
+{
+ if (!m_currentEventSelection)
+ return ;
+ KTmpStatusMsg msg(i18n("Forcing accidentals..."), this);
+
+ addCommandToHistory(new RespellCommand(RespellCommand::Set,
+ Accidentals::DoubleSharp,
+ *m_currentEventSelection));
+}
+
+void NotationView::slotRespellUp()
+{
+ if (!m_currentEventSelection)
+ return ;
+ KTmpStatusMsg msg(i18n("Forcing accidentals..."), this);
+
+ addCommandToHistory(new RespellCommand(RespellCommand::Up,
+ Accidentals::NoAccidental,
+ *m_currentEventSelection));
+}
+
+void NotationView::slotRespellDown()
+{
+ if (!m_currentEventSelection)
+ return ;
+ KTmpStatusMsg msg(i18n("Forcing accidentals..."), this);
+
+ addCommandToHistory(new RespellCommand(RespellCommand::Down,
+ Accidentals::NoAccidental,
+ *m_currentEventSelection));
+}
+
+void NotationView::slotRespellRestore()
+{
+ if (!m_currentEventSelection)
+ return ;
+ KTmpStatusMsg msg(i18n("Restoring accidentals..."), this);
+
+ addCommandToHistory(new RespellCommand(RespellCommand::Restore,
+ Accidentals::NoAccidental,
+ *m_currentEventSelection));
+}
+
+void NotationView::slotShowCautionary()
+{
+ if (!m_currentEventSelection)
+ return ;
+ KTmpStatusMsg msg(i18n("Showing cautionary accidentals..."), this);
+
+ addCommandToHistory(new MakeAccidentalsCautionaryCommand
+ (true, *m_currentEventSelection));
+}
+
+void NotationView::slotCancelCautionary()
+{
+ if (!m_currentEventSelection)
+ return ;
+ KTmpStatusMsg msg(i18n("Cancelling cautionary accidentals..."), this);
+
+ addCommandToHistory(new MakeAccidentalsCautionaryCommand
+ (false, *m_currentEventSelection));
+}
+
+void NotationView::slotTransformsQuantize()
+{
+ if (!m_currentEventSelection)
+ return ;
+
+ QuantizeDialog dialog(this, true);
+
+ if (dialog.exec() == QDialog::Accepted) {
+ KTmpStatusMsg msg(i18n("Quantizing..."), this);
+ addCommandToHistory(new EventQuantizeCommand
+ (*m_currentEventSelection,
+ dialog.getQuantizer()));
+ }
+}
+
+void NotationView::slotTransformsInterpret()
+{
+ if (!m_currentEventSelection)
+ return ;
+
+ InterpretDialog dialog(this);
+
+ if (dialog.exec() == QDialog::Accepted) {
+ KTmpStatusMsg msg(i18n("Interpreting selection..."), this);
+ addCommandToHistory(new InterpretCommand
+ (*m_currentEventSelection,
+ getDocument()->getComposition().getNotationQuantizer(),
+ dialog.getInterpretations()));
+ }
+}
+
+void NotationView::slotSetNoteDurations(Note::Type type, bool notationOnly)
+{
+ if (!m_currentEventSelection)
+ return ;
+ KTmpStatusMsg msg(i18n("Setting note durations..."), this);
+ addCommandToHistory(new SetNoteTypeCommand(*m_currentEventSelection, type, notationOnly));
+}
+
+void NotationView::slotAddDot()
+{
+ if (!m_currentEventSelection)
+ return ;
+ KTmpStatusMsg msg(i18n("Adding dot..."), this);
+ addCommandToHistory(new AddDotCommand(*m_currentEventSelection, false));
+}
+
+void NotationView::slotAddDotNotationOnly()
+{
+ if (!m_currentEventSelection)
+ return ;
+ KTmpStatusMsg msg(i18n("Adding dot..."), this);
+ addCommandToHistory(new AddDotCommand(*m_currentEventSelection, true));
+}
+
+void NotationView::slotAddSlashes()
+{
+ const QObject *s = sender();
+ if (!m_currentEventSelection)
+ return ;
+
+ QString name = s->name();
+ int slashes = name.right(1).toInt();
+
+ addCommandToHistory(new AddSlashesCommand
+ (slashes, *m_currentEventSelection));
+}
+
+void NotationView::slotMarksAddTextMark()
+{
+ if (m_currentEventSelection) {
+ bool pressedOK = false;
+
+ QString txt = KLineEditDlg::getText(i18n("Text: "), "", &pressedOK, this);
+
+ if (pressedOK) {
+ addCommandToHistory(new AddTextMarkCommand
+ (qstrtostr(txt), *m_currentEventSelection));
+ }
+ }
+}
+
+void NotationView::slotMarksAddFingeringMark()
+{
+ if (m_currentEventSelection) {
+ bool pressedOK = false;
+
+ QString txt = KLineEditDlg::getText(i18n("Fingering: "), "", &pressedOK, this);
+
+ if (pressedOK) {
+ addCommandToHistory(new AddFingeringMarkCommand
+ (qstrtostr(txt), *m_currentEventSelection));
+ }
+ }
+}
+
+void NotationView::slotMarksAddFingeringMarkFromAction()
+{
+ const QObject *s = sender();
+ QString name = s->name();
+
+ if (name.left(14) == "add_fingering_") {
+
+ QString fingering = name.right(name.length() - 14);
+
+ if (fingering == "plus")
+ fingering = "+";
+
+ if (m_currentEventSelection) {
+ addCommandToHistory(new AddFingeringMarkCommand
+ (qstrtostr(fingering), *m_currentEventSelection));
+ }
+ }
+}
+
+void NotationView::slotMarksRemoveMarks()
+{
+ if (m_currentEventSelection)
+ addCommandToHistory(new RemoveMarksCommand
+ (*m_currentEventSelection));
+}
+
+void NotationView::slotMarksRemoveFingeringMarks()
+{
+ if (m_currentEventSelection)
+ addCommandToHistory(new RemoveFingeringMarksCommand
+ (*m_currentEventSelection));
+}
+
+void
+NotationView::slotMakeOrnament()
+{
+ if (!m_currentEventSelection)
+ return ;
+
+ EventSelection::eventcontainer &ec =
+ m_currentEventSelection->getSegmentEvents();
+
+ int basePitch = -1;
+ int baseVelocity = -1;
+ NoteStyle *style = NoteStyleFactory::getStyle(NoteStyleFactory::DefaultStyle);
+
+ for (EventSelection::eventcontainer::iterator i =
+ ec.begin(); i != ec.end(); ++i) {
+ if ((*i)->isa(Note::EventType)) {
+ if ((*i)->has(BaseProperties::PITCH)) {
+ basePitch = (*i)->get
+ <Int>
+ (BaseProperties::PITCH);
+ style = NoteStyleFactory::getStyleForEvent(*i);
+ if (baseVelocity != -1)
+ break;
+ }
+ if ((*i)->has(BaseProperties::VELOCITY)) {
+ baseVelocity = (*i)->get
+ <Int>
+ (BaseProperties::VELOCITY);
+ if (basePitch != -1)
+ break;
+ }
+ }
+ }
+
+ Staff *staff = getCurrentStaff();
+ Segment &segment = staff->getSegment();
+
+ timeT absTime = m_currentEventSelection->getStartTime();
+ timeT duration = m_currentEventSelection->getTotalDuration();
+ Note note(Note::getNearestNote(duration));
+
+ Track *track =
+ segment.getComposition()->getTrackById(segment.getTrack());
+ QString name;
+ int barNo = segment.getComposition()->getBarNumber(absTime);
+ if (track) {
+ name = QString(i18n("Ornament track %1 bar %2").arg(track->getPosition() + 1).arg(barNo + 1));
+ } else {
+ name = QString(i18n("Ornament bar %1").arg(barNo + 1));
+ }
+
+ MakeOrnamentDialog dialog(this, name, basePitch);
+ if (dialog.exec() != QDialog::Accepted)
+ return ;
+
+ name = dialog.getName();
+ basePitch = dialog.getBasePitch();
+
+ KMacroCommand *command = new KMacroCommand(i18n("Make Ornament"));
+
+ command->addCommand(new CutCommand
+ (*m_currentEventSelection,
+ getDocument()->getClipboard()));
+
+ command->addCommand(new PasteToTriggerSegmentCommand
+ (&getDocument()->getComposition(),
+ getDocument()->getClipboard(),
+ name, basePitch));
+
+ command->addCommand(new InsertTriggerNoteCommand
+ (segment, absTime, note, basePitch, baseVelocity,
+ style->getName(),
+ getDocument()->getComposition().getNextTriggerSegmentId(),
+ true,
+ BaseProperties::TRIGGER_SEGMENT_ADJUST_SQUISH,
+ Marks::NoMark)); //!!!
+
+ addCommandToHistory(command);
+}
+
+void
+NotationView::slotUseOrnament()
+{
+ // Take an existing note and match an ornament to it.
+
+ if (!m_currentEventSelection)
+ return ;
+
+ UseOrnamentDialog dialog(this, &getDocument()->getComposition());
+ if (dialog.exec() != QDialog::Accepted)
+ return ;
+
+ addCommandToHistory(new SetTriggerCommand(*m_currentEventSelection,
+ dialog.getId(),
+ true,
+ dialog.getRetune(),
+ dialog.getTimeAdjust(),
+ dialog.getMark(),
+ i18n("Use Ornament")));
+}
+
+void
+NotationView::slotRemoveOrnament()
+{
+ if (!m_currentEventSelection)
+ return ;
+
+ addCommandToHistory(new ClearTriggersCommand(*m_currentEventSelection,
+ i18n("Remove Ornaments")));
+}
+
+void NotationView::slotEditAddClef()
+{
+ Staff *staff = getCurrentStaff();
+ Segment &segment = staff->getSegment();
+ static Clef lastClef;
+ Clef clef;
+ Rosegarden::Key key;
+ timeT insertionTime = getInsertionTime(clef, key);
+
+ ClefDialog dialog(this, m_notePixmapFactory, lastClef);
+
+ if (dialog.exec() == QDialog::Accepted) {
+
+ ClefDialog::ConversionType conversion = dialog.getConversionType();
+
+ bool shouldChangeOctave = (conversion != ClefDialog::NoConversion);
+ bool shouldTranspose = (conversion == ClefDialog::Transpose);
+
+ addCommandToHistory
+ (new ClefInsertionCommand
+ (segment, insertionTime, dialog.getClef(),
+ shouldChangeOctave, shouldTranspose));
+
+ lastClef = dialog.getClef();
+ }
+}
+
+void NotationView::slotEditAddKeySignature()
+{
+ Staff *staff = getCurrentStaff();
+ Segment &segment = staff->getSegment();
+ Clef clef;
+ Rosegarden::Key key;
+ timeT insertionTime = getInsertionTime(clef, key);
+
+ //!!! experimental:
+ CompositionTimeSliceAdapter adapter
+ (&getDocument()->getComposition(), insertionTime,
+ getDocument()->getComposition().getDuration());
+ AnalysisHelper helper;
+ key = helper.guessKey(adapter);
+
+ KeySignatureDialog dialog
+ (this, m_notePixmapFactory, clef, key, true, true,
+ i18n("Estimated key signature shown"));
+
+ if (dialog.exec() == QDialog::Accepted &&
+ dialog.isValid()) {
+
+ KeySignatureDialog::ConversionType conversion =
+ dialog.getConversionType();
+
+ bool transposeKey = dialog.shouldBeTransposed();
+ bool applyToAll = dialog.shouldApplyToAll();
+ bool ignorePercussion = dialog.shouldIgnorePercussion();
+
+ if (applyToAll) {
+ addCommandToHistory
+ (new MultiKeyInsertionCommand
+ (getDocument(),
+ insertionTime, dialog.getKey(),
+ conversion == KeySignatureDialog::Convert,
+ conversion == KeySignatureDialog::Transpose,
+ transposeKey,
+ ignorePercussion));
+ } else {
+ addCommandToHistory
+ (new KeyInsertionCommand
+ (segment,
+ insertionTime, dialog.getKey(),
+ conversion == KeySignatureDialog::Convert,
+ conversion == KeySignatureDialog::Transpose,
+ transposeKey,
+ false));
+ }
+ }
+}
+
+void NotationView::slotEditAddSustain(bool down)
+{
+ Staff *staff = getCurrentStaff();
+ Segment &segment = staff->getSegment();
+ timeT insertionTime = getInsertionTime();
+
+ Studio *studio = &getDocument()->getStudio();
+ Track *track = segment.getComposition()->getTrackById(segment.getTrack());
+
+ if (track) {
+
+ Instrument *instrument = studio->getInstrumentById
+ (track->getInstrument());
+ if (instrument) {
+ MidiDevice *device = dynamic_cast<MidiDevice *>
+ (instrument->getDevice());
+ if (device) {
+ for (ControlList::const_iterator i =
+ device->getControlParameters().begin();
+ i != device->getControlParameters().end(); ++i) {
+
+ if (i->getType() == Controller::EventType &&
+ (i->getName() == "Sustain" ||
+ strtoqstr(i->getName()) == i18n("Sustain"))) {
+
+ addCommandToHistory
+ (new SustainInsertionCommand(segment, insertionTime, down,
+ i->getControllerValue()));
+ return ;
+ }
+ }
+ } else if (instrument->getDevice() &&
+ instrument->getDevice()->getType() == Device::SoftSynth) {
+ addCommandToHistory
+ (new SustainInsertionCommand(segment, insertionTime, down, 64));
+ }
+ }
+ }
+
+ KMessageBox::sorry(this, i18n("There is no sustain controller defined for this device.\nPlease ensure the device is configured correctly in the Manage MIDI Devices dialog in the main window."));
+}
+
+void NotationView::slotEditAddSustainDown()
+{
+ slotEditAddSustain(true);
+}
+
+void NotationView::slotEditAddSustainUp()
+{
+ slotEditAddSustain(false);
+}
+
+void NotationView::slotEditTranspose()
+{
+ IntervalDialog intervalDialog(this, true, true);
+ int ok = intervalDialog.exec();
+
+ int semitones = intervalDialog.getChromaticDistance();
+ int steps = intervalDialog.getDiatonicDistance();
+
+ if (!ok || (semitones == 0 && steps == 0)) return;
+
+ // TODO combine commands into one
+ for (int i = 0; i < m_segments.size(); i++)
+ {
+ addCommandToHistory(new SegmentTransposeCommand(*(m_segments[i]),
+ intervalDialog.getChangeKey(), steps, semitones,
+ intervalDialog.getTransposeSegmentBack()));
+ }
+}
+
+void NotationView::slotEditSwitchPreset()
+{
+ PresetHandlerDialog dialog(this, true);
+
+ if (dialog.exec() != QDialog::Accepted) return;
+
+ if (dialog.getConvertAllSegments()) {
+ // get all segments for this track and convert them.
+ Composition& comp = getDocument()->getComposition();
+ TrackId selectedTrack = getCurrentSegment()->getTrack();
+
+ // satisfy #1885251 the way that seems most reasonble to me at the
+ // moment, only changing track parameters when acting on all segments on
+ // this track from the notation view
+ //
+ //!!! This won't be undoable, and I'm not sure if that's seriously
+ // wrong, or just mildly wrong, but I'm betting somebody will tell me
+ // about it if this was inappropriate
+ Track *track = comp.getTrackById(selectedTrack);
+ track->setPresetLabel(dialog.getName());
+ track->setClef(dialog.getClef());
+ track->setTranspose(dialog.getTranspose());
+ track->setLowestPlayable(dialog.getLowRange());
+ track->setHighestPlayable(dialog.getHighRange());
+
+ addCommandToHistory(new SegmentSyncCommand(comp.getSegments(), selectedTrack,
+ dialog.getTranspose(),
+ dialog.getLowRange(),
+ dialog.getHighRange(),
+ clefIndexToClef(dialog.getClef())));
+ } else {
+ addCommandToHistory(new SegmentSyncCommand(m_segments,
+ dialog.getTranspose(),
+ dialog.getLowRange(),
+ dialog.getHighRange(),
+ clefIndexToClef(dialog.getClef())));
+ }
+
+ m_doc->slotDocumentModified();
+ emit updateView();
+}
+
+void NotationView::slotEditElement(NotationStaff *staff,
+ NotationElement *element, bool advanced)
+{
+ if (advanced) {
+
+ EventEditDialog dialog(this, *element->event(), true);
+
+ if (dialog.exec() == QDialog::Accepted &&
+ dialog.isModified()) {
+
+ EventEditCommand *command = new EventEditCommand
+ (staff->getSegment(),
+ element->event(),
+ dialog.getEvent());
+
+ addCommandToHistory(command);
+ }
+
+ } else if (element->event()->isa(Clef::EventType)) {
+
+ try {
+ ClefDialog dialog(this, m_notePixmapFactory,
+ Clef(*element->event()));
+
+ if (dialog.exec() == QDialog::Accepted) {
+
+ ClefDialog::ConversionType conversion = dialog.getConversionType();
+ bool shouldChangeOctave = (conversion != ClefDialog::NoConversion);
+ bool shouldTranspose = (conversion == ClefDialog::Transpose);
+ addCommandToHistory
+ (new ClefInsertionCommand
+ (staff->getSegment(), element->event()->getAbsoluteTime(),
+ dialog.getClef(), shouldChangeOctave, shouldTranspose));
+ }
+ } catch (Exception e) {
+ std::cerr << e.getMessage() << std::endl;
+ }
+
+ return ;
+
+ } else if (element->event()->isa(Rosegarden::Key::EventType)) {
+
+ try {
+ Clef clef(staff->getSegment().getClefAtTime
+ (element->event()->getAbsoluteTime()));
+ KeySignatureDialog dialog
+ (this, m_notePixmapFactory, clef, Rosegarden::Key(*element->event()),
+ false, true);
+
+ if (dialog.exec() == QDialog::Accepted &&
+ dialog.isValid()) {
+
+ KeySignatureDialog::ConversionType conversion =
+ dialog.getConversionType();
+
+ addCommandToHistory
+ (new KeyInsertionCommand
+ (staff->getSegment(),
+ element->event()->getAbsoluteTime(), dialog.getKey(),
+ conversion == KeySignatureDialog::Convert,
+ conversion == KeySignatureDialog::Transpose,
+ dialog.shouldBeTransposed(),
+ dialog.shouldIgnorePercussion()));
+ }
+
+ } catch (Exception e) {
+ std::cerr << e.getMessage() << std::endl;
+ }
+
+ return ;
+
+ } else if (element->event()->isa(Text::EventType)) {
+
+ try {
+ TextEventDialog dialog
+ (this, m_notePixmapFactory, Text(*element->event()));
+ if (dialog.exec() == QDialog::Accepted) {
+ TextInsertionCommand *command = new TextInsertionCommand
+ (staff->getSegment(),
+ element->event()->getAbsoluteTime(),
+ dialog.getText());
+ KMacroCommand *macroCommand = new KMacroCommand(command->name());
+ macroCommand->addCommand(new EraseEventCommand(staff->getSegment(),
+ element->event(), false));
+ macroCommand->addCommand(command);
+ addCommandToHistory(macroCommand);
+ }
+ } catch (Exception e) {
+ std::cerr << e.getMessage() << std::endl;
+ }
+
+ return ;
+
+ } else if (element->isNote() &&
+ element->event()->has(BaseProperties::TRIGGER_SEGMENT_ID)) {
+
+ int id = element->event()->get
+ <Int>
+ (BaseProperties::TRIGGER_SEGMENT_ID);
+ emit editTriggerSegment(id);
+ return ;
+
+ } else {
+
+ SimpleEventEditDialog dialog(this, getDocument(), *element->event(), false);
+
+ if (dialog.exec() == QDialog::Accepted &&
+ dialog.isModified()) {
+
+ EventEditCommand *command = new EventEditCommand
+ (staff->getSegment(),
+ element->event(),
+ dialog.getEvent());
+
+ addCommandToHistory(command);
+ }
+ }
+}
+
+void NotationView::slotBeginLilyPondRepeat()
+{}
+
+void NotationView::slotDebugDump()
+{
+ if (m_currentEventSelection) {
+ EventSelection::eventcontainer &ec =
+ m_currentEventSelection->getSegmentEvents();
+ int n = 0;
+ for (EventSelection::eventcontainer::iterator i =
+ ec.begin();
+ i != ec.end(); ++i) {
+ std::cerr << "\n" << n++ << " [" << (*i) << "]" << std::endl;
+ (*i)->dump(std::cerr);
+ }
+ }
+}
+
+void
+NotationView::slotSetPointerPosition(timeT time)
+{
+ slotSetPointerPosition(time, m_playTracking);
+}
+
+void
+NotationView::slotSetPointerPosition(timeT time, bool scroll)
+{
+ Composition &comp = getDocument()->getComposition();
+ int barNo = comp.getBarNumber(time);
+
+ int minCy = 0;
+ double cx = 0;
+ bool haveMinCy = false;
+
+ for (unsigned int i = 0; i < m_staffs.size(); ++i) {
+
+ double layoutX = m_hlayout->getXForTimeByEvent(time);
+ Segment &seg = m_staffs[i]->getSegment();
+
+ bool good = true;
+
+ if (barNo >= m_hlayout->getLastVisibleBarOnStaff(*m_staffs[i])) {
+ if (seg.isRepeating() && time < seg.getRepeatEndTime()) {
+ timeT mappedTime =
+ seg.getStartTime() +
+ ((time - seg.getStartTime()) %
+ (seg.getEndMarkerTime() - seg.getStartTime()));
+ layoutX = m_hlayout->getXForTimeByEvent(mappedTime);
+ } else {
+ good = false;
+ }
+ } else if (barNo < m_hlayout->getFirstVisibleBarOnStaff(*m_staffs[i])) {
+ good = false;
+ }
+
+ if (!good) {
+
+ m_staffs[i]->hidePointer();
+
+ } else {
+
+ m_staffs[i]->setPointerPosition(layoutX);
+
+ int cy;
+ m_staffs[i]->getPointerPosition(cx, cy);
+
+ if (!haveMinCy || cy < minCy) {
+ minCy = cy;
+ haveMinCy = true;
+ }
+ }
+ }
+
+ if (m_pageMode == LinedStaff::LinearMode) {
+ // be careful not to prevent user from scrolling up and down
+ haveMinCy = false;
+ }
+
+ if (scroll) {
+ getCanvasView()->slotScrollHoriz(int(cx));
+ if (haveMinCy) {
+ getCanvasView()->slotScrollVertToTop(minCy);
+ }
+ }
+
+ updateView();
+}
+
+void
+NotationView::slotUpdateRecordingSegment(Segment *segment,
+ timeT updateFrom)
+{
+ NOTATION_DEBUG << "NotationView::slotUpdateRecordingSegment: segment " << segment << ", updateFrom " << updateFrom << ", end time " << segment->getEndMarkerTime() << endl;
+ if (updateFrom >= segment->getEndMarkerTime())
+ return ;
+ for (unsigned int i = 0; i < m_staffs.size(); ++i) {
+ if (&m_staffs[i]->getSegment() == segment) {
+ refreshSegment(segment, 0, 0);
+ }
+ }
+ NOTATION_DEBUG << "NotationView::slotUpdateRecordingSegment: don't have segment " << segment << endl;
+}
+
+void
+NotationView::slotSetCurrentStaff(double x, int y)
+{
+ unsigned int staffNo;
+ for (staffNo = 0; staffNo < m_staffs.size(); ++staffNo) {
+ if (m_staffs[staffNo]->containsCanvasCoords(x, y))
+ break;
+ }
+
+ if (staffNo < m_staffs.size()) {
+ slotSetCurrentStaff(staffNo);
+ }
+}
+
+void
+NotationView::slotSetCurrentStaff(int staffNo)
+{
+ NOTATION_DEBUG << "NotationView::slotSetCurrentStaff(" << staffNo << ")" << endl;
+
+ if (m_currentStaff != staffNo) {
+
+ m_staffs[m_currentStaff]->setCurrent(false);
+
+ m_currentStaff = staffNo;
+
+ m_staffs[m_currentStaff]->setCurrent(true);
+
+ Segment *segment = &m_staffs[m_currentStaff]->getSegment();
+
+ m_chordNameRuler->setCurrentSegment(segment);
+ m_rawNoteRuler->setCurrentSegment(segment);
+ m_rawNoteRuler->repaint();
+ setControlRulersCurrentSegment();
+
+ updateView();
+
+ slotSetInsertCursorPosition(getInsertionTime(), false, false);
+
+ m_headersGroup->setCurrent(
+ m_staffs[staffNo]->getSegment().getTrack());
+ }
+}
+
+void
+NotationView::slotCurrentStaffUp()
+{
+ LinedStaff *staff = getStaffAbove();
+ if (!staff) return;
+ slotSetCurrentStaff(staff->getId());
+}
+
+void
+NotationView::slotCurrentStaffDown()
+{
+ LinedStaff *staff = getStaffBelow();
+ if (!staff) return;
+ slotSetCurrentStaff(staff->getId());
+}
+
+void
+NotationView::slotCurrentSegmentPrior()
+{
+ if (m_staffs.size() < 2)
+ return ;
+
+ Composition *composition =
+ m_staffs[m_currentStaff]->getSegment().getComposition();
+
+ Track *track = composition->
+ getTrackById(m_staffs[m_currentStaff]->getSegment().getTrack());
+ if (!track)
+ return ;
+
+ int lastStaffOnTrack = -1;
+
+ //
+ // TODO: Cycle segments through rather in time order?
+ // Cycle only segments in the field of view?
+ //
+ for (int i = m_staffs.size()-1; i >= 0; --i) {
+ if (m_staffs[i]->getSegment().getTrack() == track->getId()) {
+ if (lastStaffOnTrack < 0) {
+ lastStaffOnTrack = i;
+ }
+ if (i < m_currentStaff) {
+ slotSetCurrentStaff(i);
+ slotEditSelectWholeStaff();
+ return ;
+ }
+ }
+ }
+ if (lastStaffOnTrack >= 0) {
+ slotSetCurrentStaff(lastStaffOnTrack);
+ slotEditSelectWholeStaff();
+ return ;
+ }
+}
+
+void
+NotationView::slotCurrentSegmentNext()
+{
+ if (m_staffs.size() < 2)
+ return ;
+
+ Composition *composition =
+ m_staffs[m_currentStaff]->getSegment().getComposition();
+
+ Track *track = composition->
+ getTrackById(m_staffs[m_currentStaff]->getSegment().getTrack());
+ if (!track)
+ return ;
+
+ int firstStaffOnTrack = -1;
+
+ //
+ // TODO: Cycle segments through rather in time order?
+ // Cycle only segments in the field of view?
+ //
+ for (unsigned int i = 0; i < m_staffs.size(); ++i) {
+ if (m_staffs[i]->getSegment().getTrack() == track->getId()) {
+ if (firstStaffOnTrack < 0) {
+ firstStaffOnTrack = i;
+ }
+ if (i > m_currentStaff) {
+ slotSetCurrentStaff(i);
+ slotEditSelectWholeStaff();
+ return ;
+ }
+ }
+ }
+ if (firstStaffOnTrack >= 0) {
+ slotSetCurrentStaff(firstStaffOnTrack);
+ slotEditSelectWholeStaff();
+ return ;
+ }
+}
+
+void
+NotationView::slotSetInsertCursorPosition(double x, int y, bool scroll,
+ bool updateNow)
+{
+ NOTATION_DEBUG << "NotationView::slotSetInsertCursorPosition: x " << x << ", y " << y << ", scroll " << scroll << ", now " << updateNow << endl;
+
+ slotSetCurrentStaff(x, y);
+
+ LinedStaff *staff = getLinedStaff(m_currentStaff);
+ Event *clefEvt, *keyEvt;
+ NotationElementList::iterator i =
+ staff->getElementUnderCanvasCoords(x, y, clefEvt, keyEvt);
+
+ if (i == staff->getViewElementList()->end()) {
+ slotSetInsertCursorPosition(staff->getSegment().getEndTime(), scroll,
+ updateNow);
+ } else {
+ slotSetInsertCursorPosition((*i)->getViewAbsoluteTime(), scroll,
+ updateNow);
+ }
+}
+
+void
+NotationView::slotSetInsertCursorPosition(timeT t, bool scroll, bool updateNow)
+{
+ NOTATION_DEBUG << "NotationView::slotSetInsertCursorPosition: time " << t << ", scroll " << scroll << ", now " << updateNow << endl;
+
+ m_insertionTime = t;
+ if (scroll) {
+ m_deferredCursorMove = CursorMoveAndMakeVisible;
+ } else {
+ m_deferredCursorMove = CursorMoveOnly;
+ }
+ if (updateNow)
+ doDeferredCursorMove();
+}
+
+void
+NotationView::slotSetInsertCursorAndRecentre(timeT t, double cx, int,
+ bool updateNow)
+{
+ NOTATION_DEBUG << "NotationView::slotSetInsertCursorAndRecentre: time " << t << ", cx " << cx << ", now " << updateNow << ", contentsx" << getCanvasView()->contentsX() << ", w " << getCanvasView()->visibleWidth() << endl;
+
+ m_insertionTime = t;
+
+ // We only do the scroll bit if cx is in the right two-thirds of
+ // the window
+
+ if (cx < (getCanvasView()->contentsX() +
+ getCanvasView()->visibleWidth() / 3)) {
+
+ m_deferredCursorMove = CursorMoveOnly;
+ } else {
+ m_deferredCursorMove = CursorMoveAndScrollToPosition;
+ m_deferredCursorScrollToX = cx;
+ }
+
+ if (updateNow)
+ doDeferredCursorMove();
+}
+
+void
+NotationView::doDeferredCursorMove()
+{
+ NOTATION_DEBUG << "NotationView::doDeferredCursorMove: m_deferredCursorMove == " << m_deferredCursorMove << endl;
+
+ if (m_deferredCursorMove == NoCursorMoveNeeded) {
+ return ;
+ }
+
+ DeferredCursorMoveType type = m_deferredCursorMove;
+ m_deferredCursorMove = NoCursorMoveNeeded;
+
+ timeT t = m_insertionTime;
+
+ if (m_staffs.size() == 0)
+ return ;
+ LinedStaff *staff = getCurrentLinedStaff();
+ Segment &segment = staff->getSegment();
+
+ if (t < segment.getStartTime()) {
+ t = segment.getStartTime();
+ }
+ if (t > segment.getEndTime()) {
+ t = segment.getEndTime();
+ }
+
+ NotationElementList::iterator i =
+ staff->getViewElementList()->findNearestTime(t);
+
+ while (i != staff->getViewElementList()->end() &&
+ !static_cast<NotationElement*>(*i)->getCanvasItem())
+ ++i;
+
+ if (i == staff->getViewElementList()->end()) {
+ //!!! ???
+ if (m_insertionTime >= staff->getSegment().getStartTime()) {
+ i = staff->getViewElementList()->begin();
+ }
+ m_insertionTime = staff->getSegment().getStartTime();
+ } else {
+ m_insertionTime = static_cast<NotationElement*>(*i)->getViewAbsoluteTime();
+ }
+
+ if (i == staff->getViewElementList()->end() ||
+ t == segment.getEndTime() ||
+ t == segment.getBarStartForTime(t)) {
+
+ staff->setInsertCursorPosition(*m_hlayout, t);
+
+ if (type == CursorMoveAndMakeVisible) {
+ double cx;
+ int cy;
+ staff->getInsertCursorPosition(cx, cy);
+ getCanvasView()->slotScrollHoriz(int(cx));
+ getCanvasView()->slotScrollVertSmallSteps(cy);
+ }
+
+ } else {
+
+ // prefer a note or rest, if there is one, to a non-spacing event
+ if (!static_cast<NotationElement*>(*i)->isNote() &&
+ !static_cast<NotationElement*>(*i)->isRest()) {
+ NotationElementList::iterator j = i;
+ while (j != staff->getViewElementList()->end()) {
+ if (static_cast<NotationElement*>(*j)->getViewAbsoluteTime() !=
+ static_cast<NotationElement*>(*i)->getViewAbsoluteTime())
+ break;
+ if (static_cast<NotationElement*>(*j)->getCanvasItem()) {
+ if (static_cast<NotationElement*>(*j)->isNote() ||
+ static_cast<NotationElement*>(*j)->isRest()) {
+ i = j;
+ break;
+ }
+ }
+ ++j;
+ }
+ }
+
+ if (static_cast<NotationElement*>(*i)->getCanvasItem()) {
+
+ staff->setInsertCursorPosition
+ (static_cast<NotationElement*>(*i)->getCanvasX() - 2,
+ int(static_cast<NotationElement*>(*i)->getCanvasY()));
+
+ if (type == CursorMoveAndMakeVisible) {
+ getCanvasView()->slotScrollHoriz
+ (int(static_cast<NotationElement*>(*i)->getCanvasX()) - 4);
+ }
+ } else {
+ std::cerr << "WARNING: No canvas item for this notation element:";
+ (*i)->event()->dump(std::cerr);
+ }
+ }
+
+ if (type == CursorMoveAndScrollToPosition) {
+
+ // get current canvas x of insert cursor, which might not be
+ // what we just set
+
+ double ccx = 0.0;
+
+ NotationElementList::iterator i =
+ staff->getViewElementList()->findTime(t);
+
+ if (i == staff->getViewElementList()->end()) {
+ if (i == staff->getViewElementList()->begin())
+ return ;
+ double lx, lwidth;
+ --i;
+ if (static_cast<NotationElement*>(*i)->getCanvasItem()) {
+ ccx = static_cast<NotationElement*>(*i)->getCanvasX();
+ static_cast<NotationElement*>(*i)->getLayoutAirspace(lx, lwidth);
+ } else {
+ std::cerr << "WARNING: No canvas item for this notation element*:";
+ (*i)->event()->dump(std::cerr);
+ }
+ ccx += lwidth;
+ } else {
+ if (static_cast<NotationElement*>(*i)->getCanvasItem()) {
+ ccx = static_cast<NotationElement*>(*i)->getCanvasX();
+ } else {
+ std::cerr << "WARNING: No canvas item for this notation element*:";
+ (*i)->event()->dump(std::cerr);
+ }
+ }
+
+ QScrollBar* hbar = getCanvasView()->horizontalScrollBar();
+ hbar->setValue(int(hbar->value() - (m_deferredCursorScrollToX - ccx)));
+ }
+
+ updateView();
+}
+
+void
+NotationView::slotJumpCursorToPlayback()
+{
+ slotSetInsertCursorPosition(getDocument()->getComposition().getPosition());
+}
+
+void
+NotationView::slotJumpPlaybackToCursor()
+{
+ emit jumpPlaybackTo(getInsertionTime());
+}
+
+void
+NotationView::slotToggleTracking()
+{
+ m_playTracking = !m_playTracking;
+}
+
+void NotationView::slotNoAccidental()
+{
+ emit changeAccidental(Accidentals::NoAccidental, false);
+}
+
+void NotationView::slotFollowAccidental()
+{
+ emit changeAccidental(Accidentals::NoAccidental, true);
+}
+
+void NotationView::slotSharp()
+{
+ emit changeAccidental(Accidentals::Sharp, false);
+}
+
+void NotationView::slotFlat()
+{
+ emit changeAccidental(Accidentals::Flat, false);
+}
+
+void NotationView::slotNatural()
+{
+ emit changeAccidental(Accidentals::Natural, false);
+}
+
+void NotationView::slotDoubleSharp()
+{
+ emit changeAccidental(Accidentals::DoubleSharp, false);
+}
+
+void NotationView::slotDoubleFlat()
+{
+ emit changeAccidental(Accidentals::DoubleFlat, false);
+}
+
+void NotationView::slotTrebleClef()
+{
+ m_currentNotePixmap->setPixmap
+ (NotePixmapFactory::toQPixmap(NotePixmapFactory::makeToolbarPixmap("clef-treble")));
+ setTool(m_toolBox->getTool(ClefInserter::ToolName));
+
+ dynamic_cast<ClefInserter*>(m_tool)->setClef(Clef::Treble);
+ setMenuStates();
+}
+
+void NotationView::slotAltoClef()
+{
+ m_currentNotePixmap->setPixmap
+ (NotePixmapFactory::toQPixmap(NotePixmapFactory::makeToolbarPixmap("clef-alto")));
+ setTool(m_toolBox->getTool(ClefInserter::ToolName));
+
+ dynamic_cast<ClefInserter*>(m_tool)->setClef(Clef::Alto);
+ setMenuStates();
+}
+
+void NotationView::slotTenorClef()
+{
+ m_currentNotePixmap->setPixmap
+ (NotePixmapFactory::toQPixmap(NotePixmapFactory::makeToolbarPixmap("clef-tenor")));
+ setTool(m_toolBox->getTool(ClefInserter::ToolName));
+
+ dynamic_cast<ClefInserter*>(m_tool)->setClef(Clef::Tenor);
+ setMenuStates();
+}
+
+void NotationView::slotBassClef()
+{
+ m_currentNotePixmap->setPixmap
+ (NotePixmapFactory::toQPixmap(NotePixmapFactory::makeToolbarPixmap("clef-bass")));
+ setTool(m_toolBox->getTool(ClefInserter::ToolName));
+
+ dynamic_cast<ClefInserter*>(m_tool)->setClef(Clef::Bass);
+ setMenuStates();
+}
+
+void NotationView::slotText()
+{
+ m_currentNotePixmap->setPixmap
+ (NotePixmapFactory::toQPixmap(NotePixmapFactory::makeToolbarPixmap("text")));
+ setTool(m_toolBox->getTool(TextInserter::ToolName));
+ setMenuStates();
+}
+
+void NotationView::slotGuitarChord()
+{
+ m_currentNotePixmap->setPixmap
+ (NotePixmapFactory::toQPixmap(NotePixmapFactory::makeToolbarPixmap("guitarchord")));
+ setTool(m_toolBox->getTool(GuitarChordInserter::ToolName));
+ setMenuStates();
+}
+
+void NotationView::slotEraseSelected()
+{
+ NOTATION_DEBUG << "NotationView::slotEraseSelected()" << endl;
+ setTool(m_toolBox->getTool(NotationEraser::ToolName));
+ setMenuStates();
+}
+
+void NotationView::slotSelectSelected()
+{
+ NOTATION_DEBUG << "NotationView::slotSelectSelected()" << endl;
+ setTool(m_toolBox->getTool(NotationSelector::ToolName));
+ setMenuStates();
+}
+
+void NotationView::slotLinearMode()
+{
+ setPageMode(LinedStaff::LinearMode);
+}
+
+void NotationView::slotContinuousPageMode()
+{
+ setPageMode(LinedStaff::ContinuousPageMode);
+}
+
+void NotationView::slotMultiPageMode()
+{
+ setPageMode(LinedStaff::MultiPageMode);
+}
+
+void NotationView::slotToggleChordsRuler()
+{
+ if (m_hlayout->isPageMode())
+ return ;
+ toggleWidget(m_chordNameRuler, "show_chords_ruler");
+}
+
+void NotationView::slotToggleRawNoteRuler()
+{
+ if (m_hlayout->isPageMode())
+ return ;
+ toggleWidget(m_rawNoteRuler, "show_raw_note_ruler");
+}
+
+void NotationView::slotToggleTempoRuler()
+{
+ if (m_hlayout->isPageMode())
+ return ;
+ toggleWidget(m_tempoRuler, "show_tempo_ruler");
+}
+
+void NotationView::slotToggleAnnotations()
+{
+ m_annotationsVisible = !m_annotationsVisible;
+ slotUpdateAnnotationsStatus();
+ //!!! use refresh mechanism
+ refreshSegment(0, 0, 0);
+}
+
+void NotationView::slotToggleLilyPondDirectives()
+{
+ m_lilyPondDirectivesVisible = !m_lilyPondDirectivesVisible;
+ slotUpdateLilyPondDirectivesStatus();
+ //!!! use refresh mechanism
+ refreshSegment(0, 0, 0);
+}
+
+void NotationView::slotEditLyrics()
+{
+ Staff *staff = getCurrentStaff();
+ Segment &segment = staff->getSegment();
+
+ LyricEditDialog dialog(this, &segment);
+
+ if (dialog.exec() == QDialog::Accepted) {
+
+ KMacroCommand *macro = new KMacroCommand
+ (SetLyricsCommand::getGlobalName());
+
+ for (int i = 0; i < dialog.getVerseCount(); ++i) {
+ SetLyricsCommand *command = new SetLyricsCommand
+ (&segment, i, dialog.getLyricData(i));
+ macro->addCommand(command);
+ }
+
+ addCommandToHistory(macro);
+ }
+}
+
+void NotationView::slotItemPressed(int height, int staffNo,
+ QMouseEvent* e,
+ NotationElement* el)
+{
+ NOTATION_DEBUG << "NotationView::slotItemPressed(height = "
+ << height << ", staffNo = " << staffNo
+ << ")" << endl;
+
+ if (staffNo < 0 && el != 0) {
+ // We have an element but no staff -- that's because the
+ // element extended outside the staff region. But we need
+ // to handle it properly, so we rather laboriously need to
+ // find out which staff it was.
+ for (unsigned int i = 0; i < m_staffs.size(); ++i) {
+ if (m_staffs[i]->getViewElementList()->findSingle(el) !=
+ m_staffs[i]->getViewElementList()->end()) {
+ staffNo = m_staffs[i]->getId();
+ break;
+ }
+ }
+ }
+
+ ButtonState btnState = e->state();
+
+ if (btnState & ControlButton) { // on ctrl-click, set cursor position
+
+ slotSetInsertCursorPosition(e->x(), (int)e->y());
+
+ } else {
+
+ setActiveItem(0);
+
+ timeT unknownTime = 0;
+
+ if (e->type() == QEvent::MouseButtonDblClick) {
+ m_tool->handleMouseDoubleClick(unknownTime, height,
+ staffNo, e, el);
+ } else {
+ m_tool->handleMousePress(unknownTime, height,
+ staffNo, e, el);
+ }
+ }
+}
+
+void NotationView::slotNonNotationItemPressed(QMouseEvent *e, QCanvasItem *it)
+{
+ if (e->type() != QEvent::MouseButtonDblClick)
+ return ;
+
+ Staff *staff = getStaffForCanvasCoords(e->x(), e->y());
+ if (!staff)
+ return ;
+
+ NOTATION_DEBUG << "NotationView::slotNonNotationItemPressed(doubly)" << endl;
+
+ if (dynamic_cast<QCanvasStaffNameSprite *>(it)) {
+
+ std::string name =
+ staff->getSegment().getComposition()->
+ getTrackById(staff->getSegment().getTrack())->getLabel();
+
+ bool ok = false;
+ QRegExpValidator validator(QRegExp(".*"), this); // empty is OK
+
+ QString newText = KLineEditDlg::getText(QString("Change staff name"),
+ QString("Enter new staff name"),
+ strtoqstr(name),
+ &ok,
+ this,
+ &validator);
+
+ if (ok) {
+ addCommandToHistory(new RenameTrackCommand
+ (staff->getSegment().getComposition(),
+ staff->getSegment().getTrack(),
+ qstrtostr(newText)));
+
+ emit staffLabelChanged(staff->getSegment().getTrack(), newText);
+ }
+
+ } else if (dynamic_cast<QCanvasTimeSigSprite *>(it)) {
+
+ double layoutX = (dynamic_cast<QCanvasTimeSigSprite *>(it))->getLayoutX();
+ emit editTimeSignature(m_hlayout->getTimeForX(layoutX));
+ }
+}
+
+void NotationView::slotTextItemPressed(QMouseEvent *e, QCanvasItem *it)
+{
+ if (e->type() != QEvent::MouseButtonDblClick)
+ return ;
+
+ if (it == m_title) {
+ emit editMetadata(strtoqstr(CompositionMetadataKeys::Title.getName()));
+ } else if (it == m_subtitle) {
+ emit editMetadata(strtoqstr(CompositionMetadataKeys::Subtitle.getName()));
+ } else if (it == m_composer) {
+ emit editMetadata(strtoqstr(CompositionMetadataKeys::Composer.getName()));
+ } else if (it == m_copyright) {
+ emit editMetadata(strtoqstr(CompositionMetadataKeys::Copyright.getName()));
+ } else {
+ return ;
+ }
+
+ positionStaffs();
+}
+
+void NotationView::slotMouseMoved(QMouseEvent *e)
+{
+ if (activeItem()) {
+ activeItem()->handleMouseMove(e);
+ updateView();
+ } else {
+ int follow = m_tool->handleMouseMove(0, 0, // unknown time and height
+ e);
+
+ if (getCanvasView()->isTimeForSmoothScroll()) {
+
+ if (follow & RosegardenCanvasView::FollowHorizontal) {
+ getCanvasView()->slotScrollHorizSmallSteps(e->x());
+ }
+
+ if (follow & RosegardenCanvasView::FollowVertical) {
+ getCanvasView()->slotScrollVertSmallSteps(e->y());
+ }
+
+ }
+ }
+}
+
+void NotationView::slotMouseReleased(QMouseEvent *e)
+{
+ if (activeItem()) {
+ activeItem()->handleMouseRelease(e);
+ setActiveItem(0);
+ updateView();
+ } else
+ m_tool->handleMouseRelease(0, 0, // unknown time and height
+ e);
+}
+
+void
+NotationView::slotHoveredOverNoteChanged(const QString &noteName)
+{
+ m_hoveredOverNoteName->setText(QString(" ") + noteName);
+}
+
+void
+NotationView::slotHoveredOverAbsoluteTimeChanged(unsigned int time)
+{
+ timeT t = time;
+ RealTime rt =
+ getDocument()->getComposition().getElapsedRealTime(t);
+ long ms = rt.msec();
+
+ int bar, beat, fraction, remainder;
+ getDocument()->getComposition().getMusicalTimeForAbsoluteTime
+ (t, bar, beat, fraction, remainder);
+
+ // QString message;
+ // QString format("%ld (%ld.%03lds)");
+ // format = i18n("Time: %1").arg(format);
+ // message.sprintf(format, t, rt.sec, ms);
+
+ QString message = i18n("Time: %1 (%2.%3s)")
+ .arg(QString("%1-%2-%3-%4")
+ .arg(QString("%1").arg(bar + 1).rightJustify(3, '0'))
+ .arg(QString("%1").arg(beat).rightJustify(2, '0'))
+ .arg(QString("%1").arg(fraction).rightJustify(2, '0'))
+ .arg(QString("%1").arg(remainder).rightJustify(2, '0')))
+ .arg(rt.sec)
+ .arg(QString("%1").arg(ms).rightJustify(3, '0'));
+
+ m_hoveredOverAbsoluteTime->setText(message);
+}
+
+void
+NotationView::slotInsertableNoteEventReceived(int pitch, int velocity, bool noteOn)
+{
+ //!!! Problematic. Ideally we wouldn't insert events into windows
+ //that weren't actually visible, otherwise all hell could break
+ //loose (metaphorically speaking, I should probably add). I did
+ //think of checking isActiveWindow() and returning if the current
+ //window wasn't active, but that will prevent anyone from
+ //step-recording from e.g. vkeybd, which cannot be used without
+ //losing focus (and thus active-ness) from the Rosegarden window.
+
+ //!!! I know -- we'll keep track of which edit view (or main view,
+ //or mixer, etc) is active, and we'll only allow insertion into
+ //the most recently activated. How about that?
+
+ KToggleAction *action = dynamic_cast<KToggleAction *>
+ (actionCollection()->action("toggle_step_by_step"));
+ if (!action) {
+ NOTATION_DEBUG << "WARNING: No toggle_step_by_step action" << endl;
+ return ;
+ }
+ if (!action->isChecked())
+ return ;
+
+ Segment &segment = m_staffs[m_currentStaff]->getSegment();
+
+ NoteInserter *noteInserter = dynamic_cast<NoteInserter *>(m_tool);
+ if (!noteInserter) {
+ static bool showingError = false;
+ if (showingError)
+ return ;
+ showingError = true;
+ KMessageBox::sorry(this, i18n("Can't insert note: No note duration selected"));
+ showingError = false;
+ return ;
+ }
+
+ if (m_inPaintEvent) {
+ NOTATION_DEBUG << "NotationView::slotInsertableNoteEventReceived: in paint event already" << endl;
+ if (noteOn) {
+ m_pendingInsertableNotes.push_back(std::pair<int, int>(pitch, velocity));
+ }
+ return ;
+ }
+
+ // If the segment is transposed, we want to take that into
+ // account. But the note has already been played back to the user
+ // at its untransposed pitch, because that's done by the MIDI THRU
+ // code in the sequencer which has no way to know whether a note
+ // was intended for step recording. So rather than adjust the
+ // pitch for playback according to the transpose setting, we have
+ // to adjust the stored pitch in the opposite direction.
+
+ pitch -= segment.getTranspose();
+
+ // KTmpStatusMsg msg(i18n("Inserting note"), this);
+
+ // We need to ensure that multiple notes hit at once come out as
+ // chords, without imposing the interpretation that overlapping
+ // notes are always chords and without getting too involved with
+ // the actual absolute times of the notes (this is still step
+ // editing, not proper recording).
+
+ // First, if we're in chord mode, there's no problem.
+
+ static int numberOfNotesOn = 0;
+ static timeT insertionTime = getInsertionTime();
+ static time_t lastInsertionTime = 0;
+
+ if (isInChordMode()) {
+ if (!noteOn)
+ return ;
+ NOTATION_DEBUG << "Inserting note in chord at pitch " << pitch << endl;
+ noteInserter->insertNote(segment, getInsertionTime(), pitch,
+ Accidentals::NoAccidental,
+ true);
+
+ } else {
+
+ if (!noteOn) {
+ numberOfNotesOn--;
+ } else if (noteOn) {
+ // Rules:
+ //
+ // * If no other note event has turned up within half a
+ // second, insert this note and advance.
+ //
+ // * Relatedly, if this note is within half a second of
+ // the previous one, they're chords. Insert the previous
+ // one, don't advance, and use the same rules for this.
+ //
+ // * If a note event turns up before that time has elapsed,
+ // we need to wait for the note-off events: if the second
+ // note happened less than half way through the first,
+ // it's a chord.
+ //
+ // We haven't implemented these yet... For now:
+ //
+ // Rules (hjj):
+ //
+ // * The overlapping notes are always included in to a chord.
+ // This is the most convenient for step inserting of chords.
+ //
+ // * The timer resets the numberOfNotesOn, if noteOff signals were
+ // drop out for some reason (which has not been encountered yet).
+
+ time_t now;
+ time (&now);
+ double elapsed = difftime(now, lastInsertionTime);
+ time (&lastInsertionTime);
+
+ if (numberOfNotesOn <= 0 || elapsed > 10.0 ) {
+ numberOfNotesOn = 0;
+ insertionTime = getInsertionTime();
+ }
+ numberOfNotesOn++;
+
+ noteInserter->insertNote(segment, insertionTime, pitch,
+ Accidentals::NoAccidental,
+ true);
+ }
+ }
+}
+
+void
+NotationView::slotInsertableNoteOnReceived(int pitch, int velocity)
+{
+ NOTATION_DEBUG << "NotationView::slotInsertableNoteOnReceived: " << pitch << endl;
+ slotInsertableNoteEventReceived(pitch, velocity, true);
+}
+
+void
+NotationView::slotInsertableNoteOffReceived(int pitch, int velocity)
+{
+ NOTATION_DEBUG << "NotationView::slotInsertableNoteOffReceived: " << pitch << endl;
+ slotInsertableNoteEventReceived(pitch, velocity, false);
+}
+
+void
+NotationView::slotInsertableTimerElapsed()
+{}
+
+void
+NotationView::slotToggleStepByStep()
+{
+ KToggleAction *action = dynamic_cast<KToggleAction *>
+ (actionCollection()->action("toggle_step_by_step"));
+ if (!action) {
+ NOTATION_DEBUG << "WARNING: No toggle_step_by_step action" << endl;
+ return ;
+ }
+ if (action->isChecked()) { // after toggling, that is
+ emit stepByStepTargetRequested(this);
+ } else {
+ emit stepByStepTargetRequested(0);
+ }
+}
+
+void
+NotationView::slotStepByStepTargetRequested(QObject *obj)
+{
+ KToggleAction *action = dynamic_cast<KToggleAction *>
+ (actionCollection()->action("toggle_step_by_step"));
+ if (!action) {
+ NOTATION_DEBUG << "WARNING: No toggle_step_by_step action" << endl;
+ return ;
+ }
+ action->setChecked(obj == this);
+}
+
+void
+NotationView::slotCheckRendered(double cx0, double cx1)
+{
+ // NOTATION_DEBUG << "slotCheckRendered(" << cx0 << "," << cx1 << ")" << endl;
+
+ bool something = false;
+
+ for (size_t i = 0; i < m_staffs.size(); ++i) {
+
+ LinedStaff *staff = m_staffs[i];
+
+ LinedStaff::LinedStaffCoords cc0 = staff->getLayoutCoordsForCanvasCoords
+ (cx0, 0);
+
+ LinedStaff::LinedStaffCoords cc1 = staff->getLayoutCoordsForCanvasCoords
+ (cx1, staff->getTotalHeight() + staff->getY());
+
+ timeT t0 = m_hlayout->getTimeForX(cc0.first);
+ timeT t1 = m_hlayout->getTimeForX(cc1.first);
+
+ if (dynamic_cast<NotationStaff *>(staff)->checkRendered(t0, t1)) {
+ something = true; //!!!
+ }
+ }
+
+ if (something) {
+ emit renderComplete();
+ if (m_renderTimer)
+ delete m_renderTimer;
+ m_renderTimer = new QTimer(this);
+ connect(m_renderTimer, SIGNAL(timeout()), SLOT(slotRenderSomething()));
+ m_renderTimer->start(0, true);
+ }
+
+ if (m_deferredCursorMove != NoCursorMoveNeeded)
+ doDeferredCursorMove();
+}
+
+void
+NotationView::slotRenderSomething()
+{
+ delete m_renderTimer;
+ m_renderTimer = 0;
+ static clock_t lastWork = 0;
+
+ clock_t now = clock();
+ long elapsed = ((now - lastWork) * 1000 / CLOCKS_PER_SEC);
+ if (elapsed < 70) {
+ m_renderTimer = new QTimer(this);
+ connect(m_renderTimer, SIGNAL(timeout()), SLOT(slotRenderSomething()));
+ m_renderTimer->start(0, true);
+ return ;
+ }
+ lastWork = now;
+
+ for (size_t i = 0; i < m_staffs.size(); ++i) {
+
+ if (m_staffs[i]->doRenderWork(m_staffs[i]->getSegment().getStartTime(),
+ m_staffs[i]->getSegment().getEndTime())) {
+ m_renderTimer = new QTimer(this);
+ connect(m_renderTimer, SIGNAL(timeout()), SLOT(slotRenderSomething()));
+ m_renderTimer->start(0, true);
+ return ;
+ }
+ }
+
+ PixmapArrayGC::deleteAll();
+ NOTATION_DEBUG << "NotationView::slotRenderSomething: updating thumbnails" << endl;
+ updateThumbnails(true);
+
+ // Update track headers when rendering is done
+ // (better late than never)
+ m_headersGroup->slotUpdateAllHeaders(getCanvasLeftX(), 0, true);
+ m_headersGroupView->setContentsPos(getCanvasView()->contentsX(),
+ getCanvasView()->contentsY());
+}
+
+NotationCanvasView* NotationView::getCanvasView()
+{
+ return dynamic_cast<NotationCanvasView *>(m_canvasView);
+}
+
+void
+NotationView::slotVerticalScrollHeadersGroup(int y)
+{
+ m_headersGroupView->setContentsPos(0, y);
+}
+
+void
+NotationView::slotShowHeadersGroup()
+{
+ m_showHeadersGroup = HeadersGroup::ShowAlways;
+ showHeadersGroup();
+
+ // Disable menu entry when headers are shown
+ m_showHeadersMenuEntry->setEnabled(false);
+}
+
+void
+NotationView::slotHideHeadersGroup()
+{
+ m_showHeadersGroup = HeadersGroup::ShowNever;
+ hideHeadersGroup();
+
+ // Enable menu entry when headers are hidden
+ m_showHeadersMenuEntry->setEnabled(true);
+}
+
+void
+NotationView::showHeadersGroup()
+{
+ if (m_headersGroupView && (m_pageMode == LinedStaff::LinearMode)) {
+ m_headersGroupView->show();
+ m_headersTopFrame->show();
+ m_rulerBoxFiller->show();
+ }
+}
+
+void
+NotationView::hideHeadersGroup()
+{
+ if (m_headersGroupView) {
+ m_headersGroupView->hide();
+ m_headersTopFrame->hide();
+ m_rulerBoxFiller->hide();
+ }
+}
+
+void
+NotationView::slotUpdateHeaders(int x, int y)
+{
+ m_headersGroup->slotUpdateAllHeaders(x, y);
+ m_headersGroupView->setContentsPos(x, y);
+}
+
+void
+NotationView::slotHeadersWidthChanged(int w)
+{
+ m_headersTopFrame->setFixedWidth(w);
+ m_rulerBoxFiller->setFixedWidth(w);
+ m_canvasView->updateLeftWidgetGeometry();
+}
+
+
+int
+NotationView::getCanvasVisibleWidth()
+{
+ if (getCanvasView()) {
+ return getCanvasView()->visibleWidth();
+ } else {
+ return -1;
+ }
+}
+
+int
+NotationView::getHeadersTopFrameMinWidth()
+{
+ /// TODO : use a real button width got from a real button
+
+ // 2 buttons (2 x 24) + 2 margins (2 x 4) + buttons spacing (4)
+ return 4 + 24 + 4 + 24 + 4;
+}
+
+}
+#include "NotationView.moc"
diff --git a/src/gui/editors/notation/NotationView.h b/src/gui/editors/notation/NotationView.h
new file mode 100644
index 0000000..7678f8a
--- /dev/null
+++ b/src/gui/editors/notation/NotationView.h
@@ -0,0 +1,1131 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_NOTATIONVIEW_H_
+#define _RG_NOTATIONVIEW_H_
+
+#include "base/NotationTypes.h"
+#include "base/Track.h"
+#include "gui/general/EditView.h"
+#include "gui/general/LinedStaff.h"
+#include "gui/general/LinedStaffManager.h"
+#include "NotationProperties.h"
+#include "NotationCanvasView.h"
+#include <string>
+#include <kprocess.h>
+#include <ktempfile.h>
+#include <qmap.h>
+#include <qsize.h>
+#include <qstring.h>
+#include <vector>
+#include "base/Event.h"
+#include "gui/general/ClefIndex.h"
+
+
+class QWidget;
+class QTimer;
+class QPaintEvent;
+class QObject;
+class QMouseEvent;
+class QLabel;
+class QCursor;
+class QCanvasItem;
+class QCanvas;
+class KProgress;
+class KComboBox;
+class KActionMenu;
+class KAction;
+
+
+namespace Rosegarden
+{
+
+class Staff;
+class Segment;
+class ScrollBoxDialog;
+class RulerScale;
+class RosegardenGUIDoc;
+class RawNoteRuler;
+class ProgressDialog;
+class ProgressBar;
+class NotePixmapFactory;
+class NotationVLayout;
+class NotationStaff;
+class NotationHLayout;
+class NotationElement;
+class NoteActionData;
+class NoteActionDataMap;
+class MarkActionData;
+class MarkActionDataMap;
+class NoteChangeActionData;
+class NoteChangeActionDataMap;
+class Key;
+class EventSelection;
+class Event;
+class Clef;
+class ChordNameRuler;
+class QDeferScrollView;
+class HeadersGroup;
+
+
+/**
+ * NotationView is a view for one or more Staff objects, each of
+ * which contains the notation data associated with a Segment.
+ * NotationView owns the Staff objects it displays.
+ *
+ * This class manages the relationship between NotationHLayout/
+ * NotationVLayout and Staff data, as well as using rendering the
+ * actual notes (using NotePixmapFactory to generate the pixmaps).
+ */
+
+class NotationView : public EditView,
+ public LinedStaffManager
+{
+ friend class NoteInserter;
+ friend class ClefInserter;
+ friend class NotationEraser;
+ friend class NotationSelectionPaster;
+ friend class LilyPondExporter;
+
+ Q_OBJECT
+
+public:
+ explicit NotationView(RosegardenGUIDoc *doc,
+ std::vector<Segment *> segments,
+ QWidget *parent,
+ bool showProgressive); // update during initial render?
+
+ /**
+ * Constructor for printing only. If parent is provided, a
+ * progress dialog will be shown -- otherwise not. If another
+ * NotationView is provided, the fonts and other settings used
+ * for printing will be taken from that view.
+ */
+ explicit NotationView(RosegardenGUIDoc *doc,
+ std::vector<Segment *> segments,
+ QWidget *parent,
+ NotationView *referenceView);
+
+ ~NotationView();
+
+// void initialLayout();
+
+ /// constructed successfully? (main reason it might not is user hit Cancel)
+ bool isOK() const { return m_ok; }
+
+ /**
+ * Return the view-local PropertyName definitions for this view
+ */
+ const NotationProperties &getProperties() const;
+
+ /// Return the number of staffs
+ int getStaffCount() { return m_staffs.size(); }
+
+ /// Return a pointer to the staff at the specified index
+ Staff *getStaff(int i) {
+ return getLinedStaff(i);
+ }
+
+ /// Return a pointer to the staff corresponding to the given segment
+ Staff *getStaff(const Segment &segment) {
+ return getLinedStaff(segment);
+ }
+
+ /// Return a pointer to the staff at the specified index
+ LinedStaff *getLinedStaff(int i);
+
+ /// Return a pointer to the staff corresponding to the given segment
+ LinedStaff *getLinedStaff(const Segment &segment);
+
+ /// Return a pointer to the staff at the specified index
+ NotationStaff *getNotationStaff(int i) {
+ if (i >= 0 && unsigned(i) < m_staffs.size()) return m_staffs[i];
+ else return 0;
+ }
+
+ /// Return a pointer to the staff corresponding to the given segment
+ NotationStaff *getNotationStaff(const Segment &segment);
+
+ /// Return true if the staff at the specified index is the current one
+ bool isCurrentStaff(int i);
+
+ QCanvas* canvas() { return getCanvasView()->canvas(); }
+
+ void setCanvasCursor(const QCursor &cursor) {
+ getCanvasView()->viewport()->setCursor(cursor);
+ }
+
+ void setHeightTracking(bool t) {
+ getCanvasView()->setHeightTracking(t);
+ }
+
+ /**
+ * Returns true if the view is actually for printing
+ */
+ bool isInPrintMode() { return m_printMode; }
+
+ /**
+ * Set the note or rest selected by the user from the toolbars
+ */
+ void setCurrentSelectedNote(const char *pixmapName,
+ bool isRest, Note::Type,
+ int dots = 0);
+
+ /**
+ * Set the note or rest selected by the user from the toolbars
+ */
+ void setCurrentSelectedNote(const NoteActionData &);
+
+ /**
+ * Discover whether chord-mode insertions are enabled (as opposed
+ * to the default melody-mode)
+ */
+ bool isInChordMode();
+
+ /**
+ * Discover whether triplet-mode insertions are enabled
+ */
+ bool isInTripletMode();
+
+ /**
+ * Discover whether grace-mode insertions are enabled
+ */
+ bool isInGraceMode();
+
+ /**
+ * Discover whether annotations are being displayed or not
+ */
+ bool areAnnotationsVisible() { return m_annotationsVisible; }
+
+ /**
+ * Discover whether LilyPond directives are being displayed or not
+ */
+ bool areLilyPondDirectivesVisible() { return m_lilyPondDirectivesVisible; }
+
+ /**
+ * Set the current event selection.
+ *
+ * If preview is true, sound the selection as well.
+ *
+ * If redrawNow is true, recolour the elements on the canvas;
+ * otherwise just line up a refresh for the next paint event.
+ *
+ * (If the selection has changed as part of a modification to a
+ * segment, redrawNow should be unnecessary and undesirable, as a
+ * paint event will occur in the next event loop following the
+ * command invocation anyway.)
+ */
+ virtual void setCurrentSelection(EventSelection*,
+ bool preview = false,
+ bool redrawNow = false);
+
+ /**
+ * Set the current event selection to a single event
+ */
+ void setSingleSelectedEvent(int staffNo,
+ Event *event,
+ bool preview = false,
+ bool redrawNow = false);
+
+ /**
+ * Set the current event selection to a single event
+ */
+ void setSingleSelectedEvent(Segment &segment,
+ Event *event,
+ bool preview = false,
+ bool redrawNow = false);
+
+ /**
+ * Show and sound the given note. The height is used for display,
+ * the pitch for performance, so the two need not correspond (e.g.
+ * under ottava there may be octave differences).
+ */
+ void showPreviewNote(int staffNo, double layoutX,
+ int pitch, int height,
+ const Note &note,
+ bool grace,
+ int velocity = -1);
+
+ /// Remove any visible preview note
+ void clearPreviewNote();
+
+ /// Sound the given note
+ void playNote(Segment &segment, int pitch, int velocity = -1);
+
+ /// Switches between page- and linear- layout modes
+ void setPageMode(LinedStaff::PageMode mode);
+
+ /// Returns the page width according to the layout mode (page/linear)
+ int getPageWidth();
+
+ /// Returns the page height according to the layout mode (page/linear)
+ int getPageHeight();
+
+ /// Returns the margins within the page (zero if not in MultiPageMode)
+ void getPageMargins(int &left, int &top);
+
+ /// Scrolls the view such that the given time is centered
+ void scrollToTime(timeT t);
+
+ NotePixmapFactory *getNotePixmapFactory() const {
+ return m_notePixmapFactory;
+ }
+
+ virtual void refreshSegment(Segment *segment,
+ timeT startTime = 0,
+ timeT endTime = 0);
+
+ /**
+ * From LinedStaffManager
+ */
+ virtual LinedStaff* getStaffForCanvasCoords(int x, int y) const;
+
+
+ /**
+ * Overridden from EditView
+ */
+ virtual void updateView();
+
+ /**
+ * Render segments on printing painter. This uses the current
+ * font size and layout, rather than the optimal ones for the
+ * printer configuration (notation editing is not quite WYSIWYG,
+ * and we may be in a non-page mode).
+ *
+ * To print optimally use slotFilePrint, which will create
+ * another NotationView with the optimal settings and call print
+ * on that.
+ */
+ virtual void print(bool previewOnly = false);
+
+ /**
+ * Return X of the left of the canvas visible part.
+ */
+ double getCanvasLeftX() { return getCanvasView()->contentsX(); }
+
+ virtual RulerScale* getHLayout();
+
+ /**
+ * Return the notation window width
+ */
+ int getCanvasVisibleWidth();
+
+ /**
+ * Return the minimal width which shall be allocated to
+ * the track headers top frame.
+ * (The width of the close button + the width of an info
+ * button still to come).
+ */
+ int getHeadersTopFrameMinWidth();
+
+public slots:
+
+ /**
+ * Print the current set of segments, by creating another
+ * NotationView with the printing configuration but the same
+ * segments, font etc as this view and asking it to print.
+ */
+ void slotFilePrint();
+
+ /**
+ * Preview the current set of segments, by creating another
+ * NotationView with the printing configuration but the same
+ * segments, font etc as this view and asking it to preview.
+ */
+ void slotFilePrintPreview();
+
+ /**
+ * export a LilyPond file
+ */
+ bool exportLilyPondFile(QString url, bool forPreview = false);
+
+ /**
+ * Export to a temporary file and process
+ */
+ void slotPrintLilyPond();
+ void slotPreviewLilyPond();
+ void slotLilyPondViewProcessExited(KProcess *);
+
+ /**
+ * put the marked text/object into the clipboard and remove it
+ * from the document
+ */
+ void slotEditCut();
+
+ /**
+ * put the marked text/object into the clipboard
+ */
+ void slotEditCopy();
+
+ /**
+ * paste the clipboard into the document
+ */
+ void slotEditPaste();
+
+ /**
+ * cut the selection and close the gap, moving subsequent events
+ * towards the start of the segment
+ */
+ void slotEditCutAndClose();
+
+ /**
+ * paste the clipboard into the document, offering a choice for how
+ */
+ void slotEditGeneralPaste();
+
+ /**
+ * delete the selection (cut without the copy)
+ */
+ void slotEditDelete();
+
+ /**
+ * move the selection to the staff above
+ */
+ void slotMoveEventsUpStaff();
+
+ /**
+ * move the selection to the staff below
+ */
+ void slotMoveEventsDownStaff();
+
+ /**
+ * toggles the tools toolbar
+ */
+ void slotToggleToolsToolBar();
+
+ /**
+ * toggles the notes toolbar
+ */
+ void slotToggleNotesToolBar();
+
+ /**
+ * toggles the rests toolbar
+ */
+ void slotToggleRestsToolBar();
+
+ /**
+ * toggles the accidentals toolbar
+ */
+ void slotToggleAccidentalsToolBar();
+
+ /**
+ * toggles the clefs toolbar
+ */
+ void slotToggleClefsToolBar();
+
+ /**
+ * toggles the marks toolbar
+ */
+ void slotToggleMarksToolBar();
+
+ /**
+ * toggles the group toolbar
+ */
+ void slotToggleGroupToolBar();
+
+ /**
+ * toggles the layout toolbar
+ */
+ void slotToggleLayoutToolBar();
+
+ /**
+ * toggles the transport toolbar
+ */
+ void slotToggleTransportToolBar();
+
+ /**
+ * toggles the meta toolbar
+ */
+ void slotToggleMetaToolBar();
+
+ /// note switch slot
+ void slotNoteAction();
+
+ /// switch to last selected note
+ void slotLastNoteAction();
+
+ /// accidental switch slots
+ void slotNoAccidental();
+ void slotFollowAccidental();
+ void slotSharp();
+ void slotFlat();
+ void slotNatural();
+ void slotDoubleSharp();
+ void slotDoubleFlat();
+
+ /// clef switch slots
+ void slotTrebleClef();
+ void slotAltoClef();
+ void slotTenorClef();
+ void slotBassClef();
+
+ /// text tool
+ void slotText();
+
+ /// guitar chord tool
+ void slotGuitarChord();
+
+ /// editing tools
+ void slotEraseSelected();
+ void slotSelectSelected();
+
+ void slotToggleStepByStep();
+
+ /// status stuff
+ void slotUpdateInsertModeStatus();
+ void slotUpdateAnnotationsStatus();
+ void slotUpdateLilyPondDirectivesStatus();
+
+ /// edit menu
+ void slotPreviewSelection();
+ void slotClearLoop();
+ void slotClearSelection();
+ void slotEditSelectFromStart();
+ void slotEditSelectToEnd();
+ void slotEditSelectWholeStaff();
+ void slotFilterSelection();
+
+ /// view menu
+ void slotLinearMode();
+ void slotContinuousPageMode();
+ void slotMultiPageMode();
+ void slotToggleChordsRuler();
+ void slotToggleRawNoteRuler();
+ void slotToggleTempoRuler();
+ void slotToggleAnnotations();
+ void slotToggleLilyPondDirectives();
+ void slotEditLyrics();
+
+ /// Notation header slots
+ void slotShowHeadersGroup();
+ void slotHideHeadersGroup();
+ void slotVerticalScrollHeadersGroup(int);
+ void slotUpdateHeaders(int x, int y);
+ void slotHeadersWidthChanged(int w);
+
+ /// Adjust notation header view when bottom ruler added or removed
+ void slotCanvasBottomWidgetHeightChanged(int);
+
+ /// group slots
+ void slotGroupBeam();
+ void slotGroupAutoBeam();
+ void slotGroupBreak();
+ void slotGroupSimpleTuplet();
+ void slotGroupGeneralTuplet();
+ void slotGroupTuplet(bool simple);
+ void slotGroupUnTuplet();
+ void slotGroupSlur();
+ void slotGroupPhrasingSlur();
+ void slotGroupGlissando();
+ void slotGroupCrescendo();
+ void slotGroupDecrescendo();
+ void slotGroupMakeChord();
+ void slotGroupOctave2Up();
+ void slotGroupOctaveUp();
+ void slotGroupOctaveDown();
+ void slotGroupOctave2Down();
+ void slotAddIndication(std::string type, QString cat);
+
+ /// transforms slots
+ void slotTransformsNormalizeRests();
+ void slotTransformsCollapseRests();
+ void slotTransformsCollapseNotes();
+ void slotTransformsTieNotes();
+ void slotTransformsUntieNotes();
+ void slotTransformsMakeNotesViable();
+ void slotTransformsDeCounterpoint();
+ void slotTransformsStemsUp();
+ void slotTransformsStemsDown();
+ void slotTransformsRestoreStems();
+ void slotTransformsSlursAbove();
+ void slotTransformsSlursBelow();
+ void slotTransformsRestoreSlurs();
+ void slotTransformsTiesAbove();
+ void slotTransformsTiesBelow();
+ void slotTransformsRestoreTies();
+ void slotTransformsQuantize();
+ void slotTransformsFixQuantization();
+ void slotTransformsRemoveQuantization();
+ void slotTransformsInterpret();
+
+ void slotRespellDoubleFlat();
+ void slotRespellFlat();
+ void slotRespellNatural();
+ void slotRespellSharp();
+ void slotRespellDoubleSharp();
+ void slotRespellUp();
+ void slotRespellDown();
+ void slotRespellRestore();
+ void slotShowCautionary();
+ void slotCancelCautionary();
+
+ void slotSetStyleFromAction();
+ void slotInsertNoteFromAction();
+ void slotInsertRest();
+ void slotSwitchFromRestToNote();
+ void slotSwitchFromNoteToRest();
+ void slotToggleDot();
+
+ void slotAddMark();
+ void slotMarksAddTextMark();
+ void slotMarksAddFingeringMark();
+ void slotMarksAddFingeringMarkFromAction();
+ void slotMarksRemoveMarks();
+ void slotMarksRemoveFingeringMarks();
+ void slotMakeOrnament();
+ void slotUseOrnament();
+ void slotRemoveOrnament();
+
+ void slotNoteChangeAction();
+ void slotSetNoteDurations(Note::Type, bool notationOnly);
+ void slotAddDot();
+ void slotAddDotNotationOnly();
+
+ void slotAddSlashes();
+
+ void slotEditAddClef();
+ void slotEditAddKeySignature();
+ void slotEditAddSustainDown();
+ void slotEditAddSustainUp();
+ void slotEditAddSustain(bool down);
+ void slotEditTranspose();
+ void slotEditSwitchPreset();
+ void slotEditElement(NotationStaff *, NotationElement *, bool advanced);
+
+ void slotFinePositionLeft();
+ void slotFinePositionRight();
+ void slotFinePositionUp();
+ void slotFinePositionDown();
+ void slotFinePositionRestore();
+
+ void slotMakeVisible();
+ void slotMakeInvisible();
+
+ void slotDebugDump();
+
+ /// Canvas actions slots
+
+ /**
+ * Called when a mouse press occurred on a notation element
+ * or somewhere on a staff
+ */
+ void slotItemPressed(int height, int staffNo, QMouseEvent*, NotationElement*);
+
+ /**
+ * Called when a mouse press occurred on a non-notation element
+ */
+ void slotNonNotationItemPressed(QMouseEvent *e, QCanvasItem *i);
+
+ /**
+ * Called when a mouse press occurred on a QCanvasText
+ */
+ void slotTextItemPressed(QMouseEvent *e, QCanvasItem *i);
+
+ void slotMouseMoved(QMouseEvent*);
+ void slotMouseReleased(QMouseEvent*);
+
+ /**
+ * Called when the mouse cursor moves over a different height on
+ * the staff
+ *
+ * @see NotationCanvasView#hoveredOverNoteChange()
+ */
+ void slotHoveredOverNoteChanged(const QString&);
+
+ /**
+ * Called when the mouse cursor moves over a note which is at a
+ * different time on the staff
+ *
+ * @see NotationCanvasView#hoveredOverAbsoluteTimeChange()
+ */
+ void slotHoveredOverAbsoluteTimeChanged(unsigned int);
+
+ /**
+ * Set the time pointer position during playback (purely visual,
+ * doesn't affect playback). This is also at liberty to highlight
+ * some notes, if it so desires...
+ */
+ void slotSetPointerPosition(timeT position);
+
+ /**
+ * As above, but with the ability to specify whether to scroll or
+ * not to follow the pointer (above method uses the play tracking
+ * setting to determine that)
+ */
+ void slotSetPointerPosition(timeT position, bool scroll);
+
+ /**
+ * Update the recording segment if it's one of the ones in the
+ * view
+ */
+ void slotUpdateRecordingSegment(Segment *recordingSegment,
+ timeT updatedFrom);
+
+ /// Set the current staff to the one containing the given canvas Y coord
+ void slotSetCurrentStaff(double canvasX, int canvasY);
+
+ /// Set the current staff to that with the given id
+ void slotSetCurrentStaff(int staffNo);
+
+ /**
+ * Set the insert cursor position (from the top LoopRuler).
+ * If the segment has recently been changed and no refresh has
+ * occurred since, pass updateNow false; then the move will
+ * happen on the next update.
+ */
+ void slotSetInsertCursorPosition(timeT position,
+ bool scroll, bool updateNow);
+
+ virtual void slotSetInsertCursorPosition(timeT position) {
+ slotSetInsertCursorPosition(position, true, true);
+ }
+
+ /// Set the insert cursor position from a mouse event location
+ void slotSetInsertCursorPosition(double canvasX, int canvasY,
+ bool scroll, bool updateNow);
+
+ void slotSetInsertCursorPosition(double canvasX, int canvasY) {
+ slotSetInsertCursorPosition(canvasX, canvasY, true, true);
+ }
+
+ /**
+ * Set the insert cursor position and scroll so it's at given point.
+ * If the segment has recently been changed and no refresh has
+ * occurred since, pass updateNow false; then the move will
+ * happen on the next update.
+ */
+ void slotSetInsertCursorAndRecentre(timeT position,
+ double cx, int cy,
+ bool updateNow = true);
+
+ void slotSetInsertCursorAndRecentre(timeT position,
+ double cx, double cy) {
+ slotSetInsertCursorAndRecentre(position, cx, static_cast<int>(cy), true);
+ }
+
+ /// Set insert cursor to playback pointer position
+ void slotJumpCursorToPlayback();
+
+ /// Set playback pointer to insert cursor position (affects playback)
+ void slotJumpPlaybackToCursor();
+
+ /// Toggle tracking with the position pointer during playback
+ void slotToggleTracking();
+
+ /// Change the current staff to the one preceding the current one
+ void slotCurrentStaffUp();
+
+ /// Change the current staff to the one following the current one
+ void slotCurrentStaffDown();
+
+ /// Change the current segment to the one following the current one
+ void slotCurrentSegmentPrior();
+
+ /// Change the current segment to the one preceding the current one
+ void slotCurrentSegmentNext();
+
+ /// Changes the font of the staffs on the view, gets font name from sender
+ void slotChangeFontFromAction();
+
+ /// Changes the font of the staffs on the view
+ void slotChangeFont(std::string newFont);
+
+ /// Changes the font and font size of the staffs on the view
+ void slotChangeFont(std::string newFont, int newSize);
+
+ /// Changes the font of the staffs on the view
+ void slotChangeFont(const QString &newFont);
+
+ /// Changes the font size of the staffs on the view
+ void slotChangeFontSize(int newSize);
+
+ /// Changes the font size of the staffs on the view, gets size from sender
+ void slotChangeFontSizeFromAction();
+
+ /// Changes the font size of the staffs on the view to the nth size in the available size list
+ void slotChangeFontSizeFromStringValue(const QString&);
+
+ /// Changes to the next font size up
+ void slotZoomIn();
+
+ /// Changes to the next font size down
+ void slotZoomOut();
+
+ /// Changes the hlayout spacing of the staffs on the view
+ void slotChangeSpacing(int newSpacing);
+
+ /// Changes the hlayout spacing of the staffs on the view
+ void slotChangeSpacingFromStringValue(const QString&);
+
+ /// Changes the hlayout spacing of the staffs on the view
+ void slotChangeSpacingFromAction();
+
+ /// Changes the hlayout proportion of the staffs on the view
+ void slotChangeProportion(int newProportion);
+
+ /// Changes the hlayout proportion of the staffs on the view
+ void slotChangeProportionFromIndex(int newProportionIndex);
+
+ /// Changes the hlayout proportion of the staffs on the view
+ void slotChangeProportionFromAction();
+
+ /// Note-on received asynchronously -- consider step-by-step editing
+ void slotInsertableNoteOnReceived(int pitch, int velocity);
+
+ /// Note-off received asynchronously -- consider step-by-step editing
+ void slotInsertableNoteOffReceived(int pitch, int velocity);
+
+ /// Note-on or note-off received asynchronously -- as above
+ void slotInsertableNoteEventReceived(int pitch, int velocity, bool noteOn);
+
+ /// A timer set when a note-on event was received has elapsed
+ void slotInsertableTimerElapsed();
+
+ /// The given QObject has originated a step-by-step-editing request
+ void slotStepByStepTargetRequested(QObject *);
+
+ /// Do on-demand rendering for a region.
+ void slotCheckRendered(double cx0, double cx1);
+
+ /// Do some background rendering work.
+ void slotRenderSomething();
+
+ void slotSetOperationNameAndStatus(QString);
+
+ // Update notation view based on track/staff name change
+ void slotUpdateStaffName();
+
+ // LilyPond Directive slots
+ void slotBeginLilyPondRepeat();
+
+signals:
+ /**
+ * Emitted when the note selected in the palette changes
+ */
+ void changeCurrentNote(bool isRest, Note::Type);
+
+ /**
+ * Emitted when a new accidental has been choosen by the user
+ */
+ void changeAccidental(Accidental, bool follow);
+
+ /**
+ * Emitted when the selection has been cut or copied
+ *
+ * @see NotationSelector#hideSelection
+ */
+ void usedSelection();
+
+ void play();
+ void stop();
+ void fastForwardPlayback();
+ void rewindPlayback();
+ void fastForwardPlaybackToEnd();
+ void rewindPlaybackToBeginning();
+ void jumpPlaybackTo(timeT);
+ void panic();
+
+ /// progress Report
+ void setProgress(int);
+ void incrementProgress(int);
+ void setOperationName(QString);
+
+ void stepByStepTargetRequested(QObject *);
+
+ void renderComplete();
+
+ void editTimeSignature(timeT);
+
+ void editMetadata(QString);
+
+ void editTriggerSegment(int);
+
+ void staffLabelChanged(TrackId id, QString label);
+
+protected:
+
+ virtual void paintEvent(QPaintEvent* e);
+
+ /**
+ * init the action maps for notes, marks etc
+ */
+ void initActionDataMaps();
+
+protected slots:
+ /**
+ * save general Options like all bar positions and status as well
+ * as the geometry and the recent file list to the configuration
+ * file
+ */
+ virtual void slotSaveOptions();
+
+protected:
+
+ /**
+ * read general Options again and initialize all variables like the recent file list
+ */
+ virtual void readOptions();
+
+ void setOneToolbar(const char *actionName,
+ const char *toolbarName);
+
+ /**
+ * create menus and toolbars
+ */
+ virtual void setupActions();
+
+ /**
+ * create or re-initialise (after font change) the font size menu
+ */
+ virtual void setupFontSizeMenu(std::string oldFontName = "");
+
+ /**
+ * Set KDE3+ menu states based on the current selection
+ */
+ virtual void setMenuStates();
+
+ /**
+ * setup status bar
+ */
+ virtual void initStatusBar();
+
+ /**
+ * Place the staffs at the correct x & y coordinates (before layout)
+ */
+ void positionStaffs();
+
+ /**
+ * Place the page pixmaps (if any) at the correct x & y
+ * coordinates (after layout)
+ */
+ void positionPages();
+
+ /**
+ * Update the panner thumbnail images. If complete is true,
+ * copy the entire mini-canvas.
+ */
+ void updateThumbnails(bool complete);
+
+ /**
+ * setup the layout/font toolbar
+ */
+ void initLayoutToolbar();
+
+ /**
+ * Helper function to toggle a toolbar given its name
+ * If \a force point to a bool, then the bool's value
+ * is used to show/hide the toolbar.
+ */
+ void toggleNamedToolBar(const QString& toolBarName, bool* force = 0);
+
+ /// Calls all the relevant preparse and layout methods
+ virtual bool applyLayout(int staffNo = -1,
+ timeT startTime = 0,
+ timeT endTime = 0);
+
+ /**
+ * Readjust the size of the canvas after a layout
+ *
+ * Checks the total width computed by the horizontal layout
+ *
+ * @see NotationHLayout#getTotalWidth()
+ */
+ void readjustCanvasSize();
+
+ /**
+ * Override from EditView
+ * @see EditView#getViewSize
+ */
+ virtual QSize getViewSize();
+
+ /**
+ * Override from EditView
+ * @see EditView#setViewSize
+ */
+ virtual void setViewSize(QSize);
+
+ /**
+ * Set the note pixmap factory
+ *
+ * The previous pixmap factory is deleted
+ */
+ void setNotePixmapFactory(NotePixmapFactory*);
+
+ virtual NotationCanvasView* getCanvasView();
+
+ virtual Segment *getCurrentSegment();
+ virtual Staff *getCurrentStaff() { return getCurrentLinedStaff(); }
+ virtual LinedStaff *getCurrentLinedStaff();
+
+ virtual LinedStaff *getStaffAbove();
+ virtual LinedStaff *getStaffBelow();
+
+ virtual bool hasSegment(Segment *segment);
+
+ /**
+ * Return the time at which the insert cursor may be found.
+ */
+ virtual timeT getInsertionTime();
+
+ /**
+ * Return the time at which the insert cursor may be found,
+ * and the time signature, clef and key at that time.
+ */
+ virtual timeT getInsertionTime(Clef &clef,
+ Rosegarden::Key &key);
+
+ void doDeferredCursorMove();
+
+ void removeViewLocalProperties(Event*);
+
+ void setupProgress(KProgress*);
+ void setupProgress(ProgressDialog*);
+ void setupDefaultProgress();
+ void disconnectProgress();
+
+ /**
+ * Test whether we've had too many preview notes recently
+ */
+ bool canPreviewAnotherNote();
+
+ virtual void updateViewCaption();
+
+ void showHeadersGroup();
+ void hideHeadersGroup();
+
+
+ //--------------- Data members ---------------------------------
+
+ NotationProperties m_properties;
+
+ /// Displayed in the status bar, shows number of events selected
+ QLabel *m_selectionCounter;
+
+ /// Displayed in the status bar, shows insertion mode
+ QLabel *m_insertModeLabel;
+
+ /// Displayed in the status bar, shows when annotations are hidden
+ QLabel *m_annotationsLabel;
+
+ /// Displayed in the status bar, shows when LilyPond directives are hidden
+ QLabel *m_lilyPondDirectivesLabel;
+
+ /// Displayed in the status bar, shows progress of current operation
+ ProgressBar *m_progressBar;
+
+ /// Displayed in the status bar, holds the pixmap of the current note
+ QLabel* m_currentNotePixmap;
+
+ /// Displayed in the status bar, shows the pitch the cursor is at
+ QLabel* m_hoveredOverNoteName;
+
+ /// Displayed in the status bar, shows the absolute time the cursor is at
+ QLabel* m_hoveredOverAbsoluteTime;
+
+ std::vector<NotationStaff*> m_staffs;
+ int m_currentStaff;
+ int m_lastFinishingStaff;
+
+ QCanvasItem *m_title;
+ QCanvasItem *m_subtitle;
+ QCanvasItem *m_composer;
+ QCanvasItem *m_copyright;
+ std::vector<QCanvasItem *> m_pages;
+ std::vector<QCanvasItem *> m_pageNumbers;
+
+ timeT m_insertionTime;
+ enum DeferredCursorMoveType {
+ NoCursorMoveNeeded,
+ CursorMoveOnly,
+ CursorMoveAndMakeVisible,
+ CursorMoveAndScrollToPosition
+ };
+ DeferredCursorMoveType m_deferredCursorMove;
+ double m_deferredCursorScrollToX;
+
+ QString m_lastNoteAction;
+
+ std::string m_fontName;
+ int m_fontSize;
+ LinedStaff::PageMode m_pageMode;
+ int m_leftGutter;
+
+ NotePixmapFactory *m_notePixmapFactory;
+
+ NotationHLayout* m_hlayout;
+ NotationVLayout* m_vlayout;
+
+ ChordNameRuler *m_chordNameRuler;
+ QWidget *m_tempoRuler;
+ RawNoteRuler *m_rawNoteRuler;
+ bool m_annotationsVisible;
+ bool m_lilyPondDirectivesVisible;
+
+ KAction* m_selectDefaultNote;
+
+ typedef QMap<QString, NoteActionData *> NoteActionDataMap;
+ static NoteActionDataMap* m_noteActionDataMap;
+
+ typedef QMap<QString, NoteChangeActionData *> NoteChangeActionDataMap;
+ static NoteChangeActionDataMap* m_noteChangeActionDataMap;
+
+ typedef QMap<QString, MarkActionData *> MarkActionDataMap;
+ static MarkActionDataMap *m_markActionDataMap;
+
+ KComboBox *m_fontCombo;
+ KComboBox *m_fontSizeCombo;
+ KComboBox *m_spacingCombo;
+ KActionMenu *m_fontSizeActionMenu;
+ ScrollBoxDialog *m_pannerDialog;
+ QTimer *m_renderTimer;
+
+ bool m_playTracking;
+
+ std::vector<std::pair<int, int> > m_pendingInsertableNotes;
+
+ enum { PROGRESS_NONE,
+ PROGRESS_BAR,
+ PROGRESS_DIALOG } m_progressDisplayer;
+
+ bool m_inhibitRefresh;
+ bool m_ok;
+
+ bool m_printMode;
+ int m_printSize;
+
+ static std::map<KProcess *, KTempFile *> m_lilyTempFileMap;
+
+ int m_showHeadersGroup;
+ QDeferScrollView * m_headersGroupView;
+ HeadersGroup * m_headersGroup;
+ QFrame * m_headersTopFrame;
+
+ KAction * m_showHeadersMenuEntry;
+
+};
+
+
+}
+
+#endif
diff --git a/src/gui/editors/notation/NoteCharacter.cpp b/src/gui/editors/notation/NoteCharacter.cpp
new file mode 100644
index 0000000..fdcb578
--- /dev/null
+++ b/src/gui/editors/notation/NoteCharacter.cpp
@@ -0,0 +1,133 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "NoteCharacter.h"
+
+#include <qpainter.h>
+#include <qpixmap.h>
+#include <qpoint.h>
+#include <qcanvas.h>
+#include <qbitmap.h>
+
+
+namespace Rosegarden
+{
+
+NoteCharacter::NoteCharacter() :
+ m_hotspot(0, 0),
+ m_pixmap(new QPixmap()),
+ m_rep(0)
+{}
+
+NoteCharacter::NoteCharacter(QPixmap pixmap,
+ QPoint hotspot, NoteCharacterDrawRep *rep) :
+ m_hotspot(hotspot),
+ m_pixmap(new QPixmap(pixmap)),
+ m_rep(rep)
+{}
+
+NoteCharacter::NoteCharacter(const NoteCharacter &c) :
+ m_hotspot(c.m_hotspot),
+ m_pixmap(new QPixmap(*c.m_pixmap)),
+ m_rep(c.m_rep)
+{
+ // nothing else
+}
+
+NoteCharacter &
+NoteCharacter::operator=(const NoteCharacter &c)
+{
+ if (&c == this)
+ return * this;
+ m_hotspot = c.m_hotspot;
+ m_pixmap = new QPixmap(*c.m_pixmap);
+ m_rep = c.m_rep;
+ return *this;
+}
+
+NoteCharacter::~NoteCharacter()
+{
+ delete m_pixmap;
+}
+
+int
+NoteCharacter::getWidth() const
+{
+ return m_pixmap->width();
+}
+
+int
+NoteCharacter::getHeight() const
+{
+ return m_pixmap->height();
+}
+
+QPoint
+NoteCharacter::getHotspot() const
+{
+ return m_hotspot;
+}
+
+QPixmap *
+NoteCharacter::getPixmap() const
+{
+ return m_pixmap;
+}
+
+QCanvasPixmap *
+NoteCharacter::getCanvasPixmap() const
+{
+ return new QCanvasPixmap(*m_pixmap, m_hotspot);
+}
+
+void
+NoteCharacter::draw(QPainter *painter, int x, int y) const
+{
+ if (!m_rep) {
+
+ painter->drawPixmap(x, y, *m_pixmap);
+
+ } else {
+
+ NoteCharacterDrawRep a(m_rep->size());
+
+ for (unsigned int i = 0; i < m_rep->size(); ++i) {
+ QPoint p(m_rep->point(i));
+ a.setPoint(i, p.x() + x, p.y() + y);
+ }
+
+ painter->drawLineSegments(a);
+ }
+}
+
+void
+NoteCharacter::drawMask(QPainter *painter, int x, int y) const
+{
+ if (!m_rep && m_pixmap->mask()) {
+ painter->drawPixmap(x, y, *(m_pixmap->mask()));
+ }
+}
+
+}
diff --git a/src/gui/editors/notation/NoteCharacter.h b/src/gui/editors/notation/NoteCharacter.h
new file mode 100644
index 0000000..bc9359e
--- /dev/null
+++ b/src/gui/editors/notation/NoteCharacter.h
@@ -0,0 +1,93 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_NOTECHARACTER_H_
+#define _RG_NOTECHARACTER_H_
+
+#include <qpixmap.h>
+#include <qpoint.h>
+#include <qpointarray.h>
+
+
+class QPainter;
+class QCanvasPixmap;
+
+namespace Rosegarden
+{
+
+class NoteCharacterDrawRep : public QPointArray
+{
+public:
+ NoteCharacterDrawRep(int size = 0) : QPointArray(size) { }
+};
+
+
+/**
+ * NoteCharacter knows how to draw a character from a font. It may be
+ * optimised for screen (using QPixmap underneath to produce
+ * low-resolution colour or greyscale glyphs) or printer (using some
+ * internal representation to draw in high-resolution monochrome on a
+ * print device). You can use screen characters on a printer and vice
+ * versa, but the performance and quality might not be as good.
+ *
+ * NoteCharacter objects are always constructed by the NoteFont, never
+ * directly.
+ */
+
+class NoteCharacter
+{
+public:
+ NoteCharacter();
+ NoteCharacter(const NoteCharacter &);
+ NoteCharacter &operator=(const NoteCharacter &);
+ ~NoteCharacter();
+
+ int getWidth() const;
+ int getHeight() const;
+
+ QPoint getHotspot() const;
+
+ QPixmap *getPixmap() const;
+ QCanvasPixmap *getCanvasPixmap() const;
+
+ void draw(QPainter *painter, int x, int y) const;
+ void drawMask(QPainter *painter, int x, int y) const;
+
+private:
+ friend class NoteFont;
+ NoteCharacter(QPixmap pixmap, QPoint hotspot, NoteCharacterDrawRep *rep);
+
+ QPoint m_hotspot;
+ QPixmap *m_pixmap; // I own this
+ NoteCharacterDrawRep *m_rep; // I don't own this, it's a reference to a static in the NoteFont
+};
+
+
+// Encapsulates NoteFontMap, and loads pixmaps etc on demand
+
+
+}
+
+#endif
diff --git a/src/gui/editors/notation/NoteCharacterNames.cpp b/src/gui/editors/notation/NoteCharacterNames.cpp
new file mode 100644
index 0000000..bcd450c
--- /dev/null
+++ b/src/gui/editors/notation/NoteCharacterNames.cpp
@@ -0,0 +1,123 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include "NoteCharacterNames.h"
+
+namespace Rosegarden
+{
+
+namespace NoteCharacterNames
+{
+
+const CharName SHARP = "MUSIC SHARP SIGN";
+const CharName FLAT = "MUSIC FLAT SIGN";
+const CharName NATURAL = "MUSIC NATURAL SIGN";
+const CharName DOUBLE_SHARP = "MUSICAL SYMBOL DOUBLE SHARP";
+const CharName DOUBLE_FLAT = "MUSICAL SYMBOL DOUBLE FLAT";
+
+const CharName BREVE = "MUSICAL SYMBOL BREVE";
+const CharName WHOLE_NOTE = "MUSICAL SYMBOL WHOLE NOTE";
+const CharName VOID_NOTEHEAD = "MUSICAL SYMBOL VOID NOTEHEAD";
+const CharName NOTEHEAD_BLACK = "MUSICAL SYMBOL NOTEHEAD BLACK";
+
+const CharName X_NOTEHEAD = "MUSICAL SYMBOL X NOTEHEAD";
+const CharName CIRCLE_X_NOTEHEAD = "MUSICAL SYMBOL CIRCLE X NOTEHEAD";
+const CharName BREVIS = "MUSICAL SYMBOL BREVIS";
+const CharName SEMIBREVIS_WHITE = "MUSICAL SYMBOL SEMIBREVIS WHITE";
+const CharName SEMIBREVIS_BLACK = "MUSICAL SYMBOL SEMIBREVIS BLACK";
+const CharName TRIANGLE_NOTEHEAD_UP_WHITE = "MUSICAL SYMBOL TRIANGLE NOTEHEAD UP WHITE";
+const CharName TRIANGLE_NOTEHEAD_UP_BLACK = "MUSICAL SYMBOL TRIANGLE NOTEHEAD UP BLACK";
+const CharName SQUARE_NOTEHEAD_WHITE = "MUSICAL SYMBOL SQUARE NOTEHEAD WHITE";
+const CharName SQUARE_NOTEHEAD_BLACK = "MUSICAL SYMBOL SQUARE NOTEHEAD BLACK";
+
+// These two names are not valid Unicode names. They describe flags
+// that should be used to compose multi-flag notes, rather than used
+// on their own. Unicode has no code point for these, but they're
+// common in real fonts. COMBINING PARTIAL FLAG is a flag that may be
+// drawn several times to make a multi-flag note; COMBINING PARTIAL
+// FLAG FINAL may be used as the flag nearest the note head and may
+// have an additional swash. (In many fonts, the FLAG 1 character may
+// also be suitable for use as PARTIAL FLAG FINAL).
+const CharName FLAG_PARTIAL = "MUSICAL SYMBOL COMBINING PARTIAL FLAG";
+const CharName FLAG_PARTIAL_FINAL = "MUSICAL SYMBOL COMBINING PARTIAL FLAG FINAL";
+
+const CharName FLAG_1 = "MUSICAL SYMBOL COMBINING FLAG-1";
+const CharName FLAG_2 = "MUSICAL SYMBOL COMBINING FLAG-2";
+const CharName FLAG_3 = "MUSICAL SYMBOL COMBINING FLAG-3";
+const CharName FLAG_4 = "MUSICAL SYMBOL COMBINING FLAG-4";
+
+const CharName MULTI_REST = "MUSICAL SYMBOL MULTI REST"; // Unicode-4 glyph 1D13A
+const CharName MULTI_REST_ON_STAFF = "MUSICAL SYMBOL MULTI REST ON STAFF";
+const CharName WHOLE_REST = "MUSICAL SYMBOL WHOLE REST"; // Unicode-4 glyph 1D13B
+const CharName WHOLE_REST_ON_STAFF = "MUSICAL SYMBOL WHOLE REST ON STAFF";
+const CharName HALF_REST = "MUSICAL SYMBOL HALF REST"; // Unicode-4 glyph 1D13C
+const CharName HALF_REST_ON_STAFF = "MUSICAL SYMBOL HALF REST ON STAFF";
+const CharName QUARTER_REST = "MUSICAL SYMBOL QUARTER REST";
+const CharName EIGHTH_REST = "MUSICAL SYMBOL EIGHTH REST";
+const CharName SIXTEENTH_REST = "MUSICAL SYMBOL SIXTEENTH REST";
+const CharName THIRTY_SECOND_REST = "MUSICAL SYMBOL THIRTY-SECOND REST";
+const CharName SIXTY_FOURTH_REST = "MUSICAL SYMBOL SIXTY-FOURTH REST";
+
+const CharName DOT = "MUSICAL SYMBOL COMBINING AUGMENTATION DOT";
+
+const CharName ACCENT = "MUSICAL SYMBOL COMBINING ACCENT";
+const CharName TENUTO = "MUSICAL SYMBOL COMBINING TENUTO";
+const CharName STACCATO = "MUSICAL SYMBOL COMBINING STACCATO";
+const CharName STACCATISSIMO = "MUSICAL SYMBOL COMBINING STACCATISSIMO";
+const CharName MARCATO = "MUSICAL SYMBOL COMBINING MARCATO";
+const CharName FERMATA = "MUSICAL SYMBOL FERMATA";
+const CharName TRILL = "MUSICAL SYMBOL TR";
+const CharName TRILL_LINE = "MUSICAL SYMBOL COMBINING TRILL LINE";
+const CharName TURN = "MUSICAL SYMBOL TURN";
+
+const CharName MORDENT = "MUSICAL SYMBOL MORDENT";
+const CharName MORDENT_INVERTED = "MUSICAL SYMBOL INVERTED MORDENT";
+const CharName MORDENT_LONG = "MUSICAL SYMBOL LONG MORDENT";
+const CharName MORDENT_LONG_INVERTED = "MUSICAL SYMBOL LONG INVERTED MORDENT";
+
+const CharName PEDAL_MARK = "MUSICAL SYMBOL PEDAL MARK";
+const CharName PEDAL_UP_MARK = "MUSICAL SYMBOL PEDAL UP MARK";
+
+const CharName UP_BOW = "MUSICAL SYMBOL COMBINING UP BOW";
+const CharName DOWN_BOW = "MUSICAL SYMBOL COMBINING DOWN BOW";
+
+const CharName C_CLEF = "MUSICAL SYMBOL C CLEF";
+const CharName G_CLEF = "MUSICAL SYMBOL G CLEF";
+const CharName F_CLEF = "MUSICAL SYMBOL F CLEF";
+
+const CharName COMMON_TIME = "MUSICAL SYMBOL COMMON TIME";
+const CharName CUT_TIME = "MUSICAL SYMBOL CUT TIME";
+const CharName DIGIT_ZERO = "DIGIT ZERO";
+const CharName DIGIT_ONE = "DIGIT ONE";
+const CharName DIGIT_TWO = "DIGIT TWO";
+const CharName DIGIT_THREE = "DIGIT THREE";
+const CharName DIGIT_FOUR = "DIGIT FOUR";
+const CharName DIGIT_FIVE = "DIGIT FIVE";
+const CharName DIGIT_SIX = "DIGIT SIX";
+const CharName DIGIT_SEVEN = "DIGIT SEVEN";
+const CharName DIGIT_EIGHT = "DIGIT EIGHT";
+const CharName DIGIT_NINE = "DIGIT NINE";
+
+const CharName UNKNOWN = "__UNKNOWN__";
+
+}
+
+}
diff --git a/src/gui/editors/notation/NoteCharacterNames.h b/src/gui/editors/notation/NoteCharacterNames.h
new file mode 100644
index 0000000..9022ecd
--- /dev/null
+++ b/src/gui/editors/notation/NoteCharacterNames.h
@@ -0,0 +1,120 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _NOTE_CHAR_NAME_H_
+#define _NOTE_CHAR_NAME_H_
+
+#include "PropertyName.h"
+
+namespace Rosegarden {
+
+typedef PropertyName CharName;
+
+/// A selection of Unicode character names for symbols in a note font
+
+namespace NoteCharacterNames
+{
+extern const CharName SHARP;
+extern const CharName FLAT;
+extern const CharName NATURAL;
+extern const CharName DOUBLE_SHARP;
+extern const CharName DOUBLE_FLAT;
+
+extern const CharName BREVE;
+extern const CharName WHOLE_NOTE;
+extern const CharName VOID_NOTEHEAD;
+extern const CharName NOTEHEAD_BLACK;
+
+extern const CharName X_NOTEHEAD;
+extern const CharName CIRCLE_X_NOTEHEAD;
+extern const CharName SEMIBREVIS_WHITE;
+extern const CharName SEMIBREVIS_BLACK;
+extern const CharName TRIANGLE_NOTEHEAD_UP_WHITE;
+extern const CharName TRIANGLE_NOTEHEAD_UP_BLACK;
+extern const CharName SQUARE_NOTEHEAD_WHITE;
+extern const CharName SQUARE_NOTEHEAD_BLACK;
+
+extern const CharName FLAG_PARTIAL;
+extern const CharName FLAG_PARTIAL_FINAL;
+
+extern const CharName FLAG_1;
+extern const CharName FLAG_2;
+extern const CharName FLAG_3;
+extern const CharName FLAG_4;
+
+extern const CharName MULTI_REST;
+extern const CharName MULTI_REST_ON_STAFF;
+extern const CharName WHOLE_REST;
+extern const CharName WHOLE_REST_ON_STAFF;
+extern const CharName HALF_REST;
+extern const CharName HALF_REST_ON_STAFF;
+extern const CharName QUARTER_REST;
+extern const CharName EIGHTH_REST;
+extern const CharName SIXTEENTH_REST;
+extern const CharName THIRTY_SECOND_REST;
+extern const CharName SIXTY_FOURTH_REST;
+
+extern const CharName DOT;
+
+extern const CharName ACCENT;
+extern const CharName TENUTO;
+extern const CharName STACCATO;
+extern const CharName STACCATISSIMO;
+extern const CharName MARCATO;
+extern const CharName FERMATA;
+extern const CharName TRILL;
+extern const CharName TRILL_LINE;
+extern const CharName TURN;
+extern const CharName UP_BOW;
+extern const CharName DOWN_BOW;
+
+extern const CharName MORDENT;
+extern const CharName MORDENT_INVERTED;
+extern const CharName MORDENT_LONG;
+extern const CharName MORDENT_LONG_INVERTED;
+
+extern const CharName PEDAL_MARK;
+extern const CharName PEDAL_UP_MARK;
+
+extern const CharName C_CLEF;
+extern const CharName G_CLEF;
+extern const CharName F_CLEF;
+
+extern const CharName COMMON_TIME;
+extern const CharName CUT_TIME;
+extern const CharName DIGIT_ZERO;
+extern const CharName DIGIT_ONE;
+extern const CharName DIGIT_TWO;
+extern const CharName DIGIT_THREE;
+extern const CharName DIGIT_FOUR;
+extern const CharName DIGIT_FIVE;
+extern const CharName DIGIT_SIX;
+extern const CharName DIGIT_SEVEN;
+extern const CharName DIGIT_EIGHT;
+extern const CharName DIGIT_NINE;
+
+extern const CharName UNKNOWN;
+}
+
+}
+
+#endif
+
diff --git a/src/gui/editors/notation/NoteFont.cpp b/src/gui/editors/notation/NoteFont.cpp
new file mode 100644
index 0000000..95746c3
--- /dev/null
+++ b/src/gui/editors/notation/NoteFont.cpp
@@ -0,0 +1,650 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "NoteFont.h"
+#include "misc/Debug.h"
+
+#include "misc/Strings.h"
+#include "base/Exception.h"
+#include "gui/general/PixmapFunctions.h"
+#include "NoteCharacter.h"
+#include "NoteFontMap.h"
+#include "SystemFont.h"
+#include <qbitmap.h>
+#include <qgarray.h>
+#include <qimage.h>
+#include <qpainter.h>
+#include <qpixmap.h>
+#include <qpoint.h>
+#include <qstring.h>
+#include <qstringlist.h>
+
+
+namespace Rosegarden
+{
+
+NoteFont::FontPixmapMap *NoteFont::m_fontPixmapMap = 0;
+
+NoteFont::DrawRepMap *NoteFont::m_drawRepMap = 0;
+QPixmap *NoteFont::m_blankPixmap = 0;
+
+
+NoteFont::NoteFont(std::string fontName, int size) :
+ m_fontMap(fontName)
+{
+ // Do the size checks first, to avoid doing the extra work if they fail
+
+ std::set<int> sizes = m_fontMap.getSizes();
+
+ if (sizes.size() > 0) {
+ m_size = *sizes.begin();
+ } else {
+ throw BadNoteFont(std::string("No sizes listed for font ") + fontName);
+ }
+
+ if (size > 0) {
+ if (sizes.find(size) == sizes.end()) {
+ throw BadNoteFont(qstrtostr(QString("Font \"%1\" not available in size %2").arg(strtoqstr(fontName)).arg(size)));
+ } else {
+ m_size = size;
+ }
+ }
+
+ // Create the global font map and blank pixmap if necessary
+
+ if (m_fontPixmapMap == 0) {
+ m_fontPixmapMap = new FontPixmapMap();
+ }
+
+ if (m_blankPixmap == 0) {
+ m_blankPixmap = new QPixmap(10, 10);
+ m_blankPixmap->setMask(QBitmap(10, 10, TRUE));
+ }
+
+ // Locate our font's pixmap map in the font map, create if necessary
+
+ std::string fontKey = qstrtostr(QString("__%1__%2__")
+ .arg(strtoqstr(m_fontMap.getName()))
+ .arg(m_size));
+
+ FontPixmapMap::iterator i = m_fontPixmapMap->find(fontKey);
+ if (i == m_fontPixmapMap->end()) {
+ (*m_fontPixmapMap)[fontKey] = new PixmapMap();
+ }
+
+ m_map = (*m_fontPixmapMap)[fontKey];
+}
+
+NoteFont::~NoteFont()
+{
+ // empty
+}
+
+bool
+NoteFont::getStemThickness(unsigned int &thickness) const
+{
+ thickness = m_size / 9 + 1;
+ return m_fontMap.getStemThickness(m_size, thickness);
+}
+
+bool
+NoteFont::getBeamThickness(unsigned int &thickness) const
+{
+ thickness = m_size / 2;
+ return m_fontMap.getBeamThickness(m_size, thickness);
+}
+
+bool
+NoteFont::getStemLength(unsigned int &length) const
+{
+ getStaffLineThickness(length);
+ length = (m_size + length) * 7 / 2;
+ return m_fontMap.getStemLength(m_size, length);
+}
+
+bool
+NoteFont::getFlagSpacing(unsigned int &spacing) const
+{
+ spacing = m_size;
+ return m_fontMap.getFlagSpacing(m_size, spacing);
+}
+
+bool
+NoteFont::getStaffLineThickness(unsigned int &thickness) const
+{
+ thickness = (m_size < 7 ? 1 : m_size / 7);
+ return m_fontMap.getStaffLineThickness(m_size, thickness);
+}
+
+bool
+NoteFont::getLegerLineThickness(unsigned int &thickness) const
+{
+ thickness = (m_size < 6 ? 1 : m_size / 6);
+ return m_fontMap.getLegerLineThickness(m_size, thickness);
+}
+
+bool
+NoteFont::lookup(CharName charName, bool inverted, QPixmap *&pixmap) const
+{
+ PixmapMap::iterator i = m_map->find(charName);
+ if (i != m_map->end()) {
+ if (inverted) {
+ pixmap = i->second.second;
+ if (!pixmap && i->second.first)
+ return false;
+ } else {
+ pixmap = i->second.first;
+ if (!pixmap && i->second.second)
+ return false;
+ }
+ return true;
+ }
+ pixmap = 0;
+ return false;
+}
+
+void
+NoteFont::add
+(CharName charName, bool inverted, QPixmap *pixmap) const
+{
+ PixmapMap::iterator i = m_map->find(charName);
+ if (i != m_map->end()) {
+ if (inverted) {
+ delete i->second.second;
+ i->second.second = pixmap;
+ } else {
+ delete i->second.first;
+ i->second.first = pixmap;
+ }
+ } else {
+ if (inverted) {
+ (*m_map)[charName] = PixmapPair(0, pixmap);
+ } else {
+ (*m_map)[charName] = PixmapPair(pixmap, 0);
+ }
+ }
+}
+
+NoteCharacterDrawRep *
+NoteFont::lookupDrawRep(QPixmap *pixmap) const
+{
+ if (!m_drawRepMap)
+ m_drawRepMap = new DrawRepMap();
+
+ if (m_drawRepMap->find(pixmap) != m_drawRepMap->end()) {
+
+ return (*m_drawRepMap)[pixmap];
+
+ } else {
+
+ QImage image = pixmap->convertToImage();
+ if (image.isNull())
+ return 0;
+
+ if (image.depth() > 1) {
+ image = image.convertDepth(1, Qt::MonoOnly | Qt::ThresholdDither);
+ }
+
+ NoteCharacterDrawRep *a = new NoteCharacterDrawRep();
+
+ for (int yi = 0; yi < image.height(); ++yi) {
+
+ unsigned char *line = image.scanLine(yi);
+
+ int startx = 0;
+
+ for (int xi = 0; xi <= image.width(); ++xi) {
+
+ bool pixel = false;
+
+ if (xi < image.width()) {
+ if (image.bitOrder() == QImage::LittleEndian) {
+ if (*(line + (xi >> 3)) & 1 << (xi & 7))
+ pixel = true;
+ } else {
+ if (*(line + (xi >> 3)) & 1 << (7 - (xi & 7)))
+ pixel = true;
+ }
+ }
+
+ if (!pixel) {
+ if (startx < xi) {
+ a->resize(a->size() + 2, QGArray::SpeedOptim);
+ a->setPoint(a->size() - 2, startx, yi);
+ a->setPoint(a->size() - 1, xi - 1, yi);
+ }
+ startx = xi + 1;
+ }
+ }
+ }
+
+ (*m_drawRepMap)[pixmap] = a;
+ return a;
+ }
+}
+
+bool
+NoteFont::getPixmap(CharName charName, QPixmap &pixmap, bool inverted) const
+{
+ QPixmap *found = 0;
+ bool ok = lookup(charName, inverted, found);
+ if (ok) {
+ if (found) {
+ pixmap = *found;
+ return true;
+ } else {
+ pixmap = *m_blankPixmap;
+ return false;
+ }
+ }
+
+ if (inverted && !m_fontMap.hasInversion(m_size, charName)) {
+ if (!getPixmap(charName, pixmap, !inverted))
+ return false;
+ found = new QPixmap(PixmapFunctions::flipVertical(pixmap));
+ add(charName, inverted, found);
+ pixmap = *found;
+ return true;
+ }
+
+ std::string src;
+ ok = false;
+
+ if (!inverted)
+ ok = m_fontMap.getSrc(m_size, charName, src);
+ else
+ ok = m_fontMap.getInversionSrc(m_size, charName, src);
+
+ if (ok) {
+ NOTATION_DEBUG
+ << "NoteFont::getPixmap: Loading \"" << src << "\"" << endl;
+
+ found = new QPixmap(strtoqstr(src));
+
+ if (!found->isNull()) {
+
+ if (found->mask() == 0) {
+ std::cerr << "NoteFont::getPixmap: Warning: No automatic mask "
+ << "for character \"" << charName << "\""
+ << (inverted ? " (inverted)" : "") << " in font \""
+ << m_fontMap.getName() << "-" << m_size
+ << "\"; consider making xpm background transparent"
+ << std::endl;
+ found->setMask(PixmapFunctions::generateMask(*found));
+ }
+
+ add(charName, inverted, found);
+ pixmap = *found;
+ return true;
+ }
+
+ std::cerr << "NoteFont::getPixmap: Warning: Unable to read pixmap file " << src << std::endl;
+ } else {
+
+ int code = -1;
+ if (!inverted)
+ ok = m_fontMap.getCode(m_size, charName, code);
+ else
+ ok = m_fontMap.getInversionCode(m_size, charName, code);
+
+ int glyph = -1;
+ if (!inverted)
+ ok = m_fontMap.getGlyph(m_size, charName, glyph);
+ else
+ ok = m_fontMap.getInversionGlyph(m_size, charName, glyph);
+
+ if (code < 0 && glyph < 0) {
+ std::cerr << "NoteFont::getPixmap: Warning: No pixmap, code, or glyph for character \""
+ << charName << "\"" << (inverted ? " (inverted)" : "")
+ << " in font \"" << m_fontMap.getName() << "\"" << std::endl;
+ add(charName, inverted, 0);
+ pixmap = *m_blankPixmap;
+ return false;
+ }
+
+ int charBase = 0;
+ SystemFont *systemFont =
+ m_fontMap.getSystemFont(m_size, charName, charBase);
+
+ if (!systemFont) {
+ if (!inverted && m_fontMap.hasInversion(m_size, charName)) {
+ if (!getPixmap(charName, pixmap, !inverted))
+ return false;
+ found = new QPixmap(PixmapFunctions::flipVertical(pixmap));
+ add(charName, inverted, found);
+ pixmap = *found;
+ return true;
+ }
+
+ std::cerr << "NoteFont::getPixmap: Warning: No system font for character \""
+ << charName << "\"" << (inverted ? " (inverted)" : "")
+ << " in font \"" << m_fontMap.getName() << "\"" << std::endl;
+
+ add(charName, inverted, 0);
+ pixmap = *m_blankPixmap;
+ return false;
+ }
+
+ SystemFont::Strategy strategy =
+ m_fontMap.getStrategy(m_size, charName);
+
+ bool success;
+ found = new QPixmap(systemFont->renderChar(charName,
+ glyph,
+ code + charBase,
+ strategy,
+ success));
+
+ if (success) {
+ add(charName, inverted, found);
+ pixmap = *found;
+ return true;
+ } else {
+ add(charName, inverted, 0);
+ pixmap = *m_blankPixmap;
+ return false;
+ }
+ }
+
+ add(charName, inverted, 0);
+ pixmap = *m_blankPixmap;
+ return false;
+}
+
+bool
+NoteFont::getColouredPixmap(CharName baseCharName, QPixmap &pixmap,
+ int hue, int minValue, bool inverted) const
+{
+ CharName charName(getNameWithColour(baseCharName, hue));
+
+ QPixmap *found = 0;
+ bool ok = lookup(charName, inverted, found);
+ if (ok) {
+ if (found) {
+ pixmap = *found;
+ return true;
+ } else {
+ pixmap = *m_blankPixmap;
+ return false;
+ }
+ }
+
+ QPixmap basePixmap;
+ ok = getPixmap(baseCharName, basePixmap, inverted);
+
+ if (!ok) {
+ add(charName, inverted, 0);
+ pixmap = *m_blankPixmap;
+ return false;
+ }
+
+ found = new QPixmap
+ (PixmapFunctions::colourPixmap(basePixmap, hue, minValue));
+ add(charName, inverted, found);
+ pixmap = *found;
+ return ok;
+}
+
+bool
+NoteFont::getShadedPixmap(CharName baseCharName, QPixmap &pixmap,
+ bool inverted) const
+{
+ CharName charName(getNameShaded(baseCharName));
+
+ QPixmap *found = 0;
+ bool ok = lookup(charName, inverted, found);
+ if (ok) {
+ if (found) {
+ pixmap = *found;
+ return true;
+ } else {
+ pixmap = *m_blankPixmap;
+ return false;
+ }
+ }
+
+ QPixmap basePixmap;
+ ok = getPixmap(baseCharName, basePixmap, inverted);
+
+ if (!ok) {
+ add(charName, inverted, 0);
+ pixmap = *m_blankPixmap;
+ return false;
+ }
+
+ found = new QPixmap(PixmapFunctions::shadePixmap(basePixmap));
+ add(charName, inverted, found);
+ pixmap = *found;
+ return ok;
+}
+
+CharName
+NoteFont::getNameWithColour(CharName base, int hue) const
+{
+ return qstrtostr(QString("%1__%2").arg(hue).arg(strtoqstr(base)));
+}
+
+CharName
+NoteFont::getNameShaded(CharName base) const
+{
+ return qstrtostr(QString("shaded__%1").arg(strtoqstr(base)));
+}
+
+bool
+NoteFont::getDimensions(CharName charName, int &x, int &y, bool inverted) const
+{
+ QPixmap pixmap;
+ bool ok = getPixmap(charName, pixmap, inverted);
+ x = pixmap.width();
+ y = pixmap.height();
+ return ok;
+}
+
+int
+NoteFont::getWidth(CharName charName) const
+{
+ int x, y;
+ getDimensions(charName, x, y);
+ return x;
+}
+
+int
+NoteFont::getHeight(CharName charName) const
+{
+ int x, y;
+ getDimensions(charName, x, y);
+ return y;
+}
+
+bool
+NoteFont::getHotspot(CharName charName, int &x, int &y, bool inverted) const
+{
+ int w, h;
+ getDimensions(charName, w, h, inverted);
+ bool ok = m_fontMap.getHotspot(m_size, charName, w, h, x, y);
+
+ if (!ok) {
+ x = 0;
+ y = h / 2;
+ }
+
+ if (inverted) {
+ y = h - y;
+ }
+
+ return ok;
+}
+
+QPoint
+NoteFont::getHotspot(CharName charName, bool inverted) const
+{
+ int x, y;
+ (void)getHotspot(charName, x, y, inverted);
+ return QPoint(x, y);
+}
+
+bool
+NoteFont::getCharacter(CharName charName,
+ NoteCharacter &character,
+ CharacterType type,
+ bool inverted)
+{
+ QPixmap pixmap;
+ if (!getPixmap(charName, pixmap, inverted))
+ return false;
+
+ if (type == Screen) {
+ character = NoteCharacter(pixmap,
+ getHotspot(charName, inverted),
+ 0);
+ } else {
+
+ // Get the pointer direct from cache (depends on earlier call
+ // to getPixmap to put it in the cache if available)
+
+ QPixmap *pmapptr = 0;
+ bool found = lookup(charName, inverted, pmapptr);
+
+ NoteCharacterDrawRep *rep = 0;
+ if (found && pmapptr)
+ rep = lookupDrawRep(pmapptr);
+
+ character = NoteCharacter(pixmap,
+ getHotspot(charName, inverted),
+ rep);
+ }
+
+ return true;
+}
+
+NoteCharacter
+NoteFont::getCharacter(CharName charName,
+ CharacterType type,
+ bool inverted)
+{
+ NoteCharacter character;
+ getCharacter(charName, character, type, inverted);
+ return character;
+}
+
+bool
+NoteFont::getCharacterColoured(CharName charName,
+ int hue, int minValue,
+ NoteCharacter &character,
+ CharacterType type,
+ bool inverted)
+{
+ QPixmap pixmap;
+ if (!getColouredPixmap(charName, pixmap, hue, minValue, inverted)) {
+ return false;
+ }
+
+ if (type == Screen) {
+
+ character = NoteCharacter(pixmap,
+ getHotspot(charName, inverted),
+ 0);
+
+ } else {
+
+ // Get the pointer direct from cache (depends on earlier call
+ // to getPixmap to put it in the cache if available)
+
+ QPixmap *pmapptr = 0;
+ CharName cCharName(getNameWithColour(charName, hue));
+ bool found = lookup(cCharName, inverted, pmapptr);
+
+ NoteCharacterDrawRep *rep = 0;
+ if (found && pmapptr)
+ rep = lookupDrawRep(pmapptr);
+
+ character = NoteCharacter(pixmap,
+ getHotspot(charName, inverted),
+ rep);
+ }
+
+ return true;
+}
+
+NoteCharacter
+NoteFont::getCharacterColoured(CharName charName,
+ int hue, int minValue,
+ CharacterType type,
+ bool inverted)
+{
+ NoteCharacter character;
+ getCharacterColoured(charName, hue, minValue, character, type, inverted);
+ return character;
+}
+
+bool
+NoteFont::getCharacterShaded(CharName charName,
+ NoteCharacter &character,
+ CharacterType type,
+ bool inverted)
+{
+ QPixmap pixmap;
+ if (!getShadedPixmap(charName, pixmap, inverted)) {
+ return false;
+ }
+
+ if (type == Screen) {
+
+ character = NoteCharacter(pixmap,
+ getHotspot(charName, inverted),
+ 0);
+
+ } else {
+
+ // Get the pointer direct from cache (depends on earlier call
+ // to getPixmap to put it in the cache if available)
+
+ QPixmap *pmapptr = 0;
+ CharName cCharName(getNameShaded(charName));
+ bool found = lookup(cCharName, inverted, pmapptr);
+
+ NoteCharacterDrawRep *rep = 0;
+ if (found && pmapptr)
+ rep = lookupDrawRep(pmapptr);
+
+ character = NoteCharacter(pixmap,
+ getHotspot(charName, inverted),
+ rep);
+ }
+
+ return true;
+}
+
+NoteCharacter
+NoteFont::getCharacterShaded(CharName charName,
+ CharacterType type,
+ bool inverted)
+{
+ NoteCharacter character;
+ getCharacterShaded(charName, character, type, inverted);
+ return character;
+}
+
+}
diff --git a/src/gui/editors/notation/NoteFont.h b/src/gui/editors/notation/NoteFont.h
new file mode 100644
index 0000000..81a3b19
--- /dev/null
+++ b/src/gui/editors/notation/NoteFont.h
@@ -0,0 +1,184 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_NOTEFONT_H_
+#define _RG_NOTEFONT_H_
+
+#include "base/Exception.h"
+#include <map>
+#include "NoteCharacter.h"
+#include "NoteFontMap.h"
+#include <set>
+#include <string>
+#include <qpoint.h>
+#include <utility>
+#include "gui/editors/notation/NoteCharacterNames.h"
+
+
+class QPixmap;
+class PixmapMap;
+class NoteCharacterDrawRep;
+class FontPixmapMap;
+class DrawRepMap;
+
+
+namespace Rosegarden
+{
+
+
+
+class NoteFont
+{
+public:
+ enum CharacterType { Screen, Printer };
+
+ typedef Exception BadNoteFont;
+ ~NoteFont();
+
+ std::string getName() const { return m_fontMap.getName(); }
+ int getSize() const { return m_size; }
+ bool isSmooth() const { return m_fontMap.isSmooth(); }
+ const NoteFontMap &getNoteFontMap() const { return m_fontMap; }
+
+ /// Returns false + thickness=1 if not specified
+ bool getStemThickness(unsigned int &thickness) const;
+
+ /// Returns false + a guess at suitable thickness if not specified
+ bool getBeamThickness(unsigned int &thickness) const;
+
+ /// Returns false + a guess at suitable length if not specified
+ bool getStemLength(unsigned int &length) const;
+
+ /// Returns false + a guess at suitable spacing if not specified
+ bool getFlagSpacing(unsigned int &spacing) const;
+
+ /// Returns false + thickness=1 if not specified
+ bool getStaffLineThickness(unsigned int &thickness) const;
+
+ /// Returns false + thickness=1 if not specified
+ bool getLegerLineThickness(unsigned int &thickness) const;
+
+ /// Returns false if not available
+ bool getCharacter(CharName charName,
+ NoteCharacter &character,
+ CharacterType type = Screen,
+ bool inverted = false);
+
+ /// Returns an empty character if not available
+ NoteCharacter getCharacter(CharName charName,
+ CharacterType type = Screen,
+ bool inverted = false);
+
+ /// Returns false if not available
+ bool getCharacterColoured(CharName charName,
+ int hue, int minValue,
+ NoteCharacter &character,
+ CharacterType type = Screen,
+ bool inverted = false);
+
+ /// Returns an empty character if not available
+ NoteCharacter getCharacterColoured(CharName charName,
+ int hue, int minValue,
+ CharacterType type = Screen,
+ bool inverted = false);
+
+ /// Returns false if not available
+ bool getCharacterShaded(CharName charName,
+ NoteCharacter &character,
+ CharacterType type = Screen,
+ bool inverted = false);
+
+ /// Returns an empty character if not available
+ NoteCharacter getCharacterShaded(CharName charName,
+ CharacterType type = Screen,
+ bool inverted = false);
+
+ /// Returns false + dimensions of blank pixmap if none found
+ bool getDimensions(CharName charName, int &x, int &y,
+ bool inverted = false) const;
+
+ /// Ignores problems, returning dimension of blank pixmap if necessary
+ int getWidth(CharName charName) const;
+
+ /// Ignores problems, returning dimension of blank pixmap if necessary
+ int getHeight(CharName charName) const;
+
+ /// Returns false + centre-left of pixmap if no hotspot specified
+ bool getHotspot(CharName charName, int &x, int &y,
+ bool inverted = false) const;
+
+ /// Ignores problems, returns centre-left of pixmap if necessary
+ QPoint getHotspot(CharName charName, bool inverted = false) const;
+
+private:
+ /// Returns false + blank pixmap if it can't find the right one
+ bool getPixmap(CharName charName, QPixmap &pixmap,
+ bool inverted = false) const;
+
+ /// Returns false + blank pixmap if it can't find the right one
+ bool getColouredPixmap(CharName charName, QPixmap &pixmap,
+ int hue, int minValue,
+ bool inverted = false) const;
+
+ /// Returns false + blank pixmap if it can't find the right one
+ bool getShadedPixmap(CharName charName, QPixmap &pixmap,
+ bool inverted = false) const;
+
+ friend class NoteFontFactory;
+ NoteFont(std::string fontName, int size = 0);
+ std::set<int> getSizes() const { return m_fontMap.getSizes(); }
+
+ bool lookup(CharName charName, bool inverted, QPixmap *&pixmap) const;
+ void add(CharName charName, bool inverted, QPixmap *pixmap) const;
+
+ NoteCharacterDrawRep *lookupDrawRep(QPixmap *pixmap) const;
+
+ CharName getNameWithColour(CharName origName, int hue) const;
+ CharName getNameShaded(CharName origName) const;
+
+ typedef std::pair<QPixmap *, QPixmap *> PixmapPair;
+ typedef std::map<CharName, PixmapPair> PixmapMap;
+ typedef std::map<std::string, PixmapMap *> FontPixmapMap;
+
+ typedef std::map<QPixmap *, NoteCharacterDrawRep *> DrawRepMap;
+
+ //--------------- Data members ---------------------------------
+
+ int m_size;
+ NoteFontMap m_fontMap;
+
+ mutable PixmapMap *m_map; // pointer at a member of m_fontPixmapMap
+
+ static FontPixmapMap *m_fontPixmapMap;
+ static DrawRepMap *m_drawRepMap;
+
+ static QPixmap *m_blankPixmap;
+};
+
+
+
+}
+
+#endif
diff --git a/src/gui/editors/notation/NoteFontFactory.cpp b/src/gui/editors/notation/NoteFontFactory.cpp
new file mode 100644
index 0000000..2decce4
--- /dev/null
+++ b/src/gui/editors/notation/NoteFontFactory.cpp
@@ -0,0 +1,236 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "NoteFontFactory.h"
+#include "misc/Debug.h"
+#include <kapplication.h>
+
+#include <klocale.h>
+#include <kstddirs.h>
+#include "misc/Strings.h"
+#include "document/ConfigGroups.h"
+#include "base/Exception.h"
+#include "gui/kdeext/KStartupLogo.h"
+#include "NoteFont.h"
+#include "NoteFontMap.h"
+#include <kconfig.h>
+#include <kglobal.h>
+#include <kmessagebox.h>
+#include <qdir.h>
+#include <qstring.h>
+#include <qstringlist.h>
+#include <algorithm>
+
+
+namespace Rosegarden
+{
+
+std::set<std::string>
+NoteFontFactory::getFontNames(bool forceRescan)
+{
+ NOTATION_DEBUG << "NoteFontFactory::getFontNames: forceRescan = " << forceRescan << endl;
+
+ if (forceRescan)
+ m_fontNames.clear();
+ if (!m_fontNames.empty())
+ return m_fontNames;
+
+ KConfig *config = kapp->config();
+ config->setGroup(NotationViewConfigGroup);
+
+ QString fontNameList = "";
+ if (!forceRescan) {
+ fontNameList = config->readEntry("notefontlist");
+ }
+
+ NOTATION_DEBUG << "NoteFontFactory::getFontNames: read from cache: " << fontNameList << endl;
+
+ QStringList names = QStringList::split(",", fontNameList);
+
+ if (names.empty()) {
+
+ NOTATION_DEBUG << "NoteFontFactory::getFontNames: No names available, rescanning..." << endl;
+
+ QString mappingDir =
+ KGlobal::dirs()->findResource("appdata", "fonts/mappings/");
+ QDir dir(mappingDir);
+ if (!dir.exists()) {
+ std::cerr << "NoteFontFactory::getFontNames: mapping directory \""
+ << mappingDir << "\" not found" << std::endl;
+ return m_fontNames;
+ }
+
+ dir.setFilter(QDir::Files | QDir::Readable);
+ QStringList files = dir.entryList();
+ for (QStringList::Iterator i = files.begin(); i != files.end(); ++i) {
+
+ if ((*i).length() > 4 && (*i).right(4).lower() == ".xml") {
+
+ std::string name(qstrtostr((*i).left((*i).length() - 4)));
+
+ try {
+ NoteFontMap map(name);
+ if (map.ok())
+ names.append(strtoqstr(map.getName()));
+ } catch (Exception e) {
+ KStartupLogo::hideIfStillThere();
+ KMessageBox::error(0, strtoqstr(e.getMessage()));
+ throw;
+ }
+ }
+ }
+ }
+
+ QString savedNames = "";
+
+ for (QStringList::Iterator i = names.begin(); i != names.end(); ++i) {
+ m_fontNames.insert(qstrtostr(*i));
+ if (i != names.begin())
+ savedNames += ",";
+ savedNames += *i;
+ }
+
+ config->writeEntry("notefontlist", savedNames);
+
+ return m_fontNames;
+}
+
+std::vector<int>
+NoteFontFactory::getAllSizes(std::string fontName)
+{
+ NoteFont *font = getFont(fontName, 0);
+ if (!font)
+ return std::vector<int>();
+
+ std::set
+ <int> s(font->getSizes());
+ std::vector<int> v;
+ for (std::set
+ <int>::iterator i = s.begin(); i != s.end(); ++i) {
+ v.push_back(*i);
+ }
+
+ std::sort(v.begin(), v.end());
+ return v;
+}
+
+std::vector<int>
+NoteFontFactory::getScreenSizes(std::string fontName)
+{
+ NoteFont *font = getFont(fontName, 0);
+ if (!font)
+ return std::vector<int>();
+
+ std::set
+ <int> s(font->getSizes());
+ std::vector<int> v;
+ for (std::set
+ <int>::iterator i = s.begin(); i != s.end(); ++i) {
+ if (*i <= 16)
+ v.push_back(*i);
+ }
+ std::sort(v.begin(), v.end());
+ return v;
+}
+
+NoteFont *
+NoteFontFactory::getFont(std::string fontName, int size)
+{
+ std::map<std::pair<std::string, int>, NoteFont *>::iterator i =
+ m_fonts.find(std::pair<std::string, int>(fontName, size));
+
+ if (i == m_fonts.end()) {
+ try {
+ NoteFont *font = new NoteFont(fontName, size);
+ m_fonts[std::pair<std::string, int>(fontName, size)] = font;
+ return font;
+ } catch (Exception e) {
+ KStartupLogo::hideIfStillThere();
+ KMessageBox::error(0, strtoqstr(e.getMessage()));
+ throw;
+ }
+ } else {
+ return i->second;
+ }
+}
+
+std::string
+NoteFontFactory::getDefaultFontName()
+{
+ static std::string defaultFont = "";
+ if (defaultFont != "")
+ return defaultFont;
+
+ std::set
+ <std::string> fontNames = getFontNames();
+
+ if (fontNames.find("Feta") != fontNames.end())
+ defaultFont = "Feta";
+ else {
+ fontNames = getFontNames(true);
+ if (fontNames.find("Feta") != fontNames.end())
+ defaultFont = "Feta";
+ else if (fontNames.find("Feta Pixmaps") != fontNames.end())
+ defaultFont = "Feta Pixmaps";
+ else if (fontNames.size() > 0)
+ defaultFont = *fontNames.begin();
+ else {
+ QString message = i18n("Can't obtain a default font -- no fonts found");
+ KStartupLogo::hideIfStillThere();
+ KMessageBox::error(0, message);
+ throw NoFontsAvailable(qstrtostr(message));
+ }
+ }
+
+ return defaultFont;
+}
+
+int
+NoteFontFactory::getDefaultSize(std::string fontName)
+{
+ // always return 8 if it's supported!
+ std::vector<int> sizes(getScreenSizes(fontName));
+ for (unsigned int i = 0; i < sizes.size(); ++i) {
+ if (sizes[i] == 8)
+ return sizes[i];
+ }
+ return sizes[sizes.size() / 2];
+}
+
+bool
+NoteFontFactory::isAvailableInSize(std::string fontName, int size)
+{
+ std::vector<int> sizes(getAllSizes(fontName));
+ for (unsigned int i = 0; i < sizes.size(); ++i) {
+ if (sizes[i] == size)
+ return true;
+ }
+ return false;
+}
+
+std::set<std::string> NoteFontFactory::m_fontNames;
+std::map<std::pair<std::string, int>, NoteFont *> NoteFontFactory::m_fonts;
+
+}
diff --git a/src/gui/editors/notation/NoteFontFactory.h b/src/gui/editors/notation/NoteFontFactory.h
new file mode 100644
index 0000000..33e6e80
--- /dev/null
+++ b/src/gui/editors/notation/NoteFontFactory.h
@@ -0,0 +1,71 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_NOTEFONTFACTORY_H_
+#define _RG_NOTEFONTFACTORY_H_
+
+#include "base/Exception.h"
+#include <map>
+#include <set>
+#include <string>
+#include <vector>
+
+
+
+
+namespace Rosegarden
+{
+
+class NoteFont;
+
+
+class NoteFontFactory
+{
+public:
+ typedef Exception NoFontsAvailable;
+
+ // Any method passed a fontName argument may throw BadFont or
+ // MappingFileReadFailed; any other method may throw NoFontsAvailable
+
+ static NoteFont *getFont(std::string fontName, int size);
+
+ static std::set<std::string> getFontNames(bool forceRescan = false);
+ static std::vector<int> getAllSizes(std::string fontName); // sorted
+ static std::vector<int> getScreenSizes(std::string fontName); // sorted
+
+ static std::string getDefaultFontName();
+ static int getDefaultSize(std::string fontName);
+ static bool isAvailableInSize(std::string fontName, int size);
+
+private:
+ static std::set<std::string> m_fontNames;
+ static std::map<std::pair<std::string, int>, NoteFont *> m_fonts;
+};
+
+
+
+}
+
+#endif
diff --git a/src/gui/editors/notation/NoteFontMap.cpp b/src/gui/editors/notation/NoteFontMap.cpp
new file mode 100644
index 0000000..e11c126
--- /dev/null
+++ b/src/gui/editors/notation/NoteFontMap.cpp
@@ -0,0 +1,1088 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "NoteFontMap.h"
+#include "misc/Debug.h"
+
+#include <klocale.h>
+#include <kstddirs.h>
+#include "misc/Strings.h"
+#include "base/Exception.h"
+#include "SystemFont.h"
+#include <kglobal.h>
+#include <qfile.h>
+#include <qfileinfo.h>
+#include <qpixmap.h>
+#include <qregexp.h>
+#include <qstring.h>
+#include <qstringlist.h>
+
+
+namespace Rosegarden
+{
+
+NoteFontMap::NoteFontMap(std::string name) :
+ m_name(name),
+ m_smooth(false),
+ m_srcDirectory(name),
+ m_characterDestination(0),
+ m_hotspotCharName(""),
+ m_errorString(i18n("unknown error")),
+ m_ok(true)
+{
+ m_fontDirectory = KGlobal::dirs()->findResource("appdata", "fonts/");
+
+ QString mapFileName;
+
+ QString mapFileMixedName = QString("%1/mappings/%2.xml")
+ .arg(m_fontDirectory)
+ .arg(strtoqstr(name));
+
+ QFileInfo mapFileMixedInfo(mapFileMixedName);
+
+ if (!mapFileMixedInfo.isReadable()) {
+
+ QString lowerName = strtoqstr(name).lower();
+ lowerName.replace(QRegExp(" "), "_");
+ QString mapFileLowerName = QString("%1/mappings/%2.xml")
+ .arg(m_fontDirectory)
+ .arg(lowerName);
+
+ QFileInfo mapFileLowerInfo(mapFileLowerName);
+
+ if (!mapFileLowerInfo.isReadable()) {
+ if (mapFileLowerName != mapFileMixedName) {
+ throw MappingFileReadFailed
+ (qstrtostr(i18n("Can't open font mapping file %1 or %2").
+ arg(mapFileMixedName).arg(mapFileLowerName)));
+ } else {
+ throw MappingFileReadFailed
+ (qstrtostr(i18n("Can't open font mapping file %1").
+ arg(mapFileMixedName)));
+ }
+ } else {
+ mapFileName = mapFileLowerName;
+ }
+ } else {
+ mapFileName = mapFileMixedName;
+ }
+
+ QFile mapFile(mapFileName);
+
+ QXmlInputSource source(mapFile);
+ QXmlSimpleReader reader;
+ reader.setContentHandler(this);
+ reader.setErrorHandler(this);
+ bool ok = reader.parse(source);
+ mapFile.close();
+
+ if (!ok) {
+ throw MappingFileReadFailed(qstrtostr(m_errorString));
+ }
+}
+
+NoteFontMap::~NoteFontMap()
+{
+ for (SystemFontMap::iterator i = m_systemFontCache.begin();
+ i != m_systemFontCache.end(); ++i) {
+ delete i->second;
+ }
+}
+
+bool
+NoteFontMap::characters(QString &chars)
+{
+ if (!m_characterDestination)
+ return true;
+ *m_characterDestination += qstrtostr(chars);
+ return true;
+}
+
+int
+NoteFontMap::toSize(int baseSize, double factor, bool limitAtOne)
+{
+ double dsize = factor * baseSize;
+ dsize += 0.5;
+ if (limitAtOne && dsize < 1.0)
+ dsize = 1.0;
+ return int(dsize);
+}
+
+bool
+NoteFontMap::startElement(const QString &, const QString &,
+ const QString &qName,
+ const QXmlAttributes &attributes)
+{
+ QString lcName = qName.lower();
+ m_characterDestination = 0;
+
+ // The element names are actually unique within the whole file;
+ // we don't bother checking we're in the right context. Leave that
+ // to the DTD, when we have one.
+
+ if (lcName == "rosegarden-font-encoding") {
+
+ QString s;
+
+ s = attributes.value("name");
+ if (s) {
+ m_name = qstrtostr(s);
+ m_srcDirectory = m_name;
+ }
+
+ } else if (lcName == "font-information") {
+
+ QString s;
+
+ s = attributes.value("origin");
+ if (s)
+ m_origin = qstrtostr(s);
+
+ s = attributes.value("copyright");
+ if (s)
+ m_copyright = qstrtostr(s);
+
+ s = attributes.value("mapped-by");
+ if (s)
+ m_mappedBy = qstrtostr(s);
+
+ s = attributes.value("type");
+ if (s)
+ m_type = qstrtostr(s);
+
+ s = attributes.value("autocrop");
+ if (s) {
+ std::cerr << "Warning: autocrop attribute in note font mapping file is no longer supported\n(all fonts are now always autocropped)" << std::endl;
+ }
+
+ s = attributes.value("smooth");
+ if (s)
+ m_smooth = (s.lower() == "true");
+
+ } else if (lcName == "font-sizes") {
+ }
+ else if (lcName == "font-size") {
+
+ QString s = attributes.value("note-height");
+ if (!s) {
+ m_errorString = "note-height is a required attribute of font-size";
+ return false;
+ }
+ int noteHeight = s.toInt();
+
+ SizeData &sizeData = m_sizes[noteHeight];
+
+ s = attributes.value("staff-line-thickness");
+ if (s)
+ sizeData.setStaffLineThickness(s.toInt());
+
+ s = attributes.value("leger-line-thickness");
+ if (s)
+ sizeData.setLegerLineThickness(s.toInt());
+
+ s = attributes.value("stem-thickness");
+ if (s)
+ sizeData.setStemThickness(s.toInt());
+
+ s = attributes.value("beam-thickness");
+ if (s)
+ sizeData.setBeamThickness(s.toInt());
+
+ s = attributes.value("stem-length");
+ if (s)
+ sizeData.setStemLength(s.toInt());
+
+ s = attributes.value("flag-spacing");
+ if (s)
+ sizeData.setFlagSpacing(s.toInt());
+
+ s = attributes.value("border-x");
+ if (s) {
+ std::cerr << "Warning: border-x attribute in note font mapping file is no longer supported\n(use hotspot-x for note head or flag)" << std::endl;
+ }
+
+ s = attributes.value("border-y");
+ if (s) {
+ std::cerr << "Warning: border-y attribute in note font mapping file is no longer supported" << std::endl;
+ }
+
+ int fontId = 0;
+ s = attributes.value("font-id");
+ if (s)
+ fontId = s.toInt();
+
+ s = attributes.value("font-height");
+ if (s)
+ sizeData.setFontHeight(fontId, s.toInt());
+
+ } else if (lcName == "font-scale") {
+
+ double fontHeight = -1.0;
+ double beamThickness = -1.0;
+ double stemLength = -1.0;
+ double flagSpacing = -1.0;
+ double staffLineThickness = -1.0;
+ double legerLineThickness = -1.0;
+ double stemThickness = -1.0;
+
+ QString s;
+
+ s = attributes.value("font-height");
+ if (s)
+ fontHeight = qstrtodouble(s);
+ else {
+ m_errorString = "font-height is a required attribute of font-scale";
+ return false;
+ }
+
+ s = attributes.value("staff-line-thickness");
+ if (s)
+ staffLineThickness = qstrtodouble(s);
+
+ s = attributes.value("leger-line-thickness");
+ if (s)
+ legerLineThickness = qstrtodouble(s);
+
+ s = attributes.value("stem-thickness");
+ if (s)
+ stemThickness = qstrtodouble(s);
+
+ s = attributes.value("beam-thickness");
+ if (s)
+ beamThickness = qstrtodouble(s);
+
+ s = attributes.value("stem-length");
+ if (s)
+ stemLength = qstrtodouble(s);
+
+ s = attributes.value("flag-spacing");
+ if (s)
+ flagSpacing = qstrtodouble(s);
+
+ int fontId = 0;
+ s = attributes.value("font-id");
+ if (s)
+ fontId = s.toInt();
+
+ //!!! need to be able to calculate max size -- checkFont needs
+ //to take a size argument; unfortunately Qt doesn't seem to be
+ //able to report to us when a scalable font was loaded in the
+ //wrong size, so large sizes might be significantly inaccurate
+ //as it just stops scaling up any further at somewhere around
+ //120px. We could test whether the metric for the black
+ //notehead is noticeably smaller than the notehead should be,
+ //and reject if so? [update -- no, that doesn't work either,
+ //Qt just returns the correct metric even if drawing the
+ //incorrect size]
+
+ for (int sz = 1; sz <= 30; sz += (sz == 1 ? 1 : 2)) {
+
+ SizeData & sizeData = m_sizes[sz];
+ unsigned int temp;
+
+ if (sizeData.getStaffLineThickness(temp) == false &&
+ staffLineThickness >= 0.0)
+ sizeData.setStaffLineThickness(toSize(sz, staffLineThickness, true));
+
+ if (sizeData.getLegerLineThickness(temp) == false &&
+ legerLineThickness >= 0.0)
+ sizeData.setLegerLineThickness(toSize(sz, legerLineThickness, true));
+
+ if (sizeData.getStemThickness(temp) == false &&
+ stemThickness >= 0.0)
+ sizeData.setStemThickness(toSize(sz, stemThickness, true));
+
+ if (sizeData.getBeamThickness(temp) == false &&
+ beamThickness >= 0.0)
+ sizeData.setBeamThickness(toSize(sz, beamThickness, true));
+
+ if (sizeData.getStemLength(temp) == false &&
+ stemLength >= 0.0)
+ sizeData.setStemLength(toSize(sz, stemLength, true));
+
+ if (sizeData.getFlagSpacing(temp) == false &&
+ flagSpacing >= 0.0)
+ sizeData.setFlagSpacing(toSize(sz, flagSpacing, true));
+
+ if (sizeData.getFontHeight(fontId, temp) == false)
+ sizeData.setFontHeight(fontId, toSize(sz, fontHeight, true));
+ }
+
+ } else if (lcName == "font-symbol-map") {
+ }
+ else if (lcName == "src-directory") {
+
+ QString d = attributes.value("name");
+ if (!d) {
+ m_errorString = "name is a required attribute of src-directory";
+ return false;
+ }
+
+ m_srcDirectory = qstrtostr(d);
+
+ } else if (lcName == "codebase") {
+
+ int bn = 0, fn = 0;
+ bool ok;
+ QString base = attributes.value("base");
+ if (!base) {
+ m_errorString = "base is a required attribute of codebase";
+ return false;
+ }
+ bn = base.toInt(&ok);
+ if (!ok || bn < 0) {
+ m_errorString =
+ QString("invalid base attribute \"%1\" (must be integer >= 0)").
+ arg(base);
+ return false;
+ }
+
+ QString fontId = attributes.value("font-id");
+ if (!fontId) {
+ m_errorString = "font-id is a required attribute of codebase";
+ return false;
+ }
+ fn = fontId.stripWhiteSpace().toInt(&ok);
+ if (!ok || fn < 0) {
+ m_errorString =
+ QString("invalid font-id attribute \"%1\" (must be integer >= 0)").
+ arg(fontId);
+ return false;
+ }
+
+ m_bases[fn] = bn;
+
+ } else if (lcName == "symbol") {
+
+ QString symbolName = attributes.value("name");
+ if (!symbolName) {
+ m_errorString = "name is a required attribute of symbol";
+ return false;
+ }
+ SymbolData symbolData;
+
+ QString src = attributes.value("src");
+ QString code = attributes.value("code");
+ QString glyph = attributes.value("glyph");
+
+ int icode = -1;
+ bool ok = false;
+ if (code) {
+ icode = code.stripWhiteSpace().toInt(&ok);
+ if (!ok || icode < 0) {
+ m_errorString =
+ QString("invalid code attribute \"%1\" (must be integer >= 0)").
+ arg(code);
+ return false;
+ }
+ symbolData.setCode(icode);
+ }
+
+ int iglyph = -1;
+ ok = false;
+ if (glyph) {
+ iglyph = glyph.stripWhiteSpace().toInt(&ok);
+ if (!ok || iglyph < 0) {
+ m_errorString =
+ QString("invalid glyph attribute \"%1\" (must be integer >= 0)").
+ arg(glyph);
+ return false;
+ }
+ symbolData.setGlyph(iglyph);
+ }
+
+ if (!src && icode < 0 && iglyph < 0) {
+ m_errorString = "symbol must have either src, code, or glyph attribute";
+ return false;
+ }
+ if (src)
+ symbolData.setSrc(qstrtostr(src));
+
+ QString inversionSrc = attributes.value("inversion-src");
+ if (inversionSrc)
+ symbolData.setInversionSrc(qstrtostr(inversionSrc));
+
+ QString inversionCode = attributes.value("inversion-code");
+ if (inversionCode) {
+ icode = inversionCode.stripWhiteSpace().toInt(&ok);
+ if (!ok || icode < 0) {
+ m_errorString =
+ QString("invalid inversion code attribute \"%1\" (must be integer >= 0)").
+ arg(inversionCode);
+ return false;
+ }
+ symbolData.setInversionCode(icode);
+ }
+
+ QString inversionGlyph = attributes.value("inversion-glyph");
+ if (inversionGlyph) {
+ iglyph = inversionGlyph.stripWhiteSpace().toInt(&ok);
+ if (!ok || iglyph < 0) {
+ m_errorString =
+ QString("invalid inversion glyph attribute \"%1\" (must be integer >= 0)").
+ arg(inversionGlyph);
+ return false;
+ }
+ symbolData.setInversionGlyph(iglyph);
+ }
+
+ QString fontId = attributes.value("font-id");
+ if (fontId) {
+ int n = fontId.stripWhiteSpace().toInt(&ok);
+ if (!ok || n < 0) {
+ m_errorString =
+ QString("invalid font-id attribute \"%1\" (must be integer >= 0)").
+ arg(fontId);
+ return false;
+ }
+ symbolData.setFontId(n);
+ }
+
+ m_data[qstrtostr(symbolName.upper())] = symbolData;
+
+ } else if (lcName == "font-hotspots") {
+ }
+ else if (lcName == "hotspot") {
+
+ QString s = attributes.value("name");
+ if (!s) {
+ m_errorString = "name is a required attribute of hotspot";
+ return false;
+ }
+ m_hotspotCharName = qstrtostr(s.upper());
+
+ } else if (lcName == "scaled") {
+
+ if (m_hotspotCharName == "") {
+ m_errorString = "scaled-element must be in hotspot-element";
+ return false;
+ }
+
+ QString s = attributes.value("x");
+ double x = -1.0;
+ if (s)
+ x = qstrtodouble(s);
+
+ s = attributes.value("y");
+ if (!s) {
+ m_errorString = "y is a required attribute of scaled";
+ return false;
+ }
+ double y = qstrtodouble(s);
+
+ HotspotDataMap::iterator i = m_hotspots.find(m_hotspotCharName);
+ if (i == m_hotspots.end()) {
+ m_hotspots[m_hotspotCharName] = HotspotData();
+ i = m_hotspots.find(m_hotspotCharName);
+ }
+
+ i->second.setScaledHotspot(x, y);
+
+ } else if (lcName == "fixed") {
+
+ if (m_hotspotCharName == "") {
+ m_errorString = "fixed-element must be in hotspot-element";
+ return false;
+ }
+
+ QString s = attributes.value("x");
+ int x = 0;
+ if (s)
+ x = s.toInt();
+
+ s = attributes.value("y");
+ int y = 0;
+ if (s)
+ y = s.toInt();
+
+ HotspotDataMap::iterator i = m_hotspots.find(m_hotspotCharName);
+ if (i == m_hotspots.end()) {
+ m_hotspots[m_hotspotCharName] = HotspotData();
+ i = m_hotspots.find(m_hotspotCharName);
+ }
+
+ i->second.addHotspot(0, x, y);
+
+ } else if (lcName == "when") {
+
+ if (m_hotspotCharName == "") {
+ m_errorString = "when-element must be in hotspot-element";
+ return false;
+ }
+
+ QString s = attributes.value("note-height");
+ if (!s) {
+ m_errorString = "note-height is a required attribute of when";
+ return false;
+ }
+ int noteHeight = s.toInt();
+
+ s = attributes.value("x");
+ int x = 0;
+ if (s)
+ x = s.toInt();
+
+ s = attributes.value("y");
+ if (!s) {
+ m_errorString = "y is a required attribute of when";
+ return false;
+ }
+ int y = s.toInt();
+
+ HotspotDataMap::iterator i = m_hotspots.find(m_hotspotCharName);
+ if (i == m_hotspots.end()) {
+ m_hotspots[m_hotspotCharName] = HotspotData();
+ i = m_hotspots.find(m_hotspotCharName);
+ }
+
+ i->second.addHotspot(noteHeight, x, y);
+
+ } else if (lcName == "font-requirements") {
+ }
+ else if (lcName == "font-requirement") {
+
+ QString id = attributes.value("font-id");
+ int n = -1;
+ bool ok = false;
+ if (id) {
+ n = id.stripWhiteSpace().toInt(&ok);
+ if (!ok) {
+ m_errorString =
+ QString("invalid font-id attribute \"%1\" (must be integer >= 0)").
+ arg(id);
+ return false;
+ }
+ } else {
+ m_errorString = "font-id is a required attribute of font-requirement";
+ return false;
+ }
+
+ QString name = attributes.value("name");
+ QString names = attributes.value("names");
+
+ if (name) {
+ if (names) {
+ m_errorString = "font-requirement may have name or names attribute, but not both";
+ return false;
+ }
+
+ SystemFont *font = SystemFont::loadSystemFont
+ (SystemFontSpec(name, 12));
+
+ if (font) {
+ m_systemFontNames[n] = name;
+ delete font;
+ } else {
+ std::cerr << QString("Warning: Unable to load font \"%1\"").arg(name) << std::endl;
+ m_ok = false;
+ }
+
+ } else if (names) {
+
+ bool have = false;
+ QStringList list = QStringList::split(",", names, false);
+ for (QStringList::Iterator i = list.begin(); i != list.end(); ++i) {
+ SystemFont *font = SystemFont::loadSystemFont
+ (SystemFontSpec(*i, 12));
+ if (font) {
+ m_systemFontNames[n] = *i;
+ have = true;
+ delete font;
+ break;
+ }
+ }
+ if (!have) {
+ std::cerr << QString("Warning: Unable to load any of the fonts in \"%1\"").
+ arg(names) << std::endl;
+ m_ok = false;
+ }
+
+ } else {
+ m_errorString = "font-requirement must have either name or names attribute";
+ return false;
+ }
+
+ QString s = attributes.value("strategy").lower();
+ SystemFont::Strategy strategy = SystemFont::PreferGlyphs;
+
+ if (s) {
+ if (s == "prefer-glyphs")
+ strategy = SystemFont::PreferGlyphs;
+ else if (s == "prefer-codes")
+ strategy = SystemFont::PreferCodes;
+ else if (s == "only-glyphs")
+ strategy = SystemFont::OnlyGlyphs;
+ else if (s == "only-codes")
+ strategy = SystemFont::OnlyCodes;
+ else {
+ std::cerr << "Warning: Unknown strategy value " << s
+ << " (known values are prefer-glyphs, prefer-codes,"
+ << " only-glyphs, only-codes)" << std::endl;
+ }
+ }
+
+ m_systemFontStrategies[n] = strategy;
+
+ } else {
+ }
+
+ if (m_characterDestination)
+ *m_characterDestination = "";
+ return true;
+}
+
+bool
+NoteFontMap::error(const QXmlParseException& exception)
+{
+ m_errorString = QString("%1 at line %2, column %3: %4")
+ .arg(exception.message())
+ .arg(exception.lineNumber())
+ .arg(exception.columnNumber())
+ .arg(m_errorString);
+ return QXmlDefaultHandler::error(exception);
+}
+
+bool
+NoteFontMap::fatalError(const QXmlParseException& exception)
+{
+ m_errorString = QString("%1 at line %2, column %3: %4")
+ .arg(exception.message())
+ .arg(exception.lineNumber())
+ .arg(exception.columnNumber())
+ .arg(m_errorString);
+ return QXmlDefaultHandler::fatalError(exception);
+}
+
+std::set<int>
+NoteFontMap::getSizes() const
+{
+ std::set<int> sizes;
+
+ for (SizeDataMap::const_iterator i = m_sizes.begin();
+ i != m_sizes.end(); ++i) {
+ sizes.insert(i->first);
+ }
+
+ return sizes;
+}
+
+std::set<CharName>
+NoteFontMap::getCharNames() const
+{
+ std::set<CharName> names;
+
+ for (SymbolDataMap::const_iterator i = m_data.begin();
+ i != m_data.end(); ++i) {
+ names.insert(i->first);
+ }
+
+ return names;
+}
+
+bool
+NoteFontMap::checkFile(int size, std::string &src) const
+{
+ QString pixmapFileMixedName = QString("%1/%2/%3/%4.xpm")
+ .arg(m_fontDirectory)
+ .arg(strtoqstr(m_srcDirectory))
+ .arg(size)
+ .arg(strtoqstr(src));
+
+ QFileInfo pixmapFileMixedInfo(pixmapFileMixedName);
+
+ if (!pixmapFileMixedInfo.isReadable()) {
+
+ QString pixmapFileLowerName = QString("%1/%2/%3/%4.xpm")
+ .arg(m_fontDirectory)
+ .arg(strtoqstr(m_srcDirectory).lower())
+ .arg(size)
+ .arg(strtoqstr(src));
+
+ QFileInfo pixmapFileLowerInfo(pixmapFileLowerName);
+
+ if (!pixmapFileLowerInfo.isReadable()) {
+ if (pixmapFileMixedName != pixmapFileLowerName) {
+ std::cerr << "Warning: Unable to open pixmap file "
+ << pixmapFileMixedName << " or " << pixmapFileLowerName
+ << std::endl;
+ } else {
+ std::cerr << "Warning: Unable to open pixmap file "
+ << pixmapFileMixedName << std::endl;
+ }
+ return false;
+ } else {
+ src = qstrtostr(pixmapFileLowerName);
+ }
+ } else {
+ src = qstrtostr(pixmapFileMixedName);
+ }
+
+ return true;
+}
+
+bool
+NoteFontMap::hasInversion(int, CharName charName) const
+{
+ SymbolDataMap::const_iterator i = m_data.find(charName);
+ if (i == m_data.end())
+ return false;
+ return i->second.hasInversion();
+}
+
+bool
+NoteFontMap::getSrc(int size, CharName charName, std::string &src) const
+{
+ SymbolDataMap::const_iterator i = m_data.find(charName);
+ if (i == m_data.end())
+ return false;
+
+ src = i->second.getSrc();
+ if (src == "")
+ return false;
+ return checkFile(size, src);
+}
+
+bool
+NoteFontMap::getInversionSrc(int size, CharName charName, std::string &src) const
+{
+ SymbolDataMap::const_iterator i = m_data.find(charName);
+ if (i == m_data.end())
+ return false;
+
+ if (!i->second.hasInversion())
+ return false;
+ src = i->second.getInversionSrc();
+ if (src == "")
+ return false;
+ return checkFile(size, src);
+}
+
+SystemFont *
+NoteFontMap::getSystemFont(int size, CharName charName, int &charBase)
+const
+{
+ SymbolDataMap::const_iterator i = m_data.find(charName);
+ if (i == m_data.end())
+ return false;
+
+ SizeDataMap::const_iterator si = m_sizes.find(size);
+ if (si == m_sizes.end())
+ return false;
+
+ int fontId = i->second.getFontId();
+
+ unsigned int fontHeight = 0;
+ if (!si->second.getFontHeight(fontId, fontHeight)) {
+ if (fontId == 0 || !si->second.getFontHeight(0, fontHeight)) {
+ fontHeight = size;
+ }
+ }
+
+ SystemFontNameMap::const_iterator fni = m_systemFontNames.find(fontId);
+ if (fontId < 0 || fni == m_systemFontNames.end())
+ return false;
+ QString fontName = fni->second;
+
+ CharBaseMap::const_iterator bi = m_bases.find(fontId);
+ if (bi == m_bases.end())
+ charBase = 0;
+ else
+ charBase = bi->second;
+
+ SystemFontSpec spec(fontName, fontHeight);
+ SystemFontMap::const_iterator fi = m_systemFontCache.find(spec);
+ if (fi != m_systemFontCache.end()) {
+ return fi->second;
+ }
+
+ SystemFont *font = SystemFont::loadSystemFont(spec);
+ if (!font)
+ return 0;
+ m_systemFontCache[spec] = font;
+
+ NOTATION_DEBUG << "NoteFontMap::getFont: loaded font " << fontName
+ << " at pixel size " << fontHeight << endl;
+
+ return font;
+}
+
+SystemFont::Strategy
+NoteFontMap::getStrategy(int, CharName charName) const
+{
+ SymbolDataMap::const_iterator i = m_data.find(charName);
+ if (i == m_data.end())
+ return SystemFont::PreferGlyphs;
+
+ int fontId = i->second.getFontId();
+ SystemFontStrategyMap::const_iterator si =
+ m_systemFontStrategies.find(fontId);
+
+ if (si != m_systemFontStrategies.end()) {
+ return si->second;
+ }
+
+ return SystemFont::PreferGlyphs;
+}
+
+bool
+NoteFontMap::getCode(int, CharName charName, int &code) const
+{
+ SymbolDataMap::const_iterator i = m_data.find(charName);
+ if (i == m_data.end())
+ return false;
+
+ code = i->second.getCode();
+ return (code >= 0);
+}
+
+bool
+NoteFontMap::getInversionCode(int, CharName charName, int &code) const
+{
+ SymbolDataMap::const_iterator i = m_data.find(charName);
+ if (i == m_data.end())
+ return false;
+
+ code = i->second.getInversionCode();
+ return (code >= 0);
+}
+
+bool
+NoteFontMap::getGlyph(int, CharName charName, int &glyph) const
+{
+ SymbolDataMap::const_iterator i = m_data.find(charName);
+ if (i == m_data.end())
+ return false;
+
+ glyph = i->second.getGlyph();
+ return (glyph >= 0);
+}
+
+bool
+NoteFontMap::getInversionGlyph(int, CharName charName, int &glyph) const
+{
+ SymbolDataMap::const_iterator i = m_data.find(charName);
+ if (i == m_data.end())
+ return false;
+
+ glyph = i->second.getInversionGlyph();
+ return (glyph >= 0);
+}
+
+bool
+NoteFontMap::getStaffLineThickness(int size, unsigned int &thickness) const
+{
+ SizeDataMap::const_iterator i = m_sizes.find(size);
+ if (i == m_sizes.end())
+ return false;
+
+ return i->second.getStaffLineThickness(thickness);
+}
+
+bool
+NoteFontMap::getLegerLineThickness(int size, unsigned int &thickness) const
+{
+ SizeDataMap::const_iterator i = m_sizes.find(size);
+ if (i == m_sizes.end())
+ return false;
+
+ return i->second.getLegerLineThickness(thickness);
+}
+
+bool
+NoteFontMap::getStemThickness(int size, unsigned int &thickness) const
+{
+ SizeDataMap::const_iterator i = m_sizes.find(size);
+ if (i == m_sizes.end())
+ return false;
+
+ return i->second.getStemThickness(thickness);
+}
+
+bool
+NoteFontMap::getBeamThickness(int size, unsigned int &thickness) const
+{
+ SizeDataMap::const_iterator i = m_sizes.find(size);
+ if (i == m_sizes.end())
+ return false;
+
+ return i->second.getBeamThickness(thickness);
+}
+
+bool
+NoteFontMap::getStemLength(int size, unsigned int &length) const
+{
+ SizeDataMap::const_iterator i = m_sizes.find(size);
+ if (i == m_sizes.end())
+ return false;
+
+ return i->second.getStemLength(length);
+}
+
+bool
+NoteFontMap::getFlagSpacing(int size, unsigned int &spacing) const
+{
+ SizeDataMap::const_iterator i = m_sizes.find(size);
+ if (i == m_sizes.end())
+ return false;
+
+ return i->second.getFlagSpacing(spacing);
+}
+
+bool
+NoteFontMap::getHotspot(int size, CharName charName, int width, int height,
+ int &x, int &y) const
+{
+ HotspotDataMap::const_iterator i = m_hotspots.find(charName);
+ if (i == m_hotspots.end())
+ return false;
+ return i->second.getHotspot(size, width, height, x, y);
+}
+
+bool
+NoteFontMap::HotspotData::getHotspot(int size, int width, int height,
+ int &x, int &y) const
+{
+ DataMap::const_iterator i = m_data.find(size);
+ if (i == m_data.end()) {
+ i = m_data.find(0); // fixed-pixel hotspot
+ x = 0;
+ if (m_scaled.first >= 0) {
+ x = toSize(width, m_scaled.first, false);
+ } else {
+ if (i != m_data.end()) {
+ x = i->second.first;
+ }
+ }
+ if (m_scaled.second >= 0) {
+ y = toSize(height, m_scaled.second, false);
+ return true;
+ } else {
+ if (i != m_data.end()) {
+ y = i->second.second;
+ return true;
+ }
+ return false;
+ }
+ }
+ x = i->second.first;
+ y = i->second.second;
+ return true;
+}
+
+QStringList
+NoteFontMap::getSystemFontNames() const
+{
+ QStringList names;
+ for (SystemFontNameMap::const_iterator i = m_systemFontNames.begin();
+ i != m_systemFontNames.end(); ++i) {
+ names.append(i->second);
+ }
+ return names;
+}
+
+void
+NoteFontMap::dump() const
+{
+ // debug code
+
+ std::cout << "Font data:\nName: " << getName() << "\nOrigin: " << getOrigin()
+ << "\nCopyright: " << getCopyright() << "\nMapped by: "
+ << getMappedBy() << "\nType: " << getType()
+ << "\nSmooth: " << isSmooth() << std::endl;
+
+ std::set<int> sizes = getSizes();
+ std::set<CharName> names = getCharNames();
+
+ for (std::set<int>::iterator sizei = sizes.begin(); sizei != sizes.end();
+ ++sizei) {
+
+ std::cout << "\nSize: " << *sizei << "\n" << std::endl;
+
+ unsigned int t = 0;
+
+ if (getStaffLineThickness(*sizei, t)) {
+ std::cout << "Staff line thickness: " << t << std::endl;
+ }
+
+ if (getLegerLineThickness(*sizei, t)) {
+ std::cout << "Leger line thickness: " << t << std::endl;
+ }
+
+ if (getStemThickness(*sizei, t)) {
+ std::cout << "Stem thickness: " << t << std::endl;
+ }
+
+ if (getBeamThickness(*sizei, t)) {
+ std::cout << "Beam thickness: " << t << std::endl;
+ }
+
+ if (getStemLength(*sizei, t)) {
+ std::cout << "Stem length: " << t << std::endl;
+ }
+
+ if (getFlagSpacing(*sizei, t)) {
+ std::cout << "Flag spacing: " << t << std::endl;
+ }
+
+ for (std::set<CharName>::iterator namei = names.begin();
+ namei != names.end(); ++namei) {
+
+ std::cout << "\nCharacter: " << namei->c_str() << std::endl;
+
+ std::string s;
+ int x, y, c;
+
+ if (getSrc(*sizei, *namei, s)) {
+ std::cout << "Src: " << s << std::endl;
+ }
+
+ if (getInversionSrc(*sizei, *namei, s)) {
+ std::cout << "Inversion src: " << s << std::endl;
+ }
+
+ if (getCode(*sizei, *namei, c)) {
+ std::cout << "Code: " << c << std::endl;
+ }
+
+ if (getInversionCode(*sizei, *namei, c)) {
+ std::cout << "Inversion code: " << c << std::endl;
+ }
+
+ if (getGlyph(*sizei, *namei, c)) {
+ std::cout << "Glyph: " << c << std::endl;
+ }
+
+ if (getInversionGlyph(*sizei, *namei, c)) {
+ std::cout << "Inversion glyph: " << c << std::endl;
+ }
+
+ if (getHotspot(*sizei, *namei, 1, 1, x, y)) {
+ std::cout << "Hot spot: (" << x << "," << y << ")" << std::endl;
+ }
+ }
+ }
+}
+
+}
diff --git a/src/gui/editors/notation/NoteFontMap.h b/src/gui/editors/notation/NoteFontMap.h
new file mode 100644
index 0000000..119db76
--- /dev/null
+++ b/src/gui/editors/notation/NoteFontMap.h
@@ -0,0 +1,333 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_NOTEFONTMAP_H_
+#define _RG_NOTEFONTMAP_H_
+
+#include "base/Exception.h"
+#include <map>
+#include <set>
+#include <string>
+#include "SystemFont.h"
+#include <qstring.h>
+#include <qstringlist.h>
+#include <utility>
+#include <qxml.h>
+#include "gui/editors/notation/NoteCharacterNames.h"
+
+
+class QXmlParseException;
+class QXmlAttributes;
+
+
+namespace Rosegarden
+{
+
+
+
+class NoteFontMap : public QXmlDefaultHandler
+{
+public:
+ typedef Exception MappingFileReadFailed;
+
+ NoteFontMap(std::string name); // load and parse the XML mapping file
+ ~NoteFontMap();
+
+ /**
+ * ok() returns false if the file read succeeded but the font
+ * relies on system fonts that are not available. (If the file
+ * read fails, the constructor throws MappingFileReadFailed.)
+ */
+ bool ok() const { return m_ok; }
+
+ std::string getName() const { return m_name; }
+ std::string getOrigin() const { return m_origin; }
+ std::string getCopyright() const { return m_copyright; }
+ std::string getMappedBy() const { return m_mappedBy; }
+ std::string getType() const { return m_type; }
+ bool isSmooth() const { return m_smooth; }
+
+ std::set<int> getSizes() const;
+ std::set<CharName> getCharNames() const;
+
+ bool getStaffLineThickness(int size, unsigned int &thickness) const;
+ bool getLegerLineThickness(int size, unsigned int &thickness) const;
+ bool getStemThickness(int size, unsigned int &thickness) const;
+ bool getBeamThickness(int size, unsigned int &thickness) const;
+ bool getStemLength(int size, unsigned int &length) const;
+ bool getFlagSpacing(int size, unsigned int &spacing) const;
+
+ bool hasInversion(int size, CharName charName) const;
+
+ bool getSrc(int size, CharName charName, std::string &src) const;
+ bool getInversionSrc(int size, CharName charName, std::string &src) const;
+
+ SystemFont *getSystemFont(int size, CharName charName, int &charBase) const;
+ SystemFont::Strategy getStrategy(int size, CharName charName) const;
+ bool getCode(int size, CharName charName, int &code) const;
+ bool getInversionCode(int size, CharName charName, int &code) const;
+ bool getGlyph(int size, CharName charName, int &glyph) const;
+ bool getInversionGlyph(int size, CharName charName, int &glyph) const;
+
+ bool getHotspot(int size, CharName charName, int width, int height,
+ int &x, int &y) const;
+
+ // Xml handler methods:
+
+ virtual bool startElement
+ (const QString& namespaceURI, const QString& localName,
+ const QString& qName, const QXmlAttributes& atts);
+
+ virtual bool characters(QString &);
+
+ bool error(const QXmlParseException& exception);
+ bool fatalError(const QXmlParseException& exception);
+
+ void dump() const;
+
+ // Not for general use, but very handy for diagnostic display
+ QStringList getSystemFontNames() const;
+
+ // want this to be private, but need access from HotspotData
+ static int toSize(int baseSize, double factor, bool limitAtOne);
+
+private:
+ class SymbolData
+ {
+ public:
+ SymbolData() : m_fontId(0),
+ m_src(""), m_inversionSrc(""),
+ m_code(-1), m_inversionCode(-1),
+ m_glyph(-1), m_inversionGlyph(-1) { }
+ ~SymbolData() { }
+
+ void setFontId(int id) { m_fontId = id; }
+ int getFontId() const { return m_fontId; }
+
+ void setSrc(std::string src) { m_src = src; }
+ std::string getSrc() const { return m_src; }
+
+ void setCode(int code) { m_code = code; }
+ int getCode() const { return m_code; }
+
+ void setGlyph(int glyph) { m_glyph = glyph; }
+ int getGlyph() const { return m_glyph; }
+
+ void setInversionSrc(std::string inversion) { m_inversionSrc = inversion; }
+ std::string getInversionSrc() const { return m_inversionSrc; }
+
+ void setInversionCode(int code) { m_inversionCode = code; }
+ int getInversionCode() const { return m_inversionCode; }
+
+ void setInversionGlyph(int glyph) { m_inversionGlyph = glyph; }
+ int getInversionGlyph() const { return m_inversionGlyph; }
+
+ bool hasInversion() const {
+ return m_inversionGlyph >= 0 ||
+ m_inversionCode >= 0 ||
+ m_inversionSrc != "";
+ }
+
+ private:
+ int m_fontId;
+ std::string m_src;
+ std::string m_inversionSrc;
+ int m_code;
+ int m_inversionCode;
+ int m_glyph;
+ int m_inversionGlyph;
+ };
+
+ class HotspotData
+ {
+ private:
+ typedef std::pair<int, int> Point;
+ typedef std::pair<double, double> ScaledPoint;
+ typedef std::map<int, Point> DataMap;
+
+ public:
+ HotspotData() : m_scaled(-1.0, -1.0) { }
+ ~HotspotData() { }
+
+ void addHotspot(int size, int x, int y) {
+ m_data[size] = Point(x, y);
+ }
+
+ void setScaledHotspot(double x, double y) {
+ m_scaled = ScaledPoint(x, y);
+ }
+
+ bool getHotspot(int size, int width, int height, int &x, int &y) const;
+
+ private:
+ DataMap m_data;
+ ScaledPoint m_scaled;
+ };
+
+ class SizeData
+ {
+ public:
+ SizeData() : m_stemThickness(-1),
+ m_beamThickness(-1),
+ m_stemLength(-1),
+ m_flagSpacing(-1),
+ m_staffLineThickness(-1),
+ m_legerLineThickness(-1) { }
+ ~SizeData() { }
+
+ void setStemThickness(unsigned int i) {
+ m_stemThickness = (int)i;
+ }
+ void setBeamThickness(unsigned int i) {
+ m_beamThickness = (int)i;
+ }
+ void setStemLength(unsigned int i) {
+ m_stemLength = (int)i;
+ }
+ void setFlagSpacing(unsigned int i) {
+ m_flagSpacing = (int)i;
+ }
+ void setStaffLineThickness(unsigned int i) {
+ m_staffLineThickness = (int)i;
+ }
+ void setLegerLineThickness(unsigned int i) {
+ m_legerLineThickness = (int)i;
+ }
+ void setFontHeight(int fontId, unsigned int h) {
+ m_fontHeights[fontId] = (int)h;
+ }
+
+ bool getStemThickness(unsigned int &i) const {
+ if (m_stemThickness >= 0) {
+ i = (unsigned int)m_stemThickness;
+ return true;
+ } else return false;
+ }
+
+ bool getBeamThickness(unsigned int &i) const {
+ if (m_beamThickness >= 0) {
+ i = (unsigned int)m_beamThickness;
+ return true;
+ } else return false;
+ }
+
+ bool getStemLength(unsigned int &i) const {
+ if (m_stemLength >= 0) {
+ i = (unsigned int)m_stemLength;
+ return true;
+ } else return false;
+ }
+
+ bool getFlagSpacing(unsigned int &i) const {
+ if (m_flagSpacing >= 0) {
+ i = (unsigned int)m_flagSpacing;
+ return true;
+ } else return false;
+ }
+
+ bool getStaffLineThickness(unsigned int &i) const {
+ if (m_staffLineThickness >= 0) {
+ i = (unsigned int)m_staffLineThickness;
+ return true;
+ } else return false;
+ }
+
+ bool getLegerLineThickness(unsigned int &i) const {
+ if (m_legerLineThickness >= 0) {
+ i = (unsigned int)m_legerLineThickness;
+ return true;
+ } else return false;
+ }
+
+ bool getFontHeight(int fontId, unsigned int &h) const {
+ std::map<int, int>::const_iterator fhi = m_fontHeights.find(fontId);
+ if (fhi != m_fontHeights.end()) {
+ h = (unsigned int)fhi->second;
+ return true;
+ }
+ return false;
+ }
+
+ private:
+ int m_stemThickness;
+ int m_beamThickness;
+ int m_stemLength;
+ int m_flagSpacing;
+ int m_staffLineThickness;
+ int m_legerLineThickness;
+ std::map<int, int> m_fontHeights; // per-font-id
+ };
+
+ //--------------- Data members ---------------------------------
+
+ std::string m_name;
+ std::string m_origin;
+ std::string m_copyright;
+ std::string m_mappedBy;
+ std::string m_type;
+ bool m_smooth;
+
+ std::string m_srcDirectory;
+
+ typedef std::map<CharName, SymbolData> SymbolDataMap;
+ SymbolDataMap m_data;
+
+ typedef std::map<CharName, HotspotData> HotspotDataMap;
+ HotspotDataMap m_hotspots;
+
+ typedef std::map<int, SizeData> SizeDataMap;
+ SizeDataMap m_sizes;
+
+ typedef std::map<int, QString> SystemFontNameMap;
+ SystemFontNameMap m_systemFontNames;
+
+ typedef std::map<int, SystemFont::Strategy> SystemFontStrategyMap;
+ SystemFontStrategyMap m_systemFontStrategies;
+
+ typedef std::map<SystemFontSpec, SystemFont *> SystemFontMap;
+ mutable SystemFontMap m_systemFontCache;
+
+ typedef std::map<int, int> CharBaseMap;
+ CharBaseMap m_bases;
+
+ // For use when reading the XML file:
+ bool m_expectingCharacters;
+ std::string *m_characterDestination;
+ std::string m_hotspotCharName;
+ QString m_errorString;
+
+ bool checkFile(int size, std::string &src) const;
+ QString m_fontDirectory;
+
+ bool m_ok;
+};
+
+
+class NoteCharacterDrawRep;
+
+
+}
+
+#endif
diff --git a/src/gui/editors/notation/NoteFontViewer.cpp b/src/gui/editors/notation/NoteFontViewer.cpp
new file mode 100644
index 0000000..81f07e9
--- /dev/null
+++ b/src/gui/editors/notation/NoteFontViewer.cpp
@@ -0,0 +1,125 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "NoteFontViewer.h"
+
+#include <klocale.h>
+#include "FontViewFrame.h"
+#include <kcombobox.h>
+#include <kdialogbase.h>
+#include <ktoolbar.h>
+#include <qlabel.h>
+#include <qstring.h>
+#include <qstringlist.h>
+#include <qvbox.h>
+#include <qwidget.h>
+
+
+namespace Rosegarden
+{
+
+void
+NoteFontViewer::slotViewChanged(int i)
+{
+ m_frame->setGlyphs(i == 0);
+
+ m_rows->clear();
+ int firstRow = -1;
+
+ for (int r = 0; r < 256; ++r) {
+ if (m_frame->hasRow(r)) {
+ m_rows->insertItem(QString("%1").arg(r));
+ if (firstRow < 0)
+ firstRow = r;
+ }
+ }
+
+ if (firstRow < 0) {
+ m_rows->setEnabled(false);
+ m_frame->setRow(0);
+ } else {
+ m_rows->setEnabled(true);
+ m_frame->setRow(firstRow);
+ }
+}
+
+void
+NoteFontViewer::slotRowChanged(const QString &s)
+{
+ bool ok;
+ int i = s.toInt(&ok);
+ if (ok)
+ m_frame->setRow(i);
+}
+
+void
+NoteFontViewer::slotFontChanged(const QString &s)
+{
+ m_frame->setFont(s);
+ slotViewChanged(m_view->currentItem());
+}
+
+NoteFontViewer::NoteFontViewer(QWidget *parent, QString noteFontName,
+ QStringList fontNames, int pixelSize) :
+ KDialogBase(parent, 0, true,
+ i18n("Note Font Viewer: %1").arg(noteFontName), Close)
+{
+ QVBox *box = makeVBoxMainWidget();
+ KToolBar* controls = new KToolBar(box);
+ controls->setMargin(3);
+
+ (void) new QLabel(i18n(" Component: "), controls);
+ m_font = new KComboBox(controls);
+
+ for (QStringList::iterator i = fontNames.begin(); i != fontNames.end();
+ ++i) {
+ m_font->insertItem(*i);
+ }
+
+ (void) new QLabel(i18n(" View: "), controls);
+ m_view = new KComboBox(controls);
+
+ m_view->insertItem(i18n("Glyphs"));
+ m_view->insertItem(i18n("Codes"));
+
+ (void) new QLabel(i18n(" Page: "), controls);
+ m_rows = new KComboBox(controls);
+
+ m_frame = new FontViewFrame(pixelSize, box);
+
+ connect(m_font, SIGNAL(activated(const QString &)),
+ this, SLOT(slotFontChanged(const QString &)));
+
+ connect(m_view, SIGNAL(activated(int)),
+ this, SLOT(slotViewChanged(int)));
+
+ connect(m_rows, SIGNAL(activated(const QString &)),
+ this, SLOT(slotRowChanged(const QString &)));
+
+ slotFontChanged(m_font->currentText());
+}
+
+}
+#include "NoteFontViewer.moc"
diff --git a/src/gui/editors/notation/NoteFontViewer.h b/src/gui/editors/notation/NoteFontViewer.h
new file mode 100644
index 0000000..31c8613
--- /dev/null
+++ b/src/gui/editors/notation/NoteFontViewer.h
@@ -0,0 +1,68 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_NOTEFONTVIEWER_H_
+#define _RG_NOTEFONTVIEWER_H_
+
+#include <kdialogbase.h>
+#include <qstring.h>
+#include <qstringlist.h>
+
+
+class QWidget;
+class KComboBox;
+
+
+namespace Rosegarden
+{
+
+class FontViewFrame;
+
+
+class NoteFontViewer : public KDialogBase
+{
+ Q_OBJECT
+
+public:
+ NoteFontViewer(QWidget *parent, QString noteFontName,
+ QStringList systemFontNames, int pixelSize);
+
+protected slots:
+ void slotFontChanged(const QString &);
+ void slotViewChanged(int);
+ void slotRowChanged(const QString &);
+
+private:
+ KComboBox *m_font;
+ KComboBox *m_view;
+ KComboBox *m_rows;
+ FontViewFrame *m_frame;
+};
+
+
+
+}
+
+#endif
diff --git a/src/gui/editors/notation/NoteInserter.cpp b/src/gui/editors/notation/NoteInserter.cpp
new file mode 100644
index 0000000..66adafe
--- /dev/null
+++ b/src/gui/editors/notation/NoteInserter.cpp
@@ -0,0 +1,722 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "NoteInserter.h"
+#include "misc/Debug.h"
+#include <kapplication.h>
+
+#include "base/BaseProperties.h"
+#include <klocale.h>
+#include "misc/Strings.h"
+#include "document/ConfigGroups.h"
+#include "base/Event.h"
+#include "base/NotationTypes.h"
+#include "base/Segment.h"
+#include "base/Staff.h"
+#include "base/ViewElement.h"
+#include "commands/notation/NoteInsertionCommand.h"
+#include "commands/notation/RestInsertionCommand.h"
+#include "commands/notation/TupletCommand.h"
+#include "gui/general/EditTool.h"
+#include "gui/general/LinedStaff.h"
+#include "gui/general/RosegardenCanvasView.h"
+#include "NotationProperties.h"
+#include "NotationStrings.h"
+#include "NotationTool.h"
+#include "NotationView.h"
+#include "NotationStaff.h"
+#include "NotePixmapFactory.h"
+#include "NoteStyleFactory.h"
+#include <kaction.h>
+#include <kcommand.h>
+#include <kconfig.h>
+#include <qiconset.h>
+#include <qregexp.h>
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+NoteInserter::NoteInserter(NotationView* view)
+ : NotationTool("NoteInserter", view),
+ m_noteType(Note::Quaver),
+ m_noteDots(0),
+ m_autoBeam(true),
+ m_accidental(Accidentals::NoAccidental),
+ m_lastAccidental(Accidentals::NoAccidental),
+ m_followAccidental(false)
+{
+ QIconSet icon;
+
+ KConfig *config = kapp->config();
+ config->setGroup(NotationViewConfigGroup);
+ m_autoBeam = config->readBoolEntry("autobeam", true);
+ m_matrixInsertType = (config->readNumEntry("inserttype", 0) > 0);
+ m_defaultStyle = qstrtostr(config->readEntry
+ ("style", strtoqstr(NoteStyleFactory::DefaultStyle)));
+
+ KToggleAction *autoBeamAction =
+ new KToggleAction(i18n("Auto-Beam when appropriate"), 0, this,
+ SLOT(slotToggleAutoBeam()), actionCollection(),
+ "toggle_auto_beam");
+ autoBeamAction->setChecked(m_autoBeam);
+
+ for (unsigned int i = 0; i < 6; ++i) {
+
+ icon = QIconSet
+ (NotePixmapFactory::toQPixmap(NotePixmapFactory::
+ makeToolbarPixmap(m_actionsAccidental[i][3])));
+ KRadioAction* noteAction = new KRadioAction(i18n(m_actionsAccidental[i][0]),
+ icon, 0, this,
+ m_actionsAccidental[i][1],
+ actionCollection(),
+ m_actionsAccidental[i][2]);
+ noteAction->setExclusiveGroup("accidentals");
+ }
+
+ icon = QIconSet
+ (NotePixmapFactory::toQPixmap(NotePixmapFactory::
+ makeToolbarPixmap("dotted-crotchet")));
+ new KToggleAction(i18n("Dotted note"), icon, 0, this,
+ SLOT(slotToggleDot()), actionCollection(),
+ "toggle_dot");
+
+ icon = QIconSet(NotePixmapFactory::toQPixmap(NotePixmapFactory::
+ makeToolbarPixmap("select")));
+ new KAction(i18n("Switch to Select Tool"), icon, 0, this,
+ SLOT(slotSelectSelected()), actionCollection(),
+ "select");
+
+ new KAction(i18n("Switch to Erase Tool"), "eraser", 0, this,
+ SLOT(slotEraseSelected()), actionCollection(),
+ "erase");
+
+ icon = QIconSet
+ (NotePixmapFactory::toQPixmap(NotePixmapFactory::
+ makeToolbarPixmap("rest-crotchet")));
+ new KAction(i18n("Switch to Inserting Rests"), icon, 0, this,
+ SLOT(slotRestsSelected()), actionCollection(),
+ "rests");
+
+ createMenu("noteinserter.rc");
+
+ connect(m_parentView, SIGNAL(changeAccidental(Accidental, bool)),
+ this, SLOT(slotSetAccidental(Accidental, bool)));
+}
+
+NoteInserter::NoteInserter(const QString& menuName, NotationView* view)
+ : NotationTool(menuName, view),
+ m_noteType(Note::Quaver),
+ m_noteDots(0),
+ m_autoBeam(false),
+ m_clickHappened(false),
+ m_accidental(Accidentals::NoAccidental),
+ m_lastAccidental(Accidentals::NoAccidental),
+ m_followAccidental(false)
+{
+ connect(m_parentView, SIGNAL(changeAccidental(Accidental, bool)),
+ this, SLOT(slotSetAccidental(Accidental, bool)));
+}
+
+NoteInserter::~NoteInserter()
+{}
+
+void NoteInserter::ready()
+{
+ m_clickHappened = false;
+ m_nParentView->setCanvasCursor(Qt::crossCursor);
+ m_nParentView->setHeightTracking(true);
+}
+
+void
+NoteInserter::handleLeftButtonPress(timeT,
+ int,
+ int staffNo,
+ QMouseEvent* e,
+ ViewElement*)
+{
+ if (staffNo < 0)
+ return ;
+ computeLocationAndPreview(e);
+}
+
+int
+NoteInserter::handleMouseMove(timeT,
+ int,
+ QMouseEvent *e)
+{
+ if (m_clickHappened) {
+ computeLocationAndPreview(e);
+ }
+
+ return RosegardenCanvasView::NoFollow;
+}
+
+void
+NoteInserter::handleMouseRelease(timeT,
+ int,
+ QMouseEvent *e)
+{
+ if (!m_clickHappened)
+ return ;
+ bool okay = computeLocationAndPreview(e);
+ m_clickHappened = false;
+ if (!okay)
+ return ;
+ clearPreview();
+
+ Note note(m_noteType, m_noteDots);
+ timeT endTime = m_clickTime + note.getDuration();
+ Segment &segment = m_nParentView->getStaff(m_clickStaffNo)->getSegment();
+
+ Segment::iterator realEnd = segment.findTime(endTime);
+ if (!segment.isBeforeEndMarker( realEnd) ||
+ !segment.isBeforeEndMarker(++realEnd)) {
+ endTime = segment.getEndMarkerTime();
+ } else {
+ endTime = std::max(endTime, (*realEnd)->getNotationAbsoluteTime());
+ }
+
+ Event *lastInsertedEvent = doAddCommand
+ (segment, m_clickTime, endTime, note, m_clickPitch,
+ (m_accidental == Accidentals::NoAccidental &&
+ m_followAccidental) ?
+ m_lastAccidental : m_accidental);
+
+ if (lastInsertedEvent) {
+
+ m_nParentView->setSingleSelectedEvent
+ (m_clickStaffNo, lastInsertedEvent);
+
+ if (m_nParentView->isInChordMode()) {
+ m_nParentView->slotSetInsertCursorAndRecentre
+ (lastInsertedEvent->getAbsoluteTime(), e->x(), (int)e->y(),
+ false);
+ } else {
+ m_nParentView->slotSetInsertCursorAndRecentre
+ (lastInsertedEvent->getAbsoluteTime() +
+ lastInsertedEvent->getDuration(), e->x(), (int)e->y(),
+ false);
+ }
+ }
+}
+
+void
+NoteInserter::insertNote(Segment &segment, timeT insertionTime,
+ int pitch, Accidental accidental,
+ bool suppressPreview)
+{
+ Note note(m_noteType, m_noteDots);
+ timeT endTime = insertionTime + note.getDuration();
+
+ Segment::iterator realEnd = segment.findTime(endTime);
+ if (!segment.isBeforeEndMarker( realEnd) ||
+ !segment.isBeforeEndMarker(++realEnd)) {
+ endTime = segment.getEndMarkerTime();
+ } else {
+ endTime = std::max(endTime, (*realEnd)->getNotationAbsoluteTime());
+ }
+
+ Event *lastInsertedEvent = doAddCommand
+ (segment, insertionTime, endTime, note, pitch, accidental);
+
+ if (lastInsertedEvent) {
+
+ m_nParentView->setSingleSelectedEvent(segment, lastInsertedEvent);
+
+ if (m_nParentView->isInChordMode()) {
+ m_nParentView->slotSetInsertCursorPosition
+ (lastInsertedEvent->getAbsoluteTime(), true, false);
+ } else {
+ m_nParentView->slotSetInsertCursorPosition
+ (lastInsertedEvent->getAbsoluteTime() +
+ lastInsertedEvent->getDuration(), true, false);
+ }
+ }
+
+ if (!suppressPreview)
+ m_nParentView->playNote(segment, pitch);
+}
+
+bool
+NoteInserter::computeLocationAndPreview(QMouseEvent *e)
+{
+ double x = e->x();
+ int y = (int)e->y();
+
+ LinedStaff *staff = m_nParentView->getStaffForCanvasCoords(e->x(), y);
+ if (!staff) {
+ clearPreview();
+ return false;
+ }
+
+ int staffNo = staff->getId();
+ if (m_clickHappened && staffNo != m_clickStaffNo) {
+ // abandon
+ clearPreview();
+ return false;
+ }
+
+ // If we're inserting grace notes, then we need to "dress to the
+ // right", as it were
+ bool grace = m_nParentView->isInGraceMode();
+
+ int height = staff->getHeightAtCanvasCoords(x, y);
+
+ Event *clefEvt = 0, *keyEvt = 0;
+ Clef clef;
+ Rosegarden::Key key;
+
+ NotationElementList::iterator itr =
+ staff->getElementUnderCanvasCoords(x, y, clefEvt, keyEvt);
+ if (itr == staff->getViewElementList()->end()) {
+ clearPreview();
+ return false;
+ }
+
+ NotationElement* el = static_cast<NotationElement*>(*itr);
+
+ timeT time = el->event()->getAbsoluteTime(); // not getViewAbsoluteTime()
+ m_clickInsertX = el->getLayoutX();
+ if (clefEvt)
+ clef = Clef(*clefEvt);
+ if (keyEvt)
+ key = Rosegarden::Key(*keyEvt);
+
+ int subordering = el->event()->getSubOrdering();
+ float targetSubordering = subordering;
+
+ if (grace && el->getCanvasItem()) {
+
+ NotationStaff *ns = dynamic_cast<NotationStaff *>(staff);
+ if (!ns) {
+ std::cerr << "WARNING: NoteInserter: Staff is not a NotationStaff"
+ << std::endl;
+ } else {
+ std::cerr << "x=" << x << ", el->getCanvasX()=" << el->getCanvasX() << std::endl;
+ if (el->isRest()) std::cerr << "elt is a rest" << std::endl;
+ if (x - el->getCanvasX() >
+ ns->getNotePixmapFactory(false).getNoteBodyWidth()) {
+ NotationElementList::iterator j(itr);
+ while (++j != staff->getViewElementList()->end()) {
+ NotationElement *candidate = static_cast<NotationElement *>(*j);
+ if ((candidate->isNote() || candidate->isRest()) &&
+ (candidate->getViewAbsoluteTime()
+ > el->getViewAbsoluteTime() ||
+ candidate->event()->getSubOrdering()
+ > el->event()->getSubOrdering())) {
+ itr = j;
+ el = candidate;
+ m_clickInsertX = el->getLayoutX();
+ time = el->event()->getAbsoluteTime();
+ subordering = el->event()->getSubOrdering();
+ targetSubordering = subordering;
+ break;
+ }
+ }
+ }
+ }
+
+ if (x - el->getCanvasX() < 1) {
+ targetSubordering -= 0.5;
+ }
+ }
+
+ if (el->isRest() && el->getCanvasItem()) {
+ time += getOffsetWithinRest(staffNo, itr, x);
+ m_clickInsertX += (x - el->getCanvasX());
+ }
+
+ Pitch p(height, clef, key, m_accidental);
+ int pitch = p.getPerformancePitch();
+
+ // [RFE 987960] When inserting via mouse, if no accidental is
+ // selected, we use the same accidental (and thus the same pitch)
+ // as of the previous note found at this height -- iff such a note
+ // is found more recently than the last key signature.
+
+ if (m_accidental == Accidentals::NoAccidental &&
+ m_followAccidental) {
+ Segment &segment = staff->getSegment();
+ m_lastAccidental = m_accidental;
+ Segment::iterator i = segment.findNearestTime(time);
+ while (i != segment.end()) {
+ if ((*i)->isa(Rosegarden::Key::EventType)) break;
+ if ((*i)->isa(Note::EventType)) {
+ if ((*i)->has(NotationProperties::HEIGHT_ON_STAFF) &&
+ (*i)->has(BaseProperties::PITCH)) {
+ int h = (*i)->get<Int>(NotationProperties::HEIGHT_ON_STAFF);
+ if (h == height) {
+ pitch = (*i)->get<Int>(BaseProperties::PITCH);
+ (*i)->get<String>(BaseProperties::ACCIDENTAL,
+ m_lastAccidental);
+ break;
+ }
+ }
+ }
+ if (i == segment.begin()) break;
+ --i;
+ }
+ }
+
+ bool changed = false;
+
+ if (m_clickHappened) {
+ if (time != m_clickTime ||
+ subordering != m_clickSubordering ||
+ pitch != m_clickPitch ||
+ height != m_clickHeight ||
+ staffNo != m_clickStaffNo) {
+ changed = true;
+ }
+ } else {
+ m_clickHappened = true;
+ changed = true;
+ }
+
+ if (changed) {
+ m_clickTime = time;
+ m_clickSubordering = subordering;
+ m_clickPitch = pitch;
+ m_clickHeight = height;
+ m_clickStaffNo = staffNo;
+ m_targetSubordering = targetSubordering;
+
+ showPreview();
+ }
+
+ return true;
+}
+
+void NoteInserter::showPreview()
+{
+ Segment &segment = m_nParentView->getStaff(m_clickStaffNo)->getSegment();
+
+ int pitch = m_clickPitch;
+ pitch += getOttavaShift(segment, m_clickTime) * 12;
+
+ m_nParentView->showPreviewNote(m_clickStaffNo, m_clickInsertX,
+ pitch, m_clickHeight,
+ Note(m_noteType, m_noteDots),
+ m_nParentView->isInGraceMode());
+}
+
+void NoteInserter::clearPreview()
+{
+ m_nParentView->clearPreviewNote();
+}
+
+timeT
+NoteInserter::getOffsetWithinRest(int staffNo,
+ const NotationElementList::iterator &i,
+ double &canvasX) // will be snapped
+{
+ //!!! To make this work correctly in tuplet mode, our divisor would
+ // have to be the tupletified duration of the tuplet unit -- we can
+ // do that, we just haven't yet
+ if (m_nParentView->isInTripletMode())
+ return 0;
+
+ Staff *staff = m_nParentView->getStaff(staffNo);
+ NotationElement* el = static_cast<NotationElement*>(*i);
+ if (!el->getCanvasItem())
+ return 0;
+ double offset = canvasX - el->getCanvasX();
+
+ if (offset < 0)
+ return 0;
+
+ double airX, airWidth;
+ el->getLayoutAirspace(airX, airWidth);
+ double origin = ((*i)->getLayoutX() - airX) / 2;
+ double width = airWidth - origin;
+
+ timeT duration = (*i)->getViewDuration();
+
+ TimeSignature timeSig =
+ staff->getSegment().getComposition()->getTimeSignatureAt
+ ((*i)->event()->getAbsoluteTime());
+ timeT unit = timeSig.getUnitDuration();
+
+ int unitCount = duration / unit;
+ if (unitCount > 1) {
+
+ timeT result = (int)((offset / width) * unitCount);
+ if (result > unitCount - 1)
+ result = unitCount - 1;
+
+ double visibleWidth(airWidth);
+ NotationElementList::iterator j(i);
+ if (++j != staff->getViewElementList()->end()) {
+ visibleWidth = (*j)->getLayoutX() - (*i)->getLayoutX();
+ }
+ offset = (visibleWidth * result) / unitCount;
+ canvasX = el->getCanvasX() + offset;
+
+ result *= unit;
+ return result;
+ }
+
+ return 0;
+}
+
+int
+NoteInserter::getOttavaShift(Segment &segment, timeT time)
+{
+ // Find out whether we're in an ottava section.
+
+ int ottavaShift = 0;
+
+ for (Segment::iterator i = segment.findTime(time); ; --i) {
+
+ if (!segment.isBeforeEndMarker(i)) {
+ break;
+ }
+
+ if ((*i)->isa(Indication::EventType)) {
+ try {
+ Indication ind(**i);
+ if (ind.isOttavaType()) {
+ timeT endTime =
+ (*i)->getNotationAbsoluteTime() +
+ (*i)->getNotationDuration();
+ if (time < endTime) {
+ ottavaShift = ind.getOttavaShift();
+ }
+ break;
+ }
+ } catch (...) { }
+ }
+
+ if (i == segment.begin()) {
+ break;
+ }
+ }
+
+ return ottavaShift;
+}
+
+Event *
+NoteInserter::doAddCommand(Segment &segment, timeT time, timeT endTime,
+ const Note &note, int pitch, Accidental accidental)
+{
+ timeT noteEnd = time + note.getDuration();
+
+ // #1046934: make it possible to insert triplet at end of segment!
+ if (m_nParentView->isInTripletMode()) {
+ noteEnd = time + (note.getDuration() * 2 / 3);
+ }
+
+ if (time < segment.getStartTime() ||
+ endTime > segment.getEndMarkerTime() ||
+ noteEnd > segment.getEndMarkerTime()) {
+ return 0;
+ }
+
+ pitch += getOttavaShift(segment, time) * 12;
+
+ float targetSubordering = 0;
+ if (m_nParentView->isInGraceMode()) {
+ targetSubordering = m_targetSubordering;
+ }
+
+ NoteInsertionCommand *insertionCommand =
+ new NoteInsertionCommand
+ (segment, time, endTime, note, pitch, accidental,
+ (m_autoBeam && !m_nParentView->isInTripletMode() && !m_nParentView->isInGraceMode()) ?
+ NoteInsertionCommand::AutoBeamOn : NoteInsertionCommand::AutoBeamOff,
+ m_matrixInsertType && !m_nParentView->isInGraceMode() ?
+ NoteInsertionCommand::MatrixModeOn : NoteInsertionCommand::MatrixModeOff,
+ m_nParentView->isInGraceMode() ?
+ (m_nParentView->isInTripletMode() ?
+ NoteInsertionCommand::GraceAndTripletModesOn :
+ NoteInsertionCommand::GraceModeOn)
+ : NoteInsertionCommand::GraceModeOff,
+ targetSubordering,
+ m_defaultStyle);
+
+ KCommand *activeCommand = insertionCommand;
+
+ if (m_nParentView->isInTripletMode() && !m_nParentView->isInGraceMode()) {
+ Segment::iterator i(segment.findTime(time));
+ if (i != segment.end() &&
+ !(*i)->has(BaseProperties::BEAMED_GROUP_TUPLET_BASE)) {
+
+ KMacroCommand *command = new KMacroCommand(insertionCommand->name());
+
+ //## Attempted fix to bug reported on rg-user by SlowPic
+ //## <[email protected]> 28/02/2005 22:32:56 UTC: Triplet input error
+ //# HJJ: Comment out this attempt. It breaks the splitting of
+ //# the first bars into rests.
+ //## if ((*i)->isa(Note::EventRestType) &&
+ //## (*i)->getNotationDuration() > (note.getDuration() * 3)) {
+ // split the rest
+ command->addCommand(new RestInsertionCommand
+ (segment, time,
+ time + note.getDuration() * 2,
+ Note::getNearestNote(note.getDuration() * 2)));
+ //## }
+ //# These comments should probably be deleted.
+
+ command->addCommand(new TupletCommand
+ (segment, time, note.getDuration(),
+ 3, 2, true)); // #1046934: "has timing already"
+ command->addCommand(insertionCommand);
+ activeCommand = command;
+ }
+ }
+
+ m_nParentView->addCommandToHistory(activeCommand);
+
+ NOTATION_DEBUG << "NoteInserter::doAddCommand: accidental is "
+ << accidental << endl;
+
+ return insertionCommand->getLastInsertedEvent();
+}
+
+void NoteInserter::slotSetNote(Note::Type nt)
+{
+ m_noteType = nt;
+}
+
+void NoteInserter::slotSetDots(unsigned int dots)
+{
+ m_noteDots = dots;
+
+ KToggleAction *dotsAction = dynamic_cast<KToggleAction *>
+ (actionCollection()->action("toggle_dot"));
+ if (dotsAction)
+ dotsAction->setChecked(dots > 0);
+}
+
+void NoteInserter::slotSetAccidental(Accidental accidental,
+ bool follow)
+{
+ NOTATION_DEBUG << "NoteInserter::setAccidental: accidental is "
+ << accidental << endl;
+ m_accidental = accidental;
+ m_followAccidental = follow;
+}
+
+void NoteInserter::slotNoAccidental()
+{
+ m_parentView->actionCollection()->action("no_accidental")->activate();
+}
+
+void NoteInserter::slotFollowAccidental()
+{
+ m_parentView->actionCollection()->action("follow_accidental")->activate();
+}
+
+void NoteInserter::slotSharp()
+{
+ m_parentView->actionCollection()->action("sharp_accidental")->activate();
+}
+
+void NoteInserter::slotFlat()
+{
+ m_parentView->actionCollection()->action("flat_accidental")->activate();
+}
+
+void NoteInserter::slotNatural()
+{
+ m_parentView->actionCollection()->action("natural_accidental")->activate();
+}
+
+void NoteInserter::slotDoubleSharp()
+{
+ m_parentView->actionCollection()->action("double_sharp_accidental")->activate();
+}
+
+void NoteInserter::slotDoubleFlat()
+{
+ m_parentView->actionCollection()->action("double_flat_accidental")->activate();
+}
+
+void NoteInserter::slotToggleDot()
+{
+ m_noteDots = (m_noteDots) ? 0 : 1;
+ Note note(m_noteType, m_noteDots);
+ QString actionName(NotationStrings::getReferenceName(note));
+ actionName.replace(QRegExp("-"), "_");
+ KAction *action = m_parentView->actionCollection()->action(actionName);
+ if (!action) {
+ std::cerr << "WARNING: No such action as " << actionName << std::endl;
+ } else {
+ action->activate();
+ }
+}
+
+void NoteInserter::slotToggleAutoBeam()
+{
+ m_autoBeam = !m_autoBeam;
+}
+
+void NoteInserter::slotEraseSelected()
+{
+ m_parentView->actionCollection()->action("erase")->activate();
+}
+
+void NoteInserter::slotSelectSelected()
+{
+ m_parentView->actionCollection()->action("select")->activate();
+}
+
+void NoteInserter::slotRestsSelected()
+{
+ Note note(m_noteType, m_noteDots);
+ QString actionName(NotationStrings::getReferenceName(note, true));
+ actionName.replace(QRegExp("-"), "_");
+ KAction *action = m_parentView->actionCollection()->action(actionName);
+ if (!action) {
+ std::cerr << "WARNING: No such action as " << actionName << std::endl;
+ } else {
+ action->activate();
+ }
+}
+
+const char* NoteInserter::m_actionsAccidental[][4] =
+{
+ { "No accidental", "1slotNoAccidental()", "no_accidental",
+ "accidental-none" },
+ { "Follow accidental", "1slotFollowAccidental()", "follow_accidental",
+ "accidental-follow" },
+ { "Sharp", "1slotSharp()", "sharp_accidental",
+ "accidental-sharp" },
+ { "Flat", "1slotFlat()", "flat_accidental",
+ "accidental-flat" },
+ { "Natural", "1slotNatural()", "natural_accidental",
+ "accidental-natural" },
+ { "Double sharp", "1slotDoubleSharp()", "double_sharp_accidental",
+ "accidental-doublesharp" },
+ { "Double flat", "1slotDoubleFlat()", "double_flat_accidental",
+ "accidental-doubleflat" }
+};
+
+const QString NoteInserter::ToolName = "noteinserter";
+
+}
+#include "NoteInserter.moc"
diff --git a/src/gui/editors/notation/NoteInserter.h b/src/gui/editors/notation/NoteInserter.h
new file mode 100644
index 0000000..cb46b38
--- /dev/null
+++ b/src/gui/editors/notation/NoteInserter.h
@@ -0,0 +1,166 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_NOTEINSERTER_H_
+#define _RG_NOTEINSERTER_H_
+
+#include "base/NotationTypes.h"
+#include "NotationTool.h"
+#include "NotationElement.h"
+#include "NoteStyle.h"
+#include <qstring.h>
+#include "base/Event.h"
+
+
+class QMouseEvent;
+
+
+namespace Rosegarden
+{
+
+class ViewElement;
+class Segment;
+class NotationView;
+class Event;
+
+
+/**
+ * This tool will insert notes on mouse click events
+ */
+class NoteInserter : public NotationTool
+{
+ Q_OBJECT
+
+ friend class NotationToolBox;
+
+public:
+ ~NoteInserter();
+
+ virtual void handleLeftButtonPress(timeT,
+ int height,
+ int staffNo,
+ QMouseEvent*,
+ ViewElement* el);
+
+ virtual int handleMouseMove(timeT time,
+ int height,
+ QMouseEvent*);
+
+ virtual void handleMouseRelease(timeT time,
+ int height,
+ QMouseEvent*);
+
+ virtual void ready();
+
+ Note getCurrentNote() {
+ return Note(m_noteType, m_noteDots);
+ }
+
+ /// Insert a note as if the user has clicked at the given time & pitch
+ void insertNote(Segment &segment,
+ timeT insertionTime,
+ int pitch,
+ Accidental accidental,
+ bool suppressPreview = false);
+
+ static const QString ToolName;
+
+public slots:
+ /// Set the type of note (quaver, breve...) which will be inserted
+ void slotSetNote(Note::Type);
+
+ /// Set the nb of dots the inserted note will have
+ void slotSetDots(unsigned int dots);
+
+ /// Set the accidental for the notes which will be inserted
+ void slotSetAccidental(Accidental, bool follow);
+
+protected:
+ NoteInserter(NotationView*);
+
+ /// this ctor is used by RestInserter
+ NoteInserter(const QString& menuName, NotationView*);
+
+ timeT getOffsetWithinRest(int staffNo,
+ const NotationElementList::iterator&,
+ double &canvasX);
+
+ int getOttavaShift(Segment &segment, timeT time);
+
+ virtual Event *doAddCommand(Segment &,
+ timeT time,
+ timeT endTime,
+ const Note &,
+ int pitch, Accidental);
+
+ virtual bool computeLocationAndPreview(QMouseEvent *e);
+ virtual void showPreview();
+ virtual void clearPreview();
+
+protected slots:
+ // RMB menu slots
+ void slotNoAccidental();
+ void slotFollowAccidental();
+ void slotSharp();
+ void slotFlat();
+ void slotNatural();
+ void slotDoubleSharp();
+ void slotDoubleFlat();
+ void slotToggleDot();
+ void slotToggleAutoBeam();
+
+ void slotEraseSelected();
+ void slotSelectSelected();
+ void slotRestsSelected();
+
+protected:
+ //--------------- Data members ---------------------------------
+
+ Note::Type m_noteType;
+ unsigned int m_noteDots;
+ bool m_autoBeam;
+ bool m_matrixInsertType;
+ NoteStyleName m_defaultStyle;
+
+ bool m_clickHappened;
+ timeT m_clickTime;
+ int m_clickSubordering;
+ int m_clickPitch;
+ int m_clickHeight;
+ int m_clickStaffNo;
+ double m_clickInsertX;
+ float m_targetSubordering;
+
+ Accidental m_accidental;
+ Accidental m_lastAccidental;
+ bool m_followAccidental;
+
+ static const char* m_actionsAccidental[][4];
+};
+
+
+}
+
+#endif
diff --git a/src/gui/editors/notation/NotePixmapFactory.cpp b/src/gui/editors/notation/NotePixmapFactory.cpp
new file mode 100644
index 0000000..c2a99ee
--- /dev/null
+++ b/src/gui/editors/notation/NotePixmapFactory.cpp
@@ -0,0 +1,3689 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include <cmath>
+#include "NotePixmapFactory.h"
+#include "misc/Debug.h"
+#include "base/NotationRules.h"
+#include <kapplication.h>
+
+#include <klocale.h>
+#include <kstddirs.h>
+#include <kconfig.h>
+#include "misc/Strings.h"
+#include "document/ConfigGroups.h"
+#include "base/Exception.h"
+#include "base/NotationTypes.h"
+#include "base/Profiler.h"
+#include "gui/editors/guitar/Fingering.h"
+#include "gui/editors/guitar/FingeringBox.h"
+#include "gui/editors/guitar/NoteSymbols.h"
+#include "gui/editors/notation/TrackHeader.h"
+#include "gui/general/GUIPalette.h"
+#include "gui/general/PixmapFunctions.h"
+#include "gui/general/Spline.h"
+#include "gui/kdeext/KStartupLogo.h"
+#include "NotationStrings.h"
+#include "NotationView.h"
+#include "NoteCharacter.h"
+#include "NoteCharacterNames.h"
+#include "NoteFontFactory.h"
+#include "NoteFont.h"
+#include "NotePixmapParameters.h"
+#include "NotePixmapPainter.h"
+#include "NoteStyleFactory.h"
+#include "NoteStyle.h"
+#include <kglobal.h>
+#include <kmessagebox.h>
+#include <qbitmap.h>
+#include <qcolor.h>
+#include <qfile.h>
+#include <qfont.h>
+#include <qfontmetrics.h>
+#include <qimage.h>
+#include <qpainter.h>
+#include <qpen.h>
+#include <qpixmap.h>
+#include <qpointarray.h>
+#include <qpoint.h>
+#include <qrect.h>
+#include <qstring.h>
+#include <qwmatrix.h>
+
+
+namespace Rosegarden
+{
+
+using namespace Accidentals;
+
+static clock_t drawBeamsTime = 0;
+static clock_t makeNotesTime = 0;
+static int drawBeamsCount = 0;
+static int drawBeamsBeamCount = 0;
+
+class NotePixmapCache : public std::map<CharName, QCanvasPixmap*>
+{
+ // nothing to add -- just so we can predeclare it in the header
+};
+
+const char* const NotePixmapFactory::defaultSerifFontFamily = "Bitstream Vera Serif";
+const char* const NotePixmapFactory::defaultSansSerifFontFamily = "Bitstream Vera Sans";
+const char* const NotePixmapFactory::defaultTimeSigFontFamily = "Bitstream Vera Serif";
+
+NotePixmapFactory::NotePixmapFactory(std::string fontName, int size) :
+ m_selected(false),
+ m_shaded(false),
+ m_tupletCountFont(defaultSerifFontFamily, 8, QFont::Bold),
+ m_tupletCountFontMetrics(m_tupletCountFont),
+ m_textMarkFont(defaultSerifFontFamily, 8, QFont::Bold, true),
+ m_textMarkFontMetrics(m_textMarkFont),
+ m_fingeringFont(defaultSerifFontFamily, 8, QFont::Bold),
+ m_fingeringFontMetrics(m_fingeringFont),
+ m_timeSigFont(defaultTimeSigFontFamily, 8, QFont::Bold),
+ m_timeSigFontMetrics(m_timeSigFont),
+ m_bigTimeSigFont(defaultTimeSigFontFamily, 12, QFont::Normal),
+ m_bigTimeSigFontMetrics(m_bigTimeSigFont),
+ m_ottavaFont(defaultSerifFontFamily, 8, QFont::Normal, true),
+ m_ottavaFontMetrics(m_ottavaFont),
+ m_clefOttavaFont(defaultSerifFontFamily, 8, QFont::Normal),
+ m_clefOttavaFontMetrics(m_ottavaFont),
+ m_trackHeaderFont(defaultSansSerifFontFamily, 10, QFont::Normal),
+ m_trackHeaderFontMetrics(m_trackHeaderFont),
+ m_trackHeaderBoldFont(defaultSansSerifFontFamily, 10, QFont::Bold),
+ m_trackHeaderBoldFontMetrics(m_trackHeaderBoldFont),
+ m_generatedPixmap(0),
+ m_generatedMask(0),
+ m_generatedWidth( -1),
+ m_generatedHeight( -1),
+ m_inPrinterMethod(false),
+ m_p(new NotePixmapPainter()),
+ m_dottedRestCache(new NotePixmapCache)
+{
+ init(fontName, size);
+}
+
+NotePixmapFactory::NotePixmapFactory(const NotePixmapFactory &npf) :
+ m_selected(false),
+ m_shaded(false),
+ m_tupletCountFont(npf.m_tupletCountFont),
+ m_tupletCountFontMetrics(m_tupletCountFont),
+ m_textMarkFont(npf.m_textMarkFont),
+ m_textMarkFontMetrics(m_textMarkFont),
+ m_fingeringFont(npf.m_fingeringFont),
+ m_fingeringFontMetrics(m_fingeringFont),
+ m_timeSigFont(npf.m_timeSigFont),
+ m_timeSigFontMetrics(m_timeSigFont),
+ m_bigTimeSigFont(npf.m_bigTimeSigFont),
+ m_bigTimeSigFontMetrics(m_bigTimeSigFont),
+ m_ottavaFont(defaultSerifFontFamily, 8, QFont::Normal, true),
+ m_ottavaFontMetrics(m_ottavaFont),
+ m_clefOttavaFont(defaultSerifFontFamily, 8, QFont::Normal),
+ m_clefOttavaFontMetrics(m_ottavaFont),
+ m_trackHeaderFont(defaultSansSerifFontFamily, 10, QFont::Normal),
+ m_trackHeaderFontMetrics(m_trackHeaderFont),
+ m_trackHeaderBoldFont(defaultSansSerifFontFamily, 10, QFont::Bold),
+ m_trackHeaderBoldFontMetrics(m_trackHeaderBoldFont),
+ m_generatedPixmap(0),
+ m_generatedMask(0),
+ m_generatedWidth( -1),
+ m_generatedHeight( -1),
+ m_inPrinterMethod(false),
+ m_p(new NotePixmapPainter()),
+ m_dottedRestCache(new NotePixmapCache)
+{
+ init(npf.m_font->getName(), npf.m_font->getSize());
+}
+
+NotePixmapFactory &
+NotePixmapFactory::operator=(const NotePixmapFactory &npf)
+{
+ if (&npf != this) {
+ m_selected = npf.m_selected;
+ m_shaded = npf.m_shaded;
+ m_timeSigFont = npf.m_timeSigFont;
+ m_timeSigFontMetrics = QFontMetrics(m_timeSigFont);
+ m_bigTimeSigFont = npf.m_bigTimeSigFont;
+ m_bigTimeSigFontMetrics = QFontMetrics(m_bigTimeSigFont);
+ m_tupletCountFont = npf.m_tupletCountFont;
+ m_tupletCountFontMetrics = QFontMetrics(m_tupletCountFont);
+ m_textMarkFont = npf.m_textMarkFont;
+ m_textMarkFontMetrics = QFontMetrics(m_textMarkFont);
+ m_fingeringFont = npf.m_fingeringFont;
+ m_fingeringFontMetrics = QFontMetrics(m_fingeringFont);
+ m_ottavaFont = npf.m_ottavaFont;
+ m_ottavaFontMetrics = QFontMetrics(m_ottavaFont);
+ m_clefOttavaFont = npf.m_clefOttavaFont;
+ m_clefOttavaFontMetrics = QFontMetrics(m_clefOttavaFont);
+ m_trackHeaderFont = npf.m_trackHeaderFont;
+ m_trackHeaderFontMetrics = QFontMetrics(m_trackHeaderFont);
+ m_trackHeaderBoldFont = npf.m_trackHeaderBoldFont;
+ m_trackHeaderBoldFontMetrics = QFontMetrics(m_trackHeaderBoldFont);
+ init(npf.m_font->getName(), npf.m_font->getSize());
+ m_dottedRestCache->clear();
+ m_textFontCache.clear();
+ }
+ return *this;
+}
+
+void
+NotePixmapFactory::init(std::string fontName, int size)
+{
+ try {
+ m_style = NoteStyleFactory::getStyle(NoteStyleFactory::DefaultStyle);
+ } catch (NoteStyleFactory::StyleUnavailable u) {
+ KStartupLogo::hideIfStillThere();
+ KMessageBox::error(0, i18n(strtoqstr(u.getMessage())));
+ throw;
+ }
+
+ int origSize = size;
+
+ if (fontName != "") {
+ try {
+ if (size < 0)
+ size = NoteFontFactory::getDefaultSize(fontName);
+ m_font = NoteFontFactory::getFont(fontName, size);
+ } catch (Exception f) {
+ fontName = "";
+ // fall through
+ }
+ }
+
+ if (fontName == "") { // either because it was passed in or because read failed
+ try {
+ fontName = NoteFontFactory::getDefaultFontName();
+ size = origSize;
+ if (size < 0)
+ size = NoteFontFactory::getDefaultSize(fontName);
+ m_font = NoteFontFactory::getFont(fontName, size);
+ } catch (Exception f) { // already reported
+ throw;
+ }
+ }
+
+ // Resize the fonts, because the original constructor used point
+ // sizes only and we want pixels
+ QFont timeSigFont(defaultTimeSigFontFamily),
+ textFont(defaultSerifFontFamily);
+ KConfig* config = kapp->config();
+ config->setGroup(NotationViewConfigGroup);
+
+ m_timeSigFont = config->readFontEntry("timesigfont", &timeSigFont);
+ m_timeSigFont.setBold(true);
+ m_timeSigFont.setPixelSize(size * 5 / 2);
+ m_timeSigFontMetrics = QFontMetrics(m_timeSigFont);
+
+ m_bigTimeSigFont = config->readFontEntry("timesigfont", &timeSigFont);
+ m_bigTimeSigFont.setPixelSize(size * 4 + 2);
+ m_bigTimeSigFontMetrics = QFontMetrics(m_bigTimeSigFont);
+
+ m_tupletCountFont = config->readFontEntry("textfont", &textFont);
+ m_tupletCountFont.setBold(true);
+ m_tupletCountFont.setPixelSize(size * 2);
+ m_tupletCountFontMetrics = QFontMetrics(m_tupletCountFont);
+
+ m_textMarkFont = config->readFontEntry("textfont", &textFont);
+ m_textMarkFont.setBold(true);
+ m_textMarkFont.setItalic(true);
+ m_textMarkFont.setPixelSize(size * 2);
+ m_textMarkFontMetrics = QFontMetrics(m_textMarkFont);
+
+ m_fingeringFont = config->readFontEntry("textfont", &textFont);
+ m_fingeringFont.setBold(true);
+ m_fingeringFont.setPixelSize(size * 5 / 3);
+ m_fingeringFontMetrics = QFontMetrics(m_fingeringFont);
+
+ m_ottavaFont = config->readFontEntry("textfont", &textFont);
+ m_ottavaFont.setPixelSize(size * 2);
+ m_ottavaFontMetrics = QFontMetrics(m_ottavaFont);
+
+ m_clefOttavaFont = config->readFontEntry("textfont", &textFont);
+ m_clefOttavaFont.setPixelSize(getLineSpacing() * 3 / 2);
+ m_clefOttavaFontMetrics = QFontMetrics(m_clefOttavaFont);
+
+ m_trackHeaderFont = config->readFontEntry("sansfont", &m_trackHeaderFont);
+ m_trackHeaderFont.setPixelSize(12);
+ m_trackHeaderFontMetrics = QFontMetrics(m_trackHeaderFont);
+
+ m_trackHeaderBoldFont = m_trackHeaderFont;
+ m_trackHeaderBoldFont.setBold(true);
+ m_trackHeaderBoldFontMetrics = QFontMetrics(m_trackHeaderBoldFont);
+}
+
+NotePixmapFactory::~NotePixmapFactory()
+{
+ delete m_p;
+ delete m_dottedRestCache;
+}
+
+std::string
+NotePixmapFactory::getFontName() const
+{
+ return m_font->getName();
+}
+
+int
+NotePixmapFactory::getSize() const
+{
+ return m_font->getSize();
+}
+
+QPixmap
+NotePixmapFactory::toQPixmap(QCanvasPixmap* cp)
+{
+ QPixmap p = *cp;
+ delete cp;
+ return p;
+}
+
+void
+NotePixmapFactory::dumpStats(std::ostream &s)
+{
+#ifdef DUMP_STATS
+ s << "NotePixmapFactory: total times since last stats dump:\n"
+ << "makeNotePixmap: "
+ << (makeNotesTime * 1000 / CLOCKS_PER_SEC) << "ms\n"
+ << "drawBeams: "
+ << (drawBeamsTime * 1000 / CLOCKS_PER_SEC) << "ms"
+ << " (drew " << drawBeamsCount << " individual points in " << drawBeamsBeamCount << " beams)"
+ << endl;
+ makeNotesTime = 0;
+ drawBeamsTime = 0;
+ drawBeamsCount = 0;
+ drawBeamsBeamCount = 0;
+#endif
+
+ (void)s; // avoid warnings
+}
+
+QCanvasPixmap*
+NotePixmapFactory::makeNotePixmap(const NotePixmapParameters &params)
+{
+ Profiler profiler("NotePixmapFactory::makeNotePixmap");
+ clock_t startTime = clock();
+
+ drawNoteAux(params, 0, 0, 0);
+
+ QPoint hotspot(m_left, m_above + m_noteBodyHeight / 2);
+
+ //#define ROSE_DEBUG_NOTE_PIXMAP_FACTORY
+#ifdef ROSE_DEBUG_NOTE_PIXMAP_FACTORY
+
+ m_p->painter().setPen(Qt::red);
+ m_p->painter().setBrush(Qt::red);
+
+ m_p->drawLine(0, 0, 0, m_generatedHeight - 1);
+ m_p->drawLine(m_generatedWidth - 1, 0,
+ m_generatedWidth - 1,
+ m_generatedHeight - 1);
+
+ {
+ int hsx = hotspot.x();
+ int hsy = hotspot.y();
+ m_p->drawLine(hsx - 2, hsy - 2, hsx + 2, hsy + 2);
+ m_p->drawLine(hsx - 2, hsy + 2, hsx + 2, hsy - 2);
+ }
+#endif
+
+ clock_t endTime = clock();
+ makeNotesTime += (endTime - startTime);
+
+ return makeCanvasPixmap(hotspot);
+}
+
+void
+NotePixmapFactory::drawNote(const NotePixmapParameters &params,
+ QPainter &painter, int x, int y)
+{
+ Profiler profiler("NotePixmapFactory::drawNote");
+ m_inPrinterMethod = true;
+ drawNoteAux(params, &painter, x, y);
+ m_inPrinterMethod = false;
+}
+
+void
+NotePixmapFactory::drawNoteAux(const NotePixmapParameters &params,
+ QPainter *painter, int x, int y)
+{
+ NoteFont::CharacterType charType = m_inPrinterMethod ? NoteFont::Printer : NoteFont::Screen;
+
+ bool drawFlag = params.m_drawFlag;
+
+ if (params.m_beamed)
+ drawFlag = false;
+
+ // A note pixmap is formed of note head, stem, flags,
+ // accidentals, dots and beams. Assume the note head first, then
+ // do the rest of the calculations left to right, ie accidentals,
+ // stem, flags, dots, beams
+
+ m_noteBodyWidth = getNoteBodyWidth(params.m_noteType);
+ m_noteBodyHeight = getNoteBodyHeight(params.m_noteType);
+
+ // Spacing surrounding the note head. For top and bottom, we
+ // adjust this according to the discrepancy between the nominal
+ // and actual heights of the note head pixmap. For left and
+ // right, we use the hotspot x coordinate of the head.
+ int temp;
+ if (!m_font->getHotspot(m_style->getNoteHeadCharName(params.m_noteType).first,
+ m_borderX, temp))
+ m_borderX = 0;
+
+ if (params.m_noteType == Note::Minim && params.m_stemGoesUp)
+ m_borderX++;
+ int actualNoteBodyHeight =
+ m_font->getHeight(m_style->getNoteHeadCharName(params.m_noteType).first);
+
+ m_left = m_right = m_borderX;
+ m_above = m_borderY = (actualNoteBodyHeight - m_noteBodyHeight) / 2;
+ m_below = (actualNoteBodyHeight - m_noteBodyHeight) - m_above;
+
+ // NOTATION_DEBUG << "actualNoteBodyHeight: " << actualNoteBodyHeight
+ // << ", noteBodyHeight: " << m_noteBodyHeight << ", borderX: "
+ // << m_borderX << ", borderY: "
+ // << m_borderY << endl;
+
+ bool isStemmed = m_style->hasStem(params.m_noteType);
+ int flagCount = m_style->getFlagCount(params.m_noteType);
+ int slashCount = params.m_slashes;
+ if (!slashCount)
+ slashCount = m_style->getSlashCount(params.m_noteType);
+
+ if (params.m_accidental != NoAccidental) {
+ makeRoomForAccidental(params.m_accidental,
+ params.m_cautionary,
+ params.m_accidentalShift,
+ params.m_accidentalExtra);
+ }
+
+ NoteCharacter dot(getCharacter(NoteCharacterNames::DOT, PlainColour, charType));
+ int dotWidth = dot.getWidth();
+ if (dotWidth < getNoteBodyWidth() / 2)
+ dotWidth = getNoteBodyWidth() / 2;
+
+ int stemLength = getStemLength(params);
+
+ if (params.m_marks.size() > 0) {
+ makeRoomForMarks(isStemmed, params, stemLength);
+ }
+
+ if (params.m_legerLines != 0) {
+ makeRoomForLegerLines(params);
+ }
+
+ if (slashCount > 0) {
+ m_left = std::max(m_left, m_noteBodyWidth / 2);
+ m_right = std::max(m_right, m_noteBodyWidth / 2);
+ }
+
+ if (params.m_tupletCount > 0) {
+ makeRoomForTuplingLine(params);
+ }
+
+ m_right = std::max(m_right, params.m_dots * dotWidth + dotWidth / 2);
+ if (params.m_dotShifted) {
+ m_right += m_noteBodyWidth;
+ }
+ if (params.m_onLine) {
+ m_above = std::max(m_above, dot.getHeight() / 2);
+ }
+
+ if (params.m_shifted) {
+ if (params.m_stemGoesUp) {
+ m_right += m_noteBodyWidth;
+ } else {
+ m_left = std::max(m_left, m_noteBodyWidth);
+ }
+ }
+
+ bool tieAbove = params.m_tieAbove;
+ if (!params.m_tiePositionExplicit) {
+ tieAbove = !params.m_stemGoesUp;
+ }
+
+ if (params.m_tied) {
+ m_right = std::max(m_right, params.m_tieLength);
+ if (!tieAbove) {
+ m_below = std::max(m_below, m_noteBodyHeight * 2);
+ } else {
+ m_above = std::max(m_above, m_noteBodyHeight * 2);
+ }
+ }
+
+ QPoint startPoint, endPoint;
+ if (isStemmed && params.m_drawStem) {
+ makeRoomForStemAndFlags(drawFlag ? flagCount : 0, stemLength, params,
+ startPoint, endPoint);
+ }
+
+ if (isStemmed && params.m_drawStem && params.m_beamed) {
+ makeRoomForBeams(params);
+ }
+
+ // for all other calculations we use the nominal note-body height
+ // (same as the gap between staff lines), but here we want to know
+ // if the pixmap itself is taller than that
+ /*!!!
+ int actualNoteBodyHeight = m_font->getHeight
+ (m_style->getNoteHeadCharName(params.m_noteType).first);
+ // - 2*m_origin.y();
+ if (actualNoteBodyHeight > m_noteBodyHeight) {
+ m_below = std::max(m_below, actualNoteBodyHeight - m_noteBodyHeight);
+ }
+ */
+ if (painter) {
+ painter->save();
+ m_p->beginExternal(painter);
+ // NOTATION_DEBUG << "Translate: (" << x << "," << y << ")" << endl;
+ painter->translate(x - m_left, y - m_above - m_noteBodyHeight / 2);
+ } else {
+ createPixmapAndMask(m_noteBodyWidth + m_left + m_right,
+ m_noteBodyHeight + m_above + m_below);
+ }
+
+ if (params.m_tupletCount > 0) {
+ drawTuplingLine(params);
+ }
+
+ if (isStemmed && params.m_drawStem && drawFlag) {
+ drawFlags(flagCount, params, startPoint, endPoint);
+ }
+
+ if (params.m_accidental != NoAccidental) {
+ drawAccidental(params.m_accidental, params.m_cautionary);
+ }
+
+ NoteStyle::CharNameRec charNameRec
+ (m_style->getNoteHeadCharName(params.m_noteType));
+ CharName charName = charNameRec.first;
+ bool inverted = charNameRec.second;
+ NoteCharacter body = getCharacter
+ (charName,
+ params.m_highlighted ? HighlightedColour :
+ params.m_quantized ? QuantizedColour :
+ params.m_trigger ? TriggerColour :
+ params.m_inRange ? PlainColour : OutRangeColour,
+ inverted);
+
+ QPoint bodyLocation(m_left - m_borderX,
+ m_above - m_borderY + getStaffLineThickness() / 2);
+ if (params.m_shifted) {
+ if (params.m_stemGoesUp) {
+ bodyLocation.rx() += m_noteBodyWidth;
+ } else {
+ bodyLocation.rx() -= m_noteBodyWidth - 1;
+ }
+ }
+
+ m_p->drawNoteCharacter(bodyLocation.x(), bodyLocation.y(), body);
+
+ if (params.m_dots > 0) {
+
+ int x = m_left + m_noteBodyWidth + dotWidth / 2;
+ int y = m_above + m_noteBodyHeight / 2 - dot.getHeight() / 2;
+
+ if (params.m_onLine)
+ y -= m_noteBodyHeight / 2;
+
+ if (params.m_shifted)
+ x += m_noteBodyWidth;
+ else if (params.m_dotShifted)
+ x += m_noteBodyWidth;
+
+ for (int i = 0; i < params.m_dots; ++i) {
+ m_p->drawNoteCharacter(x, y, dot);
+ x += dotWidth;
+ }
+ }
+
+ if (isStemmed && params.m_drawStem) {
+
+ if (flagCount > 0 && !drawFlag && params.m_beamed) {
+ drawBeams(endPoint, params, flagCount);
+ }
+
+ if (slashCount > 0) {
+ drawSlashes(startPoint, params, slashCount);
+ }
+
+ if (m_selected)
+ m_p->painter().setPen(GUIPalette::getColour(GUIPalette::SelectedElement));
+ else
+ m_p->painter().setPen(Qt::black);
+
+ // If we draw stems after beams, instead of beams after stems,
+ // beam anti-aliasing won't damage stems but we have to shorten the
+ // stems slightly first so that the stems don't extend all the way
+ // through the beam into the anti-aliased region on the
+ // other side of the beam that faces away from the note-heads.
+ int shortening;
+ if (flagCount > 0 && !drawFlag && params.m_beamed)
+ shortening = 2;
+ else
+ shortening = 0;
+ drawStem(params, startPoint, endPoint, shortening);
+ }
+
+ if (params.m_marks.size() > 0) {
+ drawMarks(isStemmed, params, stemLength);
+ }
+
+ if (params.m_legerLines != 0) {
+ drawLegerLines(params);
+ }
+
+ if (params.m_tied) {
+ drawTie(tieAbove, params.m_tieLength, dotWidth * params.m_dots);
+ }
+
+ if (painter) {
+ painter->restore();
+ }
+}
+
+
+QCanvasPixmap*
+NotePixmapFactory::makeNoteHaloPixmap(const NotePixmapParameters &params)
+{
+ int nbh0 = getNoteBodyHeight();
+ int nbh = getNoteBodyHeight(params.m_noteType);
+ int nbw0 = getNoteBodyHeight();
+ int nbw = getNoteBodyWidth(params.m_noteType);
+
+ createPixmapAndMask(nbw + nbw0, nbh + nbh0);
+ drawNoteHalo(0, 0, nbw + nbw0, nbh + nbh0);
+
+ return makeCanvasPixmap(QPoint(nbw0 / 2, nbh0));
+}
+
+
+void
+NotePixmapFactory::drawNoteHalo(int x, int y, int w, int h) {
+
+ m_p->painter().setPen(QPen(QColor(GUIPalette::CollisionHaloHue,
+ GUIPalette::CollisionHaloSaturation,
+ 255, QColor::Hsv), 1));
+ m_p->painter().setBrush(QColor(GUIPalette::CollisionHaloHue,
+ GUIPalette::CollisionHaloSaturation,
+ 255, QColor::Hsv));
+ m_p->drawEllipse(x, y, w, h);
+}
+
+
+
+int
+NotePixmapFactory::getStemLength(const NotePixmapParameters &params) const
+{
+ if (params.m_beamed && params.m_stemLength >= 0) {
+ return params.m_stemLength;
+ }
+
+ int stemLength = getStemLength();
+
+ int flagCount = m_style->getFlagCount(params.m_noteType);
+ int slashCount = params.m_slashes;
+ bool stemUp = params.m_stemGoesUp;
+ int nbh = m_noteBodyHeight;
+
+ if (flagCount > 2) {
+ stemLength += getLineSpacing() * (flagCount - 2);
+ }
+
+ int width = 0, height = 0;
+
+ if (flagCount > 0) {
+
+ if (!stemUp)
+ stemLength += nbh / 2;
+
+ if (m_font->getDimensions(m_style->getFlagCharName(flagCount),
+ width, height)) {
+
+ stemLength = std::max(stemLength, height);
+
+ } else if (m_font->getDimensions(m_style->getPartialFlagCharName(true),
+ width, height) ||
+ m_font->getDimensions(m_style->getPartialFlagCharName(false),
+ width, height)) {
+
+ unsigned int flagSpace = m_noteBodyHeight;
+ (void)m_font->getFlagSpacing(flagSpace);
+
+ stemLength = std::max(stemLength,
+ height + (flagCount - 1) * (int)flagSpace);
+ }
+ }
+
+ if (slashCount > 3 && flagCount < 3) {
+ stemLength += (slashCount - 3) * (nbh / 2);
+ }
+
+ if (params.m_stemLength >= 0) {
+ if (flagCount == 0)
+ return params.m_stemLength;
+ stemLength = std::max(stemLength, params.m_stemLength);
+ }
+
+ return stemLength;
+}
+
+void
+NotePixmapFactory::makeRoomForAccidental(Accidental a,
+ bool cautionary, int shift, bool extra)
+{
+ // General observation: where we're only using a character to
+ // determine its dimensions, we should (for the moment) just
+ // request it in screen mode, because it may be quicker and we
+ // don't need to render it, and the dimensions are the same.
+ NoteCharacter ac
+ (m_font->getCharacter(m_style->getAccidentalCharName(a)));
+
+ QPoint ah(m_font->getHotspot(m_style->getAccidentalCharName(a)));
+
+ m_left += ac.getWidth() + (m_noteBodyWidth / 4 - m_borderX);
+
+ if (shift > 0) {
+ if (extra) {
+ // The extra flag indicates that the first shift is to get
+ // out of the way of a note head, thus has to move
+ // possibly further, or at least a different amount. So
+ // replace the first shift with a different one.
+ --shift;
+ m_left += m_noteBodyWidth - m_noteBodyWidth / 5;
+ }
+ if (shift > 0) {
+ // The amount we shift for each accidental is the greater
+ // of the probable shift for that accidental and the
+ // probable shift for a sharp, on the assumption (usually
+ // true in classical notation) that the sharp is the
+ // widest accidental and that we may have other
+ // accidentals possibly including sharps on other notes in
+ // this chord that we can't know about here.
+ int step = ac.getWidth() - ah.x();
+ if (a != Accidentals::Sharp) {
+ NoteCharacter acSharp
+ (m_font->getCharacter(m_style->getAccidentalCharName
+ (Accidentals::Sharp)));
+ QPoint ahSharp
+ (m_font->getHotspot(m_style->getAccidentalCharName
+ (Accidentals::Sharp)));
+ step = std::max(step, acSharp.getWidth() - ahSharp.x());
+ }
+ m_left += shift * step;
+ }
+ }
+
+ if (cautionary)
+ m_left += m_noteBodyWidth;
+
+ int above = ah.y() - m_noteBodyHeight / 2;
+ int below = (ac.getHeight() - ah.y()) -
+ (m_noteBodyHeight - m_noteBodyHeight / 2); // subtract in case it's odd
+
+ if (above > 0)
+ m_above = std::max(m_above, above);
+ if (below > 0)
+ m_below = std::max(m_below, below);
+}
+
+void
+NotePixmapFactory::drawAccidental(Accidental a, bool cautionary)
+{
+ NoteCharacter ac = getCharacter
+ (m_style->getAccidentalCharName(a), PlainColour, false);
+
+ QPoint ah(m_font->getHotspot(m_style->getAccidentalCharName(a)));
+
+ int ax = 0;
+
+ if (cautionary) {
+ ax += m_noteBodyWidth / 2;
+ int bl = ac.getHeight() * 2 / 3;
+ int by = m_above + m_noteBodyHeight / 2 - bl / 2;
+ drawBracket(bl, true, false, m_noteBodyWidth*3 / 8, by);
+ drawBracket(bl, false, false, ac.getWidth() + m_noteBodyWidth*5 / 8, by);
+ }
+
+ m_p->drawNoteCharacter(ax, m_above + m_noteBodyHeight / 2 - ah.y(), ac);
+}
+
+void
+NotePixmapFactory::makeRoomForMarks(bool isStemmed,
+ const NotePixmapParameters &params,
+ int stemLength)
+{
+ int height = 0, width = 0;
+ int gap = m_noteBodyHeight / 5 + 1;
+
+ std::vector<Mark> normalMarks = params.getNormalMarks();
+ std::vector<Mark> aboveMarks = params.getAboveMarks();
+
+ for (std::vector<Mark>::iterator i = normalMarks.begin();
+ i != normalMarks.end(); ++i) {
+
+ if (!Marks::isTextMark(*i)) {
+
+ NoteCharacter character(m_font->getCharacter(m_style->getMarkCharName(*i)));
+ height += character.getHeight() + gap;
+ if (character.getWidth() > width)
+ width = character.getWidth();
+
+ } else {
+ // Inefficient to do this here _and_ in drawMarks, but
+ // text marks are not all that common
+ QString text = strtoqstr(Marks::getTextFromMark(*i));
+ QRect bounds = m_textMarkFontMetrics.boundingRect(text);
+ height += bounds.height() + gap;
+ if (bounds.width() > width)
+ width = bounds.width();
+ }
+ }
+
+ if (height > 0) {
+ if (isStemmed && params.m_stemGoesUp) {
+ m_below += height + 1;
+ } else {
+ m_above += height + 1;
+ }
+ }
+
+ height = 0;
+
+ if (params.m_safeVertDistance > 0 && !aboveMarks.empty()) {
+ m_above = std::max(m_above, params.m_safeVertDistance);
+ }
+
+ for (std::vector<Mark>::iterator i = aboveMarks.begin();
+ i != aboveMarks.end(); ++i) {
+
+ if (!Marks::isFingeringMark(*i)) {
+
+ Mark m(*i);
+
+ if (m == Marks::TrillLine)
+ m = Marks::LongTrill;
+
+ if (m == Marks::LongTrill) {
+ m_right = std::max(m_right, params.m_width);
+ }
+
+ NoteCharacter character(m_font->getCharacter(m_style->getMarkCharName(m)));
+ height += character.getHeight() + gap;
+ if (character.getWidth() > width)
+ width = character.getWidth();
+
+ } else {
+
+ // Inefficient to do this here _and_ in drawMarks
+ QString text = strtoqstr(Marks::getFingeringFromMark(*i));
+ QRect bounds = m_fingeringFontMetrics.boundingRect(text);
+ height += bounds.height() + gap + 3;
+ if (bounds.width() > width)
+ width = bounds.width();
+ }
+ }
+
+ if (height > 0) {
+ if (isStemmed && params.m_stemGoesUp && params.m_safeVertDistance == 0) {
+ m_above += stemLength + height + 1;
+ } else {
+ m_above += height + 1;
+ }
+ }
+
+ m_left = std::max(m_left, width / 2 - m_noteBodyWidth / 2);
+ m_right = std::max(m_right, width / 2 - m_noteBodyWidth / 2);
+}
+
+void
+NotePixmapFactory::drawMarks(bool isStemmed,
+ const NotePixmapParameters &params,
+ int stemLength)
+{
+ int gap = m_noteBodyHeight / 5 + 1;
+ int dy = gap;
+
+ std::vector<Mark> normalMarks = params.getNormalMarks();
+ std::vector<Mark> aboveMarks = params.getAboveMarks();
+
+ bool normalMarksAreAbove = !(isStemmed && params.m_stemGoesUp);
+
+ for (std::vector<Mark>::iterator i = normalMarks.begin();
+ i != normalMarks.end(); ++i) {
+
+ if (!Marks::isTextMark(*i)) {
+
+ NoteCharacter character = getCharacter
+ (m_style->getMarkCharName(*i), PlainColour,
+ !normalMarksAreAbove);
+
+ int x = m_left + m_noteBodyWidth / 2 - character.getWidth() / 2;
+ int y = (normalMarksAreAbove ?
+ (m_above - dy - character.getHeight() - 1) :
+ (m_above + m_noteBodyHeight + m_borderY * 2 + dy));
+
+ m_p->drawNoteCharacter(x, y, character);
+ dy += character.getHeight() + gap;
+
+ } else {
+
+ QString text = strtoqstr(Marks::getTextFromMark(*i));
+ QRect bounds = m_textMarkFontMetrics.boundingRect(text);
+
+ m_p->painter().setFont(m_textMarkFont);
+ if (!m_inPrinterMethod)
+ m_p->maskPainter().setFont(m_textMarkFont);
+
+ int x = m_left + m_noteBodyWidth / 2 - bounds.width() / 2;
+ int y = (normalMarksAreAbove ?
+ (m_above - dy - 3) :
+ (m_above + m_noteBodyHeight + m_borderY * 2 + dy + bounds.height() + 1));
+
+ m_p->drawText(x, y, text);
+ dy += bounds.height() + gap;
+ }
+ }
+
+ if (!normalMarksAreAbove)
+ dy = gap;
+ if (params.m_safeVertDistance > 0) {
+ if (normalMarksAreAbove) {
+ dy = std::max(dy, params.m_safeVertDistance);
+ } else {
+ dy = params.m_safeVertDistance;
+ }
+ } else if (isStemmed && params.m_stemGoesUp) {
+ dy += stemLength;
+ }
+
+ for (std::vector<Mark>::iterator i = aboveMarks.begin();
+ i != aboveMarks.end(); ++i) {
+
+ if (m_selected)
+ m_p->painter().setPen(GUIPalette::getColour(GUIPalette::SelectedElement));
+ else
+ m_p->painter().setPen(Qt::black);
+ if (!Marks::isFingeringMark(*i)) {
+
+ int x = m_left + m_noteBodyWidth / 2;
+ int y = m_above - dy - 1;
+
+ if (*i != Marks::TrillLine) {
+
+ NoteCharacter character
+ (getCharacter
+ (m_style->getMarkCharName(*i), PlainColour,
+ false));
+
+ x -= character.getWidth() / 2;
+ y -= character.getHeight();
+
+ m_p->drawNoteCharacter(x, y, character);
+
+ y += character.getHeight() / 2;
+ x += character.getWidth();
+
+ dy += character.getHeight() + gap;
+
+ } else {
+
+ NoteCharacter character
+ (getCharacter
+ (m_style->getMarkCharName(Marks::Trill), PlainColour,
+ false));
+ y -= character.getHeight() / 2;
+ dy += character.getHeight() + gap;
+ }
+
+ if (*i == Marks::LongTrill ||
+ *i == Marks::TrillLine) {
+ NoteCharacter extension;
+ if (getCharacter(NoteCharacterNames::TRILL_LINE, extension,
+ PlainColour, false)) {
+ x += extension.getHotspot().x();
+ while (x < m_left + params.m_width - extension.getWidth()) {
+ x -= extension.getHotspot().x();
+ m_p->drawNoteCharacter(x, y, extension);
+ x += extension.getWidth();
+ }
+ }
+ if (*i == Marks::TrillLine)
+ dy += extension.getHeight() + gap;
+ }
+
+ } else {
+ QString text = strtoqstr(Marks::getFingeringFromMark(*i));
+ QRect bounds = m_fingeringFontMetrics.boundingRect(text);
+
+ m_p->painter().setFont(m_fingeringFont);
+ if (!m_inPrinterMethod)
+ m_p->maskPainter().setFont(m_fingeringFont);
+
+ int x = m_left + m_noteBodyWidth / 2 - bounds.width() / 2;
+ int y = m_above - dy - 3;
+
+ m_p->drawText(x, y, text);
+ dy += bounds.height() + gap;
+ }
+ }
+}
+
+void
+NotePixmapFactory::makeRoomForLegerLines(const NotePixmapParameters &params)
+{
+ if (params.m_legerLines < 0 || params.m_restOutsideStave) {
+ m_above = std::max(m_above,
+ (m_noteBodyHeight + 1) *
+ ( -params.m_legerLines / 2));
+ }
+ if (params.m_legerLines > 0 || params.m_restOutsideStave) {
+ m_below = std::max(m_below,
+ (m_noteBodyHeight + 1) *
+ (params.m_legerLines / 2));
+ }
+ if (params.m_legerLines != 0) {
+ m_left = std::max(m_left, m_noteBodyWidth / 5 + 1);
+ m_right = std::max(m_right, m_noteBodyWidth / 5 + 1);
+ }
+ if (params.m_restOutsideStave) {
+ m_above += 1;
+ m_left = std::max(m_left, m_noteBodyWidth * 3 + 1);
+ m_right = std::max(m_right, m_noteBodyWidth * 3 + 1);
+ }
+}
+
+void
+NotePixmapFactory::drawLegerLines(const NotePixmapParameters &params)
+{
+ int x0, x1, y;
+
+ if (params.m_legerLines == 0)
+ return ;
+
+ if (params.m_restOutsideStave) {
+ if (m_selected)
+ m_p->painter().setPen(GUIPalette::getColour(GUIPalette::SelectedElement));
+ else
+ m_p->painter().setPen(Qt::black);
+ }
+ x0 = m_left - m_noteBodyWidth / 5 - 1;
+ x1 = m_left + m_noteBodyWidth + m_noteBodyWidth / 5 /* + 1 */;
+
+ if (params.m_shifted) {
+ if (params.m_stemGoesUp) {
+ x0 += m_noteBodyWidth;
+ x1 += m_noteBodyWidth;
+ } else {
+ x0 -= m_noteBodyWidth;
+ x1 -= m_noteBodyWidth;
+ }
+ }
+
+ int offset = m_noteBodyHeight + getStaffLineThickness();
+ int legerLines = params.m_legerLines;
+ bool below = (legerLines < 0);
+
+ if (below) {
+ legerLines = -legerLines;
+ offset = -offset;
+ }
+
+ if (params.m_restOutsideStave)
+ y = m_above;
+ else {
+ if (!below) { // note above staff
+ if (legerLines % 2) { // note is between lines
+ y = m_above + m_noteBodyHeight;
+ } else { // note is on a line
+ y = m_above + m_noteBodyHeight / 2 - getStaffLineThickness() / 2;
+ }
+ } else { // note below staff
+ if (legerLines % 2) { // note is between lines
+ y = m_above - getStaffLineThickness();
+ } else { // note is on a line
+ y = m_above + m_noteBodyHeight / 2;
+ }
+ }
+ }
+ if (params.m_restOutsideStave) {
+ NOTATION_DEBUG << "draw leger lines: " << legerLines << " lines, below "
+ << below
+ << ", note body height " << m_noteBodyHeight
+ << ", thickness " << getLegerLineThickness()
+ << " (staff line " << getStaffLineThickness() << ")"
+ << ", offset " << offset << endl;
+ }
+
+ // NOTATION_DEBUG << "draw leger lines: " << legerLines << " lines, below "
+ // << below
+ // << ", note body height " << m_noteBodyHeight
+ // << ", thickness " << getLegerLineThickness()
+ // << " (staff line " << getStaffLineThickness() << ")"
+ // << ", offset " << offset << endl;
+
+ // bool first = true;
+
+ if (getLegerLineThickness() > getStaffLineThickness()) {
+ y -= (getLegerLineThickness() - getStaffLineThickness() + 1) / 2;
+ }
+
+ for (int i = legerLines - 1; i >= 0; --i) {
+ if (i % 2) {
+ // NOTATION_DEBUG << "drawing leger line at y = " << y << endl;
+ for (int j = 0; j < getLegerLineThickness(); ++j) {
+ m_p->drawLine(x0, y + j, x1, y + j);
+ }
+ y += offset;
+ // if (first) {
+ // x0 += getStemThickness();
+ // x1 -= getStemThickness();
+ // first = false;
+ // }
+ }
+ }
+}
+
+void
+NotePixmapFactory::makeRoomForStemAndFlags(int flagCount, int stemLength,
+ const NotePixmapParameters &params,
+ QPoint &s0, QPoint &s1)
+{
+ // The coordinates we set in s0 and s1 are relative to (m_above, m_left)
+
+ if (params.m_stemGoesUp) {
+ m_above = std::max
+ (m_above, stemLength - m_noteBodyHeight / 2);
+ } else {
+ m_below = std::max
+ (m_below, stemLength - m_noteBodyHeight / 2 + 1);
+ }
+
+ if (flagCount > 0) {
+ if (params.m_stemGoesUp) {
+ int width = 0, height = 0;
+ if (!m_font->getDimensions
+ (m_style->getFlagCharName(flagCount), width, height)) {
+ width = m_font->getWidth(m_style->getPartialFlagCharName(false));
+ }
+ m_right += width;
+ }
+ }
+
+ unsigned int stemThickness = getStemThickness();
+
+ NoteStyle::HFixPoint hfix;
+ NoteStyle::VFixPoint vfix;
+ m_style->getStemFixPoints(params.m_noteType, hfix, vfix);
+
+ switch (hfix) {
+
+ case NoteStyle::Normal:
+ case NoteStyle::Reversed:
+ if (params.m_stemGoesUp ^ (hfix == NoteStyle::Reversed)) {
+ s0.setX(m_noteBodyWidth - stemThickness);
+ } else {
+ s0.setX(0);
+ }
+ break;
+
+ case NoteStyle::Central:
+ if (params.m_stemGoesUp ^ (hfix == NoteStyle::Reversed)) {
+ s0.setX(m_noteBodyWidth / 2 + 1);
+ } else {
+ s0.setX(m_noteBodyWidth / 2);
+ }
+ break;
+ }
+
+ switch (vfix) {
+
+ case NoteStyle::Near:
+ case NoteStyle::Far:
+ if (params.m_stemGoesUp ^ (vfix == NoteStyle::Far)) {
+ s0.setY(0);
+ } else {
+ s0.setY(m_noteBodyHeight);
+ }
+ if (vfix == NoteStyle::Near) {
+ stemLength -= m_noteBodyHeight / 2;
+ } else {
+ stemLength += m_noteBodyHeight / 2;
+ }
+ break;
+
+ case NoteStyle::Middle:
+ if (params.m_stemGoesUp) {
+ s0.setY(m_noteBodyHeight * 3 / 8);
+ } else {
+ s0.setY(m_noteBodyHeight * 5 / 8);
+ }
+ stemLength -= m_noteBodyHeight / 8;
+ break;
+ }
+
+ if (params.m_stemGoesUp) {
+ s1.setY(s0.y() - stemLength + getStaffLineThickness());
+ } else {
+ s1.setY(s0.y() + stemLength);
+ }
+
+ s1.setX(s0.x());
+}
+
+void
+NotePixmapFactory::drawFlags(int flagCount,
+ const NotePixmapParameters &params,
+ const QPoint &, const QPoint &s1)
+{
+ if (flagCount < 1)
+ return ;
+
+ NoteCharacter flagChar;
+ bool found = getCharacter(m_style->getFlagCharName(flagCount),
+ flagChar,
+ PlainColour,
+ !params.m_stemGoesUp);
+
+ if (!found) {
+
+ // Handle fonts that don't have all the flags in separate characters
+
+ found = getCharacter(m_style->getPartialFlagCharName(false),
+ flagChar,
+ PlainColour,
+ !params.m_stemGoesUp);
+
+ if (!found) {
+ std::cerr << "Warning: NotePixmapFactory::drawFlags: No way to draw note with " << flagCount << " flags in this font!?" << std::endl;
+ return ;
+ }
+
+ QPoint hotspot = flagChar.getHotspot();
+
+ NoteCharacter oneFlagChar;
+ bool foundOne =
+ (flagCount > 1 ?
+ getCharacter(m_style->getPartialFlagCharName(true),
+ oneFlagChar,
+ PlainColour,
+ !params.m_stemGoesUp) : false);
+
+ unsigned int flagSpace = m_noteBodyHeight;
+ (void)m_font->getFlagSpacing(flagSpace);
+
+ for (int flag = 0; flag < flagCount; ++flag) {
+
+ // use flag_1 in preference to flag_0 for the final flag, so
+ // as to end with a flourish
+ if (flag == flagCount - 1 && foundOne)
+ flagChar = oneFlagChar;
+
+ int y = m_above + s1.y();
+ if (params.m_stemGoesUp)
+ y += flag * flagSpace;
+ else
+ y -= (flag * flagSpace) + flagChar.getHeight();
+
+ if (!m_inPrinterMethod) {
+
+ m_p->end();
+
+ // Super-slow
+
+ PixmapFunctions::drawPixmapMasked(*m_generatedPixmap,
+ *m_generatedMask,
+ m_left + s1.x() - hotspot.x(),
+ y,
+ *flagChar.getPixmap());
+
+ m_p->begin(m_generatedPixmap, m_generatedMask);
+
+ } else {
+
+ // No problem with mask here
+ m_p->drawNoteCharacter(m_left + s1.x() - hotspot.x(),
+ y,
+ flagChar);
+ }
+ }
+
+ } else { // the normal case
+
+ QPoint hotspot = flagChar.getHotspot();
+
+ int y = m_above + s1.y();
+ if (!params.m_stemGoesUp)
+ y -= flagChar.getHeight();
+
+ m_p->drawNoteCharacter(m_left + s1.x() - hotspot.x(), y, flagChar);
+ }
+}
+
+void
+NotePixmapFactory::drawStem(const NotePixmapParameters &params,
+ const QPoint &s0, const QPoint &s1,
+ int shortening)
+{
+ if (params.m_stemGoesUp)
+ shortening = -shortening;
+ for (int i = 0; i < getStemThickness(); ++i) {
+ m_p->drawLine(m_left + s0.x() + i, m_above + s0.y(),
+ m_left + s1.x() + i, m_above + s1.y() - shortening);
+ }
+}
+
+void
+NotePixmapFactory::makeRoomForBeams(const NotePixmapParameters &params)
+{
+ int beamSpacing = (int)(params.m_width * params.m_gradient);
+
+ if (params.m_stemGoesUp) {
+
+ beamSpacing = -beamSpacing;
+ if (beamSpacing < 0)
+ beamSpacing = 0;
+ m_above += beamSpacing + 2;
+
+ // allow a bit extra in case the h fixpoint is non-normal
+ m_right = std::max(m_right, params.m_width + m_noteBodyWidth);
+
+ } else {
+
+ if (beamSpacing < 0)
+ beamSpacing = 0;
+ m_below += beamSpacing + 2;
+
+ m_right = std::max(m_right, params.m_width);
+ }
+}
+
+void
+NotePixmapFactory::drawShallowLine(int x0, int y0, int x1, int y1,
+ int thickness, bool smooth)
+{
+ if (!smooth || m_inPrinterMethod || (y0 == y1)) {
+
+ if (!m_inPrinterMethod) {
+ if (m_selected)
+ m_p->painter().setBrush(GUIPalette::getColour(GUIPalette::SelectedElement));
+ else
+ m_p->painter().setBrush(Qt::black);
+ }
+ if (thickness < 4) {
+ for (int i = 0; i < thickness; ++i) {
+ m_p->drawLine(x0, y0 + i, x1, y1 + i);
+ }
+ } else {
+ Profiler profiler("NotePixmapFactory::drawShallowLine(polygon)");
+ QPointArray qp(4);
+ qp.setPoint(0, x0, y0);
+ qp.setPoint(1, x0, y0 + thickness);
+ qp.setPoint(2, x1, y1 + thickness);
+ qp.setPoint(3, x1, y1);
+ m_p->drawPolygon(qp);
+ }
+
+ return ;
+ }
+
+ Profiler profiler("NotePixmapFactory::drawShallowLine(points)");
+
+ int dv = y1 - y0;
+ int dh = x1 - x0;
+
+ static std::vector<QColor> colours, selectedColours;
+ if (colours.size() == 0) {
+ int h, s, v;
+ QColor c = GUIPalette::getColour(GUIPalette::SelectedElement);
+ c.hsv(&h, &s, &v);
+ for (int step = 0; step < 256; step += (step == 0 ? 63 : 64)) {
+ colours.push_back(QColor( -1, 0, step, QColor::Hsv));
+ selectedColours.push_back(QColor(h, 255 - step, v, QColor::Hsv));
+ }
+ }
+
+ int cx = x0, cy = y0;
+
+ int inc = 1;
+
+ if (dv < 0) {
+ dv = -dv;
+ inc = -1;
+ }
+
+ int g = 2 * dv - dh;
+ int dg1 = 2 * (dv - dh);
+ int dg2 = 2 * dv;
+
+ int segment = (dg2 - dg1) / 4;
+
+ while (cx < x1) {
+
+ if (g > 0) {
+ g += dg1;
+ cy += inc;
+ } else {
+ g += dg2;
+ }
+
+ int quartile = segment ? ((dg2 - g) / segment) : 0;
+ if (quartile < 0)
+ quartile = 0;
+ if (quartile > 3)
+ quartile = 3;
+ if (inc > 0)
+ quartile = 4 - quartile;
+ /*
+ NOTATION_DEBUG
+ << "x = " << cx << ", y = " << cy
+ << ", g = " << g << ", dg1 = " << dg1 << ", dg2 = " << dg2
+ << ", seg = " << segment << ", q = " << quartile << endl;
+ */
+ // I don't know enough about Qt to be sure of this, but I
+ // suspect this may be some of the most inefficient code ever
+ // written:
+
+ int off = 0;
+
+ if (m_selected) {
+ m_p->painter().setPen(selectedColours[quartile]);
+ } else {
+ m_p->painter().setPen(colours[quartile]);
+ }
+
+ m_p->drawPoint(cx, cy);
+ drawBeamsCount ++;
+
+ if (thickness > 1) {
+ if (m_selected) {
+ m_p->painter().setPen(GUIPalette::getColour(GUIPalette::SelectedElement));
+ } else {
+ m_p->painter().setPen(Qt::black);
+ }
+ }
+
+ while (++off < thickness) {
+ m_p->drawPoint(cx, cy + off);
+ drawBeamsCount ++;
+ }
+
+ if (m_selected) {
+ m_p->painter().setPen(selectedColours[4 - quartile]);
+ } else {
+ m_p->painter().setPen(colours[4 - quartile]);
+ }
+
+ m_p->drawPoint(cx, cy + off);
+ drawBeamsCount ++;
+
+ ++cx;
+ }
+
+ m_p->painter().setPen(Qt::black);
+}
+
+void
+NotePixmapFactory::drawBeams(const QPoint &s1,
+ const NotePixmapParameters &params,
+ int beamCount)
+{
+ clock_t startTime = clock();
+
+ // draw beams: first we draw all the beams common to both ends of
+ // the section, then we draw beams for those that appear at the
+ // end only
+
+ int startY = m_above + s1.y(), startX = m_left + s1.x();
+ int commonBeamCount = std::min(beamCount, params.m_nextBeamCount);
+
+ unsigned int thickness;
+ (void)m_font->getBeamThickness(thickness);
+
+ int width = params.m_width;
+ double grad = params.m_gradient;
+ bool smooth = m_font->isSmooth();
+ int spacing = getLineSpacing();
+
+ int sign = (params.m_stemGoesUp ? 1 : -1);
+
+ if (!params.m_stemGoesUp)
+ startY -= thickness;
+
+ if (!smooth)
+ startY -= sign;
+ else if (grad > -0.01 && grad < 0.01)
+ startY -= sign;
+
+ if (m_inPrinterMethod) {
+ startX += getStemThickness() / 2;
+ }
+
+ for (int j = 0; j < commonBeamCount; ++j) {
+ int y = sign * j * spacing;
+ drawShallowLine(startX, startY + y, startX + width,
+ startY + (int)(width*grad) + y,
+ thickness, smooth);
+ drawBeamsBeamCount ++;
+ }
+
+ int partWidth = width / 3;
+ if (partWidth < 2)
+ partWidth = 2;
+ else if (partWidth > m_noteBodyWidth)
+ partWidth = m_noteBodyWidth;
+
+ if (params.m_thisPartialBeams) {
+ for (int j = commonBeamCount; j < beamCount; ++j) {
+ int y = sign * j * spacing;
+ drawShallowLine(startX, startY + y, startX + partWidth,
+ startY + (int)(partWidth*grad) + y,
+ thickness, smooth);
+ drawBeamsBeamCount ++;
+ }
+ }
+
+ if (params.m_nextPartialBeams) {
+ startX += width - partWidth;
+ startY += (int)((width - partWidth) * grad);
+
+ for (int j = commonBeamCount; j < params.m_nextBeamCount; ++j) {
+ int y = sign * j * spacing;
+ drawShallowLine(startX, startY + y, startX + partWidth,
+ startY + (int)(partWidth*grad) + y,
+ thickness, smooth);
+ drawBeamsBeamCount ++;
+ }
+ }
+
+ clock_t endTime = clock();
+ drawBeamsTime += (endTime - startTime);
+}
+
+void
+NotePixmapFactory::drawSlashes(const QPoint &s0,
+ const NotePixmapParameters &params,
+ int slashCount)
+{
+ unsigned int thickness;
+ (void)m_font->getBeamThickness(thickness);
+ thickness = thickness * 3 / 4;
+ if (thickness < 1)
+ thickness = 1;
+
+ int gap = thickness - 1;
+ if (gap < 1)
+ gap = 1;
+
+ bool smooth = m_font->isSmooth();
+
+ int width = m_noteBodyWidth * 4 / 5;
+ int sign = (params.m_stemGoesUp ? -1 : 1);
+
+ int offset =
+ (slashCount == 1 ? m_noteBodyHeight * 2 :
+ slashCount == 2 ? m_noteBodyHeight * 3 / 2 :
+ m_noteBodyHeight);
+ int y = m_above + s0.y() + sign * (offset + thickness / 2);
+
+ for (int i = 0; i < slashCount; ++i) {
+ int yoff = width / 2;
+ drawShallowLine(m_left + s0.x() - width / 2, y + yoff / 2,
+ m_left + s0.x() + width / 2 + getStemThickness(), y - yoff / 2,
+ thickness, smooth);
+ y += sign * (thickness + gap);
+ }
+}
+
+void
+NotePixmapFactory::makeRoomForTuplingLine(const NotePixmapParameters &params)
+{
+ int lineSpacing =
+ (int)(params.m_tuplingLineWidth * params.m_tuplingLineGradient);
+ int th = m_tupletCountFontMetrics.height();
+
+ if (params.m_tuplingLineY < 0) {
+
+ lineSpacing = -lineSpacing;
+ if (lineSpacing < 0)
+ lineSpacing = 0;
+ m_above = std::max(m_above, -params.m_tuplingLineY + th / 2);
+ m_above += lineSpacing + 1;
+
+ } else {
+
+ if (lineSpacing < 0)
+ lineSpacing = 0;
+ m_below = std::max(m_below, params.m_tuplingLineY + th / 2);
+ m_below += lineSpacing + 1;
+ }
+
+ m_right = std::max(m_right, params.m_tuplingLineWidth);
+}
+
+void
+NotePixmapFactory::drawTuplingLine(const NotePixmapParameters &params)
+{
+ int thickness = getStaffLineThickness() * 3 / 2;
+ int countSpace = thickness * 2;
+
+ QString count;
+ count.setNum(params.m_tupletCount);
+ QRect cr = m_tupletCountFontMetrics.boundingRect(count);
+
+ int tlw = params.m_tuplingLineWidth;
+ int indent = m_noteBodyWidth / 2;
+
+ if (tlw < (cr.width() + countSpace * 2 + m_noteBodyWidth * 2)) {
+ tlw += m_noteBodyWidth - 1;
+ indent = 0;
+ }
+
+ int w = (tlw - cr.width()) / 2 - countSpace;
+
+ int startX = m_left + indent;
+ int endX = startX + w;
+
+ int startY = params.m_tuplingLineY + m_above + getLineSpacing() / 2;
+ int endY = startY + (int)(params.m_tuplingLineGradient * w);
+
+ if (startY == endY)
+ ++thickness;
+
+ int tickOffset = getLineSpacing() / 2;
+ if (params.m_tuplingLineY >= 0)
+ tickOffset = -tickOffset;
+
+ // NOTATION_DEBUG << "adjusted params.m_tuplingLineWidth = "
+ // << tlw
+ // << ", cr.width = " << cr.width()
+ // << ", tickOffset = " << tickOffset << endl;
+ // NOTATION_DEBUG << "line: (" << startX << "," << startY << ") -> ("
+ // << endX << "," << endY << ")" << endl;
+
+ bool smooth = m_font->isSmooth();
+
+ if (!params.m_tuplingLineFollowsBeam) {
+ m_p->drawLine(startX, startY, startX, startY + tickOffset);
+ drawShallowLine(startX, startY, endX, endY, thickness, smooth);
+ }
+
+ m_p->painter().setFont(m_tupletCountFont);
+ if (!m_inPrinterMethod)
+ m_p->maskPainter().setFont(m_tupletCountFont);
+
+ int textX = endX + countSpace;
+ int textY = endY + cr.height() / 2;
+ // NOTATION_DEBUG << "text: (" << textX << "," << textY << ")" << endl;
+
+ m_p->drawText(textX, textY, count);
+
+ startX += tlw - w;
+ endX = startX + w;
+
+ startY += (int)(params.m_tuplingLineGradient * (tlw - w));
+ endY = startY + (int)(params.m_tuplingLineGradient * w);
+
+ // NOTATION_DEBUG << "line: (" << startX << "," << startY << ") -> ("
+ // << endX << "," << endY << ")" << endl;
+
+ if (!params.m_tuplingLineFollowsBeam) {
+ drawShallowLine(startX, startY, endX, endY, thickness, smooth);
+ m_p->drawLine(endX, endY, endX, endY + tickOffset);
+ }
+}
+
+void
+NotePixmapFactory::drawTie(bool above, int length, int shift)
+{
+#ifdef NASTY_OLD_FLAT_TIE_CODE
+
+ int tieThickness = getStaffLineThickness() * 2;
+ int tieCurve = m_font->getSize() * 2 / 3;
+ int height = tieCurve + tieThickness;
+ int x = m_left + m_noteBodyWidth;
+ int y = (above ? m_above - height - tieCurve / 2 :
+ m_above + m_noteBodyHeight + tieCurve / 2 + 1);
+ int i;
+
+ length -= m_noteBodyWidth;
+ if (length < tieCurve * 2)
+ length = tieCurve * 2;
+ if (length < m_noteBodyWidth * 3) {
+ length += m_noteBodyWidth - 2;
+ x -= m_noteBodyWidth / 2 - 1;
+ }
+
+ for (i = 0; i < tieThickness; ++i) {
+
+ if (above) {
+
+ m_p->drawArc
+ (x, y + i, tieCurve*2, tieCurve*2, 90*16, 70*16);
+
+ m_p->drawLine
+ (x + tieCurve, y + i, x + length - tieCurve - 2, y + i);
+
+ m_p->drawArc
+ (x + length - 2*tieCurve - 1, y + i,
+ tieCurve*2, tieCurve*2, 20*16, 70*16);
+
+ } else {
+
+ m_p->drawArc
+ (x, y + i - tieCurve, tieCurve*2, tieCurve*2, 200*16, 70*16);
+
+ m_p->drawLine
+ (x + tieCurve, y + height - i - 1,
+ x + length - tieCurve - 2, y + height - i - 1);
+
+ m_p->drawArc
+ (x + length - 2*tieCurve - 1, y + i - tieCurve,
+ tieCurve*2, tieCurve*2, 270*16, 70*16);
+ }
+ }
+#else
+
+ int origLength = length;
+
+ int x = m_left + m_noteBodyWidth + m_noteBodyWidth / 4 + shift;
+ length = origLength - m_noteBodyWidth - m_noteBodyWidth / 3 - shift;
+
+ // if the length is short, move the tie a bit closer to both notes
+ if (length < m_noteBodyWidth*2) {
+ x = m_left + m_noteBodyWidth + shift;
+ length = origLength - m_noteBodyWidth - shift;
+ }
+
+ if (length < m_noteBodyWidth) {
+ length = m_noteBodyWidth;
+ }
+
+ // We can't request a smooth slur here, because that always involves
+ // creating a new pixmap
+
+ QPoint hotspot;
+ drawSlurAux(length, 0, above, false, true, false, hotspot,
+ &m_p->painter(),
+ x,
+ above ? m_above : m_above + m_noteBodyHeight);
+ // above ? m_above - m_noteBodyHeight/2 :
+ // m_above + m_noteBodyHeight + m_noteBodyHeight/2);
+
+#endif
+}
+
+QCanvasPixmap*
+NotePixmapFactory::makeRestPixmap(const NotePixmapParameters &params)
+{
+ Profiler profiler("NotePixmapFactory::makeRestPixmap");
+
+ CharName charName(m_style->getRestCharName(params.m_noteType,
+ params.m_restOutsideStave));
+ // Check whether the font has the glyph for this charName;
+ // if not, substitute a rest-on-stave glyph for a rest-outside-stave glyph,
+ // and vice-versa.
+ NoteCharacter character;
+ if (!getCharacter(charName, character, PlainColour, false))
+ charName = m_style->getRestCharName(params.m_noteType,
+ !params.m_restOutsideStave);
+
+ bool encache = false;
+
+ if (params.m_tupletCount == 0 && !m_selected && !m_shaded &&
+ !params.m_restOutsideStave) {
+
+ if (params.m_dots == 0) {
+ return getCharacter(charName, PlainColour, false).getCanvasPixmap();
+ } else {
+ NotePixmapCache::iterator ci(m_dottedRestCache->find(charName));
+ if (ci != m_dottedRestCache->end())
+ return new QCanvasPixmap
+ (*ci->second, QPoint(ci->second->offsetX(),
+ ci->second->offsetY()));
+ else
+ encache = true;
+ }
+ }
+
+ QPoint hotspot(m_font->getHotspot(charName));
+ drawRestAux(params, hotspot, 0, 0, 0);
+
+ QCanvasPixmap* canvasMap = makeCanvasPixmap(hotspot);
+ if (encache) {
+ m_dottedRestCache->insert(std::pair<CharName, QCanvasPixmap*>
+ (charName, new QCanvasPixmap
+ (*canvasMap, hotspot)));
+ }
+ return canvasMap;
+}
+
+void
+NotePixmapFactory::drawRest(const NotePixmapParameters &params,
+ QPainter &painter, int x, int y)
+{
+ Profiler profiler("NotePixmapFactory::drawRest");
+ m_inPrinterMethod = true;
+ QPoint hotspot; // unused
+ drawRestAux(params, hotspot, &painter, x, y);
+ m_inPrinterMethod = false;
+}
+
+void
+NotePixmapFactory::drawRestAux(const NotePixmapParameters &params,
+ QPoint &hotspot, QPainter *painter, int x, int y)
+{
+ CharName charName(m_style->getRestCharName(params.m_noteType,
+ params.m_restOutsideStave));
+ NoteCharacter character = getCharacter(charName,
+ params.m_quantized ? QuantizedColour :
+ PlainColour,
+ false);
+
+ NoteCharacter dot = getCharacter(NoteCharacterNames::DOT, PlainColour, false);
+
+ int dotWidth = dot.getWidth();
+ if (dotWidth < getNoteBodyWidth() / 2)
+ dotWidth = getNoteBodyWidth() / 2;
+
+ m_above = m_left = 0;
+ m_below = dot.getHeight() / 2; // for dotted shallow rests like semibreve
+ m_right = dotWidth / 2 + dotWidth * params.m_dots;
+ m_noteBodyWidth = character.getWidth();
+ m_noteBodyHeight = character.getHeight();
+
+ if (params.m_tupletCount)
+ makeRoomForTuplingLine(params);
+
+ // we'll adjust this for tupling line after drawing rest character:
+ hotspot = m_font->getHotspot(charName);
+
+ if (params.m_restOutsideStave &&
+ (charName == NoteCharacterNames::MULTI_REST ||
+ charName == NoteCharacterNames::MULTI_REST_ON_STAFF)) {
+ makeRoomForLegerLines(params);
+ }
+ if (painter) {
+ painter->save();
+ m_p->beginExternal(painter);
+ painter->translate(x - m_left, y - m_above - hotspot.y());
+ } else {
+ createPixmapAndMask(m_noteBodyWidth + m_left + m_right,
+ m_noteBodyHeight + m_above + m_below);
+ }
+
+ m_p->drawNoteCharacter(m_left, m_above, character);
+
+ if (params.m_tupletCount)
+ drawTuplingLine(params);
+
+ hotspot.setX(m_left);
+ hotspot.setY(m_above + hotspot.y());
+
+ int restY = hotspot.y() - dot.getHeight() - getStaffLineThickness();
+ if (params.m_noteType == Note::Semibreve ||
+ params.m_noteType == Note::Breve) {
+ restY += getLineSpacing();
+ }
+
+ for (int i = 0; i < params.m_dots; ++i) {
+ int x = m_left + m_noteBodyWidth + i * dotWidth + dotWidth / 2;
+ m_p->drawNoteCharacter(x, restY, dot);
+ }
+
+ if (params.m_restOutsideStave &&
+ (charName == NoteCharacterNames::MULTI_REST ||
+ charName == NoteCharacterNames::MULTI_REST_ON_STAFF)) {
+ drawLegerLines(params);
+ }
+
+ if (painter) {
+ painter->restore();
+ }
+}
+
+QCanvasPixmap*
+NotePixmapFactory::makeClefPixmap(const Clef &clef)
+{
+ Profiler profiler("NotePixmapFactory::makeClefPixmap");
+ NoteCharacter plain = getCharacter(m_style->getClefCharName(clef),
+ PlainColour, false);
+
+ int oct = clef.getOctaveOffset();
+ if (oct == 0)
+ return plain.getCanvasPixmap();
+
+ // fix #1522784 and use 15 rather than 16 for double octave offset
+ int adjustedOctave = (8 * (oct < 0 ? -oct : oct));
+ if (adjustedOctave > 8)
+ adjustedOctave--;
+ else if (adjustedOctave < 8)
+ adjustedOctave++;
+
+ QString text = QString("%1").arg(adjustedOctave);
+ QRect rect = m_clefOttavaFontMetrics.boundingRect(text);
+
+ createPixmapAndMask(plain.getWidth(),
+ plain.getHeight() + rect.height());
+
+ if (m_selected) {
+ m_p->painter().setPen(GUIPalette::getColour(GUIPalette::SelectedElement));
+ }
+
+ m_p->drawNoteCharacter(0, oct < 0 ? 0 : rect.height(), plain);
+
+ m_p->painter().setFont(m_clefOttavaFont);
+ if (!m_inPrinterMethod)
+ m_p->maskPainter().setFont(m_clefOttavaFont);
+
+ m_p->drawText(plain.getWidth() / 2 - rect.width() / 2,
+ oct < 0 ? plain.getHeight() + rect.height() - 1 :
+ rect.height(), text);
+
+ m_p->painter().setPen(Qt::black);
+ QPoint hotspot(plain.getHotspot());
+ if (oct > 0) hotspot.setY(hotspot.y() + rect.height());
+ return makeCanvasPixmap(hotspot, true);
+}
+
+QCanvasPixmap*
+NotePixmapFactory::makePedalDownPixmap()
+{
+ return getCharacter(NoteCharacterNames::PEDAL_MARK, PlainColour, false)
+ .getCanvasPixmap();
+}
+
+QCanvasPixmap*
+NotePixmapFactory::makePedalUpPixmap()
+{
+ return getCharacter(NoteCharacterNames::PEDAL_UP_MARK, PlainColour, false)
+ .getCanvasPixmap();
+}
+
+QCanvasPixmap*
+NotePixmapFactory::makeUnknownPixmap()
+{
+ Profiler profiler("NotePixmapFactory::makeUnknownPixmap");
+ return getCharacter(NoteCharacterNames::UNKNOWN, PlainColour, false)
+ .getCanvasPixmap();
+}
+
+QCanvasPixmap*
+NotePixmapFactory::makeToolbarPixmap(const char *name, bool menuSize)
+{
+ QString pixmapDir = KGlobal::dirs()->findResource("appdata", "pixmaps/");
+ QString fileBase = pixmapDir + "/toolbar/";
+ if (menuSize) fileBase += "menu-";
+ fileBase += name;
+ if (QFile(fileBase + ".png").exists()) {
+ return new QCanvasPixmap(fileBase + ".png");
+ } else if (QFile(fileBase + ".xpm").exists()) {
+ return new QCanvasPixmap(fileBase + ".xpm");
+ } else if (menuSize) {
+ return makeToolbarPixmap(name, false);
+ } else {
+ // this will fail, but we don't want to return a null pointer
+ return new QCanvasPixmap(fileBase + ".png");
+ }
+}
+
+QCanvasPixmap*
+NotePixmapFactory::makeNoteMenuPixmap(timeT duration,
+ timeT &errorReturn)
+{
+ Note nearestNote = Note::getNearestNote(duration);
+ bool triplet = false;
+ errorReturn = 0;
+
+ if (nearestNote.getDuration() != duration) {
+ Note tripletNote = Note::getNearestNote(duration * 3 / 2);
+ if (tripletNote.getDuration() == duration * 3 / 2) {
+ nearestNote = tripletNote;
+ triplet = true;
+ } else {
+ errorReturn = duration - nearestNote.getDuration();
+ }
+ }
+
+ QString noteName = NotationStrings::getReferenceName(nearestNote);
+ if (triplet)
+ noteName = "3-" + noteName;
+ noteName = "menu-" + noteName;
+ return makeToolbarPixmap(noteName);
+}
+
+QCanvasPixmap *
+NotePixmapFactory::makeMarkMenuPixmap(Mark mark)
+{
+ if (mark == Marks::Sforzando ||
+ mark == Marks::Rinforzando) {
+ return makeToolbarPixmap(mark.c_str());
+ } else {
+ NoteFont *font = 0;
+ try {
+ font = NoteFontFactory::getFont
+ (NoteFontFactory::getDefaultFontName(), 6);
+ } catch (Exception) {
+ font = NoteFontFactory::getFont
+ (NoteFontFactory::getDefaultFontName(),
+ NoteFontFactory::getDefaultSize(NoteFontFactory::getDefaultFontName()));
+ }
+ NoteCharacter character = font->getCharacter
+ (NoteStyleFactory::getStyle(NoteStyleFactory::DefaultStyle)->
+ getMarkCharName(mark));
+ return character.getCanvasPixmap();
+ }
+}
+
+QCanvasPixmap*
+NotePixmapFactory::makeKeyPixmap(const Key &key,
+ const Clef &clef,
+ Key previousKey)
+{
+ Profiler profiler("NotePixmapFactory::makeKeyPixmap");
+
+ std::vector<int> ah0 = previousKey.getAccidentalHeights(clef);
+ std::vector<int> ah1 = key.getAccidentalHeights(clef);
+
+ int cancelCount = 0;
+ if (key.isSharp() != previousKey.isSharp())
+ cancelCount = ah0.size();
+ else if (ah1.size() < ah0.size())
+ cancelCount = ah0.size() - ah1.size();
+
+ CharName keyCharName;
+ if (key.isSharp())
+ keyCharName = NoteCharacterNames::SHARP;
+ else
+ keyCharName = NoteCharacterNames::FLAT;
+
+ NoteCharacter keyCharacter;
+ NoteCharacter cancelCharacter;
+
+ keyCharacter = getCharacter(keyCharName, PlainColour, false);
+ if (cancelCount > 0) {
+ cancelCharacter = getCharacter(NoteCharacterNames::NATURAL, PlainColour, false);
+ }
+
+ int x = 0;
+ int lw = getLineSpacing();
+ int keyDelta = keyCharacter.getWidth() - keyCharacter.getHotspot().x();
+
+ int cancelDelta = 0;
+ int between = 0;
+ if (cancelCount > 0) {
+ cancelDelta = cancelCharacter.getWidth() + cancelCharacter.getWidth() / 3;
+ between = cancelCharacter.getWidth();
+ }
+
+ createPixmapAndMask(keyDelta * ah1.size() + cancelDelta * cancelCount + between +
+ keyCharacter.getWidth() / 4, lw * 8 + 1);
+
+ if (key.isSharp() != previousKey.isSharp()) {
+
+ // cancellation first
+
+ for (int i = 0; i < cancelCount; ++i) {
+
+ int h = ah0[ah0.size() - cancelCount + i];
+ int y = (lw * 2) + ((8 - h) * lw) / 2 - cancelCharacter.getHotspot().y();
+
+ m_p->drawNoteCharacter(x, y, cancelCharacter);
+
+ x += cancelDelta;
+ }
+
+ if (cancelCount > 0) {
+ x += between;
+ }
+ }
+
+ for (unsigned int i = 0; i < ah1.size(); ++i) {
+
+ int h = ah1[i];
+ int y = (lw * 2) + ((8 - h) * lw) / 2 - keyCharacter.getHotspot().y();
+
+ m_p->drawNoteCharacter(x, y, keyCharacter);
+
+ x += keyDelta;
+ }
+
+ if (key.isSharp() == previousKey.isSharp()) {
+
+ // cancellation afterwards
+
+ if (cancelCount > 0) {
+ x += between;
+ }
+
+ for (int i = 0; i < cancelCount; ++i) {
+
+ int h = ah0[ah0.size() - cancelCount + i];
+ int y = (lw * 2) + ((8 - h) * lw) / 2 - cancelCharacter.getHotspot().y();
+
+ m_p->drawNoteCharacter(x, y, cancelCharacter);
+
+ x += cancelDelta;
+ }
+ }
+
+ return makeCanvasPixmap(m_pointZero);
+}
+
+QCanvasPixmap*
+NotePixmapFactory::makeClefDisplayPixmap(const Clef &clef)
+{
+ QCanvasPixmap* clefPixmap = makeClefPixmap(clef);
+
+ int lw = getLineSpacing();
+ int width = clefPixmap->width() + 6 * getNoteBodyWidth();
+
+ createPixmapAndMask(width, lw * 10 + 1);
+
+ int h = clef.getAxisHeight();
+ int y = (lw * 3) + ((8 - h) * lw) / 2;
+ int x = 3 * getNoteBodyWidth();
+ m_p->drawPixmap(x, y - clefPixmap->offsetY(), *clefPixmap);
+
+ for (h = 0; h <= 8; h += 2) {
+ y = (lw * 3) + ((8 - h) * lw) / 2;
+ m_p->drawLine(x / 2, y, m_generatedWidth - x / 2 - 1, y);
+ }
+
+ delete clefPixmap;
+
+ return makeCanvasPixmap(m_pointZero);
+}
+
+QCanvasPixmap*
+NotePixmapFactory::makeKeyDisplayPixmap(const Key &key, const Clef &clef)
+{
+ std::vector<int> ah = key.getAccidentalHeights(clef);
+
+ CharName charName = (key.isSharp() ?
+ NoteCharacterNames::SHARP :
+ NoteCharacterNames::FLAT);
+
+ QCanvasPixmap* clefPixmap = makeClefPixmap(clef);
+ QPixmap accidentalPixmap(*m_font->getCharacter(charName).getPixmap());
+ QPoint hotspot(m_font->getHotspot(charName));
+
+ int lw = getLineSpacing();
+ int delta = accidentalPixmap.width() - hotspot.x();
+ int maxDelta = getAccidentalWidth(Sharp);
+ int width = clefPixmap->width() + 5 * maxDelta + 7 * maxDelta;
+ int x = clefPixmap->width() + 5 * maxDelta / 2;
+
+ createPixmapAndMask(width, lw * 10 + 1);
+
+ int h = clef.getAxisHeight();
+ int y = (lw * 3) + ((8 - h) * lw) / 2;
+ m_p->drawPixmap(2 * maxDelta, y - clefPixmap->offsetY(), *clefPixmap);
+
+ for (unsigned int i = 0; i < ah.size(); ++i) {
+
+ h = ah[i];
+ y = (lw * 3) + ((8 - h) * lw) / 2 - hotspot.y();
+
+ m_p->drawPixmap(x, y, accidentalPixmap);
+
+ x += delta;
+ }
+
+ for (h = 0; h <= 8; h += 2) {
+ y = (lw * 3) + ((8 - h) * lw) / 2;
+ m_p->drawLine(maxDelta, y, m_generatedWidth - 2*maxDelta - 1, y);
+ }
+
+ delete clefPixmap;
+ return makeCanvasPixmap(m_pointZero);
+}
+
+int
+NotePixmapFactory::getClefAndKeyWidth(const Key &key, const Clef &clef)
+{
+ std::vector<int> ah = key.getAccidentalHeights(clef);
+ Accidental accidental = key.isSharp() ? Sharp : Flat;
+ NoteCharacter plain = getCharacter(m_style->getClefCharName(clef),
+ PlainColour, false);
+
+ int clefWidth = plain.getWidth();
+ int accWidth = getAccidentalWidth(accidental);
+ int maxDelta = getAccidentalWidth(Sharp);
+
+ int width = clefWidth + 2 * maxDelta + ah.size() * accWidth;
+
+ return width;
+}
+
+QCanvasPixmap*
+NotePixmapFactory::makeTrackHeaderPixmap(
+ int width, int height, TrackHeader *header)
+{
+
+ height -= 4; // Make room to the label frame :
+ // 4 = 2 * (margin + lineWidth)
+
+ createPixmapAndMask(width, height);
+
+ int lw = getLineSpacing();
+ int h;
+ QColor colour;
+ int maxDelta = getAccidentalWidth(Sharp);
+
+ // Staff Y position inside the whole header
+ int offset = (height - 10 * lw -1) / 2;
+
+ // Draw staff lines
+ m_p->painter().setPen(QPen(Qt::black, getStaffLineThickness()));
+ for (h = 0; h <= 8; h += 2) {
+ int y = (lw * 3) + ((8 - h) * lw) / 2;
+ m_p->drawLine(maxDelta/2, y + offset, m_generatedWidth - maxDelta/2, y + offset);
+ }
+
+ if (header->isAClefToDraw()) {
+ const Clef &clef = header->getClef();
+ // TODO : use colours from GUIPalette
+ colour = header->isClefInconsistent() ? Qt::red : Qt::black;
+
+ int hue, sat, val;
+ colour.getHsv(&hue, &sat, &val);
+ NoteCharacter clefChar = m_font->getCharacterColoured
+ (m_style->getClefCharName(clef),
+ hue, val, NoteFont::Screen, false);
+
+ // Draw clef
+ h = clef.getAxisHeight();
+ int y = (lw * 3) + ((8 - h) * lw) / 2;
+ m_p->drawNoteCharacter(maxDelta,
+ y - clefChar.getHotspot().y() + offset, clefChar);
+
+ // If necessary, write 8 or 15 above or under the clef
+ int oct = clef.getOctaveOffset();
+ if (oct != 0) {
+
+ int adjustedOctave = (8 * (oct < 0 ? -oct : oct));
+ if (adjustedOctave > 8)
+ adjustedOctave--;
+ else if (adjustedOctave < 8)
+ adjustedOctave++;
+
+ QString text = QString("%1").arg(adjustedOctave);
+ QRect rect = m_clefOttavaFontMetrics.boundingRect(text);
+
+ m_p->painter().setPen(colour);
+
+ m_p->painter().setFont(m_clefOttavaFont);
+ // m_p->maskPainter().setFont(m_clefOttavaFont);
+ int xpos = maxDelta + clefChar.getWidth() / 2 - rect.width() / 2;
+ int ypos = y - clefChar.getHotspot().y() + offset
+ + (oct < 0 ? clefChar.getHeight() + rect.height() - 1 : - rect.height() / 3);
+ m_p->drawText(xpos, ypos, text);
+ }
+
+ // TODO : use colours from GUIPalette
+ colour = header->isKeyInconsistent() ? Qt::red : Qt::black;
+
+
+ // Draw the key signature if any
+
+ const Key &key = header->getKey();
+ std::vector<int> ah = key.getAccidentalHeights(clef);
+
+ CharName charName = key.isSharp() ?
+ NoteCharacterNames::SHARP :
+ NoteCharacterNames::FLAT;
+
+ colour.getHsv(&hue, &sat, &val);
+ NoteCharacter accident = m_font->getCharacterColoured(charName,
+ hue, val, NoteFont::Screen, false);
+
+ QPoint hotspot(m_font->getHotspot(charName));
+ int delta = accident.getWidth() - hotspot.x();
+
+ int x = clefChar.getWidth() + maxDelta;
+ for (unsigned int i = 0; i < ah.size(); ++i) {
+ h = ah[i];
+ y = (lw * 3) + ((8 - h) * lw) / 2 - hotspot.y() + offset;
+ m_p->drawNoteCharacter(x, y, accident);
+
+ x += delta;
+ }
+
+ }
+
+ m_p->painter().setFont(m_trackHeaderFont);
+ // m_p->maskPainter().setFont(m_trackHeaderFont);
+
+ QString text;
+ QString textLine;
+
+ int charHeight = m_trackHeaderFontMetrics.height();
+ int charWidth = m_trackHeaderFontMetrics.maxWidth();
+
+ const QString transposeText = header->getTransposeText();
+ QRect bounds = m_trackHeaderBoldFontMetrics.boundingRect(transposeText);
+ int transposeWidth = bounds.width();
+
+
+ // Write upper text (track name and track label)
+
+ m_p->painter().setPen(Qt::black);
+ text = header->getUpperText();
+ int numberOfTextLines = header->getNumberOfTextLines();
+
+ for (int l=1; l<=numberOfTextLines; l++) {
+ int upperTextY = charHeight + (l - 1) * getTrackHeaderTextLineSpacing();
+ if (l == numberOfTextLines) {
+ int transposeSpace = transposeWidth ? transposeWidth + charWidth / 4 : 0;
+ textLine = getOneLine(text, width - transposeSpace - charWidth / 2);
+ if (!text.isEmpty()) {
+ // String too long : cut it and replace last character by dots
+ int len = textLine.length();
+ if (len > 1) textLine.replace(len - 1, 1, i18n("..."));
+ }
+ } else {
+ textLine = getOneLine(text, width - charWidth / 2);
+ }
+ if (textLine.isEmpty()) break;
+ m_p->drawText(charWidth / 4, upperTextY, textLine);
+ }
+
+
+ // Write transposition text
+
+ // TODO : use colours from GUIPalette
+ colour = header->isTransposeInconsistent() ? Qt::red : Qt::black;
+ m_p->painter().setFont(m_trackHeaderBoldFont);
+ // m_p->maskPainter().setFont(m_trackHeaderBoldFont);
+ m_p->painter().setPen(colour);
+
+ m_p->drawText(width - transposeWidth - charWidth / 4,
+ charHeight
+ + (numberOfTextLines - 1) * getTrackHeaderTextLineSpacing(),
+ transposeText);
+
+
+ // Write lower text (segment label)
+
+ // TODO : use colours from GUIPalette
+ colour = header->isLabelInconsistent() ? Qt::red : Qt::black;
+ m_p->painter().setFont(m_trackHeaderFont);
+ // m_p->maskPainter().setFont(m_trackHeaderFont);
+
+ m_p->painter().setPen(colour);
+ text = header->getLowerText();
+
+ for (int l=1; l<=numberOfTextLines; l++) {
+ int lowerTextY = m_generatedHeight - 4 // -4 : adjust
+ - (numberOfTextLines - l) * getTrackHeaderTextLineSpacing();
+
+ QString textLine = getOneLine(text, width - charWidth / 2);
+ if (textLine.isEmpty()) break;
+
+ if ((l == numberOfTextLines) && !text.isEmpty()) {
+ // String too long : cut it and replace last character by dots
+ int len = textLine.length();
+ if (len > 1) textLine.replace(len - 1, 1, i18n("..."));
+ }
+
+ m_p->drawText(charWidth / 4, lowerTextY, textLine);
+ }
+
+ return makeCanvasPixmap(m_pointZero, true);
+}
+
+int
+NotePixmapFactory::getTrackHeaderNTL(int height)
+{
+ int clefMaxHeight = 12 * getLineSpacing();
+ int textLineHeight = getTrackHeaderTextLineSpacing();
+ int numberOfLines = ((height - clefMaxHeight) / 2) / textLineHeight;
+ return (numberOfLines > 0) ? numberOfLines : 1;
+}
+
+int
+NotePixmapFactory::getTrackHeaderTextWidth(QString str)
+{
+ QRect bounds = m_trackHeaderFontMetrics.boundingRect(str);
+ return bounds.width();
+}
+
+int
+NotePixmapFactory::getTrackHeaderTextLineSpacing()
+{
+ // 3/2 is some arbitrary line spacing
+ return m_trackHeaderFont.pixelSize() * 3 / 2;
+}
+
+QString
+NotePixmapFactory::getOneLine(QString &text, int width)
+{
+ QString str;
+ int n;
+
+ // Immediately stop if string is empty or only contains white spaces ...
+ if (text.stripWhiteSpace().isEmpty()) return QString("");
+
+ // ... or if width is too small.
+ if (width < m_trackHeaderFontMetrics.boundingRect(text.left(1)).width())
+ return QString("");
+
+ // Get a first approx. string length
+ int totalLength = text.length();
+ n = totalLength * width / getTrackHeaderTextWidth(text) + 1;
+ if (n > totalLength) n = totalLength;
+
+ // Verify string size is less than width then correct it if necessary
+ while (((getTrackHeaderTextWidth(text.left(n))) > width) && n) n--;
+
+ if (n == 0) {
+ str = text;
+ text = QString("");
+ } else {
+ str = text.left(n);
+ text.remove(0, n);
+ }
+
+ return str;
+}
+
+QCanvasPixmap*
+NotePixmapFactory::makePitchDisplayPixmap(int p, const Clef &clef,
+ bool useSharps)
+{
+ NotationRules rules;
+
+ Pitch pitch(p);
+ Accidental accidental(pitch.getAccidental(useSharps));
+ NotePixmapParameters params(Note::Crotchet, 0, accidental);
+
+ QCanvasPixmap* clefPixmap = makeClefPixmap(clef);
+
+ int lw = getLineSpacing();
+ int width = getClefWidth(Clef::Bass) + 10 * getNoteBodyWidth();
+
+ int h = pitch.getHeightOnStaff(clef, useSharps);
+ params.setStemGoesUp(rules.isStemUp(h));
+
+ if (h < -1)
+ params.setStemLength(lw * (4 - h) / 2);
+ else if (h > 9)
+ params.setStemLength(lw * (h - 4) / 2);
+ if (h > 8)
+ params.setLegerLines(h - 8);
+ else if (h < 0)
+ params.setLegerLines(h);
+
+ params.setIsOnLine(h % 2 == 0);
+ params.setSelected(m_selected);
+
+ QCanvasPixmap *notePixmap = makeNotePixmap(params);
+
+ int pixmapHeight = lw * 12 + 1;
+ int yoffset = lw * 3;
+ if (h > 12) {
+ pixmapHeight += 6 * lw;
+ yoffset += 6 * lw;
+ } else if (h < -4) {
+ pixmapHeight += 6 * lw;
+ }
+
+ createPixmapAndMask(width, pixmapHeight);
+
+ int x =
+ getClefWidth(Clef::Bass) + 5 * getNoteBodyWidth() -
+ getAccidentalWidth(accidental);
+ int y = yoffset + ((8 - h) * lw) / 2 - notePixmap->offsetY();
+ m_p->drawPixmap(x, y, *notePixmap);
+
+ h = clef.getAxisHeight();
+ x = 3 * getNoteBodyWidth();
+ y = yoffset + ((8 - h) * lw) / 2;
+ m_p->drawPixmap(x, y - clefPixmap->offsetY(), *clefPixmap);
+
+ for (h = 0; h <= 8; h += 2) {
+ y = yoffset + ((8 - h) * lw) / 2;
+ m_p->drawLine(x / 2, y, m_generatedWidth - x / 2, y);
+ }
+
+ delete clefPixmap;
+ delete notePixmap;
+
+ return makeCanvasPixmap(m_pointZero);
+}
+
+QCanvasPixmap*
+NotePixmapFactory::makePitchDisplayPixmap(int p, const Clef &clef,
+ int octave, int step)
+{
+ NotationRules rules;
+
+ Pitch pitch(step, octave, p, 0);
+ Accidental accidental = pitch.getDisplayAccidental(Key("C major"));
+ NotePixmapParameters params(Note::Crotchet, 0, accidental);
+
+ QCanvasPixmap* clefPixmap = makeClefPixmap(clef);
+
+ int lw = getLineSpacing();
+ int width = getClefWidth(Clef::Bass) + 10 * getNoteBodyWidth();
+
+ int h = pitch.getHeightOnStaff
+ (clef,
+ Key("C major"));
+ params.setStemGoesUp(rules.isStemUp(h));
+
+ if (h < -1)
+ params.setStemLength(lw * (4 - h) / 2);
+ else if (h > 9)
+ params.setStemLength(lw * (h - 4) / 2);
+ if (h > 8)
+ params.setLegerLines(h - 8);
+ else if (h < 0)
+ params.setLegerLines(h);
+
+ params.setIsOnLine(h % 2 == 0);
+ params.setSelected(m_selected);
+
+ QCanvasPixmap *notePixmap = makeNotePixmap(params);
+
+ int pixmapHeight = lw * 12 + 1;
+ int yoffset = lw * 3;
+ if (h > 12) {
+ pixmapHeight += 6 * lw;
+ yoffset += 6 * lw;
+ } else if (h < -4) {
+ pixmapHeight += 6 * lw;
+ }
+
+ createPixmapAndMask(width, pixmapHeight);
+
+ int x =
+ getClefWidth(Clef::Bass) + 5 * getNoteBodyWidth() -
+ getAccidentalWidth(accidental);
+ int y = yoffset + ((8 - h) * lw) / 2 - notePixmap->offsetY();
+ m_p->drawPixmap(x, y, *notePixmap);
+
+ h = clef.getAxisHeight();
+ x = 3 * getNoteBodyWidth();
+ y = yoffset + ((8 - h) * lw) / 2;
+ m_p->drawPixmap(x, y - clefPixmap->offsetY(), *clefPixmap);
+
+ for (h = 0; h <= 8; h += 2) {
+ y = yoffset + ((8 - h) * lw) / 2;
+ m_p->drawLine(x / 2, y, m_generatedWidth - x / 2, y);
+ }
+
+ delete clefPixmap;
+ delete notePixmap;
+
+ return makeCanvasPixmap(m_pointZero);
+}
+
+QCanvasPixmap*
+NotePixmapFactory::makeHairpinPixmap(int length, bool isCrescendo)
+{
+ Profiler profiler("NotePixmapFactory::makeHairpinPixmap");
+ drawHairpinAux(length, isCrescendo, 0, 0, 0);
+ return makeCanvasPixmap(QPoint(0, m_generatedHeight / 2));
+}
+
+void
+NotePixmapFactory::drawHairpin(int length, bool isCrescendo,
+ QPainter &painter, int x, int y)
+{
+ Profiler profiler("NotePixmapFactory::drawHairpin");
+ m_inPrinterMethod = true;
+ drawHairpinAux(length, isCrescendo, &painter, x, y);
+ m_inPrinterMethod = false;
+}
+
+void
+NotePixmapFactory::drawHairpinAux(int length, bool isCrescendo,
+ QPainter *painter, int x, int y)
+{
+ int nbh = getNoteBodyHeight();
+ int nbw = getNoteBodyWidth();
+
+ int height = (int)(((double)nbh / (double)(nbw * 40)) * length) + nbh;
+ int thickness = getStaffLineThickness() * 3 / 2;
+
+ // NOTATION_DEBUG << "NotePixmapFactory::makeHairpinPixmap: mapped length " << length << " to height " << height << " (nbh = " << nbh << ", nbw = " << nbw << ")" << endl;
+
+ if (height < nbh)
+ height = nbh;
+ if (height > nbh*2)
+ height = nbh * 2;
+
+ height += thickness - 1;
+
+ if (painter) {
+ painter->save();
+ m_p->beginExternal(painter);
+ painter->translate(x, y - height / 2);
+ } else {
+ createPixmapAndMask(length, height);
+ }
+
+ if (m_selected) {
+ m_p->painter().setPen(GUIPalette::getColour(GUIPalette::SelectedElement));
+ }
+
+ int left = 1, right = length - 2 * nbw / 3 + 1;
+
+ bool smooth = m_font->isSmooth();
+
+ if (isCrescendo) {
+ drawShallowLine(left, height / 2 - 1,
+ right, height - thickness - 1, thickness, smooth);
+ drawShallowLine(left, height / 2 - 1, right, 0, thickness, smooth);
+ } else {
+ drawShallowLine(left, 0, right, height / 2 - 1, thickness, smooth);
+ drawShallowLine(left, height - thickness - 1,
+ right, height / 2 - 1, thickness, smooth);
+ }
+
+ m_p->painter().setPen(Qt::black);
+
+ if (painter) {
+ painter->restore();
+ }
+}
+
+QCanvasPixmap*
+NotePixmapFactory::makeSlurPixmap(int length, int dy, bool above, bool phrasing)
+{
+ Profiler profiler("NotePixmapFactory::makeSlurPixmap");
+
+ //!!! could remove "height > 5" requirement if we did a better job of
+ // sizing so that any horizontal part was rescaled down to exactly
+ // 1 pixel wide instead of blurring
+ bool smooth = m_font->isSmooth() && getNoteBodyHeight() > 5;
+ QPoint hotspot;
+ if (length < getNoteBodyWidth()*2)
+ length = getNoteBodyWidth() * 2;
+ drawSlurAux(length, dy, above, smooth, false, phrasing, hotspot, 0, 0, 0);
+
+ m_p->end();
+
+ if (smooth) {
+
+ QImage i = m_generatedPixmap->convertToImage();
+ if (i.depth() == 1)
+ i = i.convertDepth(32);
+ i = i.smoothScale(i.width() / 2, i.height() / 2);
+
+ delete m_generatedPixmap;
+ delete m_generatedMask;
+ QPixmap newPixmap(i);
+ QCanvasPixmap *p = new QCanvasPixmap(newPixmap, hotspot);
+ p->setMask(PixmapFunctions::generateMask(newPixmap,
+ Qt::white.rgb()));
+ return p;
+
+ } else {
+
+ QCanvasPixmap *p = new QCanvasPixmap(*m_generatedPixmap, hotspot);
+ p->setMask(PixmapFunctions::generateMask(*m_generatedPixmap,
+ Qt::white.rgb()));
+ delete m_generatedPixmap;
+ delete m_generatedMask;
+ return p;
+ }
+}
+
+void
+NotePixmapFactory::drawSlur(int length, int dy, bool above, bool phrasing,
+ QPainter &painter, int x, int y)
+{
+ Profiler profiler("NotePixmapFactory::drawSlur");
+ QPoint hotspot;
+ m_inPrinterMethod = true;
+ if (length < getNoteBodyWidth()*2)
+ length = getNoteBodyWidth() * 2;
+ drawSlurAux(length, dy, above, false, false, phrasing, hotspot, &painter, x, y);
+ m_inPrinterMethod = false;
+}
+
+void
+NotePixmapFactory::drawSlurAux(int length, int dy, bool above,
+ bool smooth, bool flat, bool phrasing,
+ QPoint &hotspot, QPainter *painter, int x, int y)
+{
+ QWMatrix::TransformationMode mode = QWMatrix::transformationMode();
+ QWMatrix::setTransformationMode(QWMatrix::Points);
+
+ int thickness = getStaffLineThickness() * 2;
+ if (phrasing)
+ thickness = thickness * 3 / 4;
+ int nbh = getNoteBodyHeight(), nbw = getNoteBodyWidth();
+
+ // Experiment with rotating the painter rather than the control points.
+ double theta = 0;
+ bool rotate = false;
+ if (dy != 0) {
+ // We have opposite (dy) and adjacent (length).
+ theta = atan(double(dy) / double(length)) * 180.0 / M_PI;
+ // NOTATION_DEBUG << "slur: dy is " << dy << ", length " << length << ", rotating through " << theta << endl;
+ rotate = true;
+ }
+
+ // draw normal slur for very slopey phrasing slur:
+ if (theta < -5 || theta > 5)
+ phrasing = false;
+
+ int y0 = 0, my = 0;
+
+ float noteLengths = float(length) / nbw;
+ if (noteLengths < 1)
+ noteLengths = 1;
+
+ my = int(0 - nbh * sqrt(noteLengths) / 2);
+ if (flat)
+ my = my * 2 / 3;
+ else if (phrasing)
+ my = my * 3 / 4;
+ if (!above)
+ my = -my;
+
+ bool havePixmap = false;
+ QPoint topLeft, bottomRight;
+
+ if (smooth)
+ thickness += 2;
+
+ for (int i = 0; i < thickness; ++i) {
+
+ Spline::PointList pl;
+
+ if (!phrasing) {
+ pl.push_back(QPoint(length / 6, my));
+ pl.push_back(QPoint(length - length / 6, my));
+ } else {
+ pl.push_back(QPoint(abs(my) / 4, my / 3));
+ pl.push_back(QPoint(length / 6, my));
+
+ if (theta > 1) {
+ pl.push_back(QPoint(length * 3 / 8, my * 3 / 2));
+ } else if (theta < -1) {
+ pl.push_back(QPoint(length * 5 / 8, my * 3 / 2));
+ } else {
+ pl.push_back(QPoint(length / 2, my * 4 / 3));
+ }
+
+ pl.push_back(QPoint(length - length / 6, my));
+ pl.push_back(QPoint(length - abs(my) / 4, my / 3));
+ }
+
+ Spline::PointList *polyPoints = Spline::calculate
+ (QPoint(0, y0), QPoint(length - 1, y0), pl, topLeft, bottomRight);
+
+ if (!havePixmap) {
+ int width = bottomRight.x() - topLeft.x();
+ int height = bottomRight.y() - topLeft.y() + thickness - 1 + abs(dy);
+ hotspot = QPoint(0, -topLeft.y() + (dy < 0 ? -dy : 0));
+
+ // NOTATION_DEBUG << "slur: bottomRight (" << bottomRight.x() << "," << bottomRight.y() << "), topLeft (" << topLeft.x() << "," << topLeft.y() << "), width " << width << ", height " << height << ", hotspot (" << hotspot.x() << "," << hotspot.y() << "), dy " << dy << ", thickness " << thickness << endl;
+
+ if (painter) {
+
+ // This conditional is because we're also called with
+ // a painter arg from non-printer drawTie. It's a big
+ // hack.
+
+ if (m_inPrinterMethod) {
+ painter->save();
+ m_p->beginExternal(painter);
+ painter->translate(x, y);
+ if (rotate)
+ painter->rotate(theta);
+ } else {
+ m_p->painter().save();
+ m_p->maskPainter().save();
+ m_p->painter().translate(x, y);
+ m_p->maskPainter().translate(x, y);
+ if (rotate) {
+ m_p->painter().rotate(theta);
+ m_p->maskPainter().rotate(theta);
+ }
+ }
+
+ } else {
+ createPixmapAndMask(smooth ? width*2 + 1 : width,
+ smooth ? height*2 + thickness*2 : height + thickness,
+ width, height);
+
+ QWMatrix m;
+ if (smooth)
+ m.translate(2 * hotspot.x(), 2 * hotspot.y());
+ else
+ m.translate(hotspot.x(), hotspot.y());
+ m.rotate(theta);
+ m_p->painter().setWorldMatrix(m);
+ m_p->maskPainter().setWorldMatrix(m);
+ }
+
+ if (m_selected)
+ m_p->painter().setPen(GUIPalette::getColour(GUIPalette::SelectedElement));
+ else if (m_shaded) {
+ m_p->painter().setPen(Qt::gray);
+ }
+ havePixmap = true;
+ }
+ /*
+ for (int j = 0; j < pl.size(); ++j) {
+ if (smooth) {
+ m_p->drawPoint(pl[j].x()*2, pl[j].y()*2);
+ } else {
+ m_p->drawPoint(pl[j].x(), pl[j].y());
+ }
+ }
+ */
+ int ppc = polyPoints->size();
+ QPointArray qp(ppc);
+
+ for (int j = 0; j < ppc; ++j) {
+ qp.setPoint(j, (*polyPoints)[j].x(), (*polyPoints)[j].y());
+ }
+
+ delete polyPoints;
+
+ if (!smooth || (i > 0 && i < thickness - 1)) {
+ if (smooth) {
+ for (int j = 0; j < ppc; ++j) {
+ qp.setPoint(j, qp.point(j).x()*2, qp.point(j).y()*2);
+ }
+ m_p->drawPolyline(qp);
+ for (int j = 0; j < ppc; ++j) {
+ qp.setPoint(j, qp.point(j).x(), qp.point(j).y() + 1);
+ }
+ m_p->drawPolyline(qp);
+ } else {
+ m_p->drawPolyline(qp);
+ }
+ }
+
+ if (above) {
+ ++my;
+ if (i % 2)
+ ++y0;
+ } else {
+ --my;
+ if (i % 2)
+ --y0;
+ }
+ }
+
+ if (m_selected) {
+ m_p->painter().setPen(Qt::black);
+ }
+
+ QWMatrix::setTransformationMode(mode);
+
+ if (painter) {
+ painter->restore();
+ if (!m_inPrinterMethod)
+ m_p->maskPainter().restore();
+ }
+}
+
+QCanvasPixmap*
+NotePixmapFactory::makeOttavaPixmap(int length, int octavesUp)
+{
+ Profiler profiler("NotePixmapFactory::makeOttavaPixmap");
+ m_inPrinterMethod = false;
+ drawOttavaAux(length, octavesUp, 0, 0, 0);
+ return makeCanvasPixmap(QPoint(0, m_generatedHeight - 1));
+}
+
+void
+NotePixmapFactory::drawOttava(int length, int octavesUp,
+ QPainter &painter, int x, int y)
+{
+ Profiler profiler("NotePixmapFactory::drawOttava");
+ m_inPrinterMethod = true;
+ drawOttavaAux(length, octavesUp, &painter, x, y);
+ m_inPrinterMethod = false;
+}
+
+void
+NotePixmapFactory::drawOttavaAux(int length, int octavesUp,
+ QPainter *painter, int x, int y)
+{
+ int height = m_ottavaFontMetrics.height();
+ int backpedal = 0;
+ QString label;
+ QRect r;
+
+ if (octavesUp == 2 || octavesUp == -2) {
+ label = "15ma ";
+ backpedal = m_ottavaFontMetrics.width("15") / 2;
+ } else {
+ label = "8va ";
+ backpedal = m_ottavaFontMetrics.width("8") / 2;
+ }
+
+ int width = length + backpedal;
+
+ if (painter) {
+ painter->save();
+ m_p->beginExternal(painter);
+ painter->translate(x - backpedal, y - height);
+ } else {
+ NOTATION_DEBUG << "NotePixmapFactory::drawOttavaAux: making pixmap and mask " << width << "x" << height << endl;
+ createPixmapAndMask(width, height);
+ }
+
+ int thickness = getStemThickness();
+ QPen pen(Qt::black, thickness, Qt::DotLine);
+
+ if (m_selected) {
+ m_p->painter().setPen(GUIPalette::getColour(GUIPalette::SelectedElement));
+ pen.setColor(GUIPalette::getColour(GUIPalette::SelectedElement));
+ } else if (m_shaded) {
+ m_p->painter().setPen(Qt::gray);
+ pen.setColor(Qt::gray);
+ }
+
+ m_p->painter().setFont(m_ottavaFont);
+ if (!m_inPrinterMethod)
+ m_p->maskPainter().setFont(m_ottavaFont);
+
+ m_p->drawText(0, m_ottavaFontMetrics.ascent(), label);
+
+ m_p->painter().setPen(pen);
+ // if (!m_inPrinterMethod) m_p->maskPainter().setPen(pen);
+
+ int x0 = m_ottavaFontMetrics.width(label) + thickness;
+ int x1 = width - thickness;
+ int y0 = m_ottavaFontMetrics.ascent() * 2 / 3 - thickness / 2;
+ int y1 = (octavesUp < 0 ? 0 : m_ottavaFontMetrics.ascent());
+
+ NOTATION_DEBUG << "NotePixmapFactory::drawOttavaAux: drawing " << x0 << "," << y0 << " to " << x1 << "," << y0 << ", thickness " << thickness << endl;
+
+ m_p->drawLine(x0, y0, x1, y0);
+
+ pen.setStyle(Qt::SolidLine);
+ m_p->painter().setPen(pen);
+ // if (!m_inPrinterMethod) m_p->maskPainter().setPen(pen);
+
+ NOTATION_DEBUG << "NotePixmapFactory::drawOttavaAux: drawing " << x1 << "," << y0 << " to " << x1 << "," << y1 << ", thickness " << thickness << endl;
+
+ m_p->drawLine(x1, y0, x1, y1);
+
+ m_p->painter().setPen(QPen());
+ if (!m_inPrinterMethod)
+ m_p->maskPainter().setPen(QPen());
+
+ if (painter) {
+ painter->restore();
+ }
+}
+
+void
+NotePixmapFactory::drawBracket(int length, bool left, bool curly, int x, int y)
+{
+ // curly mode not yet implemented
+
+ int thickness = getStemThickness() * 2;
+
+ int m1 = length / 6;
+ int m2 = length - length / 6 - 1;
+
+ int off0 = 0, moff = 0;
+
+ int nbh = getNoteBodyHeight(), nbw = getNoteBodyWidth();
+ float noteLengths = float(length) / nbw;
+ if (noteLengths < 1)
+ noteLengths = 1;
+ moff = int(nbh * sqrt(noteLengths) / 2);
+ moff = moff * 2 / 3;
+
+ if (left)
+ moff = -moff;
+
+ QPoint topLeft, bottomRight;
+
+ for (int i = 0; i < thickness; ++i) {
+
+ Spline::PointList pl;
+ pl.push_back(QPoint((int)moff, m1));
+ pl.push_back(QPoint((int)moff, m2));
+ /*
+ NOTATION_DEBUG << "bracket spline controls: " << moff << "," << m1
+ << ", " << moff << "," << m2 << "; end points "
+ << off0 << ",0, " << off0 << "," << length-1
+ << endl;
+ */
+ Spline::PointList *polyPoints = Spline::calculate
+ (QPoint(off0, 0), QPoint(off0, length - 1), pl, topLeft, bottomRight);
+
+ int ppc = polyPoints->size();
+ QPointArray qp(ppc);
+ /*
+ NOTATION_DEBUG << "bracket spline polypoints: " << endl;
+ for (int j = 0; j < ppc; ++j) {
+ NOTATION_DEBUG << (*polyPoints)[j].x() << "," << (*polyPoints)[j].y() << endl;
+ }
+ */
+
+ for (int j = 0; j < ppc; ++j) {
+ qp.setPoint(j, x + (*polyPoints)[j].x(), y + (*polyPoints)[j].y());
+ }
+
+ delete polyPoints;
+
+ m_p->drawPolyline(qp);
+
+ if (!left) {
+ ++moff;
+ if (i % 2)
+ ++off0;
+ } else {
+ --moff;
+ if (i % 2)
+ --off0;
+ }
+ }
+}
+
+QCanvasPixmap*
+NotePixmapFactory::makeTimeSigPixmap(const TimeSignature& sig)
+{
+ Profiler profiler("NotePixmapFactory::makeTimeSigPixmap");
+
+ if (sig.isCommon()) {
+
+ NoteCharacter character;
+
+ CharName charName;
+ if (sig.getNumerator() == 2) {
+ charName = NoteCharacterNames::CUT_TIME;
+ } else {
+ charName = NoteCharacterNames::COMMON_TIME;
+ }
+
+ if (getCharacter(charName, character, PlainColour, false)) {
+ createPixmapAndMask(character.getWidth(), character.getHeight());
+ m_p->drawNoteCharacter(0, 0, character);
+ return makeCanvasPixmap(QPoint(0, character.getHeight() / 2));
+ }
+
+ QString c("c");
+ QRect r = m_bigTimeSigFontMetrics.boundingRect(c);
+
+ int dy = getLineSpacing() / 4;
+ createPixmapAndMask(r.width(), r.height() + dy*2);
+
+ if (m_selected) {
+ m_p->painter().setPen(GUIPalette::getColour(GUIPalette::SelectedElement));
+ } else if (m_shaded) {
+ m_p->painter().setPen(Qt::gray);
+ }
+
+ m_p->painter().setFont(m_bigTimeSigFont);
+ if (!m_inPrinterMethod)
+ m_p->maskPainter().setFont(m_bigTimeSigFont);
+
+ m_p->drawText(0, r.height() + dy, c);
+
+ if (sig.getNumerator() == 2) { // cut common
+
+ int x = r.width() * 3 / 5 - getStemThickness();
+
+ for (int i = 0; i < getStemThickness() * 2; ++i, ++x) {
+ m_p->drawLine(x, 0, x, r.height() + dy*2 - 1);
+ }
+ }
+
+ m_p->painter().setPen(Qt::black);
+ return makeCanvasPixmap(QPoint(0, r.height() / 2 + dy));
+
+ } else {
+
+ int numerator = sig.getNumerator(),
+ denominator = sig.getDenominator();
+
+ QString numS, denomS;
+
+ numS.setNum(numerator);
+ denomS.setNum(denominator);
+
+ NoteCharacter character;
+ if (getCharacter(m_style->getTimeSignatureDigitName(0), character,
+ PlainColour, false)) {
+
+ // if the 0 digit exists, we assume 1-9 also all exist
+ // and all have the same width
+
+ int numW = character.getWidth() * numS.length();
+ int denomW = character.getWidth() * denomS.length();
+
+ int width = std::max(numW, denomW);
+ int height = getLineSpacing() * 4 - getStaffLineThickness();
+
+ createPixmapAndMask(width, height);
+
+ for (unsigned int i = 0; i < numS.length(); ++i) {
+ int x = width - (width - numW) / 2 - (i + 1) * character.getWidth();
+ int y = height / 4 - (character.getHeight() / 2);
+ NoteCharacter charCharacter = getCharacter
+ (m_style->getTimeSignatureDigitName(numerator % 10),
+ PlainColour, false);
+ m_p->drawNoteCharacter(x, y, charCharacter);
+ numerator /= 10;
+ }
+
+ for (unsigned int i = 0; i < denomS.length(); ++i) {
+ int x = width - (width - denomW) / 2 - (i + 1) * character.getWidth();
+ int y = height - height / 4 - (character.getHeight() / 2);
+ NoteCharacter charCharacter = getCharacter
+ (m_style->getTimeSignatureDigitName(denominator % 10),
+ PlainColour, false);
+ m_p->drawNoteCharacter(x, y, charCharacter);
+ denominator /= 10;
+ }
+
+ return makeCanvasPixmap(QPoint(0, height / 2));
+ }
+
+ QRect numR = m_timeSigFontMetrics.boundingRect(numS);
+ QRect denomR = m_timeSigFontMetrics.boundingRect(denomS);
+ int width = std::max(numR.width(), denomR.width()) + 2;
+ int x;
+
+ createPixmapAndMask(width, denomR.height() * 2 + getNoteBodyHeight());
+
+ if (m_selected) {
+ m_p->painter().setPen(GUIPalette::getColour(GUIPalette::SelectedElement));
+ } else if (m_shaded) {
+ m_p->painter().setPen(Qt::gray);
+ }
+
+ m_p->painter().setFont(m_timeSigFont);
+ if (!m_inPrinterMethod)
+ m_p->maskPainter().setFont(m_timeSigFont);
+
+ x = (width - numR.width()) / 2 - 1;
+ m_p->drawText(x, denomR.height(), numS);
+
+ x = (width - denomR.width()) / 2 - 1;
+ m_p->drawText(x, denomR.height() * 2 + (getNoteBodyHeight() / 2) - 1, denomS);
+
+ m_p->painter().setPen(Qt::black);
+
+ return makeCanvasPixmap(QPoint(0, denomR.height() +
+ (getNoteBodyHeight() / 4) - 1),
+ true);
+ }
+}
+
+int NotePixmapFactory::getTimeSigWidth(const TimeSignature &sig) const
+{
+ if (sig.isCommon()) {
+
+ QRect r(m_bigTimeSigFontMetrics.boundingRect("c"));
+ return r.width() + 2;
+
+ } else {
+
+ int numerator = sig.getNumerator(),
+ denominator = sig.getDenominator();
+
+ QString numS, denomS;
+
+ numS.setNum(numerator);
+ denomS.setNum(denominator);
+
+ QRect numR = m_timeSigFontMetrics.boundingRect(numS);
+ QRect denomR = m_timeSigFontMetrics.boundingRect(denomS);
+ int width = std::max(numR.width(), denomR.width()) + 2;
+
+ return width;
+ }
+}
+
+QFont
+NotePixmapFactory::getTextFont(const Text &text) const
+{
+ std::string type(text.getTextType());
+ TextFontCache::iterator i = m_textFontCache.find(type.c_str());
+ if (i != m_textFontCache.end())
+ return i->second;
+
+ /*
+ * Text types:
+ *
+ * UnspecifiedType: Nothing known, use small roman
+ * StaffName: Large roman, to left of start of staff
+ * ChordName: Not normally shown in score, use small roman
+ * KeyName: Not normally shown in score, use small roman
+ * Lyric: Small roman, below staff and dynamic texts
+ * Chord: Small bold roman, above staff
+ * Dynamic: Small italic, below staff
+ * Direction: Large roman, above staff (by barline?)
+ * LocalDirection: Small bold italic, below staff (by barline?)
+ * Tempo: Large bold roman, above staff
+ * LocalTempo: Small bold roman, above staff
+ * Annotation: Very small sans-serif, in a yellow box
+ * LilyPondDirective: Very small sans-serif, in a green box
+ */
+
+ int weight = QFont::Normal;
+ bool italic = false;
+ bool large = false;
+ bool tiny = false;
+ bool serif = true;
+
+ if (type == Text::Tempo ||
+ type == Text::LocalTempo ||
+ type == Text::LocalDirection ||
+ type == Text::Chord) {
+ weight = QFont::Bold;
+ }
+
+ if (type == Text::Dynamic ||
+ type == Text::LocalDirection) {
+ italic = true;
+ }
+
+ if (type == Text::StaffName ||
+ type == Text::Direction ||
+ type == Text::Tempo) {
+ large = true;
+ }
+
+ if (type == Text::Annotation ||
+ type == Text::LilyPondDirective) {
+ serif = false;
+ tiny = true;
+ }
+
+ KConfig* config = kapp->config();
+
+ QFont textFont;
+
+ if (serif) {
+ textFont = QFont(defaultSerifFontFamily);
+ textFont = config->readFontEntry("textfont", &textFont);
+ } else {
+ textFont = QFont(defaultSansSerifFontFamily);
+ textFont = config->readFontEntry("sansfont", &textFont);
+ }
+
+ textFont.setStyleStrategy(QFont::StyleStrategy(QFont::PreferDefault |
+ QFont::PreferMatch));
+
+ int size;
+ if (large)
+ size = (getLineSpacing() * 7) / 2;
+ else if (tiny)
+ size = (getLineSpacing() * 4) / 3;
+ else if (serif)
+ size = (getLineSpacing() * 2);
+ else
+ size = (getLineSpacing() * 3) / 2;
+
+ textFont.setPixelSize(size);
+ textFont.setStyleHint(serif ? QFont::Serif : QFont::SansSerif);
+ textFont.setWeight(weight);
+ textFont.setItalic(italic);
+
+ NOTATION_DEBUG << "NotePixmapFactory::getTextFont: requested size " << size
+ << " for type " << type << endl;
+
+ NOTATION_DEBUG << "NotePixmapFactory::getTextFont: returning font '"
+ << textFont.toString() << "' for type " << type.c_str()
+ << " text : " << text.getText().c_str() << endl;
+
+ m_textFontCache[type.c_str()] = textFont;
+ return textFont;
+}
+
+QCanvasPixmap*
+NotePixmapFactory::makeTextPixmap(const Text &text)
+{
+ Profiler profiler("NotePixmapFactory::makeTextPixmap");
+
+ std::string type(text.getTextType());
+
+ if (type == Text::Annotation ||
+ type == Text::LilyPondDirective) {
+ return makeAnnotationPixmap(text, (type == Text::LilyPondDirective));
+ }
+
+ drawTextAux(text, 0, 0, 0);
+ return makeCanvasPixmap(QPoint(2, 2), true);
+}
+
+QCanvasPixmap*
+NotePixmapFactory::makeGuitarChordPixmap(const Guitar::Fingering &fingering,
+ int x,
+ int y)
+{
+ using namespace Guitar;
+ Profiler profiler("NotePixmapFactory::makeGuitarChordPixmap");
+
+ int guitarChordWidth = getLineSpacing() * 6;
+ int guitarChordHeight = getLineSpacing() * 6;
+
+ createPixmapAndMask(guitarChordWidth, guitarChordHeight);
+
+ if (m_selected) {
+ m_p->painter().setPen(GUIPalette::getColour(GUIPalette::SelectedElement));
+ m_p->painter().setBrush(GUIPalette::getColour(GUIPalette::SelectedElement));
+ } else {
+ m_p->painter().setPen(Qt::black);
+ m_p->painter().setBrush(Qt::black);
+ }
+
+ Guitar::NoteSymbols ns(Guitar::Fingering::DEFAULT_NB_STRINGS, FingeringBox::DEFAULT_NB_DISPLAYED_FRETS);
+ Guitar::NoteSymbols::drawFingeringPixmap(fingering, ns, &(m_p->painter()));
+
+ return makeCanvasPixmap(QPoint (x, y), true);
+}
+
+void
+NotePixmapFactory::drawText(const Text &text,
+ QPainter &painter, int x, int y)
+{
+ Profiler profiler("NotePixmapFactory::drawText");
+
+ // NOTATION_DEBUG << "NotePixmapFactory::drawText() " << text.getText().c_str()
+ // << " - type : " << text.getTextType().c_str() << endl;
+
+ std::string type(text.getTextType());
+
+ if (type == Text::Annotation ||
+ type == Text::LilyPondDirective) {
+ QCanvasPixmap *map = makeAnnotationPixmap(text, (type == Text::LilyPondDirective));
+ painter.drawPixmap(x, y, *map);
+ return ;
+ }
+
+ m_inPrinterMethod = true;
+ drawTextAux(text, &painter, x, y);
+ m_inPrinterMethod = false;
+}
+
+void
+NotePixmapFactory::drawTextAux(const Text &text,
+ QPainter *painter, int x, int y)
+{
+ QString s(strtoqstr(text.getText()));
+ QFont textFont(getTextFont(text));
+ QFontMetrics textMetrics(textFont);
+
+ int offset = 2;
+ int width = textMetrics.width(s) + 2 * offset;
+ int height = textMetrics.height() + 2 * offset;
+
+ if (painter) {
+ painter->save();
+ m_p->beginExternal(painter);
+ painter->translate(x - offset, y - offset);
+ } else {
+ createPixmapAndMask(width, height);
+ }
+
+ if (m_selected)
+ m_p->painter().setPen(GUIPalette::getColour(GUIPalette::SelectedElement));
+ else if (m_shaded)
+ m_p->painter().setPen(Qt::gray);
+
+ m_p->painter().setFont(textFont);
+ if (!m_inPrinterMethod)
+ m_p->maskPainter().setFont(textFont);
+
+ m_p->drawText(offset, textMetrics.ascent() + offset, s);
+
+ m_p->painter().setPen(Qt::black);
+
+ if (painter) {
+ painter->restore();
+ }
+}
+
+QCanvasPixmap*
+NotePixmapFactory::makeAnnotationPixmap(const Text &text)
+{
+ return makeAnnotationPixmap(text, false);
+}
+
+QCanvasPixmap*
+NotePixmapFactory::makeAnnotationPixmap(const Text &text, const bool isLilyPondDirective)
+{
+ QString s(strtoqstr(text.getText()));
+
+ QFont textFont(getTextFont(text));
+ QFontMetrics textMetrics(textFont);
+
+ int annotationWidth = getLineSpacing() * 16;
+ int annotationHeight = getLineSpacing() * 6;
+
+ int topGap = getLineSpacing() / 4 + 1;
+ int bottomGap = getLineSpacing() / 3 + 1;
+ int sideGap = getLineSpacing() / 4 + 1;
+
+ QRect r = textMetrics.boundingRect
+ (0, 0, annotationWidth, annotationHeight, Qt::WordBreak, s);
+
+ int pixmapWidth = r.width() + sideGap * 2;
+ int pixmapHeight = r.height() + topGap + bottomGap;
+
+ createPixmapAndMask(pixmapWidth, pixmapHeight);
+
+ if (m_selected)
+ m_p->painter().setPen(GUIPalette::getColour(GUIPalette::SelectedElement));
+ else if (m_shaded)
+ m_p->painter().setPen(Qt::gray);
+
+ m_p->painter().setFont(textFont);
+ if (!m_inPrinterMethod)
+ m_p->maskPainter().setFont(textFont);
+
+ if (isLilyPondDirective) {
+ m_p->painter().setBrush(GUIPalette::getColour(GUIPalette::TextLilyPondDirectiveBackground));
+ } else {
+ m_p->painter().setBrush(GUIPalette::getColour(GUIPalette::TextAnnotationBackground));
+ }
+
+ m_p->drawRect(0, 0, pixmapWidth, pixmapHeight);
+
+ m_p->painter().setBrush(Qt::black);
+ m_p->painter().drawText(QRect(sideGap, topGap,
+ annotationWidth + sideGap,
+ pixmapHeight - bottomGap),
+ Qt::WordBreak, s);
+
+ /* unnecessary following the rectangle draw
+ m_pm.drawText(QRect(sideGap, topGap,
+ annotationWidth + sideGap, annotationHeight + topGap),
+ Qt::WordBreak, s);
+ */
+
+ return makeCanvasPixmap(QPoint(0, 0));
+}
+
+void
+NotePixmapFactory::createPixmapAndMask(int width, int height,
+ int maskWidth, int maskHeight)
+{
+ if (maskWidth < 0)
+ maskWidth = width;
+ if (maskHeight < 0)
+ maskHeight = height;
+
+ m_generatedWidth = width;
+ m_generatedHeight = height;
+ m_generatedPixmap = new QPixmap(width, height);
+ m_generatedMask = new QBitmap(maskWidth, maskHeight);
+
+ static unsigned long total = 0;
+ total += width * height;
+// NOTATION_DEBUG << "createPixmapAndMask: " << width << "x" << height << " (" << (width*height) << " px, " << total << " total)" << endl;
+
+ // clear up pixmap and mask
+ m_generatedPixmap->fill();
+ m_generatedMask->fill(Qt::color0);
+
+ // initiate painting
+ m_p->begin(m_generatedPixmap, m_generatedMask);
+
+ m_p->painter().setPen(Qt::black);
+ m_p->painter().setBrush(Qt::black);
+ m_p->maskPainter().setPen(Qt::white);
+ m_p->maskPainter().setBrush(Qt::white);
+}
+
+QCanvasPixmap*
+NotePixmapFactory::makeCanvasPixmap(QPoint hotspot, bool generateMask)
+{
+ m_p->end();
+
+ QCanvasPixmap* p = new QCanvasPixmap(*m_generatedPixmap, hotspot);
+
+ if (generateMask) {
+ p->setMask(PixmapFunctions::generateMask(*p));
+ } else {
+ p->setMask(*m_generatedMask);
+ }
+
+ delete m_generatedPixmap;
+ delete m_generatedMask;
+ return p;
+}
+
+NoteCharacter
+NotePixmapFactory::getCharacter(CharName name, ColourType type, bool inverted)
+{
+ NoteCharacter ch;
+ getCharacter(name, ch, type, inverted);
+ return ch;
+}
+
+bool
+NotePixmapFactory::getCharacter(CharName name, NoteCharacter &ch,
+ ColourType type, bool inverted)
+{
+ NoteFont::CharacterType charType =
+ m_inPrinterMethod ? NoteFont::Printer : NoteFont::Screen;
+
+ if (m_selected) {
+ return m_font->getCharacterColoured
+ (name,
+ GUIPalette::SelectedElementHue,
+ GUIPalette::SelectedElementMinValue,
+ ch, charType, inverted);
+ }
+
+ if (m_shaded) {
+ return m_font->getCharacterShaded(name, ch, charType, inverted);
+ }
+
+ switch (type) {
+
+ case PlainColour:
+ return m_font->getCharacter(name, ch, charType, inverted);
+
+ case QuantizedColour:
+ return m_font->getCharacterColoured
+ (name,
+ GUIPalette::QuantizedNoteHue,
+ GUIPalette::QuantizedNoteMinValue,
+ ch, charType, inverted);
+
+ case HighlightedColour:
+ return m_font->getCharacterColoured
+ (name,
+ GUIPalette::HighlightedElementHue,
+ GUIPalette::HighlightedElementMinValue,
+ ch, charType, inverted);
+
+ case TriggerColour:
+ return m_font->getCharacterColoured
+ (name,
+ GUIPalette::TriggerNoteHue,
+ GUIPalette::TriggerNoteMinValue,
+ ch, charType, inverted);
+
+ case OutRangeColour:
+ return m_font->getCharacterColoured
+ (name,
+ GUIPalette::OutRangeNoteHue,
+ GUIPalette::OutRangeNoteMinValue,
+ ch, charType, inverted);
+ }
+
+ return m_font->getCharacter(name, ch, charType, inverted);
+}
+
+QPoint
+NotePixmapFactory::m_pointZero;
+
+
+int NotePixmapFactory::getNoteBodyWidth(Note::Type type)
+const
+{
+ CharName charName(m_style->getNoteHeadCharName(type).first);
+ int hx, hy;
+ if (!m_font->getHotspot(charName, hx, hy))
+ hx = 0;
+ return m_font->getWidth(charName) - hx * 2;
+}
+
+int NotePixmapFactory::getNoteBodyHeight(Note::Type )
+const
+{
+ // this is by definition
+ return m_font->getSize();
+}
+
+int NotePixmapFactory::getLineSpacing() const
+{
+ return m_font->getSize() + getStaffLineThickness();
+}
+
+int NotePixmapFactory::getAccidentalWidth(const Accidental &a,
+ int shift, bool extraShift) const
+{
+ if (a == Accidentals::NoAccidental)
+ return 0;
+ int w = m_font->getWidth(m_style->getAccidentalCharName(a));
+ if (!shift)
+ return w;
+ else {
+ int sw = w;
+ if (extraShift) {
+ --shift;
+ w += getNoteBodyWidth() + getStemThickness();
+ }
+ w += shift *
+ (sw - m_font->getHotspot(m_style->getAccidentalCharName(a)).x());
+ }
+ return w;
+}
+
+int NotePixmapFactory::getAccidentalHeight(const Accidental &a) const
+{
+ return m_font->getHeight(m_style->getAccidentalCharName(a));
+}
+
+int NotePixmapFactory::getStemLength() const
+{
+ unsigned int l = 1;
+ (void)m_font->getStemLength(l);
+ return l;
+}
+
+int NotePixmapFactory::getStemThickness() const
+{
+ unsigned int i = 1;
+ (void)m_font->getStemThickness(i);
+ return i;
+}
+
+int NotePixmapFactory::getStaffLineThickness() const
+{
+ unsigned int i;
+ (void)m_font->getStaffLineThickness(i);
+ return i;
+}
+
+int NotePixmapFactory::getLegerLineThickness() const
+{
+ unsigned int i;
+ (void)m_font->getLegerLineThickness(i);
+ return i;
+}
+
+int NotePixmapFactory::getDotWidth() const
+{
+ return m_font->getWidth(NoteCharacterNames::DOT);
+}
+
+int NotePixmapFactory::getClefWidth(const Clef &clef) const
+{
+ return m_font->getWidth(m_style->getClefCharName(clef.getClefType()));
+}
+
+int NotePixmapFactory::getBarMargin() const
+{
+ return getNoteBodyWidth() * 2;
+}
+
+int NotePixmapFactory::getRestWidth(const Note &restType) const
+{
+ return m_font->getWidth(m_style->getRestCharName(restType.getNoteType(),
+ false)) // small inaccuracy!
+ + (restType.getDots() * getDotWidth());
+}
+
+int NotePixmapFactory::getKeyWidth(const Key &key,
+ Key previousKey) const
+{
+ std::vector<int> ah0 = previousKey.getAccidentalHeights(Clef());
+ std::vector<int> ah1 = key.getAccidentalHeights(Clef());
+
+ int cancelCount = 0;
+ if (key.isSharp() != previousKey.isSharp())
+ cancelCount = ah0.size();
+ else if (ah1.size() < ah0.size())
+ cancelCount = ah0.size() - ah1.size();
+
+ CharName keyCharName;
+ if (key.isSharp())
+ keyCharName = NoteCharacterNames::SHARP;
+ else
+ keyCharName = NoteCharacterNames::FLAT;
+
+ NoteCharacter keyCharacter;
+ NoteCharacter cancelCharacter;
+
+ keyCharacter = m_font->getCharacter(keyCharName);
+ if (cancelCount > 0) {
+ cancelCharacter = m_font->getCharacter(NoteCharacterNames::NATURAL);
+ }
+
+ //int x = 0;
+ //int lw = getLineSpacing();
+ int keyDelta = keyCharacter.getWidth() - keyCharacter.getHotspot().x();
+
+ int cancelDelta = 0;
+ int between = 0;
+ if (cancelCount > 0) {
+ cancelDelta = cancelCharacter.getWidth() + cancelCharacter.getWidth() / 3;
+ between = cancelCharacter.getWidth();
+ }
+
+ return (keyDelta * ah1.size() + cancelDelta * cancelCount + between +
+ keyCharacter.getWidth() / 4);
+}
+
+int NotePixmapFactory::getTextWidth(const Text &text) const
+{
+ QFontMetrics metrics(getTextFont(text));
+ return metrics.boundingRect(strtoqstr(text.getText())).width() + 4;
+}
+
+}
diff --git a/src/gui/editors/notation/NotePixmapFactory.h b/src/gui/editors/notation/NotePixmapFactory.h
new file mode 100644
index 0000000..14b4773
--- /dev/null
+++ b/src/gui/editors/notation/NotePixmapFactory.h
@@ -0,0 +1,358 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_NOTEPIXMAPFACTORY_H_
+#define _RG_NOTEPIXMAPFACTORY_H_
+
+#include "base/NotationTypes.h"
+#include <map>
+#include "NoteCharacter.h"
+#include <string>
+#include <qfont.h>
+#include <qfontmetrics.h>
+#include <qpixmap.h>
+#include <qpoint.h>
+#include "base/Event.h"
+#include "gui/editors/notation/NoteCharacterNames.h"
+
+
+class QPainter;
+class QCanvasPixmap;
+class QBitmap;
+
+
+namespace Rosegarden
+{
+
+namespace Guitar { class Fingering; }
+
+class TimeSignature;
+class Text;
+class NoteStyle;
+class NotePixmapParameters;
+class NoteFont;
+class NotePixmapPainter;
+class NotePixmapCache;
+class Clef;
+class TrackHeader;
+
+/**
+ * Generates QCanvasPixmaps for various notation items.
+ */
+
+class NotePixmapFactory
+{
+public:
+ NotePixmapFactory(std::string fontName = "", int size = -1);
+ NotePixmapFactory(const NotePixmapFactory &);
+ NotePixmapFactory &operator=(const NotePixmapFactory &);
+ ~NotePixmapFactory();
+
+ std::string getFontName() const;
+ int getSize() const;
+
+ void setSelected(bool selected) { m_selected = selected; }
+ bool isSelected() const { return m_selected; }
+
+ void setShaded(bool shaded) { m_shaded = shaded; }
+ bool isShaded() const { return m_shaded; }
+
+ void setNoteStyle(NoteStyle *style) { m_style = style; }
+ const NoteStyle *getNoteStyle() const { return m_style; }
+
+ // Display methods -- create canvas pixmaps:
+
+ QCanvasPixmap* makeNotePixmap(const NotePixmapParameters &parameters);
+ QCanvasPixmap* makeRestPixmap(const NotePixmapParameters &parameters);
+ QCanvasPixmap* makeClefPixmap(const Clef &clef);
+ QCanvasPixmap* makeKeyPixmap(const Key &key,
+ const Clef &clef,
+ Key previousKey =
+ Key::DefaultKey);
+ QCanvasPixmap* makeTimeSigPixmap(const TimeSignature& sig);
+ QCanvasPixmap* makeHairpinPixmap(int length, bool isCrescendo);
+ QCanvasPixmap* makeSlurPixmap(int length, int dy, bool above, bool phrasing);
+ QCanvasPixmap* makeOttavaPixmap(int length, int octavesUp);
+ QCanvasPixmap* makePedalDownPixmap();
+ QCanvasPixmap* makePedalUpPixmap();
+ QCanvasPixmap* makeUnknownPixmap();
+ QCanvasPixmap* makeTextPixmap(const Text &text);
+ QCanvasPixmap* makeGuitarChordPixmap(const Guitar::Fingering &fingering,
+ int x, int y);
+
+ QCanvasPixmap* makeNoteHaloPixmap(const NotePixmapParameters &parameters);
+
+ // Printing methods -- draw direct to a paint device:
+
+ void drawNote(const NotePixmapParameters &parameters,
+ QPainter &painter, int x, int y);
+ void drawRest(const NotePixmapParameters &parameters,
+ QPainter &painter, int x, int y);
+ void drawHairpin(int length, bool isCrescendo,
+ QPainter &painter, int x, int y);
+ void drawSlur(int length, int dy, bool above, bool phrasing,
+ QPainter &painter, int x, int y);
+ void drawOttava(int length, int octavesUp,
+ QPainter &painter, int x, int y);
+ void drawText(const Text &text,
+ QPainter &painter, int x, int y);
+
+ // Other support methods for producing pixmaps for other contexts:
+
+ static QCanvasPixmap *makeToolbarPixmap(const char *name,
+ bool menuSize = false);
+ static QCanvasPixmap *makeNoteMenuPixmap(timeT duration,
+ timeT &errorReturn);
+ static QCanvasPixmap *makeMarkMenuPixmap(Mark);
+
+ QCanvasPixmap* makePitchDisplayPixmap(int pitch,
+ const Clef &clef,
+ bool useSharps);
+ QCanvasPixmap* makePitchDisplayPixmap(int pitch,
+ const Clef &clef,
+ int octave,
+ int step);
+ QCanvasPixmap* makeClefDisplayPixmap(const Clef &clef);
+ QCanvasPixmap* makeKeyDisplayPixmap(const Key &key,
+ const Clef &clef);
+
+ QCanvasPixmap* makeTrackHeaderPixmap(int width, int height,
+ TrackHeader *header);
+
+ // Bounding box and other geometry methods:
+
+ int getNoteBodyWidth (Note::Type =
+ Note::Crotchet) const;
+
+ int getNoteBodyHeight(Note::Type =
+ Note::Crotchet) const;
+
+ int getAccidentalWidth (const Accidental &,
+ int shift = 0, bool extra = false) const;
+ int getAccidentalHeight(const Accidental &) const;
+
+ int getLineSpacing() const;
+ int getStemLength() const;
+ int getStemThickness() const;
+ int getStaffLineThickness() const;
+ int getLegerLineThickness() const;
+ int getDotWidth() const;
+ int getBarMargin() const;
+
+ int getClefWidth(const Clef &clef) const;
+ int getTimeSigWidth(const TimeSignature &timesig) const;
+ int getRestWidth(const Note &restType) const;
+ int getKeyWidth(const Key &key,
+ Key previousKey = Key::DefaultKey) const;
+ int getTextWidth(const Text &text) const;
+
+ /**
+ * Returns the width of clef and key signature drawn in a track header.
+ */
+ int getClefAndKeyWidth(const Key &key, const Clef &clef);
+
+ /**
+ * Returns the Number of Text Lines that can be written at top and bottom
+ * of a track header.
+ * The parameter is the track header height.
+ * Always returns a value >= 1.
+ */
+ int getTrackHeaderNTL(int height);
+
+ /**
+ * Returns the width of a text string written in a track header.
+ */
+ int getTrackHeaderTextWidth(QString str);
+
+ /**
+ * Returns the spacing of a text lines written in a track header.
+ */
+ int getTrackHeaderTextLineSpacing();
+
+ /**
+ * Returns from the beginning of "text" a string of horizontal size
+ * "width" (when written with m_trackHeaderFont) and removes it
+ * from "text".
+ */
+ QString getOneLine(QString &text, int width);
+
+
+ /**
+ * We need this function because as of Qt 3.1, QCanvasPixmap
+ * is no longer copyable by value, while QPixmap still is.
+ *
+ * So all the makeXXPixmap are now returning QCanvasPixmap*
+ * instead of QCanvasPixmap, but we need an easy way to
+ * convert them to QPixmap, since we use them that
+ * way quite often (to generate toolbar button icons for instance).
+ */
+ static QPixmap toQPixmap(QCanvasPixmap*);
+ static void dumpStats(std::ostream &);
+
+
+ static const char* const defaultSerifFontFamily;
+ static const char* const defaultSansSerifFontFamily;
+ static const char* const defaultTimeSigFontFamily;
+
+
+protected:
+ void init(std::string fontName, int size);
+ void initMaybe() { if (!m_font) init("", -1); }
+
+ void drawNoteAux(const NotePixmapParameters &parameters,
+ QPainter *painter, int x, int y);
+ void drawRestAux(const NotePixmapParameters &parameters, QPoint &hotspot,
+ QPainter *painter, int x, int y);
+ void drawHairpinAux(int length, bool isCrescendo,
+ QPainter *painter, int x, int y);
+ void drawSlurAux(int length, int dy, bool above, bool smooth, bool tie, bool phrasing,
+ QPoint &hotspot,
+ QPainter *painter, int x, int y);
+ void drawOttavaAux(int length, int octavesUp,
+ QPainter *painter, int x, int y);
+ void drawTextAux(const Text &text,
+ QPainter *painter, int x, int y);
+
+ int getStemLength(const NotePixmapParameters &) const;
+
+ void makeRoomForAccidental(Accidental, bool cautionary, int shift, bool extra);
+ void drawAccidental(Accidental, bool cautionary);
+
+ void makeRoomForMarks(bool isStemmed, const NotePixmapParameters &params, int stemLength);
+ void drawMarks(bool isStemmed, const NotePixmapParameters &params, int stemLength);
+
+ void makeRoomForLegerLines(const NotePixmapParameters &params);
+ void drawLegerLines(const NotePixmapParameters &params);
+
+ void makeRoomForStemAndFlags(int flagCount, int stemLength,
+ const NotePixmapParameters &params,
+ QPoint &startPoint, QPoint &endPoint);
+ void drawFlags(int flagCount, const NotePixmapParameters &params,
+ const QPoint &startPoint, const QPoint &endPoint);
+ void drawStem(const NotePixmapParameters &params,
+ const QPoint &startPoint, const QPoint &endPoint,
+ int shortening);
+
+ void makeRoomForBeams(const NotePixmapParameters &params);
+ void drawBeams(const QPoint &, const NotePixmapParameters &params,
+ int beamCount);
+
+ void drawSlashes(const QPoint &, const NotePixmapParameters &params,
+ int slashCount);
+
+ void makeRoomForTuplingLine(const NotePixmapParameters &params);
+ void drawTuplingLine(const NotePixmapParameters &params);
+
+ void drawShallowLine(int x0, int y0, int x1, int y1, int thickness,
+ bool smooth);
+ void drawTie(bool above, int length, int shift);
+
+ void drawBracket(int length, bool left, bool curly, int x, int y);
+
+ QFont getTextFont(const Text &text) const;
+
+ QCanvasPixmap* makeAnnotationPixmap(const Text &text);
+ QCanvasPixmap* makeAnnotationPixmap(const Text &text, const bool isLilyPondDirective);
+
+ void createPixmapAndMask(int width, int height,
+ int maskWidth = -1,
+ int maskHeight = -1);
+ QCanvasPixmap* makeCanvasPixmap(QPoint hotspot, bool generateMask = false);
+
+ enum ColourType {
+ PlainColour,
+ QuantizedColour,
+ HighlightedColour,
+ TriggerColour,
+ OutRangeColour
+ };
+
+ /// draws selected/shaded status from m_selected/m_shaded:
+ NoteCharacter getCharacter(CharName name, ColourType type, bool inverted);
+
+ /// draws selected/shaded status from m_selected/m_shaded:
+ bool getCharacter(CharName name, NoteCharacter &ch, ColourType type, bool inverted);
+
+ void drawNoteHalo(int x, int y, int w, int h);
+
+ //--------------- Data members ---------------------------------
+
+ NoteFont *m_font;
+ NoteStyle *m_style;
+ bool m_selected;
+ bool m_shaded;
+
+ int m_noteBodyWidth, m_noteBodyHeight;
+ int m_left, m_right, m_above, m_below;
+ int m_borderX, m_borderY;
+
+ QFont m_tupletCountFont;
+ QFontMetrics m_tupletCountFontMetrics;
+
+ QFont m_textMarkFont;
+ QFontMetrics m_textMarkFontMetrics;
+
+ QFont m_fingeringFont;
+ QFontMetrics m_fingeringFontMetrics;
+
+ QFont m_timeSigFont;
+ QFontMetrics m_timeSigFontMetrics;
+
+ QFont m_bigTimeSigFont;
+ QFontMetrics m_bigTimeSigFontMetrics;
+
+ QFont m_ottavaFont;
+ QFontMetrics m_ottavaFontMetrics;
+
+ QFont m_clefOttavaFont;
+ QFontMetrics m_clefOttavaFontMetrics;
+
+ QFont m_trackHeaderFont;
+ QFontMetrics m_trackHeaderFontMetrics;
+
+ QFont m_trackHeaderBoldFont;
+ QFontMetrics m_trackHeaderBoldFontMetrics;
+
+ QPixmap *m_generatedPixmap;
+ QBitmap *m_generatedMask;
+
+ int m_generatedWidth;
+ int m_generatedHeight;
+ bool m_inPrinterMethod;
+
+ NotePixmapPainter *m_p;
+
+ mutable NotePixmapCache *m_dottedRestCache;
+
+ typedef std::map<const char *, QFont> TextFontCache;
+ mutable TextFontCache m_textFontCache;
+
+ static QPoint m_pointZero;
+};
+
+
+
+}
+
+#endif
diff --git a/src/gui/editors/notation/NotePixmapPainter.h b/src/gui/editors/notation/NotePixmapPainter.h
new file mode 100644
index 0000000..ed9d541
--- /dev/null
+++ b/src/gui/editors/notation/NotePixmapPainter.h
@@ -0,0 +1,148 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_NOTEPIXMAPPAINTER_H_
+#define _RG_NOTEPIXMAPPAINTER_H_
+
+#include <qpainter.h>
+
+namespace Rosegarden {
+
+class NotePixmapPainter
+{
+ // Just a trivial class that instructs two painters to do the
+ // same thing (one for the pixmap, one for the mask). We only
+ // duplicate those methods we actually use in NotePixmapFactory
+
+public:
+ NotePixmapPainter() :
+ m_painter(&m_myPainter) { }
+
+ void beginExternal(QPainter *painter) {
+
+ m_externalPainter = painter;
+ m_useMask = false;
+
+ painter->setPen(QPen(Qt::black, 1, Qt::SolidLine,
+ Qt::RoundCap, Qt::RoundJoin));
+
+ if (m_externalPainter) {
+ m_painter = m_externalPainter;
+ } else {
+ m_painter = &m_myPainter;
+ }
+ }
+
+ bool begin(QPaintDevice *device, QPaintDevice *mask = 0, bool unclipped = false) {
+
+ m_externalPainter = 0;
+
+ if (mask) {
+ m_useMask = true;
+ m_maskPainter.begin(mask, unclipped);
+ } else {
+ m_useMask = false;
+ }
+
+ m_painter = &m_myPainter;
+ return m_painter->begin(device, unclipped);
+ }
+
+ bool end() {
+ if (m_useMask) m_maskPainter.end();
+ return m_painter->end();
+ }
+
+ QPainter &painter() {
+ return *m_painter;
+ }
+
+ QPainter &maskPainter() {
+ return m_maskPainter;
+ }
+
+ void drawPoint(int x, int y) {
+ m_painter->drawPoint(x, y);
+ if (m_useMask) m_maskPainter.drawPoint(x, y);
+ }
+
+ void drawLine(int x1, int y1, int x2, int y2) {
+ m_painter->drawLine(x1, y1, x2, y2);
+ if (m_useMask) m_maskPainter.drawLine(x1, y1, x2, y2);
+ }
+
+ void drawRect(int x, int y, int w, int h) {
+ m_painter->drawRect(x, y, w, h);
+ if (m_useMask) m_maskPainter.drawRect(x, y, w, h);
+ }
+
+ void drawArc(int x, int y, int w, int h, int a, int alen) {
+ m_painter->drawArc(x, y, w, h, a, alen);
+ if (m_useMask) m_maskPainter.drawArc(x, y, w, h, a, alen);
+ }
+
+ void drawPolygon(const QPointArray &a, bool winding = false,
+ int index = 0, int n = -1) {
+ m_painter->drawPolygon(a, winding, index, n);
+ if (m_useMask) m_maskPainter.drawPolygon(a, winding, index, n);
+ }
+
+ void drawPolyline(const QPointArray &a, int index = 0, int n = -1) {
+ m_painter->drawPolyline(a, index, n);
+ if (m_useMask) m_maskPainter.drawPolyline(a, index, n);
+ }
+
+ void drawPixmap(int x, int y, const QPixmap &pm,
+ int sx = 0, int sy = 0, int sw = -1, int sh = -1) {
+ m_painter->drawPixmap(x, y, pm, sx, sy, sw, sh);
+ if (m_useMask) m_maskPainter.drawPixmap(x, y, *(pm.mask()), sx, sy, sw, sh);
+ }
+
+ void drawText(int x, int y, const QString &string) {
+ m_painter->drawText(x, y, string);
+ if (m_useMask) m_maskPainter.drawText(x, y, string);
+ }
+
+ void drawNoteCharacter(int x, int y, const NoteCharacter &character) {
+ character.draw(m_painter, x, y);
+ if (m_useMask) character.drawMask(&m_maskPainter, x, y);
+ }
+
+ void drawEllipse(int x, int y, int w, int h) {
+ m_painter->drawEllipse(x, y, w, h);
+ if (m_useMask) m_maskPainter.drawEllipse(x, y, w, h);
+ }
+
+private:
+ bool m_useMask;
+ QPainter m_myPainter;
+ QPainter m_maskPainter;
+ QPainter *m_externalPainter;
+ QPainter *m_painter;
+};
+
+}
+
+#endif
diff --git a/src/gui/editors/notation/NotePixmapParameters.cpp b/src/gui/editors/notation/NotePixmapParameters.cpp
new file mode 100644
index 0000000..b6dd7fb
--- /dev/null
+++ b/src/gui/editors/notation/NotePixmapParameters.cpp
@@ -0,0 +1,151 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "NotePixmapParameters.h"
+
+#include "base/NotationTypes.h"
+
+
+namespace Rosegarden
+{
+
+NotePixmapParameters::NotePixmapParameters(Note::Type noteType,
+ int dots,
+ Accidental accidental) :
+ m_noteType(noteType),
+ m_dots(dots),
+ m_accidental(accidental),
+ m_cautionary(false),
+ m_shifted(false),
+ m_dotShifted(false),
+ m_accidentalShift(0),
+ m_drawFlag(true),
+ m_drawStem(true),
+ m_stemGoesUp(true),
+ m_stemLength( -1),
+ m_legerLines(0),
+ m_slashes(0),
+ m_selected(false),
+ m_highlighted(false),
+ m_quantized(false),
+ m_trigger(false),
+ m_onLine(false),
+ m_safeVertDistance(0),
+ m_restOutsideStave(false),
+ m_beamed(false),
+ m_nextBeamCount(0),
+ m_thisPartialBeams(false),
+ m_nextPartialBeams(false),
+ m_width(1),
+ m_gradient(0.0),
+ m_tupletCount(0),
+ m_tuplingLineY(0),
+ m_tuplingLineWidth(0),
+ m_tuplingLineGradient(0.0),
+ m_tied(false),
+ m_tieLength(0),
+ m_tiePositionExplicit(false),
+ m_tieAbove(false),
+ m_inRange(true)
+{
+ // nothing else
+}
+
+NotePixmapParameters::~NotePixmapParameters()
+{
+ // nothing to see here
+}
+
+void
+NotePixmapParameters::setMarks(const std::vector<Mark> &marks)
+{
+ m_marks.clear();
+ for (unsigned int i = 0; i < marks.size(); ++i)
+ m_marks.push_back(marks[i]);
+}
+
+void
+NotePixmapParameters::removeMarks()
+{
+ m_marks.clear();
+}
+
+std::vector<Rosegarden::Mark>
+NotePixmapParameters::getNormalMarks() const
+{
+ std::vector<Mark> marks;
+
+ for (std::vector<Mark>::const_iterator mi = m_marks.begin();
+ mi != m_marks.end(); ++mi) {
+
+ if (*mi == Marks::Pause ||
+ *mi == Marks::UpBow ||
+ *mi == Marks::DownBow ||
+ *mi == Marks::Trill ||
+ *mi == Marks::LongTrill ||
+ *mi == Marks::TrillLine ||
+ *mi == Marks::Turn ||
+ Marks::isFingeringMark(*mi))
+ continue;
+
+ marks.push_back(*mi);
+ }
+
+ return marks;
+}
+
+std::vector<Rosegarden::Mark>
+NotePixmapParameters::getAboveMarks() const
+{
+ std::vector<Mark> marks;
+
+ // fingerings before other marks
+
+ for (std::vector<Mark>::const_iterator mi = m_marks.begin();
+ mi != m_marks.end(); ++mi) {
+
+ if (Marks::isFingeringMark(*mi)) {
+ marks.push_back(*mi);
+ }
+ }
+
+ for (std::vector<Mark>::const_iterator mi = m_marks.begin();
+ mi != m_marks.end(); ++mi) {
+
+ if (*mi == Marks::Pause ||
+ *mi == Marks::UpBow ||
+ *mi == Marks::DownBow ||
+ *mi == Marks::Trill ||
+ *mi == Marks::LongTrill ||
+ *mi == Marks::TrillLine ||
+ *mi == Marks::Turn) {
+ marks.push_back(*mi);
+ }
+ }
+
+ return marks;
+}
+
+}
diff --git a/src/gui/editors/notation/NotePixmapParameters.h b/src/gui/editors/notation/NotePixmapParameters.h
new file mode 100644
index 0000000..f7bfee7
--- /dev/null
+++ b/src/gui/editors/notation/NotePixmapParameters.h
@@ -0,0 +1,161 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_NOTEPIXMAPPARAMETERS_H_
+#define _RG_NOTEPIXMAPPARAMETERS_H_
+
+#include "base/NotationTypes.h"
+#include <vector>
+
+
+
+
+namespace Rosegarden
+{
+
+
+
+class NotePixmapParameters
+{
+public:
+ NotePixmapParameters(Note::Type noteType,
+ int dots,
+ Accidental accidental =
+ Accidentals::NoAccidental);
+ ~NotePixmapParameters();
+
+ void setNoteType(Note::Type type) { m_noteType = type; }
+ void setDots(int dots) { m_dots = dots; }
+ void setAccidental(Accidental acc) { m_accidental = acc; }
+
+ void setAccidentalCautionary(bool cautionary) { m_cautionary = cautionary; }
+ void setNoteHeadShifted(bool shifted) { m_shifted = shifted; }
+ void setNoteDotShifted(bool shifted) { m_dotShifted = shifted; }
+ void setAccidentalShift(int shift) { m_accidentalShift = shift; }
+ void setAccExtraShift(bool extra) { m_accidentalExtra = extra; }
+
+ void setDrawFlag(bool df) { m_drawFlag = df; }
+ void setDrawStem(bool ds) { m_drawStem = ds; }
+ void setStemGoesUp(bool up) { m_stemGoesUp = up; }
+ void setStemLength(int length) { m_stemLength = length; }
+ void setLegerLines(int lines) { m_legerLines = lines; }
+ void setSlashes(int slashes) { m_slashes = slashes; }
+ void setRestOutside(bool os) { m_restOutsideStave = os; }
+
+ void setSelected(bool selected) { m_selected = selected; }
+ void setHighlighted(bool highlighted) { m_highlighted = highlighted;}
+ void setQuantized(bool quantized) { m_quantized = quantized; }
+ void setTrigger(bool trigger) { m_trigger = trigger; }
+ void setIsOnLine(bool isOnLine) { m_onLine = isOnLine; }
+ void setSafeVertDistance(int safe) { m_safeVertDistance = safe; }
+
+ void setBeamed(bool beamed) { m_beamed = beamed; }
+ void setNextBeamCount(int tc) { m_nextBeamCount = tc; }
+ void setThisPartialBeams(bool pt) { m_thisPartialBeams = pt; }
+ void setNextPartialBeams(bool pt) { m_nextPartialBeams = pt; }
+ void setWidth(int width) { m_width = width; }
+ void setGradient(double gradient) { m_gradient = gradient; }
+
+ void setTupletCount(int count) { m_tupletCount = count; }
+ void setTuplingLineY(int y) { m_tuplingLineY = y; }
+ void setTuplingLineWidth(int width) { m_tuplingLineWidth = width; }
+ void setTuplingLineGradient(double g) { m_tuplingLineGradient = g; }
+ void setTuplingLineFollowsBeam(bool b){ m_tuplingLineFollowsBeam = b; }
+
+ void setTied(bool tied) { m_tied = tied; }
+ void setTieLength(int tieLength) { m_tieLength = tieLength; }
+
+ void setTiePosition(bool expl, bool above) {
+ m_tiePositionExplicit = expl;
+ m_tieAbove = above;
+ }
+
+ void setMarks(const std::vector<Mark> &marks);
+ void removeMarks();
+
+ void setInRange(bool inRange) { m_inRange = inRange; }
+
+ std::vector<Mark> getNormalMarks() const;
+ std::vector<Mark> getAboveMarks() const; // bowings, pause etc
+
+
+private:
+ friend class NotePixmapFactory;
+
+ //--------------- Data members ---------------------------------
+
+ Note::Type m_noteType;
+ int m_dots;
+ Accidental m_accidental;
+
+ bool m_cautionary;
+ bool m_shifted;
+ bool m_dotShifted;
+ int m_accidentalShift;
+ bool m_accidentalExtra;
+ bool m_drawFlag;
+ bool m_drawStem;
+ bool m_stemGoesUp;
+ int m_stemLength;
+ int m_legerLines;
+ int m_slashes;
+ bool m_selected;
+ bool m_highlighted;
+ bool m_quantized;
+ bool m_trigger;
+ bool m_onLine;
+ int m_safeVertDistance;
+ bool m_restOutsideStave;
+
+ bool m_beamed;
+ int m_nextBeamCount;
+ bool m_thisPartialBeams;
+ bool m_nextPartialBeams;
+ int m_width;
+ double m_gradient;
+
+ int m_tupletCount;
+ int m_tuplingLineY;
+ int m_tuplingLineWidth;
+ double m_tuplingLineGradient;
+ bool m_tuplingLineFollowsBeam;
+
+ bool m_tied;
+ int m_tieLength;
+ bool m_tiePositionExplicit;
+ bool m_tieAbove;
+
+ bool m_inRange;
+
+ std::vector<Mark> m_marks;
+};
+
+
+class NotePixmapPainter;
+
+
+}
+
+#endif
diff --git a/src/gui/editors/notation/NoteStyle.cpp b/src/gui/editors/notation/NoteStyle.cpp
new file mode 100644
index 0000000..0b3332d
--- /dev/null
+++ b/src/gui/editors/notation/NoteStyle.cpp
@@ -0,0 +1,485 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "NoteStyle.h"
+
+#include "base/NotationTypes.h"
+#include "base/PropertyName.h"
+#include "NoteCharacterNames.h"
+#include "NoteStyleFactory.h"
+
+
+namespace Rosegarden
+{
+
+NoteStyle::~NoteStyle()
+{
+ // nothing
+}
+
+const NoteStyle::NoteHeadShape NoteStyle::AngledOval = "angled oval";
+
+const NoteStyle::NoteHeadShape NoteStyle::LevelOval = "level oval";
+
+const NoteStyle::NoteHeadShape NoteStyle::Breve = "breve";
+
+const NoteStyle::NoteHeadShape NoteStyle::Cross = "cross";
+
+const NoteStyle::NoteHeadShape NoteStyle::TriangleUp = "triangle up";
+
+const NoteStyle::NoteHeadShape NoteStyle::TriangleDown = "triangle down";
+
+const NoteStyle::NoteHeadShape NoteStyle::Diamond = "diamond";
+
+const NoteStyle::NoteHeadShape NoteStyle::Rectangle = "rectangle";
+
+const NoteStyle::NoteHeadShape NoteStyle::Number = "number";
+
+const NoteStyle::NoteHeadShape NoteStyle::CustomCharName = "custom character";
+
+
+
+NoteStyle::NoteHeadShape
+
+NoteStyle::getShape(Note::Type type)
+{
+ NoteDescriptionMap::iterator i = m_notes.find(type);
+ if (i == m_notes.end()) {
+ if (m_baseStyle)
+ return m_baseStyle->getShape(type);
+ std::cerr
+ << "WARNING: NoteStyle::getShape: No shape defined for note type "
+ << type << ", defaulting to AngledOval" << std::endl;
+ return AngledOval;
+ }
+
+ return i->second.shape;
+}
+
+bool
+NoteStyle::isFilled(Note::Type type)
+{
+ NoteDescriptionMap::iterator i = m_notes.find(type);
+ if (i == m_notes.end()) {
+ if (m_baseStyle)
+ return m_baseStyle->isFilled(type);
+ std::cerr
+ << "WARNING: NoteStyle::isFilled: No definition for note type "
+ << type << ", defaulting to true" << std::endl;
+ return true;
+ }
+
+ return i->second.filled;
+}
+
+bool
+NoteStyle::hasStem(Note::Type type)
+{
+ NoteDescriptionMap::iterator i = m_notes.find(type);
+ if (i == m_notes.end()) {
+ if (m_baseStyle)
+ return m_baseStyle->hasStem(type);
+ std::cerr
+ << "WARNING: NoteStyle::hasStem: No definition for note type "
+ << type << ", defaulting to true" << std::endl;
+ return true;
+ }
+
+ return i->second.stem;
+}
+
+int
+NoteStyle::getFlagCount(Note::Type type)
+{
+ NoteDescriptionMap::iterator i = m_notes.find(type);
+ if (i == m_notes.end()) {
+ if (m_baseStyle)
+ return m_baseStyle->getFlagCount(type);
+ std::cerr
+ << "WARNING: NoteStyle::getFlagCount: No definition for note type "
+ << type << ", defaulting to 0" << std::endl;
+ return 0;
+ }
+
+ return i->second.flags;
+}
+
+int
+NoteStyle::getSlashCount(Note::Type type)
+{
+ NoteDescriptionMap::iterator i = m_notes.find(type);
+ if (i == m_notes.end()) {
+ if (m_baseStyle)
+ return m_baseStyle->getSlashCount(type);
+ std::cerr
+ << "WARNING: NoteStyle::getSlashCount: No definition for note type "
+ << type << ", defaulting to 0" << std::endl;
+ return 0;
+ }
+
+ return i->second.slashes;
+}
+
+void
+NoteStyle::getStemFixPoints(Note::Type type,
+ HFixPoint &hfix, VFixPoint &vfix)
+{
+ NoteDescriptionMap::iterator i = m_notes.find(type);
+ if (i == m_notes.end()) {
+ if (m_baseStyle) {
+ m_baseStyle->getStemFixPoints(type, hfix, vfix);
+ return ;
+ }
+ std::cerr
+ << "WARNING: NoteStyle::getStemFixPoints: "
+ << "No definition for note type " << type
+ << ", defaulting to (Normal,Middle)" << std::endl;
+ hfix = Normal;
+ vfix = Middle;
+ return ;
+ }
+
+ hfix = i->second.hfix;
+ vfix = i->second.vfix;
+}
+
+NoteStyle::CharNameRec
+
+NoteStyle::getNoteHeadCharName(Note::Type type)
+{
+ NoteDescriptionMap::iterator i = m_notes.find(type);
+ if (i == m_notes.end()) {
+ if (m_baseStyle)
+ return m_baseStyle->getNoteHeadCharName(type);
+ std::cerr
+ << "WARNING: NoteStyle::getNoteHeadCharName: No definition for note type "
+ << type << ", defaulting to NOTEHEAD_BLACK" << std::endl;
+ return CharNameRec(NoteCharacterNames::NOTEHEAD_BLACK, false);
+ }
+
+ const NoteDescription &desc(i->second);
+ CharName name = NoteCharacterNames::UNKNOWN;
+ bool inverted = false;
+
+ if (desc.shape == AngledOval) {
+
+ name = desc.filled ? NoteCharacterNames::NOTEHEAD_BLACK
+ : NoteCharacterNames::VOID_NOTEHEAD;
+
+ } else if (desc.shape == LevelOval) {
+
+ if (desc.filled) {
+ std::cerr << "WARNING: NoteStyle::getNoteHeadCharName: No filled level oval head" << std::endl;
+ }
+ name = NoteCharacterNames::WHOLE_NOTE;
+
+ } else if (desc.shape == Breve) {
+
+ if (desc.filled) {
+ std::cerr << "WARNING: NoteStyle::getNoteHeadCharName: No filled breve head" << std::endl;
+ }
+ name = NoteCharacterNames::BREVE;
+
+ } else if (desc.shape == Cross) {
+
+ name = desc.filled ? NoteCharacterNames::X_NOTEHEAD
+ : NoteCharacterNames::CIRCLE_X_NOTEHEAD;
+
+ } else if (desc.shape == TriangleUp) {
+
+ name = desc.filled ? NoteCharacterNames::TRIANGLE_NOTEHEAD_UP_BLACK
+ : NoteCharacterNames::TRIANGLE_NOTEHEAD_UP_WHITE;
+
+ } else if (desc.shape == TriangleDown) {
+
+ name = desc.filled ? NoteCharacterNames::TRIANGLE_NOTEHEAD_UP_BLACK
+ : NoteCharacterNames::TRIANGLE_NOTEHEAD_UP_WHITE;
+ inverted = true;
+
+ } else if (desc.shape == Diamond) {
+
+ name = desc.filled ? NoteCharacterNames::SEMIBREVIS_BLACK
+ : NoteCharacterNames::SEMIBREVIS_WHITE;
+
+ } else if (desc.shape == Rectangle) {
+
+ name = desc.filled ? NoteCharacterNames::SQUARE_NOTEHEAD_BLACK
+ : NoteCharacterNames::SQUARE_NOTEHEAD_WHITE;
+
+ } else if (desc.shape == Number) {
+
+ std::cerr << "WARNING: NoteStyle::getNoteHeadCharName: Number not yet implemented" << std::endl;
+ name = NoteCharacterNames::UNKNOWN; //!!!
+
+ } else if (desc.shape == CustomCharName) {
+
+ name = desc.charName;
+
+ } else {
+
+ name = NoteCharacterNames::UNKNOWN;
+ }
+
+ return CharNameRec(name, inverted);
+}
+
+CharName
+NoteStyle::getAccidentalCharName(const Accidental &a)
+{
+ if (a == Accidentals::Sharp)
+ return NoteCharacterNames::SHARP;
+ else if (a == Accidentals::Flat)
+ return NoteCharacterNames::FLAT;
+ else if (a == Accidentals::Natural)
+ return NoteCharacterNames::NATURAL;
+ else if (a == Accidentals::DoubleSharp)
+ return NoteCharacterNames::DOUBLE_SHARP;
+ else if (a == Accidentals::DoubleFlat)
+ return NoteCharacterNames::DOUBLE_FLAT;
+ return NoteCharacterNames::UNKNOWN;
+}
+
+CharName
+NoteStyle::getMarkCharName(const Mark &mark)
+{
+ if (mark == Marks::Accent)
+ return NoteCharacterNames::ACCENT;
+ else if (mark == Marks::Tenuto)
+ return NoteCharacterNames::TENUTO;
+ else if (mark == Marks::Staccato)
+ return NoteCharacterNames::STACCATO;
+ else if (mark == Marks::Staccatissimo)
+ return NoteCharacterNames::STACCATISSIMO;
+ else if (mark == Marks::Marcato)
+ return NoteCharacterNames::MARCATO;
+ else if (mark == Marks::Trill)
+ return NoteCharacterNames::TRILL;
+ else if (mark == Marks::LongTrill)
+ return NoteCharacterNames::TRILL;
+ else if (mark == Marks::TrillLine)
+ return NoteCharacterNames::TRILL_LINE;
+ else if (mark == Marks::Turn)
+ return NoteCharacterNames::TURN;
+ else if (mark == Marks::Pause)
+ return NoteCharacterNames::FERMATA;
+ else if (mark == Marks::UpBow)
+ return NoteCharacterNames::UP_BOW;
+ else if (mark == Marks::DownBow)
+ return NoteCharacterNames::DOWN_BOW;
+ else if (mark == Marks::Mordent)
+ return NoteCharacterNames::MORDENT;
+ else if (mark == Marks::MordentInverted)
+ return NoteCharacterNames::MORDENT_INVERTED;
+ else if (mark == Marks::MordentLong)
+ return NoteCharacterNames::MORDENT_LONG;
+ else if (mark == Marks::MordentLongInverted)
+ return NoteCharacterNames::MORDENT_LONG_INVERTED;
+ // Things like "sf" and "rf" are generated from text fonts
+ return NoteCharacterNames::UNKNOWN;
+}
+
+CharName
+NoteStyle::getClefCharName(const Clef &clef)
+{
+ std::string clefType(clef.getClefType());
+
+ if (clefType == Clef::Bass || clefType == Clef::Varbaritone || clefType == Clef::Subbass) {
+ return NoteCharacterNames::F_CLEF;
+ } else if (clefType == Clef::Treble || clefType == Clef::French) {
+ return NoteCharacterNames::G_CLEF;
+ } else {
+ return NoteCharacterNames::C_CLEF;
+ }
+}
+
+CharName
+NoteStyle::getRestCharName(Note::Type type, bool restOutsideStave)
+{
+ switch (type) {
+ case Note::Hemidemisemiquaver:
+ return NoteCharacterNames::SIXTY_FOURTH_REST;
+ case Note::Demisemiquaver:
+ return NoteCharacterNames::THIRTY_SECOND_REST;
+ case Note::Semiquaver:
+ return NoteCharacterNames::SIXTEENTH_REST;
+ case Note::Quaver:
+ return NoteCharacterNames::EIGHTH_REST;
+ case Note::Crotchet:
+ return NoteCharacterNames::QUARTER_REST;
+ case Note::Minim:
+ return restOutsideStave ?
+ NoteCharacterNames::HALF_REST
+ : NoteCharacterNames::HALF_REST_ON_STAFF;
+ case Note::Semibreve:
+ return restOutsideStave ?
+ NoteCharacterNames::WHOLE_REST
+ : NoteCharacterNames::WHOLE_REST_ON_STAFF;
+ case Note::Breve:
+ return restOutsideStave ?
+ NoteCharacterNames::MULTI_REST
+ : NoteCharacterNames::MULTI_REST_ON_STAFF;
+ default:
+ return NoteCharacterNames::UNKNOWN;
+ }
+}
+
+CharName
+NoteStyle::getPartialFlagCharName(bool final)
+{
+ if (final)
+ return NoteCharacterNames::FLAG_PARTIAL_FINAL;
+ else
+ return NoteCharacterNames::FLAG_PARTIAL;
+}
+
+CharName
+NoteStyle::getFlagCharName(int flagCount)
+{
+ switch (flagCount) {
+ case 1:
+ return NoteCharacterNames::FLAG_1;
+ case 2:
+ return NoteCharacterNames::FLAG_2;
+ case 3:
+ return NoteCharacterNames::FLAG_3;
+ case 4:
+ return NoteCharacterNames::FLAG_4;
+ default:
+ return NoteCharacterNames::UNKNOWN;
+ }
+}
+
+CharName
+NoteStyle::getTimeSignatureDigitName(int digit)
+{
+ switch (digit) {
+ case 0:
+ return NoteCharacterNames::DIGIT_ZERO;
+ case 1:
+ return NoteCharacterNames::DIGIT_ONE;
+ case 2:
+ return NoteCharacterNames::DIGIT_TWO;
+ case 3:
+ return NoteCharacterNames::DIGIT_THREE;
+ case 4:
+ return NoteCharacterNames::DIGIT_FOUR;
+ case 5:
+ return NoteCharacterNames::DIGIT_FIVE;
+ case 6:
+ return NoteCharacterNames::DIGIT_SIX;
+ case 7:
+ return NoteCharacterNames::DIGIT_SEVEN;
+ case 8:
+ return NoteCharacterNames::DIGIT_EIGHT;
+ case 9:
+ return NoteCharacterNames::DIGIT_NINE;
+ default:
+ return NoteCharacterNames::UNKNOWN;
+ }
+}
+
+void
+NoteStyle::setBaseStyle(NoteStyleName name)
+{
+ try {
+ m_baseStyle = NoteStyleFactory::getStyle(name);
+ if (m_baseStyle == this)
+ m_baseStyle = 0;
+ } catch (NoteStyleFactory::StyleUnavailable u) {
+ if (name != NoteStyleFactory::DefaultStyle) {
+ std::cerr
+ << "NoteStyle::setBaseStyle: Base style "
+ << name << " not available, defaulting to "
+ << NoteStyleFactory::DefaultStyle << std::endl;
+ setBaseStyle(NoteStyleFactory::DefaultStyle);
+ } else {
+ std::cerr
+ << "NoteStyle::setBaseStyle: Base style "
+ << name << " not available" << std::endl;
+ m_baseStyle = 0;
+ }
+ }
+}
+
+void
+NoteStyle::checkDescription(Note::Type note)
+{
+ if (m_baseStyle && (m_notes.find(note) == m_notes.end())) {
+ m_baseStyle->checkDescription(note);
+ m_notes[note] = m_baseStyle->m_notes[note];
+ }
+}
+
+void
+NoteStyle::setShape(Note::Type note, NoteHeadShape shape)
+{
+ checkDescription(note);
+ m_notes[note].shape = shape;
+}
+
+void
+NoteStyle::setCharName(Note::Type note, CharName charName)
+{
+ checkDescription(note);
+ m_notes[note].charName = charName;
+}
+
+void
+NoteStyle::setFilled(Note::Type note, bool filled)
+{
+ checkDescription(note);
+ m_notes[note].filled = filled;
+}
+
+void
+NoteStyle::setStem(Note::Type note, bool stem)
+{
+ checkDescription(note);
+ m_notes[note].stem = stem;
+}
+
+void
+NoteStyle::setFlagCount(Note::Type note, int flags)
+{
+ checkDescription(note);
+ m_notes[note].flags = flags;
+}
+
+void
+NoteStyle::setSlashCount(Note::Type note, int slashes)
+{
+ checkDescription(note);
+ m_notes[note].slashes = slashes;
+}
+
+void
+NoteStyle::setStemFixPoints(Note::Type note, HFixPoint hfix, VFixPoint vfix)
+{
+ checkDescription(note);
+ m_notes[note].hfix = hfix;
+ m_notes[note].vfix = vfix;
+}
+
+}
diff --git a/src/gui/editors/notation/NoteStyle.h b/src/gui/editors/notation/NoteStyle.h
new file mode 100644
index 0000000..3959e01
--- /dev/null
+++ b/src/gui/editors/notation/NoteStyle.h
@@ -0,0 +1,142 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_NOTESTYLE_H_
+#define _RG_NOTESTYLE_H_
+
+#include "base/NotationTypes.h"
+#include <map>
+#include "NoteCharacterNames.h"
+#include <string>
+#include <utility>
+#include "gui/editors/notation/NoteCharacterNames.h"
+
+
+class Mark;
+class Accidental;
+
+
+namespace Rosegarden
+{
+
+class Clef;
+
+typedef std::string NoteStyleName;
+
+
+class NoteStyle
+{
+public:
+ virtual ~NoteStyle();
+
+ typedef std::string NoteHeadShape;
+
+ static const NoteHeadShape AngledOval;
+ static const NoteHeadShape LevelOval;
+ static const NoteHeadShape Breve;
+ static const NoteHeadShape Cross;
+ static const NoteHeadShape TriangleUp;
+ static const NoteHeadShape TriangleDown;
+ static const NoteHeadShape Diamond;
+ static const NoteHeadShape Rectangle;
+ static const NoteHeadShape CustomCharName;
+ static const NoteHeadShape Number;
+
+ enum HFixPoint { Normal, Central, Reversed };
+ enum VFixPoint { Near, Middle, Far };
+
+ NoteStyleName getName() const { return m_name; }
+
+ NoteHeadShape getShape (Note::Type);
+ bool isFilled (Note::Type);
+ bool hasStem (Note::Type);
+ int getFlagCount (Note::Type);
+ int getSlashCount(Note::Type);
+
+ typedef std::pair<CharName, bool> CharNameRec; // bool is "inverted"
+ CharNameRec getNoteHeadCharName(Note::Type);
+
+ CharName getRestCharName(Note::Type, bool restOutsideStave);
+ CharName getPartialFlagCharName(bool final);
+ CharName getFlagCharName(int flagCount);
+ CharName getAccidentalCharName(const Accidental &);
+ CharName getMarkCharName(const Mark &);
+ CharName getClefCharName(const Clef &);
+ CharName getTimeSignatureDigitName(int digit);
+
+ void setBaseStyle (NoteStyleName name);
+ void setShape (Note::Type, NoteHeadShape);
+ void setCharName (Note::Type, CharName);
+ void setFilled (Note::Type, bool);
+ void setStem (Note::Type, bool);
+ void setFlagCount (Note::Type, int);
+ void setSlashCount(Note::Type, int);
+
+ void getStemFixPoints(Note::Type, HFixPoint &, VFixPoint &);
+ void setStemFixPoints(Note::Type, HFixPoint, VFixPoint);
+
+protected:
+ struct NoteDescription {
+ NoteHeadShape shape; // if CustomCharName, use charName
+ CharName charName; // only used if shape == CustomCharName
+ bool filled;
+ bool stem;
+ int flags;
+ int slashes;
+ HFixPoint hfix;
+ VFixPoint vfix;
+
+ NoteDescription() :
+ shape(AngledOval), charName(NoteCharacterNames::UNKNOWN),
+ filled(true), stem(true), flags(0), slashes(0),
+ hfix(Normal), vfix(Middle) { }
+
+ NoteDescription(NoteHeadShape _shape, CharName _charName,
+ bool _filled, bool _stem, int _flags, int _slashes,
+ HFixPoint _hfix, VFixPoint _vfix) :
+ shape(_shape), charName(_charName),
+ filled(_filled), stem(_stem), flags(_flags), slashes(_slashes),
+ hfix(_hfix), vfix(_vfix) { }
+ };
+
+ typedef std::map<Note::Type, NoteDescription> NoteDescriptionMap;
+
+ NoteDescriptionMap m_notes;
+ NoteStyle *m_baseStyle;
+ NoteStyleName m_name;
+
+ void checkDescription(Note::Type type);
+
+protected: // for use by NoteStyleFileReader
+ NoteStyle(NoteStyleName name) : m_baseStyle(0), m_name(name) { }
+ friend class NoteStyleFileReader;
+};
+
+
+
+
+}
+
+#endif
diff --git a/src/gui/editors/notation/NoteStyleFactory.cpp b/src/gui/editors/notation/NoteStyleFactory.cpp
new file mode 100644
index 0000000..d4a8be8
--- /dev/null
+++ b/src/gui/editors/notation/NoteStyleFactory.cpp
@@ -0,0 +1,124 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "NoteStyleFactory.h"
+
+#include <kstddirs.h>
+#include "misc/Strings.h"
+#include "base/Event.h"
+#include "base/Exception.h"
+#include "NotationProperties.h"
+#include "NoteStyle.h"
+#include "NoteStyleFileReader.h"
+#include <kglobal.h>
+#include <qdir.h>
+#include <qfileinfo.h>
+#include <qstring.h>
+#include <qstringlist.h>
+
+
+namespace Rosegarden
+{
+
+const NoteStyleName NoteStyleFactory::DefaultStyle = "Classical";
+
+std::vector<NoteStyleName>
+NoteStyleFactory::getAvailableStyleNames()
+{
+ std::vector<NoteStyleName> names;
+
+ QString styleDir = KGlobal::dirs()->findResource("appdata", "styles/");
+ QDir dir(styleDir);
+ if (!dir.exists()) {
+ std::cerr << "NoteStyle::getAvailableStyleNames: directory \"" << styleDir
+ << "\" not found" << std::endl;
+ return names;
+ }
+
+ dir.setFilter(QDir::Files | QDir::Readable);
+ QStringList files = dir.entryList();
+ bool foundDefault = false;
+
+ for (QStringList::Iterator i = files.begin(); i != files.end(); ++i) {
+ if ((*i).length() > 4 && (*i).right(4) == ".xml") {
+ QFileInfo fileInfo(QString("%1/%2").arg(styleDir).arg(*i));
+ if (fileInfo.exists() && fileInfo.isReadable()) {
+ std::string styleName = qstrtostr((*i).left((*i).length() - 4));
+ if (styleName == DefaultStyle)
+ foundDefault = true;
+ names.push_back(styleName);
+ }
+ }
+ }
+
+ if (!foundDefault) {
+ std::cerr << "NoteStyleFactory::getAvailableStyleNames: WARNING: Default style name \"" << DefaultStyle << "\" not found" << std::endl;
+ }
+
+ return names;
+}
+
+NoteStyle *
+NoteStyleFactory::getStyle(NoteStyleName name)
+{
+ StyleMap::iterator i = m_styles.find(name);
+
+ if (i == m_styles.end()) {
+
+ try {
+ NoteStyle *newStyle = NoteStyleFileReader(name).getStyle();
+ m_styles[name] = newStyle;
+ return newStyle;
+
+ } catch (NoteStyleFileReader::StyleFileReadFailed f) {
+ std::cerr
+ << "NoteStyleFactory::getStyle: Style file read failed: "
+ << f.getMessage() << std::endl;
+ throw StyleUnavailable("Style file read failed: " +
+ f.getMessage());
+ }
+
+ } else {
+ return i->second;
+ }
+}
+
+NoteStyle *
+NoteStyleFactory::getStyleForEvent(Event *event)
+{
+ NoteStyleName styleName;
+ if (event->get
+ <String>(NotationProperties::NOTE_STYLE, styleName)) {
+ return getStyle(styleName);
+ }
+ else {
+ return getStyle(DefaultStyle);
+ }
+}
+
+NoteStyleFactory::StyleMap NoteStyleFactory::m_styles;
+
+
+}
diff --git a/src/gui/editors/notation/NoteStyleFactory.h b/src/gui/editors/notation/NoteStyleFactory.h
new file mode 100644
index 0000000..795537d
--- /dev/null
+++ b/src/gui/editors/notation/NoteStyleFactory.h
@@ -0,0 +1,61 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_NOTESTYLEFACTORY_H_
+#define _RG_NOTESTYLEFACTORY_H_
+
+#include "base/Exception.h"
+#include <map>
+#include <vector>
+#include "NoteStyle.h"
+
+
+namespace Rosegarden
+{
+
+class NoteStyle;
+class Event;
+
+class NoteStyleFactory
+{
+public:
+ static std::vector<NoteStyleName> getAvailableStyleNames();
+ static const NoteStyleName DefaultStyle;
+
+ static NoteStyle *getStyle(NoteStyleName name);
+ static NoteStyle *getStyleForEvent(Event *event);
+
+ typedef Exception StyleUnavailable;
+
+private:
+ typedef std::map<std::string, NoteStyle *> StyleMap;
+ static StyleMap m_styles;
+};
+
+
+
+}
+
+#endif
diff --git a/src/gui/editors/notation/NoteStyleFileReader.cpp b/src/gui/editors/notation/NoteStyleFileReader.cpp
new file mode 100644
index 0000000..b3f3464
--- /dev/null
+++ b/src/gui/editors/notation/NoteStyleFileReader.cpp
@@ -0,0 +1,193 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include "NoteStyleFileReader.h"
+
+#include <string>
+#include "NoteStyle.h"
+#include <qfileinfo.h>
+#include <qdir.h>
+
+#include <kglobal.h>
+#include <kstddirs.h>
+#include <klocale.h>
+
+#include "misc/Strings.h"
+#include "NotationStrings.h"
+#include "misc/Debug.h"
+
+namespace Rosegarden {
+
+
+NoteStyleFileReader::NoteStyleFileReader(std::string name) :
+ m_style(new NoteStyle(name)),
+ m_haveNote(false)
+{
+ QString styleDirectory =
+ KGlobal::dirs()->findResource("appdata", "styles/");
+
+ QString styleFileName =
+ QString("%1/%2.xml").arg(styleDirectory).arg(strtoqstr(name));
+
+ QFileInfo fileInfo(styleFileName);
+
+ if (!fileInfo.isReadable()) {
+ throw StyleFileReadFailed
+ (qstrtostr(i18n("Can't open style file %1").arg(styleFileName)));
+ }
+
+ QFile styleFile(styleFileName);
+
+ QXmlInputSource source(styleFile);
+ QXmlSimpleReader reader;
+ reader.setContentHandler(this);
+ reader.setErrorHandler(this);
+ bool ok = reader.parse(source);
+ styleFile.close();
+
+ if (!ok) {
+ throw StyleFileReadFailed(qstrtostr(m_errorString));
+ }
+}
+
+bool
+NoteStyleFileReader::startElement(const QString &, const QString &,
+ const QString &qName,
+ const QXmlAttributes &attributes)
+{
+ QString lcName = qName.lower();
+
+ if (lcName == "rosegarden-note-style") {
+
+ QString s = attributes.value("base-style");
+ if (s) m_style->setBaseStyle(qstrtostr(s));
+
+ } else if (lcName == "note") {
+
+ m_haveNote = true;
+
+ QString s = attributes.value("type");
+ if (!s) {
+ m_errorString = i18n("type is a required attribute of note");
+ return false;
+ }
+
+ try {
+ Note::Type type = NotationStrings::getNoteForName(s).getNoteType();
+ if (!setFromAttributes(type, attributes)) return false;
+
+ } catch (NotationStrings::MalformedNoteName n) {
+ m_errorString = i18n("Unrecognised note name %1").arg(s);
+ return false;
+ }
+
+ } else if (lcName == "global") {
+
+ if (m_haveNote) {
+ m_errorString = i18n("global element must precede note elements");
+ return false;
+ }
+
+ for (Note::Type type = Note::Shortest; type <= Note::Longest; ++type) {
+ if (!setFromAttributes(type, attributes)) return false;
+ }
+ }
+
+ return true;
+}
+
+
+bool
+NoteStyleFileReader::setFromAttributes(Note::Type type,
+ const QXmlAttributes &attributes)
+{
+ QString s;
+ bool haveShape = false;
+
+ s = attributes.value("shape");
+ if (s) {
+ m_style->setShape(type, qstrtostr(s.lower()));
+ haveShape = true;
+ }
+
+ s = attributes.value("charname");
+ if (s) {
+ if (haveShape) {
+ m_errorString = i18n("global and note elements may have shape "
+ "or charname attribute, but not both");
+ return false;
+ }
+ m_style->setShape(type, NoteStyle::CustomCharName);
+ m_style->setCharName(type, qstrtostr(s));
+ }
+
+ s = attributes.value("filled");
+ if (s) m_style->setFilled(type, s.lower() == "true");
+
+ s = attributes.value("stem");
+ if (s) m_style->setStem(type, s.lower() == "true");
+
+ s = attributes.value("flags");
+ if (s) m_style->setFlagCount(type, s.toInt());
+
+ s = attributes.value("slashes");
+ if (s) m_style->setSlashCount(type, s.toInt());
+
+ NoteStyle::HFixPoint hfix;
+ NoteStyle::VFixPoint vfix;
+ m_style->getStemFixPoints(type, hfix, vfix);
+ bool haveHFix = false;
+ bool haveVFix = false;
+
+ s = attributes.value("hfixpoint");
+ if (s) {
+ s = s.lower();
+ haveHFix = true;
+ if (s == "normal") hfix = NoteStyle::Normal;
+ else if (s == "central") hfix = NoteStyle::Central;
+ else if (s == "reversed") hfix = NoteStyle::Reversed;
+ else haveHFix = false;
+ }
+
+ s = attributes.value("vfixpoint");
+ if (s) {
+ s = s.lower();
+ haveVFix = true;
+ if (s == "near") vfix = NoteStyle::Near;
+ else if (s == "middle") vfix = NoteStyle::Middle;
+ else if (s == "far") vfix = NoteStyle::Far;
+ else haveVFix = false;
+ }
+
+ if (haveHFix || haveVFix) {
+ m_style->setStemFixPoints(type, hfix, vfix);
+ // otherwise they inherit from base style, so avoid setting here
+ }
+
+ return true;
+}
+
+
+}
+
diff --git a/src/gui/editors/notation/NoteStyleFileReader.h b/src/gui/editors/notation/NoteStyleFileReader.h
new file mode 100644
index 0000000..d3dfbbe
--- /dev/null
+++ b/src/gui/editors/notation/NoteStyleFileReader.h
@@ -0,0 +1,59 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_NOTESTYLEFILEREADER_H_
+#define _RG_NOTESTYLEFILEREADER_H_
+
+#include <qxml.h>
+
+#include "NoteStyle.h"
+
+namespace Rosegarden {
+
+class NoteStyleFileReader : public QXmlDefaultHandler
+{
+public:
+ NoteStyleFileReader(NoteStyleName name);
+
+ typedef Rosegarden::Exception StyleFileReadFailed;
+
+ NoteStyle *getStyle() { return m_style; }
+
+ // Xml handler methods:
+
+ virtual bool startElement
+ (const QString& namespaceURI, const QString& localName,
+ const QString& qName, const QXmlAttributes& atts);
+
+private:
+ bool setFromAttributes(Note::Type type, const QXmlAttributes &attributes);
+
+ QString m_errorString;
+ NoteStyle *m_style;
+ bool m_haveNote;
+};
+
+}
+
+#endif
diff --git a/src/gui/editors/notation/RestInserter.cpp b/src/gui/editors/notation/RestInserter.cpp
new file mode 100644
index 0000000..399cf2d
--- /dev/null
+++ b/src/gui/editors/notation/RestInserter.cpp
@@ -0,0 +1,150 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "RestInserter.h"
+
+#include <klocale.h>
+#include "base/Event.h"
+#include "base/NotationTypes.h"
+#include "base/BaseProperties.h"
+#include "base/Segment.h"
+#include "commands/notation/NoteInsertionCommand.h"
+#include "commands/notation/RestInsertionCommand.h"
+#include "commands/notation/TupletCommand.h"
+#include "gui/general/EditTool.h"
+#include "NotationStrings.h"
+#include "NotationTool.h"
+#include "NotationView.h"
+#include "NoteInserter.h"
+#include "NotePixmapFactory.h"
+#include <kaction.h>
+#include <kcommand.h>
+#include <qiconset.h>
+#include <qregexp.h>
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+using namespace BaseProperties;
+
+RestInserter::RestInserter(NotationView* view)
+ : NoteInserter("RestInserter", view)
+{
+ QIconSet icon;
+
+ icon = QIconSet
+ (NotePixmapFactory::toQPixmap(NotePixmapFactory::
+ makeToolbarPixmap("dotted-rest-crotchet")));
+ new KToggleAction(i18n("Dotted rest"), icon, 0, this,
+ SLOT(slotToggleDot()), actionCollection(),
+ "toggle_dot");
+
+ icon = QIconSet(NotePixmapFactory::toQPixmap(NotePixmapFactory::
+ makeToolbarPixmap("select")));
+ new KAction(i18n("Switch to Select Tool"), icon, 0, this,
+ SLOT(slotSelectSelected()), actionCollection(),
+ "select");
+
+ new KAction(i18n("Switch to Erase Tool"), "eraser", 0, this,
+ SLOT(slotEraseSelected()), actionCollection(),
+ "erase");
+
+ icon = QIconSet
+ (NotePixmapFactory::toQPixmap(NotePixmapFactory::
+ makeToolbarPixmap("crotchet")));
+ new KAction(i18n("Switch to Inserting Notes"), icon, 0, this,
+ SLOT(slotNotesSelected()), actionCollection(),
+ "notes");
+
+ createMenu("restinserter.rc");
+}
+
+void
+RestInserter::showPreview()
+{
+ // no preview available for now
+}
+
+Event *
+RestInserter::doAddCommand(Segment &segment, timeT time, timeT endTime,
+ const Note &note, int, Accidental)
+{
+ if (time < segment.getStartTime() ||
+ endTime > segment.getEndMarkerTime() ||
+ time + note.getDuration() > segment.getEndMarkerTime()) {
+ return 0;
+ }
+
+ NoteInsertionCommand *insertionCommand =
+ new RestInsertionCommand(segment, time, endTime, note);
+
+ KCommand *activeCommand = insertionCommand;
+
+ if (m_nParentView->isInTripletMode()) {
+ Segment::iterator i(segment.findTime(time));
+ if (i != segment.end() &&
+ !(*i)->has(BEAMED_GROUP_TUPLET_BASE)) {
+
+ KMacroCommand *command = new KMacroCommand(insertionCommand->name());
+ command->addCommand(new TupletCommand
+ (segment, time, note.getDuration()));
+ command->addCommand(insertionCommand);
+ activeCommand = command;
+ }
+ }
+
+ m_nParentView->addCommandToHistory(activeCommand);
+
+ return insertionCommand->getLastInsertedEvent();
+}
+
+void RestInserter::slotToggleDot()
+{
+ m_noteDots = (m_noteDots) ? 0 : 1;
+ Note note(m_noteType, m_noteDots);
+ QString actionName(NotationStrings::getReferenceName(note, true));
+ actionName.replace(QRegExp("-"), "_");
+ KAction *action = m_parentView->actionCollection()->action(actionName);
+ if (!action) {
+ std::cerr << "WARNING: No such action as " << actionName << std::endl;
+ } else {
+ action->activate();
+ }
+}
+
+void RestInserter::slotNotesSelected()
+{
+ Note note(m_noteType, m_noteDots);
+ QString actionName(NotationStrings::getReferenceName(note));
+ actionName.replace(QRegExp(" "), "_");
+ m_parentView->actionCollection()->action(actionName)->activate();
+}
+
+const QString RestInserter::ToolName = "restinserter";
+
+}
+#include "RestInserter.moc"
diff --git a/src/gui/editors/notation/RestInserter.h b/src/gui/editors/notation/RestInserter.h
new file mode 100644
index 0000000..90239fb
--- /dev/null
+++ b/src/gui/editors/notation/RestInserter.h
@@ -0,0 +1,76 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_RESTINSERTER_H_
+#define _RG_RESTINSERTER_H_
+
+#include "NoteInserter.h"
+#include <qstring.h>
+#include "base/Event.h"
+
+
+
+
+namespace Rosegarden
+{
+
+class Segment;
+class Note;
+class NotationView;
+class Event;
+
+
+/**
+ * This tool will insert rests on mouse click events
+ */
+class RestInserter : public NoteInserter
+{
+ Q_OBJECT
+
+ friend class NotationToolBox;
+
+public:
+
+ static const QString ToolName;
+
+protected:
+ RestInserter(NotationView*);
+
+ virtual Event *doAddCommand(Segment &,
+ timeT time,
+ timeT endTime,
+ const Note &,
+ int pitch, Accidental);
+ virtual void showPreview();
+
+protected slots:
+ void slotToggleDot();
+ void slotNotesSelected();
+};
+
+
+}
+
+#endif
diff --git a/src/gui/editors/notation/SystemFont.cpp b/src/gui/editors/notation/SystemFont.cpp
new file mode 100644
index 0000000..71f0ce7
--- /dev/null
+++ b/src/gui/editors/notation/SystemFont.cpp
@@ -0,0 +1,165 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "SystemFont.h"
+#include "SystemFontQt.h"
+#include "SystemFontXft.h"
+
+#include "misc/Debug.h"
+
+#include <kstddirs.h>
+#include "NoteFontMap.h"
+#include <qfont.h>
+#include <qfontinfo.h>
+#include <qpixmap.h>
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+SystemFont *
+SystemFont::loadSystemFont(const SystemFontSpec &spec)
+{
+ QString name = spec.first;
+ int size = spec.second;
+
+ NOTATION_DEBUG << "SystemFont::loadSystemFont: name is " << name << ", size " << size << endl;
+
+ if (name == "DEFAULT") {
+ QFont font;
+ font.setPixelSize(size);
+ return new SystemFontQt(font);
+ }
+
+#ifdef HAVE_XFT
+
+ FcPattern *pattern, *match;
+ FcResult result;
+ FcChar8 *matchFamily;
+ XftFont *xfont = 0;
+
+ Display *dpy = QPaintDevice::x11AppDisplay();
+ static bool haveFcDirectory = false;
+
+ if (!dpy) {
+ std::cerr << "SystemFont::loadSystemFont[Xft]: Xft support requested but no X11 display available!" << std::endl;
+ goto qfont;
+ }
+
+ if (!haveFcDirectory) {
+ QString fontDir = KGlobal::dirs()->findResource("appdata", "fonts/");
+ if (!FcConfigAppFontAddDir(FcConfigGetCurrent(),
+ (const FcChar8 *)fontDir.latin1())) {
+ NOTATION_DEBUG << "SystemFont::loadSystemFont[Xft]: Failed to add font directory " << fontDir << " to fontconfig, continuing without it" << endl;
+ }
+ haveFcDirectory = true;
+ }
+
+ pattern = FcPatternCreate();
+ FcPatternAddString(pattern, FC_FAMILY, (FcChar8 *)name.latin1());
+ FcPatternAddInteger(pattern, FC_PIXEL_SIZE, size);
+ FcConfigSubstitute(FcConfigGetCurrent(), pattern, FcMatchPattern);
+
+ result = FcResultMatch;
+ match = FcFontMatch(FcConfigGetCurrent(), pattern, &result);
+ FcPatternDestroy(pattern);
+
+ if (!match || result != FcResultMatch) {
+ NOTATION_DEBUG << "SystemFont::loadSystemFont[Xft]: No match for font "
+ << name << " (result is " << result
+ << "), falling back on QFont" << endl;
+ if (match)
+ FcPatternDestroy(match);
+ goto qfont;
+ }
+
+ FcPatternGetString(match, FC_FAMILY, 0, &matchFamily);
+ NOTATION_DEBUG << "SystemFont::loadSystemFont[Xft]: match family is "
+ << (char *)matchFamily << endl;
+
+ if (QString((char *)matchFamily).lower() != name.lower()) {
+ NOTATION_DEBUG << "SystemFont::loadSystemFont[Xft]: Wrong family returned, falling back on QFont" << endl;
+ FcPatternDestroy(match);
+ goto qfont;
+ }
+
+ xfont = XftFontOpenPattern(dpy, match);
+ if (!xfont) {
+ FcPatternDestroy(match);
+ NOTATION_DEBUG << "SystemFont::loadSystemFont[Xft]: Unable to load font "
+ << name << " via Xft, falling back on QFont" << endl;
+ goto qfont;
+ }
+
+ NOTATION_DEBUG << "SystemFont::loadSystemFont[Xft]: successfully loaded font "
+ << name << " through Xft" << endl;
+
+ return new SystemFontXft(dpy, xfont);
+
+
+qfont:
+
+#endif
+
+ QFont qfont(name, size, QFont::Normal);
+ qfont.setPixelSize(size);
+
+ QFontInfo info(qfont);
+
+ NOTATION_DEBUG << "SystemFont::loadSystemFont[Qt]: have family " << info.family() << " (exactMatch " << info.exactMatch() << ")" << endl;
+
+ // return info.exactMatch();
+
+ // The Qt documentation says:
+ //
+ // bool QFontInfo::exactMatch() const
+ // Returns TRUE if the matched window system font is exactly the
+ // same as the one specified by the font; otherwise returns FALSE.
+ //
+ // My arse. I specify "feta", I get "Verdana", and exactMatch
+ // returns true. Uh huh.
+ //
+ // UPDATE: in newer versions of Qt, I specify "fughetta", I get
+ // "Fughetta [macromedia]", and exactMatch returns false. Just as
+ // useless, but in a different way.
+
+ QString family = info.family().lower();
+
+ if (family == name.lower())
+ return new SystemFontQt(qfont);
+ else {
+ int bracket = family.find(" [");
+ if (bracket > 1)
+ family = family.left(bracket);
+ if (family == name.lower())
+ return new SystemFontQt(qfont);
+ }
+
+ NOTATION_DEBUG << "SystemFont::loadSystemFont[Qt]: Wrong family returned, failing" << endl;
+ return 0;
+}
+
+}
diff --git a/src/gui/editors/notation/SystemFont.h b/src/gui/editors/notation/SystemFont.h
new file mode 100644
index 0000000..0acc2dd
--- /dev/null
+++ b/src/gui/editors/notation/SystemFont.h
@@ -0,0 +1,63 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_SYSTEMFONT_H_
+#define _RG_SYSTEMFONT_H_
+
+#include <qpixmap.h>
+#include "gui/editors/notation/NoteCharacterNames.h"
+
+
+class SystemFontSpec;
+
+
+namespace Rosegarden
+{
+
+typedef std::pair<QString, int> SystemFontSpec;
+
+
+class SystemFont
+{
+public:
+ enum Strategy {
+ PreferGlyphs, PreferCodes, OnlyGlyphs, OnlyCodes
+ };
+
+ virtual QPixmap renderChar(CharName charName,
+ int glyph, int code,
+ Strategy strategy,
+ bool &success) = 0;
+
+ static SystemFont *loadSystemFont(const SystemFontSpec &spec);
+};
+
+
+// Helper class for looking up information about a font
+
+
+}
+
+#endif
diff --git a/src/gui/editors/notation/SystemFontQt.cpp b/src/gui/editors/notation/SystemFontQt.cpp
new file mode 100644
index 0000000..f9c99b1
--- /dev/null
+++ b/src/gui/editors/notation/SystemFontQt.cpp
@@ -0,0 +1,78 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include "SystemFontQt.h"
+
+#include "misc/Debug.h"
+#include "gui/general/PixmapFunctions.h"
+
+#include <qfont.h>
+#include <qfontmetrics.h>
+#include <qpainter.h>
+#include <qpixmap.h>
+
+namespace Rosegarden {
+
+QPixmap
+SystemFontQt::renderChar(CharName charName, int glyph, int code,
+ Strategy strategy, bool &success)
+{
+ success = false;
+
+ if (strategy == OnlyGlyphs) {
+ NOTATION_DEBUG << "SystemFontQt::renderChar: OnlyGlyphs strategy not supported by Qt renderer, can't render character " << charName.getName() << " (glyph " << glyph << ")" << endl;
+ return QPixmap();
+ }
+
+ if (code < 0) {
+ NOTATION_DEBUG << "SystemFontQt::renderChar: Can't render using Qt with only glyph value (" << glyph << ") for character " << charName.getName() << ", need a code point" << endl;
+ return QPixmap();
+ }
+
+ QFontMetrics metrics(m_font);
+ QChar qc(code);
+
+ QPixmap map;
+ map = QPixmap(metrics.width(qc), metrics.height());
+
+ map.fill();
+ QPainter painter;
+ painter.begin(&map);
+ painter.setFont(m_font);
+ painter.setPen(Qt::black);
+
+ NOTATION_DEBUG << "NoteFont: Drawing character code "
+ << code << " for " << charName.getName()
+ << " using QFont" << endl;
+
+ painter.drawText(0, metrics.ascent(), qc);
+
+ painter.end();
+ map.setMask(PixmapFunctions::generateMask(map, Qt::white.rgb()));
+
+ success = true;
+ return map;
+}
+
+}
diff --git a/src/gui/editors/notation/SystemFontQt.h b/src/gui/editors/notation/SystemFontQt.h
new file mode 100644
index 0000000..ea8f5f2
--- /dev/null
+++ b/src/gui/editors/notation/SystemFontQt.h
@@ -0,0 +1,49 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_SYSTEMFONTQT_H_
+#define _RG_SYSTEMFONTQT_H_
+
+#include "SystemFont.h"
+
+#include <qfont.h>
+
+namespace Rosegarden {
+
+class SystemFontQt : public SystemFont
+{
+public:
+ SystemFontQt(QFont &font) : m_font(font) { }
+ virtual ~SystemFontQt() { }
+
+ virtual QPixmap renderChar(CharName charName, int glyph, int code,
+ Strategy strategy, bool &success);
+
+private:
+ QFont m_font;
+};
+
+}
+
+#endif
diff --git a/src/gui/editors/notation/SystemFontXft.cpp b/src/gui/editors/notation/SystemFontXft.cpp
new file mode 100644
index 0000000..ce42f61
--- /dev/null
+++ b/src/gui/editors/notation/SystemFontXft.cpp
@@ -0,0 +1,193 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include "SystemFontXft.h"
+
+#ifdef HAVE_XFT
+
+#include "misc/Debug.h"
+#include "gui/general/PixmapFunctions.h"
+
+namespace Rosegarden {
+
+/*!!! Just test code.
+
+int
+staticMoveTo(FT_Vector *to, void *)
+{
+ NOTATION_DEBUG << "moveTo: (" << to->x << "," << to->y << ")" << endl;
+ return 0;
+}
+
+int
+staticLineTo(FT_Vector *to, void *)
+{
+ NOTATION_DEBUG << "lineTo: (" << to->x << "," << to->y << ")" << endl;
+ return 0;
+}
+
+int
+staticConicTo(FT_Vector *control, FT_Vector *to, void *)
+{
+ NOTATION_DEBUG << "conicTo: (" << to->x << "," << to->y << ") control (" << control->x << "," << control->y << ")" << endl;
+ return 0;
+}
+
+int
+staticCubicTo(FT_Vector *control1, FT_Vector *control2, FT_Vector *to, void *)
+{
+ NOTATION_DEBUG << "cubicTo: (" << to->x << "," << to->y << ") control1 (" << control1->x << "," << control1->y << ") control2 (" << control2->x << "," << control2->y << ")" << endl;
+ return 0;
+}
+
+*/
+
+QPixmap
+SystemFontXft::renderChar(CharName charName, int glyph, int code,
+ Strategy strategy, bool &success)
+{
+ success = false;
+
+ if (glyph < 0 && code < 0) {
+ NOTATION_DEBUG << "SystemFontXft::renderChar: Have neither glyph nor code point for character " << charName.getName() << ", can't render" << endl;
+ return QPixmap();
+ }
+
+ if (code < 0 && strategy == OnlyCodes) {
+ NOTATION_DEBUG << "SystemFontXft::renderChar: strategy is OnlyCodes but no code point provided for character " << charName.getName() << " (glyph is " << glyph << ")" << endl;
+ return QPixmap();
+ }
+
+ if (glyph < 0 && strategy == OnlyGlyphs) {
+ NOTATION_DEBUG << "SystemFontXft::renderChar: strategy is OnlyGlyphs but no glyph index provided for character " << charName.getName() << " (code is " << code << ")" << endl;
+ return QPixmap();
+ }
+
+ XGlyphInfo extents;
+
+ bool useGlyph = true;
+ if (glyph < 0 || (strategy == PreferCodes && code >= 0)) useGlyph = false;
+ if (glyph >= 0 && useGlyph == false && !XftCharExists(m_dpy, m_font, code)) {
+ NOTATION_DEBUG << "SystemFontXft::renderChar: code " << code << " is preferred for character " << charName.getName() << ", but it doesn't exist in font! Falling back to glyph " << glyph << endl;
+ useGlyph = true;
+ }
+
+ if (useGlyph) {
+ FT_UInt ui(glyph);
+ XftGlyphExtents(m_dpy, m_font, &ui, 1, &extents);
+ if (extents.width == 0 || extents.height == 0) {
+ NOTATION_DEBUG
+ << "SystemFontXft::renderChar: zero extents for character "
+ << charName.getName() << " (glyph " << glyph << ")" << endl;
+ return QPixmap();
+ }
+ } else {
+ FcChar32 char32(code);
+ XftTextExtents32(m_dpy, m_font, &char32, 1, &extents);
+ if (extents.width == 0 || extents.height == 0) {
+ NOTATION_DEBUG
+ << "SystemFontXft::renderChar: zero extents for character "
+ << charName.getName() << " (code " << code << ")" << endl;
+ return QPixmap();
+ }
+ }
+
+ QPixmap map(extents.width, extents.height);
+ map.fill();
+
+ Drawable drawable = (Drawable)map.handle();
+ if (!drawable) {
+ std::cerr << "ERROR: SystemFontXft::renderChar: No drawable in QPixmap!" << std::endl;
+ return map;
+ }
+
+ XftDraw *draw = XftDrawCreate(m_dpy,
+ drawable,
+ (Visual *)map.x11Visual(),
+ map.x11Colormap());
+
+ QColor pen(Qt::black);
+ XftColor col;
+ col.color.red = pen.red () | pen.red() << 8;
+ col.color.green = pen.green () | pen.green() << 8;
+ col.color.blue = pen.blue () | pen.blue() << 8;
+ col.color.alpha = 0xffff;
+ col.pixel = pen.pixel();
+
+ if (useGlyph) {
+ NOTATION_DEBUG << "NoteFont: drawing raw character glyph "
+ << glyph << " for " << charName.getName()
+ << " using Xft" << endl;
+ FT_UInt ui(glyph);
+ XftDrawGlyphs(draw, &col, m_font, extents.x, extents.y, &ui, 1);
+ } else {
+ NOTATION_DEBUG << "NoteFont: drawing character code "
+ << code << " for " << charName.getName()
+ << " using Xft" << endl;
+ FcChar32 char32(code);
+ XftDrawString32(draw, &col, m_font, extents.x, extents.y, &char32, 1);
+ }
+
+ XftDrawDestroy(draw);
+
+ map.setMask(PixmapFunctions::generateMask(map, Qt::white.rgb()));
+ success = true;
+
+
+ //!!! experimental stuff
+/*!!!
+ FT_Face face = XftLockFace(m_font);
+ if (!face) {
+ NOTATION_DEBUG << "Couldn't lock face" << endl;
+ return map;
+ }
+ // not checking return value here
+ FT_Load_Glyph(face, glyph, 0);
+ if (face->glyph->format != FT_GLYPH_FORMAT_OUTLINE) {
+ NOTATION_DEBUG << "Glyph " << glyph << " isn't an outline" << endl;
+ XftUnlockFace(m_font);
+ return map;
+ }
+ FT_Glyph ftglyph;
+ FT_Get_Glyph(face->glyph, &ftglyph);
+ FT_Outline &outline = ((FT_OutlineGlyph)ftglyph)->outline;
+ NOTATION_DEBUG << "Outline: " << outline.n_contours << " contours, "
+ << outline.n_points << " points" << endl;
+
+
+ FT_Outline_Funcs funcs = {
+ staticMoveTo, staticLineTo, staticConicTo, staticCubicTo, 0, 0
+ };
+ FT_Outline_Decompose(&outline, &funcs, 0);
+ FT_Done_Glyph(ftglyph);
+ XftUnlockFace(m_font);
+*/
+
+ return map;
+}
+
+}
+
+#endif /* HAVE_XFT */
+
diff --git a/src/gui/editors/notation/SystemFontXft.h b/src/gui/editors/notation/SystemFontXft.h
new file mode 100644
index 0000000..b1487c4
--- /dev/null
+++ b/src/gui/editors/notation/SystemFontXft.h
@@ -0,0 +1,58 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_SYSTEMFONTXFT_H_
+#define _RG_SYSTEMFONTXFT_H_
+
+#ifdef HAVE_XFT
+
+#include "SystemFont.h"
+
+#include <ft2build.h>
+#include FT_FREETYPE_H
+#include FT_OUTLINE_H
+#include FT_GLYPH_H
+#include <X11/Xft/Xft.h>
+
+namespace Rosegarden {
+
+class SystemFontXft : public SystemFont
+{
+public:
+ SystemFontXft(Display *dpy, XftFont *font) : m_dpy(dpy), m_font(font) { }
+ virtual ~SystemFontXft() { if (m_font) XftFontClose(m_dpy, m_font); }
+
+ virtual QPixmap renderChar(CharName charName, int glyph, int code,
+ Strategy strategy, bool &success);
+
+private:
+ Display *m_dpy;
+ XftFont *m_font;
+};
+
+}
+
+#endif
+
+#endif
diff --git a/src/gui/editors/notation/TextInserter.cpp b/src/gui/editors/notation/TextInserter.cpp
new file mode 100644
index 0000000..aa8e1ff
--- /dev/null
+++ b/src/gui/editors/notation/TextInserter.cpp
@@ -0,0 +1,169 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "TextInserter.h"
+
+#include <klocale.h>
+#include "base/Event.h"
+#include "base/Exception.h"
+#include "base/NotationTypes.h"
+#include "base/ViewElement.h"
+#include "commands/notation/EraseEventCommand.h"
+#include "commands/notation/TextInsertionCommand.h"
+#include "gui/dialogs/TextEventDialog.h"
+#include "gui/general/EditTool.h"
+#include "gui/general/LinedStaff.h"
+#include "NotationTool.h"
+#include "NotationView.h"
+#include "NotePixmapFactory.h"
+#include "NotationElement.h"
+#include <kaction.h>
+#include <qdialog.h>
+#include <qiconset.h>
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+TextInserter::TextInserter(NotationView* view)
+ : NotationTool("TextInserter", view),
+ m_text("", Text::Dynamic)
+{
+ QIconSet icon = QIconSet(NotePixmapFactory::toQPixmap(NotePixmapFactory::
+ makeToolbarPixmap("select")));
+ new KAction(i18n("Switch to Select Tool"), icon, 0, this,
+ SLOT(slotSelectSelected()), actionCollection(),
+ "select");
+
+ new KAction(i18n("Switch to Erase Tool"), "eraser", 0, this,
+ SLOT(slotEraseSelected()), actionCollection(),
+ "erase");
+
+ icon = QIconSet
+ (NotePixmapFactory::toQPixmap(NotePixmapFactory::
+ makeToolbarPixmap("crotchet")));
+ new KAction(i18n("Switch to Inserting Notes"), icon, 0, this,
+ SLOT(slotNotesSelected()), actionCollection(),
+ "notes");
+
+ createMenu("textinserter.rc");
+}
+
+void TextInserter::slotNotesSelected()
+{
+ m_nParentView->slotLastNoteAction();
+}
+
+void TextInserter::slotEraseSelected()
+{
+ m_parentView->actionCollection()->action("erase")->activate();
+}
+
+void TextInserter::slotSelectSelected()
+{
+ m_parentView->actionCollection()->action("select")->activate();
+}
+
+void TextInserter::ready()
+{
+ m_nParentView->setCanvasCursor(Qt::crossCursor);
+ m_nParentView->setHeightTracking(false);
+}
+
+void TextInserter::handleLeftButtonPress(timeT,
+ int,
+ int staffNo,
+ QMouseEvent* e,
+ ViewElement *element)
+{
+ if (staffNo < 0)
+ return ;
+ LinedStaff *staff = m_nParentView->getLinedStaff(staffNo);
+
+ Text defaultText(m_text);
+ timeT insertionTime;
+ Event *eraseEvent = 0;
+
+ if (element && element->event()->isa(Text::EventType)) {
+
+ // edit an existing text, if that's what we clicked on
+
+ try {
+ defaultText = Text(*element->event());
+ } catch (Exception e) {}
+
+ insertionTime = element->event()->getAbsoluteTime(); // not getViewAbsoluteTime()
+
+ eraseEvent = element->event();
+
+ } else {
+
+ Event *clef = 0, *key = 0;
+
+ NotationElementList::iterator closestElement =
+ staff->getClosestElementToCanvasCoords(e->x(), (int)e->y(),
+ clef, key, false, -1);
+
+ if (closestElement == staff->getViewElementList()->end())
+ return ;
+
+ insertionTime = (*closestElement)->event()->getAbsoluteTime(); // not getViewAbsoluteTime()
+
+ }
+
+ TextEventDialog *dialog = new TextEventDialog
+ (m_nParentView, m_nParentView->getNotePixmapFactory(), defaultText);
+
+ if (dialog->exec() == QDialog::Accepted) {
+
+ m_text = dialog->getText();
+
+ TextInsertionCommand *command =
+ new TextInsertionCommand
+ (staff->getSegment(), insertionTime, m_text);
+
+ if (eraseEvent) {
+ KMacroCommand *macroCommand = new KMacroCommand(command->name());
+ macroCommand->addCommand(new EraseEventCommand(staff->getSegment(),
+ eraseEvent, false));
+ macroCommand->addCommand(command);
+ m_nParentView->addCommandToHistory(macroCommand);
+ } else {
+ m_nParentView->addCommandToHistory(command);
+ }
+
+ Event *event = command->getLastInsertedEvent();
+ if (event)
+ m_nParentView->setSingleSelectedEvent(staffNo, event);
+ }
+
+ delete dialog;
+}
+
+const QString TextInserter::ToolName = "textinserter";
+
+}
+#include "TextInserter.moc"
diff --git a/src/gui/editors/notation/TextInserter.h b/src/gui/editors/notation/TextInserter.h
new file mode 100644
index 0000000..3b4821b
--- /dev/null
+++ b/src/gui/editors/notation/TextInserter.h
@@ -0,0 +1,78 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_TEXTINSERTER_H_
+#define _RG_TEXTINSERTER_H_
+
+#include "base/NotationTypes.h"
+#include "NotationTool.h"
+#include <qstring.h>
+#include "base/Event.h"
+
+
+class QMouseEvent;
+
+
+namespace Rosegarden
+{
+
+class ViewElement;
+class NotationView;
+
+
+/**
+ * This tool will request and insert text on mouse click events
+ */
+class TextInserter : public NotationTool
+{
+ Q_OBJECT
+
+ friend class NotationToolBox;
+
+public:
+ virtual void ready();
+
+ virtual void handleLeftButtonPress(timeT,
+ int height,
+ int staffNo,
+ QMouseEvent*,
+ ViewElement* el);
+ static const QString ToolName;
+
+protected slots:
+ void slotNotesSelected();
+ void slotEraseSelected();
+ void slotSelectSelected();
+
+protected:
+ TextInserter(NotationView*);
+ Text m_text;
+};
+
+
+
+}
+
+#endif
diff --git a/src/gui/editors/notation/TrackHeader.cpp b/src/gui/editors/notation/TrackHeader.cpp
new file mode 100644
index 0000000..32fab2f
--- /dev/null
+++ b/src/gui/editors/notation/TrackHeader.cpp
@@ -0,0 +1,450 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ This file is Copyright 2007-2008
+ Yves Guillemot <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+
+#include "TrackHeader.h"
+#include "HeadersGroup.h"
+#include "base/Composition.h"
+#include "base/NotationTypes.h"
+#include "base/StaffExportTypes.h"
+#include "base/Colour.h"
+#include "base/ColourMap.h"
+#include "base/Track.h"
+#include "gui/general/GUIPalette.h"
+#include "gui/general/LinedStaff.h"
+#include "document/RosegardenGUIDoc.h"
+#include "misc/Strings.h"
+#include "NotePixmapFactory.h"
+#include "NotationView.h"
+#include "NotationStaff.h"
+
+#include <map>
+#include <set>
+#include <string>
+#include <utility>
+
+#include <kapplication.h>
+#include <klocale.h>
+#include <qsize.h>
+#include <qwidget.h>
+#include <qhbox.h>
+#include <qvbox.h>
+#include <qpushbutton.h>
+#include <qlabel.h>
+#include <qframe.h>
+#include <qstring.h>
+#include <qtooltip.h>
+
+
+namespace Rosegarden
+{
+
+
+// Status bits
+const int TrackHeader::SEGMENT_HERE = 1 << 0;
+const int TrackHeader::SUPERIMPOSED_SEGMENTS = 1 << 1;
+const int TrackHeader::INCONSISTENT_CLEFS = 1 << 2;
+const int TrackHeader::INCONSISTENT_KEYS = 1 << 3;
+const int TrackHeader::INCONSISTENT_LABELS = 1 << 4;
+const int TrackHeader::INCONSISTENT_TRANSPOSITIONS = 1 << 5;
+const int TrackHeader::BEFORE_FIRST_SEGMENT = 1 << 6;
+
+
+TrackHeader::TrackHeader(QWidget *parent, TrackId trackId, int height, int ypos) :
+ QLabel(parent),
+ m_track(trackId),
+ m_height(height),
+ m_ypos(ypos),
+ m_lastClef(Clef()),
+ m_lastKey(Rosegarden::Key()),
+ m_lastLabel(QString("")),
+ m_lastTranspose(0),
+ m_lastUpperText(QString("")),
+ m_neverUpdated(true),
+ m_isCurrent(true),
+ m_lastStatusPart(0),
+ m_lastWidth(0),
+ m_key(Rosegarden::Key()),
+ m_label(QString("")),
+ m_transpose(0),
+ m_status(0),
+ m_current(false)
+{
+
+ m_notationView = static_cast<HeadersGroup *>(parent)->getNotationView();
+
+ setFrameStyle(QFrame::Box | QFrame::Plain);
+ setCurrent(false);
+
+
+ //
+ // Tooltip text creation
+
+ Composition *comp =
+ static_cast<HeadersGroup *>(parent)->getComposition();
+ Track *track = comp->getTrackById(m_track);
+ int trackPos = comp->getTrackPositionById(m_track);
+
+ QString toolTipText = QString(i18n("Track %1 : \"%2\"")
+ .arg(trackPos + 1)
+ .arg(strtoqstr(track->getLabel())));
+
+ QString preset = track->getPresetLabel();
+ if (preset != QString(""))
+ toolTipText += QString(i18n("\nNotate for: %1").arg(preset));
+
+ QString notationSize = i18n("normal");
+ switch (track->getStaffSize()) {
+ case StaffTypes::Small:
+ notationSize = i18n("small");
+ break;
+ case StaffTypes::Tiny:
+ notationSize = i18n("tiny");
+ break;
+ }
+
+ QString bracketText = i18n("--");
+ switch (track->getStaffBracket()) {
+ case Brackets::SquareOn:
+ bracketText = "[-";
+ break;
+ case Brackets::SquareOff:
+ bracketText = "-]";
+ break;
+ case Brackets::SquareOnOff:
+ bracketText = "[-]";
+ break;
+ case Brackets::CurlyOn:
+ bracketText = "{-";
+ break;
+ case Brackets::CurlyOff:
+ bracketText = "-}";
+ break;
+ case Brackets::CurlySquareOn:
+ bracketText = "{[-";
+ break;
+ case Brackets::CurlySquareOff:
+ bracketText = "-]}";
+ break;
+ }
+
+ toolTipText += QString(i18n("\nSize: %1, Bracket: %2 "))
+ .arg(notationSize)
+ .arg(bracketText);
+
+ // Sort segments by position on the track
+ SortedSegments segments;
+ for (int i=0; i<m_notationView->getStaffCount(); i++) {
+
+ NotationStaff * notationStaff = m_notationView->getNotationStaff(i);
+ Segment &segment = notationStaff->getSegment();
+ TrackId trackId = segment.getTrack();
+
+ if (trackId == m_track) {
+ segments.insert(&segment);
+ }
+ }
+
+ for (SortedSegments::iterator i=segments.begin(); i!=segments.end(); ++i) {
+ timeT segStart = (*i)->getStartTime();
+ timeT segEnd = (*i)->getEndMarkerTime();
+ int barStart = comp->getBarNumber(segStart) + 1;
+ int barEnd = comp->getBarNumber(segEnd) + 1;
+
+ int transpose = (*i)->getTranspose();
+ if (transpose) {
+ QString transposeName;
+ transposeValueToName(transpose, transposeName);
+ toolTipText += QString(i18n("\nbars [%1-%2] in %3 (tr=%4) : \"%5\""))
+ .arg(barStart)
+ .arg(barEnd)
+ .arg(transposeName)
+ .arg(transpose)
+ .arg(strtoqstr((*i)->getLabel()));
+ } else {
+ toolTipText += QString(i18n("\nbars [%1-%2] (tr=%3) : \"%4\""))
+ .arg(barStart)
+ .arg(barEnd)
+ .arg(transpose)
+ .arg(strtoqstr((*i)->getLabel()));
+ }
+ }
+
+ QToolTip::add(this, toolTipText);
+
+ m_firstSeg = *segments.begin();
+ m_firstSegStartTime = m_firstSeg->getStartTime();
+
+ /// This may not work if two segments are superimposed
+ /// at the beginning of the track (inconsistencies are
+ /// not detected).
+ /// TODO : Look for the first segment(s) in
+ /// lookAtStaff() and not here.
+}
+
+void
+TrackHeader::setCurrent(bool current)
+{
+ /// TODO : use colours from GUIPalette
+
+ if (current != m_isCurrent) {
+ m_isCurrent = current;
+ if (current) {
+ setLineWidth(2);
+ setMargin(0);
+ setPaletteForegroundColor(QColor(0, 0, 255));
+ } else {
+ setLineWidth(1);
+ setMargin(1);
+ setPaletteForegroundColor(QColor(0, 0, 0));
+ }
+ }
+}
+
+void
+TrackHeader::transposeValueToName(int transpose, QString &transposeName)
+{
+
+ /// TODO : Should be rewrited using methods from Pitch class
+
+ int noteIndex = transpose % 12;
+ if (noteIndex < 0) noteIndex += 12;
+
+ switch(noteIndex) {
+ case 0 : transposeName = i18n("C"); break;
+ case 1 : transposeName = i18n("C#"); break;
+ case 2 : transposeName = i18n("D"); break;
+ case 3 : transposeName = i18n("Eb"); break;
+ case 4 : transposeName = i18n("E"); break;
+ case 5 : transposeName = i18n("F"); break;
+ case 6 : transposeName = i18n("F#"); break;
+ case 7 : transposeName = i18n("G"); break;
+ case 8 : transposeName = i18n("G#"); break;
+ case 9 : transposeName = i18n("A"); break;
+ case 10 : transposeName = i18n("Bb"); break;
+ case 11 : transposeName = i18n("B"); break;
+ }
+}
+
+int
+TrackHeader::lookAtStaff(double x, int maxWidth)
+{
+ // Read Clef and Key on canvas at (x, m_ypos + m_height / 2)
+ // then guess the header needed width and return it
+
+ // When walking through the segments :
+ // clef, key, label and transpose are current values
+ // clef0, key0, label0 and transpose0 are preceding values used to look
+ // for inconsistencies
+ // key1, label1 and transpose1 are "visible" (opposed at invisible as are
+ // key=<C major>, label="" or transpose=0)
+ // preceding or current values which may be
+ // displayed with a red colour if some
+ // inconsistency occurs.
+ Clef clef, clef0;
+ Rosegarden::Key key, key0, key1 = Rosegarden::Key("C major");
+ QString label = QString(""), label0, label1 = QString("");
+ int transpose = 0, transpose0, transpose1 = 0;
+
+ int staff;
+
+ Composition *comp =
+ static_cast<HeadersGroup *>(parent())->getComposition();
+ Track *track = comp->getTrackById(m_track);
+ int trackPos = comp->getTrackPositionById(m_track);
+
+ int status = 0;
+ bool current = false;
+ for (int i=0; i<m_notationView->getStaffCount(); i++) {
+ NotationStaff * notationStaff = m_notationView->getNotationStaff(i);
+ Segment &segment = notationStaff->getSegment();
+ TrackId trackId = segment.getTrack();
+ if (trackId == m_track) {
+
+ /// TODO : What if a segment has been moved ???
+ timeT xTime = notationStaff->getTimeAtCanvasCoords(x, m_ypos);
+ if (xTime < m_firstSegStartTime) {
+ status |= BEFORE_FIRST_SEGMENT;
+ /// TODO : What if superimposed segments ???
+ m_firstSeg->getFirstClefAndKey(clef, key);
+ label = strtoqstr(m_firstSeg->getLabel());
+ transpose = m_firstSeg->getTranspose();
+ current = current || m_notationView->isCurrentStaff(i);
+ break;
+ }
+ timeT segStart = segment.getStartTime();
+ timeT segEnd = segment.getEndMarkerTime();
+ current = current || m_notationView->isCurrentStaff(i);
+
+ if ((xTime >= segStart) && (xTime < segEnd)) {
+
+ notationStaff->getClefAndKeyAtCanvasCoords(x,
+ m_ypos + m_height / 2, clef, key);
+ label = strtoqstr(segment.getLabel());
+ transpose = segment.getTranspose();
+
+ if (status & SEGMENT_HERE) {
+ status |= SUPERIMPOSED_SEGMENTS;
+ if (clef != clef0)
+ status |= INCONSISTENT_CLEFS;
+ if (key != key0)
+ status |= INCONSISTENT_KEYS;
+ if (label != label0)
+ status |= INCONSISTENT_LABELS;
+ if (transpose != transpose0)
+ status |= INCONSISTENT_TRANSPOSITIONS;
+ } else {
+ status |= SEGMENT_HERE;
+ }
+
+ staff = i;
+
+ // If current value is visible, remember it
+ if (key.getAccidentalCount()) key1 = key;
+ if (label.stripWhiteSpace().length()) label1 = label;
+ if (transpose) transpose1 = transpose;
+
+ // Current values become last values
+ clef0 = clef;
+ key0 = key;
+ label0 = label;
+ transpose0 = transpose;
+ } // if(xTime...)
+ } // if(trackId...)
+ }
+
+ // Remember current data (but only visible data if inconsistency)
+ m_clef = clef;
+ m_key = (status & INCONSISTENT_KEYS) ? key1 : key;
+ m_label = (status & INCONSISTENT_LABELS) ? label1 : label;
+ m_transpose = (status & INCONSISTENT_TRANSPOSITIONS) ? transpose1 : transpose;
+ m_current = current;
+ m_status = status;
+
+ QString noteName;
+ transposeValueToName(m_transpose, noteName);
+
+ m_upperText = QString(i18n("%1: %2")
+ .arg(trackPos + 1)
+ .arg(strtoqstr(track->getLabel())));
+ if (m_transpose) m_transposeText = i18n(" in %1").arg(noteName);
+ else m_transposeText = QString("");
+
+ NotePixmapFactory * npf = m_notationView->getNotePixmapFactory();
+ int clefAndKeyWidth = npf->getClefAndKeyWidth(m_key, m_clef);
+
+ // How many text lines may be written above or under the clef
+ // in track header ?
+ m_numberOfTextLines = npf->getTrackHeaderNTL(m_height);
+
+ int trackLabelWidth =
+ npf->getTrackHeaderTextWidth(m_upperText + m_transposeText)
+ / m_numberOfTextLines;
+ int segmentNameWidth =
+ npf->getTrackHeaderTextWidth(m_label) / m_numberOfTextLines;
+
+ // Get the max. width from upper text and lower text
+ int width = (segmentNameWidth > trackLabelWidth)
+ ? segmentNameWidth : trackLabelWidth;
+
+ // Text width is limited by max header Width
+ if (width > maxWidth) width = maxWidth;
+
+ // But clef and key width may override max header width
+ if (width < clefAndKeyWidth) width = clefAndKeyWidth;
+
+ return width;
+}
+
+
+
+void
+TrackHeader::updateHeader(int width)
+{
+
+ // Update the header (using given width) if necessary
+
+ // Filter out bits whose display doesn't depend from
+ int statusPart = m_status & ~(SUPERIMPOSED_SEGMENTS);
+
+ // Header should be updated only if necessary
+ if ( m_neverUpdated
+ || (width != m_lastWidth)
+ || (statusPart != m_lastStatusPart)
+ || (m_key != m_lastKey)
+ || (m_clef != m_lastClef)
+ || (m_label != m_lastLabel)
+ || (m_upperText != m_lastUpperText)
+ || (m_transpose != m_lastTranspose)) {
+
+ m_neverUpdated = false;
+ m_lastStatusPart = statusPart;
+ m_lastKey = m_key;
+ m_lastClef = m_clef;
+ m_lastLabel = m_label;
+ m_lastTranspose = m_transpose;
+ m_lastUpperText = m_upperText;
+
+ bool drawClef = true;
+ QColor clefColour;
+ if (m_status & (SEGMENT_HERE | BEFORE_FIRST_SEGMENT)) {
+ if (m_status & (INCONSISTENT_CLEFS | INCONSISTENT_KEYS))
+ clefColour = Qt::red;
+ else
+ clefColour = Qt::black;
+ } else {
+ drawClef = false;
+ }
+
+ NotePixmapFactory * npf = m_notationView->getNotePixmapFactory();
+ QPixmap pmap = NotePixmapFactory::toQPixmap(
+ npf->makeTrackHeaderPixmap(width, m_height, this));
+
+ setPixmap(pmap);
+ setFixedWidth(width);
+
+ // Forced width may differ from localy computed width
+ m_lastWidth = width;
+ }
+
+ // Highlight header if track is the current one
+ setCurrent(m_current);
+}
+
+bool
+TrackHeader::SegmentCmp::operator()(const Segment * s1, const Segment * s2) const
+{
+ // Sort segments by start time, then by end time
+ if (s1->getStartTime() < s2->getStartTime()) return true;
+ if (s1->getStartTime() > s2->getStartTime()) return false;
+ if (s1->getEndMarkerTime() < s2->getEndMarkerTime()) return true;
+ return false;
+}
+
+}
+#include "TrackHeader.moc"
diff --git a/src/gui/editors/notation/TrackHeader.h b/src/gui/editors/notation/TrackHeader.h
new file mode 100644
index 0000000..0104430
--- /dev/null
+++ b/src/gui/editors/notation/TrackHeader.h
@@ -0,0 +1,219 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ This file is Copyright 2007-2008
+ Yves Guillemot <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#ifndef _RG_TRACKHEADER_H_
+#define _RG_TRACKHEADER_H_
+
+#include "base/NotationTypes.h"
+#include "base/Track.h"
+
+#include <qsize.h>
+#include <qwidget.h>
+#include <qlabel.h>
+
+#include <set>
+
+class QLabel;
+
+
+namespace Rosegarden
+{
+
+class NotePixmapFactory;
+class NotationView;
+class ColourMap;
+class Segment;
+
+class TrackHeader : public QLabel
+{
+ Q_OBJECT
+public:
+ /**
+ * Create a new track header for track of id trackId.
+ * *parent is the parent widget, height the height of staff and
+ * ypos is the staff y position on canvas.
+ */
+ TrackHeader(QWidget *parent, TrackId trackId, int height, int ypos);
+
+ /**
+ * Draw a blue line around header when current is true
+ * (intended to highlight the "current" track).
+ */
+ void setCurrent(bool current);
+
+ /**
+ * Examine staff at x position and gather data needed to draw
+ * the track header.
+ * Return the minimum width required to display the track header.
+ * maxWidth is the maximum width allowed to show text. Return width
+ * may be greater than maxWidth if needed to show clef and key signature.
+ * (Header have always to show complete clef and key signature).
+ */
+ int lookAtStaff(double x, int maxWidth);
+
+ /**
+ * (Re)draw the header on the notation view using the data gathered
+ * by lookAtStaff() last call and the specified width.
+ */
+ void updateHeader(int width);
+
+ /**
+ * Return the Id of the associated track.
+ */
+ TrackId getId()
+ { return m_track;
+ }
+
+ /**
+ * Return how many text lines may be written in the header (above
+ * the clef and under the clef).
+ * This data is coming from the last call of lookAtStaff().
+ */
+ int getNumberOfTextLines() { return m_numberOfTextLines; }
+
+ /**
+ * Return the Clef to draw in the header
+ */
+ Clef & getClef() { return m_clef; }
+
+ /**
+ * Get which key signature should be drawn in the header
+ * from the last call of lookAtStaff().
+ */
+ Rosegarden::Key & getKey() { return m_key; }
+
+ /**
+ * Return true if a Clef (and a key signature) have to be drawn in the header
+ */
+ bool isAClefToDraw()
+ {
+ return (m_status & SEGMENT_HERE) || (m_status & BEFORE_FIRST_SEGMENT);
+ }
+
+ /**
+ * Return the text to write in the header top
+ */
+ QString getUpperText() { return m_upperText; }
+
+ /**
+ * Return the transposition text
+ * (to be written at the end of the upper text)
+ */
+ QString getTransposeText() { return m_transposeText; }
+
+ /**
+ * Return the text to write in the header bottom
+ */
+ QString getLowerText() { return m_label; }
+
+ /**
+ * Return true if two segments or more are superimposed and are
+ * not using the same clef
+ */
+ bool isClefInconsistent() { return m_status & INCONSISTENT_CLEFS; }
+
+ /**
+ * Return true if two segments or more are superimposed and are
+ * not using the same key signature
+ */
+ bool isKeyInconsistent() { return m_status & INCONSISTENT_KEYS; }
+
+ /**
+ * Return true if two segments or more are superimposed and are
+ * not using the same label
+ */
+ bool isLabelInconsistent() { return m_status & INCONSISTENT_LABELS; }
+
+ /**
+ * Return true if two segments or more are superimposed and are
+ * not using the same transposition
+ */
+ bool isTransposeInconsistent()
+ {
+ return m_status & INCONSISTENT_TRANSPOSITIONS;
+ }
+
+
+private :
+ /**
+ * Convert the transpose value to the instrument tune and
+ * return it in a printable string.
+ */
+ void transposeValueToName(int transpose, QString &transposeName);
+
+
+ // Status bits
+ static const int SEGMENT_HERE;
+ static const int SUPERIMPOSED_SEGMENTS;
+ static const int INCONSISTENT_CLEFS;
+ static const int INCONSISTENT_KEYS;
+ static const int INCONSISTENT_LABELS;
+ static const int INCONSISTENT_TRANSPOSITIONS;
+ static const int BEFORE_FIRST_SEGMENT;
+
+ TrackId m_track;
+ int m_height;
+ int m_ypos;
+ NotationView * m_notationView;
+
+ Clef m_lastClef;
+ Rosegarden::Key m_lastKey;
+ QString m_lastLabel;
+ int m_lastTranspose;
+ QString m_lastUpperText;
+ bool m_neverUpdated;
+ bool m_isCurrent;
+ int m_lastStatusPart;
+ int m_lastWidth;
+
+ Clef m_clef;
+ Rosegarden::Key m_key;
+ QString m_label;
+ int m_transpose;
+ int m_status;
+ bool m_current;
+
+ QString m_upperText;
+ QString m_transposeText;
+ int m_numberOfTextLines;
+
+ // Used to sort the segments listed in the header toolTipText
+ struct SegmentCmp {
+ bool operator()(const Segment *s1, const Segment *s2) const;
+ };
+ typedef std::multiset<Segment *, SegmentCmp> SortedSegments;
+
+ // First segment on the track.
+ Segment * m_firstSeg;
+ timeT m_firstSegStartTime;
+};
+
+}
+
+#endif
diff --git a/src/gui/editors/parameters/AudioInstrumentParameterPanel.cpp b/src/gui/editors/parameters/AudioInstrumentParameterPanel.cpp
new file mode 100644
index 0000000..44a202b
--- /dev/null
+++ b/src/gui/editors/parameters/AudioInstrumentParameterPanel.cpp
@@ -0,0 +1,437 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "AudioInstrumentParameterPanel.h"
+#include <qlayout.h>
+#include <kapplication.h>
+
+#include <klocale.h>
+#include "misc/Debug.h"
+#include "misc/Strings.h"
+#include "base/AudioPluginInstance.h"
+#include "base/Instrument.h"
+#include "base/MidiProgram.h"
+#include "document/RosegardenGUIDoc.h"
+#include "gui/studio/AudioPluginManager.h"
+#include "gui/studio/AudioPlugin.h"
+#include "gui/studio/StudioControl.h"
+#include "gui/widgets/AudioFaderBox.h"
+#include "gui/widgets/AudioVUMeter.h"
+#include "gui/widgets/Fader.h"
+#include "gui/widgets/Rotary.h"
+#include "gui/widgets/AudioRouteMenu.h"
+#include "InstrumentParameterPanel.h"
+#include "sound/MappedCommon.h"
+#include "sound/MappedStudio.h"
+#include <qcolor.h>
+#include <qframe.h>
+#include <qlabel.h>
+#include <qpalette.h>
+#include <qpixmap.h>
+#include <qpushbutton.h>
+#include <qstring.h>
+#include <qtooltip.h>
+#include <qwidget.h>
+#include <qsignalmapper.h>
+
+
+namespace Rosegarden
+{
+
+void
+AudioInstrumentParameterPanel::slotSelectAudioLevel(float dB)
+{
+ if (m_selectedInstrument == 0)
+ return ;
+
+ if (m_selectedInstrument->getType() == Instrument::Audio ||
+ m_selectedInstrument->getType() == Instrument::SoftSynth) {
+ m_selectedInstrument->setLevel(dB);
+
+ StudioControl::setStudioObjectProperty
+ (MappedObjectId(m_selectedInstrument->getMappedId()),
+ MappedAudioFader::FaderLevel,
+ MappedObjectValue(dB));
+ }
+
+ emit updateAllBoxes();
+ emit instrumentParametersChanged(m_selectedInstrument->getId());
+}
+
+void
+AudioInstrumentParameterPanel::slotSelectAudioRecordLevel(float dB)
+{
+ if (m_selectedInstrument == 0)
+ return ;
+
+ // std::cerr << "AudioInstrumentParameterPanel::slotSelectAudioRecordLevel("
+ // << dB << ")" << std::endl;
+
+ if (m_selectedInstrument->getType() == Instrument::Audio) {
+ m_selectedInstrument->setRecordLevel(dB);
+
+ StudioControl::setStudioObjectProperty
+ (MappedObjectId(m_selectedInstrument->getMappedId()),
+ MappedAudioFader::FaderRecordLevel,
+ MappedObjectValue(dB));
+
+ emit updateAllBoxes();
+ emit instrumentParametersChanged(m_selectedInstrument->getId());
+ }
+}
+
+void
+AudioInstrumentParameterPanel::slotPluginSelected(InstrumentId instrumentId,
+ int index, int plugin)
+{
+ if (!m_selectedInstrument ||
+ instrumentId != m_selectedInstrument->getId())
+ return ;
+
+ RG_DEBUG << "AudioInstrumentParameterPanel::slotPluginSelected - "
+ << "instrument = " << instrumentId
+ << ", index = " << index
+ << ", plugin = " << plugin << endl;
+
+ QColor pluginBackgroundColour = Qt::black;
+ bool bypassed = false;
+
+ QPushButton *button = 0;
+ QString noneText;
+
+ // updates synth gui button &c:
+ m_audioFader->slotSetInstrument(&m_doc->getStudio(), m_selectedInstrument);
+
+ if (index == (int)Instrument::SYNTH_PLUGIN_POSITION) {
+ button = m_audioFader->m_synthButton;
+ noneText = i18n("<no synth>");
+ } else {
+ button = m_audioFader->m_plugins[index];
+ noneText = i18n("<no plugin>");
+ }
+
+ if (!button)
+ return ;
+
+ if (plugin == -1) {
+
+ button->setText(noneText);
+ QToolTip::add
+ (button, noneText);
+
+ } else {
+
+ AudioPlugin *pluginClass = m_doc->getPluginManager()->getPlugin(plugin);
+
+ if (pluginClass) {
+ button->setText(pluginClass->getLabel());
+
+ QToolTip::add
+ (button, pluginClass->getLabel());
+
+ pluginBackgroundColour = pluginClass->getColour();
+ }
+ }
+
+ AudioPluginInstance *inst =
+ m_selectedInstrument->getPlugin(index);
+
+ if (inst)
+ bypassed = inst->isBypassed();
+
+ setButtonColour(index, bypassed, pluginBackgroundColour);
+
+ if (index == (int)Instrument::SYNTH_PLUGIN_POSITION) {
+ emit changeInstrumentLabel(instrumentId, button->text());
+ }
+}
+
+void
+AudioInstrumentParameterPanel::slotPluginBypassed(InstrumentId instrumentId,
+ int pluginIndex, bool bp)
+{
+ if (!m_selectedInstrument ||
+ instrumentId != m_selectedInstrument->getId())
+ return ;
+
+ AudioPluginInstance *inst =
+ m_selectedInstrument->getPlugin(pluginIndex);
+
+ QColor backgroundColour = Qt::black; // default background colour
+
+ if (inst && inst->isAssigned()) {
+ AudioPlugin *pluginClass
+ = m_doc->getPluginManager()->getPlugin(
+ m_doc->getPluginManager()->
+ getPositionByIdentifier(inst->getIdentifier().c_str()));
+
+ /// Set the colour on the button
+ //
+ if (pluginClass)
+ backgroundColour = pluginClass->getColour();
+ }
+
+ setButtonColour(pluginIndex, bp, backgroundColour);
+}
+
+void
+AudioInstrumentParameterPanel::setButtonColour(
+ int pluginIndex, bool bypassState, const QColor &colour)
+{
+ RG_DEBUG << "AudioInstrumentParameterPanel::setButtonColour "
+ << "pluginIndex = " << pluginIndex
+ << ", bypassState = " << bypassState
+ << ", rgb = " << colour.name() << endl;
+
+ QPushButton *button = 0;
+
+ if (pluginIndex == Instrument::SYNTH_PLUGIN_POSITION) {
+ button = m_audioFader->m_synthButton;
+ } else {
+ button = m_audioFader->m_plugins[pluginIndex];
+ }
+
+ if (!button)
+ return ;
+
+ // Set the bypass colour on the plugin button
+ if (bypassState) {
+ button->
+ setPaletteForegroundColor(kapp->palette().
+ color(QPalette::Active, QColorGroup::Button));
+
+ button->
+ setPaletteBackgroundColor(kapp->palette().
+ color(QPalette::Active, QColorGroup::ButtonText));
+ } else if (colour == Qt::black) {
+ button->
+ setPaletteForegroundColor(kapp->palette().
+ color(QPalette::Active, QColorGroup::ButtonText));
+
+ button->
+ setPaletteBackgroundColor(kapp->palette().
+ color(QPalette::Active, QColorGroup::Button));
+ } else {
+ button->
+ setPaletteForegroundColor(Qt::white);
+
+ button->
+ setPaletteBackgroundColor(colour);
+ }
+}
+
+AudioInstrumentParameterPanel::AudioInstrumentParameterPanel(RosegardenGUIDoc* doc, QWidget* parent)
+ : InstrumentParameterPanel(doc, parent),
+ m_audioFader(new AudioFaderBox(this))
+{
+ QGridLayout *gridLayout = new QGridLayout(this, 3, 2, 5, 5);
+
+ // Instrument label : first row, all cols
+ gridLayout->addMultiCellWidget(m_instrumentLabel, 0, 0, 0, 1, AlignCenter);
+
+ // fader and connect it
+ gridLayout->addMultiCellWidget(m_audioFader, 1, 1, 0, 1);
+
+ gridLayout->setRowStretch(2, 1);
+
+ connect(m_audioFader, SIGNAL(audioChannelsChanged(int)),
+ this, SLOT(slotAudioChannels(int)));
+
+ connect(m_audioFader->m_signalMapper, SIGNAL(mapped(int)),
+ this, SLOT(slotSelectPlugin(int)));
+
+ connect(m_audioFader->m_fader, SIGNAL(faderChanged(float)),
+ this, SLOT(slotSelectAudioLevel(float)));
+
+ connect(m_audioFader->m_recordFader, SIGNAL(faderChanged(float)),
+ this, SLOT(slotSelectAudioRecordLevel(float)));
+
+ connect(m_audioFader->m_pan, SIGNAL(valueChanged(float)),
+ this, SLOT(slotSetPan(float)));
+
+ connect(m_audioFader->m_audioOutput, SIGNAL(changed()),
+ this, SLOT(slotAudioRoutingChanged()));
+
+ connect(m_audioFader->m_audioInput, SIGNAL(changed()),
+ this, SLOT(slotAudioRoutingChanged()));
+
+ connect(m_audioFader->m_synthButton, SIGNAL(clicked()),
+ this, SLOT(slotSynthButtonClicked()));
+
+ connect(m_audioFader->m_synthGUIButton, SIGNAL(clicked()),
+ this, SLOT(slotSynthGUIButtonClicked()));
+}
+
+void
+AudioInstrumentParameterPanel::slotSynthButtonClicked()
+{
+ slotSelectPlugin(Instrument::SYNTH_PLUGIN_POSITION);
+}
+
+void
+AudioInstrumentParameterPanel::slotSynthGUIButtonClicked()
+{
+ emit showPluginGUI(m_selectedInstrument->getId(),
+ Instrument::SYNTH_PLUGIN_POSITION);
+}
+
+void
+AudioInstrumentParameterPanel::slotSetPan(float pan)
+{
+ RG_DEBUG << "AudioInstrumentParameterPanel::slotSetPan - "
+ << "pan = " << pan << endl;
+
+ StudioControl::setStudioObjectProperty
+ (MappedObjectId(m_selectedInstrument->getMappedId()),
+ MappedAudioFader::Pan,
+ MappedObjectValue(pan));
+
+ m_selectedInstrument->setPan(MidiByte(pan + 100.0));
+ emit instrumentParametersChanged(m_selectedInstrument->getId());
+}
+
+void
+AudioInstrumentParameterPanel::setAudioMeter(float dBleft, float dBright,
+ float recDBleft, float recDBright)
+{
+ // RG_DEBUG << "AudioInstrumentParameterPanel::setAudioMeter: (" << dBleft
+ // << "," << dBright << ")" << endl;
+
+ if (m_selectedInstrument) {
+ // Always set stereo, because we have to reflect what's happening
+ // with the pan setting even on mono tracks
+ m_audioFader->m_vuMeter->setLevel(dBleft, dBright);
+ m_audioFader->m_vuMeter->setRecordLevel(recDBleft, recDBright);
+ }
+}
+
+void
+AudioInstrumentParameterPanel::setupForInstrument(Instrument* instrument)
+{
+ blockSignals(true);
+
+ m_selectedInstrument = instrument;
+
+ m_instrumentLabel->setText(strtoqstr(instrument->getName()));
+
+ m_audioFader->m_recordFader->setFader(instrument->getRecordLevel());
+ m_audioFader->m_fader->setFader(instrument->getLevel());
+
+ m_audioFader->slotSetInstrument(&m_doc->getStudio(), instrument);
+
+ int start = 0;
+
+ if (instrument->getType() == Instrument::SoftSynth)
+ start = -1;
+
+ for (int i = start; i < int(m_audioFader->m_plugins.size()); i++) {
+ int index;
+ QPushButton *button;
+ QString noneText;
+
+ if (i == -1) {
+ index = Instrument::SYNTH_PLUGIN_POSITION;
+ button = m_audioFader->m_synthButton;
+ noneText = i18n("<no synth>");
+ } else {
+ index = i;
+ button = m_audioFader->m_plugins[i];
+ noneText = i18n("<no plugin>");
+ }
+
+ button->show();
+
+ AudioPluginInstance *inst = instrument->getPlugin(index);
+
+ if (inst && inst->isAssigned()) {
+ AudioPlugin *pluginClass
+ = m_doc->getPluginManager()->getPlugin(
+ m_doc->getPluginManager()->
+ getPositionByIdentifier(inst->getIdentifier().c_str()));
+
+ if (pluginClass) {
+ button->setText(pluginClass->getLabel());
+ QToolTip::add
+ (button, pluginClass->getLabel());
+ setButtonColour(index, inst->isBypassed(),
+ pluginClass->getColour());
+ }
+ } else {
+ button->setText(noneText);
+ QToolTip::add
+ (button, noneText);
+ setButtonColour(index, inst ? inst->isBypassed() : false, Qt::black);
+ }
+ }
+
+ // Set the number of channels on the fader widget
+ //
+ m_audioFader->setAudioChannels(instrument->getAudioChannels());
+
+ // Pan - adjusted backwards
+ //
+ m_audioFader->m_pan->setPosition(instrument->getPan() - 100);
+
+ // Tell fader box whether to include e.g. audio input selection
+ //
+ m_audioFader->setIsSynth(instrument->getType() == Instrument::SoftSynth);
+
+ blockSignals(false);
+}
+
+void
+AudioInstrumentParameterPanel::slotAudioChannels(int channels)
+{
+ RG_DEBUG << "AudioInstrumentParameterPanel::slotAudioChannels - "
+ << "channels = " << channels << endl;
+
+ m_selectedInstrument->setAudioChannels(channels);
+
+ StudioControl::setStudioObjectProperty
+ (MappedObjectId(m_selectedInstrument->getMappedId()),
+ MappedAudioFader::Channels,
+ MappedObjectValue(channels));
+
+ emit instrumentParametersChanged(m_selectedInstrument->getId());
+
+}
+
+void
+AudioInstrumentParameterPanel::slotAudioRoutingChanged()
+{
+ if (m_selectedInstrument)
+ emit instrumentParametersChanged(m_selectedInstrument->getId());
+}
+
+void
+AudioInstrumentParameterPanel::slotSelectPlugin(int index)
+{
+ if (m_selectedInstrument) {
+ emit selectPlugin(0, m_selectedInstrument->getId(), index);
+ }
+}
+
+}
+#include "AudioInstrumentParameterPanel.moc"
diff --git a/src/gui/editors/parameters/AudioInstrumentParameterPanel.h b/src/gui/editors/parameters/AudioInstrumentParameterPanel.h
new file mode 100644
index 0000000..932e6bc
--- /dev/null
+++ b/src/gui/editors/parameters/AudioInstrumentParameterPanel.h
@@ -0,0 +1,107 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_AUDIOINSTRUMENTPARAMETERPANEL_H_
+#define _RG_AUDIOINSTRUMENTPARAMETERPANEL_H_
+
+#include "base/MidiProgram.h"
+#include "InstrumentParameterPanel.h"
+#include <qpixmap.h>
+#include <qstring.h>
+
+
+class QWidget;
+class QColor;
+
+
+namespace Rosegarden
+{
+
+class RosegardenGUIDoc;
+class Instrument;
+class AudioFaderBox;
+
+
+class AudioInstrumentParameterPanel : public InstrumentParameterPanel
+{
+ Q_OBJECT
+public:
+ AudioInstrumentParameterPanel(RosegardenGUIDoc* doc, QWidget* parent);
+
+ virtual void setupForInstrument(Instrument*);
+
+ // Set the audio meter to a given level for a maximum of
+ // two channels.
+ //
+ void setAudioMeter(float dBleft, float dBright,
+ float recDBleft, float recDBright);
+
+ // Set the button colour
+ //
+ void setButtonColour(int pluginIndex, bool bypassState,
+ const QColor &color);
+
+public slots:
+ // From AudioFaderBox
+ //
+ void slotSelectAudioLevel(float dB);
+ void slotSelectAudioRecordLevel(float dB);
+ void slotAudioChannels(int channels);
+ void slotAudioRoutingChanged();
+ void slotSelectPlugin(int index);
+
+ // From the parameter box clicks
+ void slotSetPan(float pan);
+
+ // From Plugin dialog
+ //
+ void slotPluginSelected(InstrumentId id, int index, int plugin);
+ void slotPluginBypassed(InstrumentId id, int pluginIndex, bool bp);
+
+ void slotSynthButtonClicked();
+ void slotSynthGUIButtonClicked();
+
+signals:
+ void selectPlugin(QWidget *, InstrumentId, int index);
+ void instrumentParametersChanged(InstrumentId);
+ void showPluginGUI(InstrumentId, int index);
+ void changeInstrumentLabel(InstrumentId id, QString label);
+
+protected:
+ //--------------- Data members ---------------------------------
+
+ AudioFaderBox *m_audioFader;
+
+private:
+
+ QPixmap m_monoPixmap;
+ QPixmap m_stereoPixmap;
+
+};
+
+
+}
+
+#endif
diff --git a/src/gui/editors/parameters/InstrumentParameterBox.cpp b/src/gui/editors/parameters/InstrumentParameterBox.cpp
new file mode 100644
index 0000000..8114e0d
--- /dev/null
+++ b/src/gui/editors/parameters/InstrumentParameterBox.cpp
@@ -0,0 +1,265 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "InstrumentParameterBox.h"
+#include <qlayout.h>
+
+#include <klocale.h>
+#include "misc/Debug.h"
+#include "AudioInstrumentParameterPanel.h"
+#include "base/Instrument.h"
+#include "base/MidiProgram.h"
+#include "document/RosegardenGUIDoc.h"
+#include "MIDIInstrumentParameterPanel.h"
+#include "RosegardenParameterArea.h"
+#include "RosegardenParameterBox.h"
+#include <ktabwidget.h>
+#include <qfont.h>
+#include <qframe.h>
+#include <qscrollview.h>
+#include <qstring.h>
+#include <qvbox.h>
+#include <qwidget.h>
+#include <qwidgetstack.h>
+
+
+namespace Rosegarden
+{
+
+InstrumentParameterBox::InstrumentParameterBox(RosegardenGUIDoc *doc,
+ QWidget *parent)
+ : RosegardenParameterBox(i18n("Instrument"),
+ i18n("Instrument Parameters"),
+ parent),
+ m_widgetStack(new QWidgetStack(this)),
+ m_noInstrumentParameters(new QVBox(this)),
+ m_midiInstrumentParameters(new MIDIInstrumentParameterPanel(doc, this)),
+ m_audioInstrumentParameters(new AudioInstrumentParameterPanel(doc, this)),
+ m_selectedInstrument(-1),
+ m_doc(doc),
+ m_lastShowAdditionalControlsArg(false)
+{
+ m_widgetStack->setFont(m_font);
+ m_noInstrumentParameters->setFont(m_font);
+ m_midiInstrumentParameters->setFont(m_font);
+ m_audioInstrumentParameters->setFont(m_font);
+
+ bool contains = false;
+
+ std::vector<InstrumentParameterBox*>::iterator it =
+ instrumentParamBoxes.begin();
+
+ for (; it != instrumentParamBoxes.end(); it++)
+ if ((*it) == this)
+ contains = true;
+
+ if (!contains)
+ instrumentParamBoxes.push_back(this);
+
+ m_widgetStack->addWidget(m_midiInstrumentParameters);
+ m_widgetStack->addWidget(m_audioInstrumentParameters);
+ m_widgetStack->addWidget(m_noInstrumentParameters);
+
+ m_midiInstrumentParameters->adjustSize();
+ m_audioInstrumentParameters->adjustSize();
+ m_noInstrumentParameters->adjustSize();
+
+ connect(m_audioInstrumentParameters, SIGNAL(updateAllBoxes()),
+ this, SLOT(slotUpdateAllBoxes()));
+
+ connect(m_audioInstrumentParameters,
+ SIGNAL(instrumentParametersChanged(InstrumentId)),
+ this,
+ SIGNAL(instrumentParametersChanged(InstrumentId)));
+
+ connect(m_audioInstrumentParameters,
+ SIGNAL(selectPlugin(QWidget *, InstrumentId, int)),
+ this,
+ SIGNAL(selectPlugin(QWidget *, InstrumentId, int)));
+
+ connect(m_audioInstrumentParameters,
+ SIGNAL(showPluginGUI(InstrumentId, int)),
+ this,
+ SIGNAL(showPluginGUI(InstrumentId, int)));
+
+ connect(m_midiInstrumentParameters, SIGNAL(updateAllBoxes()),
+ this, SLOT(slotUpdateAllBoxes()));
+
+ connect(m_midiInstrumentParameters,
+ SIGNAL(changeInstrumentLabel(InstrumentId, QString)),
+ this, SIGNAL(changeInstrumentLabel(InstrumentId, QString)));
+
+ connect(m_audioInstrumentParameters,
+ SIGNAL(changeInstrumentLabel(InstrumentId, QString)),
+ this, SIGNAL(changeInstrumentLabel(InstrumentId, QString)));
+
+ connect(m_midiInstrumentParameters,
+ SIGNAL(instrumentParametersChanged(InstrumentId)),
+ this,
+ SIGNAL(instrumentParametersChanged(InstrumentId)));
+
+ // Layout the groups left to right.
+
+ QBoxLayout* layout = new QVBoxLayout(this);
+ layout->addWidget(m_widgetStack);
+
+}
+
+InstrumentParameterBox::~InstrumentParameterBox()
+{
+ // deregister this parameter box
+ std::vector<InstrumentParameterBox*>::iterator it =
+ instrumentParamBoxes.begin();
+
+ for (; it != instrumentParamBoxes.end(); it++) {
+ if ((*it) == this) {
+ instrumentParamBoxes.erase(it);
+ break;
+ }
+ }
+}
+
+Instrument *
+InstrumentParameterBox::getSelectedInstrument()
+{
+ if (m_selectedInstrument < 0) return 0;
+ if (!m_doc) return 0;
+ return m_doc->getStudio().getInstrumentById(m_selectedInstrument);
+}
+
+QString
+InstrumentParameterBox::getPreviousBox(RosegardenParameterArea::Arrangement arrangement) const
+{
+ return i18n("Track");
+}
+
+void
+InstrumentParameterBox::setAudioMeter(float ch1, float ch2, float ch1r, float ch2r)
+{
+ m_audioInstrumentParameters->setAudioMeter(ch1, ch2, ch1r, ch2r);
+}
+
+void
+InstrumentParameterBox::setDocument(RosegardenGUIDoc* doc)
+{
+ m_doc = doc;
+ m_midiInstrumentParameters->setDocument(m_doc);
+ m_audioInstrumentParameters->setDocument(m_doc);
+}
+
+void
+InstrumentParameterBox::slotPluginSelected(InstrumentId id, int index, int plugin)
+{
+ m_audioInstrumentParameters->slotPluginSelected(id, index, plugin);
+}
+
+void
+InstrumentParameterBox::slotPluginBypassed(InstrumentId id, int index, bool bypassState)
+{
+ m_audioInstrumentParameters->slotPluginBypassed(id, index, bypassState);
+}
+
+void
+InstrumentParameterBox::useInstrument(Instrument *instrument)
+{
+ RG_DEBUG << "useInstrument() - populate Instrument\n";
+
+ if (instrument == 0) {
+ m_widgetStack->raiseWidget(m_noInstrumentParameters);
+ emit instrumentPercussionSetChanged(instrument);
+ return ;
+ }
+
+ // ok
+ if (instrument) {
+ m_selectedInstrument = instrument->getId();
+ } else {
+ m_selectedInstrument = -1;
+ }
+
+ // Hide or Show according to Instrument type
+ //
+ if (instrument->getType() == Instrument::Audio ||
+ instrument->getType() == Instrument::SoftSynth) {
+
+ m_audioInstrumentParameters->setupForInstrument(getSelectedInstrument());
+ m_widgetStack->raiseWidget(m_audioInstrumentParameters);
+
+ } else { // Midi
+
+ m_midiInstrumentParameters->setupForInstrument(getSelectedInstrument());
+ m_midiInstrumentParameters->showAdditionalControls(m_lastShowAdditionalControlsArg);
+ m_widgetStack->raiseWidget(m_midiInstrumentParameters);
+ emit instrumentPercussionSetChanged(instrument);
+
+ }
+
+}
+
+void
+InstrumentParameterBox::slotUpdateAllBoxes()
+{
+ emit instrumentPercussionSetChanged(getSelectedInstrument());
+
+ std::vector<InstrumentParameterBox*>::iterator it =
+ instrumentParamBoxes.begin();
+
+ // To update all open IPBs
+ //
+ for (; it != instrumentParamBoxes.end(); it++) {
+ if ((*it) != this && getSelectedInstrument() &&
+ (*it)->getSelectedInstrument() == getSelectedInstrument())
+ (*it)->useInstrument(getSelectedInstrument());
+ }
+}
+
+void
+InstrumentParameterBox::slotInstrumentParametersChanged(InstrumentId id)
+{
+ std::vector<InstrumentParameterBox*>::iterator it =
+ instrumentParamBoxes.begin();
+
+ blockSignals(true);
+
+ for (; it != instrumentParamBoxes.end(); it++) {
+ if ((*it)->getSelectedInstrument()) {
+ if ((*it)->getSelectedInstrument()->getId() == id) {
+ (*it)->useInstrument((*it)->getSelectedInstrument()); // refresh
+ }
+ }
+ }
+
+ blockSignals(false);
+}
+
+void
+InstrumentParameterBox::showAdditionalControls(bool showThem)
+{
+ m_midiInstrumentParameters->showAdditionalControls(showThem);
+ m_lastShowAdditionalControlsArg = showThem;
+}
+
+}
+#include "InstrumentParameterBox.moc"
diff --git a/src/gui/editors/parameters/InstrumentParameterBox.h b/src/gui/editors/parameters/InstrumentParameterBox.h
new file mode 100644
index 0000000..f406567
--- /dev/null
+++ b/src/gui/editors/parameters/InstrumentParameterBox.h
@@ -0,0 +1,126 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_INSTRUMENTPARAMETERBOX_H_
+#define _RG_INSTRUMENTPARAMETERBOX_H_
+
+#include "base/MidiProgram.h"
+#include "RosegardenParameterArea.h"
+#include "RosegardenParameterBox.h"
+#include <qstring.h>
+#include <vector>
+
+
+class QWidgetStack;
+class QWidget;
+class QFrame;
+
+
+namespace Rosegarden
+{
+
+class RosegardenGUIDoc;
+class MIDIInstrumentParameterPanel;
+class Instrument;
+class AudioInstrumentParameterPanel;
+
+
+/**
+ * Display and allow modification of Instrument parameters
+ */
+class InstrumentParameterBox : public RosegardenParameterBox
+{
+Q_OBJECT
+
+public:
+ InstrumentParameterBox(RosegardenGUIDoc *doc,
+ QWidget *parent = 0);
+ ~InstrumentParameterBox();
+
+ void useInstrument(Instrument *instrument);
+
+ Instrument* getSelectedInstrument();
+
+ void setAudioMeter(float dBleft, float dBright,
+ float recDBleft, float recDBright);
+
+ void setDocument(RosegardenGUIDoc* doc);
+
+ virtual void showAdditionalControls(bool showThem);
+
+ virtual QString getPreviousBox(RosegardenParameterArea::Arrangement) const;
+
+public slots:
+
+ // To update all InstrumentParameterBoxen for an Instrument. Called
+ // from one of the parameter panels when something changes.
+ //
+ void slotUpdateAllBoxes();
+
+ // Update InstrumentParameterBoxes that are showing a given instrument.
+ // Called from the Outside.
+ //
+ void slotInstrumentParametersChanged(InstrumentId id);
+
+ // From Plugin dialog
+ //
+ void slotPluginSelected(InstrumentId id, int index, int plugin);
+ void slotPluginBypassed(InstrumentId id, int pluginIndex, bool bp);
+
+signals:
+
+ void changeInstrumentLabel(InstrumentId id, QString label);
+
+ void selectPlugin(QWidget*, InstrumentId id, int index);
+ void showPluginGUI(InstrumentId id, int index);
+
+ void instrumentParametersChanged(InstrumentId);
+ void instrumentPercussionSetChanged(Instrument *);
+
+protected:
+
+ //--------------- Data members ---------------------------------
+ QWidgetStack *m_widgetStack;
+ QFrame *m_noInstrumentParameters;
+ MIDIInstrumentParameterPanel *m_midiInstrumentParameters;
+ AudioInstrumentParameterPanel *m_audioInstrumentParameters;
+
+ // -1 if no instrument, InstrumentId otherwise
+ int m_selectedInstrument;
+
+ // So we can setModified()
+ //
+ RosegardenGUIDoc *m_doc;
+ bool m_lastShowAdditionalControlsArg;
+};
+
+// Global references
+//
+static std::vector<InstrumentParameterBox*> instrumentParamBoxes;
+
+
+}
+
+#endif
diff --git a/src/gui/editors/parameters/InstrumentParameterPanel.cpp b/src/gui/editors/parameters/InstrumentParameterPanel.cpp
new file mode 100644
index 0000000..9437daf
--- /dev/null
+++ b/src/gui/editors/parameters/InstrumentParameterPanel.cpp
@@ -0,0 +1,61 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "InstrumentParameterPanel.h"
+
+#include "base/Instrument.h"
+#include "document/RosegardenGUIDoc.h"
+#include <ksqueezedtextlabel.h>
+#include <qfontmetrics.h>
+#include <qframe.h>
+#include <qlabel.h>
+#include <qwidget.h>
+
+
+namespace Rosegarden
+{
+
+InstrumentParameterPanel::InstrumentParameterPanel(RosegardenGUIDoc *doc,
+ QWidget* parent)
+ : QFrame(parent),
+ m_instrumentLabel(new KSqueezedTextLabel(this)),
+ m_selectedInstrument(0),
+ m_doc(doc)
+{
+ QFontMetrics metrics(m_instrumentLabel->fontMetrics());
+ int width25 = metrics.width("1234567890123456789012345");
+
+ m_instrumentLabel->setFixedWidth(width25);
+ m_instrumentLabel->setAlignment(Qt::AlignCenter);
+}
+
+void
+InstrumentParameterPanel::setDocument(RosegardenGUIDoc* doc)
+{
+ m_doc = doc;
+}
+
+}
+#include "InstrumentParameterPanel.moc"
diff --git a/src/gui/editors/parameters/InstrumentParameterPanel.h b/src/gui/editors/parameters/InstrumentParameterPanel.h
new file mode 100644
index 0000000..9a794d0
--- /dev/null
+++ b/src/gui/editors/parameters/InstrumentParameterPanel.h
@@ -0,0 +1,78 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_INSTRUMENTPARAMETERPANEL_H_
+#define _RG_INSTRUMENTPARAMETERPANEL_H_
+
+#include <qframe.h>
+#include <vector>
+#include <utility>
+
+class QWidget;
+class QLabel;
+
+
+namespace Rosegarden
+{
+
+class RosegardenGUIDoc;
+class Instrument;
+class Rotary;
+
+typedef std::pair<Rotary *, QLabel *> RotaryPair;
+typedef std::vector<std::pair<int, RotaryPair> > RotaryMap;
+
+
+////////////////////////////////////////////////////////////////////////
+
+class InstrumentParameterPanel : public QFrame
+{
+ Q_OBJECT
+public:
+ InstrumentParameterPanel(RosegardenGUIDoc *doc, QWidget* parent);
+
+ virtual ~InstrumentParameterPanel() {};
+
+ virtual void setupForInstrument(Instrument*) = 0;
+
+ void setDocument(RosegardenGUIDoc* doc);
+
+ void showAdditionalControls(bool showThem);
+
+signals:
+ void updateAllBoxes();
+
+protected:
+ //--------------- Data members ---------------------------------
+ QLabel *m_instrumentLabel;
+ Instrument *m_selectedInstrument;
+ RosegardenGUIDoc *m_doc;
+};
+
+
+
+}
+
+#endif
diff --git a/src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp b/src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp
new file mode 100644
index 0000000..fcd4247
--- /dev/null
+++ b/src/gui/editors/parameters/MIDIInstrumentParameterPanel.cpp
@@ -0,0 +1,1175 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "MIDIInstrumentParameterPanel.h"
+#include <qlayout.h>
+
+#include "sound/Midi.h"
+#include <klocale.h>
+#include "misc/Debug.h"
+#include "misc/Strings.h"
+#include "base/Colour.h"
+#include "base/Composition.h"
+#include "base/ControlParameter.h"
+#include "base/Instrument.h"
+#include "base/MidiDevice.h"
+#include "base/MidiProgram.h"
+#include "document/RosegardenGUIDoc.h"
+#include "gui/studio/StudioControl.h"
+#include "gui/widgets/Rotary.h"
+#include "InstrumentParameterPanel.h"
+#include "sound/MappedEvent.h"
+#include "sound/MappedInstrument.h"
+#include <kcombobox.h>
+#include <ksqueezedtextlabel.h>
+#include <qcheckbox.h>
+#include <qcolor.h>
+#include <qfontmetrics.h>
+#include <qframe.h>
+#include <qhbox.h>
+#include <qlabel.h>
+#include <qregexp.h>
+#include <qsignalmapper.h>
+#include <qstring.h>
+#include <qwidget.h>
+#include <algorithm>
+
+
+namespace Rosegarden
+{
+
+MIDIInstrumentParameterPanel::MIDIInstrumentParameterPanel(RosegardenGUIDoc *doc, QWidget* parent):
+ InstrumentParameterPanel(doc, parent),
+ m_rotaryFrame(0),
+ m_rotaryMapper(new QSignalMapper(this))
+{
+ m_mainGrid = new QGridLayout(this, 10, 3, 2, 1);
+
+ m_connectionLabel = new KSqueezedTextLabel(this);
+ m_bankValue = new KComboBox(this);
+ m_channelValue = new KComboBox(this);
+ m_programValue = new KComboBox(this);
+ m_variationValue = new KComboBox(this);
+ m_bankCheckBox = new QCheckBox(this);
+ m_programCheckBox = new QCheckBox(this);
+ m_variationCheckBox = new QCheckBox(this);
+ m_percussionCheckBox = new QCheckBox(this);
+
+ m_bankValue->setSizeLimit(20);
+ m_programValue->setSizeLimit(20);
+ m_variationValue->setSizeLimit(20);
+
+ m_bankLabel = new QLabel(i18n("Bank"), this);
+ m_variationLabel = new QLabel(i18n("Variation"), this);
+ m_programLabel = new QLabel(i18n("Program"), this);
+ QLabel *channelLabel = new QLabel(i18n("Channel out"), this);
+ QLabel *percussionLabel = new QLabel(i18n("Percussion"), this);
+
+ // Ensure a reasonable amount of space in the program dropdowns even
+ // if no instrument initially selected
+ QFontMetrics metrics(m_programValue->font());
+ int width22 = metrics.width("1234567890123456789012");
+ int width25 = metrics.width("1234567890123456789012345");
+
+ m_bankValue->setMinimumWidth(width22);
+ m_programValue->setMinimumWidth(width22);
+ m_variationValue->setMinimumWidth(width22);
+
+ m_connectionLabel->setFixedWidth(width25);
+ m_connectionLabel->setAlignment(Qt::AlignCenter);
+
+ // Configure the empty final row to accomodate any extra vertical space.
+
+ m_mainGrid->setRowStretch(m_mainGrid->numRows() - 1, 1);
+
+
+ m_mainGrid->setColStretch(2, 1);
+
+ m_mainGrid->addMultiCellWidget(m_instrumentLabel, 0, 0, 0, 2, AlignCenter);
+ m_mainGrid->addMultiCellWidget(m_connectionLabel, 1, 1, 0, 2, AlignCenter);
+
+ m_mainGrid->addMultiCellWidget(channelLabel, 2, 2, 0, 1, AlignLeft);
+ m_mainGrid->addWidget(m_channelValue, 2, 2, AlignRight);
+
+ m_mainGrid->addMultiCellWidget(percussionLabel, 3, 3, 0, 1, AlignLeft);
+ m_mainGrid->addWidget(m_percussionCheckBox, 3, 2, AlignRight);
+
+ m_mainGrid->addWidget(m_bankLabel, 4, 0, AlignLeft);
+ m_mainGrid->addWidget(m_bankCheckBox, 4, 1, AlignRight);
+ m_mainGrid->addWidget(m_bankValue, 4, 2, AlignRight);
+
+ m_mainGrid->addWidget(m_programLabel, 5, 0, AlignLeft);
+ m_mainGrid->addWidget(m_programCheckBox, 5, 1, AlignRight);
+ m_mainGrid->addWidget(m_programValue, 5, 2, AlignRight);
+
+ m_mainGrid->addWidget(m_variationLabel, 6, 0);
+ m_mainGrid->addWidget(m_variationCheckBox, 6, 1);
+ m_mainGrid->addWidget(m_variationValue, 6, 2, AlignRight);
+
+ // Populate channel lists
+ //
+ for (int i = 0; i < 16; i++) {
+ m_channelValue->insertItem(QString("%1").arg(i + 1));
+ }
+
+ m_channelValue->setSizeLimit(16);
+
+ // Disable these by default - they are activate by their
+ // checkboxes
+ //
+ m_programValue->setDisabled(true);
+ m_bankValue->setDisabled(true);
+ m_variationValue->setDisabled(true);
+
+ // Only active if we have an Instrument selected
+ //
+ m_percussionCheckBox->setDisabled(true);
+ m_programCheckBox->setDisabled(true);
+ m_bankCheckBox->setDisabled(true);
+ m_variationCheckBox->setDisabled(true);
+
+ // Connect up the toggle boxes
+ //
+ connect(m_percussionCheckBox, SIGNAL(toggled(bool)),
+ this, SLOT(slotTogglePercussion(bool)));
+
+ connect(m_programCheckBox, SIGNAL(toggled(bool)),
+ this, SLOT(slotToggleProgramChange(bool)));
+
+ connect(m_bankCheckBox, SIGNAL(toggled(bool)),
+ this, SLOT(slotToggleBank(bool)));
+
+ connect(m_variationCheckBox, SIGNAL(toggled(bool)),
+ this, SLOT(slotToggleVariation(bool)));
+
+
+ // Connect activations
+ //
+ connect(m_bankValue, SIGNAL(activated(int)),
+ this, SLOT(slotSelectBank(int)));
+
+ connect(m_variationValue, SIGNAL(activated(int)),
+ this, SLOT(slotSelectVariation(int)));
+
+ connect(m_programValue, SIGNAL(activated(int)),
+ this, SLOT(slotSelectProgram(int)));
+
+ connect(m_channelValue, SIGNAL(activated(int)),
+ this, SLOT(slotSelectChannel(int)));
+
+ // don't select any of the options in any dropdown
+ m_programValue->setCurrentItem( -1);
+ m_bankValue->setCurrentItem( -1);
+ m_channelValue->setCurrentItem( -1);
+ m_variationValue->setCurrentItem( -1);
+
+ connect(m_rotaryMapper, SIGNAL(mapped(int)),
+ this, SLOT(slotControllerChanged(int)));
+}
+
+void
+MIDIInstrumentParameterPanel::setupForInstrument(Instrument *instrument)
+{
+ RG_DEBUG << "MIDIInstrumentParameterPanel::setupForInstrument" << endl;
+ MidiDevice *md = dynamic_cast<MidiDevice*>
+ (instrument->getDevice());
+ if (!md) {
+ RG_DEBUG << "WARNING: MIDIInstrumentParameterPanel::setupForInstrument:"
+ << " No MidiDevice for Instrument "
+ << instrument->getId() << endl;
+ return ;
+ }
+
+ m_selectedInstrument = instrument;
+
+ // Set instrument name
+ //
+ m_instrumentLabel->setText(strtoqstr(instrument->getPresentationName()));
+
+ // Set Studio Device name
+ //
+ QString connection(strtoqstr(md->getConnection()));
+ if (connection == "") {
+ m_connectionLabel->setText(i18n("[ %1 ]").arg(i18n("No connection")));
+ } else {
+
+ // remove trailing "(duplex)", "(read only)", "(write only)" etc
+ connection.replace(QRegExp("\\s*\\([^)0-9]+\\)\\s*$"), "");
+
+ QString text = i18n("[ %1 ]").arg(connection);
+ /*QString origText(text);
+
+ QFontMetrics metrics(m_connectionLabel->fontMetrics());
+ int maxwidth = metrics.width
+ ("Program: [X] Acoustic Grand Piano 123");// kind of arbitrary!
+
+ int hlen = text.length() / 2;
+ while (metrics.width(text) > maxwidth && text.length() > 10) {
+ --hlen;
+ text = origText.left(hlen) + "..." + origText.right(hlen);
+ }
+
+ if (text.length() > origText.length() - 7) text = origText;*/
+ m_connectionLabel->setText(text);
+ }
+
+ // Enable all check boxes
+ //
+ m_percussionCheckBox->setDisabled(false);
+ m_programCheckBox->setDisabled(false);
+ m_bankCheckBox->setDisabled(false);
+ m_variationCheckBox->setDisabled(false);
+
+ // Activate all checkboxes
+ //
+ m_percussionCheckBox->setChecked(instrument->isPercussion());
+ m_programCheckBox->setChecked(instrument->sendsProgramChange());
+ m_bankCheckBox->setChecked(instrument->sendsBankSelect());
+ m_variationCheckBox->setChecked(instrument->sendsBankSelect());
+
+ // Basic parameters
+ //
+ m_channelValue->setCurrentItem((int)instrument->getMidiChannel());
+
+ // Check for program change
+ //
+ populateBankList();
+ populateProgramList();
+ populateVariationList();
+
+ // Setup the ControlParameters
+ //
+ setupControllers(md);
+
+ // Set all the positions by controller number
+ //
+ for (RotaryMap::iterator it = m_rotaries.begin() ;
+ it != m_rotaries.end(); ++it) {
+ MidiByte value = 0;
+
+ // Special cases
+ //
+ if (it->first == MIDI_CONTROLLER_PAN)
+ value = int(instrument->getPan());
+ else if (it->first == MIDI_CONTROLLER_VOLUME)
+ value = int(instrument->getVolume());
+ else {
+ try {
+ value = instrument->getControllerValue(
+ MidiByte(it->first));
+ } catch (...) {
+ continue;
+ }
+ }
+
+ setRotaryToValue(it->first, int(value));
+ }
+}
+
+void
+MIDIInstrumentParameterPanel::setupControllers(MidiDevice *md)
+{
+ if (!m_rotaryFrame) {
+ m_rotaryFrame = new QFrame(this);
+ m_mainGrid->addMultiCellWidget(m_rotaryFrame, 8, 8, 0, 2, Qt::AlignHCenter);
+ m_rotaryGrid = new QGridLayout(m_rotaryFrame, 10, 3, 8, 1);
+ m_rotaryGrid->addItem(new QSpacerItem(10, 4), 0, 1);
+ }
+
+ // To cut down on flicker, we avoid destroying and recreating
+ // widgets as far as possible here. If a label already exists,
+ // we just set its text; if a rotary exists, we only replace it
+ // if we actually need a different one.
+
+ Composition &comp = m_doc->getComposition();
+ ControlList list = md->getControlParameters();
+
+ // sort by IPB position
+ //
+ std::sort(list.begin(), list.end(),
+ ControlParameter::ControlPositionCmp());
+
+ int count = 0;
+ RotaryMap::iterator rmi = m_rotaries.begin();
+
+ for (ControlList::iterator it = list.begin();
+ it != list.end(); ++it) {
+ if (it->getIPBPosition() == -1)
+ continue;
+
+ // Get the knob colour - only if the colour is non-default (>0)
+ //
+ QColor knobColour = Qt::black; // special case for Rotary
+ if (it->getColourIndex() > 0) {
+ Colour c =
+ comp.getGeneralColourMap().getColourByIndex
+ (it->getColourIndex());
+ knobColour = QColor(c.getRed(), c.getGreen(), c.getBlue());
+ }
+
+ Rotary *rotary = 0;
+
+ if (rmi != m_rotaries.end()) {
+
+ // Update the controller number that is associated with the
+ // existing rotary widget.
+
+ rmi->first = it->getControllerValue();
+
+ // Update the properties of the existing rotary widget.
+
+ rotary = rmi->second.first;
+ int redraw = 0; // 1 -> position, 2 -> all
+
+ if (rotary->getMinValue() != it->getMin()) {
+ rotary->setMinValue(it->getMin());
+ redraw = 1;
+ }
+ if (rotary->getMaxValue() != it->getMax()) {
+ rotary->setMaxValue(it->getMax());
+ redraw = 1;
+ }
+ if (rotary->getKnobColour() != knobColour) {
+ rotary->setKnobColour(knobColour);
+ redraw = 2;
+ }
+ if (redraw == 1 || rotary->getPosition() != it->getDefault()) {
+ rotary->setPosition(it->getDefault());
+ if (redraw == 1)
+ redraw = 0;
+ }
+ if (redraw == 2) {
+ rotary->repaint();
+ }
+
+ // Update the controller name that is associated with
+ // with the existing rotary widget.
+
+ QLabel *label = rmi->second.second;
+ label->setText(strtoqstr(it->getName()));
+
+ ++rmi;
+
+ } else {
+
+ QHBox *hbox = new QHBox(m_rotaryFrame);
+ hbox->setSpacing(8);
+
+ float smallStep = 1.0;
+
+ float bigStep = 5.0;
+ if (it->getMax() - it->getMin() < 10)
+ bigStep = 1.0;
+ else if (it->getMax() - it->getMin() < 20)
+ bigStep = 2.0;
+
+ rotary = new Rotary
+ (hbox,
+ it->getMin(),
+ it->getMax(),
+ smallStep,
+ bigStep,
+ it->getDefault(),
+ 20,
+ Rotary::NoTicks,
+ false,
+ it->getDefault() == 64); //!!! hacky
+
+ rotary->setKnobColour(knobColour);
+
+ // Add a label
+ QLabel *label = new KSqueezedTextLabel(strtoqstr(it->getName()), hbox);
+
+ RG_DEBUG << "Adding new widget at " << (count / 2) << "," << (count % 2) << endl;
+
+ // Add the compound widget
+ //
+ m_rotaryGrid->addWidget(hbox, count / 2, (count % 2) * 2, AlignLeft);
+ hbox->show();
+
+ // Add to list
+ //
+ m_rotaries.push_back(std::pair<int, RotaryPair>
+ (it->getControllerValue(),
+ RotaryPair(rotary, label)));
+
+ // Connect
+ //
+ connect(rotary, SIGNAL(valueChanged(float)),
+ m_rotaryMapper, SLOT(map()));
+
+ rmi = m_rotaries.end();
+ }
+
+ // Add signal mapping
+ //
+ m_rotaryMapper->setMapping(rotary,
+ int(it->getControllerValue()));
+
+ count++;
+ }
+
+ if (rmi != m_rotaries.end()) {
+ for (RotaryMap::iterator rmj = rmi; rmj != m_rotaries.end(); ++rmj) {
+ delete rmj->second.first;
+ delete rmj->second.second;
+ }
+ m_rotaries = std::vector<std::pair<int, RotaryPair> >
+ (m_rotaries.begin(), rmi);
+ }
+
+ m_rotaryFrame->show();
+}
+
+void
+MIDIInstrumentParameterPanel::setRotaryToValue(int controller, int value)
+{
+ /*
+ RG_DEBUG << "MIDIInstrumentParameterPanel::setRotaryToValue - "
+ << "controller = " << controller
+ << ", value = " << value << std::endl;
+ */
+
+ for (RotaryMap::iterator it = m_rotaries.begin() ; it != m_rotaries.end(); ++it) {
+ if (it->first == controller) {
+ it->second.first->setPosition(float(value));
+ return ;
+ }
+ }
+}
+
+void
+MIDIInstrumentParameterPanel::slotSelectChannel(int index)
+{
+ if (m_selectedInstrument == 0)
+ return ;
+
+ m_selectedInstrument->setMidiChannel(index);
+
+ // don't use the emit - use this method instead
+ StudioControl::sendMappedInstrument(
+ MappedInstrument(m_selectedInstrument));
+ emit updateAllBoxes();
+}
+
+void
+MIDIInstrumentParameterPanel::populateBankList()
+{
+ if (m_selectedInstrument == 0)
+ return ;
+
+ m_bankValue->clear();
+ m_banks.clear();
+
+ MidiDevice *md = dynamic_cast<MidiDevice*>
+ (m_selectedInstrument->getDevice());
+ if (!md) {
+ RG_DEBUG << "WARNING: MIDIInstrumentParameterPanel::populateBankList:"
+ << " No MidiDevice for Instrument "
+ << m_selectedInstrument->getId() << endl;
+ return ;
+ }
+
+ int currentBank = -1;
+ BankList banks;
+
+ /*
+ RG_DEBUG << "MIDIInstrumentParameterPanel::populateBankList: "
+ << "variation type is " << md->getVariationType() << endl;
+ */
+
+ if (md->getVariationType() == MidiDevice::NoVariations) {
+
+ banks = md->getBanks(m_selectedInstrument->isPercussion());
+
+ if (!banks.empty()) {
+ if (m_bankLabel->isHidden()) {
+ m_bankLabel->show();
+ m_bankCheckBox->show();
+ m_bankValue->show();
+ }
+ } else {
+ m_bankLabel->hide();
+ m_bankCheckBox->hide();
+ m_bankValue->hide();
+ }
+
+ for (unsigned int i = 0; i < banks.size(); ++i) {
+ if (m_selectedInstrument->getProgram().getBank() == banks[i]) {
+ currentBank = i;
+ }
+ }
+
+ } else {
+
+ MidiByteList bytes;
+ bool useMSB = (md->getVariationType() == MidiDevice::VariationFromLSB);
+
+ if (useMSB) {
+ bytes = md->getDistinctMSBs(m_selectedInstrument->isPercussion());
+ } else {
+ bytes = md->getDistinctLSBs(m_selectedInstrument->isPercussion());
+ }
+
+ if (bytes.size() < 2) {
+ if (!m_bankLabel->isHidden()) {
+ m_bankLabel->hide();
+ m_bankCheckBox->hide();
+ m_bankValue->hide();
+ }
+ } else {
+ if (m_bankLabel->isHidden()) {
+ m_bankLabel->show();
+ m_bankCheckBox->show();
+ m_bankValue->show();
+ }
+ }
+
+ if (useMSB) {
+ for (unsigned int i = 0; i < bytes.size(); ++i) {
+ BankList bl = md->getBanksByMSB
+ (m_selectedInstrument->isPercussion(), bytes[i]);
+ RG_DEBUG << "MIDIInstrumentParameterPanel::populateBankList: have " << bl.size() << " variations for msb " << bytes[i] << endl;
+
+ if (bl.size() == 0)
+ continue;
+ if (m_selectedInstrument->getMSB() == bytes[i]) {
+ currentBank = banks.size();
+ }
+ banks.push_back(bl[0]);
+ }
+ } else {
+ for (unsigned int i = 0; i < bytes.size(); ++i) {
+ BankList bl = md->getBanksByLSB
+ (m_selectedInstrument->isPercussion(), bytes[i]);
+ RG_DEBUG << "MIDIInstrumentParameterPanel::populateBankList: have " << bl.size() << " variations for lsb " << bytes[i] << endl;
+ if (bl.size() == 0)
+ continue;
+ if (m_selectedInstrument->getLSB() == bytes[i]) {
+ currentBank = banks.size();
+ }
+ banks.push_back(bl[0]);
+ }
+ }
+ }
+
+ for (BankList::const_iterator i = banks.begin();
+ i != banks.end(); ++i) {
+ m_banks.push_back(*i);
+ m_bankValue->insertItem(strtoqstr(i->getName()));
+ }
+
+ m_bankValue->setEnabled(m_selectedInstrument->sendsBankSelect());
+
+ if (currentBank < 0 && !banks.empty()) {
+ m_bankValue->setCurrentItem(0);
+ slotSelectBank(0);
+ } else {
+ m_bankValue->setCurrentItem(currentBank);
+ }
+}
+
+void
+MIDIInstrumentParameterPanel::populateProgramList()
+{
+ if (m_selectedInstrument == 0)
+ return ;
+
+ m_programValue->clear();
+ m_programs.clear();
+
+ MidiDevice *md = dynamic_cast<MidiDevice*>
+ (m_selectedInstrument->getDevice());
+ if (!md) {
+ RG_DEBUG << "WARNING: MIDIInstrumentParameterPanel::populateProgramList: No MidiDevice for Instrument "
+ << m_selectedInstrument->getId() << endl;
+ return ;
+ }
+
+ /*
+ RG_DEBUG << "MIDIInstrumentParameterPanel::populateProgramList:"
+ << " variation type is " << md->getVariationType() << endl;
+ */
+
+ MidiBank bank( m_selectedInstrument->isPercussion(),
+ m_selectedInstrument->getMSB(),
+ m_selectedInstrument->getLSB());
+
+ if (m_selectedInstrument->sendsBankSelect()) {
+ bank = m_selectedInstrument->getProgram().getBank();
+ }
+
+ int currentProgram = -1;
+
+ ProgramList programs = md->getPrograms(bank);
+
+ if (!programs.empty()) {
+ if (m_programLabel->isHidden()) {
+ m_programLabel->show();
+ m_programCheckBox->show();
+ m_programValue->show();
+ }
+ } else {
+ m_programLabel->hide();
+ m_programCheckBox->hide();
+ m_programValue->hide();
+ }
+
+ for (unsigned int i = 0; i < programs.size(); ++i) {
+ std::string programName = programs[i].getName();
+ if (programName != "") {
+ m_programValue->insertItem(QString("%1. %2")
+ .arg(programs[i].getProgram() + 1)
+ .arg(strtoqstr(programName)));
+ if (m_selectedInstrument->getProgram() == programs[i]) {
+ currentProgram = m_programs.size();
+ }
+ m_programs.push_back(programs[i]);
+ }
+ }
+
+ m_programValue->setEnabled(m_selectedInstrument->sendsProgramChange());
+
+ if (currentProgram < 0 && !m_programs.empty()) {
+ m_programValue->setCurrentItem(0);
+ slotSelectProgram(0);
+ } else {
+ m_programValue->setCurrentItem(currentProgram);
+
+ // Ensure that stored program change value is same as the one
+ // we're now showing (BUG 937371)
+ //
+ if (!m_programs.empty()) {
+ m_selectedInstrument->setProgramChange
+ ((m_programs[m_programValue->currentItem()]).getProgram());
+ }
+ }
+}
+
+void
+MIDIInstrumentParameterPanel::populateVariationList()
+{
+ if (m_selectedInstrument == 0)
+ return ;
+
+ m_variationValue->clear();
+ m_variations.clear();
+
+ MidiDevice *md = dynamic_cast<MidiDevice*>
+ (m_selectedInstrument->getDevice());
+ if (!md) {
+ RG_DEBUG << "WARNING: MIDIInstrumentParameterPanel::populateVariationList: No MidiDevice for Instrument "
+ << m_selectedInstrument->getId() << endl;
+ return ;
+ }
+
+ /*
+ RG_DEBUG << "MIDIInstrumentParameterPanel::populateVariationList:"
+ << " variation type is " << md->getVariationType() << endl;
+ */
+
+ if (md->getVariationType() == MidiDevice::NoVariations) {
+ if (!m_variationLabel->isHidden()) {
+ m_variationLabel->hide();
+ m_variationCheckBox->hide();
+ m_variationValue->hide();
+ }
+ return ;
+ }
+
+ bool useMSB = (md->getVariationType() == MidiDevice::VariationFromMSB);
+ MidiByteList variations;
+
+ if (useMSB) {
+ MidiByte lsb = m_selectedInstrument->getLSB();
+ variations = md->getDistinctMSBs(m_selectedInstrument->isPercussion(),
+ lsb);
+ RG_DEBUG << "MIDIInstrumentParameterPanel::populateVariationList: have " << variations.size() << " variations for lsb " << lsb << endl;
+
+ } else {
+ MidiByte msb = m_selectedInstrument->getMSB();
+ variations = md->getDistinctLSBs(m_selectedInstrument->isPercussion(),
+ msb);
+ RG_DEBUG << "MIDIInstrumentParameterPanel::populateVariationList: have " << variations.size() << " variations for msb " << msb << endl;
+ }
+
+ m_variationValue->setCurrentItem( -1);
+
+ MidiProgram defaultProgram;
+
+ if (useMSB) {
+ defaultProgram = MidiProgram
+ (MidiBank(m_selectedInstrument->isPercussion(),
+ 0,
+ m_selectedInstrument->getLSB()),
+ m_selectedInstrument->getProgramChange());
+ } else {
+ defaultProgram = MidiProgram
+ (MidiBank(m_selectedInstrument->isPercussion(),
+ m_selectedInstrument->getMSB(),
+ 0),
+ m_selectedInstrument->getProgramChange());
+ }
+ std::string defaultProgramName = md->getProgramName(defaultProgram);
+
+ int currentVariation = -1;
+
+ for (unsigned int i = 0; i < variations.size(); ++i) {
+
+ MidiProgram program;
+
+ if (useMSB) {
+ program = MidiProgram
+ (MidiBank(m_selectedInstrument->isPercussion(),
+ variations[i],
+ m_selectedInstrument->getLSB()),
+ m_selectedInstrument->getProgramChange());
+ } else {
+ program = MidiProgram
+ (MidiBank(m_selectedInstrument->isPercussion(),
+ m_selectedInstrument->getMSB(),
+ variations[i]),
+ m_selectedInstrument->getProgramChange());
+ }
+
+ std::string programName = md->getProgramName(program);
+
+ if (programName != "") { // yes, that is how you know whether it exists
+ /*
+ m_variationValue->insertItem(programName == defaultProgramName ?
+ i18n("(default)") :
+ strtoqstr(programName));
+ */
+ m_variationValue->insertItem(QString("%1. %2")
+ .arg(variations[i] + 1)
+ .arg(strtoqstr(programName)));
+ if (m_selectedInstrument->getProgram() == program) {
+ currentVariation = m_variations.size();
+ }
+ m_variations.push_back(variations[i]);
+ }
+ }
+
+ if (currentVariation < 0 && !m_variations.empty()) {
+ m_variationValue->setCurrentItem(0);
+ slotSelectVariation(0);
+ } else {
+ m_variationValue->setCurrentItem(currentVariation);
+ }
+
+ if (m_variations.size() < 2) {
+ if (!m_variationLabel->isHidden()) {
+ m_variationLabel->hide();
+ m_variationCheckBox->hide();
+ m_variationValue->hide();
+ }
+
+ } else {
+ //!!! seem to have problems here -- the grid layout doesn't
+ //like us adding stuff in the middle so if we go from 1
+ //visible row (say program) to 2 (program + variation) the
+ //second one overlaps the control knobs
+
+ if (m_variationLabel->isHidden()) {
+ m_variationLabel->show();
+ m_variationCheckBox->show();
+ m_variationValue->show();
+ }
+
+ if (m_programValue->width() > m_variationValue->width()) {
+ m_variationValue->setMinimumWidth(m_programValue->width());
+ } else {
+ m_programValue->setMinimumWidth(m_variationValue->width());
+ }
+ }
+
+ m_variationValue->setEnabled(m_selectedInstrument->sendsBankSelect());
+}
+
+void
+MIDIInstrumentParameterPanel::slotTogglePercussion(bool value)
+{
+ if (m_selectedInstrument == 0) {
+ m_percussionCheckBox->setChecked(false);
+ emit updateAllBoxes();
+ return ;
+ }
+
+ m_selectedInstrument->setPercussion(value);
+
+ populateBankList();
+ populateProgramList();
+ populateVariationList();
+
+ sendBankAndProgram();
+
+ emit changeInstrumentLabel(m_selectedInstrument->getId(),
+ strtoqstr(m_selectedInstrument->
+ getProgramName()));
+ emit updateAllBoxes();
+
+ emit instrumentParametersChanged(m_selectedInstrument->getId());
+}
+
+void
+MIDIInstrumentParameterPanel::slotToggleBank(bool value)
+{
+ if (m_selectedInstrument == 0) {
+ m_bankCheckBox->setChecked(false);
+ emit updateAllBoxes();
+ return ;
+ }
+
+ m_variationCheckBox->setChecked(value);
+ m_selectedInstrument->setSendBankSelect(value);
+
+ m_bankValue->setDisabled(!value);
+ populateBankList();
+ populateProgramList();
+ populateVariationList();
+
+ sendBankAndProgram();
+
+ emit changeInstrumentLabel(m_selectedInstrument->getId(),
+ strtoqstr(m_selectedInstrument->
+ getProgramName()));
+ emit updateAllBoxes();
+
+ emit instrumentParametersChanged(m_selectedInstrument->getId());
+}
+
+void
+MIDIInstrumentParameterPanel::slotToggleProgramChange(bool value)
+{
+ if (m_selectedInstrument == 0) {
+ m_programCheckBox->setChecked(false);
+ emit updateAllBoxes();
+ return ;
+ }
+
+ m_selectedInstrument->setSendProgramChange(value);
+
+ m_programValue->setDisabled(!value);
+ populateProgramList();
+ populateVariationList();
+
+ if (value)
+ sendBankAndProgram();
+
+ emit changeInstrumentLabel(m_selectedInstrument->getId(),
+ strtoqstr(m_selectedInstrument->
+ getProgramName()));
+ emit updateAllBoxes();
+
+ emit instrumentParametersChanged(m_selectedInstrument->getId());
+}
+
+void
+MIDIInstrumentParameterPanel::slotToggleVariation(bool value)
+{
+ if (m_selectedInstrument == 0) {
+ m_variationCheckBox->setChecked(false);
+ emit updateAllBoxes();
+ return ;
+ }
+
+ m_bankCheckBox->setChecked(value);
+ m_selectedInstrument->setSendBankSelect(value);
+
+ m_variationValue->setDisabled(!value);
+ populateVariationList();
+
+ sendBankAndProgram();
+
+ emit changeInstrumentLabel(m_selectedInstrument->getId(),
+ strtoqstr(m_selectedInstrument->
+ getProgramName()));
+ emit updateAllBoxes();
+
+ emit instrumentParametersChanged(m_selectedInstrument->getId());
+}
+
+void
+MIDIInstrumentParameterPanel::slotSelectBank(int index)
+{
+ if (m_selectedInstrument == 0)
+ return ;
+
+ MidiDevice *md = dynamic_cast<MidiDevice*>
+ (m_selectedInstrument->getDevice());
+ if (!md) {
+ RG_DEBUG << "WARNING: MIDIInstrumentParameterPanel::slotSelectBank: No MidiDevice for Instrument "
+ << m_selectedInstrument->getId() << endl;
+ return ;
+ }
+
+ const MidiBank *bank = &m_banks[index];
+
+ bool change = false;
+
+ if (md->getVariationType() != MidiDevice::VariationFromLSB) {
+ if (m_selectedInstrument->getLSB() != bank->getLSB()) {
+ m_selectedInstrument->setLSB(bank->getLSB());
+ change = true;
+ }
+ }
+ if (md->getVariationType() != MidiDevice::VariationFromMSB) {
+ if (m_selectedInstrument->getMSB() != bank->getMSB()) {
+ m_selectedInstrument->setMSB(bank->getMSB());
+ change = true;
+ }
+ }
+
+ populateProgramList();
+
+ if (change) {
+ sendBankAndProgram();
+ emit updateAllBoxes();
+ }
+
+ emit instrumentParametersChanged(m_selectedInstrument->getId());
+}
+
+void
+MIDIInstrumentParameterPanel::slotSelectProgram(int index)
+{
+ const MidiProgram *prg = &m_programs[index];
+ if (prg == 0) {
+ RG_DEBUG << "program change not found in bank" << endl;
+ return ;
+ }
+
+ bool change = false;
+ if (m_selectedInstrument->getProgramChange() != prg->getProgram()) {
+ m_selectedInstrument->setProgramChange(prg->getProgram());
+ change = true;
+ }
+
+ populateVariationList();
+
+ if (change) {
+ sendBankAndProgram();
+ emit changeInstrumentLabel(m_selectedInstrument->getId(),
+ strtoqstr(m_selectedInstrument->
+ getProgramName()));
+ emit updateAllBoxes();
+ }
+
+ emit instrumentParametersChanged(m_selectedInstrument->getId());
+}
+
+void
+MIDIInstrumentParameterPanel::slotSelectVariation(int index)
+{
+ MidiDevice *md = dynamic_cast<MidiDevice*>
+ (m_selectedInstrument->getDevice());
+ if (!md) {
+ RG_DEBUG << "WARNING: MIDIInstrumentParameterPanel::slotSelectVariation: No MidiDevice for Instrument "
+ << m_selectedInstrument->getId() << endl;
+ return ;
+ }
+
+ if (index < 0 || index > int(m_variations.size())) {
+ RG_DEBUG << "WARNING: MIDIInstrumentParameterPanel::slotSelectVariation: index " << index << " out of range" << endl;
+ return ;
+ }
+
+ MidiByte v = m_variations[index];
+
+ bool change = false;
+
+ if (md->getVariationType() == MidiDevice::VariationFromLSB) {
+ if (m_selectedInstrument->getLSB() != v) {
+ m_selectedInstrument->setLSB(v);
+ change = true;
+ }
+ } else if (md->getVariationType() == MidiDevice::VariationFromMSB) {
+ if (m_selectedInstrument->getMSB() != v) {
+ m_selectedInstrument->setMSB(v);
+ change = true;
+ }
+ }
+
+ if (change) {
+ sendBankAndProgram();
+ }
+
+ emit instrumentParametersChanged(m_selectedInstrument->getId());
+}
+
+void
+MIDIInstrumentParameterPanel::sendBankAndProgram()
+{
+ if (m_selectedInstrument == 0)
+ return ;
+
+ MidiDevice *md = dynamic_cast<MidiDevice*>
+ (m_selectedInstrument->getDevice());
+ if (!md) {
+ RG_DEBUG << "WARNING: MIDIInstrumentParameterPanel::sendBankAndProgram: No MidiDevice for Instrument "
+ << m_selectedInstrument->getId() << endl;
+ return ;
+ }
+
+ if (m_selectedInstrument->sendsBankSelect()) {
+
+ // Send the bank select message before any PC message
+ //
+ MappedEvent mEMSB(m_selectedInstrument->getId(),
+ MappedEvent::MidiController,
+ MIDI_CONTROLLER_BANK_MSB,
+ m_selectedInstrument->getMSB());
+
+ RG_DEBUG << "MIDIInstrumentParameterPanel::sendBankAndProgram - "
+ << "sending MSB = "
+ << int(m_selectedInstrument->getMSB())
+ << endl;
+
+ StudioControl::sendMappedEvent(mEMSB);
+
+ MappedEvent mELSB(m_selectedInstrument->getId(),
+ MappedEvent::MidiController,
+ MIDI_CONTROLLER_BANK_LSB,
+ m_selectedInstrument->getLSB());
+
+ RG_DEBUG << "MIDIInstrumentParameterPanel::sendBankAndProgram - "
+ << "sending LSB = "
+ << int(m_selectedInstrument->getLSB())
+ << endl;
+
+ StudioControl::sendMappedEvent(mELSB);
+ }
+
+ MappedEvent mE(m_selectedInstrument->getId(),
+ MappedEvent::MidiProgramChange,
+ m_selectedInstrument->getProgramChange(),
+ (MidiByte)0);
+
+ RG_DEBUG << "MIDIInstrumentParameterPanel::sendBankAndProgram - "
+ << "sending program change = "
+ << int(m_selectedInstrument->getProgramChange())
+ << endl;
+
+
+ // Send the controller change
+ //
+ StudioControl::sendMappedEvent(mE);
+}
+
+void
+MIDIInstrumentParameterPanel::slotControllerChanged(int controllerNumber)
+{
+
+ RG_DEBUG << "MIDIInstrumentParameterPanel::slotControllerChanged - "
+ << "controller = " << controllerNumber << "\n";
+
+
+ if (m_selectedInstrument == 0)
+ return ;
+
+ MidiDevice *md = dynamic_cast<MidiDevice*>
+ (m_selectedInstrument->getDevice());
+ if (!md)
+ return ;
+
+ /*
+ ControlParameter *controller =
+ md->getControlParameter(MidiByte(controllerNumber));
+ */
+
+ int value = getValueFromRotary(controllerNumber);
+
+ if (value == -1) {
+ RG_DEBUG << "MIDIInstrumentParameterPanel::slotControllerChanged - "
+ << "couldn't get value of rotary for controller "
+ << controllerNumber << endl;
+ return ;
+ }
+
+
+ // two special cases
+ if (controllerNumber == int(MIDI_CONTROLLER_PAN)) {
+ float adjValue = value;
+ if (m_selectedInstrument->getType() == Instrument::Audio ||
+ m_selectedInstrument->getType() == Instrument::SoftSynth)
+ value += 100;
+
+ m_selectedInstrument->setPan(MidiByte(adjValue));
+ } else if (controllerNumber == int(MIDI_CONTROLLER_VOLUME)) {
+ m_selectedInstrument->setVolume(MidiByte(value));
+ } else // just set the controller (this will create it on the instrument if
+ // it doesn't exist)
+ {
+ m_selectedInstrument->setControllerValue(MidiByte(controllerNumber),
+ MidiByte(value));
+
+ RG_DEBUG << "SET CONTROLLER VALUE (" << controllerNumber << ") = " << value << endl;
+ }
+ /*
+ else
+ {
+ RG_DEBUG << "MIDIInstrumentParameterPanel::slotControllerChanged - "
+ << "no controller retrieved\n";
+ return;
+ }
+ */
+
+ MappedEvent mE(m_selectedInstrument->getId(),
+ MappedEvent::MidiController,
+ (MidiByte)controllerNumber,
+ (MidiByte)value);
+ StudioControl::sendMappedEvent(mE);
+
+ emit updateAllBoxes();
+ emit instrumentParametersChanged(m_selectedInstrument->getId());
+
+}
+
+int
+MIDIInstrumentParameterPanel::getValueFromRotary(int rotary)
+{
+ for (RotaryMap::iterator it = m_rotaries.begin(); it != m_rotaries.end(); ++it) {
+ if (it->first == rotary)
+ return int(it->second.first->getPosition());
+ }
+
+ return -1;
+}
+
+void
+MIDIInstrumentParameterPanel::showAdditionalControls(bool showThem)
+{
+ m_instrumentLabel->setShown(showThem);
+ int index = 0;
+ for (RotaryMap::iterator it = m_rotaries.begin(); it != m_rotaries.end(); ++it) {
+ it->second.first->parentWidget()->setShown(showThem || (index < 8));
+ //it->second.first->setShown(showThem || (index < 8));
+ //it->second.second->setShown(showThem || (index < 8));
+ index++;
+ }
+}
+
+}
+#include "MIDIInstrumentParameterPanel.moc"
diff --git a/src/gui/editors/parameters/MIDIInstrumentParameterPanel.h b/src/gui/editors/parameters/MIDIInstrumentParameterPanel.h
new file mode 100644
index 0000000..7f1a1c5
--- /dev/null
+++ b/src/gui/editors/parameters/MIDIInstrumentParameterPanel.h
@@ -0,0 +1,137 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_MIDIINSTRUMENTPARAMETERPANEL_H_
+#define _RG_MIDIINSTRUMENTPARAMETERPANEL_H_
+
+#include "base/MidiProgram.h"
+#include "base/MidiDevice.h"
+#include "InstrumentParameterPanel.h"
+#include <qstring.h>
+
+
+class QWidget;
+class QSignalMapper;
+class QLabel;
+class QGridLayout;
+class QFrame;
+class QCheckBox;
+class KComboBox;
+
+
+namespace Rosegarden
+{
+
+class RosegardenGUIDoc;
+class MidiDevice;
+class Instrument;
+
+
+class MIDIInstrumentParameterPanel : public InstrumentParameterPanel
+{
+ Q_OBJECT
+public:
+
+ MIDIInstrumentParameterPanel(RosegardenGUIDoc *doc, QWidget* parent);
+
+ void setupControllers(MidiDevice *); // setup ControlParameters on box
+
+ virtual void setupForInstrument(Instrument*);
+
+ void showAdditionalControls(bool showThem);
+
+signals:
+ void changeInstrumentLabel(InstrumentId id, QString label);
+ void instrumentParametersChanged(InstrumentId);
+
+public slots:
+ void slotSelectProgram(int index);
+ void slotSelectBank(int index);
+ void slotSelectVariation(int index);
+ void slotSelectChannel(int index);
+ //void slotSelectInputChannel(int index);
+
+ void slotControllerChanged(int index);
+
+ void slotTogglePercussion(bool value);
+ void slotToggleProgramChange(bool value);
+ void slotToggleBank(bool value);
+ void slotToggleVariation(bool value);
+
+protected:
+
+ // fill (or hide) bank combo based on whether the instrument is percussion
+ void populateBankList();
+
+ // fill program combo based on current bank
+ void populateProgramList();
+
+ // fill (or hide) variation combo based on current bank and program
+ void populateVariationList();
+
+ // send the bank and program events relevant to this instrument
+ void sendBankAndProgram();
+
+ // get value of a specific rotary (keyed by controller value)
+ int getValueFromRotary(int rotary);
+
+ // set rotary to value
+ void setRotaryToValue(int controller, int value);
+
+ //--------------- Data members ---------------------------------
+
+ QLabel *m_connectionLabel;
+
+ KComboBox *m_bankValue;
+ KComboBox *m_variationValue;
+ KComboBox *m_channelValue;
+ KComboBox *m_programValue;
+ //KComboBox *m_channelInValue;
+
+ QCheckBox *m_percussionCheckBox;
+ QCheckBox *m_bankCheckBox;
+ QCheckBox *m_variationCheckBox;
+ QCheckBox *m_programCheckBox;
+
+ QLabel *m_bankLabel;
+ QLabel *m_variationLabel;
+ QLabel *m_programLabel;
+
+ QGridLayout *m_mainGrid;
+ QFrame *m_rotaryFrame;
+ QGridLayout *m_rotaryGrid;
+ RotaryMap m_rotaries;
+ QSignalMapper *m_rotaryMapper;
+
+ BankList m_banks;
+ ProgramList m_programs;
+ MidiByteList m_variations;
+};
+
+
+
+}
+
+#endif
diff --git a/src/gui/editors/parameters/RosegardenParameterArea.cpp b/src/gui/editors/parameters/RosegardenParameterArea.cpp
new file mode 100644
index 0000000..968c737
--- /dev/null
+++ b/src/gui/editors/parameters/RosegardenParameterArea.cpp
@@ -0,0 +1,227 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ This file Copyright 2006 Martin Shepherd <[email protected]>.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "RosegardenParameterArea.h"
+
+#include "RosegardenParameterBox.h"
+#include <ktabwidget.h>
+#include <qfont.h>
+#include <qframe.h>
+#include <qpoint.h>
+#include <qscrollview.h>
+#include <qstring.h>
+#include <qvbox.h>
+#include <qlayout.h>
+#include <qvgroupbox.h>
+#include <qwidget.h>
+#include <qwidgetstack.h>
+#include <iostream>
+#include <set>
+
+
+namespace Rosegarden
+{
+
+RosegardenParameterArea::RosegardenParameterArea(QWidget *parent,
+ const char *name, WFlags f)
+ : QWidgetStack(parent, name, f),
+ m_style(RosegardenParameterArea::CLASSIC_STYLE),
+ m_scrollView(new QScrollView(this, 0, Qt::WStaticContents)),
+ m_classic(new QVBox(m_scrollView->viewport())),
+ m_tabBox(new KTabWidget(this)),
+ m_active(0),
+ m_spacing(0)
+{
+ m_scrollView->addChild(m_classic);
+ m_scrollView->setHScrollBarMode(QScrollView::AlwaysOff);
+ m_scrollView->setVScrollBarMode(QScrollView::Auto);
+ m_scrollView->setResizePolicy(QScrollView::AutoOneFit);
+
+ // Install the classic-style VBox widget in the widget-stack.
+
+ addWidget(m_scrollView, CLASSIC_STYLE);
+
+ // Install the widget that implements the tab-style to the widget-stack.
+
+ addWidget(m_tabBox, TAB_BOX_STYLE);
+
+}
+
+void RosegardenParameterArea::addRosegardenParameterBox(
+ RosegardenParameterBox *b)
+{
+ // Check that the box hasn't been added before.
+
+ for (unsigned int i = 0; i < m_parameterBoxes.size(); i++) {
+ if (m_parameterBoxes[i] == b)
+ return ;
+ }
+
+ // Append the parameter box to the list to be displayed.
+
+ m_parameterBoxes.push_back(b);
+
+ m_scrollView->setMinimumWidth(std::max(m_scrollView->minimumWidth(),
+ b->sizeHint().width()) + 8);
+
+ // Create a titled group box for the parameter box, parented by the
+ // classic layout widget, so that it can be used to provide a title
+ // and outline, in classic mode. Add this container to an array that
+ // parallels the above array of parameter boxes.
+
+ QVGroupBox *box = new QVGroupBox(b->getLongLabel(), m_classic);
+ box->layout()->setMargin( 4 ); // about half the default value
+ QFont f;
+ f.setBold( true );
+ box->setFont( f );
+ m_groupBoxes.push_back(box);
+
+ if (m_spacing)
+ delete m_spacing;
+ m_spacing = new QFrame(m_classic);
+ m_classic->setStretchFactor(m_spacing, 100);
+
+ // Add the parameter box to the current container of the displayed
+ // widgets, unless the current container has been set up yet.
+
+ if (m_active)
+ moveWidget(0, m_active, b);
+
+ // Queue a redisplay of the parameter area, to incorporate the new box.
+
+ update();
+}
+
+void RosegardenParameterArea::setArrangement(Arrangement style)
+{
+ // Lookup the container of the specified style.
+
+ QWidget *container;
+ switch (style) {
+ case CLASSIC_STYLE:
+ container = m_classic;
+ break;
+ case TAB_BOX_STYLE:
+ container = m_tabBox;
+ break;
+ default:
+ std::cerr << "setArrangement() was passed an unknown arrangement style."
+ << std::endl;
+ return ;
+ }
+
+ // Does the current container of the parameter-box widgets differ
+ // from the one that is associated with the currently configured
+ // style?
+
+ if (container != m_active) {
+
+ // Move the parameter boxes from the old container to the new one.
+
+ std::vector<RosegardenParameterBox *> sorted;
+ std::set<RosegardenParameterBox *> unsorted;
+
+ for (unsigned int i = 0; i < m_parameterBoxes.size(); i++) {
+ unsorted.insert(m_parameterBoxes[i]);
+ }
+
+ QString previous = "";
+
+ while (!unsorted.empty()) {
+ std::set<RosegardenParameterBox *>::iterator i = unsorted.begin();
+ bool have = false;
+ while (i != unsorted.end()) {
+ if ((*i)->getPreviousBox(style) == previous) {
+ sorted.push_back(*i);
+ previous = (*i)->getShortLabel();
+ unsorted.erase(i);
+ have = true;
+ break;
+ }
+ ++i;
+ }
+ if (!have) {
+ while (!unsorted.empty()) {
+ sorted.push_back(*unsorted.begin());
+ unsorted.erase(unsorted.begin());
+ }
+ break;
+ }
+ }
+
+ for (std::vector<RosegardenParameterBox *>::iterator i = sorted.begin();
+ i != sorted.end(); ++i) {
+ moveWidget(m_active, container, *i);
+ (*i)->showAdditionalControls(style == TAB_BOX_STYLE);
+ }
+
+ // Switch the widget stack to displaying the new container.
+
+ raiseWidget(style);
+ }
+
+ // Record the identity of the active container, and the associated
+ // arrangement style.
+
+ m_active = container;
+ m_style = style;
+}
+
+void RosegardenParameterArea::moveWidget(QWidget *old_container,
+ QWidget *new_container,
+ RosegardenParameterBox *box)
+{
+ // Remove any state that is associated with the parameter boxes,
+ // from the active container.
+
+ if (old_container == m_classic) {
+ ;
+ } else if (old_container == m_tabBox) {
+ m_tabBox->removePage(box);
+ }
+
+ // Reparent the parameter box, and perform any container-specific
+ // configuration.
+
+ if (new_container == m_classic) {
+ int index = 0;
+ while (index < m_parameterBoxes.size()) {
+ if (box == m_parameterBoxes[index])
+ break;
+ ++index;
+ }
+ if (index < m_parameterBoxes.size()) {
+ box->reparent(m_groupBoxes[index], 0, QPoint(0, 0), FALSE);
+ }
+ } else if (new_container == m_tabBox) {
+ box->reparent(new_container, 0, QPoint(0, 0), FALSE);
+ m_tabBox->insertTab(box, box->getShortLabel());
+ }
+}
+
+}
+#include "RosegardenParameterArea.moc"
diff --git a/src/gui/editors/parameters/RosegardenParameterArea.h b/src/gui/editors/parameters/RosegardenParameterArea.h
new file mode 100644
index 0000000..1236a43
--- /dev/null
+++ b/src/gui/editors/parameters/RosegardenParameterArea.h
@@ -0,0 +1,108 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ This file Copyright 2006 Martin Shepherd <[email protected]>.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_ROSEGARDENPARAMETERAREA_H_
+#define _RG_ROSEGARDENPARAMETERAREA_H_
+
+#include <qwidgetstack.h>
+#include <vector>
+
+
+class QWidget;
+class QVGroupBox;
+class QVBox;
+class QScrollView;
+class KTabWidget;
+
+
+namespace Rosegarden
+{
+
+class RosegardenParameterBox;
+
+
+/**
+ * A widget that arranges a set of Rosegarden parameter-box widgets
+ * within a frame, in a dynamically configurable manner.
+ */
+class RosegardenParameterArea : public QWidgetStack
+{
+ Q_OBJECT
+public:
+
+ // Create the parameter display area.
+
+ RosegardenParameterArea(QWidget *parent=0, const char *name=0, WFlags f=0);
+
+ // Add a rosegarden parameter box to the list that are to be displayed.
+
+ void addRosegardenParameterBox(RosegardenParameterBox *b);
+
+
+ // List the supported methods of arranging the various parameter-box
+ // widgets within the parameter area.
+
+ enum Arrangement {
+ CLASSIC_STYLE, // A simple vertical tiling of parameter-box widgets.
+ TAB_BOX_STYLE // A horizontal list of tabs, displaying one box at a time.
+ };
+
+ // Redisplay the widgets with a different layout style.
+
+ void setArrangement(Arrangement style);
+
+protected:
+private:
+ Arrangement m_style; // The current layout style.
+
+ // The list of parameter box widgets that are being displayed by this
+ // widget.
+
+ std::vector<RosegardenParameterBox *> m_parameterBoxes;
+
+ // Create a parallel array of group boxes, to be used when the
+ // corresponding parameter box widget needs to be enclosed by a
+ // titled outline.
+
+ std::vector<QVGroupBox *> m_groupBoxes;
+
+ // Move a RosegardenParameterBox widget from one container to another.
+
+ void moveWidget(QWidget *old_container, QWidget *new_container,
+ RosegardenParameterBox *box);
+
+ QScrollView *m_scrollView; // Holds the m_classic container
+ QVBox *m_classic; // The container widget for m_style==CLASSIC_STYLE.
+ KTabWidget *m_tabBox; // The container widget for m_style==TAB_BOX_STYLE.
+ QWidget *m_active; // The current container widget.
+ QWidget *m_spacing;
+};
+
+
+}
+
+#endif
diff --git a/src/gui/editors/parameters/RosegardenParameterBox.cpp b/src/gui/editors/parameters/RosegardenParameterBox.cpp
new file mode 100644
index 0000000..7d9100c
--- /dev/null
+++ b/src/gui/editors/parameters/RosegardenParameterBox.cpp
@@ -0,0 +1,89 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "RosegardenParameterBox.h"
+
+#include "RosegardenParameterArea.h"
+#include <ktabwidget.h>
+#include <qfont.h>
+#include <qframe.h>
+#include <qscrollview.h>
+#include <qstring.h>
+#include <qvbox.h>
+#include <qwidget.h>
+#include <qwidgetstack.h>
+
+
+namespace Rosegarden
+{
+
+RosegardenParameterBox::RosegardenParameterBox(const QString &shortLabel,
+ const QString &longLabel,
+ QWidget *parent,
+ const char *name) :
+ QFrame(parent, name),
+ m_shortLabel(shortLabel),
+ m_longLabel(longLabel),
+ m_mode(LANDSCAPE_MODE)
+{
+ init();
+}
+
+void RosegardenParameterBox::init()
+{
+ QFont plainFont;
+ plainFont.setPointSize(plainFont.pointSize() * 95 / 100);
+ if (plainFont.pixelSize() > 14)
+ plainFont.setPixelSize(14);
+ plainFont.setBold(false);
+ m_font = plainFont;
+
+ QFont boldFont;
+ boldFont.setPointSize(int(boldFont.pointSize() * 9.5 / 10.0 + 0.5));
+ if (boldFont.pixelSize() > 14)
+ boldFont.setPixelSize(14);
+ boldFont.setBold(true);
+
+ setFont(boldFont);
+}
+
+QString RosegardenParameterBox::getShortLabel() const
+{
+ return m_shortLabel;
+}
+
+QString RosegardenParameterBox::getLongLabel() const
+{
+ return m_longLabel;
+}
+
+QString RosegardenParameterBox::getPreviousBox(RosegardenParameterArea::Arrangement) const
+{
+ // No ordering known -- depends on subclasses
+ return "";
+}
+
+}
+#include "RosegardenParameterBox.moc"
diff --git a/src/gui/editors/parameters/RosegardenParameterBox.h b/src/gui/editors/parameters/RosegardenParameterBox.h
new file mode 100644
index 0000000..6f17358
--- /dev/null
+++ b/src/gui/editors/parameters/RosegardenParameterBox.h
@@ -0,0 +1,92 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_ROSEGARDENPARAMETERBOX_H_
+#define _RG_ROSEGARDENPARAMETERBOX_H_
+
+#include "RosegardenParameterArea.h"
+#include <qfont.h>
+#include <qframe.h>
+#include <qstring.h>
+#include <klocale.h>
+
+
+class QWidget;
+
+
+namespace Rosegarden
+{
+
+
+
+/**
+ * A flat QFrame, in which a group of parameters can be laid out.
+ * Virtual method functions are defined for for requesting a layout
+ * style, and returning the single-word to use for labelling the
+ * box.
+ */
+
+class RosegardenParameterBox : public QFrame
+{
+ Q_OBJECT
+public:
+ RosegardenParameterBox(const QString &shortLabel, // e.g. i18n("Track")
+ const QString &longLabel, // e.g. i18n("Track Parameters")
+ QWidget *parent = 0,
+ const char *name = 0);
+
+ // Ask for a one-word string that can be used to label the widget.
+ QString getShortLabel() const;
+
+ // Ask for the full label (e.g. short-label "Parameters")
+ QString getLongLabel() const;
+
+ // Get the short label of the prior parameter box (to establish an ordering)
+ virtual QString getPreviousBox(RosegardenParameterArea::Arrangement) const;
+
+ virtual void showAdditionalControls(bool) = 0;
+
+protected:
+ void init();
+
+ // List the layout styles that may be requested via a call to setStyle().
+
+ enum LayoutMode {
+ LANDSCAPE_MODE, // Optimize the layout for a tall and narrow parent.
+ PORTRAIT_MODE // Optimize the layout for a short and wide parent.
+ };
+
+ void setLayoutMode(LayoutMode mode);
+
+ QFont m_font;
+ QString m_shortLabel; // The string that containers can use for labelling and identification
+ QString m_longLabel; // The full title
+ LayoutMode m_mode; // The current layout mode.
+};
+
+
+}
+
+#endif
diff --git a/src/gui/editors/parameters/SegmentParameterBox.cpp b/src/gui/editors/parameters/SegmentParameterBox.cpp
new file mode 100644
index 0000000..c17cbe2
--- /dev/null
+++ b/src/gui/editors/parameters/SegmentParameterBox.cpp
@@ -0,0 +1,1214 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "SegmentParameterBox.h"
+#include <qlayout.h>
+#include <kapplication.h>
+
+#include <klocale.h>
+#include "misc/Debug.h"
+#include "misc/Strings.h"
+#include "document/ConfigGroups.h"
+#include "base/Colour.h"
+#include "base/ColourMap.h"
+#include "base/Composition.h"
+#include "base/MidiProgram.h"
+#include "base/NotationTypes.h"
+#include "base/BasicQuantizer.h"
+#include "base/RealTime.h"
+#include "base/Segment.h"
+#include "base/Selection.h"
+#include "commands/segment/SegmentChangeQuantizationCommand.h"
+#include "commands/segment/SegmentColourCommand.h"
+#include "commands/segment/SegmentColourMapCommand.h"
+#include "commands/segment/SegmentCommandRepeat.h"
+#include "commands/segment/SegmentLabelCommand.h"
+#include "document/MultiViewCommandHistory.h"
+#include "document/RosegardenGUIDoc.h"
+#include "gui/dialogs/PitchPickerDialog.h"
+#include "gui/editors/notation/NotationStrings.h"
+#include "gui/editors/notation/NotePixmapFactory.h"
+#include "gui/general/GUIPalette.h"
+#include "gui/widgets/ColourTable.h"
+#include "gui/widgets/TristateCheckBox.h"
+#include "RosegardenParameterArea.h"
+#include "RosegardenParameterBox.h"
+#include <kcolordialog.h>
+#include <kcombobox.h>
+#include <kcommand.h>
+#include <kconfig.h>
+#include <klineeditdlg.h>
+#include <ktabwidget.h>
+#include <qbutton.h>
+#include <qcheckbox.h>
+#include <qcolor.h>
+#include <qdialog.h>
+#include <qfont.h>
+#include <qfontmetrics.h>
+#include <qframe.h>
+#include <qlabel.h>
+#include <qpixmap.h>
+#include <qpushbutton.h>
+#include <qscrollview.h>
+#include <qspinbox.h>
+#include <qstring.h>
+#include <qtooltip.h>
+#include <qvbox.h>
+#include <qwidget.h>
+#include <qwidgetstack.h>
+
+
+namespace Rosegarden
+{
+
+SegmentParameterBox::SegmentParameterBox(RosegardenGUIDoc* doc,
+ QWidget *parent)
+ : RosegardenParameterBox(i18n("Segment"),
+ i18n("Segment Parameters"),
+ parent),
+ m_highestPlayable(127),
+ m_lowestPlayable(0),
+ m_standardQuantizations(BasicQuantizer::getStandardQuantizations()),
+ m_doc(doc),
+ m_transposeRange(48)
+{
+ initBox();
+
+ m_doc->getComposition().addObserver(this);
+
+ connect(getCommandHistory(), SIGNAL(commandExecuted()),
+ this, SLOT(update()));
+}
+
+SegmentParameterBox::~SegmentParameterBox()
+{
+ if (!isCompositionDeleted()) {
+ m_doc->getComposition().removeObserver(this);
+ }
+}
+
+void
+SegmentParameterBox::initBox()
+{
+ QFont font(m_font);
+
+ QFontMetrics fontMetrics(font);
+ // magic numbers: 13 is the height of the menu pixmaps, 10 is just 10
+ //int comboHeight = std::max(fontMetrics.height(), 13) + 10;
+ int width = fontMetrics.width("12345678901234567890");
+
+ // QFrame *frame = new QFrame(this);
+ QGridLayout *gridLayout = new QGridLayout(this, 8, 6, 4, 2);
+
+ QLabel *label = new QLabel(i18n("Label"), this);
+ QLabel *repeatLabel = new QLabel(i18n("Repeat"), this);
+ QLabel *quantizeLabel = new QLabel(i18n("Quantize"), this);
+ QLabel *transposeLabel = new QLabel(i18n("Transpose"), this);
+ QLabel *delayLabel = new QLabel(i18n("Delay"), this);
+ QLabel *colourLabel = new QLabel(i18n("Color"), this);
+// m_autoFadeLabel = new QLabel(i18n("Audio auto-fade"), this);
+// m_fadeInLabel = new QLabel(i18n("Fade in"), this);
+// m_fadeOutLabel = new QLabel(i18n("Fade out"), this);
+// m_rangeLabel = new QLabel(i18n("Range"), this);
+
+ // Label ..
+ m_label = new QLabel(this);
+ m_label->setFont(font);
+ m_label->setFixedWidth(width);
+ //m_label->setFixedHeight(comboHeight);
+ m_label->setFrameStyle(QFrame::Panel | QFrame::Sunken);
+
+ // .. and edit button
+ m_labelButton = new QPushButton(i18n("Edit"), this);
+ m_labelButton->setFont(font);
+ // m_labelButton->setFixedWidth(50);
+
+ connect(m_labelButton, SIGNAL(released()),
+ SLOT(slotEditSegmentLabel()));
+
+ m_repeatValue = new TristateCheckBox(this);
+ m_repeatValue->setFont(font);
+ //m_repeatValue->setFixedHeight(comboHeight);
+
+ // handle state changes
+ connect(m_repeatValue, SIGNAL(pressed()), SLOT(slotRepeatPressed()));
+
+ // non-reversing motif style read-only combo
+ m_quantizeValue = new KComboBox(this);
+ m_quantizeValue->setFont(font);
+ //m_quantizeValue->setFixedHeight(comboHeight);
+
+ // handle quantize changes from drop down
+ connect(m_quantizeValue, SIGNAL(activated(int)),
+ SLOT(slotQuantizeSelected(int)));
+
+ // reversing motif style read-write combo
+ m_transposeValue = new KComboBox(this);
+ m_transposeValue->setFont(font);
+ //m_transposeValue->setFixedHeight(comboHeight);
+
+ // handle transpose combo changes
+ connect(m_transposeValue, SIGNAL(activated(int)),
+ SLOT(slotTransposeSelected(int)));
+
+ // and text changes
+ connect(m_transposeValue, SIGNAL(textChanged(const QString&)),
+ SLOT(slotTransposeTextChanged(const QString&)));
+
+ // reversing motif style read-write combo
+ m_delayValue = new KComboBox(this);
+ m_delayValue->setFont(font);
+ //m_delayValue->setFixedHeight(comboHeight);
+
+ // handle delay combo changes
+ connect(m_delayValue, SIGNAL(activated(int)),
+ SLOT(slotDelaySelected(int)));
+
+ // Detect when the document colours are updated
+ connect(m_doc, SIGNAL(docColoursChanged()),
+ this, SLOT(slotDocColoursChanged()));
+
+ // handle text changes for delay
+ connect(m_delayValue, SIGNAL(textChanged(const QString&)),
+ SLOT(slotDelayTextChanged(const QString &)));
+
+ // set up combo box for colours
+ m_colourValue = new KComboBox(false, this);
+ m_colourValue->setFont(font);
+ //m_colourValue->setFixedHeight(comboHeight);
+ // m_colourValue->setMaximumWidth(width);
+ m_colourValue->setSizeLimit(20);
+
+ // handle colour combo changes
+ connect(m_colourValue, SIGNAL(activated(int)),
+ SLOT(slotColourSelected(int)));
+
+ // pre-set width of buttons so they don't grow later
+// width = fontMetrics.width(i18n("used internally for spacing", "High: ----"));
+
+ // highest playable note
+ //
+// m_highButton = new QPushButton(i18n("High: ---"), this);
+// QToolTip::add
+// (m_highButton, i18n("Choose the highest suggested playable note, using a staff"));
+// m_highButton->setFont(font);
+// m_highButton->setMinimumWidth(width);
+
+// connect(m_highButton, SIGNAL(released()),
+// SLOT(slotHighestPressed()));
+
+ // lowest playable note
+ //
+// m_lowButton = new QPushButton(i18n("Low: ----"), this);
+// QToolTip::add
+// (m_lowButton, i18n("Choose the lowest suggested playable note, using a staff"));
+// m_lowButton->setFont(font);
+// m_lowButton->setMinimumWidth(width);
+
+// connect(m_lowButton, SIGNAL(released()),
+// SLOT(slotLowestPressed()));
+
+ // Audio autofade enabled
+ //
+// m_autoFadeBox = new QCheckBox(this);
+// connect(m_autoFadeBox, SIGNAL(stateChanged(int)),
+// this, SLOT(slotAudioFadeChanged(int)));
+
+ // Fade in and out times
+ //
+// m_fadeInSpin = new QSpinBox(this);
+// m_fadeInSpin->setMinValue(0);
+// m_fadeInSpin->setMaxValue(5000);
+// m_fadeInSpin->setSuffix(i18n(" ms"));
+// connect(m_fadeInSpin, SIGNAL(valueChanged(int)),
+// this, SLOT(slotFadeInChanged(int)));
+
+// m_fadeOutSpin = new QSpinBox(this);
+// m_fadeOutSpin->setMinValue(0);
+// m_fadeOutSpin->setMaxValue(5000);
+// m_fadeOutSpin->setSuffix(i18n(" ms"));
+// connect(m_fadeOutSpin, SIGNAL(valueChanged(int)),
+// this, SLOT(slotFadeOutChanged(int)));
+
+ label->setFont(font);
+ repeatLabel->setFont(font);
+ quantizeLabel->setFont(font);
+ transposeLabel->setFont(font);
+ delayLabel->setFont(font);
+ colourLabel->setFont(font);
+// m_autoFadeLabel->setFont(font);
+// m_fadeInLabel->setFont(font);
+// m_fadeOutLabel->setFont(font);
+// m_rangeLabel->setFont(font);
+
+ int row = 0;
+
+// gridLayout->addRowSpacing(0, 12); // why??
+
+ gridLayout->addWidget(label, row, 0); //, AlignRight);
+ gridLayout->addMultiCellWidget(m_label, row, row, 1, 4); //, AlignLeft);
+ gridLayout->addWidget(m_labelButton, row, 5); //, AlignLeft);
+ ++row;
+
+ gridLayout->addWidget(repeatLabel, row, 0); //, AlignRight);
+ gridLayout->addWidget(m_repeatValue, row, 1); //, AlignLeft);
+
+ gridLayout->addMultiCellWidget(transposeLabel, row, row, 2, 3, AlignRight);
+ gridLayout->addMultiCellWidget(m_transposeValue, row, row, 4, 5);
+ ++row;
+
+ gridLayout->addWidget(quantizeLabel, row, 0); //, AlignRight);
+ gridLayout->addMultiCellWidget(m_quantizeValue, row, row, 1, 2); //, AlignLeft);
+
+ gridLayout->addWidget(delayLabel, row, 3, AlignRight);
+ gridLayout->addMultiCellWidget(m_delayValue, row, row, 4, 5);
+ ++row;
+
+ gridLayout->addWidget(colourLabel, row, 0); //, AlignRight);
+ gridLayout->addMultiCellWidget(m_colourValue, row, row, 1, 5);
+ ++row;
+
+// gridLayout->addWidget(m_rangeLabel, row, 0); //, AlignRight);
+// gridLayout->addMultiCellWidget(m_lowButton, row, row, 1, 2);
+// gridLayout->addMultiCellWidget(m_highButton, row, row, 3, 4);
+// ++row;
+
+// m_autoFadeLabel->hide();
+// m_autoFadeBox->hide();
+ /*
+ gridLayout->addWidget(m_fadeInLabel, 5, 0, AlignRight);
+ gridLayout->addWidget(m_fadeInSpin, 5, 1);
+
+ gridLayout->addWidget(m_fadeOutLabel, 5, 2, AlignRight);
+ gridLayout->addWidget(m_fadeOutSpin, 5, 3);
+ */
+ // Configure the empty final row to accomodate any extra vertical space.
+
+ gridLayout->setRowStretch(gridLayout->numRows() - 1, 1);
+
+ // Configure the empty final column to accomodate any extra horizontal
+ // space.
+
+// gridLayout->setColStretch(gridLayout->numCols() - 1, 1);
+
+ // populate the quantize combo
+ //
+ QPixmap noMap = NotePixmapFactory::toQPixmap(NotePixmapFactory::makeToolbarPixmap("menu-no-note"));
+
+ for (unsigned int i = 0; i < m_standardQuantizations.size(); ++i) {
+
+ timeT time = m_standardQuantizations[i];
+ timeT error = 0;
+ QString label = NotationStrings::makeNoteMenuLabel(time, true, error);
+ QPixmap pmap = NotePixmapFactory::toQPixmap(NotePixmapFactory::makeNoteMenuPixmap(time, error));
+ m_quantizeValue->insertItem(error ? noMap : pmap, label);
+ }
+ m_quantizeValue->insertItem(noMap, i18n("Off"));
+
+ // default to last item
+ m_quantizeValue->setCurrentItem(m_quantizeValue->count() - 1);
+
+ // populate the transpose combo
+ //
+ for (int i = -m_transposeRange; i < m_transposeRange + 1; i++) {
+ m_transposeValue->insertItem(noMap, QString("%1").arg(i));
+ if (i == 0)
+ m_transposeValue->setCurrentItem(m_transposeValue->count() - 1);
+ }
+
+ m_delays.clear();
+
+ for (int i = 0; i < 6; i++) {
+ timeT time = 0;
+ if (i > 0 && i < 6) {
+ time = Note(Note::Hemidemisemiquaver).getDuration() << (i - 1);
+ } else if (i > 5) {
+ time = Note(Note::Crotchet).getDuration() * (i - 4);
+ }
+
+ m_delays.push_back(time);
+
+ // check if it's a valid note duration (it will be for the
+ // time defn above, but if we were basing it on the sequencer
+ // resolution it might not be) & include a note pixmap if so
+ //
+ timeT error = 0;
+ QString label = NotationStrings::makeNoteMenuLabel(time, true, error);
+ QPixmap pmap = NotePixmapFactory::toQPixmap(NotePixmapFactory::makeNoteMenuPixmap(time, error));
+ m_delayValue->insertItem((error ? noMap : pmap), label);
+ }
+
+ for (int i = 0; i < 10; i++) {
+ int rtd = (i < 5 ? ((i + 1) * 10) : ((i - 3) * 50));
+ m_realTimeDelays.push_back(rtd);
+ m_delayValue->insertItem(i18n("%1 ms").arg(rtd));
+ }
+
+ // set delay blank initially
+ m_delayValue->setCurrentItem( -1);
+
+ // populate m_colourValue
+ slotDocColoursChanged();
+
+ //!!! disabled until after 1.3
+// m_highButton->hide();
+// m_lowButton->hide();
+// m_rangeLabel->hide();
+ //////////////////////////////
+
+}
+
+void
+SegmentParameterBox::setDocument(RosegardenGUIDoc* doc)
+{
+ if (m_doc != 0)
+ disconnect(m_doc, SIGNAL(docColoursChanged()),
+ this, SLOT(slotDocColoursChanged()));
+
+ m_doc = doc;
+
+ // Detect when the document colours are updated
+ connect (m_doc, SIGNAL(docColoursChanged()),
+ this, SLOT(slotDocColoursChanged()));
+
+ slotDocColoursChanged(); // repopulate combo
+}
+
+void
+SegmentParameterBox::useSegment(Segment *segment)
+{
+ m_segments.clear();
+ m_segments.push_back(segment);
+ populateBoxFromSegments();
+}
+
+void
+SegmentParameterBox::useSegments(const SegmentSelection &segments)
+{
+ m_segments.clear();
+
+ m_segments.resize(segments.size());
+ std::copy(segments.begin(), segments.end(), m_segments.begin());
+
+ populateBoxFromSegments();
+}
+
+void
+SegmentParameterBox::slotDocColoursChanged()
+{
+ RG_DEBUG << "SegmentParameterBox::slotDocColoursChanged()" << endl;
+
+ m_colourValue->clear();
+ m_colourList.clear();
+ // Populate it from composition.m_segmentColourMap
+ ColourMap temp = m_doc->getComposition().getSegmentColourMap();
+
+ unsigned int i = 0;
+
+ for (RCMap::const_iterator it = temp.begin(); it != temp.end(); ++it) {
+ QString qtrunc(strtoqstr(it->second.second));
+ QPixmap colour(15, 15);
+ colour.fill(GUIPalette::convertColour(it->second.first));
+ if (qtrunc == "") {
+ m_colourValue->insertItem(colour, i18n("Default"), i);
+ } else {
+ // truncate name to 15 characters to avoid the combo forcing the
+ // whole kit and kaboodle too wide
+ if (qtrunc.length() > 15)
+ qtrunc = qtrunc.left(12) + "...";
+ m_colourValue->insertItem(colour, qtrunc, i);
+ }
+ m_colourList[it->first] = i; // maps colour number to menu index
+ ++i;
+ }
+
+ m_addColourPos = i;
+ m_colourValue->insertItem(i18n("Add New Color"), m_addColourPos);
+
+ m_colourValue->setCurrentItem(0);
+}
+
+void SegmentParameterBox::update()
+{
+ RG_DEBUG << "SegmentParameterBox::update()" << endl;
+
+ populateBoxFromSegments();
+}
+
+void
+SegmentParameterBox::segmentRemoved(const Composition *composition,
+ Segment *segment)
+{
+ if (composition == &m_doc->getComposition()) {
+
+ for (std::vector<Segment*>::iterator it =
+ m_segments.begin(); it != m_segments.end(); ++it) {
+
+ if (*it == segment) {
+ m_segments.erase(it);
+ return ;
+ }
+ }
+ }
+}
+
+void
+SegmentParameterBox::populateBoxFromSegments()
+{
+ std::vector<Segment*>::iterator it;
+ Tristate repeated = NotApplicable;
+ Tristate quantized = NotApplicable;
+ Tristate transposed = NotApplicable;
+ Tristate delayed = NotApplicable;
+ Tristate diffcolours = NotApplicable;
+ Tristate highlow = NotApplicable;
+ unsigned int myCol = 0;
+ unsigned int myHigh = 127;
+ unsigned int myLow = 0;
+
+ timeT qntzLevel = 0;
+ // At the moment we have no negative delay, so we use negative
+ // values to represent real-time delay in ms
+ timeT delayLevel = 0;
+ int transposeLevel = 0;
+
+ if (m_segments.size() == 0)
+ m_label->setText("");
+ else
+ m_label->setText(strtoqstr(m_segments[0]->getLabel()));
+
+ for (it = m_segments.begin(); it != m_segments.end(); it++) {
+ // ok, first thing is we know we have at least one segment
+ if (repeated == NotApplicable)
+ repeated = None;
+ if (quantized == NotApplicable)
+ quantized = None;
+ if (transposed == NotApplicable)
+ transposed = None;
+ if (delayed == NotApplicable)
+ delayed = None;
+ if (diffcolours == NotApplicable)
+ diffcolours = None;
+ if (highlow == NotApplicable)
+ highlow = None;
+
+ // Set label to "*" when multiple labels don't match
+ //
+ if (strtoqstr((*it)->getLabel()) != m_label->text())
+ m_label->setText("*");
+
+ // Are all, some or none of the Segments repeating?
+ if ((*it)->isRepeating()) {
+ if (it == m_segments.begin())
+ repeated = All;
+ else {
+ if (repeated == None)
+ repeated = Some;
+ }
+ } else {
+ if (repeated == All)
+ repeated = Some;
+ }
+
+ // Quantization
+ //
+ if ((*it)->hasQuantization()) {
+ if (it == m_segments.begin()) {
+ quantized = All;
+ qntzLevel = (*it)->getQuantizer()->getUnit();
+ } else {
+ // If quantize levels don't match
+ if (quantized == None ||
+ (quantized == All &&
+ qntzLevel !=
+ (*it)->getQuantizer()->getUnit()))
+ quantized = Some;
+ }
+ } else {
+ if (quantized == All)
+ quantized = Some;
+ }
+
+ // Transpose
+ //
+ if ((*it)->getTranspose() != 0) {
+ if (it == m_segments.begin()) {
+ transposed = All;
+ transposeLevel = (*it)->getTranspose();
+ } else {
+ if (transposed == None ||
+ (transposed == All &&
+ transposeLevel != (*it)->getTranspose()))
+ transposed = Some;
+ }
+
+ } else {
+ if (transposed == All)
+ transposed = Some;
+ }
+
+ // Delay
+ //
+ timeT myDelay = (*it)->getDelay();
+ if (myDelay == 0) {
+ myDelay = -((*it)->getRealTimeDelay().sec * 1000 +
+ (*it)->getRealTimeDelay().msec());
+ }
+
+ if (myDelay != 0) {
+ if (it == m_segments.begin()) {
+ delayed = All;
+ delayLevel = myDelay;
+ } else {
+ if (delayed == None ||
+ (delayed == All &&
+ delayLevel != myDelay))
+ delayed = Some;
+ }
+ } else {
+ if (delayed == All)
+ delayed = Some;
+ }
+
+ // Colour
+
+ if (it == m_segments.begin()) {
+ myCol = (*it)->getColourIndex();
+ } else {
+ if (myCol != (*it)->getColourIndex())
+ ;
+ diffcolours = All;
+ }
+
+ // Highest/Lowest playable
+ //
+ if (it == m_segments.begin()) {
+ myHigh = (*it)->getHighestPlayable();
+ myLow = (*it)->getLowestPlayable();
+ } else {
+ if (myHigh != (*it)->getHighestPlayable() ||
+ myLow != (*it)->getLowestPlayable()) {
+ highlow = All;
+ }
+ }
+
+ }
+
+ switch (repeated) {
+ case All:
+ m_repeatValue->setChecked(true);
+ break;
+
+ case Some:
+ m_repeatValue->setNoChange();
+ break;
+
+ case None:
+ case NotApplicable:
+ default:
+ m_repeatValue->setChecked(false);
+ break;
+ }
+
+ m_repeatValue->setEnabled(repeated != NotApplicable);
+
+ switch (quantized) {
+ case All: {
+ for (unsigned int i = 0;
+ i < m_standardQuantizations.size(); ++i) {
+ if (m_standardQuantizations[i] == qntzLevel) {
+ m_quantizeValue->setCurrentItem(i);
+ break;
+ }
+ }
+ }
+ break;
+
+ case Some:
+ // Set the edit text to an unfeasible blank value meaning "Some"
+ //
+ m_quantizeValue->setCurrentItem( -1);
+ break;
+
+ // Assuming "Off" is always the last field
+ case None:
+ default:
+ m_quantizeValue->setCurrentItem(m_quantizeValue->count() - 1);
+ break;
+ }
+
+ m_quantizeValue->setEnabled(quantized != NotApplicable);
+
+ switch (transposed) {
+ // setCurrentItem works with QStrings
+ // 2nd arg of "true" means "add if necessary"
+ case All:
+ m_transposeValue->
+ setCurrentItem(QString("%1").arg(transposeLevel), true);
+ break;
+
+ case Some:
+ m_transposeValue->setCurrentItem(QString(""), true);
+ break;
+
+ case None:
+ default:
+ m_transposeValue->setCurrentItem("0");
+ break;
+ }
+
+ m_transposeValue->setEnabled(transposed != NotApplicable);
+
+ m_delayValue->blockSignals(true);
+
+ switch (delayed) {
+ case All:
+ if (delayLevel >= 0) {
+ timeT error = 0;
+ QString label = NotationStrings::makeNoteMenuLabel(delayLevel,
+ true,
+ error);
+ m_delayValue->setCurrentItem(label, true);
+
+ } else if (delayLevel < 0) {
+
+ m_delayValue->setCurrentItem(i18n("%1 ms").arg( -delayLevel),
+ true);
+ }
+
+ break;
+
+ case Some:
+ m_delayValue->setCurrentItem("", true);
+ break;
+
+ case None:
+ default:
+ m_delayValue->setCurrentItem(0);
+ break;
+ }
+
+ m_delayValue->setEnabled(delayed != NotApplicable);
+
+ m_delayValue->blockSignals(false);
+
+ switch (diffcolours) {
+ case None:
+ if (m_colourList.find(myCol) != m_colourList.end())
+ m_colourValue->setCurrentItem(m_colourList[myCol]);
+ else
+ m_colourValue->setCurrentItem(0);
+ break;
+
+
+ case All:
+ case NotApplicable:
+ default:
+ m_colourValue->setCurrentItem(0);
+ break;
+
+ }
+
+ m_colourValue->setEnabled(diffcolours != NotApplicable);
+
+ //!!! this is all borked up and useless; sort out after 1.3
+/*
+ switch (highlow) {
+ case All:
+ updateHighLow();
+ break;
+
+ case Some:
+ case None:
+ default:
+ m_highButton->setText(i18n("High: ---"));
+ m_lowButton->setText(i18n("Low: ----"));
+ highlow = NotApplicable;
+ break;
+ }
+
+ m_highButton->setEnabled(highlow != NotApplicable);
+ m_lowButton->setEnabled(highlow != NotApplicable);
+*/
+
+ // Enable or disable the fade in/out params
+/*
+ if (m_segments.size() == 1 &&
+ (*(m_segments.begin()))->getType() == Segment::Audio) {
+ m_autoFadeBox->blockSignals(true);
+ m_fadeInSpin->blockSignals(true);
+ m_fadeOutSpin->blockSignals(true);
+
+ ... !!! No, not setting up autofade widgets. The implementation's too
+ incomplete to finish for this release.
+
+ (Or for the next one after the one the previous comment referred to.)
+
+ (Or for the one after the one after that. Will we ever get those
+ working, or should Rich's final legacy simply be quietly disappeared?)
+
+ m_fadeInLabel->show();
+ m_fadeInSpin->show();
+ m_fadeOutLabel->show();
+ m_fadeOutSpin->show();
+
+ instead:
+
+ m_fadeInLabel->hide();
+ m_fadeInSpin->hide();
+ m_fadeOutLabel->hide();
+ m_fadeOutSpin->hide();
+
+ m_autoFadeLabel->setEnabled(true);
+ m_autoFadeBox->setEnabled(true);
+ m_fadeInLabel->setEnabled(true);
+ m_fadeInSpin->setEnabled(true);
+ m_fadeOutLabel->setEnabled(true);
+ m_fadeOutSpin->setEnabled(true);
+
+ Segment *seg = *(m_segments.begin());
+
+ int fadeInTime = seg->getFadeInTime().sec * 1000 +
+ seg->getFadeInTime().msec();
+ m_fadeInSpin->setValue(fadeInTime);
+
+ int fadeOutTime = seg->getFadeOutTime().sec * 1000 +
+ seg->getFadeOutTime().msec();
+ m_fadeOutSpin->setValue(fadeOutTime);
+
+ m_autoFadeBox->setChecked(seg->isAutoFading());
+
+ m_autoFadeBox->blockSignals(false);
+ m_fadeInSpin->blockSignals(false);
+ m_fadeOutSpin->blockSignals(false);
+ } else {
+ m_autoFadeLabel->setEnabled(false);
+ m_autoFadeBox->setEnabled(false);
+ m_fadeInLabel->setEnabled(false);
+ m_fadeInSpin->setEnabled(false);
+ m_fadeOutLabel->setEnabled(false);
+ m_fadeOutSpin->setEnabled(false);
+
+ m_autoFadeLabel->hide();
+ m_autoFadeBox->hide();
+ m_fadeInLabel->hide();
+ m_fadeInSpin->hide();
+ m_fadeOutLabel->hide();
+ m_fadeOutSpin->hide();
+
+ m_autoFadeBox->setChecked(false);
+ m_fadeInSpin->setValue(0);
+ m_fadeOutSpin->setValue(0);
+ }
+*/
+
+}
+
+void SegmentParameterBox::slotRepeatPressed()
+{
+ if (m_segments.size() == 0)
+ return ;
+
+ bool state = false;
+
+ switch (m_repeatValue->state()) {
+ case QButton::Off:
+ state = true;
+ break;
+
+ case QButton::NoChange:
+ case QButton::On:
+ default:
+ state = false;
+ break;
+ }
+
+ // update the check box and all current Segments
+ m_repeatValue->setChecked(state);
+
+ addCommandToHistory(new SegmentCommandRepeat(m_segments, state));
+
+ // std::vector<Segment*>::iterator it;
+
+ // for (it = m_segments.begin(); it != m_segments.end(); it++)
+ // (*it)->setRepeating(state);
+}
+
+void
+SegmentParameterBox::slotQuantizeSelected(int qLevel)
+{
+ bool off = (qLevel == m_quantizeValue->count() - 1);
+
+ SegmentChangeQuantizationCommand *command =
+ new SegmentChangeQuantizationCommand
+ (off ? 0 : m_standardQuantizations[qLevel]);
+
+ std::vector<Segment*>::iterator it;
+ for (it = m_segments.begin(); it != m_segments.end(); it++) {
+ command->addSegment(*it);
+ }
+
+ addCommandToHistory(command);
+}
+
+void
+SegmentParameterBox::slotTransposeTextChanged(const QString &text)
+{
+ if (text.isEmpty() || m_segments.size() == 0)
+ return ;
+
+ int transposeValue = text.toInt();
+
+ // addCommandToHistory(new SegmentCommandChangeTransposeValue(m_segments,
+ // transposeValue));
+
+ std::vector<Segment*>::iterator it;
+ for (it = m_segments.begin(); it != m_segments.end(); it++) {
+ (*it)->setTranspose(transposeValue);
+ }
+
+ emit documentModified();
+}
+
+void
+SegmentParameterBox::slotTransposeSelected(int value)
+{
+ slotTransposeTextChanged(m_transposeValue->text(value));
+}
+
+void
+SegmentParameterBox::slotDelayTimeChanged(timeT delayValue)
+{
+ // by convention and as a nasty hack, we use negative timeT here
+ // to represent positive RealTime in ms
+
+ if (delayValue > 0) {
+
+ std::vector<Segment*>::iterator it;
+ for (it = m_segments.begin(); it != m_segments.end(); it++) {
+ (*it)->setDelay(delayValue);
+ (*it)->setRealTimeDelay(RealTime::zeroTime);
+ }
+
+ } else if (delayValue < 0) {
+
+ std::vector<Segment*>::iterator it;
+ for (it = m_segments.begin(); it != m_segments.end(); it++) {
+ (*it)->setDelay(0);
+ int sec = ( -delayValue) / 1000;
+ int nsec = (( -delayValue) - 1000 * sec) * 1000000;
+ (*it)->setRealTimeDelay(RealTime(sec, nsec));
+ }
+ } else {
+
+ std::vector<Segment*>::iterator it;
+ for (it = m_segments.begin(); it != m_segments.end(); it++) {
+ (*it)->setDelay(0);
+ (*it)->setRealTimeDelay(RealTime::zeroTime);
+ }
+ }
+
+ emit documentModified();
+}
+
+void
+SegmentParameterBox::slotDelayTextChanged(const QString &text)
+{
+ if (text.isEmpty() || m_segments.size() == 0)
+ return ;
+
+ slotDelayTimeChanged( -(text.toInt()));
+}
+
+void
+SegmentParameterBox::slotDelaySelected(int value)
+{
+ if (value < int(m_delays.size())) {
+ slotDelayTimeChanged(m_delays[value]);
+ } else {
+ slotDelayTimeChanged( -(m_realTimeDelays[value - m_delays.size()]));
+ }
+}
+
+void
+SegmentParameterBox::slotColourSelected(int value)
+{
+ if (value != m_addColourPos) {
+ unsigned int temp = 0;
+
+ ColourTable::ColourList::const_iterator pos;
+ for (pos = m_colourList.begin(); pos != m_colourList.end(); ++pos) {
+ if (pos->second == value) {
+ temp = pos->first;
+ break;
+ }
+ }
+
+ SegmentSelection segments;
+ std::vector<Segment*>::iterator it;
+
+ for (it = m_segments.begin(); it != m_segments.end(); ++it) {
+ segments.insert(*it);
+ }
+
+ SegmentColourCommand *command = new SegmentColourCommand(segments, temp);
+
+ addCommandToHistory(command);
+ } else {
+ ColourMap newMap = m_doc->getComposition().getSegmentColourMap();
+ QColor newColour;
+ bool ok = false;
+ QString newName = KLineEditDlg::getText(i18n("New Color Name"), i18n("Enter new name"),
+ i18n("New"), &ok);
+ if ((ok == true) && (!newName.isEmpty())) {
+ KColorDialog box(this, "", true);
+
+ int result = box.getColor(newColour);
+
+ if (result == KColorDialog::Accepted) {
+ Colour newRColour = GUIPalette::convertColour(newColour);
+ newMap.addItem(newRColour, qstrtostr(newName));
+ SegmentColourMapCommand *command = new SegmentColourMapCommand(m_doc, newMap);
+ addCommandToHistory(command);
+ slotDocColoursChanged();
+ }
+ }
+ // Else we don't do anything as they either didn't give a name·
+ // or didn't give a colour
+ }
+
+
+}
+
+void
+SegmentParameterBox::updateHighLow()
+{
+ // Key of C major and NoAccidental means any "black key" notes will be
+ // written as sharps.
+ Accidental accidental = Accidentals::NoAccidental;
+ Rosegarden::Key key = Rosegarden::Key("C major");
+
+ Pitch highest(m_highestPlayable, accidental);
+ Pitch lowest(m_lowestPlayable, accidental);
+
+ KConfig *config = kapp->config();
+ config->setGroup(GeneralOptionsConfigGroup);
+ int base = config->readNumEntry("midipitchoctave", -2);
+ //!!! FIXME this code is broken, and needs to be fixed after the fashion of
+ //the TPB, but I'm not bothering with that at this time, because they are
+ //going to be hidden for 1.3 anyway
+// m_highButton->setText(QString("&High: %1%2").arg(highest.getNoteName(key)).arg(highest.getOctave(base)));
+// m_lowButton->setText(QString("&Low: %1%2").arg(lowest.getNoteName(key)).arg(lowest.getOctave(base)));
+}
+
+void
+SegmentParameterBox::slotHighestPressed()
+{
+ RG_DEBUG << "SegmentParameterBox::slotHighestPressed()" << endl;
+
+ PitchPickerDialog dialog(0, m_highestPlayable, i18n("Highest playable note"));
+ std::vector<Segment*>::iterator it;
+
+ if (dialog.exec() == QDialog::Accepted) {
+ m_highestPlayable = dialog.getPitch();
+ updateHighLow();
+
+ for (it = m_segments.begin(); it != m_segments.end(); it++) {
+ (*it)->setHighestPlayable(m_highestPlayable);
+ }
+
+ emit documentModified();
+ }
+}
+
+void
+SegmentParameterBox::slotLowestPressed()
+{
+ RG_DEBUG << "SegmentParameterBox::slotLowestPressed()" << endl;
+
+ PitchPickerDialog dialog(0, m_lowestPlayable, i18n("Lowest playable note"));
+ std::vector<Segment*>::iterator it;
+
+ if (dialog.exec() == QDialog::Accepted) {
+ m_lowestPlayable = dialog.getPitch();
+ updateHighLow();
+
+ for (it = m_segments.begin(); it != m_segments.end(); it++) {
+ (*it)->setLowestPlayable(m_lowestPlayable);
+ }
+
+ emit documentModified();
+ }
+}
+
+MultiViewCommandHistory*
+SegmentParameterBox::getCommandHistory()
+{
+ return m_doc->getCommandHistory();
+}
+
+void
+SegmentParameterBox::addCommandToHistory(KCommand *command)
+{
+ m_doc->getCommandHistory()->addCommand(command);
+}
+
+void
+SegmentParameterBox::slotEditSegmentLabel()
+{
+ QString editLabel;
+
+ if (m_segments.size() == 0)
+ return ;
+ else if (m_segments.size() == 1)
+ editLabel = i18n("Modify Segment label");
+ else
+ editLabel = i18n("Modify Segments label");
+
+ bool ok = false;
+
+ // Remove the asterisk if we're using it
+ //
+ QString label = m_label->text();
+ if (label == "*")
+ label = "";
+
+ QString newLabel = KLineEditDlg::getText(editLabel,
+ i18n("Enter new label"),
+ m_label->text(),
+ &ok,
+ this);
+
+ if (ok) {
+ SegmentSelection segments;
+ std::vector<Segment*>::iterator it;
+ for (it = m_segments.begin(); it != m_segments.end(); ++it)
+ segments.insert(*it);
+
+ SegmentLabelCommand *command = new
+ SegmentLabelCommand(segments, newLabel);
+
+ addCommandToHistory(command);
+
+ // fix #1776915, maybe?
+ update();
+ }
+}
+
+void
+SegmentParameterBox::slotAudioFadeChanged(int value)
+{
+ RG_DEBUG << "SegmentParameterBox::slotAudioFadeChanged - value = "
+ << value << endl;
+/*
+ if (m_segments.size() == 0)
+ return ;
+
+ bool state = false;
+ if (value == QButton::On)
+ state = true;
+
+ std::vector<Segment*>::iterator it;
+ for (it = m_segments.begin(); it != m_segments.end(); it++) {
+ (*it)->setAutoFade(state);
+ }
+*/
+}
+
+void
+SegmentParameterBox::slotFadeInChanged(int value)
+{
+ RG_DEBUG << "SegmentParameterBox::slotFadeInChanged - value = "
+ << value << endl;
+/*
+ if (m_segments.size() == 0)
+ return ;
+
+ if (value == 0 && m_fadeOutSpin->value() == 0)
+ slotAudioFadeChanged(QButton::Off);
+ else
+ slotAudioFadeChanged(QButton::On);
+
+ // Convert from ms
+ //
+ RealTime fadeInTime(value / 1000, (value % 1000) * 1000000);
+
+ std::vector<Segment*>::iterator it;
+ for (it = m_segments.begin(); it != m_segments.end(); it++) {
+ (*it)->setFadeInTime(fadeInTime);
+ }
+
+ emit documentModified();
+*/
+}
+
+void
+SegmentParameterBox::slotFadeOutChanged(int value)
+{
+ RG_DEBUG << "SegmentParameterBox::slotFadeOutChanged - value = "
+ << value << endl;
+/*
+ if (m_segments.size() == 0)
+ return ;
+
+ if (value == 0 && m_fadeInSpin->value() == 0)
+ slotAudioFadeChanged(QButton::Off);
+ else
+ slotAudioFadeChanged(QButton::On);
+
+ // Convert from ms
+ //
+ RealTime fadeOutTime(value / 1000000, (value % 1000) * 10000000);
+
+ std::vector<Segment*>::iterator it;
+ for (it = m_segments.begin(); it != m_segments.end(); it++) {
+ (*it)->setFadeOutTime(fadeOutTime);
+ }
+
+ emit documentModified();
+*/
+}
+
+void
+SegmentParameterBox::showAdditionalControls(bool showThem)
+{
+ //!!! disabled until after 1.3
+ /* m_highButton->setShown(showThem);
+ m_lowButton->setShown(showThem);
+ m_rangeLabel->setShown(showThem); */
+}
+
+QString
+SegmentParameterBox::getPreviousBox(RosegardenParameterArea::Arrangement arrangement) const
+{
+ if (arrangement == RosegardenParameterArea::CLASSIC_STYLE) {
+ return "";
+ } else {
+ return i18n("Instrument");
+ }
+}
+
+}
+#include "SegmentParameterBox.moc"
diff --git a/src/gui/editors/parameters/SegmentParameterBox.h b/src/gui/editors/parameters/SegmentParameterBox.h
new file mode 100644
index 0000000..a8b0353
--- /dev/null
+++ b/src/gui/editors/parameters/SegmentParameterBox.h
@@ -0,0 +1,174 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_SEGMENTPARAMETERBOX_H_
+#define _RG_SEGMENTPARAMETERBOX_H_
+
+#include "base/Composition.h"
+#include "base/MidiProgram.h"
+#include "gui/widgets/ColourTable.h"
+#include "RosegardenParameterArea.h"
+#include "RosegardenParameterBox.h"
+#include <qstring.h>
+#include <vector>
+#include "base/Event.h"
+
+
+class QWidget;
+class QSpinBox;
+class QPushButton;
+class QLabel;
+class QCheckBox;
+class KCommand;
+class KComboBox;
+
+
+namespace Rosegarden
+{
+
+class TristateCheckBox;
+class SegmentSelection;
+class Segment;
+class RosegardenGUIDoc;
+class MultiViewCommandHistory;
+class Composition;
+
+
+class SegmentParameterBox : public RosegardenParameterBox,
+ public CompositionObserver
+{
+Q_OBJECT
+
+public:
+
+ typedef enum
+ {
+ None,
+ Some,
+ All,
+ NotApplicable // no applicable segments selected
+ } Tristate;
+
+ SegmentParameterBox(RosegardenGUIDoc *doc,
+ QWidget *parent=0);
+ ~SegmentParameterBox();
+
+ // Use Segments to update GUI parameters
+ //
+ void useSegment(Segment *segment);
+ void useSegments(const SegmentSelection &segments);
+
+ // Command history stuff
+ MultiViewCommandHistory* getCommandHistory();
+ void addCommandToHistory(KCommand *command);
+
+ void setDocument(RosegardenGUIDoc*);
+
+ // CompositionObserver interface
+ //
+ virtual void segmentRemoved(const Composition *,
+ Segment *);
+
+ virtual void showAdditionalControls(bool showThem);
+
+ virtual QString getPreviousBox(RosegardenParameterArea::Arrangement) const;
+
+public slots:
+ void slotRepeatPressed();
+ void slotQuantizeSelected(int);
+
+ void slotTransposeSelected(int);
+ void slotTransposeTextChanged(const QString &);
+
+ void slotDelaySelected(int);
+ void slotDelayTimeChanged(timeT delayValue);
+ void slotDelayTextChanged(const QString &);
+
+ void slotEditSegmentLabel();
+
+ void slotColourSelected(int);
+ void slotDocColoursChanged();
+
+ void slotAudioFadeChanged(int);
+ void slotFadeInChanged(int);
+ void slotFadeOutChanged(int);
+
+ void slotHighestPressed();
+ void slotLowestPressed();
+
+ virtual void update();
+
+signals:
+ void documentModified();
+ void canvasModified();
+
+protected:
+ void initBox();
+ void populateBoxFromSegments();
+ void updateHighLow();
+
+ QLabel *m_label;
+// QLabel *m_rangeLabel;
+ QPushButton *m_labelButton;
+// QPushButton *m_highButton;
+// QPushButton *m_lowButton;
+ TristateCheckBox *m_repeatValue;
+ KComboBox *m_quantizeValue;
+ KComboBox *m_transposeValue;
+ KComboBox *m_delayValue;
+ KComboBox *m_colourValue;
+
+ // Audio autofade
+ //
+// QLabel *m_autoFadeLabel;
+// QCheckBox *m_autoFadeBox;
+// QLabel *m_fadeInLabel;
+// QSpinBox *m_fadeInSpin;
+// QLabel *m_fadeOutLabel;
+// QSpinBox *m_fadeOutSpin;
+
+ int m_addColourPos;
+
+ // used to keep track of highest/lowest as there is no associated spinbox
+ // to query for its value
+ int m_highestPlayable;
+ int m_lowestPlayable;
+
+ std::vector<Segment*> m_segments;
+ std::vector<timeT> m_standardQuantizations;
+ std::vector<timeT> m_delays;
+ std::vector<int> m_realTimeDelays;
+ ColourTable::ColourList m_colourList;
+
+ RosegardenGUIDoc *m_doc;
+
+ MidiByte m_transposeRange;
+};
+
+
+
+}
+
+#endif
diff --git a/src/gui/editors/parameters/TrackParameterBox.cpp b/src/gui/editors/parameters/TrackParameterBox.cpp
new file mode 100644
index 0000000..fc85346
--- /dev/null
+++ b/src/gui/editors/parameters/TrackParameterBox.cpp
@@ -0,0 +1,1022 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ This file is Copyright 2006
+ Pedro Lopez-Cabanillas <[email protected]>
+ D. Michael McIntyre <[email protected]>
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "TrackParameterBox.h"
+#include <qlayout.h>
+#include <kapplication.h>
+
+#include <klocale.h>
+#include "misc/Debug.h"
+#include "misc/Strings.h"
+#include "gui/general/ClefIndex.h"
+#include "document/ConfigGroups.h"
+#include "base/AudioPluginInstance.h"
+#include "base/Colour.h"
+#include "base/ColourMap.h"
+#include "base/Composition.h"
+#include "base/Device.h"
+#include "base/Exception.h"
+#include "base/Instrument.h"
+#include "base/MidiDevice.h"
+#include "base/MidiProgram.h"
+#include "base/NotationTypes.h"
+#include "base/Studio.h"
+#include "base/Track.h"
+#include "base/StaffExportTypes.h"
+#include "commands/segment/SegmentSyncCommand.h"
+#include "document/RosegardenGUIDoc.h"
+#include "gui/dialogs/PitchPickerDialog.h"
+#include "gui/general/GUIPalette.h"
+#include "gui/general/PresetHandlerDialog.h"
+#include "gui/widgets/CollapsingFrame.h"
+#include "gui/widgets/ColourTable.h"
+#include "RosegardenParameterArea.h"
+#include "RosegardenParameterBox.h"
+#include "sound/PluginIdentifier.h"
+#include <kcolordialog.h>
+#include <kcombobox.h>
+#include <kconfig.h>
+#include <klineeditdlg.h>
+#include <kmessagebox.h>
+#include <ksqueezedtextlabel.h>
+#include <ktabwidget.h>
+#include <qcolor.h>
+#include <qdialog.h>
+#include <qfont.h>
+#include <qfontmetrics.h>
+#include <qframe.h>
+#include <qlabel.h>
+#include <qpixmap.h>
+#include <qpushbutton.h>
+#include <qregexp.h>
+#include <qscrollview.h>
+#include <qstring.h>
+#include <qtooltip.h>
+#include <qvbox.h>
+#include <qwidget.h>
+#include <qwidgetstack.h>
+#include <qcheckbox.h>
+
+
+namespace Rosegarden
+{
+
+TrackParameterBox::TrackParameterBox( RosegardenGUIDoc *doc,
+ QWidget *parent)
+ : RosegardenParameterBox(i18n("Track"),
+ i18n("Track Parameters"),
+ parent),
+ m_doc(doc),
+ m_highestPlayable(127),
+ m_lowestPlayable(0),
+ m_selectedTrackId( -1)
+{
+ QFont font(m_font);
+ QFont title_font(m_font);
+ QFontMetrics metrics(font);
+ int width11 = metrics.width("12345678901");
+ int width20 = metrics.width("12345678901234567890");
+ int width22 = metrics.width("1234567890123456789012");
+ int width25 = metrics.width("1234567890123456789012345");
+ setFont(m_font);
+ title_font.setBold(true);
+
+ // Set up default expansions for the collapsing elements
+ KConfig *config = kapp->config();
+ QString groupTemp = config->group();
+ config->setGroup("CollapsingFrame");
+ bool expanded = config->readBoolEntry("trackparametersplayback", true);
+ config->writeEntry("trackparametersplayback", expanded);
+ expanded = config->readBoolEntry("trackparametersrecord", false);
+ config->writeEntry("trackparametersrecord", expanded);
+ expanded = config->readBoolEntry("trackparametersdefaults", false);
+ config->writeEntry("trackparametersdefaults", expanded);
+ expanded = config->readBoolEntry("trackstaffgroup", false);
+ config->writeEntry("trackstaffgroup", expanded);
+ config->setGroup(groupTemp);
+
+ QGridLayout *mainLayout = new QGridLayout(this, 5, 1, 2, 1);
+
+ int row = 0;
+
+ // track label
+ //
+ m_trackLabel = new KSqueezedTextLabel(i18n("<untitled>"), this);
+ m_trackLabel->setAlignment(Qt::AlignCenter);
+ //mainLayout->addMultiCellWidget(m_trackLabel, 0, 0, 0, 5, AlignCenter);
+ mainLayout->addWidget(m_trackLabel, 0, 0);
+
+ // playback group
+ //
+ CollapsingFrame *cframe = new CollapsingFrame(i18n("Playback parameters"),
+ this, "trackparametersplayback");
+ m_playbackGroup = new QFrame(cframe);
+ cframe->setWidget(m_playbackGroup);
+ QGridLayout *groupLayout = new QGridLayout(m_playbackGroup, 3, 3, 3, 2);
+
+ // playback group title
+ //
+ row = 0;
+
+ // playback device
+ //
+ // row++;
+ QLabel *devLabel = new QLabel(i18n("Device"), m_playbackGroup);
+ groupLayout->addWidget(devLabel, row, 0);
+ m_playDevice = new KComboBox(m_playbackGroup);
+ m_playDevice->setMinimumWidth(width25);
+ groupLayout->addMultiCellWidget(m_playDevice, row, row, 1, 2);
+
+ // playback instrument
+ //
+ row++;
+ QLabel *insLabel = new QLabel(i18n("Instrument"), m_playbackGroup);
+ groupLayout->addMultiCellWidget(insLabel, row, row, 0, 1);
+ m_instrument = new KComboBox(m_playbackGroup);
+ m_instrument->setSizeLimit( 16 );
+ m_instrument->setMinimumWidth(width22);
+ groupLayout->addWidget(m_instrument, row, 2);
+
+ groupLayout->setColStretch(groupLayout->numCols() - 1, 1);
+
+ mainLayout->addWidget(cframe, 1, 0);
+
+ // record group
+ //
+ cframe = new CollapsingFrame(i18n("Recording filters"), this,
+ "trackparametersrecord");
+ m_recordGroup = new QFrame(cframe);
+ cframe->setWidget(m_recordGroup);
+ groupLayout = new QGridLayout(m_recordGroup, 3, 3, 3, 2);
+
+ // recording group title
+ //
+ row = 0;
+
+ // recording device
+ groupLayout->addWidget(new QLabel(i18n("Device"), m_recordGroup), row, 0);
+ m_recDevice = new KComboBox(m_recordGroup);
+ m_recDevice->setMinimumWidth(width25);
+ groupLayout->addMultiCellWidget(m_recDevice, row, row, 1, 2);
+
+ // recording channel
+ //
+ row++;
+ groupLayout->addMultiCellWidget(new QLabel(i18n("Channel"), m_recordGroup), row, row, 0, 1);
+ m_recChannel = new KComboBox(m_recordGroup);
+ m_recChannel->setSizeLimit( 17 );
+ m_recChannel->setMinimumWidth(width11);
+ groupLayout->addWidget(m_recChannel, row, 2);
+
+ groupLayout->setColStretch(groupLayout->numCols() - 1, 1);
+
+ mainLayout->addWidget(cframe, 2, 0);
+
+ // staff group
+ //
+ cframe = new CollapsingFrame(i18n("Staff export options"), this,
+ "staffoptions");
+ m_staffGroup = new QFrame(cframe);
+ cframe->setWidget(m_staffGroup);
+ groupLayout = new QGridLayout(m_staffGroup, 2, 2, 2, 2);
+
+ groupLayout->setColStretch(1, 1);
+
+ row = 0;
+
+ // Notation size (export only)
+ //
+ // NOTE: This is the only way to get a \small or \tiny inserted before the
+ // first note in LilyPond export. Setting the actual staff size on a
+ // per-staff (rather than per-score) basis is something the author of the
+ // LilyPond documentation has no idea how to do, so we settle for this,
+ // which is not as nice, but actually a lot easier to implement.
+ m_staffGrpLbl = new QLabel(i18n("Notation size:"), m_staffGroup);
+ groupLayout->addWidget(m_staffGrpLbl, row, 0, AlignLeft);
+ m_staffSizeCombo = new KComboBox(m_staffGroup);
+ m_staffSizeCombo->setMinimumWidth(width11);
+ m_staffSizeCombo->insertItem(i18n("Normal"), StaffTypes::Normal);
+ m_staffSizeCombo->insertItem(i18n("Small"), StaffTypes::Small);
+ m_staffSizeCombo->insertItem(i18n("Tiny"), StaffTypes::Tiny);
+
+ groupLayout->addMultiCellWidget(m_staffSizeCombo, row, row, 1, 2);
+
+ // Staff bracketing (export only at the moment, but using this for GUI
+ // rendering would be nice in the future!) //!!!
+ row++;
+ m_grandStaffLbl = new QLabel(i18n("Bracket type:"), m_staffGroup);
+ groupLayout->addWidget(m_grandStaffLbl, row, 0, AlignLeft);
+ m_staffBracketCombo = new KComboBox(m_staffGroup);
+ m_staffBracketCombo->setMinimumWidth(width11);
+ m_staffBracketCombo->insertItem(i18n("-----"), Brackets::None);
+ m_staffBracketCombo->insertItem(i18n("[----"), Brackets::SquareOn);
+ m_staffBracketCombo->insertItem(i18n("----]"), Brackets::SquareOff);
+ m_staffBracketCombo->insertItem(i18n("[---]"), Brackets::SquareOnOff);
+ m_staffBracketCombo->insertItem(i18n("{----"), Brackets::CurlyOn);
+ m_staffBracketCombo->insertItem(i18n("----}"), Brackets::CurlyOff);
+ m_staffBracketCombo->insertItem(i18n("{[---"), Brackets::CurlySquareOn);
+ m_staffBracketCombo->insertItem(i18n("---]}"), Brackets::CurlySquareOff);
+
+ groupLayout->addMultiCellWidget(m_staffBracketCombo, row, row, 1, 2);
+
+ mainLayout->addWidget(cframe, 3, 0);
+
+
+ // default segment group
+ //
+ cframe = new CollapsingFrame(i18n("Create segments with"), this,
+ "trackparametersdefaults");
+ m_defaultsGroup = new QFrame(cframe);
+ cframe->setWidget(m_defaultsGroup);
+ groupLayout = new QGridLayout(m_defaultsGroup, 6, 6, 3, 2);
+
+ groupLayout->setColStretch(1, 1);
+
+ row = 0;
+
+ // preset picker
+ m_psetLbl = new QLabel(i18n("Preset"), m_defaultsGroup);
+ groupLayout->addWidget(m_psetLbl, row, 0, AlignLeft);
+
+ m_presetLbl = new QLabel(i18n("<none>"), m_defaultsGroup);
+ m_presetLbl->setFrameStyle(QFrame::Panel | QFrame::Sunken);
+ m_presetLbl->setFixedWidth(width20);
+ groupLayout->addMultiCellWidget(m_presetLbl, row, row, 1, 3);
+
+ m_presetButton = new QPushButton(i18n("Load"), m_defaultsGroup);
+ groupLayout->addMultiCellWidget(m_presetButton, row, row, 4, 5);
+
+ // default clef
+ //
+ row++;
+ m_clefLbl = new QLabel(i18n("Clef"), m_defaultsGroup);
+ groupLayout->addWidget(m_clefLbl, row, 0, AlignLeft);
+ m_defClef = new KComboBox(m_defaultsGroup);
+ m_defClef->setMinimumWidth(width11);
+ m_defClef->insertItem(i18n("treble"), TrebleClef);
+ m_defClef->insertItem(i18n("bass"), BassClef);
+ m_defClef->insertItem(i18n("crotales"), CrotalesClef);
+ m_defClef->insertItem(i18n("xylophone"), XylophoneClef);
+ m_defClef->insertItem(i18n("guitar"), GuitarClef);
+ m_defClef->insertItem(i18n("contrabass"), ContrabassClef);
+ m_defClef->insertItem(i18n("celesta"), CelestaClef);
+ m_defClef->insertItem(i18n("old celesta"), OldCelestaClef);
+ m_defClef->insertItem(i18n("french"), FrenchClef);
+ m_defClef->insertItem(i18n("soprano"), SopranoClef);
+ m_defClef->insertItem(i18n("mezzosoprano"), MezzosopranoClef);
+ m_defClef->insertItem(i18n("alto"), AltoClef);
+ m_defClef->insertItem(i18n("tenor"), TenorClef);
+ m_defClef->insertItem(i18n("baritone"), BaritoneClef);
+ m_defClef->insertItem(i18n("varbaritone"), VarbaritoneClef);
+ m_defClef->insertItem(i18n("subbass"), SubbassClef);
+ /* clef types in the datbase that are not yet supported must be ignored for
+ * now:
+ m_defClef->insertItem(i18n("two bar"), TwoBarClef); */
+ groupLayout->addMultiCellWidget(m_defClef, row, row, 1, 2);
+
+ // default transpose
+ //
+ m_transpLbl = new QLabel(i18n("Transpose"), m_defaultsGroup);
+ groupLayout->addMultiCellWidget(m_transpLbl, row, row, 3, 4, AlignRight);
+ m_defTranspose = new KComboBox(m_defaultsGroup);
+
+ connect(m_defTranspose, SIGNAL(activated(int)),
+ SLOT(slotTransposeIndexChanged(int)));
+
+ int transposeRange = 48;
+ for (int i = -transposeRange; i < transposeRange + 1; i++) {
+ m_defTranspose->insertItem(QString("%1").arg(i));
+ if (i == 0)
+ m_defTranspose->setCurrentItem(m_defTranspose->count() - 1);
+ }
+
+ groupLayout->addMultiCellWidget(m_defTranspose, row, row, 5, 5);
+
+ // highest/lowest playable note
+ //
+ row++;
+ m_rangeLbl = new QLabel(i18n("Pitch"), m_defaultsGroup);
+ groupLayout->addMultiCellWidget(m_rangeLbl, row, row, 0, 0);
+
+ groupLayout->addWidget(new QLabel(i18n("Lowest"), m_defaultsGroup), row, 1, AlignRight);
+
+ m_lowButton = new QPushButton(i18n("---"), m_defaultsGroup);
+ QToolTip::add
+ (m_lowButton, i18n("Choose the lowest suggested playable note, using a staff"));
+ groupLayout->addMultiCellWidget(m_lowButton, row, row, 2, 2);
+
+ groupLayout->addWidget(new QLabel(i18n("Highest"), m_defaultsGroup), row, 3, AlignRight);
+
+ m_highButton = new QPushButton(i18n("---"), m_defaultsGroup);
+ QToolTip::add
+ (m_highButton, i18n("Choose the highest suggested playable note, using a staff"));
+ groupLayout->addMultiCellWidget(m_highButton, row, row, 4, 5);
+
+ updateHighLow();
+
+ // default color
+ //
+ row++;
+ m_colorLbl = new QLabel(i18n("Color"), m_defaultsGroup);
+ groupLayout->addWidget(m_colorLbl, row, 0, AlignLeft);
+ m_defColor = new KComboBox(false, m_defaultsGroup);
+ m_defColor->setSizeLimit(20);
+ groupLayout->addMultiCellWidget(m_defColor, row, row, 1, 5);
+
+ // populate combo from doc colors
+ slotDocColoursChanged();
+
+ mainLayout->addWidget(cframe, 4, 0);
+
+
+ // Configure the empty final row to accomodate any extra vertical space.
+ //
+// mainLayout->setColStretch(mainLayout->numCols() - 1, 1);
+ mainLayout->setRowStretch(mainLayout->numRows() - 1, 1);
+
+ // Connections
+ connect( m_playDevice, SIGNAL(activated(int)),
+ this, SLOT(slotPlaybackDeviceChanged(int)));
+
+ connect( m_instrument, SIGNAL(activated(int)),
+ this, SLOT(slotInstrumentChanged(int)));
+
+ connect( m_recDevice, SIGNAL(activated(int)),
+ this, SLOT(slotRecordingDeviceChanged(int)));
+
+ connect( m_recChannel, SIGNAL(activated(int)),
+ this, SLOT(slotRecordingChannelChanged(int)));
+
+ connect( m_defClef, SIGNAL(activated(int)),
+ this, SLOT(slotClefChanged(int)));
+
+ // Detect when the document colours are updated
+ connect(m_doc, SIGNAL(docColoursChanged()),
+ this, SLOT(slotDocColoursChanged()));
+
+ // handle colour combo changes
+ connect(m_defColor, SIGNAL(activated(int)),
+ SLOT(slotColorChanged(int)));
+
+ connect(m_highButton, SIGNAL(released()),
+ SLOT(slotHighestPressed()));
+
+ connect(m_lowButton, SIGNAL(released()),
+ SLOT(slotLowestPressed()));
+
+ connect(m_presetButton, SIGNAL(released()),
+ SLOT(slotPresetPressed()));
+
+ connect(m_staffSizeCombo, SIGNAL(activated(int)),
+ this, SLOT(slotStaffSizeChanged(int)));
+
+ connect(m_staffBracketCombo, SIGNAL(activated(int)),
+ this, SLOT(slotStaffBracketChanged(int)));
+}
+
+TrackParameterBox::~TrackParameterBox()
+{}
+
+void
+
+TrackParameterBox::setDocument( RosegardenGUIDoc *doc )
+{
+ if (m_doc != doc) {
+ RG_DEBUG << "TrackParameterBox::setDocument\n";
+ m_doc = doc;
+ populateDeviceLists();
+ }
+}
+
+void
+TrackParameterBox::populateDeviceLists()
+{
+ RG_DEBUG << "TrackParameterBox::populateDeviceLists()\n";
+ populatePlaybackDeviceList();
+ //populateRecordingDeviceList();
+ slotUpdateControls( -1);
+ m_lastInstrumentType = -1;
+}
+
+void
+TrackParameterBox::populatePlaybackDeviceList()
+{
+ RG_DEBUG << "TrackParameterBox::populatePlaybackDeviceList()\n";
+ m_playDevice->clear();
+ m_playDeviceIds.clear();
+ m_instrument->clear();
+ m_instrumentIds.clear();
+ m_instrumentNames.clear();
+
+ Studio &studio = m_doc->getStudio();
+
+ // Get the list
+ InstrumentList list = studio.getPresentationInstruments();
+ InstrumentList::iterator it;
+ int currentDevId = -1;
+
+ for (it = list.begin(); it != list.end(); it++) {
+
+ if (! (*it))
+ continue; // sanity check
+
+ //QString iname(strtoqstr((*it)->getPresentationName()));
+ QString iname(strtoqstr((*it)->getName()));
+ QString pname(strtoqstr((*it)->getProgramName()));
+ Device *device = (*it)->getDevice();
+ DeviceId devId = device->getId();
+
+ if ((*it)->getType() == Instrument::SoftSynth) {
+ iname.replace("Synth plugin ", "");
+ pname = "";
+ AudioPluginInstance *plugin = (*it)->getPlugin
+ (Instrument::SYNTH_PLUGIN_POSITION);
+ if (plugin) {
+ pname = strtoqstr(plugin->getProgram());
+ QString identifier = strtoqstr(plugin->getIdentifier());
+ if (identifier != "") {
+ QString type, soName, label;
+ PluginIdentifier::parseIdentifier
+ (identifier, type, soName, label);
+ if (pname == "") {
+ pname = strtoqstr(plugin->getDistinctiveConfigurationText());
+ }
+ if (pname != "") {
+ pname = QString("%1: %2").arg(label).arg(pname);
+ } else {
+ pname = label;
+ }
+ }
+ }
+ }
+
+ if (devId != (DeviceId)(currentDevId)) {
+ currentDevId = int(devId);
+ QString deviceName = strtoqstr(device->getName());
+ m_playDevice->insertItem(deviceName);
+ m_playDeviceIds.push_back(currentDevId);
+ }
+
+ if (pname != "")
+ iname += " (" + pname + ")";
+ m_instrumentIds[currentDevId].push_back((*it)->getId());
+ m_instrumentNames[currentDevId].append(iname);
+
+ }
+
+ m_playDevice->setCurrentItem( -1);
+ m_instrument->setCurrentItem( -1);
+}
+
+void
+TrackParameterBox::populateRecordingDeviceList()
+{
+ RG_DEBUG << "TrackParameterBox::populateRecordingDeviceList()\n";
+
+ if (m_selectedTrackId < 0)
+ return ;
+ Composition &comp = m_doc->getComposition();
+ Track *trk = comp.getTrackById(m_selectedTrackId);
+ if (!trk)
+ return ;
+
+ Instrument *inst = m_doc->getStudio().getInstrumentById(trk->getInstrument());
+ if (!inst)
+ return ;
+
+ if (m_lastInstrumentType != (char)inst->getInstrumentType()) {
+ m_lastInstrumentType = (char)inst->getInstrumentType();
+
+ m_recDevice->clear();
+ m_recDeviceIds.clear();
+ m_recChannel->clear();
+
+ if (inst->getInstrumentType() == Instrument::Audio) {
+
+ m_recDeviceIds.push_back(Device::NO_DEVICE);
+ m_recDevice->insertItem(i18n("Audio"));
+ m_recChannel->insertItem(i18n("Audio"));
+
+ m_recDevice->setEnabled(false);
+ m_recChannel->setEnabled(false);
+
+ // hide these for audio instruments
+ m_defaultsGroup->parentWidget()->setShown(false);
+
+ } else { // InstrumentType::Midi and InstrumentType::SoftSynth
+
+ // show these if not audio instrument
+ m_defaultsGroup->parentWidget()->setShown(true);
+
+ m_recDeviceIds.push_back(Device::ALL_DEVICES);
+ m_recDevice->insertItem(i18n("All"));
+
+ DeviceList *devices = m_doc->getStudio().getDevices();
+ DeviceListConstIterator it;
+ for (it = devices->begin(); it != devices->end(); it++) {
+ MidiDevice *dev =
+ dynamic_cast<MidiDevice*>(*it);
+ if (dev) {
+ if (dev->getDirection() == MidiDevice::Record
+ && dev->isRecording()) {
+ QString connection = strtoqstr(dev->getConnection());
+ // remove trailing "(duplex)", "(read only)", "(write only)" etc
+ connection.replace(QRegExp("\\s*\\([^)0-9]+\\)\\s*$"), "");
+ m_recDevice->insertItem(connection);
+ m_recDeviceIds.push_back(dev->getId());
+ }
+ }
+ }
+
+ m_recChannel->insertItem(i18n("All"));
+ for (int i = 1; i < 17; ++i) {
+ m_recChannel->insertItem(QString::number(i));
+ }
+
+ m_recDevice->setEnabled(true);
+ m_recChannel->setEnabled(true);
+ }
+ }
+
+ if (inst->getInstrumentType() == Instrument::Audio) {
+ m_recDevice->setCurrentItem(0);
+ m_recChannel->setCurrentItem(0);
+ } else {
+ m_recDevice->setCurrentItem(0);
+ m_recChannel->setCurrentItem((int)trk->getMidiInputChannel() + 1);
+ for (unsigned int i = 0; i < m_recDeviceIds.size(); ++i) {
+ if (m_recDeviceIds[i] == trk->getMidiInputDevice()) {
+ m_recDevice->setCurrentItem(i);
+ break;
+ }
+ }
+ }
+}
+
+void
+TrackParameterBox::updateHighLow()
+{
+ Composition &comp = m_doc->getComposition();
+ Track *trk = comp.getTrackById(comp.getSelectedTrack());
+ if (!trk)
+ return ;
+
+ trk->setHighestPlayable(m_highestPlayable);
+ trk->setLowestPlayable(m_lowestPlayable);
+
+ Accidental accidental = Accidentals::NoAccidental;
+
+ Pitch highest(m_highestPlayable, accidental);
+ Pitch lowest(m_lowestPlayable, accidental);
+
+ KConfig *config = kapp->config();
+ config->setGroup(GeneralOptionsConfigGroup);
+ int base = config->readNumEntry("midipitchoctave", -2);
+ bool useSharps = true;
+ bool includeOctave = true;
+
+// m_highButton->setText(i18n("High: %1").arg(highest.getAsString(useSharps, includeOctave, base)));
+// m_lowButton->setText(i18n("Low: %1").arg(lowest.getAsString(useSharps, includeOctave, base)));
+ m_highButton->setText(QString("%1").arg(highest.getAsString(useSharps, includeOctave, base)));
+ m_lowButton->setText(QString("%1").arg(lowest.getAsString(useSharps, includeOctave, base)));
+
+ m_presetLbl->setEnabled(false);
+}
+
+void
+TrackParameterBox::slotUpdateControls(int /*dummy*/)
+{
+ RG_DEBUG << "TrackParameterBox::slotUpdateControls()\n";
+ slotPlaybackDeviceChanged( -1);
+ slotInstrumentChanged( -1);
+
+ if (m_selectedTrackId < 0)
+ return ;
+ Composition &comp = m_doc->getComposition();
+ Track *trk = comp.getTrackById(m_selectedTrackId);
+ if (!trk)
+ return ;
+
+ m_defClef->setCurrentItem(trk->getClef());
+ m_defTranspose->setCurrentItem(QString("%1").arg(trk->getTranspose()), true);
+ m_defColor->setCurrentItem(trk->getColor());
+ m_highestPlayable = trk->getHighestPlayable();
+ m_lowestPlayable = trk->getLowestPlayable();
+ updateHighLow();
+ // set this down here because updateHighLow just disabled the label
+ m_presetLbl->setText(trk->getPresetLabel());
+ m_presetLbl->setEnabled(true);
+
+ m_staffSizeCombo->setCurrentItem(trk->getStaffSize());
+ m_staffBracketCombo->setCurrentItem(trk->getStaffBracket());
+}
+
+void
+TrackParameterBox::slotSelectedTrackChanged()
+{
+ RG_DEBUG << "TrackParameterBox::slotSelectedTrackChanged()\n";
+ Composition &comp = m_doc->getComposition();
+ TrackId newTrack = comp.getSelectedTrack();
+ if ( newTrack != m_selectedTrackId ) {
+ m_presetLbl->setEnabled(true);
+ m_selectedTrackId = newTrack;
+ slotSelectedTrackNameChanged();
+ slotUpdateControls( -1);
+ }
+}
+
+void
+TrackParameterBox::slotSelectedTrackNameChanged()
+{
+ RG_DEBUG << "TrackParameterBox::sotSelectedTrackNameChanged()\n";
+ Composition &comp = m_doc->getComposition();
+ Track *trk = comp.getTrackById(m_selectedTrackId);
+ QString m_trackName = trk->getLabel();
+ if (m_trackName.isEmpty())
+ m_trackName = i18n("<untitled>");
+ else
+ m_trackName.truncate(20);
+ int trackNum = trk->getPosition() + 1;
+ m_trackLabel->setText(i18n("[ Track %1 - %2 ]").arg(trackNum).arg(m_trackName));
+}
+
+void
+TrackParameterBox::slotPlaybackDeviceChanged(int index)
+{
+ RG_DEBUG << "TrackParameterBox::slotPlaybackDeviceChanged(" << index << ")\n";
+ DeviceId devId;
+ if (index == -1) {
+ if (m_selectedTrackId < 0)
+ return ;
+ Composition &comp = m_doc->getComposition();
+ Track *trk = comp.getTrackById(m_selectedTrackId);
+ if (!trk)
+ return ;
+ Instrument *inst = m_doc->getStudio().getInstrumentById(trk->getInstrument());
+ if (!inst)
+ return ;
+ devId = inst->getDevice()->getId();
+ int pos = -1;
+ IdsVector::const_iterator it;
+ for ( it = m_playDeviceIds.begin(); it != m_playDeviceIds.end(); ++it) {
+ pos++;
+ if ((*it) == devId)
+ break;
+ }
+ m_playDevice->setCurrentItem(pos);
+ } else {
+ devId = m_playDeviceIds[index];
+ }
+
+ m_instrument->clear();
+ m_instrument->insertStringList(m_instrumentNames[devId]);
+
+ populateRecordingDeviceList();
+
+ if (index != -1) {
+ m_instrument->setCurrentItem(0);
+ slotInstrumentChanged(0);
+ }
+}
+
+void
+TrackParameterBox::slotInstrumentChanged(int index)
+{
+ RG_DEBUG << "TrackParameterBox::slotInstrumentChanged(" << index << ")\n";
+ DeviceId devId;
+ Instrument *inst;
+ if (index == -1) {
+ Composition &comp = m_doc->getComposition();
+ Track *trk = comp.getTrackById(comp.getSelectedTrack());
+ if (!trk)
+ return ;
+ inst = m_doc->getStudio().getInstrumentById(trk->getInstrument());
+ if (!inst)
+ return ;
+ devId = inst->getDevice()->getId();
+
+ int pos = -1;
+ IdsVector::const_iterator it;
+ for ( it = m_instrumentIds[devId].begin(); it != m_instrumentIds[devId].end(); ++it ) {
+ pos++;
+ if ((*it) == trk->getInstrument())
+ break;
+ }
+ m_instrument->setCurrentItem(pos);
+ } else {
+ devId = m_playDeviceIds[m_playDevice->currentItem()];
+ // set the new selected instrument for the track
+ int item = 0;
+ std::map<DeviceId, IdsVector>::const_iterator it;
+ for ( it = m_instrumentIds.begin(); it != m_instrumentIds.end(); ++it) {
+ if ( (*it).first == devId )
+ break;
+ item += (*it).second.size();
+ }
+ item += index;
+ RG_DEBUG << "TrackParameterBox::slotInstrumentChanged() item = " << item << "\n";
+ emit instrumentSelected( m_selectedTrackId, item );
+ }
+}
+
+void
+TrackParameterBox::slotRecordingDeviceChanged(int index)
+{
+ RG_DEBUG << "TrackParameterBox::slotRecordingDeviceChanged(" << index << ")" << endl;
+ Composition &comp = m_doc->getComposition();
+ Track *trk = comp.getTrackById(comp.getSelectedTrack());
+ if (!trk)
+ return ;
+ Instrument *inst = m_doc->getStudio().getInstrumentById(trk->getInstrument());
+ if (!inst)
+ return ;
+ if (inst->getInstrumentType() == Instrument::Audio) {
+ //Not implemented yet
+ } else {
+ trk->setMidiInputDevice(m_recDeviceIds[index]);
+ }
+}
+
+void
+TrackParameterBox::slotRecordingChannelChanged(int index)
+{
+ RG_DEBUG << "TrackParameterBox::slotRecordingChannelChanged(" << index << ")" << endl;
+ Composition &comp = m_doc->getComposition();
+ Track *trk = comp.getTrackById(comp.getSelectedTrack());
+ if (!trk)
+ return ;
+ Instrument *inst = m_doc->getStudio().getInstrumentById(trk->getInstrument());
+ if (!inst)
+ return ;
+ if (inst->getInstrumentType() == Instrument::Audio) {
+ //Not implemented yet
+ } else {
+ trk->setMidiInputChannel(index - 1);
+ }
+}
+
+void
+TrackParameterBox::slotInstrumentLabelChanged(InstrumentId id, QString label)
+{
+ RG_DEBUG << "TrackParameterBox::slotInstrumentLabelChanged(" << id << ") = " << label << "\n";
+ populatePlaybackDeviceList();
+ slotUpdateControls( -1);
+}
+
+void
+TrackParameterBox::showAdditionalControls(bool showThem)
+{
+ // m_defaultsGroup->parentWidget()->setShown(showThem);
+}
+
+void
+TrackParameterBox::slotClefChanged(int clef)
+{
+ RG_DEBUG << "TrackParameterBox::slotClefChanged(" << clef << ")" << endl;
+ Composition &comp = m_doc->getComposition();
+ Track *trk = comp.getTrackById(comp.getSelectedTrack());
+ trk->setClef(clef);
+ m_presetLbl->setEnabled(false);
+}
+
+void
+TrackParameterBox::slotTransposeChanged(int transpose)
+{
+ RG_DEBUG << "TrackParameterBox::slotTransposeChanged(" << transpose << ")" << endl;
+ Composition &comp = m_doc->getComposition();
+ Track *trk = comp.getTrackById(comp.getSelectedTrack());
+ trk->setTranspose(transpose);
+ m_presetLbl->setEnabled(false);
+}
+
+void
+TrackParameterBox::slotTransposeIndexChanged(int index)
+{
+ slotTransposeTextChanged(m_defTranspose->text(index));
+}
+
+void
+TrackParameterBox::slotTransposeTextChanged(QString text)
+{
+ if (text.isEmpty())
+ return ;
+ int value = text.toInt();
+ slotTransposeChanged(value);
+}
+
+void
+TrackParameterBox::slotDocColoursChanged()
+{
+ RG_DEBUG << "TrackParameterBox::slotDocColoursChanged()" << endl;
+
+ m_defColor->clear();
+ m_colourList.clear();
+ // Populate it from composition.m_segmentColourMap
+ ColourMap temp = m_doc->getComposition().getSegmentColourMap();
+
+ unsigned int i = 0;
+
+ for (RCMap::const_iterator it = temp.begin(); it != temp.end(); ++it) {
+ QString qtrunc(strtoqstr(it->second.second));
+ QPixmap colour(15, 15);
+ colour.fill(GUIPalette::convertColour(it->second.first));
+ if (qtrunc == "") {
+ m_defColor->insertItem(colour, i18n("Default"), i);
+ } else {
+ // truncate name to 15 characters to avoid the combo forcing the
+ // whole kit and kaboodle too wide
+ if (qtrunc.length() > 15)
+ qtrunc = qtrunc.left(12) + "...";
+ m_defColor->insertItem(colour, qtrunc, i);
+ }
+ m_colourList[it->first] = i; // maps colour number to menu index
+ ++i;
+ }
+
+ m_addColourPos = i;
+ m_defColor->insertItem(i18n("Add New Color"), m_addColourPos);
+
+ m_defColor->setCurrentItem(0);
+}
+
+void
+TrackParameterBox::slotColorChanged(int index)
+{
+ RG_DEBUG << "TrackParameterBox::slotColorChanged(" << index << ")" << endl;
+
+ Composition &comp = m_doc->getComposition();
+ Track *trk = comp.getTrackById(comp.getSelectedTrack());
+
+ trk->setColor(index);
+
+ if (index == m_addColourPos) {
+ ColourMap newMap = m_doc->getComposition().getSegmentColourMap();
+ QColor newColour;
+ bool ok = false;
+ QString newName = KLineEditDlg::getText(i18n("New Color Name"), i18n("Enter new name"),
+ i18n("New"), &ok);
+ if ((ok == true) && (!newName.isEmpty())) {
+ KColorDialog box(this, "", true);
+
+ int result = box.getColor(newColour);
+
+ if (result == KColorDialog::Accepted) {
+ Colour newRColour = GUIPalette::convertColour(newColour);
+ newMap.addItem(newRColour, qstrtostr(newName));
+ slotDocColoursChanged();
+ }
+ }
+ // Else we don't do anything as they either didn't give a name�
+ // or didn't give a colour
+ }
+}
+
+void
+TrackParameterBox::slotHighestPressed()
+{
+ RG_DEBUG << "TrackParameterBox::slotHighestPressed()" << endl;
+
+ Composition &comp = m_doc->getComposition();
+ Track *trk = comp.getTrackById(comp.getSelectedTrack());
+ if (!trk)
+ return ;
+
+ PitchPickerDialog dialog(0, m_highestPlayable, i18n("Highest playable note"));
+
+ if (dialog.exec() == QDialog::Accepted) {
+ m_highestPlayable = dialog.getPitch();
+ updateHighLow();
+ }
+
+ m_presetLbl->setEnabled(false);
+}
+
+void
+TrackParameterBox::slotLowestPressed()
+{
+ RG_DEBUG << "TrackParameterBox::slotLowestPressed()" << endl;
+
+ Composition &comp = m_doc->getComposition();
+ Track *trk = comp.getTrackById(comp.getSelectedTrack());
+ if (!trk)
+ return ;
+
+ PitchPickerDialog dialog(0, m_lowestPlayable, i18n("Lowest playable note"));
+
+ if (dialog.exec() == QDialog::Accepted) {
+ m_lowestPlayable = dialog.getPitch();
+ updateHighLow();
+ }
+
+ m_presetLbl->setEnabled(false);
+}
+
+void
+TrackParameterBox::slotPresetPressed()
+{
+ RG_DEBUG << "TrackParameterBox::slotPresetPressed()" << endl;
+
+ Composition &comp = m_doc->getComposition();
+ Track *trk = comp.getTrackById(comp.getSelectedTrack());
+ if (!trk)
+ return ;
+
+ PresetHandlerDialog dialog(this);
+
+ try {
+ if (dialog.exec() == QDialog::Accepted) {
+ m_presetLbl->setText(dialog.getName());
+ trk->setPresetLabel(dialog.getName());
+ if (dialog.getConvertAllSegments()) {
+ SegmentSyncCommand* command = new SegmentSyncCommand(
+ comp.getSegments(), comp.getSelectedTrack(),
+ dialog.getTranspose(), dialog.getLowRange(),
+ dialog.getHighRange(),
+ clefIndexToClef(dialog.getClef()));
+ m_doc->getCommandHistory()->addCommand(command);
+ }
+ m_defClef->setCurrentItem(dialog.getClef());
+ m_defTranspose->setCurrentItem(QString("%1").arg
+ (dialog.getTranspose()), true);
+
+ m_highestPlayable = dialog.getHighRange();
+ m_lowestPlayable = dialog.getLowRange();
+ updateHighLow();
+ slotClefChanged(dialog.getClef());
+ slotTransposeChanged(dialog.getTranspose());
+
+ // the preceding slots will have set this disabled, so we
+ // re-enable it until it is subsequently re-disabled by the
+ // user overriding the preset, calling one of the above slots
+ // in the normal course
+ m_presetLbl->setEnabled(true);
+ }
+ } catch (Exception e) {
+ //!!! This should be a more verbose error to pass along the
+ // row/column of the corruption, but I can't be bothered to work
+ // that out just at the moment. Hopefully this code will never
+ // execute anyway.
+ KMessageBox::sorry(0, i18n("The instrument preset database is corrupt. Check your installation."));
+ }
+
+}
+
+void
+TrackParameterBox::slotStaffSizeChanged(int index)
+{
+ RG_DEBUG << "TrackParameterBox::sotStaffSizeChanged()" << endl;
+ Composition &comp = m_doc->getComposition();
+ Track *trk = comp.getTrackById(m_selectedTrackId);
+
+ trk->setStaffSize(index);
+}
+
+
+void
+TrackParameterBox::slotStaffBracketChanged(int index)
+{
+ RG_DEBUG << "TrackParameterBox::sotStaffBracketChanged()" << endl;
+ Composition &comp = m_doc->getComposition();
+ Track *trk = comp.getTrackById(m_selectedTrackId);
+
+ trk->setStaffBracket(index);
+}
+
+QString
+TrackParameterBox::getPreviousBox(RosegardenParameterArea::Arrangement arrangement) const
+{
+ if (arrangement == RosegardenParameterArea::CLASSIC_STYLE) {
+ return i18n("Segment");
+ } else {
+ return "";
+ }
+}
+
+}
+#include "TrackParameterBox.moc"
diff --git a/src/gui/editors/parameters/TrackParameterBox.h b/src/gui/editors/parameters/TrackParameterBox.h
new file mode 100644
index 0000000..c5fa0f9
--- /dev/null
+++ b/src/gui/editors/parameters/TrackParameterBox.h
@@ -0,0 +1,161 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ This file is Copyright 2006
+ Pedro Lopez-Cabanillas <[email protected]>
+ D. Michael McIntyre <[email protected]>
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_TRACKPARAMETERBOX_H_
+#define _RG_TRACKPARAMETERBOX_H_
+
+#include "base/MidiProgram.h"
+#include "base/Track.h"
+#include "gui/widgets/ColourTable.h"
+#include <map>
+#include "RosegardenParameterArea.h"
+#include "RosegardenParameterBox.h"
+#include <qstring.h>
+#include <qcheckbox.h> // #include <QCheckBox> in QT4, thinking ahead
+#include <vector>
+
+
+class QWidget;
+class QPushButton;
+class QLabel;
+class QFrame;
+class KComboBox;
+class QCheckBox;
+
+
+namespace Rosegarden
+{
+
+class RosegardenGUIDoc;
+
+
+class TrackParameterBox : public RosegardenParameterBox
+{
+Q_OBJECT
+
+public:
+ TrackParameterBox( RosegardenGUIDoc *doc,
+ QWidget *parent=0);
+ ~TrackParameterBox();
+
+ void setDocument( RosegardenGUIDoc *doc );
+ void populateDeviceLists();
+ virtual void showAdditionalControls(bool showThem);
+
+ virtual QString getPreviousBox(RosegardenParameterArea::Arrangement) const;
+
+public slots:
+ void slotSelectedTrackChanged();
+ void slotSelectedTrackNameChanged();
+ void slotPlaybackDeviceChanged(int index);
+ void slotInstrumentChanged(int index);
+ void slotRecordingDeviceChanged(int index);
+ void slotRecordingChannelChanged(int index);
+ void slotUpdateControls(int);
+ void slotInstrumentLabelChanged(InstrumentId id, QString label);
+
+ void slotClefChanged(int clef);
+ void slotTransposeChanged(int transpose);
+ void slotTransposeIndexChanged(int index);
+ void slotTransposeTextChanged(QString text);
+ void slotDocColoursChanged();
+ void slotColorChanged(int index);
+ void slotHighestPressed();
+ void slotLowestPressed();
+ void slotPresetPressed();
+
+ void slotStaffSizeChanged(int index);
+ void slotStaffBracketChanged(int index);
+
+signals:
+ void instrumentSelected(TrackId, int);
+
+protected:
+ void populatePlaybackDeviceList();
+ void populateRecordingDeviceList();
+ void updateHighLow();
+
+private:
+ RosegardenGUIDoc *m_doc;
+
+ KComboBox *m_playDevice;
+ KComboBox *m_instrument;
+ KComboBox *m_recDevice;
+ KComboBox *m_recChannel;
+
+ QPushButton *m_presetButton;
+ QPushButton *m_highButton;
+ QPushButton *m_lowButton;
+
+ KComboBox *m_defClef;
+ KComboBox *m_defColor;
+ KComboBox *m_defTranspose;
+ KComboBox *m_staffSizeCombo;
+ KComboBox *m_staffBracketCombo;
+
+
+ int m_addColourPos;
+ int m_highestPlayable;
+ int m_lowestPlayable;
+ ColourTable::ColourList m_colourList;
+
+ QLabel *m_trackLabel;
+
+ typedef std::vector<DeviceId> IdsVector;
+
+ IdsVector m_playDeviceIds;
+ IdsVector m_recDeviceIds;
+
+ std::map<DeviceId, IdsVector> m_instrumentIds;
+ std::map<DeviceId, QStringList> m_instrumentNames;
+
+ int m_selectedTrackId;
+
+ char m_lastInstrumentType;
+
+ // Additional elements that may be hidden in vertical stacked mode
+ //QFrame *m_separator2;
+ QFrame *m_playbackGroup;
+ QFrame *m_recordGroup;
+ QFrame *m_defaultsGroup;
+ QFrame *m_staffGroup;
+ QLabel *m_segHeader;
+ QLabel *m_presetLbl;
+ QLabel *m_staffGrpLbl;
+ QLabel *m_grandStaffLbl;
+ QLabel *m_clefLbl;
+ QLabel *m_transpLbl;
+ QLabel *m_colorLbl;
+ QLabel *m_rangeLbl;
+ QLabel *m_psetLbl;
+};
+
+
+}
+
+#endif
diff --git a/src/gui/editors/segment/ControlEditorDialog.cpp b/src/gui/editors/segment/ControlEditorDialog.cpp
new file mode 100644
index 0000000..3c4cc47
--- /dev/null
+++ b/src/gui/editors/segment/ControlEditorDialog.cpp
@@ -0,0 +1,446 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "ControlEditorDialog.h"
+#include <qlayout.h>
+#include <kapplication.h>
+
+#include <klocale.h>
+#include "misc/Debug.h"
+#include "misc/Strings.h"
+#include "base/Colour.h"
+#include "base/Composition.h"
+#include "base/ControlParameter.h"
+#include "base/Device.h"
+#include "base/Event.h"
+#include "base/MidiDevice.h"
+#include "base/MidiTypes.h"
+#include "base/Studio.h"
+#include "commands/studio/AddControlParameterCommand.h"
+#include "commands/studio/ModifyControlParameterCommand.h"
+#include "commands/studio/RemoveControlParameterCommand.h"
+#include "ControlParameterEditDialog.h"
+#include "ControlParameterItem.h"
+#include "document/MultiViewCommandHistory.h"
+#include "document/RosegardenGUIDoc.h"
+#include "document/ConfigGroups.h"
+#include <kaction.h>
+#include <kcommand.h>
+#include <klistview.h>
+#include <kmainwindow.h>
+#include <kstdaccel.h>
+#include <kstdaction.h>
+#include <qcolor.h>
+#include <qdialog.h>
+#include <qframe.h>
+#include <qlabel.h>
+#include <qlistview.h>
+#include <qpixmap.h>
+#include <qptrlist.h>
+#include <qpushbutton.h>
+#include <qsizepolicy.h>
+#include <qstring.h>
+#include <qtooltip.h>
+#include <qvbox.h>
+#include <qwidget.h>
+
+
+namespace Rosegarden
+{
+
+const QString notShowing(i18n("<not showing>"));
+
+ControlEditorDialog::ControlEditorDialog(QWidget *parent,
+ RosegardenGUIDoc *doc,
+ DeviceId device):
+ KMainWindow(parent, "controleditordialog"),
+ m_studio(&doc->getStudio()),
+ m_doc(doc),
+ m_device(device),
+ m_modified(false)
+{
+ RG_DEBUG << "ControlEditorDialog::ControlEditorDialog: device is " << m_device << endl;
+
+ QVBox* mainFrame = new QVBox(this);
+ setCentralWidget(mainFrame);
+
+ setCaption(i18n("Manage Control Events"));
+
+ QString deviceName(i18n("<no device>"));
+ MidiDevice *md =
+ dynamic_cast<MidiDevice *>(m_studio->getDevice(m_device));
+ if (md)
+ deviceName = strtoqstr(md->getName());
+
+ // spacing hack!
+ new QLabel("", mainFrame);
+ new QLabel(i18n(" Control Events for %1 (device %2)").arg(deviceName).
+ arg(device), mainFrame);
+ new QLabel("", mainFrame);
+
+ m_listView = new KListView(mainFrame);
+ m_listView->addColumn(i18n("Control Event name "));
+ m_listView->addColumn(i18n("Control Event type "));
+ m_listView->addColumn(i18n("Control Event value "));
+ m_listView->addColumn(i18n("Description "));
+ m_listView->addColumn(i18n("Min "));
+ m_listView->addColumn(i18n("Max "));
+ m_listView->addColumn(i18n("Default "));
+ m_listView->addColumn(i18n("Color "));
+ m_listView->addColumn(i18n("Position on instrument panel"));
+
+ m_listView->setColumnAlignment(0, Qt::AlignLeft);
+
+ // Align remaining columns centrally
+ for (int i = 1; i < 9; ++i)
+ m_listView->setColumnAlignment(i, Qt::AlignHCenter);
+
+ m_listView->restoreLayout(kapp->config(), ControlEditorConfigGroup);
+
+ QFrame* btnBox = new QFrame(mainFrame);
+
+ btnBox->setSizePolicy(
+ QSizePolicy(QSizePolicy::Minimum, QSizePolicy::Fixed));
+
+ QHBoxLayout* layout = new QHBoxLayout(btnBox, 4, 10);
+
+ m_addButton = new QPushButton(i18n("Add"), btnBox);
+ m_deleteButton = new QPushButton(i18n("Delete"), btnBox);
+
+ m_closeButton = new QPushButton(i18n("Close"), btnBox);
+
+ QToolTip::add
+ (m_addButton,
+ i18n("Add a Control Parameter to the Studio"));
+
+ QToolTip::add
+ (m_deleteButton,
+ i18n("Delete a Control Parameter from the Studio"));
+
+ QToolTip::add
+ (m_closeButton,
+ i18n("Close the Control Parameter editor"));
+
+ layout->addStretch(10);
+ layout->addWidget(m_addButton);
+ layout->addWidget(m_deleteButton);
+ layout->addSpacing(30);
+
+ layout->addWidget(m_closeButton);
+ layout->addSpacing(5);
+
+ connect(m_addButton, SIGNAL(released()),
+ SLOT(slotAdd()));
+
+ connect(m_deleteButton, SIGNAL(released()),
+ SLOT(slotDelete()));
+
+ setupActions();
+
+ m_doc->getCommandHistory()->attachView(actionCollection());
+ connect(m_doc->getCommandHistory(), SIGNAL(commandExecuted()),
+ this, SLOT(slotUpdate()));
+
+ connect(m_listView, SIGNAL(doubleClicked(QListViewItem *)),
+ SLOT(slotEdit(QListViewItem *)));
+
+ // Highlight all columns - enable extended selection mode
+ //
+ m_listView->setAllColumnsShowFocus(true);
+ m_listView->setSelectionMode(QListView::Extended);
+
+ initDialog();
+
+ setAutoSaveSettings(ControlEditorConfigGroup, true);
+}
+
+ControlEditorDialog::~ControlEditorDialog()
+{
+ RG_DEBUG << "\n*** ControlEditorDialog::~ControlEditorDialog\n" << endl;
+
+ m_listView->saveLayout(kapp->config(), ControlEditorConfigGroup);
+
+ if (m_doc)
+ m_doc->getCommandHistory()->detachView(actionCollection());
+}
+
+void
+ControlEditorDialog::initDialog()
+{
+ RG_DEBUG << "ControlEditorDialog::initDialog" << endl;
+ slotUpdate();
+}
+
+void
+ControlEditorDialog::slotUpdate()
+{
+ RG_DEBUG << "ControlEditorDialog::slotUpdate" << endl;
+
+ //QPtrList<QListViewItem> selection = m_listView->selectedItems();
+
+ MidiDevice *md =
+ dynamic_cast<MidiDevice *>(m_studio->getDevice(m_device));
+ if (!md)
+ return ;
+
+ ControlList::const_iterator it = md->beginControllers();
+ QListViewItem *item;
+ int i = 0;
+
+ m_listView->clear();
+
+ for (; it != md->endControllers(); ++it) {
+ Composition &comp = m_doc->getComposition();
+
+ QString colour =
+ strtoqstr(comp.getGeneralColourMap().getNameByIndex(it->getColourIndex()));
+
+ if (colour == "")
+ colour = i18n("<default>");
+
+ QString position = QString("%1").arg(it->getIPBPosition());
+ if (position.toInt() == -1)
+ position = notShowing;
+
+ QString value;
+ value.sprintf("%d (0x%x)", it->getControllerValue(),
+ it->getControllerValue());
+
+ if (it->getType() == PitchBend::EventType) {
+ item = new ControlParameterItem(i++,
+ m_listView,
+ strtoqstr(it->getName()),
+ strtoqstr(it->getType()),
+ QString("-"),
+ strtoqstr(it->getDescription()),
+ QString("%1").arg(it->getMin()),
+ QString("%1").arg(it->getMax()),
+ QString("%1").arg(it->getDefault()),
+ colour,
+ position);
+ } else {
+ item = new ControlParameterItem(i++,
+ m_listView,
+ strtoqstr(it->getName()),
+ strtoqstr(it->getType()),
+ value,
+ strtoqstr(it->getDescription()),
+ QString("%1").arg(it->getMin()),
+ QString("%1").arg(it->getMax()),
+ QString("%1").arg(it->getDefault()),
+ colour,
+ position);
+ }
+
+
+ // create and set a colour pixmap
+ //
+ QPixmap colourPixmap(16, 16);
+ Colour c = comp.getGeneralColourMap().getColourByIndex(it->getColourIndex());
+ colourPixmap.fill(QColor(c.getRed(), c.getGreen(), c.getBlue()));
+ item->setPixmap(7, colourPixmap);
+
+ m_listView->insertItem(item);
+ }
+
+ if (m_listView->childCount() == 0) {
+ QListViewItem *item = new QListViewItem(m_listView, i18n("<none>"));
+ m_listView->insertItem(item);
+
+ m_listView->setSelectionMode(QListView::NoSelection);
+ } else {
+ m_listView->setSelectionMode(QListView::Extended);
+ }
+
+
+}
+
+/*
+void
+ControlEditorDialog::slotEditCopy()
+{
+ RG_DEBUG << "ControlEditorDialog::slotEditCopy" << endl;
+}
+
+void
+ControlEditorDialog::slotEditPaste()
+{
+ RG_DEBUG << "ControlEditorDialog::slotEditPaste" << endl;
+}
+*/
+
+void
+ControlEditorDialog::slotAdd()
+{
+ RG_DEBUG << "ControlEditorDialog::slotAdd to device " << m_device << endl;
+
+ AddControlParameterCommand *command =
+ new AddControlParameterCommand(m_studio, m_device,
+ ControlParameter());
+
+ addCommandToHistory(command);
+}
+
+void
+ControlEditorDialog::slotDelete()
+{
+ RG_DEBUG << "ControlEditorDialog::slotDelete" << endl;
+
+ if (!m_listView->currentItem())
+ return ;
+
+ ControlParameterItem *item =
+ dynamic_cast<ControlParameterItem*>(m_listView->currentItem());
+
+ if (item) {
+ RemoveControlParameterCommand *command =
+ new RemoveControlParameterCommand(m_studio, m_device, item->getId());
+
+ addCommandToHistory(command);
+ }
+}
+
+void
+ControlEditorDialog::slotClose()
+{
+ RG_DEBUG << "ControlEditorDialog::slotClose" << endl;
+
+ if (m_doc)
+ m_doc->getCommandHistory()->detachView(actionCollection());
+ m_doc = 0;
+
+ close();
+}
+
+void
+ControlEditorDialog::setupActions()
+{
+ KAction* close = KStdAction::close(this,
+ SLOT(slotClose()),
+ actionCollection());
+
+ m_closeButton->setText(close->text());
+ connect(m_closeButton, SIGNAL(released()), this, SLOT(slotClose()));
+
+ // some adjustments
+ new KToolBarPopupAction(i18n("Und&o"),
+ "undo",
+ KStdAccel::key(KStdAccel::Undo),
+ actionCollection(),
+ KStdAction::stdName(KStdAction::Undo));
+
+ new KToolBarPopupAction(i18n("Re&do"),
+ "redo",
+ KStdAccel::key(KStdAccel::Redo),
+ actionCollection(),
+ KStdAction::stdName(KStdAction::Redo));
+
+ createGUI("controleditor.rc");
+}
+
+void
+ControlEditorDialog::addCommandToHistory(KCommand *command)
+{
+ getCommandHistory()->addCommand(command);
+ setModified(false);
+}
+
+MultiViewCommandHistory*
+ControlEditorDialog::getCommandHistory()
+{
+ return m_doc->getCommandHistory();
+}
+
+void
+ControlEditorDialog::setModified(bool modified)
+{
+ RG_DEBUG << "ControlEditorDialog::setModified(" << modified << ")" << endl;
+
+ if (modified) {}
+ else {}
+
+ m_modified = modified;
+}
+
+void
+ControlEditorDialog::checkModified()
+{
+ RG_DEBUG << "ControlEditorDialog::checkModified(" << m_modified << ")"
+ << endl;
+
+}
+
+void
+ControlEditorDialog::slotEdit()
+{}
+
+void
+ControlEditorDialog::slotEdit(QListViewItem *i)
+{
+ RG_DEBUG << "ControlEditorDialog::slotEdit" << endl;
+
+ ControlParameterItem *item =
+ dynamic_cast<ControlParameterItem*>(i);
+
+ MidiDevice *md =
+ dynamic_cast<MidiDevice *>(m_studio->getDevice(m_device));
+
+ if (item && md) {
+ ControlParameterEditDialog dialog
+ (this,
+ md->getControlParameter(item->getId()), m_doc);
+
+ if (dialog.exec() == QDialog::Accepted) {
+ ModifyControlParameterCommand *command =
+ new ModifyControlParameterCommand(m_studio,
+ m_device,
+ dialog.getControl(),
+ item->getId());
+
+ addCommandToHistory(command);
+ }
+ }
+}
+
+void
+ControlEditorDialog::closeEvent(QCloseEvent *e)
+{
+ emit closing();
+ KMainWindow::closeEvent(e);
+}
+
+void
+ControlEditorDialog::setDocument(RosegardenGUIDoc *doc)
+{
+ // reset our pointers
+ m_doc = doc;
+ m_studio = &doc->getStudio();
+ m_modified = false;
+
+ slotUpdate();
+}
+
+}
+#include "ControlEditorDialog.moc"
diff --git a/src/gui/editors/segment/ControlEditorDialog.h b/src/gui/editors/segment/ControlEditorDialog.h
new file mode 100644
index 0000000..9270d2c
--- /dev/null
+++ b/src/gui/editors/segment/ControlEditorDialog.h
@@ -0,0 +1,122 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_CONTROLEDITORDIALOG_H_
+#define _RG_CONTROLEDITORDIALOG_H_
+
+#include "base/Device.h"
+#include "base/MidiDevice.h"
+#include <kmainwindow.h>
+
+
+class QWidget;
+class QPushButton;
+class QListViewItem;
+class QCloseEvent;
+class KListView;
+class KCommand;
+
+
+namespace Rosegarden
+{
+
+class Studio;
+class RosegardenGUIDoc;
+class MultiViewCommandHistory;
+
+
+class ControlEditorDialog : public KMainWindow
+{
+ Q_OBJECT
+
+public:
+ ControlEditorDialog(QWidget *parent,
+ RosegardenGUIDoc *doc,
+ DeviceId device);
+
+ ~ControlEditorDialog();
+
+ void initDialog();
+
+ void addCommandToHistory(KCommand *command);
+ MultiViewCommandHistory* getCommandHistory();
+
+ void setModified(bool value);
+ void checkModified();
+
+ // reset the document
+ void setDocument(RosegardenGUIDoc *doc);
+
+ DeviceId getDevice() { return m_device; }
+
+public slots:
+ void slotUpdate();
+
+/*
+ void slotEditCopy();
+ void slotEditPaste();
+*/
+
+ void slotAdd();
+ void slotDelete();
+ void slotClose();
+
+ void slotEdit();
+ void slotEdit(QListViewItem *);
+
+signals:
+ void closing();
+
+
+protected:
+ virtual void closeEvent(QCloseEvent *);
+
+ void setupActions();
+
+ //--------------- Data members ---------------------------------
+ Studio *m_studio;
+ RosegardenGUIDoc *m_doc;
+ DeviceId m_device;
+
+ QPushButton *m_closeButton;
+
+ QPushButton *m_copyButton;
+ QPushButton *m_pasteButton;
+
+ QPushButton *m_addButton;
+ QPushButton *m_deleteButton;
+
+ KListView *m_listView;
+
+ bool m_modified;
+
+ ControlList m_clipboard; // local clipboard only
+
+};
+
+
+}
+
+#endif
diff --git a/src/gui/editors/segment/ControlParameterEditDialog.cpp b/src/gui/editors/segment/ControlParameterEditDialog.cpp
new file mode 100644
index 0000000..bc779f5
--- /dev/null
+++ b/src/gui/editors/segment/ControlParameterEditDialog.cpp
@@ -0,0 +1,325 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "ControlParameterEditDialog.h"
+#include <qlayout.h>
+
+#include <klocale.h>
+#include "misc/Debug.h"
+#include "misc/Strings.h"
+#include "base/Colour.h"
+#include "base/ColourMap.h"
+#include "base/ControlParameter.h"
+#include "base/Event.h"
+#include "base/MidiTypes.h"
+#include "document/RosegardenGUIDoc.h"
+#include <kcombobox.h>
+#include <kdialogbase.h>
+#include <qcolor.h>
+#include <qframe.h>
+#include <qgroupbox.h>
+#include <qlabel.h>
+#include <qlineedit.h>
+#include <qpixmap.h>
+#include <qspinbox.h>
+#include <qstring.h>
+#include <qvbox.h>
+#include <qwidget.h>
+
+
+namespace Rosegarden
+{
+
+const QString notShowing(i18n("<not showing>"));
+
+ControlParameterEditDialog::ControlParameterEditDialog(
+ QWidget *parent,
+ ControlParameter *control,
+ RosegardenGUIDoc *doc):
+ KDialogBase(parent, 0, true,
+ i18n("Edit Control Parameter"), Ok | Cancel),
+ m_doc(doc),
+ m_control(control)
+{
+ m_dialogControl = *control; // copy in the ControlParameter
+
+ QVBox *vbox = makeVBoxMainWidget();
+
+ QGroupBox *groupBox = new QGroupBox
+ (1, Horizontal, i18n("Control Event Properties"), vbox);
+
+ QFrame *frame = new QFrame(groupBox);
+
+ QGridLayout *layout = new QGridLayout(frame, 4, 3, 10, 5);
+
+ layout->addWidget(new QLabel(i18n("Name:"), frame), 0, 0);
+ m_nameEdit = new QLineEdit(frame);
+ layout->addWidget(m_nameEdit, 0, 1);
+
+ layout->addWidget(new QLabel(i18n("Type:"), frame), 1, 0);
+ m_typeCombo = new KComboBox(frame);
+ layout->addMultiCellWidget(m_typeCombo, 1, 1, 1, 2);
+
+ layout->addWidget(new QLabel(i18n("Description:"), frame), 2, 0);
+ m_description = new QLineEdit(frame);
+ layout->addMultiCellWidget(m_description, 2, 2, 1, 2);
+
+ // hex value alongside decimal value
+ m_hexValue = new QLabel(frame);
+ layout->addWidget(m_hexValue, 3, 1);
+
+ layout->addWidget(new QLabel(i18n("Control Event value:"), frame), 3, 0);
+ m_controllerBox = new QSpinBox(frame);
+ layout->addWidget(m_controllerBox, 3, 2);
+
+ layout->addWidget(new QLabel(i18n("Minimum value:"), frame), 4, 0);
+ m_minBox = new QSpinBox(frame);
+ layout->addMultiCellWidget(m_minBox, 4, 4, 1, 2);
+
+ layout->addWidget(new QLabel(i18n("Maximum value:"), frame), 5, 0);
+ m_maxBox = new QSpinBox(frame);
+ layout->addMultiCellWidget(m_maxBox, 5, 5, 1, 2);
+
+ layout->addWidget(new QLabel(i18n("Default value:"), frame), 6, 0);
+ m_defaultBox = new QSpinBox(frame);
+ layout->addMultiCellWidget(m_defaultBox, 6, 6, 1, 2);
+
+ layout->addWidget(new QLabel(i18n("Color:"), frame), 7, 0);
+ m_colourCombo = new KComboBox(frame);
+ layout->addMultiCellWidget(m_colourCombo, 7, 7, 1, 2);
+
+ layout->addWidget(new QLabel(i18n("Instrument Parameter Box position:"), frame), 8, 0);
+ m_ipbPosition = new KComboBox(frame);
+ layout->addMultiCellWidget(m_ipbPosition, 8, 8, 1, 2);
+
+ connect(m_nameEdit, SIGNAL(textChanged(const QString&)),
+ SLOT(slotNameChanged(const QString&)));
+
+ connect(m_typeCombo, SIGNAL(activated(int)),
+ SLOT(slotTypeChanged(int)));
+
+ connect(m_description, SIGNAL(textChanged(const QString&)),
+ SLOT(slotDescriptionChanged(const QString &)));
+
+ connect(m_controllerBox, SIGNAL(valueChanged(int)),
+ SLOT(slotControllerChanged(int)));
+
+ connect(m_minBox, SIGNAL(valueChanged(int)),
+ SLOT(slotMinChanged(int)));
+
+ connect(m_maxBox, SIGNAL(valueChanged(int)),
+ SLOT(slotMaxChanged(int)));
+
+ connect(m_defaultBox, SIGNAL(valueChanged(int)),
+ SLOT(slotDefaultChanged(int)));
+
+ connect(m_colourCombo, SIGNAL(activated(int)),
+ SLOT(slotColourChanged(int)));
+
+ connect(m_ipbPosition, SIGNAL(activated(int)),
+ SLOT(slotIPBPositionChanged(int)));
+
+ //m_nameEdit->selectAll();
+ //m_description->selectAll();
+
+ // set limits
+ m_controllerBox->setMinValue(0);
+ m_controllerBox->setMaxValue(127);
+
+ m_minBox->setMinValue(INT_MIN);
+ m_minBox->setMaxValue(INT_MAX);
+
+ m_maxBox->setMinValue(INT_MIN);
+ m_maxBox->setMaxValue(INT_MAX);
+
+ m_defaultBox->setMinValue(INT_MIN);
+ m_defaultBox->setMaxValue(INT_MAX);
+
+ // populate combos
+ m_typeCombo->insertItem(strtoqstr(Controller::EventType));
+ m_typeCombo->insertItem(strtoqstr(PitchBend::EventType));
+ /*
+ m_typeCombo->insertItem(strtoqstr(KeyPressure::EventType));
+ m_typeCombo->insertItem(strtoqstr(ChannelPressure::EventType));
+ */
+
+ // Populate colour combo
+ //
+ //
+ ColourMap &colourMap = m_doc->getComposition().getGeneralColourMap();
+ RCMap::const_iterator it;
+ QPixmap colourPixmap(16, 16);
+
+ for (it = colourMap.begin(); it != colourMap.end(); ++it) {
+ Colour c = it->second.first;
+ colourPixmap.fill(QColor(c.getRed(), c.getGreen(), c.getBlue()));
+ m_colourCombo->insertItem(colourPixmap, strtoqstr(it->second.second));
+ }
+
+ // Populate IPB position combo
+ //
+ m_ipbPosition->insertItem(notShowing);
+ for (unsigned int i = 0; i < 32; i++)
+ m_ipbPosition->insertItem(QString("%1").arg(i));
+
+ if (m_control->getType() == Controller::EventType)
+ m_typeCombo->setCurrentItem(0);
+ else if (m_control->getType() == PitchBend::EventType)
+ m_typeCombo->setCurrentItem(1);
+ /*
+ else if (m_control->getType() == KeyPressure::EventType)
+ m_typeCombo->setCurrentItem(2);
+ else if (m_control->getType() == ChannelPressure::EventType)
+ m_typeCombo->setCurrentItem(3);
+ */
+
+ populate();
+}
+
+void
+ControlParameterEditDialog::populate()
+{
+ m_nameEdit->setText(strtoqstr(m_control->getName()));
+
+ m_description->setText(strtoqstr(m_control->getDescription()));
+ m_controllerBox->setValue(int(m_control->getControllerValue()));
+
+ QString hexValue;
+ hexValue.sprintf("(0x%x)", m_control->getControllerValue());
+ m_hexValue->setText(hexValue);
+
+ m_minBox->setValue(m_control->getMin());
+ m_maxBox->setValue(m_control->getMax());
+ m_defaultBox->setValue(m_control->getDefault());
+
+ int pos = 0, setItem = 0;
+ ColourMap &colourMap = m_doc->getComposition().getGeneralColourMap();
+ RCMap::const_iterator it;
+ for (it = colourMap.begin(); it != colourMap.end(); ++it)
+ if (m_control->getColourIndex() == it->first)
+ setItem = pos++;
+
+ m_colourCombo->setCurrentItem(setItem);
+
+ // set combo position
+ m_ipbPosition->setCurrentItem(m_control->getIPBPosition() + 1);
+
+ // If the type has changed and there are no defaults then we have to
+ // supply some.
+ //
+ if (qstrtostr(m_typeCombo->currentText()) == PitchBend::EventType ||
+ qstrtostr(m_typeCombo->currentText()) == KeyPressure::EventType ||
+ qstrtostr(m_typeCombo->currentText()) == ChannelPressure::EventType) {
+ m_controllerBox->setEnabled(false);
+ m_ipbPosition->setEnabled(false);
+ m_colourCombo->setEnabled(false);
+ m_hexValue->setEnabled(false);
+ m_minBox->setEnabled(false);
+ m_maxBox->setEnabled(false);
+ m_defaultBox->setEnabled(false);
+ } else if (qstrtostr(m_typeCombo->currentText()) == Controller::EventType) {
+ m_controllerBox->setEnabled(true);
+ m_ipbPosition->setEnabled(true);
+ m_colourCombo->setEnabled(true);
+ m_hexValue->setEnabled(true);
+ m_minBox->setEnabled(true);
+ m_maxBox->setEnabled(true);
+ m_defaultBox->setEnabled(true);
+ }
+
+}
+
+void
+ControlParameterEditDialog::slotNameChanged(const QString &str)
+{
+ RG_DEBUG << "ControlParameterEditDialog::slotNameChanged" << endl;
+ m_dialogControl.setName(qstrtostr(str));
+}
+
+void
+ControlParameterEditDialog::slotTypeChanged(int value)
+{
+ RG_DEBUG << "ControlParameterEditDialog::slotTypeChanged" << endl;
+ m_dialogControl.setType(qstrtostr(m_typeCombo->text(value)));
+
+ populate();
+}
+
+void
+ControlParameterEditDialog::slotDescriptionChanged(const QString &str)
+{
+ RG_DEBUG << "ControlParameterEditDialog::slotDescriptionChanged" << endl;
+ m_dialogControl.setDescription(qstrtostr(str));
+}
+
+void
+ControlParameterEditDialog::slotControllerChanged(int value)
+{
+ RG_DEBUG << "ControlParameterEditDialog::slotControllerChanged" << endl;
+ m_dialogControl.setControllerValue(value);
+
+ // set hex value
+ QString hexValue;
+ hexValue.sprintf("(0x%x)", value);
+ m_hexValue->setText(hexValue);
+}
+
+void
+ControlParameterEditDialog::slotMinChanged(int value)
+{
+ RG_DEBUG << "ControlParameterEditDialog::slotMinChanged" << endl;
+ m_dialogControl.setMin(value);
+}
+
+void
+ControlParameterEditDialog::slotMaxChanged(int value)
+{
+ RG_DEBUG << "ControlParameterEditDialog::slotMaxChanged" << endl;
+ m_dialogControl.setMax(value);
+}
+
+void
+ControlParameterEditDialog::slotDefaultChanged(int value)
+{
+ RG_DEBUG << "ControlParameterEditDialog::slotDefaultChanged" << endl;
+ m_dialogControl.setDefault(value);
+}
+
+void
+ControlParameterEditDialog::slotColourChanged(int value)
+{
+ RG_DEBUG << "ControlParameterEditDialog::slotColourChanged" << endl;
+ m_dialogControl.setColourIndex(value);
+}
+
+void
+ControlParameterEditDialog::slotIPBPositionChanged(int value)
+{
+ RG_DEBUG << "ControlParameterEditDialog::slotIPBPositionChanged" << endl;
+ m_dialogControl.setIPBPosition(value - 1);
+}
+
+}
+#include "ControlParameterEditDialog.moc"
diff --git a/src/gui/editors/segment/ControlParameterEditDialog.h b/src/gui/editors/segment/ControlParameterEditDialog.h
new file mode 100644
index 0000000..b9f4606
--- /dev/null
+++ b/src/gui/editors/segment/ControlParameterEditDialog.h
@@ -0,0 +1,92 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_CONTROLPARAMETEREDITDIALOG_H_
+#define _RG_CONTROLPARAMETEREDITDIALOG_H_
+
+#include "base/ControlParameter.h"
+#include <kdialogbase.h>
+
+
+class QWidget;
+class QString;
+class QSpinBox;
+class QLineEdit;
+class QLabel;
+class KComboBox;
+
+
+namespace Rosegarden
+{
+
+class RosegardenGUIDoc;
+
+
+class ControlParameterEditDialog : public KDialogBase
+{
+ Q_OBJECT
+public:
+ ControlParameterEditDialog(QWidget *parent,
+ ControlParameter *control,
+ RosegardenGUIDoc *doc);
+
+ ControlParameter& getControl() { return m_dialogControl; }
+
+public slots:
+
+ void slotNameChanged(const QString &);
+ void slotTypeChanged(int);
+ void slotDescriptionChanged(const QString &);
+ void slotControllerChanged(int);
+ void slotMinChanged(int);
+ void slotMaxChanged(int);
+ void slotDefaultChanged(int);
+ void slotColourChanged(int);
+ void slotIPBPositionChanged(int);
+
+protected:
+ void populate(); // populate the dialog
+
+ RosegardenGUIDoc *m_doc;
+ ControlParameter *m_control;
+ ControlParameter m_dialogControl;
+
+ QLineEdit *m_nameEdit;
+ KComboBox *m_typeCombo;
+ QLineEdit *m_description;
+ QSpinBox *m_controllerBox;
+ QSpinBox *m_minBox;
+ QSpinBox *m_maxBox;
+ QSpinBox *m_defaultBox;
+ KComboBox *m_colourCombo;
+ KComboBox *m_ipbPosition;
+ QLabel *m_hexValue;
+};
+
+
+
+}
+
+#endif
diff --git a/src/gui/editors/segment/ControlParameterItem.cpp b/src/gui/editors/segment/ControlParameterItem.cpp
new file mode 100644
index 0000000..beb0922
--- /dev/null
+++ b/src/gui/editors/segment/ControlParameterItem.cpp
@@ -0,0 +1,34 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "ControlParameterItem.h"
+
+#include <qlistview.h>
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+}
diff --git a/src/gui/editors/segment/ControlParameterItem.h b/src/gui/editors/segment/ControlParameterItem.h
new file mode 100644
index 0000000..6746ca2
--- /dev/null
+++ b/src/gui/editors/segment/ControlParameterItem.h
@@ -0,0 +1,65 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_CONTROLPARAMETERITEM_H_
+#define _RG_CONTROLPARAMETERITEM_H_
+
+#include <qstring.h>
+#include <klistview.h>
+
+
+namespace Rosegarden
+{
+
+
+class ControlParameterItem : public KListViewItem
+{
+public:
+ ControlParameterItem(int id,
+ QListView *parent,
+ QString str1,
+ QString str2,
+ QString str3,
+ QString str4,
+ QString str5,
+ QString str6,
+ QString str7,
+ QString str8,
+ QString str9):
+ KListViewItem(parent, str1, str2, str3, str4, str5, str6, str7, str8),
+ m_id(id) { setText(8, str9); }
+
+ int getId() const { return m_id; }
+
+protected:
+
+ int m_id;
+ QString m_string9;
+};
+
+
+}
+
+#endif
diff --git a/src/gui/editors/segment/MarkerEditor.cpp b/src/gui/editors/segment/MarkerEditor.cpp
new file mode 100644
index 0000000..61caaa7
--- /dev/null
+++ b/src/gui/editors/segment/MarkerEditor.cpp
@@ -0,0 +1,594 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "MarkerEditor.h"
+#include "MarkerEditorViewItem.h"
+#include <qlayout.h>
+#include <kapplication.h>
+
+#include <klocale.h>
+#include <kstddirs.h>
+#include <kstdaccel.h>
+#include <kconfig.h>
+#include "misc/Debug.h"
+#include "misc/Strings.h"
+#include "base/Composition.h"
+#include "base/Marker.h"
+#include "base/RealTime.h"
+#include "commands/edit/AddMarkerCommand.h"
+#include "commands/edit/ModifyMarkerCommand.h"
+#include "commands/edit/RemoveMarkerCommand.h"
+#include "document/MultiViewCommandHistory.h"
+#include "document/RosegardenGUIDoc.h"
+#include "document/ConfigGroups.h"
+#include "gui/dialogs/MarkerModifyDialog.h"
+#include <kaction.h>
+#include <kcommand.h>
+#include <kglobal.h>
+#include <klistview.h>
+#include <kmainwindow.h>
+#include <kstdaccel.h>
+#include <kstdaction.h>
+#include <qaccel.h>
+#include <qdialog.h>
+#include <qframe.h>
+#include <qgroupbox.h>
+#include <qiconset.h>
+#include <qlabel.h>
+#include <qlistview.h>
+#include <qptrlist.h>
+#include <qpushbutton.h>
+#include <qsizepolicy.h>
+#include <qstring.h>
+#include <qtooltip.h>
+#include <qvbox.h>
+#include <qwidget.h>
+#include <qcanvas.h>
+
+
+namespace Rosegarden
+{
+
+MarkerEditor::MarkerEditor(QWidget *parent,
+ RosegardenGUIDoc *doc):
+ KMainWindow(parent, "markereditordialog"),
+ m_doc(doc),
+ m_modified(false)
+{
+ QVBox* mainFrame = new QVBox(this);
+ setCentralWidget(mainFrame);
+
+ setCaption(i18n("Manage Markers"));
+
+ m_listView = new KListView(mainFrame);
+ m_listView->addColumn(i18n("Marker time "));
+ m_listView->addColumn(i18n("Marker text "));
+ m_listView->addColumn(i18n("Marker description "));
+
+ // Align centrally
+ for (int i = 0; i < 3; ++i)
+ m_listView->setColumnAlignment(i, Qt::AlignHCenter);
+
+ QGroupBox *posGroup = new QGroupBox(2, Horizontal,
+ i18n("Pointer position"), mainFrame);
+
+ new QLabel(i18n("Absolute time:"), posGroup);
+ m_absoluteTime = new QLabel(posGroup);
+
+ new QLabel(i18n("Real time:"), posGroup);
+ m_realTime = new QLabel(posGroup);
+
+ new QLabel(i18n("In measure:"), posGroup);
+ m_barTime = new QLabel(posGroup);
+
+ QFrame* btnBox = new QFrame(mainFrame);
+
+ btnBox->setSizePolicy(
+ QSizePolicy(QSizePolicy::Minimum, QSizePolicy::Fixed));
+
+ QHBoxLayout* layout = new QHBoxLayout(btnBox, 4, 10);
+
+ m_addButton = new QPushButton(i18n("Add"), btnBox);
+ m_deleteButton = new QPushButton(i18n("Delete"), btnBox);
+ m_deleteAllButton = new QPushButton(i18n("Delete All"), btnBox);
+
+ m_closeButton = new QPushButton(i18n("Close"), btnBox);
+
+ QToolTip::add
+ (m_addButton,
+ i18n("Add a Marker"));
+
+ QToolTip::add
+ (m_deleteButton,
+ i18n("Delete a Marker"));
+
+ QToolTip::add
+ (m_deleteAllButton,
+ i18n("Delete All Markers"));
+
+ QToolTip::add
+ (m_closeButton,
+ i18n("Close the Marker Editor"));
+
+ layout->addStretch(10);
+ layout->addWidget(m_addButton);
+ layout->addWidget(m_deleteButton);
+ layout->addWidget(m_deleteAllButton);
+ layout->addSpacing(30);
+
+ layout->addWidget(m_closeButton);
+ layout->addSpacing(5);
+
+ connect(m_addButton, SIGNAL(released()),
+ SLOT(slotAdd()));
+
+ connect(m_deleteButton, SIGNAL(released()),
+ SLOT(slotDelete()));
+
+ connect(m_closeButton, SIGNAL(released()),
+ SLOT(slotClose()));
+
+ connect(m_deleteAllButton, SIGNAL(released()),
+ SLOT(slotDeleteAll()));
+
+ setupActions();
+
+ m_doc->getCommandHistory()->attachView(actionCollection());
+ connect(m_doc->getCommandHistory(), SIGNAL(commandExecuted()),
+ this, SLOT(slotUpdate()));
+
+ connect(m_listView, SIGNAL(doubleClicked(QListViewItem *)),
+ SLOT(slotEdit(QListViewItem *)));
+
+ connect(m_listView, SIGNAL(pressed(QListViewItem *)),
+ this, SLOT(slotItemClicked(QListViewItem *)));
+
+ // Highlight all columns - enable extended selection mode
+ //
+ m_listView->setAllColumnsShowFocus(true);
+ m_listView->setSelectionMode(QListView::Extended);
+ m_listView->setItemsRenameable(true);
+
+ initDialog();
+
+ setAutoSaveSettings(MarkerEditorConfigGroup, true);
+
+ m_accelerators = new QAccel(this);
+}
+
+void
+MarkerEditor::updatePosition()
+{
+ timeT pos = m_doc->getComposition().getPosition();
+ m_absoluteTime->setText(QString("%1").arg(pos));
+
+ RealTime rT = m_doc->getComposition().getElapsedRealTime(pos);
+ long hours = rT.sec / (60 * 60);
+ long mins = rT.sec / 60;
+ long secs = rT.sec;
+ long msecs = rT.msec();
+
+ QString realTime, secsStr;
+ if (hours)
+ realTime += QString("%1h ").arg(hours);
+ if (mins)
+ realTime += QString("%1m ").arg(mins);
+ secsStr.sprintf("%ld.%03lds", secs, msecs);
+ realTime += secsStr;
+
+ // only update if we need to to try and avoid flickering
+ if (m_realTime->text() != realTime)
+ m_realTime->setText(realTime);
+
+ QString barTime =
+ QString("%1").arg(m_doc->getComposition().getBarNumber(pos) + 1);
+
+ // again only update if needed
+ if (m_barTime->text() != barTime)
+ m_barTime->setText(barTime);
+
+ /*
+ // Don't allow us to add another marker if there's already one
+ // at the current position.
+ //
+ if (m_doc->getComposition().
+ isMarkerAtPosition(m_doc->getComposition().getPosition()))
+ m_addButton->setEnabled(false);
+ else
+ m_addButton->setEnabled(true);
+ */
+}
+
+MarkerEditor::~MarkerEditor()
+{
+ RG_DEBUG << "MarkerEditor::~MarkerEditor" << endl;
+
+ m_listView->saveLayout(kapp->config(), MarkerEditorConfigGroup);
+
+ if (m_doc)
+ m_doc->getCommandHistory()->detachView(actionCollection());
+}
+
+void
+MarkerEditor::initDialog()
+{
+ RG_DEBUG << "MarkerEditor::initDialog" << endl;
+ slotUpdate();
+}
+
+void
+MarkerEditor::slotUpdate()
+{
+ RG_DEBUG << "MarkerEditor::slotUpdate" << endl;
+
+ //QPtrList<QListViewItem> selection = m_listView->selectedItems();
+
+ MarkerEditorViewItem *item;
+
+ m_listView->clear();
+
+ Composition::markercontainer markers =
+ m_doc->getComposition().getMarkers();
+
+ Composition::markerconstiterator it;
+
+ kapp->config()->setGroup(MarkerEditorConfigGroup);
+ int timeMode = kapp->config()->readNumEntry("timemode", 0);
+
+ for (it = markers.begin(); it != markers.end(); ++it) {
+ QString timeString = makeTimeString((*it)->getTime(), timeMode);
+
+ item = new
+ MarkerEditorViewItem(m_listView,
+ (*it)->getID(),
+ timeString,
+ strtoqstr((*it)->getName()),
+ strtoqstr((*it)->getDescription()));
+
+ // Set this for the MarkerEditor
+ //
+ item->setRawTime((*it)->getTime());
+
+ m_listView->insertItem(item);
+ }
+
+ if (m_listView->childCount() == 0) {
+ QListViewItem *item =
+ new MarkerEditorViewItem(m_listView, 0, i18n("<none>"));
+ ((MarkerEditorViewItem *)item)->setFake(true);
+ m_listView->insertItem(item);
+
+ m_listView->setSelectionMode(QListView::NoSelection);
+ } else {
+ m_listView->setSelectionMode(QListView::Extended);
+ }
+
+ updatePosition();
+
+}
+
+void
+MarkerEditor::slotDeleteAll()
+{
+ RG_DEBUG << "MarkerEditor::slotDeleteAll" << endl;
+ KMacroCommand *command = new KMacroCommand(i18n("Remove all markers"));
+
+ QListViewItem *item = m_listView->firstChild();
+
+ do {
+ MarkerEditorViewItem *ei =
+ dynamic_cast<MarkerEditorViewItem *>(item);
+ if (!ei || ei->isFake())
+ continue;
+
+ RemoveMarkerCommand *rc =
+ new RemoveMarkerCommand(&m_doc->getComposition(),
+ ei->getID(),
+ ei->getRawTime(),
+ qstrtostr(item->text(1)),
+ qstrtostr(item->text(2)));
+ command->addCommand(rc);
+ } while ((item = item->nextSibling()));
+
+ addCommandToHistory(command);
+}
+
+void
+MarkerEditor::slotAdd()
+{
+ RG_DEBUG << "MarkerEditor::slotAdd" << endl;
+
+ AddMarkerCommand *command =
+ new AddMarkerCommand(&m_doc->getComposition(),
+ m_doc->getComposition().getPosition(),
+ std::string("new marker"),
+ std::string("no description"));
+
+ addCommandToHistory(command);
+}
+
+void
+MarkerEditor::slotDelete()
+{
+ RG_DEBUG << "MarkerEditor::slotDelete" << endl;
+ QListViewItem *item = m_listView->currentItem();
+
+ MarkerEditorViewItem *ei =
+ dynamic_cast<MarkerEditorViewItem *>(item);
+
+ if (!ei || ei->isFake())
+ return ;
+
+ RemoveMarkerCommand *command =
+ new RemoveMarkerCommand(&m_doc->getComposition(),
+ ei->getID(),
+ ei->getRawTime(),
+ qstrtostr(item->text(1)),
+ qstrtostr(item->text(2)));
+
+ addCommandToHistory(command);
+
+}
+
+void
+MarkerEditor::slotClose()
+{
+ RG_DEBUG << "MarkerEditor::slotClose" << endl;
+
+ if (m_doc)
+ m_doc->getCommandHistory()->detachView(actionCollection());
+ m_doc = 0;
+
+ close();
+}
+
+void
+MarkerEditor::setupActions()
+{
+ KAction* close = KStdAction::close(this,
+ SLOT(slotClose()),
+ actionCollection());
+
+ m_closeButton->setText(close->text());
+ connect(m_closeButton, SIGNAL(released()), this, SLOT(slotClose()));
+
+ // some adjustments
+ new KToolBarPopupAction(i18n("Und&o"),
+ "undo",
+ KStdAccel::key(KStdAccel::Undo),
+ actionCollection(),
+ KStdAction::stdName(KStdAction::Undo));
+
+ new KToolBarPopupAction(i18n("Re&do"),
+ "redo",
+ KStdAccel::key(KStdAccel::Redo),
+ actionCollection(),
+ KStdAction::stdName(KStdAction::Redo));
+
+ QString pixmapDir = KGlobal::dirs()->findResource("appdata", "pixmaps/");
+ kapp->config()->setGroup(MarkerEditorConfigGroup);
+ int timeMode = kapp->config()->readNumEntry("timemode", 0);
+
+ KRadioAction *action;
+
+ QCanvasPixmap pixmap(pixmapDir + "/toolbar/time-musical.png");
+ QIconSet icon(pixmap);
+
+ action = new KRadioAction(i18n("&Musical Times"), icon, 0, this,
+ SLOT(slotMusicalTime()),
+ actionCollection(), "time_musical");
+ action->setExclusiveGroup("timeMode");
+ if (timeMode == 0)
+ action->setChecked(true);
+
+ pixmap.load(pixmapDir + "/toolbar/time-real.png");
+ icon = QIconSet(pixmap);
+
+ action = new KRadioAction(i18n("&Real Times"), icon, 0, this,
+ SLOT(slotRealTime()),
+ actionCollection(), "time_real");
+ action->setExclusiveGroup("timeMode");
+ if (timeMode == 1)
+ action->setChecked(true);
+
+ pixmap.load(pixmapDir + "/toolbar/time-raw.png");
+ icon = QIconSet(pixmap);
+
+ action = new KRadioAction(i18n("Ra&w Times"), icon, 0, this,
+ SLOT(slotRawTime()),
+ actionCollection(), "time_raw");
+ action->setExclusiveGroup("timeMode");
+ if (timeMode == 2)
+ action->setChecked(true);
+
+ createGUI("markereditor.rc");
+}
+
+void
+MarkerEditor::addCommandToHistory(KCommand *command)
+{
+ getCommandHistory()->addCommand(command);
+ setModified(false);
+}
+
+MultiViewCommandHistory*
+MarkerEditor::getCommandHistory()
+{
+ return m_doc->getCommandHistory();
+}
+
+void
+MarkerEditor::setModified(bool modified)
+{
+ RG_DEBUG << "MarkerEditor::setModified(" << modified << ")" << endl;
+
+ if (modified) {}
+ else {}
+
+ m_modified = modified;
+}
+
+void
+MarkerEditor::checkModified()
+{
+ RG_DEBUG << "MarkerEditor::checkModified(" << m_modified << ")"
+ << endl;
+
+}
+
+void
+MarkerEditor::slotEdit(QListViewItem *i)
+{
+ RG_DEBUG << "MarkerEditor::slotEdit" << endl;
+
+ if (m_listView->selectionMode() == QListView::NoSelection) {
+ // The marker list is empty, so we shouldn't allow editing the
+ // <none> placeholder
+ return ;
+ }
+
+ // Need to get the raw time from the ListViewItem
+ //
+ MarkerEditorViewItem *item =
+ dynamic_cast<MarkerEditorViewItem*>(i);
+
+ if (!item || item->isFake())
+ return ;
+
+ MarkerModifyDialog dialog(this,
+ &m_doc->getComposition(),
+ item->getRawTime(),
+ item->text(1),
+ item->text(2));
+
+ if (dialog.exec() == QDialog::Accepted) {
+ ModifyMarkerCommand *command =
+ new ModifyMarkerCommand(&m_doc->getComposition(),
+ item->getID(),
+ dialog.getOriginalTime(),
+ dialog.getTime(),
+ qstrtostr(dialog.getName()),
+ qstrtostr(dialog.getDescription()));
+
+ addCommandToHistory(command);
+ }
+
+
+}
+
+void
+MarkerEditor::closeEvent(QCloseEvent *e)
+{
+ emit closing();
+ KMainWindow::closeEvent(e);
+}
+
+void
+MarkerEditor::setDocument(RosegardenGUIDoc *doc)
+{
+ // reset our pointers
+ m_doc = doc;
+ m_modified = false;
+
+ slotUpdate();
+}
+
+void
+MarkerEditor::slotItemClicked(QListViewItem *item)
+{
+ RG_DEBUG << "MarkerEditor::slotItemClicked" << endl;
+ MarkerEditorViewItem *ei =
+ dynamic_cast<MarkerEditorViewItem *>(item);
+
+ if (ei && !ei->isFake()) {
+ RG_DEBUG << "MarkerEditor::slotItemClicked - "
+ << "jump to marker at " << ei->getRawTime() << endl;
+
+ emit jumpToMarker(timeT(ei->getRawTime()));
+ }
+}
+
+QString
+MarkerEditor::makeTimeString(timeT time, int timeMode)
+{
+ switch (timeMode) {
+
+ case 0: // musical time
+ {
+ int bar, beat, fraction, remainder;
+ m_doc->getComposition().getMusicalTimeForAbsoluteTime
+ (time, bar, beat, fraction, remainder);
+ ++bar;
+ return QString("%1%2%3-%4%5-%6%7-%8%9 ")
+ .arg(bar / 100)
+ .arg((bar % 100) / 10)
+ .arg(bar % 10)
+ .arg(beat / 10)
+ .arg(beat % 10)
+ .arg(fraction / 10)
+ .arg(fraction % 10)
+ .arg(remainder / 10)
+ .arg(remainder % 10);
+ }
+
+ case 1: // real time
+ {
+ RealTime rt =
+ m_doc->getComposition().getElapsedRealTime(time);
+ // return QString("%1 ").arg(rt.toString().c_str());
+ return QString("%1 ").arg(rt.toText().c_str());
+ }
+
+ default:
+ return QString("%1 ").arg(time);
+ }
+}
+
+void
+MarkerEditor::slotMusicalTime()
+{
+ kapp->config()->setGroup(MarkerEditorConfigGroup);
+ kapp->config()->writeEntry("timemode", 0);
+ slotUpdate();
+}
+
+void
+MarkerEditor::slotRealTime()
+{
+ kapp->config()->setGroup(MarkerEditorConfigGroup);
+ kapp->config()->writeEntry("timemode", 1);
+ slotUpdate();
+}
+
+void
+MarkerEditor::slotRawTime()
+{
+ kapp->config()->setGroup(MarkerEditorConfigGroup);
+ kapp->config()->writeEntry("timemode", 2);
+ slotUpdate();
+}
+
+}
+#include "MarkerEditor.moc"
diff --git a/src/gui/editors/segment/MarkerEditor.h b/src/gui/editors/segment/MarkerEditor.h
new file mode 100644
index 0000000..d3c9ac7
--- /dev/null
+++ b/src/gui/editors/segment/MarkerEditor.h
@@ -0,0 +1,124 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_MARKEREDITOR_H_
+#define _RG_MARKEREDITOR_H_
+
+#include <kmainwindow.h>
+#include <qstring.h>
+#include "base/Event.h"
+
+
+class QWidget;
+class QPushButton;
+class QListViewItem;
+class QLabel;
+class QCloseEvent;
+class QAccel;
+class KListView;
+class KCommand;
+
+
+namespace Rosegarden
+{
+
+class RosegardenGUIDoc;
+class MultiViewCommandHistory;
+
+
+class MarkerEditor : public KMainWindow
+{
+ Q_OBJECT
+
+public:
+ MarkerEditor(QWidget *parent,
+ RosegardenGUIDoc *doc);
+ ~MarkerEditor();
+
+ void initDialog();
+
+ void addCommandToHistory(KCommand *command);
+ MultiViewCommandHistory* getCommandHistory();
+
+ void setModified(bool value);
+ void checkModified();
+
+ // reset the document
+ void setDocument(RosegardenGUIDoc *doc);
+
+ // update pointer position
+ void updatePosition();
+
+ QAccel* getAccelerators() { return m_accelerators; }
+
+public slots:
+ void slotUpdate();
+
+ void slotAdd();
+ void slotDelete();
+ void slotDeleteAll();
+ void slotClose();
+ void slotEdit(QListViewItem *);
+ void slotItemClicked(QListViewItem *);
+
+ void slotMusicalTime();
+ void slotRealTime();
+ void slotRawTime();
+
+signals:
+ void closing();
+ void jumpToMarker(timeT);
+
+protected:
+ virtual void closeEvent(QCloseEvent *);
+
+ void setupActions();
+ QString makeTimeString(timeT time, int timeMode);
+
+ //--------------- Data members ---------------------------------
+ RosegardenGUIDoc *m_doc;
+
+ QLabel *m_absoluteTime;
+ QLabel *m_realTime;
+ QLabel *m_barTime;
+
+ QPushButton *m_closeButton;
+
+
+ QPushButton *m_addButton;
+ QPushButton *m_deleteButton;
+ QPushButton *m_deleteAllButton;
+
+ KListView *m_listView;
+
+ bool m_modified;
+
+ QAccel *m_accelerators;
+};
+
+
+}
+
+#endif
diff --git a/src/gui/editors/segment/MarkerEditorViewItem.cpp b/src/gui/editors/segment/MarkerEditorViewItem.cpp
new file mode 100644
index 0000000..9ff2bda
--- /dev/null
+++ b/src/gui/editors/segment/MarkerEditorViewItem.cpp
@@ -0,0 +1,51 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include "MarkerEditorViewItem.h"
+
+namespace Rosegarden {
+
+int
+MarkerEditorViewItem::compare(QListViewItem * i, int col, bool ascending) const
+{
+ MarkerEditorViewItem *ei =
+ dynamic_cast<MarkerEditorViewItem *>(i);
+
+ if (!ei) return KListViewItem::compare(i, col, ascending);
+
+ // Raw time sorting on time column
+ //
+ if (col == 0) {
+
+ if (m_rawTime < ei->getRawTime()) return -1;
+ else if (ei->getRawTime() < m_rawTime) return 1;
+ else return 0;
+
+ } else {
+ return KListViewItem::compare(i, col, ascending);
+ }
+}
+
+}
+
diff --git a/src/gui/editors/segment/MarkerEditorViewItem.h b/src/gui/editors/segment/MarkerEditorViewItem.h
new file mode 100644
index 0000000..010d227
--- /dev/null
+++ b/src/gui/editors/segment/MarkerEditorViewItem.h
@@ -0,0 +1,70 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_MARKEREDITORVIEWITEM_H_
+#define _RG_MARKEREDITORVIEWITEM_H_
+
+#include <klistview.h>
+
+#include "base/Event.h"
+
+namespace Rosegarden {
+
+
+class MarkerEditorViewItem : public KListViewItem
+{
+public:
+ MarkerEditorViewItem(QListView * parent, int id,
+ QString label1,
+ QString label2 = QString::null,
+ QString label3 = QString::null,
+ QString label4 = QString::null,
+ QString label5 = QString::null,
+ QString label6 = QString::null,
+ QString label7 = QString::null,
+ QString label8 = QString::null):
+ KListViewItem(parent, label1, label2, label3, label4,
+ label5, label6, label7, label8),
+ m_rawTime(0), m_fake(false), m_id(id) { ; }
+
+ virtual int compare(QListViewItem * i, int col, bool ascending) const;
+
+ void setRawTime(Rosegarden::timeT rawTime) { m_rawTime = rawTime; }
+ Rosegarden::timeT getRawTime() const { return m_rawTime; }
+
+ void setFake(bool fake) { m_fake = true; }
+ bool isFake() const { return m_fake; }
+
+ int getID() const { return m_id; }
+
+protected:
+ Rosegarden::timeT m_rawTime;
+ bool m_fake;
+ int m_id;
+};
+
+
+}
+
+#endif
diff --git a/src/gui/editors/segment/PlayList.cpp b/src/gui/editors/segment/PlayList.cpp
new file mode 100644
index 0000000..bfc795c
--- /dev/null
+++ b/src/gui/editors/segment/PlayList.cpp
@@ -0,0 +1,254 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "PlayList.h"
+#include "PlayListView.h"
+#include "PlayListViewItem.h"
+#include "document/ConfigGroups.h"
+#include <qlayout.h>
+
+#include <klocale.h>
+#include <kconfig.h>
+#include <kfiledialog.h>
+#include <kglobal.h>
+#include <kurl.h>
+#include <qframe.h>
+#include <qpushbutton.h>
+#include <qstring.h>
+#include <qstringlist.h>
+#include <qstrlist.h>
+#include <qvbox.h>
+#include <qwidget.h>
+#include <qdragobject.h>
+
+
+namespace Rosegarden
+{
+
+PlayList::PlayList(QWidget *parent, const char *name)
+ : QVBox(parent, name),
+ m_listView(new PlayListView(this)),
+ m_buttonBar(new QFrame(this)),
+ m_barLayout(new QHBoxLayout(m_buttonBar)),
+ m_playButton(0),
+ m_moveUpButton(0),
+ m_moveDownButton(0),
+ m_deleteButton(0),
+ m_clearButton(0)
+{
+ m_openButton = new QPushButton(m_buttonBar);
+ m_playButton = new QPushButton(m_buttonBar);
+ m_moveUpButton = new QPushButton(m_buttonBar);
+ m_moveDownButton = new QPushButton(m_buttonBar);
+ m_deleteButton = new QPushButton(m_buttonBar);
+ m_clearButton = new QPushButton(m_buttonBar);
+ m_barLayout->addWidget(m_openButton);
+ m_barLayout->addWidget(m_playButton);
+ m_barLayout->addWidget(m_moveUpButton);
+ m_barLayout->addWidget(m_moveDownButton);
+ m_barLayout->addWidget(m_deleteButton);
+ m_barLayout->addWidget(m_clearButton);
+ m_barLayout->addStretch();
+
+
+ m_openButton ->setText(i18n("Add..."));
+ m_playButton ->setText(i18n("Play"));
+ m_moveUpButton ->setText(i18n("Move Up"));
+ m_moveDownButton->setText(i18n("Move Down"));
+ m_deleteButton ->setText(i18n("Delete"));
+ m_clearButton ->setText(i18n("Clear"));
+
+ connect(m_openButton, SIGNAL(clicked()),
+ SLOT(slotOpenFiles()));
+
+ connect(m_playButton, SIGNAL(clicked()),
+ SLOT(slotPlay()));
+
+ connect(m_deleteButton, SIGNAL(clicked()),
+ SLOT(slotDeleteCurrent()));
+
+ connect(m_clearButton, SIGNAL(clicked()),
+ SLOT(slotClear()));
+
+ connect(m_moveUpButton, SIGNAL(clicked()),
+ SLOT(slotMoveUp()));
+
+ connect(m_moveDownButton, SIGNAL(clicked()),
+ SLOT(slotMoveDown()));
+
+ connect(m_listView, SIGNAL(currentChanged(QListViewItem*)),
+ SLOT(slotCurrentItemChanged(QListViewItem*)));
+
+ connect(m_listView, SIGNAL(dropped(QDropEvent*, QListViewItem*)),
+ SLOT(slotDropped(QDropEvent*, QListViewItem*)));
+
+ restore();
+
+ enableButtons(0);
+
+}
+
+PlayList::~PlayList()
+{
+ save();
+}
+
+void PlayList::slotOpenFiles()
+{
+ KURL::List kurlList =
+ KFileDialog::getOpenURLs(":ROSEGARDEN",
+ "audio/x-rosegarden audio/x-midi audio/x-rosegarden21",
+ this,
+ i18n("Select one or more Rosegarden files"));
+
+ KURL::List::iterator it;
+
+ for (it = kurlList.begin(); it != kurlList.end(); ++it) {
+ new PlayListViewItem(m_listView, *it);
+ }
+
+ enableButtons(m_listView->currentItem());
+}
+
+void
+PlayList::slotDropped(QDropEvent *event, QListViewItem* after)
+{
+ QStrList uri;
+
+ // see if we can decode a URI.. if not, just ignore it
+ if (QUriDrag::decode(event, uri)) {
+
+ // okay, we have a URI.. process it
+ // weed out non-rg files
+ //
+ for (QString url = uri.first(); url; url = uri.next()) {
+ if (url.right(3).lower() == ".rg")
+ new PlayListViewItem(m_listView, after, KURL(url));
+
+ }
+ }
+
+ enableButtons(m_listView->currentItem());
+}
+
+void PlayList::slotPlay()
+{
+ PlayListViewItem *currentItem = dynamic_cast<PlayListViewItem*>(m_listView->currentItem());
+
+ if (currentItem)
+ emit play(currentItem->getURL().url());
+}
+
+void PlayList::slotMoveUp()
+{
+ QListViewItem *currentItem = m_listView->currentItem();
+ QListViewItem *previousItem = m_listView->previousSibling(currentItem);
+
+ if (previousItem)
+ previousItem->moveItem(currentItem);
+
+ enableButtons(currentItem);
+}
+
+void PlayList::slotMoveDown()
+{
+ QListViewItem *currentItem = m_listView->currentItem();
+ QListViewItem *nextItem = currentItem->nextSibling();
+
+ if (nextItem)
+ currentItem->moveItem(nextItem);
+
+ enableButtons(currentItem);
+}
+
+void PlayList::slotClear()
+{
+ m_listView->clear();
+ enableButtons(0);
+}
+
+void PlayList::slotDeleteCurrent()
+{
+ QListViewItem* currentItem = m_listView->currentItem();
+ if (currentItem)
+ delete currentItem;
+}
+
+void PlayList::slotCurrentItemChanged(QListViewItem* currentItem)
+{
+ enableButtons(currentItem);
+}
+
+void PlayList::enableButtons(QListViewItem* currentItem)
+{
+ bool enable = (currentItem != 0);
+
+ m_playButton->setEnabled(enable);
+ m_deleteButton->setEnabled(enable);
+
+ if (currentItem) {
+ m_moveUpButton->setEnabled(currentItem != m_listView->firstChild());
+ m_moveDownButton->setEnabled(currentItem != m_listView->lastItem());
+ } else {
+ m_moveUpButton->setEnabled(false);
+ m_moveDownButton->setEnabled(false);
+ }
+
+ m_clearButton->setEnabled(m_listView->childCount() > 0);
+}
+
+void PlayList::save()
+{
+ QStringList urlList;
+ PlayListViewItem* item = dynamic_cast<PlayListViewItem*>(getListView()->firstChild());
+
+ while (item) {
+ urlList << item->getURL().url();
+ item = dynamic_cast<PlayListViewItem*>(item->nextSibling());
+ }
+
+ KConfig *kc = KGlobal::config();
+ KConfigGroupSaver cs(kc, PlayListConfigGroup);
+ kc->writeEntry("Playlist Files", urlList);
+
+ getListView()->saveLayout(kc, PlayListConfigGroup);
+}
+
+void PlayList::restore()
+{
+ KConfig *kc = KGlobal::config();
+ getListView()->restoreLayout(kc, PlayListConfigGroup);
+
+ KConfigGroupSaver cs(kc, PlayListConfigGroup);
+ QStringList urlList = kc->readListEntry("Playlist Files");
+
+ for (QStringList::Iterator it = urlList.begin();
+ it != urlList.end(); ++it) {
+ new PlayListViewItem(getListView(), KURL(*it));
+ }
+}
+
+}
+#include "PlayList.moc"
diff --git a/src/gui/editors/segment/PlayList.h b/src/gui/editors/segment/PlayList.h
new file mode 100644
index 0000000..8e40c8c
--- /dev/null
+++ b/src/gui/editors/segment/PlayList.h
@@ -0,0 +1,93 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_PLAYLIST_H_
+#define _RG_PLAYLIST_H_
+
+#include <qvbox.h>
+
+
+class QWidget;
+class QPushButton;
+class QListViewItem;
+class QHBoxLayout;
+class QFrame;
+class QDropEvent;
+
+
+namespace Rosegarden
+{
+
+class PlayListView;
+
+
+class PlayList : public QVBox
+{
+ Q_OBJECT
+
+public:
+ PlayList(QWidget *parent = 0, const char *name = 0);
+ ~PlayList();
+
+ PlayListView* getListView() { return m_listView; }
+
+ void enableButtons(QListViewItem*);
+
+
+signals:
+ void play(QString);
+
+protected slots:
+ void slotOpenFiles();
+ void slotPlay();
+ void slotMoveUp();
+ void slotMoveDown();
+ void slotDeleteCurrent();
+ void slotClear();
+ void slotCurrentItemChanged(QListViewItem*);
+ void slotDropped(QDropEvent*, QListViewItem*);
+
+protected:
+ void save();
+ void restore();
+
+ //--------------- Data members ---------------------------------
+ PlayListView* m_listView;
+ QFrame* m_buttonBar;
+ QHBoxLayout* m_barLayout;
+
+ QPushButton* m_openButton;
+ QPushButton* m_playButton;
+ QPushButton* m_moveUpButton;
+ QPushButton* m_moveDownButton;
+ QPushButton* m_deleteButton;
+ QPushButton* m_clearButton;
+};
+
+
+
+}
+
+#endif
diff --git a/src/gui/editors/segment/PlayListDialog.cpp b/src/gui/editors/segment/PlayListDialog.cpp
new file mode 100644
index 0000000..7aa03a5
--- /dev/null
+++ b/src/gui/editors/segment/PlayListDialog.cpp
@@ -0,0 +1,76 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "PlayListDialog.h"
+
+#include "document/ConfigGroups.h"
+#include "PlayList.h"
+#include <kdialogbase.h>
+#include <qstring.h>
+#include <qwidget.h>
+
+
+namespace Rosegarden
+{
+
+PlayListDialog::PlayListDialog(QString caption,
+ QWidget* parent, const char* name)
+ : KDialogBase(parent, name, false, caption,
+ KDialogBase::Close, // standard buttons
+ KDialogBase::Close, // default button
+ true),
+ m_playList(new PlayList(this))
+{
+ setWFlags(WDestructiveClose);
+ setMainWidget(m_playList);
+ restore();
+}
+
+void PlayListDialog::save()
+{
+ saveDialogSize(PlayListConfigGroup);
+}
+
+void PlayListDialog::restore()
+{
+ setInitialSize(configDialogSize(PlayListConfigGroup));
+}
+
+void PlayListDialog::closeEvent(QCloseEvent *e)
+{
+ save();
+ emit closing();
+ KDialogBase::closeEvent(e);
+}
+
+void PlayListDialog::slotClose()
+{
+ save();
+ emit closing();
+ KDialogBase::slotClose();
+}
+
+}
+#include "PlayListDialog.moc"
diff --git a/src/gui/editors/segment/PlayListDialog.h b/src/gui/editors/segment/PlayListDialog.h
new file mode 100644
index 0000000..51db8ca
--- /dev/null
+++ b/src/gui/editors/segment/PlayListDialog.h
@@ -0,0 +1,71 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_PLAYLISTDIALOG_H_
+#define _RG_PLAYLISTDIALOG_H_
+
+#include <kdialogbase.h>
+#include <qstring.h>
+
+
+class QWidget;
+class QCloseEvent;
+
+
+namespace Rosegarden
+{
+
+class PlayList;
+
+
+class PlayListDialog : public KDialogBase
+{
+ Q_OBJECT
+
+public:
+ PlayListDialog(QString caption, QWidget* parent = 0, const char* name = 0);
+
+ PlayList* getPlayList() { return m_playList; }
+
+public slots:
+ void slotClose();
+
+signals:
+ void closing();
+
+protected:
+ virtual void closeEvent(QCloseEvent *e);
+
+ void save();
+ void restore();
+
+ //--------------- Data members ---------------------------------
+ PlayList* m_playList;
+};
+
+
+}
+
+#endif
diff --git a/src/gui/editors/segment/PlayListView.cpp b/src/gui/editors/segment/PlayListView.cpp
new file mode 100644
index 0000000..8c17076
--- /dev/null
+++ b/src/gui/editors/segment/PlayListView.cpp
@@ -0,0 +1,66 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include "PlayListView.h"
+
+#include <klocale.h>
+#include <qdragobject.h>
+
+namespace Rosegarden {
+
+PlayListView::PlayListView(QWidget *parent, const char *name)
+ : KListView(parent, name)
+{
+ addColumn(i18n("Title"));
+ addColumn(i18n("File name"));
+
+ setDragEnabled(true);
+ setAcceptDrops(true);
+ setDropVisualizer(true);
+
+ setShowToolTips(true);
+ setShowSortIndicator(true);
+ setAllColumnsShowFocus(true);
+ setItemsMovable(true);
+ setSorting(-1);
+}
+
+bool PlayListView::acceptDrag(QDropEvent* e) const
+{
+ return QUriDrag::canDecode(e) || KListView::acceptDrag(e);
+}
+
+
+QListViewItem* PlayListView::previousSibling(QListViewItem* item)
+{
+ QListViewItem* prevSib = firstChild();
+
+ while(prevSib && prevSib->nextSibling() != item)
+ prevSib = prevSib->nextSibling();
+
+ return prevSib;
+}
+
+}
+
diff --git a/src/gui/editors/segment/PlayListView.h b/src/gui/editors/segment/PlayListView.h
new file mode 100644
index 0000000..a18b8e8
--- /dev/null
+++ b/src/gui/editors/segment/PlayListView.h
@@ -0,0 +1,52 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_PLAYLISTVIEW_H_
+#define _RG_PLAYLISTVIEW_H_
+
+#include <klistview.h>
+
+namespace Rosegarden {
+
+class PlayListView : public KListView
+{
+public:
+ PlayListView(QWidget *parent=0, const char *name=0);
+
+ QListViewItem* previousSibling(QListViewItem*);
+
+protected:
+// virtual void dragEnterEvent(QDragEnterEvent *event);
+// virtual void dropEvent(QDropEvent*);
+
+// virtual void dragEnterEvent(QDragEnterEvent*);
+ virtual bool acceptDrag(QDropEvent*) const;
+
+
+};
+
+}
+
+#endif
+
diff --git a/src/gui/editors/segment/PlayListViewItem.cpp b/src/gui/editors/segment/PlayListViewItem.cpp
new file mode 100644
index 0000000..df04a2e
--- /dev/null
+++ b/src/gui/editors/segment/PlayListViewItem.cpp
@@ -0,0 +1,42 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include "PlayListViewItem.h"
+
+namespace Rosegarden {
+
+PlayListViewItem::PlayListViewItem(KListView* parent, KURL kurl)
+ : KListViewItem(parent, kurl.fileName(), kurl.prettyURL()),
+ m_kurl(kurl)
+{
+}
+
+PlayListViewItem::PlayListViewItem(KListView* parent, QListViewItem* after, KURL kurl)
+ : KListViewItem(parent, after, kurl.fileName(), kurl.prettyURL()),
+ m_kurl(kurl)
+{
+}
+
+}
+
diff --git a/src/gui/editors/segment/PlayListViewItem.h b/src/gui/editors/segment/PlayListViewItem.h
new file mode 100644
index 0000000..b88de0f
--- /dev/null
+++ b/src/gui/editors/segment/PlayListViewItem.h
@@ -0,0 +1,47 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_PLAYLISTVIEWITEM_H_
+#define _RG_PLAYLISTVIEWITEM_H_
+
+#include <klistview.h>
+#include <kurl.h>
+
+namespace Rosegarden {
+
+class PlayListViewItem : public KListViewItem
+{
+public:
+ PlayListViewItem(KListView* parent, KURL);
+ PlayListViewItem(KListView* parent, QListViewItem*, KURL);
+
+ const KURL& getURL() { return m_kurl; }
+
+protected:
+ KURL m_kurl;
+};
+
+}
+
+#endif
diff --git a/src/gui/editors/segment/TrackButtons.cpp b/src/gui/editors/segment/TrackButtons.cpp
new file mode 100644
index 0000000..5cf9908
--- /dev/null
+++ b/src/gui/editors/segment/TrackButtons.cpp
@@ -0,0 +1,1149 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "TrackButtons.h"
+#include <qlayout.h>
+
+#include <klocale.h>
+#include <kstddirs.h>
+#include "misc/Debug.h"
+#include "misc/Strings.h"
+#include "base/AudioPluginInstance.h"
+#include "base/Composition.h"
+#include "base/Device.h"
+#include "base/Instrument.h"
+#include "base/MidiProgram.h"
+#include "base/Studio.h"
+#include "base/Track.h"
+#include "commands/segment/RenameTrackCommand.h"
+#include "document/RosegardenGUIDoc.h"
+#include "document/MultiViewCommandHistory.h"
+#include "gui/application/RosegardenGUIApp.h"
+#include "gui/general/GUIPalette.h"
+#include "gui/kdeext/KLedButton.h"
+#include "sound/AudioFileManager.h"
+#include "sound/PluginIdentifier.h"
+#include "TrackLabel.h"
+#include "TrackVUMeter.h"
+#include <kglobal.h>
+#include <kled.h>
+#include <kmessagebox.h>
+#include <qcursor.h>
+#include <qframe.h>
+#include <qiconset.h>
+#include <qlabel.h>
+#include <qobject.h>
+#include <qpixmap.h>
+#include <qpopupmenu.h>
+#include <qsignalmapper.h>
+#include <qstring.h>
+#include <qtimer.h>
+#include <qwidget.h>
+#include <qwidgetstack.h>
+#include <qtooltip.h>
+
+namespace Rosegarden
+{
+
+TrackButtons::TrackButtons(RosegardenGUIDoc* doc,
+ unsigned int trackCellHeight,
+ unsigned int trackLabelWidth,
+ bool showTrackLabels,
+ int overallHeight,
+ QWidget* parent,
+ const char* name,
+ WFlags f)
+ : QFrame(parent, name, f),
+ m_doc(doc),
+ m_layout(new QVBoxLayout(this)),
+ m_recordSigMapper(new QSignalMapper(this)),
+ m_muteSigMapper(new QSignalMapper(this)),
+ m_clickedSigMapper(new QSignalMapper(this)),
+ m_instListSigMapper(new QSignalMapper(this)),
+ m_tracks(doc->getComposition().getNbTracks()),
+ m_offset(4),
+ m_cellSize(trackCellHeight),
+ m_borderGap(1),
+ m_trackLabelWidth(trackLabelWidth),
+ m_popupItem(0),
+ m_lastSelected( -1)
+{
+ setFrameStyle(Plain);
+
+ // when we create the widget, what are we looking at?
+ if (showTrackLabels)
+ m_trackInstrumentLabels = TrackLabel::ShowTrack;
+ else
+ m_trackInstrumentLabels = TrackLabel::ShowInstrument;
+
+ // Set the spacing between vertical elements
+ //
+ m_layout->setSpacing(m_borderGap);
+
+ // Now draw the buttons and labels and meters
+ //
+ makeButtons();
+
+ m_layout->addStretch(20);
+
+ connect(m_recordSigMapper, SIGNAL(mapped(int)),
+ this, SLOT(slotToggleRecordTrack(int)));
+
+ connect(m_muteSigMapper, SIGNAL(mapped(int)),
+ this, SLOT(slotToggleMutedTrack(int)));
+
+ // connect signal mappers
+ connect(m_instListSigMapper, SIGNAL(mapped(int)),
+ this, SLOT(slotInstrumentSelection(int)));
+
+ connect(m_clickedSigMapper, SIGNAL(mapped(int)),
+ this, SIGNAL(trackSelected(int)));
+
+ // // Populate instrument popup menu just once at start-up
+ // //
+ // populateInstrumentPopup();
+
+ // We have to force the height for the moment
+ //
+ setMinimumHeight(overallHeight);
+
+}
+
+TrackButtons::~TrackButtons()
+{}
+
+void
+TrackButtons::makeButtons()
+{
+ if (!m_doc)
+ return ;
+
+ // Create a horizontal box for each track
+ // plus the two buttons
+ //
+ unsigned int nbTracks = m_doc->getComposition().getNbTracks();
+
+ for (unsigned int i = 0; i < nbTracks; ++i) {
+ Track *track = m_doc->getComposition().getTrackByPosition(i);
+
+ if (track) {
+ QFrame *trackHBox = makeButton(track->getId());
+
+ if (trackHBox) {
+ m_layout->addWidget(trackHBox);
+ m_trackHBoxes.push_back(trackHBox);
+ }
+ }
+ }
+
+ populateButtons();
+}
+
+void TrackButtons::setButtonMapping(QObject* obj, TrackId trackId)
+{
+ m_clickedSigMapper->setMapping(obj, trackId);
+ m_instListSigMapper->setMapping(obj, trackId);
+}
+
+void
+TrackButtons::populateButtons()
+{
+ Instrument *ins = 0;
+ Track *track;
+
+ for (unsigned int i = 0; i < m_trackLabels.size(); ++i) {
+ track = m_doc->getComposition().getTrackByPosition(i);
+
+ if (track) {
+ ins = m_doc->getStudio().getInstrumentById(track->getInstrument());
+
+ // Set mute button from track
+ //
+ if (track->isMuted())
+ m_muteLeds[i]->off();
+ else
+ m_muteLeds[i]->on();
+
+ // Set record button from track
+ //
+ bool recording =
+ m_doc->getComposition().isTrackRecording(track->getId());
+ setRecordTrack(track->getPosition(), recording);
+
+ // reset track tokens
+ m_trackLabels[i]->setId(track->getId());
+ setButtonMapping(m_trackLabels[i], track->getId());
+ m_trackLabels[i]->setPosition(i);
+ }
+
+ if (ins) {
+ m_trackLabels[i]->getInstrumentLabel()->setText
+ (strtoqstr(ins->getPresentationName()));
+ if (ins->sendsProgramChange()) {
+ m_trackLabels[i]->setAlternativeLabel(strtoqstr(ins->getProgramName()));
+ }
+
+ } else {
+ m_trackLabels[i]->getInstrumentLabel()->setText(i18n("<no instrument>"));
+ }
+
+ m_trackLabels[i]->update();
+ }
+
+}
+
+std::vector<int>
+TrackButtons::mutedTracks()
+{
+ std::vector<int> mutedTracks;
+
+ for (TrackId i = 0; i < m_tracks; i++) {
+ if (m_muteLeds[i]->state() == KLed::Off)
+ mutedTracks.push_back(i);
+ }
+
+ return mutedTracks;
+}
+
+void
+TrackButtons::slotToggleMutedTrack(int mutedTrackPos)
+{
+ RG_DEBUG << "TrackButtons::slotToggleMutedTrack(" << mutedTrackPos << ")\n";
+
+ if (mutedTrackPos < 0 || mutedTrackPos > (int)m_tracks )
+ return ;
+
+ Track *track =
+ m_doc->getComposition().getTrackByPosition(mutedTrackPos);
+
+ emit muteButton(track->getId(), !track->isMuted()); // will set the value
+}
+
+void
+TrackButtons::removeButtons(unsigned int position)
+{
+ RG_DEBUG << "TrackButtons::removeButtons - "
+ << "deleting track button at position "
+ << position << endl;
+
+ if (position >= m_trackHBoxes.size()) {
+ RG_DEBUG << "%%%%%%%%% BIG PROBLEM : TrackButtons::removeButtons() was passed a non-existing index\n";
+ return ;
+ }
+
+ std::vector<TrackLabel*>::iterator tit = m_trackLabels.begin();
+ tit += position;
+ m_trackLabels.erase(tit);
+
+ std::vector<TrackVUMeter*>::iterator vit = m_trackMeters.begin();
+ vit += position;
+ m_trackMeters.erase(vit);
+
+ std::vector<KLedButton*>::iterator mit = m_muteLeds.begin();
+ mit += position;
+ m_muteLeds.erase(mit);
+
+ mit = m_recordLeds.begin();
+ mit += position;
+ m_recordLeds.erase(mit);
+
+ delete m_trackHBoxes[position]; // deletes all child widgets (button, led, label...)
+
+ std::vector<QFrame*>::iterator it = m_trackHBoxes.begin();
+ it += position;
+ m_trackHBoxes.erase(it);
+
+}
+
+void
+TrackButtons::slotUpdateTracks()
+{
+ Composition &comp = m_doc->getComposition();
+ unsigned int newNbTracks = comp.getNbTracks();
+ Track *track = 0;
+
+ std::cerr << "TrackButtons::slotUpdateTracks" << std::endl;
+
+ if (newNbTracks < m_tracks) {
+ for (unsigned int i = m_tracks; i > newNbTracks; --i)
+ removeButtons(i - 1);
+ } else if (newNbTracks > m_tracks) {
+ for (unsigned int i = m_tracks; i < newNbTracks; ++i) {
+ track = m_doc->getComposition().getTrackByPosition(i);
+ if (track) {
+ QFrame *trackHBox = makeButton(track->getId());
+
+ if (trackHBox) {
+ trackHBox->show();
+ m_layout->insertWidget(i, trackHBox);
+ m_trackHBoxes.push_back(trackHBox);
+ }
+ } else
+ RG_DEBUG << "TrackButtons::slotUpdateTracks - can't find TrackId for position " << i << endl;
+ }
+ }
+
+ // Set height
+ //
+ for (unsigned int i = 0; i < m_trackHBoxes.size(); ++i) {
+
+ track = comp.getTrackByPosition(i);
+
+ if (track) {
+
+ int multiple = m_doc->getComposition()
+ .getMaxContemporaneousSegmentsOnTrack(track->getId());
+ if (multiple == 0) multiple = 1;
+
+ // nasty dupe from makeButton
+
+ int buttonGap = 8;
+ int vuWidth = 20;
+ int vuSpacing = 2;
+
+ int labelWidth = m_trackLabelWidth -
+ ((m_cellSize - buttonGap) * 2 +
+ vuSpacing * 2 + vuWidth);
+
+ m_trackHBoxes[i]->setMinimumSize
+ (labelWidth, m_cellSize * multiple - m_borderGap);
+
+ m_trackHBoxes[i]->setFixedHeight
+ (m_cellSize * multiple - m_borderGap);
+ }
+ }
+
+ // Renumber all the labels
+ //
+ for (unsigned int i = 0; i < m_trackLabels.size(); ++i) {
+ track = comp.getTrackByPosition(i);
+
+ if (track) {
+ m_trackLabels[i]->setId(track->getId());
+
+ QLabel *trackLabel = m_trackLabels[i]->getTrackLabel();
+
+ if (track->getLabel() == std::string("")) {
+ Instrument *ins =
+ m_doc->getStudio().getInstrumentById(track->getInstrument());
+ if (ins && ins->getType() == Instrument::Audio) {
+ trackLabel->setText(i18n("<untitled audio>"));
+ } else {
+ trackLabel->setText(i18n("<untitled>"));
+ }
+ } else {
+ trackLabel->setText(strtoqstr(track->getLabel()));
+ }
+
+ // RG_DEBUG << "TrackButtons::slotUpdateTracks - set button mapping at pos "
+ // << i << " to track id " << track->getId() << endl;
+ setButtonMapping(m_trackLabels[i], track->getId());
+ }
+ }
+ m_tracks = newNbTracks;
+
+ // Set record status and colour
+
+ for (unsigned int i = 0; i < m_trackLabels.size(); ++i) {
+
+ track = comp.getTrackByPosition(i);
+
+ if (track) {
+
+ setRecordTrack(i, comp.isTrackRecording(track->getId()));
+
+ Instrument *ins =
+ m_doc->getStudio().getInstrumentById(track->getInstrument());
+
+ if (ins &&
+ ins->getType() == Instrument::Audio) {
+ m_recordLeds[i]->setColor
+ (GUIPalette::getColour
+ (GUIPalette::RecordAudioTrackLED));
+ } else {
+ m_recordLeds[i]->setColor
+ (GUIPalette::getColour
+ (GUIPalette::RecordMIDITrackLED));
+ }
+ }
+ }
+
+ // repopulate the buttons
+ populateButtons();
+}
+
+void
+TrackButtons::slotToggleRecordTrack(int position)
+{
+ Composition &comp = m_doc->getComposition();
+ Track *track = comp.getTrackByPosition(position);
+
+ bool state = !comp.isTrackRecording(track->getId());
+
+ Instrument *instrument = m_doc->getStudio().getInstrumentById
+ (track->getInstrument());
+
+ bool audio = (instrument &&
+ instrument->getType() == Instrument::Audio);
+
+ if (audio && state) {
+ try {
+ m_doc->getAudioFileManager().testAudioPath();
+ } catch (AudioFileManager::BadAudioPathException e) {
+ if (KMessageBox::warningContinueCancel
+ (this,
+ i18n("The audio file path does not exist or is not writable.\nPlease set the audio file path to a valid directory in Document Properties before recording audio.\nWould you like to set it now?"),
+ i18n("Warning"),
+ i18n("Set audio file path")) == KMessageBox::Continue) {
+ RosegardenGUIApp::self()->slotOpenAudioPathSettings();
+ }
+ }
+ }
+
+ // can have any number of audio instruments armed, but only one
+ // track armed per instrument.
+
+ // Need to copy this container, as we're implicitly modifying it
+ // through calls to comp.setTrackRecording
+
+ Composition::recordtrackcontainer oldRecordTracks =
+ comp.getRecordTracks();
+
+ for (Composition::recordtrackcontainer::const_iterator i =
+ oldRecordTracks.begin();
+ i != oldRecordTracks.end(); ++i) {
+
+ if (!comp.isTrackRecording(*i)) {
+ // We've already reset this one
+ continue;
+ }
+
+ Track *otherTrack = comp.getTrackById(*i);
+
+ if (otherTrack &&
+ otherTrack != track) {
+
+ /* Obsolete code: audio, MIDI and plugin tracks behave the same now.
+ plcl, 06/2006 - Multitrack MIDI recording
+
+ bool unselect;
+
+ if (audio) {
+ unselect = (otherTrack->getInstrument() == track->getInstrument());
+ } else {
+ // our track is not an audio track, check that the
+ // other isn't either
+ Instrument *otherInstrument =
+ m_doc->getStudio().getInstrumentById(otherTrack->getInstrument());
+ bool otherAudio = (otherInstrument &&
+ otherInstrument->getType() ==
+ Instrument::Audio);
+
+ unselect = !otherAudio;
+ }
+
+ if (unselect) { */
+
+ if (otherTrack->getInstrument() == track->getInstrument()) {
+ // found another record track of the same type (and
+ // with the same instrument, if audio): unselect that
+
+ //!!! should we tell the user, particularly for the
+ //audio case? might seem odd otherwise
+
+ int otherPos = otherTrack->getPosition();
+ setRecordTrack(otherPos, false);
+ }
+ }
+ }
+
+ setRecordTrack(position, state);
+
+ emit recordButton(track->getId(), state);
+}
+
+void
+TrackButtons::setRecordTrack(int position, bool state)
+{
+ setRecordButton(position, state);
+ m_doc->getComposition().setTrackRecording
+ (m_trackLabels[position]->getId(), state);
+}
+
+void
+TrackButtons::setRecordButton(int position, bool state)
+{
+ if (position < 0 || position >= (int)m_tracks)
+ return ;
+
+ KLedButton* led = m_recordLeds[position];
+
+ led->setState(state ? KLed::On : KLed::Off);
+}
+
+void
+TrackButtons::selectLabel(int position)
+{
+ if (m_lastSelected >= 0 && m_lastSelected < (int)m_trackLabels.size()) {
+ m_trackLabels[m_lastSelected]->setSelected(false);
+ }
+
+ if (position >= 0 && position < (int)m_trackLabels.size()) {
+ m_trackLabels[position]->setSelected(true);
+ m_lastSelected = position;
+ }
+}
+
+std::vector<int>
+TrackButtons::getHighlightedTracks()
+{
+ std::vector<int> retList;
+
+ for (unsigned int i = 0; i < m_trackLabels.size(); ++i) {
+ if (m_trackLabels[i]->isSelected())
+ retList.push_back(i);
+ }
+
+ return retList;
+}
+
+void
+TrackButtons::slotRenameTrack(QString newName, TrackId trackId)
+{
+ m_doc->getCommandHistory()->addCommand
+ (new RenameTrackCommand(&m_doc->getComposition(),
+ trackId,
+ qstrtostr(newName)));
+
+ changeTrackLabel(trackId, newName);
+}
+
+void
+TrackButtons::slotSetTrackMeter(float value, int position)
+{
+ //Composition &comp = m_doc->getComposition();
+ //Studio &studio = m_doc->getStudio();
+ //Track *track;
+
+ for (unsigned int i = 0; i < m_trackMeters.size(); ++i) {
+ if (i == ((unsigned int)position)) {
+ m_trackMeters[i]->setLevel(value);
+ return ;
+ }
+ }
+}
+
+void
+TrackButtons::slotSetMetersByInstrument(float value,
+ InstrumentId id)
+{
+ Composition &comp = m_doc->getComposition();
+ //Studio &studio = m_doc->getStudio();
+ Track *track;
+
+ for (unsigned int i = 0; i < m_trackMeters.size(); ++i) {
+ track = comp.getTrackByPosition(i);
+
+ if (track != 0 && track->getInstrument() == id) {
+ m_trackMeters[i]->setLevel(value);
+ }
+ }
+}
+
+void
+TrackButtons::slotInstrumentSelection(int trackId)
+{
+ RG_DEBUG << "TrackButtons::slotInstrumentSelection(" << trackId << ")\n";
+
+ Composition &comp = m_doc->getComposition();
+ Studio &studio = m_doc->getStudio();
+
+ int position = comp.getTrackById(trackId)->getPosition();
+
+ QString instrumentName = i18n("<no instrument>");
+ Track *track = comp.getTrackByPosition(position);
+
+ Instrument *instrument = 0;
+ if (track != 0) {
+ instrument = studio.getInstrumentById(track->getInstrument());
+ if (instrument)
+ instrumentName = strtoqstr(instrument->getPresentationName());
+ }
+
+ //
+ // populate this instrument widget
+ m_trackLabels[position]->getInstrumentLabel()->setText(instrumentName);
+
+ // Ensure the instrument name is shown
+ m_trackLabels[position]->showLabel(TrackLabel::ShowInstrument);
+
+ // Yes, well as we might've changed the Device name in the
+ // Device/Bank dialog then we reload the whole menu here.
+ //
+
+ QPopupMenu instrumentPopup(this);
+
+ populateInstrumentPopup(instrument, &instrumentPopup);
+
+ // Store the popup item position
+ //
+ m_popupItem = position;
+
+ instrumentPopup.exec(QCursor::pos());
+
+ // Restore the label back to what it was showing
+ m_trackLabels[position]->showLabel(m_trackInstrumentLabels);
+
+ // Do this here as well as in slotInstrumentPopupActivated, so as
+ // to restore the correct alternative label even if no other
+ // program was selected from the menu
+ if (track != 0) {
+ instrument = studio.getInstrumentById(track->getInstrument());
+ if (instrument) {
+ m_trackLabels[position]->getInstrumentLabel()->
+ setText(strtoqstr(instrument->getPresentationName()));
+ m_trackLabels[position]->clearAlternativeLabel();
+ if (instrument->sendsProgramChange()) {
+ m_trackLabels[position]->setAlternativeLabel
+ (strtoqstr(instrument->getProgramName()));
+ }
+ }
+ }
+}
+
+void
+TrackButtons::populateInstrumentPopup(Instrument *thisTrackInstr, QPopupMenu* instrumentPopup)
+{
+ static QPixmap connectedPixmap, unconnectedPixmap,
+ connectedUsedPixmap, unconnectedUsedPixmap,
+ connectedSelectedPixmap, unconnectedSelectedPixmap;
+ static bool havePixmaps = false;
+
+ if (!havePixmaps) {
+
+ QString pixmapDir =
+ KGlobal::dirs()->findResource("appdata", "pixmaps/");
+
+ connectedPixmap.load
+ (QString("%1/misc/connected.xpm").arg(pixmapDir));
+ connectedUsedPixmap.load
+ (QString("%1/misc/connected-used.xpm").arg(pixmapDir));
+ connectedSelectedPixmap.load
+ (QString("%1/misc/connected-selected.xpm").arg(pixmapDir));
+ unconnectedPixmap.load
+ (QString("%1/misc/unconnected.xpm").arg(pixmapDir));
+ unconnectedUsedPixmap.load
+ (QString("%1/misc/unconnected-used.xpm").arg(pixmapDir));
+ unconnectedSelectedPixmap.load
+ (QString("%1/misc/unconnected-selected.xpm").arg(pixmapDir));
+
+ havePixmaps = true;
+ }
+
+ Composition &comp = m_doc->getComposition();
+ Studio &studio = m_doc->getStudio();
+
+ // clear the popup
+ instrumentPopup->clear();
+
+ std::vector<QPopupMenu*> instrumentSubMenus;
+
+ // position index
+ int i = 0;
+
+ // Get the list
+ InstrumentList list = studio.getPresentationInstruments();
+ InstrumentList::iterator it;
+ int currentDevId = -1;
+ bool deviceUsedByAnyone = false;
+
+ for (it = list.begin(); it != list.end(); it++) {
+
+ if (! (*it))
+ continue; // sanity check
+
+ QString iname(strtoqstr((*it)->getPresentationName()));
+ QString pname(strtoqstr((*it)->getProgramName()));
+ Device *device = (*it)->getDevice();
+ DeviceId devId = device->getId();
+ bool connected = false;
+
+ if ((*it)->getType() == Instrument::SoftSynth) {
+ pname = "";
+ AudioPluginInstance *plugin = (*it)->getPlugin
+ (Instrument::SYNTH_PLUGIN_POSITION);
+ if (plugin) {
+ pname = strtoqstr(plugin->getProgram());
+ QString identifier = strtoqstr(plugin->getIdentifier());
+ if (identifier != "") {
+ connected = true;
+ QString type, soName, label;
+ PluginIdentifier::parseIdentifier
+ (identifier, type, soName, label);
+ if (pname == "") {
+ pname = strtoqstr(plugin->getDistinctiveConfigurationText());
+ }
+ if (pname != "") {
+ pname = QString("%1: %2").arg(label).arg(pname);
+ } else {
+ pname = label;
+ }
+ } else {
+ connected = false;
+ }
+ }
+ } else if ((*it)->getType() == Instrument::Audio) {
+ connected = true;
+ } else {
+ connected = (device->getConnection() != "");
+ }
+
+ bool instrUsedByMe = false;
+ bool instrUsedByAnyone = false;
+
+ if (thisTrackInstr && thisTrackInstr->getId() == (*it)->getId()) {
+ instrUsedByMe = true;
+ instrUsedByAnyone = true;
+ }
+
+ if (devId != (DeviceId)(currentDevId)) {
+
+ deviceUsedByAnyone = false;
+
+ if (instrUsedByMe)
+ deviceUsedByAnyone = true;
+ else {
+ for (Composition::trackcontainer::iterator tit =
+ comp.getTracks().begin();
+ tit != comp.getTracks().end(); ++tit) {
+
+ if (tit->second->getInstrument() == (*it)->getId()) {
+ instrUsedByAnyone = true;
+ deviceUsedByAnyone = true;
+ break;
+ }
+
+ Instrument *instr =
+ studio.getInstrumentById(tit->second->getInstrument());
+ if (instr && (instr->getDevice()->getId() == devId)) {
+ deviceUsedByAnyone = true;
+ }
+ }
+ }
+
+ QIconSet iconSet
+ (connected ?
+ (deviceUsedByAnyone ?
+ connectedUsedPixmap : connectedPixmap) :
+ (deviceUsedByAnyone ?
+ unconnectedUsedPixmap : unconnectedPixmap));
+
+ currentDevId = int(devId);
+
+ QPopupMenu *subMenu = new QPopupMenu(instrumentPopup);
+ QString deviceName = strtoqstr(device->getName());
+ instrumentPopup->insertItem(iconSet, deviceName, subMenu);
+ instrumentSubMenus.push_back(subMenu);
+
+ // Connect up the submenu
+ //
+ connect(subMenu, SIGNAL(activated(int)),
+ SLOT(slotInstrumentPopupActivated(int)));
+
+ } else if (!instrUsedByMe) {
+
+ for (Composition::trackcontainer::iterator tit =
+ comp.getTracks().begin();
+ tit != comp.getTracks().end(); ++tit) {
+
+ if (tit->second->getInstrument() == (*it)->getId()) {
+ instrUsedByAnyone = true;
+ break;
+ }
+ }
+ }
+
+ QIconSet iconSet
+ (connected ?
+ (instrUsedByAnyone ?
+ instrUsedByMe ?
+ connectedSelectedPixmap :
+ connectedUsedPixmap : connectedPixmap) :
+ (instrUsedByAnyone ?
+ instrUsedByMe ?
+ unconnectedSelectedPixmap :
+ unconnectedUsedPixmap : unconnectedPixmap));
+
+ if (pname != "")
+ iname += " (" + pname + ")";
+
+ instrumentSubMenus[instrumentSubMenus.size() - 1]->insertItem(iconSet, iname, i++);
+ }
+
+}
+
+void
+TrackButtons::slotInstrumentPopupActivated(int item)
+{
+ RG_DEBUG << "TrackButtons::slotInstrumentPopupActivated " << item << endl;
+
+ Composition &comp = m_doc->getComposition();
+ Studio &studio = m_doc->getStudio();
+
+ Instrument *inst = studio.getInstrumentFromList(item);
+
+ RG_DEBUG << "TrackButtons::slotInstrumentPopupActivated: instrument " << inst << endl;
+
+ if (inst != 0) {
+ Track *track = comp.getTrackByPosition(m_popupItem);
+
+ if (track != 0) {
+ track->setInstrument(inst->getId());
+
+ // select instrument
+ emit instrumentSelected((int)inst->getId());
+
+ m_trackLabels[m_popupItem]->getInstrumentLabel()->
+ setText(strtoqstr(inst->getPresentationName()));
+
+ // reset the alternative label
+ m_trackLabels[m_popupItem]->clearAlternativeLabel();
+
+ // Now see if the program is being shown for this instrument
+ // and if so reset the label
+ //
+ if (inst->sendsProgramChange())
+ m_trackLabels[m_popupItem]->setAlternativeLabel(strtoqstr(inst->getProgramName()));
+
+ if (inst->getType() == Instrument::Audio) {
+ m_recordLeds[m_popupItem]->setColor
+ (GUIPalette::getColour
+ (GUIPalette::RecordAudioTrackLED));
+ } else {
+ m_recordLeds[m_popupItem]->setColor
+ (GUIPalette::getColour
+ (GUIPalette::RecordMIDITrackLED));
+ }
+ } else
+ RG_DEBUG << "slotInstrumentPopupActivated() - can't find item!\n";
+ } else
+ RG_DEBUG << "slotInstrumentPopupActivated() - can't find item!\n";
+
+}
+
+void
+TrackButtons::changeTrackInstrumentLabels(TrackLabel::InstrumentTrackLabels label)
+{
+ // Set new label
+ m_trackInstrumentLabels = label;
+
+ // update and reconnect with new value
+ for (int i = 0; i < (int)m_tracks; i++) {
+ m_trackLabels[i]->showLabel(label);
+ }
+}
+
+void
+TrackButtons::changeInstrumentLabel(InstrumentId id, QString label)
+{
+ Composition &comp = m_doc->getComposition();
+ Track *track;
+
+ for (int i = 0; i < (int)m_tracks; i++) {
+ track = comp.getTrackByPosition(i);
+
+ if (track && track->getInstrument() == id) {
+
+ m_trackLabels[i]->setAlternativeLabel(label);
+
+ Instrument *ins = m_doc->getStudio().
+ getInstrumentById(track->getInstrument());
+
+ if (ins && ins->getType() == Instrument::Audio) {
+ m_recordLeds[i]->setColor
+ (GUIPalette::getColour
+ (GUIPalette::RecordAudioTrackLED));
+ } else {
+ m_recordLeds[i]->setColor
+ (GUIPalette::getColour
+ (GUIPalette::RecordMIDITrackLED));
+ }
+ }
+ }
+}
+
+void
+TrackButtons::changeTrackLabel(TrackId id, QString label)
+{
+ Composition &comp = m_doc->getComposition();
+ Track *track;
+
+ for (int i = 0; i < (int)m_tracks; i++) {
+ track = comp.getTrackByPosition(i);
+ if (track && track->getId() == id) {
+ if (m_trackLabels[i]->getTrackLabel()->text() != label) {
+ m_trackLabels[i]->getTrackLabel()->setText(label);
+ emit widthChanged();
+ emit nameChanged();
+ }
+ return ;
+ }
+ }
+}
+
+void
+TrackButtons::slotSynchroniseWithComposition()
+{
+ Composition &comp = m_doc->getComposition();
+ Studio &studio = m_doc->getStudio();
+ Track *track;
+
+ for (int i = 0; i < (int)m_tracks; i++) {
+ track = comp.getTrackByPosition(i);
+
+ if (track) {
+ if (track->isMuted())
+ m_muteLeds[i]->off();
+ else
+ m_muteLeds[i]->on();
+
+ Instrument *ins = studio.
+ getInstrumentById(track->getInstrument());
+
+ QString instrumentName(i18n("<no instrument>"));
+ if (ins)
+ instrumentName = strtoqstr(ins->getPresentationName());
+
+ m_trackLabels[i]->getInstrumentLabel()->setText(instrumentName);
+
+ setRecordButton(i, comp.isTrackRecording(track->getId()));
+
+ if (ins && ins->getType() == Instrument::Audio) {
+ m_recordLeds[i]->setColor
+ (GUIPalette::getColour
+ (GUIPalette::RecordAudioTrackLED));
+ } else {
+ m_recordLeds[i]->setColor
+ (GUIPalette::getColour
+ (GUIPalette::RecordMIDITrackLED));
+ }
+ }
+ }
+}
+
+void
+TrackButtons::slotLabelSelected(int position)
+{
+ Track *track =
+ m_doc->getComposition().getTrackByPosition(position);
+
+ if (track) {
+ emit trackSelected(track->getId());
+ }
+}
+
+void
+TrackButtons::setMuteButton(TrackId track, bool value)
+{
+ Track *trackObj = m_doc->getComposition().getTrackById(track);
+ if (trackObj == 0)
+ return ;
+
+ int pos = trackObj->getPosition();
+
+ RG_DEBUG << "TrackButtons::setMuteButton() trackId = "
+ << track << ", pos = " << pos << endl;
+
+ m_muteLeds[pos]->setState(value ? KLed::Off : KLed::On);
+}
+
+void
+TrackButtons::slotTrackInstrumentSelection(TrackId trackId, int item)
+{
+ RG_DEBUG << "TrackButtons::slotTrackInstrumentSelection(" << trackId << ")\n";
+
+ Composition &comp = m_doc->getComposition();
+ int position = comp.getTrackById(trackId)->getPosition();
+ m_popupItem = position;
+ slotInstrumentPopupActivated( item );
+}
+
+QFrame* TrackButtons::makeButton(Rosegarden::TrackId trackId)
+{
+ // The buttonGap sets up the sizes of the buttons
+ //
+ static const int buttonGap = 8;
+
+ QFrame *trackHBox = 0;
+
+ KLedButton *mute = 0;
+ KLedButton *record = 0;
+
+ TrackVUMeter *vuMeter = 0;
+ TrackLabel *trackLabel = 0;
+
+ int vuWidth = 20;
+ int vuSpacing = 2;
+ int multiple = m_doc->getComposition()
+ .getMaxContemporaneousSegmentsOnTrack(trackId);
+ if (multiple == 0) multiple = 1;
+ int labelWidth = m_trackLabelWidth - ( (m_cellSize - buttonGap) * 2 +
+ vuSpacing * 2 + vuWidth );
+
+ // Set the label from the Track object on the Composition
+ //
+ Rosegarden::Track *track = m_doc->getComposition().getTrackById(trackId);
+
+ if (track == 0) return 0;
+
+ // Create a horizontal box for each track
+ //
+ trackHBox = new QFrame(this);
+ QHBoxLayout *hblayout = new QHBoxLayout(trackHBox);
+
+ trackHBox->setMinimumSize(labelWidth, m_cellSize * multiple - m_borderGap);
+ trackHBox->setFixedHeight(m_cellSize * multiple - m_borderGap);
+
+ // Try a style for the box
+ //
+ trackHBox->setFrameStyle(StyledPanel);
+ trackHBox->setFrameShape(StyledPanel);
+ trackHBox->setFrameShadow(Raised);
+
+ // Insert a little gap
+ hblayout->addSpacing(vuSpacing);
+
+ // Create a VU meter
+ vuMeter = new TrackVUMeter(trackHBox,
+ VUMeter::PeakHold,
+ vuWidth,
+ buttonGap,
+ track->getPosition());
+
+ m_trackMeters.push_back(vuMeter);
+
+ hblayout->addWidget(vuMeter);
+
+ // Create another little gap
+ hblayout->addSpacing(vuSpacing);
+
+ //
+ // 'mute' and 'record' leds
+ //
+
+ mute = new KLedButton(Rosegarden::GUIPalette::getColour
+ (Rosegarden::GUIPalette::MuteTrackLED), trackHBox);
+ QToolTip::add(mute, i18n("Mute track"));
+ hblayout->addWidget(mute);
+
+ record = new KLedButton(Rosegarden::GUIPalette::getColour
+ (Rosegarden::GUIPalette::RecordMIDITrackLED), trackHBox);
+ QToolTip::add(record, i18n("Record on this track"));
+ hblayout->addWidget(record);
+
+ record->setLook(KLed::Sunken);
+ mute->setLook(KLed::Sunken);
+ record->off();
+
+ // Connect them to their sigmappers
+ connect(record, SIGNAL(stateChanged(bool)),
+ m_recordSigMapper, SLOT(map()));
+ connect(mute, SIGNAL(stateChanged(bool)),
+ m_muteSigMapper, SLOT(map()));
+ m_recordSigMapper->setMapping(record, track->getPosition());
+ m_muteSigMapper->setMapping(mute, track->getPosition());
+
+ // Store the KLedButton
+ //
+ m_muteLeds.push_back(mute);
+ m_recordLeds.push_back(record);
+
+ //
+ // Track label
+ //
+ trackLabel = new TrackLabel(trackId, track->getPosition(), trackHBox);
+ hblayout->addWidget(trackLabel);
+ hblayout->addSpacing(vuSpacing);
+
+ if (track->getLabel() == std::string("")) {
+ Rosegarden::Instrument *ins =
+ m_doc->getStudio().getInstrumentById(track->getInstrument());
+ if (ins && ins->getType() == Rosegarden::Instrument::Audio) {
+ trackLabel->getTrackLabel()->setText(i18n("<untitled audio>"));
+ } else {
+ trackLabel->getTrackLabel()->setText(i18n("<untitled>"));
+ }
+ }
+ else
+ trackLabel->getTrackLabel()->setText(strtoqstr(track->getLabel()));
+
+ trackLabel->setFixedSize(labelWidth, m_cellSize - buttonGap);
+ trackLabel->setFixedHeight(m_cellSize - buttonGap);
+ trackLabel->setIndent(7);
+
+ connect(trackLabel, SIGNAL(renameTrack(QString, TrackId)),
+ SLOT(slotRenameTrack(QString, TrackId)));
+
+ // Store the TrackLabel pointer
+ //
+ m_trackLabels.push_back(trackLabel);
+
+ // Connect it
+ setButtonMapping(trackLabel, trackId);
+
+ connect(trackLabel, SIGNAL(changeToInstrumentList()),
+ m_instListSigMapper, SLOT(map()));
+ connect(trackLabel, SIGNAL(clicked()),
+ m_clickedSigMapper, SLOT(map()));
+
+ //
+ // instrument label
+ //
+ Rosegarden::Instrument *ins =
+ m_doc->getStudio().getInstrumentById(track->getInstrument());
+
+ QString instrumentName(i18n("<no instrument>"));
+ if (ins) instrumentName = strtoqstr(ins->getPresentationName());
+
+ // Set label to program change if it's being sent
+ //
+ if (ins != 0 && ins->sendsProgramChange())
+ trackLabel->setAlternativeLabel(strtoqstr(ins->getProgramName()));
+
+ trackLabel->showLabel(m_trackInstrumentLabels);
+
+ mute->setFixedSize(m_cellSize - buttonGap, m_cellSize - buttonGap);
+ record->setFixedSize(m_cellSize - buttonGap, m_cellSize - buttonGap);
+
+ // set the mute button
+ //
+ if (track->isMuted())
+ mute->off();
+
+ return trackHBox;
+}
+
+}
+#include "TrackButtons.moc"
diff --git a/src/gui/editors/segment/TrackButtons.h b/src/gui/editors/segment/TrackButtons.h
new file mode 100644
index 0000000..a61601d
--- /dev/null
+++ b/src/gui/editors/segment/TrackButtons.h
@@ -0,0 +1,228 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_TRACKBUTTONS_H_
+#define _RG_TRACKBUTTONS_H_
+
+#include "base/MidiProgram.h"
+#include "base/Track.h"
+#include "gui/application/RosegardenGUIApp.h"
+#include "TrackLabel.h"
+#include <qframe.h>
+#include <qstring.h>
+#include <vector>
+
+
+class QWidget;
+class QVBoxLayout;
+class QSignalMapper;
+class QPopupMenu;
+class QObject;
+
+
+namespace Rosegarden
+{
+
+class TrackVUMeter;
+class RosegardenGUIDoc;
+class KLedButton;
+class Instrument;
+
+
+class TrackButtons : public QFrame
+{
+ Q_OBJECT
+public:
+
+ TrackButtons(RosegardenGUIDoc* doc,
+ unsigned int trackCellHeight,
+ unsigned int trackLabelWidth,
+ bool showTrackLabels,
+ int overallHeight,
+ QWidget* parent = 0,
+ const char* name = 0,
+ WFlags f=0);
+
+ ~TrackButtons();
+
+ /// Return a vector of muted tracks
+ std::vector<int> mutedTracks();
+
+ /// Return a vector of highlighted tracks
+ std::vector<int> getHighlightedTracks();
+
+ void changeTrackInstrumentLabels(TrackLabel::InstrumentTrackLabels label);
+
+ /**
+ * Change the instrument label to something else like
+ * an actual program name rather than a meaningless
+ * device number and midi channel
+ */
+ void changeInstrumentLabel(InstrumentId id, QString label);
+
+ void changeTrackLabel(TrackId id, QString label);
+
+ // Select a label from outside this class by position
+ //
+ void selectLabel(int trackId);
+
+ /*
+ * Set the mute button down or up
+ */
+ void setMuteButton(TrackId track, bool value);
+
+ /*
+ * Make this available so that others can set record buttons down
+ */
+ void setRecordTrack(int position, bool value);
+
+ /**
+ * Precalculate the Instrument popup so we don't have to every
+ * time it appears
+ * not protected because also used by the RosegardenGUIApp
+ *
+ * @see RosegardenGUIApp#slotPopulateTrackInstrumentPopup()
+ */
+ void populateInstrumentPopup(Instrument *thisTrackInstr, QPopupMenu* instrumentPopup);
+
+signals:
+ // to emit what Track has been selected
+ //
+ void trackSelected(int);
+ void instrumentSelected(int);
+
+ void widthChanged();
+
+ // to tell the notation canvas &c when a name changes
+ //
+ void nameChanged();
+
+ // document modified (mute button)
+ //
+ void modified();
+
+ // A record button has been pressed - if we're setting to an audio
+ // track we need to tell the sequencer for live monitoring
+ // purposes.
+ //
+ void recordButton(TrackId track, bool state);
+
+ // A mute button has been pressed
+ //
+ void muteButton(TrackId track, bool state);
+
+public slots:
+
+ void slotToggleRecordTrack(int position);
+ void slotToggleMutedTrack(int mutedTrack);
+ void slotUpdateTracks();
+ void slotRenameTrack(QString newName, TrackId trackId);
+ void slotSetTrackMeter(float value, int position);
+ void slotSetMetersByInstrument(float value, InstrumentId id);
+
+ void slotInstrumentSelection(int);
+ void slotInstrumentPopupActivated(int);
+ void slotTrackInstrumentSelection(TrackId, int);
+
+ // ensure track buttons match the Composition
+ //
+ void slotSynchroniseWithComposition();
+
+ // Convert a positional selection into a track selection and re-emit
+ //
+ void slotLabelSelected(int position);
+
+protected:
+
+ /**
+ * Populate the track buttons themselves with Instrument information
+ */
+ void populateButtons();
+
+ /**
+ * Remove buttons and clear iterators for a position
+ */
+ void removeButtons(unsigned int position);
+
+ /**
+ * Set record button - graphically only
+ */
+ void setRecordButton(int position, bool down);
+
+ /**
+ * buttons, starting at the specified index
+ */
+ void makeButtons();
+
+ QFrame* makeButton(TrackId trackId);
+ QString getPresentationName(Instrument *);
+
+ void setButtonMapping(QObject*, TrackId);
+
+ //--------------- Data members ---------------------------------
+
+ RosegardenGUIDoc *m_doc;
+
+ QVBoxLayout *m_layout;
+
+ std::vector<KLedButton *> m_muteLeds;
+ std::vector<KLedButton *> m_recordLeds;
+ std::vector<TrackLabel *> m_trackLabels;
+ std::vector<TrackVUMeter *> m_trackMeters;
+ std::vector<QFrame *> m_trackHBoxes;
+
+ QSignalMapper *m_recordSigMapper;
+ QSignalMapper *m_muteSigMapper;
+ QSignalMapper *m_clickedSigMapper;
+ QSignalMapper *m_instListSigMapper;
+
+ // Number of tracks on our view
+ //
+ unsigned int m_tracks;
+
+ // The pixel offset from the top - just to overcome
+ // the borders
+ int m_offset;
+
+ // The height of the cells
+ //
+ int m_cellSize;
+
+ // gaps between elements
+ //
+ int m_borderGap;
+
+ int m_trackLabelWidth;
+ int m_popupItem;
+
+ TrackLabel::InstrumentTrackLabels m_trackInstrumentLabels;
+ int m_lastSelected;
+};
+
+
+
+}
+
+#endif
diff --git a/src/gui/editors/segment/TrackEditor.cpp b/src/gui/editors/segment/TrackEditor.cpp
new file mode 100644
index 0000000..32c2b02
--- /dev/null
+++ b/src/gui/editors/segment/TrackEditor.cpp
@@ -0,0 +1,827 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "TrackEditor.h"
+#include <qlayout.h>
+#include <kapplication.h>
+
+#include <klocale.h>
+#include <kconfig.h>
+#include <kstddirs.h>
+#include "misc/Debug.h"
+#include "document/ConfigGroups.h"
+#include "gui/application/RosegardenDCOP.h"
+#include "gui/seqmanager/SequenceManager.h"
+#include "gui/rulers/StandardRuler.h"
+#include "base/Composition.h"
+#include "base/MidiProgram.h"
+#include "base/RealTime.h"
+#include "base/RulerScale.h"
+#include "base/Segment.h"
+#include "base/Selection.h"
+#include "commands/segment/AddTracksCommand.h"
+#include "commands/segment/DeleteTracksCommand.h"
+#include "commands/segment/SegmentEraseCommand.h"
+#include "commands/segment/SegmentInsertCommand.h"
+#include "commands/segment/SegmentRepeatToCopyCommand.h"
+#include "segmentcanvas/CompositionModel.h"
+#include "segmentcanvas/CompositionModelImpl.h"
+#include "segmentcanvas/CompositionView.h"
+#include "document/MultiViewCommandHistory.h"
+#include "document/RosegardenGUIDoc.h"
+#include "gui/application/RosegardenGUIApp.h"
+#include "gui/rulers/ChordNameRuler.h"
+#include "gui/rulers/TempoRuler.h"
+#include "gui/rulers/LoopRuler.h"
+#include "gui/widgets/ProgressDialog.h"
+#include "gui/widgets/QDeferScrollView.h"
+#include "sound/AudioFile.h"
+#include "TrackButtons.h"
+#include "TrackEditorIface.h"
+#include <dcopobject.h>
+#include <kcommand.h>
+#include <kglobal.h>
+#include <kmessagebox.h>
+#include <qapplication.h>
+#include <qcursor.h>
+#include <qfont.h>
+#include <qpixmap.h>
+#include <qpoint.h>
+#include <qscrollview.h>
+#include <qstring.h>
+#include <qstringlist.h>
+#include <qstrlist.h>
+#include <qwidget.h>
+#include <qvalidator.h>
+#include <qdragobject.h>
+#include <qtextstream.h>
+
+
+namespace Rosegarden
+{
+
+TrackEditor::TrackEditor(RosegardenGUIDoc* doc,
+ QWidget* rosegardenguiview,
+ RulerScale *rulerScale,
+ bool showTrackLabels,
+ double initialUnitsPerPixel,
+ QWidget* parent, const char* name,
+ WFlags) :
+ DCOPObject("TrackEditorIface"),
+ QWidget(parent, name),
+ m_doc(doc),
+ m_rulerScale(rulerScale),
+ m_topStandardRuler(0),
+ m_bottomStandardRuler(0),
+ m_trackButtons(0),
+ m_segmentCanvas(0),
+ m_trackButtonScroll(0),
+ m_showTrackLabels(showTrackLabels),
+ m_canvasWidth(0),
+ m_compositionRefreshStatusId(doc->getComposition().getNewRefreshStatusId()),
+ m_playTracking(true),
+ m_initialUnitsPerPixel(initialUnitsPerPixel)
+{
+ // accept dnd
+ setAcceptDrops(true);
+
+ init(rosegardenguiview);
+ slotReadjustCanvasSize();
+}
+
+TrackEditor::~TrackEditor()
+{
+ delete m_chordNameRuler;
+ delete m_compositionModel;
+}
+
+void
+TrackEditor::init(QWidget* rosegardenguiview)
+{
+ QGridLayout *grid = new QGridLayout(this, 4, 2);
+
+ int trackLabelWidth = 230;
+ int barButtonsHeight = 25;
+
+ m_chordNameRuler = new ChordNameRuler(m_rulerScale,
+ m_doc,
+ 0.0,
+ 20,
+ this);
+ grid->addWidget(m_chordNameRuler, 0, 1);
+
+ m_tempoRuler = new TempoRuler(m_rulerScale,
+ m_doc,
+ RosegardenGUIApp::self(),
+ 0.0,
+ 24,
+ true,
+ this);
+
+ grid->addWidget(m_tempoRuler, 1, 1);
+
+ m_tempoRuler->connectSignals();
+
+ //
+ // Top Bar Buttons
+ //
+ m_topStandardRuler = new StandardRuler(m_doc,
+ m_rulerScale,
+ 0,
+ barButtonsHeight,
+ false,
+ this, "topbarbuttons");
+ m_topStandardRuler->connectRulerToDocPointer(m_doc);
+
+ grid->addWidget(m_topStandardRuler, 2, 1);
+
+ //
+ // Segment Canvas
+ //
+ m_compositionModel = new CompositionModelImpl(m_doc->getComposition(),
+ m_doc->getStudio(),
+ m_rulerScale, getTrackCellHeight());
+
+ connect(rosegardenguiview, SIGNAL(instrumentParametersChanged(InstrumentId)),
+ m_compositionModel, SLOT(slotInstrumentParametersChanged(InstrumentId)));
+ connect(rosegardenguiview->parent(), SIGNAL(instrumentParametersChanged(InstrumentId)),
+ m_compositionModel, SLOT(slotInstrumentParametersChanged(InstrumentId)));
+
+ m_segmentCanvas = new CompositionView(m_doc, m_compositionModel, this);
+
+ kapp->config()->setGroup(GeneralOptionsConfigGroup);
+ if (kapp->config()->readBoolEntry("backgroundtextures", true)) {
+ QPixmap background;
+ QString pixmapDir = KGlobal::dirs()->findResource("appdata", "pixmaps/");
+ if (background.load(QString("%1/misc/bg-segmentcanvas.xpm").
+ arg(pixmapDir))) {
+ m_segmentCanvas->setBackgroundPixmap(background);
+ m_segmentCanvas->viewport()->setBackgroundPixmap(background);
+ }
+ }
+
+ //
+ // Bottom Bar Buttons
+ //
+ m_bottomStandardRuler = new StandardRuler(m_doc,
+ m_rulerScale,
+ 0,
+ barButtonsHeight,
+ true,
+ m_segmentCanvas, "bottombarbuttons");
+ m_bottomStandardRuler->connectRulerToDocPointer(m_doc);
+
+ m_segmentCanvas->setBottomFixedWidget(m_bottomStandardRuler);
+
+ grid->addWidget(m_segmentCanvas, 3, 1);
+
+ grid->setColStretch(1, 10); // to make sure the seg canvas doesn't leave a "blank" grey space when
+ // loading a file which has a low zoom factor
+
+ // Track Buttons
+ //
+ // (must be put in a QScrollView)
+ //
+ m_trackButtonScroll = new QDeferScrollView(this);
+ grid->addWidget(m_trackButtonScroll, 3, 0);
+
+ int canvasHeight = getTrackCellHeight() *
+ std::max(40u, m_doc->getComposition().getNbTracks());
+
+ m_trackButtons = new TrackButtons(m_doc,
+ getTrackCellHeight(),
+ trackLabelWidth,
+ m_showTrackLabels,
+ canvasHeight,
+ m_trackButtonScroll->viewport());
+ m_trackButtonScroll->addChild(m_trackButtons);
+ m_trackButtonScroll->setHScrollBarMode(QScrollView::AlwaysOff);
+ m_trackButtonScroll->setVScrollBarMode(QScrollView::AlwaysOff);
+ m_trackButtonScroll->setResizePolicy(QScrollView::AutoOneFit);
+ m_trackButtonScroll->setBottomMargin(m_bottomStandardRuler->height() +
+ m_segmentCanvas->horizontalScrollBar()->height());
+
+ connect(m_trackButtons, SIGNAL(widthChanged()),
+ this, SLOT(slotTrackButtonsWidthChanged()));
+
+ connect(m_trackButtons, SIGNAL(trackSelected(int)),
+ rosegardenguiview, SLOT(slotSelectTrackSegments(int)));
+
+ connect(m_trackButtons, SIGNAL(instrumentSelected(int)),
+ rosegardenguiview, SLOT(slotUpdateInstrumentParameterBox(int)));
+
+ connect(this, SIGNAL(stateChange(QString, bool)),
+ rosegardenguiview, SIGNAL(stateChange(QString, bool)));
+
+ connect(m_trackButtons, SIGNAL(modified()),
+ m_doc, SLOT(slotDocumentModified()));
+
+ connect(m_trackButtons, SIGNAL(muteButton(TrackId, bool)),
+ rosegardenguiview, SLOT(slotSetMuteButton(TrackId, bool)));
+
+ // connect loop rulers' follow-scroll signals
+ connect(m_topStandardRuler->getLoopRuler(), SIGNAL(startMouseMove(int)),
+ m_segmentCanvas, SLOT(startAutoScroll(int)));
+ connect(m_topStandardRuler->getLoopRuler(), SIGNAL(stopMouseMove()),
+ m_segmentCanvas, SLOT(stopAutoScroll()));
+ connect(m_bottomStandardRuler->getLoopRuler(), SIGNAL(startMouseMove(int)),
+ m_segmentCanvas, SLOT(startAutoScroll(int)));
+ connect(m_bottomStandardRuler->getLoopRuler(), SIGNAL(stopMouseMove()),
+ m_segmentCanvas, SLOT(stopAutoScroll()));
+
+ connect(m_segmentCanvas, SIGNAL(contentsMoving(int, int)),
+ this, SLOT(slotCanvasScrolled(int, int)));
+
+ // Synchronize bar buttons' scrollview with segment canvas' scrollbar
+ //
+ connect(m_segmentCanvas->verticalScrollBar(), SIGNAL(valueChanged(int)),
+ this, SLOT(slotVerticalScrollTrackButtons(int)));
+
+ connect(m_segmentCanvas->verticalScrollBar(), SIGNAL(sliderMoved(int)),
+ this, SLOT(slotVerticalScrollTrackButtons(int)));
+
+ // scrolling with mouse wheel
+ connect(m_trackButtonScroll, SIGNAL(gotWheelEvent(QWheelEvent*)),
+ m_segmentCanvas, SLOT(slotExternalWheelEvent(QWheelEvent*)));
+
+ // Connect horizontal scrollbar
+ //
+ connect(m_segmentCanvas->horizontalScrollBar(), SIGNAL(valueChanged(int)),
+ m_topStandardRuler, SLOT(slotScrollHoriz(int)));
+ connect(m_segmentCanvas->horizontalScrollBar(), SIGNAL(sliderMoved(int)),
+ m_topStandardRuler, SLOT(slotScrollHoriz(int)));
+
+ connect(m_segmentCanvas->horizontalScrollBar(), SIGNAL(valueChanged(int)),
+ m_bottomStandardRuler, SLOT(slotScrollHoriz(int)));
+ connect(m_segmentCanvas->horizontalScrollBar(), SIGNAL(sliderMoved(int)),
+ m_bottomStandardRuler, SLOT(slotScrollHoriz(int)));
+
+ connect(m_segmentCanvas->horizontalScrollBar(), SIGNAL(valueChanged(int)),
+ m_tempoRuler, SLOT(slotScrollHoriz(int)));
+ connect(m_segmentCanvas->horizontalScrollBar(), SIGNAL(sliderMoved(int)),
+ m_tempoRuler, SLOT(slotScrollHoriz(int)));
+
+ connect(m_segmentCanvas->horizontalScrollBar(), SIGNAL(valueChanged(int)),
+ m_chordNameRuler, SLOT(slotScrollHoriz(int)));
+ connect(m_segmentCanvas->horizontalScrollBar(), SIGNAL(sliderMoved(int)),
+ m_chordNameRuler, SLOT(slotScrollHoriz(int)));
+
+ connect(this, SIGNAL(needUpdate()), m_segmentCanvas, SLOT(slotUpdateSegmentsDrawBuffer()));
+
+ connect(m_segmentCanvas->getModel(),
+ SIGNAL(selectedSegments(const SegmentSelection &)),
+ rosegardenguiview,
+ SLOT(slotSelectedSegments(const SegmentSelection &)));
+
+ connect(m_segmentCanvas, SIGNAL(zoomIn()),
+ RosegardenGUIApp::self(), SLOT(slotZoomIn()));
+ connect(m_segmentCanvas, SIGNAL(zoomOut()),
+ RosegardenGUIApp::self(), SLOT(slotZoomOut()));
+
+ connect(getCommandHistory(), SIGNAL(commandExecuted()),
+ this, SLOT(update()));
+
+ connect(m_doc, SIGNAL(pointerPositionChanged(timeT)),
+ this, SLOT(slotSetPointerPosition(timeT)));
+
+ //
+ // pointer and loop drag signals from top and bottom bar buttons (loop rulers actually)
+ //
+ connect(m_topStandardRuler, SIGNAL(dragPointerToPosition(timeT)),
+ this, SLOT(slotPointerDraggedToPosition(timeT)));
+ connect(m_bottomStandardRuler, SIGNAL(dragPointerToPosition(timeT)),
+ this, SLOT(slotPointerDraggedToPosition(timeT)));
+
+ connect(m_topStandardRuler, SIGNAL(dragLoopToPosition(timeT)),
+ this, SLOT(slotLoopDraggedToPosition(timeT)));
+ connect(m_bottomStandardRuler, SIGNAL(dragLoopToPosition(timeT)),
+ this, SLOT(slotLoopDraggedToPosition(timeT)));
+
+ connect(m_doc, SIGNAL(loopChanged(timeT,
+ timeT)),
+ this, SLOT(slotSetLoop(timeT, timeT)));
+}
+
+void TrackEditor::slotReadjustCanvasSize()
+{
+ m_segmentCanvas->slotUpdateSize();
+}
+
+void TrackEditor::slotTrackButtonsWidthChanged()
+{
+ // We need to make sure the trackButtons geometry is fully updated
+ //
+ ProgressDialog::processEvents();
+
+ m_trackButtonScroll->setMinimumWidth(m_trackButtons->width());
+ m_doc->slotDocumentModified();
+}
+
+int TrackEditor::getTrackCellHeight() const
+{
+ int size;
+ static QFont defaultFont;
+
+ // do some scrabbling around for a reasonable size
+ //
+ size = defaultFont.pixelSize();
+
+ if (size < 8) {
+ if (QApplication::font(this).pixelSize() < 8)
+ size = 12;
+ else
+ size = QApplication::font(this).pixelSize();
+ }
+
+ return size + 12;
+}
+
+bool TrackEditor::isCompositionModified()
+{
+ return m_doc->getComposition().getRefreshStatus
+ (m_compositionRefreshStatusId).needsRefresh();
+}
+
+void TrackEditor::setCompositionModified(bool c)
+{
+ m_doc->getComposition().getRefreshStatus
+ (m_compositionRefreshStatusId).setNeedsRefresh(c);
+}
+
+void TrackEditor::updateRulers()
+{
+ if (getTempoRuler() != 0)
+ getTempoRuler()->update();
+
+ if (getChordNameRuler() != 0)
+ getChordNameRuler()->update();
+
+ getTopStandardRuler()->update();
+ getBottomStandardRuler()->update();
+}
+
+void TrackEditor::paintEvent(QPaintEvent* e)
+{
+ if (isCompositionModified()) {
+
+ slotReadjustCanvasSize();
+ m_trackButtons->slotUpdateTracks();
+ m_segmentCanvas->clearSegmentRectsCache(true);
+ m_segmentCanvas->updateContents();
+
+ Composition &composition = m_doc->getComposition();
+
+ if (composition.getNbSegments() == 0) {
+ emit stateChange("have_segments", false); // no segments : reverse state
+ emit stateChange("have_selection", false); // no segments : reverse state
+ } else {
+ emit stateChange("have_segments", true);
+ if (m_segmentCanvas->haveSelection())
+ emit stateChange("have_selection", true);
+ else
+ emit stateChange("have_selection", false); // no selection : reverse state
+ }
+
+ setCompositionModified(false);
+ }
+
+ QWidget::paintEvent(e);
+}
+
+void TrackEditor::slotAddTracks(unsigned int nbNewTracks,
+ InstrumentId id,
+ int position)
+{
+ Composition &comp = m_doc->getComposition();
+
+ AddTracksCommand* command = new AddTracksCommand(&comp, nbNewTracks, id,
+ position);
+ addCommandToHistory(command);
+ slotReadjustCanvasSize();
+}
+
+void TrackEditor::slotDeleteTracks(std::vector<TrackId> tracks)
+{
+ Composition &comp = m_doc->getComposition();
+
+ DeleteTracksCommand* command = new DeleteTracksCommand(&comp, tracks);
+ addCommandToHistory(command);
+}
+
+void TrackEditor::addSegment(int track, int time, unsigned int duration)
+{
+ if (!m_doc)
+ return ; // sanity check
+
+ SegmentInsertCommand *command =
+ new SegmentInsertCommand(m_doc, track, time, duration);
+
+ addCommandToHistory(command);
+}
+
+void TrackEditor::slotSegmentOrderChanged(int section, int fromIdx, int toIdx)
+{
+ RG_DEBUG << QString("TrackEditor::segmentOrderChanged(section : %1, from %2, to %3)")
+ .arg(section).arg(fromIdx).arg(toIdx) << endl;
+
+ //!!! how do we get here? need to involve a command
+ emit needUpdate();
+}
+
+void
+TrackEditor::slotCanvasScrolled(int x, int y)
+{
+ // update the pointer position if the user is dragging it from the loop ruler
+ if ((m_topStandardRuler && m_topStandardRuler->getLoopRuler() &&
+ m_topStandardRuler->getLoopRuler()->hasActiveMousePress() &&
+ !m_topStandardRuler->getLoopRuler()->getLoopingMode()) ||
+ (m_bottomStandardRuler && m_bottomStandardRuler->getLoopRuler() &&
+ m_bottomStandardRuler->getLoopRuler()->hasActiveMousePress() &&
+ !m_bottomStandardRuler->getLoopRuler()->getLoopingMode())) {
+
+ int mx = m_segmentCanvas->viewport()->mapFromGlobal(QCursor::pos()).x();
+ m_segmentCanvas->setPointerPos(x + mx);
+
+ // bad idea, creates a feedback loop
+ // timeT t = m_segmentCanvas->grid().getRulerScale()->getTimeForX(x + mx);
+ // slotSetPointerPosition(t);
+ }
+}
+
+void
+TrackEditor::slotSetPointerPosition(timeT position)
+{
+ SimpleRulerScale *ruler =
+ dynamic_cast<SimpleRulerScale*>(m_rulerScale);
+
+ if (!ruler)
+ return ;
+
+ double pos = m_segmentCanvas->grid().getRulerScale()->getXForTime(position);
+
+ int currentPointerPos = m_segmentCanvas->getPointerPos();
+
+ double distance = pos - currentPointerPos;
+ if (distance < 0.0)
+ distance = -distance;
+
+ if (distance >= 1.0) {
+
+ if (m_doc && m_doc->getSequenceManager() &&
+ (m_doc->getSequenceManager()->getTransportStatus() != STOPPED)) {
+
+ if (m_playTracking) {
+ getSegmentCanvas()->slotScrollHoriz(int(double(position) / ruler->getUnitsPerPixel()));
+ }
+ } else if (!getSegmentCanvas()->isAutoScrolling()) {
+ int newpos = int(double(position) / ruler->getUnitsPerPixel());
+ // RG_DEBUG << "TrackEditor::slotSetPointerPosition("
+ // << position
+ // << ") : calling canvas->slotScrollHoriz() "
+ // << newpos << endl;
+ getSegmentCanvas()->slotScrollHoriz(newpos);
+ }
+
+ m_segmentCanvas->setPointerPos(pos);
+ }
+
+}
+
+void
+TrackEditor::slotPointerDraggedToPosition(timeT position)
+{
+ int currentPointerPos = m_segmentCanvas->getPointerPos();
+
+ double newPosition;
+
+ if (handleAutoScroll(currentPointerPos, position, newPosition))
+ m_segmentCanvas->setPointerPos(int(newPosition));
+}
+
+void
+TrackEditor::slotLoopDraggedToPosition(timeT position)
+{
+ if (m_doc) {
+ int currentEndLoopPos = m_doc->getComposition().getLoopEnd();
+ double dummy;
+ handleAutoScroll(currentEndLoopPos, position, dummy);
+ }
+}
+
+bool TrackEditor::handleAutoScroll(int currentPosition, timeT newTimePosition, double &newPosition)
+{
+ SimpleRulerScale *ruler =
+ dynamic_cast<SimpleRulerScale*>(m_rulerScale);
+
+ if (!ruler)
+ return false;
+
+ newPosition = m_segmentCanvas->grid().getRulerScale()->getXForTime(newTimePosition);
+
+ double distance = fabs(newPosition - currentPosition);
+
+ bool moveDetected = distance >= 1.0;
+
+ if (moveDetected) {
+
+ if (m_doc && m_doc->getSequenceManager() &&
+ (m_doc->getSequenceManager()->getTransportStatus() != STOPPED)) {
+
+ if (m_playTracking) {
+ getSegmentCanvas()->slotScrollHoriz(int(double(newTimePosition) / ruler->getUnitsPerPixel()));
+ }
+ } else {
+ int newpos = int(double(newTimePosition) / ruler->getUnitsPerPixel());
+ getSegmentCanvas()->slotScrollHorizSmallSteps(newpos);
+ getSegmentCanvas()->doAutoScroll();
+ }
+
+ }
+
+ return moveDetected;
+}
+
+void
+TrackEditor::slotToggleTracking()
+{
+ m_playTracking = !m_playTracking;
+}
+
+void
+TrackEditor::slotSetLoop(timeT start, timeT end)
+{
+ getTopStandardRuler()->getLoopRuler()->slotSetLoopMarker(start, end);
+ getBottomStandardRuler()->getLoopRuler()->slotSetLoopMarker(start, end);
+}
+
+MultiViewCommandHistory*
+TrackEditor::getCommandHistory()
+{
+ return m_doc->getCommandHistory();
+}
+
+void
+TrackEditor::addCommandToHistory(KCommand *command)
+{
+ getCommandHistory()->addCommand(command);
+}
+
+void
+TrackEditor::slotScrollToTrack(int track)
+{
+ // Find the vertical track pos
+ int newY = track * getTrackCellHeight();
+
+ RG_DEBUG << "TrackEditor::scrollToTrack(" << track <<
+ ") scrolling to Y " << newY << endl;
+
+ // Scroll the segment view; it will scroll tracks by connected signals
+ // slotVerticalScrollTrackButtons(newY);
+ m_segmentCanvas->slotScrollVertSmallSteps(newY);
+}
+
+void
+TrackEditor::slotDeleteSelectedSegments()
+{
+ KMacroCommand *macro = new KMacroCommand("Delete Segments");
+
+ SegmentSelection segments =
+ m_segmentCanvas->getSelectedSegments();
+
+ if (segments.size() == 0)
+ return ;
+
+ SegmentSelection::iterator it;
+
+ // Clear the selection before erasing the Segments
+ // the selection points to
+ //
+ m_segmentCanvas->getModel()->clearSelected();
+
+ // Create the compound command
+ //
+ for (it = segments.begin(); it != segments.end(); it++) {
+ macro->addCommand(new SegmentEraseCommand(*it,
+ &m_doc->getAudioFileManager()));
+ }
+
+ addCommandToHistory(macro);
+
+}
+
+void
+TrackEditor::slotTurnRepeatingSegmentToRealCopies()
+{
+ RG_DEBUG << "TrackEditor::slotTurnRepeatingSegmentToRealCopies" << endl;
+
+ SegmentSelection segments =
+ m_segmentCanvas->getSelectedSegments();
+
+ if (segments.size() == 0)
+ return ;
+
+ QString text;
+
+ if (segments.size() == 1)
+ text = i18n("Turn Repeating Segment into Real Copies");
+ else
+ text = i18n("Turn Repeating Segments into Real Copies");
+
+ KMacroCommand *macro = new KMacroCommand(text);
+
+ SegmentSelection::iterator it = segments.begin();
+ for (; it != segments.end(); it++) {
+ if ((*it)->isRepeating()) {
+ macro->addCommand(new SegmentRepeatToCopyCommand(*it));
+ }
+ }
+
+ addCommandToHistory(macro);
+
+}
+
+void
+TrackEditor::slotVerticalScrollTrackButtons(int y)
+{
+ m_trackButtonScroll->setContentsPos(0, y);
+}
+
+void TrackEditor::dragEnterEvent(QDragEnterEvent *event)
+{
+ event->accept(QUriDrag::canDecode(event) ||
+ QTextDrag::canDecode(event));
+}
+
+void TrackEditor::dropEvent(QDropEvent* event)
+{
+ QStrList uri;
+ QString text;
+
+ int heightAdjust = 0;
+ //int widthAdjust = 0;
+
+ // Adjust any drop event height position by visible rulers
+ //
+ if (m_topStandardRuler && m_topStandardRuler->isVisible())
+ heightAdjust += m_topStandardRuler->height();
+
+ if (m_tempoRuler && m_tempoRuler->isVisible())
+ heightAdjust += m_tempoRuler->height();
+
+ if (m_chordNameRuler && m_chordNameRuler->isVisible())
+ heightAdjust += m_chordNameRuler->height();
+
+ QPoint posInSegmentCanvas =
+ m_segmentCanvas->viewportToContents
+ (m_segmentCanvas->
+ viewport()->mapFrom(this, event->pos()));
+
+ int trackPos = m_segmentCanvas->grid().getYBin(posInSegmentCanvas.y());
+
+ timeT time =
+// m_segmentCanvas->grid().getRulerScale()->
+// getTimeForX(posInSegmentCanvas.x());
+ m_segmentCanvas->grid().snapX(posInSegmentCanvas.x());
+
+
+ if (QUriDrag::decode(event, uri)) {
+ RG_DEBUG << "TrackEditor::dropEvent() : got URI :"
+ << uri.first() << endl;
+ QString uriPath = uri.first();
+
+ if (uriPath.endsWith(".rg")) {
+ emit droppedDocument(uriPath);
+ } else {
+
+ QStrList uris;
+ QString uri;
+ if (QUriDrag::decode(event, uris)) uri = uris.first();
+// QUriDrag::decodeLocalFiles(event, files);
+// QString filePath = files.first();
+
+ RG_DEBUG << "TrackEditor::dropEvent() : got URI: "
+ << uri << endl;
+
+ RG_DEBUG << "TrackEditor::dropEvent() : dropping at track pos = "
+ << trackPos
+ << ", time = "
+ << time
+ << ", x = "
+ << event->pos().x()
+ << ", mapped x = "
+ << posInSegmentCanvas.x()
+ << endl;
+
+ Track* track = m_doc->getComposition().getTrackByPosition(trackPos);
+ if (track) {
+ QString audioText;
+ QTextOStream t(&audioText);
+
+ t << uri << "\n";
+ t << track->getId() << "\n";
+ t << time << "\n";
+
+ emit droppedNewAudio(audioText);
+ }
+
+ }
+
+ } else if (QTextDrag::decode(event, text)) {
+ RG_DEBUG << "TrackEditor::dropEvent() : got text info " << endl;
+ //<< text << endl;
+
+ if (text.endsWith(".rg")) {
+ emit droppedDocument(text);
+ //
+ // WARNING
+ //
+ // DO NOT PERFORM ANY OPERATIONS AFTER THAT
+ // EMITTING THIS SIGNAL TRIGGERS THE LOADING OF A NEW DOCUMENT
+ // AND AS A CONSEQUENCE THE DELETION OF THIS TrackEditor OBJECT
+ //
+ } else {
+
+ QTextIStream s(&text);
+
+ QString id;
+ AudioFileId audioFileId;
+ RealTime startTime, endTime;
+
+ // read the audio info checking for end of stream
+ s >> id;
+ s >> audioFileId;
+ s >> startTime.sec;
+ s >> startTime.nsec;
+ s >> endTime.sec;
+ s >> endTime.nsec;
+
+ if (id == "AudioFileManager") { // only create something if this is data from the right client
+
+
+ // Drop this audio segment if we have a valid track number
+ // (could also check for time limits too)
+ //
+ Track* track = m_doc->getComposition().getTrackByPosition(trackPos);
+ if (track) {
+
+ RG_DEBUG << "TrackEditor::dropEvent() : dropping at track pos = "
+ << trackPos
+ << ", time = "
+ << time
+ << ", x = "
+ << event->pos().x()
+ << ", map = "
+ << posInSegmentCanvas.x()
+ << endl;
+
+ QString audioText;
+ QTextOStream t(&audioText);
+ t << audioFileId << "\n";
+ t << track->getId() << "\n";
+ t << time << "\n"; // time on canvas
+ t << startTime.sec << "\n";
+ t << startTime.nsec << "\n";
+ t << endTime.sec << "\n";
+ t << endTime.nsec << "\n";
+
+ emit droppedAudio(audioText);
+ }
+
+ } else {
+
+ KMessageBox::sorry(this, i18n("You can't drop files into Rosegarden from this client. Try using Konqueror instead."));
+
+ }
+
+ }
+
+ // SEE WARNING ABOVE - DON'T DO ANYTHING, THIS OBJECT MAY NOT
+ // EXIST AT THIS POINT.
+
+ }
+}
+
+}
+#include "TrackEditor.moc"
diff --git a/src/gui/editors/segment/TrackEditor.h b/src/gui/editors/segment/TrackEditor.h
new file mode 100644
index 0000000..6670a15
--- /dev/null
+++ b/src/gui/editors/segment/TrackEditor.h
@@ -0,0 +1,248 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_TRACKEDITOR_H_
+#define _RG_TRACKEDITOR_H_
+
+#include "base/MidiProgram.h"
+#include <map>
+#include "TrackEditorIface.h"
+#include <qstring.h>
+#include <qwidget.h>
+#include "base/Event.h"
+#include "gui/editors/segment/TrackButtons.h"
+
+
+class QPaintEvent;
+class QDropEvent;
+class QDragEnterEvent;
+class KCommand;
+
+
+namespace Rosegarden
+{
+
+class TrackButtons;
+class TempoRuler;
+class Segment;
+class RulerScale;
+class RosegardenGUIDoc;
+class QDeferScrollView;
+class MultiViewCommandHistory;
+class CompositionView;
+class CompositionModel;
+class ChordNameRuler;
+class StandardRuler;
+
+
+/**
+ * Global widget for segment edition.
+ *
+ * Shows a global overview of the composition, and lets the user
+ * manipulate the segments
+ *
+ * @see CompositionView
+ */
+class TrackEditor : public QWidget, virtual public TrackEditorIface
+{
+ Q_OBJECT
+public:
+ /**
+ * Create a new TrackEditor representing the document \a doc
+ */
+ TrackEditor(RosegardenGUIDoc* doc,
+ QWidget* rosegardenguiview,
+ RulerScale *rulerScale,
+ bool showTrackLabels,
+ double initialUnitsPerPixel = 0,
+ QWidget* parent = 0, const char* name = 0,
+ WFlags f=0);
+
+ ~TrackEditor();
+
+ CompositionView* getSegmentCanvas() { return m_segmentCanvas; }
+ TempoRuler* getTempoRuler() { return m_tempoRuler; }
+ ChordNameRuler*getChordNameRuler() { return m_chordNameRuler; }
+ StandardRuler* getTopStandardRuler() { return m_topStandardRuler; }
+ StandardRuler* getBottomStandardRuler() { return m_bottomStandardRuler; }
+ TrackButtons* getTrackButtons() { return m_trackButtons; }
+ RulerScale* getRulerScale() { return m_rulerScale; }
+
+ int getTrackCellHeight() const;
+
+ /**
+ * Add a new segment - DCOP interface
+ */
+ virtual void addSegment(int track, int start, unsigned int duration);
+
+ /**
+ * Manage command history
+ */
+ MultiViewCommandHistory *getCommandHistory();
+ void addCommandToHistory(KCommand *command);
+
+ void updateRulers();
+
+ bool isTracking() const { return m_playTracking; }
+
+public slots:
+
+ /**
+ * Scroll the view such that the numbered track is on-screen
+ */
+ void slotScrollToTrack(int trackPosition);
+
+ /**
+ * Set the position pointer during playback
+ */
+ void slotSetPointerPosition(timeT position);
+
+ /**
+ * Update the pointer position as it is being dragged along
+ * This changes how the segment canvas will scroll to follow the pointer
+ */
+ void slotPointerDraggedToPosition(timeT position);
+
+ /**
+ * Update the loop end position as it is being dragged along
+ * This changes how the segment canvas will scroll to follow the pointer
+ */
+ void slotLoopDraggedToPosition(timeT position);
+
+ /**
+ * Act on a canvas scroll event
+ */
+ void slotCanvasScrolled(int, int);
+
+ /**
+ * Adjust the canvas size to that required for the composition
+ */
+ void slotReadjustCanvasSize();
+
+ /**
+ * Show the given loop on the ruler or wherever
+ */
+ void slotSetLoop(timeT start, timeT end);
+
+ /**
+ * Add given number of tracks
+ */
+ void slotAddTracks(unsigned int nbTracks, InstrumentId id, int position);
+
+ /*
+ * Delete a given track
+ */
+ void slotDeleteTracks(std::vector<TrackId> tracks);
+
+ void slotDeleteSelectedSegments();
+ void slotTurnRepeatingSegmentToRealCopies();
+
+ void slotToggleTracking();
+
+protected slots:
+ void slotSegmentOrderChanged(int section, int fromIdx, int toIdx);
+
+ void slotTrackButtonsWidthChanged();
+
+ /// Scroll the track buttons along with the segment canvas
+ void slotVerticalScrollTrackButtons(int y);
+
+signals:
+ /**
+ * Emitted when the represented data changed and the SegmentCanvas
+ * needs to update itself
+ *
+ * @see SegmentCanvas::update()
+ */
+ void needUpdate();
+
+ /**
+ * sent back to RosegardenGUI
+ */
+ void stateChange(QString, bool);
+
+ /**
+ * A URI to a Rosegarden document was dropped on the canvas
+ *
+ * @see RosegardenGUI#slotOpenURL()
+ */
+ void droppedDocument(QString uri);
+
+ /**
+ * An audio file was dropped from the audio manager dialog
+ */
+ void droppedAudio(QString audioDesc);
+
+ /**
+ * And audio file was dropped from konqi say and needs to be
+ * inserted into AudioManagerDialog before adding to the
+ * composition.
+ */
+ void droppedNewAudio(QString audioDesc);
+
+protected:
+
+ virtual void dragEnterEvent(QDragEnterEvent *event);
+ virtual void dropEvent(QDropEvent*);
+
+ virtual void paintEvent(QPaintEvent* e);
+
+ void init(QWidget *);
+
+ bool isCompositionModified();
+ void setCompositionModified(bool);
+
+ /// return true if an actual move occurred between current and new position, newPosition contains the horiz. pos corresponding to newTimePosition
+ bool handleAutoScroll(int currentPosition, timeT newTimePosition, double& newPosition);
+
+ //--------------- Data members ---------------------------------
+
+ RosegardenGUIDoc *m_doc;
+ RulerScale *m_rulerScale;
+ TempoRuler *m_tempoRuler;
+ ChordNameRuler *m_chordNameRuler;
+ StandardRuler *m_topStandardRuler;
+ StandardRuler *m_bottomStandardRuler;
+ TrackButtons *m_trackButtons;
+ CompositionView *m_segmentCanvas;
+ CompositionModel *m_compositionModel;
+ QDeferScrollView *m_trackButtonScroll;
+
+ bool m_showTrackLabels;
+ unsigned int m_canvasWidth;
+ unsigned int m_compositionRefreshStatusId;
+ bool m_playTracking;
+
+ typedef std::map<Segment *, unsigned int>
+ SegmentRefreshStatusIdMap;
+ SegmentRefreshStatusIdMap m_segmentsRefreshStatusIds;
+
+ double m_initialUnitsPerPixel;
+};
+
+
+}
+
+#endif
diff --git a/src/gui/editors/segment/TrackEditorIface.cpp b/src/gui/editors/segment/TrackEditorIface.cpp
new file mode 100644
index 0000000..8238c1d
--- /dev/null
+++ b/src/gui/editors/segment/TrackEditorIface.cpp
@@ -0,0 +1,33 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "TrackEditorIface.h"
+
+#include <dcopobject.h>
+
+
+namespace Rosegarden
+{
+}
diff --git a/src/gui/editors/segment/TrackEditorIface.h b/src/gui/editors/segment/TrackEditorIface.h
new file mode 100644
index 0000000..1637591
--- /dev/null
+++ b/src/gui/editors/segment/TrackEditorIface.h
@@ -0,0 +1,55 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_TRACKEDITORIFACE_H_
+#define _RG_TRACKEDITORIFACE_H_
+
+#include <dcopobject.h>
+
+
+
+
+namespace Rosegarden
+{
+
+
+
+/**
+ * TrackEditor DCOP Interface
+ *
+ * @see TrackEditor
+ */
+class TrackEditorIface : virtual public DCOPObject
+{
+ K_DCOP
+public:
+k_dcop:
+ virtual void addSegment(int instrument, int start, unsigned int length) = 0;
+};
+
+
+}
+
+#endif
diff --git a/src/gui/editors/segment/TrackHeader.cpp b/src/gui/editors/segment/TrackHeader.cpp
new file mode 100644
index 0000000..d7ca6d3
--- /dev/null
+++ b/src/gui/editors/segment/TrackHeader.cpp
@@ -0,0 +1,64 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "TrackHeader.h"
+
+#include <qheader.h>
+#include <qpainter.h>
+#include <qrect.h>
+#include <qwidget.h>
+
+
+namespace Rosegarden
+{
+
+TrackHeader::~TrackHeader()
+{}
+
+void
+TrackHeader::paintEvent(QPaintEvent *e)
+{
+ QPainter p( this );
+ p.setPen( colorGroup().buttonText() );
+ int pos = (orientation() == Horizontal)
+ ? e->rect().left()
+ : e->rect().top();
+ int id = mapToIndex( sectionAt( pos + offset() ) );
+ if ( id < 0 )
+ if ( pos > 0 )
+ return ;
+ else
+ id = 0;
+ for ( int i = id; i < count(); i++ ) {
+ QRect r = sRect( i );
+ paintSection( &p, i, r );
+ if ( orientation() == Horizontal && r. right() >= e->rect().right() ||
+ orientation() == Vertical && r. bottom() >= e->rect().bottom() )
+ return ;
+ }
+
+}
+
+}
diff --git a/src/gui/editors/segment/TrackHeader.h b/src/gui/editors/segment/TrackHeader.h
new file mode 100644
index 0000000..fe404c3
--- /dev/null
+++ b/src/gui/editors/segment/TrackHeader.h
@@ -0,0 +1,65 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_TRACKHEADER_H_
+#define _RG_TRACKHEADER_H_
+
+#include <qheader.h>
+
+
+class QWidget;
+class QPaintEvent;
+
+
+namespace Rosegarden
+{
+
+
+
+class TrackHeader : public QHeader
+{
+
+public:
+ TrackHeader(int number,
+ QWidget *parent=0,
+ const char *name=0 ):
+ QHeader(number, parent, name) {;}
+ ~TrackHeader();
+
+protected:
+ virtual void paintEvent(QPaintEvent *pe);
+// void paintSection(QPainter * p, int index, QRect fr);
+// void paintSectionLabel (QPainter * p, int index, const QRect & fr);
+// QRect sRect (int index);
+
+private:
+
+};
+
+
+
+}
+
+#endif
diff --git a/src/gui/editors/segment/TrackLabel.cpp b/src/gui/editors/segment/TrackLabel.cpp
new file mode 100644
index 0000000..90561d1
--- /dev/null
+++ b/src/gui/editors/segment/TrackLabel.cpp
@@ -0,0 +1,203 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "TrackLabel.h"
+
+#include <klocale.h>
+#include "base/Track.h"
+#include <klineeditdlg.h>
+#include <qfont.h>
+#include <qframe.h>
+#include <qlabel.h>
+#include <qregexp.h>
+#include <qstring.h>
+#include <qtimer.h>
+#include <qtooltip.h>
+#include <qwidget.h>
+#include <qwidgetstack.h>
+#include <qvalidator.h>
+
+
+namespace Rosegarden
+{
+
+TrackLabel::TrackLabel(TrackId id,
+ int position,
+ QWidget *parent,
+ const char *name):
+ QWidgetStack(parent, name),
+ m_instrumentLabel(new QLabel(this)),
+ m_trackLabel(new QLabel(this)),
+ m_id(id),
+ m_position(position)
+{
+ QFont font;
+ font.setPointSize(font.pointSize() * 95 / 100);
+ if (font.pixelSize() > 14)
+ font.setPixelSize(14);
+ font.setBold(false);
+ m_instrumentLabel->setFont(font);
+ m_trackLabel->setFont(font);
+
+ addWidget(m_instrumentLabel, ShowInstrument);
+ addWidget(m_trackLabel, ShowTrack);
+ raiseWidget(ShowTrack);
+
+ m_instrumentLabel->setFrameShape(QFrame::NoFrame);
+ m_trackLabel->setFrameShape(QFrame::NoFrame);
+
+ m_pressTimer = new QTimer(this);
+
+ connect(m_pressTimer, SIGNAL(timeout()),
+ this, SIGNAL(changeToInstrumentList()));
+
+ QToolTip::add
+ (this, i18n("Click and hold with left mouse button to assign this Track to an Instrument."));
+
+}
+
+TrackLabel::~TrackLabel()
+{}
+
+void TrackLabel::setIndent(int i)
+{
+ m_instrumentLabel->setIndent(i);
+ m_trackLabel->setIndent(i);
+}
+
+void TrackLabel::setAlternativeLabel(const QString &label)
+{
+ // recover saved original
+ if (label.isEmpty()) {
+
+ if (!m_alternativeLabel.isEmpty())
+ m_instrumentLabel->setText(m_alternativeLabel);
+
+ // do nothing if we've got nothing to swap
+ return ;
+ }
+
+ // Store the current (first) label
+ //
+ if (m_alternativeLabel.isEmpty())
+ m_alternativeLabel = m_instrumentLabel->text();
+
+ // set new label
+ m_instrumentLabel->setText(label);
+}
+
+void TrackLabel::clearAlternativeLabel()
+{
+ m_alternativeLabel = "";
+}
+
+void TrackLabel::showLabel(InstrumentTrackLabels l)
+{
+ raiseWidget(l);
+}
+
+void
+TrackLabel::setSelected(bool on)
+{
+ if (on) {
+ m_selected = true;
+
+ m_instrumentLabel->setPaletteBackgroundColor(colorGroup().highlight());
+ m_instrumentLabel->setPaletteForegroundColor(colorGroup().highlightedText());
+ m_trackLabel->setPaletteBackgroundColor(colorGroup().highlight());
+ m_trackLabel->setPaletteForegroundColor(colorGroup().highlightedText());
+
+ } else {
+ m_selected = false;
+
+ m_instrumentLabel->setPaletteBackgroundColor(colorGroup().background());
+ m_trackLabel->setPaletteBackgroundColor(colorGroup().background());
+ m_instrumentLabel->setPaletteForegroundColor(colorGroup().text());
+ m_trackLabel->setPaletteForegroundColor(colorGroup().text());
+ }
+ if (visibleWidget())
+ visibleWidget()->update();
+}
+
+void
+TrackLabel::mousePressEvent(QMouseEvent *e)
+{
+ if (e->button() == RightButton) {
+
+ emit clicked();
+ emit changeToInstrumentList();
+
+ } else if (e->button() == LeftButton) {
+
+ // start a timer on this hold
+ m_pressTimer->start(200, true); // 200ms, single shot
+ }
+}
+
+void
+TrackLabel::mouseReleaseEvent(QMouseEvent *e)
+{
+ // stop the timer if running
+ if (m_pressTimer->isActive())
+ m_pressTimer->stop();
+
+ if (e->button() == LeftButton) {
+ emit clicked();
+ }
+}
+
+void
+TrackLabel::mouseDoubleClickEvent(QMouseEvent *e)
+{
+ if (e->button() != LeftButton)
+ return ;
+
+ // Highlight this label alone and cheat using
+ // the clicked signal
+ //
+ emit clicked();
+
+ // Just in case we've got our timing wrong - reapply
+ // this label highlight
+ //
+ setSelected(true);
+
+ bool ok = false;
+
+ QRegExpValidator validator(QRegExp(".*"), this); // empty is OK
+
+ QString newText = KLineEditDlg::getText(i18n("Change track name"),
+ i18n("Enter new track name"),
+ m_trackLabel->text(),
+ &ok,
+ this,
+ &validator);
+
+ if ( ok )
+ emit renameTrack(newText, m_id);
+}
+
+}
+#include "TrackLabel.moc"
diff --git a/src/gui/editors/segment/TrackLabel.h b/src/gui/editors/segment/TrackLabel.h
new file mode 100644
index 0000000..e56d0e5
--- /dev/null
+++ b/src/gui/editors/segment/TrackLabel.h
@@ -0,0 +1,122 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_TRACKLABEL_H_
+#define _RG_TRACKLABEL_H_
+
+#include "base/Track.h"
+#include <qstring.h>
+#include <qwidgetstack.h>
+
+
+class QWidget;
+class QTimer;
+class QMouseEvent;
+class QLabel;
+
+
+namespace Rosegarden
+{
+
+
+
+/**
+ * Specialises QLabel to create in effect a toggleable and hence
+ * selectable label/label list. In conjunction with TrackButtons
+ * provides a framework for Track selection on the TrackCanvas.
+ */
+class TrackLabel : public QWidgetStack
+{
+Q_OBJECT
+public:
+
+ enum InstrumentTrackLabels
+ {
+ ShowTrack,
+ ShowInstrument,
+ ShowBoth
+ };
+
+ TrackLabel(TrackId id,
+ int position,
+ QWidget *parent,
+ const char *name=0);
+
+ ~TrackLabel();
+
+ // QLabel API delegation - applies on both labels
+ void setIndent(int);
+
+ QLabel* getInstrumentLabel() { return m_instrumentLabel; }
+ QLabel* getTrackLabel() { return m_trackLabel; }
+ void setAlternativeLabel(const QString &label);
+ void clearAlternativeLabel();
+ void showLabel(InstrumentTrackLabels);
+
+ // Encapsulates setting the label to highlighted or not
+ //
+ void setSelected(bool on);
+ bool isSelected() const { return m_selected; }
+
+ void setId(TrackId id) { m_id = id; }
+ TrackId getId() const { return m_id; }
+
+ int getPosition() const { return m_position; }
+ void setPosition(int position) { m_position = position; }
+
+signals:
+ void clicked();
+
+ // We emit this once we've renamed a track
+ //
+ void renameTrack(QString, TrackId);
+
+ void changeToInstrumentList();
+
+protected:
+
+ virtual void mousePressEvent(QMouseEvent *e);
+ virtual void mouseReleaseEvent(QMouseEvent *e);
+ virtual void mouseDoubleClickEvent(QMouseEvent *e);
+
+ QLabel* getVisibleLabel();
+
+ //--------------- Data members ---------------------------------
+
+ QLabel *m_instrumentLabel;
+ QLabel *m_trackLabel;
+ QString m_alternativeLabel;
+
+ TrackId m_id;
+ int m_position;
+ bool m_selected;
+
+ QTimer *m_pressTimer;
+};
+
+
+}
+
+#endif
diff --git a/src/gui/editors/segment/TrackVUMeter.cpp b/src/gui/editors/segment/TrackVUMeter.cpp
new file mode 100644
index 0000000..a638ee7
--- /dev/null
+++ b/src/gui/editors/segment/TrackVUMeter.cpp
@@ -0,0 +1,77 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "TrackVUMeter.h"
+
+#include "gui/widgets/VUMeter.h"
+#include <qfont.h>
+#include <qstring.h>
+#include <qwidget.h>
+
+
+namespace Rosegarden
+{
+
+TrackVUMeter::TrackVUMeter(QWidget *parent,
+ VUMeterType type,
+ int width,
+ int height,
+ int position,
+ const char *name):
+ VUMeter(parent, type, false, false, width, height, VUMeter::Horizontal, name),
+ m_position(position), m_textHeight(12)
+{
+ setAlignment(AlignCenter);
+
+ QFont font;
+ font.setPointSize(font.pointSize() * 95 / 100);
+ if (font.pointSize() > 14)
+ font.setPointSize(14);
+ font.setBold(false);
+ setFont(font);
+}
+
+void
+TrackVUMeter::meterStart()
+{
+ clear();
+ setMinimumHeight(m_originalHeight);
+ setMaximumHeight(m_originalHeight);
+ m_active = true;
+}
+
+void
+TrackVUMeter::meterStop()
+{
+ setMinimumHeight(m_textHeight);
+ setMaximumHeight(m_textHeight);
+ setText(QString("%1").arg(m_position + 1));
+ if (m_active) {
+ m_active = false;
+ update();
+ }
+}
+
+}
diff --git a/src/gui/editors/segment/TrackVUMeter.h b/src/gui/editors/segment/TrackVUMeter.h
new file mode 100644
index 0000000..26b8e4e
--- /dev/null
+++ b/src/gui/editors/segment/TrackVUMeter.h
@@ -0,0 +1,65 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_TRACKVUMETER_H_
+#define _RG_TRACKVUMETER_H_
+
+#include "gui/widgets/VUMeter.h"
+
+
+class QWidget;
+
+
+namespace Rosegarden
+{
+
+
+
+class TrackVUMeter: public VUMeter
+{
+public:
+ TrackVUMeter(QWidget *parent = 0,
+ VUMeterType type = Plain,
+ int width = 0,
+ int height = 0,
+ int position = 0,
+ const char *name = 0);
+
+ int getPosition() const { return m_position; }
+
+protected:
+ virtual void meterStart();
+ virtual void meterStop();
+
+private:
+ int m_position;
+ int m_textHeight;
+
+};
+
+
+}
+
+#endif
diff --git a/src/gui/editors/segment/TriggerManagerItem.cpp b/src/gui/editors/segment/TriggerManagerItem.cpp
new file mode 100644
index 0000000..2e7402d
--- /dev/null
+++ b/src/gui/editors/segment/TriggerManagerItem.cpp
@@ -0,0 +1,60 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include "TriggerManagerItem.h"
+
+namespace Rosegarden {
+
+int
+TriggerManagerItem::compare(QListViewItem * i, int col, bool ascending) const
+{
+ TriggerManagerItem *ei =
+ dynamic_cast<TriggerManagerItem *>(i);
+
+ if (!ei) return QListViewItem::compare(i, col, ascending);
+
+ // col 0 -> index -- numeric compare
+ // col 1 -> ID -- numeric compare
+ // col 2 -> label -- default string compare
+ // col 3 -> duration -- raw duration compare
+ // col 4 -> base pitch -- pitch compare
+ // col 5 -> base velocity -- numeric compare
+ // col 6 -> usage count -- numeric compare
+ //
+ if (col == 2) {
+ return QListViewItem::compare(i, col, ascending);
+ } else if (col == 3) {
+ if (m_rawDuration < ei->getRawDuration()) return -1;
+ else if (ei->getRawDuration() < m_rawDuration) return 1;
+ else return 0;
+ } else if (col == 4) {
+ if (m_pitch < ei->getPitch()) return -1;
+ else if (ei->getPitch() < m_pitch) return 1;
+ else return 0;
+ } else {
+ return key(col, ascending).toInt() - i->key(col, ascending).toInt();
+ }
+}
+
+}
diff --git a/src/gui/editors/segment/TriggerManagerItem.h b/src/gui/editors/segment/TriggerManagerItem.h
new file mode 100644
index 0000000..c1eb95a
--- /dev/null
+++ b/src/gui/editors/segment/TriggerManagerItem.h
@@ -0,0 +1,72 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_TRIGGERMANAGERITEM_H_
+#define _RG_TRIGGERMANAGERITEM_H_
+
+#include <klistview.h>
+
+#include "base/Event.h"
+#include "base/TriggerSegment.h"
+
+namespace Rosegarden {
+
+class TriggerManagerItem : public QListViewItem
+{
+public:
+ TriggerManagerItem(QListView * parent, QString label1,
+ QString label2 = QString::null,
+ QString label3 = QString::null,
+ QString label4 = QString::null,
+ QString label5 = QString::null,
+ QString label6 = QString::null,
+ QString label7 = QString::null,
+ QString label8 = QString::null):
+ QListViewItem(parent, label1, label2, label3, label4,
+ label5, label6, label7, label8) { ; }
+
+ virtual int compare(QListViewItem * i, int col, bool ascending) const;
+
+ void setRawDuration(timeT raw) { m_rawDuration = raw; }
+ timeT getRawDuration() const { return m_rawDuration; }
+
+ void setId(TriggerSegmentId id) { m_id = id; }
+ TriggerSegmentId getId() const { return m_id; }
+
+ void setUsage(int usage) { m_usage = usage; }
+ int getUsage() const { return m_usage; }
+
+ void setPitch(int pitch) { m_pitch = pitch; }
+ int getPitch() const { return m_pitch; }
+
+protected:
+ timeT m_rawDuration;
+ TriggerSegmentId m_id;
+ int m_usage;
+ int m_pitch;
+};
+
+}
+
+#endif
diff --git a/src/gui/editors/segment/TriggerSegmentManager.cpp b/src/gui/editors/segment/TriggerSegmentManager.cpp
new file mode 100644
index 0000000..3fb1732
--- /dev/null
+++ b/src/gui/editors/segment/TriggerSegmentManager.cpp
@@ -0,0 +1,576 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "TriggerSegmentManager.h"
+#include "TriggerManagerItem.h"
+#include <qlayout.h>
+#include <kapplication.h>
+
+#include "base/BaseProperties.h"
+#include <klocale.h>
+#include <kstddirs.h>
+#include "misc/Debug.h"
+#include "misc/Strings.h"
+#include "base/Clipboard.h"
+#include "base/Composition.h"
+#include "base/CompositionTimeSliceAdapter.h"
+#include "base/RealTime.h"
+#include "base/Segment.h"
+#include "base/TriggerSegment.h"
+#include "commands/segment/AddTriggerSegmentCommand.h"
+#include "commands/segment/DeleteTriggerSegmentCommand.h"
+#include "commands/segment/PasteToTriggerSegmentCommand.h"
+#include "document/MultiViewCommandHistory.h"
+#include "document/RosegardenGUIDoc.h"
+#include "document/ConfigGroups.h"
+#include "gui/dialogs/TimeDialog.h"
+#include "gui/general/MidiPitchLabel.h"
+#include <kaction.h>
+#include <kcommand.h>
+#include <kglobal.h>
+#include <klistview.h>
+#include <kmainwindow.h>
+#include <kmessagebox.h>
+#include <kstdaccel.h>
+#include <kstdaction.h>
+#include <kconfig.h>
+#include <qaccel.h>
+#include <qdialog.h>
+#include <qframe.h>
+#include <qiconset.h>
+#include <qlistview.h>
+#include <qpushbutton.h>
+#include <qsizepolicy.h>
+#include <qstring.h>
+#include <qtooltip.h>
+#include <qvbox.h>
+#include <qwidget.h>
+#include <qcanvas.h>
+
+
+namespace Rosegarden
+{
+
+TriggerSegmentManager::TriggerSegmentManager(QWidget *parent,
+ RosegardenGUIDoc *doc):
+ KMainWindow(parent, "triggereditordialog"),
+ m_doc(doc),
+ m_modified(false)
+{
+ QVBox* mainFrame = new QVBox(this);
+ setCentralWidget(mainFrame);
+
+ setCaption(i18n("Manage Triggered Segments"));
+
+ m_listView = new KListView(mainFrame);
+ m_listView->addColumn("Index");
+ m_listView->addColumn(i18n("ID"));
+ m_listView->addColumn(i18n("Label"));
+ m_listView->addColumn(i18n("Duration"));
+ m_listView->addColumn(i18n("Base pitch"));
+ m_listView->addColumn(i18n("Base velocity"));
+ m_listView->addColumn(i18n("Triggers"));
+
+ // Align centrally
+ for (int i = 0; i < 2; ++i)
+ m_listView->setColumnAlignment(i, Qt::AlignHCenter);
+
+ QFrame* btnBox = new QFrame(mainFrame);
+
+ btnBox->setSizePolicy(
+ QSizePolicy(QSizePolicy::Minimum, QSizePolicy::Fixed));
+
+ QHBoxLayout* layout = new QHBoxLayout(btnBox, 4, 10);
+
+ m_addButton = new QPushButton(i18n("Add"), btnBox);
+ m_deleteButton = new QPushButton(i18n("Delete"), btnBox);
+ m_deleteAllButton = new QPushButton(i18n("Delete All"), btnBox);
+
+ m_closeButton = new QPushButton(i18n("Close"), btnBox);
+
+ QToolTip::add
+ (m_addButton,
+ i18n("Add a Triggered Segment"));
+
+ QToolTip::add
+ (m_deleteButton,
+ i18n("Delete a Triggered Segment"));
+
+ QToolTip::add
+ (m_deleteAllButton,
+ i18n("Delete All Triggered Segments"));
+
+ QToolTip::add
+ (m_closeButton,
+ i18n("Close the Triggered Segment Manager"));
+
+ layout->addStretch(10);
+ layout->addWidget(m_addButton);
+ layout->addWidget(m_deleteButton);
+ layout->addWidget(m_deleteAllButton);
+ layout->addSpacing(30);
+
+ layout->addWidget(m_closeButton);
+ layout->addSpacing(5);
+
+ connect(m_addButton, SIGNAL(released()),
+ SLOT(slotAdd()));
+
+ connect(m_deleteButton, SIGNAL(released()),
+ SLOT(slotDelete()));
+
+ connect(m_closeButton, SIGNAL(released()),
+ SLOT(slotClose()));
+
+ connect(m_deleteAllButton, SIGNAL(released()),
+ SLOT(slotDeleteAll()));
+
+ setupActions();
+
+ m_doc->getCommandHistory()->attachView(actionCollection());
+ connect(m_doc->getCommandHistory(), SIGNAL(commandExecuted()),
+ this, SLOT(slotUpdate()));
+
+ connect(m_listView, SIGNAL(doubleClicked(QListViewItem *)),
+ SLOT(slotEdit(QListViewItem *)));
+
+ connect(m_listView, SIGNAL(pressed(QListViewItem *)),
+ this, SLOT(slotItemClicked(QListViewItem *)));
+
+ // Highlight all columns - enable extended selection mode
+ //
+ m_listView->setAllColumnsShowFocus(true);
+ m_listView->setSelectionMode(QListView::Extended);
+ m_listView->setItemsRenameable(true);
+
+ initDialog();
+
+ setAutoSaveSettings(TriggerManagerConfigGroup, true);
+
+ m_accelerators = new QAccel(this);
+}
+
+TriggerSegmentManager::~TriggerSegmentManager()
+{
+ RG_DEBUG << "TriggerSegmentManager::~TriggerSegmentManager" << endl;
+
+ m_listView->saveLayout(kapp->config(), TriggerManagerConfigGroup);
+
+ if (m_doc)
+ m_doc->getCommandHistory()->detachView(actionCollection());
+}
+
+void
+TriggerSegmentManager::initDialog()
+{
+ RG_DEBUG << "TriggerSegmentManager::initDialog" << endl;
+ slotUpdate();
+}
+
+void
+TriggerSegmentManager::slotUpdate()
+{
+ RG_DEBUG << "TriggerSegmentManager::slotUpdate" << endl;
+
+ TriggerManagerItem *item;
+
+ m_listView->clear();
+
+ Composition &comp = m_doc->getComposition();
+
+ const Composition::triggersegmentcontainer &triggers =
+ comp.getTriggerSegments();
+
+ Composition::triggersegmentcontainerconstiterator it;
+
+ kapp->config()->setGroup(TriggerManagerConfigGroup);
+ int timeMode = kapp->config()->readNumEntry("timemode", 0);
+
+ int i = 0;
+
+ for (it = triggers.begin(); it != triggers.end(); ++it) {
+
+ // duration is as of first usage, or 0
+
+ int uses = 0;
+ timeT first = 0;
+ std::set
+ <int> tracks;
+
+ CompositionTimeSliceAdapter tsa(&m_doc->getComposition());
+ for (CompositionTimeSliceAdapter::iterator ci = tsa.begin();
+ ci != tsa.end(); ++ci) {
+ if ((*ci)->has(BaseProperties::TRIGGER_SEGMENT_ID) &&
+ (*ci)->get
+ <Int>(BaseProperties::TRIGGER_SEGMENT_ID) == (long)(*it)->getId()) {
+ ++uses;
+ if (tracks.empty()) {
+ first = (*ci)->getAbsoluteTime();
+ }
+ tracks.insert(ci.getTrack());
+ }
+ }
+
+ timeT duration =
+ (*it)->getSegment()->getEndMarkerTime() -
+ (*it)->getSegment()->getStartTime();
+
+ QString timeString = makeDurationString
+ (first, duration, timeMode);
+
+ QString label = strtoqstr((*it)->getSegment()->getLabel());
+ if (label == "")
+ label = i18n("<no label>");
+
+ QString used = i18n("%1 on 1 track",
+ "%1 on %n tracks",
+ tracks.size()).arg(uses);
+
+ QString pitch = QString("%1 (%2)")
+ .arg(MidiPitchLabel((*it)->getBasePitch()).getQString())
+ .arg((*it)->getBasePitch());
+
+ QString velocity = QString("%1").arg((*it)->getBaseVelocity());
+
+ item = new TriggerManagerItem
+ (m_listView, QString("%1").arg(i + 1), QString("%1").arg((*it)->getId()),
+ label, timeString, pitch, velocity, used);
+
+ item->setRawDuration(duration);
+ item->setId((*it)->getId());
+ item->setUsage(uses);
+ item->setPitch((*it)->getBasePitch());
+
+ m_listView->insertItem(item);
+ ++i;
+ }
+
+ if (m_listView->childCount() == 0) {
+ QListViewItem *item =
+ new TriggerManagerItem(m_listView, i18n("<none>"));
+ m_listView->insertItem(item);
+
+ m_listView->setSelectionMode(QListView::NoSelection);
+ } else {
+ m_listView->setSelectionMode(QListView::Extended);
+ }
+}
+
+void
+TriggerSegmentManager::slotDeleteAll()
+{
+ if (KMessageBox::warningContinueCancel(this, i18n("This will remove all triggered segments from the whole composition. Are you sure?")) != KMessageBox::Continue)
+ return ;
+
+ RG_DEBUG << "TriggerSegmentManager::slotDeleteAll" << endl;
+ KMacroCommand *command = new KMacroCommand(i18n("Remove all triggered segments"));
+
+ QListViewItem *it = m_listView->firstChild();
+
+ do {
+
+ TriggerManagerItem *item =
+ dynamic_cast<TriggerManagerItem*>(it);
+
+ if (!item)
+ continue;
+
+ DeleteTriggerSegmentCommand *c =
+ new DeleteTriggerSegmentCommand(m_doc,
+ item->getId());
+ command->addCommand(c);
+
+ } while ((it = it->nextSibling()));
+
+ addCommandToHistory(command);
+}
+
+void
+TriggerSegmentManager::slotAdd()
+{
+ TimeDialog dialog(this, i18n("Trigger Segment Duration"),
+ &m_doc->getComposition(),
+ 0, 3840, false);
+
+ if (dialog.exec() == QDialog::Accepted) {
+ addCommandToHistory(new AddTriggerSegmentCommand
+ (m_doc, dialog.getTime(), 64));
+ }
+}
+
+void
+TriggerSegmentManager::slotDelete()
+{
+ RG_DEBUG << "TriggerSegmentManager::slotDelete" << endl;
+
+ TriggerManagerItem *item =
+ dynamic_cast<TriggerManagerItem*>(m_listView->currentItem());
+
+ if (!item)
+ return ;
+
+ if (item->getUsage() > 0) {
+ if (KMessageBox::warningContinueCancel(this, i18n("This triggered segment is used 1 time in the current composition. Are you sure you want to remove it?",
+ "This triggered segment is used %n times in the current composition. Are you sure you want to remove it?", item->getUsage())) != KMessageBox::Continue)
+ return ;
+ }
+
+ DeleteTriggerSegmentCommand *command =
+ new DeleteTriggerSegmentCommand(m_doc, item->getId());
+
+ addCommandToHistory(command);
+}
+
+void
+TriggerSegmentManager::slotPasteAsNew()
+{
+ Clipboard *clipboard = m_doc->getClipboard();
+
+ if (clipboard->isEmpty()) {
+ KMessageBox::information(this, i18n("Clipboard is empty"));
+ return ;
+ }
+
+ addCommandToHistory(new PasteToTriggerSegmentCommand
+ (&m_doc->getComposition(),
+ clipboard,
+ "",
+ -1));
+}
+
+void
+TriggerSegmentManager::slotClose()
+{
+ RG_DEBUG << "TriggerSegmentManager::slotClose" << endl;
+
+ if (m_doc)
+ m_doc->getCommandHistory()->detachView(actionCollection());
+ m_doc = 0;
+
+ close();
+}
+
+void
+TriggerSegmentManager::setupActions()
+{
+ KAction* close = KStdAction::close(this,
+ SLOT(slotClose()),
+ actionCollection());
+
+ m_closeButton->setText(close->text());
+ connect(m_closeButton, SIGNAL(released()), this, SLOT(slotClose()));
+
+ QString pixmapDir = KGlobal::dirs()->findResource("appdata", "pixmaps/");
+
+ // some adjustments
+ new KToolBarPopupAction(i18n("Und&o"),
+ "undo",
+ KStdAccel::key(KStdAccel::Undo),
+ actionCollection(),
+ KStdAction::stdName(KStdAction::Undo));
+
+ new KToolBarPopupAction(i18n("Re&do"),
+ "redo",
+ KStdAccel::key(KStdAccel::Redo),
+ actionCollection(),
+ KStdAction::stdName(KStdAction::Redo));
+
+ new KAction(i18n("Pa&ste as New Triggered Segment"), CTRL + SHIFT + Key_V, this,
+ SLOT(slotPasteAsNew()), actionCollection(),
+ "paste_to_trigger_segment");
+
+ kapp->config()->setGroup(TriggerManagerConfigGroup);
+ int timeMode = kapp->config()->readNumEntry("timemode", 0);
+
+ KRadioAction *action;
+
+ QCanvasPixmap pixmap(pixmapDir + "/toolbar/time-musical.png");
+ QIconSet icon(pixmap);
+
+ action = new KRadioAction(i18n("&Musical Times"), icon, 0, this,
+ SLOT(slotMusicalTime()),
+ actionCollection(), "time_musical");
+ action->setExclusiveGroup("timeMode");
+ if (timeMode == 0)
+ action->setChecked(true);
+
+ pixmap.load(pixmapDir + "/toolbar/time-real.png");
+ icon = QIconSet(pixmap);
+
+ action = new KRadioAction(i18n("&Real Times"), icon, 0, this,
+ SLOT(slotRealTime()),
+ actionCollection(), "time_real");
+ action->setExclusiveGroup("timeMode");
+ if (timeMode == 1)
+ action->setChecked(true);
+
+ pixmap.load(pixmapDir + "/toolbar/time-raw.png");
+ icon = QIconSet(pixmap);
+
+ action = new KRadioAction(i18n("Ra&w Times"), icon, 0, this,
+ SLOT(slotRawTime()),
+ actionCollection(), "time_raw");
+ action->setExclusiveGroup("timeMode");
+ if (timeMode == 2)
+ action->setChecked(true);
+
+ createGUI("triggermanager.rc");
+}
+
+void
+TriggerSegmentManager::addCommandToHistory(KCommand *command)
+{
+ getCommandHistory()->addCommand(command);
+ setModified(false);
+}
+
+MultiViewCommandHistory*
+TriggerSegmentManager::getCommandHistory()
+{
+ return m_doc->getCommandHistory();
+}
+
+void
+TriggerSegmentManager::setModified(bool modified)
+{
+ RG_DEBUG << "TriggerSegmentManager::setModified(" << modified << ")" << endl;
+
+ m_modified = modified;
+}
+
+void
+TriggerSegmentManager::checkModified()
+{
+ RG_DEBUG << "TriggerSegmentManager::checkModified(" << m_modified << ")"
+ << endl;
+
+}
+
+void
+TriggerSegmentManager::slotEdit(QListViewItem *i)
+{
+ RG_DEBUG << "TriggerSegmentManager::slotEdit" << endl;
+
+ TriggerManagerItem *item =
+ dynamic_cast<TriggerManagerItem*>(i);
+
+ if (!item)
+ return ;
+
+ TriggerSegmentId id = item->getId();
+
+ RG_DEBUG << "id is " << id << endl;
+
+ emit editTriggerSegment(id);
+}
+
+void
+TriggerSegmentManager::closeEvent(QCloseEvent *e)
+{
+ emit closing();
+ KMainWindow::closeEvent(e);
+}
+
+void
+TriggerSegmentManager::setDocument(RosegardenGUIDoc *doc)
+{
+ // reset our pointers
+ m_doc = doc;
+ m_modified = false;
+
+ slotUpdate();
+}
+
+void
+TriggerSegmentManager::slotItemClicked(QListViewItem *item)
+{
+ RG_DEBUG << "TriggerSegmentManager::slotItemClicked" << endl;
+}
+
+QString
+TriggerSegmentManager::makeDurationString(timeT time,
+ timeT duration, int timeMode)
+{
+ //!!! duplication with EventView::makeDurationString -- merge somewhere?
+
+ switch (timeMode) {
+
+ case 0: // musical time
+ {
+ int bar, beat, fraction, remainder;
+ m_doc->getComposition().getMusicalTimeForDuration
+ (time, duration, bar, beat, fraction, remainder);
+ return QString("%1%2%3-%4%5-%6%7-%8%9 ")
+ .arg(bar / 100)
+ .arg((bar % 100) / 10)
+ .arg(bar % 10)
+ .arg(beat / 10)
+ .arg(beat % 10)
+ .arg(fraction / 10)
+ .arg(fraction % 10)
+ .arg(remainder / 10)
+ .arg(remainder % 10);
+ }
+
+ case 1: // real time
+ {
+ RealTime rt =
+ m_doc->getComposition().getRealTimeDifference
+ (time, time + duration);
+ // return QString("%1 ").arg(rt.toString().c_str());
+ return QString("%1 ").arg(rt.toText().c_str());
+ }
+
+ default:
+ return QString("%1 ").arg(duration);
+ }
+}
+
+void
+TriggerSegmentManager::slotMusicalTime()
+{
+ kapp->config()->setGroup(TriggerManagerConfigGroup);
+ kapp->config()->writeEntry("timemode", 0);
+ slotUpdate();
+}
+
+void
+TriggerSegmentManager::slotRealTime()
+{
+ kapp->config()->setGroup(TriggerManagerConfigGroup);
+ kapp->config()->writeEntry("timemode", 1);
+ slotUpdate();
+}
+
+void
+TriggerSegmentManager::slotRawTime()
+{
+ kapp->config()->setGroup(TriggerManagerConfigGroup);
+ kapp->config()->writeEntry("timemode", 2);
+ slotUpdate();
+}
+
+}
+#include "TriggerSegmentManager.moc"
diff --git a/src/gui/editors/segment/TriggerSegmentManager.h b/src/gui/editors/segment/TriggerSegmentManager.h
new file mode 100644
index 0000000..2de6488
--- /dev/null
+++ b/src/gui/editors/segment/TriggerSegmentManager.h
@@ -0,0 +1,116 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_TRIGGERSEGMENTMANAGER_H_
+#define _RG_TRIGGERSEGMENTMANAGER_H_
+
+#include <kmainwindow.h>
+#include <qstring.h>
+#include "base/Event.h"
+
+
+class QWidget;
+class QPushButton;
+class QListViewItem;
+class QCloseEvent;
+class QAccel;
+class KListView;
+class KCommand;
+
+
+namespace Rosegarden
+{
+
+class RosegardenGUIDoc;
+class MultiViewCommandHistory;
+
+
+class TriggerSegmentManager : public KMainWindow
+{
+ Q_OBJECT
+
+public:
+ TriggerSegmentManager(QWidget *parent,
+ RosegardenGUIDoc *doc);
+ ~TriggerSegmentManager();
+
+ void initDialog();
+
+ void addCommandToHistory(KCommand *command);
+ MultiViewCommandHistory* getCommandHistory();
+
+ void setModified(bool value);
+ void checkModified();
+
+ // reset the document
+ void setDocument(RosegardenGUIDoc *doc);
+
+ QAccel* getAccelerators() { return m_accelerators; }
+
+public slots:
+ void slotUpdate();
+
+ void slotAdd();
+ void slotDelete();
+ void slotDeleteAll();
+ void slotClose();
+ void slotEdit(QListViewItem *);
+ void slotItemClicked(QListViewItem *);
+ void slotPasteAsNew();
+
+ void slotMusicalTime();
+ void slotRealTime();
+ void slotRawTime();
+
+signals:
+ void editTriggerSegment(int);
+ void closing();
+
+protected:
+ virtual void closeEvent(QCloseEvent *);
+
+ void setupActions();
+ QString makeDurationString(timeT startTime,
+ timeT duration, int timeMode);
+
+ //--------------- Data members ---------------------------------
+ RosegardenGUIDoc *m_doc;
+
+ QPushButton *m_closeButton;
+ QPushButton *m_addButton;
+ QPushButton *m_deleteButton;
+ QPushButton *m_deleteAllButton;
+
+ KListView *m_listView;
+
+ bool m_modified;
+
+ QAccel *m_accelerators;
+};
+
+
+}
+
+#endif
diff --git a/src/gui/editors/segment/segmentcanvas/AudioPreviewPainter.cpp b/src/gui/editors/segment/segmentcanvas/AudioPreviewPainter.cpp
new file mode 100644
index 0000000..1b982dc
--- /dev/null
+++ b/src/gui/editors/segment/segmentcanvas/AudioPreviewPainter.cpp
@@ -0,0 +1,316 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include "AudioPreviewPainter.h"
+
+#include "CompositionModelImpl.h"
+#include "CompositionColourCache.h"
+#include "base/Composition.h"
+#include "base/Track.h"
+#include "base/AudioLevel.h"
+#include "base/Studio.h"
+
+#include "misc/Debug.h"
+#include "document/ConfigGroups.h"
+
+#include <qimage.h>
+#include <qapplication.h>
+
+#include <kapp.h>
+#include <kconfig.h>
+
+namespace Rosegarden {
+
+AudioPreviewPainter::AudioPreviewPainter(CompositionModelImpl& model,
+ CompositionModel::AudioPreviewData* apData,
+ const Composition &composition,
+ const Segment* segment)
+ : m_model(model),
+ m_apData(apData),
+ m_composition(composition),
+ m_segment(segment),
+ m_rect(model.computeSegmentRect(*(segment))),
+ m_image(1, 1, 8, 4),
+ m_defaultCol(CompositionColourCache::getInstance()->SegmentAudioPreview),
+ m_height(model.grid().getYSnap()/2)
+{
+ int pixWidth = std::min(m_rect.getBaseWidth(), tileWidth());
+
+ m_image = QImage(pixWidth, m_rect.height(), 8, 4);
+ m_image.setAlphaBuffer(true);
+
+ m_penWidth = (std::max(1U, m_rect.getPen().width()) * 2);
+ m_halfRectHeight = m_model.grid().getYSnap()/2 - m_penWidth / 2 - 2;
+}
+
+int AudioPreviewPainter::tileWidth()
+{
+ static int tw = -1;
+ if (tw == -1) tw = QApplication::desktop()->width();
+ return tw;
+}
+
+void AudioPreviewPainter::paintPreviewImage()
+{
+ const std::vector<float>& values = m_apData->getValues();
+
+ if (values.size() == 0)
+ return;
+
+ float gain[2] = { 1.0, 1.0 };
+ int instrumentChannels = 2;
+ TrackId trackId = m_segment->getTrack();
+ Track *track = m_model.getComposition().getTrackById(trackId);
+ if (track) {
+ Instrument *instrument = m_model.getStudio().getInstrumentById(track->getInstrument());
+ if (instrument) {
+ float level = AudioLevel::dB_to_multiplier(instrument->getLevel());
+ float pan = instrument->getPan() - 100.0;
+ gain[0] = level * ((pan > 0.0) ? (1.0 - (pan / 100.0)) : 1.0);
+ gain[1] = level * ((pan < 0.0) ? ((pan + 100.0) / 100.0) : 1.0);
+ instrumentChannels = instrument->getAudioChannels();
+ }
+ }
+
+ bool showMinima = m_apData->showsMinima();
+ unsigned int channels = m_apData->getChannels();
+ if (channels == 0) {
+ RG_DEBUG << "AudioPreviewPainter::paintPreviewImage : problem with audio file for segment "
+ << m_segment->getLabel().c_str() << endl;
+ return;
+ }
+
+ int samplePoints = values.size() / (channels * (showMinima ? 2 : 1));
+ float h1, h2, l1 = 0, l2 = 0;
+ double sampleScaleFactor = samplePoints / double(m_rect.getBaseWidth());
+ m_sliceNb = 0;
+
+ m_image.fill(0);
+
+ int centre = m_image.height() / 2;
+
+ RG_DEBUG << "AudioPreviewPainter::paintPreviewImage width = " << m_rect.getBaseWidth() << ", height = " << m_rect.height() << ", halfRectHeight = " << m_halfRectHeight << endl;
+
+ RG_DEBUG << "AudioPreviewPainter::paintPreviewImage: channels = " << channels << ", gain left = " << gain[0] << ", right = " << gain[1] << endl;
+
+ double audioDuration = double(m_segment->getAudioEndTime().sec) +
+ double(m_segment->getAudioEndTime().nsec) / 1000000000.0;
+
+ // We need to take each pixel value and map it onto a point within
+ // the preview. We have samplePoints preview points in a known
+ // duration of audioDuration. Thus each point spans a real time
+ // of audioDuration / samplePoints. We need to convert the
+ // accumulated real time back into musical time, and map this
+ // proportionately across the segment width.
+
+ RealTime startRT =
+ m_model.getComposition().getElapsedRealTime(m_segment->getStartTime());
+ double startTime = double(startRT.sec) + double(startRT.nsec) / 1000000000.0;
+
+ RealTime endRT =
+ m_model.getComposition().getElapsedRealTime(m_segment->getEndMarkerTime());
+ double endTime = double(endRT.sec) + double(endRT.nsec) / 1000000000.0;
+
+ bool haveTempoChange = false;
+
+ int finalTempoChangeNumber =
+ m_model.getComposition().getTempoChangeNumberAt
+ (m_segment->getEndMarkerTime());
+
+ if ((finalTempoChangeNumber >= 0) &&
+
+ (finalTempoChangeNumber >
+ m_model.getComposition().getTempoChangeNumberAt
+ (m_segment->getStartTime()))) {
+
+ haveTempoChange = true;
+ }
+
+ KConfig* config = kapp->config();
+ config->setGroup(GeneralOptionsConfigGroup);
+
+ bool meterLevels = (config->readUnsignedNumEntry("audiopreviewstyle", 1)
+ == 1);
+
+ for (int i = 0; i < m_rect.getBaseWidth(); ++i) {
+
+ // i is the x coordinate within the rectangle. We need to
+ // calculate the position within the audio preview from which
+ // to draw the peak for this coordinate. It's possible there
+ // may be more than one, in which case we need to find the
+ // peak of all of them.
+
+ int position = 0;
+
+ if (haveTempoChange) {
+
+ // First find the time corresponding to this i.
+ timeT musicalTime =
+ m_model.grid().getRulerScale()->getTimeForX(m_rect.x() + i);
+ RealTime realTime =
+ m_model.getComposition().getElapsedRealTime(musicalTime);
+
+ double time = double(realTime.sec) +
+ double(realTime.nsec) / 1000000000.0;
+ double offset = time - startTime;
+
+ if (endTime > startTime) {
+ position = offset * m_rect.getBaseWidth() / (endTime - startTime);
+ position = int(channels * position);
+ }
+
+ } else {
+
+ position = int(channels * i * sampleScaleFactor);
+ }
+
+ if (position < 0) continue;
+
+ if (position >= values.size() - channels) {
+ finalizeCurrentSlice();
+ break;
+ }
+
+ if (channels == 1) {
+
+ h1 = values[position++];
+ h2 = h1;
+
+ if (showMinima) {
+ l1 = values[position++];
+ l2 = l1;
+ }
+ } else {
+
+ h1 = values[position++];
+ if (showMinima) l1 = values[position++];
+
+ h2 = values[position++];
+ if (showMinima) l2 = values[position++];
+
+ }
+
+ if (instrumentChannels == 1 && channels == 2) {
+ h1 = h2 = (h1 + h2) / 2;
+ l1 = l2 = (l1 + l2) / 2;
+ }
+
+ h1 *= gain[0];
+ h2 *= gain[1];
+
+ l1 *= gain[0];
+ l2 *= gain[1];
+
+ int width = 1;
+ int pixel;
+
+ // h1 left, h2 right
+ if (h1 >= 1.0) { h1 = 1.0; pixel = 2; }
+ else { pixel = 1; }
+
+ int h;
+
+ if (meterLevels) {
+ h = AudioLevel::multiplier_to_preview(h1, m_height);
+ } else {
+ h = h1 * m_height;
+ }
+ if (h <= 0) h = 1;
+ if (h > m_halfRectHeight) h = m_halfRectHeight;
+
+ int rectX = i % tileWidth();
+
+ for (int py = 0; py < h; ++py) {
+ m_image.setPixel(rectX, centre - py, pixel);
+ }
+
+ if (h2 >= 1.0) { h2 = 1.0; pixel = 2; }
+ else { pixel = 1; }
+
+ if (meterLevels) {
+ h = AudioLevel::multiplier_to_preview(h2, m_height);
+ } else {
+ h = h2 * m_height;
+ }
+ if (h < 0) h = 0;
+
+ for (int py = 0; py < h; ++py) {
+ m_image.setPixel(rectX, centre + py, pixel);
+ }
+
+ if (((i+1) % tileWidth()) == 0 || i == (m_rect.getBaseWidth() - 1)) {
+ finalizeCurrentSlice();
+ }
+ }
+
+/* Auto-fade not yet implemented.
+
+ if (m_segment->isAutoFading()) {
+
+ Composition &comp = m_model.getComposition();
+
+ int audioFadeInEnd = int(
+ m_model.grid().getRulerScale()->getXForTime(comp.
+ getElapsedTimeForRealTime(m_segment->getFadeInTime()) +
+ m_segment->getStartTime()) -
+ m_model.grid().getRulerScale()->getXForTime(m_segment->getStartTime()));
+
+ m_p.setPen(Qt::blue);
+ m_p.drawRect(0, m_apData->getSegmentRect().height() - 1, audioFadeInEnd, 1);
+ m_pb.drawRect(0, m_apData->getSegmentRect().height() - 1, audioFadeInEnd, 1);
+ }
+
+ m_p.end();
+ m_pb.end();
+*/
+}
+
+void AudioPreviewPainter::finalizeCurrentSlice()
+{
+// RG_DEBUG << "AudioPreviewPainter::finalizeCurrentSlice : copying pixmap to image at " << m_sliceNb * tileWidth() << endl;
+
+ // transparent background
+ m_image.setColor(0, qRgba(255, 255, 255, 0));
+
+ // foreground from computeSegmentPreviewColor
+ QColor c = m_model.computeSegmentPreviewColor(m_segment);
+ QRgb rgba = qRgba(c.red(), c.green(), c.blue(), 255);
+ m_image.setColor(1, rgba);
+
+ // red for clipping
+ m_image.setColor(2, qRgba(255, 0, 0, 255));
+
+ m_previewPixmaps.push_back(m_image.copy());
+
+ m_image.fill(0);
+
+ ++m_sliceNb;
+}
+
+PixmapArray AudioPreviewPainter::getPreviewImage()
+{
+ return m_previewPixmaps;
+}
+
+}
diff --git a/src/gui/editors/segment/segmentcanvas/AudioPreviewPainter.h b/src/gui/editors/segment/segmentcanvas/AudioPreviewPainter.h
new file mode 100644
index 0000000..b3c1cac
--- /dev/null
+++ b/src/gui/editors/segment/segmentcanvas/AudioPreviewPainter.h
@@ -0,0 +1,79 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_AUDIOPREVIEWPAINTER_H_
+#define _RG_AUDIOPREVIEWPAINTER_H_
+
+#include "CompositionModel.h"
+
+#include <qpainter.h>
+#include <qcolor.h>
+
+namespace Rosegarden {
+
+class CompositionModelImpl;
+class Composition;
+class Segment;
+class CompositionRect;
+
+class AudioPreviewPainter {
+public:
+ AudioPreviewPainter(CompositionModelImpl& model,
+ CompositionModel::AudioPreviewData* apData,
+ const Composition &composition,
+ const Segment* segment);
+
+ void paintPreviewImage();
+ PixmapArray getPreviewImage();
+ const CompositionRect& getSegmentRect() { return m_rect; }
+
+ static int tileWidth();
+
+protected:
+ void finalizeCurrentSlice();
+
+ //--------------- Data members ---------------------------------
+ CompositionModelImpl& m_model;
+ CompositionModel::AudioPreviewData* m_apData;
+ const Composition &m_composition;
+ const Segment* m_segment;
+ CompositionRect m_rect;
+
+ QImage m_image;
+ PixmapArray m_previewPixmaps;
+
+ QPainter m_p;
+ QPainter m_pb;
+ QColor m_defaultCol;
+ int m_penWidth;
+ int m_height;
+ int m_halfRectHeight;
+ int m_sliceNb;
+
+};
+
+}
+
+#endif
+
diff --git a/src/gui/editors/segment/segmentcanvas/AudioPreviewThread.cpp b/src/gui/editors/segment/segmentcanvas/AudioPreviewThread.cpp
new file mode 100644
index 0000000..ae64134
--- /dev/null
+++ b/src/gui/editors/segment/segmentcanvas/AudioPreviewThread.cpp
@@ -0,0 +1,267 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "AudioPreviewThread.h"
+
+#include "base/RealTime.h"
+#include "sound/AudioFileManager.h"
+#include "sound/PeakFileManager.h"
+#include <qapplication.h>
+#include <qevent.h>
+#include <qmutex.h>
+#include <qobject.h>
+#include <qthread.h>
+
+
+namespace Rosegarden
+{
+
+AudioPreviewThread::AudioPreviewThread(AudioFileManager *manager) :
+ m_manager(manager),
+ m_nextToken(0),
+ m_exiting(false),
+ m_emptyQueueListener(0)
+{}
+
+void
+AudioPreviewThread::run()
+{
+ bool emptyQueueSignalled = false;
+
+#ifdef DEBUG_AUDIO_PREVIEW_THREAD
+
+ std::cerr << "AudioPreviewThread::run entering\n";
+#endif
+
+ while (!m_exiting) {
+
+ if (m_queue.empty()) {
+ if (m_emptyQueueListener && !emptyQueueSignalled) {
+ QApplication::postEvent(m_emptyQueueListener,
+ new QCustomEvent(AudioPreviewQueueEmpty, 0));
+ emptyQueueSignalled = true;
+ }
+
+ usleep(300000);
+ } else {
+ process();
+ }
+ }
+
+#ifdef DEBUG_AUDIO_PREVIEW_THREAD
+ std::cerr << "AudioPreviewThread::run exiting\n";
+#endif
+}
+
+void
+AudioPreviewThread::finish()
+{
+ m_exiting = true;
+}
+
+bool
+AudioPreviewThread::process()
+{
+#ifdef DEBUG_AUDIO_PREVIEW_THREAD
+ std::cerr << "AudioPreviewThread::process()\n";
+#endif
+
+ if (!m_queue.empty()) {
+
+ int failed = 0;
+ int inQueue = 0;
+ //int count = 0;
+
+ m_mutex.lock();
+
+ // process 1st request and leave
+ inQueue = m_queue.size();
+ RequestQueue::iterator i = m_queue.begin();
+
+ // i->first is width, which we use only to provide an ordering to
+ // ensure we do smaller previews first. We don't use it here.
+
+ RequestRec &rec = i->second;
+ int token = rec.first;
+ Request req = rec.second;
+ m_mutex.unlock();
+
+ std::vector<float> results;
+
+ try {
+#ifdef DEBUG_AUDIO_PREVIEW_THREAD
+ std::cerr << "AudioPreviewThread::process() file id " << req.audioFileId << std::endl;
+#endif
+
+ // Requires thread-safe AudioFileManager::getPreview
+ results = m_manager->getPreview(req.audioFileId,
+ req.audioStartTime,
+ req.audioEndTime,
+ req.width,
+ req.showMinima);
+ } catch (AudioFileManager::BadAudioPathException e) {
+
+#ifdef DEBUG_AUDIO_PREVIEW_THREAD
+ std::cerr << "AudioPreviewThread::process: failed to update preview for audio file " << req.audioFileId << ": bad audio path: " << e.getMessage() << std::endl;
+#endif
+
+ // OK, we hope this just means we're still recording -- so
+ // leave this one in the queue
+ ++failed;
+
+ } catch (PeakFileManager::BadPeakFileException e) {
+
+#ifdef DEBUG_AUDIO_PREVIEW_THREAD
+ std::cerr << "AudioPreviewThread::process: failed to update preview for audio file " << req.audioFileId << ": bad peak file: " << e.getMessage() << std::endl;
+#endif
+
+ // As above
+ ++failed;
+ }
+
+ m_mutex.lock();
+
+ // We need to check that the token is still in the queue
+ // (i.e. hasn't been cancelled). Otherwise we shouldn't notify
+
+ bool found = false;
+ for (RequestQueue::iterator i = m_queue.begin(); i != m_queue.end(); ++i) {
+ if (i->second.first == token) {
+ found = true;
+ m_queue.erase(i);
+ break;
+ }
+ }
+
+ if (found) {
+ unsigned int channels =
+ m_manager->getAudioFile(req.audioFileId)->getChannels();
+ m_results[token] = ResultsPair(channels, results);
+ QObject *notify = req.notify;
+ QApplication::postEvent
+ (notify,
+ new QCustomEvent(AudioPreviewReady, (void *)token));
+ }
+
+ m_mutex.unlock();
+
+ if (failed > 0 && failed == inQueue) {
+#ifdef DEBUG_AUDIO_PREVIEW_THREAD
+ std::cerr << "AudioPreviewThread::process() - return true\n";
+#endif
+
+ return true; // delay and try again
+ }
+ }
+
+#ifdef DEBUG_AUDIO_PREVIEW_THREAD
+ std::cerr << "AudioPreviewThread::process() - return false\n";
+#endif
+
+ return false;
+}
+
+int
+AudioPreviewThread::requestPreview(const Request &request)
+{
+ m_mutex.lock();
+
+#ifdef DEBUG_AUDIO_PREVIEW_THREAD
+
+ std::cerr << "AudioPreviewThread::requestPreview for file id " << request.audioFileId << ", start " << request.audioStartTime << ", end " << request.audioEndTime << ", width " << request.width << ", notify " << request.notify << std::endl;
+#endif
+ /*!!!
+ for (RequestQueue::iterator i = m_queue.begin(); i != m_queue.end(); ++i) {
+ if (i->second.second.notify == request.notify) {
+ m_queue.erase(i);
+ break;
+ }
+ }
+ */
+ int token = m_nextToken;
+ m_queue.insert(RequestQueue::value_type(request.width,
+ RequestRec(token, request)));
+ ++m_nextToken;
+ m_mutex.unlock();
+
+ // if (!running()) start();
+
+#ifdef DEBUG_AUDIO_PREVIEW_THREAD
+
+ std::cerr << "AudioPreviewThread::requestPreview : thread running : " << running()
+ << " - thread finished : " << finished() << std::endl;
+
+ std::cerr << "AudioPreviewThread::requestPreview - token = " << token << std::endl;
+#endif
+
+ return token;
+}
+
+void
+AudioPreviewThread::cancelPreview(int token)
+{
+ m_mutex.lock();
+
+#ifdef DEBUG_AUDIO_PREVIEW_THREAD
+
+ std::cerr << "AudioPreviewThread::cancelPreview for token " << token << std::endl;
+#endif
+
+ for (RequestQueue::iterator i = m_queue.begin(); i != m_queue.end(); ++i) {
+ if (i->second.first == token) {
+ m_queue.erase(i);
+ break;
+ }
+ }
+
+ m_mutex.unlock();
+}
+
+void
+AudioPreviewThread::getPreview(int token, unsigned int &channels,
+ std::vector<float> &values)
+{
+ m_mutex.lock();
+
+ values.clear();
+ if (m_results.find(token) == m_results.end()) {
+ channels = 0;
+ m_mutex.unlock();
+ return ;
+ }
+
+ channels = m_results[token].first;
+ values = m_results[token].second;
+ m_results.erase(m_results.find(token));
+
+ m_mutex.unlock();
+
+ return ;
+}
+
+const QEvent::Type AudioPreviewThread::AudioPreviewReady = QEvent::Type(QEvent::User + 1);
+const QEvent::Type AudioPreviewThread::AudioPreviewQueueEmpty = QEvent::Type(QEvent::User + 2);
+
+}
diff --git a/src/gui/editors/segment/segmentcanvas/AudioPreviewThread.h b/src/gui/editors/segment/segmentcanvas/AudioPreviewThread.h
new file mode 100644
index 0000000..ae3ac81
--- /dev/null
+++ b/src/gui/editors/segment/segmentcanvas/AudioPreviewThread.h
@@ -0,0 +1,99 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_AUDIOPREVIEWTHREAD_H_
+#define _RG_AUDIOPREVIEWTHREAD_H_
+
+#include "base/RealTime.h"
+#include <map>
+#include <qevent.h>
+#include <qmutex.h>
+#include <qthread.h>
+#include <utility>
+#include <vector>
+
+
+class QObject;
+
+
+namespace Rosegarden
+{
+
+class AudioFileManager;
+
+
+class AudioPreviewThread : public QThread
+{
+public:
+ AudioPreviewThread(AudioFileManager *manager);
+
+ virtual void run();
+ virtual void finish();
+
+ struct Request {
+ int audioFileId;
+ RealTime audioStartTime;
+ RealTime audioEndTime;
+ int width;
+ bool showMinima;
+ QObject *notify;
+ };
+
+ virtual int requestPreview(const Request &request);
+ virtual void cancelPreview(int token);
+ virtual void getPreview(int token, unsigned int &channels,
+ std::vector<float> &values);
+
+ void setEmptyQueueListener(QObject* o) { m_emptyQueueListener = o; }
+
+ static const QEvent::Type AudioPreviewReady;
+ static const QEvent::Type AudioPreviewQueueEmpty;
+
+
+protected:
+ virtual bool process();
+
+
+ AudioFileManager *m_manager;
+ int m_nextToken;
+ bool m_exiting;
+
+ QObject* m_emptyQueueListener;
+
+ typedef std::pair<int, Request> RequestRec;
+ typedef std::multimap<int, RequestRec> RequestQueue;
+ RequestQueue m_queue;
+
+ typedef std::pair<unsigned int, std::vector<float> > ResultsPair;
+ typedef std::map<int, ResultsPair> ResultsQueue;
+ ResultsQueue m_results;
+
+ QMutex m_mutex;
+};
+
+
+}
+
+#endif
diff --git a/src/gui/editors/segment/segmentcanvas/AudioPreviewUpdater.cpp b/src/gui/editors/segment/segmentcanvas/AudioPreviewUpdater.cpp
new file mode 100644
index 0000000..76497b9
--- /dev/null
+++ b/src/gui/editors/segment/segmentcanvas/AudioPreviewUpdater.cpp
@@ -0,0 +1,149 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "AudioPreviewUpdater.h"
+
+#include "misc/Debug.h"
+#include "AudioPreviewThread.h"
+#include "base/Composition.h"
+#include "base/RealTime.h"
+#include "base/Segment.h"
+#include "CompositionModelImpl.h"
+#include <qevent.h>
+#include <qobject.h>
+#include <qrect.h>
+
+
+namespace Rosegarden
+{
+
+static int apuExtantCount = 0;
+
+AudioPreviewUpdater::AudioPreviewUpdater(AudioPreviewThread &thread,
+ const Composition& c, const Segment* s,
+ const QRect& r,
+ CompositionModelImpl* parent)
+ : QObject(parent),
+ m_thread(thread),
+ m_composition(c),
+ m_segment(s),
+ m_rect(r),
+ m_showMinima(false),
+ m_channels(0),
+ m_previewToken( -1)
+{
+ ++apuExtantCount;
+ RG_DEBUG << "AudioPreviewUpdater::AudioPreviewUpdater " << this << " (now " << apuExtantCount << " extant)" << endl;
+}
+
+AudioPreviewUpdater::~AudioPreviewUpdater()
+{
+ --apuExtantCount;
+ RG_DEBUG << "AudioPreviewUpdater::~AudioPreviewUpdater on " << this << " ( token " << m_previewToken << ") (now " << apuExtantCount << " extant)" << endl;
+ if (m_previewToken >= 0)
+ m_thread.cancelPreview(m_previewToken);
+}
+
+void AudioPreviewUpdater::update()
+{
+ // Get sample start and end times and work out duration
+ //
+ RealTime audioStartTime = m_segment->getAudioStartTime();
+ RealTime audioEndTime = audioStartTime +
+ m_composition.getElapsedRealTime(m_segment->getEndMarkerTime()) -
+ m_composition.getElapsedRealTime(m_segment->getStartTime()) ;
+
+ RG_DEBUG << "AudioPreviewUpdater(" << this << ")::update() - for file id "
+ << m_segment->getAudioFileId() << " requesting values - thread running : "
+ << m_thread.running() << " - thread finished : " << m_thread.finished() << endl;
+
+ AudioPreviewThread::Request request;
+ request.audioFileId = m_segment->getAudioFileId();
+ request.audioStartTime = audioStartTime;
+ request.audioEndTime = audioEndTime;
+ request.width = m_rect.width();
+ request.showMinima = m_showMinima;
+ request.notify = this;
+ if (m_previewToken >= 0)
+ m_thread.cancelPreview(m_previewToken);
+ m_previewToken = m_thread.requestPreview(request);
+ if (!m_thread.running())
+ m_thread.start();
+}
+
+void AudioPreviewUpdater::cancel()
+{
+ if (m_previewToken >= 0)
+ m_thread.cancelPreview(m_previewToken);
+ m_previewToken = -1;
+}
+
+bool AudioPreviewUpdater::event(QEvent *e)
+{
+ RG_DEBUG << "AudioPreviewUpdater(" << this << ")::event (" << e << ")" << endl;
+
+ if (e->type() == AudioPreviewThread::AudioPreviewReady) {
+ QCustomEvent *ev = dynamic_cast<QCustomEvent *>(e);
+ if (ev) {
+ intptr_t token = (intptr_t)ev->data();
+ m_channels = 0; // to be filled as getPreview return value
+
+ RG_DEBUG << "AudioPreviewUpdater::token " << token << ", my token " << m_previewToken << endl;
+
+ if (m_previewToken >= 0 && token >= m_previewToken) {
+
+ m_previewToken = -1;
+ m_thread.getPreview(token, m_channels, m_values);
+
+ if (m_channels == 0) {
+ RG_DEBUG << "AudioPreviewUpdater: failed to find preview!\n";
+ } else {
+
+ RG_DEBUG << "AudioPreviewUpdater: got correct preview (" << m_channels
+ << " channels, " << m_values.size() << " samples)\n";
+ }
+
+ emit audioPreviewComplete(this);
+
+ } else {
+
+ // this one is out of date already
+ std::vector<float> tmp;
+ unsigned int tmpChannels;
+ m_thread.getPreview(token, tmpChannels, tmp);
+
+ RG_DEBUG << "AudioPreviewUpdater: got obsolete preview (" << tmpChannels
+ << " channels, " << tmp.size() << " samples)\n";
+ }
+
+ return true;
+ }
+ }
+
+ return QObject::event(e);
+}
+
+}
+#include "AudioPreviewUpdater.moc"
diff --git a/src/gui/editors/segment/segmentcanvas/AudioPreviewUpdater.h b/src/gui/editors/segment/segmentcanvas/AudioPreviewUpdater.h
new file mode 100644
index 0000000..ffc97c9
--- /dev/null
+++ b/src/gui/editors/segment/segmentcanvas/AudioPreviewUpdater.h
@@ -0,0 +1,90 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_AUDIOPREVIEWUPDATER_H_
+#define _RG_AUDIOPREVIEWUPDATER_H_
+
+#include <qobject.h>
+#include <qrect.h>
+#include <vector>
+
+
+class QEvent;
+
+
+namespace Rosegarden
+{
+
+class Segment;
+class CompositionModelImpl;
+class Composition;
+class AudioPreviewThread;
+
+
+class AudioPreviewUpdater : public QObject
+{
+ Q_OBJECT
+
+public:
+ AudioPreviewUpdater(AudioPreviewThread &thread,
+ const Composition &composition,
+ const Segment *segment,
+ const QRect &displayExtent,
+ CompositionModelImpl *parent);
+ ~AudioPreviewUpdater();
+
+ void update();
+ void cancel();
+
+ QRect getDisplayExtent() const { return m_rect; }
+ void setDisplayExtent(const QRect &rect) { m_rect = rect; }
+
+ const Segment *getSegment() const { return m_segment; }
+
+ const std::vector<float> &getComputedValues(unsigned int &channels) const
+ { channels = m_channels; return m_values; }
+
+signals:
+ void audioPreviewComplete(AudioPreviewUpdater*);
+
+protected:
+ virtual bool event(QEvent*);
+
+ AudioPreviewThread& m_thread;
+
+ const Composition& m_composition;
+ const Segment* m_segment;
+ QRect m_rect;
+ bool m_showMinima;
+ unsigned int m_channels;
+ std::vector<float> m_values;
+
+ intptr_t m_previewToken;
+};
+
+
+}
+
+#endif
diff --git a/src/gui/editors/segment/segmentcanvas/CompositionColourCache.cpp b/src/gui/editors/segment/segmentcanvas/CompositionColourCache.cpp
new file mode 100644
index 0000000..b36d6e0
--- /dev/null
+++ b/src/gui/editors/segment/segmentcanvas/CompositionColourCache.cpp
@@ -0,0 +1,62 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "CompositionColourCache.h"
+
+#include "gui/general/GUIPalette.h"
+#include <qcolor.h>
+
+
+namespace Rosegarden
+{
+
+void CompositionColourCache::init()
+{
+ SegmentCanvas = GUIPalette::getColour(GUIPalette::SegmentCanvas);
+ SegmentAudioPreview = GUIPalette::getColour(GUIPalette::SegmentAudioPreview);
+ SegmentInternalPreview = GUIPalette::getColour(GUIPalette::SegmentInternalPreview);
+ SegmentLabel = GUIPalette::getColour(GUIPalette::SegmentLabel);
+ SegmentBorder = GUIPalette::getColour(GUIPalette::SegmentBorder);
+ RepeatSegmentBorder = GUIPalette::getColour(GUIPalette::RepeatSegmentBorder);
+ RecordingSegmentBorder = GUIPalette::getColour(GUIPalette::RecordingSegmentBorder);
+ RecordingAudioSegmentBlock = GUIPalette::getColour(GUIPalette::RecordingAudioSegmentBlock);
+ RecordingInternalSegmentBlock = GUIPalette::getColour(GUIPalette::RecordingInternalSegmentBlock);
+ RotaryFloatBackground = GUIPalette::getColour(GUIPalette::RotaryFloatBackground);
+ RotaryFloatForeground = GUIPalette::getColour(GUIPalette::RotaryFloatForeground);
+
+}
+
+CompositionColourCache* CompositionColourCache::getInstance()
+{
+ if (!m_instance) {
+ m_instance = new CompositionColourCache();
+ }
+
+ return m_instance;
+}
+
+CompositionColourCache* CompositionColourCache::m_instance = 0;
+
+}
diff --git a/src/gui/editors/segment/segmentcanvas/CompositionColourCache.h b/src/gui/editors/segment/segmentcanvas/CompositionColourCache.h
new file mode 100644
index 0000000..32d4719
--- /dev/null
+++ b/src/gui/editors/segment/segmentcanvas/CompositionColourCache.h
@@ -0,0 +1,69 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_COMPOSITIONCOLOURCACHE_H_
+#define _RG_COMPOSITIONCOLOURCACHE_H_
+
+#include <qcolor.h>
+
+
+
+
+namespace Rosegarden
+{
+
+
+
+class CompositionColourCache
+{
+public:
+ static CompositionColourCache* getInstance();
+
+ void init();
+
+ QColor SegmentCanvas;
+ QColor SegmentAudioPreview;
+ QColor SegmentInternalPreview;
+ QColor SegmentLabel;
+ QColor SegmentBorder;
+ QColor RepeatSegmentBorder;
+ QColor RecordingSegmentBorder;
+ QColor RecordingAudioSegmentBlock;
+ QColor RecordingInternalSegmentBlock;
+ QColor Pointer;
+ QColor MovementGuide;
+ QColor RotaryFloatBackground;
+ QColor RotaryFloatForeground;
+
+protected:
+ CompositionColourCache() { init(); }
+ static CompositionColourCache* m_instance;
+};
+
+
+
+}
+
+#endif
diff --git a/src/gui/editors/segment/segmentcanvas/CompositionItem.cpp b/src/gui/editors/segment/segmentcanvas/CompositionItem.cpp
new file mode 100644
index 0000000..798178a
--- /dev/null
+++ b/src/gui/editors/segment/segmentcanvas/CompositionItem.cpp
@@ -0,0 +1,34 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "CompositionItem.h"
+
+#include <qobject.h>
+#include <qrect.h>
+
+
+namespace Rosegarden
+{
+}
diff --git a/src/gui/editors/segment/segmentcanvas/CompositionItem.h b/src/gui/editors/segment/segmentcanvas/CompositionItem.h
new file mode 100644
index 0000000..b5e749b
--- /dev/null
+++ b/src/gui/editors/segment/segmentcanvas/CompositionItem.h
@@ -0,0 +1,67 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_COMPOSITIONITEM_H_
+#define _RG_COMPOSITIONITEM_H_
+
+#include <qguardedptr.h>
+#include <qobject.h>
+#include <qrect.h>
+
+
+namespace Rosegarden
+{
+
+class _CompositionItem : public QObject {
+public:
+ virtual bool isRepeating() const = 0;
+ virtual QRect rect() const = 0;
+ virtual void moveBy(int x, int y) = 0;
+ virtual void moveTo(int x, int y) = 0;
+ virtual void setX(int x) = 0;
+ virtual void setY(int y) = 0;
+ virtual void setZ(unsigned int z) = 0;
+ virtual int x() = 0;
+ virtual int y() = 0;
+ virtual unsigned int z() = 0;
+ virtual void setWidth(int w) = 0;
+
+ // used by itemcontainer
+ virtual long hashKey() = 0;
+
+ QRect savedRect() const { return m_savedRect; }
+ void saveRect() const { m_savedRect = rect(); }
+
+protected:
+ mutable QRect m_savedRect;
+};
+
+typedef QGuardedPtr<_CompositionItem> CompositionItem;
+bool operator<(const CompositionItem&, const CompositionItem&);
+
+
+}
+
+#endif
diff --git a/src/gui/editors/segment/segmentcanvas/CompositionItemHelper.cpp b/src/gui/editors/segment/segmentcanvas/CompositionItemHelper.cpp
new file mode 100644
index 0000000..e1705cd
--- /dev/null
+++ b/src/gui/editors/segment/segmentcanvas/CompositionItemHelper.cpp
@@ -0,0 +1,150 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include <cmath>
+
+#include "CompositionItemHelper.h"
+
+#include "base/Segment.h"
+#include "base/SnapGrid.h"
+#include "misc/Debug.h"
+#include "CompositionModel.h"
+#include "CompositionItemImpl.h"
+#include <qcolor.h>
+#include <qpoint.h>
+#include <qrect.h>
+
+namespace Rosegarden
+{
+
+timeT CompositionItemHelper::getStartTime(const CompositionItem& item, const Rosegarden::SnapGrid& grid)
+{
+ timeT t = 0;
+
+ if (item) {
+ // t = std::max(grid.snapX(item->rect().x()), 0L); - wrong, we can have negative start times,
+ // and if we do this we 'crop' segments when they are moved before the start of the composition
+ t = grid.snapX(item->rect().x());
+
+// RG_DEBUG << "CompositionItemHelper::getStartTime(): item is repeating : " << item->isRepeating()
+// << " - startTime = " << t
+// << endl;
+ }
+
+ return t;
+}
+
+timeT CompositionItemHelper::getEndTime(const CompositionItem& item, const Rosegarden::SnapGrid& grid)
+{
+ timeT t = 0;
+
+ if (item) {
+ QRect itemRect = item->rect();
+
+ t = std::max(grid.snapX(itemRect.x() + itemRect.width()), 0L);
+
+// RG_DEBUG << "CompositionItemHelper::getEndTime() : rect width = "
+// << itemRect.width()
+// << " - item is repeating : " << item->isRepeating()
+// << " - endTime = " << t
+// << endl;
+
+ }
+
+ return t;
+}
+
+void CompositionItemHelper::setStartTime(CompositionItem& item, timeT time,
+ const Rosegarden::SnapGrid& grid)
+{
+ if (item) {
+ int x = int(nearbyint(grid.getRulerScale()->getXForTime(time)));
+
+ RG_DEBUG << "CompositionItemHelper::setStartTime() time = " << time
+ << " -> x = " << x << endl;
+
+ int curX = item->rect().x();
+ item->setX(x);
+ if (item->isRepeating()) {
+ int deltaX = curX - x;
+ CompositionRect& sr = dynamic_cast<CompositionItemImpl*>((_CompositionItem*)item)->getCompRect();
+ int curW = sr.getBaseWidth();
+ sr.setBaseWidth(curW + deltaX);
+ }
+
+ }
+
+}
+
+void CompositionItemHelper::setEndTime(CompositionItem& item, timeT time,
+ const Rosegarden::SnapGrid& grid)
+{
+ if (item) {
+ int x = int(nearbyint(grid.getRulerScale()->getXForTime(time)));
+ QRect r = item->rect();
+ QPoint topRight = r.topRight();
+ topRight.setX(x);
+ r.setTopRight(topRight);
+ item->setWidth(r.width());
+
+ if (item->isRepeating()) {
+ CompositionRect& sr = dynamic_cast<CompositionItemImpl*>((_CompositionItem*)item)->getCompRect();
+ sr.setBaseWidth(r.width());
+ }
+ }
+}
+
+int CompositionItemHelper::getTrackPos(const CompositionItem& item, const Rosegarden::SnapGrid& grid)
+{
+ return grid.getYBin(item->rect().y());
+}
+
+Rosegarden::Segment* CompositionItemHelper::getSegment(CompositionItem item)
+{
+ return (dynamic_cast<CompositionItemImpl*>((_CompositionItem*)item))->getSegment();
+}
+
+CompositionItem CompositionItemHelper::makeCompositionItem(Rosegarden::Segment* segment)
+{
+ return CompositionItem(new CompositionItemImpl(*segment, QRect()));
+}
+
+CompositionItem CompositionItemHelper::findSiblingCompositionItem(const CompositionModel::itemcontainer& items,
+ const CompositionItem& referenceItem)
+{
+ CompositionModel::itemcontainer::const_iterator it;
+ Rosegarden::Segment* currentSegment = CompositionItemHelper::getSegment(referenceItem);
+
+ for (it = items.begin(); it != items.end(); it++) {
+ CompositionItem item = *it;
+ Rosegarden::Segment* segment = CompositionItemHelper::getSegment(item);
+ if (segment == currentSegment) {
+ return item;
+ }
+ }
+
+ return referenceItem;
+}
+
+}
diff --git a/src/gui/editors/segment/segmentcanvas/CompositionItemHelper.h b/src/gui/editors/segment/segmentcanvas/CompositionItemHelper.h
new file mode 100644
index 0000000..1b3ad95
--- /dev/null
+++ b/src/gui/editors/segment/segmentcanvas/CompositionItemHelper.h
@@ -0,0 +1,61 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_COMPOSITIONITEMHELPER_H_
+#define _RG_COMPOSITIONITEMHELPER_H_
+
+#include "CompositionModel.h"
+#include "base/Event.h"
+
+
+
+
+namespace Rosegarden
+{
+
+class SnapGrid;
+class Segment;
+
+
+class CompositionItemHelper {
+public:
+ static timeT getStartTime(const CompositionItem&, const SnapGrid&);
+ static timeT getEndTime(const CompositionItem&, const SnapGrid&);
+ static int getTrackPos(const CompositionItem&, const SnapGrid&);
+ static void setStartTime(CompositionItem&, timeT, const SnapGrid&);
+ static void setEndTime(CompositionItem&, timeT, const SnapGrid&);
+ static Segment* getSegment(CompositionItem);
+ static CompositionItem makeCompositionItem(Segment*);
+ /**
+ * return the CompositionItem in the model which references the same segment as referenceItem
+ */
+ static CompositionItem findSiblingCompositionItem(const CompositionModel::itemcontainer& items, const CompositionItem& referenceItem);
+
+};
+
+
+}
+
+#endif
diff --git a/src/gui/editors/segment/segmentcanvas/CompositionItemImpl.cpp b/src/gui/editors/segment/segmentcanvas/CompositionItemImpl.cpp
new file mode 100644
index 0000000..5508ad2
--- /dev/null
+++ b/src/gui/editors/segment/segmentcanvas/CompositionItemImpl.cpp
@@ -0,0 +1,67 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "CompositionItemImpl.h"
+
+#include "misc/Debug.h"
+#include "base/Segment.h"
+#include "CompositionRect.h"
+#include <qbrush.h>
+#include <qcolor.h>
+#include <qpen.h>
+#include <qpoint.h>
+#include <qrect.h>
+#include <qsize.h>
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+CompositionItemImpl::CompositionItemImpl(Segment& s, const CompositionRect& rect)
+ : m_segment(s),
+ m_rect(rect),
+ m_z(0)
+{}
+
+QRect CompositionItemImpl::rect() const
+{
+ QRect res = m_rect;
+ if (m_rect.isRepeating()) {
+ CompositionRect::repeatmarks repeatMarks = m_rect.getRepeatMarks();
+ int neww = m_rect.getBaseWidth();
+
+ // RG_DEBUG << "CompositionItemImpl::rect() - width = "
+ // << m_rect.width() << " - base w = " << neww << endl;
+ res.setWidth(neww);
+ } else {
+ // RG_DEBUG << "CompositionItemImpl::rect() m_rect not repeating\n";
+ }
+
+
+ return res;
+}
+
+}
diff --git a/src/gui/editors/segment/segmentcanvas/CompositionItemImpl.h b/src/gui/editors/segment/segmentcanvas/CompositionItemImpl.h
new file mode 100644
index 0000000..b5b3ef7
--- /dev/null
+++ b/src/gui/editors/segment/segmentcanvas/CompositionItemImpl.h
@@ -0,0 +1,74 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_COMPOSITIONITEMIMPL_H_
+#define _RG_COMPOSITIONITEMIMPL_H_
+
+#include "CompositionRect.h"
+#include "CompositionItem.h"
+#include <qrect.h>
+
+
+
+
+namespace Rosegarden
+{
+
+class Segment;
+
+
+class CompositionItemImpl : public _CompositionItem {
+public:
+ CompositionItemImpl(Segment& s, const CompositionRect&);
+ virtual bool isRepeating() const { return m_rect.isRepeating(); }
+ virtual QRect rect() const;
+ virtual void moveBy(int x, int y) { m_rect.moveBy(x, y); }
+ virtual void moveTo(int x, int y) { m_rect.setRect(x, y, m_rect.width(), m_rect.height()); }
+ virtual void setX(int x) { m_rect.setX(x); }
+ virtual void setY(int y) { m_rect.setY(y); }
+ virtual void setZ(unsigned int z) { m_z = z; }
+ virtual int x() { return m_rect.x(); }
+ virtual int y() { return m_rect.y(); }
+ virtual unsigned int z() { return m_z; }
+ virtual void setWidth(int w) { m_rect.setWidth(w); }
+ // use segment address as hash key
+ virtual long hashKey() { return (long)getSegment(); }
+
+ Segment* getSegment() { return &m_segment; }
+ const Segment* getSegment() const { return &m_segment; }
+ CompositionRect& getCompRect() { return m_rect; }
+
+protected:
+
+ //--------------- Data members ---------------------------------
+ Segment& m_segment;
+ CompositionRect m_rect;
+ unsigned int m_z;
+};
+
+
+}
+
+#endif
diff --git a/src/gui/editors/segment/segmentcanvas/CompositionModel.cpp b/src/gui/editors/segment/segmentcanvas/CompositionModel.cpp
new file mode 100644
index 0000000..9701c8a
--- /dev/null
+++ b/src/gui/editors/segment/segmentcanvas/CompositionModel.cpp
@@ -0,0 +1,43 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "CompositionModel.h"
+
+#include "misc/Debug.h"
+#include "base/Composition.h"
+#include "base/Segment.h"
+#include "CompositionItemHelper.h"
+
+
+namespace Rosegarden
+{
+
+bool CompositionModel::CompositionItemCompare::operator()(const CompositionItem &c1, const CompositionItem &c2) const
+{
+ return CompositionItemHelper::getSegment(c1) < CompositionItemHelper::getSegment(c2);
+}
+
+}
+#include "CompositionModel.moc"
diff --git a/src/gui/editors/segment/segmentcanvas/CompositionModel.h b/src/gui/editors/segment/segmentcanvas/CompositionModel.h
new file mode 100644
index 0000000..beafc2e
--- /dev/null
+++ b/src/gui/editors/segment/segmentcanvas/CompositionModel.h
@@ -0,0 +1,179 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_COMPOSITIONMODEL_H_
+#define _RG_COMPOSITIONMODEL_H_
+
+#include "base/Composition.h"
+#include "base/Segment.h"
+#include <set>
+#include <qcolor.h>
+#include <qobject.h>
+#include <qimage.h>
+#include <qpoint.h>
+#include <qrect.h>
+#include <utility>
+#include <vector>
+#include "base/Event.h"
+#include "CompositionRect.h"
+#include "CompositionItem.h"
+
+
+class RectRanges;
+class CompositionItem;
+class AudioPreviewDrawData;
+
+
+namespace Rosegarden
+{
+
+class SnapGrid;
+typedef std::vector<QImage> PixmapArray;
+
+
+class CompositionModel : public QObject, public CompositionObserver, public SegmentObserver
+{
+ Q_OBJECT
+public:
+
+ struct CompositionItemCompare {
+ bool operator()(const CompositionItem &c1, const CompositionItem &c2) const;
+ };
+
+ typedef std::vector<QRect> rectlist;
+ typedef std::vector<int> heightlist;
+ typedef std::vector<CompositionRect> rectcontainer;
+ typedef std::set<CompositionItem, CompositionItemCompare> itemcontainer;
+
+ struct AudioPreviewDrawDataItem {
+ AudioPreviewDrawDataItem(PixmapArray p, QPoint bp, QRect r) :
+ pixmap(p), basePoint(bp), rect(r), resizeOffset(0) {};
+ PixmapArray pixmap;
+ QPoint basePoint;
+ QRect rect;
+
+ // when showing a segment that is being resized from the
+ // beginning, this contains the offset between the current
+ // rect of the segment and the resized one
+ int resizeOffset;
+ };
+
+ typedef std::vector<AudioPreviewDrawDataItem> AudioPreviewDrawData;
+
+ struct RectRange {
+ std::pair<rectlist::iterator, rectlist::iterator> range;
+ QPoint basePoint;
+ QColor color;
+ };
+
+ typedef std::vector<RectRange> RectRanges;
+
+ class AudioPreviewData {
+ public:
+ AudioPreviewData(bool showMinima, unsigned int channels) : m_showMinima(showMinima), m_channels(channels) {};
+ // ~AudioPreviewData();
+
+ bool showsMinima() { return m_showMinima; }
+ void setShowMinima(bool s) { m_showMinima = s; }
+
+ unsigned int getChannels() { return m_channels; }
+ void setChannels(unsigned int c) { m_channels = c; }
+
+ const std::vector<float> &getValues() const { return m_values; }
+ void setValues(const std::vector<float>&v) { m_values = v; }
+
+ QRect getSegmentRect() { return m_segmentRect; }
+ void setSegmentRect(const QRect& r) { m_segmentRect = r; }
+
+ protected:
+ std::vector<float> m_values;
+ bool m_showMinima;
+ unsigned int m_channels;
+ QRect m_segmentRect;
+
+ private:
+ // no copy ctor
+ AudioPreviewData(const AudioPreviewData&);
+ };
+
+
+ virtual ~CompositionModel() {};
+
+ virtual unsigned int getNbRows() = 0;
+ virtual const rectcontainer& getRectanglesIn(const QRect& rect,
+ RectRanges* notationRects, AudioPreviewDrawData* audioRects) = 0;
+
+ virtual heightlist getTrackDividersIn(const QRect& rect) = 0;
+
+ virtual itemcontainer getItemsAt (const QPoint&) = 0;
+ virtual timeT getRepeatTimeAt (const QPoint&, const CompositionItem&) = 0;
+
+ virtual SnapGrid& grid() = 0;
+
+ virtual void setPointerPos(int xPos) = 0;
+ virtual void setSelected(const CompositionItem&, bool selected = true) = 0;
+ virtual bool isSelected(const CompositionItem&) const = 0;
+ virtual void setSelected(const itemcontainer&) = 0;
+ virtual void clearSelected() = 0;
+ virtual bool haveSelection() const = 0;
+ virtual bool haveMultipleSelection() const = 0;
+ virtual void signalSelection() = 0;
+ virtual void setSelectionRect(const QRect&) = 0;
+ virtual void finalizeSelectionRect() = 0;
+ virtual QRect getSelectionContentsRect() = 0;
+ virtual void signalContentChange() = 0;
+
+ virtual void addRecordingItem(const CompositionItem&) = 0;
+ virtual void removeRecordingItem(const CompositionItem&) = 0;
+ virtual void clearRecordingItems() = 0;
+ virtual bool haveRecordingItems() = 0;
+
+ enum ChangeType { ChangeMove, ChangeResizeFromStart, ChangeResizeFromEnd };
+
+ virtual void startChange(const CompositionItem&, ChangeType change) = 0;
+ virtual void startChangeSelection(ChangeType change) = 0;
+ virtual itemcontainer& getChangingItems() = 0;
+ virtual void endChange() = 0;
+ virtual ChangeType getChangeType() = 0;
+
+ virtual void setLength(int width) = 0;
+ virtual int getLength() = 0;
+
+signals:
+ void needContentUpdate();
+ void needContentUpdate(const QRect&);
+ void needArtifactsUpdate();
+
+protected:
+ CompositionItem* m_currentCompositionItem;
+};
+
+class AudioPreviewThread;
+class AudioPreviewUpdater;
+
+
+}
+
+#endif
diff --git a/src/gui/editors/segment/segmentcanvas/CompositionModelImpl.cpp b/src/gui/editors/segment/segmentcanvas/CompositionModelImpl.cpp
new file mode 100644
index 0000000..39deb2e
--- /dev/null
+++ b/src/gui/editors/segment/segmentcanvas/CompositionModelImpl.cpp
@@ -0,0 +1,1328 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include <cmath>
+#include <algorithm>
+#include "CompositionModelImpl.h"
+
+#include "base/BaseProperties.h"
+#include "misc/Debug.h"
+#include "misc/Strings.h"
+#include "AudioPreviewThread.h"
+#include "AudioPreviewUpdater.h"
+#include "base/Composition.h"
+#include "base/Event.h"
+#include "base/MidiProgram.h"
+#include "base/NotationTypes.h"
+#include "base/Profiler.h"
+#include "base/RulerScale.h"
+#include "base/Segment.h"
+#include "base/Selection.h"
+#include "base/SnapGrid.h"
+#include "base/Studio.h"
+#include "base/Track.h"
+#include "CompositionItemHelper.h"
+#include "CompositionItemImpl.h"
+#include "CompositionModel.h"
+#include "CompositionRect.h"
+#include "CompositionColourCache.h"
+#include "AudioPreviewPainter.h"
+#include "gui/general/GUIPalette.h"
+#include "SegmentOrderer.h"
+#include <qbrush.h>
+#include <qcolor.h>
+#include <qpen.h>
+#include <qpoint.h>
+#include <qrect.h>
+#include <qregexp.h>
+#include <qsize.h>
+#include <qstring.h>
+
+
+
+namespace Rosegarden
+{
+
+CompositionModelImpl::CompositionModelImpl(Composition& compo,
+ Studio& studio,
+ RulerScale *rulerScale,
+ int vStep)
+ : m_composition(compo),
+ m_studio(studio),
+ m_grid(rulerScale, vStep),
+ m_pointerTimePos(0),
+ m_audioPreviewThread(0)
+{
+ m_notationPreviewDataCache.setAutoDelete(true);
+ m_audioPreviewDataCache.setAutoDelete(true);
+ m_composition.addObserver(this);
+
+ setTrackHeights();
+
+ const Composition::segmentcontainer& segments = m_composition.getSegments();
+ Composition::segmentcontainer::iterator segEnd = segments.end();
+
+ for (Composition::segmentcontainer::iterator i = segments.begin();
+ i != segEnd; ++i) {
+
+ (*i)->addObserver(this);
+ }
+}
+
+CompositionModelImpl::~CompositionModelImpl()
+{
+ RG_DEBUG << "CompositionModelImpl::~CompositionModelImpl()" << endl;
+
+ if (!isCompositionDeleted()) {
+
+ m_composition.removeObserver(this);
+
+ const Composition::segmentcontainer& segments = m_composition.getSegments();
+ Composition::segmentcontainer::iterator segEnd = segments.end();
+
+ for (Composition::segmentcontainer::iterator i = segments.begin();
+ i != segEnd; ++i) {
+
+ (*i)->removeObserver(this);
+ }
+ }
+
+ RG_DEBUG << "CompositionModelImpl::~CompositionModelImpl(): removal from Segment & Composition observers OK" << endl;
+
+ if (m_audioPreviewThread) {
+ while (!m_audioPreviewUpdaterMap.empty()) {
+ // Cause any running previews to be cancelled
+ delete m_audioPreviewUpdaterMap.begin()->second;
+ m_audioPreviewUpdaterMap.erase(m_audioPreviewUpdaterMap.begin());
+ }
+ }
+}
+
+struct RectCompare {
+ bool operator()(const QRect &r1, const QRect &r2) const {
+ return r1.x() < r2.x();
+ }
+};
+
+void CompositionModelImpl::makeNotationPreviewRects(RectRanges* npRects, QPoint basePoint,
+ const Segment* segment, const QRect& clipRect)
+{
+
+ rectlist* cachedNPData = getNotationPreviewData(segment);
+
+ if (cachedNPData->empty())
+ return ;
+
+ rectlist::iterator npEnd = cachedNPData->end();
+
+ rectlist::iterator npi = std::lower_bound(cachedNPData->begin(), npEnd, clipRect, RectCompare());
+
+ if (npi == npEnd)
+ return ;
+
+ if (npi != cachedNPData->begin())
+ --npi;
+
+ RectRange interval;
+
+ interval.range.first = npi;
+
+ int segEndX = int(nearbyint(m_grid.getRulerScale()->getXForTime(segment->getEndMarkerTime())));
+ int xLim = std::min(clipRect.topRight().x(), segEndX);
+
+ // RG_DEBUG << "CompositionModelImpl::makeNotationPreviewRects : basePoint.x : "
+ // << basePoint.x() << endl;
+
+ // move iterator forward
+ //
+ while (npi->x() < xLim && npi != npEnd)
+ ++npi;
+
+ interval.range.second = npi;
+ interval.basePoint.setX(0);
+ interval.basePoint.setY(basePoint.y());
+ interval.color = computeSegmentPreviewColor(segment);
+
+ npRects->push_back(interval);
+}
+
+void CompositionModelImpl::makeNotationPreviewRectsMovingSegment(RectRanges* npRects, QPoint basePoint,
+ const Segment* segment, const QRect& currentSR)
+{
+ CompositionRect unmovedSR = computeSegmentRect(*segment);
+
+ rectlist* cachedNPData = getNotationPreviewData(segment);
+
+ if (cachedNPData->empty())
+ return ;
+
+ rectlist::iterator npEnd = cachedNPData->end(),
+ npBegin = cachedNPData->begin();
+
+ rectlist::iterator npi;
+
+ if (getChangeType() == ChangeResizeFromStart)
+ npi = std::lower_bound(npBegin, npEnd, currentSR, RectCompare());
+ else
+ npi = std::lower_bound(npBegin, npEnd, unmovedSR, RectCompare());
+
+ if (npi == npEnd)
+ return ;
+
+ if (npi != npBegin && getChangeType() != ChangeResizeFromStart) {
+ --npi;
+ }
+
+ RectRange interval;
+
+ interval.range.first = npi;
+
+ int xLim = getChangeType() == ChangeMove ? unmovedSR.topRight().x() : currentSR.topRight().x();
+
+ // RG_DEBUG << "CompositionModelImpl::makeNotationPreviewRectsMovingSegment : basePoint.x : "
+ // << basePoint.x() << endl;
+
+ // move iterator forward
+ //
+ while (npi->x() < xLim && npi != npEnd)
+ ++npi;
+
+ interval.range.second = npi;
+ interval.basePoint.setY(basePoint.y());
+
+ if (getChangeType() == ChangeMove)
+ interval.basePoint.setX(basePoint.x() - unmovedSR.x());
+ else
+ interval.basePoint.setX(0);
+
+ interval.color = computeSegmentPreviewColor(segment);
+
+ npRects->push_back(interval);
+}
+
+void CompositionModelImpl::makeAudioPreviewRects(AudioPreviewDrawData* apRects, const Segment* segment,
+ const CompositionRect& segRect, const QRect& clipRect)
+{
+ Profiler profiler("CompositionModelImpl::makeAudioPreviewRects", true);
+ RG_DEBUG << "CompositionModelImpl::makeAudioPreviewRects - segRect = " << segRect << endl;
+
+ PixmapArray previewImage = getAudioPreviewPixmap(segment);
+
+ QPoint basePoint = segRect.topLeft();
+
+ AudioPreviewDrawDataItem previewItem(previewImage, basePoint, segRect);
+
+ if (getChangeType() == ChangeResizeFromStart) {
+ CompositionRect originalRect = computeSegmentRect(*segment);
+ previewItem.resizeOffset = segRect.x() - originalRect.x();
+ }
+
+ apRects->push_back(previewItem);
+}
+
+void CompositionModelImpl::computeRepeatMarks(CompositionItem& item)
+{
+ Segment* s = CompositionItemHelper::getSegment(item);
+ CompositionRect& sr = dynamic_cast<CompositionItemImpl*>((_CompositionItem*)item)->getCompRect();
+ computeRepeatMarks(sr, s);
+}
+
+void CompositionModelImpl::computeRepeatMarks(CompositionRect& sr, const Segment* s)
+{
+ if (s->isRepeating()) {
+
+ timeT startTime = s->getStartTime();
+ timeT endTime = s->getEndMarkerTime();
+ timeT repeatInterval = endTime - startTime;
+
+ if (repeatInterval <= 0) {
+ // std::cerr << "WARNING: CompositionModelImpl::computeRepeatMarks: Segment at " << startTime << " has repeatInterval " << repeatInterval << std::endl;
+ // std::cerr << kdBacktrace() << std::endl;
+ return ;
+ }
+
+ timeT repeatStart = endTime;
+ timeT repeatEnd = s->getRepeatEndTime();
+ sr.setWidth(int(nearbyint(m_grid.getRulerScale()->getWidthForDuration(startTime,
+ repeatEnd - startTime))));
+
+ CompositionRect::repeatmarks repeatMarks;
+
+ // RG_DEBUG << "CompositionModelImpl::computeRepeatMarks : repeatStart = "
+ // << repeatStart << " - repeatEnd = " << repeatEnd << endl;
+
+ for (timeT repeatMark = repeatStart; repeatMark < repeatEnd; repeatMark += repeatInterval) {
+ int mark = int(nearbyint(m_grid.getRulerScale()->getXForTime(repeatMark)));
+ // RG_DEBUG << "CompositionModelImpl::computeRepeatMarks : mark at " << mark << endl;
+ repeatMarks.push_back(mark);
+ }
+ sr.setRepeatMarks(repeatMarks);
+ if (repeatMarks.size() > 0)
+ sr.setBaseWidth(repeatMarks[0] - sr.x());
+ else {
+ // RG_DEBUG << "CompositionModelImpl::computeRepeatMarks : no repeat marks\n";
+ sr.setBaseWidth(sr.width());
+ }
+
+ // RG_DEBUG << "CompositionModelImpl::computeRepeatMarks : s = "
+ // << s << " base width = " << sr.getBaseWidth()
+ // << " - nb repeat marks = " << repeatMarks.size() << endl;
+
+ }
+}
+
+void CompositionModelImpl::setAudioPreviewThread(AudioPreviewThread *thread)
+{
+ // std::cerr << "\nCompositionModelImpl::setAudioPreviewThread()\n" << std::endl;
+
+ while (!m_audioPreviewUpdaterMap.empty()) {
+ // Cause any running previews to be cancelled
+ delete m_audioPreviewUpdaterMap.begin()->second;
+ m_audioPreviewUpdaterMap.erase(m_audioPreviewUpdaterMap.begin());
+ }
+
+ m_audioPreviewThread = thread;
+}
+
+void CompositionModelImpl::clearPreviewCache()
+{
+ RG_DEBUG << "CompositionModelImpl::clearPreviewCache\n";
+
+ m_notationPreviewDataCache.clear();
+ m_audioPreviewDataCache.clear();
+ m_audioSegmentPreviewMap.clear();
+
+ for (AudioPreviewUpdaterMap::iterator i = m_audioPreviewUpdaterMap.begin();
+ i != m_audioPreviewUpdaterMap.end(); ++i) {
+ i->second->cancel();
+ }
+
+ const Composition::segmentcontainer& segments = m_composition.getSegments();
+ Composition::segmentcontainer::iterator segEnd = segments.end();
+
+ for (Composition::segmentcontainer::iterator i = segments.begin();
+ i != segEnd; ++i) {
+
+ if ((*i)->getType() == Segment::Audio) {
+ // This will create the audio preview updater. The
+ // preview won't be calculated and cached until the
+ // updater completes and calls back.
+ updatePreviewCacheForAudioSegment((*i), 0);
+ }
+ }
+}
+
+void CompositionModelImpl::updatePreviewCacheForNotationSegment(const Segment* segment, rectlist* npData)
+{
+ npData->clear();
+
+ int segStartX = int(nearbyint(m_grid.getRulerScale()->getXForTime(segment->getStartTime())));
+
+ bool isPercussion = false;
+ Track *track = m_composition.getTrackById(segment->getTrack());
+ if (track) {
+ InstrumentId iid = track->getInstrument();
+ Instrument *instrument = m_studio.getInstrumentById(iid);
+ if (instrument && instrument->isPercussion()) isPercussion = true;
+ }
+
+ for (Segment::iterator i = segment->begin();
+ i != segment->end(); ++i) {
+
+ long pitch = 0;
+ if (!(*i)->isa(Note::EventType) ||
+ !(*i)->get<Int>(BaseProperties::PITCH, pitch)) {
+ continue;
+ }
+
+ timeT eventStart = (*i)->getAbsoluteTime();
+ timeT eventEnd = eventStart + (*i)->getDuration();
+ // if (eventEnd > segment->getEndMarkerTime()) {
+ // eventEnd = segment->getEndMarkerTime();
+ // }
+
+ int x = int(nearbyint(m_grid.getRulerScale()->getXForTime(eventStart)));
+ int width = int(nearbyint(m_grid.getRulerScale()->getWidthForDuration(eventStart,
+ eventEnd - eventStart)));
+
+ if (x <= segStartX) {
+ ++x;
+ if (width > 1)
+ --width;
+ }
+ if (width > 1)
+ --width;
+ if (width < 1)
+ ++width;
+
+ double y0 = 0;
+ double y1 = m_grid.getYSnap();
+ double y = y1 + ((y0 - y1) * (pitch - 16)) / 96;
+
+ int height = 2;
+
+ if (isPercussion) {
+ height = 3;
+ if (width > 2) width = 2;
+ }
+
+ if (y < y0)
+ y = y0;
+ if (y > y1 - height + 1)
+ y = y1 - height + 1;
+
+ QRect r(x, (int)y, width, height);
+
+ // RG_DEBUG << "CompositionModelImpl::updatePreviewCacheForNotationSegment() : npData = "
+ // << npData << ", preview rect = "
+ // << r << endl;
+ npData->push_back(r);
+ }
+
+}
+
+QColor CompositionModelImpl::computeSegmentPreviewColor(const Segment* segment)
+{
+ // compute the preview color so it's as visible as possible over the segment's color
+ QColor segColor = GUIPalette::convertColour(m_composition.getSegmentColourMap().getColourByIndex(segment->getColourIndex()));
+ int h, s, v;
+ segColor.hsv(&h, &s, &v);
+
+ // colors with saturation lower than value should be pastel tints, and
+ // they get a value of 0; yellow and green hues close to the dead center
+ // point for that hue were taking a value of 255 with the (s < v)
+ // formula, so I added an extra hack to force hues in those two narrow
+ // ranges toward black. Black always looks good, while white washes out
+ // badly against intense yellow, and doesn't look very good against
+ // intense green either... hacky, but this produces pleasant results against
+ // every bizarre extreme of color I could cook up to throw at it, plus
+ // (the real reason for all this convoluted fiddling, it does all that while keeping
+ // white against bright reds and blues, which looks better than black)
+ if ( ((((h > 57) && (h < 66)) || ((h > 93) && (h < 131))) && (s > 127) && (v > 127) ) ||
+ (s < v) ) {
+ v = 0;
+ } else {
+ v = 255;
+ }
+ s = 31;
+ h += 180;
+
+ segColor.setHsv(h, s, v);
+
+ return segColor;
+}
+
+void CompositionModelImpl::updatePreviewCacheForAudioSegment(const Segment* segment, AudioPreviewData* apData)
+{
+ if (m_audioPreviewThread) {
+ // std::cerr << "CompositionModelImpl::updatePreviewCacheForAudioSegment() - new audio preview started" << std::endl;
+
+ CompositionRect segRect = computeSegmentRect(*segment);
+ segRect.setWidth(segRect.getBaseWidth()); // don't use repeating area
+ segRect.moveTopLeft(QPoint(0, 0));
+
+ if (apData)
+ apData->setSegmentRect(segRect);
+
+ if (m_audioPreviewUpdaterMap.find(segment) ==
+ m_audioPreviewUpdaterMap.end()) {
+
+ AudioPreviewUpdater *updater = new AudioPreviewUpdater
+ (*m_audioPreviewThread, m_composition, segment, segRect, this);
+
+ connect(updater, SIGNAL(audioPreviewComplete(AudioPreviewUpdater*)),
+ this, SLOT(slotAudioPreviewComplete(AudioPreviewUpdater*)));
+
+ m_audioPreviewUpdaterMap[segment] = updater;
+
+ } else {
+
+ m_audioPreviewUpdaterMap[segment]->setDisplayExtent(segRect);
+ }
+
+ m_audioPreviewUpdaterMap[segment]->update();
+
+ } else {
+ RG_DEBUG << "CompositionModelImpl::updatePreviewCacheForAudioSegment() - no audio preview thread set\n";
+ }
+}
+
+void CompositionModelImpl::slotAudioPreviewComplete(AudioPreviewUpdater* apu)
+{
+ RG_DEBUG << "CompositionModelImpl::slotAudioPreviewComplete()\n";
+
+ AudioPreviewData *apData = getAudioPreviewData(apu->getSegment());
+ QRect updateRect;
+
+ if (apData) {
+ RG_DEBUG << "CompositionModelImpl::slotAudioPreviewComplete(" << apu << "): apData contains " << apData->getValues().size() << " values already" << endl;
+ unsigned int channels = 0;
+ const std::vector<float> &values = apu->getComputedValues(channels);
+ if (channels > 0) {
+ RG_DEBUG << "CompositionModelImpl::slotAudioPreviewComplete: set "
+ << values.size() << " samples on " << channels << " channels\n";
+ apData->setChannels(channels);
+ apData->setValues(values);
+ updateRect = postProcessAudioPreview(apData, apu->getSegment());
+ }
+ }
+
+ if (!updateRect.isEmpty())
+ emit needContentUpdate(updateRect);
+}
+
+QRect CompositionModelImpl::postProcessAudioPreview(AudioPreviewData* apData, const Segment* segment)
+{
+ // RG_DEBUG << "CompositionModelImpl::postProcessAudioPreview()\n";
+
+ AudioPreviewPainter previewPainter(*this, apData, m_composition, segment);
+ previewPainter.paintPreviewImage();
+
+ m_audioSegmentPreviewMap[segment] = previewPainter.getPreviewImage();
+
+ return previewPainter.getSegmentRect();
+}
+
+void CompositionModelImpl::slotInstrumentParametersChanged(InstrumentId id)
+{
+ std::cerr << "CompositionModelImpl::slotInstrumentParametersChanged()\n";
+ const Composition::segmentcontainer& segments = m_composition.getSegments();
+ Composition::segmentcontainer::iterator segEnd = segments.end();
+
+ for (Composition::segmentcontainer::iterator i = segments.begin();
+ i != segEnd; ++i) {
+
+ Segment* s = *i;
+ TrackId trackId = s->getTrack();
+ Track *track = getComposition().getTrackById(trackId);
+
+ // We need to update the cache for audio segments, because the
+ // instrument playback level is reflected in the audio
+ // preview. And we need to update it for midi segments,
+ // because the preview style differs depending on whether the
+ // segment is on a percussion instrument or not
+
+ if (track && track->getInstrument() == id) {
+ removePreviewCache(s);
+ emit needContentUpdate(computeSegmentRect(*s));
+ }
+ }
+}
+
+void CompositionModelImpl::slotAudioFileFinalized(Segment* s)
+{
+ // RG_DEBUG << "CompositionModelImpl::slotAudioFileFinalized()\n";
+ removePreviewCache(s);
+}
+
+PixmapArray CompositionModelImpl::getAudioPreviewPixmap(const Segment* s)
+{
+ getAudioPreviewData(s);
+ return m_audioSegmentPreviewMap[s];
+}
+
+void CompositionModelImpl::eventAdded(const Segment *s, Event *)
+{
+ // RG_DEBUG << "CompositionModelImpl::eventAdded()\n";
+ removePreviewCache(s);
+ emit needContentUpdate(computeSegmentRect(*s));
+}
+
+void CompositionModelImpl::eventRemoved(const Segment *s, Event *)
+{
+ // RG_DEBUG << "CompositionModelImpl::eventRemoved" << endl;
+ removePreviewCache(s);
+ emit needContentUpdate(computeSegmentRect(*s));
+}
+
+void CompositionModelImpl::appearanceChanged(const Segment *s)
+{
+ // RG_DEBUG << "CompositionModelImpl::appearanceChanged" << endl;
+ clearInCache(s, true);
+ emit needContentUpdate(computeSegmentRect(*s));
+}
+
+void CompositionModelImpl::endMarkerTimeChanged(const Segment *s, bool shorten)
+{
+ // RG_DEBUG << "CompositionModelImpl::endMarkerTimeChanged(" << shorten << ")" << endl;
+ clearInCache(s, true);
+ if (shorten) {
+ emit needContentUpdate(); // no longer know former segment dimension
+ } else {
+ emit needContentUpdate(computeSegmentRect(*s));
+ }
+}
+
+void CompositionModelImpl::makePreviewCache(const Segment *s)
+{
+ if (s->getType() == Segment::Internal) {
+ makeNotationPreviewDataCache(s);
+ } else {
+ makeAudioPreviewDataCache(s);
+ }
+}
+
+void CompositionModelImpl::removePreviewCache(const Segment *s)
+{
+ if (s->getType() == Segment::Internal) {
+ m_notationPreviewDataCache.remove(const_cast<Segment*>(s));
+ } else {
+ m_audioPreviewDataCache.remove(const_cast<Segment*>(s));
+ m_audioSegmentPreviewMap.erase(s);
+ }
+
+}
+
+void CompositionModelImpl::segmentAdded(const Composition *, Segment *s)
+{
+ std::cerr << "CompositionModelImpl::segmentAdded: segment " << s << " on track " << s->getTrack() << ": calling setTrackHeights" << std::endl;
+ setTrackHeights(s);
+
+ makePreviewCache(s);
+ s->addObserver(this);
+ emit needContentUpdate();
+}
+
+void CompositionModelImpl::segmentRemoved(const Composition *, Segment *s)
+{
+ setTrackHeights();
+
+ QRect r = computeSegmentRect(*s);
+
+ m_selectedSegments.erase(s);
+
+ clearInCache(s, true);
+ s->removeObserver(this);
+ m_recordingSegments.erase(s); // this could be a recording segment
+ emit needContentUpdate(r);
+}
+
+void CompositionModelImpl::segmentTrackChanged(const Composition *, Segment *s, TrackId tid)
+{
+ std::cerr << "CompositionModelImpl::segmentTrackChanged: segment " << s << " on track " << tid << ", calling setTrackHeights" << std::endl;
+
+ // we don't call setTrackHeights(s), because some of the tracks
+ // above s may have changed height as well (if s was moved off one
+ // of them)
+ if (setTrackHeights()) {
+ std::cerr << "... changed, updating" << std::endl;
+ emit needContentUpdate();
+ }
+}
+
+void CompositionModelImpl::segmentStartChanged(const Composition *, Segment *s, timeT)
+{
+// std::cerr << "CompositionModelImpl::segmentStartChanged: segment " << s << " on track " << s->getTrack() << ": calling setTrackHeights" << std::endl;
+ if (setTrackHeights(s)) emit needContentUpdate();
+}
+
+void CompositionModelImpl::segmentEndMarkerChanged(const Composition *, Segment *s, bool)
+{
+// std::cerr << "CompositionModelImpl::segmentEndMarkerChanged: segment " << s << " on track " << s->getTrack() << ": calling setTrackHeights" << std::endl;
+ if (setTrackHeights(s)) {
+// std::cerr << "... changed, updating" << std::endl;
+ emit needContentUpdate();
+ }
+}
+
+void CompositionModelImpl::segmentRepeatChanged(const Composition *, Segment *s, bool)
+{
+ clearInCache(s);
+ setTrackHeights(s);
+ emit needContentUpdate();
+}
+
+void CompositionModelImpl::endMarkerTimeChanged(const Composition *, bool)
+{
+ emit needSizeUpdate();
+}
+
+void CompositionModelImpl::setSelectionRect(const QRect& r)
+{
+ m_selectionRect = r.normalize();
+
+ m_previousTmpSelectedSegments = m_tmpSelectedSegments;
+ m_tmpSelectedSegments.clear();
+
+ const Composition::segmentcontainer& segments = m_composition.getSegments();
+ Composition::segmentcontainer::iterator segEnd = segments.end();
+
+ QRect updateRect = m_selectionRect;
+
+ for (Composition::segmentcontainer::iterator i = segments.begin();
+ i != segEnd; ++i) {
+
+ Segment* s = *i;
+ CompositionRect sr = computeSegmentRect(*s);
+ if (sr.intersects(m_selectionRect)) {
+ m_tmpSelectedSegments.insert(s);
+ updateRect |= sr;
+ }
+ }
+
+ updateRect = updateRect.normalize();
+
+ if (!updateRect.isNull() && !m_previousSelectionUpdateRect.isNull()) {
+
+ if (m_tmpSelectedSegments != m_previousTmpSelectedSegments)
+ emit needContentUpdate(updateRect | m_previousSelectionUpdateRect);
+
+ emit needArtifactsUpdate();
+ }
+
+
+ m_previousSelectionUpdateRect = updateRect;
+
+}
+
+void CompositionModelImpl::finalizeSelectionRect()
+{
+ const Composition::segmentcontainer& segments = m_composition.getSegments();
+ Composition::segmentcontainer::iterator segEnd = segments.end();
+
+ for (Composition::segmentcontainer::iterator i = segments.begin();
+ i != segEnd; ++i) {
+
+ Segment* s = *i;
+ CompositionRect sr = computeSegmentRect(*s);
+ if (sr.intersects(m_selectionRect)) {
+ setSelected(s);
+ }
+ }
+
+ m_previousSelectionUpdateRect = m_selectionRect = QRect();
+ m_tmpSelectedSegments.clear();
+}
+
+QRect CompositionModelImpl::getSelectionContentsRect()
+{
+ QRect selectionRect;
+
+ SegmentSelection sel = getSelectedSegments();
+ for (SegmentSelection::iterator i = sel.begin();
+ i != sel.end(); ++i) {
+
+ Segment* s = *i;
+ CompositionRect sr = computeSegmentRect(*s);
+ selectionRect |= sr;
+ }
+
+ return selectionRect;
+}
+
+void CompositionModelImpl::addRecordingItem(const CompositionItem& item)
+{
+ m_recordingSegments.insert(CompositionItemHelper::getSegment(item));
+ emit needContentUpdate();
+
+ RG_DEBUG << "CompositionModelImpl::addRecordingItem: now have "
+ << m_recordingSegments.size() << " recording items\n";
+}
+
+void CompositionModelImpl::removeRecordingItem(const CompositionItem &item)
+{
+ Segment* s = CompositionItemHelper::getSegment(item);
+
+ m_recordingSegments.erase(s);
+ clearInCache(s, true);
+
+ emit needContentUpdate();
+
+ RG_DEBUG << "CompositionModelImpl::removeRecordingItem: now have "
+ << m_recordingSegments.size() << " recording items\n";
+}
+
+void CompositionModelImpl::clearRecordingItems()
+{
+ for (recordingsegmentset::iterator i = m_recordingSegments.begin();
+ i != m_recordingSegments.end(); ++i)
+ clearInCache(*i, true);
+
+ m_recordingSegments.clear();
+
+ emit needContentUpdate();
+ RG_DEBUG << "CompositionModelImpl::clearRecordingItem\n";
+}
+
+bool CompositionModelImpl::isMoving(const Segment* sm) const
+{
+ itemcontainer::const_iterator movEnd = m_changingItems.end();
+
+ for (itemcontainer::const_iterator i = m_changingItems.begin(); i != movEnd; ++i) {
+ const CompositionItemImpl* ci = dynamic_cast<const CompositionItemImpl*>((_CompositionItem*)(*i));
+ const Segment* s = ci->getSegment();
+ if (sm == s)
+ return true;
+ }
+
+ return false;
+}
+
+bool CompositionModelImpl::isRecording(const Segment* s) const
+{
+ return m_recordingSegments.find(const_cast<Segment*>(s)) != m_recordingSegments.end();
+}
+
+CompositionModel::itemcontainer CompositionModelImpl::getItemsAt(const QPoint& point)
+{
+ itemcontainer res;
+
+ const Composition::segmentcontainer& segments = m_composition.getSegments();
+
+ for (Composition::segmentcontainer::iterator i = segments.begin();
+ i != segments.end(); ++i) {
+
+ Segment* s = *i;
+
+ CompositionRect sr = computeSegmentRect(*s);
+ if (sr.contains(point)) {
+ // RG_DEBUG << "CompositionModelImpl::getItemsAt() adding " << sr << " for segment " << s << endl;
+ CompositionItem item(new CompositionItemImpl(*s, sr));
+ unsigned int z = computeZForSegment(s);
+ // RG_DEBUG << "CompositionModelImpl::getItemsAt() z = " << z << endl;
+ item->setZ(z);
+ res.insert(item);
+ } else {
+ // RG_DEBUG << "CompositionModelImpl::getItemsAt() skiping " << sr << endl;
+ }
+
+ }
+
+ if (res.size() == 1) { // only one segment under click point
+ Segment* s = CompositionItemHelper::getSegment(*(res.begin()));
+ m_segmentOrderer.segmentClicked(s);
+ }
+
+ return res;
+}
+
+void CompositionModelImpl::setPointerPos(int xPos)
+{
+ m_pointerTimePos = grid().getRulerScale()->getTimeForX(xPos);
+
+ for (recordingsegmentset::iterator i = m_recordingSegments.begin();
+ i != m_recordingSegments.end(); ++i) {
+ emit needContentUpdate(computeSegmentRect(**i));
+ }
+}
+
+void CompositionModelImpl::setSelected(const CompositionItem& item, bool selected)
+{
+ const CompositionItemImpl* itemImpl = dynamic_cast<const CompositionItemImpl*>((_CompositionItem*)item);
+ if (itemImpl) {
+ Segment* segment = const_cast<Segment*>(itemImpl->getSegment());
+ setSelected(segment, selected);
+ }
+}
+
+void CompositionModelImpl::setSelected(const itemcontainer& items)
+{
+ for (itemcontainer::const_iterator i = items.begin(); i != items.end(); ++i) {
+ setSelected(*i);
+ }
+}
+
+void CompositionModelImpl::setSelected(const Segment* segment, bool selected)
+{
+ RG_DEBUG << "CompositionModelImpl::setSelected " << segment << " - " << selected << endl;
+ if (selected) {
+ if (!isSelected(segment))
+ m_selectedSegments.insert(const_cast<Segment*>(segment));
+ } else {
+ SegmentSelection::iterator i = m_selectedSegments.find(const_cast<Segment*>(segment));
+ if (i != m_selectedSegments.end())
+ m_selectedSegments.erase(i);
+ }
+ emit needContentUpdate();
+}
+
+void CompositionModelImpl::signalSelection()
+{
+ // RG_DEBUG << "CompositionModelImpl::signalSelection()\n";
+ emit selectedSegments(getSelectedSegments());
+}
+
+void CompositionModelImpl::signalContentChange()
+{
+ // RG_DEBUG << "CompositionModelImpl::signalContentChange" << endl;
+ emit needContentUpdate();
+}
+
+void CompositionModelImpl::clearSelected()
+{
+ RG_DEBUG << "CompositionModelImpl::clearSelected" << endl;
+ m_selectedSegments.clear();
+ emit needContentUpdate();
+}
+
+bool CompositionModelImpl::isSelected(const CompositionItem& ci) const
+{
+ const CompositionItemImpl* itemImpl = dynamic_cast<const CompositionItemImpl*>((_CompositionItem*)ci);
+ return itemImpl ? isSelected(itemImpl->getSegment()) : 0;
+}
+
+bool CompositionModelImpl::isSelected(const Segment* s) const
+{
+ return m_selectedSegments.find(const_cast<Segment*>(s)) != m_selectedSegments.end();
+}
+
+bool CompositionModelImpl::isTmpSelected(const Segment* s) const
+{
+ return m_tmpSelectedSegments.find(const_cast<Segment*>(s)) != m_tmpSelectedSegments.end();
+}
+
+bool CompositionModelImpl::wasTmpSelected(const Segment* s) const
+{
+ return m_previousTmpSelectedSegments.find(const_cast<Segment*>(s)) != m_previousTmpSelectedSegments.end();
+}
+
+void CompositionModelImpl::startChange(const CompositionItem& item, CompositionModel::ChangeType change)
+{
+ m_changeType = change;
+
+ itemcontainer::iterator i = m_changingItems.find(item);
+
+ // if an "identical" composition item has already been inserted, drop this one
+ if (i != m_changingItems.end()) {
+ RG_DEBUG << "CompositionModelImpl::startChange : item already in\n";
+ m_itemGC.push_back(item);
+ } else {
+ item->saveRect();
+ m_changingItems.insert(item);
+ }
+}
+
+void CompositionModelImpl::startChangeSelection(CompositionModel::ChangeType change)
+{
+ SegmentSelection::iterator i = m_selectedSegments.begin();
+ for (; i != m_selectedSegments.end(); ++i) {
+ Segment* s = *i;
+ CompositionRect sr = computeSegmentRect(*s);
+ startChange(CompositionItem(new CompositionItemImpl(*s, sr)), change);
+ }
+
+}
+
+void CompositionModelImpl::endChange()
+{
+ for (itemcontainer::const_iterator i = m_changingItems.begin(); i != m_changingItems.end(); ++i) {
+ delete *i;
+ }
+
+ m_changingItems.clear();
+
+ for (itemgc::iterator i = m_itemGC.begin(); i != m_itemGC.end(); ++i) {
+ delete *i;
+ }
+ m_itemGC.clear();
+ RG_DEBUG << "CompositionModelImpl::endChange\n";
+ emit needContentUpdate();
+}
+
+void CompositionModelImpl::setLength(int width)
+{
+ timeT endMarker = m_grid.snapX(width);
+ m_composition.setEndMarker(endMarker);
+}
+
+int CompositionModelImpl::getLength()
+{
+ timeT endMarker = m_composition.getEndMarker();
+ int w = int(nearbyint(m_grid.getRulerScale()->getWidthForDuration(0, endMarker)));
+ return w;
+}
+
+timeT CompositionModelImpl::getRepeatTimeAt(const QPoint& p, const CompositionItem& cItem)
+{
+ // timeT timeAtClick = m_grid.getRulerScale()->getTimeForX(p.x());
+
+ CompositionItemImpl* itemImpl = dynamic_cast<CompositionItemImpl*>((_CompositionItem*)cItem);
+
+ const Segment* s = itemImpl->getSegment();
+
+ timeT startTime = s->getStartTime();
+ timeT endTime = s->getEndMarkerTime();
+ timeT repeatInterval = endTime - startTime;
+
+ int rWidth = int(nearbyint(m_grid.getRulerScale()->getXForTime(repeatInterval)));
+
+ int count = (p.x() - int(itemImpl->rect().x())) / rWidth;
+ RG_DEBUG << "CompositionModelImpl::getRepeatTimeAt() : count = " << count << endl;
+
+ return count != 0 ? startTime + (count * (s->getEndMarkerTime() - s->getStartTime())) : 0;
+}
+
+bool CompositionModelImpl::setTrackHeights(Segment *s)
+{
+ bool heightsChanged = false;
+
+// std::cerr << "CompositionModelImpl::setTrackHeights" << std::endl;
+
+ for (Composition::trackcontainer::const_iterator i =
+ m_composition.getTracks().begin();
+ i != m_composition.getTracks().end(); ++i) {
+
+ if (s && i->first != s->getTrack()) continue;
+
+ int max = m_composition.getMaxContemporaneousSegmentsOnTrack(i->first);
+ if (max == 0) max = 1;
+
+// std::cerr << "for track " << i->first << ": height = " << max << ", old height = " << m_trackHeights[i->first] << std::endl;
+
+ if (max != m_trackHeights[i->first]) {
+ heightsChanged = true;
+ m_trackHeights[i->first] = max;
+ }
+
+ m_grid.setBinHeightMultiple(i->second->getPosition(), max);
+ }
+
+ if (heightsChanged) {
+// std::cerr << "CompositionModelImpl::setTrackHeights: heights have changed" << std::endl;
+ for (Composition::segmentcontainer::iterator i = m_composition.begin();
+ i != m_composition.end(); ++i) {
+ computeSegmentRect(**i);
+ }
+ }
+
+ return heightsChanged;
+}
+
+QPoint CompositionModelImpl::computeSegmentOrigin(const Segment& s)
+{
+ // Profiler profiler("CompositionModelImpl::computeSegmentOrigin", true);
+
+ int trackPosition = m_composition.getTrackPositionById(s.getTrack());
+ timeT startTime = s.getStartTime();
+
+ QPoint res;
+
+ res.setX(int(nearbyint(m_grid.getRulerScale()->getXForTime(startTime))));
+
+ res.setY(m_grid.getYBinCoordinate(trackPosition) +
+ m_composition.getSegmentVoiceIndex(&s) *
+ m_grid.getYSnap() + 1);
+
+ return res;
+}
+
+bool CompositionModelImpl::isCachedRectCurrent(const Segment& s, const CompositionRect& r, QPoint cachedSegmentOrigin, timeT cachedSegmentEndTime)
+{
+ return s.isRepeating() == r.isRepeating() &&
+ ((cachedSegmentOrigin.x() != r.x() && s.getEndMarkerTime() != cachedSegmentEndTime) ||
+ (cachedSegmentOrigin.x() == r.x() && s.getEndMarkerTime() == cachedSegmentEndTime));
+}
+
+void CompositionModelImpl::clearInCache(const Segment* s, bool clearPreview)
+{
+ if (s) {
+ m_segmentRectMap.erase(s);
+ m_segmentEndTimeMap.erase(s);
+ if (clearPreview)
+ removePreviewCache(s);
+ } else { // clear the whole cache
+ m_segmentRectMap.clear();
+ m_segmentEndTimeMap.clear();
+ if (clearPreview)
+ clearPreviewCache();
+ }
+}
+
+void CompositionModelImpl::putInCache(const Segment*s, const CompositionRect& cr)
+{
+ m_segmentRectMap[s] = cr;
+ m_segmentEndTimeMap[s] = s->getEndMarkerTime();
+}
+
+CompositionRect CompositionModelImpl::computeSegmentRect(const Segment& s, bool computeZ)
+{
+ // Profiler profiler("CompositionModelImpl::computeSegmentRect", true);
+
+ QPoint origin = computeSegmentOrigin(s);
+
+ bool isRecordingSegment = isRecording(&s);
+
+ if (!isRecordingSegment) {
+ timeT endTime = 0;
+
+ CompositionRect cachedCR = getFromCache(&s, endTime);
+ // don't cache repeating segments - it's just hopeless, because the segment's rect may have to be recomputed
+ // in other cases than just when the segment itself is moved,
+ // for instance if another segment is moved over it
+ if (!s.isRepeating() && cachedCR.isValid() && isCachedRectCurrent(s, cachedCR, origin, endTime)) {
+ // RG_DEBUG << "CompositionModelImpl::computeSegmentRect() : using cache for seg "
+ // << &s << " - cached rect repeating = " << cachedCR.isRepeating() << " - base width = "
+ // << cachedCR.getBaseWidth() << endl;
+
+ bool xChanged = origin.x() != cachedCR.x();
+ bool yChanged = origin.y() != cachedCR.y();
+
+ cachedCR.moveTopLeft(origin);
+
+ if (s.isRepeating() && (xChanged || yChanged)) { // update repeat marks
+
+ // this doesn't work in the general case (if there's another segment on the same track for instance),
+ // it's better to simply recompute all the marks
+ // CompositionRect::repeatmarks repeatMarks = cachedCR.getRepeatMarks();
+ // for(unsigned int i = 0; i < repeatMarks.size(); ++i) {
+ // repeatMarks[i] += deltaX;
+ // }
+ // cachedCR.setRepeatMarks(repeatMarks);
+ computeRepeatMarks(cachedCR, &s);
+ }
+ putInCache(&s, cachedCR);
+ return cachedCR;
+ }
+ }
+
+ timeT startTime = s.getStartTime();
+ timeT endTime = isRecordingSegment ? m_pointerTimePos /*s.getEndTime()*/ : s.getEndMarkerTime();
+
+
+ int h = m_grid.getYSnap() - 2;
+ int w;
+
+ RG_DEBUG << "CompositionModelImpl::computeSegmentRect: x " << origin.x() << ", y " << origin.y() << " startTime " << startTime << ", endTime " << endTime << endl;
+
+ if (s.isRepeating()) {
+ timeT repeatStart = endTime;
+ timeT repeatEnd = s.getRepeatEndTime();
+ w = int(nearbyint(m_grid.getRulerScale()->getWidthForDuration(startTime,
+ repeatEnd - startTime)));
+ // RG_DEBUG << "CompositionModelImpl::computeSegmentRect : s is repeating - repeatStart = "
+ // << repeatStart << " - repeatEnd : " << repeatEnd
+ // << " w = " << w << endl;
+ } else {
+ w = int(nearbyint(m_grid.getRulerScale()->getWidthForDuration(startTime, endTime - startTime)));
+ // RG_DEBUG << "CompositionModelImpl::computeSegmentRect : s is NOT repeating"
+ // << " w = " << w << " (x for time at start is " << m_grid.getRulerScale()->getXForTime(startTime) << ", end is " << m_grid.getRulerScale()->getXForTime(endTime) << ")" << endl;
+ }
+
+ CompositionRect cr(origin, QSize(w, h));
+ QString label = strtoqstr(s.getLabel());
+ if (s.getType() == Segment::Audio) {
+ static QRegExp re1("( *\\([^)]*\\))*$"); // (inserted) (copied) (etc)
+ static QRegExp re2("\\.[^.]+$"); // filename suffix
+ label.replace(re1, "").replace(re2, "");
+ }
+ cr.setLabel(label);
+
+ if (s.isRepeating()) {
+ computeRepeatMarks(cr, &s);
+ } else {
+ cr.setBaseWidth(cr.width());
+ }
+
+ putInCache(&s, cr);
+
+ return cr;
+}
+
+unsigned int CompositionModelImpl::computeZForSegment(const Rosegarden::Segment* s)
+{
+ return m_segmentOrderer.getZForSegment(s);
+}
+
+const CompositionRect& CompositionModelImpl::getFromCache(const Rosegarden::Segment* s, timeT& endTime)
+{
+ endTime = m_segmentEndTimeMap[s];
+ return m_segmentRectMap[s];
+}
+
+unsigned int CompositionModelImpl::getNbRows()
+{
+ return m_composition.getNbTracks();
+}
+
+const CompositionModel::rectcontainer& CompositionModelImpl::getRectanglesIn(const QRect& rect,
+ RectRanges* npData,
+ AudioPreviewDrawData* apData)
+{
+ // Profiler profiler("CompositionModelImpl::getRectanglesIn", true);
+
+ m_res.clear();
+
+ // RG_DEBUG << "CompositionModelImpl::getRectanglesIn: ruler scale is "
+ // << (dynamic_cast<SimpleRulerScale *>(m_grid.getRulerScale()))->getUnitsPerPixel() << endl;
+
+ const Composition::segmentcontainer& segments = m_composition.getSegments();
+ Composition::segmentcontainer::iterator segEnd = segments.end();
+
+ for (Composition::segmentcontainer::iterator i = segments.begin();
+ i != segEnd; ++i) {
+
+ // RG_DEBUG << "CompositionModelImpl::getRectanglesIn: Composition contains segment " << *i << " (" << (*i)->getStartTime() << "->" << (*i)->getEndTime() << ")"<< endl;
+
+ Segment* s = *i;
+
+ if (isMoving(s))
+ continue;
+
+ CompositionRect sr = computeSegmentRect(*s);
+ // RG_DEBUG << "CompositionModelImpl::getRectanglesIn: seg rect = " << sr << endl;
+
+ if (sr.intersects(rect)) {
+ bool tmpSelected = isTmpSelected(s),
+ pTmpSelected = wasTmpSelected(s);
+
+// RG_DEBUG << "CompositionModelImpl::getRectanglesIn: segment " << s
+// << " selected : " << isSelected(s) << " - tmpSelected : " << isTmpSelected(s) << endl;
+
+ if (isSelected(s) || isTmpSelected(s) || sr.intersects(m_selectionRect)) {
+ sr.setSelected(true);
+ }
+
+ if (pTmpSelected != tmpSelected)
+ sr.setNeedsFullUpdate(true);
+
+ bool isAudio = (s && s->getType() == Segment::Audio);
+
+ if (!isRecording(s)) {
+ QColor brushColor = GUIPalette::convertColour(m_composition.
+ getSegmentColourMap().getColourByIndex(s->getColourIndex()));
+ sr.setBrush(brushColor);
+ sr.setPen(CompositionColourCache::getInstance()->SegmentBorder);
+ } else {
+ // border is the same for both audio and MIDI
+ sr.setPen(CompositionColourCache::getInstance()->RecordingSegmentBorder);
+ // audio color
+ if (isAudio) {
+ sr.setBrush(CompositionColourCache::getInstance()->RecordingAudioSegmentBlock);
+ // MIDI/default color
+ } else {
+ sr.setBrush(CompositionColourCache::getInstance()->RecordingInternalSegmentBlock);
+ }
+ }
+
+ // Notation preview data
+ if (npData && s->getType() == Segment::Internal) {
+ makeNotationPreviewRects(npData, QPoint(0, sr.y()), s, rect);
+ // Audio preview data
+ } else if (apData && s->getType() == Segment::Audio) {
+ makeAudioPreviewRects(apData, s, sr, rect);
+ }
+
+ m_res.push_back(sr);
+ } else {
+ // RG_DEBUG << "CompositionModelImpl::getRectanglesIn: - segment out of rect\n";
+ }
+
+ }
+
+ // changing items
+
+ itemcontainer::iterator movEnd = m_changingItems.end();
+ for (itemcontainer::iterator i = m_changingItems.begin(); i != movEnd; ++i) {
+ CompositionRect sr((*i)->rect());
+ if (sr.intersects(rect)) {
+ Segment* s = CompositionItemHelper::getSegment(*i);
+ sr.setSelected(true);
+ QColor brushColor = GUIPalette::convertColour(m_composition.getSegmentColourMap().getColourByIndex(s->getColourIndex()));
+ sr.setBrush(brushColor);
+
+ sr.setPen(CompositionColourCache::getInstance()->SegmentBorder);
+
+ // Notation preview data
+ if (npData && s->getType() == Segment::Internal) {
+ makeNotationPreviewRectsMovingSegment(npData, sr.topLeft(), s, sr);
+ // Audio preview data
+ } else if (apData && s->getType() == Segment::Audio) {
+ makeAudioPreviewRects(apData, s, sr, rect);
+ }
+
+ m_res.push_back(sr);
+ }
+ }
+
+ return m_res;
+}
+
+CompositionModel::heightlist
+CompositionModelImpl::getTrackDividersIn(const QRect& rect)
+{
+ int top = m_grid.getYBin(rect.y());
+ int bottom = m_grid.getYBin(rect.y() + rect.height());
+
+// std::cerr << "CompositionModelImpl::getTrackDividersIn: rect "
+// << rect.x() << ", " << rect.y() << ", "
+// << rect.width() << "x" << rect.height() << ", top = " << top
+// << ", bottom = " << bottom << std::endl;
+
+ CompositionModel::heightlist list;
+
+ for (int pos = top; pos <= bottom; ++pos) {
+ int divider = m_grid.getYBinCoordinate(pos);
+ list.push_back(divider);
+// std::cerr << "divider at " << divider << std::endl;
+ }
+
+ return list;
+}
+
+CompositionModel::rectlist* CompositionModelImpl::getNotationPreviewData(const Segment* s)
+{
+ rectlist* npData = m_notationPreviewDataCache[const_cast<Segment*>(s)];
+
+ if (!npData) {
+ npData = makeNotationPreviewDataCache(s);
+ }
+
+ return npData;
+}
+
+CompositionModel::AudioPreviewData* CompositionModelImpl::getAudioPreviewData(const Segment* s)
+{
+ // Profiler profiler("CompositionModelImpl::getAudioPreviewData", true);
+ RG_DEBUG << "CompositionModelImpl::getAudioPreviewData\n";
+
+ AudioPreviewData* apData = m_audioPreviewDataCache[const_cast<Segment*>(s)];
+
+ if (!apData) {
+ apData = makeAudioPreviewDataCache(s);
+ }
+
+ RG_DEBUG << "CompositionModelImpl::getAudioPreviewData returning\n";
+ return apData;
+}
+
+CompositionModel::rectlist* CompositionModelImpl::makeNotationPreviewDataCache(const Segment *s)
+{
+ rectlist* npData = new rectlist();
+ updatePreviewCacheForNotationSegment(s, npData);
+ m_notationPreviewDataCache.insert(const_cast<Segment*>(s), npData);
+ return npData;
+}
+
+CompositionModel::AudioPreviewData* CompositionModelImpl::makeAudioPreviewDataCache(const Segment *s)
+{
+ RG_DEBUG << "CompositionModelImpl::makeAudioPreviewDataCache(" << s << ")" << endl;
+
+ AudioPreviewData* apData = new AudioPreviewData(false, 0); // 0 channels -> empty
+ updatePreviewCacheForAudioSegment(s, apData);
+ m_audioPreviewDataCache.insert(const_cast<Segment*>(s), apData);
+ return apData;
+}
+
+}
+#include "CompositionModelImpl.moc"
diff --git a/src/gui/editors/segment/segmentcanvas/CompositionModelImpl.h b/src/gui/editors/segment/segmentcanvas/CompositionModelImpl.h
new file mode 100644
index 0000000..6e1c9d6
--- /dev/null
+++ b/src/gui/editors/segment/segmentcanvas/CompositionModelImpl.h
@@ -0,0 +1,239 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_COMPOSITIONMODELIMPL_H_
+#define _RG_COMPOSITIONMODELIMPL_H_
+
+#include "base/Selection.h"
+#include "base/SnapGrid.h"
+#include "CompositionModel.h"
+#include "CompositionRect.h"
+#include <map>
+#include "SegmentOrderer.h"
+#include <set>
+#include <qcolor.h>
+#include <qpoint.h>
+#include <qptrdict.h>
+#include <qrect.h>
+#include <vector>
+#include "base/Event.h"
+
+
+class RectRanges;
+class CompositionItem;
+class AudioPreviewDrawData;
+class AudioPreviewData;
+
+
+namespace Rosegarden
+{
+
+class Studio;
+class Segment;
+class RulerScale;
+class Event;
+class Composition;
+class AudioPreviewUpdater;
+class AudioPreviewThread;
+
+
+class CompositionModelImpl : public CompositionModel
+{
+ Q_OBJECT
+public:
+
+ CompositionModelImpl(Composition& compo,
+ Studio& studio,
+ RulerScale *rulerScale,
+ int vStep);
+
+ virtual ~CompositionModelImpl();
+
+ virtual unsigned int getNbRows();
+ virtual const rectcontainer& getRectanglesIn(const QRect& rect,
+ RectRanges* notationRects, AudioPreviewDrawData* audioRects);
+ virtual heightlist getTrackDividersIn(const QRect& rect);
+ virtual itemcontainer getItemsAt (const QPoint&);
+ virtual timeT getRepeatTimeAt (const QPoint&, const CompositionItem&);
+
+ virtual SnapGrid& grid() { return m_grid; }
+
+ virtual void setPointerPos(int xPos);
+ virtual void setSelected(const CompositionItem&, bool selected = true);
+ virtual bool isSelected(const CompositionItem&) const;
+ virtual void setSelected(const itemcontainer&);
+ virtual void clearSelected();
+ virtual bool haveSelection() const { return !m_selectedSegments.empty(); }
+ virtual bool haveMultipleSelection() const { return m_selectedSegments.size() > 1; }
+ virtual void signalSelection();
+ virtual void setSelectionRect(const QRect&);
+ virtual void finalizeSelectionRect();
+ virtual QRect getSelectionContentsRect();
+ virtual void signalContentChange();
+
+ virtual void addRecordingItem(const CompositionItem&);
+ virtual void removeRecordingItem(const CompositionItem &);
+ virtual void clearRecordingItems();
+ virtual bool haveRecordingItems() { return m_recordingSegments.size() > 0; }
+
+ virtual void startChange(const CompositionItem&, ChangeType change);
+ virtual void startChangeSelection(ChangeType change);
+ virtual itemcontainer& getChangingItems() { return m_changingItems; }
+ virtual void endChange();
+ virtual ChangeType getChangeType() { return m_changeType; }
+
+ virtual void setLength(int width);
+ virtual int getLength();
+
+ void setAudioPreviewThread(AudioPreviewThread *thread);
+ AudioPreviewThread* getAudioPreviewThread() { return m_audioPreviewThread; }
+
+ void clearPreviewCache();
+ void clearSegmentRectsCache(bool clearPreviews = false) { clearInCache(0, clearPreviews); }
+
+ rectlist* makeNotationPreviewDataCache(const Segment *s);
+ AudioPreviewData* makeAudioPreviewDataCache(const Segment *s);
+
+ CompositionRect computeSegmentRect(const Segment&, bool computeZ = false);
+ QColor computeSegmentPreviewColor(const Segment*);
+ QPoint computeSegmentOrigin(const Segment&);
+ void computeRepeatMarks(CompositionItem&);
+
+ SegmentSelection getSelectedSegments() { return m_selectedSegments; }
+ Composition& getComposition() { return m_composition; }
+ Studio& getStudio() { return m_studio; }
+
+
+ // CompositionObserver
+ virtual void segmentAdded(const Composition *, Segment *);
+ virtual void segmentRemoved(const Composition *, Segment *);
+ virtual void segmentRepeatChanged(const Composition *, Segment *, bool);
+ virtual void segmentStartChanged(const Composition *, Segment *, timeT);
+ virtual void segmentEndMarkerChanged(const Composition *, Segment *, bool);
+ virtual void segmentTrackChanged(const Composition *, Segment *, TrackId);
+ virtual void endMarkerTimeChanged(const Composition *, bool /*shorten*/);
+
+ // SegmentObserver
+ virtual void eventAdded(const Segment *, Event *);
+ virtual void eventRemoved(const Segment *, Event *);
+ virtual void appearanceChanged(const Segment *);
+ virtual void endMarkerTimeChanged(const Segment *, bool /*shorten*/);
+ virtual void segmentDeleted(const Segment*) { /* nothing to do - handled by CompositionObserver::segmentRemoved() */ };
+
+signals:
+ void selectedSegments(const SegmentSelection &);
+ void needSizeUpdate();
+
+public slots:
+ void slotAudioFileFinalized(Segment*);
+ void slotInstrumentParametersChanged(InstrumentId);
+
+protected slots:
+ void slotAudioPreviewComplete(AudioPreviewUpdater*);
+
+protected:
+ bool setTrackHeights(Segment *changed = 0); // true if something changed
+
+ void setSelected(const Segment*, bool selected = true);
+ bool isSelected(const Segment*) const;
+ bool isTmpSelected(const Segment*) const;
+ bool wasTmpSelected(const Segment*) const;
+ bool isMoving(const Segment*) const;
+ bool isRecording(const Segment*) const;
+
+ void computeRepeatMarks(CompositionRect& sr, const Segment* s);
+ unsigned int computeZForSegment(const Segment* s);
+
+ // segment preview stuff
+
+ void updatePreviewCacheForNotationSegment(const Segment* s, rectlist*);
+ void updatePreviewCacheForAudioSegment(const Segment* s, AudioPreviewData*);
+ rectlist* getNotationPreviewData(const Segment* s);
+ AudioPreviewData* getAudioPreviewData(const Segment* s);
+ PixmapArray getAudioPreviewPixmap(const Segment* s);
+ QRect postProcessAudioPreview(AudioPreviewData*, const Segment*);
+
+ void makePreviewCache(const Segment* s);
+ void removePreviewCache(const Segment* s);
+ void makeNotationPreviewRects(RectRanges* npData, QPoint basePoint, const Segment*, const QRect&);
+ void makeNotationPreviewRectsMovingSegment(RectRanges* npData, QPoint basePoint, const Segment*,
+ const QRect&);
+ void makeAudioPreviewRects(AudioPreviewDrawData* apRects, const Segment*,
+ const CompositionRect& segRect, const QRect& clipRect);
+
+ void clearInCache(const Segment*, bool clearPreviewCache = false);
+ void putInCache(const Segment*, const CompositionRect&);
+ const CompositionRect& getFromCache(const Segment*, timeT& endTime);
+ bool isCachedRectCurrent(const Segment& s, const CompositionRect& r,
+ QPoint segmentOrigin, timeT segmentEndTime);
+
+ //--------------- Data members ---------------------------------
+ Composition& m_composition;
+ Studio& m_studio;
+ SnapGrid m_grid;
+ SegmentSelection m_selectedSegments;
+ SegmentSelection m_tmpSelectedSegments;
+ SegmentSelection m_previousTmpSelectedSegments;
+
+ timeT m_pointerTimePos;
+
+ typedef std::set<Segment *> recordingsegmentset;
+ recordingsegmentset m_recordingSegments;
+
+ typedef std::vector<CompositionItem> itemgc;
+
+ AudioPreviewThread* m_audioPreviewThread;
+
+ typedef QPtrDict<rectlist> NotationPreviewDataCache;
+ typedef QPtrDict<AudioPreviewData> AudioPreviewDataCache;
+
+ NotationPreviewDataCache m_notationPreviewDataCache;
+ AudioPreviewDataCache m_audioPreviewDataCache;
+
+ rectcontainer m_res;
+ itemcontainer m_changingItems;
+ ChangeType m_changeType;
+ itemgc m_itemGC;
+
+ QRect m_selectionRect;
+ QRect m_previousSelectionUpdateRect;
+
+ std::map<const Segment*, CompositionRect> m_segmentRectMap;
+ std::map<const Segment*, timeT> m_segmentEndTimeMap;
+ std::map<const Segment*, PixmapArray> m_audioSegmentPreviewMap;
+ std::map<TrackId, int> m_trackHeights;
+
+ typedef std::map<const Segment*, AudioPreviewUpdater *>
+ AudioPreviewUpdaterMap;
+ AudioPreviewUpdaterMap m_audioPreviewUpdaterMap;
+
+ SegmentOrderer m_segmentOrderer;
+};
+
+
+
+}
+
+#endif
diff --git a/src/gui/editors/segment/segmentcanvas/CompositionRect.cpp b/src/gui/editors/segment/segmentcanvas/CompositionRect.cpp
new file mode 100644
index 0000000..9e34d71
--- /dev/null
+++ b/src/gui/editors/segment/segmentcanvas/CompositionRect.cpp
@@ -0,0 +1,42 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "CompositionRect.h"
+#include "base/ColourMap.h"
+
+#include <qbrush.h>
+#include <qcolor.h>
+#include <qpen.h>
+#include <qpoint.h>
+#include <qrect.h>
+#include <qsize.h>
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+ const QColor CompositionRect::DefaultPenColor = Qt::black;
+ const QColor CompositionRect::DefaultBrushColor = QColor(COLOUR_DEF_R, COLOUR_DEF_G, COLOUR_DEF_B);
+}
diff --git a/src/gui/editors/segment/segmentcanvas/CompositionRect.h b/src/gui/editors/segment/segmentcanvas/CompositionRect.h
new file mode 100644
index 0000000..3c3d2b6
--- /dev/null
+++ b/src/gui/editors/segment/segmentcanvas/CompositionRect.h
@@ -0,0 +1,108 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_COMPOSITIONRECT_H_
+#define _RG_COMPOSITIONRECT_H_
+
+#include <qbrush.h>
+#include <qcolor.h>
+#include <qpen.h>
+#include <qrect.h>
+#include <qstring.h>
+#include <qvaluevector.h>
+
+
+class QSize;
+class QPoint;
+
+
+namespace Rosegarden
+{
+
+class CompositionRect : public QRect
+{
+public:
+ typedef QValueVector<int> repeatmarks;
+
+ friend bool operator<(const CompositionRect&, const CompositionRect&);
+
+ CompositionRect() : QRect(), m_selected(false),
+ m_needUpdate(false), m_brush(DefaultBrushColor), m_pen(DefaultPenColor) {};
+ CompositionRect(const QRect& r) : QRect(r), m_resized(false), m_selected(false),
+ m_needUpdate(false), m_brush(DefaultBrushColor), m_pen(DefaultPenColor), m_z(0) {};
+ CompositionRect(const QPoint & topLeft, const QPoint & bottomRight)
+ : QRect(topLeft, bottomRight), m_resized(false), m_selected(false),
+ m_needUpdate(false), m_brush(DefaultBrushColor), m_pen(DefaultPenColor), m_z(0) {};
+ CompositionRect(const QPoint & topLeft, const QSize & size)
+ : QRect(topLeft, size), m_resized(false), m_selected(false),
+ m_needUpdate(false), m_brush(DefaultBrushColor), m_pen(DefaultPenColor), m_z(0) {};
+ CompositionRect(int left, int top, int width, int height)
+ : QRect(left, top, width, height), m_resized(false), m_selected(false),
+ m_needUpdate(false), m_brush(DefaultBrushColor), m_pen(DefaultPenColor), m_z(0) {};
+
+ void setResized(bool s) { m_resized = s; }
+ bool isResized() const { return m_resized; }
+ void setSelected(bool s) { m_selected = s; }
+ bool isSelected() const { return m_selected; }
+ bool needsFullUpdate() const { return m_needUpdate; }
+ void setNeedsFullUpdate(bool s) { m_needUpdate = s; }
+
+ void setZ(int z) { m_z = z; }
+ int z() const { return m_z; }
+
+ // brush, pen draw info
+ void setBrush(QBrush b) { m_brush = b; }
+ QBrush getBrush() const { return m_brush; }
+ void setPen(QPen b) { m_pen = b; }
+ QPen getPen() const { return m_pen; }
+
+ // repeating segments
+ void setRepeatMarks(const repeatmarks& rm) { m_repeatMarks = rm; }
+ const repeatmarks& getRepeatMarks() const { return m_repeatMarks; }
+ bool isRepeating() const { return m_repeatMarks.size() > 0; }
+ int getBaseWidth() const { return m_baseWidth; }
+ void setBaseWidth(int bw) { m_baseWidth = bw; }
+ QString getLabel() const { return m_label; }
+ void setLabel(QString l) { m_label = l; }
+
+ static const QColor DefaultPenColor;
+ static const QColor DefaultBrushColor;
+
+protected:
+ bool m_resized;
+ bool m_selected;
+ bool m_needUpdate;
+ QBrush m_brush;
+ QPen m_pen;
+ repeatmarks m_repeatMarks;
+ int m_baseWidth;
+ QString m_label;
+ int m_z;
+};
+
+
+}
+
+#endif
diff --git a/src/gui/editors/segment/segmentcanvas/CompositionView.cpp b/src/gui/editors/segment/segmentcanvas/CompositionView.cpp
new file mode 100644
index 0000000..8e83a6b
--- /dev/null
+++ b/src/gui/editors/segment/segmentcanvas/CompositionView.cpp
@@ -0,0 +1,1591 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "CompositionView.h"
+
+#include "misc/Debug.h"
+#include "AudioPreviewThread.h"
+#include "base/RulerScale.h"
+#include "base/Segment.h"
+#include "base/Selection.h"
+#include "base/SnapGrid.h"
+#include "CompositionColourCache.h"
+#include "CompositionItemHelper.h"
+#include "CompositionItemImpl.h"
+#include "CompositionModel.h"
+#include "CompositionModelImpl.h"
+#include "CompositionRect.h"
+#include "AudioPreviewPainter.h"
+#include "document/RosegardenGUIDoc.h"
+#include "document/ConfigGroups.h"
+#include "gui/general/GUIPalette.h"
+#include "gui/general/RosegardenCanvasView.h"
+#include "gui/general/RosegardenScrollView.h"
+#include "SegmentSelector.h"
+#include "SegmentToolBox.h"
+#include "SegmentTool.h"
+#include <kmessagebox.h>
+#include <qbrush.h>
+#include <qcolor.h>
+#include <qevent.h>
+#include <qfont.h>
+#include <qfontmetrics.h>
+#include <qmemarray.h>
+#include <qpainter.h>
+#include <qpen.h>
+#include <qpixmap.h>
+#include <qpoint.h>
+#include <qrect.h>
+#include <qscrollbar.h>
+#include <qscrollview.h>
+#include <qsize.h>
+#include <qstring.h>
+#include <qwidget.h>
+#include <kapplication.h>
+#include <kconfig.h>
+#include <algorithm>
+
+
+namespace Rosegarden
+{
+
+class PreviewRect : public QRect {
+public:
+ PreviewRect(int left, int top, int width, int height) :
+ QRect(left, top, width, height) {};
+
+ PreviewRect(const QRect& r) :
+ QRect(r) {};
+
+ const QColor& getColor() const { return m_color; }
+ void setColor(QColor c) { m_color = c; }
+
+protected:
+ QColor m_color;
+};
+
+CompositionView::CompositionView(RosegardenGUIDoc* doc,
+ CompositionModel* model,
+ QWidget * parent, const char * name, WFlags f)
+#if KDE_VERSION >= KDE_MAKE_VERSION(3,2,0)
+ : RosegardenScrollView(parent, name, f | WNoAutoErase | WStaticContents),
+#else
+ :
+ RosegardenScrollView(parent, name, f | WRepaintNoErase | WResizeNoErase | WStaticContents),
+#endif
+ m_model(model),
+ m_currentItem(0),
+ m_tool(0),
+ m_toolBox(0),
+ m_showPreviews(false),
+ m_showSegmentLabels(true),
+ m_fineGrain(false),
+ m_pencilOverExisting(false),
+ m_minWidth(m_model->getLength()),
+ m_stepSize(0),
+ m_rectFill(0xF0, 0xF0, 0xF0),
+ m_selectedRectFill(0x00, 0x00, 0xF0),
+ m_pointerPos(0),
+ m_pointerColor(GUIPalette::getColour(GUIPalette::Pointer)),
+ m_pointerWidth(4),
+ m_pointerPen(QPen(m_pointerColor, m_pointerWidth)),
+ m_tmpRect(QRect(QPoint(0, 0), QPoint( -1, -1))),
+ m_tmpRectFill(CompositionRect::DefaultBrushColor),
+ m_trackDividerColor(GUIPalette::getColour(GUIPalette::TrackDivider)),
+ m_drawGuides(false),
+ m_guideColor(GUIPalette::getColour(GUIPalette::MovementGuide)),
+ m_topGuidePos(0),
+ m_foreGuidePos(0),
+ m_drawSelectionRect(false),
+ m_drawTextFloat(false),
+ m_segmentsDrawBuffer(visibleWidth(), visibleHeight()),
+ m_artifactsDrawBuffer(visibleWidth(), visibleHeight()),
+ m_segmentsDrawBufferRefresh(0, 0, visibleWidth(), visibleHeight()),
+ m_artifactsDrawBufferRefresh(0, 0, visibleWidth(), visibleHeight()),
+ m_lastBufferRefreshX(0),
+ m_lastBufferRefreshY(0),
+ m_lastPointerRefreshX(0),
+ m_contextHelpShown(false)
+{
+ if (doc) {
+ m_toolBox = new SegmentToolBox(this, doc);
+
+ connect(m_toolBox, SIGNAL(showContextHelp(const QString &)),
+ this, SLOT(slotToolHelpChanged(const QString &)));
+ }
+
+ setDragAutoScroll(true);
+ setBackgroundMode(NoBackground);
+ viewport()->setBackgroundMode(NoBackground);
+ viewport()->setPaletteBackgroundColor(GUIPalette::getColour(GUIPalette::SegmentCanvas));
+
+ slotUpdateSize();
+
+ QScrollBar* hsb = horizontalScrollBar();
+
+ // dynamically adjust content size when scrolling past current composition's end
+ connect(hsb, SIGNAL(nextLine()),
+ this, SLOT(scrollRight()));
+ connect(hsb, SIGNAL(prevLine()),
+ this, SLOT(scrollLeft()));
+
+ // connect(this, SIGNAL(contentsMoving(int, int)),
+ // this, SLOT(slotAllDrawBuffersNeedRefresh()));
+
+ // connect(this, SIGNAL(contentsMoving(int, int)),
+ // this, SLOT(slotContentsMoving(int, int)));
+
+ connect(model, SIGNAL(needContentUpdate()),
+ this, SLOT(slotUpdateSegmentsDrawBuffer()));
+ connect(model, SIGNAL(needContentUpdate(const QRect&)),
+ this, SLOT(slotUpdateSegmentsDrawBuffer(const QRect&)));
+ connect(model, SIGNAL(needArtifactsUpdate()),
+ this, SLOT(slotArtifactsDrawBufferNeedsRefresh()));
+ connect(model, SIGNAL(needSizeUpdate()),
+ this, SLOT(slotUpdateSize()));
+
+ if (doc) {
+ connect(doc, SIGNAL(docColoursChanged()),
+ this, SLOT(slotRefreshColourCache()));
+
+ // recording-related signals
+ connect(doc, SIGNAL(newMIDIRecordingSegment(Segment*)),
+ this, SLOT(slotNewMIDIRecordingSegment(Segment*)));
+ connect(doc, SIGNAL(newAudioRecordingSegment(Segment*)),
+ this, SLOT(slotNewAudioRecordingSegment(Segment*)));
+ // connect(doc, SIGNAL(recordMIDISegmentUpdated(Segment*, timeT)),
+ // this, SLOT(slotRecordMIDISegmentUpdated(Segment*, timeT)));
+ connect(doc, SIGNAL(stoppedAudioRecording()),
+ this, SLOT(slotStoppedRecording()));
+ connect(doc, SIGNAL(stoppedMIDIRecording()),
+ this, SLOT(slotStoppedRecording()));
+ connect(doc, SIGNAL(audioFileFinalized(Segment*)),
+ getModel(), SLOT(slotAudioFileFinalized(Segment*)));
+ }
+
+ CompositionModelImpl* cmi = dynamic_cast<CompositionModelImpl*>(model);
+ if (cmi) {
+ cmi->setAudioPreviewThread(&doc->getAudioPreviewThread());
+ }
+
+ if (doc) {
+ doc->getAudioPreviewThread().setEmptyQueueListener(this);
+ }
+
+ m_segmentsDrawBuffer.setOptimization(QPixmap::BestOptim);
+ m_artifactsDrawBuffer.setOptimization(QPixmap::BestOptim);
+
+ viewport()->setMouseTracking(true);
+}
+
+void CompositionView::endAudioPreviewGeneration()
+{
+ CompositionModelImpl* cmi = dynamic_cast<CompositionModelImpl*>(m_model);
+ if (cmi) {
+ cmi->setAudioPreviewThread(0);
+ }
+}
+
+void CompositionView::setBackgroundPixmap(const QPixmap &m)
+{
+ m_backgroundPixmap = m;
+ // viewport()->setErasePixmap(m_backgroundPixmap);
+}
+
+void CompositionView::initStepSize()
+{
+ QScrollBar* hsb = horizontalScrollBar();
+ m_stepSize = hsb->lineStep();
+}
+
+void CompositionView::slotUpdateSize()
+{
+ int vStep = getModel()->grid().getYSnap();
+ int height = std::max(getModel()->getNbRows() * vStep, (unsigned)visibleHeight());
+
+ RulerScale *ruler = grid().getRulerScale();
+
+ int minWidth = sizeHint().width();
+ int computedWidth = int(nearbyint(ruler->getTotalWidth()));
+
+ int width = std::max(computedWidth, minWidth);
+
+ resizeContents(width, height);
+}
+
+void CompositionView::scrollRight()
+{
+ RG_DEBUG << "CompositionView::scrollRight()\n";
+ if (m_stepSize == 0)
+ initStepSize();
+
+ if (horizontalScrollBar()->value() == horizontalScrollBar()->maxValue()) {
+
+ resizeContents(contentsWidth() + m_stepSize, contentsHeight());
+ setContentsPos(contentsX() + m_stepSize, contentsY());
+ getModel()->setLength(contentsWidth());
+ }
+
+}
+
+void CompositionView::scrollLeft()
+{
+ RG_DEBUG << "CompositionView::scrollLeft()\n";
+ if (m_stepSize == 0)
+ initStepSize();
+
+ int cWidth = contentsWidth();
+
+ if (horizontalScrollBar()->value() < cWidth && cWidth > m_minWidth) {
+ resizeContents(cWidth - m_stepSize, contentsHeight());
+ getModel()->setLength(contentsWidth());
+ }
+
+}
+
+void CompositionView::setSelectionRectPos(const QPoint& pos)
+{
+ m_selectionRect.setRect(pos.x(), pos.y(), 0, 0);
+ getModel()->setSelectionRect(m_selectionRect);
+}
+
+void CompositionView::setSelectionRectSize(int w, int h)
+{
+ m_selectionRect.setSize(QSize(w, h));
+ getModel()->setSelectionRect(m_selectionRect);
+}
+
+void CompositionView::setDrawSelectionRect(bool d)
+{
+ if (m_drawSelectionRect != d) {
+ m_drawSelectionRect = d;
+ slotArtifactsDrawBufferNeedsRefresh();
+ slotUpdateSegmentsDrawBuffer(m_selectionRect);
+ }
+}
+
+void CompositionView::clearSegmentRectsCache(bool clearPreviews)
+{
+ dynamic_cast<CompositionModelImpl*>(getModel())->clearSegmentRectsCache(clearPreviews);
+}
+
+SegmentSelection
+CompositionView::getSelectedSegments()
+{
+ return (dynamic_cast<CompositionModelImpl*>(m_model))->getSelectedSegments();
+}
+
+void CompositionView::updateSelectionContents()
+{
+ if (!haveSelection())
+ return ;
+
+
+ QRect selectionRect = getModel()->getSelectionContentsRect();
+ updateContents(selectionRect);
+}
+
+void CompositionView::slotContentsMoving(int x, int y)
+{
+ // qDebug("contents moving : x=%d", x);
+}
+
+void CompositionView::slotSetTool(const QString& toolName)
+{
+ RG_DEBUG << "CompositionView::slotSetTool(" << toolName << ")"
+ << this << "\n";
+
+ if (m_tool)
+ m_tool->stow();
+
+ m_toolContextHelp = "";
+
+ m_tool = m_toolBox->getTool(toolName);
+
+ if (m_tool)
+ m_tool->ready();
+ else {
+ KMessageBox::error(0, QString("CompositionView::slotSetTool() : unknown tool name %1").arg(toolName));
+ }
+}
+
+void CompositionView::slotSelectSegments(const SegmentSelection &segments)
+{
+ RG_DEBUG << "CompositionView::slotSelectSegments\n";
+
+ static QRect dummy;
+
+ getModel()->clearSelected();
+
+ for (SegmentSelection::iterator i = segments.begin(); i != segments.end(); ++i) {
+ getModel()->setSelected(CompositionItem(new CompositionItemImpl(**i, dummy)));
+ }
+ slotUpdateSegmentsDrawBuffer();
+}
+
+SegmentSelector*
+CompositionView::getSegmentSelectorTool()
+{
+ return dynamic_cast<SegmentSelector*>(getToolBox()->getTool(SegmentSelector::ToolName));
+}
+
+void CompositionView::slotSetSelectAdd(bool value)
+{
+ SegmentSelector* selTool = getSegmentSelectorTool();
+
+ if (!selTool)
+ return ;
+
+ selTool->setSegmentAdd(value);
+}
+
+void CompositionView::slotSetSelectCopy(bool value)
+{
+ SegmentSelector* selTool = getSegmentSelectorTool();
+
+ if (!selTool)
+ return ;
+
+ selTool->setSegmentCopy(value);
+}
+
+void CompositionView::slotShowSplitLine(int x, int y)
+{
+ m_splitLinePos.setX(x);
+ m_splitLinePos.setY(y);
+}
+
+void CompositionView::slotHideSplitLine()
+{
+ m_splitLinePos.setX( -1);
+ m_splitLinePos.setY( -1);
+}
+
+void CompositionView::slotExternalWheelEvent(QWheelEvent* e)
+{
+ e->accept();
+ wheelEvent(e);
+}
+
+CompositionItem CompositionView::getFirstItemAt(QPoint pos)
+{
+ CompositionModel::itemcontainer items = getModel()->getItemsAt(pos);
+
+ if (items.size()) {
+ // find topmost item
+ CompositionItem res = *(items.begin());
+
+ unsigned int maxZ = res->z();
+
+ CompositionModel::itemcontainer::iterator maxZItemPos = items.begin();
+
+ for (CompositionModel::itemcontainer::iterator i = items.begin();
+ i != items.end(); ++i) {
+ CompositionItem ic = *i;
+ if (ic->z() > maxZ) {
+ RG_DEBUG << k_funcinfo << "found new topmost at z=" << ic->z() << endl;
+ res = ic;
+ maxZ = ic->z();
+ maxZItemPos = i;
+ }
+ }
+
+ // get rid of the rest;
+ items.erase(maxZItemPos);
+ for (CompositionModel::itemcontainer::iterator i = items.begin();
+ i != items.end(); ++i)
+ delete *i;
+
+ return res;
+ } else {
+ RG_DEBUG << k_funcinfo << "no item under cursor\n";
+ }
+
+
+ return CompositionItem();
+}
+
+void CompositionView::setSnapGrain(bool fine)
+{
+ if (m_fineGrain) {
+ grid().setSnapTime(SnapGrid::NoSnap);
+ } else {
+ grid().setSnapTime(fine ? SnapGrid::SnapToBeat : SnapGrid::SnapToBar);
+ }
+}
+
+void CompositionView::slotUpdateSegmentsDrawBuffer()
+{
+ // RG_DEBUG << "CompositionView::slotUpdateSegmentsDrawBuffer()\n";
+ slotAllDrawBuffersNeedRefresh();
+ updateContents();
+}
+
+void CompositionView::slotUpdateSegmentsDrawBuffer(const QRect& rect)
+{
+ // RG_DEBUG << "CompositionView::slotUpdateSegmentsDrawBuffer() rect "
+ // << rect << " - valid : " << rect.isValid() << endl;
+
+ slotAllDrawBuffersNeedRefresh(rect);
+
+ if (rect.isValid()) {
+ updateContents(rect);
+ } else {
+ updateContents();
+ }
+}
+
+void CompositionView::slotRefreshColourCache()
+{
+ CompositionColourCache::getInstance()->init();
+ clearSegmentRectsCache();
+ slotUpdateSegmentsDrawBuffer();
+}
+
+void CompositionView::slotNewMIDIRecordingSegment(Segment* s)
+{
+ getModel()->addRecordingItem(CompositionItemHelper::makeCompositionItem(s));
+}
+
+void CompositionView::slotNewAudioRecordingSegment(Segment* s)
+{
+ getModel()->addRecordingItem(CompositionItemHelper::makeCompositionItem(s));
+}
+
+void CompositionView::slotStoppedRecording()
+{
+ getModel()->clearRecordingItems();
+}
+
+void CompositionView::resizeEvent(QResizeEvent* e)
+{
+ QScrollView::resizeEvent(e);
+ slotUpdateSize();
+
+ int w = std::max(m_segmentsDrawBuffer.width(), visibleWidth());
+ int h = std::max(m_segmentsDrawBuffer.height(), visibleHeight());
+
+ m_segmentsDrawBuffer.resize(w, h);
+ m_artifactsDrawBuffer.resize(w, h);
+ slotAllDrawBuffersNeedRefresh();
+ // RG_DEBUG << "CompositionView::resizeEvent() : drawBuffer size = " << m_segmentsDrawBuffer.size() << endl;
+}
+
+void CompositionView::viewportPaintEvent(QPaintEvent* e)
+{
+ QMemArray<QRect> rects = e->region().rects();
+
+ for (unsigned int i = 0; i < rects.size(); ++i) {
+ viewportPaintRect(rects[i]);
+ }
+}
+
+void CompositionView::viewportPaintRect(QRect r)
+{
+ QRect updateRect = r;
+
+ r &= viewport()->rect();
+ r.moveBy(contentsX(), contentsY());
+
+ // RG_DEBUG << "CompositionView::viewportPaintRect() r = " << r
+ // << " - moveBy " << contentsX() << "," << contentsY() << " - updateRect = " << updateRect
+ // << " - refresh " << m_segmentsDrawBufferRefresh << " artrefresh " << m_artifactsDrawBufferRefresh << endl;
+
+
+ bool scroll = false;
+ bool changed = checkScrollAndRefreshDrawBuffer(r, scroll);
+
+ if (changed || m_artifactsDrawBufferRefresh.isValid()) {
+
+ // r was modified by checkScrollAndRefreshDrawBuffer
+ QRect copyRect(r | m_artifactsDrawBufferRefresh);
+ copyRect.moveBy( -contentsX(), -contentsY());
+
+ // RG_DEBUG << "copying from segment to artifacts buffer: " << copyRect << endl;
+
+ bitBlt(&m_artifactsDrawBuffer,
+ copyRect.x(), copyRect.y(),
+ &m_segmentsDrawBuffer,
+ copyRect.x(), copyRect.y(), copyRect.width(), copyRect.height());
+ m_artifactsDrawBufferRefresh |= r;
+ }
+
+ if (m_artifactsDrawBufferRefresh.isValid()) {
+ refreshArtifactsDrawBuffer(m_artifactsDrawBufferRefresh);
+ m_artifactsDrawBufferRefresh = QRect();
+ }
+
+ if (scroll) {
+ bitBlt(viewport(), 0, 0,
+ &m_artifactsDrawBuffer, 0, 0,
+ m_artifactsDrawBuffer.width(), m_artifactsDrawBuffer.height());
+ } else {
+ bitBlt(viewport(), updateRect.x(), updateRect.y(),
+ &m_artifactsDrawBuffer, updateRect.x(), updateRect.y(),
+ updateRect.width(), updateRect.height());
+ }
+
+ // DEBUG
+
+ // QPainter pdebug(viewport());
+ // static QPen framePen(Qt::red, 1);
+ // pdebug.setPen(framePen);
+ // pdebug.drawRect(updateRect);
+
+}
+
+bool CompositionView::checkScrollAndRefreshDrawBuffer(QRect &rect, bool& scroll)
+{
+ bool all = false;
+ QRect refreshRect = m_segmentsDrawBufferRefresh;
+
+ int w = visibleWidth(), h = visibleHeight();
+ int cx = contentsX(), cy = contentsY();
+
+ scroll = (cx != m_lastBufferRefreshX || cy != m_lastBufferRefreshY);
+
+ if (scroll) {
+
+ // RG_DEBUG << "checkScrollAndRefreshDrawBuffer: scrolling by ("
+ // << cx - m_lastBufferRefreshX << "," << cy - m_lastBufferRefreshY << ")" << endl;
+
+ if (refreshRect.isValid()) {
+
+ // If we've scrolled and there was an existing refresh
+ // rect, we can't be sure whether the refresh rect
+ // predated or postdated the internal update of scroll
+ // location. Cut our losses and refresh everything.
+
+ refreshRect.setRect(cx, cy, w, h);
+
+ } else {
+
+ // No existing refresh rect: we only need to handle the
+ // scroll
+
+ if (cx != m_lastBufferRefreshX) {
+
+ int dx = m_lastBufferRefreshX - cx;
+
+ if (dx > -w && dx < w) {
+
+ QPainter cp(&m_segmentsDrawBuffer);
+ cp.drawPixmap(dx, 0, m_segmentsDrawBuffer);
+
+ if (dx < 0) {
+ refreshRect |= QRect(cx + w + dx, cy, -dx, h);
+ } else {
+ refreshRect |= QRect(cx, cy, dx, h);
+ }
+
+ } else {
+
+ refreshRect.setRect(cx, cy, w, h);
+ all = true;
+ }
+ }
+
+ if (cy != m_lastBufferRefreshY && !all) {
+
+ int dy = m_lastBufferRefreshY - cy;
+
+ if (dy > -h && dy < h) {
+
+ QPainter cp(&m_segmentsDrawBuffer);
+ cp.drawPixmap(0, dy, m_segmentsDrawBuffer);
+
+ if (dy < 0) {
+ refreshRect |= QRect(cx, cy + h + dy, w, -dy);
+ } else {
+ refreshRect |= QRect(cx, cy, w, dy);
+ }
+
+ } else {
+
+ refreshRect.setRect(cx, cy, w, h);
+ all = true;
+ }
+ }
+ }
+ }
+
+ bool needRefresh = false;
+
+ if (refreshRect.isValid()) {
+ needRefresh = true;
+ }
+
+ if (needRefresh)
+ refreshSegmentsDrawBuffer(refreshRect);
+
+ m_segmentsDrawBufferRefresh = QRect();
+ m_lastBufferRefreshX = cx;
+ m_lastBufferRefreshY = cy;
+
+ rect |= refreshRect;
+ if (scroll)
+ rect.setRect(cx, cy, w, h);
+ return needRefresh;
+}
+
+void CompositionView::refreshSegmentsDrawBuffer(const QRect& rect)
+{
+ // Profiler profiler("CompositionView::refreshDrawBuffer", true);
+ // RG_DEBUG << "CompositionView::refreshSegmentsDrawBuffer() r = "
+ // << rect << endl;
+
+ QPainter p(&m_segmentsDrawBuffer, viewport());
+ p.translate( -contentsX(), -contentsY());
+
+ if (!m_backgroundPixmap.isNull()) {
+ QPoint pp(rect.x() % m_backgroundPixmap.height(), rect.y() % m_backgroundPixmap.width());
+ p.drawTiledPixmap(rect, m_backgroundPixmap, pp);
+ } else {
+ p.eraseRect(rect);
+ }
+
+ drawArea(&p, rect);
+
+ // DEBUG - show what's updated
+ // QPen framePen(Qt::red, 1);
+ // p.setPen(framePen);
+ // p.drawRect(rect);
+
+ // m_segmentsDrawBufferNeedsRefresh = false;
+}
+
+void CompositionView::refreshArtifactsDrawBuffer(const QRect& rect)
+{
+ // RG_DEBUG << "CompositionView::refreshArtifactsDrawBuffer() r = "
+ // << rect << endl;
+
+ QPainter p;
+ p.begin(&m_artifactsDrawBuffer, viewport());
+ p.translate( -contentsX(), -contentsY());
+ // QRect r(contentsX(), contentsY(), m_artifactsDrawBuffer.width(), m_artifactsDrawBuffer.height());
+ drawAreaArtifacts(&p, rect);
+ p.end();
+
+ // m_artifactsDrawBufferNeedsRefresh = false;
+}
+
+void CompositionView::drawArea(QPainter *p, const QRect& clipRect)
+{
+ // Profiler profiler("CompositionView::drawArea", true);
+
+ // RG_DEBUG << "CompositionView::drawArea() clipRect = " << clipRect << endl;
+
+ //
+ // Fetch track dividing lines
+ //
+ CompositionModel::heightlist lineHeights = getModel()->getTrackDividersIn(clipRect);
+
+ if (!lineHeights.empty()) {
+
+ p->save();
+ QColor light = m_trackDividerColor.light();
+ p->setPen(light);
+
+ for (CompositionModel::heightlist::const_iterator hi = lineHeights.begin();
+ hi != lineHeights.end(); ++hi) {
+ int y = *hi;
+ if (y-1 >= clipRect.y()) {
+ p->drawLine(clipRect.x(), y-1,
+ clipRect.x() + clipRect.width() - 1, y-1);
+ }
+ if (y >= clipRect.y()) {
+ p->drawLine(clipRect.x(), y,
+ clipRect.x() + clipRect.width() - 1, y);
+ }
+ }
+
+ p->setPen(m_trackDividerColor);
+
+ for (CompositionModel::heightlist::const_iterator hi = lineHeights.begin();
+ hi != lineHeights.end(); ++hi) {
+ int y = *hi;
+ if (y-2 >= clipRect.y()) {
+ p->drawLine(clipRect.x(), y-2,
+ clipRect.x() + clipRect.width() - 1, y-2);
+ }
+ if (y+1 >= clipRect.y()) {
+ p->drawLine(clipRect.x(), y+1,
+ clipRect.x() + clipRect.width() - 1, y+1);
+ }
+ }
+
+ p->restore();
+ }
+
+ CompositionModel::AudioPreviewDrawData* audioPreviewData = 0;
+ CompositionModel::RectRanges* notationPreviewData = 0;
+
+ //
+ // Fetch previews
+ //
+ if (m_showPreviews) {
+ notationPreviewData = &m_notationPreviewRects;
+ m_notationPreviewRects.clear();
+ audioPreviewData = &m_audioPreviewRects;
+ m_audioPreviewRects.clear();
+ }
+
+ //
+ // Fetch segment rectangles to draw
+ //
+ const CompositionModel::rectcontainer& rects = getModel()->getRectanglesIn(clipRect,
+ notationPreviewData, audioPreviewData);
+ CompositionModel::rectcontainer::const_iterator i = rects.begin();
+ CompositionModel::rectcontainer::const_iterator end = rects.end();
+
+ //
+ // Draw Segment Rectangles
+ //
+ p->save();
+ for (; i != end; ++i) {
+ p->setBrush(i->getBrush());
+ p->setPen(i->getPen());
+
+ // RG_DEBUG << "CompositionView::drawArea : draw comp rect " << *i << endl;
+ drawCompRect(*i, p, clipRect);
+ }
+
+ p->restore();
+
+ if (rects.size() > 1) {
+ // RG_DEBUG << "CompositionView::drawArea : drawing intersections\n";
+ drawIntersections(rects, p, clipRect);
+ }
+
+ //
+ // Previews
+ //
+ if (m_showPreviews) {
+ p->save();
+
+ // draw audio previews
+ //
+ drawAreaAudioPreviews(p, clipRect);
+
+ // draw notation previews
+ //
+ CompositionModel::RectRanges::const_iterator npi = m_notationPreviewRects.begin();
+ CompositionModel::RectRanges::const_iterator npEnd = m_notationPreviewRects.end();
+
+ for (; npi != npEnd; ++npi) {
+ CompositionModel::RectRange interval = *npi;
+ p->save();
+ p->translate(interval.basePoint.x(), interval.basePoint.y());
+ // RG_DEBUG << "CompositionView::drawArea : translating to x = " << interval.basePoint.x() << endl;
+ for (; interval.range.first != interval.range.second; ++interval.range.first) {
+
+ const PreviewRect& pr = *(interval.range.first);
+ QColor defaultCol = CompositionColourCache::getInstance()->SegmentInternalPreview;
+ QColor col = interval.color.isValid() ? interval.color : defaultCol;
+ p->setBrush(col);
+ p->setPen(col);
+ // RG_DEBUG << "CompositionView::drawArea : drawing preview rect at x = " << pr.x() << endl;
+ p->drawRect(pr);
+ }
+ p->restore();
+ }
+
+ p->restore();
+ }
+
+ //
+ // Draw segment labels (they must be drawn over the preview rects)
+ //
+ if (m_showSegmentLabels) {
+ for (i = rects.begin(); i != end; ++i) {
+ drawCompRectLabel(*i, p, clipRect);
+ }
+ }
+
+ // drawAreaArtifacts(p, clipRect);
+
+}
+
+void CompositionView::drawAreaAudioPreviews(QPainter * p, const QRect& clipRect)
+{
+ CompositionModel::AudioPreviewDrawData::const_iterator api = m_audioPreviewRects.begin();
+ CompositionModel::AudioPreviewDrawData::const_iterator apEnd = m_audioPreviewRects.end();
+ QRect rectToFill, // rect to fill on canvas
+ localRect; // the rect of the tile to draw on the canvas
+ QPoint basePoint, // origin of segment rect
+ drawBasePoint; // origin of rect to fill on canvas
+ QRect r;
+ for (; api != apEnd; ++api) {
+ rectToFill = api->rect;
+ basePoint = api->basePoint;
+ rectToFill.moveTopLeft(basePoint);
+ rectToFill &= clipRect;
+ r = rectToFill;
+ drawBasePoint = rectToFill.topLeft();
+ rectToFill.moveBy( -basePoint.x(), -basePoint.y());
+ int firstPixmapIdx = (r.x() - basePoint.x()) / AudioPreviewPainter::tileWidth();
+ if (firstPixmapIdx >= api->pixmap.size()) {
+ // RG_DEBUG << "CompositionView::drawAreaAudioPreviews : WARNING - miscomputed pixmap array : r.x = "
+ // << r.x() << " - basePoint.x = " << basePoint.x() << " - firstPixmapIdx = " << firstPixmapIdx
+ // << endl;
+ continue;
+ }
+ int x = 0, idx = firstPixmapIdx;
+ // RG_DEBUG << "CompositionView::drawAreaAudioPreviews : clipRect = " << clipRect
+ // << " - firstPixmapIdx = " << firstPixmapIdx << endl;
+ while (x < clipRect.width()) {
+ int pixmapRectXOffset = idx * AudioPreviewPainter::tileWidth();
+ localRect.setRect(basePoint.x() + pixmapRectXOffset, basePoint.y(),
+ AudioPreviewPainter::tileWidth(), api->rect.height());
+ // RG_DEBUG << "CompositionView::drawAreaAudioPreviews : initial localRect = "
+ // << localRect << endl;
+ localRect &= r;
+ if (idx == firstPixmapIdx && api->resizeOffset != 0) {
+ // this segment is being resized from start, clip beginning of preview
+ localRect.moveBy(api->resizeOffset, 0);
+ }
+
+ // RG_DEBUG << "CompositionView::drawAreaAudioPreviews : localRect & clipRect = "
+ // << localRect << endl;
+ if (localRect.isEmpty()) {
+ // RG_DEBUG << "CompositionView::drawAreaAudioPreviews : localRect & clipRect is empty\n";
+ break;
+ }
+ localRect.moveBy( -(basePoint.x() + pixmapRectXOffset), -basePoint.y());
+
+ // RG_DEBUG << "CompositionView::drawAreaAudioPreviews : drawing pixmap "
+ // << idx << " at " << drawBasePoint << " - localRect = " << localRect
+ // << " - preResizeOrigin : " << api->preResizeOrigin << endl;
+
+ p->drawImage(drawBasePoint, api->pixmap[idx], localRect,
+ Qt::ColorOnly | Qt::ThresholdDither | Qt::AvoidDither);
+
+ ++idx;
+ if (idx >= api->pixmap.size())
+ break;
+ drawBasePoint.setX(drawBasePoint.x() + localRect.width());
+ x += localRect.width();
+ }
+ }
+}
+
+void CompositionView::drawAreaArtifacts(QPainter * p, const QRect& clipRect)
+{
+ //
+ // Playback Pointer
+ //
+ drawPointer(p, clipRect);
+
+ //
+ // Tmp rect (rect displayed while drawing a new segment)
+ //
+ if (m_tmpRect.isValid() && m_tmpRect.intersects(clipRect)) {
+ p->setBrush(m_tmpRectFill);
+ p->setPen(CompositionColourCache::getInstance()->SegmentBorder);
+ drawRect(m_tmpRect, p, clipRect);
+ }
+
+ //
+ // Tool guides (crosshairs)
+ //
+ if (m_drawGuides)
+ drawGuides(p, clipRect);
+
+ //
+ // Selection Rect
+ //
+ if (m_drawSelectionRect) {
+ drawRect(m_selectionRect, p, clipRect, false, 0, false);
+ }
+
+ //
+ // Floating Text
+ //
+ if (m_drawTextFloat)
+ drawTextFloat(p, clipRect);
+
+ //
+ // Split line
+ //
+ if (m_splitLinePos.x() > 0 && clipRect.contains(m_splitLinePos)) {
+ p->save();
+ p->setPen(m_guideColor);
+ p->drawLine(m_splitLinePos.x(), m_splitLinePos.y(),
+ m_splitLinePos.x(), m_splitLinePos.y() + getModel()->grid().getYSnap());
+ p->restore();
+ }
+}
+
+void CompositionView::drawGuides(QPainter * p, const QRect& /*clipRect*/)
+{
+ // no need to check for clipping, these guides are meant to follow the mouse cursor
+ QPoint guideOrig(m_topGuidePos, m_foreGuidePos);
+
+ p->save();
+ p->setPen(m_guideColor);
+ p->drawLine(guideOrig.x(), 0, guideOrig.x(), contentsHeight());
+ p->drawLine(0, guideOrig.y(), contentsWidth(), guideOrig.y());
+ p->restore();
+}
+
+void CompositionView::drawCompRect(const CompositionRect& r, QPainter *p, const QRect& clipRect,
+ int intersectLvl, bool fill)
+{
+ p->save();
+
+ QBrush brush = r.getBrush();
+
+ if (r.isRepeating()) {
+ QColor brushColor = brush.color();
+ brush.setColor(brushColor.light(150));
+ }
+
+ p->setBrush(brush);
+ p->setPen(r.getPen());
+ drawRect(r, p, clipRect, r.isSelected(), intersectLvl, fill);
+
+ if (r.isRepeating()) {
+
+ CompositionRect::repeatmarks repeatMarks = r.getRepeatMarks();
+
+ // RG_DEBUG << "CompositionView::drawCompRect() : drawing repeating rect " << r
+ // << " nb repeat marks = " << repeatMarks.size() << endl;
+
+ // draw 'start' rectangle with original brush
+ //
+ QRect startRect = r;
+ startRect.setWidth(repeatMarks[0] - r.x());
+ p->setBrush(r.getBrush());
+ drawRect(startRect, p, clipRect, r.isSelected(), intersectLvl, fill);
+
+
+ // now draw the 'repeat' marks
+ //
+ p->setPen(CompositionColourCache::getInstance()->RepeatSegmentBorder);
+ int penWidth = std::max(r.getPen().width(), 1u);
+
+ for (unsigned int i = 0; i < repeatMarks.size(); ++i) {
+ int pos = repeatMarks[i];
+ if (pos > clipRect.right())
+ break;
+
+ if (pos >= clipRect.left()) {
+ QPoint p1(pos, r.y() + penWidth),
+ p2(pos, r.y() + r.height() - penWidth - 1);
+
+ // RG_DEBUG << "CompositionView::drawCompRect() : drawing repeat mark at "
+ // << p1 << "-" << p2 << endl;
+ p->drawLine(p1, p2);
+ }
+
+ }
+
+ }
+
+ p->restore();
+}
+
+void CompositionView::drawCompRectLabel(const CompositionRect& r, QPainter *p, const QRect& clipRect)
+{
+ // draw segment label
+ //
+#ifdef NOT_DEFINED
+ if (!r.getLabel().isEmpty() /* && !r.isSelected() */)
+ {
+ p->save();
+ p->setPen(GUIPalette::getColour(GUIPalette::SegmentLabel));
+ p->setBrush(white);
+ QRect textRect(r);
+ textRect.setX(textRect.x() + 3);
+ QString label = " " + r.getLabel() + " ";
+ QRect textBoundingRect = p->boundingRect(textRect, Qt::AlignLeft | Qt::AlignVCenter, label);
+ p->drawRect(textBoundingRect & r);
+ p->drawText(textRect, Qt::AlignLeft | Qt::AlignVCenter, label);
+ p->restore();
+ }
+#else
+ if (!r.getLabel().isEmpty()) {
+
+ p->save();
+
+ QFont font;
+ font.setPixelSize(r.height() / 2.2);
+ font.setWeight(QFont::Bold);
+ font.setItalic(false);
+ p->setFont(font);
+
+ QRect labelRect = QRect
+ (r.x(),
+ r.y() + ((r.height() - p->fontMetrics().height()) / 2) + 1,
+ r.width(),
+ p->fontMetrics().height());
+
+ int x = labelRect.x() + p->fontMetrics().width('x');
+ int y = labelRect.y();
+
+ QBrush brush = r.getBrush();
+ QColor surroundColour = brush.color().light(110);
+
+ int h, s, v;
+ surroundColour.hsv(&h, &s, &v);
+ if (v < 150)
+ surroundColour.setHsv(h, s, 225);
+ p->setPen(surroundColour);
+
+ for (int i = 0; i < 9; ++i) {
+
+ if (i == 4)
+ continue;
+
+ int wx = x, wy = y;
+
+ if (i < 3)
+ --wx;
+ if (i > 5)
+ ++wx;
+ if (i % 3 == 0)
+ --wy;
+ if (i % 3 == 2)
+ ++wy;
+
+ labelRect.setX(wx);
+ labelRect.setY(wy);
+
+ p->drawText(labelRect,
+ Qt::AlignLeft | Qt::AlignTop,
+ r.getLabel());
+ }
+
+ labelRect.setX(x);
+ labelRect.setY(y);
+
+ p->setPen(GUIPalette::getColour
+ (GUIPalette::SegmentLabel));
+ p->drawText(labelRect,
+ Qt::AlignLeft | Qt::AlignVCenter, r.getLabel());
+ p->restore();
+ }
+#endif
+}
+
+void CompositionView::drawRect(const QRect& r, QPainter *p, const QRect& clipRect,
+ bool isSelected, int intersectLvl, bool fill)
+{
+ // RG_DEBUG << "CompositionView::drawRect : intersectLvl = " << intersectLvl
+ // << " - brush col = " << p->brush().color() << endl;
+
+ // RG_DEBUG << "CompositionView::drawRect " << r << " - xformed : " << p->xForm(r)
+ // << " - contents x = " << contentsX() << ", contents y = " << contentsY() << endl;
+
+ p->save();
+
+ QRect rect = r;
+
+ if (fill) {
+ if (isSelected) {
+ QColor fillColor = p->brush().color();
+ fillColor = fillColor.dark(200);
+ QBrush b = p->brush();
+ b.setColor(fillColor);
+ p->setBrush(b);
+ // RG_DEBUG << "CompositionView::drawRect : selected color : " << fillColor << endl;
+ }
+
+ if (intersectLvl > 0) {
+ QColor fillColor = p->brush().color();
+ fillColor = fillColor.dark((intersectLvl) * 105);
+ QBrush b = p->brush();
+ b.setColor(fillColor);
+ p->setBrush(b);
+ // RG_DEBUG << "CompositionView::drawRect : intersected color : " << fillColor << " isSelected : " << isSelected << endl;
+ }
+ } else {
+ p->setBrush(Qt::NoBrush);
+ }
+
+ // Paint using the small coordinates...
+ QRect intersection = rect.intersect(clipRect);
+
+ if (clipRect.contains(rect)) {
+ p->drawRect(rect);
+ } else {
+ // draw only what's necessary
+ if (!intersection.isEmpty() && fill)
+ p->fillRect(intersection, p->brush());
+
+ int rectTopY = rect.y();
+
+ if (rectTopY >= clipRect.y() &&
+ rectTopY <= (clipRect.y() + clipRect.height())) {
+ // to prevent overflow, in case the original rect is too wide
+ // the line would be drawn "backwards"
+ p->drawLine(intersection.topLeft(), intersection.topRight());
+ }
+
+ int rectBottomY = rect.y() + rect.height();
+ if (rectBottomY >= clipRect.y() &&
+ rectBottomY <= (clipRect.y() + clipRect.height()))
+ // to prevent overflow, in case the original rect is too wide
+ // the line would be drawn "backwards"
+ p->drawLine(intersection.bottomLeft(), intersection.bottomRight());
+
+ int rectLeftX = rect.x();
+ if (rectLeftX >= clipRect.x() &&
+ rectLeftX <= (clipRect.x() + clipRect.width()))
+ p->drawLine(rect.topLeft(), rect.bottomLeft());
+
+ unsigned int rectRightX = rect.x() + rect.width(); // make sure we don't overflow
+ if (rectRightX >= unsigned(clipRect.x()) &&
+ rectRightX <= unsigned(clipRect.x() + clipRect.width()))
+ p->drawLine(rect.topRight(), rect.bottomRight());
+
+ }
+
+ p->restore();
+}
+
+QColor CompositionView::mixBrushes(QBrush a, QBrush b)
+{
+ QColor ac = a.color(), bc = b.color();
+
+ int aR = ac.red(), aG = ac.green(), aB = ac.blue(),
+ bR = bc.red(), bG = bc.green(), bB = ac.blue();
+
+ ac.setRgb((aR + bR) / 2, (aG + bG) / 2, (aB + bB) / 2);
+
+ return ac;
+}
+
+void CompositionView::drawIntersections(const CompositionModel::rectcontainer& rects,
+ QPainter * p, const QRect& clipRect)
+{
+ if (! (rects.size() > 1))
+ return ;
+
+ CompositionModel::rectcontainer intersections;
+
+ CompositionModel::rectcontainer::const_iterator i = rects.begin(),
+ j = rects.begin();
+
+ for (; j != rects.end(); ++j) {
+
+ CompositionRect testRect = *j;
+ i = j;
+ ++i; // set i to pos after j
+
+ if (i == rects.end())
+ break;
+
+ for (; i != rects.end(); ++i) {
+ CompositionRect ri = testRect.intersect(*i);
+ if (!ri.isEmpty()) {
+ CompositionModel::rectcontainer::iterator t = std::find(intersections.begin(),
+ intersections.end(), ri);
+ if (t == intersections.end()) {
+ ri.setBrush(mixBrushes(testRect.getBrush(), i->getBrush()));
+ ri.setSelected(testRect.isSelected() || i->isSelected());
+ intersections.push_back(ri);
+ }
+
+ }
+ }
+ }
+
+ //
+ // draw this level of intersections then compute and draw further ones
+ //
+ int intersectionLvl = 1;
+
+ while (!intersections.empty()) {
+
+ for (CompositionModel::rectcontainer::iterator intIter = intersections.begin();
+ intIter != intersections.end(); ++intIter) {
+ CompositionRect r = *intIter;
+ drawCompRect(r, p, clipRect, intersectionLvl);
+ }
+
+ if (intersections.size() > 10)
+ break; // put a limit on how many intersections we can compute and draw - this grows exponentially
+
+ ++intersectionLvl;
+
+ CompositionModel::rectcontainer intersections2;
+
+ CompositionModel::rectcontainer::iterator i = intersections.begin(),
+ j = intersections.begin();
+
+ for (; j != intersections.end(); ++j) {
+
+ CompositionRect testRect = *j;
+ i = j;
+ ++i; // set i to pos after j
+
+ if (i == intersections.end())
+ break;
+
+ for (; i != intersections.end(); ++i) {
+ CompositionRect ri = testRect.intersect(*i);
+ if (!ri.isEmpty() && ri != *i) {
+ CompositionModel::rectcontainer::iterator t = std::find(intersections2.begin(),
+ intersections2.end(), ri);
+ if (t == intersections2.end())
+ ri.setBrush(mixBrushes(testRect.getBrush(), i->getBrush()));
+ intersections2.push_back(ri);
+ }
+ }
+ }
+
+ intersections = intersections2;
+ }
+
+}
+
+void CompositionView::drawPointer(QPainter *p, const QRect& clipRect)
+{
+ // RG_DEBUG << "CompositionView::drawPointer: clipRect "
+ // << clipRect.x() << "," << clipRect.y() << " " << clipRect.width()
+ // << "x" << clipRect.height() << " pointer pos is " << m_pointerPos << endl;
+
+ if (m_pointerPos >= clipRect.x() && m_pointerPos <= (clipRect.x() + clipRect.width())) {
+ p->save();
+ p->setPen(m_pointerPen);
+ p->drawLine(m_pointerPos, clipRect.y(), m_pointerPos, clipRect.y() + clipRect.height());
+ p->restore();
+ }
+
+}
+
+void CompositionView::drawTextFloat(QPainter *p, const QRect& clipRect)
+{
+ QFontMetrics metrics(p->fontMetrics());
+
+ QRect bound = p->boundingRect(0, 0, 300, metrics.height() + 6, AlignAuto, m_textFloatText);
+
+ p->save();
+
+ bound.setLeft(bound.left() - 2);
+ bound.setRight(bound.right() + 2);
+ bound.setTop(bound.top() - 2);
+ bound.setBottom(bound.bottom() + 2);
+
+ QPoint pos(m_textFloatPos);
+ if (pos.y() < 0 && getModel()) {
+ if (pos.y() + bound.height() < 0) {
+ pos.setY(pos.y() + getModel()->grid().getYSnap() * 3);
+ } else {
+ pos.setY(pos.y() + getModel()->grid().getYSnap() * 2);
+ }
+ }
+
+ bound.moveTopLeft(pos);
+
+ if (bound.intersects(clipRect)) {
+
+ p->setBrush(CompositionColourCache::getInstance()->RotaryFloatBackground);
+
+ drawRect(bound, p, clipRect, false, 0, true);
+
+ p->setPen(CompositionColourCache::getInstance()->RotaryFloatForeground);
+
+ p->drawText(pos.x() + 2, pos.y() + 3 + metrics.ascent(), m_textFloatText);
+
+ }
+
+ p->restore();
+}
+
+bool CompositionView::event(QEvent* e)
+{
+ if (e->type() == AudioPreviewThread::AudioPreviewQueueEmpty) {
+ RG_DEBUG << "CompositionView::event - AudioPreviewQueueEmpty\n";
+ slotSegmentsDrawBufferNeedsRefresh();
+ viewport()->update();
+ return true;
+ }
+
+ return RosegardenScrollView::event(e);
+}
+
+void CompositionView::enterEvent(QEvent *e)
+{
+ kapp->config()->setGroup(GeneralOptionsConfigGroup);
+ if (!kapp->config()->readBoolEntry("toolcontexthelp", true)) return;
+
+ emit showContextHelp(m_toolContextHelp);
+ m_contextHelpShown = true;
+}
+
+void CompositionView::leaveEvent(QEvent *e)
+{
+ emit showContextHelp("");
+ m_contextHelpShown = false;
+}
+
+void CompositionView::slotToolHelpChanged(const QString &text)
+{
+ if (m_toolContextHelp == text) return;
+ m_toolContextHelp = text;
+
+ kapp->config()->setGroup(GeneralOptionsConfigGroup);
+ if (!kapp->config()->readBoolEntry("toolcontexthelp", true)) return;
+
+ if (m_contextHelpShown) emit showContextHelp(text);
+}
+
+void CompositionView::contentsMousePressEvent(QMouseEvent* e)
+{
+ Qt::ButtonState bs = e->state();
+ slotSetSelectCopy((bs & Qt::ControlButton) != 0);
+ slotSetSelectAdd((bs & Qt::ShiftButton) != 0);
+ slotSetFineGrain((bs & Qt::ShiftButton) != 0);
+ slotSetPencilOverExisting((bs & Qt::AltButton + Qt::ControlButton) != 0);
+
+ switch (e->button()) {
+ case LeftButton:
+ case MidButton:
+ startAutoScroll();
+
+ if (m_tool)
+ m_tool->handleMouseButtonPress(e);
+ else
+ RG_DEBUG << "CompositionView::contentsMousePressEvent() :"
+ << this << " no tool\n";
+ break;
+ case RightButton:
+ if (m_tool)
+ m_tool->handleRightButtonPress(e);
+ else
+ RG_DEBUG << "CompositionView::contentsMousePressEvent() :"
+ << this << " no tool\n";
+ break;
+ default:
+ break;
+ }
+}
+
+void CompositionView::contentsMouseReleaseEvent(QMouseEvent* e)
+{
+ RG_DEBUG << "CompositionView::contentsMouseReleaseEvent()\n";
+
+ stopAutoScroll();
+
+ if (!m_tool)
+ return ;
+
+ if (e->button() == LeftButton ||
+ e->button() == MidButton )
+ m_tool->handleMouseButtonRelease(e);
+}
+
+void CompositionView::contentsMouseDoubleClickEvent(QMouseEvent* e)
+{
+ m_currentItem = getFirstItemAt(e->pos());
+
+ if (!m_currentItem) {
+ RG_DEBUG << "CompositionView::contentsMouseDoubleClickEvent - no currentItem\n";
+ RulerScale *ruler = grid().getRulerScale();
+ if (ruler) emit setPointerPosition(ruler->getTimeForX(e->pos().x()));
+ return ;
+ }
+
+ RG_DEBUG << "CompositionView::contentsMouseDoubleClickEvent - have currentItem\n";
+
+ CompositionItemImpl* itemImpl = dynamic_cast<CompositionItemImpl*>((_CompositionItem*)m_currentItem);
+
+ if (m_currentItem->isRepeating()) {
+ timeT time = getModel()->getRepeatTimeAt(e->pos(), m_currentItem);
+
+ RG_DEBUG << "editRepeat at time " << time << endl;
+ if (time > 0)
+ emit editRepeat(itemImpl->getSegment(), time);
+ else
+ emit editSegment(itemImpl->getSegment());
+
+ } else {
+
+ emit editSegment(itemImpl->getSegment());
+ }
+}
+
+void CompositionView::contentsMouseMoveEvent(QMouseEvent* e)
+{
+ if (!m_tool)
+ return ;
+
+ Qt::ButtonState bs = e->state();
+ slotSetFineGrain((bs & Qt::ShiftButton) != 0);
+ slotSetPencilOverExisting((bs & Qt::AltButton) != 0);
+
+ int follow = m_tool->handleMouseMove(e);
+ setScrollDirectionConstraint(follow);
+
+ if (follow != RosegardenCanvasView::NoFollow) {
+ doAutoScroll();
+
+ if (follow & RosegardenCanvasView::FollowHorizontal) {
+ slotScrollHorizSmallSteps(e->pos().x());
+
+ // enlarge composition if needed
+ if (horizontalScrollBar()->value() == horizontalScrollBar()->maxValue()) {
+ resizeContents(contentsWidth() + m_stepSize, contentsHeight());
+ setContentsPos(contentsX() + m_stepSize, contentsY());
+ getModel()->setLength(contentsWidth());
+ slotUpdateSize();
+ }
+ }
+
+ if (follow & RosegardenCanvasView::FollowVertical)
+ slotScrollVertSmallSteps(e->pos().y());
+ }
+}
+
+void CompositionView::releaseCurrentItem()
+{
+ m_currentItem = CompositionItem();
+}
+
+void CompositionView::setPointerPos(int pos)
+{
+ // RG_DEBUG << "CompositionView::setPointerPos(" << pos << ")\n";
+ int oldPos = m_pointerPos;
+ if (oldPos == pos)
+ return ;
+
+ m_pointerPos = pos;
+ getModel()->setPointerPos(pos);
+
+ // automagically grow contents width if pointer position goes beyond right end
+ //
+ if (pos >= (contentsWidth() - m_stepSize)) {
+ resizeContents(pos + m_stepSize, contentsHeight());
+ // grow composition too, if needed (it may not be the case if
+ if (getModel()->getLength() < contentsWidth())
+ getModel()->setLength(contentsWidth());
+ }
+
+
+ // interesting -- isAutoScrolling() never seems to return true?
+ // RG_DEBUG << "CompositionView::setPointerPos(" << pos << "), isAutoScrolling " << isAutoScrolling() << ", contentsX " << contentsX() << ", m_lastPointerRefreshX " << m_lastPointerRefreshX << ", contentsHeight " << contentsHeight() << endl;
+
+ if (contentsX() != m_lastPointerRefreshX) {
+ m_lastPointerRefreshX = contentsX();
+ // We'll need to shift the whole canvas anyway, so
+ slotArtifactsDrawBufferNeedsRefresh();
+ return ;
+ }
+
+ int deltaW = abs(m_pointerPos - oldPos);
+
+ if (deltaW <= m_pointerPen.width() * 2) { // use one rect instead of two separate ones
+
+ QRect updateRect
+ (std::min(m_pointerPos, oldPos) - m_pointerPen.width(), 0,
+ deltaW + m_pointerPen.width() * 2, contentsHeight());
+
+ slotArtifactsDrawBufferNeedsRefresh(updateRect);
+
+ } else {
+
+ slotArtifactsDrawBufferNeedsRefresh
+ (QRect(m_pointerPos - m_pointerPen.width(), 0,
+ m_pointerPen.width() * 2, contentsHeight()));
+
+ slotArtifactsDrawBufferNeedsRefresh
+ (QRect(oldPos - m_pointerPen.width(), 0,
+ m_pointerPen.width() * 2, contentsHeight()));
+ }
+}
+
+void CompositionView::setGuidesPos(int x, int y)
+{
+ m_topGuidePos = x;
+ m_foreGuidePos = y;
+ slotArtifactsDrawBufferNeedsRefresh();
+}
+
+void CompositionView::setGuidesPos(const QPoint& p)
+{
+ m_topGuidePos = p.x();
+ m_foreGuidePos = p.y();
+ slotArtifactsDrawBufferNeedsRefresh();
+}
+
+void CompositionView::setDrawGuides(bool d)
+{
+ m_drawGuides = d;
+ slotArtifactsDrawBufferNeedsRefresh();
+}
+
+void CompositionView::setTmpRect(const QRect& r)
+{
+ setTmpRect(r, m_tmpRectFill);
+}
+
+void CompositionView::setTmpRect(const QRect& r, const QColor &c)
+{
+ QRect pRect = m_tmpRect;
+ m_tmpRect = r;
+ m_tmpRectFill = c;
+ slotUpdateSegmentsDrawBuffer(m_tmpRect | pRect);
+}
+
+void CompositionView::setTextFloat(int x, int y, const QString &text)
+{
+ m_textFloatPos.setX(x);
+ m_textFloatPos.setY(y);
+ m_textFloatText = text;
+ m_drawTextFloat = true;
+ slotArtifactsDrawBufferNeedsRefresh();
+
+ // most of the time when the floating text is drawn
+ // we want to update a larger part of the view
+ // so don't update here
+ // QRect r = fontMetrics().boundingRect(x, y, 300, 40, AlignAuto, m_textFloatText);
+ // slotUpdateSegmentsDrawBuffer(r);
+
+
+ // rgapp->slotSetStatusMessage(text);
+}
+
+void CompositionView::slotSetFineGrain(bool value)
+{
+ m_fineGrain = value;
+}
+
+void CompositionView::slotSetPencilOverExisting(bool value)
+{
+ m_pencilOverExisting = value;
+}
+
+void
+CompositionView::slotTextFloatTimeout()
+{
+ hideTextFloat();
+ slotArtifactsDrawBufferNeedsRefresh();
+ // rgapp->slotSetStatusMessage(QString::null);
+}
+
+}
+#include "CompositionView.moc"
diff --git a/src/gui/editors/segment/segmentcanvas/CompositionView.h b/src/gui/editors/segment/segmentcanvas/CompositionView.h
new file mode 100644
index 0000000..ff0d440
--- /dev/null
+++ b/src/gui/editors/segment/segmentcanvas/CompositionView.h
@@ -0,0 +1,366 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_COMPOSITIONVIEW_H_
+#define _RG_COMPOSITIONVIEW_H_
+
+#include "base/Selection.h"
+#include "CompositionModel.h"
+#include "CompositionItem.h"
+#include "gui/general/RosegardenScrollView.h"
+#include <qbrush.h>
+#include <qcolor.h>
+#include <qpen.h>
+#include <qpixmap.h>
+#include <qpoint.h>
+#include <qrect.h>
+#include <qstring.h>
+#include "base/Event.h"
+
+
+class QWidget;
+class QWheelEvent;
+class QResizeEvent;
+class QPaintEvent;
+class QPainter;
+class QMouseEvent;
+class QEvent;
+
+
+namespace Rosegarden
+{
+
+class SnapGrid;
+class SegmentToolBox;
+class SegmentTool;
+class SegmentSelector;
+class Segment;
+class RosegardenGUIDoc;
+class CompositionRect;
+
+
+class CompositionView : public RosegardenScrollView
+{
+ Q_OBJECT
+public:
+ CompositionView(RosegardenGUIDoc*, CompositionModel*,
+ QWidget * parent=0, const char* name=0, WFlags f=0);
+
+ void setPointerPos(int pos);
+ int getPointerPos() { return m_pointerPos; }
+
+ void setGuidesPos(int x, int y);
+ void setGuidesPos(const QPoint& p);
+ void setDrawGuides(bool d);
+
+ QRect getSelectionRect() const { return m_selectionRect; }
+ void setSelectionRectPos(const QPoint& pos);
+ void setSelectionRectSize(int w, int h);
+ void setDrawSelectionRect(bool d);
+
+ SnapGrid& grid() { return m_model->grid(); }
+
+ CompositionItem getFirstItemAt(QPoint pos);
+
+ SegmentToolBox* getToolBox() { return m_toolBox; }
+
+ CompositionModel* getModel() { return m_model; }
+
+ void setTmpRect(const QRect& r);
+ void setTmpRect(const QRect& r, const QColor &c);
+ const QRect& getTmpRect() const { return m_tmpRect; }
+
+ /**
+ * Set the snap resolution of the grid to something suitable.
+ *
+ * fineTool indicates whether the current tool is a fine-grain sort
+ * (such as the resize or move tools) or a coarse one (such as the
+ * segment creation pencil). If the user is requesting extra-fine
+ * resolution (through the setFineGrain method) that will also be
+ * taken into account.
+ */
+ void setSnapGrain(bool fine);
+
+ /**
+ * Find out whether the user is requesting extra-fine resolution
+ * (e.g. by holding Shift key). This is seldom necessary -- most
+ * client code will only need to query the snap grid that is
+ * adjusted appropriately by the view when interactions take
+ * place.
+ */
+ bool isFineGrain() const { return m_fineGrain; }
+
+ /**
+ * Find out whether the user is requesting to draw over an existing segment
+ * with the pencil, by holding the Ctrl key. This is used by the segment
+ * pencil to decide whether to abort or not if a user attempts to draw over
+ * an existing segment, and this is all necessary in order to avoid breaking
+ * the double-click-to-open behavior.
+ */
+ bool pencilOverExisting() const { return m_pencilOverExisting; }
+
+ /**
+ * Set whether the segment items contain previews or not
+ */
+ void setShowPreviews(bool previews) { m_showPreviews = previews; }
+
+ /**
+ * Return whether the segment items contain previews or not
+ */
+ bool isShowingPreviews() { return m_showPreviews; }
+
+ /**
+ * clear all seg rect cache
+ */
+ void clearSegmentRectsCache(bool clearPreviews = false);
+
+ /// Return the selected Segments if we're currently using a "Selector"
+ SegmentSelection getSelectedSegments();
+
+ bool haveSelection() const { return m_model->haveSelection(); }
+
+ void updateSelectionContents();
+
+ /**
+ * Set and hide a text float on this canvas - it can contain
+ * anything and can be left to timeout or you can hide it
+ * explicitly.
+ *
+ */
+ void setTextFloat(int x, int y, const QString &text);
+ void hideTextFloat() { m_drawTextFloat = false; }
+
+ void setShowSegmentLabels(bool b) { m_showSegmentLabels = b; }
+
+ void setBackgroundPixmap(const QPixmap &m);
+
+ void endAudioPreviewGeneration();
+
+public slots:
+ void scrollRight();
+ void scrollLeft();
+ void slotContentsMoving(int x, int y);
+
+ /// Set the current segment editing tool
+ void slotSetTool(const QString& toolName);
+
+ // This method only operates if we're of the "Selector"
+ // tool type - it's called from the View to enable it
+ // to automatically set the selection of Segments (say
+ // by Track).
+ //
+ void slotSelectSegments(const SegmentSelection &segment);
+
+ // These are sent from the top level app when it gets key
+ // depresses relating to selection add (usually SHIFT) and
+ // selection copy (usually CONTROL)
+ //
+ void slotSetSelectAdd(bool value);
+ void slotSetSelectCopy(bool value);
+
+ void slotSetFineGrain(bool value);
+ void slotSetPencilOverExisting(bool value);
+
+ // Show and hige the splitting line on a Segment
+ //
+ void slotShowSplitLine(int x, int y);
+ void slotHideSplitLine();
+
+ void slotExternalWheelEvent(QWheelEvent*);
+
+ // TextFloat timer
+ void slotTextFloatTimeout();
+
+ void slotUpdateSegmentsDrawBuffer();
+ void slotUpdateSegmentsDrawBuffer(const QRect&);
+
+ void slotRefreshColourCache();
+
+ void slotNewMIDIRecordingSegment(Segment*);
+ void slotNewAudioRecordingSegment(Segment*);
+ // no longer used, see RosegardenGUIDoc::insertRecordedMidi
+// void slotRecordMIDISegmentUpdated(Segment*, timeT updatedFrom);
+ void slotStoppedRecording();
+
+ void slotUpdateSize();
+
+signals:
+ void editSegment(Segment*); // use default editor
+ void editSegmentNotation(Segment*);
+ void editSegmentMatrix(Segment*);
+ void editSegmentAudio(Segment*);
+ void editSegmentEventList(Segment*);
+ void audioSegmentAutoSplit(Segment*);
+ void editRepeat(Segment*, timeT);
+
+ void setPointerPosition(timeT);
+
+ void showContextHelp(const QString &);
+
+protected:
+ virtual bool event(QEvent *);
+
+ virtual void contentsMousePressEvent(QMouseEvent*);
+ virtual void contentsMouseReleaseEvent(QMouseEvent*);
+ virtual void contentsMouseDoubleClickEvent(QMouseEvent*);
+ virtual void contentsMouseMoveEvent(QMouseEvent*);
+
+ virtual void viewportPaintEvent(QPaintEvent*);
+ virtual void resizeEvent(QResizeEvent*);
+
+ virtual void enterEvent(QEvent *);
+ virtual void leaveEvent(QEvent *);
+
+ virtual void viewportPaintRect(QRect);
+
+ /**
+ * if something changed, returns true and sets rect accordingly
+ * sets 'scroll' if some scrolling occurred
+ */
+ bool checkScrollAndRefreshDrawBuffer(QRect &, bool& scroll);
+ void refreshSegmentsDrawBuffer(const QRect&);
+ void refreshArtifactsDrawBuffer(const QRect&);
+ void drawArea(QPainter * p, const QRect& rect);
+ void drawAreaAudioPreviews(QPainter * p, const QRect& rect);
+ void drawAreaArtifacts(QPainter * p, const QRect& rect);
+ void drawRect(const QRect& rect, QPainter * p, const QRect& clipRect,
+ bool isSelected = false, int intersectLvl = 0, bool fill = true);
+ void drawCompRect(const CompositionRect& r, QPainter *p, const QRect& clipRect,
+ int intersectLvl = 0, bool fill = true);
+ void drawCompRectLabel(const CompositionRect& r, QPainter *p, const QRect& clipRect);
+ void drawIntersections(const CompositionModel::rectcontainer&, QPainter * p, const QRect& clipRect);
+
+ void drawPointer(QPainter * p, const QRect& clipRect);
+ void drawGuides(QPainter * p, const QRect& clipRect);
+ void drawTextFloat(QPainter * p, const QRect& clipRect);
+
+ void initStepSize();
+ void releaseCurrentItem();
+
+ static QColor mixBrushes(QBrush a, QBrush b);
+
+ SegmentSelector* getSegmentSelectorTool();
+
+protected slots:
+ void slotSegmentsDrawBufferNeedsRefresh() {
+ m_segmentsDrawBufferRefresh =
+ QRect(contentsX(), contentsY(), visibleWidth(), visibleHeight());
+ }
+
+ void slotSegmentsDrawBufferNeedsRefresh(QRect r) {
+ m_segmentsDrawBufferRefresh |=
+ (QRect(contentsX(), contentsY(), visibleWidth(), visibleHeight())
+ & r);
+ }
+
+ void slotArtifactsDrawBufferNeedsRefresh() {
+ m_artifactsDrawBufferRefresh =
+ QRect(contentsX(), contentsY(), visibleWidth(), visibleHeight());
+ updateContents();
+ }
+
+ void slotArtifactsDrawBufferNeedsRefresh(QRect r) {
+ m_artifactsDrawBufferRefresh |=
+ (QRect(contentsX(), contentsY(), visibleWidth(), visibleHeight())
+ & r);
+ updateContents(r);
+ }
+
+ void slotAllDrawBuffersNeedRefresh() {
+ slotSegmentsDrawBufferNeedsRefresh();
+ slotArtifactsDrawBufferNeedsRefresh();
+ }
+
+ void slotAllDrawBuffersNeedRefresh(QRect r) {
+ slotSegmentsDrawBufferNeedsRefresh(r);
+ slotArtifactsDrawBufferNeedsRefresh(r);
+ }
+
+ void slotToolHelpChanged(const QString &);
+
+protected:
+
+ //--------------- Data members ---------------------------------
+
+ CompositionModel* m_model;
+ CompositionItem m_currentItem;
+
+ SegmentTool* m_tool;
+ SegmentToolBox* m_toolBox;
+
+ bool m_showPreviews;
+ bool m_showSegmentLabels;
+ bool m_fineGrain;
+ bool m_pencilOverExisting;
+
+ int m_minWidth;
+
+ int m_stepSize;
+ QColor m_rectFill;
+ QColor m_selectedRectFill;
+
+ int m_pointerPos;
+ QColor m_pointerColor;
+ int m_pointerWidth;
+ QPen m_pointerPen;
+
+ QRect m_tmpRect;
+ QColor m_tmpRectFill;
+ QPoint m_splitLinePos;
+
+ QColor m_trackDividerColor;
+
+ bool m_drawGuides;
+ QColor m_guideColor;
+ int m_topGuidePos;
+ int m_foreGuidePos;
+
+ bool m_drawSelectionRect;
+ QRect m_selectionRect;
+
+ bool m_drawTextFloat;
+ QString m_textFloatText;
+ QPoint m_textFloatPos;
+
+ QPixmap m_segmentsDrawBuffer;
+ QPixmap m_artifactsDrawBuffer;
+ QRect m_segmentsDrawBufferRefresh;
+ QRect m_artifactsDrawBufferRefresh;
+ int m_lastBufferRefreshX;
+ int m_lastBufferRefreshY;
+ int m_lastPointerRefreshX;
+ QPixmap m_backgroundPixmap;
+
+ QString m_toolContextHelp;
+ bool m_contextHelpShown;
+
+ mutable CompositionModel::AudioPreviewDrawData m_audioPreviewRects;
+ mutable CompositionModel::RectRanges m_notationPreviewRects;
+};
+
+
+}
+
+#endif
diff --git a/src/gui/editors/segment/segmentcanvas/PreviewRect.cpp b/src/gui/editors/segment/segmentcanvas/PreviewRect.cpp
new file mode 100644
index 0000000..fa09644
--- /dev/null
+++ b/src/gui/editors/segment/segmentcanvas/PreviewRect.cpp
@@ -0,0 +1,34 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "PreviewRect.h"
+
+#include <qcolor.h>
+#include <qrect.h>
+
+
+namespace Rosegarden
+{
+}
diff --git a/src/gui/editors/segment/segmentcanvas/PreviewRect.h b/src/gui/editors/segment/segmentcanvas/PreviewRect.h
new file mode 100644
index 0000000..59f3113
--- /dev/null
+++ b/src/gui/editors/segment/segmentcanvas/PreviewRect.h
@@ -0,0 +1,62 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_PREVIEWRECT_H_
+#define _RG_PREVIEWRECT_H_
+
+#include <qcolor.h>
+#include <qrect.h>
+#include <vector>
+
+
+
+
+namespace Rosegarden
+{
+
+
+
+class PreviewRect : public QRect {
+public:
+ PreviewRect(int left, int top, int width, int height) :
+ QRect(left, top, width, height) {};
+
+ PreviewRect(const QRect& r) :
+ QRect(r) {};
+
+ const QColor& getColor() const { return m_color; }
+ void setColor(QColor c) { m_color = c; }
+
+protected:
+ QColor m_color;
+};
+
+typedef std::vector<QImage> PixmapArray;
+
+
+
+}
+
+#endif
diff --git a/src/gui/editors/segment/segmentcanvas/SegmentEraser.cpp b/src/gui/editors/segment/segmentcanvas/SegmentEraser.cpp
new file mode 100644
index 0000000..3d1e26f
--- /dev/null
+++ b/src/gui/editors/segment/segmentcanvas/SegmentEraser.cpp
@@ -0,0 +1,88 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "SegmentEraser.h"
+
+#include "misc/Debug.h"
+#include "commands/segment/SegmentEraseCommand.h"
+#include "CompositionView.h"
+#include "CompositionItemImpl.h"
+#include "document/RosegardenGUIDoc.h"
+#include "gui/general/BaseTool.h"
+#include "gui/general/RosegardenCanvasView.h"
+#include "SegmentTool.h"
+#include <kcommand.h>
+#include <qpoint.h>
+#include <qstring.h>
+#include <klocale.h>
+
+
+namespace Rosegarden
+{
+
+SegmentEraser::SegmentEraser(CompositionView *c, RosegardenGUIDoc *d)
+ : SegmentTool(c, d)
+{
+ RG_DEBUG << "SegmentEraser()\n";
+}
+
+void SegmentEraser::ready()
+{
+ m_canvas->viewport()->setCursor(Qt::pointingHandCursor);
+ setBasicContextHelp();
+}
+
+void SegmentEraser::handleMouseButtonPress(QMouseEvent *e)
+{
+ setCurrentItem(m_canvas->getFirstItemAt(e->pos()));
+}
+
+void SegmentEraser::handleMouseButtonRelease(QMouseEvent*)
+{
+ if (m_currentItem) {
+ // no need to test the result, we know it's good (see handleMouseButtonPress)
+ CompositionItemImpl* item = dynamic_cast<CompositionItemImpl*>((_CompositionItem*)m_currentItem);
+
+ addCommandToHistory(new SegmentEraseCommand(item->getSegment()));
+ }
+
+ setCurrentItem(CompositionItem());
+}
+
+int SegmentEraser::handleMouseMove(QMouseEvent*)
+{
+ setBasicContextHelp();
+ return RosegardenCanvasView::NoFollow;
+}
+
+void SegmentEraser::setBasicContextHelp()
+{
+ setContextHelp(i18n("Click on a segment to delete it"));
+}
+
+const QString SegmentEraser::ToolName = "segmenteraser";
+
+}
+#include "SegmentEraser.moc"
diff --git a/src/gui/editors/segment/segmentcanvas/SegmentEraser.h b/src/gui/editors/segment/segmentcanvas/SegmentEraser.h
new file mode 100644
index 0000000..f428c28
--- /dev/null
+++ b/src/gui/editors/segment/segmentcanvas/SegmentEraser.h
@@ -0,0 +1,67 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_SEGMENTERASER_H_
+#define _RG_SEGMENTERASER_H_
+
+#include "SegmentTool.h"
+#include <qstring.h>
+
+
+class QMouseEvent;
+
+
+namespace Rosegarden
+{
+
+class RosegardenGUIDoc;
+class CompositionView;
+
+
+class SegmentEraser : public SegmentTool
+{
+ Q_OBJECT
+
+ friend class SegmentToolBox;
+
+public:
+
+ virtual void ready();
+
+ virtual void handleMouseButtonPress(QMouseEvent*);
+ virtual void handleMouseButtonRelease(QMouseEvent*);
+ virtual int handleMouseMove(QMouseEvent*);
+
+ static const QString ToolName;
+
+protected:
+ SegmentEraser(CompositionView*, RosegardenGUIDoc*);
+ void setBasicContextHelp();
+};
+
+
+}
+
+#endif
diff --git a/src/gui/editors/segment/segmentcanvas/SegmentItemPreview.cpp b/src/gui/editors/segment/segmentcanvas/SegmentItemPreview.cpp
new file mode 100644
index 0000000..f0c4598
--- /dev/null
+++ b/src/gui/editors/segment/segmentcanvas/SegmentItemPreview.cpp
@@ -0,0 +1,37 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "SegmentItemPreview.h"
+
+#include "base/RulerScale.h"
+#include "base/Segment.h"
+#include <qpainter.h>
+#include <qrect.h>
+#include <qwmatrix.h>
+
+
+namespace Rosegarden
+{
+}
diff --git a/src/gui/editors/segment/segmentcanvas/SegmentItemPreview.h b/src/gui/editors/segment/segmentcanvas/SegmentItemPreview.h
new file mode 100644
index 0000000..e190a5c
--- /dev/null
+++ b/src/gui/editors/segment/segmentcanvas/SegmentItemPreview.h
@@ -0,0 +1,91 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_SEGMENTITEMPREVIEW_H_
+#define _RG_SEGMENTITEMPREVIEW_H_
+
+#include <qrect.h>
+
+
+class QWMatrix;
+class QPainter;
+
+
+namespace Rosegarden
+{
+
+class Segment;
+class RulerScale;
+
+
+//////////////////////////////////////////////////////////////////////
+class SegmentItemPreview
+{
+public:
+ SegmentItemPreview(Segment& parent,
+ RulerScale* scale);
+ virtual ~SegmentItemPreview();
+
+ enum PreviewState {
+ PreviewChanged,
+ PreviewCalculating,
+ PreviewCurrent
+ };
+
+ virtual void drawShape(QPainter&) = 0;
+
+ PreviewState getPreviewState() const { return m_previewState; }
+
+ /**
+ * Sets whether the preview shape shown in the segment needs
+ * to be refreshed
+ */
+ void setPreviewCurrent(bool c)
+ { m_previewState = (c ? PreviewCurrent : PreviewChanged); }
+
+ /**
+ * Clears out the preview entirely so that it will be regenerated
+ * next time
+ */
+ virtual void clearPreview() = 0;
+
+ QRect rect();
+
+protected:
+ virtual void updatePreview(const QWMatrix &matrix) = 0;
+
+ //--------------- Data members ---------------------------------
+
+ Segment *m_segment;
+ RulerScale *m_rulerScale;
+
+ PreviewState m_previewState;
+};
+
+
+
+}
+
+#endif
diff --git a/src/gui/editors/segment/segmentcanvas/SegmentJoiner.cpp b/src/gui/editors/segment/segmentcanvas/SegmentJoiner.cpp
new file mode 100644
index 0000000..5129202
--- /dev/null
+++ b/src/gui/editors/segment/segmentcanvas/SegmentJoiner.cpp
@@ -0,0 +1,73 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "SegmentJoiner.h"
+
+#include "misc/Debug.h"
+#include "CompositionView.h"
+#include "document/RosegardenGUIDoc.h"
+#include "gui/general/BaseTool.h"
+#include "gui/general/RosegardenCanvasView.h"
+#include "SegmentTool.h"
+#include <kcommand.h>
+#include <qpoint.h>
+#include <qstring.h>
+#include <klocale.h>
+
+
+namespace Rosegarden
+{
+
+SegmentJoiner::SegmentJoiner(CompositionView *c, RosegardenGUIDoc *d)
+ : SegmentTool(c, d)
+{
+ RG_DEBUG << "SegmentJoiner() - not implemented\n";
+}
+
+SegmentJoiner::~SegmentJoiner()
+{}
+
+void
+SegmentJoiner::handleMouseButtonPress(QMouseEvent*)
+{}
+
+void
+SegmentJoiner::handleMouseButtonRelease(QMouseEvent*)
+{}
+
+int
+SegmentJoiner::handleMouseMove(QMouseEvent*)
+{
+ return RosegardenCanvasView::NoFollow;
+}
+
+void
+SegmentJoiner::contentsMouseDoubleClickEvent(QMouseEvent*)
+{}
+
+const QString SegmentJoiner::ToolName = "segmentjoiner";
+
+}
+#include "SegmentJoiner.moc"
diff --git a/src/gui/editors/segment/segmentcanvas/SegmentJoiner.h b/src/gui/editors/segment/segmentcanvas/SegmentJoiner.h
new file mode 100644
index 0000000..2c83a26
--- /dev/null
+++ b/src/gui/editors/segment/segmentcanvas/SegmentJoiner.h
@@ -0,0 +1,70 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_SEGMENTJOINER_H_
+#define _RG_SEGMENTJOINER_H_
+
+#include "SegmentTool.h"
+#include <qstring.h>
+
+
+class QMouseEvent;
+
+
+namespace Rosegarden
+{
+
+class RosegardenGUIDoc;
+class CompositionView;
+
+
+class SegmentJoiner : public SegmentTool
+{
+ Q_OBJECT
+
+ friend class SegmentToolBox;
+
+public:
+
+ virtual ~SegmentJoiner();
+
+ virtual void handleMouseButtonPress(QMouseEvent*);
+ virtual void handleMouseButtonRelease(QMouseEvent*);
+ virtual int handleMouseMove(QMouseEvent*);
+
+ // don't do double clicks
+ virtual void contentsMouseDoubleClickEvent(QMouseEvent*);
+
+ static const QString ToolName;
+
+protected:
+ SegmentJoiner(CompositionView*, RosegardenGUIDoc*);
+};
+
+
+
+}
+
+#endif
diff --git a/src/gui/editors/segment/segmentcanvas/SegmentMover.cpp b/src/gui/editors/segment/segmentcanvas/SegmentMover.cpp
new file mode 100644
index 0000000..a3d2a59
--- /dev/null
+++ b/src/gui/editors/segment/segmentcanvas/SegmentMover.cpp
@@ -0,0 +1,348 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "SegmentMover.h"
+
+#include "base/Event.h"
+#include <klocale.h>
+#include "misc/Debug.h"
+#include "base/Composition.h"
+#include "base/RealTime.h"
+#include "base/Track.h"
+#include "base/SnapGrid.h"
+#include "commands/segment/SegmentReconfigureCommand.h"
+#include "CompositionItemHelper.h"
+#include "CompositionModel.h"
+#include "CompositionView.h"
+#include "document/RosegardenGUIDoc.h"
+#include "gui/general/BaseTool.h"
+#include "gui/general/RosegardenCanvasView.h"
+#include "SegmentTool.h"
+#include "SegmentToolBox.h"
+#include "SegmentSelector.h"
+#include <kcommand.h>
+#include <qcursor.h>
+#include <qevent.h>
+#include <qpoint.h>
+#include <qrect.h>
+#include <qstring.h>
+#include <klocale.h>
+
+
+namespace Rosegarden
+{
+
+SegmentMover::SegmentMover(CompositionView *c, RosegardenGUIDoc *d)
+ : SegmentTool(c, d)
+{
+ RG_DEBUG << "SegmentMover()\n";
+}
+
+void SegmentMover::ready()
+{
+ m_canvas->viewport()->setCursor(Qt::sizeAllCursor);
+ connect(m_canvas, SIGNAL(contentsMoving (int, int)),
+ this, SLOT(slotCanvasScrolled(int, int)));
+ setBasicContextHelp();
+}
+
+void SegmentMover::stow()
+{
+ disconnect(m_canvas, SIGNAL(contentsMoving (int, int)),
+ this, SLOT(slotCanvasScrolled(int, int)));
+}
+
+void SegmentMover::slotCanvasScrolled(int newX, int newY)
+{
+ QMouseEvent tmpEvent(QEvent::MouseMove,
+ m_canvas->viewport()->mapFromGlobal(QCursor::pos()) + QPoint(newX, newY),
+ Qt::NoButton, Qt::NoButton);
+ handleMouseMove(&tmpEvent);
+}
+
+void SegmentMover::handleMouseButtonPress(QMouseEvent *e)
+{
+ CompositionItem item = m_canvas->getFirstItemAt(e->pos());
+ SegmentSelector* selector = dynamic_cast<SegmentSelector*>
+ (getToolBox()->getTool("segmentselector"));
+
+ // #1027303: Segment move issue
+ // Clear selection if we're clicking on an item that's not in it
+ // and we're not in add mode
+
+ if (selector && item &&
+ !m_canvas->getModel()->isSelected(item) && !selector->isSegmentAdding()) {
+ m_canvas->getModel()->clearSelected();
+ m_canvas->getModel()->signalSelection();
+ m_canvas->updateContents();
+ }
+
+ if (item) {
+
+ setCurrentItem(item);
+ m_clickPoint = e->pos();
+ Segment* s = CompositionItemHelper::getSegment(m_currentItem);
+
+ int x = int(m_canvas->grid().getRulerScale()->getXForTime(s->getStartTime()));
+ int y = int(m_canvas->grid().getYBinCoordinate(s->getTrack()));
+
+ m_canvas->setGuidesPos(x, y);
+ m_canvas->setDrawGuides(true);
+
+ if (m_canvas->getModel()->haveSelection()) {
+ RG_DEBUG << "SegmentMover::handleMouseButtonPress() : haveSelection\n";
+ // startChange on all selected segments
+ m_canvas->getModel()->startChangeSelection(CompositionModel::ChangeMove);
+
+
+ CompositionModel::itemcontainer& changingItems = m_canvas->getModel()->getChangingItems();
+ // set m_currentItem to its "sibling" among selected (now moving) items
+ setCurrentItem(CompositionItemHelper::findSiblingCompositionItem(changingItems, m_currentItem));
+
+ } else {
+ RG_DEBUG << "SegmentMover::handleMouseButtonPress() : no selection\n";
+ m_canvas->getModel()->startChange(item, CompositionModel::ChangeMove);
+ }
+
+ m_canvas->updateContents();
+
+ m_passedInertiaEdge = false;
+
+ } else {
+
+ // check for addmode - clear the selection if not
+ RG_DEBUG << "SegmentMover::handleMouseButtonPress() : clear selection\n";
+ m_canvas->getModel()->clearSelected();
+ m_canvas->getModel()->signalSelection();
+ m_canvas->updateContents();
+ }
+
+}
+
+void SegmentMover::handleMouseButtonRelease(QMouseEvent *e)
+{
+ Composition &comp = m_doc->getComposition();
+
+ int startDragTrackPos = m_canvas->grid().getYBin(m_clickPoint.y());
+ int currentTrackPos = m_canvas->grid().getYBin(e->pos().y());
+ int trackDiff = currentTrackPos - startDragTrackPos;
+
+ if (m_currentItem) {
+
+ if (changeMade()) {
+
+ CompositionModel::itemcontainer& changingItems = m_canvas->getModel()->getChangingItems();
+
+ SegmentReconfigureCommand *command =
+ new SegmentReconfigureCommand
+ (changingItems.size() == 1 ? i18n("Move Segment") : i18n("Move Segments"));
+
+
+ CompositionModel::itemcontainer::iterator it;
+
+ for (it = changingItems.begin();
+ it != changingItems.end();
+ it++) {
+
+ CompositionItem item = *it;
+
+ Segment* segment = CompositionItemHelper::getSegment(item);
+
+ TrackId origTrackId = segment->getTrack();
+ int trackPos = comp.getTrackPositionById(origTrackId);
+ trackPos += trackDiff;
+
+ if (trackPos < 0) {
+ trackPos = 0;
+ } else if (trackPos >= comp.getNbTracks()) {
+ trackPos = comp.getNbTracks() - 1;
+ }
+
+ Track *newTrack = comp.getTrackByPosition(trackPos);
+ int newTrackId = origTrackId;
+ if (newTrack) newTrackId = newTrack->getId();
+
+ timeT newStartTime = CompositionItemHelper::getStartTime(item, m_canvas->grid());
+
+ // We absolutely don't want to snap the end time
+ // to the grid. We want it to remain exactly the same
+ // as it was, but relative to the new start time.
+ timeT newEndTime = newStartTime + segment->getEndMarkerTime()
+ - segment->getStartTime();
+
+ command->addSegment(segment,
+ newStartTime,
+ newEndTime,
+ newTrackId);
+ }
+
+ addCommandToHistory(command);
+ }
+
+ m_canvas->hideTextFloat();
+ m_canvas->setDrawGuides(false);
+ m_canvas->getModel()->endChange();
+ m_canvas->slotUpdateSegmentsDrawBuffer();
+
+ }
+
+ setChangeMade(false);
+ m_currentItem = CompositionItem();
+
+ setBasicContextHelp();
+}
+
+int SegmentMover::handleMouseMove(QMouseEvent *e)
+{
+ m_canvas->setSnapGrain(true);
+
+ Composition &comp = m_doc->getComposition();
+
+ if (!m_currentItem) {
+ setBasicContextHelp();
+ return RosegardenCanvasView::NoFollow;
+ }
+
+ if (!m_canvas->isFineGrain()) {
+ setContextHelp(i18n("Hold Shift to avoid snapping to beat grid"));
+ } else {
+ clearContextHelp();
+ }
+
+ CompositionModel::itemcontainer& changingItems = m_canvas->getModel()->getChangingItems();
+
+ // RG_DEBUG << "SegmentMover::handleMouseMove : nb changingItems = "
+ // << changingItems.size() << endl;
+
+ CompositionModel::itemcontainer::iterator it;
+ int guideX = 0;
+ int guideY = 0;
+ QRect updateRect;
+
+ for (it = changingItems.begin();
+ it != changingItems.end();
+ it++) {
+ // it->second->showRepeatRect(false);
+
+ int dx = e->pos().x() - m_clickPoint.x(),
+ dy = e->pos().y() - m_clickPoint.y();
+
+ const int inertiaDistance = m_canvas->grid().getYSnap() / 3;
+ if (!m_passedInertiaEdge &&
+ (dx < inertiaDistance && dx > -inertiaDistance) &&
+ (dy < inertiaDistance && dy > -inertiaDistance)) {
+ return RosegardenCanvasView::NoFollow;
+ } else {
+ m_passedInertiaEdge = true;
+ }
+
+ timeT newStartTime = m_canvas->grid().snapX((*it)->savedRect().x() + dx);
+
+ int newX = int(m_canvas->grid().getRulerScale()->getXForTime(newStartTime));
+
+ int startDragTrackPos = m_canvas->grid().getYBin(m_clickPoint.y());
+ int currentTrackPos = m_canvas->grid().getYBin(e->pos().y());
+ int trackDiff = currentTrackPos - startDragTrackPos;
+ int trackPos = m_canvas->grid().getYBin((*it)->savedRect().y());
+
+// std::cerr << "segment " << *it << ": mouse started at track " << startDragTrackPos << ", is now at " << currentTrackPos << ", trackPos from " << trackPos << " to ";
+
+ trackPos += trackDiff;
+
+// std::cerr << trackPos << std::endl;
+
+ if (trackPos < 0) {
+ trackPos = 0;
+ } else if (trackPos >= comp.getNbTracks()) {
+ trackPos = comp.getNbTracks() - 1;
+ }
+/*!!!
+ int newY = m_canvas->grid().snapY((*it)->savedRect().y() + dy);
+ // Make sure we don't set a non-existing track
+ if (newY < 0) {
+ newY = 0;
+ }
+ int trackPos = m_canvas->grid().getYBin(newY);
+
+ // RG_DEBUG << "SegmentMover::handleMouseMove: orig y "
+ // << (*it)->savedRect().y()
+ // << ", dy " << dy << ", newY " << newY
+ // << ", track " << track << endl;
+
+ // Make sure we don't set a non-existing track (c'td)
+ // TODO: make this suck less. Either the tool should
+ // not allow it in the first place, or we automatically
+ // create new tracks - might make undo very tricky though
+ //
+ if (trackPos >= comp.getNbTracks())
+ trackPos = comp.getNbTracks() - 1;
+*/
+ int newY = m_canvas->grid().getYBinCoordinate(trackPos);
+
+ // RG_DEBUG << "SegmentMover::handleMouseMove: moving to "
+ // << newX << "," << newY << endl;
+
+ updateRect |= (*it)->rect();
+ (*it)->moveTo(newX, newY);
+ updateRect |= (*it)->rect();
+ setChangeMade(true);
+ }
+
+ if (changeMade())
+ m_canvas->getModel()->signalContentChange();
+
+ guideX = m_currentItem->rect().x();
+ guideY = m_currentItem->rect().y();
+
+ m_canvas->setGuidesPos(guideX, guideY);
+
+ timeT currentItemStartTime = m_canvas->grid().snapX(m_currentItem->rect().x());
+
+ RealTime time = comp.getElapsedRealTime(currentItemStartTime);
+ QString ms;
+ ms.sprintf("%03d", time.msec());
+
+ int bar, beat, fraction, remainder;
+ comp.getMusicalTimeForAbsoluteTime(currentItemStartTime, bar, beat, fraction, remainder);
+
+ QString posString = QString("%1.%2s (%3, %4, %5)")
+ .arg(time.sec).arg(ms)
+ .arg(bar + 1).arg(beat).arg(fraction);
+
+ m_canvas->setTextFloat(guideX + 10, guideY - 30, posString);
+ m_canvas->updateContents();
+
+ return RosegardenCanvasView::FollowHorizontal | RosegardenCanvasView::FollowVertical;
+}
+
+void SegmentMover::setBasicContextHelp()
+{
+ setContextHelp(i18n("Click and drag to move a segment"));
+}
+
+const QString SegmentMover::ToolName = "segmentmover";
+
+}
+#include "SegmentMover.moc"
diff --git a/src/gui/editors/segment/segmentcanvas/SegmentMover.h b/src/gui/editors/segment/segmentcanvas/SegmentMover.h
new file mode 100644
index 0000000..776189e
--- /dev/null
+++ b/src/gui/editors/segment/segmentcanvas/SegmentMover.h
@@ -0,0 +1,78 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_SEGMENTMOVER_H_
+#define _RG_SEGMENTMOVER_H_
+
+#include "SegmentTool.h"
+#include <qpoint.h>
+#include <qstring.h>
+
+
+class QMouseEvent;
+
+
+namespace Rosegarden
+{
+
+class RosegardenGUIDoc;
+class CompositionView;
+
+
+class SegmentMover : public SegmentTool
+{
+ Q_OBJECT
+
+ friend class SegmentToolBox;
+
+public:
+
+ virtual void ready();
+ virtual void stow();
+
+ virtual void handleMouseButtonPress(QMouseEvent*);
+ virtual void handleMouseButtonRelease(QMouseEvent*);
+ virtual int handleMouseMove(QMouseEvent*);
+
+ static const QString ToolName;
+
+protected slots:
+ void slotCanvasScrolled(int newX, int newY);
+
+protected:
+ SegmentMover(CompositionView*, RosegardenGUIDoc*);
+
+ void setBasicContextHelp();
+
+ //--------------- Data members ---------------------------------
+
+ QPoint m_clickPoint;
+ bool m_passedInertiaEdge;
+};
+
+
+}
+
+#endif
diff --git a/src/gui/editors/segment/segmentcanvas/SegmentOrderer.cpp b/src/gui/editors/segment/segmentcanvas/SegmentOrderer.cpp
new file mode 100644
index 0000000..4262eb9
--- /dev/null
+++ b/src/gui/editors/segment/segmentcanvas/SegmentOrderer.cpp
@@ -0,0 +1,48 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "SegmentOrderer.h"
+
+#include "misc/Debug.h"
+#include "base/Composition.h"
+#include "base/Segment.h"
+#include <klocale.h>
+
+
+namespace Rosegarden
+{
+
+void SegmentOrderer::segmentClicked(const Segment* s)
+{
+ m_segmentZs[s] = ++m_currentMaxZ;
+ RG_DEBUG << "SegmentOrderer::segmentClicked() s = " << s << " - max Z = " << m_currentMaxZ << endl;
+}
+
+unsigned int SegmentOrderer::getZForSegment(const Rosegarden::Segment* s)
+{
+ return m_segmentZs[s];
+}
+
+}
diff --git a/src/gui/editors/segment/segmentcanvas/SegmentOrderer.h b/src/gui/editors/segment/segmentcanvas/SegmentOrderer.h
new file mode 100644
index 0000000..f4b3d9a
--- /dev/null
+++ b/src/gui/editors/segment/segmentcanvas/SegmentOrderer.h
@@ -0,0 +1,59 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_SEGMENTORDERER_H_
+#define _RG_SEGMENTORDERER_H_
+
+#include "base/Composition.h"
+#include <map>
+
+
+
+
+namespace Rosegarden
+{
+
+class Segment;
+
+
+class SegmentOrderer : public CompositionObserver {
+public:
+ SegmentOrderer() : m_currentMaxZ(0) {};
+
+ unsigned int getZForSegment(const Segment*);
+
+ void segmentClicked(const Segment *);
+
+protected:
+
+ //--------------- Data members ---------------------------------
+ std::map<const Segment*, unsigned int> m_segmentZs;
+ unsigned int m_currentMaxZ;
+};
+
+
+}
+
+#endif
diff --git a/src/gui/editors/segment/segmentcanvas/SegmentPencil.cpp b/src/gui/editors/segment/segmentcanvas/SegmentPencil.cpp
new file mode 100644
index 0000000..68ca020
--- /dev/null
+++ b/src/gui/editors/segment/segmentcanvas/SegmentPencil.cpp
@@ -0,0 +1,295 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "SegmentPencil.h"
+
+#include "misc/Debug.h"
+#include "misc/Strings.h"
+#include "gui/general/ClefIndex.h"
+#include "base/NotationTypes.h"
+#include "base/Segment.h"
+#include "base/SnapGrid.h"
+#include "base/Track.h"
+#include "commands/segment/SegmentInsertCommand.h"
+#include "CompositionItemHelper.h"
+#include "CompositionView.h"
+#include "document/RosegardenGUIDoc.h"
+#include "gui/general/BaseTool.h"
+#include "gui/general/GUIPalette.h"
+#include "gui/general/RosegardenCanvasView.h"
+#include "SegmentTool.h"
+#include <kcommand.h>
+#include <klocale.h>
+#include <qcursor.h>
+#include <qevent.h>
+#include <qpoint.h>
+#include <qrect.h>
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+SegmentPencil::SegmentPencil(CompositionView *c, RosegardenGUIDoc *d)
+ : SegmentTool(c, d),
+ m_newRect(false),
+ m_track(0),
+ m_startTime(0),
+ m_endTime(0)
+{
+ RG_DEBUG << "SegmentPencil()\n";
+}
+
+void SegmentPencil::ready()
+{
+ m_canvas->viewport()->setCursor(Qt::ibeamCursor);
+ connect(m_canvas, SIGNAL(contentsMoving (int, int)),
+ this, SLOT(slotCanvasScrolled(int, int)));
+ setContextHelpFor(QPoint(0, 0));
+}
+
+void SegmentPencil::stow()
+{
+ disconnect(m_canvas, SIGNAL(contentsMoving (int, int)),
+ this, SLOT(slotCanvasScrolled(int, int)));
+}
+
+void SegmentPencil::slotCanvasScrolled(int newX, int newY)
+{
+ QMouseEvent tmpEvent(QEvent::MouseMove,
+ m_canvas->viewport()->mapFromGlobal(QCursor::pos()) + QPoint(newX, newY),
+ Qt::NoButton, Qt::NoButton);
+ handleMouseMove(&tmpEvent);
+}
+
+void SegmentPencil::handleMouseButtonPress(QMouseEvent *e)
+{
+ if (e->button() == RightButton)
+ return;
+
+ // is user holding Ctrl+Alt? (ugly, but we are running short on available
+ // modifiers; Alt is grabbed by the window manager, and right clicking, my
+ // (dmm) original idea, is grabbed by the context menu, so let's see how
+ // this goes over
+ bool pencilAnyway = (m_canvas->pencilOverExisting());
+
+ m_newRect = false;
+
+ // Check if mouse click was on a rect
+ //
+ CompositionItem item = m_canvas->getFirstItemAt(e->pos());
+
+ // If user clicked a rect, and pencilAnyway is false, then there's nothing
+ // left to do here
+ if (item) {
+ delete item;
+ if (!pencilAnyway) return ;
+ }
+
+ // make new item
+ //
+ m_canvas->setSnapGrain(false);
+
+ int trackPosition = m_canvas->grid().getYBin(e->pos().y());
+
+ // Don't do anything if the user clicked beyond the track buttons
+ //
+ if (trackPosition >= m_doc->getComposition().getNbTracks())
+ return ;
+
+ Track *t = m_doc->getComposition().getTrackByPosition(trackPosition);
+ if (!t)
+ return ;
+
+ TrackId trackId = t->getId();
+
+ timeT time = int(nearbyint(m_canvas->grid().snapX(e->pos().x(), SnapGrid::SnapLeft)));
+ timeT duration = int(nearbyint(m_canvas->grid().getSnapTime(double(e->pos().x()))));
+ if (duration == 0)
+ duration = Note(Note::Shortest).getDuration();
+
+ int multiple = m_doc->getComposition()
+ .getMaxContemporaneousSegmentsOnTrack(trackId);
+ if (multiple < 1) multiple = 1;
+
+ QRect tmpRect;
+ tmpRect.setX(int(nearbyint(m_canvas->grid().getRulerScale()->getXForTime(time))));
+ tmpRect.setY(m_canvas->grid().getYBinCoordinate(trackPosition) + 1);
+ tmpRect.setHeight(m_canvas->grid().getYSnap() * multiple - 2);
+ tmpRect.setWidth(int(nearbyint(m_canvas->grid().getRulerScale()->getWidthForDuration(time, duration))));
+
+ m_canvas->setTmpRect(tmpRect,
+ GUIPalette::convertColour
+ (m_doc->getComposition().getSegmentColourMap().
+ getColourByIndex(t->getColor())));
+
+ m_newRect = true;
+ m_origPos = e->pos();
+
+ m_canvas->updateContents(tmpRect);
+}
+
+void SegmentPencil::handleMouseButtonRelease(QMouseEvent* e)
+{
+ if (e->button() == RightButton)
+ return ;
+
+ setContextHelpFor(e->pos());
+
+ if (m_newRect) {
+
+ QRect tmpRect = m_canvas->getTmpRect();
+
+ int trackPosition = m_canvas->grid().getYBin(tmpRect.y());
+ Track *track = m_doc->getComposition().getTrackByPosition(trackPosition);
+ timeT startTime = int(nearbyint(m_canvas->grid().getRulerScale()->getTimeForX(tmpRect.x()))),
+ endTime = int(nearbyint(m_canvas->grid().getRulerScale()->getTimeForX(tmpRect.x() + tmpRect.width())));
+
+ // RG_DEBUG << "SegmentPencil::handleMouseButtonRelease() : new segment with track id "
+ // << track->getId() << endl;
+
+ SegmentInsertCommand *command =
+ new SegmentInsertCommand(m_doc, track->getId(),
+ startTime, endTime);
+
+ m_newRect = false;
+
+ addCommandToHistory(command);
+
+ // add the SegmentItem by hand, instead of allowing the usual
+ // update mechanism to spot it. This way we can select the
+ // segment as we add it; otherwise we'd have no way to know
+ // that the segment was created by this tool rather than by
+ // e.g. a simple file load
+
+ Segment *segment = command->getSegment();
+
+ // add a clef to the start of the segment (tracks initialize to a
+ // default of 0 for this property, so treble will be the default if it
+ // is not specified elsewhere)
+ segment->insert(clefIndexToClef(track->getClef()).getAsEvent
+ (segment->getStartTime()));
+ segment->setTranspose(track->getTranspose());
+ segment->setColourIndex(track->getColor());
+ segment->setLowestPlayable(track->getLowestPlayable());
+ segment->setHighestPlayable(track->getHighestPlayable());
+
+ std::string label = qstrtostr(track->getPresetLabel());
+ if (label != "") {
+ segment->setLabel(qstrtostr(track->getPresetLabel()));
+ }
+
+ CompositionItem item = CompositionItemHelper::makeCompositionItem(segment);
+ m_canvas->getModel()->clearSelected();
+ m_canvas->getModel()->setSelected(item);
+ m_canvas->getModel()->signalSelection();
+ m_canvas->setTmpRect(QRect());
+ m_canvas->slotUpdateSegmentsDrawBuffer();
+
+ } else {
+
+ m_newRect = false;
+ }
+}
+
+int SegmentPencil::handleMouseMove(QMouseEvent *e)
+{
+ if (!m_newRect) {
+ setContextHelpFor(e->pos());
+ return RosegardenCanvasView::NoFollow;
+ }
+
+ if (!m_canvas->isFineGrain()) {
+ setContextHelp(i18n("Hold Shift to avoid snapping to bar lines"));
+ } else {
+ clearContextHelp();
+ }
+
+ QRect tmpRect = m_canvas->getTmpRect();
+ QRect oldTmpRect = tmpRect;
+
+ m_canvas->setSnapGrain(false);
+
+ SnapGrid::SnapDirection direction = SnapGrid::SnapRight;
+ if (e->pos().x() <= m_origPos.x())
+ direction = SnapGrid::SnapLeft;
+
+ timeT snap = int(nearbyint(m_canvas->grid().getSnapTime(double(e->pos().x()))));
+ if (snap == 0)
+ snap = Note(Note::Shortest).getDuration();
+
+ timeT time = int(nearbyint(m_canvas->grid().snapX(e->pos().x(), direction)));
+
+ timeT startTime = int(nearbyint(m_canvas->grid().getRulerScale()->getTimeForX(tmpRect.x())));
+ timeT endTime = int(nearbyint(m_canvas->grid().getRulerScale()->getTimeForX(tmpRect.x() + tmpRect.width())));
+
+ if (direction == SnapGrid::SnapRight) {
+
+ if (time >= startTime) {
+ if ((time - startTime) < snap) {
+ time = startTime + snap;
+ }
+ } else {
+ if ((startTime - time) < snap) {
+ time = startTime - snap;
+ }
+ }
+
+ int w = int(nearbyint(m_canvas->grid().getRulerScale()->getWidthForDuration(startTime, time - startTime)));
+ tmpRect.setWidth(w);
+
+ } else { // SnapGrid::SnapLeft
+
+ // time += std::max(endTime - startTime, timeT(0));
+ tmpRect.setX(int(m_canvas->grid().getRulerScale()->getXForTime(time)));
+
+ }
+
+ m_canvas->setTmpRect(tmpRect);
+ return RosegardenCanvasView::FollowHorizontal;
+}
+
+void SegmentPencil::setContextHelpFor(QPoint p)
+{
+ int trackPosition = m_canvas->grid().getYBin(p.y());
+
+ if (trackPosition < m_doc->getComposition().getNbTracks()) {
+ Track *t = m_doc->getComposition().getTrackByPosition(trackPosition);
+ if (t) {
+ InstrumentId id = t->getInstrument();
+ if (id >= AudioInstrumentBase && id < MidiInstrumentBase) {
+ setContextHelp(i18n("Record or drop audio here"));
+ return;
+ }
+ }
+ }
+
+ setContextHelp(i18n("Click and drag to draw an empty segment. Control+Alt click and drag to draw in overlap mode."));
+}
+
+const QString SegmentPencil::ToolName = "segmentpencil";
+
+}
+#include "SegmentPencil.moc"
diff --git a/src/gui/editors/segment/segmentcanvas/SegmentPencil.h b/src/gui/editors/segment/segmentcanvas/SegmentPencil.h
new file mode 100644
index 0000000..8b55917
--- /dev/null
+++ b/src/gui/editors/segment/segmentcanvas/SegmentPencil.h
@@ -0,0 +1,83 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_SEGMENTPENCIL_H_
+#define _RG_SEGMENTPENCIL_H_
+
+#include "base/Track.h"
+#include "SegmentTool.h"
+#include <qstring.h>
+#include "base/Event.h"
+
+
+class QMouseEvent;
+
+
+namespace Rosegarden
+{
+
+class RosegardenGUIDoc;
+class CompositionView;
+
+
+//////////////////////////////
+
+class SegmentPencil : public SegmentTool
+{
+ Q_OBJECT
+
+ friend class SegmentToolBox;
+ friend class SegmentSelector;
+
+public:
+
+ virtual void ready();
+ virtual void stow();
+
+ virtual void handleMouseButtonPress(QMouseEvent*);
+ virtual void handleMouseButtonRelease(QMouseEvent*);
+ virtual int handleMouseMove(QMouseEvent*);
+
+ static const QString ToolName;
+
+protected slots:
+ void slotCanvasScrolled(int newX, int newY);
+
+protected:
+ SegmentPencil(CompositionView*, RosegardenGUIDoc*);
+ void setContextHelpFor(QPoint p);
+
+ //--------------- Data members ---------------------------------
+
+ bool m_newRect;
+ TrackId m_track;
+ timeT m_startTime;
+ timeT m_endTime;
+};
+
+
+}
+
+#endif
diff --git a/src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp b/src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp
new file mode 100644
index 0000000..6ae7433
--- /dev/null
+++ b/src/gui/editors/segment/segmentcanvas/SegmentResizer.cpp
@@ -0,0 +1,393 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "SegmentResizer.h"
+
+#include "base/Event.h"
+#include <klocale.h>
+#include "misc/Debug.h"
+#include "base/Composition.h"
+#include "base/NotationTypes.h"
+#include "base/Segment.h"
+#include "base/Track.h"
+#include "base/SnapGrid.h"
+#include "commands/segment/AudioSegmentResizeFromStartCommand.h"
+#include "commands/segment/AudioSegmentRescaleCommand.h"
+#include "commands/segment/SegmentRescaleCommand.h"
+#include "commands/segment/SegmentReconfigureCommand.h"
+#include "commands/segment/SegmentResizeFromStartCommand.h"
+#include "CompositionItemHelper.h"
+#include "CompositionModel.h"
+#include "CompositionView.h"
+#include "document/RosegardenGUIDoc.h"
+#include "gui/general/BaseTool.h"
+#include "gui/application/RosegardenGUIApp.h"
+#include "gui/general/RosegardenCanvasView.h"
+#include "gui/widgets/ProgressDialog.h"
+#include "SegmentTool.h"
+#include <kcommand.h>
+#include <kmessagebox.h>
+#include <qcursor.h>
+#include <qevent.h>
+#include <qpoint.h>
+#include <qrect.h>
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+SegmentResizer::SegmentResizer(CompositionView *c, RosegardenGUIDoc *d,
+ int edgeThreshold)
+ : SegmentTool(c, d),
+ m_edgeThreshold(edgeThreshold)
+{
+ RG_DEBUG << "SegmentResizer()\n";
+}
+
+void SegmentResizer::ready()
+{
+ m_canvas->viewport()->setCursor(Qt::sizeHorCursor);
+ connect(m_canvas, SIGNAL(contentsMoving (int, int)),
+ this, SLOT(slotCanvasScrolled(int, int)));
+ setBasicContextHelp(false);
+}
+
+void SegmentResizer::stow()
+{
+ disconnect(m_canvas, SIGNAL(contentsMoving (int, int)),
+ this, SLOT(slotCanvasScrolled(int, int)));
+}
+
+void SegmentResizer::slotCanvasScrolled(int newX, int newY)
+{
+ QMouseEvent tmpEvent(QEvent::MouseMove,
+ m_canvas->viewport()->mapFromGlobal(QCursor::pos()) + QPoint(newX, newY),
+ Qt::NoButton, Qt::NoButton);
+ handleMouseMove(&tmpEvent);
+}
+
+void SegmentResizer::handleMouseButtonPress(QMouseEvent *e)
+{
+ RG_DEBUG << "SegmentResizer::handleMouseButtonPress" << endl;
+ m_canvas->getModel()->clearSelected();
+
+ CompositionItem item = m_canvas->getFirstItemAt(e->pos());
+
+ if (item) {
+ RG_DEBUG << "SegmentResizer::handleMouseButtonPress - got item" << endl;
+ setCurrentItem(item);
+
+ // Are we resizing from start or end?
+ if (item->rect().x() + item->rect().width() / 2 > e->pos().x()) {
+ m_resizeStart = true;
+ } else {
+ m_resizeStart = false;
+ }
+
+ m_canvas->getModel()->startChange(item, m_resizeStart ? CompositionModel::ChangeResizeFromStart : CompositionModel::ChangeResizeFromEnd);
+
+ }
+}
+
+void SegmentResizer::handleMouseButtonRelease(QMouseEvent *e)
+{
+ RG_DEBUG << "SegmentResizer::handleMouseButtonRelease" << endl;
+
+ bool rescale = (e->state() & Qt::ControlButton);
+
+ if (m_currentItem) {
+
+ Segment* segment = CompositionItemHelper::getSegment(m_currentItem);
+
+ // We only want to snap the end that we were actually resizing.
+
+ timeT oldStartTime, oldEndTime;
+
+ oldStartTime = segment->getStartTime();
+ oldEndTime = segment->getEndMarkerTime();
+
+ timeT newStartTime, newEndTime;
+
+ if (m_resizeStart) {
+ newStartTime = CompositionItemHelper::getStartTime
+ (m_currentItem, m_canvas->grid());
+ newEndTime = oldEndTime;
+ } else {
+ newEndTime = CompositionItemHelper::getEndTime
+ (m_currentItem, m_canvas->grid());
+ newStartTime = oldStartTime;
+ }
+
+ if (changeMade()) {
+
+ if (newStartTime > newEndTime) std::swap(newStartTime, newEndTime);
+
+ if (rescale) {
+
+ if (segment->getType() == Segment::Audio) {
+
+ try {
+ m_doc->getAudioFileManager().testAudioPath();
+ } catch (AudioFileManager::BadAudioPathException) {
+ if (KMessageBox::warningContinueCancel
+ (0,
+ i18n("The audio file path does not exist or is not writable.\nYou must set the audio file path to a valid directory in Document Properties before rescaling an audio file.\nWould you like to set it now?"),
+ i18n("Warning"),
+ i18n("Set audio file path")) == KMessageBox::Continue) {
+ RosegardenGUIApp::self()->slotOpenAudioPathSettings();
+ }
+ }
+
+ float ratio = float(newEndTime - newStartTime) /
+ float(oldEndTime - oldStartTime);
+
+ AudioSegmentRescaleCommand *command =
+ new AudioSegmentRescaleCommand(m_doc, segment, ratio,
+ newStartTime, newEndTime);
+
+ ProgressDialog progressDlg
+ (i18n("Rescaling audio file..."), 100, 0);
+ progressDlg.setAutoClose(false);
+ progressDlg.setAutoReset(false);
+ progressDlg.show();
+ command->connectProgressDialog(&progressDlg);
+
+ addCommandToHistory(command);
+
+ progressDlg.setLabel(i18n("Generating audio preview..."));
+ command->disconnectProgressDialog(&progressDlg);
+ connect(&m_doc->getAudioFileManager(), SIGNAL(setProgress(int)),
+ progressDlg.progressBar(), SLOT(setValue(int)));
+ connect(&progressDlg, SIGNAL(cancelClicked()),
+ &m_doc->getAudioFileManager(), SLOT(slotStopPreview()));
+
+ int fid = command->getNewAudioFileId();
+ if (fid >= 0) {
+ RosegardenGUIApp::self()->slotAddAudioFile(fid);
+ m_doc->getAudioFileManager().generatePreview(fid);
+ }
+
+ } else {
+
+ SegmentRescaleCommand *command =
+ new SegmentRescaleCommand(segment,
+ newEndTime - newStartTime,
+ oldEndTime - oldStartTime,
+ newStartTime);
+ addCommandToHistory(command);
+ }
+ } else {
+
+ if (m_resizeStart) {
+
+ if (segment->getType() == Segment::Audio) {
+ addCommandToHistory(new AudioSegmentResizeFromStartCommand
+ (segment, newStartTime));
+ } else {
+ addCommandToHistory(new SegmentResizeFromStartCommand
+ (segment, newStartTime));
+ }
+
+ } else {
+
+ SegmentReconfigureCommand *command =
+ new SegmentReconfigureCommand("Resize Segment");
+
+ int trackPos = CompositionItemHelper::getTrackPos
+ (m_currentItem, m_canvas->grid());
+
+ Composition &comp = m_doc->getComposition();
+ Track *track = comp.getTrackByPosition(trackPos);
+
+ command->addSegment(segment,
+ newStartTime,
+ newEndTime,
+ track->getId());
+ addCommandToHistory(command);
+ }
+ }
+ }
+ }
+
+ m_canvas->getModel()->endChange();
+ m_canvas->updateContents();
+ setChangeMade(false);
+ m_currentItem = CompositionItem();
+ setBasicContextHelp();
+}
+
+int SegmentResizer::handleMouseMove(QMouseEvent *e)
+{
+ // RG_DEBUG << "SegmentResizer::handleMouseMove" << endl;
+
+ bool rescale = (e->state() & Qt::ControlButton);
+
+ if (!m_currentItem) {
+ setBasicContextHelp(rescale);
+ return RosegardenCanvasView::NoFollow;
+ }
+
+ if (rescale) {
+ if (!m_canvas->isFineGrain()) {
+ setContextHelp(i18n("Hold Shift to avoid snapping to beat grid"));
+ } else {
+ clearContextHelp();
+ }
+ } else {
+ if (!m_canvas->isFineGrain()) {
+ setContextHelp(i18n("Hold Shift to avoid snapping to beat grid; hold Ctrl as well to rescale contents"));
+ } else {
+ setContextHelp("Hold Ctrl to rescale contents");
+ }
+ }
+
+ Segment* segment = CompositionItemHelper::getSegment(m_currentItem);
+
+ // Don't allow Audio segments to resize yet
+ //
+ /*!!!
+ if (segment->getType() == Segment::Audio)
+ {
+ m_currentItem = CompositionItem();
+ KMessageBox::information(m_canvas,
+ i18n("You can't yet resize an audio segment!"));
+ return RosegardenCanvasView::NoFollow;
+ }
+ */
+
+ QRect oldRect = m_currentItem->rect();
+
+ m_canvas->setSnapGrain(true);
+
+ timeT time = m_canvas->grid().snapX(e->pos().x());
+ timeT snap = m_canvas->grid().getSnapTime(double(e->pos().x()));
+ if (snap == 0)
+ snap = Note(Note::Shortest).getDuration();
+
+ // We only want to snap the end that we were actually resizing.
+
+ timeT itemStartTime, itemEndTime;
+
+ if (m_resizeStart) {
+ itemStartTime = CompositionItemHelper::getStartTime
+ (m_currentItem, m_canvas->grid());
+ itemEndTime = segment->getEndMarkerTime();
+ } else {
+ itemEndTime = CompositionItemHelper::getEndTime
+ (m_currentItem, m_canvas->grid());
+ itemStartTime = segment->getStartTime();
+ }
+
+ timeT duration = 0;
+
+ if (m_resizeStart) {
+
+ duration = itemEndTime - time;
+ // RG_DEBUG << "SegmentResizer::handleMouseMove() resize start : duration = "
+ // << duration << " - snap = " << snap
+ // << " - itemEndTime : " << itemEndTime
+ // << " - time : " << time
+ // << endl;
+
+ timeT newStartTime = 0;
+
+ if ((duration > 0 && duration < snap) ||
+ (duration < 0 && duration > -snap)) {
+
+ newStartTime = itemEndTime - (duration < 0 ? -snap : snap);
+
+ } else {
+
+ newStartTime = itemEndTime - duration;
+
+ }
+
+ CompositionItemHelper::setStartTime(m_currentItem,
+ newStartTime,
+ m_canvas->grid());
+ } else { // resize end
+
+ duration = time - itemStartTime;
+
+ timeT newEndTime = 0;
+
+ // RG_DEBUG << "SegmentResizer::handleMouseMove() resize end : duration = "
+ // << duration << " - snap = " << snap
+ // << " - itemEndTime : " << itemEndTime
+ // << " - time : " << time
+ // << endl;
+
+ if ((duration > 0 && duration < snap) ||
+ (duration < 0 && duration > -snap)) {
+
+ newEndTime = (duration < 0 ? -snap : snap) + itemStartTime;
+
+ } else {
+
+ newEndTime = duration + itemStartTime;
+
+ }
+
+ CompositionItemHelper::setEndTime(m_currentItem,
+ newEndTime,
+ m_canvas->grid());
+ }
+
+ if (duration != 0)
+ setChangeMade(true);
+
+ m_canvas->slotUpdateSegmentsDrawBuffer(m_currentItem->rect() | oldRect);
+
+ return RosegardenCanvasView::FollowHorizontal;
+}
+
+bool SegmentResizer::cursorIsCloseEnoughToEdge(const CompositionItem& p, const QPoint &coord,
+ int edgeThreshold, bool &start)
+{
+ if (abs(p->rect().x() + p->rect().width() - coord.x()) < edgeThreshold) {
+ start = false;
+ return true;
+ } else if (abs(p->rect().x() - coord.x()) < edgeThreshold) {
+ start = true;
+ return true;
+ } else {
+ return false;
+ }
+}
+
+void SegmentResizer::setBasicContextHelp(bool ctrlPressed)
+{
+ if (ctrlPressed) {
+ setContextHelp(i18n("Click and drag to resize a segment; hold Ctrl as well to rescale its contents"));
+ } else {
+ setContextHelp(i18n("Click and drag to rescale segment"));
+ }
+}
+
+const QString SegmentResizer::ToolName = "segmentresizer";
+
+}
+#include "SegmentResizer.moc"
diff --git a/src/gui/editors/segment/segmentcanvas/SegmentResizer.h b/src/gui/editors/segment/segmentcanvas/SegmentResizer.h
new file mode 100644
index 0000000..9d54573
--- /dev/null
+++ b/src/gui/editors/segment/segmentcanvas/SegmentResizer.h
@@ -0,0 +1,87 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_SEGMENTRESIZER_H_
+#define _RG_SEGMENTRESIZER_H_
+
+#include "SegmentTool.h"
+#include <qstring.h>
+
+
+class QPoint;
+class QMouseEvent;
+class CompositionItem;
+
+
+namespace Rosegarden
+{
+
+class RosegardenGUIDoc;
+class CompositionView;
+
+
+/**
+ * Segment Resizer tool. Allows resizing only at the end of the segment part
+ */
+class SegmentResizer : public SegmentTool
+{
+ Q_OBJECT
+
+ friend class SegmentToolBox;
+ friend class SegmentSelector;
+
+public:
+
+ virtual void ready();
+ virtual void stow();
+
+ virtual void handleMouseButtonPress(QMouseEvent*);
+ virtual void handleMouseButtonRelease(QMouseEvent*);
+ virtual int handleMouseMove(QMouseEvent*);
+
+ static bool cursorIsCloseEnoughToEdge(const CompositionItem&, const QPoint&, int, bool &);
+
+ void setEdgeThreshold(int e) { m_edgeThreshold = e; }
+ int getEdgeThreshold() { return m_edgeThreshold; }
+
+ static const QString ToolName;
+
+protected slots:
+ void slotCanvasScrolled(int newX, int newY);
+
+protected:
+ SegmentResizer(CompositionView*, RosegardenGUIDoc*, int edgeThreshold = 10);
+ void setBasicContextHelp(bool ctrlPressed = false);
+
+ //--------------- Data members ---------------------------------
+
+ int m_edgeThreshold;
+ bool m_resizeStart;
+};
+
+
+}
+
+#endif
diff --git a/src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp b/src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp
new file mode 100644
index 0000000..35ec639
--- /dev/null
+++ b/src/gui/editors/segment/segmentcanvas/SegmentSelector.cpp
@@ -0,0 +1,532 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "SegmentSelector.h"
+
+#include "base/Event.h"
+#include <klocale.h>
+#include "misc/Debug.h"
+#include "base/Composition.h"
+#include "base/RealTime.h"
+#include "base/SnapGrid.h"
+#include "base/Selection.h"
+#include "base/Track.h"
+#include "commands/segment/SegmentQuickCopyCommand.h"
+#include "commands/segment/SegmentReconfigureCommand.h"
+#include "CompositionItemHelper.h"
+#include "CompositionModel.h"
+#include "CompositionView.h"
+#include "document/RosegardenGUIDoc.h"
+#include "document/ConfigGroups.h"
+#include "gui/general/BaseTool.h"
+#include "gui/general/RosegardenCanvasView.h"
+#include "SegmentPencil.h"
+#include "SegmentResizer.h"
+#include "SegmentTool.h"
+#include "SegmentToolBox.h"
+#include <kapplication.h>
+#include <kconfig.h>
+#include <qcursor.h>
+#include <qevent.h>
+#include <qpoint.h>
+#include <qrect.h>
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+SegmentSelector::SegmentSelector(CompositionView *c, RosegardenGUIDoc *d)
+ : SegmentTool(c, d),
+ m_segmentAddMode(false),
+ m_segmentCopyMode(false),
+ m_segmentQuickCopyDone(false),
+ m_buttonPressed(false),
+ m_selectionMoveStarted(false),
+ m_dispatchTool(0)
+{
+ RG_DEBUG << "SegmentSelector()\n";
+}
+
+SegmentSelector::~SegmentSelector()
+{}
+
+void SegmentSelector::ready()
+{
+ m_canvas->viewport()->setCursor(Qt::arrowCursor);
+ connect(m_canvas, SIGNAL(contentsMoving (int, int)),
+ this, SLOT(slotCanvasScrolled(int, int)));
+ setContextHelp(i18n("Click and drag to select segments"));
+}
+
+void SegmentSelector::stow()
+{}
+
+void SegmentSelector::slotCanvasScrolled(int newX, int newY)
+{
+ QMouseEvent tmpEvent(QEvent::MouseMove,
+ m_canvas->viewport()->mapFromGlobal(QCursor::pos()) + QPoint(newX, newY),
+ Qt::NoButton, Qt::NoButton);
+ handleMouseMove(&tmpEvent);
+}
+
+void
+SegmentSelector::handleMouseButtonPress(QMouseEvent *e)
+{
+ RG_DEBUG << "SegmentSelector::handleMouseButtonPress\n";
+ m_buttonPressed = true;
+
+ CompositionItem item = m_canvas->getFirstItemAt(e->pos());
+
+ // If we're in segmentAddMode or not clicking on an item then we don't
+ // clear the selection vector. If we're clicking on an item and it's
+ // not in the selection - then also clear the selection.
+ //
+ if ((!m_segmentAddMode && !item) ||
+ (!m_segmentAddMode && !(m_canvas->getModel()->isSelected(item)))) {
+ m_canvas->getModel()->clearSelected();
+ }
+
+ if (item) {
+
+ // Fifteen percent of the width of the SegmentItem, up to 10px
+ //
+ int threshold = int(float(item->rect().width()) * 0.15);
+ if (threshold == 0) threshold = 1;
+ if (threshold > 10) threshold = 10;
+
+ bool start = false;
+
+ // Resize if we're dragging from the edge, provided we aren't
+ // in segment-add mode with at least one segment already
+ // selected -- as we aren't able to resize multiple segments
+ // at once, we should assume the segment-add aspect takes
+ // priority
+
+ if ((!m_segmentAddMode ||
+ !m_canvas->getModel()->haveSelection()) &&
+ SegmentResizer::cursorIsCloseEnoughToEdge(item, e->pos(), threshold, start)) {
+
+ SegmentResizer* resizer =
+ dynamic_cast<SegmentResizer*>(getToolBox()->getTool(SegmentResizer::ToolName));
+
+ resizer->setEdgeThreshold(threshold);
+
+ // For the moment we only allow resizing of a single segment
+ // at a time.
+ //
+ m_canvas->getModel()->clearSelected();
+
+ m_dispatchTool = resizer;
+
+ m_dispatchTool->ready(); // set mouse cursor
+ m_dispatchTool->handleMouseButtonPress(e);
+ return ;
+ }
+
+ bool selecting = true;
+
+ if (m_segmentAddMode && m_canvas->getModel()->isSelected(item)) {
+ selecting = false;
+ } else {
+ // put the segment in 'move' mode only if it's being selected
+ m_canvas->getModel()->startChange(item, CompositionModel::ChangeMove);
+ }
+
+ m_canvas->getModel()->setSelected(item, selecting);
+
+ // Moving
+ //
+ // RG_DEBUG << "SegmentSelector::handleMouseButtonPress - m_currentItem = " << item << endl;
+ m_currentItem = item;
+ m_clickPoint = e->pos();
+
+ int guideX = item->rect().x();
+ int guideY = item->rect().y();
+
+ m_canvas->setGuidesPos(guideX, guideY);
+
+ m_canvas->setDrawGuides(true);
+
+ } else {
+
+ // Add on middle button or ctrl+left - bounding box on rest
+ //
+ if (e->button() == MidButton ||
+ (e->button() == LeftButton && (e->state() & Qt::ControlButton))) {
+
+ m_dispatchTool = getToolBox()->getTool(SegmentPencil::ToolName);
+
+ if (m_dispatchTool) {
+ m_dispatchTool->ready(); // set mouse cursor
+ m_dispatchTool->handleMouseButtonPress(e);
+ }
+
+ return ;
+
+ } else {
+
+ m_canvas->setSelectionRectPos(e->pos());
+ m_canvas->setDrawSelectionRect(true);
+ if (!m_segmentAddMode)
+ m_canvas->getModel()->clearSelected();
+
+ }
+ }
+
+ // Tell the RosegardenGUIView that we've selected some new Segments -
+ // when the list is empty we're just unselecting.
+ //
+ m_canvas->getModel()->signalSelection();
+
+ m_passedInertiaEdge = false;
+}
+
+void
+SegmentSelector::handleMouseButtonRelease(QMouseEvent *e)
+{
+ m_buttonPressed = false;
+
+ // Hide guides and stuff
+ //
+ m_canvas->setDrawGuides(false);
+ m_canvas->hideTextFloat();
+
+ if (m_dispatchTool) {
+ m_dispatchTool->handleMouseButtonRelease(e);
+ m_dispatchTool = 0;
+ m_canvas->viewport()->setCursor(Qt::arrowCursor);
+ return ;
+ }
+
+ int startDragTrackPos = m_canvas->grid().getYBin(m_clickPoint.y());
+ int currentTrackPos = m_canvas->grid().getYBin(e->pos().y());
+ int trackDiff = currentTrackPos - startDragTrackPos;
+
+ if (!m_currentItem) {
+ m_canvas->setDrawSelectionRect(false);
+ m_canvas->getModel()->finalizeSelectionRect();
+ m_canvas->getModel()->signalSelection();
+ return ;
+ }
+
+ m_canvas->viewport()->setCursor(Qt::arrowCursor);
+
+ Composition &comp = m_doc->getComposition();
+
+ if (m_canvas->getModel()->isSelected(m_currentItem)) {
+
+ CompositionModel::itemcontainer& changingItems = m_canvas->getModel()->getChangingItems();
+ CompositionModel::itemcontainer::iterator it;
+
+ if (changeMade()) {
+
+ SegmentReconfigureCommand *command =
+ new SegmentReconfigureCommand
+ (m_selectedItems.size() == 1 ? i18n("Move Segment") :
+ i18n("Move Segments"));
+
+ for (it = changingItems.begin();
+ it != changingItems.end();
+ it++) {
+
+ CompositionItem item = *it;
+
+ Segment* segment = CompositionItemHelper::getSegment(item);
+
+ TrackId origTrackId = segment->getTrack();
+ int trackPos = comp.getTrackPositionById(origTrackId);
+ trackPos += trackDiff;
+
+ if (trackPos < 0) {
+ trackPos = 0;
+ } else if (trackPos >= comp.getNbTracks()) {
+ trackPos = comp.getNbTracks() - 1;
+ }
+
+ Track *newTrack = comp.getTrackByPosition(trackPos);
+ int newTrackId = origTrackId;
+ if (newTrack) newTrackId = newTrack->getId();
+
+ timeT itemStartTime = CompositionItemHelper::getStartTime
+ (item, m_canvas->grid());
+
+ // We absolutely don't want to snap the end time to
+ // the grid. We want it to remain exactly the same as
+ // it was, but relative to the new start time.
+ timeT itemEndTime = itemStartTime + segment->getEndMarkerTime()
+ - segment->getStartTime();
+
+// std::cerr << "releasing segment " << segment << ": mouse started at track " << startDragTrackPos << ", is now at " << currentTrackPos << ", diff is " << trackDiff << ", moving from track pos " << comp.getTrackPositionById(origTrackId) << " to " << trackPos << ", id " << origTrackId << " to " << newTrackId << std::endl;
+
+ command->addSegment(segment,
+ itemStartTime,
+ itemEndTime,
+ newTrackId);
+ }
+
+ addCommandToHistory(command);
+ }
+
+ m_canvas->getModel()->endChange();
+ m_canvas->slotUpdateSegmentsDrawBuffer();
+ }
+
+ // if we've just finished a quick copy then drop the Z level back
+ if (m_segmentQuickCopyDone) {
+ m_segmentQuickCopyDone = false;
+ // m_currentItem->setZ(2); // see SegmentItem::setSelected --??
+ }
+
+ setChangeMade(false);
+
+ m_selectionMoveStarted = false;
+
+ m_currentItem = CompositionItem();
+
+ setContextHelpFor(e->pos());
+}
+
+int
+SegmentSelector::handleMouseMove(QMouseEvent *e)
+{
+ if (!m_buttonPressed) {
+ setContextHelpFor(e->pos(), (e->state() & Qt::ControlButton));
+ return RosegardenCanvasView::NoFollow;
+ }
+
+ if (m_dispatchTool) {
+ return m_dispatchTool->handleMouseMove(e);
+ }
+
+ Composition &comp = m_doc->getComposition();
+
+ if (!m_currentItem) {
+
+ // RG_DEBUG << "SegmentSelector::handleMouseMove: no current item\n";
+
+ // do a bounding box
+ QRect selectionRect = m_canvas->getSelectionRect();
+
+ m_canvas->setDrawSelectionRect(true);
+
+ // same as for notation view
+ int w = int(e->pos().x() - selectionRect.x());
+ int h = int(e->pos().y() - selectionRect.y());
+ if (w > 0)
+ ++w;
+ else
+ --w;
+ if (h > 0)
+ ++h;
+ else
+ --h;
+
+ // Translate these points
+ //
+ m_canvas->setSelectionRectSize(w, h);
+
+ m_canvas->getModel()->signalSelection();
+ return RosegardenCanvasView::FollowHorizontal | RosegardenCanvasView::FollowVertical;
+ }
+
+ m_canvas->viewport()->setCursor(Qt::sizeAllCursor);
+
+ if (m_segmentCopyMode && !m_segmentQuickCopyDone) {
+ KMacroCommand *mcommand = new KMacroCommand
+ (SegmentQuickCopyCommand::getGlobalName());
+
+ SegmentSelection selectedItems = m_canvas->getSelectedSegments();
+ SegmentSelection::iterator it;
+ for (it = selectedItems.begin();
+ it != selectedItems.end();
+ it++) {
+ SegmentQuickCopyCommand *command =
+ new SegmentQuickCopyCommand(*it);
+
+ mcommand->addCommand(command);
+ }
+
+ addCommandToHistory(mcommand);
+
+ // generate SegmentItem
+ //
+ m_canvas->updateContents();
+ m_segmentQuickCopyDone = true;
+ }
+
+ m_canvas->setSnapGrain(true);
+
+ int startDragTrackPos = m_canvas->grid().getYBin(m_clickPoint.y());
+ int currentTrackPos = m_canvas->grid().getYBin(e->pos().y());
+ int trackDiff = currentTrackPos - startDragTrackPos;
+
+ if (m_canvas->getModel()->isSelected(m_currentItem)) {
+
+ if (!m_canvas->isFineGrain()) {
+ setContextHelp(i18n("Hold Shift to avoid snapping to beat grid"));
+ } else {
+ clearContextHelp();
+ }
+
+ // RG_DEBUG << "SegmentSelector::handleMouseMove: current item is selected\n";
+
+ if (!m_selectionMoveStarted) { // start move on selected items only once
+ m_canvas->getModel()->startChangeSelection(CompositionModel::ChangeMove);
+ m_selectionMoveStarted = true;
+ }
+
+ CompositionModel::itemcontainer& changingItems = m_canvas->getModel()->getChangingItems();
+ setCurrentItem(CompositionItemHelper::findSiblingCompositionItem(changingItems, m_currentItem));
+
+ CompositionModel::itemcontainer::iterator it;
+ int guideX = 0;
+ int guideY = 0;
+
+ for (it = changingItems.begin();
+ it != changingItems.end();
+ ++it) {
+
+ // RG_DEBUG << "SegmentSelector::handleMouseMove() : movingItem at "
+ // << (*it)->rect().x() << "," << (*it)->rect().y() << endl;
+
+ int dx = e->pos().x() - m_clickPoint.x(),
+ dy = e->pos().y() - m_clickPoint.y();
+
+ const int inertiaDistance = m_canvas->grid().getYSnap() / 3;
+ if (!m_passedInertiaEdge &&
+ (dx < inertiaDistance && dx > -inertiaDistance) &&
+ (dy < inertiaDistance && dy > -inertiaDistance)) {
+ return RosegardenCanvasView::NoFollow;
+ } else {
+ m_passedInertiaEdge = true;
+ }
+
+ timeT newStartTime = m_canvas->grid().snapX((*it)->savedRect().x() + dx);
+
+ int newX = int(m_canvas->grid().getRulerScale()->getXForTime(newStartTime));
+
+ int trackPos = m_canvas->grid().getYBin((*it)->savedRect().y());
+
+// std::cerr << "segment " << *it << ": mouse started at track " << startDragTrackPos << ", is now at " << currentTrackPos << ", trackPos from " << trackPos << " to ";
+
+ trackPos += trackDiff;
+
+// std::cerr << trackPos << std::endl;
+
+ if (trackPos < 0) {
+ trackPos = 0;
+ } else if (trackPos >= comp.getNbTracks()) {
+ trackPos = comp.getNbTracks() - 1;
+ }
+
+ int newY = m_canvas->grid().getYBinCoordinate(trackPos);
+
+ (*it)->moveTo(newX, newY);
+ setChangeMade(true);
+ }
+
+ if (changeMade())
+ m_canvas->getModel()->signalContentChange();
+
+ guideX = m_currentItem->rect().x();
+ guideY = m_currentItem->rect().y();
+
+ m_canvas->setGuidesPos(guideX, guideY);
+
+ timeT currentItemStartTime = m_canvas->grid().snapX(m_currentItem->rect().x());
+
+ RealTime time = comp.getElapsedRealTime(currentItemStartTime);
+ QString ms;
+ ms.sprintf("%03d", time.msec());
+
+ int bar, beat, fraction, remainder;
+ comp.getMusicalTimeForAbsoluteTime(currentItemStartTime, bar, beat, fraction, remainder);
+
+ QString posString = QString("%1.%2s (%3, %4, %5)")
+ .arg(time.sec).arg(ms)
+ .arg(bar + 1).arg(beat).arg(fraction);
+
+ m_canvas->setTextFloat(guideX + 10, guideY - 30, posString);
+ m_canvas->updateContents();
+
+ } else {
+ // RG_DEBUG << "SegmentSelector::handleMouseMove: current item not selected\n";
+ }
+
+ return RosegardenCanvasView::FollowHorizontal | RosegardenCanvasView::FollowVertical;
+}
+
+void SegmentSelector::setContextHelpFor(QPoint p, bool ctrlPressed)
+{
+ kapp->config()->setGroup(GeneralOptionsConfigGroup);
+ if (!kapp->config()->readBoolEntry("toolcontexthelp", true)) return;
+
+ CompositionItem item = m_canvas->getFirstItemAt(p);
+
+ if (!item) {
+ setContextHelp(i18n("Click and drag to select segments; middle-click and drag to draw an empty segment"));
+
+ } else {
+
+ // Same logic as in handleMouseButtonPress to establish
+ // whether we'd be moving or resizing
+
+ int threshold = int(float(item->rect().width()) * 0.15);
+ if (threshold == 0) threshold = 1;
+ if (threshold > 10) threshold = 10;
+ bool start = false;
+
+ if ((!m_segmentAddMode ||
+ !m_canvas->getModel()->haveSelection()) &&
+ SegmentResizer::cursorIsCloseEnoughToEdge(item, p,
+ threshold, start)) {
+ if (!ctrlPressed) {
+ setContextHelp(i18n("Click and drag to resize a segment; hold Ctrl as well to rescale its contents"));
+ } else {
+ setContextHelp(i18n("Click and drag to rescale segment"));
+ }
+ } else {
+ if (m_canvas->getModel()->haveMultipleSelection()) {
+ if (!ctrlPressed) {
+ setContextHelp(i18n("Click and drag to move segments; hold Ctrl as well to copy them"));
+ } else {
+ setContextHelp(i18n("Click and drag to copy segments"));
+ }
+ } else {
+ if (!ctrlPressed) {
+ setContextHelp(i18n("Click and drag to move segment; hold Ctrl as well to copy it; double-click to edit"));
+ } else {
+ setContextHelp(i18n("Click and drag to copy segment"));
+ }
+ }
+ }
+ }
+}
+
+const QString SegmentSelector::ToolName = "segmentselector";
+
+}
+#include "SegmentSelector.moc"
diff --git a/src/gui/editors/segment/segmentcanvas/SegmentSelector.h b/src/gui/editors/segment/segmentcanvas/SegmentSelector.h
new file mode 100644
index 0000000..a6d8d9c
--- /dev/null
+++ b/src/gui/editors/segment/segmentcanvas/SegmentSelector.h
@@ -0,0 +1,109 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_SEGMENTSELECTOR_H_
+#define _RG_SEGMENTSELECTOR_H_
+
+#include "SegmentTool.h"
+#include <qpoint.h>
+#include <qstring.h>
+
+
+class QMouseEvent;
+
+
+namespace Rosegarden
+{
+
+class RosegardenGUIDoc;
+class CompositionView;
+
+
+class SegmentSelector : public SegmentTool
+{
+ Q_OBJECT
+
+ friend class SegmentToolBox;
+ friend class SegmentTool;
+
+public:
+
+ virtual ~SegmentSelector();
+
+ virtual void ready();
+ virtual void stow();
+
+ virtual void handleMouseButtonPress(QMouseEvent*);
+ virtual void handleMouseButtonRelease(QMouseEvent*);
+ virtual int handleMouseMove(QMouseEvent*);
+
+ // These two alter the behaviour of the selection mode
+ //
+ // - SegmentAdd (usually when SHIFT is held down) allows
+ // multiple selections of Segments.
+ //
+ // - SegmentCopy (usually CONTROL) allows draw and drop
+ // copying of Segments - it's a quick shortcut
+ //
+ void setSegmentAdd(const bool &value) { m_segmentAddMode = value; }
+ void setSegmentCopy(const bool &value) { m_segmentCopyMode = value; }
+
+ bool isSegmentAdding() const { return m_segmentAddMode; }
+ bool isSegmentCopying() const { return m_segmentCopyMode; }
+
+ // Return the SegmentItem list for other tools to use
+ //
+ SegmentItemList* getSegmentItemList() { return &m_selectedItems; }
+
+ static const QString ToolName;
+
+protected slots:
+ void slotCanvasScrolled(int newX, int newY);
+
+protected:
+ SegmentSelector(CompositionView*, RosegardenGUIDoc*);
+
+ void setContextHelpFor(QPoint p, bool ctrlPressed = false);
+
+ //--------------- Data members ---------------------------------
+
+ SegmentItemList m_selectedItems;
+
+ bool m_segmentAddMode;
+ bool m_segmentCopyMode;
+ QPoint m_clickPoint;
+ bool m_segmentQuickCopyDone;
+ bool m_passedInertiaEdge;
+ bool m_buttonPressed;
+ bool m_selectionMoveStarted;
+
+ SegmentTool *m_dispatchTool;
+};
+
+
+
+}
+
+#endif
diff --git a/src/gui/editors/segment/segmentcanvas/SegmentSplitter.cpp b/src/gui/editors/segment/segmentcanvas/SegmentSplitter.cpp
new file mode 100644
index 0000000..4fd48c3
--- /dev/null
+++ b/src/gui/editors/segment/segmentcanvas/SegmentSplitter.cpp
@@ -0,0 +1,175 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "SegmentSplitter.h"
+
+#include "misc/Debug.h"
+#include "base/Segment.h"
+#include "base/SnapGrid.h"
+#include "commands/segment/AudioSegmentSplitCommand.h"
+#include "commands/segment/SegmentSplitCommand.h"
+#include "CompositionItemHelper.h"
+#include "CompositionView.h"
+#include "document/RosegardenGUIDoc.h"
+#include "gui/general/BaseTool.h"
+#include "gui/general/RosegardenCanvasView.h"
+#include "SegmentTool.h"
+#include <kcommand.h>
+#include <qpoint.h>
+#include <qrect.h>
+#include <qstring.h>
+#include <klocale.h>
+
+
+namespace Rosegarden
+{
+
+SegmentSplitter::SegmentSplitter(CompositionView *c, RosegardenGUIDoc *d)
+ : SegmentTool(c, d),
+ m_prevX(0),
+ m_prevY(0)
+{
+ RG_DEBUG << "SegmentSplitter()\n";
+}
+
+SegmentSplitter::~SegmentSplitter()
+{}
+
+void SegmentSplitter::ready()
+{
+ m_canvas->viewport()->setCursor(Qt::splitHCursor);
+ setBasicContextHelp();
+}
+
+void
+SegmentSplitter::handleMouseButtonPress(QMouseEvent *e)
+{
+ // Remove cursor and replace with line on a SegmentItem
+ // at where the cut will be made
+ CompositionItem item = m_canvas->getFirstItemAt(e->pos());
+
+ if (item) {
+ m_canvas->viewport()->setCursor(Qt::blankCursor);
+ m_prevX = item->rect().x();
+ m_prevX = item->rect().y();
+ drawSplitLine(e);
+ delete item;
+ }
+
+}
+
+void
+SegmentSplitter::handleMouseButtonRelease(QMouseEvent *e)
+{
+ setBasicContextHelp();
+
+ CompositionItem item = m_canvas->getFirstItemAt(e->pos());
+
+ if (item) {
+ m_canvas->setSnapGrain(true);
+ Segment* segment = CompositionItemHelper::getSegment(item);
+
+ if (segment->getType() == Segment::Audio) {
+ AudioSegmentSplitCommand *command =
+ new AudioSegmentSplitCommand(segment, m_canvas->grid().snapX(e->pos().x()));
+ addCommandToHistory(command);
+ } else {
+ SegmentSplitCommand *command =
+ new SegmentSplitCommand(segment, m_canvas->grid().snapX(e->pos().x()));
+ addCommandToHistory(command);
+ }
+
+ m_canvas->updateContents(item->rect());
+ delete item;
+ }
+
+ // Reinstate the cursor
+ m_canvas->viewport()->setCursor(Qt::splitHCursor);
+ m_canvas->slotHideSplitLine();
+}
+
+int
+SegmentSplitter::handleMouseMove(QMouseEvent *e)
+{
+ setBasicContextHelp();
+
+ CompositionItem item = m_canvas->getFirstItemAt(e->pos());
+
+ if (item) {
+// m_canvas->viewport()->setCursor(Qt::blankCursor);
+ drawSplitLine(e);
+ delete item;
+ return RosegardenCanvasView::FollowHorizontal;
+ } else {
+ m_canvas->viewport()->setCursor(Qt::splitHCursor);
+ m_canvas->slotHideSplitLine();
+ return RosegardenCanvasView::NoFollow;
+ }
+}
+
+void
+SegmentSplitter::drawSplitLine(QMouseEvent *e)
+{
+ m_canvas->setSnapGrain(true);
+
+ // Turn the real X into a snapped X
+ //
+ timeT xT = m_canvas->grid().snapX(e->pos().x());
+ int x = (int)(m_canvas->grid().getRulerScale()->getXForTime(xT));
+
+ // Need to watch y doesn't leak over the edges of the
+ // current Segment.
+ //
+ int y = m_canvas->grid().snapY(e->pos().y());
+
+ m_canvas->slotShowSplitLine(x, y);
+
+ QRect updateRect(std::max(0, std::min(x, m_prevX) - 5), y,
+ std::max(m_prevX, x) + 5, m_prevY + m_canvas->grid().getYSnap());
+ m_canvas->updateContents(updateRect);
+ m_prevX = x;
+ m_prevY = y;
+}
+
+void
+SegmentSplitter::contentsMouseDoubleClickEvent(QMouseEvent*)
+{
+ // DO NOTHING
+}
+
+void
+SegmentSplitter::setBasicContextHelp()
+{
+ if (!m_canvas->isFineGrain()) {
+ setContextHelp(i18n("Click on a segment to split it in two; hold Shift to avoid snapping to beat grid"));
+ } else {
+ setContextHelp(i18n("Click on a segment to split it in two"));
+ }
+}
+
+const QString SegmentSplitter::ToolName = "segmentsplitter";
+
+}
+#include "SegmentSplitter.moc"
diff --git a/src/gui/editors/segment/segmentcanvas/SegmentSplitter.h b/src/gui/editors/segment/segmentcanvas/SegmentSplitter.h
new file mode 100644
index 0000000..06201ec
--- /dev/null
+++ b/src/gui/editors/segment/segmentcanvas/SegmentSplitter.h
@@ -0,0 +1,83 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_SEGMENTSPLITTER_H_
+#define _RG_SEGMENTSPLITTER_H_
+
+#include "SegmentTool.h"
+#include <qstring.h>
+#include "base/Event.h"
+
+
+class QMouseEvent;
+
+
+namespace Rosegarden
+{
+
+class Segment;
+class RosegardenGUIDoc;
+class CompositionView;
+
+
+class SegmentSplitter : public SegmentTool
+{
+ Q_OBJECT
+
+ friend class SegmentToolBox;
+
+public:
+
+ virtual ~SegmentSplitter();
+
+ virtual void ready();
+
+ virtual void handleMouseButtonPress(QMouseEvent*);
+ virtual void handleMouseButtonRelease(QMouseEvent*);
+ virtual int handleMouseMove(QMouseEvent*);
+
+ // don't do double clicks
+ virtual void contentsMouseDoubleClickEvent(QMouseEvent*);
+
+ static const QString ToolName;
+
+protected:
+ SegmentSplitter(CompositionView*, RosegardenGUIDoc*);
+
+ void setBasicContextHelp();
+
+ void drawSplitLine(QMouseEvent*);
+ void splitSegment(Segment *segment,
+ timeT &splitTime);
+
+ //--------------- Data members ---------------------------------
+ int m_prevX;
+ int m_prevY;
+};
+
+
+}
+
+#endif
diff --git a/src/gui/editors/segment/segmentcanvas/SegmentTool.cpp b/src/gui/editors/segment/segmentcanvas/SegmentTool.cpp
new file mode 100644
index 0000000..9bd7e69
--- /dev/null
+++ b/src/gui/editors/segment/segmentcanvas/SegmentTool.cpp
@@ -0,0 +1,115 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "SegmentTool.h"
+
+#include "misc/Debug.h"
+#include "CompositionView.h"
+#include "document/RosegardenGUIDoc.h"
+#include "document/MultiViewCommandHistory.h"
+#include "gui/application/RosegardenGUIApp.h"
+#include "gui/general/BaseTool.h"
+#include "SegmentToolBox.h"
+#include <kcommand.h>
+#include <kmainwindow.h>
+#include <qpoint.h>
+#include <qpopupmenu.h>
+
+
+namespace Rosegarden
+{
+
+SegmentTool::SegmentTool(CompositionView* canvas, RosegardenGUIDoc *doc)
+ : BaseTool("segment_tool_menu", dynamic_cast<KMainWindow*>(doc->parent())->factory(), canvas),
+ m_canvas(canvas),
+ m_doc(doc),
+ m_changeMade(false)
+{}
+
+SegmentTool::~SegmentTool()
+{}
+
+
+void SegmentTool::ready()
+{
+ m_canvas->viewport()->setCursor(Qt::arrowCursor);
+}
+
+void
+SegmentTool::handleRightButtonPress(QMouseEvent *e)
+{
+ if (m_currentItem) // mouse button is pressed for some tool
+ return ;
+
+ RG_DEBUG << "SegmentTool::handleRightButtonPress()\n";
+
+ setCurrentItem(m_canvas->getFirstItemAt(e->pos()));
+
+ if (m_currentItem) {
+ if (!m_canvas->getModel()->isSelected(m_currentItem)) {
+
+ m_canvas->getModel()->clearSelected();
+ m_canvas->getModel()->setSelected(m_currentItem);
+ m_canvas->getModel()->signalSelection();
+ }
+ }
+
+ showMenu();
+ setCurrentItem(CompositionItem());
+}
+
+void
+SegmentTool::createMenu()
+{
+ RG_DEBUG << "SegmentTool::createMenu()\n";
+
+ RosegardenGUIApp *app =
+ dynamic_cast<RosegardenGUIApp*>(m_doc->parent());
+
+ if (app) {
+ m_menu = static_cast<QPopupMenu*>
+ //(app->factory()->container("segment_tool_menu", app));
+ (m_parentFactory->container("segment_tool_menu", app));
+
+ if (!m_menu) {
+ RG_DEBUG << "SegmentTool::createMenu() failed\n";
+ }
+ } else {
+ RG_DEBUG << "SegmentTool::createMenu() failed: !app\n";
+ }
+}
+
+void
+SegmentTool::addCommandToHistory(KCommand *command)
+{
+ m_doc->getCommandHistory()->addCommand(command);
+}
+
+SegmentToolBox* SegmentTool::getToolBox()
+{
+ return m_canvas->getToolBox();
+}
+
+}
diff --git a/src/gui/editors/segment/segmentcanvas/SegmentTool.h b/src/gui/editors/segment/segmentcanvas/SegmentTool.h
new file mode 100644
index 0000000..90ed961
--- /dev/null
+++ b/src/gui/editors/segment/segmentcanvas/SegmentTool.h
@@ -0,0 +1,105 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_SEGMENTTOOL_H_
+#define _RG_SEGMENTTOOL_H_
+
+#include "gui/general/BaseTool.h"
+#include "CompositionItem.h"
+#include <qpoint.h>
+#include <utility>
+#include <vector>
+
+
+class QMouseEvent;
+class KCommand;
+
+
+namespace Rosegarden
+{
+
+class SegmentToolBox;
+class RosegardenGUIDoc;
+class CompositionView;
+
+
+//////////////////////////////////////////////////////////////////////
+
+class SegmentToolBox;
+class SegmentSelector;
+
+// Allow the tools to share the Selector tool's selection
+// through these.
+//
+typedef std::pair<QPoint, CompositionItem> SegmentItemPair;
+typedef std::vector<SegmentItemPair> SegmentItemList;
+
+class SegmentTool : public BaseTool
+{
+public:
+ friend class SegmentToolBox;
+
+ virtual ~SegmentTool();
+
+ /**
+ * Is called by the parent View (EditView or SegmentCanvas) when
+ * the tool is set as current.
+ * Add any setup here
+ */
+ virtual void ready();
+
+ virtual void handleRightButtonPress(QMouseEvent*);
+ virtual void handleMouseButtonPress(QMouseEvent*) = 0;
+ virtual void handleMouseButtonRelease(QMouseEvent*) = 0;
+ virtual int handleMouseMove(QMouseEvent*) = 0;
+
+ void addCommandToHistory(KCommand *command);
+
+protected:
+ SegmentTool(CompositionView*, RosegardenGUIDoc *doc);
+
+ virtual void createMenu();
+ virtual bool hasMenu() { return true; }
+
+ void setCurrentItem(CompositionItem item) { if (item != m_currentItem) { delete m_currentItem; m_currentItem = item; } }
+
+ SegmentToolBox* getToolBox();
+
+ bool changeMade() { return m_changeMade; }
+ void setChangeMade(bool c) { m_changeMade = c; }
+
+ //--------------- Data members ---------------------------------
+
+ CompositionView* m_canvas;
+ CompositionItem m_currentItem;
+ RosegardenGUIDoc* m_doc;
+ QPoint m_origPos;
+ bool m_changeMade;
+};
+
+
+}
+
+#endif
diff --git a/src/gui/editors/segment/segmentcanvas/SegmentToolBox.cpp b/src/gui/editors/segment/segmentcanvas/SegmentToolBox.cpp
new file mode 100644
index 0000000..cb0dec9
--- /dev/null
+++ b/src/gui/editors/segment/segmentcanvas/SegmentToolBox.cpp
@@ -0,0 +1,102 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "SegmentToolBox.h"
+
+#include "CompositionView.h"
+#include "document/RosegardenGUIDoc.h"
+#include "gui/general/BaseToolBox.h"
+#include "SegmentTool.h"
+#include "SegmentSelector.h"
+#include "SegmentEraser.h"
+#include "SegmentJoiner.h"
+#include "SegmentMover.h"
+#include "SegmentPencil.h"
+#include "SegmentResizer.h"
+#include "SegmentSplitter.h"
+#include <qstring.h>
+#include <kmessagebox.h>
+
+namespace Rosegarden
+{
+
+SegmentToolBox::SegmentToolBox(CompositionView* parent, RosegardenGUIDoc* doc)
+ : BaseToolBox(parent),
+ m_canvas(parent),
+ m_doc(doc)
+{}
+
+SegmentTool* SegmentToolBox::createTool(const QString& toolName)
+{
+ SegmentTool* tool = 0;
+
+ QString toolNamelc = toolName.lower();
+
+ if (toolNamelc == SegmentPencil::ToolName)
+
+ tool = new SegmentPencil(m_canvas, m_doc);
+
+ else if (toolNamelc == SegmentEraser::ToolName)
+
+ tool = new SegmentEraser(m_canvas, m_doc);
+
+ else if (toolNamelc == SegmentMover::ToolName)
+
+ tool = new SegmentMover(m_canvas, m_doc);
+
+ else if (toolNamelc == SegmentResizer::ToolName)
+
+ tool = new SegmentResizer(m_canvas, m_doc);
+
+ else if (toolNamelc == SegmentSelector::ToolName)
+
+ tool = new SegmentSelector(m_canvas, m_doc);
+
+ else if (toolNamelc == SegmentSplitter::ToolName)
+
+ tool = new SegmentSplitter(m_canvas, m_doc);
+
+ else if (toolNamelc == SegmentJoiner::ToolName)
+
+ tool = new SegmentJoiner(m_canvas, m_doc);
+
+ else {
+ KMessageBox::error(0, QString("SegmentToolBox::createTool : unrecognised toolname %1 (%2)")
+ .arg(toolName).arg(toolNamelc));
+ return 0;
+ }
+
+ m_tools.insert(toolName, tool);
+
+ return tool;
+}
+
+SegmentTool* SegmentToolBox::getTool(const QString& toolName)
+{
+ return dynamic_cast<SegmentTool*>(BaseToolBox::getTool(toolName));
+}
+
+}
+#include "SegmentToolBox.moc"
diff --git a/src/gui/editors/segment/segmentcanvas/SegmentToolBox.h b/src/gui/editors/segment/segmentcanvas/SegmentToolBox.h
new file mode 100644
index 0000000..7a46fb6
--- /dev/null
+++ b/src/gui/editors/segment/segmentcanvas/SegmentToolBox.h
@@ -0,0 +1,63 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_SEGMENTTOOLBOX_H_
+#define _RG_SEGMENTTOOLBOX_H_
+
+#include "gui/general/BaseToolBox.h"
+#include "SegmentTool.h"
+
+
+class QString;
+
+
+namespace Rosegarden
+{
+
+class RosegardenGUIDoc;
+class CompositionView;
+
+
+class SegmentToolBox : public BaseToolBox
+{
+ Q_OBJECT
+public:
+ SegmentToolBox(CompositionView* parent, RosegardenGUIDoc*);
+
+ virtual SegmentTool* getTool(const QString& toolName);
+
+protected:
+ virtual SegmentTool* createTool(const QString& toolName);
+
+ //--------------- Data members ---------------------------------
+
+ CompositionView* m_canvas;
+ RosegardenGUIDoc* m_doc;
+};
+
+
+}
+
+#endif
diff --git a/src/gui/editors/tempo/TempoListItem.cpp b/src/gui/editors/tempo/TempoListItem.cpp
new file mode 100644
index 0000000..d088b5b
--- /dev/null
+++ b/src/gui/editors/tempo/TempoListItem.cpp
@@ -0,0 +1,52 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include "TempoListItem.h"
+
+namespace Rosegarden {
+
+int
+TempoListItem::compare(QListViewItem *i, int col, bool ascending) const
+{
+ TempoListItem *ti = dynamic_cast<TempoListItem *>(i);
+ if (!ti) return QListViewItem::compare(i, col, ascending);
+
+ if (col == 0) { // time
+ if (m_time == ti->m_time) {
+ return int(m_type) - int(ti->m_type);
+ } else {
+ return int(m_time - ti->m_time);
+ }
+ } else if (col == 1) { // type
+ if (m_type == ti->m_type) {
+ return int(m_time - ti->m_time);
+ } else {
+ return int(m_type) - int(ti->m_type);
+ }
+ } else {
+ return key(col, ascending).compare(i->key(col, ascending));
+ }
+}
+
+}
diff --git a/src/gui/editors/tempo/TempoListItem.h b/src/gui/editors/tempo/TempoListItem.h
new file mode 100644
index 0000000..143edde
--- /dev/null
+++ b/src/gui/editors/tempo/TempoListItem.h
@@ -0,0 +1,72 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_TEMPOLISTITEM_H_
+#define _RG_TEMPOLISTITEM_H_
+
+#include <klistview.h>
+
+#include "base/Event.h"
+
+namespace Rosegarden {
+
+class Composition;
+
+class TempoListItem : public KListViewItem
+{
+public:
+ enum Type { TimeSignature, Tempo };
+
+ TempoListItem(Composition *composition,
+ Type type,
+ timeT time,
+ int index,
+ KListView *parent,
+ QString label1,
+ QString label2,
+ QString label3,
+ QString label4 = QString::null) :
+ KListViewItem(parent, label1, label2, label3, label4),
+ m_composition(composition),
+ m_type(type),
+ m_time(time),
+ m_index(index) { }
+
+ Rosegarden::Composition *getComposition() { return m_composition; }
+ Type getType() const { return m_type; }
+ Rosegarden::timeT getTime() const { return m_time; }
+ int getIndex() const { return m_index; }
+
+ virtual int compare(QListViewItem *i, int col, bool ascending) const;
+
+protected:
+ Rosegarden::Composition *m_composition;
+ Type m_type;
+ Rosegarden::timeT m_time;
+ int m_index;
+};
+
+}
+
+#endif
diff --git a/src/gui/editors/tempo/TempoView.cpp b/src/gui/editors/tempo/TempoView.cpp
new file mode 100644
index 0000000..6ff6c1d
--- /dev/null
+++ b/src/gui/editors/tempo/TempoView.cpp
@@ -0,0 +1,839 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "TempoView.h"
+
+#include <klocale.h>
+#include <kstddirs.h>
+#include "misc/Debug.h"
+#include "base/Composition.h"
+#include "base/NotationTypes.h"
+#include "base/RealTime.h"
+#include "base/Segment.h"
+#include "commands/segment/AddTempoChangeCommand.h"
+#include "commands/segment/AddTimeSignatureAndNormalizeCommand.h"
+#include "commands/segment/AddTimeSignatureCommand.h"
+#include "commands/segment/RemoveTempoChangeCommand.h"
+#include "commands/segment/RemoveTimeSignatureCommand.h"
+#include "document/RosegardenGUIDoc.h"
+#include "document/ConfigGroups.h"
+#include "gui/dialogs/TempoDialog.h"
+#include "gui/dialogs/TimeSignatureDialog.h"
+#include "gui/general/EditViewBase.h"
+#include "gui/kdeext/KTmpStatusMsg.h"
+#include "TempoListItem.h"
+#include <kaction.h>
+#include <kglobal.h>
+#include <kconfig.h>
+#include <klistview.h>
+#include <kxmlguiclient.h>
+#include <qbuttongroup.h>
+#include <qcheckbox.h>
+#include <qdialog.h>
+#include <qiconset.h>
+#include <qlistview.h>
+#include <qpixmap.h>
+#include <qptrlist.h>
+#include <qsize.h>
+#include <qstring.h>
+#include <qlayout.h>
+#include <qcanvas.h>
+#include <kstatusbar.h>
+
+
+namespace Rosegarden
+{
+
+int
+TempoView::m_lastSetFilter = -1;
+
+
+TempoView::TempoView(RosegardenGUIDoc *doc, QWidget *parent, timeT openTime):
+ EditViewBase(doc, std::vector<Segment *>(), 2, parent, "tempoview"),
+ m_filter(Tempo | TimeSignature),
+ m_ignoreUpdates(true)
+{
+ if (m_lastSetFilter < 0)
+ m_lastSetFilter = m_filter;
+ else
+ m_filter = m_lastSetFilter;
+
+ initStatusBar();
+ setupActions();
+
+ // define some note filtering buttons in a group
+ //
+ m_filterGroup =
+ new QButtonGroup(1, Horizontal, i18n("Filter"), getCentralWidget());
+
+ m_tempoCheckBox = new QCheckBox(i18n("Tempo"), m_filterGroup);
+ m_timeSigCheckBox = new QCheckBox(i18n("Time Signature"), m_filterGroup);
+ m_grid->addWidget(m_filterGroup, 2, 0);
+
+ // Connect up
+ //
+ connect(m_filterGroup, SIGNAL(released(int)),
+ SLOT(slotModifyFilter(int)));
+
+ m_list = new KListView(getCentralWidget());
+ m_list->setItemsRenameable(true);
+
+ m_grid->addWidget(m_list, 2, 1);
+
+ updateViewCaption();
+
+ doc->getComposition().addObserver(this);
+
+ // Connect double clicker
+ //
+ connect(m_list, SIGNAL(doubleClicked(QListViewItem*)),
+ SLOT(slotPopupEditor(QListViewItem*)));
+
+ m_list->setAllColumnsShowFocus(true);
+ m_list->setSelectionMode(QListView::Extended);
+
+ m_list->addColumn(i18n("Time "));
+ m_list->addColumn(i18n("Type "));
+ m_list->addColumn(i18n("Value "));
+ m_list->addColumn(i18n("Properties "));
+
+ for (int col = 0; col < m_list->columns(); ++col)
+ m_list->setRenameable(col, true);
+
+ readOptions();
+ setButtonsToFilter();
+ applyLayout();
+
+ makeInitialSelection(openTime);
+
+ m_ignoreUpdates = false;
+ setOutOfCtor();
+}
+
+TempoView::~TempoView()
+{
+ if (!getDocument()->isBeingDestroyed() && !isCompositionDeleted()) {
+ getDocument()->getComposition().removeObserver(this);
+ }
+}
+
+void
+TempoView::closeEvent(QCloseEvent *e)
+{
+ emit closing();
+ EditViewBase::closeEvent(e);
+}
+
+void
+TempoView::tempoChanged(const Composition *comp)
+{
+ if (m_ignoreUpdates)
+ return ;
+ if (comp == &getDocument()->getComposition()) {
+ applyLayout();
+ }
+}
+
+void
+TempoView::timeSignatureChanged(const Composition *comp)
+{
+ if (m_ignoreUpdates)
+ return ;
+ if (comp == &getDocument()->getComposition()) {
+ applyLayout();
+ }
+}
+
+bool
+TempoView::applyLayout(int /*staffNo*/)
+{
+ // If no selection has already been set then we copy what's
+ // already set and try to replicate this after the rebuild
+ // of the view. This code borrowed from EventView.
+ //
+ if (m_listSelection.size() == 0) {
+ QPtrList<QListViewItem> selection = m_list->selectedItems();
+
+ if (selection.count()) {
+ QPtrListIterator<QListViewItem> it(selection);
+ QListViewItem *listItem;
+
+ while ((listItem = it.current()) != 0) {
+ m_listSelection.push_back(m_list->itemIndex(*it));
+ ++it;
+ }
+ }
+ }
+
+ // Ok, recreate list
+ //
+ m_list->clear();
+
+ Composition *comp = &getDocument()->getComposition();
+
+ m_config->setGroup(TempoViewConfigGroup);
+ int timeMode = m_config->readNumEntry("timemode", 0);
+
+ if (m_filter & TimeSignature) {
+ for (int i = 0; i < comp->getTimeSignatureCount(); ++i) {
+
+ std::pair<timeT, Rosegarden::TimeSignature> sig =
+ comp->getTimeSignatureChange(i);
+
+ QString properties;
+ if (sig.second.isHidden()) {
+ if (sig.second.isCommon())
+ properties = i18n("Common, hidden");
+ else
+ properties = i18n("Hidden");
+ } else {
+ if (sig.second.isCommon())
+ properties = i18n("Common");
+ }
+
+ QString timeString = makeTimeString(sig.first, timeMode);
+
+ new TempoListItem(comp, TempoListItem::TimeSignature,
+ sig.first, i, m_list, timeString,
+ i18n("Time Signature "),
+ QString("%1/%2 ").arg(sig.second.getNumerator()).
+ arg(sig.second.getDenominator()),
+ properties);
+ }
+ }
+
+ if (m_filter & Tempo) {
+ for (int i = 0; i < comp->getTempoChangeCount(); ++i) {
+
+ std::pair<timeT, tempoT> tempo =
+ comp->getTempoChange(i);
+
+ QString desc;
+
+ //!!! imprecise -- better to work from tempoT directly
+
+ float qpm = comp->getTempoQpm(tempo.second);
+ int qpmUnits = int(qpm + 0.001);
+ int qpmTenths = int((qpm - qpmUnits) * 10 + 0.001);
+ int qpmHundredths = int((qpm - qpmUnits - qpmTenths / 10.0) * 100 + 0.001);
+
+ Rosegarden::TimeSignature sig = comp->getTimeSignatureAt(tempo.first);
+ if (sig.getBeatDuration() ==
+ Note(Note::Crotchet).getDuration()) {
+ desc = i18n("%1.%2%3").
+ arg(qpmUnits).arg(qpmTenths).arg(qpmHundredths);
+ } else {
+ float bpm = (qpm *
+ Note(Note::Crotchet).getDuration()) /
+ sig.getBeatDuration();
+ int bpmUnits = int(bpm + 0.001);
+ int bpmTenths = int((bpm - bpmUnits) * 10 + 0.001);
+ int bpmHundredths = int((bpm - bpmUnits - bpmTenths / 10.0) * 100 + 0.001);
+
+ desc = i18n("%1.%2%3 qpm (%4.%5%6 bpm) ").
+ arg(qpmUnits).arg(qpmTenths).arg(qpmHundredths).
+ arg(bpmUnits).arg(bpmTenths).arg(bpmHundredths);
+ }
+
+ QString timeString = makeTimeString(tempo.first, timeMode);
+
+ new TempoListItem(comp, TempoListItem::Tempo,
+ tempo.first, i, m_list, timeString,
+ i18n("Tempo "),
+ desc);
+ }
+ }
+
+ if (m_list->childCount() == 0) {
+ new QListViewItem(m_list,
+ i18n("<nothing at this filter level>"));
+ m_list->setSelectionMode(QListView::NoSelection);
+ stateChanged("have_selection", KXMLGUIClient::StateReverse);
+ } else {
+ m_list->setSelectionMode(QListView::Extended);
+
+ // If no selection then select the first event
+ if (m_listSelection.size() == 0)
+ m_listSelection.push_back(0);
+ stateChanged("have_selection", KXMLGUIClient::StateNoReverse);
+ }
+
+ // Set a selection from a range of indexes
+ //
+ std::vector<int>::iterator sIt = m_listSelection.begin();
+ int index = 0;
+
+ for (; sIt != m_listSelection.end(); ++sIt) {
+ index = *sIt;
+
+ while (index > 0 && !m_list->itemAtIndex(index))
+ index--;
+
+ m_list->setSelected(m_list->itemAtIndex(index), true);
+ m_list->setCurrentItem(m_list->itemAtIndex(index));
+
+ // ensure visible
+ m_list->ensureItemVisible(m_list->itemAtIndex(index));
+ }
+
+ m_listSelection.clear();
+
+ return true;
+}
+
+void
+TempoView::makeInitialSelection(timeT time)
+{
+ m_listSelection.clear();
+
+ TempoListItem *goodItem = 0;
+ int goodItemNo = 0;
+
+ for (int i = 0; m_list->itemAtIndex(i); ++i) {
+
+ TempoListItem *item = dynamic_cast<TempoListItem *>
+ (m_list->itemAtIndex(i));
+
+ m_list->setSelected(item, false);
+
+ if (item) {
+ if (item->getTime() > time)
+ break;
+ goodItem = item;
+ goodItemNo = i;
+ }
+ }
+
+ if (goodItem) {
+ m_listSelection.push_back(goodItemNo);
+ m_list->setSelected(goodItem, true);
+ m_list->ensureItemVisible(goodItem);
+ }
+}
+
+Segment *
+TempoView::getCurrentSegment()
+{
+ if (m_segments.empty())
+ return 0;
+ else
+ return *m_segments.begin();
+}
+
+QString
+TempoView::makeTimeString(timeT time, int timeMode)
+{
+ switch (timeMode) {
+
+ case 0: // musical time
+ {
+ int bar, beat, fraction, remainder;
+ getDocument()->getComposition().getMusicalTimeForAbsoluteTime
+ (time, bar, beat, fraction, remainder);
+ ++bar;
+ return QString("%1%2%3-%4%5-%6%7-%8%9 ")
+ .arg(bar / 100)
+ .arg((bar % 100) / 10)
+ .arg(bar % 10)
+ .arg(beat / 10)
+ .arg(beat % 10)
+ .arg(fraction / 10)
+ .arg(fraction % 10)
+ .arg(remainder / 10)
+ .arg(remainder % 10);
+ }
+
+ case 1: // real time
+ {
+ RealTime rt =
+ getDocument()->getComposition().getElapsedRealTime(time);
+ // return QString("%1 ").arg(rt.toString().c_str());
+ return QString("%1 ").arg(rt.toText().c_str());
+ }
+
+ default:
+ return QString("%1 ").arg(time);
+ }
+}
+
+void
+TempoView::refreshSegment(Segment * /*segment*/,
+ timeT /*startTime*/,
+ timeT /*endTime*/)
+{
+ RG_DEBUG << "TempoView::refreshSegment" << endl;
+ applyLayout(0);
+}
+
+void
+TempoView::updateView()
+{
+ m_list->update();
+}
+
+void
+TempoView::slotEditCut()
+{
+ // not implemented yet -- can't use traditional clipboard (which
+ // only holds events from segments, or segments)
+}
+
+void
+TempoView::slotEditCopy()
+{
+ // likewise
+}
+
+void
+TempoView::slotEditPaste()
+{
+ // likewise
+}
+
+void
+TempoView::slotEditDelete()
+{
+ QPtrList<QListViewItem> selection = m_list->selectedItems();
+ if (selection.count() == 0)
+ return ;
+
+ RG_DEBUG << "TempoView::slotEditDelete - deleting "
+ << selection.count() << " items" << endl;
+
+ QPtrListIterator<QListViewItem> it(selection);
+ QListViewItem *listItem;
+ TempoListItem *item;
+ int itemIndex = -1;
+
+ m_ignoreUpdates = true;
+ bool haveSomething = false;
+
+ // We want the Remove commands to be in reverse order, because
+ // removing one item by index will affect the indices of
+ // subsequent items. So we'll stack them onto here and then pull
+ // them off again.
+ std::vector<KCommand *> commands;
+
+ while ((listItem = it.current()) != 0) {
+ item = dynamic_cast<TempoListItem*>((*it));
+
+ if (itemIndex == -1)
+ itemIndex = m_list->itemIndex(*it);
+
+ if (item) {
+ if (item->getType() == TempoListItem::TimeSignature) {
+ commands.push_back(new RemoveTimeSignatureCommand
+ (item->getComposition(),
+ item->getIndex()));
+ haveSomething = true;
+ } else {
+ commands.push_back(new RemoveTempoChangeCommand
+ (item->getComposition(),
+ item->getIndex()));
+ haveSomething = true;
+ }
+ }
+ ++it;
+ }
+
+ if (haveSomething) {
+ KMacroCommand *command = new KMacroCommand
+ (i18n("Delete Tempo or Time Signature"));
+ for (std::vector<KCommand *>::iterator i = commands.end();
+ i != commands.begin();) {
+ command->addCommand(*--i);
+ }
+ addCommandToHistory(command);
+ }
+
+ applyLayout();
+ m_ignoreUpdates = false;
+}
+
+void
+TempoView::slotEditInsertTempo()
+{
+ timeT insertTime = 0;
+ QPtrList<QListViewItem> selection = m_list->selectedItems();
+
+ if (selection.count() > 0) {
+ TempoListItem *item =
+ dynamic_cast<TempoListItem*>(selection.getFirst());
+ if (item)
+ insertTime = item->getTime();
+ }
+
+ TempoDialog dialog(this, getDocument(), true);
+ dialog.setTempoPosition(insertTime);
+
+ connect(&dialog,
+ SIGNAL(changeTempo(timeT,
+ tempoT,
+ tempoT,
+ TempoDialog::TempoDialogAction)),
+ this,
+ SIGNAL(changeTempo(timeT,
+ tempoT,
+ tempoT,
+ TempoDialog::TempoDialogAction)));
+
+ dialog.exec();
+}
+
+void
+TempoView::slotEditInsertTimeSignature()
+{
+ timeT insertTime = 0;
+ QPtrList<QListViewItem> selection = m_list->selectedItems();
+
+ if (selection.count() > 0) {
+ TempoListItem *item =
+ dynamic_cast<TempoListItem*>(selection.getFirst());
+ if (item)
+ insertTime = item->getTime();
+ }
+
+ Composition &composition(m_doc->getComposition());
+ Rosegarden::TimeSignature sig = composition.getTimeSignatureAt(insertTime);
+
+ TimeSignatureDialog dialog(this, &composition, insertTime, sig, true);
+
+ if (dialog.exec() == QDialog::Accepted) {
+
+ insertTime = dialog.getTime();
+
+ if (dialog.shouldNormalizeRests()) {
+ addCommandToHistory
+ (new AddTimeSignatureAndNormalizeCommand
+ (&composition, insertTime, dialog.getTimeSignature()));
+ } else {
+ addCommandToHistory
+ (new AddTimeSignatureCommand
+ (&composition, insertTime, dialog.getTimeSignature()));
+ }
+ }
+}
+
+void
+TempoView::slotEdit()
+{
+ RG_DEBUG << "TempoView::slotEdit" << endl;
+
+ QPtrList<QListViewItem> selection = m_list->selectedItems();
+
+ if (selection.count() > 0) {
+ TempoListItem *item =
+ dynamic_cast<TempoListItem*>(selection.getFirst());
+ if (item)
+ slotPopupEditor(item);
+ }
+}
+
+void
+TempoView::slotSelectAll()
+{
+ m_listSelection.clear();
+ for (int i = 0; m_list->itemAtIndex(i); ++i) {
+ m_listSelection.push_back(i);
+ m_list->setSelected(m_list->itemAtIndex(i), true);
+ }
+}
+
+void
+TempoView::slotClearSelection()
+{
+ m_listSelection.clear();
+ for (int i = 0; m_list->itemAtIndex(i); ++i) {
+ m_list->setSelected(m_list->itemAtIndex(i), false);
+ }
+}
+
+void
+TempoView::setupActions()
+{
+ EditViewBase::setupActions("tempoview.rc", false);
+
+ QString pixmapDir = KGlobal::dirs()->findResource("appdata", "pixmaps/");
+ QIconSet icon(QPixmap(pixmapDir + "/toolbar/event-insert-tempo.png"));
+
+ new KAction(AddTempoChangeCommand::getGlobalName(), icon, Key_I, this,
+ SLOT(slotEditInsertTempo()), actionCollection(),
+ "insert_tempo");
+
+ QCanvasPixmap pixmap(pixmapDir + "/toolbar/event-insert-timesig.png");
+ icon = QIconSet(pixmap);
+
+ new KAction(AddTimeSignatureCommand::getGlobalName(), icon, Key_G, this,
+ SLOT(slotEditInsertTimeSignature()), actionCollection(),
+ "insert_timesig");
+
+ pixmap.load(pixmapDir + "/toolbar/event-delete.png");
+ icon = QIconSet(pixmap);
+
+ new KAction(i18n("&Delete"), icon, Key_Delete, this,
+ SLOT(slotEditDelete()), actionCollection(),
+ "delete");
+
+ pixmap.load(pixmapDir + "/toolbar/event-edit.png");
+ icon = QIconSet(pixmap);
+
+ new KAction(i18n("&Edit Item"), icon, Key_E, this,
+ SLOT(slotEdit()), actionCollection(),
+ "edit");
+
+ new KAction(i18n("Select &All"), 0, this,
+ SLOT(slotSelectAll()), actionCollection(),
+ "select_all");
+
+ new KAction(i18n("Clear Selection"), Key_Escape, this,
+ SLOT(slotClearSelection()), actionCollection(),
+ "clear_selection");
+
+ m_config->setGroup(TempoViewConfigGroup);
+ int timeMode = m_config->readNumEntry("timemode", 0);
+
+ KRadioAction *action;
+
+ pixmap.load(pixmapDir + "/toolbar/time-musical.png");
+ icon = QIconSet(pixmap);
+
+ action = new KRadioAction(i18n("&Musical Times"), icon, 0, this,
+ SLOT(slotMusicalTime()),
+ actionCollection(), "time_musical");
+ action->setExclusiveGroup("timeMode");
+ if (timeMode == 0)
+ action->setChecked(true);
+
+ pixmap.load(pixmapDir + "/toolbar/time-real.png");
+ icon = QIconSet(pixmap);
+
+ action = new KRadioAction(i18n("&Real Times"), icon, 0, this,
+ SLOT(slotRealTime()),
+ actionCollection(), "time_real");
+ action->setExclusiveGroup("timeMode");
+ if (timeMode == 1)
+ action->setChecked(true);
+
+ pixmap.load(pixmapDir + "/toolbar/time-raw.png");
+ icon = QIconSet(pixmap);
+
+ action = new KRadioAction(i18n("Ra&w Times"), icon, 0, this,
+ SLOT(slotRawTime()),
+ actionCollection(), "time_raw");
+ action->setExclusiveGroup("timeMode");
+ if (timeMode == 2)
+ action->setChecked(true);
+
+ createGUI(getRCFileName());
+}
+
+void
+TempoView::initStatusBar()
+{
+ KStatusBar* sb = statusBar();
+
+ sb->insertItem(KTmpStatusMsg::getDefaultMsg(),
+ KTmpStatusMsg::getDefaultId(), 1);
+ sb->setItemAlignment(KTmpStatusMsg::getDefaultId(),
+ AlignLeft | AlignVCenter);
+}
+
+QSize
+TempoView::getViewSize()
+{
+ return m_list->size();
+}
+
+void
+TempoView::setViewSize(QSize s)
+{
+ m_list->setFixedSize(s);
+}
+
+void
+TempoView::readOptions()
+{
+ m_config->setGroup(TempoViewConfigGroup);
+ EditViewBase::readOptions();
+ m_filter = m_config->readNumEntry("filter", m_filter);
+ m_list->restoreLayout(m_config, TempoViewLayoutConfigGroupName);
+}
+
+void
+TempoView::slotSaveOptions()
+{
+ m_config->setGroup(TempoViewConfigGroup);
+ m_config->writeEntry("filter", m_filter);
+ m_list->saveLayout(m_config, TempoViewLayoutConfigGroupName);
+}
+
+void
+TempoView::slotModifyFilter(int button)
+{
+ QCheckBox *checkBox = dynamic_cast<QCheckBox*>(m_filterGroup->find(button));
+
+ if (checkBox == 0)
+ return ;
+
+ if (checkBox->isChecked()) {
+ switch (button) {
+ case 0:
+ m_filter |= Tempo;
+ break;
+
+ case 1:
+ m_filter |= TimeSignature;
+ break;
+
+ default:
+ break;
+ }
+
+ } else {
+ switch (button) {
+ case 0:
+ m_filter ^= Tempo;
+ break;
+
+ case 1:
+ m_filter ^= TimeSignature;
+ break;
+
+ default:
+ break;
+ }
+ }
+
+ m_lastSetFilter = m_filter;
+
+ applyLayout(0);
+}
+
+void
+TempoView::setButtonsToFilter()
+{
+ if (m_filter & Tempo)
+ m_tempoCheckBox->setChecked(true);
+ else
+ m_tempoCheckBox->setChecked(false);
+
+ if (m_filter & TimeSignature)
+ m_timeSigCheckBox->setChecked(true);
+ else
+ m_timeSigCheckBox->setChecked(false);
+}
+
+void
+TempoView::slotMusicalTime()
+{
+ m_config->setGroup(TempoViewConfigGroup);
+ m_config->writeEntry("timemode", 0);
+ applyLayout();
+}
+
+void
+TempoView::slotRealTime()
+{
+ m_config->setGroup(TempoViewConfigGroup);
+ m_config->writeEntry("timemode", 1);
+ applyLayout();
+}
+
+void
+TempoView::slotRawTime()
+{
+ m_config->setGroup(TempoViewConfigGroup);
+ m_config->writeEntry("timemode", 2);
+ applyLayout();
+}
+
+void
+TempoView::slotPopupEditor(QListViewItem *qitem)
+{
+ TempoListItem *item = dynamic_cast<TempoListItem *>(qitem);
+ if (!item)
+ return ;
+
+ timeT time = item->getTime();
+
+ switch (item->getType()) {
+
+ case TempoListItem::Tempo:
+ {
+ TempoDialog dialog(this, getDocument(), true);
+ dialog.setTempoPosition(time);
+
+ connect(&dialog,
+ SIGNAL(changeTempo(timeT,
+ tempoT,
+ tempoT,
+ TempoDialog::TempoDialogAction)),
+ this,
+ SIGNAL(changeTempo(timeT,
+ tempoT,
+ tempoT,
+ TempoDialog::TempoDialogAction)));
+
+ dialog.exec();
+ break;
+ }
+
+ case TempoListItem::TimeSignature:
+ {
+ Composition &composition(getDocument()->getComposition());
+ Rosegarden::TimeSignature sig = composition.getTimeSignatureAt(time);
+
+ TimeSignatureDialog dialog(this, &composition, time, sig, true);
+
+ if (dialog.exec() == QDialog::Accepted) {
+
+ time = dialog.getTime();
+
+ if (dialog.shouldNormalizeRests()) {
+ addCommandToHistory
+ (new AddTimeSignatureAndNormalizeCommand
+ (&composition, time, dialog.getTimeSignature()));
+ } else {
+ addCommandToHistory
+ (new AddTimeSignatureCommand
+ (&composition, time, dialog.getTimeSignature()));
+ }
+ }
+ }
+
+ default:
+ break;
+ }
+}
+
+void
+TempoView::updateViewCaption()
+{
+ setCaption(i18n("%1 - Tempo and Time Signature Editor")
+ .arg(getDocument()->getTitle()));
+}
+
+}
+#include "TempoView.moc"
diff --git a/src/gui/editors/tempo/TempoView.h b/src/gui/editors/tempo/TempoView.h
new file mode 100644
index 0000000..9a78e1b
--- /dev/null
+++ b/src/gui/editors/tempo/TempoView.h
@@ -0,0 +1,172 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_TEMPOVIEW_H_
+#define _RG_TEMPOVIEW_H_
+
+#include "base/Composition.h"
+#include "base/NotationTypes.h"
+#include "gui/dialogs/TempoDialog.h"
+#include "gui/general/EditViewBase.h"
+#include <qsize.h>
+#include <qstring.h>
+#include <vector>
+#include "base/Event.h"
+
+
+class QWidget;
+class QListViewItem;
+class QCloseEvent;
+class QCheckBox;
+class QButtonGroup;
+class KListView;
+
+
+namespace Rosegarden
+{
+
+class Segment;
+class RosegardenGUIDoc;
+class Composition;
+
+
+/**
+ * Tempo and time signature list-style editor. This has some code
+ * in common with EventView, but not enough to make them any more
+ * shareable than simply through EditViewBase. Hopefully this one
+ * should prove considerably simpler, anyway.
+ */
+
+class TempoView : public EditViewBase, public CompositionObserver
+{
+ Q_OBJECT
+
+ enum Filter
+ {
+ None = 0x0000,
+ Tempo = 0x0001,
+ TimeSignature = 0x0002
+ };
+
+public:
+ TempoView(RosegardenGUIDoc *doc, QWidget *parent, timeT);
+ virtual ~TempoView();
+
+ virtual bool applyLayout(int staffNo = -1);
+
+ virtual void refreshSegment(Segment *segment,
+ timeT startTime = 0,
+ timeT endTime = 0);
+
+ virtual void updateView();
+
+ virtual void setupActions();
+ virtual void initStatusBar();
+ virtual QSize getViewSize();
+ virtual void setViewSize(QSize);
+
+ // Set the button states to the current filter positions
+ //
+ void setButtonsToFilter();
+
+ // Menu creation and show
+ //
+ void createMenu();
+
+ // Composition Observer callbacks
+ //
+ virtual void timeSignatureChanged(const Composition *);
+ virtual void tempoChanged(const Composition *);
+
+signals:
+ // forwarded from tempo dialog:
+ void changeTempo(timeT, // tempo change time
+ tempoT, // tempo value
+ tempoT, // tempo target
+ TempoDialog::TempoDialogAction); // tempo action
+
+ void closing();
+
+public slots:
+ // standard slots
+ virtual void slotEditCut();
+ virtual void slotEditCopy();
+ virtual void slotEditPaste();
+
+ // other edit slots
+ void slotEditDelete();
+ void slotEditInsertTempo();
+ void slotEditInsertTimeSignature();
+ void slotEdit();
+
+ void slotSelectAll();
+ void slotClearSelection();
+
+ void slotMusicalTime();
+ void slotRealTime();
+ void slotRawTime();
+
+ // on double click on the event list
+ //
+ void slotPopupEditor(QListViewItem*);
+
+ // Change filter parameters
+ //
+ void slotModifyFilter(int);
+
+protected slots:
+
+ virtual void slotSaveOptions();
+
+protected:
+
+ virtual void readOptions();
+ void makeInitialSelection(timeT);
+ QString makeTimeString(timeT time, int timeMode);
+ virtual Segment *getCurrentSegment();
+ virtual void updateViewCaption();
+
+ virtual void closeEvent(QCloseEvent *);
+
+ //--------------- Data members ---------------------------------
+ KListView *m_list;
+ int m_filter;
+
+ static int m_lastSetFilter;
+
+ QButtonGroup *m_filterGroup;
+ QCheckBox *m_tempoCheckBox;
+ QCheckBox *m_timeSigCheckBox;
+
+ std::vector<int> m_listSelection;
+
+ bool m_ignoreUpdates;
+};
+
+
+
+}
+
+#endif
diff --git a/src/gui/general/ActiveItem.cpp b/src/gui/general/ActiveItem.cpp
new file mode 100644
index 0000000..00d967f
--- /dev/null
+++ b/src/gui/general/ActiveItem.cpp
@@ -0,0 +1,32 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "ActiveItem.h"
+
+
+
+namespace Rosegarden
+{
+}
diff --git a/src/gui/general/ActiveItem.h b/src/gui/general/ActiveItem.h
new file mode 100644
index 0000000..f8f5339
--- /dev/null
+++ b/src/gui/general/ActiveItem.h
@@ -0,0 +1,55 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_ACTIVEITEM_H_
+#define _RG_ACTIVEITEM_H_
+
+
+
+class QMouseEvent;
+
+
+namespace Rosegarden
+{
+
+
+
+/**
+ * An interface for canvas items which are capable of handling
+ * mouse events
+ */
+class ActiveItem
+{
+public:
+ virtual void handleMousePress(QMouseEvent*) = 0;
+ virtual void handleMouseMove(QMouseEvent*) = 0;
+ virtual void handleMouseRelease(QMouseEvent*) = 0;
+};
+
+
+
+}
+
+#endif
diff --git a/src/gui/general/BarLine.cpp b/src/gui/general/BarLine.cpp
new file mode 100644
index 0000000..42bb936
--- /dev/null
+++ b/src/gui/general/BarLine.cpp
@@ -0,0 +1,165 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include "BarLine.h"
+
+#include <qpainter.h>
+
+namespace Rosegarden {
+
+void
+BarLine::drawShape(QPainter &painter)
+{
+ int bx = int(x());
+ int by = int(y());
+
+ switch (m_style) {
+
+ case LinedStaff::PlainBar:
+ painter.drawRect(bx, by, m_baseBarThickness, m_barLineHeight);
+ break;
+
+ case LinedStaff::DoubleBar:
+ painter.drawRect(bx, by, m_baseBarThickness, m_barLineHeight);
+ painter.drawRect(bx + m_baseBarThickness * 3, by,
+ m_baseBarThickness, m_barLineHeight);
+ break;
+
+ case LinedStaff::HeavyDoubleBar:
+ bx -= m_baseBarThickness * 5;
+ painter.drawRect(bx, by, m_baseBarThickness, m_barLineHeight);
+ painter.drawRect(bx + m_baseBarThickness * 3, by,
+ m_baseBarThickness * 3, m_barLineHeight);
+ break;
+
+ case LinedStaff::RepeatEndBar:
+ bx -= m_baseBarThickness * 5 + m_lineSpacing * 2 / 3;
+ painter.drawEllipse(bx, by + m_barLineHeight / 2 - (m_lineSpacing * 2 / 3),
+ m_lineSpacing / 3, m_lineSpacing / 3);
+ painter.drawEllipse(bx, by + m_barLineHeight / 2 + (m_lineSpacing / 3),
+ m_lineSpacing / 3, m_lineSpacing / 3);
+ bx += m_lineSpacing * 2 / 3;
+ painter.drawRect(bx, by, m_baseBarThickness, m_barLineHeight);
+ painter.drawRect(bx + m_baseBarThickness * 3, by,
+ m_baseBarThickness * 3, m_barLineHeight);
+ break;
+
+ case LinedStaff::RepeatStartBar:
+
+ if (m_inset > 0) {
+ painter.drawRect(bx, by, m_baseBarThickness, m_barLineHeight);
+ bx += m_inset;
+ }
+
+ painter.drawRect(bx, by, m_baseBarThickness * 3, m_barLineHeight);
+ painter.drawRect(bx + m_baseBarThickness * 5, by,
+ m_baseBarThickness, m_barLineHeight);
+ bx += m_baseBarThickness * 6 + (m_lineSpacing / 3);
+ painter.drawEllipse(bx, by + m_barLineHeight / 2 - (m_lineSpacing * 2 / 3),
+ m_lineSpacing / 3, m_lineSpacing / 3);
+ painter.drawEllipse(bx, by + m_barLineHeight / 2 + (m_lineSpacing / 3),
+ m_lineSpacing / 3, m_lineSpacing / 3);
+ break;
+
+ case LinedStaff::RepeatBothBar:
+
+ if (m_inset > 0) {
+ painter.drawRect(bx, by, m_baseBarThickness, m_barLineHeight);
+ bx += m_inset;
+ }
+
+ bx -= m_baseBarThickness * 4 + m_lineSpacing * 2 / 3;
+ painter.drawEllipse(bx, by + m_barLineHeight / 2 - (m_lineSpacing * 2 / 3),
+ m_lineSpacing / 3, m_lineSpacing / 3);
+ painter.drawEllipse(bx, by + m_barLineHeight / 2 + (m_lineSpacing / 3),
+ m_lineSpacing / 3, m_lineSpacing / 3);
+ bx += m_lineSpacing * 2 / 3;
+ painter.drawRect(bx, by, m_baseBarThickness, m_barLineHeight);
+ painter.drawRect(bx + m_baseBarThickness * 3, by,
+ m_baseBarThickness * 3, m_barLineHeight);
+ painter.drawRect(bx + m_baseBarThickness * 8, by,
+ m_baseBarThickness, m_barLineHeight);
+ bx += m_baseBarThickness * 9 + (m_lineSpacing / 3);
+ painter.drawEllipse(bx, by + m_barLineHeight / 2 - (m_lineSpacing * 2 / 3),
+ m_lineSpacing / 3, m_lineSpacing / 3);
+ painter.drawEllipse(bx, by + m_barLineHeight / 2 + (m_lineSpacing / 3),
+ m_lineSpacing / 3, m_lineSpacing / 3);
+
+ break;
+
+ case LinedStaff::NoVisibleBar:
+ break;
+ }
+}
+
+QPointArray
+BarLine::areaPoints() const
+{
+ int bx = int(x());
+ int by = int(y());
+ int x0 = bx, y0 = by, x1, y1 = by + m_barLineHeight;
+
+ switch (m_style) {
+
+ case LinedStaff::PlainBar:
+ x1 = x0 + m_baseBarThickness;
+ break;
+
+ case LinedStaff::DoubleBar:
+ x1 = x0 + m_baseBarThickness * 4;
+ break;
+
+ case LinedStaff::HeavyDoubleBar:
+ x0 -= m_baseBarThickness * 6;
+ x1 = bx;
+ break;
+
+ case LinedStaff::RepeatEndBar:
+ x0 -= m_baseBarThickness * 6 + m_lineSpacing * 2 / 3;
+ x1 = bx;
+ break;
+
+ case LinedStaff::RepeatStartBar:
+ x1 = x0 + m_baseBarThickness * 6 + m_lineSpacing * 2 / 3 + m_inset;
+ break;
+
+ case LinedStaff::RepeatBothBar:
+ x0 -= m_baseBarThickness * 4 + m_lineSpacing * 2 / 3;
+ x1 = x0 + m_baseBarThickness * 9 + m_lineSpacing * 2 / 3 + m_inset;
+ break;
+
+ case LinedStaff::NoVisibleBar:
+ x1 = x0 + 1;
+ break;
+ }
+
+ QPointArray p(4);
+ p[0] = QPoint(x0, y0);
+ p[1] = QPoint(x1, y0);
+ p[2] = QPoint(x1, y1);
+ p[3] = QPoint(x0, y1);
+ return p;
+}
+
+}
diff --git a/src/gui/general/BarLine.h b/src/gui/general/BarLine.h
new file mode 100644
index 0000000..124bc06
--- /dev/null
+++ b/src/gui/general/BarLine.h
@@ -0,0 +1,64 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_BARLINE_H_
+#define _RG_BARLINE_H_
+
+#include "LinedStaff.h"
+#include <qcanvas.h>
+
+namespace Rosegarden {
+
+class BarLine : public QCanvasPolygonalItem
+{
+public:
+ BarLine(QCanvas *canvas, double layoutX,
+ int barLineHeight, int baseBarThickness, int lineSpacing,
+ int inset, LinedStaff::BarStyle style) :
+ QCanvasPolygonalItem(canvas),
+ m_layoutX(layoutX),
+ m_barLineHeight(barLineHeight),
+ m_baseBarThickness(baseBarThickness),
+ m_lineSpacing(lineSpacing),
+ m_inset(inset),
+ m_style(style) { }
+
+ double getLayoutX() const { return m_layoutX; }
+
+ virtual QPointArray areaPoints() const;
+ virtual void drawShape(QPainter &);
+
+protected:
+ double m_layoutX;
+ int m_barLineHeight;
+ int m_baseBarThickness;
+ int m_lineSpacing;
+ int m_inset;
+ LinedStaff::BarStyle m_style;
+};
+
+}
+
+#endif /*BARLINE_H_*/
diff --git a/src/gui/general/BaseTool.cpp b/src/gui/general/BaseTool.cpp
new file mode 100644
index 0000000..4c33610
--- /dev/null
+++ b/src/gui/general/BaseTool.cpp
@@ -0,0 +1,89 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "BaseTool.h"
+
+#include "misc/Debug.h"
+#include <kxmlguifactory.h>
+#include <qcursor.h>
+#include <qobject.h>
+#include <qpopupmenu.h>
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+BaseTool::BaseTool(const QString& menuName, KXMLGUIFactory* factory, QObject* parent)
+ : QObject(parent),
+ m_menuName(menuName),
+ m_menu(0),
+ m_parentFactory(factory)
+{}
+
+BaseTool::~BaseTool()
+{
+ RG_DEBUG << "BaseTool::~BaseTool()\n";
+
+ // delete m_menu;
+ // m_parentView->factory()->removeClient(this);
+ // m_instance = 0;
+}
+
+void BaseTool::ready()
+{}
+
+void BaseTool::stow()
+{}
+
+void BaseTool::showMenu()
+{
+ if (!hasMenu())
+ return ;
+
+ if (!m_menu)
+ createMenu();
+
+ if (m_menu)
+ m_menu->exec(QCursor::pos());
+ else
+ RG_DEBUG << "BaseTool::showMenu() : no menu to show\n";
+}
+
+QString BaseTool::getCurrentContextHelp() const
+{
+ return m_contextHelp;
+}
+
+void BaseTool::setContextHelp(const QString &help)
+{
+ m_contextHelp = help;
+ emit showContextHelp(m_contextHelp);
+}
+
+}
+
+#include "BaseTool.moc"
+
diff --git a/src/gui/general/BaseTool.h b/src/gui/general/BaseTool.h
new file mode 100644
index 0000000..71e6410
--- /dev/null
+++ b/src/gui/general/BaseTool.h
@@ -0,0 +1,112 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_BASETOOL_H_
+#define _RG_BASETOOL_H_
+
+#include <qobject.h>
+#include <qstring.h>
+
+
+class QPopupMenu;
+class KXMLGUIFactory;
+
+
+namespace Rosegarden
+{
+
+
+
+/**
+ * BaseTool : base tool class, just handles RMB menu creation and
+ * handling by a BaseToolBox
+ *
+ */
+class BaseTool : public QObject
+{
+ Q_OBJECT
+
+ friend class BaseToolBox;
+
+public:
+
+ virtual ~BaseTool();
+
+ /**
+ * Is called by the parent View (EditView or SegmentCanvas) when
+ * the tool is set as current.
+ * Add any setup here (e.g. setting the mouse cursor shape)
+ */
+ virtual void ready();
+
+ /**
+ * Is called by the parent View (EditView or SegmentCanvas) after
+ * the tool is put away.
+ * Add any cleanup here
+ */
+ virtual void stow();
+
+ /**
+ * Show the menu if there is one
+ */
+ virtual void showMenu();
+
+ /**
+ * Retrieve current status-line type help for the tool, if any
+ */
+ virtual QString getCurrentContextHelp() const;
+
+signals:
+ void showContextHelp(const QString &);
+
+protected:
+ /**
+ * Create a new BaseTool
+ *
+ * \a menuName : the name of the menu defined in the XML rc file
+ */
+ BaseTool(const QString& menuName, KXMLGUIFactory*, QObject* parent);
+
+ virtual void createMenu() = 0;
+ virtual bool hasMenu() { return false; }
+
+ virtual void setContextHelp(const QString &help);
+ virtual void clearContextHelp() { setContextHelp(""); }
+
+ //--------------- Data members ---------------------------------
+
+ QString m_menuName;
+ QPopupMenu* m_menu;
+
+ KXMLGUIFactory* m_parentFactory;
+
+ QString m_contextHelp;
+};
+
+
+
+}
+
+#endif
diff --git a/src/gui/general/BaseToolBox.cpp b/src/gui/general/BaseToolBox.cpp
new file mode 100644
index 0000000..9e2fda9
--- /dev/null
+++ b/src/gui/general/BaseToolBox.cpp
@@ -0,0 +1,58 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "BaseToolBox.h"
+
+#include "BaseTool.h"
+#include <qobject.h>
+#include <qstring.h>
+#include <qwidget.h>
+
+
+namespace Rosegarden
+{
+
+BaseToolBox::BaseToolBox(QWidget* parent)
+ : QObject(parent),
+ m_tools(17, // default size, from the Qt docs
+ false) // but we want it to be case insensitive
+{
+ //m_tools.setAutoDelete(true);
+}
+
+BaseTool* BaseToolBox::getTool(const QString& toolName)
+{
+ BaseTool* tool = m_tools[toolName];
+
+ if (!tool) tool = createTool(toolName);
+
+ connect(tool, SIGNAL(showContextHelp(const QString &)),
+ this, SIGNAL(showContextHelp(const QString &)));
+
+ return tool;
+}
+
+}
+#include "BaseToolBox.moc"
diff --git a/src/gui/general/BaseToolBox.h b/src/gui/general/BaseToolBox.h
new file mode 100644
index 0000000..2a0242f
--- /dev/null
+++ b/src/gui/general/BaseToolBox.h
@@ -0,0 +1,69 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_BASETOOLBOX_H_
+#define _RG_BASETOOLBOX_H_
+
+#include <qdict.h>
+#include <qobject.h>
+
+
+class QWidget;
+class QString;
+
+
+namespace Rosegarden
+{
+
+class BaseTool;
+
+
+/**
+ * BaseToolBox : maintains a single instance of each registered tool
+ *
+ * Tools are fetched from a name
+ */
+class BaseToolBox : public QObject
+{
+ Q_OBJECT
+
+public:
+ BaseToolBox(QWidget* parent);
+
+ virtual BaseTool* getTool(const QString& toolName);
+
+signals:
+ void showContextHelp(const QString &);
+
+protected:
+ virtual BaseTool* createTool(const QString& toolName) = 0;
+
+ QDict<BaseTool> m_tools;
+};
+
+
+}
+
+#endif
diff --git a/src/gui/general/CanvasCursor.cpp b/src/gui/general/CanvasCursor.cpp
new file mode 100644
index 0000000..5f04794
--- /dev/null
+++ b/src/gui/general/CanvasCursor.cpp
@@ -0,0 +1,52 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "CanvasCursor.h"
+
+#include "GUIPalette.h"
+#include <qcanvas.h>
+#include <qpen.h>
+
+
+namespace Rosegarden
+{
+
+CanvasCursor::CanvasCursor(QCanvas* c, int width)
+ : QCanvasRectangle(c),
+ m_width(width)
+{
+ QPen pen(GUIPalette::getColour(GUIPalette::Pointer));
+ // pen.setWidth(width);
+ setPen(pen);
+ setBrush(GUIPalette::getColour(GUIPalette::Pointer));
+}
+
+void CanvasCursor::updateHeight()
+{
+ setSize(m_width, canvas()->height());
+ // setPoints(0, 0, 0, canvas()->height());
+}
+
+}
diff --git a/src/gui/general/CanvasCursor.h b/src/gui/general/CanvasCursor.h
new file mode 100644
index 0000000..694e9df
--- /dev/null
+++ b/src/gui/general/CanvasCursor.h
@@ -0,0 +1,55 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_CANVASCURSOR_H_
+#define _RG_CANVASCURSOR_H_
+
+
+#include <qcanvas.h>
+
+class QCanvas;
+
+
+namespace Rosegarden
+{
+
+
+
+class CanvasCursor : public QCanvasRectangle
+{
+public:
+ CanvasCursor(QCanvas*, int width);
+ void updateHeight();
+// virtual QRect boundingRect() const;
+protected:
+ int m_width;
+};
+
+
+
+
+}
+
+#endif
diff --git a/src/gui/general/CanvasItemGC.cpp b/src/gui/general/CanvasItemGC.cpp
new file mode 100644
index 0000000..6e6afb2
--- /dev/null
+++ b/src/gui/general/CanvasItemGC.cpp
@@ -0,0 +1,64 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "CanvasItemGC.h"
+
+#include "misc/Debug.h"
+
+#include <qcanvas.h>
+
+namespace Rosegarden
+{
+
+void CanvasItemGC::mark(QCanvasItem* item)
+{
+ if (!item)
+ return ;
+
+ item->hide();
+ // RG_DEBUG << "CanvasItemGC::mark() : "
+ // << item << std::endl;
+ m_garbage.push_back(item);
+}
+
+void CanvasItemGC::gc()
+{
+ for (unsigned int i = 0; i < m_garbage.size(); ++i) {
+ // RG_DEBUG << "CanvasItemGC::gc() : delete "
+ // << m_garbage[i] << "\n";
+ delete m_garbage[i];
+ }
+
+ m_garbage.clear();
+}
+
+void CanvasItemGC::flush()
+{
+ m_garbage.clear();
+}
+
+std::vector<QCanvasItem*> CanvasItemGC::m_garbage;
+
+}
diff --git a/src/gui/general/CanvasItemGC.h b/src/gui/general/CanvasItemGC.h
new file mode 100644
index 0000000..db1833b
--- /dev/null
+++ b/src/gui/general/CanvasItemGC.h
@@ -0,0 +1,85 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_CANVASITEMGC_H_
+#define _RG_CANVASITEMGC_H_
+
+#include <vector>
+
+
+class QCanvasItem;
+
+
+namespace Rosegarden
+{
+
+
+
+/**
+ * A pseudo GC in which CanvasItems whose ownership isn't clear cut
+ * can be put for periodical removal.
+ *
+ * This is especially for SegmentItems which can put their repeat
+ * rectangles when they're being deleted.
+ *
+ * The problem this solves is a classic ownership/double deletion
+ * case. The SegmentCanvas deletes all its items on destruction. But
+ * the SegmentItems have an auxiliary "repeat rectangle" which is a
+ * QCanvasRectangle, that needs to be deleted when the SegmentItem is
+ * itself deleted.
+ *
+ * However, if the SegmentItem deletes its repeat rectangle, then when
+ * the SegmentCanvas destruction occurs, the SegmentCanvas dtor will
+ * get a list of all its children (QCanvas::allItems()), containing
+ * both SegmentItems and their repeat rectangles. Deleting a
+ * SegmentItem will delete its repeat rectangle, which will still be
+ * present in the all children list which the SegmentCanvas dtor is
+ * iterating over.
+ *
+ * So a solution is simply to push to-be-deleted repeat rectangles on
+ * this GC, which should be processed on canvas updates, for instance.
+ *
+ */
+class CanvasItemGC
+{
+public:
+ /// mark the given item for GC
+ static void mark(QCanvasItem*);
+
+ /// GC all marked items
+ static void gc();
+
+ /// Forget all marked items - don't delete them
+ static void flush();
+
+protected:
+ static std::vector<QCanvasItem*> m_garbage;
+};
+
+
+
+}
+
+#endif
diff --git a/src/gui/general/CategoryElement.cpp b/src/gui/general/CategoryElement.cpp
new file mode 100644
index 0000000..2199ce6
--- /dev/null
+++ b/src/gui/general/CategoryElement.cpp
@@ -0,0 +1,61 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "CategoryElement.h"
+
+#include "misc/Debug.h"
+#include "PresetElement.h"
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+CategoryElement::CategoryElement(QString name) :
+ m_name(name)
+{}
+
+CategoryElement::~CategoryElement()
+{
+ // nothing to do
+}
+
+void
+CategoryElement::addPreset(QString name,
+ int clef,
+ int transpose,
+ int highAm,
+ int lowAm,
+ int highPro,
+ int lowPro)
+{
+ RG_DEBUG << "CategoryElement::addPreset(...): adding new PresetElement" << endl;
+
+ PresetElement e(name, clef, transpose, highAm, lowAm,
+ highPro, lowPro);
+ m_categoryPresets.push_back(e);
+}
+
+}
diff --git a/src/gui/general/CategoryElement.h b/src/gui/general/CategoryElement.h
new file mode 100644
index 0000000..eeb88a5
--- /dev/null
+++ b/src/gui/general/CategoryElement.h
@@ -0,0 +1,71 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_CATEGORYELEMENT_H_
+#define _RG_CATEGORYELEMENT_H_
+
+#include "PresetElement.h"
+#include <qstring.h>
+
+
+
+
+namespace Rosegarden
+{
+
+
+/*
+ * A container class for storing a collection of PresetElement objects grouped
+ * into the same musical category (eg. Flutes, Clarinets, Strings)
+ */
+class CategoryElement
+{
+public:
+ CategoryElement(QString name);
+ ~CategoryElement();
+
+ void addPreset(QString name,
+ int clef,
+ int transpose,
+ int highAm,
+ int lowAm,
+ int highPro,
+ int lowPro);
+
+ QString getName() { return m_name; }
+
+ ElementContainer getPresets() { return m_categoryPresets; }
+ PresetElement getPresetByIndex(int index) { return m_categoryPresets [index]; }
+
+private:
+ QString m_name;
+ ElementContainer m_categoryPresets;
+}; // CategoryElement
+
+typedef std::vector<CategoryElement> CategoriesContainer;
+
+}
+
+#endif
diff --git a/src/gui/general/ClefIndex.cpp b/src/gui/general/ClefIndex.cpp
new file mode 100644
index 0000000..68ad488
--- /dev/null
+++ b/src/gui/general/ClefIndex.cpp
@@ -0,0 +1,100 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include "gui/general/ClefIndex.h"
+#include "misc/Debug.h"
+
+namespace Rosegarden
+{
+
+const Rosegarden::Clef clefIndexToClef(int index)
+{
+ Rosegarden::Clef clef;
+
+ // insert an initial clef from track parameters
+ switch (index) {
+ case TrebleClef: clef = Clef(Clef::Treble); break;
+ case BassClef: clef = Clef(Clef::Bass); break;
+ case CrotalesClef: clef = Clef(Clef::Treble, 2); break;
+ case XylophoneClef: clef = Clef(Clef::Treble, 1); break;
+ case GuitarClef: clef = Clef(Clef::Treble, -1); break;
+ case ContrabassClef: clef = Clef(Clef::Bass, -1); break;
+ case CelestaClef: clef = Clef(Clef::Bass, 2); break;
+ case OldCelestaClef: clef = Clef(Clef::Bass, 1); break;
+ case FrenchClef: clef = Clef(Clef::French); break;
+ case SopranoClef: clef = Clef(Clef::Soprano); break;
+ case MezzosopranoClef: clef = Clef(Clef::Mezzosoprano); break;
+ case AltoClef: clef = Clef(Clef::Alto); break;
+ case TenorClef: clef = Clef(Clef::Tenor); break;
+ case BaritoneClef: clef = Clef(Clef::Baritone); break;
+ case VarbaritoneClef: clef = Clef(Clef::Varbaritone); break;
+ case SubbassClef: clef = Clef(Clef::Subbass); break;
+ default: clef = Clef(Clef::Treble); break;
+ }
+ return clef;
+}
+
+const int clefNameToClefIndex(QString s)
+{
+ int m_elClef = 0;
+ if (s) {
+ if (s == "treble")
+ m_elClef = TrebleClef;
+ else if (s == "bass")
+ m_elClef = BassClef;
+ else if (s == "crotales")
+ m_elClef = CrotalesClef;
+ else if (s == "xylophone")
+ m_elClef = XylophoneClef;
+ else if (s == "guitar")
+ m_elClef = GuitarClef;
+ else if (s == "contrabass")
+ m_elClef = ContrabassClef;
+ else if (s == "celesta")
+ m_elClef = CelestaClef;
+ else if (s == "oldCelesta")
+ m_elClef = OldCelestaClef;
+ else if (s == "french")
+ m_elClef = FrenchClef;
+ else if (s == "soprano")
+ m_elClef = SopranoClef;
+ else if (s == "mezzosoprano")
+ m_elClef = MezzosopranoClef;
+ else if (s == "alto")
+ m_elClef = AltoClef;
+ else if (s == "tenor")
+ m_elClef = TenorClef;
+ else if (s == "baritone")
+ m_elClef = BaritoneClef;
+ else if (s == "varbaritone")
+ m_elClef = VarbaritoneClef;
+ else if (s == "subbass")
+ m_elClef = SubbassClef;
+ else if (s == "two-bar")
+ m_elClef = TwoBarClef;
+ else {
+ RG_DEBUG << "startElement: processed unrecognized clef type: " << s << endl;
+ }
+ }
+ return m_elClef;
+}
+
+} \ No newline at end of file
diff --git a/src/gui/general/ClefIndex.h b/src/gui/general/ClefIndex.h
new file mode 100644
index 0000000..74e3fc8
--- /dev/null
+++ b/src/gui/general/ClefIndex.h
@@ -0,0 +1,59 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#ifndef _CLEF_INDEX_H_
+#define _CLEF_INDEX_H_
+
+#include "base/NotationTypes.h"
+#include <qstring.h>
+
+// used variously by TPB, SPB, PresetHandler to correlate combo box indices to
+// clef types
+enum { TrebleClef = 0, // G clef, line 2
+ BassClef, // F clef, line 4
+ CrotalesClef, // G clef, line 2, 15 above
+ XylophoneClef, // G clef, line 2, 8 above
+ GuitarClef, // G clef, line 2, 8 below
+ ContrabassClef, // F clef, line 4, 8 below
+ CelestaClef, // F clef, line 4, 15 above
+ OldCelestaClef, // F clef, line 4, 8 above
+ FrenchClef, // G clef, line 1
+ SopranoClef, // C clef, line 1
+ MezzosopranoClef, // C clef, line 2
+ AltoClef, // C clef, line 3
+ TenorClef, // C clef, line 4
+ BaritoneClef, // C clef, line 5
+ VarbaritoneClef, // F clef, line 3
+ SubbassClef, // F clef, line 5
+ TwoBarClef // percussion clef //!!! doesn't exist yet!
+ };
+
+namespace Rosegarden
+{
+
+const Clef clefIndexToClef(int index);
+
+const int clefNameToClefIndex(QString s);
+
+}
+
+#endif // _CLEF_INDEX_H_
diff --git a/src/gui/general/EditTool.cpp b/src/gui/general/EditTool.cpp
new file mode 100644
index 0000000..52e7b11
--- /dev/null
+++ b/src/gui/general/EditTool.cpp
@@ -0,0 +1,143 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "EditTool.h"
+
+#include "misc/Debug.h"
+#include "base/Event.h"
+#include "BaseTool.h"
+#include "base/ViewElement.h"
+#include "EditView.h"
+#include "RosegardenCanvasView.h"
+#include <kxmlguiclient.h>
+#include <qevent.h>
+#include <qpopupmenu.h>
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+EditTool::EditTool(const QString& menuName, EditView* view)
+ : BaseTool(menuName, view->factory(), view),
+ m_parentView(view)
+{}
+
+void EditTool::handleMousePress(timeT time,
+ int height,
+ int staffNo,
+ QMouseEvent* e,
+ ViewElement* el)
+{
+ RG_DEBUG << "EditTool::handleMousePress : mouse button = "
+ << e->button() << endl;
+
+ switch (e->button()) {
+
+ case Qt::LeftButton:
+ if (e->type() == QEvent::MouseButtonDblClick) {
+ RG_DEBUG << "EditTool::handleMousePress: it's a double-click"
+ << endl;
+ handleMouseDoubleClick(time, height, staffNo, e, el);
+ } else {
+ RG_DEBUG << "EditTool::handleMousePress: it's a single-click"
+ << endl;
+ handleLeftButtonPress(time, height, staffNo, e, el);
+ }
+ break;
+
+ case Qt::RightButton:
+ handleRightButtonPress(time, height, staffNo, e, el);
+ break;
+
+ case Qt::MidButton:
+ handleMidButtonPress(time, height, staffNo, e, el);
+ break;
+
+ default:
+ RG_DEBUG << "EditTool::handleMousePress : no button mouse press\n";
+ break;
+ }
+}
+
+void EditTool::handleMidButtonPress(timeT,
+ int, int,
+ QMouseEvent*,
+ ViewElement*)
+{}
+
+void EditTool::handleRightButtonPress(timeT,
+ int, int,
+ QMouseEvent*,
+ ViewElement*)
+{
+ showMenu();
+}
+
+void EditTool::handleMouseDoubleClick(timeT,
+ int, int,
+ QMouseEvent*,
+ ViewElement*)
+{
+ // nothing
+}
+
+int EditTool::handleMouseMove(timeT, int, QMouseEvent*)
+{
+ return RosegardenCanvasView::NoFollow;
+}
+
+void EditTool::handleMouseRelease(timeT, int, QMouseEvent*)
+{}
+
+void EditTool::createMenu(QString rcFileName)
+{
+ setRCFileName(rcFileName);
+ createMenu();
+}
+
+void EditTool::createMenu()
+{
+ RG_DEBUG << "BaseTool::createMenu() " << m_rcFileName << " - " << m_menuName << endl;
+
+ setXMLFile(m_rcFileName);
+ m_parentFactory->addClient(this);
+
+ QWidget* tmp = m_parentFactory->container(m_menuName, this);
+
+ if (!tmp)
+ RG_DEBUG << "BaseTool::createMenu(" << m_rcFileName
+ << ") : menu creation failed (name : "
+ << m_menuName << ")\n";
+
+ m_menu = dynamic_cast<QPopupMenu*>(tmp);
+}
+
+bool EditTool::hasMenu()
+{
+ return !m_rcFileName.isEmpty();
+}
+
+}
diff --git a/src/gui/general/EditTool.h b/src/gui/general/EditTool.h
new file mode 100644
index 0000000..17937d1
--- /dev/null
+++ b/src/gui/general/EditTool.h
@@ -0,0 +1,166 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_EDITTOOL_H_
+#define _RG_EDITTOOL_H_
+
+#include "BaseTool.h"
+#include <kxmlguiclient.h>
+#include <qstring.h>
+#include "base/Event.h"
+
+
+class QMouseEvent;
+
+
+namespace Rosegarden
+{
+
+class ViewElement;
+class Event;
+class EditView;
+
+
+/**
+ * Edit tool base class.
+ *
+ * A EditTool represents one of the items on an edition view
+ * toolbar. It handles mouse click events for the EditView ('State'
+ * design pattern).
+ *
+ * A EditTool can have a menu, normally activated through a right
+ * mouse button click. This menu is defined in an XML file, see
+ * NoteInserter and noteinserter.rc for an example.
+ *
+ * This class is a "semi-singleton", that is, only one instance per
+ * EditView window is created. This is because menu creation is
+ * slow, and the fact that a tool can trigger the setting of another
+ * tool through a menu choice). This is maintained with the
+ * EditToolBox class This means we can't rely on the ctor/dtor to
+ * perform setting up, like mouse cursor changes for instance. Use the
+ * ready() and stow() method for this.
+ *
+ * @see EditView#setTool()
+ * @see EditToolBox
+ */
+class EditTool : public BaseTool, public KXMLGUIClient
+{
+ friend class EditToolBox;
+
+public:
+
+ /**
+ * Dispatch the event to Left/Middle/Right MousePress
+ */
+ virtual void handleMousePress(timeT time,
+ int height,
+ int staffNo,
+ QMouseEvent *event,
+ ViewElement*);
+
+ /**
+ * Main operation of the tool
+ */
+ virtual void handleLeftButtonPress(timeT time,
+ int height,
+ int staffNo,
+ QMouseEvent *event,
+ ViewElement*) = 0;
+
+ /**
+ * Do nothing
+ */
+ virtual void handleMidButtonPress(timeT time,
+ int height,
+ int staffNo,
+ QMouseEvent*,
+ ViewElement*);
+
+ /**
+ * Show option menu
+ */
+ virtual void handleRightButtonPress(timeT time,
+ int height,
+ int staffNo,
+ QMouseEvent*,
+ ViewElement*);
+
+ /**
+ * Do nothing
+ */
+ virtual void handleMouseDoubleClick(timeT time,
+ int height,
+ int staffNo,
+ QMouseEvent*,
+ ViewElement*);
+
+ /**
+ * Do nothing.
+ * Implementations of handleMouseMove should return true if
+ * they want the canvas to scroll to the position the mouse
+ * moved to following the method's return.
+ */
+ virtual int handleMouseMove(timeT time,
+ int height,
+ QMouseEvent*);
+
+ /**
+ * Do nothing
+ */
+ virtual void handleMouseRelease(timeT time,
+ int height,
+ QMouseEvent*);
+
+ /**
+ * Respond to an event being deleted -- it may be the one the tool
+ * is remembering as the current event.
+ */
+ virtual void handleEventRemoved(Event *) { }
+
+
+protected:
+ /**
+ * Create a new EditTool
+ *
+ * \a menuName : the name of the menu defined in the XML rc file
+ */
+ EditTool(const QString& menuName, EditView*);
+
+ void setRCFileName(QString rcfilename) { m_rcFileName = rcfilename; }
+
+ virtual void createMenu();
+ virtual void createMenu(QString rcFileName);
+ virtual bool hasMenu();
+
+ //--------------- Data members ---------------------------------
+ QString m_rcFileName;
+
+ EditView* m_parentView;
+};
+
+
+}
+
+#endif
diff --git a/src/gui/general/EditToolBox.cpp b/src/gui/general/EditToolBox.cpp
new file mode 100644
index 0000000..c2e24a9
--- /dev/null
+++ b/src/gui/general/EditToolBox.cpp
@@ -0,0 +1,56 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "EditToolBox.h"
+
+#include "BaseToolBox.h"
+#include "EditTool.h"
+#include "EditView.h"
+#include <qobject.h>
+#include <qstring.h>
+#include <kmessagebox.h>
+
+namespace Rosegarden
+{
+
+EditToolBox::EditToolBox(EditView *parent)
+ : BaseToolBox(parent),
+ m_parentView(parent)
+{
+}
+
+EditTool* EditToolBox::getTool(const QString& toolName)
+{
+ return dynamic_cast<EditTool*>(BaseToolBox::getTool(toolName));
+}
+
+EditTool* EditToolBox::createTool(const QString&)
+{
+ KMessageBox::error(0, "EditToolBox::createTool called - this should never happen");
+ return 0;
+}
+
+}
+#include "EditToolBox.moc"
diff --git a/src/gui/general/EditToolBox.h b/src/gui/general/EditToolBox.h
new file mode 100644
index 0000000..0115558
--- /dev/null
+++ b/src/gui/general/EditToolBox.h
@@ -0,0 +1,65 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_EDITTOOLBOX_H_
+#define _RG_EDITTOOLBOX_H_
+
+#include "BaseToolBox.h"
+#include "EditTool.h"
+
+
+class QString;
+
+
+namespace Rosegarden
+{
+
+class EditView;
+
+
+/**
+ * EditToolBox : specialized toolbox for EditViews (notation, matrix...)
+ *
+ */
+class EditToolBox : public BaseToolBox
+{
+ Q_OBJECT
+public:
+ EditToolBox(EditView* parent);
+
+ virtual EditTool* getTool(const QString& toolName);
+
+protected:
+ virtual EditTool* createTool(const QString& toolName);
+
+ //--------------- Data members ---------------------------------
+
+ EditView* m_parentView;
+};
+
+
+}
+
+#endif
diff --git a/src/gui/general/EditView.cpp b/src/gui/general/EditView.cpp
new file mode 100644
index 0000000..a36b385
--- /dev/null
+++ b/src/gui/general/EditView.cpp
@@ -0,0 +1,1717 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "EditView.h"
+#include <qlayout.h>
+
+#include "base/BaseProperties.h"
+#include <klocale.h>
+#include <kconfig.h>
+#include "misc/Debug.h"
+#include "misc/Strings.h"
+#include "ActiveItem.h"
+#include "base/AnalysisTypes.h"
+#include "base/Composition.h"
+#include "base/CompositionTimeSliceAdapter.h"
+#include "base/Controllable.h"
+#include "base/ControlParameter.h"
+#include "base/Device.h"
+#include "base/Event.h"
+#include "base/Exception.h"
+#include "base/Instrument.h"
+#include "base/MidiDevice.h"
+#include "base/MidiProgram.h"
+#include "base/MidiTypes.h"
+#include "base/NotationTypes.h"
+#include "base/Profiler.h"
+#include "base/Property.h"
+#include "base/PropertyName.h"
+#include "base/RulerScale.h"
+#include "base/Segment.h"
+#include "base/Selection.h"
+#include "base/SoftSynthDevice.h"
+#include "base/Staff.h"
+#include "base/Studio.h"
+#include "base/ViewElement.h"
+#include "commands/edit/InvertCommand.h"
+#include "commands/edit/MoveCommand.h"
+#include "commands/edit/RescaleCommand.h"
+#include "commands/edit/RetrogradeCommand.h"
+#include "commands/edit/RetrogradeInvertCommand.h"
+#include "commands/edit/TransposeCommand.h"
+#include "commands/segment/AddTempoChangeCommand.h"
+#include "commands/segment/AddTimeSignatureAndNormalizeCommand.h"
+#include "commands/segment/AddTimeSignatureCommand.h"
+#include "document/MultiViewCommandHistory.h"
+#include "document/RosegardenGUIDoc.h"
+#include "document/ConfigGroups.h"
+#include "EditViewBase.h"
+#include "gui/dialogs/RescaleDialog.h"
+#include "gui/dialogs/TempoDialog.h"
+#include "gui/dialogs/IntervalDialog.h"
+#include "gui/dialogs/TimeSignatureDialog.h"
+#include "gui/rulers/StandardRuler.h"
+#include "gui/kdeext/KTmpStatusMsg.h"
+#include "gui/kdeext/QCanvasGroupableItem.h"
+#include "gui/rulers/ControllerEventsRuler.h"
+#include "gui/rulers/ControlRuler.h"
+#include "gui/rulers/PropertyControlRuler.h"
+#include "RosegardenCanvasView.h"
+#include <kaction.h>
+#include <kcommand.h>
+#include <kdockwidget.h>
+#include <kglobal.h>
+#include <kiconloader.h>
+#include <kstddirs.h>
+#include <ktabwidget.h>
+#include <kxmlguiclient.h>
+#include <qaccel.h>
+#include <qbutton.h>
+#include <qdialog.h>
+#include <qframe.h>
+#include <qinputdialog.h>
+#include <qlabel.h>
+#include <qobjectlist.h>
+#include <qpopupmenu.h>
+#include <qsize.h>
+#include <qstring.h>
+#include <qtabwidget.h>
+#include <qvbox.h>
+#include <qwidget.h>
+#include <qwmatrix.h>
+
+
+namespace Rosegarden
+{
+
+const unsigned int EditView::CONTROLS_ROW = 0;
+const unsigned int EditView::RULERS_ROW = CONTROLS_ROW + 1;
+const unsigned int EditView::TOPBARBUTTONS_ROW = RULERS_ROW + 1;
+const unsigned int EditView::CANVASVIEW_ROW = TOPBARBUTTONS_ROW + 1;
+const unsigned int EditView::CONTROLRULER_ROW = CANVASVIEW_ROW + 1;
+
+// Just some simple features we might want to show - make them bit maskable
+//
+static int FeatureShowVelocity = 0x00001; // show the velocity ruler
+
+EditView::EditView(RosegardenGUIDoc *doc,
+ std::vector<Segment *> segments,
+ unsigned int cols,
+ QWidget *parent, const char *name) :
+ EditViewBase(doc, segments, cols, parent, name),
+ m_currentEventSelection(0),
+ m_activeItem(0),
+ m_canvasView(0),
+ m_rulerBox(new QVBoxLayout), // top ruler box - added to grid later on
+ m_rulerBoxFiller(0), // On the left of m_rulerBox
+ m_controlBox(new QVBoxLayout), // top control ruler box - added to grid later on
+ m_bottomBox(new QVBox(this, "bottomframe")), // bottom box - added to bottom of canvas view by setCanvasView()
+ m_topStandardRuler(0),
+ m_bottomStandardRuler(0),
+ m_controlRuler(0),
+ m_controlRulers(new KTabWidget(getBottomWidget(), "controlrulers"))
+{
+ m_controlRulers->setHoverCloseButton(true);
+ m_controlRulers->setHoverCloseButtonDelayed(false);
+ connect(m_controlRulers, SIGNAL(closeRequest(QWidget*)),
+ this, SLOT(slotRemoveControlRuler(QWidget*)));
+
+ (dynamic_cast<QBoxLayout*>(m_bottomBox->layout()))->setDirection(QBoxLayout::BottomToTop);
+
+ // m_rulerBoxFiller is a white label used to keep m_rulerBox exactly
+ // above the scrolling part of the view (and never above the
+ // RosegardenCanvasView::m_leftWidget).
+ QGridLayout * gl = new QGridLayout(1, 2);
+ gl->setColStretch(0, 0);
+ gl->setColStretch(1, 1);
+ gl->addLayout(m_rulerBox, 0, 1);
+ m_rulerBoxFiller = new QLabel(getCentralWidget());
+ gl->addWidget(m_rulerBoxFiller, 0, 0);
+ m_rulerBoxFiller->hide();
+
+ m_grid->addLayout(gl, RULERS_ROW, m_mainCol);
+
+ m_grid->addMultiCellLayout(m_controlBox, CONTROLS_ROW, CONTROLS_ROW, 0, 1);
+ m_controlBox->setAlignment(AlignRight);
+ // m_grid->addWidget(m_controlRulers, CONTROLRULER_ROW, 2);
+
+ m_controlRulers->hide();
+ m_controlRulers->setTabPosition(QTabWidget::Bottom);
+}
+
+EditView::~EditView()
+{
+ delete m_currentEventSelection;
+ m_currentEventSelection = 0;
+}
+
+void EditView::updateBottomWidgetGeometry()
+{
+ getBottomWidget()->layout()->invalidate();
+ getBottomWidget()->updateGeometry();
+ getCanvasView()->updateBottomWidgetGeometry();
+}
+
+void EditView::paintEvent(QPaintEvent* e)
+{
+ RG_DEBUG << "EditView::paintEvent()\n";
+ EditViewBase::paintEvent(e);
+
+ if (m_needUpdate) {
+ RG_DEBUG << "EditView::paintEvent() - calling updateView\n";
+ updateView();
+ getCanvasView()->slotUpdate();
+
+ // update rulers
+ QLayoutIterator it = m_rulerBox->iterator();
+ QLayoutItem *child;
+ while ( (child = it.current()) != 0 ) {
+ if (child->widget())
+ child->widget()->update();
+ ++it;
+ }
+
+ updateControlRulers();
+
+ } else {
+
+ getCanvasView()->slotUpdate();
+ updateControlRulers();
+
+ }
+
+ m_needUpdate = false;
+}
+
+void EditView::updateControlRulers(bool updateHPos)
+{
+ for (int i = 0; i < m_controlRulers->count(); ++i) {
+ ControlRuler* ruler = dynamic_cast<ControlRuler*>(m_controlRulers->page(i));
+ if (ruler) {
+ if (updateHPos)
+ ruler->slotUpdateElementsHPos();
+ else
+ ruler->slotUpdate();
+ }
+ }
+}
+
+void EditView::setControlRulersZoom(QWMatrix zoomMatrix)
+{
+ m_currentRulerZoomMatrix = zoomMatrix;
+
+ for (int i = 0; i < m_controlRulers->count(); ++i) {
+ ControlRuler* ruler = dynamic_cast<ControlRuler*>(m_controlRulers->page(i));
+ if (ruler)
+ ruler->setWorldMatrix(zoomMatrix);
+ }
+}
+
+void EditView::setControlRulersCurrentSegment()
+{
+ RG_DEBUG << "EditView::setControlRulersCurrentSegment: visible is " << m_controlRulers->isVisible() << endl;
+
+ bool visible = m_controlRulers->isVisible();
+
+ delete m_controlRulers;
+ m_controlRulers = new KTabWidget(getBottomWidget(), "controlrulers");
+
+ bool haveTabs = setupControllerTabs();
+ setupAddControlRulerMenu();
+
+ if (haveTabs)
+ m_controlRulers->show();
+ else
+ m_controlRulers->hide();
+
+ updateBottomWidgetGeometry();
+
+ /*
+ for (int i = 0; i < m_controlRulers->count(); ++i) {
+
+ PropertyControlRuler *pcr = dynamic_cast<PropertyControlRuler *>
+ (m_controlRulers->page(i));
+
+ if (pcr) pcr->setStaff(getCurrentStaff());
+ else {
+
+ ControllerEventsRuler *cer = dynamic_cast<ControllerEventsRuler *>
+ (m_controlRulers->page(i));
+
+ if (cer) cer->setSegment(getCurrentSegment());
+ }
+ }
+ */
+}
+
+void EditView::setTopStandardRuler(StandardRuler* w, QWidget *leftBox)
+{
+ delete m_topStandardRuler;
+ m_topStandardRuler = w;
+
+ QGridLayout * gl = new QGridLayout(1, 2);
+ gl->setColStretch(0, 0);
+ gl->setColStretch(1, 1);
+
+ gl->addWidget(w, 0, 1);
+ if (leftBox) {
+ gl->addWidget(leftBox, 0, 0);
+ }
+
+ m_grid->addLayout(gl, TOPBARBUTTONS_ROW, m_mainCol);
+
+ if (m_canvasView) {
+ connect(m_canvasView->horizontalScrollBar(), SIGNAL(valueChanged(int)),
+ m_topStandardRuler, SLOT(slotScrollHoriz(int)));
+ connect(m_canvasView->horizontalScrollBar(), SIGNAL(sliderMoved(int)),
+ m_topStandardRuler, SLOT(slotScrollHoriz(int)));
+ }
+}
+
+void EditView::setBottomStandardRuler(StandardRuler* w)
+{
+ delete m_bottomStandardRuler;
+ m_bottomStandardRuler = w;
+
+ // m_bottomBox->insertWidget(0, w);
+
+ if (m_canvasView) {
+ connect(m_canvasView->horizontalScrollBar(), SIGNAL(valueChanged(int)),
+ m_bottomStandardRuler, SLOT(slotScrollHoriz(int)));
+ connect(m_canvasView->horizontalScrollBar(), SIGNAL(sliderMoved(int)),
+ m_bottomStandardRuler, SLOT(slotScrollHoriz(int)));
+ }
+}
+
+void EditView::setRewFFwdToAutoRepeat()
+{
+ QWidget* transportToolbar = factory()->container("Transport Toolbar", this);
+
+ if (transportToolbar) {
+ QObjectList *l = transportToolbar->queryList();
+ QObjectListIt it(*l); // iterate over the buttons
+ QObject *obj;
+
+ while ( (obj = it.current()) != 0 ) {
+ // for each found object...
+ ++it;
+ // RG_DEBUG << "EditView::setRewFFwdToAutoRepeat() : obj name : " << obj->name() << endl;
+ QString objName = obj->name();
+
+ if (objName.endsWith("playback_pointer_back_bar") || objName.endsWith("playback_pointer_forward_bar")) {
+ QButton* btn = dynamic_cast<QButton*>(obj);
+ if (!btn) {
+ RG_DEBUG << "Very strange - found widgets in Transport Toolbar which aren't buttons\n";
+
+ continue;
+ }
+ btn->setAutoRepeat(true);
+ }
+
+
+ }
+ delete l;
+
+ } else {
+ RG_DEBUG << "transportToolbar == 0\n";
+ }
+
+}
+
+void EditView::addRuler(QWidget* w)
+{
+ m_rulerBox->addWidget(w);
+
+ if (m_canvasView) {
+ connect(m_canvasView->horizontalScrollBar(), SIGNAL(valueChanged(int)),
+ w, SLOT(slotScrollHoriz(int)));
+ connect(m_canvasView->horizontalScrollBar(), SIGNAL(sliderMoved(int)),
+ w, SLOT(slotScrollHoriz(int)));
+ }
+}
+
+void EditView::addPropertyBox(QWidget *w)
+{
+ m_controlBox->addWidget(w);
+}
+
+void EditView::addControlRuler(ControlRuler* ruler)
+{
+ ruler->setWorldMatrix(m_currentRulerZoomMatrix);
+ m_controlRulers->addTab(ruler, KGlobal::iconLoader()->loadIconSet("fileclose", KIcon::Small),
+ ruler->getName());
+ m_controlRulers->showPage(ruler);
+
+ if (m_canvasView) {
+ connect(m_canvasView->horizontalScrollBar(), SIGNAL(valueChanged(int)),
+ ruler->horizontalScrollBar(), SIGNAL(valueChanged(int)));
+ connect(m_canvasView->horizontalScrollBar(), SIGNAL(sliderMoved(int)),
+ ruler->horizontalScrollBar(), SIGNAL(sliderMoved(int)));
+ }
+
+ connect(ruler, SIGNAL(stateChange(const QString&, bool)),
+ this, SLOT(slotStateChanged(const QString&, bool)));
+
+ stateChanged("have_control_ruler", KXMLGUIClient::StateReverse);
+}
+
+void EditView::readjustViewSize(QSize requestedSize, bool exact)
+{
+ Profiler profiler("EditView::readjustViewSize", true);
+
+ if (exact) {
+ RG_DEBUG << "EditView::readjustViewSize: exact size requested ("
+ << requestedSize.width() << ", " << requestedSize.height()
+ << ")\n";
+
+ setViewSize(requestedSize);
+ getCanvasView()->slotUpdate();
+ return ;
+ }
+
+ int requestedWidth = requestedSize.width(),
+ requestedHeight = requestedSize.height(),
+ windowWidth = width(),
+ windowHeight = height();
+
+ QSize newSize;
+
+ newSize.setWidth(((requestedWidth / windowWidth) + 1) * windowWidth);
+ newSize.setHeight(((requestedHeight / windowHeight) + 1) * windowHeight);
+
+ RG_DEBUG << "EditView::readjustViewSize: requested ("
+ << requestedSize.width() << ", " << requestedSize.height()
+ << "), getting (" << newSize.width() << ", "
+ << newSize.height() << ")" << endl;
+
+ setViewSize(newSize);
+
+ getCanvasView()->slotUpdate();
+}
+
+void EditView::setCanvasView(RosegardenCanvasView *canvasView)
+{
+ delete m_canvasView;
+ m_canvasView = canvasView;
+ m_grid->addWidget(m_canvasView, CANVASVIEW_ROW, m_mainCol);
+ m_canvasView->setBottomFixedWidget(m_bottomBox);
+
+ // TODO : connect canvas view's horiz. scrollbar to top/bottom bars and rulers
+
+ // m_horizontalScrollBar->setRange(m_canvasView->horizontalScrollBar()->minValue(),
+ // m_canvasView->horizontalScrollBar()->maxValue());
+
+ // m_horizontalScrollBar->setSteps(m_canvasView->horizontalScrollBar()->lineStep(),
+ // m_canvasView->horizontalScrollBar()->pageStep());
+
+ // connect(m_horizontalScrollBar, SIGNAL(valueChanged(int)),
+ // m_canvasView->horizontalScrollBar(), SIGNAL(valueChanged(int)));
+ // connect(m_horizontalScrollBar, SIGNAL(sliderMoved(int)),
+ // m_canvasView->horizontalScrollBar(), SIGNAL(sliderMoved(int)));
+
+}
+
+Device *
+EditView::getCurrentDevice()
+{
+ Segment *segment = getCurrentSegment();
+ if (!segment)
+ return 0;
+
+ Studio &studio = getDocument()->getStudio();
+ Instrument *instrument =
+ studio.getInstrumentById
+ (segment->getComposition()->getTrackById(segment->getTrack())->
+ getInstrument());
+ if (!instrument)
+ return 0;
+
+ return instrument->getDevice();
+}
+
+timeT
+EditView::getInsertionTime(Clef &clef,
+ Rosegarden::Key &key)
+{
+ timeT t = getInsertionTime();
+ Segment *segment = getCurrentSegment();
+
+ if (segment) {
+ clef = segment->getClefAtTime(t);
+ key = segment->getKeyAtTime(t);
+ } else {
+ clef = Clef();
+ key = ::Rosegarden::Key();
+ }
+
+ return t;
+}
+
+void EditView::slotActiveItemPressed(QMouseEvent* e,
+ QCanvasItem* item)
+{
+ if (!item)
+ return ;
+
+ // Check if it's a groupable item, if so get its group
+ //
+ QCanvasGroupableItem *gitem = dynamic_cast<QCanvasGroupableItem*>(item);
+ if (gitem)
+ item = gitem->group();
+
+ // Check if it's an active item
+ //
+ ActiveItem *activeItem = dynamic_cast<ActiveItem*>(item);
+
+ if (activeItem) {
+
+ setActiveItem(activeItem);
+ activeItem->handleMousePress(e);
+ updateView();
+
+ }
+}
+
+void
+EditView::slotStepBackward()
+{
+ Staff *staff = getCurrentStaff();
+ if (!staff)
+ return ;
+ ViewElementList *vel = staff->getViewElementList();
+
+ timeT time = getInsertionTime();
+ ViewElementList::iterator i = vel->findTime(time);
+
+ while (i != vel->begin() &&
+ (i == vel->end() || (*i)->getViewAbsoluteTime() >= time))
+ --i;
+
+ if (i != vel->end())
+ slotSetInsertCursorPosition((*i)->getViewAbsoluteTime());
+}
+
+void
+EditView::slotStepForward()
+{
+ Staff *staff = getCurrentStaff();
+ if (!staff)
+ return ;
+ ViewElementList *vel = staff->getViewElementList();
+
+ timeT time = getInsertionTime();
+ ViewElementList::iterator i = vel->findTime(time);
+
+ while (i != vel->end() &&
+ (*i)->getViewAbsoluteTime() <= time)
+ ++i;
+
+ if (i == vel->end()) {
+ slotSetInsertCursorPosition(staff->getSegment().getEndMarkerTime());
+ } else {
+ slotSetInsertCursorPosition((*i)->getViewAbsoluteTime());
+ }
+}
+
+void
+EditView::slotJumpBackward()
+{
+ Segment *segment = getCurrentSegment();
+ if (!segment)
+ return ;
+ timeT time = getInsertionTime();
+ time = segment->getBarStartForTime(time - 1);
+ slotSetInsertCursorPosition(time);
+}
+
+void
+EditView::slotJumpForward()
+{
+ Segment *segment = getCurrentSegment();
+ if (!segment)
+ return ;
+ timeT time = getInsertionTime();
+ time = segment->getBarEndForTime(time);
+ slotSetInsertCursorPosition(time);
+}
+
+void
+EditView::slotJumpToStart()
+{
+ Segment *segment = getCurrentSegment();
+ if (!segment)
+ return ;
+ timeT time = segment->getStartTime();
+ slotSetInsertCursorPosition(time);
+}
+
+void
+EditView::slotJumpToEnd()
+{
+ Segment *segment = getCurrentSegment();
+ if (!segment)
+ return ;
+ timeT time = segment->getEndMarkerTime();
+ slotSetInsertCursorPosition(time);
+}
+
+void EditView::slotExtendSelectionBackward()
+{
+ slotExtendSelectionBackward(false);
+}
+
+void EditView::slotExtendSelectionBackwardBar()
+{
+ slotExtendSelectionBackward(true);
+}
+
+void EditView::slotExtendSelectionBackward(bool bar)
+{
+ // If there is no current selection, or the selection is entirely
+ // to the right of the cursor, move the cursor left and add to the
+ // selection
+
+ timeT oldTime = getInsertionTime();
+ if (bar)
+ slotJumpBackward();
+ else
+ slotStepBackward();
+ timeT newTime = getInsertionTime();
+
+ Staff *staff = getCurrentStaff();
+ if (!staff)
+ return ;
+ Segment *segment = &staff->getSegment();
+ ViewElementList *vel = staff->getViewElementList();
+
+ EventSelection *es = new EventSelection(*segment);
+ if (m_currentEventSelection &&
+ &m_currentEventSelection->getSegment() == segment)
+ es->addFromSelection(m_currentEventSelection);
+
+ if (!m_currentEventSelection ||
+ &m_currentEventSelection->getSegment() != segment ||
+ m_currentEventSelection->getSegmentEvents().size() == 0 ||
+ m_currentEventSelection->getStartTime() >= oldTime) {
+
+ ViewElementList::iterator extendFrom = vel->findTime(oldTime);
+
+ while (extendFrom != vel->begin() &&
+ (*--extendFrom)->getViewAbsoluteTime() >= newTime) {
+ if ((*extendFrom)->event()->isa(Note::EventType)) {
+ es->addEvent((*extendFrom)->event());
+ }
+ }
+
+ } else { // remove an event
+
+ EventSelection::eventcontainer::iterator i =
+ es->getSegmentEvents().end();
+
+ std::vector<Event *> toErase;
+
+ while (i != es->getSegmentEvents().begin() &&
+ (*--i)->getAbsoluteTime() >= newTime) {
+ toErase.push_back(*i);
+ }
+
+ for (unsigned int j = 0; j < toErase.size(); ++j) {
+ es->removeEvent(toErase[j]);
+ }
+ }
+
+ setCurrentSelection(es);
+}
+
+void EditView::slotExtendSelectionForward()
+{
+ slotExtendSelectionForward(false);
+}
+
+void EditView::slotExtendSelectionForwardBar()
+{
+ slotExtendSelectionForward(true);
+}
+
+void EditView::slotExtendSelectionForward(bool bar)
+{
+ // If there is no current selection, or the selection is entirely
+ // to the left of the cursor, move the cursor right and add to the
+ // selection
+
+ timeT oldTime = getInsertionTime();
+ if (bar)
+ slotJumpForward();
+ else
+ slotStepForward();
+ timeT newTime = getInsertionTime();
+
+ Staff *staff = getCurrentStaff();
+ if (!staff)
+ return ;
+ Segment *segment = &staff->getSegment();
+ ViewElementList *vel = staff->getViewElementList();
+
+ EventSelection *es = new EventSelection(*segment);
+ if (m_currentEventSelection &&
+ &m_currentEventSelection->getSegment() == segment)
+ es->addFromSelection(m_currentEventSelection);
+
+ if (!m_currentEventSelection ||
+ &m_currentEventSelection->getSegment() != segment ||
+ m_currentEventSelection->getSegmentEvents().size() == 0 ||
+ m_currentEventSelection->getEndTime() <= oldTime) {
+
+ ViewElementList::iterator extendFrom = vel->findTime(oldTime);
+
+ while (extendFrom != vel->end() &&
+ (*extendFrom)->getViewAbsoluteTime() < newTime) {
+ if ((*extendFrom)->event()->isa(Note::EventType)) {
+ es->addEvent((*extendFrom)->event());
+ }
+ ++extendFrom;
+ }
+
+ } else { // remove an event
+
+ EventSelection::eventcontainer::iterator i =
+ es->getSegmentEvents().begin();
+
+ std::vector<Event *> toErase;
+
+ while (i != es->getSegmentEvents().end() &&
+ (*i)->getAbsoluteTime() < newTime) {
+ toErase.push_back(*i);
+ ++i;
+ }
+
+ for (unsigned int j = 0; j < toErase.size(); ++j) {
+ es->removeEvent(toErase[j]);
+ }
+ }
+
+ setCurrentSelection(es);
+}
+
+void
+EditView::setupActions()
+{
+ createInsertPitchActionMenu();
+
+ //
+ // Tempo and time signature changes
+ //
+ QString pixmapDir = KGlobal::dirs()->findResource("appdata", "pixmaps/");
+ QCanvasPixmap pixmap(pixmapDir + "/toolbar/event-insert-tempo.png");
+ QIconSet icon = QIconSet(pixmap);
+ new KAction(AddTempoChangeCommand::getGlobalName(),
+ icon, 0,
+ this, SLOT(slotAddTempo()),
+ actionCollection(), "add_tempo");
+
+ pixmap.load(pixmapDir + "/toolbar/event-insert-timesig.png");
+ icon = QIconSet(pixmap);
+ new KAction(AddTimeSignatureCommand::getGlobalName(),
+ icon, 0,
+ this, SLOT(slotAddTimeSignature()),
+ actionCollection(), "add_time_signature");
+
+ //
+ // Transforms
+ //
+ new KAction(i18n("&Halve Durations"), Key_H + CTRL, this,
+ SLOT(slotHalveDurations()), actionCollection(),
+ "halve_durations");
+
+ new KAction(i18n("&Double Durations"), Key_H + CTRL + SHIFT, this,
+ SLOT(slotDoubleDurations()), actionCollection(),
+ "double_durations");
+
+ new KAction(RescaleCommand::getGlobalName(), 0, this,
+ SLOT(slotRescale()), actionCollection(),
+ "rescale");
+
+ new KAction(TransposeCommand::getGlobalName(1), 0,
+ Key_Up, this,
+ SLOT(slotTransposeUp()), actionCollection(),
+ "transpose_up");
+
+ new KAction(TransposeCommand::getGlobalName(12), 0,
+ Key_Up + CTRL, this,
+ SLOT(slotTransposeUpOctave()), actionCollection(),
+ "transpose_up_octave");
+
+ new KAction(TransposeCommand::getGlobalName( -1), 0,
+ Key_Down, this,
+ SLOT(slotTransposeDown()), actionCollection(),
+ "transpose_down");
+
+ new KAction(TransposeCommand::getGlobalName( -12), 0,
+ Key_Down + CTRL, this,
+ SLOT(slotTransposeDownOctave()), actionCollection(),
+ "transpose_down_octave");
+
+ new KAction(TransposeCommand::getGlobalName(0), 0, this,
+ SLOT(slotTranspose()), actionCollection(),
+ "general_transpose");
+
+ new KAction(TransposeCommand::getDiatonicGlobalName(0,0), 0, this,
+ SLOT(slotDiatonicTranspose()), actionCollection(),
+ "general_diatonic_transpose");
+
+ new KAction(InvertCommand::getGlobalName(0), 0, this,
+ SLOT(slotInvert()), actionCollection(),
+ "invert");
+
+ new KAction(RetrogradeCommand::getGlobalName(0), 0, this,
+ SLOT(slotRetrograde()), actionCollection(),
+ "retrograde");
+
+ new KAction(RetrogradeInvertCommand::getGlobalName(0), 0, this,
+ SLOT(slotRetrogradeInvert()), actionCollection(),
+ "retrograde_invert");
+
+ new KAction(i18n("Jog &Left"), Key_Left + ALT, this,
+ SLOT(slotJogLeft()), actionCollection(),
+ "jog_left");
+
+ new KAction(i18n("Jog &Right"), Key_Right + ALT, this,
+ SLOT(slotJogRight()), actionCollection(),
+ "jog_right");
+
+ // Control rulers
+ //
+ new KAction(i18n("Show Velocity Property Ruler"), 0, this,
+ SLOT(slotShowVelocityControlRuler()), actionCollection(),
+ "show_velocity_control_ruler");
+
+ /*
+ new KAction(i18n("Show Controllers Events Ruler"), 0, this,
+ SLOT(slotShowControllerEventsRuler()), actionCollection(),
+ "show_controller_events_ruler");
+ */
+
+ // Disabled for now
+ //
+ // new KAction(i18n("Add Control Ruler..."), 0, this,
+ // SLOT(slotShowPropertyControlRuler()), actionCollection(),
+ // "add_control_ruler");
+
+ //
+ // Control Ruler context menu
+ //
+ new KAction(i18n("Insert item"), 0, this,
+ SLOT(slotInsertControlRulerItem()), actionCollection(),
+ "insert_control_ruler_item");
+
+ // This was on Key_Delete, but that conflicts with existing Delete commands
+ // on individual edit views
+ new KAction(i18n("Erase selected items"), 0, this,
+ SLOT(slotEraseControlRulerItem()), actionCollection(),
+ "erase_control_ruler_item");
+
+ new KAction(i18n("Clear ruler"), 0, this,
+ SLOT(slotClearControlRulerItem()), actionCollection(),
+ "clear_control_ruler_item");
+
+ new KAction(i18n("Insert line of controllers"), 0, this,
+ SLOT(slotStartControlLineItem()), actionCollection(),
+ "start_control_line_item");
+
+ new KAction(i18n("Flip forward"), Key_BracketRight, this,
+ SLOT(slotFlipForwards()), actionCollection(),
+ "flip_control_events_forward");
+
+ new KAction(i18n("Flip backwards"), Key_BracketLeft, this,
+ SLOT(slotFlipBackwards()), actionCollection(),
+ "flip_control_events_back");
+
+ new KAction(i18n("Draw property line"), 0, this,
+ SLOT(slotDrawPropertyLine()), actionCollection(),
+ "draw_property_line");
+
+ new KAction(i18n("Select all property values"), 0, this,
+ SLOT(slotSelectAllProperties()), actionCollection(),
+ "select_all_properties");
+}
+
+void
+EditView::setupAddControlRulerMenu()
+{
+ RG_DEBUG << "EditView::setupAddControlRulerMenu" << endl;
+
+ QPopupMenu* addControlRulerMenu = dynamic_cast<QPopupMenu*>
+ (factory()->container("add_control_ruler", this));
+
+ if (addControlRulerMenu) {
+
+ addControlRulerMenu->clear();
+
+ //!!! problem here with notation view -- current segment can
+ // change after construction, but this function isn't used again
+
+ Controllable *c =
+ dynamic_cast<MidiDevice *>(getCurrentDevice());
+ if (!c) {
+ c = dynamic_cast<SoftSynthDevice *>(getCurrentDevice());
+ if (!c)
+ return ;
+ }
+
+ const ControlList &list = c->getControlParameters();
+
+ int i = 0;
+ QString itemStr;
+
+ for (ControlList::const_iterator it = list.begin();
+ it != list.end(); ++it) {
+ if (it->getType() == Controller::EventType) {
+ QString hexValue;
+ hexValue.sprintf("(0x%x)", it->getControllerValue());
+
+ itemStr = i18n("%1 Controller %2 %3").arg(strtoqstr(it->getName()))
+ .arg(it->getControllerValue())
+ .arg(hexValue);
+
+ } else if (it->getType() == PitchBend::EventType)
+ itemStr = i18n("Pitch Bend");
+ else
+ itemStr = i18n("Unsupported Event Type");
+
+ addControlRulerMenu->insertItem(itemStr, i++);
+ }
+
+ connect(addControlRulerMenu, SIGNAL(activated(int)),
+ SLOT(slotAddControlRuler(int)));
+ }
+
+}
+
+bool
+EditView::setupControllerTabs()
+{
+ bool have = false;
+
+ // Setup control rulers the Segment already has some stored against it.
+ //
+ Segment *segment = getCurrentSegment();
+ Segment::EventRulerList list = segment->getEventRulerList();
+
+ RG_DEBUG << "EditView::setupControllerTabs - got " << list.size() << " EventRulers" << endl;
+
+ RG_DEBUG << "Segment view features: " << segment->getViewFeatures() << endl;
+ if (segment->getViewFeatures() & FeatureShowVelocity) {
+ showPropertyControlRuler(BaseProperties::VELOCITY);
+ have = true;
+ }
+
+ if (list.size()) {
+ Controllable *c =
+ dynamic_cast<MidiDevice *>(getCurrentDevice());
+ if (!c) {
+ c = dynamic_cast<SoftSynthDevice *>(getCurrentDevice());
+ if (!c)
+ return have;
+ }
+
+ have = true;
+
+ Segment::EventRulerListIterator it;
+
+ for (it = list.begin(); it != list.end(); ++it) {
+ // Get ControlParameter object from controller value
+ //
+ const ControlParameter *controlParameter =
+ c->getControlParameter((*it)->m_type,
+ MidiByte((*it)->m_controllerValue));
+
+ RG_DEBUG << "EditView::setupControllerTabs - "
+ << "Control Parameter type = " << (*it)->m_type << endl;
+
+ if (controlParameter) {
+ ControllerEventsRuler* controlRuler = makeControllerEventRuler(controlParameter);
+ addControlRuler(controlRuler);
+ RG_DEBUG << "EditView::setupControllerTabs - adding Ruler" << endl;
+ }
+ }
+
+ if (!m_controlRulers->isVisible())
+ m_controlRulers->show();
+
+ updateBottomWidgetGeometry();
+ }
+
+ return have;
+}
+
+void
+EditView::slotAddControlRuler(int controller)
+{
+ RG_DEBUG << "EditView::slotAddControlRuler - item = "
+ << controller << endl;
+
+ Controllable *c =
+ dynamic_cast<MidiDevice *>(getCurrentDevice());
+ if (!c) {
+ c = dynamic_cast<SoftSynthDevice *>(getCurrentDevice());
+ if (!c)
+ return ;
+ }
+
+ const ControlList &list = c->getControlParameters();
+ ControlParameter control = list[controller];
+
+ int index = 0;
+
+ ControlRuler* existingRuler = findRuler(control, index);
+
+ if (existingRuler) {
+
+ m_controlRulers->setCurrentPage(index);
+
+ } else {
+
+ // Create control ruler to a specific controller. This duplicates
+ // the control parameter in the supplied pointer.
+ ControllerEventsRuler* controlRuler = makeControllerEventRuler(&control);
+
+ addControlRuler(controlRuler);
+ }
+
+ if (!m_controlRulers->isVisible()) {
+ m_controlRulers->show();
+ }
+
+ updateBottomWidgetGeometry();
+
+ // Add the controller to the segment so the views can
+ // remember what we've opened against it.
+ //
+ Staff *staff = getCurrentStaff();
+ staff->getSegment().addEventRuler(control.getType(), control.getControllerValue());
+
+ getDocument()->slotDocumentModified();
+}
+
+void EditView::slotRemoveControlRuler(QWidget* w)
+{
+ ControllerEventsRuler* ruler = dynamic_cast<ControllerEventsRuler*>(w);
+
+ if (ruler) {
+ ControlParameter *controller = ruler->getControlParameter();
+
+ // remove the control parameter from the "showing controllers" list on the segment
+ //
+ if (controller) {
+ Staff *staff = getCurrentStaff();
+ bool value = staff->getSegment().
+ deleteEventRuler(controller->getType(), controller->getControllerValue());
+
+ if (value)
+ RG_DEBUG << "slotRemoveControlRuler : removed controller from segment\n";
+ else
+ RG_DEBUG << "slotRemoveControlRuler : couldn't remove controller from segment - "
+ << int(controller->getControllerValue())
+ << endl;
+
+ }
+ } else { // else it's probably a velocity ruler
+ PropertyControlRuler *propertyRuler = dynamic_cast<PropertyControlRuler*>(w);
+
+ if (propertyRuler) {
+ Segment &seg = getCurrentStaff()->getSegment();
+ seg.setViewFeatures(0); // for the moment we only have one view feature so
+ // we can just blank it out
+
+ RG_DEBUG << "slotRemoveControlRuler : removed velocity ruler" << endl;
+ }
+ }
+
+ delete w;
+
+ if (m_controlRulers->count() == 0) {
+ m_controlRulers->hide();
+ updateBottomWidgetGeometry();
+ }
+
+ getDocument()->slotDocumentModified();
+}
+
+void
+EditView::createInsertPitchActionMenu()
+{
+ QString notePitchNames[] = {
+ i18n("I"), i18n("II"), i18n("III"), i18n("IV"),
+ i18n("V"), i18n("VI"), i18n("VII"), i18n("VIII")
+ };
+ QString flat = i18n("%1 flat");
+ QString sharp = i18n("%1 sharp");
+
+ const Key notePitchKeys[3][7] = {
+ {
+ Key_A, Key_S, Key_D, Key_F, Key_J, Key_K, Key_L,
+ },
+ {
+ Key_Q, Key_W, Key_E, Key_R, Key_U, Key_I, Key_O,
+ },
+ {
+ Key_Z, Key_X, Key_C, Key_V, Key_B, Key_N, Key_M,
+ },
+ };
+
+ KActionMenu *insertPitchActionMenu =
+ new KActionMenu(i18n("&Insert Note"), this, "insert_note_actionmenu");
+
+ for (int octave = 0; octave <= 2; ++octave) {
+
+ KActionMenu *menu = insertPitchActionMenu;
+ if (octave == 1) {
+ menu = new KActionMenu(i18n("&Upper Octave"), this,
+ "insert_note_actionmenu_upper_octave");
+ insertPitchActionMenu->insert(new KActionSeparator(this));
+ insertPitchActionMenu->insert(menu);
+ } else if (octave == 2) {
+ menu = new KActionMenu(i18n("&Lower Octave"), this,
+ "insert_note_actionmenu_lower_octave");
+ insertPitchActionMenu->insert(menu);
+ }
+
+ for (unsigned int i = 0; i < 7; ++i) {
+
+ KAction *insertPitchAction = 0;
+
+ QString octaveSuffix;
+ if (octave == 1)
+ octaveSuffix = "_high";
+ else if (octave == 2)
+ octaveSuffix = "_low";
+
+ // do and fa lack a flat
+
+ if (i != 0 && i != 3) {
+
+ insertPitchAction =
+ new KAction
+ (flat.arg(notePitchNames[i]),
+ CTRL + SHIFT + notePitchKeys[octave][i],
+ this, SLOT(slotInsertNoteFromAction()), actionCollection(),
+ QString("insert_%1_flat%2").arg(i).arg(octaveSuffix));
+
+ menu->insert(insertPitchAction);
+ }
+
+ insertPitchAction =
+ new KAction
+ (notePitchNames[i],
+ notePitchKeys[octave][i],
+ this, SLOT(slotInsertNoteFromAction()), actionCollection(),
+ QString("insert_%1%2").arg(i).arg(octaveSuffix));
+
+ menu->insert(insertPitchAction);
+
+ // and mi and ti lack a sharp
+
+ if (i != 2 && i != 6) {
+
+ insertPitchAction =
+ new KAction
+ (sharp.arg(notePitchNames[i]),
+ SHIFT + notePitchKeys[octave][i],
+ this, SLOT(slotInsertNoteFromAction()), actionCollection(),
+ QString("insert_%1_sharp%2").arg(i).arg(octaveSuffix));
+
+ menu->insert(insertPitchAction);
+ }
+
+ if (i < 6)
+ menu->insert(new KActionSeparator(this));
+ }
+ }
+
+ actionCollection()->insert(insertPitchActionMenu);
+}
+
+int
+EditView::getPitchFromNoteInsertAction(QString name,
+ Accidental &accidental,
+ const Clef &clef,
+ const ::Rosegarden::Key &key)
+{
+ using namespace Accidentals;
+
+ accidental = NoAccidental;
+
+ if (name.left(7) == "insert_") {
+
+ name = name.right(name.length() - 7);
+
+ int modify = 0;
+ int octave = 0;
+
+ if (name.right(5) == "_high") {
+
+ octave = 1;
+ name = name.left(name.length() - 5);
+
+ } else if (name.right(4) == "_low") {
+
+ octave = -1;
+ name = name.left(name.length() - 4);
+ }
+
+ if (name.right(6) == "_sharp") {
+
+ modify = 1;
+ accidental = Sharp;
+ name = name.left(name.length() - 6);
+
+ } else if (name.right(5) == "_flat") {
+
+ modify = -1;
+ accidental = Flat;
+ name = name.left(name.length() - 5);
+ }
+
+ int scalePitch = name.toInt();
+
+ if (scalePitch < 0 || scalePitch > 7) {
+ NOTATION_DEBUG << "EditView::getPitchFromNoteInsertAction: pitch "
+ << scalePitch << " out of range, using 0" << endl;
+ scalePitch = 0;
+ }
+
+ Pitch pitch
+ (scalePitch, 4 + octave + clef.getOctave(), key, accidental);
+ return pitch.getPerformancePitch();
+
+ } else {
+
+ throw Exception("Not an insert action",
+ __FILE__, __LINE__);
+ }
+}
+
+void EditView::slotAddTempo()
+{
+ timeT insertionTime = getInsertionTime();
+
+ TempoDialog tempoDlg(this, getDocument());
+
+ connect(&tempoDlg,
+ SIGNAL(changeTempo(timeT,
+ tempoT,
+ tempoT,
+ TempoDialog::TempoDialogAction)),
+ this,
+ SIGNAL(changeTempo(timeT,
+ tempoT,
+ tempoT,
+ TempoDialog::TempoDialogAction)));
+
+ tempoDlg.setTempoPosition(insertionTime);
+ tempoDlg.exec();
+}
+
+void EditView::slotAddTimeSignature()
+{
+ Segment *segment = getCurrentSegment();
+ if (!segment)
+ return ;
+ Composition *composition = segment->getComposition();
+ timeT insertionTime = getInsertionTime();
+
+ TimeSignatureDialog *dialog = 0;
+ int timeSigNo = composition->getTimeSignatureNumberAt(insertionTime);
+
+ if (timeSigNo >= 0) {
+
+ dialog = new TimeSignatureDialog
+ (this, composition, insertionTime,
+ composition->getTimeSignatureAt(insertionTime));
+
+ } else {
+
+ timeT endTime = composition->getDuration();
+ if (composition->getTimeSignatureCount() > 0) {
+ endTime = composition->getTimeSignatureChange(0).first;
+ }
+
+ CompositionTimeSliceAdapter adapter
+ (composition, insertionTime, endTime);
+ AnalysisHelper helper;
+ TimeSignature timeSig = helper.guessTimeSignature(adapter);
+
+ dialog = new TimeSignatureDialog
+ (this, composition, insertionTime, timeSig, false,
+ i18n("Estimated time signature shown"));
+ }
+
+ if (dialog->exec() == QDialog::Accepted) {
+
+ insertionTime = dialog->getTime();
+
+ if (dialog->shouldNormalizeRests()) {
+
+ addCommandToHistory(new AddTimeSignatureAndNormalizeCommand
+ (composition, insertionTime,
+ dialog->getTimeSignature()));
+
+ } else {
+
+ addCommandToHistory(new AddTimeSignatureCommand
+ (composition, insertionTime,
+ dialog->getTimeSignature()));
+ }
+ }
+
+ delete dialog;
+}
+
+void EditView::showPropertyControlRuler(PropertyName propertyName)
+{
+ int index = 0;
+
+ ControlRuler* existingRuler = findRuler(propertyName, index);
+
+ if (existingRuler) {
+
+ m_controlRulers->setCurrentPage(index);
+
+ } else {
+
+ PropertyControlRuler* controlRuler = makePropertyControlRuler(propertyName);
+ addControlRuler(controlRuler);
+ }
+
+ if (!m_controlRulers->isVisible()) {
+ m_controlRulers->show();
+ }
+
+ updateBottomWidgetGeometry();
+}
+
+void EditView::slotShowVelocityControlRuler()
+{
+ showPropertyControlRuler(BaseProperties::VELOCITY);
+ Segment &seg = getCurrentStaff()->getSegment();
+ seg.setViewFeatures(seg.getViewFeatures() | FeatureShowVelocity);
+ getDocument()->slotDocumentModified();
+}
+
+void EditView::slotShowControllerEventsRuler()
+{
+
+ // int index = 0;
+
+ // ControlRuler* existingRuler = findRuler(propertyName, index);
+
+ // if (existingRuler) {
+
+ // m_controlRulers->setCurrentPage(index);
+
+ // } else {
+
+ // ControllerEventsRuler* controlRuler = makeControllerEventRuler();
+ // addControlRuler(controlRuler);
+ // }
+
+ // if (!m_controlRulers->isVisible()) {
+ // m_controlRulers->show();
+ // }
+
+ // updateBottomWidgetGeometry();
+}
+
+void EditView::slotShowPropertyControlRuler()
+{
+ /*
+ KDialogBase propChooserDialog(this, "propertychooserdialog", true, i18n("Select event property"),
+ KDialogBase::Ok | KDialogBase::Cancel, KDialogBase::Ok);
+
+ KListBox* propList = new KListBox(propChooserDialog.makeVBoxMainWidget());
+ new QListBoxRGProperty(propList, BaseProperties::VELOCITY.c_str());
+
+ int rc = propChooserDialog.exec();
+ if (rc == QDialog::Accepted) {
+ // fix for KDE 3.0
+ //QListBoxRGProperty* item = dynamic_cast<QListBoxRGProperty*>(propList->selectedItem());
+ QListBoxRGProperty* item = dynamic_cast<QListBoxRGProperty*>
+ (propList->item(propList->currentItem()));
+
+ if (item) {
+ PropertyName property = item->getPropertyName();
+ showPropertyControlRuler(property);
+ }
+ }
+ */
+}
+
+void
+EditView::slotInsertControlRulerItem()
+{
+ ControllerEventsRuler* ruler = dynamic_cast<ControllerEventsRuler*>(getCurrentControlRuler());
+ if (ruler)
+ ruler->insertControllerEvent();
+}
+
+void
+EditView::slotEraseControlRulerItem()
+{
+ ControllerEventsRuler* ruler = dynamic_cast<ControllerEventsRuler*>(getCurrentControlRuler());
+ if (ruler)
+ ruler->eraseControllerEvent();
+}
+
+void
+EditView::slotStartControlLineItem()
+{
+ ControllerEventsRuler* ruler = dynamic_cast<ControllerEventsRuler*>(getCurrentControlRuler());
+ if (ruler)
+ ruler->startControlLine();
+}
+
+void
+EditView::slotDrawPropertyLine()
+{
+ int index = 0;
+ PropertyControlRuler* ruler = dynamic_cast<PropertyControlRuler*>
+ (findRuler(BaseProperties::VELOCITY, index));
+
+ if (ruler)
+ ruler->startPropertyLine();
+}
+
+void
+EditView::slotSelectAllProperties()
+{
+ int index = 0;
+ PropertyControlRuler* ruler = dynamic_cast<PropertyControlRuler*>
+ (findRuler(BaseProperties::VELOCITY, index));
+
+ if (ruler)
+ ruler->selectAllProperties();
+}
+
+void
+EditView::slotClearControlRulerItem()
+{
+ ControllerEventsRuler* ruler = dynamic_cast<ControllerEventsRuler*>(getCurrentControlRuler());
+ if (ruler)
+ ruler->clearControllerEvents();
+}
+
+void
+EditView::slotHalveDurations()
+{
+ if (!m_currentEventSelection)
+ return ;
+
+ KTmpStatusMsg msg(i18n("Halving durations..."), this);
+
+ addCommandToHistory(
+ new RescaleCommand(*m_currentEventSelection,
+ m_currentEventSelection->getTotalDuration() / 2,
+ false));
+}
+
+void
+EditView::slotDoubleDurations()
+{
+ if (!m_currentEventSelection)
+ return ;
+
+ KTmpStatusMsg msg(i18n("Doubling durations..."), this);
+
+ addCommandToHistory(
+ new RescaleCommand(*m_currentEventSelection,
+ m_currentEventSelection->getTotalDuration() * 2,
+ false));
+}
+
+void
+EditView::slotRescale()
+{
+ if (!m_currentEventSelection)
+ return ;
+
+ RescaleDialog dialog
+ (this,
+ &getDocument()->getComposition(),
+ m_currentEventSelection->getStartTime(),
+ m_currentEventSelection->getEndTime() -
+ m_currentEventSelection->getStartTime(),
+ true,
+ true);
+
+ if (dialog.exec() == QDialog::Accepted) {
+ KTmpStatusMsg msg(i18n("Rescaling..."), this);
+ addCommandToHistory(new RescaleCommand
+ (*m_currentEventSelection,
+ dialog.getNewDuration(),
+ dialog.shouldCloseGap()));
+ }
+}
+
+void EditView::slotTranspose()
+{
+ if (!m_currentEventSelection)
+ return ;
+
+ m_config->setGroup(EditViewConfigGroup);
+
+ int dialogDefault = m_config->readNumEntry("lasttransposition", 0);
+
+ bool ok = false;
+ int semitones = QInputDialog::getInteger
+ (i18n("Transpose"),
+ i18n("By number of semitones: "),
+ dialogDefault, -127, 127, 1, &ok, this);
+ if (!ok || semitones == 0) return;
+
+ m_config->setGroup(EditViewConfigGroup);
+ m_config->writeEntry("lasttransposition", semitones);
+
+ KTmpStatusMsg msg(i18n("Transposing..."), this);
+ addCommandToHistory(new TransposeCommand
+ (semitones, *m_currentEventSelection));
+}
+
+void EditView::slotDiatonicTranspose()
+{
+ if (!m_currentEventSelection)
+ return ;
+
+ m_config->setGroup(EditViewConfigGroup);
+
+ IntervalDialog intervalDialog(this);
+ int ok = intervalDialog.exec();
+ //int dialogDefault = m_config->readNumEntry("lasttransposition", 0);
+ int semitones = intervalDialog.getChromaticDistance();
+ int steps = intervalDialog.getDiatonicDistance();
+
+ if (!ok || (semitones == 0 && steps == 0)) return;
+
+ m_config->setGroup(EditViewConfigGroup);
+
+ KTmpStatusMsg msg(i18n("Transposing..."), this);
+ if (intervalDialog.getChangeKey())
+ {
+ std::cout << "Transposing changing keys is not currently supported on selections" << std::endl;
+ }
+ else
+ {
+ // Transpose within key
+ //std::cout << "Transposing semitones, steps: " << semitones << ", " << steps << std::endl;
+ addCommandToHistory(new TransposeCommand
+ (semitones, steps, *m_currentEventSelection));
+ }
+}
+
+void EditView::slotTransposeUp()
+{
+ if (!m_currentEventSelection)
+ return ;
+ KTmpStatusMsg msg(i18n("Transposing up one semitone..."), this);
+
+ addCommandToHistory(new TransposeCommand(1, *m_currentEventSelection));
+}
+
+void EditView::slotTransposeUpOctave()
+{
+ if (!m_currentEventSelection)
+ return ;
+ KTmpStatusMsg msg(i18n("Transposing up one octave..."), this);
+
+ addCommandToHistory(new TransposeCommand(12, *m_currentEventSelection));
+}
+
+void EditView::slotTransposeDown()
+{
+ if (!m_currentEventSelection)
+ return ;
+ KTmpStatusMsg msg(i18n("Transposing down one semitone..."), this);
+
+ addCommandToHistory(new TransposeCommand( -1, *m_currentEventSelection));
+}
+
+void EditView::slotTransposeDownOctave()
+{
+ if (!m_currentEventSelection)
+ return ;
+ KTmpStatusMsg msg(i18n("Transposing down one octave..."), this);
+
+ addCommandToHistory(new TransposeCommand( -12, *m_currentEventSelection));
+}
+
+void EditView::slotInvert()
+{
+ if (!m_currentEventSelection)
+ return ;
+
+ int semitones = 0;
+
+ KTmpStatusMsg msg(i18n("Inverting..."), this);
+ addCommandToHistory(new InvertCommand
+ (semitones, *m_currentEventSelection));
+}
+
+void EditView::slotRetrograde()
+{
+ if (!m_currentEventSelection)
+ return ;
+
+ int semitones = 0;
+
+ KTmpStatusMsg msg(i18n("Retrograding..."), this);
+ addCommandToHistory(new RetrogradeCommand
+ (semitones, *m_currentEventSelection));
+}
+
+void EditView::slotRetrogradeInvert()
+{
+ if (!m_currentEventSelection)
+ return ;
+
+ int semitones = 0;
+
+ KTmpStatusMsg msg(i18n("Retrograde inverting..."), this);
+ addCommandToHistory(new RetrogradeInvertCommand
+ (semitones, *m_currentEventSelection));
+}
+
+void EditView::slotJogLeft()
+{
+ if (!m_currentEventSelection)
+ return ;
+ KTmpStatusMsg msg(i18n("Jogging left..."), this);
+
+ RG_DEBUG << "EditView::slotJogLeft" << endl;
+
+ addCommandToHistory(
+ new MoveCommand(*getCurrentSegment(),
+ -Note(Note::Demisemiquaver).getDuration(),
+ false, // don't use notation timings
+ *m_currentEventSelection));
+}
+
+void EditView::slotJogRight()
+{
+ if (!m_currentEventSelection)
+ return ;
+ KTmpStatusMsg msg(i18n("Jogging right..."), this);
+
+ RG_DEBUG << "EditView::slotJogRight" << endl;
+
+ addCommandToHistory(
+ new MoveCommand(*getCurrentSegment(),
+ Note(Note::Demisemiquaver).getDuration(),
+ false, // don't use notation timings
+ *m_currentEventSelection));
+}
+
+void
+EditView::slotFlipForwards()
+{
+ RG_DEBUG << "EditView::slotFlipForwards" << endl;
+ ControlRuler* ruler = getCurrentControlRuler();
+ if (ruler) ruler->flipForwards();
+}
+
+void
+EditView::slotFlipBackwards()
+{
+ RG_DEBUG << "EditView::slotFlipBackwards" << endl;
+ ControlRuler* ruler = getCurrentControlRuler();
+ if (ruler) ruler->flipBackwards();
+}
+
+ControlRuler* EditView::getCurrentControlRuler()
+{
+ return dynamic_cast<ControlRuler*>(m_controlRulers->currentPage());
+}
+
+ControlRuler* EditView::findRuler(PropertyName propertyName, int &index)
+{
+ for(index = 0; index < m_controlRulers->count(); ++index) {
+ PropertyControlRuler* ruler = dynamic_cast<PropertyControlRuler*>(m_controlRulers->page(index));
+ if (ruler && ruler->getPropertyName() == propertyName) return ruler;
+ }
+
+ return 0;
+}
+
+ControlRuler* EditView::findRuler(const ControlParameter& controller, int &index)
+{
+ for(index = 0; index < m_controlRulers->count(); ++index) {
+ ControllerEventsRuler* ruler = dynamic_cast<ControllerEventsRuler*>(m_controlRulers->page(index));
+ if (ruler && *(ruler->getControlParameter()) == controller) return ruler;
+ }
+
+ return 0;
+}
+
+PropertyControlRuler* EditView::makePropertyControlRuler(PropertyName propertyName)
+{
+ QCanvas* controlRulerCanvas = new QCanvas(this);
+ QSize viewSize = getViewSize();
+ controlRulerCanvas->resize(viewSize.width(), ControlRuler::DefaultRulerHeight); // TODO - keep it in sync with main canvas size
+
+// QCanvas* controlRulerCanvas = ControlRulerCanvasRepository::getCanvas(getCurrentSegment(), propertyName,
+// getViewSize());
+
+ PropertyControlRuler* controlRuler = new PropertyControlRuler
+ (propertyName, getCurrentStaff(), getHLayout(), this,
+ controlRulerCanvas, m_controlRulers);
+
+ controlRuler->setMainHorizontalScrollBar(m_canvasView->horizontalScrollBar());
+
+ return controlRuler;
+}
+
+ControllerEventsRuler* EditView::makeControllerEventRuler(const ControlParameter *controller)
+{
+ QCanvas* controlRulerCanvas = new QCanvas(this);
+ QSize viewSize = getViewSize();
+ controlRulerCanvas->resize(viewSize.width(), ControlRuler::DefaultRulerHeight); // TODO - keep it in sync with main canvas size
+// QCanvas* controlRulerCanvas = ControlRulerCanvasRepository::getCanvas(getCurrentSegment(), controller,
+// getViewSize());
+
+
+ ControllerEventsRuler* controlRuler = new ControllerEventsRuler
+ (getCurrentSegment(), getHLayout(), this,
+ controlRulerCanvas, m_controlRulers, controller);
+
+ controlRuler->setMainHorizontalScrollBar(m_canvasView->horizontalScrollBar());
+
+ return controlRuler;
+}
+
+RosegardenCanvasView* EditView::getCanvasView()
+{
+ return m_canvasView;
+}
+
+}
+#include "EditView.moc"
diff --git a/src/gui/general/EditView.h b/src/gui/general/EditView.h
new file mode 100644
index 0000000..da18982
--- /dev/null
+++ b/src/gui/general/EditView.h
@@ -0,0 +1,405 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_EDITVIEW_H_
+#define _RG_EDITVIEW_H_
+
+#include "base/PropertyName.h"
+#include "EditViewBase.h"
+#include "gui/dialogs/TempoDialog.h"
+#include <qsize.h>
+#include <qstring.h>
+#include <qwmatrix.h>
+#include <vector>
+#include "base/Event.h"
+
+
+class QWidget;
+class QVBoxLayout;
+class QVBox;
+class QPaintEvent;
+class QMouseEvent;
+class QCanvasItem;
+class KTabWidget;
+class Accidental;
+
+
+namespace Rosegarden
+{
+
+class Staff;
+class Segment;
+class RulerScale;
+class RosegardenGUIDoc;
+class RosegardenCanvasView;
+class PropertyControlRuler;
+class Key;
+class EventSelection;
+class Device;
+class ControlRuler;
+class ControlParameter;
+class ControllerEventsRuler;
+class Clef;
+class StandardRuler;
+class ActiveItem;
+
+
+class EditView : public EditViewBase
+{
+ Q_OBJECT
+
+public:
+
+ /**
+ * Create an EditView for the segments \a segments from document \a doc.
+ *
+ * \arg cols : number of columns, main column is always rightmost
+ *
+ */
+ EditView(RosegardenGUIDoc *doc,
+ std::vector<Segment *> segments,
+ unsigned int cols,
+ QWidget *parent,
+ const char *name = 0);
+
+ virtual ~EditView();
+
+ /**
+ * "Clever" readjustment of the view size
+ * If the new size is larger, enlarge to that size plus a margin
+ * If it is smaller, only shrink if the reduction is significant
+ * (e.g. new size is less than 75% of the old one)
+ *
+ * @arg exact if true, then set to newSize exactly
+ */
+ virtual void readjustViewSize(QSize newSize, bool exact = false);
+
+ /**
+ * Return the active item
+ */
+ ActiveItem* activeItem() { return m_activeItem; }
+
+ /**
+ * Set the active item
+ */
+ void setActiveItem(ActiveItem* i) { m_activeItem = i; }
+
+ /**
+ * Set the current event selection.
+ *
+ * If preview is true, sound the selection as well.
+ *
+ * If redrawNow is true, recolour the elements on the canvas;
+ * otherwise just line up a refresh for the next paint event.
+ *
+ * (If the selection has changed as part of a modification to a
+ * segment, redrawNow should be unnecessary and undesirable, as a
+ * paint event will occur in the next event loop following the
+ * command invocation anyway.)
+ */
+ virtual void setCurrentSelection(EventSelection* s,
+ bool preview = false,
+ bool redrawNow = false) = 0;
+
+ EventSelection* getCurrentSelection()
+ { return m_currentEventSelection; }
+
+ RosegardenCanvasView* getRawCanvasView() { return m_canvasView; }
+ virtual RosegardenCanvasView* getCanvasView();
+
+signals:
+ void changeTempo(timeT, // tempo change time
+ tempoT, // tempo value
+ tempoT, // target value
+ TempoDialog::TempoDialogAction); // tempo action
+
+public slots:
+ /**
+ * Called when a mouse press occurred on an active canvas item
+ *
+ * @see ActiveItem
+ * @see QCanvasItem#setActive
+ */
+ virtual void slotActiveItemPressed(QMouseEvent*, QCanvasItem*);
+
+ virtual void slotSetInsertCursorPosition(timeT position) = 0;
+
+ void slotExtendSelectionBackward();
+ void slotExtendSelectionForward();
+ void slotExtendSelectionBackwardBar();
+ void slotExtendSelectionForwardBar();
+ void slotExtendSelectionBackward(bool bar);
+ void slotExtendSelectionForward(bool bar);
+
+ virtual void slotStepBackward(); // default is event-by-event
+ virtual void slotStepForward(); // default is event-by-event
+ void slotJumpBackward();
+ void slotJumpForward();
+ void slotJumpToStart();
+ void slotJumpToEnd();
+
+ void slotAddTempo();
+ void slotAddTimeSignature();
+
+ virtual void slotShowVelocityControlRuler();
+ virtual void slotShowControllerEventsRuler();
+ virtual void slotShowPropertyControlRuler();
+
+ // rescale
+ void slotHalveDurations();
+ void slotDoubleDurations();
+ void slotRescale();
+
+ // transpose
+ void slotTransposeUp();
+ void slotTransposeUpOctave();
+ void slotTransposeDown();
+ void slotTransposeDownOctave();
+ void slotTranspose();
+ void slotDiatonicTranspose();
+
+ // invert
+ void slotInvert();
+ void slotRetrograde();
+ void slotRetrogradeInvert();
+
+ // jog events
+ void slotJogLeft();
+ void slotJogRight();
+
+ // Control ruler actions
+ //
+ void slotInsertControlRulerItem();
+ void slotEraseControlRulerItem();
+ void slotClearControlRulerItem();
+ void slotStartControlLineItem();
+ void slotFlipForwards();
+ void slotFlipBackwards();
+
+ // Property ruler actions
+ //
+ void slotDrawPropertyLine();
+ void slotSelectAllProperties();
+
+ // add control ruler
+ void slotAddControlRuler(int);
+ void slotRemoveControlRuler(QWidget*);
+
+protected:
+ virtual RulerScale* getHLayout() = 0;
+
+ QVBox* getBottomWidget() { return m_bottomBox; }
+
+ virtual void updateBottomWidgetGeometry();
+
+ virtual void paintEvent(QPaintEvent* e);
+
+ /**
+ * Locate the given widgets in the top bar-buttons position and
+ * connect up its scrolling signals.
+ */
+ void setTopStandardRuler(StandardRuler*, QWidget *leftBox = NULL);
+
+ /**
+ * Locate the given widget in the bottom bar-buttons position and
+ * connect up its scrolling signals.
+ */
+ void setBottomStandardRuler(StandardRuler*);
+
+ /**
+ * Set the 'Rewind' and 'Fast Forward' buttons in the transport
+ * toolbar to AutoRepeat
+ */
+ void setRewFFwdToAutoRepeat();
+
+ /**
+ * Locate the given widget right above the top bar-buttons and
+ * connect up its scrolling signals.
+ * The widget has to have a slotScrollHoriz(int) slot
+ */
+ void addRuler(QWidget*);
+
+ /**
+ * Add a ruler control box
+ */
+ void addPropertyBox(QWidget*);
+
+ /**
+ * Make a control ruler for the given property,
+ */
+ PropertyControlRuler* makePropertyControlRuler(PropertyName propertyName);
+
+ /**
+ * Make a ruler for controller events
+ */
+ ControllerEventsRuler* makeControllerEventRuler(const ControlParameter *controller = 0);
+
+ /**
+ * Add control ruler
+ */
+ void addControlRuler(ControlRuler* ruler);
+
+ /**
+ * Update all control rulers
+ */
+ void updateControlRulers(bool updateHPos=false);
+
+ /**
+ * Set zoom factor of control rulers
+ */
+ void setControlRulersZoom(QWMatrix);
+
+ /**
+ * Set current segment for control rulers
+ */
+ void setControlRulersCurrentSegment();
+
+ /**
+ * Find the control ruler for the given property name
+ * if it's already been created, return 0 otherwise
+ */
+ ControlRuler* findRuler(PropertyName propertyName, int &index);
+
+ /**
+ * Find the control ruler for the given controller
+ * if it's already been created, return 0 otherwise
+ */
+ ControlRuler* findRuler(const ControlParameter& controller, int &index);
+
+ /**
+ * Show a control ruler for the given property
+ * If the ruler already exists, activate the tab it's in,
+ * otherwise create the ruler and add it to the control rulers tab
+ * widget
+ */
+ void showPropertyControlRuler(PropertyName propertyName);
+
+ /**
+ * Return the control ruler currently displayed, or 0 if none exist
+ */
+ ControlRuler* getCurrentControlRuler();
+
+ /**
+ * Set up those actions common to any EditView (e.g. note insertion,
+ * time signatures etc)
+ */
+ void setupActions();
+
+ /**
+ * Set up the 'Add control ruler' sub-menu
+ */
+ void setupAddControlRulerMenu();
+
+ /**
+ * Do this after any other segment setup in a subordinate view.
+ * Returns true if there were any tabs to set up.
+ */
+ bool setupControllerTabs();
+
+ /**
+ * Create an action menu for inserting notes from the PC keyboard,
+ * and add it to the action collection. This is one of the methods
+ * called by setupActions().
+ */
+ void createInsertPitchActionMenu();
+
+ /**
+ * Get a note pitch from an action name (where the action is one of
+ * those created by createInsertPitchActionMenu). Can throw an
+ * Exception to mean that the action is not an insert one. Also
+ * returns any specified accidental through the reference arg.
+ */
+ int getPitchFromNoteInsertAction(QString actionName,
+ Accidental &acc,
+ const Clef &clef,
+ const ::Rosegarden::Key &key);
+
+ /**
+ * Abstract method to get the view size
+ * Typically implemented as canvas()->size().
+ */
+ virtual QSize getViewSize() = 0;
+
+ /**
+ * Abstract method to set the view size
+ * Typically implemented as canvas()->resize().
+ */
+ virtual void setViewSize(QSize) = 0;
+
+ /**
+ * Abstract method to get current insert-pointer time
+ */
+ virtual timeT getInsertionTime() = 0;
+
+ /**
+ * Return the time at which the insert cursor may be found,
+ * and the time signature, clef and key at that time. Default
+ * implementation is okay but slow.
+ */
+ virtual timeT getInsertionTime(Clef &clef, ::Rosegarden::Key &key);
+
+ /**
+ * Abstract method to get current staff (the returned staff will be
+ * that representing the segment of getCurrentSegment())
+ */
+ virtual Staff *getCurrentStaff() = 0;
+
+ /**
+ * Return the device of the current segment, if any
+ */
+ Device *getCurrentDevice();
+
+ virtual void setCanvasView(RosegardenCanvasView *cv);
+
+ //--------------- Data members ---------------------------------
+
+ /// The current selection of Events (for cut/copy/paste)
+ EventSelection* m_currentEventSelection;
+
+ ActiveItem* m_activeItem;
+
+ RosegardenCanvasView *m_canvasView;
+
+ QVBoxLayout *m_rulerBox;
+ QLabel *m_rulerBoxFiller;
+ QVBoxLayout *m_controlBox;
+ QVBox *m_bottomBox;
+ StandardRuler *m_topStandardRuler;
+ StandardRuler *m_bottomStandardRuler;
+ ControlRuler *m_controlRuler;
+ KTabWidget *m_controlRulers;
+ QWMatrix m_currentRulerZoomMatrix;
+
+ static const unsigned int RULERS_ROW;
+ static const unsigned int CONTROLS_ROW;
+ static const unsigned int TOPBARBUTTONS_ROW;
+ static const unsigned int CANVASVIEW_ROW;
+ static const unsigned int CONTROLRULER_ROW;
+};
+
+
+}
+
+#endif
diff --git a/src/gui/general/EditViewBase.cpp b/src/gui/general/EditViewBase.cpp
new file mode 100644
index 0000000..0193beb
--- /dev/null
+++ b/src/gui/general/EditViewBase.cpp
@@ -0,0 +1,711 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "EditViewBase.h"
+#include <qlayout.h>
+#include <kapplication.h>
+
+#include <klocale.h>
+#include <kstddirs.h>
+#include "misc/Debug.h"
+#include "base/Clipboard.h"
+#include "base/Event.h"
+#include "base/NotationTypes.h"
+#include "base/Segment.h"
+#include "commands/segment/SegmentReconfigureCommand.h"
+#include "document/MultiViewCommandHistory.h"
+#include "document/RosegardenGUIDoc.h"
+#include "EditToolBox.h"
+#include "EditTool.h"
+#include "EditView.h"
+#include "gui/dialogs/ConfigureDialog.h"
+#include "gui/dialogs/TimeDialog.h"
+#include "gui/general/EditViewTimeSigNotifier.h"
+#include "gui/kdeext/KTmpStatusMsg.h"
+#include <kaction.h>
+#include <kcommand.h>
+#include <kconfig.h>
+#include <kdockwidget.h>
+#include <kedittoolbar.h>
+#include <kglobal.h>
+#include <kkeydialog.h>
+#include <kmainwindow.h>
+#include <kstatusbar.h>
+#include <kstdaccel.h>
+#include <kstdaction.h>
+#include <kxmlguiclient.h>
+#include <qaccel.h>
+#include <qcanvas.h>
+#include <qdialog.h>
+#include <qframe.h>
+#include <qiconset.h>
+#include <qobject.h>
+#include <qpixmap.h>
+#include <qstring.h>
+#include <qwidget.h>
+
+
+namespace Rosegarden
+{
+
+bool EditViewBase::m_inPaintEvent = false;
+const unsigned int EditViewBase::ID_STATUS_MSG = 1;
+const unsigned int EditViewBase::NbLayoutRows = 6;
+
+EditViewBase::EditViewBase(RosegardenGUIDoc *doc,
+ std::vector<Segment *> segments,
+ unsigned int cols,
+ QWidget *parent, const char *name) :
+ KDockMainWindow(parent, name),
+ m_viewNumber( -1),
+ m_viewLocalPropertyPrefix(makeViewLocalPropertyPrefix()),
+ m_config(kapp->config()),
+ m_doc(doc),
+ m_segments(segments),
+ m_tool(0),
+ m_toolBox(0),
+ m_mainDockWidget(0),
+ m_centralFrame(0),
+ m_grid(0),
+ m_mainCol(cols - 1),
+ m_compositionRefreshStatusId(doc->getComposition().getNewRefreshStatusId()),
+ m_needUpdate(false),
+ m_pendingPaintEvent(0),
+ m_havePendingPaintEvent(false),
+ m_accelerators(0),
+ m_configDialogPageIndex(0),
+ m_inCtor(true),
+ m_timeSigNotifier(new EditViewTimeSigNotifier(doc))
+{
+
+ QPixmap dummyPixmap; // any icon will do
+ m_mainDockWidget = createDockWidget("Rosegarden EditView DockWidget", dummyPixmap,
+ 0L, "editview_dock_widget");
+ // allow others to dock to the left and right sides only
+ m_mainDockWidget->setDockSite(KDockWidget::DockLeft | KDockWidget::DockRight);
+ // forbit docking abilities of m_mainDockWidget itself
+ m_mainDockWidget->setEnableDocking(KDockWidget::DockNone);
+ setView(m_mainDockWidget); // central widget in a KDE mainwindow
+ setMainDockWidget(m_mainDockWidget); // master dockwidget
+
+ m_centralFrame = new QFrame(m_mainDockWidget, "centralframe");
+ m_grid = new QGridLayout(m_centralFrame, NbLayoutRows, cols);
+
+ m_mainDockWidget->setWidget(m_centralFrame);
+
+ initSegmentRefreshStatusIds();
+
+ m_doc->attachEditView(this);
+
+ QObject::connect
+ (getCommandHistory(), SIGNAL(commandExecuted()),
+ this, SLOT(update()));
+
+ QObject::connect
+ (getCommandHistory(), SIGNAL(commandExecuted()),
+ this, SLOT(slotTestClipboard()));
+
+ // create accelerators
+ //
+ m_accelerators = new QAccel(this);
+}
+
+EditViewBase::~EditViewBase()
+{
+ delete m_timeSigNotifier;
+
+ m_doc->detachEditView(this);
+
+ getCommandHistory()->detachView(actionCollection());
+ m_viewNumberPool.erase(m_viewNumber);
+ slotSaveOptions();
+}
+
+void EditViewBase::slotSaveOptions()
+{}
+
+void EditViewBase::readOptions()
+{
+ getToggleAction("options_show_statusbar")->setChecked(!statusBar()->isHidden());
+ getToggleAction("options_show_toolbar")->setChecked(!toolBar()->isHidden());
+}
+
+void EditViewBase::setupActions(QString rcFileName, bool haveClipboard)
+{
+ setRCFileName(rcFileName);
+
+ // Actions all edit views will have
+
+ KStdAction::showToolbar(this, SLOT(slotToggleToolBar()),
+ actionCollection(), "options_show_toolbar");
+
+ KStdAction::showStatusbar(this, SLOT(slotToggleStatusBar()),
+ actionCollection(), "options_show_statusbar");
+
+ KStdAction::preferences(this,
+ SLOT(slotConfigure()),
+ actionCollection());
+
+ KStdAction::keyBindings(this,
+ SLOT(slotEditKeys()),
+ actionCollection());
+
+ KStdAction::configureToolbars(this,
+ SLOT(slotEditToolbars()),
+ actionCollection());
+
+
+ // File menu
+ KStdAction::save (this, SIGNAL(saveFile()), actionCollection());
+ KStdAction::close(this, SLOT(slotCloseWindow()), actionCollection());
+
+ if (haveClipboard) {
+ KStdAction::cut (this, SLOT(slotEditCut()), actionCollection());
+ KStdAction::copy (this, SLOT(slotEditCopy()), actionCollection());
+ KStdAction::paste (this, SLOT(slotEditPaste()), actionCollection());
+ }
+
+ new KToolBarPopupAction(i18n("Und&o"),
+ "undo",
+ KStdAccel::key(KStdAccel::Undo),
+ actionCollection(),
+ KStdAction::stdName(KStdAction::Undo));
+
+ new KToolBarPopupAction(i18n("Re&do"),
+ "redo",
+ KStdAccel::key(KStdAccel::Redo),
+ actionCollection(),
+ KStdAction::stdName(KStdAction::Redo));
+
+ QString pixmapDir = KGlobal::dirs()->findResource("appdata", "pixmaps/");
+
+ QCanvasPixmap pixmap(pixmapDir + "/toolbar/matrix.png");
+ QIconSet icon = QIconSet(pixmap);
+ new KAction(i18n("Open in Matri&x Editor"), icon, 0, this,
+ SLOT(slotOpenInMatrix()), actionCollection(),
+ "open_in_matrix");
+
+ pixmap.load(pixmapDir + "/toolbar/matrix-percussion.png");
+ icon = QIconSet(pixmap);
+ new KAction(i18n("Open in &Percussion Matrix Editor"), icon, 0, this,
+ SLOT(slotOpenInPercussionMatrix()), actionCollection(),
+ "open_in_percussion_matrix");
+
+ pixmap.load(pixmapDir + "/toolbar/notation.png");
+ icon = QIconSet(pixmap);
+ new KAction(i18n("Open in &Notation Editor"), icon, 0, this,
+ SLOT(slotOpenInNotation()), actionCollection(),
+ "open_in_notation");
+
+ pixmap.load(pixmapDir + "/toolbar/eventlist.png");
+ icon = QIconSet(pixmap);
+ new KAction(i18n("Open in &Event List Editor"), icon, 0, this,
+ SLOT(slotOpenInEventList()), actionCollection(),
+ "open_in_event_list");
+
+ new KAction(i18n("Set Segment Start Time..."), 0, this,
+ SLOT(slotSetSegmentStartTime()), actionCollection(),
+ "set_segment_start");
+
+ new KAction(i18n("Set Segment Duration..."), 0, this,
+ SLOT(slotSetSegmentDuration()), actionCollection(),
+ "set_segment_duration");
+
+ // add undo and redo to edit menu and toolbar
+ getCommandHistory()->attachView(actionCollection());
+
+}
+
+void EditViewBase::slotConfigure()
+{
+ ConfigureDialog *configDlg =
+ new ConfigureDialog(getDocument(), m_config, this);
+
+ configDlg->showPage(getConfigDialogPageIndex());
+ configDlg->show();
+}
+
+void EditViewBase::slotEditKeys()
+{
+ KKeyDialog::configure(actionCollection());
+}
+
+void EditViewBase::slotEditToolbars()
+{
+ KEditToolbar dlg(actionCollection(), getRCFileName());
+
+ connect(&dlg, SIGNAL(newToolbarConfig()),
+ SLOT(slotUpdateToolbars()));
+
+ dlg.exec();
+}
+
+void EditViewBase::slotUpdateToolbars()
+{
+ createGUI(getRCFileName());
+ //m_viewToolBar->setChecked(!toolBar()->isHidden());
+}
+
+void
+EditViewBase::slotOpenInNotation()
+{
+
+ emit openInNotation(m_segments);
+}
+
+void
+EditViewBase::slotOpenInMatrix()
+{
+ emit openInMatrix(m_segments);
+}
+
+void
+EditViewBase::slotOpenInPercussionMatrix()
+{
+ emit openInPercussionMatrix(m_segments);
+}
+
+void
+EditViewBase::slotOpenInEventList()
+{
+ emit openInEventList(m_segments);
+}
+
+std::set<int> EditViewBase::m_viewNumberPool;
+
+std::string
+EditViewBase::makeViewLocalPropertyPrefix()
+{
+ static char buffer[100];
+ int i = 0;
+ while (m_viewNumberPool.find(i) != m_viewNumberPool.end())
+ ++i;
+ m_viewNumber = i;
+ m_viewNumberPool.insert(i);
+ sprintf(buffer, "View%d::", i);
+ return buffer;
+}
+
+void EditViewBase::paintEvent(QPaintEvent* e)
+{
+ // It is possible for this function to be called re-entrantly,
+ // because a re-layout procedure may deliberately ask the event
+ // loop to process some more events so as to keep the GUI looking
+ // responsive. If that happens, we remember the events that came
+ // in in the middle of one paintEvent call and process their union
+ // again at the end of the call.
+ /*
+ if (m_inPaintEvent) {
+ NOTATION_DEBUG << "EditViewBase::paintEvent: in paint event already" << endl;
+ if (e) {
+ if (m_havePendingPaintEvent) {
+ if (m_pendingPaintEvent) {
+ QRect r = m_pendingPaintEvent->rect().unite(e->rect());
+ *m_pendingPaintEvent = QPaintEvent(r);
+ } else {
+ m_pendingPaintEvent = new QPaintEvent(*e);
+ }
+ } else {
+ m_pendingPaintEvent = new QPaintEvent(*e);
+ }
+ }
+ m_havePendingPaintEvent = true;
+ return;
+ }
+ */
+ //!!! m_inPaintEvent = true;
+
+ if (isCompositionModified()) {
+
+ // Check if one of the segments we display has been removed
+ // from the composition.
+ //
+ // For the moment we'll have to close the view if any of the
+ // segments we handle has been deleted.
+
+ for (unsigned int i = 0; i < m_segments.size(); ++i) {
+
+ if (!m_segments[i]->getComposition()) {
+ // oops, I think we've been deleted
+ close();
+ return ;
+ }
+ }
+ }
+
+
+ m_needUpdate = false;
+
+ // Scan all segments and check if they've been modified.
+ //
+ // If we have more than one segment modified, we need to update
+ // them all at once with the same time range, otherwise we can run
+ // into problems when the layout of one depends on the others. So
+ // we use updateStart/End to calculate a bounding range for all
+ // modifications.
+
+ timeT updateStart = 0, updateEnd = 0;
+ int segmentsToUpdate = 0;
+ Segment *singleSegment = 0;
+
+ for (unsigned int i = 0; i < m_segments.size(); ++i) {
+
+ Segment* segment = m_segments[i];
+ unsigned int refreshStatusId = m_segmentsRefreshStatusIds[i];
+ SegmentRefreshStatus &refreshStatus =
+ segment->getRefreshStatus(refreshStatusId);
+
+ if (refreshStatus.needsRefresh() && isCompositionModified()) {
+
+ // if composition is also modified, relayout everything
+ refreshSegment(0);
+ segmentsToUpdate = 0;
+ break;
+
+ } else if (m_timeSigNotifier->hasTimeSigChanged()) {
+
+ // not exactly optimal!
+ refreshSegment(0);
+ segmentsToUpdate = 0;
+ m_timeSigNotifier->reset();
+ break;
+
+ } else if (refreshStatus.needsRefresh()) {
+
+ timeT startTime = refreshStatus.from(),
+ endTime = refreshStatus.to();
+
+ if (segmentsToUpdate == 0 || startTime < updateStart) {
+ updateStart = startTime;
+ }
+ if (segmentsToUpdate == 0 || endTime > updateEnd) {
+ updateEnd = endTime;
+ }
+ singleSegment = segment;
+ ++segmentsToUpdate;
+
+ refreshStatus.setNeedsRefresh(false);
+ m_needUpdate = true;
+ }
+ }
+
+ if (segmentsToUpdate > 1) {
+ refreshSegment(0, updateStart, updateEnd);
+ } else if (segmentsToUpdate > 0) {
+ refreshSegment(singleSegment, updateStart, updateEnd);
+ }
+
+ if (e)
+ KMainWindow::paintEvent(e);
+
+ // moved this to the end of the method so that things called
+ // from this method can still test whether the composition had
+ // been modified (it's sometimes useful to know whether e.g.
+ // any time signatures have changed)
+ setCompositionModified(false);
+
+ //!!! m_inPaintEvent = false;
+ /*
+ if (m_havePendingPaintEvent) {
+ e = m_pendingPaintEvent;
+ m_havePendingPaintEvent = false;
+ m_pendingPaintEvent = 0;
+ paintEvent(e);
+ delete e;
+ }
+ */
+}
+
+void EditViewBase::closeEvent(QCloseEvent* e)
+{
+ RG_DEBUG << "EditViewBase::closeEvent()\n";
+
+ if (isInCtor()) {
+ RG_DEBUG << "EditViewBase::closeEvent() : is in ctor, ignoring close event\n";
+ e->ignore();
+ } else {
+ KMainWindow::closeEvent(e);
+ }
+}
+
+void EditViewBase::addCommandToHistory(KCommand *command)
+{
+ getCommandHistory()->addCommand(command);
+}
+
+void EditViewBase::setTool(EditTool* tool)
+{
+ if (m_tool)
+ m_tool->stow();
+
+ m_tool = tool;
+
+ if (m_tool)
+ m_tool->ready();
+
+}
+
+void EditViewBase::slotCloseWindow()
+{
+ close();
+}
+
+void EditViewBase::slotToggleToolBar()
+{
+ KTmpStatusMsg msg(i18n("Toggle the toolbar..."), this);
+
+ if (toolBar()->isVisible())
+ toolBar()->hide();
+ else
+ toolBar()->show();
+}
+
+void EditViewBase::slotToggleStatusBar()
+{
+ KTmpStatusMsg msg(i18n("Toggle the statusbar..."), this);
+
+ if (statusBar()->isVisible())
+ statusBar()->hide();
+ else
+ statusBar()->show();
+}
+
+void EditViewBase::slotStatusMsg(const QString &text)
+{
+ ///////////////////////////////////////////////////////////////////
+ // change status message permanently
+ statusBar()->clear();
+ statusBar()->changeItem(text, ID_STATUS_MSG);
+}
+
+void EditViewBase::slotStatusHelpMsg(const QString &text)
+{
+ ///////////////////////////////////////////////////////////////////
+ // change status message of whole statusbar temporary (text, msec)
+ statusBar()->message(text, 2000);
+}
+
+void EditViewBase::initSegmentRefreshStatusIds()
+{
+ for (unsigned int i = 0; i < m_segments.size(); ++i) {
+
+ unsigned int rid = m_segments[i]->getNewRefreshStatusId();
+ m_segmentsRefreshStatusIds.push_back(rid);
+ }
+}
+
+bool EditViewBase::isCompositionModified()
+{
+ return getDocument()->getComposition().getRefreshStatus
+ (m_compositionRefreshStatusId).needsRefresh();
+}
+
+void EditViewBase::setCompositionModified(bool c)
+{
+ getDocument()->getComposition().getRefreshStatus
+ (m_compositionRefreshStatusId).setNeedsRefresh(c);
+}
+
+bool EditViewBase::getSegmentsOnlyRestsAndClefs()
+{
+ using Rosegarden::Segment;
+
+ for (unsigned int i = 0; i < m_segments.size(); ++i) {
+
+ Segment* segment = m_segments[i];
+
+ for (Segment::iterator iter = segment->begin();
+ iter != segment->end(); ++iter) {
+
+ if (((*iter)->getType() != Note::EventRestType)
+ && ((*iter)->getType() != Clef::EventType))
+ return false;
+ }
+
+ }
+
+ return true;
+
+}
+
+void EditViewBase::toggleWidget(QWidget* widget,
+ const QString& toggleActionName)
+{
+ KToggleAction* toggleAction = getToggleAction(toggleActionName);
+
+ if (!toggleAction) {
+ RG_DEBUG << "!!! Unknown toggle action : " << toggleActionName << endl;
+ return ;
+ }
+
+ widget->setShown(toggleAction->isChecked());
+}
+
+void
+EditViewBase::slotTestClipboard()
+{
+ if (getDocument()->getClipboard()->isEmpty()) {
+ RG_DEBUG << "EditViewBase::slotTestClipboard(): empty" << endl;
+
+ stateChanged("have_clipboard", KXMLGUIClient::StateReverse);
+ stateChanged("have_clipboard_single_segment",
+ KXMLGUIClient::StateReverse);
+ } else {
+ RG_DEBUG << "EditViewBase::slotTestClipboard(): not empty" << endl;
+
+ stateChanged("have_clipboard", KXMLGUIClient::StateNoReverse);
+ stateChanged("have_clipboard_single_segment",
+ (getDocument()->getClipboard()->isSingleSegment() ?
+ KXMLGUIClient::StateNoReverse :
+ KXMLGUIClient::StateReverse));
+ }
+}
+
+void
+EditViewBase::slotToggleSolo()
+{
+ KToggleAction* toggleSoloAction = getToggleAction("toggle_solo");
+ if (!toggleSoloAction)
+ return ;
+
+ bool newSoloState = toggleSoloAction->isChecked();
+
+ RG_DEBUG << "EditViewBase::slotToggleSolo() : solo = " << newSoloState << endl;
+ emit toggleSolo(newSoloState);
+
+ if (newSoloState) {
+ emit selectTrack(getCurrentSegment()->getTrack());
+ }
+
+}
+
+void
+EditViewBase::slotStateChanged(const QString& s,
+ bool noReverse)
+{
+ RG_DEBUG << "EditViewBase::slotStateChanged " << s << ", " << noReverse << endl;
+ stateChanged(s, noReverse ? KXMLGUIClient::StateNoReverse : KXMLGUIClient::StateReverse);
+}
+
+void
+EditViewBase::slotSetSegmentStartTime()
+{
+ Segment *s = getCurrentSegment();
+ if (!s)
+ return ;
+
+ TimeDialog dialog(this, i18n("Segment Start Time"),
+ &getDocument()->getComposition(),
+ s->getStartTime(), false);
+
+ if (dialog.exec() == QDialog::Accepted) {
+
+ SegmentReconfigureCommand *command =
+ new SegmentReconfigureCommand(i18n("Set Segment Start Time"));
+
+ command->addSegment
+ (s, dialog.getTime(),
+ s->getEndMarkerTime() - s->getStartTime() + dialog.getTime(),
+ s->getTrack());
+
+ addCommandToHistory(command);
+ }
+}
+
+void
+EditViewBase::slotSetSegmentDuration()
+{
+ Segment *s = getCurrentSegment();
+ if (!s)
+ return ;
+
+ TimeDialog dialog(this, i18n("Segment Duration"),
+ &getDocument()->getComposition(),
+ s->getStartTime(),
+ s->getEndMarkerTime() - s->getStartTime(), false);
+
+ if (dialog.exec() == QDialog::Accepted) {
+
+ SegmentReconfigureCommand *command =
+ new SegmentReconfigureCommand(i18n("Set Segment Duration"));
+
+ command->addSegment
+ (s, s->getStartTime(),
+ s->getStartTime() + dialog.getTime(),
+ s->getTrack());
+
+ addCommandToHistory(command);
+ }
+}
+
+void EditViewBase::slotCompositionStateUpdate()
+{
+ // update state of 'solo' toggle
+ //
+ KToggleAction* toggleSolo = getToggleAction("toggle_solo");
+ if (!toggleSolo)
+ return ;
+
+ if (getDocument()->getComposition().isSolo()) {
+ bool s = m_segments[0]->getTrack() == getDocument()->getComposition().getSelectedTrack();
+ RG_DEBUG << "EditViewBase::slotCompositionStateUpdate() : set solo to " << s << endl;
+ toggleSolo->setChecked(s);
+ } else {
+ toggleSolo->setChecked(false);
+ RG_DEBUG << "EditViewBase::slotCompositionStateUpdate() : set solo to false\n";
+ }
+
+ // update the window caption
+ //
+ updateViewCaption();
+}
+
+void
+EditViewBase::windowActivationChange(bool oldState)
+{
+ if (isActiveWindow()) {
+ emit windowActivated();
+ }
+}
+
+void
+EditViewBase::handleEventRemoved(Event *event)
+{
+ if (m_tool)
+ m_tool->handleEventRemoved(event);
+}
+
+MultiViewCommandHistory* EditViewBase::getCommandHistory()
+{
+ return getDocument()->getCommandHistory();
+}
+
+KToggleAction* EditViewBase::getToggleAction(const QString& actionName)
+{
+ return dynamic_cast<KToggleAction*>(actionCollection()->action(actionName));
+}
+
+}
+#include "EditViewBase.moc"
diff --git a/src/gui/general/EditViewBase.h b/src/gui/general/EditViewBase.h
new file mode 100644
index 0000000..03784cb
--- /dev/null
+++ b/src/gui/general/EditViewBase.h
@@ -0,0 +1,396 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_EDITVIEWBASE_H_
+#define _RG_EDITVIEWBASE_H_
+
+#include <set>
+#include <string>
+#include <kdockwidget.h>
+#include <qstring.h>
+#include <vector>
+#include "base/Event.h"
+
+
+class QWidget;
+class QPaintEvent;
+class QGridLayout;
+class QFrame;
+class QCloseEvent;
+class QAccel;
+class KToggleAction;
+class KConfig;
+class KCommand;
+namespace Rosegarden { class EditViewTimeSigNotifier; }
+
+
+namespace Rosegarden
+{
+
+class Segment;
+class RosegardenGUIDoc;
+class MultiViewCommandHistory;
+class Event;
+class EditToolBox;
+class EditTool;
+
+
+class EditViewBase : public KDockMainWindow
+{
+
+ Q_OBJECT
+
+public:
+
+ /**
+ * Create an EditViewBase for the segments \a segments from document \a doc.
+ *
+ * \arg cols : number of columns, main column is always rightmost
+ *
+ */
+ EditViewBase(RosegardenGUIDoc *doc,
+ std::vector<Segment *> segments,
+ unsigned int cols,
+ QWidget *parent,
+ const char *name = 0);
+
+ virtual ~EditViewBase();
+
+ const RosegardenGUIDoc *getDocument() const { return m_doc; }
+ RosegardenGUIDoc *getDocument() { return m_doc; }
+
+ /**
+ * Refresh part of a Segment following a modification made in this
+ * or another view. The startTime and endTime give the extents of
+ * the modified region. This method is called following a
+ * modification to any Segment; no attempt has been made to check
+ * that the given Segment is actually shown in this view, so take
+ * care.
+ *
+ * If segment is null, refresh all segments.
+ * If the startTime and endTime are equal, refresh the whole of
+ * the relevant segments.
+ */
+ virtual void refreshSegment(Segment *segment,
+ timeT startTime = 0,
+ timeT endTime = 0) = 0;
+
+ /**
+ * Get the document's global command history
+ */
+ virtual MultiViewCommandHistory *getCommandHistory();
+
+ /**
+ * Add a Command to the history
+ */
+ virtual void addCommandToHistory(KCommand *);
+
+ /**
+ * Update the view
+ */
+ virtual void updateView() = 0;
+
+ /**
+ * Return our local accelerator object
+ */
+ QAccel* getAccelerators() { return m_accelerators; }
+
+ /**
+ * Return a string unique to this view (amongst views currently
+ * extant) that can be used (e.g. as a prefix) to distinguish
+ * view-local properties. It's up to the subclass or other user
+ * of this string to manage the properties correctly, for example
+ * by deleting them from the events when the view closes.
+ */
+ std::string getViewLocalPropertyPrefix() {
+ return m_viewLocalPropertyPrefix;
+ }
+
+ /*
+ * So that other people can create tools against our view
+ *
+ */
+ EditToolBox* getToolBox() { return m_toolBox; }
+
+ /**
+ * Let tools know if their current element has gone
+ */
+ virtual void handleEventRemoved(Event *event);
+
+ static const unsigned int ID_STATUS_MSG;
+ static const unsigned int NbLayoutRows;
+
+
+signals:
+ /**
+ * Tell the app to save the file.
+ */
+ void saveFile();
+
+ /**
+ * Reopen the given segments in another sort of editor.
+ */
+ void openInNotation(std::vector<Segment *>);
+ void openInMatrix(std::vector<Segment *>);
+ void openInPercussionMatrix(std::vector<Segment *>);
+ void openInEventList(std::vector<Segment *>);
+
+ /**
+ * Tell the main view that the track being edited is the
+ * current selected track
+ * This is used by #slotToggleSolo
+ */
+ void selectTrack(int);
+
+ /**
+ * Tell the main view that the solo status has changed (the user clicked on the 'solo' toggle)
+ */
+ void toggleSolo(bool);
+
+ void windowActivated();
+
+public slots:
+ /**
+ * close window
+ */
+ virtual void slotCloseWindow();
+
+ /**
+ * put the indicationed text/object into the clipboard and remove * it
+ * from the document
+ */
+ virtual void slotEditCut() = 0;
+
+ /**
+ * put the indicationed text/object into the clipboard
+ */
+ virtual void slotEditCopy() = 0;
+
+ /**
+ * paste the clipboard into the document
+ */
+ virtual void slotEditPaste() = 0;
+
+ /**
+ * toggles the main toolbar
+ */
+ virtual void slotToggleToolBar();
+
+ /**
+ * toggles the statusbar
+ */
+ virtual void slotToggleStatusBar();
+
+ /**
+ * Changes the statusbar contents for the standard label permanently,
+ * used to indicate current actions.
+ *
+ * @param text the text that is displayed in the statusbar
+ */
+ virtual void slotStatusMsg(const QString &text);
+
+ /**
+ * Changes the status message of the whole statusbar for two
+ * seconds, then restores the last status. This is used to display
+ * statusbar messages that give information about actions for
+ * toolbar icons and menuentries.
+ *
+ * @param text the text that is displayed in the statusbar
+ */
+ virtual void slotStatusHelpMsg(const QString &text);
+
+ /**
+ * A command has happened; check the clipboard in case we
+ * need to change state
+ */
+ virtual void slotTestClipboard();
+
+ /**
+ * Connected to this view's toolbar 'solo' button
+ */
+ virtual void slotToggleSolo();
+
+ void slotStateChanged(const QString&, bool noReverse);
+
+ virtual void slotOpenInMatrix();
+ virtual void slotOpenInPercussionMatrix();
+ virtual void slotOpenInNotation();
+ virtual void slotOpenInEventList();
+
+ /**
+ * Set the start time of the current segment
+ */
+ void slotSetSegmentStartTime();
+
+ /**
+ * Set the duration of the current segment
+ */
+ void slotSetSegmentDuration();
+
+ /**
+ * Global composition updates from the main view (track selection, solo, etc...)
+ */
+ virtual void slotCompositionStateUpdate();
+
+protected:
+
+ virtual void windowActivationChange(bool);
+
+ virtual void paintEvent(QPaintEvent* e);
+
+ /**
+ * @see #setInCtor
+ */
+ virtual void closeEvent(QCloseEvent* e);
+
+ /**
+ * ignore close events while we're in ctor
+ */
+ void setOutOfCtor() { m_inCtor = false; }
+
+ /**
+ * Check if we're still in ctor
+ */
+ bool isInCtor() { return m_inCtor; }
+
+ /**
+ * Set the current Notation tool (note inserter, rest inserter, eraser...)
+ *
+ * Called when the user selects a new item on one of the notation toolbars
+ * (notes toolbars, rests toolbars...)
+ */
+ void setTool(EditTool*);
+
+ /**
+ * read general Options again and initialize all variables like the recent file list
+ */
+ virtual void readOptions();
+
+ /**
+ * create menus and toolbars
+ */
+ virtual void setupActions(QString rcFileName, bool haveClipboard = true);
+
+ /**
+ * setup status bar
+ */
+ virtual void initStatusBar() = 0;
+
+ /**
+ * Abstract method to get current segment
+ */
+ virtual Segment *getCurrentSegment() = 0;
+
+ /**
+ * Set the caption of the view's window
+ */
+ virtual void updateViewCaption() = 0;
+
+protected slots:
+ /**
+ * save general Options like all bar positions and status as well
+ * as the geometry and the recent file list to the configuration
+ * file
+ */
+ virtual void slotSaveOptions();
+ virtual void slotConfigure();
+ virtual void slotEditKeys();
+ virtual void slotEditToolbars();
+ virtual void slotUpdateToolbars();
+
+protected:
+ QWidget* getCentralWidget() { return m_centralFrame; }
+
+ void initSegmentRefreshStatusIds();
+
+ bool isCompositionModified();
+ void setCompositionModified(bool);
+
+ /**
+ * Returns true if all of the segments contain
+ * only rests and clefs events
+ */
+ bool getSegmentsOnlyRestsAndClefs();
+
+ /// Convenience function around actionCollection()->action()
+ KToggleAction* getToggleAction(const QString& actionName);
+
+ /**
+ * Make a widget visible depending on the state of a
+ * KToggleAction
+ */
+ virtual void toggleWidget(QWidget* widget, const QString& toggleActionName);
+
+ void setRCFileName(QString s) { m_rcFileName = s; }
+ QString getRCFileName() { return m_rcFileName; }
+
+ /**
+ * Set the page index of the config dialog which corresponds to
+ * this editview
+ */
+ void setConfigDialogPageIndex(int p) { m_configDialogPageIndex = p; }
+ int getConfigDialogPageIndex() { return m_configDialogPageIndex; }
+
+ //--------------- Data members ---------------------------------
+ QString m_rcFileName;
+
+ static std::set<int> m_viewNumberPool;
+ std::string makeViewLocalPropertyPrefix();
+ int m_viewNumber;
+ std::string m_viewLocalPropertyPrefix;
+
+ KConfig* m_config;
+
+ RosegardenGUIDoc* m_doc;
+ std::vector<Segment *> m_segments;
+ std::vector<unsigned int> m_segmentsRefreshStatusIds;
+
+ EditTool* m_tool;
+ EditToolBox* m_toolBox;
+
+ KDockWidget *m_mainDockWidget;
+ QFrame *m_centralFrame;
+ QGridLayout *m_grid;
+
+ unsigned int m_mainCol;
+ unsigned int m_compositionRefreshStatusId;
+ bool m_needUpdate;
+
+ QPaintEvent *m_pendingPaintEvent;
+ bool m_havePendingPaintEvent;
+ static bool m_inPaintEvent; // true if _any_ edit view is in a paint event
+
+ QAccel *m_accelerators;
+
+ int m_configDialogPageIndex;
+
+ bool m_inCtor;
+
+ EditViewTimeSigNotifier *m_timeSigNotifier;
+};
+
+
+}
+
+#endif
diff --git a/src/gui/general/EditViewTimeSigNotifier.h b/src/gui/general/EditViewTimeSigNotifier.h
new file mode 100644
index 0000000..679494d
--- /dev/null
+++ b/src/gui/general/EditViewTimeSigNotifier.h
@@ -0,0 +1,56 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#ifndef _RG_EDITVIEWTIMESIGNOTIFIER_H_
+#define _RG_EDITVIEWTIMESIGNOTIFIER_H_
+
+namespace Rosegarden {
+
+class EditViewTimeSigNotifier : public Rosegarden::CompositionObserver
+{
+public:
+ EditViewTimeSigNotifier(RosegardenGUIDoc *doc) :
+ m_composition(&doc->getComposition()),
+ m_timeSigChanged(false) {
+ m_composition->addObserver(this);
+ }
+ virtual ~EditViewTimeSigNotifier() {
+ if (!isCompositionDeleted()) m_composition->removeObserver(this);
+ }
+ virtual void timeSignatureChanged(const Rosegarden::Composition *c) {
+ if (c == m_composition) m_timeSigChanged = true;
+ }
+
+ bool hasTimeSigChanged() const { return m_timeSigChanged; }
+ void reset() { m_timeSigChanged = false; }
+
+protected:
+ Rosegarden::Composition *m_composition;
+ bool m_timeSigChanged;
+};
+
+}
+
+#endif /*EDITVIEWTIMESIGNOTIFIER_H_*/
diff --git a/src/gui/general/GUIPalette.cpp b/src/gui/general/GUIPalette.cpp
new file mode 100644
index 0000000..4705c21
--- /dev/null
+++ b/src/gui/general/GUIPalette.cpp
@@ -0,0 +1,311 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "GUIPalette.h"
+#include <kapplication.h>
+
+#include "base/Colour.h"
+#include "document/ConfigGroups.h"
+#include <kconfig.h>
+#include <qcolor.h>
+
+
+namespace Rosegarden
+{
+
+QColor GUIPalette::getColour(const char* const colourName)
+{
+ KConfig* config = kapp->config();
+ config->setGroup(ColoursConfigGroup);
+
+ QColor res = getInstance()->m_defaultsMap[colourName];
+ config->readColorEntry(colourName, &res);
+ return res;
+}
+
+Colour GUIPalette::convertColour(const QColor &input)
+{
+ int r, g, b;
+ input.rgb(&r, &g, &b);
+ return Colour(r, g, b);
+}
+
+QColor GUIPalette::convertColour(const Colour& input)
+{
+ return QColor(input.getRed(), input.getGreen(), input.getBlue());
+}
+
+GUIPalette::GUIPalette()
+{
+ m_defaultsMap[ActiveRecordTrack] = Qt::red;
+
+ m_defaultsMap[SegmentCanvas] = QColor(230, 230, 230);
+ m_defaultsMap[SegmentBorder] = Qt::black;
+
+ // 1.0 colors
+ // m_defaultsMap[RecordingInternalSegmentBlock] = QColor(255, 182, 193);
+ // m_defaultsMap[RecordingAudioSegmentBlock] = QColor(182, 222, 255);
+
+ // MIDI recording preview (pale yellow)
+ m_defaultsMap[RecordingInternalSegmentBlock] = QColor(255, 234, 182);
+
+ // audio recording preview (pale red)
+ m_defaultsMap[RecordingAudioSegmentBlock] = QColor(255, 182, 193);
+
+ m_defaultsMap[RecordingSegmentBorder] = Qt::black;
+
+ m_defaultsMap[RepeatSegmentBorder] = QColor(130, 133, 170);
+
+ m_defaultsMap[SegmentAudioPreview] = QColor(39, 71, 22);
+ m_defaultsMap[SegmentInternalPreview] = Qt::white;
+ m_defaultsMap[SegmentLabel] = Qt::black;
+ m_defaultsMap[SegmentSplitLine] = Qt::black;
+
+ m_defaultsMap[MatrixElementBorder] = Qt::black;
+ m_defaultsMap[MatrixElementBlock] = QColor(98, 128, 232);
+ m_defaultsMap[MatrixOverlapBlock] = Qt::black;
+
+ m_defaultsMap[LoopRulerBackground] = QColor(120, 120, 120);
+ m_defaultsMap[LoopRulerForeground] = Qt::white;
+ m_defaultsMap[LoopHighlight] = Qt::white;
+
+ m_defaultsMap[TempoBase] = QColor(197, 211, 125);
+
+ //m_defaultsMap[TextRulerBackground] = QColor(60, 205, 230, QColor::Hsv);
+ // m_defaultsMap[TextRulerBackground] = QColor(120, 90, 238, QColor::Hsv);
+ // m_defaultsMap[TextRulerBackground] = QColor(210, 220, 140);
+ m_defaultsMap[TextRulerBackground] = QColor(226, 232, 187);
+ m_defaultsMap[TextRulerForeground] = Qt::white;
+
+ m_defaultsMap[ChordNameRulerBackground] = QColor(230, 230, 230);
+ m_defaultsMap[ChordNameRulerForeground] = Qt::black;
+
+ m_defaultsMap[RawNoteRulerBackground] = QColor(240, 240, 240);
+ m_defaultsMap[RawNoteRulerForeground] = Qt::black;
+
+ m_defaultsMap[LevelMeterGreen] = QColor(0, 200, 0);
+ m_defaultsMap[LevelMeterOrange] = QColor(255, 165, 0);
+ m_defaultsMap[LevelMeterRed] = QColor(200, 0, 0);
+
+ // m_defaultsMap[LevelMeterSolidGreen] = QColor(0, 140, 0);
+ m_defaultsMap[LevelMeterSolidGreen] = QColor(84, 177, 248); // blue!
+ // m_defaultsMap[LevelMeterSolidOrange] = QColor(220, 120, 0);
+ m_defaultsMap[LevelMeterSolidOrange] = QColor(255, 225, 0);
+ // m_defaultsMap[LevelMeterSolidRed] = QColor(255, 50, 50);
+ m_defaultsMap[LevelMeterSolidRed] = QColor(255, 0, 0);
+
+ m_defaultsMap[BarLine] = Qt::black;
+ m_defaultsMap[BarLineIncorrect] = QColor(211, 0, 31);
+ m_defaultsMap[BeatLine] = QColor(100, 100, 100);
+ m_defaultsMap[SubBeatLine] = QColor(212, 212, 212);
+ m_defaultsMap[StaffConnectingLine] = QColor(192, 192, 192);
+ m_defaultsMap[StaffConnectingTerminatingLine] = QColor(128, 128, 128);
+
+ m_defaultsMap[Pointer] = Qt::darkBlue;
+ m_defaultsMap[PointerRuler] = QColor(100, 100, 100);
+
+ m_defaultsMap[InsertCursor] = QColor(160, 104, 186);
+ m_defaultsMap[InsertCursorRuler] = QColor(160, 136, 170);
+
+ m_defaultsMap[TrackDivider] = QColor(145, 145, 145);
+ //m_defaultsMap[MovementGuide] = QColor(172, 230, 139);
+ m_defaultsMap[MovementGuide] = QColor(62, 161, 194);
+ //m_defaultsMap[MovementGuide] = QColor(255, 189, 89);
+ m_defaultsMap[SelectionRectangle] = QColor(103, 128, 211);
+ m_defaultsMap[SelectedElement] = QColor(0, 54, 232);
+
+ const int SelectedElementHue = 225;
+ const int SelectedElementMinValue = 220;
+ const int HighlightedElementHue = 25;
+ const int HighlightedElementMinValue = 220;
+ const int QuantizedNoteHue = 69;
+ const int QuantizedNoteMinValue = 140;
+ const int TriggerNoteHue = 4;
+ const int TriggerNoteMinValue = 140;
+ const int OutRangeNoteHue = 0;
+ const int OutRangeNoteMinValue = 200;
+
+ m_defaultsMap[TextAnnotationBackground] = QColor(255, 255, 180);
+
+ m_defaultsMap[TextLilyPondDirectiveBackground] = QColor(95, 157, 87);
+
+ m_defaultsMap[AudioCountdownBackground] = Qt::darkGray;
+ m_defaultsMap[AudioCountdownForeground] = Qt::red;
+
+// m_defaultsMap[RotaryFloatBackground] = Qt::cyan;
+ m_defaultsMap[RotaryFloatBackground] = QColor(182, 222, 255);
+ m_defaultsMap[RotaryFloatForeground] = Qt::black;
+
+ m_defaultsMap[RotaryPastelBlue] = QColor(205, 212, 255);
+ m_defaultsMap[RotaryPastelRed] = QColor(255, 168, 169);
+ m_defaultsMap[RotaryPastelGreen] = QColor(231, 255, 223);
+ m_defaultsMap[RotaryPastelOrange] = QColor(255, 233, 208);
+ m_defaultsMap[RotaryPastelYellow] = QColor(249, 255, 208);
+
+ m_defaultsMap[MatrixKeyboardFocus] = QColor(224, 112, 8);
+
+ // m_defaultsMap[RotaryPlugin] = QColor(185, 255, 248);
+ m_defaultsMap[RotaryPlugin] = QColor(185, 200, 248);
+ // m_defaultsMap[RotaryPlugin] = QColor(185, 185, 185);
+
+ m_defaultsMap[RotaryMeter] = QColor(255, 100, 0);
+
+ m_defaultsMap[MarkerBackground] = QColor(185, 255, 248);
+
+ m_defaultsMap[QuickMarker] = Qt::red;
+
+ // m_defaultsMap[MuteTrackLED] = QColor(218, 190, 230, QColor::Hsv);
+ m_defaultsMap[MuteTrackLED] = QColor(211, 194, 238, QColor::Hsv);
+ m_defaultsMap[RecordMIDITrackLED] = QColor(45, 250, 225, QColor::Hsv);
+ m_defaultsMap[RecordAudioTrackLED] = QColor(0, 250, 225, QColor::Hsv);
+
+ m_defaultsMap[PlaybackFaderOutline] = QColor(211, 194, 238, QColor::Hsv);
+ m_defaultsMap[RecordFaderOutline] = QColor(0, 250, 225, QColor::Hsv);
+}
+
+GUIPalette* GUIPalette::getInstance()
+{
+ if (!m_instance) m_instance = new GUIPalette();
+ return m_instance;
+}
+
+const char* const GUIPalette::ActiveRecordTrack = "activerecordtrack";
+
+
+const char* const GUIPalette::SegmentCanvas = "segmentcanvas";
+const char* const GUIPalette::SegmentBorder = "segmentborder";
+const char* const GUIPalette::RecordingInternalSegmentBlock = "recordinginternalsegmentblock";
+const char* const GUIPalette::RecordingAudioSegmentBlock = "recordingaudiosegmentblock";
+const char* const GUIPalette::RecordingSegmentBorder = "recordingsegmentborder";
+
+const char* const GUIPalette::RepeatSegmentBorder = "repeatsegmentborder";
+
+const char* const GUIPalette::SegmentAudioPreview = "segmentaudiopreview";
+const char* const GUIPalette::SegmentInternalPreview = "segmentinternalpreview";
+const char* const GUIPalette::SegmentLabel = "segmentlabel";
+const char* const GUIPalette::SegmentSplitLine = "segmentsplitline";
+
+const char* const GUIPalette::MatrixElementBorder = "matrixelementborder";
+const char* const GUIPalette::MatrixElementBlock = "matrixelementblock";
+const char* const GUIPalette::MatrixOverlapBlock = "matrixoverlapblock";
+
+const char* const GUIPalette::LoopRulerBackground = "looprulerbackground";
+const char* const GUIPalette::LoopRulerForeground = "looprulerforeground";
+const char* const GUIPalette::LoopHighlight = "loophighlight";
+
+const char* const GUIPalette::TempoBase = "tempobase";
+
+const char* const GUIPalette::TextRulerBackground = "textrulerbackground";
+const char* const GUIPalette::TextRulerForeground = "textrulerforeground";
+
+const char* const GUIPalette::ChordNameRulerBackground = "chordnamerulerbackground";
+const char* const GUIPalette::ChordNameRulerForeground = "chordnamerulerforeground";
+
+const char* const GUIPalette::RawNoteRulerBackground = "rawnoterulerbackground";
+const char* const GUIPalette::RawNoteRulerForeground = "rawnoterulerforeground";
+
+const char* const GUIPalette::LevelMeterGreen = "levelmetergreen";
+const char* const GUIPalette::LevelMeterOrange = "levelmeterorange";
+const char* const GUIPalette::LevelMeterRed = "levelmeterred";
+
+const char* const GUIPalette::LevelMeterSolidGreen = "levelmetersolidgreen";
+const char* const GUIPalette::LevelMeterSolidOrange = "levelmetersolidorange";
+const char* const GUIPalette::LevelMeterSolidRed = "levelmetersolidred";
+
+const char* const GUIPalette::BarLine = "barline";
+const char* const GUIPalette::BarLineIncorrect = "barlineincorrect";
+const char* const GUIPalette::BeatLine = "beatline";
+const char* const GUIPalette::SubBeatLine = "subbeatline";
+const char* const GUIPalette::StaffConnectingLine = "staffconnectingline";
+const char* const GUIPalette::StaffConnectingTerminatingLine = "staffconnectingterminatingline";
+
+const char* const GUIPalette::Pointer = "pointer";
+const char* const GUIPalette::PointerRuler = "pointerruler";
+
+const char* const GUIPalette::InsertCursor = "insertcursor";
+const char* const GUIPalette::InsertCursorRuler = "insertcursorruler";
+
+const char* const GUIPalette::TrackDivider = "trackdivider";
+const char* const GUIPalette::MovementGuide = "movementguide";
+const char* const GUIPalette::SelectionRectangle = "selectionrectangle";
+const char* const GUIPalette::SelectedElement = "selectedelement";
+
+const int GUIPalette::SelectedElementHue = 225;
+const int GUIPalette::SelectedElementMinValue = 220;
+const int GUIPalette::HighlightedElementHue = 25;
+const int GUIPalette::HighlightedElementMinValue = 220;
+const int GUIPalette::QuantizedNoteHue = 69;
+const int GUIPalette::QuantizedNoteMinValue = 140;
+const int GUIPalette::TriggerNoteHue = 4;
+const int GUIPalette::TriggerNoteMinValue = 140;
+const int GUIPalette::OutRangeNoteHue = 0;
+const int GUIPalette::OutRangeNoteMinValue = 200;
+
+const int GUIPalette::CollisionHaloHue = 42;
+const int GUIPalette::CollisionHaloSaturation = 200;
+
+const char* const GUIPalette::TextAnnotationBackground = "textannotationbackground";
+
+const char* const GUIPalette::TextLilyPondDirectiveBackground = "textlilyponddirectivebackground";
+
+const char* const GUIPalette::AudioCountdownBackground = "audiocountdownbackground";
+const char* const GUIPalette::AudioCountdownForeground = "audiocountdownforeground";
+
+const char* const GUIPalette::RotaryFloatBackground = "rotaryfloatbackground";
+const char* const GUIPalette::RotaryFloatForeground = "rotaryfloatforeground";
+
+const char* const GUIPalette::RotaryPastelBlue = "rotarypastelblue";
+const char* const GUIPalette::RotaryPastelRed = "rotarypastelred";
+const char* const GUIPalette::RotaryPastelGreen = "rotarypastelgreen";
+const char* const GUIPalette::RotaryPastelOrange = "rotarypastelorange";
+const char* const GUIPalette::RotaryPastelYellow = "rotarypastelyellow";
+
+const char* const GUIPalette::MatrixKeyboardFocus = "matrixkeyboardfocus";
+
+const char* const GUIPalette::RotaryPlugin = "rotaryplugin";
+
+const char* const GUIPalette::RotaryMeter = "rotarymeter";
+
+const char* const GUIPalette::MarkerBackground = "markerbackground";
+
+const char* const GUIPalette::QuickMarker = "quickmarker";
+
+const char* const GUIPalette::MuteTrackLED = "mutetrackled";
+const char* const GUIPalette::RecordMIDITrackLED = "recordmiditrackled";
+const char* const GUIPalette::RecordAudioTrackLED = "recordaudiotrackled";
+
+const char* const GUIPalette::PlaybackFaderOutline = "playbackfaderoutline";
+const char* const GUIPalette::RecordFaderOutline = "recordfaderoutline";
+
+
+GUIPalette* GUIPalette::m_instance = 0;
+
+// defines which index in the document's colourmap should be used as the color
+// when creating new audio segments from recordings, or inserting from the
+// audio file manager (presumes a file derived from the updated autoload.rg
+// that shipped along with this change)
+const int GUIPalette::AudioDefaultIndex = 1;
+
+}
diff --git a/src/gui/general/GUIPalette.h b/src/gui/general/GUIPalette.h
new file mode 100644
index 0000000..c8760fb
--- /dev/null
+++ b/src/gui/general/GUIPalette.h
@@ -0,0 +1,185 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_GUIPALETTE_H_
+#define _RG_GUIPALETTE_H_
+
+#include "base/Colour.h"
+#include <map>
+#include <qcolor.h>
+
+
+
+
+namespace Rosegarden
+{
+
+
+
+/**
+ * Definitions of colours to be used throughout the Rosegarden GUI.
+ *
+ * They're in this file not so much to allow them to be easily
+ * changed, as to ensure a certain amount of consistency between
+ * colours for different functions that might end up being seen
+ * at the same time.
+ */
+
+class GUIPalette
+{
+public:
+ static QColor getColour(const char* const colourName);
+
+ static Colour convertColour(const QColor &input);
+ static QColor convertColour(const Colour &input);
+
+ static const char* const ActiveRecordTrack;
+
+ static const char* const SegmentCanvas;
+ static const char* const SegmentBorder;
+
+ static const char* const RecordingInternalSegmentBlock;
+ static const char* const RecordingAudioSegmentBlock;
+ static const char* const RecordingSegmentBorder;
+
+ static const char* const RepeatSegmentBorder;
+
+ static const char* const SegmentAudioPreview;
+ static const char* const SegmentInternalPreview;
+ static const char* const SegmentLabel;
+ static const char* const SegmentSplitLine;
+
+ static const char* const MatrixElementBorder;
+ static const char* const MatrixElementBlock;
+ static const char* const MatrixOverlapBlock;
+
+ static const char* const LoopRulerBackground;
+ static const char* const LoopRulerForeground;
+ static const char* const LoopHighlight;
+
+ static const char* const TempoBase;
+
+ static const char* const TextRulerBackground;
+ static const char* const TextRulerForeground;
+
+ static const char* const ChordNameRulerBackground;
+ static const char* const ChordNameRulerForeground;
+
+ static const char* const RawNoteRulerBackground;
+ static const char* const RawNoteRulerForeground;
+
+ static const char* const LevelMeterGreen;
+ static const char* const LevelMeterOrange;
+ static const char* const LevelMeterRed;
+
+ static const char* const LevelMeterSolidGreen;
+ static const char* const LevelMeterSolidOrange;
+ static const char* const LevelMeterSolidRed;
+
+ static const char* const BarLine;
+ static const char* const BarLineIncorrect;
+ static const char* const BeatLine;
+ static const char* const SubBeatLine;
+ static const char* const StaffConnectingLine;
+ static const char* const StaffConnectingTerminatingLine;
+
+ static const char* const Pointer;
+ static const char* const PointerRuler;
+
+ static const char* const InsertCursor;
+ static const char* const InsertCursorRuler;
+
+ static const char* const TrackDivider;
+ static const char* const MovementGuide;
+ static const char* const SelectionRectangle;
+ static const char* const SelectedElement;
+
+ static const int SelectedElementHue;
+ static const int SelectedElementMinValue;
+ static const int HighlightedElementHue;
+ static const int HighlightedElementMinValue;
+ static const int QuantizedNoteHue;
+ static const int QuantizedNoteMinValue;
+ static const int TriggerNoteHue;
+ static const int TriggerNoteMinValue;
+ static const int OutRangeNoteHue;
+ static const int OutRangeNoteMinValue;
+
+ static const int CollisionHaloHue;
+ static const int CollisionHaloSaturation;
+
+ static const char* const TextAnnotationBackground;
+
+ static const char* const TextLilyPondDirectiveBackground;
+
+ static const char* const AudioCountdownBackground;
+ static const char* const AudioCountdownForeground;
+
+ static const char* const RotaryFloatBackground;
+ static const char* const RotaryFloatForeground;
+
+ static const char* const RotaryPastelBlue;
+ static const char* const RotaryPastelRed;
+ static const char* const RotaryPastelGreen;
+ static const char* const RotaryPastelOrange;
+ static const char* const RotaryPastelYellow;
+
+ static const char* const MatrixKeyboardFocus;
+
+ static const char* const RotaryPlugin;
+
+ static const char* const RotaryMeter;
+
+ static const char* const MarkerBackground;
+
+ static const char* const QuickMarker;
+
+ static const char* const MuteTrackLED;
+ static const char* const RecordMIDITrackLED;
+ static const char* const RecordAudioTrackLED;
+
+ static const char* const PlaybackFaderOutline;
+ static const char* const RecordFaderOutline;
+
+ static const int AudioDefaultIndex;
+
+protected:
+ GUIPalette();
+ QColor getDefaultColour(const char* const colourName);
+
+ //--------------- Data members ---------------------------------
+ static GUIPalette* getInstance();
+ static GUIPalette* m_instance;
+
+ typedef std::map<const char* const, QColor> colourmap;
+
+ colourmap m_defaultsMap;
+};
+
+
+
+}
+
+#endif
diff --git a/src/gui/general/HZoomable.cpp b/src/gui/general/HZoomable.cpp
new file mode 100644
index 0000000..ff81f6c
--- /dev/null
+++ b/src/gui/general/HZoomable.cpp
@@ -0,0 +1,32 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "HZoomable.h"
+
+
+
+namespace Rosegarden
+{
+}
diff --git a/src/gui/general/HZoomable.h b/src/gui/general/HZoomable.h
new file mode 100644
index 0000000..82e9aa9
--- /dev/null
+++ b/src/gui/general/HZoomable.h
@@ -0,0 +1,53 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_HZOOMABLE_H_
+#define _RG_HZOOMABLE_H_
+
+
+
+
+
+namespace Rosegarden
+{
+
+
+
+class HZoomable
+{
+public:
+ HZoomable() : m_hScaleFactor(1.0) {}
+
+ void setHScaleFactor(double dy) { m_hScaleFactor = dy; }
+ double getHScaleFactor() const { return m_hScaleFactor; }
+
+protected:
+ double m_hScaleFactor;
+};
+
+
+}
+
+#endif
diff --git a/src/gui/general/LinedStaff.cpp b/src/gui/general/LinedStaff.cpp
new file mode 100644
index 0000000..e2e5d12
--- /dev/null
+++ b/src/gui/general/LinedStaff.cpp
@@ -0,0 +1,1217 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "LinedStaff.h"
+
+#include "misc/Debug.h"
+#include "base/Event.h"
+#include "base/LayoutEngine.h"
+#include "base/NotationTypes.h"
+#include "base/Profiler.h"
+#include "base/Segment.h"
+#include "base/SnapGrid.h"
+#include "base/Staff.h"
+#include "base/ViewElement.h"
+#include "GUIPalette.h"
+#include "BarLine.h"
+#include <qcanvas.h>
+#include <qcolor.h>
+#include <qfont.h>
+#include <qfontmetrics.h>
+#include <qpen.h>
+#include <qrect.h>
+#include <qstring.h>
+#include <algorithm>
+
+
+namespace Rosegarden
+{
+
+// width of pointer
+//
+const int pointerWidth = 3;
+
+
+LinedStaff::LinedStaff(QCanvas *canvas, Segment *segment,
+ SnapGrid *snapGrid, int id,
+ int resolution, int lineThickness) :
+ Staff(*segment),
+ m_canvas(canvas),
+ m_snapGrid(snapGrid),
+ m_id(id),
+ m_x(0.0),
+ m_y(0),
+ m_margin(0.0),
+ m_titleHeight(0),
+ m_resolution(resolution),
+ m_lineThickness(lineThickness),
+ m_pageMode(LinearMode),
+ m_pageWidth(2000.0), // fairly arbitrary, but we need something non-zero
+ m_rowsPerPage(0),
+ m_rowSpacing(0),
+ m_connectingLineLength(0),
+ m_startLayoutX(0),
+ m_endLayoutX(0),
+ m_current(false),
+ m_pointer(new QCanvasLine(canvas)),
+ m_insertCursor(new QCanvasLine(canvas)),
+ m_insertCursorTime(segment->getStartTime()),
+ m_insertCursorTimeValid(false)
+{
+ initCursors();
+}
+
+LinedStaff::LinedStaff(QCanvas *canvas, Segment *segment,
+ SnapGrid *snapGrid,
+ int id, int resolution, int lineThickness,
+ double pageWidth, int rowsPerPage, int rowSpacing) :
+ Staff(*segment),
+ m_canvas(canvas),
+ m_snapGrid(snapGrid),
+ m_id(id),
+ m_x(0.0),
+ m_y(0),
+ m_margin(0.0),
+ m_titleHeight(0),
+ m_resolution(resolution),
+ m_lineThickness(lineThickness),
+ m_pageMode(rowsPerPage ? MultiPageMode : ContinuousPageMode),
+ m_pageWidth(pageWidth),
+ m_rowsPerPage(rowsPerPage),
+ m_rowSpacing(rowSpacing),
+ m_connectingLineLength(0),
+ m_startLayoutX(0),
+ m_endLayoutX(0),
+ m_current(false),
+ m_pointer(new QCanvasLine(canvas)),
+ m_insertCursor(new QCanvasLine(canvas)),
+ m_insertCursorTime(segment->getStartTime()),
+ m_insertCursorTimeValid(false)
+{
+ initCursors();
+}
+
+LinedStaff::LinedStaff(QCanvas *canvas, Segment *segment,
+ SnapGrid *snapGrid,
+ int id, int resolution, int lineThickness,
+ PageMode pageMode, double pageWidth, int rowsPerPage,
+ int rowSpacing) :
+ Staff(*segment),
+ m_canvas(canvas),
+ m_snapGrid(snapGrid),
+ m_id(id),
+ m_x(0.0),
+ m_y(0),
+ m_margin(0.0),
+ m_titleHeight(0),
+ m_resolution(resolution),
+ m_lineThickness(lineThickness),
+ m_pageMode(pageMode),
+ m_pageWidth(pageWidth),
+ m_rowsPerPage(rowsPerPage),
+ m_rowSpacing(rowSpacing),
+ m_connectingLineLength(0),
+ m_startLayoutX(0),
+ m_endLayoutX(0),
+ m_current(false),
+ m_pointer(new QCanvasLine(canvas)),
+ m_insertCursor(new QCanvasLine(canvas)),
+ m_insertCursorTime(segment->getStartTime()),
+ m_insertCursorTimeValid(false)
+{
+ initCursors();
+}
+
+LinedStaff::~LinedStaff()
+{
+ /*!!! No, the canvas items are all deleted by the canvas on destruction.
+
+ deleteBars();
+ for (int i = 0; i < (int)m_staffLines.size(); ++i) clearStaffLineRow(i);
+ */
+}
+
+void
+LinedStaff::initCursors()
+{
+ QPen pen(GUIPalette::getColour(GUIPalette::Pointer));
+ pen.setWidth(pointerWidth);
+
+ m_pointer->setPen(pen);
+ m_pointer->setBrush(GUIPalette::getColour(GUIPalette::Pointer));
+
+ pen.setColor(GUIPalette::getColour(GUIPalette::InsertCursor));
+
+ m_insertCursor->setPen(pen);
+ m_insertCursor->setBrush(GUIPalette::getColour(GUIPalette::InsertCursor));
+}
+
+void
+LinedStaff::setResolution(int resolution)
+{
+ m_resolution = resolution;
+}
+
+void
+LinedStaff::setLineThickness(int lineThickness)
+{
+ m_lineThickness = lineThickness;
+}
+
+void
+LinedStaff::setPageMode(PageMode pageMode)
+{
+ m_pageMode = pageMode;
+}
+
+void
+LinedStaff::setPageWidth(double pageWidth)
+{
+ m_pageWidth = pageWidth;
+}
+
+void
+LinedStaff::setRowsPerPage(int rowsPerPage)
+{
+ m_rowsPerPage = rowsPerPage;
+}
+
+void
+LinedStaff::setRowSpacing(int rowSpacing)
+{
+ m_rowSpacing = rowSpacing;
+}
+
+void
+LinedStaff::setConnectingLineLength(int connectingLineLength)
+{
+ m_connectingLineLength = connectingLineLength;
+}
+
+int
+LinedStaff::getId() const
+{
+ return m_id;
+}
+
+void
+LinedStaff::setX(double x)
+{
+ m_x = x;
+}
+
+double
+LinedStaff::getX() const
+{
+ return m_x;
+}
+
+void
+LinedStaff::setY(int y)
+{
+ m_y = y;
+}
+
+int
+LinedStaff::getY() const
+{
+ return m_y;
+}
+
+void
+LinedStaff::setMargin(double margin)
+{
+ m_margin = margin;
+}
+
+double
+LinedStaff::getMargin() const
+{
+ if (m_pageMode != MultiPageMode)
+ return 0;
+ return m_margin;
+}
+
+void
+LinedStaff::setTitleHeight(int titleHeight)
+{
+ m_titleHeight = titleHeight;
+}
+
+int
+LinedStaff::getTitleHeight() const
+{
+ return m_titleHeight;
+}
+
+double
+LinedStaff::getTotalWidth() const
+{
+ switch (m_pageMode) {
+
+ case ContinuousPageMode:
+ return getCanvasXForRightOfRow(getRowForLayoutX(m_endLayoutX)) - m_x;
+
+ case MultiPageMode:
+ return getCanvasXForRightOfRow(getRowForLayoutX(m_endLayoutX)) + m_margin - m_x;
+
+ case LinearMode:
+ default:
+ return getCanvasXForLayoutX(m_endLayoutX) - m_x;
+ }
+}
+
+int
+LinedStaff::getTotalHeight() const
+{
+ switch (m_pageMode) {
+
+ case ContinuousPageMode:
+ return getCanvasYForTopOfStaff(getRowForLayoutX(m_endLayoutX)) +
+ getHeightOfRow() - m_y;
+
+ case MultiPageMode:
+ return getCanvasYForTopOfStaff(m_rowsPerPage - 1) +
+ getHeightOfRow() - m_y;
+
+ case LinearMode:
+ default:
+ return getCanvasYForTopOfStaff(0) + getHeightOfRow() - m_y;
+ }
+}
+
+int
+LinedStaff::getHeightOfRow() const
+{
+ return getTopLineOffset() + getLegerLineCount() * getLineSpacing()
+ + getBarLineHeight() + m_lineThickness;
+}
+
+bool
+LinedStaff::containsCanvasCoords(double x, int y) const
+{
+ switch (m_pageMode) {
+
+ case ContinuousPageMode:
+
+ for (int row = getRowForLayoutX(m_startLayoutX);
+ row <= getRowForLayoutX(m_endLayoutX); ++row) {
+ if (y >= getCanvasYForTopOfStaff(row) &&
+ y < getCanvasYForTopOfStaff(row) + getHeightOfRow()) {
+ return true;
+ }
+ }
+
+ return false;
+
+ case MultiPageMode:
+
+ for (int row = getRowForLayoutX(m_startLayoutX);
+ row <= getRowForLayoutX(m_endLayoutX); ++row) {
+ if (y >= getCanvasYForTopOfStaff(row) &&
+ y < getCanvasYForTopOfStaff(row) + getHeightOfRow() &&
+ x >= getCanvasXForLeftOfRow(row) &&
+ x <= getCanvasXForRightOfRow(row)) {
+ return true;
+ }
+ }
+
+ return false;
+
+ case LinearMode:
+ default:
+
+ return (y >= getCanvasYForTopOfStaff() &&
+ y < getCanvasYForTopOfStaff() + getHeightOfRow());
+ }
+}
+
+int
+LinedStaff::getCanvasYForHeight(int h, double baseX, int baseY) const
+{
+ int y;
+
+ // NOTATION_DEBUG << "LinedStaff::getCanvasYForHeight(" << h << "," << baseY
+ // << ")" << endl;
+
+ if (baseX < 0)
+ baseX = getX() + getMargin();
+
+ if (baseY >= 0) {
+ y = getCanvasYForTopLine(getRowForCanvasCoords(baseX, baseY));
+ } else {
+ y = getCanvasYForTopLine();
+ }
+
+ y += getLayoutYForHeight(h);
+
+ return y;
+}
+
+int
+LinedStaff::getLayoutYForHeight(int h) const
+{
+ int y = ((getTopLineHeight() - h) * getLineSpacing()) / getHeightPerLine();
+ if (h < getTopLineHeight() && (h % getHeightPerLine() != 0))
+ ++y;
+
+ return y;
+}
+
+int
+LinedStaff::getHeightAtCanvasCoords(double x, int y) const
+{
+ //!!! the lazy route: approximate, then get the right value
+ // by calling getCanvasYForHeight a few times... ugh
+
+ // RG_DEBUG << "\nNotationStaff::heightOfYCoord: y = " << y
+ // << ", getTopLineOffset() = " << getTopLineOffset()
+ // << ", getLineSpacing() = " << m_npf->getLineSpacing()
+ // << endl;
+
+ if (x < 0)
+ x = getX() + getMargin();
+
+ int row = getRowForCanvasCoords(x, y);
+ int ph = (y - getCanvasYForTopLine(row)) * getHeightPerLine() /
+ getLineSpacing();
+ ph = getTopLineHeight() - ph;
+
+ int i;
+ int mi = -2;
+ int md = getLineSpacing() * 2;
+
+ int testi = -2;
+ int testMd = 1000;
+
+ for (i = -1; i <= 1; ++i) {
+ int d = y - getCanvasYForHeight(ph + i, x, y);
+ if (d < 0)
+ d = -d;
+ if (d < md) {
+ md = d;
+ mi = i;
+ }
+ if (d < testMd) {
+ testMd = d;
+ testi = i;
+ }
+ }
+
+ if (mi > -2) {
+ // RG_DEBUG << "LinedStaff::getHeightAtCanvasCoords: " << y
+ // << " -> " << (ph + mi) << " (mi is " << mi << ", distance "
+ // << md << ")" << endl;
+ // if (mi == 0) {
+ // RG_DEBUG << "GOOD APPROXIMATION" << endl;
+ // } else {
+ // RG_DEBUG << "BAD APPROXIMATION" << endl;
+ // }
+ return ph + mi;
+ } else {
+ RG_DEBUG << "LinedStaff::getHeightAtCanvasCoords: heuristic got " << ph << ", nothing within range (closest was " << (ph + testi) << " which is " << testMd << " away)" << endl;
+ return 0;
+ }
+}
+
+QRect
+LinedStaff::getBarExtents(double x, int y) const
+{
+ int row = getRowForCanvasCoords(x, y);
+
+ for (int i = 1; i < m_barLines.size(); ++i) {
+
+ double layoutX = m_barLines[i]->getLayoutX();
+ int barRow = getRowForLayoutX(layoutX);
+
+ if (m_pageMode != LinearMode && (barRow < row))
+ continue;
+
+ BarLine *line = m_barLines[i];
+
+ if (line) {
+ if (line->x() <= x)
+ continue;
+
+ return QRect(int(m_barLines[i -1]->x()),
+ getCanvasYForTopOfStaff(barRow),
+ int(line->x() - m_barLines[i - 1]->x()),
+ getHeightOfRow());
+ }
+ }
+
+ // failure
+ return QRect(int(getX() + getMargin()), getCanvasYForTopOfStaff(), 4, getHeightOfRow());
+}
+
+double
+LinedStaff::getCanvasXForLayoutX(double x) const
+{
+ switch (m_pageMode) {
+
+ case ContinuousPageMode:
+ return m_x + x - (m_pageWidth * getRowForLayoutX(x));
+
+ case MultiPageMode: {
+ int pageNo = getRowForLayoutX(x) / getRowsPerPage();
+ double cx = m_x + x - (m_pageWidth * getRowForLayoutX(x));
+ cx += m_margin + (m_margin * 2 + m_pageWidth) * pageNo;
+ return cx;
+ }
+
+ case LinearMode:
+ default:
+ return m_x + x;
+ }
+}
+
+LinedStaff::LinedStaffCoords
+
+LinedStaff::getLayoutCoordsForCanvasCoords(double x, int y) const
+{
+ int row = getRowForCanvasCoords(x, y);
+ return LinedStaffCoords
+ ((row * m_pageWidth) + x - getCanvasXForLeftOfRow(row),
+ y - getCanvasYForTopOfStaff(row));
+}
+
+LinedStaff::LinedStaffCoords
+
+LinedStaff::getCanvasCoordsForLayoutCoords(double x, int y) const
+{
+ int row = getRowForLayoutX(x);
+ return LinedStaffCoords
+ (getCanvasXForLayoutX(x), getCanvasYForTopLine(row) + y);
+}
+
+int
+LinedStaff::getRowForCanvasCoords(double x, int y) const
+{
+ switch (m_pageMode) {
+
+ case ContinuousPageMode:
+ return ((y - m_y) / m_rowSpacing);
+
+ case MultiPageMode: {
+ int px = int(x - m_x - m_margin);
+ int pw = int(m_margin * 2 + m_pageWidth);
+ if (px < pw)
+ y -= m_titleHeight;
+ return (getRowsPerPage() * (px / pw)) + ((y - m_y) / m_rowSpacing);
+ }
+
+ case LinearMode:
+ default:
+ return (int)((x - m_x) / m_pageWidth);
+ }
+}
+
+int
+LinedStaff::getCanvasYForTopOfStaff(int row) const
+{
+ switch (m_pageMode) {
+
+ case ContinuousPageMode:
+ if (row <= 0)
+ return m_y;
+ else
+ return m_y + (row * m_rowSpacing);
+
+ case MultiPageMode:
+ if (row <= 0)
+ return m_y + m_titleHeight;
+ else if (row < getRowsPerPage())
+ return m_y + ((row % getRowsPerPage()) * m_rowSpacing) + m_titleHeight;
+ else
+ return m_y + ((row % getRowsPerPage()) * m_rowSpacing);
+
+ case LinearMode:
+ default:
+ return m_y;
+ }
+}
+
+double
+LinedStaff::getCanvasXForLeftOfRow(int row) const
+{
+ switch (m_pageMode) {
+
+ case ContinuousPageMode:
+ return m_x;
+
+ case MultiPageMode:
+ return m_x + m_margin +
+ (m_margin*2 + m_pageWidth) * (row / getRowsPerPage());
+
+ case LinearMode:
+ default:
+ return m_x + (row * m_pageWidth);
+ }
+}
+
+void
+LinedStaff::sizeStaff(HorizontalLayoutEngine &layout)
+{
+ Profiler profiler("LinedStaff::sizeStaff", true);
+
+ deleteBars();
+ deleteRepeatedClefsAndKeys();
+ deleteTimeSignatures();
+
+ // RG_DEBUG << "LinedStaff::sizeStaff" << endl;
+
+ int lastBar = layout.getLastVisibleBarOnStaff(*this);
+
+ double xleft = 0, xright = 0;
+ bool haveXLeft = false;
+
+ xright = layout.getBarPosition(lastBar) - 1;
+
+ TimeSignature currentTimeSignature;
+
+ for (int barNo = layout.getFirstVisibleBarOnStaff(*this);
+ barNo <= lastBar; ++barNo) {
+
+ double x = layout.getBarPosition(barNo);
+
+ if (!haveXLeft) {
+ xleft = x;
+ haveXLeft = true;
+ }
+
+ double timeSigX = 0;
+ TimeSignature timeSig;
+ bool isNew = layout.getTimeSignaturePosition(*this, barNo, timeSig, timeSigX);
+
+ if (isNew && barNo < lastBar) {
+ currentTimeSignature = timeSig;
+ insertTimeSignature(timeSigX, currentTimeSignature);
+ RG_DEBUG << "LinedStaff[" << this << "]::sizeStaff: bar no " << barNo << " has time signature at " << timeSigX << endl;
+ }
+
+ RG_DEBUG << "LinedStaff::sizeStaff: inserting bar at " << x << " on staff " << this << " (isNew " << isNew << ", timeSigX " << timeSigX << ")" << endl;
+
+ bool showBarNo =
+ (showBarNumbersEvery() > 0 &&
+ ((barNo + 1) % showBarNumbersEvery()) == 0);
+
+ insertBar(x,
+ ((barNo == lastBar) ? 0 :
+ (layout.getBarPosition(barNo + 1) - x)),
+ layout.isBarCorrectOnStaff(*this, barNo - 1),
+ currentTimeSignature,
+ barNo,
+ showBarNo);
+ }
+
+ m_startLayoutX = xleft;
+ m_endLayoutX = xright;
+
+ drawStaffName();
+ resizeStaffLines();
+}
+
+void
+LinedStaff::deleteBars()
+{
+ for (BarLineList::iterator i = m_barLines.begin();
+ i != m_barLines.end(); ++i) {
+ (*i)->hide();
+ delete *i;
+ }
+
+ for (LineRecList::iterator i = m_beatLines.begin();
+ i != m_beatLines.end(); ++i) {
+ i->second->hide();
+ delete i->second;
+ }
+
+ for (LineRecList::iterator i = m_barConnectingLines.begin();
+ i != m_barConnectingLines.end(); ++i) {
+ i->second->hide();
+ delete i->second;
+ }
+
+ for (ItemList::iterator i = m_barNumbers.begin();
+ i != m_barNumbers.end(); ++i) {
+ (*i)->hide();
+ delete *i;
+ }
+
+ m_barLines.clear();
+ m_beatLines.clear();
+ m_barConnectingLines.clear();
+ m_barNumbers.clear();
+}
+
+void
+LinedStaff::insertBar(double layoutX, double width, bool isCorrect,
+ const TimeSignature &timeSig,
+ int barNo, bool showBarNo)
+{
+ // RG_DEBUG << "insertBar: " << layoutX << ", " << width
+ // << ", " << isCorrect << endl;
+
+ int barThickness = m_lineThickness * 5 / 4;
+
+ // hack to ensure the bar line appears on the correct row in
+ // notation page layouts, with a conditional to prevent us from
+ // moving the bar and beat lines in the matrix
+ if (!showBeatLines()) {
+ if (width > 0.01) { // not final bar in staff
+ layoutX += 1;
+ } else {
+ layoutX -= 1;
+ }
+ }
+
+ int row = getRowForLayoutX(layoutX);
+ double x = getCanvasXForLayoutX(layoutX);
+ int y = getCanvasYForTopLine(row);
+
+ bool firstBarInRow = false, lastBarInRow = false;
+
+ if (m_pageMode != LinearMode &&
+ (getRowForLayoutX(layoutX) >
+ getRowForLayoutX(layoutX - getMargin() - 2)))
+ firstBarInRow = true;
+
+ if (m_pageMode != LinearMode &&
+ width > 0.01 && // width == 0 for final bar in staff
+ (getRowForLayoutX(layoutX) <
+ getRowForLayoutX(layoutX + width + getMargin() + 2)))
+ lastBarInRow = true;
+
+ BarStyle style = getBarStyle(barNo);
+
+ if (style == RepeatBothBar && firstBarInRow)
+ style = RepeatStartBar;
+
+ if (firstBarInRow)
+ insertRepeatedClefAndKey(layoutX, barNo);
+
+ // If we're supposed to be hiding bar lines, we do just that --
+ // create them as normal, then hide them. We can't simply not
+ // create them because we rely on this to find bar extents for
+ // things like double-click selection in notation.
+ bool hidden = false;
+ if (style == PlainBar && timeSig.hasHiddenBars())
+ hidden = true;
+
+ double inset = 0.0;
+ if (style == RepeatStartBar || style == RepeatBothBar) {
+ inset = getBarInset(barNo, firstBarInRow);
+ }
+
+ BarLine *line = new BarLine(m_canvas, layoutX,
+ getBarLineHeight(), barThickness, getLineSpacing(),
+ (int)inset, style);
+
+ line->moveBy(x, y);
+
+ if (isCorrect) {
+ line->setPen(GUIPalette::getColour(GUIPalette::BarLine));
+ line->setBrush(GUIPalette::getColour(GUIPalette::BarLine));
+ } else {
+ line->setPen(GUIPalette::getColour(GUIPalette::BarLineIncorrect));
+ line->setBrush(GUIPalette::getColour(GUIPalette::BarLineIncorrect));
+ }
+
+ line->setZ( -1);
+ if (hidden)
+ line->hide();
+ else
+ line->show();
+
+ // The bar lines have to be in order of layout-x (there's no
+ // such interesting stipulation for beat or connecting lines)
+ BarLineList::iterator insertPoint = lower_bound
+ (m_barLines.begin(), m_barLines.end(), line, compareBars);
+ m_barLines.insert(insertPoint, line);
+
+ if (lastBarInRow) {
+
+ double xe = x + width - barThickness;
+ style = getBarStyle(barNo + 1);
+ if (style == RepeatBothBar)
+ style = RepeatEndBar;
+
+ BarLine *eline = new BarLine(m_canvas, layoutX,
+ getBarLineHeight(), barThickness, getLineSpacing(),
+ 0, style);
+ eline->moveBy(xe, y);
+
+ eline->setPen(GUIPalette::getColour(GUIPalette::BarLine));
+ eline->setBrush(GUIPalette::getColour(GUIPalette::BarLine));
+
+ eline->setZ( -1);
+ if (hidden)
+ eline->hide();
+ else
+ eline->show();
+
+ BarLineList::iterator insertPoint = lower_bound
+ (m_barLines.begin(), m_barLines.end(), eline, compareBars);
+ m_barLines.insert(insertPoint, eline);
+ }
+
+ if (showBarNo) {
+
+ QFont font;
+ font.setPixelSize(m_resolution * 3 / 2);
+ QFontMetrics metrics(font);
+ QString text = QString("%1").arg(barNo + 1);
+
+ QCanvasItem *barNoText = new QCanvasText(text, font, m_canvas);
+ barNoText->setX(x);
+ barNoText->setY(y - metrics.height() - m_resolution * 2);
+ barNoText->setZ( -1);
+ if (hidden)
+ barNoText->hide();
+ else
+ barNoText->show();
+
+ m_barNumbers.push_back(barNoText);
+ }
+
+ QCanvasRectangle *rect = 0;
+
+ if (showBeatLines()) {
+
+ double gridLines; // number of grid lines per bar may be fractional
+
+ // If the snap time is zero we default to beat markers
+ //
+ if (m_snapGrid && m_snapGrid->getSnapTime(x))
+ gridLines = double(timeSig.getBarDuration()) /
+ double(m_snapGrid->getSnapTime(x));
+ else
+ gridLines = timeSig.getBeatsPerBar();
+
+ double dx = width / gridLines;
+
+ for (int gridLine = hidden ? 0 : 1; gridLine < gridLines; ++gridLine) {
+
+ rect = new QCanvasRectangle
+ (0, 0, barThickness, getBarLineHeight(), m_canvas);
+
+ rect->moveBy(x + gridLine * dx, y);
+
+ double currentGrid = gridLines / double(timeSig.getBeatsPerBar());
+
+ rect->setPen(GUIPalette::getColour(GUIPalette::BeatLine));
+ rect->setBrush(GUIPalette::getColour(GUIPalette::BeatLine));
+
+ // Reset to SubBeatLine colour if we're not a beat line - avoid div by zero!
+ //
+ if (currentGrid > 1.0 && double(gridLine) / currentGrid != gridLine / int(currentGrid)) {
+ rect->setPen(GUIPalette::getColour(GUIPalette::SubBeatLine));
+ rect->setBrush(GUIPalette::getColour(GUIPalette::SubBeatLine));
+ }
+
+ rect->setZ( -1);
+ rect->show(); // show beat lines even if the bar lines are hidden
+
+ LineRec beatLine(layoutX + gridLine * dx, rect);
+ m_beatLines.push_back(beatLine);
+ }
+ }
+
+ if (m_connectingLineLength > 0) {
+
+ rect = new QCanvasRectangle
+ (0, 0, barThickness, m_connectingLineLength, m_canvas);
+
+ rect->moveBy(x, y);
+
+ rect->setPen(GUIPalette::getColour(GUIPalette::StaffConnectingLine));
+ rect->setBrush(GUIPalette::getColour(GUIPalette::StaffConnectingLine));
+ rect->setZ( -3);
+ if (hidden)
+ rect->hide();
+ else
+ rect->show();
+
+ LineRec connectingLine(layoutX, rect);
+ m_barConnectingLines.push_back(connectingLine);
+ }
+}
+
+bool
+LinedStaff::compareBars(const BarLine *barLine1, const BarLine *barLine2)
+{
+ return (barLine1->getLayoutX() < barLine2->getLayoutX());
+}
+
+bool
+LinedStaff::compareBarToLayoutX(const BarLine *barLine1, int x)
+{
+ return (barLine1->getLayoutX() < x);
+}
+
+void
+LinedStaff::deleteTimeSignatures()
+{
+ // default implementation is empty
+}
+
+void
+LinedStaff::insertTimeSignature(double, const TimeSignature &)
+{
+ // default implementation is empty
+}
+
+void
+LinedStaff::deleteRepeatedClefsAndKeys()
+{
+ // default implementation is empty
+}
+
+void
+LinedStaff::insertRepeatedClefAndKey(double, int)
+{
+ // default implementation is empty
+}
+
+void
+LinedStaff::drawStaffName()
+{
+ // default implementation is empty
+}
+
+void
+LinedStaff::resizeStaffLines()
+{
+ int firstRow = getRowForLayoutX(m_startLayoutX);
+ int lastRow = getRowForLayoutX(m_endLayoutX);
+
+ RG_DEBUG << "LinedStaff::resizeStaffLines: firstRow "
+ << firstRow << ", lastRow " << lastRow
+ << " (startLayoutX " << m_startLayoutX
+ << ", endLayoutX " << m_endLayoutX << ")" << endl;
+
+ assert(lastRow >= firstRow);
+
+ int i;
+ while ((int)m_staffLines.size() <= lastRow) {
+ m_staffLines.push_back(ItemList());
+ m_staffConnectingLines.push_back(0);
+ }
+
+ // Remove all the staff lines that precede the start of the staff
+
+ for (i = 0; i < firstRow; ++i)
+ clearStaffLineRow(i);
+
+ // now i == firstRow
+
+ while (i <= lastRow) {
+
+ double x0;
+ double x1;
+
+ if (i == firstRow) {
+ x0 = getCanvasXForLayoutX(m_startLayoutX);
+ } else {
+ x0 = getCanvasXForLeftOfRow(i);
+ }
+
+ if (i == lastRow) {
+ x1 = getCanvasXForLayoutX(m_endLayoutX);
+ } else {
+ x1 = getCanvasXForRightOfRow(i);
+ }
+
+ resizeStaffLineRow(i, x0, x1 - x0);
+
+ ++i;
+ }
+
+ // now i == lastRow + 1
+
+ while (i < (int)m_staffLines.size())
+ clearStaffLineRow(i++);
+}
+
+void
+LinedStaff::clearStaffLineRow(int row)
+{
+ for (int h = 0; h < (int)m_staffLines[row].size(); ++h) {
+ delete m_staffLines[row][h];
+ }
+ m_staffLines[row].clear();
+
+ delete m_staffConnectingLines[row];
+ m_staffConnectingLines[row] = 0;
+}
+
+void
+LinedStaff::resizeStaffLineRow(int row, double x, double length)
+{
+ // RG_DEBUG << "LinedStaff::resizeStaffLineRow: row "
+ // << row << ", x " << x << ", length "
+ // << length << endl;
+
+
+ // If the resolution is 8 or less, we want to reduce the blackness
+ // of the staff lines somewhat to make them less intrusive
+
+ int level = 0;
+ int z = 2;
+ if (m_resolution < 6) {
+ z = -1;
+ level = (9 - m_resolution) * 32;
+ if (level > 200)
+ level = 200;
+ }
+
+ QColor lineColour(level, level, level);
+
+ int h;
+
+ /*!!! No longer really good enough. But we could potentially use the
+ bar positions to sort this out
+
+ if (m_pageMode && row > 0 && offset == 0.0) {
+ offset = (double)m_npf->getBarMargin() / 2;
+ length -= offset;
+ }
+ */
+
+ int y;
+
+ delete m_staffConnectingLines[row];
+
+ if (m_pageMode != LinearMode && m_connectingLineLength > 0.1) {
+
+ // rather arbitrary (dup in insertBar)
+ int barThickness = m_resolution / 12 + 1;
+ y = getCanvasYForTopLine(row);
+ QCanvasRectangle *line = new QCanvasRectangle
+ (int(x + length), y, barThickness, m_connectingLineLength, m_canvas);
+ line->setPen(GUIPalette::getColour(GUIPalette::StaffConnectingTerminatingLine));
+ line->setBrush(GUIPalette::getColour(GUIPalette::StaffConnectingTerminatingLine));
+ line->setZ( -2);
+ line->show();
+ m_staffConnectingLines[row] = line;
+
+ } else {
+ m_staffConnectingLines[row] = 0;
+ }
+
+ while ((int)m_staffLines[row].size() <= getLineCount() * m_lineThickness) {
+ m_staffLines[row].push_back(0);
+ }
+
+ int lineIndex = 0;
+
+ for (h = 0; h < getLineCount(); ++h) {
+
+ y = getCanvasYForHeight
+ (getBottomLineHeight() + getHeightPerLine() * h,
+ x, getCanvasYForTopLine(row));
+
+ if (elementsInSpaces()) {
+ y -= getLineSpacing() / 2 + 1;
+ }
+
+ // RG_DEBUG << "LinedStaff: drawing line from ("
+ // << x << "," << y << ") to (" << (x+length-1)
+ // << "," << y << ")" << endl;
+
+ QCanvasItem *line;
+ delete m_staffLines[row][lineIndex];
+ m_staffLines[row][lineIndex] = 0;
+
+ if (m_lineThickness > 1) {
+ QCanvasRectangle *rline = new QCanvasRectangle
+ (int(x), y, int(length), m_lineThickness, m_canvas);
+ rline->setPen(lineColour);
+ rline->setBrush(lineColour);
+ line = rline;
+ } else {
+ QCanvasLine *lline = new QCanvasLine(m_canvas);
+ lline->setPoints(int(x), y, int(x + length), y);
+ lline->setPen(lineColour);
+ line = lline;
+ }
+
+ // if (j > 0) line->setSignificant(false);
+
+ line->setZ(z);
+ m_staffLines[row][lineIndex] = line;
+ line->show();
+
+ ++lineIndex;
+ }
+
+ while (lineIndex < (int)m_staffLines[row].size()) {
+ delete m_staffLines[row][lineIndex];
+ m_staffLines[row][lineIndex] = 0;
+ ++lineIndex;
+ }
+}
+
+void
+LinedStaff::setCurrent(bool current)
+{
+ m_current = current;
+ if (m_current) {
+ m_insertCursor->show();
+ } else {
+ m_insertCursor->hide();
+ }
+}
+
+double
+LinedStaff::getLayoutXOfPointer() const
+{
+ double x = m_pointer->x();
+ int row = getRowForCanvasCoords(x, int(m_pointer->y()));
+ return getLayoutCoordsForCanvasCoords(x, getCanvasYForTopLine(row)).first;
+}
+
+void
+LinedStaff::getPointerPosition(double &cx, int &cy) const
+{
+ cx = m_pointer->x();
+ cy = getCanvasYForTopOfStaff(getRowForCanvasCoords(cx, int(m_pointer->y())));
+}
+
+double
+LinedStaff::getLayoutXOfInsertCursor() const
+{
+ if (!m_current) return -1;
+ double x = m_insertCursor->x();
+ int row = getRowForCanvasCoords(x, int(m_insertCursor->y()));
+ return getLayoutCoordsForCanvasCoords(x, getCanvasYForTopLine(row)).first;
+}
+
+timeT
+LinedStaff::getInsertCursorTime(HorizontalLayoutEngine &layout) const
+{
+ if (m_insertCursorTimeValid) return m_insertCursorTime;
+ return layout.getTimeForX(getLayoutXOfInsertCursor());
+}
+
+void
+LinedStaff::getInsertCursorPosition(double &cx, int &cy) const
+{
+ if (!m_current) {
+ cx = -1;
+ cy = -1;
+ return ;
+ }
+ cx = m_insertCursor->x();
+ cy = getCanvasYForTopOfStaff(getRowForCanvasCoords(cx, int(m_insertCursor->y())));
+}
+
+void
+LinedStaff::setPointerPosition(double canvasX, int canvasY)
+{
+ int row = getRowForCanvasCoords(canvasX, canvasY);
+ canvasY = getCanvasYForTopOfStaff(row);
+ m_pointer->setX(int(canvasX));
+ m_pointer->setY(int(canvasY));
+ m_pointer->setZ( -30); // behind everything else
+ m_pointer->setPoints(0, 0, 0, getHeightOfRow() /* - 1 */);
+ m_pointer->show();
+}
+
+void
+LinedStaff::setPointerPosition(HorizontalLayoutEngine &layout,
+ timeT time)
+{
+ setPointerPosition(layout.getXForTime(time));
+}
+
+void
+LinedStaff::setPointerPosition(double layoutX)
+{
+ LinedStaffCoords coords = getCanvasCoordsForLayoutCoords(layoutX, 0);
+ setPointerPosition(coords.first, coords.second);
+}
+
+void
+LinedStaff::hidePointer()
+{
+ m_pointer->hide();
+}
+
+void
+LinedStaff::setInsertCursorPosition(double canvasX, int canvasY)
+{
+ if (!m_current) return;
+
+ int row = getRowForCanvasCoords(canvasX, canvasY);
+ canvasY = getCanvasYForTopOfStaff(row);
+ m_insertCursor->setX(canvasX);
+ m_insertCursor->setY(canvasY);
+ m_insertCursor->setZ( -28); // behind everything else except playback pointer
+ m_insertCursor->setPoints(0, 0, 0, getHeightOfRow() - 1);
+ m_insertCursor->show();
+ m_insertCursorTimeValid = false;
+}
+
+void
+LinedStaff::setInsertCursorPosition(HorizontalLayoutEngine &layout,
+ timeT time)
+{
+ double x = layout.getXForTime(time);
+ LinedStaffCoords coords = getCanvasCoordsForLayoutCoords(x, 0);
+ setInsertCursorPosition(coords.first, coords.second);
+ m_insertCursorTime = time;
+ m_insertCursorTimeValid = true;
+}
+
+void
+LinedStaff::hideInsertCursor()
+{
+ m_insertCursor->hide();
+}
+
+void
+LinedStaff::renderElements(ViewElementList::iterator,
+ ViewElementList::iterator)
+{
+ // nothing -- we assume rendering will be done by the implementation
+ // of positionElements
+}
+
+void
+LinedStaff::renderAllElements()
+{
+ renderElements(getViewElementList()->begin(),
+ getViewElementList()->end());
+}
+
+void
+LinedStaff::positionAllElements()
+{
+ positionElements(getSegment().getStartTime(),
+ getSegment().getEndTime());
+}
+
+}
diff --git a/src/gui/general/LinedStaff.h b/src/gui/general/LinedStaff.h
new file mode 100644
index 0000000..1444bd2
--- /dev/null
+++ b/src/gui/general/LinedStaff.h
@@ -0,0 +1,759 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_LINEDSTAFF_H_
+#define _RG_LINEDSTAFF_H_
+
+#include "base/Event.h"
+#include "base/FastVector.h"
+#include "base/Staff.h"
+#include "base/ViewElement.h"
+#include <qrect.h>
+#include <utility>
+#include <vector>
+
+
+class QCanvasLine;
+class QCanvasItem;
+class QCanvas;
+class isFirstBarInRow;
+class barNo;
+
+
+namespace Rosegarden
+{
+
+class BarLine;
+class TimeSignature;
+class SnapGrid;
+class Segment;
+class HorizontalLayoutEngine;
+class Event;
+
+
+/**
+ * LinedStaff is a base class for implementations of Staff that
+ * display the contents of a Segment on a set of horizontal lines
+ * with optional vertical bar lines.
+ * Likely subclasses include the notation and piano-roll staffs.
+ *
+ * In general, this class handles x coordinates in floating-point,
+ * but y-coordinates as integers because of the requirement that
+ * staff lines be a precise integral distance apart.
+ */
+
+class LinedStaff : public Staff
+{
+public:
+ typedef std::pair<double, int> LinedStaffCoords;
+
+ enum PageMode {
+ LinearMode = 0,
+ ContinuousPageMode,
+ MultiPageMode
+ };
+
+ enum BarStyle {
+ PlainBar = 0,
+ DoubleBar,
+ HeavyDoubleBar,
+ RepeatEndBar,
+ RepeatStartBar,
+ RepeatBothBar,
+ NoVisibleBar
+ };
+
+protected:
+ /**
+ * Create a new LinedStaff for the given Segment, with a
+ * linear layout.
+ *
+ * \a id is an arbitrary id for the staff in its view,
+ * not used within the LinedStaff implementation but
+ * queryable via getId
+ *
+ * \a resolution is the number of blank pixels between
+ * staff lines
+ *
+ * \a lineThickness is the number of pixels thick a
+ * staff line should be
+ */
+ LinedStaff(QCanvas *, Segment *, SnapGrid *,
+ int id, int resolution, int lineThickness);
+
+ /**
+ * Create a new LinedStaff for the given Segment, with a
+ * page layout.
+ *
+ * \a id is an arbitrary id for the staff in its view,
+ * not used within the LinedStaff implementation but
+ * queryable via getId
+ *
+ * \a resolution is the number of blank pixels between
+ * staff lines
+ *
+ * \a lineThickness is the number of pixels thick a
+ * staff line should be
+ *
+ * \a pageWidth is the width of a page, to determine
+ * when to break lines for page layout
+ *
+ * \a rowsPerPage is the number of rows to a page, or zero
+ * for a single continuous page
+ *
+ * \a rowSpacing is the distance in pixels between
+ * the tops of consecutive rows on this staff
+ */
+ LinedStaff(QCanvas *, Segment *, SnapGrid *,
+ int id, int resolution, int lineThickness,
+ double pageWidth, int rowsPerPage, int rowSpacing);
+
+ /**
+ * Create a new LinedStaff for the given Segment, with
+ * either page or linear layout.
+ */
+ LinedStaff(QCanvas *, Segment *, SnapGrid *,
+ int id, int resolution, int lineThickness, PageMode pageMode,
+ double pageWidth, int rowsPerPage, int rowSpacing);
+
+public:
+ virtual ~LinedStaff();
+
+protected:
+ // Methods required to define the type of staff this is
+
+ /**
+ * Returns the number of visible staff lines
+ */
+ virtual int getLineCount() const = 0;
+
+ /**
+ * Returns the number of invisible staff lines
+ * to leave space for above (and below) the visible staff
+ */
+ virtual int getLegerLineCount() const = 0;
+
+ /**
+ * Returns the height-on-staff value for
+ * the bottom visible staff line (a shorthand means for
+ * referring to staff lines)
+ */
+ virtual int getBottomLineHeight() const = 0;
+
+ /**
+ * Returns the difference between the height-on-
+ * staff value of one visible staff line and the next one
+ * above it
+ */
+ virtual int getHeightPerLine() const = 0;
+
+ /**
+ * Returns the height-on-staff value for the top visible
+ * staff line. This is deliberately not virtual.
+ */
+ int getTopLineHeight() const {
+ return getBottomLineHeight() +
+ (getLineCount() - 1) * getHeightPerLine();
+ }
+
+ /**
+ * Returns true if elements fill the spaces between lines,
+ * false if elements can fall on lines. If true, the lines
+ * will be displaced vertically by half a line spacing.
+ */
+ virtual bool elementsInSpaces() const {
+ return false;
+ }
+
+ /**
+ * Returns true if the staff should draw a faint vertical line at
+ * each beat, in between the (darker) bar lines.
+ */
+ virtual bool showBeatLines() const {
+ return false;
+ }
+
+ /**
+ * Returns the number of bars between bar-line numbers, or zero if
+ * bar lines should not be numbered. For example, if this
+ * function returns 5, every 5th bar (starting at bar 5) will be
+ * numbered.
+ */
+ virtual int showBarNumbersEvery() const {
+ return 0;
+ }
+
+ /**
+ * Returns the bar line / repeat style for the start of the given bar.
+ */
+ virtual BarStyle getBarStyle(int /* barNo */) const {
+ return PlainBar;
+ }
+
+ /**
+ * Returns the distance the opening (repeat) bar is inset from the
+ * nominal barline position. This is to accommodate the situation
+ * where a repeat bar has to appear after the clef and key.
+ */
+ virtual double getBarInset(int /* barNo */, bool /* isFirstBarInRow */) const {
+ return 0;
+ }
+
+protected:
+ /// Subclass may wish to expose this
+ virtual void setResolution(int resolution);
+
+ /// Subclass may wish to expose this
+ virtual void setLineThickness(int lineThickness);
+
+ /// Subclass may wish to expose this
+ virtual void setPageMode(PageMode pageMode);
+
+ /// Subclass may wish to expose this
+ virtual void setPageWidth(double pageWidth);
+
+ /// Subclass may wish to expose this
+ virtual void setRowsPerPage(int rowsPerPage);
+
+ /// Subclass may wish to expose this
+ virtual void setRowSpacing(int rowSpacing);
+
+ /// Subclass may wish to expose this. Default is zero
+ virtual void setConnectingLineLength(int length);
+
+public:
+ /**
+ * Return the id of the staff. This is only useful to external
+ * agents, it isn't used by the LinedStaff itself.
+ */
+ virtual int getId() const;
+
+ /**
+ * Set the canvas x-coordinate of the left-hand end of the staff.
+ * This does not move any canvas items that have already been
+ * created; it should be called before the sizeStaff/positionElements
+ * procedure begins.
+ */
+ virtual void setX(double x);
+
+ /**
+ * Get the canvas x-coordinate of the left-hand end of the staff.
+ */
+ virtual double getX() const;
+
+ /**
+ * Set the canvas y-coordinate of the top of the first staff row.
+ * This does not move any canvas items that have already been
+ * created; it should be called before the sizeStaff/positionElements
+ * procedure begins.
+ */
+ virtual void setY(int y);
+
+ /**
+ * Get the canvas y-coordinate of the top of the first staff row.
+ */
+ virtual int getY() const;
+
+ /**
+ * Set the canvas width of the margin to left and right of the
+ * staff on each page (used only in MultiPageMode). Each staff
+ * row will still be pageWidth wide (that is, the margin is in
+ * addition to the pageWidth, not included in it). This does not
+ * move any canvas items that have already been created; it should
+ * be called before the sizeStaff/positionElements procedure
+ * begins.
+ */
+ virtual void setMargin(double m);
+
+ /**
+ * Get the canvas width of the left and right margins.
+ */
+ virtual double getMargin() const;
+
+ /**
+ * Set the canvas height of the area at the top of the first page
+ * reserved for the composition title and composer's name (used
+ * only in MultiPageMode).
+ */
+ virtual void setTitleHeight(int h);
+
+ /**
+ * Get the canvas height of the title area.
+ */
+ virtual int getTitleHeight() const;
+
+ /**
+ * Returns the width of the entire staff after layout. Call
+ * this only after you've done the full sizeStaff/positionElements
+ * procedure.
+ */
+ virtual double getTotalWidth() const;
+
+ /**
+ * Returns the height of the entire staff after layout. Call
+ * this only after you've done the full sizeStaff/positionElements
+ * procedure. If there are multiple rows, this will be the
+ * height of all rows, including any space between rows that
+ * is used to display other staffs.
+ */
+ virtual int getTotalHeight() const;
+
+ /**
+ * Returns the total number of pages used by the staff.
+ */
+ int getPageCount() const {
+ if (m_pageMode != MultiPageMode) return 1;
+ else return 1 + (getRowForLayoutX(m_endLayoutX) / getRowsPerPage());
+ }
+
+ /**
+ * Returns the difference between the y coordinates of
+ * neighbouring visible staff lines. Deliberately non-virtual
+ */
+ int getLineSpacing() const {
+ return m_resolution + m_lineThickness;
+ }
+
+ /**
+ * Returns the total height of a single staff row, including ruler
+ */
+ virtual int getHeightOfRow() const;
+
+ /**
+ * Returns true if the given canvas coordinates fall within
+ * (any of the rows of) this staff. False if they fall in the
+ * gap between two rows.
+ */
+ virtual bool containsCanvasCoords(double canvasX, int canvasY) const;
+
+ /**
+ * Returns the canvas y coordinate of the specified line on the
+ * staff. baseX/baseY are a canvas coordinates somewhere on the
+ * correct row, or -1 for the default row.
+ */
+ virtual int getCanvasYForHeight(int height, double baseX = -1, int baseY = -1) const;
+
+ /**
+ * Returns the y coordinate of the specified line on the
+ * staff, relative to the top of the row.
+ */
+ virtual int getLayoutYForHeight(int height) const;
+
+ /**
+ * Returns the height-on-staff value nearest to the given
+ * canvas coordinates.
+ */
+ virtual int getHeightAtCanvasCoords(double x, int y) const;
+
+ /**
+ * Return the full width, height and origin of the bar containing
+ * the given canvas cooordinates.
+ */
+ virtual QRect getBarExtents(double x, int y) const;
+
+ /**
+ * Set whether this is the current staff or not. A staff that is
+ * current will differ visually from non-current staffs.
+ *
+ * The owner of the staffs should normally ensure that one staff
+ * is current (the default is non-current, even if there only is
+ * one staff) and that only one staff is current at once.
+ */
+ virtual void setCurrent(bool current);
+
+ /**
+ * Move the playback pointer to the layout-X coordinate
+ * corresponding to the given time, and show it.
+ */
+ virtual void setPointerPosition
+ (HorizontalLayoutEngine&, timeT);
+
+ /**
+ * Move the playback pointer to the layout-X coordinate
+ * corresponding to the given canvas coordinates, and show it.
+ */
+ virtual void setPointerPosition(double x, int y);
+
+ /**
+ * Move the playback pointer to the given layout-X
+ * coordinate, and show it.
+ */
+ virtual void setPointerPosition(double x);
+
+ /**
+ * Returns the layout-X coordinate corresponding to the current
+ * position of the playback pointer.
+ */
+ virtual double getLayoutXOfPointer() const;
+
+ /**
+ * Returns the canvas coordinates of the top of the playback
+ * pointer.
+ */
+ virtual void getPointerPosition(double &x, int &y) const;
+
+ /**
+ * Hide the playback pointer.
+ */
+ virtual void hidePointer();
+
+ /**
+ * Move the insertion cursor to the layout-X coordinate
+ * corresponding to the given time, and show it.
+ */
+ virtual void setInsertCursorPosition(HorizontalLayoutEngine&, timeT);
+
+ /**
+ * Move the insertion cursor to the layout-X coordinate
+ * corresponding to the given canvas coordinates, and show it.
+ */
+ virtual void setInsertCursorPosition(double x, int y);
+
+ /**
+ * Returns the layout-X coordinate corresponding to the current
+ * position of the insertion cursor. Returns -1 if this staff
+ * is not current or there is some other problem.
+ */
+ virtual double getLayoutXOfInsertCursor() const;
+
+ /**
+ * Return the time of the insert cursor.
+ */
+ virtual timeT getInsertCursorTime(HorizontalLayoutEngine&) const;
+
+ /**
+ * Return the canvas coordinates of the top of the insert
+ * cursor.
+ */
+ virtual void getInsertCursorPosition(double &x, int &y) const;
+
+ /**
+ * Hide the insert cursor.
+ */
+ virtual void hideInsertCursor();
+
+ /**
+ * Query the given horizontal layout object (which is assumed to
+ * have just completed its layout procedure) to determine the
+ * required extents of the staff and the positions of the bars,
+ * and create the bars and staff lines accordingly. It may be
+ * called either before or after renderElements and/or
+ * positionElements.
+ *
+ * No bars or staff lines will appear unless this method has
+ * been called.
+ */
+ virtual void sizeStaff(HorizontalLayoutEngine& layout);
+
+ /**
+ * Generate or re-generate sprites for all the elements between
+ * from and to. See subclasses for specific detailed comments.
+ *
+ * A very simplistic staff subclass may choose not to
+ * implement this (the default implementation is empty) and to
+ * do all the rendering work in positionElements. If rendering
+ * elements is slow, however, it makes sense to do it here
+ * because this method may be called less often.
+ */
+ virtual void renderElements(ViewElementList::iterator from,
+ ViewElementList::iterator to);
+
+ /**
+ * Call renderElements(from, to) on the whole staff.
+ */
+ virtual void renderAllElements();
+
+ /**
+ * Assign suitable coordinates to the elements on the staff
+ * between the start and end times, based entirely on the layout
+ * X and Y coordinates they were given by the horizontal and
+ * vertical layout processes.
+ *
+ * The implementation is free to render any elements it
+ * chooses in this method as well.
+ */
+ virtual void positionElements(timeT from,
+ timeT to) = 0;
+
+ /**
+ * Call positionElements(from, to) on the whole staff.
+ */
+ virtual void positionAllElements();
+
+
+ /* Some optional methods for the subclass. */
+
+
+ /**
+ * Return an iterator pointing to the nearest view element to the
+ * given canvas coordinates.
+ *
+ * If notesAndRestsOnly is true, do not return any view element
+ * other than a note or rest.
+ *
+ * If the closest view element is further away than
+ * proximityThreshold pixels in either x or y axis, return end().
+ * If proximityThreshold is less than zero, treat it as infinite.
+ *
+ * Also return the clef and key in force at these coordinates.
+ *
+ * The default implementation should suit for subclasses that only
+ * show a single element per layout X coordinate.
+ */
+ virtual ViewElementList::iterator getClosestElementToCanvasCoords
+ (double x, int y,
+ Event *&clef, Event *&key,
+ bool notesAndRestsOnly = false, int proximityThreshold = 10) {
+ LinedStaffCoords layoutCoords = getLayoutCoordsForCanvasCoords(x, y);
+ return getClosestElementToLayoutX
+ (layoutCoords.first, clef, key,
+ notesAndRestsOnly, proximityThreshold);
+ }
+
+ /**
+ * Return an iterator pointing to the nearest view element to the
+ * given layout x-coordinate.
+ *
+ * If notesAndRestsOnly is true, do not return any view element
+ * other than a note or rest.
+ *
+ * If the closest view element is further away than
+ * proximityThreshold pixels in either x or y axis, return end().
+ * If proximityThreshold is less than zero, treat it as infinite.
+ *
+ * Also return the clef and key in force at these coordinates.
+ *
+ * The subclass may decide whether to implement this method or not
+ * based on the semantics and intended usage of the class.
+ */
+ virtual ViewElementList::iterator getClosestElementToLayoutX
+ (double x,
+ Event *&clef, Event *&key,
+ bool notesAndRestsOnly = false, int proximityThreshold = 10) {
+ return getViewElementList()->end();
+ }
+
+ /**
+ * Return an iterator pointing to the element "under" the given
+ * canvas coordinates.
+ *
+ * Return end() if there is no such element.
+ *
+ * Also return the clef and key in force at these coordinates.
+ *
+ *
+ * The default implementation should suit for subclasses that only
+ * show a single element per layout X coordinate.
+ */
+ virtual ViewElementList::iterator getElementUnderCanvasCoords
+ (double x, int y, Event *&clef, Event *&key) {
+ LinedStaffCoords layoutCoords = getLayoutCoordsForCanvasCoords(x, y);
+ return getElementUnderLayoutX(layoutCoords.first, clef, key);
+ }
+
+ /**
+ * Return an iterator pointing to the element "under" the given
+ * canvas coordinates.
+ *
+ * Return end() if there is no such element.
+ *
+ * Also return the clef and key in force at these coordinates.
+ *
+ * The subclass may decide whether to implement this method or not
+ * based on the semantics and intended usage of the class.
+ */
+ virtual ViewElementList::iterator getElementUnderLayoutX
+ (double x, Event *&clef, Event *&key) {
+ return getViewElementList()->end();
+ }
+
+ // The default implementation of the following is empty. The
+ // subclass is presumed to know what the staff's name is and
+ // where to put it; this is simply called at some point during
+ // the staff-drawing process.
+ virtual void drawStaffName();
+
+
+public:
+ // This should not really be public -- it should be one of the
+ // protected methods below -- but we have some code that needs
+ // it and hasn't been supplied with a proper way to do without.
+ // Please try to avoid calling this method.
+ //!!! fix NotationView::doDeferredCursorMove
+
+ // This should not really be public -- it should be one of the
+ // protected methods below -- but we have some code that needs
+ // it and hasn't been supplied with a proper way to do without.
+ // Please try to avoid calling this method.
+ //!!! fix NotationView::getStaffForCanvasCoords
+ LinedStaffCoords
+ getLayoutCoordsForCanvasCoords(double x, int y) const;
+
+ // This should not really be public -- it should be one of the
+ // protected methods below -- but we have some code that needs
+ // it and hasn't been supplied with a proper way to do without.
+ // Please try to avoid calling this method.
+ //!!! fix NotationView::scrollToTime
+ LinedStaffCoords
+ getCanvasCoordsForLayoutCoords(double x, int y) const;//!!!
+
+ // This should not really be public -- it should be one of the
+ // protected methods below -- but we have some code that needs
+ // it and hasn't been supplied with a proper way to do without.
+ // Please try to avoid calling this method.
+ //!!! fix NotationView::print etc
+ int getRowSpacing() { return m_rowSpacing; }
+
+protected:
+ // Methods that the subclass may (indeed, should) use to convert
+ // between the layout coordinates of elements and their canvas
+ // coordinates. These are deliberately not virtual.
+
+ // Note that even linear-layout staffs have multiple rows; their
+ // rows all have the same y coordinate but increasing x
+ // coordinates, instead of the other way around. (The only reason
+ // for this is that it seems to be more efficient from the QCanvas
+ // perspective to create and manipulate many relatively short
+ // canvas lines rather than a smaller number of very long ones.)
+
+ int getTopLineOffset() const {
+ return getLineSpacing() * getLegerLineCount();
+ }
+
+ int getBarLineHeight() const {
+ return getLineSpacing() * (getLineCount() - 1) + m_lineThickness;
+ }
+
+ int getRowForLayoutX(double x) const {
+ return (int)(x / m_pageWidth);
+ }
+
+ int getRowForCanvasCoords(double x, int y) const;
+
+ int getCanvasYForTopOfStaff(int row = -1) const;
+
+ int getCanvasYForTopLine(int row = -1) const {
+ return getCanvasYForTopOfStaff(row) + getTopLineOffset();
+ }
+
+ double getCanvasXForLeftOfRow(int row) const;
+
+ double getCanvasXForRightOfRow(int row) const {
+ return getCanvasXForLeftOfRow(row) + m_pageWidth;
+ }
+
+ LinedStaffCoords
+ getCanvasOffsetsForLayoutCoords(double x, int y) const {
+ LinedStaffCoords cc = getCanvasCoordsForLayoutCoords(x, y);
+ return LinedStaffCoords(cc.first - x, cc.second - y);
+ }
+
+ double getCanvasXForLayoutX(double x) const;
+
+ int getRowsPerPage() const {
+ return m_rowsPerPage;
+ }
+
+protected:
+ // Actual implementation methods. The default implementation
+ // shows staff lines, connecting lines (where appropriate) and bar
+ // lines, but does not show time signatures. To see time
+ // signatures, override the deleteTimeSignatures and
+ // insertTimeSignature methods. For repeated clefs and keys at
+ // the start of each row, override deleteRepeatedClefsAndKeys
+ // and insertRepeatedClefAndKey, but note that your layout class
+ // will need to allot the space for them separately.
+
+ virtual void resizeStaffLines();
+ virtual void clearStaffLineRow(int row);
+ virtual void resizeStaffLineRow(int row, double offset, double length);
+
+ virtual void deleteBars();
+ virtual void insertBar(double layoutX, double width, bool isCorrect,
+ const TimeSignature &,
+ int barNo, bool showBarNo);
+
+ // The default implementations of the following two are empty.
+ virtual void deleteTimeSignatures();
+ virtual void insertTimeSignature(double layoutX,
+ const TimeSignature &);
+
+ // The default implementations of the following two are empty.
+ virtual void deleteRepeatedClefsAndKeys();
+ virtual void insertRepeatedClefAndKey(double layoutX, int barNo);
+
+ void initCursors();
+
+protected:
+
+ //--------------- Data members ---------------------------------
+
+ QCanvas *m_canvas;
+ SnapGrid *m_snapGrid;
+
+ int m_id;
+
+ double m_x;
+ int m_y;
+ double m_margin;
+ int m_titleHeight;
+ int m_resolution;
+ int m_lineThickness;
+
+ PageMode m_pageMode;
+ double m_pageWidth;
+ int m_rowsPerPage;
+ int m_rowSpacing;
+ int m_connectingLineLength;
+
+ double m_startLayoutX;
+ double m_endLayoutX;
+
+ bool m_current;
+
+ typedef std::vector<QCanvasItem *> ItemList;
+ typedef std::vector<ItemList> ItemMatrix;
+ ItemMatrix m_staffLines;
+ ItemList m_staffConnectingLines;
+
+ typedef std::pair<double, QCanvasItem *> LineRec; // layout-x, line
+ typedef FastVector<LineRec> LineRecList;
+ typedef FastVector<BarLine *> BarLineList;//!!! should be multiset I reckon
+ static bool compareBars(const BarLine *, const BarLine *);
+ static bool compareBarToLayoutX(const BarLine *, int);
+ BarLineList m_barLines;
+ LineRecList m_beatLines;
+ LineRecList m_barConnectingLines;
+ ItemList m_barNumbers;
+
+ QCanvasLine *m_pointer;
+ QCanvasLine *m_insertCursor;
+ timeT m_insertCursorTime;
+ bool m_insertCursorTimeValid;
+};
+
+
+}
+
+#endif
diff --git a/src/gui/general/LinedStaffManager.cpp b/src/gui/general/LinedStaffManager.cpp
new file mode 100644
index 0000000..b1b92d2
--- /dev/null
+++ b/src/gui/general/LinedStaffManager.cpp
@@ -0,0 +1,33 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "LinedStaffManager.h"
+
+#include "LinedStaff.h"
+
+
+namespace Rosegarden
+{
+}
diff --git a/src/gui/general/LinedStaffManager.h b/src/gui/general/LinedStaffManager.h
new file mode 100644
index 0000000..44338f1
--- /dev/null
+++ b/src/gui/general/LinedStaffManager.h
@@ -0,0 +1,61 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_LINEDSTAFFMANAGER_H_
+#define _RG_LINEDSTAFFMANAGER_H_
+
+
+
+
+
+namespace Rosegarden
+{
+
+class LinedStaff;
+
+
+/**
+ * LinedStaffManager is a trivial abstract base for classes that own
+ * and position sets of LinedStaffs, as a convenient API to permit
+ * clients (such as canvas implementations) to discover which staff
+ * lies where.
+ *
+ * LinedStaffManager is not used by LinedStaff.
+ */
+
+class LinedStaff;
+
+class LinedStaffManager
+{
+public:
+ virtual ~LinedStaffManager() {}
+ virtual LinedStaff *getStaffForCanvasCoords(int x, int y) const = 0;
+};
+
+
+
+}
+
+#endif
diff --git a/src/gui/general/MidiPitchLabel.cpp b/src/gui/general/MidiPitchLabel.cpp
new file mode 100644
index 0000000..47a748b
--- /dev/null
+++ b/src/gui/general/MidiPitchLabel.cpp
@@ -0,0 +1,74 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "MidiPitchLabel.h"
+#include <kapplication.h>
+
+#include "document/ConfigGroups.h"
+#include <kconfig.h>
+#include <klocale.h>
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+static QString notes[] = {
+ i18n("C%1"), i18n("C#%1"), i18n("D%1"), i18n("D#%1"),
+ i18n("E%1"), i18n("F%1"), i18n("F#%1"), i18n("G%1"),
+ i18n("G#%1"), i18n("A%1"), i18n("A#%1"), i18n("B%1")
+};
+
+
+MidiPitchLabel::MidiPitchLabel(int pitch)
+{
+ if (pitch < 0 || pitch > 127) {
+
+ m_midiNote = "";
+
+ } else {
+
+ KConfig *config = kapp->config();
+ config->setGroup(GeneralOptionsConfigGroup);
+ int baseOctave = config->readNumEntry("midipitchoctave", -2);
+
+ int octave = (int)(((float)pitch) / 12.0) + baseOctave;
+ m_midiNote = notes[pitch % 12].arg(octave);
+ }
+}
+
+std::string
+MidiPitchLabel::getString() const
+{
+ return std::string(m_midiNote.utf8().data());
+}
+
+QString
+MidiPitchLabel::getQString() const
+{
+ return m_midiNote;
+}
+
+}
diff --git a/src/gui/general/MidiPitchLabel.h b/src/gui/general/MidiPitchLabel.h
new file mode 100644
index 0000000..9abcc11
--- /dev/null
+++ b/src/gui/general/MidiPitchLabel.h
@@ -0,0 +1,57 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_MIDIPITCHLABEL_H_
+#define _RG_MIDIPITCHLABEL_H_
+
+#include <string>
+#include <qstring.h>
+
+
+
+
+namespace Rosegarden
+{
+
+
+
+class MidiPitchLabel
+{
+public:
+ MidiPitchLabel(int pitch);
+
+ std::string getString() const;
+ QString getQString() const;
+
+private:
+ QString m_midiNote;
+
+};
+
+
+
+}
+
+#endif
diff --git a/src/gui/general/PixmapFunctions.cpp b/src/gui/general/PixmapFunctions.cpp
new file mode 100644
index 0000000..d297dad
--- /dev/null
+++ b/src/gui/general/PixmapFunctions.cpp
@@ -0,0 +1,271 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "PixmapFunctions.h"
+
+#include <qbitmap.h>
+#include <qcolor.h>
+#include <qimage.h>
+#include <qpainter.h>
+#include <qpixmap.h>
+
+#include <iostream>
+
+namespace Rosegarden
+{
+
+QBitmap
+PixmapFunctions::generateMask(const QPixmap &map, const QRgb &px)
+{
+ QImage i(map.convertToImage());
+ QImage im(i.width(), i.height(), 1, 2, QImage::LittleEndian);
+
+ for (int y = 0; y < i.height(); ++y) {
+ for (int x = 0; x < i.width(); ++x) {
+ if (i.pixel(x, y) != px) {
+ im.setPixel(x, y, 1);
+ } else {
+ im.setPixel(x, y, 0);
+ }
+ }
+ }
+
+ QBitmap m;
+ m.convertFromImage(im);
+ return m;
+}
+
+QBitmap
+PixmapFunctions::generateMask(const QPixmap &map)
+{
+ QImage i(map.convertToImage());
+ QImage im(i.width(), i.height(), 1, 2, QImage::LittleEndian);
+
+ QRgb px0(i.pixel(0, 0));
+ QRgb px1(i.pixel(i.width() - 1, 0));
+ QRgb px2(i.pixel(i.width() - 1, i.height() - 1));
+ QRgb px3(i.pixel(0, i.height() - 1));
+
+ QRgb px(px0);
+ if (px0 != px2 && px1 == px3)
+ px = px1;
+
+ for (int y = 0; y < i.height(); ++y) {
+ for (int x = 0; x < i.width(); ++x) {
+ if (i.pixel(x, y) != px) {
+ im.setPixel(x, y, 1);
+ } else {
+ im.setPixel(x, y, 0);
+ }
+ }
+ }
+
+ QBitmap m;
+ m.convertFromImage(im);
+ return m;
+}
+
+QPixmap
+PixmapFunctions::colourPixmap(const QPixmap &map, int hue, int minValue)
+{
+ // assumes pixmap is currently in shades of grey; maps black ->
+ // solid colour and greys -> shades of colour
+
+ QImage image = map.convertToImage();
+
+ int s, v;
+
+ bool warned = false;
+
+ for (int y = 0; y < image.height(); ++y) {
+ for (int x = 0; x < image.width(); ++x) {
+
+ QColor pixel(image.pixel(x, y));
+
+ int oldHue;
+ pixel.hsv(&oldHue, &s, &v);
+
+ if (oldHue >= 0) {
+ if (!warned) {
+ std::cerr << "PixmapFunctions::recolour: Not a greyscale pixmap "
+ << "(found rgb value " << pixel.red() << ","
+ << pixel.green() << "," << pixel.blue()
+ << "), hoping for the best" << std::endl;
+ warned = true;
+ }
+ }
+
+ image.setPixel
+ (x, y, QColor(hue,
+ 255 - v,
+ v > minValue ? v : minValue,
+ QColor::Hsv).rgb());
+ }
+ }
+
+ QPixmap rmap;
+ rmap.convertFromImage(image);
+ if (map.mask())
+ rmap.setMask(*map.mask());
+ return rmap;
+}
+
+QPixmap
+PixmapFunctions::shadePixmap(const QPixmap &map)
+{
+ QImage image = map.convertToImage();
+
+ int h, s, v;
+
+ for (int y = 0; y < image.height(); ++y) {
+ for (int x = 0; x < image.width(); ++x) {
+
+ QColor pixel(image.pixel(x, y));
+
+ pixel.hsv(&h, &s, &v);
+
+ image.setPixel
+ (x, y, QColor(h,
+ s,
+ 255 - ((255 - v) / 2),
+ QColor::Hsv).rgb());
+ }
+ }
+
+ QPixmap rmap;
+ rmap.convertFromImage(image);
+ if (map.mask())
+ rmap.setMask(*map.mask());
+ return rmap;
+}
+
+QPixmap
+PixmapFunctions::flipVertical(const QPixmap &map)
+{
+ QPixmap rmap;
+ QImage i(map.convertToImage());
+ rmap.convertFromImage(i.mirror(false, true));
+
+ if (map.mask()) {
+ QImage im(map.mask()->convertToImage());
+ QBitmap newMask;
+ newMask.convertFromImage(im.mirror(false, true));
+ rmap.setMask(newMask);
+ }
+
+ return rmap;
+}
+
+QPixmap
+PixmapFunctions::flipHorizontal(const QPixmap &map)
+{
+ QPixmap rmap;
+ QImage i(map.convertToImage());
+ rmap.convertFromImage(i.mirror(true, false));
+
+ if (map.mask()) {
+ QImage im(map.mask()->convertToImage());
+ QBitmap newMask;
+ newMask.convertFromImage(im.mirror(true, false));
+ rmap.setMask(newMask);
+ }
+
+ return rmap;
+}
+
+std::pair<QPixmap, QPixmap>
+PixmapFunctions::splitPixmap(const QPixmap &pixmap, int x)
+{
+ QPixmap left(x, pixmap.height(), pixmap.depth());
+ QBitmap leftMask(left.width(), left.height());
+
+ QPixmap right(pixmap.width() - x, pixmap.height(), pixmap.depth());
+ QBitmap rightMask(right.width(), right.height());
+
+ QPainter paint;
+
+ paint.begin(&left);
+ paint.drawPixmap(0, 0, pixmap, 0, 0, left.width(), left.height());
+ paint.end();
+
+ paint.begin(&leftMask);
+ paint.drawPixmap(0, 0, *pixmap.mask(), 0, 0, left.width(), left.height());
+ paint.end();
+
+ left.setMask(leftMask);
+
+ paint.begin(&right);
+ paint.drawPixmap(0, 0, pixmap, left.width(), 0, right.width(), right.height());
+ paint.end();
+
+ paint.begin(&rightMask);
+ paint.drawPixmap(0, 0, *pixmap.mask(), left.width(), 0, right.width(), right.height());
+ paint.end();
+
+ right.setMask(rightMask);
+
+ return std::pair<QPixmap, QPixmap>(left, right);
+}
+
+void
+PixmapFunctions::drawPixmapMasked(QPixmap &dest, QBitmap &destMask,
+ int x0, int y0,
+ const QPixmap &src)
+{
+ QImage idp(dest.convertToImage());
+ QImage idm(destMask.convertToImage());
+ QImage isp(src.convertToImage());
+ QImage ism(src.mask()->convertToImage());
+
+ for (int y = 0; y < isp.height(); ++y) {
+ for (int x = 0; x < isp.width(); ++x) {
+
+ if (x >= ism.width())
+ continue;
+ if (y >= ism.height())
+ continue;
+
+ if (ism.depth() == 1 && ism.pixel(x, y) == 0)
+ continue;
+ if (ism.pixel(x, y) == Qt::white.rgb())
+ continue;
+
+ int x1 = x + x0;
+ int y1 = y + y0;
+ if (x1 < 0 || x1 >= idp.width())
+ continue;
+ if (y1 < 0 || y1 >= idp.height())
+ continue;
+
+ idp.setPixel(x1, y1, isp.pixel(x, y));
+ idm.setPixel(x1, y1, 1);
+ }
+ }
+
+ dest.convertFromImage(idp);
+ destMask.convertFromImage(idm);
+}
+
+}
diff --git a/src/gui/general/PixmapFunctions.h b/src/gui/general/PixmapFunctions.h
new file mode 100644
index 0000000..22da0f0
--- /dev/null
+++ b/src/gui/general/PixmapFunctions.h
@@ -0,0 +1,107 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_PIXMAPFUNCTIONS_H_
+#define _RG_PIXMAPFUNCTIONS_H_
+
+#include <qbitmap.h>
+#include <qpixmap.h>
+#include <utility>
+
+
+namespace Rosegarden
+{
+
+
+
+class PixmapFunctions
+{
+public:
+ /**
+ * Generate a heuristic mask for the given pixmap. Unlike
+ * QPixmap::createHeuristicMask, this removes from the mask all
+ * pixels that are apparently "background" even if they appear in
+ * holes in the middle of the image. This is more usually what we
+ * want than the default behaviour of createHeuristicMask.
+ *
+ * The rgb value specifies the colour to treat as background.
+ *
+ * This function is slow.
+ */
+ static QBitmap generateMask(const QPixmap &map, const QRgb &rgb);
+
+ /**
+ * Generate a heuristic mask for the given pixmap. Unlike
+ * QPixmap::createHeuristicMask, this removes from the mask all
+ * pixels that are apparently "background" even if they appear in
+ * holes in the middle of the image. This is more usually what we
+ * want than the default behaviour of createHeuristicMask.
+ *
+ * This function calculates its own estimated colour to match as
+ * background.
+ *
+ * This function is slow.
+ */
+ static QBitmap generateMask(const QPixmap &map);
+
+ /**
+ * Colour a greyscale pixmap with the given hue.
+ * minValue specifies the minimum value (in the HSV sense) that
+ * will be used for any recoloured pixel.
+ */
+ static QPixmap colourPixmap(const QPixmap &map, int hue, int minValue);
+
+ /**
+ * Make a pixmap grey, or otherwise reduce its intensity.
+ */
+ static QPixmap shadePixmap(const QPixmap &map);
+
+ /// Return a QPixmap that is a mirror image of map (including mask)
+ static QPixmap flipVertical(const QPixmap &map);
+
+ /// Return a QPixmap that is a mirror image of map (including mask)
+ static QPixmap flipHorizontal(const QPixmap &map);
+
+ /// Return left and right parts of the QPixmap
+ static std::pair<QPixmap, QPixmap> splitPixmap(const QPixmap &original, int x);
+
+ /**
+ * Using QPainter::drawPixmap to draw one pixmap on another does
+ * not appear to take the mask into account properly. Background
+ * pixels in the second pixmap erase foreground pixels in the
+ * first one, regardless of whether they're masked or not. This
+ * function does what I expect.
+ *
+ * Note that the source pixmap _must_ have a mask.
+ */
+ static void drawPixmapMasked(QPixmap &dest, QBitmap &destMask,
+ int x, int y,
+ const QPixmap &source);
+};
+
+
+}
+
+#endif
diff --git a/src/gui/general/PresetElement.cpp b/src/gui/general/PresetElement.cpp
new file mode 100644
index 0000000..4158d69
--- /dev/null
+++ b/src/gui/general/PresetElement.cpp
@@ -0,0 +1,68 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ This file is Copyright 2006
+ D. Michael McIntyre <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "PresetElement.h"
+
+#include "misc/Debug.h"
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+PresetElement::PresetElement(QString name,
+ int clef,
+ int transpose,
+ int highAm,
+ int lowAm,
+ int highPro,
+ int lowPro) :
+ m_name (name),
+ m_clef (clef),
+ m_transpose (transpose),
+ m_highAm (highAm),
+ m_lowAm (lowAm),
+ m_highPro (highPro),
+ m_lowPro (lowPro)
+{
+ RG_DEBUG << "PresetElement::PresetElement(" << endl
+ << " name = " << name << endl
+ << " clef = " << clef << endl
+ << " trns.= " << transpose << endl
+ << " higH = " << highAm << endl
+ << " lowA = " << lowAm << endl
+ << " higP = " << highPro << endl
+ << " lowP = " << lowPro << ")" << endl;
+}
+
+PresetElement::~PresetElement()
+{
+ // nothing to do
+}
+
+}
diff --git a/src/gui/general/PresetElement.h b/src/gui/general/PresetElement.h
new file mode 100644
index 0000000..24d3ee4
--- /dev/null
+++ b/src/gui/general/PresetElement.h
@@ -0,0 +1,82 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ This file is Copyright 2006
+ D. Michael McIntyre <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_PRESETELEMENT_H_
+#define _RG_PRESETELEMENT_H_
+
+#include <qstring.h>
+
+#include <vector>
+
+
+
+namespace Rosegarden
+{
+
+/*
+ * A container class for storing a set of data describing a real world
+ * instrument for which one is writing musical notation
+ */
+class PresetElement
+{
+public:
+
+ PresetElement(QString name,
+ int clef,
+ int transpose,
+ int highAm,
+ int lowAm,
+ int highPro,
+ int lowPro);
+
+ ~PresetElement();
+
+ // accessors
+ QString getName() { return m_name; }
+ int getClef() { return m_clef; }
+ int getTranspose() { return m_transpose; }
+ int getHighAm() { return m_highAm; }
+ int getLowAm() { return m_lowAm; }
+ int getHighPro() { return m_highPro; }
+ int getLowPro() { return m_lowPro; }
+
+private:
+ QString m_name;
+ int m_clef;
+ int m_transpose;
+ int m_highAm;
+ int m_lowAm;
+ int m_highPro;
+ int m_lowPro;
+}; // PresetElement
+
+typedef std::vector<PresetElement> ElementContainer;
+
+}
+
+#endif
diff --git a/src/gui/general/PresetGroup.cpp b/src/gui/general/PresetGroup.cpp
new file mode 100644
index 0000000..4a457a9
--- /dev/null
+++ b/src/gui/general/PresetGroup.cpp
@@ -0,0 +1,269 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ This file is Copyright 2006
+ D. Michael McIntyre <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "PresetGroup.h"
+
+#include "misc/Debug.h"
+#include "misc/Strings.h"
+#include "gui/general/ClefIndex.h"
+#include "base/Exception.h"
+#include "CategoryElement.h"
+#include <klocale.h>
+#include <kstddirs.h>
+#include <kglobal.h>
+#include <qfile.h>
+#include <qfileinfo.h>
+#include <qregexp.h>
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+PresetGroup::PresetGroup() :
+ m_errorString(i18n("unknown error")),
+ m_elCategoryName(""),
+ m_elInstrumentName(""),
+ m_elClef(0),
+ m_elTranspose(0),
+ m_elLowAm(0),
+ m_elHighAm(0),
+ m_elLowPro(0),
+ m_elHighPro(0),
+ m_lastCategory( -1),
+ m_currentCategory( -1),
+ m_lastInstrument( -1),
+ m_currentInstrument( -1),
+ m_name(false),
+ m_clef(false),
+ m_transpose(false),
+ m_amateur(false),
+ m_pro(false)
+{
+ m_presetDirectory = KGlobal::dirs()->findResource("appdata", "presets/");
+
+ QString language = KGlobal::locale()->language();
+
+ QString presetFileName = QString("%1/presets-%2.xml")
+ .arg(m_presetDirectory).arg(language);
+
+ if (!QFileInfo(presetFileName).isReadable()) {
+
+ RG_DEBUG << "Failed to open " << presetFileName << endl;
+
+ language.replace(QRegExp("_.*$"), "");
+ presetFileName = QString("%1/presets-%2.xml")
+ .arg(m_presetDirectory).arg(language);
+
+ if (!QFileInfo(presetFileName).isReadable()) {
+
+ RG_DEBUG << "Failed to open " << presetFileName << endl;
+
+ presetFileName = QString("%1/presets.xml")
+ .arg(m_presetDirectory);
+
+ if (!QFileInfo(presetFileName).isReadable()) {
+
+ RG_DEBUG << "Failed to open " << presetFileName << endl;
+
+ throw PresetFileReadFailed
+ (qstrtostr(i18n("Can't open preset file %1").
+ arg(presetFileName)));
+ }
+ }
+ }
+
+ QFile presetFile(presetFileName);
+
+ QXmlInputSource source(presetFile);
+ QXmlSimpleReader reader;
+ reader.setContentHandler(this);
+ reader.setErrorHandler(this);
+ bool ok = reader.parse(source);
+ presetFile.close();
+
+ if (!ok) {
+ throw PresetFileReadFailed(qstrtostr(m_errorString));
+ }
+}
+
+PresetGroup::~PresetGroup()
+{
+ //!!! do I have anything to do here?
+}
+
+bool
+PresetGroup::startElement(const QString &, const QString &,
+ const QString &qName,
+ const QXmlAttributes &attributes)
+{
+ QString lcName = qName.lower();
+
+ // RG_DEBUG << "PresetGroup::startElement: processing starting element: " << lcName << endl;
+
+ if (lcName == "category") {
+
+ QString s = attributes.value("name");
+ if (s) {
+ m_elCategoryName = s;
+ // increment the current category number
+ m_lastCategory = m_currentCategory;
+ m_currentCategory++;
+
+ // reset the instrument counter going into the new category
+ m_lastInstrument = -1;
+ m_currentInstrument = -1;
+
+ RG_DEBUG << "PresetGroup::startElement: adding category " << m_elCategoryName << " last: "
+ << m_lastCategory << " curr: " << m_currentCategory << endl;
+
+ // add new CategoryElement to m_categories, in order to contain
+ // subsequent PresetElements
+ CategoryElement ce(m_elCategoryName);
+ m_categories.push_back(ce);
+ }
+
+ } else if (lcName == "instrument") {
+
+ QString s = attributes.value("name");
+ if (s) {
+ m_elInstrumentName = s;
+ m_name = true;
+
+ // increment the current instrument number
+ m_lastInstrument = m_currentInstrument;
+ m_currentInstrument++;
+ }
+
+ } else if (lcName == "clef") {
+ QString s = attributes.value("type");
+ if (s) {
+ m_elClef = clefNameToClefIndex(s);
+ m_clef = true;
+ }
+ } else if (lcName == "transpose") {
+ QString s = attributes.value("value");
+ if (s) {
+ m_elTranspose = s.toInt();
+ m_transpose = true;
+ }
+
+ } else if (lcName == "range") {
+ QString s = attributes.value("class");
+
+ if (s == "amateur") {
+ s = attributes.value("low");
+ if (s) {
+ m_elLowAm = s.toInt();
+ m_amateur = true;
+ }
+
+ s = attributes.value("high");
+ if (s && m_amateur) {
+ m_elHighAm = s.toInt();
+ } else {
+ return false;
+ }
+
+ } else if (s == "professional") {
+ s = attributes.value("low");
+ if (s) {
+ m_pro = true;
+ m_elLowPro = s.toInt();
+ }
+
+ s = attributes.value("high");
+ if (s && m_pro) {
+ m_elHighPro = s.toInt();
+ } else {
+ return false;
+ }
+ } else {
+ return false;
+ }
+ }
+
+ // RG_DEBUG << "PresetGroup::startElement(): accumulating flags:" << endl
+ // << " name: " << (m_name ? "true" : "false") << endl
+ // << " clef: " << (m_clef ? "true" : "false") << endl
+ // << "transpose: " << (m_transpose ? "true" : "false") << endl
+ // << " am. rng: " << (m_amateur ? "true" : "false") << endl
+ // << " pro rng: " << (m_pro ? "true" : "false") << endl;
+
+ // once we have assembled all the bits, create a new PresetElement
+ if (m_name && m_clef && m_transpose && m_amateur && m_pro) {
+ m_categories[m_currentCategory].addPreset(m_elInstrumentName,
+ m_elClef,
+ m_elTranspose,
+ m_elHighAm,
+ m_elLowAm,
+ m_elHighPro,
+ m_elLowPro);
+ // increment the current instrument
+ //!!! (is this ever going to be needed?)
+ m_lastInstrument = m_currentInstrument;
+ m_currentInstrument++;
+
+ // reset the "do we have a whole preset yet?" flags
+ m_name = false;
+ m_clef = false;
+ m_transpose = false;
+ m_amateur = false;
+ m_pro = false;
+ }
+
+ return true;
+
+} // startElement
+
+bool
+PresetGroup::error(const QXmlParseException& exception)
+{
+ RG_DEBUG << "PresetGroup::error(): jubilation and glee, we have an error, whee!" << endl;
+
+ m_errorString = QString("%1 at line %2, column %3: %4")
+ .arg(exception.message())
+ .arg(exception.lineNumber())
+ .arg(exception.columnNumber())
+ .arg(m_errorString);
+ return QXmlDefaultHandler::error(exception);
+}
+
+bool
+PresetGroup::fatalError(const QXmlParseException& exception)
+{
+ RG_DEBUG << "PresetGroup::fatalError(): double your jubilation, and triple your glee, a fatal error doth it be!" << endl;
+ m_errorString = QString("%1 at line %2, column %3: %4")
+ .arg(exception.message())
+ .arg(exception.lineNumber())
+ .arg(exception.columnNumber())
+ .arg(m_errorString);
+ return QXmlDefaultHandler::fatalError(exception);
+}
+
+}
diff --git a/src/gui/general/PresetGroup.h b/src/gui/general/PresetGroup.h
new file mode 100644
index 0000000..476a878
--- /dev/null
+++ b/src/gui/general/PresetGroup.h
@@ -0,0 +1,105 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ This file is Copyright 2006
+ D. Michael McIntyre <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_PRESETGROUP_H_
+#define _RG_PRESETGROUP_H_
+
+#include "base/Exception.h"
+#include "CategoryElement.h"
+#include <qstring.h>
+#include <qxml.h>
+
+
+class QXmlParseException;
+class QXmlAttributes;
+
+
+namespace Rosegarden
+{
+
+/*
+ * Read presets.xml from disk and store a collection of PresetElement objects
+ * which can then be used to populate and run the chooser GUI
+ */
+class PresetGroup : public QXmlDefaultHandler
+{
+public:
+ typedef Exception PresetFileReadFailed;
+
+ PresetGroup(); // load and parse the XML mapping file
+ ~PresetGroup();
+
+ CategoriesContainer getCategories() { return m_categories; }
+ //CategoryElement getCategoryByIndex(int index) { return m_categories [index]; }
+
+ // Xml handler methods:
+
+ virtual bool startElement (const QString& namespaceURI, const QString& localName,
+ const QString& qName, const QXmlAttributes& atts);
+
+ bool error(const QXmlParseException& exception);
+ bool fatalError(const QXmlParseException& exception);
+
+ // I don't think I have anything to do with this, but it must return true?
+// bool characters(const QString &) { return true; }
+
+private:
+
+ //--------------- Data members ---------------------------------
+ CategoriesContainer m_categories;
+
+ // For use when reading the XML file:
+ QString m_errorString;
+ QString m_presetDirectory;
+
+ QString m_elCategoryName;
+ QString m_elInstrumentName;
+ int m_elClef;
+ int m_elTranspose;
+ int m_elLowAm;
+ int m_elHighAm;
+ int m_elLowPro;
+ int m_elHighPro;
+
+ int m_lastCategory;
+ int m_currentCategory;
+ int m_lastInstrument;
+ int m_currentInstrument;
+
+ bool m_name;
+ bool m_clef;
+ bool m_transpose;
+ bool m_amateur;
+ bool m_pro;
+
+}; // PresetGroup
+
+
+}
+
+#endif
diff --git a/src/gui/general/PresetHandlerDialog.cpp b/src/gui/general/PresetHandlerDialog.cpp
new file mode 100644
index 0000000..6081f85
--- /dev/null
+++ b/src/gui/general/PresetHandlerDialog.cpp
@@ -0,0 +1,281 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ This file is Copyright 2006
+ D. Michael McIntyre <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "PresetHandlerDialog.h"
+#include <qlayout.h>
+#include <kapplication.h>
+
+#include <klocale.h>
+#include "misc/Debug.h"
+#include "document/ConfigGroups.h"
+#include "CategoryElement.h"
+#include "PresetElement.h"
+#include "PresetGroup.h"
+#include <kcombobox.h>
+#include <kconfig.h>
+#include <kdialogbase.h>
+#include <qbuttongroup.h>
+#include <qdialog.h>
+#include <qframe.h>
+#include <qgroupbox.h>
+#include <qlabel.h>
+#include <qstring.h>
+#include <qvbox.h>
+#include <qwidget.h>
+
+
+namespace Rosegarden
+{
+
+PresetHandlerDialog::PresetHandlerDialog(QWidget *parent, bool fromNotation)
+ : KDialogBase(parent, "presethandlerdialog", true, i18n("Load track parameters preset"), Ok | Cancel, Ok),
+ m_config(kapp->config()),
+ m_fromNotation(fromNotation)
+{
+ m_presets = new PresetGroup();
+ m_categories = m_presets->getCategories();
+ if (m_fromNotation) setCaption(i18n("Convert notation for..."));
+
+ initDialog();
+}
+
+PresetHandlerDialog::~PresetHandlerDialog()
+{
+ // delete m_presets
+ if (m_presets != NULL) {
+ delete m_presets;
+ }
+}
+
+void
+PresetHandlerDialog::initDialog()
+{
+ RG_DEBUG << "PresetHandlerDialog::initDialog()" << endl;
+
+ QVBox *vBox = makeVBoxMainWidget();
+
+ QFrame *frame = new QFrame(vBox);
+
+ QGridLayout *layout = new QGridLayout(frame, 6, 5, 10, 5);
+
+ QLabel *title = new QLabel(i18n("Select preset track parameters for:"), frame);
+ if (m_fromNotation) title->setText(i18n("Create appropriate notation for:"));
+
+ QLabel *catlabel = new QLabel(i18n("Category"), frame);
+ m_categoryCombo = new KComboBox(frame);
+
+ QLabel *inslabel = new QLabel(i18n("Instrument"), frame);
+ m_instrumentCombo = new KComboBox(frame);
+
+ QLabel *plylabel = new QLabel(i18n("Player Ability"), frame);
+ m_playerCombo = new KComboBox(frame);
+ m_playerCombo->insertItem(i18n("Amateur"));
+ m_playerCombo->insertItem(i18n("Professional"));
+
+ QGroupBox *scopeBox = new QButtonGroup
+ (1, Horizontal, i18n("Scope"), frame);
+ if (m_fromNotation) {
+ QRadioButton *onlySelectedSegments = new
+ QRadioButton(i18n("Only selected segments"), scopeBox);
+ m_convertAllSegments = new
+ QRadioButton(i18n("All segments in this track"), scopeBox);
+ onlySelectedSegments->setChecked(true);
+ }
+ else {
+ QRadioButton *onlyNewSegments = new
+ QRadioButton(i18n("Only for new segments"), scopeBox);
+ m_convertSegments = new
+ QRadioButton(i18n("Convert existing segments"), scopeBox);
+ onlyNewSegments->setChecked(true);
+ }
+
+ layout->addMultiCellWidget(title, 0, 0, 0, 1, AlignLeft);
+ layout->addWidget(catlabel, 1, 0, AlignRight);
+ layout->addWidget(m_categoryCombo, 1, 1);
+ layout->addWidget(inslabel, 2, 0, AlignRight);
+ layout->addWidget(m_instrumentCombo, 2, 1);
+ layout->addWidget(plylabel, 3, 0, AlignRight);
+ layout->addWidget(m_playerCombo, 3, 1);
+ layout->addMultiCellWidget(scopeBox, 4, 4, 0, 1, AlignLeft);
+
+ populateCategoryCombo();
+ // try to set to same category used previously
+ m_config->setGroup(GeneralOptionsConfigGroup);
+ m_categoryCombo->setCurrentItem(m_config->readNumEntry("category_combo_index", 0));
+
+ // populate the instrument combo
+ slotCategoryIndexChanged(m_categoryCombo->currentItem());
+
+ // try to set to same instrument used previously
+ m_config->setGroup(GeneralOptionsConfigGroup);
+ m_instrumentCombo->setCurrentItem(m_config->readNumEntry("instrument_combo_index", 0));
+
+ // set to same player used previously (this one can't fail, unlike the
+ // others, because the contents of this combo are static)
+ m_playerCombo->setCurrentItem(m_config->readNumEntry("player_combo_index", 0));
+
+ if (m_fromNotation){
+ m_convertAllSegments->setChecked(m_config->readBoolEntry("convert_all_segments", 0));
+ }
+ else {
+ m_convertSegments->setChecked(m_config->readBoolEntry("convert_segments", 0));
+ }
+
+
+ connect(m_categoryCombo, SIGNAL(activated(int)),
+ SLOT(slotCategoryIndexChanged(int)));
+}
+
+QString
+PresetHandlerDialog::getName()
+{
+ return m_instrumentCombo->currentText();
+}
+
+int
+PresetHandlerDialog::getClef()
+{
+ PresetElement p = m_categories[m_categoryCombo->currentItem()].
+ getPresetByIndex(m_instrumentCombo->currentItem());
+
+ return p.getClef();
+}
+
+int
+PresetHandlerDialog::getTranspose()
+{
+ PresetElement p = m_categories[m_categoryCombo->currentItem()].
+ getPresetByIndex(m_instrumentCombo->currentItem());
+
+ return p.getTranspose();
+}
+
+int
+PresetHandlerDialog::getLowRange()
+{
+ PresetElement p = m_categories[m_categoryCombo->currentItem()].
+ getPresetByIndex(m_instrumentCombo->currentItem());
+ // 0 == amateur
+ // 1 == pro
+ if (m_playerCombo->currentItem() == 0) {
+ return p.getLowAm();
+ } else {
+ return p.getLowPro();
+ }
+}
+
+int
+PresetHandlerDialog::getHighRange()
+{
+ PresetElement p = m_categories[m_categoryCombo->currentItem()].
+ getPresetByIndex(m_instrumentCombo->currentItem());
+ // 0 == amateur
+ // 1 == pro
+ if (m_playerCombo->currentItem() == 0) {
+ return p.getHighAm();
+ } else {
+ return p.getHighPro();
+ }
+}
+
+bool
+PresetHandlerDialog::getConvertAllSegments()
+{
+ if (m_fromNotation) {
+ return m_convertAllSegments && m_convertAllSegments->isChecked();
+ }
+ else {
+ return m_convertSegments && m_convertSegments->isChecked();
+ }
+}
+
+bool
+PresetHandlerDialog::getConvertOnlySelectedSegments()
+{
+ if (m_fromNotation) {
+ return m_convertAllSegments && !m_convertAllSegments->isChecked();
+ }
+ else {
+ return false;
+ }
+}
+
+void
+PresetHandlerDialog::populateCategoryCombo()
+{
+ RG_DEBUG << "PresetHandlerDialog::populateCategoryCombo()" << endl;
+
+ for (CategoriesContainer::iterator i = m_categories.begin();
+ i != m_categories.end(); ++i) {
+
+ RG_DEBUG << " adding category: " << (*i).getName() << endl;
+
+ m_categoryCombo->insertItem((*i).getName());
+ }
+}
+
+void
+PresetHandlerDialog::slotCategoryIndexChanged(int index)
+{
+ RG_DEBUG << "PresetHandlerDialog::slotCategoryIndexChanged(" << index << ")" << endl;
+
+ CategoryElement e = m_categories[index];
+ ElementContainer c = e.getPresets();
+
+ m_instrumentCombo->clear();
+
+ for (ElementContainer::iterator i = c.begin();
+ i != c.end(); ++i) {
+
+ RG_DEBUG << " adding instrument: " << (*i).getName() << endl;
+
+ m_instrumentCombo->insertItem((*i).getName());
+ }
+
+}
+
+void
+PresetHandlerDialog::slotOk()
+{
+ m_config->setGroup(GeneralOptionsConfigGroup);
+ m_config->writeEntry("category_combo_index", m_categoryCombo->currentItem());
+ m_config->writeEntry("instrument_combo_index", m_instrumentCombo->currentItem());
+ m_config->writeEntry("player_combo_index", m_playerCombo->currentItem());
+
+ if (m_fromNotation) {
+ m_config->writeEntry("convert_all_segments", m_convertAllSegments->isChecked());
+ }
+ else {
+ m_config->writeEntry("convert_segments", m_convertSegments->isChecked());
+ }
+
+ QDialog::accept();
+}
+
+}
+#include "PresetHandlerDialog.moc"
diff --git a/src/gui/general/PresetHandlerDialog.h b/src/gui/general/PresetHandlerDialog.h
new file mode 100644
index 0000000..879ddca
--- /dev/null
+++ b/src/gui/general/PresetHandlerDialog.h
@@ -0,0 +1,107 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ This file is Copyright 2006
+ D. Michael McIntyre <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_PRESETHANDLERDIALOG_H_
+#define _RG_PRESETHANDLERDIALOG_H_
+
+#include <kdialogbase.h>
+#include <qradiobutton.h>
+#include <qstring.h>
+#include "CategoryElement.h"
+
+class QWidget;
+class KConfig;
+class KComboBox;
+
+
+namespace Rosegarden
+{
+
+class PresetGroup;
+
+
+class PresetHandlerDialog : public KDialogBase
+{
+ Q_OBJECT
+
+public:
+
+ PresetHandlerDialog(QWidget* parent, bool fromNotation = false);
+ ~PresetHandlerDialog();
+
+ PresetGroup *m_presets;
+ CategoriesContainer m_categories;
+
+ KConfig *m_config;
+ bool m_fromNotation;
+
+ //-------[ accessor functions ]------------------------
+
+ QString getName();
+
+ int getClef();
+ int getTranspose();
+ int getLowRange();
+ int getHighRange();
+ bool getConvertAllSegments();
+ bool getConvertOnlySelectedSegments();
+
+protected:
+
+ //--------[ member functions ]-------------------------
+
+ // initialize the dialog
+ void initDialog();
+
+ // populate the category combo
+ void populateCategoryCombo();
+
+
+ //---------[ data members ]-----------------------------
+
+ KComboBox *m_categoryCombo;
+ KComboBox *m_instrumentCombo;
+ KComboBox *m_playerCombo;
+ QRadioButton *m_convertSegments;
+ QRadioButton *m_convertAllSegments;
+
+protected slots:
+
+ // de-populate and re-populate the Instrument combo when the category
+ // changes.
+ void slotCategoryIndexChanged(int index);
+
+ // write out settings to kconfig data for next time and call accept()
+ void slotOk();
+
+}; // PresetHandlerDialog
+
+
+}
+
+#endif
diff --git a/src/gui/general/ProgressReporter.cpp b/src/gui/general/ProgressReporter.cpp
new file mode 100644
index 0000000..0d9e896
--- /dev/null
+++ b/src/gui/general/ProgressReporter.cpp
@@ -0,0 +1,53 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "ProgressReporter.h"
+
+#include <qobject.h>
+
+
+namespace Rosegarden
+{
+
+ProgressReporter::ProgressReporter(QObject* parent, const char* name)
+ : QObject(parent, name), m_isCancelled(false)
+{}
+
+
+void ProgressReporter::throwIfCancelled()
+{
+ if (m_isCancelled) {
+ m_isCancelled = false;
+ throw Cancelled();
+ }
+}
+
+void ProgressReporter::slotCancel()
+{
+ m_isCancelled = true;
+};
+
+}
+#include "ProgressReporter.moc"
diff --git a/src/gui/general/ProgressReporter.h b/src/gui/general/ProgressReporter.h
new file mode 100644
index 0000000..d8aa306
--- /dev/null
+++ b/src/gui/general/ProgressReporter.h
@@ -0,0 +1,80 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_PROGRESSREPORTER_H_
+#define _RG_PROGRESSREPORTER_H_
+
+#include <qobject.h>
+
+
+
+
+namespace Rosegarden
+{
+
+
+
+class ProgressReporter : public QObject
+{
+ Q_OBJECT
+public:
+ ProgressReporter(QObject* parent, const char* name = 0);
+
+ // exception class for cancellations
+ class Cancelled { };
+
+protected:
+ /**
+ * Call this at appropriate times if you know Qt isn't in the stack
+ */
+ void throwIfCancelled();
+
+ /*
+ We have to use these accessors rather than throwing directly
+ from slotCancel() because Qt is generally compiled without
+ exception support, so we can't throw from a slot.
+ */
+ bool isOperationCancelled() const { return m_isCancelled; }
+// void resetOperationCancelledState() { m_isCancelled = false; }
+
+protected slots:
+ virtual void slotCancel();
+
+signals:
+ /// Report progress
+ void setProgress(int);
+ void incrementProgress(int);
+ void setOperationName(QString);
+
+protected:
+ //--------------- Data members ---------------------------------
+ bool m_isCancelled;
+};
+
+
+
+}
+
+#endif
diff --git a/src/gui/general/RosegardenCanvasView.cpp b/src/gui/general/RosegardenCanvasView.cpp
new file mode 100644
index 0000000..a829aac
--- /dev/null
+++ b/src/gui/general/RosegardenCanvasView.cpp
@@ -0,0 +1,485 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "RosegardenCanvasView.h"
+
+#include "misc/Debug.h"
+#include "gui/general/CanvasItemGC.h"
+#include <qcanvas.h>
+#include <qcursor.h>
+#include <qpoint.h>
+#include <qrect.h>
+#include <qscrollbar.h>
+#include <qsize.h>
+#include <qsizepolicy.h>
+#include <qtimer.h>
+#include <qwidget.h>
+
+
+namespace Rosegarden
+{
+
+RosegardenCanvasView::RosegardenCanvasView(QCanvas* canvas,
+ QWidget* parent,
+ const char* name, WFlags f)
+ : QCanvasView(canvas, parent, name, f),
+ m_bottomWidget(0),
+ m_currentBottomWidgetHeight( -1),
+ m_leftWidget(0),
+ m_smoothScroll(true),
+ m_smoothScrollTimeInterval(DefaultSmoothScrollTimeInterval),
+ m_minDeltaScroll(DefaultMinDeltaScroll),
+ m_autoScrollTime(InitialScrollTime),
+ m_autoScrollAccel(InitialScrollAccel),
+ m_autoScrollXMargin(0),
+ m_autoScrollYMargin(0),
+ m_currentScrollDirection(None),
+ m_scrollDirectionConstraint(NoFollow),
+ m_autoScrolling(false)
+{
+ setDragAutoScroll(true);
+ connect( &m_autoScrollTimer, SIGNAL( timeout() ),
+ this, SLOT( doAutoScroll() ) );
+}
+
+void RosegardenCanvasView::fitWidthToContents()
+{
+ QRect allItemsBoundingRect;
+
+ QCanvasItemList items = canvas()->allItems();
+
+ QCanvasItemList::Iterator it;
+
+ for (it = items.begin(); it != items.end(); ++it) {
+ allItemsBoundingRect |= (*it)->boundingRect();
+ }
+
+ QSize currentSize = canvas()->size();
+ resizeContents(allItemsBoundingRect.width(), currentSize.height());
+}
+
+void RosegardenCanvasView::setBottomFixedWidget(QWidget* w)
+{
+ m_bottomWidget = w;
+ if (m_bottomWidget) {
+ int lww = m_leftWidget ? m_leftWidget->sizeHint().width() : 0;
+ m_bottomWidget->reparent(this, 0, QPoint(0, 0));
+ m_bottomWidget->setSizePolicy(QSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed));
+ setMargins(lww, 0, 0, m_bottomWidget->sizeHint().height());
+ }
+}
+
+void RosegardenCanvasView::slotUpdate()
+{
+ CanvasItemGC::gc();
+ canvas()->update();
+}
+
+// Smooth scroll checks
+//
+
+const int RosegardenCanvasView::AutoscrollMargin = 16;
+const int RosegardenCanvasView::InitialScrollTime = 30;
+const int RosegardenCanvasView::InitialScrollAccel = 5;
+const int RosegardenCanvasView::MaxScrollDelta = 100; // max a.scroll speed
+const double RosegardenCanvasView::ScrollAccelValue = 1.04;// acceleration rate
+
+const int RosegardenCanvasView::DefaultSmoothScrollTimeInterval = 10;
+const double RosegardenCanvasView::DefaultMinDeltaScroll = 1.2;
+
+void RosegardenCanvasView::startAutoScroll()
+{
+ // RG_DEBUG << "RosegardenCanvasView::startAutoScroll()\n";
+
+ if ( !m_autoScrollTimer.isActive() ) {
+ m_autoScrollTime = InitialScrollTime;
+ m_autoScrollAccel = InitialScrollAccel;
+ m_autoScrollTimer.start( m_autoScrollTime );
+ }
+
+ QPoint autoScrollStartPoint = viewport()->mapFromGlobal( QCursor::pos() );
+ m_autoScrollYMargin = autoScrollStartPoint.y() / 10;
+ m_autoScrollXMargin = autoScrollStartPoint.x() / 10;
+
+ m_autoScrolling = true;
+}
+
+void RosegardenCanvasView::startAutoScroll(int directionConstraint)
+{
+ setScrollDirectionConstraint(directionConstraint);
+ startAutoScroll();
+}
+
+void RosegardenCanvasView::stopAutoScroll()
+{
+ // RG_DEBUG << "RosegardenCanvasView::stopAutoScroll()\n";
+
+ m_autoScrollTimer.stop();
+ m_minDeltaScroll = DefaultMinDeltaScroll;
+ m_currentScrollDirection = None;
+
+ m_autoScrolling = false;
+}
+
+void RosegardenCanvasView::doAutoScroll()
+{
+ // RG_DEBUG << "RosegardenCanvasView::doAutoScroll()\n";
+
+ QPoint p = viewport()->mapFromGlobal( QCursor::pos() );
+ QPoint dp = p - m_previousP;
+ m_previousP = p;
+
+ m_autoScrollTimer.start( m_autoScrollTime );
+ ScrollDirection scrollDirection = None;
+
+ int dx = 0, dy = 0;
+ if (m_scrollDirectionConstraint & FollowVertical) {
+ if ( p.y() < m_autoScrollYMargin ) {
+ dy = -(int(m_minDeltaScroll));
+ scrollDirection = Top;
+ } else if ( p.y() > visibleHeight() - m_autoScrollYMargin ) {
+ dy = + (int(m_minDeltaScroll));
+ scrollDirection = Bottom;
+ }
+ }
+ bool startDecelerating = false;
+ if (m_scrollDirectionConstraint & FollowHorizontal) {
+
+ // RG_DEBUG << "p.x() : " << p.x() << " - visibleWidth : " << visibleWidth() << " - autoScrollXMargin : " << m_autoScrollXMargin << endl;
+
+ if ( p.x() < m_autoScrollXMargin ) {
+ if ( dp.x() > 0 ) {
+ startDecelerating = true;
+ m_minDeltaScroll /= ScrollAccelValue;
+ }
+ dx = -(int(m_minDeltaScroll));
+ scrollDirection = Left;
+ } else if ( p.x() > visibleWidth() - m_autoScrollXMargin ) {
+ if ( dp.x() < 0 ) {
+ startDecelerating = true;
+ m_minDeltaScroll /= ScrollAccelValue;
+ }
+ dx = + (int(m_minDeltaScroll));
+ scrollDirection = Right;
+ }
+ }
+
+ // RG_DEBUG << "dx: " << dx << ", dy: " << dy << endl;
+
+ if ( (dx || dy) &&
+ ((scrollDirection == m_currentScrollDirection) || (m_currentScrollDirection == None)) ) {
+ scrollBy(dx, dy);
+ if ( startDecelerating )
+ m_minDeltaScroll /= ScrollAccelValue;
+ else
+ m_minDeltaScroll *= ScrollAccelValue;
+ if (m_minDeltaScroll > MaxScrollDelta )
+ m_minDeltaScroll = MaxScrollDelta;
+ m_currentScrollDirection = scrollDirection;
+
+ } else {
+ // Don't automatically stopAutoScroll() here, the mouse button
+ // is presumably still pressed.
+ m_minDeltaScroll = DefaultMinDeltaScroll;
+ m_currentScrollDirection = None;
+ }
+
+}
+
+bool RosegardenCanvasView::isTimeForSmoothScroll()
+{
+ if (m_smoothScroll) {
+ int ta = m_scrollAccelerationTimer.elapsed();
+ int t = m_scrollTimer.elapsed();
+
+ // RG_DEBUG << "t = " << t << ", ta = " << ta << ", int " << m_smoothScrollTimeInterval << ", delta " << m_minDeltaScroll << endl;
+
+ if (t < m_smoothScrollTimeInterval) {
+
+ return false;
+
+ } else {
+
+ if (ta > 300) {
+ // reset smoothScrollTimeInterval
+ m_smoothScrollTimeInterval = DefaultSmoothScrollTimeInterval;
+ m_minDeltaScroll = DefaultMinDeltaScroll;
+ m_scrollAccelerationTimer.restart();
+ } else if (ta > 50) {
+ // m_smoothScrollTimeInterval /= 2;
+ m_minDeltaScroll *= 1.08;
+ m_scrollAccelerationTimer.restart();
+ }
+
+ m_scrollTimer.restart();
+ return true;
+ }
+ }
+
+ return true;
+}
+
+void RosegardenCanvasView::slotScrollHoriz(int hpos)
+{
+ QScrollBar* hbar = getMainHorizontalScrollBar();
+ int currentContentYPos = contentsY();
+
+ /* Lots of performance hitting debug
+ RG_DEBUG << "RosegardenCanvasView::slotScrollHoriz: hpos is " << hpos
+ << ", contentsX is " << contentsX() << ", visibleWidth is "
+ << visibleWidth() << endl;
+ */
+
+ if (hpos == 0) {
+
+ // returning to zero
+ // hbar->setValue(0);
+ setContentsPos(0, currentContentYPos);
+
+ } else if (hpos > (contentsX() +
+ visibleWidth() * 1.6) ||
+ hpos < (contentsX() -
+ visibleWidth() * 0.7)) {
+
+ // miles off one side or the other
+ // hbar->setValue(hpos - int(visibleWidth() * 0.4));
+ setContentsPos(hpos - int(visibleWidth() * 0.4), currentContentYPos);
+
+ } else if (hpos > (contentsX() +
+ visibleWidth() * 0.9)) {
+
+ // moving off the right hand side of the view
+ // hbar->setValue(hbar->value() + int(visibleWidth() * 0.6));
+ setContentsPos(hbar->value() + int(visibleWidth() * 0.6), currentContentYPos);
+
+ } else if (hpos < (contentsX() +
+ visibleWidth() * 0.1)) {
+
+ // moving off the left
+ // hbar->setValue(hbar->value() - int(visibleWidth() * 0.6));
+ setContentsPos(hbar->value() - int(visibleWidth() * 0.6), currentContentYPos);
+ }
+}
+
+void RosegardenCanvasView::slotScrollHorizSmallSteps(int hpos)
+{
+ QScrollBar* hbar = getMainHorizontalScrollBar();
+ int currentContentYPos = contentsY();
+
+ int diff = 0;
+
+ if (hpos == 0) {
+
+ // returning to zero
+ // hbar->setValue(0);
+ setContentsPos(0, currentContentYPos);
+
+ } else if ((diff = int(hpos - (contentsX() +
+ visibleWidth() * 0.90))) > 0) {
+
+ // moving off the right hand side of the view
+
+ int delta = diff / 6;
+ int diff10 = std::min(diff, (int)m_minDeltaScroll);
+ delta = std::max(delta, diff10);
+
+ // hbar->setValue(hbar->value() + delta);
+ setContentsPos(hbar->value() + delta, currentContentYPos);
+
+ } else if ((diff = int(hpos - (contentsX() +
+ visibleWidth() * 0.10))) < 0) {
+ // moving off the left
+
+ int delta = -diff / 6;
+ int diff10 = std::min( -diff, (int)m_minDeltaScroll);
+ delta = std::max(delta, diff10);
+
+ // hbar->setValue(hbar->value() - delta);
+ setContentsPos(hbar->value() - delta, currentContentYPos);
+
+ }
+}
+
+void RosegardenCanvasView::slotScrollVertSmallSteps(int vpos)
+{
+ QScrollBar* vbar = verticalScrollBar();
+
+ // RG_DEBUG << "RosegardenCanvasView::slotScrollVertSmallSteps: vpos is " << vpos << ", contentsY is " << contentsY() << ", visibleHeight is " << visibleHeight() << endl;
+
+ // As a special case (or hack), ignore any request made before we've
+ // actually been rendered and sized
+ if (visibleHeight() <= 1)
+ return ;
+
+ int diff = 0;
+
+ if (vpos == 0) {
+
+ // returning to zero
+ vbar->setValue(0);
+
+ } else if ((diff = int(vpos - (contentsY() +
+ visibleHeight() * 0.90))) > 0) {
+
+ // moving off up
+
+ int delta = diff / 6;
+ int diff10 = std::min(diff, (int)m_minDeltaScroll);
+ delta = std::max(delta, diff10);
+
+ vbar->setValue(vbar->value() + diff);
+
+ } else if ((diff = int(vpos - (contentsY() +
+ visibleHeight() * 0.10))) < 0) {
+
+ // moving off down
+
+ int delta = -diff / 6;
+ int diff10 = std::min( -diff, (int)m_minDeltaScroll);
+ delta = std::max(delta, diff10);
+
+ vbar->setValue(vbar->value() - delta);
+
+ }
+}
+
+void RosegardenCanvasView::slotScrollVertToTop(int vpos)
+{
+ QScrollBar* vbar = verticalScrollBar();
+ if (vpos < visibleHeight() / 3)
+ vbar->setValue(0);
+ else
+ vbar->setValue(vpos - visibleHeight() / 5);
+}
+
+void RosegardenCanvasView::slotSetScrollPos(const QPoint &pos)
+{
+ getMainHorizontalScrollBar()->setValue(pos.x());
+ verticalScrollBar()->setValue(pos.y());
+}
+
+void RosegardenCanvasView::resizeEvent(QResizeEvent* e)
+{
+ QCanvasView::resizeEvent(e);
+ if (!horizontalScrollBar()->isVisible())
+ updateBottomWidgetGeometry();
+ updateLeftWidgetGeometry();
+}
+
+void RosegardenCanvasView::setHBarGeometry(QScrollBar &hbar, int x, int y, int w, int h)
+{
+ QCanvasView::setHBarGeometry(hbar, x, y, w, h);
+ updateBottomWidgetGeometry();
+}
+
+void RosegardenCanvasView::updateBottomWidgetGeometry()
+{
+ if (!m_bottomWidget)
+ return ;
+
+ int bottomWidgetHeight = m_bottomWidget->sizeHint().height();
+
+ int leftWidgetWidth = 0;
+ if (m_leftWidget && m_leftWidget->isVisible()) {
+ QScrollView * qsv = dynamic_cast<QScrollView *>(m_leftWidget);
+ leftWidgetWidth = qsv->contentsWidth()+2;
+ qsv->setFixedWidth(leftWidgetWidth);
+ }
+
+ setMargins(leftWidgetWidth, 0, 0, bottomWidgetHeight);
+
+ QRect r = frameRect();
+ int hScrollBarHeight = 0;
+ if (horizontalScrollBar()->isVisible())
+ hScrollBarHeight = horizontalScrollBar()->height() + 2;
+ // + 2 offset : needed to preserve border shadow
+
+ int vScrollBarWidth = 0;
+ if (verticalScrollBar()->isVisible())
+ vScrollBarWidth = verticalScrollBar()->width();
+
+ m_bottomWidget->setGeometry(r.x() + leftWidgetWidth,
+ r.y() + r.height() - bottomWidgetHeight - hScrollBarHeight,
+ r.width() - vScrollBarWidth - leftWidgetWidth,
+ bottomWidgetHeight);
+
+ if (bottomWidgetHeight != m_currentBottomWidgetHeight) {
+ emit bottomWidgetHeightChanged(bottomWidgetHeight);
+ m_currentBottomWidgetHeight = bottomWidgetHeight;
+ }
+}
+
+void RosegardenCanvasView::wheelEvent(QWheelEvent *e)
+{
+ if (e->state() & ControlButton) {
+ if (e->delta() > 0)
+ emit zoomIn();
+ else if (e->delta() < 0)
+ emit zoomOut();
+ return ;
+ }
+ QCanvasView::wheelEvent(e);
+}
+
+void RosegardenCanvasView::setLeftFixedWidget(QWidget* w)
+{
+ m_leftWidget = w;
+ if (m_leftWidget) {
+ int bwh = m_bottomWidget ? m_bottomWidget->sizeHint().height() : 0;
+ m_leftWidget->reparent(this, 0, QPoint(0, 0));
+ m_leftWidget->setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Preferred));
+ setMargins(m_leftWidget->sizeHint().width(), 0, 0, bwh);
+ }
+}
+
+void RosegardenCanvasView::updateLeftWidgetGeometry()
+{
+ if (!m_leftWidget)
+ return ;
+
+ int leftWidgetWidth = 0;
+ if (m_leftWidget->isVisible()) {
+ QScrollView * qsv = dynamic_cast<QScrollView *>(m_leftWidget);
+ leftWidgetWidth = qsv->contentsWidth() + 2;
+ }
+ m_leftWidget->setFixedWidth(leftWidgetWidth);
+
+ int bottomWidgetHeight = m_bottomWidget ?
+ m_bottomWidget->sizeHint().height() : 0;
+
+ setMargins(leftWidgetWidth, 0, 0, bottomWidgetHeight);
+
+ QRect r = frameRect();
+ int hScrollBarHeight = 0;
+ if (horizontalScrollBar()->isVisible())
+ hScrollBarHeight = horizontalScrollBar()->height() + 2;
+ // + 2 offset : needed to preserve border shadow
+
+ m_leftWidget->setFixedHeight(r.height() - bottomWidgetHeight - hScrollBarHeight);
+}
+
+
+}
+#include "RosegardenCanvasView.moc"
diff --git a/src/gui/general/RosegardenCanvasView.h b/src/gui/general/RosegardenCanvasView.h
new file mode 100644
index 0000000..509c1aa
--- /dev/null
+++ b/src/gui/general/RosegardenCanvasView.h
@@ -0,0 +1,197 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_ROSEGARDENCANVASVIEW_H_
+#define _RG_ROSEGARDENCANVASVIEW_H_
+
+#include <qpoint.h>
+#include <qtimer.h>
+#include <qcanvas.h>
+#include <qdatetime.h>
+#include <qwmatrix.h>
+
+class QWidget;
+class QWheelEvent;
+class QScrollBar;
+class QResizeEvent;
+
+
+namespace Rosegarden
+{
+
+/**
+ * A QCanvasView with an auxiliary horiz. scrollbar
+ * That scrollbar should be provided by the parent widget
+ * (typically an EditView). The RosegardenCanvasView keeps
+ * the auxilliary horiz. scrollbar range in sync with the
+ * one of its own scrollbar with slotUpdate().
+ */
+
+class RosegardenCanvasView : public QCanvasView
+{
+ Q_OBJECT
+public:
+ RosegardenCanvasView(QCanvas*,
+ QWidget* parent=0, const char* name=0, WFlags f=0);
+
+ /**
+ * EditTool::handleMouseMove() returns a OR-ed combination of these
+ * to indicate which direction to scroll to
+ */
+ enum {
+ NoFollow = 0x0,
+ FollowHorizontal = 0x1,
+ FollowVertical = 0x2
+ };
+
+ /**
+ * Sets the canvas width to be exactly the width needed to show
+ * all the items
+ */
+ void fitWidthToContents();
+
+ /**
+ * Sets the widget which will be between the scrollable part of the view
+ * and the horizontal scrollbar
+ */
+ void setBottomFixedWidget(QWidget*);
+
+ void updateBottomWidgetGeometry();
+
+ /**
+ * Sets the widget which will be between the scrollable part of the view
+ * and the left edge of the view.
+ */
+ void setLeftFixedWidget(QWidget*);
+
+ void updateLeftWidgetGeometry();
+
+ /// Map a point with the inverse world matrix
+ QPoint inverseMapPoint(const QPoint& p) { return inverseWorldMatrix().map(p); }
+
+ void setSmoothScroll(bool s) { m_smoothScroll = s; }
+
+ bool isTimeForSmoothScroll();
+
+ void setScrollDirectionConstraint(int d) { m_scrollDirectionConstraint = d; }
+
+ bool isAutoScrolling() const { return m_autoScrolling; }
+
+ virtual void wheelEvent(QWheelEvent *);
+
+public slots:
+ /// Update the RosegardenCanvasView after a change of content
+ virtual void slotUpdate();
+
+ /**
+ * Scroll horizontally to make the given position visible,
+ * paging to as to get some visibility of the next screenful
+ * (for playback etc)
+ */
+ void slotScrollHoriz(int hpos);
+
+ /**
+ * Scroll horizontally to make the given position somewhat
+ * nearer to visible, scrolling by only "a small distance"
+ * at a time
+ */
+ void slotScrollHorizSmallSteps(int hpos);
+
+ /**
+ * Scroll vertically to make the given position somewhat
+ * nearer to visible, scrolling by only "a small distance"
+ * at a time
+ */
+ void slotScrollVertSmallSteps(int vpos);
+
+ /**
+ * Scroll vertically so as to place the given position
+ * somewhere near the top of the viewport.
+ */
+ void slotScrollVertToTop(int vpos);
+
+ /**
+ * Set the x and y scrollbars to a particular position
+ */
+ void slotSetScrollPos(const QPoint &);
+
+ void startAutoScroll();
+ void startAutoScroll(int directionConstraint);
+ void stopAutoScroll();
+ void doAutoScroll();
+
+signals:
+ void bottomWidgetHeightChanged(int);
+
+ void zoomIn();
+ void zoomOut();
+
+protected:
+
+ virtual void resizeEvent(QResizeEvent*);
+ virtual void setHBarGeometry(QScrollBar &hbar, int x, int y, int w, int h);
+
+ virtual QScrollBar* getMainHorizontalScrollBar() { return horizontalScrollBar(); }
+
+ //--------------- Data members ---------------------------------
+ enum ScrollDirection { None, Top, Bottom, Left, Right };
+
+
+ QWidget* m_bottomWidget;
+ int m_currentBottomWidgetHeight;
+
+ QWidget* m_leftWidget;
+
+ bool m_smoothScroll;
+ int m_smoothScrollTimeInterval;
+ float m_minDeltaScroll;
+ QTime m_scrollTimer;
+ QTime m_scrollAccelerationTimer;
+
+ QTimer m_autoScrollTimer;
+ int m_autoScrollTime;
+ int m_autoScrollAccel;
+ QPoint m_previousP;
+ int m_autoScrollXMargin;
+ int m_autoScrollYMargin;
+ ScrollDirection m_currentScrollDirection;
+ int m_scrollDirectionConstraint;
+ bool m_autoScrolling;
+
+ static const int DefaultSmoothScrollTimeInterval;
+ static const double DefaultMinDeltaScroll;
+
+ static const int AutoscrollMargin;
+ static const int InitialScrollTime;
+ static const int InitialScrollAccel;
+ static const int MaxScrollDelta;
+ static const double ScrollAccelValue;
+
+};
+
+
+}
+
+#endif
diff --git a/src/gui/general/RosegardenScrollView.cpp b/src/gui/general/RosegardenScrollView.cpp
new file mode 100644
index 0000000..fbcaf79
--- /dev/null
+++ b/src/gui/general/RosegardenScrollView.cpp
@@ -0,0 +1,416 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "RosegardenScrollView.h"
+
+#include "misc/Debug.h"
+#include <qapplication.h>
+#include <qcursor.h>
+#include <qpoint.h>
+#include <qrect.h>
+#include <qscrollbar.h>
+#include <qscrollview.h>
+#include <qsizepolicy.h>
+#include <qtimer.h>
+#include <qwidget.h>
+
+
+namespace Rosegarden
+{
+
+// Smooth scroll checks
+//
+
+const int RosegardenScrollView::AutoscrollMargin = 16;
+const int RosegardenScrollView::InitialScrollTime = 30;
+const int RosegardenScrollView::InitialScrollAccel = 5;
+const int RosegardenScrollView::MaxScrollDelta = 100; // max a.scroll speed
+const double RosegardenScrollView::ScrollAccelValue = 1.04;// acceleration rate
+
+RosegardenScrollView::RosegardenScrollView(QWidget* parent,
+ const char* name, WFlags f)
+ : QScrollView(parent, name, f),
+ m_bottomWidget(0),
+ m_currentBottomWidgetHeight( -1),
+ m_smoothScroll(true),
+ m_smoothScrollTimeInterval(DefaultSmoothScrollTimeInterval),
+ m_minDeltaScroll(DefaultMinDeltaScroll),
+ m_autoScrollTime(InitialScrollTime),
+ m_autoScrollAccel(InitialScrollAccel),
+ m_autoScrollXMargin(0),
+ m_autoScrollYMargin(0),
+ m_currentScrollDirection(None),
+ m_scrollDirectionConstraint(NoFollow),
+ m_autoScrolling(false)
+{
+ setDragAutoScroll(true);
+ connect( &m_autoScrollTimer, SIGNAL( timeout() ),
+ this, SLOT( doAutoScroll() ) );
+}
+
+void RosegardenScrollView::setBottomFixedWidget(QWidget* w)
+{
+ m_bottomWidget = w;
+ if (m_bottomWidget) {
+ m_bottomWidget->reparent(this, 0, QPoint(0, 0));
+ m_bottomWidget->setSizePolicy(QSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed));
+ setMargins(0, 0, 0, m_bottomWidget->sizeHint().height());
+ }
+}
+
+void RosegardenScrollView::startAutoScroll()
+{
+ // RG_DEBUG << "RosegardenScrollView::startAutoScroll()\n";
+
+ if ( !m_autoScrollTimer.isActive() ) {
+ m_autoScrollTime = InitialScrollTime;
+ m_autoScrollAccel = InitialScrollAccel;
+ m_autoScrollTimer.start( m_autoScrollTime );
+ }
+
+ QPoint autoScrollStartPoint = viewport()->mapFromGlobal( QCursor::pos() );
+ m_autoScrollYMargin = autoScrollStartPoint.y() / 10;
+ m_autoScrollXMargin = autoScrollStartPoint.x() / 10;
+
+ m_autoScrolling = true;
+}
+
+void RosegardenScrollView::startAutoScroll(int directionConstraint)
+{
+ setScrollDirectionConstraint(directionConstraint);
+ startAutoScroll();
+}
+
+void RosegardenScrollView::stopAutoScroll()
+{
+ // RG_DEBUG << "RosegardenScrollView::stopAutoScroll()\n";
+
+ m_autoScrollTimer.stop();
+ m_minDeltaScroll = DefaultMinDeltaScroll;
+ m_currentScrollDirection = None;
+
+ m_autoScrolling = false;
+}
+
+void RosegardenScrollView::doAutoScroll()
+{
+ // RG_DEBUG << "RosegardenScrollView::doAutoScroll()\n";
+
+ QPoint p = viewport()->mapFromGlobal( QCursor::pos() );
+ QPoint dp = p - m_previousP;
+ m_previousP = p;
+
+ m_autoScrollTimer.start( m_autoScrollTime );
+ ScrollDirection scrollDirection = None;
+
+ int dx = 0, dy = 0;
+ if (m_scrollDirectionConstraint & FollowVertical) {
+ if ( p.y() < m_autoScrollYMargin ) {
+ dy = -(int(m_minDeltaScroll));
+ scrollDirection = Top;
+ } else if ( p.y() > visibleHeight() - m_autoScrollYMargin ) {
+ dy = + (int(m_minDeltaScroll));
+ scrollDirection = Bottom;
+ }
+ }
+ bool startDecelerating = false;
+ if (m_scrollDirectionConstraint & FollowHorizontal) {
+
+ // RG_DEBUG << "p.x() : " << p.x() << " - visibleWidth : " << visibleWidth() << " - autoScrollXMargin : " << m_autoScrollXMargin << endl;
+
+ if ( p.x() < m_autoScrollXMargin ) {
+ if ( dp.x() > 0 ) {
+ startDecelerating = true;
+ m_minDeltaScroll /= ScrollAccelValue;
+ }
+ dx = -(int(m_minDeltaScroll));
+ scrollDirection = Left;
+ } else if ( p.x() > visibleWidth() - m_autoScrollXMargin ) {
+ if ( dp.x() < 0 ) {
+ startDecelerating = true;
+ m_minDeltaScroll /= ScrollAccelValue;
+ }
+ dx = + (int(m_minDeltaScroll));
+ scrollDirection = Right;
+ }
+ }
+
+ // RG_DEBUG << "dx: " << dx << ", dy: " << dy << endl;
+
+ if ( (dx || dy) &&
+ ((scrollDirection == m_currentScrollDirection) || (m_currentScrollDirection == None)) ) {
+ scrollBy(dx, dy);
+ if ( startDecelerating )
+ m_minDeltaScroll /= ScrollAccelValue;
+ else
+ m_minDeltaScroll *= ScrollAccelValue;
+ if (m_minDeltaScroll > MaxScrollDelta )
+ m_minDeltaScroll = MaxScrollDelta;
+ m_currentScrollDirection = scrollDirection;
+
+ } else {
+ // Don't automatically stopAutoScroll() here, the mouse button
+ // is presumably still pressed.
+ m_minDeltaScroll = DefaultMinDeltaScroll;
+ m_currentScrollDirection = None;
+ }
+
+}
+
+const int RosegardenScrollView::DefaultSmoothScrollTimeInterval = 10;
+const double RosegardenScrollView::DefaultMinDeltaScroll = 1.2;
+
+bool RosegardenScrollView::isTimeForSmoothScroll()
+{
+ static int desktopWidth = QApplication::desktop()->width(),
+ desktopHeight = QApplication::desktop()->height();
+
+ if (m_smoothScroll) {
+ int ta = m_scrollAccelerationTimer.elapsed();
+ int t = m_scrollTimer.elapsed();
+
+ RG_DEBUG << "t = " << t << ", ta = " << ta << ", int " << m_smoothScrollTimeInterval << ", delta " << m_minDeltaScroll << endl;
+
+ if (t < m_smoothScrollTimeInterval) {
+
+ return false;
+
+ } else {
+
+ if (ta > 300) {
+ // reset smoothScrollTimeInterval
+ m_smoothScrollTimeInterval = DefaultSmoothScrollTimeInterval;
+ m_minDeltaScroll = DefaultMinDeltaScroll;
+ m_scrollAccelerationTimer.restart();
+ } else if (ta > 50) {
+ // m_smoothScrollTimeInterval /= 2;
+ m_minDeltaScroll *= 1.08;
+ m_scrollAccelerationTimer.restart();
+ }
+
+ m_scrollTimer.restart();
+ return true;
+ }
+ }
+
+ return true;
+}
+
+void RosegardenScrollView::slotScrollHoriz(int hpos)
+{
+ QScrollBar* hbar = getMainHorizontalScrollBar();
+ int currentContentYPos = contentsY();
+
+ /* Lots of performance hitting debug
+ RG_DEBUG << "RosegardenCanvasView::slotScrollHoriz: hpos is " << hpos
+ << ", contentsX is " << contentsX() << ", visibleWidth is "
+ << visibleWidth() << endl;
+ */
+
+ if (hpos == 0) {
+
+ // returning to zero
+ // hbar->setValue(0);
+ setContentsPos(0, currentContentYPos);
+
+ } else if (hpos > (contentsX() +
+ visibleWidth() * 1.6) ||
+ hpos < (contentsX() -
+ visibleWidth() * 0.7)) {
+
+ // miles off one side or the other
+ // hbar->setValue(hpos - int(visibleWidth() * 0.4));
+ setContentsPos(hpos - int(visibleWidth() * 0.4), currentContentYPos);
+
+ } else if (hpos > (contentsX() +
+ visibleWidth() * 0.9)) {
+
+ // moving off the right hand side of the view
+ // hbar->setValue(hbar->value() + int(visibleWidth() * 0.6));
+ setContentsPos(hbar->value() + int(visibleWidth() * 0.6), currentContentYPos);
+
+ } else if (hpos < (contentsX() +
+ visibleWidth() * 0.1)) {
+
+ // moving off the left
+ // hbar->setValue(hbar->value() - int(visibleWidth() * 0.6));
+ setContentsPos(hbar->value() - int(visibleWidth() * 0.6), currentContentYPos);
+ }
+}
+
+void RosegardenScrollView::slotScrollHorizSmallSteps(int hpos)
+{
+ QScrollBar* hbar = getMainHorizontalScrollBar();
+ int currentContentYPos = contentsY();
+
+ int diff = 0;
+
+ if (hpos == 0) {
+
+ // returning to zero
+ // hbar->setValue(0);
+ setContentsPos(0, currentContentYPos);
+
+ } else if ((diff = int(hpos - (contentsX() +
+ visibleWidth() * 0.90))) > 0) {
+
+ // moving off the right hand side of the view
+
+ int delta = diff / 6;
+ int diff10 = std::min(diff, (int)m_minDeltaScroll);
+ delta = std::max(delta, diff10);
+
+ // hbar->setValue(hbar->value() + delta);
+ setContentsPos(hbar->value() + delta, currentContentYPos);
+
+ } else if ((diff = int(hpos - (contentsX() +
+ visibleWidth() * 0.10))) < 0) {
+ // moving off the left
+
+ int delta = -diff / 6;
+ int diff10 = std::min( -diff, (int)m_minDeltaScroll);
+ delta = std::max(delta, diff10);
+
+ // hbar->setValue(hbar->value() - delta);
+ setContentsPos(hbar->value() - delta, currentContentYPos);
+
+ }
+}
+
+void RosegardenScrollView::slotScrollVertSmallSteps(int vpos)
+{
+ QScrollBar* vbar = verticalScrollBar();
+
+ // RG_DEBUG << "RosegardenCanvasView::slotScrollVertSmallSteps: vpos is " << vpos << ", contentsY is " << contentsY() << ", visibleHeight is " << visibleHeight() << endl;
+
+ // As a special case (or hack), ignore any request made before we've
+ // actually been rendered and sized
+ if (visibleHeight() <= 1)
+ return ;
+
+ int diff = 0;
+
+ if (vpos == 0) {
+
+ // returning to zero
+ vbar->setValue(0);
+
+ } else if ((diff = int(vpos - (contentsY() +
+ visibleHeight() * 0.90))) > 0) {
+
+ // moving off up
+
+ int delta = diff / 6;
+ int diff10 = std::min(diff, (int)m_minDeltaScroll);
+ delta = std::max(delta, diff10);
+
+ vbar->setValue(vbar->value() + diff);
+
+ } else if ((diff = int(vpos - (contentsY() +
+ visibleHeight() * 0.10))) < 0) {
+
+ // moving off down
+
+ int delta = -diff / 6;
+ int diff10 = std::min( -diff, (int)m_minDeltaScroll);
+ delta = std::max(delta, diff10);
+
+ vbar->setValue(vbar->value() - delta);
+
+ }
+}
+
+void RosegardenScrollView::slotScrollVertToTop(int vpos)
+{
+ QScrollBar* vbar = verticalScrollBar();
+ if (vpos < visibleHeight() / 3)
+ vbar->setValue(0);
+ else
+ vbar->setValue(vpos - visibleHeight() / 5);
+}
+
+void RosegardenScrollView::slotSetScrollPos(const QPoint &pos)
+{
+ horizontalScrollBar()->setValue(pos.x());
+ verticalScrollBar()->setValue(pos.y());
+}
+
+void RosegardenScrollView::resizeEvent(QResizeEvent* e)
+{
+ QScrollView::resizeEvent(e);
+ if (!horizontalScrollBar()->isVisible())
+ updateBottomWidgetGeometry();
+
+}
+
+void RosegardenScrollView::setHBarGeometry(QScrollBar &hbar, int x, int y, int w, int h)
+{
+ QScrollView::setHBarGeometry(hbar, x, y, w, h);
+ updateBottomWidgetGeometry();
+}
+
+void RosegardenScrollView::updateBottomWidgetGeometry()
+{
+ if (!m_bottomWidget)
+ return ;
+
+ int bottomWidgetHeight = m_bottomWidget->sizeHint().height();
+
+ setMargins(0, 0, 0, bottomWidgetHeight);
+ QRect r = frameRect();
+ int hScrollBarHeight = 0;
+ if (horizontalScrollBar()->isVisible())
+ hScrollBarHeight = horizontalScrollBar()->height() + 2; // + 2 offset needed to preserve border shadow
+
+ int vScrollBarWidth = 0;
+ if (verticalScrollBar()->isVisible())
+ vScrollBarWidth = verticalScrollBar()->width();
+
+ m_bottomWidget->setGeometry(r.x(),
+ r.y() + r.height() - bottomWidgetHeight - hScrollBarHeight,
+ r.width() - vScrollBarWidth,
+ bottomWidgetHeight);
+
+ if (bottomWidgetHeight != m_currentBottomWidgetHeight) {
+ emit bottomWidgetHeightChanged(bottomWidgetHeight);
+ m_currentBottomWidgetHeight = bottomWidgetHeight;
+ }
+
+}
+
+void RosegardenScrollView::wheelEvent(QWheelEvent *e)
+{
+ if (e->state() & ControlButton) {
+ if (e->delta() > 0)
+ emit zoomIn();
+ else if (e->delta() < 0)
+ emit zoomOut();
+ return ;
+ }
+ QScrollView::wheelEvent(e);
+}
+
+}
+#include "RosegardenScrollView.moc"
diff --git a/src/gui/general/RosegardenScrollView.h b/src/gui/general/RosegardenScrollView.h
new file mode 100644
index 0000000..6a0dab7
--- /dev/null
+++ b/src/gui/general/RosegardenScrollView.h
@@ -0,0 +1,183 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_ROSEGARDENSCROLLVIEW_H_
+#define _RG_ROSEGARDENSCROLLVIEW_H_
+
+#include <qpoint.h>
+#include <qscrollview.h>
+#include <qdatetime.h>
+#include <qtimer.h>
+
+
+class QWidget;
+class QWheelEvent;
+class QScrollBar;
+class QResizeEvent;
+
+
+namespace Rosegarden
+{
+
+
+
+/**
+ * A QScrollView with more elaborate auto-scrolling capabilities
+ * and the ability to have a "fixed" (non-scrolling) widget at its bottom,
+ * just above the bottom scrollbar.
+ */
+class RosegardenScrollView : public QScrollView
+{
+ Q_OBJECT
+public:
+ RosegardenScrollView(QWidget* parent=0, const char* name=0, WFlags f=0);
+
+ /**
+ * EditTool::handleMouseMove() returns a OR-ed combination of these
+ * to indicate which direction to scroll to
+ */
+ enum {
+ NoFollow = 0x0,
+ FollowHorizontal = 0x1,
+ FollowVertical = 0x2
+ };
+
+ /**
+ * Sets the canvas width to be exactly the width needed to show
+ * all the items
+ */
+// void fitWidthToContents();
+
+ /**
+ * Sets the widget which will be between the scrollable part of the view
+ * and the horizontal scrollbar
+ */
+ void setBottomFixedWidget(QWidget*);
+
+ void updateBottomWidgetGeometry();
+
+ /// Map a point with the inverse world matrix
+// QPoint inverseMapPoint(const QPoint& p) { return inverseWorldMatrix().map(p); }
+
+ void setSmoothScroll(bool s) { m_smoothScroll = s; }
+
+ bool isTimeForSmoothScroll();
+
+ void setScrollDirectionConstraint(int d) { m_scrollDirectionConstraint = d; }
+
+ int getDeltaScroll() { return m_minDeltaScroll; }
+
+ virtual void wheelEvent(QWheelEvent *);
+
+public slots:
+ /**
+ * Scroll horizontally to make the given position visible,
+ * paging to as to get some visibility of the next screenful
+ * (for playback etc)
+ */
+ void slotScrollHoriz(int hpos);
+
+ /**
+ * Scroll horizontally to make the given position somewhat
+ * nearer to visible, scrolling by only "a small distance"
+ * at a time
+ */
+ void slotScrollHorizSmallSteps(int hpos);
+
+ /**
+ * Scroll vertically to make the given position somewhat
+ * nearer to visible, scrolling by only "a small distance"
+ * at a time
+ */
+ void slotScrollVertSmallSteps(int vpos);
+
+ /**
+ * Scroll vertically so as to place the given position
+ * somewhere near the top of the viewport.
+ */
+ void slotScrollVertToTop(int vpos);
+
+ /**
+ * Set the x and y scrollbars to a particular position
+ */
+ void slotSetScrollPos(const QPoint &);
+
+ void startAutoScroll();
+ void startAutoScroll(int directionConstraint);
+ void stopAutoScroll();
+ void doAutoScroll();
+
+ bool isAutoScrolling() const { return m_autoScrolling; }
+
+signals:
+ void bottomWidgetHeightChanged(int);
+
+ void zoomIn();
+ void zoomOut();
+
+protected:
+
+ virtual void resizeEvent(QResizeEvent*);
+ virtual void setHBarGeometry(QScrollBar &hbar, int x, int y, int w, int h);
+
+ virtual QScrollBar* getMainHorizontalScrollBar() { return horizontalScrollBar(); }
+
+ //--------------- Data members ---------------------------------
+ enum ScrollDirection { None, Top, Bottom, Left, Right };
+
+ QWidget* m_bottomWidget;
+ int m_currentBottomWidgetHeight;
+
+ bool m_smoothScroll;
+ int m_smoothScrollTimeInterval;
+ float m_minDeltaScroll;
+ QTime m_scrollTimer;
+ QTime m_scrollAccelerationTimer;
+
+ QTimer m_autoScrollTimer;
+ int m_autoScrollTime;
+ int m_autoScrollAccel;
+ QPoint m_previousP;
+ int m_autoScrollXMargin;
+ int m_autoScrollYMargin;
+ ScrollDirection m_currentScrollDirection;
+ int m_scrollDirectionConstraint;
+ bool m_autoScrolling;
+
+ static const int DefaultSmoothScrollTimeInterval;
+ static const double DefaultMinDeltaScroll;
+
+ static const int AutoscrollMargin;
+ static const int InitialScrollTime;
+ static const int InitialScrollAccel;
+ static const int MaxScrollDelta;
+ static const double ScrollAccelValue;
+
+};
+
+
+}
+
+#endif
diff --git a/src/gui/general/Spline.cpp b/src/gui/general/Spline.cpp
new file mode 100644
index 0000000..455cca5
--- /dev/null
+++ b/src/gui/general/Spline.cpp
@@ -0,0 +1,130 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "Spline.h"
+
+#include <qpoint.h>
+
+
+namespace Rosegarden
+{
+
+Spline::PointList *
+
+Spline::calculate(const QPoint &s, const QPoint &f, const PointList &cp,
+ QPoint &topLeft, QPoint &bottomRight)
+{
+ if (cp.size() < 2)
+ return 0;
+
+ int i;
+ PointList *acc = new PointList();
+ QPoint p(s);
+
+ topLeft = bottomRight = QPoint(0, 0);
+
+ for (i = 1; i < cp.size(); ++i) {
+
+ QPoint c(cp[i - 1]);
+
+ int x = (c.x() + cp[i].x()) / 2;
+ int y = (c.y() + cp[i].y()) / 2;
+ QPoint n(x, y);
+
+ calculateSegment(acc, p, n, c, topLeft, bottomRight);
+
+ p = n;
+ }
+
+ calculateSegment(acc, p, f, cp[i - 1], topLeft, bottomRight);
+
+ return acc;
+}
+
+void
+Spline::calculateSegment(PointList *acc,
+ const QPoint &s, const QPoint &f, const QPoint &c,
+ QPoint &topLeft, QPoint &bottomRight)
+{
+ int x, y, n;
+
+ x = c.x() - s.x();
+ y = c.y() - s.y();
+
+ if (x < 0)
+ x = -x;
+ if (y < 0)
+ y = -y;
+ if (x > y)
+ n = x;
+ else
+ n = y;
+
+ x = f.x() - c.x();
+ y = f.y() - c.y();
+
+ if (x < 0)
+ x = -x;
+ if (y < 0)
+ y = -y;
+ if (x > y)
+ n += x;
+ else
+ n += y;
+
+ calculateSegmentSub(acc, s, f, c, n, topLeft, bottomRight);
+}
+
+void
+Spline::calculateSegmentSub(PointList *acc,
+ const QPoint &s, const QPoint &f, const QPoint &c,
+ int n, QPoint &topLeft, QPoint &bottomRight)
+{
+ double ax = (double)(f.x() + s.x() - 2 * c.x()) / (double)n;
+ double ay = (double)(f.y() + s.y() - 2 * c.y()) / (double)n;
+
+ double bx = 2.0 * (double)(c.x() - s.x());
+ double by = 2.0 * (double)(c.y() - s.y());
+
+ for (int m = 0; m <= n; ++m) {
+
+ int x = s.x() + (int)((m * ((double)m * ax + bx)) / n);
+ int y = s.y() + (int)((m * ((double)m * ay + by)) / n);
+
+ if (x < topLeft.x())
+ topLeft.setX(x);
+ if (y < topLeft.y())
+ topLeft.setY(y);
+
+ if (x > bottomRight.x())
+ bottomRight.setX(x);
+ if (y > bottomRight.y())
+ bottomRight.setY(y);
+
+ acc->push_back(QPoint(x, y));
+ }
+}
+
+}
diff --git a/src/gui/general/Spline.h b/src/gui/general/Spline.h
new file mode 100644
index 0000000..63946a5
--- /dev/null
+++ b/src/gui/general/Spline.h
@@ -0,0 +1,71 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_SPLINE_H_
+#define _RG_SPLINE_H_
+
+#include "base/FastVector.h"
+
+
+class QPoint;
+class PointList;
+
+
+namespace Rosegarden
+{
+
+
+
+class Spline
+{
+public:
+ typedef FastVector<QPoint> PointList;
+
+ /**
+ * Calculate a set of polyline points to approximate
+ * a Bezier spline. Caller takes ownership of returned
+ * heap-allocated container.
+ */
+ static PointList *calculate(const QPoint &start, const QPoint &finish,
+ const PointList &controlPoints,
+ QPoint &topLeft, QPoint &bottomRight);
+
+private:
+ static void calculateSegment
+ (PointList *acc,
+ const QPoint &start, const QPoint &finish, const QPoint &control,
+ QPoint &topLeft, QPoint &bottomRight);
+
+ static void calculateSegmentSub
+ (PointList *acc,
+ const QPoint &start, const QPoint &finish, const QPoint &control, int n,
+ QPoint &topLeft, QPoint &bottomRight);
+};
+
+
+
+}
+
+#endif
diff --git a/src/gui/general/StaffLine.cpp b/src/gui/general/StaffLine.cpp
new file mode 100644
index 0000000..ab5d5ff
--- /dev/null
+++ b/src/gui/general/StaffLine.cpp
@@ -0,0 +1,64 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "StaffLine.h"
+
+#include "misc/Debug.h"
+#include <qcanvas.h>
+#include <qpen.h>
+
+
+namespace Rosegarden
+{
+
+StaffLine::StaffLine(QCanvas *c, QCanvasItemGroup *g, int height) :
+ QCanvasLineGroupable(c, g),
+ m_height(height),
+ m_significant(true)
+{
+ setZ(1);
+}
+
+void
+StaffLine::setHighlighted(bool highlighted)
+{
+ // RG_DEBUG << "StaffLine::setHighlighted("
+ // << highlighted << ")\n";
+
+ if (highlighted) {
+
+ m_normalPen = pen();
+ QPen newPen = m_normalPen;
+ newPen.setColor(red);
+ setPen(newPen);
+
+ } else {
+
+ setPen(m_normalPen);
+
+ }
+}
+
+}
diff --git a/src/gui/general/StaffLine.h b/src/gui/general/StaffLine.h
new file mode 100644
index 0000000..7d01ff4
--- /dev/null
+++ b/src/gui/general/StaffLine.h
@@ -0,0 +1,78 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_STAFFLINE_H_
+#define _RG_STAFFLINE_H_
+
+#include "gui/kdeext/QCanvasGroupableItem.h"
+#include <qpen.h>
+
+
+class QCanvasItemGroup;
+class QCanvas;
+
+
+namespace Rosegarden
+{
+
+
+
+/**
+ * A staff line
+ *
+ * A groupable line which can be "highlighted"
+ * (drawn with a different color)
+ */
+class StaffLine : public QCanvasLineGroupable
+{
+public:
+ StaffLine(QCanvas *c, QCanvasItemGroup *g, int height);
+
+ enum { NoHeight = -150 };
+
+ void setHeight(int h) { m_height = h; }
+ int getHeight() const { return m_height; }
+
+ void setSignificant(bool s) { m_significant = s; }
+ bool isSignificant() const { return m_significant; }
+
+ /**
+ * "highlight" the line (set its pen to red)
+ */
+ void setHighlighted(bool);
+
+protected:
+ //--------------- Data members ---------------------------------
+
+ int m_height;
+ bool m_significant;
+
+ QPen m_normalPen;
+};
+
+
+}
+
+#endif
diff --git a/src/gui/kdeext/KLedButton.cpp b/src/gui/kdeext/KLedButton.cpp
new file mode 100644
index 0000000..f4e2a95
--- /dev/null
+++ b/src/gui/kdeext/KLedButton.cpp
@@ -0,0 +1,60 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ This file taken from KMix
+ Copyright (C) 2000 Stefan Schimanski <[email protected]>.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "KLedButton.h"
+
+#include <kled.h>
+#include <qcolor.h>
+#include <qwidget.h>
+
+
+namespace Rosegarden
+{
+
+KLedButton::KLedButton(const QColor &col, QWidget *parent, const char *name)
+ : KLed( col, parent, name )
+{}
+
+KLedButton::KLedButton(const QColor& col, KLed::State st, KLed::Look look,
+ KLed::Shape shape, QWidget *parent, const char *name)
+ : KLed( col, st, look, shape, parent, name )
+{}
+
+KLedButton::~KLedButton()
+{}
+
+void KLedButton::mousePressEvent( QMouseEvent *e )
+{
+ if (e->button() == LeftButton) {
+ toggle();
+ emit stateChanged( state() );
+ }
+}
+
+}
+#include "KLedButton.moc"
diff --git a/src/gui/kdeext/KLedButton.h b/src/gui/kdeext/KLedButton.h
new file mode 100644
index 0000000..e17ecdb
--- /dev/null
+++ b/src/gui/kdeext/KLedButton.h
@@ -0,0 +1,76 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ This file taken from KMix
+ Copyright (C) 2000 Stefan Schimanski <[email protected]>.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_KLEDBUTTON_H_
+#define _RG_KLEDBUTTON_H_
+
+#include <kled.h>
+
+
+class QWidget;
+class QMouseEvent;
+class QColor;
+
+
+namespace Rosegarden
+{
+
+
+
+/**
+ * @author Stefan Schimanski
+ * Taken from KMix code,
+ * Copyright (C) 2000 Stefan Schimanski <[email protected]>
+ */
+class KLedButton : public KLed {
+ Q_OBJECT
+ public:
+ KLedButton(const QColor &col=Qt::green, QWidget *parent=0, const char *name=0);
+ KLedButton(const QColor& col, KLed::State st, KLed::Look look, KLed::Shape shape,
+ QWidget *parent=0, const char *name=0);
+ ~KLedButton();
+
+ signals:
+ void stateChanged( bool newState );
+
+ protected:
+ void mousePressEvent ( QMouseEvent *e );
+};
+
+
+// This class creates a list of mute and record buttons
+// based on the rosegarden document and a specialisation
+// of the Vertical Box widget.
+//
+//
+//
+
+
+}
+
+#endif
diff --git a/src/gui/kdeext/KStartupLogo.cpp b/src/gui/kdeext/KStartupLogo.cpp
new file mode 100644
index 0000000..9a04d8f
--- /dev/null
+++ b/src/gui/kdeext/KStartupLogo.cpp
@@ -0,0 +1,159 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ This file contains code borrowed from KDevelop 2.0
+ Copyright (c) The KDevelop Development Team.
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include <unistd.h>
+#include <kapplication.h>
+
+#include <qpainter.h>
+#include <qfontmetrics.h>
+
+#include <kapp.h>
+#include <kstddirs.h>
+#include <kconfig.h>
+#include <ktip.h>
+
+#include "KStartupLogo.h"
+#include "misc/Debug.h"
+
+KStartupLogo::KStartupLogo(QWidget * parent, const char *name)
+ : QWidget(parent, name,
+ WStyle_Customize |
+#if QT_VERSION >= 0x030100
+ WStyle_Splash
+#else
+ WStyle_NoBorder | WStyle_StaysOnTop | WStyle_Tool | WX11BypassWM | WWinOwnDC
+#endif
+ ),
+ m_readyToHide(false),
+ m_showTip(true)
+{
+ QString pixmapFile = locate("appdata", "pixmaps/splash.png");
+ if (!pixmapFile)
+ return ;
+ m_pixmap.load(pixmapFile);
+ setBackgroundPixmap(m_pixmap);
+ setGeometry(QApplication::desktop()->width() / 2 - m_pixmap.width() / 2,
+ QApplication::desktop()->height() / 2 - m_pixmap.height() / 2,
+ m_pixmap.width(), m_pixmap.height());
+}
+
+KStartupLogo::~KStartupLogo()
+{
+ m_wasClosed = true;
+ m_instance = 0;
+}
+
+void KStartupLogo::paintEvent(QPaintEvent*)
+{
+ // Print version number
+ QPainter paint(this);
+
+ QFont defaultFont;
+ defaultFont.setPixelSize(12);
+ paint.setFont(defaultFont);
+
+ QFontMetrics metrics(defaultFont);
+ int width = metrics.width(m_statusMessage) + 6;
+ if (width > 200)
+ width = 200;
+
+ int y = m_pixmap.height() - 12;
+
+ // grep me: splash color
+ // QColor bg(49, 94, 19); // color for 2006 splash
+ QColor bg(19, 19, 19); // color for the 2008 splash
+ paint.setPen(bg);
+ paint.setBrush(bg);
+ paint.drawRect(QRect(m_pixmap.width() - 220, m_pixmap.height() - 43,
+ 220, (y + 8) - (m_pixmap.height() - 43)));
+
+ // paint.setPen(Qt::black);
+ // paint.setBrush(Qt::black);
+ paint.setPen(Qt::white);
+ paint.setBrush(Qt::white);
+
+ //QString version(VERSION);
+ //int sepIdx = version.find("-");
+ QString versionLabel(VERSION);
+ //QString("R%1 v%2").arg(version.left(sepIdx)).arg(version.mid(sepIdx + 1));
+ int versionWidth = metrics.width(versionLabel);
+
+ paint.drawText(m_pixmap.width() - versionWidth - 18,
+ m_pixmap.height() - 28,
+ versionLabel);
+
+ paint.drawText(m_pixmap.width() - (width + 10), y, m_statusMessage);
+}
+
+void KStartupLogo::slotShowStatusMessage(QString message)
+{
+ m_statusMessage = message;
+ paintEvent(0);
+ QApplication::flushX();
+}
+
+void KStartupLogo::close()
+{
+ if (!m_wasClosed && isVisible()) {
+
+ if (m_showTip) {
+ RG_DEBUG << "KStartupLogo::close: Showing Tips\n";
+ KTipDialog::showTip(locate("data", "rosegarden/tips"));
+ }
+ }
+
+ QWidget::close();
+}
+
+
+void KStartupLogo::mousePressEvent(QMouseEvent*)
+{
+ // for the haters of raising startlogos
+ if (m_readyToHide)
+ hide(); // don't close, main() sets up a QTimer for that
+}
+
+KStartupLogo* KStartupLogo::getInstance()
+{
+ if (m_wasClosed)
+ return 0;
+
+ if (!m_instance)
+ m_instance = new KStartupLogo;
+
+ return m_instance;
+}
+
+void KStartupLogo::hideIfStillThere()
+{
+ if (m_instance)
+ m_instance->hide();
+ // don't close, main() sets up a QTimer for that
+}
+
+
+KStartupLogo* KStartupLogo::m_instance = 0;
+bool KStartupLogo::m_wasClosed = false;
+
+#include "KStartupLogo.moc"
diff --git a/src/gui/kdeext/KStartupLogo.h b/src/gui/kdeext/KStartupLogo.h
new file mode 100644
index 0000000..1af80fa
--- /dev/null
+++ b/src/gui/kdeext/KStartupLogo.h
@@ -0,0 +1,70 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ This file contains code borrowed from KDevelop 2.0
+ Copyright (c) The KDevelop Development Team.
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef KSTARTUPLOGO_H
+#define KSTARTUPLOGO_H
+
+#include <qwidget.h>
+#include <qpixmap.h>
+
+class KStartupLogo : public QWidget
+{
+ Q_OBJECT
+
+public:
+ static KStartupLogo* getInstance();
+
+ static void hideIfStillThere();
+
+ void setHideEnabled(bool enabled) { m_readyToHide = enabled; };
+ void setShowTip(bool showTip) { m_showTip = showTip; };
+
+public slots:
+ void slotShowStatusMessage(QString);
+ virtual void close();
+
+protected:
+
+ KStartupLogo(QWidget *parent=0, const char *name=0);
+ ~KStartupLogo();
+
+ virtual void paintEvent(QPaintEvent*);
+ virtual void mousePressEvent( QMouseEvent*);
+
+ bool m_readyToHide;
+ bool m_showTip;
+
+ QPixmap m_pixmap;
+
+ static KStartupLogo* m_instance;
+ static bool m_wasClosed;
+ QString m_statusMessage;
+};
+
+#endif
+
+
+
+
+
diff --git a/src/gui/kdeext/KTmpStatusMsg.cpp b/src/gui/kdeext/KTmpStatusMsg.cpp
new file mode 100644
index 0000000..81142d2
--- /dev/null
+++ b/src/gui/kdeext/KTmpStatusMsg.cpp
@@ -0,0 +1,70 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include <qapplication.h>
+#include <qeventloop.h>
+
+#include <kmainwindow.h>
+#include <kstatusbar.h>
+#include <klocale.h>
+
+#include "KTmpStatusMsg.h"
+#include "gui/application/RosegardenApplication.h"
+
+KTmpStatusMsg::KTmpStatusMsg(const QString& msg, KMainWindow* window, int id)
+ : m_mainWindow(window),
+ m_id(id)
+{
+ m_mainWindow->statusBar()->changeItem(QString(" %1").arg(msg), m_id);
+ Rosegarden::rgapp->refreshGUI(50);
+}
+
+KTmpStatusMsg::~KTmpStatusMsg()
+{
+ m_mainWindow->statusBar()->clear();
+ m_mainWindow->statusBar()->changeItem(m_defaultMsg, m_id);
+ Rosegarden::rgapp->refreshGUI(50);
+}
+
+
+void KTmpStatusMsg::setDefaultMsg(const QString& m)
+{
+ m_defaultMsg = m;
+}
+
+const QString& KTmpStatusMsg::getDefaultMsg()
+{
+ return m_defaultMsg;
+}
+
+void KTmpStatusMsg::setDefaultId(int id)
+{
+ m_defaultId = id;
+}
+
+int KTmpStatusMsg::getDefaultId()
+{
+ return m_defaultId;
+}
+
+
+int KTmpStatusMsg::m_defaultId = 1;
+QString KTmpStatusMsg::m_defaultMsg = "";
diff --git a/src/gui/kdeext/KTmpStatusMsg.h b/src/gui/kdeext/KTmpStatusMsg.h
new file mode 100644
index 0000000..6fd512c
--- /dev/null
+++ b/src/gui/kdeext/KTmpStatusMsg.h
@@ -0,0 +1,88 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef KTMPSTATUSMSG_H
+#define KTMPSTATUSMSG_H
+
+class KMainWindow;
+
+/**
+ * A class to create a temporary message on KMainWindow's status bar
+ *
+ * Use as follows :
+ * { // some block of code starts here
+ * KTmpStatusMsg tmpMsg("doing something...", mainWindow);
+ *
+ * // do something
+ *
+ * } // the message goes away
+ *
+ */
+class KTmpStatusMsg
+{
+public:
+
+ /**
+ * Creates a new temporary status message on the status bar
+ * of the specified KMainWindow.
+ * The id of the text widget in the status bar can be specified
+ */
+ KTmpStatusMsg(const QString& msg, KMainWindow*, int id = m_defaultId);
+
+ ~KTmpStatusMsg();
+
+ /**
+ * Sets the message which will replace the temporary one in the
+ * status bar
+ */
+ static void setDefaultMsg(const QString&);
+
+ /**
+ * Returns the default message which will replace the temporary
+ * one in the status bar
+ */
+ static const QString& getDefaultMsg();
+
+ /**
+ * Sets the default id which will be used as the id of the text
+ * widget in the status bar
+ */
+ static void setDefaultId(int);
+
+ /**
+ * Returns the default id which will be used as id of the text
+ * widget in the status bar
+ */
+ static int getDefaultId();
+
+protected:
+
+ //--------------- Data members ---------------------------------
+
+ KMainWindow* m_mainWindow;
+ int m_id;
+
+ static int m_defaultId;
+ static QString m_defaultMsg;
+};
+
+#endif
+
diff --git a/src/gui/kdeext/QCanvasGroupableItem.cpp b/src/gui/kdeext/QCanvasGroupableItem.cpp
new file mode 100644
index 0000000..1fc2f2d
--- /dev/null
+++ b/src/gui/kdeext/QCanvasGroupableItem.cpp
@@ -0,0 +1,279 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include <qcanvas.h>
+#include "misc/Debug.h"
+
+#include "QCanvasGroupableItem.h"
+
+QCanvasGroupableItem::QCanvasGroupableItem(QCanvasItem *i,
+ QCanvasItemGroup *g,
+ bool withRelativeCoords)
+ : m_group(g),
+ m_item(i)
+{
+ // RG_DEBUG << "QCanvasGroupableItem() - this : " << this
+ // << " - group : " << g
+ // << " - item : " << i << endl;
+
+ if (withRelativeCoords)
+ group()->addItemWithRelativeCoords(item());
+ else
+ group()->addItem(item());
+}
+
+QCanvasGroupableItem::~QCanvasGroupableItem()
+{
+ // RG_DEBUG << "~QCanvasGroupableItem() - this : " << this
+ // << " - group : " << group()
+ // << " - item : " << item() << endl;
+
+ // remove from the item group if we're still attached to one
+ if (group())
+ group()->removeItem(item());
+}
+
+void
+QCanvasGroupableItem::relativeMoveBy(double dx, double dy)
+{
+ m_item->moveBy(dx + m_group->x(),
+ dy + m_group->y());
+}
+
+void
+QCanvasGroupableItem::detach()
+{
+ m_group = 0;
+}
+
+//////////////////////////////////////////////////////////////////////
+
+QCanvasItemGroup::QCanvasItemGroup(QCanvas *c)
+ : QCanvasItem(c)
+{
+ // RG_DEBUG << "QCanvasItemGroup() - this : " << this << endl;
+}
+
+QCanvasItemGroup::~QCanvasItemGroup()
+{
+ // RG_DEBUG << "~QCanvasItemGroup() - this : " << this << endl;
+
+ // Tell all our items that we're being destroyed
+ QCanvasItemList::Iterator i;
+ for (i = m_items.begin(); i != m_items.end(); ++i) {
+ QCanvasGroupableItem *t = dynamic_cast<QCanvasGroupableItem*>(*i);
+ if (t)
+ t->detach();
+ }
+}
+
+void
+QCanvasItemGroup::moveBy(double dx, double dy)
+{
+ QCanvasItem::moveBy(dx, dy); // move ourselves
+
+ QCanvasItemList::Iterator i; // move group items
+ for (i = m_items.begin(); i != m_items.end(); ++i)
+ (*i)->moveBy(dx, dy);
+}
+
+void
+QCanvasItemGroup::advance(int stage)
+{
+ QCanvasItemList::Iterator i;
+ for (i = m_items.begin(); i != m_items.end(); ++i)
+ (*i)->advance(stage);
+}
+
+bool
+QCanvasItemGroup::collidesWith(const QCanvasItem *item) const
+{
+ QCanvasItemList::ConstIterator i;
+ for (i = m_items.begin(); i != m_items.end(); ++i)
+ if ((*i)->collidesWith(item))
+ return true;
+
+ return false;
+}
+
+void
+QCanvasItemGroup::draw(QPainter&)
+{
+ // There isn't anything to do - all the items will be drawn
+ // seperately by the canvas anyway. However the function has to be
+ // implemented because it's an abstract virtual in QCanvasItem.
+
+ // QCanvasItemList::Iterator i;
+ // for(i = m_items.begin(); i != m_items.end(); ++i)
+ // (*i)->draw(p);
+}
+
+void
+QCanvasItemGroup::setVisible(bool yes)
+{
+ QCanvasItemList::Iterator i;
+ for (i = m_items.begin(); i != m_items.end(); ++i)
+ (*i)->setVisible(yes);
+}
+
+void
+QCanvasItemGroup::setSelected(bool yes)
+{
+ QCanvasItem::setSelected(yes);
+
+ QCanvasItemList::Iterator i;
+ for (i = m_items.begin(); i != m_items.end(); ++i)
+ (*i)->setVisible(yes);
+}
+
+void
+QCanvasItemGroup::setEnabled(bool yes)
+{
+ QCanvasItem::setEnabled(yes);
+
+ QCanvasItemList::Iterator i;
+ for (i = m_items.begin(); i != m_items.end(); ++i)
+ (*i)->setEnabled(yes);
+}
+
+void
+QCanvasItemGroup::setActive(bool yes)
+{
+ QCanvasItem::setActive(yes);
+
+ QCanvasItemList::Iterator i;
+ for (i = m_items.begin(); i != m_items.end(); ++i)
+ (*i)->setActive(yes);
+}
+
+int
+QCanvasItemGroup::rtti() const
+{
+ return 10002;
+}
+
+QRect
+QCanvasItemGroup::boundingRect() const
+{
+ QRect r;
+
+ QCanvasItemList::ConstIterator i;
+ for (i = m_items.begin(); i != m_items.end(); ++i)
+ r.unite((*i)->boundingRect());
+
+ return r;
+}
+
+QRect
+QCanvasItemGroup::boundingRectAdvanced() const
+{
+ QRect r;
+
+ QCanvasItemList::ConstIterator i;
+ for (i = m_items.begin(); i != m_items.end(); ++i)
+ r.unite((*i)->boundingRectAdvanced());
+
+ return r;
+}
+
+bool
+QCanvasItemGroup::collidesWith(const QCanvasSprite *s,
+ const QCanvasPolygonalItem *p,
+ const QCanvasRectangle *r,
+ const QCanvasEllipse *e,
+ const QCanvasText *t) const
+{
+ if (s)
+ return collidesWith(s);
+ else if (p)
+ return collidesWith(p);
+ else if (r)
+ return collidesWith(r);
+ else if (e)
+ return collidesWith(e);
+ else if (t)
+ return collidesWith(t);
+
+ return false;
+
+}
+
+void
+QCanvasItemGroup::addItem(QCanvasItem *i)
+{
+ m_items.append(i);
+}
+
+void
+QCanvasItemGroup::addItemWithRelativeCoords(QCanvasItem *i)
+{
+ i->moveBy(x(), y());
+ addItem(i);
+}
+
+void
+QCanvasItemGroup::removeItem(QCanvasItem *i)
+{
+ // RG_DEBUG << "QCanvasItemGroup::removeItem() - this : "
+ // << this << " - item : " << i << endl;
+ m_items.remove(i);
+}
+
+//////////////////////////////////////////////////////////////////////
+
+
+QCanvasLineGroupable::QCanvasLineGroupable(QCanvas *c,
+ QCanvasItemGroup *g)
+ : QCanvasLine(c),
+ QCanvasGroupableItem(this, g)
+{}
+
+//////////////////////////////////////////////////////////////////////
+
+QCanvasRectangleGroupable::QCanvasRectangleGroupable(QCanvas *c,
+ QCanvasItemGroup *g)
+ : QCanvasRectangle(c),
+ QCanvasGroupableItem(this, g)
+{}
+
+//////////////////////////////////////////////////////////////////////
+
+QCanvasTextGroupable::QCanvasTextGroupable(const QString& label,
+ QCanvas *c,
+ QCanvasItemGroup *g)
+ : QCanvasText(label, c),
+ QCanvasGroupableItem(this, g)
+{}
+
+QCanvasTextGroupable::QCanvasTextGroupable(QCanvas *c,
+ QCanvasItemGroup *g)
+ : QCanvasText(c),
+ QCanvasGroupableItem(this, g)
+{}
+
+//////////////////////////////////////////////////////////////////////
+
+QCanvasSpriteGroupable::QCanvasSpriteGroupable(QCanvasPixmapArray *pa,
+ QCanvas *c,
+ QCanvasItemGroup *g)
+ : QCanvasSprite(pa, c),
+ QCanvasGroupableItem(this, g)
+{}
diff --git a/src/gui/kdeext/QCanvasGroupableItem.h b/src/gui/kdeext/QCanvasGroupableItem.h
new file mode 100644
index 0000000..97d1917
--- /dev/null
+++ b/src/gui/kdeext/QCanvasGroupableItem.h
@@ -0,0 +1,201 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef QCANVASGROUPABLEITEM_H
+#define QCANVASGROUPABLEITEM_H
+
+#include <qcanvas.h>
+
+class QCanvasItemGroup;
+
+/**
+ * This class is meant to be inherited by QCanvasItem children to make
+ * them groupable.
+ *
+ * On destruction, the item will remove itself from the group it's
+ * attached to.
+ *
+ * @see QCanvasSpriteGroupable
+ * @see QCanvasLineGroupable
+ */
+class QCanvasGroupableItem
+{
+ friend class QCanvasItemGroup;
+
+public:
+
+ /**
+ * Create a groupable item, e.g. put the item in the specified
+ * QCanvasItemGroup. If withRelativeCoords is true, the item's
+ * position will be translated so that it's coordinates are
+ * relative to those of the item group.
+ *
+ * @see QCanvasItemGroup#addItemWithRelativeCoords()
+ */
+ QCanvasGroupableItem(QCanvasItem*, QCanvasItemGroup*,
+ bool withRelativeCoords = false);
+
+ virtual ~QCanvasGroupableItem();
+
+ /// Returns the QCanvasItemGroup this groupable item belongs to
+ QCanvasItemGroup* group() { return m_group; }
+
+ /// Returns the QCanvasItemGroup this groupable item belongs to
+ const QCanvasItemGroup* group() const { return m_group; }
+
+ /// Returns the QCanvasItem which this groupable item wraps
+ QCanvasItem *item() { return m_item; }
+
+ /**
+ * Same as moveBy(), except that the move is done relative to the
+ * item group's coordinates
+ */
+ virtual void relativeMoveBy(double dx, double dy);
+
+protected:
+ /**
+ * Detach item from the item group - called by QCanvasItemGroup only
+ *
+ * Set m_group to 0, so that on destruction the item won't try to
+ * remove itself from the group
+ */
+ void detach();
+
+private:
+ //--------------- Data members ---------------------------------
+
+ QCanvasItemGroup* m_group;
+ QCanvasItem* m_item;
+
+};
+
+
+/**
+ * This class implements QCanvasItem groups
+ *
+ * An item group will keep its items in a fixed relative position when
+ * moved, just like in a drawing program where you can "bind" several
+ * items together so that they'll behave as a single item.
+ *
+ * Proper behavior requires collaboration from the QCanvasView,
+ * though. When about to move an item, the QCanvasView object should
+ * first check if it's not a groupable item, and if so fetch its
+ * QCanvasItemGroup and move it instead.
+ */
+class QCanvasItemGroup : public QCanvasItem
+{
+public:
+ QCanvasItemGroup(QCanvas *);
+ virtual ~QCanvasItemGroup();
+
+ virtual void moveBy(double dx, double dy);
+ virtual void advance(int stage);
+ virtual bool collidesWith(const QCanvasItem*) const;
+ virtual void draw(QPainter&);
+ virtual void setVisible(bool yes);
+ virtual void setSelected(bool yes);
+ virtual void setEnabled(bool yes);
+ virtual void setActive(bool yes);
+ virtual int rtti() const;
+ virtual QRect boundingRect() const;
+ virtual QRect boundingRectAdvanced() const;
+
+ /**
+ * Add a new item to this group.
+ *
+ * The item's coordinates are kept as is.
+ *
+ * @see addItemWithRelativeCoords()
+ */
+ virtual void addItem(QCanvasItem *);
+
+ /**
+ * Add a new item to this group.
+ *
+ * The item's coordinates are considered relative to the group.
+ * For example, suppose you have a QCanvasItemGroup whose coords
+ * are 10,10. If you call addItemWithRelativeCoords() with an item
+ * whose coords are 5,5, the item is moved so that its coords
+ * will be 5,5 relative to the group (e.g. 15,15).
+ *
+ * @see addItem()
+ */
+ virtual void addItemWithRelativeCoords(QCanvasItem *);
+
+ /**
+ * Remove the specified item from the group
+ */
+ virtual void removeItem(QCanvasItem*);
+
+private:
+ virtual bool collidesWith(const QCanvasSprite*,
+ const QCanvasPolygonalItem*,
+ const QCanvasRectangle*,
+ const QCanvasEllipse*,
+ const QCanvasText* ) const;
+
+protected:
+ //--------------- Data members ---------------------------------
+
+ QCanvasItemList m_items;
+};
+
+
+/**
+ * A QCanvasLine which can be put in a QCanvasGroup
+ */
+class QCanvasLineGroupable : public QCanvasLine, public QCanvasGroupableItem
+{
+public:
+ QCanvasLineGroupable(QCanvas *c, QCanvasItemGroup *g);
+};
+
+/**
+ * A QCanvasRectangle which can be put in a QCanvasGroup
+ */
+class QCanvasRectangleGroupable : public QCanvasRectangle, public QCanvasGroupableItem
+{
+public:
+ QCanvasRectangleGroupable(QCanvas *c, QCanvasItemGroup *g);
+};
+
+/**
+ * A QCanvasText which can be put in a QCanvasGroup
+ */
+class QCanvasTextGroupable : public QCanvasText, public QCanvasGroupableItem
+{
+public:
+ QCanvasTextGroupable(QCanvas *c, QCanvasItemGroup *g);
+ QCanvasTextGroupable(const QString&, QCanvas *c, QCanvasItemGroup *g);
+};
+
+/**
+ * A QCanvasSprite that can be put in a QCanvasGroup
+ */
+class QCanvasSpriteGroupable : public QCanvasSprite, public QCanvasGroupableItem
+{
+public:
+ QCanvasSpriteGroupable(QCanvasPixmapArray*,
+ QCanvas*,
+ QCanvasItemGroup*);
+};
+
+#endif
diff --git a/src/gui/kdeext/QCanvasSimpleSprite.cpp b/src/gui/kdeext/QCanvasSimpleSprite.cpp
new file mode 100644
index 0000000..537cc62
--- /dev/null
+++ b/src/gui/kdeext/QCanvasSimpleSprite.cpp
@@ -0,0 +1,217 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include <vector>
+#include "misc/Debug.h"
+
+#include <qpainter.h>
+
+#include "QCanvasSimpleSprite.h"
+
+namespace Rosegarden {
+
+QCanvasSimpleSprite::QCanvasSimpleSprite(QPixmap *pixmap, QCanvas *canvas)
+ : QCanvasSprite(0, canvas),
+ m_pixmapArray(0)
+{
+ m_pixmapArray = makePixmapArray(pixmap);
+ setSequence(m_pixmapArray);
+}
+
+QCanvasSimpleSprite::QCanvasSimpleSprite(QCanvasPixmap *pixmap, QCanvas *canvas)
+ : QCanvasSprite(0, canvas),
+ m_pixmapArray(0)
+{
+ m_pixmapArray = makePixmapArray(pixmap);
+ setSequence(m_pixmapArray);
+}
+
+QCanvasSimpleSprite::QCanvasSimpleSprite(const QString &pixmapfile,
+ QCanvas *canvas)
+ : QCanvasSprite(0, canvas),
+ m_pixmapArray(0)
+{
+ m_pixmapArray = makePixmapArray(pixmapfile);
+ setSequence(m_pixmapArray);
+}
+
+QCanvasSimpleSprite::QCanvasSimpleSprite(QCanvas *canvas)
+ : QCanvasSprite(0, canvas),
+ m_pixmapArray(0)
+{
+ QCanvasPixmapArray* tmpArray = makePixmapArray(new QPixmap());
+ setSequence(tmpArray);
+}
+
+
+QCanvasSimpleSprite::~QCanvasSimpleSprite()
+{
+ PixmapArrayGC::registerForDeletion(m_pixmapArray);
+ m_pixmapArray = 0;
+
+ // We can't delete m_pixmapArray or we get a core dump.
+ //
+ // The reason I think is that after the QCanvasSprite is deleted,
+ // it is removed from the QCanvas, which therefore needs the
+ // pixmaps to know how to update itself (the crash is in
+ // QCanvas::removeChunks(), usually).
+ //
+ // So instead we have to do this GCish
+ // thingy. PixmapArrayGC::deleteAll() is called by
+ // NotationView::redoLayout
+}
+
+QCanvasPixmapArray*
+QCanvasSimpleSprite::makePixmapArray(QPixmap *pixmap)
+{
+ QList<QPixmap> pixlist;
+ pixlist.setAutoDelete(true); // the QCanvasPixmapArray creates its
+ // own copies of the pixmaps, so we
+ // can delete the one we're passed
+ pixlist.append(pixmap);
+
+ QList<QPoint> spotlist;
+ spotlist.setAutoDelete(true);
+ spotlist.append(new QPoint(0, 0));
+
+ return new QCanvasPixmapArray(pixlist, spotlist);
+}
+
+QCanvasPixmapArray*
+QCanvasSimpleSprite::makePixmapArray(QCanvasPixmap *pixmap)
+{
+ QList<QPixmap> pixlist;
+ pixlist.setAutoDelete(true); // the QCanvasPixmapArray creates its
+ // own copies of the pixmaps, so we
+ // can delete the one we're passed
+ pixlist.append(pixmap);
+
+ QList<QPoint> spotlist;
+ spotlist.setAutoDelete(true);
+ spotlist.append(new QPoint(pixmap->offsetX(), pixmap->offsetY()));
+
+ return new QCanvasPixmapArray(pixlist, spotlist);
+}
+
+QCanvasPixmapArray*
+QCanvasSimpleSprite::makePixmapArray(const QString &pixmapfile)
+{
+ return new QCanvasPixmapArray(pixmapfile);
+}
+
+//////////////////////////////////////////////////////////////////////
+
+QCanvasNotationSprite::QCanvasNotationSprite(NotationElement& n,
+ QPixmap* pixmap,
+ QCanvas* canvas)
+ : QCanvasSimpleSprite(pixmap, canvas),
+ m_notationElement(n)
+{}
+
+QCanvasNotationSprite::QCanvasNotationSprite(NotationElement& n,
+ QCanvasPixmap* pixmap,
+ QCanvas* canvas)
+ : QCanvasSimpleSprite(pixmap, canvas),
+ m_notationElement(n)
+
+{}
+
+QCanvasNotationSprite::~QCanvasNotationSprite()
+{}
+
+
+QCanvasNonElementSprite::QCanvasNonElementSprite(QPixmap *pixmap,
+ QCanvas *canvas) :
+ QCanvasSimpleSprite(pixmap, canvas)
+{}
+
+QCanvasNonElementSprite::QCanvasNonElementSprite(QCanvasPixmap *pixmap,
+ QCanvas *canvas) :
+ QCanvasSimpleSprite(pixmap, canvas)
+{}
+
+QCanvasNonElementSprite::~QCanvasNonElementSprite()
+{}
+
+QCanvasTimeSigSprite::QCanvasTimeSigSprite(double layoutX,
+ QPixmap *pixmap,
+ QCanvas *canvas) :
+ QCanvasNonElementSprite(pixmap, canvas),
+ m_layoutX(layoutX)
+{}
+
+QCanvasTimeSigSprite::QCanvasTimeSigSprite(double layoutX,
+ QCanvasPixmap *pixmap,
+ QCanvas *canvas) :
+ QCanvasNonElementSprite(pixmap, canvas),
+ m_layoutX(layoutX)
+{}
+
+QCanvasTimeSigSprite::~QCanvasTimeSigSprite()
+{}
+
+
+QCanvasStaffNameSprite::QCanvasStaffNameSprite(QPixmap *pixmap,
+ QCanvas *canvas) :
+ QCanvasNonElementSprite(pixmap, canvas)
+{}
+
+QCanvasStaffNameSprite::QCanvasStaffNameSprite(QCanvasPixmap *pixmap,
+ QCanvas *canvas) :
+ QCanvasNonElementSprite(pixmap, canvas)
+{}
+
+QCanvasStaffNameSprite::~QCanvasStaffNameSprite()
+{}
+
+
+//////////////////////////////////////////////////////////////////////
+
+void PixmapArrayGC::registerForDeletion(QCanvasPixmapArray* array)
+{
+ m_pixmapArrays.push_back(array);
+}
+
+void PixmapArrayGC::deleteAll()
+{
+ RG_DEBUG << "PixmapArrayGC::deleteAll() : "
+ << m_pixmapArrays.size() << " pixmap arrays to delete\n";
+
+ static unsigned long total = 0;
+
+ for (unsigned int i = 0; i < m_pixmapArrays.size(); ++i) {
+ QCanvasPixmapArray *array = m_pixmapArrays[i];
+ QPixmap *pixmap = array->image(0);
+ if (pixmap) {
+ total += pixmap->width() * pixmap->height();
+ // NOTATION_DEBUG << "PixmapArrayGC::deleteAll(): " << pixmap->width() << "x" << pixmap->height() << " (" << (pixmap->width()*pixmap->height()) << " px, " << total << " total)" << endl;
+ }
+ delete m_pixmapArrays[i];
+ }
+
+ m_pixmapArrays.clear();
+}
+
+std::vector<QCanvasPixmapArray*> PixmapArrayGC::m_pixmapArrays;
+
+}
+
+//////////////////////////////////////////////////////////////////////
diff --git a/src/gui/kdeext/QCanvasSimpleSprite.h b/src/gui/kdeext/QCanvasSimpleSprite.h
new file mode 100644
index 0000000..15a02f9
--- /dev/null
+++ b/src/gui/kdeext/QCanvasSimpleSprite.h
@@ -0,0 +1,133 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef QCANVASSIMPLESPRITE_H
+#define QCANVASSIMPLESPRITE_H
+
+#include <qwmatrix.h>
+#include <qcanvas.h>
+
+#include "gui/editors/notation/NotePixmapFactory.h"
+
+namespace Rosegarden {
+
+/**
+ * A QCanvasSprite with 1 frame only
+ */
+class QCanvasSimpleSprite : public QCanvasSprite
+{
+public:
+ QCanvasSimpleSprite(QPixmap*, QCanvas*);
+ QCanvasSimpleSprite(QCanvasPixmap*, QCanvas*);
+ QCanvasSimpleSprite(const QString &pixmapfile, QCanvas*);
+
+ // For lazy pixmap rendering, when we get around looking at it
+ QCanvasSimpleSprite(QCanvas*);
+
+ virtual ~QCanvasSimpleSprite();
+
+protected:
+ static QCanvasPixmapArray* makePixmapArray(QPixmap *pixmap);
+
+ static QCanvasPixmapArray* makePixmapArray(QCanvasPixmap *pixmap);
+
+ static QCanvasPixmapArray* makePixmapArray(const QString &pixmapfile);
+
+ //--------------- Data members ---------------------------------
+
+ QCanvasPixmapArray* m_pixmapArray;
+};
+
+class NotationElement;
+
+/**
+ * A QCanvasSprite referencing a NotationElement
+ */
+class QCanvasNotationSprite : public QCanvasSimpleSprite
+{
+public:
+ QCanvasNotationSprite(Rosegarden::NotationElement&, QPixmap*, QCanvas*);
+ QCanvasNotationSprite(Rosegarden::NotationElement&, QCanvasPixmap*, QCanvas*);
+
+ virtual ~QCanvasNotationSprite();
+
+ Rosegarden::NotationElement& getNotationElement() { return m_notationElement; }
+
+protected:
+ //--------------- Data members ---------------------------------
+
+ Rosegarden::NotationElement& m_notationElement;
+};
+
+class QCanvasNonElementSprite : public QCanvasSimpleSprite
+{
+public:
+ QCanvasNonElementSprite(QPixmap *, QCanvas *);
+ QCanvasNonElementSprite(QCanvasPixmap *, QCanvas *);
+ virtual ~QCanvasNonElementSprite();
+};
+
+/**
+ * A QCanvasSprite used for a time signature
+ */
+class QCanvasTimeSigSprite : public QCanvasNonElementSprite
+{
+public:
+ QCanvasTimeSigSprite(double layoutX, QPixmap *, QCanvas *);
+ QCanvasTimeSigSprite(double layoutX, QCanvasPixmap *, QCanvas *);
+ virtual ~QCanvasTimeSigSprite();
+
+ void setLayoutX(double layoutX) { m_layoutX = layoutX; }
+ double getLayoutX() const { return m_layoutX; }
+
+protected:
+ double m_layoutX;
+};
+
+/**
+ * A QCanvasSprite used for a staff name
+ */
+class QCanvasStaffNameSprite : public QCanvasNonElementSprite
+{
+public:
+ QCanvasStaffNameSprite(QPixmap *, QCanvas *);
+ QCanvasStaffNameSprite(QCanvasPixmap *, QCanvas *);
+ virtual ~QCanvasStaffNameSprite();
+};
+
+/**
+ * A GC for QCanvasPixmapArray which have to be deleted seperatly
+ */
+class PixmapArrayGC
+{
+public:
+ static void registerForDeletion(QCanvasPixmapArray*);
+ static void deleteAll();
+
+protected:
+ //--------------- Data members ---------------------------------
+
+ static std::vector<QCanvasPixmapArray*> m_pixmapArrays;
+};
+
+}
+
+#endif
diff --git a/src/gui/kdeext/RGLed.cpp b/src/gui/kdeext/RGLed.cpp
new file mode 100644
index 0000000..54b91b2
--- /dev/null
+++ b/src/gui/kdeext/RGLed.cpp
@@ -0,0 +1,729 @@
+// -*- c-basic-offset: 2 -*-
+
+/* This file is a modified version of kled.cpp, which is part of the
+ KDE libraries. The modifications (for "brute-force" antialiasing)
+ were carried out by Chris Cannam, April 2004.
+
+ Copyright (C) 1998 J�rg Habenicht ([email protected])
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+/*************************************************************************
+ * $Id: rgled.cpp 6694 2005-07-17 11:42:36Z cannam $
+ *
+ * $Log$
+ * Revision 1.2 2005/07/17 11:42:36 cannam
+ * * fixes from stg branch:
+ * - fix failure to recolour led when switching track from audio to midi or vice versa
+ * - fix colour number / menu index confusion in spb colour menu
+ *
+ * Revision 1.1.10.1 2005/07/17 00:00:30 cannam
+ *
+ * * merge across from HEAD to 17/07/2005
+ * * appearance fixes
+ *
+ * Revision 1.1 2004/04/05 09:54:05 cannam
+ *
+ * * antialiased LEDs
+ *
+ * Revision 1.24 2002/12/16 15:10:03 mkretz
+ * don't use a gray background but rather take the color from the current
+ * colorscheme
+ *
+ * Revision 1.23 2002/03/04 00:51:49 lunakl
+ * Keep BC changes (the patch is almost 100KiB of boring stuff
+ * ... anybody willing to review? ;) ).
+ *
+ * Revision 1.22 2002/02/27 23:15:45 pfeiffer
+ * kapp--
+ *
+ * Revision 1.21 2002/01/22 10:23:55 hausmann
+ * - minor API fix (don't return a const QColor object)
+ *
+ * Revision 1.20 2001/10/10 17:40:39 mueller
+ * CVS_SILENT: fixincludes
+ *
+ * Revision 1.19 2001/08/08 14:35:12 hausmann
+ * - removed empty KActionCollection::childEvent
+ * - added sizeHint() and minimumSizeHint() methods to KLed, as advised by
+ * Rik in the comment in kled.h
+ * - removed unused mousePressEvent, mouseMoveEvent and mouseReleaseEvent
+ * handlers from KPassDlg
+ * - merged KToolBar::insertSeparator() and KToolBar::insertLineSeparator()
+ * with their overloaded variants
+ *
+ * Revision 1.18 2001/04/16 22:08:43 pfeiffer
+ * don't assume that the first item of an enum is 0
+ *
+ * Revision 1.17 2000/09/12 19:15:53 pfeiffer
+ * Stefan Hellwig in cooperation with Joerg Habenicht:
+ * Draw nicer LEDs, especially sunken ones.
+ *
+ * Revision 1.16 2000/08/24 12:44:48 porten
+ * "friend class" patches from Thomas Kunert <[email protected]>
+ *
+ * Revision 1.15 2000/08/17 16:44:44 reggie
+ * Don't crash
+ *
+ * Revision 1.14 2000/06/03 01:04:42 gehrmab
+ * * Made drawing routines available for overriding
+ * * Added a parent/name constructor
+ * * Propertyfication
+ *
+ * Revision 1.13 2000/05/08 19:38:49 sschiman
+ * Calling setColor before setting up the private data is a bad idea ;-)
+ *
+ * Revision 1.12 2000/05/07 09:49:57 habenich
+ * provided method to set the factor to dark the LED
+ * precalculated the dark color, is just retrieved at paint events
+ *
+ * Revision 1.11 2000/04/09 16:08:33 habenich
+ * fixed nasty bug #70 disappearing led
+ * reenabled flat and raised led painting
+ *
+ * Revision 1.10 1999/12/25 17:12:18 mirko
+ * Modified Look "round" to "raised", as the others are flat and
+ * sunken. All enums start with uppercase letters now to fit the overall
+ * KDE style.
+ * Implemented raised rectangluar look.
+ * --Mirko.
+ *
+ * Revision 1.9 1999/11/12 21:17:09 antlarr
+ * Fixed some bugs.
+ * Added the possibility to draw a sunk rectangle as the "old" KLedLamp did.
+ *
+ * Revision 1.9 1999/11/11 16:08:15 antlarr
+ * Fixed some bugs.
+ * Added the possibility to draw a sunk rectangle as the "old" KLedLamp did.
+ *
+ * Revision 1.8 1999/11/01 22:03:15 dmuell
+ * fixing all kinds of compile warnings
+ * (unused var, unused argument etc)
+ *
+ * Revision 1.7 1999/10/10 13:34:14 mirko
+ * First merge with KLedLamp that shows a rectangular LED.
+ * It does not yet work reliably.
+ *
+ * Revision 1.6 1999/03/01 23:34:49 kulow
+ * CVS_SILENT ported to Qt 2.0
+ *
+ * Revision 1.5 1999/02/19 08:52:42 habenich
+ * ID und LOG tags included
+ *
+ *
+ *************************************************************************/
+
+#define PAINT_BENCH
+#undef PAINT_BENCH
+
+#ifdef PAINT_BENCH
+#include <qdatetime.h>
+#include <stdio.h>
+#endif
+
+
+#include <qpainter.h>
+#include <qimage.h>
+#include <qcolor.h>
+#include <kapplication.h>
+#include <kpixmapeffect.h>
+#include "kled.h"
+
+
+class KLed::KLedPrivate
+{
+ friend class KLed;
+
+ int dark_factor;
+ QColor offcolor;
+ QPixmap *off_map;
+ QPixmap *on_map;
+};
+
+
+
+KLed::KLed(QWidget *parent, const char *name)
+ : QWidget( parent, name),
+ led_state(On),
+ led_look(Raised),
+ led_shape(Circular)
+{
+ QColor col(green);
+ d = new KLed::KLedPrivate;
+ d->dark_factor = 300;
+ d->offcolor = col.dark(300);
+ d->off_map = 0;
+ d->on_map = 0;
+
+ setColor(col);
+}
+
+
+KLed::KLed(const QColor& col, QWidget *parent, const char *name)
+ : QWidget( parent, name),
+ led_state(On),
+ led_look(Raised),
+ led_shape(Circular)
+{
+ d = new KLed::KLedPrivate;
+ d->dark_factor = 300;
+ d->offcolor = col.dark(300);
+ d->off_map = 0;
+ d->on_map = 0;
+
+ setColor(col);
+ //setShape(Circular);
+}
+
+KLed::KLed(const QColor& col, KLed::State state,
+ KLed::Look look, KLed::Shape shape, QWidget *parent, const char *name )
+ : QWidget(parent, name),
+ led_state(state),
+ led_look(look),
+ led_shape(shape)
+{
+ d = new KLed::KLedPrivate;
+ d->dark_factor = 300;
+ d->offcolor = col.dark(300);
+ d->off_map = 0;
+ d->on_map = 0;
+
+ //setShape(shape);
+ setColor(col);
+}
+
+
+KLed::~KLed()
+{
+ delete d->off_map;
+ delete d->on_map;
+ delete d;
+}
+
+void
+KLed::paintEvent(QPaintEvent *)
+{
+#ifdef PAINT_BENCH
+ const int rounds = 1000;
+ QTime t;
+ t.start();
+ for (int i = 0; i < rounds; i++) {
+#endif
+ switch (led_shape) {
+ case Rectangular:
+ switch (led_look) {
+ case Sunken :
+ paintRectFrame(false);
+ break;
+ case Raised :
+ paintRectFrame(true);
+ break;
+ case Flat :
+ paintRect();
+ break;
+ default :
+ qWarning("%s: in class KLed: no KLed::Look set", qApp->argv()[0]);
+ }
+ break;
+ case Circular:
+ switch (led_look) {
+ case Flat :
+ paintFlat();
+ break;
+ case Raised :
+ paintRound();
+ break;
+ case Sunken :
+ paintSunken();
+ break;
+ default:
+ qWarning("%s: in class KLed: no KLed::Look set", qApp->argv()[0]);
+ }
+ break;
+ default:
+ qWarning("%s: in class KLed: no KLed::Shape set", qApp->argv()[0]);
+ break;
+ }
+#ifdef PAINT_BENCH
+
+ }
+ int ready = t.elapsed();
+ qWarning("elapsed: %d msec. for %d rounds", ready, rounds);
+#endif
+}
+
+void
+KLed::paintFlat() // paint a ROUND FLAT led lamp
+{
+ QPainter paint;
+ QColor color;
+ QBrush brush;
+ QPen pen;
+
+ // Initialize coordinates, width, and height of the LED
+ //
+ int width = this->width();
+ // Make sure the LED is round!
+ if (width > this->height())
+ width = this->height();
+ width -= 2; // leave one pixel border
+ if (width < 0)
+ width = 0;
+
+
+ // start painting widget
+ //
+ paint.begin( this );
+
+ // Set the color of the LED according to given parameters
+ color = ( led_state ) ? led_color : d->offcolor;
+
+ // Set the brush to SolidPattern, this fills the entire area
+ // of the ellipse which is drawn with a thin grey "border" (pen)
+ brush.setStyle( QBrush::SolidPattern );
+ brush.setColor( color );
+
+ pen.setWidth( 1 );
+ color = colorGroup().dark();
+ pen.setColor( color ); // Set the pen accordingly
+
+ paint.setPen( pen ); // Select pen for drawing
+ paint.setBrush( brush ); // Assign the brush to the painter
+
+ // Draws a "flat" LED with the given color:
+ paint.drawEllipse( 1, 1, width, width );
+
+ paint.end();
+ //
+ // painting done
+}
+
+void
+KLed::paintRound() // paint a ROUND RAISED led lamp
+{
+ QPainter paint;
+ QColor color;
+ QBrush brush;
+ QPen pen;
+
+ // Initialize coordinates, width, and height of the LED
+ int width = this->width();
+
+ // Make sure the LED is round!
+ if (width > this->height())
+ width = this->height();
+ width -= 2; // leave one pixel border
+ if (width < 0)
+ width = 0;
+
+ // start painting widget
+ //
+ paint.begin( this );
+
+ // Set the color of the LED according to given parameters
+ color = ( led_state ) ? led_color : d->offcolor;
+
+ // Set the brush to SolidPattern, this fills the entire area
+ // of the ellipse which is drawn first
+ brush.setStyle( QBrush::SolidPattern );
+ brush.setColor( color );
+ paint.setBrush( brush ); // Assign the brush to the painter
+
+ // Draws a "flat" LED with the given color:
+ paint.drawEllipse( 1, 1, width, width );
+
+ // Draw the bright light spot of the LED now, using modified "old"
+ // painter routine taken from KDEUI�s KLed widget:
+
+ // Setting the new width of the pen is essential to avoid "pixelized"
+ // shadow like it can be observed with the old LED code
+ pen.setWidth( 2 );
+
+ // shrink the light on the LED to a size about 2/3 of the complete LED
+ int pos = width / 5 + 1;
+ int light_width = width;
+ light_width *= 2;
+ light_width /= 3;
+
+ // Calculate the LED�s "light factor":
+ int light_quote = (130 * 2 / (light_width ? light_width : 1)) + 100;
+
+ // Now draw the bright spot on the LED:
+ while (light_width)
+ {
+ color = color.light( light_quote ); // make color lighter
+ pen.setColor( color ); // set color as pen color
+ paint.setPen( pen ); // select the pen for drawing
+ paint.drawEllipse( pos, pos, light_width, light_width ); // draw the ellipse (circle)
+ light_width--;
+ if (!light_width)
+ break;
+ paint.drawEllipse( pos, pos, light_width, light_width );
+ light_width--;
+ if (!light_width)
+ break;
+ paint.drawEllipse( pos, pos, light_width, light_width );
+ pos++;
+ light_width--;
+ }
+
+ // Drawing of bright spot finished, now draw a thin grey border
+ // around the LED; it looks nicer that way. We do this here to
+ // avoid that the border can be erased by the bright spot of the LED
+
+ pen.setWidth( 1 );
+ color = colorGroup().dark();
+ pen.setColor( color ); // Set the pen accordingly
+ paint.setPen( pen ); // Select pen for drawing
+ brush.setStyle( QBrush::NoBrush ); // Switch off the brush
+ paint.setBrush( brush ); // This avoids filling of the ellipse
+
+ paint.drawEllipse( 1, 1, width, width );
+
+ paint.end();
+ //
+ // painting done
+}
+
+void
+KLed::paintSunken() // paint a ROUND SUNKEN led lamp
+{
+ QPainter paint;
+ QColor color;
+ QBrush brush;
+ QPen pen;
+
+ // First of all we want to know what area should be updated
+ // Initialize coordinates, width, and height of the LED
+ int width = this->width();
+
+ // Make sure the LED is round!
+ if (width > this->height())
+ width = this->height();
+ width -= 2; // leave one pixel border
+ if (width < 0)
+ width = 0;
+
+ // maybe we could stop HERE, if width <=0 ?
+
+ int scale = 1;
+ QPixmap *tmpMap = 0;
+ bool smooth = true;
+
+ if (smooth)
+ {
+ if (led_state) {
+ if (d->on_map) {
+ paint.begin(this);
+ paint.drawPixmap(0, 0, *d->on_map);
+ paint.end();
+ return ;
+ }
+ } else {
+ if (d->off_map) {
+ paint.begin(this);
+ paint.drawPixmap(0, 0, *d->off_map);
+ paint.end();
+ return ;
+ }
+ }
+
+ scale = 3;
+ width *= scale;
+
+ tmpMap = new QPixmap(width, width);
+ tmpMap->fill(paletteBackgroundColor());
+ paint.begin(tmpMap);
+
+ } else
+ {
+ paint.begin(this);
+ }
+
+ // Set the color of the LED according to given parameters
+ color = ( led_state ) ? led_color : d->offcolor;
+
+ // Set the brush to SolidPattern, this fills the entire area
+ // of the ellipse which is drawn first
+ brush.setStyle( QBrush::SolidPattern );
+ brush.setColor( color );
+ paint.setBrush( brush ); // Assign the brush to the painter
+
+ // Draws a "flat" LED with the given color:
+ paint.drawEllipse( scale, scale, width - scale*2, width - scale*2 );
+
+ // Draw the bright light spot of the LED now, using modified "old"
+ // painter routine taken from KDEUI�s KLed widget:
+
+ // Setting the new width of the pen is essential to avoid "pixelized"
+ // shadow like it can be observed with the old LED code
+ pen.setWidth( 2 * scale );
+
+ // shrink the light on the LED to a size about 2/3 of the complete LED
+ int pos = width / 5 + 1;
+ int light_width = width;
+ light_width *= 2;
+ light_width /= 3;
+
+ // Calculate the LED�s "light factor":
+ int light_quote = (130 * 2 / (light_width ? light_width : 1)) + 100;
+
+ // Now draw the bright spot on the LED:
+ while (light_width)
+ {
+ color = color.light( light_quote ); // make color lighter
+ pen.setColor( color ); // set color as pen color
+ paint.setPen( pen ); // select the pen for drawing
+ paint.drawEllipse( pos, pos, light_width, light_width ); // draw the ellipse (circle)
+ light_width--;
+ if (!light_width)
+ break;
+ paint.drawEllipse( pos, pos, light_width, light_width );
+ light_width--;
+ if (!light_width)
+ break;
+ paint.drawEllipse( pos, pos, light_width, light_width );
+ pos++;
+ light_width--;
+ }
+
+ // Drawing of bright spot finished, now draw a thin border
+ // around the LED which resembles a shadow with light coming
+ // from the upper left.
+
+ pen.setWidth( 2 * scale + 1 ); // ### shouldn't this value be smaller for smaller LEDs?
+ brush.setStyle( QBrush::NoBrush ); // Switch off the brush
+ paint.setBrush( brush ); // This avoids filling of the ellipse
+
+ // Set the initial color value to colorGroup().light() (bright) and start
+ // drawing the shadow border at 45� (45*16 = 720).
+
+ int angle = -720;
+ color = colorGroup().light();
+
+ for ( int arc = 120; arc < 2880; arc += 240 )
+ {
+ pen.setColor( color );
+ paint.setPen( pen );
+ int w = width - pen.width() / 2 - scale + 1;
+ paint.drawArc( pen.width() / 2, pen.width() / 2, w, w, angle + arc, 240 );
+ paint.drawArc( pen.width() / 2, pen.width() / 2, w, w, angle - arc, 240 );
+ color = color.dark( 110 ); //FIXME: this should somehow use the contrast value
+ } // end for ( angle = 720; angle < 6480; angle += 160 )
+
+ paint.end();
+ //
+ // painting done
+
+ if (smooth)
+ {
+ QPixmap *&dest = led_state ? d->on_map : d->off_map;
+ QImage i = tmpMap->convertToImage();
+ width /= 3;
+ i = i.smoothScale(width, width);
+ delete tmpMap;
+ dest = new QPixmap(i);
+ paint.begin(this);
+ paint.drawPixmap(0, 0, *dest);
+ paint.end();
+ }
+}
+
+void
+KLed::paintRect()
+{
+ QPainter painter(this);
+ QBrush lightBrush(led_color);
+ QBrush darkBrush(d->offcolor);
+ QPen pen(led_color.dark(300));
+ int w = width();
+ int h = height();
+ // -----
+ switch (led_state) {
+ case On:
+ painter.setBrush(lightBrush);
+ painter.drawRect(0, 0, w, h);
+ break;
+ case Off:
+ painter.setBrush(darkBrush);
+ painter.drawRect(0, 0, w, h);
+ painter.setPen(pen);
+ painter.drawLine(0, 0, w, 0);
+ painter.drawLine(0, h - 1, w, h - 1);
+ // Draw verticals
+ int i;
+ for (i = 0; i < w; i += 4 /* dx */)
+ painter.drawLine(i, 1, i, h - 1);
+ break;
+ default:
+ break;
+ }
+}
+
+void
+KLed::paintRectFrame(bool raised)
+{
+ QPainter painter(this);
+ QBrush lightBrush(led_color);
+ QBrush darkBrush(d->offcolor);
+ int w = width();
+ int h = height();
+ QColor black = Qt::black;
+ QColor white = Qt::white;
+ // -----
+ if (raised) {
+ painter.setPen(white);
+ painter.drawLine(0, 0, 0, h - 1);
+ painter.drawLine(1, 0, w - 1, 0);
+ painter.setPen(black);
+ painter.drawLine(1, h - 1, w - 1, h - 1);
+ painter.drawLine(w - 1, 1, w - 1, h - 1);
+ painter.fillRect(1, 1, w - 2, h - 2,
+ (led_state == On) ? lightBrush : darkBrush);
+ } else {
+ painter.setPen(black);
+ painter.drawRect(0, 0, w, h);
+ painter.drawRect(0, 0, w - 1, h - 1);
+ painter.setPen(white);
+ painter.drawRect(1, 1, w - 1, h - 1);
+ painter.fillRect(2, 2, w - 4, h - 4,
+ (led_state == On) ? lightBrush : darkBrush);
+ }
+}
+
+KLed::State
+KLed::state() const
+{
+ return led_state;
+}
+
+KLed::Shape
+KLed::shape() const
+{
+ return led_shape;
+}
+
+QColor
+KLed::color() const
+{
+ return led_color;
+}
+
+KLed::Look
+KLed::look() const
+{
+ return led_look;
+}
+
+void
+KLed::setState( State state )
+{
+ if (led_state != state) {
+ led_state = state;
+ update();
+ }
+}
+
+void
+KLed::toggleState()
+{
+ led_state = (led_state == On) ? Off : On;
+ // setColor(led_color);
+ update();
+}
+
+void
+KLed::setShape(KLed::Shape s)
+{
+ if (led_shape != s) {
+ led_shape = s;
+ update();
+ }
+}
+
+void
+KLed::setColor(const QColor& col)
+{
+ if (led_color != col) {
+ led_color = col;
+ d->offcolor = col.dark(d->dark_factor);
+ delete d->on_map;
+ d->on_map = 0;
+ delete d->off_map;
+ d->off_map = 0;
+ update();
+ }
+}
+
+void
+KLed::setDarkFactor(int darkfactor)
+{
+ if (d->dark_factor != darkfactor) {
+ d->dark_factor = darkfactor;
+ d->offcolor = led_color.dark(darkfactor);
+ update();
+ }
+}
+
+int
+KLed::darkFactor() const
+{
+ return d->dark_factor;
+}
+
+void
+KLed::setLook( Look look )
+{
+ if (led_look != look) {
+ led_look = look;
+ update();
+ }
+}
+
+void
+KLed::toggle()
+{
+ toggleState();
+}
+
+void
+KLed::on()
+{
+ setState(On);
+}
+
+void
+KLed::off()
+{
+ setState(Off);
+}
+
+QSize
+KLed::sizeHint() const
+{
+ return QSize(16, 16);
+}
+
+QSize
+KLed::minimumSizeHint() const
+{
+ return QSize(16, 16 );
+}
+
+void KLed::virtual_hook( int, void* )
+{ /*BASE::virtual_hook( id, data );*/
+}
diff --git a/src/gui/kdeext/klearlook.cpp b/src/gui/kdeext/klearlook.cpp
new file mode 100644
index 0000000..3e5b986
--- /dev/null
+++ b/src/gui/kdeext/klearlook.cpp
@@ -0,0 +1,4095 @@
+/* $Id: klearlook.cpp,v 1.25 2006/04/26 18:55:41 jck Exp $
+
+Klearlook (C) Joerg C. Koenig, 2005 [email protected]
+
+----
+
+Based upon QtCurve (C) Craig Drummond, 2003 [email protected]
+ Bernhard Rosenkr�zer <bero@r?dh?t.com>
+ Preston Brown <pbrown@r?dh?t.com>
+ Than Ngo <than@r?dh?t.com>
+
+Released under the GNU General Public License (GPL) v2.
+
+----
+
+B???Curve is based on the KDE Light style, 2nd revision:
+Copyright(c)2000-2001 Trolltech AS ([email protected])
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files(the "Software"),
+to deal in the Software without restriction, including without limitation
+the rights to use, copy, modify, merge, publish, distribute, sublicense,
+and/or sell copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
+*/
+
+#include <kdeversion.h>
+#include <qmenubar.h>
+#include <qapplication.h>
+#include <qpainter.h>
+#include <qpalette.h>
+#include <qframe.h>
+#include <qpushbutton.h>
+#include <qdrawutil.h>
+#include <qscrollbar.h>
+#include <qtabbar.h>
+#include <qtabwidget.h>
+#include <qguardedptr.h>
+#include <qlayout.h>
+#include <qlineedit.h>
+#include <qlistview.h>
+#include <qbitmap.h>
+#include <qcleanuphandler.h>
+#include <qimage.h>
+#include <qcombobox.h>
+#include <qspinbox.h>
+#include <qslider.h>
+#include <qstylefactory.h>
+#include <qcleanuphandler.h>
+#include <qcheckbox.h>
+#include <qradiobutton.h>
+#include <qtoolbutton.h>
+#include <qtoolbar.h>
+#include <qprogressbar.h>
+#include <qcursor.h>
+#include <qheader.h>
+#include <qwidgetstack.h>
+#include <qsplitter.h>
+#include <math.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include "klearlook.h"
+#include <qsettings.h>
+
+#if KDE_VERSION >= 0x30200
+#include <qfile.h>
+#include <qdir.h>
+#endif
+
+// Uncomment the following to enable gradients in toolbars and menubars
+// NOTE: Not yet complete!!!
+//#define QTC_GRADIENT_TOOLBARS_AND_MENUBARS
+
+//static int HIGH_LIGHT_FACTORS[]={ 100, 100, 100, 101, 102, 103, 104, 105 /*def*/, 106, 107, 108 };
+//#define HIGHLIGHT_FACTOR(X) (X<0||X>10) ? 105 : HIGH_LIGHT_FACTORS[X]
+#define QTC_HIGHLIGHT_FACTOR 105
+#define QTC_BORDERED_FRAME_WIDTH 2
+#define QTC_DEF_FRAME_WIDTH 1
+//#define QTC_MIN_BTN_SIZE 10
+#define QTC_NO_SECT -1
+
+#define MENU_POPUP_ITEM_HIGH_HI 7
+#define MENU_POPUP_ITEM_HIGH_LO 5
+//#define MENU_POPUP_SHADOW
+
+#define POS_DIV(a, b) ( (a)/(b) + ( ( (a) % (b) >= (b)/2 ) ? 1 : 0 ) )
+
+static const int itemHMargin = 6;
+static const int itemFrame = 2;
+static const int arrowHMargin = 6;
+static const int rightBorder = 12;
+
+#if KDE_VERSION >= 0x30200
+// Try to read $KDEHOME/share/config/kickerrc to find out if kicker is transparent...
+
+static QString readEnvPath( const char *env ) {
+ QCString path = getenv( env );
+
+ return path.isEmpty()
+ ? QString::null
+ : QFile::decodeName( path );
+}
+
+static bool kickerIsTrans() {
+ QString kdeHome( readEnvPath( getuid() ? "KDEHOME" : "KDEROOTHOME" ) ),
+ cfgFileName;
+ bool trans = false;
+
+ if ( kdeHome.isEmpty() )
+ cfgFileName = QDir::homeDirPath() + "/.kde/share/config/kickerrc";
+ else
+ cfgFileName = QString( kdeHome ) + "/share/config/kickerrc";
+
+ QFile cfgFile( cfgFileName );
+
+ if ( cfgFile.open( IO_ReadOnly ) ) {
+ QTextStream stream( &cfgFile );
+ QString line;
+ bool stop = false,
+ inGen = false;
+
+ while ( !stream.atEnd() && !stop ) {
+ line = stream.readLine();
+
+ if ( inGen ) {
+ if ( 0 == line.find( "Transparent=" ) ) // Found it!
+ {
+ if ( -1 != line.find( "true" ) )
+ trans = true;
+ stop = true;
+ } else if ( line[ 0 ] == QChar( '[' ) ) // Then wasn't in General section...
+ stop = true;
+ } else if ( 0 == line.find( "[General]" ) )
+ inGen = true;
+ }
+ cfgFile.close();
+ }
+
+ return trans;
+}
+#endif
+
+inline int limit( double c ) {
+ return c < 0.0
+ ? 0
+ : c > 255.0
+ ? 255
+ : ( int ) c;
+}
+
+inline QColor midColor( const QColor &a, const QColor &b, double factor = 1.0 ) {
+ return QColor( ( a.red() + limit( b.red() * factor ) ) >> 1,
+ ( a.green() + limit( b.green() * factor ) ) >> 1,
+ ( a.blue() + limit( b.blue() * factor ) ) >> 1 );
+}
+
+// Copied from Keramik...
+static bool isFormWidget( const QWidget *widget ) {
+ //Form widgets are in the KHTMLView, but that has 2 further inner levels
+ //of widgets - QClipperWidget, and outside of that, QViewportWidget
+ QWidget * potentialClipPort = widget->parentWidget();
+
+ if ( !potentialClipPort || potentialClipPort->isTopLevel() )
+ return false;
+
+ QWidget *potentialViewPort = potentialClipPort->parentWidget();
+
+ if ( !potentialViewPort || potentialViewPort->isTopLevel() || qstrcmp( potentialViewPort->name(), "qt_viewport" ) )
+ return false;
+
+ QWidget *potentialKHTML = potentialViewPort->parentWidget();
+
+ if ( !potentialKHTML || potentialKHTML->isTopLevel() || qstrcmp( potentialKHTML->className(), "KHTMLView" ) )
+ return false;
+
+ return true;
+}
+
+static void rgb2hls( double *r, double *g, double *b )
+{
+ double min;
+ double max;
+ double red;
+ double green;
+ double blue;
+ double h, l, s;
+ double delta;
+
+ red = *r;
+ green = *g;
+ blue = *b;
+
+ if (red > green)
+ {
+ if (red > blue)
+ max = red;
+ else
+ max = blue;
+
+ if (green < blue)
+ min = green;
+ else
+ min = blue;
+ }
+ else
+ {
+ if (green > blue)
+ max = green;
+ else
+ max = blue;
+
+ if (red < blue)
+ min = red;
+ else
+ min = blue;
+ }
+
+ l = (max + min) / 2;
+ s = 0;
+ h = 0;
+
+ if (max != min)
+ {
+ if (l <= 0.5)
+ s = (max - min) / (max + min);
+ else
+ s = (max - min) / (2 - max - min);
+
+ delta = max -min;
+ if (red == max)
+ h = (green - blue) / delta;
+ else if (green == max)
+ h = 2 + (blue - red) / delta;
+ else if (blue == max)
+ h = 4 + (red - green) / delta;
+
+ h *= 60;
+ if (h < 0.0)
+ h += 360;
+ }
+
+ *r = h;
+ *g = l;
+ *b = s;
+}
+
+
+static void hls2rgb( double *h, double *l, double *s ) {
+ double hue;
+ double lightness;
+ double saturation;
+ double m1, m2;
+ double r, g, b;
+ lightness = *l;
+ saturation = *s;
+
+ if (lightness <= 0.5)
+ m2 = lightness * (1 + saturation);
+ else
+ m2 = lightness + saturation - lightness * saturation;
+
+ m1 = 2 * lightness - m2;
+
+ if (saturation == 0)
+ {
+ *h = lightness;
+ *l = lightness;
+ *s = lightness;
+ }
+ else
+ {
+ hue = *h + 120;
+ while (hue > 360)
+ hue -= 360;
+ while (hue < 0)
+ hue += 360;
+
+ if (hue < 60)
+ r = m1 + (m2 - m1) * hue / 60;
+ else if (hue < 180)
+ r = m2;
+ else if (hue < 240)
+ r = m1 + (m2 - m1) * (240 - hue) / 60;
+ else
+ r = m1;
+
+ hue = *h;
+ while (hue > 360)
+ hue -= 360;
+ while (hue < 0)
+ hue += 360;
+
+ if (hue < 60)
+ g = m1 + (m2 - m1) * hue / 60;
+ else if (hue < 180)
+ g = m2;
+ else if (hue < 240)
+ g = m1 + (m2 - m1) * (240 - hue) / 60;
+ else
+ g = m1;
+
+ hue = *h - 120;
+ while (hue > 360)
+ hue -= 360;
+ while (hue < 0)
+ hue += 360;
+
+ if (hue < 60)
+ b = m1 + (m2 - m1) * hue / 60;
+ else if (hue < 180)
+ b = m2;
+ else if (hue < 240)
+ b = m1 + (m2 - m1) * (240 - hue) / 60;
+ else
+ b = m1;
+
+ *h = r;
+ *l = g;
+ *s = b;
+ }
+
+}
+
+static bool equal( double d1, double d2 ) {
+ return ( fabs( d1 - d2 ) < 0.0001 );
+}
+
+static void shade( const QColor &a, QColor *b, float k ) {
+
+ if ( equal( k, 1.0 ) )
+ * b = a;
+ else {
+ double red = a.red() / 256.0,
+ green = a.green() / 256.0,
+ blue = a.blue() / 256.0;
+
+ rgb2hls( &red, &green, &blue );
+
+ green *= k;
+ if ( green > 1.0 )
+ green = 1.0;
+ else if ( green < 0.0 )
+ green = 0.0;
+
+ blue *= k;
+ if ( blue > 1.0 )
+ blue = 1.0;
+ else if ( blue < 0.0 )
+ blue = 0.0;
+
+ hls2rgb( &red, &green, &blue );
+
+ b->setRgb( limit( red * 256 ), limit( green * 256 ), limit( blue * 256 ) );
+ }
+}
+
+static void shadeGradient( const QColor &base, QColor *vals ) {
+ vals[ KlearlookStyle::GRADIENT_BASE ] = base;
+
+ shade( vals[ KlearlookStyle::GRADIENT_BASE ],
+ &( vals[ KlearlookStyle::GRADIENT_TOP ] ), SHADE_GRADIENT_TOP );
+
+ shade( vals[ KlearlookStyle::GRADIENT_BASE ],
+ &( vals[ KlearlookStyle::GRADIENT_BOTTOM ] ), SHADE_GRADIENT_BOTTOM );
+
+ shade( vals[ KlearlookStyle::GRADIENT_BASE ],
+ &( vals[ KlearlookStyle::GRADIENT_LIGHT ] ), SHADE_GRADIENT_LIGHT );
+ shade( vals[ KlearlookStyle::GRADIENT_BASE ],
+ &( vals[ KlearlookStyle::GRADIENT_DARK ] ), SHADE_GRADIENT_DARK );
+}
+
+static void drawLines( QPainter *p, const QRect &r, bool horiz, int nLines, int offset, const QColor *cols,
+ int startOffset, bool etched, bool lightGradient ) {
+ int space = ( nLines * 2 ) + ( nLines - 1 ),
+ x = horiz ? r.x() : r.x() + ( ( r.width() - space ) >> 1 ),
+ y = horiz ? r.y() + ( ( r.height() - space ) >> 1 ) : r.y(),
+ x2 = r.x() + r.width() - 1,
+ y2 = r.y() + r.height() - 1,
+ i,
+ displacement = etched ? 1 : 0;
+
+ if ( horiz ) {
+ if ( startOffset && y + startOffset > 0 )
+ y += startOffset;
+
+ p->setPen( cols[ etched ? lightGradient ? 3 : 4 : 0 ] );
+ for ( i = 0; i < space; i += 3 )
+ p->drawLine( x + offset, y + i, x2 - ( offset + displacement ), y + i );
+
+ p->setPen( cols[ etched ? 0 : lightGradient ? 3 : 4 ] );
+ for ( i = 1; i < space; i += 3 )
+ p->drawLine( x + offset + displacement, y + i - 2, x2 - offset, y + i - 2);
+ } else {
+ if ( startOffset && x + startOffset > 0 )
+ x += startOffset;
+
+ p->setPen( cols[ etched ? lightGradient ? 3 : 4 : 0 ] );
+ for ( i = 0; i < space; i += 3 )
+ p->drawLine( x + i, y + offset, x + i, y2 - ( offset + displacement ) );
+
+ p->setPen( cols[ etched ? 0 : lightGradient ? 3 : 4 ] );
+ for ( i = 1; i < space; i += 3 )
+ p->drawLine( x + i -2, y + offset + displacement, x + i -2, y2 - offset );
+ }
+}
+
+inline QColor getFill( QStyle::SFlags flags, const QColor *use ) {
+ return !( flags & QStyle::Style_Enabled )
+ ? use[ 1 ]
+ : flags & QStyle::Style_Down
+ ? use[ 3 ]
+ : flags & QStyle::Style_MouseOver
+ ? flags & ( QStyle::Style_On | QStyle::Style_Sunken )
+ ? use[ 3 ].light( QTC_HIGHLIGHT_FACTOR )
+ : use[ NUM_SHADES ].light( QTC_HIGHLIGHT_FACTOR )
+ : flags & ( QStyle::Style_On | QStyle::Style_Sunken )
+ ? use[ 3 ]
+ : use[ NUM_SHADES ];
+}
+
+#ifdef USE_SINGLE_STYLE
+KlearlookStyle::KlearlookStyle()
+#else
+KlearlookStyle::KlearlookStyle(
+ bool gpm, bool bb, bool bf, bool round, EGroove st, h,
+ bool ge, bool va, bool bdt, bool crlh, EDefBtnIndicator dbi, ETBarBorder tbb,
+ ELvExpander lve, ELvLines lvl, bool lvd, bool ico, int popuplvl ) )
+#endif
+: KStyle( AllowMenuTransparency, WindowsStyleScrollBar ),
+themedApp( APP_OTHER ),
+#ifndef USE_SINGLE_STYLE
+borderButton( bb ), borderFrame( bf ), rounded( round ), etchedSlider( etched ), appearance( ge ? APPEARANCE_GRADIENT : APPEARANCE_FLAT ),
+pmProfile( PROFILE_SUNKEN ), vArrow( va ), boldDefText( bdt ), crLabelHighlight( crlh ), lvDark( lvd ),
+defBtnIndicator( dbi ), sliderThumbs( st ), handles( h ), toolbarBorders( tbb ), lvExpander( lve ), lvLines( lvl ), menuIcons( ico ), borderSplitter( true ), popupmenuHighlightLevel(popuplvl)
+#endif
+#if KDE_VERSION >= 0x30200
+isTransKicker( false ),
+#endif
+hover( HOVER_NONE ),
+oldCursor( -1, -1 ),
+formMode( false ),
+hoverWidget( NULL ),
+hoverSect( QTC_NO_SECT ) {
+ QSettings s;
+
+ contrast = s.readNumEntry( "/Qt/KDE/contrast", 7 );
+ if ( contrast < 0 || contrast > 10 )
+ contrast = 7;
+#ifdef USE_SINGLE_STYLE
+
+ borderButton = borderFrame = s.readBoolEntry( "/klearlookstyle/Settings/border", true );
+ rounded = borderButton ? s.readBoolEntry( "/klearlookstyle/Settings/round", true ) : false;
+ menuIcons = s.readBoolEntry( "/klearlookstyle/Settings/icons", true );
+ darkMenubar = s.readBoolEntry( "/klearlookstyle/Settings/darkMenubar", true );
+ popupmenuHighlightLevel = s.readNumEntry( "/klearlookstyle/Settings/popupmenuHighlightLevel", 3);
+
+ QString tmp = s.readEntry( "/klearlookstyle/Settings/toolbarBorders", QString::null );
+ toolbarBorders = tmp.isEmpty()
+ ? TB_LIGHT
+ : qtc_to_tbar_border( tmp.latin1() );
+
+ bool etched = s.readBoolEntry( "/klearlookstyle/Settings/etched", true );
+
+ tmp = s.readEntry( "/klearlookstyle/Settings/sliderThumbs", QString::null );
+ sliderThumbs = tmp.isEmpty()
+ ? etched ? GROOVE_SUNKEN : GROOVE_RAISED
+ : qtc_to_groove( tmp.latin1() );
+
+ tmp = s.readEntry( "/klearlookstyle/Settings/lvExpander", QString::null );
+ lvExpander = tmp.isEmpty()
+ ? LV_EXP_ARR
+ : qtc_to_lv_expander( tmp.latin1() );
+
+ tmp = s.readEntry( "/klearlookstyle/Settings/lvLines", QString::null );
+ lvLines = tmp.isEmpty()
+ ? LV_LINES_SOLID
+ : qtc_to_lv_lines( tmp.latin1() );
+
+
+ lvDark = s.readBoolEntry( "/klearlookstyle/Settings/lvDark", false );
+ handles = qtc_to_groove( s.readEntry( "/klearlookstyle/Settings/sliderThumbs", DEF_HANDLE_STR ).latin1() );
+
+ if ( GROOVE_NONE == handles )
+ handles = GROOVE_RAISED;
+
+ appearance = qtc_to_appearance(
+ s.readEntry( "/klearlookstyle/Settings/appearance", DEF_APPEARANCE_STR ).latin1() );
+ pmProfile = qtc_to_profile( s.readEntry( "/klearlookstyle/Settings/pm", DEF_PROFILE_STR ).latin1() );
+ vArrow = s.readBoolEntry( "/klearlookstyle/Settings/vArrow", false );
+ boldDefText = s.readBoolEntry( "/klearlookstyle/Settings/embolden", false );
+ crLabelHighlight = s.readBoolEntry( "/klearlookstyle/Settings/crLabelHighlight", false );
+ defBtnIndicator = qtc_to_ind(
+ s.readEntry( "/klearlookstyle/Settings/defBtnIndicator", DEF_IND_STR ).latin1() );
+
+ //if(!boldDefText && IND_NONE==defBtnIndicator)
+ // defBtnIndicator=IND_CORNER;
+
+ borderSplitter = s.readBoolEntry( "/klearlookstyle/Settings/borderSplitter", false );
+#endif
+
+ if ( PROFILE_RAISED != pmProfile )
+ shadeColors( qApp->palette().active().highlight(), menuPbar );
+ else
+ shadeGradient( qApp->palette().active().highlight(), menuPbar );
+ shadeColors( qApp->palette().active().background(), gray );
+ shadeColors( qApp->palette().active().button(), button );
+}
+
+void KlearlookStyle::polish( QApplication *app ) {
+ if ( !qstrcmp( app->argv() [ 0 ], "kicker" ) || !qstrcmp( app->argv() [ 0 ], "appletproxy" ) ) {
+ themedApp = APP_KICKER;
+#if KDE_VERSION >= 0x30200
+
+ isTransKicker = rounded && kickerIsTrans();
+#endif
+
+ } else if ( !qstrcmp( app->argv() [ 0 ], "korn" ) ) {
+ themedApp = APP_KORN;
+#if KDE_VERSION >= 0x30200
+
+ isTransKicker = rounded && kickerIsTrans();
+#endif
+
+ } else
+ themedApp = qstrcmp( qApp->argv() [ 0 ], "soffice.bin" ) ? APP_OTHER : APP_OPENOFFICE;
+}
+
+void KlearlookStyle::polish( QPalette &pal ) {
+ int c = QSettings().readNumEntry( "/Qt/KDE/contrast", 7 );
+ bool newContrast = false;
+
+ if ( c < 0 || c > 10 )
+ c = 7;
+
+ if ( c != contrast ) {
+ contrast = c;
+ newContrast = true;
+ }
+
+ if ( newContrast || gray[ NUM_SHADES ] != qApp->palette().active().background() )
+ shadeColors( qApp->palette().active().background(), gray );
+
+ if ( newContrast || button[ NUM_SHADES ] != qApp->palette().active().button() )
+ shadeColors( qApp->palette().active().button(), button );
+
+ if ( PROFILE_RAISED == pmProfile ) {
+ if ( newContrast || menuPbar[ NUM_SHADES ] != qApp->palette().active().highlight() )
+ shadeColors( qApp->palette().active().highlight(), menuPbar );
+ } else
+ if ( qApp->palette().active().highlight() != menuPbar[ GRADIENT_BASE ] )
+ shadeGradient( qApp->palette().active().highlight(), menuPbar );
+
+ const QColorGroup &actGroup = pal.active(),
+ &inactGroup = pal.inactive();
+ const QColor *use = backgroundColors( actGroup );
+ QColorGroup newAct( actGroup.foreground(), actGroup.button(),
+ use[ 0 ], use[ 5 ], actGroup.mid(), actGroup.text(),
+ actGroup.brightText(), actGroup.base(), actGroup.background() );
+
+ newAct.setColor( QColorGroup::Highlight, actGroup.color( QColorGroup::Highlight ) );
+ pal.setActive( newAct );
+
+ use = backgroundColors( inactGroup );
+
+ QColorGroup newInact( inactGroup.foreground(), inactGroup.button(),
+ use[ 0 ], use[ 5 ], inactGroup.mid(), inactGroup.text(),
+ inactGroup.brightText(), inactGroup.base(), inactGroup.background() );
+
+ newInact.setColor( QColorGroup::Highlight, inactGroup.color( QColorGroup::Highlight ) );
+ pal.setInactive( newInact );
+}
+
+static const char * kdeToolbarWidget = "kde toolbar widget";
+
+void KlearlookStyle::polish( QWidget *widget ) {
+ if ( ::qt_cast<QRadioButton *>( widget )
+ || ::qt_cast<QCheckBox *>( widget )
+ || ::qt_cast<QSpinWidget *>( widget )
+ || widget->inherits( "QSplitterHandle" ) ) {
+#if QT_VERSION >= 0x030200
+ widget->setMouseTracking( true );
+#endif
+
+ widget->installEventFilter( this );
+ } else if ( ::qt_cast<QButton *>( widget ) || ::qt_cast<QComboBox *>( widget ) ||
+ widget->inherits( "QToolBarExtensionWidget" ) ) {
+ widget->setBackgroundMode( QWidget::PaletteBackground );
+ widget->installEventFilter( this );
+
+ } else if ( ::qt_cast<QMenuBar *>( widget )
+ || ::qt_cast<QToolBar *>( widget )
+ || ::qt_cast<QPopupMenu *>( widget ) )
+ widget->setBackgroundMode( QWidget::PaletteBackground );
+
+ else if ( widget->inherits( "KToolBarSeparator" ) ) {
+ widget->setBackgroundMode( QWidget::NoBackground );
+ widget->installEventFilter( this );
+
+ } else if ( ::qt_cast<QScrollBar *>( widget ) ) {
+ widget->setMouseTracking( true );
+ widget->installEventFilter( this );
+ widget->setBackgroundMode( QWidget::NoBackground );
+
+ } else if ( ::qt_cast<QSlider *>( widget ) || ::qt_cast<QHeader *>( widget ) ) {
+ widget->setMouseTracking( true );
+ widget->installEventFilter( this );
+
+ } else if ( 0 == qstrcmp( widget->name(), kdeToolbarWidget ) ) {
+ widget->installEventFilter( this );
+ widget->setBackgroundMode( QWidget::NoBackground ); // We paint the whole background.
+ }
+
+ KStyle::polish( widget );
+}
+
+void KlearlookStyle::unPolish( QWidget *widget ) {
+ if ( ::qt_cast<QRadioButton *>( widget ) ||
+ ::qt_cast<QCheckBox *>( widget ) ||
+ ::qt_cast<QSpinWidget *>( widget ) ||
+ widget->inherits( "QSplitterHandle" ) ) {
+#if QT_VERSION >= 0x030200
+ widget->setMouseTracking( false );
+#endif
+
+ widget->removeEventFilter( this );
+ } else if ( ::qt_cast<QButton *>( widget ) || ::qt_cast<QComboBox *>( widget ) ||
+ widget->inherits( "QToolBarExtensionWidget" ) ) {
+ widget->setBackgroundMode( QWidget::PaletteButton );
+ widget->removeEventFilter( this );
+
+ } else if ( ::qt_cast<QMenuBar *>( widget ) ||
+ ::qt_cast<QToolBar *>( widget ) ||
+ ::qt_cast<QPopupMenu *>( widget ) )
+ widget->setBackgroundMode( QWidget::PaletteBackground );
+
+ else if ( widget->inherits( "KToolBarSeparator" ) ) {
+ widget->setBackgroundMode( PaletteBackground );
+ widget->removeEventFilter( this );
+
+ } else if ( ::qt_cast<QScrollBar *>( widget ) ) {
+ widget->setMouseTracking( false );
+ widget->removeEventFilter( this );
+ widget->setBackgroundMode( QWidget::PaletteButton );
+
+ } else if ( ::qt_cast<QSlider *>( widget ) ||
+ ::qt_cast<QHeader *>( widget ) ) {
+ widget->setMouseTracking( false );
+ widget->removeEventFilter( this );
+
+ } else if ( 0 == qstrcmp( widget->name(), kdeToolbarWidget ) ) {
+ widget->removeEventFilter( this );
+ widget->setBackgroundMode( PaletteBackground );
+ }
+
+ KStyle::unPolish( widget );
+}
+
+bool KlearlookStyle::eventFilter( QObject *object, QEvent *event ) {
+ if ( object->parent() && 0 == qstrcmp( object->name(), kdeToolbarWidget ) ) {
+ // Draw background for custom widgets in the toolbar that have specified a "kde toolbar widget" name.
+ if ( QEvent::Paint == event->type() ) {
+ QWidget * widget = static_cast<QWidget*>( object ),
+ *parent = static_cast<QWidget*>( object->parent() );
+#ifdef QTC_GRADIENT_TOOLBARS_AND_MENUBARS
+ // Find the top-level toolbar of this widget, since it may be nested in other
+ // widgets that are on the toolbar.
+ int x_offset = widget->x(),
+ y_offset = widget->y();
+
+ while ( parent && parent->parent() && !qstrcmp( parent->name(), kdeToolbarWidget ) ) {
+ x_offset += parent->x();
+ y_offset += parent->y();
+ parent = static_cast<QWidget*>( parent->parent() );
+ }
+
+ QRect pr( parent->rect() );
+ bool horiz_grad = pr.width() < pr.height();
+
+ // Check if the parent is a QToolbar, and use its orientation, else guess.
+ QToolBar *toolbar = dynamic_cast<QToolBar*>( parent );
+
+ if ( toolbar )
+ horiz_grad = toolbar->orientation() == Qt::Vertical;
+
+ drawBevelGradient( parent->colorGroup().background(), true, 1, &QPainter( widget ),
+ QRect( x_offset, y_offset, pr.width(), pr.height() ),
+ horiz_grad, SHADE_BAR_LIGHT, SHADE_BAR_DARK );
+#else
+
+ QPainter( widget ).fillRect( widget->rect(), parent->colorGroup().background() );
+#endif
+
+ return false; // Now draw the contents
+ }
+ } else if ( object->inherits( "KToolBarSeparator" ) && QEvent::Paint == event->type() ) {
+ QFrame * frame = dynamic_cast<QFrame*>( object );
+
+ if ( frame && QFrame::NoFrame != frame->frameShape() ) {
+ QPainter painter( frame );
+ if ( QFrame::VLine == frame->frameShape() )
+ drawPrimitive( PE_DockWindowSeparator, &painter,
+ frame->rect(), frame->colorGroup(), Style_Horizontal );
+ else if ( QFrame::HLine == frame->frameShape() )
+ drawPrimitive( PE_DockWindowSeparator, &painter,
+ frame->rect(), frame->colorGroup() );
+ else
+ return false;
+ return true; // been drawn!
+ }
+ }
+ switch ( event->type() ) {
+ case QEvent::Enter:
+ if ( object->isWidgetType() ) {
+ hoverWidget = ( QWidget * ) object;
+ if ( hoverWidget && hoverWidget->isEnabled() ) {
+ if ( redrawHoverWidget() ) {
+ hoverWidget->repaint( false );
+ if ( APP_KICKER == themedApp )
+ hover = HOVER_NONE;
+ }
+ oldCursor = QCursor::pos();
+ } else
+ hoverWidget = NULL;
+ }
+ break;
+ case QEvent::Leave:
+ if ( hoverWidget && object == hoverWidget ) {
+ oldCursor.setX( -1 );
+ oldCursor.setY( -1 );
+ hoverWidget = NULL;
+ ( ( QWidget * ) object ) ->repaint( false );
+ }
+ break;
+ case QEvent::MouseMove:
+ if ( hoverWidget && object->isWidgetType() ) {
+ if ( redrawHoverWidget() ) {
+ hoverWidget->repaint( false );
+ if ( APP_KICKER == themedApp )
+ hover = HOVER_NONE;
+ }
+ oldCursor = QCursor::pos();
+ }
+ break;
+ default:
+ break;
+ }
+
+ return KStyle::eventFilter( object, event );
+}
+
+void KlearlookStyle::drawLightBevelButton(
+ QPainter *p,
+ const QRect &r,
+ const QColorGroup &cg,
+ QStyle::SFlags flags,
+ bool useGrad,
+ ERound round,
+ const QColor &fill,
+ const QColor *custom,
+ bool light ) const
+{
+ QRect br( r );
+ bool sunken = ( flags & ( QStyle::Style_Down | QStyle::Style_On | QStyle::Style_Sunken ) );
+ int dark = borderButton ? 4 : 5,
+ c1 = sunken ? dark : light ? 6 : 0;
+
+ p->save();
+
+ if ( !borderButton )
+ br.addCoords( -1, -1, 1, 1 );
+
+ if ( ( sunken && !borderButton ) || ( !sunken && flags & QStyle::Style_Raised ) ) {
+ p->setPen( custom ? custom[ c1 ] : gray[ c1 ] );
+ if ( APPEARANCE_LIGHT_GRADIENT != appearance ) {
+ int c2 = sunken ? 0 : dark;
+
+
+ p->drawLine( br.x() + 1, br.y() + 2, br.x() + 1, br.y() + br.height() - 3 ); // left
+ p->drawLine( br.x() + 1, br.y() + 1, br.x() + br.width() - 2, br.y() + 1 ); // top
+
+ p->setPen( custom ? custom[ c2 ] : gray[ c2 ] );
+ p->drawLine( br.x() + br.width() - 2, br.y() + 1,
+ br.x() + br.width() - 2, br.y() + br.height() - 3 ); // right
+ p->drawLine( br.x() + 1, br.y() + br.height() - 2,
+ br.x() + br.width() - 2, br.y() + br.height() - 2 ); // bottom
+
+ br.addCoords( 2, 2, -2, -2 );
+ } else {
+ p->drawLine( br.x() + 1, br.y() + 2, br.x() + 1, br.y() + br.height() - 2 ); // left
+ p->drawLine( br.x() + 1, br.y() + 1, br.x() + br.width() - 2, br.y() + 1 ); // top
+
+ br.addCoords( 2, 2, -1, -1 );
+ }
+ } else
+ br.addCoords( 1, 1, -1, -1 );
+
+ // fill
+ if ( useGrad && APPEARANCE_FLAT != appearance ) {
+ drawBevelGradient( fill.dark( 100 ), !sunken, 0, p,
+ QRect( br.left() - 1, br.top() - 1, br.width() + 2, br.height() + 2 ), flags & Style_Horizontal,
+ sunken ?
+ SHADE_BEVEL_BUTTON_GRAD_LIGHT( appearance ) :
+ SHADE_BEVEL_BUTTON_GRAD_LIGHT( appearance ),
+ sunken ?
+ SHADE_BEVEL_BUTTON_GRAD_DARK( appearance ) :
+ SHADE_BEVEL_BUTTON_GRAD_DARK( appearance ) );
+ } else
+ p->fillRect( br, fill );
+
+ if ( borderButton )
+ if ( rounded && ROUNDED_NONE != round ) {
+ bool wide = r.width() >= QTC_MIN_BTN_SIZE,
+ tall = r.height() >= QTC_MIN_BTN_SIZE;
+ QColor border( flags & Style_ButtonDefault && IND_FONT_COLOUR == defBtnIndicator & flags & Style_Enabled
+ ? cg.text() : custom ? custom[ 5 ] : gray[ 5 ] );
+
+ p->setPen( border.light(80) );
+ switch ( round ) {
+ case ROUNDED_ALL:
+ p->drawLine( r.x() + 2, r.y(), r.x() + r.width() - 3, r.y() );
+ p->drawLine( r.x() + 2, r.y() + r.height() - 1, r.x() + r.width() - 3,
+ r.y() + r.height() - 1 );
+ p->drawLine( r.x(), r.y() + 2, r.x(), r.y() + r.height() - 3 );
+ p->drawLine( r.x() + r.width() - 1, r.y() + 2, r.x() + r.width() - 1,
+ r.y() + r.height() - 3 );
+ if ( tall && wide ) {
+ p->drawPoint( r.x() + r.width() - 2, r.y() + 1 );
+ p->drawPoint( r.x() + 1, r.y() + r.height() - 2 );
+ p->drawPoint( r.x() + r.width() - 2, r.y() + r.height() - 2 );
+ p->drawPoint( r.x() + 1, r.y() + 1 );
+ p->setPen( midColor( border, cg.background() ) );
+ }
+ if ( !formMode || !( tall && wide ) ) {
+ p->drawLine( r.x(), r.y() + 1, r.x() + 1, r.y() );
+ p->drawLine( r.x() + r.width() - 2, r.y(), r.x() + r.width() - 1, r.y() + 1 );
+ p->drawLine( r.x(), r.y() + r.height() - 2, r.x() + 1, r.y() + r.height() - 1 );
+ p->drawLine( r.x() + r.width() - 2, r.y() + r.height() - 1,
+ r.x() + r.width() - 1, r.y() + r.height() - 2 );
+ }
+ if ( !formMode ) {
+ if ( tall && wide )
+ p->setPen( cg.background() );
+ else
+ p->setPen( midColor( custom ? custom[ 3 ] : gray[ 3 ], cg.background() ) );
+ p->drawPoint( r.x(), r.y() );
+ p->drawPoint( r.x() + r.width() - 1, r.y() );
+ p->drawPoint( r.x(), r.y() + r.height() - 1 );
+ p->drawPoint( r.x() + r.width() - 1, r.y() + r.height() - 1 );
+ }
+ break;
+ case ROUNDED_TOP:
+ p->drawLine( r.x() + 2, r.y(), r.x() + r.width() - 3, r.y() );
+ p->drawLine( r.x() + 1, r.y() + r.height() - 1,
+ r.x() + r.width() - 2, r.y() + r.height() - 1 );
+ p->drawLine( r.x(), r.y() + 2, r.x(), r.y() + r.height() - 1 );
+ p->drawLine( r.x() + r.width() - 1, r.y() + 2,
+ r.x() + r.width() - 1, r.y() + r.height() - 1 );
+ if ( wide ) {
+ p->drawPoint( r.x() + r.width() - 2, r.y() + 1 );
+ p->drawPoint( r.x() + 1, r.y() + 1 );
+ p->setPen( midColor( border, cg.background() ) );
+ }
+ if ( !formMode || !wide ) {
+ p->drawLine( r.x(), r.y() + 1, r.x() + 1, r.y() );
+ p->drawLine( r.x() + r.width() - 2, r.y(), r.x() + r.width() - 1, r.y() + 1 );
+ }
+ if ( !formMode ) {
+ if ( wide )
+ p->setPen( cg.background() );
+ else
+ p->setPen( midColor( custom ? custom[ 3 ] : gray[ 3 ], cg.background() ) );
+ p->drawPoint( r.x(), r.y() );
+ p->drawPoint( r.x() + r.width() - 1, r.y() );
+ }
+ break;
+ case ROUNDED_BOTTOM:
+ p->drawLine( r.x() + 1, r.y(), r.x() + r.width() - 2, r.y() );
+ p->drawLine( r.x() + 2, r.y() + r.height() - 1,
+ r.x() + r.width() - 3, r.y() + r.height() - 1 );
+ p->drawLine( r.x(), r.y(), r.x(), r.y() + r.height() - 3 );
+ p->drawLine( r.x() + r.width() - 1, r.y(),
+ r.x() + r.width() - 1, r.y() + r.height() - 3 );
+ if ( wide ) {
+ p->drawPoint( r.x() + 1, r.y() + r.height() - 2 );
+ p->drawPoint( r.x() + r.width() - 2, r.y() + r.height() - 2 );
+ p->setPen( midColor( border, cg.background() ) );
+ }
+ if ( !formMode || !wide ) {
+ p->drawLine( r.x(), r.y() + r.height() - 2, r.x() + 1, r.y() + r.height() - 1 );
+ p->drawLine( r.x() + r.width() - 2, r.y() + r.height() - 1,
+ r.x() + r.width() - 1, r.y() + r.height() - 2 );
+ }
+ if ( !formMode ) {
+ if ( wide )
+ p->setPen( cg.background() );
+ else
+ p->setPen( midColor( custom ? custom[ 3 ] : gray[ 3 ], cg.background() ) );
+ p->drawPoint( r.x(), r.y() + r.height() - 1 );
+ p->drawPoint( r.x() + r.width() - 1, r.y() + r.height() - 1 );
+ }
+ break;
+ case ROUNDED_LEFT:
+ p->drawLine( r.x() + 2, r.y(), r.x() + r.width() - 2, r.y() );
+ p->drawLine( r.x() + 2, r.y() + r.height() - 1,
+ r.x() + r.width() - 2, r.y() + r.height() - 1 );
+ p->drawLine( r.x(), r.y() + 2, r.x(), r.y() + r.height() - 3 );
+ p->drawLine( r.x() + r.width() - 1, r.y(), r.x() + r.width() - 1,
+ r.y() + r.height() - 1 );
+ if ( tall ) {
+ p->drawPoint( r.x() + 1, r.y() + r.height() - 2 );
+ p->drawPoint( r.x() + 1, r.y() + 1 );
+ p->setPen( midColor( border, cg.background() ) );
+ }
+ if ( !formMode || !tall ) {
+ p->drawLine( r.x(), r.y() + 1, r.x() + 1, r.y() );
+ p->drawLine( r.x(), r.y() + r.height() - 2,
+ r.x() + 1, r.y() + r.height() - 1 );
+ }
+ if ( !formMode ) {
+ if ( tall )
+ p->setPen( cg.background() );
+ else
+ p->setPen( midColor( custom ? custom[ 3 ] : gray[ 3 ], cg.background() ) );
+ p->drawPoint( r.x(), r.y() );
+ p->drawPoint( r.x(), r.y() + r.height() - 1 );
+ }
+ break;
+ case ROUNDED_RIGHT:
+ p->drawLine( r.x() + 1, r.y(), r.x() + r.width() - 3, r.y() );
+ p->drawLine( r.x() + 1, r.y() + r.height() - 1,
+ r.x() + r.width() - 3, r.y() + r.height() - 1 );
+ p->drawLine( r.x(), r.y(), r.x(), r.y() + r.height() - 1 );
+ p->drawLine( r.x() + r.width() - 1, r.y() + 2,
+ r.x() + r.width() - 1, r.y() + r.height() - 3 );
+ if ( tall ) {
+ p->drawPoint( r.x() + r.width() - 2, r.y() + 1 );
+ p->drawPoint( r.x() + r.width() - 2, r.y() + r.height() - 2 );
+ p->setPen( midColor( border, cg.background() ) );
+ }
+ if ( !formMode || !tall ) {
+ p->drawLine( r.x() + r.width() - 2, r.y(), r.x() + r.width() - 1, r.y() + 1 );
+ p->drawLine( r.x() + r.width() - 2, r.y() + r.height() - 1,
+ r.x() + r.width() - 1, r.y() + r.height() - 2 );
+ }
+ if ( !formMode ) {
+ if ( tall )
+ p->setPen( cg.background() );
+ else
+ p->setPen( midColor( custom ? custom[ 3 ] : gray[ 3 ], cg.background() ) );
+ p->drawPoint( r.x() + r.width() - 1, r.y() );
+ p->drawPoint( r.x() + r.width() - 1, r.y() + r.height() - 1 );
+ }
+ break;
+ default:
+ break;
+ }
+ } else {
+ p->setPen( flags & Style_ButtonDefault &&
+ IND_FONT_COLOUR == defBtnIndicator ?
+ cg.text() : custom ? custom[ 5 ] : gray[ 5 ] );
+ p->setBrush( NoBrush );
+ p->drawRect( r );
+ }
+
+ p->restore();
+}
+void KlearlookStyle::drawLightBevel(
+ QPainter *p,
+ const QRect &r,
+ const QColorGroup &cg,
+ QStyle::SFlags flags,
+ bool useGrad,
+ ERound round,
+ const QColor &fill,
+ const QColor *custom,
+ bool light ) const
+{
+ QRect br( r );
+ bool sunken = ( flags & ( QStyle::Style_Down | QStyle::Style_On | QStyle::Style_Sunken ) );
+ int dark = borderButton ? 4 : 5, c1 = sunken ? dark : light ? 6 : 0;
+
+ p->save();
+
+ if ( !borderButton )
+ br.addCoords( -1, -1, 1, 1 );
+
+ if ( ( sunken && !borderButton ) || ( !sunken && flags & QStyle::Style_Raised ) ) {
+ p->setPen( custom ? custom[ c1 ] : gray[ c1 ] );
+ if ( APPEARANCE_LIGHT_GRADIENT != appearance ) {
+ int c2 = sunken ? 0 : dark;
+
+ p->drawLine( br.x() + 1, br.y() + 2, br.x() + 1, br.y() + br.height() - 3 ); // left
+ p->drawLine( br.x() + 1, br.y() + 1, br.x() + br.width() - 2, br.y() + 1 ); // top
+
+ p->setPen( custom ? custom[ c2 ] : gray[ c2 ] );
+ p->drawLine( br.x() + br.width() - 2, br.y() + 1,
+ br.x() + br.width() - 2, br.y() + br.height() - 3 ); // right
+ p->drawLine( br.x() + 1, br.y() + br.height() - 2,
+ br.x() + br.width() - 2, br.y() + br.height() - 2 ); // bottom
+
+ br.addCoords( 2, 2, -2, -2 );
+ } else {
+ p->drawLine( br.x() + 1, br.y() + 2, br.x() + 1, br.y() + br.height() - 2 ); // left
+ p->drawLine( br.x() + 1, br.y() + 1, br.x() + br.width() - 2, br.y() + 1 ); // top
+
+ br.addCoords( 2, 2, -1, -1 );
+ }
+ } else
+ br.addCoords( 1, 1, -1, -1 );
+
+ // fill
+ if ( useGrad && APPEARANCE_FLAT != appearance ) {
+ drawBevelGradient( fill, !sunken, 0, p,
+ QRect( br.left() - 1, br.top() - 1, br.width() + 2, br.height() + 2 ),
+ flags & Style_Horizontal,
+ sunken ?
+ SHADE_BEVEL_GRAD_SEL_LIGHT( appearance ) :
+ SHADE_BEVEL_GRAD_LIGHT( appearance ),
+ sunken ?
+ SHADE_BEVEL_GRAD_SEL_DARK( appearance ) :
+ SHADE_BEVEL_GRAD_DARK( appearance ) );
+ } else {
+ p->fillRect( br, fill );
+ }
+
+ if ( borderButton )
+ if ( rounded && ROUNDED_NONE != round ) {
+ bool wide = r.width() >= QTC_MIN_BTN_SIZE,
+ tall = r.height() >= QTC_MIN_BTN_SIZE;
+
+ QColor border = menuPbar[ GRADIENT_BASE ].dark( 130 );
+
+ p->setPen( border );
+
+ switch ( round ) {
+ case ROUNDED_ALL:
+ p->drawLine( r.x() + 1, r.y(), r.x() + r.width() - 2, r.y() ); // top
+ p->drawLine( r.x() + 1, r.y() + r.height() - 1, r.x() + r.width() - 2, r.y() + r.height() - 1 ); // bottom
+ p->drawLine( r.x(),r.y() + 1, r.x(),r.y() + r.height() - 2 ); // left
+ p->drawLine( r.x() + r.width() - 1, r.y() + 1, r.x() + r.width() - 1, r.y() + r.height() - 2 ); // right
+
+ //p->drawLine( r.x() + 2, r.y() + r.height() - 1, r.x() + r.width() - 3, r.y() + r.height() - 1 );
+
+ //p->drawLine( r.x(), r.y() + 2, r.x(), r.y() + r.height() - 3 );
+ //p->drawLine( r.x() + r.width() - 1, r.y() + 2, r.x() + r.width() - 1, r.y() + r.height() - 3 );
+
+ if ( tall && wide ) {
+ //p->drawPoint( r.x() + r.width() - 2, r.y() + 1 );
+ //p->drawPoint( r.x() + 1, r.y() + r.height() - 2 );
+ //p->drawPoint( r.x() + r.width() - 2, r.y() + r.height() - 2 );
+ //p->drawPoint( r.x() + 1, r.y() + 1 );
+ p->setPen( midColor( border, cg.background() ) );
+ }
+ if ( !formMode || !( tall && wide ) ) {
+ //p->drawLine( r.x(), r.y() + 1, r.x() + 1, r.y() );
+ //p->drawLine( r.x() + r.width() - 2, r.y(), r.x() + r.width() - 1, r.y() + 1 );
+ //p->drawLine( r.x(), r.y() + r.height() - 2, r.x() + 1, r.y() + r.height() - 1 );
+ //p->drawLine( r.x() + r.width() - 2, r.y() + r.height() - 1, r.x() + r.width() - 1, r.y() + r.height() - 2 );
+ }
+ if ( !formMode ) {
+ if ( tall && wide )
+ p->setPen( cg.background() );
+ else
+ p->setPen( midColor( custom ? custom[ 3 ] : gray[ 3 ], cg.background() ) );
+
+ //p->drawPoint( r.x(), r.y() );
+ //p->drawPoint( r.x() + r.width() - 1, r.y() );
+ //p->drawPoint( r.x(), r.y() + r.height() - 1 );
+ //p->drawPoint( r.x() + r.width() - 1, r.y() + r.height() - 1 );
+ }
+ break;
+
+ case ROUNDED_TOP:
+ p->drawLine( r.x() + 2, r.y(), r.x() + r.width() - 3, r.y() );
+ p->drawLine( r.x() + 1, r.y() + r.height() - 1, r.x() + r.width() - 2, r.y() + r.height() - 1 );
+ p->drawLine( r.x(), r.y() + 2, r.x(), r.y() + r.height() - 1 );
+ p->drawLine( r.x() + r.width() - 1, r.y() + 2, r.x() + r.width() - 1, r.y() + r.height() - 1 );
+
+ if ( wide ) {
+ p->drawPoint( r.x() + r.width() - 2, r.y() + 1 );
+ p->drawPoint( r.x() + 1, r.y() + 1 );
+ p->setPen( midColor( border, cg.background() ) );
+ }
+ if ( !formMode || !wide ) {
+ p->drawLine( r.x(), r.y() + 1, r.x() + 1, r.y() );
+ p->drawLine( r.x() + r.width() - 2, r.y(), r.x() + r.width() - 1, r.y() + 1 );
+ }
+ if ( !formMode ) {
+ if ( wide )
+ p->setPen( cg.background() );
+ else
+ p->setPen( midColor( custom ? custom[ 3 ] : gray[ 3 ], cg.background() ) );
+ p->drawPoint( r.x(), r.y() );
+ p->drawPoint( r.x() + r.width() - 1, r.y() );
+ }
+ break;
+ case ROUNDED_BOTTOM:
+ p->drawLine( r.x() + 1, r.y(), r.x() + r.width() - 2, r.y() );
+ p->drawLine( r.x() + 2, r.y() + r.height() - 1, r.x() + r.width() - 3, r.y() + r.height() - 1 );
+ p->drawLine( r.x(), r.y(), r.x(), r.y() + r.height() - 3 );
+ p->drawLine( r.x() + r.width() - 1, r.y(), r.x() + r.width() - 1, r.y() + r.height() - 3 );
+ if ( wide ) {
+ p->drawPoint( r.x() + 1, r.y() + r.height() - 2 );
+ p->drawPoint( r.x() + r.width() - 2, r.y() + r.height() - 2 );
+ p->setPen( midColor( border, cg.background() ) );
+ }
+ if ( !formMode || !wide ) {
+ p->drawLine( r.x(), r.y() + r.height() - 2, r.x() + 1, r.y() + r.height() - 1 );
+ p->drawLine( r.x() + r.width() - 2, r.y() + r.height() - 1,
+ r.x() + r.width() - 1, r.y() + r.height() - 2 );
+ }
+ if ( !formMode ) {
+ if ( wide )
+ p->setPen( cg.background() );
+ else
+ p->setPen( midColor( custom ? custom[ 3 ] : gray[ 3 ], cg.background() ) );
+ p->drawPoint( r.x(), r.y() + r.height() - 1 );
+ p->drawPoint( r.x() + r.width() - 1, r.y() + r.height() - 1 );
+ }
+ break;
+ case ROUNDED_LEFT:
+ p->drawLine( r.x() + 2, r.y(), r.x() + r.width() - 2, r.y() );
+ p->drawLine( r.x() + 2, r.y() + r.height() - 1,
+ r.x() + r.width() - 2, r.y() + r.height() - 1 );
+ p->drawLine( r.x(), r.y() + 2, r.x(), r.y() + r.height() - 3 );
+ p->drawLine( r.x() + r.width() - 1, r.y(), r.x() + r.width() - 1, r.y() + r.height() - 1 );
+ if ( tall ) {
+ p->drawPoint( r.x() + 1, r.y() + r.height() - 2 );
+ p->drawPoint( r.x() + 1, r.y() + 1 );
+ p->setPen( midColor( border, cg.background() ) );
+ }
+ if ( !formMode || !tall ) {
+ p->drawLine( r.x(), r.y() + 1, r.x() + 1, r.y() );
+ p->drawLine( r.x(), r.y() + r.height() - 2, r.x() + 1, r.y() + r.height() - 1 );
+ }
+ if ( !formMode ) {
+ if ( tall )
+ p->setPen( cg.background() );
+ else
+ p->setPen( midColor( custom ? custom[ 3 ] : gray[ 3 ], cg.background() ) );
+ p->drawPoint( r.x(), r.y() );
+ p->drawPoint( r.x(), r.y() + r.height() - 1 );
+ }
+ break;
+ case ROUNDED_RIGHT:
+ p->drawLine( r.x() + 1, r.y(), r.x() + r.width() - 3, r.y() );
+ p->drawLine( r.x() + 1, r.y() + r.height() - 1,
+ r.x() + r.width() - 3, r.y() + r.height() - 1 );
+ p->drawLine( r.x(), r.y(), r.x(), r.y() + r.height() - 1 );
+ p->drawLine( r.x() + r.width() - 1, r.y() + 2, r.x() + r.width() - 1,
+ r.y() + r.height() - 3 );
+ if ( tall ) {
+ p->drawPoint( r.x() + r.width() - 2, r.y() + 1 );
+ p->drawPoint( r.x() + r.width() - 2, r.y() + r.height() - 2 );
+ p->setPen( midColor( border, cg.background() ) );
+ }
+ if ( !formMode || !tall ) {
+ p->drawLine( r.x() + r.width() - 2, r.y(), r.x() + r.width() - 1, r.y() + 1 );
+ p->drawLine( r.x() + r.width() - 2, r.y() + r.height() - 1,
+ r.x() + r.width() - 1, r.y() + r.height() - 2 );
+ }
+ if ( !formMode ) {
+ if ( tall )
+ p->setPen( cg.background() );
+ else
+ p->setPen( midColor( custom ? custom[ 3 ] : gray[ 3 ], cg.background() ) );
+ p->drawPoint( r.x() + r.width() - 1, r.y() );
+ p->drawPoint( r.x() + r.width() - 1, r.y() + r.height() - 1 );
+ }
+ break;
+ default:
+ break;
+ }
+ } else {
+ p->setPen( flags & Style_ButtonDefault &&
+ IND_FONT_COLOUR == defBtnIndicator ? cg.text() : custom ? custom[ 5 ] : gray[ 5 ] );
+ p->setBrush( NoBrush );
+ p->drawRect( r );
+ }
+
+ p->restore();
+}
+
+void KlearlookStyle::drawArrow( QPainter *p, const QRect &r, const QColorGroup &cg, QStyle::SFlags flags,
+ QStyle::PrimitiveElement pe, bool small, bool checkActive ) const {
+ QPointArray a;
+ const QColor &col = flags & Style_Enabled
+ ? checkActive && flags & Style_Active
+ ? cg.highlightedText()
+ : cg.text()
+ : cg.mid();
+
+ if ( vArrow )
+ if ( small )
+ switch ( pe ) {
+ case QStyle::PE_ArrowUp:
+ a.setPoints( 7, 2, 1, 2, 0, 0, -2, -2, 0, -2, 1, -2, 0, 2, 0 );
+ break;
+ case QStyle::PE_ArrowDown:
+ a.setPoints( 7, 2, -1, 2, 0, 0, 2, -2, 0, -2, -1, -2, 0, 2, 0 );
+ break;
+ case QStyle::PE_ArrowRight:
+ a.setPoints( 7, 1, -2, 0, -2, -2, 0, 0, 2, 1, 2, 0, 2, 0, -2 );
+ break;
+ case QStyle::PE_ArrowLeft:
+ a.setPoints( 7, -1, -2, 0, -2, 2, 0, 0, 2, -1, 2, 0, 2, 0, -2 );
+ break;
+ default:
+ return ;
+ }
+ else
+ switch ( pe ) {
+ case QStyle::PE_ArrowUp:
+ a.setPoints( 7, 3, 1, 0, -2, -3, 1, -2, 2, -1, 1, 1, 1, 2, 2 );
+ break;
+ case QStyle::PE_ArrowDown:
+ a.setPoints( 7, 3, -1, 0, 2, -3, -1, -2, -2, -1, -1, 1, -1, 2, -2 );
+ break;
+ case QStyle::PE_ArrowRight:
+ a.setPoints( 7, -1, -3, 2, 0, -1, 3, -2, 2, -1, 1, -1, -1, -2, -2 );
+ break;
+ case QStyle::PE_ArrowLeft:
+ a.setPoints( 7, 1, -3, -2, 0, 1, 3, 2, 2, 1, 1, 1, -1, 2, -2 );
+ break;
+ default:
+ return ;
+ }
+ else
+ if ( small )
+ switch ( pe ) {
+ case QStyle::PE_ArrowUp:
+ a.setPoints( 4, 2, 0, 0, -2, -2, 0, 2, 0 );
+ break;
+ case QStyle::PE_ArrowDown:
+ a.setPoints( 4, 2, 0, 0, 2, -2, 0, 2, 0 );
+ break;
+ case QStyle::PE_ArrowRight:
+ a.setPoints( 4, 0, -2, -2, 0, 0, 2, 0, -2 );
+ break;
+ case QStyle::PE_ArrowLeft:
+ a.setPoints( 4, 0, -2, 2, 0, 0, 2, 0, -2 );
+ break;
+ default:
+ return ;
+ }
+ else
+ switch ( pe ) {
+ case QStyle::PE_ArrowUp:
+ a.setPoints( 4, 3, 1, 0, -2, -3, 1, 3, 1 );
+ break;
+ case QStyle::PE_ArrowDown:
+ a.setPoints( 4, 3, -1, 0, 2, -3, -1, 3, -1 );
+ break;
+ case QStyle::PE_ArrowRight:
+ a.setPoints( 4, -1, -3, 2, 0, -1, 3, -1, -3 );
+ break;
+ case QStyle::PE_ArrowLeft:
+ a.setPoints( 4, 1, -3, -2, 0, 1, 3, 1, -3 );
+ break;
+ default:
+ return ;
+ }
+
+ if ( a.isNull() )
+ return ;
+
+ p->save();
+ a.translate( ( r.x() + ( r.width() >> 1 ) ), ( r.y() + ( r.height() >> 1 ) ) );
+ p->setBrush( col );
+ p->setPen( col );
+ p->drawPolygon( a );
+ p->restore();
+}
+
+void KlearlookStyle::drawPrimitiveMenu( PrimitiveElement pe, QPainter *p, const QRect &r, const QColorGroup &cg,
+ SFlags flags, const QStyleOption &data ) const {
+ switch ( pe ) {
+ case PE_CheckMark:
+ if ( flags & Style_On || !( flags & Style_Off ) ) // !(flags&Style_Off) is for tri-state
+ {
+ QPointArray check;
+ int x = r.center().x() - 3,
+ y = r.center().y() - 3;
+
+ check.setPoints( 6,
+ x, y + 2,
+ x + 2, y + 4,
+ x + 6, y,
+ x + 6, y + 2,
+ x + 2, y + 6,
+ x, y + 4 );
+
+ if ( flags & Style_On ) {
+ if ( flags & Style_Active ) {
+ p->setBrush( cg.highlightedText() );
+ p->setPen( cg.highlightedText() );
+ } else {
+ p->setBrush( cg.text() );
+ p->setPen( cg.text() );
+ }
+ } else {
+ p->setBrush( cg.text() );
+ p->setPen( cg.text() );
+ }
+ p->drawPolygon( check );
+ }
+ break;
+
+ default:
+ KStyle::drawPrimitive( pe, p, r, cg, flags, data );
+ }
+}
+
+void KlearlookStyle::drawPrimitive( PrimitiveElement pe, QPainter *p, const QRect &r, const QColorGroup &cg,
+ SFlags flags, const QStyleOption &data ) const {
+ int x, y, w, h;
+
+ r.rect(&x, &y, &w, &h);
+
+ switch ( pe ) {
+ case PE_HeaderSection: {
+ const QColor * use = buttonColors( cg );
+
+
+ if ( APP_KICKER == themedApp ) {
+ if ( flags & Style_Down )
+ flags = ( ( flags | Style_Down ) ^ Style_Down ) | Style_Sunken;
+ flags |= Style_Enabled;
+#if KDE_VERSION >= 0x30200
+#if KDE_VERSION >= 0x30400
+
+ if ( HOVER_KICKER == hover && hoverWidget ) // && hoverWidget==p->device())
+ flags |= Style_MouseOver;
+#endif
+
+ formMode = isTransKicker;
+#endif
+
+ drawLightBevelButton( p, r, cg, flags | Style_Horizontal,
+ true, ROUNDED_ALL, getFill( flags, use ), use );
+#if KDE_VERSION >= 0x30200
+
+ formMode = false;
+#endif
+
+ } else {
+ flags = ( ( flags | Style_Sunken ) ^ Style_Sunken ) | Style_Raised;
+
+ if ( QTC_NO_SECT != hoverSect && HOVER_HEADER == hover && hoverWidget ) {
+ QHeader * hd = dynamic_cast<QHeader *>( hoverWidget );
+
+ if ( hd && hd->isClickEnabled( hoverSect ) && r == hd->sectionRect( hoverSect ) )
+ flags |= Style_MouseOver;
+ }
+ drawLightBevelButton( p, r, cg, flags | Style_Horizontal,
+ true, ROUNDED_NONE, getFill( flags, use ), use );
+ }
+ break;
+ }
+ case PE_HeaderArrow:
+ drawArrow( p, r, cg, flags, flags & Style_Up ? PE_ArrowUp : PE_ArrowDown );
+ break;
+ case PE_ButtonCommand:
+ case PE_ButtonBevel:
+ case PE_ButtonTool:
+ case PE_ButtonDropDown: {
+ const QColor *use = buttonColors( cg );
+
+ if ( !( flags & QStyle::Style_Sunken ) ) // If its not sunken, its raised-don't want flat buttons.
+ flags |= QStyle::Style_Raised;
+
+ drawLightBevelButton( p, r, cg, flags | Style_Horizontal, true,
+ r.width() < 16 || r.height() < 16
+#if KDE_VERSION >= 0x30200
+ || ( APP_KORN == themedApp && isTransKicker && PE_ButtonTool == pe )
+#endif
+ ? ROUNDED_NONE : ROUNDED_ALL,
+ getFill( flags, use ), use );
+ break;
+ }
+ case PE_ButtonDefault:
+ switch ( defBtnIndicator ) {
+ case IND_BORDER:
+ p->setBrush( NoBrush );
+ if ( rounded ) // borderButton) CPD Only use color[4] for rounded def buttons!
+ {
+ const QColor * use = buttonColors( cg );
+
+ p->setPen( use[ 4 ] );
+ int offset = r.width() >= QTC_MIN_BTN_SIZE && r.height() >= QTC_MIN_BTN_SIZE ? 4 : 3;
+
+ p->drawLine( r.x() + offset, r.y(), r.x() + r.width() - ( 1 + offset ), r.y() );
+ p->drawLine( r.x() + offset, r.y() + r.height() - 1,
+ r.x() + r.width() - ( 1 + offset ), r.y() + r.height() - 1 );
+ p->drawLine( r.x(), r.y() + offset, r.x(), r.y() + r.height() - ( 1 + offset ) );
+ p->drawLine( r.x() + r.width() - 1, r.y() + offset,
+ r.x() + r.width() - 1, r.y() + r.height() - ( 1 + offset ) );
+ } else {
+ p->setPen( cg.text() );
+ p->drawRect( r );
+ }
+ break;
+ case IND_CORNER: {
+ const QColor *use = buttonColors( cg );
+ QPointArray points;
+ bool sunken = flags & Style_Down || flags & QStyle::Style_Sunken;
+ int offset = sunken ? 4 : 3;
+
+ points.setPoints( 3, r.x() + offset, r.y() + offset, r.x() + offset + 6, r.y() + offset,
+ r.x() + offset, r.y() + offset + 6 );
+
+ p->setBrush( use[ sunken ? 0 : borderButton ? 4 : 5 ] );
+ p->setPen( use[ sunken ? 0 : borderButton ? 4 : 5 ] );
+ p->drawPolygon( points );
+ break;
+ }
+ default:
+ break;
+ }
+ break;
+ case PE_IndicatorMask:
+ if ( rounded ) {
+ p->fillRect( r, color0 );
+ p->fillRect( r.x() + 1, r.y() + 1, r.width() - 2, r.height() - 2, color1 );
+ p->setPen( color1 );
+ p->drawLine( r.x() + 1, r.y(), r.x() + r.width() - 2, r.y() );
+ p->drawLine( r.x() + 1, r.y() + r.height() - 1, r.x() + r.width() - 2, r.y() + r.height() - 1 );
+ p->drawLine( r.x(), r.y() + 1, r.x(), r.y() + r.height() - 2 );
+ p->drawLine( r.x() + r.width() - 1, r.y() + 1, r.x() + r.width() - 1, r.y() + r.height() - 2 );
+ } else
+ p->fillRect( r, color1 );
+ break;
+ case PE_CheckMark:
+ if ( flags & Style_On || !( flags & Style_Off ) ) // !(flags&Style_Off) is for tri-state
+ {
+ QPointArray check;
+ int x = r.center().x() - 3,
+ y = r.center().y() - 3;
+
+ check.setPoints( 6,
+ x, y + 2,
+ x + 2, y + 4,
+ x + 6, y,
+ x + 6, y + 2,
+ x + 2, y + 6,
+ x, y + 4 );
+ p->setBrush( flags & Style_On
+ ? flags & Style_Enabled
+ ? flags & Style_Selected
+ ? cg.highlightedText()
+ : cg.text()
+ : cg.mid()
+ : cg.light() );
+ p->setPen( flags & Style_Enabled
+ ? flags & Style_Selected
+ ? cg.highlightedText()
+ : cg.text()
+ : cg.mid() );
+ p->drawPolygon( check );
+ }
+ break;
+ case PE_CheckListController: {
+ QCheckListItem *item = data.checkListItem();
+
+ if ( item ) {
+ QListView * lv = item->listView();
+ int x = r.x(), y = r.y(), w = r.width(), h = r.height(), marg = lv->itemMargin();
+
+ p->setPen( QPen( flags & Style_Enabled ? cg.text()
+ : lv->palette().color( QPalette::Disabled, QColorGroup::Text ) ) );
+
+ if ( flags & Style_Selected && !lv->rootIsDecorated() &&
+ !( ( item->parent() && 1 == item->parent() ->rtti() &&
+ QCheckListItem::Controller == ( ( QCheckListItem* ) item->parent() ) ->type() ) )) {
+ p->fillRect( 0, 0, x + marg + w + 4, item->height(),
+ cg.brush( QColorGroup::Highlight ) );
+ if ( item->isEnabled() )
+ p->setPen( QPen( cg.highlightedText() ) );
+ }
+
+ if ( flags & Style_NoChange )
+ p->setBrush( cg.brush( QColorGroup::Button ) );
+ p->drawRect( x + marg + 2, y + 4 + 2, w - 7, h - 8 );
+ p->drawRect( x + marg, y + 4, w - 7, h - 8 );
+ }
+ break;
+ }
+ case PE_CheckListIndicator: {
+ QCheckListItem *item = data.checkListItem();
+
+ if ( item ) {
+ QListView * lv = item->listView();
+
+ p->setPen( QPen( flags & Style_Enabled ? cg.text()
+ : lv->palette().color( QPalette::Disabled, QColorGroup::Text ), 2 ) );
+ if ( flags & Style_Selected ) {
+ flags -= Style_Selected;
+ if ( !lv->rootIsDecorated() &&
+ !( ( item->parent() && 1 == item->parent() ->rtti() &&
+ QCheckListItem::Controller ==
+ ( ( QCheckListItem* ) item->parent() ) ->type() ) ) ) {
+ p->fillRect( 0, 0, r.x() + lv->itemMargin() + r.width() + 4, item->height(),
+ cg.brush( QColorGroup::Highlight ) );
+ if ( item->isEnabled() ) {
+ p->setPen( QPen( cg.highlightedText(), 2 ) );
+ flags += Style_Selected;
+ }
+ }
+ }
+
+ if ( flags & Style_NoChange )
+ p->setBrush( cg.brush( QColorGroup::Button ) );
+ p->drawRect( r.x() + lv->itemMargin(), r.y() + 2, r.width() - 4, r.width() - 4 );
+ if ( flags & QStyle::Style_On || !( flags & Style_Off ) )
+ drawPrimitive( PE_CheckMark, p, QRect( r.x() + lv->itemMargin(),
+ r.y() + 2, r.width() - 4, r.width() - 4 ), cg, flags );
+ }
+ break;
+ }
+ case PE_Indicator: {
+ const QColor *use = buttonColors( cg );
+ bool on = flags & QStyle::Style_On || !( flags & Style_Off );
+
+ if ( APPEARANCE_FLAT != appearance )
+ drawPrimitive( PE_ButtonTool, p, r, cg, flags );
+ else {
+ p->fillRect( r.x() + 1, r.y() + 2, QTC_CHECK_SIZE - 2, QTC_CHECK_SIZE - 2,
+ flags & Style_Enabled ? cg.base() : cg.background() );
+ p->setPen( use[ 4 ] );
+ p->drawLine( r.x() + 1, r.y() + QTC_CHECK_SIZE - 1, r.x() + 1, r.y() + 1 );
+ p->drawLine( r.x() + 1, r.y() + 1, r.x() + QTC_CHECK_SIZE - 2, r.y() + 1 );
+ }
+ p->setPen( use[ 5 ] );
+ p->setBrush( NoBrush );
+ if ( rounded ) {
+ p->drawLine( r.x() + 1, r.y(), r.x() + r.width() - 2, r.y() );
+ p->drawLine( r.x() + 1, r.y() + r.height() - 1, r.x() + r.width() - 2, r.y() + r.height() - 1 );
+ p->drawLine( r.x(), r.y() + 1, r.x(), r.y() + r.height() - 2 );
+ p->drawLine( r.x() + r.width() - 1, r.y() + 1, r.x() + r.width() - 1, r.y() + r.height() - 2 );
+
+ p->setPen( midColor( use[ 3 ], cg.background() ) );
+ p->drawPoint( r.x(), r.y() );
+ p->drawPoint( r.x(), r.y() + r.width() - 1 );
+ p->drawPoint( r.x() + r.height() - 1, r.y() );
+ p->drawPoint( r.x() + r.height() - 1, r.y() + r.width() - 1 );
+ } else if ( APPEARANCE_FLAT == appearance || borderButton )
+ p->drawRect( r.x(), r.y(), QTC_CHECK_SIZE, QTC_CHECK_SIZE );
+
+ if ( on )
+ drawPrimitive( PE_CheckMark, p, r, cg, flags );
+ break;
+ }
+ case PE_CheckListExclusiveIndicator: {
+ QCheckListItem *item = data.checkListItem();
+
+ if ( item ) {
+ const QColor & bgnd = cg.background(),
+ &on = flags & Style_Enabled
+ ? cg.text()
+ : cg.mid();
+ bool set
+ = flags & QStyle::Style_On;
+ QPointArray outer,
+ inner,
+ aa;
+ int x = r.x(), y = r.y() + 2;
+
+ outer.setPoints( 24, x, y + 8, x, y + 4, x + 1, y + 3, x + 1, y + 2,
+ x + 2, y + 1, x + 3, y + 1, x + 4, y, x + 8, y,
+ x + 9, y + 1, x + 10, y + 1, x + 11, y + 2, x + 11, y + 3,
+ x + 12, y + 4, x + 12, y + 8, x + 11, y + 9, x + 11, y + 10,
+ x + 10, y + 11, x + 9, y + 11, x + 8, y + 12, x + 4, y + 12,
+ x + 3, y + 11, x + 2, y + 11, x + 1, y + 10, x + 1, y + 9 );
+ inner.setPoints( 20, x + 1, y + 8, x + 1, y + 4, x + 2, y + 3, x + 2, y + 2,
+ x + 3, y + 2, x + 4, y + 1, x + 8, y + 1, x + 9, y + 2,
+ x + 10, y + 2, x + 10, y + 3, x + 11, y + 4, x + 11, y + 8,
+ x + 10, y + 9, x + 10, y + 10, x + 9, y + 10, x + 8, y + 11,
+ x + 4, y + 11, x + 3, y + 10, x + 2, y + 10, x + 2, y + 9 );
+ aa.setPoints( 16, x + 2, y + 4, x + 4, y + 2, x + 8, y + 2, x + 10, y + 4,
+ x + 10, y + 8, x + 8, y + 10, x + 4, y + 10, x + 2, y + 8,
+ x, y + 3, x + 3, y, x + 9, y, x + 12, y + 3,
+ x + 12, y + 9, x + 9, y + 12, x + 3, y + 12, x, y + 9 );
+ p->setBrush( on );
+ p->drawPolyline( outer );
+ p->drawPolyline( inner );
+ p->setPen( midColor( on, bgnd, 1.5 ) );
+ p->drawPoints( aa );
+
+ if ( set
+ ) {
+ p->setPen( midColor( on, bgnd ) );
+ p->drawLine( x + 5, y + 4, x + 7, y + 4 );
+ p->drawLine( x + 5, y + 8, x + 7, y + 8 );
+ p->drawLine( x + 4, y + 5, x + 4, y + 7 );
+ p->drawLine( x + 8, y + 5, x + 8, y + 7 );
+ p->setBrush( on );
+ p->setPen( NoPen );
+ p->drawRect( x + 5, y + 5, 3, 3 );
+ }
+ }
+ break;
+ }
+ case PE_ExclusiveIndicator:
+ case PE_ExclusiveIndicatorMask: {
+ int x = r.x(), y = r.y();
+ QPointArray outer;
+ outer.setPoints( 24, x, y + 8, x, y + 4, x + 1, y + 3, x + 1, y + 2,
+ x + 2, y + 1, x + 3, y + 1, x + 4, y, x + 8, y,
+ x + 9, y + 1, x + 10, y + 1, x + 11, y + 2, x + 11, y + 3,
+ x + 12, y + 4, x + 12, y + 8, x + 11, y + 9, x + 11, y + 10,
+ x + 10, y + 11, x + 9, y + 11, x + 8, y + 12, x + 4, y + 12,
+ x + 3, y + 11, x + 2, y + 11, x + 1, y + 10, x + 1, y + 9 );
+
+ if ( PE_ExclusiveIndicatorMask == pe ) {
+ p->fillRect( r, color0 );
+ p->setPen( Qt::color1 );
+ p->setBrush( Qt::color1 );
+ p->drawPolygon( outer );
+ } else {
+ QPointArray shadow;
+ const QColor &bgnd = flags & Style_Enabled ? cg.base() : cg.background(),
+ &on = flags & Style_Enabled
+ ? flags & Style_Selected
+ ? cg.highlightedText()
+ : cg.text()
+ : cg.mid();
+ QColor indBgnd = bgnd;
+ const QColor *use = buttonColors( cg );
+ QColor leftShadowColor,
+ rightShadowColor,
+ outerLeftColor,
+ outerRightColor;
+ bool set
+ = flags & QStyle::Style_On;
+
+ if ( APPEARANCE_FLAT != appearance && !borderButton )
+ shadow.setPoints( 14, x + 1, y + 10, x + 1, y + 9, x, y + 8, x, y + 4,
+ x + 1, y + 3, x + 1, y + 2, x + 2, y + 1, x + 3, y + 1,
+ x + 4, y, x + 8, y, x + 9, y + 1, x + 10, y + 1,
+ x + 11, y + 2, x + 11, y + 3 );
+ else
+ shadow.setPoints( 9, x + 2, y + 11, x + 2, y + 9, x + 1, y + 8, x + 1, y + 4,
+ x + 2, y + 3, x + 2, y + 2, x + 3, y + 2, x + 4, y + 1,
+ x + 8, y + 1 );
+
+ p->fillRect( r, crLabelHighlight && flags & Style_MouseOver
+ ? cg.background().light( QTC_HIGHLIGHT_FACTOR ) : cg.background() );
+
+ if ( APPEARANCE_FLAT != appearance ) {
+ indBgnd = getFill( flags, use );
+ p->setClipRegion( QRegion( outer ) );
+ drawBevelGradient( indBgnd, !set, 0, p,
+ QRect( x + 1, y + 1, r.width() - 2, r.height() - 2 ), true,
+ set ? SHADE_BEVEL_GRAD_SEL_LIGHT( appearance ) : SHADE_BEVEL_GRAD_LIGHT( appearance ),
+ set ? SHADE_BEVEL_GRAD_SEL_DARK( appearance ) : SHADE_BEVEL_GRAD_DARK( appearance ) );
+
+ p->setClipping( false );
+
+ if ( ( !set
+ && !( flags & Style_Down ) ) || !borderButton ) {
+ leftShadowColor = set
+ ? !borderButton ? use[ 5 ] : use[ 4 ] : use[ 0 ];
+ p->setPen( leftShadowColor );
+ p->drawPolyline( shadow );
+
+ if ( APPEARANCE_LIGHT_GRADIENT == appearance )
+ rightShadowColor = indBgnd;
+ else {
+ if ( !borderButton )
+ shadow.setPoints( 10, x + 12, y + 4, x + 12, y + 8, x + 11, y + 9,
+ x + 11, y + 10, x + 10, y + 11, x + 9, y + 11,
+ x + 8, y + 12, x + 4, y + 12, x + 3, y + 11,
+ x + 2, y + 11 );
+ else
+ shadow.setPoints( 9, x + 10, y + 2, x + 10, y + 3, x + 11, y + 4,
+ x + 11, y + 8, x + 10, y + 9, x + 10, y + 10,
+ x + 9, y + 10, x + 8, y + 11, x + 4, y + 11 );
+ rightShadowColor = set
+ ? use[ 0 ] : !borderButton ? use[ 5 ] : use[ 4 ];
+ p->setPen( rightShadowColor );
+ p->drawPolyline( shadow );
+ }
+ }
+ else
+ leftShadowColor = rightShadowColor = indBgnd;
+ } else {
+ rightShadowColor = bgnd;
+ p->setBrush( bgnd );
+ p->setPen( bgnd );
+ p->drawEllipse( x, y, QTC_RADIO_SIZE, QTC_RADIO_SIZE );
+ p->setPen( use[ 4 ] );
+ leftShadowColor = use[ 4 ];
+ p->drawPolyline( shadow );
+ }
+
+ if ( APPEARANCE_FLAT == appearance || borderButton ) {
+ p->setPen( use[ 5 ] );
+ p->drawPolyline( outer );
+ shade( use[ 5 ], &outerRightColor, 1.1 );
+ } else {
+ shade( leftShadowColor, &outerLeftColor, 1.1 );
+ shade( rightShadowColor, &outerRightColor, 1.1 );
+ }
+ if ( set
+ ) {
+ p->setPen( midColor( on, indBgnd ) );
+ p->drawLine( x + 5, y + 4, x + 7, y + 4 );
+ p->drawLine( x + 5, y + 8, x + 7, y + 8 );
+ p->drawLine( x + 4, y + 5, x + 4, y + 7 );
+ p->drawLine( x + 8, y + 5, x + 8, y + 7 );
+ p->setBrush( on );
+ p->setPen( NoPen );
+ p->drawRect( x + 5, y + 5, 3, 3 );
+ }
+
+ if ( !formMode ) {
+ QPointArray outerAaLeft,
+ outerAaRight;
+
+ outerAaLeft.setPoints( 8, x, y + 3, x + 1, y + 1, x + 3, y,
+ x + 9, y, x + 11, y + 1, x + 12, y + 3,
+ x + 1, y + 11, x, y + 9 );
+ outerAaRight.setPoints( 4, x + 12, y + 9, x + 11, y + 11, x + 9, y + 12,
+ x + 3, y + 12 );
+
+ p->setPen( midColor( outerRightColor, cg.background() ) );
+ p->drawPoints( outerAaRight );
+ if ( APPEARANCE_FLAT != appearance && !borderButton )
+ p->setPen( midColor( outerLeftColor, cg.background() ) );
+ p->drawPoints( outerAaLeft );
+ if ( APPEARANCE_LIGHT_GRADIENT == appearance )
+ p->setPen( midColor( indBgnd, use[ 5 ], 1.75 ) );
+ else
+ p->setPen( midColor( use[ 5 ], indBgnd, 1.5 ) );
+
+ if ( APPEARANCE_FLAT != appearance ) {
+ QPointArray innerAa;
+
+ if ( !set
+ && !( flags & Style_Down ) ) {
+ if ( borderButton ) {
+ innerAa.setPoints( 3, x + 1, y + 4, x + 2, y + 2, x + 4, y + 1 );
+ p->drawPoints( innerAa );
+ p->setPen( midColor( outerRightColor, cg.background() ) );
+ p->drawPoint( x + 2, y + 10 );
+ } else {
+ innerAa.setPoints( 4, x + 4, y + 11, x + 8, y + 11, x + 10, y + 10,
+ x + 11, y + 8 );
+ p->drawPoints( innerAa );
+ }
+ }
+ } else {
+ QPointArray innerAa;
+
+ innerAa.setPoints( 6, x + 4, y + 11, x + 8, y + 11, x + 10, y + 10,
+ x + 11, y + 8, x + 11, y + 4, x + 10, y + 2 );
+ p->drawPoints( innerAa );
+ }
+ }
+ }
+ break;
+ }
+ case PE_DockWindowSeparator: {
+ QPoint p1,
+ p2;
+ //const QColor *use=backgroundColors(cg);
+
+ if ( flags & Style_Horizontal ) {
+ int offset = r.height() > 18 ? 6 : r.height() > 12 ? 4 : r.height() > 6 ? 2 : 0;
+
+ p1 = QPoint( r.width() >> 1, 0 + offset );
+ p2 = QPoint( p1.x(), r.height() - offset );
+ } else {
+ int offset = r.width() > 18 ? 6 : r.width() > 12 ? 4 : r.width() > 6 ? 2 : 0;
+
+ p1 = QPoint( 0 + offset, r.height() >> 1 );
+ p2 = QPoint( r.width() - offset, p1.y() );
+ }
+ p->fillRect( r, cg.background() );
+ p->setPen( cg.background().dark( 111 ) );
+ p->drawLine( p1, p2 );
+
+ break;
+ }
+ case PE_Splitter: {
+ const QColor *use = buttonColors( cg );
+
+ if ( hoverWidget && hoverWidget == p->device() )
+ flags |= Style_MouseOver;
+
+ if ( borderSplitter )
+ drawLightBevelButton( p, r, cg, QStyle::Style_Raised, false,
+ ROUNDED_NONE, getFill( flags, use ), use );
+ else {
+ p->fillRect( r,
+ QColor( flags & Style_MouseOver ?
+ cg.background().light( QTC_HIGHLIGHT_FACTOR ) :
+ cg.background() ) );
+ drawLines( p, r, flags & Style_Horizontal, 70, 1, use, 0, TRUE,
+ APPEARANCE_LIGHT_GRADIENT == appearance );
+ }
+ break;
+ }
+ case PE_DockWindowResizeHandle:
+ p->fillRect( r, cg.background() );
+ if ( flags & Style_Horizontal ) {
+ p->setPen( cg.highlight().light() );
+ p->drawLine( r.left() + 1, r.top() + 1, r.right() - 1, r.top() + 1 );
+ p->setPen( cg.highlight() );
+ p->drawLine( r.left() + 1, r.top() + 2, r.right() - 1, r.top() + 2 );
+ p->setPen( cg.highlight().dark() );
+ p->drawLine( r.left() + 1, r.top() + 3, r.right() - 1, r.top() + 3 );
+ } else {
+ p->setPen( cg.highlight().light() );
+ p->drawLine( r.left() + 1, r.top() + 1, r.left() + 1, r.bottom() - 1 );
+ p->setPen( cg.highlight() );
+ p->drawLine( r.left() + 2, r.top() + 1, r.left() + 2, r.bottom() - 1 );
+ p->setPen( cg.highlight().dark() );
+ p->drawLine( r.left() + 3, r.top() + 1, r.left() + 3, r.bottom() - 1 );
+ }
+ break;
+
+ case PE_StatusBarSection: {
+ p->setPen( cg.background().dark(120) );
+ p->drawRect(x-2, y-2, r.width()+3, r.height()+3);
+ break;
+ }
+
+ case PE_PanelLineEdit: {
+ const QColor *use = backgroundColors( cg );
+ p->setPen( use[ 4 ].light(80) );
+ p->drawRect( r );
+ break;
+ }
+
+ case PE_PanelPopup: {
+ const QColor *use = backgroundColors( cg );
+
+ if ( borderFrame && ( data.isDefault() || data.lineWidth() > 1 ) ) {
+ p->setPen( use[ 4 ].light(70) );
+ p->setBrush( NoBrush );
+ drawPopupRect (p, r, cg);
+ //p->drawRect( r );
+#ifdef MENU_POPUP_SHADOW
+
+ qDrawShadePanel( p, r.x() + 1, r.y() + 1, r.width() - 2, r.height() - 2,
+ QColorGroup( use[ 4 ], use[ NUM_SHADES ], use[ 0 ], use[ 4 ], use[ 2 ],
+ cg.text(), use[ NUM_SHADES ] ),
+ flags & Style_Sunken,
+ data.isDefault() ? QTC_BORDERED_FRAME_WIDTH - 1 : data.lineWidth() - 1 );
+#endif
+
+ } else
+ qDrawShadePanel( p, r,
+ QColorGroup(
+ use[ 5 ], use[ NUM_SHADES ], use[ 0 ], use[ 5 ], use[ 2 ],
+ cg.text(), use[ NUM_SHADES ]
+ ),
+ flags & Style_Sunken, data.isDefault() ? QTC_DEF_FRAME_WIDTH : data.lineWidth() );
+ break;
+ }
+ case PE_PanelTabWidget: {
+ const QColor *use = backgroundColors( cg );
+
+ if ( borderFrame && ( data.isDefault() || data.lineWidth() > 1 ) ) {
+ p->setPen( use[ 4 ] );
+ p->setBrush( NoBrush );
+ p->drawRect( r );
+#ifdef MENU_POPUP_SHADOW
+
+ qDrawShadePanel( p, r.x() + 1, r.y() + 1, r.width() - 2, r.height() - 2,
+ QColorGroup( use[ 4 ], use[ NUM_SHADES ], use[ 0 ], use[ 4 ], use[ 2 ],
+ cg.text(), use[ NUM_SHADES ] ),
+ flags & Style_Sunken,
+ data.isDefault() ? QTC_BORDERED_FRAME_WIDTH - 1 : data.lineWidth() - 1 );
+#endif
+
+ } else
+ qDrawShadePanel( p, r,
+ QColorGroup(
+ use[ 5 ], use[ NUM_SHADES ], use[ 0 ], use[ 5 ], use[ 2 ],
+ cg.text(), use[ NUM_SHADES ]
+ ),
+ flags & Style_Sunken, data.isDefault() ? QTC_DEF_FRAME_WIDTH : data.lineWidth() );
+ break;
+ }
+ case PE_PanelDockWindow:
+ case PE_PanelMenuBar: {
+ const QColor *use = backgroundColors( cg );
+ switch ( toolbarBorders ) {
+ case TB_DARK:
+ qDrawShadePanel( p,
+ r.x(), r.y(), r.width(), r.height(),
+ QColorGroup(
+ use[ 5 ].dark( 120 ), use[ NUM_SHADES ], use[ 0 ],
+ use[ 5 ].dark( 120 ), use[ 2 ],
+ cg.text(), use[ NUM_SHADES ] ),
+ flags & Style_Sunken, 1
+ );
+
+#ifdef QTC_GRADIENT_TOOLBARS_AND_MENUBARS
+
+ if ( APPEARANCE_FLAT != appearance )
+ drawBevelGradient( use[ NUM_SHADES ],
+ true, 1, p, r, true,
+ SHADE_BAR_LIGHT, SHADE_BAR_DARK
+ );
+#endif
+
+ break;
+ case TB_LIGHT:
+ qDrawShadePanel( p,
+ r.x(), r.y(), r.width(), r.height(),
+ QColorGroup(
+ use[ 3 ], use[ NUM_SHADES ], use[ 0 ],
+ use[ 3 ], use[ 2 ],
+ cg.text(), use[ NUM_SHADES ]
+ ),
+ flags & Style_Sunken, 1
+ );
+
+#ifdef QTC_GRADIENT_TOOLBARS_AND_MENUBARS
+
+ if ( APPEARANCE_FLAT != appearance )
+ drawBevelGradient( use[ NUM_SHADES ],
+ true, 1, p, r, true,
+ SHADE_BAR_LIGHT, SHADE_BAR_DARK );
+#endif
+
+ break;
+ case TB_NONE:
+ break;
+
+ } /* switch */
+
+ break;
+ }
+ case PE_ScrollBarAddLine:
+ case PE_ScrollBarSubLine: {
+ bool down = ( flags & ( QStyle::Style_Down | QStyle::Style_On | QStyle::Style_Sunken ) );
+ const QColor *use = buttonColors( cg );
+
+ pe = flags & Style_Horizontal
+ ? PE_ScrollBarAddLine == pe
+ ? PE_ArrowRight
+ : PE_ArrowLeft
+ : PE_ScrollBarAddLine == pe
+ ? PE_ArrowDown
+ : PE_ArrowUp;
+
+ drawLightBevelButton( p, r, cg,
+ down ? flags : flags | ( ( ( flags & Style_Enabled ) ? Style_Raised : Style_Default ) ),
+ true,
+ PE_ArrowRight == pe ? ROUNDED_RIGHT :
+ PE_ArrowLeft == pe ? ROUNDED_LEFT :
+ PE_ArrowDown == pe ? ROUNDED_BOTTOM :
+ PE_ArrowUp == pe ? ROUNDED_TOP : ROUNDED_NONE,
+ getFill( flags, use ), use );
+ drawPrimitive( pe, p, r, cg, flags );
+ break;
+ }
+ case PE_ScrollBarSubPage:
+ case PE_ScrollBarAddPage: {
+ const QColor *use = backgroundColors( cg );
+
+ if ( borderButton ) {
+ if ( flags & Style_Horizontal ) {
+ p->fillRect( r.x(), r.y() + 1, r.width(), r.height() - 2, use[ 2 ] );
+ p->setPen( use[ 5 ] );
+ p->drawLine( r.left(), r.top(), r.right(), r.top() );
+ p->drawLine( r.left(), r.bottom(), r.right(), r.bottom() );
+ } else {
+ p->fillRect( r.x() + 1, r.y(), r.width() - 2, r.height(), use[ 2 ] );
+ p->setPen( use[ 5 ] );
+ p->drawLine( r.left(), r.top(), r.left(), r.bottom() );
+ p->drawLine( r.right(), r.top(), r.right(), r.bottom() );
+ }
+ } else
+ p->fillRect( r.x(), r.y(), r.width(), r.height(), use[ 2 ] );
+ break;
+ }
+ case PE_ScrollBarSlider: {
+ const QColor *use = buttonColors( cg );
+
+
+
+ if ( flags & Style_Down )
+ flags -= Style_Down;
+ flags |= flags & Style_Enabled ? Style_Raised : Style_Default;
+
+ drawLightBevelButton( p, r, cg, flags, true, ROUNDED_NONE, getFill( flags, use ), use );
+
+ if ( GROOVE_NONE != sliderThumbs &&
+ ( ( flags & Style_Horizontal && r.width() >= 20 ) || r.height() >= 20 ) )
+ drawLines( p, r, !( flags & Style_Horizontal ), 3, 4, use, 0, GROOVE_SUNKEN == sliderThumbs,
+ APPEARANCE_LIGHT_GRADIENT == appearance );
+ break;
+ }
+ case PE_FocusRect: {
+ p->drawWinFocusRect( r, cg.background() );
+ break;
+ }
+ case PE_ArrowUp:
+ case PE_ArrowDown:
+ case PE_ArrowRight:
+ case PE_ArrowLeft:
+ drawArrow( p, r, cg, flags, pe );
+ break;
+ case PE_SpinWidgetUp:
+ case PE_SpinWidgetDown: {
+ QRect sr( r );
+ const QColor *use = buttonColors( cg );
+
+ drawLightBevelButton( p, sr, cg,
+ flags | Style_Horizontal, true, PE_SpinWidgetDown == pe ? ROUNDED_BOTTOM : ROUNDED_TOP,
+ getFill( flags, use ), use );
+
+ if ( vArrow ) {
+ if ( PE_SpinWidgetDown == pe )
+ sr.setY( sr.y() - 1 );
+ } else
+ sr.setY( sr.y() + ( PE_SpinWidgetDown == pe ? -2 : 1 ) );
+
+ drawArrow( p, sr, cg, flags, pe == PE_SpinWidgetUp ? PE_ArrowUp : PE_ArrowDown, true );
+ break;
+ }
+ default:
+ KStyle::drawPrimitive( pe, p, r, cg, flags, data );
+ }
+}
+
+void KlearlookStyle::drawKStylePrimitive( KStylePrimitive kpe, QPainter *p, const QWidget *widget, const QRect &r,
+ const QColorGroup &cg, SFlags flags, const QStyleOption &opt ) const {
+ switch ( kpe ) {
+ case KPE_ToolBarHandle:
+ case KPE_GeneralHandle:
+ drawLines( p, r, !( flags & Style_Horizontal ), 2,
+ APP_KICKER == themedApp ? 1 : KPE_ToolBarHandle == kpe ? 4 : 2, gray,
+ APP_KICKER == themedApp ? 1 : KPE_ToolBarHandle == kpe ? -2 : 0, GROOVE_SUNKEN == handles,
+ APPEARANCE_LIGHT_GRADIENT == appearance );
+ break;
+ case KPE_SliderGroove:
+ drawSliderGroove( p, r, flags, widget );
+ break;
+ case KPE_SliderHandle:
+ drawSliderHandle( p, r, cg, flags );
+ break;
+ case KPE_ListViewExpander: {
+ int lvSize = QTC_LV_SIZE( lvExpander );
+ QRect ar( r.x() + ( ( r.width() - ( lvSize + 4 ) ) >> 1 ),
+ r.y() + ( ( r.height() - ( lvSize + 4 ) ) >> 1 ), lvSize + 4, lvSize + 4 );
+
+ p->setPen( /*lvDark ? cg.text() : */cg.mid() );
+
+ if ( LV_LINES_NONE != lvLines ) {
+ int lo = rounded ? 2 : 0;
+
+ p->drawLine( ar.x() + lo, ar.y(), ( ar.x() + ar.width() - 1 ) - lo, ar.y() );
+ p->drawLine( ar.x() + lo, ar.y() + ar.height() - 1,
+ ( ar.x() + ar.width() - 1 ) - lo, ar.y() + ar.height() - 1 );
+ p->drawLine( ar.x(), ar.y() + lo, ar.x(), ( ar.y() + ar.height() - 1 ) - lo );
+ p->drawLine( ar.x() + ar.width() - 1,
+ ar.y() + lo, ar.x() + ar.width() - 1, ( ar.y() + ar.height() - 1 ) - lo );
+
+ if ( rounded ) {
+ p->drawPoint( ar.x() + 1, ar.y() + 1 );
+ p->drawPoint( ar.x() + 1, ar.y() + ar.height() - 2 );
+ p->drawPoint( ar.x() + ar.width() - 2, ar.y() + 1 );
+ p->drawPoint( ar.x() + ar.width() - 2, ar.y() + ar.height() - 2 );
+ p->setPen( midColor( /*lvDark ? cg.text() : */cg.mid(), cg.background() ) );
+ p->drawLine( ar.x(), ar.y() + 1, ar.x() + 1, ar.y() );
+ p->drawLine( ar.x() + ar.width() - 2, ar.y(), ar.x() + ar.width() - 1, ar.y() + 1 );
+ p->drawLine( ar.x(), ar.y() + ar.height() - 2, ar.x() + 1, ar.y() + ar.height() - 1 );
+ p->drawLine( ar.x() + ar.width() - 2, ar.y() + ar.height() - 1,
+ ar.x() + ar.width() - 1, ar.y() + ar.height() - 2 );
+ }
+ }
+
+ if ( LV_EXP_ARR == lvExpander )
+ drawArrow( p, ar, cg, flags | Style_Enabled, flags & Style_On // Collapsed = On
+ ? QApplication::reverseLayout()
+ ? PE_ArrowLeft
+ : PE_ArrowRight
+ : PE_ArrowDown );
+ else {
+ int xo = ( ar.width() - lvSize ) >> 1,
+ yo = ( ar.height() - lvSize ) >> 1;
+ int mid = lvSize >> 1;
+
+ p->setPen( cg.text() );
+ p->drawLine( ar.x() + xo + ( mid - 2 ), ar.y() + yo + mid,
+ ar.x() + xo + lvSize - ( mid - 1 ), ar.y() + yo + mid );
+ if ( flags & Style_On ) // Collapsed = On
+ p->drawLine( ar.x() + xo + mid, ar.y() + yo + ( mid - 2 ),
+ ar.x() + xo + mid, ar.y() + yo + lvSize - ( mid - 1 ) );
+ }
+ break;
+ }
+ case KPE_ListViewBranch:
+ switch ( lvLines ) {
+ case LV_LINES_NONE:
+ break;
+ case LV_LINES_DOTTED:
+ // Taken and modified (colour wise) from kstyle.cpp - which in turn comes from
+ // qwindowsstyl.cpp
+ {
+ static QBitmap *verticalLine = 0,
+ *horizontalLine = 0;
+ static QCleanupHandler<QBitmap> lvCleanupBitmap;
+
+ // Create the dotline pixmaps if not already created
+ if ( !verticalLine ) {
+ // make 128*1 and 1*128 bitmaps that can be used for drawing the right sort of lines.
+ verticalLine = new QBitmap( 1, 129, true );
+ horizontalLine = new QBitmap( 128, 1, true );
+ QPointArray a( 64 );
+ QPainter p2;
+
+ p2.begin( verticalLine );
+
+ int i;
+ for ( i = 0; i < 64; i++ )
+ a.setPoint( i, 0, i * 2 + 1 );
+
+ p2.setPen( color1 );
+ p2.drawPoints( a );
+ p2.end();
+ QApplication::flushX();
+ verticalLine->setMask( *verticalLine );
+
+ p2.begin( horizontalLine );
+
+ for ( i = 0; i < 64; i++ )
+ a.setPoint( i, i * 2 + 1, 0 );
+
+ p2.setPen( color1 );
+ p2.drawPoints( a );
+ p2.end();
+ QApplication::flushX();
+ horizontalLine->setMask( *horizontalLine );
+
+ lvCleanupBitmap.add( &verticalLine );
+ lvCleanupBitmap.add( &horizontalLine );
+ }
+
+ p->setPen( lvDark ? cg.text() : cg.mid() ); // Wow, my big modification...
+
+ if ( flags & Style_Horizontal ) {
+ int point = r.x(),
+ other = r.y(),
+ end = r.x() + r.width(),
+ thickness = r.height();
+
+ while ( point < end ) {
+ int i = 128;
+
+ if ( i + point > end )
+ i = end - point;
+ p->drawPixmap( point, other, *horizontalLine, 0, 0, i, thickness );
+ point += i;
+ }
+ } else {
+ int point = r.y(),
+ other = r.x(),
+ end = r.y() + r.height(),
+ thickness = r.width(),
+ pixmapoffset = ( flags & Style_NoChange ) ? 0 : 1; // ### Hackish
+
+ while ( point < end ) {
+ int i = 128;
+
+ if ( i + point > end )
+ i = end - point;
+ p->drawPixmap( other, point, *verticalLine, 0, pixmapoffset, thickness, i );
+ point += i;
+ }
+ }
+ break;
+ }
+ case LV_LINES_SOLID:
+ p->setPen( cg.mid() );
+ p->drawLine( r.x(), r.y(), r.x() + r.width() - 1, r.y() + r.height() - 1 );
+ break;
+ }
+ break;
+ default:
+ KStyle::drawKStylePrimitive( kpe, p, widget, r, cg, flags, opt );
+ }
+}
+
+void KlearlookStyle::drawControl(
+ ControlElement control,
+ QPainter *p,
+ const QWidget *widget,
+ const QRect &r,
+ const QColorGroup &cg, SFlags flags, const QStyleOption &data ) const
+{
+ if ( widget == hoverWidget )
+ flags |= Style_MouseOver;
+
+ switch ( control ) {
+ case CE_TabBarTab: {
+ const QTabBar * tb = ( const QTabBar * ) widget;
+ bool cornerWidget = false,
+ firstTab = 0 == tb->indexOf( data.tab() ->identifier() );
+
+ if ( ::qt_cast<const QTabWidget *>( tb->parent() ) ) {
+ const QTabWidget * tw = ( const QTabWidget* ) tb->parent();
+
+ // is there a corner widget in the (top) left edge?
+ if ( tw->cornerWidget( Qt::TopLeft ) )
+ cornerWidget = true;
+ }
+
+ if ( borderFrame ) {
+ QRect tr( r ),
+ fr( r );
+ int offset = rounded ? 2 : 0;
+
+ switch ( tb->shape() ) {
+ case QTabBar::TriangularAbove:
+ case QTabBar::RoundedAbove:
+ if ( flags & Style_Selected ) {
+ tr.addCoords( 0, 0, 0, -1 );
+ fr.addCoords( 2, 2, -2, -2 );
+ p->setPen( gray[ 5 ] );
+ p->drawLine( tr.left(),
+ firstTab && !cornerWidget ?
+ tr.bottom() + 1 : tr.bottom(), tr.left(),
+ tr.top() + offset );
+ p->drawLine( tr.left() + offset, tr.top(), tr.right() - offset, tr.top() );
+ p->drawLine( tr.right(), tr.top() + 1, tr.right(), tr.bottom() );
+
+ p->setPen( gray[ 0 ] );
+ p->drawLine( tr.left() + 1, tr.bottom() + 1, tr.left() + 1, tr.top() + 2 );
+ p->drawLine( tr.left() + 1, tr.top() + 1, tr.right() - 1, tr.top() + 1 );
+ p->drawLine( tr.right() - 1, tr.bottom() + 1, tr.right(), tr.bottom() + 1 );
+
+ if ( cornerWidget )
+ p->drawPoint( tr.left(), tr.bottom() + 1 );
+
+ p->setPen( gray[ 4 ] );
+ p->drawLine( tr.right() - 1, tr.top() + 1, tr.right() - 1, tr.bottom() );
+
+ if ( rounded ) {
+ p->setPen( gray[ 5 ] );
+ p->drawPoint( tr.x() + 1, tr.y() + 1 );
+ p->drawPoint( tr.x() + tr.width() - 2, tr.y() + 1 );
+ p->setPen( gray[ 4 ] );
+ p->drawLine( tr.x(), tr.y() + 1, tr.x() + 1, tr.y() );
+ p->drawLine( tr.x() + tr.width() - 2,
+ tr.y(), tr.x() + tr.width() - 1, tr.y() + 1 );
+ }
+ } else {
+ tr.addCoords( 0, 2, 0, -1 );
+ fr.addCoords( 2, 4, -2, -2 );
+
+ p->setPen( gray[ 5 ] );
+ p->drawLine( tr.left(),
+ firstTab && !cornerWidget ? tr.bottom() + 1 : tr.bottom(), tr.left(),
+ tr.top() + 1 );
+ p->drawLine( rounded ? tr.left() + 1 : tr.left(),
+ tr.top(), rounded ? tr.right() - 1 : tr.right(), tr.top() );
+ p->drawLine( tr.right(), tr.top() + 1, tr.right(), tr.bottom() );
+ p->drawLine( tr.left(), tr.bottom(), tr.right(), tr.bottom() );
+ p->setPen( gray[ 0 ] );
+ p->drawLine( tr.left() + 1, tr.top() + 1, tr.right() - 1, tr.top() + 1 );
+
+ if ( cornerWidget )
+ p->drawPoint( tr.left(), tr.bottom() + 1 );
+
+ if ( !firstTab )
+ p->setPen( gray[ 2 ] );
+
+ p->drawLine( tr.left() + 1, tr.bottom() - 1, tr.left() + 1, tr.top() + 2 );
+ p->setPen( gray[ 0 ] );
+ p->drawLine( tr.left() + 1, tr.bottom() + 1, tr.right(), tr.bottom() + 1 );
+ p->setPen( gray[ 4 ] );
+ p->drawLine( tr.right() - 1, tr.top() + 1, tr.right() - 1, tr.bottom() - 1 );
+ }
+
+ if ( APPEARANCE_FLAT != appearance ) {
+ if ( flags & Style_Selected ) {
+ drawBevelGradient( cg.background(), true, 0, p, fr, true,
+ SHADE_TAB_SEL_LIGHT( appearance ),
+ SHADE_TAB_SEL_DARK( appearance ) );
+
+ p->setPen(menuPbar[ GRADIENT_BASE ]);
+ p->drawLine( fr.left()-1, fr.top()-1, fr.right()+1, fr.top()-1);
+ p->drawLine( fr.left()-1, fr.top(), fr.right()+1, fr.top());
+
+ p->setPen(menuPbar[ GRADIENT_DARK ].dark(118));
+ p->drawLine( fr.left(), fr.top()-2, fr.right(), fr.top()-2);
+ p->drawPoint( tr.x() + 1, tr.y() + 1 );
+ p->drawPoint( tr.x(), tr.y() + 2 );
+ p->drawPoint( tr.x() + tr.width() - 2, tr.y() + 1 );
+ p->drawPoint( tr.x() + tr.width() - 1, tr.y() + 2 );
+
+ } else
+ drawBevelGradient( gray[ 2 ], true, 0, p, fr, true,
+ SHADE_TAB_LIGHT( appearance ), SHADE_TAB_DARK( appearance ) );
+
+
+ } else
+ p->fillRect( fr, flags & Style_Selected ? cg.background() : gray[ 2 ] );
+
+ break;
+ case QTabBar::TriangularBelow:
+ case QTabBar::RoundedBelow:
+ if ( flags & Style_Selected ) {
+ fr.addCoords( 3, 2, -3, -3 );
+ p->setPen( gray[ 5 ] );
+
+ p->drawLine( tr.left(), tr.bottom() - offset, tr.left(),
+ firstTab && !cornerWidget ? tr.top() : tr.top() + 1 );
+ p->drawLine( rounded ? tr.left() + 1 : tr.left(),
+ tr.bottom(), tr.right() - offset, tr.bottom() );
+ p->drawLine( tr.right(), tr.top() + 1, tr.right(), tr.bottom() - 1 );
+ p->setPen( gray[ 0 ] );
+ p->drawLine( tr.left() + 1, tr.bottom() - 2, tr.left() + 1,
+ firstTab && !cornerWidget ? tr.top() : tr.top() - 1 );
+ p->setPen( gray[ 4 ] );
+ p->drawLine( tr.left() + 1, tr.bottom() - 1, tr.right() - 1, tr.bottom() - 1 );
+ p->drawLine( tr.right() - 1, tr.bottom() - 2, tr.right() - 1, tr.top() - 1 );
+ p->drawPoint( tr.right(), tr.top() );
+ if ( cornerWidget )
+ p->drawPoint( tr.left(), tr.top() );
+
+
+ if ( rounded ) {
+ p->setPen( gray[ 5 ] );
+ p->drawPoint( tr.x() + 1, tr.y() + tr.height() - 2 );
+ p->drawPoint( tr.x() + tr.width() - 2, tr.y() + tr.height() - 2 );
+ p->setPen( gray[ 4 ] );
+ p->drawLine( tr.x(), tr.y() + tr.height() - 2,
+ tr.x() + 1, tr.y() + tr.height() - 1 );
+ p->drawLine( tr.x() + tr.width() - 2,
+ tr.y() + tr.height() - 1, tr.x() + tr.width() - 1,
+ tr.y() + tr.height() - 2 );
+ }
+ } else {
+ tr.addCoords( 0, 1, 0, -2 );
+ fr.addCoords( 1, 2, -2, -4 );
+
+ p->setPen( gray[ 5 ] );
+ p->drawLine( tr.left(), tr.bottom() - 1, tr.left(),
+ firstTab && !cornerWidget ? tr.top() : tr.top() + 1 );
+ p->drawLine( rounded ? tr.left() + 1 : tr.left(), tr.bottom(),
+ rounded ? tr.right() - 1 : tr.right(), tr.bottom() );
+ p->drawLine( tr.right(), tr.top() + 1, tr.right(), tr.bottom() - 1 );
+ p->drawLine( tr.right(), tr.top(), tr.left(), tr.top() );
+ p->setPen( gray[ 4 ] );
+ p->drawLine( tr.left(), tr.top() - 1, tr.right(), tr.top() - 1 );
+ p->drawLine( tr.left() + 1, tr.bottom() - 1, tr.right() - 1, tr.bottom() - 1 );
+ p->drawLine( tr.right() - 1, tr.bottom() - 2, tr.right() - 1, tr.top() + 1 );
+ }
+ if ( APPEARANCE_FLAT != appearance )
+ if ( flags & Style_Selected )
+ drawBevelGradient( cg.background(), false, -1, p, fr, true,
+ SHADE_BOTTOM_TAB_SEL_DARK( appearance ),
+ SHADE_BOTTOM_TAB_SEL_LIGHT( appearance ) );
+ else
+ drawBevelGradient( gray[ 2 ], false, 0, p, fr, true,
+ SHADE_BOTTOM_TAB_DARK( appearance ),
+ SHADE_BOTTOM_TAB_LIGHT( appearance ) );
+ else
+ p->fillRect( fr, flags & Style_Selected ? cg.background() : gray[ 2 ] );
+ break;
+ default:
+ KStyle::drawControl( control, p, widget, r, cg, flags, data );
+ }
+ } else {
+ QRect br( r );
+
+ switch ( tb->shape() ) {
+ case QTabBar::TriangularAbove:
+ case QTabBar::RoundedAbove:
+ if ( flags & Style_Selected ) {
+ p->setPen( cg.background() );
+ p->drawLine( br.bottomLeft(), br.bottomRight() );
+ p->setPen( gray[ 0 ] );
+ p->drawPoint( br.bottomLeft() );
+ p->setPen( gray[ 5 ] );
+ p->drawPoint( br.bottomRight() );
+ br.addCoords( 0, 0, 0, -1 );
+ } else {
+ p->setPen( gray[ 0 ] );
+ p->drawLine( br.left(), br.bottom(), br.right(), br.bottom() );
+ br.addCoords( 0, 1, -1, -1 );
+ }
+
+ p->setPen( gray[ 0 == r.left() || flags & Style_Selected ? 0 : 5 ] );
+ p->drawLine( br.bottomLeft(), br.topLeft() );
+ p->setPen( gray[ 0 ] );
+ p->drawLine( br.left() + 1, br.top(), br.right() - 1, br.top() );
+ p->setPen( gray[ 5 ] );
+ p->drawLine( br.right(), br.top(), br.right(), br.bottom() );
+ br.addCoords( 1, 1, -1, 0 );
+ if ( APPEARANCE_FLAT != appearance )
+ if ( flags & Style_Selected )
+ drawBevelGradient( cg.background(), true, 0, p, br,
+ true, SHADE_TAB_SEL_LIGHT( appearance ),
+ SHADE_TAB_SEL_DARK( appearance ) );
+ else
+ drawBevelGradient( gray[ 2 ], true, 0, p, br, true,
+ SHADE_TAB_LIGHT( appearance ), SHADE_TAB_DARK( appearance ) );
+ else
+ p->fillRect( br, flags & Style_Selected ? cg.background() : gray[ 2 ] );
+ break;
+ case QTabBar::TriangularBelow:
+ case QTabBar::RoundedBelow:
+ if ( flags & Style_Selected ) {
+ p->setPen( cg.background() );
+ p->drawLine( br.topLeft(), br.topRight() );
+ p->setPen( gray[ 0 ] );
+ p->drawPoint( br.topLeft() );
+ p->setPen( gray[ 5 ] );
+ p->drawPoint( br.topRight() );
+ br.addCoords( 0, 1, 0, 0 );
+ } else {
+ p->setPen( gray[ 5 ] );
+ p->drawLine( br.left(), br.top(),
+ br.right(), br.top() );
+ br.addCoords( 0, 1, -1, -1 );
+ }
+
+ if ( 0 == r.left() || flags & Style_Selected ) {
+ p->setPen( gray[ 0 ] );
+ p->drawLine( br.bottomLeft(), br.topLeft() );
+ }
+ p->setPen( gray[ 5 ] );
+ p->drawLine( br.bottomLeft(), br.bottomRight() );
+ p->drawLine( br.right(), br.top(), br.right(), br.bottom() );
+ br.addCoords( 1, 0, -1, -1 );
+ if ( APPEARANCE_FLAT != appearance )
+ if ( flags & Style_Selected )
+ drawBevelGradient(
+ cg.background(), false, 0, p, br, true,
+ SHADE_BOTTOM_TAB_SEL_DARK( appearance ),
+ SHADE_BOTTOM_TAB_SEL_LIGHT( appearance ) );
+ else
+ drawBevelGradient( gray[ 2 ], false, 0, p, br,
+ true, SHADE_BOTTOM_TAB_DARK( appearance ),
+ SHADE_BOTTOM_TAB_LIGHT( appearance ) );
+ else
+ p->fillRect( br, flags & Style_Selected ? cg.background() : gray[ 2 ] );
+ }
+ }
+ break;
+ }
+#if QT_VERSION >= 0x030200
+ case CE_TabBarLabel: {
+ if ( data.isDefault() )
+ break;
+
+ const QTabBar *tb = ( const QTabBar * ) widget;
+ QTab *t = data.tab();
+ QRect tr = r;
+
+ if ( t->identifier() == tb->currentTab() ) {
+ if ( QTabBar::RoundedAbove == tb->shape() || QTabBar::TriangularAbove == tb->shape() )
+ tr.setBottom( tr.bottom() - pixelMetric( QStyle::PM_TabBarTabShiftVertical, tb ) );
+ } else
+ if ( QTabBar::RoundedBelow == tb->shape() || QTabBar::TriangularBelow == tb->shape() )
+ tr.setTop( tr.top() + pixelMetric( QStyle::PM_TabBarTabShiftVertical, tb ) );
+
+ drawItem( p, tr, AlignCenter | ShowPrefix, cg, flags & Style_Enabled, 0, t->text() );
+
+ if ( ( flags & Style_HasFocus ) && !t->text().isEmpty() )
+ drawPrimitive( PE_FocusRect, p, r, cg );
+ break;
+ }
+#endif
+ case CE_PushButtonLabel: // Taken from Highcolour and Plastik...
+ {
+ int x, y, w, h;
+
+ r.rect( &x, &y, &w, &h );
+
+ const QPushButton *button = static_cast<const QPushButton *>( widget );
+ bool active = button->isOn() || button->isDown(),
+ cornArrow = false;
+
+ // Shift button contents if pushed.
+ if ( active ) {
+ x += pixelMetric( PM_ButtonShiftHorizontal, widget );
+ y += pixelMetric( PM_ButtonShiftVertical, widget );
+ flags |= Style_Sunken;
+ }
+
+ // Does the button have a popup menu?
+ if ( button->isMenuButton() ) {
+ int dx = pixelMetric( PM_MenuButtonIndicator, widget ),
+ margin = pixelMetric( PM_ButtonMargin, widget );
+
+ if ( button->iconSet() && !button->iconSet() ->isNull() &&
+ ( dx + button->iconSet() ->pixmap ( QIconSet::Small, QIconSet::Normal,
+ QIconSet::Off ).width() ) >= w )
+ cornArrow = true; //To little room. Draw the arrow in the corner, don't adjust the widget
+ else {
+ drawPrimitive( PE_ArrowDown,
+ p, visualRect( QRect(
+ ( x + w ) - ( dx + margin ), y, dx,
+ h ), r ), cg, flags, data );
+
+ w -= dx;
+ }
+ }
+
+ // Draw the icon if there is one
+ if ( button->iconSet() && !button->iconSet() ->isNull() ) {
+ QIconSet::Mode mode = QIconSet::Disabled;
+ QIconSet::State state = QIconSet::Off;
+
+ if ( button->isEnabled() )
+ mode = button->hasFocus() ? QIconSet::Active : QIconSet::Normal;
+ if ( button->isToggleButton() && button->isOn() )
+ state = QIconSet::On;
+
+ QPixmap pixmap = button->iconSet() ->pixmap( QIconSet::Small, mode, state );
+
+ static const int constSpace = 2;
+
+ int xo = 0,
+ pw = pixmap.width(),
+ iw = 0;
+
+ if ( button->text().isEmpty() && !button->pixmap() )
+ p->drawPixmap( x + ( w >> 1 ) - ( pixmap.width() >> 1 ),
+ y + ( h >> 1 ) - ( pixmap.height() >> 1 ),
+ pixmap );
+ else {
+ iw = button->pixmap() ? button->pixmap() ->width()
+ : widget->fontMetrics().size( Qt::ShowPrefix, button->text() ).width();
+
+ int cw = iw + pw + constSpace;
+
+ xo = cw < w ? ( w - cw ) >> 1 : constSpace;
+ p->drawPixmap( x + xo, y + ( h >> 1 ) - ( pixmap.height() >> 1 ), pixmap );
+ xo += pw;
+ }
+
+ if ( cornArrow ) //Draw over the icon
+ drawPrimitive( PE_ArrowDown, p, visualRect( QRect( x + w - 6, x + h - 6, 7, 7 ), r ),
+ cg, flags, data );
+
+ if ( xo && iw ) {
+ x += xo + constSpace;
+ w = iw;
+ } else {
+ x += pw + constSpace;
+ w -= pw + constSpace;
+ }
+ }
+
+ // Make the label indicate if the button is a default button or not
+ int i,
+ j = boldDefText && button->isDefault() ? 2 : 1;
+
+ for ( i = 0; i < j; i++ )
+ drawItem( p, QRect( x + i, y, w, h ),
+ AlignCenter | ShowPrefix,
+ button->colorGroup(),
+ button->isEnabled(),
+ button->pixmap(),
+ button->text(), -1,
+ &button->colorGroup().buttonText() );
+
+ //Draw a focus rect if the button has focus
+ if ( flags & Style_HasFocus )
+ drawPrimitive( PE_FocusRect, p,
+ QStyle::visualRect( subRect( SR_PushButtonFocusRect, widget ), widget ), cg, flags );
+
+ break;
+ }
+ case CE_PopupMenuItem: {
+ if ( !widget || data.isDefault() )
+ break;
+
+ const QPopupMenu *popupmenu = ( const QPopupMenu * ) widget;
+ QMenuItem *mi = data.menuItem();
+ int tab = data.tabWidth(),
+ maxpmw = data.maxIconWidth(),
+ x, y, w, h;
+
+ r.rect( &x, &y, &w, &h );
+
+ if ( ( flags & Style_Active ) && ( flags & Style_Enabled ) ) {
+ drawPBarOrMenu( p, r, true, cg, true );
+ } else if ( widget->erasePixmap() && !widget->erasePixmap() ->isNull() )
+ p->drawPixmap( x, y, *widget->erasePixmap(), x, y, w, h );
+ else {
+ // lighter background in popup menu
+ p->fillRect( r, cg.background().light( 100 + popupmenuHighlightLevel ) );
+ }
+
+ if ( !mi )
+ break;
+
+ if ( mi->isSeparator() ) {
+ const QColor * use = backgroundColors( cg );
+ p->setPen( cg.background().dark(105) );
+ p->drawLine( r.left() + 5, r.top() + 3, r.right() - 5, r.top() + 3 );
+ break;
+ }
+
+ maxpmw = QMAX( maxpmw, 16 );
+
+ QRect cr, ir, tr, sr;
+ if (menuIcons) {
+ // check column
+ cr.setRect( r.left(), r.top(), maxpmw, r.height() );
+ // submenu indicator column
+ sr.setCoords( r.right() - maxpmw, r.top(), r.right(), r.bottom() );
+ // tab/accelerator column
+ tr.setCoords( sr.left() - tab - 4, r.top(), sr.left(), r.bottom() );
+ // item column
+ ir.setCoords( cr.right() + 2, r.top(), tr.right() - 4, r.bottom() );
+ } else {
+ // item column
+ ir.setCoords( r.left() + 4, r.top(), r.width() , r.bottom() );
+ // check column
+ cr.setCoords( r.right() - maxpmw, r.top(), r.right(), r.bottom() );
+ // submenu indicator column
+ sr.setCoords( r.right() - maxpmw, r.top(), r.right(), r.bottom() );
+ // tab/accelerator column
+ tr.setCoords( sr.left() - tab - 4, r.top(), sr.left(), r.bottom() );
+ }
+
+ bool reverse = QApplication::reverseLayout();
+
+ if ( reverse ) {
+ cr = visualRect( cr, r );
+ sr = visualRect( sr, r );
+ tr = visualRect( tr, r );
+ ir = visualRect( ir, r );
+ }
+
+ if ( mi->iconSet() && menuIcons ) {
+ // Select the correct icon from the iconset
+ QIconSet::Mode mode = flags & Style_Active
+ ? ( mi->isEnabled() ? QIconSet::Active : QIconSet::Disabled )
+ : ( mi->isEnabled() ? QIconSet::Normal : QIconSet::Disabled );
+ cr = visualRect( QRect( x, y, maxpmw, h ), r );
+
+ // Do we have an icon and are checked at the same time?
+ // Then draw a "pressed" background behind the icon
+ if ( popupmenu->isCheckable() && mi->isChecked() ) {
+
+ QBrush brush( gray[ 3 ] );
+
+ qDrawShadePanel( p,
+ cr.x() + 1, cr.y() + 2, cr.width() - 2, cr.height() - 4,
+ QColorGroup( gray[ 5 ], gray[ NUM_SHADES ], gray[ 0 ], gray[ 5 ],
+ gray[ 2 ], cg.text(), gray[ NUM_SHADES ] ),
+ true, 1, &brush );
+ }
+ // Draw the icon
+ QPixmap pixmap = mi->iconSet() ->pixmap( QIconSet::Small, mode );
+ QRect pmr( 0, 0, pixmap.width(), pixmap.height() );
+
+ pmr.moveCenter( cr.center() );
+ p->drawPixmap( pmr.topLeft(), pixmap );
+
+ } else if ( popupmenu->isCheckable() && mi->isChecked() ) {
+
+ // check column
+ cr.setRect( r.left(), r.top(), maxpmw, r.height() );
+ // submenu indicator column
+ sr.setCoords( r.right() - maxpmw, r.top(), r.right(), r.bottom() );
+ // tab/accelerator column
+ tr.setCoords( sr.left() - tab - 4, r.top(), sr.left(), r.bottom() );
+ // item column
+ ir.setCoords( cr.right() + 2, r.top(), tr.right() - 4, r.bottom() );
+
+ QBrush brush( mi->isEnabled() ? cg.highlightedText() : cg.background() );
+ drawPrimitiveMenu( PE_CheckMark, p, cr, cg,
+ ( flags & ( Style_Enabled | Style_Active ) ) | Style_On );
+ }
+
+ QColor textcolor, embosscolor;
+
+ if ( flags & Style_Active ) {
+ if ( !( flags & Style_Enabled ) ) {
+ textcolor = cg.text();
+ embosscolor = cg.light();
+ } else {
+ textcolor = cg.highlightedText();
+ embosscolor = cg.midlight().light();
+ }
+ } else if ( !( flags & Style_Enabled ) ) {
+ textcolor = cg.text();
+ embosscolor = cg.light();
+ } else
+ textcolor = embosscolor = cg.buttonText();
+ p->setPen( textcolor );
+
+ if ( mi->custom() ) {
+ p->save();
+ if ( !( flags & Style_Enabled ) ) {
+ p->setPen( cg.light() );
+ mi->custom() ->paint( p, cg, ( flags & Style_Enabled ) ? ( flags & Style_Active ) : 0,
+ flags & Style_Enabled, ir.x() + 1, ir.y() + 1, ir.width() - 1,
+ ir.height() - 1 );
+ p->setPen( textcolor );
+ }
+ mi->custom() ->paint( p, cg, ( flags & Style_Enabled ) ? ( flags & Style_Active ) : 0,
+ flags & Style_Enabled, ir.x(), ir.y(), ir.width(), ir.height() );
+ p->restore();
+ }
+
+ QString text = mi->text();
+
+ if ( !text.isNull() ) {
+ int t = text.find( '\t' );
+
+ // draw accelerator/tab-text
+ if ( t >= 0 ) {
+ int alignFlag = AlignVCenter | ShowPrefix | DontClip | SingleLine;
+
+ alignFlag |= ( reverse ? AlignLeft : AlignRight );
+
+ if ( !( flags & Style_Enabled ) ) {
+ p->setPen( embosscolor );
+ tr.moveBy( 1, 1 );
+ p->drawText( tr, alignFlag, text.mid( t + 1 ) );
+ tr.moveBy( -1, -1 );
+ p->setPen( textcolor );
+ }
+
+ p->drawText( tr, alignFlag, text.mid( t + 1 ) );
+ }
+
+ int alignFlag = AlignVCenter | ShowPrefix | DontClip | SingleLine;
+
+ alignFlag |= ( reverse ? AlignRight : AlignLeft );
+
+ if ( !( flags & Style_Enabled ) ) {
+ p->setPen( embosscolor );
+ ir.moveBy( 1, 1 );
+ p->drawText( ir, alignFlag, text, t );
+ ir.moveBy( -1, -1 );
+ p->setPen( textcolor );
+ }
+
+ p->drawText( ir, alignFlag, text, t );
+ } else if ( mi->pixmap() ) {
+ QPixmap pixmap = *mi->pixmap();
+
+ if ( 1 == pixmap.depth() )
+ p->setBackgroundMode( OpaqueMode );
+ p->drawPixmap( ir.x(), ( ir.height() - pixmap.height() ) >> 1, pixmap );
+ if ( pixmap.depth() == 1 )
+ p->setBackgroundMode( TransparentMode );
+ }
+
+ if ( mi->popup() )
+ drawArrow( p, sr, cg, flags, reverse ? PE_ArrowLeft : PE_ArrowRight, false, true );
+ break;
+ }
+ case CE_MenuBarItem: {
+ if ( ( flags & Style_Enabled ) &&
+ ( flags & Style_Active ) &&
+ ( flags & Style_Down ) ) {
+ drawPBarOrMenu2( p, QRect(r.x(), r.y(), r.width(), r.height()),
+ true, cg, true );
+ } else
+#ifdef QTC_GRADIENT_TOOLBARS_AND_MENUBARS
+ if ( APPEARANCE_FLAT != appearance )
+ drawBevelGradient( cg.background(), true, 0, p,
+ r,
+ true, SHADE_BAR_LIGHT, SHADE_BAR_DARK );
+ else
+#endif
+ if (darkMenubar) {
+ drawBevelGradient( cg.background(), true, 1, p,
+ QRect(r.x()-1, r.y()-1, r.width()+2, r.height()+2),
+ true,
+ SHADE_BEVEL_MENU_GRAD_LIGHT( appearance ), SHADE_BEVEL_MENU_GRAD_DARK( appearance ));
+ } else
+ p->fillRect( r, cg.background() );
+
+ if ( data.isDefault() )
+ break;
+
+ QMenuItem *mi = data.menuItem();
+
+ if ( flags & Style_Active && ( flags & Style_Down ) )
+ drawItem( p, r, AlignCenter | ShowPrefix | DontClip | SingleLine,
+ cg, flags & Style_Enabled, mi->pixmap(), mi->text(), -1, &cg.highlightedText() );
+ else
+ drawItem( p, r, AlignCenter | ShowPrefix | DontClip | SingleLine, cg,
+ flags & Style_Enabled, mi->pixmap(), mi->text(), -1, &cg.buttonText() );
+ break;
+ }
+ case CE_MenuBarEmptyArea:
+ if (darkMenubar) {
+ //p->fillRect( r, cg.background().dark( 106 ) );
+ QColor b;
+ b.setRgb(cg.background().red(), cg.background().green(), cg.background().blue());
+ drawBevelGradient( b, true, 1, p,
+ QRect(r.x()-1, r.y()-1, r.width()+2, r.height()+2 ),
+ true,
+ SHADE_BEVEL_MENU_GRAD_LIGHT( appearance ), SHADE_BEVEL_MENU_GRAD_DARK( appearance ));
+ } else
+ p->fillRect( r, cg.background() );
+ break;
+
+ case CE_DockWindowEmptyArea:
+#ifdef QTC_GRADIENT_TOOLBARS_AND_MENUBARS
+
+ if ( APPEARANCE_FLAT != appearance )
+ drawBevelGradient( cg.background(), true, 1, p, r, true, SHADE_BAR_LIGHT, SHADE_BAR_DARK );
+ else
+#endif
+
+ p->fillRect( r, cg.background() );
+ break;
+ case CE_ProgressBarGroove:
+ p->setBrush( gray[ NUM_SHADES ] );
+ p->drawRect( r );
+ qDrawShadePanel( p, r,
+ QColorGroup( gray[ 5 ], gray[ NUM_SHADES ], gray[ 0 ], gray[ 5 ], gray[ 2 ],
+ cg.text(), gray[ NUM_SHADES ] ), true, 1 );
+
+ break;
+
+ case CE_ProgressBarContents: {
+ // ### Take into account totalSteps()for busy indicator
+ const QProgressBar *pb = ( const QProgressBar* ) widget;
+ QRect cr = subRect( SR_ProgressBarContents, widget );
+ double progress = pb->progress();
+ bool reverse = QApplication::reverseLayout();
+ int steps = pb->totalSteps();
+
+ if ( cr.isValid() && ( progress > 0 || steps == 0 ) ) {
+ double pg = ( steps == 0 ) ? 0.1 : progress / steps;
+ int width = QMIN( cr.width(), ( int ) ( pg * cr.width() ) );
+
+ if ( 0 == steps ) //Busy indicator
+ {
+ if ( width < 1 )
+ width = 1; //A busy indicator with width 0 is kind of useless
+
+ int remWidth = cr.width() - width; //Never disappear completely
+
+ if ( remWidth <= 0 )
+ remWidth = 1; //Do something non-crashy when too small...
+
+ int pstep = int( progress ) % ( 2 * remWidth );
+
+ if ( pstep > remWidth ) {
+ //Bounce about.. We're remWidth +some delta, we want to be remWidth-delta...
+ //-((remWidth +some delta)-2* remWidth)=-(some deleta-remWidth)=remWidth-some delta..
+ pstep = -( pstep - 2 * remWidth );
+ }
+
+ if ( reverse )
+ drawPBarOrMenu( p, QRect( cr.x() + cr.width() - width - pstep,
+ cr.y(), width, cr.height() ), true, cg );
+ else
+ drawPBarOrMenu( p, QRect( cr.x() + pstep, cr.y(), width,
+ cr.height() ), true, cg );
+ } else
+ if ( reverse )
+ drawPBarOrMenu( p, QRect( cr.x() + ( cr.width() - width ),
+ cr.y(), width, cr.height() ), true, cg );
+ else
+ drawPBarOrMenu( p, QRect( cr.x(), cr.y(), width, cr.height() ), true, cg );
+ }
+ break;
+ }
+ case CE_PushButton: {
+ const QPushButton *button = static_cast<const QPushButton *>( widget );
+ QRect br( r );
+ int dbi = pixelMetric( PM_ButtonDefaultIndicator, widget );
+
+ if ( rounded && isFormWidget( widget ) )
+ formMode = true;
+
+ if ( widget == hoverWidget )
+ flags |= Style_MouseOver;
+
+ if ( IND_BORDER == defBtnIndicator )
+ br.setCoords( br.left() + dbi, br.top() + dbi, br.right() - dbi, br.bottom() - dbi );
+ else if ( IND_FONT_COLOUR == defBtnIndicator && button->isDefault() )
+ flags |= Style_ButtonDefault;
+
+ p->save();
+ p->setBrushOrigin( -widget->backgroundOffset().x(), -widget->backgroundOffset().y() );
+ // draw button
+ drawPrimitive( PE_ButtonCommand, p, br, cg, flags );
+ if ( button->isDefault() && IND_FONT_COLOUR != defBtnIndicator )
+ drawPrimitive( PE_ButtonDefault, p, r, cg, flags );
+ p->restore();
+ formMode = false;
+ break;
+ }
+ case CE_CheckBox:
+ drawPrimitive( PE_Indicator, p, r, cg, flags, data );
+ break;
+ case CE_CheckBoxLabel:
+ if ( crLabelHighlight ) {
+ const QCheckBox * checkbox = ( const QCheckBox * ) widget;
+
+ if ( flags & Style_MouseOver &&
+#if QT_VERSION >= 0x030200
+ HOVER_CHECK == hover && hoverWidget == widget &&
+#endif
+ !isFormWidget( widget ) ) {
+#if QT_VERSION >= 0x030200
+ QRect cr( checkbox->rect() );
+ QRegion r( QRect( cr.x(), cr.y(),
+ visualRect( subRect( SR_CheckBoxFocusRect, widget ), widget ).width() +
+ pixelMetric( PM_IndicatorWidth ) + 4, cr.height() ) );
+
+#else
+
+ QRegion r( checkbox->rect() );
+#endif
+
+ r -= visualRect( subRect( SR_CheckBoxIndicator, widget ), widget );
+ p->setClipRegion( r );
+ p->fillRect( checkbox->rect(), cg.background().light( QTC_HIGHLIGHT_FACTOR ) );
+ p->setClipping( false );
+ }
+ int alignment = QApplication::reverseLayout() ? AlignRight : AlignLeft;
+
+ drawItem( p, r, alignment | AlignVCenter | ShowPrefix, cg,
+ flags & Style_Enabled, checkbox->pixmap(), checkbox->text() );
+
+ if ( checkbox->hasFocus() )
+ drawPrimitive( PE_FocusRect, p,
+ visualRect( subRect( SR_CheckBoxFocusRect, widget ), widget ), cg, flags );
+ } else
+ KStyle::drawControl( control, p, widget, r, cg, flags, data );
+ break;
+ case CE_RadioButton:
+ formMode = isFormWidget( widget );
+ drawPrimitive( PE_ExclusiveIndicator, p, r, cg, flags, data );
+ formMode = false;
+ break;
+ case CE_RadioButtonLabel:
+ if ( crLabelHighlight ) {
+ const QRadioButton * radiobutton = ( const QRadioButton * ) widget;
+
+ if ( flags & Style_MouseOver &&
+#if QT_VERSION >= 0x030200
+ HOVER_RADIO == hover && hoverWidget == widget &&
+#endif
+ !isFormWidget( widget ) ) {
+#if QT_VERSION >= 0x030200
+ QRect rb( radiobutton->rect() );
+ QRegion r( QRect( rb.x(), rb.y(),
+ visualRect( subRect( SR_RadioButtonFocusRect, widget ), widget ).width() +
+ pixelMetric( PM_ExclusiveIndicatorWidth ) + 4, rb.height() ) );
+#else
+
+ QRegion r( radiobutton->rect() );
+#endif
+
+ r -= visualRect( subRect( SR_RadioButtonIndicator, widget ), widget );
+ p->setClipRegion( r );
+ p->fillRect( radiobutton->rect(), cg.background().light( QTC_HIGHLIGHT_FACTOR ) );
+ p->setClipping( false );
+ }
+
+ int alignment = QApplication::reverseLayout() ? AlignRight : AlignLeft;
+
+ drawItem( p, r, alignment | AlignVCenter | ShowPrefix, cg,
+ flags & Style_Enabled, radiobutton->pixmap(), radiobutton->text() );
+
+ if ( radiobutton->hasFocus() )
+ drawPrimitive( PE_FocusRect, p,
+ visualRect( subRect( SR_RadioButtonFocusRect, widget ), widget ), cg, flags );
+ break;
+ }
+ default:
+ KStyle::drawControl( control, p, widget, r, cg, flags, data );
+ }
+}
+
+void KlearlookStyle::drawControlMask( ControlElement control, QPainter *p, const QWidget *widget, const QRect &r,
+ const QStyleOption &data ) const {
+ switch ( control ) {
+ case CE_PushButton:
+ if ( rounded ) {
+ int offset = r.width() < QTC_MIN_BTN_SIZE || r.height() < QTC_MIN_BTN_SIZE ? 1 : 2;
+
+ p->fillRect( r, color0 );
+ p->fillRect( r.x() + 1, r.y() + 1, r.width() - 2, r.height() - 2, color1 );
+ p->setPen( color1 );
+ p->drawLine( r.x() + offset, r.y(), r.x() + r.width() - ( offset + 1 ), r.y() );
+ p->drawLine( r.x() + offset, r.y() + r.height() - 1,
+ r.x() + r.width() - ( offset + 1 ), r.y() + r.height() - 1 );
+ p->drawLine( r.x(), r.y() + offset, r.x(), r.y() + r.height() - ( offset + 1 ) );
+ p->drawLine( r.x() + r.width() - 1, r.y() + offset,
+ r.x() + r.width() - 1, r.y() + r.height() - ( offset + 1 ) );
+ } else
+ p->fillRect( r, color1 );
+ break;
+ default:
+ KStyle::drawControlMask( control, p, widget, r, data );
+ }
+}
+
+void KlearlookStyle::drawComplexControlMask( ComplexControl control, QPainter *p, const QWidget *widget, const QRect &r,
+ const QStyleOption &data ) const {
+ switch ( control ) {
+ case CC_ToolButton:
+ case CC_ComboBox:
+ drawControlMask( CE_PushButton, p, widget, r, data );
+ break;
+ default:
+ KStyle::drawComplexControlMask( control, p, widget, r, data );
+ }
+}
+
+QRect KlearlookStyle::subRect( SubRect subrect, const QWidget *widget ) const {
+ QRect rect,
+ wrect( widget->rect() );
+
+ switch ( subrect ) {
+ case SR_PushButtonFocusRect: {
+ // const QPushButton *button=(const QPushButton *)widget;
+ int dbw1 = 0,
+ dbw2 = 0;
+
+ // if(button->isDefault() || button->autoDefault())
+ // {
+ dbw1 = pixelMetric( PM_ButtonDefaultIndicator, widget );
+ dbw2 = dbw1 * 2;
+ // }
+
+ rect.setRect( wrect.x() + 3 + dbw1,
+ wrect.y() +3 + dbw1,
+ wrect.width() - 6 - dbw2,
+ wrect.height() - 6 - dbw2 );
+ break;
+ }
+ case SR_CheckBoxIndicator: {
+ int h = pixelMetric( PM_IndicatorHeight );
+
+ rect.setRect( ( widget->rect().height() - h ) >> 1,
+ ( widget->rect().height() - h ) >> 1,
+ pixelMetric( PM_IndicatorWidth ),
+ h );
+ break;
+ }
+ case SR_RadioButtonIndicator: {
+ int h = pixelMetric( PM_ExclusiveIndicatorHeight );
+
+ rect.setRect( ( widget->rect().height() - h ) >> 1,
+ ( widget->rect().height() - h ) >> 1,
+ pixelMetric( PM_ExclusiveIndicatorWidth ), h );
+ break;
+ }
+ case SR_ProgressBarContents:
+ rect = QRect( wrect.x() + 1,
+ wrect.y() + 1,
+ wrect.width() - 2,
+ wrect.height() - 2 );
+ break;
+ default:
+ rect = KStyle::subRect( subrect, widget );
+ }
+
+ return rect;
+}
+
+void KlearlookStyle::drawComplexControl(
+ ComplexControl control,
+ QPainter *p,
+ const QWidget *widget,
+ const QRect &r,
+ const QColorGroup &cg,
+ SFlags flags,
+ SCFlags controls,
+ SCFlags active,
+ const QStyleOption &data ) const
+{
+ if ( widget == hoverWidget )
+ flags |= Style_MouseOver;
+
+ switch ( control ) {
+ case CC_ToolButton: {
+
+ const QToolButton * toolbutton = ( const QToolButton * ) widget;
+ QRect button ( querySubControlMetrics( control, widget, SC_ToolButton, data ) ),
+ menuarea( querySubControlMetrics( control, widget, SC_ToolButtonMenu, data ) );
+
+ SFlags bflags = flags, mflags = flags;
+
+ if ( APP_KORN == themedApp ) {
+ drawPrimitive( PE_ButtonTool, p, button, cg, bflags, data );
+ break;
+ }
+
+ bool onControlButtons = false,
+ onToolbar = widget->parentWidget() && ::qt_cast<QToolBar *>( widget->parentWidget() ),
+ onExtender = !onToolbar &&
+ widget->parentWidget() &&
+ widget->parentWidget() ->inherits( "QToolBarExtensionWidget" ) &&
+ ::qt_cast<QToolBar *>( widget->parentWidget() ->parentWidget() );
+
+ if ( !onToolbar && !onExtender && widget->parentWidget() &&
+ !qstrcmp( widget->parentWidget() ->name(), "qt_maxcontrols" ) )
+ onControlButtons = true;
+
+ if ( active & SC_ToolButton )
+ bflags |= Style_Down;
+
+ if ( active & SC_ToolButtonMenu )
+ mflags |= Style_Down;
+
+ if ( controls & SC_ToolButton ) {
+ // If we're pressed, on, or raised...
+#if KDE_VERSION >= 0x30200
+ if ( bflags & ( Style_Down | Style_On | Style_Raised ) || onControlButtons )
+#else
+ // CPD: Style_MouseOver obove is *needed* for KDE's KToggleActions...
+ if ( bflags & ( Style_Down | Style_On | Style_Raised | Style_MouseOver ) || onControlButtons )
+#endif
+
+ {
+ //Make sure the standalone toolbuttons have a gradient in the right direction
+ if ( !onToolbar && !onControlButtons )
+ bflags |= Style_Horizontal;
+
+ drawPrimitive( PE_ButtonTool, p, button, cg, bflags, data );
+ }
+
+ // Check whether to draw a background pixmap
+ else if ( toolbutton->parentWidget() &&
+ toolbutton->parentWidget() ->backgroundPixmap() &&
+ !toolbutton->parentWidget() ->backgroundPixmap() ->isNull() ) {
+ p->drawTiledPixmap( r,
+ *( toolbutton->parentWidget() ->backgroundPixmap() ), toolbutton->pos() );
+ } else if ( widget->parent() ) {
+ if ( ::qt_cast<const QToolBar *>( widget->parent() ) ) {
+ QToolBar * parent = ( QToolBar* ) widget->parent();
+
+#ifdef QTC_GRADIENT_TOOLBARS_AND_MENUBARS
+
+ if ( APPEARANCE_FLAT != appearance )
+ drawBevelGradient( cg.background(), true, 0,
+ p, parent->rect(), true, SHADE_BAR_LIGHT, SHADE_BAR_DARK );
+ else
+#endif
+
+ p->fillRect( parent->rect(), cg.background() );
+ } else if ( widget->parent() ->inherits( "QToolBarExtensionWidget" ) ) {
+ QWidget * parent = ( QWidget* ) widget->parent();
+ QToolBar *toolbar = ( QToolBar* ) parent->parent();
+
+#ifdef QTC_GRADIENT_TOOLBARS_AND_MENUBARS
+
+ if ( APPEARANCE_FLAT != appearance )
+ drawBevelGradient( cg.background(), true, 0, p, toolbar->rect(),
+ true, SHADE_BAR_LIGHT, SHADE_BAR_DARK );
+ else
+#endif
+
+ p->fillRect( toolbar->rect(), cg.background() );
+ }
+ }
+ }
+
+ if ( controls & SC_ToolButtonMenu ) {
+ if ( mflags & ( Style_Down | Style_On | Style_Raised ) )
+ drawPrimitive( PE_ButtonDropDown, p, menuarea, cg, mflags, data );
+ drawPrimitive( PE_ArrowDown, p, menuarea, cg, mflags, data );
+ }
+
+ if ( toolbutton->hasFocus() && !toolbutton->focusProxy() ) {
+ QRect fr = toolbutton->rect();
+ fr.addCoords( 3, 3, -3, -3 );
+ drawPrimitive( PE_FocusRect, p, fr, cg );
+ }
+ break;
+ }
+ case CC_ComboBox: {
+ const QComboBox *combobox = ( const QComboBox * ) widget;
+
+ QRect frame( QStyle::visualRect( querySubControlMetrics( CC_ComboBox,
+ widget,SC_ComboBoxFrame,data ),widget ) ),
+
+ arrow( QStyle::visualRect( querySubControlMetrics( CC_ComboBox,
+ widget,SC_ComboBoxArrow,data),widget)),
+
+ field( QStyle::visualRect( querySubControlMetrics(CC_ComboBox,
+ widget,SC_ComboBoxEditField,data),widget));
+
+ const QColor *use = buttonColors( cg );
+
+ if ( rounded && isFormWidget( widget ) )
+ formMode = true;
+
+ if ( controls & SC_ComboBoxFrame && frame.isValid() ) {
+ if ( controls & SC_ComboBoxEditField && field.isValid() && combobox->editable() ) {
+ QRect f2( field );
+ QRegion reg( r );
+
+ f2.addCoords( -1, -1, 1, 1 );
+ reg -= f2;
+ p->setClipRegion( reg );
+ }
+ drawLightBevelButton( p, r, cg, flags | Style_Raised | Style_Horizontal,
+ true, ROUNDED_ALL, getFill( flags, use ),
+ use );
+ p->setClipping( false );
+ }
+
+ if ( controls & SC_ComboBoxArrow && arrow.isValid() ) {
+ drawPrimitive( PE_ArrowDown, p, arrow, cg, flags & ~Style_MouseOver );
+ p->setPen( use[ 4 ].light(70) );
+ arrow.addCoords( -1, -1, -1, 1 );
+ p->drawLine( arrow.left(), arrow.top(), arrow.left(), arrow.bottom() );
+ }
+
+ if ( controls & SC_ComboBoxEditField && field.isValid() ) {
+ if ( ( flags & Style_HasFocus ) && ( ! combobox->editable() ) ) {
+ QRect fr = QStyle::visualRect( subRect( SR_ComboBoxFocusRect, widget ), widget );
+
+ fr.addCoords( 0, 0, -2, 0 );
+ drawPrimitive( PE_FocusRect,
+ p, fr, cg, flags | Style_FocusAtBorder, QStyleOption( cg.highlight() ) );
+ }
+ }
+
+ p->setPen( flags & Style_Enabled ? cg.buttonText() : cg.mid() );
+ formMode = false;
+ break;
+ }
+ case CC_SpinWidget: {
+ const QSpinWidget *spinwidget = ( const QSpinWidget * ) widget;
+ QRect frame( querySubControlMetrics( CC_SpinWidget, widget, SC_SpinWidgetFrame, data ) ),
+ up( spinwidget->upRect() ),
+ down( spinwidget->downRect() );
+
+ if ( hoverWidget && spinwidget == hoverWidget )
+ flags |= Style_MouseOver;
+
+ if ( ( controls & SC_SpinWidgetFrame ) && frame.isValid() )
+ qDrawShadePanel(
+ p, r, QColorGroup( gray[ 5 ], gray[ NUM_SHADES ], gray[ 0 ],
+ gray[ 5 ], gray[ 2 ], cg.text(), gray[ NUM_SHADES ] ),
+ true, pixelMetric( PM_SpinBoxFrameWidth )
+ );
+
+ if ( ( controls & SC_SpinWidgetUp ) && up.isValid() ) {
+ PrimitiveElement pe = PE_SpinWidgetUp;
+ SFlags upflags = flags;
+
+ if ( spinwidget->buttonSymbols() == QSpinWidget::PlusMinus )
+ pe = PE_SpinWidgetPlus;
+ if ( !spinwidget->isUpEnabled() )
+ upflags ^= Style_Enabled;
+ drawPrimitive(
+ pe, p, up, cg,
+ upflags | ( ( active == SC_SpinWidgetUp ) ? Style_On | Style_Sunken : Style_Raised )
+ );
+ }
+
+ if ( ( controls & SC_SpinWidgetDown ) && down.isValid() ) {
+ PrimitiveElement pe = PE_SpinWidgetDown;
+ SFlags downflags = flags;
+
+ if ( spinwidget->buttonSymbols() == QSpinWidget::PlusMinus )
+ pe = PE_SpinWidgetMinus;
+ if ( !spinwidget->isDownEnabled() )
+ downflags ^= Style_Enabled;
+ drawPrimitive(
+ pe, p, down, cg,
+ downflags | ( ( active == SC_SpinWidgetDown ) ? Style_On | Style_Sunken : Style_Raised )
+ );
+ }
+ const QColor *use = backgroundColors( cg );
+ p->setPen( use[ 4 ].light(80) );
+ p->drawRect( r );
+ break;
+ }
+ case CC_ScrollBar: {
+ const QScrollBar *scrollbar = ( const QScrollBar * ) widget;
+ bool hw = hoverWidget == scrollbar;
+ QRect subline( querySubControlMetrics( control, widget, SC_ScrollBarSubLine, data ) ),
+ addline( querySubControlMetrics( control, widget, SC_ScrollBarAddLine, data ) ),
+ subpage( querySubControlMetrics( control, widget, SC_ScrollBarSubPage, data ) ),
+ addpage( querySubControlMetrics( control, widget, SC_ScrollBarAddPage, data ) ),
+ slider( querySubControlMetrics( control, widget, SC_ScrollBarSlider, data ) ),
+ first( querySubControlMetrics( control, widget, SC_ScrollBarFirst, data ) ),
+ last( querySubControlMetrics( control, widget, SC_ScrollBarLast, data ) );
+
+ if ( ( controls & SC_ScrollBarSubLine ) && subline.isValid() )
+ drawPrimitive(
+ PE_ScrollBarSubLine, p, subline, cg,
+ ( hw && HOVER_SB_SUB == hover ? Style_MouseOver : Style_Default ) |
+ Style_Enabled |
+ ( ( active == SC_ScrollBarSubLine ) ? Style_Down : Style_Default ) |
+ ( ( scrollbar->orientation() == Qt::Horizontal ) ? Style_Horizontal : Style_Default )
+ );
+ if ( ( controls & SC_ScrollBarAddLine ) && addline.isValid() )
+ drawPrimitive(
+ PE_ScrollBarAddLine, p, addline, cg,
+ ( hw && HOVER_SB_ADD == hover ? Style_MouseOver : Style_Default ) |
+ Style_Enabled |
+ ( ( active == SC_ScrollBarAddLine ) ? Style_Down : Style_Default ) |
+ ( ( scrollbar->orientation() == Qt::Horizontal ) ? Style_Horizontal : Style_Default )
+ );
+ if ( ( controls & SC_ScrollBarSubPage ) && subpage.isValid() )
+ drawPrimitive( PE_ScrollBarSubPage, p, subpage, cg,
+ Style_Enabled |
+ ( ( active == SC_ScrollBarSubPage ) ? Style_Down : Style_Default ) |
+ ( ( scrollbar->orientation() == Qt::Horizontal ) ? Style_Horizontal : Style_Default ) );
+ if ( ( controls & SC_ScrollBarAddPage ) && addpage.isValid() )
+ drawPrimitive( PE_ScrollBarAddPage, p, addpage, cg,
+ ( ( scrollbar->minValue() == scrollbar->maxValue() ) ? Style_Default : Style_Enabled ) |
+ ( ( active == SC_ScrollBarAddPage ) ? Style_Down : Style_Default ) |
+ ( ( scrollbar->orientation() == Qt::Horizontal ) ? Style_Horizontal : Style_Default ) );
+ if ( ( controls & SC_ScrollBarFirst ) && first.isValid() )
+ drawPrimitive( PE_ScrollBarFirst, p, first, cg,
+ Style_Enabled |
+ ( ( active == SC_ScrollBarFirst ) ? Style_Down : Style_Default ) |
+ ( ( scrollbar->orientation() == Qt::Horizontal ) ? Style_Horizontal : Style_Default ) );
+ if ( ( controls & SC_ScrollBarLast ) && last.isValid() )
+ drawPrimitive( PE_ScrollBarLast, p, last, cg,
+ Style_Enabled |
+ ( ( active == SC_ScrollBarLast ) ? Style_Down : Style_Default ) |
+ ( ( scrollbar->orientation() == Qt::Horizontal ) ? Style_Horizontal : Style_Default ) );
+ if ( ( controls & SC_ScrollBarSlider ) && slider.isValid() ) {
+ drawPrimitive( PE_ScrollBarSlider, p, slider, cg,
+ ( hw && HOVER_SB_SLIDER == hover ? Style_MouseOver : Style_Default ) |
+ Style_Enabled |
+ ( ( active == SC_ScrollBarSlider ) ? Style_Down : Style_Default ) |
+ ( ( scrollbar->orientation() == Qt::Horizontal ) ? Style_Horizontal : Style_Default ) );
+
+ // ### perhaps this should not be able to accept focus if maxedOut?
+ if ( scrollbar->hasFocus() )
+ drawPrimitive( PE_FocusRect, p,
+ QRect( slider.x() + 2, slider.y() + 2, slider.width() - 5, slider.height() - 5 ),
+ cg, Style_Default );
+ }
+ break;
+ }
+ case CC_Slider: {
+ QRect groove = querySubControlMetrics( CC_Slider, widget, SC_SliderGroove, data ),
+ handle = querySubControlMetrics( CC_Slider, widget, SC_SliderHandle, data );
+
+ if ( ( controls & SC_SliderGroove ) && groove.isValid() )
+ drawSliderGroove( p, groove, flags, widget );
+ if ( ( controls & SC_SliderHandle ) && handle.isValid() )
+ drawSliderHandle( p, handle, cg, flags );
+ if ( controls & SC_SliderTickmarks )
+ QCommonStyle::drawComplexControl(
+ control, p, widget, r, cg, flags, SC_SliderTickmarks, active, data
+ );
+ break;
+ }
+ default:
+ KStyle::drawComplexControl( control, p, widget, r, cg, flags, controls, active, data );
+ }
+}
+
+QRect KlearlookStyle::querySubControlMetrics( ComplexControl control, const QWidget *widget, SubControl sc,
+ const QStyleOption &data ) const {
+ switch ( control ) {
+ case CC_SpinWidget: {
+ if ( !widget )
+ return QRect();
+
+ int fw = pixelMetric( PM_SpinBoxFrameWidth, 0 );
+ QSize bs;
+
+ bs.setHeight( widget->height() >> 1 );
+ if ( bs.height() < 8 )
+ bs.setHeight( 8 );
+ bs.setWidth( QMIN( bs.height() * 8 / 6, widget->width() / 4 ) );
+ bs = bs.expandedTo( QApplication::globalStrut() );
+
+ if ( !( bs.width() % 2 ) )
+ bs.setWidth( bs.width() + 1 );
+
+ int extra = bs.height() * 2 == widget->height() ? 0 : 1;
+ int y = 0,
+ x = widget->width() - y - bs.width(),
+ lx = fw,
+ rx = x - fw * 2;
+
+ switch ( sc ) {
+ case SC_SpinWidgetUp:
+ return QRect( x, y, bs.width(), bs.height() );
+ case SC_SpinWidgetDown:
+ return QRect( x, y + bs.height(), bs.width(), bs.height() + extra );
+ case SC_SpinWidgetButtonField:
+ return QRect( x, y, bs.width(), widget->height() - 2 * fw );
+ case SC_SpinWidgetEditField:
+ return QRect( lx, fw, rx, widget->height() - 2 * fw );
+ case SC_SpinWidgetFrame:
+ return QRect( widget->x(), widget->y(), widget->width() - bs.width(), widget->height() );
+ }
+ }
+ default:
+ return KStyle::querySubControlMetrics( control, widget, sc, data );
+ }
+}
+
+int KlearlookStyle::pixelMetric( PixelMetric metric, const QWidget *widget ) const {
+ switch ( metric ) {
+ case PM_MenuButtonIndicator:
+ return 7;
+ case PM_MenuBarItemSpacing: {
+ return 5;
+ }
+ case PM_ButtonMargin:
+ return 5;
+#if QT_VERSION >= 0x030200
+
+ case PM_TabBarTabShiftVertical: {
+ const QTabBar *tb = ::qt_cast<const QTabBar *>( widget );
+
+ return QTabBar::RoundedAbove == tb->shape() || QTabBar::TriangularAbove == tb->shape()
+ ? 1
+ : -1;
+ }
+ case PM_TabBarTabShiftHorizontal:
+ return 0;
+#endif
+
+ case PM_TabBarTabVSpace: {
+ const QTabBar * tb = ( const QTabBar * ) widget;
+ if ( tb->shape() == QTabBar::RoundedAbove ||
+ tb->shape() == QTabBar::RoundedBelow )
+ return 12;
+ else
+ return 4;
+ }
+
+
+ case PM_ButtonShiftHorizontal:
+ case PM_ButtonShiftVertical:
+ return 1;
+ case PM_ButtonDefaultIndicator:
+ return IND_BORDER == defBtnIndicator ? 1 : 0;
+ case PM_DefaultFrameWidth:
+ return borderFrame && widget && ( ::qt_cast<const QTabBar *>( widget ) ||
+ ::qt_cast<const QWidgetStack *>( widget ) ||
+ ::qt_cast<const QPopupMenu *>( widget ) )
+ ? 2
+ : QTC_DEF_FRAME_WIDTH;
+ case PM_SpinBoxFrameWidth:
+ return 1;
+ case PM_MenuBarFrameWidth:
+ return 1;
+ case PM_IndicatorWidth:
+ case PM_IndicatorHeight:
+ return QTC_CHECK_SIZE;
+ case PM_ExclusiveIndicatorWidth:
+ case PM_ExclusiveIndicatorHeight:
+ return QTC_RADIO_SIZE;
+ case PM_TabBarTabOverlap:
+ return 1;
+ case PM_ProgressBarChunkWidth:
+ return 2;
+ case PM_DockWindowSeparatorExtent:
+ return 4;
+ case PM_DockWindowHandleExtent:
+ return 10;
+ case PM_SplitterWidth:
+ return 4;
+ case PM_ScrollBarSliderMin:
+ return 16;
+ case PM_ScrollBarExtent:
+ case PM_SliderControlThickness:
+ case PM_SliderThickness:
+ return 15;
+ case PM_SliderLength:
+ return 24;
+ case PM_MaximumDragDistance:
+ return -1;
+ default:
+ return KStyle::pixelMetric( metric, widget );
+ }
+}
+
+int KlearlookStyle::kPixelMetric( KStylePixelMetric kpm, const QWidget *widget ) const {
+ switch ( kpm ) {
+ case KPM_MenuItemSeparatorHeight:
+ return 4;
+ default:
+ return KStyle::kPixelMetric( kpm, widget );
+ }
+}
+
+QSize KlearlookStyle::sizeFromContents( ContentsType t,
+ const QWidget *widget,
+ const QSize &s,
+ const QStyleOption &opt ) const {
+ switch ( t ) {
+ case CT_PopupMenuItem: {
+ if ( !widget || opt.isDefault() )
+ return s;
+
+ const QPopupMenu *popup = dynamic_cast<const QPopupMenu *>( widget );
+ QMenuItem *mi = opt.menuItem();
+ int maxpmw = opt.maxIconWidth();
+ int w = s.width(), h = s.height();
+ bool checkable = popup->isCheckable();
+
+ if ( mi->custom() ) {
+ w = mi->custom() ->sizeHint().width();
+ h = mi->custom() ->sizeHint().height();
+ if ( !mi->custom() ->fullSpan() )
+ h += 4;
+ } else if ( mi->widget() ) {
+ // don't change the size in this case.
+ } else if ( mi->isSeparator() ) {
+ w = 20;
+ h = 8;
+ } else {
+ if ( mi->pixmap() ) {
+ h = QMAX( h, mi->pixmap() ->height() + 2 );
+ } else {
+ h = QMAX( h, 21 );
+ QSettings s;
+ if ( menuIcons )
+ h = QMAX( h, popup->fontMetrics().height() + MENU_POPUP_ITEM_HIGH_HI );
+ else
+ h = QMAX( h, popup->fontMetrics().height() + MENU_POPUP_ITEM_HIGH_LO );
+ }
+
+ if ( mi->iconSet() ) {
+ h = QMAX( h, mi->iconSet() ->pixmap( QIconSet::Small, QIconSet::Normal ).height() + 2 );
+ }
+ }
+
+ if ( !mi->text().isNull() && ( mi->text().find( '\t' ) >= 0 ) ) {
+ w += itemHMargin + itemFrame * 2 + 7;
+ } else if ( mi->popup() ) {
+ w += 2 * arrowHMargin;
+ }
+
+ if ( maxpmw ) {
+ w += maxpmw + 6;
+ }
+ if ( checkable && maxpmw < 20 ) {
+ w += 20 - maxpmw;
+ }
+ if ( checkable || maxpmw > 0 ) {
+ w += 12;
+ }
+
+ w += rightBorder;
+
+ return QSize( w-25, h );
+ }
+
+ case CT_PushButton: {
+ const QPushButton* btn = static_cast<const QPushButton*>( widget );
+
+ int w = s.width() + 2 * pixelMetric( PM_ButtonMargin, widget );
+ int h = s.height() + 2 * pixelMetric( PM_ButtonMargin, widget );
+ if ( btn->text().isEmpty() && s.width() < 32 )
+ return QSize( w, h );
+ // return button size
+ return QSize( w + 25, h + 3 );
+ }
+
+ case CT_ToolButton: {
+ if ( widget->parent() && ::qt_cast<QToolBar*>( widget->parent() ) )
+ return QSize( s.width() + 2 * 4, s.height() + 2 * 4 );
+ else {
+ return KStyle::sizeFromContents ( t, widget, s, opt );
+ }
+ }
+
+ default:
+ return KStyle::sizeFromContents ( t, widget, s, opt );
+ }
+
+ return KStyle::sizeFromContents ( t, widget, s, opt );
+}
+
+
+
+int KlearlookStyle::styleHint( StyleHint stylehint, const QWidget *widget, const QStyleOption &option, QStyleHintReturn *returnData ) const {
+ switch ( stylehint ) {
+ case SH_EtchDisabledText:
+ case SH_Slider_SnapToValue:
+ case SH_PrintDialog_RightAlignButtons:
+ case SH_FontDialog_SelectAssociatedText:
+ case SH_MenuBar_AltKeyNavigation:
+ case SH_MenuBar_MouseTracking:
+ case SH_PopupMenu_MouseTracking:
+ case SH_PopupMenu_SpaceActivatesItem:
+ case SH_ComboBox_ListMouseTracking:
+ case SH_ScrollBar_MiddleClickAbsolutePosition:
+ return 1;
+ case SH_MainWindow_SpaceBelowMenuBar:
+ return 0;
+ case SH_ComboBox_Popup:
+ return 0;
+ case SH_PopupMenu_SubMenuPopupDelay:
+ return 300;
+ case SH_PopupMenu_AllowActiveAndDisabled:
+ return 0;
+ default:
+ return KStyle::styleHint( stylehint, widget, option, returnData );
+ }
+}
+
+void KlearlookStyle::drawPBarOrMenu(
+ QPainter *p,
+ QRect const &r,
+ bool horiz,
+ const QColorGroup &cg,
+ bool menu ) const
+{
+ switch ( pmProfile ) {
+ case PROFILE_SUNKEN:
+ drawGradientWithBorder( p, r, horiz );
+ break;
+ case PROFILE_RAISED: {
+ int flags = QStyle::Style_Raised;
+
+ if ( horiz )
+ flags |= Style_Horizontal;
+
+ drawLightBevel( p, r,
+ cg, flags, true,
+ menu ? ROUNDED_ALL : ROUNDED_NONE,
+ getFill( flags, menuPbar ),
+ menuPbar, true
+ );
+
+ break;
+ }
+ default:
+ p->fillRect( r, menuPbar[ GRADIENT_BASE ] );
+ break;
+ }
+}
+void KlearlookStyle::drawPBarOrMenu2(
+ QPainter *p,
+ QRect const &r,
+ bool horiz,
+ const QColorGroup &cg,
+ bool menu ) const
+{
+ switch ( pmProfile ) {
+ case PROFILE_SUNKEN:
+ drawGradientWithBorder( p, r, horiz );
+ break;
+ case PROFILE_RAISED: {
+ int flags = QStyle::Style_Raised;
+
+ if ( horiz )
+ flags |= Style_Horizontal;
+
+ drawLightBevel( p, r,
+ cg, flags, true,
+ menu ? ROUNDED_TOP : ROUNDED_NONE,
+ getFill( flags, menuPbar ),
+ menuPbar, true
+ );
+
+ break;
+ }
+ default:
+ p->fillRect( r, menuPbar[ GRADIENT_BASE ] );
+ break;
+ }
+}
+
+void KlearlookStyle::drawGradientWithBorder(
+ QPainter *p,
+ QRect const &r,
+ bool horiz ) const
+{
+ QRect r2( r );
+
+ drawGradient( menuPbar[ GRADIENT_TOP ],
+ menuPbar[ GRADIENT_BOTTOM ], true, borderFrame ? 2 : 1, p, r, horiz );
+ // 3d border effect...
+ if ( borderFrame ) {
+ p->setPen( menuPbar[ GRADIENT_BASE ] );
+ p->setBrush( NoBrush );
+ p->drawRect( r );
+ } else
+ r2.addCoords( -1, -1, 1, 1 );
+
+ p->setPen( menuPbar[ GRADIENT_LIGHT ] );
+ p->drawLine( r2.left() + 1, r2.top() + 1, r2.right() - 1, r2.top() + 1 );
+ p->drawLine( r2.left() + 1, r2.top() + 1, r2.left() + 1, r2.bottom() - 1 );
+ p->setPen( menuPbar[ GRADIENT_DARK ] );
+ p->drawLine( r2.left() + 1, r2.bottom() - 1, r2.right() - 1, r2.bottom() - 1 );
+ p->drawLine( r2.right() - 1, r2.bottom() - 1, r2.right() - 1, r2.top() + 1 );
+}
+
+void KlearlookStyle::drawBevelGradient(
+ const QColor &base,
+ bool increase,
+ int border,
+ QPainter *p,
+ QRect const &r,
+ bool horiz, double shadeTop, double shadeBot )
+const {
+ //CPD TODO: Store last settings to make faster!
+ QColor top, bot;
+
+ if ( equal( 1.0, shadeTop ) )
+ top = base;
+ else
+ shade( base, &top, shadeTop );
+ if ( equal( 1.0, shadeBot ) )
+ bot = base;
+ else
+ shade( base, &bot, shadeBot );
+
+ drawGradient( top, bot, increase, border, p, r, horiz );
+}
+
+void KlearlookStyle::drawGradient(
+ const QColor &top,
+ const QColor &bot,
+ bool increase,
+ int border,
+ QPainter *p,
+ QRect const &r,
+ bool horiz ) const
+{
+ if ( r.width() > 0 && r.height() > 0 ) {
+ QRect grad(
+ r.left() + border,
+ r.top() + border,
+ r.width() - ( border * 2 ),
+ r.height() - ( border * 2 )
+ );
+
+ if ( top == bot )
+ p->fillRect( grad, top );
+ else {
+ QRect grad(
+ r.left() + border,
+ r.top() + border,
+ r.width() - ( border * 2 ),
+ r.height() - ( border * 2 )
+ );
+
+ int i,
+ s = horiz ? grad.top() : grad.left(),
+ e = horiz ? grad.bottom() : grad.right();
+
+ double amt = ( horiz ? grad.height() : grad.width() ) ,
+ dr = ( ( double ) ( bot.red() - top.red() ) ) / amt ,
+ dg = ( ( double ) ( bot.green() - top.green() ) ) / amt ,
+ db = ( ( double ) ( bot.blue() - top.blue() ) ) / amt,
+ rc = 0, gc = 0, bc = 0;
+
+ if ( increase )
+ for ( i = s; i <= e ; i++ ) {
+ p->setPen( QColor(
+ limit( top.red() + rc ),
+ limit( top.green() + gc ),
+ limit( top.blue() + bc )
+ ));
+
+ if ( horiz )
+ p->drawLine( grad.left(), i, grad.right(), i );
+ else
+ p->drawLine( i, grad.top(), i, grad.bottom() );
+ rc += dr;
+ gc += dg;
+ bc += db;
+ }
+ else
+ for ( i = e; i >= s; i-- ) {
+ p->setPen(
+ QColor(
+ limit( top.red() + rc ),
+ limit( top.green() + gc ),
+ limit( top.blue() + bc )
+ ) );
+
+ if ( horiz )
+ p->drawLine( grad.left(), i, grad.right(), i );
+
+ else
+ p->drawLine( i, grad.top(), i, grad.bottom() );
+
+ rc += dr;
+ gc += dg;
+ bc += db;
+ }
+ }
+ }
+}
+
+
+void KlearlookStyle::drawPopupRect( QPainter *p, const QRect &r, const QColorGroup &cg ) const
+{
+ const QColor *use = backgroundColors( cg );
+ p->setPen( use[ 4 ].light(70) );
+ p->setBrush( NoBrush );
+ p->drawRect( r );
+}
+
+void KlearlookStyle::drawSliderHandle(
+ QPainter *p,
+ const QRect &r,
+ const QColorGroup &cg, QStyle::SFlags flags
+) const
+{
+ const QColor * use = buttonColors( cg );
+
+ if ( r.width() > r.height() )
+ flags |= Style_Horizontal;
+ flags |= Style_Raised;
+
+ drawLightBevelButton( p, r, cg, flags, true, ROUNDED_ALL, getFill( flags, use ), use );
+
+ if ( GROOVE_NONE != sliderThumbs &&
+ ( ( flags & Style_Horizontal && r.width() >= 14 ) || r.height() >= 14 ) )
+ drawLines( p, r,
+ r.width() < r.height(),
+ 4, 3, use, 0,
+ GROOVE_SUNKEN == sliderThumbs,
+ APPEARANCE_LIGHT_GRADIENT == appearance );
+}
+
+void KlearlookStyle::drawSliderGroove
+ ( QPainter *p,
+ const QRect &r,
+ QStyle::SFlags flags,
+ const QWidget *widget ) const
+{
+ const QSlider * slider = ( const QSlider * ) widget;
+ QRect groove( r );
+
+ if ( flags & Style_HasFocus ) {
+ QRect fr( groove );
+
+ fr.addCoords( -1, -1, 1, 1 );
+ drawPrimitive( PE_FocusRect, p, fr, QColorGroup() );
+ }
+
+ if ( Qt::Horizontal == slider->orientation() ) {
+ int dh = ( groove.height() - 5 ) >> 1;
+
+ groove.addCoords( 0, dh, 0, -dh );
+ } else {
+ int dw = ( groove.width() - 5 ) >> 1;
+
+ groove.addCoords( dw, 0, -dw, 0 );
+ }
+ p->setBrush( gray[ 2 ] );
+ p->setPen( gray[ 5 ] );
+ p->drawRect( groove );
+ p->setPen( gray[ 4 ] );
+ p->drawLine( groove.x() + 1, groove.y() + 1, groove.x() + groove.width() - 2, groove.y() + 1 );
+ p->drawLine( groove.x() + 1, groove.y() + 1, groove.x() + 1, groove.y() + groove.height() - 2 );
+}
+
+void KlearlookStyle::shadeColors( const QColor &base, QColor *vals ) const {
+ QTC_SHADES
+
+ int i;
+
+ for ( i = 0; i < NUM_SHADES; ++i )
+ shade( base, &vals[ i ], QTC_SHADE( appearance, contrast, i ) );
+
+ vals[ NUM_SHADES ] = base;
+}
+
+const QColor * KlearlookStyle::buttonColors( const QColorGroup &cg ) const {
+ if ( cg.button() != button[ NUM_SHADES ] ) {
+ shadeColors( cg.button(), buttonColoured );
+ return buttonColoured;
+ }
+
+ return button;
+}
+
+const QColor * KlearlookStyle::backgroundColors( const QColorGroup &cg ) const {
+ if ( cg.background() != gray[ NUM_SHADES ] ) {
+ shadeColors( cg.background(), backgroundColoured );
+ return backgroundColoured;
+ }
+
+ return gray;
+}
+
+bool KlearlookStyle::redrawHoverWidget() {
+ if ( !hoverWidget )
+ return false;
+
+ QPoint cursor( QCursor::pos() ),
+ widgetZero( hoverWidget->mapToGlobal( QPoint( 0, 0 ) ) );
+
+#if QT_VERSION >= 0x030200
+
+ //
+ // Qt>=3.2 sets the sensitive part of a check/radio to the image + label -> anything else
+ // is not sensitive. But,
+ // the widget can ocupy a larger area - and this whole are will react to mouse over.
+ // This needs to be coounteracted
+ // so that it looks as if only the sensitive area mouse-overs...
+ QRadioButton *rb = dynamic_cast<QRadioButton *>( hoverWidget );
+
+ if ( rb ) {
+ QRect rect( widgetZero.x(), widgetZero.y(),
+ visualRect( subRect( SR_RadioButtonFocusRect, rb ), rb ).width() +
+ pixelMetric( PM_ExclusiveIndicatorWidth ) + 4, hoverWidget->height() );
+
+ hover = rect.contains( cursor ) ? HOVER_RADIO : HOVER_NONE;
+ return ( HOVER_NONE != hover && !rect.contains( oldCursor ) ) ||
+ ( HOVER_NONE == hover && rect.contains( oldCursor ) );
+ } else {
+ QCheckBox *cb = dynamic_cast<QCheckBox *>( hoverWidget );
+
+ if ( cb ) {
+ QRect rect( widgetZero.x(), widgetZero.y(),
+ visualRect( subRect( SR_CheckBoxFocusRect, cb ), cb ).width() +
+ pixelMetric( PM_IndicatorWidth ) + 4, hoverWidget->height() );
+
+ hover = rect.contains( cursor ) ? HOVER_CHECK : HOVER_NONE;
+ return ( HOVER_NONE != hover && !rect.contains( oldCursor ) ) ||
+ ( HOVER_NONE == hover && rect.contains( oldCursor ) );
+ } else {
+#endif
+ QScrollBar *sb = dynamic_cast<QScrollBar *>( hoverWidget );
+
+ if ( sb ) // So, are we over add button, sub button, slider, or none?
+ {
+ QRect subline( querySubControlMetrics( CC_ScrollBar, hoverWidget, SC_ScrollBarSubLine ) ),
+ addline( querySubControlMetrics( CC_ScrollBar, hoverWidget, SC_ScrollBarAddLine ) ),
+ slider( querySubControlMetrics( CC_ScrollBar, hoverWidget, SC_ScrollBarSlider ) );
+
+ subline.moveLeft( subline.x() + widgetZero.x() );
+ subline.moveTop( subline.y() + widgetZero.y() );
+ addline.moveLeft( addline.x() + widgetZero.x() );
+ addline.moveTop( addline.y() + widgetZero.y() );
+ slider.moveLeft( slider.x() + widgetZero.x() );
+ slider.moveTop( slider.y() + widgetZero.y() );
+
+ if ( slider.contains( cursor ) )
+ hover = HOVER_SB_SLIDER;
+ else if ( subline.contains( cursor ) )
+ hover = HOVER_SB_SUB;
+ else if ( addline.contains( cursor ) )
+ hover = HOVER_SB_ADD;
+ else
+ hover = HOVER_NONE;
+
+ return ( HOVER_SB_SLIDER == hover && !slider.contains( oldCursor ) ) ||
+ ( HOVER_SB_SLIDER != hover && slider.contains( oldCursor ) ) ||
+ ( HOVER_SB_SUB == hover && !subline.contains( oldCursor ) ) ||
+ ( HOVER_SB_SUB != hover && subline.contains( oldCursor ) ) ||
+ ( HOVER_SB_ADD == hover && !addline.contains( oldCursor ) ) ||
+ ( HOVER_SB_ADD != hover && addline.contains( oldCursor ) );
+ } else {
+#if KDE_VERSION >= 0x30400
+ QToolButton *tb = dynamic_cast<QToolButton *>( hoverWidget );
+
+ if ( tb ) {
+ hover = APP_KICKER == themedApp ? HOVER_KICKER : HOVER_NONE;
+ return HOVER_KICKER == hover;
+ } else {
+#endif
+ QHeader *hd = dynamic_cast<QHeader *>( hoverWidget );
+
+ if ( hd ) {
+ // Hmm... this ones tricky, as there's only 1 widget - but it has different sections...
+ // and the ones that aren't clickable should not highlight on mouse over!
+
+ QRect rect(
+ widgetZero.x(),
+ widgetZero.y(),
+ hoverWidget->width(),
+ hoverWidget->height()
+ );
+
+ int s = 0;
+ bool redraw = false;
+
+ hover = rect.contains( cursor ) ? HOVER_HEADER : HOVER_NONE;
+ hoverSect = QTC_NO_SECT;
+
+ for ( s = 0; s < hd->count() && ( QTC_NO_SECT == hoverSect || !redraw ); ++s ) {
+ QRect r( hd->sectionRect( s ) );
+
+ r.moveLeft( r.x() + widgetZero.x() );
+ r.moveTop( r.y() + widgetZero.y() );
+
+ bool hasNew = r.contains( cursor );
+
+ if ( hasNew )
+ hoverSect = s;
+
+ if ( !redraw ) {
+ bool hasOld = r.contains( oldCursor );
+
+ if ( ( hasNew && !hasOld ) || ( !hasNew && hasOld ) )
+ redraw = true;
+ }
+ }
+ return redraw;
+ } else
+ return oldCursor == QPoint( -1, -1 );
+#if KDE_VERSION >= 0x30400
+
+ }
+#endif
+
+ }
+#if QT_VERSION >= 0x030200
+
+ }
+ }
+#endif
+
+ return false;
+}
+
+#define gdouble double
+
+EDefBtnIndicator qtc_to_ind( const char *str ) {
+ if ( 0 == memcmp( str, "fontcolour", 10 ) )
+ return IND_FONT_COLOUR;
+ if ( 0 == memcmp( str, "border", 6 ) )
+ return IND_BORDER;
+ if ( 0 == memcmp( str, "none", 4 ) )
+ return IND_NONE;
+ return IND_CORNER;
+}
+
+EGroove qtc_to_groove( const char *str ) {
+ if ( 0 == memcmp( str, "raised", 6 ) )
+ return GROOVE_RAISED;
+ if ( 0 == memcmp( str, "none", 4 ) )
+ return GROOVE_NONE;
+ return GROOVE_SUNKEN;
+}
+
+ETBarBorder qtc_to_tbar_border( const char *str ) {
+ if ( 0 == memcmp( str, "dark", 4 ) )
+ return TB_DARK;
+ if ( 0 == memcmp( str, "none", 4 ) )
+ return TB_NONE;
+ if ( 0 == memcmp( str, "light", 5 ) )
+ return TB_LIGHT;
+ return TB_LIGHT;
+}
+
+ELvExpander qtc_to_lv_expander( const char *str ) {
+ return 0 == memcmp( str, "arrow", 5 ) ? LV_EXP_ARR : LV_EXP_PM;
+}
+
+ELvLines qtc_to_lv_lines( const char *str ) {
+ if ( 0 == memcmp( str, "none", 4 ) )
+ return LV_LINES_NONE;
+ if ( 0 == memcmp( str, "dotted", 6 ) )
+ return LV_LINES_DOTTED;
+ return LV_LINES_SOLID;
+}
+
+EProfile qtc_to_profile( const char *str ) {
+ if ( 0 == memcmp( str, "flat", 4 ) )
+ return PROFILE_FLAT;
+ if ( 0 == memcmp( str, "raised", 6 ) )
+ return PROFILE_RAISED;
+ return PROFILE_SUNKEN;
+}
+
+EAppearance qtc_to_appearance( const char *str ) {
+ if ( 0 == memcmp( str, "flat", 4 ) )
+ return APPEARANCE_FLAT;
+ if ( 0 == memcmp( str, "gradient", 8 ) )
+ return APPEARANCE_GRADIENT;
+ return APPEARANCE_LIGHT_GRADIENT;
+}
+
+
+#include "klearlook.moc"
diff --git a/src/gui/kdeext/klearlook.h b/src/gui/kdeext/klearlook.h
new file mode 100644
index 0000000..dd3ab74
--- /dev/null
+++ b/src/gui/kdeext/klearlook.h
@@ -0,0 +1,344 @@
+/* $Id: klearlook.h,v 1.8 2006/04/26 18:55:41 jck Exp $
+*/
+
+/*
+
+ Klearlook (C) Joerg C. Koenig, 2005 [email protected]
+
+----
+
+ Based upon QtCurve (C) Craig Drummond, 2003 [email protected]
+ Bernhard Rosenkränzer <bero@r?dh?t.com>
+ Preston Brown <pbrown@r?dh?t.com>
+ Than Ngo <than@r?dh?t.com>
+
+ Released under the GNU General Public License (GPL) v2.
+
+ Permission is hereby granted, free of charge, to any person obtaining a
+ copy of this software and associated documentation files(the "Software"),
+ to deal in the Software without restriction, including without limitation
+ the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ and/or sell copies of the Software, and to permit persons to whom the
+ Software is furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in
+ all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ DEALINGS IN THE SOFTWARE.
+*/
+
+#ifndef __KLEARLOOK_H__
+#define __KLEARLOOK_H__
+
+#define USE_SINGLE_STYLE 1
+
+#include <kdeversion.h>
+#include <kstyle.h>
+#include <qcolor.h>
+#include <qpoint.h>
+
+#define QTC_CHECK_SIZE 13
+#define QTC_RADIO_SIZE 13
+#define QTC_MIN_BTN_SIZE 10
+#define QTC_LV_SIZE(X) LV_EXP_ARR==(X) ? 7 : 5
+
+#define NUM_SHADES 7
+
+/* Progressbar and selected menu items... */
+#define SHADE_GRADIENT_TOP 0.92
+#define SHADE_GRADIENT_BOTTOM 1.66
+#define SHADE_GRADIENT_LIGHT 1.62
+#define SHADE_GRADIENT_DARK 1.05
+
+/* 3d effect - i.e. buttons, etc */
+#define QTC_SHADES \
+ double shades[2][11][NUM_SHADES]=\
+ { \
+ { \
+ { 1.01, 1.03, 0.868, 0.780, 0.752, 0.74, 1.8 }, \
+ { 1.02, 1.03, 0.870, 0.781, 0.753, 0.70, 1.8 }, \
+ { 1.03, 1.03, 0.872, 0.782, 0.754, 0.68, 1.8 }, \
+ { 1.04, 1.04, 0.875, 0.783, 0.755, 0.64, 1.8 }, \
+ { 1.05, 1.04, 0.878, 0.784, 0.756, 0.62, 1.8 }, \
+ { 1.06, 1.05, 0.881, 0.785, 0.758, 0.58, 1.8 }, \
+ { 1.07, 1.05, 0.884, 0.786, 0.760, 0.54, 1.8 }, \
+ { 1.09, 1.06, 0.887, 0.787, 0.762, 0.50, 1.8 }, /* default */ \
+ { 1.11, 1.06, 0.890, 0.788, 0.764, 0.45, 1.8 }, \
+ { 1.13, 1.07, 0.893, 0.789, 0.766, 0.40, 1.8 }, \
+ { 1.15, 1.07, 0.896, 0.790, 0.768, 0.35, 1.8 } \
+ }, \
+ { \
+ { 1.08, 1.03, 0.868, 0.780, 0.800, 0.74, 1.8 }, \
+ { 1.09, 1.03, 0.870, 0.781, 0.810, 0.72, 1.8 }, \
+ { 1.10, 1.03, 0.872, 0.782, 0.820, 0.70, 1.8 }, \
+ { 1.11, 1.04, 0.875, 0.783, 0.840, 0.68, 1.8 }, \
+ { 1.12, 1.04, 0.878, 0.784, 0.860, 0.66, 1.8 }, \
+ { 1.13, 1.05, 0.881, 0.785, 0.880, 0.64, 1.8 }, \
+ { 1.14, 1.05, 0.884, 0.786, 0.900, 0.62, 1.8 }, \
+ { 1.15, 1.06, 0.887, 0.787, 0.920, 0.60, 1.8 }, /* default */ \
+ { 1.17, 1.06, 0.890, 0.788, 0.764, 0.45, 1.8 }, \
+ { 1.19, 1.07, 0.893, 0.789, 0.766, 0.40, 1.8 }, \
+ { 1.21, 1.07, 0.896, 0.790, 0.768, 0.35, 1.8 } \
+ } \
+ };
+
+#define QTC_SHADE(a, c, s) \
+ (c>10 || c<0 || s>=NUM_SHADES || s<0 ? 1.0 : shades[APPEARANCE_LIGHT_GRADIENT!=(a) ? 0 : 1][c][s])
+
+/* Shades used when gradient effect is selected */
+#define SHADE_BEVEL_GRAD_LIGHT(A) (APPEARANCE_LIGHT_GRADIENT!=(A) ? 1.0 : 1.0 )
+#define SHADE_BEVEL_GRAD_DARK(A) (APPEARANCE_LIGHT_GRADIENT!=(A) ? 0.75 : 0.75 )
+#define SHADE_BEVEL_GRAD_SEL_LIGHT(A) (APPEARANCE_LIGHT_GRADIENT!=(A) ? 1.1 : 1.05 )
+#define SHADE_BEVEL_GRAD_SEL_DARK(A) (APPEARANCE_LIGHT_GRADIENT!=(A) ? 0.95 : 0.95 )
+
+#define SHADE_BEVEL_BUTTON_GRAD_LIGHT(A) 1.00
+#define SHADE_BEVEL_BUTTON_GRAD_DARK(A) 0.89
+
+#define SHADE_BEVEL_MENU_GRAD_LIGHT(A) (APPEARANCE_LIGHT_GRADIENT!=(A) ? 0.97 : 0.97 )
+#define SHADE_BEVEL_MENU_GRAD_DARK(A) (APPEARANCE_LIGHT_GRADIENT!=(A) ? 0.93 : 0.93 )
+
+#define SHADE_TAB_LIGHT(A) (APPEARANCE_LIGHT_GRADIENT!=(A) ? 1.1 : 1.0 )
+#define SHADE_TAB_DARK(A) (APPEARANCE_LIGHT_GRADIENT!=(A) ? 1.0 : 1.0 )
+#define SHADE_TAB_SEL_LIGHT(A) (APPEARANCE_LIGHT_GRADIENT!=(A) ? 1.0 : 1.0 )
+#define SHADE_TAB_SEL_DARK(A) (APPEARANCE_LIGHT_GRADIENT!=(A) ? 1.0 : 1.0 )
+
+#define SHADE_BOTTOM_TAB_LIGHT(A) (APPEARANCE_LIGHT_GRADIENT!=(A) ? 1.0 : 1.0 )
+#define SHADE_BOTTOM_TAB_DARK(A) (APPEARANCE_LIGHT_GRADIENT!=(A) ? 0.95 : 1.0 )
+#define SHADE_BOTTOM_TAB_SEL_LIGHT(A) (APPEARANCE_LIGHT_GRADIENT!=(A) ? 1.0 : 1.0 )
+#define SHADE_BOTTOM_TAB_SEL_DARK(A) (APPEARANCE_LIGHT_GRADIENT!=(A) ? 1.0 : 1.0 )
+
+typedef enum
+{
+ IND_BORDER,
+ IND_CORNER,
+ IND_FONT_COLOUR,
+ IND_NONE
+} EDefBtnIndicator;
+
+typedef enum
+{
+ GROOVE_RAISED,
+ GROOVE_SUNKEN,
+ GROOVE_NONE
+} EGroove;
+
+typedef enum
+{
+ TB_NONE,
+ TB_LIGHT,
+ TB_DARK
+} ETBarBorder;
+
+typedef enum
+{
+ LV_EXP_PM,
+ LV_EXP_ARR
+} ELvExpander;
+
+typedef enum
+{
+ LV_LINES_NONE,
+ LV_LINES_DOTTED,
+ LV_LINES_SOLID
+} ELvLines;
+
+typedef enum
+{
+ PROFILE_FLAT,
+ PROFILE_RAISED,
+ PROFILE_SUNKEN
+} EProfile;
+
+typedef enum
+{
+ APPEARANCE_FLAT,
+ APPEARANCE_GRADIENT,
+ APPEARANCE_LIGHT_GRADIENT
+} EAppearance;
+
+#define DEF_IND_STR "corner"
+#define DEF_HANDLE_STR "sunken"
+#define DEF_TB_BORDER "light"
+#define DEF_APPEARANCE_STR "lightgradient"
+#define DEF_PROFILE_STR "raised"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+ extern EDefBtnIndicator qtc_to_ind( const char * str );
+ extern EGroove qtc_to_groove( const char * str );
+ extern ETBarBorder qtc_to_tbar_border( const char * str );
+ extern ELvExpander qtc_to_lv_expander( const char * str );
+ extern ELvLines qtc_to_lv_lines( const char * str );
+ extern EProfile qtc_to_profile( const char * str );
+ extern EAppearance qtc_to_appearance( const char * str );
+#ifdef __cplusplus
+
+}
+#endif
+
+class KlearlookStyle : public KStyle {
+ Q_OBJECT
+
+ public:
+
+ enum EApp
+ {
+ APP_KICKER,
+ APP_KORN,
+ APP_OPENOFFICE,
+ APP_OTHER
+ };
+
+ enum
+ {
+ GRADIENT_BASE,
+ GRADIENT_LIGHT,
+ GRADIENT_DARK,
+ GRADIENT_TOP,
+ GRADIENT_BOTTOM,
+ GRADIENT_NUM_COLS
+ };
+
+ enum ERound
+ {
+ ROUNDED_NONE,
+ ROUNDED_TOP,
+ ROUNDED_BOTTOM,
+ ROUNDED_LEFT,
+ ROUNDED_RIGHT,
+ ROUNDED_ALL
+ };
+
+ enum EHover
+ {
+ HOVER_NONE,
+ HOVER_CHECK,
+ HOVER_RADIO,
+ HOVER_SB_ADD,
+ HOVER_SB_SUB,
+ HOVER_SB_SLIDER,
+ HOVER_HEADER,
+ HOVER_KICKER
+ };
+
+#ifdef USE_SINGLE_STYLE
+
+ KlearlookStyle();
+#else
+
+ KlearlookStyle( bool gpm, bool bb = false, bool bf = false, bool round = false,
+ EGroove st = GROOVE_RAISED, h = GROOVE_RAISED,
+ bool ge = false, bool va = true, bool bdt = false, bool crlh = true, EDefBtnIndicator dbi = IND_BORDER,
+ int tbb = 5, ELvExpander lve = LV_EXP_PM, lvl = LV_LINES_DOTTED, bool lvd = true, bool icon = true,
+ int popupmenuHighlightLevel = 130 );
+#endif
+
+ virtual ~KlearlookStyle() {}
+
+ void polish( QApplication *app );
+ void polish( QPalette &pal );
+ void polish( QWidget *widget );
+ void unPolish( QWidget *widget );
+ void drawLightBevel( QPainter *p, const QRect &r, const QColorGroup &cg, QStyle::SFlags flags, bool useGrad, ERound round,
+ const QColor &fill, const QColor *custom = NULL, bool light = false ) const;
+ void drawLightBevelButton( QPainter *p, const QRect &r, const QColorGroup &cg, QStyle::SFlags flags, bool useGrad, ERound round,
+ const QColor &fill, const QColor *custom = NULL, bool light = false ) const;
+ void drawArrow( QPainter *p, const QRect &r, const QColorGroup &cg, QStyle::SFlags flags, QStyle::PrimitiveElement pe,
+ bool small = false, bool checkActive = false ) const;
+ void drawPrimitive( PrimitiveElement, QPainter *, const QRect &, const QColorGroup &, SFlags = Style_Default,
+ const QStyleOption & = QStyleOption::Default ) const;
+ void drawPrimitiveMenu( PrimitiveElement, QPainter *, const QRect &, const QColorGroup &, SFlags = Style_Default,
+ const QStyleOption & = QStyleOption::Default ) const;
+ void drawKStylePrimitive( KStylePrimitive kpe, QPainter* p, const QWidget* widget, const QRect &r,
+ const QColorGroup &cg, SFlags flags, const QStyleOption &opt ) const;
+ void drawControl( ControlElement, QPainter *, const QWidget *, const QRect &, const QColorGroup &,
+ SFlags = Style_Default, const QStyleOption & = QStyleOption::Default ) const;
+ void drawControlMask( ControlElement, QPainter *, const QWidget *, const QRect &,
+ const QStyleOption & = QStyleOption::Default ) const;
+ void drawComplexControlMask( ComplexControl control, QPainter *p, const QWidget *widget, const QRect &r,
+ const QStyleOption &data ) const;
+ QRect subRect( SubRect, const QWidget * ) const;
+ void drawComplexControl( ComplexControl, QPainter *, const QWidget *, const QRect &, const QColorGroup &,
+ SFlags = Style_Default, SCFlags = SC_All, SCFlags = SC_None,
+ const QStyleOption & = QStyleOption::Default ) const;
+ QRect querySubControlMetrics( ComplexControl, const QWidget *, SubControl,
+ const QStyleOption & = QStyleOption::Default ) const;
+ int pixelMetric( PixelMetric, const QWidget *widget = 0 ) const;
+ int kPixelMetric( KStylePixelMetric kpm, const QWidget *widget ) const;
+ QSize sizeFromContents( ContentsType, const QWidget *, const QSize &,
+ const QStyleOption & = QStyleOption::Default ) const;
+ int styleHint( StyleHint, const QWidget *widget = 0, const QStyleOption & = QStyleOption::Default,
+ QStyleHintReturn *returnData = 0 ) const;
+
+ protected:
+
+ bool eventFilter( QObject *object, QEvent *event );
+ void drawPBarOrMenu( QPainter *p, QRect const &r, bool horiz, const QColorGroup &cg, bool menu = false ) const;
+ void drawPBarOrMenu2( QPainter *p, QRect const &r, bool horiz, const QColorGroup &cg, bool menu = false ) const;
+ void drawGradientWithBorder( QPainter *p, QRect const &r, bool horiz = true ) const;
+ void drawBevelGradient( const QColor &base, bool increase, int border, QPainter *p, QRect const &r, bool horiz,
+ double shadeTop, double shadeBot ) const;
+ void drawGradient( const QColor &top, const QColor &bot, bool increase, int border, QPainter *p, QRect const &r,
+ bool horiz = true ) const;
+ void drawSliderHandle( QPainter *p, const QRect &r, const QColorGroup &cg, QStyle::SFlags flags ) const;
+ void drawPopupRect( QPainter *p, const QRect &r, const QColorGroup &cg) const ;
+
+ void drawSliderGroove( QPainter *p, const QRect &r, QStyle::SFlags flags, const QWidget *widget ) const;
+
+
+ private:
+
+ void shadeColors( const QColor &base, QColor *vals ) const;
+ const QColor * buttonColors( const QColorGroup &cg ) const;
+ const QColor * backgroundColors( const QColorGroup &cg ) const;
+ bool redrawHoverWidget();
+
+ private:
+
+ QColor menuPbar[ GRADIENT_NUM_COLS < NUM_SHADES + 1 ? NUM_SHADES + 1 : GRADIENT_NUM_COLS ],
+ gray[ NUM_SHADES + 1 ],
+ button[ NUM_SHADES + 1 ]; // Last color = base color, for comparisons!
+ mutable QColor buttonColoured[ NUM_SHADES + 1 ];
+ mutable QColor backgroundColoured[ NUM_SHADES + 1 ];
+ EApp themedApp;
+ int popupmenuHighlightLevel;
+ bool borderButton,
+ menuIcons,
+ darkMenubar,
+ borderFrame,
+ rounded,
+ vArrow,
+ boldDefText,
+ crLabelHighlight,
+ lvDark,
+ borderSplitter;
+ EDefBtnIndicator defBtnIndicator;
+ EGroove sliderThumbs,
+ handles;
+ ETBarBorder toolbarBorders;
+ ELvExpander lvExpander;
+ ELvLines lvLines;
+ EProfile pmProfile;
+ EAppearance appearance;
+#if KDE_VERSION >= 0x30200
+
+ bool isTransKicker;
+#endif
+
+ EHover hover;
+ int contrast;
+ QPoint oldCursor;
+ mutable bool formMode;
+ QWidget *hoverWidget;
+ int hoverSect;
+};
+
+#endif
diff --git a/src/gui/rulers/ChordNameRuler.cpp b/src/gui/rulers/ChordNameRuler.cpp
new file mode 100644
index 0000000..2fc98f2
--- /dev/null
+++ b/src/gui/rulers/ChordNameRuler.cpp
@@ -0,0 +1,523 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "ChordNameRuler.h"
+#include "misc/Debug.h"
+
+#include <klocale.h>
+#include "misc/Strings.h"
+#include "base/AnalysisTypes.h"
+#include "base/Composition.h"
+#include "base/CompositionTimeSliceAdapter.h"
+#include "base/Instrument.h"
+#include "base/NotationTypes.h"
+#include "base/Profiler.h"
+#include "base/PropertyName.h"
+#include "base/NotationQuantizer.h"
+#include "base/RefreshStatus.h"
+#include "base/RulerScale.h"
+#include "base/Segment.h"
+#include "base/Selection.h"
+#include "base/Studio.h"
+#include "base/Track.h"
+#include "document/RosegardenGUIDoc.h"
+#include "document/MultiViewCommandHistory.h"
+#include "gui/general/GUIPalette.h"
+#include <qfont.h>
+#include <qfontmetrics.h>
+#include <qobject.h>
+#include <qpainter.h>
+#include <qrect.h>
+#include <qsize.h>
+#include <qtooltip.h>
+#include <qwidget.h>
+
+
+namespace Rosegarden
+{
+
+ChordNameRuler::ChordNameRuler(RulerScale *rulerScale,
+ RosegardenGUIDoc *doc,
+ double xorigin,
+ int height,
+ QWidget *parent,
+ const char *name) :
+ QWidget(parent, name),
+ m_xorigin(xorigin),
+ m_height(height),
+ m_currentXOffset(0),
+ m_width( -1),
+ m_ready(false),
+ m_rulerScale(rulerScale),
+ m_composition(&doc->getComposition()),
+ m_regetSegmentsOnChange(true),
+ m_currentSegment(0),
+ m_studio(0),
+ m_chordSegment(0),
+ m_fontMetrics(m_boldFont),
+ TEXT_FORMAL_X("TextFormalX"),
+ TEXT_ACTUAL_X("TextActualX")
+{
+ m_font.setPointSize(11);
+ m_font.setPixelSize(12);
+ m_boldFont.setPointSize(11);
+ m_boldFont.setPixelSize(12);
+ m_boldFont.setBold(true);
+ m_fontMetrics = QFontMetrics(m_boldFont);
+ setBackgroundColor(GUIPalette::getColour(GUIPalette::ChordNameRulerBackground));
+
+ m_compositionRefreshStatusId = m_composition->getNewRefreshStatusId();
+
+ QObject::connect(doc->getCommandHistory(), SIGNAL(commandExecuted()),
+ this, SLOT(update()));
+
+ QToolTip::add
+ (this, i18n("Chord name ruler.\nTurn it on and off from the Settings->Rulers menu."));
+
+}
+
+ChordNameRuler::ChordNameRuler(RulerScale *rulerScale,
+ RosegardenGUIDoc *doc,
+ std::vector<Segment *> &segments,
+ double xorigin,
+ int height,
+ QWidget *parent,
+ const char *name) :
+ QWidget(parent, name),
+ m_xorigin(xorigin),
+ m_height(height),
+ m_currentXOffset(0),
+ m_width( -1),
+ m_ready(false),
+ m_rulerScale(rulerScale),
+ m_composition(&doc->getComposition()),
+ m_regetSegmentsOnChange(false),
+ m_currentSegment(0),
+ m_studio(0),
+ m_chordSegment(0),
+ m_fontMetrics(m_boldFont),
+ TEXT_FORMAL_X("TextFormalX"),
+ TEXT_ACTUAL_X("TextActualX")
+{
+ m_font.setPointSize(11);
+ m_font.setPixelSize(12);
+ m_boldFont.setPointSize(11);
+ m_boldFont.setPixelSize(12);
+ m_boldFont.setBold(true);
+ m_fontMetrics = QFontMetrics(m_boldFont);
+ setBackgroundColor(GUIPalette::getColour(GUIPalette::ChordNameRulerBackground));
+
+ m_compositionRefreshStatusId = m_composition->getNewRefreshStatusId();
+
+ QObject::connect(doc->getCommandHistory(), SIGNAL(commandExecuted()),
+ this, SLOT(update()));
+
+ for (std::vector<Segment *>::iterator i = segments.begin();
+ i != segments.end(); ++i) {
+ m_segments.insert(SegmentRefreshMap::value_type
+ (*i, (*i)->getNewRefreshStatusId()));
+ }
+}
+
+ChordNameRuler::~ChordNameRuler()
+{
+ delete m_chordSegment;
+}
+
+void
+ChordNameRuler::setReady()
+{
+ m_ready = true;
+ update();
+}
+
+void
+ChordNameRuler::setCurrentSegment(Segment *segment)
+{
+ m_currentSegment = segment;
+}
+
+void
+ChordNameRuler::setStudio(Studio *studio)
+{
+ m_studio = studio;
+}
+
+void
+ChordNameRuler::slotScrollHoriz(int x)
+{
+ int w = width(), h = height();
+ int dx = x - ( -m_currentXOffset);
+ m_currentXOffset = -x;
+
+ if (dx == 0)
+ return ;
+
+ if (dx > w*7 / 8 || dx < -w*7 / 8) {
+ update();
+ return ;
+ }
+
+ if (dx > 0) { // moving right, so the existing stuff moves left
+ bitBlt(this, 0, 0, this, dx, 0, w - dx, h);
+ repaint(w - dx, 0, dx, h);
+ } else { // moving left, so the existing stuff moves right
+ bitBlt(this, -dx, 0, this, 0, 0, w + dx, h);
+ repaint(0, 0, -dx, h);
+ }
+}
+
+QSize
+ChordNameRuler::sizeHint() const
+{
+ double width =
+ m_rulerScale->getBarPosition(m_rulerScale->getLastVisibleBar()) +
+ m_rulerScale->getBarWidth(m_rulerScale->getLastVisibleBar());
+
+ NOTATION_DEBUG << "Returning chord-label ruler width as " << width << endl;
+
+ QSize res(std::max(int(width), m_width), m_height);
+
+ return res;
+}
+
+QSize
+ChordNameRuler::minimumSizeHint() const
+{
+ double firstBarWidth = m_rulerScale->getBarWidth(0);
+ QSize res = QSize(int(firstBarWidth), m_height);
+ return res;
+}
+
+void
+ChordNameRuler::recalculate(timeT from, timeT to)
+{
+ if (!m_ready)
+ return ;
+
+ Profiler profiler("ChordNameRuler::recalculate");
+ NOTATION_DEBUG << "ChordNameRuler[" << this << "]::recalculate" << endl;
+
+ bool regetSegments = false;
+
+ enum RecalcLevel { RecalcNone, RecalcVisible, RecalcWhole };
+ RecalcLevel level = RecalcNone;
+
+ if (m_segments.empty()) {
+
+ regetSegments = true;
+
+ } else if (m_regetSegmentsOnChange) {
+
+ RefreshStatus &rs =
+ m_composition->getRefreshStatus(m_compositionRefreshStatusId);
+
+ if (rs.needsRefresh()) {
+ rs.setNeedsRefresh(false);
+ regetSegments = true;
+ }
+ }
+
+ if (regetSegments) {
+
+ SegmentSelection ss;
+
+ for (Composition::iterator ci = m_composition->begin();
+ ci != m_composition->end(); ++ci) {
+
+ if (m_studio) {
+
+ TrackId ti = (*ci)->getTrack();
+
+ Instrument *instr = m_studio->getInstrumentById
+ (m_composition->getTrackById(ti)->getInstrument());
+
+ if (instr &&
+ instr->getInstrumentType() == Instrument::Midi &&
+ instr->isPercussion()) {
+ continue;
+ }
+ }
+
+ ss.insert(*ci);
+ }
+
+ std::vector<SegmentRefreshMap::iterator> eraseThese;
+
+ for (SegmentRefreshMap::iterator si = m_segments.begin();
+ si != m_segments.end(); ++si) {
+ if (ss.find(si->first) == ss.end()) {
+ eraseThese.push_back(si);
+ level = RecalcWhole;
+ NOTATION_DEBUG << "Segment deleted, updating (now have " << m_segments.size() << " segments)" << endl;
+ }
+ }
+
+ for (std::vector<SegmentRefreshMap::iterator>::iterator ei = eraseThese.begin();
+ ei != eraseThese.end(); ++ei) {
+ m_segments.erase(*ei);
+ }
+
+
+ for (SegmentSelection::iterator si = ss.begin();
+ si != ss.end(); ++si) {
+
+ if (m_segments.find(*si) == m_segments.end()) {
+ m_segments.insert(SegmentRefreshMap::value_type
+ (*si, (*si)->getNewRefreshStatusId()));
+ level = RecalcWhole;
+ NOTATION_DEBUG << "Segment created, adding (now have " << m_segments.size() << " segments)" << endl;
+ }
+ }
+
+ if (m_currentSegment &&
+ ss.find(m_currentSegment) == ss.end()) {
+ m_currentSegment = 0;
+ level = RecalcWhole;
+ }
+ }
+
+ if (!m_chordSegment)
+ m_chordSegment = new Segment();
+ if (m_segments.empty())
+ return ;
+
+ SegmentRefreshStatus overallStatus;
+ overallStatus.setNeedsRefresh(false);
+
+ for (SegmentRefreshMap::iterator i = m_segments.begin();
+ i != m_segments.end(); ++i) {
+ SegmentRefreshStatus &status =
+ i->first->getRefreshStatus(i->second);
+ if (status.needsRefresh()) {
+ overallStatus.push(status.from(), status.to());
+ }
+ }
+
+ // We now have the overall area affected by these changes, across
+ // all segments. If it's entirely within our displayed area, just
+ // recalculate the displayed area; if it overlaps, calculate the
+ // union of the two areas; if it's entirely without, calculate
+ // nothing.
+
+ if (level == RecalcNone) {
+ if (from == to) {
+ NOTATION_DEBUG << "ChordNameRuler::recalculate: from==to, recalculating all" << endl;
+ level = RecalcWhole;
+ } else if (overallStatus.from() == overallStatus.to()) {
+ NOTATION_DEBUG << "ChordNameRuler::recalculate: overallStatus.from==overallStatus.to, ignoring" << endl;
+ level = RecalcNone;
+ } else if (overallStatus.from() >= from && overallStatus.to() <= to) {
+ NOTATION_DEBUG << "ChordNameRuler::recalculate: change is " << overallStatus.from() << "->" << overallStatus.to() << ", I show " << from << "->" << to << ", recalculating visible area" << endl;
+ level = RecalcVisible;
+ } else if (overallStatus.from() >= to || overallStatus.to() <= from) {
+ NOTATION_DEBUG << "ChordNameRuler::recalculate: change is " << overallStatus.from() << "->" << overallStatus.to() << ", I show " << from << "->" << to << ", ignoring" << endl;
+ level = RecalcNone;
+ } else {
+ NOTATION_DEBUG << "ChordNameRuler::recalculate: change is " << overallStatus.from() << "->" << overallStatus.to() << ", I show " << from << "->" << to << ", recalculating whole" << endl;
+ level = RecalcWhole;
+ }
+ }
+
+ if (level == RecalcNone)
+ return ;
+
+ for (SegmentRefreshMap::iterator i = m_segments.begin();
+ i != m_segments.end(); ++i) {
+ i->first->getRefreshStatus(i->second).setNeedsRefresh(false);
+ }
+
+ if (!m_currentSegment) { //!!! arbitrary, must do better
+ //!!! need a segment starting at zero or so with a clef and key in it!
+ m_currentSegment = m_segments.begin()->first;
+ }
+
+ /*!!!
+
+ for (Composition::iterator ci = m_composition->begin();
+ ci != m_composition->end(); ++ci) {
+
+ if ((*ci)->getEndMarkerTime() >= from &&
+ ((*ci)->getStartTime() <= from ||
+ (clefKeySegment &&
+ (*ci)->getStartTime() < clefKeySegment->getStartTime()))) {
+
+ clefKeySegment = *ci;
+ }
+ }
+
+ if (!clefKeySegment) return;
+ }
+ */
+
+ if (level == RecalcWhole) {
+
+ m_chordSegment->clear();
+
+ timeT clefKeyTime = m_currentSegment->getStartTime();
+ //(from < m_currentSegment->getStartTime() ?
+ // m_currentSegment->getStartTime() : from);
+
+ Clef clef = m_currentSegment->getClefAtTime(clefKeyTime);
+ m_chordSegment->insert(clef.getAsEvent( -1));
+
+ ::Rosegarden::Key key = m_currentSegment->getKeyAtTime(clefKeyTime);
+ m_chordSegment->insert(key.getAsEvent( -1));
+
+ from = 0;
+ to = 0;
+
+ } else {
+ Segment::iterator i = m_chordSegment->findTime(from);
+ Segment::iterator j = m_chordSegment->findTime(to);
+ m_chordSegment->erase(i, j);
+ }
+
+ SegmentSelection selection;
+ for (SegmentRefreshMap::iterator si = m_segments.begin(); si != m_segments.end();
+ ++si) {
+ selection.insert(si->first);
+ }
+
+ CompositionTimeSliceAdapter adapter(m_composition, &selection, from, to);
+ AnalysisHelper helper;
+ helper.labelChords(adapter, *m_chordSegment, m_composition->getNotationQuantizer());
+}
+
+void
+ChordNameRuler::paintEvent(QPaintEvent* e)
+{
+ if (!m_composition || !m_ready)
+ return ;
+
+ NOTATION_DEBUG << "*** Chord Name Ruler: paintEvent" << endl;
+
+ Profiler profiler1("ChordNameRuler::paintEvent (whole)");
+
+ QPainter paint(this);
+ paint.setPen(GUIPalette::getColour(GUIPalette::ChordNameRulerForeground));
+
+ paint.setClipRegion(e->region());
+ paint.setClipRect(e->rect().normalize());
+
+ QRect clipRect = paint.clipRegion().boundingRect();
+
+ timeT from = m_rulerScale->getTimeForX
+ (clipRect.x() - m_currentXOffset - m_xorigin - 50);
+ timeT to = m_rulerScale->getTimeForX
+ (clipRect.x() + clipRect.width() - m_currentXOffset - m_xorigin + 50);
+
+ recalculate(from, to);
+
+ if (!m_chordSegment)
+ return ;
+
+ Profiler profiler2("ChordNameRuler::paintEvent (paint)");
+
+ QRect boundsForHeight = m_fontMetrics.boundingRect("^j|lM");
+ int fontHeight = boundsForHeight.height();
+ int textY = (height() - 6) / 2 + fontHeight / 2;
+
+ double prevX = 0;
+ timeT keyAt = from - 1;
+ std::string keyText;
+
+ NOTATION_DEBUG << "*** Chord Name Ruler: paint " << from << " -> " << to << endl;
+
+ for (Segment::iterator i = m_chordSegment->findTime(from);
+ i != m_chordSegment->findTime(to); ++i) {
+
+ NOTATION_DEBUG << "type " << (*i)->getType() << " at " << (*i)->getAbsoluteTime()
+ << endl;
+
+ if (!(*i)->isa(Text::EventType) ||
+ !(*i)->has(Text::TextPropertyName) ||
+ !(*i)->has(Text::TextTypePropertyName))
+ continue;
+
+ std::string text((*i)->get
+ <String>(Text::TextPropertyName));
+
+ if ((*i)->get
+ <String>(Text::TextTypePropertyName) == Text::KeyName) {
+ timeT myTime = (*i)->getAbsoluteTime();
+ if (myTime == keyAt && text == keyText)
+ continue;
+ else {
+ keyAt = myTime;
+ keyText = text;
+ }
+ }
+
+ double x = m_rulerScale->getXForTime((*i)->getAbsoluteTime());
+ (*i)->set
+ <Int>(TEXT_FORMAL_X, (long)x);
+
+ QRect textBounds = m_fontMetrics.boundingRect(strtoqstr(text));
+ int width = textBounds.width();
+
+ x -= width / 2;
+ if (prevX >= x - 3)
+ x = prevX + 3;
+ (*i)->set
+ <Int>(TEXT_ACTUAL_X, long(x));
+ prevX = x + width;
+ }
+
+ for (Segment::iterator i = m_chordSegment->findTime(from);
+ i != m_chordSegment->findTime(to); ++i) {
+
+ if (!(*i)->isa(Text::EventType))
+ continue;
+ std::string text((*i)->get
+ <String>(Text::TextPropertyName));
+ std::string type((*i)->get
+ <String>(Text::TextTypePropertyName));
+
+ if (!(*i)->has(TEXT_FORMAL_X))
+ continue;
+
+ long formalX = (*i)->get
+ <Int>(TEXT_FORMAL_X);
+ long actualX = (*i)->get
+ <Int>(TEXT_ACTUAL_X);
+
+ formalX += m_currentXOffset + long(m_xorigin);
+ actualX += m_currentXOffset + long(m_xorigin);
+
+ paint.drawLine(formalX, height() - 4, formalX, height());
+
+ if (type == Text::KeyName) {
+ paint.setFont(m_boldFont);
+ } else {
+ paint.setFont(m_font);
+ }
+
+ paint.drawText(actualX, textY, strtoqstr(text));
+ }
+}
+
+}
+#include "ChordNameRuler.moc"
diff --git a/src/gui/rulers/ChordNameRuler.h b/src/gui/rulers/ChordNameRuler.h
new file mode 100644
index 0000000..70cdc12
--- /dev/null
+++ b/src/gui/rulers/ChordNameRuler.h
@@ -0,0 +1,146 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_CHORDNAMERULER_H_
+#define _RG_CHORDNAMERULER_H_
+
+#include "base/PropertyName.h"
+#include <map>
+#include <qfont.h>
+#include <qfontmetrics.h>
+#include <qsize.h>
+#include <qwidget.h>
+#include <vector>
+#include "base/Event.h"
+
+
+class QPaintEvent;
+
+
+namespace Rosegarden
+{
+
+class Studio;
+class Segment;
+class RulerScale;
+class RosegardenGUIDoc;
+class Composition;
+
+
+/**
+ * ChordNameRuler is a widget that shows a strip of text strings
+ * describing the chords in a composition.
+ */
+
+class ChordNameRuler : public QWidget
+{
+ Q_OBJECT
+
+public:
+ /**
+ * Construct a ChordNameRuler that displays the chords in the
+ * given Composition at positions calculated by the given
+ * RulerScale. Be aware that it will not be refreshed until
+ * setReady is called (because the first refresh is expensive).
+ */
+ ChordNameRuler(RulerScale *rulerScale,
+ RosegardenGUIDoc *doc,
+ double xorigin = 0.0,
+ int height = 0,
+ QWidget* parent = 0,
+ const char *name = 0);
+
+ /**
+ * Construct a ChordNameRuler that displays the chords in the
+ * given Segments at positions calculated by the given
+ * RulerScale. Be aware that it will not be refreshed until
+ * setReady is called (because the first refresh is expensive).
+ */
+ ChordNameRuler(RulerScale *rulerScale,
+ RosegardenGUIDoc *doc,
+ std::vector<Segment *> &segments,
+ double xorigin = 0.0,
+ int height = 0,
+ QWidget* parent = 0,
+ const char *name = 0);
+
+ ~ChordNameRuler();
+
+ /// Indicate that the chord-name ruler should make itself ready and refresh
+ void setReady();
+
+ // may have one of these; can be changed at any time (to any in given composition):
+ void setCurrentSegment(Segment *segment);
+
+ // may have one of these (to avoid using percussion tracks in chords):
+ void setStudio(Studio *studio);
+
+ virtual QSize sizeHint() const;
+ virtual QSize minimumSizeHint() const;
+
+ void setMinimumWidth(int width) { m_width = width; }
+
+public slots:
+ void slotScrollHoriz(int x);
+
+protected:
+ virtual void paintEvent(QPaintEvent *);
+
+private:
+ void recalculate(timeT from = 0,
+ timeT to = 0);
+
+ double m_xorigin;
+ int m_height;
+ int m_currentXOffset;
+ int m_width;
+ bool m_ready;
+
+ RulerScale *m_rulerScale;
+
+ Composition *m_composition;
+ unsigned int m_compositionRefreshStatusId;
+
+ typedef std::map<Segment *, int> SegmentRefreshMap;
+ SegmentRefreshMap m_segments; // map to refresh status id
+ bool m_regetSegmentsOnChange;
+
+ Segment *m_currentSegment;
+ Studio *m_studio;
+
+ Segment *m_chordSegment;
+
+ QFont m_font;
+ QFont m_boldFont;
+ QFontMetrics m_fontMetrics;
+
+ const PropertyName TEXT_FORMAL_X;
+ const PropertyName TEXT_ACTUAL_X;
+};
+
+
+}
+
+#endif
diff --git a/src/gui/rulers/ControlChangeCommand.cpp b/src/gui/rulers/ControlChangeCommand.cpp
new file mode 100644
index 0000000..f6f5d0e
--- /dev/null
+++ b/src/gui/rulers/ControlChangeCommand.cpp
@@ -0,0 +1,50 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include "ControlChangeCommand.h"
+#include "ControlItem.h"
+#include "misc/Debug.h"
+#include <klocale.h>
+
+namespace Rosegarden {
+
+ControlChangeCommand::ControlChangeCommand(QCanvasItemList selectedItems,
+ Segment &segment,
+ Rosegarden::timeT start, Rosegarden::timeT end)
+ : BasicCommand(i18n("Control Change"), segment, start, end, true),
+ m_selectedItems(selectedItems)
+{
+ RG_DEBUG << "ControlChangeCommand : from " << start << " to " << end << endl;
+}
+
+
+void ControlChangeCommand::modifySegment()
+{
+ for (QCanvasItemList::Iterator it=m_selectedItems.begin(); it!=m_selectedItems.end(); ++it) {
+ if (ControlItem *item = dynamic_cast<ControlItem*>(*it))
+ item->updateValue();
+ }
+}
+
+}
diff --git a/src/gui/rulers/ControlChangeCommand.h b/src/gui/rulers/ControlChangeCommand.h
new file mode 100644
index 0000000..cc334a4
--- /dev/null
+++ b/src/gui/rulers/ControlChangeCommand.h
@@ -0,0 +1,55 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_CONTROLCHANGECOMMAND_H_
+#define _RG_CONTROLCHANGECOMMAND_H_
+
+#include "document/BasicCommand.h"
+#include <qcanvas.h>
+
+namespace Rosegarden {
+
+/**
+ * Command defining a change (property change or similar) from the control ruler
+ */
+class ControlChangeCommand : public BasicCommand
+{
+public:
+
+ ControlChangeCommand(QCanvasItemList selectedItems,
+ Segment &segment,
+ Rosegarden::timeT start, Rosegarden::timeT end);
+ virtual ~ControlChangeCommand() {;}
+
+
+protected:
+
+ virtual void modifySegment();
+
+ QCanvasItemList m_selectedItems;
+};
+
+}
+
+#endif /*CONTROLCHANGECOMMAND_H_*/
diff --git a/src/gui/rulers/ControlItem.cpp b/src/gui/rulers/ControlItem.cpp
new file mode 100644
index 0000000..623fbf3
--- /dev/null
+++ b/src/gui/rulers/ControlItem.cpp
@@ -0,0 +1,195 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include "ControlItem.h"
+#include "ControlRuler.h"
+#include "ElementAdapter.h"
+#include "misc/Debug.h"
+
+namespace Rosegarden {
+
+const unsigned int ControlItem::BorderThickness = 1;
+const unsigned int ControlItem::DefaultWidth = 20;
+static int _canvasItemZ = 30;
+
+ControlItem::ControlItem(ControlRuler* ruler, ElementAdapter* elementAdapter,
+ int xx, int width)
+ : QCanvasRectangle(ruler->canvas()),
+ m_value(0),
+ m_controlRuler(ruler),
+ m_elementAdapter(elementAdapter)
+{
+ if (width < DefaultWidth/4) {
+ width = DefaultWidth/4; // avoid invisible zero-duration items
+ }
+ setWidth(width);
+ setPen(QPen(Qt::black, BorderThickness));
+ setBrush(Qt::blue);
+
+ setX(xx);
+ setY(canvas()->height());
+ setZ(_canvasItemZ++); // we should make this work against controlruler
+
+ updateFromValue();
+ setEnabled(false);
+ //RG_DEBUG << "ControlItem x = " << x() << " - y = " << y() << " - width = " << width << endl;
+ show();
+}
+
+ControlItem::~ControlItem()
+{
+ delete m_elementAdapter;
+}
+
+
+void ControlItem::setValue(long v)
+{
+// RG_DEBUG << "ControlItem::setValue(" << v << ") x = " << x() << endl;
+
+ m_value = v;
+}
+
+void ControlItem::updateValue()
+{
+ m_elementAdapter->setValue(m_value);
+}
+
+void ControlItem::updateFromValue()
+{
+// RG_DEBUG << "ControlItem::updateFromValue() : " << this << endl;
+
+ if (m_elementAdapter->getValue(m_value)) {
+// RG_DEBUG << "ControlItem::updateFromValue() : value = " << m_value << endl;
+ setHeight(m_controlRuler->valueToHeight(m_value));
+ }
+}
+
+typedef std::pair<int, QCanvasItem*> ItemPair;
+struct ItemCmp
+{
+ bool operator()(const ItemPair &i1, const ItemPair &i2)
+ {
+ return i1.first > i2.first;
+ }
+};
+
+void ControlItem::draw(QPainter &painter)
+{
+ if (!isEnabled())
+ updateFromValue();
+
+ setBrush(m_controlRuler->valueToColour(m_controlRuler->getMaxItemValue(), m_value));
+
+ QCanvasRectangle::draw(painter);
+
+
+ /*
+
+ // Attempt to get overlapping rectangles ordered automatically -
+ // probably best not to do this here - rwb
+
+ // calculate collisions and assign Z values accordingly
+ //
+ QCanvasItemList l = collisions(false);
+
+ std::vector<ItemPair> sortList;
+
+ for (QCanvasItemList::Iterator it=l.begin(); it!=l.end(); ++it) {
+
+ // skip all but rectangles
+ if ((*it)->rtti() != QCanvasItem::Rtti_Rectangle) continue;
+
+ if (QCanvasRectangle *rect = dynamic_cast<QCanvasRectangle*>(*it))
+ sortList.push_back(ItemPair(rect->height(), *it));
+ }
+
+ // sort the list by height
+ std::sort(sortList.begin(), sortList.end(), ItemCmp());
+
+ int z = 20;
+
+ for (std::vector<ItemPair>::iterator it = sortList.begin();
+ it != sortList.end(); ++it)
+ {
+ RG_DEBUG << "HEIGHT = " << (*it).first << endl;
+ (*it).second->setZ(z++);
+ }
+
+ RG_DEBUG << endl << endl;
+
+ canvas()->update();
+
+ */
+
+}
+
+void ControlItem::handleMouseButtonPress(QMouseEvent*)
+{
+// RG_DEBUG << "ControlItem::handleMouseButtonPress()" << this << endl;
+ setEnabled(true);
+}
+
+void ControlItem::handleMouseButtonRelease(QMouseEvent*)
+{
+// RG_DEBUG << "ControlItem::handleMouseButtonRelease()" << this << endl;
+ setEnabled(false);
+}
+
+void ControlItem::handleMouseMove(QMouseEvent*, int /*deltaX*/, int deltaY)
+{
+// RG_DEBUG << "ControlItem::handleMouseMove()" << this << endl;
+
+ // height is always negative
+ //
+
+ m_controlRuler->applyTool(x(), deltaY);
+
+ int absNewHeight = -(getHeight() + deltaY);
+
+ // Make sure height is within bounds
+ if (absNewHeight > ControlRuler::MaxItemHeight)
+ absNewHeight = ControlRuler::MaxItemHeight;
+ else if (absNewHeight < ControlRuler::MinItemHeight)
+ absNewHeight = ControlRuler::MinItemHeight;
+
+ setHeight(-absNewHeight);
+ setValue(m_controlRuler->heightToValue(getHeight()));
+}
+
+void ControlItem::handleMouseWheel(QWheelEvent *)
+{
+// RG_DEBUG << "ControlItem::handleMouseWheel - got wheel event" << endl;
+}
+
+void ControlItem::setSelected(bool s)
+{
+ QCanvasItem::setSelected(s);
+
+ if (s) setPen(QPen(Qt::red, BorderThickness));
+ else setPen(QPen(Qt::black, BorderThickness));
+
+ canvas()->update();
+}
+
+}
diff --git a/src/gui/rulers/ControlItem.h b/src/gui/rulers/ControlItem.h
new file mode 100644
index 0000000..44f9e22
--- /dev/null
+++ b/src/gui/rulers/ControlItem.h
@@ -0,0 +1,79 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include <qcanvas.h>
+
+namespace Rosegarden {
+
+class ControlRuler;
+class ElementAdapter;
+
+class ControlItem : public QCanvasRectangle
+{
+public:
+ ControlItem(ControlRuler* controlRuler,
+ ElementAdapter* adapter,
+ int x, int width = DefaultWidth);
+
+ ~ControlItem();
+
+ virtual void setValue(long);
+ int getValue() const { return m_value; }
+
+ void setWidth(int w) { setSize(w, height()); }
+ void setHeight(int h) { setSize(width(), h); }
+ int getHeight() { return size().height(); }
+
+ virtual void draw(QPainter &painter);
+
+ virtual void handleMouseButtonPress(QMouseEvent *e);
+ virtual void handleMouseButtonRelease(QMouseEvent *e);
+ virtual void handleMouseMove(QMouseEvent *e, int deltaX, int deltaY);
+ virtual void handleMouseWheel(QWheelEvent *e);
+
+ virtual void setSelected(bool yes);
+
+ /// recompute height according to represented value prior to a canvas repaint
+ virtual void updateFromValue();
+
+ /// update value according to height after a user edit
+ virtual void updateValue();
+
+ ElementAdapter* getElementAdapter() { return m_elementAdapter; }
+
+protected:
+
+ //--------------- Data members ---------------------------------
+
+ long m_value;
+ bool m_handlingMouseMove;
+
+ ControlRuler* m_controlRuler;
+ ElementAdapter* m_elementAdapter;
+
+ static const unsigned int BorderThickness;
+ static const unsigned int DefaultWidth;
+};
+
+}
diff --git a/src/gui/rulers/ControlRuler.cpp b/src/gui/rulers/ControlRuler.cpp
new file mode 100644
index 0000000..12064f5
--- /dev/null
+++ b/src/gui/rulers/ControlRuler.cpp
@@ -0,0 +1,539 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "ControlRuler.h"
+
+#include "base/Event.h"
+#include "misc/Debug.h"
+#include "base/RulerScale.h"
+#include "base/Segment.h"
+#include "base/Selection.h"
+#include "ControlChangeCommand.h"
+#include "ControlItem.h"
+#include "ControlSelector.h"
+#include "ControlTool.h"
+#include "DefaultVelocityColour.h"
+#include "ElementAdapter.h"
+#include "gui/general/EditView.h"
+#include "gui/general/RosegardenCanvasView.h"
+#include "gui/widgets/TextFloat.h"
+#include <kmainwindow.h>
+#include <qcanvas.h>
+#include <qcolor.h>
+#include <qcursor.h>
+#include <qpoint.h>
+#include <qpopupmenu.h>
+#include <qscrollbar.h>
+#include <qscrollview.h>
+#include <qstring.h>
+#include <qwidget.h>
+#include <algorithm>
+
+
+namespace Rosegarden
+{
+
+const int ControlRuler::DefaultRulerHeight = 75;
+const int ControlRuler::MinItemHeight = 5;
+const int ControlRuler::MaxItemHeight = 64 + 5;
+const int ControlRuler::ItemHeightRange = 64;
+
+ControlRuler::ControlRuler(Segment *segment,
+ RulerScale* rulerScale,
+ EditViewBase* parentView,
+ QCanvas* c, QWidget* parent,
+ const char* name, WFlags f) :
+ RosegardenCanvasView(c, parent, name, f),
+ m_parentEditView(parentView),
+ m_mainHorizontalScrollBar(0),
+ m_rulerScale(rulerScale),
+ m_eventSelection(new EventSelection(*segment)),
+ m_segment(segment),
+ m_currentItem(0),
+ m_tool(0),
+ m_maxItemValue(127),
+ m_staffOffset(0),
+ m_currentX(0.0),
+ m_itemMoved(false),
+ m_selecting(false),
+ m_selector(new ControlSelector(this)),
+ m_selectionRect(new QCanvasRectangle(canvas())),
+ m_menu(0)
+{
+ setHScrollBarMode(QScrollView::AlwaysOff);
+
+ m_selectionRect->setPen(Qt::red);
+
+ setFixedHeight(sizeHint().height());
+
+ connect(this, SIGNAL(stateChange(const QString&, bool)),
+ m_parentEditView, SLOT(slotStateChanged(const QString&, bool)));
+
+ m_numberFloat = new TextFloat(this);
+ m_numberFloat->hide();
+
+ m_segment->addObserver(this);
+
+ emit stateChange("have_controller_item_selected", false);
+}
+
+ControlRuler::~ControlRuler()
+{
+ if (m_segment) {
+ m_segment->removeObserver(this);
+ }
+}
+
+void ControlRuler::slotUpdate()
+{
+ RG_DEBUG << "ControlRuler::slotUpdate()\n";
+
+ canvas()->setAllChanged(); // TODO: be a bit more subtle, call setChanged(<time area>)
+
+ canvas()->update();
+ repaint();
+}
+
+void ControlRuler::slotUpdateElementsHPos()
+{
+ computeStaffOffset();
+
+ QCanvasItemList list = canvas()->allItems();
+
+ QCanvasItemList::Iterator it = list.begin();
+ for (; it != list.end(); ++it) {
+ ControlItem* item = dynamic_cast<ControlItem*>(*it);
+ if (!item)
+ continue;
+ layoutItem(item);
+ }
+
+ canvas()->update();
+}
+
+void ControlRuler::layoutItem(ControlItem* item)
+{
+ timeT itemTime = item->getElementAdapter()->getTime();
+
+ double x = m_rulerScale->getXForTime(itemTime);
+
+ item->setX(x + m_staffOffset);
+ int itemElementDuration = item->getElementAdapter()->getDuration();
+
+ int width = int(m_rulerScale->getXForTime(itemTime + itemElementDuration) - x);
+
+ item->setWidth(width);
+
+ // RG_DEBUG << "ControlRuler::layoutItem ControlItem x = " << x << " - width = " << width << endl;
+}
+
+void ControlRuler::setControlTool(ControlTool* tool)
+{
+ if (m_tool)
+ delete m_tool;
+ m_tool = tool;
+}
+
+void
+ControlRuler::segmentDeleted(const Segment *)
+{
+ m_segment = 0;
+}
+
+void ControlRuler::contentsMousePressEvent(QMouseEvent* e)
+{
+ if (e->button() != Qt::LeftButton) {
+ m_numberFloat->hide();
+ m_selecting = false;
+ return ;
+ }
+
+ RG_DEBUG << "ControlRuler::contentsMousePressEvent()\n";
+
+ QPoint p = inverseMapPoint(e->pos());
+
+ QCanvasItemList l = canvas()->collisions(p);
+
+ if (l.count() == 0) { // de-select current item
+ clearSelectedItems();
+ m_selecting = true;
+ m_selector->handleMouseButtonPress(e);
+ RG_DEBUG << "ControlRuler::contentsMousePressEvent : entering selection mode\n";
+ return ;
+ }
+
+ // clear selection unless control was pressed, in which case
+ // add the event to the current selection
+ if (!(e->state() && QMouseEvent::ControlButton)) {
+ clearSelectedItems();
+ }
+
+ ControlItem *topItem = 0;
+ for (QCanvasItemList::Iterator it = l.begin(); it != l.end(); ++it) {
+
+ if (ControlItem *item = dynamic_cast<ControlItem*>(*it)) {
+
+ if (topItem == 0)
+ topItem = item;
+
+ if (item->isSelected()) { // if the item which was clicked
+ // on is part of a selection,
+ // propagate mousepress on all
+ // selected items
+
+ item->handleMouseButtonPress(e);
+
+ for (QCanvasItemList::Iterator it = m_selectedItems.begin();
+ it != m_selectedItems.end(); ++it) {
+ if (ControlItem *selectedItem =
+ dynamic_cast<ControlItem*>(*it)) {
+ selectedItem->handleMouseButtonPress(e);
+ }
+ }
+
+
+ } else { // select it
+
+ if (!(e->state() && QMouseEvent::ControlButton)) {
+ if (item->z() > topItem->z())
+ topItem = item;
+
+ } else {
+ m_selectedItems << item;
+ item->setSelected(true);
+ item->handleMouseButtonPress(e);
+ ElementAdapter* adapter = item->getElementAdapter();
+ m_eventSelection->addEvent(adapter->getEvent());
+ }
+ }
+ }
+ }
+
+ if (topItem && !m_selectedItems.contains(topItem)) { // select the top item
+ m_selectedItems << topItem;
+ topItem->setSelected(true);
+ topItem->handleMouseButtonPress(e);
+ ElementAdapter* adapter = topItem->getElementAdapter();
+ m_eventSelection->addEvent(adapter->getEvent());
+ }
+
+ m_itemMoved = false;
+ m_lastEventPos = p;
+}
+
+void ControlRuler::contentsMouseReleaseEvent(QMouseEvent* e)
+{
+ if (e->button() != Qt::LeftButton) {
+ m_numberFloat->hide();
+ m_selecting = false;
+ return ;
+ }
+
+ if (m_selecting) {
+ updateSelection();
+ m_selector->handleMouseButtonRelease(e);
+ RG_DEBUG << "ControlRuler::contentsMouseReleaseEvent : leaving selection mode\n";
+ m_selecting = false;
+ return ;
+ }
+
+ for (QCanvasItemList::Iterator it = m_selectedItems.begin(); it != m_selectedItems.end(); ++it) {
+ if (ControlItem *item = dynamic_cast<ControlItem*>(*it)) {
+
+ ElementAdapter * adapter = item->getElementAdapter();
+ m_eventSelection->addEvent(adapter->getEvent());
+ item->handleMouseButtonRelease(e);
+ }
+ }
+
+ emit stateChange("have_controller_item_selected", true);
+
+ if (m_itemMoved) {
+
+ m_lastEventPos = inverseMapPoint(e->pos());
+
+ // Add command to history
+ ControlChangeCommand* command = new ControlChangeCommand(m_selectedItems,
+ *m_segment,
+ m_eventSelection->getStartTime(),
+ m_eventSelection->getEndTime());
+
+ RG_DEBUG << "ControlRuler::contentsMouseReleaseEvent : adding command\n";
+ m_parentEditView->addCommandToHistory(command);
+
+ m_itemMoved = false;
+ }
+
+ m_numberFloat->hide();
+}
+
+void ControlRuler::contentsMouseMoveEvent(QMouseEvent* e)
+{
+ QPoint p = inverseMapPoint(e->pos());
+
+ int deltaX = p.x() - m_lastEventPos.x(),
+ deltaY = p.y() - m_lastEventPos.y();
+ m_lastEventPos = p;
+
+ if (m_selecting) {
+ updateSelection();
+ m_selector->handleMouseMove(e, deltaX, deltaY);
+ slotScrollHorizSmallSteps(p.x());
+ return ;
+ }
+
+ m_itemMoved = true;
+
+ // Borrowed from Rotary - compute total position within window
+ //
+ QPoint totalPos = mapTo(topLevelWidget(), QPoint(0, 0));
+
+ int scrollX = dynamic_cast<EditView*>(m_parentEditView)->getRawCanvasView()->
+ horizontalScrollBar()->value();
+
+ /*
+ RG_DEBUG << "ControlRuler::contentsMouseMoveEvent - total pos = " << totalPos.x()
+ << ",e pos = " << e->pos().x()
+ << ", scroll bar = " << scrollX
+ << endl;
+ */
+
+ // Allow for scrollbar
+ //
+ m_numberFloat->move(totalPos.x() + e->pos().x() - scrollX + 20,
+ totalPos.y() + e->pos().y() - 10);
+
+ int value = 0;
+
+ for (QCanvasItemList::Iterator it = m_selectedItems.begin(); it != m_selectedItems.end(); ++it) {
+ if (ControlItem *item = dynamic_cast<ControlItem*>(*it)) {
+ item->handleMouseMove(e, deltaX, deltaY);
+ // ElementAdapter* adapter = item->getElementAdapter();
+
+ // set value to highest in selection
+ if (item->getValue() >= value) {
+ value = item->getValue();
+ m_numberFloat->setText(QString("%1").arg(value));
+ }
+ }
+ }
+ canvas()->update();
+
+ m_numberFloat->show();
+
+}
+
+void
+ControlRuler::contentsWheelEvent(QWheelEvent *e)
+{
+ // not sure what to do yet
+ QCanvasView::contentsWheelEvent(e);
+}
+
+void ControlRuler::updateSelection()
+{
+ clearSelectedItems();
+
+ bool haveSelectedItems = false;
+
+ QCanvasItemList l = getSelectionRectangle()->collisions(true);
+
+ for (QCanvasItemList::Iterator it = l.begin(); it != l.end(); ++it) {
+
+ if (ControlItem *item = dynamic_cast<ControlItem*>(*it)) {
+ item->setSelected(true);
+ m_selectedItems << item;
+ haveSelectedItems = true;
+
+ ElementAdapter* adapter = item->getElementAdapter();
+ m_eventSelection->addEvent(adapter->getEvent());
+ }
+ }
+
+ emit stateChange("have_controller_item_selected", haveSelectedItems);
+}
+
+void ControlRuler::contentsContextMenuEvent(QContextMenuEvent* e)
+{
+ if (!m_menu && !m_menuName.isEmpty())
+ createMenu();
+
+ if (m_menu) {
+ RG_DEBUG << "ControlRuler::showMenu() - show menu with" << m_menu->count() << " items\n";
+ m_lastEventPos = inverseMapPoint(e->pos());
+ m_menu->exec(QCursor::pos());
+ } else
+ RG_DEBUG << "ControlRuler::showMenu() : no menu to show\n";
+
+}
+
+void ControlRuler::createMenu()
+{
+ RG_DEBUG << "ControlRuler::createMenu()\n";
+
+ KMainWindow* parentMainWindow = dynamic_cast<KMainWindow*>(topLevelWidget());
+
+ if (parentMainWindow && parentMainWindow->factory()) {
+ m_menu = static_cast<QPopupMenu*>(parentMainWindow->factory()->container(m_menuName, parentMainWindow));
+
+ if (!m_menu) {
+ RG_DEBUG << "ControlRuler::createMenu() failed\n";
+ }
+ } else {
+ RG_DEBUG << "ControlRuler::createMenu() failed: no parent factory\n";
+ }
+}
+
+void
+ControlRuler::clearSelectedItems()
+{
+ for (QCanvasItemList::Iterator it = m_selectedItems.begin(); it != m_selectedItems.end(); ++it) {
+ (*it)->setSelected(false);
+ }
+ m_selectedItems.clear();
+
+ delete m_eventSelection;
+ m_eventSelection = new EventSelection(*m_segment);
+}
+
+void ControlRuler::clear()
+{
+ QCanvasItemList allItems = canvas()->allItems();
+
+ for (QCanvasItemList::Iterator it = allItems.begin(); it != allItems.end(); ++it) {
+ if (ControlItem *item = dynamic_cast<ControlItem*>(*it)) {
+ delete item;
+ }
+ }
+}
+
+int ControlRuler::valueToHeight(long val)
+{
+ long scaleVal = val * (ItemHeightRange);
+
+ int res = -(int(scaleVal / getMaxItemValue()) + MinItemHeight);
+
+ //RG_DEBUG << "ControlRuler::valueToHeight : val = " << val << " - height = " << res
+ //<< " - scaleVal = " << scaleVal << endl;
+
+ return res;
+}
+
+long ControlRuler::heightToValue(int h)
+{
+ long val = -h;
+ val -= MinItemHeight;
+ val *= getMaxItemValue();
+ val /= (ItemHeightRange);
+ val = std::min(val, long(getMaxItemValue()));
+ return val;
+}
+
+QColor ControlRuler::valueToColour(int max, int val)
+{
+ int maxDefault = DefaultVelocityColour::getInstance()->getMaxValue();
+
+ int value = val;
+
+ // Scale value accordingly
+ //
+ if (maxDefault != max)
+ value = int(double(maxDefault) * double(val) / double(max));
+
+ return DefaultVelocityColour::getInstance()->getColour(value);
+}
+
+int ControlRuler::applyTool(double x, int val)
+{
+ if (m_tool)
+ return (*m_tool)(x, val);
+ return val;
+}
+
+void ControlRuler::flipForwards()
+{
+ std::pair<int, int> minMax = getZMinMax();
+
+ QCanvasItemList l = canvas()->allItems();
+ for (QCanvasItemList::Iterator it = l.begin(); it != l.end(); ++it) {
+
+ // skip all but rectangles
+ if ((*it)->rtti() != QCanvasItem::Rtti_Rectangle)
+ continue;
+
+ // match min
+ if ((*it)->z() == minMax.second)
+ (*it)->setZ(minMax.first);
+ else
+ (*it)->setZ((*it)->z() + 1);
+ }
+
+ canvas()->update();
+}
+
+void ControlRuler::flipBackwards()
+{
+ std::pair<int, int> minMax = getZMinMax();
+
+ QCanvasItemList l = canvas()->allItems();
+ for (QCanvasItemList::Iterator it = l.begin(); it != l.end(); ++it) {
+
+ // skip all but rectangles
+ if ((*it)->rtti() != QCanvasItem::Rtti_Rectangle)
+ continue;
+
+ // match min
+ if ((*it)->z() == minMax.first)
+ (*it)->setZ(minMax.second);
+ else
+ (*it)->setZ((*it)->z() - 1);
+ }
+
+ canvas()->update();
+}
+
+std::pair<int, int> ControlRuler::getZMinMax()
+{
+ QCanvasItemList l = canvas()->allItems();
+ std::vector<int> zList;
+ for (QCanvasItemList::Iterator it=l.begin(); it!=l.end(); ++it) {
+
+ // skip all but rectangles
+ if ((*it)->rtti() != QCanvasItem::Rtti_Rectangle) continue;
+ zList.push_back(int((*it)->z()));
+ }
+
+ std::sort(zList.begin(), zList.end());
+
+ return std::pair<int, int>(zList[0], zList[zList.size() - 1]);
+}
+
+QScrollBar* ControlRuler::getMainHorizontalScrollBar()
+{
+ return m_mainHorizontalScrollBar ? m_mainHorizontalScrollBar : horizontalScrollBar();
+}
+
+}
+#include "ControlRuler.moc"
diff --git a/src/gui/rulers/ControlRuler.h b/src/gui/rulers/ControlRuler.h
new file mode 100644
index 0000000..ac6eba4
--- /dev/null
+++ b/src/gui/rulers/ControlRuler.h
@@ -0,0 +1,182 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_CONTROLRULER_H_
+#define _RG_CONTROLRULER_H_
+
+#include "base/Segment.h"
+#include "gui/general/RosegardenCanvasView.h"
+#include <qcolor.h>
+#include <qpoint.h>
+#include <qstring.h>
+#include <utility>
+
+
+class QWidget;
+class QWheelEvent;
+class QScrollBar;
+class QPopupMenu;
+class QMouseEvent;
+class QContextMenuEvent;
+class QCanvasRectangle;
+class QCanvas;
+
+
+namespace Rosegarden
+{
+
+class ControlTool;
+class ControlSelector;
+class ControlItem;
+class TextFloat;
+class Segment;
+class RulerScale;
+class EventSelection;
+class EditViewBase;
+
+
+/**
+ * ControlRuler : base class for Control Rulers
+ */
+class ControlRuler : public RosegardenCanvasView, public SegmentObserver
+{
+ Q_OBJECT
+
+ friend class ControlItem;
+
+public:
+ ControlRuler(Segment*,
+ RulerScale*,
+ EditViewBase* parentView,
+ QCanvas*,
+ QWidget* parent=0, const char* name=0, WFlags f=0);
+ virtual ~ControlRuler();
+
+ virtual QString getName() = 0;
+
+ int getMaxItemValue() { return m_maxItemValue; }
+ void setMaxItemValue(int val) { m_maxItemValue = val; }
+
+ void clear();
+
+ void setControlTool(ControlTool*);
+
+ int applyTool(double x, int val);
+
+ QCanvasRectangle* getSelectionRectangle() { return m_selectionRect; }
+
+ RulerScale* getRulerScale() { return m_rulerScale; }
+
+ // SegmentObserver interface
+ virtual void segmentDeleted(const Segment *);
+
+ static const int DefaultRulerHeight;
+ static const int MinItemHeight;
+ static const int MaxItemHeight;
+ static const int ItemHeightRange;
+
+ void flipForwards();
+ void flipBackwards();
+
+ void setMainHorizontalScrollBar(QScrollBar* s ) { m_mainHorizontalScrollBar = s; }
+
+signals:
+ void stateChange(const QString&, bool);
+
+public slots:
+ /// override RosegardenCanvasView - we don't want to change the main hscrollbar
+ virtual void slotUpdate();
+ virtual void slotUpdateElementsHPos();
+
+protected:
+ virtual void contentsMousePressEvent(QMouseEvent*);
+ virtual void contentsMouseReleaseEvent(QMouseEvent*);
+ virtual void contentsMouseMoveEvent(QMouseEvent*);
+ virtual void contentsWheelEvent(QWheelEvent*);
+ virtual void contentsContextMenuEvent(QContextMenuEvent*);
+
+ virtual QScrollBar* getMainHorizontalScrollBar();
+
+ virtual void computeStaffOffset() {};
+
+ virtual void layoutItem(ControlItem*);
+
+
+
+ // Stacking of the SegmentItems on the canvas
+ //
+ std::pair<int, int> getZMinMax();
+
+ virtual void init() = 0;
+ virtual void drawBackground() = 0;
+
+ int valueToHeight(long val);
+ long heightToValue(int height);
+ QColor valueToColour(int max, int val);
+
+ void clearSelectedItems();
+ void updateSelection();
+
+ void setMenuName(QString menuName) { m_menuName = menuName; }
+ void createMenu();
+
+ //--------------- Data members ---------------------------------
+
+ EditViewBase* m_parentEditView;
+ QScrollBar* m_mainHorizontalScrollBar;
+ RulerScale* m_rulerScale;
+ EventSelection* m_eventSelection;
+ Segment* m_segment;
+
+ ControlItem* m_currentItem;
+ QCanvasItemList m_selectedItems;
+
+ ControlTool *m_tool;
+
+ int m_maxItemValue;
+
+ double m_staffOffset;
+
+ double m_currentX;
+
+ QPoint m_lastEventPos;
+ bool m_itemMoved;
+
+ bool m_selecting;
+ ControlSelector* m_selector;
+ QCanvasRectangle* m_selectionRect;
+
+ QString m_menuName;
+ QPopupMenu* m_menu;
+
+ TextFloat *m_numberFloat;
+
+ bool m_hposUpdatePending;
+};
+
+
+}
+
+#endif
diff --git a/src/gui/rulers/ControlRulerEventEraseCommand.cpp b/src/gui/rulers/ControlRulerEventEraseCommand.cpp
new file mode 100644
index 0000000..7a1e493
--- /dev/null
+++ b/src/gui/rulers/ControlRulerEventEraseCommand.cpp
@@ -0,0 +1,58 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include "ControlRulerEventEraseCommand.h"
+#include "ControlItem.h"
+#include "ElementAdapter.h"
+#include "misc/Debug.h"
+#include <klocale.h>
+
+namespace Rosegarden
+{
+
+ControlRulerEventEraseCommand::ControlRulerEventEraseCommand(QCanvasItemList selectedItems,
+ Segment &segment,
+ Rosegarden::timeT start, Rosegarden::timeT end)
+ : BasicCommand(i18n("Erase Controller Event(s)"),
+ segment,
+ start,
+ (start == end) ? start + 10 : end,
+ true),
+ m_selectedItems(selectedItems)
+{
+ RG_DEBUG << "ControllerEventEraseCommand : from " << start << " to " << end << endl;
+}
+
+
+void ControlRulerEventEraseCommand::modifySegment()
+{
+ Segment &segment(getSegment());
+
+ for (QCanvasItemList::Iterator it=m_selectedItems.begin(); it!=m_selectedItems.end(); ++it) {
+ if (ControlItem *item = dynamic_cast<ControlItem*>(*it))
+ segment.eraseSingle(item->getElementAdapter()->getEvent());
+ }
+}
+
+}
diff --git a/src/gui/rulers/ControlRulerEventEraseCommand.h b/src/gui/rulers/ControlRulerEventEraseCommand.h
new file mode 100644
index 0000000..15e213b
--- /dev/null
+++ b/src/gui/rulers/ControlRulerEventEraseCommand.h
@@ -0,0 +1,54 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_CONTROLLEREVENTERASECOMMAND_H_
+#define _RG_CONTROLLEREVENTERASECOMMAND_H_
+
+#include "base/Event.h"
+#include "document/BasicCommand.h"
+#include <qcanvas.h>
+
+namespace Rosegarden
+{
+
+class ControlRulerEventEraseCommand : public BasicCommand
+{
+public:
+
+ ControlRulerEventEraseCommand(QCanvasItemList selectedItems,
+ Segment &segment,
+ Rosegarden::timeT start, Rosegarden::timeT end);
+ virtual ~ControlRulerEventEraseCommand() {;}
+
+
+protected:
+
+ virtual void modifySegment();
+
+ QCanvasItemList m_selectedItems;
+};
+
+}
+
+#endif /*CONTROLLEREVENTERASECOMMAND_H_*/
diff --git a/src/gui/rulers/ControlRulerEventInsertCommand.cpp b/src/gui/rulers/ControlRulerEventInsertCommand.cpp
new file mode 100644
index 0000000..ab6a73c
--- /dev/null
+++ b/src/gui/rulers/ControlRulerEventInsertCommand.cpp
@@ -0,0 +1,67 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include "ControlRulerEventInsertCommand.h"
+#include "base/MidiTypes.h"
+#include <klocale.h>
+
+namespace Rosegarden
+{
+
+ControlRulerEventInsertCommand::ControlRulerEventInsertCommand(const std::string &type,
+ timeT insertTime,
+ long number, long initialValue,
+ Segment &segment)
+ : BasicCommand(i18n("Insert Controller Event"),
+ segment,
+ insertTime,
+ (insertTime + Rosegarden::Note(Rosegarden::Note::Quaver).getDuration())), // must have a duration other undo doesn't work
+ m_type(type),
+ m_number(number),
+ m_initialValue(initialValue)
+{
+}
+
+void ControlRulerEventInsertCommand::modifySegment()
+{
+ Event* controllerEvent = new Event(m_type, getStartTime());
+
+ if (m_type == Rosegarden::Controller::EventType)
+ {
+ controllerEvent->set<Rosegarden::Int>(Rosegarden::Controller::VALUE, m_initialValue);
+ controllerEvent->set<Rosegarden::Int>(Rosegarden::Controller::NUMBER, m_number);
+ }
+ else if (m_type == Rosegarden::PitchBend::EventType)
+ {
+ // Convert to PitchBend MSB/LSB
+ int lsb = m_initialValue & 0x7f;
+ int msb = (m_initialValue >> 7) & 0x7f;
+ controllerEvent->set<Rosegarden::Int>(Rosegarden::PitchBend::MSB, msb);
+ controllerEvent->set<Rosegarden::Int>(Rosegarden::PitchBend::LSB, lsb);
+ }
+
+ getSegment().insert(controllerEvent);
+}
+
+}
diff --git a/src/gui/rulers/ControlRulerEventInsertCommand.h b/src/gui/rulers/ControlRulerEventInsertCommand.h
new file mode 100644
index 0000000..a180006
--- /dev/null
+++ b/src/gui/rulers/ControlRulerEventInsertCommand.h
@@ -0,0 +1,56 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_CONTROLRULEREVENTINSERTCOMMAND_H_
+#define _RG_CONTROLRULEREVENTINSERTCOMMAND_H_
+
+#include "document/BasicCommand.h"
+#include <string>
+
+namespace Rosegarden
+{
+
+class ControlRulerEventInsertCommand : public BasicCommand
+{
+public:
+ ControlRulerEventInsertCommand(const std::string &type,
+ timeT insertTime,
+ long number,
+ long initialValue,
+ Segment &segment);
+
+ virtual ~ControlRulerEventInsertCommand() {;}
+
+protected:
+
+ virtual void modifySegment();
+
+ std::string m_type;
+ long m_number;
+ long m_initialValue;
+};
+
+}
+
+#endif /*CONTROLRULEREVENTINSERTCOMMAND_H_*/
diff --git a/src/gui/rulers/ControlSelector.cpp b/src/gui/rulers/ControlSelector.cpp
new file mode 100644
index 0000000..fb4abbb
--- /dev/null
+++ b/src/gui/rulers/ControlSelector.cpp
@@ -0,0 +1,72 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_CONTROLSELECTOR_CPP_
+#define _RG_CONTROLSELECTOR_CPP_
+
+#include "ControlSelector.h"
+
+namespace Rosegarden {
+
+ControlSelector::ControlSelector(ControlRuler* parent)
+ : QObject(parent),
+ m_ruler(parent)
+{
+}
+
+void ControlSelector::handleMouseButtonPress(QMouseEvent *e)
+{
+ QPoint p = m_ruler->inverseMapPoint(e->pos());
+
+ getSelectionRectangle()->setX(p.x());
+ getSelectionRectangle()->setY(p.y());
+ getSelectionRectangle()->setSize(0,0);
+
+ getSelectionRectangle()->show();
+ m_ruler->canvas()->update();
+}
+
+void ControlSelector::handleMouseButtonRelease(QMouseEvent*)
+{
+ getSelectionRectangle()->hide();
+ m_ruler->canvas()->update();
+}
+
+void ControlSelector::handleMouseMove(QMouseEvent *e, int, int)
+{
+ QPoint p = m_ruler->inverseMapPoint(e->pos());
+
+ int w = int(p.x() - getSelectionRectangle()->x());
+ int h = int(p.y() - getSelectionRectangle()->y());
+ if (w > 0) ++w; else --w;
+ if (h > 0) ++h; else --h;
+
+ getSelectionRectangle()->setSize(w, h);
+
+ m_ruler->canvas()->update();
+}
+
+}
+
+#endif /*CONTROLSELECTOR_CPP_*/
diff --git a/src/gui/rulers/ControlSelector.h b/src/gui/rulers/ControlSelector.h
new file mode 100644
index 0000000..99ec773
--- /dev/null
+++ b/src/gui/rulers/ControlSelector.h
@@ -0,0 +1,60 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_CONTROLSELECTOR_H_
+#define _RG_CONTROLSELECTOR_H_
+
+#include "ControlRuler.h"
+
+class QCanvasRectangle;
+
+namespace Rosegarden {
+
+
+/**
+ * Selector tool for the ControlRuler
+ *
+ * Allow the user to select several ControlItems so he can change them
+ * all at the same time
+ */
+class ControlSelector : public QObject
+{
+public:
+ ControlSelector(ControlRuler* parent);
+ virtual ~ControlSelector() {};
+
+ virtual void handleMouseButtonPress(QMouseEvent *e);
+ virtual void handleMouseButtonRelease(QMouseEvent *e);
+ virtual void handleMouseMove(QMouseEvent *e, int deltaX, int deltaY);
+
+ QCanvasRectangle* getSelectionRectangle() { return m_ruler->getSelectionRectangle(); }
+protected:
+ //--------------- Data members ---------------------------------
+
+ ControlRuler* m_ruler;
+};
+
+}
+
+#endif /*CONTROLSELECTOR_H_*/
diff --git a/src/gui/rulers/ControlTool.h b/src/gui/rulers/ControlTool.h
new file mode 100644
index 0000000..fcc528a
--- /dev/null
+++ b/src/gui/rulers/ControlTool.h
@@ -0,0 +1,39 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef CONTROLTOOL_H_
+#define CONTROLTOOL_H_
+
+namespace Rosegarden {
+
+class ControlTool
+{
+public:
+ virtual ~ControlTool() {};
+ virtual int operator()(double x, int val) = 0;
+};
+
+}
+
+#endif /*CONTROLTOOL_H_*/
diff --git a/src/gui/rulers/ControllerEventAdapter.cpp b/src/gui/rulers/ControllerEventAdapter.cpp
new file mode 100644
index 0000000..55abd50
--- /dev/null
+++ b/src/gui/rulers/ControllerEventAdapter.cpp
@@ -0,0 +1,83 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include "ControllerEventAdapter.h"
+#include "base/MidiTypes.h"
+#include "misc/Debug.h"
+
+namespace Rosegarden {
+
+bool ControllerEventAdapter::getValue(long& val)
+{
+ if (m_event->getType() == Rosegarden::Controller::EventType)
+ {
+ return m_event->get<Rosegarden::Int>(Rosegarden::Controller::VALUE, val);
+ }
+ else if (m_event->getType() == Rosegarden::PitchBend::EventType)
+ {
+ long msb = 0, lsb = 0;
+ m_event->get<Rosegarden::Int>(Rosegarden::PitchBend::MSB, msb);
+ m_event->get<Rosegarden::Int>(Rosegarden::PitchBend::LSB, lsb);
+
+ long value = msb;
+ value <<= 7;
+ value |= lsb;
+
+ //RG_DEBUG << "PitchBend Get Value = " << value << endl;
+
+ val = value;
+ return true;
+ }
+
+ return false;
+}
+
+void ControllerEventAdapter::setValue(long val)
+{
+ if (m_event->getType() == Rosegarden::Controller::EventType)
+ {
+ m_event->set<Rosegarden::Int>(Rosegarden::Controller::VALUE, val);
+ }
+ else if (m_event->getType() == Rosegarden::PitchBend::EventType)
+ {
+ RG_DEBUG << "PitchBend Set Value = " << val << endl;
+
+ int lsb = val & 0x7f;
+ int msb = (val >> 7) & 0x7f;
+ m_event->set<Rosegarden::Int>(Rosegarden::PitchBend::MSB, msb);
+ m_event->set<Rosegarden::Int>(Rosegarden::PitchBend::LSB, lsb);
+ }
+}
+
+timeT ControllerEventAdapter::getTime()
+{
+ return m_event->getAbsoluteTime();
+}
+
+timeT ControllerEventAdapter::getDuration()
+{
+ return m_event->getDuration();
+}
+
+}
diff --git a/src/gui/rulers/ControllerEventAdapter.h b/src/gui/rulers/ControllerEventAdapter.h
new file mode 100644
index 0000000..4f71884
--- /dev/null
+++ b/src/gui/rulers/ControllerEventAdapter.h
@@ -0,0 +1,53 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_CONTROLLEREVENTADAPTER_H_
+#define _RG_CONTROLLEREVENTADAPTER_H_
+
+#include "ElementAdapter.h"
+
+namespace Rosegarden {
+
+class ControllerEventAdapter : public Rosegarden::ElementAdapter
+{
+public:
+ ControllerEventAdapter(Event* e) : m_event(e) {}
+
+ virtual bool getValue(long&);
+ virtual void setValue(long);
+ virtual timeT getTime();
+ virtual timeT getDuration();
+
+ virtual Event* getEvent() { return m_event; }
+
+protected:
+
+ //--------------- Data members ---------------------------------
+
+ Event* m_event;
+};
+
+}
+
+#endif /*CONTROLLEREVENTADAPTER_H_*/
diff --git a/src/gui/rulers/ControllerEventsRuler.cpp b/src/gui/rulers/ControllerEventsRuler.cpp
new file mode 100644
index 0000000..265a701
--- /dev/null
+++ b/src/gui/rulers/ControllerEventsRuler.cpp
@@ -0,0 +1,499 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "ControllerEventsRuler.h"
+
+#include <klocale.h>
+#include "misc/Debug.h"
+#include "misc/Strings.h"
+#include "base/ControlParameter.h"
+#include "base/Event.h"
+#include "base/MidiTypes.h"
+#include "base/NotationTypes.h"
+#include "base/RulerScale.h"
+#include "base/Segment.h"
+#include "base/Selection.h"
+#include "commands/edit/EraseCommand.h"
+#include "ControlRuler.h"
+#include "ControlItem.h"
+#include "ControllerEventAdapter.h"
+#include "ControlRulerEventInsertCommand.h"
+#include "ControlRulerEventEraseCommand.h"
+#include "gui/general/EditViewBase.h"
+#include "gui/widgets/TextFloat.h"
+#include <klineeditdlg.h>
+#include <qcanvas.h>
+#include <qcolor.h>
+#include <qpoint.h>
+#include <qstring.h>
+#include <qvalidator.h>
+#include <qwidget.h>
+
+
+namespace Rosegarden
+{
+
+ControllerEventsRuler::ControllerEventsRuler(Segment *segment,
+ RulerScale* rulerScale,
+ EditViewBase* parentView,
+ QCanvas* c,
+ QWidget* parent,
+ const ControlParameter *controller,
+ const char* name, WFlags f)
+ : ControlRuler(segment, rulerScale, parentView, c, parent, name, f),
+ m_defaultItemWidth(20),
+ m_controlLine(new QCanvasLine(canvas())),
+ m_controlLineShowing(false),
+ m_controlLineX(0),
+ m_controlLineY(0)
+{
+ // Make a copy of the ControlParameter if we have one
+ //
+ if (controller)
+ m_controller = new ControlParameter(*controller);
+ else
+ m_controller = 0;
+
+ setMenuName("controller_events_ruler_menu");
+ drawBackground();
+ init();
+}
+
+void
+ControllerEventsRuler::setSegment(Segment *segment)
+{
+ RG_DEBUG << "ControllerEventsRuler::setSegment(" << segment << ")" << endl;
+
+ m_segment->removeObserver(this);
+ m_segment = segment;
+ m_segment->addObserver(this);
+
+ while (child(NULL))
+ delete (child(NULL));
+
+ drawBackground();
+ init();
+}
+
+void
+ControllerEventsRuler::init()
+{
+ // Reset range information for this controller type (for the moment
+ // this assumes min is always 0.
+ //
+ setMaxItemValue(m_controller->getMax());
+
+ for (Segment::iterator i = m_segment->begin();
+ i != m_segment->end(); ++i) {
+
+ // skip if not the same type of event that we're expecting
+ //
+ if (m_controller->getType() != (*i)->getType())
+ continue;
+
+ int width = getDefaultItemWidth();
+
+ // Check for specific controller value if we need to
+ //
+ if (m_controller->getType() == Controller::EventType) {
+ try {
+ if ((*i)->get
+ <Int>(Controller::NUMBER)
+ != m_controller->getControllerValue())
+ continue;
+ } catch (...) {
+ continue;
+ }
+ } else if (m_controller->getType() == PitchBend::EventType)
+ width /= 4;
+
+ //RG_DEBUG << "ControllerEventsRuler: adding element\n";
+
+ double x = m_rulerScale->getXForTime((*i)->getAbsoluteTime());
+ new ControlItem(this, new ControllerEventAdapter(*i),
+ int(x + m_staffOffset), width);
+ }
+}
+
+void
+ControllerEventsRuler::drawBackground()
+{
+ // Draw some minimum and maximum controller value guide lines
+ //
+ QCanvasLine *topLine = new QCanvasLine(canvas());
+ QCanvasLine *topQLine = new QCanvasLine(canvas());
+ QCanvasLine *midLine = new QCanvasLine(canvas());
+ QCanvasLine *botQLine = new QCanvasLine(canvas());
+ QCanvasLine *bottomLine = new QCanvasLine(canvas());
+ //m_controlLine->setPoints(m_controlLineX, m_controlLineY, m_controlLineX, m_controlLineY);
+ int cHeight = canvas()->height();
+ int cWidth = canvas()->width();
+
+ topLine->setPen(QColor(127, 127, 127));
+ topLine->setPoints(0, 0, cWidth, 0);
+ topLine->setZ( -10);
+ topLine->show();
+
+ topQLine->setPen(QColor(192, 192, 192));
+ topQLine->setPoints(0, cHeight / 4, cWidth, cHeight / 4);
+ topQLine->setZ( -10);
+ topQLine->show();
+
+ midLine->setPen(QColor(127, 127, 127));
+ midLine->setPoints(0, cHeight / 2, cWidth, cHeight / 2);
+ midLine->setZ( -10);
+ midLine->show();
+
+ botQLine->setPen(QColor(192, 192, 192));
+ botQLine->setPoints(0, 3*cHeight / 4, cWidth, 3*cHeight / 4);
+ botQLine->setZ( -10);
+ botQLine->show();
+
+ bottomLine->setPen(QColor(127, 127, 127));
+ bottomLine->setPoints(0, cHeight - 1, cWidth, cHeight - 1);
+ bottomLine->setZ( -10);
+ bottomLine->show();
+
+ canvas()->update();
+}
+
+ControllerEventsRuler::~ControllerEventsRuler()
+{}
+
+QString ControllerEventsRuler::getName()
+{
+ if (m_controller) {
+ QString name = i18n("Unsupported Event Type");
+
+ if (m_controller->getType() == Controller::EventType) {
+ QString hexValue;
+ hexValue.sprintf("0x%x", m_controller->getControllerValue());
+
+ name = QString("%1 (%2 / %3)").arg(strtoqstr(m_controller->getName()))
+ .arg(int(m_controller->getControllerValue()))
+ .arg(hexValue);
+ } else if (m_controller->getType() == PitchBend::EventType) {
+ name = i18n("Pitch Bend");
+ }
+
+ return name;
+ } else
+ return i18n("Controller Events");
+}
+
+void ControllerEventsRuler::eventAdded(const Segment*, Event *e)
+{
+ if (e->getType() != m_controller->getType())
+ return ;
+
+ // Check for specific controller value if we need to
+ //
+ if (e->getType() == Controller::EventType) {
+ try {
+ if (e->get
+ <Int>(Controller::NUMBER) !=
+ m_controller->getControllerValue())
+ return ;
+ } catch (...) {
+ return ;
+ }
+ }
+
+ RG_DEBUG << "ControllerEventsRuler::elementAdded()\n";
+
+ double x = m_rulerScale->getXForTime(e->getAbsoluteTime());
+
+ int width = getDefaultItemWidth();
+
+ if (m_controller->getType() == PitchBend::EventType)
+ width /= 4;
+
+ new ControlItem(this, new ControllerEventAdapter(e), int(x + m_staffOffset), width);
+}
+
+void ControllerEventsRuler::eventRemoved(const Segment*, Event *e)
+{
+ if (e->getType() != m_controller->getType())
+ return ;
+
+ clearSelectedItems();
+
+ QCanvasItemList allItems = canvas()->allItems();
+
+ for (QCanvasItemList::Iterator it = allItems.begin(); it != allItems.end(); ++it) {
+ if (ControlItem *item = dynamic_cast<ControlItem*>(*it)) {
+ ControllerEventAdapter * adapter = dynamic_cast<ControllerEventAdapter*>(item->getElementAdapter());
+ if (adapter->getEvent() == e) {
+ delete item;
+ break;
+ }
+ }
+ }
+}
+
+void ControllerEventsRuler::insertControllerEvent()
+{
+ timeT insertTime = m_rulerScale->getTimeForX(m_lastEventPos.x());
+
+
+ // compute initial value from cursor height
+ //
+ long initialValue = heightToValue(m_lastEventPos.y() - canvas()->height());
+
+ RG_DEBUG << "ControllerEventsRuler::insertControllerEvent() : inserting event at "
+ << insertTime
+ << " - initial value = " << initialValue
+ << endl;
+
+ // ask controller number to user
+ long number = 0;
+
+ if (m_controller) {
+ number = m_controller->getControllerValue();
+ } else {
+ bool ok = false;
+ QIntValidator intValidator(0, 128, this);
+ QString res = KLineEditDlg::getText(i18n("Controller Event Number"), "0",
+ &ok, this, &intValidator);
+ if (ok)
+ number = res.toULong();
+ }
+
+ ControlRulerEventInsertCommand* command =
+ new ControlRulerEventInsertCommand(m_controller->getType(),
+ insertTime, number,
+ initialValue, *m_segment);
+
+ m_parentEditView->addCommandToHistory(command);
+}
+
+void ControllerEventsRuler::eraseControllerEvent()
+{
+ RG_DEBUG << "ControllerEventsRuler::eraseControllerEvent() : deleting selected events\n";
+
+ ControlRulerEventEraseCommand* command =
+ new ControlRulerEventEraseCommand(m_selectedItems,
+ *m_segment,
+ m_eventSelection->getStartTime(),
+ m_eventSelection->getEndTime());
+ m_parentEditView->addCommandToHistory(command);
+ updateSelection();
+}
+
+void ControllerEventsRuler::clearControllerEvents()
+{
+ EventSelection *es = new EventSelection(*m_segment);
+
+ for (Segment::iterator it = m_segment->begin(); it != m_segment->end(); ++it) {
+ if (!(*it)->isa(Controller::EventType))
+ continue;
+ {
+ if (m_controller) // ensure we have only the controller events we want for this ruler
+ {
+ try
+ {
+ if ((*it)->get
+ <Int>(Controller::NUMBER)
+ != m_controller->getControllerValue())
+ continue;
+ } catch (...)
+ {
+ continue;
+ }
+
+ es->addEvent(*it);
+ }
+ }
+ }
+
+ EraseCommand *command = new EraseCommand(*es);
+ m_parentEditView->addCommandToHistory(command);
+
+}
+
+void ControllerEventsRuler::startControlLine()
+{
+ m_controlLineShowing = true;
+ this->setCursor(Qt::pointingHandCursor);
+}
+
+void ControllerEventsRuler::contentsMousePressEvent(QMouseEvent *e)
+{
+ if (!m_controlLineShowing) {
+ if (e->button() == MidButton)
+ m_lastEventPos = inverseMapPoint(e->pos());
+
+ ControlRuler::contentsMousePressEvent(e); // send super
+
+ return ;
+ }
+
+ // cancel control line mode
+ if (e->button() == RightButton) {
+ m_controlLineShowing = false;
+ m_controlLine->hide();
+
+ this->setCursor(Qt::arrowCursor);
+ return ;
+ }
+
+ if (e->button() == LeftButton) {
+ QPoint p = inverseMapPoint(e->pos());
+
+ m_controlLine->show();
+ m_controlLineX = p.x();
+ m_controlLineY = p.y();
+ m_controlLine->setPoints(m_controlLineX, m_controlLineY, m_controlLineX, m_controlLineY);
+ canvas()->update();
+ }
+}
+
+void ControllerEventsRuler::contentsMouseReleaseEvent(QMouseEvent *e)
+{
+ if (!m_controlLineShowing) {
+ if (e->button() == MidButton)
+ insertControllerEvent();
+
+ ControlRuler::contentsMouseReleaseEvent(e); // send super
+
+ return ;
+ } else {
+ QPoint p = inverseMapPoint(e->pos());
+
+ timeT startTime = m_rulerScale->getTimeForX(m_controlLineX);
+ timeT endTime = m_rulerScale->getTimeForX(p.x());
+
+ long startValue = heightToValue(m_controlLineY - canvas()->height());
+ long endValue = heightToValue(p.y() - canvas()->height());
+
+ RG_DEBUG << "ControllerEventsRuler::contentsMouseReleaseEvent - "
+ << "starttime = " << startTime
+ << ", endtime = " << endTime
+ << ", startValue = " << startValue
+ << ", endValue = " << endValue
+ << endl;
+
+ drawControlLine(startTime, endTime, startValue, endValue);
+
+ m_controlLineShowing = false;
+ m_controlLine->hide();
+ this->setCursor(Qt::arrowCursor);
+ canvas()->update();
+ }
+}
+
+void ControllerEventsRuler::contentsMouseMoveEvent(QMouseEvent *e)
+{
+ if (!m_controlLineShowing) {
+ // Don't send super if we're using the middle button
+ //
+ if (e->button() == MidButton) {
+ m_lastEventPos = inverseMapPoint(e->pos());
+ return ;
+ }
+
+ ControlRuler::contentsMouseMoveEvent(e); // send super
+ return ;
+ }
+
+ QPoint p = inverseMapPoint(e->pos());
+
+ m_controlLine->setPoints(m_controlLineX, m_controlLineY, p.x(), p.y());
+ canvas()->update();
+
+}
+
+void ControllerEventsRuler::layoutItem(ControlItem* item)
+{
+ timeT itemTime = item->getElementAdapter()->getTime();
+
+ double x = m_rulerScale->getXForTime(itemTime) + m_staffOffset;
+
+ item->setX(x);
+
+ int width = getDefaultItemWidth(); // TODO: how to scale that ??
+
+ if (m_controller->getType() == PitchBend::EventType)
+ width /= 4;
+
+ item->setWidth(width);
+
+ //RG_DEBUG << "ControllerEventsRuler::layoutItem ControlItem x = " << x
+ //<< " - width = " << width << endl;
+}
+
+void
+ControllerEventsRuler::drawControlLine(timeT startTime,
+ timeT endTime,
+ int startValue,
+ int endValue)
+{
+ if (m_controller == 0)
+ return ;
+ if (startTime > endTime) {
+ std::swap(startTime, endTime);
+ std::swap(startValue, endValue);
+ }
+
+ timeT quantDur = Note(Note::Quaver).getDuration();
+
+ // If inserting a line of PitchBends then we want a smoother curve
+ //
+ if (m_controller->getType() == PitchBend::EventType)
+ quantDur = Note(Note::Demisemiquaver).getDuration();
+
+ // for the moment enter a quantized set of events
+ timeT time = startTime, newTime = 0;
+ double step = double(endValue - startValue) / double(endTime - startTime);
+
+ KMacroCommand *macro = new KMacroCommand(i18n("Add line of controllers"));
+
+ while (time < endTime) {
+ int value = startValue + int(step * double(time - startTime));
+
+ // hit the buffers
+ if (value < m_controller->getMin())
+ value = m_controller->getMin();
+ else if (value > m_controller->getMax())
+ value = m_controller->getMax();
+
+ ControlRulerEventInsertCommand* command =
+ new ControlRulerEventInsertCommand(m_controller->getType(),
+ time, m_controller->getControllerValue(), value, *m_segment);
+
+ macro->addCommand(command);
+
+ // get new time - do it by quantized distances
+ newTime = (time / quantDur) * quantDur;
+ if (newTime > time)
+ time = newTime;
+ else
+ time += quantDur;
+ }
+
+ m_parentEditView->addCommandToHistory(macro);
+}
+
+}
diff --git a/src/gui/rulers/ControllerEventsRuler.h b/src/gui/rulers/ControllerEventsRuler.h
new file mode 100644
index 0000000..2b42274
--- /dev/null
+++ b/src/gui/rulers/ControllerEventsRuler.h
@@ -0,0 +1,118 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_CONTROLLEREVENTSRULER_H_
+#define _RG_CONTROLLEREVENTSRULER_H_
+
+#include "ControlRuler.h"
+#include <qstring.h>
+#include "base/Event.h"
+
+
+class QWidget;
+class QMouseEvent;
+class QCanvasLine;
+class QCanvas;
+
+
+namespace Rosegarden
+{
+
+class Segment;
+class RulerScale;
+class Event;
+class EditViewBase;
+class ControlParameter;
+class ControlItem;
+
+
+/**
+ * ControllerEventsRuler : edit Controller events
+ */
+class ControllerEventsRuler : public ControlRuler
+{
+public:
+ ControllerEventsRuler(Segment*,
+ RulerScale*,
+ EditViewBase* parentView,
+ QCanvas*,
+ QWidget* parent=0,
+ const ControlParameter *controller = 0,
+ const char* name=0, WFlags f=0);
+
+ virtual ~ControllerEventsRuler();
+
+ virtual QString getName();
+ int getDefaultItemWidth() { return m_defaultItemWidth; }
+
+ // Allow something external to reset the selection of Events
+ // that this ruler is displaying
+ //
+ void setSegment(Segment *);
+
+ /// SegmentObserver interface
+ virtual void eventAdded(const Segment *, Event *);
+ virtual void eventRemoved(const Segment *, Event *);
+
+ virtual void insertControllerEvent();
+ virtual void eraseControllerEvent();
+ virtual void clearControllerEvents();
+ virtual void startControlLine();
+
+ ControlParameter* getControlParameter() { return m_controller; }
+
+protected:
+
+ virtual void init();
+ virtual void drawBackground();
+
+ // Let's override these again here
+ //
+ virtual void contentsMousePressEvent(QMouseEvent*);
+ virtual void contentsMouseReleaseEvent(QMouseEvent*);
+ virtual void contentsMouseMoveEvent(QMouseEvent*);
+
+ virtual void layoutItem(ControlItem*);
+
+ void drawControlLine(timeT startTime,
+ timeT endTime,
+ int startValue,
+ int endValue);
+
+ //--------------- Data members ---------------------------------
+ int m_defaultItemWidth;
+
+ ControlParameter *m_controller;
+ QCanvasLine *m_controlLine;
+
+ bool m_controlLineShowing;
+ int m_controlLineX;
+ int m_controlLineY;
+};
+
+
+}
+
+#endif
diff --git a/src/gui/rulers/DefaultVelocityColour.cpp b/src/gui/rulers/DefaultVelocityColour.cpp
new file mode 100644
index 0000000..21cf75e
--- /dev/null
+++ b/src/gui/rulers/DefaultVelocityColour.cpp
@@ -0,0 +1,55 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "DefaultVelocityColour.h"
+
+#include "gui/general/GUIPalette.h"
+#include <qcolor.h>
+#include "VelocityColour.h"
+
+
+namespace Rosegarden
+{
+
+DefaultVelocityColour::DefaultVelocityColour()
+ : VelocityColour(GUIPalette::getColour(GUIPalette::LevelMeterRed),
+ GUIPalette::getColour(GUIPalette::LevelMeterOrange),
+ GUIPalette::getColour(GUIPalette::LevelMeterGreen),
+ 127, // max knee
+ 115, // red knee
+ 75, // orange knee
+ 25) // green knee
+{}
+
+DefaultVelocityColour* DefaultVelocityColour::getInstance()
+{
+ if (!m_instance) m_instance = new DefaultVelocityColour;
+
+ return m_instance;
+}
+
+DefaultVelocityColour* DefaultVelocityColour::m_instance = 0;
+
+}
diff --git a/src/gui/rulers/DefaultVelocityColour.h b/src/gui/rulers/DefaultVelocityColour.h
new file mode 100644
index 0000000..09430f3
--- /dev/null
+++ b/src/gui/rulers/DefaultVelocityColour.h
@@ -0,0 +1,54 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_DEFAULTVELOCITYCOLOUR_H_
+#define _RG_DEFAULTVELOCITYCOLOUR_H_
+
+#include "VelocityColour.h"
+
+
+
+
+namespace Rosegarden
+{
+
+
+
+class DefaultVelocityColour : public VelocityColour
+{
+public:
+ static DefaultVelocityColour* getInstance();
+
+protected:
+ DefaultVelocityColour();
+
+ static DefaultVelocityColour* m_instance;
+};
+
+
+
+}
+
+#endif
diff --git a/src/gui/rulers/ElementAdapter.h b/src/gui/rulers/ElementAdapter.h
new file mode 100644
index 0000000..e14ee63
--- /dev/null
+++ b/src/gui/rulers/ElementAdapter.h
@@ -0,0 +1,46 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_ELEMENTADAPTER_H_
+#define _RG_ELEMENTADAPTER_H_
+
+#include "base/Event.h"
+
+namespace Rosegarden {
+
+class ElementAdapter
+{
+public:
+ virtual ~ElementAdapter() {};
+
+ virtual bool getValue(long&) = 0;
+ virtual void setValue(long) = 0;
+ virtual timeT getTime() = 0;
+ virtual timeT getDuration() = 0;
+ virtual Event* getEvent() = 0;
+};
+
+}
+
+#endif /*ELEMENTADAPTER_H_*/
diff --git a/src/gui/rulers/LoopRuler.cpp b/src/gui/rulers/LoopRuler.cpp
new file mode 100644
index 0000000..bdf6c5e
--- /dev/null
+++ b/src/gui/rulers/LoopRuler.cpp
@@ -0,0 +1,363 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "LoopRuler.h"
+
+#include "misc/Debug.h"
+#include "base/RulerScale.h"
+#include "base/SnapGrid.h"
+#include "gui/general/GUIPalette.h"
+#include "gui/general/HZoomable.h"
+#include "gui/general/RosegardenCanvasView.h"
+#include <qpainter.h>
+#include <qrect.h>
+#include <qsize.h>
+#include <qwidget.h>
+#include <qtooltip.h>
+#include <klocale.h>
+#include <kaction.h>
+#include <qpainter.h>
+#include <qpointarray.h>
+#include "document/RosegardenGUIDoc.h"
+
+
+namespace Rosegarden
+{
+
+LoopRuler::LoopRuler(RosegardenGUIDoc *doc,
+ RulerScale *rulerScale,
+ int height,
+ double xorigin,
+ bool invert,
+ QWidget *parent,
+ const char *name) :
+ QWidget(parent, name),
+ m_doc(doc),
+ m_height(height),
+ m_xorigin(xorigin),
+ m_invert(invert),
+ m_currentXOffset(0),
+ m_width( -1),
+ m_activeMousePress(false),
+ m_rulerScale(rulerScale),
+ m_defaultGrid(rulerScale),
+ m_loopGrid(rulerScale),
+ m_grid(&m_defaultGrid),
+ m_loopingMode(false),
+ m_startLoop(0), m_endLoop(0),
+ m_quickMarkerPen(QPen(GUIPalette::getColour(GUIPalette::QuickMarker), 4))
+{
+ /*
+ * I need to understand if this ruler is being built for the main
+ * window (Track Editor) or for any of the segment editors. Apparently
+ * the name parameter is supplied (non-NULL) only for the main window.
+ * I can't find of any other (more decent) way to do this. Sorry.
+ */
+ m_mainWindow = (name != 0 && std::string(name).length() != 0);
+
+ setBackgroundColor(GUIPalette::getColour(GUIPalette::LoopRulerBackground));
+
+ // Always snap loop extents to beats; by default apply no snap to
+ // pointer position
+ //
+ m_defaultGrid.setSnapTime(SnapGrid::NoSnap);
+ m_loopGrid.setSnapTime(SnapGrid::SnapToBeat);
+
+ QToolTip::add
+ (this, i18n("Click and drag to move the playback pointer.\nShift-click and drag to set a range for looping or editing.\nShift-click to clear the loop or range.\nDouble-click to start playback."));
+}
+
+LoopRuler::~LoopRuler()
+{}
+
+void
+LoopRuler::setSnapGrid(SnapGrid *grid)
+{
+ if (grid == 0) m_grid = &m_defaultGrid;
+ else m_grid = grid;
+}
+
+void LoopRuler::scrollHoriz(int x)
+{
+ if (getHScaleFactor() != 1.0) {
+ m_currentXOffset = static_cast<int>( -x / getHScaleFactor());
+ repaint();
+ return;
+ }
+
+ int w = width(), h = height();
+ int dx = x - ( -m_currentXOffset);
+ m_currentXOffset = -x;
+
+ if (dx > w*3 / 4 || dx < -w*3 / 4) {
+ update();
+ return ;
+ }
+
+ if (dx > 0) { // moving right, so the existing stuff moves left
+ bitBlt(this, 0, 0, this, dx, 0, w - dx, h);
+ repaint(w - dx, 0, dx, h);
+ } else { // moving left, so the existing stuff moves right
+ bitBlt(this, -dx, 0, this, 0, 0, w + dx, h);
+ repaint(0, 0, -dx, h);
+ }
+}
+
+QSize LoopRuler::sizeHint() const
+{
+ double width =
+ m_rulerScale->getBarPosition(m_rulerScale->getLastVisibleBar()) +
+ m_rulerScale->getBarWidth(m_rulerScale->getLastVisibleBar()) +
+ m_xorigin;
+
+ QSize res(std::max(int(width), m_width), m_height);
+
+ return res;
+}
+
+QSize LoopRuler::minimumSizeHint() const
+{
+ double firstBarWidth = m_rulerScale->getBarWidth(0) + m_xorigin;
+
+ QSize res = QSize(int(firstBarWidth), m_height);
+
+ return res;
+}
+
+void LoopRuler::paintEvent(QPaintEvent* e)
+{
+ QPainter paint(this);
+
+ if (getHScaleFactor() != 1.0)
+ paint.scale(getHScaleFactor(), 1.0);
+
+ paint.setClipRegion(e->region());
+ paint.setClipRect(e->rect().normalize());
+
+ paint.setBrush(colorGroup().foreground());
+ drawBarSections(&paint);
+ drawLoopMarker(&paint);
+
+ if (m_mainWindow) {
+ timeT tQM = m_doc->getQuickMarkerTime();
+ if (tQM >= 0) {
+ // draw quick marker
+ double xQM = m_rulerScale->getXForTime(tQM)
+ + m_xorigin + m_currentXOffset;
+
+ paint.setPen(m_quickMarkerPen);
+
+ // looks necessary to compensate for shift in the CompositionView (cursor)
+ paint.translate(1, 0);
+
+ // draw red segment
+ paint.drawLine(int(xQM), 1, int(xQM), m_height-1);
+ }
+ }
+}
+
+void LoopRuler::drawBarSections(QPainter* paint)
+{
+ QRect clipRect = paint->clipRegion().boundingRect();
+
+ int firstBar = m_rulerScale->getBarForX(clipRect.x() -
+ m_currentXOffset -
+ m_xorigin);
+ int lastBar = m_rulerScale->getLastVisibleBar();
+ if (firstBar < m_rulerScale->getFirstVisibleBar()) {
+ firstBar = m_rulerScale->getFirstVisibleBar();
+ }
+
+ paint->setPen(GUIPalette::getColour(GUIPalette::LoopRulerForeground));
+
+ for (int i = firstBar; i <= lastBar; ++i) {
+
+ double x = m_rulerScale->getBarPosition(i) + m_currentXOffset + m_xorigin;
+ if ((x * getHScaleFactor()) > clipRect.x() + clipRect.width())
+ break;
+
+ double width = m_rulerScale->getBarWidth(i);
+ if (width == 0)
+ continue;
+
+ if (x + width < clipRect.x())
+ continue;
+
+ if (m_invert) {
+ paint->drawLine(int(x), 0, int(x), 5*m_height / 7);
+ } else {
+ paint->drawLine(int(x), 2*m_height / 7, int(x), m_height);
+ }
+
+ double beatAccumulator = m_rulerScale->getBeatWidth(i);
+ double inc = beatAccumulator;
+ if (inc == 0)
+ continue;
+
+ for (; beatAccumulator < width; beatAccumulator += inc) {
+ if (m_invert) {
+ paint->drawLine(int(x + beatAccumulator), 0,
+ int(x + beatAccumulator), 2 * m_height / 7);
+ } else {
+ paint->drawLine(int(x + beatAccumulator), 5*m_height / 7,
+ int(x + beatAccumulator), m_height);
+ }
+ }
+ }
+}
+
+void
+LoopRuler::drawLoopMarker(QPainter* paint)
+{
+ double x1 = (int)m_rulerScale->getXForTime(m_startLoop);
+ double x2 = (int)m_rulerScale->getXForTime(m_endLoop);
+
+ if (x1 > x2) {
+ x2 = x1;
+ x1 = (int)m_rulerScale->getXForTime(m_endLoop);
+ }
+
+ x1 += m_currentXOffset + m_xorigin;
+ x2 += m_currentXOffset + m_xorigin;
+
+ paint->save();
+ paint->setBrush(GUIPalette::getColour(GUIPalette::LoopHighlight));
+ paint->setPen(GUIPalette::getColour(GUIPalette::LoopHighlight));
+ paint->drawRect(static_cast<int>(x1), 0, static_cast<int>(x2 - x1), m_height);
+ paint->restore();
+
+}
+
+void
+LoopRuler::mousePressEvent(QMouseEvent *mE)
+{
+ RG_DEBUG << "LoopRuler::mousePressEvent: x = " << mE->x() << endl;
+
+ Qt::ButtonState bs = mE->state();
+ setLoopingMode((bs & Qt::ShiftButton) != 0);
+
+ if (mE->button() == LeftButton) {
+ double x = mE->pos().x() / getHScaleFactor() - m_currentXOffset - m_xorigin;
+
+ if (m_loopingMode) {
+ m_endLoop = m_startLoop = m_loopGrid.snapX(x);
+ } else {
+ // No -- now that we're emitting when the button is
+ // released, we _don't_ want to emit here as well --
+ // otherwise we get an irritating stutter when simply
+ // clicking on the ruler during playback
+// RG_DEBUG << "emitting setPointerPosition(" << m_rulerScale->getTimeForX(x) << ")" << endl;
+// emit setPointerPosition(m_rulerScale->getTimeForX(x));
+ }
+
+ m_activeMousePress = true;
+ emit startMouseMove(RosegardenCanvasView::FollowHorizontal);
+ }
+}
+
+void
+LoopRuler::mouseReleaseEvent(QMouseEvent *mE)
+{
+ if (mE->button() == LeftButton) {
+ if (m_loopingMode) {
+ // Cancel the loop if there was no drag
+ //
+ if (m_endLoop == m_startLoop) {
+ m_endLoop = m_startLoop = 0;
+
+ // to clear any other loop rulers
+ emit setLoop(m_startLoop, m_endLoop);
+ update();
+ }
+
+ // emit with the args around the right way
+ //
+ if (m_endLoop < m_startLoop)
+ emit setLoop(m_endLoop, m_startLoop);
+ else
+ emit setLoop(m_startLoop, m_endLoop);
+ } else {
+ // we need to re-emit this signal so that when the user releases the button
+ // after dragging the pointer, the pointer's position is updated again in the
+ // other views (typically, in the seg. canvas while the user has dragged the pointer
+ // in an edit view)
+ //
+ double x = mE->pos().x() / getHScaleFactor() - m_currentXOffset - m_xorigin;
+ emit setPointerPosition(m_grid->snapX(x));
+ }
+ emit stopMouseMove();
+ m_activeMousePress = false;
+ }
+}
+
+void
+LoopRuler::mouseDoubleClickEvent(QMouseEvent *mE)
+{
+ double x = mE->pos().x() / getHScaleFactor() - m_currentXOffset - m_xorigin;
+ if (x < 0)
+ x = 0;
+
+ RG_DEBUG << "LoopRuler::mouseDoubleClickEvent: x = " << x << ", looping = " << m_loopingMode << endl;
+
+ if (mE->button() == LeftButton && !m_loopingMode)
+ emit setPlayPosition(m_grid->snapX(x));
+}
+
+void
+LoopRuler::mouseMoveEvent(QMouseEvent *mE)
+{
+ double x = mE->pos().x() / getHScaleFactor() - m_currentXOffset - m_xorigin;
+ if (x < 0)
+ x = 0;
+
+ if (m_loopingMode) {
+ if (m_grid->snapX(x) != m_endLoop) {
+ m_endLoop = m_loopGrid.snapX(x);
+ emit dragLoopToPosition(m_endLoop);
+ update();
+ }
+ } else {
+ emit dragPointerToPosition(m_grid->snapX(x));
+ }
+
+ emit mouseMove();
+}
+
+void LoopRuler::slotSetLoopMarker(timeT startLoop,
+ timeT endLoop)
+{
+ m_startLoop = startLoop;
+ m_endLoop = endLoop;
+
+ QPainter paint(this);
+ paint.setBrush(colorGroup().foreground());
+ drawBarSections(&paint);
+ drawLoopMarker(&paint);
+
+ update();
+}
+
+}
+#include "LoopRuler.moc"
diff --git a/src/gui/rulers/LoopRuler.h b/src/gui/rulers/LoopRuler.h
new file mode 100644
index 0000000..7c30cc8
--- /dev/null
+++ b/src/gui/rulers/LoopRuler.h
@@ -0,0 +1,148 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_LOOPRULER_H_
+#define _RG_LOOPRULER_H_
+
+#include "base/SnapGrid.h"
+#include "gui/general/HZoomable.h"
+#include <qsize.h>
+#include <qwidget.h>
+#include <qpen.h>
+#include "base/Event.h"
+
+
+class QPaintEvent;
+class QPainter;
+class QMouseEvent;
+
+
+namespace Rosegarden
+{
+
+class RulerScale;
+class RosegardenGUIDoc;
+
+
+/**
+ * LoopRuler is a widget that shows bar and beat durations on a
+ * ruler-like scale, and reacts to mouse clicks by sending relevant
+ * signals to modify position pointer and playback/looping states.
+*/
+class LoopRuler : public QWidget, public HZoomable
+{
+ Q_OBJECT
+
+public:
+ LoopRuler(RosegardenGUIDoc *doc,
+ RulerScale *rulerScale,
+ int height = 0,
+ double xorigin = 0.0,
+ bool invert = false,
+ QWidget* parent = 0,
+ const char *name = 0);
+
+ ~LoopRuler();
+
+ void setSnapGrid(SnapGrid *grid);
+
+ virtual QSize sizeHint() const;
+ virtual QSize minimumSizeHint() const;
+
+ void scrollHoriz(int x);
+
+ void setMinimumWidth(int width) { m_width = width; }
+
+ void setHorizScaleFactor(double dy) { m_hScaleFactor = dy; }
+
+ bool hasActiveMousePress() { return m_activeMousePress; }
+
+ bool getLoopingMode() { return m_loopingMode; }
+
+public slots:
+ void slotSetLoopMarker(timeT startLoop,
+ timeT endLoop);
+
+protected:
+ // ActiveItem interface
+ virtual void mousePressEvent (QMouseEvent*);
+ virtual void mouseReleaseEvent (QMouseEvent*);
+ virtual void mouseDoubleClickEvent (QMouseEvent*);
+ virtual void mouseMoveEvent (QMouseEvent*);
+
+ virtual void paintEvent(QPaintEvent*);
+
+ void setLoopingMode(bool value) { m_loopingMode = value; }
+ void drawBarSections(QPainter*);
+ void drawLoopMarker(QPainter*); // between loop positions
+
+signals:
+ // The three main functions that this class performs
+ //
+ /// Set the pointer position on mouse single click
+ void setPointerPosition(timeT);
+
+ /// Set the pointer position on mouse drag
+ void dragPointerToPosition(timeT);
+
+ /// Set pointer position and start playing on double click
+ void setPlayPosition(timeT);
+
+ /// Set a playing loop
+ void setLoop(timeT, timeT);
+
+ /// Set the loop end position on mouse drag
+ void dragLoopToPosition(timeT);
+
+ void startMouseMove(int directionConstraint);
+ void stopMouseMove();
+ void mouseMove();
+
+protected:
+
+ //--------------- Data members ---------------------------------
+ int m_height;
+ double m_xorigin;
+ bool m_invert;
+ int m_currentXOffset;
+ int m_width;
+ bool m_activeMousePress;
+
+ RosegardenGUIDoc *m_doc;
+ bool m_mainWindow;
+ RulerScale *m_rulerScale;
+ SnapGrid m_defaultGrid;
+ SnapGrid m_loopGrid;
+ SnapGrid *m_grid;
+ QPen m_quickMarkerPen;
+ bool m_loopingMode;
+ timeT m_startLoop;
+ timeT m_endLoop;
+};
+
+
+}
+
+#endif
diff --git a/src/gui/rulers/MarkerRuler.cpp b/src/gui/rulers/MarkerRuler.cpp
new file mode 100644
index 0000000..7dcb67a
--- /dev/null
+++ b/src/gui/rulers/MarkerRuler.cpp
@@ -0,0 +1,490 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "MarkerRuler.h"
+
+#include "misc/Debug.h"
+#include "misc/Strings.h"
+#include "base/Composition.h"
+#include "base/RulerScale.h"
+#include "document/RosegardenGUIDoc.h"
+#include "gui/general/GUIPalette.h"
+#include "gui/general/HZoomable.h"
+#include "gui/dialogs/MarkerModifyDialog.h"
+#include "commands/edit/ModifyMarkerCommand.h"
+#include "document/MultiViewCommandHistory.h"
+#include <kxmlguifactory.h>
+#include <qbrush.h>
+#include <qcursor.h>
+#include <qfont.h>
+#include <qfontmetrics.h>
+#include <qpainter.h>
+#include <qpen.h>
+#include <qpoint.h>
+#include <qpopupmenu.h>
+#include <qrect.h>
+#include <qsize.h>
+#include <qstring.h>
+#include <qwidget.h>
+#include <klocale.h>
+#include <kaction.h>
+#include <kstddirs.h>
+#include <qtooltip.h>
+
+
+namespace Rosegarden
+{
+
+MarkerRuler::MarkerRuler(RosegardenGUIDoc *doc,
+ RulerScale *rulerScale,
+ int barHeight,
+ double xorigin,
+ QWidget* parent,
+ const char* name,
+ WFlags f)
+ : QWidget(parent, name, f),
+ m_barHeight(barHeight),
+ m_xorigin(xorigin),
+ m_currentXOffset(0),
+ m_width(-1),
+ m_clickX(0),
+ m_menu(0),
+ m_doc(doc),
+ m_rulerScale(rulerScale),
+ m_parentMainWindow(dynamic_cast<KMainWindow*>(doc->parent()))
+{
+ // If the parent window has a main window above it, we need to use
+ // that as the parent main window, not the document's parent.
+ // Otherwise we'll end up adding all actions to the same
+ // (document-level) action collection regardless of which window
+ // we're in.
+ QObject *probe = parent;
+ while (probe && !dynamic_cast<KMainWindow *>(probe)) probe = probe->parent();
+ if (probe) m_parentMainWindow = dynamic_cast<KMainWindow *>(probe);
+
+ // m_barFont = new QFont("helvetica", 12);
+ // m_barFont->setPixelSize(12);
+ m_barFont = new QFont();
+ m_barFont->setPointSize(10);
+
+ QString pixmapDir = KGlobal::dirs()->findResource("appdata", "pixmaps/");
+ QIconSet icon;
+
+ // Use the event insert, delete, edit icons because they are
+ // actually generic enough to serve for anything. Let's hope they
+ // don't become more event-specific in future...
+
+ icon = QIconSet(QPixmap(pixmapDir + "/toolbar/event-insert.png"));
+ new KAction(i18n("Insert Marker"), icon, 0, this,
+ SLOT(slotInsertMarkerHere()), actionCollection(),
+ "insert_marker_here");
+
+ new KAction(i18n("Insert Marker at Playback Position"), 0, this,
+ SLOT(slotInsertMarkerAtPointer()), actionCollection(),
+ "insert_marker_at_pointer");
+
+ icon = QIconSet(QPixmap(pixmapDir + "/toolbar/event-delete.png"));
+ new KAction(i18n("Delete Marker"), icon, 0, this,
+ SLOT(slotDeleteMarker()), actionCollection(),
+ "delete_marker");
+
+ icon = QIconSet(QPixmap(pixmapDir + "/toolbar/event-edit.png"));
+ new KAction(i18n("Edit Marker..."), icon, 0, this,
+ SLOT(slotEditMarker()), actionCollection(),
+ "edit_marker");
+
+ QToolTip::add
+ (this, i18n("Click on a marker to move the playback pointer.\nShift-click to set a range between markers.\nDouble-click to open the marker editor."));
+}
+
+MarkerRuler::~MarkerRuler()
+{
+ delete m_barFont;
+ // we have to do this so that the menu is re-created properly
+ // when the main window is itself recreated (on a File->New for instance)
+ KXMLGUIFactory* factory = m_parentMainWindow->factory();
+ if (factory)
+ factory->removeClient(this);
+}
+
+void
+MarkerRuler::createMenu()
+{
+ setXMLFile("markerruler.rc");
+
+ KXMLGUIFactory* factory = m_parentMainWindow->factory();
+ factory->addClient(this);
+
+ QWidget* tmp = factory->container("marker_ruler_menu", this);
+
+// if (!tmp) {
+// RG_DEBUG << "MarkerRuler::createMenu() menu not found\n"
+// << domDocument().toString(4) << endl;
+// }
+
+ m_menu = dynamic_cast<QPopupMenu*>(tmp);
+
+ if (!m_menu) {
+ RG_DEBUG << "MarkerRuler::createMenu() failed\n";
+ }
+}
+
+
+void
+MarkerRuler::scrollHoriz(int x)
+{
+ m_currentXOffset = static_cast<int>( -x / getHScaleFactor());
+ repaint();
+}
+
+QSize
+MarkerRuler::sizeHint() const
+{
+ int lastBar =
+ m_rulerScale->getLastVisibleBar();
+ double width =
+ m_rulerScale->getBarPosition(lastBar) +
+ m_rulerScale->getBarWidth(lastBar) + m_xorigin;
+
+ return QSize(std::max(int(width), m_width), m_barHeight);
+}
+
+QSize
+MarkerRuler::minimumSizeHint() const
+{
+ double firstBarWidth = m_rulerScale->getBarWidth(0) + m_xorigin;
+
+ return QSize(static_cast<int>(firstBarWidth), m_barHeight);
+}
+
+void
+MarkerRuler::slotInsertMarkerHere()
+{
+ emit addMarker(getClickPosition());
+}
+
+void
+MarkerRuler::slotInsertMarkerAtPointer()
+{
+ emit addMarker(m_doc->getComposition().getPosition());
+}
+
+void
+MarkerRuler::slotDeleteMarker()
+{
+ RG_DEBUG << "MarkerRuler::slotDeleteMarker()\n";
+
+ Rosegarden::Marker* marker = getMarkerAtClickPosition();
+
+ if (marker)
+ emit deleteMarker(marker->getID(),
+ marker->getTime(),
+ marker->getName(),
+ marker->getDescription());
+}
+
+void
+MarkerRuler::slotEditMarker()
+{
+ Rosegarden::Marker* marker = getMarkerAtClickPosition();
+
+ if (!marker) return;
+
+ // I think the ruler should be doing all this stuff itself, or
+ // emitting signals connected to a dedicated marker model object,
+ // not just relying on the app object. Same goes for practically
+ // everything else we do. Hey ho. Having this here is
+ // inconsistent with the other methods, so if anyone wants to move
+ // it, be my guest.
+
+ MarkerModifyDialog dialog(this, &m_doc->getComposition(), marker);
+ if (dialog.exec() == QDialog::Accepted) {
+ ModifyMarkerCommand *command =
+ new ModifyMarkerCommand(&m_doc->getComposition(),
+ marker->getID(),
+ dialog.getOriginalTime(),
+ dialog.getTime(),
+ qstrtostr(dialog.getName()),
+ qstrtostr(dialog.getDescription()));
+ m_doc->getCommandHistory()->addCommand(command);
+ }
+}
+
+timeT
+MarkerRuler::getClickPosition()
+{
+ timeT t = m_rulerScale->getTimeForX
+ (m_clickX - m_xorigin - m_currentXOffset);
+
+ return t;
+}
+
+Rosegarden::Marker*
+MarkerRuler::getMarkerAtClickPosition()
+{
+ QRect clipRect = visibleRect();
+
+ int firstBar = m_rulerScale->getBarForX(clipRect.x() -
+ m_currentXOffset -
+ m_xorigin);
+ int lastBar = m_rulerScale->getLastVisibleBar();
+ if (firstBar < m_rulerScale->getFirstVisibleBar()) {
+ firstBar = m_rulerScale->getFirstVisibleBar();
+ }
+
+ Composition &comp = m_doc->getComposition();
+ Composition::markercontainer markers = comp.getMarkers();
+
+ timeT start = comp.getBarStart(firstBar);
+ timeT end = comp.getBarEnd(lastBar);
+
+ // need these to calculate the visible extents of a marker tag
+ QPainter painter(this);
+ painter.setFont(*m_barFont);
+ QFontMetrics metrics = painter.fontMetrics();
+
+ for (Composition::markerconstiterator i = markers.begin();
+ i != markers.end(); ++i) {
+
+ if ((*i)->getTime() >= start && (*i)->getTime() < end) {
+
+ QString name(strtoqstr((*i)->getName()));
+
+ int x = m_rulerScale->getXForTime((*i)->getTime())
+ + m_xorigin + m_currentXOffset;
+
+ int width = metrics.width(name) + 5;
+
+ int nextX = -1;
+ Composition::markerconstiterator j = i;
+ ++j;
+ if (j != markers.end()) {
+ nextX = m_rulerScale->getXForTime((*j)->getTime())
+ + m_xorigin + m_currentXOffset;
+ }
+
+ if (m_clickX >= x && m_clickX <= x + width) {
+
+ if (nextX < x || m_clickX <= nextX) {
+
+ return *i;
+ }
+ }
+ }
+ }
+
+ return 0L;
+}
+
+void
+MarkerRuler::paintEvent(QPaintEvent*)
+{
+ QPainter painter(this);
+ painter.setFont(*m_barFont);
+
+ if (getHScaleFactor() != 1.0)
+ painter.scale(getHScaleFactor(), 1.0);
+
+ QRect clipRect = visibleRect();
+
+ int firstBar = m_rulerScale->getBarForX(clipRect.x() -
+ m_currentXOffset -
+ m_xorigin);
+ int lastBar = m_rulerScale->getLastVisibleBar();
+ if (firstBar < m_rulerScale->getFirstVisibleBar()) {
+ firstBar = m_rulerScale->getFirstVisibleBar();
+ }
+
+ painter.drawLine(m_currentXOffset, 0, static_cast<int>(visibleRect().width() / getHScaleFactor()), 0);
+
+ float minimumWidth = 25.0;
+ float testSize = ((float)(m_rulerScale->getBarPosition(firstBar + 1) -
+ m_rulerScale->getBarPosition(firstBar)))
+ / minimumWidth;
+
+ int every = 0;
+ int count = 0;
+
+ if (testSize < 1.0) {
+ every = (int(1.0 / testSize));
+
+ if (every % 2 == 0)
+ every++;
+ }
+
+ for (int i = firstBar; i <= lastBar; ++i) {
+
+ double x = m_rulerScale->getBarPosition(i) + m_xorigin + m_currentXOffset;
+
+ if ((x * getHScaleFactor()) > clipRect.x() + clipRect.width())
+ break;
+
+ // always the first bar number
+ if (every && i != firstBar) {
+ if (count < every) {
+ count++;
+ continue;
+ }
+
+ // reset count if we passed
+ count = 0;
+ }
+
+ // adjust count for first bar line
+ if (every == firstBar)
+ count++;
+
+ if (i != lastBar) {
+ painter.drawLine(static_cast<int>(x), 0, static_cast<int>(x), m_barHeight);
+
+ // disable worldXForm for text
+ QPoint textDrawPoint = painter.xForm(QPoint(static_cast<int>(x + 4), 12));
+
+ bool enableXForm = painter.hasWorldXForm();
+ painter.setWorldXForm(false);
+
+ if (i >= 0)
+ painter.drawText(textDrawPoint, QString("%1").arg(i + 1));
+
+ painter.setWorldXForm(enableXForm);
+ } else {
+ const QPen normalPen = painter.pen();
+ ;
+ QPen endPen(black, 2);
+ painter.setPen(endPen);
+ painter.drawLine(static_cast<int>(x), 0, static_cast<int>(x), m_barHeight);
+ painter.setPen(normalPen);
+ }
+ }
+
+ if (m_doc) {
+ Composition &comp = m_doc->getComposition();
+ Composition::markercontainer markers = comp.getMarkers();
+ Composition::markerconstiterator it;
+
+ timeT start = comp.getBarStart(firstBar);
+ timeT end = comp.getBarEnd(lastBar);
+
+ QFontMetrics metrics = painter.fontMetrics();
+
+ for (it = markers.begin(); it != markers.end(); ++it) {
+ if ((*it)->getTime() >= start && (*it)->getTime() < end) {
+ QString name(strtoqstr((*it)->getName()));
+
+ double x = m_rulerScale->getXForTime((*it)->getTime())
+ + m_xorigin + m_currentXOffset;
+
+ painter.fillRect(static_cast<int>(x), 1,
+ static_cast<int>(metrics.width(name) + 5),
+ m_barHeight - 2,
+ QBrush(GUIPalette::getColour(GUIPalette::MarkerBackground)));
+
+ painter.drawLine(int(x), 1, int(x), m_barHeight - 2);
+ painter.drawLine(int(x) + 1, 1, int(x) + 1, m_barHeight - 2);
+
+ QPoint textDrawPoint = painter.xForm
+ (QPoint(static_cast<int>(x + 3), m_barHeight - 4));
+
+ // disable worldXForm for text
+ bool enableXForm = painter.hasWorldXForm();
+ painter.setWorldXForm(false);
+
+ painter.drawText(textDrawPoint, name);
+
+ painter.setWorldXForm(enableXForm);
+ }
+ }
+ }
+}
+
+void
+MarkerRuler::mousePressEvent(QMouseEvent *e)
+{
+ RG_DEBUG << "MarkerRuler::mousePressEvent: x = " << e->x() << endl;
+
+ if (!m_doc || !e)
+ return;
+
+ m_clickX = e->x();
+ Rosegarden::Marker* clickedMarker = getMarkerAtClickPosition();
+
+ // if right-click, show popup menu
+ //
+ if (e->button() == RightButton) {
+ if (!m_menu)
+ createMenu();
+ if (m_menu) {
+ actionCollection()->action("delete_marker")->setEnabled(clickedMarker != 0);
+ actionCollection()->action("edit_marker")->setEnabled(clickedMarker != 0);
+ m_menu->exec(QCursor::pos());
+ }
+ return;
+ }
+
+ bool shiftPressed = ((e->state() & Qt::ShiftButton) != 0);
+
+ Composition &comp = m_doc->getComposition();
+ Composition::markercontainer markers = comp.getMarkers();
+
+ if (shiftPressed) { // set loop
+
+ timeT t = m_rulerScale->getTimeForX
+ (e->x() - m_xorigin - m_currentXOffset);
+
+ timeT prev = 0;
+
+ for (Composition::markerconstiterator i = markers.begin();
+ i != markers.end(); ++i) {
+
+ timeT cur = (*i)->getTime();
+
+ if (cur >= t) {
+ emit setLoop(prev, cur);
+ return ;
+ }
+
+ prev = cur;
+ }
+
+ if (prev > 0)
+ emit setLoop(prev, comp.getEndMarker());
+
+ } else { // set pointer to clicked marker
+
+ if (clickedMarker)
+ emit setPointerPosition(clickedMarker->getTime());
+ }
+}
+
+void
+MarkerRuler::mouseDoubleClickEvent(QMouseEvent *)
+{
+ RG_DEBUG << "MarkerRuler::mouseDoubleClickEvent" << endl;
+
+ emit editMarkers();
+}
+
+}
+#include "MarkerRuler.moc"
diff --git a/src/gui/rulers/MarkerRuler.h b/src/gui/rulers/MarkerRuler.h
new file mode 100644
index 0000000..c77e6a9
--- /dev/null
+++ b/src/gui/rulers/MarkerRuler.h
@@ -0,0 +1,121 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_MARKERRULER_H_
+#define _RG_MARKERRULER_H_
+
+#include "gui/general/HZoomable.h"
+#include <qsize.h>
+#include <qwidget.h>
+#include <kxmlguiclient.h>
+#include "base/Event.h"
+
+
+class QPaintEvent;
+class QMouseEvent;
+class QFont;
+class QPopupMenu;
+class KMainWindow;
+
+namespace Rosegarden
+{
+
+class Marker;
+class RulerScale;
+class RosegardenGUIDoc;
+
+
+class MarkerRuler : public QWidget, public HZoomable, public KXMLGUIClient
+{
+ Q_OBJECT
+
+public:
+ MarkerRuler(RosegardenGUIDoc *doc,
+ RulerScale *rulerScale,
+ int buttonHeight,
+ double xorigin = 0.0,
+ QWidget* parent = 0,
+ const char* name = 0,
+ WFlags f=0);
+
+ virtual ~MarkerRuler();
+
+ virtual QSize sizeHint() const;
+ virtual QSize minimumSizeHint() const;
+
+ void scrollHoriz(int x);
+
+ void setWidth(int width) { m_width = width; }
+
+signals:
+ /// Set the pointer position on mouse single click
+ void setPointerPosition(timeT);
+
+ /// Open the marker editor window on double click
+ void editMarkers();
+
+ /// add a marker
+ void addMarker(timeT);
+
+ void deleteMarker(int, timeT, QString name, QString description);
+
+ /// Set a loop range
+ void setLoop(timeT, timeT);
+
+protected slots:
+ void slotInsertMarkerHere();
+ void slotInsertMarkerAtPointer();
+ void slotDeleteMarker();
+ void slotEditMarker();
+
+protected:
+ virtual void paintEvent(QPaintEvent*);
+ virtual void mousePressEvent(QMouseEvent *e);
+ virtual void mouseDoubleClickEvent(QMouseEvent *e);
+
+ void createMenu();
+ timeT getClickPosition();
+ Rosegarden::Marker* getMarkerAtClickPosition();
+
+ //--------------- Data members ---------------------------------
+ int m_barHeight;
+ double m_xorigin;
+ int m_currentXOffset;
+ int m_width;
+ int m_clickX;
+
+ QFont *m_barFont;
+ QPopupMenu *m_menu;
+
+ RosegardenGUIDoc *m_doc;
+ RulerScale *m_rulerScale;
+ KMainWindow* m_parentMainWindow;
+
+};
+
+
+}
+
+#endif
diff --git a/src/gui/rulers/PercussionPitchRuler.cpp b/src/gui/rulers/PercussionPitchRuler.cpp
new file mode 100644
index 0000000..a89ae89
--- /dev/null
+++ b/src/gui/rulers/PercussionPitchRuler.cpp
@@ -0,0 +1,204 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "PercussionPitchRuler.h"
+
+#include "misc/Debug.h"
+#include "misc/Strings.h"
+#include "base/MidiProgram.h"
+#include "gui/editors/matrix/MatrixStaff.h"
+#include "gui/editors/matrix/MatrixView.h"
+#include "gui/general/MidiPitchLabel.h"
+#include "PitchRuler.h"
+#include <qcolor.h>
+#include <qevent.h>
+#include <qfont.h>
+#include <qfontmetrics.h>
+#include <qpainter.h>
+#include <qsize.h>
+#include <qwidget.h>
+
+
+namespace Rosegarden
+{
+
+PercussionPitchRuler::PercussionPitchRuler(QWidget *parent,
+ const MidiKeyMapping *mapping,
+ int lineSpacing) :
+ PitchRuler(parent),
+ m_mapping(mapping),
+ m_lineSpacing(lineSpacing),
+ m_mouseDown(false),
+ m_lastHoverHighlight( -1)
+{
+ m_font = new QFont();
+ m_font->setPixelSize(9);
+ m_fontMetrics = new QFontMetrics(*m_font);
+ m_width = m_fontMetrics->width(" A#2 Acoustic Bass Drum ");
+
+ setPaletteBackgroundColor(QColor(238, 238, 224));
+
+ setMouseTracking(true);
+}
+
+QSize PercussionPitchRuler::sizeHint() const
+{
+ return QSize(m_width,
+ (m_lineSpacing + 1) * m_mapping->getPitchExtent());
+}
+
+QSize PercussionPitchRuler::minimumSizeHint() const
+{
+ return QSize(m_width, m_lineSpacing + 1);
+}
+
+void PercussionPitchRuler::paintEvent(QPaintEvent*)
+{
+ QPainter paint(this);
+
+ paint.setFont(*m_font);
+
+ int minPitch = m_mapping->getPitchForOffset(0);
+ int extent = m_mapping->getPitchExtent();
+
+ for (int i = 0; i < extent; ++i) {
+ paint.drawLine(0, i * (m_lineSpacing + 1),
+ m_width, i * (m_lineSpacing + 1));
+ }
+
+ int lw = m_fontMetrics->width("A#2");
+
+ for (int i = 0; i < extent; ++i) {
+
+ MidiPitchLabel label(minPitch + i);
+ std::string key = m_mapping->getMapForKeyName(minPitch + i);
+
+ RG_DEBUG << i << ": " << label.getQString() << ": " << key << endl;
+
+ paint.drawText
+ (2, (extent - i - 1) * (m_lineSpacing + 1) +
+ m_fontMetrics->ascent() + 1,
+ label.getQString());
+
+ paint.drawText
+ (9 + lw, (extent - i - 1) * (m_lineSpacing + 1) +
+ m_fontMetrics->ascent() + 1,
+ strtoqstr(key));
+ }
+}
+
+void PercussionPitchRuler::enterEvent(QEvent *)
+{}
+
+void PercussionPitchRuler::leaveEvent(QEvent*)
+{
+ // m_hoverHighlight->hide();
+}
+
+void PercussionPitchRuler::drawHoverNote(int evPitch)
+{
+ QPainter paint(this);
+ paint.setFont(*m_font);
+
+ if (m_lastHoverHighlight != evPitch) {
+
+ int minPitch = m_mapping->getPitchForOffset(0);
+ int extent = m_mapping->getPitchExtent();
+
+ int lw = m_fontMetrics->width("A#2");
+
+ if (m_lastHoverHighlight >= 0) {
+
+ int y = (extent - (m_lastHoverHighlight - minPitch) - 1) * (m_lineSpacing + 1);
+ paint.setBrush(QColor(238, 238, 224));
+ paint.setPen(QColor(238, 238, 224));
+ paint.drawRect(lw + 7, y + 1, m_width - lw, m_lineSpacing);
+ std::string key = m_mapping->getMapForKeyName(m_lastHoverHighlight);
+ paint.setPen(Qt::black);
+ paint.drawText
+ (9 + lw, y + m_fontMetrics->ascent() + 1,
+ strtoqstr(key));
+ }
+
+ int y = (extent - (evPitch - minPitch) - 1) * (m_lineSpacing + 1);
+ m_lastHoverHighlight = evPitch;
+ paint.setBrush(paint.pen().color());
+ paint.drawRect(lw + 7, y, m_width - lw, m_lineSpacing + 1);
+ paint.setPen(QColor(238, 238, 224));
+
+ std::string key = m_mapping->getMapForKeyName(evPitch);
+ paint.drawText
+ (9 + lw, y + m_fontMetrics->ascent() + 1,
+ strtoqstr(key));
+ }
+}
+
+void PercussionPitchRuler::mouseMoveEvent(QMouseEvent* e)
+{
+ // ugh
+
+ MatrixView *matrixView = dynamic_cast<MatrixView*>(topLevelWidget());
+ if (matrixView) {
+ MatrixStaff *staff = matrixView->getStaff(0);
+ if (staff) {
+ drawHoverNote(staff->getHeightAtCanvasCoords(e->x(), e->y()));
+ }
+ }
+
+ if (m_mouseDown)
+ if (m_selecting)
+ emit keySelected(e->y(), true);
+ else
+ emit keyPressed(e->y(), true); // we're swooshing
+ else
+ emit hoveredOverKeyChanged(e->y());
+}
+
+void PercussionPitchRuler::mousePressEvent(QMouseEvent *e)
+{
+ Qt::ButtonState bs = e->state();
+
+ if (e->button() == LeftButton) {
+
+ m_mouseDown = true;
+ m_selecting = (bs & Qt::ShiftButton);
+
+ if (m_selecting)
+ emit keySelected(e->y(), false);
+ else
+ emit keyPressed(e->y(), false);
+ }
+}
+
+void PercussionPitchRuler::mouseReleaseEvent(QMouseEvent *e)
+{
+ if (e->button() == LeftButton) {
+ m_mouseDown = false;
+ m_selecting = false;
+ }
+}
+
+}
+#include "PercussionPitchRuler.moc"
diff --git a/src/gui/rulers/PercussionPitchRuler.h b/src/gui/rulers/PercussionPitchRuler.h
new file mode 100644
index 0000000..cae61ec
--- /dev/null
+++ b/src/gui/rulers/PercussionPitchRuler.h
@@ -0,0 +1,91 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_PERCUSSIONPITCHRULER_H_
+#define _RG_PERCUSSIONPITCHRULER_H_
+
+#include "PitchRuler.h"
+#include <qsize.h>
+
+
+class QWidget;
+class QPaintEvent;
+class QMouseEvent;
+class QFontMetrics;
+class QFont;
+class QEvent;
+
+
+namespace Rosegarden
+{
+
+class MidiKeyMapping;
+
+
+class PercussionPitchRuler : public PitchRuler
+{
+ Q_OBJECT
+public:
+ PercussionPitchRuler(QWidget *parent,
+ const MidiKeyMapping *mapping,
+ int lineSpacing);
+
+ virtual QSize sizeHint() const;
+ virtual QSize minimumSizeHint() const;
+
+ void drawHoverNote(int evPitch);
+
+signals:
+ void keyPressed(unsigned int y, bool repeating);
+ void keySelected(unsigned int y, bool repeating);
+ void hoveredOverKeyChanged(unsigned int y);
+
+protected:
+ virtual void paintEvent(QPaintEvent*);
+ virtual void mouseMoveEvent(QMouseEvent*);
+ virtual void mousePressEvent(QMouseEvent*);
+ virtual void mouseReleaseEvent(QMouseEvent*);
+ virtual void enterEvent(QEvent *);
+ virtual void leaveEvent(QEvent *);
+
+ const MidiKeyMapping *m_mapping;
+
+ int m_width;
+ int m_lineSpacing;
+
+ bool m_mouseDown;
+ bool m_selecting;
+
+ int m_lastHoverHighlight;
+
+ QFont *m_font;
+ QFontMetrics *m_fontMetrics;
+};
+
+
+
+}
+
+#endif
diff --git a/src/gui/rulers/PitchRuler.cpp b/src/gui/rulers/PitchRuler.cpp
new file mode 100644
index 0000000..55f4b00
--- /dev/null
+++ b/src/gui/rulers/PitchRuler.cpp
@@ -0,0 +1,55 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "PitchRuler.h"
+
+#include <qsize.h>
+#include <qwidget.h>
+
+
+namespace Rosegarden
+{
+
+PitchRuler::
+PitchRuler(QWidget *parent) :
+ QWidget(parent)
+{
+ // nothing else
+}
+
+QSize
+PitchRuler::sizeHint() const
+{
+ return QWidget::sizeHint();
+}
+
+QSize
+PitchRuler::minimumSizeHint() const
+{
+ return QWidget::minimumSizeHint();
+}
+
+}
+#include "PitchRuler.moc"
diff --git a/src/gui/rulers/PitchRuler.h b/src/gui/rulers/PitchRuler.h
new file mode 100644
index 0000000..3c47709
--- /dev/null
+++ b/src/gui/rulers/PitchRuler.h
@@ -0,0 +1,78 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_PITCHRULER_H_
+#define _RG_PITCHRULER_H_
+
+#include <qsize.h>
+#include <qwidget.h>
+
+
+
+
+namespace Rosegarden
+{
+
+
+
+class PitchRuler : public QWidget
+{
+ Q_OBJECT
+public:
+ PitchRuler(QWidget *parent);
+
+ virtual QSize sizeHint() const;
+ virtual QSize minimumSizeHint() const;
+
+ virtual void drawHoverNote(int evPitch) = 0;
+
+signals:
+
+ /**
+ * A pitch has been clicked.
+ * y is the simple event y-coordinate.
+ * If the user is in the middle of dragging, repeating will be set.
+ */
+ void keyPressed(unsigned int y, bool repeating);
+
+ /**
+ * A pitch has been clicked with the selection modifier pressed.
+ * y is the simple event y-coordinate.
+ * If the user is in the middle of dragging, repeating will be set.
+ */
+ void keySelected(unsigned int y, bool repeating);
+
+ /**
+ * Emitted when the mouse cursor moves to a different pitch when
+ * not clicking or selecting.
+ * y is the simple event y-coordinate.
+ */
+ void hoveredOverKeyChanged(unsigned int y);
+};
+
+
+}
+
+#endif
diff --git a/src/gui/rulers/PropertyBox.cpp b/src/gui/rulers/PropertyBox.cpp
new file mode 100644
index 0000000..38d67ef
--- /dev/null
+++ b/src/gui/rulers/PropertyBox.cpp
@@ -0,0 +1,77 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "PropertyBox.h"
+
+#include "gui/general/GUIPalette.h"
+#include <qpainter.h>
+#include <qsize.h>
+#include <qstring.h>
+#include <qwidget.h>
+
+
+namespace Rosegarden
+{
+
+PropertyBox::PropertyBox(QString label,
+ int width,
+ int height,
+ QWidget *parent,
+ const char *name):
+ QWidget(parent, name),
+ m_label(label),
+ m_width(width),
+ m_height(height)
+{}
+
+QSize
+PropertyBox::sizeHint() const
+{
+ return QSize(m_width, m_height);
+}
+
+QSize
+PropertyBox::minimumSizeHint() const
+{
+ return QSize(m_width, m_height);
+}
+
+void
+PropertyBox::paintEvent(QPaintEvent *e)
+{
+ QPainter paint(this);
+
+ paint.setPen(GUIPalette::getColour(GUIPalette::MatrixElementBorder));
+ //paint.setBrush(GUIPalette::getColour(GUIPalette::MatrixElementBlock));
+
+ paint.setClipRegion(e->region());
+ paint.setClipRect(e->rect().normalize());
+
+ paint.drawRect(2, 2, m_width - 3, m_height - 3);
+ paint.drawText(10, 2 * m_height / 3, m_label);
+}
+
+}
+#include "PropertyBox.moc"
diff --git a/src/gui/rulers/PropertyBox.h b/src/gui/rulers/PropertyBox.h
new file mode 100644
index 0000000..1b36f0b
--- /dev/null
+++ b/src/gui/rulers/PropertyBox.h
@@ -0,0 +1,74 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_PROPERTYBOX_H_
+#define _RG_PROPERTYBOX_H_
+
+#include <qsize.h>
+#include <qstring.h>
+#include <qwidget.h>
+
+
+class QPaintEvent;
+
+
+namespace Rosegarden
+{
+
+
+
+/**
+ * We use a ControlBox to help modify events on the ruler - set tools etc.
+ * and provide extra information or options.
+ *
+ */
+class PropertyBox : public QWidget
+{
+ Q_OBJECT
+
+public:
+ PropertyBox(QString label,
+ int width,
+ int height,
+ QWidget *parent=0,
+ const char *name = 0);
+
+ virtual QSize sizeHint() const;
+ virtual QSize minimumSizeHint() const;
+
+protected:
+ virtual void paintEvent(QPaintEvent *);
+
+ //--------------- Data members ---------------------------------
+
+ QString m_label;
+ int m_width;
+ int m_height;
+};
+
+
+}
+
+#endif
diff --git a/src/gui/rulers/PropertyControlRuler.cpp b/src/gui/rulers/PropertyControlRuler.cpp
new file mode 100644
index 0000000..7dc1258
--- /dev/null
+++ b/src/gui/rulers/PropertyControlRuler.cpp
@@ -0,0 +1,441 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "PropertyControlRuler.h"
+
+#include "ControlRuler.h"
+#include "ControlItem.h"
+#include "ViewElementAdapter.h"
+#include "misc/Debug.h"
+#include "base/BaseProperties.h"
+#include "base/NotationTypes.h"
+#include "base/PropertyName.h"
+#include "base/RulerScale.h"
+#include "base/Segment.h"
+#include "base/Selection.h"
+#include "base/Staff.h"
+#include "base/ViewElement.h"
+#include "commands/edit/SelectionPropertyCommand.h"
+#include "gui/general/EditViewBase.h"
+#include "gui/widgets/TextFloat.h"
+#include "gui/general/LinedStaff.h"
+#include <qcanvas.h>
+#include <qcolor.h>
+#include <qpoint.h>
+#include <qstring.h>
+#include <qwidget.h>
+
+
+namespace Rosegarden
+{
+
+PropertyControlRuler::PropertyControlRuler(PropertyName propertyName,
+ Staff* staff,
+ RulerScale* rulerScale,
+ EditViewBase* parentView,
+ QCanvas* c, QWidget* parent,
+ const char* name, WFlags f) :
+ ControlRuler(&(staff->getSegment()), rulerScale,
+ parentView, c, parent, name, f),
+ m_propertyName(propertyName),
+ m_staff(staff),
+ m_propertyLine(new QCanvasLine(canvas())),
+ m_propertyLineShowing(false),
+ m_propertyLineX(0),
+ m_propertyLineY(0)
+{
+ m_staff->addObserver(this);
+ m_propertyLine->setZ(1000); // bring to front
+
+ setMenuName("property_ruler_menu");
+ drawBackground();
+ init();
+}
+
+void
+PropertyControlRuler::setStaff(Staff *staff)
+{
+ RG_DEBUG << "PropertyControlRuler::setStaff(" << staff << ")" << endl;
+
+ m_staff->removeObserver(this);
+ m_segment->removeObserver(this);
+ m_staff = staff;
+ m_segment = &m_staff->getSegment();
+ m_staff->addObserver(this);
+ m_segment->addObserver(this);
+
+ //!!! need to delete the control items here
+
+ drawBackground();
+ init();
+}
+
+void
+PropertyControlRuler::drawBackground()
+{
+ // Draw some minimum and maximum controller value guide lines
+ //
+ QCanvasLine *topLine = new QCanvasLine(canvas());
+ QCanvasLine *topQLine = new QCanvasLine(canvas());
+ QCanvasLine *midLine = new QCanvasLine(canvas());
+ QCanvasLine *botQLine = new QCanvasLine(canvas());
+ QCanvasLine *bottomLine = new QCanvasLine(canvas());
+ //m_controlLine->setPoints(m_controlLineX, m_controlLineY, m_controlLineX, m_controlLineY);
+ int cHeight = canvas()->height();
+ int cWidth = canvas()->width();
+
+ topLine->setPen(QColor(127, 127, 127));
+ topLine->setPoints(0, 0, cWidth, 0);
+ topLine->setZ( -10);
+ topLine->show();
+
+ topQLine->setPen(QColor(192, 192, 192));
+ topQLine->setPoints(0, cHeight / 4, cWidth, cHeight / 4);
+ topQLine->setZ( -10);
+ topQLine->show();
+
+ midLine->setPen(QColor(127, 127, 127));
+ midLine->setPoints(0, cHeight / 2, cWidth, cHeight / 2);
+ midLine->setZ( -10);
+ midLine->show();
+
+ botQLine->setPen(QColor(192, 192, 192));
+ botQLine->setPoints(0, 3*cHeight / 4, cWidth, 3*cHeight / 4);
+ botQLine->setZ( -10);
+ botQLine->show();
+
+ bottomLine->setPen(QColor(127, 127, 127));
+ bottomLine->setPoints(0, cHeight - 1, cWidth, cHeight - 1);
+ bottomLine->setZ( -10);
+ bottomLine->show();
+}
+
+PropertyControlRuler::~PropertyControlRuler()
+{
+ if (m_staff) {
+ m_staff->removeObserver(this);
+ }
+}
+
+QString PropertyControlRuler::getName()
+{
+ return getPropertyName().c_str();
+}
+
+void PropertyControlRuler::init()
+{
+ ViewElementList* viewElementList = m_staff->getViewElementList();
+
+ LinedStaff* lStaff = dynamic_cast<LinedStaff*>(m_staff);
+
+ if (lStaff)
+ m_staffOffset = lStaff->getX();
+
+ for (ViewElementList::iterator i = viewElementList->begin();
+ i != viewElementList->end(); ++i) {
+
+ if ((*i)->event()->isa(Note::EventRestType))
+ continue;
+
+ double x = m_rulerScale->getXForTime((*i)->getViewAbsoluteTime());
+ new ControlItem(this, new ViewElementAdapter(*i, getPropertyName()), int(x + m_staffOffset),
+ int(m_rulerScale->getXForTime((*i)->getViewAbsoluteTime() +
+ (*i)->getViewDuration()) - x));
+
+ }
+}
+
+void PropertyControlRuler::elementAdded(const Staff *, ViewElement *el)
+{
+ RG_DEBUG << "PropertyControlRuler::elementAdded()\n";
+
+ if (el->event()->isa(Note::EventRestType))
+ return ;
+
+ double x = m_rulerScale->getXForTime(el->getViewAbsoluteTime());
+
+ new ControlItem(this, new ViewElementAdapter(el, getPropertyName()), int(x + m_staffOffset),
+ int(m_rulerScale->getXForTime(el->getViewAbsoluteTime() +
+ el->getViewDuration()) - x));
+}
+
+void PropertyControlRuler::elementRemoved(const Staff *, ViewElement *el)
+{
+ RG_DEBUG << "PropertyControlRuler::elementRemoved(\n";
+
+ clearSelectedItems();
+
+ QCanvasItemList allItems = canvas()->allItems();
+
+ for (QCanvasItemList::Iterator it = allItems.begin(); it != allItems.end(); ++it) {
+ if (ControlItem *item = dynamic_cast<ControlItem*>(*it)) {
+ ViewElementAdapter * adapter = dynamic_cast<ViewElementAdapter*>(item->getElementAdapter());
+ if (adapter->getViewElement() == el) {
+ delete item;
+ break;
+ }
+ }
+ }
+}
+
+void PropertyControlRuler::staffDeleted(const Staff *)
+{
+ m_staff = 0;
+}
+
+void
+PropertyControlRuler::endMarkerTimeChanged(const Segment *s, bool)
+{
+ timeT endMarkerTime = s->getEndMarkerTime();
+
+ RG_DEBUG << "PropertyControlRuler::endMarkerTimeChanged() " << endMarkerTime << endl;
+
+ clearSelectedItems();
+
+ clear();
+ init();
+}
+
+void PropertyControlRuler::computeStaffOffset()
+{
+ LinedStaff* lStaff = dynamic_cast<LinedStaff*>(m_staff);
+ if (lStaff)
+ m_staffOffset = lStaff->getX();
+}
+
+void PropertyControlRuler::startPropertyLine()
+{
+ RG_DEBUG << "PropertyControlRuler::startPropertyLine\n";
+ m_propertyLineShowing = true;
+ this->setCursor(Qt::pointingHandCursor);
+}
+
+void
+PropertyControlRuler::contentsMousePressEvent(QMouseEvent *e)
+{
+ RG_DEBUG << "PropertyControlRuler::contentsMousePressEvent\n";
+
+ if (!m_propertyLineShowing) {
+ if (e->button() == MidButton)
+ m_lastEventPos = inverseMapPoint(e->pos());
+
+ ControlRuler::contentsMousePressEvent(e); // send super
+
+ return ;
+ }
+
+ // cancel control line mode
+ if (e->button() == RightButton) {
+ m_propertyLineShowing = false;
+ m_propertyLine->hide();
+
+ this->setCursor(Qt::arrowCursor);
+ return ;
+ }
+
+ if (e->button() == LeftButton) {
+ QPoint p = inverseMapPoint(e->pos());
+
+ m_propertyLine->show();
+ m_propertyLineX = p.x();
+ m_propertyLineY = p.y();
+ m_propertyLine->setPoints(m_propertyLineX, m_propertyLineY, m_propertyLineX, m_propertyLineY);
+ canvas()->update();
+ }
+}
+
+void
+PropertyControlRuler::contentsMouseReleaseEvent(QMouseEvent *e)
+{
+ RG_DEBUG << "PropertyControlRuler::contentsMouseReleaseEvent\n";
+
+ /*
+ if (m_propertyLineShowing)
+ {
+ this->setCursor(Qt::arrowCursor);
+ m_propertyLineShowing = false;
+ canvas()->update();
+ }
+ */
+
+ if (!m_propertyLineShowing) {
+ /*
+ if (e->button() == MidButton)
+ insertControllerEvent();
+ */
+
+ ControlRuler::contentsMouseReleaseEvent(e); // send super
+ return ;
+ } else {
+ QPoint p = inverseMapPoint(e->pos());
+
+ timeT startTime = m_rulerScale->getTimeForX(m_propertyLineX);
+ timeT endTime = m_rulerScale->getTimeForX(p.x());
+
+ long startValue = heightToValue(m_propertyLineY - canvas()->height());
+ long endValue = heightToValue(p.y() - canvas()->height());
+
+ RG_DEBUG << "PropertyControlRuler::contentsMouseReleaseEvent - "
+ << "starttime = " << startTime
+ << ", endtime = " << endTime
+ << ", startValue = " << startValue
+ << ", endValue = " << endValue
+ << endl;
+
+ drawPropertyLine(startTime, endTime, startValue, endValue);
+
+ m_propertyLineShowing = false;
+ m_propertyLine->hide();
+ this->setCursor(Qt::arrowCursor);
+ canvas()->update();
+ }
+}
+
+void
+PropertyControlRuler::contentsMouseMoveEvent(QMouseEvent *e)
+{
+ RG_DEBUG << "PropertyControlRuler::contentsMouseMoveEvent\n";
+
+ if (!m_propertyLineShowing) {
+ // Don't send super if we're using the middle button
+ //
+ if (e->button() == MidButton) {
+ m_lastEventPos = inverseMapPoint(e->pos());
+ return ;
+ }
+
+ ControlRuler::contentsMouseMoveEvent(e); // send super
+ return ;
+ }
+
+ QPoint p = inverseMapPoint(e->pos());
+
+ m_propertyLine->setPoints(m_propertyLineX, m_propertyLineY, p.x(), p.y());
+ canvas()->update();
+}
+
+void PropertyControlRuler::contentsContextMenuEvent(QContextMenuEvent* e)
+{
+ RG_DEBUG << "PropertyControlRuler::contentsContextMenuEvent\n";
+
+ // check if we actually have some control items
+ QCanvasItemList list = canvas()->allItems();
+ bool haveItems = false;
+
+ QCanvasItemList::Iterator it = list.begin();
+ for (; it != list.end(); ++it) {
+ if (dynamic_cast<ControlItem*>(*it)) {
+ haveItems = true;
+ break;
+ }
+ }
+
+ RG_DEBUG << "PropertyControlRuler::contentsContextMenuEvent : haveItems = "
+ << haveItems << endl;
+
+ emit stateChange("have_note_events_in_segment", haveItems);
+
+ ControlRuler::contentsContextMenuEvent(e);
+}
+
+void
+PropertyControlRuler::drawPropertyLine(timeT startTime,
+ timeT endTime,
+ int startValue,
+ int endValue)
+{
+ if (startTime > endTime) {
+ std::swap(startTime, endTime);
+ std::swap(startValue, endValue);
+ }
+
+ RG_DEBUG << "PropertyControlRuler::drawPropertyLine - set velocity from "
+ << startTime
+ << " to " << endTime << endl;
+
+ // Add the "true" to catch Events overlapping this line
+ //
+ EventSelection selection(*m_segment, startTime, endTime, true);
+ PropertyPattern pattern = DecrescendoPattern;
+
+ bool haveNotes = selection.contains(Note::EventType);
+
+ if (haveNotes) {
+
+ SelectionPropertyCommand *command =
+ new SelectionPropertyCommand(&selection,
+ BaseProperties::VELOCITY,
+ pattern,
+ startValue,
+ endValue);
+
+ m_parentEditView->addCommandToHistory(command);
+
+ } else {
+
+ RG_DEBUG << "PropertyControlRuler::drawPropertyLine - no notes in selection\n";
+
+ }
+}
+
+void
+PropertyControlRuler::selectAllProperties()
+{
+ RG_DEBUG << "PropertyControlRuler::selectAllProperties" << endl;
+
+ /*
+ for(Segment::iterator i = m_segment.begin();
+ i != m_segment.end(); ++i)
+ if (!m_eventSelection->contains(*i)) m_eventSelection->addEvent(*i);
+ */
+
+ clearSelectedItems();
+
+ QCanvasItemList l = canvas()->allItems();
+ for (QCanvasItemList::Iterator it = l.begin(); it != l.end(); ++it) {
+ if (ControlItem *item = dynamic_cast<ControlItem*>(*it)) {
+ m_selectedItems << item;
+ (*it)->setSelected(true);
+ ElementAdapter* adapter = item->getElementAdapter();
+ m_eventSelection->addEvent(adapter->getEvent());
+ }
+ }
+
+ /*
+ m_eventSelection->addFromSelection(&selection);
+ for (QCanvasItemList::Iterator it=m_selectedItems.begin(); it!=m_selectedItems.end(); ++it) {
+ if (ControlItem *item = dynamic_cast<ControlItem*>(*it)) {
+
+ ElementAdapter* adapter = item->getElementAdapter();
+ m_eventSelection->addEvent(adapter->getEvent());
+ item->handleMouseButtonRelease(e);
+ }
+ }
+ */
+
+ emit stateChange("have_controller_item_selected", true);
+}
+
+}
diff --git a/src/gui/rulers/PropertyControlRuler.h b/src/gui/rulers/PropertyControlRuler.h
new file mode 100644
index 0000000..f94f3e1
--- /dev/null
+++ b/src/gui/rulers/PropertyControlRuler.h
@@ -0,0 +1,120 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_PROPERTYCONTROLRULER_H_
+#define _RG_PROPERTYCONTROLRULER_H_
+
+#include "base/PropertyName.h"
+#include "base/Staff.h"
+#include "ControlRuler.h"
+#include <qstring.h>
+#include "base/Event.h"
+
+
+class QWidget;
+class QMouseEvent;
+class QContextMenuEvent;
+class QCanvasLine;
+class QCanvas;
+
+
+namespace Rosegarden
+{
+
+class ViewElement;
+class Staff;
+class Segment;
+class RulerScale;
+class EditViewBase;
+
+
+/**
+ * PropertyControlRuler : edit a property on events on a staff (only
+ * events with a ViewElement attached, mostly notes)
+ */
+class PropertyControlRuler : public ControlRuler, public StaffObserver
+{
+public:
+ PropertyControlRuler(PropertyName propertyName,
+ Staff*,
+ RulerScale*,
+ EditViewBase* parentView,
+ QCanvas*,
+ QWidget* parent=0, const char* name=0, WFlags f=0);
+
+ virtual ~PropertyControlRuler();
+
+ virtual QString getName();
+
+ const PropertyName& getPropertyName() { return m_propertyName; }
+
+ // Allow something external to reset the selection of Events
+ // that this ruler is displaying
+ //
+ void setStaff(Staff *);
+
+ // StaffObserver interface
+ virtual void elementAdded(const Staff *, ViewElement*);
+ virtual void elementRemoved(const Staff *, ViewElement*);
+ virtual void staffDeleted(const Staff *);
+ virtual void startPropertyLine();
+ virtual void selectAllProperties();
+
+ /// SegmentObserver interface
+ virtual void endMarkerTimeChanged(const Segment *, bool shorten);
+
+protected:
+
+ virtual void contentsMousePressEvent(QMouseEvent*);
+ virtual void contentsMouseReleaseEvent(QMouseEvent*);
+ virtual void contentsMouseMoveEvent(QMouseEvent*);
+ virtual void contentsContextMenuEvent(QContextMenuEvent*);
+
+ void drawPropertyLine(timeT startTime,
+ timeT endTime,
+ int startValue,
+ int endValue);
+
+ virtual void init();
+ virtual void drawBackground();
+ virtual void computeStaffOffset();
+
+ //--------------- Data members ---------------------------------
+
+ PropertyName m_propertyName;
+ Staff* m_staff;
+
+ QCanvasLine *m_propertyLine;
+
+ bool m_propertyLineShowing;
+ int m_propertyLineX;
+ int m_propertyLineY;
+};
+
+
+
+}
+
+#endif
diff --git a/src/gui/rulers/PropertyViewRuler.cpp b/src/gui/rulers/PropertyViewRuler.cpp
new file mode 100644
index 0000000..cf5d89d
--- /dev/null
+++ b/src/gui/rulers/PropertyViewRuler.cpp
@@ -0,0 +1,175 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "PropertyViewRuler.h"
+
+#include "base/Event.h"
+#include <klocale.h>
+#include "misc/Strings.h"
+#include "base/PropertyName.h"
+#include "base/RulerScale.h"
+#include "base/Segment.h"
+#include "DefaultVelocityColour.h"
+#include "gui/general/GUIPalette.h"
+#include "gui/general/HZoomable.h"
+#include <qfont.h>
+#include <qfontmetrics.h>
+#include <qpainter.h>
+#include <qrect.h>
+#include <qsize.h>
+#include <qstring.h>
+#include <qtooltip.h>
+#include <qwidget.h>
+
+
+namespace Rosegarden
+{
+
+PropertyViewRuler::PropertyViewRuler(RulerScale *rulerScale,
+ Segment *segment,
+ const PropertyName &property,
+ double xorigin,
+ int height,
+ QWidget *parent,
+ const char *name) :
+ QWidget(parent, name),
+ m_propertyName(property),
+ m_xorigin(xorigin),
+ m_height(height),
+ m_currentXOffset(0),
+ m_width( -1),
+ m_segment(segment),
+ m_rulerScale(rulerScale),
+ m_fontMetrics(m_boldFont)
+{
+ m_boldFont.setBold(true);
+ m_fontMetrics = QFontMetrics(m_boldFont);
+
+ setBackgroundColor(GUIPalette::getColour(GUIPalette::SegmentCanvas));
+
+ QString tip = i18n("%1 controller").arg(strtoqstr(property));
+ QToolTip::add
+ (this, tip);
+}
+
+PropertyViewRuler::~PropertyViewRuler()
+{
+ // nothing
+}
+
+void
+PropertyViewRuler::slotScrollHoriz(int x)
+{
+ int w = width(), h = height();
+ x = int(double(x) / getHScaleFactor());
+ int dx = x - ( -m_currentXOffset);
+ m_currentXOffset = -x;
+
+ if (dx > w*3 / 4 || dx < -w*3 / 4) {
+ update();
+ return ;
+ }
+
+ if (dx > 0) { // moving right, so the existing stuff moves left
+ bitBlt(this, 0, 0, this, dx, 0, w - dx, h);
+ repaint(w - dx, 0, dx, h);
+ } else { // moving left, so the existing stuff moves right
+ bitBlt(this, -dx, 0, this, 0, 0, w + dx, h);
+ repaint(0, 0, -dx, h);
+ }
+}
+
+QSize
+PropertyViewRuler::sizeHint() const
+{
+ double width =
+ m_rulerScale->getBarPosition(m_rulerScale->getLastVisibleBar()) +
+ m_rulerScale->getBarWidth(m_rulerScale->getLastVisibleBar()) +
+ m_xorigin;
+
+ QSize res(std::max(int(width), m_width), m_height);
+
+ return res;
+}
+
+QSize
+PropertyViewRuler::minimumSizeHint() const
+{
+ double firstBarWidth = m_rulerScale->getBarWidth(0) + m_xorigin;
+ QSize res = QSize(int(firstBarWidth), m_height);
+ return res;
+}
+
+void
+PropertyViewRuler::paintEvent(QPaintEvent* e)
+{
+ QPainter paint(this);
+
+ if (getHScaleFactor() != 1.0)
+ paint.scale(getHScaleFactor(), 1.0);
+
+ paint.setPen(GUIPalette::getColour(GUIPalette::MatrixElementBorder));
+
+ QRect clipRect = e->rect().normalize();
+
+ timeT from = m_rulerScale->getTimeForX
+ (clipRect.x() - m_currentXOffset - m_xorigin);
+
+ Segment::iterator it = m_segment->findNearestTime(from);
+
+ for (; m_segment->isBeforeEndMarker(it); it++) {
+ long value = 0;
+
+ if (!(*it)->get
+ <Int>(m_propertyName, value))
+ continue;
+
+ int x = int(m_rulerScale->getXForTime((*it)->getAbsoluteTime()))
+ + m_currentXOffset + int(m_xorigin);
+
+ int xPos = x * int(getHScaleFactor());
+
+ if (xPos < clipRect.x())
+ continue;
+
+ if (xPos > (clipRect.x() + clipRect.width()))
+ break;
+
+ // include fiddle factor (+2)
+ int width =
+ int(m_rulerScale->getXForTime((*it)->getAbsoluteTime() +
+ (*it)->getDuration()) + 2)
+ + m_currentXOffset + int(m_xorigin) - x;
+
+ int blockHeight = int(double(height()) * (value / 127.0));
+
+ paint.setBrush(DefaultVelocityColour::getInstance()->getColour(value));
+
+ paint.drawRect(x, height() - blockHeight, width, blockHeight);
+ }
+}
+
+}
+#include "PropertyViewRuler.moc"
diff --git a/src/gui/rulers/PropertyViewRuler.h b/src/gui/rulers/PropertyViewRuler.h
new file mode 100644
index 0000000..b7d479c
--- /dev/null
+++ b/src/gui/rulers/PropertyViewRuler.h
@@ -0,0 +1,102 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_PROPERTYVIEWRULER_H_
+#define _RG_PROPERTYVIEWRULER_H_
+
+#include "base/PropertyName.h"
+#include "gui/general/HZoomable.h"
+#include <qfont.h>
+#include <qfontmetrics.h>
+#include <qsize.h>
+#include <qwidget.h>
+
+
+class QPaintEvent;
+
+
+namespace Rosegarden
+{
+
+class Segment;
+class RulerScale;
+
+
+/**
+ * PropertyViewRuler is a widget that shows a range of Property
+ * (velocity, typically) values for a set of Rosegarden Events.
+ */
+class PropertyViewRuler : public QWidget, public HZoomable
+{
+ Q_OBJECT
+
+public:
+ PropertyViewRuler(RulerScale *rulerScale,
+ Segment *segment,
+ const PropertyName &property,
+ double xorigin = 0.0,
+ int height = 0,
+ QWidget* parent = 0,
+ const char *name = 0);
+
+ ~PropertyViewRuler();
+
+ virtual QSize sizeHint() const;
+ virtual QSize minimumSizeHint() const;
+
+ void setMinimumWidth(int width) { m_width = width; }
+
+ /**
+ * Get the property name
+ */
+ PropertyName getPropertyName() const { return m_propertyName; }
+
+public slots:
+ void slotScrollHoriz(int x);
+
+protected:
+ virtual void paintEvent(QPaintEvent *);
+
+ //--------------- Data members ---------------------------------
+
+ PropertyName m_propertyName;
+
+ double m_xorigin;
+ int m_height;
+ int m_currentXOffset;
+ int m_width;
+
+ Segment *m_segment;
+ RulerScale *m_rulerScale;
+
+ QFont m_font;
+ QFont m_boldFont;
+ QFontMetrics m_fontMetrics;
+};
+
+
+}
+
+#endif
diff --git a/src/gui/rulers/RawNoteRuler.cpp b/src/gui/rulers/RawNoteRuler.cpp
new file mode 100644
index 0000000..cc7d6e4
--- /dev/null
+++ b/src/gui/rulers/RawNoteRuler.cpp
@@ -0,0 +1,573 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "RawNoteRuler.h"
+
+#include "misc/Debug.h"
+#include "base/BaseProperties.h"
+#include "base/Composition.h"
+#include "base/NotationTypes.h"
+#include "base/NotationQuantizer.h"
+#include "base/RulerScale.h"
+#include "base/Segment.h"
+#include "DefaultVelocityColour.h"
+#include "gui/general/GUIPalette.h"
+#include <klocale.h>
+#include <qcolor.h>
+#include <qpainter.h>
+#include <qrect.h>
+#include <qsize.h>
+#include <qtooltip.h>
+#include <qwidget.h>
+
+
+namespace Rosegarden
+{
+
+RawNoteRuler::RawNoteRuler(RulerScale *rulerScale,
+ Segment *segment,
+ double xorigin,
+ int height,
+ QWidget *parent,
+ const char *name) :
+ QWidget(parent, name),
+ m_xorigin(xorigin),
+ m_height(height),
+ m_currentXOffset(0),
+ m_width( -1),
+ m_segment(segment),
+ m_rulerScale(rulerScale)
+{
+ setBackgroundColor(GUIPalette::getColour(GUIPalette::RawNoteRulerBackground));
+ QToolTip::add(this,"");
+}
+
+RawNoteRuler::~RawNoteRuler()
+{
+ QToolTip::remove(this);
+ // nothing else
+}
+
+void
+RawNoteRuler::slotScrollHoriz(int x)
+{
+ int w = width(), h = height();
+ int dx = x - ( -m_currentXOffset);
+ if (dx == 0)
+ return ;
+ m_currentXOffset = -x;
+
+ if (dx > w*3 / 4 || dx < -w*3 / 4) {
+ update();
+ return ;
+ }
+
+ if (dx > 0) { // moving right, so the existing stuff moves left
+ bitBlt(this, 0, 0, this, dx, 0, w - dx, h);
+ repaint(w - dx, 0, dx, h);
+ } else { // moving left, so the existing stuff moves right
+ bitBlt(this, -dx, 0, this, 0, 0, w + dx, h);
+ repaint(0, 0, -dx, h);
+ }
+}
+
+QSize
+RawNoteRuler::sizeHint() const
+{
+ double width =
+ m_rulerScale->getBarPosition(m_rulerScale->getLastVisibleBar()) +
+ m_rulerScale->getBarWidth(m_rulerScale->getLastVisibleBar()) +
+ m_xorigin;
+
+ QSize res(std::max(int(width), m_width), m_height);
+
+ return res;
+}
+
+QSize
+RawNoteRuler::minimumSizeHint() const
+{
+ double firstBarWidth = m_rulerScale->getBarWidth(0) + m_xorigin;
+ QSize res = QSize(int(firstBarWidth), m_height);
+ return res;
+}
+
+std::pair<timeT, timeT>
+RawNoteRuler::getExtents(Segment::iterator i)
+{
+ const Quantizer *q =
+ m_segment->getComposition()->getNotationQuantizer();
+
+ timeT u0 = (*i)->getAbsoluteTime();
+ timeT u1 = u0 + (*i)->getDuration();
+
+ timeT q0 = q->getQuantizedAbsoluteTime(*i);
+ timeT q1 = q0 + q->getQuantizedDuration(*i);
+
+ timeT t0 = std::min(u0, q0);
+ timeT t1 = std::max(u1, q1);
+
+ return std::pair<timeT, timeT>(t0, t1);
+}
+
+Segment::iterator
+RawNoteRuler::addChildren(Segment *s,
+ Segment::iterator to,
+ timeT rightBound,
+ EventTreeNode *node)
+{
+ Segment::iterator i = node->node;
+
+ std::pair<timeT, timeT> iex = getExtents(i);
+ Segment::iterator j = i;
+ Segment::iterator rightmost = to;
+
+#ifdef DEBUG_RAW_NOTE_RULER
+
+ RG_DEBUG << "addChildren called for extents " << iex.first << "->" << iex.second << ", rightBound " << rightBound << endl;
+#endif
+
+ for (++j; j != to && s->isBeforeEndMarker(j); ) {
+
+ if (!(*j)->isa(Note::EventType)) {
+ ++j;
+ continue;
+ }
+ std::pair<timeT, timeT> jex = getExtents(j);
+
+#ifdef DEBUG_RAW_NOTE_RULER
+
+ RG_DEBUG << "addChildren: event at " << (*j)->getAbsoluteTime() << ", extents " << jex.first << "->" << jex.second << endl;
+#endif
+
+ if (jex.first == jex.second) {
+ ++j;
+ continue;
+ }
+ if (jex.first >= iex.second || jex.first >= rightBound)
+ break;
+
+#ifdef DEBUG_RAW_NOTE_RULER
+
+ RG_DEBUG << "addChildren: adding" << endl;
+#endif
+
+ EventTreeNode *subnode = new EventTreeNode(j);
+
+ Segment::iterator subRightmost = addChildren(s, to, rightBound, subnode);
+ if (subRightmost != to)
+ rightmost = subRightmost;
+ else
+ rightmost = j;
+
+ node->children.push_back(subnode);
+ j = s->findTime(jex.second);
+ }
+
+ return rightmost;
+}
+
+void
+RawNoteRuler::buildForest(Segment *s,
+ Segment::iterator from,
+ Segment::iterator to)
+{
+ for (EventTreeNode::NodeList::iterator i = m_forest.begin();
+ i != m_forest.end(); ++i) {
+ delete *i;
+ }
+ m_forest.clear();
+
+ timeT endTime = (s->isBeforeEndMarker(to) ? (*to)->getAbsoluteTime() :
+ s->getEndMarkerTime());
+
+ for (Segment::iterator i = from; i != to && s->isBeforeEndMarker(i); ) {
+
+ if (!(*i)->isa(Note::EventType)) {
+ ++i;
+ continue;
+ }
+
+ std::pair<timeT, timeT> iex = getExtents(i);
+
+#ifdef DEBUG_RAW_NOTE_RULER
+
+ RG_DEBUG << "buildForest: event at " << (*i)->getAbsoluteTime() << ", extents " << iex.first << "->" << iex.second << endl;
+#endif
+
+ if (iex.first == iex.second) {
+ ++i;
+ continue;
+ }
+ if (iex.first >= endTime)
+ break;
+
+ EventTreeNode *node = new EventTreeNode(i);
+ Segment::iterator rightmost = addChildren(s, to, iex.second, node);
+ m_forest.push_back(node);
+
+ if (rightmost != to) {
+ i = rightmost;
+ ++i;
+ } else {
+ i = s->findTime(iex.second);
+ }
+
+#ifdef DEBUG_RAW_NOTE_RULER
+ RG_DEBUG << "findTime " << iex.second << " returned iterator at " << (i == s->end() ? -1 : (*i)->getAbsoluteTime()) << endl;
+#endif
+
+ }
+}
+
+void
+RawNoteRuler::dumpSubtree(EventTreeNode *node, int depth)
+{
+ if (!node)
+ return ;
+#ifdef DEBUG_RAW_NOTE_RULER
+
+ for (int i = 0; i < depth; ++i)
+ std::cerr << " ";
+ if (depth > 0)
+ std::cerr << "->";
+ std::cerr << (*node->node)->getAbsoluteTime() << ","
+ << (*node->node)->getDuration() << " [";
+ long pitch = 0;
+ if ((*node->node)->get
+ <Int>(PITCH, pitch)) {
+ std::cerr << pitch << "]" << std::endl;
+ }
+ else {
+ std::cerr << "no-pitch]" << std::endl;
+ }
+ for (EventTreeNode::NodeList::iterator i = node->children.begin();
+ i != node->children.end(); ++i) {
+ dumpSubtree(*i, depth + 1);
+ }
+#endif
+ (void)depth; // avoid warnings
+}
+
+void
+RawNoteRuler::dumpForest(EventTreeNode::NodeList *forest)
+{
+#ifdef DEBUG_RAW_NOTE_RULER
+ std::cerr << "\nFOREST:\n" << std::endl;
+
+ for (unsigned int i = 0; i < forest->size(); ++i) {
+
+ std::cerr << "\nTREE " << i << ":\n" << std::endl;
+ dumpSubtree((*forest)[i], 0);
+ }
+
+ std::cerr << std::endl;
+#endif
+
+ (void)forest; // avoid warnings
+}
+
+int
+RawNoteRuler::EventTreeNode::getDepth()
+{
+ int subchildrenDepth = 0;
+ for (NodeList::iterator i = children.begin();
+ i != children.end(); ++i) {
+ int subchildDepth = (*i)->getDepth();
+ if (subchildDepth > subchildrenDepth)
+ subchildrenDepth = subchildDepth;
+ }
+ return subchildrenDepth + 1;
+}
+
+int
+RawNoteRuler::EventTreeNode::getChildrenAboveOrBelow(bool below, int p)
+{
+ long pitch(p);
+ if (pitch < 0)
+ (*node)->get
+ <Int>(BaseProperties::PITCH, pitch);
+
+ int max = 0;
+
+ for (NodeList::iterator i = children.begin();
+ i != children.end(); ++i) {
+ int forThisChild = (*i)->getChildrenAboveOrBelow(below, pitch);
+ long thisChildPitch = pitch;
+ (*(*i)->node)->get
+ <Int>(BaseProperties::PITCH, thisChildPitch);
+ if (below ? (thisChildPitch < pitch) : (thisChildPitch > pitch)) {
+ ++forThisChild;
+ }
+ if (forThisChild > max)
+ max = forThisChild;
+ }
+
+ return max;
+}
+
+void
+RawNoteRuler::drawNode(QPainter &paint, DefaultVelocityColour &vc,
+ EventTreeNode *node, double height, double yorigin)
+{
+ int depth = node->getDepth();
+ int above = node->getChildrenAboveOrBelow(false);
+
+#ifdef DEBUG_RAW_NOTE_RULER
+
+ int below = node->getChildrenAboveOrBelow(true);
+
+ NOTATION_DEBUG << "RawNoteRuler::drawNode: children above: "
+ << above << ", below: " << below << endl;
+#endif
+
+ int toFit = depth;
+
+ double heightPer = double(height) / toFit;
+ if (heightPer > m_height / 4)
+ heightPer = m_height / 4;
+ if (heightPer < 2)
+ heightPer = 2;
+
+ double myOrigin = yorigin + (heightPer * above);
+ long myPitch = 60;
+ (*node->node)->get
+ <Int>(BaseProperties::PITCH, myPitch);
+
+ long velocity = 100;
+ (*node->node)->get
+ <Int>(BaseProperties::VELOCITY, velocity);
+ QColor colour = vc.getColour(velocity);
+
+ timeT start = (*node->node)->getAbsoluteTime();
+ timeT end = (*node->node)->getDuration() + start;
+
+ double u0 = m_rulerScale->getXForTime(start);
+ double u1 = m_rulerScale->getXForTime(end);
+
+ u0 += m_currentXOffset + m_xorigin;
+ u1 += m_currentXOffset + m_xorigin;
+
+ start = m_segment->getComposition()->getNotationQuantizer()->
+ getQuantizedAbsoluteTime(*node->node);
+ end = start + m_segment->getComposition()->getNotationQuantizer()->
+ getQuantizedDuration(*node->node);
+
+ double q0 = m_rulerScale->getXForTime(start);
+ double q1 = m_rulerScale->getXForTime(end);
+
+ q0 += m_currentXOffset + m_xorigin;
+ q1 += m_currentXOffset + m_xorigin;
+
+#ifdef DEBUG_RAW_NOTE_RULER
+
+ NOTATION_DEBUG << "RawNoteRuler: (" << int(start) << "," << myOrigin
+ << ") -> (" << int(end) << "," << myOrigin << ")" << endl;
+#endif
+
+ int qi0 = int(q0);
+ int ui0 = int(u0);
+ int qi1 = int(q1);
+ int ui1 = int(u1);
+ // int qiw = int(q1-q0) - 1;
+ int uiw = int(u1 - u0) - 1;
+ // int iy = int(myOrigin + (height - heightPer) / 2);
+ int iy = int(myOrigin);
+ int ih = int(heightPer);
+
+#ifdef DEBUG_RAW_NOTE_RULER
+
+ NOTATION_DEBUG << "RawNoteRuler: height " << height << ", heightPer "
+ << heightPer << ", iy " << iy << endl;
+#endif
+
+ paint.setPen(colour);
+ paint.setBrush(colour);
+ paint.drawRect(ui0 + 1, iy + 1, uiw, ih - 1);
+
+ paint.setPen(GUIPalette::getColour(GUIPalette::RawNoteRulerForeground));
+ paint.setBrush(GUIPalette::getColour(GUIPalette::RawNoteRulerForeground));
+ paint.drawLine(qi0, iy, qi1 - 1, iy);
+ paint.drawLine(qi0, iy + ih, qi1 - 1, iy + ih);
+ paint.drawLine(ui0, iy + 1, ui0, iy + ih - 1);
+ paint.drawLine(ui1 - 1, iy + 1, ui1 - 1, iy + ih - 1);
+
+ for (EventTreeNode::NodeList::iterator i = node->children.begin();
+ i != node->children.end(); ++i) {
+
+ long nodePitch = myPitch;
+ (*(*i)->node)->get
+ <Int>(BaseProperties::PITCH, nodePitch);
+
+ if (nodePitch < myPitch) {
+
+ drawNode(paint, vc, *i,
+ height - heightPer - myOrigin, myOrigin + heightPer);
+
+ } else {
+
+ drawNode(paint, vc, *i,
+ myOrigin - yorigin, yorigin);
+ }
+ }
+}
+
+void
+RawNoteRuler::paintEvent(QPaintEvent* e)
+{
+ if (!m_segment || !m_segment->getComposition())
+ return ;
+
+ // Tooltips
+ {
+ QToolTip::remove(this);
+ TrackId trackId = m_segment->getTrack();
+ Track *track =
+ m_segment->getComposition()->getTrackById(trackId);
+ int trackPosition = -1;
+ if (track)
+ trackPosition = track->getPosition();
+
+ QToolTip::add(this,i18n("Track #%1, Segment \"%2\" (runtime id %3)")
+ .arg(trackPosition + 1)
+ .arg(m_segment->getLabel())
+ .arg(m_segment->getRuntimeId()));
+ }
+
+ // START_TIMING;
+
+ QPainter paint(this);
+ paint.setClipRegion(e->region());
+ paint.setClipRect(e->rect().normalize());
+
+ QRect clipRect = paint.clipRegion().boundingRect();
+
+ timeT from = m_rulerScale->getTimeForX
+ (clipRect.x() - m_currentXOffset - 100 - m_xorigin);
+ timeT to = m_rulerScale->getTimeForX
+ (clipRect.x() + clipRect.width() - m_currentXOffset + 100 - m_xorigin);
+
+ paint.setPen(GUIPalette::getColour(GUIPalette::RawNoteRulerForeground));
+ paint.setBrush(GUIPalette::getColour(GUIPalette::RawNoteRulerForeground));
+ paint.drawLine(0, 0, width(), 0);
+
+ // draw the extent of the segment using its color
+
+ QColor brushColor = GUIPalette::convertColour(m_segment->getComposition()->
+ getSegmentColourMap().getColourByIndex(m_segment->getColourIndex()));
+ paint.setPen(brushColor);
+ paint.setBrush(brushColor);
+ int x0 = int(m_rulerScale->getXForTime(m_segment->getStartTime()) +
+ m_currentXOffset + m_xorigin);
+ int x1 = int(m_rulerScale->getXForTime(m_segment->getEndTime()) +
+ m_currentXOffset + m_xorigin);
+ paint.drawRect(x0, 1, x1-x0+1, height()-1);
+
+ // draw the bar divisions
+
+ int firstBar = m_segment->getComposition()->getBarNumber(from);
+ int lastBar = m_segment->getComposition()->getBarNumber(to);
+ std::vector<int> divisions;
+
+ for (int barNo = firstBar; barNo <= lastBar; ++barNo) {
+
+ bool isNew = false;
+ TimeSignature timeSig =
+ m_segment->getComposition()->getTimeSignatureInBar(barNo, isNew);
+ if (isNew || barNo == firstBar) {
+ timeSig.getDivisions(3, divisions);
+ if (timeSig == TimeSignature()) // special case for 4/4
+ divisions[0] = 2;
+ }
+
+ timeT barStart = m_segment->getComposition()->getBarStart(barNo);
+ timeT base = timeSig.getBarDuration();
+ timeT barEnd = barStart + base;
+
+ paint.setPen(GUIPalette::getColour(GUIPalette::RawNoteRulerForeground));
+ paint.setBrush(GUIPalette::getColour(GUIPalette::RawNoteRulerForeground));
+
+ int x = int(m_rulerScale->getXForTime(barStart) +
+ m_currentXOffset + m_xorigin);
+ paint.drawLine(x, 1, x, m_height);
+
+ for (int depth = 0; depth < 3; ++depth) {
+
+ int grey = depth * 60 + 60;
+ paint.setPen(QColor(grey, grey, grey));
+ paint.setBrush(QColor(grey, grey, grey));
+
+ base /= divisions[depth];
+ timeT t(barStart + base);
+ while (t < barEnd) {
+ if ((t - barStart) % (base * divisions[depth]) != 0) {
+ int x = int(m_rulerScale->getXForTime(t) +
+ m_currentXOffset + m_xorigin);
+ paint.drawLine(x, 1, x, m_height);
+ }
+ t += base;
+ }
+ }
+ }
+
+ // PRINT_ELAPSED("RawNoteRuler::paintEvent: drawing bar lines and divisions");
+
+#ifdef DEBUG_RAW_NOTE_RULER
+ NOTATION_DEBUG << "RawNoteRuler: from is " << from << ", to is " << to << endl;
+#endif
+
+ Segment::iterator i = m_segment->findNearestTime(from);
+ if (i == m_segment->end())
+ i = m_segment->begin();
+
+ // somewhat experimental, as is this whole class
+ Segment::iterator j = m_segment->findTime(to);
+ buildForest(m_segment, i, j);
+
+ // PRINT_ELAPSED("RawNoteRuler::paintEvent: buildForest");
+
+ dumpForest(&m_forest);
+
+ // PRINT_ELAPSED("RawNoteRuler::paintEvent: dumpForest");
+
+ for (EventTreeNode::NodeList::iterator fi = m_forest.begin();
+ fi != m_forest.end(); ++fi) {
+
+ // Each tree in the forest should represent a note that starts
+ // at a time when no other notes are playing (at least of
+ // those that started no earlier than the paint start time).
+ // Each node in that tree represents a note that starts
+ // playing during its parent node's note, or at the same time
+ // as it.
+
+ drawNode(paint, *DefaultVelocityColour::getInstance(), *fi, m_height - 3, 2);
+
+ }
+
+ // PRINT_ELAPSED("RawNoteRuler::paintEvent: complete");
+}
+
+}
+#include "RawNoteRuler.moc"
diff --git a/src/gui/rulers/RawNoteRuler.h b/src/gui/rulers/RawNoteRuler.h
new file mode 100644
index 0000000..f194062
--- /dev/null
+++ b/src/gui/rulers/RawNoteRuler.h
@@ -0,0 +1,128 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_RAWNOTERULER_H_
+#define _RG_RAWNOTERULER_H_
+
+#include "base/Segment.h"
+#include <qsize.h>
+#include <qwidget.h>
+#include <utility>
+#include <vector>
+#include "base/Event.h"
+
+
+class QPaintEvent;
+class QPainter;
+
+
+namespace Rosegarden
+{
+
+class RulerScale;
+class DefaultVelocityColour;
+
+
+/**
+ * RawNoteRuler is a ruler that shows in a vaguely matrix-like fashion
+ * when notes start and end, for use with a notation view that can't
+ * otherwise show this relatively precise unquantized information.
+ * It has no editing function (yet?)
+ */
+
+class RawNoteRuler : public QWidget
+{
+ Q_OBJECT
+
+public:
+ RawNoteRuler(RulerScale *rulerScale,
+ Segment *segment,
+ double xorigin = 0.0,
+ int height = 0,
+ QWidget* parent = 0,
+ const char *name = 0);
+
+ ~RawNoteRuler();
+
+ void setCurrentSegment(Segment *segment) {
+ m_segment = segment;
+ }
+
+ virtual QSize sizeHint() const;
+ virtual QSize minimumSizeHint() const;
+
+ void setMinimumWidth(int width) { m_width = width; }
+
+public slots:
+ void slotScrollHoriz(int x);
+
+protected:
+ virtual void paintEvent(QPaintEvent*);
+
+private:
+ double m_xorigin;
+ int m_height;
+ int m_currentXOffset;
+ int m_width;
+
+ Segment *m_segment;
+ RulerScale *m_rulerScale;
+
+ struct EventTreeNode
+ {
+ typedef std::vector<EventTreeNode *> NodeList;
+
+ EventTreeNode(Segment::iterator n) : node(n) { }
+ ~EventTreeNode() {
+ for (NodeList::iterator i = children.begin();
+ i != children.end(); ++i) {
+ delete *i;
+ }
+ }
+
+ int getDepth();
+ int getChildrenAboveOrBelow(bool below = false, int pitch = -1);
+
+ Segment::iterator node;
+ NodeList children;
+ };
+
+ std::pair<timeT, timeT> getExtents(Segment::iterator);
+ Segment::iterator addChildren(Segment *, Segment::iterator, timeT, EventTreeNode *);
+ void dumpSubtree(EventTreeNode *, int);
+ void dumpForest(std::vector<EventTreeNode *> *);
+ void buildForest(Segment *, Segment::iterator, Segment::iterator);
+
+ void drawNode(QPainter &, DefaultVelocityColour &, EventTreeNode *,
+ double height, double yorigin);
+
+ // needs to be class with dtor &c and containing above methods
+ EventTreeNode::NodeList m_forest;
+};
+
+
+}
+
+#endif
diff --git a/src/gui/rulers/StandardRuler.cpp b/src/gui/rulers/StandardRuler.cpp
new file mode 100644
index 0000000..611c991
--- /dev/null
+++ b/src/gui/rulers/StandardRuler.cpp
@@ -0,0 +1,172 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "StandardRuler.h"
+
+#include <klocale.h>
+#include "misc/Debug.h"
+#include "MarkerRuler.h"
+#include "base/RulerScale.h"
+#include "document/RosegardenGUIDoc.h"
+#include "document/MultiViewCommandHistory.h"
+#include "gui/application/RosegardenGUIApp.h"
+#include "gui/general/GUIPalette.h"
+#include "gui/rulers/LoopRuler.h"
+#include "document/RosegardenGUIDoc.h"
+#include <qobject.h>
+#include <qtooltip.h>
+#include <qvbox.h>
+#include <qwidget.h>
+
+
+namespace Rosegarden
+{
+
+StandardRuler::StandardRuler(RosegardenGUIDoc *doc,
+ RulerScale *rulerScale,
+ double xorigin,
+ int barHeight,
+ bool invert,
+ QWidget* parent,
+ const char* name,
+ WFlags f):
+ QVBox(parent, name, f),
+ m_invert(invert),
+ m_loopRulerHeight(10),
+ m_currentXOffset(0),
+ m_doc(doc),
+ m_rulerScale(rulerScale),
+ m_hButtonBar(0)
+{
+ setSpacing(0);
+
+ if (!m_invert) {
+ m_hButtonBar = new MarkerRuler
+ (m_doc, m_rulerScale, barHeight - m_loopRulerHeight, xorigin, this);
+ }
+
+ m_loopRuler = new LoopRuler
+ (m_doc, m_rulerScale, m_loopRulerHeight, xorigin, m_invert, this, name);
+
+ if (m_invert) {
+ m_hButtonBar = new MarkerRuler
+ (m_doc, m_rulerScale, barHeight - m_loopRulerHeight, xorigin, this);
+ }
+
+ QObject::connect
+ (doc->getCommandHistory(), SIGNAL(commandExecuted()),
+ this, SLOT(update()));
+
+}
+
+void StandardRuler::setSnapGrid(SnapGrid *grid)
+{
+ m_loopRuler->setSnapGrid(grid);
+}
+
+void StandardRuler::connectRulerToDocPointer(RosegardenGUIDoc *doc)
+{
+
+ RG_DEBUG << "StandardRuler::connectRulerToDocPointer" << endl;
+
+ // use the document as a hub for pointer and loop set related signals
+ // pointer and loop drag signals are specific to the current view,
+ // so they are re-emitted from the loop ruler by this widget
+ //
+ QObject::connect
+ (m_loopRuler, SIGNAL(setPointerPosition(timeT)),
+ doc, SLOT(slotSetPointerPosition(timeT)));
+
+ QObject::connect
+ (m_hButtonBar, SIGNAL(setPointerPosition(timeT)),
+ doc, SLOT(slotSetPointerPosition(timeT)));
+
+ QObject::connect
+ (m_hButtonBar, SIGNAL(editMarkers()),
+ RosegardenGUIApp::self(), SLOT(slotEditMarkers()));
+
+ QObject::connect
+ (m_hButtonBar, SIGNAL(addMarker(timeT)),
+ RosegardenGUIApp::self(), SLOT(slotAddMarker(timeT)));
+
+ QObject::connect
+ (m_hButtonBar, SIGNAL(deleteMarker(int, timeT, QString, QString)),
+ RosegardenGUIApp::self(), SLOT(slotDeleteMarker(int, timeT, QString, QString)));
+
+ QObject::connect
+ (m_loopRuler, SIGNAL(dragPointerToPosition(timeT)),
+ this, SIGNAL(dragPointerToPosition(timeT)));
+
+ QObject::connect
+ (m_loopRuler, SIGNAL(dragLoopToPosition(timeT)),
+ this, SIGNAL(dragLoopToPosition(timeT)));
+
+ QObject::connect
+ (m_loopRuler, SIGNAL(setPlayPosition(timeT)),
+ RosegardenGUIApp::self(), SLOT(slotSetPlayPosition(timeT)));
+
+ QObject::connect
+ (m_hButtonBar, SIGNAL(setLoop(timeT, timeT)),
+ doc, SLOT(slotSetLoop(timeT, timeT)));
+
+ QObject::connect
+ (m_loopRuler, SIGNAL(setLoop(timeT, timeT)),
+ doc, SLOT(slotSetLoop(timeT, timeT)));
+
+ QObject::connect
+ (doc, SIGNAL(loopChanged(timeT, timeT)),
+ m_loopRuler,
+ SLOT(slotSetLoopMarker(timeT, timeT)));
+
+ m_loopRuler->setBackgroundColor(GUIPalette::getColour(GUIPalette::PointerRuler));
+}
+
+void StandardRuler::slotScrollHoriz(int x)
+{
+ m_loopRuler->scrollHoriz(x);
+ m_hButtonBar->scrollHoriz(x);
+}
+
+void StandardRuler::setMinimumWidth(int width)
+{
+ m_hButtonBar->setMinimumWidth(width);
+ m_loopRuler->setMinimumWidth(width);
+}
+
+void StandardRuler::setHScaleFactor(double dy)
+{
+ m_hButtonBar->setHScaleFactor(dy);
+ m_loopRuler->setHScaleFactor(dy);
+}
+
+void StandardRuler::paintEvent(QPaintEvent *e)
+{
+ m_hButtonBar->update();
+ m_loopRuler->update();
+ QWidget::paintEvent(e);
+}
+
+}
+#include "StandardRuler.moc"
diff --git a/src/gui/rulers/StandardRuler.h b/src/gui/rulers/StandardRuler.h
new file mode 100644
index 0000000..de9804d
--- /dev/null
+++ b/src/gui/rulers/StandardRuler.h
@@ -0,0 +1,108 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_STANDARDRULER_H_
+#define _RG_STANDARDRULER_H_
+
+#include <qvbox.h>
+#include "base/Event.h"
+
+
+class QWidget;
+class QPaintEvent;
+
+
+namespace Rosegarden
+{
+
+class RulerScale;
+class RosegardenGUIDoc;
+class LoopRuler;
+class MarkerRuler;
+class SnapGrid;
+
+
+class StandardRuler : public QVBox
+{
+ Q_OBJECT
+
+public:
+ StandardRuler(RosegardenGUIDoc *doc,
+ RulerScale *rulerScale,
+ double xorigin,
+ int buttonHeight,
+ bool invert = false, // draw upside-down
+ QWidget* parent = 0,
+ const char* name = 0,
+ WFlags f=0);
+
+ void setSnapGrid(SnapGrid *grid);
+
+ LoopRuler* getLoopRuler() { return m_loopRuler; }
+
+ /**
+ * Make connections from the LoopRuler to the document's
+ * position pointer -- the standard use for a LoopRuler.
+ * If you don't call this, you'll have to connect the
+ * LoopRuler's signals up to something yourself.
+ */
+ void connectRulerToDocPointer(RosegardenGUIDoc *doc);
+
+ void setMinimumWidth(int width);
+
+ void setHScaleFactor(double dy);
+
+public slots:
+ void slotScrollHoriz(int x);
+
+signals:
+ /// reflected from the loop ruler
+ void dragPointerToPosition(timeT);
+
+ /// reflected from the loop ruler
+ void dragLoopToPosition(timeT);
+
+
+protected:
+ virtual void paintEvent(QPaintEvent *);
+
+private:
+ //--------------- Data members ---------------------------------
+ bool m_invert;
+ int m_loopRulerHeight;
+ int m_currentXOffset;
+
+ RosegardenGUIDoc *m_doc;
+ RulerScale *m_rulerScale;
+
+ MarkerRuler *m_hButtonBar;
+ LoopRuler *m_loopRuler;
+};
+
+
+
+}
+
+#endif
diff --git a/src/gui/rulers/TempoColour.cpp b/src/gui/rulers/TempoColour.cpp
new file mode 100644
index 0000000..5ab396a
--- /dev/null
+++ b/src/gui/rulers/TempoColour.cpp
@@ -0,0 +1,55 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "TempoColour.h"
+
+#include "gui/general/GUIPalette.h"
+#include <qcolor.h>
+
+
+namespace Rosegarden
+{
+
+QColor
+TempoColour::getColour(double tempo)
+{
+ int h, s, v;
+ QColor c = GUIPalette::getColour(GUIPalette::TempoBase);
+ c.hsv(&h, &s, &v);
+ v += 20;
+ if (v > 255)
+ v = 255;
+
+ h = (90 + int(tempo));
+
+ while (h < 0)
+ h += 360;
+ while (h >= 360)
+ h -= 360;
+
+ return QColor(h, s, v, QColor::Hsv);
+}
+
+}
diff --git a/src/gui/rulers/TempoColour.h b/src/gui/rulers/TempoColour.h
new file mode 100644
index 0000000..be5e3fa
--- /dev/null
+++ b/src/gui/rulers/TempoColour.h
@@ -0,0 +1,60 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_TEMPOCOLOUR_H_
+#define _RG_TEMPOCOLOUR_H_
+
+#include <qcolor.h>
+
+
+
+
+namespace Rosegarden
+{
+
+
+
+class TempoColour
+{
+
+public:
+ TempoColour():m_tempo(0) {;}
+ TempoColour(double tempo):m_tempo(tempo) {;}
+
+ // Get the colour for a tempo
+ //
+ QColor getColour() { return getColour(m_tempo); }
+ static QColor getColour(double tempo);
+
+private:
+
+ double m_tempo;
+
+};
+
+
+}
+
+#endif
diff --git a/src/gui/rulers/TempoRuler.cpp b/src/gui/rulers/TempoRuler.cpp
new file mode 100644
index 0000000..270b224
--- /dev/null
+++ b/src/gui/rulers/TempoRuler.cpp
@@ -0,0 +1,1091 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "TempoRuler.h"
+
+#include <klocale.h>
+#include <kstddirs.h>
+#include "misc/Debug.h"
+#include "base/Composition.h"
+#include "base/NotationTypes.h"
+#include "base/RealTime.h"
+#include "base/RulerScale.h"
+#include "base/SnapGrid.h"
+#include "document/RosegardenGUIDoc.h"
+#include "document/MultiViewCommandHistory.h"
+#include "gui/application/RosegardenGUIApp.h"
+#include "gui/dialogs/TempoDialog.h"
+#include "gui/general/GUIPalette.h"
+#include "gui/widgets/TextFloat.h"
+#include "TempoColour.h"
+#include <kaction.h>
+#include <kglobal.h>
+#include <kxmlguiclient.h>
+#include <kxmlguifactory.h>
+#include <qcolor.h>
+#include <qcursor.h>
+#include <qevent.h>
+#include <qfont.h>
+#include <qfontmetrics.h>
+#include <qiconset.h>
+#include <qobject.h>
+#include <qpainter.h>
+#include <qpixmap.h>
+#include <qpoint.h>
+#include <qpopupmenu.h>
+#include <qrect.h>
+#include <qsize.h>
+#include <qstring.h>
+#include <qwidget.h>
+
+
+namespace Rosegarden
+{
+
+TempoRuler::TempoRuler(RulerScale *rulerScale,
+ RosegardenGUIDoc *doc,
+ KMainWindow *parentMainWindow,
+ double xorigin,
+ int height,
+ bool small,
+ QWidget *parent,
+ const char *name) :
+ QWidget(parent, name),
+ m_xorigin(xorigin),
+ m_height(height),
+ m_currentXOffset(0),
+ m_width( -1),
+ m_small(small),
+ m_illuminate( -1),
+ m_illuminatePoint(false),
+ m_illuminateTarget(false),
+ m_refreshLinesOnly(false),
+ m_dragVert(false),
+ m_dragTarget(false),
+ m_dragHoriz(false),
+ m_dragStartY(0),
+ m_dragStartX(0),
+ m_dragFine(false),
+ m_clickX(0),
+ m_dragStartTempo( -1),
+ m_dragStartTarget( -1),
+ m_dragOriginalTempo( -1),
+ m_dragOriginalTarget( -1),
+ m_composition(&doc->getComposition()),
+ m_rulerScale(rulerScale),
+ m_menu(0),
+ m_parentMainWindow(parentMainWindow),
+ m_fontMetrics(m_boldFont)
+{
+ // m_font.setPointSize(m_small ? 9 : 11);
+ // m_boldFont.setPointSize(m_small ? 9 : 11);
+
+ // m_font.setPixelSize(m_height * 2 / 3);
+ // m_boldFont.setPixelSize(m_height * 2 / 3);
+
+ m_font.setPixelSize(m_height / 3);
+ m_boldFont.setPixelSize(m_height * 2 / 5);
+ m_boldFont.setBold(true);
+ m_fontMetrics = QFontMetrics(m_boldFont);
+
+ m_textFloat = new TextFloat(this);
+ m_textFloat->hide();
+
+ // setBackgroundColor(GUIPalette::getColour(GUIPalette::TextRulerBackground));
+ setBackgroundMode(Qt::NoBackground);
+
+ QObject::connect
+ (doc->getCommandHistory(), SIGNAL(commandExecuted()),
+ this, SLOT(update()));
+
+ QString pixmapDir = KGlobal::dirs()->findResource("appdata", "pixmaps/");
+ QIconSet icon;
+
+ icon = QIconSet(QPixmap(pixmapDir + "/toolbar/event-insert-tempo.png"));
+ new KAction(i18n("Insert Tempo Change"), icon, 0, this,
+ SLOT(slotInsertTempoHere()), actionCollection(),
+ "insert_tempo_here");
+
+ new KAction(i18n("Insert Tempo Change at Playback Position"), 0, 0, this,
+ SLOT(slotInsertTempoAtPointer()), actionCollection(),
+ "insert_tempo_at_pointer");
+
+ icon = QIconSet(QPixmap(pixmapDir + "/toolbar/event-delete.png"));
+ new KAction(i18n("Delete Tempo Change"), icon, 0, this,
+ SLOT(slotDeleteTempoChange()), actionCollection(),
+ "delete_tempo");
+
+ new KAction(i18n("Ramp Tempo to Next Tempo"), 0, 0, this,
+ SLOT(slotRampToNext()), actionCollection(),
+ "ramp_to_next");
+
+ new KAction(i18n("Un-Ramp Tempo"), 0, 0, this,
+ SLOT(slotUnramp()), actionCollection(),
+ "unramp");
+
+ icon = QIconSet(QPixmap(pixmapDir + "/toolbar/event-edit.png"));
+ new KAction(i18n("Edit Tempo..."), icon, 0, this,
+ SLOT(slotEditTempo()), actionCollection(),
+ "edit_tempo");
+
+ new KAction(i18n("Edit Time Signature..."), 0, 0, this,
+ SLOT(slotEditTimeSignature()), actionCollection(),
+ "edit_time_signature");
+
+ new KAction(i18n("Open Tempo and Time Signature Editor"), 0, 0, this,
+ SLOT(slotEditTempos()), actionCollection(),
+ "edit_tempos");
+
+ setMouseTracking(false);
+}
+
+TempoRuler::~TempoRuler()
+{
+ // we have to do this so that the menu is re-created properly
+ // when the main window is itself recreated (on a File->New for instance)
+ KXMLGUIFactory* factory = m_parentMainWindow->factory();
+ if (factory)
+ factory->removeClient(this);
+}
+
+void
+TempoRuler::connectSignals()
+{
+ connect(this,
+ SIGNAL(doubleClicked(timeT)),
+ RosegardenGUIApp::self(),
+ SLOT(slotEditTempos(timeT)));
+
+ connect(this,
+ SIGNAL(changeTempo(timeT,
+ tempoT,
+ tempoT,
+ TempoDialog::TempoDialogAction)),
+ RosegardenGUIApp::self(),
+ SLOT(slotChangeTempo(timeT,
+ tempoT,
+ tempoT,
+ TempoDialog::TempoDialogAction)));
+
+ connect(this,
+ SIGNAL(moveTempo(timeT,
+ timeT)),
+ RosegardenGUIApp::self(),
+ SLOT(slotMoveTempo(timeT,
+ timeT)));
+
+ connect(this,
+ SIGNAL(deleteTempo(timeT)),
+ RosegardenGUIApp::self(),
+ SLOT(slotDeleteTempo(timeT)));
+
+ connect(this,
+ SIGNAL(editTempo(timeT)),
+ RosegardenGUIApp::self(),
+ SLOT(slotEditTempo(timeT)));
+
+ connect(this,
+ SIGNAL(editTimeSignature(timeT)),
+ RosegardenGUIApp::self(),
+ SLOT(slotEditTimeSignature(timeT)));
+
+ connect(this,
+ SIGNAL(editTempos(timeT)),
+ RosegardenGUIApp::self(),
+ SLOT(slotEditTempos(timeT)));
+}
+
+void
+TempoRuler::slotScrollHoriz(int x)
+{
+ int w = width(), h = height();
+ int dx = x - ( -m_currentXOffset);
+ m_currentXOffset = -x;
+
+ if (dx > w*3 / 4 || dx < -w*3 / 4) {
+ update();
+ return ;
+ }
+
+ if (dx > 0) { // moving right, so the existing stuff moves left
+ bitBlt(this, 0, 0, this, dx, 0, w - dx, h);
+ repaint(w - dx, 0, dx, h);
+ } else { // moving left, so the existing stuff moves right
+ bitBlt(this, -dx, 0, this, 0, 0, w + dx, h);
+ repaint(0, 0, -dx, h);
+ }
+}
+
+void
+TempoRuler::mousePressEvent(QMouseEvent *e)
+{
+ if (e->button() == LeftButton) {
+
+ if (e->type() == QEvent::MouseButtonDblClick) {
+ timeT t = m_rulerScale->getTimeForX
+ (e->x() - m_currentXOffset - m_xorigin);
+ emit doubleClicked(t);
+ return ;
+ }
+
+ int x = e->x() + 1;
+ int y = e->y();
+ timeT t = m_rulerScale->getTimeForX(x - m_currentXOffset - m_xorigin);
+ int tcn = m_composition->getTempoChangeNumberAt(t);
+
+ if (tcn < 0 || tcn >= m_composition->getTempoChangeCount())
+ return ;
+
+ std::pair<timeT, tempoT> tc = m_composition->getTempoChange(tcn);
+ std::pair<bool, tempoT> tr = m_composition->getTempoRamping(tcn, true);
+
+ m_dragStartY = y;
+ m_dragStartX = x;
+ m_dragStartTime = tc.first;
+ m_dragPreviousTime = m_dragStartTime;
+ m_dragStartTempo = tc.second;
+ m_dragStartTarget = tr.first ? tr.second : -1;
+ m_dragOriginalTempo = m_dragStartTempo;
+ m_dragOriginalTarget = m_dragStartTarget;
+ m_dragFine = ((e->state() & Qt::ShiftButton) != 0);
+
+ int px = m_rulerScale->getXForTime(tc.first) + m_currentXOffset + m_xorigin;
+ if (x >= px && x < px + 5) {
+ m_dragHoriz = true;
+ m_dragVert = false;
+ setCursor(Qt::SplitHCursor);
+ } else {
+ timeT nt = m_composition->getEndMarker();
+ if (tcn < m_composition->getTempoChangeCount() - 1) {
+ nt = m_composition->getTempoChange(tcn + 1).first;
+ }
+ int nx = m_rulerScale->getXForTime(nt) + m_currentXOffset + m_xorigin;
+ if (x > px + 5 && x > nx - 5) {
+ m_dragTarget = true;
+ setCursor(Qt::SizeVerCursor);
+ } else {
+ m_dragTarget = false;
+ setCursor(Qt::SplitVCursor);
+ }
+ m_dragVert = true;
+ m_dragHoriz = false;
+ }
+
+ } else if (e->button() == RightButton) {
+
+ m_clickX = e->x();
+ if (!m_menu)
+ createMenu();
+ if (m_menu) {
+ // enable 'delete' action only if cursor is actually over a tempo change
+ actionCollection()->action("delete_tempo")->setEnabled(m_illuminatePoint);
+ m_menu->exec(QCursor::pos());
+ }
+
+ }
+}
+
+void
+TempoRuler::mouseReleaseEvent(QMouseEvent *e)
+{
+ if (m_dragVert) {
+
+ m_dragVert = false;
+ unsetCursor();
+
+ if (e->x() < 0 || e->x() >= width() ||
+ e->y() < 0 || e->y() >= height()) {
+ leaveEvent(0);
+ }
+
+ // First we make a note of the values that we just set and
+ // restore the tempo to whatever it was previously, so that
+ // the undo for any following command will work correctly.
+ // Then we emit so that our user can issue the right command.
+
+ int tcn = m_composition->getTempoChangeNumberAt(m_dragStartTime);
+ std::pair<timeT, tempoT> tc = m_composition->getTempoChange(tcn);
+ std::pair<bool, tempoT> tr = m_composition->getTempoRamping(tcn, true);
+
+ if (tc.second != m_dragOriginalTempo) {
+ m_composition->addTempoAtTime(m_dragStartTime,
+ m_dragOriginalTempo,
+ m_dragOriginalTarget);
+ emit changeTempo(m_dragStartTime, tc.second,
+ tr.first ? tr.second : -1,
+ TempoDialog::AddTempo);
+ }
+
+ return ;
+
+ } else if (m_dragHoriz) {
+
+ m_dragHoriz = false;
+ unsetCursor();
+
+ if (e->x() < 0 || e->x() >= width() ||
+ e->y() < 0 || e->y() >= height()) {
+ leaveEvent(0);
+ }
+
+ if (m_dragPreviousTime != m_dragStartTime) {
+
+ // As above, restore the original tempo and then emit a
+ // signal to ensure a proper command happens.
+
+ int tcn = m_composition->getTempoChangeNumberAt(m_dragPreviousTime);
+ m_composition->removeTempoChange(tcn);
+ m_composition->addTempoAtTime(m_dragStartTime,
+ m_dragStartTempo,
+ m_dragStartTarget);
+
+ emit moveTempo(m_dragStartTime, m_dragPreviousTime);
+ }
+
+ return ;
+ }
+}
+
+void
+TempoRuler::mouseMoveEvent(QMouseEvent *e)
+{
+ bool shiftPressed = ((e->state() & Qt::ShiftButton) != 0);
+
+ if (m_dragVert) {
+
+ if (shiftPressed != m_dragFine) {
+
+ m_dragFine = shiftPressed;
+ m_dragStartY = e->y();
+
+ // reset the start tempi to whatever we last updated them
+ // to as we switch into or out of fine mode
+ int tcn = m_composition->getTempoChangeNumberAt(m_dragStartTime);
+ std::pair<timeT, tempoT> tc = m_composition->getTempoChange(tcn);
+ std::pair<bool, tempoT> tr = m_composition->getTempoRamping(tcn, true);
+ m_dragStartTempo = tc.second;
+ m_dragStartTarget = tr.first ? tr.second : -1;
+ }
+
+ int diff = m_dragStartY - e->y(); // +ve for upwards drag
+ tempoT newTempo = m_dragStartTempo;
+ tempoT newTarget = m_dragStartTarget;
+
+ if (diff != 0) {
+
+ float qpm = m_composition->getTempoQpm(newTempo);
+
+ if (m_dragTarget && newTarget > 0) {
+ qpm = m_composition->getTempoQpm(newTarget);
+ }
+
+ float qdiff = (m_dragFine ? diff * 0.05 : diff * 0.5);
+ qpm += qdiff;
+ if (qpm < 1)
+ qpm = 1;
+
+ if (m_dragTarget) {
+
+ newTarget = m_composition->getTempoForQpm(qpm);
+
+ } else {
+
+ newTempo = m_composition->getTempoForQpm(qpm);
+
+ if (newTarget >= 0) {
+ qpm = m_composition->getTempoQpm(newTarget);
+ qpm += qdiff;
+ if (qpm < 1)
+ qpm = 1;
+ newTarget = m_composition->getTempoForQpm(qpm);
+ }
+ }
+ }
+
+ showTextFloat(newTempo, newTarget, m_dragStartTime);
+ m_composition->addTempoAtTime(m_dragStartTime, newTempo, newTarget);
+ update();
+
+ } else if (m_dragHoriz) {
+
+ int x = e->x();
+
+ SnapGrid grid(m_rulerScale);
+ if (shiftPressed) {
+ grid.setSnapTime(SnapGrid::NoSnap);
+ } else {
+ grid.setSnapTime(SnapGrid::SnapToUnit);
+ }
+ timeT newTime = grid.snapX(x - m_currentXOffset - m_xorigin,
+ SnapGrid::SnapEither);
+
+ int tcn = m_composition->getTempoChangeNumberAt(m_dragPreviousTime);
+ int ncn = m_composition->getTempoChangeNumberAt(newTime);
+ if (ncn > tcn || ncn < tcn - 1)
+ return ;
+ if (ncn >= 0 && ncn == tcn - 1) {
+ std::pair<timeT, tempoT> nc = m_composition->getTempoChange(ncn);
+ if (nc.first == newTime)
+ return ;
+ }
+
+ // std::cerr << " -> " << newTime << std::endl;
+
+ m_composition->removeTempoChange(tcn);
+ m_composition->addTempoAtTime(newTime,
+ m_dragStartTempo,
+ m_dragStartTarget);
+ showTextFloat(m_dragStartTempo, m_dragStartTarget, newTime, true);
+ m_dragPreviousTime = newTime;
+ update();
+
+ } else {
+
+ int x = e->x() + 1;
+ timeT t = m_rulerScale->getTimeForX(x - m_currentXOffset - m_xorigin);
+ int tcn = m_composition->getTempoChangeNumberAt(t);
+
+ if (tcn < 0 || tcn >= m_composition->getTempoChangeCount())
+ return ;
+
+ std::pair<timeT, tempoT> tc = m_composition->getTempoChange(tcn);
+ std::pair<bool, tempoT> tr = m_composition->getTempoRamping(tcn, true);
+
+ int bar, beat, fraction, remainder;
+ m_composition->getMusicalTimeForAbsoluteTime(tc.first, bar, beat,
+ fraction, remainder);
+ RG_DEBUG << "Tempo change: tempo " << m_composition->getTempoQpm(tc.second) << " at " << bar << ":" << beat << ":" << fraction << ":" << remainder << endl;
+
+ m_illuminate = tcn;
+ m_illuminatePoint = false;
+ m_illuminateTarget = false;
+ //!!! m_refreshLinesOnly = true;
+
+ //!!! merge this test with the one in mousePressEvent as
+ //isCloseToStart or equiv, and likewise for close to end
+
+ int px = m_rulerScale->getXForTime(tc.first) + m_currentXOffset + m_xorigin;
+ if (x >= px && x < px + 5) {
+ m_illuminatePoint = true;
+ } else {
+ timeT nt = m_composition->getEndMarker();
+ if (tcn < m_composition->getTempoChangeCount() - 1) {
+ nt = m_composition->getTempoChange(tcn + 1).first;
+ }
+ int nx = m_rulerScale->getXForTime(nt) + m_currentXOffset + m_xorigin;
+ if (x > px + 5 && x > nx - 5) {
+ m_illuminateTarget = true;
+ }
+
+ // std::cerr << "nt = " << nt << ", nx = " << nx << ", x = " << x << ", m_illuminateTarget = " << m_illuminateTarget << std::endl;
+ }
+
+ showTextFloat(tc.second, tr.first ? tr.second : -1,
+ tc.first, m_illuminatePoint);
+
+ update();
+ }
+}
+
+void
+TempoRuler::wheelEvent(QWheelEvent *e)
+{}
+
+void
+TempoRuler::enterEvent(QEvent *)
+{
+ setMouseTracking(true);
+}
+
+void
+TempoRuler::leaveEvent(QEvent *)
+{
+ if (!m_dragVert && !m_dragHoriz) {
+ setMouseTracking(false);
+ m_illuminate = -1;
+ m_illuminatePoint = false;
+ //!!! m_refreshLinesOnly = true;
+ m_textFloat->hide();
+ update();
+ }
+}
+
+void
+TempoRuler::showTextFloat(tempoT tempo, tempoT target,
+ timeT time, bool showTime)
+{
+ float qpm = m_composition->getTempoQpm(tempo);
+ int qi = int(qpm + 0.0001);
+ int q0 = int(qpm * 10 + 0.0001) % 10;
+ int q00 = int(qpm * 100 + 0.0001) % 10;
+
+ bool haveSet = false;
+
+ QString tempoText, timeText;
+
+ if (time >= 0) {
+
+ if (showTime) {
+ int bar, beat, fraction, remainder;
+ m_composition->getMusicalTimeForAbsoluteTime
+ (time, bar, beat, fraction, remainder);
+ RealTime rt = m_composition->getElapsedRealTime(time);
+
+ // blargh -- duplicated with TempoView::makeTimeString
+ timeText = QString("%1%2%3-%4%5-%6%7-%8%9")
+ .arg(bar / 100)
+ .arg((bar % 100) / 10)
+ .arg(bar % 10)
+ .arg(beat / 10)
+ .arg(beat % 10)
+ .arg(fraction / 10)
+ .arg(fraction % 10)
+ .arg(remainder / 10)
+ .arg(remainder % 10);
+
+ timeText = QString("%1\n%2")
+ .arg(timeText)
+ // .arg(rt.toString().c_str());
+ .arg(rt.toText(true).c_str());
+ }
+
+ TimeSignature sig =
+ m_composition->getTimeSignatureAt(time);
+
+ if (sig.getBeatDuration() !=
+ Note(Note::Crotchet).getDuration()) {
+
+ float bpm =
+ (qpm *
+ Note(Note::Crotchet).getDuration())
+ / sig.getBeatDuration();
+ int bi = int(bpm + 0.0001);
+ int b0 = int(bpm * 10 + 0.0001) % 10;
+ int b00 = int(bpm * 100 + 0.0001) % 10;
+
+ tempoText = i18n("%1.%2%3 (%4.%5%6 bpm)")
+ .arg(qi).arg(q0).arg(q00)
+ .arg(bi).arg(b0).arg(b00);
+ haveSet = true;
+ }
+ }
+
+ if (!haveSet) {
+ tempoText = i18n("%1.%2%3 bpm").arg(qi).arg(q0).arg(q00);
+ }
+
+ if (target > 0 && target != tempo) {
+ float tq = m_composition->getTempoQpm(target);
+ int tqi = int(tq + 0.0001);
+ int tq0 = int(tq * 10 + 0.0001) % 10;
+ int tq00 = int(tq * 100 + 0.0001) % 10;
+ tempoText = i18n("%1 - %2.%3%4").arg(tempoText).arg(tqi).arg(tq0).arg(tq00);
+ }
+
+ if (showTime && time >= 0) {
+ m_textFloat->setText(QString("%1\n%2").arg(timeText).arg(tempoText));
+ } else {
+ m_textFloat->setText(tempoText);
+ }
+
+ QPoint cp = mapFromGlobal(QPoint(QCursor::pos()));
+ // std::cerr << "cp = " << cp.x() << "," << cp.y() << ", tempo = " << qpm << std::endl;
+ QPoint mp = cp + pos();
+
+ QWidget *parent = parentWidget();
+ while (parent->parentWidget() &&
+ !parent->isTopLevel() &&
+ !parent->isDialog()) {
+ mp += parent->pos();
+ parent = parent->parentWidget();
+ }
+
+ int yoff = cp.y() + m_textFloat->height() + 3;
+ mp = QPoint(mp.x() + 10, mp.y() > yoff ? mp.y() - yoff : 0);
+
+ m_textFloat->move(mp);
+ m_textFloat->show();
+}
+
+QSize
+TempoRuler::sizeHint() const
+{
+ double width =
+ m_rulerScale->getBarPosition(m_rulerScale->getLastVisibleBar()) +
+ m_rulerScale->getBarWidth(m_rulerScale->getLastVisibleBar()) +
+ m_xorigin;
+
+ QSize res(std::max(int(width), m_width), m_height);
+
+ return res;
+}
+
+QSize
+TempoRuler::minimumSizeHint() const
+{
+ double firstBarWidth = m_rulerScale->getBarWidth(0) + m_xorigin;
+ QSize res = QSize(int(firstBarWidth), m_height);
+ return res;
+}
+
+int
+TempoRuler::getYForTempo(tempoT tempo)
+{
+ int drawh = height() - 4;
+ int y = drawh / 2;
+
+ tempoT minTempo = m_composition->getMinTempo();
+ tempoT maxTempo = m_composition->getMaxTempo();
+
+ if (maxTempo > minTempo) {
+ y = drawh -
+ int((double(tempo - minTempo) / double(maxTempo - minTempo))
+ * drawh + 0.5);
+ }
+
+ return y;
+}
+
+tempoT
+TempoRuler::getTempoForY(int y)
+{
+ int drawh = height() - 4;
+
+ tempoT minTempo = m_composition->getMinTempo();
+ tempoT maxTempo = m_composition->getMaxTempo();
+
+ tempoT tempo = minTempo;
+
+ if (maxTempo > minTempo) {
+ tempo = (maxTempo - minTempo) *
+ (double(drawh - y) / double(drawh)) + minTempo + 0.5;
+ }
+
+ return tempo;
+}
+
+void
+TempoRuler::paintEvent(QPaintEvent* e)
+{
+ QRect clipRect = e->rect();
+
+ if (m_buffer.width() < width() || m_buffer.height() < height()) {
+ m_buffer = QPixmap(width(), height());
+ }
+
+ m_buffer.fill(GUIPalette::getColour
+ (GUIPalette::TextRulerBackground));
+
+ QPainter paint(&m_buffer);
+ paint.setPen(GUIPalette::getColour
+ (GUIPalette::TextRulerForeground));
+
+ paint.setClipRegion(e->region());
+ paint.setClipRect(clipRect);
+
+ if (m_xorigin > 0) {
+ paint.fillRect(0, 0, m_xorigin, height(), paletteBackgroundColor());
+ }
+
+ timeT from = m_rulerScale->getTimeForX
+ (clipRect.x() - m_currentXOffset - 100 - m_xorigin);
+ timeT to = m_rulerScale->getTimeForX
+ (clipRect.x() + clipRect.width() - m_currentXOffset + 100 - m_xorigin);
+
+ QRect boundsForHeight = m_fontMetrics.boundingRect("019");
+ int fontHeight = boundsForHeight.height();
+ int textY = fontHeight + 2;
+
+ double prevEndX = -1000.0;
+ double prevTempo = 0.0;
+ long prevBpm = 0;
+
+ typedef std::map<timeT, int> TimePoints;
+ int tempoChangeHere = 1;
+ int timeSigChangeHere = 2;
+ TimePoints timePoints;
+
+ for (int tempoNo = m_composition->getTempoChangeNumberAt(from);
+ tempoNo <= m_composition->getTempoChangeNumberAt(to) + 1; ++tempoNo) {
+
+ if (tempoNo >= 0 && tempoNo < m_composition->getTempoChangeCount()) {
+ timePoints.insert
+ (TimePoints::value_type
+ (m_composition->getTempoChange(tempoNo).first,
+ tempoChangeHere));
+ }
+ }
+
+ for (int sigNo = m_composition->getTimeSignatureNumberAt(from);
+ sigNo <= m_composition->getTimeSignatureNumberAt(to) + 1; ++sigNo) {
+
+ if (sigNo >= 0 && sigNo < m_composition->getTimeSignatureCount()) {
+ timeT time(m_composition->getTimeSignatureChange(sigNo).first);
+ if (timePoints.find(time) != timePoints.end()) {
+ timePoints[time] |= timeSigChangeHere;
+ } else {
+ timePoints.insert(TimePoints::value_type(time, timeSigChangeHere));
+ }
+ }
+ }
+
+ int lastx = 0, lasty = 0, lastx1 = 0;
+ bool haveSome = false;
+ // tempoT minTempo = m_composition->getMinTempo();
+ // tempoT maxTempo = m_composition->getMaxTempo();
+ bool illuminate = false;
+
+ if (m_illuminate >= 0) {
+ int tcn = m_composition->getTempoChangeNumberAt(from);
+ illuminate = (m_illuminate == tcn);
+ }
+
+ for (TimePoints::iterator i = timePoints.begin(); ; ++i) {
+
+ timeT t0, t1;
+
+ if (i == timePoints.begin()) {
+ t0 = from;
+ } else {
+ TimePoints::iterator j(i);
+ --j;
+ t0 = j->first;
+ }
+
+ if (i == timePoints.end()) {
+ t1 = to;
+ } else {
+ t1 = i->first;
+ }
+
+ if (t1 <= t0)
+ t1 = to;
+
+ int tcn = m_composition->getTempoChangeNumberAt(t0);
+ tempoT tempo = m_composition->getTempoAtTime(t0);
+
+ std::pair<bool, tempoT> ramping(false, tempo);
+ if (tcn > 0 && tcn < m_composition->getTempoChangeCount() + 1) {
+ ramping = m_composition->getTempoRamping(tcn - 1, true);
+ }
+
+ double x0, x1;
+ x0 = m_rulerScale->getXForTime(t0) + m_currentXOffset + m_xorigin;
+ x1 = m_rulerScale->getXForTime(t1) + m_currentXOffset + m_xorigin;
+ /*!!!
+ if (x0 > e->rect().x()) {
+ paint.fillRect(e->rect().x(), 0, x0 - e->rect().x(), height(),
+ paletteBackgroundColor());
+ }
+ */
+ QColor colour = TempoColour::getColour(m_composition->getTempoQpm(tempo));
+ paint.setPen(colour);
+ paint.setBrush(colour);
+
+ if (!m_refreshLinesOnly) {
+ // RG_DEBUG << "TempoRuler: draw rect from " << x0 << " to " << x1 << endl;
+ paint.drawRect(int(x0), 0, int(x1 - x0) + 1, height());
+ }
+
+ int y = getYForTempo(tempo);
+ /*!!!
+ int drawh = height() - 4;
+ int y = drawh / 2;
+ if (maxTempo > minTempo) {
+ y = drawh -
+ int((double(tempo - minTempo) / double(maxTempo - minTempo))
+ * drawh + 0.5);
+ }
+ */
+ y += 2;
+
+ if (haveSome) {
+
+ int x = int(x0) + 1;
+ int ry = lasty;
+
+ bool illuminateLine = (illuminate &&
+ !m_illuminatePoint && !m_illuminateTarget);
+
+ paint.setPen(illuminateLine ? Qt::white : Qt::black);
+
+ if (ramping.first) {
+ ry = getYForTempo(ramping.second);
+ ry += 2;
+ /*!!!
+ ry = drawh -
+ int((double(ramping.second - minTempo) /
+ double(maxTempo - minTempo))
+ * drawh + 0.5);
+ */
+ }
+
+ paint.drawLine(lastx + 1, lasty, x - 2, ry);
+
+ if (!illuminateLine && illuminate && m_illuminateTarget) {
+ if (x > lastx) {
+ paint.setPen(Qt::white);
+ paint.drawLine(x - 6, ry - ((ry - lasty) * 6) / (x - lastx),
+ x - 2, ry);
+ }
+ }
+
+ if (m_illuminate >= 0) {
+ illuminate = (m_illuminate == tcn);
+ }
+
+ bool illuminatePoint = (illuminate && m_illuminatePoint);
+
+ paint.setPen(illuminatePoint ? Qt::white : Qt::black);
+ paint.drawRect(x - 1, y - 1, 3, 3);
+
+ paint.setPen(illuminatePoint ? Qt::black : Qt::white);
+ paint.drawPoint(x, y);
+ }
+
+ lastx = int(x0) + 1;
+ lastx1 = int(x1) + 1;
+ lasty = y;
+ if (i == timePoints.end())
+ break;
+ haveSome = true;
+ }
+
+ if (lastx1 < e->rect().x() + e->rect().width()) {
+ /*!!!
+ paint.fillRect(lastx1, 0,
+ e->rect().x() + e->rect().width() - lastx1, height(),
+ paletteBackgroundColor());
+ */
+ }
+
+ if (haveSome) {
+ bool illuminateLine = (illuminate && !m_illuminatePoint);
+ paint.setPen(illuminateLine ? Qt::white : Qt::black);
+ paint.drawLine(lastx + 1, lasty, width(), lasty);
+ } else if (!m_refreshLinesOnly) {
+ tempoT tempo = m_composition->getTempoAtTime(from);
+ QColor colour = TempoColour::getColour(m_composition->getTempoQpm(tempo));
+ paint.setPen(colour);
+ paint.setBrush(colour);
+ paint.drawRect(e->rect());
+ }
+
+ paint.setPen(Qt::black);
+ paint.setBrush(Qt::black);
+ paint.drawLine(0, 0, width(), 0);
+
+ for (TimePoints::iterator i = timePoints.begin();
+ i != timePoints.end(); ++i) {
+
+ timeT time = i->first;
+ double x = m_rulerScale->getXForTime(time) + m_currentXOffset
+ + m_xorigin;
+
+ /*
+ paint.drawLine(static_cast<int>(x),
+ height() - (height()/4),
+ static_cast<int>(x),
+ height());
+ */
+
+ if ((i->second & timeSigChangeHere) && !m_refreshLinesOnly) {
+
+ TimeSignature sig =
+ m_composition->getTimeSignatureAt(time);
+
+ QString str = QString("%1/%2")
+ .arg(sig.getNumerator())
+ .arg(sig.getDenominator());
+
+ paint.setFont(m_boldFont);
+ paint.drawText(static_cast<int>(x) + 2, m_height - 2, str);
+ }
+
+ if ((i->second & tempoChangeHere) && !m_refreshLinesOnly) {
+
+ double tempo = m_composition->getTempoQpm(m_composition->getTempoAtTime(time));
+ long bpm = long(tempo);
+ // long frac = long(tempo * 100 + 0.001) - 100 * bpm;
+
+ QString tempoString = QString("%1").arg(bpm);
+
+ if (tempo == prevTempo) {
+ if (m_small)
+ continue;
+ tempoString = "=";
+ } else if (bpm == prevBpm) {
+ tempoString = (tempo > prevTempo ? "+" : "-");
+ } else {
+ if (m_small && (bpm != (bpm / 10 * 10))) {
+ if (bpm == prevBpm + 1)
+ tempoString = "+";
+ else if (bpm == prevBpm - 1)
+ tempoString = "-";
+ }
+ }
+ prevTempo = tempo;
+ prevBpm = bpm;
+
+ QRect bounds = m_fontMetrics.boundingRect(tempoString);
+
+ paint.setFont(m_font);
+ if (time > 0)
+ x -= bounds.width() / 2;
+ // if (x > bounds.width() / 2) x -= bounds.width() / 2;
+ if (prevEndX >= x - 3)
+ x = prevEndX + 3;
+ paint.drawText(static_cast<int>(x), textY, tempoString);
+ prevEndX = x + bounds.width();
+ }
+ }
+
+ paint.end();
+
+ QPainter dbpaint(this);
+ // dbpaint.drawPixmap(0, 0, m_buffer);
+ dbpaint.drawPixmap(clipRect.x(), clipRect.y(),
+ m_buffer,
+ clipRect.x(), clipRect.y(),
+ clipRect.width(), clipRect.height());
+
+ dbpaint.end();
+
+ m_refreshLinesOnly = false;
+}
+
+void
+TempoRuler::slotInsertTempoHere()
+{
+ SnapGrid grid(m_rulerScale);
+ grid.setSnapTime(SnapGrid::SnapToUnit);
+ timeT t = grid.snapX(m_clickX - m_currentXOffset - m_xorigin,
+ SnapGrid::SnapLeft);
+ tempoT tempo = Composition::getTempoForQpm(120.0);
+
+ int tcn = m_composition->getTempoChangeNumberAt(t);
+ if (tcn >= 0 && tcn < m_composition->getTempoChangeCount()) {
+ std::pair<timeT, tempoT> tc = m_composition->getTempoChange(tcn);
+ if (tc.first == t)
+ return ;
+ tempo = tc.second;
+ }
+
+ emit changeTempo(t, tempo, -1, TempoDialog::AddTempo);
+}
+
+void
+TempoRuler::slotInsertTempoAtPointer()
+{
+ timeT t = m_composition->getPosition();
+ tempoT tempo = Composition::getTempoForQpm(120.0);
+
+ int tcn = m_composition->getTempoChangeNumberAt(t);
+ if (tcn >= 0 && tcn < m_composition->getTempoChangeCount()) {
+ std::pair<timeT, tempoT> tc = m_composition->getTempoChange(tcn);
+ if (tc.first == t)
+ return ;
+ tempo = tc.second;
+ }
+
+ emit changeTempo(t, tempo, -1, TempoDialog::AddTempo);
+}
+
+void
+TempoRuler::slotDeleteTempoChange()
+{
+ timeT t = m_rulerScale->getTimeForX(m_clickX - m_currentXOffset - m_xorigin);
+ emit deleteTempo(t);
+}
+
+void
+TempoRuler::slotRampToNext()
+{
+ timeT t = m_rulerScale->getTimeForX(m_clickX - m_currentXOffset - m_xorigin);
+
+ int tcn = m_composition->getTempoChangeNumberAt(t);
+ if (tcn < 0 || tcn >= m_composition->getTempoChangeCount())
+ return ;
+
+ std::pair<timeT, tempoT> tc = m_composition->getTempoChange(tcn);
+
+ emit changeTempo(tc.first, tc.second, 0, TempoDialog::AddTempo);
+}
+
+void
+TempoRuler::slotUnramp()
+{
+ timeT t = m_rulerScale->getTimeForX(m_clickX - m_currentXOffset - m_xorigin);
+
+ int tcn = m_composition->getTempoChangeNumberAt(t);
+ if (tcn < 0 || tcn >= m_composition->getTempoChangeCount())
+ return ;
+
+ std::pair<timeT, tempoT> tc = m_composition->getTempoChange(tcn);
+
+ emit changeTempo(tc.first, tc.second, -1, TempoDialog::AddTempo);
+}
+
+void
+TempoRuler::slotEditTempo()
+{
+ timeT t = m_rulerScale->getTimeForX(m_clickX - m_currentXOffset - m_xorigin);
+ emit editTempo(t);
+}
+
+void
+TempoRuler::slotEditTimeSignature()
+{
+ timeT t = m_rulerScale->getTimeForX(m_clickX - m_currentXOffset - m_xorigin);
+ emit editTimeSignature(t);
+}
+
+void
+TempoRuler::slotEditTempos()
+{
+ timeT t = m_rulerScale->getTimeForX(m_clickX - m_currentXOffset - m_xorigin);
+ emit editTempos(t);
+}
+
+void
+TempoRuler::createMenu()
+{
+ setXMLFile("temporuler.rc");
+
+ KXMLGUIFactory* factory = m_parentMainWindow->factory();
+ factory->addClient(this);
+
+ QWidget* tmp = factory->container("tempo_ruler_menu", this);
+
+ m_menu = dynamic_cast<QPopupMenu*>(tmp);
+
+ if (!m_menu) {
+ RG_DEBUG << "MarkerRuler::createMenu() failed\n";
+ }
+}
+
+
+}
+#include "TempoRuler.moc"
diff --git a/src/gui/rulers/TempoRuler.h b/src/gui/rulers/TempoRuler.h
new file mode 100644
index 0000000..1d54e9d
--- /dev/null
+++ b/src/gui/rulers/TempoRuler.h
@@ -0,0 +1,180 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_TEMPORULER_H_
+#define _RG_TEMPORULER_H_
+
+#include "gui/dialogs/TempoDialog.h"
+#include <kxmlguiclient.h>
+#include <qfont.h>
+#include <qfontmetrics.h>
+#include <qpixmap.h>
+#include <qsize.h>
+#include <qwidget.h>
+#include "base/Event.h"
+
+
+class QWheelEvent;
+class QPopupMenu;
+class QPaintEvent;
+class QMouseEvent;
+class QEvent;
+class KMainWindow;
+
+
+namespace Rosegarden
+{
+
+class TextFloat;
+class RulerScale;
+class RosegardenGUIDoc;
+class Composition;
+
+
+/**
+ * TempoRuler is a widget that shows a strip of tempo values at
+ * x-coordinates corresponding to tempo changes in a Composition.
+ */
+
+class TempoRuler : public QWidget, public KXMLGUIClient
+{
+ Q_OBJECT
+
+public:
+ /**
+ * Construct a TempoRuler that displays and allows editing of the
+ * tempo changes found in the given Composition, with positions
+ * calculated by the given RulerScale.
+ *
+ * The RulerScale will not be destroyed along with the TempoRuler.
+ */
+ TempoRuler(RulerScale *rulerScale,
+ RosegardenGUIDoc *doc,
+ KMainWindow *parentMainWindow,
+ double xorigin = 0.0,
+ int height = 0,
+ bool small = false,
+ QWidget* parent = 0,
+ const char *name = 0);
+
+ ~TempoRuler();
+
+ virtual QSize sizeHint() const;
+ virtual QSize minimumSizeHint() const;
+
+ void setMinimumWidth(int width) { m_width = width; }
+
+ void connectSignals();
+
+signals:
+ void doubleClicked(timeT);
+
+ void changeTempo(timeT, // tempo change time
+ tempoT, // tempo value
+ tempoT, // tempo target
+ TempoDialog::TempoDialogAction); // tempo action
+
+ void moveTempo(timeT, // old time
+ timeT); // new time
+
+ void deleteTempo(timeT);
+
+ void editTempo(timeT);
+ void editTimeSignature(timeT);
+ void editTempos(timeT);
+
+public slots:
+ void slotScrollHoriz(int x);
+
+protected slots:
+ void slotInsertTempoHere();
+ void slotInsertTempoAtPointer();
+ void slotDeleteTempoChange();
+ void slotRampToNext();
+ void slotUnramp();
+ void slotEditTempo();
+ void slotEditTimeSignature();
+ void slotEditTempos();
+
+protected:
+ virtual void paintEvent(QPaintEvent *);
+ virtual void enterEvent(QEvent *);
+ virtual void leaveEvent(QEvent *);
+ virtual void mousePressEvent(QMouseEvent *);
+ virtual void mouseReleaseEvent(QMouseEvent *);
+ virtual void mouseMoveEvent(QMouseEvent *);
+ virtual void wheelEvent(QWheelEvent *);
+
+ void createMenu();
+
+private:
+ double m_xorigin;
+ int m_height;
+ int m_currentXOffset;
+ int m_width;
+ bool m_small;
+ int m_illuminate;
+ bool m_illuminatePoint;
+ bool m_illuminateTarget;
+ bool m_refreshLinesOnly;
+
+ bool m_dragVert;
+ bool m_dragTarget;
+ bool m_dragHoriz;
+ int m_dragStartY;
+ int m_dragStartX;
+ bool m_dragFine;
+ int m_clickX;
+
+ timeT m_dragStartTime;
+ timeT m_dragPreviousTime;
+ tempoT m_dragStartTempo;
+ tempoT m_dragStartTarget;
+ tempoT m_dragOriginalTempo;
+ tempoT m_dragOriginalTarget;
+
+ int getYForTempo(tempoT tempo);
+ tempoT getTempoForY(int y);
+ void showTextFloat(tempoT tempo,
+ tempoT target = -1,
+ timeT time = -1,
+ bool showTime = false);
+
+ Composition *m_composition;
+ RulerScale *m_rulerScale;
+ TextFloat *m_textFloat;
+ QPopupMenu *m_menu;
+ KMainWindow *m_parentMainWindow;
+
+ QFont m_font;
+ QFont m_boldFont;
+ QFontMetrics m_fontMetrics;
+ QPixmap m_buffer;
+};
+
+
+}
+
+#endif
diff --git a/src/gui/rulers/TextRuler.cpp b/src/gui/rulers/TextRuler.cpp
new file mode 100644
index 0000000..0acb3ea
--- /dev/null
+++ b/src/gui/rulers/TextRuler.cpp
@@ -0,0 +1,157 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "TextRuler.h"
+
+#include "base/Event.h"
+#include "misc/Debug.h"
+#include "misc/Strings.h"
+#include "base/NotationTypes.h"
+#include "base/RulerScale.h"
+#include "base/Segment.h"
+#include "gui/general/GUIPalette.h"
+#include <qfont.h>
+#include <qfontmetrics.h>
+#include <qpainter.h>
+#include <qrect.h>
+#include <qsize.h>
+#include <qwidget.h>
+
+
+namespace Rosegarden
+{
+
+TextRuler::TextRuler(RulerScale *rulerScale,
+ Segment *segment,
+ int height,
+ QWidget *parent,
+ const char *name)
+ : QWidget(parent, name),
+ m_height(height),
+ m_currentXOffset(0),
+ m_width( -1),
+ m_segment(segment),
+ m_rulerScale(rulerScale),
+ m_font("helvetica", 12),
+ m_fontMetrics(m_font)
+{
+ m_mySegmentMaybe = (m_segment->getComposition() != 0);
+ setBackgroundColor(GUIPalette::getColour(GUIPalette::TextRulerBackground));
+
+ m_font.setPixelSize(10);
+}
+
+TextRuler::~TextRuler()
+{
+ if (m_mySegmentMaybe && !m_segment->getComposition()) {
+ delete m_segment;
+ }
+}
+
+void
+TextRuler::slotScrollHoriz(int x)
+{
+ int w = width(), h = height();
+ int dx = x - ( -m_currentXOffset);
+ m_currentXOffset = -x;
+
+ if (dx > w*3 / 4 || dx < -w*3 / 4) {
+ update();
+ return ;
+ }
+
+ if (dx > 0) { // moving right, so the existing stuff moves left
+ bitBlt(this, 0, 0, this, dx, 0, w - dx, h);
+ repaint(w - dx, 0, dx, h);
+ } else { // moving left, so the existing stuff moves right
+ bitBlt(this, -dx, 0, this, 0, 0, w + dx, h);
+ repaint(0, 0, -dx, h);
+ }
+}
+
+QSize
+TextRuler::sizeHint() const
+{
+ double width =
+ m_rulerScale->getBarPosition(m_rulerScale->getLastVisibleBar()) +
+ m_rulerScale->getBarWidth(m_rulerScale->getLastVisibleBar());
+
+ QSize res(std::max(int(width), m_width), m_height);
+
+ return res;
+}
+
+QSize
+TextRuler::minimumSizeHint() const
+{
+ double firstBarWidth = m_rulerScale->getBarWidth(0);
+ QSize res = QSize(int(firstBarWidth), m_height);
+ return res;
+}
+
+void
+TextRuler::paintEvent(QPaintEvent* e)
+{
+ QPainter paint(this);
+ paint.setPen(GUIPalette::getColour(GUIPalette::TextRulerForeground));
+
+ paint.setClipRegion(e->region());
+ paint.setClipRect(e->rect().normalize());
+
+ QRect clipRect = paint.clipRegion().boundingRect();
+
+ timeT from = m_rulerScale->getTimeForX
+ (clipRect.x() - m_currentXOffset - 100);
+ timeT to = m_rulerScale->getTimeForX
+ (clipRect.x() + clipRect.width() - m_currentXOffset + 100);
+
+ for (Segment::iterator i = m_segment->findTime(from);
+ i != m_segment->findTime(to) && i != m_segment->end(); ++i) {
+
+ if (!(*i)->isa(Text::EventType))
+ continue;
+
+ std::string text;
+ if (!(*i)->get
+ <String>(Text::TextPropertyName, text)) {
+ RG_DEBUG
+ << "Warning: TextRuler::paintEvent: No text in text event"
+ << endl;
+ continue;
+ }
+
+ QRect bounds = m_fontMetrics.boundingRect(strtoqstr(text));
+
+ double x = m_rulerScale->getXForTime((*i)->getAbsoluteTime()) +
+ m_currentXOffset - bounds.width() / 2;
+
+ int y = height() / 2 + bounds.height() / 2;
+
+ paint.drawText(static_cast<int>(x), y, strtoqstr(text));
+ }
+}
+
+}
+#include "TextRuler.moc"
diff --git a/src/gui/rulers/TextRuler.h b/src/gui/rulers/TextRuler.h
new file mode 100644
index 0000000..7d554cb
--- /dev/null
+++ b/src/gui/rulers/TextRuler.h
@@ -0,0 +1,112 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_TEXTRULER_H_
+#define _RG_TEXTRULER_H_
+
+#include <qfont.h>
+#include <qfontmetrics.h>
+#include <qsize.h>
+#include <qwidget.h>
+
+
+class QPaintEvent;
+
+
+namespace Rosegarden
+{
+
+class Segment;
+class RulerScale;
+
+
+/**
+ * TextRuler is a widget that shows a strip of text strings at
+ * x-coordinates corresponding to specified times. The strings
+ * are obtained from a Segment, in which they are stored as
+ * text events. (The Segment does not have to be part of a
+ * Composition.)
+ *
+ * By design, this is more suitable for the display of single-purpose
+ * read-only data such as calculated chord names or (at a pinch)
+ * lyrics; it's not really suitable for displaying text data
+ * associated with a staff.
+ */
+
+class TextRuler : public QWidget
+{
+ Q_OBJECT
+
+public:
+ /**
+ * Construct a TextRuler that displays the text events found
+ * in the given Segment at positions calculated by the given
+ * RulerScale.
+ *
+ * The Segment will be destroyed along with the TextRuler, if
+ * it was not in a Composition when the TextRuler was created
+ * and still is not when it's destroyed. If the Segment was
+ * found to be in a Composition on either occasion, it will be
+ * assumed to be someone else's responsibility.
+ *
+ * The RulerScale will not be destroyed along with the TextRuler.
+ */
+ TextRuler(RulerScale *rulerScale,
+ Segment *segment,
+ int height = 0,
+ QWidget* parent = 0,
+ const char *name = 0);
+
+ ~TextRuler();
+
+ virtual QSize sizeHint() const;
+ virtual QSize minimumSizeHint() const;
+
+ void setMinimumWidth(int width) { m_width = width; }
+
+public slots:
+ void slotScrollHoriz(int x);
+
+protected:
+ virtual void paintEvent(QPaintEvent *);
+
+private:
+ int m_height;
+ int m_currentXOffset;
+ int m_width;
+
+ bool m_mySegmentMaybe;
+
+ Segment *m_segment;
+ RulerScale *m_rulerScale;
+
+ QFont m_font;
+ QFontMetrics m_fontMetrics;
+};
+
+
+}
+
+#endif
diff --git a/src/gui/rulers/VelocityColour.cpp b/src/gui/rulers/VelocityColour.cpp
new file mode 100644
index 0000000..02a2f90
--- /dev/null
+++ b/src/gui/rulers/VelocityColour.cpp
@@ -0,0 +1,120 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "VelocityColour.h"
+
+#include <qcolor.h>
+
+// #include <cassert>
+
+
+namespace Rosegarden
+{
+
+VelocityColour::VelocityColour(const QColor &loud,
+ const QColor &medium,
+ const QColor &quiet,
+ int maxValue,
+ int loudKnee,
+ int mediumKnee,
+ int quietKnee):
+ m_loudColour(loud),
+ m_mediumColour(medium),
+ m_quietColour(quiet),
+ m_loudKnee(loudKnee),
+ m_mediumKnee(mediumKnee),
+ m_quietKnee(quietKnee),
+ m_maxValue(maxValue),
+ m_mixedColour(QColor(0, 0, 0)), // black as default
+ m_multiplyFactor(1000)
+{
+
+// assert(maxValue > loudKnee);
+// assert(loudKnee > mediumKnee);
+// assert(mediumKnee > quietKnee);
+
+ // These are the colours for the first band from Quiet to Medium.
+ // We use a multiplication factor to keep ourselves in the realms
+ // of integer arithmetic as we can potentially be doing a lot of
+ // these calculations when playing.
+ //
+ //
+ m_loStartRed = m_quietColour.red() * m_multiplyFactor;
+ m_loStartGreen = m_quietColour.green() * m_multiplyFactor;
+ m_loStartBlue = m_quietColour.blue() * m_multiplyFactor;
+
+ m_loStepRed = ( m_mediumColour.red() * m_multiplyFactor
+ - m_loStartRed ) / m_mediumKnee;
+ m_loStepGreen = ( m_mediumColour.green() * m_multiplyFactor
+ - m_loStartGreen ) / m_mediumKnee;
+ m_loStepBlue = ( m_mediumColour.blue() * m_multiplyFactor
+ - m_loStartBlue ) / m_mediumKnee;
+
+ m_hiStartRed = m_mediumColour.red() * m_multiplyFactor;
+ m_hiStartGreen = m_mediumColour.green() * m_multiplyFactor;
+ m_hiStartBlue = m_mediumColour.blue() * m_multiplyFactor;
+
+ m_hiStepRed = ( m_loudColour.red() * m_multiplyFactor
+ - m_hiStartRed ) / m_mediumKnee;
+ m_hiStepGreen = ( m_loudColour.green() * m_multiplyFactor
+ - m_hiStartGreen ) / m_mediumKnee;
+ m_hiStepBlue = ( m_loudColour.blue() * m_multiplyFactor
+ - m_hiStartBlue ) / m_mediumKnee;
+
+}
+
+VelocityColour::~VelocityColour()
+{}
+
+const QColor&
+VelocityColour::getColour(int value)
+{
+ if (value > m_maxValue)
+ value = m_maxValue;
+
+ if (value < m_quietKnee) {
+ return m_quietColour;
+ } else if (value < m_mediumKnee) {
+ m_mixedColour.setRgb(
+ ( m_loStartRed + m_loStepRed * value ) / m_multiplyFactor,
+ ( m_loStartGreen + m_loStepGreen * value ) / m_multiplyFactor,
+ ( m_loStartBlue + m_loStepBlue * value ) / m_multiplyFactor);
+
+ } else if (value >= m_mediumKnee < m_loudKnee) {
+ int mixFactor = value - m_mediumKnee;
+
+ m_mixedColour.setRgb(
+ ( m_hiStartRed + m_hiStepRed * mixFactor ) / m_multiplyFactor,
+ ( m_hiStartGreen + m_hiStepGreen * mixFactor ) / m_multiplyFactor,
+ ( m_hiStartBlue + m_hiStepBlue * mixFactor ) / m_multiplyFactor);
+ } else {
+ return m_loudColour;
+ return m_loudColour;
+ }
+
+ return m_mixedColour;
+}
+
+}
diff --git a/src/gui/rulers/VelocityColour.h b/src/gui/rulers/VelocityColour.h
new file mode 100644
index 0000000..0e555e1
--- /dev/null
+++ b/src/gui/rulers/VelocityColour.h
@@ -0,0 +1,106 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_VELOCITYCOLOUR_H_
+#define _RG_VELOCITYCOLOUR_H_
+
+#include <qcolor.h>
+
+
+
+
+namespace Rosegarden
+{
+
+
+
+/**
+ * Returns a QColour according to a formula. We provide three colours
+ * to mix, a maximum value and three knees at which points the
+ * intermediate colours max out. Play around to your satisfaction.
+ */
+class VelocityColour
+{
+
+public:
+ VelocityColour(const QColor &loud,
+ const QColor &medium,
+ const QColor &quiet,
+ int maxValue,
+ int loudKnee,
+ int mediumKnee,
+ int quietKnee);
+ ~VelocityColour();
+
+ const QColor& getColour(int value);
+
+ int getLoudKnee() const { return m_loudKnee; }
+ int getMediumKnee() const { return m_mediumKnee; }
+ int getQuietKnee() const { return m_quietKnee; }
+
+ QColor getLoudColour() const { return m_loudColour; }
+ QColor getMediumColour() const { return m_mediumColour; }
+ QColor getQuietColour() const { return m_quietColour; }
+
+ int getMaxValue() const { return m_maxValue; }
+
+private:
+
+ QColor m_loudColour;
+ QColor m_mediumColour;
+ QColor m_quietColour;
+ int m_loudKnee;
+ int m_mediumKnee;
+ int m_quietKnee;
+ int m_maxValue;
+
+ // the mixed colour that we can return
+ QColor m_mixedColour;
+
+
+ int m_loStartRed;
+ int m_loStartGreen;
+ int m_loStartBlue;
+
+ int m_loStepRed;
+ int m_loStepGreen;
+ int m_loStepBlue;
+
+ int m_hiStartRed;
+ int m_hiStartGreen;
+ int m_hiStartBlue;
+
+ int m_hiStepRed;
+ int m_hiStepGreen;
+ int m_hiStepBlue;
+
+
+ int m_multiplyFactor;
+};
+
+
+}
+
+#endif
diff --git a/src/gui/rulers/ViewElementAdapter.cpp b/src/gui/rulers/ViewElementAdapter.cpp
new file mode 100644
index 0000000..550ddcf
--- /dev/null
+++ b/src/gui/rulers/ViewElementAdapter.cpp
@@ -0,0 +1,56 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include "ViewElementAdapter.h"
+
+namespace Rosegarden
+{
+
+ViewElementAdapter::ViewElementAdapter(ViewElement* el, const PropertyName& p)
+ : m_viewElement(el),
+ m_propertyName(p)
+{
+}
+
+bool ViewElementAdapter::getValue(long& val)
+{
+ return m_viewElement->event()->get<Rosegarden::Int>(m_propertyName, val);
+}
+
+void ViewElementAdapter::setValue(long val)
+{
+ m_viewElement->event()->set<Rosegarden::Int>(m_propertyName, val);
+}
+
+timeT ViewElementAdapter::getTime()
+{
+ return m_viewElement->getViewAbsoluteTime();
+}
+
+timeT ViewElementAdapter::getDuration()
+{
+ return m_viewElement->getViewDuration();
+}
+
+}
diff --git a/src/gui/rulers/ViewElementAdapter.h b/src/gui/rulers/ViewElementAdapter.h
new file mode 100644
index 0000000..1207522
--- /dev/null
+++ b/src/gui/rulers/ViewElementAdapter.h
@@ -0,0 +1,59 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_VIEWELEMENTADAPTER_H_
+#define _RG_VIEWELEMENTADAPTER_H_
+
+#include "ElementAdapter.h"
+#include "base/ViewElement.h"
+
+namespace Rosegarden
+{
+
+class Event;
+
+class ViewElementAdapter : public ElementAdapter
+{
+public:
+ ViewElementAdapter(ViewElement*, const PropertyName&);
+
+ virtual bool getValue(long&);
+ virtual void setValue(long);
+ virtual timeT getTime();
+ virtual timeT getDuration();
+
+ virtual Event* getEvent() { return m_viewElement->event(); }
+ ViewElement* getViewElement() { return m_viewElement; }
+
+protected:
+
+ //--------------- Data members ---------------------------------
+
+ ViewElement* m_viewElement;
+ const PropertyName& m_propertyName;
+};
+
+}
+
+#endif /*VIEWELEMENTADAPTER_H_*/
diff --git a/src/gui/seqmanager/AudioSegmentMmapper.cpp b/src/gui/seqmanager/AudioSegmentMmapper.cpp
new file mode 100644
index 0000000..8933b39
--- /dev/null
+++ b/src/gui/seqmanager/AudioSegmentMmapper.cpp
@@ -0,0 +1,133 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "AudioSegmentMmapper.h"
+
+#include "base/Event.h"
+#include "base/Composition.h"
+#include "base/RealTime.h"
+#include "base/Segment.h"
+#include "base/TriggerSegment.h"
+#include "document/RosegardenGUIDoc.h"
+#include "SegmentMmapper.h"
+#include "sound/MappedEvent.h"
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+AudioSegmentMmapper::AudioSegmentMmapper(RosegardenGUIDoc* doc, Segment* s,
+ const QString& fileName)
+ : SegmentMmapper(doc, s, fileName)
+{}
+
+void AudioSegmentMmapper::dump()
+{
+ Composition &comp = m_doc->getComposition();
+
+ RealTime eventTime;
+ Track* track = comp.getTrackById(m_segment->getTrack());
+
+ // Can't write out if no track
+ if (!track) {
+ std::cerr << "AudioSegmentMmapper::dump: ERROR: No track for segment!"
+ << std::endl;
+ return ;
+ }
+
+ timeT segmentStartTime = m_segment->getStartTime();
+ timeT segmentEndTime = m_segment->getEndMarkerTime();
+ timeT segmentDuration = segmentEndTime - segmentStartTime;
+ timeT repeatEndTime = segmentEndTime;
+
+ //!!! The repeat count is actually not quite right for audio
+ // segments -- it returns one too many for repeating segments,
+ // because in midi segments you want that (to deal with partial
+ // repeats). Here we really need to find a better way to deal
+ // with partial repeats...
+
+ int repeatCount = getSegmentRepeatCount();
+ if (repeatCount > 0)
+ repeatEndTime = m_segment->getRepeatEndTime();
+
+ MappedEvent* bufPos = m_mmappedEventBuffer;
+
+ for (int repeatNo = 0; repeatNo <= repeatCount; ++repeatNo) {
+
+ timeT playTime =
+ segmentStartTime + repeatNo * segmentDuration;
+ if (playTime >= repeatEndTime)
+ break;
+
+ playTime = playTime + m_segment->getDelay();
+ eventTime = comp.getElapsedRealTime(playTime);
+ eventTime = eventTime + m_segment->getRealTimeDelay();
+
+ RealTime audioStart = m_segment->getAudioStartTime();
+ RealTime audioDuration = m_segment->getAudioEndTime() - audioStart;
+ MappedEvent *mE =
+ new (bufPos) MappedEvent(track->getInstrument(), // send instrument for audio
+ m_segment->getAudioFileId(),
+ eventTime,
+ audioDuration,
+ audioStart);
+ mE->setTrackId(track->getId());
+ mE->setRuntimeSegmentId(m_segment->getRuntimeId());
+
+ // Send the autofade if required
+ //
+ if (m_segment->isAutoFading()) {
+ mE->setAutoFade(true);
+ mE->setFadeInTime(m_segment->getFadeInTime());
+ mE->setFadeOutTime(m_segment->getFadeOutTime());
+ std::cout << "AudioSegmentMmapper::dump - "
+ << "SETTING AUTOFADE "
+ << "in = " << m_segment->getFadeInTime()
+ << ", out = " << m_segment->getFadeOutTime()
+ << std::endl;
+ } else {
+ // std::cout << "AudioSegmentMmapper::dump - "
+ // << "NO AUTOFADE SET ON SEGMENT" << std::endl;
+ }
+
+ ++bufPos;
+ }
+
+ *(size_t *)m_mmappedRegion = repeatCount + 1;
+}
+
+size_t AudioSegmentMmapper::computeMmappedSize()
+{
+ if (!m_segment) return 0;
+
+ int repeatCount = getSegmentRepeatCount();
+
+ return (repeatCount + 1) * 1 * sizeof(MappedEvent);
+ // audio segments don't have events, we just need room for 1 MappedEvent
+}
+
+}
+
diff --git a/src/gui/seqmanager/AudioSegmentMmapper.h b/src/gui/seqmanager/AudioSegmentMmapper.h
new file mode 100644
index 0000000..bc4d798
--- /dev/null
+++ b/src/gui/seqmanager/AudioSegmentMmapper.h
@@ -0,0 +1,61 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_AUDIOSEGMENTMMAPPER_H_
+#define _RG_AUDIOSEGMENTMMAPPER_H_
+
+#include "SegmentMmapper.h"
+
+
+class QString;
+
+
+namespace Rosegarden
+{
+
+class Segment;
+class RosegardenGUIDoc;
+
+
+class AudioSegmentMmapper : public SegmentMmapper
+{
+ friend class SegmentMmapperFactory;
+
+protected:
+ AudioSegmentMmapper(RosegardenGUIDoc*, Segment*,
+ const QString& fileName);
+
+ virtual size_t computeMmappedSize();
+
+ /// dump all segment data in the file
+ virtual void dump();
+};
+
+//----------------------------------------
+
+
+}
+
+#endif
diff --git a/src/gui/seqmanager/CompositionMmapper.cpp b/src/gui/seqmanager/CompositionMmapper.cpp
new file mode 100644
index 0000000..094f562
--- /dev/null
+++ b/src/gui/seqmanager/CompositionMmapper.cpp
@@ -0,0 +1,174 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "CompositionMmapper.h"
+#include "misc/Debug.h"
+
+#include <kstddirs.h>
+#include "base/Composition.h"
+#include "base/Segment.h"
+#include "document/RosegardenGUIDoc.h"
+#include "gui/application/RosegardenApplication.h"
+#include "SegmentMmapperFactory.h"
+#include "SegmentMmapper.h"
+#include <kglobal.h>
+#include <qdir.h>
+#include <qfile.h>
+#include <qstring.h>
+#include <qstringlist.h>
+#include <stdint.h>
+
+
+namespace Rosegarden
+{
+
+CompositionMmapper::CompositionMmapper(RosegardenGUIDoc *doc)
+ : m_doc(doc)
+{
+ cleanup();
+
+ SEQMAN_DEBUG << "CompositionMmapper() - doc = " << doc << endl;
+ Composition &comp = m_doc->getComposition();
+
+ for (Composition::iterator it = comp.begin(); it != comp.end(); it++) {
+
+ Track* track = comp.getTrackById((*it)->getTrack());
+
+ // check to see if track actually exists
+ //
+ if (track == 0)
+ continue;
+
+ mmapSegment(*it);
+ }
+}
+
+CompositionMmapper::~CompositionMmapper()
+{
+ SEQMAN_DEBUG << "~CompositionMmapper()\n";
+
+ //
+ // Clean up possible left-overs
+ //
+ cleanup();
+
+ for (segmentmmapers::iterator i = m_segmentMmappers.begin();
+ i != m_segmentMmappers.end(); ++i)
+ delete i->second;
+}
+
+void CompositionMmapper::cleanup()
+{
+ // In case the sequencer is still running, mapping some segments
+ //
+ rgapp->sequencerSend("closeAllSegments()");
+
+ // Erase all 'segment_*' files
+ //
+ QString tmpPath = KGlobal::dirs()->resourceDirs("tmp").last();
+
+ QDir segmentsDir(tmpPath, "segment_*");
+ for (unsigned int i = 0; i < segmentsDir.count(); ++i) {
+ QString segmentName = tmpPath + '/' + segmentsDir[i];
+ SEQMAN_DEBUG << "CompositionMmapper : cleaning up " << segmentName << endl;
+ QFile::remove
+ (segmentName);
+ }
+
+}
+
+bool CompositionMmapper::segmentModified(Segment* segment)
+{
+ SegmentMmapper* mmapper = m_segmentMmappers[segment];
+
+ if (!mmapper)
+ return false; // this can happen with the SegmentSplitCommand, where the new segment's transpose is set
+ // even though it's not mapped yet
+
+ SEQMAN_DEBUG << "CompositionMmapper::segmentModified(" << segment << ") - mmapper = "
+ << mmapper << endl;
+
+ return mmapper->refresh();
+}
+
+void CompositionMmapper::segmentAdded(Segment* segment)
+{
+ SEQMAN_DEBUG << "CompositionMmapper::segmentAdded(" << segment << ")\n";
+
+ mmapSegment(segment);
+}
+
+void CompositionMmapper::segmentDeleted(Segment* segment)
+{
+ SEQMAN_DEBUG << "CompositionMmapper::segmentDeleted(" << segment << ")\n";
+ SegmentMmapper* mmapper = m_segmentMmappers[segment];
+ m_segmentMmappers.erase(segment);
+ SEQMAN_DEBUG << "CompositionMmapper::segmentDeleted() : deleting SegmentMmapper " << mmapper << endl;
+
+ delete mmapper;
+}
+
+void CompositionMmapper::mmapSegment(Segment* segment)
+{
+ SEQMAN_DEBUG << "CompositionMmapper::mmapSegment(" << segment << ")\n";
+
+ SegmentMmapper* mmapper = SegmentMmapperFactory::makeMmapperForSegment(m_doc,
+ segment,
+ makeFileName(segment));
+
+ if (mmapper)
+ m_segmentMmappers[segment] = mmapper;
+}
+
+QString CompositionMmapper::makeFileName(Segment* segment)
+{
+ QStringList tmpDirs = KGlobal::dirs()->resourceDirs("tmp");
+
+ return QString("%1/segment_%2")
+ .arg(tmpDirs.last())
+ .arg((uintptr_t)segment, 0, 16);
+}
+
+QString CompositionMmapper::getSegmentFileName(Segment* s)
+{
+ SegmentMmapper* mmapper = m_segmentMmappers[s];
+
+ if (mmapper)
+ return mmapper->getFileName();
+ else
+ return QString::null;
+}
+
+size_t CompositionMmapper::getSegmentFileSize(Segment* s)
+{
+ SegmentMmapper* mmapper = m_segmentMmappers[s];
+
+ if (mmapper)
+ return mmapper->getFileSize();
+ else
+ return 0;
+}
+
+}
diff --git a/src/gui/seqmanager/CompositionMmapper.h b/src/gui/seqmanager/CompositionMmapper.h
new file mode 100644
index 0000000..8bf997d
--- /dev/null
+++ b/src/gui/seqmanager/CompositionMmapper.h
@@ -0,0 +1,75 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_COMPOSITIONMMAPPER_H_
+#define _RG_COMPOSITIONMMAPPER_H_
+
+#include <map>
+#include <qstring.h>
+
+
+
+
+namespace Rosegarden
+{
+
+class SegmentMmapper;
+class Segment;
+class RosegardenGUIDoc;
+
+
+class CompositionMmapper
+{
+ friend class SequenceManager;
+
+public:
+ CompositionMmapper(RosegardenGUIDoc *doc);
+ ~CompositionMmapper();
+
+ QString getSegmentFileName(Segment*);
+ size_t getSegmentFileSize(Segment*);
+
+ void cleanup();
+
+protected:
+ bool segmentModified(Segment*);
+ void segmentAdded(Segment*);
+ void segmentDeleted(Segment*);
+
+ void mmapSegment(Segment*);
+ QString makeFileName(Segment*);
+
+ //--------------- Data members ---------------------------------
+
+ RosegardenGUIDoc* m_doc;
+ typedef std::map<Segment*, SegmentMmapper*> segmentmmapers;
+
+ segmentmmapers m_segmentMmappers;
+};
+
+
+}
+
+#endif
diff --git a/src/gui/seqmanager/ControlBlockMmapper.cpp b/src/gui/seqmanager/ControlBlockMmapper.cpp
new file mode 100644
index 0000000..90ab6c2
--- /dev/null
+++ b/src/gui/seqmanager/ControlBlockMmapper.cpp
@@ -0,0 +1,226 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "ControlBlockMmapper.h"
+#include "misc/Debug.h"
+
+#include <kstddirs.h>
+#include "misc/Strings.h"
+#include "base/Composition.h"
+#include "base/Exception.h"
+#include "base/MidiProgram.h"
+#include "base/Track.h"
+#include "document/RosegardenGUIDoc.h"
+#include "sound/ControlBlock.h"
+#include <kglobal.h>
+#include <qfile.h>
+#include <qstring.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <sys/mman.h>
+#include <errno.h>
+
+namespace Rosegarden
+{
+
+ControlBlockMmapper::ControlBlockMmapper(RosegardenGUIDoc* doc)
+ : m_doc(doc),
+ m_fileName(createFileName()),
+ m_fd( -1),
+ m_mmappedBuffer(0),
+ m_mmappedSize(sizeof(ControlBlock)),
+ m_controlBlock(0)
+{
+ // just in case
+ QFile::remove
+ (m_fileName);
+
+ m_fd = ::open(m_fileName.latin1(), O_RDWR | O_CREAT | O_TRUNC,
+ S_IRUSR | S_IWUSR);
+ if (m_fd < 0) {
+ SEQMAN_DEBUG << "ControlBlockMmapper : Couldn't open " << m_fileName
+ << endl;
+ throw Exception("Couldn't open " + qstrtostr(m_fileName));
+ }
+
+ setFileSize(m_mmappedSize);
+
+ //
+ // mmap() file for writing
+ //
+ m_mmappedBuffer = ::mmap(0, m_mmappedSize,
+ PROT_READ | PROT_WRITE,
+ MAP_SHARED, m_fd, 0);
+
+ if (m_mmappedBuffer == (void*) - 1) {
+ SEQMAN_DEBUG << QString("mmap failed : (%1) %2\n").arg(errno).arg(strerror(errno));
+ throw Exception("mmap failed");
+ }
+
+ SEQMAN_DEBUG << "ControlBlockMmapper : mmap size : " << m_mmappedSize
+ << " at " << (void*)m_mmappedBuffer << endl;
+
+ // Create new control block on file
+ initControlBlock();
+}
+
+ControlBlockMmapper::~ControlBlockMmapper()
+{
+ ::munmap(m_mmappedBuffer, m_mmappedSize);
+ ::close(m_fd);
+ QFile::remove
+ (m_fileName);
+}
+
+QString ControlBlockMmapper::createFileName()
+{
+ return KGlobal::dirs()->resourceDirs("tmp").last() + "/rosegarden_control_block";
+}
+
+void ControlBlockMmapper::updateTrackData(Track *t)
+{
+ m_controlBlock->updateTrackData(t);
+}
+
+void ControlBlockMmapper::setTrackDeleted(TrackId t)
+{
+ m_controlBlock->setTrackDeleted(t, true);
+}
+
+void ControlBlockMmapper::updateMidiFilters(MidiFilter thruFilter,
+ MidiFilter recordFilter)
+{
+ m_controlBlock->setThruFilter(thruFilter);
+ m_controlBlock->setRecordFilter(recordFilter);
+}
+
+void ControlBlockMmapper::updateMetronomeData(InstrumentId instId)
+{
+ m_controlBlock->setInstrumentForMetronome(instId);
+}
+
+void ControlBlockMmapper::updateMetronomeForPlayback()
+{
+ bool muted = !m_doc->getComposition().usePlayMetronome();
+ SEQMAN_DEBUG << "ControlBlockMmapper::updateMetronomeForPlayback: muted=" << muted << endl;
+ if (m_controlBlock->isMetronomeMuted() == muted)
+ return ;
+ m_controlBlock->setMetronomeMuted(muted);
+}
+
+void ControlBlockMmapper::updateMetronomeForRecord()
+{
+ bool muted = !m_doc->getComposition().useRecordMetronome();
+ SEQMAN_DEBUG << "ControlBlockMmapper::updateMetronomeForRecord: muted=" << muted << endl;
+ if (m_controlBlock->isMetronomeMuted() == muted)
+ return ;
+ m_controlBlock->setMetronomeMuted(muted);
+}
+
+bool ControlBlockMmapper::updateSoloData(bool solo,
+ TrackId selectedTrack)
+{
+ bool changed = false;
+
+ if (solo != m_controlBlock->isSolo()) {
+
+ changed = true;
+
+ } else if (solo &&
+ (selectedTrack != m_controlBlock->getSelectedTrack())) {
+
+ changed = true;
+ }
+
+ m_controlBlock->setSolo(solo);
+ m_controlBlock->setSelectedTrack(selectedTrack);
+
+ return changed;
+}
+
+void ControlBlockMmapper::setDocument(RosegardenGUIDoc* doc)
+{
+ SEQMAN_DEBUG << "ControlBlockMmapper::setDocument()\n";
+ m_doc = doc;
+ initControlBlock();
+}
+
+void ControlBlockMmapper::initControlBlock()
+{
+ SEQMAN_DEBUG << "ControlBlockMmapper::initControlBlock()\n";
+
+ m_controlBlock = new (m_mmappedBuffer) ControlBlock(m_doc->getComposition().getMaxTrackId());
+
+ Composition& comp = m_doc->getComposition();
+
+ for (Composition::trackiterator i = comp.getTracks().begin(); i != comp.getTracks().end(); ++i) {
+ Track* track = i->second;
+ if (track == 0)
+ continue;
+
+ m_controlBlock->updateTrackData(track);
+ }
+
+ m_controlBlock->setMetronomeMuted(!comp.usePlayMetronome());
+
+ m_controlBlock->setThruFilter(m_doc->getStudio().getMIDIThruFilter());
+ m_controlBlock->setRecordFilter(m_doc->getStudio().getMIDIRecordFilter());
+
+ ::msync(m_mmappedBuffer, m_mmappedSize, MS_ASYNC);
+}
+
+void ControlBlockMmapper::setFileSize(size_t size)
+{
+ SEQMAN_DEBUG << "ControlBlockMmapper : setting size of "
+ << m_fileName << " to " << size << endl;
+ // rewind
+ ::lseek(m_fd, 0, SEEK_SET);
+
+ //
+ // enlarge the file
+ // (seek() to wanted size, then write a byte)
+ //
+ if (::lseek(m_fd, size - 1, SEEK_SET) == -1) {
+ std::cerr << "WARNING: ControlBlockMmapper : Couldn't lseek in " << m_fileName
+ << " to " << size << std::endl;
+ throw Exception("lseek failed");
+ }
+
+ if (::write(m_fd, "\0", 1) != 1) {
+ std::cerr << "WARNING: ControlBlockMmapper : Couldn't write byte in "
+ << m_fileName << std::endl;
+ throw Exception("write failed");
+ }
+
+}
+
+void
+ControlBlockMmapper::enableMIDIThruRouting(bool state)
+{
+ m_controlBlock->setMidiRoutingEnabled(state);
+}
+
+}
diff --git a/src/gui/seqmanager/ControlBlockMmapper.h b/src/gui/seqmanager/ControlBlockMmapper.h
new file mode 100644
index 0000000..a96e742
--- /dev/null
+++ b/src/gui/seqmanager/ControlBlockMmapper.h
@@ -0,0 +1,83 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_CONTROLBLOCKMMAPPER_H_
+#define _RG_CONTROLBLOCKMMAPPER_H_
+
+#include "base/MidiProgram.h"
+#include "base/Track.h"
+#include <qstring.h>
+
+
+
+
+namespace Rosegarden
+{
+
+class Track;
+class RosegardenGUIDoc;
+class ControlBlock;
+
+
+class ControlBlockMmapper
+{
+public:
+ ControlBlockMmapper(RosegardenGUIDoc*);
+ ~ControlBlockMmapper();
+
+ QString getFileName() { return m_fileName; }
+ void updateTrackData(Track*);
+ void setTrackDeleted(TrackId);
+ void updateMetronomeData(InstrumentId instId);
+ void updateMetronomeForPlayback();
+ void updateMetronomeForRecord();
+ bool updateSoloData(bool solo, TrackId selectedTrack);
+ void updateMidiFilters(MidiFilter thruFilter,
+ MidiFilter recordFilter);
+ void setDocument(RosegardenGUIDoc*);
+ void enableMIDIThruRouting(bool state);
+
+protected:
+ void initControlBlock();
+ void setFileSize(size_t);
+ QString createFileName();
+
+ //--------------- Data members ---------------------------------
+ RosegardenGUIDoc* m_doc;
+ QString m_fileName;
+ int m_fd;
+ void* m_mmappedBuffer;
+ size_t m_mmappedSize;
+ ControlBlock* m_controlBlock;
+};
+
+
+//----------------------------------------
+
+
+
+}
+
+#endif
diff --git a/src/gui/seqmanager/MetronomeMmapper.cpp b/src/gui/seqmanager/MetronomeMmapper.cpp
new file mode 100644
index 0000000..9ca9af7
--- /dev/null
+++ b/src/gui/seqmanager/MetronomeMmapper.cpp
@@ -0,0 +1,268 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "MetronomeMmapper.h"
+#include "misc/Debug.h"
+#include <kapplication.h>
+
+#include "sound/Midi.h"
+#include <kstddirs.h>
+#include "document/ConfigGroups.h"
+#include "base/Event.h"
+#include "base/MidiProgram.h"
+#include "base/NotationTypes.h"
+#include "base/RealTime.h"
+#include "base/Segment.h"
+#include "base/Studio.h"
+#include "base/TriggerSegment.h"
+#include "document/RosegardenGUIDoc.h"
+#include "SegmentMmapper.h"
+#include "sound/MappedEvent.h"
+#include <kconfig.h>
+#include <kglobal.h>
+#include <qstring.h>
+#include <algorithm>
+
+
+namespace Rosegarden
+{
+
+MetronomeMmapper::MetronomeMmapper(RosegardenGUIDoc* doc)
+ : SegmentMmapper(doc, 0, createFileName()),
+ m_metronome(0), // no metronome to begin with
+ m_tickDuration(0, 100000000)
+{
+ SEQMAN_DEBUG << "MetronomeMmapper ctor : " << this << endl;
+
+ // get metronome device
+ Studio &studio = m_doc->getStudio();
+ int device = studio.getMetronomeDevice();
+
+ const MidiMetronome *metronome =
+ m_doc->getStudio().getMetronomeFromDevice(device);
+
+ if (metronome) {
+
+ SEQMAN_DEBUG << "MetronomeMmapper: have metronome, it's on instrument " << metronome->getInstrument() << endl;
+
+ m_metronome = new MidiMetronome(*metronome);
+ } else {
+ m_metronome = new MidiMetronome
+ (SystemInstrumentBase);
+ SEQMAN_DEBUG << "MetronomeMmapper: no metronome for device " << device << endl;
+ }
+
+ Composition& c = m_doc->getComposition();
+ timeT t = c.getBarStart( -20); // somewhat arbitrary
+ int depth = m_metronome->getDepth();
+
+ if (depth > 0) {
+ while (t < c.getEndMarker()) {
+
+ TimeSignature sig = c.getTimeSignatureAt(t);
+ timeT barDuration = sig.getBarDuration();
+ std::vector<int> divisions;
+ if (depth > 0)
+ sig.getDivisions(depth - 1, divisions);
+ int ticks = 1;
+
+ for (int i = -1; i < (int)divisions.size(); ++i) {
+ if (i >= 0)
+ ticks *= divisions[i];
+
+ for (int tick = 0; tick < ticks; ++tick) {
+ if (i >= 0 && (tick % divisions[i] == 0))
+ continue;
+ timeT tickTime = t + (tick * barDuration) / ticks;
+ m_ticks.push_back(Tick(tickTime, i + 1));
+ }
+ }
+
+ t = c.getBarEndForTime(t);
+ }
+ }
+
+ KConfig *config = kapp->config();
+ config->setGroup(SequencerOptionsConfigGroup);
+ int midiClock = config->readNumEntry("midiclock", 0);
+ int mtcMode = config->readNumEntry("mtcmode", 0);
+
+ if (midiClock == 1) {
+ timeT quarterNote = Note(Note::Crotchet).getDuration();
+
+ // Insert 24 clocks per quarter note
+ //
+ for (timeT insertTime = c.getStartMarker();
+ insertTime < c.getEndMarker();
+ insertTime += quarterNote / 24) {
+ m_ticks.push_back(Tick(insertTime, 3));
+ }
+ }
+
+
+ if (mtcMode > 0) {
+ // do something
+ }
+
+ sortTicks();
+
+ if (m_ticks.size() == 0) {
+ SEQMAN_DEBUG << "MetronomeMmapper : WARNING no ticks generated\n";
+ }
+
+ // Done by init()
+
+ // m_mmappedSize = computeMmappedSize();
+ // if (m_mmappedSize > 0) {
+ // setFileSize(m_mmappedSize);
+ // doMmap();
+ // dump();
+ // }
+}
+
+MetronomeMmapper::~MetronomeMmapper()
+{
+ SEQMAN_DEBUG << "~MetronomeMmapper " << this << endl;
+ delete m_metronome;
+}
+
+InstrumentId MetronomeMmapper::getMetronomeInstrument()
+{
+ return m_metronome->getInstrument();
+}
+
+QString MetronomeMmapper::createFileName()
+{
+ return KGlobal::dirs()->resourceDirs("tmp").last() + "/rosegarden_metronome";
+}
+
+void MetronomeMmapper::dump()
+{
+ RealTime eventTime;
+ Composition& comp = m_doc->getComposition();
+
+ SEQMAN_DEBUG << "MetronomeMmapper::dump: instrument is " << m_metronome->getInstrument() << endl;
+
+ MappedEvent* bufPos = m_mmappedEventBuffer, *mE;
+
+ for (TickContainer::iterator i = m_ticks.begin(); i != m_ticks.end(); ++i) {
+
+ /*
+ SEQMAN_DEBUG << "MetronomeMmapper::dump: velocity = "
+ << int(velocity) << endl;
+ */
+
+ eventTime = comp.getElapsedRealTime(i->first);
+
+ if (i->second == 3) // MIDI Clock
+ {
+ mE = new (bufPos) MappedEvent(0, MappedEvent::MidiSystemMessage);
+ mE->setData1(MIDI_TIMING_CLOCK);
+ mE->setEventTime(eventTime);
+ } else {
+ MidiByte velocity;
+ MidiByte pitch;
+ switch (i->second) {
+ case 0:
+ velocity = m_metronome->getBarVelocity();
+ pitch = m_metronome->getBarPitch();
+ break;
+ case 1:
+ velocity = m_metronome->getBeatVelocity();
+ pitch = m_metronome->getBeatPitch();
+ break;
+ default:
+ velocity = m_metronome->getSubBeatVelocity();
+ pitch = m_metronome->getSubBeatPitch();
+ break;
+ }
+
+ new (bufPos) MappedEvent(m_metronome->getInstrument(),
+ MappedEvent::MidiNoteOneShot,
+ pitch,
+ velocity,
+ eventTime,
+ m_tickDuration,
+ RealTime::zeroTime);
+ }
+
+ ++bufPos;
+ }
+
+ // Store the number of events at the start of the shared memory region
+ *(size_t *)m_mmappedRegion = (bufPos - m_mmappedEventBuffer);
+
+ SEQMAN_DEBUG << "MetronomeMmapper::dump: - "
+ << "Total events written = " << *(size_t *)m_mmappedRegion
+ << endl;
+}
+
+void MetronomeMmapper::sortTicks()
+{
+ sort(m_ticks.begin(), m_ticks.end());
+}
+
+size_t MetronomeMmapper::computeMmappedSize()
+{
+ KConfig *config = kapp->config();
+ config->setGroup(Rosegarden::SequencerOptionsConfigGroup);
+ int midiClock = config->readNumEntry("midiclock", 0);
+ int mtcMode = config->readNumEntry("mtcmode", 0);
+
+ // base size for Metronome ticks
+ size_t size = m_ticks.size() * sizeof(MappedEvent);
+ Composition& comp = m_doc->getComposition();
+
+ if (midiClock == 1)
+ {
+ using Rosegarden::Note;
+
+ // Allow room for MIDI clocks
+ int clocks = ( 24 * ( comp.getEndMarker() - comp.getStartMarker() ) ) /
+ Note(Note::Crotchet).getDuration();
+
+ /*
+ SEQMAN_DEBUG << "MetronomeMmapper::computeMmappedSize - "
+ << "Number of clock events catered for = " << clocks
+ << endl;
+ */
+
+ size += clocks * sizeof(MappedEvent);
+ }
+
+ if (mtcMode > 0)
+ {
+ // Allow room for MTC timing messages (how?)
+ }
+
+ return size;
+}
+
+unsigned int MetronomeMmapper::getSegmentRepeatCount()
+{
+ return 1;
+}
+
+}
diff --git a/src/gui/seqmanager/MetronomeMmapper.h b/src/gui/seqmanager/MetronomeMmapper.h
new file mode 100644
index 0000000..1e18171
--- /dev/null
+++ b/src/gui/seqmanager/MetronomeMmapper.h
@@ -0,0 +1,87 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_METRONOMEMMAPPER_H_
+#define _RG_METRONOMEMMAPPER_H_
+
+#include "base/MidiProgram.h"
+#include "base/RealTime.h"
+#include "SegmentMmapper.h"
+#include <qstring.h>
+#include <utility>
+#include <vector>
+#include "base/Event.h"
+
+
+
+
+namespace Rosegarden
+{
+
+class RosegardenGUIDoc;
+class MidiMetronome;
+
+
+class MetronomeMmapper : public SegmentMmapper
+{
+ friend class SegmentMmapperFactory;
+
+public:
+
+ virtual ~MetronomeMmapper();
+
+ InstrumentId getMetronomeInstrument();
+
+ // overrides from SegmentMmapper
+ virtual unsigned int getSegmentRepeatCount();
+
+protected:
+ MetronomeMmapper(RosegardenGUIDoc* doc);
+
+ virtual size_t computeMmappedSize();
+
+ void sortTicks();
+ QString createFileName();
+
+ // override from SegmentMmapper
+ virtual void dump();
+
+ //--------------- Data members ---------------------------------
+ typedef std::pair<timeT, int> Tick;
+ typedef std::vector<Tick> TickContainer;
+ friend bool operator<(Tick, Tick);
+
+ TickContainer m_ticks;
+ bool m_deleteMetronome;
+ const MidiMetronome* m_metronome;
+ RealTime m_tickDuration;
+};
+
+//----------------------------------------
+
+
+}
+
+#endif
diff --git a/src/gui/seqmanager/MidiFilterDialog.cpp b/src/gui/seqmanager/MidiFilterDialog.cpp
new file mode 100644
index 0000000..69d687a
--- /dev/null
+++ b/src/gui/seqmanager/MidiFilterDialog.cpp
@@ -0,0 +1,229 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "MidiFilterDialog.h"
+
+#include <klocale.h>
+#include "base/MidiProgram.h"
+#include "base/NotationTypes.h"
+#include "document/RosegardenGUIDoc.h"
+#include "gui/seqmanager/SequenceManager.h"
+#include "sound/MappedEvent.h"
+#include <kdialogbase.h>
+#include <qbuttongroup.h>
+#include <qcheckbox.h>
+#include <qhbox.h>
+#include <qwidget.h>
+
+
+namespace Rosegarden
+{
+
+MidiFilterDialog::MidiFilterDialog(QWidget *parent,
+ RosegardenGUIDoc *doc):
+ KDialogBase(parent, 0, true, i18n("Modify MIDI filters..."),
+ Ok | Apply | Close | Help),
+ m_doc(doc),
+ m_modified(true)
+{
+ setHelp("studio-midi-filters");
+
+ QHBox *hBox = makeHBoxMainWidget();
+
+ m_thruBox =
+ new QButtonGroup(1,
+ Qt::Horizontal,
+ i18n("THRU events to ignore"), hBox);
+
+ QCheckBox *noteThru = new QCheckBox(i18n("Note"), m_thruBox);
+ QCheckBox *progThru = new QCheckBox(i18n("Program Change"), m_thruBox);
+ QCheckBox *keyThru = new QCheckBox(i18n("Key Pressure"), m_thruBox);
+ QCheckBox *chanThru = new QCheckBox(i18n("Channel Pressure"), m_thruBox);
+ QCheckBox *pitchThru = new QCheckBox(i18n("Pitch Bend"), m_thruBox);
+ QCheckBox *contThru = new QCheckBox(i18n("Controller"), m_thruBox);
+ QCheckBox *sysThru = new QCheckBox(i18n("System Exclusive"), m_thruBox);
+
+ MidiFilter thruFilter = m_doc->getStudio().getMIDIThruFilter();
+
+ if (thruFilter & MappedEvent::MidiNote)
+ noteThru->setChecked(true);
+
+ if (thruFilter & MappedEvent::MidiProgramChange)
+ progThru->setChecked(true);
+
+ if (thruFilter & MappedEvent::MidiKeyPressure)
+ keyThru->setChecked(true);
+
+ if (thruFilter & MappedEvent::MidiChannelPressure)
+ chanThru->setChecked(true);
+
+ if (thruFilter & MappedEvent::MidiPitchBend)
+ pitchThru->setChecked(true);
+
+ if (thruFilter & MappedEvent::MidiController)
+ contThru->setChecked(true);
+
+ if (thruFilter & MappedEvent::MidiSystemMessage)
+ sysThru->setChecked(true);
+
+ m_recordBox =
+ new QButtonGroup(1,
+ Qt::Horizontal,
+ i18n("RECORD events to ignore"), hBox);
+
+ QCheckBox *noteRecord = new QCheckBox(i18n("Note"), m_recordBox);
+ QCheckBox *progRecord = new QCheckBox(i18n("Program Change"), m_recordBox);
+ QCheckBox *keyRecord = new QCheckBox(i18n("Key Pressure"), m_recordBox);
+ QCheckBox *chanRecord = new QCheckBox(i18n("Channel Pressure"), m_recordBox);
+ QCheckBox *pitchRecord = new QCheckBox(i18n("Pitch Bend"), m_recordBox);
+ QCheckBox *contRecord = new QCheckBox(i18n("Controller"), m_recordBox);
+ QCheckBox *sysRecord = new QCheckBox(i18n("System Exclusive"), m_recordBox);
+
+ MidiFilter recordFilter =
+ m_doc->getStudio().getMIDIRecordFilter();
+
+ if (recordFilter & MappedEvent::MidiNote)
+ noteRecord->setChecked(true);
+
+ if (recordFilter & MappedEvent::MidiProgramChange)
+ progRecord->setChecked(true);
+
+ if (recordFilter & MappedEvent::MidiKeyPressure)
+ keyRecord->setChecked(true);
+
+ if (recordFilter & MappedEvent::MidiChannelPressure)
+ chanRecord->setChecked(true);
+
+ if (recordFilter & MappedEvent::MidiPitchBend)
+ pitchRecord->setChecked(true);
+
+ if (recordFilter & MappedEvent::MidiController)
+ contRecord->setChecked(true);
+
+ if (recordFilter & MappedEvent::MidiSystemMessage)
+ sysRecord->setChecked(true);
+
+
+ connect(m_thruBox, SIGNAL(released(int)),
+ this, SLOT(slotSetModified()));
+
+ connect(m_recordBox, SIGNAL(released(int)),
+ this, SLOT(slotSetModified()));
+
+ setModified(false);
+}
+
+void
+MidiFilterDialog::slotApply()
+{
+ MidiFilter thruFilter = 0,
+ recordFilter = 0;
+
+ if (dynamic_cast<QCheckBox*>(m_thruBox->find(0))->isChecked())
+ thruFilter |= MappedEvent::MidiNote;
+
+ if (dynamic_cast<QCheckBox*>(m_thruBox->find(1))->isChecked())
+ thruFilter |= MappedEvent::MidiProgramChange;
+
+ if (dynamic_cast<QCheckBox*>(m_thruBox->find(2))->isChecked())
+ thruFilter |= MappedEvent::MidiKeyPressure;
+
+ if (dynamic_cast<QCheckBox*>(m_thruBox->find(3))->isChecked())
+ thruFilter |= MappedEvent::MidiChannelPressure;
+
+ if (dynamic_cast<QCheckBox*>(m_thruBox->find(4))->isChecked())
+ thruFilter |= MappedEvent::MidiPitchBend;
+
+ if (dynamic_cast<QCheckBox*>(m_thruBox->find(5))->isChecked())
+ thruFilter |= MappedEvent::MidiController;
+
+ if (dynamic_cast<QCheckBox*>(m_thruBox->find(6))->isChecked())
+ thruFilter |= MappedEvent::MidiSystemMessage;
+
+ if (dynamic_cast<QCheckBox*>(m_recordBox->find(0))->isChecked())
+ recordFilter |= MappedEvent::MidiNote;
+
+ if (dynamic_cast<QCheckBox*>(m_recordBox->find(1))->isChecked())
+ recordFilter |= MappedEvent::MidiProgramChange;
+
+ if (dynamic_cast<QCheckBox*>(m_recordBox->find(2))->isChecked())
+ recordFilter |= MappedEvent::MidiKeyPressure;
+
+ if (dynamic_cast<QCheckBox*>(m_recordBox->find(3))->isChecked())
+ recordFilter |= MappedEvent::MidiChannelPressure;
+
+ if (dynamic_cast<QCheckBox*>(m_recordBox->find(4))->isChecked())
+ recordFilter |= MappedEvent::MidiPitchBend;
+
+ if (dynamic_cast<QCheckBox*>(m_recordBox->find(5))->isChecked())
+ recordFilter |= MappedEvent::MidiController;
+
+ if (dynamic_cast<QCheckBox*>(m_recordBox->find(6))->isChecked())
+ recordFilter |= MappedEvent::MidiSystemMessage;
+
+
+ //if (m_thruBox->
+
+ m_doc->getStudio().setMIDIThruFilter(thruFilter);
+ m_doc->getStudio().setMIDIRecordFilter(recordFilter);
+
+ if (m_doc->getSequenceManager()) {
+ m_doc->getSequenceManager()->filtersChanged(thruFilter, recordFilter);
+ }
+
+ setModified(false);
+}
+
+void
+MidiFilterDialog::slotOk()
+{
+ slotApply();
+ accept();
+}
+
+void
+MidiFilterDialog::slotSetModified()
+{
+ setModified(true);
+}
+
+void
+MidiFilterDialog::setModified(bool value)
+{
+ if (m_modified == value)
+ return ;
+
+ if (value) {
+ enableButtonApply(true);
+ } else {
+ enableButtonApply(false);
+ }
+
+ m_modified = value;
+
+}
+
+}
+#include "MidiFilterDialog.moc"
diff --git a/src/gui/seqmanager/MidiFilterDialog.h b/src/gui/seqmanager/MidiFilterDialog.h
new file mode 100644
index 0000000..06099ac
--- /dev/null
+++ b/src/gui/seqmanager/MidiFilterDialog.h
@@ -0,0 +1,71 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_MIDIFILTERDIALOG_H_
+#define _RG_MIDIFILTERDIALOG_H_
+
+#include <kdialogbase.h>
+
+
+class QWidget;
+class QButtonGroup;
+
+
+namespace Rosegarden
+{
+
+class RosegardenGUIDoc;
+
+
+class MidiFilterDialog : public KDialogBase
+{
+ Q_OBJECT
+public:
+ MidiFilterDialog(QWidget *parent,
+ RosegardenGUIDoc *doc);
+
+ void setModified(bool value);
+
+public slots:
+
+ void slotOk();
+ void slotApply();
+ void slotSetModified();
+
+protected:
+
+ RosegardenGUIDoc *m_doc;
+
+ QButtonGroup *m_thruBox;
+ QButtonGroup *m_recordBox;
+
+ bool m_modified;
+
+};
+
+
+}
+
+#endif
diff --git a/src/gui/seqmanager/SegmentMmapper.cpp b/src/gui/seqmanager/SegmentMmapper.cpp
new file mode 100644
index 0000000..5cf117d
--- /dev/null
+++ b/src/gui/seqmanager/SegmentMmapper.cpp
@@ -0,0 +1,562 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "SegmentMmapper.h"
+#include "misc/Debug.h"
+
+#include "misc/Strings.h"
+#include "base/BaseProperties.h"
+#include "base/Composition.h"
+#include "base/Event.h"
+#include "base/Exception.h"
+#include "base/NotationTypes.h"
+#include "base/RealTime.h"
+#include "base/Segment.h"
+#include "base/SegmentPerformanceHelper.h"
+#include "base/TriggerSegment.h"
+#include "document/RosegardenGUIDoc.h"
+#include "sound/MappedEvent.h"
+#include <qfile.h>
+#include <qstring.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <sys/mman.h>
+#include <errno.h>
+
+
+namespace Rosegarden
+{
+
+SegmentMmapper::SegmentMmapper(RosegardenGUIDoc* doc,
+ Segment* segment, const QString& fileName)
+ : m_doc(doc),
+ m_segment(segment),
+ m_fileName(fileName),
+ m_fd( -1),
+ m_mmappedSize(0),
+ m_mmappedRegion(0),
+ m_mmappedEventBuffer((MappedEvent*)0)
+{
+ SEQMAN_DEBUG << "SegmentMmapper : " << this
+ << " trying to mmap " << m_fileName
+ << endl;
+
+ m_fd = ::open(m_fileName.latin1(), O_RDWR | O_CREAT | O_TRUNC,
+ S_IRUSR | S_IWUSR);
+ if (m_fd < 0) {
+ perror("SegmentMmapper::SegmentMmapper: Failed to open mmap file for writing");
+ SEQMAN_DEBUG << "SegmentMmapper : Couldn't open " << m_fileName
+ << endl;
+ throw Exception("Couldn't open " + qstrtostr(m_fileName));
+ }
+
+ // SEQMAN_DEBUG << "SegmentMmapper : mmap size = " << m_mmappedSize
+ // << endl;
+}
+
+void SegmentMmapper::init()
+{
+ m_mmappedSize = computeMmappedSize() + sizeof(size_t);
+
+ if (m_mmappedSize > 0) {
+ setFileSize(m_mmappedSize);
+ doMmap();
+ dump();
+ if (m_segment != 0) {
+ SEQMAN_DEBUG << "SegmentMmapper::init : mmap size = " << m_mmappedSize
+ << " for segment " << m_segment->getLabel() << endl;
+ }
+
+ } else {
+ SEQMAN_DEBUG << "SegmentMmapper::init : mmap size = 0 - skipping mmapping for now\n";
+ }
+}
+
+SegmentMmapper::~SegmentMmapper()
+{
+ SEQMAN_DEBUG << "~SegmentMmapper : " << this
+ << " unmapping " << (void*)m_mmappedRegion
+ << " of size " << m_mmappedSize
+ << endl;
+
+ if (m_mmappedRegion && m_mmappedSize)
+ ::munmap(m_mmappedRegion, m_mmappedSize);
+
+ ::close(m_fd);
+ SEQMAN_DEBUG << "~SegmentMmapper : removing " << m_fileName << endl;
+
+ QFile::remove
+ (m_fileName);
+}
+
+bool SegmentMmapper::refresh()
+{
+ bool res = false;
+
+ size_t newMmappedSize = computeMmappedSize() + sizeof(size_t);
+
+ SEQMAN_DEBUG << "SegmentMmapper::refresh() - " << getFileName()
+ << " - m_mmappedRegion = " << (void*)m_mmappedRegion
+ << " - m_mmappedEventBuffer = " << (void*)m_mmappedEventBuffer
+ << " - new size = " << newMmappedSize
+ << " - old size = " << m_mmappedSize
+ << endl;
+
+ // We can't zero out the buffer here because if the mmapped
+ // segment is being read from by the sequencer in the interval of
+ // time between the memset() and the dump(), the sequencer will go
+ // over all the zeros up to the end of the segment and reach its
+ // end, and therefore will stop playing it.
+ //
+
+ if (newMmappedSize != m_mmappedSize) {
+
+ res = true;
+
+ if (newMmappedSize == 0) {
+
+ // nothing to do, just msync and go
+ ::msync(m_mmappedRegion, m_mmappedSize, MS_ASYNC);
+ m_mmappedSize = 0;
+ return true;
+
+ } else {
+
+ setFileSize(newMmappedSize);
+ remap(newMmappedSize);
+ }
+ }
+
+ dump();
+
+ return res;
+}
+
+void SegmentMmapper::setFileSize(size_t size)
+{
+ SEQMAN_DEBUG << "SegmentMmapper::setFileSize() : setting size of "
+ << m_fileName << " to " << size
+ << " - current size = " << m_mmappedSize << endl;
+
+ if (size < m_mmappedSize) {
+
+ // Don't truncate the file here: that will cause trouble for
+ // the sequencer
+ // ftruncate(m_fd, size);
+
+ } else {
+
+ // On linux, ftruncate can enlarge a file, but this isn't specified by POSIX
+ // so go the safe way
+
+ if (size == 0) {
+ SEQMAN_DEBUG << "SegmentMmapper : size == 0 : no resize to do\n";
+ return ;
+ }
+
+ // rewind
+ ::lseek(m_fd, 0, SEEK_SET);
+
+ //
+ // enlarge the file
+ // (seek() to wanted size, then write a byte)
+ //
+ if (::lseek(m_fd, size - 1, SEEK_SET) == -1) {
+ std::cerr << "WARNING: SegmentMmapper : Couldn't lseek in "
+ << m_fileName << " to " << size << std::endl;
+ throw Exception("lseek failed");
+ }
+
+ if (::write(m_fd, "\0", 1) != 1) {
+ std::cerr << "WARNING: SegmentMmapper : Couldn't write byte in "
+ << m_fileName << std::endl;
+ throw Exception("write failed");
+ }
+
+ }
+
+
+}
+
+void SegmentMmapper::remap(size_t newsize)
+{
+ SEQMAN_DEBUG << "SegmentMmapper : remapping " << m_fileName
+ << " from size " << m_mmappedSize
+ << " to size " << newsize << endl;
+
+ if (!m_mmappedRegion) { // nothing to mremap, just mmap
+
+ SEQMAN_DEBUG << "SegmentMmapper : nothing to remap - mmap instead\n";
+ m_mmappedSize = newsize;
+ doMmap();
+
+ } else {
+
+#ifdef linux
+ void *oldBuffer = m_mmappedRegion;
+ m_mmappedRegion = (MappedEvent*)::mremap(m_mmappedRegion, m_mmappedSize,
+ newsize, MREMAP_MAYMOVE);
+ m_mmappedEventBuffer = (MappedEvent *)((size_t *)m_mmappedRegion + 1);
+
+ if (m_mmappedRegion != oldBuffer) {
+ SEQMAN_DEBUG << "NOTE: buffer moved from " << oldBuffer <<
+ " to " << (void *)m_mmappedRegion << endl;
+ }
+#else
+ ::munmap(m_mmappedRegion, m_mmappedSize);
+ m_mmappedRegion = ::mmap(0, newsize,
+ PROT_READ | PROT_WRITE,
+ MAP_SHARED, m_fd, 0);
+ m_mmappedEventBuffer = (MappedEvent *)((size_t *)m_mmappedRegion + 1);
+#endif
+
+ if (m_mmappedRegion == (void*) - 1) {
+ SEQMAN_DEBUG << QString("mremap failed : (%1) %2\n").arg(errno).arg(strerror(errno));
+ throw Exception("mremap failed");
+ }
+
+ m_mmappedSize = newsize;
+ }
+}
+
+void SegmentMmapper::doMmap()
+{
+ //
+ // mmap() file for writing
+ //
+ m_mmappedRegion = ::mmap(0, m_mmappedSize,
+ PROT_READ | PROT_WRITE,
+ MAP_SHARED, m_fd, 0);
+ m_mmappedEventBuffer = (MappedEvent *)((size_t *)m_mmappedRegion + 1);
+
+ if (m_mmappedRegion == (void*) - 1) {
+ SEQMAN_DEBUG << QString("mmap failed : (%1) %2\n").arg(errno).arg(strerror(errno));
+ throw Exception("mmap failed");
+ }
+
+ SEQMAN_DEBUG << "SegmentMmapper::doMmap() - mmap size : " << m_mmappedSize
+ << " at " << (void*)m_mmappedRegion << endl;
+
+}
+
+void SegmentMmapper::dump()
+{
+ Composition &comp = m_doc->getComposition();
+
+ RealTime eventTime;
+ RealTime duration;
+ Track* track = comp.getTrackById(m_segment->getTrack());
+
+ timeT segmentStartTime = m_segment->getStartTime();
+ timeT segmentEndTime = m_segment->getEndMarkerTime();
+ timeT segmentDuration = segmentEndTime - segmentStartTime;
+ timeT repeatEndTime = segmentEndTime;
+
+ int repeatCount = getSegmentRepeatCount();
+
+ if (repeatCount > 0)
+ repeatEndTime = m_segment->getRepeatEndTime();
+
+ MappedEvent* bufPos = m_mmappedEventBuffer;
+
+ for (int repeatNo = 0; repeatNo <= repeatCount; ++repeatNo) {
+
+ Segment *triggered = 0;
+ Segment::iterator *i = 0;
+
+ for (Segment::iterator j = m_segment->begin();
+ m_segment->isBeforeEndMarker(j) || (i && *i != triggered->end()); ) {
+
+ bool usingi = false;
+ Segment::iterator *k = &j;
+
+ if (i && *i != triggered->end() &&
+ (!m_segment->isBeforeEndMarker(j) ||
+ (**i)->getAbsoluteTime() < (*j)->getAbsoluteTime())) {
+ k = i;
+ usingi = true;
+ }
+
+ if (!usingi) { // don't permit nested triggered segments
+
+ long triggerId = -1;
+ (**k)->get
+ <Int>(BaseProperties::TRIGGER_SEGMENT_ID, triggerId);
+
+ if (triggerId >= 0) {
+
+ TriggerSegmentRec *rec =
+ comp.getTriggerSegmentRec(triggerId);
+
+ if (rec && rec->getSegment()) {
+ timeT performanceDuration =
+ SegmentPerformanceHelper(*m_segment).
+ getSoundingDuration(j);
+ if (performanceDuration > 0) {
+ mergeTriggerSegment(&triggered, *j,
+ performanceDuration, rec);
+ size_t sz = addMmappedSize(rec->getSegment());
+ size_t offset = bufPos - m_mmappedEventBuffer;
+ setFileSize(sz);
+ remap(sz);
+ bufPos = m_mmappedEventBuffer + offset;
+ }
+ }
+
+ if (triggered) {
+ if (i)
+ delete i;
+ i = new Segment::iterator
+ (triggered->findTime((*j)->getAbsoluteTime()));
+ }
+
+ // Use the next triggered event (presumably the
+ // first of the current triggered segment) instead
+ // of the one that triggered it
+
+ ++j; // whatever happens, we don't want to write this one
+
+ if (i && *i != triggered->end() &&
+ (!m_segment->isBeforeEndMarker(j) ||
+ ((**i)->getAbsoluteTime() < (*j)->getAbsoluteTime()))) {
+ k = i;
+ usingi = true;
+ } else {
+ // no joy at all
+ continue;
+ }
+ }
+ }
+
+ // Ignore rests
+ //
+ if (!(**k)->isa(Note::EventRestType)) {
+
+ SegmentPerformanceHelper helper
+ (usingi ? *triggered : *m_segment);
+
+ timeT playTime =
+ helper.getSoundingAbsoluteTime(*k) + repeatNo * segmentDuration;
+ if (playTime >= repeatEndTime)
+ break;
+
+ timeT playDuration = helper.getSoundingDuration(*k);
+
+ // Ignore notes without duration -- they're probably in a tied
+ // series but not as first note
+ //
+ if (playDuration > 0 || !(**k)->isa(Note::EventType)) {
+
+ if (playTime + playDuration > repeatEndTime)
+ playDuration = repeatEndTime - playTime;
+
+ playTime = playTime + m_segment->getDelay();
+ eventTime = comp.getElapsedRealTime(playTime);
+
+ // slightly quicker than calling helper.getRealSoundingDuration()
+ duration =
+ comp.getElapsedRealTime(playTime + playDuration) - eventTime;
+
+ eventTime = eventTime + m_segment->getRealTimeDelay();
+
+ try {
+ // Create mapped event in mmapped buffer. The
+ // instrument will be extracted from the ControlBlock
+ // by the sequencer, so we set it to zero here.
+ MappedEvent *mE = new (bufPos)
+ MappedEvent(0,
+ ***k, // three stars! what an accolade
+ eventTime,
+ duration);
+ mE->setTrackId(track->getId());
+
+ if (m_segment->getTranspose() != 0 &&
+ (**k)->isa(Note::EventType)) {
+ mE->setPitch(mE->getPitch() + m_segment->getTranspose());
+ }
+
+ ++bufPos;
+
+ } catch (...) {
+ SEQMAN_DEBUG << "SegmentMmapper::dump - caught exception while trying to create MappedEvent\n";
+ }
+ }
+ }
+
+ ++*k; // increment either i or j, whichever one we just used
+ }
+
+ delete i;
+ delete triggered;
+ }
+
+ // Store the number of events at the start of the shared memory region
+ *(size_t *)m_mmappedRegion = (bufPos - m_mmappedEventBuffer);
+
+ size_t coveredArea = (bufPos - m_mmappedEventBuffer) * sizeof(MappedEvent);
+ memset(bufPos, 0, m_mmappedSize - coveredArea - sizeof(size_t));
+
+ ::msync(m_mmappedRegion, m_mmappedSize, MS_ASYNC);
+}
+
+void
+SegmentMmapper::mergeTriggerSegment(Segment **target,
+ Event *trigger,
+ timeT evDuration,
+ TriggerSegmentRec *rec)
+{
+ if (!rec || !rec->getSegment() || rec->getSegment()->empty())
+ return ;
+ if (!*target)
+ *target = new Segment;
+
+ timeT evTime = trigger->getAbsoluteTime();
+ timeT trStart = rec->getSegment()->getStartTime();
+ timeT trEnd = rec->getSegment()->getEndMarkerTime();
+ timeT trDuration = trEnd - trStart;
+ if (trDuration == 0)
+ return ;
+
+ bool retune = false;
+ std::string timeAdjust = BaseProperties::TRIGGER_SEGMENT_ADJUST_NONE;
+
+ trigger->get
+ <Bool>
+ (BaseProperties::TRIGGER_SEGMENT_RETUNE, retune);
+
+ trigger->get
+ <String>
+ (BaseProperties::TRIGGER_SEGMENT_ADJUST_TIMES, timeAdjust);
+
+ long evPitch = rec->getBasePitch();
+ (void)trigger->get
+ <Int>(BaseProperties::PITCH, evPitch);
+ int pitchDiff = evPitch - rec->getBasePitch();
+
+ long evVelocity = rec->getBaseVelocity();
+ (void)trigger->get
+ <Int>(BaseProperties::VELOCITY, evVelocity);
+ int velocityDiff = evVelocity - rec->getBaseVelocity();
+
+ timeT offset = 0;
+ if (timeAdjust == BaseProperties::TRIGGER_SEGMENT_ADJUST_SYNC_END) {
+ offset = evDuration - trDuration;
+ }
+
+ for (Segment::iterator i = rec->getSegment()->begin();
+ rec->getSegment()->isBeforeEndMarker(i); ++i) {
+
+ timeT t = (*i)->getAbsoluteTime() - trStart;
+ timeT d = (*i)->getDuration();
+
+ if (evDuration != trDuration &&
+ timeAdjust == BaseProperties::TRIGGER_SEGMENT_ADJUST_SQUISH) {
+ t = timeT(double(t * evDuration) / double(trDuration));
+ d = timeT(double(d * evDuration) / double(trDuration));
+ }
+
+ t += evTime + offset;
+
+ if (t < evTime) {
+ if (t + d <= evTime)
+ continue;
+ else {
+ d -= (evTime - t);
+ t = evTime;
+ }
+ }
+
+ if (timeAdjust == BaseProperties::TRIGGER_SEGMENT_ADJUST_SYNC_START) {
+ if (t + d > evTime + evDuration) {
+ if (t >= evTime + evDuration)
+ continue;
+ else {
+ d = evTime + evDuration - t;
+ }
+ }
+ }
+
+ Event *newEvent = new Event(**i, t, d);
+
+ if (retune && newEvent->has(BaseProperties::PITCH)) {
+ int pitch = newEvent->get
+ <Int>(BaseProperties::PITCH) + pitchDiff;
+ if (pitch > 127)
+ pitch = 127;
+ if (pitch < 0)
+ pitch = 0;
+ newEvent->set
+ <Int>(BaseProperties::PITCH, pitch);
+ }
+
+ if (newEvent->has(BaseProperties::VELOCITY)) {
+ int velocity = newEvent->get
+ <Int>(BaseProperties::VELOCITY) + velocityDiff;
+ if (velocity > 127)
+ velocity = 127;
+ if (velocity < 0)
+ velocity = 0;
+ newEvent->set
+ <Int>(BaseProperties::VELOCITY, velocity);
+ }
+
+ (*target)->insert(newEvent);
+ }
+}
+
+unsigned int SegmentMmapper::getSegmentRepeatCount()
+{
+ int repeatCount = 0;
+
+ timeT segmentStartTime = m_segment->getStartTime();
+ timeT segmentEndTime = m_segment->getEndMarkerTime();
+ timeT segmentDuration = segmentEndTime - segmentStartTime;
+ timeT repeatEndTime = segmentEndTime;
+
+ if (m_segment->isRepeating() && segmentDuration > 0) {
+ repeatEndTime = m_segment->getRepeatEndTime();
+ repeatCount = 1 + (repeatEndTime - segmentEndTime) / segmentDuration;
+ }
+
+ return repeatCount;
+}
+
+size_t SegmentMmapper::addMmappedSize(Segment *s)
+{
+ int repeatCount = getSegmentRepeatCount();
+ return m_mmappedSize + (repeatCount + 1) * s->size() * sizeof(MappedEvent);
+}
+
+size_t SegmentMmapper::computeMmappedSize()
+{
+ if (!m_segment) return 0;
+
+ int repeatCount = getSegmentRepeatCount();
+
+ return (repeatCount + 1) * m_segment->size() * sizeof(MappedEvent);
+}
+
+}
diff --git a/src/gui/seqmanager/SegmentMmapper.h b/src/gui/seqmanager/SegmentMmapper.h
new file mode 100644
index 0000000..ab25aab
--- /dev/null
+++ b/src/gui/seqmanager/SegmentMmapper.h
@@ -0,0 +1,112 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_SEGMENTMMAPPER_H_
+#define _RG_SEGMENTMMAPPER_H_
+
+#include <qstring.h>
+#include "base/Event.h"
+
+
+
+
+namespace Rosegarden
+{
+
+class TriggerSegmentRec;
+class Segment;
+class RosegardenGUIDoc;
+class MappedEvent;
+class Event;
+
+
+class SegmentMmapper
+{
+ friend class SegmentMmapperFactory;
+public:
+ virtual ~SegmentMmapper();
+
+ /**
+ * refresh the object after the segment has been modified
+ * returns true if size changed (and thus the sequencer
+ * needs to be told about it
+ */
+ bool refresh();
+
+ QString getFileName() { return m_fileName; }
+ size_t getFileSize() const { return m_mmappedSize; }
+
+ virtual unsigned int getSegmentRepeatCount();
+
+protected:
+ SegmentMmapper(RosegardenGUIDoc*, Segment*,
+ const QString& fileName);
+
+ virtual size_t computeMmappedSize();
+
+ virtual size_t addMmappedSize(Segment *);
+
+ /// actual setup, must be called after ctor, calls virtual methods
+ virtual void init();
+
+ /// set the size of the mmapped file
+ void setFileSize(size_t);
+
+ /// perform the mmap() of the file
+ void doMmap();
+
+ /// mremap() the file after a size change
+ void remap(size_t newsize);
+
+ /// dump all segment data in the file
+ virtual void dump();
+
+ void mergeTriggerSegment(Segment **target,
+ Event *trigger,
+ timeT performanceDuration,
+ TriggerSegmentRec *rec);
+
+ //--------------- Data members ---------------------------------
+ RosegardenGUIDoc* m_doc;
+ Segment* m_segment;
+ QString m_fileName;
+
+ int m_fd;
+ size_t m_mmappedSize;
+
+ // The shared memory region starts with a size_t value
+ // representing the number of MappedEvents that follow.
+ void *m_mmappedRegion;
+
+ // And this points to the next byte in the shared memory region.
+ MappedEvent* m_mmappedEventBuffer;
+};
+
+//----------------------------------------
+
+
+}
+
+#endif
diff --git a/src/gui/seqmanager/SegmentMmapperFactory.cpp b/src/gui/seqmanager/SegmentMmapperFactory.cpp
new file mode 100644
index 0000000..085d842
--- /dev/null
+++ b/src/gui/seqmanager/SegmentMmapperFactory.cpp
@@ -0,0 +1,96 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "SegmentMmapperFactory.h"
+
+#include "base/Segment.h"
+#include "document/RosegardenGUIDoc.h"
+#include "misc/Debug.h"
+#include "MetronomeMmapper.h"
+#include "SegmentMmapper.h"
+#include "AudioSegmentMmapper.h"
+#include "TempoSegmentMmapper.h"
+#include "TimeSigSegmentMmapper.h"
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+SegmentMmapper* SegmentMmapperFactory::makeMmapperForSegment(RosegardenGUIDoc* doc,
+ Rosegarden::Segment* segment,
+ const QString& fileName)
+{
+ SegmentMmapper* mmapper = 0;
+
+ if (segment == 0) {
+ SEQMAN_DEBUG << "SegmentMmapperFactory::makeMmapperForSegment() segment == 0\n";
+ return 0;
+ }
+
+ switch (segment->getType()) {
+ case Segment::Internal :
+ mmapper = new SegmentMmapper(doc, segment, fileName);
+ break;
+ case Segment::Audio :
+ mmapper = new AudioSegmentMmapper(doc, segment, fileName);
+ break;
+ default:
+ SEQMAN_DEBUG << "SegmentMmapperFactory::makeMmapperForSegment(" << segment
+ << ") : can't map, unknown segment type " << segment->getType() << endl;
+ mmapper = 0;
+ }
+
+ if (mmapper)
+ mmapper->init();
+
+ return mmapper;
+}
+
+MetronomeMmapper* SegmentMmapperFactory::makeMetronome(RosegardenGUIDoc* doc)
+{
+ MetronomeMmapper* mmapper = new MetronomeMmapper(doc);
+ mmapper->init();
+
+ return mmapper;
+}
+
+TimeSigSegmentMmapper* SegmentMmapperFactory::makeTimeSig(RosegardenGUIDoc* doc)
+{
+ TimeSigSegmentMmapper* mmapper = new TimeSigSegmentMmapper(doc, "rosegarden_timesig");
+
+ mmapper->init();
+ return mmapper;
+}
+
+TempoSegmentMmapper* SegmentMmapperFactory::makeTempo(RosegardenGUIDoc* doc)
+{
+ TempoSegmentMmapper* mmapper = new TempoSegmentMmapper(doc, "rosegarden_tempo");
+
+ mmapper->init();
+ return mmapper;
+}
+
+}
diff --git a/src/gui/seqmanager/SegmentMmapperFactory.h b/src/gui/seqmanager/SegmentMmapperFactory.h
new file mode 100644
index 0000000..2970024
--- /dev/null
+++ b/src/gui/seqmanager/SegmentMmapperFactory.h
@@ -0,0 +1,63 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_SEGMENTMMAPPERFACTORY_H_
+#define _RG_SEGMENTMMAPPERFACTORY_H_
+
+
+
+class QString;
+
+
+namespace Rosegarden
+{
+
+class TimeSigSegmentMmapper;
+class TempoSegmentMmapper;
+class SegmentMmapper;
+class Segment;
+class RosegardenGUIDoc;
+class MetronomeMmapper;
+
+
+class SegmentMmapperFactory
+{
+public:
+
+ static SegmentMmapper* makeMmapperForSegment(RosegardenGUIDoc*, Segment*,
+ const QString& fileName);
+
+ static MetronomeMmapper* makeMetronome(RosegardenGUIDoc*);
+ static TimeSigSegmentMmapper* makeTimeSig(RosegardenGUIDoc*);
+ static TempoSegmentMmapper* makeTempo(RosegardenGUIDoc*);
+};
+
+//----------------------------------------
+
+
+
+}
+
+#endif
diff --git a/src/gui/seqmanager/SequenceManager.cpp b/src/gui/seqmanager/SequenceManager.cpp
new file mode 100644
index 0000000..12334f6
--- /dev/null
+++ b/src/gui/seqmanager/SequenceManager.cpp
@@ -0,0 +1,2141 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "SequenceManager.h"
+
+#include "sound/Midi.h"
+#include "misc/Debug.h"
+#include "document/ConfigGroups.h"
+#include "base/Composition.h"
+#include "base/Device.h"
+#include "base/Exception.h"
+#include "base/Instrument.h"
+#include "base/MidiProgram.h"
+#include "base/RealTime.h"
+#include "base/Segment.h"
+#include "base/Studio.h"
+#include "base/Track.h"
+#include "base/TriggerSegment.h"
+#include "CompositionMmapper.h"
+#include "document/RosegardenGUIDoc.h"
+#include "document/MultiViewCommandHistory.h"
+#include "gui/application/RosegardenApplication.h"
+#include "gui/application/RosegardenGUIApp.h"
+#include "gui/application/RosegardenGUIView.h"
+#include "gui/dialogs/AudioManagerDialog.h"
+#include "gui/dialogs/CountdownDialog.h"
+#include "gui/dialogs/TransportDialog.h"
+#include "gui/kdeext/KStartupLogo.h"
+#include "gui/studio/StudioControl.h"
+#include "gui/widgets/CurrentProgressDialog.h"
+#include "MetronomeMmapper.h"
+#include "SegmentMmapperFactory.h"
+#include "SequencerMapper.h"
+#include "ControlBlockMmapper.h"
+#include "sound/AudioFile.h"
+#include "sound/MappedComposition.h"
+#include "sound/MappedEvent.h"
+#include "sound/MappedInstrument.h"
+#include "sound/SoundDriver.h"
+#include "TempoSegmentMmapper.h"
+#include "TimeSigSegmentMmapper.h"
+#include <klocale.h>
+#include <kstddirs.h>
+#include <kconfig.h>
+#include <kglobal.h>
+#include <kmessagebox.h>
+#include <qapplication.h>
+#include <qcstring.h>
+#include <qcursor.h>
+#include <qdatastream.h>
+#include <qevent.h>
+#include <qobject.h>
+#include <qpushbutton.h>
+#include <qstring.h>
+#include <qstringlist.h>
+#include <qtimer.h>
+#include <algorithm>
+
+
+namespace Rosegarden
+{
+
+SequenceManager::SequenceManager(RosegardenGUIDoc *doc,
+ TransportDialog *transport):
+ m_doc(doc),
+ m_compositionMmapper(new CompositionMmapper(m_doc)),
+ m_controlBlockMmapper(new ControlBlockMmapper(m_doc)),
+ m_metronomeMmapper(SegmentMmapperFactory::makeMetronome(m_doc)),
+ m_tempoSegmentMmapper(SegmentMmapperFactory::makeTempo(m_doc)),
+ m_timeSigSegmentMmapper(SegmentMmapperFactory::makeTimeSig(m_doc)),
+ m_transportStatus(STOPPED),
+ m_soundDriverStatus(NO_DRIVER),
+ m_transport(transport),
+ m_lastRewoundAt(clock()),
+ m_countdownDialog(0),
+ m_countdownTimer(new QTimer(m_doc)),
+ m_shownOverrunWarning(false),
+ m_recordTime(new QTime()),
+ m_compositionRefreshStatusId(m_doc->getComposition().getNewRefreshStatusId()),
+ m_updateRequested(true),
+ m_compositionMmapperResetTimer(new QTimer(m_doc)),
+ m_sequencerMapper(0),
+ m_reportTimer(new QTimer(m_doc)),
+ m_canReport(true),
+ m_lastLowLatencySwitchSent(false),
+ m_lastTransportStartPosition(0),
+ m_sampleRate(0)
+{
+ // Replaced this with a call to cleanup() from composition mmapper ctor:
+ // if done here, this removes the mmapped versions of any segments stored
+ // in the autoload (that have only just been mapped by the ctor!)
+ // m_compositionMmapper->cleanup();
+
+ m_countdownDialog = new CountdownDialog(dynamic_cast<QWidget*>
+ (m_doc->parent())->parentWidget());
+ // Connect these for use later
+ //
+ connect(m_countdownTimer, SIGNAL(timeout()),
+ this, SLOT(slotCountdownTimerTimeout()));
+
+ connect(m_reportTimer, SIGNAL(timeout()),
+ this, SLOT(slotAllowReport()));
+
+ connect(m_compositionMmapperResetTimer, SIGNAL(timeout()),
+ this, SLOT(slotScheduledCompositionMmapperReset()));
+
+
+ connect(doc->getCommandHistory(), SIGNAL(commandExecuted()),
+ this, SLOT(update()));
+
+ m_doc->getComposition().addObserver(this);
+
+ // The owner of this sequence manager will need to call
+ // checkSoundDriverStatus on it to set up its status appropriately
+ // immediately after construction; we used to do it from here but
+ // we're not well placed to handle reporting to the user if it
+ // throws an exception (and we don't want to leave the object half
+ // constructed).
+
+ // Try to map the sequencer file
+ //
+ mapSequencer();
+}
+
+SequenceManager::~SequenceManager()
+{
+ m_doc->getComposition().removeObserver(this);
+
+ SEQMAN_DEBUG << "SequenceManager::~SequenceManager()\n";
+ delete m_compositionMmapper;
+ delete m_controlBlockMmapper;
+ delete m_metronomeMmapper;
+ delete m_tempoSegmentMmapper;
+ delete m_timeSigSegmentMmapper;
+ delete m_sequencerMapper;
+}
+
+void SequenceManager::setDocument(RosegardenGUIDoc* doc)
+{
+ SEQMAN_DEBUG << "SequenceManager::setDocument(" << doc << ")\n";
+
+ DataBlockRepository::clear();
+
+ m_doc->getComposition().removeObserver(this);
+ disconnect(m_doc->getCommandHistory(), SIGNAL(commandExecuted()));
+
+ m_segments.clear();
+ m_triggerSegments.clear();
+
+ m_doc = doc;
+ Composition &comp = m_doc->getComposition();
+
+ // Must recreate and reconnect the countdown timer and dialog
+ // (bug 729039)
+ //
+ delete m_countdownDialog;
+ delete m_countdownTimer;
+ delete m_compositionMmapperResetTimer;
+
+ m_countdownDialog = new CountdownDialog(dynamic_cast<QWidget*>
+ (m_doc->parent())->parentWidget());
+
+ // Bug 933041: no longer connect the CountdownDialog from
+ // SequenceManager; instead let the RosegardenGUIApp connect it to
+ // its own slotStop to ensure the right housekeeping is done
+
+ m_countdownTimer = new QTimer(m_doc);
+
+ // Connect this for use later
+ //
+ connect(m_countdownTimer, SIGNAL(timeout()),
+ this, SLOT(slotCountdownTimerTimeout()));
+
+ m_compositionRefreshStatusId = comp.getNewRefreshStatusId();
+ comp.addObserver(this);
+
+ connect(m_doc->getCommandHistory(), SIGNAL(commandExecuted()),
+ this, SLOT(update()));
+
+ for (Composition::iterator i = comp.begin(); i != comp.end(); ++i) {
+
+ SEQMAN_DEBUG << "Adding segment with rid " << (*i)->getRuntimeId() << endl;
+
+ m_segments.insert(SegmentRefreshMap::value_type
+ (*i, (*i)->getNewRefreshStatusId()));
+ }
+
+ for (Composition::triggersegmentcontaineriterator i =
+ comp.getTriggerSegments().begin();
+ i != comp.getTriggerSegments().end(); ++i) {
+ m_triggerSegments.insert(SegmentRefreshMap::value_type
+ ((*i)->getSegment(),
+ (*i)->getSegment()->getNewRefreshStatusId()));
+ }
+
+
+ m_compositionMmapperResetTimer = new QTimer(m_doc);
+ connect(m_compositionMmapperResetTimer, SIGNAL(timeout()),
+ this, SLOT(slotScheduledCompositionMmapperReset()));
+
+ resetCompositionMmapper();
+
+ // Try to map the sequencer file
+ //
+ mapSequencer();
+}
+
+void
+SequenceManager::setTransportStatus(const TransportStatus &status)
+{
+ m_transportStatus = status;
+}
+
+void
+SequenceManager::mapSequencer()
+{
+ if (m_sequencerMapper)
+ return ;
+
+ try {
+ m_sequencerMapper = new SequencerMapper(
+ KGlobal::dirs()->resourceDirs("tmp").last() + "/rosegarden_sequencer_timing_block");
+ } catch (Exception) {
+ m_sequencerMapper = 0;
+ }
+}
+
+bool
+SequenceManager::play()
+{
+ mapSequencer();
+
+ Composition &comp = m_doc->getComposition();
+
+ // If already playing or recording then stop
+ //
+ if (m_transportStatus == PLAYING ||
+ m_transportStatus == RECORDING ) {
+ stopping();
+ return true;
+ }
+
+ // This check may throw an exception
+ checkSoundDriverStatus(false);
+
+ // Align Instrument lists and send initial program changes
+ //
+ preparePlayback();
+
+ m_lastTransportStartPosition = comp.getPosition();
+
+ // Update play metronome status
+ //
+ m_controlBlockMmapper->updateMetronomeData
+ (m_metronomeMmapper->getMetronomeInstrument());
+ m_controlBlockMmapper->updateMetronomeForPlayback();
+
+ // make sure we toggle the play button
+ //
+ m_transport->PlayButton()->setOn(true);
+
+ //!!! disable the record button, because recording while playing is horribly
+ // broken, and disabling it is less complicated than fixing it
+ // see #1223025 - DMM
+ // SEQMAN_DEBUG << "SequenceManager::play() - disabling record button, as we are playing\n";
+ // m_transport->RecordButton()->setEnabled(false);
+
+ if (comp.getCurrentTempo() == 0) {
+ comp.setCompositionDefaultTempo(comp.getTempoForQpm(120.0));
+
+ SEQMAN_DEBUG << "SequenceManager::play() - setting Tempo to Default value of 120.000\n";
+ } else {
+ SEQMAN_DEBUG << "SequenceManager::play() - starting to play\n";
+ }
+
+ // Send initial tempo
+ //
+ double qnD = 60.0 / comp.getTempoQpm(comp.getCurrentTempo());
+ RealTime qnTime =
+ RealTime(long(qnD),
+ long((qnD - double(long(qnD))) * 1000000000.0));
+ StudioControl::sendQuarterNoteLength(qnTime);
+
+ // set the tempo in the transport
+ m_transport->setTempo(comp.getCurrentTempo());
+
+ // The arguments for the Sequencer
+ RealTime startPos = comp.getElapsedRealTime(comp.getPosition());
+
+ // If we're looping then jump to loop start
+ if (comp.isLooping())
+ startPos = comp.getElapsedRealTime(comp.getLoopStart());
+
+ KConfig* config = kapp->config();
+ config->setGroup(SequencerOptionsConfigGroup);
+
+ bool lowLat = config->readBoolEntry("audiolowlatencymonitoring", true);
+
+ if (lowLat != m_lastLowLatencySwitchSent) {
+
+ QByteArray data;
+ QDataStream streamOut(data, IO_WriteOnly);
+ streamOut << lowLat;
+
+ rgapp->sequencerSend("setLowLatencyMode(bool)", data);
+ m_lastLowLatencySwitchSent = lowLat;
+ }
+
+ QByteArray data;
+ QCString replyType;
+ QByteArray replyData;
+ QDataStream streamOut(data, IO_WriteOnly);
+
+ // playback start position
+ streamOut << (long)startPos.sec;
+ streamOut << (long)startPos.nsec;
+
+ // Apart from perhaps the small file size, I think with hindsight
+ // that these options are more easily set to reasonable defaults
+ // here than left to the user. Mostly.
+
+ //!!! need some cleverness somewhere to ensure the read-ahead
+ //is larger than the JACK period size
+
+ if (lowLat) {
+ streamOut << 0L; // read-ahead sec
+ streamOut << 160000000L; // read-ahead nsec
+ streamOut << 0L; // audio mix sec
+ streamOut << 60000000L; // audio mix nsec: ignored in lowlat mode
+ streamOut << 2L; // audio read sec
+ streamOut << 500000000L; // audio read nsec
+ streamOut << 4L; // audio write sec
+ streamOut << 0L; // audio write nsec
+ streamOut << 256L; // cacheable small file size in K
+ } else {
+ streamOut << 0L; // read-ahead sec
+ streamOut << 500000000L; // read-ahead nsec
+ streamOut << 0L; // audio mix sec
+ streamOut << 400000000L; // audio mix nsec
+ streamOut << 2L; // audio read sec
+ streamOut << 500000000L; // audio read nsec
+ streamOut << 4L; // audio write sec
+ streamOut << 0L; // audio write nsec
+ streamOut << 256L; // cacheable small file size in K
+ }
+
+ // Send Play to the Sequencer
+ if (!rgapp->sequencerCall("play(long int, long int, long int, long int, long int, long int, long int, long int, long int, long int, long int)",
+ replyType, replyData, data)) {
+ m_transportStatus = STOPPED;
+ return false;
+ }
+
+ // ensure the return type is ok
+ QDataStream streamIn(replyData, IO_ReadOnly);
+ int result;
+ streamIn >> result;
+
+ if (result) {
+ // completed successfully
+ m_transportStatus = STARTING_TO_PLAY;
+ } else {
+ m_transportStatus = STOPPED;
+ std::cerr << "ERROR: SequenceManager::play(): Failed to start playback!" << std::endl;
+ }
+
+ return false;
+}
+
+void
+SequenceManager::stopping()
+{
+ if (m_countdownTimer)
+ m_countdownTimer->stop();
+ if (m_countdownDialog)
+ m_countdownDialog->hide();
+
+ // Do this here rather than in stop() to avoid any potential
+ // race condition (we use setPointerPosition() during stop()).
+ //
+ if (m_transportStatus == STOPPED) {
+ /*!!!
+ if (m_doc->getComposition().isLooping())
+ m_doc->slotSetPointerPosition(m_doc->getComposition().getLoopStart());
+ else
+ m_doc->slotSetPointerPosition(m_doc->getComposition().getStartMarker());
+ */
+ m_doc->slotSetPointerPosition(m_lastTransportStartPosition);
+
+ return ;
+ }
+
+ // Disarm recording and drop back to STOPPED
+ //
+ if (m_transportStatus == RECORDING_ARMED) {
+ m_transportStatus = STOPPED;
+ m_transport->RecordButton()->setOn(false);
+ m_transport->MetronomeButton()->
+ setOn(m_doc->getComposition().usePlayMetronome());
+ return ;
+ }
+
+ SEQMAN_DEBUG << "SequenceManager::stopping() - preparing to stop\n";
+
+ // SEQMAN_DEBUG << kdBacktrace() << endl;
+
+ stop();
+
+ m_shownOverrunWarning = false;
+}
+
+void
+SequenceManager::stop()
+{
+ // Toggle off the buttons - first record
+ //
+ if (m_transportStatus == RECORDING) {
+ m_transport->RecordButton()->setOn(false);
+ m_transport->MetronomeButton()->
+ setOn(m_doc->getComposition().usePlayMetronome());
+
+ // Remove the countdown dialog and stop the timer
+ //
+ m_countdownDialog->hide();
+ m_countdownTimer->stop();
+ }
+
+ // Now playback
+ m_transport->PlayButton()->setOn(false);
+
+ // re-enable the record button if it was previously disabled when
+ // going into play mode - DMM
+ // SEQMAN_DEBUG << "SequenceManager::stop() - re-enabling record button\n";
+ // m_transport->RecordButton()->setEnabled(true);
+
+
+ // "call" the sequencer with a stop so we get a synchronous
+ // response - then we can fiddle about with the audio file
+ // without worrying about the sequencer causing problems
+ // with access to the same audio files.
+ //
+
+ // wait cursor
+ //
+ QApplication::setOverrideCursor(QCursor(Qt::waitCursor));
+
+ QCString replyType;
+ QByteArray replyData;
+
+ bool failed = false;
+ if (!rgapp->sequencerCall("stop()", replyType, replyData)) {
+ failed = true;
+ }
+
+ // restore
+ QApplication::restoreOverrideCursor();
+
+ TransportStatus status = m_transportStatus;
+
+ // set new transport status first, so that if we're stopping
+ // recording we don't risk the record segment being restored by a
+ // timer while the document is busy trying to do away with it
+ m_transportStatus = STOPPED;
+
+ // if we're recording MIDI or Audio then tidy up the recording Segment
+ if (status == RECORDING) {
+ m_doc->stopRecordingMidi();
+ m_doc->stopRecordingAudio();
+
+ SEQMAN_DEBUG << "SequenceManager::stop() - stopped recording\n";
+ }
+
+ // always untoggle the play button at this stage
+ //
+ m_transport->PlayButton()->setOn(false);
+ SEQMAN_DEBUG << "SequenceManager::stop() - stopped playing\n";
+
+ // We don't reset controllers at this point - what happens with static
+ // controllers the next time we play otherwise? [rwb]
+ //resetControllers();
+
+ if (failed) {
+ throw(Exception("Failed to contact Rosegarden sequencer with stop command. Please save your composition and restart Rosegarden to continue."));
+ }
+}
+
+void
+SequenceManager::rewind()
+{
+ Composition &composition = m_doc->getComposition();
+
+ timeT position = composition.getPosition();
+ std::pair<timeT, timeT> barRange =
+ composition.getBarRangeForTime(position - 1);
+
+ if (m_transportStatus == PLAYING) {
+
+ // if we're playing and we had a rewind request less than 200ms
+ // ago and we're some way into the bar but less than half way
+ // through it, rewind two barlines instead of one
+
+ clock_t now = clock();
+ int elapsed = (now - m_lastRewoundAt) * 1000 / CLOCKS_PER_SEC;
+
+ SEQMAN_DEBUG << "That was " << m_lastRewoundAt << ", this is " << now << ", elapsed is " << elapsed << endl;
+
+ if (elapsed >= 0 && elapsed <= 200) {
+ if (position > barRange.first &&
+ position < barRange.second &&
+ position <= (barRange.first + (barRange.second -
+ barRange.first) / 2)) {
+ barRange = composition.getBarRangeForTime(barRange.first - 1);
+ }
+ }
+
+ m_lastRewoundAt = now;
+ }
+
+ if (barRange.first < composition.getStartMarker()) {
+ m_doc->slotSetPointerPosition(composition.getStartMarker());
+ } else {
+ m_doc->slotSetPointerPosition(barRange.first);
+ }
+}
+
+void
+SequenceManager::fastforward()
+{
+ Composition &composition = m_doc->getComposition();
+
+ timeT position = composition.getPosition() + 1;
+ timeT newPosition = composition.getBarRangeForTime(position).second;
+
+ // Don't skip past end marker
+ //
+ if (newPosition > composition.getEndMarker())
+ newPosition = composition.getEndMarker();
+
+ m_doc->slotSetPointerPosition(newPosition);
+
+}
+
+void
+SequenceManager::notifySequencerStatus(TransportStatus status)
+{
+ // for the moment we don't do anything fancy
+ m_transportStatus = status;
+
+}
+
+void
+SequenceManager::sendSequencerJump(const RealTime &time)
+{
+ QByteArray data;
+ QDataStream streamOut(data, IO_WriteOnly);
+ streamOut << (long)time.sec;
+ streamOut << (long)time.nsec;
+
+ rgapp->sequencerSend("jumpTo(long int, long int)", data);
+}
+
+void
+SequenceManager::record(bool toggled)
+{
+ mapSequencer();
+
+ SEQMAN_DEBUG << "SequenceManager::record(" << toggled << ")" << endl;
+
+ Composition &comp = m_doc->getComposition();
+ Studio &studio = m_doc->getStudio();
+ KConfig* config = kapp->config();
+ config->setGroup(GeneralOptionsConfigGroup);
+
+ bool punchIn = false; // are we punching in?
+
+ // If we have any audio tracks armed, then we need to check for
+ // a valid audio record path and a working audio subsystem before
+ // we go any further
+
+ const Composition::recordtrackcontainer &recordTracks =
+ comp.getRecordTracks();
+
+ for (Composition::recordtrackcontainer::const_iterator i =
+ recordTracks.begin();
+ i != recordTracks.end(); ++i) {
+
+ Track *track = comp.getTrackById(*i);
+ InstrumentId instrId = track->getInstrument();
+ Instrument *instr = studio.getInstrumentById(instrId);
+
+ if (instr && instr->getType() == Instrument::Audio) {
+ if (!m_doc || !(m_soundDriverStatus & AUDIO_OK)) {
+ m_transport->RecordButton()->setOn(false);
+ throw(Exception("Audio subsystem is not available - can't record audio"));
+ }
+ // throws BadAudioPathException if path is not valid:
+ m_doc->getAudioFileManager().testAudioPath();
+ break;
+ }
+ }
+
+ if (toggled) { // preparing record or punch-in record
+
+ if (m_transportStatus == RECORDING_ARMED) {
+ SEQMAN_DEBUG << "SequenceManager::record - unarming record\n";
+ m_transportStatus = STOPPED;
+
+ // Toggle the buttons
+ m_transport->MetronomeButton()->setOn(comp.usePlayMetronome());
+ m_transport->RecordButton()->setOn(false);
+
+ return ;
+ }
+
+ if (m_transportStatus == STOPPED) {
+ SEQMAN_DEBUG << "SequenceManager::record - armed record\n";
+ m_transportStatus = RECORDING_ARMED;
+
+ // Toggle the buttons
+ m_transport->MetronomeButton()->setOn(comp.useRecordMetronome());
+ m_transport->RecordButton()->setOn(true);
+
+ return ;
+ }
+
+ if (m_transportStatus == RECORDING) {
+ SEQMAN_DEBUG << "SequenceManager::record - stop recording and keep playing\n";
+
+ QByteArray data;
+ QCString replyType;
+ QByteArray replyData;
+
+ // Send Record to the Sequencer to signal it to drop out of record mode
+ if (!rgapp->sequencerCall("punchOut()", replyType, replyData, data)) {
+ SEQMAN_DEBUG << "SequenceManager::record - the \"not very plausible\" code executed\n";
+ // #1797873 - set new transport status first, so that
+ // if we're stopping recording we don't risk the
+ // record segment being restored by a timer while the
+ // document is busy trying to do away with it
+ m_transportStatus = STOPPED;
+
+ m_doc->stopRecordingMidi();
+ m_doc->stopRecordingAudio();
+ return ;
+ }
+
+ // #1797873 - as above
+ m_transportStatus = PLAYING;
+
+ m_doc->stopRecordingMidi();
+ m_doc->stopRecordingAudio();
+
+ return ;
+ }
+
+ if (m_transportStatus == PLAYING) {
+ SEQMAN_DEBUG << "SequenceManager::record - punch in recording\n";
+ punchIn = true;
+ goto punchin;
+ }
+
+ } else {
+
+ m_lastTransportStartPosition = comp.getPosition();
+
+punchin:
+
+ // Get the record tracks and check we have a record instrument
+
+ bool haveInstrument = false;
+ bool haveAudioInstrument = false;
+ bool haveMIDIInstrument = false;
+ //TrackId recordMIDITrack = 0;
+
+ for (Composition::recordtrackcontainer::const_iterator i =
+ comp.getRecordTracks().begin();
+ i != comp.getRecordTracks().end(); ++i) {
+
+ InstrumentId iid =
+ comp.getTrackById(*i)->getInstrument();
+
+ Instrument *inst = studio.getInstrumentById(iid);
+ if (inst) {
+ haveInstrument = true;
+ if (inst->getType() == Instrument::Audio) {
+ haveAudioInstrument = true;
+ break;
+ } else { // soft synths count as MIDI for our purposes here
+ haveMIDIInstrument = true;
+ //recordMIDITrack = *i;
+ }
+ }
+ }
+
+ if (!haveInstrument) {
+ m_transport->RecordButton()->setDown(false);
+ throw(Exception("No Record instrument selected"));
+ }
+
+ // may throw an exception
+ checkSoundDriverStatus(false);
+
+ // toggle the Metronome button if it's in use
+ m_transport->MetronomeButton()->setOn(comp.useRecordMetronome());
+
+ // Update record metronome status
+ //
+ m_controlBlockMmapper->updateMetronomeData
+ (m_metronomeMmapper->getMetronomeInstrument());
+ m_controlBlockMmapper->updateMetronomeForRecord();
+
+ // If we are looping then jump to start of loop and start recording,
+ // if we're not take off the number of count-in bars and start
+ // recording.
+ //
+ if (comp.isLooping())
+ m_doc->slotSetPointerPosition(comp.getLoopStart());
+ else {
+ if (m_transportStatus != RECORDING_ARMED && punchIn == false) {
+ int startBar = comp.getBarNumber(comp.getPosition());
+ startBar -= config->readUnsignedNumEntry("countinbars", 0);
+ m_doc->slotSetPointerPosition(comp.getBarRange(startBar).first);
+ }
+ }
+
+ m_doc->setRecordStartTime(m_doc->getComposition().getPosition());
+
+ if (haveAudioInstrument) {
+ // Ask the document to update its record latencies so as to
+ // do latency compensation when we stop
+ m_doc->updateAudioRecordLatency();
+ }
+
+ if (haveMIDIInstrument) {
+ // Create the record MIDI segment now, so that the
+ // composition view has a real segment to display. It
+ // won't actually be added to the composition until the
+ // first recorded event arrives. We don't have to do this
+ // from here for audio, because for audio the sequencer
+ // calls back on createRecordAudioFiles so as to find out
+ // what files it needs to write to.
+ /*m_doc->addRecordMIDISegment(recordMIDITrack);*/
+ for (Composition::recordtrackcontainer::const_iterator i =
+ comp.getRecordTracks().begin(); i != comp.getRecordTracks().end(); ++i) {
+ InstrumentId iid = comp.getTrackById(*i)->getInstrument();
+ Instrument *inst = studio.getInstrumentById(iid);
+ if (inst && (inst->getType() != Instrument::Audio)) {
+ SEQMAN_DEBUG << "SequenceManager: mdoc->addRecordMIDISegment(" << *i << ")" << endl;
+ m_doc->addRecordMIDISegment(*i);
+ }
+ }
+ }
+
+ // set the buttons
+ m_transport->RecordButton()->setOn(true);
+ m_transport->PlayButton()->setOn(true);
+
+ if (comp.getCurrentTempo() == 0) {
+ SEQMAN_DEBUG << "SequenceManager::play() - setting Tempo to Default value of 120.000\n";
+ comp.setCompositionDefaultTempo(comp.getTempoForQpm(120.0));
+ } else {
+ SEQMAN_DEBUG << "SequenceManager::record() - starting to record\n";
+ }
+
+ // set the tempo in the transport
+ //
+ m_transport->setTempo(comp.getCurrentTempo());
+
+ // The arguments for the Sequencer - record is similar to playback,
+ // we must being playing to record.
+ //
+ RealTime startPos =
+ comp.getElapsedRealTime(comp.getPosition());
+
+ bool lowLat = config->readBoolEntry("audiolowlatencymonitoring", true);
+
+ if (lowLat != m_lastLowLatencySwitchSent) {
+
+ QByteArray data;
+ QDataStream streamOut(data, IO_WriteOnly);
+ streamOut << lowLat;
+
+ rgapp->sequencerSend("setLowLatencyMode(bool)", data);
+ m_lastLowLatencySwitchSent = lowLat;
+ }
+
+ QByteArray data;
+ QCString replyType;
+ QByteArray replyData;
+ QDataStream streamOut(data, IO_WriteOnly);
+
+ // playback start position
+ streamOut << (long)startPos.sec;
+ streamOut << (long)startPos.nsec;
+
+ // Apart from perhaps the small file size, I think with hindsight
+ // that these options are more easily set to reasonable defaults
+ // here than left to the user. Mostly.
+
+ //!!! Duplicates code in play()
+
+ //!!! need some cleverness somewhere to ensure the read-ahead
+ //is larger than the JACK period size
+
+ if (lowLat) {
+ streamOut << 0L; // read-ahead sec
+ streamOut << 160000000L; // read-ahead nsec
+ streamOut << 0L; // audio mix sec
+ streamOut << 60000000L; // audio mix nsec: ignored in lowlat mode
+ streamOut << 2L; // audio read sec
+ streamOut << 500000000L; // audio read nsec
+ streamOut << 4L; // audio write sec
+ streamOut << 0L; // audio write nsec
+ streamOut << 256L; // cacheable small file size in K
+ } else {
+ streamOut << 0L; // read-ahead sec
+ streamOut << 500000000L; // read-ahead nsec
+ streamOut << 0L; // audio mix sec
+ streamOut << 400000000L; // audio mix nsec
+ streamOut << 2L; // audio read sec
+ streamOut << 500000000L; // audio read nsec
+ streamOut << 4L; // audio write sec
+ streamOut << 0L; // audio write nsec
+ streamOut << 256L; // cacheable small file size in K
+ }
+
+ // record type
+ streamOut << (long)STARTING_TO_RECORD;
+
+ // Send Play to the Sequencer
+ if (!rgapp->sequencerCall("record(long int, long int, long int, long int, long int, long int, long int, long int, long int, long int, long int, long int)",
+ replyType, replyData, data)) {
+ // failed
+ m_transportStatus = STOPPED;
+ return ;
+ }
+
+ // ensure the return type is ok
+ QDataStream streamIn(replyData, IO_ReadOnly);
+ int result;
+ streamIn >> result;
+
+ if (result) {
+
+ // completed successfully
+ m_transportStatus = STARTING_TO_RECORD;
+
+ // Create the countdown timer dialog to show recording time
+ // remaining. (Note (dmm) this has changed, and it now reports
+ // the time remaining during both MIDI and audio recording.)
+ //
+ timeT p = comp.getPosition();
+ timeT d = comp.getEndMarker();
+ // end marker less current position == available duration
+ d -= p;
+
+ // set seconds to total possible time, initially
+ RealTime rtd = comp.getElapsedRealTime(d);
+ int seconds = rtd.sec;
+
+ // re-initialise
+ m_countdownDialog->setTotalTime(seconds);
+
+ // Create the timer
+ //
+ m_recordTime->start();
+
+ // Start an elapse timer for updating the dialog -
+ // it will fire every second.
+ //
+ m_countdownTimer->start(1000);
+
+ // Pop-up the dialog (don't use exec())
+ //
+ // bug #1505805, abolish recording countdown dialog
+ //m_countdownDialog->show();
+
+ } else {
+ // Stop immediately - turn off buttons in parent
+ //
+ m_transportStatus = STOPPED;
+
+ if (haveAudioInstrument) {
+ throw(Exception("Couldn't start recording audio.\nPlease set a valid file path in the Document Properties\n(Composition menu -> Edit Document Properties -> Audio)."));
+ }
+ }
+ }
+}
+
+void
+SequenceManager::processAsynchronousMidi(const MappedComposition &mC,
+ AudioManagerDialog *audioManagerDialog)
+{
+ static bool boolShowingWarning = false;
+ static bool boolShowingALSAWarning = false;
+ static long warningShownAt = 0;
+
+ if (m_doc == 0 || mC.size() == 0)
+ return ;
+
+ MappedComposition::const_iterator i;
+
+ // Thru filtering is done at the sequencer for the actual sound
+ // output, but here we need both filtered (for OUT display) and
+ // unfiltered (for insertable note callbacks) compositions, so
+ // we've received the unfiltered copy and will filter here
+ MappedComposition tempMC =
+ applyFiltering(mC,
+ MappedEvent::MappedEventType(
+ m_doc->getStudio().getMIDIThruFilter()));
+
+ // send to the MIDI labels (which can only hold one event at a time)
+ i = mC.begin();
+ if (i != mC.end()) {
+ m_transport->setMidiInLabel(*i);
+ }
+
+ i = tempMC.begin();
+ while (i != tempMC.end()) {
+ if ((*i)->getRecordedDevice() != Device::CONTROL_DEVICE) {
+ m_transport->setMidiOutLabel(*i);
+ break;
+ }
+ ++i;
+ }
+
+ for (i = mC.begin(); i != mC.end(); ++i ) {
+ if ((*i)->getType() >= MappedEvent::Audio) {
+ if ((*i)->getType() == MappedEvent::AudioStopped) {
+ /*
+ SEQMAN_DEBUG << "AUDIO FILE ID = "
+ << int((*i)->getData1())
+ << " - FILE STOPPED - "
+ << "INSTRUMENT = "
+ << (*i)->getInstrument()
+ << endl;
+ */
+
+ if (audioManagerDialog && (*i)->getInstrument() ==
+ m_doc->getStudio().getAudioPreviewInstrument()) {
+ audioManagerDialog->
+ closePlayingDialog(
+ AudioFileId((*i)->getData1()));
+ }
+ }
+
+ if ((*i)->getType() == MappedEvent::AudioLevel)
+ sendAudioLevel(*i);
+
+ if ((*i)->getType() ==
+ MappedEvent::AudioGeneratePreview) {
+ SEQMAN_DEBUG << "Received AudioGeneratePreview: data1 is " << int((*i)->getData1()) << ", data2 " << int((*i)->getData2()) << ", instrument is " << (*i)->getInstrument() << endl;
+
+ m_doc->finalizeAudioFile((int)(*i)->getData1() +
+ (int)(*i)->getData2() * 256);
+ }
+
+ if ((*i)->getType() ==
+ MappedEvent::SystemUpdateInstruments) {
+ // resync Devices and Instruments
+ //
+ m_doc->syncDevices();
+
+ /*KConfig* config = kapp->config();
+ config->setGroup(SequencerOptionsConfigGroup);
+ QString recordDeviceStr = config->readEntry("midirecorddevice");
+ sendMIDIRecordingDevice(recordDeviceStr);*/
+ restoreRecordSubscriptions();
+ }
+
+ if (m_transportStatus == PLAYING ||
+ m_transportStatus == RECORDING) {
+ if ((*i)->getType() == MappedEvent::SystemFailure) {
+
+ SEQMAN_DEBUG << "Failure of some sort..." << endl;
+
+ bool handling = true;
+
+ /* These are the ones that we always report or handle. */
+
+ if ((*i)->getData1() == MappedEvent::FailureJackDied) {
+
+ // Something horrible has happened to JACK or we got
+ // bumped out of the graph. Either way stop playback.
+ //
+ stopping();
+
+ } else if ((*i)->getData1() == MappedEvent::FailureJackRestartFailed) {
+
+ KMessageBox::error(
+ dynamic_cast<QWidget*>(m_doc->parent())->parentWidget(),
+ i18n("The JACK Audio subsystem has failed or it has stopped Rosegarden from processing audio.\nPlease restart Rosegarden to continue working with audio.\nQuitting other running applications may improve Rosegarden's performance."));
+
+ } else if ((*i)->getData1() == MappedEvent::FailureJackRestart) {
+
+ KMessageBox::error(
+ dynamic_cast<QWidget*>(m_doc->parent())->parentWidget(),
+ i18n("The JACK Audio subsystem has stopped Rosegarden from processing audio, probably because of a processing overload.\nAn attempt to restart the audio service has been made, but some problems may remain.\nQuitting other running applications may improve Rosegarden's performance."));
+
+ } else if ((*i)->getData1() == MappedEvent::FailureCPUOverload) {
+
+#define REPORT_CPU_OVERLOAD 1
+#ifdef REPORT_CPU_OVERLOAD
+
+ stopping();
+
+ KMessageBox::error(
+ dynamic_cast<QWidget*>(m_doc->parent())->parentWidget(),
+ i18n("Run out of processor power for real-time audio processing. Cannot continue."));
+
+#endif
+
+ } else {
+
+ handling = false;
+ }
+
+ if (handling)
+ continue;
+
+ if (!m_canReport) {
+ SEQMAN_DEBUG << "Not reporting it to user just yet"
+ << endl;
+ continue;
+ }
+
+ if ((*i)->getData1() == MappedEvent::FailureALSACallFailed) {
+
+ struct timeval tv;
+ (void)gettimeofday(&tv, 0);
+
+ if (tv.tv_sec - warningShownAt >= 5 &&
+ !boolShowingALSAWarning) {
+
+ QString message = i18n("A serious error has occurred in the ALSA MIDI subsystem. It may not be possible to continue sequencing. Please check console output for more information.");
+ boolShowingALSAWarning = true;
+
+ KMessageBox::information(0, message);
+ boolShowingALSAWarning = false;
+
+ (void)gettimeofday(&tv, 0);
+ warningShownAt = tv.tv_sec;
+ }
+
+ } else if ((*i)->getData1() == MappedEvent::FailureXRuns) {
+
+ //#define REPORT_XRUNS 1
+#ifdef REPORT_XRUNS
+
+ struct timeval tv;
+ (void)gettimeofday(&tv, 0);
+
+ if (tv.tv_sec - warningShownAt >= 5 &&
+ !boolShowingWarning) {
+
+ QString message = i18n("JACK Audio subsystem is losing sample frames.");
+ boolShowingWarning = true;
+
+ KMessageBox::information(0, message);
+ boolShowingWarning = false;
+
+ (void)gettimeofday(&tv, 0);
+ warningShownAt = tv.tv_sec;
+ }
+#endif
+
+ } else if (!m_shownOverrunWarning) {
+
+ QString message;
+
+ switch ((*i)->getData1()) {
+
+ case MappedEvent::FailureDiscUnderrun:
+ message = i18n("Failed to read audio data from disc in time to service the audio subsystem.");
+ break;
+
+ case MappedEvent::FailureDiscOverrun:
+ message = i18n("Failed to write audio data to disc fast enough to service the audio subsystem.");
+ break;
+
+ case MappedEvent::FailureBussMixUnderrun:
+ message = i18n("The audio mixing subsystem is failing to keep up.");
+ break;
+
+ case MappedEvent::FailureMixUnderrun:
+ message = i18n("The audio subsystem is failing to keep up.");
+ break;
+
+ default:
+ message = i18n("Unknown sequencer failure mode!");
+ break;
+ }
+
+ m_shownOverrunWarning = true;
+
+#ifdef REPORT_XRUNS
+
+ KMessageBox::information(0, message);
+#else
+
+ if ((*i)->getData1() == MappedEvent::FailureDiscOverrun) {
+ // the error you can't hear
+ KMessageBox::information(0, message);
+ } else {
+ std::cerr << message << std::endl;
+ }
+#endif
+
+ }
+
+ // Turn off the report flag and set off a one-shot
+ // timer for 5 seconds.
+ //
+ if (!m_reportTimer->isActive()) {
+ m_canReport = false;
+ m_reportTimer->start(5000, true);
+ }
+ }
+ } else {
+ KStartupLogo::hideIfStillThere();
+
+ if ((*i)->getType() == MappedEvent::SystemFailure) {
+
+ if ((*i)->getData1() == MappedEvent::FailureJackRestartFailed) {
+
+ KMessageBox::error(
+ dynamic_cast<QWidget*>(m_doc->parent()),
+ i18n("The JACK Audio subsystem has failed or it has stopped Rosegarden from processing audio.\nPlease restart Rosegarden to continue working with audio.\nQuitting other running applications may improve Rosegarden's performance."));
+
+ } else if ((*i)->getData1() == MappedEvent::FailureJackRestart) {
+
+ KMessageBox::error(
+ dynamic_cast<QWidget*>(m_doc->parent()),
+ i18n("The JACK Audio subsystem has stopped Rosegarden from processing audio, probably because of a processing overload.\nAn attempt to restart the audio service has been made, but some problems may remain.\nQuitting other running applications may improve Rosegarden's performance."));
+
+ } else if ((*i)->getData1() == MappedEvent::WarningImpreciseTimer &&
+ shouldWarnForImpreciseTimer()) {
+
+ std::cerr << "Rosegarden: WARNING: No accurate sequencer timer available" << std::endl;
+
+ KStartupLogo::hideIfStillThere();
+ CurrentProgressDialog::freeze();
+
+ RosegardenGUIApp::self()->awaitDialogClearance();
+
+ KMessageBox::information(
+ dynamic_cast<QWidget*>(m_doc->parent()),
+ i18n("<h3>System timer resolution is too low</h3><p>Rosegarden was unable to find a high-resolution timing source for MIDI performance.</p><p>This may mean you are using a Linux system with the kernel timer resolution set too low. Please contact your Linux distributor for more information.</p><p>Some Linux distributors already provide low latency kernels, see <a href=\"http://rosegarden.wiki.sourceforge.net/Low+latency+kernels\">http://rosegarden.wiki.sourceforge.net/Low+latency+kernels</a> for instructions.</p>"),
+ NULL, NULL,
+ KMessageBox::Notify + KMessageBox::AllowLink);
+
+ CurrentProgressDialog::thaw();
+
+ } else if ((*i)->getData1() == MappedEvent::WarningImpreciseTimerTryRTC &&
+ shouldWarnForImpreciseTimer()) {
+
+ std::cerr << "Rosegarden: WARNING: No accurate sequencer timer available" << std::endl;
+
+ KStartupLogo::hideIfStillThere();
+ CurrentProgressDialog::freeze();
+
+ RosegardenGUIApp::self()->awaitDialogClearance();
+
+ KMessageBox::information(
+ dynamic_cast<QWidget*>(m_doc->parent()),
+ i18n("<h3>System timer resolution is too low</h3><p>Rosegarden was unable to find a high-resolution timing source for MIDI performance.</p><p>You may be able to solve this problem by loading the RTC timer kernel module. To do this, try running <b>sudo modprobe snd-rtctimer</b> in a terminal window and then restarting Rosegarden.</p><p>Alternatively, check whether your Linux distributor provides a multimedia-optimized kernel. See <a href=\"http://rosegarden.wiki.sourceforge.net/Low+latency+kernels\">http://rosegarden.wiki.sourceforge.net/Low+latency+kernels</a> for notes about this.</p>"),
+ NULL, NULL,
+ KMessageBox::Notify + KMessageBox::AllowLink);
+
+ CurrentProgressDialog::thaw();
+ }
+ }
+ }
+ }
+ }
+
+ // if we aren't playing or recording, consider invoking any
+ // step-by-step clients (using unfiltered composition). send
+ // out any incoming external controller events
+
+ for (i = mC.begin(); i != mC.end(); ++i ) {
+ if (m_transportStatus == STOPPED ||
+ m_transportStatus == RECORDING_ARMED) {
+ if ((*i)->getType() == MappedEvent::MidiNote) {
+ if ((*i)->getVelocity() == 0) {
+ emit insertableNoteOffReceived((*i)->getPitch(), (*i)->getVelocity());
+ } else {
+ emit insertableNoteOnReceived((*i)->getPitch(), (*i)->getVelocity());
+ }
+ }
+ }
+ if ((*i)->getRecordedDevice() == Device::CONTROL_DEVICE) {
+ SEQMAN_DEBUG << "controllerDeviceEventReceived" << endl;
+ emit controllerDeviceEventReceived(*i);
+ }
+ }
+}
+
+void
+SequenceManager::rewindToBeginning()
+{
+ SEQMAN_DEBUG << "SequenceManager::rewindToBeginning()\n";
+ m_doc->slotSetPointerPosition(m_doc->getComposition().getStartMarker());
+}
+
+void
+SequenceManager::fastForwardToEnd()
+{
+ SEQMAN_DEBUG << "SequenceManager::fastForwardToEnd()\n";
+
+ Composition &comp = m_doc->getComposition();
+ m_doc->slotSetPointerPosition(comp.getDuration());
+}
+
+void
+SequenceManager::setLoop(const timeT &lhs, const timeT &rhs)
+{
+ // do not set a loop if JACK transport sync is enabled, because this is
+ // completely broken, and apparently broken due to a limitation of JACK
+ // transport itself. #1240039 - DMM
+ // KConfig* config = kapp->config();
+ // config->setGroup(SequencerOptionsConfigGroup);
+ // if (config->readBoolEntry("jacktransport", false))
+ // {
+ // //!!! message box should go here to inform user of why the loop was
+ // // not set, but I can't add it at the moment due to to the pre-release
+ // // freeze - DMM
+ // return;
+ // }
+
+ // Let the sequencer know about the loop markers
+ //
+ QByteArray data;
+ QDataStream streamOut(data, IO_WriteOnly);
+
+ RealTime loopStart =
+ m_doc->getComposition().getElapsedRealTime(lhs);
+ RealTime loopEnd =
+ m_doc->getComposition().getElapsedRealTime(rhs);
+
+ streamOut << (long)loopStart.sec;
+ streamOut << (long)loopStart.nsec;
+ streamOut << (long)loopEnd.sec;
+ streamOut << (long)loopEnd.nsec;
+
+ rgapp->sequencerSend("setLoop(long int, long int, long int, long int)", data);
+}
+
+void
+SequenceManager::checkSoundDriverStatus(bool warnUser)
+{
+ QByteArray data;
+ QCString replyType;
+ QByteArray replyData;
+ QDataStream streamOut(data, IO_WriteOnly);
+
+ streamOut << QString(VERSION);
+
+ if (! rgapp->sequencerCall("getSoundDriverStatus(QString)",
+ replyType, replyData, data)) {
+
+ m_soundDriverStatus = NO_DRIVER;
+
+ } else {
+
+ QDataStream streamIn(replyData, IO_ReadOnly);
+ unsigned int result;
+ streamIn >> result;
+ m_soundDriverStatus = result;
+ }
+
+ SEQMAN_DEBUG << "Sound driver status is: " << m_soundDriverStatus << endl;
+
+ if (!warnUser) return;
+
+#ifdef HAVE_LIBJACK
+ if ((m_soundDriverStatus & (AUDIO_OK | MIDI_OK | VERSION_OK)) ==
+ (AUDIO_OK | MIDI_OK | VERSION_OK)) return;
+#else
+ if ((m_soundDriverStatus & (MIDI_OK | VERSION_OK)) ==
+ (MIDI_OK | VERSION_OK)) return;
+#endif
+
+ KStartupLogo::hideIfStillThere();
+ CurrentProgressDialog::freeze();
+
+ QString text = "";
+
+ if (m_soundDriverStatus == NO_DRIVER) {
+ text = i18n("<p>Both MIDI and Audio subsystems have failed to initialize.</p><p>You may continue without the sequencer, but we suggest closing Rosegarden, running \"alsaconf\" as root, and starting Rosegarden again. If you wish to run with no sequencer by design, then use \"rosegarden --nosequencer\" to avoid seeing this error in the future.</p>");
+ } else if (!(m_soundDriverStatus & MIDI_OK)) {
+ text = i18n("<p>The MIDI subsystem has failed to initialize.</p><p>You may continue without the sequencer, but we suggest closing Rosegarden, running \"modprobe snd-seq-midi\" as root, and starting Rosegarden again. If you wish to run with no sequencer by design, then use \"rosegarden --nosequencer\" to avoid seeing this error in the future.</p>");
+ } else if (!(m_soundDriverStatus & VERSION_OK)) {
+ text = i18n("<p>The Rosegarden sequencer module version does not match the GUI module version.</p><p>You have probably mixed up files from two different versions of Rosegarden. Please check your installation.</p>");
+ }
+
+ if (text != "") {
+ RosegardenGUIApp::self()->awaitDialogClearance();
+ KMessageBox::error(RosegardenGUIApp::self(),
+ i18n("<h3>Sequencer startup failed</h3>%1").arg(text));
+ CurrentProgressDialog::thaw();
+ return;
+ }
+
+#ifdef HAVE_LIBJACK
+ if (!(m_soundDriverStatus & AUDIO_OK)) {
+ RosegardenGUIApp::self()->awaitDialogClearance();
+ KMessageBox::information(RosegardenGUIApp::self(), i18n("<h3>Failed to connect to JACK audio server.</h3><p>Rosegarden could not connect to the JACK audio server. This probably means the JACK server is not running.</p><p>If you want to be able to play or record audio files or use plugins, you should exit Rosegarden and start the JACK server before running Rosegarden again.</p>"),
+ i18n("Failed to connect to JACK"),
+ "startup-jack-failed");
+ }
+#endif
+ CurrentProgressDialog::thaw();
+}
+
+void
+SequenceManager::preparePlayback(bool forceProgramChanges)
+{
+ Studio &studio = m_doc->getStudio();
+ InstrumentList list = studio.getAllInstruments();
+ MappedComposition mC;
+ MappedEvent *mE;
+
+ std::set<InstrumentId> activeInstruments;
+
+ Composition &composition = m_doc->getComposition();
+
+ for (Composition::trackcontainer::const_iterator i =
+ composition.getTracks().begin();
+ i != composition.getTracks().end(); ++i) {
+
+ Track *track = i->second;
+ if (track) activeInstruments.insert(track->getInstrument());
+ }
+
+ // Send the MappedInstruments (minimal Instrument information
+ // required for Performance) to the Sequencer
+ //
+ InstrumentList::iterator it = list.begin();
+ for (; it != list.end(); it++) {
+
+ StudioControl::sendMappedInstrument(MappedInstrument(*it));
+
+ // Send program changes for MIDI Instruments
+ //
+ if ((*it)->getType() == Instrument::Midi) {
+
+ if (activeInstruments.find((*it)->getId()) ==
+ activeInstruments.end()) {
+// std::cerr << "SequenceManager::preparePlayback: instrument "
+// << (*it)->getId() << " is not in use" << std::endl;
+ continue;
+ }
+
+ // send bank select always before program change
+ //
+ if ((*it)->sendsBankSelect()) {
+ mE = new MappedEvent((*it)->getId(),
+ MappedEvent::MidiController,
+ MIDI_CONTROLLER_BANK_MSB,
+ (*it)->getMSB());
+ mC.insert(mE);
+
+ mE = new MappedEvent((*it)->getId(),
+ MappedEvent::MidiController,
+ MIDI_CONTROLLER_BANK_LSB,
+ (*it)->getLSB());
+ mC.insert(mE);
+ }
+
+ // send program change
+ //
+ if ((*it)->sendsProgramChange() || forceProgramChanges) {
+ RG_DEBUG << "SequenceManager::preparePlayback() : sending prg change for "
+ << (*it)->getPresentationName().c_str() << endl;
+
+ mE = new MappedEvent((*it)->getId(),
+ MappedEvent::MidiProgramChange,
+ (*it)->getProgramChange());
+ mC.insert(mE);
+ }
+
+ } else if ((*it)->getType() == Instrument::Audio ||
+ (*it)->getType() == Instrument::SoftSynth) {
+ } else {
+ RG_DEBUG << "SequenceManager::preparePlayback - "
+ << "unrecognised instrument type" << endl;
+ }
+
+
+ }
+
+ // Send the MappedComposition if it's got anything in it
+ showVisuals(mC);
+ StudioControl::sendMappedComposition(mC);
+}
+
+void
+SequenceManager::sendAudioLevel(MappedEvent *mE)
+{
+ RosegardenGUIView *v;
+ QList<RosegardenGUIView>& viewList = m_doc->getViewList();
+
+ for (v = viewList.first(); v != 0; v = viewList.next()) {
+ v->showVisuals(mE);
+ }
+
+}
+
+void
+SequenceManager::resetControllers()
+{
+ SEQMAN_DEBUG << "SequenceManager::resetControllers - resetting\n";
+
+ // Should do all Midi Instrument - not just guess like this is doing
+ // currently.
+
+ InstrumentList list = m_doc->getStudio().getPresentationInstruments();
+ InstrumentList::iterator it;
+
+ MappedComposition mC;
+
+ for (it = list.begin(); it != list.end(); it++) {
+ if ((*it)->getType() == Instrument::Midi) {
+ MappedEvent *mE = new MappedEvent((*it)->getId(),
+ MappedEvent::MidiController,
+ MIDI_CONTROLLER_RESET,
+ 0);
+ mC.insert(mE);
+ }
+ }
+
+ StudioControl::sendMappedComposition(mC);
+ //showVisuals(mC);
+}
+
+void
+SequenceManager::resetMidiNetwork()
+{
+ SEQMAN_DEBUG << "SequenceManager::resetMidiNetwork - resetting\n";
+ MappedComposition mC;
+
+ // Should do all Midi Instrument - not just guess like this is doing
+ // currently.
+
+ for (unsigned int i = 0; i < 16; i++) {
+ MappedEvent *mE =
+ new MappedEvent(MidiInstrumentBase + i,
+ MappedEvent::MidiController,
+ MIDI_SYSTEM_RESET,
+ 0);
+
+ mC.insert(mE);
+ }
+ showVisuals(mC);
+ StudioControl::sendMappedComposition(mC);
+}
+
+void
+SequenceManager::sendMIDIRecordingDevice(const QString recordDeviceStr)
+{
+
+ if (recordDeviceStr) {
+ int recordDevice = recordDeviceStr.toInt();
+
+ if (recordDevice >= 0) {
+ MappedEvent mE(MidiInstrumentBase, // InstrumentId
+ MappedEvent::SystemRecordDevice,
+ MidiByte(recordDevice),
+ MidiByte(true));
+
+ StudioControl::sendMappedEvent(mE);
+ SEQMAN_DEBUG << "set MIDI record device to "
+ << recordDevice << endl;
+ }
+ }
+}
+
+void
+SequenceManager::restoreRecordSubscriptions()
+{
+ KConfig* config = kapp->config();
+ config->setGroup(SequencerOptionsConfigGroup);
+ //QString recordDeviceStr = config->readEntry("midirecorddevice");
+ QStringList devList = config->readListEntry("midirecorddevice");
+
+ for ( QStringList::ConstIterator it = devList.begin();
+ it != devList.end(); ++it) {
+ sendMIDIRecordingDevice(*it);
+ }
+
+}
+
+void
+SequenceManager::reinitialiseSequencerStudio()
+{
+ KConfig* config = kapp->config();
+ config->setGroup(SequencerOptionsConfigGroup);
+ //QString recordDeviceStr = config->readEntry("midirecorddevice");
+
+ //sendMIDIRecordingDevice(recordDeviceStr);
+ restoreRecordSubscriptions();
+
+ // Toggle JACK audio ports appropriately
+ //
+ bool submasterOuts = config->readBoolEntry("audiosubmasterouts", false);
+ bool faderOuts = config->readBoolEntry("audiofaderouts", false);
+ unsigned int audioFileFormat = config->readUnsignedNumEntry("audiorecordfileformat", 1);
+
+ MidiByte ports = 0;
+ if (faderOuts) {
+ ports |= MappedEvent::FaderOuts;
+ }
+ if (submasterOuts) {
+ ports |= MappedEvent::SubmasterOuts;
+ }
+ MappedEvent mEports
+ (MidiInstrumentBase,
+ MappedEvent::SystemAudioPorts,
+ ports);
+
+ StudioControl::sendMappedEvent(mEports);
+
+ MappedEvent mEff
+ (MidiInstrumentBase,
+ MappedEvent::SystemAudioFileFormat,
+ audioFileFormat);
+ StudioControl::sendMappedEvent(mEff);
+
+
+ // Set the studio from the current document
+ //
+ m_doc->initialiseStudio();
+}
+
+void
+SequenceManager::panic()
+{
+ SEQMAN_DEBUG << "panic button\n";
+
+ stopping();
+
+ MappedEvent mE(MidiInstrumentBase, MappedEvent::Panic, 0, 0);
+ emit setProgress(40);
+ StudioControl::sendMappedEvent(mE);
+ emit setProgress(100);
+
+ // Studio &studio = m_doc->getStudio();
+ //
+ // InstrumentList list = studio.getPresentationInstruments();
+ // InstrumentList::iterator it;
+ //
+ // int maxDevices = 0, device = 0;
+ // for (it = list.begin(); it != list.end(); it++)
+ // if ((*it)->getType() == Instrument::Midi)
+ // maxDevices++;
+ //
+ // emit setProgress(40);
+ //
+ // for (it = list.begin(); it != list.end(); it++)
+ // {
+ // if ((*it)->getType() == Instrument::Midi)
+ // {
+ // for (unsigned int i = 0; i < 128; i++)
+ // {
+ // MappedEvent
+ // mE((*it)->getId(),
+ // MappedEvent::MidiNote,
+ // i,
+ // 0);
+ //
+ // StudioControl::sendMappedEvent(mE);
+ // }
+ //
+ // device++;
+ // }
+ //
+ // emit setProgress(int(90.0 * (double(device) / double(maxDevices))));
+ // }
+ //
+ // resetControllers();
+}
+
+void
+SequenceManager::showVisuals(const MappedComposition &mC)
+{
+ MappedComposition::const_iterator it = mC.begin();
+ if (it != mC.end())
+ m_transport->setMidiOutLabel(*it);
+}
+
+MappedComposition
+SequenceManager::applyFiltering(const MappedComposition &mC,
+ MappedEvent::MappedEventType filter)
+{
+ MappedComposition retMc;
+ MappedComposition::const_iterator it = mC.begin();
+
+ for (; it != mC.end(); it++) {
+ if (!((*it)->getType() & filter))
+ retMc.insert(new MappedEvent(*it));
+ }
+
+ return retMc;
+}
+
+void SequenceManager::resetCompositionMmapper()
+{
+ SEQMAN_DEBUG << "SequenceManager::resetCompositionMmapper()\n";
+ delete m_compositionMmapper;
+ m_compositionMmapper = new CompositionMmapper(m_doc);
+
+ resetMetronomeMmapper();
+ resetTempoSegmentMmapper();
+ resetTimeSigSegmentMmapper();
+ resetControlBlockMmapper();
+}
+
+void SequenceManager::resetMetronomeMmapper()
+{
+ SEQMAN_DEBUG << "SequenceManager::resetMetronomeMmapper()\n";
+
+ delete m_metronomeMmapper;
+ m_metronomeMmapper = SegmentMmapperFactory::makeMetronome(m_doc);
+}
+
+void SequenceManager::resetTempoSegmentMmapper()
+{
+ SEQMAN_DEBUG << "SequenceManager::resetTempoSegmentMmapper()\n";
+
+ delete m_tempoSegmentMmapper;
+ m_tempoSegmentMmapper = SegmentMmapperFactory::makeTempo(m_doc);
+}
+
+void SequenceManager::resetTimeSigSegmentMmapper()
+{
+ SEQMAN_DEBUG << "SequenceManager::resetTimeSigSegmentMmapper()\n";
+
+ delete m_timeSigSegmentMmapper;
+ m_timeSigSegmentMmapper = SegmentMmapperFactory::makeTimeSig(m_doc);
+}
+
+void SequenceManager::resetControlBlockMmapper()
+{
+ SEQMAN_DEBUG << "SequenceManager::resetControlBlockMmapper()\n";
+
+ m_controlBlockMmapper->setDocument(m_doc);
+}
+
+bool SequenceManager::event(QEvent *e)
+{
+ if (e->type() == QEvent::User) {
+ SEQMAN_DEBUG << "SequenceManager::event() with user event\n";
+ if (m_updateRequested) {
+ SEQMAN_DEBUG << "SequenceManager::event(): update requested\n";
+ checkRefreshStatus();
+ m_updateRequested = false;
+ }
+ return true;
+ } else {
+ return QObject::event(e);
+ }
+}
+
+void SequenceManager::update()
+{
+ SEQMAN_DEBUG << "SequenceManager::update()\n";
+ // schedule a refresh-status check for the next event loop
+ QEvent *e = new QEvent(QEvent::User);
+ m_updateRequested = true;
+ QApplication::postEvent(this, e);
+}
+
+void SequenceManager::checkRefreshStatus()
+{
+ SEQMAN_DEBUG << "SequenceManager::checkRefreshStatus()\n";
+
+ // Look at trigger segments first: if one of those has changed, we'll
+ // need to be aware of it when scanning segments subsequently
+
+ TriggerSegmentRec::SegmentRuntimeIdSet ridset;
+ Composition &comp = m_doc->getComposition();
+ SegmentRefreshMap newTriggerMap;
+
+ for (Composition::triggersegmentcontaineriterator i =
+ comp.getTriggerSegments().begin();
+ i != comp.getTriggerSegments().end(); ++i) {
+
+ Segment *s = (*i)->getSegment();
+
+ if (m_triggerSegments.find(s) == m_triggerSegments.end()) {
+ newTriggerMap[s] = s->getNewRefreshStatusId();
+ } else {
+ newTriggerMap[s] = m_triggerSegments[s];
+ }
+
+ if (s->getRefreshStatus(newTriggerMap[s]).needsRefresh()) {
+ TriggerSegmentRec::SegmentRuntimeIdSet &thisSet = (*i)->getReferences();
+ ridset.insert(thisSet.begin(), thisSet.end());
+ s->getRefreshStatus(newTriggerMap[s]).setNeedsRefresh(false);
+ }
+ }
+
+ m_triggerSegments = newTriggerMap;
+
+ SEQMAN_DEBUG << "SequenceManager::checkRefreshStatus: segments modified by changes to trigger segments are:" << endl;
+ int x = 0;
+ for (TriggerSegmentRec::SegmentRuntimeIdSet::iterator i = ridset.begin();
+ i != ridset.end(); ++i) {
+ SEQMAN_DEBUG << x << ": " << *i << endl;
+ ++x;
+ }
+
+ std::vector<Segment*>::iterator i;
+
+ // Check removed segments first
+ for (i = m_removedSegments.begin(); i != m_removedSegments.end(); ++i) {
+ processRemovedSegment(*i);
+ }
+ m_removedSegments.clear();
+
+ SEQMAN_DEBUG << "SequenceManager::checkRefreshStatus: we have "
+ << m_segments.size() << " segments" << endl;
+
+ // then the ones which are still there
+ for (SegmentRefreshMap::iterator i = m_segments.begin();
+ i != m_segments.end(); ++i) {
+ if (i->first->getRefreshStatus(i->second).needsRefresh() ||
+ ridset.find(i->first->getRuntimeId()) != ridset.end()) {
+ segmentModified(i->first);
+ i->first->getRefreshStatus(i->second).setNeedsRefresh(false);
+ }
+ }
+
+ // then added ones
+ for (i = m_addedSegments.begin(); i != m_addedSegments.end(); ++i) {
+ processAddedSegment(*i);
+ }
+ m_addedSegments.clear();
+}
+
+void SequenceManager::segmentModified(Segment* s)
+{
+ SEQMAN_DEBUG << "SequenceManager::segmentModified(" << s << ")\n";
+
+ bool sizeChanged = m_compositionMmapper->segmentModified(s);
+
+ SEQMAN_DEBUG << "SequenceManager::segmentModified() : size changed = "
+ << sizeChanged << endl;
+
+ if ((m_transportStatus == PLAYING) && sizeChanged) {
+ QByteArray data;
+ QDataStream streamOut(data, IO_WriteOnly);
+
+ streamOut << (QString)m_compositionMmapper->getSegmentFileName(s);
+ streamOut << (size_t)m_compositionMmapper->getSegmentFileSize(s);
+
+ SEQMAN_DEBUG << "SequenceManager::segmentModified() : DCOP-call sequencer remapSegment"
+ << m_compositionMmapper->getSegmentFileName(s) << endl;
+
+ rgapp->sequencerSend("remapSegment(QString, size_t)", data);
+ }
+}
+
+void SequenceManager::segmentAdded(const Composition*, Segment* s)
+{
+ SEQMAN_DEBUG << "SequenceManager::segmentAdded(" << s << ")\n";
+ m_addedSegments.push_back(s);
+}
+
+void SequenceManager::segmentRemoved(const Composition*, Segment* s)
+{
+ SEQMAN_DEBUG << "SequenceManager::segmentRemoved(" << s << ")\n";
+ m_removedSegments.push_back(s);
+ std::vector<Segment*>::iterator i = find(m_addedSegments.begin(), m_addedSegments.end(), s);
+ if (i != m_addedSegments.end())
+ m_addedSegments.erase(i);
+}
+
+void SequenceManager::segmentRepeatChanged(const Composition*, Segment* s, bool repeat)
+{
+ SEQMAN_DEBUG << "SequenceManager::segmentRepeatChanged(" << s << ", " << repeat << ")\n";
+ segmentModified(s);
+}
+
+void SequenceManager::segmentRepeatEndChanged(const Composition*, Segment* s, timeT newEndTime)
+{
+ SEQMAN_DEBUG << "SequenceManager::segmentRepeatEndChanged(" << s << ", " << newEndTime << ")\n";
+ segmentModified(s);
+}
+
+void SequenceManager::segmentEventsTimingChanged(const Composition*, Segment * s, timeT t, RealTime)
+{
+ SEQMAN_DEBUG << "SequenceManager::segmentEventsTimingChanged(" << s << ", " << t << ")\n";
+ segmentModified(s);
+ if (s && s->getType() == Segment::Audio && m_transportStatus == PLAYING) {
+ QByteArray data;
+ rgapp->sequencerSend("remapTracks()", data);
+ }
+}
+
+void SequenceManager::segmentTransposeChanged(const Composition*, Segment *s, int transpose)
+{
+ SEQMAN_DEBUG << "SequenceManager::segmentTransposeChanged(" << s << ", " << transpose << ")\n";
+ segmentModified(s);
+}
+
+void SequenceManager::segmentTrackChanged(const Composition*, Segment *s, TrackId id)
+{
+ SEQMAN_DEBUG << "SequenceManager::segmentTrackChanged(" << s << ", " << id << ")\n";
+ segmentModified(s);
+ if (s && s->getType() == Segment::Audio && m_transportStatus == PLAYING) {
+ QByteArray data;
+ rgapp->sequencerSend("remapTracks()", data);
+ }
+}
+
+void SequenceManager::segmentEndMarkerChanged(const Composition*, Segment *s, bool)
+{
+ SEQMAN_DEBUG << "SequenceManager::segmentEndMarkerChanged(" << s << ")\n";
+ segmentModified(s);
+}
+
+void SequenceManager::processAddedSegment(Segment* s)
+{
+ SEQMAN_DEBUG << "SequenceManager::processAddedSegment(" << s << ")\n";
+
+ m_compositionMmapper->segmentAdded(s);
+
+ if (m_transportStatus == PLAYING) {
+
+ QByteArray data;
+ QDataStream streamOut(data, IO_WriteOnly);
+
+ streamOut << m_compositionMmapper->getSegmentFileName(s);
+
+ if (!rgapp->sequencerSend("addSegment(QString)", data)) {
+ m_transportStatus = STOPPED;
+ }
+ }
+
+ // Add to segments map
+ int id = s->getNewRefreshStatusId();
+ m_segments.insert(SegmentRefreshMap::value_type(s, id));
+
+}
+
+void SequenceManager::processRemovedSegment(Segment* s)
+{
+ SEQMAN_DEBUG << "SequenceManager::processRemovedSegment(" << s << ")\n";
+
+ QString filename = m_compositionMmapper->getSegmentFileName(s);
+ m_compositionMmapper->segmentDeleted(s);
+
+ if (m_transportStatus == PLAYING) {
+
+ QByteArray data;
+ QDataStream streamOut(data, IO_WriteOnly);
+
+ streamOut << filename;
+
+ if (!rgapp->sequencerSend("deleteSegment(QString)", data)) {
+ // failed
+ m_transportStatus = STOPPED;
+ }
+ }
+
+ // Remove from segments map
+ m_segments.erase(s);
+}
+
+void SequenceManager::endMarkerTimeChanged(const Composition *, bool /*shorten*/)
+{
+ SEQMAN_DEBUG << "SequenceManager::endMarkerTimeChanged()\n";
+ m_compositionMmapperResetTimer->start(500, true); // schedule a composition mmapper reset in 0.5s
+}
+
+void SequenceManager::timeSignatureChanged(const Composition *)
+{
+ resetMetronomeMmapper();
+}
+
+void SequenceManager::trackChanged(const Composition *, Track* t)
+{
+ SEQMAN_DEBUG << "SequenceManager::trackChanged(" << t << ", " << (t ? t->getPosition() : -1) << ")\n";
+ m_controlBlockMmapper->updateTrackData(t);
+
+ if (m_transportStatus == PLAYING) {
+ QByteArray data;
+ rgapp->sequencerSend("remapTracks()", data);
+ }
+}
+
+void SequenceManager::trackDeleted(const Composition *, TrackId t)
+{
+ m_controlBlockMmapper->setTrackDeleted(t);
+}
+
+void SequenceManager::metronomeChanged(InstrumentId id,
+ bool regenerateTicks)
+{
+ // This method is called when the user has changed the
+ // metronome instrument, pitch etc
+
+ SEQMAN_DEBUG << "SequenceManager::metronomeChanged (simple)"
+ << ", instrument = "
+ << id
+ << endl;
+
+ if (regenerateTicks)
+ resetMetronomeMmapper();
+
+ m_controlBlockMmapper->updateMetronomeData(id);
+ if (m_transportStatus == PLAYING) {
+ m_controlBlockMmapper->updateMetronomeForPlayback();
+ } else {
+ m_controlBlockMmapper->updateMetronomeForRecord();
+ }
+
+ m_metronomeMmapper->refresh();
+ m_timeSigSegmentMmapper->refresh();
+ m_tempoSegmentMmapper->refresh();
+}
+
+void SequenceManager::metronomeChanged(const Composition *)
+{
+ // This method is called when the muting status in the composition
+ // has changed -- the metronome itself has not actually changed
+
+ SEQMAN_DEBUG << "SequenceManager::metronomeChanged "
+ << ", instrument = "
+ << m_metronomeMmapper->getMetronomeInstrument()
+ << endl;
+
+ m_controlBlockMmapper->updateMetronomeData
+ (m_metronomeMmapper->getMetronomeInstrument());
+
+ if (m_transportStatus == PLAYING) {
+ m_controlBlockMmapper->updateMetronomeForPlayback();
+ } else {
+ m_controlBlockMmapper->updateMetronomeForRecord();
+ }
+}
+
+void SequenceManager::filtersChanged(MidiFilter thruFilter,
+ MidiFilter recordFilter)
+{
+ m_controlBlockMmapper->updateMidiFilters(thruFilter, recordFilter);
+}
+
+void SequenceManager::soloChanged(const Composition *, bool solo, TrackId selectedTrack)
+{
+ if (m_controlBlockMmapper->updateSoloData(solo, selectedTrack)) {
+ if (m_transportStatus == PLAYING) {
+ QByteArray data;
+ rgapp->sequencerSend("remapTracks()", data);
+ }
+ }
+}
+
+void SequenceManager::tempoChanged(const Composition *c)
+{
+ SEQMAN_DEBUG << "SequenceManager::tempoChanged()\n";
+
+ // Refresh all segments
+ //
+ for (SegmentRefreshMap::iterator i = m_segments.begin();
+ i != m_segments.end(); ++i) {
+ segmentModified(i->first);
+ }
+
+ // and metronome, time sig and tempo
+ //
+ m_metronomeMmapper->refresh();
+ m_timeSigSegmentMmapper->refresh();
+ m_tempoSegmentMmapper->refresh();
+
+ if (c->isLooping())
+ setLoop(c->getLoopStart(), c->getLoopEnd());
+ else if (m_transportStatus == PLAYING) {
+ // If the tempo changes during playback, reset the pointer
+ // position because the sequencer keeps track of position in
+ // real time and we want to maintain the same position in
+ // musical time. Turn off play tracking while this happens,
+ // so that we don't jump about in the main window while the
+ // user's trying to drag the tempo in it. (That doesn't help
+ // for matrix or notation though, sadly)
+ bool tracking = RosegardenGUIApp::self()->isTrackEditorPlayTracking();
+ if (tracking)
+ RosegardenGUIApp::self()->slotToggleTracking();
+ m_doc->slotSetPointerPosition(c->getPosition());
+ if (tracking)
+ RosegardenGUIApp::self()->slotToggleTracking();
+ }
+}
+
+void
+SequenceManager::sendTransportControlStatuses()
+{
+ KConfig* config = kapp->config();
+ config->setGroup(SequencerOptionsConfigGroup);
+
+ // Get the config values
+ //
+ bool jackTransport = config->readBoolEntry("jacktransport", false);
+ bool jackMaster = config->readBoolEntry("jackmaster", false);
+
+ int mmcMode = config->readNumEntry("mmcmode", 0);
+ int mtcMode = config->readNumEntry("mtcmode", 0);
+
+ int midiClock = config->readNumEntry("midiclock", 0);
+ bool midiSyncAuto = config->readBoolEntry("midisyncautoconnect", false);
+
+ // Send JACK transport
+ //
+ int jackValue = 0;
+ if (jackTransport && jackMaster)
+ jackValue = 2;
+ else {
+ if (jackTransport)
+ jackValue = 1;
+ else
+ jackValue = 0;
+ }
+
+ MappedEvent mEjackValue(MidiInstrumentBase, // InstrumentId
+ MappedEvent::SystemJackTransport,
+ MidiByte(jackValue));
+ StudioControl::sendMappedEvent(mEjackValue);
+
+
+ // Send MMC transport
+ //
+ MappedEvent mEmmcValue(MidiInstrumentBase, // InstrumentId
+ MappedEvent::SystemMMCTransport,
+ MidiByte(mmcMode));
+
+ StudioControl::sendMappedEvent(mEmmcValue);
+
+
+ // Send MTC transport
+ //
+ MappedEvent mEmtcValue(MidiInstrumentBase, // InstrumentId
+ MappedEvent::SystemMTCTransport,
+ MidiByte(mtcMode));
+
+ StudioControl::sendMappedEvent(mEmtcValue);
+
+
+ // Send MIDI Clock
+ //
+ MappedEvent mEmidiClock(MidiInstrumentBase, // InstrumentId
+ MappedEvent::SystemMIDIClock,
+ MidiByte(midiClock));
+
+ StudioControl::sendMappedEvent(mEmidiClock);
+
+
+ // Send MIDI Sync Auto-Connect
+ //
+ MappedEvent mEmidiSyncAuto(MidiInstrumentBase, // InstrumentId
+ MappedEvent::SystemMIDISyncAuto,
+ MidiByte(midiSyncAuto ? 1 : 0));
+
+ StudioControl::sendMappedEvent(mEmidiSyncAuto);
+
+}
+
+void
+SequenceManager::slotCountdownTimerTimeout()
+{
+ // Set the elapsed time in seconds
+ //
+ m_countdownDialog->setElapsedTime(m_recordTime->elapsed() / 1000);
+}
+
+void
+SequenceManager::slotFoundMountPoint(const QString&,
+ unsigned long kBSize,
+ unsigned long /*kBUsed*/,
+ unsigned long kBAvail)
+{
+ m_gotDiskSpaceResult = true;
+ m_diskSpaceKBAvail = kBAvail;
+}
+
+void
+SequenceManager::enableMIDIThruRouting(bool state)
+{
+ m_controlBlockMmapper->enableMIDIThruRouting(state);
+}
+
+int
+SequenceManager::getSampleRate()
+{
+ if (m_sampleRate != 0) return m_sampleRate;
+
+ QCString replyType;
+ QByteArray replyData;
+ if (rgapp->sequencerCall("getSampleRate()", replyType, replyData)) {
+ QDataStream streamIn(replyData, IO_ReadOnly);
+ unsigned int result;
+ streamIn >> m_sampleRate;
+ }
+
+ return m_sampleRate;
+}
+
+bool
+SequenceManager::shouldWarnForImpreciseTimer()
+{
+ kapp->config()->setGroup(SequencerOptionsConfigGroup);
+ QString timer = kapp->config()->readEntry("timer");
+ if (timer == "(auto)" || timer == "") return true;
+ else return false; // if the user has chosen the timer, leave them alone
+}
+
+}
+#include "SequenceManager.moc"
diff --git a/src/gui/seqmanager/SequenceManager.h b/src/gui/seqmanager/SequenceManager.h
new file mode 100644
index 0000000..792ec01
--- /dev/null
+++ b/src/gui/seqmanager/SequenceManager.h
@@ -0,0 +1,322 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_SEQUENCEMANAGER_H_
+#define _RG_SEQUENCEMANAGER_H_
+
+#include "base/Composition.h"
+#include "base/Event.h"
+#include "base/MidiProgram.h"
+#include "base/RealTime.h"
+#include "base/Track.h"
+#include "gui/application/RosegardenDCOP.h"
+#include "sound/MappedComposition.h"
+#include "sound/MappedEvent.h"
+#include <qobject.h>
+#include <qstring.h>
+#include <vector>
+#include <map>
+
+
+class QTimer;
+class QTime;
+class QEvent;
+
+
+namespace Rosegarden
+{
+
+class TransportDialog;
+class Track;
+class TimeSigSegmentMmapper;
+class TempoSegmentMmapper;
+class SequencerMapper;
+class Segment;
+class RosegardenGUIDoc;
+class MetronomeMmapper;
+class CountdownDialog;
+class ControlBlockMmapper;
+class CompositionMmapper;
+class Composition;
+class AudioManagerDialog;
+
+
+class SequenceManager : public QObject, public CompositionObserver
+{
+ Q_OBJECT
+public:
+ SequenceManager(RosegardenGUIDoc *doc,
+ TransportDialog *transport);
+ ~SequenceManager();
+
+ /**
+ * Replaces the internal document
+ */
+ void setDocument(RosegardenGUIDoc*);
+
+ /**
+ * Return the current internal document
+ */
+ RosegardenGUIDoc* getDocument();
+
+ //
+ // Transport controls
+ //
+
+ /// returns true if the call actually paused playback
+ bool play();
+
+ // We don't call stop() directly - using stopping() and then
+ // call stop().
+ //
+ void stop();
+
+ void stopping();
+ void rewind();
+ void fastforward();
+ void record(bool countIn);
+ void rewindToBeginning();
+ void fastForwardToEnd();
+
+ void setLoop(const timeT &lhs, const timeT &rhs);
+ void notifySequencerStatus(TransportStatus status);
+ void sendSequencerJump(const RealTime &time);
+
+ // Events coming in
+ void processAsynchronousMidi(const MappedComposition &mC,
+ AudioManagerDialog *aMD);
+
+ // Before playing and recording. If warnUser is true, show the
+ // user a warning dialog if there is a problem with the setup.
+ //
+ void checkSoundDriverStatus(bool warnUser);
+
+ /**
+ * Send program changes and align Instrument lists before playback
+ * starts.
+ * Also called at document loading (with arg set to true) to reset all instruments
+ * (fix for bug 820174)
+ *
+ * @arg forceProgramChanges if true, always send program changes even if the instrument is
+ * set not to send any.
+ */
+ void preparePlayback(bool forceProgramChanges = false);
+
+ /// Check and set sequencer status
+ void setTransportStatus(const TransportStatus &status);
+ TransportStatus getTransportStatus() const { return m_transportStatus; }
+
+ /**
+ * Suspend the sequencer to allow for a safe DCOP call() i.e. one
+ * when we don't hang both clients 'cos they're blocking on each
+ * other.
+ */
+ void suspendSequencer(bool value);
+
+ /// Send the audio level to VU meters
+ void sendAudioLevel(MappedEvent *mE);
+
+ /// Find what has been initialised and what hasn't
+ unsigned int getSoundDriverStatus() { return m_soundDriverStatus; }
+
+ /// Reset MIDI controllers
+ void resetControllers();
+
+ /// Reset MIDI network
+ void resetMidiNetwork();
+
+ /// Reinitialise the studio
+ void reinitialiseSequencerStudio();
+
+ /// Send JACK and MMC transport control statuses
+ void sendTransportControlStatuses();
+
+ /// Send all note offs and resets to MIDI devices
+ void panic();
+
+ /// Send an MC to the view
+ void showVisuals(const MappedComposition &mC);
+
+ /// Apply in-situ filtering to a MappedComposition
+ MappedComposition
+ applyFiltering(const MappedComposition &mC,
+ MappedEvent::MappedEventType filter);
+
+ CountdownDialog* getCountdownDialog() { return m_countdownDialog; }
+
+
+ //
+ // CompositionObserver interface
+ //
+ virtual void segmentAdded (const Composition*, Segment*);
+ virtual void segmentRemoved (const Composition*, Segment*);
+ virtual void segmentRepeatChanged (const Composition*, Segment*, bool);
+ virtual void segmentRepeatEndChanged (const Composition*, Segment*, timeT);
+ virtual void segmentEventsTimingChanged(const Composition*, Segment *, timeT delay, RealTime rtDelay);
+ virtual void segmentTransposeChanged (const Composition*, Segment *, int transpose);
+ virtual void segmentTrackChanged (const Composition*, Segment *, TrackId id);
+ virtual void segmentEndMarkerChanged (const Composition*, Segment *, bool);
+ virtual void endMarkerTimeChanged (const Composition*, bool shorten);
+ virtual void trackChanged (const Composition*, Track*);
+ virtual void trackDeleted (const Composition*, TrackId);
+ virtual void timeSignatureChanged (const Composition*);
+ virtual void metronomeChanged (const Composition*);
+ virtual void soloChanged (const Composition*, bool solo, TrackId selectedTrack);
+ virtual void tempoChanged (const Composition*);
+
+ void processAddedSegment(Segment*);
+ void processRemovedSegment(Segment*);
+ void segmentModified(Segment*);
+
+ virtual bool event(QEvent *e);
+
+ /// for the gui to call to indicate that the metronome needs to be remapped
+ void metronomeChanged(InstrumentId id, bool regenerateTicks);
+
+ /// for the gui to call to indicate that a MIDI filter needs to be remapped
+ void filtersChanged(MidiFilter thruFilter,
+ MidiFilter recordFilter);
+
+ /// Return the current sequencer memory mapped file
+ SequencerMapper* getSequencerMapper() { return m_sequencerMapper; }
+
+ /// Ensure that the sequencer file is mapped
+ void mapSequencer();
+
+ void setTransport(TransportDialog* t) { m_transport = t; }
+
+ void enableMIDIThruRouting(bool state);
+
+ int getSampleRate(); // may return 0 if sequencer uncontactable
+
+public slots:
+
+ void update();
+
+signals:
+ void setProgress(int);
+ void incrementProgress(int);
+
+ void insertableNoteOnReceived(int pitch, int velocity);
+ void insertableNoteOffReceived(int pitch, int velocity);
+ void controllerDeviceEventReceived(MappedEvent *ev);
+
+protected slots:
+ void slotCountdownTimerTimeout();
+
+ // Activated by timer to allow a message to be reported to
+ // the user - we use this mechanism so that the user isn't
+ // bombarded with dialogs in the event of lots of failures.
+ //
+ void slotAllowReport() { m_canReport = true; }
+
+ void slotFoundMountPoint(const QString&,
+ unsigned long kBSize,
+ unsigned long kBUsed,
+ unsigned long kBAvail);
+
+ void slotScheduledCompositionMmapperReset() { resetCompositionMmapper(); }
+
+protected:
+
+ void resetCompositionMmapper();
+ void resetControlBlockMmapper();
+ void resetMetronomeMmapper();
+ void resetTempoSegmentMmapper();
+ void resetTimeSigSegmentMmapper();
+ void checkRefreshStatus();
+ void sendMIDIRecordingDevice(const QString recordDeviceStr);
+ void restoreRecordSubscriptions();
+ bool shouldWarnForImpreciseTimer();
+
+ //--------------- Data members ---------------------------------
+
+ MappedComposition m_mC;
+ RosegardenGUIDoc *m_doc;
+ CompositionMmapper *m_compositionMmapper;
+ ControlBlockMmapper *m_controlBlockMmapper;
+ MetronomeMmapper *m_metronomeMmapper;
+ TempoSegmentMmapper *m_tempoSegmentMmapper;
+ TimeSigSegmentMmapper *m_timeSigSegmentMmapper;
+
+ std::vector<Segment*> m_addedSegments;
+ std::vector<Segment*> m_removedSegments;
+ bool m_metronomeNeedsRefresh;
+
+ // statuses
+ TransportStatus m_transportStatus;
+ unsigned int m_soundDriverStatus;
+
+ // pointer to the transport dialog
+ TransportDialog *m_transport;
+
+ clock_t m_lastRewoundAt;
+
+ CountdownDialog *m_countdownDialog;
+ QTimer *m_countdownTimer;
+
+ bool m_shownOverrunWarning;
+
+ // Keep a track of elapsed record time with this object
+ //
+ QTime *m_recordTime;
+
+ typedef std::map<Segment *, int> SegmentRefreshMap;
+ SegmentRefreshMap m_segments; // map to refresh status id
+ SegmentRefreshMap m_triggerSegments;
+ unsigned int m_compositionRefreshStatusId;
+ bool m_updateRequested;
+
+ // used to schedule a composition mmapper reset when the composition end time marker changes
+ // this can be caused by a window resize, and since the reset is potentially expensive we want to collapse
+ // several following requests into one.
+ QTimer *m_compositionMmapperResetTimer;
+
+ // Information that the sequencer is providing to us - for the moment
+ // it's only the position pointer.
+ //
+ SequencerMapper *m_sequencerMapper;
+
+ // Just to make sure we don't bother the user too often
+ //
+ QTimer *m_reportTimer;
+ bool m_canReport;
+
+ bool m_gotDiskSpaceResult;
+ unsigned long m_diskSpaceKBAvail;
+
+ bool m_lastLowLatencySwitchSent;
+
+ timeT m_lastTransportStartPosition;
+
+ int m_sampleRate;
+};
+
+
+
+
+}
+
+#endif
diff --git a/src/gui/seqmanager/SequencerMapper.cpp b/src/gui/seqmanager/SequencerMapper.cpp
new file mode 100644
index 0000000..5d8acf3
--- /dev/null
+++ b/src/gui/seqmanager/SequencerMapper.cpp
@@ -0,0 +1,105 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "SequencerMapper.h"
+
+#include "misc/Debug.h"
+#include "base/Exception.h"
+#include "base/MidiProgram.h"
+#include "base/RealTime.h"
+#include "base/Track.h"
+#include "sound/MappedComposition.h"
+#include "sound/MappedEvent.h"
+#include "sound/SequencerDataBlock.h"
+#include <qfileinfo.h>
+#include <qstring.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <sys/mman.h>
+#include <errno.h>
+
+
+namespace Rosegarden
+{
+
+SequencerMapper::SequencerMapper(const QString filename)
+ : m_fd( -1),
+ m_mmappedSize(0),
+ m_mmappedBuffer((void *)0),
+ m_filename(filename)
+{
+ RG_DEBUG << "SequencerMapper::SequencerMapper - mmapping " << filename << endl;
+ map();
+}
+
+SequencerMapper::~SequencerMapper()
+{
+ unmap();
+}
+
+void
+SequencerMapper::map()
+{
+ QFileInfo fInfo(m_filename);
+ if (!fInfo.exists()) {
+ RG_DEBUG << "SequencerMapper::map() : file " << m_filename << " doesn't exist\n";
+ throw Exception("file not found");
+ }
+
+ m_fd = ::open(m_filename.latin1(), O_RDWR);
+
+ if (m_fd < 0) {
+ RG_DEBUG << "SequencerMapper::map() : Couldn't open " << m_filename
+ << endl;
+ throw Exception("Couldn't open " + std::string(m_filename.data()));
+ }
+
+ m_mmappedSize = sizeof(SequencerDataBlock);
+ m_mmappedBuffer = (long*)::mmap(0, m_mmappedSize, PROT_READ, MAP_SHARED, m_fd, 0);
+
+ if (m_mmappedBuffer == (void*) - 1) {
+
+ RG_DEBUG << QString("mmap failed : (%1) %2\n").
+ arg(errno).arg(strerror(errno));
+
+ throw Exception("mmap failed");
+ }
+
+ RG_DEBUG << "SequencerMapper::map() : "
+ << (void*)m_mmappedBuffer << "," << m_mmappedSize << endl;
+
+ m_sequencerDataBlock = new (m_mmappedBuffer)
+ SequencerDataBlock(false);
+}
+
+void
+SequencerMapper::unmap()
+{
+ ::munmap(m_mmappedBuffer, m_mmappedSize);
+ ::close(m_fd);
+}
+
+}
diff --git a/src/gui/seqmanager/SequencerMapper.h b/src/gui/seqmanager/SequencerMapper.h
new file mode 100644
index 0000000..59d217f
--- /dev/null
+++ b/src/gui/seqmanager/SequencerMapper.h
@@ -0,0 +1,113 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_SEQUENCERMAPPER_H_
+#define _RG_SEQUENCERMAPPER_H_
+
+#include "base/MidiProgram.h"
+#include "base/RealTime.h"
+#include "base/Track.h"
+#include "sound/SequencerDataBlock.h"
+#include <qstring.h>
+
+
+class LevelInfo;
+
+
+namespace Rosegarden
+{
+
+class MappedEvent;
+class MappedComposition;
+
+
+class SequencerMapper
+{
+public:
+ SequencerMapper(const QString filename);
+ ~SequencerMapper();
+
+ RealTime getPositionPointer() const {
+ return m_sequencerDataBlock->getPositionPointer();
+ }
+
+ bool getVisual(MappedEvent &ev) const {
+ return m_sequencerDataBlock->getVisual(ev);
+ }
+
+ int getRecordedEvents(MappedComposition &mC) const {
+ return m_sequencerDataBlock->getRecordedEvents(mC);
+ }
+
+ bool getTrackLevel(TrackId track,
+ LevelInfo &info) const {
+ return m_sequencerDataBlock->getTrackLevel(track, info);
+ }
+
+ bool getInstrumentLevel(InstrumentId id,
+ LevelInfo &info) const {
+ return m_sequencerDataBlock->getInstrumentLevel(id, info);
+ }
+
+ bool getInstrumentLevelForMixer(InstrumentId id,
+ LevelInfo &info) const {
+ return m_sequencerDataBlock->getInstrumentLevelForMixer(id, info);
+ }
+
+ bool getInstrumentRecordLevel(InstrumentId id,
+ LevelInfo &info) const {
+ return m_sequencerDataBlock->getInstrumentRecordLevel(id, info);
+ }
+
+ bool getInstrumentRecordLevelForMixer(InstrumentId id,
+ LevelInfo &info) const {
+ return m_sequencerDataBlock->getInstrumentRecordLevelForMixer(id, info);
+ }
+
+ bool getSubmasterLevel(int submaster,
+ LevelInfo &info) const {
+ return m_sequencerDataBlock->getSubmasterLevel(submaster, info);
+ }
+
+ bool getMasterLevel(LevelInfo &info) const {
+ return m_sequencerDataBlock->getMasterLevel(info);
+ }
+
+protected:
+ void map();
+ void unmap();
+
+ int m_fd;
+ size_t m_mmappedSize;
+ void* m_mmappedBuffer;
+ QString m_filename;
+ SequencerDataBlock *m_sequencerDataBlock;
+};
+
+
+
+}
+
+#endif
diff --git a/src/gui/seqmanager/SpecialSegmentMmapper.cpp b/src/gui/seqmanager/SpecialSegmentMmapper.cpp
new file mode 100644
index 0000000..5926f11
--- /dev/null
+++ b/src/gui/seqmanager/SpecialSegmentMmapper.cpp
@@ -0,0 +1,56 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "SpecialSegmentMmapper.h"
+
+#include <kstddirs.h>
+#include "base/Event.h"
+#include "base/Segment.h"
+#include "base/TriggerSegment.h"
+#include "document/RosegardenGUIDoc.h"
+#include "SegmentMmapper.h"
+#include <kglobal.h>
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+SpecialSegmentMmapper::SpecialSegmentMmapper(RosegardenGUIDoc* doc,
+ QString baseFileName)
+ : SegmentMmapper(doc, 0, createFileName(baseFileName))
+{}
+
+QString SpecialSegmentMmapper::createFileName(QString baseFileName)
+{
+ return KGlobal::dirs()->resourceDirs("tmp").last() + "/" + baseFileName;
+}
+
+unsigned int SpecialSegmentMmapper::getSegmentRepeatCount()
+{
+ return 1;
+}
+
+}
diff --git a/src/gui/seqmanager/SpecialSegmentMmapper.h b/src/gui/seqmanager/SpecialSegmentMmapper.h
new file mode 100644
index 0000000..e16c7b5
--- /dev/null
+++ b/src/gui/seqmanager/SpecialSegmentMmapper.h
@@ -0,0 +1,59 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_SPECIALSEGMENTMMAPPER_H_
+#define _RG_SPECIALSEGMENTMMAPPER_H_
+
+#include "SegmentMmapper.h"
+#include <qstring.h>
+
+
+
+
+namespace Rosegarden
+{
+
+class RosegardenGUIDoc;
+
+
+class SpecialSegmentMmapper : public SegmentMmapper
+{
+public:
+ // overrides from SegmentMmapper
+ virtual unsigned int getSegmentRepeatCount();
+
+protected:
+ SpecialSegmentMmapper(RosegardenGUIDoc* doc,
+ QString baseFileName);
+
+ QString createFileName(QString baseFileName);
+};
+
+//----------------------------------------
+
+
+}
+
+#endif
diff --git a/src/gui/seqmanager/TempoSegmentMmapper.cpp b/src/gui/seqmanager/TempoSegmentMmapper.cpp
new file mode 100644
index 0000000..1c53922
--- /dev/null
+++ b/src/gui/seqmanager/TempoSegmentMmapper.cpp
@@ -0,0 +1,77 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "TempoSegmentMmapper.h"
+
+#include "base/Event.h"
+#include "base/RealTime.h"
+#include "base/Segment.h"
+#include "base/TriggerSegment.h"
+#include "document/RosegardenGUIDoc.h"
+#include "SegmentMmapper.h"
+#include "sound/MappedEvent.h"
+#include "SpecialSegmentMmapper.h"
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+void TempoSegmentMmapper::dump()
+{
+ RealTime eventTime;
+
+ Composition& comp = m_doc->getComposition();
+ MappedEvent* bufPos = m_mmappedEventBuffer;
+
+ for (int i = 0; i < comp.getTempoChangeCount(); ++i) {
+
+ std::pair<timeT, tempoT> tempoChange = comp.getTempoChange(i);
+
+ eventTime = comp.getElapsedRealTime(tempoChange.first);
+ MappedEvent* mappedEvent = new (bufPos) MappedEvent();
+ mappedEvent->setType(MappedEvent::Tempo);
+ mappedEvent->setEventTime(eventTime);
+
+ // Nasty hack -- we use the instrument ID to pass through the
+ // raw tempo value, as it has the appropriate range (unlike
+ // e.g. tempo1 + tempo2). These events are not actually used
+ // on the sequencer side yet, so this may change to something
+ // nicer at some point.
+ mappedEvent->setInstrument(tempoChange.second);
+
+ ++bufPos;
+ }
+
+ // Store the number of events at the start of the shared memory region
+ *(size_t *)m_mmappedRegion = (bufPos - m_mmappedEventBuffer);
+}
+
+size_t TempoSegmentMmapper::computeMmappedSize()
+{
+ return m_doc->getComposition().getTempoChangeCount() * sizeof(MappedEvent);
+}
+
+}
diff --git a/src/gui/seqmanager/TempoSegmentMmapper.h b/src/gui/seqmanager/TempoSegmentMmapper.h
new file mode 100644
index 0000000..08c8ebf
--- /dev/null
+++ b/src/gui/seqmanager/TempoSegmentMmapper.h
@@ -0,0 +1,60 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_TEMPOSEGMENTMMAPPER_H_
+#define _RG_TEMPOSEGMENTMMAPPER_H_
+
+#include "SpecialSegmentMmapper.h"
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+class RosegardenGUIDoc;
+
+
+class TempoSegmentMmapper : public SpecialSegmentMmapper
+{
+ friend class SegmentMmapperFactory;
+
+protected:
+ TempoSegmentMmapper(RosegardenGUIDoc* doc,
+ QString baseFileName)
+ : SpecialSegmentMmapper(doc, baseFileName) {}
+
+ // overrides from SegmentMmapper
+ virtual size_t computeMmappedSize();
+
+ // override from SegmentMmapper
+ virtual void dump();
+};
+
+//----------------------------------------
+
+
+}
+
+#endif
diff --git a/src/gui/seqmanager/TimeSigSegmentMmapper.cpp b/src/gui/seqmanager/TimeSigSegmentMmapper.cpp
new file mode 100644
index 0000000..98beab3
--- /dev/null
+++ b/src/gui/seqmanager/TimeSigSegmentMmapper.cpp
@@ -0,0 +1,72 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "TimeSigSegmentMmapper.h"
+
+#include "base/Event.h"
+#include "base/RealTime.h"
+#include "base/Segment.h"
+#include "base/TriggerSegment.h"
+#include "document/RosegardenGUIDoc.h"
+#include "SegmentMmapper.h"
+#include "sound/MappedEvent.h"
+#include "SpecialSegmentMmapper.h"
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+void TimeSigSegmentMmapper::dump()
+{
+ RealTime eventTime;
+
+ Composition& comp = m_doc->getComposition();
+ MappedEvent* bufPos = m_mmappedEventBuffer;
+
+ for (int i = 0; i < comp.getTimeSignatureCount(); ++i) {
+
+ std::pair<timeT, TimeSignature> timeSigChange = comp.getTimeSignatureChange(i);
+
+ eventTime = comp.getElapsedRealTime(timeSigChange.first);
+ MappedEvent* mappedEvent = new (bufPos) MappedEvent();
+ mappedEvent->setType(MappedEvent::TimeSignature);
+ mappedEvent->setEventTime(eventTime);
+ mappedEvent->setData1(timeSigChange.second.getNumerator());
+ mappedEvent->setData2(timeSigChange.second.getDenominator());
+
+ ++bufPos;
+ }
+
+ // Store the number of events at the start of the shared memory region
+ *(size_t *)m_mmappedRegion = (bufPos - m_mmappedEventBuffer);
+}
+
+size_t TimeSigSegmentMmapper::computeMmappedSize()
+{
+ return m_doc->getComposition().getTimeSignatureCount() * sizeof(MappedEvent);
+}
+
+}
diff --git a/src/gui/seqmanager/TimeSigSegmentMmapper.h b/src/gui/seqmanager/TimeSigSegmentMmapper.h
new file mode 100644
index 0000000..20e0474
--- /dev/null
+++ b/src/gui/seqmanager/TimeSigSegmentMmapper.h
@@ -0,0 +1,62 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_TIMESIGSEGMENTMMAPPER_H_
+#define _RG_TIMESIGSEGMENTMMAPPER_H_
+
+#include "SpecialSegmentMmapper.h"
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+class RosegardenGUIDoc;
+
+
+class TimeSigSegmentMmapper : public SpecialSegmentMmapper
+{
+ friend class SegmentMmapperFactory;
+
+public:
+
+protected:
+ TimeSigSegmentMmapper(RosegardenGUIDoc* doc,
+ QString baseFileName)
+ : SpecialSegmentMmapper(doc, baseFileName) {}
+
+ // overrides from SegmentMmapper
+ virtual size_t computeMmappedSize();
+
+ // override from SegmentMmapper
+ virtual void dump();
+};
+
+//----------------------------------------
+
+
+}
+
+#endif
diff --git a/src/gui/studio/AudioMixerWindow.cpp b/src/gui/studio/AudioMixerWindow.cpp
new file mode 100644
index 0000000..e8d09b3
--- /dev/null
+++ b/src/gui/studio/AudioMixerWindow.cpp
@@ -0,0 +1,1734 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "AudioMixerWindow.h"
+#include <qlayout.h>
+#include <kapplication.h>
+
+#include "AudioPlugin.h"
+#include "AudioPluginManager.h"
+#include "MixerWindow.h"
+#include "StudioControl.h"
+#include "sound/Midi.h"
+#include "misc/Debug.h"
+#include "gui/application/RosegardenDCOP.h"
+#include "base/AudioLevel.h"
+#include "base/AudioPluginInstance.h"
+#include "base/Composition.h"
+#include "base/Device.h"
+#include "base/Instrument.h"
+#include "base/MidiProgram.h"
+#include "base/Studio.h"
+#include "document/RosegardenGUIDoc.h"
+#include "gui/editors/notation/NotePixmapFactory.h"
+#include "gui/general/GUIPalette.h"
+#include "gui/seqmanager/SequencerMapper.h"
+#include "gui/seqmanager/SequenceManager.h"
+#include "gui/widgets/AudioRouteMenu.h"
+#include "gui/widgets/AudioVUMeter.h"
+#include "gui/widgets/Fader.h"
+#include "gui/widgets/Rotary.h"
+#include "gui/widgets/VUMeter.h"
+#include "sound/MappedCommon.h"
+#include "sound/MappedEvent.h"
+#include "sound/MappedStudio.h"
+#include <klocale.h>
+#include <kstddirs.h>
+#include <kaction.h>
+#include <kglobal.h>
+#include <kmainwindow.h>
+#include <kstdaction.h>
+#include <qaccel.h>
+#include <qcolor.h>
+#include <qfont.h>
+#include <qframe.h>
+#include <qhbox.h>
+#include <qiconset.h>
+#include <qlabel.h>
+#include <qobject.h>
+#include <qpalette.h>
+#include <qpixmap.h>
+#include <qpushbutton.h>
+#include <qstring.h>
+#include <qtooltip.h>
+#include <qvbox.h>
+#include <qwidget.h>
+
+
+namespace Rosegarden
+{
+
+// We define these such that the default of no-bits-set for the
+// studio's mixer display options produces the most sensible result
+static const unsigned int MIXER_OMIT_FADERS = 1 << 0;
+static const unsigned int MIXER_OMIT_SUBMASTERS = 1 << 1;
+static const unsigned int MIXER_OMIT_PLUGINS = 1 << 2;
+static const unsigned int MIXER_SHOW_UNASSIGNED_FADERS = 1 << 3;
+static const unsigned int MIXER_OMIT_SYNTH_FADERS = 1 << 4;
+
+
+AudioMixerWindow::AudioMixerWindow(QWidget *parent,
+ RosegardenGUIDoc *document):
+ MixerWindow(parent, document),
+ m_mainBox (0)
+{
+ populate();
+
+ KStdAction::close(this,
+ SLOT(slotClose()),
+ actionCollection());
+
+ QIconSet icon = QIconSet(NotePixmapFactory::toQPixmap(NotePixmapFactory::makeToolbarPixmap
+ ("transport-play")));
+ KAction *play = new KAction(i18n("&Play"), icon, Key_Enter, this,
+ SIGNAL(play()), actionCollection(), "play");
+ // Alternative shortcut for Play
+ KShortcut playShortcut = play->shortcut();
+ playShortcut.append( KKey(Key_Return + CTRL) );
+ play->setShortcut(playShortcut);
+
+ icon = QIconSet(NotePixmapFactory::toQPixmap(NotePixmapFactory::makeToolbarPixmap
+ ("transport-stop")));
+ new KAction(i18n("&Stop"), icon, Key_Insert, this,
+ SIGNAL(stop()), actionCollection(), "stop");
+
+ icon = QIconSet(NotePixmapFactory::toQPixmap(NotePixmapFactory::makeToolbarPixmap
+ ("transport-rewind")));
+ new KAction(i18n("Re&wind"), icon, Key_End, this,
+ SIGNAL(rewindPlayback()), actionCollection(),
+ "playback_pointer_back_bar");
+
+ icon = QIconSet(NotePixmapFactory::toQPixmap(NotePixmapFactory::makeToolbarPixmap
+ ("transport-ffwd")));
+ new KAction(i18n("&Fast Forward"), icon, Key_PageDown, this,
+ SIGNAL(fastForwardPlayback()), actionCollection(),
+ "playback_pointer_forward_bar");
+
+ icon = QIconSet(NotePixmapFactory::toQPixmap(NotePixmapFactory::makeToolbarPixmap
+ ("transport-rewind-end")));
+ new KAction(i18n("Rewind to &Beginning"), icon, 0, this,
+ SIGNAL(rewindPlaybackToBeginning()), actionCollection(),
+ "playback_pointer_start");
+
+ icon = QIconSet(NotePixmapFactory::toQPixmap(NotePixmapFactory::makeToolbarPixmap
+ ("transport-ffwd-end")));
+ new KAction(i18n("Fast Forward to &End"), icon, 0, this,
+ SIGNAL(fastForwardPlaybackToEnd()), actionCollection(),
+ "playback_pointer_end");
+
+ icon = QIconSet(NotePixmapFactory::toQPixmap(NotePixmapFactory::makeToolbarPixmap
+ ("transport-record")));
+ new KAction(i18n("&Record"), icon, 0, this,
+ SIGNAL(record()), actionCollection(),
+ "record");
+
+ icon = QIconSet(NotePixmapFactory::toQPixmap(NotePixmapFactory::makeToolbarPixmap
+ ("transport-panic")));
+ new KAction(i18n("Panic"), icon, Key_P + CTRL + ALT, this,
+ SIGNAL(panic()), actionCollection(),
+ "panic");
+
+ unsigned int mixerOptions = m_studio->getMixerDisplayOptions();
+
+ (new KToggleAction(i18n("Show Audio &Faders"), 0, this,
+ SLOT(slotToggleFaders()), actionCollection(),
+ "show_audio_faders"))->setChecked
+ (!(mixerOptions & MIXER_OMIT_FADERS));
+
+ (new KToggleAction(i18n("Show Synth &Faders"), 0, this,
+ SLOT(slotToggleSynthFaders()), actionCollection(),
+ "show_synth_faders"))->setChecked
+ (!(mixerOptions & MIXER_OMIT_SYNTH_FADERS));
+
+ (new KToggleAction(i18n("Show &Submasters"), 0, this,
+ SLOT(slotToggleSubmasters()), actionCollection(),
+ "show_audio_submasters"))->setChecked
+ (!(mixerOptions & MIXER_OMIT_SUBMASTERS));
+
+ (new KToggleAction(i18n("Show &Plugin Buttons"), 0, this,
+ SLOT(slotTogglePluginButtons()), actionCollection(),
+ "show_plugin_buttons"))->setChecked
+ (!(mixerOptions & MIXER_OMIT_PLUGINS));
+
+ (new KToggleAction(i18n("Show &Unassigned Faders"), 0, this,
+ SLOT(slotToggleUnassignedFaders()), actionCollection(),
+ "show_unassigned_faders"))->setChecked
+ (mixerOptions & MIXER_SHOW_UNASSIGNED_FADERS);
+
+ KRadioAction *action = 0;
+
+ for (int i = 1; i <= 16; i *= 2) {
+ action =
+ new KRadioAction(i18n("1 Input", "%n Inputs", i),
+ 0, this,
+ SLOT(slotSetInputCountFromAction()), actionCollection(),
+ QString("inputs_%1").arg(i));
+ action->setExclusiveGroup("inputs");
+ if (i == int(m_studio->getRecordIns().size()))
+ action->setChecked(true);
+ }
+
+ action = new KRadioAction
+ (i18n("No Submasters"),
+ 0, this,
+ SLOT(slotSetSubmasterCountFromAction()), actionCollection(),
+ QString("submasters_0"));
+ action->setExclusiveGroup("submasters");
+ action->setChecked(true);
+
+ for (int i = 2; i <= 8; i *= 2) {
+ action = new KRadioAction
+ (i18n("1 Submaster", "%n Submasters", i),
+ 0, this,
+ SLOT(slotSetSubmasterCountFromAction()), actionCollection(),
+ QString("submasters_%1").arg(i));
+ action->setExclusiveGroup("submasters");
+ if (i == int(m_studio->getBusses().size()) - 1)
+ action->setChecked(true);
+ }
+
+ createGUI("mixer.rc");
+}
+
+AudioMixerWindow::~AudioMixerWindow()
+{
+ RG_DEBUG << "AudioMixerWindow::~AudioMixerWindow\n";
+ depopulate();
+}
+
+void
+AudioMixerWindow::depopulate()
+{
+ if (!m_mainBox)
+ return ;
+
+ // All the widgets will be deleted when the main box goes,
+ // except that we need to delete the AudioRouteMenus first
+ // because they aren't actually widgets but do contain them
+
+ for (FaderMap::iterator i = m_faders.begin();
+ i != m_faders.end(); ++i) {
+ delete i->second.m_input;
+ delete i->second.m_output;
+ }
+
+ m_faders.clear();
+ m_submasters.clear();
+
+ delete m_mainBox;
+ m_mainBox = 0;
+}
+
+void
+AudioMixerWindow::populate()
+{
+ if (m_mainBox) {
+
+ depopulate();
+
+ } else {
+
+ m_surroundBox = new QHBox(this);
+ setCentralWidget(m_surroundBox);
+ }
+
+ QFont font;
+ font.setPointSize(font.pointSize() * 8 / 10);
+ font.setBold(false);
+ setFont(font);
+
+ QFont boldFont(font);
+ boldFont.setBold(true);
+
+ m_mainBox = new QFrame(m_surroundBox);
+
+ InstrumentList instruments = m_studio->getPresentationInstruments();
+ BussList busses = m_studio->getBusses();
+
+ QString pixmapDir = KGlobal::dirs()->findResource("appdata", "pixmaps/");
+ m_monoPixmap.load(QString("%1/misc/mono.xpm").arg(pixmapDir));
+ m_stereoPixmap.load(QString("%1/misc/stereo.xpm").arg(pixmapDir));
+
+ // Total cols: is 2 for each fader, submaster or master, plus 1
+ // for each spacer.
+ QGridLayout *mainLayout = new QGridLayout
+ (m_mainBox, (instruments.size() + busses.size()) * 3, 7);
+
+ setCaption(i18n("Audio Mixer"));
+
+ int count = 1;
+ int col = 0;
+
+ unsigned int mixerOptions = m_studio->getMixerDisplayOptions();
+
+ bool showUnassigned = (mixerOptions & MIXER_SHOW_UNASSIGNED_FADERS);
+
+ for (InstrumentList::iterator i = instruments.begin();
+ i != instruments.end(); ++i) {
+
+ if ((*i)->getType() != Instrument::Audio &&
+ (*i)->getType() != Instrument::SoftSynth)
+ continue;
+
+ FaderRec rec;
+
+ if (!showUnassigned) {
+ // Do any tracks use this instrument?
+ if (!isInstrumentAssigned((*i)->getId())) {
+ continue;
+ }
+ }
+ rec.m_populated = true;
+
+ if ((*i)->getType() == Instrument::Audio) {
+ rec.m_input = new AudioRouteMenu(m_mainBox,
+ AudioRouteMenu::In,
+ AudioRouteMenu::Compact,
+ m_studio, *i);
+ QToolTip::add
+ (rec.m_input->getWidget(), i18n("Record input source"));
+ rec.m_input->getWidget()->setMaximumWidth(45);
+ } else {
+ rec.m_input = 0;
+ }
+
+ rec.m_output = new AudioRouteMenu(m_mainBox,
+ AudioRouteMenu::Out,
+ AudioRouteMenu::Compact,
+ m_studio, *i);
+ QToolTip::add
+ (rec.m_output->getWidget(), i18n("Output destination"));
+ rec.m_output->getWidget()->setMaximumWidth(45);
+
+ rec.m_pan = new Rotary
+ (m_mainBox, -100.0, 100.0, 1.0, 5.0, 0.0, 20,
+ Rotary::NoTicks, false, true);
+
+ if ((*i)->getType() == Instrument::Audio) {
+ rec.m_pan->setKnobColour(GUIPalette::getColour(GUIPalette::RotaryPastelGreen));
+ } else {
+ rec.m_pan->setKnobColour(GUIPalette::getColour(GUIPalette::RotaryPastelYellow));
+ }
+
+ QToolTip::add
+ (rec.m_pan, i18n("Pan"));
+
+ rec.m_fader = new Fader
+ (AudioLevel::LongFader, 20, 240, m_mainBox);
+ rec.m_meter = new AudioVUMeter
+ (m_mainBox, VUMeter::AudioPeakHoldIECLong, true, rec.m_input != 0,
+ 20, 240);
+
+ QToolTip::add
+ (rec.m_fader, i18n("Audio level"));
+ QToolTip::add
+ (rec.m_meter, i18n("Audio level"));
+
+ rec.m_stereoButton = new QPushButton(m_mainBox);
+ rec.m_stereoButton->setPixmap(m_monoPixmap);
+ rec.m_stereoButton->setFixedSize(20, 20);
+ rec.m_stereoButton->setFlat(true);
+ rec.m_stereoness = false;
+ QToolTip::add
+ (rec.m_stereoButton, i18n("Mono or stereo"));
+
+ rec.m_muteButton = new QPushButton(m_mainBox);
+ rec.m_muteButton->setText("M");
+ rec.m_muteButton->setToggleButton(true);
+ rec.m_muteButton->setFixedWidth(rec.m_stereoButton->width());
+ rec.m_muteButton->setFixedHeight(rec.m_stereoButton->height());
+ rec.m_muteButton->setFlat(true);
+ QToolTip::add
+ (rec.m_muteButton, i18n("Mute"));
+
+ rec.m_soloButton = new QPushButton(m_mainBox);
+ rec.m_soloButton->setText("S");
+ rec.m_soloButton->setToggleButton(true);
+ rec.m_soloButton->setFixedWidth(rec.m_stereoButton->width());
+ rec.m_soloButton->setFixedHeight(rec.m_stereoButton->height());
+ rec.m_soloButton->setFlat(true);
+ QToolTip::add
+ (rec.m_soloButton, i18n("Solo"));
+
+ rec.m_recordButton = new QPushButton(m_mainBox);
+ rec.m_recordButton->setText("R");
+ rec.m_recordButton->setToggleButton(true);
+ rec.m_recordButton->setFixedWidth(rec.m_stereoButton->width());
+ rec.m_recordButton->setFixedHeight(rec.m_stereoButton->height());
+ rec.m_recordButton->setFlat(true);
+ QToolTip::add
+ (rec.m_recordButton, i18n("Arm recording"));
+
+ rec.m_pluginBox = new QVBox(m_mainBox);
+
+ for (int p = 0; p < 5; ++p) {
+ QPushButton *plugin = new QPushButton(rec.m_pluginBox, "pluginButton");
+ plugin->setText(i18n("<none>"));
+ plugin->setMaximumWidth(45);
+ QToolTip::add
+ (plugin, i18n("Audio plugin button"));
+ rec.m_plugins.push_back(plugin);
+ connect(plugin, SIGNAL(clicked()),
+ this, SLOT(slotSelectPlugin()));
+ }
+
+ QLabel *idLabel;
+ QString idString;
+ if ((*i)->getType() == Instrument::Audio) {
+ idString = i18n("Audio %1").arg((*i)->getId() -
+ AudioInstrumentBase + 1);
+ idLabel = new QLabel(idString, m_mainBox, "audioIdLabel");
+ } else {
+ idString = i18n("Synth %1").arg((*i)->getId() -
+ SoftSynthInstrumentBase + 1);
+ idLabel = new QLabel(idString, m_mainBox, "synthIdLabel");
+ }
+ idLabel->setFont(boldFont);
+
+ if (rec.m_input) {
+ mainLayout->addMultiCellWidget(rec.m_input->getWidget(), 1, 1, col, col + 1);
+ }
+ mainLayout->addMultiCellWidget(rec.m_output->getWidget(), 2, 2, col, col + 1);
+ // mainLayout->addWidget(idLabel, 2, col, Qt::AlignCenter);
+ // mainLayout->addWidget(rec.m_pan, 2, col+1, Qt::AlignLeft);
+
+ mainLayout->addMultiCellWidget(idLabel, 0, 0, col, col + 1, Qt::AlignCenter);
+ mainLayout->addWidget(rec.m_pan, 5, col, Qt::AlignCenter);
+
+ mainLayout->addWidget(rec.m_fader, 3, col, Qt::AlignCenter);
+ mainLayout->addWidget(rec.m_meter, 3, col + 1, Qt::AlignCenter);
+
+ // commented out until implemented
+ // mainLayout->addWidget(rec.m_muteButton, 4, col);
+ // mainLayout->addWidget(rec.m_soloButton, 4, col+1);
+ rec.m_muteButton->hide();
+ rec.m_soloButton->hide();
+
+ // mainLayout->addWidget(rec.m_recordButton, 5, col);
+ // mainLayout->addWidget(rec.m_stereoButton, 5, col+1);
+
+ rec.m_recordButton->hide();
+ mainLayout->addWidget(rec.m_stereoButton, 5, col + 1);
+
+ if (rec.m_pluginBox) {
+ mainLayout->addMultiCellWidget(rec.m_pluginBox, 6, 6, col, col + 1);
+ }
+
+ m_faders[(*i)->getId()] = rec;
+ updateFader((*i)->getId());
+ updateRouteButtons((*i)->getId());
+ updateStereoButton((*i)->getId());
+ updatePluginButtons((*i)->getId());
+
+ if (rec.m_input) {
+ connect(rec.m_input, SIGNAL(changed()),
+ this, SLOT(slotInputChanged()));
+ }
+
+ connect(rec.m_output, SIGNAL(changed()),
+ this, SLOT(slotOutputChanged()));
+
+ connect(rec.m_fader, SIGNAL(faderChanged(float)),
+ this, SLOT(slotFaderLevelChanged(float)));
+
+ connect(rec.m_pan, SIGNAL(valueChanged(float)),
+ this, SLOT(slotPanChanged(float)));
+
+ connect(rec.m_soloButton, SIGNAL(clicked()),
+ this, SLOT(slotSoloChanged()));
+
+ connect(rec.m_muteButton, SIGNAL(clicked()),
+ this, SLOT(slotMuteChanged()));
+
+ connect(rec.m_stereoButton, SIGNAL(clicked()),
+ this, SLOT(slotChannelsChanged()));
+
+ connect(rec.m_recordButton, SIGNAL(clicked()),
+ this, SLOT(slotRecordChanged()));
+
+ ++count;
+
+ mainLayout->addMultiCell(new QSpacerItem(2, 0), 0, 6, col + 2, col + 2);
+
+ col += 3;
+ }
+
+ count = 1;
+
+ for (BussList::iterator i = busses.begin();
+ i != busses.end(); ++i) {
+
+ if (i == busses.begin())
+ continue; // that one's the master
+
+ FaderRec rec;
+ rec.m_populated = true;
+
+ rec.m_pan = new Rotary
+ (m_mainBox, -100.0, 100.0, 1.0, 5.0, 0.0, 20,
+ Rotary::NoTicks, false, true);
+ rec.m_pan->setKnobColour(GUIPalette::getColour(GUIPalette::RotaryPastelBlue));
+
+ QToolTip::add
+ (rec.m_pan, i18n("Pan"));
+
+ rec.m_fader = new Fader
+ (AudioLevel::LongFader, 20, 240, m_mainBox);
+ rec.m_meter = new AudioVUMeter
+ (m_mainBox, VUMeter::AudioPeakHoldIECLong, true, false, 20, 240);
+
+ QToolTip::add
+ (rec.m_fader, i18n("Audio level"));
+ QToolTip::add
+ (rec.m_meter, i18n("Audio level"));
+
+ rec.m_muteButton = new QPushButton(m_mainBox);
+ rec.m_muteButton->setText("M");
+ rec.m_muteButton->setToggleButton(true);
+ rec.m_muteButton->setFlat(true);
+
+ QToolTip::add
+ (rec.m_muteButton, i18n("Mute"));
+
+ rec.m_pluginBox = new QVBox(m_mainBox);
+
+ for (int p = 0; p < 5; ++p) {
+ QPushButton *plugin = new QPushButton(rec.m_pluginBox, "pluginButton");
+ plugin->setText(i18n("<none>"));
+ plugin->setMaximumWidth(45);
+ QToolTip::add
+ (plugin, i18n("Audio plugin button"));
+ rec.m_plugins.push_back(plugin);
+ connect(plugin, SIGNAL(clicked()),
+ this, SLOT(slotSelectPlugin()));
+ }
+
+ QLabel *idLabel = new QLabel(i18n("Sub %1").arg(count), m_mainBox, "subMaster");
+ idLabel->setFont(boldFont);
+
+ // mainLayout->addWidget(idLabel, 2, col, Qt::AlignCenter);
+ mainLayout->addMultiCellWidget(idLabel, 0, 0, col, col + 1, Qt::AlignCenter);
+
+ // mainLayout->addWidget(rec.m_pan, 2, col+1, Qt::AlignLeft);
+ mainLayout->addMultiCellWidget(rec.m_pan, 5, 5, col, col + 1, Qt::AlignCenter);
+
+ mainLayout->addWidget(rec.m_fader, 3, col, Qt::AlignCenter);
+ mainLayout->addWidget(rec.m_meter, 3, col + 1, Qt::AlignCenter);
+
+ // mainLayout->addMultiCellWidget(rec.m_muteButton, 4, 4, col, col+1);
+ rec.m_muteButton->hide();
+
+ if (rec.m_pluginBox) {
+ mainLayout->addMultiCellWidget(rec.m_pluginBox, 6, 6, col, col + 1);
+ }
+
+ m_submasters.push_back(rec);
+ updateFader(count);
+ updatePluginButtons(count);
+
+ connect(rec.m_fader, SIGNAL(faderChanged(float)),
+ this, SLOT(slotFaderLevelChanged(float)));
+
+ connect(rec.m_pan, SIGNAL(valueChanged(float)),
+ this, SLOT(slotPanChanged(float)));
+
+ connect(rec.m_muteButton, SIGNAL(clicked()),
+ this, SLOT(slotMuteChanged()));
+
+ ++count;
+
+ mainLayout->addMultiCell(new QSpacerItem(2, 0), 0, 6, col + 2, col + 2);
+
+ col += 3;
+ }
+
+ if (busses.size() > 0) {
+
+ FaderRec rec;
+ rec.m_populated = true;
+
+ rec.m_fader = new Fader
+ (AudioLevel::LongFader, 20, 240, m_mainBox);
+ rec.m_meter = new AudioVUMeter
+ (m_mainBox, VUMeter::AudioPeakHoldIEC, true, false, 20, 240);
+
+ QToolTip::add
+ (rec.m_fader, i18n("Audio master output level"));
+ QToolTip::add
+ (rec.m_meter, i18n("Audio master output level"));
+
+ rec.m_muteButton = new QPushButton(m_mainBox);
+ rec.m_muteButton->setText("M");
+ rec.m_muteButton->setToggleButton(true);
+ rec.m_muteButton->setFlat(true);
+
+ QLabel *idLabel = new QLabel(i18n("Master"), m_mainBox);
+ idLabel->setFont(boldFont);
+
+ mainLayout->addMultiCellWidget(idLabel, 0, 0, col, col + 1, Qt::AlignCenter);
+ mainLayout->addWidget(rec.m_fader, 3, col, Qt::AlignCenter);
+ mainLayout->addWidget(rec.m_meter, 3, col + 1, Qt::AlignCenter);
+
+ // mainLayout->addMultiCellWidget(rec.m_muteButton, 4, 4, col, col+1);
+ rec.m_muteButton->hide();
+
+ mainLayout->addMultiCell(new QSpacerItem(2, 0), 0, 6, col + 2, col + 2);
+
+ m_master = rec;
+ updateFader(0);
+
+ connect(rec.m_fader, SIGNAL(faderChanged(float)),
+ this, SLOT(slotFaderLevelChanged(float)));
+
+ connect(rec.m_muteButton, SIGNAL(clicked()),
+ this, SLOT(slotMuteChanged()));
+ }
+
+ m_mainBox->show();
+
+ slotUpdateFaderVisibility();
+ slotUpdateSynthFaderVisibility();
+ slotUpdateSubmasterVisibility();
+ slotUpdatePluginButtonVisibility();
+
+ adjustSize();
+}
+
+bool
+AudioMixerWindow::isInstrumentAssigned(InstrumentId id)
+{
+ Composition::trackcontainer &tracks =
+ m_document->getComposition().getTracks();
+
+ for (Composition::trackcontainer::iterator ti =
+ tracks.begin(); ti != tracks.end(); ++ti) {
+ if (ti->second->getInstrument() == id) {
+ return true;
+ }
+ }
+
+ return false;
+}
+
+void
+AudioMixerWindow::slotTrackAssignmentsChanged()
+{
+ for (FaderMap::iterator i = m_faders.begin(); i != m_faders.end(); ++i) {
+
+ InstrumentId id = i->first;
+ bool assigned = isInstrumentAssigned(id);
+
+ if (assigned != i->second.m_populated) {
+ // found an inconsistency
+ populate();
+ return ;
+ }
+ }
+}
+
+void
+AudioMixerWindow::slotUpdateInstrument(InstrumentId id)
+{
+ RG_DEBUG << "AudioMixerWindow::slotUpdateInstrument(" << id << ")" << endl;
+
+ blockSignals(true);
+
+ updateFader(id);
+ updateStereoButton(id);
+ updateRouteButtons(id);
+ updatePluginButtons(id);
+ updateMiscButtons(id);
+
+ blockSignals(false);
+}
+
+void
+AudioMixerWindow::slotPluginSelected(InstrumentId id,
+ int index, int plugin)
+{
+ if (id >= (int)AudioInstrumentBase) {
+
+ FaderRec &rec = m_faders[id];
+ if (!rec.m_populated || !rec.m_pluginBox)
+ return ;
+
+ // nowhere to display synth plugin info yet
+ if (index >= rec.m_plugins.size())
+ return ;
+
+ if (plugin == -1) {
+
+ rec.m_plugins[index]->setText(i18n("<none>"));
+ QToolTip::add
+ (rec.m_plugins[index], i18n("<no plugin>"));
+
+ rec.m_plugins[index]->setPaletteBackgroundColor
+ (kapp->palette().
+ color(QPalette::Active, QColorGroup::Button));
+
+ } else {
+
+ AudioPlugin *pluginClass
+ = m_document->getPluginManager()->getPlugin(plugin);
+
+ QColor pluginBgColour =
+ kapp->palette().color(QPalette::Active, QColorGroup::Light);
+
+ if (pluginClass) {
+ rec.m_plugins[index]->
+ setText(pluginClass->getLabel());
+ QToolTip::add
+ (rec.m_plugins[index], pluginClass->getLabel());
+
+ pluginBgColour = pluginClass->getColour();
+ }
+
+
+ rec.m_plugins[index]->setPaletteForegroundColor(Qt::white);
+ rec.m_plugins[index]->setPaletteBackgroundColor(pluginBgColour);
+ }
+ } else if (id > 0 && id <= m_submasters.size()) {
+
+ FaderRec &rec = m_submasters[id - 1];
+ if (!rec.m_populated || !rec.m_pluginBox)
+ return ;
+ if (index >= rec.m_plugins.size())
+ return ;
+
+ if (plugin == -1) {
+
+ rec.m_plugins[index]->setText(i18n("<none>"));
+ QToolTip::add
+ (rec.m_plugins[index], i18n("<no plugin>"));
+
+ rec.m_plugins[index]->setPaletteBackgroundColor
+ (kapp->palette().
+ color(QPalette::Active, QColorGroup::Button));
+
+ } else {
+
+ AudioPlugin *pluginClass
+ = m_document->getPluginManager()->getPlugin(plugin);
+
+ QColor pluginBgColour =
+ kapp->palette().color(QPalette::Active, QColorGroup::Light);
+
+ if (pluginClass) {
+ rec.m_plugins[index]->
+ setText(pluginClass->getLabel());
+ QToolTip::add
+ (rec.m_plugins[index], pluginClass->getLabel());
+
+ pluginBgColour = pluginClass->getColour();
+ }
+
+
+ rec.m_plugins[index]->setPaletteForegroundColor(Qt::white);
+ rec.m_plugins[index]->setPaletteBackgroundColor(pluginBgColour);
+ }
+ }
+}
+
+void
+AudioMixerWindow::slotPluginBypassed(InstrumentId instrumentId,
+ int , bool )
+{
+ RG_DEBUG << "AudioMixerWindow::slotPluginBypassed(" << instrumentId << ")" << endl;
+
+ updatePluginButtons(instrumentId);
+}
+
+void
+AudioMixerWindow::updateFader(int id)
+{
+ if (id == -1) {
+
+ // This used to be the special code for updating the monitor fader.
+ return ;
+
+ } else if (id >= (int)AudioInstrumentBase) {
+
+ FaderRec &rec = m_faders[id];
+ if (!rec.m_populated)
+ return ;
+ Instrument *instrument = m_studio->getInstrumentById(id);
+
+ rec.m_fader->blockSignals(true);
+ rec.m_fader->setFader(instrument->getLevel());
+ rec.m_fader->blockSignals(false);
+
+ rec.m_pan->blockSignals(true);
+ rec.m_pan->setPosition(instrument->getPan() - 100);
+ rec.m_pan->blockSignals(false);
+
+ } else {
+
+ FaderRec &rec = (id == 0 ? m_master : m_submasters[id - 1]);
+ BussList busses = m_studio->getBusses();
+ Buss *buss = busses[id];
+
+ rec.m_fader->blockSignals(true);
+ rec.m_fader->setFader(buss->getLevel());
+ rec.m_fader->blockSignals(false);
+
+ if (rec.m_pan) {
+ rec.m_pan->blockSignals(true);
+ rec.m_pan->setPosition(buss->getPan() - 100);
+ rec.m_pan->blockSignals(false);
+ }
+ }
+}
+
+void
+AudioMixerWindow::updateRouteButtons(int id)
+{
+ if (id >= (int)AudioInstrumentBase) {
+ FaderRec &rec = m_faders[id];
+ if (!rec.m_populated)
+ return ;
+ if (rec.m_input)
+ rec.m_input->slotRepopulate();
+ rec.m_output->slotRepopulate();
+ }
+}
+
+void
+AudioMixerWindow::updateStereoButton(int id)
+{
+ if (id >= (int)AudioInstrumentBase) {
+
+ FaderRec &rec = m_faders[id];
+ if (!rec.m_populated)
+ return ;
+ Instrument *i = m_studio->getInstrumentById(id);
+
+ bool stereo = (i->getAudioChannels() > 1);
+ if (stereo == rec.m_stereoness)
+ return ;
+
+ rec.m_stereoness = stereo;
+
+ if (stereo)
+ rec.m_stereoButton->setPixmap(m_stereoPixmap);
+ else
+ rec.m_stereoButton->setPixmap(m_monoPixmap);
+ }
+}
+
+void
+AudioMixerWindow::updateMiscButtons(int )
+{
+ //... complications here, because the mute/solo status is actually
+ // per-track rather than per-instrument... doh.
+}
+
+void
+AudioMixerWindow::updatePluginButtons(int id)
+{
+ FaderRec *rec = 0;
+ PluginContainer *container = 0;
+
+ if (id >= (int)AudioInstrumentBase) {
+
+ container = m_studio->getInstrumentById(id);
+ rec = &m_faders[id];
+ if (!rec->m_populated || !rec->m_pluginBox)
+ return ;
+
+ } else {
+
+ BussList busses = m_studio->getBusses();
+ if (busses.size() > id) {
+ container = busses[id];
+ }
+ rec = &m_submasters[id - 1];
+ if (!rec->m_populated || !rec->m_pluginBox)
+ return ;
+ }
+
+ if (rec && container) {
+
+ for (unsigned int i = 0; i < rec->m_plugins.size(); i++) {
+
+ bool used = false;
+ bool bypass = false;
+ QColor pluginBgColour =
+ kapp->palette().color(QPalette::Active, QColorGroup::Light);
+
+ rec->m_plugins[i]->show();
+
+ AudioPluginInstance *inst = container->getPlugin(i);
+
+ if (inst && inst->isAssigned()) {
+
+ AudioPlugin *pluginClass
+ = m_document->getPluginManager()->getPlugin(
+ m_document->getPluginManager()->
+ getPositionByIdentifier(inst->getIdentifier().c_str()));
+
+ if (pluginClass) {
+ rec->m_plugins[i]->setText(pluginClass->getLabel());
+ QToolTip::add
+ (rec->m_plugins[i], pluginClass->getLabel());
+
+ pluginBgColour = pluginClass->getColour();
+ }
+
+ used = true;
+ bypass = inst->isBypassed();
+
+ } else {
+
+ rec->m_plugins[i]->setText(i18n("<none>"));
+ QToolTip::add
+ (rec->m_plugins[i], i18n("<no plugin>"));
+
+ if (inst)
+ bypass = inst->isBypassed();
+ }
+
+ if (bypass) {
+
+ rec->m_plugins[i]->setPaletteForegroundColor
+ (kapp->palette().
+ color(QPalette::Active, QColorGroup::Button));
+
+ rec->m_plugins[i]->setPaletteBackgroundColor
+ (kapp->palette().
+ color(QPalette::Active, QColorGroup::ButtonText));
+
+ } else if (used) {
+
+ rec->m_plugins[i]->setPaletteForegroundColor(Qt::white);
+ rec->m_plugins[i]->setPaletteBackgroundColor(pluginBgColour);
+
+
+ } else {
+
+ rec->m_plugins[i]->setPaletteForegroundColor
+ (kapp->palette().
+ color(QPalette::Active, QColorGroup::ButtonText));
+
+ rec->m_plugins[i]->setPaletteBackgroundColor
+ (kapp->palette().
+ color(QPalette::Active, QColorGroup::Button));
+ }
+ }
+ }
+}
+
+void
+AudioMixerWindow::slotSelectPlugin()
+{
+ const QObject *s = sender();
+
+ for (FaderMap::iterator i = m_faders.begin();
+ i != m_faders.end(); ++i) {
+
+ int index = 0;
+ if (!i->second.m_populated || !i->second.m_pluginBox)
+ continue;
+
+ for (std::vector<QPushButton *>::iterator pli = i->second.m_plugins.begin();
+ pli != i->second.m_plugins.end(); ++pli) {
+
+ if (*pli == s) {
+
+ emit selectPlugin(this, i->first, index);
+ return ;
+ }
+
+ ++index;
+ }
+ }
+
+
+ int b = 1;
+
+ for (FaderVector::iterator i = m_submasters.begin();
+ i != m_submasters.end(); ++i) {
+
+ int index = 0;
+ if (!i->m_populated || !i->m_pluginBox)
+ continue;
+
+ for (std::vector<QPushButton *>::iterator pli = i->m_plugins.begin();
+ pli != i->m_plugins.end(); ++pli) {
+
+ if (*pli == s) {
+
+ emit selectPlugin(this, b, index);
+ return ;
+ }
+
+ ++index;
+ }
+
+ ++b;
+ }
+}
+
+void
+AudioMixerWindow::slotInputChanged()
+{
+ const QObject *s = sender();
+
+ for (FaderMap::iterator i = m_faders.begin();
+ i != m_faders.end(); ++i) {
+
+ if (i->second.m_input == s)
+ emit instrumentParametersChanged(i->first);
+ }
+}
+
+void
+AudioMixerWindow::slotOutputChanged()
+{
+ const QObject *s = sender();
+
+ for (FaderMap::iterator i = m_faders.begin();
+ i != m_faders.end(); ++i) {
+
+ if (i->second.m_output == s)
+ emit instrumentParametersChanged(i->first);
+ }
+}
+
+void
+AudioMixerWindow::sendControllerRefresh()
+{
+ //!!! really want some notification of whether we have an external controller!
+ int controllerChannel = 0;
+
+ for (FaderMap::iterator i = m_faders.begin(); i != m_faders.end(); ++i) {
+
+ if (controllerChannel >= 16)
+ break;
+
+ Instrument *instrument =
+ m_studio->getInstrumentById(i->first);
+
+ int value = AudioLevel::dB_to_fader
+ (instrument->getLevel(), 127, AudioLevel::LongFader);
+ MappedEvent mE(instrument->getId(),
+ MappedEvent::MidiController,
+ MIDI_CONTROLLER_VOLUME,
+ MidiByte(value));
+ mE.setRecordedChannel(controllerChannel);
+ mE.setRecordedDevice(Device::CONTROL_DEVICE);
+ StudioControl::sendMappedEvent(mE);
+
+ int ipan = (int(instrument->getPan()) * 64) / 100;
+ if (ipan < 0)
+ ipan = 0;
+ if (ipan > 127)
+ ipan = 127;
+ MappedEvent mEp(instrument->getId(),
+ MappedEvent::MidiController,
+ MIDI_CONTROLLER_PAN,
+ MidiByte(ipan));
+ mEp.setRecordedChannel(controllerChannel);
+ mEp.setRecordedDevice(Device::CONTROL_DEVICE);
+ StudioControl::sendMappedEvent(mEp);
+
+ ++controllerChannel;
+ }
+}
+
+void
+AudioMixerWindow::slotFaderLevelChanged(float dB)
+{
+ const QObject *s = sender();
+
+ BussList busses = m_studio->getBusses();
+
+ if (m_master.m_fader == s) {
+
+ if (busses.size() > 0) {
+ StudioControl::setStudioObjectProperty
+ (MappedObjectId(busses[0]->getMappedId()),
+ MappedAudioBuss::Level,
+ MappedObjectValue(dB));
+ busses[0]->setLevel(dB);
+ }
+
+ return ;
+ }
+
+ int index = 1;
+
+ for (FaderVector::iterator i = m_submasters.begin();
+ i != m_submasters.end(); ++i) {
+
+ if (i->m_fader == s) {
+ if ((int)busses.size() > index) {
+ StudioControl::setStudioObjectProperty
+ (MappedObjectId(busses[index]->getMappedId()),
+ MappedAudioBuss::Level,
+ MappedObjectValue(dB));
+ busses[index]->setLevel(dB);
+ }
+
+ return ;
+ }
+
+ ++index;
+ }
+
+ int controllerChannel = 0;
+
+ for (FaderMap::iterator i = m_faders.begin();
+ i != m_faders.end(); ++i) {
+
+ if (i->second.m_fader == s) {
+
+ Instrument *instrument =
+ m_studio->getInstrumentById(i->first);
+
+ if (instrument) {
+ StudioControl::setStudioObjectProperty
+ (MappedObjectId
+ (instrument->getMappedId()),
+ MappedAudioFader::FaderLevel,
+ MappedObjectValue(dB));
+ instrument->setLevel(dB);
+ }
+
+ // send out to external controllers as well.
+ //!!! really want some notification of whether we have any!
+ if (controllerChannel < 16) {
+ int value = AudioLevel::dB_to_fader
+ (dB, 127, AudioLevel::LongFader);
+ MappedEvent mE(instrument->getId(),
+ MappedEvent::MidiController,
+ MIDI_CONTROLLER_VOLUME,
+ MidiByte(value));
+ mE.setRecordedChannel(controllerChannel);
+ mE.setRecordedDevice(Device::CONTROL_DEVICE);
+ StudioControl::sendMappedEvent(mE);
+ }
+
+ emit instrumentParametersChanged(i->first);
+ }
+
+ ++controllerChannel;
+ }
+}
+
+void
+AudioMixerWindow::slotPanChanged(float pan)
+{
+ const QObject *s = sender();
+
+ BussList busses = m_studio->getBusses();
+
+ int index = 1;
+
+ for (FaderVector::iterator i = m_submasters.begin();
+ i != m_submasters.end(); ++i) {
+
+ if (i->m_pan == s) {
+ if ((int)busses.size() > index) {
+ StudioControl::setStudioObjectProperty
+ (MappedObjectId(busses[index]->getMappedId()),
+ MappedAudioBuss::Pan,
+ MappedObjectValue(pan));
+ busses[index]->setPan(MidiByte(pan + 100.0));
+ }
+ return ;
+ }
+
+ ++index;
+ }
+
+ int controllerChannel = 0;
+
+ for (FaderMap::iterator i = m_faders.begin();
+ i != m_faders.end(); ++i) {
+
+ if (i->second.m_pan == s) {
+
+ Instrument *instrument =
+ m_studio->getInstrumentById(i->first);
+
+ if (instrument) {
+ StudioControl::setStudioObjectProperty
+ (instrument->getMappedId(),
+ MappedAudioFader::Pan,
+ MappedObjectValue(pan));
+ instrument->setPan(MidiByte(pan + 100.0));
+ }
+
+ // send out to external controllers as well.
+ //!!! really want some notification of whether we have any!
+ if (controllerChannel < 16) {
+ int ipan = (int(instrument->getPan()) * 64) / 100;
+ if (ipan < 0)
+ ipan = 0;
+ if (ipan > 127)
+ ipan = 127;
+ MappedEvent mE(instrument->getId(),
+ MappedEvent::MidiController,
+ MIDI_CONTROLLER_PAN,
+ MidiByte(ipan));
+ mE.setRecordedChannel(controllerChannel);
+ mE.setRecordedDevice(Device::CONTROL_DEVICE);
+ StudioControl::sendMappedEvent(mE);
+ }
+
+ emit instrumentParametersChanged(i->first);
+ }
+
+ ++controllerChannel;
+ }
+}
+
+void
+AudioMixerWindow::slotChannelsChanged()
+{
+ const QObject *s = sender();
+
+ // channels are only switchable on instruments
+
+ //!!! need to reconnect input, or change input channel number anyway
+
+
+ for (FaderMap::iterator i = m_faders.begin();
+ i != m_faders.end(); ++i) {
+
+ if (s == i->second.m_stereoButton) {
+
+ Instrument *instrument =
+ m_studio->getInstrumentById(i->first);
+
+ if (instrument) {
+ instrument->setAudioChannels
+ ((instrument->getAudioChannels() > 1) ? 1 : 2);
+ updateStereoButton(instrument->getId());
+ updateRouteButtons(instrument->getId());
+
+ emit instrumentParametersChanged(i->first);
+
+ return ;
+ }
+ }
+ }
+}
+
+void
+AudioMixerWindow::slotSoloChanged()
+{
+ //...
+}
+
+void
+AudioMixerWindow::slotMuteChanged()
+{
+ //...
+}
+
+void
+AudioMixerWindow::slotRecordChanged()
+{
+ //...
+}
+
+void
+AudioMixerWindow::updateMeters(SequencerMapper *mapper)
+{
+ for (FaderMap::iterator i = m_faders.begin(); i != m_faders.end(); ++i) {
+
+ InstrumentId id = i->first;
+ FaderRec &rec = i->second;
+ if (!rec.m_populated)
+ continue;
+
+ LevelInfo info;
+
+ if (mapper->getInstrumentLevelForMixer(id, info)) {
+
+ // The values passed through are long-fader values
+ float dBleft = AudioLevel::fader_to_dB
+ (info.level, 127, AudioLevel::LongFader);
+
+ if (rec.m_stereoness) {
+ float dBright = AudioLevel::fader_to_dB
+ (info.levelRight, 127, AudioLevel::LongFader);
+
+ rec.m_meter->setLevel(dBleft, dBright);
+
+ } else {
+ rec.m_meter->setLevel(dBleft);
+ }
+ }
+ }
+
+ for (unsigned int i = 0; i < m_submasters.size(); ++i) {
+
+ FaderRec &rec = m_submasters[i];
+
+ LevelInfo info;
+ if (!mapper->getSubmasterLevel(i, info))
+ continue;
+
+ // The values passed through are long-fader values
+ float dBleft = AudioLevel::fader_to_dB
+ (info.level, 127, AudioLevel::LongFader);
+ float dBright = AudioLevel::fader_to_dB
+ (info.levelRight, 127, AudioLevel::LongFader);
+
+ rec.m_meter->setLevel(dBleft, dBright);
+ }
+
+ updateMonitorMeters(mapper);
+
+ LevelInfo masterInfo;
+ if (mapper->getMasterLevel(masterInfo)) {
+
+ float dBleft = AudioLevel::fader_to_dB
+ (masterInfo.level, 127, AudioLevel::LongFader);
+ float dBright = AudioLevel::fader_to_dB
+ (masterInfo.levelRight, 127, AudioLevel::LongFader);
+
+ m_master.m_meter->setLevel(dBleft, dBright);
+ }
+}
+
+void
+AudioMixerWindow::updateMonitorMeters(SequencerMapper *mapper)
+{
+ // only show monitor levels when quiescent or when recording (as
+ // record levels)
+ if (m_document->getSequenceManager() &&
+ m_document->getSequenceManager()->getTransportStatus() == PLAYING) {
+ return ;
+ }
+
+ Composition &comp = m_document->getComposition();
+ Composition::trackcontainer &tracks = comp.getTracks();
+
+ for (FaderMap::iterator i = m_faders.begin(); i != m_faders.end(); ++i) {
+
+ InstrumentId id = i->first;
+ FaderRec &rec = i->second;
+ if (!rec.m_populated)
+ continue;
+
+ LevelInfo info;
+
+ if (mapper->getInstrumentRecordLevelForMixer(id, info)) {
+
+ bool armed = false;
+
+ for (Composition::trackcontainer::iterator ti =
+ tracks.begin(); ti != tracks.end(); ++ti) {
+ if (ti->second->getInstrument() == id) {
+ if (comp.isTrackRecording(ti->second->getId())) {
+ armed = true;
+ break;
+ }
+ }
+ }
+
+ if (!armed)
+ continue;
+
+ // The values passed through are long-fader values
+ float dBleft = AudioLevel::fader_to_dB
+ (info.level, 127, AudioLevel::LongFader);
+
+ if (rec.m_stereoness) {
+ float dBright = AudioLevel::fader_to_dB
+ (info.levelRight, 127, AudioLevel::LongFader);
+
+ rec.m_meter->setRecordLevel(dBleft, dBright);
+
+ } else {
+ rec.m_meter->setRecordLevel(dBleft);
+ }
+ }
+ }
+}
+
+void
+AudioMixerWindow::slotControllerDeviceEventReceived(MappedEvent *e,
+ const void *preferredCustomer)
+{
+ if (preferredCustomer != this)
+ return ;
+ RG_DEBUG << "AudioMixerWindow::slotControllerDeviceEventReceived: this one's for me" << endl;
+ raise();
+
+ // get channel number n from event
+ // update instrument for nth fader in m_faders
+
+ if (e->getType() != MappedEvent::MidiController)
+ return ;
+ unsigned int channel = e->getRecordedChannel();
+ MidiByte controller = e->getData1();
+ MidiByte value = e->getData2();
+
+ int count = 0;
+ for (FaderMap::iterator i = m_faders.begin(); i != m_faders.end(); ++i) {
+
+ if (count < channel) {
+ ++count;
+ continue;
+ }
+
+ Instrument *instrument =
+ m_studio->getInstrumentById(i->first);
+ if (!instrument)
+ continue;
+
+ switch (controller) {
+
+ case MIDI_CONTROLLER_VOLUME: {
+ float level = AudioLevel::fader_to_dB
+ (value, 127, AudioLevel::LongFader);
+
+ StudioControl::setStudioObjectProperty
+ (instrument->getMappedId(),
+ MappedAudioFader::FaderLevel,
+ MappedObjectValue(level));
+
+ instrument->setLevel(level);
+ break;
+ }
+
+ case MIDI_CONTROLLER_PAN: {
+ MidiByte ipan = MidiByte((value / 64.0) * 100.0 + 0.01);
+
+ StudioControl::setStudioObjectProperty
+ (instrument->getMappedId(),
+ MappedAudioFader::Pan,
+ MappedObjectValue(float(ipan) - 100.0));
+
+ instrument->setPan(ipan);
+ break;
+ }
+
+ default:
+ break;
+ }
+
+ slotUpdateInstrument(i->first);
+ emit instrumentParametersChanged(i->first);
+
+ break;
+ }
+}
+
+void
+AudioMixerWindow::slotSetInputCountFromAction()
+{
+ const QObject *s = sender();
+ QString name = s->name();
+
+ if (name.left(7) == "inputs_") {
+
+ int count = name.right(name.length() - 7).toInt();
+
+ RecordInList ins = m_studio->getRecordIns();
+ int current = ins.size();
+
+ if (count == current)
+ return ;
+
+ m_studio->clearRecordIns(); // leaves the default 1
+
+ for (int i = 1; i < count; ++i) {
+ m_studio->addRecordIn(new RecordIn());
+ }
+ }
+
+ m_document->initialiseStudio();
+
+ for (FaderMap::iterator i = m_faders.begin();
+ i != m_faders.end(); ++i) {
+ updateRouteButtons(i->first);
+ }
+}
+
+void
+AudioMixerWindow::slotSetSubmasterCountFromAction()
+{
+ const QObject *s = sender();
+ QString name = s->name();
+
+ if (name.left(11) == "submasters_") {
+
+ int count = name.right(name.length() - 11).toInt();
+
+ BussList busses = m_studio->getBusses();
+ int current = busses.size();
+
+ // offset by 1 generally to take into account the fact that
+ // the first buss in the studio is the master, not a submaster
+
+ if (count + 1 == current)
+ return ;
+
+ BussList dups;
+ for (int i = 0; i < count; ++i) {
+ if (i + 1 < int(busses.size())) {
+ dups.push_back(new Buss(*busses[i + 1]));
+ } else {
+ dups.push_back(new Buss(i + 1));
+ }
+ }
+
+ m_studio->clearBusses();
+
+ for (BussList::iterator i = dups.begin();
+ i != dups.end(); ++i) {
+ m_studio->addBuss(*i);
+ }
+ }
+
+ m_document->initialiseStudio();
+
+ populate();
+}
+
+void AudioMixerWindow::FaderRec::setVisible(bool visible)
+{
+ if (visible) {
+ if (m_input)
+ m_input->getWidget()->show();
+ if (m_output)
+ m_output->getWidget()->show();
+ if (m_pan)
+ m_pan->show();
+ if (m_fader)
+ m_fader->show();
+ if (m_meter)
+ m_meter->show();
+ // commented out until implemented
+ // if (m_muteButton) m_muteButton->show();
+ // if (m_soloButton) m_soloButton->show();
+ // if (m_recordButton) m_recordButton->show();
+ if (m_stereoButton)
+ m_stereoButton->show();
+
+ } else {
+
+ if (m_input)
+ m_input->getWidget()->hide();
+ if (m_output)
+ m_output->getWidget()->hide();
+ if (m_pan)
+ m_pan->hide();
+ if (m_fader)
+ m_fader->hide();
+ if (m_meter)
+ m_meter->hide();
+ // commented out until implemented
+ // if (m_muteButton) m_muteButton->hide();
+ // if (m_soloButton) m_soloButton->hide();
+ // if (m_recordButton) m_recordButton->hide();
+ if (m_stereoButton)
+ m_stereoButton->hide();
+ }
+
+ setPluginButtonsVisible(visible);
+
+}
+
+void
+AudioMixerWindow::FaderRec::setPluginButtonsVisible(bool visible)
+{
+ if (!m_pluginBox)
+ return ;
+
+ if (visible) {
+ m_pluginBox->show();
+ } else {
+ m_pluginBox->hide();
+ }
+}
+
+void
+AudioMixerWindow::slotToggleFaders()
+{
+ m_studio->setMixerDisplayOptions(m_studio->getMixerDisplayOptions() ^
+ MIXER_OMIT_FADERS);
+
+ slotUpdateFaderVisibility();
+}
+
+void
+AudioMixerWindow::slotUpdateFaderVisibility()
+{
+ bool d = !(m_studio->getMixerDisplayOptions() & MIXER_OMIT_FADERS);
+
+ KToggleAction *action = dynamic_cast<KToggleAction *>
+ (actionCollection()->action("show_audio_faders"));
+ if (action) {
+ action->setChecked(d);
+ }
+
+ RG_DEBUG << "AudioMixerWindow::slotUpdateFaderVisibility: visiblility is " << d << " (options " << m_studio->getMixerDisplayOptions() << ")" << endl;
+
+ for (FaderMap::iterator i = m_faders.begin(); i != m_faders.end(); ++i) {
+ if (i->first < SoftSynthInstrumentBase) {
+ FaderRec rec = i->second;
+ rec.setVisible(d);
+ }
+ }
+
+ toggleNamedWidgets(d, "audioIdLabel");
+
+ adjustSize();
+}
+
+void
+AudioMixerWindow::slotToggleSynthFaders()
+{
+ m_studio->setMixerDisplayOptions(m_studio->getMixerDisplayOptions() ^
+ MIXER_OMIT_SYNTH_FADERS);
+
+ slotUpdateSynthFaderVisibility();
+}
+
+void
+AudioMixerWindow::slotUpdateSynthFaderVisibility()
+{
+ KToggleAction *action = dynamic_cast<KToggleAction *>
+ (actionCollection()->action("show_synth_faders"));
+ if (!action)
+ return ;
+
+ action->setChecked(!(m_studio->getMixerDisplayOptions() &
+ MIXER_OMIT_SYNTH_FADERS));
+
+ for (FaderMap::iterator i = m_faders.begin(); i != m_faders.end(); ++i) {
+ if (i->first >= SoftSynthInstrumentBase) {
+ FaderRec rec = i->second;
+ rec.setVisible(action->isChecked());
+ }
+ }
+
+ toggleNamedWidgets(action->isChecked(), "synthIdLabel");
+
+ adjustSize();
+}
+
+void
+AudioMixerWindow::slotToggleSubmasters()
+{
+ m_studio->setMixerDisplayOptions(m_studio->getMixerDisplayOptions() ^
+ MIXER_OMIT_SUBMASTERS);
+
+ slotUpdateSubmasterVisibility();
+}
+
+void
+AudioMixerWindow::slotUpdateSubmasterVisibility()
+{
+ KToggleAction *action = dynamic_cast<KToggleAction *>
+ (actionCollection()->action("show_audio_submasters"));
+ if (!action)
+ return ;
+
+ action->setChecked(!(m_studio->getMixerDisplayOptions() &
+ MIXER_OMIT_SUBMASTERS));
+
+ for (FaderVector::iterator i = m_submasters.begin(); i != m_submasters.end(); ++i) {
+ FaderRec rec = *i;
+ rec.setVisible(action->isChecked());
+ }
+
+ toggleNamedWidgets(action->isChecked(), "subMaster");
+
+ adjustSize();
+}
+
+void
+AudioMixerWindow::slotTogglePluginButtons()
+{
+ m_studio->setMixerDisplayOptions(m_studio->getMixerDisplayOptions() ^
+ MIXER_OMIT_PLUGINS);
+
+ slotUpdatePluginButtonVisibility();
+}
+
+void
+AudioMixerWindow::slotUpdatePluginButtonVisibility()
+{
+ KToggleAction *action = dynamic_cast<KToggleAction *>
+ (actionCollection()->action("show_plugin_buttons"));
+ if (!action)
+ return ;
+
+ action->setChecked(!(m_studio->getMixerDisplayOptions() &
+ MIXER_OMIT_PLUGINS));
+
+ for (FaderMap::iterator i = m_faders.begin(); i != m_faders.end(); ++i) {
+ FaderRec rec = i->second;
+ rec.setPluginButtonsVisible(action->isChecked());
+ }
+
+ adjustSize();
+}
+
+void
+AudioMixerWindow::slotToggleUnassignedFaders()
+{
+ KToggleAction *action = dynamic_cast<KToggleAction *>
+ (actionCollection()->action("show_unassigned_faders"));
+ if (!action)
+ return ;
+
+ m_studio->setMixerDisplayOptions(m_studio->getMixerDisplayOptions() ^
+ MIXER_SHOW_UNASSIGNED_FADERS);
+
+ action->setChecked(m_studio->getMixerDisplayOptions() &
+ MIXER_SHOW_UNASSIGNED_FADERS);
+
+ populate();
+}
+
+void
+AudioMixerWindow::toggleNamedWidgets(bool show, const char* const name)
+{
+ QLayoutIterator it = m_mainBox->layout()->iterator();
+ QLayoutItem *child;
+ while ( (child = it.current()) != 0 ) {
+ QWidget * widget = child->widget();
+ if (widget && widget->name() && !strcmp(widget->name(), name)) {
+ if (show)
+ widget->show();
+ else
+ widget->hide();
+ }
+
+ ++it;
+ }
+
+}
+
+}
+#include "AudioMixerWindow.moc"
diff --git a/src/gui/studio/AudioMixerWindow.h b/src/gui/studio/AudioMixerWindow.h
new file mode 100644
index 0000000..99829de
--- /dev/null
+++ b/src/gui/studio/AudioMixerWindow.h
@@ -0,0 +1,191 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_AUDIOMIXERWINDOW_H_
+#define _RG_AUDIOMIXERWINDOW_H_
+
+#include "base/MidiProgram.h"
+#include <map>
+#include "MixerWindow.h"
+#include <qpixmap.h>
+#include <vector>
+
+
+class QWidget;
+class QVBox;
+class QPushButton;
+class QHBox;
+class QFrame;
+
+
+namespace Rosegarden
+{
+
+class SequencerMapper;
+class Rotary;
+class RosegardenGUIDoc;
+class MappedEvent;
+class Fader;
+class AudioVUMeter;
+class AudioRouteMenu;
+
+
+class AudioMixerWindow : public MixerWindow
+{
+ Q_OBJECT
+
+public:
+ AudioMixerWindow(QWidget *parent, RosegardenGUIDoc *document);
+ ~AudioMixerWindow();
+
+ void updateMeters(SequencerMapper *mapper);
+ void updateMonitorMeters(SequencerMapper *mapper);
+
+public slots:
+ void slotControllerDeviceEventReceived(MappedEvent *,
+ const void *);
+
+signals:
+ void selectPlugin(QWidget *, InstrumentId id, int index);
+
+ void play();
+ void stop();
+ void fastForwardPlayback();
+ void rewindPlayback();
+ void fastForwardPlaybackToEnd();
+ void rewindPlaybackToBeginning();
+ void record();
+ void panic();
+
+ // to be redirected to the instrument parameter box if necessary
+ void instrumentParametersChanged(InstrumentId);
+
+protected slots:
+ void slotFaderLevelChanged(float level);
+ void slotPanChanged(float value);
+ void slotInputChanged();
+ void slotOutputChanged();
+ void slotChannelsChanged();
+ void slotSoloChanged();
+ void slotMuteChanged();
+ void slotRecordChanged();
+ void slotSelectPlugin();
+
+ // to be called if something changes in an instrument parameter box
+ void slotUpdateInstrument(InstrumentId);
+
+ void slotTrackAssignmentsChanged();
+
+ // from Plugin dialog
+ void slotPluginSelected(InstrumentId id, int index, int plugin);
+ void slotPluginBypassed(InstrumentId id, int pluginIndex, bool bp);
+
+ void slotSetInputCountFromAction();
+ void slotSetSubmasterCountFromAction();
+
+ void slotToggleFaders();
+ void slotToggleSynthFaders();
+ void slotToggleSubmasters();
+ void slotTogglePluginButtons();
+ void slotToggleUnassignedFaders();
+
+ void slotUpdateFaderVisibility();
+ void slotUpdateSynthFaderVisibility();
+ void slotUpdateSubmasterVisibility();
+ void slotUpdatePluginButtonVisibility();
+
+protected:
+ virtual void sendControllerRefresh();
+
+private:
+
+ void toggleNamedWidgets(bool show, const char* const);
+
+
+ // manage the various bits of it in horizontal/vertical slices
+ // with other faders:
+
+ struct FaderRec {
+
+ FaderRec() :
+ m_populated(false),
+ m_input(0), m_output(0), m_pan(0), m_fader(0), m_meter(0),
+ m_muteButton(0), m_soloButton(0), m_recordButton(0),
+ m_stereoButton(0), m_stereoness(false), m_pluginBox(0)
+ { }
+
+ void setVisible(bool);
+ void setPluginButtonsVisible(bool);
+
+ bool m_populated;
+
+ AudioRouteMenu *m_input;
+ AudioRouteMenu *m_output;
+
+ Rotary *m_pan;
+ Fader *m_fader;
+ AudioVUMeter *m_meter;
+
+ QPushButton *m_muteButton;
+ QPushButton *m_soloButton;
+ QPushButton *m_recordButton;
+ QPushButton *m_stereoButton;
+ bool m_stereoness;
+
+ QVBox *m_pluginBox;
+ std::vector<QPushButton *> m_plugins;
+ };
+
+ QHBox *m_surroundBox;
+ QFrame *m_mainBox;
+
+ typedef std::map<InstrumentId, FaderRec> FaderMap;
+ FaderMap m_faders;
+
+ typedef std::vector<FaderRec> FaderVector;
+ FaderVector m_submasters;
+ FaderRec m_monitor;
+ FaderRec m_master;
+
+ void depopulate();
+ void populate();
+
+ bool isInstrumentAssigned(InstrumentId id);
+
+ void updateFader(int id); // instrument id if large enough, monitor if -1, master/sub otherwise
+ void updateRouteButtons(int id);
+ void updateStereoButton(int id);
+ void updatePluginButtons(int id);
+ void updateMiscButtons(int id);
+
+ QPixmap m_monoPixmap;
+ QPixmap m_stereoPixmap;
+};
+
+
+
+}
+
+#endif
diff --git a/src/gui/studio/AudioPlugin.cpp b/src/gui/studio/AudioPlugin.cpp
new file mode 100644
index 0000000..2cf3db2
--- /dev/null
+++ b/src/gui/studio/AudioPlugin.cpp
@@ -0,0 +1,78 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "AudioPlugin.h"
+
+#include "misc/Strings.h"
+#include "base/AudioPluginInstance.h"
+#include <qcolor.h>
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+AudioPlugin::AudioPlugin(const QString &identifier,
+ const QString &name,
+ unsigned long uniqueId,
+ const QString &label,
+ const QString &author,
+ const QString &copyright,
+ bool isSynth,
+ bool isGrouped,
+ const QString &category):
+ m_identifier(identifier),
+ m_name(name),
+ m_uniqueId(uniqueId),
+ m_label(label),
+ m_author(author),
+ m_copyright(copyright),
+ m_isSynth(isSynth),
+ m_isGrouped(isGrouped),
+ m_category(category),
+ m_colour(Qt::darkRed)
+{}
+
+void
+AudioPlugin::addPort(int number,
+ const QString &name,
+ PluginPort::PortType type,
+ PluginPort::PortDisplayHint hint,
+ PortData lowerBound,
+ PortData upperBound,
+ PortData defaultValue)
+{
+ PluginPort *port = new PluginPort(number,
+ qstrtostr(name),
+ type,
+ hint,
+ lowerBound,
+ upperBound,
+ defaultValue);
+ m_ports.push_back(port);
+
+}
+
+}
diff --git a/src/gui/studio/AudioPlugin.h b/src/gui/studio/AudioPlugin.h
new file mode 100644
index 0000000..591a43b
--- /dev/null
+++ b/src/gui/studio/AudioPlugin.h
@@ -0,0 +1,117 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_AUDIOPLUGIN_H_
+#define _RG_AUDIOPLUGIN_H_
+
+#include "base/AudioPluginInstance.h"
+#include <qcolor.h>
+#include <qstring.h>
+#include <vector>
+
+
+
+
+namespace Rosegarden
+{
+
+
+
+class AudioPlugin
+{
+public:
+ AudioPlugin(const QString &identifier,
+ const QString &name,
+ unsigned long uniqueId,
+ const QString &label,
+ const QString &author,
+ const QString &copyright,
+ bool isSynth,
+ bool isGrouped,
+ const QString &category);
+
+ QString getIdentifier() const { return m_identifier; }
+
+ QString getName() const { return m_name; }
+ unsigned long getUniqueId() const { return m_uniqueId; }
+ QString getLabel() const { return m_label; }
+ QString getAuthor() const { return m_author; }
+ QString getCopyright() const { return m_copyright; }
+ bool isSynth() const { return m_isSynth; }
+ bool isEffect() const { // true if >0 audio inputs
+ for (unsigned int i = 0; i < m_ports.size(); ++i) {
+ if ((m_ports[i]->getType() & PluginPort::Input) &&
+ (m_ports[i]->getType() & PluginPort::Audio)) {
+ return true;
+ }
+ }
+ return false;
+ }
+ bool isGrouped() const { return m_isGrouped; }
+ QString getCategory() const { return m_category; }
+
+ void addPort(int number,
+ const QString &name,
+ PluginPort::PortType type,
+ PluginPort::PortDisplayHint hint,
+ PortData lowerBound,
+ PortData upperBound,
+ PortData defaultVale);
+
+ typedef std::vector<PluginPort*>::iterator PortIterator;
+
+ PortIterator begin() { return m_ports.begin(); }
+ PortIterator end() { return m_ports.end(); }
+
+ QColor getColour() const { return m_colour; }
+ void setColour(const QColor &colour) { m_colour = colour; }
+
+protected:
+
+ QString m_identifier;
+
+ QString m_name;
+ unsigned long m_uniqueId;
+ QString m_label;
+ QString m_author;
+ QString m_copyright;
+ bool m_isSynth;
+ bool m_isGrouped;
+ QString m_category;
+
+ // our ports and associated hints
+ std::vector<PluginPort*> m_ports;
+
+ // Colour of this activated plugin
+ //
+ QColor m_colour;
+};
+
+typedef std::vector<AudioPlugin*>::iterator PluginIterator;
+
+
+}
+
+#endif
diff --git a/src/gui/studio/AudioPluginClipboard.cpp b/src/gui/studio/AudioPluginClipboard.cpp
new file mode 100644
index 0000000..54f5612
--- /dev/null
+++ b/src/gui/studio/AudioPluginClipboard.cpp
@@ -0,0 +1,32 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "AudioPluginClipboard.h"
+
+
+
+namespace Rosegarden
+{
+}
diff --git a/src/gui/studio/AudioPluginClipboard.h b/src/gui/studio/AudioPluginClipboard.h
new file mode 100644
index 0000000..e31ed90
--- /dev/null
+++ b/src/gui/studio/AudioPluginClipboard.h
@@ -0,0 +1,52 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_AUDIOPLUGINCLIPBOARD_H_
+#define _RG_AUDIOPLUGINCLIPBOARD_H_
+
+#include <map>
+#include <string>
+#include <vector>
+
+
+
+
+namespace Rosegarden
+{
+
+
+
+struct AudioPluginClipboard
+{
+ int m_pluginNumber;
+ std::map<std::string, std::string> m_configuration;
+ std::string m_program;
+ std::vector<float> m_controlValues;
+};
+
+
+}
+
+#endif
diff --git a/src/gui/studio/AudioPluginManager.cpp b/src/gui/studio/AudioPluginManager.cpp
new file mode 100644
index 0000000..6b64085
--- /dev/null
+++ b/src/gui/studio/AudioPluginManager.cpp
@@ -0,0 +1,307 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "AudioPluginManager.h"
+
+#include "misc/Debug.h"
+#include "AudioPluginClipboard.h"
+#include "AudioPlugin.h"
+#include "base/AudioPluginInstance.h"
+#include "gui/application/RosegardenApplication.h"
+#include "sound/PluginFactory.h"
+#include "sound/PluginIdentifier.h"
+#include <qcstring.h>
+#include <qdatastream.h>
+#include <qmutex.h>
+#include <qstring.h>
+#include <qthread.h>
+
+
+namespace Rosegarden
+{
+
+AudioPluginManager::AudioPluginManager() :
+ m_sampleRate(0),
+ m_enumerator(this)
+{
+// std::cerr << "AudioPluginManager[" << this << "]::AudioPluginManager - "
+// << "trace is ";
+// std::cerr << kdBacktrace() << std::endl;
+
+
+ // fetch from sequencer
+ fetchSampleRate();
+
+ // Clear the plugin clipboard
+ //
+ m_pluginClipboard.m_pluginNumber = -1;
+ m_pluginClipboard.m_program = "";
+ m_pluginClipboard.m_controlValues.clear();
+
+ m_enumerator.start();
+}
+
+AudioPluginManager::Enumerator::Enumerator(AudioPluginManager *manager) :
+ m_manager(manager),
+ m_done(false)
+{}
+
+void
+AudioPluginManager::Enumerator::run()
+{
+ QMutexLocker locker(&(m_manager->m_mutex));
+ MappedObjectPropertyList rawPlugins;
+
+ RG_DEBUG << "\n\nAudioPluginManager::Enumerator::run()\n\n" << endl;
+
+ if (!rgapp->noSequencerMode()) {
+ // We only waste the time looking for plugins here if we
+ // know we're actually going to be able to use them.
+ PluginFactory::enumerateAllPlugins(rawPlugins);
+ }
+
+ unsigned int i = 0;
+
+ while (i < rawPlugins.size()) {
+
+ QString identifier = rawPlugins[i++];
+ QString name = rawPlugins[i++];
+ unsigned long uniqueId = rawPlugins[i++].toLong();
+ QString label = rawPlugins[i++];
+ QString author = rawPlugins[i++];
+ QString copyright = rawPlugins[i++];
+ bool isSynth = ((rawPlugins[i++]).lower() == "true");
+ bool isGrouped = ((rawPlugins[i++]).lower() == "true");
+ QString category = rawPlugins[i++];
+ unsigned int portCount = rawPlugins[i++].toInt();
+
+ // std::cerr << "PLUGIN: " << i << ": " << (identifier ? identifier : "(null)") << " unique id " << uniqueId << " / CATEGORY: \"" << (category ? category : "(null)") << "\"" << std::endl;
+
+ AudioPlugin *aP = m_manager->addPlugin(identifier,
+ name,
+ uniqueId,
+ label,
+ author,
+ copyright,
+ isSynth,
+ isGrouped,
+ category);
+
+ for (unsigned int j = 0; j < portCount; j++) {
+
+ int number = rawPlugins[i++].toInt();
+ name = rawPlugins[i++];
+ PluginPort::PortType type =
+ PluginPort::PortType(rawPlugins[i++].toInt());
+ PluginPort::PortDisplayHint hint =
+ PluginPort::PortDisplayHint(rawPlugins[i++].toInt());
+ PortData lowerBound = rawPlugins[i++].toFloat();
+ PortData upperBound = rawPlugins[i++].toFloat();
+ PortData defaultValue = rawPlugins[i++].toFloat();
+
+ aP->addPort(number,
+ name,
+ type,
+ hint,
+ lowerBound,
+ upperBound,
+ defaultValue);
+ }
+ }
+
+ m_done = true;
+
+ RG_DEBUG << "\n\nAudioPluginManager::Enumerator::run() - done\n\n" << endl;
+}
+
+AudioPlugin*
+AudioPluginManager::addPlugin(const QString &identifier,
+ const QString &name,
+ unsigned long uniqueId,
+ const QString &label,
+ const QString &author,
+ const QString &copyright,
+ bool isSynth,
+ bool isGrouped,
+ const QString &category)
+{
+ AudioPlugin *newPlugin = new AudioPlugin(identifier,
+ name,
+ uniqueId,
+ label,
+ author,
+ copyright,
+ isSynth,
+ isGrouped,
+ category);
+ m_plugins.push_back(newPlugin);
+
+ return newPlugin;
+}
+
+bool
+AudioPluginManager::removePlugin(const QString &identifier)
+{
+ std::vector<AudioPlugin*>::iterator it = m_plugins.begin();
+
+ for (; it != m_plugins.end(); ++it) {
+ if ((*it)->getIdentifier() == identifier) {
+ delete *it;
+ m_plugins.erase(it);
+ return true;
+ }
+ }
+
+ return false;
+}
+
+std::vector<QString>
+AudioPluginManager::getPluginNames()
+{
+ awaitEnumeration();
+
+ std::vector<QString> names;
+
+ PluginIterator it = m_plugins.begin();
+
+ for (; it != m_plugins.end(); ++it)
+ names.push_back((*it)->getName());
+
+ return names;
+}
+
+AudioPlugin*
+AudioPluginManager::getPlugin(int number)
+{
+ awaitEnumeration();
+
+ if (number < 0 || number > (int(m_plugins.size()) - 1))
+ return 0;
+
+ return m_plugins[number];
+}
+
+int
+AudioPluginManager::getPositionByIdentifier(QString identifier)
+{
+ awaitEnumeration();
+
+ int pos = 0;
+ PluginIterator it = m_plugins.begin();
+
+ for (; it != m_plugins.end(); ++it) {
+ if ((*it)->getIdentifier() == identifier)
+ return pos;
+
+ pos++;
+ }
+
+ pos = 0;
+ it = m_plugins.begin();
+ for (; it != m_plugins.end(); ++it) {
+ if (PluginIdentifier::areIdentifiersSimilar((*it)->getIdentifier(), identifier))
+ return pos;
+
+ pos++;
+ }
+
+ return -1;
+}
+
+AudioPlugin*
+AudioPluginManager::getPluginByIdentifier(QString identifier)
+{
+ awaitEnumeration();
+
+ PluginIterator it = m_plugins.begin();
+ for (; it != m_plugins.end(); ++it) {
+ if ((*it)->getIdentifier() == identifier)
+ return (*it);
+ }
+
+ it = m_plugins.begin();
+ for (; it != m_plugins.end(); ++it) {
+ if (PluginIdentifier::areIdentifiersSimilar((*it)->getIdentifier(), identifier))
+ return (*it);
+ }
+
+ return 0;
+}
+
+AudioPlugin*
+AudioPluginManager::getPluginByUniqueId(unsigned long uniqueId)
+{
+ awaitEnumeration();
+
+ PluginIterator it = m_plugins.begin();
+ for (; it != m_plugins.end(); ++it) {
+ if ((*it)->getUniqueId() == uniqueId)
+ return (*it);
+ }
+
+ return 0;
+}
+
+PluginIterator
+AudioPluginManager::begin()
+{
+ awaitEnumeration();
+ return m_plugins.begin();
+}
+
+PluginIterator
+AudioPluginManager::end()
+{
+ awaitEnumeration();
+ return m_plugins.end();
+}
+
+void
+AudioPluginManager::awaitEnumeration()
+{
+ while (!m_enumerator.isDone()) {
+ RG_DEBUG << "\n\nAudioPluginManager::awaitEnumeration() - waiting\n\n" << endl;
+// m_mutex.lock();
+ usleep(100000);
+// m_mutex.unlock();
+ }
+}
+
+void
+AudioPluginManager::fetchSampleRate()
+{
+ QCString replyType;
+ QByteArray replyData;
+
+ if (rgapp->sequencerCall("getSampleRate()", replyType, replyData)) {
+
+ QDataStream streamIn(replyData, IO_ReadOnly);
+ unsigned int result;
+ streamIn >> result;
+ m_sampleRate = result;
+ }
+}
+
+}
diff --git a/src/gui/studio/AudioPluginManager.h b/src/gui/studio/AudioPluginManager.h
new file mode 100644
index 0000000..f8574f8
--- /dev/null
+++ b/src/gui/studio/AudioPluginManager.h
@@ -0,0 +1,118 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_AUDIOPLUGINMANAGER_H_
+#define _RG_AUDIOPLUGINMANAGER_H_
+
+#include "AudioPluginClipboard.h"
+#include <qmutex.h>
+#include <qstring.h>
+#include <qthread.h>
+#include <vector>
+#include "AudioPlugin.h"
+
+
+
+
+namespace Rosegarden
+{
+
+class AudioPlugin;
+
+
+class AudioPluginManager
+{
+public:
+ AudioPluginManager();
+
+ // Get a straight list of names
+ //
+ std::vector<QString> getPluginNames();
+
+ // Some useful members
+ //
+ AudioPlugin* getPlugin(int number);
+
+ AudioPlugin* getPluginByIdentifier(QString identifier);
+ int getPositionByIdentifier(QString identifier);
+
+ // Deprecated -- the GUI shouldn't be using unique ID because it's
+ // bound to a particular plugin type (and not necessarily unique
+ // anyway). It should use the identifier instead, which is a
+ // structured string managed by the sequencer. Keep this in only
+ // for compatibility with old .rg files.
+ //
+ AudioPlugin* getPluginByUniqueId(unsigned long uniqueId);
+
+ PluginIterator begin();
+ PluginIterator end();
+
+ // Sample rate
+ //
+ void setSampleRate(unsigned int rate) { m_sampleRate = rate; }
+ unsigned int getSampleRate() const { return m_sampleRate; }
+
+ AudioPluginClipboard* getPluginClipboard() { return &m_pluginClipboard; }
+
+protected:
+ AudioPlugin* addPlugin(const QString &identifier,
+ const QString &name,
+ unsigned long uniqueId,
+ const QString &label,
+ const QString &author,
+ const QString &copyright,
+ bool isSynth,
+ bool isGrouped,
+ const QString &category);
+
+ bool removePlugin(const QString &identifier);
+
+ class Enumerator : public QThread
+ {
+ public:
+ Enumerator(AudioPluginManager *);
+ virtual void run();
+ bool isDone() const { return m_done; }
+
+ protected:
+ AudioPluginManager *m_manager;
+ bool m_done;
+ };
+
+ void awaitEnumeration();
+ void fetchSampleRate();
+
+ std::vector<AudioPlugin*> m_plugins;
+ unsigned int m_sampleRate;
+ AudioPluginClipboard m_pluginClipboard;
+ Enumerator m_enumerator;
+ QMutex m_mutex;
+};
+
+
+
+}
+
+#endif
diff --git a/src/gui/studio/AudioPluginOSCGUI.cpp b/src/gui/studio/AudioPluginOSCGUI.cpp
new file mode 100644
index 0000000..106cbbe
--- /dev/null
+++ b/src/gui/studio/AudioPluginOSCGUI.cpp
@@ -0,0 +1,234 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifdef HAVE_LIBLO
+
+#include "AudioPluginOSCGUI.h"
+
+#include "misc/Debug.h"
+#include "misc/Strings.h"
+#include "base/AudioPluginInstance.h"
+#include "base/Exception.h"
+#include "sound/PluginIdentifier.h"
+#include <kprocess.h>
+#include <qdir.h>
+#include <qfileinfo.h>
+#include <qstring.h>
+#include <algorithm>
+
+
+namespace Rosegarden
+{
+
+AudioPluginOSCGUI::AudioPluginOSCGUI(AudioPluginInstance *instance,
+ QString serverURL, QString friendlyName) :
+ m_gui(0),
+ m_address(0),
+ m_basePath(""),
+ m_serverUrl(serverURL)
+{
+ QString identifier = strtoqstr(instance->getIdentifier());
+
+ QString filePath = getGUIFilePath(identifier);
+ if (!filePath) {
+ throw Exception("No GUI found");
+ }
+
+ QString type, soName, label;
+ PluginIdentifier::parseIdentifier(identifier, type, soName, label);
+ QFileInfo soInfo(soName);
+
+ // arguments: osc url, dll name, label, instance tag
+
+ m_gui = new KProcess();
+
+ *m_gui << filePath
+ << m_serverUrl
+ << soInfo.fileName()
+ << label
+ << friendlyName;
+
+ RG_DEBUG << "AudioPluginOSCGUI::AudioPluginOSCGUI: Starting process "
+ << filePath << " " << m_serverUrl << " "
+ << soInfo.fileName() << " " << label << " " << friendlyName << endl;
+
+ if (!m_gui->start(KProcess::NotifyOnExit, KProcess::NoCommunication)) {
+ RG_DEBUG << "AudioPluginOSCGUI::AudioPluginOSCGUI: Couldn't start process " << filePath << endl;
+ delete m_gui;
+ m_gui = 0;
+ throw Exception("Failed to start GUI");
+ }
+}
+
+AudioPluginOSCGUI::~AudioPluginOSCGUI()
+{
+ quit();
+}
+
+QString
+AudioPluginOSCGUI::getGUIFilePath(QString identifier)
+{
+ QString type, soName, label;
+ PluginIdentifier::parseIdentifier(identifier, type, soName, label);
+
+ RG_DEBUG << "AudioPluginOSCGUI::getGUIFilePath(" << identifier << ")" << endl;
+
+ QFileInfo soInfo(soName);
+ if (soInfo.isRelative()) {
+ //!!!
+ RG_DEBUG << "AudioPluginOSCGUI::AudioPluginOSCGUI: Unable to deal with relative .so path \"" << soName << "\" in identifier \"" << identifier << "\" yet" << endl;
+ throw Exception("Can't deal with relative .soname");
+ }
+
+ QDir dir(soInfo.dir());
+ QString fileBase(soInfo.baseName(TRUE));
+
+ if (!dir.cd(fileBase)) {
+ RG_DEBUG << "AudioPluginOSCGUI::AudioPluginOSCGUI: No GUI subdir for plugin .so " << soName << endl;
+ throw Exception("No GUI subdir available");
+ }
+
+ const QFileInfoList *list = dir.entryInfoList();
+
+ // in order of preference:
+ const char *suffixes[] = { "_rg", "_kde", "_qt", "_gtk2", "_gtk", "_x11", "_gui"
+ };
+ int nsuffixes = sizeof(suffixes) / sizeof(suffixes[0]);
+
+ for (int k = 0; k <= nsuffixes; ++k) {
+
+ for (int fuzzy = 0; fuzzy <= 1; ++fuzzy) {
+
+ QFileInfoListIterator i(*list);
+ QFileInfo *info;
+
+ while ((info = i.current()) != 0) {
+
+ RG_DEBUG << "Looking at " << info->fileName() << " in path "
+ << info->filePath() << " for suffix " << (k == nsuffixes ? "(none)" : suffixes[k]) << ", fuzzy " << fuzzy << endl;
+
+ ++i;
+
+ if (!(info->isFile() || info->isSymLink())
+ || !info->isExecutable()) {
+ RG_DEBUG << "(not executable)" << endl;
+ continue;
+ }
+
+ if (fuzzy) {
+ if (info->fileName().left(fileBase.length()) != fileBase)
+ continue;
+ RG_DEBUG << "(is file base)" << endl;
+ } else {
+ if (info->fileName().left(label.length()) != label)
+ continue;
+ RG_DEBUG << "(is label)" << endl;
+ }
+
+ if (k == nsuffixes || info->fileName().lower().endsWith(suffixes[k])) {
+ RG_DEBUG << "(ends with suffix " << (k == nsuffixes ? "(none)" : suffixes[k]) << " or out of suffixes)" << endl;
+ return info->filePath();
+ }
+ RG_DEBUG << "(doesn't end with suffix " << (k == nsuffixes ? "(none)" : suffixes[k]) << ")" << endl;
+ }
+ }
+ }
+
+ return QString();
+}
+
+void
+AudioPluginOSCGUI::setGUIUrl(QString url)
+{
+ if (m_address)
+ lo_address_free(m_address);
+
+ char *host = lo_url_get_hostname(url);
+ char *port = lo_url_get_port(url);
+ m_address = lo_address_new(host, port);
+ free(host);
+ free(port);
+
+ m_basePath = lo_url_get_path(url);
+}
+
+void
+AudioPluginOSCGUI::show()
+{
+ RG_DEBUG << "AudioPluginOSCGUI::show" << endl;
+
+ if (!m_address)
+ return ;
+ QString path = m_basePath + "/show";
+ lo_send(m_address, path, "");
+}
+
+void
+AudioPluginOSCGUI::hide()
+{
+ if (!m_address)
+ return ;
+ QString path = m_basePath + "/hide";
+ lo_send(m_address, path, "");
+}
+
+void
+AudioPluginOSCGUI::quit()
+{
+ if (!m_address)
+ return ;
+ QString path = m_basePath + "/quit";
+ lo_send(m_address, path, "");
+}
+
+void
+AudioPluginOSCGUI::sendProgram(int bank, int program)
+{
+ if (!m_address)
+ return ;
+ QString path = m_basePath + "/program";
+ lo_send(m_address, path, "ii", bank, program);
+}
+
+void
+AudioPluginOSCGUI::sendPortValue(int port, float value)
+{
+ if (!m_address)
+ return ;
+ QString path = m_basePath + "/control";
+ lo_send(m_address, path, "if", port, value);
+}
+
+void
+AudioPluginOSCGUI::sendConfiguration(QString key, QString value)
+{
+ if (!m_address)
+ return ;
+ QString path = m_basePath + "/configure";
+ lo_send(m_address, path, "ss", key.data(), value.data());
+}
+
+}
+
+#endif
diff --git a/src/gui/studio/AudioPluginOSCGUI.h b/src/gui/studio/AudioPluginOSCGUI.h
new file mode 100644
index 0000000..d1982f4
--- /dev/null
+++ b/src/gui/studio/AudioPluginOSCGUI.h
@@ -0,0 +1,77 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_AUDIOPLUGINOSCGUI_H_
+#define _RG_AUDIOPLUGINOSCGUI_H_
+
+#ifdef HAVE_LIBLO
+
+#include <lo/lo.h>
+
+#include <qstring.h>
+
+
+class KProcess;
+
+
+namespace Rosegarden
+{
+
+class AudioPluginInstance;
+
+
+class AudioPluginOSCGUI
+{
+public:
+ AudioPluginOSCGUI(AudioPluginInstance *instance,
+ QString serverURL, QString friendlyName);
+ virtual ~AudioPluginOSCGUI();
+
+ void setGUIUrl(QString url);
+
+ void show();
+ void hide();
+ void quit();
+ void sendProgram(int bank, int program);
+ void sendPortValue(int port, float value);
+ void sendConfiguration(QString key, QString value);
+
+ static QString getGUIFilePath(QString identifier);
+
+protected:
+ KProcess *m_gui;
+ lo_address m_address;
+ QString m_basePath;
+ QString m_serverUrl;
+};
+
+
+
+}
+
+
+#endif
+
+#endif
diff --git a/src/gui/studio/AudioPluginOSCGUIManager.cpp b/src/gui/studio/AudioPluginOSCGUIManager.cpp
new file mode 100644
index 0000000..54c23d7
--- /dev/null
+++ b/src/gui/studio/AudioPluginOSCGUIManager.cpp
@@ -0,0 +1,711 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifdef HAVE_LIBLO
+
+#include <lo/lo.h>
+
+#include "AudioPluginOSCGUIManager.h"
+
+#include "sound/Midi.h"
+#include <klocale.h>
+#include "misc/Debug.h"
+#include "misc/Strings.h"
+#include "AudioPluginOSCGUI.h"
+#include "base/AudioPluginInstance.h"
+#include "base/Exception.h"
+#include "base/Instrument.h"
+#include "base/MidiProgram.h"
+#include "base/RealTime.h"
+#include "base/Studio.h"
+#include "gui/application/RosegardenGUIApp.h"
+#include "OSCMessage.h"
+#include "sound/MappedEvent.h"
+#include "sound/PluginIdentifier.h"
+#include "StudioControl.h"
+#include "TimerCallbackAssistant.h"
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+static void osc_error(int num, const char *msg, const char *path)
+{
+ std::cerr << "Rosegarden: ERROR: liblo server error " << num
+ << " in path " << path << ": " << msg << std::endl;
+}
+
+static int osc_message_handler(const char *path, const char *types, lo_arg **argv,
+ int argc, lo_message, void *user_data)
+{
+ AudioPluginOSCGUIManager *manager = (AudioPluginOSCGUIManager *)user_data;
+
+ InstrumentId instrument;
+ int position;
+ QString method;
+
+ if (!manager->parseOSCPath(path, instrument, position, method)) {
+ return 1;
+ }
+
+ OSCMessage *message = new OSCMessage();
+ message->setTarget(instrument);
+ message->setTargetData(position);
+ message->setMethod(qstrtostr(method));
+
+ int arg = 0;
+ while (types && arg < argc && types[arg]) {
+ message->addArg(types[arg], argv[arg]);
+ ++arg;
+ }
+
+ manager->postMessage(message);
+ return 0;
+}
+
+AudioPluginOSCGUIManager::AudioPluginOSCGUIManager(RosegardenGUIApp *app) :
+ m_app(app),
+ m_studio(0),
+ m_haveOSCThread(false),
+ m_oscBuffer(1023),
+ m_dispatchTimer(0)
+{}
+
+AudioPluginOSCGUIManager::~AudioPluginOSCGUIManager()
+{
+ delete m_dispatchTimer;
+
+ for (TargetGUIMap::iterator i = m_guis.begin(); i != m_guis.end(); ++i) {
+ for (IntGUIMap::iterator j = i->second.begin(); j != i->second.end();
+ ++j) {
+ delete j->second;
+ }
+ }
+ m_guis.clear();
+
+#ifdef HAVE_LIBLO_THREADSTOP
+
+ if (m_haveOSCThread)
+ lo_server_thread_stop(m_serverThread);
+#endif
+}
+
+void
+AudioPluginOSCGUIManager::checkOSCThread()
+{
+ if (m_haveOSCThread)
+ return ;
+
+ m_serverThread = lo_server_thread_new(NULL, osc_error);
+
+ lo_server_thread_add_method(m_serverThread, NULL, NULL,
+ osc_message_handler, this);
+
+ lo_server_thread_start(m_serverThread);
+
+ RG_DEBUG << "AudioPluginOSCGUIManager: Base OSC URL is "
+ << lo_server_thread_get_url(m_serverThread) << endl;
+
+ m_dispatchTimer = new TimerCallbackAssistant(20, timerCallback, this);
+
+ m_haveOSCThread = true;
+}
+
+bool
+AudioPluginOSCGUIManager::hasGUI(InstrumentId instrument, int position)
+{
+ PluginContainer *container = 0;
+ container = m_studio->getContainerById(instrument);
+ if (!container) return false;
+
+ AudioPluginInstance *pluginInstance = container->getPlugin(position);
+ if (!pluginInstance) return false;
+
+ try {
+ QString filePath = AudioPluginOSCGUI::getGUIFilePath
+ (strtoqstr(pluginInstance->getIdentifier()));
+ return (filePath && filePath != "");
+ } catch (Exception e) { // that's OK
+ return false;
+ }
+}
+
+void
+AudioPluginOSCGUIManager::startGUI(InstrumentId instrument, int position)
+{
+ RG_DEBUG << "AudioPluginOSCGUIManager::startGUI: " << instrument << "," << position
+ << endl;
+
+ checkOSCThread();
+
+ if (m_guis.find(instrument) != m_guis.end() &&
+ m_guis[instrument].find(position) != m_guis[instrument].end()) {
+ RG_DEBUG << "stopping GUI first" << endl;
+ stopGUI(instrument, position);
+ }
+
+ // check the label
+ PluginContainer *container = 0;
+ container = m_studio->getContainerById(instrument);
+ if (!container) {
+ RG_DEBUG << "AudioPluginOSCGUIManager::startGUI: no such instrument or buss as "
+ << instrument << endl;
+ return;
+ }
+
+ AudioPluginInstance *pluginInstance = container->getPlugin(position);
+ if (!pluginInstance) {
+ RG_DEBUG << "AudioPluginOSCGUIManager::startGUI: no plugin at position "
+ << position << " for instrument " << instrument << endl;
+ return ;
+ }
+
+ try {
+ AudioPluginOSCGUI *gui =
+ new AudioPluginOSCGUI(pluginInstance,
+ getOSCUrl(instrument,
+ position,
+ strtoqstr(pluginInstance->getIdentifier())),
+ getFriendlyName(instrument,
+ position,
+ strtoqstr(pluginInstance->getIdentifier())));
+ m_guis[instrument][position] = gui;
+
+ } catch (Exception e) {
+
+ RG_DEBUG << "AudioPluginOSCGUIManager::startGUI: failed to start GUI: "
+ << e.getMessage() << endl;
+ }
+}
+
+void
+AudioPluginOSCGUIManager::showGUI(InstrumentId instrument, int position)
+{
+ RG_DEBUG << "AudioPluginOSCGUIManager::showGUI: " << instrument << "," << position
+ << endl;
+
+ if (m_guis.find(instrument) != m_guis.end() &&
+ m_guis[instrument].find(position) != m_guis[instrument].end()) {
+ m_guis[instrument][position]->show();
+ } else {
+ startGUI(instrument, position);
+ }
+}
+
+void
+AudioPluginOSCGUIManager::stopGUI(InstrumentId instrument, int position)
+{
+ if (m_guis.find(instrument) != m_guis.end() &&
+ m_guis[instrument].find(position) != m_guis[instrument].end()) {
+ delete m_guis[instrument][position];
+ m_guis[instrument].erase(position);
+ if (m_guis[instrument].empty())
+ m_guis.erase(instrument);
+ }
+}
+
+void
+AudioPluginOSCGUIManager::stopAllGUIs()
+{
+ while (!m_guis.empty()) {
+ while (!m_guis.begin()->second.empty()) {
+ delete (m_guis.begin()->second.begin()->second);
+ m_guis.begin()->second.erase(m_guis.begin()->second.begin());
+ }
+ m_guis.erase(m_guis.begin());
+ }
+}
+
+void
+AudioPluginOSCGUIManager::postMessage(OSCMessage *message)
+{
+ RG_DEBUG << "AudioPluginOSCGUIManager::postMessage" << endl;
+ m_oscBuffer.write(&message, 1);
+}
+
+void
+AudioPluginOSCGUIManager::updateProgram(InstrumentId instrument, int position)
+{
+ RG_DEBUG << "AudioPluginOSCGUIManager::updateProgram(" << instrument << ","
+ << position << ")" << endl;
+
+ if (m_guis.find(instrument) == m_guis.end() ||
+ m_guis[instrument].find(position) == m_guis[instrument].end())
+ return ;
+
+ PluginContainer *container = 0;
+ container = m_studio->getContainerById(instrument);
+ if (!container) return;
+
+ AudioPluginInstance *pluginInstance = container->getPlugin(position);
+ if (!pluginInstance) return;
+
+ unsigned long rv = StudioControl::getPluginProgram
+ (pluginInstance->getMappedId(),
+ strtoqstr(pluginInstance->getProgram()));
+
+ int bank = rv >> 16;
+ int program = rv - (bank << 16);
+
+ RG_DEBUG << "AudioPluginOSCGUIManager::updateProgram(" << instrument << ","
+ << position << "): rv " << rv << ", bank " << bank << ", program " << program << endl;
+
+ m_guis[instrument][position]->sendProgram(bank, program);
+}
+
+void
+AudioPluginOSCGUIManager::updatePort(InstrumentId instrument, int position,
+ int port)
+{
+ RG_DEBUG << "AudioPluginOSCGUIManager::updatePort(" << instrument << ","
+ << position << "," << port << ")" << endl;
+
+ if (m_guis.find(instrument) == m_guis.end() ||
+ m_guis[instrument].find(position) == m_guis[instrument].end())
+ return ;
+
+ PluginContainer *container = 0;
+ container = m_studio->getContainerById(instrument);
+ if (!container) return;
+
+ AudioPluginInstance *pluginInstance = container->getPlugin(position);
+ if (!pluginInstance)
+ return ;
+
+ PluginPortInstance *porti = pluginInstance->getPort(port);
+ if (!porti)
+ return ;
+
+ RG_DEBUG << "AudioPluginOSCGUIManager::updatePort(" << instrument << ","
+ << position << "," << port << "): value " << porti->value << endl;
+
+ m_guis[instrument][position]->sendPortValue(port, porti->value);
+}
+
+void
+AudioPluginOSCGUIManager::updateConfiguration(InstrumentId instrument, int position,
+ QString key)
+{
+ RG_DEBUG << "AudioPluginOSCGUIManager::updateConfiguration(" << instrument << ","
+ << position << "," << key << ")" << endl;
+
+ if (m_guis.find(instrument) == m_guis.end() ||
+ m_guis[instrument].find(position) == m_guis[instrument].end())
+ return ;
+
+ PluginContainer *container = m_studio->getContainerById(instrument);
+ if (!container) return;
+
+ AudioPluginInstance *pluginInstance = container->getPlugin(position);
+ if (!pluginInstance) return;
+
+ QString value = strtoqstr(pluginInstance->getConfigurationValue(qstrtostr(key)));
+
+ RG_DEBUG << "AudioPluginOSCGUIManager::updatePort(" << instrument << ","
+ << position << "," << key << "): value " << value << endl;
+
+ m_guis[instrument][position]->sendConfiguration(key, value);
+}
+
+QString
+AudioPluginOSCGUIManager::getOSCUrl(InstrumentId instrument, int position,
+ QString identifier)
+{
+ // OSC URL will be of the form
+ // osc.udp://localhost:54343/plugin/dssi/<instrument>/<position>/<label>
+ // where <position> will be "synth" for synth plugins
+
+ QString type, soName, label;
+ PluginIdentifier::parseIdentifier(identifier, type, soName, label);
+
+ QString baseUrl = lo_server_thread_get_url(m_serverThread);
+ if (!baseUrl.endsWith("/"))
+ baseUrl += '/';
+
+ QString url = QString("%1%2/%3/%4/%5/%6")
+ .arg(baseUrl)
+ .arg("plugin")
+ .arg(type)
+ .arg(instrument);
+
+ if (position == int(Instrument::SYNTH_PLUGIN_POSITION)) {
+ url = url.arg("synth");
+ } else {
+ url = url.arg(position);
+ }
+
+ url = url.arg(label);
+
+ return url;
+}
+
+bool
+AudioPluginOSCGUIManager::parseOSCPath(QString path, InstrumentId &instrument,
+ int &position, QString &method)
+{
+ RG_DEBUG << "AudioPluginOSCGUIManager::parseOSCPath(" << path << ")" << endl;
+ if (!m_studio)
+ return false;
+
+ QString pluginStr("/plugin/");
+
+ if (path.startsWith("//")) {
+ path = path.right(path.length() - 1);
+ }
+
+ if (!path.startsWith(pluginStr)) {
+ RG_DEBUG << "AudioPluginOSCGUIManager::parseOSCPath: malformed path "
+ << path << endl;
+ return false;
+ }
+
+ path = path.right(path.length() - pluginStr.length());
+
+ QString type = path.section('/', 0, 0);
+ QString instrumentStr = path.section('/', 1, 1);
+ QString positionStr = path.section('/', 2, 2);
+ QString label = path.section('/', 3, -2);
+ method = path.section('/', -1, -1);
+
+ if (!instrumentStr || !positionStr) {
+ RG_DEBUG << "AudioPluginOSCGUIManager::parseOSCPath: no instrument or position in " << path << endl;
+ return false;
+ }
+
+ instrument = instrumentStr.toUInt();
+
+ if (positionStr == "synth") {
+ position = Instrument::SYNTH_PLUGIN_POSITION;
+ } else {
+ position = positionStr.toInt();
+ }
+
+ // check the label
+ PluginContainer *container = m_studio->getContainerById(instrument);
+ if (!container) {
+ RG_DEBUG << "AudioPluginOSCGUIManager::parseOSCPath: no such instrument or buss as "
+ << instrument << " in path " << path << endl;
+ return false;
+ }
+
+ AudioPluginInstance *pluginInstance = container->getPlugin(position);
+ if (!pluginInstance) {
+ RG_DEBUG << "AudioPluginOSCGUIManager::parseOSCPath: no plugin at position "
+ << position << " for instrument " << instrument << " in path "
+ << path << endl;
+ return false;
+ }
+
+ QString identifier = strtoqstr(pluginInstance->getIdentifier());
+ QString iType, iSoName, iLabel;
+ PluginIdentifier::parseIdentifier(identifier, iType, iSoName, iLabel);
+ if (iLabel != label) {
+ RG_DEBUG << "AudioPluginOSCGUIManager::parseOSCPath: wrong label for plugin"
+ << " at position " << position << " for instrument " << instrument
+ << " in path " << path << " (actual label is " << iLabel
+ << ")" << endl;
+ return false;
+ }
+
+ RG_DEBUG << "AudioPluginOSCGUIManager::parseOSCPath: good path " << path
+ << ", got mapped id " << pluginInstance->getMappedId() << endl;
+
+ return true;
+}
+
+QString
+AudioPluginOSCGUIManager::getFriendlyName(InstrumentId instrument, int position,
+ QString)
+{
+ PluginContainer *container = m_studio->getContainerById(instrument);
+ if (!container)
+ return i18n("Rosegarden Plugin");
+ else {
+ if (position == int(Instrument::SYNTH_PLUGIN_POSITION)) {
+ return i18n("Rosegarden: %1").arg(strtoqstr(container->getPresentationName()));
+ } else {
+ return i18n("Rosegarden: %1: %2").arg(strtoqstr(container->getPresentationName()))
+ .arg(i18n("Plugin slot %1").arg(position));
+ }
+ }
+}
+
+void
+AudioPluginOSCGUIManager::timerCallback(void *data)
+{
+ AudioPluginOSCGUIManager *manager = (AudioPluginOSCGUIManager *)data;
+ manager->dispatch();
+}
+
+void
+AudioPluginOSCGUIManager::dispatch()
+{
+ if (!m_studio)
+ return ;
+
+ while (m_oscBuffer.getReadSpace() > 0) {
+
+ OSCMessage *message = 0;
+ m_oscBuffer.read(&message, 1);
+
+ int instrument = message->getTarget();
+ int position = message->getTargetData();
+
+ PluginContainer *container = m_studio->getContainerById(instrument);
+ if (!container) continue;
+
+ AudioPluginInstance *pluginInstance = container->getPlugin(position);
+ if (!pluginInstance) continue;
+
+ AudioPluginOSCGUI *gui = 0;
+
+ if (m_guis.find(instrument) == m_guis.end()) {
+ RG_DEBUG << "AudioPluginOSCGUIManager: no GUI for instrument "
+ << instrument << endl;
+ } else if (m_guis[instrument].find(position) == m_guis[instrument].end()) {
+ RG_DEBUG << "AudioPluginOSCGUIManager: no GUI for instrument "
+ << instrument << ", position " << position << endl;
+ } else {
+ gui = m_guis[instrument][position];
+ }
+
+ std::string method = message->getMethod();
+
+ char type;
+ const lo_arg *arg;
+
+ // These generally call back on the RosegardenGUIApp. We'd
+ // like to emit signals, but making AudioPluginOSCGUIManager a
+ // QObject is problematic if it's only conditionally compiled.
+
+ if (method == "control") {
+
+ if (message->getArgCount() != 2) {
+ RG_DEBUG << "AudioPluginOSCGUIManager: wrong number of args ("
+ << message->getArgCount() << ") for control method"
+ << endl;
+ goto done;
+ }
+ if (!(arg = message->getArg(0, type)) || type != 'i') {
+ RG_DEBUG << "AudioPluginOSCGUIManager: failed to get port number"
+ << endl;
+ goto done;
+ }
+ int port = arg->i;
+ if (!(arg = message->getArg(1, type)) || type != 'f') {
+ RG_DEBUG << "AudioPluginOSCGUIManager: failed to get port value"
+ << endl;
+ goto done;
+ }
+ float value = arg->f;
+
+ RG_DEBUG << "AudioPluginOSCGUIManager: setting port " << port
+ << " to value " << value << endl;
+
+ m_app->slotChangePluginPort(instrument, position, port, value);
+
+ } else if (method == "program") {
+
+ if (message->getArgCount() != 2) {
+ RG_DEBUG << "AudioPluginOSCGUIManager: wrong number of args ("
+ << message->getArgCount() << ") for program method"
+ << endl;
+ goto done;
+ }
+ if (!(arg = message->getArg(0, type)) || type != 'i') {
+ RG_DEBUG << "AudioPluginOSCGUIManager: failed to get bank number"
+ << endl;
+ goto done;
+ }
+ int bank = arg->i;
+ if (!(arg = message->getArg(1, type)) || type != 'i') {
+ RG_DEBUG << "AudioPluginOSCGUIManager: failed to get program number"
+ << endl;
+ goto done;
+ }
+ int program = arg->i;
+
+ QString programName = StudioControl::getPluginProgram
+ (pluginInstance->getMappedId(), bank, program);
+
+ m_app->slotChangePluginProgram(instrument, position, programName);
+
+ } else if (method == "update") {
+
+ if (message->getArgCount() != 1) {
+ RG_DEBUG << "AudioPluginOSCGUIManager: wrong number of args ("
+ << message->getArgCount() << ") for update method"
+ << endl;
+ goto done;
+ }
+ if (!(arg = message->getArg(0, type)) || type != 's') {
+ RG_DEBUG << "AudioPluginOSCGUIManager: failed to get GUI URL"
+ << endl;
+ goto done;
+ }
+ QString url = &arg->s;
+
+ if (!gui) {
+ RG_DEBUG << "AudioPluginOSCGUIManager: no GUI for update method"
+ << endl;
+ goto done;
+ }
+
+ gui->setGUIUrl(url);
+
+ for (AudioPluginInstance::ConfigMap::const_iterator i =
+ pluginInstance->getConfiguration().begin();
+ i != pluginInstance->getConfiguration().end(); ++i) {
+
+ QString key = strtoqstr(i->first);
+ QString value = strtoqstr(i->second);
+
+#ifdef DSSI_PROJECT_DIRECTORY_KEY
+
+ if (key == PluginIdentifier::RESERVED_PROJECT_DIRECTORY_KEY) {
+ key = DSSI_PROJECT_DIRECTORY_KEY;
+ }
+#endif
+
+ RG_DEBUG << "update: configuration: " << key << " -> "
+ << value << endl;
+
+ gui->sendConfiguration(key, value);
+ }
+
+ unsigned long rv = StudioControl::getPluginProgram
+ (pluginInstance->getMappedId(), strtoqstr(pluginInstance->getProgram()));
+
+ int bank = rv >> 16;
+ int program = rv - (bank << 16);
+ gui->sendProgram(bank, program);
+
+ int controlCount = 0;
+ for (PortInstanceIterator i = pluginInstance->begin();
+ i != pluginInstance->end(); ++i) {
+ gui->sendPortValue((*i)->number, (*i)->value);
+ /* Avoid overloading the GUI if there are lots and lots of ports */
+ if (++controlCount % 50 == 0)
+ usleep(300000);
+ }
+
+ gui->show();
+
+ } else if (method == "configure") {
+
+ if (message->getArgCount() != 2) {
+ RG_DEBUG << "AudioPluginOSCGUIManager: wrong number of args ("
+ << message->getArgCount() << ") for configure method"
+ << endl;
+ goto done;
+ }
+
+ if (!(arg = message->getArg(0, type)) || type != 's') {
+ RG_DEBUG << "AudioPluginOSCGUIManager: failed to get configure key"
+ << endl;
+ goto done;
+ }
+ QString key = &arg->s;
+
+ if (!(arg = message->getArg(1, type)) || type != 's') {
+ RG_DEBUG << "AudioPluginOSCGUIManager: failed to get configure value"
+ << endl;
+ goto done;
+ }
+ QString value = &arg->s;
+
+#ifdef DSSI_RESERVED_CONFIGURE_PREFIX
+
+ if (key.startsWith(DSSI_RESERVED_CONFIGURE_PREFIX) ||
+ key == PluginIdentifier::RESERVED_PROJECT_DIRECTORY_KEY) {
+ RG_DEBUG << "AudioPluginOSCGUIManager: illegal reserved configure call from gui: " << key << " -> " << value << endl;
+ goto done;
+ }
+#endif
+
+ RG_DEBUG << "AudioPluginOSCGUIManager: configure(" << key << "," << value
+ << ")" << endl;
+
+ m_app->slotChangePluginConfiguration(instrument, position,
+#ifdef DSSI_GLOBAL_CONFIGURE_PREFIX
+ key.startsWith(DSSI_GLOBAL_CONFIGURE_PREFIX),
+#else
+ false,
+#endif
+ key, value);
+
+ } else if (method == "midi") {
+
+ if (message->getArgCount() != 1) {
+ RG_DEBUG << "AudioPluginOSCGUIManager: wrong number of args ("
+ << message->getArgCount() << ") for midi method"
+ << endl;
+ goto done;
+ }
+ if (!(arg = message->getArg(0, type)) || type != 'm') {
+ RG_DEBUG << "AudioPluginOSCGUIManager: failed to get MIDI event"
+ << endl;
+ goto done;
+ }
+
+ RG_DEBUG << "AudioPluginOSCGUIManager: handling MIDI message" << endl;
+
+ // let's only handle note on and note off
+
+ int eventCode = arg->m[1];
+ int eventType = eventCode & MIDI_MESSAGE_TYPE_MASK;
+ if (eventType == MIDI_NOTE_ON ||
+ eventType == MIDI_NOTE_OFF) {
+ MappedEvent ev(instrument,
+ MappedEvent::MidiNote,
+ MidiByte(arg->m[2]),
+ MidiByte(arg->m[3]),
+ RealTime::zeroTime,
+ RealTime::zeroTime,
+ RealTime::zeroTime);
+ if (eventType == MIDI_NOTE_OFF)
+ ev.setVelocity(0);
+ StudioControl::sendMappedEvent(ev);
+ }
+
+ } else if (method == "exiting") {
+
+ RG_DEBUG << "AudioPluginOSCGUIManager: GUI exiting" << endl;
+ stopGUI(instrument, position);
+ m_app->slotPluginGUIExited(instrument, position);
+
+ } else {
+
+ RG_DEBUG << "AudioPluginOSCGUIManager: unknown method " << method << endl;
+ }
+
+done:
+ delete message;
+ }
+}
+
+}
+
+#endif
diff --git a/src/gui/studio/AudioPluginOSCGUIManager.h b/src/gui/studio/AudioPluginOSCGUIManager.h
new file mode 100644
index 0000000..0bef2a2
--- /dev/null
+++ b/src/gui/studio/AudioPluginOSCGUIManager.h
@@ -0,0 +1,104 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_AUDIOPLUGINOSCGUIMANAGER_H_
+#define _RG_AUDIOPLUGINOSCGUIMANAGER_H_
+
+#ifdef HAVE_LIBLO
+
+#include <lo/lo.h>
+#include "base/MidiProgram.h"
+#include <map>
+#include "sound/RingBuffer.h"
+#include <qstring.h>
+
+
+
+namespace Rosegarden
+{
+
+class TimerCallbackAssistant;
+class Studio;
+class RosegardenGUIApp;
+class OSCMessage;
+class AudioPluginOSCGUI;
+
+
+class AudioPluginOSCGUIManager
+{
+public:
+ AudioPluginOSCGUIManager(RosegardenGUIApp *app);
+ virtual ~AudioPluginOSCGUIManager();
+
+ void setStudio(Studio *studio) { m_studio = studio; }
+
+ bool hasGUI(InstrumentId id, int position);
+ void startGUI(InstrumentId id, int position);
+ void showGUI(InstrumentId id, int position);
+ void stopGUI(InstrumentId id, int position);
+ void stopAllGUIs();
+
+ void postMessage(OSCMessage *message); // I take over ownership of message
+ void dispatch();
+
+ void updateProgram(InstrumentId id, int position);
+ void updatePort(InstrumentId id, int position, int port);
+ void updateConfiguration(InstrumentId id, int position,
+ QString key);
+
+ QString getOSCUrl(InstrumentId instrument, int position,
+ QString identifier);
+ QString getFriendlyName(InstrumentId instrument, int position,
+ QString identifier);
+ bool parseOSCPath(QString path, InstrumentId &instrument, int &position,
+ QString &method);
+
+ static void timerCallback(void *data);
+ static void guiExitedCallback(void *data);
+
+protected:
+ RosegardenGUIApp *m_app;
+ Studio *m_studio;
+
+ bool m_haveOSCThread;
+ void checkOSCThread();
+
+ lo_server_thread m_serverThread;
+ RingBuffer<OSCMessage *> m_oscBuffer;
+
+ typedef std::map<int, AudioPluginOSCGUI *> IntGUIMap;
+ typedef std::map<int, IntGUIMap> TargetGUIMap;
+ TargetGUIMap m_guis;
+
+ TimerCallbackAssistant *m_dispatchTimer;
+};
+
+
+
+}
+
+#endif
+
+#endif
diff --git a/src/gui/studio/BankEditorDialog.cpp b/src/gui/studio/BankEditorDialog.cpp
new file mode 100644
index 0000000..20aaf2d
--- /dev/null
+++ b/src/gui/studio/BankEditorDialog.cpp
@@ -0,0 +1,1713 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "BankEditorDialog.h"
+#include <qlayout.h>
+#include <kapplication.h>
+
+#include <klocale.h>
+#include <kstddirs.h>
+#include "misc/Debug.h"
+#include "misc/Strings.h"
+#include "base/Device.h"
+#include "base/MidiDevice.h"
+#include "base/MidiProgram.h"
+#include "base/NotationTypes.h"
+#include "base/Studio.h"
+#include "commands/studio/ModifyDeviceCommand.h"
+#include "document/MultiViewCommandHistory.h"
+#include "document/RosegardenGUIDoc.h"
+#include "document/ConfigGroups.h"
+#include "gui/dialogs/ExportDeviceDialog.h"
+#include "gui/dialogs/ImportDeviceDialog.h"
+#include "MidiBankListViewItem.h"
+#include "MidiDeviceListViewItem.h"
+#include "MidiKeyMapListViewItem.h"
+#include "MidiKeyMappingEditor.h"
+#include "MidiProgramsEditor.h"
+#include <kaction.h>
+#include <kcombobox.h>
+#include <kcommand.h>
+#include <kfiledialog.h>
+#include <kglobal.h>
+#include <klistview.h>
+#include <kmainwindow.h>
+#include <kmessagebox.h>
+#include <kstdaccel.h>
+#include <kstdaction.h>
+#include <kxmlguiclient.h>
+#include <qcheckbox.h>
+#include <qdialog.h>
+#include <qdir.h>
+#include <qfileinfo.h>
+#include <qframe.h>
+#include <qgroupbox.h>
+#include <qhbox.h>
+#include <qpushbutton.h>
+#include <qsizepolicy.h>
+#include <qsplitter.h>
+#include <qstring.h>
+#include <qtooltip.h>
+#include <qvbox.h>
+#include <qvgroupbox.h>
+#include <qwidget.h>
+
+
+namespace Rosegarden
+{
+
+BankEditorDialog::BankEditorDialog(QWidget *parent,
+ RosegardenGUIDoc *doc,
+ DeviceId defaultDevice):
+ KMainWindow(parent, "bankeditordialog"),
+ m_studio(&doc->getStudio()),
+ m_doc(doc),
+ m_copyBank(Device::NO_DEVICE, -1),
+ m_modified(false),
+ m_keepBankList(false),
+ m_deleteAllReally(false),
+ m_lastDevice(Device::NO_DEVICE),
+ m_updateDeviceList(false)
+{
+ QVBox* mainFrame = new QVBox(this);
+ setCentralWidget(mainFrame);
+
+ setCaption(i18n("Manage MIDI Banks and Programs"));
+
+ QSplitter* splitter = new QSplitter(mainFrame);
+
+ QFrame* btnBox = new QFrame(mainFrame);
+
+ btnBox->setSizePolicy(QSizePolicy(QSizePolicy::Minimum, QSizePolicy::Fixed));
+
+ QHBoxLayout* layout = new QHBoxLayout(btnBox, 4, 10);
+
+ m_closeButton = new QPushButton(btnBox);
+ m_applyButton = new QPushButton(i18n("Apply"), btnBox);
+ m_resetButton = new QPushButton(i18n("Reset"), btnBox);
+
+ layout->addStretch(10);
+ layout->addWidget(m_applyButton);
+ layout->addWidget(m_resetButton);
+ layout->addSpacing(15);
+ layout->addWidget(m_closeButton);
+ layout->addSpacing(5);
+
+ connect(m_applyButton, SIGNAL(clicked()),
+ this, SLOT(slotApply()));
+ connect(m_resetButton, SIGNAL(clicked()),
+ this, SLOT(slotReset()));
+
+ //
+ // Left-side list view
+ //
+ QVBox* leftPart = new QVBox(splitter);
+ m_listView = new KListView(leftPart);
+ m_listView->addColumn(i18n("MIDI Device"));
+ m_listView->addColumn(i18n("Type"));
+ m_listView->addColumn(i18n("MSB"));
+ m_listView->addColumn(i18n("LSB"));
+ m_listView->setRootIsDecorated(true);
+ m_listView->setShowSortIndicator(true);
+ m_listView->setItemsRenameable(true);
+ m_listView->restoreLayout(kapp->config(), BankEditorConfigGroup);
+
+ QFrame *bankBox = new QFrame(leftPart);
+ QGridLayout *gridLayout = new QGridLayout(bankBox, 4, 2, 6, 6);
+
+ m_addBank = new QPushButton(i18n("Add Bank"), bankBox);
+ m_addKeyMapping = new QPushButton(i18n("Add Key Mapping"), bankBox);
+ m_delete = new QPushButton(i18n("Delete"), bankBox);
+ m_deleteAll = new QPushButton(i18n("Delete All"), bankBox);
+ gridLayout->addWidget(m_addBank, 0, 0);
+ gridLayout->addWidget(m_addKeyMapping, 0, 1);
+ gridLayout->addWidget(m_delete, 1, 0);
+ gridLayout->addWidget(m_deleteAll, 1, 1);
+
+ // Tips
+ //
+ QToolTip::add
+ (m_addBank,
+ i18n("Add a Bank to the current device"));
+
+ QToolTip::add
+ (m_addKeyMapping,
+ i18n("Add a Percussion Key Mapping to the current device"));
+
+ QToolTip::add
+ (m_delete,
+ i18n("Delete the current Bank or Key Mapping"));
+
+ QToolTip::add
+ (m_deleteAll,
+ i18n("Delete all Banks and Key Mappings from the current Device"));
+
+ m_importBanks = new QPushButton(i18n("Import..."), bankBox);
+ m_exportBanks = new QPushButton(i18n("Export..."), bankBox);
+ gridLayout->addWidget(m_importBanks, 2, 0);
+ gridLayout->addWidget(m_exportBanks, 2, 1);
+
+ // Tips
+ //
+ QToolTip::add
+ (m_importBanks,
+ i18n("Import Bank and Program data from a Rosegarden file to the current Device"));
+ QToolTip::add
+ (m_exportBanks,
+ i18n("Export all Device and Bank information to a Rosegarden format interchange file"));
+
+ m_copyPrograms = new QPushButton(i18n("Copy"), bankBox);
+ m_pastePrograms = new QPushButton(i18n("Paste"), bankBox);
+ gridLayout->addWidget(m_copyPrograms, 3, 0);
+ gridLayout->addWidget(m_pastePrograms, 3, 1);
+
+ // Tips
+ //
+ QToolTip::add
+ (m_copyPrograms,
+ i18n("Copy all Program names from current Bank to clipboard"));
+
+ QToolTip::add
+ (m_pastePrograms,
+ i18n("Paste Program names from clipboard to current Bank"));
+
+ connect(m_listView, SIGNAL(currentChanged(QListViewItem*)),
+ this, SLOT(slotPopulateDevice(QListViewItem*)));
+
+ QFrame *vbox = new QFrame(splitter);
+ QVBoxLayout *vboxLayout = new QVBoxLayout(vbox, 8, 6);
+
+ m_programEditor = new MidiProgramsEditor(this, vbox);
+ vboxLayout->addWidget(m_programEditor);
+
+ m_keyMappingEditor = new MidiKeyMappingEditor(this, vbox);
+ vboxLayout->addWidget(m_keyMappingEditor);
+ m_keyMappingEditor->hide();
+
+ m_programEditor->setSizePolicy(QSizePolicy(QSizePolicy::Minimum, QSizePolicy::Preferred));
+ m_keyMappingEditor->setSizePolicy(QSizePolicy(QSizePolicy::Minimum, QSizePolicy::Preferred));
+
+ m_optionBox = new QVGroupBox(i18n("Options"), vbox);
+ vboxLayout->addWidget(m_optionBox);
+
+ QHBox *variationBox = new QHBox(m_optionBox);
+ m_variationToggle = new QCheckBox(i18n("Show Variation list based on "), variationBox);
+ m_variationCombo = new KComboBox(variationBox);
+ m_variationCombo->insertItem(i18n("LSB"));
+ m_variationCombo->insertItem(i18n("MSB"));
+
+ // device/bank modification
+ connect(m_listView, SIGNAL(itemRenamed (QListViewItem*, const QString&, int)),
+ this, SLOT(slotModifyDeviceOrBankName(QListViewItem*, const QString&, int)));
+
+ connect(m_addBank, SIGNAL(clicked()),
+ this, SLOT(slotAddBank()));
+
+ connect(m_addKeyMapping, SIGNAL(clicked()),
+ this, SLOT(slotAddKeyMapping()));
+
+ connect(m_delete, SIGNAL(clicked()),
+ this, SLOT(slotDelete()));
+
+ connect(m_deleteAll, SIGNAL(clicked()),
+ this, SLOT(slotDeleteAll()));
+
+ connect(m_importBanks, SIGNAL(clicked()),
+ this, SLOT(slotImport()));
+
+ connect(m_exportBanks, SIGNAL(clicked()),
+ this, SLOT(slotExport()));
+
+ connect(m_copyPrograms, SIGNAL(clicked()),
+ this, SLOT(slotEditCopy()));
+
+ connect(m_pastePrograms, SIGNAL(clicked()),
+ this, SLOT(slotEditPaste()));
+
+ connect(m_variationToggle, SIGNAL(clicked()),
+ this, SLOT(slotVariationToggled()));
+
+ connect(m_variationCombo, SIGNAL(activated(int)),
+ this, SLOT(slotVariationChanged(int)));
+
+ setupActions();
+
+ m_doc->getCommandHistory()->attachView(actionCollection());
+ connect(m_doc->getCommandHistory(), SIGNAL(commandExecuted()),
+ this, SLOT(slotUpdate()));
+
+ // Initialise the dialog
+ //
+ initDialog();
+ setModified(false);
+
+ // Check for no Midi devices and disable everything
+ //
+ DeviceList *devices = m_studio->getDevices();
+ DeviceListIterator it;
+ bool haveMidiPlayDevice = false;
+ for (it = devices->begin(); it != devices->end(); ++it) {
+ MidiDevice *md =
+ dynamic_cast<MidiDevice *>(*it);
+ if (md && md->getDirection() == MidiDevice::Play) {
+ haveMidiPlayDevice = true;
+ break;
+ }
+ }
+ if (!haveMidiPlayDevice) {
+ leftPart->setDisabled(true);
+ m_programEditor->setDisabled(true);
+ m_keyMappingEditor->setDisabled(true);
+ m_optionBox->setDisabled(true);
+ }
+
+ if (defaultDevice != Device::NO_DEVICE) {
+ setCurrentDevice(defaultDevice);
+ }
+
+ setAutoSaveSettings(BankEditorConfigGroup, true);
+}
+
+BankEditorDialog::~BankEditorDialog()
+{
+ RG_DEBUG << "~BankEditorDialog()\n";
+
+ m_listView->saveLayout(kapp->config(), BankEditorConfigGroup);
+
+ if (m_doc) // see slotFileClose() for an explanation on why we need to test m_doc
+ m_doc->getCommandHistory()->detachView(actionCollection());
+}
+
+void
+BankEditorDialog::setupActions()
+{
+ KAction* close = KStdAction::close (this, SLOT(slotFileClose()), actionCollection());
+
+ m_closeButton->setText(close->text());
+ connect(m_closeButton, SIGNAL(clicked()),
+ this, SLOT(slotFileClose()));
+
+ KStdAction::copy (this, SLOT(slotEditCopy()), actionCollection());
+ KStdAction::paste (this, SLOT(slotEditPaste()), actionCollection());
+
+ // some adjustments
+
+
+ new KToolBarPopupAction(i18n("Und&o"),
+ "undo",
+ KStdAccel::key(KStdAccel::Undo),
+ actionCollection(),
+ KStdAction::stdName(KStdAction::Undo));
+
+ new KToolBarPopupAction(i18n("Re&do"),
+ "redo",
+ KStdAccel::key(KStdAccel::Redo),
+ actionCollection(),
+ KStdAction::stdName(KStdAction::Redo));
+
+ createGUI("bankeditor.rc");
+}
+
+void
+BankEditorDialog::initDialog()
+{
+ // Clear down
+ //
+ m_deviceNameMap.clear();
+ m_listView->clear();
+
+ // Fill list view
+ //
+ DeviceList *devices = m_studio->getDevices();
+ DeviceListIterator it;
+
+ for (it = devices->begin(); it != devices->end(); ++it) {
+ if ((*it)->getType() == Device::Midi) {
+ MidiDevice* midiDevice =
+ dynamic_cast<MidiDevice*>(*it);
+ if (!midiDevice)
+ continue;
+
+ // skip read-only devices
+ if (midiDevice->getDirection() == MidiDevice::Record)
+ continue;
+
+ m_deviceNameMap[midiDevice->getId()] = midiDevice->getName();
+ QString itemName = strtoqstr(midiDevice->getName());
+
+ RG_DEBUG << "BankEditorDialog::initDialog - adding "
+ << itemName << endl;
+
+ QListViewItem* deviceItem = new MidiDeviceListViewItem
+ (midiDevice->getId(), m_listView, itemName);
+ deviceItem->setOpen(true);
+
+ populateDeviceItem(deviceItem, midiDevice);
+ }
+ }
+
+ // Select the first Device
+ //
+ populateDevice(m_listView->firstChild());
+ m_listView->setSelected(m_listView->firstChild(), true);
+
+}
+
+void
+BankEditorDialog::updateDialog()
+{
+ // Update list view
+ //
+ DeviceList *devices = m_studio->getDevices();
+ DeviceListIterator it;
+ bool deviceLabelUpdate = false;
+
+ for (it = devices->begin(); it != devices->end(); ++it) {
+
+ if ((*it)->getType() != Device::Midi)
+ continue;
+
+ MidiDevice* midiDevice =
+ dynamic_cast<MidiDevice*>(*it);
+ if (!midiDevice)
+ continue;
+
+ // skip read-only devices
+ if (midiDevice->getDirection() == MidiDevice::Record)
+ continue;
+
+ if (m_deviceNameMap.find(midiDevice->getId()) != m_deviceNameMap.end()) {
+ // Device already displayed but make sure the label is up to date
+ //
+ QListViewItem* currentItem = m_listView->currentItem();
+
+ if (currentItem) {
+ MidiDeviceListViewItem* deviceItem =
+ getParentDeviceItem(currentItem);
+
+ if (deviceItem &&
+ deviceItem->getDeviceId() == midiDevice->getId()) {
+ if (deviceItem->text(0) != strtoqstr(midiDevice->getName())) {
+ deviceItem->setText(0,
+ strtoqstr(midiDevice->getName()));
+ m_deviceNameMap[midiDevice->getId()] =
+ midiDevice->getName();
+
+ /*
+ cout << "NEW TEXT FOR DEVICE " << midiDevice->getId()
+ << " IS " << midiDevice->getName() << endl;
+ cout << "LIST ITEM ID = "
+ << deviceItem->getDeviceId() << endl;
+ */
+
+ deviceLabelUpdate = true;
+ }
+
+ QListViewItem *child = deviceItem->firstChild();
+
+ while (child) {
+
+ MidiBankListViewItem *bankItem =
+ dynamic_cast<MidiBankListViewItem *>(child);
+
+ if (bankItem) {
+ bool percussion = bankItem->isPercussion();
+ int msb = bankItem->text(2).toInt();
+ int lsb = bankItem->text(3).toInt();
+ std::string bankName =
+ midiDevice->getBankName
+ (MidiBank(percussion, msb, lsb));
+ if (bankName != "" &&
+ bankItem->text(0) != strtoqstr(bankName)) {
+ bankItem->setText(0, strtoqstr(bankName));
+ }
+ }
+
+ child = child->nextSibling();
+ }
+ }
+ }
+
+ continue;
+ }
+
+ m_deviceNameMap[midiDevice->getId()] = midiDevice->getName();
+ QString itemName = strtoqstr(midiDevice->getName());
+
+ RG_DEBUG << "BankEditorDialog::updateDialog - adding "
+ << itemName << endl;
+
+ QListViewItem* deviceItem = new MidiDeviceListViewItem
+ (midiDevice->getId(), m_listView, itemName);
+ deviceItem->setOpen(true);
+
+ populateDeviceItem(deviceItem, midiDevice);
+ }
+
+ // delete items whose corresponding devices are no longer present,
+ // and update the other ones
+ //
+ std::vector<MidiDeviceListViewItem*> itemsToDelete;
+
+ MidiDeviceListViewItem* sibling = dynamic_cast<MidiDeviceListViewItem*>
+ (m_listView->firstChild());
+
+ while (sibling) {
+
+ if (m_deviceNameMap.find(sibling->getDeviceId()) == m_deviceNameMap.end())
+ itemsToDelete.push_back(sibling);
+ else
+ updateDeviceItem(sibling);
+
+ sibling = dynamic_cast<MidiDeviceListViewItem*>(sibling->nextSibling());
+ }
+
+ for (unsigned int i = 0; i < itemsToDelete.size(); ++i)
+ delete itemsToDelete[i];
+
+ m_listView->sort();
+
+ if (deviceLabelUpdate)
+ emit deviceNamesChanged();
+}
+
+void
+BankEditorDialog::setCurrentDevice(DeviceId device)
+{
+ for (QListViewItem *item = m_listView->firstChild(); item;
+ item = item->nextSibling()) {
+ MidiDeviceListViewItem * deviceItem =
+ dynamic_cast<MidiDeviceListViewItem *>(item);
+ if (deviceItem && deviceItem->getDeviceId() == device) {
+ m_listView->setSelected(item, true);
+ break;
+ }
+ }
+}
+
+void
+BankEditorDialog::populateDeviceItem(QListViewItem* deviceItem, MidiDevice* midiDevice)
+{
+ clearItemChildren(deviceItem);
+
+ QString itemName = strtoqstr(midiDevice->getName());
+
+ BankList banks = midiDevice->getBanks();
+ // add banks for this device
+ for (unsigned int i = 0; i < banks.size(); ++i) {
+ RG_DEBUG << "BankEditorDialog::populateDeviceItem - adding "
+ << itemName << " - " << strtoqstr(banks[i].getName())
+ << endl;
+ new MidiBankListViewItem(midiDevice->getId(), i, deviceItem,
+ strtoqstr(banks[i].getName()),
+ banks[i].isPercussion(),
+ banks[i].getMSB(), banks[i].getLSB());
+ }
+
+ const KeyMappingList &mappings = midiDevice->getKeyMappings();
+ for (unsigned int i = 0; i < mappings.size(); ++i) {
+ RG_DEBUG << "BankEditorDialog::populateDeviceItem - adding key mapping "
+ << itemName << " - " << strtoqstr(mappings[i].getName())
+ << endl;
+ new MidiKeyMapListViewItem(midiDevice->getId(), deviceItem,
+ strtoqstr(mappings[i].getName()));
+ }
+}
+
+void
+BankEditorDialog::updateDeviceItem(MidiDeviceListViewItem* deviceItem)
+{
+ MidiDevice* midiDevice = getMidiDevice(deviceItem->getDeviceId());
+ if (!midiDevice) {
+ RG_DEBUG << "BankEditorDialog::updateDeviceItem : WARNING no midi device for this item\n";
+ return ;
+ }
+
+ QString itemName = strtoqstr(midiDevice->getName());
+
+ BankList banks = midiDevice->getBanks();
+ KeyMappingList keymaps = midiDevice->getKeyMappings();
+
+ // add missing banks for this device
+ //
+ for (unsigned int i = 0; i < banks.size(); ++i) {
+ if (deviceItemHasBank(deviceItem, i))
+ continue;
+
+ RG_DEBUG << "BankEditorDialog::updateDeviceItem - adding "
+ << itemName << " - " << strtoqstr(banks[i].getName())
+ << endl;
+ new MidiBankListViewItem(midiDevice->getId(), i, deviceItem,
+ strtoqstr(banks[i].getName()),
+ banks[i].isPercussion(),
+ banks[i].getMSB(), banks[i].getLSB());
+ }
+
+ for (unsigned int i = 0; i < keymaps.size(); ++i) {
+
+ QListViewItem *child = deviceItem->firstChild();
+ bool have = false;
+
+ while (child) {
+ MidiKeyMapListViewItem *keyItem =
+ dynamic_cast<MidiKeyMapListViewItem*>(child);
+ if (keyItem) {
+ if (keyItem->getName() == strtoqstr(keymaps[i].getName())) {
+ have = true;
+ }
+ }
+ child = child->nextSibling();
+ }
+
+ if (have)
+ continue;
+
+ RG_DEBUG << "BankEditorDialog::updateDeviceItem - adding "
+ << itemName << " - " << strtoqstr(keymaps[i].getName())
+ << endl;
+ new MidiKeyMapListViewItem(midiDevice->getId(), deviceItem,
+ strtoqstr(keymaps[i].getName()));
+ }
+
+ // delete banks which are no longer present
+ //
+ std::vector<QListViewItem*> childrenToDelete;
+
+ QListViewItem* child = deviceItem->firstChild();
+
+ while (child) {
+
+ MidiBankListViewItem *bankItem =
+ dynamic_cast<MidiBankListViewItem *>(child);
+ if (bankItem) {
+ if (bankItem->getBank() >= int(banks.size()))
+ childrenToDelete.push_back(child);
+ else { // update the banks MSB/LSB which might have changed
+ bankItem->setPercussion(banks[bankItem->getBank()].isPercussion());
+ bankItem->setMSB(banks[bankItem->getBank()].getMSB());
+ bankItem->setLSB(banks[bankItem->getBank()].getLSB());
+ }
+ }
+
+ MidiKeyMapListViewItem *keyItem =
+ dynamic_cast<MidiKeyMapListViewItem *>(child);
+ if (keyItem) {
+ if (!midiDevice->getKeyMappingByName(qstrtostr(keyItem->getName()))) {
+ childrenToDelete.push_back(child);
+ }
+ }
+
+ child = child->nextSibling();
+ }
+
+ for (unsigned int i = 0; i < childrenToDelete.size(); ++i)
+ delete childrenToDelete[i];
+}
+
+bool
+BankEditorDialog::deviceItemHasBank(MidiDeviceListViewItem* deviceItem, int bankNb)
+{
+ QListViewItem *child = deviceItem->firstChild();
+
+ while (child) {
+ MidiBankListViewItem *bankItem =
+ dynamic_cast<MidiBankListViewItem*>(child);
+ if (bankItem) {
+ if (bankItem->getBank() == bankNb)
+ return true;
+ }
+ child = child->nextSibling();
+ }
+
+ return false;
+}
+
+void
+BankEditorDialog::clearItemChildren(QListViewItem* item)
+{
+ QListViewItem* child = 0;
+
+ while ((child = item->firstChild()))
+ delete child;
+}
+
+MidiDevice*
+BankEditorDialog::getCurrentMidiDevice()
+{
+ return getMidiDevice(m_listView->currentItem());
+}
+
+void
+BankEditorDialog::checkModified()
+{
+ if (!m_modified)
+ return ;
+
+ setModified(false);
+
+ // // then ask if we want to apply the changes
+
+ // int reply = KMessageBox::questionYesNo(this,
+ // i18n("Apply pending changes?"));
+
+ ModifyDeviceCommand *command = 0;
+ MidiDevice *device = getMidiDevice(m_lastDevice);
+ if (!device) {
+ RG_DEBUG << "%%% WARNING : BankEditorDialog::checkModified() - NO MIDI DEVICE for device "
+ << m_lastDevice << endl;
+ return ;
+ }
+
+ if (m_bankList.size() == 0 && m_programList.size() == 0) {
+
+ command = new ModifyDeviceCommand(m_studio,
+ m_lastDevice,
+ m_deviceNameMap[m_lastDevice],
+ device->getLibrarianName(),
+ device->getLibrarianEmail()); // rename
+
+ command->clearBankAndProgramList();
+
+ } else {
+
+ MidiDevice::VariationType variation =
+ MidiDevice::NoVariations;
+ if (m_variationToggle->isChecked()) {
+ if (m_variationCombo->currentItem() == 0) {
+ variation = MidiDevice::VariationFromLSB;
+ } else {
+ variation = MidiDevice::VariationFromMSB;
+ }
+ }
+
+ command = new ModifyDeviceCommand(m_studio,
+ m_lastDevice,
+ m_deviceNameMap[m_lastDevice],
+ device->getLibrarianName(),
+ device->getLibrarianEmail());
+
+ command->setVariation(variation);
+ command->setBankList(m_bankList);
+ command->setProgramList(m_programList);
+ }
+
+ addCommandToHistory(command);
+
+ setModified(false);
+}
+
+void
+BankEditorDialog::slotPopulateDevice(QListViewItem* item)
+{
+ RG_DEBUG << "BankEditorDialog::slotPopulateDevice" << endl;
+
+ if (!item)
+ return ;
+
+ checkModified();
+
+ populateDevice(item);
+}
+
+void
+BankEditorDialog::populateDevice(QListViewItem* item)
+{
+ RG_DEBUG << "BankEditorDialog::populateDevice\n";
+
+ if (!item)
+ return ;
+
+ MidiKeyMapListViewItem *keyItem = dynamic_cast<MidiKeyMapListViewItem *>(item);
+
+ if (keyItem) {
+
+ stateChanged("on_key_item");
+ stateChanged("on_bank_item", KXMLGUIClient::StateReverse);
+
+ m_delete->setEnabled(true);
+
+ MidiDevice *device = getMidiDevice(keyItem->getDeviceId());
+ if (!device)
+ return ;
+
+ setProgramList(device);
+
+ m_keyMappingEditor->populate(item);
+
+ m_programEditor->hide();
+ m_keyMappingEditor->show();
+
+ m_lastDevice = keyItem->getDeviceId();
+
+ return ;
+ }
+
+ MidiBankListViewItem* bankItem = dynamic_cast<MidiBankListViewItem*>(item);
+
+ if (bankItem) {
+
+ stateChanged("on_bank_item");
+ stateChanged("on_key_item", KXMLGUIClient::StateReverse);
+
+ m_delete->setEnabled(true);
+ m_copyPrograms->setEnabled(true);
+
+ if (m_copyBank.first != Device::NO_DEVICE)
+ m_pastePrograms->setEnabled(true);
+
+ MidiDevice *device = getMidiDevice(bankItem->getDeviceId());
+ if (!device)
+ return ;
+
+ if (!m_keepBankList || m_bankList.size() == 0)
+ m_bankList = device->getBanks();
+ else
+ m_keepBankList = false;
+
+ setProgramList(device);
+
+ m_variationToggle->setChecked(device->getVariationType() !=
+ MidiDevice::NoVariations);
+ m_variationCombo->setEnabled(m_variationToggle->isChecked());
+ m_variationCombo->setCurrentItem
+ (device->getVariationType() ==
+ MidiDevice::VariationFromLSB ? 0 : 1);
+
+ m_lastBank = m_bankList[bankItem->getBank()];
+
+ m_programEditor->populate(item);
+
+ m_keyMappingEditor->hide();
+ m_programEditor->show();
+
+ m_lastDevice = bankItem->getDeviceId();
+
+ return ;
+ }
+
+ // Device, not bank or key mapping
+ // Ensure we fill these lists for the new device
+ //
+ MidiDeviceListViewItem* deviceItem = getParentDeviceItem(item);
+
+ m_lastDevice = deviceItem->getDeviceId();
+
+ MidiDevice *device = getMidiDevice(deviceItem);
+ if (!device) {
+ RG_DEBUG << "BankEditorDialog::populateDevice - no device for this item\n";
+ return ;
+ }
+
+ m_bankList = device->getBanks();
+ setProgramList(device);
+
+ RG_DEBUG << "BankEditorDialog::populateDevice : not a bank item - disabling" << endl;
+ m_delete->setEnabled(false);
+ m_copyPrograms->setEnabled(false);
+ m_pastePrograms->setEnabled(false);
+
+ m_variationToggle->setChecked(device->getVariationType() !=
+ MidiDevice::NoVariations);
+ m_variationCombo->setEnabled(m_variationToggle->isChecked());
+ m_variationCombo->setCurrentItem
+ (device->getVariationType() ==
+ MidiDevice::VariationFromLSB ? 0 : 1);
+
+ stateChanged("on_bank_item", KXMLGUIClient::StateReverse);
+ stateChanged("on_key_item", KXMLGUIClient::StateReverse);
+ m_programEditor->clearAll();
+ m_keyMappingEditor->clearAll();
+}
+
+void
+BankEditorDialog::slotApply()
+{
+ RG_DEBUG << "BankEditorDialog::slotApply()\n";
+
+ ModifyDeviceCommand *command = 0;
+
+ MidiDevice *device = getMidiDevice(m_lastDevice);
+
+ // Make sure that we don't delete all the banks and programs
+ // if we've not populated them here yet.
+ //
+ if (m_bankList.size() == 0 && m_programList.size() == 0 &&
+ m_deleteAllReally == false) {
+ RG_DEBUG << "BankEditorDialog::slotApply() : m_bankList size = 0\n";
+
+ command = new ModifyDeviceCommand(m_studio,
+ m_lastDevice,
+ m_deviceNameMap[m_lastDevice],
+ device->getLibrarianName(),
+ device->getLibrarianEmail());
+
+ command->clearBankAndProgramList();
+ } else {
+ MidiDevice::VariationType variation =
+ MidiDevice::NoVariations;
+ if (m_variationToggle->isChecked()) {
+ if (m_variationCombo->currentItem() == 0) {
+ variation = MidiDevice::VariationFromLSB;
+ } else {
+ variation = MidiDevice::VariationFromMSB;
+ }
+ }
+
+ RG_DEBUG << "BankEditorDialog::slotApply() : m_bankList size = "
+ << m_bankList.size() << endl;
+
+ command = new ModifyDeviceCommand(m_studio,
+ m_lastDevice,
+ m_deviceNameMap[m_lastDevice],
+ device->getLibrarianName(),
+ device->getLibrarianEmail());
+
+ MidiKeyMapListViewItem *keyItem = dynamic_cast<MidiKeyMapListViewItem*>
+ (m_listView->currentItem());
+ if (keyItem) {
+ KeyMappingList kml(device->getKeyMappings());
+ for (int i = 0; i < kml.size(); ++i) {
+ if (kml[i].getName() == qstrtostr(keyItem->getName())) {
+ kml[i] = m_keyMappingEditor->getMapping();
+ break;
+ }
+ }
+ command->setKeyMappingList(kml);
+ }
+
+ command->setVariation(variation);
+ command->setBankList(m_bankList);
+ command->setProgramList(m_programList);
+ }
+
+ addCommandToHistory(command);
+
+ // Our freaky fudge to update instrument/device names externally
+ //
+ if (m_updateDeviceList) {
+ emit deviceNamesChanged();
+ m_updateDeviceList = false;
+ }
+
+ setModified(false);
+}
+
+void
+BankEditorDialog::slotReset()
+{
+ resetProgramList();
+
+ m_programEditor->reset();
+ m_programEditor->populate(m_listView->currentItem());
+ m_keyMappingEditor->reset();
+ m_keyMappingEditor->populate(m_listView->currentItem());
+
+ MidiDeviceListViewItem* deviceItem = getParentDeviceItem
+ (m_listView->currentItem());
+
+ if (deviceItem) {
+ MidiDevice *device = getMidiDevice(deviceItem);
+ m_variationToggle->setChecked(device->getVariationType() !=
+ MidiDevice::NoVariations);
+ m_variationCombo->setEnabled(m_variationToggle->isChecked());
+ m_variationCombo->setCurrentItem
+ (device->getVariationType() ==
+ MidiDevice::VariationFromLSB ? 0 : 1);
+ }
+
+ updateDialog();
+
+ setModified(false);
+}
+
+void
+BankEditorDialog::resetProgramList()
+{
+ m_programList = m_oldProgramList;
+}
+
+void
+BankEditorDialog::setProgramList(MidiDevice *device)
+{
+ m_programList = device->getPrograms();
+ m_oldProgramList = m_programList;
+}
+
+void
+BankEditorDialog::slotUpdate()
+{
+ updateDialog();
+}
+
+MidiDeviceListViewItem*
+BankEditorDialog::getParentDeviceItem(QListViewItem* item)
+{
+ if (!item)
+ return 0;
+
+ if (dynamic_cast<MidiBankListViewItem*>(item))
+ // go up to the parent device item
+ item = item->parent();
+
+ if (dynamic_cast<MidiKeyMapListViewItem*>(item))
+ // go up to the parent device item
+ item = item->parent();
+
+ if (!item) {
+ RG_DEBUG << "BankEditorDialog::getParentDeviceItem : missing parent device item for bank item - this SHOULD NOT HAPPEN" << endl;
+ return 0;
+ }
+
+ return dynamic_cast<MidiDeviceListViewItem*>(item);
+}
+
+void
+BankEditorDialog::slotAddBank()
+{
+ if (!m_listView->currentItem())
+ return ;
+
+ QListViewItem* currentItem = m_listView->currentItem();
+
+ MidiDeviceListViewItem* deviceItem = getParentDeviceItem(currentItem);
+ MidiDevice *device = getMidiDevice(currentItem);
+
+ if (device) {
+ // If the bank and program lists are empty then try to
+ // populate them.
+ //
+ if (m_bankList.size() == 0 && m_programList.size() == 0) {
+ m_bankList = device->getBanks();
+ setProgramList(device);
+ }
+
+ std::pair<int, int> bank = getFirstFreeBank(m_listView->currentItem());
+
+ MidiBank newBank(false,
+ bank.first, bank.second,
+ qstrtostr(i18n("<new bank>")));
+ m_bankList.push_back(newBank);
+
+ QListViewItem* newBankItem =
+ new MidiBankListViewItem(deviceItem->getDeviceId(),
+ m_bankList.size() - 1,
+ deviceItem,
+ strtoqstr(newBank.getName()),
+ newBank.isPercussion(),
+ newBank.getMSB(), newBank.getLSB());
+ keepBankListForNextPopulate();
+ m_listView->setCurrentItem(newBankItem);
+
+ slotApply();
+ selectDeviceItem(device);
+ }
+}
+
+void
+BankEditorDialog::slotAddKeyMapping()
+{
+ if (!m_listView->currentItem())
+ return ;
+
+ QListViewItem* currentItem = m_listView->currentItem();
+
+ MidiDeviceListViewItem* deviceItem = getParentDeviceItem(currentItem);
+ MidiDevice *device = getMidiDevice(currentItem);
+
+ if (device) {
+
+ QString name = "";
+ int n = 0;
+ while (name == "" || device->getKeyMappingByName(qstrtostr(name)) != 0) {
+ ++n;
+ if (n == 1)
+ name = i18n("<new mapping>");
+ else
+ name = i18n("<new mapping %1>").arg(n);
+ }
+
+ MidiKeyMapping newKeyMapping(qstrtostr(name));
+
+ ModifyDeviceCommand *command = new ModifyDeviceCommand
+ (m_studio,
+ device->getId(),
+ device->getName(),
+ device->getLibrarianName(),
+ device->getLibrarianEmail());
+
+ KeyMappingList kml;
+ kml.push_back(newKeyMapping);
+ command->setKeyMappingList(kml);
+ command->setOverwrite(false);
+ command->setRename(false);
+
+ addCommandToHistory(command);
+
+ updateDialog();
+ selectDeviceItem(device);
+ }
+}
+
+void
+BankEditorDialog::slotDelete()
+{
+ if (!m_listView->currentItem())
+ return ;
+
+ QListViewItem* currentItem = m_listView->currentItem();
+
+ MidiBankListViewItem* bankItem = dynamic_cast<MidiBankListViewItem*>(currentItem);
+
+ MidiDevice *device = getMidiDevice(currentItem);
+
+ if (device && bankItem) {
+ int currentBank = bankItem->getBank();
+
+ int reply =
+ KMessageBox::warningYesNo(this, i18n("Really delete this bank?"));
+
+ if (reply == KMessageBox::Yes) {
+ MidiBank bank = m_bankList[currentBank];
+
+ // Copy across all programs that aren't in the doomed bank
+ //
+ ProgramList::iterator it;
+ ProgramList tempList;
+ for (it = m_programList.begin(); it != m_programList.end(); it++)
+ if (!(it->getBank() == bank))
+ tempList.push_back(*it);
+
+ // Erase the bank and repopulate
+ //
+ BankList::iterator er =
+ m_bankList.begin();
+ er += currentBank;
+ m_bankList.erase(er);
+ m_programList = tempList;
+ keepBankListForNextPopulate();
+
+ // the listview automatically selects a new current item
+ m_listView->blockSignals(true);
+ delete currentItem;
+ m_listView->blockSignals(false);
+
+ // Don't allow pasting from this defunct device
+ //
+ if (m_copyBank.first == bankItem->getDeviceId() &&
+ m_copyBank.second == bankItem->getBank()) {
+ m_pastePrograms->setEnabled(false);
+ m_copyBank = std::pair<DeviceId, int>
+ (Device::NO_DEVICE, -1);
+ }
+
+ slotApply();
+ selectDeviceItem(device);
+ }
+
+ return ;
+ }
+
+ MidiKeyMapListViewItem* keyItem = dynamic_cast<MidiKeyMapListViewItem*>(currentItem);
+
+ if (keyItem && device) {
+
+ int reply =
+ KMessageBox::warningYesNo(this, i18n("Really delete this key mapping?"));
+
+ if (reply == KMessageBox::Yes) {
+
+ std::string keyMappingName = qstrtostr(keyItem->getName());
+
+ ModifyDeviceCommand *command = new ModifyDeviceCommand
+ (m_studio,
+ device->getId(),
+ device->getName(),
+ device->getLibrarianName(),
+ device->getLibrarianEmail());
+
+ KeyMappingList kml = device->getKeyMappings();
+
+ for (KeyMappingList::iterator i = kml.begin();
+ i != kml.end(); ++i) {
+ if (i->getName() == keyMappingName) {
+ RG_DEBUG << "erasing " << keyMappingName << endl;
+ kml.erase(i);
+ break;
+ }
+ }
+
+ RG_DEBUG << " setting " << kml.size() << " key mappings to device " << endl;
+
+ command->setKeyMappingList(kml);
+ command->setOverwrite(true);
+
+ addCommandToHistory(command);
+
+ RG_DEBUG << " device has " << device->getKeyMappings().size() << " key mappings now " << endl;
+
+ updateDialog();
+ }
+
+ return ;
+ }
+}
+
+void
+BankEditorDialog::slotDeleteAll()
+{
+ if (!m_listView->currentItem())
+ return ;
+
+ QListViewItem* currentItem = m_listView->currentItem();
+ MidiDeviceListViewItem* deviceItem = getParentDeviceItem(currentItem);
+ MidiDevice *device = getMidiDevice(deviceItem);
+
+ QString question = i18n("Really delete all banks for ") +
+ strtoqstr(device->getName()) + QString(" ?");
+
+ int reply = KMessageBox::warningYesNo(this, question);
+
+ if (reply == KMessageBox::Yes) {
+
+ // erase all bank items
+ QListViewItem* child = 0;
+ while ((child = deviceItem->firstChild()))
+ delete child;
+
+ m_bankList.clear();
+ m_programList.clear();
+
+ // Don't allow pasting from this defunct device
+ //
+ if (m_copyBank.first == deviceItem->getDeviceId()) {
+ m_pastePrograms->setEnabled(false);
+ m_copyBank = std::pair<DeviceId, int>
+ (Device::NO_DEVICE, -1);
+ }
+
+ // Urgh, we have this horrible flag that we're using to frig this.
+ // (we might not need this anymore but I'm too scared to remove it
+ // now).
+ //
+ m_deleteAllReally = true;
+ slotApply();
+ m_deleteAllReally = false;
+
+ selectDeviceItem(device);
+
+ }
+}
+
+MidiDevice*
+BankEditorDialog::getMidiDevice(DeviceId id)
+{
+ Device *device = m_studio->getDevice(id);
+ MidiDevice *midiDevice =
+ dynamic_cast<MidiDevice *>(device);
+
+ /*
+ if (device) {
+ if (!midiDevice) {
+ std::cerr << "ERROR: BankEditorDialog::getMidiDevice: device "
+ << id << " is not a MIDI device" << std::endl;
+ }
+ } else {
+ std::cerr
+ << "ERROR: BankEditorDialog::getMidiDevice: no such device as "
+ << id << std::endl;
+ }
+ */
+
+ return midiDevice;
+}
+
+MidiDevice*
+BankEditorDialog::getMidiDevice(QListViewItem* item)
+{
+ MidiDeviceListViewItem* deviceItem =
+ dynamic_cast<MidiDeviceListViewItem*>(item);
+ if (!deviceItem)
+ return 0;
+
+ return getMidiDevice(deviceItem->getDeviceId());
+}
+
+std::pair<int, int>
+BankEditorDialog::getFirstFreeBank(QListViewItem* item)
+{
+ //!!! percussion? this is actually only called in the expectation
+ // that percussion==false at the moment
+
+ for (int msb = 0; msb < 128; ++msb) {
+ for (int lsb = 0; lsb < 128; ++lsb) {
+ BankList::iterator i = m_bankList.begin();
+ for ( ; i != m_bankList.end(); ++i) {
+ if (i->getLSB() == lsb && i->getMSB() == msb) {
+ break;
+ }
+ }
+ if (i == m_bankList.end())
+ return std::pair<int, int>(msb, lsb);
+ }
+ }
+
+ return std::pair<int, int>(0, 0);
+}
+
+void
+BankEditorDialog::slotModifyDeviceOrBankName(QListViewItem* item, const QString &label, int)
+{
+ RG_DEBUG << "BankEditorDialog::slotModifyDeviceOrBankName" << endl;
+
+ MidiDeviceListViewItem* deviceItem =
+ dynamic_cast<MidiDeviceListViewItem*>(item);
+ MidiBankListViewItem* bankItem =
+ dynamic_cast<MidiBankListViewItem*>(item);
+ MidiKeyMapListViewItem *keyItem =
+ dynamic_cast<MidiKeyMapListViewItem*>(item);
+
+ if (bankItem) {
+
+ // renaming a bank item
+
+ RG_DEBUG << "BankEditorDialog::slotModifyDeviceOrBankName - "
+ << "modify bank name to " << label << endl;
+
+ if (m_bankList[bankItem->getBank()].getName() != qstrtostr(label)) {
+ m_bankList[bankItem->getBank()].setName(qstrtostr(label));
+ setModified(true);
+ }
+
+ } else if (keyItem) {
+
+ RG_DEBUG << "BankEditorDialog::slotModifyDeviceOrBankName - "
+ << "modify key mapping name to " << label << endl;
+
+ QString oldName = keyItem->getName();
+
+ QListViewItem* currentItem = m_listView->currentItem();
+ MidiDevice *device = getMidiDevice(currentItem);
+
+ if (device) {
+
+ ModifyDeviceCommand *command = new ModifyDeviceCommand
+ (m_studio,
+ device->getId(),
+ device->getName(),
+ device->getLibrarianName(),
+ device->getLibrarianEmail());
+
+ KeyMappingList kml = device->getKeyMappings();
+
+ for (KeyMappingList::iterator i = kml.begin();
+ i != kml.end(); ++i) {
+ if (i->getName() == qstrtostr(oldName)) {
+ i->setName(qstrtostr(label));
+ break;
+ }
+ }
+
+ command->setKeyMappingList(kml);
+ command->setOverwrite(true);
+
+ addCommandToHistory(command);
+
+ updateDialog();
+ }
+
+ } else if (deviceItem) { // must be last, as the others are subclasses
+
+ // renaming a device item
+
+ RG_DEBUG << "BankEditorDialog::slotModifyDeviceOrBankName - "
+ << "modify device name to " << label << endl;
+
+ if (m_deviceNameMap[deviceItem->getDeviceId()] != qstrtostr(label)) {
+ m_deviceNameMap[deviceItem->getDeviceId()] = qstrtostr(label);
+ setModified(true);
+
+ m_updateDeviceList = true;
+ }
+
+ }
+
+}
+
+void
+BankEditorDialog::selectDeviceItem(MidiDevice *device)
+{
+ QListViewItem *child = m_listView->firstChild();
+ MidiDeviceListViewItem *midiDeviceItem;
+ MidiDevice *midiDevice;
+
+ do {
+ midiDeviceItem = dynamic_cast<MidiDeviceListViewItem*>(child);
+
+ if (midiDeviceItem) {
+ midiDevice = getMidiDevice(midiDeviceItem);
+
+ if (midiDevice == device) {
+ m_listView->setSelected(child, true);
+ return ;
+ }
+ }
+
+ } while ((child = child->nextSibling()));
+}
+
+void
+BankEditorDialog::selectDeviceBankItem(DeviceId deviceId,
+ int bank)
+{
+ QListViewItem *deviceChild = m_listView->firstChild();
+ QListViewItem *bankChild;
+ int deviceCount = 0, bankCount = 0;
+
+ do {
+ bankChild = deviceChild->firstChild();
+
+ MidiDeviceListViewItem *midiDeviceItem =
+ dynamic_cast<MidiDeviceListViewItem*>(deviceChild);
+
+ if (midiDeviceItem && bankChild) {
+ do {
+ if (deviceId == midiDeviceItem->getDeviceId() &
+ bank == bankCount) {
+ m_listView->setSelected(bankChild, true);
+ return ;
+ }
+ bankCount++;
+
+ } while ((bankChild = bankChild->nextSibling()));
+ }
+
+ deviceCount++;
+ bankCount = 0;
+ } while ((deviceChild = deviceChild->nextSibling()));
+}
+
+void
+BankEditorDialog::slotVariationToggled()
+{
+ setModified(true);
+ m_variationCombo->setEnabled(m_variationToggle->isChecked());
+}
+
+void
+BankEditorDialog::slotVariationChanged(int)
+{
+ setModified(true);
+}
+
+void
+BankEditorDialog::setModified(bool modified)
+{
+ RG_DEBUG << "BankEditorDialog::setModified("
+ << modified << ")" << endl;
+
+ if (modified) {
+
+ m_applyButton->setEnabled(true);
+ m_resetButton->setEnabled(true);
+ m_closeButton->setEnabled(false);
+ m_listView->setEnabled(false);
+
+ } else {
+
+ m_applyButton->setEnabled(false);
+ m_resetButton->setEnabled(false);
+ m_closeButton->setEnabled(true);
+ m_listView->setEnabled(true);
+
+ }
+
+ m_modified = modified;
+}
+
+void
+BankEditorDialog::addCommandToHistory(KCommand *command)
+{
+ getCommandHistory()->addCommand(command);
+ setModified(false);
+}
+
+MultiViewCommandHistory*
+BankEditorDialog::getCommandHistory()
+{
+ return m_doc->getCommandHistory();
+}
+
+void
+BankEditorDialog::slotImport()
+{
+ QString deviceDir = KGlobal::dirs()->findResource("appdata", "library/");
+ QDir dir(deviceDir);
+ if (!dir.exists()) {
+ deviceDir = ":ROSEGARDENDEVICE";
+ } else {
+ deviceDir = "file://" + deviceDir;
+ }
+
+ KURL url = KFileDialog::getOpenURL
+ (deviceDir,
+ "audio/x-rosegarden-device audio/x-rosegarden audio/x-soundfont",
+ this, i18n("Import Banks from Device in File"));
+
+ if (url.isEmpty())
+ return ;
+
+ ImportDeviceDialog *dialog = new ImportDeviceDialog(this, url);
+ if (dialog->doImport() && dialog->exec() == QDialog::Accepted) {
+
+ MidiDeviceListViewItem* deviceItem =
+ dynamic_cast<MidiDeviceListViewItem*>
+ (m_listView->selectedItem());
+
+ if (!deviceItem) {
+ KMessageBox::error(this, "Some internal error: cannot locate selected device");
+ return ;
+ }
+
+ ModifyDeviceCommand *command = 0;
+
+ BankList banks(dialog->getBanks());
+ ProgramList programs(dialog->getPrograms());
+ ControlList controls(dialog->getControllers());
+ KeyMappingList keyMappings(dialog->getKeyMappings());
+ MidiDevice::VariationType variation(dialog->getVariationType());
+ std::string librarianName(dialog->getLibrarianName());
+ std::string librarianEmail(dialog->getLibrarianEmail());
+
+ // don't record the librarian when
+ // merging banks -- it's misleading.
+ // (also don't use variation type)
+ if (!dialog->shouldOverwriteBanks()) {
+ librarianName = "";
+ librarianEmail = "";
+ }
+
+ command = new ModifyDeviceCommand(m_studio,
+ deviceItem->getDeviceId(),
+ dialog->getDeviceName(),
+ librarianName,
+ librarianEmail);
+
+ if (dialog->shouldOverwriteBanks()) {
+ command->setVariation(variation);
+ }
+ if (dialog->shouldImportBanks()) {
+ command->setBankList(banks);
+ command->setProgramList(programs);
+ }
+ if (dialog->shouldImportControllers()) {
+ command->setControlList(controls);
+ }
+ if (dialog->shouldImportKeyMappings()) {
+ command->setKeyMappingList(keyMappings);
+ }
+ command->setOverwrite(dialog->shouldOverwriteBanks());
+ command->setRename(dialog->shouldRename());
+
+ addCommandToHistory(command);
+
+ // No need to redraw the dialog, this is done by
+ // slotUpdate, signalled by the MultiViewCommandHistory
+ MidiDevice *device = getMidiDevice(deviceItem);
+ if (device)
+ selectDeviceItem(device);
+ }
+
+ delete dialog;
+ updateDialog();
+}
+
+void
+BankEditorDialog::slotEditCopy()
+{
+ MidiBankListViewItem* bankItem
+ = dynamic_cast<MidiBankListViewItem*>(m_listView->currentItem());
+
+ if (bankItem) {
+ m_copyBank = std::pair<DeviceId, int>(bankItem->getDeviceId(),
+ bankItem->getBank());
+ m_pastePrograms->setEnabled(true);
+ }
+}
+
+void
+BankEditorDialog::slotEditPaste()
+{
+ MidiBankListViewItem* bankItem
+ = dynamic_cast<MidiBankListViewItem*>(m_listView->currentItem());
+
+ if (bankItem) {
+ // Get the full program and bank list for the source device
+ //
+ MidiDevice *device = getMidiDevice(m_copyBank.first);
+ std::vector<MidiBank> tempBank = device->getBanks();
+
+ ProgramList::iterator it;
+ std::vector<MidiProgram> tempProg;
+
+ // Remove programs that will be overwritten
+ //
+ for (it = m_programList.begin(); it != m_programList.end(); it++) {
+ if (!(it->getBank() == m_lastBank))
+ tempProg.push_back(*it);
+ }
+ m_programList = tempProg;
+
+ // Now get source list and msb/lsb
+ //
+ tempProg = device->getPrograms();
+ MidiBank sourceBank = tempBank[m_copyBank.second];
+
+ // Add the new programs
+ //
+ for (it = tempProg.begin(); it != tempProg.end(); it++) {
+ if (it->getBank() == sourceBank) {
+ // Insert with new MSB and LSB
+ //
+ MidiProgram copyProgram(m_lastBank,
+ it->getProgram(),
+ it->getName());
+
+ m_programList.push_back(copyProgram);
+ }
+ }
+
+ // Save these for post-apply
+ //
+ DeviceId devPos = bankItem->getDeviceId();
+ int bankPos = bankItem->getBank();
+
+ slotApply();
+
+ // Select same bank
+ //
+ selectDeviceBankItem(devPos, bankPos);
+ }
+}
+
+void
+BankEditorDialog::slotExport()
+{
+ QString extension = "rgd";
+
+ QString name =
+ KFileDialog::getSaveFileName(":ROSEGARDEN",
+ (extension.isEmpty() ? QString("*") : ("*." + extension)),
+ this,
+ i18n("Export Device as..."));
+
+ // Check for the existence of the name
+ if (name.isEmpty())
+ return ;
+
+ // Append extension if we don't have one
+ //
+ if (!extension.isEmpty()) {
+ if (!name.endsWith("." + extension)) {
+ name += "." + extension;
+ }
+ }
+
+ QFileInfo info(name);
+
+ if (info.isDir()) {
+ KMessageBox::sorry(this, i18n("You have specified a directory"));
+ return ;
+ }
+
+ if (info.exists()) {
+ int overwrite = KMessageBox::questionYesNo
+ (this, i18n("The specified file exists. Overwrite?"));
+
+ if (overwrite != KMessageBox::Yes)
+ return ;
+
+ }
+
+ MidiDeviceListViewItem* deviceItem =
+ dynamic_cast<MidiDeviceListViewItem*>
+ (m_listView->selectedItem());
+
+ std::vector<DeviceId> devices;
+ MidiDevice *md = getMidiDevice(deviceItem);
+
+ if (md) {
+ ExportDeviceDialog *ed = new ExportDeviceDialog
+ (this, strtoqstr(md->getName()));
+ if (ed->exec() != QDialog::Accepted)
+ return ;
+ if (ed->getExportType() == ExportDeviceDialog::ExportOne) {
+ devices.push_back(md->getId());
+ }
+ }
+
+ m_doc->exportStudio(name, devices);
+}
+
+void
+BankEditorDialog::slotFileClose()
+{
+ RG_DEBUG << "BankEditorDialog::slotFileClose()\n";
+
+ // We need to do this because we might be here due to a
+ // documentAboutToChange signal, in which case the document won't
+ // be valid by the time we reach the dtor, since it will be
+ // triggered when the closeEvent is actually processed.
+ //
+ m_doc->getCommandHistory()->detachView(actionCollection());
+ m_doc = 0;
+ close();
+}
+
+void
+BankEditorDialog::closeEvent(QCloseEvent *e)
+{
+ if (m_modified) {
+
+ int res = KMessageBox::warningYesNoCancel(this,
+ i18n("There are unsaved changes.\n"
+ "Do you want to apply the changes before exiting "
+ "the Bank Editor or discard the changes ?"),
+ i18n("Unsaved Changes"),
+ i18n("&Apply"),
+ i18n("&Discard"));
+ if (res == KMessageBox::Yes) {
+
+ slotApply();
+
+ } else if (res == KMessageBox::Cancel)
+ return ;
+ }
+
+ emit closing();
+ KMainWindow::closeEvent(e);
+}
+
+}
+#include "BankEditorDialog.moc"
diff --git a/src/gui/studio/BankEditorDialog.h b/src/gui/studio/BankEditorDialog.h
new file mode 100644
index 0000000..0e49430
--- /dev/null
+++ b/src/gui/studio/BankEditorDialog.h
@@ -0,0 +1,211 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_BANKEDITORDIALOG_H_
+#define _RG_BANKEDITORDIALOG_H_
+
+#include "base/Device.h"
+#include "base/MidiProgram.h"
+#include <map>
+#include <string>
+#include <kmainwindow.h>
+#include <utility>
+
+
+class QWidget;
+class QString;
+class QPushButton;
+class QListViewItem;
+class QGroupBox;
+class QCloseEvent;
+class QCheckBox;
+class KListView;
+class KCommand;
+class KComboBox;
+
+
+namespace Rosegarden
+{
+
+class Studio;
+class RosegardenGUIDoc;
+class MultiViewCommandHistory;
+class MidiProgramsEditor;
+class MidiKeyMappingEditor;
+class MidiDeviceListViewItem;
+class MidiDevice;
+
+
+class BankEditorDialog : public KMainWindow
+{
+ Q_OBJECT
+
+public:
+ BankEditorDialog(QWidget *parent,
+ RosegardenGUIDoc *doc,
+ DeviceId defaultDevice =
+ Device::NO_DEVICE);
+
+ ~BankEditorDialog();
+
+ // Initialise the devices/banks and programs - the whole lot
+ //
+ void initDialog();
+
+ std::pair<int, int> getFirstFreeBank(QListViewItem*);
+
+ void addCommandToHistory(KCommand *command);
+ MultiViewCommandHistory* getCommandHistory();
+
+ void setCurrentDevice(DeviceId device);
+
+ // Get a MidiDevice from an index number
+ //
+ MidiDevice* getMidiDevice(DeviceId);
+ MidiDevice* getMidiDevice(QListViewItem*);
+ MidiDevice* getCurrentMidiDevice();
+ BankList& getBankList() { return m_bankList; }
+ ProgramList&getProgramList() { return m_programList; }
+
+ Studio *getStudio() { return m_studio; }
+
+ void setModified(bool value);
+
+ void checkModified();
+
+ // Set the listview to select a certain device - used after adding
+ // or deleting banks.
+ //
+ void selectDeviceItem(MidiDevice *device);
+
+ // Select a device/bank combination
+ //
+ void selectDeviceBankItem(DeviceId device, int bank);
+
+public slots:
+ void slotPopulateDevice(QListViewItem*);
+
+ void slotApply();
+ void slotReset();
+
+ void slotUpdate();
+
+ void slotAddBank();
+ void slotAddKeyMapping();
+ void slotDelete();
+ void slotDeleteAll();
+
+ void slotImport();
+ void slotExport();
+
+ void slotModifyDeviceOrBankName(QListViewItem*, const QString&,int);
+
+ void slotFileClose();
+
+ void slotEditCopy();
+ void slotEditPaste();
+
+ void slotVariationToggled();
+ void slotVariationChanged(int);
+
+signals:
+ void closing();
+ void deviceNamesChanged();
+
+protected:
+ virtual void closeEvent(QCloseEvent*);
+
+ void resetProgramList();
+ void setProgramList(MidiDevice *device);
+
+ void updateDialog();
+
+ void populateDeviceItem(QListViewItem* deviceItem,
+ MidiDevice* midiDevice);
+
+ void updateDeviceItem(MidiDeviceListViewItem* deviceItem);
+
+ bool deviceItemHasBank(MidiDeviceListViewItem* deviceItem, int bankNb);
+
+ void clearItemChildren(QListViewItem* deviceItem);
+
+ MidiDeviceListViewItem* getParentDeviceItem(QListViewItem*);
+ void keepBankListForNextPopulate() { m_keepBankList = true; }
+
+ void populateDevice(QListViewItem*);
+
+ void setupActions();
+
+ //--------------- Data members ---------------------------------
+ Studio *m_studio;
+ RosegardenGUIDoc *m_doc;
+
+ MidiProgramsEditor *m_programEditor;
+ MidiKeyMappingEditor *m_keyMappingEditor;
+ KListView *m_listView;
+
+ QGroupBox *m_optionBox;
+ QCheckBox *m_variationToggle;
+ KComboBox *m_variationCombo;
+
+ QPushButton *m_closeButton;
+ QPushButton *m_resetButton;
+ QPushButton *m_applyButton;
+
+ QPushButton *m_addBank;
+ QPushButton *m_addKeyMapping;
+ QPushButton *m_delete;
+ QPushButton *m_deleteAll;
+
+ QPushButton *m_importBanks;
+ QPushButton *m_exportBanks;
+
+ QPushButton *m_copyPrograms;
+ QPushButton *m_pastePrograms;
+ std::pair<DeviceId, int> m_copyBank;
+
+ std::map<DeviceId, std::string> m_deviceNameMap;
+ BankList m_bankList;
+ ProgramList m_programList;
+ ProgramList m_oldProgramList;
+
+ bool m_modified;
+ bool m_keepBankList;
+ bool m_deleteAllReally;
+
+ DeviceId m_lastDevice;
+ MidiBank m_lastBank;
+
+ bool m_updateDeviceList;
+};
+
+// ----------------------- RemapInstrumentDialog ------------------------
+//
+//
+
+
+}
+
+#endif
diff --git a/src/gui/studio/ChangeRecordDeviceCommand.cpp b/src/gui/studio/ChangeRecordDeviceCommand.cpp
new file mode 100644
index 0000000..a5a3947
--- /dev/null
+++ b/src/gui/studio/ChangeRecordDeviceCommand.cpp
@@ -0,0 +1,66 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include "ChangeRecordDeviceCommand.h"
+#include "StudioControl.h"
+#include "document/ConfigGroups.h"
+#include "sound/MappedEvent.h"
+#include <kapplication.h>
+#include <kconfig.h>
+
+namespace Rosegarden
+{
+
+void
+ChangeRecordDeviceCommand::swap()
+ {
+
+ KConfig *config = kapp->config();
+ config->setGroup(Rosegarden::SequencerOptionsConfigGroup);
+ QStringList devList = config->readListEntry("midirecorddevice");
+ QString sdevice = QString::number(m_deviceId);
+ if (m_action)
+ {
+ if(!devList.contains(sdevice))
+ devList.append(sdevice);
+ }
+ else
+ {
+ if(devList.contains(sdevice))
+ devList.remove(sdevice);
+ }
+ config->writeEntry("midirecorddevice", devList);
+
+ // send the selected device to the sequencer
+ Rosegarden::MappedEvent mEdevice
+ (Rosegarden::MidiInstrumentBase,
+ Rosegarden::MappedEvent::SystemRecordDevice,
+ Rosegarden::MidiByte(m_deviceId),
+ Rosegarden::MidiByte(m_action));
+ Rosegarden::StudioControl::sendMappedEvent(mEdevice);
+
+ m_action = !m_action;
+}
+
+}
diff --git a/src/gui/studio/ChangeRecordDeviceCommand.h b/src/gui/studio/ChangeRecordDeviceCommand.h
new file mode 100644
index 0000000..70819db
--- /dev/null
+++ b/src/gui/studio/ChangeRecordDeviceCommand.h
@@ -0,0 +1,54 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_CHANGERECORDDEVICECOMMAND_H_
+#define _RG_CHANGERECORDDEVICECOMMAND_H_
+
+#include "base/Studio.h"
+#include <klocale.h>
+#include <kcommand.h>
+
+namespace Rosegarden
+{
+
+class ChangeRecordDeviceCommand : public KNamedCommand
+{
+public:
+ ChangeRecordDeviceCommand(Rosegarden::DeviceId deviceId, bool action) :
+ KNamedCommand(i18n("Change Record Device")),
+ m_deviceId(deviceId), m_action(action) { }
+
+ virtual void execute() { swap(); }
+ virtual void unexecute() { swap(); }
+
+private:
+ Rosegarden::DeviceId m_deviceId;
+ bool m_action;
+ void swap();
+
+};
+
+}
+
+#endif /*CHANGERECORDDEVICECOMMAND_H_*/
diff --git a/src/gui/studio/DeviceEditorDialog.cpp b/src/gui/studio/DeviceEditorDialog.cpp
new file mode 100644
index 0000000..29c9dd4
--- /dev/null
+++ b/src/gui/studio/DeviceEditorDialog.cpp
@@ -0,0 +1,406 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "DeviceEditorDialog.h"
+
+#include <klocale.h>
+#include "misc/Debug.h"
+#include "misc/Strings.h"
+#include "base/Device.h"
+#include "base/MidiDevice.h"
+#include "base/Studio.h"
+#include "commands/studio/CreateOrDeleteDeviceCommand.h"
+#include "commands/studio/ReconnectDeviceCommand.h"
+#include "commands/studio/RenameDeviceCommand.h"
+#include "document/RosegardenGUIDoc.h"
+#include "document/MultiViewCommandHistory.h"
+#include "gui/application/RosegardenApplication.h"
+#include <kdialogbase.h>
+#include <kmessagebox.h>
+#include <qcstring.h>
+#include <qdatastream.h>
+#include <qhbox.h>
+#include <qpushbutton.h>
+#include <qregexp.h>
+#include <qstring.h>
+#include <qstringlist.h>
+#include <qtable.h>
+#include <qvbox.h>
+#include <qwidget.h>
+#include <algorithm>
+
+
+namespace Rosegarden
+{
+
+DeviceEditorDialog::DeviceEditorDialog(QWidget *parent,
+ RosegardenGUIDoc *document) :
+ KDialogBase(parent, "deviceeditordialog", true,
+ i18n("Manage MIDI Devices"), Ok | Apply | Close, Ok, true),
+ m_document(document),
+ m_studio(&document->getStudio()),
+ m_modified(false)
+{
+ QVBox *mainBox = makeVBoxMainWidget();
+
+ m_table = new QTable(0, 4, mainBox);
+ m_table->setSorting(false);
+ m_table->setRowMovingEnabled(false);
+ m_table->setColumnMovingEnabled(false);
+ m_table->setShowGrid(false);
+ m_table->horizontalHeader()->setLabel(0, i18n("Device"));
+ m_table->horizontalHeader()->setLabel(1, i18n("Name"));
+ m_table->horizontalHeader()->setLabel(2, i18n("Type"));
+ m_table->horizontalHeader()->setLabel(3, i18n("Connection"));
+ m_table->horizontalHeader()->show();
+ m_table->verticalHeader()->hide();
+ m_table->setLeftMargin(0);
+ m_table->setSelectionMode(QTable::SingleRow);
+ m_table->setColumnReadOnly(0, true);
+ m_table->setColumnReadOnly(2, true);
+
+ makeConnectionList((unsigned int)MidiDevice::Play,
+ m_playConnections);
+ makeConnectionList((unsigned int)MidiDevice::Record,
+ m_recordConnections);
+
+ populate();
+
+ QHBox *hbox = new QHBox(mainBox);
+ QPushButton *addButton = new QPushButton(i18n("Add Play Device"), hbox);
+ QPushButton *addRButton = new QPushButton(i18n("Add Record Device"), hbox);
+ QPushButton *deleteButton = new QPushButton(i18n("Delete Device"), hbox);
+ connect(addButton, SIGNAL(clicked()), this, SLOT(slotAddPlayDevice()));
+ connect(addRButton, SIGNAL(clicked()), this, SLOT(slotAddRecordDevice()));
+ connect(deleteButton, SIGNAL(clicked()), this, SLOT(slotDeleteDevice()));
+ connect(m_table, SIGNAL(valueChanged(int, int)),
+ this, SLOT(slotValueChanged (int, int)));
+
+ setMinimumHeight(250);
+
+ enableButtonOK(false);
+ enableButtonApply(false);
+}
+
+DeviceEditorDialog::~DeviceEditorDialog()
+{
+ // nothing -- don't need to clear device list (the devices were
+ // just aliases for those in the studio)
+}
+
+void
+DeviceEditorDialog::populate()
+{
+ DeviceList *devices = m_studio->getDevices();
+ DeviceListIterator it;
+ m_devices.clear();
+
+ for (it = devices->begin(); it != devices->end(); ++it) {
+ if ((*it)->getType() == Device::Midi) {
+ MidiDevice *md =
+ dynamic_cast<MidiDevice *>(*it);
+ if (md)
+ m_devices.push_back(md);
+ }
+ }
+
+ while (m_table->numRows() > 0) {
+ m_table->removeRow(m_table->numRows() - 1);
+ }
+
+ int deviceCount = 0;
+
+#define NAME_COL 0
+#define LABEL_COL 1
+#define DIRECTION_COL 2
+#define CONNECTION_COL 3
+
+ for (it = m_devices.begin(); it != m_devices.end(); ++it) {
+
+ m_table->insertRows(deviceCount, 1);
+
+ // we know we only put MidiDevices in m_devices
+ MidiDevice *md = static_cast<MidiDevice *>(*it);
+
+ // if you change this string ("Device %1"), change test in slotApply
+ QString deviceName = i18n("Device %1").arg(md->getId() + 1);
+ QString deviceLabel = strtoqstr(md->getName());
+ QString connectionName = strtoqstr(md->getConnection());
+
+ m_table->setText(deviceCount, NAME_COL, deviceName);
+ m_table->setText(deviceCount, LABEL_COL, deviceLabel);
+ m_table->setText(deviceCount, DIRECTION_COL,
+ (md->getDirection() == MidiDevice::Play ?
+ i18n("Play") : i18n("Record")));
+
+ QStringList &list(md->getDirection() == MidiDevice::Play ?
+ m_playConnections : m_recordConnections);
+ int currentConnectionIndex = list.size() - 1;
+ for (unsigned int i = 0; i < list.size(); ++i) {
+ if (list[i] == connectionName)
+ currentConnectionIndex = i;
+ }
+
+ QComboTableItem *item = new QComboTableItem(m_table, list, false);
+ item->setCurrentItem(currentConnectionIndex);
+ m_table->setItem(deviceCount, CONNECTION_COL, item);
+
+ m_table->adjustRow(deviceCount);
+ ++deviceCount;
+ }
+
+ int minColumnWidths[] = { 80, 120, 100, 250 };
+ for (int i = 0; i < 4; ++i) {
+ m_table->adjustColumn(i);
+ if (m_table->columnWidth(i) < minColumnWidths[i])
+ m_table->setColumnWidth(i, minColumnWidths[i]);
+ }
+}
+
+void
+DeviceEditorDialog::makeConnectionList(unsigned int direction,
+ QStringList &list)
+{
+ QByteArray data;
+ QByteArray replyData;
+ QCString replyType;
+ QDataStream arg(data, IO_WriteOnly);
+ arg << (int)Device::Midi;
+ arg << direction;
+
+ if (!rgapp->sequencerCall("getConnections(int, unsigned int)", replyType, replyData, data)) {
+ RG_DEBUG << "DeviceEditorDialog: can't call Sequencer" << endl;
+ list.append(i18n("No connection"));
+ return ;
+ }
+
+ QDataStream reply(replyData, IO_ReadOnly);
+ unsigned int connections = 0;
+ if (replyType == "unsigned int")
+ reply >> connections;
+
+ for (unsigned int i = 0; i < connections; ++i) {
+
+ QByteArray data;
+ QByteArray replyData;
+ QCString replyType;
+ QDataStream arg(data, IO_WriteOnly);
+ arg << (int)Device::Midi;
+ arg << direction;
+ arg << i;
+
+
+ if (!rgapp->sequencerCall("getConnection(int, unsigned int, unsigned int)",
+ replyType, replyData, data)) {
+ RG_DEBUG << "DeviceEditorDialog: can't call Sequencer" << endl;
+ list.append(i18n("No connection"));
+ return ;
+ }
+
+ QDataStream reply(replyData, IO_ReadOnly);
+ QString connection;
+ if (replyType == "QString") {
+ reply >> connection;
+ list.append(connection);
+ }
+ }
+
+ list.append(i18n("No connection"));
+}
+
+void
+DeviceEditorDialog::setModified(bool m)
+{
+ if (m_modified == m)
+ return ;
+ enableButtonOK(m);
+ enableButtonApply(m);
+ m_modified = m;
+}
+
+void
+DeviceEditorDialog::slotOk()
+{
+ slotApply();
+ accept();
+}
+
+void
+DeviceEditorDialog::slotClose()
+{
+ if (m_modified) {
+
+ int reply = KMessageBox::questionYesNo(this,
+ i18n("Apply pending changes?"));
+
+ if (reply == KMessageBox::Yes)
+ slotApply();
+ }
+
+ reject();
+}
+
+void
+DeviceEditorDialog::slotApply()
+{
+ KMacroCommand *command = new KMacroCommand("Edit Devices");
+
+ // first delete deleted devices, in reverse order of id (so that
+ // if we undo this command we'll get the original ids back... probably)
+
+ std::vector<DeviceId> ids;
+
+ for (DeviceListIterator i = m_devices.begin();
+ i != m_devices.end(); ++i) {
+ if (m_deletedDevices.find((*i)->getId()) != m_deletedDevices.end()) {
+ ids.push_back((*i)->getId());
+ }
+ }
+
+ std::sort(ids.begin(), ids.end());
+
+ for (int i = ids.size() - 1; i >= 0; --i) {
+ command->addCommand(new CreateOrDeleteDeviceCommand(m_studio, ids[i]));
+ }
+
+ // create the new devices, and rename and/or set connections for
+ // any others that have changed
+
+ for (int i = 0; i < m_table->numRows(); ++i) {
+ int deviceId = getDeviceIdAt(i);
+ if (deviceId < 0) { // new device
+ command->addCommand(new CreateOrDeleteDeviceCommand
+ (m_studio,
+ qstrtostr(m_table->text(i, LABEL_COL)),
+ Device::Midi,
+ m_table->text(i, DIRECTION_COL) == "Play" ?
+ MidiDevice::Play :
+ MidiDevice::Record,
+ qstrtostr(m_table->text(i, CONNECTION_COL))));
+ } else { // existing device
+ Device *device = m_studio->getDevice(deviceId);
+ if (!device) {
+ /*
+ std::cerr <<
+ "WARNING: DeviceEditorDialog::slotApply(): device at row "
+ << i << " (id " << deviceId
+ << ") claims not to be new, but isn't in the studio"
+ << std::endl;
+ */
+ } else {
+ std::string name = qstrtostr(m_table->text(i, LABEL_COL));
+ std::string conn = qstrtostr(m_table->text(i, CONNECTION_COL));
+ if (device->getName() != name) {
+ command->addCommand(new RenameDeviceCommand
+ (m_studio, deviceId, name));
+ }
+ if (device->getConnection() != conn) {
+ command->addCommand(new ReconnectDeviceCommand
+ (m_studio, deviceId, conn));
+ }
+ }
+ }
+ }
+
+ m_document->getCommandHistory()->addCommand(command);
+
+ m_deletedDevices.clear();
+
+ populate();
+ setModified(false);
+}
+
+int
+DeviceEditorDialog::getDeviceIdAt(int row) // -1 for new device w/o an id yet
+{
+ QString t(m_table->text(row, 0));
+
+ QRegExp re("^.*(\\d+).*$");
+ re.search(t);
+
+ QString number = re.cap(1);
+ int id = -1;
+
+ if (number && number != "")
+ {
+ id = number.toInt() - 1; // displayed device numbers are 1-based
+ }
+
+ return id;
+}
+
+void
+DeviceEditorDialog::slotAddPlayDevice()
+{
+ int n = m_table->numRows();
+ m_table->insertRows(n, 1);
+ m_table->setText(n, 0, i18n("<new device>"));
+ m_table->setText(n, 1, i18n("New Device"));
+ m_table->setText(n, 2, i18n("Play"));
+
+ QComboTableItem *item =
+ new QComboTableItem(m_table, m_playConnections, false);
+ item->setCurrentItem(m_playConnections.size() - 1);
+ m_table->setItem(n, 3, item);
+ m_table->adjustRow(n);
+
+ setModified(true);
+}
+
+void
+DeviceEditorDialog::slotAddRecordDevice()
+{
+ int n = m_table->numRows();
+ m_table->insertRows(n, 1);
+ m_table->setText(n, 0, i18n("<new device>"));
+ m_table->setText(n, 1, i18n("New Device"));
+ m_table->setText(n, 2, i18n("Record"));
+
+ QComboTableItem *item =
+ new QComboTableItem(m_table, m_recordConnections, false);
+ item->setCurrentItem(m_recordConnections.size() - 1);
+ m_table->setItem(n, 3, item);
+ m_table->adjustRow(n);
+
+ setModified(true);
+}
+
+void
+DeviceEditorDialog::slotDeleteDevice()
+{
+ int n = m_table->currentRow();
+ m_deletedDevices.insert(getDeviceIdAt(n));
+ m_table->removeRow(n);
+ setModified(true);
+}
+
+void
+DeviceEditorDialog::slotValueChanged(int, int)
+{
+ setModified(true);
+}
+
+}
+#include "DeviceEditorDialog.moc"
diff --git a/src/gui/studio/DeviceEditorDialog.h b/src/gui/studio/DeviceEditorDialog.h
new file mode 100644
index 0000000..2bde025
--- /dev/null
+++ b/src/gui/studio/DeviceEditorDialog.h
@@ -0,0 +1,87 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_DEVICEEDITORDIALOG_H_
+#define _RG_DEVICEEDITORDIALOG_H_
+
+#include <base/Studio.h>
+#include <kdialogbase.h>
+#include <qstringlist.h>
+#include <set>
+
+
+class QWidget;
+class QTable;
+
+
+namespace Rosegarden
+{
+
+class Studio;
+class RosegardenGUIDoc;
+
+
+class DeviceEditorDialog : public KDialogBase
+{
+ Q_OBJECT
+public:
+ DeviceEditorDialog(QWidget *parent, RosegardenGUIDoc *document);
+ ~DeviceEditorDialog();
+
+ void setModified(bool value);
+
+protected slots:
+ void slotOk();
+ void slotApply();
+ void slotClose();
+
+ void slotAddPlayDevice();
+ void slotAddRecordDevice();
+ void slotDeleteDevice();
+ void slotValueChanged(int row, int col);
+
+private:
+ RosegardenGUIDoc *m_document;
+ Studio *m_studio;
+
+ QStringList m_playConnections;
+ QStringList m_recordConnections;
+ void makeConnectionList(unsigned int direction, QStringList &list);
+
+ QTable *m_table;
+
+ DeviceList m_devices;
+ std::set<DeviceId> m_deletedDevices;
+
+ void populate();
+ int getDeviceIdAt(int row); // -1 for new device without an id yet
+
+ bool m_modified;
+};
+
+
+}
+
+#endif
diff --git a/src/gui/studio/DeviceManagerDialog.cpp b/src/gui/studio/DeviceManagerDialog.cpp
new file mode 100644
index 0000000..8f2fa6b
--- /dev/null
+++ b/src/gui/studio/DeviceManagerDialog.cpp
@@ -0,0 +1,833 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "DeviceManagerDialog.h"
+
+#include "ChangeRecordDeviceCommand.h"
+#include "misc/Debug.h"
+#include "misc/Strings.h"
+#include "base/Device.h"
+#include "base/Event.h"
+#include "base/Instrument.h"
+#include "base/MidiDevice.h"
+#include "base/MidiTypes.h"
+#include "base/Studio.h"
+#include "commands/studio/CreateOrDeleteDeviceCommand.h"
+#include "commands/studio/ModifyDeviceCommand.h"
+#include "commands/studio/ReconnectDeviceCommand.h"
+#include "commands/studio/RenameDeviceCommand.h"
+#include "document/MultiViewCommandHistory.h"
+#include "document/RosegardenGUIDoc.h"
+#include "document/ConfigGroups.h"
+#include "gui/application/RosegardenApplication.h"
+#include "gui/dialogs/ExportDeviceDialog.h"
+#include "gui/dialogs/ImportDeviceDialog.h"
+#include <kapplication.h>
+#include <klocale.h>
+#include <kstddirs.h>
+#include <kaction.h>
+#include <kfiledialog.h>
+#include <kglobal.h>
+#include <kmainwindow.h>
+#include <kmessagebox.h>
+#include <kstdaccel.h>
+#include <kstdaction.h>
+#include <qcstring.h>
+#include <qdatastream.h>
+#include <qdialog.h>
+#include <qdir.h>
+#include <qfileinfo.h>
+#include <qframe.h>
+#include <qgrid.h>
+#include <qgroupbox.h>
+#include <qlayout.h>
+#include <qpushbutton.h>
+#include <qsizepolicy.h>
+#include <qstring.h>
+#include <qstringlist.h>
+#include <qtable.h>
+#include <qtooltip.h>
+#include <qwidget.h>
+
+
+namespace Rosegarden
+{
+
+static const int PLAY_NAME_COL = 0;
+static const int PLAY_CONNECTION_COL = 1;
+
+static const int RECORD_NAME_COL = 0;
+static const int RECORD_CURRENT_COL = 1;
+static const int RECORD_CONNECTION_COL = 2;
+
+
+DeviceManagerDialog::DeviceManagerDialog(QWidget *parent,
+ RosegardenGUIDoc *document) :
+ KMainWindow(parent, "deviceeditordialog"),
+ m_document(document),
+ m_studio(&document->getStudio())
+ {
+ QFrame * mainBox = new QFrame(this);
+ setCentralWidget(mainBox);
+ QVBoxLayout *mainLayout = new QVBoxLayout(mainBox, 10, 10);
+
+ setCaption(i18n("Manage MIDI Devices"));
+
+ QGroupBox *groupBox = new QGroupBox(2, Horizontal, i18n("Play devices"), mainBox);
+
+ m_playTable = new QTable(0, 2, groupBox);
+ m_playTable->setSorting(false);
+ m_playTable->setRowMovingEnabled(false);
+ m_playTable->setColumnMovingEnabled(false);
+ m_playTable->setShowGrid(false);
+ m_playTable->horizontalHeader()->setLabel(PLAY_NAME_COL, i18n("Device"));
+ m_playTable->horizontalHeader()->setLabel(PLAY_CONNECTION_COL, i18n("Connection"));
+ m_playTable->horizontalHeader()->show();
+ m_playTable->verticalHeader()->hide();
+ m_playTable->setLeftMargin(0);
+ m_playTable->setSelectionMode(QTable::SingleRow);
+
+ QFrame *frame = new QFrame(groupBox);
+ QVBoxLayout *vlayout = new QVBoxLayout(frame);
+ QGrid *buttons = new QGrid(2, Horizontal, frame);
+ QPushButton *addButton = new QPushButton(i18n("New"), buttons);
+ m_deletePlayButton = new QPushButton(i18n("Delete"), buttons);
+ m_importButton = new QPushButton(i18n("Import..."), buttons);
+ m_exportButton = new QPushButton(i18n("Export..."), buttons);
+ m_banksButton = new QPushButton(i18n("Banks..."), buttons);
+ m_controllersButton = new QPushButton(i18n("Control Events..."), buttons);
+ vlayout->addWidget(buttons);
+ vlayout->addStretch(10);
+
+ QToolTip::add
+ (addButton,
+ i18n("Create a new Play device"));
+ QToolTip::add
+ (m_deletePlayButton,
+ i18n("Delete the selected device"));
+ QToolTip::add
+ (m_importButton,
+ i18n("Import Bank, Program and Controller data from a Rosegarden file to the selected device"));
+ QToolTip::add
+ (m_exportButton,
+ i18n("Export Bank and Controller data to a Rosegarden interchange file"));
+ QToolTip::add
+ (m_banksButton,
+ i18n("View and edit Banks and Programs for the selected device"));
+ QToolTip::add
+ (m_controllersButton,
+ i18n("View and edit Control Events for the selected device - these are special Event types that you can define against your device and control through Control Rulers or the Instrument Parameter Box "));
+
+ connect(addButton, SIGNAL(clicked()), this, SLOT(slotAddPlayDevice()));
+ connect(m_deletePlayButton, SIGNAL(clicked()), this, SLOT(slotDeletePlayDevice()));
+ connect(m_importButton, SIGNAL(clicked()), this, SLOT(slotImport()));
+ connect(m_exportButton, SIGNAL(clicked()), this, SLOT(slotExport()));
+ connect(m_banksButton, SIGNAL(clicked()), this, SLOT(slotSetBanks()));
+ connect(m_controllersButton, SIGNAL(clicked()), this, SLOT(slotSetControllers()));
+
+ connect(m_playTable, SIGNAL(valueChanged(int, int)),
+ this, SLOT(slotPlayValueChanged (int, int)));
+ connect(m_playTable, SIGNAL(currentChanged(int, int)),
+ this, SLOT(slotPlayDeviceSelected (int, int)));
+
+ mainLayout->addWidget(groupBox);
+ groupBox = new QGroupBox(2, Horizontal, i18n("Record devices"), mainBox);
+
+ m_recordTable = new QTable(0, 3, groupBox);
+ m_recordTable->setSorting(false);
+ m_recordTable->setRowMovingEnabled(false);
+ m_recordTable->setColumnMovingEnabled(false);
+ m_recordTable->setShowGrid(false);
+ m_recordTable->horizontalHeader()->setLabel(RECORD_NAME_COL, i18n("Device"));
+ m_recordTable->horizontalHeader()->setLabel(RECORD_CURRENT_COL, i18n("Current"));
+ m_recordTable->horizontalHeader()->setLabel(RECORD_CONNECTION_COL, i18n("Connection"));
+ m_recordTable->horizontalHeader()->show();
+ m_recordTable->verticalHeader()->hide();
+ m_recordTable->setLeftMargin(0);
+ m_recordTable->setSelectionMode(QTable::SingleRow);
+
+ frame = new QFrame(groupBox);
+ vlayout = new QVBoxLayout(frame);
+ buttons = new QGrid(2, Horizontal, frame);
+ addButton = new QPushButton(i18n("New"), buttons);
+ m_deleteRecordButton = new QPushButton(i18n("Delete"), buttons);
+ vlayout->addWidget(buttons);
+ vlayout->addStretch(10);
+
+ QToolTip::add
+ (addButton,
+ i18n("Create a new Record device"));
+ QToolTip::add
+ (m_deleteRecordButton,
+ i18n("Delete the selected device"));
+
+ connect(addButton, SIGNAL(clicked()), this, SLOT(slotAddRecordDevice()));
+ connect(m_deleteRecordButton, SIGNAL(clicked()), this, SLOT(slotDeleteRecordDevice()));
+
+ connect(m_recordTable, SIGNAL(currentChanged(int, int)),
+ this, SLOT(slotRecordDeviceSelected (int, int)));
+ connect(m_recordTable, SIGNAL(valueChanged(int, int)),
+ this, SLOT(slotRecordValueChanged (int, int)));
+
+ connect(document, SIGNAL(devicesResyncd()), this, SLOT(slotDevicesResyncd()));
+
+ m_noConnectionString = i18n("No connection");
+
+ slotDevicesResyncd();
+
+ setMinimumHeight(400);
+ setMinimumWidth(600);
+
+ mainLayout->addWidget(groupBox);
+
+ QFrame* btnBox = new QFrame(mainBox);
+
+ btnBox->setSizePolicy(
+ QSizePolicy(QSizePolicy::Minimum, QSizePolicy::Fixed));
+
+ QPushButton *closeButton = new QPushButton(i18n("Close"), btnBox);
+
+ QHBoxLayout* layout = new QHBoxLayout(btnBox, 0, 10);
+ layout->addStretch(10);
+ layout->addWidget(closeButton);
+ layout->addSpacing(5);
+
+ KAction* close = KStdAction::close(this,
+ SLOT(slotClose()),
+ actionCollection());
+
+ closeButton->setText(close->text());
+ connect(closeButton, SIGNAL(clicked()), this, SLOT(slotClose()));
+
+ mainLayout->addWidget(btnBox);
+
+ // some adjustments
+ new KToolBarPopupAction(i18n("Und&o"),
+ "undo",
+ KStdAccel::shortcut(KStdAccel::Undo),
+ actionCollection(),
+ KStdAction::stdName(KStdAction::Undo));
+
+ new KToolBarPopupAction(i18n("Re&do"),
+ "redo",
+ KStdAccel::shortcut(KStdAccel::Redo),
+ actionCollection(),
+ KStdAction::stdName(KStdAction::Redo));
+
+ createGUI("devicemanager.rc");
+
+ m_document->getCommandHistory()->attachView(actionCollection());
+ connect(m_document->getCommandHistory(), SIGNAL(commandExecuted()),
+ this, SLOT(populate()));
+
+ m_playTable->setCurrentCell( -1, 0);
+ m_recordTable->setCurrentCell( -1, 0);
+
+ setAutoSaveSettings(DeviceManagerConfigGroup, true);
+
+ // enableButtonOK(false);
+ // enableButtonApply(false);
+
+ }
+
+ DeviceManagerDialog::~DeviceManagerDialog()
+ {
+ if (m_document) {
+ m_document->getCommandHistory()->detachView(actionCollection());
+ m_document = 0;
+ }
+
+ RG_DEBUG << "\n*** DeviceManagerDialog::~DeviceManagerDialog\n" << endl;
+ }
+
+ void
+ DeviceManagerDialog::slotClose()
+ {
+ if (m_document) {
+ m_document->getCommandHistory()->detachView(actionCollection());
+ m_document = 0;
+ }
+
+ close();
+ }
+
+ void
+ DeviceManagerDialog::slotDevicesResyncd()
+ {
+ makeConnectionList((unsigned int)MidiDevice::Play,
+ m_playConnections);
+ makeConnectionList((unsigned int)MidiDevice::Record,
+ m_recordConnections);
+
+ populate();
+ }
+
+ void
+ DeviceManagerDialog::populate()
+ {
+ DeviceList *devices = m_studio->getDevices();
+
+ //KConfig *config = kapp->config();
+ //config->setGroup(SequencerOptionsConfigGroup);
+ //DeviceId recordDevice =
+ //config->readUnsignedNumEntry("midirecorddevice");
+
+ m_playDevices.clear();
+ m_recordDevices.clear();
+
+ for (DeviceList::iterator it = devices->begin();
+ it != devices->end(); ++it) {
+ if ((*it)->getType() == Device::Midi) {
+ MidiDevice *md =
+ dynamic_cast<MidiDevice *>(*it);
+ if (md) {
+ if (md->getDirection() == MidiDevice::Play) {
+ m_playDevices.push_back(md);
+ } else {
+ m_recordDevices.push_back(md);
+ }
+ }
+ }
+ }
+
+ while (m_playTable->numRows() > 0) {
+ m_playTable->removeRow(m_playTable->numRows() - 1);
+ }
+ while (m_recordTable->numRows() > 0) {
+ m_recordTable->removeRow(m_recordTable->numRows() - 1);
+ }
+
+ int deviceCount = 0;
+
+ for (MidiDeviceList::iterator it = m_playDevices.begin();
+ it != m_playDevices.end(); ++it) {
+
+ m_playTable->insertRows(deviceCount, 1);
+
+ QString deviceName = i18n("%1").arg(deviceCount + 1);
+ QString connectionName = strtoqstr((*it)->getConnection());
+
+ m_playTable->setText(deviceCount, PLAY_NAME_COL,
+ strtoqstr((*it)->getName()));
+
+ int currentConnectionIndex = m_playConnections.size() - 1;
+ for (unsigned int i = 0; i < m_playConnections.size(); ++i) {
+ if (m_playConnections[i] == connectionName)
+ currentConnectionIndex = i;
+ }
+
+ QComboTableItem *item = new QComboTableItem(m_playTable, m_playConnections, false);
+ item->setCurrentItem(currentConnectionIndex);
+ m_playTable->setItem(deviceCount, PLAY_CONNECTION_COL, item);
+
+ m_playTable->adjustRow(deviceCount);
+ ++deviceCount;
+ }
+
+ int minPlayColumnWidths[] = { 250, 270 };
+ for (int i = 0; i < 2; ++i) {
+ m_playTable->adjustColumn(i);
+ if (m_playTable->columnWidth(i) < minPlayColumnWidths[i])
+ m_playTable->setColumnWidth(i, minPlayColumnWidths[i]);
+ }
+
+ deviceCount = 0;
+
+ for (MidiDeviceList::iterator it = m_recordDevices.begin();
+ it != m_recordDevices.end(); ++it) {
+
+ m_recordTable->insertRows(deviceCount, 1);
+
+ QString deviceName = i18n("%1").arg(deviceCount + 1);
+ QString connectionName = strtoqstr((*it)->getConnection());
+
+ m_recordTable->setText(deviceCount, RECORD_NAME_COL,
+ strtoqstr((*it)->getName()));
+
+ int currentConnectionIndex = m_recordConnections.size() - 1;
+ for (unsigned int i = 0; i < m_recordConnections.size(); ++i) {
+ if (m_recordConnections[i] == connectionName)
+ currentConnectionIndex = i;
+ }
+
+ QComboTableItem *item = new QComboTableItem(m_recordTable, m_recordConnections, false);
+ item->setCurrentItem(currentConnectionIndex);
+ m_recordTable->setItem(deviceCount, RECORD_CONNECTION_COL, item);
+
+ QCheckTableItem *check = new QCheckTableItem(m_recordTable, QString());
+ //check->setChecked((*it)->getId() == recordDevice);
+ //check->setText(((*it)->getId() == recordDevice) ?
+ // i18n("Yes") : i18n("No"));
+ check->setChecked((*it)->isRecording());
+ check->setText((*it)->isRecording() ? i18n("Yes") : i18n("No"));
+ m_recordTable->setItem(deviceCount, RECORD_CURRENT_COL, check);
+
+ m_recordTable->adjustRow(deviceCount);
+ ++deviceCount;
+ }
+
+ int minRecordColumnWidths[] = { 180, 70, 270 };
+ for (int i = 0; i < 3; ++i) {
+ m_recordTable->adjustColumn(i);
+ if (m_recordTable->columnWidth(i) < minRecordColumnWidths[i])
+ m_recordTable->setColumnWidth(i, minRecordColumnWidths[i]);
+ }
+
+ slotPlayDeviceSelected(m_playTable->currentRow(), m_playTable->currentColumn());
+ slotRecordDeviceSelected(m_recordTable->currentRow(), m_recordTable->currentColumn());
+ }
+
+ void
+ DeviceManagerDialog::makeConnectionList(unsigned int direction,
+ QStringList &list)
+ {
+ list.clear();
+
+ QByteArray data;
+ QByteArray replyData;
+ QCString replyType;
+ QDataStream arg(data, IO_WriteOnly);
+ arg << (int)Device::Midi;
+ arg << direction;
+
+ if (!rgapp->sequencerCall("getConnections(int, unsigned int)", replyType, replyData, data)) {
+ RG_DEBUG << "DeviceManagerDialog: can't call Sequencer" << endl;
+ list.append(m_noConnectionString);
+ return ;
+ }
+
+ QDataStream reply(replyData, IO_ReadOnly);
+ unsigned int connections = 0;
+ if (replyType == "unsigned int")
+ reply >> connections;
+
+ for (unsigned int i = 0; i < connections; ++i) {
+
+ QByteArray data;
+ QByteArray replyData;
+ QCString replyType;
+ QDataStream arg(data, IO_WriteOnly);
+ arg << (int)Device::Midi;
+ arg << direction;
+ arg << i;
+
+
+ if (!rgapp->sequencerCall("getConnection(int, unsigned int, unsigned int)",
+ replyType, replyData, data)) {
+ RG_DEBUG << "DeviceManagerDialog: can't call Sequencer" << endl;
+ list.append(i18n("No connection"));
+ return ;
+ }
+
+ QDataStream reply(replyData, IO_ReadOnly);
+ QString connection;
+ if (replyType == "QString") {
+ reply >> connection;
+ list.append(connection);
+ }
+ }
+
+ list.append(i18n("No connection"));
+ }
+
+ void
+ DeviceManagerDialog::closeEvent(QCloseEvent *e)
+ {
+ emit closing();
+ KMainWindow::closeEvent(e);
+ }
+
+ DeviceId
+ DeviceManagerDialog::getPlayDeviceIdAt(int row)
+ {
+ if (row < 0 || row > (int)m_playDevices.size())
+ return Device::NO_DEVICE;
+ return m_playDevices[row]->getId();
+ }
+
+ DeviceId
+ DeviceManagerDialog::getRecordDeviceIdAt(int row)
+ {
+ if (row < 0 || row > (int)m_recordDevices.size())
+ return Device::NO_DEVICE;
+ return m_recordDevices[row]->getId();
+ }
+
+ void
+ DeviceManagerDialog::slotAddPlayDevice()
+ {
+ QString connection = "";
+ if (m_playConnections.size() > 0)
+ connection = m_playConnections[m_playConnections.size() - 1];
+ CreateOrDeleteDeviceCommand *command = new CreateOrDeleteDeviceCommand
+ (m_studio,
+ qstrtostr(i18n("New Device")),
+ Device::Midi,
+ MidiDevice::Play,
+ qstrtostr(connection));
+ m_document->getCommandHistory()->addCommand(command);
+ }
+
+ void
+ DeviceManagerDialog::slotAddRecordDevice()
+ {
+ QString connection = "";
+ if (m_recordConnections.size() > 0)
+ connection = m_recordConnections[m_recordConnections.size() - 1];
+ CreateOrDeleteDeviceCommand *command = new CreateOrDeleteDeviceCommand
+ (m_studio,
+ qstrtostr(i18n("New Device")),
+ Device::Midi,
+ MidiDevice::Record,
+ qstrtostr(connection));
+ m_document->getCommandHistory()->addCommand(command);
+ }
+
+ void
+ DeviceManagerDialog::slotDeletePlayDevice()
+ {
+ // should really grey out if nothing current
+ DeviceId id = getPlayDeviceIdAt(m_playTable->currentRow());
+ if (id == Device::NO_DEVICE)
+ return ;
+ CreateOrDeleteDeviceCommand *command = new CreateOrDeleteDeviceCommand
+ (m_studio, id);
+ m_document->getCommandHistory()->addCommand(command);
+
+ QByteArray data;
+ QDataStream arg(data, IO_WriteOnly);
+ arg << (unsigned int)id;
+ rgapp->sequencerSend("removeDevice(unsigned int)", data);
+ }
+
+ void
+ DeviceManagerDialog::slotDeleteRecordDevice()
+ {
+ DeviceId id = getRecordDeviceIdAt(m_recordTable->currentRow());
+ if (id == Device::NO_DEVICE)
+ return ;
+ CreateOrDeleteDeviceCommand *command = new CreateOrDeleteDeviceCommand
+ (m_studio, id);
+ m_document->getCommandHistory()->addCommand(command);
+ }
+
+ void
+ DeviceManagerDialog::slotPlayValueChanged(int row, int col)
+ {
+ if (!m_document)
+ return ; // closing
+ DeviceId id = getPlayDeviceIdAt(row);
+ if (id == Device::NO_DEVICE)
+ return ;
+
+ Device *device = m_studio->getDevice(id);
+ if (!device) {
+ std::cerr << "WARNING: DeviceManagerDialog::slotPlayValueChanged(): device at row "
+ << row << " (id " << id << ") not found in studio"
+ << std::endl;
+ return ;
+ }
+
+ switch (col) {
+
+ case PLAY_NAME_COL: {
+ std::string name = qstrtostr(m_playTable->text(row, col));
+ if (device->getName() != name) {
+
+ m_document->getCommandHistory()->addCommand
+ (new RenameDeviceCommand(m_studio, id, name));
+ emit deviceNamesChanged();
+
+ QByteArray data;
+ QDataStream arg(data, IO_WriteOnly);
+
+ arg << (unsigned int)id;
+ arg << m_playTable->text(row, col);
+
+ rgapp->sequencerSend("renameDevice(unsigned int, QString)", data);
+ }
+ }
+ break;
+
+ case PLAY_CONNECTION_COL: {
+ std::string connection = qstrtostr(m_playTable->text(row, col));
+ if (connection == qstrtostr(m_noConnectionString))
+ connection = "";
+ if (device->getConnection() != connection) {
+ m_document->getCommandHistory()->addCommand
+ (new ReconnectDeviceCommand(m_studio, id, connection));
+ }
+ }
+ break;
+ }
+ }
+
+ void
+ DeviceManagerDialog::slotRecordValueChanged(int row, int col)
+ {
+ if (!m_document)
+ return ; // closing
+ DeviceId id = getRecordDeviceIdAt(row);
+ if (id == Device::NO_DEVICE)
+ return ;
+
+ Device *device = m_studio->getDevice(id);
+ if (!device) {
+ std::cerr << "WARNING: DeviceManagerDialog::slotRecordValueChanged(): device at row "
+ << row << " (id " << id << ") not found in studio"
+ << std::endl;
+ return ;
+ }
+
+ switch (col) {
+
+ case RECORD_NAME_COL: {
+ std::string name = qstrtostr(m_recordTable->text(row, col));
+ if (device->getName() != name) {
+
+ m_document->getCommandHistory()->addCommand
+ (new RenameDeviceCommand(m_studio, id, name));
+ emit deviceNamesChanged();
+
+ QByteArray data;
+ QDataStream arg(data, IO_WriteOnly);
+
+ arg << (unsigned int)id;
+ arg << m_recordTable->text(row, col);
+
+ rgapp->sequencerSend("renameDevice(unsigned int, QString)", data);
+ }
+ }
+ break;
+
+ case RECORD_CONNECTION_COL: {
+ std::string connection = qstrtostr(m_recordTable->text(row, col));
+ if (device->getConnection() != connection) {
+ m_document->getCommandHistory()->addCommand
+ (new ReconnectDeviceCommand(m_studio, id, connection));
+ }
+ }
+ break;
+
+ case RECORD_CURRENT_COL: {
+ m_recordTable->blockSignals(true);
+
+ QCheckTableItem *check =
+ dynamic_cast<QCheckTableItem *>(m_recordTable->item(row, col));
+ if (!check)
+ return ;
+
+ bool actionConnect = check->isChecked();
+
+ // The following lines are not strictly needed, but give the checkboxes
+ // a smoother behavior while waiting a confirmation from the sequencer.
+ //
+ check->setText(actionConnect ? i18n("Yes") : i18n("No"));
+ MidiDevice *device =
+ dynamic_cast<MidiDevice*>(m_studio->getDevice(id));
+ device->setRecording(actionConnect);
+
+ m_recordTable->setCurrentCell(row, 0);
+
+ m_document->getCommandHistory()->addCommand
+ (new ChangeRecordDeviceCommand(id, actionConnect));
+
+ m_recordTable->blockSignals(false);
+ }
+ break;
+ }
+ }
+
+ void
+ DeviceManagerDialog::slotPlayDeviceSelected(int row, int col)
+ {
+ RG_DEBUG << "slotPlayDeviceSelected(" << row << "," << col << ")" << endl;
+
+ bool enable = (row >= 0 && row < (int)m_playDevices.size());
+ m_deletePlayButton->setEnabled(enable);
+ m_importButton->setEnabled(enable);
+ m_exportButton->setEnabled(enable);
+ m_banksButton->setEnabled(enable);
+ m_controllersButton->setEnabled(enable);
+ }
+
+ void
+ DeviceManagerDialog::slotRecordDeviceSelected(int row, int col)
+ {
+ RG_DEBUG << "slotRecordDeviceSelected(" << row << "," << col << ")" << endl;
+
+ bool enable = (row >= 0 && row < (int)m_recordDevices.size());
+ m_deleteRecordButton->setEnabled(enable);
+ }
+
+ void
+ DeviceManagerDialog::slotImport()
+ {
+ DeviceId id = getPlayDeviceIdAt(m_playTable->currentRow());
+ if (id == Device::NO_DEVICE)
+ return ;
+
+ QString deviceDir = KGlobal::dirs()->findResource("appdata", "library/");
+ QDir dir(deviceDir);
+ if (!dir.exists()) {
+ deviceDir = ":ROSEGARDENDEVICE";
+ } else {
+ deviceDir = "file://" + deviceDir;
+ }
+
+ KURL url = KFileDialog::getOpenURL
+ (deviceDir,
+ "audio/x-rosegarden-device audio/x-rosegarden audio/x-soundfont",
+ this, i18n("Import from Device in File"));
+
+ if (url.isEmpty())
+ return ;
+
+ ImportDeviceDialog *dialog = new ImportDeviceDialog(this, url);
+ if (dialog->doImport() && dialog->exec() == QDialog::Accepted) {
+
+ ModifyDeviceCommand *command = 0;
+
+ BankList banks(dialog->getBanks());
+ ProgramList programs(dialog->getPrograms());
+ ControlList controls(dialog->getControllers());
+ KeyMappingList keyMappings(dialog->getKeyMappings());
+ MidiDevice::VariationType variation(dialog->getVariationType());
+ std::string librarianName(dialog->getLibrarianName());
+ std::string librarianEmail(dialog->getLibrarianEmail());
+
+ // don't record the librarian when
+ // merging banks -- it's misleading.
+ // (also don't use variation type)
+ if (!dialog->shouldOverwriteBanks()) {
+ librarianName = "";
+ librarianEmail = "";
+ }
+
+ command = new ModifyDeviceCommand(m_studio,
+ id,
+ dialog->getDeviceName(),
+ librarianName,
+ librarianEmail);
+
+ if (dialog->shouldOverwriteBanks()) {
+ command->setVariation(variation);
+ }
+ if (dialog->shouldImportBanks()) {
+ command->setBankList(banks);
+ command->setProgramList(programs);
+ }
+ if (dialog->shouldImportControllers()) {
+ command->setControlList(controls);
+ }
+ if (dialog->shouldImportKeyMappings()) {
+ command->setKeyMappingList(keyMappings);
+ }
+
+ command->setOverwrite(dialog->shouldOverwriteBanks());
+ command->setRename(dialog->shouldRename());
+
+ m_document->getCommandHistory()->addCommand(command);
+
+ if (dialog->shouldRename())
+ emit deviceNamesChanged();
+ }
+
+ delete dialog;
+ }
+
+ void
+ DeviceManagerDialog::slotExport()
+ {
+ QString extension = "rgd";
+
+ QString name =
+ KFileDialog::getSaveFileName(":ROSEGARDEN",
+ (extension.isEmpty() ? QString("*") : ("*." + extension)),
+ this,
+ i18n("Export Device as..."));
+
+ // Check for the existence of the name
+ if (name.isEmpty())
+ return ;
+
+ // Append extension if we don't have one
+ //
+ if (!extension.isEmpty()) {
+ if (!name.endsWith("." + extension)) {
+ name += "." + extension;
+ }
+ }
+
+ QFileInfo info(name);
+
+ if (info.isDir()) {
+ KMessageBox::sorry(this, i18n("You have specified a directory"));
+ return ;
+ }
+
+ if (info.exists()) {
+ int overwrite = KMessageBox::questionYesNo
+ (this, i18n("The specified file exists. Overwrite?"));
+
+ if (overwrite != KMessageBox::Yes)
+ return ;
+
+ }
+
+ std::vector<DeviceId> devices;
+ DeviceId id = getPlayDeviceIdAt(m_playTable->currentRow());
+ MidiDevice *md = 0;
+ if (id != Device::NO_DEVICE) {
+ md = dynamic_cast<MidiDevice *>(m_studio->getDevice(id));
+ }
+ if (md) {
+ ExportDeviceDialog ed(this, strtoqstr(md->getName()));
+ if (ed.exec() != QDialog::Accepted)
+ return ;
+ if (ed.getExportType() == ExportDeviceDialog::ExportOne) {
+ devices.push_back(id);
+ }
+ }
+
+ m_document->exportStudio(name, devices);
+ }
+
+ void
+ DeviceManagerDialog::slotSetBanks()
+ {
+ DeviceId id = getPlayDeviceIdAt(m_playTable->currentRow());
+ emit editBanks(id);
+ }
+
+ void
+ DeviceManagerDialog::slotSetControllers()
+ {
+ DeviceId id = getPlayDeviceIdAt(m_playTable->currentRow());
+ emit editControllers(id);
+ }
+
+ }
+#include "DeviceManagerDialog.moc"
diff --git a/src/gui/studio/DeviceManagerDialog.h b/src/gui/studio/DeviceManagerDialog.h
new file mode 100644
index 0000000..aebc54e
--- /dev/null
+++ b/src/gui/studio/DeviceManagerDialog.h
@@ -0,0 +1,121 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_DEVICEMANAGERDIALOG_H_
+#define _RG_DEVICEMANAGERDIALOG_H_
+
+#include "base/Device.h"
+#include <kmainwindow.h>
+#include <qstring.h>
+#include <qstringlist.h>
+#include <vector>
+
+
+class QWidget;
+class QTable;
+class QPushButton;
+class QCloseEvent;
+
+
+namespace Rosegarden
+{
+
+class Studio;
+class RosegardenGUIDoc;
+class MidiDevice;
+
+
+class DeviceManagerDialog : public KMainWindow
+{
+ Q_OBJECT
+public:
+ DeviceManagerDialog(QWidget *parent, RosegardenGUIDoc *document);
+ ~DeviceManagerDialog();
+
+ void setModified(bool value);
+
+signals:
+ void deviceNamesChanged();
+
+ void editBanks(DeviceId);
+ void editControllers(DeviceId);
+
+ void closing();
+
+protected slots:
+ void slotClose();
+ void slotAddPlayDevice();
+ void slotAddRecordDevice();
+ void slotDeletePlayDevice();
+ void slotDeleteRecordDevice();
+ void slotPlayValueChanged(int row, int col);
+ void slotRecordValueChanged(int row, int col);
+ void slotPlayDeviceSelected(int row, int col);
+ void slotRecordDeviceSelected(int row, int col);
+
+ // for play devices only:
+ void slotImport();
+ void slotExport();
+ void slotSetBanks();
+ void slotSetControllers();
+
+ void slotDevicesResyncd();
+ void populate();
+
+protected:
+ virtual void closeEvent(QCloseEvent *);
+
+private:
+ RosegardenGUIDoc *m_document;
+ Studio *m_studio;
+
+ QPushButton *m_deletePlayButton;
+ QPushButton *m_deleteRecordButton;
+ QPushButton *m_importButton;
+ QPushButton *m_exportButton;
+ QPushButton *m_banksButton;
+ QPushButton *m_controllersButton;
+
+ QStringList m_playConnections;
+ QStringList m_recordConnections;
+ void makeConnectionList(unsigned int direction, QStringList &list);
+
+ QTable *m_playTable;
+ QTable *m_recordTable;
+
+ typedef std::vector<MidiDevice *> MidiDeviceList;
+ MidiDeviceList m_playDevices;
+ MidiDeviceList m_recordDevices;
+
+ DeviceId getPlayDeviceIdAt(int row); // NO_DEVICE = not found
+ DeviceId getRecordDeviceIdAt(int row); // NO_DEVICE = not found
+
+ QString m_noConnectionString;
+};
+
+
+}
+
+#endif
diff --git a/src/gui/studio/MidiBankListViewItem.cpp b/src/gui/studio/MidiBankListViewItem.cpp
new file mode 100644
index 0000000..2563ccb
--- /dev/null
+++ b/src/gui/studio/MidiBankListViewItem.cpp
@@ -0,0 +1,98 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "MidiBankListViewItem.h"
+
+#include <klocale.h>
+#include "base/Device.h"
+#include "MidiDeviceListViewItem.h"
+#include "MidiKeyMapListViewItem.h"
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+MidiBankListViewItem::MidiBankListViewItem(DeviceId deviceId,
+ int bankNb,
+ QListViewItem* parent,
+ QString name,
+ bool percussion, int msb, int lsb)
+ : MidiDeviceListViewItem(deviceId, parent, name, percussion, msb, lsb),
+ m_percussion(percussion),
+ m_bankNb(bankNb)
+{}
+
+void MidiBankListViewItem::setPercussion(bool percussion)
+{
+ m_percussion = percussion;
+ setText(1, QString(percussion ? i18n("Percussion Bank") : i18n("Bank")));
+}
+
+void MidiBankListViewItem::setMSB(int msb)
+{
+ setText(2, QString().setNum(msb));
+}
+
+void MidiBankListViewItem::setLSB(int lsb)
+{
+ setText(3, QString().setNum(lsb));
+}
+
+int MidiBankListViewItem::compare(QListViewItem *i, int col, bool ascending) const
+{
+ MidiBankListViewItem* bankItem = dynamic_cast<MidiBankListViewItem*>(i);
+
+ if (!bankItem) {
+ MidiKeyMapListViewItem *keyItem = dynamic_cast<MidiKeyMapListViewItem *>(i);
+ if (keyItem)
+ return -1; // banks before key maps
+ }
+
+ if (!bankItem || (col != 2 && col != 3)) {
+ return MidiDeviceListViewItem::compare(i, col, ascending);
+ }
+
+ int thisVal = text(col).toInt(),
+ otherVal = bankItem->text(col).toInt();
+
+ if (thisVal == otherVal) {
+ if (col == 2) { // if sorting on MSB, suborder with LSB
+ return compare(i, 3, ascending);
+ } else {
+ return 0;
+ }
+ }
+
+ // 'ascending' should be ignored according to Qt docs
+ //
+ return
+ thisVal > otherVal ? 1 :
+ thisVal == otherVal ? 0 :
+ -1;
+
+}
+
+}
diff --git a/src/gui/studio/MidiBankListViewItem.h b/src/gui/studio/MidiBankListViewItem.h
new file mode 100644
index 0000000..87f4b02
--- /dev/null
+++ b/src/gui/studio/MidiBankListViewItem.h
@@ -0,0 +1,70 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_MIDIBANKLISTVIEWITEM_H_
+#define _RG_MIDIBANKLISTVIEWITEM_H_
+
+#include "base/Device.h"
+#include "MidiDeviceListViewItem.h"
+#include <qstring.h>
+
+
+class QListViewItem;
+
+
+namespace Rosegarden
+{
+
+
+
+class MidiBankListViewItem : public MidiDeviceListViewItem
+{
+public:
+ MidiBankListViewItem(DeviceId deviceId,
+ int bankNb,
+ QListViewItem* parent, QString name,
+ bool percussion,
+ int msb, int lsb);
+
+ int getBank() { return m_bankNb; }
+
+ void setPercussion(bool percussion);
+ bool isPercussion() const { return m_percussion; }
+ void setMSB(int msb);
+ void setLSB(int msb);
+
+ virtual int compare(QListViewItem *i, int col, bool ascending) const;
+
+protected:
+
+ //--------------- Data members ---------------------------------
+ bool m_percussion;
+ int m_bankNb;
+};
+
+
+}
+
+#endif
diff --git a/src/gui/studio/MidiDeviceListViewItem.cpp b/src/gui/studio/MidiDeviceListViewItem.cpp
new file mode 100644
index 0000000..30a339e
--- /dev/null
+++ b/src/gui/studio/MidiDeviceListViewItem.cpp
@@ -0,0 +1,88 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "MidiDeviceListViewItem.h"
+
+#include <klocale.h>
+#include "base/Device.h"
+#include <qlistview.h>
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+MidiDeviceListViewItem::MidiDeviceListViewItem(DeviceId deviceId,
+ QListView* parent, QString name)
+ : KListViewItem(parent, name),
+ m_deviceId(deviceId)
+{}
+
+MidiDeviceListViewItem::MidiDeviceListViewItem(DeviceId deviceId,
+ QListViewItem* parent, QString name,
+ bool percussion,
+ int msb, int lsb)
+ : KListViewItem(parent, name,
+ QString(percussion ? i18n("Percussion Bank") : i18n("Bank")),
+ QString().setNum(msb), QString().setNum(lsb)),
+ m_deviceId(deviceId)
+{}
+
+MidiDeviceListViewItem::MidiDeviceListViewItem(DeviceId deviceId,
+ QListViewItem* parent, QString name)
+: KListViewItem(parent, name, i18n("Key Mapping"), "", ""),
+m_deviceId(deviceId)
+{}
+
+int MidiDeviceListViewItem::compare(QListViewItem *i, int col, bool ascending) const
+{
+ MidiDeviceListViewItem* item = dynamic_cast<MidiDeviceListViewItem*>(i);
+ if (!item)
+ return QListViewItem::compare(i, col, ascending);
+ if (col == 0)
+ return
+ getDeviceId() > item->getDeviceId() ? 1 :
+ getDeviceId() == item->getDeviceId() ? 0 :
+ -1;
+
+ int thisVal = text(col).toInt(),
+ otherVal = item->text(col).toInt();
+
+ if (thisVal == otherVal) {
+ if (col == 2) { // if sorting on MSB, suborder with LSB
+ return compare(i, 3, ascending);
+ } else {
+ return 0;
+ }
+ }
+
+ // 'ascending' should be ignored according to Qt docs
+ //
+ return (thisVal > otherVal) ? 1 : -1;
+
+ //!!! how to use percussion here?
+}
+
+}
diff --git a/src/gui/studio/MidiDeviceListViewItem.h b/src/gui/studio/MidiDeviceListViewItem.h
new file mode 100644
index 0000000..53652c6
--- /dev/null
+++ b/src/gui/studio/MidiDeviceListViewItem.h
@@ -0,0 +1,69 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_MIDIDEVICELISTVIEWITEM_H_
+#define _RG_MIDIDEVICELISTVIEWITEM_H_
+
+#include "base/Device.h"
+#include <klistview.h>
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+
+
+class MidiDeviceListViewItem : public KListViewItem
+{
+public:
+ // Device
+ MidiDeviceListViewItem(DeviceId id,
+ QListView* parent, QString name);
+
+ // Bank
+ MidiDeviceListViewItem(DeviceId id,
+ QListViewItem* parent, QString name,
+ bool percussion,
+ int msb, int lsb);
+
+ // Key Mapping
+ MidiDeviceListViewItem(DeviceId id,
+ QListViewItem* parent, QString name);
+
+ DeviceId getDeviceId() const { return m_deviceId; }
+
+ virtual int compare(QListViewItem *i, int col, bool ascending) const;
+
+protected:
+
+ //--------------- Data members ---------------------------------
+ DeviceId m_deviceId;
+};
+
+
+}
+
+#endif
diff --git a/src/gui/studio/MidiKeyMapListViewItem.cpp b/src/gui/studio/MidiKeyMapListViewItem.cpp
new file mode 100644
index 0000000..c070e04
--- /dev/null
+++ b/src/gui/studio/MidiKeyMapListViewItem.cpp
@@ -0,0 +1,56 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "MidiKeyMapListViewItem.h"
+
+#include "MidiDeviceListViewItem.h"
+#include "MidiBankListViewItem.h"
+#include "base/Device.h"
+#include <klocale.h>
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+MidiKeyMapListViewItem::MidiKeyMapListViewItem(DeviceId deviceId,
+ QListViewItem* parent,
+ QString name)
+ : MidiDeviceListViewItem(deviceId, parent, name),
+ m_name(name)
+{
+ setText(1, i18n("Key Mapping"));
+}
+
+int MidiKeyMapListViewItem::compare(QListViewItem *i, int col, bool ascending) const
+{
+ if (dynamic_cast<MidiBankListViewItem *>(i)) {
+ return 1; // banks before key maps
+ }
+
+ return MidiDeviceListViewItem::compare(i, col, ascending);
+}
+
+}
diff --git a/src/gui/studio/MidiKeyMapListViewItem.h b/src/gui/studio/MidiKeyMapListViewItem.h
new file mode 100644
index 0000000..df53de3
--- /dev/null
+++ b/src/gui/studio/MidiKeyMapListViewItem.h
@@ -0,0 +1,59 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_MIDIKEYMAPLISTVIEWITEM_H_
+#define _RG_MIDIKEYMAPLISTVIEWITEM_H_
+
+#include "base/Device.h"
+#include "MidiDeviceListViewItem.h"
+#include <qstring.h>
+
+
+class QListViewItem;
+
+
+namespace Rosegarden
+{
+
+
+
+class MidiKeyMapListViewItem : public MidiDeviceListViewItem
+{
+public:
+ MidiKeyMapListViewItem(DeviceId deviceId,
+ QListViewItem* parent, QString name);
+
+ virtual int compare(QListViewItem *i, int col, bool ascending) const;
+
+ QString getName() const { return m_name; }
+
+protected:
+ QString m_name;
+};
+
+
+}
+
+#endif
diff --git a/src/gui/studio/MidiKeyMappingEditor.cpp b/src/gui/studio/MidiKeyMappingEditor.cpp
new file mode 100644
index 0000000..f31d0dc
--- /dev/null
+++ b/src/gui/studio/MidiKeyMappingEditor.cpp
@@ -0,0 +1,197 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "MidiKeyMappingEditor.h"
+
+#include <klocale.h>
+#include "misc/Debug.h"
+#include "misc/Strings.h"
+#include "BankEditorDialog.h"
+#include "base/MidiDevice.h"
+#include "base/MidiProgram.h"
+#include "base/NotationTypes.h"
+#include "MidiKeyMapListViewItem.h"
+#include "NameSetEditor.h"
+#include <kcompletion.h>
+#include <klineedit.h>
+#include <qframe.h>
+#include <qlayout.h>
+#include <qlabel.h>
+#include <qobject.h>
+#include <qobjectlist.h>
+#include <qpushbutton.h>
+#include <qstring.h>
+#include <qvgroupbox.h>
+#include <qwidget.h>
+
+
+namespace Rosegarden
+{
+
+MidiKeyMappingEditor::MidiKeyMappingEditor(BankEditorDialog* bankEditor,
+ QWidget* parent,
+ const char* name)
+ : NameSetEditor(bankEditor,
+ i18n("Key Mapping details"),
+ parent, name, i18n("Pitches"), false),
+ m_device(0)
+{
+ QWidget *additionalWidget = makeAdditionalWidget(m_mainFrame);
+ if (additionalWidget) {
+ m_mainLayout->addMultiCellWidget(additionalWidget, 0, 2, 0, 2);
+ }
+}
+
+QWidget *
+MidiKeyMappingEditor::makeAdditionalWidget(QWidget *parent)
+{
+ return 0;
+}
+
+void
+MidiKeyMappingEditor::clearAll()
+{
+ blockAllSignals(true);
+
+ for (unsigned int i = 0; i < m_names.size(); ++i)
+ m_names[i]->clear();
+
+ setTitle(i18n("Key Mapping details"));
+
+ setEnabled(false);
+
+ blockAllSignals(false);
+}
+
+void
+MidiKeyMappingEditor::populate(QListViewItem* item)
+{
+ RG_DEBUG << "MidiKeyMappingEditor::populate\n";
+
+ MidiKeyMapListViewItem *keyItem =
+ dynamic_cast<MidiKeyMapListViewItem *>(item);
+ if (!keyItem) {
+ RG_DEBUG << "MidiKeyMappingEditor::populate : not a key item - returning\n";
+ return ;
+ }
+
+ MidiDevice* device = m_bankEditor->getCurrentMidiDevice();
+ if (!device)
+ return ;
+
+ m_device = device;
+ m_mappingName = qstrtostr(keyItem->getName());
+
+ setEnabled(true);
+
+ reset();
+}
+
+void
+MidiKeyMappingEditor::reset()
+{
+ if (!m_device)
+ return ;
+
+ setTitle(strtoqstr(m_mappingName));
+
+ const MidiKeyMapping *m = m_device->getKeyMappingByName(m_mappingName);
+
+ if (!m) {
+ RG_DEBUG << "WARNING: MidiKeyMappingEditor::reset: No such mapping as " << m_mappingName << endl;
+ }
+
+ m_mapping = *m;
+
+ blockAllSignals(true);
+
+ // Librarian details
+ //
+ m_librarian->setText(strtoqstr(m_device->getLibrarianName()));
+ m_librarianEmail->setText(strtoqstr(m_device->getLibrarianEmail()));
+
+ for (MidiKeyMapping::KeyNameMap::const_iterator it =
+ m_mapping.getMap().begin();
+ it != m_mapping.getMap().end(); ++it) {
+
+ int i = it->first;
+ if (i < 0 || i > 127) {
+ RG_DEBUG << "WARNING: MidiKeyMappingEditor::reset: Key " << i
+ << " out of range in mapping " << m_mapping.getName()
+ << endl;
+ continue;
+ }
+
+ QString name = strtoqstr(it->second);
+ m_completion.addItem(name);
+ m_names[i]->setText(name);
+ m_names[i]->setCursorPosition(0);
+ }
+
+ blockAllSignals(false);
+}
+
+void
+MidiKeyMappingEditor::slotNameChanged(const QString& name)
+{
+ const KLineEdit* lineEdit = dynamic_cast<const KLineEdit*>(sender());
+ if (!lineEdit) {
+ RG_DEBUG << "MidiKeyMappingEditor::slotNameChanged() : %%% ERROR - signal sender is not a KLineEdit\n";
+ return ;
+ }
+
+ QString senderName = sender()->name();
+
+ // Adjust value back to zero rated
+ //
+ unsigned int pitch = senderName.toUInt() - 1;
+
+ RG_DEBUG << "MidiKeyMappingEditor::slotNameChanged("
+ << name << ") : pitch = " << pitch << endl;
+
+ if (qstrtostr(name) != m_mapping.getMap()[pitch]) {
+ m_mapping.getMap()[pitch] = qstrtostr(name);
+ m_bankEditor->setModified(true);
+ }
+}
+
+void
+MidiKeyMappingEditor::slotEntryButtonPressed()
+{}
+
+void MidiKeyMappingEditor::blockAllSignals(bool block)
+{
+ const QObjectList* allChildren = queryList("KLineEdit", "[0-9]+");
+ QObjectListIt it(*allChildren);
+ QObject *obj;
+
+ while ( (obj = it.current()) != 0 ) {
+ obj->blockSignals(block);
+ ++it;
+ }
+}
+
+}
+#include "MidiKeyMappingEditor.moc"
diff --git a/src/gui/studio/MidiKeyMappingEditor.h b/src/gui/studio/MidiKeyMappingEditor.h
new file mode 100644
index 0000000..86959b8
--- /dev/null
+++ b/src/gui/studio/MidiKeyMappingEditor.h
@@ -0,0 +1,78 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_MIDIKEYMAPPINGEDITOR_H_
+#define _RG_MIDIKEYMAPPINGEDITOR_H_
+
+#include "base/MidiProgram.h"
+#include "NameSetEditor.h"
+#include <string>
+
+
+class QWidget;
+class QString;
+class QListViewItem;
+
+
+namespace Rosegarden
+{
+
+class MidiDevice;
+class BankEditorDialog;
+
+
+class MidiKeyMappingEditor : public NameSetEditor
+{
+ Q_OBJECT
+
+public:
+ MidiKeyMappingEditor(BankEditorDialog *bankEditor,
+ QWidget *parent,
+ const char *name = 0);
+
+ void clearAll();
+ void populate(QListViewItem *);
+ MidiKeyMapping &getMapping() { return m_mapping; }
+ void reset();
+
+public slots:
+ virtual void slotNameChanged(const QString &);
+ virtual void slotEntryButtonPressed();
+
+protected:
+ virtual QWidget *makeAdditionalWidget(QWidget *parent);
+ void blockAllSignals(bool block);
+
+ //--------------- Data members ---------------------------------
+
+ MidiDevice *m_device;
+ std::string m_mappingName;
+ MidiKeyMapping m_mapping;
+};
+
+
+}
+
+#endif
diff --git a/src/gui/studio/MidiMixerVUMeter.cpp b/src/gui/studio/MidiMixerVUMeter.cpp
new file mode 100644
index 0000000..2dd86cc
--- /dev/null
+++ b/src/gui/studio/MidiMixerVUMeter.cpp
@@ -0,0 +1,53 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "MidiMixerVUMeter.h"
+
+#include "gui/widgets/VUMeter.h"
+#include <qwidget.h>
+
+
+namespace Rosegarden
+{
+
+MidiMixerVUMeter::MidiMixerVUMeter(QWidget *parent,
+ VUMeterType type,
+ int width,
+ int height,
+ const char *name):
+ VUMeter(parent, type, false, false, width, height, VUMeter::Vertical, name)
+{
+ setAlignment(AlignCenter);
+}
+
+void
+MidiMixerVUMeter::meterStart()
+{}
+
+void
+MidiMixerVUMeter::meterStop()
+{}
+
+}
diff --git a/src/gui/studio/MidiMixerVUMeter.h b/src/gui/studio/MidiMixerVUMeter.h
new file mode 100644
index 0000000..f67d922
--- /dev/null
+++ b/src/gui/studio/MidiMixerVUMeter.h
@@ -0,0 +1,61 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_MIDIMIXERVUMETER_H_
+#define _RG_MIDIMIXERVUMETER_H_
+
+#include "gui/widgets/VUMeter.h"
+
+
+class QWidget;
+
+
+namespace Rosegarden
+{
+
+
+
+class MidiMixerVUMeter : public VUMeter
+{
+public:
+ MidiMixerVUMeter(QWidget *parent = 0,
+ VUMeterType type = Plain,
+ int width = 0,
+ int height = 0,
+ const char *name = 0);
+
+protected:
+ virtual void meterStart();
+ virtual void meterStop();
+
+private:
+ int m_textHeight;
+
+};
+
+
+}
+
+#endif
diff --git a/src/gui/studio/MidiMixerWindow.cpp b/src/gui/studio/MidiMixerWindow.cpp
new file mode 100644
index 0000000..127db7f
--- /dev/null
+++ b/src/gui/studio/MidiMixerWindow.cpp
@@ -0,0 +1,742 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "MidiMixerWindow.h"
+#include <qlayout.h>
+
+#include "sound/Midi.h"
+#include <klocale.h>
+#include "misc/Debug.h"
+#include "misc/Strings.h"
+#include "base/Colour.h"
+#include "base/Device.h"
+#include "base/Instrument.h"
+#include "base/MidiDevice.h"
+#include "base/MidiProgram.h"
+#include "base/Studio.h"
+#include "document/RosegardenGUIDoc.h"
+#include "gui/editors/notation/NotePixmapFactory.h"
+#include "gui/seqmanager/SequencerMapper.h"
+#include "gui/widgets/Fader.h"
+#include "gui/widgets/Rotary.h"
+#include "gui/widgets/VUMeter.h"
+#include "MidiMixerVUMeter.h"
+#include "MixerWindow.h"
+#include "sound/MappedEvent.h"
+#include "StudioControl.h"
+#include <kaction.h>
+#include <kmainwindow.h>
+#include <kstdaction.h>
+#include <qaccel.h>
+#include <qcolor.h>
+#include <qframe.h>
+#include <qiconset.h>
+#include <qlabel.h>
+#include <qobject.h>
+#include <qstring.h>
+#include <qtabwidget.h>
+#include <qwidget.h>
+
+
+namespace Rosegarden
+{
+
+MidiMixerWindow::MidiMixerWindow(QWidget *parent,
+ RosegardenGUIDoc *document):
+ MixerWindow(parent, document),
+ m_tabFrame(0)
+{
+ // Initial setup
+ //
+ setupTabs();
+
+ KStdAction::close(this,
+ SLOT(slotClose()),
+ actionCollection());
+
+ QIconSet icon = QIconSet(NotePixmapFactory::toQPixmap(NotePixmapFactory::makeToolbarPixmap
+ ("transport-play")));
+ KAction *play = new KAction(i18n("&Play"), icon, Key_Enter, this,
+ SIGNAL(play()), actionCollection(), "play");
+ // Alternative shortcut for Play
+ KShortcut playShortcut = play->shortcut();
+ playShortcut.append( KKey(Key_Return + CTRL) );
+ play->setShortcut(playShortcut);
+
+ icon = QIconSet(NotePixmapFactory::toQPixmap(NotePixmapFactory::makeToolbarPixmap
+ ("transport-stop")));
+ new KAction(i18n("&Stop"), icon, Key_Insert, this,
+ SIGNAL(stop()), actionCollection(), "stop");
+
+ icon = QIconSet(NotePixmapFactory::toQPixmap(NotePixmapFactory::makeToolbarPixmap
+ ("transport-rewind")));
+ new KAction(i18n("Re&wind"), icon, Key_End, this,
+ SIGNAL(rewindPlayback()), actionCollection(),
+ "playback_pointer_back_bar");
+
+ icon = QIconSet(NotePixmapFactory::toQPixmap(NotePixmapFactory::makeToolbarPixmap
+ ("transport-ffwd")));
+ new KAction(i18n("&Fast Forward"), icon, Key_PageDown, this,
+ SIGNAL(fastForwardPlayback()), actionCollection(),
+ "playback_pointer_forward_bar");
+
+ icon = QIconSet(NotePixmapFactory::toQPixmap(NotePixmapFactory::makeToolbarPixmap
+ ("transport-rewind-end")));
+ new KAction(i18n("Rewind to &Beginning"), icon, 0, this,
+ SIGNAL(rewindPlaybackToBeginning()), actionCollection(),
+ "playback_pointer_start");
+
+ icon = QIconSet(NotePixmapFactory::toQPixmap(NotePixmapFactory::makeToolbarPixmap
+ ("transport-ffwd-end")));
+ new KAction(i18n("Fast Forward to &End"), icon, 0, this,
+ SIGNAL(fastForwardPlaybackToEnd()), actionCollection(),
+ "playback_pointer_end");
+
+ icon = QIconSet(NotePixmapFactory::toQPixmap(NotePixmapFactory::makeToolbarPixmap
+ ("transport-record")));
+ new KAction(i18n("&Record"), icon, 0, this,
+ SIGNAL(record()), actionCollection(),
+ "record");
+
+ icon = QIconSet(NotePixmapFactory::toQPixmap(NotePixmapFactory::makeToolbarPixmap
+ ("transport-panic")));
+ new KAction(i18n("Panic"), icon, Key_P + CTRL + ALT, this,
+ SIGNAL(panic()), actionCollection(),
+ "panic");
+
+ createGUI("midimixer.rc");
+
+}
+
+void
+MidiMixerWindow::setupTabs()
+{
+ DeviceListConstIterator it;
+ MidiDevice *dev = 0;
+ InstrumentList instruments;
+ InstrumentList::const_iterator iIt;
+ int faderCount = 0, deviceCount = 1;
+
+ if (m_tabFrame)
+ delete m_tabFrame;
+
+ // Setup m_tabFrame
+ //
+ m_tabWidget = new QTabWidget(this);
+ setCentralWidget(m_tabWidget);
+ connect(m_tabWidget, SIGNAL(currentChanged(QWidget *)),
+ this, SLOT(slotCurrentTabChanged(QWidget *)));
+ m_tabWidget->setTabPosition(QTabWidget::Bottom);
+ setCaption(i18n("MIDI Mixer"));
+
+ for (it = m_studio->begin(); it != m_studio->end(); ++it) {
+ dev = dynamic_cast<MidiDevice*>(*it);
+
+ if (dev) {
+ // Get the control parameters that are on the IPB (and hence can
+ // be shown here too).
+ //
+ ControlList controls = dev->getIPBControlParameters();
+
+ instruments = dev->getPresentationInstruments();
+
+ // Don't add a frame for empty devices
+ //
+ if (!instruments.size())
+ continue;
+
+ m_tabFrame = new QFrame(m_tabWidget);
+ m_tabFrame->setFrameStyle(QFrame::TabWidgetPanel);
+ m_tabFrame->setMargin(10);
+
+ QGridLayout *mainLayout = new QGridLayout
+ (m_tabFrame, instruments.size() + 4, controls.size() + 4, 5);
+
+ // MIDI Mixer label
+ //
+ //QLabel *label = new QLabel(QString("%1 %2").
+ //arg(strtoqstr(dev->getName()))
+ //.arg(i18n("MIDI Mixer")), m_tabFrame);
+
+ QLabel *label = new QLabel("", m_tabFrame);
+ mainLayout->addMultiCellWidget(label, 0, 0, 0, 16, Qt::AlignCenter);
+
+ // control labels
+ for (unsigned int i = 0; i < controls.size(); ++i) {
+ label = new QLabel(strtoqstr(controls[i].getName()), m_tabFrame);
+ mainLayout->addWidget(label, i + 1, 0, Qt::AlignCenter);
+ }
+
+ // meter label
+ //
+ //label = new QLabel(i18n("Meter"), m_tabFrame);
+ //mainLayout->addWidget(label,
+ //controls.size() + 1, 0, Qt::AlignCenter);
+
+ // volume label
+ label = new QLabel(i18n("Volume"), m_tabFrame);
+ mainLayout->addWidget(label, controls.size() + 2, 0,
+ Qt::AlignCenter);
+
+ // instrument label
+ label = new QLabel(i18n("Instrument"), m_tabFrame);
+ mainLayout->addWidget(label, controls.size() + 3, 0,
+ Qt::AlignCenter);
+
+ int posCount = 1;
+ int firstInstrument = -1;
+
+ for (iIt = instruments.begin(); iIt != instruments.end(); ++iIt) {
+
+ // Add new fader struct
+ //
+ m_faders.push_back(new FaderStruct());
+
+ // Store the first ID
+ //
+ if (firstInstrument == -1)
+ firstInstrument = (*iIt)->getId();
+
+
+ // Add the controls
+ //
+ for (unsigned int i = 0; i < controls.size(); ++i) {
+ QColor knobColour = Qt::white;
+
+ if (controls[i].getColourIndex() > 0) {
+ Colour c =
+ m_document->getComposition().getGeneralColourMap().
+ getColourByIndex(controls[i].getColourIndex());
+
+ knobColour = QColor(c.getRed(),
+ c.getGreen(), c.getBlue());
+ }
+
+ Rotary *controller =
+ new Rotary(m_tabFrame,
+ controls[i].getMin(),
+ controls[i].getMax(),
+ 1.0,
+ 5.0,
+ controls[i].getDefault(),
+ 20,
+ Rotary::NoTicks,
+ false,
+ controls[i].getDefault() == 64); //!!! hacky
+
+ controller->setKnobColour(knobColour);
+
+ connect(controller, SIGNAL(valueChanged(float)),
+ this, SLOT(slotControllerChanged(float)));
+
+ mainLayout->addWidget(controller, i + 1, posCount,
+ Qt::AlignCenter);
+
+ // Store the rotary
+ //
+ m_faders[faderCount]->m_controllerRotaries.push_back(
+ std::pair<MidiByte, Rotary*>
+ (controls[i].getControllerValue(), controller));
+ }
+
+ // Pan rotary
+ //
+ MidiMixerVUMeter *meter =
+ new MidiMixerVUMeter(m_tabFrame,
+ VUMeter::FixedHeightVisiblePeakHold, 6, 30);
+ mainLayout->addWidget(meter, controls.size() + 1,
+ posCount, Qt::AlignCenter);
+ m_faders[faderCount]->m_vuMeter = meter;
+
+ // Volume fader
+ //
+ Fader *fader =
+ new Fader(0, 127, 100, 20, 80, m_tabFrame);
+ mainLayout->addWidget(fader, controls.size() + 2,
+ posCount, Qt::AlignCenter);
+ m_faders[faderCount]->m_volumeFader = fader;
+ //fader->setFader(float((*iIt)->getVolume()));
+
+ // Label
+ //
+ QLabel *idLabel = new QLabel(QString("%1").
+ arg((*iIt)->getId() - firstInstrument + 1),
+ m_tabFrame, "idLabel");
+
+ mainLayout->addWidget(idLabel, controls.size() + 3,
+ posCount, Qt::AlignCenter);
+
+ // store id in struct
+ m_faders[faderCount]->m_id = (*iIt)->getId();
+
+ // Connect them up
+ //
+ connect(fader, SIGNAL(faderChanged(float)),
+ this, SLOT(slotFaderLevelChanged(float)));
+
+ // Update all the faders and controllers
+ //
+ slotUpdateInstrument((*iIt)->getId());
+
+ // Increment counters
+ //
+ posCount++;
+ faderCount++;
+ }
+
+ QString name = QString("%1 (%2)").arg(strtoqstr(dev->getName()))
+ .arg(deviceCount++);
+
+ addTab(m_tabFrame, name);
+ }
+ }
+}
+
+void
+MidiMixerWindow::addTab(QWidget *tab, const QString &title)
+{
+ m_tabWidget->addTab(tab, title);
+}
+
+void
+MidiMixerWindow::slotFaderLevelChanged(float value)
+{
+ const QObject *s = sender();
+
+ for (FaderVector::const_iterator it = m_faders.begin();
+ it != m_faders.end(); ++it) {
+ if ((*it)->m_volumeFader == s) {
+ Instrument *instr = m_studio->
+ getInstrumentById((*it)->m_id);
+
+ if (instr) {
+
+ instr->setVolume(MidiByte(value));
+
+ MappedEvent mE((*it)->m_id,
+ MappedEvent::MidiController,
+ MIDI_CONTROLLER_VOLUME,
+ MidiByte(value));
+ StudioControl::sendMappedEvent(mE);
+
+ // send out to external controllers as well.
+ //!!! really want some notification of whether we have any!
+ int tabIndex = m_tabWidget->currentPageIndex();
+ if (tabIndex < 0)
+ tabIndex = 0;
+ int i = 0;
+ for (DeviceList::const_iterator dit = m_studio->begin();
+ dit != m_studio->end(); ++dit) {
+ RG_DEBUG << "slotFaderLevelChanged: i = " << i << ", tabIndex " << tabIndex << endl;
+ if (!dynamic_cast<MidiDevice*>(*dit))
+ continue;
+ if (i != tabIndex) {
+ ++i;
+ continue;
+ }
+ RG_DEBUG << "slotFaderLevelChanged: device id = " << instr->getDevice()->getId() << ", visible device id " << (*dit)->getId() << endl;
+ if (instr->getDevice()->getId() == (*dit)->getId()) {
+ RG_DEBUG << "slotFaderLevelChanged: sending control device mapped event for channel " << instr->getMidiChannel() << endl;
+ mE.setRecordedChannel(instr->getMidiChannel());
+ mE.setRecordedDevice(Device::CONTROL_DEVICE);
+ StudioControl::sendMappedEvent(mE);
+ }
+ break;
+ }
+ }
+
+ emit instrumentParametersChanged((*it)->m_id);
+ return ;
+ }
+ }
+}
+
+void
+MidiMixerWindow::slotControllerChanged(float value)
+{
+ const QObject *s = sender();
+ unsigned int i = 0, j = 0;
+
+ for (i = 0; i < m_faders.size(); ++i) {
+ for (j = 0; j < m_faders[i]->m_controllerRotaries.size(); ++j) {
+ if (m_faders[i]->m_controllerRotaries[j].second == s)
+ break;
+ }
+
+ // break out on match
+ if (j != m_faders[i]->m_controllerRotaries.size())
+ break;
+ }
+
+ // Don't do anything if we've not matched and got solid values
+ // for i and j
+ //
+ if (i == m_faders.size() || j == m_faders[i]->m_controllerRotaries.size())
+ return ;
+
+ //RG_DEBUG << "MidiMixerWindow::slotControllerChanged - found a controller"
+ //<< endl;
+
+ Instrument *instr = m_studio->getInstrumentById(
+ m_faders[i]->m_id);
+
+ if (instr) {
+
+ //RG_DEBUG << "MidiMixerWindow::slotControllerChanged - "
+ //<< "got instrument to change" << endl;
+
+ if (m_faders[i]->m_controllerRotaries[j].first ==
+ MIDI_CONTROLLER_PAN)
+ instr->setPan(MidiByte(value));
+ else {
+ instr->setControllerValue(m_faders[i]->
+ m_controllerRotaries[j].first,
+ MidiByte(value));
+ }
+
+ MappedEvent mE(m_faders[i]->m_id,
+ MappedEvent::MidiController,
+ m_faders[i]->m_controllerRotaries[j].first,
+ MidiByte(value));
+ StudioControl::sendMappedEvent(mE);
+
+ int tabIndex = m_tabWidget->currentPageIndex();
+ if (tabIndex < 0)
+ tabIndex = 0;
+ int i = 0;
+ for (DeviceList::const_iterator dit = m_studio->begin();
+ dit != m_studio->end(); ++dit) {
+ RG_DEBUG << "slotControllerChanged: i = " << i << ", tabIndex " << tabIndex << endl;
+ if (!dynamic_cast<MidiDevice*>(*dit))
+ continue;
+ if (i != tabIndex) {
+ ++i;
+ continue;
+ }
+ RG_DEBUG << "slotControllerChanged: device id = " << instr->getDevice()->getId() << ", visible device id " << (*dit)->getId() << endl;
+ if (instr->getDevice()->getId() == (*dit)->getId()) {
+ RG_DEBUG << "slotControllerChanged: sending control device mapped event for channel " << instr->getMidiChannel() << endl;
+ // send out to external controllers as well.
+ //!!! really want some notification of whether we have any!
+ mE.setRecordedChannel(instr->getMidiChannel());
+ mE.setRecordedDevice(Device::CONTROL_DEVICE);
+ StudioControl::sendMappedEvent(mE);
+ }
+ }
+
+ emit instrumentParametersChanged(m_faders[i]->m_id);
+ }
+}
+
+void
+MidiMixerWindow::slotUpdateInstrument(InstrumentId id)
+{
+ //RG_DEBUG << "MidiMixerWindow::slotUpdateInstrument - id = " << id << endl;
+
+ DeviceListConstIterator it;
+ MidiDevice *dev = 0;
+ InstrumentList instruments;
+ InstrumentList::const_iterator iIt;
+ int count = 0;
+
+ blockSignals(true);
+
+ for (it = m_studio->begin(); it != m_studio->end(); ++it) {
+ dev = dynamic_cast<MidiDevice*>(*it);
+
+ if (dev) {
+ instruments = dev->getPresentationInstruments();
+ ControlList controls = dev->getIPBControlParameters();
+
+ for (iIt = instruments.begin(); iIt != instruments.end(); ++iIt) {
+ // Match and set
+ //
+ if ((*iIt)->getId() == id) {
+ // Set Volume fader
+ //
+ m_faders[count]->m_volumeFader->blockSignals(true);
+ m_faders[count]->m_volumeFader->
+ setFader(float((*iIt)->getVolume()));
+ m_faders[count]->m_volumeFader->blockSignals(false);
+
+ /*
+ StaticControllers &staticControls =
+ (*iIt)->getStaticControllers();
+ RG_DEBUG << "STATIC CONTROLS SIZE = "
+ << staticControls.size() << endl;
+ */
+
+ // Set all controllers for this Instrument
+ //
+ for (unsigned int i = 0; i < controls.size(); ++i) {
+ float value = 0.0;
+
+ m_faders[count]->m_controllerRotaries[i].second->blockSignals(true);
+
+ if (controls[i].getControllerValue() ==
+ MIDI_CONTROLLER_PAN) {
+ m_faders[count]->m_controllerRotaries[i].
+ second->setPosition((*iIt)->getPan());
+ } else {
+ // The ControllerValues might not yet be set on
+ // the actual Instrument so don't always expect
+ // to find one. There might be a hole here for
+ // deleted Controllers to hang around on
+ // Instruments..
+ //
+ try {
+ value = float((*iIt)->getControllerValue
+ (controls[i].getControllerValue()));
+ } catch (std::string s) {
+ /*
+ RG_DEBUG <<
+ "MidiMixerWindow::slotUpdateInstrument - "
+ << "can't match controller "
+ << int(controls[i].
+ getControllerValue()) << " - \""
+ << s << "\"" << endl;
+ */
+ continue;
+ }
+
+ /*
+ RG_DEBUG << "MidiMixerWindow::slotUpdateInstrument"
+ << " - MATCHED "
+ << int(controls[i].getControllerValue())
+ << endl;
+ */
+
+ m_faders[count]->m_controllerRotaries[i].
+ second->setPosition(value);
+ }
+
+ m_faders[count]->m_controllerRotaries[i].second->blockSignals(false);
+ }
+ }
+ count++;
+ }
+ }
+ }
+
+ blockSignals(false);
+}
+
+void
+MidiMixerWindow::updateMeters(SequencerMapper *mapper)
+{
+ for (unsigned int i = 0; i != m_faders.size(); ++i) {
+ LevelInfo info;
+ if (!mapper->
+ getInstrumentLevelForMixer(m_faders[i]->m_id, info))
+ continue;
+ m_faders[i]->m_vuMeter->setLevel(double(info.level / 127.0));
+ RG_DEBUG << "MidiMixerWindow::updateMeters - level " << info.level << endl;
+ }
+}
+
+void
+MidiMixerWindow::updateMonitorMeter(SequencerMapper *)
+{
+ // none here
+}
+
+void
+MidiMixerWindow::slotControllerDeviceEventReceived(MappedEvent *e,
+ const void *preferredCustomer)
+{
+ if (preferredCustomer != this)
+ return ;
+ RG_DEBUG << "MidiMixerWindow::slotControllerDeviceEventReceived: this one's for me" << endl;
+ raise();
+
+ // get channel number n from event
+ // get nth instrument on current tab
+
+ if (e->getType() != MappedEvent::MidiController)
+ return ;
+ unsigned int channel = e->getRecordedChannel();
+ MidiByte controller = e->getData1();
+ MidiByte value = e->getData2();
+
+ int tabIndex = m_tabWidget->currentPageIndex();
+
+ int i = 0;
+
+ for (DeviceList::const_iterator it = m_studio->begin();
+ it != m_studio->end(); ++it) {
+
+ MidiDevice *dev =
+ dynamic_cast<MidiDevice*>(*it);
+
+ if (!dev)
+ continue;
+ if (i != tabIndex) {
+ ++i;
+ continue;
+ }
+
+ InstrumentList instruments = dev->getPresentationInstruments();
+
+ for (InstrumentList::const_iterator iIt =
+ instruments.begin(); iIt != instruments.end(); ++iIt) {
+
+ Instrument *instrument = *iIt;
+
+ if (instrument->getMidiChannel() != channel)
+ continue;
+
+ switch (controller) {
+
+ case MIDI_CONTROLLER_VOLUME:
+ RG_DEBUG << "Setting volume for instrument " << instrument->getId() << " to " << value << endl;
+ instrument->setVolume(value);
+ break;
+
+ case MIDI_CONTROLLER_PAN:
+ RG_DEBUG << "Setting pan for instrument " << instrument->getId() << " to " << value << endl;
+ instrument->setPan(value);
+ break;
+
+ default: {
+ ControlList cl = dev->getIPBControlParameters();
+ for (ControlList::const_iterator i = cl.begin();
+ i != cl.end(); ++i) {
+ if ((*i).getControllerValue() == controller) {
+ RG_DEBUG << "Setting controller " << controller << " for instrument " << instrument->getId() << " to " << value << endl;
+ instrument->setControllerValue(controller, value);
+ break;
+ }
+ }
+ break;
+ }
+ }
+
+ MappedEvent mE(instrument->getId(),
+ MappedEvent::MidiController,
+ MidiByte(controller),
+ MidiByte(value));
+ StudioControl::sendMappedEvent(mE);
+
+ slotUpdateInstrument(instrument->getId());
+ emit instrumentParametersChanged(instrument->getId());
+ }
+
+ break;
+ }
+}
+
+void
+MidiMixerWindow::slotCurrentTabChanged(QWidget *)
+{
+ sendControllerRefresh();
+}
+
+void
+MidiMixerWindow::sendControllerRefresh()
+{
+ //!!! need to know if we have a current external controller device,
+ // as this is expensive
+
+ int tabIndex = m_tabWidget->currentPageIndex();
+ RG_DEBUG << "MidiMixerWindow::slotCurrentTabChanged: current is " << tabIndex << endl;
+
+ if (tabIndex < 0)
+ return ;
+
+ int i = 0;
+
+ for (DeviceList::const_iterator dit = m_studio->begin();
+ dit != m_studio->end(); ++dit) {
+
+ MidiDevice *dev = dynamic_cast<MidiDevice*>(*dit);
+ RG_DEBUG << "device is " << (*dit)->getId() << ", dev " << dev << endl;
+
+ if (!dev)
+ continue;
+ if (i != tabIndex) {
+ ++i;
+ continue;
+ }
+
+ InstrumentList instruments = dev->getPresentationInstruments();
+ ControlList controls = dev->getIPBControlParameters();
+
+ RG_DEBUG << "device has " << instruments.size() << " presentation instruments, " << dev->getAllInstruments().size() << " instruments " << endl;
+
+ for (InstrumentList::const_iterator iIt =
+ instruments.begin(); iIt != instruments.end(); ++iIt) {
+
+ Instrument *instrument = *iIt;
+ int channel = instrument->getMidiChannel();
+
+ RG_DEBUG << "instrument is " << instrument->getId() << endl;
+
+ for (ControlList::const_iterator cIt =
+ controls.begin(); cIt != controls.end(); ++cIt) {
+
+ int controller = (*cIt).getControllerValue();
+ int value;
+ if (controller == MIDI_CONTROLLER_PAN) {
+ value = instrument->getPan();
+ } else {
+ try {
+ value = instrument->getControllerValue(controller);
+ } catch (std::string s) {
+ std::cerr << "Exception in MidiMixerWindow::currentChanged: " << s << " (controller " << controller << ", instrument " << instrument->getId() << ")" << std::endl;
+ value = 0;
+ }
+ }
+
+ MappedEvent mE(instrument->getId(),
+ MappedEvent::MidiController,
+ controller, value);
+ mE.setRecordedChannel(channel);
+ mE.setRecordedDevice(Device::CONTROL_DEVICE);
+ StudioControl::sendMappedEvent(mE);
+ }
+
+ MappedEvent mE(instrument->getId(),
+ MappedEvent::MidiController,
+ MIDI_CONTROLLER_VOLUME,
+ instrument->getVolume());
+ mE.setRecordedChannel(channel);
+ mE.setRecordedDevice(Device::CONTROL_DEVICE);
+ RG_DEBUG << "sending controller mapped event for channel " << channel << ", volume " << instrument->getVolume() << endl;
+ StudioControl::sendMappedEvent(mE);
+ }
+
+ break;
+ }
+}
+
+void
+MidiMixerWindow::slotSynchronise()
+{
+ RG_DEBUG << "MidiMixer::slotSynchronise" << endl;
+ //setupTabs();
+}
+
+}
+#include "MidiMixerWindow.moc"
diff --git a/src/gui/studio/MidiMixerWindow.h b/src/gui/studio/MidiMixerWindow.h
new file mode 100644
index 0000000..d90dc55
--- /dev/null
+++ b/src/gui/studio/MidiMixerWindow.h
@@ -0,0 +1,125 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_MIDIMIXERWINDOW_H_
+#define _RG_MIDIMIXERWINDOW_H_
+
+#include "base/MidiProgram.h"
+#include "MixerWindow.h"
+#include <vector>
+
+
+class QWidget;
+class QTabWidget;
+class QString;
+class QFrame;
+
+
+namespace Rosegarden
+{
+
+class SequencerMapper;
+class Rotary;
+class RosegardenGUIDoc;
+class MidiMixerVUMeter;
+class MappedEvent;
+class Fader;
+
+
+class MidiMixerWindow : public MixerWindow
+{
+ Q_OBJECT
+
+public:
+ MidiMixerWindow(QWidget *parent, RosegardenGUIDoc *document);
+
+ /**
+ * Setup the tabs on the Mixer according to the Studio
+ */
+ void setupTabs();
+
+ /*
+ * Update the VU meters
+ */
+ void updateMeters(SequencerMapper *mapper);
+ void updateMonitorMeter(SequencerMapper *mapper);
+
+public slots:
+ void slotSynchronise(); // synchronise with updated studio
+
+ void slotControllerDeviceEventReceived(MappedEvent *,
+ const void *);
+
+ void slotCurrentTabChanged(QWidget *);
+
+signals:
+ void play();
+ void stop();
+ void fastForwardPlayback();
+ void rewindPlayback();
+ void fastForwardPlaybackToEnd();
+ void rewindPlaybackToBeginning();
+ void record();
+ void panic();
+
+ // to be redirected to the instrument parameter box if necessary
+ void instrumentParametersChanged(InstrumentId);
+
+protected slots:
+ void slotUpdateInstrument(InstrumentId);
+
+ //void slotPanChanged(float);
+ void slotFaderLevelChanged(float);
+ void slotControllerChanged(float);
+
+protected:
+ void addTab(QWidget *tab, const QString &title);
+
+ virtual void sendControllerRefresh();
+
+ QTabWidget *m_tabWidget;
+
+ struct FaderStruct {
+
+ FaderStruct():m_id(0), m_vuMeter(0), m_volumeFader(0) {}
+
+ InstrumentId m_id;
+ MidiMixerVUMeter *m_vuMeter;
+ Fader *m_volumeFader;
+ std::vector<std::pair<MidiByte, Rotary*> > m_controllerRotaries;
+
+ };
+
+ typedef std::vector<FaderStruct*> FaderVector;
+ FaderVector m_faders;
+
+ QFrame *m_tabFrame;
+
+};
+
+
+}
+
+#endif
diff --git a/src/gui/studio/MidiProgramsEditor.cpp b/src/gui/studio/MidiProgramsEditor.cpp
new file mode 100644
index 0000000..8f81a04
--- /dev/null
+++ b/src/gui/studio/MidiProgramsEditor.cpp
@@ -0,0 +1,631 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "MidiProgramsEditor.h"
+#include "MidiBankListViewItem.h"
+#include "NameSetEditor.h"
+#include "misc/Debug.h"
+#include "misc/Strings.h"
+#include "BankEditorDialog.h"
+#include "base/Device.h"
+#include "base/MidiDevice.h"
+#include "base/MidiProgram.h"
+#include "gui/widgets/RosegardenPopupMenu.h"
+#include <kcompletion.h>
+#include <kglobal.h>
+#include <klineedit.h>
+#include <klocale.h>
+#include <kstddirs.h>
+#include <qcheckbox.h>
+#include <qcursor.h>
+#include <qfile.h>
+#include <qframe.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qobjectlist.h>
+#include <qpixmap.h>
+#include <qpoint.h>
+#include <qpopupmenu.h>
+#include <qpushbutton.h>
+#include <qspinbox.h>
+#include <qstring.h>
+#include <qtooltip.h>
+#include <qvgroupbox.h>
+#include <qwidget.h>
+#include <algorithm>
+
+namespace Rosegarden
+{
+
+MidiProgramsEditor::MidiProgramsEditor(BankEditorDialog* bankEditor,
+ QWidget* parent,
+ const char* name)
+ : NameSetEditor(bankEditor,
+ i18n("Bank and Program details"),
+ parent, name, i18n("Programs"), true),
+ m_device(0),
+ m_bankList(bankEditor->getBankList()),
+ m_programList(bankEditor->getProgramList()),
+ m_oldBank(false, 0, 0)
+{
+ QWidget *additionalWidget = makeAdditionalWidget(m_mainFrame);
+ if (additionalWidget) {
+ m_mainLayout->addMultiCellWidget(additionalWidget, 0, 2, 0, 2);
+ }
+}
+
+QWidget *
+MidiProgramsEditor::makeAdditionalWidget(QWidget *parent)
+{
+ QFrame *frame = new QFrame(parent);
+
+ m_percussion = new QCheckBox(frame);
+ m_msb = new QSpinBox(frame);
+ m_lsb = new QSpinBox(frame);
+
+ QGridLayout *gridLayout = new QGridLayout(frame,
+ 3, // rows
+ 2, // cols
+ 2); // margin
+
+ gridLayout->addWidget(new QLabel(i18n("Percussion"), frame),
+ 0, 0, AlignLeft);
+ gridLayout->addWidget(m_percussion, 0, 1, AlignLeft);
+ connect(m_percussion, SIGNAL(clicked()),
+ this, SLOT(slotNewPercussion()));
+
+ gridLayout->addWidget(new QLabel(i18n("MSB Value"), frame),
+ 1, 0, AlignLeft);
+ m_msb->setMinValue(0);
+ m_msb->setMaxValue(127);
+ gridLayout->addWidget(m_msb, 1, 1, AlignLeft);
+
+ QToolTip::add
+ (m_msb,
+ i18n("Selects a MSB controller Bank number (MSB/LSB pairs are always unique for any Device)"));
+
+ QToolTip::add
+ (m_lsb,
+ i18n("Selects a LSB controller Bank number (MSB/LSB pairs are always unique for any Device)"));
+
+ connect(m_msb, SIGNAL(valueChanged(int)),
+ this, SLOT(slotNewMSB(int)));
+
+ gridLayout->addWidget(new QLabel(i18n("LSB Value"), frame),
+ 2, 0, AlignLeft);
+ m_lsb->setMinValue(0);
+ m_lsb->setMaxValue(127);
+ gridLayout->addWidget(m_lsb, 2, 1, AlignLeft);
+
+ connect(m_lsb, SIGNAL(valueChanged(int)),
+ this, SLOT(slotNewLSB(int)));
+
+ return frame;
+}
+
+ProgramList
+MidiProgramsEditor::getBankSubset(const MidiBank &bank)
+{
+ ProgramList program;
+ ProgramList::iterator it;
+
+ for (it = m_programList.begin(); it != m_programList.end(); it++) {
+ if (it->getBank() == bank)
+ program.push_back(*it);
+ }
+
+ return program;
+}
+
+MidiBank*
+MidiProgramsEditor::getCurrentBank()
+{
+ return m_currentBank;
+}
+
+void
+MidiProgramsEditor::modifyCurrentPrograms(const MidiBank &oldBank,
+ const MidiBank &newBank)
+{
+ ProgramList::iterator it;
+
+ for (it = m_programList.begin(); it != m_programList.end(); it++) {
+ if (it->getBank() == oldBank) {
+ *it = MidiProgram(newBank, it->getProgram(), it->getName());
+ }
+ }
+}
+
+void
+MidiProgramsEditor::clearAll()
+{
+ blockAllSignals(true);
+
+ for (unsigned int i = 0; i < m_names.size(); ++i)
+ m_names[i]->clear();
+
+ setTitle(i18n("Bank and Program details"));
+
+ m_percussion->setChecked(false);
+ m_msb->setValue(0);
+ m_lsb->setValue(0);
+ m_librarian->clear();
+ m_librarianEmail->clear();
+ m_currentBank = 0;
+ setEnabled(false);
+
+ blockAllSignals(false);
+}
+
+void
+MidiProgramsEditor::populate(QListViewItem* item)
+{
+ RG_DEBUG << "MidiProgramsEditor::populate\n";
+
+ MidiBankListViewItem* bankItem = dynamic_cast<MidiBankListViewItem*>(item);
+ if (!bankItem) {
+ RG_DEBUG << "MidiProgramsEditor::populate : not a bank item - returning\n";
+ return ;
+ }
+
+ DeviceId deviceId = bankItem->getDeviceId();
+ m_device = m_bankEditor->getMidiDevice(deviceId);
+ if (!m_device)
+ return ;
+
+ setEnabled(true);
+
+ setBankName(item->text(0));
+
+ RG_DEBUG << "MidiProgramsEditor::populate : bankItem->getBank = "
+ << bankItem->getBank() << endl;
+
+ m_currentBank = &(m_bankList[bankItem->getBank()]); // m_device->getBankByIndex(bankItem->getBank());
+
+ blockAllSignals(true);
+
+ // set the bank values
+ m_percussion->setChecked(m_currentBank->isPercussion());
+ m_msb->setValue(m_currentBank->getMSB());
+ m_lsb->setValue(m_currentBank->getLSB());
+
+ m_oldBank = *m_currentBank;
+
+ // Librarian details
+ //
+ m_librarian->setText(strtoqstr(m_device->getLibrarianName()));
+ m_librarianEmail->setText(strtoqstr(m_device->getLibrarianEmail()));
+
+ ProgramList programSubset = getBankSubset(*m_currentBank);
+ ProgramList::iterator it;
+
+ QPixmap noKeyPixmap, keyPixmap;
+ QString pixmapDir = KGlobal::dirs()->findResource("appdata", "pixmaps/");
+ QString file = pixmapDir + "/toolbar/key-white.png";
+ if (QFile(file).exists())
+ noKeyPixmap = QPixmap(file);
+ file = pixmapDir + "/toolbar/key-green.png";
+ if (QFile(file).exists())
+ keyPixmap = QPixmap(file);
+
+ bool haveKeyMappings = m_currentBank->isPercussion()
+ && (m_device->getKeyMappings().size() > 0);
+
+ for (unsigned int i = 0; i < m_names.size(); i++) {
+ m_names[i]->clear();
+ getEntryButton(i)->setEnabled(haveKeyMappings);
+ getEntryButton(i)->setPixmap(noKeyPixmap);
+ QToolTip::remove
+ ( getEntryButton(i) );
+
+ for (it = programSubset.begin(); it != programSubset.end(); it++) {
+ if (it->getProgram() == i) {
+
+ QString programName = strtoqstr(it->getName());
+ m_completion.addItem(programName);
+ m_names[i]->setText(programName);
+
+ if (m_device->getKeyMappingForProgram(*it)) {
+ getEntryButton(i)->setPixmap(keyPixmap);
+ QToolTip::add
+ (getEntryButton(i),
+ i18n("Key Mapping: %1").arg(
+ strtoqstr(m_device->getKeyMappingForProgram(*it)->getName())));
+ }
+
+ break;
+ }
+ }
+
+ // show start of label
+ m_names[i]->setCursorPosition(0);
+ }
+
+ blockAllSignals(false);
+}
+
+void
+MidiProgramsEditor::reset()
+{
+ m_percussion->blockSignals(true);
+ m_msb->blockSignals(true);
+ m_lsb->blockSignals(true);
+
+ m_percussion->setChecked(m_oldBank.isPercussion());
+ m_msb->setValue(m_oldBank.getMSB());
+ m_lsb->setValue(m_oldBank.getLSB());
+
+ if (m_currentBank) {
+ modifyCurrentPrograms(*m_currentBank, m_oldBank);
+ *m_currentBank = m_oldBank;
+ }
+
+ m_percussion->blockSignals(false);
+ m_msb->blockSignals(false);
+ m_lsb->blockSignals(false);
+}
+
+void
+MidiProgramsEditor::slotNewPercussion()
+{
+ RG_DEBUG << "MidiProgramsEditor::slotNewPercussion" << endl;
+ bool percussion = m_percussion->isChecked();
+ m_percussion->blockSignals(true);
+ if (banklistContains(MidiBank(percussion, m_msb->value(), m_lsb->value()))) {
+ RG_DEBUG << "MidiProgramsEditor::slotNewPercussion: calling setChecked(" << !percussion << ")" << endl;
+ m_percussion->setChecked(!percussion);
+ } else {
+ MidiBank newBank(percussion,
+ m_msb->value(),
+ m_lsb->value());
+ modifyCurrentPrograms(*getCurrentBank(), newBank);
+ *getCurrentBank() = newBank;
+ }
+ m_percussion->blockSignals(false);
+ m_bankEditor->setModified(true);
+}
+
+void
+MidiProgramsEditor::slotNewMSB(int value)
+{
+ RG_DEBUG << "MidiProgramsEditor::slotNewMSB(" << value << ")\n";
+
+ m_msb->blockSignals(true);
+
+ int msb;
+
+ try {
+ msb = ensureUniqueMSB(value, value > getCurrentBank()->getMSB());
+ } catch (bool) {
+ msb = getCurrentBank()->getMSB();
+ }
+
+ MidiBank newBank(m_percussion->isChecked(),
+ msb,
+ m_lsb->value());
+
+ modifyCurrentPrograms(*getCurrentBank(), newBank);
+
+ m_msb->setValue(msb);
+ *getCurrentBank() = newBank;
+
+ m_msb->blockSignals(false);
+
+ m_bankEditor->setModified(true);
+}
+
+void
+MidiProgramsEditor::slotNewLSB(int value)
+{
+ RG_DEBUG << "MidiProgramsEditor::slotNewLSB(" << value << ")\n";
+
+ m_lsb->blockSignals(true);
+
+ int lsb;
+
+ try {
+ lsb = ensureUniqueLSB(value, value > getCurrentBank()->getLSB());
+ } catch (bool) {
+ lsb = getCurrentBank()->getLSB();
+ }
+
+ MidiBank newBank(m_percussion->isChecked(),
+ m_msb->value(),
+ lsb);
+
+ modifyCurrentPrograms(*getCurrentBank(), newBank);
+
+ m_lsb->setValue(lsb);
+ *getCurrentBank() = newBank;
+
+ m_lsb->blockSignals(false);
+
+ m_bankEditor->setModified(true);
+}
+
+struct ProgramCmp
+{
+ bool operator()(const Rosegarden::MidiProgram &p1,
+ const Rosegarden::MidiProgram &p2)
+ {
+ if (p1.getProgram() == p2.getProgram()) {
+ const Rosegarden::MidiBank &b1(p1.getBank());
+ const Rosegarden::MidiBank &b2(p2.getBank());
+ if (b1.getMSB() == b2.getMSB())
+ if (b1.getLSB() == b2.getLSB())
+ return ((b1.isPercussion() ? 1 : 0) < (b2.isPercussion() ? 1 : 0));
+ else return (b1.getLSB() < b2.getLSB());
+ else return (b1.getMSB() < b2.getMSB());
+ } else return (p1.getProgram() < p2.getProgram());
+ }
+};
+
+void
+MidiProgramsEditor::slotNameChanged(const QString& programName)
+{
+ const KLineEdit* lineEdit = dynamic_cast<const KLineEdit*>(sender());
+ if (!lineEdit) {
+ RG_DEBUG << "MidiProgramsEditor::slotProgramChanged() : %%% ERROR - signal sender is not a KLineEdit\n";
+ return ;
+ }
+
+ QString senderName = sender()->name();
+
+ // Adjust value back to zero rated
+ //
+ unsigned int id = senderName.toUInt() - 1;
+
+ RG_DEBUG << "MidiProgramsEditor::slotNameChanged("
+ << programName << ") : id = " << id << endl;
+
+ MidiProgram *program = getProgram(*getCurrentBank(), id);
+
+ if (program == 0) {
+ // Do nothing if program name is empty
+ if (programName.isEmpty())
+ return ;
+
+ program = new MidiProgram(*getCurrentBank(), id);
+ m_programList.push_back(*program);
+
+ // Sort the program list by id
+ std::sort(m_programList.begin(), m_programList.end(), ProgramCmp());
+
+ // Now, get with the program
+ //
+ program = getProgram(*getCurrentBank(), id);
+ } else {
+ // If we've found a program and the label is now empty
+ // then remove it from the program list.
+ //
+ if (programName.isEmpty()) {
+ ProgramList::iterator it = m_programList.begin();
+ ProgramList tmpProg;
+
+ for (; it != m_programList.end(); it++) {
+ if (((unsigned int)it->getProgram()) == id) {
+ m_programList.erase(it);
+ m_bankEditor->setModified(true);
+ RG_DEBUG << "deleting empty program (" << id << ")" << endl;
+ return ;
+ }
+ }
+ }
+ }
+
+ if (qstrtostr(programName) != program->getName()) {
+ program->setName(qstrtostr(programName));
+ m_bankEditor->setModified(true);
+ }
+}
+
+void
+MidiProgramsEditor::slotEntryButtonPressed()
+{
+ QPushButton* button = dynamic_cast<QPushButton*>(const_cast<QObject *>(sender()));
+ if (!button) {
+ RG_DEBUG << "MidiProgramsEditor::slotEntryButtonPressed() : %%% ERROR - signal sender is not a QPushButton\n";
+ return ;
+ }
+
+ QString senderName = button->name();
+
+ if (!m_device)
+ return ;
+
+ const KeyMappingList &kml = m_device->getKeyMappings();
+ if (kml.empty())
+ return ;
+
+ // Adjust value back to zero rated
+ //
+ unsigned int id = senderName.toUInt() - 1;
+ MidiProgram *program = getProgram(*getCurrentBank(), id);
+ if (!program)
+ return ;
+ m_currentMenuProgram = id;
+
+ RosegardenPopupMenu *menu = new RosegardenPopupMenu(button);
+
+ const MidiKeyMapping *currentMapping =
+ m_device->getKeyMappingForProgram(*program);
+ int currentEntry = 0;
+
+ menu->insertItem(i18n("<no key mapping>"), this,
+ SLOT(slotEntryMenuItemSelected(int)), 0, 0);
+ menu->setItemParameter(0, 0);
+
+ for (int i = 0; i < kml.size(); ++i) {
+ menu->insertItem(strtoqstr(kml[i].getName()),
+ this, SLOT(slotEntryMenuItemSelected(int)),
+ 0, i + 1);
+ menu->setItemParameter(i + 1, i + 1);
+ if (currentMapping && (kml[i] == *currentMapping))
+ currentEntry = i + 1;
+ }
+
+ int itemHeight = menu->itemHeight(0) + 2;
+ QPoint pos = QCursor::pos();
+
+ pos.rx() -= 10;
+ pos.ry() -= (itemHeight / 2 + currentEntry * itemHeight);
+
+ menu->popup(pos);
+}
+
+void
+MidiProgramsEditor::slotEntryMenuItemSelected(int i)
+{
+ if (!m_device)
+ return ;
+
+ const KeyMappingList &kml = m_device->getKeyMappings();
+ if (kml.empty())
+ return ;
+
+ MidiProgram *program = getProgram(*getCurrentBank(), m_currentMenuProgram);
+ if (!program)
+ return ;
+
+ std::string newMapping;
+
+ if (i == 0) { // no key mapping
+ newMapping = "";
+ } else {
+ --i;
+ if (i < kml.size()) {
+ newMapping = kml[i].getName();
+ }
+ }
+
+ m_device->setKeyMappingForProgram(*program, newMapping);
+ QString pixmapDir = KGlobal::dirs()->findResource("appdata", "pixmaps/");
+ bool haveKeyMappings = (m_device->getKeyMappings().size() > 0);
+ QPushButton *btn = getEntryButton(m_currentMenuProgram);
+
+ if (newMapping.empty()) {
+ QString file = pixmapDir + "/toolbar/key-white.png";
+ if (QFile(file).exists()) {
+ btn->setPixmap(QPixmap(file));
+ }
+ QToolTip::remove
+ (btn);
+ } else {
+ QString file = pixmapDir + "/toolbar/key-green.png";
+ if (QFile(file).exists()) {
+ btn->setPixmap(QPixmap(file));
+ }
+ QToolTip::add
+ (btn, i18n("Key Mapping: %1").arg(strtoqstr(newMapping)));
+ }
+ btn->setEnabled(haveKeyMappings);
+}
+
+int
+MidiProgramsEditor::ensureUniqueMSB(int msb, bool ascending)
+{
+ int newMSB = msb;
+ while (banklistContains(MidiBank(m_percussion->isChecked(),
+ newMSB, m_lsb->value()))
+ && newMSB < 128
+ && newMSB > -1)
+ if (ascending)
+ newMSB++;
+ else
+ newMSB--;
+
+ if (newMSB == -1 || newMSB == 128)
+ throw false;
+
+ return newMSB;
+}
+
+int
+MidiProgramsEditor::ensureUniqueLSB(int lsb, bool ascending)
+{
+ int newLSB = lsb;
+ while (banklistContains(MidiBank(m_percussion->isChecked(),
+ m_msb->value(), newLSB))
+ && newLSB < 128
+ && newLSB > -1)
+ if (ascending)
+ newLSB++;
+ else
+ newLSB--;
+
+ if (newLSB == -1 || newLSB == 128)
+ throw false;
+
+ return newLSB;
+}
+
+bool
+MidiProgramsEditor::banklistContains(const MidiBank &bank)
+{
+ BankList::iterator it;
+
+ for (it = m_bankList.begin(); it != m_bankList.end(); it++)
+ if (*it == bank)
+ return true;
+
+ return false;
+}
+
+MidiProgram*
+MidiProgramsEditor::getProgram(const MidiBank &bank, int programNo)
+{
+ ProgramList::iterator it = m_programList.begin();
+
+ for (; it != m_programList.end(); it++) {
+ if (it->getBank() == bank && it->getProgram() == programNo)
+ return &(*it);
+ }
+
+ return 0;
+}
+
+void
+MidiProgramsEditor::setBankName(const QString& s)
+{
+ setTitle(s);
+}
+
+void MidiProgramsEditor::blockAllSignals(bool block)
+{
+ const QObjectList* allChildren = queryList("KLineEdit", "[0-9]+");
+ QObjectListIt it(*allChildren);
+ QObject *obj;
+
+ while ( (obj = it.current()) != 0 ) {
+ obj->blockSignals(block);
+ ++it;
+ }
+
+ m_msb->blockSignals(block);
+ m_lsb->blockSignals(block);
+}
+
+}
+#include "MidiProgramsEditor.moc"
diff --git a/src/gui/studio/MidiProgramsEditor.h b/src/gui/studio/MidiProgramsEditor.h
new file mode 100644
index 0000000..d0ef565
--- /dev/null
+++ b/src/gui/studio/MidiProgramsEditor.h
@@ -0,0 +1,119 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_MIDIPROGRAMSEDITOR_H_
+#define _RG_MIDIPROGRAMSEDITOR_H_
+
+#include "base/MidiProgram.h"
+#include "NameSetEditor.h"
+
+
+class QWidget;
+class QString;
+class QSpinBox;
+class QListViewItem;
+class QCheckBox;
+class BankList;
+
+
+namespace Rosegarden
+{
+
+class MidiProgram;
+class MidiDevice;
+class BankEditorDialog;
+
+
+class MidiProgramsEditor : public NameSetEditor
+{
+ Q_OBJECT
+public:
+ MidiProgramsEditor(BankEditorDialog *bankEditor,
+ QWidget *parent,
+ const char *name = 0);
+
+ void clearAll();
+ void populate(QListViewItem*);
+ void reset();
+
+public slots:
+
+ // Check that any new MSB/LSB combination is unique for this device
+ //
+ void slotNewMSB(int value);
+ void slotNewLSB(int value);
+ void slotNewPercussion(); // gets value from checkbox
+
+ virtual void slotNameChanged(const QString &);
+ virtual void slotEntryButtonPressed();
+ void slotEntryMenuItemSelected(int);
+
+protected:
+
+ MidiBank* getCurrentBank();
+
+ int ensureUniqueMSB(int msb, bool ascending);
+ int ensureUniqueLSB(int lsb, bool ascending);
+
+ // Does the banklist contain this combination already?
+ //
+ bool banklistContains(const MidiBank &);
+
+ ProgramList getBankSubset(const MidiBank &);
+
+ /// Set the currently loaded programs to new MSB and LSB
+ void modifyCurrentPrograms(const MidiBank &oldBank,
+ const MidiBank &newBank);
+
+ // Get a program (pointer into program list) for modification
+ //
+ MidiProgram* getProgram(const MidiBank &bank, int program);
+
+ void setBankName(const QString& s);
+
+ virtual QWidget *makeAdditionalWidget(QWidget *parent);
+
+ void blockAllSignals(bool block);
+
+ //--------------- Data members ---------------------------------
+ QCheckBox *m_percussion;
+ QSpinBox *m_msb;
+ QSpinBox *m_lsb;
+
+ MidiDevice *m_device;
+
+ MidiBank *m_currentBank;
+ BankList &m_bankList;
+ ProgramList &m_programList;
+
+ MidiBank m_oldBank;
+
+ unsigned int m_currentMenuProgram;
+};
+
+
+}
+
+#endif
diff --git a/src/gui/studio/MixerWindow.cpp b/src/gui/studio/MixerWindow.cpp
new file mode 100644
index 0000000..2a65024
--- /dev/null
+++ b/src/gui/studio/MixerWindow.cpp
@@ -0,0 +1,75 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "MixerWindow.h"
+
+#include "misc/Debug.h"
+#include "base/MidiProgram.h"
+#include "base/Studio.h"
+#include "document/RosegardenGUIDoc.h"
+#include <kmainwindow.h>
+#include <qaccel.h>
+#include <qwidget.h>
+
+
+namespace Rosegarden
+{
+
+MixerWindow::MixerWindow(QWidget *parent,
+ RosegardenGUIDoc *document) :
+ KMainWindow(parent, "mixerwindow"),
+ m_document(document),
+ m_studio(&document->getStudio()),
+ m_currentId(0)
+{
+ m_accelerators = new QAccel(this);
+}
+
+void
+MixerWindow::closeEvent(QCloseEvent *e)
+{
+ RG_DEBUG << "MixerWindow::closeEvent()\n";
+ emit closing();
+ KMainWindow::closeEvent(e);
+}
+
+void
+MixerWindow::windowActivationChange(bool)
+{
+ if (isActiveWindow()) {
+ emit windowActivated();
+ sendControllerRefresh();
+ }
+}
+
+void
+MixerWindow::slotClose()
+{
+ RG_DEBUG << "MixerWindow::slotClose()\n";
+ close();
+}
+
+}
+#include "MixerWindow.moc"
diff --git a/src/gui/studio/MixerWindow.h b/src/gui/studio/MixerWindow.h
new file mode 100644
index 0000000..9e5f9cf
--- /dev/null
+++ b/src/gui/studio/MixerWindow.h
@@ -0,0 +1,77 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_MIXERWINDOW_H_
+#define _RG_MIXERWINDOW_H_
+
+#include "base/MidiProgram.h"
+#include <kmainwindow.h>
+
+
+class QWidget;
+class QCloseEvent;
+class QAccel;
+
+
+namespace Rosegarden
+{
+
+class Studio;
+class RosegardenGUIDoc;
+
+
+class MixerWindow: public KMainWindow
+{
+ Q_OBJECT
+
+public:
+ MixerWindow(QWidget *parent, RosegardenGUIDoc *document);
+ QAccel* getAccelerators() { return m_accelerators; }
+
+signals:
+ void closing();
+ void windowActivated();
+
+protected slots:
+ void slotClose();
+
+protected:
+ virtual void closeEvent(QCloseEvent *);
+ virtual void windowActivationChange(bool);
+
+ virtual void sendControllerRefresh() = 0;
+
+ RosegardenGUIDoc *m_document;
+ Studio *m_studio;
+ InstrumentId m_currentId;
+
+ QAccel *m_accelerators;
+
+};
+
+
+}
+
+#endif
diff --git a/src/gui/studio/NameSetEditor.cpp b/src/gui/studio/NameSetEditor.cpp
new file mode 100644
index 0000000..8dadd0c
--- /dev/null
+++ b/src/gui/studio/NameSetEditor.cpp
@@ -0,0 +1,190 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "NameSetEditor.h"
+#include "BankEditorDialog.h"
+#include <kcompletion.h>
+#include <kglobalsettings.h>
+#include <klineedit.h>
+#include <klocale.h>
+#include <qframe.h>
+#include <qgroupbox.h>
+#include <qhbox.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qpushbutton.h>
+#include <qstring.h>
+#include <qtabwidget.h>
+#include <qtooltip.h>
+#include <qvbox.h>
+#include <qvgroupbox.h>
+#include <qwidget.h>
+#include <iostream>
+
+namespace Rosegarden
+{
+
+NameSetEditor::NameSetEditor(BankEditorDialog* bankEditor,
+ QString title,
+ QWidget* parent,
+ const char* name,
+ QString headingPrefix,
+ bool showEntryButtons)
+ : QVGroupBox(title, parent, name),
+ m_bankEditor(bankEditor),
+ m_mainFrame(new QFrame(this))
+{
+ m_mainLayout = new QGridLayout(m_mainFrame,
+ 4, // rows
+ 6, // cols
+ 2); // margin
+
+ // Librarian
+ //
+ QGroupBox *groupBox = new QGroupBox(2,
+ Qt::Horizontal,
+ i18n("Librarian"),
+ m_mainFrame);
+ m_mainLayout->addMultiCellWidget(groupBox, 0, 2, 3, 5);
+
+ new QLabel(i18n("Name"), groupBox);
+ m_librarian = new QLabel(groupBox);
+
+ new QLabel(i18n("Email"), groupBox);
+ m_librarianEmail = new QLabel(groupBox);
+
+ QToolTip::add
+ (groupBox,
+ i18n("The librarian maintains the Rosegarden device data for this device.\nIf you've made modifications to suit your own device, it might be worth\nliaising with the librarian in order to publish your information for the benefit\nof others."));
+
+ QTabWidget* tabw = new QTabWidget(this);
+
+ tabw->setMargin(10);
+
+ QHBox *h;
+ QVBox *v;
+ QHBox *numBox;
+
+ unsigned int tabs = 4;
+ unsigned int cols = 2;
+ unsigned int labelId = 0;
+
+ for (unsigned int tab = 0; tab < tabs; ++tab) {
+ h = new QHBox(tabw);
+
+ for (unsigned int col = 0; col < cols; ++col) {
+ v = new QVBox(h);
+
+ for (unsigned int row = 0; row < 128 / (tabs*cols); ++row) {
+ numBox = new QHBox(v);
+ QString numberText = QString("%1").arg(labelId + 1);
+
+ if (tab == 0 && col == 0 && row == 0) {
+ // Initial label; button to adjust whether labels start at 0 or 1
+ m_initialLabel = new QPushButton(numberText, numBox);
+ connect(m_initialLabel,
+ SIGNAL(clicked()),
+ this,
+ SLOT(slotToggleInitialLabel()));
+ } else {
+ QLabel *label = new QLabel(numberText, numBox);
+ label->setFixedWidth(40);
+ label->setAlignment(AlignCenter);
+ m_labels.push_back(label);
+ }
+
+
+
+ if (showEntryButtons) {
+ QPushButton *button = new QPushButton("", numBox, numberText);
+ button->setMaximumWidth(40);
+ button->setMaximumHeight(20);
+ button->setFlat(true);
+ connect(button, SIGNAL(clicked()),
+ this, SLOT(slotEntryButtonPressed()));
+ m_entryButtons.push_back(button);
+ }
+
+ KLineEdit* lineEdit = new KLineEdit(numBox, numberText);
+ lineEdit->setMinimumWidth(110);
+ lineEdit->setCompletionMode(KGlobalSettings::CompletionAuto);
+ lineEdit->setCompletionObject(&m_completion);
+ m_names.push_back(lineEdit);
+
+ connect(m_names[labelId],
+ SIGNAL(textChanged(const QString&)),
+ this,
+ SLOT(slotNameChanged(const QString&)));
+
+ ++labelId;
+ }
+ }
+
+ tabw->addTab(h,
+ (tab == 0 ? headingPrefix + QString(" %1 - %2") :
+ QString("%1 - %2")).
+ arg(tab * (128 / tabs) + 1).
+ arg((tab + 1) * (128 / tabs)));
+ }
+
+ m_initialLabel->setMaximumSize(m_labels.front()->size());
+}
+
+void
+NameSetEditor::slotToggleInitialLabel()
+{
+ QString initial = m_initialLabel->text();
+
+ // strip some unrequested nice-ification.. urg!
+ if (initial.startsWith("&")) {
+ initial = initial.right(initial.length() - 1);
+ }
+
+ bool ok;
+ unsigned index = initial.toUInt(&ok);
+
+ if (!ok) {
+ std::cerr << "conversion of '"
+ << initial.ascii()
+ << "' to number failed"
+ << std::endl;
+ return ;
+ }
+
+ if (index == 0)
+ index = 1;
+ else
+ index = 0;
+
+ m_initialLabel->setText(QString("%1").arg(index++));
+ for (std::vector<QLabel*>::iterator it( m_labels.begin() );
+ it != m_labels.end();
+ ++it) {
+ (*it)->setText(QString("%1").arg(index++));
+ }
+}
+
+}
+#include "NameSetEditor.moc"
diff --git a/src/gui/studio/NameSetEditor.h b/src/gui/studio/NameSetEditor.h
new file mode 100644
index 0000000..e1e1476
--- /dev/null
+++ b/src/gui/studio/NameSetEditor.h
@@ -0,0 +1,90 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_NAMESETEDITOR_H_
+#define _RG_NAMESETEDITOR_H_
+
+#include <kcompletion.h>
+#include <qstring.h>
+#include <qvgroupbox.h>
+#include <vector>
+
+
+class QWidget;
+class QPushButton;
+class QListViewItem;
+class QLabel;
+class QGridLayout;
+class QFrame;
+class KLineEdit;
+
+
+namespace Rosegarden
+{
+
+class BankEditorDialog;
+
+
+class NameSetEditor : public QVGroupBox
+{
+ Q_OBJECT
+public:
+ virtual void clearAll() = 0;
+
+ virtual void populate(QListViewItem *) = 0;
+ virtual void reset() = 0;
+
+public slots:
+ virtual void slotNameChanged(const QString&) = 0;
+ virtual void slotEntryButtonPressed() = 0;
+ void slotToggleInitialLabel();
+
+protected:
+ NameSetEditor(BankEditorDialog *bankEditor,
+ QString title,
+ QWidget *parent,
+ const char *name,
+ QString headingPrefix = "",
+ bool showEntryButtons = false);
+
+ QPushButton *getEntryButton(int n) { return m_entryButtons[n]; }
+ const QPushButton *getEntryButton(int n) const { return m_entryButtons[n]; }
+
+ QGridLayout *m_mainLayout;
+ BankEditorDialog* m_bankEditor;
+ KCompletion m_completion;
+ QPushButton *m_initialLabel;
+ std::vector<QLabel*> m_labels;
+ std::vector<KLineEdit*> m_names;
+ QFrame *m_mainFrame;
+ QLabel *m_librarian;
+ QLabel *m_librarianEmail;
+ std::vector<QPushButton *> m_entryButtons;
+};
+
+
+}
+
+#endif
diff --git a/src/gui/studio/OSCMessage.cpp b/src/gui/studio/OSCMessage.cpp
new file mode 100644
index 0000000..6496732
--- /dev/null
+++ b/src/gui/studio/OSCMessage.cpp
@@ -0,0 +1,87 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#ifdef HAVE_LIBLO
+
+#include "OSCMessage.h"
+
+#include <cstdlib>
+#include <cstring>
+
+namespace Rosegarden
+{
+
+OSCMessage::~OSCMessage()
+{
+ clearArgs();
+}
+
+void
+OSCMessage::clearArgs()
+{
+ while (!m_args.empty()) {
+ free(m_args[0].second);
+ m_args.erase(m_args.begin());
+ }
+}
+
+void
+OSCMessage::addArg(char type, lo_arg *arg)
+{
+ lo_arg *newarg = 0;
+
+ if (type == 's') {
+
+ size_t sz = strlen((char *)arg) + 1;
+ if (sz < sizeof(lo_arg))
+ sz = sizeof(lo_arg);
+ newarg = (lo_arg *)malloc(sz);
+ strcpy((char *)newarg, (char *)arg);
+
+ } else {
+
+ newarg = (lo_arg *)malloc(sizeof(lo_arg));
+ memcpy((char *)newarg, (char *)arg, sizeof(lo_arg));
+ }
+
+ m_args.push_back(OSCArg(type, newarg));
+}
+
+size_t
+OSCMessage::getArgCount() const
+{
+ return m_args.size();
+}
+
+const lo_arg *
+OSCMessage::getArg(size_t i, char &type) const
+{
+ type = m_args[i].first;
+ return m_args[i].second;
+}
+
+}
+
+#endif // HAVE_LIBLO
diff --git a/src/gui/studio/OSCMessage.h b/src/gui/studio/OSCMessage.h
new file mode 100644
index 0000000..05bf63f
--- /dev/null
+++ b/src/gui/studio/OSCMessage.h
@@ -0,0 +1,75 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_OSCMESSAGE_H_
+#define _RG_OSCMESSAGE_H_
+
+#include <lo/lo.h>
+
+#include <string>
+#include <utility>
+#include <vector>
+
+namespace Rosegarden
+{
+
+
+
+class OSCMessage
+{
+public:
+ OSCMessage() { }
+ ~OSCMessage();
+
+ void setTarget(const int &target) { m_target = target; }
+ int getTarget() const { return m_target; }
+
+ void setTargetData(const int &targetData) { m_targetData = targetData; }
+ int getTargetData() const { return m_targetData; }
+
+ void setMethod(const std::string &method) { m_method = method; }
+ std::string getMethod() const { return m_method; }
+
+ void clearArgs();
+ void addArg(char type, lo_arg *arg);
+
+ size_t getArgCount() const;
+ const lo_arg *getArg(size_t i, char &type) const;
+
+private:
+ int m_target;
+ int m_targetData;
+ std::string m_method;
+ typedef std::pair<char, lo_arg *> OSCArg;
+ std::vector<OSCArg> m_args;
+};
+
+
+class TimerCallbackAssistant;
+
+
+}
+
+#endif
diff --git a/src/gui/studio/RemapInstrumentDialog.cpp b/src/gui/studio/RemapInstrumentDialog.cpp
new file mode 100644
index 0000000..dae43da
--- /dev/null
+++ b/src/gui/studio/RemapInstrumentDialog.cpp
@@ -0,0 +1,184 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "RemapInstrumentDialog.h"
+
+#include "misc/Strings.h"
+#include "base/Device.h"
+#include "base/Instrument.h"
+#include "base/MidiDevice.h"
+#include "base/SoftSynthDevice.h"
+#include "base/Studio.h"
+#include "commands/studio/ModifyDeviceMappingCommand.h"
+#include "commands/studio/ModifyInstrumentMappingCommand.h"
+#include "document/MultiViewCommandHistory.h"
+#include "document/RosegardenGUIDoc.h"
+#include <kcombobox.h>
+#include <kcommand.h>
+#include <kdialogbase.h>
+#include <klocale.h>
+#include <qbuttongroup.h>
+#include <qgroupbox.h>
+#include <qlabel.h>
+#include <qradiobutton.h>
+#include <qvbox.h>
+#include <qwidget.h>
+
+
+namespace Rosegarden
+{
+
+RemapInstrumentDialog::RemapInstrumentDialog(QWidget *parent,
+ RosegardenGUIDoc *doc):
+ KDialogBase(parent, "", true, i18n("Remap Instrument assigments..."),
+ Ok | Apply | Cancel),
+ m_doc(doc)
+{
+ QVBox *vBox = makeVBoxMainWidget();
+
+ m_buttonGroup = new QButtonGroup(1, Qt::Horizontal,
+ i18n("Device or Instrument"),
+ vBox);
+
+ new QLabel(i18n("Remap Tracks by all Instruments on a Device or by single Instrument"), m_buttonGroup);
+ m_deviceButton = new QRadioButton(i18n("Device"), m_buttonGroup);
+ m_instrumentButton = new QRadioButton(i18n("Instrument"), m_buttonGroup);
+
+
+ connect(m_buttonGroup, SIGNAL(released(int)),
+ this, SLOT(slotRemapReleased(int)));
+
+ QGroupBox *groupBox = new QGroupBox(2, Qt::Horizontal,
+ i18n("Choose Source and Destination"),
+ vBox);
+
+ new QLabel(i18n("From"), groupBox);
+ new QLabel(i18n("To"), groupBox);
+ m_fromCombo = new KComboBox(groupBox);
+ m_toCombo = new KComboBox(groupBox);
+
+ m_buttonGroup->setButton(0);
+ populateCombo(0);
+}
+
+void
+RemapInstrumentDialog::populateCombo(int id)
+{
+ m_fromCombo->clear();
+ m_toCombo->clear();
+ Studio *studio = &m_doc->getStudio();
+
+ if (id == 0) {
+ DeviceList *devices = studio->getDevices();
+ DeviceListIterator it;
+ m_devices.clear();
+
+ for (it = devices->begin(); it != devices->end(); it++) {
+ MidiDevice *md =
+ dynamic_cast<MidiDevice *>(*it);
+
+ if (md) {
+ if (md->getDirection() == MidiDevice::Play) {
+ m_devices.push_back(*it);
+ m_fromCombo->insertItem(strtoqstr((*it)->getName()));
+ m_toCombo->insertItem(strtoqstr((*it)->getName()));
+ }
+ } else {
+ SoftSynthDevice *sd =
+ dynamic_cast<SoftSynthDevice *>(*it);
+ if (sd) {
+ m_devices.push_back(*it);
+ m_fromCombo->insertItem(strtoqstr((*it)->getName()));
+ m_toCombo->insertItem(strtoqstr((*it)->getName()));
+ }
+ }
+ }
+
+ if (m_devices.size() == 0) {
+ m_fromCombo->insertItem(i18n("<no devices>"));
+ m_toCombo->insertItem(i18n("<no devices>"));
+ }
+ } else {
+ m_instruments = studio->getPresentationInstruments();
+ InstrumentList::iterator it = m_instruments.begin();
+
+ for (; it != m_instruments.end(); it++) {
+ m_fromCombo->insertItem(strtoqstr((*it)->getPresentationName()));
+ m_toCombo->insertItem(strtoqstr((*it)->getPresentationName()));
+ }
+ }
+}
+
+void
+RemapInstrumentDialog::slotRemapReleased(int id)
+{
+ populateCombo(id);
+}
+
+void
+RemapInstrumentDialog::slotOk()
+{
+ slotApply();
+ accept();
+}
+
+void
+RemapInstrumentDialog::slotApply()
+{
+ if (m_buttonGroup->id(m_buttonGroup->selected()) == 0) // devices
+ {
+ ModifyDeviceMappingCommand *command =
+ new ModifyDeviceMappingCommand
+ (m_doc,
+ m_devices[m_fromCombo->currentItem()]->getId(),
+ m_devices[m_toCombo->currentItem()]->getId());
+ addCommandToHistory(command);
+ } else // instruments
+ {
+ ModifyInstrumentMappingCommand *command =
+ new ModifyInstrumentMappingCommand
+ (m_doc,
+ m_instruments[m_fromCombo->currentItem()]->getId(),
+ m_instruments[m_toCombo->currentItem()]->getId());
+ addCommandToHistory(command);
+ }
+
+ emit applyClicked();
+}
+
+void
+RemapInstrumentDialog::addCommandToHistory(KCommand *command)
+{
+ getCommandHistory()->addCommand(command);
+}
+
+MultiViewCommandHistory*
+RemapInstrumentDialog::getCommandHistory()
+{
+ return m_doc->getCommandHistory();
+}
+
+}
+#include "RemapInstrumentDialog.moc"
diff --git a/src/gui/studio/RemapInstrumentDialog.h b/src/gui/studio/RemapInstrumentDialog.h
new file mode 100644
index 0000000..669020e
--- /dev/null
+++ b/src/gui/studio/RemapInstrumentDialog.h
@@ -0,0 +1,84 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_REMAPINSTRUMENTDIALOG_H_
+#define _RG_REMAPINSTRUMENTDIALOG_H_
+
+#include "base/Studio.h"
+#include <kdialogbase.h>
+
+
+class QWidget;
+class QRadioButton;
+class QButtonGroup;
+class KCommand;
+class KComboBox;
+
+
+namespace Rosegarden
+{
+
+
+class RosegardenGUIDoc;
+class MultiViewCommandHistory;
+
+
+class RemapInstrumentDialog : public KDialogBase
+{
+ Q_OBJECT
+public:
+ RemapInstrumentDialog(QWidget *parent,
+ RosegardenGUIDoc *doc);
+
+ void populateCombo(int id);
+
+ void addCommandToHistory(KCommand *command);
+ MultiViewCommandHistory* getCommandHistory();
+
+public slots:
+ void slotRemapReleased(int id);
+
+ void slotOk();
+ void slotApply();
+
+protected:
+
+ RosegardenGUIDoc *m_doc;
+
+ QRadioButton *m_deviceButton;
+ QRadioButton *m_instrumentButton;
+
+ QButtonGroup *m_buttonGroup;
+ KComboBox *m_fromCombo;
+ KComboBox *m_toCombo;
+
+ DeviceList m_devices;
+ InstrumentList m_instruments;
+};
+
+
+}
+
+#endif
diff --git a/src/gui/studio/StudioControl.cpp b/src/gui/studio/StudioControl.cpp
new file mode 100644
index 0000000..e94016a
--- /dev/null
+++ b/src/gui/studio/StudioControl.cpp
@@ -0,0 +1,582 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "StudioControl.h"
+
+#include "sound/Midi.h"
+#include "misc/Debug.h"
+#include "base/MidiProgram.h"
+#include "base/Profiler.h"
+#include "base/RealTime.h"
+#include "gui/application/RosegardenApplication.h"
+#include "sound/MappedCommon.h"
+#include "sound/MappedComposition.h"
+#include "sound/MappedEvent.h"
+#include "sound/MappedInstrument.h"
+#include "sound/MappedStudio.h"
+#include <qcstring.h>
+#include <qdatastream.h>
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+MappedObjectId
+StudioControl::createStudioObject(MappedObject::MappedObjectType type)
+{
+Profiler profiler("StudioControl::createStudioObject", true);
+
+int value = -1;
+QByteArray data;
+QCString replyType;
+QByteArray replyData;
+QDataStream streamOut(data, IO_WriteOnly);
+
+streamOut << (int)type;
+
+if (!rgapp->sequencerCall("createMappedObject(int)",
+ replyType, replyData, data))
+{
+ SEQMAN_DEBUG << "createStudioObject - "
+ << "failed to contact Rosegarden sequencer"
+ << endl;
+} else
+{
+ QDataStream streamIn(replyData, IO_ReadOnly);
+ streamIn >> value;
+}
+
+return value;
+}
+
+bool
+StudioControl::destroyStudioObject(MappedObjectId id)
+{
+ Profiler profiler("StudioControl::destroyStudioObject", true);
+
+ int value = 0;
+ QByteArray data;
+ QCString replyType;
+ QByteArray replyData;
+ QDataStream streamOut(data, IO_WriteOnly);
+
+ streamOut << int(id);
+
+ if (!rgapp->sequencerCall("destroyMappedObject(int)",
+ replyType, replyData, data)) {
+ SEQMAN_DEBUG << "destroyStudioObject - "
+ << "failed to contact Rosegarden sequencer"
+ << endl;
+ } else {
+ QDataStream streamIn(replyData, IO_ReadOnly);
+ streamIn >> value;
+ }
+
+ if (value == 1)
+ return true;
+ else
+ return false;
+}
+
+MappedObjectPropertyList
+StudioControl::getStudioObjectProperty(MappedObjectId id,
+ const MappedObjectProperty &property)
+{
+ Profiler profiler("StudioControl::getStudioObjectProperty", true);
+
+ MappedObjectPropertyList list;
+
+ QByteArray data;
+ QCString replyType;
+ QByteArray replyData;
+ QDataStream streamOut(data, IO_WriteOnly);
+
+ streamOut << (int)id;
+ streamOut << QString(property);
+
+ if (!rgapp->sequencerCall("getPropertyList(int, QString)",
+ replyType, replyData, data)) {
+ SEQMAN_DEBUG << "getStudioObjectProperty - "
+ << "failed to contact Rosegarden sequencer"
+ << endl;
+ } else {
+ QDataStream streamIn(replyData, IO_ReadOnly);
+ streamIn >> list;
+ }
+
+ return list;
+}
+
+bool
+StudioControl::setStudioObjectProperty(MappedObjectId id,
+ const MappedObjectProperty &property,
+ MappedObjectValue value)
+{
+ Profiler profiler("StudioControl::setStudioObjectProperty(float)", true);
+
+ QByteArray data;
+ QDataStream streamOut(data, IO_WriteOnly);
+
+ streamOut << (int)id;
+ streamOut << (QString)property;
+ streamOut << (float)value;
+
+ rgapp->sequencerSend("setMappedProperty(int, QString, float)", data);
+
+ return true;
+}
+
+bool
+StudioControl::setStudioObjectProperties(const MappedObjectIdList &ids,
+ const MappedObjectPropertyList &properties,
+ const MappedObjectValueList &values)
+{
+ Profiler profiler("StudioControl::setStudioObjectProperties(floats)", true);
+
+ QByteArray data;
+ QDataStream streamOut(data, IO_WriteOnly);
+
+ streamOut << ids;
+ streamOut << properties;
+ streamOut << values;
+
+ rgapp->sequencerSend("setMappedProperties(MappedObjectIdList, MappedObjectPropertyList, MappedObjectValueList)", data);
+
+ return true;
+}
+
+bool
+StudioControl::setStudioObjectProperty(MappedObjectId id,
+ const MappedObjectProperty &property,
+ const QString &value)
+{
+ Profiler profiler("StudioControl::setStudioObjectProperty(string)", true);
+
+ QByteArray data;
+ QDataStream streamOut(data, IO_WriteOnly);
+
+ streamOut << (int)id;
+ streamOut << (QString)property;
+ streamOut << (QString)value;
+
+ rgapp->sequencerSend("setMappedProperty(int, QString, QString)", data);
+
+ return true;
+}
+
+bool
+StudioControl::setStudioObjectPropertyList(MappedObjectId id,
+ const MappedObjectProperty &property,
+ const MappedObjectPropertyList &values)
+{
+ Profiler profiler("StudioControl::setStudioObjectPropertyList", true);
+
+ QByteArray data;
+ QDataStream streamOut(data, IO_WriteOnly);
+
+ streamOut << (int)id;
+ streamOut << (QString)property;
+ streamOut << values;
+
+ RG_DEBUG << "StudioControl::setStudioObjectPropertyList: " << values.size() << " values for property " << property << endl;
+
+ rgapp->sequencerSend("setMappedPropertyList(int, QString, MappedObjectPropertyList)",
+ data);
+
+ return true;
+}
+
+MappedObjectId
+StudioControl::getStudioObjectByType(MappedObject::MappedObjectType type)
+{
+ Profiler profiler("StudioControl::getStudioObjectByType", true);
+
+ int value = -1;
+ QByteArray data;
+ QCString replyType;
+ QByteArray replyData;
+ QDataStream streamOut(data, IO_WriteOnly);
+
+ streamOut << (int)type;
+
+ if (!rgapp->sequencerCall("getMappedObjectId(int)",
+ replyType, replyData, data)) {
+ SEQMAN_DEBUG << "getStudioObjectByType - "
+ << "failed to contact Rosegarden sequencer"
+ << endl;
+ } else {
+ QDataStream streamIn(replyData, IO_ReadOnly);
+ streamIn >> value;
+ }
+
+ return value;
+}
+
+void
+StudioControl::setStudioPluginPort(MappedObjectId pluginId,
+ unsigned long portId,
+ MappedObjectValue value)
+{
+ Profiler profiler("StudioControl::setStudioPluginPort", true);
+
+ QByteArray data;
+ QDataStream streamOut(data, IO_WriteOnly);
+
+ // Use new MappedEvent interface
+ //
+ streamOut << (int)pluginId;
+ streamOut << (unsigned long)portId;
+ streamOut << (float)value;
+
+ rgapp->sequencerSend("setMappedPort(int, unsigned long int, float)", data);
+}
+
+MappedObjectValue
+StudioControl::getStudioPluginPort(MappedObjectId pluginId,
+ unsigned long portId)
+{
+ Profiler profiler("StudioControl::getStudioPluginPort", true);
+
+ float value = 0.0;
+ QByteArray data;
+ QCString replyType;
+ QByteArray replyData;
+ QDataStream streamOut(data, IO_WriteOnly);
+
+ streamOut << (int)pluginId;
+ streamOut << (unsigned long)portId;
+
+ if (!rgapp->sequencerCall("getMappedPort(int, unsigned long int)",
+ replyType, replyData, data)) {
+ SEQMAN_DEBUG << "getStudioPluginPort - "
+ << "failed to contact Rosegarden sequencer"
+ << endl;
+ } else {
+ QDataStream streamIn(replyData, IO_ReadOnly);
+ streamIn >> value;
+ }
+
+ return value;
+}
+
+MappedObjectPropertyList
+StudioControl::getPluginInformation()
+{
+ MappedObjectPropertyList list;
+
+ QByteArray data;
+ QCString replyType;
+ QByteArray replyData;
+
+ if (!rgapp->sequencerCall("getPluginInformation()",
+ replyType, replyData, data)) {
+ SEQMAN_DEBUG << "getPluginInformation - "
+ << "failed to contact Rosegarden sequencer"
+ << endl;
+ } else {
+ QDataStream streamIn(replyData, IO_ReadOnly);
+ streamIn >> list;
+ }
+
+ return list;
+}
+
+QString
+StudioControl::getPluginProgram(MappedObjectId id, int bank, int program)
+{
+ QByteArray data;
+ QCString replyType;
+ QByteArray replyData;
+ QDataStream streamOut(data, IO_WriteOnly);
+
+ streamOut << (int)id;
+ streamOut << (int)bank;
+ streamOut << (int)program;
+
+ QString programName;
+
+ if (!rgapp->sequencerCall("getPluginProgram(int, int, int)",
+ replyType, replyData, data)) {
+ SEQMAN_DEBUG << "getPluginProgram - "
+ << "failed to contact Rosegarden sequencer"
+ << endl;
+ } else {
+ QDataStream streamIn(replyData, IO_ReadOnly);
+ streamIn >> programName;
+ }
+
+ return programName;
+}
+
+unsigned long
+StudioControl::getPluginProgram(MappedObjectId id, QString name)
+{
+ QByteArray data;
+ QCString replyType;
+ QByteArray replyData;
+ QDataStream streamOut(data, IO_WriteOnly);
+
+ streamOut << (int)id;
+ streamOut << name;
+
+ unsigned long rv;
+
+ if (!rgapp->sequencerCall("getPluginProgram(int, QString)",
+ replyType, replyData, data)) {
+ SEQMAN_DEBUG << "getPluginProgram - "
+ << "failed to contact Rosegarden sequencer"
+ << endl;
+ } else {
+ QDataStream streamIn(replyData, IO_ReadOnly);
+ streamIn >> rv;
+ }
+
+ return rv;
+}
+
+void
+StudioControl::connectStudioObjects(MappedObjectId id1,
+ MappedObjectId id2)
+{
+ Profiler profiler("StudioControl::connectStudioObjects", true);
+
+ QByteArray data;
+ QDataStream streamOut(data, IO_WriteOnly);
+
+ streamOut << (int)id1;
+ streamOut << (int)id2;
+
+ if (!rgapp->sequencerSend("connectMappedObjects(int, int)", data)) {
+ SEQMAN_DEBUG << "connectStudioObjects - "
+ << "failed to contact Rosegarden sequencer"
+ << endl;
+ }
+
+ return ;
+}
+
+void
+StudioControl::disconnectStudioObjects(MappedObjectId id1,
+ MappedObjectId id2)
+{
+ Profiler profiler("StudioControl::disconnectStudioObjects", true);
+
+ QByteArray data;
+ QDataStream streamOut(data, IO_WriteOnly);
+
+ streamOut << (int)id1;
+ streamOut << (int)id2;
+
+ if (!rgapp->sequencerSend("disconnectMappedObjects(int, int)", data)) {
+ SEQMAN_DEBUG << "disconnectStudioObjects - "
+ << "failed to contact Rosegarden sequencer"
+ << endl;
+ }
+
+ return ;
+}
+
+void
+StudioControl::disconnectStudioObject(MappedObjectId id)
+{
+ Profiler profiler("StudioControl::disconnectStudioObject", true);
+
+ QByteArray data;
+ QDataStream streamOut(data, IO_WriteOnly);
+
+ streamOut << (int)id;
+
+ if (!rgapp->sequencerSend("disconnectMappedObject(int)", data)) {
+ SEQMAN_DEBUG << "disconnectStudioObject - "
+ << "failed to contact Rosegarden sequencer"
+ << endl;
+ }
+
+ return ;
+}
+
+void
+StudioControl::sendMappedEvent(const MappedEvent &mE)
+{
+ Profiler profiler("StudioControl::sendMappedEvent", true);
+
+ static MappedEvent mEs;
+
+ mEs = mE; // just in case the passed mapped event has dubious
+ // origins and taking its address isn't safe
+
+ mEs.setPersistent(true); // to avoid that MappedComposition dtor try to free it
+
+ MappedComposition mC;
+ mC.insert(&mEs);
+ StudioControl::sendMappedComposition(mC);
+}
+
+void
+StudioControl::sendMappedComposition(const MappedComposition &mC)
+{
+ Profiler profiler("StudioControl::sendMappedComposition", true);
+
+ if (mC.size() == 0)
+ return ;
+
+ QCString replyType;
+ QByteArray replyData;
+
+ MappedComposition::const_iterator it = mC.begin();
+
+ for (; it != mC.end(); it++) {
+ QByteArray data;
+ QDataStream streamOut(data, IO_WriteOnly);
+
+ streamOut << (*it);
+ rgapp->sequencerSend("processMappedEvent(MappedEvent)", data);
+ }
+}
+
+void
+StudioControl::sendMappedInstrument(const MappedInstrument &mI)
+{
+ Profiler profiler("StudioControl::sendMappedInstrument", true);
+
+ QByteArray data;
+ QDataStream streamOut(data, IO_WriteOnly);
+
+ streamOut << (int)mI.getType();
+ streamOut << (unsigned char)mI.getChannel();
+ streamOut << (unsigned int)mI.getId();
+
+ rgapp->sequencerSend("setMappedInstrument(int, unsigned char, unsigned int)", data);
+}
+
+void
+StudioControl::sendQuarterNoteLength(const RealTime &length)
+{
+ Profiler profiler("StudioControl::sendQuarterNoteLength", true);
+
+ QByteArray data;
+ QDataStream streamOut(data, IO_WriteOnly);
+
+ streamOut << (long)length.sec;
+ streamOut << (long)length.nsec;
+
+ rgapp->sequencerSend("setQuarterNoteLength(long int, long int)", data);
+}
+
+void
+StudioControl::sendRPN(InstrumentId instrumentId,
+ MidiByte paramMSB,
+ MidiByte paramLSB,
+ MidiByte /* controller */,
+ MidiByte value)
+{
+ Profiler profiler("StudioControl::sendRPN", true);
+
+ MappedComposition mC;
+ MappedEvent *mE =
+ new MappedEvent(instrumentId,
+ MappedEvent::MidiController,
+ MIDI_CONTROLLER_RPN_2,
+ paramMSB);
+ mC.insert(mE);
+
+ mE = new MappedEvent(instrumentId,
+ MappedEvent::MidiController,
+ MIDI_CONTROLLER_RPN_1,
+ paramLSB);
+ mC.insert(mE);
+
+ mE = new MappedEvent(instrumentId,
+ MappedEvent::MidiController,
+ 6, // data value changed
+ value);
+ mC.insert(mE);
+
+
+ // Null the controller using - this is "best practice"
+ //
+ mE = new MappedEvent(instrumentId,
+ MappedEvent::MidiController,
+ MIDI_CONTROLLER_RPN_2,
+ MidiMaxValue); // null
+ mC.insert(mE);
+
+ mE = new MappedEvent(instrumentId,
+ MappedEvent::MidiController,
+ MIDI_CONTROLLER_RPN_1,
+ MidiMaxValue); // null
+ mC.insert(mE);
+
+
+ StudioControl::sendMappedComposition(mC);
+}
+
+void
+StudioControl::sendNRPN(InstrumentId instrumentId,
+ MidiByte paramMSB,
+ MidiByte paramLSB,
+ MidiByte /* controller */,
+ MidiByte value)
+{
+ Profiler profiler("StudioControl::sendNRPN", true);
+
+ MappedComposition mC;
+ MappedEvent *mE =
+ new MappedEvent(instrumentId,
+ MappedEvent::MidiController,
+ MIDI_CONTROLLER_NRPN_2,
+ paramMSB);
+ mC.insert(mE);
+
+ mE = new MappedEvent(instrumentId,
+ MappedEvent::MidiController,
+ MIDI_CONTROLLER_NRPN_1,
+ paramLSB);
+ mC.insert(mE);
+
+ mE = new MappedEvent(instrumentId,
+ MappedEvent::MidiController,
+ 6, // data value changed
+ value);
+ mC.insert(mE);
+
+
+ // Null the controller using - this is "best practice"
+ //
+ mE = new MappedEvent(instrumentId,
+ MappedEvent::MidiController,
+ MIDI_CONTROLLER_RPN_2,
+ MidiMaxValue); // null
+ mC.insert(mE);
+
+ mE = new MappedEvent(instrumentId,
+ MappedEvent::MidiController,
+ MIDI_CONTROLLER_RPN_1,
+ MidiMaxValue); // null
+ mC.insert(mE);
+}
+
+}
diff --git a/src/gui/studio/StudioControl.h b/src/gui/studio/StudioControl.h
new file mode 100644
index 0000000..cf05d44
--- /dev/null
+++ b/src/gui/studio/StudioControl.h
@@ -0,0 +1,152 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_STUDIOCONTROL_H_
+#define _RG_STUDIOCONTROL_H_
+
+#include "base/MidiProgram.h"
+#include "sound/MappedCommon.h"
+#include "sound/MappedStudio.h"
+#include <qstring.h>
+
+
+class MappedObjectValueList;
+class MappedObjectIdList;
+
+
+namespace Rosegarden
+{
+
+class RealTime;
+class MappedInstrument;
+class MappedEvent;
+class MappedComposition;
+
+typedef std::pair<Rosegarden::MidiByte, Rosegarden::MidiByte> MidiControlPair;
+
+class StudioControl
+{
+public:
+
+ // Object management
+ //
+ static MappedObjectId
+ createStudioObject(MappedObject::MappedObjectType type);
+ static MappedObjectId
+ getStudioObjectByType(MappedObject::MappedObjectType type);
+ static bool destroyStudioObject(MappedObjectId id);
+
+ // Properties
+ //
+ static MappedObjectPropertyList
+ getStudioObjectProperty(MappedObjectId id,
+ const MappedObjectProperty &property);
+
+ // Set a value to a value
+ //
+ static bool setStudioObjectProperty(MappedObjectId id,
+ const MappedObjectProperty &property,
+ MappedObjectValue value);
+
+ // Set many values to values
+ //
+ static bool setStudioObjectProperties(const MappedObjectIdList &ids,
+ const MappedObjectPropertyList &properties,
+ const MappedObjectValueList &values);
+
+ // Set a value to a string
+ //
+ static bool setStudioObjectProperty(MappedObjectId id,
+ const MappedObjectProperty &property,
+ const QString &value);
+
+ // Set a value to a string list
+ //
+ static bool setStudioObjectPropertyList(MappedObjectId id,
+ const MappedObjectProperty &property,
+ const MappedObjectPropertyList &values);
+
+ static void setStudioPluginPort(MappedObjectId pluginId,
+ unsigned long portId,
+ MappedObjectValue value);
+
+ static MappedObjectValue getStudioPluginPort(MappedObjectId pluginId,
+ unsigned long portId);
+
+ // Get all plugin information
+ //
+ static MappedObjectPropertyList getPluginInformation();
+
+ // Get program name for a given program
+ //
+ static QString getPluginProgram(MappedObjectId, int bank, int program);
+
+ // Get program numbers for a given name (rv is bank << 16 + program)
+ // This is one of the nastiest hacks in the whole application
+ //
+ static unsigned long getPluginProgram(MappedObjectId, QString name);
+
+ // Connection
+ //
+ static void connectStudioObjects(MappedObjectId id1,
+ MappedObjectId id2);
+ static void disconnectStudioObjects(MappedObjectId id1,
+ MappedObjectId id2);
+ static void disconnectStudioObject(MappedObjectId id);
+
+ // Send controllers and other one off MIDI events using these
+ // interfaces.
+ //
+ static void sendMappedEvent(const MappedEvent& mE);
+ static void sendMappedComposition(const MappedComposition &mC);
+
+ // MappedInstrument
+ //
+ static void sendMappedInstrument(const MappedInstrument &mI);
+
+ // Send the Quarter Note Length has changed to the sequencer
+ //
+ static void sendQuarterNoteLength(const RealTime &length);
+
+ // Convenience wrappers for RPNs and NRPNs
+ //
+ static void sendRPN(InstrumentId instrumentId,
+ MidiByte paramMSB,
+ MidiByte paramLSB,
+ MidiByte controller,
+ MidiByte value);
+
+ static void sendNRPN(InstrumentId instrumentId,
+ MidiByte paramMSB,
+ MidiByte paramLSB,
+ MidiByte controller,
+ MidiByte value);
+};
+
+
+
+}
+
+#endif
diff --git a/src/gui/studio/SynthPluginManagerDialog.cpp b/src/gui/studio/SynthPluginManagerDialog.cpp
new file mode 100644
index 0000000..f9a54ea
--- /dev/null
+++ b/src/gui/studio/SynthPluginManagerDialog.cpp
@@ -0,0 +1,360 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "SynthPluginManagerDialog.h"
+#include <qlayout.h>
+
+#include <klocale.h>
+#include "misc/Debug.h"
+#include "AudioPlugin.h"
+#include "AudioPluginManager.h"
+#include "AudioPluginOSCGUIManager.h"
+#include "base/AudioPluginInstance.h"
+#include "base/Instrument.h"
+#include "base/MidiProgram.h"
+#include "base/Studio.h"
+#include "document/RosegardenGUIDoc.h"
+#include "document/ConfigGroups.h"
+#include <kaction.h>
+#include <kcombobox.h>
+#include <kmainwindow.h>
+#include <kstdaction.h>
+#include <qframe.h>
+#include <qgroupbox.h>
+#include <qlabel.h>
+#include <qobject.h>
+#include <qpushbutton.h>
+#include <qsizepolicy.h>
+#include <qstring.h>
+#include <qwidget.h>
+
+
+namespace Rosegarden
+{
+
+SynthPluginManagerDialog::SynthPluginManagerDialog(QWidget *parent,
+ RosegardenGUIDoc *doc
+#ifdef HAVE_LIBLO
+ , AudioPluginOSCGUIManager *guiManager
+#endif
+ ) :
+ KMainWindow(parent, "synthpluginmanagerdialog"),
+ m_document(doc),
+ m_studio(&doc->getStudio()),
+ m_pluginManager(doc->getPluginManager())
+#ifdef HAVE_LIBLO
+ , m_guiManager(guiManager)
+#endif
+ {
+ setCaption(i18n("Manage Synth Plugins"));
+
+ QFrame *mainBox = new QFrame(this);
+ setCentralWidget(mainBox);
+
+ QVBoxLayout *mainLayout = new QVBoxLayout(mainBox, 10, 10);
+
+ QGroupBox *groupBox = new QGroupBox(1, Horizontal, i18n("Synth plugins"), mainBox);
+ mainLayout->addWidget(groupBox);
+
+ QFrame *pluginFrame = new QFrame(groupBox);
+ QGridLayout *pluginLayout = new QGridLayout(pluginFrame, 1, 4, 3, 3);
+
+ m_synthPlugins.clear();
+ m_synthPlugins.push_back( -1);
+
+ int count = 0;
+
+ for (PluginIterator itr = m_pluginManager->begin();
+ itr != m_pluginManager->end(); ++itr) {
+
+ if ((*itr)->isSynth()) {
+ m_synthPlugins.push_back(count);
+ }
+
+ ++count;
+ }
+
+ for (int i = 0; i < SoftSynthInstrumentCount; ++i) {
+
+ InstrumentId id = SoftSynthInstrumentBase + i;
+ Instrument *instrument = m_studio->getInstrumentById(id);
+ if (!instrument)
+ continue;
+
+ // pluginLayout->addWidget(new QLabel(instrument->getPresentationName().c_str(),
+ // pluginFrame), i, 0);
+ pluginLayout->addWidget(new QLabel(QString("%1").arg(i + 1),
+ pluginFrame), i, 0);
+
+ AudioPluginInstance *plugin = instrument->getPlugin
+ (Instrument::SYNTH_PLUGIN_POSITION);
+
+ std::string identifier;
+ if (plugin)
+ identifier = plugin->getIdentifier();
+
+ int currentItem = 0;
+
+ KComboBox *pluginCombo = new KComboBox(pluginFrame);
+ pluginCombo->insertItem(i18n("<none>"));
+
+ for (size_t j = 0; j < m_synthPlugins.size(); ++j) {
+
+ if (m_synthPlugins[j] == -1)
+ continue;
+
+ AudioPlugin *plugin =
+ m_pluginManager->getPlugin(m_synthPlugins[j]);
+
+ pluginCombo->insertItem(plugin->getName());
+
+ if (plugin->getIdentifier() == identifier.c_str()) {
+ pluginCombo->setCurrentItem(pluginCombo->count() - 1);
+ }
+ }
+
+ connect(pluginCombo, SIGNAL(activated(int)),
+ this, SLOT(slotPluginChanged(int)));
+
+ pluginLayout->addWidget(pluginCombo, i, 1);
+
+ m_synthCombos.push_back(pluginCombo);
+
+ QPushButton *controlsButton = new QPushButton(i18n("Controls"), pluginFrame);
+ pluginLayout->addWidget(controlsButton, i, 2);
+ connect(controlsButton, SIGNAL(clicked()), this, SLOT(slotControlsButtonClicked()));
+ m_controlsButtons.push_back(controlsButton);
+
+#ifdef HAVE_LIBLO
+
+ QPushButton *guiButton = new QPushButton(i18n("Editor >>"), pluginFrame);
+ pluginLayout->addWidget(guiButton, i, 3);
+ guiButton->setEnabled(m_guiManager->hasGUI
+ (id, Instrument::SYNTH_PLUGIN_POSITION));
+ connect(guiButton, SIGNAL(clicked()), this, SLOT(slotGUIButtonClicked()));
+ m_guiButtons.push_back(guiButton);
+#endif
+
+ }
+
+ QFrame* btnBox = new QFrame(mainBox);
+
+ btnBox->setSizePolicy(
+ QSizePolicy(QSizePolicy::Minimum, QSizePolicy::Fixed));
+
+ QPushButton *closeButton = new QPushButton(i18n("Close"), btnBox);
+
+ QHBoxLayout* layout = new QHBoxLayout(btnBox, 0, 10);
+ layout->addStretch(10);
+ layout->addWidget(closeButton);
+ layout->addSpacing(5);
+
+ KAction* close = KStdAction::close(this,
+ SLOT(slotClose()),
+ actionCollection());
+
+ closeButton->setText(close->text());
+ connect(closeButton, SIGNAL(clicked()), this, SLOT(slotClose()));
+
+ mainLayout->addWidget(btnBox);
+
+ createGUI("synthpluginmanager.rc");
+
+ setAutoSaveSettings(SynthPluginManagerConfigGroup, true);
+ }
+
+ SynthPluginManagerDialog::~SynthPluginManagerDialog()
+ {
+ RG_DEBUG << "\n*** SynthPluginManagerDialog::~SynthPluginManagerDialog()"
+ << endl;
+ }
+
+ void
+ SynthPluginManagerDialog::updatePlugin(InstrumentId id, int plugin)
+ {
+ if (id < SoftSynthInstrumentBase)
+ return ;
+ int row = id - SoftSynthInstrumentBase;
+ if (row >= m_synthCombos.size())
+ return ;
+
+ KComboBox *comboBox = m_synthCombos[row];
+
+ for (unsigned int i = 0; i < m_synthPlugins.size(); ++i) {
+ if (m_synthPlugins[i] == plugin) {
+ blockSignals(true);
+ comboBox->setCurrentItem(i);
+ blockSignals(false);
+ return ;
+ }
+ }
+
+ blockSignals(true);
+ comboBox->setCurrentItem(0);
+ blockSignals(false);
+ return ;
+ }
+
+ void
+ SynthPluginManagerDialog::slotClose()
+ {
+ close();
+ }
+
+ void
+ SynthPluginManagerDialog::closeEvent(QCloseEvent *e)
+ {
+ emit closing();
+ KMainWindow::closeEvent(e);
+ }
+
+ void
+ SynthPluginManagerDialog::slotGUIButtonClicked()
+ {
+ const QObject *s = sender();
+
+ int instrumentNo = -1;
+
+ for (unsigned int i = 0; i < m_guiButtons.size(); ++i) {
+ if (s == m_guiButtons[i])
+ instrumentNo = i;
+ }
+
+ if (instrumentNo == -1) {
+ RG_DEBUG << "WARNING: SynthPluginManagerDialog::slotGUIButtonClicked: unknown sender" << endl;
+ return ;
+ }
+
+ InstrumentId id = SoftSynthInstrumentBase + instrumentNo;
+
+ emit showPluginGUI(id, Instrument::SYNTH_PLUGIN_POSITION);
+ }
+
+ void
+ SynthPluginManagerDialog::slotControlsButtonClicked()
+ {
+ const QObject *s = sender();
+
+ int instrumentNo = -1;
+
+ for (unsigned int i = 0; i < m_controlsButtons.size(); ++i) {
+ if (s == m_controlsButtons[i])
+ instrumentNo = i;
+ }
+
+ if (instrumentNo == -1) {
+ RG_DEBUG << "WARNING: SynthPluginManagerDialog::slotControlsButtonClicked: unknown sender" << endl;
+ return ;
+ }
+
+ InstrumentId id = SoftSynthInstrumentBase + instrumentNo;
+
+ emit showPluginDialog(this, id, Instrument::SYNTH_PLUGIN_POSITION);
+ }
+
+ void
+ SynthPluginManagerDialog::slotPluginChanged(int index)
+ {
+ const QObject *s = sender();
+
+ RG_DEBUG << "SynthPluginManagerDialog::slotPluginChanged(" << index
+ << ")" << endl;
+
+ int instrumentNo = -1;
+
+ for (unsigned int i = 0; i < m_synthCombos.size(); ++i) {
+ if (s == m_synthCombos[i])
+ instrumentNo = i;
+ }
+
+ if (instrumentNo == -1) {
+ RG_DEBUG << "WARNING: SynthPluginManagerDialog::slotValueChanged: unknown sender" << endl;
+ return ;
+ }
+
+ InstrumentId id = SoftSynthInstrumentBase + instrumentNo;
+
+ if (index >= int(m_synthPlugins.size())) {
+ RG_DEBUG << "WARNING: SynthPluginManagerDialog::slotValueChanged: synth "
+ << index << " out of range" << endl;
+ return ;
+ }
+
+ // NB m_synthPlugins[0] is -1 to represent the <none> item
+
+ AudioPlugin *plugin = m_pluginManager->getPlugin(m_synthPlugins[index]);
+ Instrument *instrument = m_studio->getInstrumentById(id);
+
+ if (instrument) {
+
+ AudioPluginInstance *pluginInstance = instrument->getPlugin
+ (Instrument::SYNTH_PLUGIN_POSITION);
+
+ if (pluginInstance) {
+
+ if (plugin) {
+ RG_DEBUG << "plugin is " << plugin->getIdentifier() << endl;
+ pluginInstance->setIdentifier(plugin->getIdentifier().data());
+
+ // set ports to defaults
+
+ AudioPlugin::PortIterator it = plugin->begin();
+ int count = 0;
+
+ for (; it != plugin->end(); ++it) {
+
+ if (((*it)->getType() & PluginPort::Control) &&
+ ((*it)->getType() & PluginPort::Input)) {
+
+ if (pluginInstance->getPort(count) == 0) {
+ pluginInstance->addPort(count, (float)(*it)->getDefaultValue());
+ } else {
+ pluginInstance->getPort(count)->value = (*it)->getDefaultValue();
+ }
+ }
+
+ ++count;
+ }
+
+ } else {
+ pluginInstance->setIdentifier("");
+ }
+ }
+ }
+
+#ifdef HAVE_LIBLO
+ if (instrumentNo < m_guiButtons.size()) {
+ m_guiButtons[instrumentNo]->setEnabled
+ (m_guiManager->hasGUI
+ (id, Instrument::SYNTH_PLUGIN_POSITION));
+ }
+#endif
+
+ emit pluginSelected(id, Instrument::SYNTH_PLUGIN_POSITION,
+ m_synthPlugins[index]);
+ }
+
+ }
+#include "SynthPluginManagerDialog.moc"
diff --git a/src/gui/studio/SynthPluginManagerDialog.h b/src/gui/studio/SynthPluginManagerDialog.h
new file mode 100644
index 0000000..b66a338
--- /dev/null
+++ b/src/gui/studio/SynthPluginManagerDialog.h
@@ -0,0 +1,98 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_SYNTHPLUGINMANAGERDIALOG_H_
+#define _RG_SYNTHPLUGINMANAGERDIALOG_H_
+
+#include "base/MidiProgram.h"
+#include <kmainwindow.h>
+#include <vector>
+
+
+class QWidget;
+class QPushButton;
+class QCloseEvent;
+class KComboBox;
+
+
+namespace Rosegarden
+{
+
+class Studio;
+class RosegardenGUIDoc;
+class AudioPluginOSCGUIManager;
+class AudioPluginManager;
+
+
+class SynthPluginManagerDialog : public KMainWindow
+{
+ Q_OBJECT
+
+public:
+ SynthPluginManagerDialog(QWidget *parent,
+ RosegardenGUIDoc *doc
+#ifdef HAVE_LIBLO
+ , AudioPluginOSCGUIManager *guiManager
+#endif
+ );
+
+ virtual ~SynthPluginManagerDialog();
+
+ void updatePlugin(InstrumentId id, int plugin);
+
+signals:
+ void closing();
+ void pluginSelected(InstrumentId, int pluginIndex, int plugin);
+ void showPluginDialog(QWidget *, InstrumentId, int pluginIndex);
+ void showPluginGUI(InstrumentId, int pluginIndex);
+
+protected slots:
+ void slotClose();
+ void slotPluginChanged(int index);
+ void slotControlsButtonClicked();
+ void slotGUIButtonClicked();
+
+protected:
+ virtual void closeEvent(QCloseEvent *);
+
+protected:
+ RosegardenGUIDoc *m_document;
+ Studio *m_studio;
+ AudioPluginManager *m_pluginManager;
+ std::vector<int> m_synthPlugins;
+ std::vector<KComboBox *> m_synthCombos;
+ std::vector<QPushButton *> m_controlsButtons;
+ std::vector<QPushButton *> m_guiButtons;
+
+#ifdef HAVE_LIBLO
+ AudioPluginOSCGUIManager *m_guiManager;
+#endif
+};
+
+
+
+}
+
+#endif
diff --git a/src/gui/studio/TimerCallbackAssistant.cpp b/src/gui/studio/TimerCallbackAssistant.cpp
new file mode 100644
index 0000000..ec8518c
--- /dev/null
+++ b/src/gui/studio/TimerCallbackAssistant.cpp
@@ -0,0 +1,57 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "TimerCallbackAssistant.h"
+
+#include <qobject.h>
+#include <qtimer.h>
+
+
+namespace Rosegarden
+{
+
+TimerCallbackAssistant::TimerCallbackAssistant(int ms, void (*callback)(void *data),
+ void *data) :
+ m_callback(callback),
+ m_data(data)
+{
+ QTimer *timer = new QTimer(this);
+ connect(timer, SIGNAL(timeout()), this, SLOT(slotCallback()));
+ timer->start(ms, FALSE);
+}
+
+TimerCallbackAssistant::~TimerCallbackAssistant()
+{
+ // nothing -- the QTimer is deleted automatically by its parent QObject (me)
+}
+
+void
+TimerCallbackAssistant::slotCallback()
+{
+ m_callback(m_data);
+}
+
+}
+#include "TimerCallbackAssistant.moc"
diff --git a/src/gui/studio/TimerCallbackAssistant.h b/src/gui/studio/TimerCallbackAssistant.h
new file mode 100644
index 0000000..2a8e353
--- /dev/null
+++ b/src/gui/studio/TimerCallbackAssistant.h
@@ -0,0 +1,61 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_TIMERCALLBACKASSISTANT_H_
+#define _RG_TIMERCALLBACKASSISTANT_H_
+
+#include <qobject.h>
+
+
+
+
+namespace Rosegarden
+{
+
+
+/* This assistant class is here simply to work around the fact that
+ AudioPluginOSCGUI cannot be a QObject because it's only
+ conditionally compiled. */
+
+class TimerCallbackAssistant : public QObject
+{
+ Q_OBJECT
+
+public:
+ TimerCallbackAssistant(int ms, void (*callback)(void *data), void *data);
+ virtual ~TimerCallbackAssistant();
+
+protected slots:
+ void slotCallback();
+
+private:
+ void (*m_callback)(void *);
+ void *m_data;
+};
+
+
+}
+
+#endif
diff --git a/src/gui/ui/RosegardenTransport.ui b/src/gui/ui/RosegardenTransport.ui
new file mode 100644
index 0000000..347b30b
--- /dev/null
+++ b/src/gui/ui/RosegardenTransport.ui
@@ -0,0 +1,4361 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>RosegardenTransport</class>
+<widget class="QFrame">
+ <property name="name">
+ <cstring>RosegardenTransport</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>417</width>
+ <height>134</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Rosegarden Transport</string>
+ </property>
+ <property name="frameShape">
+ <enum>NoFrame</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Plain</enum>
+ </property>
+ <widget class="QFrame">
+ <property name="name">
+ <cstring>RecordingFrame</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>87</y>
+ <width>416</width>
+ <height>47</height>
+ </rect>
+ </property>
+ <property name="frameShape">
+ <enum>StyledPanel</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Raised</enum>
+ </property>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>PanelCloseButton</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>3</x>
+ <y>4</y>
+ <width>25</width>
+ <height>23</height>
+ </rect>
+ </property>
+ <property name="font">
+ <font>
+ <family>lucida</family>
+ <bold>1</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>image0</pixmap>
+ </property>
+ <property name="flat">
+ <bool>true</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Hide additional controls</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>PanicButton</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>174</x>
+ <y>4</y>
+ <width>42</width>
+ <height>38</height>
+ </rect>
+ </property>
+ <property name="font">
+ <font>
+ <family>lucidatypewriter</family>
+ <pointsize>8</pointsize>
+ </font>
+ </property>
+ <property name="cursor">
+ <cursor>0</cursor>
+ </property>
+ <property name="focusPolicy">
+ <enum>NoFocus</enum>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>image1</pixmap>
+ </property>
+ <property name="toggleButton">
+ <bool>false</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Panic Button</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Resets all MIDI devices if you've got stuck notes</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>MetronomeButton</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>217</x>
+ <y>4</y>
+ <width>42</width>
+ <height>38</height>
+ </rect>
+ </property>
+ <property name="font">
+ <font>
+ <family>lucidatypewriter</family>
+ <pointsize>8</pointsize>
+ </font>
+ </property>
+ <property name="cursor">
+ <cursor>0</cursor>
+ </property>
+ <property name="focusPolicy">
+ <enum>NoFocus</enum>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>image2</pixmap>
+ </property>
+ <property name="toggleButton">
+ <bool>true</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Metronome</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Provides a metronome click for you to play along with</string>
+ </property>
+ </widget>
+ <widget class="QFrame">
+ <property name="name">
+ <cstring>MidiEventFrame</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>31</x>
+ <y>7</y>
+ <width>137</width>
+ <height>34</height>
+ </rect>
+ </property>
+ <property name="palette">
+ <palette>
+ <active>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>192</red>
+ <green>192</green>
+ <blue>192</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>223</red>
+ <green>223</green>
+ <blue>223</blue>
+ </color>
+ <color>
+ <red>96</red>
+ <green>96</green>
+ <blue>96</blue>
+ </color>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ </active>
+ <disabled>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>192</red>
+ <green>192</green>
+ <blue>192</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>220</red>
+ <green>220</green>
+ <blue>220</blue>
+ </color>
+ <color>
+ <red>96</red>
+ <green>96</green>
+ <blue>96</blue>
+ </color>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ </disabled>
+ <inactive>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>192</red>
+ <green>192</green>
+ <blue>192</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>220</red>
+ <green>220</green>
+ <blue>220</blue>
+ </color>
+ <color>
+ <red>96</red>
+ <green>96</green>
+ <blue>96</blue>
+ </color>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ </inactive>
+ </palette>
+ </property>
+ <property name="frameShape">
+ <enum>StyledPanel</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Sunken</enum>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Shows MIDI activity in and out of Rosegarden</string>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>InLabel</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>18</x>
+ <y>1</y>
+ <width>25</width>
+ <height>16</height>
+ </rect>
+ </property>
+ <property name="palette">
+ <palette>
+ <active>
+ <color>
+ <red>192</red>
+ <green>216</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>192</red>
+ <green>192</green>
+ <blue>192</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>223</red>
+ <green>223</green>
+ <blue>223</blue>
+ </color>
+ <color>
+ <red>96</red>
+ <green>96</green>
+ <blue>96</blue>
+ </color>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ </active>
+ <disabled>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>192</red>
+ <green>192</green>
+ <blue>192</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>220</red>
+ <green>220</green>
+ <blue>220</blue>
+ </color>
+ <color>
+ <red>96</red>
+ <green>96</green>
+ <blue>96</blue>
+ </color>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ </disabled>
+ <inactive>
+ <color>
+ <red>192</red>
+ <green>216</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>192</red>
+ <green>192</green>
+ <blue>192</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>220</red>
+ <green>220</green>
+ <blue>220</blue>
+ </color>
+ <color>
+ <red>96</red>
+ <green>96</green>
+ <blue>96</blue>
+ </color>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ </inactive>
+ </palette>
+ </property>
+ <property name="font">
+ <font>
+ <family>lucida</family>
+ <italic>1</italic>
+ </font>
+ </property>
+ <property name="text">
+ <string>IN</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>OutLabel</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>8</x>
+ <y>15</y>
+ <width>25</width>
+ <height>16</height>
+ </rect>
+ </property>
+ <property name="palette">
+ <palette>
+ <active>
+ <color>
+ <red>192</red>
+ <green>216</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>192</red>
+ <green>192</green>
+ <blue>192</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>223</red>
+ <green>223</green>
+ <blue>223</blue>
+ </color>
+ <color>
+ <red>96</red>
+ <green>96</green>
+ <blue>96</blue>
+ </color>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ </active>
+ <disabled>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>192</red>
+ <green>192</green>
+ <blue>192</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>220</red>
+ <green>220</green>
+ <blue>220</blue>
+ </color>
+ <color>
+ <red>96</red>
+ <green>96</green>
+ <blue>96</blue>
+ </color>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ </disabled>
+ <inactive>
+ <color>
+ <red>192</red>
+ <green>216</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>192</red>
+ <green>192</green>
+ <blue>192</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>220</red>
+ <green>220</green>
+ <blue>220</blue>
+ </color>
+ <color>
+ <red>96</red>
+ <green>96</green>
+ <blue>96</blue>
+ </color>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ </inactive>
+ </palette>
+ </property>
+ <property name="font">
+ <font>
+ <family>lucida</family>
+ <italic>1</italic>
+ </font>
+ </property>
+ <property name="text">
+ <string>OUT</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>InDisplay</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>40</x>
+ <y>1</y>
+ <width>82</width>
+ <height>16</height>
+ </rect>
+ </property>
+ <property name="palette">
+ <palette>
+ <active>
+ <color>
+ <red>192</red>
+ <green>216</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>192</red>
+ <green>192</green>
+ <blue>192</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>223</red>
+ <green>223</green>
+ <blue>223</blue>
+ </color>
+ <color>
+ <red>96</red>
+ <green>96</green>
+ <blue>96</blue>
+ </color>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ </active>
+ <disabled>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>192</red>
+ <green>192</green>
+ <blue>192</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>220</red>
+ <green>220</green>
+ <blue>220</blue>
+ </color>
+ <color>
+ <red>96</red>
+ <green>96</green>
+ <blue>96</blue>
+ </color>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ </disabled>
+ <inactive>
+ <color>
+ <red>192</red>
+ <green>216</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>192</red>
+ <green>192</green>
+ <blue>192</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>220</red>
+ <green>220</green>
+ <blue>220</blue>
+ </color>
+ <color>
+ <red>96</red>
+ <green>96</green>
+ <blue>96</blue>
+ </color>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ </inactive>
+ </palette>
+ </property>
+ <property name="font">
+ <font>
+ <family>lucida</family>
+ <bold>1</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>NO EVENTS</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>OutDisplay</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>40</x>
+ <y>15</y>
+ <width>82</width>
+ <height>16</height>
+ </rect>
+ </property>
+ <property name="palette">
+ <palette>
+ <active>
+ <color>
+ <red>192</red>
+ <green>216</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>192</red>
+ <green>192</green>
+ <blue>192</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>223</red>
+ <green>223</green>
+ <blue>223</blue>
+ </color>
+ <color>
+ <red>96</red>
+ <green>96</green>
+ <blue>96</blue>
+ </color>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ </active>
+ <disabled>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>192</red>
+ <green>192</green>
+ <blue>192</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>220</red>
+ <green>220</green>
+ <blue>220</blue>
+ </color>
+ <color>
+ <red>96</red>
+ <green>96</green>
+ <blue>96</blue>
+ </color>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ </disabled>
+ <inactive>
+ <color>
+ <red>192</red>
+ <green>216</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>192</red>
+ <green>192</green>
+ <blue>192</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>220</red>
+ <green>220</green>
+ <blue>220</blue>
+ </color>
+ <color>
+ <red>96</red>
+ <green>96</green>
+ <blue>96</blue>
+ </color>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ </inactive>
+ </palette>
+ </property>
+ <property name="font">
+ <font>
+ <family>lucida</family>
+ <bold>1</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>NO EVENTS</string>
+ </property>
+ </widget>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>RecordButton</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>370</x>
+ <y>4</y>
+ <width>42</width>
+ <height>38</height>
+ </rect>
+ </property>
+ <property name="cursor">
+ <cursor>0</cursor>
+ </property>
+ <property name="focusPolicy">
+ <enum>NoFocus</enum>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>image3</pixmap>
+ </property>
+ <property name="toggleButton">
+ <bool>true</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Record</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Record either MIDI or audio</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>LoopButton</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>320</x>
+ <y>4</y>
+ <width>32</width>
+ <height>38</height>
+ </rect>
+ </property>
+ <property name="font">
+ <font>
+ <family>lucidatypewriter</family>
+ <pointsize>8</pointsize>
+ </font>
+ </property>
+ <property name="cursor">
+ <cursor>0</cursor>
+ </property>
+ <property name="focusPolicy">
+ <enum>NoFocus</enum>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>image4</pixmap>
+ </property>
+ <property name="toggleButton">
+ <bool>true</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Loop</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Turn on and off the loop markers (if set)</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>SoloButton</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>260</x>
+ <y>4</y>
+ <width>42</width>
+ <height>38</height>
+ </rect>
+ </property>
+ <property name="font">
+ <font>
+ <family>lucidatypewriter</family>
+ <pointsize>8</pointsize>
+ </font>
+ </property>
+ <property name="cursor">
+ <cursor>0</cursor>
+ </property>
+ <property name="focusPolicy">
+ <enum>NoFocus</enum>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>image5</pixmap>
+ </property>
+ <property name="toggleButton">
+ <bool>true</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Solo</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Mutes all but the currently selected track</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>SetStartLPButton</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>303</x>
+ <y>4</y>
+ <width>16</width>
+ <height>38</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>image6</pixmap>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Start loop or range here</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>SetStopLPButton</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>353</x>
+ <y>4</y>
+ <width>16</width>
+ <height>38</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>image7</pixmap>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>End loop or range here</string>
+ </property>
+ </widget>
+ </widget>
+ <widget class="QFrame">
+ <property name="name">
+ <cstring>MainFrame</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>416</width>
+ <height>87</height>
+ </rect>
+ </property>
+ <property name="frameShape">
+ <enum>StyledPanel</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Raised</enum>
+ </property>
+ <widget class="QFrame">
+ <property name="name">
+ <cstring>LCDBoxFrame</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>31</x>
+ <y>7</y>
+ <width>225</width>
+ <height>71</height>
+ </rect>
+ </property>
+ <property name="palette">
+ <palette>
+ <active>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>192</red>
+ <green>192</green>
+ <blue>192</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>223</red>
+ <green>223</green>
+ <blue>223</blue>
+ </color>
+ <color>
+ <red>96</red>
+ <green>96</green>
+ <blue>96</blue>
+ </color>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ </active>
+ <disabled>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>192</red>
+ <green>192</green>
+ <blue>192</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>220</red>
+ <green>220</green>
+ <blue>220</blue>
+ </color>
+ <color>
+ <red>96</red>
+ <green>96</green>
+ <blue>96</blue>
+ </color>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ </disabled>
+ <inactive>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>192</red>
+ <green>192</green>
+ <blue>192</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>220</red>
+ <green>220</green>
+ <blue>220</blue>
+ </color>
+ <color>
+ <red>96</red>
+ <green>96</green>
+ <blue>96</blue>
+ </color>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ </inactive>
+ </palette>
+ </property>
+ <property name="frameShape">
+ <enum>StyledPanel</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Sunken</enum>
+ </property>
+ <widget class="Rosegarden::Label">
+ <property name="name">
+ <cstring>UnitHoursPixmap</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>39</x>
+ <y>6</y>
+ <width>20</width>
+ <height>34</height>
+ </rect>
+ </property>
+ <property name="pixmap">
+ <pixmap>image8</pixmap>
+ </property>
+ <property name="scaledContents">
+ <bool>true</bool>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring></cstring>
+ </property>
+ </widget>
+ <widget class="Rosegarden::Label">
+ <property name="name">
+ <cstring>HourColonPixmap</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>59</x>
+ <y>6</y>
+ <width>5</width>
+ <height>34</height>
+ </rect>
+ </property>
+ <property name="pixmap">
+ <pixmap>image9</pixmap>
+ </property>
+ <property name="scaledContents">
+ <bool>true</bool>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring></cstring>
+ </property>
+ </widget>
+ <widget class="Rosegarden::Label">
+ <property name="name">
+ <cstring>TenMinutesPixmap</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>64</x>
+ <y>6</y>
+ <width>20</width>
+ <height>34</height>
+ </rect>
+ </property>
+ <property name="pixmap">
+ <pixmap>image8</pixmap>
+ </property>
+ <property name="scaledContents">
+ <bool>true</bool>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring></cstring>
+ </property>
+ </widget>
+ <widget class="Rosegarden::Label">
+ <property name="name">
+ <cstring>UnitMinutesPixmap</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>84</x>
+ <y>6</y>
+ <width>20</width>
+ <height>34</height>
+ </rect>
+ </property>
+ <property name="pixmap">
+ <pixmap>image8</pixmap>
+ </property>
+ <property name="scaledContents">
+ <bool>true</bool>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring></cstring>
+ </property>
+ </widget>
+ <widget class="Rosegarden::Label">
+ <property name="name">
+ <cstring>TenSecondsPixmap</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>109</x>
+ <y>6</y>
+ <width>20</width>
+ <height>34</height>
+ </rect>
+ </property>
+ <property name="pixmap">
+ <pixmap>image8</pixmap>
+ </property>
+ <property name="scaledContents">
+ <bool>true</bool>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring></cstring>
+ </property>
+ </widget>
+ <widget class="Rosegarden::Label">
+ <property name="name">
+ <cstring>UnitSecondsPixmap</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>129</x>
+ <y>6</y>
+ <width>20</width>
+ <height>34</height>
+ </rect>
+ </property>
+ <property name="pixmap">
+ <pixmap>image8</pixmap>
+ </property>
+ <property name="scaledContents">
+ <bool>true</bool>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring></cstring>
+ </property>
+ </widget>
+ <widget class="Rosegarden::Label">
+ <property name="name">
+ <cstring>HundredthsPixmap</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>169</x>
+ <y>16</y>
+ <width>14</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="pixmap">
+ <pixmap>image8</pixmap>
+ </property>
+ <property name="scaledContents">
+ <bool>true</bool>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring></cstring>
+ </property>
+ </widget>
+ <widget class="Rosegarden::Label">
+ <property name="name">
+ <cstring>NegativePixmap</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>2</x>
+ <y>6</y>
+ <width>20</width>
+ <height>34</height>
+ </rect>
+ </property>
+ <property name="pixmap">
+ <pixmap>image10</pixmap>
+ </property>
+ <property name="scaledContents">
+ <bool>true</bool>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring></cstring>
+ </property>
+ </widget>
+ <widget class="Rosegarden::Label">
+ <property name="name">
+ <cstring>TenHoursPixmap</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>19</x>
+ <y>6</y>
+ <width>20</width>
+ <height>34</height>
+ </rect>
+ </property>
+ <property name="pixmap">
+ <pixmap>image8</pixmap>
+ </property>
+ <property name="scaledContents">
+ <bool>true</bool>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring></cstring>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>TimeSigLabel</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>6</x>
+ <y>51</y>
+ <width>28</width>
+ <height>16</height>
+ </rect>
+ </property>
+ <property name="palette">
+ <palette>
+ <active>
+ <color>
+ <red>192</red>
+ <green>216</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>192</red>
+ <green>192</green>
+ <blue>192</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>223</red>
+ <green>223</green>
+ <blue>223</blue>
+ </color>
+ <color>
+ <red>96</red>
+ <green>96</green>
+ <blue>96</blue>
+ </color>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ </active>
+ <disabled>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>192</red>
+ <green>192</green>
+ <blue>192</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>220</red>
+ <green>220</green>
+ <blue>220</blue>
+ </color>
+ <color>
+ <red>96</red>
+ <green>96</green>
+ <blue>96</blue>
+ </color>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ </disabled>
+ <inactive>
+ <color>
+ <red>192</red>
+ <green>216</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>192</red>
+ <green>192</green>
+ <blue>192</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>220</red>
+ <green>220</green>
+ <blue>220</blue>
+ </color>
+ <color>
+ <red>96</red>
+ <green>96</green>
+ <blue>96</blue>
+ </color>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ </inactive>
+ </palette>
+ </property>
+ <property name="font">
+ <font>
+ <family>lucida</family>
+ <italic>1</italic>
+ </font>
+ </property>
+ <property name="text">
+ <string>SIG</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>DivisionLabel</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>66</x>
+ <y>51</y>
+ <width>24</width>
+ <height>16</height>
+ </rect>
+ </property>
+ <property name="palette">
+ <palette>
+ <active>
+ <color>
+ <red>192</red>
+ <green>216</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>192</red>
+ <green>192</green>
+ <blue>192</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>223</red>
+ <green>223</green>
+ <blue>223</blue>
+ </color>
+ <color>
+ <red>96</red>
+ <green>96</green>
+ <blue>96</blue>
+ </color>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ </active>
+ <disabled>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>192</red>
+ <green>192</green>
+ <blue>192</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>220</red>
+ <green>220</green>
+ <blue>220</blue>
+ </color>
+ <color>
+ <red>96</red>
+ <green>96</green>
+ <blue>96</blue>
+ </color>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ </disabled>
+ <inactive>
+ <color>
+ <red>192</red>
+ <green>216</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>192</red>
+ <green>192</green>
+ <blue>192</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>220</red>
+ <green>220</green>
+ <blue>220</blue>
+ </color>
+ <color>
+ <red>96</red>
+ <green>96</green>
+ <blue>96</blue>
+ </color>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ </inactive>
+ </palette>
+ </property>
+ <property name="font">
+ <font>
+ <family>lucida</family>
+ <italic>1</italic>
+ </font>
+ </property>
+ <property name="text">
+ <string>DIV</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>DivisionDisplay</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>86</x>
+ <y>51</y>
+ <width>27</width>
+ <height>16</height>
+ </rect>
+ </property>
+ <property name="palette">
+ <palette>
+ <active>
+ <color>
+ <red>192</red>
+ <green>216</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>192</red>
+ <green>192</green>
+ <blue>192</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>223</red>
+ <green>223</green>
+ <blue>223</blue>
+ </color>
+ <color>
+ <red>96</red>
+ <green>96</green>
+ <blue>96</blue>
+ </color>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ </active>
+ <disabled>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>192</red>
+ <green>192</green>
+ <blue>192</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>220</red>
+ <green>220</green>
+ <blue>220</blue>
+ </color>
+ <color>
+ <red>96</red>
+ <green>96</green>
+ <blue>96</blue>
+ </color>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ </disabled>
+ <inactive>
+ <color>
+ <red>192</red>
+ <green>216</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>192</red>
+ <green>192</green>
+ <blue>192</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>220</red>
+ <green>220</green>
+ <blue>220</blue>
+ </color>
+ <color>
+ <red>96</red>
+ <green>96</green>
+ <blue>96</blue>
+ </color>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ </inactive>
+ </palette>
+ </property>
+ <property name="font">
+ <font>
+ <family>lucida</family>
+ <bold>1</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>/16</string>
+ </property>
+ <property name="alignment">
+ <set>AlignVCenter|AlignRight</set>
+ </property>
+ <property name="hAlign" stdset="0">
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>TempoLabel</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>124</x>
+ <y>51</y>
+ <width>43</width>
+ <height>16</height>
+ </rect>
+ </property>
+ <property name="palette">
+ <palette>
+ <active>
+ <color>
+ <red>192</red>
+ <green>216</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>192</red>
+ <green>192</green>
+ <blue>192</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>223</red>
+ <green>223</green>
+ <blue>223</blue>
+ </color>
+ <color>
+ <red>96</red>
+ <green>96</green>
+ <blue>96</blue>
+ </color>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ </active>
+ <disabled>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>192</red>
+ <green>192</green>
+ <blue>192</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>220</red>
+ <green>220</green>
+ <blue>220</blue>
+ </color>
+ <color>
+ <red>96</red>
+ <green>96</green>
+ <blue>96</blue>
+ </color>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ </disabled>
+ <inactive>
+ <color>
+ <red>192</red>
+ <green>216</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>192</red>
+ <green>192</green>
+ <blue>192</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>220</red>
+ <green>220</green>
+ <blue>220</blue>
+ </color>
+ <color>
+ <red>96</red>
+ <green>96</green>
+ <blue>96</blue>
+ </color>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ </inactive>
+ </palette>
+ </property>
+ <property name="font">
+ <font>
+ <family>lucida</family>
+ <italic>1</italic>
+ </font>
+ </property>
+ <property name="text">
+ <string>TEMPO</string>
+ </property>
+ </widget>
+ <widget class="Rosegarden::Label">
+ <property name="name">
+ <cstring>TimeSigDisplay</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>23</x>
+ <y>51</y>
+ <width>33</width>
+ <height>16</height>
+ </rect>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>ToEndLabel</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>192</x>
+ <y>1</y>
+ <width>28</width>
+ <height>16</height>
+ </rect>
+ </property>
+ <property name="palette">
+ <palette>
+ <active>
+ <color>
+ <red>192</red>
+ <green>216</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>192</red>
+ <green>192</green>
+ <blue>192</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>223</red>
+ <green>223</green>
+ <blue>223</blue>
+ </color>
+ <color>
+ <red>96</red>
+ <green>96</green>
+ <blue>96</blue>
+ </color>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ </active>
+ <disabled>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>192</red>
+ <green>192</green>
+ <blue>192</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>220</red>
+ <green>220</green>
+ <blue>220</blue>
+ </color>
+ <color>
+ <red>96</red>
+ <green>96</green>
+ <blue>96</blue>
+ </color>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ </disabled>
+ <inactive>
+ <color>
+ <red>192</red>
+ <green>216</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>192</red>
+ <green>192</green>
+ <blue>192</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>220</red>
+ <green>220</green>
+ <blue>220</blue>
+ </color>
+ <color>
+ <red>96</red>
+ <green>96</green>
+ <blue>96</blue>
+ </color>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ </inactive>
+ </palette>
+ </property>
+ <property name="font">
+ <font>
+ <family>lucida</family>
+ <italic>1</italic>
+ </font>
+ </property>
+ <property name="text">
+ <string>END</string>
+ </property>
+ <property name="alignment">
+ <set>AlignVCenter|AlignRight</set>
+ </property>
+ <property name="hAlign" stdset="0">
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>TimeDisplayLabel</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>157</x>
+ <y>1</y>
+ <width>35</width>
+ <height>16</height>
+ </rect>
+ </property>
+ <property name="palette">
+ <palette>
+ <active>
+ <color>
+ <red>192</red>
+ <green>216</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>192</red>
+ <green>192</green>
+ <blue>192</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>223</red>
+ <green>223</green>
+ <blue>223</blue>
+ </color>
+ <color>
+ <red>96</red>
+ <green>96</green>
+ <blue>96</blue>
+ </color>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ </active>
+ <disabled>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>192</red>
+ <green>192</green>
+ <blue>192</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>220</red>
+ <green>220</green>
+ <blue>220</blue>
+ </color>
+ <color>
+ <red>96</red>
+ <green>96</green>
+ <blue>96</blue>
+ </color>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ </disabled>
+ <inactive>
+ <color>
+ <red>192</red>
+ <green>216</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>192</red>
+ <green>192</green>
+ <blue>192</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>220</red>
+ <green>220</green>
+ <blue>220</blue>
+ </color>
+ <color>
+ <red>96</red>
+ <green>96</green>
+ <blue>96</blue>
+ </color>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ </inactive>
+ </palette>
+ </property>
+ <property name="font">
+ <font>
+ <family>lucida</family>
+ <italic>1</italic>
+ </font>
+ </property>
+ <property name="text">
+ <string>BAR</string>
+ </property>
+ <property name="alignment">
+ <set>AlignVCenter|AlignRight</set>
+ </property>
+ <property name="hAlign" stdset="0">
+ </property>
+ </widget>
+ <widget class="Rosegarden::Label">
+ <property name="name">
+ <cstring>TenThousandthsPixmap</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>201</x>
+ <y>16</y>
+ <width>14</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="pixmap">
+ <pixmap>image8</pixmap>
+ </property>
+ <property name="scaledContents">
+ <bool>true</bool>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring></cstring>
+ </property>
+ </widget>
+ <widget class="Rosegarden::Label">
+ <property name="name">
+ <cstring>MinuteColonPixmap</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>104</x>
+ <y>6</y>
+ <width>5</width>
+ <height>34</height>
+ </rect>
+ </property>
+ <property name="pixmap">
+ <pixmap>image9</pixmap>
+ </property>
+ <property name="scaledContents">
+ <bool>true</bool>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring></cstring>
+ </property>
+ </widget>
+ <widget class="Rosegarden::Label">
+ <property name="name">
+ <cstring>SecondColonPixmap</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>183</x>
+ <y>14</y>
+ <width>4</width>
+ <height>27</height>
+ </rect>
+ </property>
+ <property name="pixmap">
+ <pixmap>image9</pixmap>
+ </property>
+ <property name="scaledContents">
+ <bool>true</bool>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring></cstring>
+ </property>
+ </widget>
+ <widget class="Rosegarden::Label">
+ <property name="name">
+ <cstring>HundredthColonPixmap</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>151</x>
+ <y>14</y>
+ <width>4</width>
+ <height>27</height>
+ </rect>
+ </property>
+ <property name="pixmap">
+ <pixmap>image9</pixmap>
+ </property>
+ <property name="scaledContents">
+ <bool>true</bool>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring></cstring>
+ </property>
+ </widget>
+ <widget class="Rosegarden::Label">
+ <property name="name">
+ <cstring>TenthsPixmap</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>155</x>
+ <y>16</y>
+ <width>14</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="pixmap">
+ <pixmap>image8</pixmap>
+ </property>
+ <property name="scaledContents">
+ <bool>true</bool>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring></cstring>
+ </property>
+ </widget>
+ <widget class="Rosegarden::Label">
+ <property name="name">
+ <cstring>ThousandthsPixmap</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>187</x>
+ <y>16</y>
+ <width>14</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="pixmap">
+ <pixmap>image8</pixmap>
+ </property>
+ <property name="scaledContents">
+ <bool>true</bool>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring></cstring>
+ </property>
+ </widget>
+ <widget class="Rosegarden::Label">
+ <property name="name">
+ <cstring>TempoDisplay</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>159</x>
+ <y>51</y>
+ <width>55</width>
+ <height>16</height>
+ </rect>
+ </property>
+ </widget>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>TimeDisplayButton</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>3</x>
+ <y>4</y>
+ <width>25</width>
+ <height>25</height>
+ </rect>
+ </property>
+ <property name="font">
+ <font>
+ <family>lucida</family>
+ <bold>1</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>image11</pixmap>
+ </property>
+ <property name="toggleButton">
+ <bool>false</bool>
+ </property>
+ <property name="flat">
+ <bool>true</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Switch between real time, musical time, and frame count</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>PanelOpenButton</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>3</x>
+ <y>56</y>
+ <width>25</width>
+ <height>25</height>
+ </rect>
+ </property>
+ <property name="font">
+ <font>
+ <family>lucida</family>
+ <bold>1</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>image12</pixmap>
+ </property>
+ <property name="toggleButton">
+ <bool>true</bool>
+ </property>
+ <property name="on">
+ <bool>true</bool>
+ </property>
+ <property name="flat">
+ <bool>true</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Show additional controls</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>RewindButton</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>260</x>
+ <y>4</y>
+ <width>42</width>
+ <height>38</height>
+ </rect>
+ </property>
+ <property name="cursor">
+ <cursor>0</cursor>
+ </property>
+ <property name="focusPolicy">
+ <enum>NoFocus</enum>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>image13</pixmap>
+ </property>
+ <property name="autoRepeat">
+ <bool>true</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Rewind</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Moves the current pointer position back one bar.</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>RewindEndButton</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>260</x>
+ <y>43</y>
+ <width>42</width>
+ <height>38</height>
+ </rect>
+ </property>
+ <property name="cursor">
+ <cursor>0</cursor>
+ </property>
+ <property name="focusPolicy">
+ <enum>NoFocus</enum>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>image14</pixmap>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Rewind to beginning</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Moves the pointer position to the start of the composition. (This may mean going forwards if the pointer is currently before the start.)</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>PlayButton</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>303</x>
+ <y>4</y>
+ <width>66</width>
+ <height>38</height>
+ </rect>
+ </property>
+ <property name="cursor">
+ <cursor>0</cursor>
+ </property>
+ <property name="focusPolicy">
+ <enum>NoFocus</enum>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>image15</pixmap>
+ </property>
+ <property name="toggleButton">
+ <bool>true</bool>
+ </property>
+ <property name="default">
+ <bool>false</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Play/Pause</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Plays from the current pointer position, or pauses playback if already in progress.</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>StopButton</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>303</x>
+ <y>43</y>
+ <width>66</width>
+ <height>38</height>
+ </rect>
+ </property>
+ <property name="cursor">
+ <cursor>0</cursor>
+ </property>
+ <property name="focusPolicy">
+ <enum>NoFocus</enum>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>image16</pixmap>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Stop</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Stops playback or recording.</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>FfwdButton</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>370</x>
+ <y>4</y>
+ <width>42</width>
+ <height>38</height>
+ </rect>
+ </property>
+ <property name="cursor">
+ <cursor>0</cursor>
+ </property>
+ <property name="focusPolicy">
+ <enum>NoFocus</enum>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>image17</pixmap>
+ </property>
+ <property name="autoRepeat">
+ <bool>true</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Fast forward</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Moves the current pointer position forwards one bar.</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>FfwdEndButton</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>370</x>
+ <y>43</y>
+ <width>42</width>
+ <height>38</height>
+ </rect>
+ </property>
+ <property name="cursor">
+ <cursor>0</cursor>
+ </property>
+ <property name="focusPolicy">
+ <enum>NoFocus</enum>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>image18</pixmap>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Fast forward to end</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Moves the pointer position to the end of the composition. (This may mean going backwards if the pointer is already beyond the end.)</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>ToEndButton</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>3</x>
+ <y>28</y>
+ <width>25</width>
+ <height>25</height>
+ </rect>
+ </property>
+ <property name="font">
+ <font>
+ <family>lucida</family>
+ <bold>1</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>image19</pixmap>
+ </property>
+ <property name="toggleButton">
+ <bool>true</bool>
+ </property>
+ <property name="flat">
+ <bool>true</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Display time to end</string>
+ </property>
+ </widget>
+ </widget>
+</widget>
+<customwidgets>
+ <customwidget>
+ <class>Rosegarden::Label</class>
+ <header location="local">gui/widgets/Label.h</header>
+ <sizehint>
+ <width>-1</width>
+ <height>-1</height>
+ </sizehint>
+ <container>0</container>
+ <sizepolicy>
+ <hordata>5</hordata>
+ <verdata>5</verdata>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ <pixmap>image20</pixmap>
+ </customwidget>
+</customwidgets>
+<images>
+ <image name="image0">
+ <data format="PNG" length="117">89504e470d0a1a0a0000000d494844520000000b0000000b0806000000a9ac77260000003c4944415418956360a02f6061f84facd2ff0c0c0cde509a28850c8434202b8401ac1ab029c4d0c088a49810606444e2e03299818181612b118651000006f40d0bd43b3a0f0000000049454e44ae426082</data>
+ </image>
+ <image name="image1">
+ <data format="PNG" length="233">89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b000000b049444154388de5d44d0a41511887f11fcac4c4c8166cc0166cc67a0c6dc0c0c0dc0694890c311029260694e2d635a0e496ee474794a74ea77f9df7e9edf49ec38f500a292ba3871362ecd109258f13eb98a59b22544289e789bc09255ea6e4c2e2454a2e2c5e7f4a3cce2bce4a0d91e7b835438961f69046a8a61dce33c793c7bec525a4b8effeac07396abe4703235cb1423b94b8ebf513daa51564bde32891cff9fa7a4f1d431c30452b94f80fb8017e53288b176e48270000000049454e44ae426082</data>
+ </image>
+ <image name="image2">
+ <data format="PNG" length="678">89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b0000026d49444154388dd594b18b954714c58feb351e7090237cc8ac04f30a4510ed421a0b0b0b5d6c74154c6cd244c93f10b0b6b188ff41c0264520e8be52510bc146110b51c1a86d40631267e1538eebf83e9bb7fabd64dd7d65729b19ee9cf9dd33979901fe6fb16e2d811a1d25b8e06a30080070f57c2965387515256d93749289b300c0e026355a1c0c061dc9874cbccfc44e8d5e2190a6834a3b99f8b7a42e37f905c9ad924e48ea98b848322110249f2ba953a3a3abf1663ecc027300b620f053694b43721f80e3a80080a1ed16151581a1abe1d627a6031b97197c05e3d438b31581393502830bcb3206872401608ec18dd3b523690713af93ec063b06ef247508bc60f0b39e6c03c932f87cd0493ab8b66300a52d4f097eaba445b79e6110a22eb97aa9277b0be06a2905000e4f051ec37f77f559db300c046efe5343f25710b07d0c81f553810180899541cc6a16a8f81e31a973ebeb0c2e29699b92be5c89b162b598891feba87ed1be6ee191b7a794fef06bdf595eafa3ea607c555d7779e49775a95e5bd3b19206e3ab0600570802c639256d9fd051972581e0a195ccfd0bccc4af49ceb8fa37b73e62f811029b0d5f50d29e65ddb33f9f2d187eabacbdfdfc27c1087c534a0183175dfd86c1d300c0e00157df53d2770060fbb95bdf766b8038b292eb7e1bf632b123f98ee4ee71a17539e72ee7fc8ba42708dcf8a06ff403c98e89b75607373a9b9bdc31f1ee447bc8f392460c7624cff7f2bb73933b499564fe34587a2ca9937466029c7a9b0213cf58490fc67b4ef7f313ff71ceb9736b20f080e45fab1eaf17a594fd0c0e4b5be63fd6ef85ed7904166cef713508c298620c02819fa735f2df8cf7e809f1988a2b677a0000000049454e44ae426082</data>
+ </image>
+ <image name="image3">
+ <data format="PNG" length="400">89504e470d0a1a0a0000000d4948445200000024000000160806000000a8b23e3e00000157494441544889edd6b14a1c411807f0df49f00a899ca056575da1410842848065ea60ef9b58f8009601df207d0211f20a36819026a085852914e1e2e55039f492dc976247104960c6bb0b08f7876966e7637fecce7eb34cf2c8521ba63898c53c66d2541f9d1aedff0a4a9097788d352ce0092ef0097bf83c0cac04d30cb682c3e05710f7c6efe028d80996c78d5908b683ef7f81dc1f57c16ed01a17a61e6c06df3230b7a39b9ee6ec3840ad602f18148022f812d53ecbca548169092f947f082dac06f5518356b15888a16a09cf64beb61250a370fddd7b344a16e7a68b41318748b55929011da053cca1874355d31c29e86b4295e61807356e460d3ac17b9c17d45ce3238e0a6af2938e8ddda097d17f7e06ef82e763c1dc412d076f82937f34c9417016bc0dd673fbcf6d1e7ada37f10a1b58c1d374e952b5813f601fa7b97b67285042d555bf1d73984ed37dfc40bb1432496efe00bc33c2225c6892300000000049454e44ae426082</data>
+ </image>
+ <image name="image4">
+ <data format="PNG" length="1360">89504e470d0a1a0a0000000d494844520000001e000000160806000000d7632ccf00000517494441544889c595df4f135914c7bf7377663ad3625b185a4263429cb2ac8b499ba5b8188d4e23613711b2215af561f7c997f5c1c87fb2cf3c9b6563021add0775d7043a86170544419b9520f127050af6c7303fee4c3bdd972d01a4467cd94f729f6e723fe7dc7bceb9c0ff04536f435114b6502834542a95e8a54b97a61f3d7a8477efde616d6d0df97c1ea6690200445184244908854288442248241218191939ee38ce0b5114b5999919e7b3c48aa2b09aa6f900444f9d3a3573fffe7dacadadc1b66d54ab5594cb65504ae1ba2e18860121043ccf8365591042c0711cc2e13092c9242627278f3b8ef322140a9554552dd715777676f23e9fefeb0b172e3cbb76edda0e618d6ab5bab500806198adb51d9ee7110a8570f1e2455cbf7efd3b5dd7ff79fdfab5f591585114d6308c6f8e1c39f2eceeddbba094826118088280a6a62644a3514422110c0f0feff93c972f5fae66b3592c2e2ee2c3870fb02c0baeeb82e338f4f6f6626161a19b523a9fc9646c0020db226c3a7dfaf4b37bf7ee41d334b02c8b68348aab57afa2adaded478ee30ed59302c0f0f030c3b2ec215996fb868686d0dede0e9ee7a1eb3ac6c7c7914c26a7fd7ebf544b960180aeae2ecee7f39d58595999c8e5726059168aa2c0308c41afd73b75e3c68de57ac2bd387bf66c0ba5b4471084dbaaaac2b66d84c361b4b6b6feb0b1b1a16632199b00403018f4cbb23c512a9550ad56118bc56018c6a0cfe74bef570a00376fde5c154571dc308cc1582c068661a0691a6459fe5b96653f00104551588661da676767a1eb3a00c034cddfbd5eefd3b1b1b1e27ea535c6c6c636bd5eef53cbb24600c0300ccccdcda152a9749c3f7f9e2700044ae9f7ebebeb5b05518f542ac57f4910aeebc2344dacafafc3719c2e003c711c87715d97d45ac4711cf03cff8b6118f1542a15d82e354df3dbcf95a552a906c330e23ccfff5c2e97b75a9010c2504a1996e338d375dd694992502c16615916e6e7e7914c266fe9ba3e78eedcb9298661d601042ccbea9565f9c9d2d252ddea4ea552bcebba8da669f688a278ebe1c387a094421004844221701c37ebf178285155b5cc71dc622c1683d7eb0500148b45a4d369e472b95bddddddef0dc3485a96251b8611dbdcdc44381caed6131b8671ece8d1a32babababb7d3e9348ac522188641434303e2f138388e5b181d1db55900a8542ac5376fdefc140c06ffdcdcdc84655928140a78fefc39debe7d8be6e6e6bfdadada400881a669b06d1b92245537363676675ebd73e70e1e3f7e8c62b1b8355a6b432897cbf5572a9522f0df005155d52284cc9d3973067ebf1f8490ad82c8e57278f9f2255455c5f4f4342ccb42a552413e9f8724491f65dedada8a5c2e07d334e1ba2e0821686c6cc4c0c0003c1ecf7c4f4f8f03ec1c9982e3388983070f4ea6d369944a25d8b6fdc92a2784a0a5a505d96cb6764e351008a0542a816118783c1e040201f4f5f5a150281c17046166747474e7c85455d5a294ce2e2f2f9fb872e50a3a3a3ad0dcdc0c51144108d953bc173ccfc3e7f3211c0ee3f0e1c3181a1a423e9f3f2608c2939a7447c635128904278a629010d2198fc7d30f1e3cc0caca0a4cd304a574ebb7aa5de1ae77ae46a3510483419c3c79120b0b0b0a2124a3695ae193dfe2ee009a9a9a1a1dc7e9ecefef9f989a9a422693c1e2e2221cc7413018dc2ddd175fd5dbc866b3eed2d2922e49d2fb57af5efd66dbf61fe57299d5753d218a625de9c0c080f7c08103c866b3f58b633f241289402291f8351289d4ede1fdf0f955031894d289e5e5e52fbedeedfc0bff3e8d2e6a3a39850000000049454e44ae426082</data>
+ </image>
+ <image name="image5">
+ <data format="PNG" length="364">89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b0000013349444154388dedd4bf4a034110c7f18f2141fc53092a884d6a3b5b0b7b5f208d4fa0d88a0fa058586a69616161ed1b08828501452cc43f85858546100de21f142dee8473d9e42e0a56fe60e06698f9eeeccedef2af02aa62058768e20d77b8c2054e718d06368a4267f0828f36f68e7bd48b42a77280597b6805294762f3815fc7266e3182d1f4fb0c5b45bb2539cf6c57d54e8abf548ac42a813f8ba19fc043ed8a0f6a1f4b988c2c5e4813788cc0b3d6c436a6c5e7d45255ac4aee69decdd8c740a7dd97d21d2ce3b80d7cbd5370a82ae67012801bbf056717c8829fc384d875cb535932b4ac2ef28afa308673df07f72af97d2fd3eec2335ec803d724af58acb895eda03b047505fe41daf58de475ebc7307a83bcc174076b58c4531eb886f1483c9b7f8523ecc580ed54414f27057faa4f01ea7bd4f97814ab0000000049454e44ae426082</data>
+ </image>
+ <image name="image6">
+ <data format="PNG" length="130">89504e470d0a1a0a0000000d494844520000000e00000010080600000026944e3a0000004949444154289163601868f01f8a090226120c245923561710d208d3c4488a469c9ab0091215300c0c0c8cc4060e0660c165220301a7e2b311a681ac50c5a999183f92ec54829ae90b007d450a172e17e6880000000049454e44ae426082</data>
+ </image>
+ <image name="image7">
+ <data format="PNG" length="130">89504e470d0a1a0a0000000d494844520000000e00000010080600000026944e3a00000049494441542891636018ace03f14c301130e450401368d4469c6a6919118cdb86c24a89928d3b1a8c769234500390a888a0e0624458c38e4f1c6234e4df86cc4ab099746829a06060000c15a0d0ef2df0b870000000049454e44ae426082</data>
+ </image>
+ <image name="image8">
+ <data format="XPM.GZ" length="923">789c9d924d0a83301085f739c5e0eca454ad1184d22314ba2c942e261169176e5abb28a577afd1980cfe54705cbd2fc973f2325108e7d311c2483c6baaef1af48d1e1016afaa7a5fae878f087631a4122424c146045bd080715b46a29132913a4f8d5446e6695ee8cc483252670595657b76a21639122b858e2b4efd7e6c3e5faae7481c2329c7492d72232c6ffeea8d8c58c747f6db757c64ef38bb2e2acf790acd02fecf1f87fb7b4e7c01c9f3619b1d1fb7b98a4fd8afe213f696b35bcd713b4a5d9f1c778367df8b4fa7cb9353b211cee6ffdd8b1f2c0ac43d</data>
+ </image>
+ <image name="image9">
+ <data format="XPM.GZ" length="412">789cd3d7528808f055d0d2e72a2e492cc94c5648ce482c52d04a29cdcdad8c8eb5ade652325530365130513054d2e152d253485650360003105719c435313449b630067193405c0b638b946453103711c44d364d494c4b03eb05017a3194131393c08ca4c444652a1808320fcc009947175fd45a730100351049ee</data>
+ </image>
+ <image name="image10">
+ <data format="XPM.GZ" length="923">789cd3d7528808f055d0d2e72a2e492cc94c5648ce482c52d04a29cdcdad8c8eb5ade65232325030365130513054d2e152d253485650360003105719c435313449b630067113415c0b638b946453103709c44d364d494c4b03ebc50246c5e92daeac9c0802ca68e2497080ae1ea21c5dfd80b97f8488d75a7301005e68a747</data>
+ </image>
+ <image name="image11">
+ <data format="PNG" length="83">89504e470d0a1a0a0000000d494844520000000b0000000b0806000000a9ac77260000001a49444154189563602013fc87629c624ca49836aa986cc5240100b319040db65cea050000000049454e44ae426082</data>
+ </image>
+ <image name="image12">
+ <data format="PNG" length="113">89504e470d0a1a0a0000000d494844520000000b0000000b0806000000a9ac7726000000384944415418956360a0156084d2ff8951cb82c4f1c1a3700b32c71b8fe9ffa1f228009b06ac0ab169c0ab10ae818385832885c836d011000071460bb64f8d4c3f0000000049454e44ae426082</data>
+ </image>
+ <image name="image13">
+ <data format="PNG" length="248">89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b000000bf49444154388dedd3b16a42311840e18fe2e050e82c38f7110a6eb6601ddcfa767d81ce5dba74ea26143a17bab9585727471d222236f9d3e8e2e0814b86737312fecbe5c239708ba7235c353ac773a3731544ef3045afd1814e107dc74da3db91bbf1c9d15cf821d818b93fec8f628c577433eff5f15670551658179e55e05e72b1fd514cf05b38f43370d7b5f0178685c03270590e3fde0f06dbf590c855c330c33dbe1b5d354cfa5507d26c5b5c354c9aeb233e1addbfe9627484bb90d80042ac3405a2aa17210000000049454e44ae426082</data>
+ </image>
+ <image name="image14">
+ <data format="PNG" length="226">89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b000000a949444154388dedd3210a02411406e00f316c50bc8547106c2aa8c1e6dd148cdec06c320b66c166d164f0046b70c3b2e830bb2a88f8c3f0c29bf9e63130fcf3ed69635ae6c00c695643e8098b32709a5b8fd2c125eb3f84eb656ecba16bb4429b6a9f40cbc2835894f8a718638524768ad8899701b4f90a3cc1f949aff10abc432f805786e1806e56df0ac3117decdf0d73ffc65d6cabc0f3422de68a113615068b4a82e1a7f01fc90dab2a1b4817a92dca0000000049454e44ae426082</data>
+ </image>
+ <image name="image15">
+ <data format="PNG" length="240">89504e470d0a1a0a0000000d4948445200000024000000140806000000e57a9f35000000b7494441544889edd4b109c2401886e107c546b4b372033b47b0710d67710d4b577009b1b2b6138434e20236b1300195e44c882629f2c20fc71d1fbcf71d1c1d61fa81b309a264bd47fc7f9d30d34422c601b36675de8562dcb1c6a040f6351705f62a09a573c4bc4d4245daaa5d289d13966d124a6783719b84625cb0a82ad40b085d4b5e608851c94c698ab6b3f36c342bf7b3272b2274c3ea4bae36a1cf561a13ca6ba511a1adfc566a153acbfe006b27ebd3eb6894072e56ba3745befe0b0000000049454e44ae426082</data>
+ </image>
+ <image name="image16">
+ <data format="PNG" length="105">89504e470d0a1a0a0000000d4948445200000024000000140806000000e57a9f3500000030494441544889edceb10d000008024175ff9d75041209dd5f4ff82ac0d3c676131ff3088922482148214821482108483b655f0118dca7db050000000049454e44ae426082</data>
+ </image>
+ <image name="image17">
+ <data format="PNG" length="249">89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b000000c049444154388dedd33d6a42411440e18f68914210ecdc804b10d249305aa473776e203bb0b1b20b08a9035980a6b1b0b21253f843c03777de08761e1806e63087cbc0f0e0de3412e713ecb1297459a658a157e82e3c05ae8b4ff40b5d360c1dcc1381c865c3d00e02495727fc3ff05ae8ae98e250b17698056e9c0b7f242e9f0329f77b0ea49ea295385f6319b8f75c387571806de0be4ac33f7839edb55cb346f41b43c7df56dbe5265e9ea6a98a462e0c2f3052fda6910b79c3f30deec1357f84474343c1d303120000000049454e44ae426082</data>
+ </image>
+ <image name="image18">
+ <data format="PNG" length="243">89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b000000ba49444154388dedd3316a02411487f11f89458a848087f008829d48d4c2cebb2958e61069acac7381c01e402b0b0f209b62151665dcb7d94db71f0c036f1edffb33ccd0f1df3c27ea4b9c716c7be0067b0c1ef4ac905ff65ae25c917898e8c94beb8ea78a017d6c1fc8935489e1fd2ff288b82c9fb42dbecabf306f227e4bd45ff0d944fc9aa81fb088887b91a692748c2cd21cbde30ca3a89458e21f7c287e6298aac4df8aa4b5a455e21d663825ced7377b88a9e2697534e717602c1d33e8c59cfe0000000049454e44ae426082</data>
+ </image>
+ <image name="image19">
+ <data format="PNG" length="155">89504e470d0a1a0a0000000d494844520000000b0000000b0806000000a9ac772600000062494441541895a5d0cb0980400c45d1a3b8746593b6623dd6611f8268093a6e14469951c407817c6e42127e2a24e200e50b78510c9f6091838b1bd862c58605fd7d48886cc41cef19fbd5d171163a0ca8d13ced1f3065f2c9c35385ecebb29ff8ac1d37bc1e2a162452d80000000049454e44ae426082</data>
+ </image>
+ <image name="image20">
+ <data format="PNG" length="324">89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b0000010b49444154388d9d95311284200c453f4c0acbad2d3d0e67dd9a2358ec21283dc316ccb0858b136302a24d66243e7ffe4771ebbaa2756d14ca37031301bc2e88aef51c8dc0784d3994898039eb2ff04fa0bc6e144a42284df028f4348180530fba203ae47f13ab5a7fcaa154ef0fc5a301cd393a4df9c98a843d88bbd03ab606df685ff3c098d22aa2050700f7febcca2854eb979e7bcba3112870f59ab431f8d5da8260fd72bdabd882ca2f4eaefb96626d7c99bea958a65ad36e4135f845b17613d883d1c6b7fe15b24fddc7550987574fad2f4edae9ad660e9741f5e007d84a5f0634b25b1c3f41ee0476b79efec75a604febe504a99e8e4064ff9ca373bdc3d4b2473beb360aa5deff0164ca87a1385f32640000000049454e44ae426082</data>
+ </image>
+</images>
+<tabstops>
+ <tabstop>PlayButton</tabstop>
+ <tabstop>StopButton</tabstop>
+ <tabstop>MetronomeButton</tabstop>
+ <tabstop>RecordButton</tabstop>
+ <tabstop>RewindEndButton</tabstop>
+ <tabstop>RewindButton</tabstop>
+ <tabstop>FfwdButton</tabstop>
+ <tabstop>FfwdEndButton</tabstop>
+</tabstops>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/src/gui/ui/audiomanager.rc b/src/gui/ui/audiomanager.rc
new file mode 100644
index 0000000..65188d2
--- /dev/null
+++ b/src/gui/ui/audiomanager.rc
@@ -0,0 +1,67 @@
+<!DOCTYPE kpartgui SYSTEM "kpartgui.dtd">
+
+<kpartgui name="Rosegarden::AudioManagerDialog" version="1230">
+
+<MenuBar>
+
+<Menu name="file">
+ <Action name="add_audio" append="new_merge"/>
+ <Action name="export_audio" append="new_merge"/>
+</Menu>
+
+<Menu name="edit">
+ <Action name="remove_audio"/>
+ <Action name="remove_all_audio"/>
+ <Action name="remove_all_unused_audio"/>
+ <Separator/>
+ <Action name="delete_unused_audio"/>
+</Menu>
+
+<Menu name="action">
+<Text>&amp;Action</Text>
+ <Action name="preview_audio"/>
+ <Action name="insert_audio"/>
+ <Action name="distribute_audio"/>
+</Menu>
+</MenuBar>
+
+<ToolBar name="General Toolbar">
+ <text>General Toolbar</text>
+
+ <Action name="add_audio" />
+ <Action name="export_audio" />
+ <Action name="remove_audio" />
+ <Action name="preview_audio" />
+ <Action name="insert_audio" />
+</ToolBar>
+
+<State name="have_audio_files">
+ <enable>
+ <Action name="remove_all_audio"/>
+ <Action name="remove_all_unused_audio"/>
+ <Action name="delete_unused_audio"/>
+ </enable>
+</State>
+
+<State name="have_audio_selected">
+ <enable>
+ <Action name="export_audio"/>
+ <Action name="remove_audio"/>
+ <Action name="rename_audio"/>
+ <Action name="distribute_audio"/>
+ </enable>
+</State>
+
+<State name="have_audible_preview">
+ <enable>
+ <Action name="preview_audio"/>
+ </enable>
+</State>
+
+<State name="have_audio_insertable">
+ <enable>
+ <Action name="insert_audio"/>
+ <enable>
+</State>
+
+</kpartgui>
diff --git a/src/gui/ui/bankeditor.rc b/src/gui/ui/bankeditor.rc
new file mode 100644
index 0000000..9d85e52
--- /dev/null
+++ b/src/gui/ui/bankeditor.rc
@@ -0,0 +1,22 @@
+<!DOCTYPE kpartgui SYSTEM "kpartgui.dtd">
+
+<kpartgui name="BankEditor" version="1230">
+
+<MenuBar>
+ <Menu name="file">
+ <Action name="file_close_discard"/>
+ </Menu>
+</MenuBar>
+
+<ToolBar name="mainToolBar">
+ <Action name="file_close"/>
+</ToolBar>
+
+<State name="on_bank_item">
+ <enable>
+ <Action name="edit_copy"/>
+ <Action name="edit_paste"/>
+ </enable>
+</State>
+
+</kpartgui>
diff --git a/src/gui/ui/clefinserter.rc b/src/gui/ui/clefinserter.rc
new file mode 100644
index 0000000..ade8806
--- /dev/null
+++ b/src/gui/ui/clefinserter.rc
@@ -0,0 +1,11 @@
+<!DOCTYPE kpartgui SYSTEM "kpartgui.dtd">
+
+<kpartgui name="Rosegarden::NotationTool" version="1230">
+
+<Menu noMerge="1" name="ClefInserter">
+ <Action name="select" />
+ <Action name="notes" />
+ <Action name="erase" />
+</Menu>
+
+</kpartgui>
diff --git a/src/gui/ui/controleditor.rc b/src/gui/ui/controleditor.rc
new file mode 100644
index 0000000..37b8aa6
--- /dev/null
+++ b/src/gui/ui/controleditor.rc
@@ -0,0 +1,5 @@
+<!DOCTYPE kpartgui SYSTEM "kpartgui.dtd">
+
+<kpartgui name="ControlEditor" version="1230">
+
+</kpartgui>
diff --git a/src/gui/ui/devicemanager.rc b/src/gui/ui/devicemanager.rc
new file mode 100644
index 0000000..27fc121
--- /dev/null
+++ b/src/gui/ui/devicemanager.rc
@@ -0,0 +1,5 @@
+<!DOCTYPE kpartgui SYSTEM "kpartgui.dtd">
+
+<kpartgui name="DeviceManager" version="1230">
+
+</kpartgui>
diff --git a/src/gui/ui/eventlist.rc b/src/gui/ui/eventlist.rc
new file mode 100644
index 0000000..96f8af0
--- /dev/null
+++ b/src/gui/ui/eventlist.rc
@@ -0,0 +1,105 @@
+<!DOCTYPE kpartgui SYSTEM "kpartgui.dtd">
+
+<kpartgui name="Rosegarden::EventList" version="1230">
+
+<MenuBar>
+
+<Menu name="file" append="new_merge">
+</Menu>
+
+<Menu name="edit" append="new_merge">
+ <Action name="insert"/>
+ <Action name="delete"/>
+ <Action name="edit_simple"/>
+ <Action name="edit_advanced"/>
+ <Separator/>
+ <Action name="select_all"/>
+ <Action name="clear_selection"/>
+ <Action name="filter_selection"/>
+ <Separator/>
+ <Action name="set_segment_start"/>
+ <Action name="set_segment_duration"/>
+</Menu>
+
+<Menu name="view"><text>&amp;View</text>
+ <Action name="time_musical"/>
+ <Action name="time_real"/>
+ <Action name="time_raw"/>
+</Menu>
+
+<Menu name="segment">
+ <text>Se&amp;gment</text>
+ <Menu name="open-with">
+ <text>Edit &amp;With</text>
+ <Action name="open_in_matrix"/>
+ <Action name="open_in_notation"/>
+ </Menu>
+</Menu>
+</MenuBar>
+
+<ToolBar name="Actions Toolbar">
+ <text>Actions Toolbar</text>
+ <Action name="insert"/>
+ <Action name="delete"/>
+ <Action name="edit_simple"/>
+ <Action name="edit_advanced"/>
+ <Action name="filter_selection"/>
+</ToolBar>
+
+<ToolBar name="Time Toolbar">
+ <text>Time Toolbar</text>
+ <Action name="time_musical"/>
+ <Action name="time_real"/>
+ <Action name="time_raw"/>
+</ToolBar>
+
+</kpartgui>
+
+<ToolBar name="Transport Toolbar">
+ <text>Transport Toolbar</text>
+
+ <Action name="playback_pointer_start" />
+ <Action name="playback_pointer_back_bar" />
+ <Action name="play" />
+ <Action name="playback_pointer_forward_bar" />
+ <Action name="playback_pointer_end" />
+ <Action name="stop" />
+ <Action name="playback_pointer_to_cursor" />
+ <Action name="cursor_to_playback_pointer" />
+ <Action name="toggle_solo"/>
+</ToolBar>
+
+<ToolBar name="Actions Toolbar">
+ <text>Actions Toolbar</text>
+</ToolBar>
+
+<ToolBar name="Zoom Toolbar">
+ <text>Zoom Toolbar</text>
+</ToolBar>
+
+<State name="have_selection">
+ <enable>
+ <Action name="edit_cut"/>
+ <Action name="edit_copy"/>
+ <Action name="delete"/>
+ <Action name="edit_simple"/>
+ <Action name="edit_advanced"/>
+ <Action name="clear_selection"/>
+ <Action name="filter_selection"/>
+ </enable>
+</State>
+
+<State name="have_clipboard_single_segment">
+ <enable>
+ <Action name="edit_paste"/>
+ </enable>
+</State>
+
+<State name="have_control_ruler">
+ <enable>
+ <Action name="show_control_rulers"/>
+ </enable>
+</State>
+
+</kpartgui>
+
diff --git a/src/gui/ui/markereditor.rc b/src/gui/ui/markereditor.rc
new file mode 100644
index 0000000..fd5d157
--- /dev/null
+++ b/src/gui/ui/markereditor.rc
@@ -0,0 +1,37 @@
+<!DOCTYPE kpartgui SYSTEM "kpartgui.dtd">
+
+<kpartgui name="MarkerEditor" version="1230">
+
+<MenuBar>
+
+ <Menu name="file">
+ <Action name="file_close_discard"/>
+ </Menu>
+
+ <Menu name="view"><text>&amp;View</text>
+ <Action name="time_musical"/>
+ <Action name="time_real"/>
+ <Action name="time_raw"/>
+ </Menu>
+
+</MenuBar>
+
+<ToolBar name="mainToolBar">
+ <Action name="file_close"/>
+</ToolBar>
+
+<ToolBar name="Time Toolbar">
+ <text>Time Toolbar</text>
+ <Action name="time_musical"/>
+ <Action name="time_real"/>
+ <Action name="time_raw"/>
+</ToolBar>
+
+<State name="on_control_item">
+ <enable>
+ <Action name="edit_insert"/>
+ <Action name="edit_delete"/>
+ </enable>
+</State>
+
+</kpartgui>
diff --git a/src/gui/ui/markerruler.rc b/src/gui/ui/markerruler.rc
new file mode 100644
index 0000000..6a2b9a5
--- /dev/null
+++ b/src/gui/ui/markerruler.rc
@@ -0,0 +1,14 @@
+<!DOCTYPE kpartgui SYSTEM "kpartgui.dtd">
+
+<kpartgui name="Rosegarden::MarkerRuler" version="1230">
+
+<Menu name="marker_ruler_menu">
+ <Action name="insert_marker_here" />
+ <Action name="insert_marker_at_pointer" />
+ <Separator/>
+ <Action name="delete_marker" />
+ <Separator/>
+ <Action name="edit_marker" />
+</Menu>
+
+</kpartgui>
diff --git a/src/gui/ui/matrix.rc b/src/gui/ui/matrix.rc
new file mode 100644
index 0000000..24b6159
--- /dev/null
+++ b/src/gui/ui/matrix.rc
@@ -0,0 +1,301 @@
+<!DOCTYPE kpartgui SYSTEM "kpartgui.dtd">
+
+<kpartgui name="Rosegarden::Matrix" version="1500">
+
+<MenuBar>
+
+<Menu name="file" append="new_merge">
+</Menu>
+
+<Menu name="edit">
+ <Action name="delete"/>
+ <Action name="select_all"/>
+ <Action name="clear_selection"/>
+ <Action name="filter_selection"/>
+</Menu>
+
+
+<Menu name="View">
+ <text>&amp;View</text>
+ <Menu name="Grid">
+ <text>&amp;Grid</text>
+ <Action name="snap_none"/>
+ <Action name="snap_unit"/>
+ <Action name="snap_64"/>
+ <Action name="snap_48"/>
+ <Action name="snap_32"/>
+ <Action name="snap_24"/>
+ <Action name="snap_16"/>
+ <Action name="snap_12"/>
+ <Action name="snap_8"/>
+ <Action name="snap_6"/>
+ <Action name="snap_4"/>
+ <Action name="snap_2"/>
+ <Action name="snap_beat"/>
+ <Action name="snap_bar"/>
+ </Menu>
+ <Separator/>
+ <Action name="show_velocity_control_ruler"/>
+ <Action name="show_controller_events_ruler"/>
+<!-- <Action name="add_control_ruler"/> -->
+ <Menu name="add_control_ruler"><text>Add Event Ruler</text></Menu>
+</Menu>
+
+<Menu name="document">
+ <text>&amp;Composition</text>
+ <Action name="add_tempo"/>
+ <Action name="add_time_signature"/>
+</Menu>
+<Menu name="segments">
+ <text>&amp;Segment</text>
+ <Menu name="open-with">
+ <text>Edit &amp;With</text>
+ <Action name="open_in_event_list"/>
+ <Action name="open_in_notation"/>
+ </Menu>
+ <Separator/>
+ <Action name="set_segment_start"/>
+ <Action name="set_segment_duration"/>
+</Menu>
+<Menu name="Transforms">
+ <text>Ad&amp;just</text>
+ <Menu name="quantize_notes">
+ <text>&amp;Quantize</text>
+ <Action name="quantize"/>
+ <Action name="repeat_quantize"/>
+ <Action name="legatoize"/>
+ </Menu>
+ <Action name="collapse_notes"/>
+ <Separator/>
+ <Action name="jog_left"/>
+ <Action name="jog_right"/>
+ <Separator/>
+ <Action name="velocity_up"/>
+ <Action name="velocity_down"/>
+ <Action name="set_to_current_velocity"/>
+ <Action name="set_velocities"/>
+ <Separator/>
+ <Menu name="Rescale">
+ <text>Rescale</text>
+ <Action name="halve_durations"/>
+ <Action name="double_durations"/>
+ <Separator/>
+ <Action name="rescale"/>
+ </Menu>
+ <Menu name="Transpose">
+ <text>Trans&amp;pose</text>
+ <Action name="transpose_up"/>
+ <Action name="transpose_down"/>
+ <Separator/>
+ <Action name="transpose_up_octave"/>
+ <Action name="transpose_down_octave"/>
+ <Separator/>
+ <Action name="general_transpose"/>
+ <Action name="general_diatonic_transpose"/>
+ </Menu>
+ <Menu name="Convert">
+ <text>Convert</text>
+ <Action name="invert"/>
+ <Action name="retrograde"/>
+ <Action name="retrograde_invert"/>
+ </Menu>
+ <Separator/>
+ <Action name="trigger_segment"/>
+ <Action name="remove_trigger"/>
+</Menu>
+
+
+<Menu name="Tools">
+ <text>&amp;Tools</text>
+ <Action name="select" />
+ <Action name="draw" />
+ <Action name="erase" />
+ <Action name="move" />
+ <Action name="resize" />
+ <Separator/>
+ <Menu name="Move">
+ <text>Local &amp;Cursor</text>
+ <Action name="cursor_back"/>
+ <Action name="cursor_forward"/>
+ <Action name="cursor_back_bar"/>
+ <Action name="cursor_forward_bar"/>
+ <Action name="cursor_start"/>
+ <Action name="cursor_end"/>
+ <Separator/>
+ <Action name="extend_selection_backward"/>
+ <Action name="extend_selection_forward"/>
+ <Action name="preview_selection"/>
+ <Action name="clear_loop"/>
+ <Separator/>
+ <Action name="cursor_to_playback_pointer"/>
+ <Action name="playback_pointer_to_cursor"/>
+ </Menu>
+
+ <Menu name="Transport">
+ <text>T&amp;ransport</text>
+ <Action name="play"/>
+ <Action name="stop"/>
+ <Action name="playback_pointer_back_bar"/>
+ <Action name="playback_pointer_forward_bar"/>
+ <Action name="playback_pointer_start"/>
+ <Action name="playback_pointer_end"/>
+ <Action name="playback_pointer_to_cursor" />
+ <Action name="cursor_to_playback_pointer" />
+ <Action name="toggle_solo"/>
+ <Action name="toggle_tracking"/>
+ <Action name="panic"/>
+ </Menu>
+
+ <Separator/>
+ <Action name="insert_note_actionmenu"/>
+ <Action name="chord_mode"/>
+
+ <Separator/>
+ <Action name="toggle_step_by_step"/>
+</Menu>
+
+<Menu name="settings" append="show_merge"><text>&amp;Settings</text>
+ <Menu name="toolbars" append="show_merge"><text>&amp;Toolbars</text>
+ <Action name="options_show_toolbar" append="show_merge" />
+ <Action name="show_tools_toolbar" append="show_merge" />
+ <Action name="options_show_statusbar" append="show_merge" />
+ </Menu>
+ <Menu name="rulers" append="show_merge"><text>&amp;Rulers</text>
+ <Action name="show_chords_ruler" append="show_merge" />
+ <Action name="show_tempo_ruler" append="show_merge" />
+ </Menu>
+ <Separator append="show_merge" />
+ <Action name="show_inst_parameters" append="show_merge" />
+</Menu>
+
+
+</MenuBar>
+
+<ToolBar name="Tools Toolbar">
+ <text>Tools Toolbar</text>
+
+ <Action name="select" />
+ <Action name="draw" />
+ <Action name="erase" />
+ <Action name="move" />
+ <Action name="resize" />
+ <Separator/>
+ <Action name="toggle_step_by_step"/>
+ <Action name="filter_selection"/>
+ <Action name="quantize"/>
+</ToolBar>
+
+<ToolBar name="Transport Toolbar">
+ <text>Transport Toolbar</text>
+
+ <Action name="playback_pointer_start" />
+ <Action name="playback_pointer_back_bar" />
+ <Action name="play" />
+ <Action name="playback_pointer_forward_bar" />
+ <Action name="playback_pointer_end" />
+ <Action name="stop" />
+ <Action name="playback_pointer_to_cursor" />
+ <Action name="cursor_to_playback_pointer" />
+ <Action name="toggle_solo"/>
+ <Action name="toggle_tracking"/>
+ <Action name="panic"/>
+</ToolBar>
+
+<ToolBar name="Actions Toolbar">
+ <text>Actions Toolbar</text>
+</ToolBar>
+
+<ToolBar name="Zoom Toolbar">
+ <text>Zoom Toolbar</text>
+</ToolBar>
+
+<Menu noMerge="1" name="controller_events_ruler_menu">
+ <Text>Control Ruler actions</Text>
+ <Action name="insert_control_ruler_item"/>
+ <Action name="erase_control_ruler_item"/>
+ <Action name="clear_control_ruler_item"/>
+ <Separator/>
+ <Action name="start_control_line_item"/>
+ <Separator/>
+ <Action name="flip_control_events_forward"/>
+ <Action name="flip_control_events_back"/>
+</Menu>
+
+<Menu noMerge="1" name="property_ruler_menu">
+ <Text>Property Ruler actions</Text>
+ <Action name="draw_property_line"/>
+ <Action name="select_all_properties"/>
+ <Separator/>
+ <Action name="flip_control_events_forward"/>
+ <Action name="flip_control_events_back"/>
+</Menu>
+
+
+<State name="have_selection">
+ <enable>
+ <Action name="edit_cut"/>
+ <Action name="edit_copy"/>
+ <Action name="quantize"/>
+ <Action name="collapse_notes"/>
+ <Action name="legatoize"/>
+ <Action name="rescale"/>
+ <Action name="double_durations"/>
+ <Action name="halve_durations"/>
+ <Action name="velocity_up"/>
+ <Action name="velocity_down"/>
+ <Action name="jog_left"/>
+ <Action name="jog_right"/>
+ <Action name="set_to_current_velocity"/>
+ <Action name="set_velocities"/>
+ <Action name="trigger_segment"/>
+ <Action name="remove_trigger"/>
+ <Action name="transpose_up"/>
+ <Action name="transpose_down"/>
+ <Action name="transpose_up_octave"/>
+ <Action name="transpose_down_octave"/>
+ <Action name="general_transpose"/>
+ <Action name="general_diatonic_transpose"/>
+ <Action name="invert"/>
+ <Action name="retrograde"/>
+ <Action name="retrograde_invert"/>
+ <Action name="preview_selection"/>
+ <Action name="clear_selection"/>
+ <Action name="filter_selection"/>
+ </enable>
+</State>
+
+<State name="have_clipboard_single_segment">
+ <enable>
+ <Action name="edit_paste"/>
+ </enable>
+</State>
+
+<State name="have_note_events_in_segment">
+ <enable>
+ <Action name="draw_property_line"/>
+ </enable>
+</State>
+
+<State name="have_control_ruler">
+ <enable>
+ <Action name="show_control_rulers"/>
+ </enable>
+</State>
+
+<State name="have_controller_item_selected">
+ <enable>
+ <Action name="erase_control_ruler_item"/>
+ </enable>
+ <disable>
+ <Action name="insert_control_ruler_item"/>
+ </disable>
+</State>
+
+<State name="parametersbox_closed">
+ <enable>
+ <Action name="show_inst_parameters" />
+ </enable>
+</State>
+
+</kpartgui>
+
diff --git a/src/gui/ui/matrixeraser.rc b/src/gui/ui/matrixeraser.rc
new file mode 100644
index 0000000..20694d4
--- /dev/null
+++ b/src/gui/ui/matrixeraser.rc
@@ -0,0 +1,15 @@
+<!DOCTYPE kpartgui SYSTEM "kpartgui.dtd">
+
+<kpartgui name="Rosegarden::MatrixTool" version="1230">
+
+<Menu name="MatrixEraser">
+ <Action name="select" />
+ <Action name="move"/>
+ <Action name="draw"/>
+ <Action name="resize"/>
+<!-- <Separator/> -->
+<!-- Defunct: <Action name="halve_durations"/> -->
+<!-- Defunct: <Action name="double_durations"/> -->
+</Menu>
+
+</kpartgui>
diff --git a/src/gui/ui/matrixmover.rc b/src/gui/ui/matrixmover.rc
new file mode 100644
index 0000000..2d0d555
--- /dev/null
+++ b/src/gui/ui/matrixmover.rc
@@ -0,0 +1,15 @@
+<!DOCTYPE kpartgui SYSTEM "kpartgui.dtd">
+
+<kpartgui name="Rosegarden::MatrixTool" version="1230">
+
+<Menu name="MatrixMover">
+ <Action name="select"/>
+ <Action name="draw" />
+ <Action name="erase"/>
+ <Action name="resize"/>
+<!-- <Separator/> -->
+<!-- Defunct: <Action name="halve_durations"/> -->
+<!-- Defunct: <Action name="double_durations"/> -->
+</Menu>
+
+</kpartgui>
diff --git a/src/gui/ui/matrixpainter.rc b/src/gui/ui/matrixpainter.rc
new file mode 100644
index 0000000..9b4cbce
--- /dev/null
+++ b/src/gui/ui/matrixpainter.rc
@@ -0,0 +1,22 @@
+<!DOCTYPE kpartgui SYSTEM "kpartgui.dtd">
+
+<kpartgui name="Rosegarden::MatrixTool" version="1230">
+
+<Menu name="MatrixPainter">
+ <Action name="select" />
+ <Action name="move"/>
+ <Action name="erase"/>
+ <Action name="resize"/>
+<!-- <Separator/> -->
+<!-- Defunct: <Action name="halve_durations"/> -->
+<!-- Defunct: <Action name="double_durations"/> -->
+</Menu>
+
+<!-- Defunct: <State name="have_selection"> -->
+<!-- <enable> -->
+<!-- <Action name="halve_durations"/> -->
+<!-- <Action name="double_durations"/> -->
+<!-- </enable> -->
+<!--</State> -->
+
+</kpartgui>
diff --git a/src/gui/ui/matrixresizer.rc b/src/gui/ui/matrixresizer.rc
new file mode 100644
index 0000000..8d85634
--- /dev/null
+++ b/src/gui/ui/matrixresizer.rc
@@ -0,0 +1,15 @@
+<!DOCTYPE kpartgui SYSTEM "kpartgui.dtd">
+
+<kpartgui name="Rosegarden::MatrixTool" version="1230">
+
+<Menu name="MatrixResizer">
+ <Action name="select" />
+ <Action name="move"/>
+ <Action name="draw"/>
+ <Action name="erase"/>
+<!-- <Separator/> -->
+<!-- Defunct: <Action name="halve_durations"/> -->
+<!-- Defunct: <Action name="double_durations"/> -->
+</Menu>
+
+</kpartgui>
diff --git a/src/gui/ui/matrixselector.rc b/src/gui/ui/matrixselector.rc
new file mode 100644
index 0000000..cb8ec41
--- /dev/null
+++ b/src/gui/ui/matrixselector.rc
@@ -0,0 +1,15 @@
+<!DOCTYPE kpartgui SYSTEM "kpartgui.dtd">
+
+<kpartgui name="Rosegarden::MatrixTool" version="1230">
+
+<Menu name="MatrixSelector">
+ <Action name="draw" />
+ <Action name="move"/>
+ <Action name="erase"/>
+ <Action name="resize"/>
+<!-- <Separator/> -->
+<!-- Defunct: <Action name="halve_durations"/> -->
+<!-- Defunct: <Action name="double_durations"/> -->
+</Menu>
+
+</kpartgui>
diff --git a/src/gui/ui/midimixer.rc b/src/gui/ui/midimixer.rc
new file mode 100644
index 0000000..6ac7bb4
--- /dev/null
+++ b/src/gui/ui/midimixer.rc
@@ -0,0 +1,34 @@
+<!DOCTYPE kpartgui SYSTEM "kpartgui.dtd">
+
+<kpartgui name="Rosegarden::MidiMixer" version="1230">
+
+<MenuBar>
+
+ <Menu name="Transport">
+ <text>T&amp;ransport</text>
+ <Action name="play" />
+ <Action name="stop" />
+ <Action name="playback_pointer_back_bar" />
+ <Action name="playback_pointer_forward_bar" />
+ <Action name="playback_pointer_start" />
+ <Action name="playback_pointer_end" />
+ <Action name="record" />
+ <Action name="panic" />
+ </Menu>
+
+</MenuBar>
+
+<ToolBar name="Transport Toolbar">
+ <text>Transport Toolbar</text>
+ <Action name="playback_pointer_start" />
+ <Action name="playback_pointer_back_bar" />
+ <Action name="play" />
+ <Action name="playback_pointer_forward_bar" />
+ <Action name="playback_pointer_end" />
+ <Action name="stop" />
+ <Action name="record" />
+ <Action name="panic" />
+</ToolBar>
+
+</kpartgui>
+
diff --git a/src/gui/ui/mixer.rc b/src/gui/ui/mixer.rc
new file mode 100644
index 0000000..6dcef9f
--- /dev/null
+++ b/src/gui/ui/mixer.rc
@@ -0,0 +1,65 @@
+<!DOCTYPE kpartgui SYSTEM "kpartgui.dtd">
+
+<kpartgui name="Rosegarden::Mixer" version="1230">
+
+<MenuBar>
+
+ <Menu name="Transport">
+ <text>T&amp;ransport</text>
+ <Action name="play" />
+ <Action name="stop" />
+ <Action name="playback_pointer_back_bar" />
+ <Action name="playback_pointer_forward_bar" />
+ <Action name="playback_pointer_start" />
+ <Action name="playback_pointer_end" />
+ <Action name="record" />
+ <Action name="panic" />
+ </Menu>
+
+<Menu name="settings"><text>&amp;Settings</text>
+
+ <Action name="show_midi" append="show_merge" />
+ <Action name="show_audio_faders" append="show_merge" />
+ <Action name="show_synth_faders" append="show_merge" />
+ <Action name="show_audio_submasters" append="show_merge" />
+ <Action name="show_plugin_buttons" append="show_merge" />
+
+ <Separator append="show_merge"/>
+
+ <Action name="show_unassigned_faders" append="show_merge" />
+
+ <Menu name="Inputs">
+ <text>Number of Stereo &amp;Inputs</text>
+ <Action name="inputs_1"/>
+ <Action name="inputs_2"/>
+ <Action name="inputs_4"/>
+ <Action name="inputs_8"/>
+ <Action name="inputs_16"/>
+ </Menu>
+
+ <Menu name="Submasters">
+ <text>&amp;Number of Submasters</text>
+ <Action name="submasters_0"/>
+ <Action name="submasters_2"/>
+ <Action name="submasters_4"/>
+ <Action name="submasters_8"/>
+ </Menu>
+
+</Menu>
+
+</MenuBar>
+
+<ToolBar name="Transport Toolbar">
+ <text>Transport Toolbar</text>
+ <Action name="playback_pointer_start" />
+ <Action name="playback_pointer_back_bar" />
+ <Action name="play" />
+ <Action name="playback_pointer_forward_bar" />
+ <Action name="playback_pointer_end" />
+ <Action name="stop" />
+ <Action name="record" />
+ <Action name="panic" />
+</ToolBar>
+
+</kpartgui>
+
diff --git a/src/gui/ui/notation.rc b/src/gui/ui/notation.rc
new file mode 100644
index 0000000..be6f23b
--- /dev/null
+++ b/src/gui/ui/notation.rc
@@ -0,0 +1,853 @@
+<!DOCTYPE kpartgui SYSTEM "kpartgui.dtd">
+
+<kpartgui name="Rosegarden::Notation" version="1500">
+
+<MenuBar>
+
+<Menu name="file" append="new_merge">
+<Action name="file_print_lilypond" append="print_merge" />
+<Action name="file_preview_lilypond" append="print_merge" />
+</Menu>
+
+<Menu name="edit">
+ <Action name="cut_and_close"/>
+ <Action name="general_paste"/>
+ <Action name="delete"/>
+ <Separator/>
+ <Action name="move_events_up_staff"/>
+ <Action name="move_events_down_staff"/>
+ <Separator/>
+ <Action name="select_from_start"/>
+ <Action name="select_to_end"/>
+ <Action name="select_whole_staff"/>
+ <Action name="clear_selection"/>
+ <Action name="filter_selection"/>
+</Menu>
+
+<Menu name="View">
+ <text>&amp;View</text>
+<!--
+<Action name="debug_dump"/>
+<Separator/>
+-->
+ <Action name="note_font_actionmenu"/>
+ <Action name="note_font_size_actionmenu"/>
+ <Action name="stretch_actionmenu"/>
+ <Action name="proportion_actionmenu"/>
+<Separator/>
+ <Menu name="layout"><text>&amp;Layout Mode</text>
+ <Action name="linear_mode"/>
+ <Action name="continuous_page_mode"/>
+ <Action name="multi_page_mode"/>
+ </Menu>
+<Separator/>
+ <Action name="lyric_editor"/>
+ <Separator/>
+ <Action name="show_velocity_control_ruler"/>
+ <Action name="show_controller_events_ruler"/>
+<!-- <Action name="add_control_ruler"/> -->
+ <Menu name="add_control_ruler"><text>Add Event Ruler</text></Menu>
+ <Separator/>
+ <Action name="show_track_headers"/>
+</Menu>
+
+<Menu name="document">
+ <text>&amp;Composition</text>
+ <Action name="add_tempo"/>
+ <Action name="add_time_signature"/>
+</Menu>
+
+<Menu name="segment">
+ <text>Se&amp;gment</text>
+ <Menu name="open-with">
+ <text>Edit &amp;With</text>
+ <Action name="open_in_event_list"/>
+ <Action name="open_in_matrix"/>
+ <Action name="open_in_percussion_matrix"/>
+ </Menu>
+ <Separator/>
+ <Action name="add_clef"/>
+ <Action name="add_key_signature"/>
+ <Separator/>
+ <Action name="add_sustain_down"/>
+ <Action name="add_sustain_up"/>
+ <Separator/>
+ <Action name="set_segment_start"/>
+ <Action name="set_segment_duration"/>
+ <Separator/>
+ <Action name="transpose_segment"/>
+ <Action name="switch_preset"/>
+</Menu>
+
+
+<Menu name="Notes">
+ <text>N&amp;ote</text>
+ <Separator/>
+ <Menu name="Marks">
+ <text>Mar&amp;ks</text>
+ <Action name="add_accent"/>
+ <Action name="add_tenuto"/>
+ <Action name="add_staccato"/>
+ <Action name="add_staccatissimo"/>
+ <Action name="add_marcato"/>
+ <Action name="add_text_sf"/>
+ <Action name="add_text_rf"/>
+ <Separator/>
+ <Action name="add_trill"/>
+ <Action name="add_long-trill"/>
+ <Action name="add_trill-line"/>
+ <Action name="add_turn"/>
+ <Action name="add_mordent"/>
+ <Action name="add_mordent-inverted"/>
+ <Action name="add_mordent-long"/>
+ <Action name="add_mordent-long-inverted"/>
+ <Separator/>
+ <Action name="add_up-bow"/>
+ <Action name="add_down-bow"/>
+ <Action name="add_pause"/>
+ <Separator/>
+ <Action name="add_text_mark"/>
+ <Separator/>
+ <Action name="remove_marks"/>
+ </Menu>
+ <Menu name="ornaments">
+ <text>&amp;Ornaments</text>
+ <Action name="use_ornament"/>
+ <Action name="remove_ornament"/>
+ <Action name="make_ornament"/>
+ <Action name="ornament_actionmenu"/>
+ </Menu>
+ <Separator/>
+ <Menu name="Fingering">
+ <text>&amp;Fingerings</text>
+ <Action name="remove_fingering_marks"/>
+ <Separator/>
+ <Action name="add_fingering_0"/>
+ <Action name="add_fingering_1"/>
+ <Action name="add_fingering_2"/>
+ <Action name="add_fingering_3"/>
+ <Action name="add_fingering_4"/>
+ <Action name="add_fingering_5"/>
+ <Action name="add_fingering_plus"/>
+ <Action name="add_fingering_mark"/>
+ </Menu>
+ <Menu name="Slashes">
+ <text>S&amp;lashes</text>
+ <Action name="slashes_0"/>
+ <Action name="slashes_1"/>
+ <Action name="slashes_2"/>
+ <Action name="slashes_3"/>
+ <Action name="slashes_4"/>
+ <Action name="slashes_5"/>
+ </Menu>
+ <Action name="note_style_actionmenu"/>
+ <Separator/>
+ <Menu name="Respell">
+ <text>&amp;Accidentals</text>
+ <Action name="respell_restore"/>
+ <Separator/>
+ <Action name="respell_doubleflat"/>
+ <Action name="respell_flat"/>
+ <Action name="respell_natural"/>
+ <Action name="respell_sharp"/>
+ <Action name="respell_doublesharp"/>
+ <Separator/>
+ <Action name="show_cautionary"/>
+ <Action name="cancel_cautionary"/>
+ </Menu>
+ <Separator/>
+ <Action name="stems_up"/>
+ <Action name="stems_down"/>
+ <Action name="restore_stems"/>
+</Menu>
+
+<Menu name="Phrase">
+ <text>&amp;Phrase</text>
+ <Action name="make_chord"/>
+ <Separator/>
+ <Action name="beam"/>
+ <Action name="auto_beam"/>
+ <Action name="break_group"/>
+ <Action name="remove_indications"/>
+ <Separator/>
+ <Action name="tuplet"/>
+ <Action name="simple_tuplet"/>
+ <Action name="break_tuplets"/>
+ <Separator/>
+ <Action name="grace"/>
+ <Separator/>
+ <Action name="slur"/>
+ <Action name="phrasing_slur"/>
+ <!-- <Action name="glissando"/> -->
+ <Menu name="Slurs">
+ <text>Slur &amp;Position</text>
+ <Action name="restore_slurs"/>
+ <Separator/>
+ <Action name="slurs_above"/>
+ <Action name="slurs_below"/>
+ </Menu>
+ <Separator/>
+ <Action name="tie_notes"/>
+ <Action name="untie_notes"/>
+ <Menu name="Ties">
+ <text>Tie &amp;Position</text>
+ <Action name="restore_ties"/>
+ <Separator/>
+ <Action name="ties_above"/>
+ <Action name="ties_below"/>
+ </Menu>
+ <Separator/>
+ <Action name="crescendo"/>
+ <Action name="decrescendo"/>
+ <Separator/>
+ <Menu name="octaves">
+ <text>&amp;Octaves</text>
+ <Action name="octave_2up"/>
+ <Action name="octave_up"/>
+ <Action name="octave_down"/>
+ <Action name="octave_2down"/>
+ </Menu>
+</Menu>
+
+<Menu name="Adjust">
+ <text>Ad&amp;just</text>
+ <Menu name="rests">
+ <text>R&amp;ests</text>
+ <Action name="normalize_rests"/>
+ <Action name="collapse_rests_aggressively"/>
+ </Menu>
+ <Menu name="transform_notes">
+ <text>&amp;Notes</text>
+ <Action name="collapse_notes"/>
+ <Action name="make_notes_viable"/>
+ <Action name="de_counterpoint"/>
+ </Menu>
+ <Separator/>
+ <Menu name="quantize_notes">
+ <text>&amp;Quantize</text>
+ <Action name="quantize"/>
+ <Action name="fix_quantization"/>
+ <Action name="remove_quantization"/>
+ </Menu>
+ <Action name="interpret"/>
+ <Separator/>
+ <Menu name="Rescale">
+ <text>Rescale</text>
+ <Action name="halve_durations"/>
+ <Action name="double_durations"/>
+ <Separator/>
+ <Action name="rescale"/>
+ </Menu>
+ <Menu name="Transpose">
+ <text>Trans&amp;pose</text>
+ <Action name="transpose_up"/>
+ <Action name="transpose_down"/>
+ <Separator/>
+ <Action name="transpose_up_octave"/>
+ <Action name="transpose_down_octave"/>
+ <Separator/>
+ <Action name="general_transpose"/>
+ <Action name="general_diatonic_transpose"/>
+ </Menu>
+ <Menu name="Convert">
+ <text>Convert</text>
+ <Action name="invert"/>
+ <Action name="retrograde"/>
+ <Action name="retrograde_invert"/>
+ </Menu>
+ <Separator/>
+ <Menu name="fine_positioning">
+ <text>&amp;Fine Positioning</text>
+ <Action name="fine_position_restore"/>
+ <Separator/>
+ <Action name="fine_position_left"/>
+ <Action name="fine_position_right"/>
+ <Action name="fine_position_up"/>
+ <Action name="fine_position_down"/>
+ </Menu>
+ <Menu name="fine_timing">
+ <text>Fine Ti&amp;ming</text>
+ <Action name="jog_left"/>
+ <Action name="jog_right"/>
+ </Menu>
+ <Menu name="visibility">
+ <text>&amp;Visibility</text>
+ <Action name="make_invisible"/>
+ <Action name="make_visible"/>
+ </Menu>
+</Menu>
+
+<Menu name="Tools">
+ <text>&amp;Tools</text>
+ <Action name="select"/>
+ <Action name="erase"/>
+ <Menu noMerge="1" name="Notes">
+ <text>&amp;Notes</text>
+ <!-- Reference names, but with _ instead of - -->
+ <Action name="breve" />
+ <Action name="semibreve" />
+ <Action name="minim" />
+ <Action name="crotchet" />
+ <Action name="quaver" />
+ <Action name="semiquaver" />
+ <Action name="demisemi" />
+ <Action name="hemidemisemi" />
+ <Separator/>
+ <Action name="dotted_semibreve" />
+ <Action name="dotted_minim" />
+ <Action name="dotted_crotchet" />
+ <Action name="dotted_quaver" />
+ <Action name="dotted_semiquaver" />
+ <Action name="dotted_demisemi" />
+ <Separator/>
+ <Action name="switch_from_rest_to_note" />
+ </Menu>
+
+ <Menu noMerge="1" name="Rests">
+ <text>&amp;Rests</text>
+ <!-- Reference names, but with _ instead of - -->
+ <Action name="rest_breve" />
+ <Action name="rest_semibreve" />
+ <Action name="rest_minim" />
+ <Action name="rest_crotchet" />
+ <Action name="rest_quaver" />
+ <Action name="rest_semiquaver" />
+ <Action name="rest_demisemi" />
+ <Action name="rest_hemidemisemi" />
+ <Separator/>
+ <Action name="dotted_rest_semibreve" />
+ <Action name="dotted_rest_minim" />
+ <Action name="dotted_rest_crotchet" />
+ <Action name="dotted_rest_quaver" />
+ <Action name="dotted_rest_semiquaver" />
+ <Action name="dotted_rest_demisemi" />
+ <Separator/>
+ <Action name="switch_from_note_to_rest" />
+ </Menu>
+
+ <Menu noMerge="1" name="Accidentals">
+ <text>&amp;Accidentals</text>
+ <Action name="no_accidental" />
+ <Action name="follow_accidental" />
+ <Action name="sharp_accidental" />
+ <Action name="flat_accidental" />
+ <Action name="natural_accidental" />
+ <Action name="double_sharp_accidental" />
+ <Action name="double_flat_accidental" />
+ </Menu>
+
+ <Menu noMerge="1" name="Clefs">
+ <text>&amp;Clefs</text>
+ <Action name="treble_clef" />
+ <Action name="alto_clef" />
+ <Action name="tenor_clef" />
+ <Action name="bass_clef" />
+ </Menu>
+ <Separator/>
+ <Action name="text" />
+ <Action name="guitarchord" />
+ <Separator/>
+ <Menu name="Move">
+ <text>Local &amp;Cursor</text>
+ <Action name="cursor_back"/>
+ <Action name="cursor_forward"/>
+ <Action name="cursor_back_bar"/>
+ <Action name="cursor_forward_bar"/>
+ <Action name="cursor_start"/>
+ <Action name="cursor_end"/>
+ <Separator/>
+ <Action name="extend_selection_backward"/>
+ <Action name="extend_selection_forward"/>
+ <Action name="preview_selection"/>
+ <Action name="clear_loop"/>
+ <!-- not implemented yet
+ <Separator/>
+ <Action name="move_selection_left"/>
+ <Action name="move_selection_right"/>
+ <Action name="copy_selection_left"/>
+ <Action name="copy_selection_right"/>
+ -->
+ <Separator/>
+ <Action name="cursor_to_playback_pointer"/>
+ <Action name="playback_pointer_to_cursor"/>
+ <Separator/>
+ <Action name="cursor_up_staff"/>
+ <Action name="cursor_down_staff"/>
+ <Action name="cursor_prior_segment"/>
+ <Action name="cursor_next_segment"/>
+ </Menu>
+
+ <Menu name="Transport">
+ <text>T&amp;ransport</text>
+ <Action name="play"/>
+ <Action name="stop"/>
+ <Action name="playback_pointer_back_bar"/>
+ <Action name="playback_pointer_forward_bar"/>
+ <Action name="playback_pointer_start"/>
+ <Action name="playback_pointer_end"/>
+ <Action name="playback_pointer_to_cursor" />
+ <Action name="cursor_to_playback_pointer" />
+ <Action name="toggle_solo"/>
+ <Action name="toggle_tracking"/>
+ <Action name="panic"/>
+ </Menu>
+
+ <Separator/>
+
+ <Action name="insert_note_actionmenu"/>
+ <Action name="insert_rest"/>
+
+ <!--
+ <Action name="insert_melody_mode"/>
+ <Action name="insert_chord_mode"/>
+ -->
+
+ <Action name="chord_mode"/>
+ <Action name="triplet_mode"/>
+ <Action name="grace_mode"/>
+
+ <Separator/>
+ <Action name="toggle_step_by_step"/>
+
+</Menu>
+
+<Menu name="settings">
+ <text>&amp;Settings</text>
+ <Menu name="toolbars" append="show_merge" >
+ <text>&amp;Toolbars</text>
+ <Action name="options_show_toolbar" append="show_merge" />
+ <Action name="show_tools_toolbar" append="show_merge" />
+ <Action name="show_notes_toolbar" append="show_merge" />
+ <Action name="show_rests_toolbar" append="show_merge" />
+ <Action name="show_accidentals_toolbar" append="show_merge" />
+ <Action name="show_clefs_toolbar" append="show_merge" />
+ <Action name="show_marks_toolbar" append="show_merge" />
+ <Action name="show_group_toolbar" append="show_merge" />
+ <Action name="show_transport_toolbar" append="show_merge" />
+ <Action name="show_layout_toolbar" append="show_merge" />
+ <Action name="show_meta_toolbar" append="show_merge" />
+ <Action name="options_show_statusbar" append="show_merge" />
+ </Menu>
+ <Menu name="rulers" append="show_merge" >
+ <text>&amp;Rulers</text>
+ <Action name="show_chords_ruler" append="show_merge" />
+ <Action name="show_raw_note_ruler" append="show_merge" />
+ <Action name="show_tempo_ruler" append="show_merge" />
+ </Menu>
+ <Separator append="show_merge" />
+ <Action name="show_annotations" append="show_merge" />
+ <Action name="show_lilypond_directives" append="show_merge" />
+</Menu>
+
+</MenuBar>
+
+<ToolBar name="Tools Toolbar">
+ <text>Tools Toolbar</text>
+ <Action name="select" />
+ <Action name="erase" />
+ <Action name="text" />
+ <Action name="guitarchord" />
+ <Separator/>
+ <Action name="toggle_step_by_step"/>
+ <Action name="filter_selection"/>
+ <Action name="quantize"/>
+</ToolBar>
+
+<ToolBar name="Transport Toolbar">
+ <text>Transport Toolbar</text>
+ <Action name="playback_pointer_start" />
+ <Action name="playback_pointer_back_bar" />
+ <Action name="play" />
+ <Action name="playback_pointer_forward_bar" />
+ <Action name="playback_pointer_end" />
+ <Action name="stop" />
+ <Action name="playback_pointer_to_cursor" />
+ <Action name="cursor_to_playback_pointer" />
+ <Action name="toggle_solo"/>
+ <Action name="toggle_tracking"/>
+ <Action name="panic"/>
+</ToolBar>
+
+<ToolBar name="Notes Toolbar" newline="true" hidden="false" position="left">
+ <text>Notes Toolbar</text>
+
+ <!-- Reference names, but with _ instead of - -->
+ <Action name="breve" />
+ <Action name="semibreve" />
+ <Action name="minim" />
+ <Action name="crotchet" />
+ <Action name="quaver" />
+ <Action name="semiquaver" />
+ <Action name="demisemi" />
+ <Action name="hemidemisemi" />
+ <Separator/>
+ <Action name="dotted_semibreve" />
+ <Action name="dotted_minim" />
+ <Action name="dotted_crotchet" />
+ <Action name="dotted_quaver" />
+ <Action name="dotted_semiquaver" />
+ <Action name="dotted_demisemi" />
+
+ <Separator/>
+
+ <Action name="chord_mode"/>
+ <Action name="triplet_mode" />
+ <Action name="grace_mode" />
+</ToolBar>
+
+<ToolBar name="Rests Toolbar" hidden="false" position="left">
+ <text>Rests Toolbar</text>
+
+ <!-- Reference names, but with _ instead of - -->
+ <Action name="rest_breve" />
+ <Action name="rest_semibreve" />
+ <Action name="rest_minim" />
+ <Action name="rest_crotchet" />
+ <Action name="rest_quaver" />
+ <Action name="rest_semiquaver" />
+ <Action name="rest_demisemi" />
+ <Action name="rest_hemidemisemi" />
+ <Separator/>
+ <Action name="dotted_rest_semibreve" />
+ <Action name="dotted_rest_minim" />
+ <Action name="dotted_rest_crotchet" />
+ <Action name="dotted_rest_quaver" />
+ <Action name="dotted_rest_semiquaver" />
+ <Action name="dotted_rest_demisemi" />
+
+</ToolBar>
+
+<ToolBar name="Clefs Toolbar" hidden="false" position="left" newline="true">
+ <text>Clefs Toolbar</text>
+
+ <Action name="treble_clef" />
+ <Action name="alto_clef" />
+ <Action name="tenor_clef" />
+ <Action name="bass_clef" />
+</ToolBar>
+
+<ToolBar name="Accidentals Toolbar" hidden="false" position="left">
+ <text>Accidentals Toolbar</text>
+
+ <Action name="no_accidental" />
+ <Action name="follow_accidental" />
+ <Action name="sharp_accidental" />
+ <Action name="flat_accidental" />
+ <Action name="natural_accidental" />
+ <Action name="double_sharp_accidental" />
+ <Action name="double_flat_accidental" />
+</ToolBar>
+
+<ToolBar name="Group Toolbar" hidden="false" position="right">
+ <text>Group Toolbar</text>
+
+ <Action name="make_chord"/>
+ <Action name="beam"/>
+ <Action name="break_group"/>
+ <Separator/>
+ <Action name="tuplet"/>
+ <Action name="simple_tuplet"/>
+<!-- <Action name="grace"/> -->
+ <Separator/>
+ <Action name="slur"/>
+<!-- <Action name="glissando"/> -->
+ <Action name="tie_notes"/>
+ <Action name="de_counterpoint"/>
+ <Separator/>
+ <Action name="crescendo"/>
+ <Action name="decrescendo"/>
+ <Action name="octave_up"/>
+</ToolBar>
+
+<ToolBar name="Marks Toolbar" newline="true" hidden="false" position="right">
+ <text>Marks Toolbar</text>
+
+ <Action name="add_accent"/>
+ <Action name="add_tenuto"/>
+ <Action name="add_staccato"/>
+ <Action name="add_staccatissimo"/>
+ <Action name="add_marcato"/>
+ <Action name="add_text_sf"/>
+ <Action name="add_text_rf"/>
+ <Action name="add_trill"/>
+ <Action name="add_long-trill"/>
+ <Action name="add_turn"/>
+ <Action name="add_pause"/>
+ <Action name="add_up-bow"/>
+ <Action name="add_down-bow"/>
+ <Action name="add_mordent"/>
+ <Action name="add_mordent-inverted"/>
+ <Action name="add_mordent-long"/>
+ <Action name="add_mordent-long-inverted"/>
+ <Action name="add_text_mark"/>
+</ToolBar>
+
+<ToolBar name="Meta Toolbar" newline="true" hidden="true">
+ <text>Meta Toolbar</text>
+
+ <Action name="show_notes_toolbar" />
+ <Action name="show_rests_toolbar" />
+ <Action name="show_accidentals_toolbar" />
+ <Action name="show_clefs_toolbar" />
+ <Action name="show_marks_toolbar" />
+ <Action name="show_group_toolbar" />
+</ToolBar>
+
+<ToolBar name="Layout Toolbar" hidden="true">
+ <text>Layout Toolbar</text>
+ <Action name="linear_mode" />
+ <Action name="continuous_page_mode" />
+ <Action name="multi_page_mode" />
+<!-- the remainder filled at runtime -->
+</ToolBar>
+
+<Menu noMerge="1" name="controller_events_ruler_menu">
+ <Text>Control Ruler actions</Text>
+ <Action name="insert_control_ruler_item"/>
+ <Action name="erase_control_ruler_item"/>
+ <Action name="clear_control_ruler_item"/>
+ <Separator/>
+ <Action name="start_control_line_item"/>
+ <Separator/>
+ <Action name="flip_control_events_forward"/>
+ <Action name="flip_control_events_back"/>
+</Menu>
+
+<Menu noMerge="1" name="property_ruler_menu">
+ <Text>Property Ruler actions</Text>
+ <Action name="draw_property_line"/>
+ <Action name="select_all_properties"/>
+ <Separator/>
+ <Action name="flip_control_events_forward"/>
+ <Action name="flip_control_events_back"/>
+</Menu>
+
+
+
+<State name="note_insert_tool_current">
+ <enable>
+ <Action name="insert_rest"/>
+ <Action name="insert_note_actionmenu"/>
+ <Action name="switch_from_note_to_rest"/>
+ </enable>
+</State>
+
+<State name="rest_insert_tool_current">
+ <enable>
+ <Action name="insert_rest"/>
+ <Action name="switch_from_rest_to_note"/>
+ </enable>
+</State>
+
+<State name="have_selection">
+ <enable>
+ <Action name="edit_cut"/>
+ <Action name="edit_copy"/>
+ <Action name="delete"/>
+ <Action name="cut_and_close"/>
+ <Action name="debug_dump"/>
+ <Action name="preview_selection"/>
+ <Action name="normalize_rests"/>
+ <Action name="clear_selection"/>
+ <Action name="filter_selection"/>
+ <Action name="jog_left"/>
+ <Action name="jog_right"/>
+ <Action name="slurs_above"/>
+ <Action name="slurs_below"/>
+ <Action name="restore_slurs"/>
+ <Action name="ties_above"/>
+ <Action name="ties_below"/>
+ <Action name="restore_ties"/>
+ <Action name="fine_position_left"/>
+ <Action name="fine_position_right"/>
+ <Action name="fine_position_up"/>
+ <Action name="fine_position_down"/>
+ <Action name="fine_position_restore"/>
+ <Action name="tuplet"/>
+ <Action name="simple_tuplet"/>
+ <Action name="break_tuplets"/>
+ <Action name="make_invisible"/>
+ <Action name="make_visible"/>
+ <Action name="move_events_up_staff"/>
+ <Action name="move_events_down_staff"/>
+ </enable>
+</State>
+
+<State name="have_rests_in_selection">
+ <enable>
+ <Action name="note_style_actionmenu"/>
+ <Action name="remove_marks"/>
+ <Action name="add_pause"/>
+ <Action name="add_text_mark"/>
+<!-- <Action name="normalize_rests"/> -->
+ <Action name="collapse_rests_aggressively"/>
+ <Menu name="Adjust"/>
+ </enable>
+</State>
+
+<State name="have_notes_in_selection">
+ <enable>
+ <Action name="respell_doubleflat"/>
+ <Action name="respell_flat"/>
+ <Action name="respell_natural"/>
+ <Action name="respell_sharp"/>
+ <Action name="respell_doublesharp"/>
+ <Action name="respell_restore"/>
+ <Action name="show_cautionary"/>
+ <Action name="cancel_cautionary"/>
+ <Action name="make_chord"/>
+ <Action name="beam"/>
+ <Action name="auto_beam"/>
+ <Action name="break_group"/>
+<!-- <Action name="break_tuplets"/> -->
+<!-- <Action name="grace"/> -->
+<!-- <Action name="ungrace"/> -->
+ <Action name="slur"/>
+ <Action name="phrasing_slur"/>
+ <Action name="crescendo"/>
+ <Action name="decrescendo"/>
+<!-- <Action name="glissando"/> -->
+ <Action name="octave_2up"/>
+ <Action name="octave_up"/>
+ <Action name="octave_down"/>
+ <Action name="octave_2down"/>
+<!-- <Action name="remove_indications"/> -->
+ <Action name="stems_up"/>
+ <Action name="stems_down"/>
+ <Action name="restore_stems"/>
+ <Action name="slashes_0"/>
+ <Action name="slashes_1"/>
+ <Action name="slashes_2"/>
+ <Action name="slashes_3"/>
+ <Action name="slashes_4"/>
+ <Action name="slashes_5"/>
+ <Action name="note_style_actionmenu"/>
+ <Action name="remove_marks"/>
+ <Action name="remove_fingering_marks"/>
+ <Action name="add_fingering_0"/>
+ <Action name="add_fingering_1"/>
+ <Action name="add_fingering_2"/>
+ <Action name="add_fingering_3"/>
+ <Action name="add_fingering_4"/>
+ <Action name="add_fingering_5"/>
+ <Action name="add_fingering_plus"/>
+ <Action name="add_fingering_mark"/>
+ <Action name="add_accent"/>
+ <Action name="add_tenuto"/>
+ <Action name="add_staccato"/>
+ <Action name="add_staccatissimo"/>
+ <Action name="add_marcato"/>
+ <Action name="add_text_sf"/>
+ <Action name="add_text_rf"/>
+ <Action name="add_trill"/>
+ <Action name="add_long-trill"/>
+ <Action name="add_trill-line"/>
+ <Action name="add_turn"/>
+ <Action name="add_pause"/>
+ <Action name="add_up-bow"/>
+ <Action name="add_down-bow"/>
+ <Action name="add_mordent"/>
+ <Action name="add_mordent-inverted"/>
+ <Action name="add_mordent-long"/>
+ <Action name="add_mordent-long-inverted"/>
+ <Action name="add_text_mark"/>
+ <Action name="make_ornament"/>
+ <Action name="remove_ornament"/>
+ <Action name="use_ornament"/>
+ <Action name="collapse_notes"/>
+ <Action name="tie_notes"/>
+ <Action name="untie_notes"/>
+ <Action name="make_notes_viable"/>
+ <Action name="de_counterpoint"/>
+ <Action name="quantize"/>
+ <Action name="interpret"/>
+ <Action name="fix_quantization"/>
+ <Action name="remove_quantization"/>
+ <Action name="transpose_up"/>
+ <Action name="transpose_down"/>
+ <Action name="transpose_up_octave"/>
+ <Action name="transpose_down_octave"/>
+ <Action name="general_transpose"/>
+ <Action name="general_diatonic_transpose"/>
+ <Action name="invert"/>
+ <Action name="retrograde"/>
+ <Action name="retrograde_invert"/>
+ <Action name="halve_durations"/>
+ <Action name="double_durations"/>
+ <Action name="rescale"/>
+ <Menu name="Stems"/>
+ <Menu name="Slashes"/>
+ <Menu name="Transpose"/>
+ <Menu name="Convert"/>
+<Menu name="Notes"/>
+<Menu name="beams"/>
+<Menu name="octaves"/>
+<Menu name="indications"/>
+<Menu name="Slurs"/>
+<Menu name="Ties"/>
+<Menu name="Marks"/>
+<Menu name="ornaments"/>
+<Menu name="Fingering"/>
+<Menu name="Slashes"/>
+<Menu name="Adjust"/>
+<Menu name="Respell"/>
+<Menu name="triplets"/>
+<Menu name="Stems"/>
+<Menu name="rests"/>
+<Menu name="transform_notes"/>
+<Menu name="quantize_notes"/>
+ </enable>
+</State>
+
+<State name="have_clipboard_single_segment">
+ <enable>
+ <Action name="edit_paste"/>
+ <Action name="general_paste"/>
+ </enable>
+</State>
+
+<State name="have_multiple_staffs">
+ <enable>
+ <Action name="cursor_up_staff"/>
+ <Action name="cursor_down_staff"/>
+ <Action name="cursor_prior_segment"/>
+ <Action name="cursor_next_segment"/>
+ <Action name="move_events_up_staff"/>
+ <Action name="move_events_down_staff"/>
+ </enable>
+</State>
+
+<State name="linear_mode">
+ <enable>
+ <Action name="show_velocity_control_ruler"/>
+ <Action name="show_controller_events_ruler"/>
+ <Menu name="add_control_ruler"/>
+ <Action name="add_control_ruler"/>
+ <Action name="show_chords_ruler"/>
+ <Action name="show_raw_note_ruler"/>
+ <Action name="show_tempo_ruler"/>
+ </enable>
+</State>
+
+<State name="have_note_events_in_segment">
+ <enable>
+ <Action name="draw_property_line"/>
+ </enable>
+</State>
+
+<State name="have_control_ruler">
+ <enable>
+ <Action name="show_control_rulers"/>
+ </enable>
+</State>
+
+<State name="have_controller_item_selected">
+ <enable>
+ <Action name="erase_control_ruler_item"/>
+ </enable>
+ <disable>
+ <Action name="insert_control_ruler_item"/>
+ </disable>
+</State>
+
+</kpartgui>
diff --git a/src/gui/ui/notationeraser.rc b/src/gui/ui/notationeraser.rc
new file mode 100644
index 0000000..e3e3289
--- /dev/null
+++ b/src/gui/ui/notationeraser.rc
@@ -0,0 +1,12 @@
+<!DOCTYPE kpartgui SYSTEM "kpartgui.dtd">
+
+<kpartgui name="Rosegarden::NotationTool" version="1230">
+
+<Menu name="NotationEraser">
+ <Action name="select" />
+ <Action name="insert" />
+ <Separator/>
+ <Action name="toggle_rest_collapse" />
+</Menu>
+
+</kpartgui>
diff --git a/src/gui/ui/notationselector.rc b/src/gui/ui/notationselector.rc
new file mode 100644
index 0000000..4893b8f
--- /dev/null
+++ b/src/gui/ui/notationselector.rc
@@ -0,0 +1,26 @@
+<!DOCTYPE kpartgui SYSTEM "kpartgui.dtd">
+
+<kpartgui name="Rosegarden::NotationTool" version="1230">
+
+<Menu noMerge="1" name="NotationSelector">
+ <Action name="insert" />
+ <Action name="erase" />
+ <Separator />
+<!-- <Action name="collapse_rests" /> -->
+ <Action name="collapse_rests_aggressively" />
+ <Separator />
+ <Action name="respell_flat" />
+ <Action name="respell_sharp" />
+ <Action name="respell_natural" />
+ <Separator />
+ <Action name="collapse_notes" />
+ <Action name="interpret" />
+ <Separator />
+ <Action name="move_events_up_staff" />
+ <Action name="move_events_down_staff" />
+ <Separator />
+ <Action name="make_invisible" />
+ <Action name="make_visible" />
+</Menu>
+
+</kpartgui>
diff --git a/src/gui/ui/noteinserter.rc b/src/gui/ui/noteinserter.rc
new file mode 100644
index 0000000..507857f
--- /dev/null
+++ b/src/gui/ui/noteinserter.rc
@@ -0,0 +1,23 @@
+<!DOCTYPE kpartgui SYSTEM "kpartgui.dtd">
+
+<kpartgui name="Rosegarden::NotationTool" version="1230">
+
+<Menu noMerge="1" name="NoteInserter">
+ <Action name="select" />
+ <Action name="erase" />
+ <Action name="rests" />
+ <Separator/>
+ <Action name="toggle_auto_beam" />
+ <Separator/>
+ <Action name="toggle_dot" />
+ <Separator/>
+ <Action name="no_accidental" />
+ <Action name="follow_accidental" />
+ <Action name="sharp_accidental" />
+ <Action name="flat_accidental" />
+ <Action name="natural_accidental" />
+ <Action name="double_sharp_accidental" />
+ <Action name="double_flat_accidental" />
+</Menu>
+
+</kpartgui>
diff --git a/src/gui/ui/restinserter.rc b/src/gui/ui/restinserter.rc
new file mode 100644
index 0000000..37636c8
--- /dev/null
+++ b/src/gui/ui/restinserter.rc
@@ -0,0 +1,13 @@
+<!DOCTYPE kpartgui SYSTEM "kpartgui.dtd">
+
+<kpartgui name="Rosegarden::NotationTool" version="1230">
+
+<Menu noMerge="1" name="RestInserter">
+ <Action name="notes" />
+ <Action name="erase" />
+ <Action name="select" />
+ <Separator/>
+ <Action name="toggle_dot" />
+</Menu>
+
+</kpartgui>
diff --git a/src/gui/ui/rosegardenui.rc b/src/gui/ui/rosegardenui.rc
new file mode 100644
index 0000000..ba6e735
--- /dev/null
+++ b/src/gui/ui/rosegardenui.rc
@@ -0,0 +1,440 @@
+<!DOCTYPE kpartgui SYSTEM "kpartgui.dtd">
+
+<kpartgui name="Rosegarden" version="1230">
+
+<MenuBar>
+ <Menu name="file">
+ <!-- these two would like to be open_merge, but that sticks them at
+ the very bottom in older KDE3 versions: -->
+ <Menu name="import" append="new_merge"><text>&amp;Import</text>
+ <Action name="file_import_project" />
+ <Separator/>
+ <Action name="file_import_midi" />
+ <Action name="file_import_rg21" />
+ <Action name="file_import_hydrogen" />
+ </Menu>
+ <Menu name="merge" append="new_merge"><text>&amp;Merge</text>
+ <Action name="file_merge" />
+ <Action name="file_merge_midi" />
+ <Action name="file_merge_rg21" />
+ <Action name="file_merge_hydrogen" />
+ </Menu>
+ <!-- this one would like to be save_merge, but that sticks it at
+ the very bottom in older KDE3 versions: -->
+ <Menu name="export" append="new_merge"><text>&amp;Export</text>
+ <Action name="file_export_project" />
+ <Separator/>
+ <Action name="file_export_lilypond" />
+ <Separator/>
+ <Action name="file_export_midi" />
+ <Separator/>
+ <Action name="file_export_csound" />
+ <Action name="file_export_mup" />
+ <Action name="file_export_musicxml" />
+ </Menu>
+ <Action name="file_print_lilypond" append="print_merge" />
+ <Action name="file_preview_lilypond" append="print_merge" />
+ <Separator/>
+ <Action name="audio_manager"/>
+ <Separator/>
+ <Action name="file_show_playlist" />
+ </Menu>
+ <Menu name="edit">
+ <Action name="delete"/>
+ <Separator/>
+ <Action name="cut_range"/>
+ <Action name="copy_range"/>
+ <Action name="paste_range"/>
+ <Action name="insert_range"/>
+ <Separator/>
+ <Action name="select_all"/>
+ </Menu>
+ <Menu name="document">
+ <text>&amp;Composition</text>
+ <Action name="add_tempo"/>
+ <Action name="add_time_signature"/>
+ <Action name="edit_tempos"/>
+ <Separator/>
+ <Action name="set_tempo_to_segment_length"/>
+ <Action name="groove_quantize"/>
+ <Separator/>
+ <Action name="change_composition_length"/>
+ <Separator/>
+ <Action name="edit_markers"/>
+ <Action name="edit_doc_properties"/>
+ <Separator/>
+ <Action name="set_quick_marker"/>
+ <Action name="jump_to_quick_marker"/>
+ </Menu>
+ <Menu name="Studio">
+ <text>&amp;Studio</text>
+ <Action name="audio_mixer"/>
+ <Action name="midi_mixer"/>
+ <Separator/>
+ <Action name="manage_devices"/>
+ <Action name="manage_synths"/>
+ <Action name="manage_metronome"/>
+ <Separator/>
+ <Action name="modify_midi_filters"/>
+ <Action name="enable_midi_routing"/>
+ <Separator/>
+ <Action name="reset_midi_network"/>
+ <Separator/>
+ <Action name="load_studio"/>
+ <Action name="load_default_studio"/>
+ <Action name="save_default_studio"/>
+ </Menu>
+ <Menu name="Segments">
+ <text>Se&amp;gments</text>
+ <Menu name="edit_with">
+ <text>Edit &amp;With</text>
+ <Action name="edit_default"/>
+ <Separator/>
+ <Action name="edit_matrix"/>
+ <Action name="edit_percussion_matrix"/>
+ <Action name="edit_notation"/>
+ <Action name="edit_event_list"/>
+ </Menu>
+ <Separator/>
+ <Action name="relabel_segment"/>
+ <Action name="quantize_selection"/>
+ <Action name="repeat_quantize"/>
+ <Action name="transpose"/>
+ <Separator/>
+ <Action name="rescale"/>
+ <Action name="set_segment_start"/>
+ <Action name="set_segment_duration"/>
+ <Separator/>
+ <Action name="jog_left"/>
+ <Action name="jog_right"/>
+ <Separator/>
+ <Action name="join_segments"/>
+ <Menu name="split">
+ <text>&amp;Split</text>
+ <Action name="auto_split"/>
+ <Action name="split_by_pitch"/>
+ <Action name="split_by_recording"/>
+ <Action name="split_at_time"/>
+ </Menu>
+ <Action name="repeats_to_real_copies"/>
+ <Separator/>
+ <Action name="manage_trigger_segments"/>
+ </Menu>
+ <Menu name="Tracks">
+ <text>Trac&amp;ks</text>
+ <Action name="add_track"/>
+ <Action name="add_tracks"/>
+ <Action name="delete_track"/>
+ <Separator/>
+ <Action name="move_track_down"/>
+ <Action name="move_track_up"/>
+ <Separator/>
+ <Action name="select_next_track"/>
+ <Action name="select_previous_track"/>
+ <Separator/>
+ <Action name="toggle_mute_track"/>
+ <Action name="toggle_arm_track"/>
+ <Separator/>
+ <Action name="unmute_all_tracks"/>
+ <Action name="mute_all_tracks"/>
+ <Separator/>
+ <Menu name="set_track_instrument"><text>Set &amp;Instrument</text></Menu>
+ <Action name="remap_instruments"/>
+ </Menu>
+ <Menu name="Tools">
+ <text>&amp;Tools</text>
+ <Action name="select"/>
+ <Action name="draw"/>
+ <Action name="erase"/>
+ <Action name="move"/>
+ <Action name="resize"/>
+ <Action name="split"/>
+ <Separator/>
+ <Menu name="Transport">
+ <text>T&amp;ransport</text>
+ <Action name="play"/>
+ <Action name="stop"/>
+ <Action name="fast_forward"/>
+ <Action name="rewind"/>
+ <Action name="record"/>
+ <Action name="recordtoggle"/>
+ <Action name="toggle_tracking"/>
+ <Action name="panic"/>
+ </Menu>
+ </Menu>
+ <Menu name="settings">
+ <Menu name="toolbars" append="show_merge"><text>&amp;Toolbars</text>
+ <Action name="show_stock_toolbar" append="show_merge" />
+ <Action name="show_tools_toolbar" append="show_merge" />
+ <Action name="show_tracks_toolbar" append="show_merge" />
+ <Action name="show_editors_toolbar" append="show_merge" />
+ <Action name="show_transport_toolbar" append="show_merge" />
+ <Action name="show_zoom_toolbar" append="show_merge" />
+ <Action name="show_status_bar" append="show_merge" />
+ </Menu>
+ <Menu name="rulers" append="show_merge"><text>&amp;Rulers</text>
+ <Action name="show_rulers" append="show_merge" />
+ <Action name="show_chord_name_ruler" append="show_merge" />
+ <Action name="show_tempo_ruler" append="show_merge" />
+ </Menu>
+ <Separator append="show_merge" />
+ <Action name="show_transport" append="show_merge" />
+ <Action name="show_inst_segment_parameters" append="show_merge" />
+ <Separator append="show_merge" />
+ <Action name="show_previews" append="show_merge" />
+ <Action name="show_segment_labels" append="show_merge" />
+ <Action name="show_tracklabels" append="show_merge" />
+ <!-- Action name="toggle_all" append="show_merge" /> -->
+ </Menu>
+ <Menu name="help" append="about_merge"><text>&amp;Help</text>
+ <Action name="tutorial"/>
+ <Action name="guidelines"/>
+ </Menu>
+
+</MenuBar>
+
+<ToolBar name="Tools Toolbar">
+ <text>Tools Toolbar</text>
+ <Action name="select"/>
+ <Action name="draw"/>
+ <Action name="erase"/>
+ <Action name="move"/>
+ <Action name="resize"/>
+ <Action name="split"/>
+ <!-- <Action name="join"/> -->
+</ToolBar>
+
+<ToolBar name="Tracks Toolbar">
+ <text>Tracks Toolbar</text>
+ <Action name="add_track"/>
+ <Action name="delete_track"/>
+ <Action name="move_track_up"/>
+ <Action name="move_track_down"/>
+ <Separator/>
+ <Action name="mute_all_tracks"/>
+ <Action name="unmute_all_tracks"/>
+<!-- <Separator/>
+ <Action name="show_previews"/>
+ <Action name="show_segment_labels"/>
+ <Action name="show_tracklabels"/> -->
+</ToolBar>
+
+<ToolBar name="Editors Toolbar">
+ <text>Editors Toolbar</text>
+ <Action name="edit_matrix"/>
+ <Action name="edit_percussion_matrix"/>
+ <Action name="edit_notation"/>
+ <Action name="edit_event_list"/>
+ <Action name="audio_manager"/>
+ <Separator/>
+ <Action name="quantize_selection"/>
+ <Separator/>
+ <Action name="manage_devices"/>
+ <Action name="manage_synths"/>
+ <Action name="midi_mixer"/>
+ <Action name="audio_mixer"/>
+</ToolBar>
+
+<ToolBar name="Transport Toolbar">
+ <text>Transport Toolbar</text>
+ <Action name="rewindtobeginning" />
+ <Action name="rewind" />
+ <Action name="play" />
+ <Action name="fast_forward" />
+ <Action name="fastforwardtoend" />
+ <Action name="stop" />
+ <Action name="record" />
+ <Action name="toggle_tracking"/>
+ <Action name="panic"/>
+</ToolBar>
+
+<ToolBar name="Zoom Toolbar">
+ <text>Zoom Toolbar</text>
+</ToolBar>
+
+<Menu noMerge="1" name="segment_tool_menu">
+ <Action name="edit_default"/>
+ <Separator/>
+ <Action name="edit_matrix"/>
+ <Action name="edit_percussion_matrix"/>
+ <Action name="edit_notation"/>
+ <Action name="edit_event_list"/>
+ <Separator/>
+ <Action name="edit_undo"/>
+ <Action name="edit_redo"/>
+ <Separator/>
+ <Action name="edit_cut"/>
+ <Action name="edit_copy"/>
+ <Action name="edit_paste"/>
+ <Separator/>
+ <Action name="delete"/>
+ <Action name="join_segments"/>
+ <Separator/>
+ <Action name="quantize_selection"/>
+ <Action name="repeat_quantize"/>
+ <Action name="relabel_segment"/>
+ <Action name="transpose"/>
+ <Separator/>
+ <Action name="select"/>
+ <Action name="move"/>
+ <Action name="draw"/>
+ <Action name="erase"/>
+ <Action name="resize"/>
+ <Action name="split"/>
+ <!-- <Action name="join"/> -->
+</Menu>
+
+<State name="new_file">
+ <disable>
+ <Action name="file_revert"/>
+ </disable>
+ <enable>
+ <Action name="file_close"/>
+ <Action name="file_print"/>
+ <Action name="file_print_preview"/>
+ </enable>
+</State>
+
+<State name="new_file_modified">
+ <enable>
+ </enable>
+</State>
+
+<State name="saved_file_modified">
+ <enable>
+ <Action name="file_revert"/>
+ </enable>
+</State>
+
+<State name="have_project_packager">
+ <enable>
+ <Action name="file_import_project"/>
+ <Action name="file_export_project"/>
+ </enable>
+</State>
+
+<State name="have_lilypondview">
+ <enable>
+ <Action name="file_preview_lilypond"/>
+ </enable>
+</State>
+
+<State name="have_segments">
+ <enable>
+ <Action name="move"/>
+ <Action name="erase"/>
+ <Action name="resize"/>
+ <Action name="split"/>
+ <!-- <Action name="join"/> -->
+ <Action name="file_print"/>
+ <Action name="file_print_preview"/>
+ </enable>
+</State>
+
+<State name="have_selection">
+ <enable>
+ <Action name="edit_cut"/>
+ <Action name="edit_copy"/>
+ <Action name="delete"/>
+ <Action name="edit_default"/>
+ <Action name="edit_matrix"/>
+ <Action name="edit_percussion_matrix"/>
+ <Action name="edit_notation"/>
+ <Action name="edit_event_list"/>
+ <Action name="quantize_selection"/>
+ <Action name="repeat_quantize"/>
+<!-- <Action name="harmonize_selection"/> -->
+ <Action name="rescale"/>
+ <Action name="jog_left"/>
+ <Action name="jog_right"/>
+ <Action name="auto_split"/>
+ <Action name="split_by_pitch"/>
+ <Action name="split_by_recording"/>
+ <Action name="split_at_time"/>
+ <Action name="join_segments"/>
+ <Action name="relabel_segment"/>
+ <Action name="transpose"/>
+ <Action name="set_segment_start"/>
+ <Action name="set_segment_duration"/>
+ <Action name="collapse"/>
+ <Action name="set_tempo_to_segment_length"/>
+ <Action name="repeats_to_real_copies"/>
+ <Action name="groove_quantize"/>
+ </enable>
+</State>
+
+<State name="have_clipboard">
+ <enable>
+ <Action name="edit_paste"/>
+ <Action name="paste_range"/>
+ </enable>
+</State>
+
+<State name="audio_segment_selected">
+ <enable>
+ <Action name="set_tempo_to_segment_length"/>
+ </enable>
+ <disable>
+ <Action name="edit_notation"/>
+ <Action name="edit_matrix"/>
+ <Action name="edit_percussion_matrix"/>
+ <Action name="edit_event_list"/>
+ <Action name="quantize_selection"/>
+ <Action name="repeat_quantize"/>
+<!-- <Action name="rescale"/> -->
+ <Action name="split_by_pitch"/>
+ <Action name="split_by_recording"/>
+ <Action name="join_segments"/>
+ <Action name="collapse"/>
+ <Action name="repeats_to_real_copies"/>
+ <Action name="groove_quantize"/>
+ </disable>
+</State>
+
+<State name="got_midi_devices">
+ <enable>
+ <Action name="modify_banks"/>
+ <Action name="remap_instruments"/>
+ <Action name="midi_mixer"/>
+ </enable>
+</State>
+
+<State name="got_audio">
+ <enable>
+ <Action name="audio_manager"/>
+ <Action name="audio_mixer"/>
+ </enable>
+</State>
+
+<State name="sequencer_running">
+ <enable>
+ <Action name="rewindtobeginning" />
+ <Action name="rewind" />
+ <Action name="play" />
+ <Action name="fast_forward" />
+ <Action name="fastforwardtoend" />
+ <Action name="stop" />
+ <Action name="record" />
+ <Action name="recordtoggle" />
+ </enable>
+</State>
+
+<State name="not_playing">
+ <enable>
+ </enable>
+</State>
+
+<State name="parametersbox_closed">
+ <enable>
+ <Action name="show_inst_segment_parameters" />
+ </enable>
+</State>
+
+<State name="have_range">
+ <enable>
+ <Action name="cut_range"/>
+ <Action name="copy_range"/>
+ </enable>
+</State>
+
+</kpartgui>
diff --git a/src/gui/ui/temporuler.rc b/src/gui/ui/temporuler.rc
new file mode 100644
index 0000000..1db6b62
--- /dev/null
+++ b/src/gui/ui/temporuler.rc
@@ -0,0 +1,19 @@
+<!DOCTYPE kpartgui SYSTEM "kpartgui.dtd">
+
+<kpartgui name="Rosegarden::TempoRuler" version="1230">
+
+<Menu name="tempo_ruler_menu">
+ <Action name="insert_tempo_here" />
+ <Action name="insert_tempo_at_pointer" />
+ <Separator/>
+ <Action name="delete_tempo" />
+ <Separator/>
+ <Action name="ramp_to_next" />
+ <Action name="unramp" />
+ <Separator/>
+ <Action name="edit_tempo" />
+ <Action name="edit_time_signature" />
+ <Action name="edit_tempos" />
+</Menu>
+
+</kpartgui>
diff --git a/src/gui/ui/tempoview.rc b/src/gui/ui/tempoview.rc
new file mode 100644
index 0000000..b48443f
--- /dev/null
+++ b/src/gui/ui/tempoview.rc
@@ -0,0 +1,96 @@
+<!DOCTYPE kpartgui SYSTEM "kpartgui.dtd">
+
+<kpartgui name="Rosegarden::TempoView" version="1500">
+
+<MenuBar>
+
+<Menu name="edit" append="new_merge">
+ <Action name="insert_tempo"/>
+ <Action name="insert_timesig"/>
+ <Action name="delete"/>
+ <Action name="edit"/>
+ <Separator/>
+ <Action name="select_all"/>
+ <Action name="clear_selection"/>
+</Menu>
+
+<Menu name="view"><text>&amp;View</text>
+ <Action name="time_musical"/>
+ <Action name="time_real"/>
+ <Action name="time_raw"/>
+</Menu>
+
+</MenuBar>
+
+<ToolBar name="Actions Toolbar">
+ <text>Actions Toolbar</text>
+ <Action name="insert_tempo"/>
+ <Action name="insert_timesig"/>
+ <Action name="delete"/>
+ <Action name="edit"/>
+</ToolBar>
+
+<ToolBar name="Time Toolbar">
+ <text>Time Toolbar</text>
+ <Action name="time_musical"/>
+ <Action name="time_real"/>
+ <Action name="time_raw"/>
+</ToolBar>
+
+</kpartgui>
+
+<ToolBar name="Transport Toolbar">
+ <text>Transport Toolbar</text>
+
+ <Action name="playback_pointer_start" />
+ <Action name="playback_pointer_back_bar" />
+ <Action name="play" />
+ <Action name="playback_pointer_forward_bar" />
+ <Action name="playback_pointer_end" />
+ <Action name="stop" />
+ <Action name="playback_pointer_to_cursor" />
+ <Action name="cursor_to_playback_pointer" />
+ <Action name="toggle_solo"/>
+ <Action name="panic"/>
+</ToolBar>
+
+<ToolBar name="Actions Toolbar">
+ <text>Actions Toolbar</text>
+</ToolBar>
+
+<ToolBar name="Zoom Toolbar">
+ <text>Zoom Toolbar</text>
+</ToolBar>
+
+<State name="have_selection">
+ <enable>
+ <Action name="edit_cut"/>
+ <Action name="edit_copy"/>
+ <Action name="edit"/>
+ <Action name="quantize"/>
+ <Action name="velocity_up"/>
+ <Action name="velocity_down"/>
+ <Action name="set_velocities"/>
+ <Action name="transpose_up"/>
+ <Action name="transpose_down"/>
+ <Action name="transpose_up_octave"/>
+ <Action name="transpose_down_octave"/>
+ <Action name="general_transpose"/>
+ <Action name="general_diatonic_transpose"/>
+ <Action name="invert"/>
+ <Action name="retrograde"/>
+ <Action name="retrograde_invert"/>
+ <Action name="preview_selection"/>
+ <Action name="clear_selection"/>
+ <Action name="filter_selection"/>
+ </enable>
+</State>
+
+<State name="have_control_ruler">
+ <enable>
+ <Action name="show_control_rulers"/>
+ </enable>
+</State>
+
+</kpartgui>
+
diff --git a/src/gui/ui/textinserter.rc b/src/gui/ui/textinserter.rc
new file mode 100644
index 0000000..2d445a6
--- /dev/null
+++ b/src/gui/ui/textinserter.rc
@@ -0,0 +1,11 @@
+<!DOCTYPE kpartgui SYSTEM "kpartgui.dtd">
+
+<kpartgui name="Rosegarden::NotationTool" version="1230">
+
+<Menu noMerge="1" name="TextInserter">
+ <Action name="select" />
+ <Action name="notes" />
+ <Action name="erase" />
+</Menu>
+
+</kpartgui>
diff --git a/src/gui/ui/triggermanager.rc b/src/gui/ui/triggermanager.rc
new file mode 100644
index 0000000..56efa52
--- /dev/null
+++ b/src/gui/ui/triggermanager.rc
@@ -0,0 +1,40 @@
+<!DOCTYPE kpartgui SYSTEM "kpartgui.dtd">
+
+<kpartgui name="TriggerManager" version="1230">
+
+<MenuBar>
+
+ <Menu name="file">
+ <Action name="file_close_discard"/>
+ </Menu>
+
+ <Menu name="edit">
+ <Action name="paste_to_trigger_segment"/>
+ </Menu>
+
+ <Menu name="view"><text>&amp;View</text>
+ <Action name="time_musical"/>
+ <Action name="time_real"/>
+ <Action name="time_raw"/>
+ /Menu>
+
+</MenuBar>
+
+<ToolBar name="mainToolBar">
+ <Action name="file_close"/>
+</ToolBar>
+
+<ToolBar name="Time Toolbar">
+ <text>Time Toolbar</text>
+ <Action name="time_musical"/>
+ <Action name="time_real"/>
+ <Action name="time_raw"/>
+</ToolBar>
+
+<State name="have_clipboard_single_segment">
+ <enable>
+ <Action name="paste_to_trigger_segment"/>
+ </enable>
+</State>
+
+</kpartgui>
diff --git a/src/gui/widgets/AudioFaderBox.cpp b/src/gui/widgets/AudioFaderBox.cpp
new file mode 100644
index 0000000..05789ff
--- /dev/null
+++ b/src/gui/widgets/AudioFaderBox.cpp
@@ -0,0 +1,294 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "AudioFaderBox.h"
+#include <qlayout.h>
+
+#include <klocale.h>
+#include <kstddirs.h>
+#include "misc/Debug.h"
+#include "AudioRouteMenu.h"
+#include "AudioVUMeter.h"
+#include "base/AudioLevel.h"
+#include "base/Instrument.h"
+#include "base/Studio.h"
+#include "Fader.h"
+#include "gui/general/GUIPalette.h"
+#include "gui/application/RosegardenGUIApp.h"
+#include "gui/studio/AudioPluginOSCGUIManager.h"
+#include "Rotary.h"
+#include <kglobal.h>
+#include <qframe.h>
+#include <qhbox.h>
+#include <qlabel.h>
+#include <qobject.h>
+#include <qpixmap.h>
+#include <qpushbutton.h>
+#include <qsignalmapper.h>
+#include <qstring.h>
+#include <qtooltip.h>
+#include <qvbox.h>
+#include <qwidget.h>
+#include "VUMeter.h"
+
+
+namespace Rosegarden
+{
+
+AudioFaderBox::AudioFaderBox(QWidget *parent,
+ QString id,
+ bool haveInOut,
+ const char *name):
+ QFrame(parent, name),
+ m_signalMapper(new QSignalMapper(this)),
+ m_id(id),
+ m_isStereo(false)
+{
+ // Plugin box
+ //
+ QPushButton *plugin;
+ QVBox *pluginVbox = 0;
+
+ pluginVbox = new QVBox(this);
+ pluginVbox->setSpacing(2);
+
+ for (int i = 0; i < 5; i++) {
+ plugin = new QPushButton(pluginVbox);
+ plugin->setText(i18n("<no plugin>"));
+
+ QToolTip::add
+ (plugin, i18n("Audio plugin button"));
+
+ m_plugins.push_back(plugin);
+ m_signalMapper->setMapping(plugin, i);
+ connect(plugin, SIGNAL(clicked()),
+ m_signalMapper, SLOT(map()));
+ }
+
+ m_synthButton = new QPushButton(this);
+ m_synthButton->setText(i18n("<no synth>"));
+ QToolTip::add
+ (m_synthButton, i18n("Synth plugin button"));
+
+ // VU meter and fader
+ //
+ QHBox *faderHbox = new QHBox(this);
+
+ m_vuMeter = new AudioVUMeter(faderHbox, VUMeter::AudioPeakHoldShort,
+ true, true);
+
+ m_recordFader = new Fader(AudioLevel::ShortFader,
+ 20, m_vuMeter->height(), faderHbox);
+
+ m_recordFader->setOutlineColour(GUIPalette::getColour(GUIPalette::RecordFaderOutline));
+
+ delete m_vuMeter; // only used the first one to establish height,
+ // actually want it after the record fader in
+ // hbox
+ m_vuMeter = new AudioVUMeter(faderHbox, VUMeter::AudioPeakHoldShort,
+ true, true);
+
+ m_fader = new Fader(AudioLevel::ShortFader,
+ 20, m_vuMeter->height(), faderHbox);
+
+ m_fader->setOutlineColour(GUIPalette::getColour(GUIPalette::PlaybackFaderOutline));
+
+ QString pixmapDir = KGlobal::dirs()->findResource("appdata", "pixmaps/");
+ m_monoPixmap.load(QString("%1/misc/mono.xpm").arg(pixmapDir));
+ m_stereoPixmap.load(QString("%1/misc/stereo.xpm").arg(pixmapDir));
+
+ m_pan = new Rotary(this, -100.0, 100.0, 1.0, 5.0, 0.0, 22,
+ Rotary::NoTicks, false, true);
+
+ // same as the knob colour on the MIDI pan
+ m_pan->setKnobColour(GUIPalette::getColour(GUIPalette::RotaryPastelGreen));
+
+ m_stereoButton = new QPushButton(this);
+ m_stereoButton->setPixmap(m_monoPixmap); // default is mono
+ m_stereoButton->setFixedSize(24, 24);
+
+ connect(m_stereoButton, SIGNAL(clicked()),
+ this, SLOT(slotChannelStateChanged()));
+
+ m_synthGUIButton = new QPushButton(this);
+ m_synthGUIButton->setText(i18n("Editor"));
+
+ if (haveInOut) {
+ m_audioInput = new AudioRouteMenu(this,
+ AudioRouteMenu::In,
+ AudioRouteMenu::Regular);
+ m_audioOutput = new AudioRouteMenu(this,
+ AudioRouteMenu::Out,
+ AudioRouteMenu::Regular);
+ } else {
+ m_pan->setKnobColour(GUIPalette::getColour(GUIPalette::RotaryPastelOrange));
+
+ m_audioInput = 0;
+ m_audioOutput = 0;
+ }
+
+ QToolTip::add
+ (m_pan, i18n("Set the audio pan position in the stereo field"));
+ QToolTip::add
+ (m_synthGUIButton, i18n("Open synth plugin's native editor"));
+ QToolTip::add
+ (m_stereoButton, i18n("Mono or Stereo Instrument"));
+ QToolTip::add
+ (m_recordFader, i18n("Record level"));
+ QToolTip::add
+ (m_fader, i18n("Playback level"));
+ QToolTip::add
+ (m_vuMeter, i18n("Audio level"));
+
+ QGridLayout *grid = new QGridLayout(this, 3, 6, 4, 4);
+
+ grid->addMultiCellWidget(m_synthButton, 0, 0, 0, 2);
+
+ if (haveInOut) {
+ m_inputLabel = new QLabel(i18n("In:"), this);
+ grid->addWidget(m_inputLabel, 0, 0, AlignRight);
+ grid->addMultiCellWidget(m_audioInput->getWidget(), 0, 0, 1, 2);
+ m_outputLabel = new QLabel(i18n("Out:"), this);
+ grid->addWidget(m_outputLabel, 0, 3, AlignRight);
+ grid->addMultiCellWidget(m_audioOutput->getWidget(), 0, 0, 4, 5);
+ }
+
+ grid->addMultiCellWidget(pluginVbox, 2, 2, 0, 2);
+ grid->addMultiCellWidget(faderHbox, 1, 2, 3, 5);
+
+ grid->addWidget(m_synthGUIButton, 1, 0);
+ grid->addWidget(m_pan, 1, 2);
+ grid->addWidget(m_stereoButton, 1, 1);
+
+ for (int i = 0; i < 5; ++i) {
+ // Force width
+ m_plugins[i]->setFixedWidth(m_plugins[i]->width());
+ }
+ m_synthButton->setFixedWidth(m_plugins[0]->width());
+
+ m_synthButton->hide();
+ m_synthGUIButton->hide();
+}
+
+void
+AudioFaderBox::setIsSynth(bool isSynth)
+{
+ if (isSynth) {
+ m_inputLabel->hide();
+ m_synthButton->show();
+ m_synthGUIButton->show();
+ m_audioInput->getWidget()->hide();
+ m_recordFader->hide();
+ } else {
+ m_synthButton->hide();
+ m_synthGUIButton->hide();
+ m_inputLabel->show();
+ m_audioInput->getWidget()->show();
+ m_recordFader->show();
+ }
+}
+
+void
+AudioFaderBox::slotSetInstrument(Studio *studio,
+ Instrument *instrument)
+{
+ if (m_audioInput)
+ m_audioInput->slotSetInstrument(studio, instrument);
+ if (m_audioOutput)
+ m_audioOutput->slotSetInstrument(studio, instrument);
+ if (instrument)
+ setAudioChannels(instrument->getAudioChannels());
+ if (instrument) {
+
+ RG_DEBUG << "AudioFaderBox::slotSetInstrument(" << instrument->getId() << ")" << endl;
+
+ setIsSynth(instrument->getType() == Instrument::SoftSynth);
+ if (instrument->getType() == Instrument::SoftSynth) {
+ bool gui = false;
+ RG_DEBUG << "AudioFaderBox::slotSetInstrument(" << instrument->getId() << "): is soft synth" << endl;
+#ifdef HAVE_LIBLO
+
+ gui = RosegardenGUIApp::self()->getPluginGUIManager()->hasGUI
+ (instrument->getId(), Instrument::SYNTH_PLUGIN_POSITION);
+ RG_DEBUG << "AudioFaderBox::slotSetInstrument(" << instrument->getId() << "): has gui = " << gui << endl;
+#endif
+
+ m_synthGUIButton->setEnabled(gui);
+ }
+ }
+}
+
+bool
+AudioFaderBox::owns(const QObject *object)
+{
+ return (object &&
+ ((object->parent() == this) ||
+ (object->parent() && (object->parent()->parent() == this))));
+}
+
+void
+AudioFaderBox::setAudioChannels(int channels)
+{
+ m_isStereo = (channels > 1);
+
+ switch (channels) {
+ case 1:
+ if (m_stereoButton)
+ m_stereoButton->setPixmap(m_monoPixmap);
+ m_isStereo = false;
+ break;
+
+ case 2:
+ if (m_stereoButton)
+ m_stereoButton->setPixmap(m_stereoPixmap);
+ m_isStereo = true;
+ break;
+ default:
+ RG_DEBUG << "AudioFaderBox::setAudioChannels - "
+ << "unsupported channel numbers (" << channels
+ << ")" << endl;
+ return ;
+ }
+
+ if (m_audioInput)
+ m_audioInput->slotRepopulate();
+ if (m_audioOutput)
+ m_audioOutput->slotRepopulate();
+}
+
+void
+AudioFaderBox::slotChannelStateChanged()
+{
+ if (m_isStereo) {
+ setAudioChannels(1);
+ emit audioChannelsChanged(1);
+ } else {
+ setAudioChannels(2);
+ emit audioChannelsChanged(2);
+ }
+}
+
+}
+#include "AudioFaderBox.moc"
diff --git a/src/gui/widgets/AudioFaderBox.h b/src/gui/widgets/AudioFaderBox.h
new file mode 100644
index 0000000..060fc9c
--- /dev/null
+++ b/src/gui/widgets/AudioFaderBox.h
@@ -0,0 +1,114 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_AUDIOFADERBOX_H_
+#define _RG_AUDIOFADERBOX_H_
+
+#include <qframe.h>
+#include <qpixmap.h>
+#include <qstring.h>
+#include <vector>
+
+
+class QWidget;
+class QSignalMapper;
+class QPushButton;
+class QObject;
+class QLabel;
+
+
+namespace Rosegarden
+{
+
+class Studio;
+class Rotary;
+class Instrument;
+class Fader;
+class AudioVUMeter;
+class AudioRouteMenu;
+
+
+class AudioFaderBox : public QFrame
+{
+ Q_OBJECT
+
+public:
+ AudioFaderBox(QWidget *parent,
+ QString id = "",
+ bool haveInOut = true,
+ const char *name = 0);
+
+ void setAudioChannels(int);
+
+ void setIsSynth(bool);
+
+ bool owns(const QObject *object);
+
+ QPushButton *m_synthButton;
+ std::vector<QPushButton*> m_plugins;
+
+ AudioVUMeter *m_vuMeter;
+
+ Fader *m_fader;
+ Fader *m_recordFader;
+ Rotary *m_pan;
+
+ QPixmap m_monoPixmap;
+ QPixmap m_stereoPixmap;
+
+ QSignalMapper *m_signalMapper;
+
+ QLabel *m_inputLabel;
+ QLabel *m_outputLabel;
+
+ AudioRouteMenu *m_audioInput;
+ AudioRouteMenu *m_audioOutput;
+
+ QPushButton *m_synthGUIButton;
+
+ QString m_id;
+
+ bool isStereo() const { return m_isStereo; }
+
+signals:
+ void audioChannelsChanged(int);
+
+public slots:
+ void slotSetInstrument(Studio *studio,
+ Instrument *instrument);
+
+protected slots:
+ void slotChannelStateChanged();
+
+protected:
+ QPushButton *m_stereoButton;
+ bool m_isStereo;
+};
+
+
+
+}
+
+#endif
diff --git a/src/gui/widgets/AudioListItem.h b/src/gui/widgets/AudioListItem.h
new file mode 100644
index 0000000..bbd8fc2
--- /dev/null
+++ b/src/gui/widgets/AudioListItem.h
@@ -0,0 +1,97 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_AUDIOLISTITEM_H_
+#define _RG_AUDIOLISTITEM_H_
+
+#include <sound/AudioFile.h>
+#include <klistview.h>
+
+namespace Rosegarden
+{
+
+class Segment;
+
+// Add an Id to a QListViewItem
+//
+class AudioListItem : public KListViewItem
+{
+
+public:
+
+ AudioListItem(KListView *parent):KListViewItem(parent),
+ m_segment(0) {;}
+
+ AudioListItem(KListViewItem *parent):KListViewItem(parent),
+ m_segment(0) {;}
+
+ AudioListItem(KListView *parent,
+ QString label,
+ AudioFileId id):
+ KListViewItem(parent,
+ label,
+ "", "", "", "", "", "", ""),
+ m_id(id),
+ m_segment(0) {;}
+
+ AudioListItem(KListViewItem *parent,
+ QString label,
+ AudioFileId id):
+ KListViewItem(parent,
+ label,
+ "", "", "", "", "", "", ""),
+ m_id(id),
+ m_segment(0) {;}
+
+
+ AudioFileId getId() { return m_id; }
+
+ void setStartTime(const RealTime &time)
+ { m_startTime = time; }
+ RealTime getStartTime() { return m_startTime; }
+
+ void setDuration(const RealTime &time)
+ { m_duration = time; }
+ RealTime getDuration() { return m_duration; }
+
+ void setSegment(Segment *segment)
+ { m_segment = segment; }
+ Segment *getSegment() { return m_segment; }
+
+protected:
+ AudioFileId m_id;
+
+ // for audio segments
+ RealTime m_startTime;
+ RealTime m_duration;
+
+ // pointer to a segment
+ Segment *m_segment;
+
+};
+
+}
+
+
+#endif /*AUDIOLISTITEM_H_*/
diff --git a/src/gui/widgets/AudioListView.cpp b/src/gui/widgets/AudioListView.cpp
new file mode 100644
index 0000000..45193a6
--- /dev/null
+++ b/src/gui/widgets/AudioListView.cpp
@@ -0,0 +1,67 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "AudioListView.h"
+
+#include "misc/Debug.h"
+#include "gui/widgets/AudioListItem.h"
+#include "qdragobject.h"
+
+namespace Rosegarden {
+
+AudioListView::AudioListView(QWidget *parent, const char *name)
+ : KListView(parent, name)
+{
+ setDragEnabled(true);
+ setAcceptDrops(true);
+ setDropVisualizer(false);
+}
+
+bool AudioListView::acceptDrag(QDropEvent* e) const
+{
+ return QUriDrag::canDecode(e) || KListView::acceptDrag(e);
+}
+
+QDragObject* AudioListView::dragObject()
+{
+ AudioListItem* item = dynamic_cast<AudioListItem*>(currentItem());
+
+ QString audioData;
+ QTextOStream ts(&audioData);
+ ts << "AudioFileManager\n"
+ << item->getId() << '\n'
+ << item->getStartTime().sec << '\n'
+ << item->getStartTime().nsec << '\n'
+ << item->getDuration().sec << '\n'
+ << item->getDuration().nsec << '\n';
+
+ RG_DEBUG << "AudioListView::dragObject - "
+ << "file id = " << item->getId()
+ << ", start time = " << item->getStartTime() << endl;
+
+ return new QTextDrag(audioData, this);
+}
+
+}
diff --git a/src/gui/widgets/AudioListView.h b/src/gui/widgets/AudioListView.h
new file mode 100644
index 0000000..477054a
--- /dev/null
+++ b/src/gui/widgets/AudioListView.h
@@ -0,0 +1,44 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_AUDIOLISTVIEW_H_
+#define _RG_AUDIOLISTVIEW_H_
+
+#include <klistview.h>
+
+namespace Rosegarden {
+
+class AudioListView : public KListView
+{
+public:
+ AudioListView(QWidget *parent = 0, const char *name = 0);
+
+protected:
+ bool acceptDrag(QDropEvent* e) const;
+ virtual QDragObject* dragObject();
+};
+
+}
+
+#endif /*AUDIOLISTVIEW_H_*/
diff --git a/src/gui/widgets/AudioRouteMenu.cpp b/src/gui/widgets/AudioRouteMenu.cpp
new file mode 100644
index 0000000..6f4c93f
--- /dev/null
+++ b/src/gui/widgets/AudioRouteMenu.cpp
@@ -0,0 +1,381 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "AudioRouteMenu.h"
+#include "WheelyButton.h"
+
+#include "base/Instrument.h"
+#include "base/Studio.h"
+#include "gui/studio/StudioControl.h"
+#include "gui/widgets/RosegardenPopupMenu.h"
+#include "sound/MappedCommon.h"
+#include "sound/MappedStudio.h"
+#include <kcombobox.h>
+#include <klocale.h>
+#include <qcursor.h>
+#include <qobject.h>
+#include <qpoint.h>
+#include <qstring.h>
+#include <qwidget.h>
+
+
+namespace Rosegarden
+{
+
+AudioRouteMenu::AudioRouteMenu(QWidget *par,
+ Direction direction,
+ Format format,
+ Studio *studio,
+ Instrument *instrument) :
+ QObject(par),
+ m_studio(studio),
+ m_instrument(instrument),
+ m_direction(direction),
+ m_format(format)
+{
+ switch (format) {
+
+ case Compact: {
+ m_combo = 0;
+ m_button = new WheelyButton(par);
+ connect(m_button, SIGNAL(wheel(bool)), this, SLOT(slotWheel(bool)));
+ connect(m_button, SIGNAL(clicked()), this, SLOT(slotShowMenu()));
+ break;
+ }
+
+ case Regular: {
+ m_button = 0;
+ m_combo = new KComboBox(par);
+ connect(m_combo, SIGNAL(activated(int)), this, SLOT(slotEntrySelected(int)));
+ break;
+ }
+
+ }
+
+ slotRepopulate();
+}
+
+QWidget *
+AudioRouteMenu::getWidget()
+{
+ if (m_button)
+ return m_button;
+ else
+ return m_combo;
+}
+
+void
+AudioRouteMenu::slotRepopulate()
+{
+ switch (m_format) {
+
+ case Compact:
+ m_button->setText(getEntryText(getCurrentEntry()));
+ break;
+
+ case Regular:
+ m_combo->clear();
+ for (int i = 0; i < getNumEntries(); ++i) {
+ m_combo->insertItem(getEntryText(i));
+ }
+ m_combo->setCurrentItem(getCurrentEntry());
+ break;
+ }
+}
+
+void
+AudioRouteMenu::slotSetInstrument(Studio *studio,
+ Instrument *instrument)
+{
+ m_studio = studio;
+ m_instrument = instrument;
+ slotRepopulate();
+}
+
+void
+AudioRouteMenu::slotWheel(bool up)
+{
+ int current = getCurrentEntry();
+ if (up) { // actually moves down the list
+ if (current > 0)
+ slotEntrySelected(current - 1);
+ } else {
+ if (current < getNumEntries() - 1)
+ slotEntrySelected(current + 1);
+ }
+}
+
+void
+AudioRouteMenu::slotShowMenu()
+{
+ if (getNumEntries() == 0)
+ return ;
+
+ RosegardenPopupMenu *menu = new RosegardenPopupMenu((QWidget *)parent());
+
+ for (int i = 0; i < getNumEntries(); ++i) {
+
+ menu->insertItem(getEntryText(i), this, SLOT(slotEntrySelected(int)),
+ 0, i);
+ menu->setItemParameter(i, i);
+ }
+
+ int itemHeight = menu->itemHeight(0) + 2;
+ QPoint pos = QCursor::pos();
+
+ pos.rx() -= 10;
+ pos.ry() -= (itemHeight / 2 + getCurrentEntry() * itemHeight);
+
+ menu->popup(pos);
+}
+
+int
+AudioRouteMenu::getNumEntries()
+{
+ if (!m_instrument)
+ return 0;
+
+ switch (m_direction) {
+
+ case In: {
+ int stereoIns =
+ m_studio->getRecordIns().size() +
+ m_studio->getBusses().size();
+
+ if (m_instrument->getAudioChannels() > 1) {
+ return stereoIns;
+ } else {
+ return stereoIns * 2;
+ }
+
+ break;
+ }
+
+ case Out:
+ return m_studio->getBusses().size();
+ }
+
+ return 0;
+}
+
+int
+AudioRouteMenu::getCurrentEntry()
+{
+ if (!m_instrument)
+ return 0;
+
+ switch (m_direction) {
+
+ case In: {
+ bool stereo = (m_instrument->getAudioChannels() > 1);
+
+ bool isBuss;
+ int channel;
+ int input = m_instrument->getAudioInput(isBuss, channel);
+
+ if (isBuss) {
+ int recordIns = m_studio->getRecordIns().size();
+ if (stereo) {
+ return recordIns + input;
+ } else {
+ return recordIns * 2 + input * 2 + channel;
+ }
+ } else {
+ if (stereo) {
+ return input;
+ } else {
+ return input * 2 + channel;
+ }
+ }
+
+ break;
+ }
+
+ case Out:
+ return m_instrument->getAudioOutput();
+ }
+
+ return 0;
+}
+
+QString
+AudioRouteMenu::getEntryText(int entry)
+{
+ switch (m_direction) {
+
+ case In: {
+ bool stereo = (m_instrument->getAudioChannels() > 1);
+ int recordIns = m_studio->getRecordIns().size();
+
+ if (stereo) {
+ if (entry < recordIns) {
+ return i18n("In %1").arg(entry + 1);
+ } else if (entry == recordIns) {
+ return i18n("Master");
+ } else {
+ return i18n("Sub %1").arg(entry - recordIns);
+ }
+ } else {
+ int channel = entry % 2;
+ entry /= 2;
+ if (entry < recordIns) {
+ return (channel ? i18n("In %1 R") :
+ i18n("In %1 L")).arg(entry + 1);
+ } else if (entry == recordIns) {
+ return (channel ? i18n("Master R") :
+ i18n("Master L"));
+ } else {
+ return (channel ? i18n("Sub %1 R") :
+ i18n("Sub %1 L")).arg(entry - recordIns);
+ }
+ }
+ break;
+ }
+
+ case Out:
+ if (entry == 0)
+ return i18n("Master");
+ else
+ return i18n("Sub %1").arg(entry);
+ }
+
+ return QString();
+}
+
+void
+AudioRouteMenu::slotEntrySelected(int i)
+{
+ switch (m_direction) {
+
+ case In: {
+ bool stereo = (m_instrument->getAudioChannels() > 1);
+
+ bool oldIsBuss;
+ int oldChannel;
+ int oldInput = m_instrument->getAudioInput(oldIsBuss, oldChannel);
+
+ bool newIsBuss;
+ int newChannel = 0;
+ int newInput;
+
+ int recordIns = m_studio->getRecordIns().size();
+
+ if (stereo) {
+ newIsBuss = (i >= recordIns);
+ if (newIsBuss) {
+ newInput = i - recordIns;
+ } else {
+ newInput = i;
+ }
+ } else {
+ newIsBuss = (i >= recordIns * 2);
+ newChannel = i % 2;
+ if (newIsBuss) {
+ newInput = i / 2 - recordIns;
+ } else {
+ newInput = i / 2;
+ }
+ }
+
+ MappedObjectId oldMappedId = 0, newMappedId = 0;
+
+ if (oldIsBuss) {
+ Buss *buss = m_studio->getBussById(oldInput);
+ if (buss)
+ oldMappedId = buss->getMappedId();
+ } else {
+ RecordIn *in = m_studio->getRecordIn(oldInput);
+ if (in)
+ oldMappedId = in->getMappedId();
+ }
+
+ if (newIsBuss) {
+ Buss *buss = m_studio->getBussById(newInput);
+ if (!buss)
+ return ;
+ newMappedId = buss->getMappedId();
+ } else {
+ RecordIn *in = m_studio->getRecordIn(newInput);
+ if (!in)
+ return ;
+ newMappedId = in->getMappedId();
+ }
+
+ if (oldMappedId != 0) {
+ StudioControl::disconnectStudioObjects
+ (oldMappedId, m_instrument->getMappedId());
+ } else {
+ StudioControl::disconnectStudioObject
+ (m_instrument->getMappedId());
+ }
+
+ StudioControl::setStudioObjectProperty
+ (m_instrument->getMappedId(),
+ MappedAudioFader::InputChannel,
+ MappedObjectValue(newChannel));
+
+ if (newMappedId != 0) {
+ StudioControl::connectStudioObjects
+ (newMappedId, m_instrument->getMappedId());
+ }
+
+ if (newIsBuss) {
+ m_instrument->setAudioInputToBuss(newInput, newChannel);
+ } else {
+ m_instrument->setAudioInputToRecord(newInput, newChannel);
+ }
+
+ break;
+ }
+
+ case Out: {
+ BussId bussId = m_instrument->getAudioOutput();
+ Buss *oldBuss = m_studio->getBussById(bussId);
+ Buss *newBuss = m_studio->getBussById(i);
+ if (!newBuss)
+ return ;
+
+ if (oldBuss) {
+ StudioControl::disconnectStudioObjects
+ (m_instrument->getMappedId(), oldBuss->getMappedId());
+ } else {
+ StudioControl::disconnectStudioObject
+ (m_instrument->getMappedId());
+ }
+
+ StudioControl::connectStudioObjects
+ (m_instrument->getMappedId(), newBuss->getMappedId());
+
+ m_instrument->setAudioOutput(i);
+ break;
+ }
+ }
+
+ slotRepopulate();
+ emit changed();
+}
+
+}
+#include "AudioRouteMenu.moc"
diff --git a/src/gui/widgets/AudioRouteMenu.h b/src/gui/widgets/AudioRouteMenu.h
new file mode 100644
index 0000000..259da68
--- /dev/null
+++ b/src/gui/widgets/AudioRouteMenu.h
@@ -0,0 +1,94 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_AUDIOROUTEMENU_H_
+#define _RG_AUDIOROUTEMENU_H_
+
+#include <qobject.h>
+#include <qstring.h>
+
+
+class QWidget;
+class KComboBox;
+
+
+namespace Rosegarden
+{
+
+class WheelyButton;
+class Studio;
+class Instrument;
+
+
+class AudioRouteMenu : public QObject
+{
+ Q_OBJECT
+
+public:
+ enum Direction { In, Out };
+ enum Format { Compact, Regular };
+
+ AudioRouteMenu(QWidget *parent,
+ Direction direction,
+ Format format,
+ Studio *studio = 0,
+ Instrument *instrument = 0);
+
+ QWidget *getWidget();
+
+public slots:
+ void slotRepopulate();
+ void slotSetInstrument(Studio *, Instrument *);
+
+protected slots:
+ void slotWheel(bool up);
+ void slotShowMenu();
+ void slotEntrySelected(int);
+
+signals:
+ // The menu writes changes directly to the instrument, but it
+ // also emits this to let you know something has changed
+ void changed();
+
+private:
+ Studio *m_studio;
+ Instrument *m_instrument;
+ Direction m_direction;
+ Format m_format;
+
+ WheelyButton *m_button;
+ KComboBox *m_combo;
+
+ int getNumEntries();
+ int getCurrentEntry(); // for instrument
+ QString getEntryText(int n);
+};
+
+
+
+
+}
+
+#endif
diff --git a/src/gui/widgets/AudioVUMeter.cpp b/src/gui/widgets/AudioVUMeter.cpp
new file mode 100644
index 0000000..4c15a07
--- /dev/null
+++ b/src/gui/widgets/AudioVUMeter.cpp
@@ -0,0 +1,103 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "AudioVUMeter.h"
+
+#include "gui/rulers/VelocityColour.h"
+#include <qcolor.h>
+#include <qlabel.h>
+#include <qpainter.h>
+#include <qtimer.h>
+#include <qwidget.h>
+#include "VUMeter.h"
+
+
+namespace Rosegarden
+{
+
+AudioVUMeter::AudioVUMeter(QWidget *parent,
+ VUMeter::VUMeterType type,
+ bool stereo,
+ bool hasRecord,
+ int width,
+ int height,
+ const char *name) :
+ QWidget(parent, name),
+ m_stereo(stereo)
+{
+ setBackgroundMode(Qt::NoBackground);
+ setFixedSize(width, height);
+
+ // This offset is intended to match that for the height of the
+ // button pixmap in Fader (in studiowidgets.cpp, which
+ // is probably where this class should be too)
+
+ m_yoff = height / 7;
+ m_yoff /= 10;
+ ++m_yoff;
+ m_yoff *= 10;
+ ++m_yoff;
+
+ // This one is _not_ intended to match that for the button width
+
+ m_xoff = width / 4;
+ if (m_xoff % 2 == 1)
+ ++m_xoff;
+
+ m_meter = new AudioVUMeterImpl(this, type, stereo, hasRecord,
+ width - m_xoff, height - m_yoff, name);
+
+ m_meter->move(m_xoff / 2, m_yoff / 2);
+}
+
+void
+AudioVUMeter::paintEvent(QPaintEvent *e)
+{
+ QPainter paint(this);
+ paint.setPen(colorGroup().mid());
+ paint.drawRect(0, 0, width(), height());
+
+ paint.setPen(colorGroup().background());
+ paint.setBrush(colorGroup().background());
+ paint.drawRect(1, 1, width() - 2, m_yoff / 2 - 1);
+ paint.drawRect(1, 1, m_xoff / 2 - 1, height() - 2);
+ paint.drawRect(width() - m_xoff / 2 - 1, 1, m_xoff / 2, height() - 2);
+ paint.drawRect(1, height() - m_yoff / 2 - 1, width() - 2, m_yoff / 2);
+ paint.end();
+
+ m_meter->paintEvent(e);
+}
+
+AudioVUMeter::AudioVUMeterImpl::AudioVUMeterImpl(QWidget *parent,
+ VUMeterType type,
+ bool stereo,
+ bool hasRecord,
+ int width,
+ int height,
+ const char *name) :
+ VUMeter(parent, type, stereo, hasRecord, width, height, VUMeter::Vertical, name)
+{}
+
+}
diff --git a/src/gui/widgets/AudioVUMeter.h b/src/gui/widgets/AudioVUMeter.h
new file mode 100644
index 0000000..cff7c27
--- /dev/null
+++ b/src/gui/widgets/AudioVUMeter.h
@@ -0,0 +1,96 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_AUDIOVUMETER_H_
+#define _RG_AUDIOVUMETER_H_
+
+#include <qwidget.h>
+#include "VUMeter.h"
+
+
+class QPaintEvent;
+
+
+namespace Rosegarden
+{
+
+
+
+class AudioVUMeter : public QWidget
+{
+public:
+ AudioVUMeter(QWidget *parent = 0,
+ VUMeter::VUMeterType type = VUMeter::AudioPeakHoldShort,
+ bool stereo = true,
+ bool hasRecord = false,
+ int width = 12,
+ int height = 140,
+ const char *name = 0);
+
+ void setLevel(double dB) {
+ m_meter->setLevel(dB);
+ }
+ void setLevel(double dBleft, double dBright) {
+ m_meter->setLevel(dBleft, dBright);
+ }
+
+ void setRecordLevel(double dB) {
+ m_meter->setRecordLevel(dB);
+ }
+ void setRecordLevel(double dBleft, double dBright) {
+ m_meter->setRecordLevel(dBleft, dBright);
+ }
+
+ virtual void paintEvent(QPaintEvent*);
+
+protected:
+ class AudioVUMeterImpl : public VUMeter
+ {
+ public:
+ AudioVUMeterImpl(QWidget *parent,
+ VUMeterType type,
+ bool stereo,
+ bool hasRecord,
+ int width,
+ int height,
+ const char *name);
+ protected:
+ virtual void meterStart() { }
+ virtual void meterStop() { }
+ };
+
+ AudioVUMeterImpl *m_meter;
+ bool m_stereo;
+ int m_yoff;
+ int m_xoff;
+};
+
+
+// A push button that emits wheel events. Used by AudioRouteMenu.
+//
+
+}
+
+#endif
diff --git a/src/gui/widgets/BigArrowButton.h b/src/gui/widgets/BigArrowButton.h
new file mode 100644
index 0000000..505e374
--- /dev/null
+++ b/src/gui/widgets/BigArrowButton.h
@@ -0,0 +1,47 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_BIGARROWBUTTON_H_
+#define _RG_BIGARROWBUTTON_H_
+
+#include <karrowbutton.h>
+
+namespace Rosegarden {
+
+class BigArrowButton : public KArrowButton
+{
+public:
+ BigArrowButton(QWidget *parent = 0, Qt::ArrowType arrow = Qt::UpArrow,
+ const char *name = 0) :
+ KArrowButton(parent, arrow, name) { }
+ virtual ~BigArrowButton() { }
+
+ virtual QSize sizeHint() const {
+ return QSize(20, 20);
+ }
+};
+
+}
+
+#endif /*BIGARROWBUTTON_H_*/
diff --git a/src/gui/widgets/CollapsingFrame.cpp b/src/gui/widgets/CollapsingFrame.cpp
new file mode 100644
index 0000000..1f71ebf
--- /dev/null
+++ b/src/gui/widgets/CollapsingFrame.cpp
@@ -0,0 +1,148 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "CollapsingFrame.h"
+#include <kapplication.h>
+#include <kstddirs.h>
+#include <kconfig.h>
+#include <kglobal.h>
+#include <qfont.h>
+#include <qframe.h>
+#include <qlayout.h>
+#include <qpixmap.h>
+#include <qstring.h>
+#include <qtoolbutton.h>
+#include <qwidget.h>
+#include <cassert>
+
+
+namespace Rosegarden
+{
+
+CollapsingFrame::CollapsingFrame(QString label, QWidget *parent, const char *n) :
+ QFrame(parent, n),
+ m_widget(0),
+ m_fill(false),
+ m_collapsed(false)
+{
+ m_layout = new QGridLayout(this, 3, 3, 0, 0);
+
+ m_toggleButton = new QToolButton(this);
+ m_toggleButton->setTextLabel(label);
+ m_toggleButton->setUsesTextLabel(true);
+ m_toggleButton->setUsesBigPixmap(false);
+ m_toggleButton->setTextPosition(QToolButton::BesideIcon);
+ m_toggleButton->setAutoRaise(true);
+
+ QFont font(m_toggleButton->font());
+ font.setBold(true);
+ m_toggleButton->setFont(font);
+
+ QString pixmapDir = KGlobal::dirs()->findResource("appdata", "pixmaps/");
+ QPixmap pixmap(pixmapDir + "/misc/arrow-expanded.png");
+ m_toggleButton->setIconSet(pixmap);
+
+ connect(m_toggleButton, SIGNAL(clicked()), this, SLOT(toggle()));
+
+ m_layout->addMultiCellWidget(m_toggleButton, 0, 0, 0, 2);
+}
+
+CollapsingFrame::~CollapsingFrame()
+{}
+
+void
+CollapsingFrame::setWidgetFill(bool fill)
+{
+ m_fill = fill;
+}
+
+QFont
+CollapsingFrame::font() const
+{
+ return m_toggleButton->font();
+}
+
+void
+CollapsingFrame::setFont(QFont font)
+{
+ m_toggleButton->setFont(font);
+}
+
+void
+CollapsingFrame::setWidget(QWidget *widget)
+{
+ assert(!m_widget);
+ m_widget = widget;
+ if (m_fill) {
+ m_layout->addMultiCellWidget(widget, 1, 1, 0, 2);
+ } else {
+ m_layout->addWidget(widget, 1, 1);
+ }
+
+ bool expanded = true;
+ if (name(0)) {
+ KConfig *config = kapp->config();
+ QString groupTemp = config->group();
+ config->setGroup("CollapsingFrame");
+ expanded = config->readBoolEntry(name(), true);
+ config->setGroup(groupTemp);
+ }
+ if (expanded != !m_collapsed)
+ toggle();
+}
+
+void
+CollapsingFrame::toggle()
+{
+ int h = m_toggleButton->height();
+
+ m_collapsed = !m_collapsed;
+
+ m_widget->setShown(!m_collapsed);
+
+ QString pixmapDir = KGlobal::dirs()->findResource("appdata", "pixmaps/");
+ QPixmap pixmap;
+
+ if (m_collapsed) {
+ pixmap = QPixmap(pixmapDir + "/misc/arrow-contracted.png");
+ } else {
+ pixmap = QPixmap(pixmapDir + "/misc/arrow-expanded.png");
+ }
+
+ if (name(0)) {
+ KConfig *config = kapp->config();
+ QString groupTemp = config->group();
+ config->setGroup("CollapsingFrame");
+ config->writeEntry(name(), !m_collapsed);
+ config->setGroup(groupTemp);
+ }
+
+ m_toggleButton->setIconSet(pixmap);
+
+ m_toggleButton->setMaximumHeight(h);
+}
+
+}
+#include "CollapsingFrame.moc"
diff --git a/src/gui/widgets/CollapsingFrame.h b/src/gui/widgets/CollapsingFrame.h
new file mode 100644
index 0000000..780a8b1
--- /dev/null
+++ b/src/gui/widgets/CollapsingFrame.h
@@ -0,0 +1,75 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_COLLAPSINGFRAME_H_
+#define _RG_COLLAPSINGFRAME_H_
+
+#include <qframe.h>
+#include <qstring.h>
+
+
+class QWidget;
+class QToolButton;
+class QGridLayout;
+
+
+namespace Rosegarden
+{
+
+
+
+class CollapsingFrame : public QFrame
+{
+ Q_OBJECT
+
+public:
+ CollapsingFrame(QString label, QWidget *parent = 0, const char *name = 0);
+ virtual ~CollapsingFrame();
+
+ QFont font() const;
+ void setFont(QFont font);
+
+ /// If true, the widget fills the available space. Call before setWidget
+ void setWidgetFill(bool fill);
+
+ /// This frame contains a single other widget. Set it here.
+ void setWidget(QWidget *w);
+
+public slots:
+ void toggle();
+
+protected:
+ QGridLayout *m_layout;
+ QToolButton *m_toggleButton;
+ QWidget *m_widget;
+ bool m_fill;
+ bool m_collapsed;
+};
+
+
+
+}
+
+#endif
diff --git a/src/gui/widgets/ColourTable.cpp b/src/gui/widgets/ColourTable.cpp
new file mode 100644
index 0000000..c5fcfc6
--- /dev/null
+++ b/src/gui/widgets/ColourTable.cpp
@@ -0,0 +1,131 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "ColourTable.h"
+
+#include <klocale.h>
+#include "misc/Strings.h"
+#include "base/ColourMap.h"
+#include "ColourTableItem.h"
+#include "gui/general/GUIPalette.h"
+#include <kcolordialog.h>
+#include <klineeditdlg.h>
+#include <qcolor.h>
+#include <qpoint.h>
+#include <qstring.h>
+#include <qtable.h>
+#include <qwidget.h>
+
+
+namespace Rosegarden
+{
+
+ColourTable::ColourTable
+(QWidget *parent, ColourMap &input, ColourList &list)
+ : QTable(1, 2, parent, "RColourTable")
+{
+ setSorting(FALSE);
+ setSelectionMode(QTable::SingleRow);
+ horizontalHeader()->setLabel(0, i18n("Name"));
+ horizontalHeader()->setLabel(1, i18n("Color"));
+ populate_table(input, list);
+ connect(this, SIGNAL(doubleClicked(int, int, int, const QPoint&)),
+ SLOT(slotEditEntry(int, int)));
+
+}
+
+void
+ColourTable::slotEditEntry(int row, int col)
+{
+
+ switch (col) {
+ case 0: {
+ if (row == 0)
+ return ;
+ bool ok = false;
+ QString newName = KLineEditDlg::getText(i18n("Modify Color Name"), i18n("Enter new name"),
+ item(row, col)->text(), &ok);
+
+ if ((ok == true) && (!newName.isEmpty())) {
+ emit entryTextChanged(row, newName);
+ return ;
+ }
+ }
+ break;
+ case 1: {
+ QColor temp = m_colours[row];
+ KColorDialog box(this, "", true);
+
+ int result = box.getColor(temp);
+
+ if (result == KColorDialog::Accepted) {
+ emit entryColourChanged(row, temp);
+ return ;
+ }
+ }
+ break;
+ default: // Should never happen
+ break;
+ }
+
+}
+
+void
+ColourTable::populate_table(ColourMap &input, ColourList &list)
+{
+ m_colours.reserve(input.size());
+ setNumRows(input.size());
+
+ QString name;
+
+ unsigned int i = 0;
+
+ for (RCMap::const_iterator it = input.begin(); it != input.end(); ++it) {
+ if (it->second.second == std::string(""))
+ name = i18n("Default Color");
+ else
+ name = strtoqstr(it->second.second);
+
+ QTableItem *text = new QTableItem(
+ dynamic_cast<QTable*>(this),
+ QTableItem::Never, name);
+
+ setItem(i, 0, text);
+
+ list[i] = it->first;
+ m_colours[i] = GUIPalette::convertColour(it->second.first);
+
+ ColourTableItem *temp = new ColourTableItem(this, m_colours[i]);
+ setItem(i, 1, temp);
+
+ verticalHeader()->setLabel(i, QString::number(it->first));
+
+ ++i;
+ }
+
+}
+
+}
+#include "ColourTable.moc"
diff --git a/src/gui/widgets/ColourTable.h b/src/gui/widgets/ColourTable.h
new file mode 100644
index 0000000..48e2309
--- /dev/null
+++ b/src/gui/widgets/ColourTable.h
@@ -0,0 +1,72 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ Portions of this file Copyright 2003
+ Mark Hymers <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_ROSEGARDENCOLOURTABLE_H_
+#define _RG_ROSEGARDENCOLOURTABLE_H_
+
+#include <map>
+#include <qtable.h>
+#include <vector>
+
+
+class QWidget;
+class ColourList;
+
+
+namespace Rosegarden
+{
+
+class ColourMap;
+
+
+class ColourTable : public QTable
+{
+ Q_OBJECT
+
+public:
+ typedef std::map<unsigned int, unsigned int, std::less<unsigned int> > ColourList;
+ ColourTable(QWidget *parent, ColourMap &input, ColourList &list);
+ void populate_table(ColourMap &input, ColourList &list);
+
+
+signals:
+ void entryTextChanged(unsigned int, QString);
+ void entryColourChanged(unsigned int, QColor);
+
+public slots:
+ void slotEditEntry (int, int);
+
+protected:
+ std::vector<QColor> m_colours;
+
+};
+
+
+}
+
+#endif
diff --git a/src/gui/widgets/ColourTableItem.cpp b/src/gui/widgets/ColourTableItem.cpp
new file mode 100644
index 0000000..3dfbd87
--- /dev/null
+++ b/src/gui/widgets/ColourTableItem.cpp
@@ -0,0 +1,52 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "ColourTableItem.h"
+
+#include <qcolor.h>
+#include <qpainter.h>
+#include <qrect.h>
+#include <qtable.h>
+
+
+namespace Rosegarden
+{
+
+void
+ColourTableItem::setColor(QColor &input)
+{
+ currentColour = input;
+}
+
+void
+ColourTableItem::paint(QPainter *p, const QColorGroup &cg, const QRect &cr, bool selected)
+{
+ QColorGroup g(cg);
+ g.setColor(QColorGroup::Base, currentColour);
+ selected = false;
+ QTableItem::paint(p, g, cr, selected);
+}
+
+}
diff --git a/src/gui/widgets/ColourTableItem.h b/src/gui/widgets/ColourTableItem.h
new file mode 100644
index 0000000..a8c906e
--- /dev/null
+++ b/src/gui/widgets/ColourTableItem.h
@@ -0,0 +1,60 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_ROSEGARDENCOLOURTABLEITEM_H_
+#define _RG_ROSEGARDENCOLOURTABLEITEM_H_
+
+#include <qcolor.h>
+#include <qtable.h>
+
+class QTable;
+class QRect;
+class QPainter;
+class QColorGroup;
+
+
+namespace Rosegarden
+{
+
+
+
+class ColourTableItem : public QTableItem
+{
+public:
+ ColourTableItem(QTable *t, const QColor &input)
+ : QTableItem(t, QTableItem::Never, ""),
+ currentColour(input) {}
+ void setColor(QColor &input);
+ void paint(QPainter *p, const QColorGroup &cg, const QRect &cr, bool selected);
+
+protected:
+ QColor currentColour;
+};
+
+
+
+}
+
+#endif
diff --git a/src/gui/widgets/CurrentProgressDialog.cpp b/src/gui/widgets/CurrentProgressDialog.cpp
new file mode 100644
index 0000000..2e3735f
--- /dev/null
+++ b/src/gui/widgets/CurrentProgressDialog.cpp
@@ -0,0 +1,84 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "CurrentProgressDialog.h"
+
+#include "ProgressDialog.h"
+#include <qobject.h>
+
+
+namespace Rosegarden
+{
+
+CurrentProgressDialog* CurrentProgressDialog::getInstance()
+{
+ if (!m_instance)
+ m_instance = new CurrentProgressDialog(0);
+
+ return m_instance;
+}
+
+
+ProgressDialog*
+CurrentProgressDialog::get()
+{
+ return m_currentProgressDialog;
+}
+
+void
+CurrentProgressDialog::set(ProgressDialog* d)
+{
+ if (m_currentProgressDialog)
+ m_currentProgressDialog->disconnect(getInstance());
+
+ m_currentProgressDialog = d;
+
+ // this lets the progress dialog deregister itself when it's deleted
+ connect(d, SIGNAL(destroyed()),
+ getInstance(), SLOT(slotCurrentProgressDialogDestroyed()));
+}
+
+void CurrentProgressDialog::freeze()
+{
+ if (m_currentProgressDialog)
+ m_currentProgressDialog->slotFreeze();
+}
+
+void CurrentProgressDialog::thaw()
+{
+ if (m_currentProgressDialog)
+ m_currentProgressDialog->slotThaw();
+}
+
+void CurrentProgressDialog::slotCurrentProgressDialogDestroyed()
+{
+ m_currentProgressDialog = 0;
+}
+
+CurrentProgressDialog* CurrentProgressDialog::m_instance = 0;
+ProgressDialog* CurrentProgressDialog::m_currentProgressDialog = 0;
+
+}
+#include "CurrentProgressDialog.moc"
diff --git a/src/gui/widgets/CurrentProgressDialog.h b/src/gui/widgets/CurrentProgressDialog.h
new file mode 100644
index 0000000..d0eea2e
--- /dev/null
+++ b/src/gui/widgets/CurrentProgressDialog.h
@@ -0,0 +1,81 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_CURRENTPROGRESSDIALOG_H_
+#define _RG_CURRENTPROGRESSDIALOG_H_
+
+#include <qobject.h>
+
+
+
+
+namespace Rosegarden
+{
+
+class ProgressDialog;
+
+
+class CurrentProgressDialog : public QObject
+{
+ Q_OBJECT
+public:
+ static CurrentProgressDialog* getInstance();
+
+ static ProgressDialog* get();
+ static void set(ProgressDialog*);
+
+ /**
+ * Block the current progress so that it won't appear
+ * regardless of passing time and occurring events.
+ * This is useful when you want to show another dialog
+ * and you want to make sure the progress dialog is out of the way
+ */
+ static void freeze();
+
+ /**
+ * Restores the progress dialog to its normal state atfer a freeze()
+ */
+ static void thaw();
+
+public slots:
+ /// Called then the current progress dialog is being destroyed
+ void slotCurrentProgressDialogDestroyed();
+
+protected:
+ CurrentProgressDialog(QObject* parent, const char* name = 0)
+ : QObject(parent, name) {}
+
+ //--------------- Data members ---------------------------------
+ static CurrentProgressDialog* m_instance;
+ static ProgressDialog* m_currentProgressDialog;
+};
+
+
+// A Text popup - a tooltip we can control.
+//
+
+}
+
+#endif
diff --git a/src/gui/widgets/DiatonicPitchChooser.cpp b/src/gui/widgets/DiatonicPitchChooser.cpp
new file mode 100644
index 0000000..95b8b3a
--- /dev/null
+++ b/src/gui/widgets/DiatonicPitchChooser.cpp
@@ -0,0 +1,244 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "DiatonicPitchChooser.h"
+
+#include <iostream>
+#include <klocale.h>
+#include "base/NotationRules.h"
+#include "base/NotationTypes.h"
+#include "gui/general/MidiPitchLabel.h"
+#include "PitchDragLabel.h"
+#include <kcombobox.h>
+#include <qgroupbox.h>
+#include <qhbox.h>
+#include <qlabel.h>
+#include <qspinbox.h>
+#include <qstring.h>
+#include <qwidget.h>
+
+namespace Rosegarden
+{
+
+DiatonicPitchChooser::DiatonicPitchChooser(QString title,
+ QWidget *parent,
+ int defaultNote,
+ int defaultPitch,
+ int defaultOctave) :
+ QGroupBox(1, Horizontal, title, parent),
+ m_defaultPitch(defaultPitch)
+{
+ m_pitchDragLabel = new PitchDragLabel(this, defaultPitch);
+
+ QHBox *hbox = new QHBox(this);
+ hbox->setSpacing(6);
+
+ m_step = new KComboBox( hbox );
+ m_step->setSizeLimit( 7 );
+ m_step->insertItem(i18n("C"));
+ m_step->insertItem(i18n("D"));
+ m_step->insertItem(i18n("E"));
+ m_step->insertItem(i18n("F"));
+ m_step->insertItem(i18n("G"));
+ m_step->insertItem(i18n("A"));
+ m_step->insertItem(i18n("B"));
+ m_step->setCurrentItem(defaultNote);
+
+ m_octave = new KComboBox( hbox );
+ m_octave->insertItem(i18n("-2"));
+ m_octave->insertItem(i18n("-1"));
+ m_octave->insertItem(i18n("0"));
+ m_octave->insertItem(i18n("1"));
+ m_octave->insertItem(i18n("2"));
+ m_octave->insertItem(i18n("3"));
+ m_octave->insertItem(i18n("4"));
+ m_octave->insertItem(i18n("5"));
+ m_octave->insertItem(i18n("6"));
+ m_octave->insertItem(i18n("7"));
+ m_octave->setCurrentItem(defaultOctave);
+
+ m_accidental = new KComboBox( hbox );
+ m_accidental->insertItem(i18n("double flat"));
+ m_accidental->insertItem(i18n("flat"));
+ m_accidental->insertItem(i18n("natural"));
+ m_accidental->insertItem(i18n("sharp"));
+ m_accidental->insertItem(i18n("double sharp"));
+ m_accidental->setCurrentItem(2); // default: natural
+
+ m_pitchLabel = new QLabel(QString("%1").arg(getPitch()), hbox);
+
+ m_pitchLabel->setMinimumWidth(40);
+
+ connect(m_accidental, SIGNAL(activated(int)),
+ this, SLOT(slotSetAccidental(int)));
+
+ connect(m_octave, SIGNAL(activated(int)),
+ this, SLOT(slotSetOctave(int)));
+
+ connect(m_step, SIGNAL(activated(int)),
+ this, SLOT(slotSetStep(int)));
+
+ //connect(m_pitch, SIGNAL(valueChanged(int)),
+ // this, SIGNAL(pitchChanged(int)));
+
+ //connect(m_pitch, SIGNAL(valueChanged(int)),
+ // this, SIGNAL(preview(int)));
+
+ connect(m_pitchDragLabel, SIGNAL(pitchDragged(int,int,int)),
+ this, SLOT(slotSetNote(int,int,int)));
+
+ //connect(m_pitchDragLabel, SIGNAL(pitchChanged(int)),
+ // this, SLOT(slotSetPitch(int)));
+
+ connect(m_pitchDragLabel, SIGNAL(pitchChanged(int,int,int)),
+ this, SLOT(slotSetNote(int,int,int)));
+
+ //connect(m_pitchDragLabel, SIGNAL(pitchChanged(int)),
+ // this, SIGNAL(pitchChanged(int)));
+
+ connect(m_pitchDragLabel, SIGNAL(pitchDragged(int,int,int)),
+ this, SIGNAL(noteChanged(int,int,int)));
+
+ connect(m_pitchDragLabel, SIGNAL(pitchChanged(int,int,int)),
+ this, SIGNAL(noteChanged(int,int,int)));
+
+ connect(m_pitchDragLabel, SIGNAL(preview(int)),
+ this, SIGNAL(preview(int)));
+
+}
+
+int
+DiatonicPitchChooser::getPitch() const
+{
+ return 12 * m_octave->currentItem() + scale_Cmajor[m_step->currentItem()] +
+ (m_accidental->currentItem() - 2);
+}
+
+int
+DiatonicPitchChooser::getAccidental()
+{
+ return m_accidental->currentItem() - 2;
+}
+
+void
+DiatonicPitchChooser::slotSetPitch(int pitch)
+{
+ if (m_pitchDragLabel->getPitch() != pitch)
+ m_pitchDragLabel->slotSetPitch(pitch);
+
+ m_octave->setCurrentItem((int)(((long) pitch) / 12));
+
+ int step = steps_Cmajor[pitch % 12];
+ m_step->setCurrentItem(step);
+
+ int pitchChange = (pitch % 12) - scale_Cmajor[step];
+
+ m_accidental->setCurrentItem(pitchChange + 2);
+
+ m_pitchLabel->setText(QString("%1").arg(pitch));
+
+ update();
+}
+
+void
+DiatonicPitchChooser::slotSetStep(int step)
+{
+ if (m_step->currentItem() != step)
+ m_step->setCurrentItem(step);
+ std::cout << "slot_step called" << std::endl;
+ setLabelsIfNeeded();
+ update();
+}
+
+void
+DiatonicPitchChooser::slotSetOctave(int octave)
+{
+ if (m_octave->currentItem() != octave)
+ m_octave->setCurrentItem(octave);
+ setLabelsIfNeeded();
+ update();
+}
+
+/** input 0..4: doubleflat .. doublesharp */
+void
+DiatonicPitchChooser::slotSetAccidental(int accidental)
+{
+ if (m_accidental->currentItem() != accidental)
+ m_accidental->setCurrentItem(accidental);
+ setLabelsIfNeeded();
+ update();
+}
+
+/** sets the m_pitchDragLabel and m_pitchLabel if needed */
+void
+DiatonicPitchChooser::setLabelsIfNeeded()
+{
+ //if (m_pitchDragLabel->)
+ //{
+ m_pitchDragLabel->slotSetPitch(getPitch(), m_octave->currentItem(), m_step->currentItem());
+ //}
+ m_pitchLabel->setText(QString("%1").arg(getPitch()));
+}
+
+void
+DiatonicPitchChooser::slotSetNote(int pitch, int octave, int step)
+{
+ //if (m_pitch->value() != p)
+ // m_pitch->setValue(p);
+ if (m_pitchDragLabel->getPitch() != pitch)
+ m_pitchDragLabel->slotSetPitch(pitch, octave, step);
+
+ m_octave->setCurrentItem(octave);
+ m_step->setCurrentItem(step);
+
+ int pitchOffset = pitch - (octave * 12 + scale_Cmajor[step]);
+ m_accidental->setCurrentItem(pitchOffset + 2);
+
+ //MidiPitchLabel pl(p);
+ m_pitchLabel->setText(QString("%1").arg(pitch));
+ update();
+}
+
+void
+DiatonicPitchChooser::slotResetToDefault()
+{
+ slotSetPitch(m_defaultPitch);
+}
+
+int
+DiatonicPitchChooser::getOctave() const
+{
+ return m_octave->currentItem();
+}
+
+
+int
+DiatonicPitchChooser::getStep() const
+{
+ return m_step->currentItem();
+}
+
+}
+#include "DiatonicPitchChooser.moc"
diff --git a/src/gui/widgets/DiatonicPitchChooser.h b/src/gui/widgets/DiatonicPitchChooser.h
new file mode 100644
index 0000000..8e5b20d
--- /dev/null
+++ b/src/gui/widgets/DiatonicPitchChooser.h
@@ -0,0 +1,103 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_ROSEGARDENDIATONICPITCHCHOOSER_H_
+#define _RG_ROSEGARDENDIATONICPITCHCHOOSER_H_
+
+#include <qgroupbox.h>
+#include <qstring.h>
+
+
+class QWidget;
+class QSpinBox;
+class QComboBox;
+class QLabel;
+
+
+namespace Rosegarden
+{
+
+class PitchDragLabel;
+
+
+class DiatonicPitchChooser : public QGroupBox
+{
+ Q_OBJECT
+public:
+ DiatonicPitchChooser(QString title,
+ QWidget *parent,
+ int defaultNote = 0,
+ int defaultPitch = 60,
+ int defaultOctave = 5);
+
+ // C0=0, D0=1, C1=12, etc.
+ int getPitch() const;
+
+ // C=0, D=1, E=2, F=3, etc.
+ int getStep() const;
+
+ // pitch 0 is the first C of octave 0.
+ int getOctave() const;
+
+ // 0 = none,
+ // -x = x flats
+ // x = x sharps
+ int getAccidental();
+
+signals:
+ void pitchChanged(int);
+ //pitch, octave, step
+ void noteChanged(int,int,int);
+ void preview(int);
+
+public slots:
+ void slotSetPitch(int);
+ //pitch, octave, step
+ void slotSetNote(int,int,int);
+ void slotSetStep(int);
+ void slotSetOctave(int);
+ void slotSetAccidental(int);
+ void slotResetToDefault();
+
+protected:
+ int m_defaultPitch;
+
+ PitchDragLabel *m_pitchDragLabel;
+
+ QComboBox *m_step;
+ QComboBox *m_accidental;
+ QComboBox *m_octave;
+
+ QLabel *m_pitchLabel;
+
+private:
+ void setLabelsIfNeeded();
+};
+
+
+
+}
+
+#endif
diff --git a/src/gui/widgets/Fader.cpp b/src/gui/widgets/Fader.cpp
new file mode 100644
index 0000000..2413323
--- /dev/null
+++ b/src/gui/widgets/Fader.cpp
@@ -0,0 +1,567 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "Fader.h"
+#include "TextFloat.h"
+
+#include "misc/Debug.h"
+#include "base/AudioLevel.h"
+#include <qcolor.h>
+#include <qevent.h>
+#include <qpainter.h>
+#include <qpixmap.h>
+#include <qpoint.h>
+#include <qstring.h>
+#include <qtimer.h>
+#include <qwidget.h>
+#include <cmath>
+
+namespace Rosegarden
+{
+
+Fader::PixmapCache Fader::m_pixmapCache;
+
+
+Fader::Fader(AudioLevel::FaderType type,
+ int w, int h, QWidget *parent) :
+ QWidget(parent),
+ m_integral(false),
+ m_vertical(h > w),
+ m_min(0),
+ m_max(0),
+ m_type(type),
+ m_clickMousePos( -1),
+ m_float(new TextFloat(this)),
+ m_floatTimer(new QTimer())
+{
+ setBackgroundMode(Qt::NoBackground);
+ setFixedSize(w, h); // provisional
+ calculateButtonPixmap();
+ // if (m_vertical) {
+ // setFixedSize(w, h + m_buttonPixmap->height() + 4);
+ // } else {
+ // setFixedSize(w + m_buttonPixmap->width() + 4, h);
+ // }
+
+ if (m_vertical) {
+ m_sliderMin = buttonPixmap()->height() / 2 + 2;
+ m_sliderMax = height() - m_sliderMin;
+ } else {
+ m_sliderMin = buttonPixmap()->width() / 2 + 2;
+ m_sliderMax = width() - m_sliderMin;
+ }
+
+ m_outlineColour = colorGroup().mid();
+
+ calculateGroovePixmap();
+ setFader(0.0);
+
+ connect(m_floatTimer, SIGNAL(timeout()), this, SLOT(slotFloatTimeout()));
+ m_float->hide();
+}
+
+Fader::Fader(int min, int max, int deflt,
+ int w, int h, QWidget *parent) :
+ QWidget(parent),
+ m_integral(true),
+ m_vertical(h > w),
+ m_min(min),
+ m_max(max),
+ m_clickMousePos( -1),
+ m_float(new TextFloat(this)),
+ m_floatTimer(new QTimer())
+{
+ setBackgroundMode(Qt::NoBackground);
+ setFixedSize(w, h); // provisional
+ calculateButtonPixmap();
+ // if (m_vertical) {
+ // setFixedSize(w, h + m_buttonPixmap->height() + 4);
+ // } else {
+ // setFixedSize(w + m_buttonPixmap->width() + 4, h);
+ // }
+
+ if (m_vertical) {
+ m_sliderMin = buttonPixmap()->height() / 2 + 2;
+ m_sliderMax = height() - m_sliderMin;
+ } else {
+ m_sliderMin = buttonPixmap()->width() / 2 + 2;
+ m_sliderMax = width() - m_sliderMin;
+ }
+
+ m_outlineColour = colorGroup().mid();
+
+ calculateGroovePixmap();
+ setFader(deflt);
+
+ connect(m_floatTimer, SIGNAL(timeout()), this, SLOT(slotFloatTimeout()));
+ m_float->hide();
+}
+
+Fader::Fader(int min, int max, int deflt,
+ bool vertical, QWidget *parent) :
+ QWidget(parent),
+ m_integral(true),
+ m_vertical(vertical),
+ m_min(min),
+ m_max(max),
+ m_clickMousePos( -1),
+ m_float(new TextFloat(this)),
+ m_floatTimer(new QTimer())
+{
+ setBackgroundMode(Qt::NoBackground);
+ calculateButtonPixmap();
+
+ if (m_vertical) {
+ m_sliderMin = buttonPixmap()->height() / 2 + 2;
+ m_sliderMax = height() - m_sliderMin;
+ } else {
+ m_sliderMin = buttonPixmap()->width() / 2 + 2;
+ m_sliderMax = width() - m_sliderMin;
+ }
+
+ m_outlineColour = colorGroup().mid();
+
+ calculateGroovePixmap();
+ setFader(deflt);
+
+ connect(m_floatTimer, SIGNAL(timeout()), this, SLOT(slotFloatTimeout()));
+ m_float->hide();
+}
+
+Fader::~Fader()
+{}
+
+void
+Fader::setOutlineColour(QColor c)
+{
+ m_outlineColour = c;
+ calculateGroovePixmap();
+}
+
+QPixmap *
+Fader::groovePixmap()
+{
+ PixmapCache::iterator i = m_pixmapCache.find(SizeRec(width(), height()));
+ if (i != m_pixmapCache.end()) {
+ ColourPixmapRec::iterator j = i->second.first.find(m_outlineColour.pixel());
+ if (j != i->second.first.end()) {
+ return j->second;
+ }
+ }
+ return 0;
+}
+
+QPixmap *
+Fader::buttonPixmap()
+{
+ PixmapCache::iterator i = m_pixmapCache.find(SizeRec(width(), height()));
+ if (i != m_pixmapCache.end()) {
+ return i->second.second;
+ } else
+ return 0;
+}
+
+float
+Fader::getFaderLevel() const
+{
+ return m_value;
+}
+
+void
+Fader::setFader(float value)
+{
+ m_value = value;
+ emit faderChanged(value);
+ paintEvent(0);
+}
+
+float
+Fader::position_to_value(int position)
+{
+ float value;
+
+ if (m_integral) {
+ float sliderLength = float(m_sliderMax) - float(m_sliderMin);
+ value = float(position)
+ * float(m_max - m_min) / sliderLength - float(m_min);
+ if (value > m_max)
+ value = float(m_max);
+ if (value < m_min)
+ value = float(m_min);
+ } else {
+ value = AudioLevel::fader_to_dB
+ (position, m_sliderMax - m_sliderMin, m_type);
+ }
+ /*
+ RG_DEBUG << "Fader::position_to_value - position = " << position
+ << ", new value = " << value << endl;
+
+ if (m_min != m_max) // works for integral case
+ {
+ if (value > m_max) value = float(m_max);
+ if (value < m_min) value = float(m_min);
+ }
+
+ RG_DEBUG << "Fader::position_to_value - limited value = " << value << endl;
+ */
+ return value;
+}
+
+int
+Fader::value_to_position(float value)
+{
+ int position;
+
+ if (m_integral) {
+ float sliderLength = float(m_sliderMax) - float(m_sliderMin);
+ position =
+ int(sliderLength * (value - float(m_min)) / float(m_max - m_min) + 0.1);
+ } else {
+ position =
+ AudioLevel::dB_to_fader
+ (value, m_sliderMax - m_sliderMin, m_type);
+ }
+
+ return position;
+}
+
+void
+Fader::paintEvent(QPaintEvent *)
+{
+ QPainter paint(this);
+ int position = value_to_position(m_value);
+
+ if (m_vertical) {
+
+ int aboveButton = height() - position - m_sliderMin - buttonPixmap()->height() / 2;
+ int belowButton = position + m_sliderMin - buttonPixmap()->height() / 2;
+
+ if (aboveButton > 0) {
+ paint.drawPixmap(0, 0,
+ *groovePixmap(),
+ 0, 0,
+ groovePixmap()->width(), aboveButton);
+ }
+
+ if (belowButton > 0) {
+ paint.drawPixmap(0, aboveButton + buttonPixmap()->height(),
+ *groovePixmap(),
+ 0, aboveButton + buttonPixmap()->height(),
+ groovePixmap()->width(), belowButton);
+ }
+
+ int buttonMargin = (width() - buttonPixmap()->width()) / 2;
+
+ paint.drawPixmap(buttonMargin, aboveButton, *buttonPixmap());
+
+ paint.drawPixmap(0, aboveButton,
+ *groovePixmap(),
+ 0, aboveButton,
+ buttonMargin, buttonPixmap()->height());
+
+ paint.drawPixmap(buttonMargin + buttonPixmap()->width(), aboveButton,
+ *groovePixmap(),
+ buttonMargin + buttonPixmap()->width(), aboveButton,
+ width() - buttonMargin - buttonPixmap()->width(),
+ buttonPixmap()->height());
+
+ } else {
+ //... update
+ int leftOfButton =
+ (m_sliderMax - m_sliderMin) - position - buttonPixmap()->width() / 2;
+
+ int rightOfButton =
+ position - buttonPixmap()->width() / 2;
+
+ if (leftOfButton > 0) {
+ paint.drawPixmap(0, 0,
+ *groovePixmap(),
+ 0, 0,
+ leftOfButton, groovePixmap()->height());
+ }
+
+ if (rightOfButton > 0) {
+ paint.drawPixmap(rightOfButton + buttonPixmap()->width(), 0,
+ *groovePixmap(),
+ groovePixmap()->width() - rightOfButton, 0,
+ rightOfButton, groovePixmap()->height());
+ }
+
+ paint.drawPixmap(leftOfButton, 0, *buttonPixmap());
+ }
+
+ paint.end();
+}
+
+void
+Fader::mousePressEvent(QMouseEvent *e)
+{
+ m_clickMousePos = -1;
+
+ if (e->button() == LeftButton) {
+
+ if (e->type() == QEvent::MouseButtonDblClick) {
+ setFader(0);
+ return ;
+ }
+
+ if (m_vertical) {
+ int buttonPosition = value_to_position(m_value);
+ int clickPosition = height() - e->y() - m_sliderMin;
+
+ if (clickPosition < buttonPosition + buttonPixmap()->height() / 2 &&
+ clickPosition > buttonPosition - buttonPixmap()->height() / 2) {
+ m_clickMousePos = clickPosition;
+ m_clickButtonPos = value_to_position(m_value);
+ showFloatText();
+ }
+ }
+ }
+}
+
+void
+Fader::mouseReleaseEvent(QMouseEvent *e)
+{
+ mouseMoveEvent(e);
+ m_clickMousePos = -1;
+}
+
+void
+Fader::mouseMoveEvent(QMouseEvent *e)
+{
+ if (m_clickMousePos >= 0) {
+ if (m_vertical) {
+ int mousePosition = height() - e->y() - m_sliderMin;
+ int delta = mousePosition - m_clickMousePos;
+ int buttonPosition = m_clickButtonPos + delta;
+ if (buttonPosition < 0)
+ buttonPosition = 0;
+ if (buttonPosition > m_sliderMax - m_sliderMin) {
+ buttonPosition = m_sliderMax - m_sliderMin;
+ }
+ setFader(position_to_value(buttonPosition));
+ showFloatText();
+ }
+ }
+}
+
+void
+Fader::wheelEvent(QWheelEvent *e)
+{
+ int buttonPosition = value_to_position(m_value);
+ if (e->state() & ShiftButton) {
+ if (e->delta() > 0)
+ buttonPosition += 10;
+ else
+ buttonPosition -= 10;
+ } else {
+ if (e->delta() > 0)
+ buttonPosition += 1;
+ else
+ buttonPosition -= 1;
+ }
+ RG_DEBUG << "Fader::wheelEvent - button position = " << buttonPosition << endl;
+ setFader(position_to_value(buttonPosition));
+ RG_DEBUG << "Fader::wheelEvent - value = " << m_value << endl;
+
+ showFloatText();
+}
+
+void
+Fader::showFloatText()
+{
+ // draw on the float text
+
+ QString text;
+
+ if (m_integral) {
+ text = QString("%1").arg(int(m_value));
+ } else if (m_value == AudioLevel::DB_FLOOR) {
+ text = "Off";
+ } else {
+ float v = fabs(m_value);
+ text = QString("%1%2.%3%4%5 dB")
+ .arg(m_value < 0 ? '-' : '+')
+ .arg(int(v))
+ .arg(int(v * 10) % 10)
+ .arg(int(v * 100) % 10)
+ .arg(int(v * 1000) % 10);
+ }
+
+ m_float->setText(text);
+
+ // Reposition - we need to sum the relative positions up to the
+ // topLevel or dialog to please move().
+ //
+ QWidget *par = parentWidget();
+ QPoint totalPos = this->pos();
+
+ while (par->parentWidget() && !par->isTopLevel() && !par->isDialog()) {
+ totalPos += par->pos();
+ par = par->parentWidget();
+ }
+
+ // Move just top/right
+ //
+ m_float->move(totalPos + QPoint(width() + 2, 0));
+
+ // Show
+ m_float->show();
+
+ // one shot, 500ms
+ m_floatTimer->start(500, true);
+}
+
+void
+Fader::slotFloatTimeout()
+{
+ m_float->hide();
+}
+
+void
+Fader::calculateGroovePixmap()
+{
+ QPixmap *& map = m_pixmapCache[SizeRec(width(), height())].first[m_outlineColour.pixel()];
+
+ delete map;
+ map = new QPixmap(width(), height());
+ map->fill(colorGroup().background());
+ QPainter paint(map);
+ paint.setBrush(colorGroup().background());
+
+ if (m_vertical) {
+
+ paint.setPen(m_outlineColour);
+ paint.drawRect(0, 0, width(), height());
+
+ if (m_integral) {
+ //...
+ } else {
+ for (int dB = -70; dB <= 10; ) {
+ int position = value_to_position(float(dB));
+ if (position >= 0 &&
+ position < m_sliderMax - m_sliderMin) {
+ if (dB == 0)
+ paint.setPen(colorGroup().dark());
+ else
+ paint.setPen(colorGroup().midlight());
+ paint.drawLine(1, (m_sliderMax - position),
+ width() - 2, (m_sliderMax - position));
+ }
+ if (dB < -10)
+ dB += 10;
+ else
+ dB += 2;
+ }
+ }
+
+ paint.setPen(colorGroup().dark());
+ paint.setBrush(colorGroup().mid());
+ paint.drawRect(width() / 2 - 3, height() - m_sliderMax,
+ 6, m_sliderMax - m_sliderMin);
+ paint.end();
+ } else {
+ //...
+ }
+}
+
+void
+Fader::calculateButtonPixmap()
+{
+ PixmapCache::iterator i = m_pixmapCache.find(SizeRec(width(), height()));
+ if (i != m_pixmapCache.end() && i->second.second)
+ return ;
+
+ QPixmap *& map = m_pixmapCache[SizeRec(width(), height())].second;
+
+ if (m_vertical) {
+
+ int buttonHeight = height() / 7;
+ buttonHeight /= 10;
+ ++buttonHeight;
+ buttonHeight *= 10;
+ ++buttonHeight;
+ int buttonWidth = width() * 2 / 3;
+ buttonWidth /= 5;
+ ++buttonWidth;
+ buttonWidth *= 5;
+ if (buttonWidth > width() - 2)
+ buttonWidth = width() - 2;
+
+ map = new QPixmap(buttonWidth, buttonHeight);
+ map->fill(colorGroup().background());
+
+ int x = 0;
+ int y = 0;
+
+ QPainter paint(map);
+
+ paint.setPen(colorGroup().light());
+ paint.drawLine(x + 1, y, x + buttonWidth - 2, y);
+ paint.drawLine(x, y + 1, x, y + buttonHeight - 2);
+
+ paint.setPen(colorGroup().midlight());
+ paint.drawLine(x + 1, y + 1, x + buttonWidth - 2, y + 1);
+ paint.drawLine(x + 1, y + 1, x + 1, y + buttonHeight - 2);
+
+ paint.setPen(colorGroup().mid());
+ paint.drawLine(x + 2, y + buttonHeight - 2, x + buttonWidth - 2,
+ y + buttonHeight - 2);
+ paint.drawLine(x + buttonWidth - 2, y + 2, x + buttonWidth - 2,
+ y + buttonHeight - 2);
+
+ paint.setPen(colorGroup().dark());
+ paint.drawLine(x + 1, y + buttonHeight - 1, x + buttonWidth - 2,
+ y + buttonHeight - 1);
+ paint.drawLine(x + buttonWidth - 1, y + 1, x + buttonWidth - 1,
+ y + buttonHeight - 2);
+
+ paint.setPen(colorGroup().shadow());
+ paint.drawLine(x + 1, y + buttonHeight / 2, x + buttonWidth - 2,
+ y + buttonHeight / 2);
+
+ paint.setPen(colorGroup().mid());
+ paint.drawLine(x + 1, y + buttonHeight / 2 - 1, x + buttonWidth - 2,
+ y + buttonHeight / 2 - 1);
+ paint.drawPoint(x, y + buttonHeight / 2);
+
+ paint.setPen(colorGroup().light());
+ paint.drawLine(x + 1, y + buttonHeight / 2 + 1, x + buttonWidth - 2,
+ y + buttonHeight / 2 + 1);
+
+ paint.setPen(colorGroup().button());
+ paint.setBrush(colorGroup().button());
+ paint.drawRect(x + 2, y + 2, buttonWidth - 4, buttonHeight / 2 - 4);
+ paint.drawRect(x + 2, y + buttonHeight / 2 + 2,
+ buttonWidth - 4, buttonHeight / 2 - 4);
+
+ paint.end();
+ } else {
+ //...
+ }
+}
+
+}
+#include "Fader.moc"
diff --git a/src/gui/widgets/Fader.h b/src/gui/widgets/Fader.h
new file mode 100644
index 0000000..f4afb24
--- /dev/null
+++ b/src/gui/widgets/Fader.h
@@ -0,0 +1,137 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_ROSEGARDENFADER_H_
+#define _RG_ROSEGARDENFADER_H_
+
+#include "base/AudioLevel.h"
+#include <map>
+#include <qcolor.h>
+#include <qwidget.h>
+#include <utility>
+
+
+class QWheelEvent;
+class QTimer;
+class QPixmap;
+class QPaintEvent;
+class QMouseEvent;
+
+
+namespace Rosegarden
+{
+
+class TextFloat;
+
+
+class Fader : public QWidget
+{
+ Q_OBJECT
+
+public:
+ /**
+ * Construct a dB fader. The fader calculates its orientation
+ * based on the given dimensions.
+ */
+ Fader(AudioLevel::FaderType,
+ int width, int height, QWidget *parent);
+
+ /**
+ * Construct a fader on an integral scale. The fader calculates
+ * its orientation based on the given dimensions.
+ */
+ Fader(int min, int max, int deflt,
+ int width, int height, QWidget *parent);
+
+ /**
+ * Construct a fader on an integral scale, with a 1:1 ratio of
+ * pixel positions and values.
+ */
+ Fader(int min, int max, int deflt,
+ bool vertical, QWidget *parent);
+
+ virtual ~Fader();
+
+ void setOutlineColour(QColor);
+
+ float getFaderLevel() const;
+
+public slots:
+ void setFader(float value);
+ void slotFloatTimeout();
+
+signals:
+ void faderChanged(float);
+
+protected:
+ virtual void paintEvent(QPaintEvent *);
+ virtual void mousePressEvent(QMouseEvent *);
+ virtual void mouseReleaseEvent(QMouseEvent *);
+ virtual void mouseMoveEvent(QMouseEvent *);
+ virtual void wheelEvent(QWheelEvent *);
+
+ float position_to_value(int);
+ int value_to_position(float);
+
+ void calculateGroovePixmap();
+ void calculateButtonPixmap();
+ void showFloatText();
+
+ bool m_integral;
+ bool m_vertical;
+
+ int m_sliderMin;
+ int m_sliderMax;
+ float m_value;
+
+ int m_min;
+ int m_max;
+ AudioLevel::FaderType m_type;
+
+ int m_clickMousePos;
+ int m_clickButtonPos;
+
+ TextFloat *m_float;
+ QTimer *m_floatTimer;
+
+ QPixmap *groovePixmap();
+ QPixmap *buttonPixmap();
+
+ QColor m_outlineColour;
+
+ typedef std::pair<int, int> SizeRec;
+ typedef std::map<unsigned int, QPixmap *> ColourPixmapRec; // key is QColor::pixel()
+ typedef std::pair<ColourPixmapRec, QPixmap *> PixmapRec;
+ typedef std::map<SizeRec, PixmapRec> PixmapCache;
+ static PixmapCache m_pixmapCache;
+};
+
+
+// AudioVUMeter - a vertical audio meter. Default is stereo.
+//
+
+}
+
+#endif
diff --git a/src/gui/widgets/HSpinBox.cpp b/src/gui/widgets/HSpinBox.cpp
new file mode 100644
index 0000000..efdb9d1
--- /dev/null
+++ b/src/gui/widgets/HSpinBox.cpp
@@ -0,0 +1,81 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "HSpinBox.h"
+
+#include <qstring.h>
+#include <cmath>
+#include <algorithm>
+
+namespace Rosegarden
+{
+
+QString HSpinBox::mapValueToText(int j)
+{
+ QString str;
+ str.sprintf(m_format, float(j) / m_scaleFactor);
+ return str;
+}
+
+int HSpinBox::mapTextToValue( bool* ok )
+{
+ *ok = true;
+ float f = atof(text());
+ return int(f * m_scaleFactor);
+}
+
+HSpinBox::HSpinBox( int minV, int maxV, int step, QWidget* parent,
+ double bottom, double top, int decimals, float initialValue)
+ : QSpinBox(minV,maxV,step,parent)
+{
+ setValidator(new QDoubleValidator(bottom,top,decimals,this));
+ initialize(decimals);
+ setValuef(initialValue);
+}
+
+ //constructor with default settings
+HSpinBox::HSpinBox( QWidget* parent, float initialValue, int step,
+ double bottom, double top, int decimals,
+ const QObject* recv, const char* mem)
+ : QSpinBox((int)(bottom*pow(10.0, decimals)),
+ (int)(top*pow(10.0, decimals)), step, parent)
+{
+ setValidator(new QDoubleValidator(bottom,top,decimals,this));
+ initialize(decimals);
+ setValuef(initialValue);
+ if (recv != NULL && mem != NULL)
+ QObject::connect(this, SIGNAL(valueChanged(int)), recv, mem);
+}
+
+float HSpinBox::valuef() { return float(value()) / m_scaleFactor; }
+void HSpinBox::setValuef(float v) { setValue(static_cast<int>(v * m_scaleFactor)); }
+
+void HSpinBox::initialize(int digits) {
+ m_scaleFactor = pow(10.0, digits);
+ sprintf(m_format, "%c%1i.%1if", '%', digits+3, digits);
+}
+
+
+}
diff --git a/src/gui/widgets/HSpinBox.h b/src/gui/widgets/HSpinBox.h
new file mode 100644
index 0000000..aa60b65
--- /dev/null
+++ b/src/gui/widgets/HSpinBox.h
@@ -0,0 +1,67 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_HSPINBOX_H_
+#define _RG_HSPINBOX_H_
+
+#include <qobject.h>
+#include <qspinbox.h>
+#include <qstring.h>
+#include <qvalidator.h>
+
+
+namespace Rosegarden
+{
+
+class HSpinBox : public QSpinBox
+{
+ QString mapValueToText(int j);
+
+ int mapTextToValue( bool* ok );
+
+public:
+ HSpinBox( int minV, int maxV, int step, QWidget* parent,
+ double bottom, double top, int decimals, float initialValue);
+
+ //constructor with default settings
+ HSpinBox( QWidget* parent, float initialValue = 0.2, int step=1,
+ double bottom=-25.0, double top=25.0, int decimals=3,
+ const QObject* recv=NULL, const char* mem=NULL);
+
+ float valuef();
+ void setValuef(float v);
+ void initialize(int digits);
+
+private:
+
+ float m_scaleFactor; //scale of the value
+ char m_format[3]; //text format
+
+};
+
+
+}
+
+#endif
diff --git a/src/gui/widgets/Label.cpp b/src/gui/widgets/Label.cpp
new file mode 100644
index 0000000..69f504b
--- /dev/null
+++ b/src/gui/widgets/Label.cpp
@@ -0,0 +1,2 @@
+#include "Label.h"
+#include "Label.moc"
diff --git a/src/gui/widgets/Label.h b/src/gui/widgets/Label.h
new file mode 100644
index 0000000..e704c35
--- /dev/null
+++ b/src/gui/widgets/Label.h
@@ -0,0 +1,63 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_ROSEGARDENLABEL_H_
+#define _RG_ROSEGARDENLABEL_H_
+
+#include <qlabel.h>
+
+
+class QWidget;
+class QWheelEvent;
+class QMouseEvent;
+
+
+namespace Rosegarden
+{
+
+class Label : public QLabel
+{
+ Q_OBJECT
+public:
+ Label(QWidget *parent = 0, const char *name=0):
+ QLabel(parent, name) {;}
+
+protected:
+ virtual void mouseDoubleClickEvent(QMouseEvent * /*e*/)
+ { emit doubleClicked(); }
+
+ virtual void wheelEvent(QWheelEvent * e)
+ { emit scrollWheel(e->delta()); }
+
+signals:
+ void doubleClicked();
+ void scrollWheel(int);
+
+};
+
+
+}
+
+#endif
diff --git a/src/gui/widgets/MidiFaderWidget.cpp b/src/gui/widgets/MidiFaderWidget.cpp
new file mode 100644
index 0000000..a2ef7fc
--- /dev/null
+++ b/src/gui/widgets/MidiFaderWidget.cpp
@@ -0,0 +1,41 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "MidiFaderWidget.h"
+
+#include "AudioVUMeter.h"
+#include "Fader.h"
+#include "Rotary.h"
+#include <kcombobox.h>
+#include <qframe.h>
+#include <qpushbutton.h>
+#include <qstring.h>
+#include <qwidget.h>
+
+
+namespace Rosegarden
+{
+}
+#include "MidiFaderWidget.moc"
diff --git a/src/gui/widgets/MidiFaderWidget.h b/src/gui/widgets/MidiFaderWidget.h
new file mode 100644
index 0000000..7bdf520
--- /dev/null
+++ b/src/gui/widgets/MidiFaderWidget.h
@@ -0,0 +1,72 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_MIDIFADERWIDGET_H_
+#define _RG_MIDIFADERWIDGET_H_
+
+#include <qframe.h>
+#include <qstring.h>
+
+
+class QWidget;
+class QPushButton;
+class KComboBox;
+
+
+namespace Rosegarden
+{
+
+class Rotary;
+class Fader;
+class AudioVUMeter;
+
+
+class MidiFaderWidget : public QFrame
+{
+ Q_OBJECT
+
+public:
+ MidiFaderWidget(QWidget *parent,
+ QString id = "");
+
+ AudioVUMeter *m_vuMeter;
+
+ Fader *m_fader;
+
+ QPushButton *m_muteButton;
+ QPushButton *m_soloButton;
+ QPushButton *m_recordButton;
+ Rotary *m_pan;
+
+ KComboBox *m_output;
+
+ QString m_id;
+};
+
+
+
+}
+
+#endif
diff --git a/src/gui/widgets/PitchChooser.cpp b/src/gui/widgets/PitchChooser.cpp
new file mode 100644
index 0000000..e20647d
--- /dev/null
+++ b/src/gui/widgets/PitchChooser.cpp
@@ -0,0 +1,113 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "PitchChooser.h"
+
+#include <klocale.h>
+#include "gui/general/MidiPitchLabel.h"
+#include "PitchDragLabel.h"
+#include <qgroupbox.h>
+#include <qhbox.h>
+#include <qlabel.h>
+#include <qspinbox.h>
+#include <qstring.h>
+#include <qwidget.h>
+
+
+namespace Rosegarden
+{
+
+PitchChooser::PitchChooser(QString title,
+ QWidget *parent,
+ int defaultPitch) :
+ QGroupBox(1, Horizontal, title, parent),
+ m_defaultPitch(defaultPitch)
+{
+ m_pitchDragLabel = new PitchDragLabel(this, defaultPitch);
+
+ QHBox *hbox = new QHBox(this);
+ hbox->setSpacing(6);
+
+ new QLabel(i18n("Pitch:"), hbox);
+
+ m_pitch = new QSpinBox(hbox);
+ m_pitch->setMinValue(0);
+ m_pitch->setMaxValue(127);
+ m_pitch->setValue(defaultPitch);
+
+ MidiPitchLabel pl(defaultPitch);
+ m_pitchLabel = new QLabel(pl.getQString(), hbox);
+ m_pitchLabel->setMinimumWidth(40);
+
+ connect(m_pitch, SIGNAL(valueChanged(int)),
+ this, SLOT(slotSetPitch(int)));
+
+ connect(m_pitch, SIGNAL(valueChanged(int)),
+ this, SIGNAL(pitchChanged(int)));
+
+ connect(m_pitch, SIGNAL(valueChanged(int)),
+ this, SIGNAL(preview(int)));
+
+ connect(m_pitchDragLabel, SIGNAL(pitchDragged(int)),
+ this, SLOT(slotSetPitch(int)));
+
+ connect(m_pitchDragLabel, SIGNAL(pitchChanged(int)),
+ this, SLOT(slotSetPitch(int)));
+
+ connect(m_pitchDragLabel, SIGNAL(pitchChanged(int)),
+ this, SIGNAL(pitchChanged(int)));
+
+ connect(m_pitchDragLabel, SIGNAL(preview(int)),
+ this, SIGNAL(preview(int)));
+
+}
+
+int
+PitchChooser::getPitch() const
+{
+ return m_pitch->value();
+}
+
+void
+PitchChooser::slotSetPitch(int p)
+{
+ if (m_pitch->value() != p)
+ m_pitch->setValue(p);
+ if (m_pitchDragLabel->getPitch() != p)
+ m_pitchDragLabel->slotSetPitch(p);
+
+ MidiPitchLabel pl(p);
+ m_pitchLabel->setText(pl.getQString());
+ update();
+}
+
+void
+PitchChooser::slotResetToDefault()
+{
+ slotSetPitch(m_defaultPitch);
+}
+
+}
+#include "PitchChooser.moc"
diff --git a/src/gui/widgets/PitchChooser.h b/src/gui/widgets/PitchChooser.h
new file mode 100644
index 0000000..df3b8ef
--- /dev/null
+++ b/src/gui/widgets/PitchChooser.h
@@ -0,0 +1,73 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_ROSEGARDENPITCHCHOOSER_H_
+#define _RG_ROSEGARDENPITCHCHOOSER_H_
+
+#include <qgroupbox.h>
+#include <qstring.h>
+
+
+class QWidget;
+class QSpinBox;
+class QLabel;
+
+
+namespace Rosegarden
+{
+
+class PitchDragLabel;
+
+
+class PitchChooser : public QGroupBox
+{
+ Q_OBJECT
+public:
+ PitchChooser(QString title,
+ QWidget *parent,
+ int defaultPitch = 60);
+
+ int getPitch() const;
+
+signals:
+ void pitchChanged(int);
+ void preview(int);
+
+public slots:
+ void slotSetPitch(int);
+ void slotResetToDefault();
+
+protected:
+ int m_defaultPitch;
+ PitchDragLabel *m_pitchDragLabel;
+ QSpinBox *m_pitch;
+ QLabel *m_pitchLabel;
+};
+
+
+
+}
+
+#endif
diff --git a/src/gui/widgets/PitchDragLabel.cpp b/src/gui/widgets/PitchDragLabel.cpp
new file mode 100644
index 0000000..1d22a77
--- /dev/null
+++ b/src/gui/widgets/PitchDragLabel.cpp
@@ -0,0 +1,269 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "PitchDragLabel.h"
+
+#include "base/NotationRules.h"
+#include "base/NotationTypes.h"
+#include "gui/editors/notation/NotePixmapFactory.h"
+#include <qcanvas.h>
+#include <qpainter.h>
+#include <qpixmap.h>
+#include <qsize.h>
+#include <qwidget.h>
+
+
+namespace Rosegarden
+{
+
+PitchDragLabel::PitchDragLabel(QWidget *parent,
+ int defaultPitch,
+ bool defaultSharps) :
+ QWidget(parent),
+ m_pitch(defaultPitch),
+ m_usingSharps(defaultSharps),
+ m_clickedY(0),
+ m_clicked(false),
+ m_npf(new NotePixmapFactory())
+{
+ calculatePixmap();
+}
+
+PitchDragLabel::~PitchDragLabel()
+{
+ delete m_npf;
+}
+
+void
+PitchDragLabel::slotSetPitch(int p)
+{
+ bool up = (p > m_pitch);
+ m_usingSharps = up;
+ if (m_pitch == p)
+ return ;
+ m_pitch = p;
+ calculatePixmap();
+ emitPitchChange();
+ paintEvent(0);
+}
+
+void
+PitchDragLabel::slotSetPitch(int pitch, int octave, int step)
+{
+ if (m_pitch == pitch)
+ return ;
+ m_pitch = pitch;
+ calculatePixmap(pitch, octave, step);
+ emit pitchChanged(pitch);
+ emit pitchChanged(pitch, octave, step);
+ paintEvent(0);
+}
+
+void
+PitchDragLabel::mousePressEvent(QMouseEvent *e)
+{
+ if (e->button() == LeftButton) {
+ m_clickedY = e->y();
+ m_clickedPitch = m_pitch;
+ m_clicked = true;
+ emit preview(m_pitch);
+ }
+}
+
+void
+PitchDragLabel::mouseMoveEvent(QMouseEvent *e)
+{
+ if (m_clicked) {
+
+ int y = e->y();
+ int diff = y - m_clickedY;
+ int pitchDiff = diff * 4 / m_npf->getLineSpacing();
+
+ int newPitch = m_clickedPitch - pitchDiff;
+ if (newPitch < 0)
+ newPitch = 0;
+ if (newPitch > 127)
+ newPitch = 127;
+
+ if (m_pitch != newPitch) {
+ bool up = (newPitch > m_pitch);
+ m_pitch = newPitch;
+ m_usingSharps = up;
+ calculatePixmap();
+ emit pitchDragged(m_pitch);
+ if (up)
+ {
+ // use sharps
+ emit pitchDragged(m_pitch, (int)(((long)m_pitch) / 12),
+ steps_Cmajor_with_sharps[m_pitch % 12]);
+ }
+ else
+ {
+ // use flats
+ emit pitchDragged(m_pitch, (int)(((long)m_pitch) / 12),
+ steps_Cmajor_with_flats[m_pitch % 12]);
+ }
+ emit preview(m_pitch);
+ paintEvent(0);
+ }
+ }
+}
+
+void
+PitchDragLabel::mouseReleaseEvent(QMouseEvent *e)
+{
+ mouseMoveEvent(e);
+ emitPitchChange();
+ m_clicked = false;
+}
+
+void
+PitchDragLabel::emitPitchChange()
+{
+ emit pitchChanged(m_pitch);
+
+ Pitch newPitch(m_pitch);
+
+ if (m_usingSharps)
+ {
+ Rosegarden::Key key = Rosegarden::Key("C major");
+ emit pitchDragged(m_pitch, newPitch.getOctave(0), newPitch.getNoteInScale(key));
+ }
+ else
+ {
+ Rosegarden::Key key = Rosegarden::Key("A minor");
+ emit pitchDragged(m_pitch, newPitch.getOctave(0), (newPitch.getNoteInScale(key) + 5) % 7);
+ }
+}
+
+void
+PitchDragLabel::wheelEvent(QWheelEvent *e)
+{
+ if (e->delta() > 0) {
+ if (m_pitch < 127) {
+ ++m_pitch;
+ m_usingSharps = true;
+ calculatePixmap();
+ emitPitchChange();
+ emit preview(m_pitch);
+ paintEvent(0);
+ }
+ } else {
+ if (m_pitch > 0) {
+ --m_pitch;
+ m_usingSharps = false;
+ calculatePixmap();
+ emitPitchChange();
+ emit preview(m_pitch);
+ paintEvent(0);
+ }
+ }
+}
+
+void
+PitchDragLabel::paintEvent(QPaintEvent *)
+{
+ QPainter paint(this);
+ paint.fillRect(0, 0, width(), height(), paint.backgroundColor());
+
+ int x = width() / 2 - m_pixmap.width() / 2;
+ if (x < 0)
+ x = 0;
+
+ int y = height() / 2 - m_pixmap.height() / 2;
+ if (y < 0)
+ y = 0;
+
+ paint.drawPixmap(x, y, m_pixmap);
+
+
+}
+
+QSize
+PitchDragLabel::sizeHint() const
+{
+ return QSize(150, 135);
+}
+
+void
+PitchDragLabel::calculatePixmap(int pitch, int octave, int step) const
+{
+ std::string clefType = Clef::Treble;
+ int octaveOffset = 0;
+
+ if (m_pitch > 94) {
+ octaveOffset = 2;
+ } else if (m_pitch > 82) {
+ octaveOffset = 1;
+ } else if (m_pitch < 60) {
+ clefType = Clef::Bass;
+ if (m_pitch < 24) {
+ octaveOffset = -2;
+ } else if (m_pitch < 36) {
+ octaveOffset = -1;
+ }
+ }
+
+ QCanvasPixmap *pmap = m_npf->makePitchDisplayPixmap
+ (m_pitch,
+ Clef(clefType, octaveOffset),
+ octave, step);
+
+ m_pixmap = *pmap;
+
+ delete pmap;
+}
+
+void
+PitchDragLabel::calculatePixmap() const
+{
+ std::string clefType = Clef::Treble;
+ int octaveOffset = 0;
+
+ if (m_pitch > 94) {
+ octaveOffset = 2;
+ } else if (m_pitch > 82) {
+ octaveOffset = 1;
+ } else if (m_pitch < 60) {
+ clefType = Clef::Bass;
+ if (m_pitch < 24) {
+ octaveOffset = -2;
+ } else if (m_pitch < 36) {
+ octaveOffset = -1;
+ }
+ }
+
+ QCanvasPixmap *pmap = m_npf->makePitchDisplayPixmap
+ (m_pitch,
+ Clef(clefType, octaveOffset),
+ m_usingSharps);
+
+ m_pixmap = *pmap;
+
+ delete pmap;
+}
+
+}
+#include "PitchDragLabel.moc"
diff --git a/src/gui/widgets/PitchDragLabel.h b/src/gui/widgets/PitchDragLabel.h
new file mode 100644
index 0000000..7114611
--- /dev/null
+++ b/src/gui/widgets/PitchDragLabel.h
@@ -0,0 +1,99 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_ROSEGARDENPITCHDRAGLABEL_H_
+#define _RG_ROSEGARDENPITCHDRAGLABEL_H_
+
+#include <qpixmap.h>
+#include <qsize.h>
+#include <qwidget.h>
+
+
+class QWheelEvent;
+class QPaintEvent;
+class QMouseEvent;
+
+
+namespace Rosegarden
+{
+
+class NotePixmapFactory;
+
+
+class PitchDragLabel : public QWidget
+{
+ Q_OBJECT
+public:
+ PitchDragLabel(QWidget *parent,
+ int defaultPitch = 60, bool defaultSharps = true);
+ ~PitchDragLabel();
+
+ int getPitch() const { return m_pitch; }
+
+ virtual QSize sizeHint() const;
+
+signals:
+ void pitchDragged(int);
+ // pitch, octave, step
+ void pitchDragged(int,int,int);
+ void pitchChanged(int); // mouse release
+ // pitch, octave, step
+ void pitchChanged(int,int,int); // mouse release
+ void preview(int);
+
+public slots:
+ void slotSetPitch(int);
+ void slotSetPitch(int,int,int);
+
+protected:
+ virtual void paintEvent(QPaintEvent *);
+ virtual void mousePressEvent(QMouseEvent *e);
+ virtual void mouseReleaseEvent(QMouseEvent *e);
+ virtual void mouseMoveEvent(QMouseEvent *e);
+ virtual void wheelEvent(QWheelEvent *e);
+
+ void calculatePixmap() const;
+ void calculatePixmap(int pitch, int octave, int step) const;
+
+ /** emits 'pitchChanged' events, both diatonic and chromatic */
+ void emitPitchChange();
+
+ mutable QPixmap m_pixmap;
+
+ int m_pitch;
+ int m_clickedY;
+ int m_clickedPitch;
+ bool m_clicked;
+
+ bool m_usingSharps;
+
+ NotePixmapFactory *m_npf;
+};
+
+
+
+}
+
+#endif
diff --git a/src/gui/widgets/PluginControl.cpp b/src/gui/widgets/PluginControl.cpp
new file mode 100644
index 0000000..acf33ea
--- /dev/null
+++ b/src/gui/widgets/PluginControl.cpp
@@ -0,0 +1,228 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "PluginControl.h"
+#include "Rotary.h"
+#include "misc/Strings.h"
+#include "base/AudioPluginInstance.h"
+#include "gui/general/GUIPalette.h"
+#include "gui/studio/AudioPluginManager.h"
+#include "gui/widgets/Rotary.h"
+#include <qfont.h>
+#include <qhbox.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qobject.h>
+#include <qstring.h>
+#include <qwidget.h>
+#include <cmath>
+
+
+namespace Rosegarden
+{
+
+PluginControl::PluginControl(QWidget *parent,
+ QGridLayout *layout,
+ ControlType type,
+ PluginPort *port,
+ AudioPluginManager *aPM,
+ int index,
+ float initialValue,
+ bool showBounds,
+ bool hidden):
+ QObject(parent),
+ m_layout(layout),
+ m_type(type),
+ m_port(port),
+ m_pluginManager(aPM),
+ m_index(index)
+{
+ QFont plainFont;
+ plainFont.setPointSize((plainFont.pointSize() * 9 ) / 10);
+
+ QLabel *controlTitle =
+ new QLabel(QString("%1 ").arg(strtoqstr(port->getName())), parent);
+ controlTitle->setFont(plainFont);
+
+ if (type == Rotary) {
+ float lowerBound = port->getLowerBound();
+ float upperBound = port->getUpperBound();
+ // Default value was already handled when calling this constructor
+
+ if (lowerBound > upperBound) {
+ float swap = upperBound;
+ upperBound = lowerBound;
+ lowerBound = swap;
+ }
+
+ float step = (upperBound - lowerBound) / 100.0;
+ float pageStep = step * 10.f;
+ Rotary::TickMode ticks = Rotary::PageStepTicks;
+ bool snapToTicks = false;
+
+ if (port->getDisplayHint() & PluginPort::Integer) {
+ step = 1.0;
+ ticks = Rotary::StepTicks;
+ if (upperBound - lowerBound > 30.0)
+ pageStep = 10.0;
+ snapToTicks = true;
+ }
+ if (port->getDisplayHint() & PluginPort::Toggled) {
+ lowerBound = -0.0001;
+ upperBound = 1.0001;
+ step = 1.0;
+ pageStep = 1.0;
+ ticks = Rotary::StepTicks;
+ snapToTicks = true;
+ }
+
+ float displayLower = lowerBound, displayUpper = upperBound;
+
+ bool logarithmic = (port->getDisplayHint() & PluginPort::Logarithmic);
+
+ if (logarithmic) {
+ float logthresh = -10;
+ float thresh = powf(10, logthresh);
+ if (lowerBound > thresh) lowerBound = log10f(lowerBound);
+ else {
+ if (upperBound > 1) lowerBound = 0;
+ else lowerBound = logthresh;
+ }
+ if (upperBound > thresh) upperBound = log10f(upperBound);
+ else upperBound = logthresh;
+
+ step = (upperBound - lowerBound) / 100.0;
+ pageStep = step * 10.f;
+ initialValue = log10f(initialValue);
+ }
+
+ QLabel *low;
+ if (port->getDisplayHint() &
+ (PluginPort::Integer | PluginPort::Toggled)) {
+ low = new QLabel(QString("%1").arg(int(displayLower)), parent);
+ } else {
+ low = new QLabel(QString("%1").arg(displayLower), parent);
+ }
+ low->setFont(plainFont);
+
+// std::cerr << "port " << port->getName() << ": lower bound "
+// << displayLower << ", upper bound " << displayUpper
+// << ", logarithmic " << logarithmic << ", default "
+// << initialValue << ", actual lower " << lowerBound
+// << ", actual upper " << upperBound << ", step "
+// << step << std::endl;
+
+ m_dial = new ::Rosegarden::Rotary(parent,
+ lowerBound, // min
+ upperBound, // max
+ step, // step
+ pageStep, // page step
+ initialValue, // initial
+ 30, // size
+ ticks,
+ snapToTicks,
+ false, // centred
+ logarithmic);
+
+ m_dial->setKnobColour(GUIPalette::getColour(GUIPalette::RotaryPlugin));
+
+ connect(m_dial, SIGNAL(valueChanged(float)),
+ this, SLOT(slotValueChanged(float)));
+
+ QLabel *upp;
+ if (port->getDisplayHint() &
+ (PluginPort::Integer | PluginPort::Toggled)) {
+ upp = new QLabel(QString("%1").arg(int(displayUpper)), parent);
+ } else {
+ upp = new QLabel(QString("%1").arg(displayUpper), parent);
+ }
+ upp->setFont(plainFont);
+
+ QWidgetItem *item;
+
+ if (!hidden) {
+ controlTitle->show();
+ item = new QWidgetItem(controlTitle);
+ item->setAlignment(Qt::AlignRight | Qt::AlignBottom);
+ m_layout->addItem(item);
+ } else {
+ controlTitle->hide();
+ }
+
+ if (showBounds && !hidden) {
+ low->show();
+ item = new QWidgetItem(low);
+ item->setAlignment(Qt::AlignRight | Qt::AlignBottom);
+ m_layout->addItem(item);
+ } else {
+ low->hide();
+ }
+
+ if (!hidden) {
+ m_dial->show();
+ item = new QWidgetItem(m_dial);
+ item->setAlignment(Qt::AlignCenter);
+ m_layout->addItem(item);
+ } else {
+ m_dial->hide();
+ }
+
+ if (showBounds && !hidden) {
+ upp->show();
+ item = new QWidgetItem(upp);
+ item->setAlignment(Qt::AlignLeft | Qt::AlignBottom);
+ m_layout->addItem(item);
+ } else {
+ upp->hide();
+ }
+ }
+}
+
+void
+PluginControl::setValue(float value, bool emitSignals)
+{
+ if (!emitSignals)
+ m_dial->blockSignals(true);
+ m_dial->setPosition(value);
+ if (!emitSignals)
+ m_dial->blockSignals(false);
+ else
+ emit valueChanged(value);
+}
+
+float
+PluginControl::getValue() const
+{
+ return m_dial == 0 ? 0 : m_dial->getPosition();
+}
+
+void
+PluginControl::slotValueChanged(float value)
+{
+ emit valueChanged(value);
+}
+
+}
+#include "PluginControl.moc"
diff --git a/src/gui/widgets/PluginControl.h b/src/gui/widgets/PluginControl.h
new file mode 100644
index 0000000..83d2d33
--- /dev/null
+++ b/src/gui/widgets/PluginControl.h
@@ -0,0 +1,104 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_PLUGINCONTROL_H_
+#define _RG_PLUGINCONTROL_H_
+
+#include <qobject.h>
+#include <vector>
+
+
+class QWidget;
+class QHBox;
+class QGridLayout;
+
+
+namespace Rosegarden
+{
+
+class Rotary;
+class PluginPort;
+class AudioPluginManager;
+class Studio;
+
+class PluginControl : public QObject
+{
+ Q_OBJECT
+public:
+
+ typedef enum
+ {
+ Rotary,
+ Slider,
+ NumericSlider
+ } ControlType;
+
+ PluginControl(QWidget *parent,
+ QGridLayout *layout,
+ ControlType type,
+ PluginPort *port,
+ AudioPluginManager *pluginManager,
+ int index,
+ float initialValue,
+ bool showBounds,
+ bool hidden);
+
+ void setValue(float value, bool emitSignals = true);
+ float getValue() const;
+
+ int getIndex() const { return m_index; }
+
+ void show();
+ void hide();
+
+public slots:
+ void slotValueChanged(float value);
+
+signals:
+ void valueChanged(float value);
+
+protected:
+
+ //--------------- Data members ---------------------------------
+
+ QGridLayout *m_layout;
+
+ ControlType m_type;
+ PluginPort *m_port;
+
+ ::Rosegarden::Rotary *m_dial; // we have to specify the namespace here otherwise gcc 4.1 thinks it's the enum value above
+ AudioPluginManager *m_pluginManager;
+
+ int m_index;
+
+};
+
+typedef std::vector<PluginControl*>::iterator ControlIterator;
+typedef std::vector<QHBox*>::iterator ControlLineIterator;
+
+
+}
+
+#endif
diff --git a/src/gui/widgets/ProgressBar.cpp b/src/gui/widgets/ProgressBar.cpp
new file mode 100644
index 0000000..c4cb88e
--- /dev/null
+++ b/src/gui/widgets/ProgressBar.cpp
@@ -0,0 +1,44 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "ProgressBar.h"
+
+#include <kprogress.h>
+#include <qwidget.h>
+
+
+namespace Rosegarden
+{
+
+ProgressBar::ProgressBar(int totalSteps,
+ bool /*useDelay*/,
+ QWidget *creator,
+ const char *name,
+ WFlags f) :
+ KProgress(totalSteps, creator, name, f)
+{}
+
+}
+#include "ProgressBar.moc"
diff --git a/src/gui/widgets/ProgressBar.h b/src/gui/widgets/ProgressBar.h
new file mode 100644
index 0000000..3ce93e1
--- /dev/null
+++ b/src/gui/widgets/ProgressBar.h
@@ -0,0 +1,56 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_ROSEGARDENPROGRESSBAR_H_
+#define _RG_ROSEGARDENPROGRESSBAR_H_
+
+#include <kprogress.h>
+
+
+class QWidget;
+
+
+namespace Rosegarden
+{
+
+
+
+class ProgressBar : public KProgress
+{
+ Q_OBJECT
+
+public:
+ ProgressBar(int totalSteps,
+ bool useDelay,
+ QWidget *creator = 0,
+ const char *name = 0,
+ WFlags f = 0);
+
+};
+
+
+}
+
+#endif
diff --git a/src/gui/widgets/ProgressDialog.cpp b/src/gui/widgets/ProgressDialog.cpp
new file mode 100644
index 0000000..1f6811f
--- /dev/null
+++ b/src/gui/widgets/ProgressDialog.cpp
@@ -0,0 +1,209 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "ProgressDialog.h"
+#include "CurrentProgressDialog.h"
+#include "misc/Debug.h"
+#include "gui/application/RosegardenApplication.h"
+#include <klocale.h>
+#include <qcursor.h>
+#include <qprogressdialog.h>
+#include <qstring.h>
+#include <qtimer.h>
+#include <qwidget.h>
+
+
+namespace Rosegarden
+{
+
+bool ProgressDialog::m_modalVisible = false;
+
+
+ProgressDialog::ProgressDialog(QWidget *creator,
+ const char *name,
+ bool modal):
+ KProgressDialog(creator, name,
+ i18n("Processing..."), QString::null, modal),
+ m_wasVisible(false),
+ m_frozen(false),
+ m_modal(modal)
+{
+ setCaption(i18n("Processing..."));
+ RG_DEBUG << "ProgressDialog::ProgressDialog type 1 - "
+ << labelText() << " - modal : " << modal << endl;
+
+ connect(progressBar(), SIGNAL(percentageChanged (int)),
+ this, SLOT(slotCheckShow(int)));
+
+ m_chrono.start();
+
+ CurrentProgressDialog::set
+ (this);
+
+ setMinimumDuration(500); // set a default value for this
+}
+
+ProgressDialog::ProgressDialog(
+ const QString &labelText,
+ int totalSteps,
+ QWidget *creator,
+ const char *name,
+ bool modal) :
+ KProgressDialog(creator,
+ name,
+ i18n("Processing..."),
+ labelText,
+ modal),
+ m_wasVisible(false),
+ m_frozen(false),
+ m_modal(modal)
+{
+ progressBar()->setTotalSteps(totalSteps);
+
+ RG_DEBUG << "ProgressDialog::ProgressDialog type 2 - "
+ << labelText << " - modal : " << modal << endl;
+
+ connect(progressBar(), SIGNAL(percentageChanged (int)),
+ this, SLOT(slotCheckShow(int)));
+
+ m_chrono.start();
+
+ CurrentProgressDialog::set
+ (this);
+
+ setMinimumDuration(500); // set a default value for this
+}
+
+ProgressDialog::~ProgressDialog()
+{
+ m_modalVisible = false;
+}
+
+void
+ProgressDialog::polish()
+{
+ KProgressDialog::polish();
+
+ if (allowCancel())
+ setCursor(Qt::ArrowCursor);
+ else
+ QApplication::setOverrideCursor(QCursor(Qt::waitCursor));
+}
+
+void ProgressDialog::hideEvent(QHideEvent* e)
+{
+ if (!allowCancel())
+ QApplication::restoreOverrideCursor();
+
+ KProgressDialog::hideEvent(e);
+ m_modalVisible = false;
+}
+
+void
+ProgressDialog::slotSetOperationName(QString name)
+{
+ // RG_DEBUG << "ProgressDialog::slotSetOperationName("
+ // << name << ") visible : " << isVisible() << endl;
+
+ setLabel(name);
+ // Little trick stolen from QProgressDialog
+ // increase resize only, never shrink
+ int w = QMAX( isVisible() ? width() : 0, sizeHint().width() );
+ int h = QMAX( isVisible() ? height() : 0, sizeHint().height() );
+ resize( w, h );
+}
+
+void ProgressDialog::slotCancel()
+{
+ RG_DEBUG << "ProgressDialog::slotCancel()\n";
+ KProgressDialog::slotCancel();
+ slotFreeze();
+}
+
+void ProgressDialog::slotCheckShow(int)
+{
+ // RG_DEBUG << "ProgressDialog::slotCheckShow() : "
+ // << m_chrono.elapsed() << " - " << minimumDuration()
+ // << endl;
+
+ if (!isVisible() &&
+ !m_frozen &&
+ m_chrono.elapsed() > minimumDuration()) {
+ RG_DEBUG << "ProgressDialog::slotCheckShow() : showing dialog\n";
+ show();
+ if (m_modal)
+ m_modalVisible = true;
+ processEvents();
+ }
+}
+
+void ProgressDialog::slotFreeze()
+{
+ RG_DEBUG << "ProgressDialog::slotFreeze()\n";
+
+ m_wasVisible = isVisible();
+ if (isVisible()) {
+ m_modalVisible = false;
+ hide();
+ }
+
+ // This is also a convenient place to ensure the wait cursor (if
+ // currently shown) returns to the original cursor to ensure that
+ // the user can respond to whatever's freezing the progress dialog
+ QApplication::restoreOverrideCursor();
+
+ mShowTimer->stop();
+ m_frozen = true;
+}
+
+void ProgressDialog::slotThaw()
+{
+ RG_DEBUG << "ProgressDialog::slotThaw()\n";
+
+ if (m_wasVisible) {
+ if (m_modal)
+ m_modalVisible = true;
+ show();
+ }
+
+ // Restart timer
+ mShowTimer->start(minimumDuration());
+ m_frozen = false;
+ m_chrono.restart();
+}
+
+void ProgressDialog::processEvents()
+{
+ // RG_DEBUG << "ProgressDialog::processEvents: modalVisible is "
+ // << m_modalVisible << endl;
+ if (m_modalVisible) {
+ kapp->processEvents(50);
+ } else {
+ rgapp->refreshGUI(50);
+ }
+}
+
+}
+#include "ProgressDialog.moc"
diff --git a/src/gui/widgets/ProgressDialog.h b/src/gui/widgets/ProgressDialog.h
new file mode 100644
index 0000000..b753493
--- /dev/null
+++ b/src/gui/widgets/ProgressDialog.h
@@ -0,0 +1,98 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_ROSEGARDENPROGRESSDIALOG_H_
+#define _RG_ROSEGARDENPROGRESSDIALOG_H_
+
+#define private protected // fugly
+#include <kprogress.h>
+#undef private
+#include <qdatetime.h>
+
+class QWidget;
+class QString;
+class QHideEvent;
+
+
+namespace Rosegarden
+{
+
+
+
+class ProgressDialog : public KProgressDialog
+{
+ Q_OBJECT
+public:
+ ProgressDialog(QWidget * creator = 0,
+ const char * name = 0,
+ bool modal = true);
+
+ ProgressDialog(const QString &labelText,
+ int totalSteps,
+ QWidget *creator = 0,
+ const char *name = 0,
+ bool modal = true);
+
+ ~ProgressDialog();
+
+ /**
+ * A "safe" way to process events without worrying about user
+ * input during the process. If there is a modal progress dialog
+ * visible, then this will permit user input so as to allow the
+ * user to hit Cancel; otherwise it will prevent all user input
+ */
+ static void processEvents();
+
+ virtual void polish();
+
+public slots:
+ void slotSetOperationName(QString);
+ void slotCancel();
+
+ /// Stop and hide (if it's shown) the progress dialog
+ void slotFreeze();
+
+ /// Restore the dialog to its normal state
+ void slotThaw();
+
+protected slots:
+ void slotCheckShow(int);
+
+protected:
+ virtual void hideEvent(QHideEvent*);
+
+ //--------------- Data members ---------------------------------
+
+ QTime m_chrono;
+ bool m_wasVisible;
+ bool m_frozen;
+ bool m_modal;
+ static bool m_modalVisible;
+};
+
+
+}
+
+#endif
diff --git a/src/gui/widgets/QDeferScrollView.cpp b/src/gui/widgets/QDeferScrollView.cpp
new file mode 100644
index 0000000..01864a3
--- /dev/null
+++ b/src/gui/widgets/QDeferScrollView.cpp
@@ -0,0 +1,52 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "QDeferScrollView.h"
+
+#include <qscrollview.h>
+#include <qwidget.h>
+
+
+namespace Rosegarden
+{
+
+QDeferScrollView::QDeferScrollView(QWidget* parent, const char *name, WFlags f)
+ : QScrollView(parent, name, f)
+{
+ setFocusPolicy(QWidget::WheelFocus);
+}
+
+void QDeferScrollView::setBottomMargin(int m)
+{
+ setMargins(leftMargin(), topMargin(), rightMargin(), m);
+}
+
+void QDeferScrollView::contentsWheelEvent(QWheelEvent* e)
+{
+ emit gotWheelEvent(e);
+}
+
+}
+#include "QDeferScrollView.moc"
diff --git a/src/gui/widgets/QDeferScrollView.h b/src/gui/widgets/QDeferScrollView.h
new file mode 100644
index 0000000..e4b2e3d
--- /dev/null
+++ b/src/gui/widgets/QDeferScrollView.h
@@ -0,0 +1,75 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_QDEFERSCROLLVIEW_H_
+#define _RG_QDEFERSCROLLVIEW_H_
+
+#include <qscrollview.h>
+
+
+class QWidget;
+class QWheelEvent;
+
+
+namespace Rosegarden
+{
+
+
+
+/**
+ * A QScrollView which defers vertical scrolling (through mouse wheel)
+ * elsewhere, typically another QScrollView, so that both can be kept
+ * in sync. The master scrollview will connect its vertical scrollbar
+ * to the slave view so the scrollbar will act on both views.
+ *
+ * The slave scrollview will defer its scrolling to the master by
+ * having the gotWheelEvent() signal connected to a slot in the master
+ * scrollview, which will simply process the wheel event as if it had
+ * received it itself.
+ *
+ * @see TrackEditor
+ * @see SegmentCanvas
+ * @see TrackEditor::m_trackButtonScroll
+ */
+class QDeferScrollView : public QScrollView
+{
+ Q_OBJECT
+public:
+ QDeferScrollView(QWidget* parent=0, const char *name=0, WFlags f=0);
+
+ void setBottomMargin(int);
+
+signals:
+ void gotWheelEvent(QWheelEvent*);
+
+protected:
+ virtual void contentsWheelEvent(QWheelEvent*);
+
+};
+
+
+}
+
+#endif
diff --git a/src/gui/widgets/QuantizeParameters.cpp b/src/gui/widgets/QuantizeParameters.cpp
new file mode 100644
index 0000000..19ba96a
--- /dev/null
+++ b/src/gui/widgets/QuantizeParameters.cpp
@@ -0,0 +1,497 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "QuantizeParameters.h"
+#include <qlayout.h>
+#include <kapplication.h>
+
+#include <klocale.h>
+#include "base/NotationTypes.h"
+#include "base/Quantizer.h"
+#include "base/BasicQuantizer.h"
+#include "base/LegatoQuantizer.h"
+#include "base/NotationQuantizer.h"
+#include "gui/editors/notation/NotationStrings.h"
+#include "gui/editors/notation/NotePixmapFactory.h"
+#include <kcombobox.h>
+#include <kconfig.h>
+#include <qcheckbox.h>
+#include <qframe.h>
+#include <qgroupbox.h>
+#include <qhbox.h>
+#include <qlabel.h>
+#include <qobject.h>
+#include <qpixmap.h>
+#include <qpushbutton.h>
+#include <qstring.h>
+#include <qwidget.h>
+
+
+namespace Rosegarden
+{
+
+QuantizeParameters::QuantizeParameters(QWidget *parent,
+ QuantizerType defaultQuantizer,
+ bool showNotationOption,
+ bool showAdvancedButton,
+ QString configCategory,
+ QString preamble) :
+ QFrame(parent),
+ m_configCategory(configCategory),
+ m_standardQuantizations
+ (BasicQuantizer::getStandardQuantizations())
+{
+ m_mainLayout = new QGridLayout(this,
+ preamble ? 3 : 4, 2,
+ preamble ? 10 : 0,
+ preamble ? 5 : 4);
+
+ int zero = 0;
+ if (preamble) {
+ QLabel *label = new QLabel(preamble, this);
+ label->setAlignment(Qt::WordBreak);
+ m_mainLayout->addMultiCellWidget(label, 0, 0, 0, 1);
+ zero = 1;
+ }
+
+ QGroupBox *quantizerBox = new QGroupBox
+ (1, Horizontal, i18n("Quantizer"), this);
+
+ m_mainLayout->addWidget(quantizerBox, zero, 0);
+ QFrame *typeFrame = new QFrame(quantizerBox);
+
+ QGridLayout *layout = new QGridLayout(typeFrame, 2, 2, 5, 3);
+ layout->addWidget(new QLabel(i18n("Quantizer type:"), typeFrame), 0, 0);
+ m_typeCombo = new KComboBox(typeFrame);
+ m_typeCombo->insertItem(i18n("Grid quantizer"));
+ m_typeCombo->insertItem(i18n("Legato quantizer"));
+ m_typeCombo->insertItem(i18n("Heuristic notation quantizer"));
+ layout->addWidget(m_typeCombo, 0, 1);
+
+ m_notationTarget = new QCheckBox
+ (i18n("Quantize for notation only (leave performance unchanged)"),
+ typeFrame);
+ layout->addMultiCellWidget(m_notationTarget, 1, 1, 0, 1);
+ if (!showNotationOption)
+ m_notationTarget->hide();
+
+ QHBox *parameterBox = new QHBox(this);
+ m_mainLayout->addWidget(parameterBox, zero + 1, 0);
+
+ m_notationBox = new QGroupBox
+ (1, Horizontal, i18n("Notation parameters"), parameterBox);
+ QFrame *notationFrame = new QFrame(m_notationBox);
+
+ layout = new QGridLayout(notationFrame, 4, 2, 5, 3);
+
+ layout->addWidget(new QLabel(i18n("Base grid unit:"), notationFrame),
+ 1, 0);
+ m_notationUnitCombo = new KComboBox(notationFrame);
+ layout->addWidget(m_notationUnitCombo, 1, 1);
+
+ layout->addWidget(new QLabel(i18n("Complexity:"),
+ notationFrame), 0, 0);
+
+ m_simplicityCombo = new KComboBox(notationFrame);
+ m_simplicityCombo->insertItem(i18n("Very high"));
+ m_simplicityCombo->insertItem(i18n("High"));
+ m_simplicityCombo->insertItem(i18n("Normal"));
+ m_simplicityCombo->insertItem(i18n("Low"));
+ m_simplicityCombo->insertItem(i18n("Very low"));
+ layout->addWidget(m_simplicityCombo, 0, 1);
+
+ layout->addWidget(new QLabel(i18n("Tuplet level:"),
+ notationFrame), 2, 0);
+ m_maxTuplet = new KComboBox(notationFrame);
+ m_maxTuplet->insertItem(i18n("None"));
+ m_maxTuplet->insertItem(i18n("2-in-the-time-of-3"));
+ m_maxTuplet->insertItem(i18n("Triplet"));
+ /*
+ m_maxTuplet->insertItem(i18n("4-Tuplet"));
+ m_maxTuplet->insertItem(i18n("5-Tuplet"));
+ m_maxTuplet->insertItem(i18n("6-Tuplet"));
+ m_maxTuplet->insertItem(i18n("7-Tuplet"));
+ m_maxTuplet->insertItem(i18n("8-Tuplet"));
+ */
+ m_maxTuplet->insertItem(i18n("Any"));
+ layout->addWidget(m_maxTuplet, 2, 1);
+
+ m_counterpoint = new QCheckBox(i18n("Permit counterpoint"), notationFrame);
+ layout->addMultiCellWidget(m_counterpoint, 3, 3, 0, 1);
+
+ m_gridBox = new QGroupBox
+ (1, Horizontal, i18n("Grid parameters"), parameterBox);
+ QFrame *gridFrame = new QFrame(m_gridBox);
+
+ layout = new QGridLayout(gridFrame, 4, 2, 5, 3);
+
+ layout->addWidget(new QLabel(i18n("Base grid unit:"), gridFrame), 0, 0);
+ m_gridUnitCombo = new KComboBox(gridFrame);
+ layout->addWidget(m_gridUnitCombo, 0, 1);
+
+ m_swingLabel = new QLabel(i18n("Swing:"), gridFrame);
+ layout->addWidget(m_swingLabel, 1, 0);
+ m_swingCombo = new KComboBox(gridFrame);
+ layout->addWidget(m_swingCombo, 1, 1);
+
+ m_iterativeLabel = new QLabel(i18n("Iterative amount:"), gridFrame);
+ layout->addWidget(m_iterativeLabel, 2, 0);
+ m_iterativeCombo = new KComboBox(gridFrame);
+ layout->addWidget(m_iterativeCombo, 2, 1);
+
+ m_durationCheckBox = new QCheckBox
+ (i18n("Quantize durations as well as start times"), gridFrame);
+ layout->addMultiCellWidget(m_durationCheckBox, 3, 3, 0, 1);
+
+ m_postProcessingBox = new QGroupBox
+ (1, Horizontal, i18n("After quantization"), this);
+
+ if (preamble) {
+ m_mainLayout->addMultiCellWidget(m_postProcessingBox,
+ zero, zero + 1,
+ 1, 1);
+ } else {
+ m_mainLayout->addWidget(m_postProcessingBox, zero + 3, 0);
+ }
+
+ bool advanced = true;
+ m_advancedButton = 0;
+ if (showAdvancedButton) {
+ m_advancedButton =
+ new QPushButton(i18n("Show advanced options"), this);
+ m_mainLayout->addWidget(m_advancedButton, zero + 2, 0, Qt::AlignLeft);
+ QObject::connect(m_advancedButton, SIGNAL(clicked()),
+ this, SLOT(slotAdvancedChanged()));
+ }
+
+ QFrame *postFrame = new QFrame(m_postProcessingBox);
+
+ layout = new QGridLayout(postFrame, 4, 1, 5, 3);
+ m_rebeam = new QCheckBox(i18n("Re-beam"), postFrame);
+ m_articulate = new QCheckBox
+ (i18n("Add articulations (staccato, tenuto, slurs)"), postFrame);
+ m_makeViable = new QCheckBox(i18n("Tie notes at barlines etc"), postFrame);
+ m_deCounterpoint = new QCheckBox(i18n("Split-and-tie overlapping chords"), postFrame);
+
+ layout->addWidget(m_rebeam, 0, 0);
+ layout->addWidget(m_articulate, 1, 0);
+ layout->addWidget(m_makeViable, 2, 0);
+ layout->addWidget(m_deCounterpoint, 3, 0);
+
+ QPixmap noMap = NotePixmapFactory::toQPixmap
+ (NotePixmapFactory::makeToolbarPixmap("menu-no-note"));
+
+ int defaultType = 0;
+ timeT defaultUnit =
+ Note(Note::Demisemiquaver).getDuration();
+
+ if (!m_configCategory) {
+ if (defaultQuantizer == Notation)
+ m_configCategory = "Quantize Dialog Notation";
+ else
+ m_configCategory = "Quantize Dialog Grid";
+ }
+
+ int defaultSwing = 0;
+ int defaultIterate = 100;
+
+ if (m_configCategory) {
+ KConfig *config = kapp->config();
+ config->setGroup(m_configCategory);
+ defaultType =
+ config->readNumEntry("quantizetype",
+ (defaultQuantizer == Notation) ? 2 :
+ (defaultQuantizer == Legato) ? 1 :
+ 0);
+ defaultUnit =
+ config->readNumEntry("quantizeunit", defaultUnit);
+ defaultSwing =
+ config->readNumEntry("quantizeswing", defaultSwing);
+ defaultIterate =
+ config->readNumEntry("quantizeiterate", defaultIterate);
+ m_notationTarget->setChecked
+ (config->readBoolEntry("quantizenotationonly",
+ defaultQuantizer == Notation));
+ m_durationCheckBox->setChecked
+ (config->readBoolEntry("quantizedurations", false));
+ m_simplicityCombo->setCurrentItem
+ (config->readNumEntry("quantizesimplicity", 13) - 11);
+ m_maxTuplet->setCurrentItem
+ (config->readNumEntry("quantizemaxtuplet", 3) - 1);
+ m_counterpoint->setChecked
+ (config->readBoolEntry("quantizecounterpoint", false));
+ m_rebeam->setChecked
+ (config->readBoolEntry("quantizerebeam", true));
+ m_makeViable->setChecked
+ (config->readBoolEntry("quantizemakeviable", false));
+ m_deCounterpoint->setChecked
+ (config->readBoolEntry("quantizedecounterpoint", false));
+ m_articulate->setChecked
+ (config->readBoolEntry("quantizearticulate", true));
+ advanced = config->readBoolEntry("quantizeshowadvanced", false);
+ } else {
+ defaultType =
+ (defaultQuantizer == Notation) ? 2 :
+ (defaultQuantizer == Legato) ? 1 : 0;
+ m_notationTarget->setChecked(defaultQuantizer == Notation);
+ m_durationCheckBox->setChecked(false);
+ m_simplicityCombo->setCurrentItem(2);
+ m_maxTuplet->setCurrentItem(2);
+ m_counterpoint->setChecked(false);
+ m_rebeam->setChecked(true);
+ m_makeViable->setChecked(defaultQuantizer == Notation);
+ m_deCounterpoint->setChecked(defaultQuantizer == Notation);
+ m_articulate->setChecked(true);
+ advanced = false;
+ }
+
+ if (preamble || advanced) {
+ m_postProcessingBox->show();
+ } else {
+ m_postProcessingBox->hide();
+ }
+
+ for (unsigned int i = 0; i < m_standardQuantizations.size(); ++i) {
+
+ timeT time = m_standardQuantizations[i];
+ timeT error = 0;
+
+ QPixmap pmap = NotePixmapFactory::toQPixmap
+ (NotePixmapFactory::makeNoteMenuPixmap(time, error));
+ QString label = NotationStrings::makeNoteMenuLabel(time, false, error);
+
+ if (error == 0) {
+ m_gridUnitCombo->insertItem(pmap, label);
+ m_notationUnitCombo->insertItem(pmap, label);
+ } else {
+ m_gridUnitCombo->insertItem(noMap, QString("%1").arg(time));
+ m_notationUnitCombo->insertItem(noMap, QString("%1").arg(time));
+ }
+
+ if (m_standardQuantizations[i] == defaultUnit) {
+ m_gridUnitCombo->setCurrentItem(m_gridUnitCombo->count() - 1);
+ m_notationUnitCombo->setCurrentItem
+ (m_notationUnitCombo->count() - 1);
+ }
+ }
+
+ for (int i = -100; i <= 200; i += 10) {
+ m_swingCombo->insertItem(i == 0 ? i18n("None") : QString("%1%").arg(i));
+ if (i == defaultSwing)
+ m_swingCombo->setCurrentItem(m_swingCombo->count() - 1);
+ }
+
+ for (int i = 10; i <= 100; i += 10) {
+ m_iterativeCombo->insertItem(i == 100 ? i18n("Full quantize") :
+ QString("%1%").arg(i));
+ if (i == defaultIterate)
+ m_iterativeCombo->setCurrentItem(m_iterativeCombo->count() - 1);
+ }
+
+ switch (defaultType) {
+ case 0: // grid
+ m_gridBox->show();
+ m_swingLabel->show();
+ m_swingCombo->show();
+ m_iterativeLabel->show();
+ m_iterativeCombo->show();
+ m_notationBox->hide();
+ m_durationCheckBox->show();
+ m_typeCombo->setCurrentItem(0);
+ break;
+ case 1: // legato
+ m_gridBox->show();
+ m_swingLabel->hide();
+ m_swingCombo->hide();
+ m_iterativeLabel->hide();
+ m_iterativeCombo->hide();
+ m_notationBox->hide();
+ m_durationCheckBox->hide();
+ m_typeCombo->setCurrentItem(1);
+ case 2: // notation
+ m_gridBox->hide();
+ m_notationBox->show();
+ m_typeCombo->setCurrentItem(2);
+ break;
+ }
+
+ connect(m_typeCombo, SIGNAL(activated(int)), SLOT(slotTypeChanged(int)));
+}
+
+Quantizer *
+QuantizeParameters::getQuantizer() const
+{
+ //!!! Excessive duplication with
+ // EventQuantizeCommand::makeQuantizer in editcommands.cpp
+
+ int type = m_typeCombo->currentItem();
+ timeT unit = 0;
+
+ if (type == 0 || type == 1) {
+ unit = m_standardQuantizations[m_gridUnitCombo->currentItem()];
+ } else {
+ unit = m_standardQuantizations[m_notationUnitCombo->currentItem()];
+ }
+
+ Quantizer *quantizer = 0;
+
+ int swing = m_swingCombo->currentItem();
+ swing *= 10;
+ swing -= 100;
+
+ int iterate = m_iterativeCombo->currentItem();
+ iterate *= 10;
+ iterate += 10;
+
+ if (type == 0) {
+
+ if (m_notationTarget->isChecked()) {
+ quantizer = new BasicQuantizer
+ (Quantizer::RawEventData,
+ Quantizer::NotationPrefix,
+ unit, m_durationCheckBox->isChecked(),
+ swing, iterate);
+ } else {
+ quantizer = new BasicQuantizer
+ (Quantizer::RawEventData,
+ Quantizer::RawEventData,
+ unit, m_durationCheckBox->isChecked(),
+ swing, iterate);
+ }
+ } else if (type == 1) {
+ if (m_notationTarget->isChecked()) {
+ quantizer = new LegatoQuantizer
+ (Quantizer::RawEventData,
+ Quantizer::NotationPrefix, unit);
+ } else {
+ quantizer = new LegatoQuantizer
+ (Quantizer::RawEventData,
+ Quantizer::RawEventData,
+ unit);
+ }
+ } else {
+
+ NotationQuantizer *nq;
+
+ if (m_notationTarget->isChecked()) {
+ nq = new NotationQuantizer();
+ } else {
+ nq = new NotationQuantizer
+ (Quantizer::RawEventData,
+ Quantizer::RawEventData);
+ }
+
+ nq->setUnit(unit);
+ nq->setSimplicityFactor(m_simplicityCombo->currentItem() + 11);
+ nq->setMaxTuplet(m_maxTuplet->currentItem() + 1);
+ nq->setContrapuntal(m_counterpoint->isChecked());
+ nq->setArticulate(m_articulate->isChecked());
+
+ quantizer = nq;
+ }
+
+ if (m_configCategory) {
+ KConfig *config = kapp->config();
+ config->setGroup(m_configCategory);
+ config->writeEntry("quantizetype", type);
+ config->writeEntry("quantizeunit", unit);
+ config->writeEntry("quantizeswing", swing);
+ config->writeEntry("quantizeiterate", iterate);
+ config->writeEntry("quantizenotationonly",
+ m_notationTarget->isChecked());
+ if (type == 0) {
+ config->writeEntry("quantizedurations",
+ m_durationCheckBox->isChecked());
+ } else {
+ config->writeEntry("quantizesimplicity",
+ m_simplicityCombo->currentItem() + 11);
+ config->writeEntry("quantizemaxtuplet",
+ m_maxTuplet->currentItem() + 1);
+ config->writeEntry("quantizecounterpoint",
+ m_counterpoint->isChecked());
+ config->writeEntry("quantizearticulate",
+ m_articulate->isChecked());
+ }
+ config->writeEntry("quantizerebeam", m_rebeam->isChecked());
+ config->writeEntry("quantizemakeviable", m_makeViable->isChecked());
+ config->writeEntry("quantizedecounterpoint", m_deCounterpoint->isChecked());
+ }
+
+ return quantizer;
+}
+
+void
+QuantizeParameters::slotAdvancedChanged()
+{
+ if (m_postProcessingBox->isVisible()) {
+ if (m_advancedButton)
+ m_advancedButton->setText(i18n("Show Advanced Options"));
+ m_postProcessingBox->hide();
+ } else {
+ if (m_advancedButton)
+ m_advancedButton->setText(i18n("Hide Advanced Options"));
+ m_postProcessingBox->show();
+ }
+ adjustSize();
+}
+
+void
+QuantizeParameters::showAdvanced(bool show)
+{
+ if (show) {
+ m_postProcessingBox->show();
+ } else {
+ m_postProcessingBox->hide();
+ }
+ adjustSize();
+}
+
+void
+QuantizeParameters::slotTypeChanged(int index)
+{
+ if (index == 0) {
+ m_gridBox->show();
+ m_swingLabel->show();
+ m_swingCombo->show();
+ m_iterativeLabel->show();
+ m_iterativeCombo->show();
+ m_durationCheckBox->show();
+ m_notationBox->hide();
+ } else if (index == 1) {
+ m_gridBox->show();
+ m_swingLabel->hide();
+ m_swingCombo->hide();
+ m_iterativeLabel->hide();
+ m_iterativeCombo->hide();
+ m_durationCheckBox->hide();
+ m_notationBox->hide();
+ } else {
+ m_gridBox->hide();
+ m_notationBox->show();
+ }
+}
+
+}
+#include "QuantizeParameters.moc"
diff --git a/src/gui/widgets/QuantizeParameters.h b/src/gui/widgets/QuantizeParameters.h
new file mode 100644
index 0000000..8eee7ff
--- /dev/null
+++ b/src/gui/widgets/QuantizeParameters.h
@@ -0,0 +1,117 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_ROSEGARDENQUANTIZEPARAMETERS_H_
+#define _RG_ROSEGARDENQUANTIZEPARAMETERS_H_
+
+#include <qframe.h>
+#include <qstring.h>
+#include <vector>
+#include "base/Event.h"
+#include <qgroupbox.h>
+
+
+class QWidget;
+class QPushButton;
+class QLabel;
+class QGridLayout;
+class QCheckBox;
+class KComboBox;
+
+
+namespace Rosegarden
+{
+
+class Quantizer;
+
+
+class QuantizeParameters : public QFrame
+{
+ Q_OBJECT
+public:
+ enum QuantizerType { Grid, Legato, Notation };
+
+ QuantizeParameters(QWidget *parent,
+ QuantizerType defaultQuantizer,
+ bool showNotationOption,
+ bool showAdvancedButton,
+ QString configCategory,
+ QString preamble = 0);
+
+ /**
+ * Returned quantizer object is on heap -- caller must delete.
+ * Also writes values to KConfig if so requested in constructor.
+ */
+ Quantizer *getQuantizer() const;
+
+ QWidget *getAdvancedWidget() { return m_postProcessingBox; }
+
+ bool shouldRebeam() const { return m_rebeam; }
+ bool shouldDeCounterpoint() const { return m_deCounterpoint; }
+ bool shouldMakeViable() const { return m_makeViable; }
+
+ void showAdvanced(bool show);
+
+public slots:
+ void slotTypeChanged(int);
+ void slotAdvancedChanged();
+
+protected:
+ QString m_configCategory;
+
+ std::vector<timeT> m_standardQuantizations;
+
+ QGridLayout *m_mainLayout;
+
+ KComboBox *m_typeCombo;
+
+ QGroupBox *m_gridBox;
+ QCheckBox *m_durationCheckBox;
+ KComboBox *m_gridUnitCombo;
+ QLabel *m_swingLabel;
+ KComboBox *m_swingCombo;
+ QLabel *m_iterativeLabel;
+ KComboBox *m_iterativeCombo;
+
+ QGroupBox *m_notationBox;
+ QCheckBox *m_notationTarget;
+ KComboBox *m_notationUnitCombo;
+ KComboBox *m_simplicityCombo;
+ KComboBox *m_maxTuplet;
+ QCheckBox *m_counterpoint;
+
+ QPushButton *m_advancedButton;
+ QGroupBox *m_postProcessingBox;
+ QCheckBox *m_articulate;
+ QCheckBox *m_makeViable;
+ QCheckBox *m_deCounterpoint;
+ QCheckBox *m_rebeam;
+};
+
+
+
+}
+
+#endif
diff --git a/src/gui/widgets/RosegardenPopupMenu.h b/src/gui/widgets/RosegardenPopupMenu.h
new file mode 100644
index 0000000..aca82a9
--- /dev/null
+++ b/src/gui/widgets/RosegardenPopupMenu.h
@@ -0,0 +1,43 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_ROSEGARDENPOPUPMENU_H_
+#define _RG_ROSEGARDENPOPUPMENU_H_
+
+#include <qpopupmenu.h>
+
+namespace Rosegarden {
+
+class RosegardenPopupMenu : public QPopupMenu
+{
+ // just to make itemHeight public
+public:
+ RosegardenPopupMenu(QWidget *parent) : QPopupMenu(parent) { }
+ using QPopupMenu::itemHeight;
+};
+
+
+}
+
+#endif /*ROSEGARDENPOPUPMENU_H_*/
diff --git a/src/gui/widgets/Rotary.cpp b/src/gui/widgets/Rotary.cpp
new file mode 100644
index 0000000..36d5817
--- /dev/null
+++ b/src/gui/widgets/Rotary.cpp
@@ -0,0 +1,560 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "Rotary.h"
+
+#include "misc/Debug.h"
+#include "gui/dialogs/FloatEdit.h"
+#include "gui/general/GUIPalette.h"
+#include "TextFloat.h"
+#include <kapplication.h>
+#include <klocale.h>
+#include <qbrush.h>
+#include <qcolor.h>
+#include <qdialog.h>
+#include <qimage.h>
+#include <qpainter.h>
+#include <qpalette.h>
+#include <qpen.h>
+#include <qpixmap.h>
+#include <qpoint.h>
+#include <qstring.h>
+#include <qtimer.h>
+#include <qtooltip.h>
+#include <qwidget.h>
+#include <cmath>
+
+
+namespace Rosegarden
+{
+
+#define ROTARY_MIN (0.25 * M_PI)
+#define ROTARY_MAX (1.75 * M_PI)
+#define ROTARY_RANGE (ROTARY_MAX - ROTARY_MIN)
+
+static TextFloat* _float = 0;
+static QTimer *_floatTimer = 0;
+
+Rotary::PixmapCache Rotary::m_pixmaps;
+
+
+Rotary::Rotary(QWidget *parent,
+ float minValue,
+ float maxValue,
+ float step,
+ float pageStep,
+ float initialPosition,
+ int size,
+ TickMode ticks,
+ bool snapToTicks,
+ bool centred,
+ bool logarithmic) :
+ QWidget(parent),
+ m_minValue(minValue),
+ m_maxValue(maxValue),
+ m_step(step),
+ m_pageStep(pageStep),
+ m_size(size),
+ m_tickMode(ticks),
+ m_snapToTicks(snapToTicks),
+ m_centred(centred),
+ m_position(initialPosition),
+ m_snapPosition(m_position),
+ m_initialPosition(initialPosition),
+ m_buttonPressed(false),
+ m_lastY(0),
+ m_lastX(0),
+ m_knobColour(0, 0, 0),
+ m_logarithmic(logarithmic)
+{
+ setBackgroundMode(Qt::NoBackground);
+
+ if (!_float)
+ _float = new TextFloat(this);
+
+ if (!_floatTimer) {
+ _floatTimer = new QTimer();
+ }
+
+ // connect timer
+ connect(_floatTimer, SIGNAL(timeout()), this,
+ SLOT(slotFloatTimeout()));
+ _float->hide();
+
+ QToolTip::add
+ (this,
+ i18n("Click and drag up and down or left and right to modify.\nDouble click to edit value directly."));
+ setFixedSize(size, size);
+
+ emit valueChanged(m_snapPosition);
+}
+
+Rotary::~Rotary()
+{
+ // Remove this connection
+ //
+ disconnect(_floatTimer, SIGNAL(timeout()), this,
+ SLOT(slotFloatTimeout()));
+
+ delete _float;
+ _float = 0;
+}
+
+void
+Rotary::slotFloatTimeout()
+{
+ if (_float)
+ _float->hide();
+}
+
+void
+Rotary::setKnobColour(const QColor &colour)
+{
+ m_knobColour = colour;
+ repaint();
+}
+
+void
+Rotary::paintEvent(QPaintEvent *)
+{
+ QPainter paint;
+
+ double angle = ROTARY_MIN // offset
+ + (ROTARY_RANGE *
+ (double(m_snapPosition - m_minValue) /
+ (double(m_maxValue) - double(m_minValue))));
+ int degrees = int(angle * 180.0 / M_PI);
+
+ // RG_DEBUG << "degrees: " << degrees << ", size " << m_size << ", pixel " << m_knobColour.pixel() << endl;
+
+ int numTicks = 0;
+ switch (m_tickMode) {
+ case LimitTicks:
+ numTicks = 2;
+ break;
+ case IntervalTicks:
+ numTicks = 5;
+ break;
+ case PageStepTicks:
+ numTicks = 1 + (m_maxValue + 0.0001 - m_minValue) / m_pageStep;
+ break;
+ case StepTicks:
+ numTicks = 1 + (m_maxValue + 0.0001 - m_minValue) / m_step;
+ break;
+ default:
+ break;
+ }
+
+ CacheIndex index(m_size, m_knobColour.pixel(), degrees, numTicks, m_centred);
+
+ if (m_pixmaps.find(index) != m_pixmaps.end()) {
+ paint.begin(this);
+ paint.drawPixmap(0, 0, m_pixmaps[index]);
+ paint.end();
+ return ;
+ }
+
+ int scale = 4;
+ int width = m_size * scale;
+ QPixmap map(width, width);
+ map.fill(paletteBackgroundColor());
+ paint.begin(&map);
+
+ QPen pen;
+ pen.setColor(kapp->palette().color(QPalette::Active, QColorGroup::Dark));
+ pen.setWidth(scale);
+ paint.setPen(pen);
+
+ if (m_knobColour != Qt::black) {
+ paint.setBrush(m_knobColour);
+ } else {
+ paint.setBrush(
+ kapp->palette().color(QPalette::Active, QColorGroup::Base));
+ }
+
+ QColor c(m_knobColour);
+ pen.setColor(c);
+ paint.setPen(pen);
+
+ int indent = width * 0.15 + 1;
+
+ paint.drawEllipse(indent, indent, width - 2*indent, width - 2*indent);
+
+ pen.setWidth(2 * scale);
+ int pos = indent + (width - 2 * indent) / 8;
+ int darkWidth = (width - 2 * indent) * 2 / 3;
+ int darkQuote = (130 * 2 / (darkWidth ? darkWidth : 1)) + 100;
+ while (darkWidth) {
+ c = c.light(101);
+ pen.setColor(c);
+ paint.setPen(pen);
+ paint.drawEllipse(pos, pos, darkWidth, darkWidth);
+ if (!--darkWidth)
+ break;
+ paint.drawEllipse(pos, pos, darkWidth, darkWidth);
+ if (!--darkWidth)
+ break;
+ paint.drawEllipse(pos, pos, darkWidth, darkWidth);
+ ++pos;
+ --darkWidth;
+ }
+
+ paint.setBrush(QBrush::NoBrush);
+
+ pen.setColor(colorGroup().dark());
+ pen.setWidth(scale);
+ paint.setPen(pen);
+
+ for (int i = 0; i < numTicks; ++i) {
+ int div = numTicks;
+ if (div > 1)
+ --div;
+ drawTick(paint, ROTARY_MIN + (ROTARY_MAX - ROTARY_MIN) * i / div,
+ width, i != 0 && i != numTicks - 1);
+ }
+
+ // now the bright metering bit
+
+ pen.setColor(GUIPalette::getColour(GUIPalette::RotaryMeter));
+ pen.setWidth(indent);
+ paint.setPen(pen);
+
+ if (m_centred) {
+ paint.drawArc(indent / 2, indent / 2, width - indent, width - indent,
+ 90 * 16, -(degrees - 180) * 16);
+ } else {
+ paint.drawArc(indent / 2, indent / 2, width - indent, width - indent,
+ (180 + 45) * 16, -(degrees - 45) * 16);
+ }
+
+ pen.setWidth(scale);
+ paint.setPen(pen);
+
+ int shadowAngle = -720;
+ c = colorGroup().dark();
+ for (int arc = 120; arc < 2880; arc += 240) {
+ pen.setColor(c);
+ paint.setPen(pen);
+ paint.drawArc(indent, indent, width - 2*indent, width - 2*indent, shadowAngle + arc, 240);
+ paint.drawArc(indent, indent, width - 2*indent, width - 2*indent, shadowAngle - arc, 240);
+ c = c.light( 110 );
+ }
+
+ shadowAngle = 2160;
+ c = colorGroup().dark();
+ for (int arc = 120; arc < 2880; arc += 240) {
+ pen.setColor(c);
+ paint.setPen(pen);
+ paint.drawArc(scale / 2, scale / 2, width - scale, width - scale, shadowAngle + arc, 240);
+ paint.drawArc(scale / 2, scale / 2, width - scale, width - scale, shadowAngle - arc, 240);
+ c = c.light( 109 );
+ }
+
+ // and un-draw the bottom part
+ pen.setColor(paletteBackgroundColor());
+ paint.setPen(pen);
+ paint.drawArc(scale / 2, scale / 2, width - scale, width - scale,
+ -45 * 16, -90 * 16);
+
+ double hyp = double(width) / 2.0;
+ double len = hyp - indent;
+ --len;
+
+ double x0 = hyp;
+ double y0 = hyp;
+
+ double x = hyp - len * sin(angle);
+ double y = hyp + len * cos(angle);
+
+ pen.setWidth(scale * 2);
+ pen.setColor(colorGroup().dark());
+ paint.setPen(pen);
+
+ paint.drawLine(int(x0), int(y0), int(x), int(y));
+
+ paint.end();
+
+ QImage i = map.convertToImage().smoothScale(m_size, m_size);
+ m_pixmaps[index] = QPixmap(i);
+ paint.begin(this);
+ paint.drawPixmap(0, 0, m_pixmaps[index]);
+ paint.end();
+}
+
+void
+Rotary::drawTick(QPainter &paint, double angle, int size, bool internal)
+{
+ double hyp = double(size) / 2.0;
+ double x0 = hyp - (hyp - 1) * sin(angle);
+ double y0 = hyp + (hyp - 1) * cos(angle);
+
+ if (internal) {
+
+ double len = hyp / 4;
+ double x1 = hyp - (hyp - len) * sin(angle);
+ double y1 = hyp + (hyp - len) * cos(angle);
+
+ paint.drawLine(int(x0), int(y0), int(x1), int(y1));
+
+ } else {
+
+ double len = hyp / 4;
+ double x1 = hyp - (hyp + len) * sin(angle);
+ double y1 = hyp + (hyp + len) * cos(angle);
+
+ paint.drawLine(int(x0), int(y0), int(x1), int(y1));
+ }
+}
+
+void
+Rotary::snapPosition()
+{
+ m_snapPosition = m_position;
+
+ if (m_snapToTicks) {
+
+ switch (m_tickMode) {
+
+ case NoTicks:
+ break; // meaningless
+
+ case LimitTicks:
+ if (m_position < (m_minValue + m_maxValue) / 2.0) {
+ m_snapPosition = m_minValue;
+ } else {
+ m_snapPosition = m_maxValue;
+ }
+ break;
+
+ case IntervalTicks:
+ m_snapPosition = m_minValue +
+ (m_maxValue - m_minValue) / 4.0 *
+ int((m_snapPosition - m_minValue) /
+ ((m_maxValue - m_minValue) / 4.0));
+ break;
+
+ case PageStepTicks:
+ m_snapPosition = m_minValue +
+ m_pageStep *
+ int((m_snapPosition - m_minValue) / m_pageStep);
+ break;
+
+ case StepTicks:
+ m_snapPosition = m_minValue +
+ m_step *
+ int((m_snapPosition - m_minValue) / m_step);
+ break;
+ }
+ }
+}
+
+void
+Rotary::mousePressEvent(QMouseEvent *e)
+{
+ if (e->button() == LeftButton) {
+ m_buttonPressed = true;
+ m_lastY = e->y();
+ m_lastX = e->x();
+ } else if (e->button() == MidButton) // reset to default
+ {
+ m_position = m_initialPosition;
+ snapPosition();
+ update();
+ emit valueChanged(m_snapPosition);
+ } else if (e->button() == RightButton) // reset to centre position
+ {
+ m_position = (m_maxValue + m_minValue) / 2.0;
+ snapPosition();
+ update();
+ emit valueChanged(m_snapPosition);
+ }
+
+ QPoint totalPos = mapTo(topLevelWidget(), QPoint(0, 0));
+
+ if (!_float)
+ _float = new TextFloat(this);
+ _float->reparent(this);
+ _float->move(totalPos + QPoint(width() + 2, -height() / 2));
+ if (m_logarithmic) {
+ _float->setText(QString("%1").arg(powf(10, m_position)));
+ } else {
+ _float->setText(QString("%1").arg(m_position));
+ }
+ _float->show();
+
+// std::cerr << "Rotary::mousePressEvent: logarithmic = " << m_logarithmic
+// << ", position = " << m_position << std::endl;
+
+ if (e->button() == RightButton || e->button() == MidButton) {
+ // one shot, 500ms
+ _floatTimer->start(500, true);
+ }
+}
+
+void
+Rotary::mouseDoubleClickEvent(QMouseEvent * /*e*/)
+{
+ float minv = m_minValue;
+ float maxv = m_maxValue;
+ float val = m_position;
+ float step = m_step;
+
+ if (m_logarithmic) {
+ minv = powf(10, minv);
+ maxv = powf(10, maxv);
+ val = powf(10, val);
+ step = powf(10, step);
+ if (step > 0.001) step = 0.001;
+ }
+
+ FloatEdit dialog(this,
+ i18n("Select a new value"),
+ i18n("Enter a new value"),
+ minv,
+ maxv,
+ val,
+ step);
+
+ if (dialog.exec() == QDialog::Accepted) {
+ float newval = dialog.getValue();
+ if (m_logarithmic) {
+ if (m_position < powf(10, -10)) m_position = -10;
+ else m_position = log10f(newval);
+ } else {
+ m_position = newval;
+ }
+ snapPosition();
+ update();
+
+ emit valueChanged(m_snapPosition);
+ }
+}
+
+void
+Rotary::mouseReleaseEvent(QMouseEvent *e)
+{
+ if (e->button() == LeftButton) {
+ m_buttonPressed = false;
+ m_lastY = 0;
+ m_lastX = 0;
+
+ // Hide the float text
+ //
+ if (_float)
+ _float->hide();
+ }
+}
+
+void
+Rotary::mouseMoveEvent(QMouseEvent *e)
+{
+ if (m_buttonPressed) {
+ // Dragging by x or y axis when clicked modifies value
+ //
+ float newValue = m_position +
+ (m_lastY - float(e->y()) + float(e->x()) - m_lastX) * m_step;
+
+ if (newValue > m_maxValue)
+ m_position = m_maxValue;
+ else
+ if (newValue < m_minValue)
+ m_position = m_minValue;
+ else
+ m_position = newValue;
+
+ m_lastY = e->y();
+ m_lastX = e->x();
+
+ snapPosition();
+
+ // don't update if there's nothing to update
+ // if (m_lastPosition == m_snapPosition) return;
+
+ update();
+
+ emit valueChanged(m_snapPosition);
+
+ // draw on the float text
+ if (m_logarithmic) {
+ _float->setText(QString("%1").arg(powf(10, m_snapPosition)));
+ } else {
+ _float->setText(QString("%1").arg(m_snapPosition));
+ }
+ }
+}
+
+void
+Rotary::wheelEvent(QWheelEvent *e)
+{
+ if (e->delta() > 0)
+ m_position -= m_pageStep;
+ else
+ m_position += m_pageStep;
+
+ if (m_position > m_maxValue)
+ m_position = m_maxValue;
+
+ if (m_position < m_minValue)
+ m_position = m_minValue;
+
+ snapPosition();
+ update();
+
+ if (!_float)
+ _float = new TextFloat(this);
+
+ // draw on the float text
+ if (m_logarithmic) {
+ _float->setText(QString("%1").arg(powf(10, m_snapPosition)));
+ } else {
+ _float->setText(QString("%1").arg(m_snapPosition));
+ }
+
+ // Reposition - we need to sum the relative positions up to the
+ // topLevel or dialog to please move(). Move just top/right of the rotary
+ //
+ QPoint totalPos = mapTo(topLevelWidget(), QPoint(0, 0));
+ _float->reparent(this);
+ _float->move(totalPos + QPoint(width() + 2, -height() / 2));
+ _float->show();
+
+ // one shot, 500ms
+ _floatTimer->start(500, true);
+
+ // set it to show for a timeout value
+ emit valueChanged(m_snapPosition);
+}
+
+void
+Rotary::setPosition(float position)
+{
+ m_position = position;
+
+ snapPosition();
+ update();
+}
+
+}
+#include "Rotary.moc"
diff --git a/src/gui/widgets/Rotary.h b/src/gui/widgets/Rotary.h
new file mode 100644
index 0000000..2efacf9
--- /dev/null
+++ b/src/gui/widgets/Rotary.h
@@ -0,0 +1,167 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_ROSEGARDENROTARY_H_
+#define _RG_ROSEGARDENROTARY_H_
+
+#include <map>
+#include <qcolor.h>
+#include <qwidget.h>
+
+
+class QWheelEvent;
+class QPaintEvent;
+class QPainter;
+class QMouseEvent;
+
+
+namespace Rosegarden
+{
+
+
+
+class Rotary : public QWidget
+{
+ Q_OBJECT
+public:
+
+ enum TickMode {
+ NoTicks, // plain circle with no marks for end points etc
+ LimitTicks, // marks at end points but not any intermediate points
+ IntervalTicks, // end points plus quarter, half, three-quarters
+ PageStepTicks, // end points plus every page-step interval
+ StepTicks // end points plus every step interval
+ };
+
+ Rotary(QWidget *parent,
+ float minValue = 0.0,
+ float maxValue = 100.0,
+ float step = 1.0,
+ float pageStep = 10.0,
+ float initialPosition = 50.0,
+ int size = 20,
+ TickMode ticks = NoTicks,
+ bool snapToTicks = false,
+ bool centred = false,
+ bool logarithmic = false); // extents are logs, exp for display
+ ~Rotary();
+
+ void setMinValue(float min) { m_minValue = min; }
+ float getMinValue() const { return m_minValue; }
+
+ void setMaxValue(float max) { m_maxValue = max; }
+ float getMaxValue() const { return m_maxValue; }
+
+ void setStep(float step) { m_step = step; }
+ float getStep() const { return m_step; }
+
+ void setPageStep(float step) { m_pageStep = step; }
+ float getPageStep() const { return m_pageStep; }
+
+ int getSize() const { return m_size; }
+
+ // Position
+ //
+ float getPosition() const { return m_position; }
+ void setPosition(float position);
+
+ // Set the colour of the knob
+ //
+ void setKnobColour(const QColor &colour);
+ QColor getKnobColour() const { return m_knobColour; }
+
+signals:
+ void valueChanged(float);
+
+protected slots:
+ void slotFloatTimeout();
+
+protected:
+ virtual void paintEvent(QPaintEvent *e);
+ virtual void mousePressEvent(QMouseEvent *e);
+ virtual void mouseReleaseEvent(QMouseEvent *e);
+ virtual void mouseMoveEvent(QMouseEvent *e);
+ virtual void mouseDoubleClickEvent(QMouseEvent *e);
+ virtual void wheelEvent(QWheelEvent *e);
+
+ void snapPosition();
+ void drawPosition();
+ void drawTick(QPainter &paint, double angle, int size, bool internal);
+
+ float m_minValue;
+ float m_maxValue;
+ float m_step;
+ float m_pageStep;
+ int m_size;
+ TickMode m_tickMode;
+ bool m_snapToTicks;
+ bool m_centred;
+ bool m_logarithmic;
+
+ float m_position;
+ float m_snapPosition;
+ float m_initialPosition;
+ bool m_buttonPressed;
+ int m_lastY;
+ int m_lastX;
+
+ QColor m_knobColour;
+
+ struct CacheIndex {
+
+ CacheIndex(int _s, int _c, int _a, int _n, int _ct) :
+ size(_s), colour(_c), angle(_a), numTicks(_n), centred(_ct) { }
+
+ bool operator<(const CacheIndex &i) const {
+ // woo!
+ if (size < i.size) return true;
+ else if (size > i.size) return false;
+ else if (colour < i.colour) return true;
+ else if (colour > i.colour) return false;
+ else if (angle < i.angle) return true;
+ else if (angle > i.angle) return false;
+ else if (numTicks < i.numTicks) return true;
+ else if (numTicks > i.numTicks) return false;
+ else if (centred == i.centred) return false;
+ else if (!centred) return true;
+ return false;
+ }
+
+ int size;
+ unsigned int colour;
+ int angle;
+ int numTicks;
+ bool centred;
+ };
+
+ typedef std::map<CacheIndex, QPixmap> PixmapCache;
+ static PixmapCache m_pixmaps;
+};
+
+
+
+}
+
+#endif
diff --git a/src/gui/widgets/ScrollBox.cpp b/src/gui/widgets/ScrollBox.cpp
new file mode 100644
index 0000000..b409209
--- /dev/null
+++ b/src/gui/widgets/ScrollBox.cpp
@@ -0,0 +1,159 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ This file is based on code from KGhostView, Copyright 1997-2002
+ Markkhu Hihnala <[email protected]>
+ and the KGhostView authors.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "ScrollBox.h"
+
+#include <qapplication.h>
+#include <qframe.h>
+#include <qimage.h>
+#include <qpainter.h>
+#include <qpixmap.h>
+#include <qpoint.h>
+#include <qrect.h>
+#include <qsize.h>
+#include <qwidget.h>
+
+
+namespace Rosegarden
+{
+
+ScrollBox::ScrollBox(QWidget* parent, SizeMode sizeMode, const char* name) :
+ QFrame(parent, name),
+ m_sizeMode(sizeMode)
+{
+ setFrameStyle(Panel | Sunken);
+}
+
+void ScrollBox::mousePressEvent(QMouseEvent* e)
+{
+ m_mouse = e->pos();
+ if (e->button() == RightButton)
+ emit button3Pressed();
+ if (e->button() == MidButton)
+ emit button2Pressed();
+}
+
+void ScrollBox::mouseMoveEvent(QMouseEvent* e)
+{
+ if (e->state() != LeftButton)
+ return ;
+
+ int dx = (e->pos().x() - m_mouse.x()) * m_pagesize.width() / width();
+ int dy = (e->pos().y() - m_mouse.y()) * m_pagesize.height() / height();
+
+ emit valueChanged(QPoint(m_viewpos.x() + dx, m_viewpos.y() + dy));
+ emit valueChangedRelative(dx, dy);
+
+ m_mouse = e->pos();
+}
+
+void ScrollBox::drawContents(QPainter* paint)
+{
+ if (m_pagesize.isEmpty())
+ return ;
+
+ QRect c(contentsRect());
+
+ paint->setPen(Qt::red);
+
+ int len = m_pagesize.width();
+ int x = c.x() + c.width() * m_viewpos.x() / len;
+ int w = c.width() * m_viewsize.width() / len ;
+ if (w > c.width())
+ w = c.width();
+
+ len = m_pagesize.height();
+ int y = c.y() + c.height() * m_viewpos.y() / len;
+ int h = c.height() * m_viewsize.height() / len;
+ if (h > c.height())
+ h = c.height();
+
+ paint->drawRect(x, y, w, h);
+}
+
+void ScrollBox::setPageSize(const QSize& s)
+{
+ m_pagesize = s;
+
+ setFixedWidth(100);
+ setFixedHeight(100);
+
+ int maxWidth = int(QApplication::desktop()->width() * 0.75);
+ int maxHeight = int(QApplication::desktop()->height() * 0.75);
+
+ if (m_sizeMode == FixWidth) {
+ int height = s.height() * width() / s.width();
+ if (height > maxHeight) {
+ setFixedWidth(width() * maxHeight / height);
+ height = maxHeight;
+ }
+ setFixedHeight(height);
+ } else {
+ int width = s.width() * height() / s.height();
+ if (width > maxWidth) {
+ setFixedHeight(height() * maxWidth / width);
+ width = maxWidth;
+ }
+ setFixedWidth(width);
+ }
+
+ repaint();
+}
+
+void ScrollBox::setViewSize(const QSize& s)
+{
+ m_viewsize = s;
+ repaint();
+}
+
+void ScrollBox::setViewPos(const QPoint& pos)
+{
+ m_viewpos = pos;
+ repaint();
+}
+
+void ScrollBox::setViewX(int x)
+{
+ m_viewpos = QPoint(x, m_viewpos.y());
+ repaint();
+}
+
+void ScrollBox::setViewY(int y)
+{
+ m_viewpos = QPoint(m_viewpos.x(), y);
+ repaint();
+}
+
+void ScrollBox::setThumbnail(QPixmap img)
+{
+ setPaletteBackgroundPixmap(img.convertToImage().smoothScale(size()));
+}
+
+}
+#include "ScrollBox.moc"
diff --git a/src/gui/widgets/ScrollBox.h b/src/gui/widgets/ScrollBox.h
new file mode 100644
index 0000000..3f8140e
--- /dev/null
+++ b/src/gui/widgets/ScrollBox.h
@@ -0,0 +1,89 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ This file is based on code from KGhostView, Copyright 1997-2002
+ Markkhu Hihnala <[email protected]>
+ and the KGhostView authors.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_SCROLLBOX_H_
+#define _RG_SCROLLBOX_H_
+
+#include <qframe.h>
+#include <qpixmap.h>
+#include <qpoint.h>
+#include <qsize.h>
+
+
+class QWidget;
+class QPainter;
+class QMouseEvent;
+
+
+namespace Rosegarden
+{
+
+class ScrollBox: public QFrame
+{
+ Q_OBJECT
+
+public:
+ enum SizeMode { FixWidth, FixHeight };
+
+ ScrollBox(QWidget *parent = 0,
+ SizeMode mode = FixWidth,
+ const char *name = 0);
+
+public slots:
+ void setPageSize(const QSize&);
+ void setViewSize(const QSize&);
+ void setViewPos(const QPoint&);
+ void setViewPos(int x, int y) { setViewPos(QPoint(x, y)); }
+ void setViewX(int x);
+ void setViewY(int y);
+ void setThumbnail(QPixmap img);
+
+signals:
+ void valueChanged(const QPoint&);
+ void valueChangedRelative(int dx, int dy);
+ void button2Pressed();
+ void button3Pressed();
+
+protected:
+ void mousePressEvent(QMouseEvent *);
+ void mouseMoveEvent(QMouseEvent *);
+ void drawContents(QPainter *);
+
+private:
+ QPoint m_viewpos;
+ QPoint m_mouse;
+ QSize m_pagesize;
+ QSize m_viewsize;
+ SizeMode m_sizeMode;
+};
+
+
+}
+
+#endif
diff --git a/src/gui/widgets/ScrollBoxDialog.cpp b/src/gui/widgets/ScrollBoxDialog.cpp
new file mode 100644
index 0000000..e442985
--- /dev/null
+++ b/src/gui/widgets/ScrollBoxDialog.cpp
@@ -0,0 +1,68 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "ScrollBoxDialog.h"
+
+#include "ScrollBox.h"
+#include <kdialog.h>
+#include <qframe.h>
+#include <qpainter.h>
+#include <qpixmap.h>
+#include <qpoint.h>
+#include <qsize.h>
+#include <qwidget.h>
+
+
+namespace Rosegarden
+{
+
+ScrollBoxDialog::ScrollBoxDialog(QWidget *parent,
+ ScrollBox::SizeMode sizeMode,
+ const char *name,
+ WFlags flags) :
+ KDialog(parent, name, flags),
+ m_scrollbox(new ScrollBox(this, sizeMode))
+{ }
+
+
+ScrollBoxDialog::~ScrollBoxDialog()
+{ }
+
+
+void ScrollBoxDialog::closeEvent(QCloseEvent *e)
+{
+ e->accept();
+ emit closed();
+}
+
+void ScrollBoxDialog::setPageSize(const QSize& s)
+{
+ m_scrollbox->setPageSize(s);
+ setFixedHeight(m_scrollbox->height());
+ setFixedWidth(m_scrollbox->width());
+}
+
+}
+#include "ScrollBoxDialog.moc"
diff --git a/src/gui/widgets/ScrollBoxDialog.h b/src/gui/widgets/ScrollBoxDialog.h
new file mode 100644
index 0000000..8da1771
--- /dev/null
+++ b/src/gui/widgets/ScrollBoxDialog.h
@@ -0,0 +1,71 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_SCROLLBOXDIALOG_H_
+#define _RG_SCROLLBOXDIALOG_H_
+
+#include "ScrollBox.h"
+#include <kdialog.h>
+
+
+class QWidget;
+class QSize;
+class QCloseEvent;
+
+
+namespace Rosegarden
+{
+
+
+
+class ScrollBoxDialog : public KDialog
+{
+ Q_OBJECT
+
+public:
+ ScrollBoxDialog(QWidget *parent = 0,
+ ScrollBox::SizeMode mode = ScrollBox::FixWidth,
+ const char *name = 0,
+ WFlags flags = 0);
+ ~ScrollBoxDialog();
+
+ ScrollBox *scrollbox() { return m_scrollbox; }
+ void setPageSize(const QSize&);
+
+protected:
+ virtual void closeEvent(QCloseEvent * e);
+
+signals:
+ void closed();
+
+private:
+ ScrollBox *m_scrollbox;
+};
+
+
+
+}
+
+#endif
diff --git a/src/gui/widgets/SpinBox.cpp b/src/gui/widgets/SpinBox.cpp
new file mode 100644
index 0000000..10963c8
--- /dev/null
+++ b/src/gui/widgets/SpinBox.cpp
@@ -0,0 +1,73 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "SpinBox.h"
+#include "misc/Strings.h"
+
+#include <qspinbox.h>
+#include <qstring.h>
+#include <qwidget.h>
+
+
+namespace Rosegarden
+{
+
+SpinBox::SpinBox(QWidget *parent, const char *name):
+ QSpinBox(parent, name), m_doubleValue(0)
+{}
+
+QString
+SpinBox::mapValueToText(int value)
+{
+ QString doubleStr;
+
+ // Assume we want to show the precision
+ //
+ if ((int)m_doubleValue != value)
+ m_doubleValue = (double) value;
+
+ doubleStr.sprintf("%4.6f", m_doubleValue);
+
+ // clear any special value
+ //setSpecialValueText("");
+
+ return doubleStr;
+}
+
+int
+SpinBox::mapTextToValue(bool * /*ok*/)
+{
+ double number = qstrtodouble(text());
+
+ if (number) {
+ m_doubleValue = number;
+ return ((int)number);
+ }
+
+ return 120; // default
+}
+
+}
+#include "SpinBox.moc"
diff --git a/src/gui/widgets/SpinBox.h b/src/gui/widgets/SpinBox.h
new file mode 100644
index 0000000..a0dfffe
--- /dev/null
+++ b/src/gui/widgets/SpinBox.h
@@ -0,0 +1,65 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_ROSEGARDENSPINBOX_H_
+#define _RG_ROSEGARDENSPINBOX_H_
+
+#include <qspinbox.h>
+#include <qstring.h>
+
+
+class QWidget;
+
+
+namespace Rosegarden
+{
+
+
+
+/**
+ * A Combobox that just about handles doubles - you have
+ * to set the precision outside of this class if you're
+ * using it with Qt designer. Urch.
+ */
+class SpinBox : public QSpinBox
+{
+ Q_OBJECT
+public:
+ SpinBox(QWidget *parent = 0, const char *name=0);
+
+ double getDoubleValue() const { return m_doubleValue; }
+
+protected:
+ virtual QString mapValueToText (int value);
+ virtual int mapTextToValue(bool *ok);
+
+ double m_doubleValue;
+};
+
+
+
+}
+
+#endif
diff --git a/src/gui/widgets/TextFloat.cpp b/src/gui/widgets/TextFloat.cpp
new file mode 100644
index 0000000..5e3ddbc
--- /dev/null
+++ b/src/gui/widgets/TextFloat.cpp
@@ -0,0 +1,112 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "TextFloat.h"
+#include <kapplication.h>
+
+#include "gui/general/GUIPalette.h"
+#include <qfontmetrics.h>
+#include <qpainter.h>
+#include <qpalette.h>
+#include <qpoint.h>
+#include <qrect.h>
+#include <qstring.h>
+#include <qwidget.h>
+
+
+namespace Rosegarden
+{
+
+TextFloat::TextFloat(QWidget *parent):
+ QWidget(parent, "TextFloat",
+ WStyle_Customize | WStyle_NoBorder | WStyle_StaysOnTop),
+ m_text("")
+{
+ reparent(parentWidget());
+ resize(20, 20);
+}
+
+void
+TextFloat::reparent(QWidget *newParent)
+{
+ QPoint position = newParent->pos();
+
+ // Get position and reparent to either top level or dialog
+ //
+ while (newParent->parentWidget() && !newParent->isTopLevel()
+ && !newParent->isDialog()) {
+ newParent = newParent->parentWidget();
+ position += newParent->pos();
+ }
+
+ // Position this widget to the right of the parent
+ //
+ //move(pos + QPoint(parent->width() + 5, 5));
+
+ QWidget::reparent(newParent,
+ WStyle_Customize | WStyle_NoBorder | WStyle_StaysOnTop,
+ position + QPoint(20, 5));
+}
+
+void
+TextFloat::paintEvent(QPaintEvent *e)
+{
+ QPainter paint(this);
+
+ paint.setClipRegion(e->region());
+ paint.setClipRect(e->rect().normalize());
+
+ paint.setPen(kapp->palette().color(QPalette::Active, QColorGroup::Dark));
+
+ paint.setPen(GUIPalette::getColour(GUIPalette::RotaryFloatForeground));
+ paint.setBrush(GUIPalette::getColour(GUIPalette::RotaryFloatBackground));
+
+ QFontMetrics metrics(paint.fontMetrics());
+
+ QRect r = metrics.boundingRect(0, 0, 400, 400, Qt::AlignAuto, m_text);
+ resize(r.width() + 7, r.height() + 7);
+ paint.drawRect(0, 0, r.width() + 6, r.height() + 6);
+ paint.setPen(Qt::black);
+ paint.drawText(QRect(3, 3, r.width(), r.height()), Qt::AlignAuto, m_text);
+
+ /*
+ QRect textBound = metrics.boundingRect(m_text);
+
+ resize(textBound.width() + 7, textBound.height() + 7);
+ paint.drawRect(0, 0, textBound.width() + 6, textBound.height() + 6);
+
+ paint.setPen(Qt::black);
+ paint.drawText(3, textBound.height() + 3, m_text);
+ */
+}
+
+void
+TextFloat::setText(const QString &text)
+{
+ m_text = text;
+ repaint();
+}
+
+}
diff --git a/src/gui/widgets/TextFloat.h b/src/gui/widgets/TextFloat.h
new file mode 100644
index 0000000..d604a83
--- /dev/null
+++ b/src/gui/widgets/TextFloat.h
@@ -0,0 +1,64 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_ROSEGARDENTEXTFLOAT_H_
+#define _RG_ROSEGARDENTEXTFLOAT_H_
+
+#include <qstring.h>
+#include <qwidget.h>
+
+
+class QPaintEvent;
+
+
+namespace Rosegarden
+{
+
+
+
+class TextFloat : public QWidget
+{
+public:
+ TextFloat(QWidget *parent);
+ virtual ~TextFloat() {;}
+
+ void setText(const QString &text);
+
+ // Reparent the float correctly by context
+ //
+ void reparent(QWidget *newParent);
+
+protected:
+ virtual void paintEvent(QPaintEvent *e);
+
+ QString m_text;
+};
+
+
+
+
+}
+
+#endif
diff --git a/src/gui/widgets/TimeWidget.cpp b/src/gui/widgets/TimeWidget.cpp
new file mode 100644
index 0000000..b9bad6f
--- /dev/null
+++ b/src/gui/widgets/TimeWidget.cpp
@@ -0,0 +1,668 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "TimeWidget.h"
+#include <qlayout.h>
+
+#include <klocale.h>
+#include "misc/Debug.h"
+#include "base/Composition.h"
+#include "base/NotationTypes.h"
+#include "base/RealTime.h"
+#include "gui/editors/notation/NotationStrings.h"
+#include "gui/editors/notation/NotePixmapFactory.h"
+#include <qcombobox.h>
+#include <qframe.h>
+#include <qgroupbox.h>
+#include <qlabel.h>
+#include <qlineedit.h>
+#include <qpixmap.h>
+#include <qspinbox.h>
+#include <qstring.h>
+#include <qwidget.h>
+
+
+namespace Rosegarden
+{
+
+TimeWidget::TimeWidget(QString title,
+ QWidget *parent,
+ Composition *composition,
+ timeT absTime,
+ bool editable,
+ bool constrainToCompositionDuration) :
+ QGroupBox(1, Horizontal, title, parent),
+ m_composition(composition),
+ m_isDuration(false),
+ m_constrain(constrainToCompositionDuration),
+ m_time(absTime),
+ m_startTime(0),
+ m_defaultTime(absTime)
+{
+ init(editable);
+}
+
+TimeWidget::TimeWidget(QString title,
+ QWidget *parent,
+ Composition *composition,
+ timeT startTime,
+ timeT duration,
+ bool editable,
+ bool constrainToCompositionDuration) :
+ QGroupBox(1, Horizontal, title, parent),
+ m_composition(composition),
+ m_isDuration(true),
+ m_constrain(constrainToCompositionDuration),
+ m_time(duration),
+ m_startTime(startTime),
+ m_defaultTime(duration)
+{
+ init(editable);
+}
+
+void
+TimeWidget::init(bool editable)
+{
+ int denoms[] = {
+ 1, 2, 3, 4, 6, 8, 12, 16, 24, 32, 48, 64, 96, 128
+ };
+
+ bool savedEditable = editable;
+ editable = true;
+
+ QFrame *frame = new QFrame(this);
+ QGridLayout *layout = new QGridLayout(frame, 7, 3, 5, 5);
+ QLabel *label = 0;
+
+ if (m_isDuration) {
+
+ label = new QLabel(i18n("Note:"), frame);
+ label->setAlignment(Qt::AlignRight | Qt::AlignVCenter);
+ layout->addWidget(label, 0, 0);
+
+ if (editable) {
+ m_note = new QComboBox(frame);
+ m_noteDurations.push_back(0);
+ m_note->insertItem(i18n("<inexact>"));
+ for (size_t i = 0; i < sizeof(denoms) / sizeof(denoms[0]); ++i) {
+
+ timeT duration =
+ Note(Note::Breve).getDuration() / denoms[i];
+
+ if (denoms[i] > 1 && denoms[i] < 128 && (denoms[i] % 3) != 0) {
+ // not breve or hemidemi, not a triplet
+ timeT dottedDuration = duration * 3 / 2;
+ m_noteDurations.push_back(dottedDuration);
+ timeT error = 0;
+ QString label = NotationStrings::makeNoteMenuLabel
+ (dottedDuration, false, error);
+ QPixmap pmap = NotePixmapFactory::toQPixmap
+ (NotePixmapFactory::makeNoteMenuPixmap(dottedDuration, error));
+ m_note->insertItem(pmap, label); // ignore error
+ }
+
+ m_noteDurations.push_back(duration);
+ timeT error = 0;
+ QString label = NotationStrings::makeNoteMenuLabel
+ (duration, false, error);
+ QPixmap pmap = NotePixmapFactory::toQPixmap
+ (NotePixmapFactory::makeNoteMenuPixmap(duration, error));
+ m_note->insertItem(pmap, label); // ignore error
+ }
+ connect(m_note, SIGNAL(activated(int)),
+ this, SLOT(slotNoteChanged(int)));
+ layout->addMultiCellWidget(m_note, 0, 0, 1, 3);
+
+ } else {
+
+ m_note = 0;
+ timeT error = 0;
+ QString label = NotationStrings::makeNoteMenuLabel
+ (m_time, false, error);
+ if (error != 0)
+ label = i18n("<inexact>");
+ QLineEdit *le = new QLineEdit(label, frame);
+ le->setReadOnly(true);
+ layout->addMultiCellWidget(le, 0, 0, 1, 3);
+ }
+
+ label = new QLabel(i18n("Units:"), frame);
+ label->setAlignment(Qt::AlignRight | Qt::AlignVCenter);
+ layout->addWidget(label, 0, 4);
+
+ if (editable) {
+ m_timeT = new QSpinBox(frame);
+ m_timeT->setLineStep
+ (Note(Note::Shortest).getDuration());
+ connect(m_timeT, SIGNAL(valueChanged(int)),
+ this, SLOT(slotTimeTChanged(int)));
+ layout->addWidget(m_timeT, 0, 5);
+ } else {
+ m_timeT = 0;
+ QLineEdit *le = new QLineEdit(QString("%1").arg(m_time), frame);
+ le->setReadOnly(true);
+ layout->addWidget(le, 0, 5);
+ }
+
+ } else {
+
+ m_note = 0;
+
+ label = new QLabel(i18n("Time:"), frame);
+ label->setAlignment(Qt::AlignRight | Qt::AlignVCenter);
+ layout->addWidget(label, 0, 0);
+
+ if (editable) {
+ m_timeT = new QSpinBox(frame);
+ m_timeT->setLineStep
+ (Note(Note::Shortest).getDuration());
+ connect(m_timeT, SIGNAL(valueChanged(int)),
+ this, SLOT(slotTimeTChanged(int)));
+ layout->addWidget(m_timeT, 0, 1);
+ layout->addWidget(new QLabel(i18n("units"), frame), 0, 2);
+ } else {
+ m_timeT = 0;
+ QLineEdit *le = new QLineEdit(QString("%1").arg(m_time), frame);
+ le->setReadOnly(true);
+ layout->addWidget(le, 0, 2);
+ }
+ }
+
+ label = new QLabel(m_isDuration ? i18n("Measures:") : i18n("Measure:"), frame);
+ label->setAlignment(Qt::AlignRight | Qt::AlignVCenter);
+ layout->addWidget(label, 1, 0);
+
+ if (editable) {
+ m_barLabel = 0;
+ m_bar = new QSpinBox(frame);
+ if (m_isDuration)
+ m_bar->setMinValue(0);
+ connect(m_bar, SIGNAL(valueChanged(int)),
+ this, SLOT(slotBarBeatOrFractionChanged(int)));
+ layout->addWidget(m_bar, 1, 1);
+ } else {
+ m_bar = 0;
+ m_barLabel = new QLineEdit(frame);
+ m_barLabel->setReadOnly(true);
+ layout->addWidget(m_barLabel, 1, 1);
+ }
+
+ label = new QLabel(m_isDuration ? i18n("beats:") : i18n("beat:"), frame);
+ label->setAlignment(Qt::AlignRight | Qt::AlignVCenter);
+ layout->addWidget(label, 1, 2);
+
+ if (editable) {
+ m_beatLabel = 0;
+ m_beat = new QSpinBox(frame);
+ m_beat->setMinValue(1);
+ connect(m_beat, SIGNAL(valueChanged(int)),
+ this, SLOT(slotBarBeatOrFractionChanged(int)));
+ layout->addWidget(m_beat, 1, 3);
+ } else {
+ m_beat = 0;
+ m_beatLabel = new QLineEdit(frame);
+ m_beatLabel->setReadOnly(true);
+ layout->addWidget(m_beatLabel, 1, 3);
+ }
+
+ label = new QLabel(i18n("%1:").arg(NotationStrings::getShortNoteName
+ (Note
+ (Note::Shortest), true)),
+ frame);
+ label->setAlignment(Qt::AlignRight | Qt::AlignVCenter);
+ layout->addWidget(label, 1, 4);
+
+ if (editable) {
+ m_fractionLabel = 0;
+ m_fraction = new QSpinBox(frame);
+ m_fraction->setMinValue(1);
+ connect(m_fraction, SIGNAL(valueChanged(int)),
+ this, SLOT(slotBarBeatOrFractionChanged(int)));
+ layout->addWidget(m_fraction, 1, 5);
+ } else {
+ m_fraction = 0;
+ m_fractionLabel = new QLineEdit(frame);
+ m_fractionLabel->setReadOnly(true);
+ layout->addWidget(m_fractionLabel, 1, 5);
+ }
+
+ m_timeSig = new QLabel(frame);
+ layout->addWidget(m_timeSig, 1, 6);
+
+ label = new QLabel(i18n("Seconds:"), frame);
+ label->setAlignment(Qt::AlignRight | Qt::AlignVCenter);
+ layout->addWidget(label, 2, 0);
+
+ if (editable) {
+ m_secLabel = 0;
+ m_sec = new QSpinBox(frame);
+ if (m_isDuration)
+ m_sec->setMinValue(0);
+ connect(m_sec, SIGNAL(valueChanged(int)),
+ this, SLOT(slotSecOrMSecChanged(int)));
+ layout->addWidget(m_sec, 2, 1);
+ } else {
+ m_sec = 0;
+ m_secLabel = new QLineEdit(frame);
+ m_secLabel->setReadOnly(true);
+ layout->addWidget(m_secLabel, 2, 1);
+ }
+
+ label = new QLabel(i18n("msec:"), frame);
+ label->setAlignment(Qt::AlignRight | Qt::AlignVCenter);
+ layout->addWidget(label, 2, 2);
+
+ if (editable) {
+ m_msecLabel = 0;
+ m_msec = new QSpinBox(frame);
+ m_msec->setMinValue(0);
+ m_msec->setLineStep(10);
+ connect(m_msec, SIGNAL(valueChanged(int)),
+ this, SLOT(slotSecOrMSecChanged(int)));
+ layout->addWidget(m_msec, 2, 3);
+ } else {
+ m_msec = 0;
+ m_msecLabel = new QLineEdit(frame);
+ m_msecLabel->setReadOnly(true);
+ layout->addWidget(m_msecLabel, 2, 3);
+ }
+
+ if (m_isDuration) {
+ m_tempo = new QLabel(frame);
+ layout->addWidget(m_tempo, 2, 6);
+ } else {
+ m_tempo = 0;
+ }
+
+ if (!savedEditable) {
+ if (m_note)
+ m_note ->setEnabled(false);
+ if (m_timeT)
+ m_timeT ->setEnabled(false);
+ if (m_bar)
+ m_bar ->setEnabled(false);
+ if (m_beat)
+ m_beat ->setEnabled(false);
+ if (m_fraction)
+ m_fraction ->setEnabled(false);
+ if (m_sec)
+ m_sec ->setEnabled(false);
+ if (m_msec)
+ m_msec ->setEnabled(false);
+ }
+
+ populate();
+}
+
+void
+TimeWidget::populate()
+{
+ // populate everything from m_time and m_startTime
+
+ if (m_note)
+ m_note ->blockSignals(true);
+ if (m_timeT)
+ m_timeT ->blockSignals(true);
+ if (m_bar)
+ m_bar ->blockSignals(true);
+ if (m_beat)
+ m_beat ->blockSignals(true);
+ if (m_fraction)
+ m_fraction ->blockSignals(true);
+ if (m_sec)
+ m_sec ->blockSignals(true);
+ if (m_msec)
+ m_msec ->blockSignals(true);
+
+ if (m_isDuration) {
+
+ if (m_time + m_startTime > m_composition->getEndMarker()) {
+ m_time = m_composition->getEndMarker() - m_startTime;
+ }
+
+ if (m_timeT) {
+ m_timeT->setMinValue(0);
+ if (m_constrain) {
+ m_timeT->setMaxValue(m_composition->getEndMarker() - m_startTime);
+ } else {
+ m_timeT->setMaxValue(INT_MAX);
+ }
+ m_timeT->setValue(m_time);
+ }
+
+ if (m_note) {
+ m_note->setCurrentItem(0);
+ for (size_t i = 0; i < m_noteDurations.size(); ++i) {
+ if (m_time == m_noteDurations[i]) {
+ m_note->setCurrentItem(i);
+ break;
+ }
+ }
+ }
+
+ // the bar/beat etc timings are considered to be times of a note
+ // starting at the start of a bar, in the time signature in effect
+ // at m_startTime
+
+ int bars = 0, beats = 0, hemidemis = 0, remainder = 0;
+ m_composition->getMusicalTimeForDuration(m_startTime, m_time,
+ bars, beats, hemidemis, remainder);
+ TimeSignature timeSig =
+ m_composition->getTimeSignatureAt(m_startTime);
+
+ if (m_bar) {
+ m_bar->setMinValue(0);
+ if (m_constrain) {
+ m_bar->setMaxValue
+ (m_composition->getBarNumber(m_composition->getEndMarker()) -
+ m_composition->getBarNumber(m_startTime));
+ } else {
+ m_bar->setMaxValue(9999);
+ }
+ m_bar->setValue(bars);
+ } else {
+ m_barLabel->setText(QString("%1").arg(bars));
+ }
+
+ if (m_beat) {
+ m_beat->setMinValue(0);
+ m_beat->setMaxValue(timeSig.getBeatsPerBar() - 1);
+ m_beat->setValue(beats);
+ } else {
+ m_beatLabel->setText(QString("%1").arg(beats));
+ }
+
+ if (m_fraction) {
+ m_fraction->setMinValue(0);
+ m_fraction->setMaxValue(timeSig.getBeatDuration() /
+ Note(Note::Shortest).
+ getDuration() - 1);
+ m_fraction->setValue(hemidemis);
+ } else {
+ m_fractionLabel->setText(QString("%1").arg(hemidemis));
+ }
+
+ m_timeSig->setText(i18n("(%1/%2 time)").arg(timeSig.getNumerator()).
+ arg(timeSig.getDenominator()));
+
+ timeT endTime = m_startTime + m_time;
+
+ RealTime rt = m_composition->getRealTimeDifference
+ (m_startTime, endTime);
+
+ if (m_sec) {
+ m_sec->setMinValue(0);
+ if (m_constrain) {
+ m_sec->setMaxValue(m_composition->getRealTimeDifference
+ (m_startTime, m_composition->getEndMarker()).sec);
+ } else {
+ m_sec->setMaxValue(9999);
+ }
+ m_sec->setValue(rt.sec);
+ } else {
+ m_secLabel->setText(QString("%1").arg(rt.sec));
+ }
+
+ if (m_msec) {
+ m_msec->setMinValue(0);
+ m_msec->setMaxValue(999);
+ m_msec->setValue(rt.msec());
+ } else {
+ m_msecLabel->setText(QString("%1").arg(rt.msec()));
+ }
+
+ bool change = (m_composition->getTempoChangeNumberAt(endTime) !=
+ m_composition->getTempoChangeNumberAt(m_startTime));
+
+ //!!! imprecise -- better to work from tempoT directly
+ double tempo = m_composition->getTempoQpm(m_composition->getTempoAtTime(m_startTime));
+
+ int qpmc = int(tempo * 100.0);
+ int bpmc = qpmc;
+ if (timeSig.getBeatDuration()
+ != Note(Note::Crotchet).getDuration()) {
+ bpmc = int(tempo * 100.0 *
+ Note(Note::Crotchet).getDuration() /
+ timeSig.getBeatDuration());
+ }
+ if (change) {
+ if (bpmc != qpmc) {
+ m_tempo->setText(i18n("(starting %1.%2 qpm, %2.%3 bpm)").
+ arg(qpmc / 100).
+ arg(qpmc % 100).
+ arg(bpmc / 100).
+ arg(bpmc % 100));
+ } else {
+ m_tempo->setText(i18n("(starting %1.%2 bpm)").
+ arg(bpmc / 100).
+ arg(bpmc % 100));
+ }
+ } else {
+ if (bpmc != qpmc) {
+ m_tempo->setText(i18n("(%1.%2 qpm, %2.%3 bpm)").
+ arg(qpmc / 100).
+ arg(qpmc % 100).
+ arg(bpmc / 100).
+ arg(bpmc % 100));
+ } else {
+ m_tempo->setText(i18n("(%1.%2 bpm)").
+ arg(bpmc / 100).
+ arg(bpmc % 100));
+ }
+ }
+
+ } else {
+
+ if (m_time > m_composition->getEndMarker()) {
+ m_time = m_composition->getEndMarker();
+ }
+
+ if (m_timeT) {
+ if (m_constrain) {
+ m_timeT->setMinValue(m_composition->getStartMarker());
+ m_timeT->setMaxValue(m_composition->getEndMarker());
+ } else {
+ m_timeT->setMinValue(INT_MIN);
+ m_timeT->setMaxValue(INT_MAX);
+ }
+ m_timeT->setValue(m_time);
+ }
+
+ int bar = 1, beat = 1, hemidemis = 0, remainder = 0;
+ m_composition->getMusicalTimeForAbsoluteTime
+ (m_time, bar, beat, hemidemis, remainder);
+
+ TimeSignature timeSig =
+ m_composition->getTimeSignatureAt(m_time);
+
+ if (m_bar) {
+ m_bar->setMinValue(INT_MIN);
+ if (m_constrain) {
+ m_bar->setMaxValue(m_composition->getBarNumber
+ (m_composition->getEndMarker()));
+ } else {
+ m_bar->setMaxValue(9999);
+ }
+ m_bar->setValue(bar + 1);
+ } else {
+ m_barLabel->setText(QString("%1").arg(bar + 1));
+ }
+
+ if (m_beat) {
+ m_beat->setMinValue(1);
+ m_beat->setMaxValue(timeSig.getBeatsPerBar());
+ m_beat->setValue(beat);
+ } else {
+ m_beatLabel->setText(QString("%1").arg(beat));
+ }
+
+ if (m_fraction) {
+ m_fraction->setMinValue(0);
+ m_fraction->setMaxValue(timeSig.getBeatDuration() /
+ Note(Note::Shortest).
+ getDuration() - 1);
+ m_fraction->setValue(hemidemis);
+ } else {
+ m_fractionLabel->setText(QString("%1").arg(hemidemis));
+ }
+
+ m_timeSig->setText(i18n("(%1/%2 time)").arg(timeSig.getNumerator()).
+ arg(timeSig.getDenominator()));
+
+ RealTime rt = m_composition->getElapsedRealTime(m_time);
+
+ if (m_sec) {
+ m_sec->setMinValue(INT_MIN);
+ if (m_constrain) {
+ m_sec->setMaxValue(m_composition->getElapsedRealTime
+ (m_composition->getEndMarker()).sec);
+ } else {
+ m_sec->setMaxValue(9999);
+ }
+ m_sec->setValue(rt.sec);
+ } else {
+ m_secLabel->setText(QString("%1").arg(rt.sec));
+ }
+
+ if (m_msec) {
+ m_msec->setMinValue(0);
+ m_msec->setMaxValue(999);
+ m_msec->setValue(rt.msec());
+ } else {
+ m_msecLabel->setText(QString("%1").arg(rt.msec()));
+ }
+ }
+
+ if (m_note)
+ m_note ->blockSignals(false);
+ if (m_timeT)
+ m_timeT ->blockSignals(false);
+ if (m_bar)
+ m_bar ->blockSignals(false);
+ if (m_beat)
+ m_beat ->blockSignals(false);
+ if (m_fraction)
+ m_fraction ->blockSignals(false);
+ if (m_sec)
+ m_sec ->blockSignals(false);
+ if (m_msec)
+ m_msec ->blockSignals(false);
+}
+
+timeT
+TimeWidget::getTime()
+{
+ return m_time;
+}
+
+RealTime
+TimeWidget::getRealTime()
+{
+ if (m_isDuration) {
+ return m_composition->getRealTimeDifference(m_startTime,
+ m_startTime + m_time);
+ } else {
+ return m_composition->getElapsedRealTime(m_time);
+ }
+}
+
+void
+TimeWidget::slotSetTime(timeT t)
+{
+ bool change = (m_time != t);
+ if (!change)
+ return ;
+ m_time = t;
+ populate();
+ emit timeChanged(getTime());
+ emit realTimeChanged(getRealTime());
+}
+
+void
+TimeWidget::slotSetRealTime(RealTime rt)
+{
+ if (m_isDuration) {
+ RealTime startRT = m_composition->getElapsedRealTime(m_startTime);
+ if (rt >= RealTime::zeroTime) {
+ slotSetTime(m_composition->getElapsedTimeForRealTime(startRT + rt) -
+ m_startTime);
+ } else {
+ RG_DEBUG << "WARNING: TimeWidget::slotSetRealTime: rt must be >0 for duration widget (was " << rt << ")" << endl;
+ }
+ } else {
+ slotSetTime(m_composition->getElapsedTimeForRealTime(rt));
+ }
+}
+
+void
+TimeWidget::slotResetToDefault()
+{
+ slotSetTime(m_defaultTime);
+}
+
+void
+TimeWidget::slotNoteChanged(int n)
+{
+ if (n > 0) {
+ slotSetTime(m_noteDurations[n]);
+ }
+}
+
+void
+TimeWidget::slotTimeTChanged(int t)
+{
+ RG_DEBUG << "slotTimeTChanged: t is " << t << ", value is " << m_timeT->value() << endl;
+
+ slotSetTime(t);
+}
+
+void
+TimeWidget::slotBarBeatOrFractionChanged(int)
+{
+ int bar = m_bar->value();
+ int beat = m_beat->value();
+ int fraction = m_fraction->value();
+
+ if (m_isDuration) {
+ slotSetTime(m_composition->getDurationForMusicalTime
+ (m_startTime, bar, beat, fraction, 0));
+
+ } else {
+ slotSetTime(m_composition->getAbsoluteTimeForMusicalTime
+ (bar, beat, fraction, 0));
+ }
+}
+
+void
+TimeWidget::slotSecOrMSecChanged(int)
+{
+ int sec = m_sec->value();
+ int msec = m_msec->value();
+
+ slotSetRealTime(RealTime(sec, msec * 1000000));
+}
+
+}
+#include "TimeWidget.moc"
diff --git a/src/gui/widgets/TimeWidget.h b/src/gui/widgets/TimeWidget.h
new file mode 100644
index 0000000..5ffa17a
--- /dev/null
+++ b/src/gui/widgets/TimeWidget.h
@@ -0,0 +1,125 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_ROSEGARDENTIMEWIDGET_H_
+#define _RG_ROSEGARDENTIMEWIDGET_H_
+
+#include "base/RealTime.h"
+#include <qgroupbox.h>
+#include <qstring.h>
+#include <vector>
+#include "base/Event.h"
+
+
+class QWidget;
+class QSpinBox;
+class QLineEdit;
+class QLabel;
+class QComboBox;
+
+
+namespace Rosegarden
+{
+
+class Composition;
+
+
+class TimeWidget : public QGroupBox
+{
+ Q_OBJECT
+public:
+ /**
+ * Constructor for absolute time widget
+ */
+ TimeWidget(QString title,
+ QWidget *parent,
+ Composition *composition, // for bar/beat/msec
+ timeT initialTime,
+ bool editable = true,
+ bool constrainToCompositionDuration = true);
+
+ /**
+ * Constructor for duration widget. startTime is the absolute time
+ * at which this duration begins, necessary so that we can show the
+ * correct real-time (based on tempo at startTime) etc.
+ */
+ TimeWidget(QString title,
+ QWidget *parent,
+ Composition *composition, // for bar/beat/msec
+ timeT startTime,
+ timeT initialDuration,
+ bool editable = true,
+ bool constrainToCompositionDuration = true);
+
+ timeT getTime();
+ RealTime getRealTime();
+
+signals:
+ void timeChanged(timeT);
+ void realTimeChanged(RealTime);
+
+public slots:
+ void slotSetTime(timeT);
+ void slotSetRealTime(RealTime);
+ void slotResetToDefault();
+
+ void slotNoteChanged(int);
+ void slotTimeTChanged(int);
+ void slotBarBeatOrFractionChanged(int);
+ void slotSecOrMSecChanged(int);
+
+private:
+ Composition *m_composition;
+ bool m_isDuration;
+ bool m_constrain;
+ timeT m_time;
+ timeT m_startTime;
+ timeT m_defaultTime;
+
+ QComboBox *m_note;
+ QSpinBox *m_timeT;
+ QSpinBox *m_bar;
+ QSpinBox *m_beat;
+ QSpinBox *m_fraction;
+ QLineEdit *m_barLabel;
+ QLineEdit *m_beatLabel;
+ QLineEdit *m_fractionLabel;
+ QLabel *m_timeSig;
+ QSpinBox *m_sec;
+ QSpinBox *m_msec;
+ QLineEdit *m_secLabel;
+ QLineEdit *m_msecLabel;
+ QLabel *m_tempo;
+
+ void init(bool editable);
+ void populate();
+
+ std::vector<timeT> m_noteDurations;
+};
+
+
+}
+
+#endif
diff --git a/src/gui/widgets/TristateCheckBox.cpp b/src/gui/widgets/TristateCheckBox.cpp
new file mode 100644
index 0000000..89ade5d
--- /dev/null
+++ b/src/gui/widgets/TristateCheckBox.cpp
@@ -0,0 +1,43 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "TristateCheckBox.h"
+
+#include <qcheckbox.h>
+#include <qwidget.h>
+
+
+namespace Rosegarden
+{
+
+void
+TristateCheckBox::mouseReleaseEvent(QMouseEvent *)
+{}
+
+TristateCheckBox::~TristateCheckBox()
+{}
+
+}
+#include "TristateCheckBox.moc"
diff --git a/src/gui/widgets/TristateCheckBox.h b/src/gui/widgets/TristateCheckBox.h
new file mode 100644
index 0000000..699252a
--- /dev/null
+++ b/src/gui/widgets/TristateCheckBox.h
@@ -0,0 +1,69 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_ROSEGARDENTRISTATECHECKBOX_H_
+#define _RG_ROSEGARDENTRISTATECHECKBOX_H_
+
+#include <qcheckbox.h>
+
+
+class QWidget;
+class QMouseEvent;
+
+
+namespace Rosegarden
+{
+
+
+
+/** Create out own check box which is always Tristate
+ * and allows us to click only between on and off
+ * and only to _show_ the third ("Some") state
+ */
+class TristateCheckBox : public QCheckBox
+{
+Q_OBJECT
+public:
+ TristateCheckBox(QWidget *parent=0,
+ const char *name=0):QCheckBox(parent, name)
+ { setTristate(true) ;}
+
+ virtual ~TristateCheckBox();
+
+protected:
+ // don't emit when the button is released
+ virtual void mouseReleaseEvent(QMouseEvent *);
+
+private:
+};
+
+
+// A label that emits a double click signal and provides scroll wheel information.
+//
+//
+
+}
+
+#endif
diff --git a/src/gui/widgets/VUMeter.cpp b/src/gui/widgets/VUMeter.cpp
new file mode 100644
index 0000000..ae9fe84
--- /dev/null
+++ b/src/gui/widgets/VUMeter.cpp
@@ -0,0 +1,694 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "VUMeter.h"
+
+#include "misc/Debug.h"
+#include "base/AudioLevel.h"
+#include "gui/general/GUIPalette.h"
+#include "gui/rulers/VelocityColour.h"
+#include <qbrush.h>
+#include <qcolor.h>
+#include <qlabel.h>
+#include <qpainter.h>
+#include <qtimer.h>
+#include <qwidget.h>
+
+
+namespace Rosegarden
+{
+
+VUMeter::VUMeter(QWidget *parent,
+ VUMeterType type,
+ bool stereo,
+ bool hasRecord,
+ int width,
+ int height,
+ VUAlignment alignment,
+ const char *name):
+ QLabel(parent, name),
+ m_originalHeight(height),
+ m_active(true),
+ m_type(type),
+ m_alignment(alignment),
+ m_levelLeft(0),
+ m_recordLevelLeft(0),
+ m_peakLevelLeft(0),
+ m_levelStepLeft(m_baseLevelStep),
+ m_recordLevelStepLeft(m_baseLevelStep),
+ m_fallTimerLeft(0),
+ m_peakTimerLeft(0),
+ m_levelRight(0),
+ m_recordLevelRight(0),
+ m_peakLevelRight(0),
+ m_levelStepRight(0),
+ m_recordLevelStepRight(0),
+ m_fallTimerRight(0),
+ m_peakTimerRight(0),
+ m_showPeakLevel(true),
+ m_baseLevelStep(3),
+ m_stereo(stereo),
+ m_hasRecord(hasRecord)
+{
+ // Work out if we need peak hold first
+ //
+ switch (m_type) {
+ case PeakHold:
+ case AudioPeakHoldShort:
+ case AudioPeakHoldLong:
+ case AudioPeakHoldIEC:
+ case AudioPeakHoldIECLong:
+ case FixedHeightVisiblePeakHold:
+ m_showPeakLevel = true;
+ break;
+
+ default:
+ case Plain:
+ m_showPeakLevel = false;
+ break;
+ }
+
+ // Always init the left fall timer
+ //
+ m_fallTimerLeft = new QTimer();
+
+ connect(m_fallTimerLeft, SIGNAL(timeout()),
+ this, SLOT(slotReduceLevelLeft()));
+
+ if (m_showPeakLevel) {
+ m_peakTimerLeft = new QTimer();
+
+ connect(m_peakTimerLeft, SIGNAL(timeout()),
+ this, SLOT(slotStopShowingPeakLeft()));
+ }
+
+ if (stereo) {
+ m_fallTimerRight = new QTimer();
+
+ connect(m_fallTimerRight, SIGNAL(timeout()),
+ this, SLOT(slotReduceLevelRight()));
+
+ if (m_showPeakLevel) {
+ m_peakTimerRight = new QTimer();
+ connect(m_peakTimerRight, SIGNAL(timeout()),
+ this, SLOT(slotStopShowingPeakRight()));
+ }
+
+ }
+
+ setMinimumSize(width, m_originalHeight);
+ setMaximumSize(width, m_originalHeight);
+
+ if (m_alignment == Vertical)
+ m_maxLevel = height;
+ else
+ m_maxLevel = width;
+
+ int max = m_maxLevel;
+ int red, orange, green;
+
+ if (m_type == AudioPeakHoldShort) {
+ red = AudioLevel::dB_to_fader( 0.0, max, AudioLevel::ShortFader);
+ orange = AudioLevel::dB_to_fader( -2.0, max, AudioLevel::ShortFader);
+ green = AudioLevel::dB_to_fader( -10.0, max, AudioLevel::ShortFader);
+ m_background = QColor(50, 50, 50);
+ } else if (m_type == AudioPeakHoldLong) {
+ red = AudioLevel::dB_to_fader( 0.0, max, AudioLevel::LongFader);
+ orange = AudioLevel::dB_to_fader( -2.0, max, AudioLevel::LongFader);
+ green = AudioLevel::dB_to_fader( -10.0, max, AudioLevel::LongFader);
+ m_background = QColor(50, 50, 50);
+ } else if (m_type == AudioPeakHoldIEC) {
+ red = AudioLevel::dB_to_fader( -0.1, max, AudioLevel::IEC268Meter);
+ orange = AudioLevel::dB_to_fader( -6.0, max, AudioLevel::IEC268Meter);
+ green = AudioLevel::dB_to_fader( -10.0, max, AudioLevel::IEC268Meter);
+ m_background = QColor(50, 50, 50);
+ } else if (m_type == AudioPeakHoldIECLong) {
+ red = AudioLevel::dB_to_fader( 0.0, max, AudioLevel::IEC268LongMeter);
+ orange = AudioLevel::dB_to_fader( -6.0, max, AudioLevel::IEC268LongMeter);
+ green = AudioLevel::dB_to_fader( -10.0, max, AudioLevel::IEC268LongMeter);
+ m_background = QColor(50, 50, 50);
+ } else {
+ red = max * 92 / 100;
+ orange = max * 60 / 100;
+ green = max * 10 / 100;
+ m_background = Qt::black;
+ }
+
+ if (m_type == AudioPeakHoldLong ||
+ m_type == AudioPeakHoldShort ||
+ m_type == AudioPeakHoldIEC ||
+ m_type == AudioPeakHoldIECLong) {
+ m_velocityColour =
+ new VelocityColour(GUIPalette::getColour(GUIPalette::LevelMeterSolidRed),
+ GUIPalette::getColour(GUIPalette::LevelMeterSolidOrange),
+ GUIPalette::getColour(GUIPalette::LevelMeterSolidGreen),
+ max, red, orange, green);
+ } else {
+ m_velocityColour =
+ new VelocityColour(GUIPalette::getColour(GUIPalette::LevelMeterRed),
+ GUIPalette::getColour(GUIPalette::LevelMeterOrange),
+ GUIPalette::getColour(GUIPalette::LevelMeterGreen),
+ max, red, orange, green);
+ }
+}
+
+VUMeter::~VUMeter()
+{
+ delete m_velocityColour;
+ delete m_peakTimerRight;
+ delete m_peakTimerLeft;
+ delete m_fallTimerRight;
+ delete m_fallTimerLeft;
+}
+
+void
+VUMeter::setLevel(double level)
+{
+ setLevel(level, level, false);
+}
+
+void
+VUMeter::setLevel(double leftLevel, double rightLevel)
+{
+ setLevel(leftLevel, rightLevel, false);
+}
+
+void
+VUMeter::setRecordLevel(double level)
+{
+ setLevel(level, level, true);
+}
+
+void
+VUMeter::setRecordLevel(double leftLevel, double rightLevel)
+{
+ setLevel(leftLevel, rightLevel, true);
+}
+
+void
+VUMeter::setLevel(double leftLevel, double rightLevel, bool record)
+{
+ if (!isVisible())
+ return ;
+
+ // RG_DEBUG << "setLevel(" << (void *)this << "): record=" << record << ", leftLevel=" << leftLevel << ", hasRecord=" << m_hasRecord << endl;
+
+ if (record && !m_hasRecord)
+ return ;
+
+ short &ll = (record ? m_recordLevelLeft : m_levelLeft);
+ short &lr = (record ? m_recordLevelRight : m_levelRight);
+
+ switch (m_type) {
+
+ case AudioPeakHoldShort:
+ ll = AudioLevel::dB_to_fader
+ (leftLevel, m_maxLevel, AudioLevel::ShortFader);
+ lr = AudioLevel::dB_to_fader
+ (rightLevel, m_maxLevel, AudioLevel::ShortFader);
+ break;
+
+ case AudioPeakHoldLong:
+ ll = AudioLevel::dB_to_fader
+ (leftLevel, m_maxLevel, AudioLevel::LongFader);
+ lr = AudioLevel::dB_to_fader
+ (rightLevel, m_maxLevel, AudioLevel::LongFader);
+ break;
+
+ case AudioPeakHoldIEC:
+ ll = AudioLevel::dB_to_fader
+ (leftLevel, m_maxLevel, AudioLevel::IEC268Meter);
+ lr = AudioLevel::dB_to_fader
+ (rightLevel, m_maxLevel, AudioLevel::IEC268Meter);
+ break;
+
+ case AudioPeakHoldIECLong:
+ ll = AudioLevel::dB_to_fader
+ (leftLevel, m_maxLevel, AudioLevel::IEC268LongMeter);
+ lr = AudioLevel::dB_to_fader
+ (rightLevel, m_maxLevel, AudioLevel::IEC268LongMeter);
+ break;
+
+ default:
+ ll = (int)(double(m_maxLevel) * leftLevel);
+ lr = (int)(double(m_maxLevel) * rightLevel);
+ };
+
+ if (ll < 0)
+ ll = 0;
+ if (ll > m_maxLevel)
+ ll = m_maxLevel;
+ if (lr < 0)
+ lr = 0;
+ if (lr > m_maxLevel)
+ lr = m_maxLevel;
+
+ if (record) {
+ m_recordLevelStepLeft = m_baseLevelStep;
+ m_recordLevelStepRight = m_baseLevelStep;
+ } else {
+ m_levelStepLeft = m_baseLevelStep;
+ m_levelStepRight = m_baseLevelStep;
+ }
+
+ // Only start the timer when we need it
+ if (ll > 0) {
+ if (m_fallTimerLeft->isActive() == false) {
+ m_fallTimerLeft->start(40); // 40 ms per level fall iteration
+ meterStart();
+ }
+ }
+
+ if (lr > 0) {
+ if (m_fallTimerRight && m_fallTimerRight->isActive() == false) {
+ m_fallTimerRight->start(40); // 40 ms per level fall iteration
+ meterStart();
+ }
+ }
+
+ if (!record) {
+
+ // Reset level and reset timer if we're exceeding the
+ // current peak
+ //
+ if (ll >= m_peakLevelLeft && m_showPeakLevel) {
+ m_peakLevelLeft = ll;
+
+ if (m_peakTimerLeft->isActive())
+ m_peakTimerLeft->stop();
+
+ m_peakTimerLeft->start(1000); // milliseconds of peak hold
+ }
+
+ if (lr >= m_peakLevelRight && m_showPeakLevel) {
+ m_peakLevelRight = lr;
+
+ if (m_peakTimerRight) {
+ if (m_peakTimerRight->isActive())
+ m_peakTimerRight->stop();
+
+ m_peakTimerRight->start(1000); // milliseconds of peak hold
+ }
+ }
+ }
+
+ if (m_active) {
+ QPainter paint(this);
+ drawMeterLevel(&paint);
+ }
+}
+
+void
+VUMeter::paintEvent(QPaintEvent *e)
+{
+ // RG_DEBUG << "VUMeter::paintEvent - height = " << height() << endl;
+ QPainter paint(this);
+
+ if (m_type == VUMeter::AudioPeakHoldShort ||
+ m_type == VUMeter::AudioPeakHoldLong ||
+ m_type == VUMeter::AudioPeakHoldIEC ||
+ m_type == VUMeter::AudioPeakHoldIECLong) {
+ paint.setPen(m_background);
+ paint.setBrush(m_background);
+ paint.drawRect(0, 0, width(), height());
+
+ drawMeterLevel(&paint);
+
+ paint.setPen(colorGroup().background());
+ paint.drawPoint(0, 0);
+ paint.drawPoint(width() - 1, 0);
+ paint.drawPoint(0, height() - 1);
+ paint.drawPoint(width() - 1, height() - 1);
+ } else if (m_type == VUMeter::FixedHeightVisiblePeakHold) {
+ paint.setPen(m_background);
+ paint.setBrush(m_background);
+ paint.drawRect(0, 0, width(), height());
+
+ if (m_fallTimerLeft->isActive())
+ drawMeterLevel(&paint);
+ else {
+ meterStop();
+ drawFrame(&paint);
+ drawContents(&paint);
+ }
+ } else {
+ if (m_fallTimerLeft->isActive()) {
+ paint.setPen(m_background);
+ paint.setBrush(m_background);
+ paint.drawRect(0, 0, width(), height());
+ drawMeterLevel(&paint);
+ } else {
+ meterStop();
+ drawFrame(&paint);
+ drawContents(&paint);
+ }
+ }
+}
+
+void
+VUMeter::drawColouredBar(QPainter *paint, int channel,
+ int x, int y, int w, int h)
+{
+ if (m_type == AudioPeakHoldLong ||
+ m_type == AudioPeakHoldShort ||
+ m_type == AudioPeakHoldIEC ||
+ m_type == AudioPeakHoldIECLong) {
+
+ Qt::BrushStyle style = Qt::SolidPattern;
+
+ int medium = m_velocityColour->getMediumKnee(),
+ loud = m_velocityColour->getLoudKnee();
+
+ if (m_alignment == Vertical) {
+ if (h > loud) {
+ paint->setPen(m_velocityColour->getLoudColour());
+ paint->setBrush(QBrush(m_velocityColour->getLoudColour(),
+ style));
+ paint->drawRect(x, y, w, h - loud);
+ }
+ } else {
+ if (w > loud) {
+ paint->setPen(m_velocityColour->getLoudColour());
+ paint->setBrush(QBrush(m_velocityColour->getLoudColour(),
+ style));
+ paint->drawRect(x + loud, y, w - loud, h);
+ }
+ }
+
+ if (m_alignment == Vertical) {
+ if (h > medium) {
+ paint->setPen(m_velocityColour->getMediumColour());
+ paint->setBrush(QBrush(m_velocityColour->getMediumColour(),
+ style));
+ paint->drawRect(x, y + (h > loud ? (h - loud) : 0),
+ w, std::min(h - medium, loud - medium));
+ }
+ } else {
+ if (w > medium) {
+ paint->setPen(m_velocityColour->getMediumColour());
+ paint->setBrush(QBrush(m_velocityColour->getMediumColour(),
+ style));
+ paint->drawRect(x + medium, y,
+ std::min(w - medium, loud - medium), h);
+ }
+ }
+
+ if (m_alignment == Vertical) {
+ paint->setPen(m_velocityColour->getQuietColour());
+ paint->setBrush(QBrush(m_velocityColour->getQuietColour(),
+ style));
+ paint->drawRect(x, y + (h > medium ? (h - medium) : 0),
+ w, std::min(h, medium));
+ } else {
+ paint->setPen(m_velocityColour->getQuietColour());
+ paint->setBrush(QBrush(m_velocityColour->getQuietColour(),
+ style));
+ paint->drawRect(x, y, std::min(w, medium), h);
+ }
+
+ } else {
+
+ if (channel == 0) {
+
+ QColor mixedColour = m_velocityColour->getColour(m_levelLeft);
+
+ paint->setPen(mixedColour);
+ paint->setBrush(mixedColour);
+
+ } else {
+
+ QColor mixedColour = m_velocityColour->getColour(m_levelRight);
+
+ paint->setPen(mixedColour);
+ paint->setBrush(mixedColour);
+ }
+
+ // RG_DEBUG << "VUMeter::drawColouredBar - level = " << m_levelLeft << endl;
+
+ paint->drawRect(x, y, w, h);
+ }
+}
+
+void
+VUMeter::drawMeterLevel(QPainter* paint)
+{
+ int medium = m_velocityColour->getMediumKnee(),
+ loud = m_velocityColour->getLoudKnee();
+
+ if (m_stereo) {
+ if (m_alignment == VUMeter::Vertical) {
+ int hW = width() / 2;
+
+ int midWidth = 1;
+ if (m_hasRecord) {
+ if (width() > 10) {
+ midWidth = 2;
+ }
+ }
+
+ // Draw the left bar
+ //
+ int y = height() - (m_levelLeft * height()) / m_maxLevel;
+ int ry = height() - (m_recordLevelLeft * height()) / m_maxLevel;
+
+ drawColouredBar(paint, 0, 0, y, hW - midWidth, height() - y);
+
+ if (m_hasRecord) {
+ drawColouredBar(paint, 0, hW - midWidth, ry, midWidth + 1, height() - ry);
+ }
+
+ paint->setPen(m_background);
+ paint->setBrush(m_background);
+ paint->drawRect(0, 0, hW - midWidth, y);
+
+ if (m_hasRecord) {
+ paint->drawRect(hW - midWidth, 0, midWidth + 1, ry);
+ }
+
+ if (m_showPeakLevel) {
+ int h = (m_peakLevelLeft * height()) / m_maxLevel;
+ y = height() - h;
+
+ if (h > loud) {
+ paint->setPen(Qt::red); // brighter than the red meter bar
+ paint->drawLine(0, y - 1, hW - midWidth - 1, y - 1);
+ paint->drawLine(0, y + 1, hW - midWidth - 1, y + 1);
+ }
+
+ paint->setPen(Qt::white);
+ paint->drawLine(0, y, hW - midWidth - 1, y);
+ }
+
+ // Draw the right bar
+ //
+ y = height() - (m_levelRight * height()) / m_maxLevel;
+ ry = height() - (m_recordLevelRight * height()) / m_maxLevel;
+ drawColouredBar(paint, 1, hW + midWidth, y, hW - midWidth, height() - y);
+
+ if (m_hasRecord) {
+ drawColouredBar(paint, 1, hW, ry, midWidth + 1, height() - ry);
+ }
+
+ paint->setPen(m_background);
+ paint->setBrush(m_background);
+ paint->drawRect(hW + midWidth, 0, hW - midWidth + 1, y);
+
+ if (m_hasRecord) {
+ paint->drawRect(hW, 0, midWidth, ry);
+ }
+
+ if (m_showPeakLevel) {
+ int h = (m_peakLevelRight * height()) / m_maxLevel;
+ y = height() - h;
+
+ if (h > loud) {
+ paint->setPen(Qt::red); // brighter than the red meter bar
+ paint->drawLine(hW + midWidth, y - 1, width(), y - 1);
+ paint->drawLine(hW + midWidth, y + 1, width(), y + 1);
+ }
+
+ paint->setPen(Qt::white);
+ paint->setBrush(Qt::white);
+
+ paint->drawLine(hW + midWidth, y, width(), y);
+ }
+ } else // horizontal
+ {
+ paint->setPen(m_background);
+ paint->setBrush(m_background);
+ paint->drawRect(0, 0, width(), height());
+
+ int x = (m_levelLeft * width()) / m_maxLevel;
+ if (x > 0)
+ paint->drawRect(0, 0, x, height());
+
+ if (m_showPeakLevel) {
+ paint->setPen(Qt::white);
+ paint->setBrush(Qt::white);
+
+ // show peak level
+ x = m_peakLevelLeft * width() / m_maxLevel;
+ if (x < (width() - 1))
+ x++;
+ else
+ x = width() - 1;
+
+ paint->drawLine(x, 0, x, height());
+ }
+ }
+ } else {
+ // Paint a vertical meter according to type
+ //
+ if (m_alignment == VUMeter::Vertical) {
+ int y = height() - (m_levelLeft * height()) / m_maxLevel;
+ drawColouredBar(paint, 0, 0, y, width(), height());
+
+ paint->setPen(m_background);
+ paint->setBrush(m_background);
+ paint->drawRect(0, 0, width(), y);
+
+ /*
+ RG_DEBUG << "VUMeter::drawMeterLevel - height = " << height()
+ << ", vertical rect height = " << y << endl;
+ */
+
+ if (m_showPeakLevel) {
+ paint->setPen(Qt::white);
+ paint->setBrush(Qt::white);
+
+ y = height() - (m_peakLevelLeft * height()) / m_maxLevel;
+
+ paint->drawLine(0, y, width(), y);
+ }
+ } else {
+ int x = (m_levelLeft * width()) / m_maxLevel;
+ if (x > 0)
+ drawColouredBar(paint, 0, 0, 0, x, height());
+
+ paint->setPen(m_background);
+ paint->setBrush(m_background);
+ paint->drawRect(x, 0, width() - x, height());
+
+ if (m_showPeakLevel) {
+ paint->setPen(Qt::white);
+ paint->setBrush(Qt::white);
+
+ // show peak level
+ x = (m_peakLevelLeft * width()) / m_maxLevel;
+ if (x < (width() - 1))
+ x++;
+ else
+ x = width() - 1;
+
+ paint->drawLine(x, 0, x, height());
+ }
+ }
+ }
+}
+
+void
+VUMeter::slotReduceLevelRight()
+{
+ m_levelStepRight = int(m_levelRight) * m_baseLevelStep / 100 + 1;
+ if (m_levelStepRight < 1)
+ m_levelStepRight = 1;
+
+ m_recordLevelStepRight = int(m_recordLevelRight) * m_baseLevelStep / 100 + 1;
+ if (m_recordLevelStepRight < 1)
+ m_recordLevelStepRight = 1;
+
+ if (m_levelRight > 0)
+ m_levelRight -= m_levelStepRight;
+ if (m_recordLevelRight > 0)
+ m_recordLevelRight -= m_recordLevelStepRight;
+
+ if (m_levelRight <= 0) {
+ m_levelRight = 0;
+ m_peakLevelRight = 0;
+ }
+
+ if (m_recordLevelRight <= 0)
+ m_recordLevelRight = 0;
+
+ if (m_levelRight == 0 && m_recordLevelRight == 0) {
+ // Always stop the timer when we don't need it
+ if (m_fallTimerRight)
+ m_fallTimerRight->stop();
+ meterStop();
+ }
+
+ QPainter paint(this);
+ drawMeterLevel(&paint);
+}
+
+void
+VUMeter::slotReduceLevelLeft()
+{
+ m_levelStepLeft = int(m_levelLeft) * m_baseLevelStep / 100 + 1;
+ if (m_levelStepLeft < 1)
+ m_levelStepLeft = 1;
+
+ m_recordLevelStepLeft = int(m_recordLevelLeft) * m_baseLevelStep / 100 + 1;
+ if (m_recordLevelStepLeft < 1)
+ m_recordLevelStepLeft = 1;
+
+ if (m_levelLeft > 0)
+ m_levelLeft -= m_levelStepLeft;
+ if (m_recordLevelLeft > 0)
+ m_recordLevelLeft -= m_recordLevelStepLeft;
+
+ if (m_levelLeft <= 0) {
+ m_levelLeft = 0;
+ m_peakLevelLeft = 0;
+ }
+
+ if (m_recordLevelLeft <= 0)
+ m_recordLevelLeft = 0;
+
+ if (m_levelLeft == 0 && m_recordLevelLeft == 0) {
+ // Always stop the timer when we don't need it
+ if (m_fallTimerLeft)
+ m_fallTimerLeft->stop();
+ meterStop();
+ }
+
+ QPainter paint(this);
+ drawMeterLevel(&paint);
+}
+
+void
+VUMeter::slotStopShowingPeakRight()
+{
+ m_peakLevelRight = 0;
+}
+
+void
+VUMeter::slotStopShowingPeakLeft()
+{
+ m_peakLevelLeft = 0;
+}
+
+}
+#include "VUMeter.moc"
diff --git a/src/gui/widgets/VUMeter.h b/src/gui/widgets/VUMeter.h
new file mode 100644
index 0000000..0a06dfd
--- /dev/null
+++ b/src/gui/widgets/VUMeter.h
@@ -0,0 +1,154 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_VUMETER_H_
+#define _RG_VUMETER_H_
+
+#include <qcolor.h>
+#include <qlabel.h>
+
+
+class QWidget;
+class QTimer;
+class QPaintEvent;
+class QPainter;
+
+
+namespace Rosegarden
+{
+
+class VelocityColour;
+
+
+class VUMeter : public QLabel
+{
+Q_OBJECT
+
+public:
+ typedef enum
+ {
+ Plain,
+ PeakHold,
+ AudioPeakHoldShort,
+ AudioPeakHoldLong,
+ AudioPeakHoldIEC,
+ AudioPeakHoldIECLong,
+ FixedHeightVisiblePeakHold
+ } VUMeterType;
+
+ typedef enum
+ {
+ Horizontal,
+ Vertical
+ } VUAlignment;
+
+ // Mono and stereo level setting. The AudioPeakHold meter types
+ // expect levels in dB; other types expect levels between 0 and 1.
+ //
+ void setLevel(double level);
+ void setLevel(double leftLevel, double rightLevel);
+
+ // Mono and stereo record level setting. Same units. Only
+ // applicable if hasRecord true in constructor.
+ //
+ void setRecordLevel(double level);
+ void setRecordLevel(double leftLevel, double rightLevel);
+
+ virtual void paintEvent(QPaintEvent*);
+
+protected:
+ // Constructor is protected - we can only create an object
+ // from a sub-class of this type from a sub-class.
+ //
+ VUMeter(QWidget *parent = 0,
+ VUMeterType type = Plain,
+ bool stereo = false,
+ bool hasRecord = false,
+ int width = 0,
+ int height = 0,
+ VUAlignment alignment = Horizontal,
+ const char *name = 0);
+ ~VUMeter();
+
+ virtual void meterStart() = 0;
+ virtual void meterStop() = 0;
+
+ int m_originalHeight;
+ bool m_active;
+
+ void setLevel(double leftLevel, double rightLevel, bool record);
+
+private slots:
+ void slotReduceLevelLeft();
+ void slotStopShowingPeakLeft();
+
+ void slotReduceLevelRight();
+ void slotStopShowingPeakRight();
+
+private:
+
+ void drawMeterLevel(QPainter *paint);
+ void drawColouredBar(QPainter *paint, int channel,
+ int x, int y, int w, int h);
+
+ VUMeterType m_type;
+ VUAlignment m_alignment;
+ QColor m_background;
+
+ short m_maxLevel;
+
+ short m_levelLeft;
+ short m_recordLevelLeft;
+ short m_peakLevelLeft;
+ short m_levelStepLeft;
+ short m_recordLevelStepLeft;
+ QTimer *m_fallTimerLeft;
+ QTimer *m_peakTimerLeft;
+
+ short m_levelRight;
+ short m_recordLevelRight;
+ short m_peakLevelRight;
+ short m_levelStepRight;
+ short m_recordLevelStepRight;
+ QTimer *m_fallTimerRight;
+ QTimer *m_peakTimerRight;
+
+ bool m_showPeakLevel;
+ short m_baseLevelStep;
+
+ bool m_stereo;
+ bool m_hasRecord;
+
+ // We use this to work out our colours
+ //
+ VelocityColour *m_velocityColour;
+
+
+};
+
+
+}
+
+#endif
diff --git a/src/gui/widgets/WheelyButton.cpp b/src/gui/widgets/WheelyButton.cpp
new file mode 100644
index 0000000..e63cb3b
--- /dev/null
+++ b/src/gui/widgets/WheelyButton.cpp
@@ -0,0 +1,35 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "WheelyButton.h"
+
+#include <qpushbutton.h>
+#include <qwidget.h>
+
+
+namespace Rosegarden
+{
+}
+#include "WheelyButton.moc"
diff --git a/src/gui/widgets/WheelyButton.h b/src/gui/widgets/WheelyButton.h
new file mode 100644
index 0000000..83de80d
--- /dev/null
+++ b/src/gui/widgets/WheelyButton.h
@@ -0,0 +1,68 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_WHEELYBUTTON_H_
+#define _RG_WHEELYBUTTON_H_
+
+#include <qpushbutton.h>
+
+
+class QWidget;
+class QWheelEvent;
+
+
+namespace Rosegarden
+{
+
+
+
+class WheelyButton : public QPushButton
+{
+ Q_OBJECT
+
+public:
+ WheelyButton(QWidget *w) : QPushButton(w) { }
+ virtual ~WheelyButton() { }
+
+signals:
+ void wheel(bool up);
+
+protected:
+ void wheelEvent(QWheelEvent *e) {
+ emit wheel(e->delta() > 0);
+ }
+};
+
+
+
+// A specialised menu for selecting audio inputs or outputs, that
+// queries the studio and instrument to find out what it should show.
+// Available in a "compact" size, which is a push button with a popup
+// menu attached, or a regular size which is a combobox.
+//
+
+}
+
+#endif
diff --git a/src/gui/widgets/ZoomSlider.cpp b/src/gui/widgets/ZoomSlider.cpp
new file mode 100644
index 0000000..1986635
--- /dev/null
+++ b/src/gui/widgets/ZoomSlider.cpp
@@ -0,0 +1,34 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "ZoomSlider.h"
+
+#include <qslider.h>
+#include <qwidget.h>
+
+
+namespace Rosegarden
+{
+}
diff --git a/src/gui/widgets/ZoomSlider.h b/src/gui/widgets/ZoomSlider.h
new file mode 100644
index 0000000..635d074
--- /dev/null
+++ b/src/gui/widgets/ZoomSlider.h
@@ -0,0 +1,175 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RG_ZOOMSLIDER_H_
+#define _RG_ZOOMSLIDER_H_
+
+#include <qslider.h>
+#include <vector>
+
+
+class T;
+class QWidget;
+
+
+namespace Rosegarden
+{
+
+
+
+template <class T>
+class ZoomSlider : public QSlider
+{
+public:
+
+ /**
+ * Construct a ZoomSlider offering a selection from the
+ * given set of sizes.
+ *
+ * A ZoomSlider is a not-very-well-named slider widget that
+ * offers the user an integral range of values (say, 1..3)
+ * but maps those values internally onto a list of "sizes",
+ * which may be any values of any type (for example the
+ * strings "small", "medium" or "large" or the doubles 1.0,
+ * 1.2 and 1.5). It may be useful where a GUI wants to
+ * offer a fairly limited range of sizes or options that
+ * may actually be arbitrary values chosen because they
+ * work well for some internal reason but that should appear
+ * to the user as a nice continuous range.
+ */
+ ZoomSlider(const std::vector<T> &sizes, T defaultValue,
+ Orientation, QWidget * parent, const char * name=0);
+
+ virtual ~ZoomSlider();
+
+ void reinitialise(const std::vector<T> &sizes, T defaultValue);
+
+ const T &getCurrentSize() const;
+ const T &getDefault() const;
+
+public slots:
+ void setToDefault(); // restore the initial value
+ void setSize(T size);
+ void increment();
+ void decrement();
+
+protected:
+ static int getIndex(const std::vector<T> &, T size);
+ std::vector<T> m_sizes;
+ T m_defaultValue;
+};
+
+
+template<class T>
+ZoomSlider<T>::ZoomSlider(const std::vector<T> &sizes,
+ T initialSize, Orientation o,
+ QWidget *parent, const char *name) :
+ QSlider(0, sizes.size()-1, 1,
+ getIndex(sizes, initialSize), o, parent, name),
+ m_sizes(sizes),
+ m_defaultValue(initialSize)
+{
+ setTracking(false);
+ setFixedWidth(150);
+ setFixedHeight(15);
+ setLineStep(1);
+ setTickmarks(Below);
+}
+
+template<class T>
+ZoomSlider<T>::~ZoomSlider() { }
+
+template<class T>
+int
+ZoomSlider<T>::getIndex(const std::vector<T> &sizes, T size)
+{
+ for (unsigned int i = 0; i < sizes.size(); ++i) {
+ if (sizes[i] == size) return i;
+ }
+ return sizes.size()/2;
+}
+
+template<class T>
+void
+ZoomSlider<T>::reinitialise(const std::vector<T> &sizes, T size)
+{
+ m_sizes = sizes;
+ setMinValue(0);
+ setMaxValue(sizes.size()-1);
+ setValue(getIndex(sizes, size));
+ setLineStep(1);
+ setTickmarks(Below);
+}
+
+template<class T>
+void
+ZoomSlider<T>::setToDefault()
+{
+ setValue(getIndex(m_sizes, m_defaultValue));
+}
+
+template <class T>
+const T &
+ZoomSlider<T>::getCurrentSize() const
+{
+ return m_sizes[value()];
+}
+
+template <class T>
+void
+ZoomSlider<T>::setSize(T size)
+{
+ setValue(getIndex(m_sizes, size));
+}
+
+template <class T>
+void
+ZoomSlider<T>::increment()
+{
+ if (value() + 1 >= m_sizes.size()) return;
+ setValue(value() + 1);
+}
+
+template <class T>
+void
+ZoomSlider<T>::decrement()
+{
+ if (value() <= 0) return;
+ setValue(value() - 1);
+}
+
+template <class T>
+const T &
+ZoomSlider<T>::getDefault() const
+{
+ return m_defaultValue;
+}
+
+
+
+
+}
+
+#endif
diff --git a/src/helpers/rosegarden-audiofile-importer b/src/helpers/rosegarden-audiofile-importer
new file mode 100755
index 0000000..8cbaa45
--- /dev/null
+++ b/src/helpers/rosegarden-audiofile-importer
@@ -0,0 +1,270 @@
+#!/bin/bash
+#
+# Helper application to convert and import audio files for Rosegarden.
+# Copyright 2005-2008 Chris Cannam. Distributed under the GNU General
+# Public License.
+#
+# Can take audio files of various kinds as input, always produces WAV
+# files that are compatible with Rosegarden as output.
+#
+# Not actually specific to Rosegarden in any way, except that
+# Rosegarden needs to know it can rely on its presence and calling
+# interface.
+#
+# Usage:
+#
+# rosegarden-audiofile-importer -t [<version>]
+# rosegarden-audiofile-importer --conftest [<version>]
+# -- Exit successfully if the importer is available and working
+# [and is of at least version <version>]. If some of the
+# required helper applications are missing, also print to
+# stdout a line saying "Required: application1, application2",
+# listing the missing programs.
+#
+# rosegarden-audiofile-importer -l [<version>]
+# -- List known file extensions (e.g. ogg wav flac). Return code
+# is same as for -t (so can combine two calls into one)
+#
+# rosegarden-audiofile-importer [-r <rate>] -w <inputfile>
+# -- Test whether any work is needed to convert <inputfile>, either
+# because it isn't in a Rosegarden-compatible format or because
+# its samplerate differs from <rate>. Exit successfully if no
+# work is required; return error code 2 if conversion required,
+# 3 if resampling required, 4 if both required, 1 for other error.
+#
+# rosegarden-audiofile-importer [-r <rate>] -c <inputfile> <outputfile>
+# -- Convert <inputfile> [and resample if necessary] and write to
+# <outputfile> as a WAV file
+#
+# N.B. <outputfile> must not already exist -- this program will not
+# overwrite it, but will fail instead if it does
+
+version=1
+
+OTHER_ERROR=1
+CONVERSION_REQD=2
+RESAMPLE_REQD=3
+BOTH_REQD=4
+
+echo "rosegarden-audiofile-importer: $@" 1>&2
+
+conftest() {
+ # ssrc is our favourite resampler, but it only works for certain
+ # samplerates, so we have to have at least one other just in case
+ if [ -x "`type -path sndfile-resample`" ]; then
+ return 0
+ fi
+ if [ -x "`type -path sox`" ] && sox -h 2>&1 | grep -q polyphase; then
+ return 0
+ fi
+ echo "Required: sox OR sndfile-resample"
+ echo "rosegarden-audiofile-importer: ERROR: No resampler available, failing configuration test" 1>&2
+ return 1
+}
+
+[ -x "`type -path oggdec`" ] && have_oggdec=1
+[ -x "`type -path flac`" ] && have_flac=1
+[ -x "`type -path mpg321`" ] && have_mpg321=1
+[ -x "`type -path sndfile-convert`" -a -x "`type -path sndfile-info`" ] && have_sndfile=1
+
+if [ -n "$have_mpg321" ]; then
+ if ! mpg321 --help 2>&1 | grep -q 'wav N'; then
+ have_mpg321=
+ fi
+fi
+
+case "$1" in
+ -t|--conftest) conftest; exit $?;;
+ -l) conftest || exit $?
+ {
+ [ -n "$have_oggdec" ] && echo ogg
+ [ -n "$have_flac" ] && echo flac
+ [ -n "$have_mpg321" ] && echo mp3
+ [ -n "$have_sndfile" ] && sndfile-convert --help 2>&1 | \
+ grep '^ *[a-z][a-z]* *: ' | awk '{ print $1; }'
+ } | sort | uniq | fmt -1000
+ exit 0;;
+ -r) rate="$2"; shift; shift;;
+esac
+
+case "$1" in
+ -w) test_work=1;;
+ -c) convert=1;;
+ *) exit 2;;
+esac
+
+conftest || exit $OTHER_ERROR
+
+infile="$2"
+if [ ! -r "$infile" ]; then
+ echo "rosegarden-audiofile-importer: ERROR: input file \"$infile\" cannot be opened" 1>&2
+ exit $OTHER_ERROR
+fi
+
+if [ -n "$convert" ]; then
+ outfile="$3"
+ if [ -z "$outfile" ]; then
+ echo "rosegarden-audiofile-importer: ERROR: output file not specified" 1>&2
+ exit $OTHER_ERROR
+ fi
+ if [ -f "$outfile" ]; then
+ echo "rosegarden-audiofile-importer: ERROR: output file \"$outfile\" already exists, not overwriting" 1>&2
+ exit $OTHER_ERROR
+ fi
+fi
+
+base=`basename "$infile"`
+stem=${base%.*}
+extension=${base##*.}
+
+extension=`echo $extension | tr '[A-Z]' '[a-z]'`
+
+# If the file ends in ogg, mp3, wav or flac, we believe it. Otherwise
+# use file to see whether it's actually something else
+
+case "$extension" in
+ ogg|mp3|wav|flac) ;;
+ *) case "`file $infile`" in
+ *Ogg*Vorbis*) extension=ogg;;
+ *MP3*) extension=mp3;;
+ *FLAC*) extension=flac;;
+ esac;;
+esac
+
+case "$extension" in
+ ogg) converter=oggdec
+ [ -x "`type -path ogginfo`" ] && filerate=`ogginfo "$infile" | grep '^Rate: ' | awk '{ print $2; }'`;;
+ mp3) converter=mpg321
+ # don't have a helper program to work out rate
+ ;;
+ *) filerate=`sndfile-info "$infile" | grep '^Sample Rate :' | awk '{ print $4; }'`;;
+esac
+
+case "$extension" in
+ wav) ;;
+ flac) converter=flac; convert_reqd=1;;
+ogg|mp3) convert_reqd=1;;
+ *) converter=sndfile-convert; convert_reqd=1;;
+esac
+
+echo "Extension is $extension, converter is $converter, reqd is $convert_reqd"
+
+case "$filerate" in [0-9]*);; *) filerate=; intermediate=1;; esac
+
+[ -n "$filerate" ] && echo "File samplerate is $filerate (requested: $rate)"
+
+[ -n "$filerate" -a -n "$rate" ] && [ "$filerate" -ne "$rate" ] && resample_reqd=1
+[ -n "$resample_reqd" -a -n "$convert_reqd" ] && intermediate=1
+
+[ -n "$intermediate" ] && echo "Using intermediate file"
+
+if [ -z "$convert" ]; then # -w option
+ if [ -n "$convert_reqd" ]; then
+ [ -n "$intermediate" -o -n "$resample_reqd" ] && exit $BOTH_REQD
+ exit $CONVERSION_REQD;
+ else
+ [ -n "$intermediate" -o -n "$resample_reqd" ] && exit $RESAMPLE_REQD
+ exit 0;
+ fi
+fi
+
+target="$outfile"
+if [ -n "$intermediate" ]; then
+ target="$outfile.tmp.wav"
+ if [ -f "$target" ]; then
+ echo "rosegarden-audiofile-importer: ERROR: intermediate file \"$target\" already exists, not overwriting" 1>&2
+ exit $OTHER_ERROR
+ fi
+ trap "rm -f \"$target\"" 0
+ trap "rm -f \"$target\" \"$outfile\"" 1 2 9 11 15
+else
+ trap "rm -f \"$outfile\"" 1 2 9 11 15
+fi
+
+resample() {
+ _source=$1; shift
+ _target=$1; shift
+ simple=""
+ case "$filerate" in
+ 192000|176400|96000|88200|48000|44100|24000|22050|12000|11025)
+ case "$rate" in
+ 192000|176400|96000|88200|48000|44100|24000|22050|12000|11025)
+ simple=1;;
+ esac
+ esac
+ done=""
+ if [ -x "`type -path ssrc`" -a -n "$simple" ]; then
+ echo "Resampling using ssrc..." 1>&2
+ ssrc --rate "$rate" --twopass --dither 4 --profile standard "$_source" "$_target" && done=1
+ fi
+ if [ -z "$done" ]; then
+ if [ -x "`type -path sndfile-resample`" ]; then
+ echo "Resampling using sndfile-resample..." 1>&2
+ sndfile-resample -to "$rate" -c 0 "$_source" "$_target" || return 4
+ else
+ echo "Resampling using sox..." 1>&2
+ sox "$_source" -r "$rate" "$_target" polyphase || return 4
+ fi
+ fi
+ return 0
+}
+
+if [ -n "$convert_reqd" ]; then
+ case "$converter" in
+ flac) [ -z "$have_flac" -a -n "$have_sndfile" ] && converter=sndfile-convert;;
+ esac
+ case "$converter" in
+ oggdec)
+ [ -n "$have_oggdec" ] || exit $OTHER_ERROR
+ oggdec --output "$target" "$infile" || exit $OTHER_ERROR
+ ;;
+ mpg321)
+ [ -n "$have_mpg321" ] || exit $OTHER_ERROR
+ mpg321 --wav "$target" "$infile" || exit $OTHER_ERROR
+ ;;
+ flac)
+ [ -n "$have_flac" ] || exit $OTHER_ERROR
+ flac --decode --output-name="$target" "$infile" || exit $OTHER_ERROR
+ ;;
+ *)
+ [ -n "$have_sndfile" ] || exit $OTHER_ERROR
+ sndfile-convert -pcm16 "$infile" "$target" || exit $OTHER_ERROR
+ ;;
+ esac
+elif [ -n "$resample_reqd" ]; then
+ resample "$infile" "$target" || exit $OTHER_ERROR
+ resample_reqd=
+fi
+
+if [ ! -f "$target" ]; then
+ echo "rosegarden-audiofile-importer: ERROR: target file not found" 1>&2
+ exit $OTHER_ERROR
+fi
+
+if [ -z "$intermediate" ]; then
+ echo "rosegarden-audiofile-importer: Done" 1>&2
+ exit 0
+fi
+
+if [ -n "$intermediate" -a -n "$rate" -a -z "$filerate" ]; then
+ filerate=`sndfile-info "$target" | grep '^Sample Rate :' | awk '{ print $4; }'`
+ case "$filerate" in
+ [0-9]*) if [ "$filerate" -ne "$rate" ]; then
+ resample_reqd=1
+ fi;;
+ *) echo "rosegarden-audiofile-importer: ERROR: failed to extract samplerate of intermediate file" 1>&2
+ rm "$target"
+ exit $OTHER_ERROR
+ ;;
+ esac
+fi
+
+if [ -n "$resample_reqd" ]; then
+ resample "$target" "$outfile" || exit $OTHER_ERROR
+ rm "$target"
+else
+ mv "$target" "$outfile"
+fi
+
+echo "rosegarden-audiofile-importer: Done" 1>&2
+exit 0
diff --git a/src/helpers/rosegarden-lilypondview b/src/helpers/rosegarden-lilypondview
new file mode 100755
index 0000000..95cc25e
--- /dev/null
+++ b/src/helpers/rosegarden-lilypondview
@@ -0,0 +1,395 @@
+#!/bin/bash
+#
+# Helper program used by Rosegarden to preview and print Lilypond output.
+# Copyright 2004-2008 Chris Cannam and Fervent Software Ltd.
+# Copyright 2006-2008 Heikki Junes.
+# Distributed under the GNU General Public License.
+
+tmpdir=/tmp/$$_lilypondview
+mkdir "$tmpdir" || exit 1
+
+trap "rm -rf \"$tmpdir\"" 0
+
+# Requirements, actual or potential:
+#
+# lilypond (that actually runs, of course)
+# mktemp OR tempfile
+# kpdf OR kghostview OR gpdf OR xpdf OR evince OR acroread
+# kdialog [for graphical mode only]
+# kprinter OR gtklp
+
+prog_lilypond=""
+prog_temp_file=""
+prog_kdialog=""
+prog_pdf_view=""
+prog_printer=""
+
+set eval -- `getopt -n$0 --longoptions="graphical,pdf,print,version,conftest" "gpPv" "$@"`
+
+input_files=""
+pdf_view=""
+printing=""
+graphical=""
+while [ $# -gt 0 ]
+do
+ # Parse options
+ case "$1" in
+ -g|--graphical) graphical=true ;;
+ -p|--print) printing=true ;;
+ -P|--pdf) pdf_view=true ;;
+ -v|--version) print_version=true ;;
+ --conftest) conftest=true ;;
+ esac
+
+ # Check and list the listed LilyPond input files
+ # getopt adds quotation marks ('): "'input.ly'"
+ if [ "`expr match $1 '.*.ly'`" == "`expr length $1 - 1`" -o \
+ "`expr match $1 '.*.ly.gz'`" == "`expr length $1 - 1`" ]; then
+ input="${1:1:`expr length "$1" - 2`}"
+ if [ ! -f "$input" ]; then
+ echo "Error: Can't open \"$input\" for reading" 1>&2
+ exit 1
+ fi
+ input_files="$input_files
+$input"
+ fi
+ shift
+done
+
+#echo "input files: $input_files"
+
+if [ -n "$print_version" ]; then
+ echo "rosegarden-lilypondview v1.6" 1>&2
+ exit 0
+fi
+
+if [ -x "`type -path lilypond`" ]; then
+ lilypond_version="`lilypond --version | grep LilyPond | head -1 | sed 's/^.* //'`"
+ case "$lilypond_version" in
+ 1.*|2.[0-5].*)
+ echo "rosegarden-lilypondview: Unsupported LilyPond version ($lilypond_version)" 1>&2
+ echo "Required: LilyPond v2.6 or newer";;
+ *)
+ prog_lilypond=lilypond;;
+ esac
+else
+ echo "rosegarden-lilypondview: LilyPond unavailable" 1>&2
+ echo "Required: LilyPond"
+fi
+
+reqd=
+
+for x in mktemp tempfile; do
+ if [ -x "`type -path $x`" ]; then
+ prog_temp_file=$x
+ break;
+ fi
+done
+
+if [ -z "$prog_temp_file" ]; then
+ reqd="mktemp OR tempfile, $reqd"
+ echo "rosegarden-lilypondview: No temporary file utility found" 1>&2
+fi
+
+if [ -x "`type -path kdialog`" ]; then
+ prog_kdialog=kdialog
+fi
+
+for x in acroread kpdf kghostview gpdf xpdf evince; do
+ if [ -x "`type -path $x`" ]; then
+ prog_pdf_view=$x
+ break;
+ fi
+done
+
+if [ -z "$prog_pdf_view" ]; then
+ reqd="kpdf OR kghostview OR gpdf OR xpdf OR evince OR acroread, $reqd"
+ echo "rosegarden-lilypondview: No PDF viewer found" 1>&2
+fi
+
+for x in kprinter gtklp; do
+ if [ -x "`type -path $x`" ]; then
+ case "$x" in kprinter) x="$x --stdin";; esac
+ prog_printer=$x
+ break;
+ fi
+done
+
+if [ -z "$prog_printer" ]; then
+ reqd="kprinter OR gtklp, $reqd"
+ echo "rosegarden-lilypondview: No printing program found" 1>&2
+fi
+
+if [ -n "$conftest" ]; then
+ if [ -n "$reqd" ]; then
+ echo "Required: "${reqd%%, }
+ fi
+fi
+
+[ -z "$prog_lilypond" ] && exit 1
+[ -z "$prog_pdf_view" ] && exit 1
+[ -z "$prog_temp_file" ] && exit 1
+
+if [ -n "$conftest" ]; then
+ echo "LilyPond version: $lilypond_version"
+ exit 0
+fi
+
+if [ -z "$prog_kdialog" ]; then
+ # can't do graphical mode
+ echo "rosegarden-lilypondview: Graphical progress dialog requires kdialog utility" 1>&2
+ graphical=""
+fi
+
+if [ -z "$input" ]; then
+cat <<End-of-Usage-message
+Process LilyPond files to PDF files and print/view them.
+
+Usage: rosegarden-lilypondview [OPTION] file.ly ...
+
+Options:
+ -g, --graphical : show Lilypond progress in a graphical dialog
+ -P, --pdf : view created PDF files (DEFAULT)
+ -p, --print : print created PDF files; together with '--pdf', viewing starts first
+ -v, --version : print version of rosegarden-lilypondview
+ --conftest : check that all dependencies are present
+
+example: rosegarden-lilypondview -g file.ly
+
+End-of-Usage-message
+ exit 2
+fi
+
+for x in $input_files; do
+ case "$x" in
+ *.ly|*.ly.gz)
+ input="$x"
+ cp "$input" "$tmpdir/" || exit 1
+
+(
+ dir=`dirname "$input"`
+ base=`basename "$input"`
+ cd "$tmpdir"
+
+ if [ -n "$graphical" ]; then
+ dcopRef=`kdialog --title "Processing" --icon "rosegarden" --progressbar "Processing LilyPond file..." 100`
+ fi
+
+ send_dcop() {
+ if [ -n "$graphical" ]; then
+ dcop $dcopRef "$@"
+ fi
+ }
+
+ trap "send_dcop close" 0
+
+ send_dcop showCancelButton true
+
+ if file "$base" | grep -q gzip; then
+ gunzip "$base"
+ base=`basename "$base" .gz`
+ fi
+
+ includes=`\
+ grep '\\include ' "$base" | \
+ sed -e 's/\\include//' \
+ -e 's/^.*[^a-zA-Z0-9-]\([a-zA-Z0-9-][a-zA-Z0-9-]*.ly\).*$/\1/'`
+
+ for include in $includes; do
+ if [ -r "$dir/$include" ]; then
+ cp "$dir/$include" .
+ elif [ -r "$dir/$include.gz" ]; then
+ gunzip -c "$dir/$include" > ./"$include"
+ fi
+ done
+
+ fileversion=`grep '\\version ' "$base" | head -1 | \
+ sed -e 's/\\version //' -e 's/[^0-9.]//g'`
+
+ args=""
+ convert=""
+echo "LilyPond version is $lilypond_version, file version is $fileversion"
+ case "$lilypond_version" in
+ 2.6.*)
+ args="--format=pdf"
+ case "$fileversion" in
+ 1.*|2.[0-5].*) convert=true;;
+ esac;;
+ 2.8.*)
+ args="--format=pdf"
+ case "$fileversion" in
+ 1.*|2.[0-7].*) convert=true;;
+ esac;;
+ 2.10.*)
+ args="--format=pdf"
+ case "$fileversion" in
+ 1.*|2.[0-9].*) convert=true;;
+ esac;;
+ esac
+
+ logfile="lilypond-output.log"
+ cat </dev/null >"$logfile"
+
+ if [ -n "$convert" ]; then
+ echo "File version is $fileversion against LilyPond version $lilypond_version -- converting..." 1>&2
+ send_dcop setLabel "Updating LilyPond file..."
+ for srcfile in "$base" $includes; do
+ if [ ! -f "$srcfile" ]; then continue; fi
+ case "$fileversion" in
+ 1.*|2.[012345].*)
+ grep -v override-auto-beam-setting "$srcfile" > "${srcfile}_tmp"
+ mv "${srcfile}_tmp" "$srcfile"
+ ;;
+ esac
+ if [ -n "$graphical" ]; then
+ convert-ly "$srcfile" > "${srcfile}_converted" 2> "$logfile" && mv "${srcfile}_converted" "$srcfile"
+ else
+ convert-ly "$srcfile" > "${srcfile}_converted" && mv "${srcfile}_converted" "$srcfile"
+ fi
+ done
+ send_dcop setLabel "Processing LilyPond file..."
+ fi
+
+ if [ -n "$graphical" ] ; then
+ # special bar comment syntax RG exports -- hopefully benign if absent
+ bars=`grep '^%% [0-9][0-9]*$' "$base" | sort -k 1 -n | tail -1 | awk '{ print $2; }'`
+
+ if [ -z "$bars" ]; then
+ staffs=`grep 'Staff *[=<]' "$base" | wc -l`
+ [ "$staffs" -eq 0 ] && staffs=1
+ bars=`grep -v '^ *%' "$base" | wc -l`
+ bars=$(($bars / $staffs))
+ fi
+
+ bars=$(($bars + 5))
+ count=$(($bars * 7 / 3))
+
+ indev=/dev/pts/0
+ if [ ! -c "$indev" ]; then indev=/dev/ptya0; fi
+
+ PROGRESS=`$prog_temp_file`
+
+# echo "Running $prog_lilypond $args \"$base\""
+ $prog_lilypond $args "$base" <$indev 2>&1 | tee -a "$logfile" | \
+ perl -e '
+ $| = 1;
+ print "0\n";
+ $state = 0;
+ $n = "";
+ $base = 0;
+ while (defined ($key = getc)) {
+ if ($key eq "[") { # bar number start mark
+ $state = 1;
+ } elsif ($key eq "]") { # bar number end mark
+ $state = 2;
+ $val = int( ($base + $n) * 100 / '$count' );
+ if ($val > 100) { $val = 100; }
+ print " $val";
+ print "\n";
+ $n = "";
+ } elsif ($key eq "\n") {
+ if ($state == 2) {
+ $base = $base + '$bars'; $state = 0;
+ }
+ } elsif ($state == 1) { # bar number
+ $n = $n . $key;
+ }
+ }
+ print "end\n"
+ ' >& $PROGRESS &
+
+ PROCESSINGSTAGE=0
+ #
+ # Stages:
+ # 0 -- Process LilyPond file
+ # 1 -- Create PDF output
+ # 2 -- Finished
+ #
+ until [ "$PROCESSINGSTAGE" != "0" ]; do
+ sleep 0.2
+ PROGRESSVALUE=`tail -c 4 $PROGRESS`
+ ## Debugging code:
+ # cat $PROGRESS
+ # echo "= $PROGRESSVALUE =="
+ if [ "$PROGRESSVALUE" == "end" ]; then
+ #
+ # Processing was terminated:
+ # - either the number of bars was not known,
+ # - or there appeared an error during processing.
+ #
+ send_dcop setProgress 100
+ PROCESSINGSTAGE=2
+ elif [ "$PROGRESSVALUE" == "100" ]; then
+ PROCESSINGSTAGE=1
+ #
+ # Note: percentage is 100 only after PDF has been created.
+ #
+ send_dcop setProgress 99
+ send_dcop setLabel "Creating PDF output..."
+ else
+ send_dcop setProgress $PROGRESSVALUE
+ fi
+ if [ "true" == `send_dcop wasCancelled` ]; then
+ send_dcop close
+ rm $PROGRESS
+ exit 1;
+ fi
+ done
+ until [ "$PROCESSINGSTAGE" == "2" ]; do
+ sleep 0.2
+ if [ "true" == `send_dcop wasCancelled` ]; then
+ send_dcop close
+ rm $PROGRESS
+ exit 1;
+ fi
+ PROGRESSVALUE=`tail -c 4 $PROGRESS`
+ if [ "$PROGRESSVALUE" == "end" ]; then
+ PROCESSINGSTAGE=2
+ send_dcop setProgress 100
+ fi
+ done
+ ( sleep 2 ; send_dcop close ) &
+ rm $PROGRESS
+ else
+# echo "running $prog_lilypond $args \"$base\"..."
+ $prog_lilypond $args "$base"
+ fi
+
+ target="${base%.*}.pdf"
+
+ if [ -f "$target" ]; then
+ if [ -z "$printing" ]; then
+ $prog_pdf_view "$target"
+ else
+ if [ -n "$pdf_view" ]; then
+ $prog_pdf_view "$target"
+ fi
+ if [ -n "$printing" ]; then
+ $prog_printer < "$target"
+ fi
+ fi
+ exit 0
+ elif [ -n "$graphical" ]; then
+ cat $logfile 1>&2
+ echo 1>&2
+ echo "LilyPond failed" 1>&2
+ LOGGINGFILE=`$prog_temp_file`
+ if [ -n "$graphical" ]; then
+ ( echo
+ echo " ERROR: LilyPond processing failed."
+ echo " LilyPond output follows:"
+ echo
+ cat "$logfile" ) > $LOGGINGFILE
+ $prog_kdialog --textbox $LOGGINGFILE 600 200
+ fi
+ rm $LOGGINGFILE
+ else
+ echo 1>&2
+ echo "LilyPond processing failed." 1>&2
+ fi
+ exit 1
+)
+ ;;
+ *) ;;
+ esac
+done;
diff --git a/src/helpers/rosegarden-project-package b/src/helpers/rosegarden-project-package
new file mode 100755
index 0000000..d9f2cb8
--- /dev/null
+++ b/src/helpers/rosegarden-project-package
@@ -0,0 +1,839 @@
+#!/bin/bash
+#
+# Check Perl requirements before executing the program proper
+if [ "$1" = "--conftest" ]; then
+ reqd=
+ if ! type -path perl >/dev/null; then
+ reqd="Perl 5"
+ else
+ for x in Getopt::Long File::Copy File::Basename XML::Twig; do
+ if ! perl -e "require $x" 2>/dev/null; then
+ reqd="$reqd, Perl module $x"
+ fi
+ done
+ fi
+ if [ -n "$reqd" ]; then
+ echo "Required: ${reqd#, }"
+ exit 1
+ fi
+fi
+exec perl -x "$0" "$@"
+
+#!/usr/bin/perl -w
+# -*- cperl-indent-level: 4 -*-
+#
+# Rosegarden Project file packager
+# Copyright 2005-2008 Chris Cannam and Fervent Software Ltd.
+# Distributed under the GNU General Public License.
+#
+# This program converts between Rosegarden (.rg) files and Rosegarden
+# Project (.rgp) files.
+#
+# A Rosegarden file (.rg) is a single file (in gzipped XML format)
+# that defines a Rosegarden composition in terms of events, segments,
+# programs, plugin data, references to audio files, and so on. Some
+# of these types of information depend on the presence of external
+# files such as the audio files or plugin preset data, without which
+# the file cannot be used.
+#
+# A Rosegarden Project (.rgp) file is a bundle of files, including the
+# Rosegarden file itself, as well as any audio file or other external
+# data it requires, in compressed form. A Rosegarden Project file is
+# intended to be portable and self-contained, but the Rosegarden
+# program itself does not (at the time of writing) understand these
+# files directly.
+#
+# This program can take a Rosegarden file, examine it to find out
+# which other data files it uses, and pack it to create the
+# corresponding Rosegarden Project file. Conversely, it can also take
+# a Rosegarden Project file and unpack it as a project directory for
+# use with Rosegarden.
+
+# TODO:
+# - quiet
+# - versioning
+# - graceful recovery from running out of disk space
+# - mucho tidying
+
+use strict;
+
+use XML::Twig;
+use File::Copy;
+use File::Basename;
+use Getopt::Long;
+
+print STDERR "Rosegarden Project Packager v0.25 (c) Fervent Software Ltd 2005-2008\n";
+print STDERR "This program is Free Software under the GNU General Public License.\n";
+
+my $dcop = undef;
+sub usage {
+ print STDERR "Usage: rosegarden-project-package [--quiet] [--pack] file.rg [file.rgp]\n";
+ print STDERR " rosegarden-project-package [--quiet] --unpack file.rgp\n";
+ print STDERR " rosegarden-project-package [--quiet] --rg file.rgp\n";
+ print STDERR " rosegarden-project-package --conftest\n";
+ if (defined $dcop) {
+ `dcop "$dcop" close`;
+ }
+ exit 2;
+}
+
+my $kdialog = "kdialog --title \"Rosegarden Project\" --icon \"rosegarden\"";
+
+my $pack = 0;
+my $unpack = 0;
+my $conftest = 0;
+my $rg = 0;
+my $quiet = 0;
+my $result = GetOptions("pack" => \$pack,
+ "unpack" => \$unpack,
+ "conftest" => \$conftest,
+ "rg" => \$rg,
+ "quiet" => \$quiet);
+if ($result eq "") {
+ usage;
+}
+
+if (!$conftest) {
+ $dcop = `kdialog --title \"Rosegarden Project Progress\" --icon \"rosegarden\" --progressbar "Please wait..." 100`;
+ chomp $dcop;
+}
+
+my @temporaries = ();
+$SIG{__DIE__} = sub {
+ my $error = shift;
+ $error =~ s/ at .*$/./;
+ `dcop "$dcop" close`;
+ map { system qq{rm -rf $_} } @temporaries;
+ system qq{kdialog --error "$error"};
+ return 1;
+};
+
+sub conftest {
+ my @required = ();
+ system "kdialog -v >/dev/null" and push @required, "kdialog";
+ system "flac --help >/dev/null" and push @required, "flac";
+ # sndfile-convert --help always returns 1
+ system "which sndfile-convert >/dev/null" and push @required, "sndfile-convert";
+# system "oggenc -h >/dev/null 2>&1" and push @required, "oggenc";
+# system "oggdec -h >/dev/null 2>&1" and push @required, "oggdec";
+ system "dcop --help >/dev/null" and push @required, "dcop";
+ return @required;
+}
+
+sub canonicalise {
+ my $b = shift;
+ chomp $b;
+ my $p = shift;
+ chomp $p;
+ $p =~ s,^~/,$ENV{"HOME"}/,;
+ $p =~ s,^~$,$ENV{"HOME"},;
+ $p =~ s,^([^/]),$b/$1,;
+ $p =~ s,/./,/,g;
+ $p =~ s,/$,,;
+ return $p;
+}
+
+sub relativise {
+ my $b = shift;
+ chomp $b;
+ my $p = shift;
+ chomp $p;
+ if ($p =~ m,^$b/,) {
+ $p =~ s,^$b/,,;
+ }
+ return $p;
+}
+
+sub name {
+ my $rgFile = shift;
+ my $n = shift;
+ my $base = basename $rgFile;
+ $base =~ s/\.rg$//i;
+
+ if ($n =~ m,^RG-AUDIO-\d+\.wav(.pk)?$,i or
+ $n =~ m,/RG-AUDIO-\d+\.wav(.pk)?$,i) {
+
+ $n =~ s,RG-AUDIO-(\d+)\.wav,$base-rg-$1.wav,;
+
+ } elsif ($n =~ m,^rg-[0-9-]+.wav(.pk)?$, or
+ $n =~ m,/rg-[0-9-]+.wav(.pk)?$,) {
+
+ $n =~ s,rg-([0-9-]+).wav,$base-rg-$1.wav,;
+ }
+
+ return $n;
+}
+
+sub convertType {
+ my $file = shift;
+ if ($file =~ m/\.(wav|w64)$/i) {
+ return 'flac';
+ } else {
+ return 'copy';
+ }
+}
+
+sub contrib { # Approximate amount of contribution to overall processing time
+ my $file = shift;
+ my $size = (stat $file)[7];
+ if (!defined $size) {
+ return 10.0;
+ }
+ if (convertType($file) eq 'flac' or convertType($file) eq 'ogg') {
+ return $size / 1000.0;
+ } else {
+ return $size / 50000.0;
+ }
+}
+
+sub locate {
+ my $file = shift;
+ if (-f $file) {
+ return $file;
+ }
+ my $code = system qq{$kdialog --warningyesnocancel 'File not found:\n$file\nDo you want to browse for this file now?'};
+ if ($code == 512) { # cancel
+ die "File $file not found.";
+ } elsif ($code == 256) { # no
+ return "";
+ }
+ my $dir = dirname $file;
+ if (! -d $dir) { $dir = $ENV{'HOME'}; }
+ $file = basename $file;
+ $file = `$kdialog --getopenfilename "$dir" "$file"`;
+ chomp $file;
+ return $file;
+}
+
+sub convert {
+ my $source = shift;
+ my $target = shift;
+ print STDERR "$source -> $target\n";
+ $source = locate $source;
+ return if ($source eq "");
+ my $d = dirname $target;
+ print STDERR "Creating directory $d\n";
+ system qq{mkdir -p "$d"} and die "Failed to create directory $d: $!";
+ print STDERR "Convert type is " . convertType($source) . "\n";
+ if (convertType($source) eq 'flac') {
+ print STDERR "Running flac -o $target.rgp.flac $source\n";
+ system qq{flac -s -o "$target.rgp.flac" "$source"} and do {
+ # Conversion failed. First let's assume that's because the
+ # input is a type of WAV file flac doesn't like.
+ system qq{sndfile-convert -pcm24 "$source" "$target.rgp.wav"} and do {
+ die "Failed to convert $source to PCM-24 intermediate file: $!";
+ };
+ system qq{flac -s -o "$target.rgp.flac" "$target.rgp.wav"} and do {
+ # OK, that didn't help.
+ system qq{rm -f "$target.rgp.wav"};
+ die "Failed to convert PCM-24 intermediate file $target.rgp.wav to $target.rgp.flac: $!"; # warn via dialog & recover
+ };
+ # Looks good, remove intermediate file
+ system qq{rm -f "$target.rgp.wav"};
+ };
+ } elsif (convertType($source) eq 'ogg') {
+ print STDERR "Running oggenc -o $target $source\n";
+ system qq{oggenc -o "$target.rgp.ogg" "$source"} and
+ die "Failed to convert $source to $target.rgp.ogg"; # warn via dialog & recover
+ } else {
+ print STDERR "Copying $source to $target\n";
+ copy $source, $target or die "Failed to copy $source to $target: $!";
+ }
+ return 1;
+}
+
+sub rgPack {
+
+ my ($d, $an, $pn);
+ $an = 0;
+ $pn = 0;
+ my $projectDir = "";
+ my %audioFiles = ();
+ my %unusedAudioFiles = ();
+ my @possibles = ();
+ my @indices = ();
+
+ my $rgFile = shift;
+ my $projectFile = shift;
+
+ $rgFile = canonicalise `pwd`, $rgFile;
+ $projectFile = canonicalise `pwd`, $projectFile;
+
+ if (-d $projectFile) {
+ die "Project file $projectFile exists and is a directory -- not overwriting it";
+ }
+
+ if (-f $projectFile) {
+ if (system qq{$kdialog --warningyesno "Project file \"$projectFile\" already exists. Overwrite it?"}) {
+ die "Not overwriting existing project file $projectFile";
+ }
+ }
+
+ my $targetDir = $projectFile . ".d";
+ if (-f $targetDir or -d $targetDir) {
+ system qq{$kdialog --sorry "Packaging directory \"`pwd`/$targetDir\" already exists.\nCannot continue to create project file."};
+ die "Not overwriting existing packaging directory $targetDir";
+ }
+
+ `dcop "$dcop" setLabel "Reading Rosegarden file..."`;
+
+ my $dir = '.';
+ if ($rgFile =~ m,/,) {
+ $dir = $rgFile;
+ $dir =~ s,[^/]*$,,;
+ }
+
+ if ($dir =~ m,^[^/],) {
+ my $wd = `pwd`;
+ chomp $wd;
+ $dir = "$wd/$dir";
+ }
+
+ $dir =~ s,/\.?/,/,g;
+
+ print STDERR "dir is $dir\n";
+
+ my $twig = XML::Twig->new();
+
+ open INZIP, "-|", "gunzip -c $rgFile";
+
+ eval {
+ $twig->parse(\*INZIP);
+ };
+
+ close INZIP;
+
+ my $root = $twig->root;
+ if (!defined $root) { die "No root"; }
+
+ if ($root->gi ne 'rosegarden-data') {
+ die "Not a Rosegarden file";
+ }
+
+ my $audioFilesNode = $root->first_child('audiofiles');
+
+ my $audioPathNode = $audioFilesNode->first_child('audioPath');
+ $projectDir = canonicalise $dir, $audioPathNode->att('value');
+
+ my @audioNodes = $audioFilesNode->children('audio');
+ foreach my $audioNode (@audioNodes) {
+ my $file = $audioNode->att('file');
+ my $id = $audioNode->att('id');
+ my $done = 0;
+ foreach my $segment ($root->children('segment')) {
+ if (defined $segment->att('type') and
+ $segment->att('type') eq "audio" and
+ $segment->att('file') == $id) {
+ $audioFiles{$id} = $file;
+ $done = 1;
+ last;
+ }
+ }
+ if (!$done) { $unusedAudioFiles{$id} = $file; }
+ }
+
+ if (%unusedAudioFiles) {
+ my @args;
+ map {
+ my $id = $_;
+ my $file = $unusedAudioFiles{$id};
+
+ my $haveElsewhere = 0;
+ foreach my $usedFile (values %audioFiles) {
+ if ($usedFile eq $file) {
+ $haveElsewhere = 1;
+ last;
+ }
+ }
+
+ if (!$haveElsewhere) {
+
+ my $fn = canonicalise $projectDir, $file;
+ my $desc = `file "$fn"`;
+ my $sz = `wc -c "$fn"`;
+ chomp $desc;
+ chomp $sz;
+ $sz =~ s,\s+.*,,;
+ $desc =~ s,^$fn: ,,;
+ $desc =~ s,\([^\)]*\)\s+,,g;
+ $fn =~ s,^$projectDir/,[PROJECT]/,;
+ push @args, ($id, "\"$fn - $sz bytes - $desc\"", "off");
+ }
+
+ } sort { $a <=> $b } keys %unusedAudioFiles;
+
+ print STDERR "args are @args\n";
+ my $result = `$kdialog --checklist "The following audio files are referred to in the Rosegarden file,\nbut are not used in any segment.\n\nBy default these will not be included in the project file.\n\nPlease select any that you wish to include." @args`;
+ if ($? == 256) {
+ die "Operation cancelled";
+ }
+ chomp $result;
+ print STDERR "result is $result\n";
+ @indices =
+ map { s/^"([^"]*)"$/$1/; $_ }
+ split '\s', $result;
+ }
+
+ map { $audioFiles{$_} = $unusedAudioFiles{$_} } @indices;
+ @indices = ();
+
+ my @peakFiles = ();
+ map {
+ my $peakFile = canonicalise($projectDir, $_) . ".pk";
+ -f $peakFile and push @peakFiles, $peakFile;
+ } values %audioFiles;
+
+ my %possibleMap;
+
+ my $studioNode = $root->first_child('studio');
+ my @deviceNodes = $studioNode->children('device');
+ foreach my $deviceNode (@deviceNodes) {
+ my @instrumentNodes = $deviceNode->children('instrument');
+ foreach my $instrumentNode (@instrumentNodes) {
+ my @pluginNodes = $instrumentNode->children('plugin');
+ push @pluginNodes, $instrumentNode->children('synth');
+ my @configureNodes;
+ map { push @configureNodes, $_->children('configure') } @pluginNodes;
+ map {
+ my $possible = $_->att('value');
+ my $loc = canonicalise $projectDir, $possible;
+ if (-f $loc && -r $loc) {
+ $possibleMap{$possible} = 1;
+ }
+ } @configureNodes;
+ }
+ }
+
+ @possibles = sort keys %possibleMap;
+
+ `dcop "$dcop" setProgress 5`;
+
+ print STDERR "Possibles: @possibles\n";
+
+ if (@possibles) {
+ print STDERR "$#possibles possibles\n";
+ my @args;
+ my $n = 0;
+ map {
+ my $possible = $_;
+ my $fn = canonicalise $projectDir, $possible;
+ my $desc = `file "$fn"`;
+ my $sz = `wc -c "$fn"`;
+ my $status = "off";
+ chomp $desc;
+ chomp $sz;
+ $sz =~ s,\s+.*,,;
+ $desc =~ s,^$fn: ,,;
+ $desc =~ s,\([^\)]*\)\s+,,g;
+ if ($fn =~ m,^$projectDir/[^/]*$,) {
+ $status = "on";
+ }
+ $fn =~ s,^$projectDir/,(PROJECT)/,;
+ push @args, ($n, "\"$fn - $sz bytes - $desc\"", $status);
+ ++$n;
+ } @possibles;
+ print STDERR "args are @args\n";
+ my $result = `$kdialog --checklist "The following files may be required for use by plugins used in this composition.\n\nPlease select any that you wish to include in the project file." @args`;
+ if ($? == 256) {
+ die "Operation cancelled";
+ }
+ chomp $result;
+ print STDERR "result is $result\n";
+ @indices =
+ map { s/^"([^"]*)"$/$1/; $_ }
+ split '\s', $result;
+ }
+
+ mkdir $targetDir or die "Cannot create packaging directory $targetDir: $!";
+ push @temporaries, $targetDir;
+
+ my @sourceFiles = sort values %audioFiles;
+ push @sourceFiles, @peakFiles;
+ map { push @sourceFiles, $possibles[$_] } @indices;
+
+ print STDERR "Source files: @sourceFiles\n";
+
+ `dcop "$dcop" setProgress 10`;
+
+ my %fileMap;
+
+ my $totalContrib = 0.0;
+ map { $totalContrib += contrib canonicalise $projectDir, $_; } @sourceFiles;
+ if ($totalContrib == 0) {
+ $totalContrib = 10;
+ }
+
+ my $contribCount = 0.0;
+
+ print STDERR "Total contribution: $totalContrib\n";
+
+ my $newProjectDir = basename $rgFile;
+ $newProjectDir =~ s/.rg$//i;
+ if ($newProjectDir eq basename $rgFile) {
+ $newProjectDir = $newProjectDir . ".d";
+ }
+
+ foreach my $origSourceFile (@sourceFiles) {
+ my $sourceCanonical = canonicalise $projectDir, $origSourceFile;
+ my $sourceRelative = relativise $projectDir, $sourceCanonical;
+ my $renamedRelative = name $rgFile, $sourceRelative;
+ if ($sourceRelative =~ m,^/,) {
+ $renamedRelative = basename $renamedRelative;
+ }
+ my $sourceFile = canonicalise $projectDir, $sourceRelative;
+ my $targetFile = canonicalise($targetDir . "/" . $newProjectDir, $renamedRelative);
+ print STDERR "first guess: $sourceFile -> $targetFile (renamedRelative is $renamedRelative)\n";
+ my $count = 1;
+ while (-f $targetFile or -d $targetFile) {
+ print STDERR "$targetFile exists... ";
+ if ($renamedRelative =~ m,\.([^.]+)$,) {
+ $renamedRelative =~ s,^(.*)\.([^.]+)$,$1_$count.$2,;
+ } else {
+ $renamedRelative = $renamedRelative . "_$count";
+ }
+ $targetFile = canonicalise($targetDir . "/" . $newProjectDir, $renamedRelative);
+ ++$count;
+ print STDERR "trying $targetFile\n";
+ }
+ if (convertType($sourceFile) eq 'flac' or
+ convertType($sourceFile) eq 'ogg') {
+ `dcop "$dcop" setLabel "Converting $renamedRelative..."`;
+ } else {
+ `dcop "$dcop" setLabel "Including $renamedRelative..."`;
+ }
+ $fileMap{$origSourceFile} = $renamedRelative;
+ convert $sourceFile, $targetFile;
+ $contribCount += contrib $sourceFile;
+ my $progress = int(10.0 + $contribCount * 82.0 / $totalContrib);
+ `dcop "$dcop" setProgress $progress`;
+ }
+
+ my $code;
+ while (($code = system qq{$kdialog --yesno "Do you want to include any additional files in this project?"}) == 0) {
+ my $file = `$kdialog --getopenfilename "$dir" "*"`;
+ chomp $file;
+ my $targetFile = canonicalise($targetDir . "/" . $newProjectDir, basename $file);
+ convert $file, $targetFile;
+ }
+
+ `dcop "$dcop" setLabel "Converting Rosegarden file..."`;
+
+ $audioPathNode->set_att('value', $newProjectDir);
+
+ foreach my $audioNode (@audioNodes) {
+ if (exists $audioFiles{$audioNode->att('id')}) {
+ if (exists $fileMap{$audioNode->att('file')}) {
+ my $before = $audioNode->att('file');
+ my $after = $fileMap{$before};
+ print STDERR "Renaming $before to $after in XML\n";
+ $audioNode->set_att('file', $after);
+ }
+ } else {
+ $audioNode->cut;
+ }
+ }
+
+ foreach my $deviceNode (@deviceNodes) {
+ my @instrumentNodes = $deviceNode->children('instrument');
+ foreach my $instrumentNode (@instrumentNodes) {
+ my @pluginNodes = $instrumentNode->children('plugin');
+ push @pluginNodes, $instrumentNode->children('synth');
+ my @configureNodes;
+ map { push @configureNodes, $_->children('configure') } @pluginNodes;
+ foreach my $configureNode (@configureNodes) {
+ if (exists $fileMap{$configureNode->att('value')}) {
+ my $before = $configureNode->att('value');
+ my $after = $fileMap{$before};
+ print STDERR "Renaming $before to $after in configure XML\n";
+ $configureNode->set_att('value', $after);
+ }
+ }
+ }
+ }
+
+ my $targetRgFile = $targetDir . "/" . basename $rgFile;
+ my $targetRgXml = $targetRgFile . ".xml";
+
+ print STDERR "out is $targetRgFile\n";
+
+ open OUT, "| gzip -c > $targetRgFile" or die "Failed to open $targetRgFile for writing via gzip";
+
+ $twig->print(\*OUT);
+
+ close OUT;
+
+ `dcop "$dcop" setLabel "Packaging..."`;
+ `dcop "$dcop" setProgress 95`;
+
+ system qq{rm -f "$projectFile"} and die "Overwriting old project file failed: $!";
+
+ my $baseTarget = basename $targetDir;
+ my $baseRg = basename $targetRgFile;
+ my $baseProject = basename $projectFile;
+ print STDERR "dir is $targetDir\nbaseTarget is $baseTarget\nbaseRg is $baseRg\nnewProjectDir is $newProjectDir\n";
+ system qq{mkdir -p "$targetDir/$newProjectDir"};
+ system qq{cd "$targetDir"; tar cf - "$baseRg" "$newProjectDir" | gzip --fast -c > "$baseProject" ; mv "$baseProject" ..} and die "Making tarball failed";
+
+ `dcop "$dcop" setLabel "Done"`;
+ `dcop "$dcop" setProgress 100`;
+
+ system qq{rm -r "$targetDir"} and die "Cleaning up packaging directory failed: $!";
+
+ sleep 1;
+
+ my $completeProject = canonicalise $targetDir, "../$baseProject";
+ system qq{$kdialog --msgbox "Packaging complete."};
+
+ `dcop "$dcop" close`;
+
+ return 1;
+}
+
+sub rgUnpack {
+
+ my $rgFile = shift;
+ my $projectFile = shift;
+
+ $rgFile = canonicalise `pwd`, $rgFile;
+ $projectFile = canonicalise `pwd`, $projectFile;
+
+ if (! -f $projectFile) {
+ die "Project file $projectFile not found";
+ }
+
+ $rgFile =~ /.rg$/i or $rgFile = "$rgFile.rg";
+
+ # directory containing target rg file
+ my $rgDir = dirname $rgFile;
+
+ my $origRgFile = basename $projectFile;
+ $origRgFile =~ s/\.rg\.rgp$/.rg/i;
+ $origRgFile =~ s/\.rgp$/.rg/i;
+
+ if (-d $rgFile) {
+ die "Target Rosegarden file $rgFile exists and is a directory -- not overwriting";
+ }
+
+ if (-f $rgFile) {
+ if (system qq{$kdialog --warningyesno "Rosegarden file \"$rgFile\" already exists. Overwrite it?"}) {
+ die "Not overwriting existing Rosegarden file $rgFile";
+ }
+ }
+
+ my $projectDir = $rgFile;
+ $projectDir =~ s/\.[^\.\/]*$//;
+ if ($projectDir eq $rgFile) {
+ $projectDir = "$projectDir.d";
+ }
+ # projectDir is now absolute or relative to cwd
+
+ if (-f $projectDir) {
+
+ die "Project directory $projectDir already exists and is a file -- not overwriting it";
+
+ } elsif (-d $projectDir) {
+
+ if (system qq{$kdialog --warningyesno "Project directory \"$projectDir\" already exists. Overwrite any duplicate files?"}) {
+ die "Not overwriting existing project directory $projectDir";
+ }
+
+ } else {
+ push @temporaries, $projectDir;
+ system qq{mkdir -p "$projectDir"} and die "Failed to create target project directory $projectDir";
+ }
+
+ my %dirs;
+ map { chomp; s,/.*$,,; $dirs{$_} = 1; } `gunzip -c "$projectFile" | tar tf -`;
+
+ my $origProjectDir = "";
+ for my $targetDir (keys %dirs) {
+ if ($targetDir =~ /.rg$/ and !($targetDir =~ m,/,)) {
+ $origRgFile = $targetDir;
+ next;
+ }
+ if ($targetDir eq $origRgFile) {
+ next;
+ }
+ if ($origProjectDir eq "") {
+ $origProjectDir = $targetDir;
+ next;
+ }
+ }
+ # origProjectDir is now relative to the base path
+ # origRgFile is a base name only (no path)
+
+ # We have:
+ # rgFile -> target to unpack rg file to
+ # projectFile -> original project file
+ # rgDir -> target directory to contain rg file
+ # origRgFile -> original rg file (virtual) in same dir as project file
+ # projectDir -> target to unpack project files to (rgFile.d)
+ # origProjectDir -> original name of project directory (probably origRgFile.d)
+
+ # procedure:
+ # create a temporary directory tmpdir
+ # go there and unpack the original project file
+ # this will create original rg file and original project dir in tmpdir
+ # move original project dir from tmpdir to rgDir
+ # unpack audio files in new project dir
+ # move original rg file from tmpdir to rgFile
+ # if the project dir basename differs from the original project dir basename,
+ # edit the rgFile (just the audioPath node) appropriately.
+ # !!! extra above: show error and exit if rgFile exists and is a directory
+
+ my $tmpdir = "rgp_tmp_$$"; ##!!! clean up
+ if (-e $tmpdir) { die "Temporary directory $tmpdir already exists, abandoning"; }
+ system qq{ mkdir "$tmpdir" } and die "Failed to create temporary directory $tmpdir";
+
+ push @temporaries, $tmpdir;
+
+ `dcop "$dcop" setLabel "Unpacking..."`;
+ `gunzip -c "$projectFile" | ( cd "$tmpdir"; tar xf - )`;
+
+ `dcop "$dcop" setProgress 20`;
+
+ for my $item (glob "$tmpdir/$origProjectDir/*") {
+ system qq{mv "$item" "$projectDir/"} and die "Failed to move $item to $projectDir";
+ }
+
+ my @encFiles = `ls $projectDir/*.rgp.flac $projectDir/*.rgp.ogg 2>/dev/null`;
+ my $count = 0;
+ foreach my $encFile (@encFiles) {
+ chomp $encFile;
+ my $origFile = $encFile;
+ $origFile =~ s/\.rgp\.(flac|ogg)$//;
+ my $decoder = 'flac -s -f -d';
+ if ($encFile =~ /ogg$/) {
+ $decoder = 'oggdec';
+ }
+ if (system qq{$decoder -o "$origFile" "$encFile"}) {
+ die "Failed to unpack $origFile"; # should warn & continue
+ } else {
+ system qq{rm "$encFile"};
+ }
+ my $progress = @encFiles;
+ $progress = int(25 + $count * 75 / $progress);
+ ++$count;
+ `dcop "$dcop" setProgress $progress`;
+ }
+
+ # we now have the target project directory set up correctly:
+ # all we need is the rg file
+
+ open INZIP, "-|", "gunzip -c $tmpdir/$origRgFile" or die "Failed to open original Rosegarden file $tmpdir/$origRgFile";
+ open OUTZIP, "| gzip -c > $rgFile" or die "Failed to open target Rosegarden file $rgFile for writing";
+ my $encProjDir = basename $projectDir;
+ while (<INZIP>) {
+ if (/<audioPath\s/) {
+ s/<audioPath\s+value=\"[^\"]*"\s*\/>/<audioPath value="$encProjDir"\/>/;
+ }
+ print OUTZIP;
+ }
+ close INZIP;
+ close OUTZIP;
+
+ `dcop "$dcop" setLabel "Done"`;
+ `dcop "$dcop" setProgress 100`;
+
+ sleep 1;
+
+ system qq{rm -rf "$tmpdir"};
+ `dcop "$dcop" close`;
+
+ @temporaries = ();
+ return 1;
+}
+
+
+if (!$pack && !$unpack && !$conftest && !$rg) {
+ if (exists $ARGV[0]) {
+ if ($ARGV[0] =~ /.rg$/i) {
+ $pack = 1;
+ } elsif ($ARGV[0] =~ /.rgp$/i) {
+ $unpack = 1;
+ } else {
+ usage;
+ }
+ } else {
+ usage;
+ }
+}
+
+my @required = conftest;
+if (@required) {
+ print STDERR "The following additional packages are required but not available in the PATH:\n";
+ print STDERR join ' ', @required;
+ print STDERR "\n";
+ if ($conftest) {
+ print "Required: ";
+ print join ', ', @required;
+ print "\n";
+ exit 1;
+ } else {
+ die "Configuration requirements not met\nThe following helper applications were not found: " . join(', ', @required);
+ }
+}
+
+if ($conftest) {
+ exit 0;
+}
+
+if ($pack) {
+
+ if ($unpack || $conftest || $rg) { usage; }
+
+ my ($rgFile, $projectFile);
+
+ if (exists $ARGV[0]) {
+ $rgFile = $ARGV[0];
+ chomp $rgFile;
+ }
+ if (! -f $rgFile) {
+ die "$rgFile: No such file or directory\n";
+ }
+
+ if (exists $ARGV[1]) {
+ $projectFile = $ARGV[1];
+ chomp $projectFile;
+ } else {
+ $projectFile = $rgFile;
+ $projectFile =~ s/\.rg$/.rgp/;
+ if ($projectFile eq $rgFile) {
+ $projectFile = $rgFile . ".rgp";
+ }
+ }
+
+ rgPack $rgFile, $projectFile;
+
+} elsif ($unpack || $rg) {
+
+ if ($pack || $conftest) { usage; }
+ if ($unpack && $rg) { usage; }
+
+ my $projectFile;
+
+ if (exists $ARGV[0]) {
+ $projectFile = $ARGV[0];
+ chomp $projectFile;
+ }
+ if (! -f $projectFile) {
+ die "$projectFile: No such file or directory\n";
+ }
+
+ my $rgFile;
+ if (exists $ARGV[1]) {
+ $rgFile = $ARGV[1];
+ chomp $rgFile;
+ } else {
+ $rgFile = $projectFile;
+ $rgFile =~ s/\.rg\.rgp$/.rg/i;
+ $rgFile =~ s/\.rgp$/.rg/i;
+ }
+
+ rgUnpack $rgFile, $projectFile;
+
+ if ($rg) {
+ system qq{rosegarden "$rgFile"};
+ }
+}
+
diff --git a/src/misc/Debug.cpp b/src/misc/Debug.cpp
new file mode 100644
index 0000000..33d5464
--- /dev/null
+++ b/src/misc/Debug.cpp
@@ -0,0 +1,396 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include "Strings.h"
+#include "misc/Debug.h"
+#include "Debug.h"
+
+#if KDE_VERSION < KDE_MAKE_VERSION(3,2,0)
+#include <qdatetime.h>
+#include <qpoint.h>
+#include <qrect.h>
+#include <qregion.h>
+#include <qstringlist.h>
+#include <qpen.h>
+#include <qbrush.h>
+#include <qsize.h>
+#include <kurl.h>
+#endif
+
+#include "base/Event.h"
+#include "base/Segment.h"
+#include "base/RealTime.h"
+#include "base/Colour.h"
+#include "gui/editors/guitar/Chord.h"
+#include "gui/editors/guitar/Fingering.h"
+
+#ifndef NDEBUG
+
+kdbgstream&
+operator<<(kdbgstream &dbg, const std::string &s)
+{
+ dbg << strtoqstr(s);
+ return dbg;
+}
+
+kdbgstream&
+operator<<(kdbgstream &dbg, const Rosegarden::Event &e)
+{
+ dbg << "Event type : " << e.getType() << endl;
+
+ dbg << "\tDuration : " << e.getDuration()
+ << "\n\tAbsolute Time : " << e.getAbsoluteTime()
+ << endl;
+
+ // for (Event::PropertyMap::const_iterator i = e.properties().begin();
+ // i != e.properties().end(); ++i) {
+ // dbg << "\t\t" << (*i).first << " : "
+ // << ((*i).second)->unparse() << '\n';
+ // }
+
+ // e.dump(std::cerr);
+
+ return dbg;
+}
+
+kdbgstream&
+operator<<(kdbgstream &dbg, const Rosegarden::Segment &t)
+{
+ dbg << "Segment for instrument " << t.getTrack()
+ << " starting at " << t.getStartTime() << endl;
+
+ for (Rosegarden::Segment::const_iterator i = t.begin();
+ i != t.end(); ++i) {
+ if (!(*i)) {
+ dbg << "WARNING : skipping null event ptr\n";
+ continue;
+ }
+
+ dbg << "Dumping Event : \n";
+ dbg << *(*i) << endl;
+ }
+
+ return dbg;
+}
+
+kdbgstream&
+operator<<(kdbgstream &dbg, const Rosegarden::RealTime &t)
+{
+ dbg << t.toString();
+ return dbg;
+}
+
+kdbgstream&
+operator<<(kdbgstream &dbg, const Rosegarden::Colour &c)
+{
+ dbg << "Colour : rgb = " << c.getRed() << "," << c.getGreen() << "," << c.getBlue();
+ return dbg;
+}
+
+kdbgstream&
+operator<<(kdbgstream &dbg, const Rosegarden::Guitar::Chord &c)
+{
+ dbg << "Chord root = " << c.getRoot() << ", ext = '" << c.getExt() << "'";
+
+// for(unsigned int i = 0; i < c.getNbFingerings(); ++i) {
+// dbg << "\nFingering " << i << " : " << c.getFingering(i).toString().c_str();
+// }
+
+ Rosegarden::Guitar::Fingering f = c.getFingering();
+
+ dbg << ", fingering : ";
+
+ for(unsigned int j = 0; j < 6; ++j) {
+ int pos = f[j];
+ if (pos >= 0)
+ dbg << pos << ' ';
+ else
+ dbg << "x ";
+ }
+ return dbg;
+}
+
+#ifdef NOT_DEFINED
+
+ostream&
+kdbgostreamAdapter::operator<<(bool i)
+{
+ m_kdbgStream << i;
+ return *this;
+}
+
+ostream&
+kdbgostreamAdapter::operator<<(short i)
+{
+ m_kdbgStream << i;
+ return *this;
+}
+
+ostream&
+kdbgostreamAdapter::operator<<(unsigned short i)
+{
+ m_kdbgStream << i;
+ return *this;
+}
+
+ostream&
+kdbgostreamAdapter::operator<<(char i)
+{
+ m_kdbgStream << i;
+ return *this;
+}
+
+ostream&
+kdbgostreamAdapter::operator<<(unsigned char i)
+{
+ m_kdbgStream << i;
+ return *this;
+}
+
+ostream&
+kdbgostreamAdapter::operator<<(int i)
+{
+ m_kdbgStream << i;
+ return *this;
+}
+
+ostream&
+kdbgostreamAdapter::operator<<(unsigned int i)
+{
+ m_kdbgStream << i;
+ return *this;
+}
+
+ostream&
+kdbgostreamAdapter::operator<<(long i)
+{
+ m_kdbgStream << i;
+ return *this;
+}
+
+ostream&
+kdbgostreamAdapter::operator<<(unsigned long i)
+{
+ m_kdbgStream << i;
+ return *this;
+}
+
+ostream&
+kdbgostreamAdapter::operator<<(const QString& string)
+{
+ m_kdbgStream << string;
+ return *this;
+}
+
+ostream&
+kdbgostreamAdapter::operator<<(const char *string)
+{
+ m_kdbgStream << string;
+ return *this;
+}
+
+ostream&
+kdbgostreamAdapter::operator<<(const QCString& string)
+{
+ m_kdbgStream << string;
+ return *this;
+}
+
+ostream&
+kdbgostreamAdapter::operator<<(void * p)
+{
+ m_kdbgStream << p;
+ return *this;
+}
+
+ostream&
+kdbgostreamAdapter::operator<<(KDBGFUNC f)
+{
+ (*f)(m_kdbgStream);
+ return *this;
+}
+
+ostream&
+kdbgostreamAdapter::operator<<(double d)
+{
+ m_kdbgStream << d;
+ return *this;
+}
+
+#endif
+
+// ostream& endl( ostream &s)
+// {
+// s << "\n"; return s;
+// }
+
+// void DBCheckThrow()
+// {
+// using Rosegarden::Int;
+
+// Rosegarden::Event ev;
+
+// try {
+// int pitch = ev.get<Int>("BLAH");
+
+// } catch (Rosegarden::Event::NoData) {
+// RG_DEBUG << "DBCheckThrow()" << endl;
+// }
+// }
+
+#if KDE_VERSION < KDE_MAKE_VERSION(3,2,0)
+kdbgstream&
+operator<<(kdbgstream &dbg, const QDateTime& time)
+{
+ dbg << time.toString();
+ return dbg;
+}
+
+kdbgstream&
+operator<<(kdbgstream &dbg, const QDate& date)
+{
+ dbg << date.toString();
+ return dbg;
+}
+
+kdbgstream&
+operator<<(kdbgstream &dbg, const QTime& time )
+{
+ dbg << time.toString();
+ return dbg;
+}
+
+kdbgstream&
+operator<<(kdbgstream &dbg, const QPoint& p )
+{
+ dbg << "(" << p.x() << ", " << p.y() << ")";
+ return dbg;
+}
+
+kdbgstream&
+operator<<(kdbgstream &dbg, const QSize& s )
+{
+ dbg << "[" << s.width() << "x" << s.height() << "]";
+ return dbg;
+}
+
+kdbgstream&
+operator<<(kdbgstream &dbg, const QRect& r )
+{
+ dbg << "[" << r.x() << "," << r.y() << " - "
+ << r.width() << "x" << r.height() << "]";
+ return dbg;
+}
+
+kdbgstream&
+operator<<(kdbgstream &dbg, const QRegion& reg )
+{
+ dbg << "[ ";
+
+ QMemArray<QRect>rs = reg.rects();
+ for (uint i = 0;i < rs.size();++i)
+ dbg << QString("[%1,%2 - %3x%4] ").arg(rs[i].x()).arg(rs[i].y())
+ .arg(rs[i].width()).arg(rs[i].height() ) ;
+
+ dbg << "]";
+ return dbg;
+}
+
+kdbgstream&
+operator<<(kdbgstream &dbg, const KURL& u )
+{
+ dbg << u.prettyURL();
+ return dbg;
+}
+
+kdbgstream&
+operator<<(kdbgstream &dbg, const QStringList& l )
+{
+ dbg << "(";
+ dbg << l.join(",");
+ dbg << ")";
+
+ return dbg;
+}
+
+kdbgstream&
+operator<<(kdbgstream &dbg, const QColor& c )
+{
+ if ( c.isValid() )
+ dbg << c.name();
+ else
+ dbg << "(invalid/default)";
+ return dbg;
+}
+
+kdbgstream&
+operator<<(kdbgstream &dbg, const QPen& p )
+{
+ static const char* const s_penStyles[] = {
+ "NoPen", "SolidLine", "DashLine", "DotLine", "DashDotLine",
+ "DashDotDotLine"
+ };
+ static const char* const s_capStyles[] = {
+ "FlatCap", "SquareCap", "RoundCap"
+ };
+ dbg << "[ style:";
+ dbg << s_penStyles[ p.style() ];
+ dbg << " width:";
+ dbg << p.width();
+ dbg << " color:";
+ if ( p.color().isValid() )
+ dbg << p.color().name();
+ else
+ dbg << "(invalid/default)";
+ if ( p.width() > 0 ) {
+ dbg << " capstyle:";
+ dbg << s_capStyles[ p.capStyle() >> 4 ];
+ }
+ dbg << " ]";
+ return dbg;
+}
+
+kdbgstream&
+operator<<(kdbgstream &dbg, const QBrush& b)
+{
+ static const char* const s_brushStyles[] = {
+ "NoBrush", "SolidPattern", "Dense1Pattern", "Dense2Pattern", "Dense3Pattern",
+ "Dense4Pattern", "Dense5Pattern", "Dense6Pattern", "Dense7Pattern",
+ "HorPattern", "VerPattern", "CrossPattern", "BDiagPattern", "FDiagPattern",
+ "DiagCrossPattern"
+ };
+
+ dbg << "[ style: ";
+ dbg << s_brushStyles[ b.style() ];
+ dbg << " color: ";
+ if ( b.color().isValid() )
+ dbg << b.color().name() ;
+ else
+ dbg << "(invalid/default)";
+ if ( b.pixmap() )
+ dbg << " has a pixmap";
+ dbg << " ]";
+ return dbg;
+}
+#endif
+
+#endif
+
diff --git a/src/misc/Debug.h b/src/misc/Debug.h
new file mode 100644
index 0000000..8f8f4dd
--- /dev/null
+++ b/src/misc/Debug.h
@@ -0,0 +1,166 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef ROSEDEBUG_H
+#define ROSEDEBUG_H
+
+#include <string>
+#include <iostream>
+#include <kdebug.h>
+#include <kdeversion.h>
+
+#if KDE_VERSION < KDE_MAKE_VERSION(3,2,0)
+class QDateTime;
+class QDate;
+class QTime;
+class QPoint;
+class QSize;
+class QRect;
+class QRegion;
+class KURL;
+class QStringList;
+class QColor;
+class QPen;
+class QBrush;
+#endif
+
+namespace Rosegarden { class Event; class Segment; class RealTime; class Colour; namespace Guitar { class Chord; } }
+
+#define KDEBUG_AREA 200000
+#define KDEBUG_AREA_NOTATION 200001
+#define KDEBUG_AREA_MATRIX 200002
+#define KDEBUG_AREA_SEQUENCER 200003
+#define KDEBUG_AREA_SEQUENCEMANAGER 200004
+
+#define RG_DEBUG kdDebug(KDEBUG_AREA)
+#define NOTATION_DEBUG kdDebug(KDEBUG_AREA_NOTATION)
+#define MATRIX_DEBUG kdDebug(KDEBUG_AREA_MATRIX)
+#define SEQUENCER_DEBUG kdDebug(KDEBUG_AREA_SEQUENCER)
+#define SEQMAN_DEBUG kdDebug(KDEBUG_AREA_SEQUENCEMANAGER)
+
+#ifndef NDEBUG
+
+kdbgstream&
+operator<<(kdbgstream&, const std::string&);
+
+kdbgstream&
+operator<<(kdbgstream&, const Rosegarden::Event&);
+
+kdbgstream&
+operator<<(kdbgstream&, const Rosegarden::Segment&);
+
+kdbgstream&
+operator<<(kdbgstream&, const Rosegarden::RealTime&);
+
+kdbgstream&
+operator<<(kdbgstream&, const Rosegarden::Colour&);
+
+kdbgstream&
+operator<<(kdbgstream&, const Rosegarden::Guitar::Chord&);
+
+#else
+
+inline kndbgstream&
+operator<<(kndbgstream &s, const std::string&) { return s; }
+
+inline kndbgstream&
+operator<<(kndbgstream &s, const Rosegarden::Event&) { return s; }
+
+inline kndbgstream&
+operator<<(kndbgstream &s, const Rosegarden::Segment&) { return s; }
+
+inline kndbgstream&
+operator<<(kndbgstream &s, const Rosegarden::RealTime&) { return s; }
+
+inline kndbgstream&
+operator<<(kndbgstream &s, const Rosegarden::Colour&) { return s; }
+
+inline kndbgstream&
+operator<<(kndbgstream &s, const Rosegarden::Guitar::Chord&) { return s; }
+
+#endif
+
+#ifndef NO_TIMING
+
+#include <iostream>
+#include <ctime>
+
+#define START_TIMING \
+ clock_t dbgStart = clock();
+#define ELAPSED_TIME \
+ ((clock() - dbgStart) * 1000 / CLOCKS_PER_SEC)
+#define PRINT_ELAPSED(n) \
+ RG_DEBUG << n << ": " << ELAPSED_TIME << "ms elapsed" << endl;
+
+#else
+
+#define START_TIMING
+#define ELAPSED_TIME 0
+#define PRINT_ELAPSED(n)
+
+#endif
+
+
+
+
+// This doesn't work - keeping it just in case I somehow get it
+// working someday
+
+#ifdef NOT_DEFINED
+
+// can't be bothered to even get this to compile with gcc-3.0 at the
+// moment
+
+class kdbgostreamAdapter : public std::ostream
+{
+public:
+ kdbgostreamAdapter(kdbgstream &e) : m_kdbgStream(e) {}
+
+ std::ostream& operator<<(bool i);
+ std::ostream& operator<<(short i);
+ std::ostream& operator<<(unsigned short i);
+ std::ostream& operator<<(char i);
+ std::ostream& operator<<(unsigned char i);
+ std::ostream& operator<<(int i);
+ std::ostream& operator<<(unsigned int i);
+ std::ostream& operator<<(long i);
+ std::ostream& operator<<(unsigned long i);
+ std::ostream& operator<<(const QString& str);
+ std::ostream& operator<<(const char *str);
+ std::ostream& operator<<(const QCString& str);
+ std::ostream& operator<<(void * p);
+ std::ostream& operator<<(KDBGFUNC f);
+ std::ostream& operator<<(double d);
+
+ kdbgstream& dbgStream() { return m_kdbgStream; }
+
+protected:
+ kdbgstream &m_kdbgStream;
+};
+
+#endif
+
+// std::ostream& endl(std::ostream& s);
+
+void DBCheckThrow();
+
+
+#endif
diff --git a/src/misc/Strings.cpp b/src/misc/Strings.cpp
new file mode 100644
index 0000000..3c139dc
--- /dev/null
+++ b/src/misc/Strings.cpp
@@ -0,0 +1,110 @@
+// -*- c-basic-offset: 4 -*-
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include "Strings.h"
+#include "Strings.h"
+
+#include "base/Composition.h"
+#include "base/Segment.h"
+#include "base/Event.h"
+
+#include <qtextcodec.h>
+
+
+
+QString strtoqstr(const std::string &str)
+{
+ return QString::fromUtf8(str.c_str());
+}
+
+QString strtoqstr(const Rosegarden::PropertyName &p)
+{
+ return QString::fromUtf8(p.c_str());
+}
+
+std::string qstrtostr(const QString &qstr)
+{
+ return std::string(qstr.utf8().data());
+}
+
+/**
+ * Unlike strtod(3) or QString::toDouble(), this is locale-independent
+ * and always uses '.' as a decimal point. We use it when reading
+ * things like configuration values from XML files where we want to
+ * guarantee the same value is used regardless of surrounding locale.
+ */
+double strtodouble(const std::string &s)
+{
+ int dp = 0;
+ int sign = 1;
+ int i = 0;
+ double result = 0.0;
+ size_t len = s.length();
+
+ result = 0.0;
+
+ while (i < len && isspace(s[i]))
+ ++i;
+
+ if (i < len && s[i] == '-')
+ sign = -1;
+
+ while (i < len) {
+
+ char c = s[i];
+
+ if (isdigit(c)) {
+
+ double d = c - '0';
+
+ if (dp > 0) {
+ for (int p = dp; p > 0; --p)
+ d /= 10.0;
+ ++dp;
+ } else {
+ result *= 10.0;
+ }
+
+ result += d;
+
+ } else if (c == '.') {
+ dp = 1;
+ }
+
+ ++i;
+ }
+
+ return result * sign;
+}
+
+double qstrtodouble(const QString &s)
+{
+ return strtodouble(qstrtostr(s));
+}
+
+std::string
+convertFromCodec(std::string text, QTextCodec *codec)
+{
+ if (codec)
+ return qstrtostr(codec->toUnicode(text.c_str(), text.length()));
+ else
+ return text;
+}
+
diff --git a/src/misc/Strings.h b/src/misc/Strings.h
new file mode 100644
index 0000000..898a775
--- /dev/null
+++ b/src/misc/Strings.h
@@ -0,0 +1,38 @@
+// -*- c-basic-offset: 4 -*-
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _ROSE_STRINGS_H_
+#define _ROSE_STRINGS_H_
+
+#include <string>
+#include <qstring.h>
+#include "PropertyName.h"
+#include "Exception.h"
+
+extern QString strtoqstr(const std::string &);
+extern QString strtoqstr(const Rosegarden::PropertyName &);
+extern std::string qstrtostr(const QString &);
+extern double strtodouble(const std::string &);
+extern double qstrtodouble(const QString &);
+
+class QTextCodec;
+extern std::string convertFromCodec(std::string, QTextCodec *);
+
+#endif
diff --git a/src/misc/stableheaders.h b/src/misc/stableheaders.h
new file mode 100644
index 0000000..db6b86e
--- /dev/null
+++ b/src/misc/stableheaders.h
@@ -0,0 +1,208 @@
+#ifndef STABLEHEADERS_H_
+#define STABLEHEADERS_H_
+
+// Standard C++ library
+#include <algorithm>
+#include <cassert>
+#include <cctype>
+#include <cmath>
+#include <cstdio>
+#include <cstdlib>
+#include <cstring>
+#include <ctime>
+#include <deque>
+#include <exception>
+#include <fstream>
+#include <iomanip>
+#include <ios>
+#include <iostream>
+#include <iterator>
+#include <list>
+#include <map>
+#include <set>
+#include <sstream>
+#include <stack>
+#include <string>
+#include <strstream>
+#include <utility>
+#include <vector>
+
+// QT3 headers
+
+// Common headers, or used by sources generated by moc
+#include <qmap.h>
+#include <qglobal.h>
+#include <private/qucomextra_p.h>
+#include <qmetaobject.h>
+#include <qobjectdefs.h>
+#include <qsignalslotimp.h>
+#include <qstyle.h>
+
+// Headers used by Rosegarden or KDE3
+#include <qaccel.h>
+#include <qapplication.h>
+#include <qbitmap.h>
+#include <qbrush.h>
+#include <qbuffer.h>
+#include <qbuttongroup.h>
+#include <qbutton.h>
+#include <qcanvas.h>
+#include <qcheckbox.h>
+#include <qcolor.h>
+#include <qcombobox.h>
+#include <qcstring.h>
+#include <qcursor.h>
+#include <qdatastream.h>
+#include <qdatetime.h>
+#include <qdialog.h>
+#include <qdict.h>
+#include <qdir.h>
+#include <qdom.h>
+#include <qdragobject.h>
+#include <qdrawutil.h>
+#include <qevent.h>
+#include <qeventloop.h>
+#include <qfile.h>
+#include <qfileinfo.h>
+#include <qfont.h>
+#include <qfontinfo.h>
+#include <qfontmetrics.h>
+#include <qframe.h>
+#include <qgarray.h>
+#include <qgrid.h>
+#include <qgroupbox.h>
+#include <qguardedptr.h>
+#include <qhbox.h>
+#include <qheader.h>
+#include <qiconset.h>
+#include <qimage.h>
+#include <qinputdialog.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qlineedit.h>
+#include <qlistbox.h>
+#include <qlistview.h>
+#include <qmemarray.h>
+#include <qmutex.h>
+#include <qobject.h>
+#include <qobjectlist.h>
+#include <qpaintdevicemetrics.h>
+#include <qpainter.h>
+#include <qpalette.h>
+#include <qpen.h>
+#include <qpixmap.h>
+#include <qpointarray.h>
+#include <qpoint.h>
+#include <qpopupmenu.h>
+#include <qprinter.h>
+#include <qprogressdialog.h>
+#include <qptrdict.h>
+#include <qptrlist.h>
+#include <qpushbutton.h>
+#include <qradiobutton.h>
+#include <qrect.h>
+#include <qregexp.h>
+#include <qregion.h>
+#include <qscrollbar.h>
+#include <qscrollview.h>
+#include <qsessionmanager.h>
+#include <qsignalmapper.h>
+#include <qsize.h>
+#include <qsizepolicy.h>
+#include <qslider.h>
+#include <qsocketnotifier.h>
+#include <qspinbox.h>
+#include <qsplitter.h>
+#include <qstring.h>
+#include <qstringlist.h>
+#include <qstrlist.h>
+#include <qtable.h>
+#include <qtabwidget.h>
+#include <qtextcodec.h>
+#include <qtextedit.h>
+#include <qtextstream.h>
+#include <qthread.h>
+#include <qtimer.h>
+#include <qtoolbutton.h>
+#include <qtooltip.h>
+#include <qvalidator.h>
+#include <qvaluelist.h>
+#include <qvaluevector.h>
+#include <qvariant.h>
+#include <qvbox.h>
+#include <qvgroupbox.h>
+#include <qwhatsthis.h>
+#include <qwidget.h>
+#include <qwidgetstack.h>
+#include <qwmatrix.h>
+#include <qxml.h>
+
+// KDE3 headers
+#include <dcopclient.h>
+#include <dcopobject.h>
+#include <dcopref.h>
+#include <kaboutdata.h>
+#include <kaccel.h>
+#include <kactioncollection.h>
+#include <kaction.h>
+#include <kapp.h>
+#include <kapplication.h>
+#include <karrowbutton.h>
+#include <kcmdlineargs.h>
+#include <kcolordialog.h>
+#include <kcombobox.h>
+#include <kcommand.h>
+#include <kcompletion.h>
+#include <kconfig.h>
+#include <kcursor.h>
+#include <kdcopactionproxy.h>
+#include <kdebug.h>
+#include <kdeversion.h>
+#include <kdialogbase.h>
+#include <kdialog.h>
+#include <kdiskfreesp.h>
+#include <kdockwidget.h>
+#include <kedittoolbar.h>
+#include <kfiledialog.h>
+#include <kfile.h>
+#include <kfilterdev.h>
+#include <kfontrequester.h>
+#include <kglobal.h>
+#include <kglobalsettings.h>
+#include <kiconloader.h>
+#include <kinputdialog.h>
+#include <kio/netaccess.h>
+#include <kkeydialog.h>
+#include <kled.h>
+#include <klineeditdlg.h>
+#include <klineedit.h>
+#include <klistview.h>
+#include <klocale.h>
+#include <kmainwindow.h>
+#include <kmessagebox.h>
+#include <kmimetype.h>
+#include <kpixmapeffect.h>
+#include <kpopupmenu.h>
+#include <kprinter.h>
+#include <kprocess.h>
+#include <kpushbutton.h>
+#include <ksqueezedtextlabel.h>
+#include <kstandarddirs.h>
+#include <kstatusbar.h>
+#include <kstdaccel.h>
+#include <kstdaction.h>
+#include <kstddirs.h>
+#include <ktabwidget.h>
+#include <ktempfile.h>
+#include <ktip.h>
+#include <ktoolbar.h>
+#include <kuniqueapplication.h>
+#include <kurl.h>
+#include <kxmlguiclient.h>
+#include <kxmlguifactory.h>
+
+#define private protected // fugly
+#include <kprogress.h>
+#undef private
+
+#endif /*STABLEHEADERS_H_*/
diff --git a/src/sequencer/ControlBlockMmapper.cpp b/src/sequencer/ControlBlockMmapper.cpp
new file mode 100644
index 0000000..d9bf83d
--- /dev/null
+++ b/src/sequencer/ControlBlockMmapper.cpp
@@ -0,0 +1,81 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include "ControlBlockMmapper.h"
+
+#include <fcntl.h>
+#include <unistd.h>
+#include <errno.h>
+#include <sys/mman.h>
+
+#include "misc/Debug.h"
+
+namespace Rosegarden
+{
+
+ControlBlockMmapper::ControlBlockMmapper(QString fileName)
+ : m_fileName(fileName),
+ m_fd( -1),
+ m_mmappedBuffer(0),
+ m_mmappedSize(sizeof(ControlBlock)),
+ m_controlBlock(0)
+{
+ m_fd = ::open(m_fileName.latin1(), O_RDWR);
+
+ if (m_fd < 0) {
+ SEQMAN_DEBUG << "ControlBlockMmapper : Couldn't open " << m_fileName
+ << endl;
+ throw Exception(std::string("Couldn't open ")
+ + m_fileName.latin1());
+ }
+
+ //
+ // mmap() file for reading
+ //
+ m_mmappedBuffer = (char*)::mmap(0, m_mmappedSize,
+ PROT_READ, MAP_SHARED, m_fd, 0);
+
+ if (m_mmappedBuffer == (void*) - 1) {
+
+ SEQUENCER_DEBUG << QString("mmap failed : (%1) %2\n").
+ arg(errno).arg(strerror(errno));
+
+ throw Exception("mmap failed");
+ }
+
+ SEQMAN_DEBUG << "ControlBlockMmapper : mmap size : " << m_mmappedSize
+ << " at " << (void*)m_mmappedBuffer << endl;
+
+ // Create new control block on file
+ m_controlBlock = new (m_mmappedBuffer) ControlBlock;
+}
+
+ControlBlockMmapper::~ControlBlockMmapper()
+{
+ ::munmap(m_mmappedBuffer, m_mmappedSize);
+ ::close(m_fd);
+}
+
+}
diff --git a/src/sequencer/ControlBlockMmapper.h b/src/sequencer/ControlBlockMmapper.h
new file mode 100644
index 0000000..55d4c9f
--- /dev/null
+++ b/src/sequencer/ControlBlockMmapper.h
@@ -0,0 +1,94 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _MMAPPEDCONTROLBLOCK_H_
+#define _MMAPPEDCONTROLBLOCK_H_
+
+#include <qstring.h>
+
+#include "sound/MappedEvent.h"
+#include "sound/ControlBlock.h"
+
+namespace Rosegarden
+{
+
+class ControlBlockMmapper
+{
+public:
+ ControlBlockMmapper(QString fileName);
+ ~ControlBlockMmapper();
+
+ QString getFileName() { return m_fileName; }
+
+ // delegate ControlBlock's interface
+ InstrumentId getInstrumentForTrack(unsigned int trackId)
+ { return m_controlBlock->getInstrumentForTrack(trackId); }
+
+ InstrumentId getInstrumentForEvent(unsigned int dev,
+ unsigned int chan)
+ { return m_controlBlock->getInstrumentForEvent(dev, chan); }
+
+ bool isTrackMuted(unsigned int trackId)
+ { return m_controlBlock->isTrackMuted(trackId); }
+
+ bool isTrackArmed(unsigned int trackId)
+ { return m_controlBlock->isTrackArmed(trackId); }
+
+ InstrumentId getInstrumentForMetronome()
+ { return m_controlBlock->getInstrumentForMetronome(); }
+
+ bool isMetronomeMuted() { return m_controlBlock->isMetronomeMuted(); }
+
+ bool isSolo() { return m_controlBlock->isSolo(); }
+
+ bool isMidiRoutingEnabled()
+ { return m_controlBlock->isMidiRoutingEnabled(); }
+
+ TrackId getSelectedTrack()
+ { return m_controlBlock->getSelectedTrack(); }
+
+ MidiFilter getThruFilter()
+ { return m_controlBlock->getThruFilter(); }
+
+ MidiFilter getRecordFilter()
+ { return m_controlBlock->getRecordFilter(); }
+
+ // for transfer to SequencerMmapper
+ ControlBlock *getControlBlock()
+ { return m_controlBlock; }
+
+protected:
+
+ //--------------- Data members ---------------------------------
+ QString m_fileName;
+ int m_fd;
+ void* m_mmappedBuffer;
+ size_t m_mmappedSize;
+ ControlBlock* m_controlBlock;
+};
+
+}
+
+#endif // _MMAPPEDCONTROLBLOCK_H_
diff --git a/src/sequencer/MmappedSegment.cpp b/src/sequencer/MmappedSegment.cpp
new file mode 100644
index 0000000..57b3dc9
--- /dev/null
+++ b/src/sequencer/MmappedSegment.cpp
@@ -0,0 +1,702 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include "MmappedSegment.h"
+#include "misc/Debug.h"
+
+#include "sound/MappedComposition.h"
+#include "sound/Midi.h"
+
+//#define DEBUG_META_ITERATOR 1
+//#define DEBUG_PLAYING_AUDIO_FILES 1
+
+namespace Rosegarden
+{
+
+MmappedSegment::MmappedSegment(const QString filename)
+ : m_fd( -1),
+ m_mmappedSize(0),
+ m_mmappedRegion(0),
+ m_mmappedEventBuffer((MappedEvent*)0),
+ m_filename(filename)
+{
+ SEQUENCER_DEBUG << "mmapping " << filename << endl;
+
+ map();
+}
+
+bool MmappedSegment::isMetronome()
+{
+ return (getFileName().contains("metronome", false) > 0);
+}
+
+
+
+void MmappedSegment::map()
+{
+ QFileInfo fInfo(m_filename);
+ if (!fInfo.exists()) {
+ SEQUENCER_DEBUG << "MmappedSegment::map() : file " << m_filename << " doesn't exist\n";
+ throw Exception("file not found");
+ }
+
+ m_mmappedSize = fInfo.size();
+
+ m_fd = ::open(m_filename.latin1(), O_RDWR);
+
+ m_mmappedRegion = ::mmap(0, m_mmappedSize, PROT_READ, MAP_SHARED, m_fd, 0);
+
+ if (m_mmappedRegion == (void*) - 1) {
+
+ SEQUENCER_DEBUG << QString("mmap failed : (%1) %2\n").
+ arg(errno).arg(strerror(errno));
+
+ throw Exception("mmap failed");
+ }
+
+ m_mmappedEventBuffer = (MappedEvent *)((size_t *)m_mmappedRegion + 1);
+
+ SEQUENCER_DEBUG << "MmappedSegment::map() : "
+ << (void*)m_mmappedRegion << "," << m_mmappedSize << endl;
+
+}
+
+MmappedSegment::~MmappedSegment()
+{
+ unmap();
+}
+
+void MmappedSegment::unmap()
+{
+ ::munmap(m_mmappedRegion, m_mmappedSize);
+ ::close(m_fd);
+}
+
+size_t
+MmappedSegment::getNbMappedEvents() const
+{
+ if (m_mmappedRegion || !m_mmappedSize) {
+
+ // The shared memory area consists of one size_t giving the
+ // number of following mapped events, followed by the mapped
+ // events themselves.
+
+ // So this is the number of mapped events that we expect:
+ size_t nominal = *(size_t *)m_mmappedRegion;
+
+ // But we want to be sure not to read off the end of the
+ // shared memory area, so just in case, this is the number of
+ // events that can actually be accommodated in the memory area
+ // as we see it:
+ size_t actual = (m_mmappedSize - sizeof(size_t)) /
+ sizeof(MappedEvent);
+
+ return std::min(nominal, actual);
+
+ } else
+ return 0;
+}
+
+bool MmappedSegment::remap(size_t newSize)
+{
+ SEQUENCER_DEBUG << "remap() from " << m_mmappedSize << " to "
+ << newSize << endl;
+
+ if (m_mmappedSize == newSize) {
+
+ SEQUENCER_DEBUG << "remap() : sizes are identical, remap not forced - "
+ << "nothing to do\n";
+ return false;
+ }
+
+#ifdef linux
+ void *oldRegion = m_mmappedRegion;
+ m_mmappedRegion = (MappedEvent*)::mremap(m_mmappedRegion, m_mmappedSize, newSize, MREMAP_MAYMOVE);
+ if (m_mmappedRegion != oldRegion) {
+ SEQUENCER_DEBUG << "NOTE: buffer moved from " << oldRegion <<
+ " to " << (void *)m_mmappedRegion << endl;
+ }
+#else
+ ::munmap(m_mmappedRegion, m_mmappedSize);
+ m_mmappedRegion = (MappedEvent*)::mmap(0, newSize, PROT_READ, MAP_SHARED, m_fd, 0);
+#endif
+
+ if (m_mmappedRegion == (void*) - 1) {
+
+ SEQUENCER_DEBUG << QString("mremap failed : (%1) %2\n").
+ arg(errno).arg(strerror(errno));
+
+ throw Exception("mremap failed");
+ }
+
+ m_mmappedEventBuffer = (MappedEvent *)((size_t *)m_mmappedRegion + 1);
+ m_mmappedSize = newSize;
+
+ return true;
+}
+
+MmappedSegment::iterator::iterator(MmappedSegment* s)
+ : m_s(s), m_currentEvent(m_s->getBuffer())
+{}
+
+MmappedSegment::iterator& MmappedSegment::iterator::operator=(const iterator& it)
+{
+ if (&it == this)
+ return * this;
+
+ m_s = it.m_s;
+ m_currentEvent = it.m_currentEvent;
+
+ return *this;
+}
+
+MmappedSegment::iterator& MmappedSegment::iterator::operator++()
+{
+ if (!atEnd()) {
+
+ do
+ ++m_currentEvent;
+ while (!atEnd() && (m_currentEvent->getType() == 0));
+ // skip null events - there can be some if the file has been
+ // zeroed out after events have been deleted
+
+ } else {
+
+ SEQUENCER_DEBUG << "MmappedSegment::iterator::operator++() " << this
+ << " - reached end of stream\n";
+
+ }
+
+ return *this;
+}
+
+MmappedSegment::iterator MmappedSegment::iterator::operator++(int)
+{
+ iterator r = *this;
+
+ if (!atEnd()) {
+ do
+ ++m_currentEvent;
+ while (!atEnd() && m_currentEvent->getType() == 0);
+
+ }
+
+ return r;
+}
+
+MmappedSegment::iterator& MmappedSegment::iterator::operator+=(int offset)
+{
+ m_currentEvent += offset;
+
+ if (atEnd()) {
+ m_currentEvent = m_s->getBuffer() + m_s->getNbMappedEvents();
+ }
+
+ return *this;
+}
+
+MmappedSegment::iterator& MmappedSegment::iterator::operator-=(int offset)
+{
+ m_currentEvent -= offset;
+ if (m_currentEvent < m_s->getBuffer()) {
+ m_currentEvent = m_s->getBuffer();
+ }
+
+ return *this;
+}
+
+
+bool MmappedSegment::iterator::operator==(const iterator& it)
+{
+ return (m_currentEvent == it.m_currentEvent) || (atEnd() == it.atEnd());
+}
+
+void MmappedSegment::iterator::reset()
+{
+ m_currentEvent = m_s->getBuffer();
+}
+
+const MappedEvent &MmappedSegment::iterator::operator*()
+{
+ return *m_currentEvent;
+}
+
+bool MmappedSegment::iterator::atEnd() const
+{
+ return (m_currentEvent == 0) ||
+ (m_currentEvent > (m_s->getBuffer() + m_s->getNbMappedEvents() - 1));
+}
+
+//----------------------------------------
+
+MmappedSegmentsMetaIterator::MmappedSegmentsMetaIterator(
+ mmappedsegments& segments,
+ ControlBlockMmapper* controlBlockMmapper)
+ : m_controlBlockMmapper(controlBlockMmapper),
+ m_segments(segments)
+{
+ for (mmappedsegments::iterator i = m_segments.begin();
+ i != m_segments.end(); ++i)
+ m_iterators.push_back(new MmappedSegment::iterator(i->second));
+}
+
+MmappedSegmentsMetaIterator::~MmappedSegmentsMetaIterator()
+{
+ clear();
+}
+
+void MmappedSegmentsMetaIterator::addSegment(MmappedSegment* ms)
+{
+ MmappedSegment::iterator* iter = new MmappedSegment::iterator(ms);
+ moveIteratorToTime(*iter, m_currentTime);
+ m_iterators.push_back(iter);
+}
+
+void MmappedSegmentsMetaIterator::deleteSegment(MmappedSegment* ms)
+{
+ for (segmentiterators::iterator i = m_iterators.begin(); i != m_iterators.end(); ++i) {
+ if ((*i)->getSegment() == ms) {
+ SEQUENCER_DEBUG << "deleteSegment : found segment to delete : "
+ << ms->getFileName() << endl;
+ delete (*i);
+ m_iterators.erase(i);
+ break;
+ }
+ }
+}
+
+void MmappedSegmentsMetaIterator::clear()
+{
+ for (unsigned int i = 0; i < m_iterators.size(); ++i)
+ delete m_iterators[i];
+
+ m_iterators.clear();
+}
+
+void MmappedSegmentsMetaIterator::reset()
+{
+ m_currentTime.sec = m_currentTime.nsec = 0;
+
+ for (segmentiterators::iterator i = m_iterators.begin(); i != m_iterators.end(); ++i) {
+ (*i)->reset();
+ }
+
+}
+
+bool MmappedSegmentsMetaIterator::jumpToTime(const RealTime& startTime)
+{
+ SEQUENCER_DEBUG << "jumpToTime(" << startTime << ")" << endl;
+
+ reset();
+
+ bool res = true;
+
+ m_currentTime = startTime;
+
+ for (segmentiterators::iterator i = m_iterators.begin(); i != m_iterators.end(); ++i)
+ if (!moveIteratorToTime(*(*i), startTime))
+ res = false;
+
+ return res;
+}
+
+bool MmappedSegmentsMetaIterator::moveIteratorToTime(MmappedSegment::iterator& iter,
+ const RealTime& startTime)
+{
+ while ((!iter.atEnd()) &&
+ (iter.peek()->getEventTime() < startTime) &&
+ ((iter.peek()->getEventTime() + iter.peek()->getDuration()) < startTime)
+ ) {
+ ++iter;
+ }
+ bool res = !iter.atEnd();
+
+ return res;
+}
+
+bool MmappedSegmentsMetaIterator::acceptEvent(MappedEvent *evt, bool evtIsFromMetronome)
+{
+ if (evt->getType() == 0)
+ return false; // discard those right away
+
+ if (evtIsFromMetronome) {
+ if (evt->getType() == MappedEvent::MidiSystemMessage &&
+ evt->getData1() == MIDI_TIMING_CLOCK) {
+ /*
+ std::cout << "MmappedSegmentsMetaIterator::acceptEvent - "
+ << "found clock" << std::endl;
+ */
+ return true;
+ }
+
+ return !m_controlBlockMmapper->isMetronomeMuted();
+ }
+
+ // else, evt is not from metronome : first check if we're soloing (i.e. playing only the selected track)
+ if (m_controlBlockMmapper->isSolo())
+ return (evt->getTrackId() == m_controlBlockMmapper->getSelectedTrack());
+
+ // finally we're not soloing, so check if track is muted
+ TrackId track = evt->getTrackId();
+ bool muted = m_controlBlockMmapper->isTrackMuted(evt->getTrackId());
+
+#ifdef DEBUG_META_ITERATOR
+
+ SEQUENCER_DEBUG << "MSMI::acceptEvent: track " << track << " muted status: " << muted << endl;
+#endif
+
+ return !muted;
+}
+
+
+bool
+MmappedSegmentsMetaIterator::fillCompositionWithEventsUntil(bool /*firstFetch*/,
+ MappedComposition* c,
+ const RealTime& startTime,
+ const RealTime& endTime)
+{
+#ifdef DEBUG_META_ITERATOR
+ SEQUENCER_DEBUG << "MSMI::fillCompositionWithEventsUntil " << startTime << " -> " << endTime << endl;
+#endif
+
+ m_currentTime = endTime;
+
+ // keep track of the segments which still have valid events
+ std::vector<bool> validSegments;
+ for (unsigned int i = 0; i < m_segments.size(); ++i)
+ validSegments.push_back(true);
+
+ bool foundOneEvent = false, eventsRemaining = false;
+
+ do {
+ foundOneEvent = false;
+
+ for (unsigned int i = 0; i < m_iterators.size(); ++i) {
+
+ MmappedSegment::iterator* iter = m_iterators[i];
+
+ //std::cerr << "Iterating on Segment #" << i << std::endl;
+
+#ifdef DEBUG_META_ITERATOR
+
+ SEQUENCER_DEBUG << "MSMI::fillCompositionWithEventsUntil : "
+ << "checking segment #" << i << " "
+ << iter->getSegment()->getFileName() << endl;
+#endif
+
+ if (!validSegments[i]) {
+#ifdef DEBUG_META_ITERATOR
+ SEQUENCER_DEBUG << "MSMI::fillCompositionWithEventsUntil : "
+ << "no more events to get for this slice "
+ << "in segment #" << i << endl;
+#endif
+
+ continue; // skip this segment
+ }
+
+ bool evtIsFromMetronome = iter->getSegment()->isMetronome();
+
+ if (iter->atEnd()) {
+#ifdef DEBUG_META_ITERATOR
+ SEQUENCER_DEBUG << "MSMI::fillCompositionWithEventsUntil : "
+ << endTime
+ << " reached end of segment #"
+ << i << endl;
+#endif
+
+ continue;
+ } else if (!evtIsFromMetronome) {
+ eventsRemaining = true;
+ }
+
+ if ((**iter).getEventTime() < endTime) {
+
+ MappedEvent *evt = new MappedEvent(*(*iter));
+
+ // set event's instrument
+ //
+ if (evtIsFromMetronome) {
+
+ evt->setInstrument(m_controlBlockMmapper->
+ getInstrumentForMetronome());
+
+ } else {
+
+ evt->setInstrument(m_controlBlockMmapper->
+ getInstrumentForTrack(evt->getTrackId()));
+
+ }
+
+#ifdef DEBUG_META_ITERATOR
+ SEQUENCER_DEBUG << "MSMI::fillCompositionWithEventsUntil : " << endTime
+ << " inserting evt from segment #"
+ << i
+ << " : trackId: " << evt->getTrackId()
+ << " - inst: " << evt->getInstrument()
+ << " - type: " << evt->getType()
+ << " - time: " << evt->getEventTime()
+ << " - duration: " << evt->getDuration()
+ << " - data1: " << (unsigned int)evt->getData1()
+ << " - data2: " << (unsigned int)evt->getData2()
+ << " - metronome event: " << evtIsFromMetronome
+ << endl;
+#endif
+
+ if (evt->getType() == MappedEvent::TimeSignature) {
+
+ // Process time sig and tempo changes along with
+ // everything else, as the sound driver probably
+ // wants to know when they happen
+
+ c->insert(evt);
+
+ } else if (evt->getType() == MappedEvent::Tempo) {
+
+ c->insert(evt);
+
+ } else if (evt->getType() == MappedEvent::MidiSystemMessage &&
+
+ // #1048388:
+ // Ensure sysex heeds mute status, but ensure
+ // clocks etc still get through
+ evt->getData1() != MIDI_SYSTEM_EXCLUSIVE) {
+
+ c->insert(evt);
+
+ } else if (acceptEvent(evt, evtIsFromMetronome) &&
+
+ ((evt->getEventTime() + evt->getDuration() > startTime) ||
+ (evt->getDuration() == RealTime::zeroTime &&
+ evt->getEventTime() == startTime))) {
+
+ // std::cout << "inserting event" << std::endl;
+
+ /*
+ std::cout << "Inserting event (type = "
+ << evt->getType() << ")" << std::endl;
+ */
+
+
+ c->insert(evt);
+
+ } else {
+
+#ifdef DEBUG_META_ITERATOR
+ std::cout << "MSMI: skipping event"
+ << " - event time = " << evt->getEventTime()
+ << ", duration = " << evt->getDuration()
+ << ", startTime = " << startTime << std::endl;
+#endif
+
+ delete evt;
+ }
+
+ if (!evtIsFromMetronome)
+ foundOneEvent = true;
+ ++(*iter);
+
+ } else {
+ validSegments[i] = false; // no more events to get from this segment
+#ifdef DEBUG_META_ITERATOR
+
+ SEQUENCER_DEBUG << "fillCompositionWithEventsUntil : no more events to get from segment #"
+ << i << endl;
+#endif
+
+ }
+
+ }
+
+ } while (foundOneEvent);
+
+#ifdef DEBUG_META_ITERATOR
+
+ SEQUENCER_DEBUG << "fillCompositionWithEventsUntil : eventsRemaining = " << eventsRemaining << endl;
+#endif
+
+ return eventsRemaining || foundOneEvent;
+}
+
+void MmappedSegmentsMetaIterator::resetIteratorForSegment(const QString& filename)
+{
+ for (segmentiterators::iterator i = m_iterators.begin(); i != m_iterators.end(); ++i) {
+ MmappedSegment::iterator* iter = *i;
+
+ if (iter->getSegment()->getFileName() == filename) {
+ SEQUENCER_DEBUG << "MSMI::resetIteratorForSegment(" << filename << ") : found iterator\n";
+ // delete iterator and create another one
+ MmappedSegment* ms = (*i)->getSegment();
+ delete iter;
+ m_iterators.erase(i);
+ iter = new MmappedSegment::iterator(ms);
+ m_iterators.push_back(iter);
+ moveIteratorToTime(*iter, m_currentTime);
+ break;
+ }
+
+ }
+}
+
+void
+MmappedSegmentsMetaIterator::getAudioEvents(std::vector<MappedEvent> &v)
+{
+ v.clear();
+
+ for (mmappedsegments::iterator i = m_segments.begin();
+ i != m_segments.end(); ++i) {
+
+ MmappedSegment::iterator itr(i->second);
+
+ while (!itr.atEnd()) {
+
+ if ((*itr).getType() != MappedEvent::Audio) {
+ ++itr;
+ continue;
+ }
+
+ MappedEvent evt(*itr);
+ ++itr;
+
+ if (m_controlBlockMmapper->isTrackMuted(evt.getTrackId())) {
+#ifdef DEBUG_PLAYING_AUDIO_FILES
+ std::cout << "MSMI::getAudioEvents - "
+ << "track " << evt.getTrackId() << " is muted" << std::endl;
+#endif
+
+ continue;
+ }
+
+ if (m_controlBlockMmapper->isSolo() == true &&
+ evt.getTrackId() != m_controlBlockMmapper->getSelectedTrack()) {
+#ifdef DEBUG_PLAYING_AUDIO_FILES
+ std::cout << "MSMI::getAudioEvents - "
+ << "track " << evt.getTrackId() << " is not solo track" << std::endl;
+#endif
+
+ continue;
+ }
+
+ v.push_back(evt);
+ }
+ }
+}
+
+
+std::vector<MappedEvent>&
+MmappedSegmentsMetaIterator::getPlayingAudioFiles(const RealTime &
+ songPosition)
+{
+ // Clear playing audio segments
+ //
+ m_playingAudioSegments.clear();
+
+#ifdef DEBUG_PLAYING_AUDIO_FILES
+
+ std::cout << "MSMI::getPlayingAudioFiles" << std::endl;
+#endif
+
+ for (mmappedsegments::iterator i = m_segments.begin();
+ i != m_segments.end(); ++i) {
+
+ MmappedSegment::iterator iter(i->second);
+
+ bool found = false;
+
+ //!!! any point to this loop at all? can found ever fail?
+ for (segmentiterators::iterator sI = m_iterators.begin();
+ sI != m_iterators.end(); ++sI) {
+ if ((*sI)->getSegment() == iter.getSegment())
+ found = true;
+ }
+
+ if (!found)
+ continue;
+
+ while (!iter.atEnd()) {
+ if ((*iter).getType() != MappedEvent::Audio) {
+ ++iter;
+ continue;
+ }
+
+ //std::cout << "CONSTRUCTING MAPPEDEVENT" << std::endl;
+ MappedEvent evt(*iter);
+
+ // Check for this track being muted or soloed
+ //
+ if (m_controlBlockMmapper->isTrackMuted(evt.getTrackId()) == true) {
+#ifdef DEBUG_PLAYING_AUDIO_FILES
+ std::cout << "MSMI::getPlayingAudioFiles - "
+ << "track " << evt.getTrackId() << " is muted" << std::endl;
+#endif
+
+ ++iter;
+ continue;
+ }
+
+ if (m_controlBlockMmapper->isSolo() == true &&
+ evt.getTrackId() != m_controlBlockMmapper->getSelectedTrack()) {
+#ifdef DEBUG_PLAYING_AUDIO_FILES
+ std::cout << "MSMI::getPlayingAudioFiles - "
+ << "track " << evt.getTrackId() << " is not solo track" << std::endl;
+#endif
+
+ ++iter;
+ continue;
+ }
+
+ // If there's an audio event and it should be playing at this time
+ // then flag as such.
+ //
+ if (songPosition > evt.getEventTime() - RealTime(1, 0) &&
+ songPosition < evt.getEventTime() + evt.getDuration()) {
+
+#ifdef DEBUG_PLAYING_AUDIO_FILES
+ std::cout << "MSMI::getPlayingAudioFiles - "
+ << "instrument id = " << evt.getInstrument() << std::endl;
+
+
+ std::cout << "MSMI::getPlayingAudioFiles - "
+ << " id " << evt.getRuntimeSegmentId() << ", audio event time = " << evt.getEventTime() << std::endl;
+ std::cout << "MSMI::getPlayingAudioFiles - "
+ << "audio event duration = " << evt.getDuration() << std::endl;
+
+
+#endif // DEBUG_PLAYING_AUDIO_FILES
+
+ m_playingAudioSegments.push_back(evt);
+ }
+
+ ++iter;
+ }
+
+ //std::cout << "END OF ITERATOR" << std::endl << std::endl;
+
+ }
+
+ return m_playingAudioSegments;
+}
+
+}
+
diff --git a/src/sequencer/MmappedSegment.h b/src/sequencer/MmappedSegment.h
new file mode 100644
index 0000000..32e2ea8
--- /dev/null
+++ b/src/sequencer/MmappedSegment.h
@@ -0,0 +1,185 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _MMAPPED_SEGMENT_H_
+#define _MMAPPED_SEGMENT_H_
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <sys/mman.h>
+#include <unistd.h>
+#include <errno.h>
+
+#include <iostream>
+
+#include <klocale.h>
+#include <kstandarddirs.h>
+
+#include <dcopclient.h>
+#include <qdatetime.h>
+#include <qstring.h>
+#include <qdir.h>
+#include <qbuffer.h>
+
+#include "ControlBlockMmapper.h"
+#include "sound/MappedInstrument.h"
+
+namespace Rosegarden {
+
+class MappedComposition;
+
+// Seems not to be properly defined under some gcc 2.95 setups
+#ifndef MREMAP_MAYMOVE
+# define MREMAP_MAYMOVE 1
+#endif
+
+/**
+ * An mmap()ed segment
+ */
+class MmappedSegment
+{
+public:
+ MmappedSegment(const QString filename);
+ ~MmappedSegment();
+
+ bool remap(size_t newSize);
+ QString getFileName() const { return m_filename; }
+ bool isMetronome();
+ MappedEvent* getBuffer() { return m_mmappedEventBuffer; }
+ size_t getSize() const { return m_mmappedSize; }
+ size_t getNbMappedEvents() const;
+
+ class iterator
+ {
+ public:
+ iterator(MmappedSegment* s);
+ iterator& operator=(const iterator&);
+ bool operator==(const iterator&);
+ bool operator!=(const iterator& it) { return !operator==(it); }
+
+ bool atEnd() const;
+
+ /// go back to beginning of stream
+ void reset();
+
+ iterator& operator++();
+ iterator operator++(int);
+ iterator& operator+=(int);
+ iterator& operator-=(int);
+
+ const MappedEvent &operator*();
+ const MappedEvent* peek() const { return m_currentEvent; }
+
+ MmappedSegment* getSegment() { return m_s; }
+ const MmappedSegment* getSegment() const { return m_s; }
+
+ private:
+ iterator();
+
+ protected:
+ //--------------- Data members ---------------------------------
+
+ MmappedSegment* m_s;
+ MappedEvent* m_currentEvent;
+ };
+
+protected:
+ void map();
+ void unmap();
+
+ //--------------- Data members ---------------------------------
+ int m_fd;
+ size_t m_mmappedSize;
+// unsigned int m_nbMappedEvents;
+ void *m_mmappedRegion;
+ MappedEvent* m_mmappedEventBuffer;
+ QString m_filename;
+};
+
+class MmappedSegmentsMetaIterator
+{
+public:
+
+ typedef std::map<QString, MmappedSegment*> mmappedsegments;
+
+ MmappedSegmentsMetaIterator(mmappedsegments&,
+ ControlBlockMmapper*);
+ ~MmappedSegmentsMetaIterator();
+
+ /// reset all iterators to beginning
+ void reset();
+ bool jumpToTime(const RealTime&);
+
+ /**
+ * Fill mapped composition with events from current point until
+ * specified time @return true if there are non-metronome events
+ * remaining, false if end of composition was reached
+ */
+ bool fillCompositionWithEventsUntil(bool firstFetch,
+ MappedComposition*,
+ const RealTime& start,
+ const RealTime& end);
+
+ void resetIteratorForSegment(const QString& filename);
+
+ void addSegment(MmappedSegment*);
+ void deleteSegment(MmappedSegment*);
+
+ void getAudioEvents(std::vector<MappedEvent> &);
+
+ // Manipulate a vector of currently mapped audio segments so that we
+ // can cross check them against PlayableAudioFiles (and stop if
+ // necessary). This will account for muting/soloing too I should
+ // hope.
+ //
+ //!!! to be obsoleted, hopefully
+ std::vector<MappedEvent>& getPlayingAudioFiles
+ (const RealTime &songPosition);
+
+protected:
+ bool acceptEvent(MappedEvent*, bool evtIsFromMetronome);
+
+ /// Delete all iterators
+ void clear();
+ bool moveIteratorToTime(MmappedSegment::iterator&,
+ const RealTime&);
+
+ //--------------- Data members ---------------------------------
+
+ ControlBlockMmapper* m_controlBlockMmapper;
+
+ RealTime m_currentTime;
+ mmappedsegments& m_segments;
+
+ typedef std::vector<MmappedSegment::iterator*> segmentiterators;
+ segmentiterators m_iterators;
+
+ std::vector<MappedEvent> m_playingAudioSegments;
+};
+
+}
+
+#endif // _MMAPPED_SEGMENT_H_
diff --git a/src/sequencer/RosegardenSequencerApp.cpp b/src/sequencer/RosegardenSequencerApp.cpp
new file mode 100644
index 0000000..4c26efb
--- /dev/null
+++ b/src/sequencer/RosegardenSequencerApp.cpp
@@ -0,0 +1,1850 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include "RosegardenSequencerApp.h"
+#include <kapplication.h>
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <sys/mman.h>
+#include <unistd.h>
+#include <errno.h>
+
+#include <iostream>
+
+#include <klocale.h>
+#include <kstandarddirs.h>
+
+#include <dcopclient.h>
+#include <qdatetime.h>
+#include <qstring.h>
+#include <qdir.h>
+#include <qbuffer.h>
+#include <qvaluevector.h>
+
+#include "misc/Debug.h"
+#include "ControlBlockMmapper.h"
+#include "MmappedSegment.h"
+#include "gui/application/RosegardenDCOP.h"
+#include "sound/ControlBlock.h"
+#include "sound/SoundDriver.h"
+#include "sound/SoundDriverFactory.h"
+#include "sound/MappedInstrument.h"
+#include "base/Profiler.h"
+#include "sound/PluginFactory.h"
+
+namespace Rosegarden
+{
+
+// The default latency and read-ahead values are actually sent
+// down from the GUI every time playback or recording starts
+// so the local values are kind of meaningless.
+//
+//
+RosegardenSequencerApp::RosegardenSequencerApp() :
+ DCOPObject("RosegardenSequencerIface"),
+ m_driver(0),
+ m_transportStatus(STOPPED),
+ m_songPosition(0, 0),
+ m_lastFetchSongPosition(0, 0),
+ m_readAhead(0, 80000000), // default value
+ m_audioMix(0, 60000000), // default value
+ m_audioRead(0, 100000000), // default value
+ m_audioWrite(0, 200000000), // default value
+ m_smallFileSize(128),
+ m_loopStart(0, 0),
+ m_loopEnd(0, 0),
+ m_studio(new MappedStudio()),
+ m_segmentFilesPath(KGlobal::dirs()->resourceDirs("tmp").last()),
+ m_metaIterator(0),
+ m_controlBlockMmapper(0),
+ m_transportToken(1),
+ m_isEndOfCompReached(false)
+{
+ SEQUENCER_DEBUG << "Registering with DCOP server" << endl;
+
+ // Without DCOP we are nothing
+ QCString realAppId = kapp->dcopClient()->registerAs(kapp->name(), false);
+
+ if (realAppId.isNull()) {
+ SEQUENCER_DEBUG << "RosegardenSequencer cannot register "
+ << "with DCOP server" << endl;
+ close();
+ }
+
+ // Initialise the MappedStudio
+ //
+ initialiseStudio();
+
+ // Creating this object also initialises the Rosegarden ALSA/JACK
+ // interface for both playback and recording. MappedStudio
+ // audio faders are also created.
+ //
+ m_driver = SoundDriverFactory::createDriver(m_studio);
+ m_studio->setSoundDriver(m_driver);
+
+ if (!m_driver) {
+ SEQUENCER_DEBUG << "RosegardenSequencer object could not be allocated"
+ << endl;
+ close();
+ }
+
+ m_driver->setAudioBufferSizes(m_audioMix, m_audioRead, m_audioWrite,
+ m_smallFileSize);
+
+ m_driver->setSequencerDataBlock(m_sequencerMapper.getSequencerDataBlock());
+ m_driver->setExternalTransportControl(this);
+
+ // Check for new clients every so often
+ //
+ m_newClientTimer = new QTimer(this);
+ connect(m_newClientTimer, SIGNAL(timeout()),
+ this, SLOT(slotCheckForNewClients()));
+
+ m_newClientTimer->start(3000); // every 3 seconds
+}
+
+RosegardenSequencerApp::~RosegardenSequencerApp()
+{
+ SEQUENCER_DEBUG << "RosegardenSequencer - shutting down" << endl;
+ m_driver->shutdown();
+ delete m_studio;
+ delete m_driver;
+ delete m_controlBlockMmapper;
+}
+
+void
+RosegardenSequencerApp::quit()
+{
+ std::cerr << "RosegardenSequencerApp::quit()" << std::endl;
+
+ close();
+
+ // and break out of the loop next time around
+ m_transportStatus = QUIT;
+}
+
+
+void
+RosegardenSequencerApp::stop()
+{
+ // set our state at this level to STOPPING (pending any
+ // unfinished NOTES)
+ m_transportStatus = STOPPING;
+
+ // report
+ //
+ SEQUENCER_DEBUG << "RosegardenSequencerApp::stop() - stopping" << endl;
+
+ // process pending NOTE OFFs and stop the Sequencer
+ m_driver->stopPlayback();
+
+ // the Sequencer doesn't need to know these once
+ // we've stopped.
+ //
+ m_songPosition.sec = 0;
+ m_songPosition.nsec = 0;
+ m_lastFetchSongPosition.sec = 0;
+ m_lastFetchSongPosition.nsec = 0;
+
+ cleanupMmapData();
+
+ Profiles::getInstance()->dump();
+
+ incrementTransportToken();
+}
+
+// Get a slice of events from the GUI
+//
+void
+RosegardenSequencerApp::fetchEvents(MappedComposition &composition,
+ const RealTime &start,
+ const RealTime &end,
+ bool firstFetch)
+{
+ // Always return nothing if we're stopped
+ //
+ if ( m_transportStatus == STOPPED || m_transportStatus == STOPPING )
+ return ;
+
+ // If we're looping then we should get as much of the rest of
+ // the right hand of the loop as possible and also events from
+ // the beginning of the loop. We can do this in two fetches.
+ // Make sure that we delete all returned pointers when we've
+ // finished with them.
+ //
+ //
+ /*
+ if (isLooping() == true && end >= m_loopEnd)
+ {
+ RealTime loopOverlap = end - m_loopEnd;
+
+ MappedComposition *endLoop = 0;
+
+ if (m_loopEnd > start) {
+ endLoop = getSlice(start, m_loopEnd, firstFetch);
+ }
+
+ if (loopOverlap > RealTime::zeroTime) {
+
+ MappedComposition *beginLoop =
+ getSlice(m_loopStart, m_loopStart + loopOverlap, true);
+
+ // move the start time of the begin section one loop width
+ // into the future and ensure that we keep the clocks level
+ // until this time has passed
+ //
+ beginLoop->moveStartTime(m_loopEnd - m_loopStart);
+
+ if (endLoop) {
+ (*endLoop) = (*endLoop) + (*beginLoop);
+ delete beginLoop;
+ } else {
+ endLoop = beginLoop;
+ }
+ }
+
+ if (endLoop) return endLoop;
+ else return new MappedComposition();
+ }
+ else
+ */
+ getSlice(composition, start, end, firstFetch);
+ applyLatencyCompensation(composition);
+}
+
+
+void
+RosegardenSequencerApp::getSlice(MappedComposition &composition,
+ const RealTime &start,
+ const RealTime &end,
+ bool firstFetch)
+{
+ // SEQUENCER_DEBUG << "RosegardenSequencerApp::getSlice (" << start << " -> " << end << ", " << firstFetch << ")" << endl;
+
+ if (firstFetch || (start < m_lastStartTime)) {
+ SEQUENCER_DEBUG << "[calling jumpToTime on start]" << endl;
+ m_metaIterator->jumpToTime(start);
+ }
+
+ (void)m_metaIterator->fillCompositionWithEventsUntil
+ (firstFetch, &composition, start, end);
+
+ // setEndOfCompReached(eventsRemaining); // don't do that, it breaks recording because
+ // playing stops right after it starts.
+
+ m_lastStartTime = start;
+}
+
+
+void
+RosegardenSequencerApp::applyLatencyCompensation(MappedComposition &composition)
+{
+ RealTime maxLatency = m_driver->getMaximumPlayLatency();
+ if (maxLatency == RealTime::zeroTime)
+ return ;
+
+ for (MappedComposition::iterator i = composition.begin();
+ i != composition.end(); ++i) {
+
+ RealTime instrumentLatency =
+ m_driver->getInstrumentPlayLatency((*i)->getInstrument());
+
+ // std::cerr << "RosegardenSequencerApp::applyLatencyCompensation: maxLatency " << maxLatency << ", instrumentLatency " << instrumentLatency << ", moving " << (*i)->getEventTime() << " to " << (*i)->getEventTime() + maxLatency - instrumentLatency << std::endl;
+
+ (*i)->setEventTime((*i)->getEventTime() +
+ maxLatency - instrumentLatency);
+ }
+}
+
+
+// The first fetch of events from the core/ and initialisation for
+// this session of playback. We fetch up to m_readAhead ahead at
+// first at then top up at each slice.
+//
+bool
+RosegardenSequencerApp::startPlaying()
+{
+ // Fetch up to m_readHead microseconds worth of events
+ //
+ m_lastFetchSongPosition = m_songPosition + m_readAhead;
+
+ // This will reset the Sequencer's internal clock
+ // ready for new playback
+ m_driver->initialisePlayback(m_songPosition);
+
+ m_mC.clear();
+ fetchEvents(m_mC, m_songPosition, m_songPosition + m_readAhead, true);
+
+ // process whether we need to or not as this also processes
+ // the audio queue for us
+ //
+ m_driver->processEventsOut(m_mC, m_songPosition, m_songPosition + m_readAhead);
+
+ std::vector<MappedEvent> audioEvents;
+ m_metaIterator->getAudioEvents(audioEvents);
+ m_driver->initialiseAudioQueue(audioEvents);
+
+ // SEQUENCER_DEBUG << "RosegardenSequencerApp::startPlaying: pausing to simulate high-load environment" << endl;
+ // ::sleep(2);
+
+ // and only now do we signal to start the clock
+ //
+ m_driver->startClocks();
+
+ incrementTransportToken();
+
+ return true; // !isEndOfCompReached();
+}
+
+bool
+RosegardenSequencerApp::keepPlaying()
+{
+ Profiler profiler("RosegardenSequencerApp::keepPlaying");
+
+ m_mC.clear();
+
+ RealTime fetchEnd = m_songPosition + m_readAhead;
+ if (isLooping() && fetchEnd >= m_loopEnd) {
+ fetchEnd = m_loopEnd - RealTime(0, 1);
+ }
+ if (fetchEnd > m_lastFetchSongPosition) {
+ fetchEvents(m_mC, m_lastFetchSongPosition, fetchEnd, false);
+ }
+
+ // Again, process whether we need to or not to keep
+ // the Sequencer up-to-date with audio events
+ //
+ m_driver->processEventsOut(m_mC, m_lastFetchSongPosition, fetchEnd);
+
+ if (fetchEnd > m_lastFetchSongPosition) {
+ m_lastFetchSongPosition = fetchEnd;
+ }
+
+ return true; // !isEndOfCompReached(); - until we sort this out, we don't stop at end of comp.
+}
+
+// Return current Sequencer time in GUI compatible terms
+//
+void
+RosegardenSequencerApp::updateClocks()
+{
+ Profiler profiler("RosegardenSequencerApp::updateClocks");
+
+ m_driver->runTasks();
+
+ checkExternalTransport();
+
+ //SEQUENCER_DEBUG << "RosegardenSequencerApp::updateClocks" << endl;
+
+ // If we're not playing etc. then that's all we need to do
+ //
+ if (m_transportStatus != PLAYING &&
+ m_transportStatus != RECORDING)
+ return ;
+
+ RealTime newPosition = m_driver->getSequencerTime();
+
+ // Go around the loop if we've reached the end
+ //
+ if (isLooping() && newPosition >= m_loopEnd) {
+
+ RealTime oldPosition = m_songPosition;
+
+ // Remove the loop width from the song position and send
+ // this position to the GUI
+ //
+ newPosition = m_songPosition = m_lastFetchSongPosition = m_loopStart;
+
+ m_driver->stopClocks();
+
+ // Reset playback using this jump
+ //
+ m_driver->resetPlayback(oldPosition, m_songPosition);
+
+ m_mC.clear();
+ fetchEvents(m_mC, m_songPosition, m_songPosition + m_readAhead, true);
+
+ m_driver->processEventsOut(m_mC, m_songPosition, m_songPosition + m_readAhead);
+
+ m_driver->startClocks();
+ } else {
+ m_songPosition = newPosition;
+
+ if (m_songPosition <= m_driver->getStartPosition())
+ newPosition = m_driver->getStartPosition();
+ }
+
+ RealTime maxLatency = m_driver->getMaximumPlayLatency();
+ if (maxLatency != RealTime::zeroTime) {
+ // std::cerr << "RosegardenSequencerApp::updateClocks: latency compensation moving " << newPosition << " to " << newPosition - maxLatency << std::endl;
+ newPosition = newPosition - maxLatency;
+ }
+
+ // Remap the position pointer
+ //
+ m_sequencerMapper.updatePositionPointer(newPosition);
+}
+
+void
+RosegardenSequencerApp::notifySequencerStatus()
+{
+ QByteArray data, replyData;
+ QCString replyType;
+ QDataStream arg(data, IO_WriteOnly);
+
+ arg << (int)m_transportStatus;
+
+ if (!kapp->dcopClient()->send(ROSEGARDEN_GUI_APP_NAME,
+ ROSEGARDEN_GUI_IFACE_NAME,
+ "notifySequencerStatus(int)",
+ data)) {
+ SEQUENCER_DEBUG << "RosegardenSequencer::notifySequencerStatus()"
+ << " - can't send to RosegardenGUI client"
+ << endl;
+
+ // Stop the sequencer
+ //
+ stop();
+ }
+}
+
+void
+RosegardenSequencerApp::sleep(const RealTime &rt)
+{
+ m_driver->sleep(rt);
+}
+
+
+// Sets the Sequencer object and this object to the new time
+// from where playback can continue.
+//
+void
+RosegardenSequencerApp::jumpTo(long posSec, long posNsec)
+{
+ SEQUENCER_DEBUG << "RosegardenSequencerApp::jumpTo(" << posSec << ", " << posNsec << ")\n";
+
+ if (posSec < 0 && posNsec < 0)
+ return ;
+
+ m_driver->stopClocks();
+
+ RealTime oldPosition = m_songPosition;
+
+ m_songPosition = m_lastFetchSongPosition = RealTime(posSec, posNsec);
+
+ if (m_sequencerMapper.getSequencerDataBlock()) {
+ m_sequencerMapper.getSequencerDataBlock()->setPositionPointer
+ (m_songPosition);
+ }
+
+ m_driver->resetPlayback(oldPosition, m_songPosition);
+
+ if (m_driver->isPlaying()) {
+
+ // Now prebuffer as in startPlaying:
+
+ m_mC.clear();
+ fetchEvents(m_mC, m_songPosition, m_songPosition + m_readAhead, true);
+
+ // process whether we need to or not as this also processes
+ // the audio queue for us
+ //
+ m_driver->processEventsOut(m_mC, m_songPosition, m_songPosition + m_readAhead);
+ }
+
+ incrementTransportToken();
+
+ // SEQUENCER_DEBUG << "RosegardenSequencerApp::jumpTo: pausing to simulate high-load environment" << endl;
+ // ::sleep(1);
+
+ m_driver->startClocks();
+
+ return ;
+}
+
+// Send the last recorded MIDI block
+//
+void
+RosegardenSequencerApp::processRecordedMidi()
+{
+ MappedComposition *mC = m_driver->getMappedComposition();
+
+ if (mC->empty() || !m_controlBlockMmapper)
+ return ;
+
+ applyFiltering(mC, m_controlBlockMmapper->getRecordFilter(), false);
+ m_sequencerMapper.updateRecordingBuffer(mC);
+
+ if (m_controlBlockMmapper->isMidiRoutingEnabled()) {
+ applyFiltering(mC, m_controlBlockMmapper->getThruFilter(), true);
+ routeEvents(mC, false);
+ }
+}
+
+void
+RosegardenSequencerApp::routeEvents(MappedComposition *mC, bool useSelectedTrack)
+{
+ InstrumentId instrumentId;
+
+ if (useSelectedTrack) {
+ instrumentId = m_controlBlockMmapper->getInstrumentForTrack
+ (m_controlBlockMmapper->getSelectedTrack());
+ for (MappedComposition::iterator i = mC->begin();
+ i != mC->end(); ++i) {
+ (*i)->setInstrument(instrumentId);
+ }
+ } else {
+ for (MappedComposition::iterator i = mC->begin();
+ i != mC->end(); ++i) {
+ instrumentId = m_controlBlockMmapper->getInstrumentForEvent
+ ((*i)->getRecordedDevice(), (*i)->getRecordedChannel());
+ (*i)->setInstrument(instrumentId);
+ }
+ }
+ m_driver->processEventsOut(*mC);
+}
+
+// Send an update
+//
+void
+RosegardenSequencerApp::processRecordedAudio()
+{
+ // Nothing to do here: the recording time is sent back to the GUI
+ // in the sequencer mapper as a normal case.
+}
+
+
+// This method is called during STOPPED or PLAYING operations
+// to mop up any async (unexpected) incoming MIDI or Audio events
+// and forward them to the GUI for display
+//
+void
+RosegardenSequencerApp::processAsynchronousEvents()
+{
+ if (!m_controlBlockMmapper) {
+
+ // If the control block mmapper doesn't exist, we'll just
+ // return here. But we want to ensure we don't check again
+ // immediately, because we're probably waiting for the GUI to
+ // start up.
+
+ static bool lastChecked = false;
+ static struct timeval lastCheckedAt;
+
+ struct timeval tv;
+ (void)gettimeofday(&tv, 0);
+
+ if (lastChecked &&
+ tv.tv_sec == lastCheckedAt.tv_sec) {
+ lastCheckedAt = tv;
+ return ;
+ }
+
+ lastChecked = true;
+ lastCheckedAt = tv;
+
+ try {
+ m_controlBlockMmapper = new ControlBlockMmapper(KGlobal::dirs()->resourceDirs("tmp").last()
+ + "/rosegarden_control_block");
+ } catch (Exception e) {
+ // Assume that the control block simply hasn't been
+ // created yet because the GUI's still starting up.
+ // If there's a real problem with the mmapper, it
+ // will show up in play() instead.
+ return ;
+ }
+ m_sequencerMapper.setControlBlock(m_controlBlockMmapper->getControlBlock());
+ }
+
+ MappedComposition *mC = m_driver->getMappedComposition();
+
+ if (mC->empty()) {
+ m_driver->processPending();
+ return ;
+ }
+
+ // std::cerr << "processAsynchronousEvents: have " << mC->size() << " events" << std::endl;
+
+ QByteArray data;
+ QDataStream arg(data, IO_WriteOnly);
+ arg << mC;
+
+ if (m_controlBlockMmapper->isMidiRoutingEnabled()) {
+ applyFiltering(mC, m_controlBlockMmapper->getThruFilter(), true);
+ routeEvents(mC, true);
+ }
+
+ // std::cerr << "processAsynchronousEvents: sent " << mC->size() << " events" << std::endl;
+
+ if (!kapp->dcopClient()->send(ROSEGARDEN_GUI_APP_NAME,
+ ROSEGARDEN_GUI_IFACE_NAME,
+ "processAsynchronousMidi(MappedComposition)", data)) {
+ SEQUENCER_DEBUG << "RosegardenSequencer::processAsynchronousEvents() - "
+ << "can't call RosegardenGUI client" << endl;
+
+ // Stop the sequencer so we can see if we can try again later
+ //
+ stop();
+ }
+
+ // Process any pending events (Note Offs or Audio) as part of
+ // same procedure.
+ //
+ m_driver->processPending();
+}
+
+
+void
+RosegardenSequencerApp::applyFiltering(MappedComposition *mC,
+ MidiFilter filter,
+ bool filterControlDevice)
+{
+ for (MappedComposition::iterator i = mC->begin();
+ i != mC->end(); ) { // increment in loop
+ MappedComposition::iterator j = i;
+ ++j;
+ if (((*i)->getType() & filter) ||
+ (filterControlDevice && ((*i)->getRecordedDevice() ==
+ Device::CONTROL_DEVICE))) {
+ mC->erase(i);
+ }
+ i = j;
+ }
+}
+
+
+int
+RosegardenSequencerApp::record(const RealTime &time,
+ const RealTime &readAhead,
+ const RealTime &audioMix,
+ const RealTime &audioRead,
+ const RealTime &audioWrite,
+ long smallFileSize,
+ long recordMode)
+{
+ TransportStatus localRecordMode = (TransportStatus) recordMode;
+
+ SEQUENCER_DEBUG << "RosegardenSequencerApp::record - recordMode is " << recordMode << ", transport status is " << m_transportStatus << endl;
+
+ // punch in recording
+ if (m_transportStatus == PLAYING) {
+ if (localRecordMode == STARTING_TO_RECORD) {
+ SEQUENCER_DEBUG << "RosegardenSequencerApp::record: punching in" << endl;
+ localRecordMode = RECORDING; // no need to start playback
+ }
+ }
+
+ // For audio recording we need to retrieve audio
+ // file names from the GUI
+ //
+ if (localRecordMode == STARTING_TO_RECORD ||
+ localRecordMode == RECORDING) {
+ SEQUENCER_DEBUG << "RosegardenSequencerApp::record()"
+ << " - starting to record" << endl;
+
+ QValueVector<InstrumentId> armedInstruments;
+ QValueVector<QString> audioFileNames;
+
+ {
+ QByteArray data, replyData;
+ QCString replyType;
+ QDataStream arg(data, IO_WriteOnly);
+
+ if (!kapp->dcopClient()->call(ROSEGARDEN_GUI_APP_NAME,
+ ROSEGARDEN_GUI_IFACE_NAME,
+ "getArmedInstruments()",
+ data, replyType, replyData, true)) {
+ SEQUENCER_DEBUG << "RosegardenSequencer::record()"
+ << " - can't call RosegardenGUI client for getArmedInstruments"
+ << endl;
+ }
+
+ QDataStream reply(replyData, IO_ReadOnly);
+ if (replyType == "QValueVector<InstrumentId>") {
+ reply >> armedInstruments;
+ } else {
+ SEQUENCER_DEBUG << "RosegardenSequencer::record() - "
+ << "unrecognised type returned for getArmedInstruments" << endl;
+ }
+ }
+
+ QValueVector<InstrumentId> audioInstruments;
+
+ for (unsigned int i = 0; i < armedInstruments.size(); ++i) {
+ if (armedInstruments[i] >= AudioInstrumentBase &&
+ armedInstruments[i] < MidiInstrumentBase) {
+ audioInstruments.push_back(armedInstruments[i]);
+ }
+ }
+
+ if (audioInstruments.size() > 0) {
+
+ QByteArray data, replyData;
+ QCString replyType;
+ QDataStream arg(data, IO_WriteOnly);
+
+ arg << audioInstruments;
+
+ if (!kapp->dcopClient()->call(ROSEGARDEN_GUI_APP_NAME,
+ ROSEGARDEN_GUI_IFACE_NAME,
+ "createRecordAudioFiles(QValueVector<InstrumentId>)",
+ data, replyType, replyData, true)) {
+ SEQUENCER_DEBUG << "RosegardenSequencer::record()"
+ << " - can't call RosegardenGUI client for createNewAudioFiles"
+ << endl;
+ }
+
+ QDataStream reply(replyData, IO_ReadOnly);
+ if (replyType == "QValueVector<QString>") {
+ reply >> audioFileNames;
+ } else {
+ SEQUENCER_DEBUG << "RosegardenSequencer::record() - "
+ << "unrecognised type returned for createNewAudioFiles" << endl;
+ }
+
+ if (audioFileNames.size() != audioInstruments.size()) {
+ std::cerr << "ERROR: RosegardenSequencer::record(): Failed to create correct number of audio files (wanted " << audioInstruments.size() << ", got " << audioFileNames.size() << ")" << std::endl;
+ stop();
+ return 0;
+ }
+ }
+
+ std::vector<InstrumentId> armedInstrumentsVec;
+ std::vector<QString> audioFileNamesVec;
+ for (int i = 0; i < armedInstruments.size(); ++i) {
+ armedInstrumentsVec.push_back(armedInstruments[i]);
+ }
+ for (int i = 0; i < audioFileNames.size(); ++i) {
+ audioFileNamesVec.push_back(audioFileNames[i]);
+ }
+
+ // Get the Sequencer to prepare itself for recording - if
+ // this fails we stop.
+ //
+ if (m_driver->record(RECORD_ON,
+ &armedInstrumentsVec,
+ &audioFileNamesVec) == false) {
+ stop();
+ return 0;
+ }
+ } else {
+ // unrecognised type - return a problem
+ return 0;
+ }
+
+ // Now set the local transport status to the record mode
+ //
+ //
+ m_transportStatus = localRecordMode;
+
+ if (localRecordMode == RECORDING) { // punch in
+ return 1;
+ } else {
+
+ // Ensure that playback is initialised
+ //
+ m_driver->initialisePlayback(m_songPosition);
+
+ return play(time, readAhead, audioMix, audioRead, audioWrite, smallFileSize);
+ }
+}
+
+// We receive a starting time from the GUI which we use as the
+// basis of our first fetch of events from the GUI core. Assuming
+// this works we set our internal state to PLAYING and go ahead
+// and play the piece until we get a signal to stop.
+//
+// DCOP wants us to use an int as a return type instead of a bool.
+//
+int
+RosegardenSequencerApp::play(const RealTime &time,
+ const RealTime &readAhead,
+ const RealTime &audioMix,
+ const RealTime &audioRead,
+ const RealTime &audioWrite,
+ long smallFileSize)
+{
+ if (m_transportStatus == PLAYING ||
+ m_transportStatus == STARTING_TO_PLAY)
+ return true;
+
+ // Check for record toggle (punch out)
+ //
+ if (m_transportStatus == RECORDING) {
+ m_transportStatus = PLAYING;
+ return punchOut();
+ }
+
+ // To play from the given song position sets up the internal
+ // play state to "STARTING_TO_PLAY" which is then caught in
+ // the main event loop
+ //
+ m_songPosition = time;
+
+ if (m_sequencerMapper.getSequencerDataBlock()) {
+ m_sequencerMapper.getSequencerDataBlock()->setPositionPointer
+ (m_songPosition);
+ }
+
+ if (m_transportStatus != RECORDING &&
+ m_transportStatus != STARTING_TO_RECORD) {
+ m_transportStatus = STARTING_TO_PLAY;
+ }
+
+ m_driver->stopClocks();
+
+ // Set up buffer size
+ //
+ m_readAhead = readAhead;
+ if (m_readAhead == RealTime::zeroTime)
+ m_readAhead.sec = 1;
+
+ m_audioMix = audioMix;
+ m_audioRead = audioRead;
+ m_audioWrite = audioWrite;
+ m_smallFileSize = smallFileSize;
+
+ m_driver->setAudioBufferSizes(m_audioMix, m_audioRead, m_audioWrite,
+ m_smallFileSize);
+
+ cleanupMmapData();
+
+ // Map all segments
+ //
+ QDir segmentsDir(m_segmentFilesPath, "segment_*");
+ for (unsigned int i = 0; i < segmentsDir.count(); ++i) {
+ mmapSegment(m_segmentFilesPath + "/" + segmentsDir[i]);
+ }
+
+ QString tmpDir = KGlobal::dirs()->resourceDirs("tmp").last();
+
+ // Map metronome
+ //
+ QString metronomeFileName = tmpDir + "/rosegarden_metronome";
+ QFileInfo metronomeFileInfo(metronomeFileName);
+ if (metronomeFileInfo.exists())
+ mmapSegment(metronomeFileName);
+ else
+ SEQUENCER_DEBUG << "RosegardenSequencerApp::play() - no metronome found\n";
+
+ // Map tempo segment
+ //
+ QString tempoSegmentFileName = tmpDir + "/rosegarden_tempo";
+ QFileInfo tempoSegmentFileInfo(tempoSegmentFileName);
+ if (tempoSegmentFileInfo.exists())
+ mmapSegment(tempoSegmentFileName);
+ else
+ SEQUENCER_DEBUG << "RosegardenSequencerApp::play() - no tempo segment found\n";
+
+ // Map time sig segment
+ //
+ QString timeSigSegmentFileName = tmpDir + "/rosegarden_timesig";
+ QFileInfo timeSigSegmentFileInfo(timeSigSegmentFileName);
+ if (timeSigSegmentFileInfo.exists())
+ mmapSegment(timeSigSegmentFileName);
+ else
+ SEQUENCER_DEBUG << "RosegardenSequencerApp::play() - no time sig segment found\n";
+
+ // Map control block if necessary
+ //
+ if (!m_controlBlockMmapper) {
+ m_controlBlockMmapper = new ControlBlockMmapper(tmpDir + "/rosegarden_control_block");
+ m_sequencerMapper.setControlBlock(m_controlBlockMmapper->getControlBlock());
+ }
+
+ initMetaIterator();
+
+ // report
+ //
+ SEQUENCER_DEBUG << "RosegardenSequencerApp::play() - starting to play\n";
+
+ // Test bits
+ // m_metaIterator = new MmappedSegmentsMetaIterator(m_mmappedSegments);
+ // MappedComposition testCompo;
+ // m_metaIterator->fillCompositionWithEventsUntil(&testCompo,
+ // RealTime(2,0));
+
+ // dumpFirstSegment();
+
+ // keep it simple
+ return true;
+}
+
+int
+RosegardenSequencerApp::punchOut()
+{
+ // Check for record toggle (punch out)
+ //
+ if (m_transportStatus == RECORDING) {
+ m_driver->punchOut();
+ m_transportStatus = PLAYING;
+ return true;
+ }
+ return false;
+}
+
+MmappedSegment* RosegardenSequencerApp::mmapSegment(const QString& file)
+{
+ MmappedSegment* m = 0;
+
+ try {
+ m = new MmappedSegment(file);
+ } catch (Exception e) {
+ SEQUENCER_DEBUG << "RosegardenSequencerApp::mmapSegment() - couldn't map file " << file
+ << " : " << e.getMessage().c_str() << endl;
+ return 0;
+ }
+
+
+ m_mmappedSegments[file] = m;
+ return m;
+}
+
+void RosegardenSequencerApp::initMetaIterator()
+{
+ delete m_metaIterator;
+ m_metaIterator = new MmappedSegmentsMetaIterator(m_mmappedSegments, m_controlBlockMmapper);
+}
+
+void RosegardenSequencerApp::cleanupMmapData()
+{
+ for (MmappedSegmentsMetaIterator::mmappedsegments::iterator i =
+ m_mmappedSegments.begin(); i != m_mmappedSegments.end(); ++i)
+ delete i->second;
+
+ m_mmappedSegments.clear();
+
+ delete m_metaIterator;
+ m_metaIterator = 0;
+}
+
+void RosegardenSequencerApp::remapSegment(const QString& filename, size_t newSize)
+{
+ if (m_transportStatus != PLAYING)
+ return ;
+
+ SEQUENCER_DEBUG << "RosegardenSequencerApp::remapSegment(" << filename << ")\n";
+
+ MmappedSegment* m = m_mmappedSegments[filename];
+ if (m->remap(newSize) && m_metaIterator)
+ m_metaIterator->resetIteratorForSegment(filename);
+}
+
+void RosegardenSequencerApp::addSegment(const QString& filename)
+{
+ if (m_transportStatus != PLAYING)
+ return ;
+
+ SEQUENCER_DEBUG << "MmappedSegment::addSegment(" << filename << ")\n";
+
+ MmappedSegment* m = mmapSegment(filename);
+
+ if (m_metaIterator)
+ m_metaIterator->addSegment(m);
+}
+
+void RosegardenSequencerApp::deleteSegment(const QString& filename)
+{
+ if (m_transportStatus != PLAYING)
+ return ;
+
+ SEQUENCER_DEBUG << "MmappedSegment::deleteSegment(" << filename << ")\n";
+
+ MmappedSegment* m = m_mmappedSegments[filename];
+
+ if (m_metaIterator)
+ m_metaIterator->deleteSegment(m);
+
+ delete m;
+
+ // #932415
+ m_mmappedSegments.erase(filename);
+}
+
+void RosegardenSequencerApp::closeAllSegments()
+{
+ SEQUENCER_DEBUG << "MmappedSegment::closeAllSegments()\n";
+
+ for (MmappedSegmentsMetaIterator::mmappedsegments::iterator
+ i = m_mmappedSegments.begin();
+ i != m_mmappedSegments.end(); ++i) {
+ if (m_metaIterator)
+ m_metaIterator->deleteSegment(i->second);
+
+ delete i->second;
+ }
+
+ m_mmappedSegments.clear();
+
+ m_sequencerMapper.setControlBlock(0);
+ delete m_controlBlockMmapper;
+ m_controlBlockMmapper = 0;
+}
+
+void RosegardenSequencerApp::remapTracks()
+{
+// SEQUENCER_DEBUG << "RosegardenSequencerApp::remapTracks" << endl;
+ std::cout << "RosegardenSequencerApp::remapTracks" << std::endl;
+
+ rationalisePlayingAudio();
+}
+
+// DCOP Wrapper for play(RealTime,
+// RealTime,
+// RealTime)
+//
+//
+int
+RosegardenSequencerApp::play(long timeSec,
+ long timeNSec,
+ long readAheadSec,
+ long readAheadNSec,
+ long audioMixSec,
+ long audioMixNsec,
+ long audioReadSec,
+ long audioReadNsec,
+ long audioWriteSec,
+ long audioWriteNsec,
+ long smallFileSize)
+
+{
+ return play(RealTime(timeSec, timeNSec),
+ RealTime(readAheadSec, readAheadNSec),
+ RealTime(audioMixSec, audioMixNsec),
+ RealTime(audioReadSec, audioReadNsec),
+ RealTime(audioWriteSec, audioWriteNsec),
+ smallFileSize);
+}
+
+
+
+// Wrapper for record(RealTime,
+// RealTime,
+// RealTime,
+// recordMode);
+//
+//
+int
+RosegardenSequencerApp::record(long timeSec,
+ long timeNSec,
+ long readAheadSec,
+ long readAheadNSec,
+ long audioMixSec,
+ long audioMixNsec,
+ long audioReadSec,
+ long audioReadNsec,
+ long audioWriteSec,
+ long audioWriteNsec,
+ long smallFileSize,
+ long recordMode)
+
+{
+ return record(RealTime(timeSec, timeNSec),
+ RealTime(readAheadSec, readAheadNSec),
+ RealTime(audioMixSec, audioMixNsec),
+ RealTime(audioReadSec, audioReadNsec),
+ RealTime(audioWriteSec, audioWriteNsec),
+ smallFileSize,
+ recordMode);
+}
+
+
+void
+RosegardenSequencerApp::setLoop(const RealTime &loopStart,
+ const RealTime &loopEnd)
+{
+ m_loopStart = loopStart;
+ m_loopEnd = loopEnd;
+
+ m_driver->setLoop(loopStart, loopEnd);
+}
+
+
+void
+RosegardenSequencerApp::setLoop(long loopStartSec,
+ long loopStartNSec,
+ long loopEndSec,
+ long loopEndNSec)
+{
+ setLoop(RealTime(loopStartSec, loopStartNSec),
+ RealTime(loopEndSec, loopEndNSec));
+}
+
+
+// Return the status of the sound systems (audio and MIDI)
+//
+unsigned int
+RosegardenSequencerApp::getSoundDriverStatus(const QString &guiVersion)
+{
+ unsigned int driverStatus = m_driver->getStatus();
+ if (guiVersion == VERSION)
+ driverStatus |= VERSION_OK;
+ else {
+ std::cerr << "WARNING: RosegardenSequencerApp::getSoundDriverStatus: "
+ << "GUI version \"" << guiVersion
+ << "\" does not match sequencer version \"" << VERSION
+ << "\"" << std::endl;
+ }
+ return driverStatus;
+}
+
+
+// Add an audio file to the sequencer
+int
+RosegardenSequencerApp::addAudioFile(const QString &fileName, int id)
+{
+ return ((int)m_driver->addAudioFile(fileName.utf8().data(), id));
+}
+
+int
+RosegardenSequencerApp::removeAudioFile(int id)
+{
+ return ((int)m_driver->removeAudioFile(id));
+}
+
+void
+RosegardenSequencerApp::clearAllAudioFiles()
+{
+ m_driver->clearAudioFiles();
+}
+
+void
+RosegardenSequencerApp::setMappedInstrument(int type, unsigned char channel,
+ unsigned int id)
+{
+ InstrumentId mID = (InstrumentId)id;
+ Instrument::InstrumentType mType =
+ (Instrument::InstrumentType)type;
+ MidiByte mChannel = (MidiByte)channel;
+
+ m_driver->setMappedInstrument(
+ new MappedInstrument (mType, mChannel, mID));
+
+}
+
+// Process a MappedComposition sent from Sequencer with
+// immediate effect
+//
+void
+RosegardenSequencerApp::processSequencerSlice(MappedComposition mC)
+{
+ // Use the "now" API
+ //
+ m_driver->processEventsOut(mC);
+}
+
+void
+RosegardenSequencerApp::processMappedEvent(unsigned int id,
+ int type,
+ unsigned char pitch,
+ unsigned char velocity,
+ long absTimeSec,
+ long absTimeNsec,
+ long durationSec,
+ long durationNsec,
+ long audioStartMarkerSec,
+ long audioStartMarkerNSec)
+{
+ MappedEvent *mE =
+ new MappedEvent(
+ (InstrumentId)id,
+ (MappedEvent::MappedEventType)type,
+ (MidiByte)pitch,
+ (MidiByte)velocity,
+ RealTime(absTimeSec, absTimeNsec),
+ RealTime(durationSec, durationNsec),
+ RealTime(audioStartMarkerSec, audioStartMarkerNSec));
+
+ MappedComposition mC;
+
+ // SEQUENCER_DEBUG << "processMappedEvent(data) - sending out single event at time " << mE->getEventTime() << endl;
+
+ /*
+ std::cout << "ID = " << mE->getInstrument() << std::endl;
+ std::cout << "TYPE = " << mE->getType() << std::endl;
+ std::cout << "D1 = " << (int)mE->getData1() << std::endl;
+ std::cout << "D2 = " << (int)mE->getData2() << std::endl;
+ */
+
+ mC.insert(mE);
+
+ m_driver->processEventsOut(mC);
+}
+
+void
+RosegardenSequencerApp::processMappedEvent(MappedEvent mE)
+{
+ MappedComposition mC;
+ mC.insert(new MappedEvent(mE));
+ SEQUENCER_DEBUG << "processMappedEvent(ev) - sending out single event at time " << mE.getEventTime() << endl;
+
+ m_driver->processEventsOut(mC);
+}
+
+// Get the MappedDevice (DCOP wrapped vector of MappedInstruments)
+//
+MappedDevice
+RosegardenSequencerApp::getMappedDevice(unsigned int id)
+{
+ return m_driver->getMappedDevice(id);
+}
+
+unsigned int
+RosegardenSequencerApp::getDevices()
+{
+ return m_driver->getDevices();
+}
+
+int
+RosegardenSequencerApp::canReconnect(int type)
+{
+ return m_driver->canReconnect((Device::DeviceType)type);
+}
+
+unsigned int
+RosegardenSequencerApp::addDevice(int type, unsigned int direction)
+{
+ return m_driver->addDevice((Device::DeviceType)type,
+ (MidiDevice::DeviceDirection)direction);
+}
+
+void
+RosegardenSequencerApp::removeDevice(unsigned int deviceId)
+{
+ m_driver->removeDevice(deviceId);
+}
+
+void
+RosegardenSequencerApp::renameDevice(unsigned int deviceId, QString name)
+{
+ m_driver->renameDevice(deviceId, name);
+}
+
+unsigned int
+RosegardenSequencerApp::getConnections(int type, unsigned int direction)
+{
+ return m_driver->getConnections((Device::DeviceType)type,
+ (MidiDevice::DeviceDirection)direction);
+}
+
+QString
+RosegardenSequencerApp::getConnection(int type, unsigned int direction,
+ unsigned int connectionNo)
+{
+ return m_driver->getConnection((Device::DeviceType)type,
+ (MidiDevice::DeviceDirection)direction,
+ connectionNo);
+}
+
+void
+RosegardenSequencerApp::setConnection(unsigned int deviceId,
+ QString connection)
+{
+ m_driver->setConnection(deviceId, connection);
+}
+
+void
+RosegardenSequencerApp::setPlausibleConnection(unsigned int deviceId,
+ QString connection)
+{
+ m_driver->setPlausibleConnection(deviceId, connection);
+}
+
+unsigned int
+RosegardenSequencerApp::getTimers()
+{
+ return m_driver->getTimers();
+}
+
+QString
+RosegardenSequencerApp::getTimer(unsigned int n)
+{
+ return m_driver->getTimer(n);
+}
+
+QString
+RosegardenSequencerApp::getCurrentTimer()
+{
+ return m_driver->getCurrentTimer();
+}
+
+void
+RosegardenSequencerApp::setCurrentTimer(QString timer)
+{
+ m_driver->setCurrentTimer(timer);
+}
+
+void
+RosegardenSequencerApp::setLowLatencyMode(bool ll)
+{
+ m_driver->setLowLatencyMode(ll);
+}
+
+void
+RosegardenSequencerApp::sequencerAlive()
+{
+ if (!kapp->dcopClient()->
+ isApplicationRegistered(QCString(ROSEGARDEN_GUI_APP_NAME))) {
+ SEQUENCER_DEBUG << "RosegardenSequencerApp::sequencerAlive() - "
+ << "waiting for GUI to register" << endl;
+ return ;
+ }
+
+ QByteArray data;
+
+ if (!kapp->dcopClient()->send(ROSEGARDEN_GUI_APP_NAME,
+ ROSEGARDEN_GUI_IFACE_NAME,
+ "alive()",
+ data)) {
+ SEQUENCER_DEBUG << "RosegardenSequencer::alive()"
+ << " - can't call RosegardenGUI client"
+ << endl;
+ }
+
+ SEQUENCER_DEBUG << "RosegardenSequencerApp::sequencerAlive() - "
+ << "trying to tell GUI that we're alive" << endl;
+}
+
+MappedRealTime
+RosegardenSequencerApp::getAudioPlayLatency()
+{
+ return MappedRealTime(m_driver->getAudioPlayLatency());
+}
+
+MappedRealTime
+RosegardenSequencerApp::getAudioRecordLatency()
+{
+ return MappedRealTime(m_driver->getAudioRecordLatency());
+}
+
+// Initialise the virtual studio with a few audio faders and
+// create a plugin manager. For the moment this is pretty
+// arbitrary but eventually we'll drive this from the gui
+// and rg file "Studio" entries.
+//
+void
+RosegardenSequencerApp::initialiseStudio()
+{
+ // clear down the studio before we start adding anything
+ //
+ m_studio->clear();
+}
+
+
+void
+RosegardenSequencerApp::setMappedProperty(int id,
+ const QString &property,
+ float value)
+{
+
+ // SEQUENCER_DEBUG << "setProperty: id = " << id
+ // << " : property = \"" << property << "\""
+ // << ", value = " << value << endl;
+
+
+ MappedObject *object = m_studio->getObjectById(id);
+
+ if (object)
+ object->setProperty(property, value);
+}
+
+void
+RosegardenSequencerApp::setMappedProperties(const MappedObjectIdList &ids,
+ const MappedObjectPropertyList &properties,
+ const MappedObjectValueList &values)
+{
+ MappedObject *object = 0;
+ MappedObjectId prevId = 0;
+
+ for (size_t i = 0;
+ i < ids.size() && i < properties.size() && i < values.size();
+ ++i) {
+
+ if (i == 0 || ids[i] != prevId) {
+ object = m_studio->getObjectById(ids[i]);
+ prevId = ids[i];
+ }
+
+ if (object) {
+ object->setProperty(properties[i], values[i]);
+ }
+ }
+}
+
+void
+RosegardenSequencerApp::setMappedProperty(int id,
+ const QString &property,
+ const QString &value)
+{
+
+ SEQUENCER_DEBUG << "setProperty: id = " << id
+ << " : property = \"" << property << "\""
+ << ", value = " << value << endl;
+
+
+ MappedObject *object = m_studio->getObjectById(id);
+
+ if (object)
+ object->setProperty(property, value);
+}
+
+void
+RosegardenSequencerApp::setMappedPropertyList(int id, const QString &property,
+ const MappedObjectPropertyList &values)
+{
+ SEQUENCER_DEBUG << "setPropertyList: id = " << id
+ << " : property list size = \"" << values.size()
+ << "\"" << endl;
+
+ MappedObject *object = m_studio->getObjectById(id);
+
+ if (object) {
+ try {
+ object->setPropertyList(property, values);
+ } catch (QString err) {
+ QByteArray data;
+ QDataStream arg(data, IO_WriteOnly);
+ arg << err;
+ kapp->dcopClient()->send(ROSEGARDEN_GUI_APP_NAME,
+ ROSEGARDEN_GUI_IFACE_NAME,
+ "showError(QString)",
+ data);
+ }
+ }
+}
+
+
+int
+RosegardenSequencerApp::getMappedObjectId(int type)
+{
+ int value = -1;
+
+ MappedObject *object =
+ m_studio->getObjectOfType(
+ MappedObject::MappedObjectType(type));
+
+ if (object) {
+ value = int(object->getId());
+ }
+
+ return value;
+}
+
+
+std::vector<QString>
+RosegardenSequencerApp::getPropertyList(int id,
+ const QString &property)
+{
+ std::vector<QString> list;
+
+ MappedObject *object =
+ m_studio->getObjectById(id);
+
+ if (object) {
+ list = object->getPropertyList(property);
+ }
+
+ SEQUENCER_DEBUG << "getPropertyList - return " << list.size()
+ << " items" << endl;
+
+ return list;
+}
+
+std::vector<QString>
+RosegardenSequencerApp::getPluginInformation()
+{
+ std::vector<QString> list;
+
+ PluginFactory::enumerateAllPlugins(list);
+
+ return list;
+}
+
+QString
+RosegardenSequencerApp::getPluginProgram(int id, int bank, int program)
+{
+ MappedObject *object = m_studio->getObjectById(id);
+
+ if (object) {
+ MappedPluginSlot *slot =
+ dynamic_cast<MappedPluginSlot *>(object);
+ if (slot) {
+ return slot->getProgram(bank, program);
+ }
+ }
+
+ return QString();
+}
+
+unsigned long
+RosegardenSequencerApp::getPluginProgram(int id, const QString &name)
+{
+ MappedObject *object = m_studio->getObjectById(id);
+
+ if (object) {
+ MappedPluginSlot *slot =
+ dynamic_cast<MappedPluginSlot *>(object);
+ if (slot) {
+ return slot->getProgram(name);
+ }
+ }
+
+ return 0;
+}
+
+unsigned int
+RosegardenSequencerApp::getSampleRate() const
+{
+ if (m_driver)
+ return m_driver->getSampleRate();
+
+ return 0;
+}
+
+// Creates an object of a type
+//
+int
+RosegardenSequencerApp::createMappedObject(int type)
+{
+ MappedObject *object =
+ m_studio->createObject(
+ MappedObject::MappedObjectType(type));
+
+ if (object) {
+ SEQUENCER_DEBUG << "createMappedObject - type = "
+ << type << ", object id = "
+ << object->getId() << endl;
+ return object->getId();
+ }
+
+ return 0;
+}
+
+// Destroy an object
+//
+int
+RosegardenSequencerApp::destroyMappedObject(int id)
+{
+ return (int(m_studio->destroyObject(MappedObjectId(id))));
+}
+
+// Connect two objects
+//
+void
+RosegardenSequencerApp::connectMappedObjects(int id1, int id2)
+{
+ m_studio->connectObjects(MappedObjectId(id1),
+ MappedObjectId(id2));
+
+ // When this happens we need to resynchronise our audio processing,
+ // and this is the easiest (and most brutal) way to do it.
+ if (m_transportStatus == PLAYING ||
+ m_transportStatus == RECORDING) {
+ RealTime seqTime = m_driver->getSequencerTime();
+ jumpTo(seqTime.sec, seqTime.nsec);
+ }
+}
+
+// Disconnect two objects
+//
+void
+RosegardenSequencerApp::disconnectMappedObjects(int id1, int id2)
+{
+ m_studio->disconnectObjects(MappedObjectId(id1),
+ MappedObjectId(id2));
+}
+
+// Disconnect an object from everything
+//
+void
+RosegardenSequencerApp::disconnectMappedObject(int id)
+{
+ m_studio->disconnectObject(MappedObjectId(id));
+}
+
+
+void
+RosegardenSequencerApp::clearStudio()
+{
+ SEQUENCER_DEBUG << "clearStudio()" << endl;
+ m_studio->clear();
+ m_sequencerMapper.getSequencerDataBlock()->clearTemporaries();
+
+}
+
+void
+RosegardenSequencerApp::setMappedPort(int pluginId,
+ unsigned long portId,
+ float value)
+{
+ MappedObject *object =
+ m_studio->getObjectById(pluginId);
+
+ MappedPluginSlot *slot =
+ dynamic_cast<MappedPluginSlot *>(object);
+
+ if (slot) {
+ slot->setPort(portId, value);
+ } else {
+ SEQUENCER_DEBUG << "no such slot" << endl;
+ }
+}
+
+float
+RosegardenSequencerApp::getMappedPort(int pluginId,
+ unsigned long portId)
+{
+ MappedObject *object =
+ m_studio->getObjectById(pluginId);
+
+ MappedPluginSlot *slot =
+ dynamic_cast<MappedPluginSlot *>(object);
+
+ if (slot) {
+ return slot->getPort(portId);
+ } else {
+ SEQUENCER_DEBUG << "no such slot" << endl;
+ }
+
+ return 0;
+}
+
+void
+RosegardenSequencerApp::slotCheckForNewClients()
+{
+ // Don't do this check if any of these conditions hold
+ //
+ if (m_transportStatus == PLAYING ||
+ m_transportStatus == RECORDING)
+ return ;
+
+ if (m_driver->checkForNewClients()) {
+ SEQUENCER_DEBUG << "client list changed" << endl;
+ }
+}
+
+
+// Set the MIDI Clock period in microseconds
+//
+void
+RosegardenSequencerApp::setQuarterNoteLength(long timeSec, long timeNSec)
+{
+ SEQUENCER_DEBUG << "RosegardenSequencerApp::setQuarterNoteLength"
+ << RealTime(timeSec, timeNSec) << endl;
+
+ m_driver->setMIDIClockInterval(
+ RealTime(timeSec, timeNSec) / 24);
+}
+
+QString
+RosegardenSequencerApp::getStatusLog()
+{
+ return m_driver->getStatusLog();
+}
+
+
+void RosegardenSequencerApp::dumpFirstSegment()
+{
+ SEQUENCER_DEBUG << "Dumping 1st segment data :\n";
+
+ unsigned int i = 0;
+ MmappedSegment* firstMappedSegment = (*(m_mmappedSegments.begin())).second;
+
+ MmappedSegment::iterator it(firstMappedSegment);
+
+ for (; !it.atEnd(); ++it) {
+
+ MappedEvent evt = (*it);
+ SEQUENCER_DEBUG << i << " : inst = " << evt.getInstrument()
+ << " - type = " << evt.getType()
+ << " - data1 = " << (unsigned int)evt.getData1()
+ << " - data2 = " << (unsigned int)evt.getData2()
+ << " - time = " << evt.getEventTime()
+ << " - duration = " << evt.getDuration()
+ << " - audio mark = " << evt.getAudioStartMarker()
+ << endl;
+
+ ++i;
+ }
+
+ SEQUENCER_DEBUG << "Dumping 1st segment data - done\n";
+
+}
+
+
+void
+RosegardenSequencerApp::rationalisePlayingAudio()
+{
+ std::vector<MappedEvent> audioEvents;
+ m_metaIterator->getAudioEvents(audioEvents);
+ m_driver->initialiseAudioQueue(audioEvents);
+}
+
+
+ExternalTransport::TransportToken
+RosegardenSequencerApp::transportChange(TransportRequest request)
+{
+ TransportPair pair(request, RealTime::zeroTime);
+ m_transportRequests.push_back(pair);
+
+ std::cout << "RosegardenSequencerApp::transportChange: " << request << std::endl;
+
+ if (request == TransportNoChange)
+ return m_transportToken;
+ else
+ return m_transportToken + 1;
+}
+
+ExternalTransport::TransportToken
+RosegardenSequencerApp::transportJump(TransportRequest request,
+ RealTime rt)
+{
+ TransportPair pair(request, rt);
+ m_transportRequests.push_back(pair);
+
+ std::cout << "RosegardenSequencerApp::transportJump: " << request << ", " << rt << std::endl;
+
+ if (request == TransportNoChange)
+ return m_transportToken + 1;
+ else
+ return m_transportToken + 2;
+}
+
+bool
+RosegardenSequencerApp::isTransportSyncComplete(TransportToken token)
+{
+ std::cout << "RosegardenSequencerApp::isTransportSyncComplete: token " << token << ", current token " << m_transportToken << std::endl;
+ return m_transportToken >= token;
+}
+
+bool
+RosegardenSequencerApp::checkExternalTransport()
+{
+ bool rv = (!m_transportRequests.empty());
+
+ while (!m_transportRequests.empty()) {
+
+ TransportPair pair = *m_transportRequests.begin();
+ m_transportRequests.pop_front();
+
+ QByteArray data;
+
+ switch (pair.first) {
+
+ case TransportNoChange:
+ break;
+
+ case TransportStop:
+ kapp->dcopClient()->send(ROSEGARDEN_GUI_APP_NAME,
+ ROSEGARDEN_GUI_IFACE_NAME,
+ "stop()",
+ data);
+ break;
+
+ case TransportStart:
+ kapp->dcopClient()->send(ROSEGARDEN_GUI_APP_NAME,
+ ROSEGARDEN_GUI_IFACE_NAME,
+ "play()",
+ data);
+ break;
+
+ case TransportPlay:
+ kapp->dcopClient()->send(ROSEGARDEN_GUI_APP_NAME,
+ ROSEGARDEN_GUI_IFACE_NAME,
+ "play()",
+ data);
+ break;
+
+ case TransportRecord:
+ kapp->dcopClient()->send(ROSEGARDEN_GUI_APP_NAME,
+ ROSEGARDEN_GUI_IFACE_NAME,
+ "record()",
+ data);
+ break;
+
+ case TransportJumpToTime: {
+ QDataStream arg(data, IO_WriteOnly);
+ arg << (int)pair.second.sec;
+ arg << (int)pair.second.usec();
+
+ kapp->dcopClient()->send(ROSEGARDEN_GUI_APP_NAME,
+ ROSEGARDEN_GUI_IFACE_NAME,
+ "jumpToTime(int, int)",
+ data);
+
+ if (m_transportStatus == PLAYING ||
+ m_transportStatus != RECORDING) {
+ jumpTo(pair.second.sec, pair.second.usec() * 1000);
+ }
+
+ incrementTransportToken();
+ break;
+ }
+
+ case TransportStartAtTime: {
+ QDataStream arg(data, IO_WriteOnly);
+ arg << (int)pair.second.sec;
+ arg << (int)pair.second.usec();
+
+ kapp->dcopClient()->send(ROSEGARDEN_GUI_APP_NAME,
+ ROSEGARDEN_GUI_IFACE_NAME,
+ "startAtTime(int, int)",
+ data);
+ break;
+ }
+
+ case TransportStopAtTime: {
+ kapp->dcopClient()->send(ROSEGARDEN_GUI_APP_NAME,
+ ROSEGARDEN_GUI_IFACE_NAME,
+ "stop()",
+ data);
+
+ QDataStream arg(data, IO_WriteOnly);
+ arg << (int)pair.second.sec;
+ arg << (int)pair.second.usec();
+
+ kapp->dcopClient()->send(ROSEGARDEN_GUI_APP_NAME,
+ ROSEGARDEN_GUI_IFACE_NAME,
+ "jumpToTime(int, int)",
+ data);
+ break;
+ }
+ }
+ }
+
+ return rv;
+}
+
+void
+RosegardenSequencerApp::incrementTransportToken()
+{
+ ++m_transportToken;
+ SEQUENCER_DEBUG << "RosegardenSequencerApp::incrementTransportToken: incrementing to " << m_transportToken << endl;
+}
+
+}
+
+#include "RosegardenSequencerApp.moc"
diff --git a/src/sequencer/RosegardenSequencerApp.h b/src/sequencer/RosegardenSequencerApp.h
new file mode 100644
index 0000000..bb72547
--- /dev/null
+++ b/src/sequencer/RosegardenSequencerApp.h
@@ -0,0 +1,531 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _ROSEGARDEN_SEQUENCER_APP_H_
+#define _ROSEGARDEN_SEQUENCER_APP_H_
+
+// RosegardenSequencerApp is the sequencer application for Rosegarden.
+// It owns a Sequencer object which wraps the ALSA
+// and JACK funtionality. At this level we deal with comms with
+// the Rosegarden GUI application, the high level marshalling of data
+// and main event loop of the sequencer. [rwb]
+//
+
+
+// include files for Qt
+#include <qstrlist.h>
+
+// include files for KDE
+#include <kapp.h>
+#include <kmainwindow.h>
+#include <kaccel.h>
+
+#include <qtimer.h>
+
+#include "base/Composition.h"
+#include "gui/application/RosegardenDCOP.h"
+
+#include "RosegardenSequencerIface.h"
+
+#include "sound/MappedComposition.h"
+#include "base/Event.h"
+#include "sound/MappedStudio.h"
+#include "sound/ExternalTransport.h"
+
+#include "MmappedSegment.h"
+#include "SequencerMmapper.h"
+
+#include <deque>
+
+class KURL;
+class KRecentFilesAction;
+
+namespace Rosegarden {
+
+// forward declaration of the RosegardenGUI classes
+class RosegardenGUIDoc;
+class RosegardenGUIView;
+class ControlBlockMmapper;
+
+class MappedInstrument;
+class SoundDriver;
+
+/**
+ * The sequencer application
+ */
+class RosegardenSequencerApp : public KMainWindow,
+ virtual public RosegardenSequencerIface,
+ public ExternalTransport
+{
+ Q_OBJECT
+
+public:
+ RosegardenSequencerApp();
+ ~RosegardenSequencerApp();
+
+ // -------- START OF DCOP INTERFACE METHODS --------
+ //
+ //
+
+
+ // Quit
+ virtual void quit();
+
+ // Based on RealTime timestamps
+ //
+ int play(const RealTime &position,
+ const RealTime &readAhead,
+ const RealTime &audioMix,
+ const RealTime &audioRead,
+ const RealTime &audioWrite,
+ long smallFileSize);
+
+ // recording
+ int record(const RealTime &position,
+ const RealTime &readAhead,
+ const RealTime &audioMix,
+ const RealTime &audioRead,
+ const RealTime &audioWrite,
+ long smallFileSize,
+ long recordMode);
+
+ virtual int punchOut();
+
+ // looping
+ void setLoop(const RealTime &loopStart,
+ const RealTime &loopEnd);
+
+
+ // Play wrapper for DCOP
+ //
+ virtual int play(long timeSec,
+ long timeNsec,
+ long readAheadSec,
+ long readAheadNsec,
+ long audioMixSec,
+ long audioMixNsec,
+ long audioReadSec,
+ long audioReadNsec,
+ long audioWriteSec,
+ long audioWriteNsec,
+ long smallFileSize);
+
+ // Record wrapper for DCOP
+ //
+ virtual int record(long timeSec,
+ long timeNsec,
+ long readAheadSec,
+ long readAheadNsec,
+ long audioMixSec,
+ long audioMixNsec,
+ long audioReadSec,
+ long audioReadNsec,
+ long audioWriteSec,
+ long audioWriteNsec,
+ long smallFileSize,
+ long recordMode);
+
+
+ // Jump to a pointer in the playback (uses longs instead
+ // of RealTime for DCOP)
+ //
+ //
+ virtual void jumpTo(long posSec, long posNsec);
+
+ // Set a loop on the Sequencer
+ //
+ virtual void setLoop(long loopStartSec, long loopStartNsec,
+ long loopEndSec, long loopEndNsec);
+
+ // Return the Sound system status (audio/MIDI)
+ //
+ virtual unsigned int getSoundDriverStatus(const QString &guiVersion);
+
+ // Add and remove Audio files on the sequencer
+ //
+ virtual int addAudioFile(const QString &fileName, int id);
+ virtual int removeAudioFile(int id);
+
+ // Deletes all the audio files and clears down any flapping i/o handles
+ //
+ virtual void clearAllAudioFiles();
+
+ // stops the sequencer
+ //
+ virtual void stop();
+
+ // Set a MappedInstrument at the Sequencer
+ //
+ virtual void setMappedInstrument(int type, unsigned char channel,
+ unsigned int id);
+
+ // The sequencer will process the MappedComposition as soon as it
+ // gets the chance.
+ //
+ virtual void processSequencerSlice(MappedComposition mC);
+
+ // Yeuch!
+ //
+ virtual void processMappedEvent(unsigned int id,
+ int type,
+ unsigned char pitch,
+ unsigned char velocity,
+ long absTimeSec,
+ long absTimeNsec,
+ long durationSec,
+ long durationNsec,
+ long audioStartMarkerSec,
+ long audioStartMarkerNsec);
+
+ // And now do it properly
+ //
+ virtual void processMappedEvent(MappedEvent mE);
+
+ virtual unsigned int getDevices();
+ virtual MappedDevice getMappedDevice(unsigned int id);
+
+ virtual int canReconnect(int deviceType);
+ virtual unsigned int addDevice(int type, unsigned int direction);
+ virtual void removeDevice(unsigned int id);
+ virtual void renameDevice(unsigned int id, QString name);
+ virtual unsigned int getConnections(int type, unsigned int direction);
+ virtual QString getConnection(int type, unsigned int direction,
+ unsigned int connectionNo);
+ virtual void setConnection(unsigned int deviceId, QString connection);
+ virtual void setPlausibleConnection(unsigned int deviceId,
+ QString idealConnection);
+
+ virtual unsigned int getTimers();
+ virtual QString getTimer(unsigned int n);
+ virtual QString getCurrentTimer();
+ virtual void setCurrentTimer(QString timer);
+
+ virtual void setLowLatencyMode(bool);
+
+ // Audio latencies
+ //
+ virtual MappedRealTime getAudioPlayLatency();
+ virtual MappedRealTime getAudioRecordLatency();
+
+ // Set a MappedObject
+ //
+ virtual void setMappedProperty(int id,
+ const QString &property,
+ float value);
+
+ // Set many properties on many MappedObjects
+ //
+ virtual void setMappedProperties(const MappedObjectIdList &ids,
+ const MappedObjectPropertyList &properties,
+ const MappedObjectValueList &values);
+
+ // Set a MappedObject to a string
+ //
+ virtual void setMappedProperty(int id,
+ const QString &property,
+ const QString &value);
+
+ // Set a MappedObject to a property list
+ //
+ virtual void setMappedPropertyList(int id,
+ const QString &property,
+ const MappedObjectPropertyList &values);
+
+ // Get a MappedObject for a type
+ //
+ virtual int getMappedObjectId(int type);
+
+ // Get a Property list from an Object
+ //
+ virtual std::vector<QString> getPropertyList(int id,
+ const QString &property);
+
+ virtual std::vector<QString> getPluginInformation();
+
+ virtual QString getPluginProgram(int id, int bank, int program);
+
+ virtual unsigned long getPluginProgram(int id, const QString &name);
+
+ // Set a plugin port
+ //
+ virtual void setMappedPort(int pluginId,
+ unsigned long portId,
+ float value);
+
+ virtual float getMappedPort(int pluginId,
+ unsigned long portId);
+
+ // Create a MappedObject
+ virtual int createMappedObject(int type);
+
+ // Destroy an object
+ //
+ virtual int destroyMappedObject(int id);
+
+ // Connect two objects
+ //
+ virtual void connectMappedObjects(int id1, int id2);
+
+ // Disconnect two objects
+ //
+ virtual void disconnectMappedObjects(int id1, int id2);
+
+ // Disconnect an object from everything
+ //
+ virtual void disconnectMappedObject(int id);
+
+ // Sample rate
+ //
+ virtual unsigned int getSampleRate() const;
+
+ // Clear the studio
+ //
+ virtual void clearStudio();
+
+ // Debug stuff, to check MmappedSegment::iterator
+ virtual void dumpFirstSegment();
+
+ virtual void remapSegment(const QString& filename, size_t newSize);
+ virtual void addSegment(const QString& filename);
+ virtual void deleteSegment(const QString& filename);
+ virtual void closeAllSegments();
+ virtual void remapTracks();
+
+ // Set Quarter note length
+ //
+ virtual void setQuarterNoteLength(long timeSec, long timeNsec);
+
+ // Get a status report
+ //
+ virtual QString getStatusLog();
+
+ //
+ //
+ //
+ // -------- END OF DCOP INTERFACE --------
+
+
+
+
+ void setStatus(TransportStatus status)
+ { m_transportStatus = status; }
+ TransportStatus getStatus() { return m_transportStatus; }
+
+ // Process the first chunk of Sequencer events
+ bool startPlaying();
+
+ // Process all subsequent events
+ bool keepPlaying();
+
+ // Update internal clock and send GUI position pointer movement
+ void updateClocks();
+
+ bool checkExternalTransport();
+
+ // Sends status changes up to GUI
+ void notifySequencerStatus();
+
+ // Send latest slice information back to GUI for display
+ void notifyVisuals(MappedComposition *mC);
+
+ // These two methods process any pending MIDI or audio
+ // and send them up to the gui for storage and display
+ //
+ void processRecordedMidi();
+ void processRecordedAudio();
+
+ // Called during stopped or playing operation to process
+ // any pending incoming MIDI events that aren't being
+ // recorded (i.e. for display in Transport or on Mixer)
+ //
+ void processAsynchronousEvents();
+
+ // Sleep for the given time, approximately. Called from the main
+ // loop in order to lighten CPU load (i.e. the timing quality of
+ // the sequencer does not depend on this being accurate). A good
+ // implementation of this call would return right away when an
+ // incoming MIDI event needed to be handled.
+ //
+ void sleep(const RealTime &rt);
+
+ // Removes from a MappedComposition the events not matching
+ // the supplied filer.
+ //
+ void applyFiltering(MappedComposition *mC,
+ MidiFilter filter,
+ bool filterControlDevice);
+
+ // This method assigns an Instrument to each MappedEvent
+ // belongin to the MappedComposition, and sends the
+ // transformed events to the driver to be played.
+ //
+ void routeEvents(MappedComposition *mC, bool useSelectedTrack);
+
+ // Are we looping?
+ //
+ bool isLooping() const { return !(m_loopStart == m_loopEnd); }
+
+ // the call itself
+ void sequencerAlive();
+
+ /*
+ // Audio latencies
+ //
+ RealTime getAudioPlaybackLatency()
+ { return m_audioPlayLatency; }
+ void setAudioPlaybackLatency(const RealTime &latency)
+ { m_audioPlayLatency = latency; }
+
+ RealTime getAudioRecordLatency()
+ { return m_audioRecordLatency; }
+ void setAudioRecordLatency(const RealTime &latency)
+ { m_audioRecordLatency = latency; }
+ */
+
+ // Initialise the virtual studio at this end of the link
+ //
+ void initialiseStudio();
+
+
+ // --------- EXTERNAL TRANSPORT INTERFACE METHODS --------
+ //
+ // Whereas the DCOP interface (above) is for the GUI to call to
+ // make the sequencer follow its wishes, this interface is for
+ // external clients to call (via some low-level audio callback)
+ // and requires sychronising with the GUI.
+
+ TransportToken transportChange(TransportRequest);
+ TransportToken transportJump(TransportRequest, RealTime);
+ bool isTransportSyncComplete(TransportToken token);
+ TransportToken getInvalidTransportToken() const { return 0; }
+
+public slots:
+
+ // Check for new clients - on timeout
+ //
+ void slotCheckForNewClients();
+
+protected:
+
+ // get events whilst handling loop
+ //
+ void fetchEvents(MappedComposition &,
+ const RealTime &start,
+ const RealTime &end,
+ bool firstFetch);
+
+ // just get a slice of events between markers
+ //
+ void getSlice(MappedComposition &,
+ const RealTime &start,
+ const RealTime &end,
+ bool firstFetch);
+
+ // adjust event times according to relative instrument latencies
+ //
+ void applyLatencyCompensation(MappedComposition &);
+
+ // mmap-related stuff
+ MmappedSegment* mmapSegment(const QString&);
+ void cleanupMmapData();
+ void initMetaIterator();
+
+ void rationalisePlayingAudio();
+ void setEndOfCompReached(bool e) { m_isEndOfCompReached = e; }
+ bool isEndOfCompReached() { return m_isEndOfCompReached; }
+ void incrementTransportToken();
+
+ //--------------- Data members ---------------------------------
+
+ SoundDriver *m_driver;
+ TransportStatus m_transportStatus;
+
+ // Position pointer
+ RealTime m_songPosition;
+ RealTime m_lastFetchSongPosition;
+
+ RealTime m_readAhead;
+ RealTime m_audioMix;
+ RealTime m_audioRead;
+ RealTime m_audioWrite;
+ int m_smallFileSize;
+
+ /*
+
+ // Not required at the sequencer
+
+ // Two more latencies for audio play and record - when we
+ // use an unsynchronised audio and MIDI system such as
+ // ALSA and JACK we need to use these additional values
+ // to help time-keeping.
+ //
+ RealTime m_audioPlayLatency;
+ RealTime m_audioRecordLatency;
+
+ */
+
+
+ RealTime m_loopStart;
+ RealTime m_loopEnd;
+
+ std::vector<MappedInstrument*> m_instruments;
+
+ // MappedStudio holds all of our session-persistent information -
+ // sliders and what have you. It's also streamable over DCOP
+ // so you can reconstruct it at either end of the link for
+ // presentation, storage etc.
+ //
+ MappedStudio *m_studio;
+
+ // Slice revert storage
+ //
+ RealTime m_oldSliceSize;
+ QTimer *m_sliceTimer;
+
+ // Timer to check for new clients
+ //
+ QTimer *m_newClientTimer;
+
+ // mmap segments
+ //
+ QString m_segmentFilesPath;
+ MmappedSegmentsMetaIterator::mmappedsegments m_mmappedSegments;
+ MmappedSegmentsMetaIterator* m_metaIterator;
+ RealTime m_lastStartTime;
+
+ MappedComposition m_mC;
+ ControlBlockMmapper *m_controlBlockMmapper;
+ SequencerMmapper m_sequencerMapper;
+
+ typedef std::pair<TransportRequest, RealTime> TransportPair;
+ std::deque<TransportPair> m_transportRequests;
+ TransportToken m_transportToken;
+
+ bool m_isEndOfCompReached;
+};
+
+}
+
+#endif // _ROSEGARDEN_SEQUENCER_APP_H_
diff --git a/src/sequencer/RosegardenSequencerIface.h b/src/sequencer/RosegardenSequencerIface.h
new file mode 100644
index 0000000..47c0215
--- /dev/null
+++ b/src/sequencer/RosegardenSequencerIface.h
@@ -0,0 +1,364 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _ROSEGARDENSEQUENCERIFACE_H_
+#define _ROSEGARDENSEQUENCERIFACE_H_
+
+#include <dcopobject.h>
+// #include <qvaluevector.h>
+// #include <qpair.h>
+
+#include "gui/application/RosegardenDCOP.h"
+
+#include "base/Event.h"
+#include "sound/MappedComposition.h"
+#include "sound/MappedEvent.h"
+#include "base/Instrument.h"
+#include "sound/MappedDevice.h"
+#include "sound/MappedRealTime.h"
+#include "sound/MappedStudio.h"
+#include "sound/MappedCommon.h"
+
+namespace Rosegarden {
+
+class RosegardenSequencerIface : virtual public DCOPObject
+{
+ K_DCOP
+public:
+ k_dcop:
+
+ // close the sequencer
+ //
+ virtual void quit() = 0;
+
+
+
+ // play from a given time with given parameters
+ //
+ virtual int play(long timeSec,
+ long timeNsec,
+ long readAheadSec,
+ long readAheadNsec,
+ long audioMixSec,
+ long audioMixNsec,
+ long audioReadSec,
+ long audioReadNsec,
+ long audioWriteSec,
+ long audioWriteNsec,
+ long smallFileSize) = 0;
+
+ // record from a given time with given parameters
+ //
+ virtual int record(long timeSec,
+ long timeNsec,
+ long readAheadSec,
+ long readAheadNsec,
+ long audioMixSec,
+ long audioMixNsec,
+ long audioReadSec,
+ long audioReadNsec,
+ long audioWriteSec,
+ long audioWriteNsec,
+ long smallFileSize,
+ long recordMode) = 0;
+
+ // stop the sequencer
+ //
+ virtual ASYNC stop() = 0;
+
+ // punch out from recording to playback
+ //
+ virtual int punchOut() = 0;
+
+ // Set the sequencer to a given time
+ //
+ virtual void jumpTo(long posSec, long posNsec) = 0;
+
+ // Set a loop on the sequencer
+ //
+ virtual void setLoop(long loopStartSec,
+ long loopStartNsec,
+ long loopEndSec,
+ long loopEndNsec) = 0;
+
+ // Get the status of the Sequencer
+ //
+ virtual unsigned int getSoundDriverStatus(const QString &guiVersion) = 0;
+
+ // Add and delete audio files on the Sequencer
+ //
+ virtual int addAudioFile(const QString &fileName, int id) = 0;
+ virtual int removeAudioFile(int id) = 0;
+ virtual void clearAllAudioFiles() = 0;
+
+ // Single set function as the MappedInstrument is so lightweight.
+ // Any mods on the GUI are sent only through this method.
+ //
+ virtual void setMappedInstrument(int type,
+ unsigned char channel,
+ unsigned int id) = 0;
+
+ // The GUI can use this method to process an immediate selection
+ // of MappedEvents (Program Changes, SysExs, async Events etc).
+ //
+ virtual void processSequencerSlice(MappedComposition mC) = 0;
+
+
+ // Horrible ugly ugly ugly interface for single MappedEvents
+ // just until we implement the proper MappedEvent interface
+ //
+ virtual void processMappedEvent(unsigned int id,
+ int type,
+ unsigned char pitch,
+ unsigned char velocity,
+ long absTimeSec,
+ long absTimeNsec,
+ long durationSec,
+ long durationNsec,
+ long audioStartMarkerSec,
+ long audioStartMarkerNsec) = 0;
+
+ // The proper implementation
+ //
+ virtual void processMappedEvent(MappedEvent mE) = 0;
+
+ // Return device id following last existing one -- you can treat
+ // this as "number of devices" but there might be some holes if
+ // devices were deleted, which you will recognise because
+ // getMappedDevice(id) will return a device with id NO_DEVICE
+ //
+ virtual unsigned int getDevices() = 0;
+
+ // Return device by number
+ //
+ virtual MappedDevice getMappedDevice(unsigned int id) = 0;
+
+ // Query whether the driver implements device reconnection.
+ // Returns a non-zero value if the addDevice, removeDevice,
+ // getConnections, getConnection and setConnection methods
+ // may be used with devices of the given type.
+ //
+ virtual int canReconnect(int deviceType) = 0;
+
+ // Create a device of the given type and direction (corresponding
+ // to MidiDevice::DeviceDirection enum) and return its id.
+ // The device will have no connection by default. Direction is
+ // currently ignored for non-MIDI devices.
+ // Do not use this unless canReconnect(type) returned true.
+ //
+ virtual unsigned int addDevice(int type, unsigned int direction) = 0;
+
+ // Remove the device of the given id.
+ // Ignored if driver does not permit changing the number of devices
+ // (i.e. if canReconnect(type) would return false when given the
+ // type of the supplied device).
+ //
+ virtual void removeDevice(unsigned int id) = 0;
+
+ // Rename the given device.
+ // Ignored if the driver does not permit this operation.
+ //
+ virtual void renameDevice(unsigned int id, QString name) = 0;
+
+ // Return the number of permissible connections for a device of
+ // the given type and direction (corresponding to MidiDevice::
+ // DeviceDirection enum). Direction is ignored for non-MIDI devices.
+ // Returns zero if devices of this type are non-reconnectable
+ // (i.e. if canReconnect(type) would return false).
+ //
+ virtual unsigned int getConnections(int type, unsigned int direction) = 0;
+
+ // Return one of the set of permissible connections for a device of
+ // the given type and direction (corresponding to MidiDevice::
+ // DeviceDirection enum). Direction is ignored for non-MIDI devices.
+ // Returns the empty string for invalid parameters.
+ //
+ virtual QString getConnection(int type,
+ unsigned int direction,
+ unsigned int connectionNo) = 0;
+
+ // Reconnect a particular device.
+ // Ignored if driver does not permit reconnections or the connection
+ // is not one of the permissible set for that device.
+ //
+ virtual void setConnection(unsigned int deviceId, QString connection) = 0;
+
+ // Reconnect a device to a particular connection or to the closest
+ // thing to that connection currently available (using some heuristic).
+ // Ignored if driver does not permit reconnections.
+ //
+ virtual void setPlausibleConnection(unsigned int deviceId,
+ QString idealConnection) = 0;
+
+ // Return the number of different timers we are capable of
+ // sychronising against. This may return 0 if the driver has no
+ // ability to change the current timer.
+ //
+ virtual unsigned int getTimers() = 0;
+
+ // Return the name of a timer from the available set (where
+ // n is between 0 and the return value from getTimers() - 1).
+ //
+ virtual QString getTimer(unsigned int n) = 0;
+
+ // Return the name of the timer we are currently synchronising
+ // against.
+ //
+ virtual QString getCurrentTimer() = 0;
+
+ // Set the timer we are currently synchronising against.
+ // Invalid arguments are simply ignored.
+ //
+ virtual void setCurrentTimer(QString timer) = 0;
+
+ virtual void setLowLatencyMode(bool lowLatMode) = 0;
+
+ // Fetch audio play latencies
+ //
+ virtual MappedRealTime getAudioPlayLatency() = 0;
+ virtual MappedRealTime getAudioRecordLatency() = 0;
+
+ // Set a property on a MappedObject
+ //
+ virtual void setMappedProperty(int id,
+ const QString &property,
+ float value) = 0;
+
+ // Set many properties on many MappedObjects
+ //
+ virtual void setMappedProperties(const MappedObjectIdList &ids,
+ const MappedObjectPropertyList &properties,
+ const MappedObjectValueList &values) = 0;
+
+ // Set a string property on a MappedObject
+ //
+ virtual void setMappedProperty(int id,
+ const QString &property,
+ const QString &value) = 0;
+
+ // Set a MappedObject to a property list
+ //
+ virtual void setMappedPropertyList(
+ int id,
+ const QString &property,
+ const MappedObjectPropertyList &values) = 0;
+
+ // Get a mapped object id for a object type
+ //
+ virtual int getMappedObjectId(int type) = 0;
+
+ // Get a list of properties of a certain type from an object
+ //
+ virtual std::vector<QString> getPropertyList(int id,
+ const QString &property) = 0;
+
+ // Get a list of available plugins
+ //
+ virtual std::vector<QString> getPluginInformation() = 0;
+
+ // Nasty hack: program name/number mappings are one thing that
+ // mapped object properties can't cope with
+ //
+ virtual QString getPluginProgram(int mappedId, int bank, int program) = 0;
+
+ // Nastier hack: return value is bank << 16 + program
+ //
+ virtual unsigned long getPluginProgram(int mappedId, const QString &name) = 0;
+
+ // Cheat - we can't use a call (getPropertyList) during playback
+ // so we use this method to set port N on plugin X.
+ //
+ virtual void setMappedPort(int pluginIn,
+ unsigned long id,
+ float value) = 0;
+
+ virtual float getMappedPort(int pluginIn,
+ unsigned long id) = 0;
+
+ // Create a (transient, writeable) object
+ //
+ virtual int createMappedObject(int type) = 0;
+
+ // Destroy an object (returns a bool but for KDE2 DCOP compat we
+ // use an int of course).
+ //
+ virtual int destroyMappedObject(int id) = 0;
+
+ // Connect two objects
+ //
+ virtual void connectMappedObjects(int id1, int id2) = 0;
+
+ // Disconnect two objects
+ //
+ virtual void disconnectMappedObjects(int id1, int id2) = 0;
+
+ // Disconnect an object from everything
+ //
+ virtual void disconnectMappedObject(int id) = 0;
+
+ // Driver sample rate
+ //
+ virtual unsigned int getSampleRate() const = 0;
+
+ // Initialise/Reinitialise the studio back down to read only objects
+ // and set to defaults.
+ //
+ virtual void clearStudio() = 0;
+
+ // Allow the GUI to tell the sequence the duration of a quarter
+ // note when the TEMPO changes - this is to allow the sequencer
+ // to generate MIDI clock (at 24 PPQN).
+ //
+ virtual void setQuarterNoteLength(long timeSec, long timeNsec) = 0;
+
+ // Return a (potentially lengthy) human-readable status log
+ //
+ virtual QString getStatusLog() = 0;
+
+ // Debug stuff, to check MmappedSegment::iterator
+ virtual void dumpFirstSegment() = 0;
+
+ /// Remap a segment while playing
+ virtual void remapSegment(const QString& filename, size_t newSize) = 0;
+
+ /// Add a segment while playing
+ virtual void addSegment(const QString& filename) = 0;
+
+ /// Delete a segment while playing
+ virtual void deleteSegment(const QString& filename) = 0;
+
+ /// Close all mmapped segments
+ virtual void closeAllSegments() = 0;
+
+ /** Update mute (etc) statuses while playing. The sequencer handles
+ this automatically (with no need for this call) for MIDI events,
+ but it needs to be prodded when an already-playing audio segment
+ drops in or out.
+ */
+ virtual void remapTracks() = 0;
+};
+
+}
+
+#endif // _ROSEGARDENSEQUENCERIFACE_H_
diff --git a/src/sequencer/SequencerMmapper.cpp b/src/sequencer/SequencerMmapper.cpp
new file mode 100644
index 0000000..3a634ba
--- /dev/null
+++ b/src/sequencer/SequencerMmapper.cpp
@@ -0,0 +1,146 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <sys/mman.h>
+#include <unistd.h>
+#include <errno.h>
+
+#include <kstddirs.h>
+
+#include <qfile.h>
+
+#include "SequencerMmapper.h"
+#include "misc/Debug.h"
+
+#include "base/RealTime.h"
+#include "base/Exception.h"
+#include "sound/MappedEvent.h"
+#include "sound/MappedComposition.h"
+
+namespace Rosegarden
+{
+
+// Seems not to be properly defined under some gcc 2.95 setups
+#ifndef MREMAP_MAYMOVE
+#define MREMAP_MAYMOVE 1
+#endif
+
+SequencerMmapper::SequencerMmapper():
+ m_fileName(createFileName()),
+ m_fd( -1),
+ m_mmappedBuffer(0),
+ m_mmappedSize(sizeof(SequencerDataBlock))
+{
+ // just in case
+ QFile::remove
+ (m_fileName);
+
+ m_fd = ::open(m_fileName.latin1(),
+ O_RDWR | O_CREAT | O_TRUNC,
+ S_IRUSR | S_IWUSR);
+
+ if (m_fd < 0) {
+ SEQUENCER_DEBUG << "SequencerMmapper : Couldn't open " << m_fileName
+ << endl;
+ throw Exception("Couldn't open " + std::string(m_fileName.data()));
+ }
+
+ setFileSize(m_mmappedSize);
+
+ //
+ // mmap() file for writing
+ //
+ m_mmappedBuffer = ::mmap(0, m_mmappedSize,
+ PROT_READ | PROT_WRITE,
+ MAP_SHARED, m_fd, 0);
+
+ if (m_mmappedBuffer == (void*) - 1) {
+ SEQUENCER_DEBUG <<
+ QString("mmap failed : (%1) %2\n").arg(errno).arg(strerror(errno));
+ throw Exception("mmap failed");
+ }
+
+ SEQUENCER_DEBUG << "SequencerMmapper : mmap size : " << m_mmappedSize
+ << " at " << (void*)m_mmappedBuffer << endl;
+
+ // initialise
+ init();
+}
+
+SequencerMmapper::~SequencerMmapper()
+{
+ ::munmap(m_mmappedBuffer, m_mmappedSize);
+ ::close(m_fd);
+ QFile::remove
+ (m_fileName);
+}
+
+void
+SequencerMmapper::init()
+{
+ SEQUENCER_DEBUG << "SequencerMmapper::init()\n";
+
+ m_sequencerDataBlock = new (m_mmappedBuffer)
+ SequencerDataBlock(true);
+
+ ::msync(m_mmappedBuffer, m_mmappedSize, MS_ASYNC);
+}
+
+void
+SequencerMmapper::setFileSize(size_t size)
+{
+ SEQUENCER_DEBUG << "SequencerMmapper : setting size of "
+ << m_fileName << " to " << size << endl;
+ // rewind
+ ::lseek(m_fd, 0, SEEK_SET);
+
+ // enlarge the file
+ // (seek() to wanted size, then write a byte)
+ //
+ if (::lseek(m_fd, size - 1, SEEK_SET) == -1) {
+ std::cerr << "WARNING: SequencerMmapper : Couldn't lseek in " << m_fileName
+ << " to " << size << std::endl;
+ throw Exception("lseek failed");
+ }
+
+ if (::write(m_fd, "\0", 1) != 1) {
+ std::cerr << "WARNING: SequencerMmapper : Couldn't write byte in "
+ << m_fileName << std::endl;
+ throw Exception("write failed");
+ }
+}
+
+QString
+SequencerMmapper::createFileName()
+{
+ return KGlobal::dirs()->resourceDirs("tmp").last() +
+ "/rosegarden_sequencer_timing_block";
+}
+
+}
+
diff --git a/src/sequencer/SequencerMmapper.h b/src/sequencer/SequencerMmapper.h
new file mode 100644
index 0000000..f35c2a7
--- /dev/null
+++ b/src/sequencer/SequencerMmapper.h
@@ -0,0 +1,103 @@
+
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _SEQUENCERMAPPER_H_
+#define _SEQUENCERMAPPER_H_
+
+#include "sound/SequencerDataBlock.h"
+#include "base/RealTime.h"
+
+namespace Rosegarden
+{
+
+class MappedEvent;
+class MappedComposition;
+
+
+class SequencerMmapper
+{
+public:
+ SequencerMmapper();
+ ~SequencerMmapper();
+
+ void updatePositionPointer(RealTime time) {
+ m_sequencerDataBlock->setPositionPointer(time);
+ }
+
+ void updateVisual(MappedEvent *ev) {
+ m_sequencerDataBlock->setVisual(ev);
+ }
+
+ void updateRecordingBuffer(MappedComposition *mC) {
+ m_sequencerDataBlock->addRecordedEvents(mC);
+ }
+
+ void setTrackLevel(TrackId track, const LevelInfo &info) {
+ m_sequencerDataBlock->setTrackLevel(track, info);
+ }
+
+ void setInstrumentLevel(InstrumentId id,
+ const LevelInfo &info) {
+ m_sequencerDataBlock->setInstrumentLevel(id, info);
+ }
+
+ void setInstrumentRecordLevel(InstrumentId id,
+ const LevelInfo &info) {
+ m_sequencerDataBlock->setInstrumentRecordLevel(id, info);
+ }
+
+ void setSubmasterLevel(int submaster,
+ const LevelInfo &info) {
+ m_sequencerDataBlock->setSubmasterLevel(submaster, info);
+ }
+
+ void setMasterLevel(const LevelInfo &info) {
+ m_sequencerDataBlock->setMasterLevel(info);
+ }
+
+ SequencerDataBlock *getSequencerDataBlock() {
+ return m_sequencerDataBlock;
+ }
+ void setControlBlock(ControlBlock *cb) {
+ m_sequencerDataBlock->setControlBlock(cb);
+ }
+
+protected:
+ void init();
+ void setFileSize(size_t);
+ QString createFileName();
+
+ //--------------- Data members ---------------------------------
+ //
+ QString m_fileName;
+ int m_fd;
+ void* m_mmappedBuffer;
+ size_t m_mmappedSize;
+ SequencerDataBlock *m_sequencerDataBlock;
+};
+
+}
+
+#endif // _SEQUENCERMAPPER_H_
diff --git a/src/sequencer/main.cpp b/src/sequencer/main.cpp
new file mode 100644
index 0000000..aee5bc5
--- /dev/null
+++ b/src/sequencer/main.cpp
@@ -0,0 +1,246 @@
+// -*- c-indentation-style:"stroustrup" c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include "RosegardenSequencerApp.h"
+
+#include <signal.h>
+#include <iostream>
+#include <unistd.h>
+#include <sys/time.h>
+
+#include <kcmdlineargs.h>
+#include <kaboutdata.h>
+#include <klocale.h>
+#include <dcopclient.h>
+
+#include "base/Profiler.h"
+#include "sound/MappedComposition.h"
+
+#include "gui/application/RosegardenDCOP.h"
+#include "misc/Debug.h"
+
+using std::cout;
+using std::cerr;
+using std::endl;
+
+using namespace Rosegarden;
+
+static const char *description = I18N_NOOP("RosegardenSequencer");
+static RosegardenSequencerApp *roseSeq = 0;
+
+static KCmdLineOptions options[] =
+ {
+ // { "+[File]", I18N_NOOP("file to open"), 0 },
+ // INSERT YOUR COMMANDLINE OPTIONS HERE
+ { "+[playback_1 playback_2 capture_1 capture_2]",
+ I18N_NOOP("JACK playback and capture ports"), 0 },
+ { 0, 0, 0 }
+ };
+
+static bool _exiting = false;
+static sigset_t _signals;
+
+static void
+signalHandler(int /*sig*/)
+{
+ _exiting = true;
+ std::cerr << "Is that the time!?" << endl;
+}
+
+int main(int argc, char *argv[])
+{
+ srandom((unsigned int)time(0) * (unsigned int)getpid());
+
+ // Block signals during startup, so that child threads (inheriting
+ // this mask) ignore them; then after startup we can unblock them
+ // for this thread only. This trick picked up from the jackd code.
+ sigemptyset (&_signals);
+ sigaddset(&_signals, SIGHUP);
+ sigaddset(&_signals, SIGINT);
+ sigaddset(&_signals, SIGQUIT);
+ sigaddset(&_signals, SIGPIPE);
+ sigaddset(&_signals, SIGTERM);
+ sigaddset(&_signals, SIGUSR1);
+ sigaddset(&_signals, SIGUSR2);
+ pthread_sigmask(SIG_BLOCK, &_signals, 0);
+
+ KAboutData aboutData( "rosegardensequencer",
+ I18N_NOOP("RosegardenSequencer"),
+ VERSION, description, KAboutData::License_GPL,
+ "(c) 2000-2008, Guillaume Laurent, Chris Cannam, Richard Bown");
+ aboutData.addAuthor("Guillaume Laurent, Chris Cannam, Richard Bown", 0, "[email protected], [email protected], [email protected]");
+ KCmdLineArgs::init( argc, argv, &aboutData );
+ KCmdLineArgs::addCmdLineOptions( options ); // Add our own options.
+
+ // Parse cmd line args
+ //
+ /*KCmdLineArgs *args =*/
+ KCmdLineArgs::parsedArgs();
+ KApplication app;
+
+ if (app.isRestored()) {
+ SEQUENCER_DEBUG << "RosegardenSequencer - we're being session-restored - that's not supposed to happen\n";
+ app.quit(); // don't do session restore -- GUI will start a sequencer
+ } else {
+ roseSeq = new RosegardenSequencerApp;
+ }
+
+ QObject::connect(&app, SIGNAL(lastWindowClosed()), &app, SLOT(quit()));
+
+ app.disableSessionManagement(); // we don't want to be
+ // saved/restored by session
+ // management, only run by the GUI
+
+ // Started OK
+ //
+ SEQUENCER_DEBUG << "RosegardenSequencer - started OK" << endl;
+
+ // Register signal handlers and unblock signals
+ //
+ signal(SIGINT, signalHandler);
+ signal(SIGTERM, signalHandler);
+ signal(SIGHUP, signalHandler);
+ signal(SIGQUIT, signalHandler);
+ pthread_sigmask(SIG_UNBLOCK, &_signals, 0);
+
+ // Now we can enter our specialised event loop.
+ // For each pass through we wait for some pending
+ // events. We check status on the way through and
+ // act accordingly. DCOP events fire back and
+ // forth processed in the event loop changing
+ // state and hopefully controlling and providing
+ // feedback. We also put in some sleep time to
+ // make sure the loop doesn't eat up all the
+ // processor - we're not in that much of a rush!
+ //
+ TransportStatus lastSeqStatus = roseSeq->getStatus();
+
+ RealTime sleepTime = RealTime(0, 10000000);
+
+ while (!_exiting && roseSeq && roseSeq->getStatus() != QUIT) {
+
+ bool atLeisure = true;
+
+ switch (roseSeq->getStatus()) {
+ case STARTING_TO_PLAY:
+ if (!roseSeq->startPlaying()) {
+ // send result failed and stop Sequencer
+ roseSeq->setStatus(STOPPING);
+ } else {
+ roseSeq->setStatus(PLAYING);
+ }
+ break;
+
+ case PLAYING:
+ if (!roseSeq->keepPlaying()) {
+ // there's a problem or the piece has
+ // finished - so stop playing
+ roseSeq->setStatus(STOPPING);
+ } else {
+ // process any async events
+ //
+ roseSeq->processAsynchronousEvents();
+ }
+ break;
+
+ case STARTING_TO_RECORD:
+ if (!roseSeq->startPlaying()) {
+ roseSeq->setStatus(STOPPING);
+ } else {
+ roseSeq->setStatus(RECORDING);
+ }
+ break;
+
+ case RECORDING:
+ if (!roseSeq->keepPlaying()) {
+ // there's a problem or the piece has
+ // finished - so stop playing
+ roseSeq->setStatus(STOPPING);
+ } else {
+ // Now process any incoming MIDI events
+ // and return them to the gui
+ //
+ roseSeq->processRecordedMidi();
+
+ // Now process any incoming audio
+ // and return it to the gui
+ //
+ roseSeq->processRecordedAudio();
+
+ // Still process these so we can send up
+ // audio levels as MappedEvents
+ //
+ roseSeq->processAsynchronousEvents();
+ }
+ break;
+
+ case STOPPING:
+ // There's no call to roseSeq to actually process the
+ // stop, because this arises from a DCOP call from the GUI
+ // direct to roseSeq to start with
+ roseSeq->setStatus(STOPPED);
+ SEQUENCER_DEBUG << "RosegardenSequencer - Stopped" << endl;
+ break;
+
+ case RECORDING_ARMED:
+ SEQUENCER_DEBUG << "RosegardenSequencer - "
+ << "Sequencer can't enter \""
+ << "RECORDING_ARMED\" state - "
+ << "internal error"
+ << endl;
+ break;
+
+ case STOPPED:
+ default:
+ roseSeq->processAsynchronousEvents();
+ break;
+ }
+
+ // Update internal clock and send pointer position
+ // change event to GUI - this is the heartbeat of
+ // the Sequencer - it doesn't tick over without
+ // this call.
+ //
+ // Also attempt to send the MIDI clock at this point.
+ //
+ roseSeq->updateClocks();
+
+ // we want to process transport changes immediately
+ if (roseSeq->checkExternalTransport()) {
+ atLeisure = false;
+ } else if (lastSeqStatus != roseSeq->getStatus()) {
+ SEQUENCER_DEBUG << "Sequencer status changed from " << lastSeqStatus << " to " << roseSeq->getStatus() << endl;
+ roseSeq->notifySequencerStatus();
+ lastSeqStatus = roseSeq->getStatus();
+ atLeisure = false;
+ }
+
+ app.processEvents();
+ if (atLeisure)
+ roseSeq->sleep(sleepTime);
+ }
+
+ delete roseSeq;
+
+ std::cerr << "Toodle-pip." << endl;
+ return 0;
+}
+
diff --git a/src/sound/AlsaDriver.cpp b/src/sound/AlsaDriver.cpp
new file mode 100644
index 0000000..9d512d9
--- /dev/null
+++ b/src/sound/AlsaDriver.cpp
@@ -0,0 +1,5476 @@
+// -*- c-indentation-style:"stroustrup" c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include <iostream>
+#include "misc/Debug.h"
+#include <cstdlib>
+#include <cstdio>
+#include <algorithm>
+
+#ifdef HAVE_ALSA
+
+// ALSA
+#include <alsa/asoundlib.h>
+#include <alsa/seq_event.h>
+#include <alsa/version.h>
+#include <alsa/seq.h>
+
+#include "AlsaDriver.h"
+#include "AlsaPort.h"
+#include "ExternalTransport.h"
+#include "MappedInstrument.h"
+#include "Midi.h"
+#include "MappedStudio.h"
+#include "misc/Strings.h"
+#include "MappedCommon.h"
+#include "MappedEvent.h"
+#include "Audit.h"
+#include "AudioPlayQueue.h"
+#include "ExternalTransport.h"
+
+#include <qregexp.h>
+#include <pthread.h>
+
+
+//#define DEBUG_ALSA 1
+//#define DEBUG_PROCESS_MIDI_OUT 1
+//#define DEBUG_PROCESS_SOFT_SYNTH_OUT 1
+//#define MTC_DEBUG 1
+
+// This driver implements MIDI in and out via the ALSA (www.alsa-project.org)
+// sequencer interface.
+
+using std::cerr;
+using std::endl;
+
+static size_t _debug_jack_frame_count = 0;
+
+#define AUTO_TIMER_NAME "(auto)"
+
+
+namespace Rosegarden
+{
+
+#define FAILURE_REPORT_COUNT 256
+static MappedEvent::FailureCode _failureReports[FAILURE_REPORT_COUNT];
+static int _failureReportWriteIndex = 0;
+static int _failureReportReadIndex = 0;
+
+AlsaDriver::AlsaDriver(MappedStudio *studio):
+ SoundDriver(studio,
+ std::string("[ALSA library version ") +
+ std::string(SND_LIB_VERSION_STR) +
+ std::string(", module version ") +
+ getAlsaModuleVersionString() +
+ std::string(", kernel version ") +
+ getKernelVersionString() +
+ "]"),
+ m_client( -1),
+ m_inputPort( -1),
+ m_syncOutputPort( -1),
+ m_controllerPort( -1),
+ m_queue( -1),
+ m_maxClients( -1),
+ m_maxPorts( -1),
+ m_maxQueues( -1),
+ m_midiInputPortConnected(false),
+ m_midiSyncAutoConnect(false),
+ m_alsaPlayStartTime(0, 0),
+ m_alsaRecordStartTime(0, 0),
+ m_loopStartTime(0, 0),
+ m_loopEndTime(0, 0),
+ m_eat_mtc(0),
+ m_looping(false),
+ m_haveShutdown(false)
+#ifdef HAVE_LIBJACK
+ , m_jackDriver(0)
+#endif
+ , m_queueRunning(false)
+ , m_portCheckNeeded(false),
+ m_needJackStart(NeedNoJackStart),
+ m_doTimerChecks(false),
+ m_firstTimerCheck(true),
+ m_timerRatio(0),
+ m_timerRatioCalculated(false)
+
+{
+ Audit audit;
+ audit << "Rosegarden " << VERSION << " - AlsaDriver "
+ << m_name << std::endl;
+}
+
+AlsaDriver::~AlsaDriver()
+{
+ if (!m_haveShutdown) {
+ std::cerr << "WARNING: AlsaDriver::shutdown() was not called before destructor, calling now" << std::endl;
+ shutdown();
+ }
+}
+
+int
+AlsaDriver::checkAlsaError(int rc, const char *
+#ifdef DEBUG_ALSA
+ message
+#endif
+ )
+{
+#ifdef DEBUG_ALSA
+ if (rc < 0) {
+ std::cerr << "AlsaDriver::"
+ << message
+ << ": " << rc
+ << " (" << snd_strerror(rc) << ")"
+ << std::endl;
+ }
+#endif
+ return rc;
+}
+
+void
+AlsaDriver::shutdown()
+{
+#ifdef DEBUG_ALSA
+ std::cerr << "AlsaDriver::~AlsaDriver - shutting down" << std::endl;
+#endif
+
+ processNotesOff(getAlsaTime(), true, true);
+
+#ifdef HAVE_LIBJACK
+ delete m_jackDriver;
+ m_jackDriver = 0;
+#endif
+
+ if (m_midiHandle) {
+#ifdef DEBUG_ALSA
+ std::cerr << "AlsaDriver::shutdown - closing MIDI client" << std::endl;
+#endif
+
+ checkAlsaError(snd_seq_stop_queue(m_midiHandle, m_queue, 0), "shutdown(): stopping queue");
+ checkAlsaError(snd_seq_drain_output(m_midiHandle), "shutdown(): drain output");
+#ifdef DEBUG_ALSA
+
+ std::cerr << "AlsaDriver::shutdown - stopped queue" << std::endl;
+#endif
+
+ snd_seq_close(m_midiHandle);
+#ifdef DEBUG_ALSA
+
+ std::cerr << "AlsaDriver::shutdown - closed MIDI handle" << std::endl;
+#endif
+
+ m_midiHandle = 0;
+ }
+
+ DataBlockRepository::clear();
+
+ m_haveShutdown = true;
+}
+
+void
+AlsaDriver::setLoop(const RealTime &loopStart, const RealTime &loopEnd)
+{
+ m_loopStartTime = loopStart;
+ m_loopEndTime = loopEnd;
+
+ // currently we use this simple test for looping - it might need
+ // to get more sophisticated in the future.
+ //
+ if (m_loopStartTime != m_loopEndTime)
+ m_looping = true;
+ else
+ m_looping = false;
+}
+
+void
+AlsaDriver::getSystemInfo()
+{
+ int err;
+ snd_seq_system_info_t *sysinfo;
+
+ snd_seq_system_info_alloca(&sysinfo);
+
+ if ((err = snd_seq_system_info(m_midiHandle, sysinfo)) < 0) {
+ std::cerr << "System info error: " << snd_strerror(err)
+ << std::endl;
+ reportFailure(MappedEvent::FailureALSACallFailed);
+ m_maxQueues = 0;
+ m_maxClients = 0;
+ m_maxPorts = 0;
+ return ;
+ }
+
+ m_maxQueues = snd_seq_system_info_get_queues(sysinfo);
+ m_maxClients = snd_seq_system_info_get_clients(sysinfo);
+ m_maxPorts = snd_seq_system_info_get_ports(sysinfo);
+}
+
+void
+AlsaDriver::showQueueStatus(int queue)
+{
+ int err, idx, min, max;
+ snd_seq_queue_status_t *status;
+
+ snd_seq_queue_status_alloca(&status);
+ min = queue < 0 ? 0 : queue;
+ max = queue < 0 ? m_maxQueues : queue + 1;
+
+ for (idx = min; idx < max; ++idx) {
+ if ((err = snd_seq_get_queue_status(m_midiHandle, idx, status)) < 0) {
+
+ if (err == -ENOENT)
+ continue;
+
+ std::cerr << "Client " << idx << " info error: "
+ << snd_strerror(err) << std::endl;
+
+ reportFailure(MappedEvent::FailureALSACallFailed);
+ return ;
+ }
+
+#ifdef DEBUG_ALSA
+ std::cerr << "Queue " << snd_seq_queue_status_get_queue(status)
+ << std::endl;
+
+ std::cerr << "Tick = "
+ << snd_seq_queue_status_get_tick_time(status)
+ << std::endl;
+
+ std::cerr << "Realtime = "
+ << snd_seq_queue_status_get_real_time(status)->tv_sec
+ << "."
+ << snd_seq_queue_status_get_real_time(status)->tv_nsec
+ << std::endl;
+
+ std::cerr << "Flags = 0x"
+ << snd_seq_queue_status_get_status(status)
+ << std::endl;
+#endif
+
+ }
+
+}
+
+
+void
+AlsaDriver::generateTimerList()
+{
+ // Enumerate the available timers
+
+ snd_timer_t *timerHandle;
+
+ snd_timer_id_t *timerId;
+ snd_timer_info_t *timerInfo;
+
+ snd_timer_id_alloca(&timerId);
+ snd_timer_info_alloca(&timerInfo);
+
+ snd_timer_query_t *timerQuery;
+ char timerName[64];
+
+ m_timers.clear();
+
+ if (snd_timer_query_open(&timerQuery, "hw", 0) >= 0) {
+
+ snd_timer_id_set_class(timerId, SND_TIMER_CLASS_NONE);
+
+ while (1) {
+
+ if (snd_timer_query_next_device(timerQuery, timerId) < 0)
+ break;
+ if (snd_timer_id_get_class(timerId) < 0)
+ break;
+
+ AlsaTimerInfo info = {
+ snd_timer_id_get_class(timerId),
+ snd_timer_id_get_sclass(timerId),
+ snd_timer_id_get_card(timerId),
+ snd_timer_id_get_device(timerId),
+ snd_timer_id_get_subdevice(timerId),
+ "",
+ 0
+ };
+
+ if (info.card < 0)
+ info.card = 0;
+ if (info.device < 0)
+ info.device = 0;
+ if (info.subdevice < 0)
+ info.subdevice = 0;
+
+ // std::cerr << "got timer: class " << info.clas << std::endl;
+
+ sprintf(timerName, "hw:CLASS=%i,SCLASS=%i,CARD=%i,DEV=%i,SUBDEV=%i",
+ info.clas, info.sclas, info.card, info.device, info.subdevice);
+
+ if (snd_timer_open(&timerHandle, timerName, SND_TIMER_OPEN_NONBLOCK) < 0) {
+ std::cerr << "Failed to open timer: " << timerName << std::endl;
+ continue;
+ }
+
+ if (snd_timer_info(timerHandle, timerInfo) < 0)
+ continue;
+
+ info.name = snd_timer_info_get_name(timerInfo);
+ info.resolution = snd_timer_info_get_resolution(timerInfo);
+ snd_timer_close(timerHandle);
+
+ // std::cerr << "adding timer: " << info.name << std::endl;
+
+ m_timers.push_back(info);
+ }
+
+ snd_timer_query_close(timerQuery);
+ }
+}
+
+
+std::string
+AlsaDriver::getAutoTimer(bool &wantTimerChecks)
+{
+ Audit audit;
+
+ // Look for the apparent best-choice timer.
+
+ if (m_timers.empty())
+ return "";
+
+ // The system RTC timer ought to be good, but it doesn't look like
+ // a very safe choice -- we've seen some system lockups apparently
+ // connected with use of this timer on 2.6 kernels. So we avoid
+ // using that as an auto option.
+
+ // Looks like our most reliable options for timers are, in order:
+ //
+ // 1. System timer if at 1000Hz, with timer checks (i.e. automatic
+ // drift correction against PCM frame count). Only available
+ // when JACK is running.
+ //
+ // 2. PCM playback timer currently in use by JACK (no drift, but
+ // suffers from jitter).
+ //
+ // 3. System timer if at 1000Hz.
+ //
+ // 4. System RTC timer.
+ //
+ // 5. System timer.
+
+ // As of Linux kernel 2.6.13 (?) the default system timer
+ // resolution has been reduced from 1000Hz to 250Hz, giving us
+ // only 4ms accuracy instead of 1ms. This may be better than the
+ // 10ms available from the stock 2.4 kernel, but it's not enough
+ // for really solid MIDI timing. If JACK is running at 44.1 or
+ // 48KHz with a buffer size less than 256 frames, then the PCM
+ // timer will give us less jitter. Even at 256 frames, it may be
+ // preferable in practice just because it's simpler.
+
+ // However, we can't safely choose the PCM timer over the system
+ // timer unless the latter has really awful resolution, because we
+ // don't know for certain which PCM JACK is using. We guess at
+ // hw:0 for the moment, which gives us a stuck timer problem if
+ // it's actually using something else. So if the system timer
+ // runs at 250Hz, we really have to choose it anyway and just give
+ // a warning.
+
+ bool pcmTimerAccepted = false;
+ wantTimerChecks = false; // for most options
+
+ bool rtcCouldBeOK = false;
+
+#ifdef HAVE_LIBJACK
+ if (m_jackDriver) {
+ wantTimerChecks = true;
+ pcmTimerAccepted = true;
+ }
+#endif
+
+ // look for a high frequency system timer
+
+ for (std::vector<AlsaTimerInfo>::iterator i = m_timers.begin();
+ i != m_timers.end(); ++i) {
+ if (i->sclas != SND_TIMER_SCLASS_NONE)
+ continue;
+ if (i->clas == SND_TIMER_CLASS_GLOBAL) {
+ if (i->device == SND_TIMER_GLOBAL_SYSTEM) {
+ long hz = 1000000000 / i->resolution;
+ if (hz >= 750) {
+ return i->name;
+ }
+ }
+ }
+ }
+
+ // Look for the system RTC timer if available. This has been
+ // known to hang some real-time kernels, but reports suggest that
+ // recent kernels are OK. Avoid if the kernel is older than
+ // 2.6.20 or the ALSA driver is older than 1.0.14.
+
+ if (versionIsAtLeast(getAlsaModuleVersionString(),
+ 1, 0, 14) &&
+ versionIsAtLeast(getKernelVersionString(),
+ 2, 6, 20)) {
+
+ rtcCouldBeOK = true;
+
+ for (std::vector<AlsaTimerInfo>::iterator i = m_timers.begin();
+ i != m_timers.end(); ++i) {
+ if (i->sclas != SND_TIMER_SCLASS_NONE) continue;
+ if (i->clas == SND_TIMER_CLASS_GLOBAL) {
+ if (i->device == SND_TIMER_GLOBAL_RTC) {
+ return i->name;
+ }
+ }
+ }
+ }
+
+ // look for the first PCM playback timer; that's all we know about
+ // for now (until JACK becomes able to tell us which PCM it's on)
+
+ if (pcmTimerAccepted) {
+
+ for (std::vector<AlsaTimerInfo>::iterator i = m_timers.begin();
+ i != m_timers.end(); ++i) {
+ if (i->sclas != SND_TIMER_SCLASS_NONE)
+ continue;
+ if (i->clas == SND_TIMER_CLASS_PCM) {
+ if (i->resolution != 0) {
+ long hz = 1000000000 / i->resolution;
+ if (hz >= 750) {
+ wantTimerChecks = false; // pointless with PCM timer
+ return i->name;
+ } else {
+ audit << "PCM timer: inadequate resolution " << i->resolution << std::endl;
+ }
+ }
+ }
+ }
+ }
+
+ // next look for slow, unpopular 100Hz (2.4) or 250Hz (2.6) system timer
+
+ for (std::vector<AlsaTimerInfo>::iterator i = m_timers.begin();
+ i != m_timers.end(); ++i) {
+ if (i->sclas != SND_TIMER_SCLASS_NONE)
+ continue;
+ if (i->clas == SND_TIMER_CLASS_GLOBAL) {
+ if (i->device == SND_TIMER_GLOBAL_SYSTEM) {
+ audit << "Using low-resolution system timer, sending a warning" << std::endl;
+ if (rtcCouldBeOK) {
+ reportFailure(MappedEvent::WarningImpreciseTimerTryRTC);
+ } else {
+ reportFailure(MappedEvent::WarningImpreciseTimer);
+ }
+ return i->name;
+ }
+ }
+ }
+
+ // falling back to something that almost certainly won't work,
+ // if for any reason all of the above failed
+
+ return m_timers.begin()->name;
+}
+
+
+
+void
+AlsaDriver::generatePortList(AlsaPortList *newPorts)
+{
+ Audit audit;
+ AlsaPortList alsaPorts;
+
+ snd_seq_client_info_t *cinfo;
+ snd_seq_port_info_t *pinfo;
+ int client;
+ unsigned int writeCap = SND_SEQ_PORT_CAP_SUBS_WRITE | SND_SEQ_PORT_CAP_WRITE;
+ unsigned int readCap = SND_SEQ_PORT_CAP_SUBS_READ | SND_SEQ_PORT_CAP_READ;
+
+ snd_seq_client_info_alloca(&cinfo);
+ snd_seq_client_info_set_client(cinfo, -1);
+
+ audit << std::endl << " ALSA Client information:"
+ << std::endl << std::endl;
+
+ // Get only the client ports we're interested in and store them
+ // for sorting and then device creation.
+ //
+ while (snd_seq_query_next_client(m_midiHandle, cinfo) >= 0) {
+ client = snd_seq_client_info_get_client(cinfo);
+ snd_seq_port_info_alloca(&pinfo);
+ snd_seq_port_info_set_client(pinfo, client);
+ snd_seq_port_info_set_port(pinfo, -1);
+
+ // Ignore ourselves and the system client
+ //
+ if (client == m_client || client == 0)
+ continue;
+
+ while (snd_seq_query_next_port(m_midiHandle, pinfo) >= 0) {
+ int client = snd_seq_port_info_get_client(pinfo);
+ int port = snd_seq_port_info_get_port(pinfo);
+ unsigned int clientType = snd_seq_client_info_get_type(cinfo);
+ unsigned int portType = snd_seq_port_info_get_type(pinfo);
+ unsigned int capability = snd_seq_port_info_get_capability(pinfo);
+
+
+ if ((((capability & writeCap) == writeCap) ||
+ ((capability & readCap) == readCap)) &&
+ ((capability & SND_SEQ_PORT_CAP_NO_EXPORT) == 0)) {
+ audit << " "
+ << client << ","
+ << port << " - ("
+ << snd_seq_client_info_get_name(cinfo) << ", "
+ << snd_seq_port_info_get_name(pinfo) << ")";
+
+ PortDirection direction;
+
+ if ((capability & SND_SEQ_PORT_CAP_DUPLEX) ||
+ ((capability & SND_SEQ_PORT_CAP_WRITE) &&
+ (capability & SND_SEQ_PORT_CAP_READ))) {
+ direction = Duplex;
+ audit << "\t\t\t(DUPLEX)";
+ } else if (capability & SND_SEQ_PORT_CAP_WRITE) {
+ direction = WriteOnly;
+ audit << "\t\t(WRITE ONLY)";
+ } else {
+ direction = ReadOnly;
+ audit << "\t\t(READ ONLY)";
+ }
+
+ audit << " [ctype " << clientType << ", ptype " << portType << ", cap " << capability << "]";
+
+ // Generate a unique name using the client id
+ //
+ char portId[40];
+ sprintf(portId, "%d:%d ", client, port);
+
+ std::string fullClientName =
+ std::string(snd_seq_client_info_get_name(cinfo));
+
+ std::string fullPortName =
+ std::string(snd_seq_port_info_get_name(pinfo));
+
+ std::string name;
+
+ // If the first part of the client name is the same as the
+ // start of the port name, just use the port name. otherwise
+ // concatenate.
+ //
+ int firstSpace = fullClientName.find(" ");
+
+ // If no space is found then we try to match the whole string
+ //
+ if (firstSpace < 0)
+ firstSpace = fullClientName.length();
+
+ if (firstSpace > 0 &&
+ int(fullPortName.length()) >= firstSpace &&
+ fullPortName.substr(0, firstSpace) ==
+ fullClientName.substr(0, firstSpace)) {
+ name = portId + fullPortName;
+ } else {
+ name = portId + fullClientName + ": " + fullPortName;
+ }
+
+ // Sanity check for length
+ //
+ if (name.length() > 35)
+ name = portId + fullPortName;
+
+ if (direction == WriteOnly) {
+ name += " (write)";
+ } else if (direction == ReadOnly) {
+ name += " (read)";
+ } else if (direction == Duplex) {
+ name += " (duplex)";
+ }
+
+ AlsaPortDescription *portDescription =
+ new AlsaPortDescription(
+ Instrument::Midi,
+ name,
+ client,
+ port,
+ clientType,
+ portType,
+ capability,
+ direction);
+
+ if (newPorts &&
+ (getPortName(ClientPortPair(client, port)) == "")) {
+ newPorts->push_back(portDescription);
+ }
+
+ alsaPorts.push_back(portDescription);
+
+ audit << std::endl;
+ }
+ }
+ }
+
+ audit << std::endl;
+
+ // Ok now sort by duplexicity
+ //
+ std::sort(alsaPorts.begin(), alsaPorts.end(), AlsaPortCmp());
+ m_alsaPorts = alsaPorts;
+}
+
+
+void
+AlsaDriver::generateInstruments()
+{
+ // Reset these before each Instrument hunt
+ //
+ int audioCount = 0;
+ getAudioInstrumentNumbers(m_audioRunningId, audioCount);
+ m_midiRunningId = MidiInstrumentBase;
+
+ // Clear these
+ //
+ m_instruments.clear();
+ m_devices.clear();
+ m_devicePortMap.clear();
+ m_suspendedPortMap.clear();
+
+ AlsaPortList::iterator it = m_alsaPorts.begin();
+ for (; it != m_alsaPorts.end(); it++) {
+ if ((*it)->m_client == m_client) {
+ std::cerr << "(Ignoring own port " << (*it)->m_client
+ << ":" << (*it)->m_port << ")" << std::endl;
+ continue;
+ } else if ((*it)->m_client == 0) {
+ std::cerr << "(Ignoring system port " << (*it)->m_client
+ << ":" << (*it)->m_port << ")" << std::endl;
+ continue;
+ }
+
+ if ((*it)->isWriteable()) {
+ MappedDevice *device = createMidiDevice(*it, MidiDevice::Play);
+ if (!device) {
+#ifdef DEBUG_ALSA
+ std::cerr << "WARNING: Failed to create play device" << std::endl;
+#else
+
+ ;
+#endif
+
+ } else {
+ addInstrumentsForDevice(device);
+ m_devices.push_back(device);
+ }
+ }
+ if ((*it)->isReadable()) {
+ MappedDevice *device = createMidiDevice(*it, MidiDevice::Record);
+ if (!device) {
+#ifdef DEBUG_ALSA
+ std::cerr << "WARNING: Failed to create record device" << std::endl;
+#else
+
+ ;
+#endif
+
+ } else {
+ m_devices.push_back(device);
+ }
+ }
+ }
+
+#ifdef HAVE_DSSI
+ // Create a number of soft synth Instruments
+ //
+ {
+ MappedInstrument *instr;
+ char number[100];
+ InstrumentId first;
+ int count;
+ getSoftSynthInstrumentNumbers(first, count);
+
+ DeviceId ssiDeviceId = getSpareDeviceId();
+
+ if (m_driverStatus & AUDIO_OK) {
+ for (int i = 0; i < count; ++i) {
+ sprintf(number, " #%d", i + 1);
+ std::string name = "Synth plugin" + std::string(number);
+ instr = new MappedInstrument(Instrument::SoftSynth,
+ i,
+ first + i,
+ name,
+ ssiDeviceId);
+ m_instruments.push_back(instr);
+
+ m_studio->createObject(MappedObject::AudioFader,
+ first + i);
+ }
+
+ MappedDevice *device =
+ new MappedDevice(ssiDeviceId,
+ Device::SoftSynth,
+ "Synth plugin",
+ "Soft synth connection");
+ m_devices.push_back(device);
+ }
+ }
+#endif
+
+#ifdef HAVE_LIBJACK
+
+ // Create a number of audio Instruments - these are just
+ // logical Instruments anyway and so we can create as
+ // many as we like and then use them as Tracks.
+ //
+ {
+ MappedInstrument *instr;
+ char number[100];
+ std::string audioName;
+
+ DeviceId audioDeviceId = getSpareDeviceId();
+
+ if (m_driverStatus & AUDIO_OK)
+ {
+ for (int channel = 0; channel < audioCount; ++channel) {
+ sprintf(number, " #%d", channel + 1);
+ audioName = "Audio" + std::string(number);
+ instr = new MappedInstrument(Instrument::Audio,
+ channel,
+ m_audioRunningId,
+ audioName,
+ audioDeviceId);
+ m_instruments.push_back(instr);
+
+ // Create a fader with a matching id - this is the starting
+ // point for all audio faders.
+ //
+ m_studio->createObject(MappedObject::AudioFader,
+ m_audioRunningId);
+
+ /*
+ std::cerr << "AlsaDriver::generateInstruments - "
+ << "added audio fader (id=" << m_audioRunningId
+ << ")" << std::endl;
+ */
+
+ m_audioRunningId++;
+ }
+
+ // Create audio device
+ //
+ MappedDevice *device =
+ new MappedDevice(audioDeviceId,
+ Device::Audio,
+ "Audio",
+ "Audio connection");
+ m_devices.push_back(device);
+ }
+ }
+#endif
+
+}
+
+MappedDevice *
+AlsaDriver::createMidiDevice(AlsaPortDescription *port,
+ MidiDevice::DeviceDirection reqDirection)
+{
+ char deviceName[100];
+ std::string connectionName("");
+ Audit audit;
+
+ static int unknownCounter;
+
+ static int counters[3][2]; // [system/hardware/software][out/in]
+ const int UNKNOWN = -1, SYSTEM = 0, HARDWARE = 1, SOFTWARE = 2;
+ static const char *firstNames[4][2] = {
+ { "MIDI output system device", "MIDI input system device"
+ },
+ { "MIDI external device", "MIDI hardware input device" },
+ { "MIDI software device", "MIDI software input" }
+ };
+ static const char *countedNames[4][2] = {
+ { "MIDI output system device %d", "MIDI input system device %d"
+ },
+ { "MIDI external device %d", "MIDI hardware input device %d" },
+ { "MIDI software device %d", "MIDI software input %d" }
+ };
+
+ static int specificCounters[2];
+ static const char *specificNames[2] = {
+ "MIDI soundcard synth", "MIDI soft synth",
+ };
+ static const char *specificCountedNames[2] = {
+ "MIDI soundcard synth %d", "MIDI soft synth %d",
+ };
+
+ DeviceId deviceId = getSpareDeviceId();
+
+ if (port) {
+
+ if (reqDirection == MidiDevice::Record && !port->isReadable())
+ return 0;
+ if (reqDirection == MidiDevice::Play && !port->isWriteable())
+ return 0;
+
+ int category = UNKNOWN;
+ bool noConnect = false;
+ bool isSynth = false;
+ bool synthKnown = false;
+
+ if (port->m_client < 16) {
+
+ category = SYSTEM;
+ noConnect = true;
+ isSynth = false;
+ synthKnown = true;
+
+ } else {
+
+#ifdef SND_SEQ_PORT_TYPE_HARDWARE
+ if (port->m_portType & SND_SEQ_PORT_TYPE_HARDWARE) {
+ category = HARDWARE;
+ }
+#endif
+#ifdef SND_SEQ_PORT_TYPE_SOFTWARE
+ if (port->m_portType & SND_SEQ_PORT_TYPE_SOFTWARE) {
+ category = SOFTWARE;
+ }
+#endif
+#ifdef SND_SEQ_PORT_TYPE_SYNTHESIZER
+ if (port->m_portType & SND_SEQ_PORT_TYPE_SYNTHESIZER) {
+ isSynth = true;
+ synthKnown = true;
+ }
+#endif
+#ifdef SND_SEQ_PORT_TYPE_APPLICATION
+ if (port->m_portType & SND_SEQ_PORT_TYPE_APPLICATION) {
+ category = SOFTWARE;
+ isSynth = false;
+ synthKnown = true;
+ }
+#endif
+
+ if (category == UNKNOWN) {
+
+ if (port->m_client < 64) {
+
+ if (versionIsAtLeast(getAlsaModuleVersionString(),
+ 1, 0, 11)) {
+
+ category = HARDWARE;
+
+ } else {
+
+ category = SYSTEM;
+ noConnect = true;
+ }
+
+ } else if (port->m_client < 128) {
+
+ category = HARDWARE;
+
+ } else {
+
+ category = SOFTWARE;
+ }
+ }
+ }
+
+ bool haveName = false;
+
+ if (!synthKnown) {
+
+ if (category != SYSTEM && reqDirection == MidiDevice::Play) {
+
+ // We assume GM/GS/XG/MT32 devices are synths.
+
+ bool isSynth = (port->m_portType &
+ (SND_SEQ_PORT_TYPE_MIDI_GM |
+ SND_SEQ_PORT_TYPE_MIDI_GS |
+ SND_SEQ_PORT_TYPE_MIDI_XG |
+ SND_SEQ_PORT_TYPE_MIDI_MT32));
+
+ if (!isSynth &&
+ (port->m_name.find("ynth") < port->m_name.length()))
+ isSynth = true;
+ if (!isSynth &&
+ (port->m_name.find("nstrument") < port->m_name.length()))
+ isSynth = true;
+ if (!isSynth &&
+ (port->m_name.find("VSTi") < port->m_name.length()))
+ isSynth = true;
+
+ } else {
+ isSynth = false;
+ }
+ }
+
+ if (isSynth) {
+ int clientType = (category == SOFTWARE) ? 1 : 0;
+ if (specificCounters[clientType] == 0) {
+ sprintf(deviceName, specificNames[clientType]);
+ ++specificCounters[clientType];
+ } else {
+ sprintf(deviceName,
+ specificCountedNames[clientType],
+ ++specificCounters[clientType]);
+ }
+ haveName = true;
+ }
+
+ if (!haveName) {
+ if (counters[category][reqDirection] == 0) {
+ sprintf(deviceName, firstNames[category][reqDirection]);
+ ++counters[category][reqDirection];
+ } else {
+ sprintf(deviceName,
+ countedNames[category][reqDirection],
+ ++counters[category][reqDirection]);
+ }
+ }
+
+ if (!noConnect) {
+ m_devicePortMap[deviceId] = ClientPortPair(port->m_client,
+ port->m_port);
+ connectionName = port->m_name;
+ }
+
+ audit << "Creating device " << deviceId << " in "
+ << (reqDirection == MidiDevice::Play ? "Play" : "Record")
+ << " mode for connection " << port->m_name
+ << (noConnect ? " (not connecting)" : "")
+ << "\nDefault device name for this device is "
+ << deviceName << std::endl;
+
+ } else { // !port
+
+ sprintf(deviceName, "Anonymous MIDI device %d", ++unknownCounter);
+
+ audit << "Creating device " << deviceId << " in "
+ << (reqDirection == MidiDevice::Play ? "Play" : "Record")
+ << " mode -- no connection available "
+ << "\nDefault device name for this device is "
+ << deviceName << std::endl;
+ }
+
+ if (reqDirection == MidiDevice::Play) {
+
+ QString portName;
+
+ if (QString(deviceName).startsWith("Anonymous MIDI device ")) {
+ portName = QString("out %1")
+ .arg(m_outputPorts.size() + 1);
+ } else {
+ portName = QString("out %1 - %2")
+ .arg(m_outputPorts.size() + 1)
+ .arg(deviceName);
+ }
+
+ int outputPort = checkAlsaError(snd_seq_create_simple_port
+ (m_midiHandle,
+ portName,
+ SND_SEQ_PORT_CAP_READ |
+ SND_SEQ_PORT_CAP_SUBS_READ,
+ SND_SEQ_PORT_TYPE_APPLICATION),
+ "createMidiDevice - can't create output port");
+
+ if (outputPort >= 0) {
+
+ std::cerr << "CREATED OUTPUT PORT " << outputPort << ":" << portName << " for device " << deviceId << std::endl;
+
+ m_outputPorts[deviceId] = outputPort;
+
+ if (port) {
+ if (connectionName != "") {
+ std::cerr << "Connecting my port " << outputPort << " to " << port->m_client << ":" << port->m_port << " on initialisation" << std::endl;
+ snd_seq_connect_to(m_midiHandle,
+ outputPort,
+ port->m_client,
+ port->m_port);
+ if (m_midiSyncAutoConnect) {
+ snd_seq_connect_to(m_midiHandle,
+ m_syncOutputPort,
+ port->m_client,
+ port->m_port);
+ }
+ }
+ std::cerr << "done" << std::endl;
+ }
+ }
+ }
+
+ MappedDevice *device = new MappedDevice(deviceId,
+ Device::Midi,
+ deviceName,
+ connectionName);
+ device->setDirection(reqDirection);
+ return device;
+}
+
+DeviceId
+AlsaDriver::getSpareDeviceId()
+{
+ std::set
+ <DeviceId> ids;
+ for (unsigned int i = 0; i < m_devices.size(); ++i) {
+ ids.insert(m_devices[i]->getId());
+ }
+
+ DeviceId id = 0;
+ while (ids.find(id) != ids.end())
+ ++id;
+ return id;
+}
+
+void
+AlsaDriver::addInstrumentsForDevice(MappedDevice *device)
+{
+ std::string channelName;
+ char number[100];
+
+ for (int channel = 0; channel < 16; ++channel) {
+ // Create MappedInstrument for export to GUI
+ //
+ // name is just number, derive rest from device at gui
+ sprintf(number, "#%d", channel + 1);
+ channelName = std::string(number);
+
+ if (channel == 9)
+ channelName = std::string("#10[D]");
+ MappedInstrument *instr = new MappedInstrument(Instrument::Midi,
+ channel,
+ m_midiRunningId++,
+ channelName,
+ device->getId());
+ m_instruments.push_back(instr);
+ }
+}
+
+
+bool
+AlsaDriver::canReconnect(Device::DeviceType type)
+{
+ return (type == Device::Midi);
+}
+
+DeviceId
+AlsaDriver::addDevice(Device::DeviceType type,
+ MidiDevice::DeviceDirection direction)
+{
+ if (type == Device::Midi) {
+
+ MappedDevice *device = createMidiDevice(0, direction);
+ if (!device) {
+#ifdef DEBUG_ALSA
+ std::cerr << "WARNING: Device creation failed" << std::endl;
+#else
+
+ ;
+#endif
+
+ } else {
+ addInstrumentsForDevice(device);
+ m_devices.push_back(device);
+
+ MappedEvent *mE =
+ new MappedEvent(0, MappedEvent::SystemUpdateInstruments,
+ 0, 0);
+ insertMappedEventForReturn(mE);
+
+ return device->getId();
+ }
+ }
+
+ return Device::NO_DEVICE;
+}
+
+void
+AlsaDriver::removeDevice(DeviceId id)
+{
+ DeviceIntMap::iterator i1 = m_outputPorts.find(id);
+ if (i1 == m_outputPorts.end()) {
+ std::cerr << "WARNING: AlsaDriver::removeDevice: Cannot find device "
+ << id << " in port map" << std::endl;
+ return ;
+ }
+ checkAlsaError( snd_seq_delete_port(m_midiHandle, i1->second),
+ "removeDevice");
+ m_outputPorts.erase(i1);
+
+ for (MappedDeviceList::iterator i = m_devices.end();
+ i != m_devices.begin(); ) {
+
+ --i;
+
+ if ((*i)->getId() == id) {
+ delete *i;
+ m_devices.erase(i);
+ }
+ }
+
+ for (MappedInstrumentList::iterator i = m_instruments.end();
+ i != m_instruments.begin(); ) {
+
+ --i;
+
+ if ((*i)->getDevice() == id) {
+ delete *i;
+ m_instruments.erase(i);
+ }
+ }
+
+ MappedEvent *mE =
+ new MappedEvent(0, MappedEvent::SystemUpdateInstruments,
+ 0, 0);
+ insertMappedEventForReturn(mE);
+}
+
+void
+AlsaDriver::renameDevice(DeviceId id, QString name)
+{
+ DeviceIntMap::iterator i = m_outputPorts.find(id);
+ if (i == m_outputPorts.end()) {
+ std::cerr << "WARNING: AlsaDriver::renameDevice: Cannot find device "
+ << id << " in port map" << std::endl;
+ return ;
+ }
+
+ snd_seq_port_info_t *pinfo;
+ snd_seq_port_info_alloca(&pinfo);
+ snd_seq_get_port_info(m_midiHandle, i->second, pinfo);
+
+ QString oldName = snd_seq_port_info_get_name(pinfo);
+ int sep = oldName.find(" - ");
+
+ QString newName;
+
+ if (name.startsWith("Anonymous MIDI device ")) {
+ if (sep < 0)
+ sep = 0;
+ newName = oldName.left(sep);
+ } else if (sep < 0) {
+ newName = oldName + " - " + name;
+ } else {
+ newName = oldName.left(sep + 3) + name;
+ }
+
+ snd_seq_port_info_set_name(pinfo, newName.data());
+ checkAlsaError(snd_seq_set_port_info(m_midiHandle, i->second, pinfo),
+ "renameDevice");
+
+ for (unsigned int i = 0; i < m_devices.size(); ++i) {
+ if (m_devices[i]->getId() == id) {
+ m_devices[i]->setName(newName.data());
+ break;
+ }
+ }
+
+ std::cerr << "Renamed " << m_client << ":" << i->second << " to " << name << std::endl;
+}
+
+ClientPortPair
+AlsaDriver::getPortByName(std::string name)
+{
+ for (unsigned int i = 0; i < m_alsaPorts.size(); ++i) {
+ if (m_alsaPorts[i]->m_name == name) {
+ return ClientPortPair(m_alsaPorts[i]->m_client,
+ m_alsaPorts[i]->m_port);
+ }
+ }
+ return ClientPortPair( -1, -1);
+}
+
+std::string
+AlsaDriver::getPortName(ClientPortPair port)
+{
+ for (unsigned int i = 0; i < m_alsaPorts.size(); ++i) {
+ if (m_alsaPorts[i]->m_client == port.first &&
+ m_alsaPorts[i]->m_port == port.second) {
+ return m_alsaPorts[i]->m_name;
+ }
+ }
+ return "";
+}
+
+
+unsigned int
+AlsaDriver::getConnections(Device::DeviceType type,
+ MidiDevice::DeviceDirection direction)
+{
+ if (type != Device::Midi)
+ return 0;
+
+ int count = 0;
+ for (unsigned int j = 0; j < m_alsaPorts.size(); ++j) {
+ if ((direction == MidiDevice::Play && m_alsaPorts[j]->isWriteable()) ||
+ (direction == MidiDevice::Record && m_alsaPorts[j]->isReadable())) {
+ ++count;
+ }
+ }
+
+ return count;
+}
+
+QString
+AlsaDriver::getConnection(Device::DeviceType type,
+ MidiDevice::DeviceDirection direction,
+ unsigned int connectionNo)
+{
+ if (type != Device::Midi)
+ return "";
+
+ AlsaPortList tempList;
+ for (unsigned int j = 0; j < m_alsaPorts.size(); ++j) {
+ if ((direction == MidiDevice::Play && m_alsaPorts[j]->isWriteable()) ||
+ (direction == MidiDevice::Record && m_alsaPorts[j]->isReadable())) {
+ tempList.push_back(m_alsaPorts[j]);
+ }
+ }
+
+ if (connectionNo < tempList.size()) {
+ return tempList[connectionNo]->m_name.c_str();
+ }
+
+ return "";
+}
+
+void
+AlsaDriver::setConnectionToDevice(MappedDevice &device, QString connection)
+{
+ ClientPortPair pair( -1, -1);
+ if (connection && connection != "") {
+ pair = getPortByName(connection.data());
+ }
+ setConnectionToDevice(device, connection, pair);
+}
+
+void
+AlsaDriver::setConnectionToDevice(MappedDevice &device, QString connection,
+ const ClientPortPair &pair)
+{
+ QString prevConnection = device.getConnection().c_str();
+ device.setConnection(connection.data());
+
+ if (device.getDirection() == MidiDevice::Play) {
+
+ DeviceIntMap::iterator j = m_outputPorts.find(device.getId());
+
+ if (j != m_outputPorts.end()) {
+
+ if (prevConnection != "") {
+ ClientPortPair prevPair = getPortByName(prevConnection.data());
+ if (prevPair.first >= 0 && prevPair.second >= 0) {
+
+ std::cerr << "Disconnecting my port " << j->second << " from " << prevPair.first << ":" << prevPair.second << " on reconnection" << std::endl;
+ snd_seq_disconnect_to(m_midiHandle,
+ j->second,
+ prevPair.first,
+ prevPair.second);
+
+ if (m_midiSyncAutoConnect) {
+ bool foundElsewhere = false;
+ for (MappedDeviceList::iterator k = m_devices.begin();
+ k != m_devices.end(); ++k) {
+ if ((*k)->getId() != device.getId()) {
+ if ((*k)->getConnection() == prevConnection.data()) {
+ foundElsewhere = true;
+ break;
+ }
+ }
+ }
+ if (!foundElsewhere) {
+ snd_seq_disconnect_to(m_midiHandle,
+ m_syncOutputPort,
+ pair.first,
+ pair.second);
+ }
+ }
+ }
+ }
+
+ if (pair.first >= 0 && pair.second >= 0) {
+ std::cerr << "Connecting my port " << j->second << " to " << pair.first << ":" << pair.second << " on reconnection" << std::endl;
+ snd_seq_connect_to(m_midiHandle,
+ j->second,
+ pair.first,
+ pair.second);
+ if (m_midiSyncAutoConnect) {
+ snd_seq_connect_to(m_midiHandle,
+ m_syncOutputPort,
+ pair.first,
+ pair.second);
+ }
+ }
+ }
+ }
+}
+
+void
+AlsaDriver::setConnection(DeviceId id, QString connection)
+{
+ Audit audit;
+ ClientPortPair port(getPortByName(connection.data()));
+
+ if (port.first != -1 && port.second != -1) {
+
+ m_devicePortMap[id] = port;
+
+ for (unsigned int i = 0; i < m_devices.size(); ++i) {
+
+ if (m_devices[i]->getId() == id) {
+ setConnectionToDevice(*m_devices[i], connection, port);
+
+ MappedEvent *mE =
+ new MappedEvent(0, MappedEvent::SystemUpdateInstruments,
+ 0, 0);
+ insertMappedEventForReturn(mE);
+
+ break;
+ }
+ }
+ }
+}
+
+void
+AlsaDriver::setPlausibleConnection(DeviceId id, QString idealConnection)
+{
+ Audit audit;
+ ClientPortPair port(getPortByName(idealConnection.data()));
+
+ audit << "AlsaDriver::setPlausibleConnection: connection like "
+ << idealConnection << " requested for device " << id << std::endl;
+
+ if (port.first != -1 && port.second != -1) {
+
+ m_devicePortMap[id] = port;
+
+ for (unsigned int i = 0; i < m_devices.size(); ++i) {
+
+ if (m_devices[i]->getId() == id) {
+ setConnectionToDevice(*m_devices[i], idealConnection, port);
+ break;
+ }
+ }
+
+ audit << "AlsaDriver::setPlausibleConnection: exact match available"
+ << std::endl;
+ return ;
+ }
+
+ // What we want is a connection that:
+ //
+ // * is in the right "class" (the 0-63/64-127/128+ range of client id)
+ // * has at least some text in common
+ // * is not yet in use for any device.
+ //
+ // To do this, we exploit our privileged position as part of AlsaDriver
+ // and use our knowledge of how connection strings are made (see
+ // AlsaDriver::generatePortList above) to pick out the relevant parts
+ // of the requested string.
+
+ int client = -1;
+ int colon = idealConnection.find(":");
+ if (colon >= 0)
+ client = idealConnection.left(colon).toInt();
+
+ int portNo = -1;
+ if (client > 0) {
+ QString remainder = idealConnection.mid(colon + 1);
+ int space = remainder.find(" ");
+ if (space >= 0)
+ portNo = remainder.left(space).toInt();
+ }
+
+ int firstSpace = idealConnection.find(" ");
+ int endOfText = idealConnection.find(QRegExp("[^\\w ]"), firstSpace);
+
+ QString text;
+ if (endOfText < 2) {
+ text = idealConnection.mid(firstSpace + 1);
+ } else {
+ text = idealConnection.mid(firstSpace + 1, endOfText - firstSpace - 2);
+ }
+
+ for (int testUsed = 1; testUsed >= 0; --testUsed) {
+
+ for (int testNumbers = 1; testNumbers >= 0; --testNumbers) {
+
+ for (int testName = 1; testName >= 0; --testName) {
+
+ int fitness =
+ (testName << 3) +
+ (testNumbers << 2) +
+ (testUsed << 1) + 1;
+
+ for (unsigned int i = 0; i < m_alsaPorts.size(); ++i) {
+
+ AlsaPortDescription *port = m_alsaPorts[i];
+
+ if (client > 0) {
+
+ if (port->m_client / 64 != client / 64)
+ continue;
+
+ if (testNumbers) {
+ // We always check the client class (above).
+ // But we also prefer to have something in
+ // common with client or port number, at least
+ // for ports that aren't used elsewhere
+ // already. We don't check both because the
+ // chances are the entire string would already
+ // have matched if both figures did; instead
+ // we check the port if it's > 0 (handy for
+ // e.g. matching the MIDI synth port on a
+ // multi-port soundcard) and the client
+ // otherwise.
+ if (portNo > 0) {
+ if (port->m_port != portNo)
+ continue;
+ } else {
+ if (port->m_client != client)
+ continue;
+ }
+ }
+ }
+
+ if (testName && text != "" &&
+ !QString(port->m_name.c_str()).contains(text))
+ continue;
+
+ if (testUsed) {
+ bool used = false;
+ for (DevicePortMap::iterator dpmi = m_devicePortMap.begin();
+ dpmi != m_devicePortMap.end(); ++dpmi) {
+ if (dpmi->second.first == port->m_client &&
+ dpmi->second.second == port->m_port) {
+ used = true;
+ break;
+ }
+ }
+ if (used)
+ continue;
+ }
+
+ // OK, this one will do
+
+ audit << "AlsaDriver::setPlausibleConnection: fuzzy match "
+ << port->m_name << " available with fitness "
+ << fitness << std::endl;
+
+ m_devicePortMap[id] = ClientPortPair(port->m_client, port->m_port);
+
+ for (unsigned int i = 0; i < m_devices.size(); ++i) {
+
+ if (m_devices[i]->getId() == id) {
+ setConnectionToDevice(*m_devices[i],
+ port->m_name.c_str(),
+ m_devicePortMap[id]);
+
+ // in this case we don't request a device resync,
+ // because this is only invoked at times such as
+ // file load when the GUI is well aware that the
+ // whole situation is in upheaval anyway
+
+ return ;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ audit << "AlsaDriver::setPlausibleConnection: nothing suitable available"
+ << std::endl;
+}
+
+
+void
+AlsaDriver::checkTimerSync(size_t frames)
+{
+ if (!m_doTimerChecks)
+ return ;
+
+#ifdef HAVE_LIBJACK
+
+ if (!m_jackDriver || !m_queueRunning || frames == 0 ||
+ (getMTCStatus() == TRANSPORT_SLAVE)) {
+ m_firstTimerCheck = true;
+ return ;
+ }
+
+ static RealTime startAlsaTime;
+ static size_t startJackFrames = 0;
+ static size_t lastJackFrames = 0;
+
+ size_t nowJackFrames = m_jackDriver->getFramesProcessed();
+ RealTime nowAlsaTime = getAlsaTime();
+
+ if (m_firstTimerCheck ||
+ (nowJackFrames <= lastJackFrames) ||
+ (nowAlsaTime <= startAlsaTime)) {
+
+ startAlsaTime = nowAlsaTime;
+ startJackFrames = nowJackFrames;
+ lastJackFrames = nowJackFrames;
+
+ m_firstTimerCheck = false;
+ return ;
+ }
+
+ RealTime jackDiff = RealTime::frame2RealTime
+ (nowJackFrames - startJackFrames,
+ m_jackDriver->getSampleRate());
+
+ RealTime alsaDiff = nowAlsaTime - startAlsaTime;
+
+ if (alsaDiff > RealTime(10, 0)) {
+
+#ifdef DEBUG_ALSA
+ if (!m_playing) {
+ std::cout << "\nALSA:" << startAlsaTime << "\t->" << nowAlsaTime << "\nJACK: " << startJackFrames << "\t\t-> " << nowJackFrames << std::endl;
+ std::cout << "ALSA diff: " << alsaDiff << "\nJACK diff: " << jackDiff << std::endl;
+ }
+#endif
+
+ double ratio = (jackDiff - alsaDiff) / alsaDiff;
+
+ if (fabs(ratio) > 0.1) {
+#ifdef DEBUG_ALSA
+ if (!m_playing) {
+ std::cout << "Ignoring excessive ratio " << ratio
+ << ", hoping for a more likely result next time"
+ << std::endl;
+ }
+#endif
+
+ } else if (fabs(ratio) > 0.000001) {
+
+#ifdef DEBUG_ALSA
+ if (alsaDiff > RealTime::zeroTime && jackDiff > RealTime::zeroTime) {
+ if (!m_playing) {
+ if (jackDiff < alsaDiff) {
+ std::cout << "<<<< ALSA timer is faster by " << 100.0 * ((alsaDiff - jackDiff) / alsaDiff) << "% (1/" << int(1.0 / ratio) << ")" << std::endl;
+ } else {
+ std::cout << ">>>> JACK timer is faster by " << 100.0 * ((jackDiff - alsaDiff) / alsaDiff) << "% (1/" << int(1.0 / ratio) << ")" << std::endl;
+ }
+ }
+ }
+#endif
+
+ m_timerRatio = ratio;
+ m_timerRatioCalculated = true;
+ }
+
+ m_firstTimerCheck = true;
+ }
+#endif
+}
+
+
+unsigned int
+AlsaDriver::getTimers()
+{
+ return m_timers.size() + 1; // one extra for auto
+}
+
+QString
+AlsaDriver::getTimer(unsigned int n)
+{
+ if (n == 0)
+ return AUTO_TIMER_NAME;
+ else
+ return m_timers[n -1].name.c_str();
+}
+
+QString
+AlsaDriver::getCurrentTimer()
+{
+ return m_currentTimer.c_str();
+}
+
+void
+AlsaDriver::setCurrentTimer(QString timer)
+{
+ Audit audit;
+
+ if (timer == getCurrentTimer())
+ return ;
+
+ std::cerr << "AlsaDriver::setCurrentTimer(" << timer << ")" << std::endl;
+
+ std::string name(timer.data());
+
+ if (name == AUTO_TIMER_NAME) {
+ name = getAutoTimer(m_doTimerChecks);
+ } else {
+ m_doTimerChecks = false;
+ }
+ m_timerRatioCalculated = false;
+
+ // Stop and restart the queue around the timer change. We don't
+ // call stopClocks/startClocks here because they do the wrong
+ // thing if we're currently playing and on the JACK transport.
+
+ m_queueRunning = false;
+ checkAlsaError(snd_seq_stop_queue(m_midiHandle, m_queue, NULL), "setCurrentTimer(): stopping queue");
+ checkAlsaError(snd_seq_drain_output(m_midiHandle), "setCurrentTimer(): draining output to stop queue");
+
+ snd_seq_event_t event;
+ snd_seq_ev_clear(&event);
+ snd_seq_real_time_t z = { 0, 0 };
+ snd_seq_ev_set_queue_pos_real(&event, m_queue, &z);
+ snd_seq_ev_set_direct(&event);
+ checkAlsaError(snd_seq_control_queue(m_midiHandle, m_queue, SND_SEQ_EVENT_SETPOS_TIME,
+ 0, &event), "setCurrentTimer(): control queue");
+ checkAlsaError(snd_seq_drain_output(m_midiHandle), "setCurrentTimer(): draining output to control queue");
+ m_alsaPlayStartTime = RealTime::zeroTime;
+
+ for (unsigned int i = 0; i < m_timers.size(); ++i) {
+ if (m_timers[i].name == name) {
+
+ snd_seq_queue_timer_t *timer;
+ snd_timer_id_t *timerid;
+
+ snd_seq_queue_timer_alloca(&timer);
+ snd_seq_get_queue_timer(m_midiHandle, m_queue, timer);
+
+ snd_timer_id_alloca(&timerid);
+ snd_timer_id_set_class(timerid, m_timers[i].clas);
+ snd_timer_id_set_sclass(timerid, m_timers[i].sclas);
+ snd_timer_id_set_card(timerid, m_timers[i].card);
+ snd_timer_id_set_device(timerid, m_timers[i].device);
+ snd_timer_id_set_subdevice(timerid, m_timers[i].subdevice);
+
+ snd_seq_queue_timer_set_id(timer, timerid);
+ snd_seq_set_queue_timer(m_midiHandle, m_queue, timer);
+
+ if (m_doTimerChecks) {
+ audit << " Current timer set to \"" << name << "\" with timer checks"
+ << std::endl;
+ } else {
+ audit << " Current timer set to \"" << name << "\""
+ << std::endl;
+ }
+
+ if (m_timers[i].clas == SND_TIMER_CLASS_GLOBAL &&
+ m_timers[i].device == SND_TIMER_GLOBAL_SYSTEM) {
+ long hz = 1000000000 / m_timers[i].resolution;
+ if (hz < 900) {
+ audit << " WARNING: using system timer with only "
+ << hz << "Hz resolution!" << std::endl;
+ }
+ }
+
+ break;
+ }
+ }
+
+#ifdef HAVE_LIBJACK
+ if (m_jackDriver)
+ m_jackDriver->prebufferAudio();
+#endif
+
+ checkAlsaError(snd_seq_continue_queue(m_midiHandle, m_queue, NULL), "checkAlsaError(): continue queue");
+ checkAlsaError(snd_seq_drain_output(m_midiHandle), "setCurrentTimer(): draining output to continue queue");
+ m_queueRunning = true;
+
+ m_firstTimerCheck = true;
+}
+
+bool
+AlsaDriver::initialise()
+{
+ bool result = true;
+
+ initialiseAudio();
+ result = initialiseMidi();
+
+ return result;
+}
+
+
+
+// Set up queue, client and port
+//
+bool
+AlsaDriver::initialiseMidi()
+{
+ Audit audit;
+
+ // Create a non-blocking handle.
+ //
+ if (snd_seq_open(&m_midiHandle,
+ "default",
+ SND_SEQ_OPEN_DUPLEX,
+ SND_SEQ_NONBLOCK) < 0) {
+ audit << "AlsaDriver::initialiseMidi - "
+ << "couldn't open sequencer - " << snd_strerror(errno)
+ << " - perhaps you need to modprobe snd-seq-midi."
+ << std::endl;
+ reportFailure(MappedEvent::FailureALSACallFailed);
+ return false;
+ }
+
+ snd_seq_set_client_name(m_midiHandle, "rosegarden");
+
+ if ((m_client = snd_seq_client_id(m_midiHandle)) < 0) {
+#ifdef DEBUG_ALSA
+ std::cerr << "AlsaDriver::initialiseMidi - can't create client"
+ << std::endl;
+#endif
+
+ return false;
+ }
+
+ // Create a queue
+ //
+ if ((m_queue = snd_seq_alloc_named_queue(m_midiHandle,
+ "Rosegarden queue")) < 0) {
+#ifdef DEBUG_ALSA
+ std::cerr << "AlsaDriver::initialiseMidi - can't allocate queue"
+ << std::endl;
+#endif
+
+ return false;
+ }
+
+ // Create the input port
+ //
+ snd_seq_port_info_t *pinfo;
+
+ snd_seq_port_info_alloca(&pinfo);
+ snd_seq_port_info_set_capability(pinfo,
+ SND_SEQ_PORT_CAP_WRITE |
+ SND_SEQ_PORT_CAP_SUBS_WRITE );
+ snd_seq_port_info_set_type(pinfo, SND_SEQ_PORT_TYPE_APPLICATION);
+ snd_seq_port_info_set_midi_channels(pinfo, 16);
+ /* we want to know when the events got delivered to us */
+ snd_seq_port_info_set_timestamping(pinfo, 1);
+ snd_seq_port_info_set_timestamp_real(pinfo, 1);
+ snd_seq_port_info_set_timestamp_queue(pinfo, m_queue);
+ snd_seq_port_info_set_name(pinfo, "record in");
+
+ if (checkAlsaError(snd_seq_create_port(m_midiHandle, pinfo),
+ "initialiseMidi - can't create input port") < 0)
+ return false;
+ m_inputPort = snd_seq_port_info_get_port(pinfo);
+
+ // Subscribe the input port to the ALSA Announce port
+ // to receive notifications when clients, ports and subscriptions change
+ snd_seq_connect_from( m_midiHandle, m_inputPort,
+ SND_SEQ_CLIENT_SYSTEM, SND_SEQ_PORT_SYSTEM_ANNOUNCE );
+
+ m_midiInputPortConnected = true;
+
+ // Set the input queue size
+ //
+ if (snd_seq_set_client_pool_output(m_midiHandle, 2000) < 0 ||
+ snd_seq_set_client_pool_input(m_midiHandle, 2000) < 0 ||
+ snd_seq_set_client_pool_output_room(m_midiHandle, 2000) < 0) {
+#ifdef DEBUG_ALSA
+ std::cerr << "AlsaDriver::initialiseMidi - "
+ << "can't modify pool parameters"
+ << std::endl;
+#endif
+
+ return false;
+ }
+
+ // Create sync output now as well
+ m_syncOutputPort = checkAlsaError(snd_seq_create_simple_port
+ (m_midiHandle,
+ "sync out",
+ SND_SEQ_PORT_CAP_READ |
+ SND_SEQ_PORT_CAP_SUBS_READ,
+ SND_SEQ_PORT_TYPE_APPLICATION),
+ "initialiseMidi - can't create sync output port");
+
+ // and port for hardware controller
+ m_controllerPort = checkAlsaError(snd_seq_create_simple_port
+ (m_midiHandle,
+ "external controller",
+ SND_SEQ_PORT_CAP_READ |
+ SND_SEQ_PORT_CAP_WRITE |
+ SND_SEQ_PORT_CAP_SUBS_READ |
+ SND_SEQ_PORT_CAP_SUBS_WRITE,
+ SND_SEQ_PORT_TYPE_APPLICATION),
+ "initialiseMidi - can't create controller port");
+
+ getSystemInfo();
+
+ generatePortList();
+ generateInstruments();
+
+ // Modify status with MIDI success
+ //
+ m_driverStatus |= MIDI_OK;
+
+ generateTimerList();
+ setCurrentTimer(AUTO_TIMER_NAME);
+
+ // Start the timer
+ if (checkAlsaError(snd_seq_start_queue(m_midiHandle, m_queue, NULL),
+ "initialiseMidi(): couldn't start queue") < 0) {
+ reportFailure(MappedEvent::FailureALSACallFailed);
+ return false;
+ }
+
+ m_queueRunning = true;
+
+ // process anything pending
+ checkAlsaError(snd_seq_drain_output(m_midiHandle), "initialiseMidi(): couldn't drain output");
+
+ audit << "AlsaDriver::initialiseMidi - initialised MIDI subsystem"
+ << std::endl << std::endl;
+
+ return true;
+}
+
+// We don't even attempt to use ALSA audio. We just use JACK instead.
+// See comment at the top of this file and jackProcess() for further
+// information on how we use this.
+//
+void
+AlsaDriver::initialiseAudio()
+{
+#ifdef HAVE_LIBJACK
+ m_jackDriver = new JackDriver(this);
+
+ if (m_jackDriver->isOK()) {
+ m_driverStatus |= AUDIO_OK;
+ } else {
+ delete m_jackDriver;
+ m_jackDriver = 0;
+ }
+#endif
+}
+
+void
+AlsaDriver::initialisePlayback(const RealTime &position)
+{
+#ifdef DEBUG_ALSA
+ std::cerr << "\n\nAlsaDriver - initialisePlayback" << std::endl;
+#endif
+
+ // now that we restart the queue at each play, the origin is always zero
+ m_alsaPlayStartTime = RealTime::zeroTime;
+ m_playStartPosition = position;
+
+ m_startPlayback = true;
+
+ m_mtcFirstTime = -1;
+ m_mtcSigmaE = 0;
+ m_mtcSigmaC = 0;
+
+ if (getMMCStatus() == TRANSPORT_MASTER) {
+ sendMMC(127, MIDI_MMC_PLAY, true, "");
+ m_eat_mtc = 0;
+ }
+
+ if (getMTCStatus() == TRANSPORT_MASTER) {
+ insertMTCFullFrame(position);
+ }
+
+ // If MIDI Sync is enabled then adjust for the MIDI Clock to
+ // synchronise the sequencer with the clock.
+ //
+ if (getMIDISyncStatus() == TRANSPORT_MASTER) {
+ // Send the Song Position Pointer for MIDI CLOCK positioning
+ //
+ // Get time from current alsa time to start of alsa timing -
+ // add the initial starting point and divide by the MIDI Beat
+ // length. The SPP is is the MIDI Beat upon which to start the song.
+ // Songs are always assumed to start on a MIDI Beat of 0. Each MIDI
+ // Beat spans 6 MIDI Clocks. In other words, each MIDI Beat is a 16th
+ // note (since there are 24 MIDI Clocks in a quarter note).
+ //
+ long spp =
+ long(((getAlsaTime() - m_alsaPlayStartTime + m_playStartPosition) /
+ m_midiClockInterval) / 6.0 );
+
+ // Ok now we have the new SPP - stop the transport and restart with the
+ // new value.
+ //
+ sendSystemDirect(SND_SEQ_EVENT_STOP, NULL);
+
+ signed int args = spp;
+ sendSystemDirect(SND_SEQ_EVENT_SONGPOS, &args);
+
+ // Now send the START/CONTINUE
+ //
+ if (m_playStartPosition == RealTime::zeroTime)
+ sendSystemQueued(SND_SEQ_EVENT_START, "",
+ m_alsaPlayStartTime);
+ else
+ sendSystemQueued(SND_SEQ_EVENT_CONTINUE, "",
+ m_alsaPlayStartTime);
+ }
+
+#ifdef HAVE_LIBJACK
+ if (m_jackDriver) {
+ m_needJackStart = NeedJackStart;
+ }
+#endif
+}
+
+
+void
+AlsaDriver::stopPlayback()
+{
+#ifdef DEBUG_ALSA
+ std::cerr << "\n\nAlsaDriver - stopPlayback" << std::endl;
+#endif
+
+ if (getMIDISyncStatus() == TRANSPORT_MASTER) {
+ sendSystemDirect(SND_SEQ_EVENT_STOP, NULL);
+ }
+
+ if (getMMCStatus() == TRANSPORT_MASTER) {
+ sendMMC(127, MIDI_MMC_STOP, true, "");
+ //<VN> need to throw away the next MTC event
+ m_eat_mtc = 3;
+ }
+
+ allNotesOff();
+ m_playing = false;
+
+#ifdef HAVE_LIBJACK
+ if (m_jackDriver) {
+ m_jackDriver->stopTransport();
+ m_needJackStart = NeedNoJackStart;
+ }
+#endif
+
+ // Flush the output and input queues
+ //
+ snd_seq_remove_events_t *info;
+ snd_seq_remove_events_alloca(&info);
+ snd_seq_remove_events_set_condition(info, SND_SEQ_REMOVE_INPUT |
+ SND_SEQ_REMOVE_OUTPUT);
+ snd_seq_remove_events(m_midiHandle, info);
+
+ // send sounds-off to all play devices
+ //
+ for (MappedDeviceList::iterator i = m_devices.begin(); i != m_devices.end(); ++i) {
+ if ((*i)->getDirection() == MidiDevice::Play) {
+ sendDeviceController((*i)->getId(),
+ MIDI_CONTROLLER_SUSTAIN, 0);
+ sendDeviceController((*i)->getId(),
+ MIDI_CONTROLLER_ALL_NOTES_OFF, 0);
+ }
+ }
+
+ punchOut();
+
+ stopClocks(); // Resets ALSA timer to zero
+
+ clearAudioQueue();
+
+ startClocksApproved(); // restarts ALSA timer without starting JACK transport
+}
+
+void
+AlsaDriver::punchOut()
+{
+#ifdef DEBUG_ALSA
+ std::cerr << "AlsaDriver::punchOut" << std::endl;
+#endif
+
+#ifdef HAVE_LIBJACK
+ // Close any recording file
+ if (m_recordStatus == RECORD_ON) {
+ for (InstrumentSet::const_iterator i = m_recordingInstruments.begin();
+ i != m_recordingInstruments.end(); ++i) {
+
+ InstrumentId id = *i;
+
+ if (id >= AudioInstrumentBase &&
+ id < MidiInstrumentBase) {
+
+ AudioFileId auid = 0;
+ if (m_jackDriver && m_jackDriver->closeRecordFile(id, auid)) {
+
+#ifdef DEBUG_ALSA
+ std::cerr << "AlsaDriver::stopPlayback: sending back to GUI for instrument " << id << std::endl;
+#endif
+
+ // Create event to return to gui to say that we've
+ // completed an audio file and we can generate a
+ // preview for it now.
+ //
+ // nasty hack -- don't have right audio id here, and
+ // the sequencer will wipe out the instrument id and
+ // replace it with currently-selected one in gui --
+ // so use audio id slot to pass back instrument id
+ // and handle accordingly in gui
+ try {
+ MappedEvent *mE =
+ new MappedEvent(id,
+ MappedEvent::AudioGeneratePreview,
+ id % 256,
+ id / 256);
+
+ // send completion event
+ insertMappedEventForReturn(mE);
+ } catch (...) {
+ ;
+ }
+ }
+ }
+ }
+ }
+#endif
+
+ // Change recorded state if any set
+ //
+ if (m_recordStatus == RECORD_ON)
+ m_recordStatus = RECORD_OFF;
+
+ m_recordingInstruments.clear();
+}
+
+void
+AlsaDriver::resetPlayback(const RealTime &oldPosition, const RealTime &position)
+{
+#ifdef DEBUG_ALSA
+ std::cerr << "\n\nAlsaDriver - resetPlayback(" << oldPosition << "," << position << ")" << std::endl;
+#endif
+
+ if (getMMCStatus() == TRANSPORT_MASTER) {
+ unsigned char t_sec = (unsigned char) position.sec % 60;
+ unsigned char t_min = (unsigned char) (position.sec / 60) % 60;
+ unsigned char t_hrs = (unsigned char) (position.sec / 3600);
+#define STUPID_BROKEN_EQUIPMENT
+#ifdef STUPID_BROKEN_EQUIPMENT
+ // Some recorders assume you are talking in 30fps...
+ unsigned char t_frm = (unsigned char) (position.nsec / 33333333U);
+ unsigned char t_sbf = (unsigned char) ((position.nsec / 333333U) % 100U);
+#else
+ // We always send at 25fps, it's the easiest to avoid rounding problems
+ unsigned char t_frm = (unsigned char) (position.nsec / 40000000U);
+ unsigned char t_sbf = (unsigned char) ((position.nsec / 400000U) % 100U);
+#endif
+
+ std::cerr << "\n Jump using MMC LOCATE to" << position << std::endl;
+ std::cerr << "\t which is " << int(t_hrs) << ":" << int(t_min) << ":" << int(t_sec) << "." << int(t_frm) << "." << int(t_sbf) << std::endl;
+ unsigned char locateDataArr[7] = {
+ 0x06,
+ 0x01,
+ 0x60 + t_hrs, // (30fps flag) + hh
+ t_min, // mm
+ t_sec, // ss
+ t_frm, // frames
+ t_sbf // subframes
+ };
+
+ sendMMC(127, MIDI_MMC_LOCATE, true, std::string((const char *) locateDataArr, 7));
+ }
+
+ RealTime formerStartPosition = m_playStartPosition;
+
+ m_playStartPosition = position;
+ m_alsaPlayStartTime = getAlsaTime();
+
+ // Reset note offs to correct positions
+ //
+ RealTime jump = position - oldPosition;
+
+#ifdef DEBUG_PROCESS_MIDI_OUT
+ std::cerr << "Currently " << m_noteOffQueue.size() << " in note off queue" << std::endl;
+#endif
+
+ // modify the note offs that exist as they're relative to the
+ // playStartPosition terms.
+ //
+ for (NoteOffQueue::iterator i = m_noteOffQueue.begin();
+ i != m_noteOffQueue.end(); ++i) {
+
+ // if we're fast forwarding then we bring the note off closer
+ if (jump >= RealTime::zeroTime) {
+
+ RealTime endTime = formerStartPosition + (*i)->getRealTime();
+
+#ifdef DEBUG_PROCESS_MIDI_OUT
+ std::cerr << "Forward jump of " << jump << ": adjusting note off from "
+ << (*i)->getRealTime() << " (absolute " << endTime
+ << ") to ";
+#endif
+ (*i)->setRealTime(endTime - position);
+#ifdef DEBUG_PROCESS_MIDI_OUT
+ std::cerr << (*i)->getRealTime() << std::endl;
+#endif
+ } else // we're rewinding - kill the note immediately
+ {
+#ifdef DEBUG_PROCESS_MIDI_OUT
+ std::cerr << "Rewind by " << jump << ": setting note off to zero" << std::endl;
+#endif
+ (*i)->setRealTime(RealTime::zeroTime);
+ }
+ }
+
+ pushRecentNoteOffs();
+ processNotesOff(getAlsaTime(), true);
+ checkAlsaError(snd_seq_drain_output(m_midiHandle), "resetPlayback(): draining");
+
+ // Ensure we clear down output queue on reset - in the case of
+ // MIDI clock where we might have a long queue of events already
+ // posted.
+ //
+ snd_seq_remove_events_t *info;
+ snd_seq_remove_events_alloca(&info);
+ snd_seq_remove_events_set_condition(info, SND_SEQ_REMOVE_OUTPUT);
+ snd_seq_remove_events(m_midiHandle, info);
+
+ if (getMTCStatus() == TRANSPORT_MASTER) {
+ m_mtcFirstTime = -1;
+ m_mtcSigmaE = 0;
+ m_mtcSigmaC = 0;
+ insertMTCFullFrame(position);
+ }
+
+#ifdef HAVE_LIBJACK
+ if (m_jackDriver) {
+ m_jackDriver->clearSynthPluginEvents();
+ m_needJackStart = NeedJackReposition;
+ }
+#endif
+}
+
+void
+AlsaDriver::setMIDIClockInterval(RealTime interval)
+{
+#ifdef DEBUG_ALSA
+ std::cerr << "AlsaDriver::setMIDIClockInterval(" << interval << ")" << endl;
+#endif
+
+ // Reset the value
+ //
+ SoundDriver::setMIDIClockInterval(interval);
+
+ // Return if the clock isn't enabled
+ //
+ if (!m_midiClockEnabled)
+ return ;
+
+ if (false) // don't remove any events quite yet
+ {
+
+ // Remove all queued events (although we should filter this
+ // down to just the clock events.
+ //
+ snd_seq_remove_events_t *info;
+ snd_seq_remove_events_alloca(&info);
+
+ //if (snd_seq_type_check(SND_SEQ_EVENT_CLOCK, SND_SEQ_EVFLG_CONTROL))
+ //snd_seq_remove_events_set_event_type(info,
+ snd_seq_remove_events_set_condition(info, SND_SEQ_REMOVE_OUTPUT);
+ snd_seq_remove_events_set_event_type(info, SND_SEQ_EVFLG_CONTROL);
+ std::cout << "AlsaDriver::setMIDIClockInterval - "
+ << "MIDI CLOCK TYPE IS CONTROL" << std::endl;
+ snd_seq_remove_events(m_midiHandle, info);
+ }
+
+}
+
+
+void
+AlsaDriver::pushRecentNoteOffs()
+{
+#ifdef DEBUG_PROCESS_MIDI_OUT
+ std::cerr << "AlsaDriver::pushRecentNoteOffs: have " << m_recentNoteOffs.size() << " in queue" << std::endl;
+#endif
+
+ for (NoteOffQueue::iterator i = m_recentNoteOffs.begin();
+ i != m_recentNoteOffs.end(); ++i) {
+ (*i)->setRealTime(RealTime::zeroTime);
+ m_noteOffQueue.insert(*i);
+ }
+
+ m_recentNoteOffs.clear();
+}
+
+void
+AlsaDriver::cropRecentNoteOffs(const RealTime &t)
+{
+ while (!m_recentNoteOffs.empty()) {
+ NoteOffEvent *ev = *m_recentNoteOffs.begin();
+#ifdef DEBUG_PROCESS_MIDI_OUT
+ std::cerr << "AlsaDriver::cropRecentNoteOffs: " << ev->getRealTime() << " vs " << t << std::endl;
+#endif
+ if (ev->getRealTime() >= t) break;
+ delete ev;
+ m_recentNoteOffs.erase(m_recentNoteOffs.begin());
+ }
+}
+
+void
+AlsaDriver::weedRecentNoteOffs(unsigned int pitch, MidiByte channel,
+ InstrumentId instrument)
+{
+ for (NoteOffQueue::iterator i = m_recentNoteOffs.begin();
+ i != m_recentNoteOffs.end(); ++i) {
+ if ((*i)->getPitch() == pitch &&
+ (*i)->getChannel() == channel &&
+ (*i)->getInstrument() == instrument) {
+#ifdef DEBUG_PROCESS_MIDI_OUT
+ std::cerr << "AlsaDriver::weedRecentNoteOffs: deleting one" << std::endl;
+#endif
+ delete *i;
+ m_recentNoteOffs.erase(i);
+ break;
+ }
+ }
+}
+
+void
+AlsaDriver::allNotesOff()
+{
+ snd_seq_event_t event;
+ ClientPortPair outputDevice;
+ RealTime offTime;
+
+ // drop any pending notes
+ snd_seq_drop_output_buffer(m_midiHandle);
+ snd_seq_drop_output(m_midiHandle);
+
+ // prepare the event
+ snd_seq_ev_clear(&event);
+ offTime = getAlsaTime();
+
+ for (NoteOffQueue::iterator it = m_noteOffQueue.begin();
+ it != m_noteOffQueue.end(); ++it) {
+ // Set destination according to connection for instrument
+ //
+ outputDevice = getPairForMappedInstrument((*it)->getInstrument());
+ if (outputDevice.first < 0 || outputDevice.second < 0)
+ continue;
+
+ snd_seq_ev_set_subs(&event);
+
+ // Set source according to port for device
+ //
+ int src = getOutputPortForMappedInstrument((*it)->getInstrument());
+ if (src < 0)
+ continue;
+ snd_seq_ev_set_source(&event, src);
+
+ snd_seq_ev_set_noteoff(&event,
+ (*it)->getChannel(),
+ (*it)->getPitch(),
+ 127);
+
+ //snd_seq_event_output(m_midiHandle, &event);
+ int error = snd_seq_event_output_direct(m_midiHandle, &event);
+
+ if (error < 0) {
+#ifdef DEBUG_ALSA
+ std::cerr << "AlsaDriver::allNotesOff - "
+ << "can't send event" << std::endl;
+#endif
+
+ }
+
+ delete(*it);
+ }
+
+ m_noteOffQueue.erase(m_noteOffQueue.begin(), m_noteOffQueue.end());
+
+ /*
+ std::cerr << "AlsaDriver::allNotesOff - "
+ << " queue size = " << m_noteOffQueue.size() << std::endl;
+ */
+
+ // flush
+ checkAlsaError(snd_seq_drain_output(m_midiHandle), "allNotesOff(): draining");
+}
+
+void
+AlsaDriver::processNotesOff(const RealTime &time, bool now, bool everything)
+{
+ if (m_noteOffQueue.empty()) {
+ return;
+ }
+
+ snd_seq_event_t event;
+
+ ClientPortPair outputDevice;
+ RealTime offTime;
+
+ // prepare the event
+ snd_seq_ev_clear(&event);
+
+ RealTime alsaTime = getAlsaTime();
+
+#ifdef DEBUG_PROCESS_MIDI_OUT
+ std::cerr << "AlsaDriver::processNotesOff(" << time << "): alsaTime = " << alsaTime << ", now = " << now << std::endl;
+#endif
+
+ while (m_noteOffQueue.begin() != m_noteOffQueue.end()) {
+
+ NoteOffEvent *ev = *m_noteOffQueue.begin();
+
+ if (ev->getRealTime() > time) {
+#ifdef DEBUG_PROCESS_MIDI_OUT
+ std::cerr << "Note off time " << ev->getRealTime() << " is beyond current time " << time << std::endl;
+#endif
+ if (!everything) break;
+ }
+
+#ifdef DEBUG_PROCESS_MIDI_OUT
+ std::cerr << "AlsaDriver::processNotesOff(" << time << "): found event at " << ev->getRealTime() << ", instr " << ev->getInstrument() << ", channel " << int(ev->getChannel()) << ", pitch " << int(ev->getPitch()) << std::endl;
+#endif
+
+ bool isSoftSynth = (ev->getInstrument() >= SoftSynthInstrumentBase);
+
+ offTime = ev->getRealTime();
+ if (offTime < RealTime::zeroTime) offTime = RealTime::zeroTime;
+ bool scheduled = (offTime > alsaTime) && !now;
+ if (!scheduled) offTime = RealTime::zeroTime;
+
+ snd_seq_real_time_t alsaOffTime = { offTime.sec,
+ offTime.nsec };
+
+ snd_seq_ev_set_noteoff(&event,
+ ev->getChannel(),
+ ev->getPitch(),
+ 127);
+
+ if (!isSoftSynth) {
+
+ snd_seq_ev_set_subs(&event);
+
+ // Set source according to instrument
+ //
+ int src = getOutputPortForMappedInstrument(ev->getInstrument());
+ if (src < 0) {
+ std::cerr << "note off has no output port (instr = " << ev->getInstrument() << ")" << std::endl;
+ delete ev;
+ m_noteOffQueue.erase(m_noteOffQueue.begin());
+ continue;
+ }
+
+ snd_seq_ev_set_source(&event, src);
+
+ snd_seq_ev_set_subs(&event);
+
+ snd_seq_ev_schedule_real(&event, m_queue, 0, &alsaOffTime);
+
+ if (scheduled) {
+ snd_seq_event_output(m_midiHandle, &event);
+ } else {
+ snd_seq_event_output_direct(m_midiHandle, &event);
+ }
+
+ } else {
+
+ event.time.time = alsaOffTime;
+
+ processSoftSynthEventOut(ev->getInstrument(), &event, now);
+ }
+
+ if (!now) {
+ m_recentNoteOffs.insert(ev);
+ } else {
+ delete ev;
+ }
+ m_noteOffQueue.erase(m_noteOffQueue.begin());
+ }
+
+ // We don't flush the queue here, as this is called nested from
+ // processMidiOut, which does the flushing
+
+#ifdef DEBUG_PROCESS_MIDI_OUT
+ std::cerr << "AlsaDriver::processNotesOff - "
+ << " queue size now: " << m_noteOffQueue.size() << std::endl;
+#endif
+}
+
+// Get the queue time and convert it to RealTime for the gui
+// to use.
+//
+RealTime
+AlsaDriver::getSequencerTime()
+{
+ RealTime t(0, 0);
+
+ t = getAlsaTime() + m_playStartPosition - m_alsaPlayStartTime;
+
+ // std::cerr << "AlsaDriver::getSequencerTime: alsa time is "
+ // << getAlsaTime() << ", start time is " << m_alsaPlayStartTime << ", play start position is " << m_playStartPosition << endl;
+
+ return t;
+}
+
+// Gets the time of the ALSA queue
+//
+RealTime
+AlsaDriver::getAlsaTime()
+{
+ RealTime sequencerTime(0, 0);
+
+ snd_seq_queue_status_t *status;
+ snd_seq_queue_status_alloca(&status);
+
+ if (snd_seq_get_queue_status(m_midiHandle, m_queue, status) < 0) {
+#ifdef DEBUG_ALSA
+ std::cerr << "AlsaDriver::getAlsaTime - can't get queue status"
+ << std::endl;
+#endif
+
+ return sequencerTime;
+ }
+
+ sequencerTime.sec = snd_seq_queue_status_get_real_time(status)->tv_sec;
+ sequencerTime.nsec = snd_seq_queue_status_get_real_time(status)->tv_nsec;
+
+ // std::cerr << "AlsaDriver::getAlsaTime: alsa time is " << sequencerTime << std::endl;
+
+ return sequencerTime;
+}
+
+
+// Get all pending input events and turn them into a MappedComposition.
+//
+//
+MappedComposition*
+AlsaDriver::getMappedComposition()
+{
+ m_recordComposition.clear();
+
+ while (_failureReportReadIndex != _failureReportWriteIndex) {
+ MappedEvent::FailureCode code = _failureReports[_failureReportReadIndex];
+ // std::cerr << "AlsaDriver::reportFailure(" << code << ")" << std::endl;
+ MappedEvent *mE = new MappedEvent
+ (0, MappedEvent::SystemFailure, code, 0);
+ m_returnComposition.insert(mE);
+ _failureReportReadIndex =
+ (_failureReportReadIndex + 1) % FAILURE_REPORT_COUNT;
+ }
+
+ if (!m_returnComposition.empty()) {
+ for (MappedComposition::iterator i = m_returnComposition.begin();
+ i != m_returnComposition.end(); ++i) {
+ m_recordComposition.insert(new MappedEvent(**i));
+ }
+ m_returnComposition.clear();
+ }
+
+ // If the input port hasn't connected we shouldn't poll it
+ //
+ if (m_midiInputPortConnected == false) {
+ return &m_recordComposition;
+ }
+
+ RealTime eventTime(0, 0);
+
+ snd_seq_event_t *event;
+
+ while (snd_seq_event_input(m_midiHandle, &event) > 0) {
+
+ unsigned int channel = (unsigned int)event->data.note.channel;
+ unsigned int chanNoteKey = ( channel << 8 ) +
+ (unsigned int) event->data.note.note;
+
+ bool fromController = false;
+
+ if (event->dest.client == m_client &&
+ event->dest.port == m_controllerPort) {
+#ifdef DEBUG_ALSA
+ std::cerr << "Received an external controller event" << std::endl;
+#endif
+
+ fromController = true;
+ }
+
+ unsigned int deviceId = Device::NO_DEVICE;
+
+ if (fromController) {
+ deviceId = Device::CONTROL_DEVICE;
+ } else {
+ for (MappedDeviceList::iterator i = m_devices.begin();
+ i != m_devices.end(); ++i) {
+ ClientPortPair pair(m_devicePortMap[(*i)->getId()]);
+ if (((*i)->getDirection() == MidiDevice::Record) &&
+ ( pair.first == event->source.client ) &&
+ ( pair.second == event->source.port )) {
+ deviceId = (*i)->getId();
+ break;
+ }
+ }
+ }
+
+ eventTime.sec = event->time.time.tv_sec;
+ eventTime.nsec = event->time.time.tv_nsec;
+ eventTime = eventTime - m_alsaRecordStartTime + m_playStartPosition;
+
+#ifdef DEBUG_ALSA
+ if (!fromController) {
+ std::cerr << "Received normal event: type " << int(event->type) << ", chan " << channel << ", note " << int(event->data.note.note) << ", time " << eventTime << std::endl;
+ }
+#endif
+
+ switch (event->type) {
+ case SND_SEQ_EVENT_NOTE:
+ case SND_SEQ_EVENT_NOTEON:
+ if (fromController)
+ continue;
+ if (event->data.note.velocity > 0) {
+ MappedEvent *mE = new MappedEvent();
+ mE->setPitch(event->data.note.note);
+ mE->setVelocity(event->data.note.velocity);
+ mE->setEventTime(eventTime);
+ mE->setRecordedChannel(channel);
+ mE->setRecordedDevice(deviceId);
+
+ // Negative duration - we need to hear the NOTE ON
+ // so we must insert it now with a negative duration
+ // and pick and mix against the following NOTE OFF
+ // when we create the recorded segment.
+ //
+ mE->setDuration(RealTime( -1, 0));
+
+ // Create a copy of this when we insert the NOTE ON -
+ // keeping a copy alive on the m_noteOnMap.
+ //
+ // We shake out the two NOTE Ons after we've recorded
+ // them.
+ //
+ m_recordComposition.insert(new MappedEvent(mE));
+ m_noteOnMap[deviceId][chanNoteKey] = mE;
+
+ break;
+ }
+
+ case SND_SEQ_EVENT_NOTEOFF:
+ if (fromController)
+ continue;
+
+ if (m_noteOnMap[deviceId][chanNoteKey] != 0) {
+
+ // Set duration correctly on the NOTE OFF
+ //
+ MappedEvent *mE = m_noteOnMap[deviceId][chanNoteKey];
+ RealTime duration = eventTime - mE->getEventTime();
+
+#ifdef DEBUG_ALSA
+ std::cerr << "NOTE OFF: found NOTE ON at " << mE->getEventTime() << std::endl;
+#endif
+
+ if (duration < RealTime::zeroTime) {
+ duration = RealTime::zeroTime;
+ mE->setEventTime(eventTime);
+ }
+
+ // Velocity 0 - NOTE OFF. Set duration correctly
+ // for recovery later.
+ //
+ mE->setVelocity(0);
+ mE->setDuration(duration);
+
+ // force shut off of note
+ m_recordComposition.insert(mE);
+
+ // reset the reference
+ //
+ m_noteOnMap[deviceId][chanNoteKey] = 0;
+
+ }
+ break;
+
+ case SND_SEQ_EVENT_KEYPRESS: {
+ if (fromController)
+ continue;
+
+ // Fix for 632964 by Pedro Lopez-Cabanillas (20030523)
+ //
+ MappedEvent *mE = new MappedEvent();
+ mE->setType(MappedEvent::MidiKeyPressure);
+ mE->setEventTime(eventTime);
+ mE->setData1(event->data.note.note);
+ mE->setData2(event->data.note.velocity);
+ mE->setRecordedChannel(channel);
+ mE->setRecordedDevice(deviceId);
+ m_recordComposition.insert(mE);
+ }
+ break;
+
+ case SND_SEQ_EVENT_CONTROLLER: {
+ MappedEvent *mE = new MappedEvent();
+ mE->setType(MappedEvent::MidiController);
+ mE->setEventTime(eventTime);
+ mE->setData1(event->data.control.param);
+ mE->setData2(event->data.control.value);
+ mE->setRecordedChannel(channel);
+ mE->setRecordedDevice(deviceId);
+ m_recordComposition.insert(mE);
+ }
+ break;
+
+ case SND_SEQ_EVENT_PGMCHANGE: {
+ MappedEvent *mE = new MappedEvent();
+ mE->setType(MappedEvent::MidiProgramChange);
+ mE->setEventTime(eventTime);
+ mE->setData1(event->data.control.value);
+ mE->setRecordedChannel(channel);
+ mE->setRecordedDevice(deviceId);
+ m_recordComposition.insert(mE);
+
+ }
+ break;
+
+ case SND_SEQ_EVENT_PITCHBEND: {
+ if (fromController)
+ continue;
+
+ // Fix for 711889 by Pedro Lopez-Cabanillas (20030523)
+ //
+ int s = event->data.control.value + 8192;
+ int d1 = (s >> 7) & 0x7f; // data1 = MSB
+ int d2 = s & 0x7f; // data2 = LSB
+ MappedEvent *mE = new MappedEvent();
+ mE->setType(MappedEvent::MidiPitchBend);
+ mE->setEventTime(eventTime);
+ mE->setData1(d1);
+ mE->setData2(d2);
+ mE->setRecordedChannel(channel);
+ mE->setRecordedDevice(deviceId);
+ m_recordComposition.insert(mE);
+ }
+ break;
+
+ case SND_SEQ_EVENT_CHANPRESS: {
+ if (fromController)
+ continue;
+
+ // Fixed by Pedro Lopez-Cabanillas (20030523)
+ //
+ int s = event->data.control.value & 0x7f;
+ MappedEvent *mE = new MappedEvent();
+ mE->setType(MappedEvent::MidiChannelPressure);
+ mE->setEventTime(eventTime);
+ mE->setData1(s);
+ mE->setRecordedChannel(channel);
+ mE->setRecordedDevice(deviceId);
+ m_recordComposition.insert(mE);
+ }
+ break;
+
+ case SND_SEQ_EVENT_SYSEX:
+
+ if (fromController)
+ continue;
+
+ if (!testForMTCSysex(event) &&
+ !testForMMCSysex(event)) {
+
+ // Bundle up the data into a block on the MappedEvent
+ //
+ std::string data;
+ char *ptr = (char*)(event->data.ext.ptr);
+ for (unsigned int i = 0; i < event->data.ext.len; ++i)
+ data += *(ptr++);
+
+#ifdef DEBUG_ALSA
+
+ if ((MidiByte)(data[1]) == MIDI_SYSEX_RT) {
+ std::cerr << "REALTIME SYSEX" << endl;
+ for (unsigned int ii = 0; ii < event->data.ext.len; ++ii) {
+ printf("B %d = %02x\n", ii, ((char*)(event->data.ext.ptr))[ii]);
+ }
+ } else {
+ std::cerr << "NON-REALTIME SYSEX" << endl;
+ for (unsigned int ii = 0; ii < event->data.ext.len; ++ii) {
+ printf("B %d = %02x\n", ii, ((char*)(event->data.ext.ptr))[ii]);
+ }
+ }
+#endif
+
+ MappedEvent *mE = new MappedEvent();
+ mE->setType(MappedEvent::MidiSystemMessage);
+ mE->setData1(MIDI_SYSTEM_EXCLUSIVE);
+ mE->setRecordedDevice(deviceId);
+ // chop off SYX and EOX bytes from data block
+ // Fix for 674731 by Pedro Lopez-Cabanillas (20030601)
+ DataBlockRepository::setDataBlockForEvent(mE, data.substr(1, data.length() - 2));
+ mE->setEventTime(eventTime);
+ m_recordComposition.insert(mE);
+ }
+ break;
+
+
+ case SND_SEQ_EVENT_SENSING: // MIDI device is still there
+ break;
+
+ case SND_SEQ_EVENT_QFRAME:
+ if (fromController)
+ continue;
+ if (getMTCStatus() == TRANSPORT_SLAVE) {
+ handleMTCQFrame(event->data.control.value, eventTime);
+ }
+ break;
+
+ case SND_SEQ_EVENT_CLOCK:
+#ifdef DEBUG_ALSA
+
+ std::cerr << "AlsaDriver::getMappedComposition - "
+ << "got realtime MIDI clock" << std::endl;
+#endif
+
+ break;
+
+ case SND_SEQ_EVENT_START:
+ if ((getMIDISyncStatus() == TRANSPORT_SLAVE) && !isPlaying()) {
+ ExternalTransport *transport = getExternalTransportControl();
+ if (transport) {
+ transport->transportJump(ExternalTransport::TransportStopAtTime,
+ RealTime::zeroTime);
+ transport->transportChange(ExternalTransport::TransportStart);
+ }
+ }
+#ifdef DEBUG_ALSA
+ std::cerr << "AlsaDriver::getMappedComposition - "
+ << "START" << std::endl;
+#endif
+
+ break;
+
+ case SND_SEQ_EVENT_CONTINUE:
+ if ((getMIDISyncStatus() == TRANSPORT_SLAVE) && !isPlaying()) {
+ ExternalTransport *transport = getExternalTransportControl();
+ if (transport) {
+ transport->transportChange(ExternalTransport::TransportPlay);
+ }
+ }
+#ifdef DEBUG_ALSA
+ std::cerr << "AlsaDriver::getMappedComposition - "
+ << "CONTINUE" << std::endl;
+#endif
+
+ break;
+
+ case SND_SEQ_EVENT_STOP:
+ if ((getMIDISyncStatus() == TRANSPORT_SLAVE) && isPlaying()) {
+ ExternalTransport *transport = getExternalTransportControl();
+ if (transport) {
+ transport->transportChange(ExternalTransport::TransportStop);
+ }
+ }
+#ifdef DEBUG_ALSA
+ std::cerr << "AlsaDriver::getMappedComposition - "
+ << "STOP" << std::endl;
+#endif
+
+ break;
+
+ case SND_SEQ_EVENT_SONGPOS:
+#ifdef DEBUG_ALSA
+
+ std::cerr << "AlsaDriver::getMappedComposition - "
+ << "SONG POSITION" << std::endl;
+#endif
+
+ break;
+
+ // these cases are handled by checkForNewClients
+ //
+ case SND_SEQ_EVENT_CLIENT_START:
+ case SND_SEQ_EVENT_CLIENT_EXIT:
+ case SND_SEQ_EVENT_CLIENT_CHANGE:
+ case SND_SEQ_EVENT_PORT_START:
+ case SND_SEQ_EVENT_PORT_EXIT:
+ case SND_SEQ_EVENT_PORT_CHANGE:
+ case SND_SEQ_EVENT_PORT_SUBSCRIBED:
+ case SND_SEQ_EVENT_PORT_UNSUBSCRIBED:
+ m_portCheckNeeded = true;
+#ifdef DEBUG_ALSA
+
+ std::cerr << "AlsaDriver::getMappedComposition - "
+ << "got announce event ("
+ << int(event->type) << ")" << std::endl;
+#endif
+
+ break;
+ case SND_SEQ_EVENT_TICK:
+ default:
+#ifdef DEBUG_ALSA
+
+ std::cerr << "AlsaDriver::getMappedComposition - "
+ << "got unhandled MIDI event type from ALSA sequencer"
+ << "(" << int(event->type) << ")" << std::endl;
+#endif
+
+ break;
+
+
+ }
+ }
+
+ if (getMTCStatus() == TRANSPORT_SLAVE && isPlaying()) {
+#ifdef MTC_DEBUG
+ std::cerr << "seq time is " << getSequencerTime() << ", last MTC receive "
+ << m_mtcLastReceive << ", first time " << m_mtcFirstTime << std::endl;
+#endif
+
+ if (m_mtcFirstTime == 0) { // have received _some_ MTC quarter-frame info
+ RealTime seqTime = getSequencerTime();
+ if (m_mtcLastReceive < seqTime &&
+ seqTime - m_mtcLastReceive > RealTime(0, 500000000L)) {
+ ExternalTransport *transport = getExternalTransportControl();
+ if (transport) {
+ transport->transportJump(ExternalTransport::TransportStopAtTime,
+ m_mtcLastEncoded);
+ }
+ }
+ }
+ }
+
+ return &m_recordComposition;
+}
+
+static int lock_count = 0;
+
+void
+AlsaDriver::handleMTCQFrame(unsigned int data_byte, RealTime the_time)
+{
+ if (getMTCStatus() != TRANSPORT_SLAVE)
+ return ;
+
+ switch (data_byte & 0xF0) {
+ /* Frame */
+ case 0x00:
+ /*
+ * Reset everything
+ */
+ m_mtcReceiveTime = the_time;
+ m_mtcFrames = data_byte & 0x0f;
+ m_mtcSeconds = 0;
+ m_mtcMinutes = 0;
+ m_mtcHours = 0;
+ m_mtcSMPTEType = 0;
+
+ break;
+
+ case 0x10:
+ m_mtcFrames |= (data_byte & 0x0f) << 4;
+ break;
+
+ /* Seconds */
+ case 0x20:
+ m_mtcSeconds = data_byte & 0x0f;
+ break;
+ case 0x30:
+ m_mtcSeconds |= (data_byte & 0x0f) << 4;
+ break;
+
+ /* Minutes */
+ case 0x40:
+ m_mtcMinutes = data_byte & 0x0f;
+ break;
+ case 0x50:
+ m_mtcMinutes |= (data_byte & 0x0f) << 4;
+ break;
+
+ /* Hours and SMPTE type */
+ case 0x60:
+ m_mtcHours = data_byte & 0x0f;
+ break;
+
+ case 0x70: {
+ m_mtcHours |= (data_byte & 0x01) << 4;
+ m_mtcSMPTEType = (data_byte & 0x06) >> 1;
+
+ int fps = 30;
+ if (m_mtcSMPTEType == 0)
+ fps = 24;
+ else if (m_mtcSMPTEType == 1)
+ fps = 25;
+
+ /*
+ * Ok, got all the bits now
+ * (Assuming time is rolling forward)
+ */
+
+ /* correct for 2-frame lag */
+ m_mtcFrames += 2;
+ if (m_mtcFrames >= fps) {
+ m_mtcFrames -= fps;
+ if (++m_mtcSeconds == 60) {
+ m_mtcSeconds = 0;
+ if (++m_mtcMinutes == 60) {
+ m_mtcMinutes = 0;
+ ++m_mtcHours;
+ }
+ }
+ }
+
+#ifdef MTC_DEBUG
+ printf("RG MTC: Got a complete sequence: %02d:%02d:%02d.%02d (type %d)\n",
+ m_mtcHours,
+ m_mtcMinutes,
+ m_mtcSeconds,
+ m_mtcFrames,
+ m_mtcSMPTEType);
+#endif
+
+ /* compute encoded time */
+ m_mtcEncodedTime.sec = m_mtcSeconds +
+ m_mtcMinutes * 60 +
+ m_mtcHours * 60 * 60;
+
+ switch (fps) {
+ case 24:
+ m_mtcEncodedTime.nsec = (int)
+ ((125000000UL * (unsigned)m_mtcFrames) / (unsigned) 3);
+ break;
+ case 25:
+ m_mtcEncodedTime.nsec = (int)
+ (40000000UL * (unsigned)m_mtcFrames);
+ break;
+ case 30:
+ default:
+ m_mtcEncodedTime.nsec = (int)
+ ((100000000UL * (unsigned)m_mtcFrames) / (unsigned) 3);
+ break;
+ }
+
+ /*
+ * We only mess with the clock if we are playing
+ */
+ if (m_playing) {
+#ifdef MTC_DEBUG
+ std::cerr << "RG MTC: Tstamp " << m_mtcEncodedTime;
+ std::cerr << " Received @ " << m_mtcReceiveTime << endl;
+#endif
+
+ calibrateMTC();
+
+ RealTime t_diff = m_mtcEncodedTime - m_mtcReceiveTime;
+#ifdef MTC_DEBUG
+
+ std::cerr << "Diff: " << t_diff << endl;
+#endif
+
+ /* -ve diff means ALSA time ahead of MTC time */
+
+ if (t_diff.sec > 0) {
+ tweakSkewForMTC(60000);
+ } else if (t_diff.sec < 0) {
+ tweakSkewForMTC( -60000);
+ } else {
+ /* "small" diff - use adaptive technique */
+ tweakSkewForMTC(t_diff.nsec / 1400);
+ if ((t_diff.nsec / 1000000) == 0) {
+ if (++lock_count == 3) {
+ printf("Got a lock @ %02d:%02d:%02d.%02d (type %d)\n",
+ m_mtcHours,
+ m_mtcMinutes,
+ m_mtcSeconds,
+ m_mtcFrames,
+ m_mtcSMPTEType);
+ }
+ } else {
+ lock_count = 0;
+ }
+ }
+
+ } else if (m_eat_mtc > 0) {
+#ifdef MTC_DEBUG
+ std::cerr << "MTC: Received quarter frame just after issuing MMC stop - ignore it" << std::endl;
+#endif
+
+ --m_eat_mtc;
+ } else {
+ /* If we're not playing, we should be. */
+#ifdef MTC_DEBUG
+ std::cerr << "MTC: Received quarter frame while not playing - starting now" << std::endl;
+#endif
+
+ ExternalTransport *transport = getExternalTransportControl();
+ if (transport) {
+ transport->transportJump
+ (ExternalTransport::TransportStartAtTime,
+ m_mtcEncodedTime);
+ }
+ }
+
+ break;
+ }
+
+ /* Oh dear, demented device! */
+ default:
+ break;
+ }
+}
+
+void
+AlsaDriver::insertMTCFullFrame(RealTime time)
+{
+ snd_seq_event_t event;
+
+ snd_seq_ev_clear(&event);
+ snd_seq_ev_set_source(&event, m_syncOutputPort);
+ snd_seq_ev_set_subs(&event);
+
+ m_mtcEncodedTime = time;
+ m_mtcSeconds = m_mtcEncodedTime.sec % 60;
+ m_mtcMinutes = (m_mtcEncodedTime.sec / 60) % 60;
+ m_mtcHours = (m_mtcEncodedTime.sec / 3600);
+
+ // We always send at 25fps, it's the easiest to avoid rounding problems
+ m_mtcFrames = (unsigned)m_mtcEncodedTime.nsec / 40000000U;
+
+ time = time + m_alsaPlayStartTime - m_playStartPosition;
+ snd_seq_real_time_t atime = { time.sec, time.nsec };
+
+ unsigned char data[10] =
+ { MIDI_SYSTEM_EXCLUSIVE,
+ MIDI_SYSEX_RT, 127, 1, 1,
+ 0, 0, 0, 0,
+ MIDI_END_OF_EXCLUSIVE };
+
+ data[5] = ((unsigned char)m_mtcHours & 0x1f) + (1 << 5); // 1 indicates 25fps
+ data[6] = (unsigned char)m_mtcMinutes;
+ data[7] = (unsigned char)m_mtcSeconds;
+ data[8] = (unsigned char)m_mtcFrames;
+
+ snd_seq_ev_schedule_real(&event, m_queue, 0, &atime);
+ snd_seq_ev_set_sysex(&event, 10, data);
+
+ checkAlsaError(snd_seq_event_output(m_midiHandle, &event),
+ "insertMTCFullFrame event send");
+
+ if (m_queueRunning) {
+ checkAlsaError(snd_seq_drain_output(m_midiHandle), "insertMTCFullFrame drain");
+ }
+}
+
+void
+AlsaDriver::insertMTCQFrames(RealTime sliceStart, RealTime sliceEnd)
+{
+ if (sliceStart == RealTime::zeroTime && sliceEnd == RealTime::zeroTime) {
+ // not a real slice
+ return ;
+ }
+
+ // We send at 25fps, it's the easiest to avoid rounding problems
+ RealTime twoFrames(0, 80000000U);
+ RealTime quarterFrame(0, 10000000U);
+ int fps = 25;
+
+#ifdef MTC_DEBUG
+
+ std::cout << "AlsaDriver::insertMTCQFrames(" << sliceStart << ","
+ << sliceEnd << "): first time " << m_mtcFirstTime << std::endl;
+#endif
+
+ RealTime t;
+
+ if (m_mtcFirstTime != 0) { // first time through, reset location
+ m_mtcEncodedTime = sliceStart;
+ t = sliceStart;
+ m_mtcFirstTime = 0;
+ } else {
+ t = m_mtcEncodedTime + quarterFrame;
+ }
+
+ m_mtcSeconds = m_mtcEncodedTime.sec % 60;
+ m_mtcMinutes = (m_mtcEncodedTime.sec / 60) % 60;
+ m_mtcHours = (m_mtcEncodedTime.sec / 3600);
+ m_mtcFrames = (unsigned)m_mtcEncodedTime.nsec / 40000000U; // 25fps
+
+ std::string bytes = " ";
+
+ int type = 0;
+
+ while (m_mtcEncodedTime < sliceEnd) {
+
+ snd_seq_event_t event;
+ snd_seq_ev_clear(&event);
+ snd_seq_ev_set_source(&event, m_syncOutputPort);
+ snd_seq_ev_set_subs(&event);
+
+#ifdef MTC_DEBUG
+
+ std::cout << "Sending MTC quarter frame at " << t << std::endl;
+#endif
+
+ unsigned char c = (type << 4);
+
+ switch (type) {
+ case 0:
+ c += ((unsigned char)m_mtcFrames & 0x0f);
+ break;
+ case 1:
+ c += (((unsigned char)m_mtcFrames & 0xf0) >> 4);
+ break;
+ case 2:
+ c += ((unsigned char)m_mtcSeconds & 0x0f);
+ break;
+ case 3:
+ c += (((unsigned char)m_mtcSeconds & 0xf0) >> 4);
+ break;
+ case 4:
+ c += ((unsigned char)m_mtcMinutes & 0x0f);
+ break;
+ case 5:
+ c += (((unsigned char)m_mtcMinutes & 0xf0) >> 4);
+ break;
+ case 6:
+ c += ((unsigned char)m_mtcHours & 0x0f);
+ break;
+ case 7: // hours high nibble + smpte type
+ c += (m_mtcHours >> 4) & 0x01;
+ c += (1 << 1); // type 1 indicates 25fps
+ break;
+ }
+
+ RealTime scheduleTime = t + m_alsaPlayStartTime - m_playStartPosition;
+ snd_seq_real_time_t atime = { scheduleTime.sec, scheduleTime.nsec };
+
+ event.type = SND_SEQ_EVENT_QFRAME;
+ event.data.control.value = c;
+
+ snd_seq_ev_schedule_real(&event, m_queue, 0, &atime);
+
+ checkAlsaError(snd_seq_event_output(m_midiHandle, &event),
+ "insertMTCQFrames sending qframe event");
+
+ if (++type == 8) {
+ m_mtcFrames += 2;
+ if (m_mtcFrames >= fps) {
+ m_mtcFrames -= fps;
+ if (++m_mtcSeconds == 60) {
+ m_mtcSeconds = 0;
+ if (++m_mtcMinutes == 60) {
+ m_mtcMinutes = 0;
+ ++m_mtcHours;
+ }
+ }
+ }
+ m_mtcEncodedTime = t;
+ type = 0;
+ }
+
+ t = t + quarterFrame;
+ }
+}
+
+bool
+AlsaDriver::testForMTCSysex(const snd_seq_event_t *event)
+{
+ if (getMTCStatus() != TRANSPORT_SLAVE)
+ return false;
+
+ // At this point, and possibly for the foreseeable future, the only
+ // sysex we're interested in is full-frame transport location
+
+#ifdef MTC_DEBUG
+
+ std::cerr << "MTC: testing sysex of length " << event->data.ext.len << ":" << std::endl;
+ for (int i = 0; i < event->data.ext.len; ++i) {
+ std::cerr << (int)*((unsigned char *)event->data.ext.ptr + i) << " ";
+ }
+ std::cerr << endl;
+#endif
+
+ if (event->data.ext.len != 10)
+ return false;
+
+ unsigned char *ptr = (unsigned char *)(event->data.ext.ptr);
+
+ if (*ptr++ != MIDI_SYSTEM_EXCLUSIVE)
+ return false;
+ if (*ptr++ != MIDI_SYSEX_RT)
+ return false;
+ if (*ptr++ > 127)
+ return false;
+
+ // 01 01 for MTC full frame
+
+ if (*ptr++ != 1)
+ return false;
+ if (*ptr++ != 1)
+ return false;
+
+ int htype = *ptr++;
+ int min = *ptr++;
+ int sec = *ptr++;
+ int frame = *ptr++;
+
+ if (*ptr != MIDI_END_OF_EXCLUSIVE)
+ return false;
+
+ int hour = (htype & 0x1f);
+ int type = (htype & 0xe0) >> 5;
+
+ m_mtcFrames = frame;
+ m_mtcSeconds = sec;
+ m_mtcMinutes = min;
+ m_mtcHours = hour;
+ m_mtcSMPTEType = type;
+
+ int fps = 30;
+ if (m_mtcSMPTEType == 0)
+ fps = 24;
+ else if (m_mtcSMPTEType == 1)
+ fps = 25;
+
+ m_mtcEncodedTime.sec = sec + min * 60 + hour * 60 * 60;
+
+ switch (fps) {
+ case 24:
+ m_mtcEncodedTime.nsec = (int)
+ ((125000000UL * (unsigned)m_mtcFrames) / (unsigned) 3);
+ break;
+ case 25:
+ m_mtcEncodedTime.nsec = (int)
+ (40000000UL * (unsigned)m_mtcFrames);
+ break;
+ case 30:
+ default:
+ m_mtcEncodedTime.nsec = (int)
+ ((100000000UL * (unsigned)m_mtcFrames) / (unsigned) 3);
+ break;
+ }
+
+#ifdef MTC_DEBUG
+ std::cerr << "MTC: MTC sysex found (frame type " << type
+ << "), jumping to " << m_mtcEncodedTime << std::endl;
+#endif
+
+ ExternalTransport *transport = getExternalTransportControl();
+ if (transport) {
+ transport->transportJump
+ (ExternalTransport::TransportJumpToTime,
+ m_mtcEncodedTime);
+ }
+
+ return true;
+}
+
+static int last_factor = 0;
+static int bias_factor = 0;
+
+void
+AlsaDriver::calibrateMTC()
+{
+ if (m_mtcFirstTime < 0)
+ return ;
+ else if (m_mtcFirstTime > 0) {
+ --m_mtcFirstTime;
+ m_mtcSigmaC = 0;
+ m_mtcSigmaE = 0;
+ } else {
+ RealTime diff_e = m_mtcEncodedTime - m_mtcLastEncoded;
+ RealTime diff_c = m_mtcReceiveTime - m_mtcLastReceive;
+
+#ifdef MTC_DEBUG
+
+ printf("RG MTC: diffs %d %d %d\n", diff_c.nsec, diff_e.nsec, m_mtcSkew);
+#endif
+
+ m_mtcSigmaE += ((long long int) diff_e.nsec) * m_mtcSkew;
+ m_mtcSigmaC += diff_c.nsec;
+
+
+ int t_bias = (m_mtcSigmaE / m_mtcSigmaC) - 0x10000;
+
+#ifdef MTC_DEBUG
+
+ printf("RG MTC: sigmas %lld %lld %d\n", m_mtcSigmaE, m_mtcSigmaC, t_bias);
+#endif
+
+ bias_factor = t_bias;
+ }
+
+ m_mtcLastReceive = m_mtcReceiveTime;
+ m_mtcLastEncoded = m_mtcEncodedTime;
+
+}
+
+void
+AlsaDriver::tweakSkewForMTC(int factor)
+{
+ if (factor > 50000) {
+ factor = 50000;
+ } else if (factor < -50000) {
+ factor = -50000;
+ } else if (factor == last_factor) {
+ return ;
+ } else {
+ if (m_mtcFirstTime == -1)
+ m_mtcFirstTime = 5;
+ }
+ last_factor = factor;
+
+ snd_seq_queue_tempo_t *q_ptr;
+ snd_seq_queue_tempo_alloca(&q_ptr);
+
+ snd_seq_get_queue_tempo( m_midiHandle, m_queue, q_ptr);
+
+ unsigned int t_skew = snd_seq_queue_tempo_get_skew(q_ptr);
+#ifdef MTC_DEBUG
+
+ std::cerr << "RG MTC: skew: " << t_skew;
+#endif
+
+ t_skew = 0x10000 + factor + bias_factor;
+
+#ifdef MTC_DEBUG
+
+ std::cerr << " changed to " << factor << "+" << bias_factor << endl;
+#endif
+
+ snd_seq_queue_tempo_set_skew(q_ptr, t_skew);
+ snd_seq_set_queue_tempo( m_midiHandle, m_queue, q_ptr);
+
+ m_mtcSkew = t_skew;
+}
+
+bool
+AlsaDriver::testForMMCSysex(const snd_seq_event_t *event)
+{
+ if (getMMCStatus() != TRANSPORT_SLAVE)
+ return false;
+
+ if (event->data.ext.len != 6)
+ return false;
+
+ unsigned char *ptr = (unsigned char *)(event->data.ext.ptr);
+
+ if (*ptr++ != MIDI_SYSTEM_EXCLUSIVE)
+ return false;
+ if (*ptr++ != MIDI_SYSEX_RT)
+ return false;
+ if (*ptr++ > 127)
+ return false;
+ if (*ptr++ != MIDI_SYSEX_RT_COMMAND)
+ return false;
+
+ int instruction = *ptr++;
+
+ if (*ptr != MIDI_END_OF_EXCLUSIVE)
+ return false;
+
+ if (instruction == MIDI_MMC_PLAY ||
+ instruction == MIDI_MMC_DEFERRED_PLAY) {
+ ExternalTransport *transport = getExternalTransportControl();
+ if (transport) {
+ transport->transportChange(ExternalTransport::TransportPlay);
+ }
+ } else if (instruction == MIDI_MMC_STOP) {
+ ExternalTransport *transport = getExternalTransportControl();
+ if (transport) {
+ transport->transportChange(ExternalTransport::TransportStop);
+ }
+ }
+
+ return true;
+}
+
+void
+AlsaDriver::processMidiOut(const MappedComposition &mC,
+ const RealTime &sliceStart,
+ const RealTime &sliceEnd)
+{
+ RealTime outputTime;
+ RealTime outputStopTime;
+ MappedInstrument *instrument;
+ ClientPortPair outputDevice;
+ MidiByte channel;
+ snd_seq_event_t event;
+
+ // special case for unqueued events
+ bool now = (sliceStart == RealTime::zeroTime && sliceEnd == RealTime::zeroTime);
+
+ if (!now) {
+ // This 0.5 sec is arbitrary, but it must be larger than the
+ // sequencer's read-ahead
+ RealTime diff = RealTime::fromSeconds(0.5);
+ RealTime cutoff = sliceStart - diff;
+ cropRecentNoteOffs(cutoff - m_playStartPosition + m_alsaPlayStartTime);
+ }
+
+ // These won't change in this slice
+ //
+ snd_seq_ev_clear(&event);
+
+ if ((mC.begin() != mC.end()) && getSequencerDataBlock()) {
+ getSequencerDataBlock()->setVisual(*mC.begin());
+ }
+
+#ifdef DEBUG_PROCESS_MIDI_OUT
+ std::cerr << "AlsaDriver::processMidiOut(" << sliceStart << "," << sliceEnd
+ << "), " << mC.size() << " events, now is " << now << std::endl;
+#endif
+
+ // NB the MappedComposition is implicitly ordered by time (std::multiset)
+
+ for (MappedComposition::const_iterator i = mC.begin(); i != mC.end(); ++i) {
+ if ((*i)->getType() >= MappedEvent::Audio)
+ continue;
+
+ bool isControllerOut = ((*i)->getRecordedDevice() ==
+ Device::CONTROL_DEVICE);
+
+ bool isSoftSynth = (!isControllerOut &&
+ ((*i)->getInstrument() >= SoftSynthInstrumentBase));
+
+ outputTime = (*i)->getEventTime() - m_playStartPosition +
+ m_alsaPlayStartTime;
+
+ if (now && !m_playing && m_queueRunning) {
+ // stop queue to ensure exact timing and make sure the
+ // event gets through right now
+#ifdef DEBUG_PROCESS_MIDI_OUT
+ std::cerr << "processMidiOut: stopping queue for now-event" << std::endl;
+#endif
+
+ checkAlsaError(snd_seq_stop_queue(m_midiHandle, m_queue, NULL), "processMidiOut(): stop queue");
+ checkAlsaError(snd_seq_drain_output(m_midiHandle), "processMidiOut(): draining");
+ }
+
+ RealTime alsaTimeNow = getAlsaTime();
+
+ if (now) {
+ if (!m_playing) {
+ outputTime = alsaTimeNow;
+ } else if (outputTime < alsaTimeNow) {
+ outputTime = alsaTimeNow + RealTime(0, 10000000);
+ }
+ }
+
+#ifdef DEBUG_PROCESS_MIDI_OUT
+ std::cerr << "processMidiOut[" << now << "]: event is at " << outputTime << " (" << outputTime - alsaTimeNow << " ahead of queue time), type " << int((*i)->getType()) << ", duration " << (*i)->getDuration() << std::endl;
+#endif
+
+ if (!m_queueRunning && outputTime < alsaTimeNow) {
+ RealTime adjust = alsaTimeNow - outputTime;
+ if ((*i)->getDuration() > RealTime::zeroTime) {
+ if ((*i)->getDuration() <= adjust) {
+#ifdef DEBUG_PROCESS_MIDI_OUT
+ std::cerr << "processMidiOut[" << now << "]: too late for this event, abandoning it" << std::endl;
+#endif
+
+ continue;
+ } else {
+#ifdef DEBUG_PROCESS_MIDI_OUT
+ std::cerr << "processMidiOut[" << now << "]: pushing event forward and reducing duration by " << adjust << std::endl;
+#endif
+
+ (*i)->setDuration((*i)->getDuration() - adjust);
+ }
+ } else {
+#ifdef DEBUG_PROCESS_MIDI_OUT
+ std::cerr << "processMidiOut[" << now << "]: pushing zero-duration event forward by " << adjust << std::endl;
+#endif
+
+ }
+ outputTime = alsaTimeNow;
+ }
+
+ processNotesOff(outputTime, now);
+
+#ifdef HAVE_LIBJACK
+
+ if (m_jackDriver) {
+ size_t frameCount = m_jackDriver->getFramesProcessed();
+ size_t elapsed = frameCount - _debug_jack_frame_count;
+ RealTime rt = RealTime::frame2RealTime(elapsed, m_jackDriver->getSampleRate());
+ rt = rt - getAlsaTime();
+#ifdef DEBUG_PROCESS_MIDI_OUT
+
+ std::cerr << "processMidiOut[" << now << "]: JACK time is " << rt << " ahead of ALSA time" << std::endl;
+#endif
+
+ }
+#endif
+
+ // Second and nanoseconds for ALSA
+ //
+ snd_seq_real_time_t time = { outputTime.sec, outputTime.nsec };
+
+ if (!isSoftSynth) {
+
+#ifdef DEBUG_PROCESS_MIDI_OUT
+ std::cout << "processMidiOut[" << now << "]: instrument " << (*i)->getInstrument() << std::endl;
+ std::cout << "pitch: " << (int)(*i)->getPitch() << ", velocity " << (int)(*i)->getVelocity() << ", duration " << (*i)->getDuration() << std::endl;
+#endif
+
+ snd_seq_ev_set_subs(&event);
+
+ // Set source according to port for device
+ //
+ int src;
+
+ if (isControllerOut) {
+ src = m_controllerPort;
+ } else {
+ src = getOutputPortForMappedInstrument((*i)->getInstrument());
+ }
+
+ if (src < 0) continue;
+ snd_seq_ev_set_source(&event, src);
+
+ snd_seq_ev_schedule_real(&event, m_queue, 0, &time);
+
+ } else {
+ event.time.time = time;
+ }
+
+ instrument = getMappedInstrument((*i)->getInstrument());
+
+ // set the stop time for Note Off
+ //
+ outputStopTime = outputTime + (*i)->getDuration()
+ - RealTime(0, 1); // notch it back 1nsec just to ensure
+ // correct ordering against any other
+ // note-ons at the same nominal time
+ bool needNoteOff = false;
+
+ if (isControllerOut) {
+ channel = (*i)->getRecordedChannel();
+#ifdef DEBUG_ALSA
+
+ std::cerr << "processMidiOut() - Event of type " << (int)((*i)->getType()) << " (data1 " << (int)(*i)->getData1() << ", data2 " << (int)(*i)->getData2() << ") for external controller channel " << (int)channel << std::endl;
+#endif
+
+ } else if (instrument != 0) {
+ channel = instrument->getChannel();
+ } else {
+#ifdef DEBUG_ALSA
+ std::cerr << "processMidiOut() - No instrument for event of type "
+ << (int)(*i)->getType() << " at " << (*i)->getEventTime()
+ << std::endl;
+#endif
+
+ channel = 0;
+ }
+
+ switch ((*i)->getType()) {
+
+ case MappedEvent::MidiNoteOneShot:
+ {
+ snd_seq_ev_set_noteon(&event,
+ channel,
+ (*i)->getPitch(),
+ (*i)->getVelocity());
+ needNoteOff = true;
+
+ if (!isSoftSynth && getSequencerDataBlock()) {
+ LevelInfo info;
+ info.level = (*i)->getVelocity();
+ info.levelRight = 0;
+ getSequencerDataBlock()->setInstrumentLevel
+ ((*i)->getInstrument(), info);
+ }
+
+ weedRecentNoteOffs((*i)->getPitch(), channel, (*i)->getInstrument());
+ }
+ break;
+
+ case MappedEvent::MidiNote:
+ // We always use plain NOTE ON here, not ALSA
+ // time+duration notes, because we have our own NOTE
+ // OFF stack (which will be augmented at the bottom of
+ // this function) and we want to ensure it gets used
+ // for the purposes of e.g. soft synths
+ //
+ if ((*i)->getVelocity() > 0) {
+ snd_seq_ev_set_noteon(&event,
+ channel,
+ (*i)->getPitch(),
+ (*i)->getVelocity());
+
+ if (!isSoftSynth && getSequencerDataBlock()) {
+ LevelInfo info;
+ info.level = (*i)->getVelocity();
+ info.levelRight = 0;
+ getSequencerDataBlock()->setInstrumentLevel
+ ((*i)->getInstrument(), info);
+ }
+
+ weedRecentNoteOffs((*i)->getPitch(), channel, (*i)->getInstrument());
+ } else {
+ snd_seq_ev_set_noteoff(&event,
+ channel,
+ (*i)->getPitch(),
+ (*i)->getVelocity());
+ }
+
+ break;
+
+ case MappedEvent::MidiProgramChange:
+ snd_seq_ev_set_pgmchange(&event,
+ channel,
+ (*i)->getData1());
+ break;
+
+ case MappedEvent::MidiKeyPressure:
+ snd_seq_ev_set_keypress(&event,
+ channel,
+ (*i)->getData1(),
+ (*i)->getData2());
+ break;
+
+ case MappedEvent::MidiChannelPressure:
+ snd_seq_ev_set_chanpress(&event,
+ channel,
+ (*i)->getData1());
+ break;
+
+ case MappedEvent::MidiPitchBend: {
+ int d1 = (int)((*i)->getData1());
+ int d2 = (int)((*i)->getData2());
+ int value = ((d1 << 7) | d2) - 8192;
+
+ // keep within -8192 to +8192
+ //
+ // if (value & 0x4000)
+ // value -= 0x8000;
+
+ snd_seq_ev_set_pitchbend(&event,
+ channel,
+ value);
+ }
+ break;
+
+ case MappedEvent::MidiSystemMessage: {
+ switch ((*i)->getData1()) {
+ case MIDI_SYSTEM_EXCLUSIVE: {
+ char out[2];
+ sprintf(out, "%c", MIDI_SYSTEM_EXCLUSIVE);
+ std::string data = out;
+
+ data += DataBlockRepository::getDataBlockForEvent((*i));
+
+ sprintf(out, "%c", MIDI_END_OF_EXCLUSIVE);
+ data += out;
+
+ snd_seq_ev_set_sysex(&event,
+ data.length(),
+ (char*)(data.c_str()));
+ }
+ break;
+
+ case MIDI_TIMING_CLOCK: {
+ RealTime rt =
+ RealTime(time.tv_sec, time.tv_nsec);
+
+ /*
+ std::cerr << "AlsaDriver::processMidiOut - "
+ << "send clock @ " << rt << std::endl;
+ */
+
+ sendSystemQueued(SND_SEQ_EVENT_CLOCK, "", rt);
+
+ continue;
+
+ }
+ break;
+
+ default:
+ std::cerr << "AlsaDriver::processMidiOut - "
+ << "unrecognised system message"
+ << std::endl;
+ break;
+ }
+ }
+ break;
+
+ case MappedEvent::MidiController:
+ snd_seq_ev_set_controller(&event,
+ channel,
+ (*i)->getData1(),
+ (*i)->getData2());
+ break;
+
+ case MappedEvent::Audio:
+ case MappedEvent::AudioCancel:
+ case MappedEvent::AudioLevel:
+ case MappedEvent::AudioStopped:
+ case MappedEvent::SystemUpdateInstruments:
+ case MappedEvent::SystemJackTransport: //???
+ case MappedEvent::SystemMMCTransport:
+ case MappedEvent::SystemMIDIClock:
+ case MappedEvent::SystemMIDISyncAuto:
+ break;
+
+ default:
+ case MappedEvent::InvalidMappedEvent:
+#ifdef DEBUG_ALSA
+
+ std::cerr << "AlsaDriver::processMidiOut - "
+ << "skipping unrecognised or invalid MappedEvent type"
+ << std::endl;
+#endif
+
+ continue;
+ }
+
+ if (isSoftSynth) {
+
+ processSoftSynthEventOut((*i)->getInstrument(), &event, now);
+
+ } else {
+ checkAlsaError(snd_seq_event_output(m_midiHandle, &event),
+ "processMidiOut(): output queued");
+
+ if (now) {
+ if (m_queueRunning && !m_playing) {
+ // restart queue
+#ifdef DEBUG_PROCESS_MIDI_OUT
+ std::cerr << "processMidiOut: restarting queue after now-event" << std::endl;
+#endif
+
+ checkAlsaError(snd_seq_continue_queue(m_midiHandle, m_queue, NULL), "processMidiOut(): continue queue");
+ }
+ checkAlsaError(snd_seq_drain_output(m_midiHandle), "processMidiOut(): draining");
+ }
+ }
+
+ // Add note to note off stack
+ //
+ if (needNoteOff) {
+ NoteOffEvent *noteOffEvent =
+ new NoteOffEvent(outputStopTime, // already calculated
+ (*i)->getPitch(),
+ channel,
+ (*i)->getInstrument());
+
+#ifdef DEBUG_ALSA
+
+ std::cerr << "Adding NOTE OFF at " << outputStopTime
+ << std::endl;
+#endif
+
+ m_noteOffQueue.insert(noteOffEvent);
+ }
+ }
+
+ processNotesOff(sliceEnd - m_playStartPosition + m_alsaPlayStartTime, now);
+
+ if (getMTCStatus() == TRANSPORT_MASTER) {
+ insertMTCQFrames(sliceStart, sliceEnd);
+ }
+
+ if (m_queueRunning) {
+
+ if (now && !m_playing) {
+ // just to be sure
+#ifdef DEBUG_PROCESS_MIDI_OUT
+ std::cerr << "processMidiOut: restarting queue after all now-events" << std::endl;
+#endif
+
+ checkAlsaError(snd_seq_continue_queue(m_midiHandle, m_queue, NULL), "processMidiOut(): continue queue");
+ }
+
+#ifdef DEBUG_PROCESS_MIDI_OUT
+ // std::cerr << "processMidiOut: m_queueRunning " << m_queueRunning
+ // << ", now " << now << std::endl;
+#endif
+ checkAlsaError(snd_seq_drain_output(m_midiHandle), "processMidiOut(): draining");
+ }
+}
+
+void
+AlsaDriver::processSoftSynthEventOut(InstrumentId id, const snd_seq_event_t *ev, bool now)
+{
+#ifdef DEBUG_PROCESS_SOFT_SYNTH_OUT
+ std::cerr << "AlsaDriver::processSoftSynthEventOut: instrument " << id << ", now " << now << std::endl;
+#endif
+
+#ifdef HAVE_LIBJACK
+
+ if (!m_jackDriver)
+ return ;
+ RunnablePluginInstance *synthPlugin = m_jackDriver->getSynthPlugin(id);
+
+ if (synthPlugin) {
+
+ RealTime t(ev->time.time.tv_sec, ev->time.time.tv_nsec);
+
+ if (now)
+ t = RealTime::zeroTime;
+ else
+ t = t + m_playStartPosition - m_alsaPlayStartTime;
+
+#ifdef DEBUG_PROCESS_SOFT_SYNTH_OUT
+
+ std::cerr << "AlsaDriver::processSoftSynthEventOut: event time " << t << std::endl;
+#endif
+
+ synthPlugin->sendEvent(t, ev);
+
+ if (now) {
+#ifdef DEBUG_PROCESS_SOFT_SYNTH_OUT
+ std::cerr << "AlsaDriver::processSoftSynthEventOut: setting haveAsyncAudioEvent" << std::endl;
+#endif
+
+ m_jackDriver->setHaveAsyncAudioEvent();
+ }
+ }
+#endif
+}
+
+void
+AlsaDriver::startClocks()
+{
+ int result;
+
+#ifdef DEBUG_ALSA
+
+ std::cerr << "AlsaDriver::startClocks" << std::endl;
+#endif
+
+ if (m_needJackStart) {
+#ifdef DEBUG_ALSA
+ std::cerr << "AlsaDriver::startClocks: Need JACK start (m_playing = " << m_playing << ")" << std::endl;
+#endif
+
+ }
+
+#ifdef HAVE_LIBJACK
+
+ // New JACK transport scheme: The initialisePlayback,
+ // resetPlayback and stopPlayback methods set m_needJackStart, and
+ // then this method checks it and calls the appropriate JACK
+ // transport start or relocate method, which calls back on
+ // startClocksApproved when ready. (Previously this method always
+ // called the JACK transport start method, so we couldn't handle
+ // moving the pointer when not playing, and we had to stop the
+ // transport explicitly from resetPlayback when repositioning
+ // during playback.)
+
+ if (m_jackDriver) {
+
+ // Don't need any locks on this, except for those that the
+ // driver methods take and hold for themselves
+
+ if (m_needJackStart != NeedNoJackStart) {
+ if (m_needJackStart == NeedJackStart ||
+ m_playing) {
+#ifdef DEBUG_ALSA
+ std::cerr << "AlsaDriver::startClocks: playing, prebuffer audio" << std::endl;
+#endif
+
+ m_jackDriver->prebufferAudio();
+ } else {
+#ifdef DEBUG_ALSA
+ std::cerr << "AlsaDriver::startClocks: prepare audio only" << std::endl;
+#endif
+
+ m_jackDriver->prepareAudio();
+ }
+ bool rv;
+ if (m_needJackStart == NeedJackReposition) {
+ rv = m_jackDriver->relocateTransport();
+ } else {
+ rv = m_jackDriver->startTransport();
+ if (!rv) {
+#ifdef DEBUG_ALSA
+ std::cerr << "AlsaDriver::startClocks: Waiting for startClocksApproved" << std::endl;
+#endif
+ // need to wait for transport sync
+ _debug_jack_frame_count = m_jackDriver->getFramesProcessed();
+ return ;
+ }
+ }
+ }
+ }
+#endif
+
+ // Restart the timer
+ if ((result = snd_seq_continue_queue(m_midiHandle, m_queue, NULL)) < 0) {
+ std::cerr << "AlsaDriver::startClocks - couldn't start queue - "
+ << snd_strerror(result)
+ << std::endl;
+ reportFailure(MappedEvent::FailureALSACallFailed);
+ }
+
+#ifdef DEBUG_ALSA
+ std::cerr << "AlsaDriver::startClocks: started clocks" << std::endl;
+#endif
+
+ m_queueRunning = true;
+
+#ifdef HAVE_LIBJACK
+
+ if (m_jackDriver) {
+ _debug_jack_frame_count = m_jackDriver->getFramesProcessed();
+ }
+#endif
+
+ // process pending MIDI events
+ checkAlsaError(snd_seq_drain_output(m_midiHandle), "startClocks(): draining");
+}
+
+void
+AlsaDriver::startClocksApproved()
+{
+#ifdef DEBUG_ALSA
+ std::cerr << "AlsaDriver::startClocks: startClocksApproved" << std::endl;
+#endif
+
+ //!!!
+ m_needJackStart = NeedNoJackStart;
+ startClocks();
+ return ;
+
+ int result;
+
+ // Restart the timer
+ if ((result = snd_seq_continue_queue(m_midiHandle, m_queue, NULL)) < 0) {
+ std::cerr << "AlsaDriver::startClocks - couldn't start queue - "
+ << snd_strerror(result)
+ << std::endl;
+ reportFailure(MappedEvent::FailureALSACallFailed);
+ }
+
+ m_queueRunning = true;
+
+ // process pending MIDI events
+ checkAlsaError(snd_seq_drain_output(m_midiHandle), "startClocksApproved(): draining");
+}
+
+void
+AlsaDriver::stopClocks()
+{
+#ifdef DEBUG_ALSA
+ std::cerr << "AlsaDriver::stopClocks" << std::endl;
+#endif
+
+ if (checkAlsaError(snd_seq_stop_queue(m_midiHandle, m_queue, NULL), "stopClocks(): stopping queue") < 0) {
+ reportFailure(MappedEvent::FailureALSACallFailed);
+ }
+ checkAlsaError(snd_seq_drain_output(m_midiHandle), "stopClocks(): draining output to stop queue");
+
+ m_queueRunning = false;
+
+ // We used to call m_jackDriver->stop() from here, but we no
+ // longer do -- it's now called from stopPlayback() so as to
+ // handle repositioning during playback (when stopClocks is
+ // necessary but stopPlayback and m_jackDriver->stop() are not).
+
+ snd_seq_event_t event;
+ snd_seq_ev_clear(&event);
+ snd_seq_real_time_t z = { 0, 0 };
+ snd_seq_ev_set_queue_pos_real(&event, m_queue, &z);
+ snd_seq_ev_set_direct(&event);
+ checkAlsaError(snd_seq_control_queue(m_midiHandle, m_queue, SND_SEQ_EVENT_SETPOS_TIME,
+ 0, &event), "stopClocks(): setting zpos to queue");
+ // process that
+ checkAlsaError(snd_seq_drain_output(m_midiHandle), "stopClocks(): draining output to zpos queue");
+
+#ifdef DEBUG_ALSA
+
+ std::cerr << "AlsaDriver::stopClocks: ALSA time now is " << getAlsaTime() << std::endl;
+#endif
+
+ m_alsaPlayStartTime = RealTime::zeroTime;
+}
+
+
+void
+AlsaDriver::processEventsOut(const MappedComposition &mC)
+{
+ processEventsOut(mC, RealTime::zeroTime, RealTime::zeroTime);
+}
+
+void
+AlsaDriver::processEventsOut(const MappedComposition &mC,
+ const RealTime &sliceStart,
+ const RealTime &sliceEnd)
+{
+ // special case for unqueued events
+ bool now = (sliceStart == RealTime::zeroTime && sliceEnd == RealTime::zeroTime);
+
+ if (m_startPlayback) {
+ m_startPlayback = false;
+ // This only records whether we're playing in principle,
+ // not whether the clocks are actually ticking. Contrariwise,
+ // areClocksRunning tells us whether the clocks are ticking
+ // but not whether we're actually playing (the clocks go even
+ // when we're not). Check both if you want to know whether
+ // we're really rolling.
+ m_playing = true;
+
+ if (getMTCStatus() == TRANSPORT_SLAVE) {
+ tweakSkewForMTC(0);
+ }
+ }
+
+ AudioFile *audioFile = 0;
+ bool haveNewAudio = false;
+
+ // insert audio events if we find them
+ for (MappedComposition::const_iterator i = mC.begin(); i != mC.end(); ++i) {
+#ifdef HAVE_LIBJACK
+
+ // Play an audio file
+ //
+ if ((*i)->getType() == MappedEvent::Audio) {
+ if (!m_jackDriver)
+ continue;
+
+ // This is used for handling asynchronous
+ // (i.e. unexpected) audio events only
+
+ if ((*i)->getEventTime() > RealTime( -120, 0)) {
+ // Not an asynchronous event
+ continue;
+ }
+
+ // Check for existence of file - if the sequencer has died
+ // and been restarted then we're not always loaded up with
+ // the audio file references we should have. In the future
+ // we could make this just get the gui to reload our files
+ // when (or before) this fails.
+ //
+ audioFile = getAudioFile((*i)->getAudioID());
+
+ if (audioFile) {
+ MappedAudioFader *fader =
+ dynamic_cast<MappedAudioFader*>
+ (getMappedStudio()->getAudioFader((*i)->getInstrument()));
+
+ if (!fader) {
+ std::cerr << "WARNING: AlsaDriver::processEventsOut: no fader for audio instrument " << (*i)->getInstrument() << std::endl;
+ continue;
+ }
+
+ unsigned int channels = fader->getPropertyList(
+ MappedAudioFader::Channels)[0].toInt();
+
+ RealTime bufferLength = getAudioReadBufferLength();
+ int bufferFrames = RealTime::realTime2Frame
+ (bufferLength, m_jackDriver->getSampleRate());
+ if (bufferFrames % m_jackDriver->getBufferSize()) {
+ bufferFrames /= m_jackDriver->getBufferSize();
+ bufferFrames ++;
+ bufferFrames *= m_jackDriver->getBufferSize();
+ }
+
+ //#define DEBUG_PLAYING_AUDIO
+#ifdef DEBUG_PLAYING_AUDIO
+ std::cout << "Creating playable audio file: id " << audioFile->getId() << ", event time " << (*i)->getEventTime() << ", time now " << getAlsaTime() << ", start marker " << (*i)->getAudioStartMarker() << ", duration " << (*i)->getDuration() << ", instrument " << (*i)->getInstrument() << " channels " << channels << std::endl;
+
+ std::cout << "Read buffer length is " << bufferLength << " (" << bufferFrames << " frames)" << std::endl;
+#endif
+
+ PlayableAudioFile *paf = 0;
+
+ try {
+ paf = new PlayableAudioFile((*i)->getInstrument(),
+ audioFile,
+ getSequencerTime() +
+ (RealTime(1, 0) / 4),
+ (*i)->getAudioStartMarker(),
+ (*i)->getDuration(),
+ bufferFrames,
+ getSmallFileSize() * 1024,
+ channels,
+ m_jackDriver->getSampleRate());
+ } catch (...) {
+ continue;
+ }
+
+ if ((*i)->isAutoFading()) {
+ paf->setAutoFade(true);
+ paf->setFadeInTime((*i)->getFadeInTime());
+ paf->setFadeOutTime((*i)->getFadeInTime());
+
+ //#define DEBUG_AUTOFADING
+#ifdef DEBUG_AUTOFADING
+
+ std::cout << "PlayableAudioFile is AUTOFADING - "
+ << "in = " << (*i)->getFadeInTime()
+ << ", out = " << (*i)->getFadeOutTime()
+ << std::endl;
+#endif
+
+ }
+#ifdef DEBUG_AUTOFADING
+ else {
+ std::cout << "PlayableAudioFile has no AUTOFADE"
+ << std::endl;
+ }
+#endif
+
+
+ // segment runtime id
+ paf->setRuntimeSegmentId((*i)->getRuntimeSegmentId());
+
+ m_audioQueue->addUnscheduled(paf);
+
+ haveNewAudio = true;
+ } else {
+#ifdef DEBUG_ALSA
+ std::cerr << "AlsaDriver::processEventsOut - "
+ << "can't find audio file reference"
+ << std::endl;
+
+ std::cerr << "AlsaDriver::processEventsOut - "
+ << "try reloading the current Rosegarden file"
+ << std::endl;
+#else
+
+ ;
+#endif
+
+ }
+ }
+
+ // Cancel a playing audio file preview (this is predicated on
+ // runtime segment ID and optionally start time)
+ //
+ if ((*i)->getType() == MappedEvent::AudioCancel) {
+ cancelAudioFile(*i);
+ }
+
+#endif // HAVE_LIBJACK
+
+ if ((*i)->getType() == MappedEvent::SystemMIDIClock) {
+ switch ((int)(*i)->getData1()) {
+ case 0:
+ m_midiClockEnabled = false;
+#ifdef DEBUG_ALSA
+
+ std::cerr << "AlsaDriver::processEventsOut - "
+ << "Rosegarden MIDI CLOCK, START and STOP DISABLED"
+ << std::endl;
+#endif
+
+ setMIDISyncStatus(TRANSPORT_OFF);
+ break;
+
+ case 1:
+ m_midiClockEnabled = true;
+#ifdef DEBUG_ALSA
+
+ std::cerr << "AlsaDriver::processEventsOut - "
+ << "Rosegarden send MIDI CLOCK, START and STOP ENABLED"
+ << std::endl;
+#endif
+
+ setMIDISyncStatus(TRANSPORT_MASTER);
+ break;
+
+ case 2:
+ m_midiClockEnabled = false;
+#ifdef DEBUG_ALSA
+
+ std::cerr << "AlsaDriver::processEventsOut - "
+ << "Rosegarden accept START and STOP ENABLED"
+ << std::endl;
+#endif
+
+ setMIDISyncStatus(TRANSPORT_SLAVE);
+ break;
+ }
+ }
+
+ if ((*i)->getType() == MappedEvent::SystemMIDISyncAuto) {
+ if ((*i)->getData1()) {
+ m_midiSyncAutoConnect = true;
+#ifdef DEBUG_ALSA
+
+ std::cerr << "AlsaDriver::processEventsOut - "
+ << "Rosegarden MIDI SYNC AUTO ENABLED"
+ << std::endl;
+#endif
+
+ for (DevicePortMap::iterator dpmi = m_devicePortMap.begin();
+ dpmi != m_devicePortMap.end(); ++dpmi) {
+ snd_seq_connect_to(m_midiHandle,
+ m_syncOutputPort,
+ dpmi->second.first,
+ dpmi->second.second);
+ }
+ } else {
+ m_midiSyncAutoConnect = false;
+#ifdef DEBUG_ALSA
+
+ std::cerr << "AlsaDriver::processEventsOut - "
+ << "Rosegarden MIDI SYNC AUTO DISABLED"
+ << std::endl;
+#endif
+
+ }
+ }
+
+#ifdef HAVE_LIBJACK
+
+ // Set the JACK transport
+ if ((*i)->getType() == MappedEvent::SystemJackTransport) {
+ bool enabled = false;
+ bool master = false;
+
+ switch ((int)(*i)->getData1()) {
+ case 2:
+ master = true;
+ enabled = true;
+#ifdef DEBUG_ALSA
+
+ std::cerr << "AlsaDriver::processEventsOut - "
+ << "Rosegarden to follow JACK transport and request JACK timebase master role (not yet implemented)"
+ << std::endl;
+#endif
+
+ break;
+
+ case 1:
+ enabled = true;
+#ifdef DEBUG_ALSA
+
+ std::cerr << "AlsaDriver::processEventsOut - "
+ << "Rosegarden to follow JACK transport"
+ << std::endl;
+#endif
+
+ break;
+
+ case 0:
+ default:
+#ifdef DEBUG_ALSA
+
+ std::cerr << "AlsaDriver::processEventsOut - "
+ << "Rosegarden to ignore JACK transport"
+ << std::endl;
+#endif
+
+ break;
+ }
+
+ if (m_jackDriver) {
+ m_jackDriver->setTransportEnabled(enabled);
+ m_jackDriver->setTransportMaster(master);
+ }
+ }
+#endif // HAVE_LIBJACK
+
+
+ if ((*i)->getType() == MappedEvent::SystemMMCTransport) {
+ switch ((int)(*i)->getData1()) {
+ case 1:
+#ifdef DEBUG_ALSA
+
+ std::cerr << "AlsaDriver::processEventsOut - "
+ << "Rosegarden is MMC MASTER"
+ << std::endl;
+#endif
+
+ setMMCStatus(TRANSPORT_MASTER);
+ break;
+
+ case 2:
+#ifdef DEBUG_ALSA
+
+ std::cerr << "AlsaDriver::processEventsOut - "
+ << "Rosegarden is MMC SLAVE"
+ << std::endl;
+#endif
+
+ setMMCStatus(TRANSPORT_SLAVE);
+ break;
+
+ case 0:
+ default:
+#ifdef DEBUG_ALSA
+
+ std::cerr << "AlsaDriver::processEventsOut - "
+ << "Rosegarden MMC Transport DISABLED"
+ << std::endl;
+#endif
+
+ setMMCStatus(TRANSPORT_OFF);
+ break;
+ }
+ }
+
+ if ((*i)->getType() == MappedEvent::SystemMTCTransport) {
+ switch ((int)(*i)->getData1()) {
+ case 1:
+#ifdef DEBUG_ALSA
+
+ std::cerr << "AlsaDriver::processEventsOut - "
+ << "Rosegarden is MTC MASTER"
+ << std::endl;
+#endif
+
+ setMTCStatus(TRANSPORT_MASTER);
+ tweakSkewForMTC(0);
+ m_mtcFirstTime = -1;
+ break;
+
+ case 2:
+#ifdef DEBUG_ALSA
+
+ std::cerr << "AlsaDriver::processEventsOut - "
+ << "Rosegarden is MTC SLAVE"
+ << std::endl;
+#endif
+
+ setMTCStatus(TRANSPORT_SLAVE);
+ m_mtcFirstTime = -1;
+ break;
+
+ case 0:
+ default:
+#ifdef DEBUG_ALSA
+
+ std::cerr << "AlsaDriver::processEventsOut - "
+ << "Rosegarden MTC Transport DISABLED"
+ << std::endl;
+#endif
+
+ setMTCStatus(TRANSPORT_OFF);
+ m_mtcFirstTime = -1;
+ break;
+ }
+ }
+
+ if ((*i)->getType() == MappedEvent::SystemRecordDevice) {
+ DeviceId recordDevice =
+ (DeviceId)((*i)->getData1());
+ bool conn = (bool) ((*i)->getData2());
+
+ // Unset connections
+ //
+ // unsetRecordDevices();
+
+ // Special case to set for all record ports
+ //
+ if (recordDevice == Device::ALL_DEVICES) {
+ /* set all record devices */
+#ifdef DEBUG_ALSA
+ std::cerr << "AlsaDriver::processEventsOut - "
+ << "set all record devices - not implemented"
+ << std::endl;
+#endif
+
+ /*
+ MappedDeviceList::iterator it = m_devices.begin();
+ std::vector<int> ports;
+ std::vector<int>::iterator pIt;
+
+ for (; it != m_devices.end(); ++it)
+ {
+ std::cout << "DEVICE = " << (*it)->getName() << " - DIR = "
+ << (*it)->getDirection() << endl;
+ // ignore ports we can't connect to
+ if ((*it)->getDirection() == MidiDevice::WriteOnly) continue;
+
+ std::cout << "PORTS = " << ports.size() << endl;
+ ports = (*it)->getPorts();
+ for (pIt = ports.begin(); pIt != ports.end(); ++pIt)
+ {
+ setRecordDevice((*it)->getClient(), *pIt);
+ }
+ }
+ */
+ } else {
+ // Otherwise just for the one device and port
+ //
+ setRecordDevice(recordDevice, conn);
+ }
+ }
+
+ if ((*i)->getType() == MappedEvent::SystemAudioPortCounts) {
+ // never actually used, I think?
+ }
+
+ if ((*i)->getType() == MappedEvent::SystemAudioPorts) {
+#ifdef HAVE_LIBJACK
+ if (m_jackDriver) {
+ int data = (*i)->getData1();
+ m_jackDriver->setAudioPorts(data & MappedEvent::FaderOuts,
+ data & MappedEvent::SubmasterOuts);
+ }
+#else
+#ifdef DEBUG_ALSA
+ std::cerr << "AlsaDriver::processEventsOut - "
+ << "MappedEvent::SystemAudioPorts - no audio subsystem"
+ << std::endl;
+#endif
+#endif
+
+ }
+
+ if ((*i)->getType() == MappedEvent::SystemAudioFileFormat) {
+#ifdef HAVE_LIBJACK
+ int format = (*i)->getData1();
+ switch (format) {
+ case 0:
+ m_audioRecFileFormat = RIFFAudioFile::PCM;
+ break;
+ case 1:
+ m_audioRecFileFormat = RIFFAudioFile::FLOAT;
+ break;
+ default:
+#ifdef DEBUG_ALSA
+
+ std::cerr << "AlsaDriver::processEventsOut - "
+ << "MappedEvent::SystemAudioFileFormat - unexpected format number " << format
+ << std::endl;
+#endif
+
+ break;
+ }
+#else
+#ifdef DEBUG_ALSA
+ std::cerr << "AlsaDriver::processEventsOut - "
+ << "MappedEvent::SystemAudioFileFormat - no audio subsystem"
+ << std::endl;
+#endif
+#endif
+
+ }
+
+ if ((*i)->getType() == MappedEvent::Panic) {
+ for (MappedDeviceList::iterator i = m_devices.begin();
+ i != m_devices.end(); ++i) {
+ if ((*i)->getDirection() == MidiDevice::Play) {
+ sendDeviceController((*i)->getId(),
+ MIDI_CONTROLLER_SUSTAIN, 0);
+ sendDeviceController((*i)->getId(),
+ MIDI_CONTROLLER_ALL_NOTES_OFF, 0);
+ sendDeviceController((*i)->getId(),
+ MIDI_CONTROLLER_RESET, 0);
+ }
+ }
+ }
+ }
+
+ // Process Midi and Audio
+ //
+ processMidiOut(mC, sliceStart, sliceEnd);
+
+#ifdef HAVE_LIBJACK
+
+ if (m_jackDriver) {
+ if (haveNewAudio) {
+ if (now) {
+ m_jackDriver->prebufferAudio();
+ m_jackDriver->setHaveAsyncAudioEvent();
+ }
+ if (m_queueRunning) {
+ m_jackDriver->kickAudio();
+ }
+ }
+ }
+#endif
+}
+
+bool
+AlsaDriver::record(RecordStatus recordStatus,
+ const std::vector<InstrumentId> *armedInstruments,
+ const std::vector<QString> *audioFileNames)
+{
+ m_recordingInstruments.clear();
+
+ if (recordStatus == RECORD_ON) {
+ // start recording
+ m_recordStatus = RECORD_ON;
+ m_alsaRecordStartTime = RealTime::zeroTime;
+
+ unsigned int audioCount = 0;
+
+ if (armedInstruments) {
+
+ for (unsigned int i = 0; i < armedInstruments->size(); ++i) {
+
+ InstrumentId id = (*armedInstruments)[i];
+
+ m_recordingInstruments.insert(id);
+ if (!audioFileNames || (audioCount >= audioFileNames->size())) {
+ continue;
+ }
+
+ QString fileName = (*audioFileNames)[audioCount];
+
+ if (id >= AudioInstrumentBase &&
+ id < MidiInstrumentBase) {
+
+ bool good = false;
+
+#ifdef DEBUG_ALSA
+
+ std::cerr << "AlsaDriver::record: Requesting new record file \"" << fileName << "\" for instrument " << id << std::endl;
+#endif
+
+#ifdef HAVE_LIBJACK
+
+ if (m_jackDriver &&
+ m_jackDriver->openRecordFile(id, fileName.data())) {
+ good = true;
+ }
+#endif
+
+ if (!good) {
+ m_recordStatus = RECORD_OFF;
+ std::cerr << "AlsaDriver::record: No JACK driver, or JACK driver failed to prepare for recording audio" << std::endl;
+ return false;
+ }
+
+ ++audioCount;
+ }
+ }
+ }
+ } else
+ if (recordStatus == RECORD_OFF) {
+ m_recordStatus = RECORD_OFF;
+ }
+#ifdef DEBUG_ALSA
+ else {
+ std::cerr << "AlsaDriver::record - unsupported recording mode"
+ << std::endl;
+ }
+#endif
+
+ return true;
+}
+
+ClientPortPair
+AlsaDriver::getFirstDestination(bool duplex)
+{
+ ClientPortPair destPair( -1, -1);
+ AlsaPortList::iterator it;
+
+ for (it = m_alsaPorts.begin(); it != m_alsaPorts.end(); ++it) {
+ destPair.first = (*it)->m_client;
+ destPair.second = (*it)->m_port;
+
+ // If duplex port is required then choose first one
+ //
+ if (duplex) {
+ if ((*it)->m_direction == Duplex)
+ return destPair;
+ } else {
+ // If duplex port isn't required then choose first
+ // specifically non-duplex port (should be a synth)
+ //
+ if ((*it)->m_direction != Duplex)
+ return destPair;
+ }
+ }
+
+ return destPair;
+}
+
+
+// Sort through the ALSA client/port pairs for the range that
+// matches the one we're querying. If none matches then send
+// back -1 for each.
+//
+ClientPortPair
+AlsaDriver::getPairForMappedInstrument(InstrumentId id)
+{
+ MappedInstrument *instrument = getMappedInstrument(id);
+ if (instrument) {
+ DeviceId device = instrument->getDevice();
+ DevicePortMap::iterator i = m_devicePortMap.find(device);
+ if (i != m_devicePortMap.end()) {
+ return i->second;
+ }
+ }
+#ifdef DEBUG_ALSA
+ /*
+ else
+ {
+ cerr << "WARNING: AlsaDriver::getPairForMappedInstrument: couldn't find instrument for id " << id << ", falling through" << endl;
+ }
+ */
+#endif
+
+ return ClientPortPair( -1, -1);
+}
+
+int
+AlsaDriver::getOutputPortForMappedInstrument(InstrumentId id)
+{
+ MappedInstrument *instrument = getMappedInstrument(id);
+ if (instrument) {
+ DeviceId device = instrument->getDevice();
+ DeviceIntMap::iterator i = m_outputPorts.find(device);
+ if (i != m_outputPorts.end()) {
+ return i->second;
+ }
+#ifdef DEBUG_ALSA
+ else {
+ cerr << "WARNING: AlsaDriver::getOutputPortForMappedInstrument: couldn't find output port for device for instrument " << id << ", falling through" << endl;
+ }
+#endif
+
+ }
+
+ return -1;
+}
+
+// Send a direct controller to the specified port/client
+//
+void
+AlsaDriver::sendDeviceController(DeviceId device,
+ MidiByte controller,
+ MidiByte value)
+{
+ snd_seq_event_t event;
+
+ snd_seq_ev_clear(&event);
+
+ snd_seq_ev_set_subs(&event);
+
+ DeviceIntMap::iterator dimi = m_outputPorts.find(device);
+ if (dimi == m_outputPorts.end())
+ return ;
+
+ snd_seq_ev_set_source(&event, dimi->second);
+ snd_seq_ev_set_direct(&event);
+
+ for (int i = 0; i < 16; i++) {
+ snd_seq_ev_set_controller(&event,
+ i,
+ controller,
+ value);
+ snd_seq_event_output_direct(m_midiHandle, &event);
+ }
+
+ // we probably don't need this:
+ checkAlsaError(snd_seq_drain_output(m_midiHandle), "sendDeviceController(): draining");
+}
+
+void
+AlsaDriver::processPending()
+{
+ if (!m_playing) {
+ processNotesOff(getAlsaTime(), true);
+ checkAlsaError(snd_seq_drain_output(m_midiHandle), "processPending(): draining");
+ }
+
+#ifdef HAVE_LIBJACK
+ if (m_jackDriver) {
+ m_jackDriver->updateAudioData();
+ }
+#endif
+
+ scavengePlugins();
+ m_audioQueueScavenger.scavenge();
+}
+
+void
+AlsaDriver::insertMappedEventForReturn(MappedEvent *mE)
+{
+ // Insert the event ready for return at the next opportunity.
+ //
+ m_returnComposition.insert(mE);
+}
+
+// check for recording status on any ALSA Port
+//
+bool
+AlsaDriver::isRecording(AlsaPortDescription *port)
+{
+ if (port->isReadable()) {
+
+ snd_seq_query_subscribe_t *qSubs;
+ snd_seq_addr_t rg_addr, sender_addr;
+ snd_seq_query_subscribe_alloca(&qSubs);
+
+ rg_addr.client = m_client;
+ rg_addr.port = m_inputPort;
+
+ snd_seq_query_subscribe_set_type(qSubs, SND_SEQ_QUERY_SUBS_WRITE);
+ snd_seq_query_subscribe_set_index(qSubs, 0);
+ snd_seq_query_subscribe_set_root(qSubs, &rg_addr);
+
+ while (snd_seq_query_port_subscribers(m_midiHandle, qSubs) >= 0) {
+ sender_addr = *snd_seq_query_subscribe_get_addr(qSubs);
+ if (sender_addr.client == port->m_client &&
+ sender_addr.port == port->m_port)
+ return true;
+
+ snd_seq_query_subscribe_set_index(qSubs,
+ snd_seq_query_subscribe_get_index(qSubs) + 1);
+ }
+ }
+ return false;
+}
+
+bool
+AlsaDriver::checkForNewClients()
+{
+ Audit audit;
+ bool madeChange = false;
+
+ if (!m_portCheckNeeded)
+ return false;
+
+ AlsaPortList newPorts;
+ generatePortList(&newPorts); // updates m_alsaPorts, returns new ports as well
+
+ // If any devices have connections that no longer exist,
+ // clear those connections and stick them in the suspended
+ // port map in case they come back online later.
+
+ for (MappedDeviceList::iterator i = m_devices.begin();
+ i != m_devices.end(); ++i) {
+
+ ClientPortPair pair(m_devicePortMap[(*i)->getId()]);
+
+ bool found = false;
+ for (AlsaPortList::iterator j = m_alsaPorts.begin();
+ j != m_alsaPorts.end(); ++j) {
+ if ((*j)->m_client == pair.first &&
+ (*j)->m_port == pair.second) {
+ if ((*i)->getDirection() == MidiDevice::Record) {
+ bool recState = isRecording(*j);
+ if (recState != (*i)->isRecording()) {
+ madeChange = true;
+ (*i)->setRecording(recState);
+ }
+ } else {
+ (*i)->setRecording(false);
+ }
+ found = true;
+ break;
+ }
+ }
+
+ if (!found) {
+ m_suspendedPortMap[pair] = (*i)->getId();
+ m_devicePortMap[(*i)->getId()] = ClientPortPair( -1, -1);
+ setConnectionToDevice(**i, "");
+ (*i)->setRecording(false);
+ madeChange = true;
+ }
+ }
+
+ // If we've increased the number of connections, we need
+ // to assign the new connections to existing devices that
+ // have none, where possible, and create new devices for
+ // any left over.
+
+ if (newPorts.size() > 0) {
+
+ audit << "New ports:" << std::endl;
+
+ for (AlsaPortList::iterator i = newPorts.begin();
+ i != newPorts.end(); ++i) {
+
+ if ((*i)->m_client == m_client) {
+ audit << "(Ignoring own port " << (*i)->m_client << ":" << (*i)->m_port << ")" << std::endl;
+ continue;
+ } else if ((*i)->m_client == 0) {
+ audit << "(Ignoring system port " << (*i)->m_client << ":" << (*i)->m_port << ")" << std::endl;
+ continue;
+ }
+
+ audit << (*i)->m_name << std::endl;
+
+ QString portName = (*i)->m_name.c_str();
+ ClientPortPair portPair = ClientPortPair((*i)->m_client,
+ (*i)->m_port);
+
+ if (m_suspendedPortMap.find(portPair) != m_suspendedPortMap.end()) {
+
+ DeviceId id = m_suspendedPortMap[portPair];
+
+ audit << "(Reusing suspended device " << id << ")" << std::endl;
+
+ for (MappedDeviceList::iterator j = m_devices.begin();
+ j != m_devices.end(); ++j) {
+ if ((*j)->getId() == id) {
+ setConnectionToDevice(**j, portName);
+ }
+ }
+
+ m_suspendedPortMap.erase(m_suspendedPortMap.find(portPair));
+ m_devicePortMap[id] = portPair;
+ madeChange = true;
+ continue;
+ }
+
+ bool needPlayDevice = true, needRecordDevice = true;
+
+ if ((*i)->isReadable()) {
+ for (MappedDeviceList::iterator j = m_devices.begin();
+ j != m_devices.end(); ++j) {
+ if ((*j)->getType() == Device::Midi &&
+ (*j)->getConnection() == "" &&
+ (*j)->getDirection() == MidiDevice::Record) {
+ audit << "(Reusing record device " << (*j)->getId()
+ << ")" << std::endl;
+ m_devicePortMap[(*j)->getId()] = portPair;
+ setConnectionToDevice(**j, portName);
+ needRecordDevice = false;
+ madeChange = true;
+ break;
+ }
+ }
+ } else {
+ needRecordDevice = false;
+ }
+
+ if ((*i)->isWriteable()) {
+ for (MappedDeviceList::iterator j = m_devices.begin();
+ j != m_devices.end(); ++j) {
+ if ((*j)->getType() == Device::Midi &&
+ (*j)->getConnection() == "" &&
+ (*j)->getDirection() == MidiDevice::Play) {
+ audit << "(Reusing play device " << (*j)->getId()
+ << ")" << std::endl;
+ m_devicePortMap[(*j)->getId()] = portPair;
+ setConnectionToDevice(**j, portName);
+ needPlayDevice = false;
+ madeChange = true;
+ break;
+ }
+ }
+ } else {
+ needPlayDevice = false;
+ }
+
+ if (needRecordDevice) {
+ MappedDevice *device = createMidiDevice(*i, MidiDevice::Record);
+ if (!device) {
+#ifdef DEBUG_ALSA
+ std::cerr << "WARNING: Failed to create record device" << std::endl;
+#else
+
+ ;
+#endif
+
+ } else {
+ audit << "(Created new record device " << device->getId() << ")" << std::endl;
+ addInstrumentsForDevice(device);
+ m_devices.push_back(device);
+ madeChange = true;
+ }
+ }
+
+ if (needPlayDevice) {
+ MappedDevice *device = createMidiDevice(*i, MidiDevice::Play);
+ if (!device) {
+#ifdef DEBUG_ALSA
+ std::cerr << "WARNING: Failed to create play device" << std::endl;
+#else
+
+ ;
+#endif
+
+ } else {
+ audit << "(Created new play device " << device->getId() << ")" << std::endl;
+ addInstrumentsForDevice(device);
+ m_devices.push_back(device);
+ madeChange = true;
+ }
+ }
+ }
+ }
+
+ // If one of our ports is connected to a single other port and
+ // it isn't the one we thought, we should update our connection
+
+ for (MappedDeviceList::iterator i = m_devices.begin();
+ i != m_devices.end(); ++i) {
+
+ DevicePortMap::iterator j = m_devicePortMap.find((*i)->getId());
+
+ snd_seq_addr_t addr;
+ addr.client = m_client;
+
+ DeviceIntMap::iterator ii = m_outputPorts.find((*i)->getId());
+ if (ii == m_outputPorts.end())
+ continue;
+ addr.port = ii->second;
+
+ snd_seq_query_subscribe_t *subs;
+ snd_seq_query_subscribe_alloca(&subs);
+ snd_seq_query_subscribe_set_root(subs, &addr);
+ snd_seq_query_subscribe_set_index(subs, 0);
+
+ bool haveOurs = false;
+ int others = 0;
+ ClientPortPair firstOther;
+
+ while (!snd_seq_query_port_subscribers(m_midiHandle, subs)) {
+
+ const snd_seq_addr_t *otherEnd =
+ snd_seq_query_subscribe_get_addr(subs);
+
+ if (!otherEnd)
+ continue;
+
+ if (j != m_devicePortMap.end() &&
+ otherEnd->client == j->second.first &&
+ otherEnd->port == j->second.second) {
+ haveOurs = true;
+ } else {
+ ++others;
+ firstOther = ClientPortPair(otherEnd->client, otherEnd->port);
+ }
+
+ snd_seq_query_subscribe_set_index
+ (subs, snd_seq_query_subscribe_get_index(subs) + 1);
+ }
+
+ if (haveOurs) { // leave our own connection alone, and stop worrying
+ continue;
+
+ } else {
+ if (others == 0) {
+ if (j != m_devicePortMap.end()) {
+ j->second = ClientPortPair( -1, -1);
+ setConnectionToDevice(**i, "");
+ madeChange = true;
+ }
+ } else {
+ for (AlsaPortList::iterator k = m_alsaPorts.begin();
+ k != m_alsaPorts.end(); ++k) {
+ if ((*k)->m_client == firstOther.first &&
+ (*k)->m_port == firstOther.second) {
+ m_devicePortMap[(*i)->getId()] = firstOther;
+ setConnectionToDevice(**i, (*k)->m_name.c_str(),
+ firstOther);
+ madeChange = true;
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ if (madeChange) {
+ MappedEvent *mE =
+ new MappedEvent(0, MappedEvent::SystemUpdateInstruments,
+ 0, 0);
+ // send completion event
+ insertMappedEventForReturn(mE);
+ }
+
+ m_portCheckNeeded = false;
+
+ return true;
+}
+
+
+// From a DeviceId get a client/port pair for connecting as the
+// MIDI record device.
+//
+void
+AlsaDriver::setRecordDevice(DeviceId id, bool connectAction)
+{
+ Audit audit;
+
+ // Locate a suitable port
+ //
+ if (m_devicePortMap.find(id) == m_devicePortMap.end()) {
+#ifdef DEBUG_ALSA
+ audit << "AlsaDriver::setRecordDevice - "
+ << "couldn't match device id (" << id << ") to ALSA port"
+ << std::endl;
+#endif
+
+ return ;
+ }
+
+ ClientPortPair pair = m_devicePortMap[id];
+
+ snd_seq_addr_t sender, dest;
+ sender.client = pair.first;
+ sender.port = pair.second;
+
+ for (MappedDeviceList::iterator i = m_devices.begin();
+ i != m_devices.end(); ++i) {
+ if ((*i)->getId() == id) {
+ if ((*i)->getDirection() == MidiDevice::Record) {
+ if ((*i)->isRecording() && connectAction) {
+#ifdef DEBUG_ALSA
+ audit << "AlsaDriver::setRecordDevice - "
+ << "attempting to subscribe (" << id
+ << ") already subscribed" << std::endl;
+#endif
+
+ return ;
+ }
+ if (!(*i)->isRecording() && !connectAction) {
+#ifdef DEBUG_ALSA
+ audit << "AlsaDriver::setRecordDevice - "
+ << "attempting to unsubscribe (" << id
+ << ") already unsubscribed" << std::endl;
+#endif
+
+ return ;
+ }
+ } else {
+#ifdef DEBUG_ALSA
+ audit << "AlsaDriver::setRecordDevice - "
+ << "attempting to set play device (" << id
+ << ") to record device" << std::endl;
+#endif
+
+ return ;
+ }
+ break;
+ }
+ }
+
+ snd_seq_port_subscribe_t *subs;
+ snd_seq_port_subscribe_alloca(&subs);
+
+ dest.client = m_client;
+ dest.port = m_inputPort;
+
+ // Set destinations and senders
+ //
+ snd_seq_port_subscribe_set_sender(subs, &sender);
+ snd_seq_port_subscribe_set_dest(subs, &dest);
+
+ // subscribe or unsubscribe the port
+ //
+ if (connectAction) {
+ if (checkAlsaError(snd_seq_subscribe_port(m_midiHandle, subs),
+ "setRecordDevice - failed subscription of input port") < 0) {
+ // Not the end of the world if this fails but we
+ // have to flag it internally.
+ //
+ audit << "AlsaDriver::setRecordDevice - "
+ << int(sender.client) << ":" << int(sender.port)
+ << " failed to subscribe device "
+ << id << " as record port" << std::endl;
+ } else {
+ m_midiInputPortConnected = true;
+ audit << "AlsaDriver::setRecordDevice - "
+ << "successfully subscribed device "
+ << id << " as record port" << std::endl;
+ }
+ } else {
+ if (checkAlsaError(snd_seq_unsubscribe_port(m_midiHandle, subs),
+ "setRecordDevice - failed to unsubscribe a device") == 0)
+ audit << "AlsaDriver::setRecordDevice - "
+ << "successfully unsubscribed device "
+ << id << " as record port" << std::endl;
+
+ }
+}
+
+// Clear any record device connections
+//
+void
+AlsaDriver::unsetRecordDevices()
+{
+ snd_seq_addr_t dest;
+ dest.client = m_client;
+ dest.port = m_inputPort;
+
+ snd_seq_query_subscribe_t *qSubs;
+ snd_seq_addr_t tmp_addr;
+ snd_seq_query_subscribe_alloca(&qSubs);
+
+ tmp_addr.client = m_client;
+ tmp_addr.port = m_inputPort;
+
+ // Unsubsribe any existing connections
+ //
+ snd_seq_query_subscribe_set_type(qSubs, SND_SEQ_QUERY_SUBS_WRITE);
+ snd_seq_query_subscribe_set_index(qSubs, 0);
+ snd_seq_query_subscribe_set_root(qSubs, &tmp_addr);
+
+ while (snd_seq_query_port_subscribers(m_midiHandle, qSubs) >= 0) {
+ tmp_addr = *snd_seq_query_subscribe_get_addr(qSubs);
+
+ snd_seq_port_subscribe_t *dSubs;
+ snd_seq_port_subscribe_alloca(&dSubs);
+
+ snd_seq_addr_t dSender;
+ dSender.client = tmp_addr.client;
+ dSender.port = tmp_addr.port;
+
+ snd_seq_port_subscribe_set_sender(dSubs, &dSender);
+ snd_seq_port_subscribe_set_dest(dSubs, &dest);
+
+ int error = snd_seq_unsubscribe_port(m_midiHandle, dSubs);
+
+ if (error < 0) {
+#ifdef DEBUG_ALSA
+ std::cerr << "AlsaDriver::unsetRecordDevices - "
+ << "can't unsubscribe record port" << std::endl;
+#endif
+
+ }
+
+ snd_seq_query_subscribe_set_index(qSubs,
+ snd_seq_query_subscribe_get_index(qSubs) + 1);
+ }
+}
+
+void
+AlsaDriver::sendMMC(MidiByte deviceArg,
+ MidiByte instruction,
+ bool isCommand,
+ const std::string &data)
+{
+ snd_seq_event_t event;
+
+ snd_seq_ev_clear(&event);
+ snd_seq_ev_set_source(&event, m_syncOutputPort);
+ snd_seq_ev_set_subs(&event);
+
+ unsigned char dataArr[10] =
+ { MIDI_SYSTEM_EXCLUSIVE,
+ MIDI_SYSEX_RT, deviceArg,
+ (isCommand ? MIDI_SYSEX_RT_COMMAND : MIDI_SYSEX_RT_RESPONSE),
+ instruction };
+
+ std::string dataString = std::string((const char *)dataArr) +
+ data + (char)MIDI_END_OF_EXCLUSIVE;
+
+ snd_seq_ev_set_sysex(&event, dataString.length(),
+ (char *)dataString.c_str());
+
+ event.queue = SND_SEQ_QUEUE_DIRECT;
+
+ checkAlsaError(snd_seq_event_output_direct(m_midiHandle, &event),
+ "sendMMC event send");
+
+ if (m_queueRunning) {
+ checkAlsaError(snd_seq_drain_output(m_midiHandle), "sendMMC drain");
+ }
+}
+
+// Send a system real-time message from the sync output port
+//
+void
+AlsaDriver::sendSystemDirect(MidiByte command, int *args)
+{
+ snd_seq_event_t event;
+
+ snd_seq_ev_clear(&event);
+ snd_seq_ev_set_source(&event, m_syncOutputPort);
+ snd_seq_ev_set_subs(&event);
+
+ event.queue = SND_SEQ_QUEUE_DIRECT;
+
+ // set the command
+ event.type = command;
+
+ // set args if we have them
+ if (args) {
+ event.data.control.value = *args;
+ }
+
+ int error = snd_seq_event_output_direct(m_midiHandle, &event);
+
+ if (error < 0) {
+#ifdef DEBUG_ALSA
+ std::cerr << "AlsaDriver::sendSystemDirect - "
+ << "can't send event (" << int(command) << ")"
+ << std::endl;
+#endif
+
+ }
+
+ // checkAlsaError(snd_seq_drain_output(m_midiHandle),
+ // "sendSystemDirect(): draining");
+}
+
+
+void
+AlsaDriver::sendSystemQueued(MidiByte command,
+ const std::string &args,
+ const RealTime &time)
+{
+ snd_seq_event_t event;
+
+ snd_seq_ev_clear(&event);
+ snd_seq_ev_set_source(&event, m_syncOutputPort);
+ snd_seq_ev_set_subs(&event);
+
+ snd_seq_real_time_t sendTime = { time.sec, time.nsec };
+
+ // Schedule the command
+ //
+ event.type = command;
+
+ snd_seq_ev_schedule_real(&event, m_queue, 0, &sendTime);
+
+ // set args if we have them
+ switch (args.length()) {
+ case 1:
+ event.data.control.value = args[0];
+ break;
+
+ case 2:
+ event.data.control.value = int(args[0]) | (int(args[1]) << 7);
+ break;
+
+ default: // do nothing
+ break;
+ }
+
+ int error = snd_seq_event_output(m_midiHandle, &event);
+
+ if (error < 0) {
+#ifdef DEBUG_ALSA
+ std::cerr << "AlsaDriver::sendSystemQueued - "
+ << "can't send event (" << int(command) << ")"
+ << " - error = (" << error << ")"
+ << std::endl;
+#endif
+
+ }
+
+ // if (m_queueRunning) {
+ // checkAlsaError(snd_seq_drain_output(m_midiHandle), "sendSystemQueued(): draining");
+ // }
+}
+
+
+void
+AlsaDriver::claimUnwantedPlugin(void *plugin)
+{
+ m_pluginScavenger.claim((RunnablePluginInstance *)plugin);
+}
+
+
+void
+AlsaDriver::scavengePlugins()
+{
+ m_pluginScavenger.scavenge();
+}
+
+
+QString
+AlsaDriver::getStatusLog()
+{
+ return QString::fromUtf8(Audit::getAudit().c_str());
+}
+
+
+void
+AlsaDriver::sleep(const RealTime &rt)
+{
+ int npfd = snd_seq_poll_descriptors_count(m_midiHandle, POLLIN);
+ struct pollfd *pfd = (struct pollfd *)alloca(npfd * sizeof(struct pollfd));
+ snd_seq_poll_descriptors(m_midiHandle, pfd, npfd, POLLIN);
+ poll(pfd, npfd, rt.sec * 1000 + rt.msec());
+}
+
+void
+AlsaDriver::runTasks()
+{
+#ifdef HAVE_LIBJACK
+ if (m_jackDriver) {
+ if (!m_jackDriver->isOK()) {
+ m_jackDriver->restoreIfRestorable();
+ }
+ }
+
+ if (m_doTimerChecks && m_timerRatioCalculated) {
+
+ double ratio = m_timerRatio;
+ m_timerRatioCalculated = false;
+
+ snd_seq_queue_tempo_t *q_ptr;
+ snd_seq_queue_tempo_alloca(&q_ptr);
+
+ snd_seq_get_queue_tempo(m_midiHandle, m_queue, q_ptr);
+
+ unsigned int t_skew = snd_seq_queue_tempo_get_skew(q_ptr);
+#ifdef DEBUG_ALSA
+
+ unsigned int t_base = snd_seq_queue_tempo_get_skew_base(q_ptr);
+ if (!m_playing) {
+ std::cerr << "Skew: " << t_skew << "/" << t_base;
+ }
+#endif
+
+ unsigned int newSkew = t_skew + (unsigned int)(t_skew * ratio);
+
+ if (newSkew != t_skew) {
+#ifdef DEBUG_ALSA
+ if (!m_playing) {
+ std::cerr << " changed to " << newSkew << endl;
+ }
+#endif
+ snd_seq_queue_tempo_set_skew(q_ptr, newSkew);
+ snd_seq_set_queue_tempo( m_midiHandle, m_queue, q_ptr);
+ } else {
+#ifdef DEBUG_ALSA
+ if (!m_playing) {
+ std::cerr << endl;
+ }
+#endif
+
+ }
+
+ m_firstTimerCheck = true;
+ }
+
+#endif
+}
+
+void
+AlsaDriver::reportFailure(MappedEvent::FailureCode code)
+{
+ //#define REPORT_XRUNS 1
+#ifndef REPORT_XRUNS
+ if (code == MappedEvent::FailureXRuns ||
+ code == MappedEvent::FailureDiscUnderrun ||
+ code == MappedEvent::FailureBussMixUnderrun ||
+ code == MappedEvent::FailureMixUnderrun) {
+ return ;
+ }
+#endif
+
+ // Ignore consecutive duplicates
+ if (_failureReportWriteIndex > 0 &&
+ _failureReportWriteIndex != _failureReportReadIndex) {
+ if (code == _failureReports[_failureReportWriteIndex - 1])
+ return ;
+ }
+
+ _failureReports[_failureReportWriteIndex] = code;
+ _failureReportWriteIndex =
+ (_failureReportWriteIndex + 1) % FAILURE_REPORT_COUNT;
+}
+
+std::string
+AlsaDriver::getAlsaModuleVersionString()
+{
+ FILE *v = fopen("/proc/asound/version", "r");
+
+ // Examples:
+ // Advanced Linux Sound Architecture Driver Version 1.0.14rc3.
+ // Advanced Linux Sound Architecture Driver Version 1.0.14 (Thu May 31 09:03:25 2008 UTC).
+
+ if (v) {
+ char buf[256];
+ fgets(buf, 256, v);
+ fclose(v);
+
+ std::string vs(buf);
+ std::string::size_type sp = vs.find_first_of('.');
+ if (sp > 0 && sp != std::string::npos) {
+ while (sp > 0 && isdigit(vs[sp-1])) --sp;
+ vs = vs.substr(sp);
+ if (vs.length() > 0 && vs[vs.length()-1] == '\n') {
+ vs = vs.substr(0, vs.length()-1);
+ }
+ if (vs.length() > 0 && vs[vs.length()-1] == '.') {
+ vs = vs.substr(0, vs.length()-1);
+ }
+ return vs;
+ }
+ }
+
+ return "(unknown)";
+}
+
+std::string
+AlsaDriver::getKernelVersionString()
+{
+ FILE *v = fopen("/proc/version", "r");
+
+ if (v) {
+ char buf[256];
+ fgets(buf, 256, v);
+ fclose(v);
+
+ std::string vs(buf);
+ std::string key(" version ");
+ std::string::size_type sp = vs.find(key);
+ if (sp != std::string::npos) {
+ vs = vs.substr(sp + key.length());
+ sp = vs.find(' ');
+ if (sp != std::string::npos) {
+ vs = vs.substr(0, sp);
+ }
+ if (vs.length() > 0 && vs[vs.length()-1] == '\n') {
+ vs = vs.substr(0, vs.length()-1);
+ }
+ return vs;
+ }
+ }
+
+ return "(unknown)";
+}
+
+void
+AlsaDriver::extractVersion(std::string v, int &major, int &minor, int &subminor, std::string &suffix)
+{
+ major = minor = subminor = 0;
+ suffix = "";
+ if (v == "(unknown)") return;
+
+ std::string::size_type sp, pp;
+
+ sp = v.find('.');
+ if (sp == std::string::npos) goto done;
+ major = atoi(v.substr(0, sp).c_str());
+ pp = sp + 1;
+
+ sp = v.find('.', pp);
+ if (sp == std::string::npos) goto done;
+ minor = atoi(v.substr(pp, sp - pp).c_str());
+ pp = sp + 1;
+
+ while (++sp < v.length() && (::isdigit(v[sp]) || v[sp] == '-'));
+ subminor = atoi(v.substr(pp, sp - pp).c_str());
+
+ if (sp >= v.length()) goto done;
+ suffix = v.substr(sp);
+
+done:
+ std::cerr << "extractVersion: major = " << major << ", minor = " << minor << ", subminor = " << subminor << ", suffix = \"" << suffix << "\"" << std::endl;
+}
+
+bool
+AlsaDriver::versionIsAtLeast(std::string v, int major, int minor, int subminor)
+{
+ int actualMajor, actualMinor, actualSubminor;
+ std::string actualSuffix;
+
+ extractVersion(v, actualMajor, actualMinor, actualSubminor, actualSuffix);
+
+ bool ok = false;
+
+ if (actualMajor > major) {
+ ok = true;
+ } else if (actualMajor == major) {
+ if (actualMinor > minor) {
+ ok = true;
+ } else if (actualMinor == minor) {
+ if (actualSubminor > subminor) {
+ ok = true;
+ } else if (actualSubminor == subminor) {
+ if (strncmp(actualSuffix.c_str(), "rc", 2) &&
+ strncmp(actualSuffix.c_str(), "pre", 3)) {
+ ok = true;
+ }
+ }
+ }
+ }
+
+ std::cerr << "AlsaDriver::versionIsAtLeast: is version " << v << " at least " << major << "." << minor << "." << subminor << "? " << (ok ? "yes" : "no") << std::endl;
+ return ok;
+}
+
+}
+
+
+#endif // HAVE_ALSA
diff --git a/src/sound/AlsaDriver.h b/src/sound/AlsaDriver.h
new file mode 100644
index 0000000..e80e30f
--- /dev/null
+++ b/src/sound/AlsaDriver.h
@@ -0,0 +1,561 @@
+// -*- c-indentation-style:"stroustrup" c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+// Specialisation of SoundDriver to support ALSA (http://www.alsa-project.org)
+//
+//
+#ifndef _ALSADRIVER_H_
+#define _ALSADRIVER_H_
+
+#include <vector>
+#include <set>
+#include <map>
+
+#ifdef HAVE_ALSA
+
+#include <alsa/asoundlib.h> // ALSA
+
+#include "SoundDriver.h"
+#include "Instrument.h"
+#include "Device.h"
+#include "AlsaPort.h"
+#include "Scavenger.h"
+#include "RunnablePluginInstance.h"
+
+#ifdef HAVE_LIBJACK
+#include "JackDriver.h"
+#endif
+
+namespace Rosegarden
+{
+
+class AlsaDriver : public SoundDriver
+{
+public:
+ AlsaDriver(MappedStudio *studio);
+ virtual ~AlsaDriver();
+
+ // shutdown everything that's currently open
+ void shutdown();
+
+ virtual bool initialise();
+ virtual void initialisePlayback(const RealTime &position);
+ virtual void stopPlayback();
+ virtual void punchOut();
+ virtual void resetPlayback(const RealTime &oldPosition, const RealTime &position);
+ virtual void allNotesOff();
+ virtual void processNotesOff(const RealTime &time, bool now, bool everything = false);
+
+ virtual RealTime getSequencerTime();
+
+ virtual MappedComposition *getMappedComposition();
+
+ virtual bool record(RecordStatus recordStatus,
+ const std::vector<InstrumentId> *armedInstruments = 0,
+ const std::vector<QString> *audioFileNames = 0);
+
+ virtual void startClocks();
+ virtual void startClocksApproved(); // called by JACK driver in sync mode
+ virtual void stopClocks();
+ virtual bool areClocksRunning() const { return m_queueRunning; }
+
+ virtual void processEventsOut(const MappedComposition &mC);
+ virtual void processEventsOut(const MappedComposition &mC,
+ const RealTime &sliceStart,
+ const RealTime &sliceEnd);
+
+ // Return the sample rate
+ //
+ virtual unsigned int getSampleRate() const {
+#ifdef HAVE_LIBJACK
+ if (m_jackDriver) return m_jackDriver->getSampleRate();
+ else return 0;
+#else
+ return 0;
+#endif
+ }
+
+ // Define here to catch this being reset
+ //
+ virtual void setMIDIClockInterval(RealTime interval);
+
+ // initialise subsystems
+ //
+ bool initialiseMidi();
+ void initialiseAudio();
+
+ // Some stuff to help us debug this
+ //
+ void getSystemInfo();
+ void showQueueStatus(int queue);
+
+ // Process pending
+ //
+ virtual void processPending();
+
+ // We can return audio control signals to the gui using MappedEvents.
+ // Meter levels or audio file completions can go in here.
+ //
+ void insertMappedEventForReturn(MappedEvent *mE);
+
+
+ virtual RealTime getAudioPlayLatency() {
+#ifdef HAVE_LIBJACK
+ if (m_jackDriver) return m_jackDriver->getAudioPlayLatency();
+#endif
+ return RealTime::zeroTime;
+ }
+
+ virtual RealTime getAudioRecordLatency() {
+#ifdef HAVE_LIBJACK
+ if (m_jackDriver) return m_jackDriver->getAudioRecordLatency();
+#endif
+ return RealTime::zeroTime;
+ }
+
+ virtual RealTime getInstrumentPlayLatency(InstrumentId id) {
+#ifdef HAVE_LIBJACK
+ if (m_jackDriver) return m_jackDriver->getInstrumentPlayLatency(id);
+#endif
+ return RealTime::zeroTime;
+ }
+
+ virtual RealTime getMaximumPlayLatency() {
+#ifdef HAVE_LIBJACK
+ if (m_jackDriver) return m_jackDriver->getMaximumPlayLatency();
+#endif
+ return RealTime::zeroTime;
+ }
+
+
+ // Plugin instance management
+ //
+ virtual void setPluginInstance(InstrumentId id,
+ QString identifier,
+ int position) {
+#ifdef HAVE_LIBJACK
+ if (m_jackDriver) m_jackDriver->setPluginInstance(id, identifier, position);
+#endif
+ }
+
+ virtual void removePluginInstance(InstrumentId id, int position) {
+#ifdef HAVE_LIBJACK
+ if (m_jackDriver) m_jackDriver->removePluginInstance(id, position);
+#endif
+ }
+
+ // Remove all plugin instances
+ //
+ virtual void removePluginInstances() {
+#ifdef HAVE_LIBJACK
+ if (m_jackDriver) m_jackDriver->removePluginInstances();
+#endif
+ }
+
+ virtual void setPluginInstancePortValue(InstrumentId id,
+ int position,
+ unsigned long portNumber,
+ float value) {
+#ifdef HAVE_LIBJACK
+ if (m_jackDriver) m_jackDriver->setPluginInstancePortValue(id, position, portNumber, value);
+#endif
+ }
+
+ virtual float getPluginInstancePortValue(InstrumentId id,
+ int position,
+ unsigned long portNumber) {
+#ifdef HAVE_LIBJACK
+ if (m_jackDriver) return m_jackDriver->getPluginInstancePortValue(id, position, portNumber);
+#endif
+ return 0;
+ }
+
+ virtual void setPluginInstanceBypass(InstrumentId id,
+ int position,
+ bool value) {
+#ifdef HAVE_LIBJACK
+ if (m_jackDriver) m_jackDriver->setPluginInstanceBypass(id, position, value);
+#endif
+ }
+
+ virtual QStringList getPluginInstancePrograms(InstrumentId id,
+ int position) {
+#ifdef HAVE_LIBJACK
+ if (m_jackDriver) return m_jackDriver->getPluginInstancePrograms(id, position);
+#endif
+ return QStringList();
+ }
+
+ virtual QString getPluginInstanceProgram(InstrumentId id,
+ int position) {
+#ifdef HAVE_LIBJACK
+ if (m_jackDriver) return m_jackDriver->getPluginInstanceProgram(id, position);
+#endif
+ return QString();
+ }
+
+ virtual QString getPluginInstanceProgram(InstrumentId id,
+ int position,
+ int bank,
+ int program) {
+#ifdef HAVE_LIBJACK
+ if (m_jackDriver) return m_jackDriver->getPluginInstanceProgram(id, position, bank, program);
+#endif
+ return QString();
+ }
+
+ virtual unsigned long getPluginInstanceProgram(InstrumentId id,
+ int position,
+ QString name) {
+#ifdef HAVE_LIBJACK
+ if (m_jackDriver) return m_jackDriver->getPluginInstanceProgram(id, position, name);
+#endif
+ return 0;
+ }
+
+ virtual void setPluginInstanceProgram(InstrumentId id,
+ int position,
+ QString program) {
+#ifdef HAVE_LIBJACK
+ if (m_jackDriver) m_jackDriver->setPluginInstanceProgram(id, position, program);
+#endif
+ }
+
+ virtual QString configurePlugin(InstrumentId id,
+ int position,
+ QString key,
+ QString value) {
+#ifdef HAVE_LIBJACK
+ if (m_jackDriver) return m_jackDriver->configurePlugin(id, position, key, value);
+#endif
+ return QString();
+ }
+
+ virtual void setAudioBussLevels(int bussId,
+ float dB,
+ float pan) {
+#ifdef HAVE_LIBJACK
+ if (m_jackDriver) m_jackDriver->setAudioBussLevels(bussId, dB, pan);
+#endif
+ }
+
+ virtual void setAudioInstrumentLevels(InstrumentId instrument,
+ float dB,
+ float pan) {
+#ifdef HAVE_LIBJACK
+ if (m_jackDriver) m_jackDriver->setAudioInstrumentLevels(instrument, dB, pan);
+#endif
+ }
+
+ virtual void claimUnwantedPlugin(void *plugin);
+ virtual void scavengePlugins();
+
+ virtual bool checkForNewClients();
+
+ virtual void setLoop(const RealTime &loopStart, const RealTime &loopEnd);
+
+ virtual void sleep(const RealTime &);
+
+ // ----------------------- End of Virtuals ----------------------
+
+ // Create and send an MMC command
+ //
+ void sendMMC(MidiByte deviceId,
+ MidiByte instruction,
+ bool isCommand,
+ const std::string &data);
+
+ // Check whether the given event is an MMC command we need to act on
+ // (and if so act on it)
+ //
+ bool testForMMCSysex(const snd_seq_event_t *event);
+
+ // Create and enqueue a batch of MTC quarter-frame events
+ //
+ void insertMTCQFrames(RealTime sliceStart, RealTime sliceEnd);
+
+ // Create and enqueue an MTC full-frame system exclusive event
+ //
+ void insertMTCFullFrame(RealTime time);
+
+ // Parse and accept an incoming MTC quarter-frame event
+ //
+ void handleMTCQFrame(unsigned int data_byte, RealTime the_time);
+
+ // Check whether the given event is an MTC sysex we need to act on
+ // (and if so act on it)
+ //
+ bool testForMTCSysex(const snd_seq_event_t *event);
+
+ // Adjust the ALSA clock skew for MTC lock
+ //
+ void tweakSkewForMTC(int factor);
+
+ // Recalibrate internal MTC factors
+ //
+ void calibrateMTC();
+
+ // Send a System message straight away
+ //
+ void sendSystemDirect(MidiByte command, int *arg);
+
+ // Scheduled system message with arguments
+ //
+ void sendSystemQueued(MidiByte command,
+ const std::string &args,
+ const RealTime &time);
+
+ // Set the record device
+ //
+ void setRecordDevice(DeviceId id, bool connectAction);
+ void unsetRecordDevices();
+
+ virtual bool canReconnect(Device::DeviceType type);
+
+ virtual DeviceId addDevice(Device::DeviceType type,
+ MidiDevice::DeviceDirection direction);
+ virtual void removeDevice(DeviceId id);
+ virtual void renameDevice(DeviceId id, QString name);
+
+ // Get available connections per device
+ //
+ virtual unsigned int getConnections(Device::DeviceType type,
+ MidiDevice::DeviceDirection direction);
+ virtual QString getConnection(Device::DeviceType type,
+ MidiDevice::DeviceDirection direction,
+ unsigned int connectionNo);
+ virtual void setConnection(DeviceId deviceId, QString connection);
+ virtual void setPlausibleConnection(DeviceId deviceId, QString connection);
+
+ virtual unsigned int getTimers();
+ virtual QString getTimer(unsigned int);
+ virtual QString getCurrentTimer();
+ virtual void setCurrentTimer(QString);
+
+ virtual void getAudioInstrumentNumbers(InstrumentId &audioInstrumentBase,
+ int &audioInstrumentCount) {
+ audioInstrumentBase = AudioInstrumentBase;
+#ifdef HAVE_LIBJACK
+ audioInstrumentCount = AudioInstrumentCount;
+#else
+ audioInstrumentCount = 0;
+#endif
+ }
+
+ virtual void getSoftSynthInstrumentNumbers(InstrumentId &ssInstrumentBase,
+ int &ssInstrumentCount) {
+ ssInstrumentBase = SoftSynthInstrumentBase;
+#ifdef HAVE_DSSI
+ ssInstrumentCount = SoftSynthInstrumentCount;
+#else
+ ssInstrumentCount = 0;
+#endif
+ }
+
+ virtual QString getStatusLog();
+
+ // To be called regularly from JACK driver when idle
+ void checkTimerSync(size_t frames);
+
+ virtual void runTasks();
+
+ // Report a failure back to the GUI
+ //
+ virtual void reportFailure(MappedEvent::FailureCode code);
+
+protected:
+ typedef std::vector<AlsaPortDescription *> AlsaPortList;
+
+ ClientPortPair getFirstDestination(bool duplex);
+ ClientPortPair getPairForMappedInstrument(InstrumentId id);
+ int getOutputPortForMappedInstrument(InstrumentId id);
+ std::map<unsigned int, std::map<unsigned int, MappedEvent*> > m_noteOnMap;
+
+ /**
+ * Bring m_alsaPorts up-to-date; if newPorts is non-null, also
+ * return the new ports (not previously in m_alsaPorts) through it
+ */
+ virtual void generatePortList(AlsaPortList *newPorts = 0);
+ virtual void generateInstruments();
+
+ virtual void generateTimerList();
+ virtual std::string getAutoTimer(bool &wantTimerChecks);
+
+ void addInstrumentsForDevice(MappedDevice *device);
+ MappedDevice *createMidiDevice(AlsaPortDescription *,
+ MidiDevice::DeviceDirection);
+
+ virtual void processMidiOut(const MappedComposition &mC,
+ const RealTime &sliceStart,
+ const RealTime &sliceEnd);
+
+ virtual void processSoftSynthEventOut(InstrumentId id,
+ const snd_seq_event_t *event,
+ bool now);
+
+ virtual bool isRecording(AlsaPortDescription *port);
+
+ virtual void processAudioQueue(bool /* now */) { }
+
+ virtual void setConnectionToDevice(MappedDevice &device, QString connection);
+ virtual void setConnectionToDevice(MappedDevice &device, QString connection,
+ const ClientPortPair &pair);
+
+private:
+ RealTime getAlsaTime();
+
+ // Locally convenient to control our devices
+ //
+ void sendDeviceController(DeviceId device,
+ MidiByte byte1,
+ MidiByte byte2);
+
+ int checkAlsaError(int rc, const char *message);
+
+ AlsaPortList m_alsaPorts;
+
+ // ALSA MIDI/Sequencer stuff
+ //
+ snd_seq_t *m_midiHandle;
+ int m_client;
+
+ int m_inputPort;
+
+ typedef std::map<DeviceId, int> DeviceIntMap;
+ DeviceIntMap m_outputPorts;
+
+ int m_syncOutputPort;
+ int m_controllerPort;
+
+ int m_queue;
+ int m_maxClients;
+ int m_maxPorts;
+ int m_maxQueues;
+
+ // Because this can fail even if the driver's up (if
+ // another service is using the port say)
+ //
+ bool m_midiInputPortConnected;
+
+ bool m_midiSyncAutoConnect;
+
+ RealTime m_alsaPlayStartTime;
+ RealTime m_alsaRecordStartTime;
+
+ RealTime m_loopStartTime;
+ RealTime m_loopEndTime;
+
+ // MIDI Time Code handling:
+
+ unsigned int m_eat_mtc;
+ // Received/emitted MTC data breakdown:
+ RealTime m_mtcReceiveTime;
+ RealTime m_mtcEncodedTime;
+ int m_mtcFrames;
+ int m_mtcSeconds;
+ int m_mtcMinutes;
+ int m_mtcHours;
+ int m_mtcSMPTEType;
+
+ // Calculated MTC factors:
+ int m_mtcFirstTime;
+ RealTime m_mtcLastEncoded;
+ RealTime m_mtcLastReceive;
+ long long int m_mtcSigmaE;
+ long long int m_mtcSigmaC;
+ unsigned int m_mtcSkew;
+
+ bool m_looping;
+
+ bool m_haveShutdown;
+
+#ifdef HAVE_LIBJACK
+ JackDriver *m_jackDriver;
+#endif
+
+ Scavenger<RunnablePluginInstance> m_pluginScavenger;
+
+ //!!! -- hoist to SoundDriver w/setter?
+ typedef std::set<InstrumentId> InstrumentSet;
+ InstrumentSet m_recordingInstruments;
+
+ typedef std::map<DeviceId, ClientPortPair> DevicePortMap;
+ DevicePortMap m_devicePortMap;
+
+ typedef std::map<ClientPortPair, DeviceId> PortDeviceMap;
+ PortDeviceMap m_suspendedPortMap;
+
+ std::string getPortName(ClientPortPair port);
+ ClientPortPair getPortByName(std::string name);
+
+ DeviceId getSpareDeviceId();
+
+ struct AlsaTimerInfo {
+ int clas;
+ int sclas;
+ int card;
+ int device;
+ int subdevice;
+ std::string name;
+ long resolution;
+ };
+ std::vector<AlsaTimerInfo> m_timers;
+ std::string m_currentTimer;
+
+ // This auxiliary queue is here as a hack, to avoid stuck notes if
+ // resetting playback while a note-off is currently in the ALSA
+ // queue. When playback is reset by ffwd or rewind etc, we drop
+ // all the queued events (which is generally what is desired,
+ // except for note offs) and reset the queue timer (so the note
+ // offs would have the wrong time stamps even if we hadn't dropped
+ // them). Thus, we need to re-send any recent note offs before
+ // continuing. This queue records which note offs have been
+ // added to the ALSA queue recently.
+ //
+ NoteOffQueue m_recentNoteOffs;
+ void pushRecentNoteOffs(); // move from recent to normal queue after reset
+ void cropRecentNoteOffs(const RealTime &t); // remove old note offs
+ void weedRecentNoteOffs(unsigned int pitch, MidiByte channel,
+ InstrumentId instrument); // on subsequent note on
+
+ bool m_queueRunning;
+
+ bool m_portCheckNeeded;
+
+ enum { NeedNoJackStart, NeedJackReposition, NeedJackStart } m_needJackStart;
+
+ bool m_doTimerChecks;
+ bool m_firstTimerCheck;
+ double m_timerRatio;
+ bool m_timerRatioCalculated;
+
+ std::string getAlsaModuleVersionString();
+ std::string getKernelVersionString();
+ void extractVersion(std::string vstr, int &major, int &minor, int &subminor, std::string &suffix);
+ bool versionIsAtLeast(std::string vstr, int major, int minor, int subminor);
+};
+
+}
+
+#endif // HAVE_ALSA
+
+#endif // _ALSADRIVER_H_
+
diff --git a/src/sound/AlsaPort.cpp b/src/sound/AlsaPort.cpp
new file mode 100644
index 0000000..dc12610
--- /dev/null
+++ b/src/sound/AlsaPort.cpp
@@ -0,0 +1,192 @@
+// -*- c-indentation-style:"stroustrup" c-basic-offset: 4 -*-
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include "AlsaPort.h"
+
+#include <iostream>
+#include <cstdlib>
+#include <cstdio>
+
+#ifdef HAVE_ALSA
+
+// ALSA
+#include <alsa/asoundlib.h>
+#include <alsa/seq_event.h>
+#include <alsa/version.h>
+
+#include "MappedInstrument.h"
+#include "Midi.h"
+#include "WAVAudioFile.h"
+#include "MappedStudio.h"
+#include "misc/Strings.h"
+
+#ifdef HAVE_LIBJACK
+#include <jack/types.h>
+#include <unistd.h> // for usleep
+#include <cmath>
+#endif
+
+namespace Rosegarden
+{
+
+AlsaPortDescription::AlsaPortDescription(Instrument::InstrumentType type,
+ const std::string &name,
+ int client,
+ int port,
+ unsigned int clientType,
+ unsigned int portType,
+ unsigned int capability,
+ PortDirection direction):
+ m_type(type),
+ m_name(name),
+ m_client(client),
+ m_port(port),
+ m_clientType(clientType),
+ m_portType(portType),
+ m_capability(capability),
+ m_direction(direction)
+{}
+
+
+bool
+AlsaPortCmp::operator()(AlsaPortDescription *a1, AlsaPortDescription *a2)
+{
+ // Ordering for ALSA ports in the list:
+ //
+ // * Hardware ports (client id 64-127) sorted by direction
+ // (write, duplex, read) then client id then port id
+ //
+ // * Software ports (client id 128+) sorted by client id
+ // then port id
+ //
+ // * System ports (client id 0-63) sorted by client id then
+ // port id
+
+
+ // See comment in AlsaDriver::createMidiDevice -- the client
+ // numbering scheme changed in ALSA driver 1.0.11rc1.
+ // We now order:
+ //
+ // * Write-only software ports (client id 128+) sorted by client
+ // id then port id
+ //
+ // * Probable hardware ports (client id 16-127) sorted by
+ // direction (write, duplex, read) then client id (64+
+ // preferred) then port id
+ //
+ // * Read-write or read-only software ports (client id 128+)
+ // sorted by client id then port id
+ //
+ // * System ports (client id 0-15) sorted by client id then
+ // port id
+ //
+ // It's necessary to handle software ports ahead of
+ // hardware/system ports, because we want to keep all the hardware
+ // ports together (we don't want to change the priority of a
+ // hardware port relative to a software port based on its client
+ // ID) and we can't know for sure whether the 16-63 range are
+ // hardware or system ports.
+
+ enum Category {
+ WRITE_ONLY_SOFTWARE,
+ HARDWARE_PROBABLY,
+ MIXED_SOFTWARE,
+ SYSTEM
+ };
+
+ bool oldScheme = (SND_LIB_MAJOR == 0 ||
+ (SND_LIB_MAJOR == 1 &&
+ SND_LIB_MINOR == 0 &&
+ SND_LIB_SUBMINOR < 11));
+
+ Category a1cat;
+ if (a1->m_client < 16)
+ a1cat = SYSTEM;
+ else if (oldScheme && (a1->m_client < 64))
+ a1cat = SYSTEM;
+ else if (a1->m_client < 128)
+ a1cat = HARDWARE_PROBABLY;
+ else
+ a1cat = MIXED_SOFTWARE;
+
+ if (a1cat == MIXED_SOFTWARE) {
+ if (a1->m_direction == WriteOnly)
+ a1cat = WRITE_ONLY_SOFTWARE;
+ }
+
+ Category a2cat;
+ if (a2->m_client < 16)
+ a2cat = SYSTEM;
+ else if (oldScheme && (a2->m_client < 64))
+ a2cat = SYSTEM;
+ else if (a2->m_client < 128)
+ a2cat = HARDWARE_PROBABLY;
+ else
+ a2cat = MIXED_SOFTWARE;
+
+ if (a2cat == MIXED_SOFTWARE) {
+ if (a2->m_direction == WriteOnly)
+ a2cat = WRITE_ONLY_SOFTWARE;
+ }
+
+ if (a1cat != a2cat)
+ return int(a1cat) < int(a2cat);
+
+ if (a1cat == HARDWARE_PROBABLY) {
+
+ if (a1->m_direction == WriteOnly) {
+ if (a2->m_direction != WriteOnly)
+ return true;
+ } else if (a1->m_direction == Duplex) {
+ if (a2->m_direction == ReadOnly)
+ return true;
+ }
+
+ int c1 = a1->m_client;
+ int c2 = a2->m_client;
+ if (c1 < 64)
+ c1 += 1000;
+ if (c2 < 64)
+ c2 += 1000;
+ if (c1 != c2)
+ return c1 < c2;
+
+ } else if (a1cat == SYSTEM) {
+
+ int c1 = a1->m_client;
+ int c2 = a2->m_client;
+ if (c1 < 16)
+ c1 += 1000;
+ if (c2 < 16)
+ c2 += 1000;
+ if (c1 != c2)
+ return c1 < c2;
+ }
+
+ if (a1->m_client != a2->m_client) {
+ return a1->m_client < a2->m_client;
+ } else {
+ return a1->m_port < a2->m_port;
+ }
+}
+
+}
+
+#endif // HAVE_ALSA
diff --git a/src/sound/AlsaPort.h b/src/sound/AlsaPort.h
new file mode 100644
index 0000000..39cf009
--- /dev/null
+++ b/src/sound/AlsaPort.h
@@ -0,0 +1,86 @@
+// -*- c-indentation-style:"stroustrup" c-basic-offset: 4 -*-
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include <vector>
+#include <set>
+#include "Instrument.h"
+#include "MappedCommon.h"
+
+#ifndef _ALSAPORT_H_
+#define _ALSAPORT_H_
+
+#ifdef HAVE_ALSA
+#include <alsa/asoundlib.h> // ALSA
+
+namespace Rosegarden
+{
+
+typedef std::pair<int, int> ClientPortPair;
+
+// Use this to hold all client information so that we can sort it
+// before generating devices - we want to put non-duplex devices
+// at the front of any device list (makes thing much easier at the
+// GUI and we already have some backwards compatability issues with
+// this).
+//
+class AlsaPortDescription
+{
+public:
+ AlsaPortDescription(Instrument::InstrumentType type,
+ const std::string &name,
+ int client,
+ int port,
+ unsigned int clientType,
+ unsigned int portType,
+ unsigned int capability,
+ PortDirection direction);
+
+ Instrument::InstrumentType m_type;
+ std::string m_name;
+ int m_client;
+ int m_port;
+ unsigned int m_clientType;
+ unsigned int m_portType;
+ unsigned int m_capability;
+ PortDirection m_direction; // or can deduce from capability
+
+ bool isReadable() { return m_direction == ReadOnly ||
+ m_direction == Duplex; }
+
+ bool isWriteable() { return m_direction == WriteOnly ||
+ m_direction == Duplex; }
+
+};
+
+// Sort by checking direction
+//
+struct AlsaPortCmp
+{
+ bool operator()(AlsaPortDescription *a1,
+ AlsaPortDescription *a2);
+};
+
+
+}
+
+#endif // HAVE_ALSA
+
+#endif // _RG_ALSA_PORT_H_
+
diff --git a/src/sound/AudioCache.cpp b/src/sound/AudioCache.cpp
new file mode 100644
index 0000000..e1e9000
--- /dev/null
+++ b/src/sound/AudioCache.cpp
@@ -0,0 +1,139 @@
+
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include "AudioCache.h"
+#include <iostream>
+
+//#define DEBUG_AUDIO_CACHE 1
+
+namespace Rosegarden
+{
+
+AudioCache::~AudioCache()
+{
+ clear();
+}
+
+bool
+AudioCache::has(void *index)
+{
+ return m_cache.find(index) != m_cache.end();
+}
+
+float **
+AudioCache::getData(void *index, size_t &channels, size_t &frames)
+{
+ if (m_cache.find(index) == m_cache.end())
+ return 0;
+ CacheRec *rec = m_cache[index];
+ channels = rec->channels;
+ frames = rec->nframes;
+ return rec->data;
+}
+
+void
+AudioCache::addData(void *index, size_t channels, size_t nframes, float **data)
+{
+#ifdef DEBUG_AUDIO_CACHE
+ std::cerr << "AudioCache::addData(" << index << ")" << std::endl;
+#endif
+
+ if (m_cache.find(index) != m_cache.end()) {
+ std::cerr << "WARNING: AudioCache::addData(" << index << ", "
+ << channels << ", " << nframes
+ << ": already cached" << std::endl;
+ return ;
+ }
+
+ m_cache[index] = new CacheRec(data, channels, nframes);
+}
+
+void
+AudioCache::incrementReference(void *index)
+{
+ if (m_cache.find(index) == m_cache.end()) {
+ std::cerr << "WARNING: AudioCache::incrementReference(" << index
+ << "): not found" << std::endl;
+ return ;
+ }
+ ++m_cache[index]->refCount;
+
+#ifdef DEBUG_AUDIO_CACHE
+
+ std::cerr << "AudioCache::incrementReference(" << index << ") [to " << (m_cache[index]->refCount) << "]" << std::endl;
+#endif
+}
+
+void
+AudioCache::decrementReference(void *index)
+{
+ std::map<void *, CacheRec *>::iterator i = m_cache.find(index);
+
+ if (i == m_cache.end()) {
+ std::cerr << "WARNING: AudioCache::decrementReference(" << index
+ << "): not found" << std::endl;
+ return ;
+ }
+ if (i->second->refCount <= 1) {
+ delete i->second;
+ m_cache.erase(i);
+#ifdef DEBUG_AUDIO_CACHE
+
+ std::cerr << "AudioCache::decrementReference(" << index << ") [deleting]" << std::endl;
+#endif
+
+ } else {
+ --i->second->refCount;
+#ifdef DEBUG_AUDIO_CACHE
+
+ std::cerr << "AudioCache::decrementReference(" << index << ") [to " << (m_cache[index]->refCount) << "]" << std::endl;
+#endif
+
+ }
+}
+
+void
+AudioCache::clear()
+{
+#ifdef DEBUG_AUDIO_CACHE
+ std::cerr << "AudioCache::clear()" << std::endl;
+#endif
+
+ for (std::map<void *, CacheRec *>::iterator i = m_cache.begin();
+ i != m_cache.end(); ++i) {
+ if (i->second->refCount > 0) {
+ std::cerr << "WARNING: AudioCache::clear: deleting cached data with refCount " << i->second->refCount << std::endl;
+ }
+ }
+ m_cache.clear();
+}
+
+AudioCache::CacheRec::~CacheRec()
+{
+ for (size_t j = 0; j < channels; ++j)
+ delete[] data[j];
+ delete[] data;
+}
+
+}
+
+
diff --git a/src/sound/AudioCache.h b/src/sound/AudioCache.h
new file mode 100644
index 0000000..6dd55ff
--- /dev/null
+++ b/src/sound/AudioCache.h
@@ -0,0 +1,98 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _AUDIO_CACHE_H_
+#define _AUDIO_CACHE_H_
+
+#include <map>
+
+namespace Rosegarden
+{
+
+/**
+ * A simple cache for smallish bits of audio data, indexed by some
+ * opaque pointer type. (The PlayableAudioFile uses this with an
+ * AudioFile* index type, for example.) With reference counting.
+ */
+
+class AudioCache
+{
+public:
+ AudioCache() { }
+ virtual ~AudioCache();
+
+ /**
+ * Look some audio data up in the cache and report whether it
+ * exists.
+ */
+ bool has(void *index);
+
+ /**
+ * Look some audio data up in the cache and return it if it
+ * exists, returning the number of channels in channels, the frame
+ * count in frames, and one pointer per channel to samples in the
+ * return value. Return 0 if the data is not in cache. Does not
+ * affect the reference count. Ownership of the returned data
+ * remains with the cache object. You should not call this unless
+ * you have already called incrementReference (or addData) to
+ * register your interest.
+ */
+ float **getData(void *index, size_t &channels, size_t &frames);
+
+ /**
+ * Add a piece of data to the cache, and increment the reference
+ * count for that data (to 1). Ownership of the data is passed
+ * to the cache, which will delete it with delete[] when done.
+ */
+ void addData(void *index, size_t channels, size_t nframes, float **data);
+
+ /**
+ * Increment the reference count for a given piece of data.
+ */
+ void incrementReference(void *index);
+
+ /**
+ * Decrement the reference count for a given piece of data,
+ * and delete the data from the cache if the reference count has
+ * reached zero.
+ */
+ void decrementReference(void *index);
+
+protected:
+ void clear();
+
+ struct CacheRec {
+ CacheRec() : data(0), channels(0), nframes(0), refCount(0) { }
+ CacheRec(float **d, size_t c, size_t n) :
+ data(d), channels(c), nframes(n), refCount(1) { }
+ ~CacheRec();
+ float **data;
+ size_t channels;
+ size_t nframes;
+ int refCount;
+ };
+
+ std::map<void *, CacheRec *> m_cache;
+};
+
+}
+
+#endif
diff --git a/src/sound/AudioFile.cpp b/src/sound/AudioFile.cpp
new file mode 100644
index 0000000..6eba15a
--- /dev/null
+++ b/src/sound/AudioFile.cpp
@@ -0,0 +1,75 @@
+// -*- c-indentation-style:"stroustrup" c-basic-offset: 4 -*-
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "AudioFile.h"
+
+namespace Rosegarden
+
+{
+
+AudioFile::AudioFile(unsigned int id,
+ const std::string &name,
+ const std::string &fileName):
+ SoundFile(fileName),
+ m_type(UNKNOWN),
+ m_id(id),
+ m_name(name),
+ m_bitsPerSample(0),
+ m_sampleRate(0),
+ m_channels(0),
+ m_dataChunkIndex( -1)
+{
+ m_fileInfo = new QFileInfo(QString(fileName.c_str()));
+}
+
+AudioFile::AudioFile(const std::string &fileName,
+ unsigned int channels = 1,
+ unsigned int sampleRate = 48000,
+ unsigned int bitsPerSample = 16):
+ SoundFile(fileName),
+ m_type(UNKNOWN),
+ m_id(0),
+ m_name(""),
+ m_bitsPerSample(bitsPerSample),
+ m_sampleRate(sampleRate),
+ m_channels(channels),
+ m_dataChunkIndex( -1)
+{
+ m_fileInfo = new QFileInfo(QString(fileName.c_str()));
+}
+
+AudioFile::~AudioFile()
+{
+ delete m_fileInfo;
+}
+
+QDateTime
+AudioFile::getModificationDateTime()
+{
+ if (m_fileInfo)
+ return m_fileInfo->lastModified();
+ else
+ return QDateTime();
+}
+
+
+}
+
diff --git a/src/sound/AudioFile.h b/src/sound/AudioFile.h
new file mode 100644
index 0000000..1acbe61
--- /dev/null
+++ b/src/sound/AudioFile.h
@@ -0,0 +1,216 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#ifndef _AUDIOFILE_H_
+#define _AUDIOFILE_H_
+
+#include <string>
+#include <vector>
+#include <cmath>
+
+#include <qfileinfo.h>
+
+#include "SoundFile.h"
+#include "RealTime.h"
+
+// An AudioFile maintains information pertaining to an audio sample.
+// This is an abstract base class from which we derive our actual
+// AudioFile types - WAV, BWF, AIFF etc.
+//
+//
+
+namespace Rosegarden
+{
+
+typedef unsigned int AudioFileId;
+
+// The different types of audio file we support.
+//
+typedef enum
+{
+
+ UNKNOWN, // not yet known
+ WAV, // RIFF (Resource Interchange File Format) wav file
+ BWF, // RIFF Broadcast Wave File
+ AIFF, // Audio Interchange File Format
+ MP3
+
+} AudioFileType;
+
+class AudioFile : public SoundFile
+{
+public:
+ // The "read" constructor - open a file
+ // an assign a name and id to it.
+ //
+ AudioFile(AudioFileId id,
+ const std::string &name,
+ const std::string &fileName);
+
+ // The "write" constructor - we only need to
+ // specify a filename and some parameters and
+ // then write it out.
+ //
+ AudioFile(const std::string &fileName,
+ unsigned int channels,
+ unsigned int sampleRate,
+ unsigned int bitsPerSample);
+
+ ~AudioFile();
+
+ // Id of this audio file (used by AudioFileManager)
+ //
+ void setId(AudioFileId id) { m_id = id; }
+ AudioFileId getId() const { return m_id; }
+
+ // Name of this sample - in addition to a filename
+ //
+ void setName(const std::string &name) { m_name = name; }
+ std::string getName() const { return m_name; }
+
+ // Used for waveform interpolation at a point
+ //
+ float sinc(float value) { return sin(M_PI * value)/ M_PI * value; }
+
+ // Audio file identifier - set in constructor of file type
+ //
+ AudioFileType getType() const { return m_type; }
+
+ unsigned int getBitsPerSample() const { return m_bitsPerSample; }
+ unsigned int getSampleRate() const { return m_sampleRate; }
+ unsigned int getChannels() const { return m_channels; }
+
+ // We must continue our main control abstract methods from SoundFile
+ // and add our own close() method that will add any relevant header
+ // information to an audio file that has been written and is now
+ // being closed.
+ //
+ virtual bool open() = 0;
+ virtual bool write() = 0;
+ virtual void close() = 0;
+
+ // Show the information we have on this file
+ //
+ virtual void printStats() = 0;
+
+ // Move file pointer to relative time in data chunk - shouldn't be
+ // less than zero. Returns true if the scan time was valid and
+ // successful. Need two interfaces because when playing we use an
+ // external file handle (one per playback instance - PlayableAudioFile)
+ //
+ virtual bool scanTo(const RealTime &time) = 0;
+ virtual bool scanTo(std::ifstream *file, const RealTime &time) = 0;
+
+ // Scan forward in a file by a certain amount of time - same
+ // double interface (simple one for peak file generation, other
+ // for playback).
+ //
+ virtual bool scanForward(const RealTime &time) = 0;
+ virtual bool scanForward(std::ifstream *file, const RealTime &time) = 0;
+
+ // Return a number of samples - caller will have to
+ // de-interleave n-channel samples themselves.
+ //
+ virtual std::string getSampleFrames(std::ifstream *file,
+ unsigned int frames) = 0;
+
+ // Return a number of samples - caller will have to
+ // de-interleave n-channel samples themselves. Place
+ // results in buf, return actual number of frames read.
+ //
+ virtual unsigned int getSampleFrames(std::ifstream *file,
+ char *buf,
+ unsigned int frames) = 0;
+
+ // Return a number of (possibly) interleaved samples
+ // over a time slice from current file pointer position.
+ //
+ virtual std::string getSampleFrameSlice(std::ifstream *file,
+ const RealTime &time) = 0;
+
+ // Append a string of samples to an already open (for writing)
+ // audio file. Caller must have interleaved samples etc.
+ //
+ virtual bool appendSamples(const std::string &buffer) = 0;
+
+ // Append a string of samples to an already open (for writing)
+ // audio file. Caller must have interleaved samples etc.
+ //
+ virtual bool appendSamples(const char *buffer, unsigned int frames) = 0;
+
+ // Get the length of the sample file in RealTime
+ //
+ virtual RealTime getLength() = 0;
+
+ // Offset to start of sample data
+ //
+ virtual std::streampos getDataOffset() = 0;
+
+ // Return the peak file name
+ //
+ virtual std::string getPeakFilename() = 0;
+
+ // Return the modification timestamp
+ //
+ QDateTime getModificationDateTime();
+
+ // Implement in actual file type
+ //
+ virtual unsigned int getBytesPerFrame() = 0;
+
+ // Decode and de-interleave the given samples that were retrieved
+ // from this file or another with the same format as it. Place
+ // the results in the given float buffer. Return true for
+ // success. This function does crappy resampling if necessary.
+ //
+ virtual bool decode(const unsigned char *sourceData,
+ size_t sourceBytes,
+ size_t targetSampleRate,
+ size_t targetChannels,
+ size_t targetFrames,
+ std::vector<float *> &targetData,
+ bool addToResultBuffers = false) = 0;
+
+protected:
+
+ AudioFileType m_type; // AudioFile type
+ AudioFileId m_id; // AudioFile ID
+ std::string m_name; // AudioFile name (not filename)
+
+ unsigned int m_bitsPerSample;
+ unsigned int m_sampleRate;
+ unsigned int m_channels;
+
+ // How many bytes do we read before we get to the data?
+ // Could be huge so we make it a long long. -1 means it
+ // hasn't been set yet.
+ //
+ long long m_dataChunkIndex;
+
+ QFileInfo *m_fileInfo;
+
+};
+
+}
+
+
+#endif // _AUDIOFILE_H_
diff --git a/src/sound/AudioFileManager.cpp b/src/sound/AudioFileManager.cpp
new file mode 100644
index 0000000..93be26c
--- /dev/null
+++ b/src/sound/AudioFileManager.cpp
@@ -0,0 +1,1257 @@
+// -*- c-indentation-style:"stroustrup" c-basic-offset: 4 -*-
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include <iostream>
+#include <kapplication.h>
+#include <fstream>
+#include <string>
+#include <dirent.h> // for new recording file
+#include <cstdio> // sprintf
+#include <cstdlib>
+#include <pthread.h>
+
+#if (__GNUC__ < 3)
+#include <strstream>
+#define stringstream strstream
+#else
+#include <sstream>
+#endif
+
+#include <kapp.h>
+#include <klocale.h>
+#include <kprocess.h>
+#include <kio/netaccess.h>
+#include <kmessagebox.h>
+
+#include <qpixmap.h>
+#include <qpainter.h>
+#include <qdatetime.h>
+#include <qfile.h>
+
+#include "AudioFile.h"
+#include "AudioFileManager.h"
+#include "WAVAudioFile.h"
+#include "BWFAudioFile.h"
+#include "MP3AudioFile.h"
+#include "misc/Strings.h"
+
+namespace Rosegarden
+{
+
+static pthread_mutex_t _audioFileManagerLock;
+
+class MutexLock
+{
+public:
+ MutexLock(pthread_mutex_t *mutex) : m_mutex(mutex)
+ {
+ pthread_mutex_lock(m_mutex);
+ }
+ ~MutexLock()
+ {
+ pthread_mutex_unlock(m_mutex);
+ }
+private:
+ pthread_mutex_t *m_mutex;
+};
+
+AudioFileManager::AudioFileManager() :
+ m_importProcess(0),
+ m_expectedSampleRate(0)
+{
+ pthread_mutexattr_t attr;
+ pthread_mutexattr_init(&attr);
+#ifdef HAVE_PTHREAD_MUTEX_RECURSIVE
+
+ pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
+#else
+#ifdef PTHREAD_MUTEX_RECURSIVE
+
+ pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
+#else
+
+ pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE_NP);
+#endif
+#endif
+
+ pthread_mutex_init(&_audioFileManagerLock, &attr);
+
+ // Set this through the set method so that the tilde gets
+ // shaken out.
+ //
+ setAudioPath("~/rosegarden");
+
+ // Retransmit progress
+ //
+ connect(&m_peakManager, SIGNAL(setProgress(int)),
+ this, SIGNAL(setProgress(int)));
+}
+
+AudioFileManager::~AudioFileManager()
+{
+ clear();
+}
+
+// Add a file from an absolute path
+//
+AudioFileId
+AudioFileManager::addFile(const std::string &filePath)
+{
+ MutexLock lock (&_audioFileManagerLock)
+ ;
+
+ QString ext;
+
+ if (filePath.length() > 3) {
+ ext = QString(filePath.substr(filePath.length() - 3, 3).c_str()).lower();
+ }
+
+ // Check for file existing already in manager by path
+ //
+ int check = fileExists(filePath);
+ if (check != -1) {
+ return AudioFileId(check);
+ }
+
+ // prepare for audio file
+ AudioFile *aF = 0;
+ AudioFileId id = getFirstUnusedID();
+
+ if (ext == "wav") {
+ // identify file type
+ AudioFileType subType = RIFFAudioFile::identifySubType(filePath);
+
+ if (subType == BWF) {
+#ifdef DEBUG_AUDIOFILEMANAGER
+ std::cout << "FOUND BWF" << std::endl;
+#endif
+
+ try {
+ aF = new BWFAudioFile(id, getShortFilename(filePath), filePath);
+ } catch (SoundFile::BadSoundFileException e) {
+ delete aF;
+ throw BadAudioPathException(e);
+ }
+ } else if (subType == WAV) {
+ try {
+ aF = new WAVAudioFile(id, getShortFilename(filePath), filePath);
+ } catch (SoundFile::BadSoundFileException e) {
+ delete aF;
+ throw BadAudioPathException(e);
+ }
+ }
+
+ // Ensure we have a valid file handle
+ //
+ if (aF == 0) {
+ std::cerr << "AudioFileManager: Unknown WAV audio file subtype in " << filePath << std::endl;
+ throw BadAudioPathException(filePath, __FILE__, __LINE__);
+ }
+
+ // Add file type on extension
+ try {
+ if (aF->open() == false) {
+ delete aF;
+ std::cerr << "AudioFileManager: Malformed audio file in " << filePath << std::endl;
+ throw BadAudioPathException(filePath, __FILE__, __LINE__);
+ }
+ } catch (SoundFile::BadSoundFileException e) {
+ delete aF;
+ throw BadAudioPathException(e);
+ }
+ }
+#ifdef HAVE_LIBMAD
+ else if (ext == "mp3") {
+ try {
+ aF = new MP3AudioFile(id, getShortFilename(filePath), filePath);
+
+ if (aF->open() == false) {
+ delete aF;
+ std::cerr << "AudioFileManager: Malformed mp3 audio file in " << filePath << std::endl;
+ throw BadAudioPathException(filePath, __FILE__, __LINE__);
+ }
+ } catch (SoundFile::BadSoundFileException e) {
+ delete aF;
+ throw BadAudioPathException(e);
+ }
+ }
+#endif // HAVE_LIBMAD
+ else {
+ std::cerr << "AudioFileManager: Unsupported audio file extension in " << filePath << std::endl;
+ throw BadAudioPathException(filePath, __FILE__, __LINE__);
+ }
+
+ if (aF) {
+ m_audioFiles.push_back(aF);
+ return id;
+ }
+
+ return 0;
+}
+
+// Convert long filename to shorter version
+std::string
+AudioFileManager::getShortFilename(const std::string &fileName)
+{
+ std::string rS = fileName;
+ unsigned int pos = rS.find_last_of("/");
+
+ if (pos > 0 && ( pos + 1 ) < rS.length())
+ rS = rS.substr(pos + 1, rS.length());
+
+ return rS;
+}
+
+// Turn a long path into a directory ending with a slash
+//
+std::string
+AudioFileManager::getDirectory(const std::string &path)
+{
+ std::string rS = path;
+ unsigned int pos = rS.find_last_of("/");
+
+ if (pos > 0 && ( pos + 1 ) < rS.length())
+ rS = rS.substr(0, pos + 1);
+
+ return rS;
+}
+
+
+// Create a new AudioFile with unique ID and label - insert from
+// our RG4 file
+//
+AudioFileId
+AudioFileManager::insertFile(const std::string &name,
+ const std::string &fileName)
+{
+ MutexLock lock (&_audioFileManagerLock)
+ ;
+
+ // first try to expand any beginning tilde
+ //
+ std::string foundFileName = substituteTildeForHome(fileName);
+
+ // If we've expanded and we can't find the file
+ // then try to find it in audio file directory.
+ //
+ QFileInfo info(foundFileName.c_str());
+ if (!info.exists())
+ foundFileName = getFileInPath(foundFileName);
+
+#ifdef DEBUG_AUDIOFILEMANAGER_INSERT_FILE
+
+ std::cout << "AudioFileManager::insertFile - "
+ << "expanded fileName = \""
+ << foundFileName << "\"" << std::endl;
+#endif
+
+ // bail if we haven't found any reasonable filename
+ if (foundFileName == "")
+ return false;
+
+ AudioFileId id = getFirstUnusedID();
+
+ WAVAudioFile *aF = 0;
+
+ try {
+
+ aF = new WAVAudioFile(id, name, foundFileName);
+
+ // if we don't recognise the file then don't insert it
+ //
+ if (aF->open() == false) {
+ delete aF;
+ std::cerr << "AudioFileManager::insertFile - don't recognise file type in " << foundFileName << std::endl;
+ throw BadAudioPathException(foundFileName, __FILE__, __LINE__);
+ }
+ m_audioFiles.push_back(aF);
+
+ } catch (SoundFile::BadSoundFileException e) {
+ delete aF;
+ throw BadAudioPathException(e);
+ }
+
+ return id;
+}
+
+
+bool
+AudioFileManager::removeFile(AudioFileId id)
+{
+ MutexLock lock (&_audioFileManagerLock)
+ ;
+
+ std::vector<AudioFile*>::iterator it;
+
+ for (it = m_audioFiles.begin();
+ it != m_audioFiles.end();
+ ++it) {
+ if ((*it)->getId() == id) {
+ m_peakManager.removeAudioFile(*it);
+ m_recordedAudioFiles.erase(*it);
+ m_derivedAudioFiles.erase(*it);
+ delete(*it);
+ m_audioFiles.erase(it);
+ return true;
+ }
+ }
+
+ return false;
+}
+
+AudioFileId
+AudioFileManager::getFirstUnusedID()
+{
+ AudioFileId rI = 0;
+
+ if (m_audioFiles.size() == 0)
+ return rI;
+
+ std::vector<AudioFile*>::iterator it;
+
+ for (it = m_audioFiles.begin();
+ it != m_audioFiles.end();
+ ++it) {
+ if (rI < (*it)->getId())
+ rI = (*it)->getId();
+ }
+
+ rI++;
+
+ return rI;
+}
+
+bool
+AudioFileManager::insertFile(const std::string &name,
+ const std::string &fileName,
+ AudioFileId id)
+{
+ MutexLock lock (&_audioFileManagerLock)
+ ;
+
+ // first try to expany any beginning tilde
+ std::string foundFileName = substituteTildeForHome(fileName);
+
+ // If we've expanded and we can't find the file
+ // then try to find it in audio file directory.
+ //
+ QFileInfo info(foundFileName.c_str());
+ if (!info.exists())
+ foundFileName = getFileInPath(foundFileName);
+
+#ifdef DEBUG_AUDIOFILEMANAGER_INSERT_FILE
+
+ std::cout << "AudioFileManager::insertFile - "
+ << "expanded fileName = \""
+ << foundFileName << "\"" << std::endl;
+#endif
+
+ // If no joy here then we can't find this file
+ if (foundFileName == "")
+ return false;
+
+ // make sure we don't have a file of this ID hanging around already
+ removeFile(id);
+
+ // and insert
+ WAVAudioFile *aF = 0;
+
+ try {
+
+ aF = new WAVAudioFile(id, name, foundFileName);
+
+ // Test the file
+ if (aF->open() == false) {
+ delete aF;
+ return false;
+ }
+
+ m_audioFiles.push_back(aF);
+
+ } catch (SoundFile::BadSoundFileException e) {
+ delete aF;
+ throw BadAudioPathException(e);
+ }
+
+ return true;
+}
+
+// Add a given path to our sample search path
+//
+void
+AudioFileManager::setAudioPath(const std::string &path)
+{
+ MutexLock lock (&_audioFileManagerLock)
+ ;
+
+ std::string hPath = path;
+
+ // add a trailing / if we don't have one
+ //
+ if (hPath[hPath.size() - 1] != '/')
+ hPath += std::string("/");
+
+ // get the home directory
+ if (hPath[0] == '~') {
+ hPath.erase(0, 1);
+ hPath = std::string(getenv("HOME")) + hPath;
+ }
+
+ m_audioPath = hPath;
+
+}
+
+void
+AudioFileManager::testAudioPath() throw (BadAudioPathException)
+{
+ QFileInfo info(m_audioPath.c_str());
+ if (!(info.exists() && info.isDir() && !info.isRelative() &&
+ info.isWritable() && info.isReadable()))
+ throw BadAudioPathException(m_audioPath.data());
+}
+
+
+// See if we can find a given file in our search path
+// return the first occurence of a match or the empty
+// std::string if no match.
+//
+std::string
+AudioFileManager::getFileInPath(const std::string &file)
+{
+ MutexLock lock (&_audioFileManagerLock)
+ ;
+
+ QFileInfo info(file.c_str());
+
+ if (info.exists())
+ return file;
+
+ // Build the search filename from the audio path and
+ // the file basename.
+ //
+ QString searchFile = QString(m_audioPath.c_str()) + info.fileName();
+ QFileInfo searchInfo(searchFile);
+
+ if (searchInfo.exists())
+ return searchFile.latin1();
+
+ std::cout << "AudioFileManager::getFileInPath - "
+ << "searchInfo = " << searchFile << std::endl;
+
+ return "";
+}
+
+
+// Check for file path existence
+//
+int
+AudioFileManager::fileExists(const std::string &path)
+{
+ MutexLock lock (&_audioFileManagerLock)
+ ;
+
+ std::vector<AudioFile*>::iterator it;
+
+ for (it = m_audioFiles.begin();
+ it != m_audioFiles.end();
+ ++it) {
+ if ((*it)->getFilename() == path)
+ return (*it)->getId();
+ }
+
+ return -1;
+
+}
+
+// Does a specific file id exist on the manager?
+//
+bool
+AudioFileManager::fileExists(AudioFileId id)
+{
+ MutexLock lock (&_audioFileManagerLock)
+ ;
+
+ std::vector<AudioFile*>::iterator it;
+
+ for (it = m_audioFiles.begin();
+ it != m_audioFiles.end();
+ ++it) {
+ if ((*it)->getId() == id)
+ return true;
+ }
+
+ return false;
+
+}
+
+void
+AudioFileManager::clear()
+{
+ MutexLock lock (&_audioFileManagerLock)
+ ;
+
+ std::vector<AudioFile*>::iterator it;
+
+ for (it = m_audioFiles.begin();
+ it != m_audioFiles.end();
+ ++it) {
+ m_recordedAudioFiles.erase(*it);
+ m_derivedAudioFiles.erase(*it);
+ delete(*it);
+ }
+
+ m_audioFiles.erase(m_audioFiles.begin(), m_audioFiles.end());
+
+ // Clear the PeakFileManager too
+ //
+ m_peakManager.clear();
+}
+
+AudioFile *
+AudioFileManager::createRecordingAudioFile()
+{
+ MutexLock lock (&_audioFileManagerLock)
+ ;
+
+ AudioFileId newId = getFirstUnusedID();
+ QString fileName = "";
+
+ while (fileName == "") {
+
+ fileName = QString("rg-%1-%2.wav")
+ .arg(QDateTime::currentDateTime().toString("yyyyMMdd-hhmmss"))
+ .arg(newId + 1);
+
+ if (QFile(m_audioPath.c_str() + fileName).exists()) {
+ fileName = "";
+ ++newId;
+ }
+ }
+
+ // insert file into vector
+ WAVAudioFile *aF = 0;
+
+ try {
+ aF = new WAVAudioFile(newId, fileName.data(), m_audioPath + fileName.data());
+ m_audioFiles.push_back(aF);
+ m_recordedAudioFiles.insert(aF);
+ } catch (SoundFile::BadSoundFileException e) {
+ delete aF;
+ throw BadAudioPathException(e);
+ }
+
+ return aF;
+}
+
+std::vector<std::string>
+AudioFileManager::createRecordingAudioFiles(unsigned int n)
+{
+ std::vector<std::string> v;
+ for (unsigned int i = 0; i < n; ++i) {
+ AudioFile *af = createRecordingAudioFile();
+ if (af)
+ v.push_back(m_audioPath + af->getFilename().data());
+ // !af should not happen, and we have no good recovery if it does
+ }
+ return v;
+}
+
+bool
+AudioFileManager::wasAudioFileRecentlyRecorded(AudioFileId id)
+{
+ AudioFile *file = getAudioFile(id);
+ if (file)
+ return (m_recordedAudioFiles.find(file) !=
+ m_recordedAudioFiles.end());
+ return false;
+}
+
+bool
+AudioFileManager::wasAudioFileRecentlyDerived(AudioFileId id)
+{
+ AudioFile *file = getAudioFile(id);
+ if (file)
+ return (m_derivedAudioFiles.find(file) !=
+ m_derivedAudioFiles.end());
+ return false;
+}
+
+void
+AudioFileManager::resetRecentlyCreatedFiles()
+{
+ m_recordedAudioFiles.clear();
+ m_derivedAudioFiles.clear();
+}
+
+AudioFile *
+AudioFileManager::createDerivedAudioFile(AudioFileId source,
+ const char *prefix)
+{
+ MutexLock lock (&_audioFileManagerLock);
+
+ AudioFile *sourceFile = getAudioFile(source);
+ if (!sourceFile) return 0;
+
+ AudioFileId newId = getFirstUnusedID();
+ QString fileName = "";
+
+ std::string sourceBase = sourceFile->getShortFilename();
+ if (sourceBase.length() > 4 && sourceBase.substr(0, 3) == "rg-") {
+ sourceBase = sourceBase.substr(3);
+ }
+ if (sourceBase.length() > 15) sourceBase = sourceBase.substr(0, 15);
+
+ while (fileName == "") {
+
+ fileName = QString("%1-%2-%3-%4.wav")
+ .arg(prefix)
+ .arg(sourceBase)
+ .arg(QDateTime::currentDateTime().toString("yyyyMMdd-hhmmss"))
+ .arg(newId + 1);
+
+ if (QFile(m_audioPath.c_str() + fileName).exists()) {
+ fileName = "";
+ ++newId;
+ }
+ }
+
+ // insert file into vector
+ WAVAudioFile *aF = 0;
+
+ try {
+ aF = new WAVAudioFile(newId,
+ fileName.data(),
+ m_audioPath + fileName.data());
+ m_audioFiles.push_back(aF);
+ m_derivedAudioFiles.insert(aF);
+ } catch (SoundFile::BadSoundFileException e) {
+ delete aF;
+ throw BadAudioPathException(e);
+ }
+
+ return aF;
+}
+
+AudioFileId
+AudioFileManager::importURL(const KURL &url, int sampleRate)
+{
+ if (url.isLocalFile()) return importFile(url.path(), sampleRate);
+
+ std::cerr << "AudioFileManager::importURL("<< url.prettyURL() << ", " << sampleRate << ")" << std::endl;
+
+ emit setOperationName(i18n("Downloading file %1").arg(url.prettyURL()));
+
+ QString localPath = "";
+ if (!KIO::NetAccess::download(url, localPath)) {
+ KMessageBox::error(0, i18n("Cannot download file %1").arg(url.prettyURL()));
+ throw SoundFile::BadSoundFileException(url.prettyURL());
+ }
+
+ AudioFileId id = 0;
+
+ try {
+ id = importFile(localPath.data(), sampleRate);
+ } catch (BadAudioPathException ape) {
+ KIO::NetAccess::removeTempFile(localPath);
+ throw ape;
+ } catch (SoundFile::BadSoundFileException bse) {
+ KIO::NetAccess::removeTempFile(localPath);
+ throw bse;
+ }
+
+ return id;
+}
+
+bool
+AudioFileManager::fileNeedsConversion(const std::string &fileName,
+ int sampleRate)
+{
+ KProcess *proc = new KProcess();
+ *proc << "rosegarden-audiofile-importer";
+ if (sampleRate > 0) {
+ *proc << "-r";
+ *proc << QString("%1").arg(sampleRate);
+ }
+ *proc << "-w";
+ *proc << fileName.c_str();
+
+ proc->start(KProcess::Block, KProcess::NoCommunication);
+
+ int es = proc->exitStatus();
+ delete proc;
+
+ if (es == 0 || es == 1) { // 1 == "other error" -- wouldn't be able to convert
+ return false;
+ }
+ return true;
+}
+
+AudioFileId
+AudioFileManager::importFile(const std::string &fileName, int sampleRate)
+{
+ MutexLock lock (&_audioFileManagerLock);
+
+ std::cerr << "AudioFileManager::importFile("<< fileName << ", " << sampleRate << ")" << std::endl;
+
+ KProcess *proc = new KProcess();
+ *proc << "rosegarden-audiofile-importer";
+ if (sampleRate > 0) {
+ *proc << "-r";
+ *proc << QString("%1").arg(sampleRate);
+ }
+ *proc << "-w";
+ *proc << fileName.c_str();
+
+ proc->start(KProcess::Block, KProcess::NoCommunication);
+
+ int es = proc->exitStatus();
+ delete proc;
+
+ if (es == 0) {
+ AudioFileId id = addFile(fileName);
+ m_expectedSampleRate = sampleRate;
+ return id;
+ }
+
+ if (es == 2) {
+ emit setOperationName(i18n("Converting audio file..."));
+ } else if (es == 3) {
+ emit setOperationName(i18n("Resampling audio file..."));
+ } else if (es == 4) {
+ emit setOperationName(i18n("Converting and resampling audio file..."));
+ } else {
+ emit setOperationName(i18n("Importing audio file..."));
+ }
+
+ AudioFileId newId = getFirstUnusedID();
+ QString targetName = "";
+
+ QString sourceBase = QFileInfo(fileName.c_str()).baseName();
+ if (sourceBase.length() > 3 && sourceBase.startsWith("rg-")) {
+ sourceBase = sourceBase.right(sourceBase.length() - 3);
+ }
+ if (sourceBase.length() > 15) sourceBase = sourceBase.left(15);
+
+ while (targetName == "") {
+
+ targetName = QString("conv-%2-%3-%4.wav")
+ .arg(sourceBase)
+ .arg(QDateTime::currentDateTime().toString("yyyyMMdd-hhmmss"))
+ .arg(newId + 1);
+
+ if (QFile(m_audioPath.c_str() + targetName).exists()) {
+ targetName = "";
+ ++newId;
+ }
+ }
+
+ m_importProcess = new KProcess;
+
+ *m_importProcess << "rosegarden-audiofile-importer";
+ if (sampleRate > 0) {
+ *m_importProcess << "-r";
+ *m_importProcess << QString("%1").arg(sampleRate);
+ }
+ *m_importProcess << "-c";
+ *m_importProcess << fileName.c_str();
+ *m_importProcess << (m_audioPath.c_str() + targetName);
+
+ m_importProcess->start(KProcess::NotifyOnExit, KProcess::NoCommunication);
+
+ while (m_importProcess->isRunning()) {
+ kapp->processEvents(100);
+ }
+
+ if (!m_importProcess->normalExit()) {
+ // interrupted
+ throw SoundFile::BadSoundFileException(fileName, "Import cancelled");
+ }
+
+ es = m_importProcess->exitStatus();
+ delete m_importProcess;
+ m_importProcess = 0;
+
+ if (es) {
+ std::cerr << "audio file importer failed" << std::endl;
+ throw SoundFile::BadSoundFileException(fileName, i18n("Failed to convert or resample audio file on import"));
+ } else {
+ std::cerr << "audio file importer succeeded" << std::endl;
+ }
+
+ // insert file into vector
+ WAVAudioFile *aF = 0;
+
+ aF = new WAVAudioFile(newId,
+ targetName.data(),
+ m_audioPath + targetName.data());
+ m_audioFiles.push_back(aF);
+ m_derivedAudioFiles.insert(aF);
+ // Don't catch SoundFile::BadSoundFileException
+
+ m_expectedSampleRate = sampleRate;
+
+ return aF->getId();
+}
+
+void
+AudioFileManager::slotStopImport()
+{
+ if (m_importProcess) {
+ m_importProcess->kill(SIGTERM);
+ sleep(1);
+ m_importProcess->kill(SIGKILL);
+ }
+}
+
+AudioFile*
+AudioFileManager::getLastAudioFile()
+{
+ MutexLock lock (&_audioFileManagerLock)
+ ;
+
+ std::vector<AudioFile*>::iterator it = m_audioFiles.begin();
+ AudioFile* audioFile = 0;
+
+ while (it != m_audioFiles.end()) {
+ audioFile = (*it);
+ it++;
+ }
+
+ return audioFile;
+}
+
+std::string
+AudioFileManager::substituteHomeForTilde(const std::string &path)
+{
+ std::string rS = path;
+ std::string homePath = std::string(getenv("HOME"));
+
+ // if path length is less than homePath then just return unchanged
+ if (rS.length() < homePath.length())
+ return rS;
+
+ // if the first section matches the path then substitute
+ if (rS.substr(0, homePath.length()) == homePath) {
+ rS.erase(0, homePath.length());
+ rS = "~" + rS;
+ }
+
+ return rS;
+}
+
+std::string
+AudioFileManager::substituteTildeForHome(const std::string &path)
+{
+ std::string rS = path;
+ std::string homePath = std::string(getenv("HOME"));
+
+ if (rS.substr(0, 2) == std::string("~/")) {
+ rS.erase(0, 1); // erase tilde and prepend HOME env
+ rS = homePath + rS;
+ }
+
+ return rS;
+}
+
+
+
+// Export audio files and assorted bits and bobs - make sure
+// that we store the files in a format that's user independent
+// so that people can pack up and swap their songs (including
+// audio files) and shift them about easily.
+//
+std::string
+AudioFileManager::toXmlString()
+{
+ MutexLock lock (&_audioFileManagerLock)
+ ;
+
+ std::stringstream audioFiles;
+ std::string audioPath = substituteHomeForTilde(m_audioPath);
+
+ audioFiles << "<audiofiles";
+ if (m_expectedSampleRate != 0) {
+ audioFiles << " expectedRate=\"" << m_expectedSampleRate << "\"";
+ }
+ audioFiles << ">" << std::endl;
+ audioFiles << " <audioPath value=\""
+ << audioPath << "\"/>" << std::endl;
+
+ std::string fileName;
+ std::vector<AudioFile*>::iterator it;
+
+ for (it = m_audioFiles.begin(); it != m_audioFiles.end(); ++it) {
+ fileName = (*it)->getFilename();
+
+ // attempt two substitutions - If the prefix to the filename
+ // is the same as the audio path then we can dock the prefix
+ // as it'll be added again next time. If the path doesn't
+ // have the audio path in it but has our home directory in it
+ // then swap this out for a tilde '~'
+ //
+#ifdef DEBUG_AUDIOFILEMANAGER
+
+ std::cout << "DIR = " << getDirectory(fileName) << " : "
+ " PATH = " << m_audioPath << std::endl;
+#endif
+
+ if (getDirectory(fileName) == m_audioPath)
+ fileName = getShortFilename(fileName);
+ else
+ fileName = substituteHomeForTilde(fileName);
+
+ audioFiles << " <audio id=\""
+ << (*it)->getId()
+ << "\" file=\""
+ << fileName
+ << "\" label=\""
+ << encode((*it)->getName())
+ << "\"/>" << std::endl;
+ }
+
+ audioFiles << "</audiofiles>" << std::endl;
+
+#if (__GNUC__ < 3)
+
+ audioFiles << std::ends;
+#else
+
+ audioFiles << std::endl;
+#endif
+
+ return audioFiles.str();
+}
+
+// Generate preview peak files or peak chunks according
+// to file type.
+//
+void
+AudioFileManager::generatePreviews()
+{
+ MutexLock lock (&_audioFileManagerLock)
+ ;
+
+#ifdef DEBUG_AUDIOFILEMANAGER
+
+ std::cout << "AudioFileManager::generatePreviews - "
+ << "for " << m_audioFiles.size() << " files"
+ << std::endl;
+#endif
+
+
+ // Generate peaks if we need to
+ //
+ std::vector<AudioFile*>::iterator it;
+ for (it = m_audioFiles.begin(); it != m_audioFiles.end(); ++it) {
+ if (!m_peakManager.hasValidPeaks(*it))
+ m_peakManager.generatePeaks(*it, 1);
+ }
+}
+
+// Attempt to stop a preview
+//
+void
+AudioFileManager::slotStopPreview()
+{
+ MutexLock lock (&_audioFileManagerLock);
+ m_peakManager.stopPreview();
+}
+
+
+// Generate a preview for a specific audio file - say if
+// one has just been added to the AudioFileManager.
+// Also used for generating previews if the file has been
+// modified.
+//
+bool
+AudioFileManager::generatePreview(AudioFileId id)
+{
+ MutexLock lock (&_audioFileManagerLock)
+ ;
+
+ AudioFile *audioFile = getAudioFile(id);
+
+ if (audioFile == 0)
+ return false;
+
+ if (!m_peakManager.hasValidPeaks(audioFile))
+ m_peakManager.generatePeaks(audioFile, 1);
+
+ return true;
+}
+
+AudioFile*
+AudioFileManager::getAudioFile(AudioFileId id)
+{
+ MutexLock lock (&_audioFileManagerLock)
+ ;
+
+ std::vector<AudioFile*>::iterator it;
+
+ for (it = m_audioFiles.begin();
+ it != m_audioFiles.end();
+ it++) {
+ if ((*it)->getId() == id)
+ return (*it);
+ }
+ return 0;
+}
+
+std::vector<float>
+AudioFileManager::getPreview(AudioFileId id,
+ const RealTime &startTime,
+ const RealTime &endTime,
+ int width,
+ bool withMinima)
+{
+ MutexLock lock (&_audioFileManagerLock)
+ ;
+
+ AudioFile *audioFile = getAudioFile(id);
+
+ if (audioFile == 0) {
+ return std::vector<float>();
+ }
+
+ if (!m_peakManager.hasValidPeaks(audioFile)) {
+ std::cerr << "AudioFileManager::getPreview: No peaks for audio file " << audioFile->getFilename() << std::endl;
+ throw PeakFileManager::BadPeakFileException
+ (audioFile->getFilename(), __FILE__, __LINE__);
+ }
+
+ return m_peakManager.getPreview(audioFile,
+ startTime,
+ endTime,
+ width,
+ withMinima);
+}
+
+void
+AudioFileManager::drawPreview(AudioFileId id,
+ const RealTime &startTime,
+ const RealTime &endTime,
+ QPixmap *pixmap)
+{
+ MutexLock lock (&_audioFileManagerLock)
+ ;
+
+ AudioFile *audioFile = getAudioFile(id);
+ if (!audioFile)
+ return ;
+
+ if (!m_peakManager.hasValidPeaks(audioFile)) {
+ std::cerr << "AudioFileManager::getPreview: No peaks for audio file " << audioFile->getFilename() << std::endl;
+ throw PeakFileManager::BadPeakFileException
+ (audioFile->getFilename(), __FILE__, __LINE__);
+ }
+
+ std::vector<float> values = m_peakManager.getPreview
+ (audioFile,
+ startTime,
+ endTime,
+ pixmap->width(),
+ false);
+
+ QPainter painter(pixmap);
+ pixmap->fill(kapp->palette().color(QPalette::Active,
+ QColorGroup::Base));
+ painter.setPen(kapp->palette().color(QPalette::Active,
+ QColorGroup::Dark));
+
+ if (values.size() == 0) {
+#ifdef DEBUG_AUDIOFILEMANAGER
+ std::cerr << "AudioFileManager::drawPreview - "
+ << "no preview values returned!" << std::endl;
+#endif
+
+ return ;
+ }
+
+ float yStep = pixmap->height() / 2;
+ int channels = audioFile->getChannels();
+ float ch1Value, ch2Value;
+
+ if (channels == 0) {
+#ifdef DEBUG_AUDIOFILEMANAGER
+ std::cerr << "AudioFileManager::drawPreview - "
+ << "no channels in audio file!" << std::endl;
+#endif
+
+ return ;
+ }
+
+
+ // Render pixmap
+ //
+ for (int i = 0; i < pixmap->width(); i++) {
+ // Always get two values for our pixmap no matter how many
+ // channels in AudioFile as that's all we can display.
+ //
+ if (channels == 1) {
+ ch1Value = values[i];
+ ch2Value = values[i];
+ } else {
+ ch1Value = values[i * channels];
+ ch2Value = values[i * channels + 1];
+ }
+
+ painter.drawLine(i, static_cast<int>(yStep - ch1Value * yStep),
+ i, static_cast<int>(yStep + ch2Value * yStep));
+ }
+}
+
+void
+AudioFileManager::drawHighlightedPreview(AudioFileId id,
+ const RealTime &startTime,
+ const RealTime &endTime,
+ const RealTime &highlightStart,
+ const RealTime &highlightEnd,
+ QPixmap *pixmap)
+{
+ MutexLock lock (&_audioFileManagerLock)
+ ;
+
+ AudioFile *audioFile = getAudioFile(id);
+ if (!audioFile)
+ return ;
+
+ if (!m_peakManager.hasValidPeaks(audioFile)) {
+ std::cerr << "AudioFileManager::getPreview: No peaks for audio file " << audioFile->getFilename() << std::endl;
+ throw PeakFileManager::BadPeakFileException
+ (audioFile->getFilename(), __FILE__, __LINE__);
+ }
+
+ std::vector<float> values = m_peakManager.getPreview
+ (audioFile,
+ startTime,
+ endTime,
+ pixmap->width(),
+ false);
+
+ int startWidth = (int)(double(pixmap->width()) * (highlightStart /
+ (endTime - startTime)));
+ int endWidth = (int)(double(pixmap->width()) * (highlightEnd /
+ (endTime - startTime)));
+
+ QPainter painter(pixmap);
+ pixmap->fill(kapp->palette().color(QPalette::Active,
+ QColorGroup::Base));
+
+ float yStep = pixmap->height() / 2;
+ int channels = audioFile->getChannels();
+ float ch1Value, ch2Value;
+
+ // Render pixmap
+ //
+ for (int i = 0; i < pixmap->width(); ++i) {
+ if ((i * channels + (channels - 1)) >= int(values.size()))
+ break;
+
+ // Always get two values for our pixmap no matter how many
+ // channels in AudioFile as that's all we can display.
+ //
+ if (channels == 1) {
+ ch1Value = values[i];
+ ch2Value = values[i];
+ } else {
+ ch1Value = values[i * channels];
+ ch2Value = values[i * channels + 1];
+ }
+
+ if (i < startWidth || i > endWidth)
+ painter.setPen(kapp->palette().color(QPalette::Active,
+ QColorGroup::Mid));
+ else
+ painter.setPen(kapp->palette().color(QPalette::Active,
+ QColorGroup::Dark));
+
+ painter.drawLine(i, static_cast<int>(yStep - ch1Value * yStep),
+ i, static_cast<int>(yStep + ch2Value * yStep));
+ }
+}
+
+
+void
+AudioFileManager::print()
+{
+ MutexLock lock (&_audioFileManagerLock)
+ ;
+
+#ifdef DEBUG_AUDIOFILEMANAGER
+
+ std::cout << "AudioFileManager - " << m_audioFiles.size() << " entr";
+
+ if (m_audioFiles.size() == 1)
+ std::cout << "y";
+ else
+ std::cout << "ies";
+
+ std::cout << std::endl << std::endl;
+
+ std::vector<AudioFile*>::iterator it;
+ for (it = m_audioFiles.begin(); it != m_audioFiles.end(); ++it) {
+ std::cout << (*it)->getId() << " : " << (*it)->getName()
+ << " : \"" << (*it)->getFilename() << "\"" << std::endl;
+ }
+#endif
+}
+
+std::vector<SplitPointPair>
+AudioFileManager::getSplitPoints(AudioFileId id,
+ const RealTime &startTime,
+ const RealTime &endTime,
+ int threshold,
+ const RealTime &minTime)
+{
+ MutexLock lock (&_audioFileManagerLock)
+ ;
+
+ AudioFile *audioFile = getAudioFile(id);
+
+ if (audioFile == 0)
+ return std::vector<SplitPointPair>();
+
+ return m_peakManager.getSplitPoints(audioFile,
+ startTime,
+ endTime,
+ threshold,
+ minTime);
+}
+
+std::set<int>
+AudioFileManager::getActualSampleRates() const
+{
+ std::set<int> rates;
+
+ for (std::vector<AudioFile *>::const_iterator i = m_audioFiles.begin();
+ i != m_audioFiles.end(); ++i) {
+
+ unsigned int sr = (*i)->getSampleRate();
+ if (sr != 0) rates.insert(int(sr));
+ }
+
+ return rates;
+}
+
+}
+
+
+#include "AudioFileManager.moc"
diff --git a/src/sound/AudioFileManager.h b/src/sound/AudioFileManager.h
new file mode 100644
index 0000000..9721669
--- /dev/null
+++ b/src/sound/AudioFileManager.h
@@ -0,0 +1,327 @@
+// -*- c-indentation-style:"stroustrup" c-basic-offset: 4 -*-
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _AUDIOFILEMANAGER_H_
+#define _AUDIOFILEMANAGER_H_
+
+#include <string>
+#include <vector>
+#include <set>
+#include <map>
+
+#include <qpixmap.h>
+#include <qobject.h>
+
+#include "AudioFile.h"
+#include "XmlExportable.h"
+#include "PeakFileManager.h"
+#include "PeakFile.h"
+#include "Exception.h"
+
+#include <kurl.h>
+
+// AudioFileManager loads and maps audio files to their
+// internal references (ids). A point of contact for
+// AudioFile information - loading a Composition should
+// use this class to pick up the AudioFile references,
+// editing the AudioFiles in a Composition will be
+// made through this manager.
+
+// This is in the sound library because it's so closely
+// connected to other sound classes like the AudioFile
+// ones. However, the audio file manager itself within
+// Rosegarden is stored in the GUI process. This class
+// is not (and should not be) used elsewhere within the
+// sound or sequencer libraries.
+
+class KProcess;
+
+namespace Rosegarden
+{
+
+typedef std::vector<AudioFile*>::const_iterator AudioFileManagerIterator;
+
+class AudioFileManager : public QObject, public XmlExportable
+{
+ Q_OBJECT
+public:
+ AudioFileManager();
+ virtual ~AudioFileManager();
+
+ class BadAudioPathException : public Exception
+ {
+ public:
+ BadAudioPathException(std::string path) :
+ Exception("Bad audio file path " + path), m_path(path) { }
+ BadAudioPathException(std::string path, std::string file, int line) :
+ Exception("Bad audio file path " + path, file, line), m_path(path) { }
+ BadAudioPathException(const SoundFile::BadSoundFileException &e) :
+ Exception("Bad audio file path (malformed file?) " + e.getPath()), m_path(e.getPath()) { }
+
+ ~BadAudioPathException() throw() { }
+
+ std::string getPath() const { return m_path; }
+
+ private:
+ std::string m_path;
+ };
+
+private:
+ AudioFileManager(const AudioFileManager &aFM);
+ AudioFileManager& operator=(const AudioFileManager &);
+
+public:
+
+ // Create an audio file from an absolute path - we use this interface
+ // to add an actual file.
+ //
+ AudioFileId addFile(const std::string &filePath);
+ // throw BadAudioPathException
+
+ // Return true if a file would require importFile to import it, rather
+ // than a simple addFile. You can use importFile even when a file
+ // doesn't need conversion, but this tells you whether it's necessary
+ //
+ bool fileNeedsConversion(const std::string &filePath,
+ int targetSampleRate = 0);
+
+ // Create an audio file by importing (i.e. converting and/or
+ // resampling) an existing file using the external conversion
+ // utility
+ //
+ AudioFileId importFile(const std::string &filePath,
+ int targetSampleRate = 0);
+ // throw BadAudioPathException, BadSoundFileException
+
+ // Create an audio file by importing from a URL
+ //
+ AudioFileId importURL(const KURL &filePath,
+ int targetSampleRate = 0);
+ // throw BadAudioPathException, BadSoundFileException
+
+ // Insert an audio file into the AudioFileManager and get the
+ // first allocated id for it. Used from the RG file as we already
+ // have both name and filename/path.
+ //
+ AudioFileId insertFile(const std::string &name,
+ const std::string &fileName);
+ // throw BadAudioPathException
+
+ // And insert an AudioFile and specify an id
+ //
+ bool insertFile(const std::string &name, const std::string &fileName,
+ AudioFileId id);
+ // throw BadAudioPathException
+
+ // Remove a file from the AudioManager by id
+ //
+ bool removeFile(AudioFileId id);
+
+ // Does a specific file id exist?
+ //
+ bool fileExists(AudioFileId id);
+
+ // Does a specific file path exist? Return ID or -1.
+ //
+ int fileExists(const std::string &path);
+
+ // get audio file by id
+ //
+ AudioFile* getAudioFile(AudioFileId id);
+
+ // Get the list of files
+ //
+ std::vector<AudioFile*>::const_iterator begin() const
+ { return m_audioFiles.begin(); }
+
+ std::vector<AudioFile*>::const_iterator end() const
+ { return m_audioFiles.end(); }
+
+ // Clear down all audio file references
+ //
+ void clear();
+
+ // Get and set the record path
+ //
+ std::string getAudioPath() const { return m_audioPath; }
+ void setAudioPath(const std::string &path);
+
+ // Throw if the current audio path does not exist or is not writable
+ //
+ void testAudioPath() throw(BadAudioPathException);
+
+ // Get a new audio filename at the audio record path
+ //
+ AudioFile *createRecordingAudioFile();
+ // throw BadAudioPathException
+
+ // Get a set of new audio filenames at the audio record path
+ //
+ std::vector<std::string> createRecordingAudioFiles(unsigned int number);
+ // throw BadAudioPathException
+
+ // Return whether a file was created by recording within this "session"
+ //
+ bool wasAudioFileRecentlyRecorded(AudioFileId id);
+
+ // Return whether a file was created by derivation within this "session"
+ //
+ bool wasAudioFileRecentlyDerived(AudioFileId id);
+
+ // Indicate that a new "session" has started from the point of
+ // view of recorded and derived audio files (e.g. that the
+ // document has been saved)
+ //
+ void resetRecentlyCreatedFiles();
+
+ // Create an empty file "derived from" the source (used by e.g. stretcher)
+ //
+ AudioFile *createDerivedAudioFile(AudioFileId source,
+ const char *prefix);
+
+ // return the last file in the vector - the last created
+ //
+ AudioFile* getLastAudioFile();
+
+ // Export to XML
+ //
+ virtual std::string toXmlString();
+
+ // Convenience function generate all previews on the audio file.
+ //
+ void generatePreviews();
+ // throw BadSoundFileException, BadPeakFileException
+
+ // Generate for a single audio file
+ //
+ bool generatePreview(AudioFileId id);
+ // throw BadSoundFileException, BadPeakFileException
+
+ // Get a preview for an AudioFile adjusted to Segment start and
+ // end parameters (assuming they fall within boundaries).
+ //
+ // We can get back a set of values (floats) or a Pixmap if we
+ // supply the details.
+ //
+ std::vector<float> getPreview(AudioFileId id,
+ const RealTime &startTime,
+ const RealTime &endTime,
+ int width,
+ bool withMinima);
+ // throw BadPeakFileException, BadAudioPathException
+
+ // Draw a fixed size (fixed by QPixmap) preview of an audio file
+ //
+ void drawPreview(AudioFileId id,
+ const RealTime &startTime,
+ const RealTime &endTime,
+ QPixmap *pixmap);
+ // throw BadPeakFileException, BadAudioPathException
+
+ // Usually used to show how an audio Segment makes up part of
+ // an audio file.
+ //
+ void drawHighlightedPreview(AudioFileId it,
+ const RealTime &startTime,
+ const RealTime &endTime,
+ const RealTime &highlightStart,
+ const RealTime &highlightEnd,
+ QPixmap *pixmap);
+ // throw BadPeakFileException, BadAudioPathException
+
+ // Get a short file name from a long one (with '/'s)
+ //
+ std::string getShortFilename(const std::string &fileName);
+
+ // Get a directory from a full file path
+ //
+ std::string getDirectory(const std::string &path);
+
+ // Attempt to subsititute a tilde '~' for a home directory
+ // to make paths a little more generic when saving. Also
+ // provide the inverse function as convenience here.
+ //
+ std::string substituteHomeForTilde(const std::string &path);
+ std::string substituteTildeForHome(const std::string &path);
+
+ // Show entries for debug purposes
+ //
+ void print();
+
+ // Get a split point vector from a peak file
+ //
+ std::vector<SplitPointPair>
+ getSplitPoints(AudioFileId id,
+ const RealTime &startTime,
+ const RealTime &endTime,
+ int threshold,
+ const RealTime &minTime = RealTime(0, 100000000));
+ // throw BadPeakFileException, BadAudioPathException
+
+ // Get the peak file manager
+ //
+ const PeakFileManager& getPeakFileManager() const { return m_peakManager; }
+
+ // Get the peak file manager
+ //
+ PeakFileManager& getPeakFileManager() { return m_peakManager; }
+
+ int getExpectedSampleRate() const { return m_expectedSampleRate; }
+ void setExpectedSampleRate(int rate) { m_expectedSampleRate = rate; }
+
+ std::set<int> getActualSampleRates() const;
+
+signals:
+ void setProgress(int);
+ void setOperationName(QString);
+
+public slots:
+ // Cancel a running preview
+ //
+ void slotStopPreview();
+
+ void slotStopImport();
+
+private:
+ std::string getFileInPath(const std::string &file);
+
+ AudioFileId getFirstUnusedID();
+
+ std::vector<AudioFile*> m_audioFiles;
+ std::string m_audioPath;
+
+ PeakFileManager m_peakManager;
+
+ // All audio files are stored in m_audioFiles. These additional
+ // sets of pointers just refer to those that have been created by
+ // recording or derivations within the current session, and thus
+ // that the user may wish to remove at the end of the session if
+ // the document is not saved.
+ std::set<AudioFile *> m_recordedAudioFiles;
+ std::set<AudioFile *> m_derivedAudioFiles;
+
+ KProcess *m_importProcess;
+
+ int m_expectedSampleRate;
+};
+
+}
+
+#endif // _AUDIOFILEMANAGER_H_
diff --git a/src/sound/AudioFileTimeStretcher.cpp b/src/sound/AudioFileTimeStretcher.cpp
new file mode 100644
index 0000000..d5b2321
--- /dev/null
+++ b/src/sound/AudioFileTimeStretcher.cpp
@@ -0,0 +1,268 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include "AudioFileTimeStretcher.h"
+#include "AudioTimeStretcher.h"
+#include "AudioFileManager.h"
+#include "WAVAudioFile.h"
+#include "base/RealTime.h"
+
+#include <kapplication.h>
+
+#include <iostream>
+#include <fstream>
+
+namespace Rosegarden {
+
+
+AudioFileTimeStretcher::AudioFileTimeStretcher(AudioFileManager *manager) :
+ m_manager(manager),
+ m_timestretchCancelled(false)
+{
+}
+
+AudioFileTimeStretcher::~AudioFileTimeStretcher()
+{
+}
+
+AudioFileId
+AudioFileTimeStretcher::getStretchedAudioFile(AudioFileId source,
+ float ratio)
+{
+ AudioFile *sourceFile = m_manager->getAudioFile(source);
+ if (!sourceFile) {
+ throw SoundFile::BadSoundFileException
+ ("<unknown source>",
+ "Source file not found in AudioFileTimeStretcher::getStretchedAudioFile");
+ }
+
+ std::cerr << "AudioFileTimeStretcher: got source file id " << source
+ << ", name " << sourceFile->getFilename() << std::endl;
+
+ AudioFile *file = m_manager->createDerivedAudioFile(source, "stretch");
+ if (!file) {
+ throw AudioFileManager::BadAudioPathException(m_manager->getAudioPath());
+ }
+
+ std::cerr << "AudioFileTimeStretcher: got derived file id " << file->getId()
+ << ", name " << file->getFilename() << std::endl;
+
+ std::ifstream streamIn(sourceFile->getFilename().c_str(),
+ std::ios::in | std::ios::binary);
+ if (!streamIn) {
+ throw SoundFile::BadSoundFileException
+ (file->getFilename().c_str(),
+ "Failed to open source stream for time stretcher");
+ }
+
+ //!!!
+ //...
+ // Need to make SoundDriver::getAudioRecFileFormat available?
+ // -- the sound file classes should just have a float interface
+ // (like libsndfile, or hey!, we could use libsndfile...)
+
+ WAVAudioFile writeFile
+ (file->getFilename(),
+ sourceFile->getChannels(),
+ sourceFile->getSampleRate(),
+ sourceFile->getSampleRate() * 4 * sourceFile->getChannels(),
+ 4 * sourceFile->getChannels(),
+ 32);
+
+ if (!writeFile.write()) {
+ throw AudioFileManager::BadAudioPathException
+ (file->getFilename());
+ }
+
+ int obs = 1024;
+ int ibs = obs / ratio;
+ int ch = sourceFile->getChannels();
+ int sr = sourceFile->getSampleRate();
+
+ AudioTimeStretcher stretcher(sr, ch, ratio, true, obs);
+
+ // We'll first prime the timestretcher with half its window size
+ // of silence, an amount which we then discard at the start of the
+ // output (as well as its own processing latency). Really the
+ // timestretcher should handle this itself and report it in its
+ // own latency calculation
+
+ size_t padding = stretcher.getWindowSize()/2;
+
+ char *ebf = (char *)alloca
+ (ch * ibs * sourceFile->getBytesPerFrame());
+
+ std::vector<float *> dbfs;
+ for (int c = 0; c < ch; ++c) {
+ dbfs.push_back((float *)alloca((ibs > padding ? ibs : padding)
+ * sizeof(float)));
+ }
+
+ float **ibfs = (float **)alloca(ch * sizeof(float *));
+ float **obfs = (float **)alloca(ch * sizeof(float *));
+
+ for (int c = 0; c < ch; ++c) {
+ ibfs[c] = dbfs[c];
+ }
+
+ for (int c = 0; c < ch; ++c) {
+ obfs[c] = (float *)alloca(obs * sizeof(float));
+ }
+
+ char *oebf = (char *)alloca(ch * obs * sizeof(float));
+
+ int totalIn = 0, totalOut = 0;
+
+ for (int c = 0; c < ch; ++c) {
+ for (size_t i = 0; i < padding; ++i) {
+ ibfs[c][i] = 0.f;
+ }
+ }
+ stretcher.putInput(ibfs, padding);
+
+ RealTime totalTime = sourceFile->getLength();
+ long fileTotalIn = RealTime::realTime2Frame
+ (totalTime, sourceFile->getSampleRate());
+ int progressCount = 0;
+
+ long expectedOut = ceil(fileTotalIn * ratio);
+
+ m_timestretchCancelled = false;
+ bool inputExhausted = false;
+
+ sourceFile->scanTo(&streamIn, RealTime::zeroTime);
+
+ while (1) {
+
+ if (m_timestretchCancelled) {
+ std::cerr << "AudioFileTimeStretcher::getStretchedAudioFile: cancelled" << std::endl;
+ throw CancelledException();
+ }
+
+ unsigned int thisRead = 0;
+
+ if (!inputExhausted) {
+ thisRead = sourceFile->getSampleFrames(&streamIn, ebf, ibs);
+ if (thisRead < ibs) inputExhausted = true;
+ }
+
+ if (thisRead == 0) {
+ if (totalOut >= expectedOut) break;
+ else {
+ // run out of input data, continue feeding zeroes until
+ // we have enough output data
+ for (int c = 0; c < ch; ++c) {
+ for (int i = 0; i < ibs; ++i) {
+ ibfs[c][i] = 0.f;
+ }
+ }
+ thisRead = ibs;
+ }
+ }
+
+ if (!sourceFile->decode((unsigned char *)ebf,
+ thisRead * sourceFile->getBytesPerFrame(),
+ sr, ch,
+ thisRead, dbfs, false)) {
+ std::cerr << "ERROR: Stupid audio file class failed to decode its own output" << std::endl;
+ break;
+ }
+
+ stretcher.putInput(ibfs, thisRead);
+ totalIn += thisRead;
+
+ unsigned int available = stretcher.getAvailableOutputSamples();
+
+ while (available > 0) {
+
+ unsigned int count = available;
+ if (count > obs) count = obs;
+
+ if (padding > 0) {
+ if (count <= padding) {
+ stretcher.getOutput(obfs, count);
+ padding -= count;
+ available -= count;
+ continue;
+ } else {
+ stretcher.getOutput(obfs, padding);
+ count -= padding;
+ available -= padding;
+ padding = 0;
+ }
+ }
+
+ stretcher.getOutput(obfs, count);
+
+ char *encodePointer = oebf;
+ for (int i = 0; i < count; ++i) {
+ for (int c = 0; c < ch; ++c) {
+ float sample = obfs[c][i];
+ *(float *)encodePointer = sample;
+ encodePointer += sizeof(float);
+ }
+ }
+
+ if (totalOut < expectedOut &&
+ totalOut + count > expectedOut) {
+ count = expectedOut - totalOut;
+ }
+
+ writeFile.appendSamples(oebf, count);
+ totalOut += count;
+ available -= count;
+
+ if (totalOut >= expectedOut) break;
+ }
+
+ if (++progressCount == 100) {
+ int progress = int
+ ((100.f * float(totalIn)) / float(fileTotalIn));
+ emit setProgress(progress);
+ kapp->processEvents();
+ progressCount = 0;
+ }
+ }
+
+ emit setProgress(100);
+ kapp->processEvents();
+ writeFile.close();
+
+ std::cerr << "AudioFileTimeStretcher::getStretchedAudioFile: success, id is "
+ << file->getId() << std::endl;
+
+ return file->getId();
+}
+
+void
+AudioFileTimeStretcher::slotStopTimestretch()
+{
+ m_timestretchCancelled = true;
+}
+
+
+}
+
+#include "AudioFileTimeStretcher.moc"
+
diff --git a/src/sound/AudioFileTimeStretcher.h b/src/sound/AudioFileTimeStretcher.h
new file mode 100644
index 0000000..c02e286
--- /dev/null
+++ b/src/sound/AudioFileTimeStretcher.h
@@ -0,0 +1,76 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _AUDIO_FILE_TIME_STRETCHER_H_
+#define _AUDIO_FILE_TIME_STRETCHER_H_
+
+#include <qobject.h>
+#include "AudioFile.h"
+#include "base/Exception.h"
+
+namespace Rosegarden {
+
+class AudioFileManager;
+
+class AudioFileTimeStretcher : public QObject
+{
+ Q_OBJECT
+
+public:
+ AudioFileTimeStretcher(AudioFileManager *mgr);
+ virtual ~AudioFileTimeStretcher();
+
+ /**
+ * Stretch an audio file and return the ID of the stretched
+ * version. May throw SoundFile::BadSoundFileException,
+ * AudioFileManager::BadAudioPathException, CancelledException
+ */
+ AudioFileId getStretchedAudioFile(AudioFileId source,
+ float ratio);
+
+ class CancelledException : public Exception
+ {
+ public:
+ CancelledException() : Exception("Cancelled") { }
+ ~CancelledException() throw() { }
+ };
+
+signals:
+ void setProgress(int);
+
+public slots:
+ /**
+ * Cancel an ongoing getStretchedAudioFile
+ */
+ void slotStopTimestretch();
+
+protected:
+ AudioFileManager *m_manager;
+
+ bool m_timestretchCancelled;
+};
+
+}
+
+#endif
diff --git a/src/sound/AudioPlayQueue.cpp b/src/sound/AudioPlayQueue.cpp
new file mode 100644
index 0000000..2bd07c3
--- /dev/null
+++ b/src/sound/AudioPlayQueue.cpp
@@ -0,0 +1,501 @@
+
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include "AudioPlayQueue.h"
+#include "misc/Debug.h"
+#include "PlayableAudioFile.h"
+#include "Profiler.h"
+
+//#define DEBUG_AUDIO_PLAY_QUEUE 1
+//#define FINE_DEBUG_AUDIO_PLAY_QUEUE 1
+
+namespace Rosegarden
+{
+
+
+static inline unsigned int instrumentId2Index(InstrumentId id)
+{
+ if (id < AudioInstrumentBase)
+ return 0;
+ else
+ return (id - AudioInstrumentBase);
+}
+
+bool
+AudioPlayQueue::FileTimeCmp::operator()(const PlayableAudioFile &f1,
+ const PlayableAudioFile &f2) const
+{
+ return operator()(&f1, &f2);
+}
+
+bool
+AudioPlayQueue::FileTimeCmp::operator()(const PlayableAudioFile *f1,
+ const PlayableAudioFile *f2) const
+{
+ RealTime t1 = f1->getStartTime(), t2 = f2->getStartTime();
+ if (t1 < t2)
+ return true;
+ else if (t2 < t1)
+ return false;
+ else
+ return f1 < f2;
+}
+
+
+AudioPlayQueue::AudioPlayQueue() :
+ m_maxBuffers(0)
+{
+ // nothing to do
+}
+
+AudioPlayQueue::~AudioPlayQueue()
+{
+ std::cerr << "AudioPlayQueue::~AudioPlayQueue()" << std::endl;
+ clear();
+}
+
+void
+AudioPlayQueue::addScheduled(PlayableAudioFile *file)
+{
+ if (m_files.find(file) != m_files.end()) {
+ std::cerr << "WARNING: AudioPlayQueue::addScheduled("
+ << file << "): already in queue" << std::endl;
+ return ;
+ }
+
+ m_files.insert(file);
+
+ RealTime startTime = file->getStartTime();
+ RealTime endTime = file->getStartTime() + file->getDuration();
+
+ InstrumentId instrument = file->getInstrument();
+ unsigned int index = instrumentId2Index(instrument);
+
+ while (m_instrumentIndex.size() <= index) {
+ m_instrumentIndex.push_back(ReverseFileMap());
+ }
+
+#ifdef DEBUG_AUDIO_PLAY_QUEUE
+ std::cerr << "AudioPlayQueue[" << this << "]::addScheduled(" << file << "): start " << file->getStartTime() << ", end " << file->getEndTime() << ", slots: " << std::endl;
+#endif
+
+ for (int i = startTime.sec; i <= endTime.sec; ++i) {
+ m_index[i].push_back(file);
+ m_instrumentIndex[index][i].push_back(file);
+ if (!file->isSmallFile()) {
+ m_counts[i] += file->getTargetChannels();
+ if (m_counts[i] > m_maxBuffers) {
+ m_maxBuffers = m_counts[i];
+ }
+ }
+#ifdef DEBUG_AUDIO_PLAY_QUEUE
+ std::cerr << i << " ";
+#endif
+
+ }
+
+#ifdef DEBUG_AUDIO_PLAY_QUEUE
+ std::cerr << std::endl << "(max buffers now "
+ << m_maxBuffers << ")" << std::endl;
+#endif
+}
+
+void
+AudioPlayQueue::addUnscheduled(PlayableAudioFile *file)
+{
+#ifdef DEBUG_AUDIO_PLAY_QUEUE
+ std::cerr << "AudioPlayQueue[" << this << "]::addUnscheduled(" << file << "): start " << file->getStartTime() << ", end " << file->getEndTime() << ", instrument " << file->getInstrument() << std::endl;
+#endif
+
+ m_unscheduled.push_back(file);
+
+#ifdef DEBUG_AUDIO_PLAY_QUEUE
+
+ std::cerr << "AudioPlayQueue[" << this << "]::addUnscheduled: now " << m_unscheduled.size() << " unscheduled files" << std::endl;
+#endif
+
+}
+
+void
+AudioPlayQueue::erase(PlayableAudioFile *file)
+{
+#ifdef DEBUG_AUDIO_PLAY_QUEUE
+ std::cerr << "AudioPlayQueue::erase(" << file << "): start " << file->getStartTime() << ", end " << file->getEndTime() << std::endl;
+#endif
+
+ FileSet::iterator fi = m_files.find(file);
+ if (fi == m_files.end()) {
+ for (FileList::iterator fli = m_unscheduled.begin();
+ fli != m_unscheduled.end(); ++fli) {
+ if (*fli == file) {
+ m_unscheduled.erase(fli);
+ delete file;
+ return ;
+ }
+ }
+ return ;
+ }
+ m_files.erase(fi);
+
+ InstrumentId instrument = file->getInstrument();
+ unsigned int index = instrumentId2Index(instrument);
+
+ for (ReverseFileMap::iterator mi = m_instrumentIndex[index].begin();
+ mi != m_instrumentIndex[index].end(); ++mi) {
+
+ for (FileVector::iterator fi = mi->second.begin();
+ fi != mi->second.end(); ++fi) {
+
+ if (*fi == file) {
+ mi->second.erase(fi);
+ if (m_counts[mi->first] > 0)
+ --m_counts[mi->first];
+ break;
+ }
+ }
+ }
+
+ for (ReverseFileMap::iterator mi = m_index.begin();
+ mi != m_index.end(); ++mi) {
+
+ for (FileVector::iterator fi = mi->second.begin();
+ fi != mi->second.end(); ++fi) {
+
+ if (*fi == file) {
+ mi->second.erase(fi);
+ if (m_counts[mi->first] > 0)
+ --m_counts[mi->first];
+ break;
+ }
+ }
+ }
+
+ delete file;
+}
+
+void
+AudioPlayQueue::clear()
+{
+#ifdef DEBUG_AUDIO_PLAY_QUEUE
+ std::cerr << "AudioPlayQueue::clear()" << std::endl;
+#endif
+
+ while (m_files.begin() != m_files.end()) {
+ delete *m_files.begin();
+ m_files.erase(m_files.begin());
+ }
+
+ while (m_unscheduled.begin() != m_unscheduled.end()) {
+ delete *m_unscheduled.begin();
+ m_unscheduled.erase(m_unscheduled.begin());
+ }
+
+ m_instrumentIndex.clear();
+ m_index.clear();
+ m_counts.clear();
+ m_maxBuffers = 0;
+}
+
+bool
+AudioPlayQueue::empty() const
+{
+ return m_unscheduled.empty() && m_files.empty();
+}
+
+size_t
+AudioPlayQueue::size() const
+{
+ return m_unscheduled.size() + m_files.size();
+}
+
+void
+AudioPlayQueue::getPlayingFiles(const RealTime &sliceStart,
+ const RealTime &sliceDuration,
+ FileSet &playing) const
+{
+ // Profiler profiler("AudioPlayQueue::getPlayingFiles");
+
+ // This one needs to be quick.
+
+ playing.clear();
+
+ RealTime sliceEnd = sliceStart + sliceDuration;
+
+ for (int i = sliceStart.sec; i <= sliceEnd.sec; ++i) {
+
+ ReverseFileMap::const_iterator mi(m_index.find(i));
+ if (mi == m_index.end())
+ continue;
+
+ for (FileVector::const_iterator fi = mi->second.begin();
+ fi != mi->second.end(); ++fi) {
+
+ PlayableAudioFile *f = *fi;
+
+ if (f->getStartTime() > sliceEnd ||
+ f->getStartTime() + f->getDuration() <= sliceStart)
+ continue;
+
+#ifdef FINE_DEBUG_AUDIO_PLAY_QUEUE
+
+ std::cerr << "... found " << f << " in slot " << i << std::endl;
+#endif
+
+ playing.insert(f);
+ }
+ }
+
+ for (FileList::const_iterator fli = m_unscheduled.begin();
+ fli != m_unscheduled.end(); ++fli) {
+ PlayableAudioFile *file = *fli;
+ if (file->getStartTime() <= sliceEnd &&
+ file->getStartTime() + file->getDuration() > sliceStart) {
+ playing.insert(file);
+ }
+ }
+
+#ifdef FINE_DEBUG_AUDIO_PLAY_QUEUE
+ if (playing.size() > 0) {
+ std::cerr << "AudioPlayQueue::getPlayingFiles(" << sliceStart << ","
+ << sliceDuration << "): total "
+ << playing.size() << " files" << std::endl;
+ }
+#endif
+}
+
+void
+AudioPlayQueue::getPlayingFilesForInstrument(const RealTime &sliceStart,
+ const RealTime &sliceDuration,
+ InstrumentId instrumentId,
+ PlayableAudioFile **playing,
+ size_t &size) const
+{
+#ifdef FINE_DEBUG_AUDIO_PLAY_QUEUE
+ bool printed = false;
+ Profiler profiler("AudioPlayQueue::getPlayingFilesForInstrument", true);
+#endif
+
+ // This one needs to be quick.
+
+ size_t written = 0;
+
+ RealTime sliceEnd = sliceStart + sliceDuration;
+
+ unsigned int index = instrumentId2Index(instrumentId);
+ if (index >= m_instrumentIndex.size()) {
+ goto unscheduled; // nothing scheduled here
+ }
+
+ for (int i = sliceStart.sec; i <= sliceEnd.sec; ++i) {
+
+ ReverseFileMap::const_iterator mi
+ (m_instrumentIndex[index].find(i));
+
+ if (mi == m_instrumentIndex[index].end())
+ continue;
+
+ for (FileVector::const_iterator fi = mi->second.begin();
+ fi != mi->second.end(); ++fi) {
+
+ PlayableAudioFile *f = *fi;
+
+ if (f->getInstrument() != instrumentId)
+ continue;
+
+#ifdef FINE_DEBUG_AUDIO_PLAY_QUEUE
+
+ if (!printed) {
+ std::cerr << "AudioPlayQueue::getPlayingFilesForInstrument(" << sliceStart
+ << ", " << sliceDuration << ", " << instrumentId << ")"
+ << std::endl;
+ printed = true;
+ }
+#endif
+
+ if (f->getStartTime() > sliceEnd ||
+ f->getEndTime() <= sliceStart) {
+
+#ifdef FINE_DEBUG_AUDIO_PLAY_QUEUE
+ std::cerr << "... rejected " << f << " in slot " << i << std::endl;
+ if (f->getStartTime() > sliceEnd) {
+ std::cerr << "(" << f->getStartTime() << " > " << sliceEnd
+ << ")" << std::endl;
+ } else {
+ std::cerr << "(" << f->getEndTime() << " <= " << sliceStart
+ << ")" << std::endl;
+ }
+#endif
+
+ continue;
+ }
+
+#ifdef FINE_DEBUG_AUDIO_PLAY_QUEUE
+ std::cerr << "... found " << f << " in slot " << i << " ("
+ << f->getStartTime() << " -> " << f->getEndTime()
+ << ")" << std::endl;
+#endif
+
+ size_t j = 0;
+ for (j = 0; j < written; ++j) {
+ if (playing[j] == f)
+ break;
+ }
+ if (j < written)
+ break; // already have it
+
+ if (written >= size) {
+#ifdef FINE_DEBUG_AUDIO_PLAY_QUEUE
+ std::cerr << "No room to write it!" << std::endl;
+#endif
+
+ break;
+ }
+
+ playing[written++] = f;
+ }
+ }
+
+unscheduled:
+
+ for (FileList::const_iterator fli = m_unscheduled.begin();
+ fli != m_unscheduled.end(); ++fli) {
+
+ PlayableAudioFile *f = *fli;
+
+ if (f->getInstrument() != instrumentId) {
+#ifdef FINE_DEBUG_AUDIO_PLAY_QUEUE
+ std::cerr << "rejecting unscheduled " << f << " as wrong instrument ("
+ << f->getInstrument() << " != " << instrumentId << ")" << std::endl;
+#endif
+
+ continue;
+ }
+
+#ifdef FINE_DEBUG_AUDIO_PLAY_QUEUE
+ if (!printed) {
+ std::cerr << "AudioPlayQueue::getPlayingFilesForInstrument(" << sliceStart
+ << ", " << sliceDuration << ", " << instrumentId << ")"
+ << std::endl;
+ printed = true;
+ }
+#endif
+
+ if (f->getStartTime() <= sliceEnd &&
+ f->getStartTime() + f->getDuration() > sliceStart) {
+
+#ifdef FINE_DEBUG_AUDIO_PLAY_QUEUE
+ std::cerr << "... found " << f << " in unscheduled list ("
+ << f->getStartTime() << " -> " << f->getEndTime()
+ << ")" << std::endl;
+#endif
+
+ if (written >= size)
+ break;
+ playing[written++] = f;
+
+#ifdef FINE_DEBUG_AUDIO_PLAY_QUEUE
+
+ } else {
+
+ std::cerr << "... rejected " << f << " in unscheduled list" << std::endl;
+ if (f->getStartTime() > sliceEnd) {
+ std::cerr << "(" << f->getStartTime() << " > " << sliceEnd
+ << ")" << std::endl;
+ } else {
+ std::cerr << "(" << f->getEndTime() << " <= " << sliceStart
+ << ")" << std::endl;
+ }
+#endif
+
+ }
+ }
+
+#ifdef FINE_DEBUG_AUDIO_PLAY_QUEUE
+ if (written > 0) {
+ std::cerr << "AudioPlayQueue::getPlayingFilesForInstrument: total "
+ << written << " files" << std::endl;
+ }
+#endif
+
+ size = written;
+}
+
+bool
+AudioPlayQueue::haveFilesForInstrument(InstrumentId instrumentId) const
+{
+#ifdef FINE_DEBUG_AUDIO_PLAY_QUEUE
+ std::cerr << "AudioPlayQueue::haveFilesForInstrument(" << instrumentId << ")...";
+#endif
+
+ unsigned int index = instrumentId2Index(instrumentId);
+
+ if (index < m_instrumentIndex.size() &&
+ !m_instrumentIndex[index].empty()) {
+#ifdef FINE_DEBUG_AUDIO_PLAY_QUEUE
+ std::cerr << " yes (scheduled)" << std::endl;
+#endif
+
+ return true;
+ }
+
+ for (FileList::const_iterator fli = m_unscheduled.begin();
+ fli != m_unscheduled.end(); ++fli) {
+ PlayableAudioFile *file = *fli;
+ if (file->getInstrument() == instrumentId) {
+#ifdef FINE_DEBUG_AUDIO_PLAY_QUEUE
+ std::cerr << " yes (unscheduled)" << std::endl;
+#endif
+
+ return true;
+ }
+ }
+
+#ifdef FINE_DEBUG_AUDIO_PLAY_QUEUE
+ std::cerr << " no" << std::endl;
+#endif
+
+ return false;
+}
+
+const AudioPlayQueue::FileSet &
+AudioPlayQueue::getAllScheduledFiles() const
+{
+#ifdef DEBUG_AUDIO_PLAY_QUEUE
+ std::cerr << "AudioPlayQueue[" << this << "]::getAllScheduledFiles: have " << m_files.size() << " files" << std::endl;
+#endif
+
+ return m_files;
+}
+
+const AudioPlayQueue::FileList &
+AudioPlayQueue::getAllUnscheduledFiles() const
+{
+#ifdef DEBUG_AUDIO_PLAY_QUEUE
+ std::cerr << "AudioPlayQueue[" << this << "]::getAllUnscheduledFiles: have " << m_unscheduled.size() << " files" << std::endl;
+#endif
+
+ return m_unscheduled;
+}
+
+
+}
+
diff --git a/src/sound/AudioPlayQueue.h b/src/sound/AudioPlayQueue.h
new file mode 100644
index 0000000..2a7067c
--- /dev/null
+++ b/src/sound/AudioPlayQueue.h
@@ -0,0 +1,168 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _AUDIO_PLAY_QUEUE_H_
+#define _AUDIO_PLAY_QUEUE_H_
+
+#include "RealTime.h"
+#include "Instrument.h"
+
+#include <set>
+#include <vector>
+#include <map>
+#include <list>
+
+namespace Rosegarden
+{
+
+class PlayableAudioFile;
+
+/**
+ * An ordered list of PlayableAudioFiles that does not aim to be quick
+ * to add to or remove files from, but that aims to quickly answer the
+ * question of which files are playing within a given time slice.
+ *
+ * Note that there is no locking between audio file add/remove and
+ * lookup. Add/remove should only be carried out when it is known
+ * that no threads will be performing lookup.
+ */
+
+class AudioPlayQueue
+{
+public:
+ AudioPlayQueue();
+ virtual ~AudioPlayQueue();
+
+ struct FileTimeCmp {
+ bool operator()(const PlayableAudioFile &, const PlayableAudioFile &) const;
+ bool operator()(const PlayableAudioFile *, const PlayableAudioFile *) const;
+ };
+ typedef std::set<PlayableAudioFile *, FileTimeCmp> FileSet;
+ typedef std::list<PlayableAudioFile *> FileList;
+
+ /**
+ * Add a file to the queue. AudioPlayQueue takes ownership of the
+ * file and will delete it when removed.
+ */
+ void addScheduled(PlayableAudioFile *file);
+
+ /**
+ * Add a file to the unscheduled list. AudioPlayQueue takes
+ * ownership of the file and will delete it when removed.
+ * Unscheduled files will be returned along with schuled ones for
+ * normal lookups, but everything will be less efficient when
+ * there are unscheduled files on the queue. This is intended
+ * for asynchronous (preview) playback.
+ */
+ void addUnscheduled(PlayableAudioFile *file);
+
+ /**
+ * Remove a scheduled or unscheduled file from the queue and
+ * delete it.
+ */
+ void erase(PlayableAudioFile *file);
+
+ /**
+ * Remove all files and delete them.
+ */
+ void clear();
+
+ /**
+ * Return true if the queue is empty.
+ */
+ bool empty() const;
+
+ /**
+ * Return the total number of files in the queue. (May be slow.)
+ */
+ size_t size() const;
+
+ /**
+ * Look up the files playing during a given slice and return them
+ * in the passed FileSet. The pointers returned are still owned
+ * by me and the caller should not delete them.
+ */
+ void getPlayingFiles(const RealTime &sliceStart,
+ const RealTime &sliceDuration,
+ FileSet &) const;
+
+ /**
+ * Look up the files playing during a given slice on a given
+ * instrument and return them in the passed array. The size arg
+ * gives the available size of the array and is used to return the
+ * number of file pointers written. The pointers returned are
+ * still owned by me and the caller should not delete them.
+ */
+ void getPlayingFilesForInstrument(const RealTime &sliceStart,
+ const RealTime &sliceDuration,
+ InstrumentId instrumentId,
+ PlayableAudioFile **files,
+ size_t &size) const;
+
+ /**
+ * Return true if at least one scheduled or unscheduled file is
+ * associated with the given instrument somewhere in the queue.
+ */
+ bool haveFilesForInstrument(InstrumentId instrumentId) const;
+
+ /**
+ * Return a (shared reference to an) ordered set of all files on
+ * the scheduled queue.
+ */
+ const FileSet &getAllScheduledFiles() const;
+
+ /**
+ * Return a (shared reference to an) ordered set of all files on
+ * the unscheduled queue.
+ */
+ const FileList &getAllUnscheduledFiles() const;
+
+ /**
+ * Get an approximate (but always pessimistic) estimate of the
+ * number of ring buffers required for the current queue -- that
+ * is, the maximum possible number of audio channels playing at
+ * once from non-small-file-cached-files.
+ */
+ size_t getMaxBuffersRequired() const { return m_maxBuffers; }
+
+private:
+ FileSet m_files;
+
+ typedef std::vector<PlayableAudioFile *> FileVector;
+ typedef std::map<int, FileVector> ReverseFileMap;
+ ReverseFileMap m_index;
+
+ typedef std::vector<ReverseFileMap> InstrumentReverseFileMap;
+ InstrumentReverseFileMap m_instrumentIndex;
+
+ FileList m_unscheduled;
+
+ typedef std::map<int, size_t> FileCountMap;
+ FileCountMap m_counts;
+
+ size_t m_maxBuffers;
+};
+
+
+}
+
+#endif
+
diff --git a/src/sound/AudioProcess.cpp b/src/sound/AudioProcess.cpp
new file mode 100644
index 0000000..9b44e13
--- /dev/null
+++ b/src/sound/AudioProcess.cpp
@@ -0,0 +1,2463 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include "AudioProcess.h"
+
+#include "RunnablePluginInstance.h"
+#include "PlayableAudioFile.h"
+#include "RecordableAudioFile.h"
+#include "WAVAudioFile.h"
+#include "MappedStudio.h"
+#include "Profiler.h"
+#include "AudioLevel.h"
+#include "AudioPlayQueue.h"
+#include "PluginFactory.h"
+
+#include <sys/time.h>
+#include <pthread.h>
+
+#include <cmath>
+
+//#define DEBUG_THREAD_CREATE_DESTROY 1
+//#define DEBUG_BUSS_MIXER 1
+//#define DEBUG_MIXER 1
+//#define DEBUG_MIXER_LIGHTWEIGHT 1
+//#define DEBUG_LOCKS 1
+//#define DEBUG_READER 1
+//#define DEBUG_WRITER 1
+
+namespace Rosegarden
+{
+
+/* Branch-free optimizer-resistant denormal killer courtesy of Simon
+ Jenkins on LAD: */
+
+static inline float flushToZero(volatile float f)
+{
+ f += 9.8607615E-32f;
+ return f - 9.8607615E-32f;
+}
+
+static inline void denormalKill(float *buffer, int size)
+{
+ for (int i = 0; i < size; ++i) {
+ buffer[i] = flushToZero(buffer[i]);
+ }
+}
+
+AudioThread::AudioThread(std::string name,
+ SoundDriver *driver,
+ unsigned int sampleRate) :
+ m_name(name),
+ m_driver(driver),
+ m_sampleRate(sampleRate),
+ m_thread(0),
+ m_running(false),
+ m_exiting(false)
+{
+#ifdef DEBUG_THREAD_CREATE_DESTROY
+ std::cerr << "AudioThread::AudioThread() [" << m_name << "]" << std::endl;
+#endif
+
+ pthread_mutex_t initialisingMutex = PTHREAD_MUTEX_INITIALIZER;
+ memcpy(&m_lock, &initialisingMutex, sizeof(pthread_mutex_t));
+
+ pthread_cond_t initialisingCondition = PTHREAD_COND_INITIALIZER;
+ memcpy(&m_condition, &initialisingCondition, sizeof(pthread_cond_t));
+}
+
+AudioThread::~AudioThread()
+{
+#ifdef DEBUG_THREAD_CREATE_DESTROY
+ std::cerr << "AudioThread::~AudioThread() [" << m_name << "]" << std::endl;
+#endif
+
+ if (m_thread) {
+ pthread_mutex_destroy(&m_lock);
+ m_thread = 0;
+ }
+
+#ifdef DEBUG_THREAD_CREATE_DESTROY
+ std::cerr << "AudioThread::~AudioThread() exiting" << std::endl;
+#endif
+}
+
+void
+AudioThread::run()
+{
+#ifdef DEBUG_THREAD_CREATE_DESTROY
+ std::cerr << m_name << "::run()" << std::endl;
+#endif
+
+ pthread_attr_t attr;
+ pthread_attr_init(&attr);
+
+ int priority = getPriority();
+
+ if (priority > 0) {
+
+ if (pthread_attr_setschedpolicy(&attr, SCHED_FIFO)) {
+
+ std::cerr << m_name << "::run: WARNING: couldn't set FIFO scheduling "
+ << "on new thread" << std::endl;
+ pthread_attr_init(&attr); // reset to safety
+
+ } else {
+
+ struct sched_param param;
+ memset(&param, 0, sizeof(struct sched_param));
+ param.sched_priority = priority;
+
+ if (pthread_attr_setschedparam(&attr, &param)) {
+ std::cerr << m_name << "::run: WARNING: couldn't set priority "
+ << priority << " on new thread" << std::endl;
+ pthread_attr_init(&attr); // reset to safety
+ }
+ }
+ }
+
+ pthread_attr_setstacksize(&attr, 1048576);
+ int rv = pthread_create(&m_thread, &attr, staticThreadRun, this);
+
+ if (rv != 0 && priority > 0) {
+#ifdef DEBUG_THREAD_CREATE_DESTROY
+ std::cerr << m_name << "::run: WARNING: unable to start RT thread;"
+ << "\ntrying again with normal scheduling" << std::endl;
+#endif
+
+ pthread_attr_init(&attr);
+ pthread_attr_setstacksize(&attr, 1048576);
+ rv = pthread_create(&m_thread, &attr, staticThreadRun, this);
+ }
+
+ if (rv != 0) {
+ // This is quite fatal.
+ std::cerr << m_name << "::run: ERROR: failed to start thread!" << std::endl;
+ ::exit(1);
+ }
+
+ m_running = true;
+
+#ifdef DEBUG_THREAD_CREATE_DESTROY
+
+ std::cerr << m_name << "::run() done" << std::endl;
+#endif
+}
+
+void
+AudioThread::terminate()
+{
+#ifdef DEBUG_THREAD_CREATE_DESTROY
+ std::string name = m_name;
+ std::cerr << name << "::terminate()" << std::endl;
+#endif
+
+ m_running = false;
+
+ if (m_thread) {
+
+ pthread_cancel(m_thread);
+
+#ifdef DEBUG_THREAD_CREATE_DESTROY
+
+ std::cerr << name << "::terminate(): cancel requested" << std::endl;
+#endif
+
+ int rv = pthread_join(m_thread, 0);
+
+#ifdef DEBUG_THREAD_CREATE_DESTROY
+
+ std::cerr << name << "::terminate(): thread exited with return value " << rv << std::endl;
+#endif
+
+ }
+
+#ifdef DEBUG_THREAD_CREATE_DESTROY
+ std::cerr << name << "::terminate(): done" << std::endl;
+#endif
+}
+
+void *
+AudioThread::staticThreadRun(void *arg)
+{
+ AudioThread *inst = static_cast<AudioThread *>(arg);
+ if (!inst)
+ return 0;
+
+ pthread_cleanup_push(staticThreadCleanup, arg);
+
+ inst->getLock();
+ inst->m_exiting = false;
+ inst->threadRun();
+
+#ifdef DEBUG_THREAD_CREATE_DESTROY
+
+ std::cerr << inst->m_name << "::staticThreadRun(): threadRun exited" << std::endl;
+#endif
+
+ inst->releaseLock();
+ pthread_cleanup_pop(0);
+
+ return 0;
+}
+
+void
+AudioThread::staticThreadCleanup(void *arg)
+{
+ AudioThread *inst = static_cast<AudioThread *>(arg);
+ if (!inst || inst->m_exiting)
+ return ;
+
+#ifdef DEBUG_THREAD_CREATE_DESTROY
+
+ std::string name = inst->m_name;
+ std::cerr << name << "::staticThreadCleanup()" << std::endl;
+#endif
+
+ inst->m_exiting = true;
+ inst->releaseLock();
+
+#ifdef DEBUG_THREAD_CREATE_DESTROY
+
+ std::cerr << name << "::staticThreadCleanup() done" << std::endl;
+#endif
+}
+
+int
+AudioThread::getLock()
+{
+ int rv;
+#ifdef DEBUG_LOCKS
+
+ std::cerr << m_name << "::getLock()" << std::endl;
+#endif
+
+ rv = pthread_mutex_lock(&m_lock);
+#ifdef DEBUG_LOCKS
+
+ std::cerr << "OK" << std::endl;
+#endif
+
+ return rv;
+}
+
+int
+AudioThread::tryLock()
+{
+ int rv;
+#ifdef DEBUG_LOCKS
+
+ std::cerr << m_name << "::tryLock()" << std::endl;
+#endif
+
+ rv = pthread_mutex_trylock(&m_lock);
+#ifdef DEBUG_LOCKS
+
+ std::cerr << "OK (rv is " << rv << ")" << std::endl;
+#endif
+
+ return rv;
+}
+
+int
+AudioThread::releaseLock()
+{
+ int rv;
+#ifdef DEBUG_LOCKS
+
+ std::cerr << m_name << "::releaseLock()" << std::endl;
+#endif
+
+ rv = pthread_mutex_unlock(&m_lock);
+#ifdef DEBUG_LOCKS
+
+ std::cerr << "OK" << std::endl;
+#endif
+
+ return rv;
+}
+
+void
+AudioThread::signal()
+{
+#ifdef DEBUG_LOCKS
+ std::cerr << m_name << "::signal()" << std::endl;
+#endif
+
+ pthread_cond_signal(&m_condition);
+}
+
+
+AudioBussMixer::AudioBussMixer(SoundDriver *driver,
+ AudioInstrumentMixer *instrumentMixer,
+ unsigned int sampleRate,
+ unsigned int blockSize) :
+ AudioThread("AudioBussMixer", driver, sampleRate),
+ m_instrumentMixer(instrumentMixer),
+ m_blockSize(blockSize),
+ m_bussCount(0)
+{
+ // nothing else here
+}
+
+AudioBussMixer::~AudioBussMixer()
+{
+ for (unsigned int i = 0; i < m_processBuffers.size(); ++i) {
+ delete[] m_processBuffers[i];
+ }
+}
+
+AudioBussMixer::BufferRec::~BufferRec()
+{
+ for (size_t i = 0; i < buffers.size(); ++i)
+ delete buffers[i];
+}
+
+void
+AudioBussMixer::generateBuffers()
+{
+ // Not RT safe
+
+#ifdef DEBUG_BUSS_MIXER
+ std::cerr << "AudioBussMixer::generateBuffers" << std::endl;
+#endif
+
+ // This returns one too many, as the master is counted as buss 0
+ m_bussCount =
+ m_driver->getMappedStudio()->getObjectCount(MappedStudio::AudioBuss) - 1;
+
+#ifdef DEBUG_BUSS_MIXER
+
+ std::cerr << "AudioBussMixer::generateBuffers: have " << m_bussCount << " busses" << std::endl;
+#endif
+
+ int bufferSamples = m_blockSize;
+
+ if (!m_driver->getLowLatencyMode()) {
+ RealTime bufferLength = m_driver->getAudioMixBufferLength();
+ int bufferSamples = RealTime::realTime2Frame(bufferLength, m_sampleRate);
+ bufferSamples = ((bufferSamples / m_blockSize) + 1) * m_blockSize;
+ }
+
+ for (int i = 0; i < m_bussCount; ++i) {
+
+ BufferRec &rec = m_bufferMap[i];
+
+ if (rec.buffers.size() == 2)
+ continue;
+
+ for (unsigned int ch = 0; ch < 2; ++ch) {
+ RingBuffer<sample_t> *rb = new RingBuffer<sample_t>(bufferSamples);
+ if (!rb->mlock()) {
+ // std::cerr << "WARNING: AudioBussMixer::generateBuffers: couldn't lock ring buffer into real memory, performance may be impaired" << std::endl;
+ }
+ rec.buffers.push_back(rb);
+ }
+
+ MappedAudioBuss *mbuss =
+ m_driver->getMappedStudio()->getAudioBuss(i + 1); // master is 0
+
+ if (mbuss) {
+
+ float level = 0.0;
+ (void)mbuss->getProperty(MappedAudioBuss::Level, level);
+
+ float pan = 0.0;
+ (void)mbuss->getProperty(MappedAudioBuss::Pan, pan);
+
+ setBussLevels(i + 1, level, pan);
+ }
+ }
+
+ if (m_processBuffers.size() == 0) {
+ m_processBuffers.push_back(new sample_t[m_blockSize]);
+ m_processBuffers.push_back(new sample_t[m_blockSize]);
+ }
+}
+
+void
+AudioBussMixer::fillBuffers(const RealTime &currentTime)
+{
+ // Not RT safe
+
+#ifdef DEBUG_BUSS_MIXER
+ std::cerr << "AudioBussMixer::fillBuffers" << std::endl;
+#endif
+
+ emptyBuffers();
+ m_instrumentMixer->fillBuffers(currentTime);
+ kick();
+}
+
+void
+AudioBussMixer::emptyBuffers()
+{
+ // Not RT safe
+
+ getLock();
+
+#ifdef DEBUG_BUSS_MIXER
+
+ std::cerr << "AudioBussMixer::emptyBuffers" << std::endl;
+#endif
+
+ // We can't generate buffers before this, because we don't know how
+ // many busses there are
+ generateBuffers();
+
+ for (int i = 0; i < m_bussCount; ++i) {
+ m_bufferMap[i].dormant = true;
+ for (int ch = 0; ch < 2; ++ch) {
+ if (int(m_bufferMap[i].buffers.size()) > ch) {
+ m_bufferMap[i].buffers[ch]->reset();
+ }
+ }
+ }
+
+ releaseLock();
+}
+
+void
+AudioBussMixer::kick(bool wantLock, bool signalInstrumentMixer)
+{
+ // Needs to be RT safe if wantLock is not specified
+
+ if (wantLock)
+ getLock();
+
+#ifdef DEBUG_BUSS_MIXER
+
+ std::cerr << "AudioBussMixer::kick" << std::endl;
+#endif
+
+ processBlocks();
+
+#ifdef DEBUG_BUSS_MIXER
+
+ std::cerr << "AudioBussMixer::kick: processed" << std::endl;
+#endif
+
+ if (wantLock)
+ releaseLock();
+
+ if (signalInstrumentMixer) {
+ m_instrumentMixer->signal();
+ }
+}
+
+void
+AudioBussMixer::setBussLevels(int bussId, float dB, float pan)
+{
+ // No requirement to be RT safe
+
+ if (bussId == 0)
+ return ; // master
+ int buss = bussId - 1;
+
+ BufferRec &rec = m_bufferMap[buss];
+
+ float volume = AudioLevel::dB_to_multiplier(dB);
+
+ rec.gainLeft = volume * ((pan > 0.0) ? (1.0 - (pan / 100.0)) : 1.0);
+ rec.gainRight = volume * ((pan < 0.0) ? ((pan + 100.0) / 100.0) : 1.0);
+}
+
+void
+AudioBussMixer::updateInstrumentConnections()
+{
+ // Not RT safe
+
+ if (m_bussCount <= 0)
+ generateBuffers();
+
+ InstrumentId audioInstrumentBase;
+ int audioInstruments;
+ m_driver->getAudioInstrumentNumbers(audioInstrumentBase, audioInstruments);
+
+ InstrumentId synthInstrumentBase;
+ int synthInstruments;
+ m_driver->getSoftSynthInstrumentNumbers(synthInstrumentBase, synthInstruments);
+
+ for (int buss = 0; buss < m_bussCount; ++buss) {
+
+ MappedAudioBuss *mbuss =
+ m_driver->getMappedStudio()->getAudioBuss(buss + 1); // master is 0
+
+ if (!mbuss) {
+#ifdef DEBUG_BUSS_MIXER
+ std::cerr << "AudioBussMixer::updateInstrumentConnections: buss " << buss << " not found" << std::endl;
+#endif
+
+ continue;
+ }
+
+ BufferRec &rec = m_bufferMap[buss];
+
+ while (int(rec.instruments.size()) < audioInstruments + synthInstruments) {
+ rec.instruments.push_back(false);
+ }
+
+ std::vector<InstrumentId> instruments = mbuss->getInstruments();
+
+ for (int i = 0; i < audioInstruments + synthInstruments; ++i) {
+
+ InstrumentId id;
+ if (i < audioInstruments)
+ id = audioInstrumentBase + i;
+ else
+ id = synthInstrumentBase + (i - audioInstruments);
+
+ size_t j = 0;
+ for (j = 0; j < instruments.size(); ++j) {
+ if (instruments[j] == id) {
+ rec.instruments[i] = true;
+ break;
+ }
+ }
+ if (j == instruments.size())
+ rec.instruments[i] = false;
+ }
+ }
+}
+
+void
+AudioBussMixer::processBlocks()
+{
+ // Needs to be RT safe
+
+ if (m_bussCount == 0)
+ return ;
+
+#ifdef DEBUG_BUSS_MIXER
+
+ if (m_driver->isPlaying())
+ std::cerr << "AudioBussMixer::processBlocks" << std::endl;
+#endif
+
+ InstrumentId audioInstrumentBase;
+ int audioInstruments;
+ m_driver->getAudioInstrumentNumbers(audioInstrumentBase, audioInstruments);
+
+ InstrumentId synthInstrumentBase;
+ int synthInstruments;
+ m_driver->getSoftSynthInstrumentNumbers(synthInstrumentBase, synthInstruments);
+
+ bool *processedInstruments = (bool *)alloca
+ ((audioInstruments + synthInstruments) * sizeof(bool));
+
+ for (int i = 0; i < audioInstruments + synthInstruments; ++i) {
+ processedInstruments[i] = false;
+ }
+
+ int minBlocks = 0;
+ bool haveMinBlocks = false;
+
+ for (int buss = 0; buss < m_bussCount; ++buss) {
+
+ BufferRec &rec = m_bufferMap[buss];
+
+ float gain[2];
+ gain[0] = rec.gainLeft;
+ gain[1] = rec.gainRight;
+
+ // The dormant calculation here depends on the buffer length
+ // for this mixer being the same as that for the instrument mixer
+
+ size_t minSpace = 0;
+
+ for (int ch = 0; ch < 2; ++ch) {
+
+ size_t w = rec.buffers[ch]->getWriteSpace();
+ if (ch == 0 || w < minSpace)
+ minSpace = w;
+
+#ifdef DEBUG_BUSS_MIXER
+
+ std::cerr << "AudioBussMixer::processBlocks: buss " << buss << ": write space " << w << " on channel " << ch << std::endl;
+#endif
+
+ if (minSpace == 0)
+ break;
+
+ for (int i = 0; i < audioInstruments + synthInstruments; ++i) {
+
+ // is this instrument on this buss?
+ if (int(rec.instruments.size()) <= i ||
+ !rec.instruments[i])
+ continue;
+
+ InstrumentId id;
+ if (i < audioInstruments)
+ id = audioInstrumentBase + i;
+ else
+ id = synthInstrumentBase + (i - audioInstruments);
+
+ if (m_instrumentMixer->isInstrumentEmpty(id))
+ continue;
+
+ RingBuffer<sample_t, 2> *rb =
+ m_instrumentMixer->getRingBuffer(id, ch);
+ if (rb) {
+ size_t r = rb->getReadSpace(1);
+ if (r < minSpace)
+ minSpace = r;
+
+#ifdef DEBUG_BUSS_MIXER
+
+ if (id == 1000) {
+ std::cerr << "AudioBussMixer::processBlocks: buss " << buss << ": read space " << r << " on instrument " << id << ", channel " << ch << std::endl;
+ }
+#endif
+
+ if (minSpace == 0)
+ break;
+ }
+ }
+
+ if (minSpace == 0)
+ break;
+ }
+
+ int blocks = minSpace / m_blockSize;
+ if (!haveMinBlocks || (blocks < minBlocks)) {
+ minBlocks = blocks;
+ haveMinBlocks = true;
+ }
+
+#ifdef DEBUG_BUSS_MIXER
+ if (m_driver->isPlaying())
+ std::cerr << "AudioBussMixer::processBlocks: doing " << blocks << " blocks at block size " << m_blockSize << std::endl;
+#endif
+
+ for (int block = 0; block < blocks; ++block) {
+
+ memset(m_processBuffers[0], 0, m_blockSize * sizeof(sample_t));
+ memset(m_processBuffers[1], 0, m_blockSize * sizeof(sample_t));
+
+ bool dormant = true;
+
+ for (int i = 0; i < audioInstruments + synthInstruments; ++i) {
+
+ // is this instrument on this buss?
+ if (int(rec.instruments.size()) <= i ||
+ !rec.instruments[i])
+ continue;
+
+ if (processedInstruments[i]) {
+ // we aren't set up to process any instrument to
+ // more than one buss
+ continue;
+ } else {
+ processedInstruments[i] = true;
+ }
+
+ InstrumentId id;
+ if (i < audioInstruments)
+ id = audioInstrumentBase + i;
+ else
+ id = synthInstrumentBase + (i - audioInstruments);
+
+ if (m_instrumentMixer->isInstrumentEmpty(id))
+ continue;
+
+ if (m_instrumentMixer->isInstrumentDormant(id)) {
+
+ for (int ch = 0; ch < 2; ++ch) {
+ RingBuffer<sample_t, 2> *rb =
+ m_instrumentMixer->getRingBuffer(id, ch);
+
+ if (rb)
+ rb->skip(m_blockSize,
+ 1);
+ }
+ } else {
+ dormant = false;
+
+ for (int ch = 0; ch < 2; ++ch) {
+ RingBuffer<sample_t, 2> *rb =
+ m_instrumentMixer->getRingBuffer(id, ch);
+
+ if (rb)
+ rb->readAdding(m_processBuffers[ch],
+ m_blockSize,
+ 1);
+ }
+ }
+ }
+
+ if (m_instrumentMixer) {
+ AudioInstrumentMixer::PluginList &plugins =
+ m_instrumentMixer->getBussPlugins(buss + 1);
+
+ // This will have to do for now!
+ if (!plugins.empty())
+ dormant = false;
+
+ for (AudioInstrumentMixer::PluginList::iterator pli =
+ plugins.begin(); pli != plugins.end(); ++pli) {
+
+ RunnablePluginInstance *plugin = *pli;
+ if (!plugin || plugin->isBypassed())
+ continue;
+
+ unsigned int ch = 0;
+
+ while (ch < plugin->getAudioInputCount()) {
+ if (ch < 2) {
+ memcpy(plugin->getAudioInputBuffers()[ch],
+ m_processBuffers[ch],
+ m_blockSize * sizeof(sample_t));
+ } else {
+ memset(plugin->getAudioInputBuffers()[ch], 0,
+ m_blockSize * sizeof(sample_t));
+ }
+ ++ch;
+ }
+
+#ifdef DEBUG_BUSS_MIXER
+ std::cerr << "Running buss plugin with " << plugin->getAudioInputCount()
+ << " inputs, " << plugin->getAudioOutputCount() << " outputs" << std::endl;
+#endif
+
+ // We don't currently maintain a record of our
+ // frame time in the buss mixer. This will screw
+ // up any plugin that requires a good frame count:
+ // at the moment that only means DSSI effects
+ // plugins using run_multiple_synths, which would
+ // be an unusual although plausible combination
+ plugin->run(RealTime::zeroTime);
+
+ ch = 0;
+
+ while (ch < 2 && ch < plugin->getAudioOutputCount()) {
+
+ denormalKill(plugin->getAudioOutputBuffers()[ch],
+ m_blockSize);
+
+ memcpy(m_processBuffers[ch],
+ plugin->getAudioOutputBuffers()[ch],
+ m_blockSize * sizeof(sample_t));
+
+ ++ch;
+ }
+ }
+ }
+
+ for (int ch = 0; ch < 2; ++ch) {
+ if (dormant) {
+ rec.buffers[ch]->zero(m_blockSize);
+ } else {
+ for (size_t j = 0; j < m_blockSize; ++j) {
+ m_processBuffers[ch][j] *= gain[ch];
+ }
+ rec.buffers[ch]->write(m_processBuffers[ch], m_blockSize);
+ }
+ }
+
+ rec.dormant = dormant;
+
+#ifdef DEBUG_BUSS_MIXER
+
+ if (m_driver->isPlaying())
+ std::cerr << "AudioBussMixer::processBlocks: buss " << buss << (dormant ? " dormant" : " not dormant") << std::endl;
+#endif
+
+ }
+ }
+
+ // any unprocessed instruments need to be skipped, or they'll block
+
+ for (int i = 0; i < audioInstruments + synthInstruments; ++i) {
+
+ if (processedInstruments[i])
+ continue;
+
+ InstrumentId id;
+ if (i < audioInstruments)
+ id = audioInstrumentBase + i;
+ else
+ id = synthInstrumentBase + (i - audioInstruments);
+
+ if (m_instrumentMixer->isInstrumentEmpty(id))
+ continue;
+
+ for (int ch = 0; ch < 2; ++ch) {
+ RingBuffer<sample_t, 2> *rb =
+ m_instrumentMixer->getRingBuffer(id, ch);
+
+ if (rb)
+ rb->skip(m_blockSize * minBlocks,
+ 1);
+ }
+ }
+
+
+#ifdef DEBUG_BUSS_MIXER
+ std::cerr << "AudioBussMixer::processBlocks: done" << std::endl;
+#endif
+}
+
+void
+AudioBussMixer::threadRun()
+{
+ while (!m_exiting) {
+
+ if (m_driver->areClocksRunning()) {
+ kick(false);
+ }
+
+ RealTime t = m_driver->getAudioMixBufferLength();
+ t = t / 2;
+ if (t < RealTime(0, 10000000))
+ t = RealTime(0, 10000000); // 10ms minimum
+
+ struct timeval now;
+ gettimeofday(&now, 0);
+ t = t + RealTime(now.tv_sec, now.tv_usec * 1000);
+
+ struct timespec timeout;
+ timeout.tv_sec = t.sec;
+ timeout.tv_nsec = t.nsec;
+
+ pthread_cond_timedwait(&m_condition, &m_lock, &timeout);
+ pthread_testcancel();
+ }
+}
+
+
+AudioInstrumentMixer::AudioInstrumentMixer(SoundDriver *driver,
+ AudioFileReader *fileReader,
+ unsigned int sampleRate,
+ unsigned int blockSize) :
+ AudioThread("AudioInstrumentMixer", driver, sampleRate),
+ m_fileReader(fileReader),
+ m_bussMixer(0),
+ m_blockSize(blockSize)
+{
+ // Pregenerate empty plugin slots
+
+ InstrumentId audioInstrumentBase;
+ int audioInstruments;
+ m_driver->getAudioInstrumentNumbers(audioInstrumentBase, audioInstruments);
+
+ InstrumentId synthInstrumentBase;
+ int synthInstruments;
+ m_driver->getSoftSynthInstrumentNumbers(synthInstrumentBase, synthInstruments);
+
+ for (int i = 0; i < audioInstruments + synthInstruments; ++i) {
+
+ InstrumentId id;
+ if (i < audioInstruments)
+ id = audioInstrumentBase + i;
+ else
+ id = synthInstrumentBase + (i - audioInstruments);
+
+ PluginList &list = m_plugins[id];
+ for (int j = 0; j < int(Instrument::PLUGIN_COUNT); ++j) {
+ list.push_back(0);
+ }
+
+ if (i >= audioInstruments) {
+ m_synths[id] = 0;
+ }
+ }
+
+ // Leave the buffer map and process buffer list empty for now.
+ // The buffer length can change between plays, so we always
+ // examine the buffers in fillBuffers and are prepared to
+ // regenerate from scratch if necessary. Don't like it though.
+}
+
+AudioInstrumentMixer::~AudioInstrumentMixer()
+{
+ std::cerr << "AudioInstrumentMixer::~AudioInstrumentMixer" << std::endl;
+ // BufferRec dtor will handle the BufferMap
+
+ removeAllPlugins();
+
+ for (std::vector<sample_t *>::iterator i = m_processBuffers.begin();
+ i != m_processBuffers.end(); ++i) {
+ delete[] *i;
+ }
+
+ std::cerr << "AudioInstrumentMixer::~AudioInstrumentMixer exiting" << std::endl;
+}
+
+AudioInstrumentMixer::BufferRec::~BufferRec()
+{
+ for (size_t i = 0; i < buffers.size(); ++i)
+ delete buffers[i];
+}
+
+
+void
+AudioInstrumentMixer::setPlugin(InstrumentId id, int position, QString identifier)
+{
+ // Not RT safe
+
+ std::cerr << "AudioInstrumentMixer::setPlugin(" << id << ", " << position << ", " << identifier << ")" << std::endl;
+
+ int channels = 2;
+ if (m_bufferMap.find(id) != m_bufferMap.end()) {
+ channels = m_bufferMap[id].channels;
+ }
+
+ RunnablePluginInstance *instance = 0;
+
+ PluginFactory *factory = PluginFactory::instanceFor(identifier);
+ if (factory) {
+ instance = factory->instantiatePlugin(identifier,
+ id,
+ position,
+ m_sampleRate,
+ m_blockSize,
+ channels);
+ if (instance && !instance->isOK()) {
+ std::cerr << "AudioInstrumentMixer::setPlugin(" << id << ", " << position
+ << ": instance is not OK" << std::endl;
+ delete instance;
+ instance = 0;
+ }
+ } else {
+ std::cerr << "AudioInstrumentMixer::setPlugin: No factory for identifier "
+ << identifier << std::endl;
+ }
+
+ RunnablePluginInstance *oldInstance = 0;
+
+ if (position == int(Instrument::SYNTH_PLUGIN_POSITION)) {
+
+ oldInstance = m_synths[id];
+ m_synths[id] = instance;
+
+ } else {
+
+ PluginList &list = m_plugins[id];
+
+ if (position < Instrument::PLUGIN_COUNT) {
+ while (position >= (int)list.size()) {
+ list.push_back(0);
+ }
+ oldInstance = list[position];
+ list[position] = instance;
+ } else {
+ std::cerr << "AudioInstrumentMixer::setPlugin: No position "
+ << position << " for instrument " << id << std::endl;
+ delete instance;
+ }
+ }
+
+ if (oldInstance) {
+ m_driver->claimUnwantedPlugin(oldInstance);
+ }
+}
+
+void
+AudioInstrumentMixer::removePlugin(InstrumentId id, int position)
+{
+ // Not RT safe
+
+ std::cerr << "AudioInstrumentMixer::removePlugin(" << id << ", " << position << ")" << std::endl;
+
+ RunnablePluginInstance *oldInstance = 0;
+
+ if (position == int(Instrument::SYNTH_PLUGIN_POSITION)) {
+
+ if (m_synths[id]) {
+ oldInstance = m_synths[id];
+ m_synths[id] = 0;
+ }
+
+ } else {
+
+ PluginList &list = m_plugins[id];
+ if (position < (int)list.size()) {
+ oldInstance = list[position];
+ list[position] = 0;
+ }
+ }
+
+ if (oldInstance) {
+ m_driver->claimUnwantedPlugin(oldInstance);
+ }
+}
+
+void
+AudioInstrumentMixer::removeAllPlugins()
+{
+ // Not RT safe
+
+ std::cerr << "AudioInstrumentMixer::removeAllPlugins" << std::endl;
+
+ for (SynthPluginMap::iterator i = m_synths.begin();
+ i != m_synths.end(); ++i) {
+ if (i->second) {
+ RunnablePluginInstance *instance = i->second;
+ i->second = 0;
+ m_driver->claimUnwantedPlugin(instance);
+ }
+ }
+
+ for (PluginMap::iterator j = m_plugins.begin();
+ j != m_plugins.end(); ++j) {
+
+ PluginList &list = j->second;
+
+ for (PluginList::iterator i = list.begin(); i != list.end(); ++i) {
+ RunnablePluginInstance *instance = *i;
+ *i = 0;
+ m_driver->claimUnwantedPlugin(instance);
+ }
+ }
+}
+
+
+RunnablePluginInstance *
+AudioInstrumentMixer::getPluginInstance(InstrumentId id, int position)
+{
+ // Not RT safe
+
+ if (position == int(Instrument::SYNTH_PLUGIN_POSITION)) {
+ return m_synths[id];
+ } else {
+ PluginList &list = m_plugins[id];
+ if (position < int(list.size()))
+ return list[position];
+ }
+ return 0;
+}
+
+
+void
+AudioInstrumentMixer::setPluginPortValue(InstrumentId id, int position,
+ unsigned int port, float value)
+{
+ // Not RT safe
+
+ RunnablePluginInstance *instance = getPluginInstance(id, position);
+
+ if (instance) {
+ instance->setPortValue(port, value);
+ }
+}
+
+float
+AudioInstrumentMixer::getPluginPortValue(InstrumentId id, int position,
+ unsigned int port)
+{
+ // Not RT safe
+
+ RunnablePluginInstance *instance = getPluginInstance(id, position);
+
+ if (instance) {
+ return instance->getPortValue(port);
+ }
+
+ return 0;
+}
+
+void
+AudioInstrumentMixer::setPluginBypass(InstrumentId id, int position, bool bypass)
+{
+ // Not RT safe
+
+ RunnablePluginInstance *instance = getPluginInstance(id, position);
+ if (instance)
+ instance->setBypassed(bypass);
+}
+
+QStringList
+AudioInstrumentMixer::getPluginPrograms(InstrumentId id, int position)
+{
+ // Not RT safe
+
+ QStringList programs;
+ RunnablePluginInstance *instance = getPluginInstance(id, position);
+ if (instance)
+ programs = instance->getPrograms();
+ return programs;
+}
+
+QString
+AudioInstrumentMixer::getPluginProgram(InstrumentId id, int position)
+{
+ // Not RT safe
+
+ QString program;
+ RunnablePluginInstance *instance = getPluginInstance(id, position);
+ if (instance)
+ program = instance->getCurrentProgram();
+ return program;
+}
+
+QString
+AudioInstrumentMixer::getPluginProgram(InstrumentId id, int position, int bank,
+ int program)
+{
+ // Not RT safe
+
+ QString programName;
+ RunnablePluginInstance *instance = getPluginInstance(id, position);
+ if (instance)
+ programName = instance->getProgram(bank, program);
+ return programName;
+}
+
+unsigned long
+AudioInstrumentMixer::getPluginProgram(InstrumentId id, int position, QString name)
+{
+ // Not RT safe
+
+ unsigned long program = 0;
+ RunnablePluginInstance *instance = getPluginInstance(id, position);
+ if (instance)
+ program = instance->getProgram(name);
+ return program;
+}
+
+void
+AudioInstrumentMixer::setPluginProgram(InstrumentId id, int position, QString program)
+{
+ // Not RT safe
+
+ RunnablePluginInstance *instance = getPluginInstance(id, position);
+ if (instance)
+ instance->selectProgram(program);
+}
+
+QString
+AudioInstrumentMixer::configurePlugin(InstrumentId id, int position, QString key, QString value)
+{
+ // Not RT safe
+
+ RunnablePluginInstance *instance = getPluginInstance(id, position);
+ if (instance)
+ return instance->configure(key, value);
+ return QString();
+}
+
+void
+AudioInstrumentMixer::discardPluginEvents()
+{
+ getLock();
+ if (m_bussMixer) m_bussMixer->getLock();
+
+ for (SynthPluginMap::iterator j = m_synths.begin();
+ j != m_synths.end(); ++j) {
+
+ RunnablePluginInstance *instance = j->second;
+ if (instance) instance->discardEvents();
+ }
+
+ for (PluginMap::iterator j = m_plugins.begin();
+ j != m_plugins.end(); ++j) {
+
+ InstrumentId id = j->first;
+
+ for (PluginList::iterator i = m_plugins[id].begin();
+ i != m_plugins[id].end(); ++i) {
+
+ RunnablePluginInstance *instance = *i;
+ if (instance) instance->discardEvents();
+ }
+ }
+
+ if (m_bussMixer) m_bussMixer->releaseLock();
+ releaseLock();
+}
+
+void
+AudioInstrumentMixer::resetAllPlugins(bool discardEvents)
+{
+ // Not RT safe
+
+ // lock required here to protect against calling
+ // activate/deactivate at the same time as run()
+
+#ifdef DEBUG_MIXER
+ std::cerr << "AudioInstrumentMixer::resetAllPlugins!" << std::endl;
+ if (discardEvents) std::cerr << "(discardEvents true)" << std::endl;
+#endif
+
+ getLock();
+ if (m_bussMixer)
+ m_bussMixer->getLock();
+
+ for (SynthPluginMap::iterator j = m_synths.begin();
+ j != m_synths.end(); ++j) {
+
+ InstrumentId id = j->first;
+
+ int channels = 2;
+ if (m_bufferMap.find(id) != m_bufferMap.end()) {
+ channels = m_bufferMap[id].channels;
+ }
+
+ RunnablePluginInstance *instance = j->second;
+
+ if (instance) {
+#ifdef DEBUG_MIXER
+ std::cerr << "AudioInstrumentMixer::resetAllPlugins: (re)setting " << channels << " channels on synth for instrument " << id << std::endl;
+#endif
+
+ if (discardEvents)
+ instance->discardEvents();
+ instance->setIdealChannelCount(channels);
+ }
+ }
+
+ for (PluginMap::iterator j = m_plugins.begin();
+ j != m_plugins.end(); ++j) {
+
+ InstrumentId id = j->first;
+
+ int channels = 2;
+ if (m_bufferMap.find(id) != m_bufferMap.end()) {
+ channels = m_bufferMap[id].channels;
+ }
+
+ for (PluginList::iterator i = m_plugins[id].begin();
+ i != m_plugins[id].end(); ++i) {
+
+ RunnablePluginInstance *instance = *i;
+
+ if (instance) {
+#ifdef DEBUG_MIXER
+ std::cerr << "AudioInstrumentMixer::resetAllPlugins: (re)setting " << channels << " channels on plugin for instrument " << id << std::endl;
+#endif
+
+ if (discardEvents)
+ instance->discardEvents();
+ instance->setIdealChannelCount(channels);
+ }
+ }
+ }
+
+ if (m_bussMixer)
+ m_bussMixer->releaseLock();
+ releaseLock();
+}
+
+void
+AudioInstrumentMixer::destroyAllPlugins()
+{
+ // Not RT safe
+
+ getLock();
+ if (m_bussMixer)
+ m_bussMixer->getLock();
+
+ // Delete immediately, as we're probably exiting here -- don't use
+ // the scavenger.
+
+ std::cerr << "AudioInstrumentMixer::destroyAllPlugins" << std::endl;
+
+ for (SynthPluginMap::iterator j = m_synths.begin();
+ j != m_synths.end(); ++j) {
+ RunnablePluginInstance *instance = j->second;
+ j->second = 0;
+ delete instance;
+ }
+
+ for (PluginMap::iterator j = m_plugins.begin();
+ j != m_plugins.end(); ++j) {
+
+ InstrumentId id = j->first;
+
+ for (PluginList::iterator i = m_plugins[id].begin();
+ i != m_plugins[id].end(); ++i) {
+
+ RunnablePluginInstance *instance = *i;
+ *i = 0;
+ delete instance;
+ }
+ }
+
+ // and tell the driver to get rid of anything already scavenged.
+ m_driver->scavengePlugins();
+
+ if (m_bussMixer)
+ m_bussMixer->releaseLock();
+ releaseLock();
+}
+
+size_t
+AudioInstrumentMixer::getPluginLatency(unsigned int id)
+{
+ // Not RT safe
+
+ size_t latency = 0;
+
+ RunnablePluginInstance *synth = m_synths[id];
+ if (synth)
+ latency += m_synths[id]->getLatency();
+
+ for (PluginList::iterator i = m_plugins[id].begin();
+ i != m_plugins[id].end(); ++i) {
+ RunnablePluginInstance *plugin = *i;
+ if (plugin)
+ latency += plugin->getLatency();
+ }
+
+ return latency;
+}
+
+void
+AudioInstrumentMixer::generateBuffers()
+{
+ // Not RT safe
+
+ InstrumentId audioInstrumentBase;
+ int audioInstruments;
+ m_driver->getAudioInstrumentNumbers(audioInstrumentBase, audioInstruments);
+
+ InstrumentId synthInstrumentBase;
+ int synthInstruments;
+ m_driver->getSoftSynthInstrumentNumbers(synthInstrumentBase, synthInstruments);
+
+ unsigned int maxChannels = 0;
+
+ int bufferSamples = m_blockSize;
+
+ if (!m_driver->getLowLatencyMode()) {
+ RealTime bufferLength = m_driver->getAudioMixBufferLength();
+ int bufferSamples = RealTime::realTime2Frame(bufferLength, m_sampleRate);
+ bufferSamples = ((bufferSamples / m_blockSize) + 1) * m_blockSize;
+#ifdef DEBUG_MIXER
+
+ std::cerr << "AudioInstrumentMixer::generateBuffers: Buffer length is " << bufferLength << "; buffer samples " << bufferSamples << " (sample rate " << m_sampleRate << ")" << std::endl;
+#endif
+
+ }
+
+ for (int i = 0; i < audioInstruments + synthInstruments; ++i) {
+
+ InstrumentId id;
+ if (i < audioInstruments)
+ id = audioInstrumentBase + i;
+ else
+ id = synthInstrumentBase + (i - audioInstruments);
+
+ // Get a fader for this instrument - if we can't then this
+ // isn't a valid audio track.
+ MappedAudioFader *fader = m_driver->getMappedStudio()->getAudioFader(id);
+
+ if (!fader) {
+#ifdef DEBUG_MIXER
+ std::cerr << "AudioInstrumentMixer::generateBuffers: no fader for audio instrument " << id << std::endl;
+#endif
+
+ continue;
+ }
+
+ float fch = 2;
+ (void)fader->getProperty(MappedAudioFader::Channels, fch);
+ unsigned int channels = (unsigned int)fch;
+
+ BufferRec &rec = m_bufferMap[id];
+
+ rec.channels = channels;
+
+ // We always have stereo buffers (for output of pan)
+ // even on a mono instrument.
+ if (channels < 2)
+ channels = 2;
+ if (channels > maxChannels)
+ maxChannels = channels;
+
+ bool replaceBuffers = (rec.buffers.size() > channels);
+
+ if (!replaceBuffers) {
+ for (size_t i = 0; i < rec.buffers.size(); ++i) {
+ if (rec.buffers[i]->getSize() != bufferSamples) {
+ replaceBuffers = true;
+ break;
+ }
+ }
+ }
+
+ if (replaceBuffers) {
+ for (size_t i = 0; i < rec.buffers.size(); ++i) {
+ delete rec.buffers[i];
+ }
+ rec.buffers.clear();
+ }
+
+ while (rec.buffers.size() < channels) {
+
+ // All our ringbuffers are set up for two readers: the
+ // buss mix thread and the main process thread for
+ // e.g. JACK. The main process thread gets the zero-id
+ // reader, so it gets the same API as if this was a
+ // single-reader buffer; the buss mixer has to remember to
+ // explicitly request reader 1.
+
+ RingBuffer<sample_t, 2> *rb =
+ new RingBuffer<sample_t, 2>(bufferSamples);
+
+ if (!rb->mlock()) {
+ // std::cerr << "WARNING: AudioInstrumentMixer::generateBuffers: couldn't lock ring buffer into real memory, performance may be impaired" << std::endl;
+ }
+ rec.buffers.push_back(rb);
+ }
+
+ float level = 0.0;
+ (void)fader->getProperty(MappedAudioFader::FaderLevel, level);
+
+ float pan = 0.0;
+ (void)fader->getProperty(MappedAudioFader::Pan, pan);
+
+ setInstrumentLevels(id, level, pan);
+ }
+
+ // Make room for up to 16 busses here, to avoid reshuffling later
+ int busses = 16;
+ if (m_bussMixer)
+ busses = std::max(busses, m_bussMixer->getBussCount());
+ for (int i = 0; i < busses; ++i) {
+ PluginList &list = m_plugins[i + 1];
+ while (list.size() < Instrument::PLUGIN_COUNT) {
+ list.push_back(0);
+ }
+ }
+
+ while (m_processBuffers.size() > maxChannels) {
+ std::vector<sample_t *>::iterator bi = m_processBuffers.end();
+ --bi;
+ delete[] *bi;
+ m_processBuffers.erase(bi);
+ }
+ while (m_processBuffers.size() < maxChannels) {
+ m_processBuffers.push_back(new sample_t[m_blockSize]);
+ }
+}
+
+void
+AudioInstrumentMixer::fillBuffers(const RealTime &currentTime)
+{
+ // Not RT safe
+
+ emptyBuffers(currentTime);
+
+ getLock();
+
+#ifdef DEBUG_MIXER
+
+ std::cerr << "AudioInstrumentMixer::fillBuffers(" << currentTime << ")" << std::endl;
+#endif
+
+ bool discard;
+ processBlocks(discard);
+
+ releaseLock();
+}
+
+void
+AudioInstrumentMixer::allocateBuffers()
+{
+ // Not RT safe
+
+ getLock();
+
+#ifdef DEBUG_MIXER
+
+ std::cerr << "AudioInstrumentMixer::allocateBuffers()" << std::endl;
+#endif
+
+ generateBuffers();
+
+ releaseLock();
+}
+
+void
+AudioInstrumentMixer::emptyBuffers(RealTime currentTime)
+{
+ // Not RT safe
+
+ getLock();
+
+#ifdef DEBUG_MIXER
+
+ std::cerr << "AudioInstrumentMixer::emptyBuffers(" << currentTime << ")" << std::endl;
+#endif
+
+ generateBuffers();
+
+ InstrumentId audioInstrumentBase;
+ int audioInstruments;
+ m_driver->getAudioInstrumentNumbers(audioInstrumentBase, audioInstruments);
+
+ InstrumentId synthInstrumentBase;
+ int synthInstruments;
+ m_driver->getSoftSynthInstrumentNumbers(synthInstrumentBase, synthInstruments);
+
+ for (int i = 0; i < audioInstruments + synthInstruments; ++i) {
+
+ InstrumentId id;
+ if (i < audioInstruments)
+ id = audioInstrumentBase + i;
+ else
+ id = synthInstrumentBase + (i - audioInstruments);
+
+ m_bufferMap[id].dormant = true;
+ m_bufferMap[id].muted = false;
+ m_bufferMap[id].zeroFrames = 0;
+ m_bufferMap[id].filledTo = currentTime;
+
+ for (size_t i = 0; i < m_bufferMap[id].buffers.size(); ++i) {
+ m_bufferMap[id].buffers[i]->reset();
+ }
+ }
+
+ releaseLock();
+}
+
+void
+AudioInstrumentMixer::setInstrumentLevels(InstrumentId id, float dB, float pan)
+{
+ // No requirement to be RT safe
+
+ BufferRec &rec = m_bufferMap[id];
+
+ float volume = AudioLevel::dB_to_multiplier(dB);
+
+ rec.gainLeft = volume * ((pan > 0.0) ? (1.0 - (pan / 100.0)) : 1.0);
+ rec.gainRight = volume * ((pan < 0.0) ? ((pan + 100.0) / 100.0) : 1.0);
+ rec.volume = volume;
+}
+
+void
+AudioInstrumentMixer::updateInstrumentMuteStates()
+{
+ SequencerDataBlock *sdb = m_driver->getSequencerDataBlock();
+ if (sdb) {
+ ControlBlock *cb = sdb->getControlBlock();
+ if (cb) {
+
+ for (BufferMap::iterator i = m_bufferMap.begin();
+ i != m_bufferMap.end(); ++i) {
+
+ InstrumentId id = i->first;
+ BufferRec &rec = i->second;
+
+ if (id >= SoftSynthInstrumentBase) {
+ rec.muted = cb->isInstrumentMuted(id);
+ } else {
+ rec.muted = cb->isInstrumentUnused(id);
+ }
+ }
+ }
+ }
+}
+
+void
+AudioInstrumentMixer::processBlocks(bool &readSomething)
+{
+ // Needs to be RT safe
+
+#ifdef DEBUG_MIXER
+ if (m_driver->isPlaying())
+ std::cerr << "AudioInstrumentMixer::processBlocks" << std::endl;
+#endif
+
+ // Profiler profiler("processBlocks", true);
+
+ const AudioPlayQueue *queue = m_driver->getAudioQueue();
+
+ for (BufferMap::iterator i = m_bufferMap.begin();
+ i != m_bufferMap.end(); ++i) {
+
+ InstrumentId id = i->first;
+ BufferRec &rec = i->second;
+
+ // This "muted" flag actually only strictly means muted when
+ // applied to synth instruments. For audio instruments it's
+ // only true if the instrument is not in use at all (see
+ // updateInstrumentMuteStates above). It's not safe to base
+ // the empty calculation on muted state for audio tracks,
+ // because that causes buffering problems when the mute is
+ // toggled for an audio track while it's playing a file.
+
+ bool empty = false;
+
+ if (rec.muted) {
+ empty = true;
+ } else {
+ if (id >= SoftSynthInstrumentBase) {
+ empty = (!m_synths[id] || m_synths[id]->isBypassed());
+ } else {
+ empty = !queue->haveFilesForInstrument(id);
+ }
+
+ if (empty) {
+ for (PluginList::iterator j = m_plugins[id].begin();
+ j != m_plugins[id].end(); ++j) {
+ if (*j != 0) {
+ empty = false;
+ break;
+ }
+ }
+ }
+ }
+
+ if (!empty && rec.empty) {
+
+ // This instrument is becoming freshly non-empty. We need
+ // to set its filledTo field to match that of an existing
+ // non-empty instrument, if we can find one.
+
+ for (BufferMap::iterator j = m_bufferMap.begin();
+ j != m_bufferMap.end(); ++j) {
+
+ if (j->first == i->first)
+ continue;
+ if (j->second.empty)
+ continue;
+
+ rec.filledTo = j->second.filledTo;
+ break;
+ }
+ }
+
+ rec.empty = empty;
+
+ // For a while we were setting empty to true if the volume on
+ // the track was zero, but that breaks continuity if there is
+ // actually a file on the track -- processEmptyBlocks won't
+ // read it, so it'll fall behind if we put the volume up again.
+ }
+
+ bool more = true;
+
+ static const int MAX_FILES_PER_INSTRUMENT = 500;
+ static PlayableAudioFile *playing[MAX_FILES_PER_INSTRUMENT];
+
+ RealTime blockDuration = RealTime::frame2RealTime(m_blockSize, m_sampleRate);
+
+ while (more) {
+
+ more = false;
+
+ for (BufferMap::iterator i = m_bufferMap.begin();
+ i != m_bufferMap.end(); ++i) {
+
+ InstrumentId id = i->first;
+ BufferRec &rec = i->second;
+
+ if (rec.empty) {
+ rec.dormant = true;
+ continue;
+ }
+
+ size_t playCount = MAX_FILES_PER_INSTRUMENT;
+
+ if (id >= SoftSynthInstrumentBase)
+ playCount = 0;
+ else {
+ queue->getPlayingFilesForInstrument(rec.filledTo,
+ blockDuration, id,
+ playing, playCount);
+ }
+
+ if (processBlock(id, playing, playCount, readSomething)) {
+ more = true;
+ }
+ }
+ }
+}
+
+
+bool
+AudioInstrumentMixer::processBlock(InstrumentId id,
+ PlayableAudioFile **playing,
+ size_t playCount,
+ bool &readSomething)
+{
+ // Needs to be RT safe
+
+ // Profiler profiler("processBlock", true);
+
+ BufferRec &rec = m_bufferMap[id];
+ RealTime bufferTime = rec.filledTo;
+
+#ifdef DEBUG_MIXER
+ // if (m_driver->isPlaying()) {
+ if ((id % 100) == 0)
+ std::cerr << "AudioInstrumentMixer::processBlock(" << id << "): buffer time is " << bufferTime << std::endl;
+ // }
+#endif
+
+ unsigned int channels = rec.channels;
+ if (channels > rec.buffers.size())
+ channels = rec.buffers.size();
+ if (channels > m_processBuffers.size())
+ channels = m_processBuffers.size();
+ if (channels == 0) {
+#ifdef DEBUG_MIXER
+ if ((id % 100) == 0)
+ std::cerr << "AudioInstrumentMixer::processBlock(" << id << "): nominal channels " << rec.channels << ", ring buffers " << rec.buffers.size() << ", process buffers " << m_processBuffers.size() << std::endl;
+#endif
+
+ return false; // buffers just haven't been set up yet
+ }
+
+ unsigned int targetChannels = channels;
+ if (targetChannels < 2)
+ targetChannels = 2; // fill at least two buffers
+
+ size_t minWriteSpace = 0;
+ for (unsigned int ch = 0; ch < targetChannels; ++ch) {
+ size_t thisWriteSpace = rec.buffers[ch]->getWriteSpace();
+ if (ch == 0 || thisWriteSpace < minWriteSpace) {
+ minWriteSpace = thisWriteSpace;
+ if (minWriteSpace < m_blockSize) {
+#ifdef DEBUG_MIXER
+ // if (m_driver->isPlaying()) {
+ if ((id % 100) == 0)
+ std::cerr << "AudioInstrumentMixer::processBlock(" << id << "): only " << minWriteSpace << " write space on channel " << ch << " for block size " << m_blockSize << std::endl;
+ // }
+#endif
+
+ return false;
+ }
+ }
+ }
+
+ PluginList &plugins = m_plugins[id];
+
+#ifdef DEBUG_MIXER
+
+ if ((id % 100) == 0 && m_driver->isPlaying())
+ std::cerr << "AudioInstrumentMixer::processBlock(" << id << "): minWriteSpace is " << minWriteSpace << std::endl;
+#else
+#ifdef DEBUG_MIXER_LIGHTWEIGHT
+
+ if ((id % 100) == 0 && m_driver->isPlaying())
+ std::cout << minWriteSpace << "/" << rec.buffers[0]->getSize() << std::endl;
+#endif
+#endif
+
+#ifdef DEBUG_MIXER
+
+ if ((id % 100) == 0 && playCount > 0)
+ std::cerr << "AudioInstrumentMixer::processBlock(" << id << "): " << playCount << " audio file(s) to consider" << std::endl;
+#endif
+
+ bool haveBlock = true;
+ bool haveMore = false;
+
+ for (size_t fileNo = 0; fileNo < playCount; ++fileNo) {
+
+ bool acceptable = false;
+ PlayableAudioFile *file = playing[fileNo];
+
+ size_t frames = file->getSampleFramesAvailable();
+ acceptable = ((frames >= m_blockSize) || file->isFullyBuffered());
+
+ if (acceptable &&
+ (minWriteSpace >= m_blockSize * 2) &&
+ (frames >= m_blockSize * 2)) {
+
+#ifdef DEBUG_MIXER
+ if ((id % 100) == 0)
+ std::cerr << "AudioInstrumentMixer::processBlock(" << id << "): will be asking for more" << std::endl;
+#endif
+
+ haveMore = true;
+ }
+
+#ifdef DEBUG_MIXER
+ if ((id % 100) == 0)
+ std::cerr << "AudioInstrumentMixer::processBlock(" << id << "): file has " << frames << " frames available" << std::endl;
+#endif
+
+ if (!acceptable) {
+
+ std::cerr << "AudioInstrumentMixer::processBlock(" << id << "): file " << file->getAudioFile()->getFilename() << " has " << frames << " frames available, says isBuffered " << file->isBuffered() << std::endl;
+
+ if (!m_driver->getLowLatencyMode()) {
+
+ // Not a serious problem, just block on this
+ // instrument and return to it a little later.
+ haveBlock = false;
+
+ } else {
+ // In low latency mode, this is a serious problem if
+ // the file has been buffered and simply isn't filling
+ // fast enough. Otherwise we have to assume that the
+ // problem is something like a new file being dropped
+ // in by unmute during playback, in which case we have
+ // to accept that it won't be available for a while
+ // and just read silence from it instead.
+ if (file->isBuffered()) {
+ m_driver->reportFailure(MappedEvent::FailureDiscUnderrun);
+ haveBlock = false;
+ } else {
+ // ignore happily.
+ }
+ }
+ }
+ }
+
+ if (!haveBlock) {
+ return false; // blocked;
+ }
+
+#ifdef DEBUG_MIXER
+ if (!haveMore) {
+ if ((id % 100) == 0)
+ std::cerr << "AudioInstrumentMixer::processBlock(" << id << "): won't be asking for more" << std::endl;
+ }
+#endif
+
+ for (unsigned int ch = 0; ch < targetChannels; ++ch) {
+ memset(m_processBuffers[ch], 0, sizeof(sample_t) * m_blockSize);
+ }
+
+ RunnablePluginInstance *synth = m_synths[id];
+
+ if (synth && !synth->isBypassed()) {
+
+ synth->run(bufferTime);
+
+ unsigned int ch = 0;
+
+ while (ch < synth->getAudioOutputCount() && ch < channels) {
+ denormalKill(synth->getAudioOutputBuffers()[ch],
+ m_blockSize);
+ memcpy(m_processBuffers[ch],
+ synth->getAudioOutputBuffers()[ch],
+ m_blockSize * sizeof(sample_t));
+ ++ch;
+ }
+ }
+
+ if (haveBlock) {
+
+ // Mix in a block from each playing file on this instrument.
+
+ for (size_t fileNo = 0; fileNo < playCount; ++fileNo) {
+
+ PlayableAudioFile *file = playing[fileNo];
+
+ size_t offset = 0;
+ size_t blockSize = m_blockSize;
+
+ if (file->getStartTime() > bufferTime) {
+ offset = RealTime::realTime2Frame
+ (file->getStartTime() - bufferTime, m_sampleRate);
+ if (offset < blockSize)
+ blockSize -= offset;
+ else
+ blockSize = 0;
+#ifdef DEBUG_MIXER
+
+ std::cerr << "AudioInstrumentMixer::processBlock: file starts at offset " << offset << ", block size now " << blockSize << std::endl;
+#endif
+
+ }
+
+ //!!! This addSamples call is what is supposed to signal
+ // to a playable audio file when the end of the file has
+ // been reached. But for some playables it appears the
+ // file overruns, possibly due to rounding errors in
+ // sample rate conversion, and so we stop reading from it
+ // before it's actually done. I don't particularly mind
+ // that from a sound quality POV (after all it's badly
+ // resampled already) but unfortunately it means we leak
+ // pooled buffers.
+
+ if (blockSize > 0) {
+ file->addSamples(m_processBuffers, channels, blockSize, offset);
+ readSomething = true;
+ }
+ }
+ }
+
+ // Apply plugins. There are various copy-reducing
+ // optimisations available here, but we're not even going to
+ // think about them yet. Note that we force plugins to mono
+ // on a mono track, even though we have stereo output buffers
+ // -- stereo only comes into effect at the pan stage, and
+ // these are pre-fader plugins.
+
+ for (PluginList::iterator pli = plugins.begin();
+ pli != plugins.end(); ++pli) {
+
+ RunnablePluginInstance *plugin = *pli;
+ if (!plugin || plugin->isBypassed())
+ continue;
+
+ unsigned int ch = 0;
+
+ // If a plugin has more input channels than we have
+ // available, we duplicate up to stereo and leave any
+ // remaining channels empty.
+
+ while (ch < plugin->getAudioInputCount()) {
+
+ if (ch < channels || ch < 2) {
+ memcpy(plugin->getAudioInputBuffers()[ch],
+ m_processBuffers[ch % channels],
+ m_blockSize * sizeof(sample_t));
+ } else {
+ memset(plugin->getAudioInputBuffers()[ch], 0,
+ m_blockSize * sizeof(sample_t));
+ }
+ ++ch;
+ }
+
+#ifdef DEBUG_MIXER
+ std::cerr << "Running plugin with " << plugin->getAudioInputCount()
+ << " inputs, " << plugin->getAudioOutputCount() << " outputs" << std::endl;
+#endif
+
+ plugin->run(bufferTime);
+
+ ch = 0;
+
+ while (ch < plugin->getAudioOutputCount()) {
+
+ denormalKill(plugin->getAudioOutputBuffers()[ch],
+ m_blockSize);
+
+ if (ch < channels) {
+ memcpy(m_processBuffers[ch],
+ plugin->getAudioOutputBuffers()[ch],
+ m_blockSize * sizeof(sample_t));
+ } else if (ch == 1) {
+ // stereo output from plugin on a mono track
+ for (size_t i = 0; i < m_blockSize; ++i) {
+ m_processBuffers[0][i] +=
+ plugin->getAudioOutputBuffers()[ch][i];
+ m_processBuffers[0][i] /= 2;
+ }
+ } else {
+ break;
+ }
+
+ ++ch;
+ }
+ }
+
+ // special handling for pan on mono tracks
+
+ bool allZeros = true;
+
+ if (targetChannels == 2 && channels == 1) {
+
+ for (size_t i = 0; i < m_blockSize; ++i) {
+
+ sample_t sample = m_processBuffers[0][i];
+
+ m_processBuffers[0][i] = sample * rec.gainLeft;
+ m_processBuffers[1][i] = sample * rec.gainRight;
+
+ if (allZeros && sample != 0.0)
+ allZeros = false;
+ }
+
+ rec.buffers[0]->write(m_processBuffers[0], m_blockSize);
+ rec.buffers[1]->write(m_processBuffers[1], m_blockSize);
+
+ } else {
+
+ for (unsigned int ch = 0; ch < targetChannels; ++ch) {
+
+ float gain = ((ch == 0) ? rec.gainLeft :
+ (ch == 1) ? rec.gainRight : rec.volume);
+
+ for (size_t i = 0; i < m_blockSize; ++i) {
+
+ // handle volume and pan
+ m_processBuffers[ch][i] *= gain;
+
+ if (allZeros && m_processBuffers[ch][i] != 0.0)
+ allZeros = false;
+ }
+
+ rec.buffers[ch]->write(m_processBuffers[ch], m_blockSize);
+ }
+ }
+
+ bool dormant = true;
+
+ if (allZeros) {
+ rec.zeroFrames += m_blockSize;
+ for (unsigned int ch = 0; ch < targetChannels; ++ch) {
+ if (rec.buffers[ch]->getReadSpace() > rec.zeroFrames) {
+ dormant = false;
+ }
+ }
+ } else {
+ rec.zeroFrames = 0;
+ dormant = false;
+ }
+
+#ifdef DEBUG_MIXER
+ if ((id % 100) == 0 && m_driver->isPlaying())
+ std::cerr << "AudioInstrumentMixer::processBlock(" << id << "): setting dormant to " << dormant << std::endl;
+#endif
+
+ rec.dormant = dormant;
+ bufferTime = bufferTime + RealTime::frame2RealTime(m_blockSize,
+ m_sampleRate);
+
+ rec.filledTo = bufferTime;
+
+#ifdef DEBUG_MIXER
+
+ if ((id % 100) == 0)
+ std::cerr << "AudioInstrumentMixer::processBlock(" << id << "): done, returning " << haveMore << std::endl;
+#endif
+
+ return haveMore;
+}
+
+void
+AudioInstrumentMixer::kick(bool wantLock)
+{
+ // Needs to be RT safe if wantLock is not specified
+
+ if (wantLock)
+ getLock();
+
+ bool readSomething = false;
+ processBlocks(readSomething);
+ if (readSomething)
+ m_fileReader->signal();
+
+ if (wantLock)
+ releaseLock();
+}
+
+
+void
+AudioInstrumentMixer::threadRun()
+{
+ while (!m_exiting) {
+
+ if (m_driver->areClocksRunning()) {
+ kick(false);
+ }
+
+ RealTime t = m_driver->getAudioMixBufferLength();
+ t = t / 2;
+ if (t < RealTime(0, 10000000))
+ t = RealTime(0, 10000000); // 10ms minimum
+
+ struct timeval now;
+ gettimeofday(&now, 0);
+ t = t + RealTime(now.tv_sec, now.tv_usec * 1000);
+
+ struct timespec timeout;
+ timeout.tv_sec = t.sec;
+ timeout.tv_nsec = t.nsec;
+
+ pthread_cond_timedwait(&m_condition, &m_lock, &timeout);
+ pthread_testcancel();
+ }
+}
+
+
+
+AudioFileReader::AudioFileReader(SoundDriver *driver,
+ unsigned int sampleRate) :
+ AudioThread("AudioFileReader", driver, sampleRate)
+{
+ // nothing else here
+}
+
+AudioFileReader::~AudioFileReader()
+{}
+
+void
+AudioFileReader::fillBuffers(const RealTime &currentTime)
+{
+ getLock();
+
+ // Tell every audio file the play start time.
+
+ const AudioPlayQueue *queue = m_driver->getAudioQueue();
+
+ RealTime bufferLength = m_driver->getAudioReadBufferLength();
+ int bufferFrames = RealTime::realTime2Frame(bufferLength, m_sampleRate);
+
+ int poolSize = queue->getMaxBuffersRequired() * 2 + 4;
+ PlayableAudioFile::setRingBufferPoolSizes(poolSize, bufferFrames);
+
+ const AudioPlayQueue::FileSet &files = queue->getAllScheduledFiles();
+
+#ifdef DEBUG_READER
+
+ std::cerr << "AudioFileReader::fillBuffers: have " << files.size() << " audio files total" << std::endl;
+#endif
+
+ for (AudioPlayQueue::FileSet::const_iterator fi = files.begin();
+ fi != files.end(); ++fi) {
+ (*fi)->clearBuffers();
+ }
+
+ int allocated = 0;
+ for (AudioPlayQueue::FileSet::const_iterator fi = files.begin();
+ fi != files.end(); ++fi) {
+ (*fi)->fillBuffers(currentTime);
+ if ((*fi)->getEndTime() >= currentTime) {
+ if (++allocated == poolSize)
+ break;
+ } // else the file's ring buffers will have been returned
+ }
+
+ releaseLock();
+}
+
+bool
+AudioFileReader::kick(bool wantLock)
+{
+ if (wantLock)
+ getLock();
+
+ RealTime now = m_driver->getSequencerTime();
+ const AudioPlayQueue *queue = m_driver->getAudioQueue();
+
+ bool someFilled = false;
+
+ // Tell files that are playing or will be playing in the next few
+ // seconds to update.
+
+ AudioPlayQueue::FileSet playing;
+
+ queue->getPlayingFiles
+ (now, RealTime(3, 0) + m_driver->getAudioReadBufferLength(), playing);
+
+ for (AudioPlayQueue::FileSet::iterator fi = playing.begin();
+ fi != playing.end(); ++fi) {
+
+ if (!(*fi)->isBuffered()) {
+ // fillBuffers has not been called on this file. This
+ // happens when a file is unmuted during playback. The
+ // results are unpredictable because we can no longer
+ // synchronise with the correct JACK callback slice at
+ // this point, but this is better than allowing the file
+ // to update from its start as would otherwise happen.
+ (*fi)->fillBuffers(now);
+ someFilled = true;
+ } else {
+ if ((*fi)->updateBuffers())
+ someFilled = true;
+ }
+ }
+
+ if (wantLock)
+ releaseLock();
+
+ return someFilled;
+}
+
+void
+AudioFileReader::threadRun()
+{
+ while (!m_exiting) {
+
+ // struct timeval now;
+ // gettimeofday(&now, 0);
+ // RealTime t = RealTime(now.tv_sec, now.tv_usec * 1000);
+
+ bool someFilled = false;
+
+ if (m_driver->areClocksRunning()) {
+ someFilled = kick(false);
+ }
+
+ if (someFilled) {
+
+ releaseLock();
+ getLock();
+
+ } else {
+
+ RealTime bt = m_driver->getAudioReadBufferLength();
+ bt = bt / 2;
+ if (bt < RealTime(0, 10000000))
+ bt = RealTime(0, 10000000); // 10ms minimum
+
+ struct timeval now;
+ gettimeofday(&now, 0);
+ RealTime t = bt + RealTime(now.tv_sec, now.tv_usec * 1000);
+
+ struct timespec timeout;
+ timeout.tv_sec = t.sec;
+ timeout.tv_nsec = t.nsec;
+
+ pthread_cond_timedwait(&m_condition, &m_lock, &timeout);
+ pthread_testcancel();
+ }
+ }
+}
+
+
+
+AudioFileWriter::AudioFileWriter(SoundDriver *driver,
+ unsigned int sampleRate) :
+ AudioThread("AudioFileWriter", driver, sampleRate)
+{
+ InstrumentId instrumentBase;
+ int instrumentCount;
+ m_driver->getAudioInstrumentNumbers(instrumentBase, instrumentCount);
+
+ for (InstrumentId id = instrumentBase;
+ id < instrumentBase + instrumentCount; ++id) {
+
+ // prefill with zero files in all slots, so that we can
+ // refer to the map without a lock (as the number of
+ // instruments won't change)
+
+ m_files[id] = FilePair(0, 0);
+ }
+}
+
+AudioFileWriter::~AudioFileWriter()
+{}
+
+
+bool
+AudioFileWriter::openRecordFile(InstrumentId id,
+ const std::string &fileName)
+{
+ getLock();
+
+ if (m_files[id].first) {
+ releaseLock();
+ std::cerr << "AudioFileWriter::openRecordFile: already have record file for instrument " << id << "!" << std::endl;
+ return false; // already have one
+ }
+
+#ifdef DEBUG_WRITER
+ std::cerr << "AudioFileWriter::openRecordFile: instrument id is " << id << std::endl;
+#endif
+
+ MappedAudioFader *fader = m_driver->getMappedStudio()->getAudioFader(id);
+
+ RealTime bufferLength = m_driver->getAudioWriteBufferLength();
+ int bufferSamples = RealTime::realTime2Frame(bufferLength, m_sampleRate);
+ bufferSamples = ((bufferSamples / 1024) + 1) * 1024;
+
+ if (fader) {
+ float fch = 2;
+ (void)fader->getProperty(MappedAudioFader::Channels, fch);
+ int channels = (int)fch;
+
+ RIFFAudioFile::SubFormat format = m_driver->getAudioRecFileFormat();
+
+ int bytesPerSample = (format == RIFFAudioFile::PCM ? 2 : 4) * channels;
+ int bitsPerSample = (format == RIFFAudioFile::PCM ? 16 : 32);
+
+ AudioFile *recordFile = 0;
+
+ try {
+ recordFile =
+ new WAVAudioFile(fileName,
+ channels, // channels
+ m_sampleRate, // samples per second
+ m_sampleRate *
+ bytesPerSample, // bytes per second
+ bytesPerSample, // bytes per frame
+ bitsPerSample); // bits per sample
+
+ // open the file for writing
+ //
+ if (!recordFile->write()) {
+ std::cerr << "AudioFileWriter::openRecordFile: failed to open " << fileName << " for writing" << std::endl;
+ delete recordFile;
+ releaseLock();
+ return false;
+ }
+ } catch (SoundFile::BadSoundFileException e) {
+ std::cerr << "AudioFileWriter::openRecordFile: failed to open " << fileName << " for writing: " << e.getMessage() << std::endl;
+ delete recordFile;
+ releaseLock();
+ return false;
+ }
+
+ RecordableAudioFile *raf = new RecordableAudioFile(recordFile,
+ bufferSamples);
+ m_files[id].second = raf;
+ m_files[id].first = recordFile;
+
+#ifdef DEBUG_WRITER
+
+ std::cerr << "AudioFileWriter::openRecordFile: created " << channels << "-channel file at " << fileName << " (id is " << recordFile->getId() << ")" << std::endl;
+#endif
+
+ releaseLock();
+ return true;
+ }
+
+ std::cerr << "AudioFileWriter::openRecordFile: no audio fader for record instrument " << id << "!" << std::endl;
+ releaseLock();
+ return false;
+}
+
+
+void
+AudioFileWriter::write(InstrumentId id,
+ const sample_t *samples,
+ int channel,
+ size_t sampleCount)
+{
+ if (!m_files[id].first)
+ return ; // no file
+ if (m_files[id].second->buffer(samples, channel, sampleCount) < sampleCount) {
+ m_driver->reportFailure(MappedEvent::FailureDiscOverrun);
+ }
+}
+
+bool
+AudioFileWriter::closeRecordFile(InstrumentId id, AudioFileId &returnedId)
+{
+ if (!m_files[id].first)
+ return false;
+
+ returnedId = m_files[id].first->getId();
+ m_files[id].second->setStatus(RecordableAudioFile::DEFUNCT);
+
+#ifdef DEBUG_WRITER
+
+ std::cerr << "AudioFileWriter::closeRecordFile: instrument " << id << " file set defunct (file ID is " << returnedId << ")" << std::endl;
+#endif
+
+ // Don't reset the file pointers here; that will be done in the
+ // next call to kick(). Doesn't really matter when that happens,
+ // but let's encourage it to happen soon just for certainty.
+ signal();
+
+ return true;
+}
+
+bool
+AudioFileWriter::haveRecordFileOpen(InstrumentId id)
+{
+ InstrumentId instrumentBase;
+ int instrumentCount;
+ m_driver->getAudioInstrumentNumbers(instrumentBase, instrumentCount);
+
+ if (id < instrumentBase || id >= instrumentBase + instrumentCount) {
+ return false;
+ }
+
+ return (m_files[id].first &&
+ (m_files[id].second->getStatus() != RecordableAudioFile::DEFUNCT));
+}
+
+bool
+AudioFileWriter::haveRecordFilesOpen()
+{
+ InstrumentId instrumentBase;
+ int instrumentCount;
+ m_driver->getAudioInstrumentNumbers(instrumentBase, instrumentCount);
+
+ for (InstrumentId id = instrumentBase; id < instrumentBase + instrumentCount; ++id) {
+
+ if (m_files[id].first &&
+ (m_files[id].second->getStatus() != RecordableAudioFile::DEFUNCT)) {
+#ifdef DEBUG_WRITER
+ std::cerr << "AudioFileWriter::haveRecordFilesOpen: found open record file for instrument " << id << std::endl;
+#endif
+
+ return true;
+ }
+ }
+#ifdef DEBUG_WRITER
+ std::cerr << "AudioFileWriter::haveRecordFilesOpen: nope" << std::endl;
+#endif
+
+ return false;
+}
+
+void
+AudioFileWriter::kick(bool wantLock)
+{
+ if (wantLock)
+ getLock();
+
+ InstrumentId instrumentBase;
+ int instrumentCount;
+ m_driver->getAudioInstrumentNumbers(instrumentBase, instrumentCount);
+
+ for (InstrumentId id = instrumentBase;
+ id < instrumentBase + instrumentCount; ++id) {
+
+ if (!m_files[id].first)
+ continue;
+
+ RecordableAudioFile *raf = m_files[id].second;
+
+ if (raf->getStatus() == RecordableAudioFile::DEFUNCT) {
+
+#ifdef DEBUG_WRITER
+ std::cerr << "AudioFileWriter::kick: found defunct file on instrument " << id << std::endl;
+#endif
+
+ m_files[id].first = 0;
+ delete raf; // also deletes the AudioFile
+ m_files[id].second = 0;
+
+ } else {
+#ifdef DEBUG_WRITER
+ std::cerr << "AudioFileWriter::kick: writing file on instrument " << id << std::endl;
+#endif
+
+ raf->write();
+ }
+ }
+
+ if (wantLock)
+ releaseLock();
+}
+
+void
+AudioFileWriter::threadRun()
+{
+ while (!m_exiting) {
+
+ kick(false);
+
+ RealTime t = m_driver->getAudioWriteBufferLength();
+ t = t / 2;
+ if (t < RealTime(0, 10000000))
+ t = RealTime(0, 10000000); // 10ms minimum
+
+ struct timeval now;
+ gettimeofday(&now, 0);
+ t = t + RealTime(now.tv_sec, now.tv_usec * 1000);
+
+ struct timespec timeout;
+ timeout.tv_sec = t.sec;
+ timeout.tv_nsec = t.nsec;
+
+ pthread_cond_timedwait(&m_condition, &m_lock, &timeout);
+ pthread_testcancel();
+ }
+}
+
+
+}
+
diff --git a/src/sound/AudioProcess.h b/src/sound/AudioProcess.h
new file mode 100644
index 0000000..b517bc9
--- /dev/null
+++ b/src/sound/AudioProcess.h
@@ -0,0 +1,390 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _AUDIO_PROCESS_H_
+#define _AUDIO_PROCESS_H_
+
+#include "SoundDriver.h"
+#include "Instrument.h"
+#include "RealTime.h"
+#include "RingBuffer.h"
+#include "RunnablePluginInstance.h"
+#include "AudioPlayQueue.h"
+#include "RecordableAudioFile.h"
+
+namespace Rosegarden
+{
+
+class AudioThread
+{
+public:
+ typedef float sample_t;
+
+ AudioThread(std::string name, // for diagnostics
+ SoundDriver *driver,
+ unsigned int sampleRate);
+
+ virtual ~AudioThread();
+
+ // This is to be called by the owning class after construction.
+ void run();
+
+ // This is to be called by the owning class to cause the thread to
+ // exit and clean up, before destruction.
+ void terminate();
+
+ bool running() const { return m_running; }
+
+ int getLock();
+ int tryLock();
+ int releaseLock();
+ void signal();
+
+protected:
+ virtual void threadRun() = 0;
+ virtual int getPriority() { return 0; }
+
+ std::string m_name;
+
+ SoundDriver *m_driver;
+ unsigned int m_sampleRate;
+
+ pthread_t m_thread;
+ pthread_mutex_t m_lock;
+ pthread_cond_t m_condition;
+ bool m_running;
+ volatile bool m_exiting;
+
+private:
+ static void *staticThreadRun(void *arg);
+ static void staticThreadCleanup(void *arg);
+};
+
+
+class AudioInstrumentMixer;
+
+class AudioBussMixer : public AudioThread
+{
+public:
+ AudioBussMixer(SoundDriver *driver,
+ AudioInstrumentMixer *instrumentMixer,
+ unsigned int sampleRate,
+ unsigned int blockSize);
+
+ virtual ~AudioBussMixer();
+
+ void kick(bool wantLock = true, bool signalInstrumentMixer = true);
+
+ /**
+ * Prebuffer. This should be called only when the transport is
+ * not running. This also calls fillBuffers on the instrument
+ * mixer.
+ */
+ void fillBuffers(const RealTime &currentTime);
+
+ /**
+ * Empty and discard buffer contents.
+ */
+ void emptyBuffers();
+
+ int getBussCount() {
+ return m_bussCount;
+ }
+
+ /**
+ * A buss is "dormant" if every readable sample on every one of
+ * its buffers is zero. It can therefore be safely skipped during
+ * playback.
+ */
+ bool isBussDormant(int buss) {
+ return m_bufferMap[buss].dormant;
+ }
+
+ /**
+ * Busses are currently always stereo.
+ */
+ RingBuffer<sample_t> *getRingBuffer(int buss, unsigned int channel) {
+ if (channel < m_bufferMap[buss].buffers.size()) {
+ return m_bufferMap[buss].buffers[channel];
+ } else {
+ return 0;
+ }
+ }
+
+ /// For call from MappedStudio. Pan is in range -100.0 -> 100.0
+ void setBussLevels(int buss, float dB, float pan);
+
+ /// For call regularly from anywhere in a non-RT thread
+ void updateInstrumentConnections();
+
+protected:
+ virtual void threadRun();
+
+ void processBlocks();
+ void generateBuffers();
+
+ AudioInstrumentMixer *m_instrumentMixer;
+ unsigned int m_blockSize;
+ int m_bussCount;
+
+ std::vector<sample_t *> m_processBuffers;
+
+ struct BufferRec
+ {
+ BufferRec() : dormant(true), buffers(), instruments(),
+ gainLeft(0.0), gainRight(0.0) { }
+ ~BufferRec();
+
+ bool dormant;
+
+ std::vector<RingBuffer<sample_t> *> buffers;
+ std::vector<bool> instruments; // index is instrument id minus base
+
+ float gainLeft;
+ float gainRight;
+ };
+
+ typedef std::map<int, BufferRec> BufferMap;
+ BufferMap m_bufferMap;
+};
+
+
+class AudioFileReader;
+class AudioFileWriter;
+
+class AudioInstrumentMixer : public AudioThread
+{
+public:
+ typedef std::vector<RunnablePluginInstance *> PluginList;
+ typedef std::map<InstrumentId, PluginList> PluginMap;
+ typedef std::map<InstrumentId, RunnablePluginInstance *> SynthPluginMap;
+
+ AudioInstrumentMixer(SoundDriver *driver,
+ AudioFileReader *fileReader,
+ unsigned int sampleRate,
+ unsigned int blockSize);
+
+ virtual ~AudioInstrumentMixer();
+
+ void kick(bool wantLock = true);
+
+ void setBussMixer(AudioBussMixer *mixer) { m_bussMixer = mixer; }
+
+ void setPlugin(InstrumentId id, int position, QString identifier);
+ void removePlugin(InstrumentId id, int position);
+ void removeAllPlugins();
+
+ void setPluginPortValue(InstrumentId id, int position,
+ unsigned int port, float value);
+ float getPluginPortValue(InstrumentId id, int position,
+ unsigned int port);
+
+ void setPluginBypass(InstrumentId, int position, bool bypass);
+
+ QStringList getPluginPrograms(InstrumentId, int);
+ QString getPluginProgram(InstrumentId, int);
+ QString getPluginProgram(InstrumentId, int, int, int);
+ unsigned long getPluginProgram(InstrumentId, int, QString);
+ void setPluginProgram(InstrumentId, int, QString);
+
+ QString configurePlugin(InstrumentId, int, QString, QString);
+
+ void resetAllPlugins(bool discardEvents = false);
+ void discardPluginEvents();
+ void destroyAllPlugins();
+
+ RunnablePluginInstance *getSynthPlugin(InstrumentId id) { return m_synths[id]; }
+
+ /**
+ * Return the plugins intended for a particular buss. (By coincidence,
+ * this will also work for instruments, but it's not to be relied on.)
+ * It's purely by historical accident that the instrument mixer happens
+ * to hold buss plugins as well -- this could do with being refactored.
+ */
+ PluginList &getBussPlugins(unsigned int bussId) { return m_plugins[bussId]; }
+
+ /**
+ * Return the total of the plugin latencies for a given instrument
+ * or buss id.
+ */
+ size_t getPluginLatency(unsigned int id);
+
+ /**
+ * Prebuffer. This should be called only when the transport is
+ * not running.
+ */
+ void fillBuffers(const RealTime &currentTime);
+
+ /**
+ * Ensure plugins etc have enough buffers. This is also done by
+ * fillBuffers and only needs to be called here if the extra work
+ * involved in fillBuffers is not desirable.
+ */
+ void allocateBuffers();
+
+ /**
+ * Empty and discard buffer contents.
+ */
+ void emptyBuffers(RealTime currentTime = RealTime::zeroTime);
+
+ /**
+ * An instrument is "empty" if it has no audio files, synths or
+ * plugins assigned to it, and so cannot generate sound. Empty
+ * instruments can safely be ignored during playback.
+ */
+ bool isInstrumentEmpty(InstrumentId id) {
+ return m_bufferMap[id].empty;
+ }
+
+ /**
+ * An instrument is "dormant" if every readable sample on every
+ * one of its buffers is zero. Dormant instruments can safely be
+ * skipped rather than mixed during playback, but they should not
+ * be ignored (unless also empty).
+ */
+ bool isInstrumentDormant(InstrumentId id) {
+ return m_bufferMap[id].dormant;
+ }
+
+ /**
+ * We always have at least two channels (and hence buffers) by
+ * this point, because even on a mono instrument we still have a
+ * Pan setting which will have been applied by the time we get to
+ * these buffers.
+ */
+ RingBuffer<sample_t, 2> *getRingBuffer(InstrumentId id, unsigned int channel) {
+ if (channel < m_bufferMap[id].buffers.size()) {
+ return m_bufferMap[id].buffers[channel];
+ } else {
+ return 0;
+ }
+ }
+
+ /// For call from MappedStudio. Pan is in range -100.0 -> 100.0
+ void setInstrumentLevels(InstrumentId instrument, float dB, float pan);
+
+ /// For call regularly from anywhere in a non-RT thread
+ void updateInstrumentMuteStates();
+
+protected:
+ virtual void threadRun();
+
+ virtual int getPriority() { return 3; }
+
+ void processBlocks(bool &readSomething);
+ void processEmptyBlocks(InstrumentId id);
+ bool processBlock(InstrumentId id, PlayableAudioFile **, size_t, bool &readSomething);
+ void generateBuffers();
+
+ AudioFileReader *m_fileReader;
+ AudioBussMixer *m_bussMixer;
+ unsigned int m_blockSize;
+
+ // The plugin data structures will all be pre-sized and so of
+ // fixed size during normal run time; this will allow us to add
+ // and edit plugins without locking.
+ RunnablePluginInstance *getPluginInstance(InstrumentId, int);
+ PluginMap m_plugins;
+ SynthPluginMap m_synths;
+
+ // maintain the same number of these as the maximum number of
+ // channels on any audio instrument
+ std::vector<sample_t *> m_processBuffers;
+
+ struct BufferRec
+ {
+ BufferRec() : empty(true), dormant(true), zeroFrames(0),
+ filledTo(RealTime::zeroTime), channels(2),
+ buffers(), gainLeft(0.0), gainRight(0.0), volume(0.0),
+ muted(false) { }
+ ~BufferRec();
+
+ bool empty;
+ bool dormant;
+ size_t zeroFrames;
+
+ RealTime filledTo;
+ size_t channels;
+ std::vector<RingBuffer<sample_t, 2> *> buffers;
+
+ float gainLeft;
+ float gainRight;
+ float volume;
+ bool muted;
+ };
+
+ typedef std::map<InstrumentId, BufferRec> BufferMap;
+ BufferMap m_bufferMap;
+};
+
+
+class AudioFileReader : public AudioThread
+{
+public:
+ AudioFileReader(SoundDriver *driver,
+ unsigned int sampleRate);
+
+ virtual ~AudioFileReader();
+
+ bool kick(bool wantLock = true);
+
+ /**
+ * Prebuffer. This should be called only when the transport is
+ * not running.
+ */
+ void fillBuffers(const RealTime &currentTime);
+
+protected:
+ virtual void threadRun();
+};
+
+
+class AudioFileWriter : public AudioThread
+{
+public:
+ AudioFileWriter(SoundDriver *driver,
+ unsigned int sampleRate);
+
+ virtual ~AudioFileWriter();
+
+ void kick(bool wantLock = true);
+
+ bool openRecordFile(InstrumentId id, const std::string &fileName);
+ bool closeRecordFile(InstrumentId id, AudioFileId &returnedId);
+
+ bool haveRecordFileOpen(InstrumentId id);
+ bool haveRecordFilesOpen();
+
+ void write(InstrumentId id, const sample_t *, int channel, size_t samples);
+
+protected:
+ virtual void threadRun();
+
+ typedef std::pair<AudioFile *, RecordableAudioFile *> FilePair;
+ typedef std::map<InstrumentId, FilePair> FileMap;
+ FileMap m_files;
+};
+
+
+}
+
+#endif
+
diff --git a/src/sound/AudioTimeStretcher.cpp b/src/sound/AudioTimeStretcher.cpp
new file mode 100644
index 0000000..392693e
--- /dev/null
+++ b/src/sound/AudioTimeStretcher.cpp
@@ -0,0 +1,667 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Sonic Visualiser
+ An audio file viewer and annotation editor.
+ Centre for Digital Music, Queen Mary, University of London.
+ This file copyright 2006 Chris Cannam and QMUL.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include "AudioTimeStretcher.h"
+
+#include <iostream>
+#include <fstream>
+#include <cassert>
+#include <cstring>
+
+namespace Rosegarden
+{
+
+static double mod(double x, double y) { return x - (y * floor(x / y)); }
+static float modf(float x, float y) { return x - (y * floorf(x / y)); }
+
+static double princarg(double a) { return mod(a + M_PI, -2 * M_PI) + M_PI; }
+static float princargf(float a) { return modf(a + M_PI, -2 * M_PI) + M_PI; }
+
+
+//#define DEBUG_AUDIO_TIME_STRETCHER 1
+
+AudioTimeStretcher::AudioTimeStretcher(size_t sampleRate,
+ size_t channels,
+ float ratio,
+ bool sharpen,
+ size_t maxOutputBlockSize) :
+ m_sampleRate(sampleRate),
+ m_channels(channels),
+ m_maxOutputBlockSize(maxOutputBlockSize),
+ m_ratio(ratio),
+ m_sharpen(sharpen),
+ m_totalCount(0),
+ m_transientCount(0),
+ m_n2sum(0),
+ m_n2total(0),
+ m_adjustCount(50)
+{
+ pthread_mutex_t initialisingMutex = PTHREAD_MUTEX_INITIALIZER;
+ memcpy(&m_mutex, &initialisingMutex, sizeof(pthread_mutex_t));
+
+ initialise();
+}
+
+AudioTimeStretcher::~AudioTimeStretcher()
+{
+ std::cerr << "AudioTimeStretcher::~AudioTimeStretcher" << std::endl;
+
+ std::cerr << "AudioTimeStretcher::~AudioTimeStretcher: actual ratio = " << (m_totalCount > 0 ? (float (m_n2total) / float(m_totalCount * m_n1)) : 1.f) << ", ideal = " << m_ratio << ", nominal = " << getRatio() << ")" << std::endl;
+
+ cleanup();
+
+ pthread_mutex_destroy(&m_mutex);
+}
+
+void
+AudioTimeStretcher::initialise()
+{
+ std::cerr << "AudioTimeStretcher::initialise" << std::endl;
+
+ calculateParameters();
+
+ m_analysisWindow = new SampleWindow<float>(SampleWindow<float>::Hanning, m_wlen);
+ m_synthesisWindow = new SampleWindow<float>(SampleWindow<float>::Hanning, m_wlen);
+
+ m_prevPhase = new float *[m_channels];
+ m_prevAdjustedPhase = new float *[m_channels];
+
+ m_prevTransientMag = (float *)fftwf_malloc(sizeof(float) * (m_wlen / 2 + 1));
+ m_prevTransientScore = 0;
+ m_prevTransient = false;
+
+ m_tempbuf = (float *)fftwf_malloc(sizeof(float) * m_wlen);
+
+ m_time = new float *[m_channels];
+ m_freq = new fftwf_complex *[m_channels];
+ m_plan = new fftwf_plan[m_channels];
+ m_iplan = new fftwf_plan[m_channels];
+
+ m_inbuf = new RingBuffer<float> *[m_channels];
+ m_outbuf = new RingBuffer<float> *[m_channels];
+ m_mashbuf = new float *[m_channels];
+
+ m_modulationbuf = (float *)fftwf_malloc(sizeof(float) * m_wlen);
+
+ for (size_t c = 0; c < m_channels; ++c) {
+
+ m_prevPhase[c] = (float *)fftwf_malloc(sizeof(float) * (m_wlen / 2 + 1));
+ m_prevAdjustedPhase[c] = (float *)fftwf_malloc(sizeof(float) * (m_wlen / 2 + 1));
+
+ m_time[c] = (float *)fftwf_malloc(sizeof(float) * m_wlen);
+ m_freq[c] = (fftwf_complex *)fftwf_malloc(sizeof(fftwf_complex) *
+ (m_wlen / 2 + 1));
+
+ m_plan[c] = fftwf_plan_dft_r2c_1d(m_wlen, m_time[c], m_freq[c], FFTW_ESTIMATE);
+ m_iplan[c] = fftwf_plan_dft_c2r_1d(m_wlen, m_freq[c], m_time[c], FFTW_ESTIMATE);
+
+ m_outbuf[c] = new RingBuffer<float>
+ ((m_maxOutputBlockSize + m_wlen) * 2);
+ m_inbuf[c] = new RingBuffer<float>
+ (lrintf(m_outbuf[c]->getSize() / m_ratio) + m_wlen);
+
+ std::cerr << "making inbuf size " << m_inbuf[c]->getSize() << " (outbuf size is " << m_outbuf[c]->getSize() << ", ratio " << m_ratio << ")" << std::endl;
+
+
+ m_mashbuf[c] = (float *)fftwf_malloc(sizeof(float) * m_wlen);
+
+ for (size_t i = 0; i < m_wlen; ++i) {
+ m_mashbuf[c][i] = 0.0;
+ }
+
+ for (size_t i = 0; i <= m_wlen/2; ++i) {
+ m_prevPhase[c][i] = 0.0;
+ m_prevAdjustedPhase[c][i] = 0.0;
+ }
+ }
+
+ for (size_t i = 0; i < m_wlen; ++i) {
+ m_modulationbuf[i] = 0.0;
+ }
+
+ for (size_t i = 0; i <= m_wlen/2; ++i) {
+ m_prevTransientMag[i] = 0.0;
+ }
+}
+
+void
+AudioTimeStretcher::calculateParameters()
+{
+ std::cerr << "AudioTimeStretcher::calculateParameters" << std::endl;
+
+ m_wlen = 1024;
+
+ //!!! In transient sharpening mode, we need to pick the window
+ //length so as to be more or less fixed in audio duration (i.e. we
+ //need to exploit the sample rate)
+
+ //!!! have to work out the relationship between wlen and transient
+ //threshold
+
+ if (m_ratio < 1) {
+ if (m_ratio < 0.4) {
+ m_n1 = 1024;
+ m_wlen = 2048;
+ } else if (m_ratio < 0.8) {
+ m_n1 = 512;
+ } else {
+ m_n1 = 256;
+ }
+ if (shouldSharpen()) {
+ m_wlen = 2048;
+ }
+ m_n2 = lrintf(m_n1 * m_ratio);
+ } else {
+ if (m_ratio > 2) {
+ m_n2 = 512;
+ m_wlen = 4096;
+ } else if (m_ratio > 1.6) {
+ m_n2 = 384;
+ m_wlen = 2048;
+ } else {
+ m_n2 = 256;
+ }
+ if (shouldSharpen()) {
+ if (m_wlen < 2048) m_wlen = 2048;
+ }
+ m_n1 = lrintf(m_n2 / m_ratio);
+ if (m_n1 == 0) {
+ m_n1 = 1;
+ m_n2 = m_ratio;
+ }
+ }
+
+ m_transientThreshold = lrintf(m_wlen / 4.5);
+
+ m_totalCount = 0;
+ m_transientCount = 0;
+ m_n2sum = 0;
+ m_n2total = 0;
+ m_n2list.clear();
+
+ std::cerr << "AudioTimeStretcher: channels = " << m_channels
+ << ", ratio = " << m_ratio
+ << ", n1 = " << m_n1 << ", n2 = " << m_n2 << ", wlen = "
+ << m_wlen << ", max = " << m_maxOutputBlockSize << std::endl;
+// << ", outbuflen = " << m_outbuf[0]->getSize() << std::endl;
+}
+
+void
+AudioTimeStretcher::cleanup()
+{
+ std::cerr << "AudioTimeStretcher::cleanup" << std::endl;
+
+ for (size_t c = 0; c < m_channels; ++c) {
+
+ fftwf_destroy_plan(m_plan[c]);
+ fftwf_destroy_plan(m_iplan[c]);
+
+ fftwf_free(m_time[c]);
+ fftwf_free(m_freq[c]);
+
+ fftwf_free(m_mashbuf[c]);
+ fftwf_free(m_prevPhase[c]);
+ fftwf_free(m_prevAdjustedPhase[c]);
+
+ delete m_inbuf[c];
+ delete m_outbuf[c];
+ }
+
+ fftwf_free(m_tempbuf);
+ fftwf_free(m_modulationbuf);
+ fftwf_free(m_prevTransientMag);
+
+ delete[] m_prevPhase;
+ delete[] m_prevAdjustedPhase;
+ delete[] m_inbuf;
+ delete[] m_outbuf;
+ delete[] m_mashbuf;
+ delete[] m_time;
+ delete[] m_freq;
+ delete[] m_plan;
+ delete[] m_iplan;
+
+ delete m_analysisWindow;
+ delete m_synthesisWindow;
+}
+
+void
+AudioTimeStretcher::setRatio(float ratio)
+{
+ pthread_mutex_lock(&m_mutex);
+
+ size_t formerWlen = m_wlen;
+ m_ratio = ratio;
+
+ std::cerr << "AudioTimeStretcher::setRatio: new ratio " << ratio
+ << std::endl;
+
+ calculateParameters();
+
+ if (m_wlen == formerWlen) {
+
+ // This is the only container whose size depends on m_ratio
+
+ RingBuffer<float> **newin = new RingBuffer<float> *[m_channels];
+
+ size_t formerSize = m_inbuf[0]->getSize();
+ size_t newSize = lrintf(m_outbuf[0]->getSize() / m_ratio) + m_wlen;
+
+ std::cerr << "resizing inbuf from " << formerSize << " to "
+ << newSize << " (outbuf size is " << m_outbuf[0]->getSize() << ", ratio " << m_ratio << ")" << std::endl;
+
+ if (formerSize != newSize) {
+
+ size_t ready = m_inbuf[0]->getReadSpace();
+
+ for (size_t c = 0; c < m_channels; ++c) {
+ newin[c] = new RingBuffer<float>(newSize);
+ }
+
+ if (ready > 0) {
+
+ size_t copy = std::min(ready, newSize);
+ float *tmp = new float[ready];
+
+ for (size_t c = 0; c < m_channels; ++c) {
+ m_inbuf[c]->read(tmp, ready);
+ newin[c]->write(tmp + ready - copy, copy);
+ }
+
+ delete[] tmp;
+ }
+
+ for (size_t c = 0; c < m_channels; ++c) {
+ delete m_inbuf[c];
+ }
+
+ delete[] m_inbuf;
+ m_inbuf = newin;
+ }
+
+ } else {
+
+ std::cerr << "wlen changed" << std::endl;
+ cleanup();
+ initialise();
+ }
+
+ pthread_mutex_unlock(&m_mutex);
+}
+
+size_t
+AudioTimeStretcher::getProcessingLatency() const
+{
+ return getWindowSize() - getInputIncrement();
+}
+
+size_t
+AudioTimeStretcher::getRequiredInputSamples() const
+{
+ size_t rv;
+ pthread_mutex_lock(&m_mutex);
+
+ if (m_inbuf[0]->getReadSpace() >= m_wlen) rv = 0;
+ else rv = m_wlen - m_inbuf[0]->getReadSpace();
+
+ pthread_mutex_unlock(&m_mutex);
+ return rv;
+}
+
+void
+AudioTimeStretcher::putInput(float **input, size_t samples)
+{
+ pthread_mutex_lock(&m_mutex);
+
+ // We need to add samples from input to our internal buffer. When
+ // we have m_windowSize samples in the buffer, we can process it,
+ // move the samples back by m_n1 and write the output onto our
+ // internal output buffer. If we have (samples * ratio) samples
+ // in that, we can write m_n2 of them back to output and return
+ // (otherwise we have to write zeroes).
+
+ // When we process, we write m_wlen to our fixed output buffer
+ // (m_mashbuf). We then pull out the first m_n2 samples from that
+ // buffer, push them into the output ring buffer, and shift
+ // m_mashbuf left by that amount.
+
+ // The processing latency is then m_wlen - m_n2.
+
+ size_t consumed = 0;
+
+ while (consumed < samples) {
+
+ size_t writable = m_inbuf[0]->getWriteSpace();
+ writable = std::min(writable, samples - consumed);
+
+ if (writable == 0) {
+#ifdef DEBUG_AUDIO_TIME_STRETCHER
+ std::cerr << "WARNING: AudioTimeStretcher::putInput: writable == 0 (inbuf has " << m_inbuf[0]->getReadSpace() << " samples available for reading, space for " << m_inbuf[0]->getWriteSpace() << " more)" << std::endl;
+#endif
+ if (m_inbuf[0]->getReadSpace() < m_wlen ||
+ m_outbuf[0]->getWriteSpace() < m_n2) {
+ std::cerr << "WARNING: AudioTimeStretcher::putInput: Inbuf has " << m_inbuf[0]->getReadSpace() << ", outbuf has space for " << m_outbuf[0]->getWriteSpace() << " (n2 = " << m_n2 << ", wlen = " << m_wlen << "), won't be able to process" << std::endl;
+ break;
+ }
+ } else {
+
+#ifdef DEBUG_AUDIO_TIME_STRETCHER
+ std::cerr << "writing " << writable << " from index " << consumed << " to inbuf, consumed will be " << consumed + writable << std::endl;
+#endif
+
+ for (size_t c = 0; c < m_channels; ++c) {
+ m_inbuf[c]->write(input[c] + consumed, writable);
+ }
+ consumed += writable;
+ }
+
+ while (m_inbuf[0]->getReadSpace() >= m_wlen &&
+ m_outbuf[0]->getWriteSpace() >= m_n2) {
+
+ // We know we have at least m_wlen samples available
+ // in m_inbuf. We need to peek m_wlen of them for
+ // processing, and then read m_n1 to advance the read
+ // pointer.
+
+ for (size_t c = 0; c < m_channels; ++c) {
+
+ size_t got = m_inbuf[c]->peek(m_tempbuf, m_wlen);
+ assert(got == m_wlen);
+
+ analyseBlock(c, m_tempbuf);
+ }
+
+ bool transient = false;
+ if (shouldSharpen()) transient = isTransient();
+
+ size_t n2 = m_n2;
+
+ if (transient) {
+ n2 = m_n1;
+ }
+
+ ++m_totalCount;
+ if (transient) ++m_transientCount;
+
+ m_n2sum += n2;
+ m_n2total += n2;
+
+ if (m_totalCount > 50 && m_transientCount < m_totalCount) {
+
+ int fixed = m_transientCount * m_n1;
+
+ float idealTotal = m_totalCount * m_n1 * m_ratio;
+ float idealSquashy = idealTotal - fixed;
+
+ float squashyCount = m_totalCount - m_transientCount;
+
+ float fn2 = idealSquashy / squashyCount;
+
+ n2 = int(fn2);
+
+ float remainder = fn2 - n2;
+ if (drand48() < remainder) ++n2;
+
+#ifdef DEBUG_AUDIO_TIME_STRETCHER
+ if (n2 != m_n2) {
+ std::cerr << m_n2 << " -> " << n2 << " (ideal = " << (idealSquashy / squashyCount) << ")" << std::endl;
+ }
+#endif
+ }
+
+ for (size_t c = 0; c < m_channels; ++c) {
+
+ synthesiseBlock(c, m_mashbuf[c],
+ c == 0 ? m_modulationbuf : 0,
+ m_prevTransient ? m_n1 : m_n2);
+
+
+#ifdef DEBUG_AUDIO_TIME_STRETCHER
+ std::cerr << "writing first " << m_n2 << " from mashbuf, skipping " << m_n1 << " on inbuf " << std::endl;
+#endif
+ m_inbuf[c]->skip(m_n1);
+
+ for (size_t i = 0; i < n2; ++i) {
+ if (m_modulationbuf[i] > 0.f) {
+ m_mashbuf[c][i] /= m_modulationbuf[i];
+ }
+ }
+
+ m_outbuf[c]->write(m_mashbuf[c], n2);
+
+ for (size_t i = 0; i < m_wlen - n2; ++i) {
+ m_mashbuf[c][i] = m_mashbuf[c][i + n2];
+ }
+
+ for (size_t i = m_wlen - n2; i < m_wlen; ++i) {
+ m_mashbuf[c][i] = 0.0f;
+ }
+ }
+
+ m_prevTransient = transient;
+
+ for (size_t i = 0; i < m_wlen - n2; ++i) {
+ m_modulationbuf[i] = m_modulationbuf[i + n2];
+ }
+
+ for (size_t i = m_wlen - n2; i < m_wlen; ++i) {
+ m_modulationbuf[i] = 0.0f;
+ }
+
+ if (!transient) m_n2 = n2;
+ }
+
+
+#ifdef DEBUG_AUDIO_TIME_STRETCHER
+ std::cerr << "loop ended: inbuf read space " << m_inbuf[0]->getReadSpace() << ", outbuf write space " << m_outbuf[0]->getWriteSpace() << std::endl;
+#endif
+ }
+
+#ifdef DEBUG_AUDIO_TIME_STRETCHER
+ std::cerr << "AudioTimeStretcher::putInput returning" << std::endl;
+#endif
+
+ pthread_mutex_unlock(&m_mutex);
+
+// std::cerr << "ratio: nominal: " << getRatio() << " actual: "
+// << m_total2 << "/" << m_total1 << " = " << float(m_total2) / float(m_total1) << " ideal: " << m_ratio << std::endl;
+}
+
+size_t
+AudioTimeStretcher::getAvailableOutputSamples() const
+{
+ pthread_mutex_lock(&m_mutex);
+
+ size_t rv = m_outbuf[0]->getReadSpace();
+
+ pthread_mutex_unlock(&m_mutex);
+ return rv;
+}
+
+void
+AudioTimeStretcher::getOutput(float **output, size_t samples)
+{
+ pthread_mutex_lock(&m_mutex);
+
+ if (m_outbuf[0]->getReadSpace() < samples) {
+ std::cerr << "WARNING: AudioTimeStretcher::getOutput: not enough data (yet?) (" << m_outbuf[0]->getReadSpace() << " < " << samples << ")" << std::endl;
+ size_t fill = samples - m_outbuf[0]->getReadSpace();
+ for (size_t c = 0; c < m_channels; ++c) {
+ for (size_t i = 0; i < fill; ++i) {
+ output[c][i] = 0.0;
+ }
+ m_outbuf[c]->read(output[c] + fill, m_outbuf[c]->getReadSpace());
+ }
+ } else {
+#ifdef DEBUG_AUDIO_TIME_STRETCHER
+ std::cerr << "enough data - writing " << samples << " from outbuf" << std::endl;
+#endif
+ for (size_t c = 0; c < m_channels; ++c) {
+ m_outbuf[c]->read(output[c], samples);
+ }
+ }
+
+#ifdef DEBUG_AUDIO_TIME_STRETCHER
+ std::cerr << "AudioTimeStretcher::getOutput returning" << std::endl;
+#endif
+
+ pthread_mutex_unlock(&m_mutex);
+}
+
+void
+AudioTimeStretcher::analyseBlock(size_t c, float *buf)
+{
+ size_t i;
+
+ // buf contains m_wlen samples
+
+#ifdef DEBUG_AUDIO_TIME_STRETCHER
+ std::cerr << "AudioTimeStretcher::analyseBlock (channel " << c << ")" << std::endl;
+#endif
+
+ m_analysisWindow->cut(buf);
+
+ for (i = 0; i < m_wlen/2; ++i) {
+ float temp = buf[i];
+ buf[i] = buf[i + m_wlen/2];
+ buf[i + m_wlen/2] = temp;
+ }
+
+ for (i = 0; i < m_wlen; ++i) {
+ m_time[c][i] = buf[i];
+ }
+
+ fftwf_execute(m_plan[c]); // m_time -> m_freq
+}
+
+bool
+AudioTimeStretcher::isTransient()
+{
+ int count = 0;
+
+ for (size_t i = 0; i <= m_wlen/2; ++i) {
+
+ float real = 0.f, imag = 0.f;
+
+ for (size_t c = 0; c < m_channels; ++c) {
+ real += m_freq[c][i][0];
+ imag += m_freq[c][i][1];
+ }
+
+ float sqrmag = (real * real + imag * imag);
+
+ if (m_prevTransientMag[i] > 0.f) {
+ float diff = 10.f * log10f(sqrmag / m_prevTransientMag[i]);
+ if (diff > 3.f) ++count;
+ }
+
+ m_prevTransientMag[i] = sqrmag;
+ }
+
+ bool isTransient = false;
+
+// if (count > m_transientThreshold &&
+// count > m_prevTransientScore * 1.2) {
+ if (count > m_prevTransientScore &&
+ count > m_transientThreshold &&
+ count - m_prevTransientScore > m_wlen / 20) {
+ isTransient = true;
+
+#ifdef DEBUG_AUDIO_TIME_STRETCHER
+ std::cerr << "isTransient (count = " << count << ", prev = " << m_prevTransientScore << ", diff = " << count - m_prevTransientScore << ", ratio = " << (m_totalCount > 0 ? (float (m_n2sum) / float(m_totalCount * m_n1)) : 1.f) << ", ideal = " << m_ratio << ", nominal = " << getRatio() << ")" << std::endl;
+// } else {
+// std::cerr << " !transient (count = " << count << ", prev = " << m_prevTransientScore << ", diff = " << count - m_prevTransientScore << ")" << std::endl;
+#endif
+ }
+
+ m_prevTransientScore = count;
+
+ return isTransient;
+}
+
+void
+AudioTimeStretcher::synthesiseBlock(size_t c,
+ float *out,
+ float *modulation,
+ size_t lastStep)
+{
+ bool unchanged = (lastStep == m_n1);
+
+ for (size_t i = 0; i <= m_wlen/2; ++i) {
+
+ float phase = princargf(atan2f(m_freq[c][i][1], m_freq[c][i][0]));
+ float adjustedPhase = phase;
+
+// float binfreq = float(m_sampleRate * i) / m_wlen;
+
+ if (!unchanged) {
+
+ float mag = sqrtf(m_freq[c][i][0] * m_freq[c][i][0] +
+ m_freq[c][i][1] * m_freq[c][i][1]);
+
+ float omega = (2 * M_PI * m_n1 * i) / m_wlen;
+
+ float expectedPhase = m_prevPhase[c][i] + omega;
+
+ float phaseError = princargf(phase - expectedPhase);
+
+ float phaseIncrement = (omega + phaseError) / m_n1;
+
+ adjustedPhase = m_prevAdjustedPhase[c][i] +
+ lastStep * phaseIncrement;
+
+ float real = mag * cosf(adjustedPhase);
+ float imag = mag * sinf(adjustedPhase);
+ m_freq[c][i][0] = real;
+ m_freq[c][i][1] = imag;
+ }
+
+ m_prevPhase[c][i] = phase;
+ m_prevAdjustedPhase[c][i] = adjustedPhase;
+ }
+
+ fftwf_execute(m_iplan[c]); // m_freq -> m_time, inverse fft
+
+ for (size_t i = 0; i < m_wlen/2; ++i) {
+ float temp = m_time[c][i];
+ m_time[c][i] = m_time[c][i + m_wlen/2];
+ m_time[c][i + m_wlen/2] = temp;
+ }
+
+ for (size_t i = 0; i < m_wlen; ++i) {
+ m_time[c][i] = m_time[c][i] / m_wlen;
+ }
+
+ m_synthesisWindow->cut(m_time[c]);
+
+ for (size_t i = 0; i < m_wlen; ++i) {
+ out[i] += m_time[c][i];
+ }
+
+ if (modulation) {
+
+ float area = m_analysisWindow->getArea();
+
+ for (size_t i = 0; i < m_wlen; ++i) {
+ float val = m_synthesisWindow->getValue(i);
+ modulation[i] += val * area;
+ }
+ }
+}
+
+
+
+}
+
diff --git a/src/sound/AudioTimeStretcher.h b/src/sound/AudioTimeStretcher.h
new file mode 100644
index 0000000..c5d0170
--- /dev/null
+++ b/src/sound/AudioTimeStretcher.h
@@ -0,0 +1,221 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+/*
+ This file is derived from
+
+ Sonic Visualiser
+ An audio file viewer and annotation editor.
+ Centre for Digital Music, Queen Mary, University of London.
+ This file copyright 2006 Chris Cannam and QMUL.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _AUDIO_TIME_STRETCHER_H_
+#define _AUDIO_TIME_STRETCHER_H_
+
+#include "SampleWindow.h"
+#include "RingBuffer.h"
+
+#include <fftw3.h>
+#include <pthread.h>
+#include <list>
+
+namespace Rosegarden
+{
+
+/**
+ * A time stretcher that alters the performance speed of audio,
+ * preserving pitch.
+ *
+ * This is based on the straightforward phase vocoder with phase
+ * unwrapping (as in e.g. the DAFX book pp275-), with optional
+ * percussive transient detection to avoid smearing percussive notes
+ * and resynchronise phases, and adding a stream API for real-time
+ * use. Principles and methods from Chris Duxbury, AES 2002 and 2004
+ * thesis; Emmanuel Ravelli, DAFX 2005; Dan Barry, ISSC 2005 on
+ * percussion detection; code by Chris Cannam.
+ */
+
+class AudioTimeStretcher
+{
+public:
+ AudioTimeStretcher(size_t sampleRate,
+ size_t channels,
+ float ratio,
+ bool sharpen,
+ size_t maxOutputBlockSize);
+ virtual ~AudioTimeStretcher();
+
+ /**
+ * Return the number of samples that would need to be added via
+ * putInput in order to provoke the time stretcher into doing some
+ * time stretching and making more output samples available.
+ * This will be an estimate, if transient sharpening is on; the
+ * caller may need to do the put/get/test cycle more than once.
+ */
+ size_t getRequiredInputSamples() const;
+
+ /**
+ * Put (and possibly process) a given number of input samples.
+ * Number should usually equal the value returned from
+ * getRequiredInputSamples().
+ */
+ void putInput(float **input, size_t samples);
+
+ /**
+ * Get the number of processed samples ready for reading.
+ */
+ size_t getAvailableOutputSamples() const;
+
+ /**
+ * Get some processed samples.
+ */
+ void getOutput(float **output, size_t samples);
+
+ //!!! and reset?
+
+ /**
+ * Change the time stretch ratio.
+ */
+ void setRatio(float ratio);
+
+ /**
+ * Get the hop size for input.
+ */
+ size_t getInputIncrement() const { return m_n1; }
+
+ /**
+ * Get the hop size for output.
+ */
+ size_t getOutputIncrement() const { return m_n2; }
+
+ /**
+ * Get the window size for FFT processing.
+ */
+ size_t getWindowSize() const { return m_wlen; }
+
+ /**
+ * Get the stretch ratio.
+ */
+ float getRatio() const { return float(m_n2) / float(m_n1); }
+
+ /**
+ * Return whether this time stretcher will attempt to sharpen transients.
+ */
+ bool getSharpening() const { return m_sharpen; }
+
+ /**
+ * Return the number of channels for this time stretcher.
+ */
+ size_t getChannelCount() const { return m_channels; }
+
+ /**
+ * Get the latency added by the time stretcher, in sample frames.
+ * This will be exact if transient sharpening is off, or approximate
+ * if it is on.
+ */
+ size_t getProcessingLatency() const;
+
+protected:
+ /**
+ * Process a single phase vocoder frame from "in" into
+ * m_freq[channel].
+ */
+ void analyseBlock(size_t channel, float *in); // into m_freq[channel]
+
+ /**
+ * Examine m_freq[0..m_channels-1] and return whether a percussive
+ * transient is found.
+ */
+ bool isTransient();
+
+ /**
+ * Resynthesise from m_freq[channel] adding in to "out",
+ * adjusting phases on the basis of a prior step size of lastStep.
+ * Also add the window shape in to the modulation array (if
+ * present) -- for use in ensuring the output has the correct
+ * magnitude afterwards.
+ */
+ void synthesiseBlock(size_t channel, float *out, float *modulation,
+ size_t lastStep);
+
+ void initialise();
+ void calculateParameters();
+ void cleanup();
+
+ bool shouldSharpen() {
+ return m_sharpen && (m_ratio > 0.25);
+ }
+
+ size_t m_sampleRate;
+ size_t m_channels;
+ size_t m_maxOutputBlockSize;
+ float m_ratio;
+ bool m_sharpen;
+ size_t m_n1;
+ size_t m_n2;
+ size_t m_wlen;
+ SampleWindow<float> *m_analysisWindow;
+ SampleWindow<float> *m_synthesisWindow;
+
+ int m_totalCount;
+ int m_transientCount;
+
+ int m_n2sum;
+ int m_n2total;
+ std::list<int> m_n2list;
+ int m_adjustCount;
+
+ float **m_prevPhase;
+ float **m_prevAdjustedPhase;
+
+ float *m_prevTransientMag;
+ int m_prevTransientScore;
+ int m_transientThreshold;
+ bool m_prevTransient;
+
+ float *m_tempbuf;
+ float **m_time;
+ fftwf_complex **m_freq;
+ fftwf_plan *m_plan;
+ fftwf_plan *m_iplan;
+
+ RingBuffer<float> **m_inbuf;
+ RingBuffer<float> **m_outbuf;
+ float **m_mashbuf;
+ float *m_modulationbuf;
+
+ mutable pthread_mutex_t m_mutex;
+};
+
+}
+
+
+#endif
diff --git a/src/sound/Audit.cpp b/src/sound/Audit.cpp
new file mode 100644
index 0000000..25a6c8b
--- /dev/null
+++ b/src/sound/Audit.cpp
@@ -0,0 +1,30 @@
+// -*- c-indentation-style:"stroustrup" c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include "Audit.h"
+
+namespace Rosegarden
+{
+
+std::string Audit::m_audit;
+
+}
+
diff --git a/src/sound/Audit.h b/src/sound/Audit.h
new file mode 100644
index 0000000..4e0a20e
--- /dev/null
+++ b/src/sound/Audit.h
@@ -0,0 +1,60 @@
+// -*- c-indentation-style:"stroustrup" c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _AUDIT_H_
+#define _AUDIT_H_
+
+#include <string>
+#include <iostream>
+
+#if (__GNUC__ < 3)
+#include <strstream>
+#define stringstream strstream
+#else
+#include <sstream>
+#endif
+
+// A staggeringly simple-minded audit trail implementation.
+
+namespace Rosegarden {
+
+class Audit : public std::stringstream
+{
+public:
+ Audit() { }
+
+ virtual ~Audit() {
+#if (__GNUC__ < 3)
+ *this << std::ends;
+#endif
+ std::cerr << str();
+ m_audit += str();
+ }
+
+ static std::string getAudit() { return m_audit; }
+
+protected:
+ static std::string m_audit;
+};
+
+}
+
+#endif
diff --git a/src/sound/BWFAudioFile.cpp b/src/sound/BWFAudioFile.cpp
new file mode 100644
index 0000000..c38820f
--- /dev/null
+++ b/src/sound/BWFAudioFile.cpp
@@ -0,0 +1,171 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include "BWFAudioFile.h"
+#include "RealTime.h"
+
+#if (__GNUC__ < 3)
+#include <strstream>
+#define stringstream strstream
+#else
+#include <sstream>
+#endif
+
+using std::cout;
+using std::cerr;
+using std::endl;
+
+
+namespace Rosegarden
+{
+
+BWFAudioFile::BWFAudioFile(const unsigned int &id,
+ const std::string &name,
+ const std::string &fileName):
+ RIFFAudioFile(id, name, fileName)
+{
+ m_type = WAV;
+
+}
+
+BWFAudioFile::BWFAudioFile(const std::string &fileName,
+ unsigned int channels = 1,
+ unsigned int sampleRate = 48000,
+ unsigned int bytesPerSecond = 6000,
+ unsigned int bytesPerFrame = 2,
+ unsigned int bitsPerSample = 16):
+ RIFFAudioFile(0, "", fileName)
+{
+ m_type = WAV;
+ m_bitsPerSample = bitsPerSample;
+ m_sampleRate = sampleRate;
+ m_bytesPerSecond = bytesPerSecond;
+ m_bytesPerFrame = bytesPerFrame;
+ m_channels = channels;
+}
+
+BWFAudioFile::~BWFAudioFile()
+{}
+
+bool
+BWFAudioFile::open()
+{
+ // if already open
+ if (m_inFile && (*m_inFile))
+ return true;
+
+ m_inFile = new std::ifstream(m_fileName.c_str(),
+ std::ios::in | std::ios::binary);
+
+ if (!(*m_inFile)) {
+ m_type = UNKNOWN;
+ return false;
+ }
+
+ // Get the file size and store it for comparison later
+ //
+ m_fileSize = m_fileInfo->size();
+
+ try {
+ parseHeader();
+ } catch (BadSoundFileException s) {
+ //throw(s);
+ return false;
+ }
+
+ return true;
+}
+
+// Open the file for writing, write out the header and move
+// to the data chunk to accept samples. We fill in all the
+// totals when we close().
+//
+bool
+BWFAudioFile::write()
+{
+ // close if we're open
+ if (m_outFile) {
+ m_outFile->close();
+ delete m_outFile;
+ }
+
+ // open for writing
+ m_outFile = new std::ofstream(m_fileName.c_str(),
+ std::ios::out | std::ios::binary);
+
+ if (!(*m_outFile))
+ return false;
+
+ // write out format header chunk and prepare for sample writing
+ //
+ writeFormatChunk();
+
+ return true;
+}
+
+void
+BWFAudioFile::close()
+{
+ if (m_outFile == 0)
+ return ;
+
+ m_outFile->seekp(0, std::ios::end);
+ unsigned int totalSize = m_outFile->tellp();
+
+ // seek to first length position
+ m_outFile->seekp(4, std::ios::beg);
+
+ // write complete file size minus 8 bytes to here
+ putBytes(m_outFile, getLittleEndianFromInteger(totalSize - 8, 4));
+
+ // reseek from start forward 40
+ m_outFile->seekp(40, std::ios::beg);
+
+ // write the data chunk size to end
+ putBytes(m_outFile, getLittleEndianFromInteger(totalSize - 44, 4));
+
+ m_outFile->close();
+
+ delete m_outFile;
+ m_outFile = 0;
+}
+
+// Set the AudioFile meta data according to WAV file format specification.
+//
+void
+BWFAudioFile::parseHeader()
+{
+ // Read the format chunk and populate the file data. A plain WAV
+ // file only has this chunk. Exceptions tumble through.
+ //
+ readFormatChunk();
+
+}
+
+std::streampos
+BWFAudioFile::getDataOffset()
+{
+ return 0;
+}
+
+
+
+}
diff --git a/src/sound/BWFAudioFile.h b/src/sound/BWFAudioFile.h
new file mode 100644
index 0000000..d6717aa
--- /dev/null
+++ b/src/sound/BWFAudioFile.h
@@ -0,0 +1,94 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+// Specialisation of a RIFF file - the WAV defines a format chunk
+// holding audio file meta data and a data chunk with interleaved
+// sample bytes.
+//
+
+#include "RIFFAudioFile.h"
+
+
+#ifndef _BWFAUDIOFILE_H_
+#define _BWFAUDIOFILE_H_
+
+namespace Rosegarden
+{
+
+class BWFAudioFile : public RIFFAudioFile
+{
+public:
+ BWFAudioFile(const unsigned int &id,
+ const std::string &name,
+ const std::string &fileName);
+
+ BWFAudioFile(const std::string &fileName,
+ unsigned int channels,
+ unsigned int sampleRate,
+ unsigned int bytesPerSecond,
+ unsigned int bytesPerFrame,
+ unsigned int bitsPerSample);
+
+ ~BWFAudioFile();
+
+ // Override these methods for the WAV
+ //
+ virtual bool open();
+ virtual bool write();
+ virtual void close();
+
+ // Get all header information
+ //
+ void parseHeader();
+
+ //
+ //
+ //virtual std::vector<float> getPreview(const RealTime &resolution);
+
+ // Offset to start of sample data
+ //
+ virtual std::streampos getDataOffset();
+
+ // Peak file name
+ //
+ virtual std::string getPeakFilename()
+ { return (m_fileName + std::string(".pk")); }
+
+
+ //!!! NOT IMPLEMENTED YET
+ //
+ virtual bool decode(const unsigned char *sourceData,
+ size_t sourceBytes,
+ size_t targetSampleRate,
+ size_t targetChannels,
+ size_t targetFrames,
+ std::vector<float *> &targetData,
+ bool addToResultBuffers = false) { return false; }
+
+protected:
+
+};
+
+}
+
+
+#endif // _BWFUDIOFILE_H_
diff --git a/src/sound/ControlBlock.cpp b/src/sound/ControlBlock.cpp
new file mode 100644
index 0000000..d0bb6a8
--- /dev/null
+++ b/src/sound/ControlBlock.cpp
@@ -0,0 +1,181 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include <cstring>
+
+#include "ControlBlock.h"
+
+namespace Rosegarden
+{
+
+ControlBlock::ControlBlock(unsigned int maxTrackId)
+ : m_maxTrackId(maxTrackId),
+ m_solo(false),
+ m_routing(true),
+ m_thruFilter(0),
+ m_recordFilter(0),
+ m_selectedTrack(0)
+{
+ m_metronomeInfo.muted = true;
+ m_metronomeInfo.instrumentId = 0;
+ for (unsigned int i = 0; i < CONTROLBLOCK_MAX_NB_TRACKS; ++i) {
+ m_trackInfo[i].muted = true;
+ m_trackInfo[i].deleted = true;
+ m_trackInfo[i].armed = true;
+ m_trackInfo[i].instrumentId = 0;
+ }
+}
+
+ControlBlock::ControlBlock()
+{
+ // DO NOT initialize anything - this ctor is meant to be used by
+ // the sequencer, through a placement new over an mmapped file.
+}
+
+void ControlBlock::updateTrackData(Track* t)
+{
+ if (t) {
+ setInstrumentForTrack(t->getId(), t->getInstrument());
+ setTrackArmed(t->getId(), t->isArmed());
+ setTrackMuted(t->getId(), t->isMuted());
+ setTrackDeleted(t->getId(), false);
+ setTrackChannelFilter(t->getId(), t->getMidiInputChannel());
+ setTrackDeviceFilter(t->getId(), t->getMidiInputDevice());
+ if (t->getId() > m_maxTrackId)
+ m_maxTrackId = t->getId();
+ }
+}
+
+void ControlBlock::setInstrumentForTrack(TrackId trackId, InstrumentId instId)
+{
+ if (trackId < CONTROLBLOCK_MAX_NB_TRACKS)
+ m_trackInfo[trackId].instrumentId = instId;
+}
+
+InstrumentId ControlBlock::getInstrumentForTrack(TrackId trackId) const
+{
+ if (trackId < CONTROLBLOCK_MAX_NB_TRACKS)
+ return m_trackInfo[trackId].instrumentId;
+ return 0;
+}
+
+void ControlBlock::setTrackMuted(TrackId trackId, bool mute)
+{
+ if (trackId < CONTROLBLOCK_MAX_NB_TRACKS)
+ m_trackInfo[trackId].muted = mute;
+}
+
+bool ControlBlock::isTrackMuted(TrackId trackId) const
+{
+ if (trackId < CONTROLBLOCK_MAX_NB_TRACKS)
+ return m_trackInfo[trackId].muted;
+ return true;
+}
+
+void ControlBlock::setTrackArmed(TrackId trackId, bool armed)
+{
+ if (trackId < CONTROLBLOCK_MAX_NB_TRACKS)
+ m_trackInfo[trackId].armed = armed;
+}
+
+bool ControlBlock::isTrackArmed(TrackId trackId) const
+{
+ if (trackId < CONTROLBLOCK_MAX_NB_TRACKS)
+ return m_trackInfo[trackId].armed;
+ return false;
+}
+
+void ControlBlock::setTrackDeleted(TrackId trackId, bool deleted)
+{
+ if (trackId < CONTROLBLOCK_MAX_NB_TRACKS)
+ m_trackInfo[trackId].deleted = deleted;
+}
+
+bool ControlBlock::isTrackDeleted(TrackId trackId) const
+{
+ if (trackId < CONTROLBLOCK_MAX_NB_TRACKS)
+ return m_trackInfo[trackId].deleted;
+ return true;
+}
+
+void ControlBlock::setTrackChannelFilter(TrackId trackId, char channel)
+{
+ if (trackId < CONTROLBLOCK_MAX_NB_TRACKS)
+ m_trackInfo[trackId].channelFilter = channel;
+}
+
+char ControlBlock::getTrackChannelFilter(TrackId trackId) const
+{
+ if (trackId < CONTROLBLOCK_MAX_NB_TRACKS)
+ return m_trackInfo[trackId].channelFilter;
+ return -1;
+}
+
+void ControlBlock::setTrackDeviceFilter(TrackId trackId, DeviceId device)
+{
+ if (trackId < CONTROLBLOCK_MAX_NB_TRACKS)
+ m_trackInfo[trackId].deviceFilter = device;
+}
+
+DeviceId ControlBlock::getTrackDeviceFilter(TrackId trackId) const
+{
+ if (trackId < CONTROLBLOCK_MAX_NB_TRACKS)
+ return m_trackInfo[trackId].deviceFilter;
+ return Device::ALL_DEVICES;
+}
+
+bool ControlBlock::isInstrumentMuted(InstrumentId instrumentId) const
+{
+ for (unsigned int i = 0; i <= m_maxTrackId; ++i) {
+ if (m_trackInfo[i].instrumentId == instrumentId &&
+ !m_trackInfo[i].deleted && !m_trackInfo[i].muted)
+ return false;
+ }
+ return true;
+}
+
+bool ControlBlock::isInstrumentUnused(InstrumentId instrumentId) const
+{
+ for (unsigned int i = 0; i <= m_maxTrackId; ++i) {
+ if (m_trackInfo[i].instrumentId == instrumentId &&
+ !m_trackInfo[i].deleted)
+ return false;
+ }
+ return true;
+}
+
+InstrumentId ControlBlock::getInstrumentForEvent(unsigned int dev, unsigned int chan)
+{
+ for (unsigned int i = 0; i <= m_maxTrackId; ++i) {
+ if (!m_trackInfo[i].deleted && m_trackInfo[i].armed) {
+ if (((m_trackInfo[i].deviceFilter == Device::ALL_DEVICES) ||
+ (m_trackInfo[i].deviceFilter == dev)) &&
+ ((m_trackInfo[i].channelFilter == -1) ||
+ (m_trackInfo[i].channelFilter == chan)))
+ return m_trackInfo[i].instrumentId;
+ }
+ }
+ // There is not a matching filter, return the selected track instrument
+ return getInstrumentForTrack(getSelectedTrack());
+}
+
+
+}
diff --git a/src/sound/ControlBlock.h b/src/sound/ControlBlock.h
new file mode 100644
index 0000000..6db0ee5
--- /dev/null
+++ b/src/sound/ControlBlock.h
@@ -0,0 +1,128 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _CONTROLBLOCK_H_
+#define _CONTROLBLOCK_H_
+
+#include "MidiProgram.h"
+#include "Track.h"
+
+namespace Rosegarden
+{
+
+/**
+ * ONLY PUT PLAIN DATA HERE - NO POINTERS EVER
+ */
+struct TrackInfo
+{
+ bool deleted;
+ bool muted;
+ bool armed;
+ char channelFilter;
+ DeviceId deviceFilter;
+ InstrumentId instrumentId;
+};
+
+#define CONTROLBLOCK_MAX_NB_TRACKS 1024 // can't be a symbol
+
+/**
+ * Sequencer control block, mmapped by the GUI
+ */
+class ControlBlock
+{
+public:
+ /// ctor for GUI
+ ControlBlock(unsigned int maxTrackId);
+
+ /// ctor for sequencer - all data is read from mmapped file
+ ControlBlock();
+
+ unsigned int getMaxTrackId() const { return m_maxTrackId; }
+ void updateTrackData(Track*);
+
+ void setInstrumentForTrack(TrackId trackId, InstrumentId);
+ InstrumentId getInstrumentForTrack(TrackId trackId) const;
+
+ void setTrackArmed(TrackId trackId, bool);
+ bool isTrackArmed(TrackId trackId) const;
+
+ void setTrackMuted(TrackId trackId, bool);
+ bool isTrackMuted(TrackId trackId) const;
+
+ void setTrackDeleted(TrackId trackId, bool);
+ bool isTrackDeleted(TrackId trackId) const;
+
+ void setTrackChannelFilter(TrackId trackId, char);
+ char getTrackChannelFilter(TrackId trackId) const;
+
+ void setTrackDeviceFilter(TrackId trackId, DeviceId);
+ DeviceId getTrackDeviceFilter(TrackId trackId) const;
+
+ bool isInstrumentMuted(InstrumentId instrumentId) const;
+ bool isInstrumentUnused(InstrumentId instrumentId) const;
+
+ void setInstrumentForMetronome(InstrumentId instId) { m_metronomeInfo.instrumentId = instId; }
+ InstrumentId getInstrumentForMetronome() const { return m_metronomeInfo.instrumentId; }
+
+ void setMetronomeMuted(bool mute) { m_metronomeInfo.muted = mute; }
+ bool isMetronomeMuted() const { return m_metronomeInfo.muted; }
+
+ bool isSolo() const { return m_solo; }
+ void setSolo(bool value) { m_solo = value; }
+ TrackId getSelectedTrack() const { return m_selectedTrack; }
+ void setSelectedTrack(TrackId track) { m_selectedTrack = track; }
+
+ void setThruFilter(MidiFilter filter) { m_thruFilter = filter; }
+ MidiFilter getThruFilter() const { return m_thruFilter; }
+
+ void setRecordFilter(MidiFilter filter) { m_recordFilter = filter; }
+ MidiFilter getRecordFilter() const { return m_recordFilter; }
+
+ void setMidiRoutingEnabled(bool enabled) { m_routing = enabled; }
+ bool isMidiRoutingEnabled() const { return m_routing; }
+
+ /**
+ * Gets an InstrumentId for the given DeviceId and Channel. If there
+ * is an armed track having a matching device and channel filters,
+ * this method returns the instrument assigned to the track, even if
+ * there are more tracks matching the same filters. If there is not a
+ * single match, it returns the instrument assigned to the selected
+ * track.
+ */
+ InstrumentId getInstrumentForEvent(unsigned int dev,
+ unsigned int chan);
+
+protected:
+ //--------------- Data members ---------------------------------
+ // PUT ONLY PLAIN DATA HERE - NO POINTERS EVER
+ unsigned int m_maxTrackId;
+ bool m_solo;
+ bool m_routing;
+ MidiFilter m_thruFilter;
+ MidiFilter m_recordFilter;
+ TrackId m_selectedTrack;
+ TrackInfo m_metronomeInfo;
+ TrackInfo m_trackInfo[CONTROLBLOCK_MAX_NB_TRACKS]; // should be high enough for the moment
+};
+
+}
+
+#endif
diff --git a/src/sound/DSSIPluginFactory.cpp b/src/sound/DSSIPluginFactory.cpp
new file mode 100644
index 0000000..8447450
--- /dev/null
+++ b/src/sound/DSSIPluginFactory.cpp
@@ -0,0 +1,396 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include "DSSIPluginFactory.h"
+#include <iostream>
+#include <cstdlib>
+
+#ifdef HAVE_DSSI
+
+#include <dlfcn.h>
+#include "AudioPluginInstance.h"
+#include "DSSIPluginInstance.h"
+#include "MappedStudio.h"
+#include "PluginIdentifier.h"
+
+#ifdef HAVE_LIBLRDF
+#include "lrdf.h"
+#endif // HAVE_LIBLRDF
+
+namespace Rosegarden
+{
+
+DSSIPluginFactory::DSSIPluginFactory() :
+ LADSPAPluginFactory()
+{
+ // nothing else to do
+}
+
+DSSIPluginFactory::~DSSIPluginFactory()
+{
+ // nothing else to do here either
+}
+
+void
+DSSIPluginFactory::enumeratePlugins(MappedObjectPropertyList &list)
+{
+ for (std::vector<QString>::iterator i = m_identifiers.begin();
+ i != m_identifiers.end(); ++i) {
+
+ const DSSI_Descriptor *ddesc = getDSSIDescriptor(*i);
+ if (!ddesc)
+ continue;
+
+ const LADSPA_Descriptor *descriptor = ddesc->LADSPA_Plugin;
+ if (!descriptor)
+ continue;
+
+ // std::cerr << "DSSIPluginFactory::enumeratePlugins: Name " << (descriptor->Name ? descriptor->Name : "NONE" ) << std::endl;
+
+ list.push_back(*i);
+ list.push_back(descriptor->Name);
+ list.push_back(QString("%1").arg(descriptor->UniqueID));
+ list.push_back(descriptor->Label);
+ list.push_back(descriptor->Maker);
+ list.push_back(descriptor->Copyright);
+ list.push_back((ddesc->run_synth || ddesc->run_multiple_synths) ? "true" : "false");
+ list.push_back(ddesc->run_multiple_synths ? "true" : "false");
+ list.push_back(m_taxonomy[descriptor->UniqueID]);
+ list.push_back(QString("%1").arg(descriptor->PortCount));
+
+ for (unsigned long p = 0; p < descriptor->PortCount; ++p) {
+
+ int type = 0;
+ if (LADSPA_IS_PORT_CONTROL(descriptor->PortDescriptors[p])) {
+ type |= PluginPort::Control;
+ } else {
+ type |= PluginPort::Audio;
+ }
+ if (LADSPA_IS_PORT_INPUT(descriptor->PortDescriptors[p])) {
+ type |= PluginPort::Input;
+ } else {
+ type |= PluginPort::Output;
+ }
+
+ list.push_back(QString("%1").arg(p));
+ list.push_back(descriptor->PortNames[p]);
+ list.push_back(QString("%1").arg(type));
+ list.push_back(QString("%1").arg(getPortDisplayHint(descriptor, p)));
+ list.push_back(QString("%1").arg(getPortMinimum(descriptor, p)));
+ list.push_back(QString("%1").arg(getPortMaximum(descriptor, p)));
+ list.push_back(QString("%1").arg(getPortDefault(descriptor, p)));
+ }
+ }
+
+ unloadUnusedLibraries();
+}
+
+
+void
+DSSIPluginFactory::populatePluginSlot(QString identifier, MappedPluginSlot &slot)
+{
+ const LADSPA_Descriptor *descriptor = getLADSPADescriptor(identifier);
+ if (!descriptor)
+ return ;
+
+ if (descriptor) {
+
+ slot.setProperty(MappedPluginSlot::Label, descriptor->Label);
+ slot.setProperty(MappedPluginSlot::PluginName, descriptor->Name);
+ slot.setProperty(MappedPluginSlot::Author, descriptor->Maker);
+ slot.setProperty(MappedPluginSlot::Copyright, descriptor->Copyright);
+ slot.setProperty(MappedPluginSlot::PortCount, descriptor->PortCount);
+ slot.setProperty(MappedPluginSlot::Category, m_taxonomy[descriptor->UniqueID]);
+
+ slot.destroyChildren();
+
+ for (unsigned long i = 0; i < descriptor->PortCount; i++) {
+
+ if (LADSPA_IS_PORT_CONTROL(descriptor->PortDescriptors[i]) &&
+ LADSPA_IS_PORT_INPUT(descriptor->PortDescriptors[i])) {
+
+ MappedStudio *studio = dynamic_cast<MappedStudio *>(slot.getParent());
+ if (!studio) {
+ std::cerr << "WARNING: DSSIPluginFactory::populatePluginSlot: can't find studio" << std::endl;
+ return ;
+ }
+
+ MappedPluginPort *port =
+ dynamic_cast<MappedPluginPort *>
+ (studio->createObject(MappedObject::PluginPort));
+
+ slot.addChild(port);
+ port->setParent(&slot);
+
+ port->setProperty(MappedPluginPort::PortNumber, i);
+ port->setProperty(MappedPluginPort::Name,
+ descriptor->PortNames[i]);
+ port->setProperty(MappedPluginPort::Maximum,
+ getPortMaximum(descriptor, i));
+ port->setProperty(MappedPluginPort::Minimum,
+ getPortMinimum(descriptor, i));
+ port->setProperty(MappedPluginPort::Default,
+ getPortDefault(descriptor, i));
+ port->setProperty(MappedPluginPort::DisplayHint,
+ getPortDisplayHint(descriptor, i));
+ }
+ }
+ }
+
+ //!!! leak here if the plugin is not instantiated too...?
+}
+
+RunnablePluginInstance *
+DSSIPluginFactory::instantiatePlugin(QString identifier,
+ int instrument,
+ int position,
+ unsigned int sampleRate,
+ unsigned int blockSize,
+ unsigned int channels)
+{
+ const DSSI_Descriptor *descriptor = getDSSIDescriptor(identifier);
+
+ if (descriptor) {
+
+ DSSIPluginInstance *instance =
+ new DSSIPluginInstance
+ (this, instrument, identifier, position, sampleRate, blockSize, channels,
+ descriptor);
+
+ m_instances.insert(instance);
+
+ return instance;
+ }
+
+ return 0;
+}
+
+
+const DSSI_Descriptor *
+DSSIPluginFactory::getDSSIDescriptor(QString identifier)
+{
+ QString type, soname, label;
+ PluginIdentifier::parseIdentifier(identifier, type, soname, label);
+
+ if (m_libraryHandles.find(soname) == m_libraryHandles.end()) {
+ loadLibrary(soname);
+ if (m_libraryHandles.find(soname) == m_libraryHandles.end()) {
+ std::cerr << "WARNING: DSSIPluginFactory::getDSSIDescriptor: loadLibrary failed for " << soname << std::endl;
+ return 0;
+ }
+ }
+
+ void *libraryHandle = m_libraryHandles[soname];
+
+ DSSI_Descriptor_Function fn = (DSSI_Descriptor_Function)
+ dlsym(libraryHandle, "dssi_descriptor");
+
+ if (!fn) {
+ std::cerr << "WARNING: DSSIPluginFactory::getDSSIDescriptor: No descriptor function in library " << soname << std::endl;
+ return 0;
+ }
+
+ const DSSI_Descriptor *descriptor = 0;
+
+ int index = 0;
+ while ((descriptor = fn(index))) {
+ if (descriptor->LADSPA_Plugin->Label == label)
+ return descriptor;
+ ++index;
+ }
+
+ std::cerr << "WARNING: DSSIPluginFactory::getDSSIDescriptor: No such plugin as " << label << " in library " << soname << std::endl;
+
+ return 0;
+}
+
+const LADSPA_Descriptor *
+DSSIPluginFactory::getLADSPADescriptor(QString identifier)
+{
+ const DSSI_Descriptor *dssiDescriptor = getDSSIDescriptor(identifier);
+ if (dssiDescriptor)
+ return dssiDescriptor->LADSPA_Plugin;
+ else
+ return 0;
+}
+
+
+std::vector<QString>
+DSSIPluginFactory::getPluginPath()
+{
+ std::vector<QString> pathList;
+ std::string path;
+
+ char *cpath = getenv("DSSI_PATH");
+ if (cpath)
+ path = cpath;
+
+ if (path == "") {
+ path = "/usr/local/lib/dssi:/usr/lib/dssi";
+ char *home = getenv("HOME");
+ if (home)
+ path = std::string(home) + "/.dssi:" + path;
+ }
+
+ std::string::size_type index = 0, newindex = 0;
+
+ while ((newindex = path.find(':', index)) < path.size()) {
+ pathList.push_back(path.substr(index, newindex - index).c_str());
+ index = newindex + 1;
+ }
+
+ pathList.push_back(path.substr(index).c_str());
+
+ return pathList;
+}
+
+
+#ifdef HAVE_LIBLRDF
+std::vector<QString>
+DSSIPluginFactory::getLRDFPath(QString &baseUri)
+{
+ std::vector<QString> pathList = getPluginPath();
+ std::vector<QString> lrdfPaths;
+
+ lrdfPaths.push_back("/usr/local/share/dssi/rdf");
+ lrdfPaths.push_back("/usr/share/dssi/rdf");
+
+ lrdfPaths.push_back("/usr/local/share/ladspa/rdf");
+ lrdfPaths.push_back("/usr/share/ladspa/rdf");
+
+ for (std::vector<QString>::iterator i = pathList.begin();
+ i != pathList.end(); ++i) {
+ lrdfPaths.push_back(*i + "/rdf");
+ }
+
+#ifdef DSSI_BASE
+ baseUri = DSSI_BASE;
+#else
+
+ baseUri = "http://dssi.sourceforge.net/ontology#";
+#endif
+
+ return lrdfPaths;
+}
+#endif
+
+
+void
+DSSIPluginFactory::discoverPlugins(QString soName)
+{
+ void *libraryHandle = dlopen(soName.data(), RTLD_LAZY);
+
+ if (!libraryHandle) {
+ std::cerr << "WARNING: DSSIPluginFactory::discoverPlugins: couldn't dlopen "
+ << soName << " - " << dlerror() << std::endl;
+ return ;
+ }
+
+ DSSI_Descriptor_Function fn = (DSSI_Descriptor_Function)
+ dlsym(libraryHandle, "dssi_descriptor");
+
+ if (!fn) {
+ std::cerr << "WARNING: DSSIPluginFactory::discoverPlugins: No descriptor function in " << soName << std::endl;
+ return ;
+ }
+
+ const DSSI_Descriptor *descriptor = 0;
+
+ int index = 0;
+ while ((descriptor = fn(index))) {
+
+ const LADSPA_Descriptor * ladspaDescriptor = descriptor->LADSPA_Plugin;
+ if (!ladspaDescriptor) {
+ std::cerr << "WARNING: DSSIPluginFactory::discoverPlugins: No LADSPA descriptor for plugin " << index << " in " << soName << std::endl;
+ ++index;
+ continue;
+ }
+
+#ifdef HAVE_LIBLRDF
+ char *def_uri = 0;
+ lrdf_defaults *defs = 0;
+
+ QString category = m_taxonomy[ladspaDescriptor->UniqueID];
+
+ if (category == "" && ladspaDescriptor->Name != 0) {
+ std::string name = ladspaDescriptor->Name;
+ if (name.length() > 4 &&
+ name.substr(name.length() - 4) == " VST") {
+ if (descriptor->run_synth || descriptor->run_multiple_synths) {
+ category = "VST instruments";
+ } else {
+ category = "VST effects";
+ }
+ m_taxonomy[ladspaDescriptor->UniqueID] = category;
+ }
+ }
+
+ // std::cerr << "Plugin id is " << ladspaDescriptor->UniqueID
+ // << ", category is \"" << (category ? category : QString("(none)"))
+ // << "\", name is " << ladspaDescriptor->Name
+ // << ", label is " << ladspaDescriptor->Label
+ // << std::endl;
+
+ def_uri = lrdf_get_default_uri(ladspaDescriptor->UniqueID);
+ if (def_uri) {
+ defs = lrdf_get_setting_values(def_uri);
+ }
+
+ int controlPortNumber = 1;
+
+ for (unsigned long i = 0; i < ladspaDescriptor->PortCount; i++) {
+
+ if (LADSPA_IS_PORT_CONTROL(ladspaDescriptor->PortDescriptors[i])) {
+
+ if (def_uri && defs) {
+
+ for (int j = 0; j < defs->count; j++) {
+ if (defs->items[j].pid == controlPortNumber) {
+ // std::cerr << "Default for this port (" << defs->items[j].pid << ", " << defs->items[j].label << ") is " << defs->items[j].value << "; applying this to port number " << i << " with name " << ladspaDescriptor->PortNames[i] << std::endl;
+ m_portDefaults[ladspaDescriptor->UniqueID][i] =
+ defs->items[j].value;
+ }
+ }
+ }
+
+ ++controlPortNumber;
+ }
+ }
+#endif // HAVE_LIBLRDF
+
+ QString identifier = PluginIdentifier::createIdentifier
+ ("dssi", soName, ladspaDescriptor->Label);
+ m_identifiers.push_back(identifier);
+
+ ++index;
+ }
+
+ if (dlclose(libraryHandle) != 0) {
+ std::cerr << "WARNING: DSSIPluginFactory::discoverPlugins - can't unload " << libraryHandle << std::endl;
+ return ;
+ }
+}
+
+
+}
+
+#endif // HAVE_DSSI
+
diff --git a/src/sound/DSSIPluginFactory.h b/src/sound/DSSIPluginFactory.h
new file mode 100644
index 0000000..8c1bd7c
--- /dev/null
+++ b/src/sound/DSSIPluginFactory.h
@@ -0,0 +1,72 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _DSSI_PLUGIN_FACTORY_H_
+#define _DSSI_PLUGIN_FACTORY_H_
+
+#ifdef HAVE_DSSI
+
+#include "LADSPAPluginFactory.h"
+#include <dssi.h>
+
+namespace Rosegarden
+{
+
+class DSSIPluginInstance;
+
+class DSSIPluginFactory : public LADSPAPluginFactory
+{
+public:
+ virtual ~DSSIPluginFactory();
+
+ virtual void enumeratePlugins(MappedObjectPropertyList &list);
+
+ virtual void populatePluginSlot(QString identifier, MappedPluginSlot &slot);
+
+ virtual RunnablePluginInstance *instantiatePlugin(QString identifier,
+ int instrumentId,
+ int position,
+ unsigned int sampleRate,
+ unsigned int blockSize,
+ unsigned int channels);
+
+protected:
+ DSSIPluginFactory();
+ friend class PluginFactory;
+
+ virtual std::vector<QString> getPluginPath();
+
+#ifdef HAVE_LIBLRDF
+ virtual std::vector<QString> getLRDFPath(QString &baseUri);
+#endif
+
+ virtual void discoverPlugins(QString soName);
+
+ virtual const LADSPA_Descriptor *getLADSPADescriptor(QString identifier);
+ virtual const DSSI_Descriptor *getDSSIDescriptor(QString identifier);
+};
+
+}
+
+#endif
+
+#endif
+
diff --git a/src/sound/DSSIPluginInstance.cpp b/src/sound/DSSIPluginInstance.cpp
new file mode 100644
index 0000000..2ceb0df
--- /dev/null
+++ b/src/sound/DSSIPluginInstance.cpp
@@ -0,0 +1,1208 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include <iostream>
+#include <cassert>
+#include <cstdlib>
+
+#include "DSSIPluginInstance.h"
+#include "PluginIdentifier.h"
+#include "LADSPAPluginFactory.h"
+
+#ifdef HAVE_DSSI
+
+//#define DEBUG_DSSI 1
+//#define DEBUG_DSSI_PROCESS 1
+
+namespace Rosegarden
+{
+
+#define EVENT_BUFFER_SIZE 1023
+
+DSSIPluginInstance::GroupMap DSSIPluginInstance::m_groupMap;
+snd_seq_event_t **DSSIPluginInstance::m_groupLocalEventBuffers = 0;
+size_t DSSIPluginInstance::m_groupLocalEventBufferCount = 0;
+Scavenger<ScavengerArrayWrapper<snd_seq_event_t *> > DSSIPluginInstance::m_bufferScavenger(2, 10);
+
+
+DSSIPluginInstance::DSSIPluginInstance(PluginFactory *factory,
+ InstrumentId instrument,
+ QString identifier,
+ int position,
+ unsigned long sampleRate,
+ size_t blockSize,
+ int idealChannelCount,
+ const DSSI_Descriptor* descriptor) :
+ RunnablePluginInstance(factory, identifier),
+ m_instrument(instrument),
+ m_position(position),
+ m_descriptor(descriptor),
+ m_programCacheValid(false),
+ m_eventBuffer(EVENT_BUFFER_SIZE),
+ m_blockSize(blockSize),
+ m_idealChannelCount(idealChannelCount),
+ m_sampleRate(sampleRate),
+ m_latencyPort(0),
+ m_run(false),
+ m_runSinceReset(false),
+ m_bypassed(false),
+ m_grouped(false)
+{
+ pthread_mutex_t initialisingMutex = PTHREAD_MUTEX_INITIALIZER;
+ memcpy(&m_processLock, &initialisingMutex, sizeof(pthread_mutex_t));
+
+#ifdef DEBUG_DSSI
+
+ std::cerr << "DSSIPluginInstance::DSSIPluginInstance(" << identifier << ")"
+ << std::endl;
+#endif
+
+ init();
+
+ m_inputBuffers = new sample_t * [m_audioPortsIn.size()];
+ m_outputBuffers = new sample_t * [m_outputBufferCount];
+
+ for (size_t i = 0; i < m_audioPortsIn.size(); ++i) {
+ m_inputBuffers[i] = new sample_t[blockSize];
+ }
+ for (size_t i = 0; i < m_outputBufferCount; ++i) {
+ m_outputBuffers[i] = new sample_t[blockSize];
+ }
+
+ m_ownBuffers = true;
+
+ m_pending.lsb = m_pending.msb = m_pending.program = -1;
+
+ instantiate(sampleRate);
+ if (isOK()) {
+ connectPorts();
+ activate();
+ initialiseGroupMembership();
+ }
+}
+
+DSSIPluginInstance::DSSIPluginInstance(PluginFactory *factory,
+ InstrumentId instrument,
+ QString identifier,
+ int position,
+ unsigned long sampleRate,
+ size_t blockSize,
+ sample_t **inputBuffers,
+ sample_t **outputBuffers,
+ const DSSI_Descriptor* descriptor) :
+ RunnablePluginInstance(factory, identifier),
+ m_instrument(instrument),
+ m_position(position),
+ m_descriptor(descriptor),
+ m_eventBuffer(EVENT_BUFFER_SIZE),
+ m_blockSize(blockSize),
+ m_inputBuffers(inputBuffers),
+ m_outputBuffers(outputBuffers),
+ m_ownBuffers(false),
+ m_idealChannelCount(0),
+ m_sampleRate(sampleRate),
+ m_latencyPort(0),
+ m_run(false),
+ m_runSinceReset(false),
+ m_bypassed(false),
+ m_grouped(false)
+{
+#ifdef DEBUG_DSSI
+ std::cerr << "DSSIPluginInstance::DSSIPluginInstance[buffers supplied](" << identifier << ")"
+ << std::endl;
+#endif
+
+ init();
+
+ m_pending.lsb = m_pending.msb = m_pending.program = -1;
+
+ instantiate(sampleRate);
+ if (isOK()) {
+ connectPorts();
+ activate();
+ if (m_descriptor->run_multiple_synths) {
+ m_grouped = true;
+ initialiseGroupMembership();
+ }
+ }
+}
+
+
+void
+DSSIPluginInstance::init()
+{
+#ifdef DEBUG_DSSI
+ std::cerr << "DSSIPluginInstance::init" << std::endl;
+#endif
+
+ // Discover ports numbers and identities
+ //
+ const LADSPA_Descriptor *descriptor = m_descriptor->LADSPA_Plugin;
+
+ for (unsigned long i = 0; i < descriptor->PortCount; ++i) {
+ if (LADSPA_IS_PORT_AUDIO(descriptor->PortDescriptors[i])) {
+ if (LADSPA_IS_PORT_INPUT(descriptor->PortDescriptors[i])) {
+ m_audioPortsIn.push_back(i);
+ } else {
+ m_audioPortsOut.push_back(i);
+ }
+ } else
+ if (LADSPA_IS_PORT_CONTROL(descriptor->PortDescriptors[i])) {
+ if (LADSPA_IS_PORT_INPUT(descriptor->PortDescriptors[i])) {
+
+ LADSPA_Data *data = new LADSPA_Data(0.0);
+
+ m_controlPortsIn.push_back(std::pair<unsigned long, LADSPA_Data*>
+ (i, data));
+
+ m_backupControlPortsIn.push_back(0.0);
+ m_portChangedSinceProgramChange.push_back(false);
+
+ } else {
+ LADSPA_Data *data = new LADSPA_Data(0.0);
+ m_controlPortsOut.push_back(
+ std::pair<unsigned long, LADSPA_Data*>(i, data));
+ if (!strcmp(descriptor->PortNames[i], "latency") ||
+ !strcmp(descriptor->PortNames[i], "_latency")) {
+#ifdef DEBUG_DSSI
+ std::cerr << "Wooo! We have a latency port!" << std::endl;
+#endif
+
+ m_latencyPort = data;
+ }
+ }
+ }
+#ifdef DEBUG_DSSI
+ else
+ std::cerr << "DSSIPluginInstance::DSSIPluginInstance - "
+ << "unrecognised port type" << std::endl;
+#endif
+
+ }
+
+ m_outputBufferCount = std::max(m_idealChannelCount, m_audioPortsOut.size());
+}
+
+size_t
+DSSIPluginInstance::getLatency()
+{
+#ifdef DEBUG_DSSI
+ // std::cerr << "DSSIPluginInstance::getLatency(): m_latencyPort " << m_latencyPort << ", m_run " << m_run << std::endl;
+#endif
+
+ if (m_latencyPort) {
+ if (!m_run) {
+ for (int i = 0; i < getAudioInputCount(); ++i) {
+ for (int j = 0; j < m_blockSize; ++j) {
+ m_inputBuffers[i][j] = 0.f;
+ }
+ }
+ run(RealTime::zeroTime);
+ }
+#ifdef DEBUG_DSSI
+
+ std::cerr << "DSSIPluginInstance::getLatency(): latency is " << (size_t)(*m_latencyPort + 0.1) << std::endl;
+#endif
+
+ return (size_t)(*m_latencyPort + 0.1);
+ }
+ return 0;
+}
+
+void
+DSSIPluginInstance::silence()
+{
+#ifdef DEBUG_DSSI
+ std::cerr << "DSSIPluginInstance::silence: m_run " << m_run << ", m_runSinceReset " << m_runSinceReset << std::endl;
+#endif
+
+ if (m_run && !m_runSinceReset) {
+ return ;
+ }
+ if (m_instanceHandle != 0) {
+ deactivate();
+ activate();
+ }
+ m_runSinceReset = false;
+}
+
+void
+DSSIPluginInstance::discardEvents()
+{
+#ifdef DEBUG_DSSI
+ std::cerr << "DSSIPluginInstance::discardEvents" << std::endl;
+#endif
+
+ m_eventBuffer.reset();
+}
+
+void
+DSSIPluginInstance::setIdealChannelCount(size_t channels)
+{
+#ifdef DEBUG_DSSI
+ std::cerr << "DSSIPluginInstance::setIdealChannelCount: channel count "
+ << channels << " (was " << m_idealChannelCount << ")" << std::endl;
+#endif
+
+ if (channels == m_idealChannelCount) {
+ silence();
+ return ;
+ }
+
+ if (m_instanceHandle != 0) {
+ deactivate();
+ }
+
+ m_idealChannelCount = channels;
+
+ if (channels > m_outputBufferCount) {
+
+ for (size_t i = 0; i < m_outputBufferCount; ++i) {
+ delete[] m_outputBuffers[i];
+ }
+
+ delete[] m_outputBuffers;
+
+ m_outputBufferCount = channels;
+
+ m_outputBuffers = new sample_t * [m_outputBufferCount];
+
+ for (size_t i = 0; i < m_outputBufferCount; ++i) {
+ m_outputBuffers[i] = new sample_t[m_blockSize];
+ }
+
+ connectPorts();
+ }
+
+ if (m_instanceHandle != 0) {
+ activate();
+ }
+}
+
+void
+DSSIPluginInstance::detachFromGroup()
+{
+ if (!m_grouped)
+ return ;
+ m_groupMap[m_identifier].erase(this);
+ m_grouped = false;
+}
+
+void
+DSSIPluginInstance::initialiseGroupMembership()
+{
+ if (!m_descriptor->run_multiple_synths) {
+ m_grouped = false;
+ return ;
+ }
+
+ //!!! GroupMap is not actually thread-safe.
+
+ size_t pluginsInGroup = m_groupMap[m_identifier].size();
+
+ if (++pluginsInGroup > m_groupLocalEventBufferCount) {
+
+ size_t nextBufferCount = pluginsInGroup * 2;
+
+ snd_seq_event_t **eventLocalBuffers = new snd_seq_event_t * [nextBufferCount];
+
+ for (size_t i = 0; i < m_groupLocalEventBufferCount; ++i) {
+ eventLocalBuffers[i] = m_groupLocalEventBuffers[i];
+ }
+ for (size_t i = m_groupLocalEventBufferCount; i < nextBufferCount; ++i) {
+ eventLocalBuffers[i] = new snd_seq_event_t[EVENT_BUFFER_SIZE];
+ }
+
+ if (m_groupLocalEventBuffers) {
+ m_bufferScavenger.claim(new ScavengerArrayWrapper<snd_seq_event_t *>
+ (m_groupLocalEventBuffers));
+ }
+
+ m_groupLocalEventBuffers = eventLocalBuffers;
+ m_groupLocalEventBufferCount = nextBufferCount;
+ }
+
+ m_grouped = true;
+ m_groupMap[m_identifier].insert(this);
+}
+
+DSSIPluginInstance::~DSSIPluginInstance()
+{
+// std::cerr << "DSSIPluginInstance::~DSSIPluginInstance" << std::endl;
+
+ detachFromGroup();
+
+ if (m_instanceHandle != 0) {
+ deactivate();
+ }
+
+ cleanup();
+
+ for (unsigned int i = 0; i < m_controlPortsIn.size(); ++i)
+ delete m_controlPortsIn[i].second;
+
+ for (unsigned int i = 0; i < m_controlPortsOut.size(); ++i)
+ delete m_controlPortsOut[i].second;
+
+ m_controlPortsIn.clear();
+ m_controlPortsOut.clear();
+
+ if (m_ownBuffers) {
+ for (size_t i = 0; i < m_audioPortsIn.size(); ++i) {
+ delete[] m_inputBuffers[i];
+ }
+ for (size_t i = 0; i < m_outputBufferCount; ++i) {
+ delete[] m_outputBuffers[i];
+ }
+
+ delete[] m_inputBuffers;
+ delete[] m_outputBuffers;
+ }
+
+ m_audioPortsIn.clear();
+ m_audioPortsOut.clear();
+}
+
+
+void
+DSSIPluginInstance::instantiate(unsigned long sampleRate)
+{
+#ifdef DEBUG_DSSI
+ std::cout << "DSSIPluginInstance::instantiate - plugin unique id = "
+ << m_descriptor->LADSPA_Plugin->UniqueID << std::endl;
+#endif
+
+ if (!m_descriptor)
+ return ;
+
+ const LADSPA_Descriptor *descriptor = m_descriptor->LADSPA_Plugin;
+
+ if (!descriptor->instantiate) {
+ std::cerr << "Bad plugin: plugin id " << descriptor->UniqueID
+ << ":" << descriptor->Label
+ << " has no instantiate method!" << std::endl;
+ return ;
+ }
+
+ m_instanceHandle = descriptor->instantiate(descriptor, sampleRate);
+
+ if (m_instanceHandle) {
+
+ if (m_descriptor->get_midi_controller_for_port) {
+
+ for (unsigned long i = 0; i < descriptor->PortCount; ++i) {
+
+ if (LADSPA_IS_PORT_CONTROL(descriptor->PortDescriptors[i]) &&
+ LADSPA_IS_PORT_INPUT(descriptor->PortDescriptors[i])) {
+
+ int controller = m_descriptor->get_midi_controller_for_port
+ (m_instanceHandle, i);
+
+ if (controller != 0 && controller != 32 &&
+ DSSI_IS_CC(controller)) {
+
+ m_controllerMap[DSSI_CC_NUMBER(controller)] = i;
+ }
+ }
+ }
+ }
+ }
+}
+
+void
+DSSIPluginInstance::checkProgramCache()
+{
+ if (m_programCacheValid)
+ return ;
+ m_cachedPrograms.clear();
+
+#ifdef DEBUG_DSSI
+
+ std::cerr << "DSSIPluginInstance::checkProgramCache" << std::endl;
+#endif
+
+ if (!m_descriptor || !m_descriptor->get_program) {
+ m_programCacheValid = true;
+ return ;
+ }
+
+ unsigned long index = 0;
+ const DSSI_Program_Descriptor *programDescriptor;
+ while ((programDescriptor = m_descriptor->get_program(m_instanceHandle, index))) {
+ ++index;
+ ProgramDescriptor d;
+ d.bank = programDescriptor->Bank;
+ d.program = programDescriptor->Program;
+ d.name = QString("%1. %2").arg(index).arg(programDescriptor->Name);
+ m_cachedPrograms.push_back(d);
+ }
+
+#ifdef DEBUG_DSSI
+ std::cerr << "DSSIPluginInstance::checkProgramCache: have " << m_cachedPrograms.size() << " programs" << std::endl;
+#endif
+
+ m_programCacheValid = true;
+}
+
+QStringList
+DSSIPluginInstance::getPrograms()
+{
+#ifdef DEBUG_DSSI
+ std::cerr << "DSSIPluginInstance::getPrograms" << std::endl;
+#endif
+
+ if (!m_descriptor)
+ return QStringList();
+
+ checkProgramCache();
+
+ QStringList programs;
+
+ for (std::vector<ProgramDescriptor>::iterator i = m_cachedPrograms.begin();
+ i != m_cachedPrograms.end(); ++i) {
+ programs.push_back(i->name);
+ }
+
+ return programs;
+}
+
+QString
+DSSIPluginInstance::getProgram(int bank, int program)
+{
+#ifdef DEBUG_DSSI
+ std::cerr << "DSSIPluginInstance::getProgram(" << bank << "," << program << ")" << std::endl;
+#endif
+
+ if (!m_descriptor)
+ return QString();
+
+ checkProgramCache();
+
+ for (std::vector<ProgramDescriptor>::iterator i = m_cachedPrograms.begin();
+ i != m_cachedPrograms.end(); ++i) {
+ if (i->bank == bank && i->program == program)
+ return i->name;
+ }
+
+ return QString();
+}
+
+unsigned long
+DSSIPluginInstance::getProgram(QString name)
+{
+#ifdef DEBUG_DSSI
+ std::cerr << "DSSIPluginInstance::getProgram(" << name << ")" << std::endl;
+#endif
+
+ if (!m_descriptor)
+ return 0;
+
+ checkProgramCache();
+
+ unsigned long rv;
+
+ for (std::vector<ProgramDescriptor>::iterator i = m_cachedPrograms.begin();
+ i != m_cachedPrograms.end(); ++i) {
+ if (i->name == name) {
+ rv = i->bank;
+ rv = (rv << 16) + i->program;
+ return rv;
+ }
+ }
+
+ return 0;
+}
+
+QString
+DSSIPluginInstance::getCurrentProgram()
+{
+ return m_program;
+}
+
+void
+DSSIPluginInstance::selectProgram(QString program)
+{
+ selectProgramAux(program, true);
+}
+
+void
+DSSIPluginInstance::selectProgramAux(QString program, bool backupPortValues)
+{
+#ifdef DEBUG_DSSI
+ std::cerr << "DSSIPluginInstance[" << this << "]::selectProgram(" << program << ", " << backupPortValues << ")" << std::endl;
+#endif
+
+ if (!m_descriptor)
+ return ;
+
+ checkProgramCache();
+
+ if (!m_descriptor->select_program)
+ return ;
+
+ bool found = false;
+ unsigned long bankNo = 0, programNo = 0;
+
+ for (std::vector<ProgramDescriptor>::iterator i = m_cachedPrograms.begin();
+ i != m_cachedPrograms.end(); ++i) {
+
+ if (i->name == program) {
+
+ bankNo = i->bank;
+ programNo = i->program;
+ found = true;
+
+#ifdef DEBUG_DSSI
+
+ std::cerr << "DSSIPluginInstance::selectProgram(" << program << "): found at bank " << bankNo << ", program " << programNo << std::endl;
+#endif
+
+ break;
+ }
+ }
+
+ if (!found)
+ return ;
+ m_program = program;
+
+ // DSSI select_program is an audio context call
+ pthread_mutex_lock(&m_processLock);
+ m_descriptor->select_program(m_instanceHandle, bankNo, programNo);
+ pthread_mutex_unlock(&m_processLock);
+
+#ifdef DEBUG_DSSI
+
+ std::cerr << "DSSIPluginInstance::selectProgram(" << program << "): made select_program(" << bankNo << "," << programNo << ") call" << std::endl;
+#endif
+
+ if (backupPortValues) {
+ for (size_t i = 0; i < m_backupControlPortsIn.size(); ++i) {
+ m_backupControlPortsIn[i] = *m_controlPortsIn[i].second;
+ m_portChangedSinceProgramChange[i] = false;
+ }
+ }
+}
+
+void
+DSSIPluginInstance::activate()
+{
+#ifdef DEBUG_DSSI
+ std::cerr << "DSSIPluginInstance[" << this << "]::activate" << std::endl;
+#endif
+
+ if (!m_descriptor || !m_descriptor->LADSPA_Plugin->activate)
+ return ;
+ m_descriptor->LADSPA_Plugin->activate(m_instanceHandle);
+
+ for (size_t i = 0; i < m_backupControlPortsIn.size(); ++i) {
+ if (m_portChangedSinceProgramChange[i]) {
+#ifdef DEBUG_DSSI
+ std::cerr << "DSSIPluginInstance::activate: setting port " << m_controlPortsIn[i].first << " to " << m_backupControlPortsIn[i] << std::endl;
+#endif
+
+ *m_controlPortsIn[i].second = m_backupControlPortsIn[i];
+ }
+ }
+
+ if (m_program) {
+#ifdef DEBUG_DSSI
+ std::cerr << "DSSIPluginInstance::activate: restoring program " << m_program << std::endl;
+#endif
+
+ selectProgramAux(m_program, false);
+
+ for (size_t i = 0; i < m_backupControlPortsIn.size(); ++i) {
+ if (m_portChangedSinceProgramChange[i]) {
+#ifdef DEBUG_DSSI
+ std::cerr << "DSSIPluginInstance::activate: setting port " << m_controlPortsIn[i].first << " to " << m_backupControlPortsIn[i] << std::endl;
+#endif
+
+ *m_controlPortsIn[i].second = m_backupControlPortsIn[i];
+ }
+ }
+ }
+}
+
+void
+DSSIPluginInstance::connectPorts()
+{
+ if (!m_descriptor || !m_descriptor->LADSPA_Plugin->connect_port)
+ return ;
+#ifdef DEBUG_DSSI
+
+ std::cerr << "DSSIPluginInstance::connectPorts: " << m_audioPortsIn.size()
+ << " audio ports in, " << m_audioPortsOut.size() << " out, "
+ << m_outputBufferCount << " output buffers" << std::endl;
+#endif
+
+ assert(sizeof(LADSPA_Data) == sizeof(float));
+ assert(sizeof(sample_t) == sizeof(float));
+
+ int inbuf = 0, outbuf = 0;
+
+ for (unsigned int i = 0; i < m_audioPortsIn.size(); ++i) {
+ m_descriptor->LADSPA_Plugin->connect_port
+ (m_instanceHandle,
+ m_audioPortsIn[i],
+ (LADSPA_Data *)m_inputBuffers[inbuf]);
+ ++inbuf;
+ }
+
+ for (unsigned int i = 0; i < m_audioPortsOut.size(); ++i) {
+ m_descriptor->LADSPA_Plugin->connect_port
+ (m_instanceHandle,
+ m_audioPortsOut[i],
+ (LADSPA_Data *)m_outputBuffers[outbuf]);
+ ++outbuf;
+ }
+
+ for (unsigned int i = 0; i < m_controlPortsIn.size(); ++i) {
+ m_descriptor->LADSPA_Plugin->connect_port
+ (m_instanceHandle,
+ m_controlPortsIn[i].first,
+ m_controlPortsIn[i].second);
+ }
+
+ for (unsigned int i = 0; i < m_controlPortsOut.size(); ++i) {
+ m_descriptor->LADSPA_Plugin->connect_port
+ (m_instanceHandle,
+ m_controlPortsOut[i].first,
+ m_controlPortsOut[i].second);
+ }
+}
+
+void
+DSSIPluginInstance::setPortValue(unsigned int portNumber, float value)
+{
+#ifdef DEBUG_DSSI
+ std::cerr << "DSSIPluginInstance[" << this << "]::setPortValue(" << portNumber << ") to " << value << std::endl;
+#endif
+
+ for (unsigned int i = 0; i < m_controlPortsIn.size(); ++i) {
+ if (m_controlPortsIn[i].first == portNumber) {
+ LADSPAPluginFactory *f = dynamic_cast<LADSPAPluginFactory *>(m_factory);
+ if (f) {
+ if (value < f->getPortMinimum(m_descriptor->LADSPA_Plugin, portNumber)) {
+ value = f->getPortMinimum(m_descriptor->LADSPA_Plugin, portNumber);
+ }
+ if (value > f->getPortMaximum(m_descriptor->LADSPA_Plugin, portNumber)) {
+ value = f->getPortMaximum(m_descriptor->LADSPA_Plugin, portNumber);
+ }
+ }
+ (*m_controlPortsIn[i].second) = value;
+ m_backupControlPortsIn[i] = value;
+ m_portChangedSinceProgramChange[i] = true;
+ }
+ }
+}
+
+void
+DSSIPluginInstance::setPortValueFromController(unsigned int port, int cv)
+{
+#ifdef DEBUG_DSSI
+ std::cerr << "DSSIPluginInstance::setPortValueFromController(" << port << ") to " << cv << std::endl;
+#endif
+
+ const LADSPA_Descriptor *p = m_descriptor->LADSPA_Plugin;
+ LADSPA_PortRangeHintDescriptor d = p->PortRangeHints[port].HintDescriptor;
+ LADSPA_Data lb = p->PortRangeHints[port].LowerBound;
+ LADSPA_Data ub = p->PortRangeHints[port].UpperBound;
+
+ float value = (float)cv;
+
+ if (!LADSPA_IS_HINT_BOUNDED_BELOW(d)) {
+ if (!LADSPA_IS_HINT_BOUNDED_ABOVE(d)) {
+ /* unbounded: might as well leave the value alone. */
+ } else {
+ /* bounded above only. just shift the range. */
+ value = ub - 127.0f + value;
+ }
+ } else {
+ if (!LADSPA_IS_HINT_BOUNDED_ABOVE(d)) {
+ /* bounded below only. just shift the range. */
+ value = lb + value;
+ } else {
+ /* bounded both ends. more interesting. */
+ /* XXX !!! todo: fill in logarithmic, sample rate &c */
+ value = lb + ((ub - lb) * value / 127.0f);
+ }
+ }
+
+ setPortValue(port, value);
+}
+
+float
+DSSIPluginInstance::getPortValue(unsigned int portNumber)
+{
+#ifdef DEBUG_DSSI
+ std::cerr << "DSSIPluginInstance::getPortValue(" << portNumber << ")" << std::endl;
+#endif
+
+ for (unsigned int i = 0; i < m_controlPortsIn.size(); ++i) {
+ if (m_controlPortsIn[i].first == portNumber) {
+ return (*m_controlPortsIn[i].second);
+ }
+ }
+
+ return 0.0;
+}
+
+QString
+DSSIPluginInstance::configure(QString key,
+ QString value)
+{
+ if (!m_descriptor || !m_descriptor->configure)
+ return QString();
+
+ if (key == PluginIdentifier::RESERVED_PROJECT_DIRECTORY_KEY) {
+#ifdef DSSI_PROJECT_DIRECTORY_KEY
+ key = DSSI_PROJECT_DIRECTORY_KEY;
+#else
+
+ return QString();
+#endif
+
+ }
+
+
+#ifdef DEBUG_DSSI
+ std::cerr << "DSSIPluginInstance::configure(" << key << "," << value << ")" << std::endl;
+#endif
+
+ char *message = m_descriptor->configure(m_instanceHandle, key.data(), value.data());
+
+ m_programCacheValid = false;
+
+ QString qm;
+
+ // Ignore return values from reserved key configuration calls such
+ // as project directory
+#ifdef DSSI_RESERVED_CONFIGURE_PREFIX
+
+ if (key.startsWith(DSSI_RESERVED_CONFIGURE_PREFIX)) {
+ return qm;
+ }
+#endif
+
+ if (message) {
+ if (m_descriptor->LADSPA_Plugin && m_descriptor->LADSPA_Plugin->Label) {
+ qm = QString(m_descriptor->LADSPA_Plugin->Label) + ": ";
+ }
+ qm = qm + message;
+ free(message);
+ }
+
+ return qm;
+}
+
+void
+DSSIPluginInstance::sendEvent(const RealTime &eventTime,
+ const void *e)
+{
+ snd_seq_event_t *event = (snd_seq_event_t *)e;
+#ifdef DEBUG_DSSI_PROCESS
+
+ std::cerr << "DSSIPluginInstance::sendEvent at " << eventTime << std::endl;
+#endif
+
+ snd_seq_event_t ev(*event);
+
+ ev.time.time.tv_sec = eventTime.sec;
+ ev.time.time.tv_nsec = eventTime.nsec;
+
+ // DSSI doesn't use MIDI channels, it uses run_multiple_synths instead.
+ ev.data.note.channel = 0;
+
+ m_eventBuffer.write(&ev, 1);
+}
+
+bool
+DSSIPluginInstance::handleController(snd_seq_event_t *ev)
+{
+ int controller = ev->data.control.param;
+
+#ifdef DEBUG_DSSI_PROCESS
+
+ std::cerr << "DSSIPluginInstance::handleController " << controller << std::endl;
+#endif
+
+ if (controller == 0) { // bank select MSB
+
+ m_pending.msb = ev->data.control.value;
+
+ } else if (controller == 32) { // bank select LSB
+
+ m_pending.lsb = ev->data.control.value;
+
+ } else if (controller > 0 && controller < 128) {
+
+ if (m_controllerMap.find(controller) != m_controllerMap.end()) {
+ int port = m_controllerMap[controller];
+ setPortValueFromController(port, ev->data.control.value);
+ } else {
+ return true; // pass through to plugin
+ }
+ }
+
+ return false;
+}
+
+void
+DSSIPluginInstance::run(const RealTime &blockTime)
+{
+ static snd_seq_event_t localEventBuffer[EVENT_BUFFER_SIZE];
+ int evCount = 0;
+
+ bool needLock = false;
+ if (m_descriptor->select_program)
+ needLock = true;
+
+ if (needLock) {
+ if (pthread_mutex_trylock(&m_processLock) != 0) {
+ for (size_t ch = 0; ch < m_audioPortsOut.size(); ++ch) {
+ memset(m_outputBuffers[ch], 0, m_blockSize * sizeof(sample_t));
+ }
+ return ;
+ }
+ }
+
+ if (m_grouped) {
+ runGrouped(blockTime);
+ goto done;
+ }
+
+ if (!m_descriptor || !m_descriptor->run_synth) {
+ m_eventBuffer.skip(m_eventBuffer.getReadSpace());
+ if (m_descriptor->LADSPA_Plugin->run) {
+ m_descriptor->LADSPA_Plugin->run(m_instanceHandle, m_blockSize);
+ } else {
+ for (size_t ch = 0; ch < m_audioPortsOut.size(); ++ch) {
+ memset(m_outputBuffers[ch], 0, m_blockSize * sizeof(sample_t));
+ }
+ }
+ m_run = true;
+ m_runSinceReset = true;
+ if (needLock)
+ pthread_mutex_unlock(&m_processLock);
+ return ;
+ }
+
+#ifdef DEBUG_DSSI_PROCESS
+ std::cerr << "DSSIPluginInstance::run(" << blockTime << ")" << std::endl;
+#endif
+
+#ifdef DEBUG_DSSI_PROCESS
+
+ if (m_eventBuffer.getReadSpace() > 0) {
+ std::cerr << "DSSIPluginInstance::run: event buffer has "
+ << m_eventBuffer.getReadSpace() << " event(s) in it" << std::endl;
+ }
+#endif
+
+ while (m_eventBuffer.getReadSpace() > 0) {
+
+ snd_seq_event_t *ev = localEventBuffer + evCount;
+ *ev = m_eventBuffer.peek();
+ bool accept = true;
+
+ RealTime evTime(ev->time.time.tv_sec, ev->time.time.tv_nsec);
+
+ int frameOffset = 0;
+ if (evTime > blockTime) {
+ frameOffset = RealTime::realTime2Frame(evTime - blockTime, m_sampleRate);
+ }
+
+#ifdef DEBUG_DSSI_PROCESS
+ std::cerr << "DSSIPluginInstance::run: evTime " << evTime << ", blockTime " << blockTime << ", frameOffset " << frameOffset
+ << ", blockSize " << m_blockSize << std::endl;
+ std::cerr << "Type: " << int(ev->type) << ", pitch: " << int(ev->data.note.note) << ", velocity: " << int(ev->data.note.velocity) << std::endl;
+#endif
+
+ if (frameOffset >= int(m_blockSize))
+ break;
+ if (frameOffset < 0)
+ frameOffset = 0;
+
+ ev->time.tick = frameOffset;
+ m_eventBuffer.skip(1);
+
+ if (ev->type == SND_SEQ_EVENT_CONTROLLER) {
+ accept = handleController(ev);
+ } else if (ev->type == SND_SEQ_EVENT_PGMCHANGE) {
+ m_pending.program = ev->data.control.value;
+ accept = false;
+ }
+
+ if (accept) {
+ if (++evCount >= EVENT_BUFFER_SIZE)
+ break;
+ }
+ }
+
+ if (m_pending.program >= 0 && m_descriptor->select_program) {
+
+ int program = m_pending.program;
+ int bank = m_pending.lsb + 128 * m_pending.msb;
+
+#ifdef DEBUG_DSSI
+
+ std::cerr << "DSSIPluginInstance::run: making select_program(" << bank << "," << program << " call" << std::endl;
+#endif
+
+ m_pending.lsb = m_pending.msb = m_pending.program = -1;
+ m_descriptor->select_program(m_instanceHandle, bank, program);
+
+#ifdef DEBUG_DSSI
+
+ std::cerr << "DSSIPluginInstance::run: made select_program(" << bank << "," << program << " call" << std::endl;
+#endif
+
+ }
+
+#ifdef DEBUG_DSSI_PROCESS
+ std::cerr << "DSSIPluginInstance::run: running with " << evCount << " events"
+ << std::endl;
+#endif
+
+ m_descriptor->run_synth(m_instanceHandle, m_blockSize,
+ localEventBuffer, evCount);
+
+#ifdef DEBUG_DSSI_PROCESS
+ // for (int i = 0; i < m_blockSize; ++i) {
+ // std::cout << m_outputBuffers[0][i] << " ";
+ // if (i % 8 == 0) std::cout << std::endl;
+ // }
+#endif
+
+done:
+ if (needLock)
+ pthread_mutex_unlock(&m_processLock);
+
+ if (m_audioPortsOut.size() == 0) {
+ // copy inputs to outputs
+ for (size_t ch = 0; ch < m_idealChannelCount; ++ch) {
+ size_t sch = ch % m_audioPortsIn.size();
+ for (size_t i = 0; i < m_blockSize; ++i) {
+ m_outputBuffers[ch][i] = m_inputBuffers[sch][i];
+ }
+ }
+ } else if (m_idealChannelCount < m_audioPortsOut.size()) {
+ if (m_idealChannelCount == 1) {
+ // mix down to mono
+ for (size_t ch = 1; ch < m_audioPortsOut.size(); ++ch) {
+ for (size_t i = 0; i < m_blockSize; ++i) {
+ m_outputBuffers[0][i] += m_outputBuffers[ch][i];
+ }
+ }
+ }
+ } else if (m_idealChannelCount > m_audioPortsOut.size()) {
+ // duplicate
+ for (size_t ch = m_audioPortsOut.size(); ch < m_idealChannelCount; ++ch) {
+ size_t sch = (ch - m_audioPortsOut.size()) % m_audioPortsOut.size();
+ for (size_t i = 0; i < m_blockSize; ++i) {
+ m_outputBuffers[ch][i] = m_outputBuffers[sch][i];
+ }
+ }
+ }
+
+ m_lastRunTime = blockTime;
+ m_run = true;
+ m_runSinceReset = true;
+}
+
+void
+DSSIPluginInstance::runGrouped(const RealTime &blockTime)
+{
+ // If something else in our group has just been called for this
+ // block time (but we haven't) then we should just write out the
+ // results and return; if we have just been called for this block
+ // time or nothing else in the group has been, we should run the
+ // whole group.
+
+ bool needRun = true;
+
+ PluginSet &s = m_groupMap[m_identifier];
+
+#ifdef DEBUG_DSSI_PROCESS
+
+ std::cerr << "DSSIPluginInstance::runGrouped(" << blockTime << "): this is " << this << "; " << s.size() << " elements in m_groupMap[" << m_identifier << "]" << std::endl;
+#endif
+
+ if (m_lastRunTime != blockTime) {
+ for (PluginSet::iterator i = s.begin(); i != s.end(); ++i) {
+ DSSIPluginInstance *instance = *i;
+ if (instance != this && instance->m_lastRunTime == blockTime) {
+#ifdef DEBUG_DSSI_PROCESS
+ std::cerr << "DSSIPluginInstance::runGrouped(" << blockTime << "): plugin " << instance << " has already been run" << std::endl;
+#endif
+
+ needRun = false;
+ }
+ }
+ }
+
+ if (!needRun) {
+#ifdef DEBUG_DSSI_PROCESS
+ std::cerr << "DSSIPluginInstance::runGrouped(" << blockTime << "): already run, returning" << std::endl;
+#endif
+
+ return ;
+ }
+
+#ifdef DEBUG_DSSI_PROCESS
+ std::cerr << "DSSIPluginInstance::runGrouped(" << blockTime << "): I'm the first, running" << std::endl;
+#endif
+
+ size_t index = 0;
+ unsigned long *counts = (unsigned long *)
+ alloca(m_groupLocalEventBufferCount * sizeof(unsigned long));
+ LADSPA_Handle *instances = (LADSPA_Handle *)
+ alloca(m_groupLocalEventBufferCount * sizeof(LADSPA_Handle));
+
+ for (PluginSet::iterator i = s.begin(); i != s.end(); ++i) {
+
+ if (index >= m_groupLocalEventBufferCount)
+ break;
+
+ DSSIPluginInstance *instance = *i;
+ counts[index] = 0;
+ instances[index] = instance->m_instanceHandle;
+
+#ifdef DEBUG_DSSI_PROCESS
+
+ std::cerr << "DSSIPluginInstance::runGrouped(" << blockTime << "): running " << instance << std::endl;
+#endif
+
+ if (instance->m_pending.program >= 0 &&
+ instance->m_descriptor->select_program) {
+ int program = instance->m_pending.program;
+ int bank = instance->m_pending.lsb + 128 * instance->m_pending.msb;
+ instance->m_pending.lsb = instance->m_pending.msb = instance->m_pending.program = -1;
+ instance->m_descriptor->select_program
+ (instance->m_instanceHandle, bank, program);
+ }
+
+ while (instance->m_eventBuffer.getReadSpace() > 0) {
+
+ snd_seq_event_t *ev = m_groupLocalEventBuffers[index] + counts[index];
+ *ev = instance->m_eventBuffer.peek();
+ bool accept = true;
+
+ RealTime evTime(ev->time.time.tv_sec, ev->time.time.tv_nsec);
+
+ int frameOffset = 0;
+ if (evTime > blockTime) {
+ frameOffset = RealTime::realTime2Frame(evTime - blockTime, m_sampleRate);
+ }
+
+#ifdef DEBUG_DSSI_PROCESS
+ std::cerr << "DSSIPluginInstance::runGrouped: evTime " << evTime << ", frameOffset " << frameOffset
+ << ", block size " << m_blockSize << std::endl;
+#endif
+
+ if (frameOffset >= int(m_blockSize))
+ break;
+ if (frameOffset < 0)
+ frameOffset = 0;
+
+ ev->time.tick = frameOffset;
+ instance->m_eventBuffer.skip(1);
+
+ if (ev->type == SND_SEQ_EVENT_CONTROLLER) {
+ accept = instance->handleController(ev);
+ } else if (ev->type == SND_SEQ_EVENT_PGMCHANGE) {
+ instance->m_pending.program = ev->data.control.value;
+ accept = false;
+ }
+
+ if (accept) {
+ if (++counts[index] >= EVENT_BUFFER_SIZE)
+ break;
+ }
+ }
+
+ ++index;
+ }
+
+ m_descriptor->run_multiple_synths(index,
+ instances,
+ m_blockSize,
+ m_groupLocalEventBuffers,
+ counts);
+}
+
+
+void
+DSSIPluginInstance::deactivate()
+{
+#ifdef DEBUG_DSSI
+ std::cerr << "DSSIPluginInstance::deactivate " << m_identifier << std::endl;
+#endif
+
+ if (!m_descriptor || !m_descriptor->LADSPA_Plugin->deactivate)
+ return ;
+
+ for (size_t i = 0; i < m_backupControlPortsIn.size(); ++i) {
+ m_backupControlPortsIn[i] = *m_controlPortsIn[i].second;
+ }
+
+ m_descriptor->LADSPA_Plugin->deactivate(m_instanceHandle);
+#ifdef DEBUG_DSSI
+
+ std::cerr << "DSSIPluginInstance::deactivate " << m_identifier << " done" << std::endl;
+#endif
+
+ m_bufferScavenger.scavenge();
+}
+
+void
+DSSIPluginInstance::cleanup()
+{
+#ifdef DEBUG_DSSI
+ std::cerr << "DSSIPluginInstance::cleanup " << m_identifier << std::endl;
+#endif
+
+ if (!m_descriptor)
+ return ;
+
+ if (!m_descriptor->LADSPA_Plugin->cleanup) {
+ std::cerr << "Bad plugin: plugin id "
+ << m_descriptor->LADSPA_Plugin->UniqueID
+ << ":" << m_descriptor->LADSPA_Plugin->Label
+ << " has no cleanup method!" << std::endl;
+ return ;
+ }
+
+ m_descriptor->LADSPA_Plugin->cleanup(m_instanceHandle);
+ m_instanceHandle = 0;
+#ifdef DEBUG_DSSI
+
+ std::cerr << "DSSIPluginInstance::cleanup " << m_identifier << " done" << std::endl;
+#endif
+}
+
+
+
+}
+
+#endif // HAVE_DSSI
+
+
diff --git a/src/sound/DSSIPluginInstance.h b/src/sound/DSSIPluginInstance.h
new file mode 100644
index 0000000..eca6327
--- /dev/null
+++ b/src/sound/DSSIPluginInstance.h
@@ -0,0 +1,193 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _DSSIPLUGININSTANCE_H_
+#define _DSSIPLUGININSTANCE_H_
+
+#include <vector>
+#include <set>
+#include <map>
+#include <qstring.h>
+#include "Instrument.h"
+
+#ifdef HAVE_DSSI
+
+#include <dssi.h>
+#include "RingBuffer.h"
+#include "RunnablePluginInstance.h"
+#include "Scavenger.h"
+#include <pthread.h>
+
+namespace Rosegarden
+{
+
+class DSSIPluginInstance : public RunnablePluginInstance
+{
+public:
+ virtual ~DSSIPluginInstance();
+
+ virtual bool isOK() const { return m_instanceHandle != 0; }
+
+ InstrumentId getInstrument() const { return m_instrument; }
+ virtual QString getIdentifier() const { return m_identifier; }
+ int getPosition() const { return m_position; }
+
+ virtual void run(const RealTime &);
+
+ virtual void setPortValue(unsigned int portNumber, float value);
+ virtual float getPortValue(unsigned int portNumber);
+ virtual QString configure(QString key, QString value);
+ virtual void sendEvent(const RealTime &eventTime,
+ const void *event);
+
+ virtual size_t getBufferSize() { return m_blockSize; }
+ virtual size_t getAudioInputCount() { return m_audioPortsIn.size(); }
+ virtual size_t getAudioOutputCount() { return m_idealChannelCount; }
+ virtual sample_t **getAudioInputBuffers() { return m_inputBuffers; }
+ virtual sample_t **getAudioOutputBuffers() { return m_outputBuffers; }
+
+ virtual QStringList getPrograms();
+ virtual QString getCurrentProgram();
+ virtual QString getProgram(int bank, int program);
+ virtual unsigned long getProgram(QString name);
+ virtual void selectProgram(QString program);
+
+ virtual bool isBypassed() const { return m_bypassed; }
+ virtual void setBypassed(bool bypassed) { m_bypassed = bypassed; }
+
+ virtual size_t getLatency();
+
+ virtual void silence();
+ virtual void discardEvents();
+ virtual void setIdealChannelCount(size_t channels); // may re-instantiate
+
+ virtual bool isInGroup() const { return m_grouped; }
+ virtual void detachFromGroup();
+
+protected:
+ // To be constructed only by DSSIPluginFactory
+ friend class DSSIPluginFactory;
+
+ // Constructor that creates the buffers internally
+ //
+ DSSIPluginInstance(PluginFactory *factory,
+ InstrumentId instrument,
+ QString identifier,
+ int position,
+ unsigned long sampleRate,
+ size_t blockSize,
+ int idealChannelCount,
+ const DSSI_Descriptor* descriptor);
+
+ // Constructor that uses shared buffers
+ //
+ DSSIPluginInstance(PluginFactory *factory,
+ InstrumentId instrument,
+ QString identifier,
+ int position,
+ unsigned long sampleRate,
+ size_t blockSize,
+ sample_t **inputBuffers,
+ sample_t **outputBuffers,
+ const DSSI_Descriptor* descriptor);
+
+ void init();
+ void instantiate(unsigned long sampleRate);
+ void cleanup();
+ void activate();
+ void deactivate();
+ void connectPorts();
+
+ bool handleController(snd_seq_event_t *ev);
+ void setPortValueFromController(unsigned int portNumber, int controlValue);
+ void selectProgramAux(QString program, bool backupPortValues);
+ void checkProgramCache();
+
+ void initialiseGroupMembership();
+ void runGrouped(const RealTime &);
+
+ InstrumentId m_instrument;
+ int m_position;
+ LADSPA_Handle m_instanceHandle;
+ const DSSI_Descriptor *m_descriptor;
+
+ std::vector<std::pair<unsigned long, LADSPA_Data*> > m_controlPortsIn;
+ std::vector<std::pair<unsigned long, LADSPA_Data*> > m_controlPortsOut;
+
+ std::vector<LADSPA_Data> m_backupControlPortsIn;
+ std::vector<bool> m_portChangedSinceProgramChange;
+
+ std::map<int, int> m_controllerMap;
+
+ std::vector<int> m_audioPortsIn;
+ std::vector<int> m_audioPortsOut;
+
+ struct ProgramControl {
+ int msb;
+ int lsb;
+ int program;
+ };
+ ProgramControl m_pending;
+
+ struct ProgramDescriptor {
+ int bank;
+ int program;
+ QString name;
+ };
+ std::vector<ProgramDescriptor> m_cachedPrograms;
+ bool m_programCacheValid;
+
+ RingBuffer<snd_seq_event_t> m_eventBuffer;
+
+ size_t m_blockSize;
+ sample_t **m_inputBuffers;
+ sample_t **m_outputBuffers;
+ bool m_ownBuffers;
+ size_t m_idealChannelCount;
+ size_t m_outputBufferCount;
+ size_t m_sampleRate;
+ float *m_latencyPort;
+
+ bool m_run;
+ bool m_runSinceReset;
+
+ bool m_bypassed;
+ QString m_program;
+ bool m_grouped;
+ RealTime m_lastRunTime;
+
+ pthread_mutex_t m_processLock;
+
+ typedef std::set<DSSIPluginInstance *> PluginSet;
+ typedef std::map<QString, PluginSet> GroupMap;
+ static GroupMap m_groupMap;
+ static snd_seq_event_t **m_groupLocalEventBuffers;
+ static size_t m_groupLocalEventBufferCount;
+
+ static Scavenger<ScavengerArrayWrapper<snd_seq_event_t *> > m_bufferScavenger;
+};
+
+};
+
+#endif // HAVE_DSSI
+
+#endif // _DSSIPLUGININSTANCE_H_
+
diff --git a/src/sound/DummyDriver.h b/src/sound/DummyDriver.h
new file mode 100644
index 0000000..838e7bd
--- /dev/null
+++ b/src/sound/DummyDriver.h
@@ -0,0 +1,166 @@
+// -*- c-indentation-style:"stroustrup" c-basic-offset: 4 -*-
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include "SoundDriver.h"
+
+// An empty sound driver for when we don't want sound support
+// but still want to build the sequencer.
+//
+
+#ifndef _DUMMYDRIVER_H_
+#define _DUMMYDRIVER_H_
+
+namespace Rosegarden
+{
+
+class DummyDriver : public SoundDriver
+{
+public:
+ DummyDriver(MappedStudio *studio):
+ SoundDriver(studio, std::string("DummyDriver - no sound")) { }
+ DummyDriver(MappedStudio *studio, const std::string & name):
+ SoundDriver(studio, std::string("DummyDriver: " + name)) { }
+ virtual ~DummyDriver() { }
+
+ virtual bool initialise() { m_recordComposition.clear(); return true; }
+ virtual void initialisePlayback(const RealTime & /*position*/) { }
+ virtual void stopPlayback() { }
+ virtual void punchOut() { }
+ virtual void resetPlayback(const RealTime & /*old position*/,
+ const RealTime & /*position*/) { }
+ virtual void allNotesOff() { }
+
+ virtual RealTime getSequencerTime() { return RealTime(0, 0);}
+
+ virtual MappedComposition* getMappedComposition()
+ { return &m_recordComposition;}
+
+ virtual void processEventsOut(const MappedComposition & /*mC*/) { }
+
+ virtual void processEventsOut(const MappedComposition &,
+ const RealTime &,
+ const RealTime &) { }
+
+ // Activate a recording state
+ //
+ virtual bool record(RecordStatus /*recordStatus*/,
+ const std::vector<InstrumentId> */*armedInstruments = 0*/,
+ const std::vector<QString> */*audioFileNames = 0*/)
+ { return false; }
+
+ // Process anything that's pending
+ //
+ virtual void processPending() { }
+
+ // Sample rate
+ //
+ virtual unsigned int getSampleRate() const { return 0; }
+
+ // Return the last recorded audio level
+ //
+ virtual float getLastRecordedAudioLevel() { return 0.0; }
+
+ // Plugin instance management
+ //
+ virtual void setPluginInstance(InstrumentId /*id*/,
+ QString /*pluginIdent*/,
+ int /*position*/) { }
+
+ virtual void removePluginInstance(InstrumentId /*id*/,
+ int /*position*/) { }
+
+ virtual void removePluginInstances() { }
+
+ virtual void setPluginInstancePortValue(InstrumentId /*id*/,
+ int /*position*/,
+ unsigned long /*portNumber*/,
+ float /*value*/) { }
+
+ virtual float getPluginInstancePortValue(InstrumentId ,
+ int ,
+ unsigned long ) { return 0; }
+
+ virtual void setPluginInstanceBypass(InstrumentId /*id*/,
+ int /*position*/,
+ bool /*value*/) { }
+
+ virtual QStringList getPluginInstancePrograms(InstrumentId ,
+ int ) { return QStringList(); }
+
+ virtual QString getPluginInstanceProgram(InstrumentId,
+ int ) { return QString(); }
+
+ virtual QString getPluginInstanceProgram(InstrumentId,
+ int,
+ int,
+ int) { return QString(); }
+
+ virtual unsigned long getPluginInstanceProgram(InstrumentId,
+ int ,
+ QString) { return 0; }
+
+ virtual void setPluginInstanceProgram(InstrumentId,
+ int ,
+ QString ) { }
+
+ virtual QString configurePlugin(InstrumentId,
+ int,
+ QString ,
+ QString ) { return QString(); }
+
+ virtual void setAudioBussLevels(int ,
+ float ,
+ float ) { }
+
+ virtual void setAudioInstrumentLevels(InstrumentId,
+ float,
+ float) { }
+
+ virtual bool checkForNewClients() { return false; }
+
+ virtual void setLoop(const RealTime &/*loopStart*/,
+ const RealTime &/*loopEnd*/) { }
+
+ virtual std::vector<PlayableAudioFile*> getPlayingAudioFiles()
+ { return std::vector<PlayableAudioFile*>(); }
+
+ virtual void getAudioInstrumentNumbers(InstrumentId &i, int &n) {
+ i = 0; n = 0;
+ }
+ virtual void getSoftSynthInstrumentNumbers(InstrumentId &i, int &n) {
+ i = 0; n = 0;
+ }
+
+ virtual void claimUnwantedPlugin(void *plugin) { }
+ virtual void scavengePlugins() { }
+
+ virtual bool areClocksRunning() const { return true; }
+
+protected:
+ virtual void processMidiOut(const MappedComposition & /*mC*/,
+ const RealTime &, const RealTime &) { }
+ virtual void generateInstruments() { }
+
+};
+
+}
+
+#endif // _DUMMYDRIVER_H_
+
diff --git a/src/sound/ExternalTransport.h b/src/sound/ExternalTransport.h
new file mode 100644
index 0000000..f40a5a2
--- /dev/null
+++ b/src/sound/ExternalTransport.h
@@ -0,0 +1,67 @@
+// -*- c-basic-offset: 4 -*-
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _EXTERNAL_TRANSPORT_H_
+#define _EXTERNAL_TRANSPORT_H_
+
+namespace Rosegarden {
+
+/**
+ * Simple interface that we can pass to low-level audio code and on
+ * which it can call back when something external requests a transport
+ * change. The callback is asynchronous, and there's a method for the
+ * low-level code to use to find out whether its request has finished
+ * synchronising yet.
+ *
+ * (Each of the transportXX functions returns a token which can then
+ * be passed to isTransportSyncComplete.)
+ */
+
+class ExternalTransport
+{
+public:
+ typedef unsigned long TransportToken;
+
+ enum TransportRequest {
+ TransportNoChange,
+ TransportStop,
+ TransportStart,
+ TransportPlay,
+ TransportRecord,
+ TransportJumpToTime, // time arg required
+ TransportStartAtTime, // time arg required
+ TransportStopAtTime // time arg required
+ };
+
+ virtual TransportToken transportChange(TransportRequest) = 0;
+ virtual TransportToken transportJump(TransportRequest, RealTime) = 0;
+
+ virtual bool isTransportSyncComplete(TransportToken token) = 0;
+
+ // The value returned here is a constant (within the context of a
+ // particular ExternalTransport object) that is guaranteed never
+ // to be returned by any of the transport request methods.
+ virtual TransportToken getInvalidTransportToken() const = 0;
+};
+
+}
+
+#endif
+
diff --git a/src/sound/JackDriver.cpp b/src/sound/JackDriver.cpp
new file mode 100644
index 0000000..24eb6fe
--- /dev/null
+++ b/src/sound/JackDriver.cpp
@@ -0,0 +1,2480 @@
+
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include "JackDriver.h"
+#include "AlsaDriver.h"
+#include "MappedStudio.h"
+#include "AudioProcess.h"
+#include "Profiler.h"
+#include "AudioLevel.h"
+#include "Audit.h"
+#include "PluginFactory.h"
+
+#ifdef HAVE_ALSA
+#ifdef HAVE_LIBJACK
+
+//#define DEBUG_JACK_DRIVER 1
+//#define DEBUG_JACK_TRANSPORT 1
+//#define DEBUG_JACK_PROCESS 1
+//#define DEBUG_JACK_XRUN 1
+
+namespace Rosegarden
+{
+
+#if (defined(DEBUG_JACK_DRIVER) || defined(DEBUG_JACK_PROCESS) || defined(DEBUG_JACK_TRANSPORT))
+static unsigned long framesThisPlay = 0;
+static RealTime startTime;
+#endif
+
+JackDriver::JackDriver(AlsaDriver *alsaDriver) :
+ m_client(0),
+ m_bufferSize(0),
+ m_sampleRate(0),
+ m_tempOutBuffer(0),
+ m_jackTransportEnabled(false),
+ m_jackTransportMaster(false),
+ m_waiting(false),
+ m_waitingState(JackTransportStopped),
+ m_waitingToken(0),
+ m_ignoreProcessTransportCount(0),
+ m_bussMixer(0),
+ m_instrumentMixer(0),
+ m_fileReader(0),
+ m_fileWriter(0),
+ m_alsaDriver(alsaDriver),
+ m_masterLevel(1.0),
+ m_directMasterAudioInstruments(0L),
+ m_directMasterSynthInstruments(0L),
+ m_haveAsyncAudioEvent(false),
+ m_kickedOutAt(0),
+ m_framesProcessed(0),
+ m_ok(false)
+{
+ assert(sizeof(sample_t) == sizeof(float));
+ initialise();
+}
+
+JackDriver::~JackDriver()
+{
+#ifdef DEBUG_JACK_DRIVER
+ std::cerr << "JackDriver::~JackDriver" << std::endl;
+#endif
+
+ m_ok = false; // prevent any more work in process()
+
+ if (m_client) {
+#ifdef DEBUG_JACK_DRIVER
+ std::cerr << "JackDriver::shutdown - deactivating JACK client"
+ << std::endl;
+#endif
+
+ if (jack_deactivate(m_client)) {
+ std::cerr << "JackDriver::shutdown - deactivation failed"
+ << std::endl;
+ }
+ }
+
+#ifdef DEBUG_JACK_DRIVER
+ std::cerr << "JackDriver::~JackDriver: terminating buss mixer" << std::endl;
+#endif
+
+ AudioBussMixer *bussMixer = m_bussMixer;
+ m_bussMixer = 0;
+ if (bussMixer)
+ bussMixer->terminate();
+
+#ifdef DEBUG_JACK_DRIVER
+ std::cerr << "JackDriver::~JackDriver: terminating instrument mixer" << std::endl;
+#endif
+
+ AudioInstrumentMixer *instrumentMixer = m_instrumentMixer;
+ m_instrumentMixer = 0;
+ if (instrumentMixer) {
+ instrumentMixer->terminate();
+ instrumentMixer->destroyAllPlugins();
+ }
+
+#ifdef DEBUG_JACK_DRIVER
+ std::cerr << "JackDriver::~JackDriver: terminating file reader" << std::endl;
+#endif
+
+ AudioFileReader *reader = m_fileReader;
+ m_fileReader = 0;
+ if (reader)
+ reader->terminate();
+
+#ifdef DEBUG_JACK_DRIVER
+ std::cerr << "JackDriver::~JackDriver: terminating file writer" << std::endl;
+#endif
+
+ AudioFileWriter *writer = m_fileWriter;
+ m_fileWriter = 0;
+ if (writer)
+ writer->terminate();
+
+ if (m_client) {
+
+#ifdef DEBUG_JACK_DRIVER
+ std::cerr << "JackDriver::shutdown - tearing down JACK client"
+ << std::endl;
+#endif
+
+ for (unsigned int i = 0; i < m_inputPorts.size(); ++i) {
+#ifdef DEBUG_JACK_DRIVER
+ std::cerr << "unregistering input " << i << std::endl;
+#endif
+
+ if (jack_port_unregister(m_client, m_inputPorts[i])) {
+ std::cerr << "JackDriver::shutdown - "
+ << "can't unregister input port " << i + 1
+ << std::endl;
+ }
+ }
+
+ for (unsigned int i = 0; i < m_outputSubmasters.size(); ++i) {
+#ifdef DEBUG_JACK_DRIVER
+ std::cerr << "unregistering output sub " << i << std::endl;
+#endif
+
+ if (jack_port_unregister(m_client, m_outputSubmasters[i])) {
+ std::cerr << "JackDriver::shutdown - "
+ << "can't unregister output submaster " << i + 1 << std::endl;
+ }
+ }
+
+ for (unsigned int i = 0; i < m_outputMonitors.size(); ++i) {
+#ifdef DEBUG_JACK_DRIVER
+ std::cerr << "unregistering output mon " << i << std::endl;
+#endif
+
+ if (jack_port_unregister(m_client, m_outputMonitors[i])) {
+ std::cerr << "JackDriver::shutdown - "
+ << "can't unregister output monitor " << i + 1 << std::endl;
+ }
+ }
+
+ for (unsigned int i = 0; i < m_outputMasters.size(); ++i) {
+#ifdef DEBUG_JACK_DRIVER
+ std::cerr << "unregistering output master " << i << std::endl;
+#endif
+
+ if (jack_port_unregister(m_client, m_outputMasters[i])) {
+ std::cerr << "JackDriver::shutdown - "
+ << "can't unregister output master " << i + 1 << std::endl;
+ }
+ }
+
+#ifdef DEBUG_JACK_DRIVER
+ std::cerr << "closing client" << std::endl;
+#endif
+
+ jack_client_close(m_client);
+ std::cerr << "done" << std::endl;
+ m_client = 0;
+ }
+
+#ifdef DEBUG_JACK_DRIVER
+ std::cerr << "JackDriver: deleting mixers etc" << std::endl;
+#endif
+
+ delete bussMixer;
+ delete instrumentMixer;
+ delete reader;
+ delete writer;
+
+#ifdef DEBUG_JACK_DRIVER
+
+ std::cerr << "JackDriver::~JackDriver exiting" << std::endl;
+#endif
+}
+
+void
+JackDriver::initialise(bool reinitialise)
+{
+ m_ok = false;
+
+ Audit audit;
+ audit << std::endl;
+
+ std::string jackClientName = "rosegarden";
+
+ // attempt connection to JACK server
+ //
+ if ((m_client = jack_client_new(jackClientName.c_str())) == 0) {
+ audit << "JackDriver::initialiseAudio - "
+ << "JACK server not running"
+ << std::endl;
+ return ;
+ }
+
+ InstrumentId instrumentBase;
+ int instrumentCount;
+ m_alsaDriver->getAudioInstrumentNumbers(instrumentBase, instrumentCount);
+ for (InstrumentId id = instrumentBase;
+ id < instrumentBase + instrumentCount; ++id) {
+ // prefill so that we can refer to the map without a lock (as
+ // the number of instruments won't change)
+ m_recordInputs[id] = RecordInputDesc(1000, -1, 0.0);
+ }
+
+ // set callbacks
+ //
+ jack_set_process_callback(m_client, jackProcessStatic, this);
+ jack_set_buffer_size_callback(m_client, jackBufferSize, this);
+ jack_set_sample_rate_callback(m_client, jackSampleRate, this);
+ jack_on_shutdown(m_client, jackShutdown, this);
+ jack_set_xrun_callback(m_client, jackXRun, this);
+ jack_set_sync_callback(m_client, jackSyncCallback, this);
+
+ // get and report the sample rate and buffer size
+ //
+ m_sampleRate = jack_get_sample_rate(m_client);
+ m_bufferSize = jack_get_buffer_size(m_client);
+
+ audit << "JackDriver::initialiseAudio - JACK sample rate = "
+ << m_sampleRate << "Hz, buffer size = " << m_bufferSize
+ << std::endl;
+
+ PluginFactory::setSampleRate(m_sampleRate);
+
+ // Get the initial buffer size before we activate the client
+ //
+
+ if (!reinitialise) {
+
+ // create processing buffer(s)
+ //
+ m_tempOutBuffer = new sample_t[m_bufferSize];
+
+ audit << "JackDriver::initialiseAudio - "
+ << "creating disk thread" << std::endl;
+
+ m_fileReader = new AudioFileReader(m_alsaDriver, m_sampleRate);
+ m_fileWriter = new AudioFileWriter(m_alsaDriver, m_sampleRate);
+ m_instrumentMixer = new AudioInstrumentMixer
+ (m_alsaDriver, m_fileReader, m_sampleRate, m_bufferSize);
+ m_bussMixer = new AudioBussMixer
+ (m_alsaDriver, m_instrumentMixer, m_sampleRate, m_bufferSize);
+ m_instrumentMixer->setBussMixer(m_bussMixer);
+
+ // We run the file reader whatever, but we only run the other
+ // threads (instrument mixer, buss mixer, file writer) when we
+ // actually need them. (See updateAudioData and createRecordFile.)
+ m_fileReader->run();
+ }
+
+ // Create and connect the default numbers of ports. We always create
+ // one stereo pair each of master and monitor outs, and then we create
+ // record ins, fader outs and submaster outs according to the user's
+ // preferences. Since we don't know the user's preferences yet, we'll
+ // start by creating one pair of record ins and no fader or submaster
+ // outs.
+ //
+ m_outputMasters.clear();
+ m_outputMonitors.clear();
+ m_outputSubmasters.clear();
+ m_outputInstruments.clear();
+ m_inputPorts.clear();
+
+ if (!createMainOutputs()) { // one stereo pair master, one pair monitor
+ audit << "JackDriver::initialise - "
+ << "failed to create main outputs!" << std::endl;
+ return ;
+ }
+
+ if (!createRecordInputs(1)) {
+ audit << "JackDriver::initialise - "
+ << "failed to create record inputs!" << std::endl;
+ return ;
+ }
+
+ if (jack_activate(m_client)) {
+ audit << "JackDriver::initialise - "
+ << "client activation failed" << std::endl;
+ return ;
+ }
+
+ // Now set up the default connections.
+
+ std::string playback_1, playback_2;
+
+ const char **ports =
+ jack_get_ports(m_client, NULL, NULL,
+ JackPortIsPhysical | JackPortIsInput);
+
+ if (ports) {
+ if (ports[0])
+ playback_1 = std::string(ports[0]);
+ if (ports[1])
+ playback_2 = std::string(ports[1]);
+
+ // count ports
+ unsigned int i = 0;
+ for (i = 0; ports[i]; i++)
+ ;
+ audit << "JackDriver::initialiseAudio - "
+ << "found " << i << " JACK physical outputs"
+ << std::endl;
+ } else
+ audit << "JackDriver::initialiseAudio - "
+ << "no JACK physical outputs found"
+ << std::endl;
+ free(ports);
+
+ if (playback_1 != "") {
+ audit << "JackDriver::initialiseAudio - "
+ << "connecting from "
+ << "\"" << jack_port_name(m_outputMasters[0])
+ << "\" to \"" << playback_1.c_str() << "\""
+ << std::endl;
+
+ // connect our client up to the ALSA ports - first left output
+ //
+ if (jack_connect(m_client, jack_port_name(m_outputMasters[0]),
+ playback_1.c_str())) {
+ audit << "JackDriver::initialiseAudio - "
+ << "cannot connect to JACK output port" << std::endl;
+ return ;
+ }
+
+ /*
+ if (jack_connect(m_client, jack_port_name(m_outputMonitors[0]),
+ playback_1.c_str()))
+ {
+ audit << "JackDriver::initialiseAudio - "
+ << "cannot connect to JACK output port" << std::endl;
+ return;
+ }
+ */
+ }
+
+ if (playback_2 != "") {
+ audit << "JackDriver::initialiseAudio - "
+ << "connecting from "
+ << "\"" << jack_port_name(m_outputMasters[1])
+ << "\" to \"" << playback_2.c_str() << "\""
+ << std::endl;
+
+ if (jack_connect(m_client, jack_port_name(m_outputMasters[1]),
+ playback_2.c_str())) {
+ audit << "JackDriver::initialiseAudio - "
+ << "cannot connect to JACK output port" << std::endl;
+ }
+
+ /*
+ if (jack_connect(m_client, jack_port_name(m_outputMonitors[1]),
+ playback_2.c_str()))
+ {
+ audit << "JackDriver::initialiseAudio - "
+ << "cannot connect to JACK output port" << std::endl;
+ }
+ */
+ }
+
+
+ std::string capture_1, capture_2;
+
+ ports =
+ jack_get_ports(m_client, NULL, NULL,
+ JackPortIsPhysical | JackPortIsOutput);
+
+ if (ports) {
+ if (ports[0])
+ capture_1 = std::string(ports[0]);
+ if (ports[1])
+ capture_2 = std::string(ports[1]);
+
+ // count ports
+ unsigned int i = 0;
+ for (i = 0; ports[i]; i++)
+ ;
+ audit << "JackDriver::initialiseAudio - "
+ << "found " << i << " JACK physical inputs"
+ << std::endl;
+ } else
+ audit << "JackDriver::initialiseAudio - "
+ << "no JACK physical inputs found"
+ << std::endl;
+ free(ports);
+
+ if (capture_1 != "") {
+
+ audit << "JackDriver::initialiseAudio - "
+ << "connecting from "
+ << "\"" << capture_1.c_str()
+ << "\" to \"" << jack_port_name(m_inputPorts[0]) << "\""
+ << std::endl;
+
+ if (jack_connect(m_client, capture_1.c_str(),
+ jack_port_name(m_inputPorts[0]))) {
+ audit << "JackDriver::initialiseAudio - "
+ << "cannot connect to JACK input port" << std::endl;
+ }
+ }
+
+ if (capture_2 != "") {
+
+ audit << "JackDriver::initialiseAudio - "
+ << "connecting from "
+ << "\"" << capture_2.c_str()
+ << "\" to \"" << jack_port_name(m_inputPorts[1]) << "\""
+ << std::endl;
+
+ if (jack_connect(m_client, capture_2.c_str(),
+ jack_port_name(m_inputPorts[1]))) {
+ audit << "JackDriver::initialiseAudio - "
+ << "cannot connect to JACK input port" << std::endl;
+ }
+ }
+
+ audit << "JackDriver::initialiseAudio - "
+ << "initialised JACK audio subsystem"
+ << std::endl;
+
+ m_ok = true;
+}
+
+bool
+JackDriver::createMainOutputs()
+{
+ if (!m_client)
+ return false;
+
+ jack_port_t *port = jack_port_register
+ (m_client, "master out L",
+ JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, 0);
+ if (!port)
+ return false;
+ m_outputMasters.push_back(port);
+
+ port = jack_port_register
+ (m_client, "master out R",
+ JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, 0);
+ if (!port)
+ return false;
+ m_outputMasters.push_back(port);
+
+ port = jack_port_register
+ (m_client, "record monitor out L",
+ JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, 0);
+ if (!port)
+ return false;
+ m_outputMonitors.push_back(port);
+
+ port = jack_port_register
+ (m_client, "record monitor out R",
+ JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, 0);
+ if (!port)
+ return false;
+ m_outputMonitors.push_back(port);
+
+ return true;
+}
+
+bool
+JackDriver::createFaderOutputs(int audioPairs, int synthPairs)
+{
+ if (!m_client)
+ return false;
+
+ int pairs = audioPairs + synthPairs;
+ int pairsNow = m_outputInstruments.size() / 2;
+ if (pairs == pairsNow)
+ return true;
+
+ for (int i = pairsNow; i < pairs; ++i) {
+
+ char namebuffer[22];
+ jack_port_t *port;
+
+ if (i < audioPairs) {
+ snprintf(namebuffer, 21, "audio fader %d out L", i + 1);
+ } else {
+ snprintf(namebuffer, 21, "synth fader %d out L", i - audioPairs + 1);
+ }
+
+ port = jack_port_register(m_client,
+ namebuffer,
+ JACK_DEFAULT_AUDIO_TYPE,
+ JackPortIsOutput,
+ 0);
+ if (!port)
+ return false;
+ m_outputInstruments.push_back(port);
+
+ if (i < audioPairs) {
+ snprintf(namebuffer, 21, "audio fader %d out R", i + 1);
+ } else {
+ snprintf(namebuffer, 21, "synth fader %d out R", i - audioPairs + 1);
+ }
+
+ port = jack_port_register(m_client,
+ namebuffer,
+ JACK_DEFAULT_AUDIO_TYPE,
+ JackPortIsOutput,
+ 0);
+ if (!port)
+ return false;
+ m_outputInstruments.push_back(port);
+ }
+
+ while ((int)m_outputInstruments.size() > pairs * 2) {
+ std::vector<jack_port_t *>::iterator itr = m_outputInstruments.end();
+ --itr;
+ jack_port_unregister(m_client, *itr);
+ m_outputInstruments.erase(itr);
+ }
+
+ return true;
+}
+
+bool
+JackDriver::createSubmasterOutputs(int pairs)
+{
+ if (!m_client)
+ return false;
+
+ int pairsNow = m_outputSubmasters.size() / 2;
+ if (pairs == pairsNow)
+ return true;
+
+ for (int i = pairsNow; i < pairs; ++i) {
+
+ char namebuffer[22];
+ jack_port_t *port;
+
+ snprintf(namebuffer, 21, "submaster %d out L", i + 1);
+ port = jack_port_register(m_client,
+ namebuffer,
+ JACK_DEFAULT_AUDIO_TYPE,
+ JackPortIsOutput,
+ 0);
+ if (!port)
+ return false;
+ m_outputSubmasters.push_back(port);
+
+ snprintf(namebuffer, 21, "submaster %d out R", i + 1);
+ port = jack_port_register(m_client,
+ namebuffer,
+ JACK_DEFAULT_AUDIO_TYPE,
+ JackPortIsOutput,
+ 0);
+ if (!port)
+ return false;
+ m_outputSubmasters.push_back(port);
+ }
+
+ while ((int)m_outputSubmasters.size() > pairs * 2) {
+ std::vector<jack_port_t *>::iterator itr = m_outputSubmasters.end();
+ --itr;
+ jack_port_unregister(m_client, *itr);
+ m_outputSubmasters.erase(itr);
+ }
+
+ return true;
+}
+
+bool
+JackDriver::createRecordInputs(int pairs)
+{
+ if (!m_client)
+ return false;
+
+ int pairsNow = m_inputPorts.size() / 2;
+ if (pairs == pairsNow)
+ return true;
+
+ for (int i = pairsNow; i < pairs; ++i) {
+
+ char namebuffer[22];
+ jack_port_t *port;
+
+ snprintf(namebuffer, 21, "record in %d L", i + 1);
+ port = jack_port_register(m_client,
+ namebuffer,
+ JACK_DEFAULT_AUDIO_TYPE,
+ JackPortIsInput,
+ 0);
+ if (!port)
+ return false;
+ m_inputPorts.push_back(port);
+
+ snprintf(namebuffer, 21, "record in %d R", i + 1);
+ port = jack_port_register(m_client,
+ namebuffer,
+ JACK_DEFAULT_AUDIO_TYPE,
+ JackPortIsInput,
+ 0);
+ if (!port)
+ return false;
+ m_inputPorts.push_back(port);
+ }
+
+ while ((int)m_outputSubmasters.size() > pairs * 2) {
+ std::vector<jack_port_t *>::iterator itr = m_outputSubmasters.end();
+ --itr;
+ jack_port_unregister(m_client, *itr);
+ m_outputSubmasters.erase(itr);
+ }
+
+ return true;
+}
+
+
+void
+JackDriver::setAudioPorts(bool faderOuts, bool submasterOuts)
+{
+ if (!m_client)
+ return ;
+
+ Audit audit;
+#ifdef DEBUG_JACK_DRIVER
+
+ std::cerr << "JackDriver::setAudioPorts(" << faderOuts << "," << submasterOuts << ")" << std::endl;
+#endif
+
+ if (!m_client) {
+ std::cerr << "JackDriver::setAudioPorts(" << faderOuts << "," << submasterOuts << "): no client yet" << std::endl;
+ return ;
+ }
+
+ if (faderOuts) {
+ InstrumentId instrumentBase;
+ int audioInstruments;
+ int synthInstruments;
+ m_alsaDriver->getAudioInstrumentNumbers(instrumentBase, audioInstruments);
+ m_alsaDriver->getSoftSynthInstrumentNumbers(instrumentBase, synthInstruments);
+ if (!createFaderOutputs(audioInstruments, synthInstruments)) {
+ m_ok = false;
+ audit << "Failed to create fader outs!" << std::endl;
+ return ;
+ }
+ } else {
+ createFaderOutputs(0, 0);
+ }
+
+ if (submasterOuts) {
+
+ // one fewer than returned here, because the master has a buss object too
+ if (!createSubmasterOutputs
+ (m_alsaDriver->getMappedStudio()->getObjectCount
+ (MappedObject::AudioBuss) - 1)) {
+ m_ok = false;
+ audit << "Failed to create submaster outs!" << std::endl;
+ return ;
+ }
+
+ } else {
+ createSubmasterOutputs(0);
+ }
+}
+
+RealTime
+JackDriver::getAudioPlayLatency() const
+{
+ if (!m_client)
+ return RealTime::zeroTime;
+
+ jack_nframes_t latency =
+ jack_port_get_total_latency(m_client, m_outputMasters[0]);
+
+ return RealTime::frame2RealTime(latency, m_sampleRate);
+}
+
+RealTime
+JackDriver::getAudioRecordLatency() const
+{
+ if (!m_client)
+ return RealTime::zeroTime;
+
+ jack_nframes_t latency =
+ jack_port_get_total_latency(m_client, m_inputPorts[0]);
+
+ return RealTime::frame2RealTime(latency, m_sampleRate);
+}
+
+RealTime
+JackDriver::getInstrumentPlayLatency(InstrumentId id) const
+{
+ if (m_instrumentLatencies.find(id) == m_instrumentLatencies.end()) {
+ return RealTime::zeroTime;
+ } else {
+ return m_instrumentLatencies.find(id)->second;
+ }
+}
+
+RealTime
+JackDriver::getMaximumPlayLatency() const
+{
+ return m_maxInstrumentLatency;
+}
+
+int
+JackDriver::jackProcessStatic(jack_nframes_t nframes, void *arg)
+{
+ JackDriver *inst = static_cast<JackDriver*>(arg);
+ if (inst)
+ return inst->jackProcess(nframes);
+ else
+ return 0;
+}
+
+int
+JackDriver::jackProcess(jack_nframes_t nframes)
+{
+ if (!m_ok || !m_client) {
+#ifdef DEBUG_JACK_PROCESS
+ std::cerr << "JackDriver::jackProcess: not OK" << std::endl;
+#endif
+
+ return 0;
+ }
+
+ if (!m_bussMixer) {
+#ifdef DEBUG_JACK_PROCESS
+ std::cerr << "JackDriver::jackProcess: no buss mixer" << std::endl;
+#endif
+
+ return jackProcessEmpty(nframes);
+ }
+
+ if (m_alsaDriver->areClocksRunning()) {
+ m_alsaDriver->checkTimerSync(m_framesProcessed);
+ } else {
+ m_alsaDriver->checkTimerSync(0);
+ }
+
+ bool lowLatencyMode = m_alsaDriver->getLowLatencyMode();
+ bool clocksRunning = m_alsaDriver->areClocksRunning();
+ bool playing = m_alsaDriver->isPlaying();
+ bool asyncAudio = m_haveAsyncAudioEvent;
+
+#ifdef DEBUG_JACK_PROCESS
+
+ Profiler profiler("jackProcess", true);
+#else
+#ifdef DEBUG_JACK_XRUN
+
+ Profiler profiler("jackProcess", false);
+#endif
+#endif
+
+ if (lowLatencyMode) {
+ if (clocksRunning) {
+ if (playing || asyncAudio) {
+
+ if (m_instrumentMixer->tryLock() == 0) {
+ m_instrumentMixer->kick(false);
+ m_instrumentMixer->releaseLock();
+ //#ifdef DEBUG_JACK_PROCESS
+ } else {
+ std::cerr << "JackDriver::jackProcess: no instrument mixer lock available" << std::endl;
+ //#endif
+ }
+ if (m_bussMixer->getBussCount() > 0) {
+ if (m_bussMixer->tryLock() == 0) {
+ m_bussMixer->kick(false, false);
+ m_bussMixer->releaseLock();
+ //#ifdef DEBUG_JACK_PROCESS
+ } else {
+ std::cerr << "JackDriver::jackProcess: no buss mixer lock available" << std::endl;
+ //#endif
+ }
+ }
+ }
+ }
+ }
+
+ if (jack_cpu_load(m_client) > 97.0) {
+ reportFailure(MappedEvent::FailureCPUOverload);
+ return jackProcessEmpty(nframes);
+ }
+
+#ifdef DEBUG_JACK_PROCESS
+ Profiler profiler2("jackProcess post mix", true);
+#else
+#ifdef DEBUG_JACK_XRUN
+
+ Profiler profiler2("jackProcess post mix", false);
+#endif
+#endif
+
+ SequencerDataBlock *sdb = m_alsaDriver->getSequencerDataBlock();
+
+ jack_position_t position;
+ jack_transport_state_t state = JackTransportRolling;
+ bool doneRecord = false;
+
+ int ignoreCount = m_ignoreProcessTransportCount;
+ if (ignoreCount > 0)
+ --m_ignoreProcessTransportCount;
+
+ InstrumentId audioInstrumentBase;
+ int audioInstruments;
+ m_alsaDriver->getAudioInstrumentNumbers(audioInstrumentBase, audioInstruments);
+
+ if (m_jackTransportEnabled) {
+
+ state = jack_transport_query(m_client, &position);
+
+#ifdef DEBUG_JACK_PROCESS
+
+ std::cerr << "JackDriver::jackProcess: JACK transport state is " << state << std::endl;
+#endif
+
+ if (state == JackTransportStopped) {
+ if (playing && clocksRunning && !m_waiting) {
+ ExternalTransport *transport =
+ m_alsaDriver->getExternalTransportControl();
+ if (transport) {
+#ifdef DEBUG_JACK_TRANSPORT
+ std::cerr << "JackDriver::jackProcess: JACK transport stopped externally at " << position.frame << std::endl;
+#endif
+
+ m_waitingToken =
+ transport->transportJump
+ (ExternalTransport::TransportStopAtTime,
+ RealTime::frame2RealTime(position.frame,
+ position.frame_rate));
+ }
+ } else if (clocksRunning) {
+ if (!asyncAudio) {
+#ifdef DEBUG_JACK_PROCESS
+ std::cerr << "JackDriver::jackProcess: no interesting async events" << std::endl;
+#endif
+ // do this before record monitor, otherwise we lose monitor out
+ jackProcessEmpty(nframes);
+ }
+
+ // for monitoring:
+ int rv = 0;
+ for (InstrumentId id = audioInstrumentBase;
+ id < audioInstrumentBase + audioInstruments; ++id) {
+ int irv = jackProcessRecord(id, nframes, 0, 0, clocksRunning);
+ if (irv != 0)
+ rv = irv;
+ }
+ doneRecord = true;
+
+ if (!asyncAudio) {
+ return rv;
+ }
+
+ } else {
+ return jackProcessEmpty(nframes);
+ }
+ } else if (state == JackTransportStarting) {
+ return jackProcessEmpty(nframes);
+ } else if (state != JackTransportRolling) {
+ std::cerr << "JackDriver::jackProcess: unexpected JACK transport state " << state << std::endl;
+ }
+ }
+
+ if (state == JackTransportRolling) { // also covers not-on-transport case
+ if (m_waiting) {
+ if (ignoreCount > 0) {
+#ifdef DEBUG_JACK_TRANSPORT
+ std::cerr << "JackDriver::jackProcess: transport rolling, but we're ignoring it (count = " << ignoreCount << ")" << std::endl;
+#endif
+
+ } else {
+#ifdef DEBUG_JACK_TRANSPORT
+ std::cerr << "JackDriver::jackProcess: transport rolling, telling ALSA driver to go!" << std::endl;
+#endif
+
+ m_alsaDriver->startClocksApproved();
+ m_waiting = false;
+ }
+ }
+
+#ifdef DEBUG_JACK_PROCESS
+ std::cerr << "JackDriver::jackProcess (rolling or not on JACK transport)" << std::endl;
+#endif
+
+ if (!clocksRunning) {
+#ifdef DEBUG_JACK_PROCESS
+ std::cerr << "JackDriver::jackProcess: clocks stopped" << std::endl;
+#endif
+
+ return jackProcessEmpty(nframes);
+
+ } else if (!playing) {
+#ifdef DEBUG_JACK_PROCESS
+ std::cerr << "JackDriver::jackProcess: not playing" << std::endl;
+#endif
+
+ if (!asyncAudio) {
+#ifdef DEBUG_JACK_PROCESS
+ std::cerr << "JackDriver::jackProcess: no interesting async events" << std::endl;
+#endif
+ // do this before record monitor, otherwise we lose monitor out
+ jackProcessEmpty(nframes);
+ }
+
+ // for monitoring:
+ int rv = 0;
+ for (InstrumentId id = audioInstrumentBase;
+ id < audioInstrumentBase + audioInstruments; ++id) {
+ int irv = jackProcessRecord(id, nframes, 0, 0, clocksRunning);
+ if (irv != 0)
+ rv = irv;
+ }
+ doneRecord = true;
+
+ if (!asyncAudio) {
+ return rv;
+ }
+ }
+ }
+
+#ifdef DEBUG_JACK_PROCESS
+ Profiler profiler3("jackProcess post transport", true);
+#else
+#ifdef DEBUG_JACK_XRUN
+
+ Profiler profiler3("jackProcess post transport", false);
+#endif
+#endif
+
+ InstrumentId synthInstrumentBase;
+ int synthInstruments;
+ m_alsaDriver->getSoftSynthInstrumentNumbers(synthInstrumentBase, synthInstruments);
+
+ // We always have the master out
+
+ sample_t *master[2] = {
+ static_cast<sample_t *>
+ (jack_port_get_buffer(m_outputMasters[0], nframes)),
+ static_cast<sample_t *>
+ (jack_port_get_buffer(m_outputMasters[1], nframes))
+ };
+
+ memset(master[0], 0, nframes * sizeof(sample_t));
+ memset(master[1], 0, nframes * sizeof(sample_t));
+
+ // Reset monitor outs (if present) here prior to mixing
+
+ if (m_outputMonitors.size() > 0) {
+ sample_t *buffer = static_cast<sample_t *>
+ (jack_port_get_buffer(m_outputMonitors[0], nframes));
+ if (buffer)
+ memset(buffer, 0, nframes * sizeof(sample_t));
+ }
+
+ if (m_outputMonitors.size() > 1) {
+ sample_t *buffer = static_cast<sample_t *>
+ (jack_port_get_buffer(m_outputMonitors[1], nframes));
+ if (buffer)
+ memset(buffer, 0, nframes * sizeof(sample_t));
+ }
+
+ int bussCount = m_bussMixer->getBussCount();
+
+ // If we have any busses, then we just mix from them (but we still
+ // need to keep ourselves up to date by reading and monitoring the
+ // instruments). If we have no busses, mix direct from instruments.
+
+ for (int buss = 0; buss < bussCount; ++buss) {
+
+ sample_t *submaster[2] = { 0, 0 };
+ sample_t peak[2] = { 0.0, 0.0 };
+
+ if ((int)m_outputSubmasters.size() > buss * 2 + 1) {
+ submaster[0] = static_cast<sample_t *>
+ (jack_port_get_buffer(m_outputSubmasters[buss * 2], nframes));
+ submaster[1] = static_cast<sample_t *>
+ (jack_port_get_buffer(m_outputSubmasters[buss * 2 + 1], nframes));
+ }
+
+ if (!submaster[0])
+ submaster[0] = m_tempOutBuffer;
+ if (!submaster[1])
+ submaster[1] = m_tempOutBuffer;
+
+ for (int ch = 0; ch < 2; ++ch) {
+
+ RingBuffer<AudioBussMixer::sample_t> *rb =
+ m_bussMixer->getRingBuffer(buss, ch);
+
+ if (!rb || m_bussMixer->isBussDormant(buss)) {
+ if (rb)
+ rb->skip(nframes);
+ if (submaster[ch])
+ memset(submaster[ch], 0, nframes * sizeof(sample_t));
+ } else {
+ size_t actual = rb->read(submaster[ch], nframes);
+ if (actual < nframes) {
+ reportFailure(MappedEvent::FailureBussMixUnderrun);
+ }
+ for (size_t i = 0; i < nframes; ++i) {
+ sample_t sample = submaster[ch][i];
+ if (sample > peak[ch])
+ peak[ch] = sample;
+ master[ch][i] += sample;
+ }
+ }
+ }
+
+ if (sdb) {
+ LevelInfo info;
+ info.level = AudioLevel::multiplier_to_fader
+ (peak[0], 127, AudioLevel::LongFader);
+ info.levelRight = AudioLevel::multiplier_to_fader
+ (peak[1], 127, AudioLevel::LongFader);
+
+ sdb->setSubmasterLevel(buss, info);
+ }
+
+ for (InstrumentId id = audioInstrumentBase;
+ id < audioInstrumentBase + audioInstruments; ++id) {
+ if (buss + 1 == m_recordInputs[id].input) {
+ jackProcessRecord(id, nframes, submaster[0], submaster[1], clocksRunning);
+ }
+ }
+ }
+
+#ifdef DEBUG_JACK_PROCESS
+ std::cerr << "JackDriver::jackProcess: have " << audioInstruments << " audio and " << synthInstruments << " synth instruments and " << bussCount << " busses" << std::endl;
+#endif
+
+ bool allInstrumentsDormant = true;
+ static RealTime dormantTime = RealTime::zeroTime;
+
+ for (int i = 0; i < audioInstruments + synthInstruments; ++i) {
+
+ InstrumentId id;
+ if (i < audioInstruments)
+ id = audioInstrumentBase + i;
+ else
+ id = synthInstrumentBase + (i - audioInstruments);
+
+ if (m_instrumentMixer->isInstrumentEmpty(id))
+ continue;
+
+ sample_t *instrument[2] = { 0, 0 };
+ sample_t peak[2] = { 0.0, 0.0 };
+
+ if (int(m_outputInstruments.size()) > i * 2 + 1) {
+ instrument[0] = static_cast<sample_t *>
+ (jack_port_get_buffer(m_outputInstruments[i * 2], nframes));
+ instrument[1] = static_cast<sample_t *>
+ (jack_port_get_buffer(m_outputInstruments[i * 2 + 1], nframes));
+ }
+
+ if (!instrument[0])
+ instrument[0] = m_tempOutBuffer;
+ if (!instrument[1])
+ instrument[1] = m_tempOutBuffer;
+
+ for (int ch = 0; ch < 2; ++ch) {
+
+ // We always need to read from an instrument's ring buffer
+ // to keep the instrument moving along, as well as for
+ // monitoring. If the instrument is connected straight to
+ // the master, then we also need to mix from it. (We have
+ // that information cached courtesy of updateAudioData.)
+
+ bool directToMaster = false;
+ if (i < audioInstruments) {
+ directToMaster = (m_directMasterAudioInstruments & (1 << i));
+ } else {
+ directToMaster = (m_directMasterSynthInstruments &
+ (1 << (i - audioInstruments)));
+ }
+
+#ifdef DEBUG_JACK_PROCESS
+ if (id == 1000 || id == 10000) {
+ std::cerr << "JackDriver::jackProcess: instrument id " << id << ", base " << audioInstrumentBase << ", direct masters " << m_directMasterAudioInstruments << ": " << directToMaster << std::endl;
+ }
+#endif
+
+ RingBuffer<AudioInstrumentMixer::sample_t, 2> *rb =
+ m_instrumentMixer->getRingBuffer(id, ch);
+
+ if (!rb || m_instrumentMixer->isInstrumentDormant(id)) {
+#ifdef DEBUG_JACK_PROCESS
+ if (id == 1000 || id == 10000) {
+ if (rb) {
+ std::cerr << "JackDriver::jackProcess: instrument " << id << " dormant" << std::endl;
+ } else {
+ std::cerr << "JackDriver::jackProcess: instrument " << id << " has no ring buffer for channel " << ch << std::endl;
+ }
+ }
+#endif
+ if (rb)
+ rb->skip(nframes);
+ if (instrument[ch])
+ memset(instrument[ch], 0, nframes * sizeof(sample_t));
+
+ } else {
+
+ allInstrumentsDormant = false;
+
+ size_t actual = rb->read(instrument[ch], nframes);
+
+#ifdef DEBUG_JACK_PROCESS
+
+ if (id == 1000) {
+ std::cerr << "JackDriver::jackProcess: read " << actual << " of " << nframes << " frames for instrument " << id << " channel " << ch << std::endl;
+ }
+#endif
+
+ if (actual < nframes) {
+
+ std::cerr << "JackDriver::jackProcess: read " << actual << " of " << nframes << " frames for " << id << " ch " << ch << " (pl " << playing << ", cl " << clocksRunning << ", aa " << asyncAudio << ")" << std::endl;
+
+ reportFailure(MappedEvent::FailureMixUnderrun);
+ }
+ for (size_t f = 0; f < nframes; ++f) {
+ sample_t sample = instrument[ch][f];
+ if (sample > peak[ch])
+ peak[ch] = sample;
+ if (directToMaster)
+ master[ch][f] += sample;
+ }
+ }
+
+ // If the instrument is connected straight to master we
+ // also need to skip() on the buss mixer's reader for it,
+ // otherwise it'll block because the buss mixer isn't
+ // needing to read it.
+
+ if (rb && directToMaster) {
+ rb->skip(nframes, 1); // 1 is the buss mixer's reader (magic)
+ }
+ }
+
+ if (sdb) {
+ LevelInfo info;
+ info.level = AudioLevel::multiplier_to_fader
+ (peak[0], 127, AudioLevel::LongFader);
+ info.levelRight = AudioLevel::multiplier_to_fader
+ (peak[1], 127, AudioLevel::LongFader);
+
+ sdb->setInstrumentLevel(id, info);
+ }
+ }
+
+ if (asyncAudio) {
+ if (!allInstrumentsDormant) {
+ dormantTime = RealTime::zeroTime;
+ } else {
+ dormantTime = dormantTime +
+ RealTime::frame2RealTime(m_bufferSize, m_sampleRate);
+ if (dormantTime > RealTime(10, 0)) {
+ std::cerr << "JackDriver: dormantTime = " << dormantTime << ", resetting m_haveAsyncAudioEvent" << std::endl;
+ m_haveAsyncAudioEvent = false;
+ }
+ }
+ }
+
+ // Get master fader levels. There's no pan on the master.
+ float gain = AudioLevel::dB_to_multiplier(m_masterLevel);
+ float masterPeak[2] = { 0.0, 0.0 };
+
+ for (int ch = 0; ch < 2; ++ch) {
+ for (size_t i = 0; i < nframes; ++i) {
+ sample_t sample = master[ch][i] * gain;
+ if (sample > masterPeak[ch])
+ masterPeak[ch] = sample;
+ master[ch][i] = sample;
+ }
+ }
+
+ if (sdb) {
+ LevelInfo info;
+ info.level = AudioLevel::multiplier_to_fader
+ (masterPeak[0], 127, AudioLevel::LongFader);
+ info.levelRight = AudioLevel::multiplier_to_fader
+ (masterPeak[1], 127, AudioLevel::LongFader);
+
+ sdb->setMasterLevel(info);
+ }
+
+ for (InstrumentId id = audioInstrumentBase;
+ id < audioInstrumentBase + audioInstruments; ++id) {
+ if (m_recordInputs[id].input == 0) {
+ jackProcessRecord(id, nframes, master[0], master[1], clocksRunning);
+ } else if (m_recordInputs[id].input < 1000) { // buss, already done
+ // nothing
+ } else if (!doneRecord) {
+ jackProcessRecord(id, nframes, 0, 0, clocksRunning);
+ }
+ }
+
+ if (playing) {
+ if (!lowLatencyMode) {
+ if (m_bussMixer->getBussCount() == 0) {
+ m_instrumentMixer->signal();
+ } else {
+ m_bussMixer->signal();
+ }
+ }
+ }
+
+ m_framesProcessed += nframes;
+
+#if (defined(DEBUG_JACK_DRIVER) || defined(DEBUG_JACK_PROCESS) || defined(DEBUG_JACK_TRANSPORT))
+
+ framesThisPlay += nframes; //!!!
+#endif
+#ifdef DEBUG_JACK_PROCESS
+
+ std::cerr << "JackDriver::jackProcess: " << nframes << " frames, " << framesThisPlay << " this play, " << m_framesProcessed << " total" << std::endl;
+#endif
+
+ return 0;
+}
+
+int
+JackDriver::jackProcessEmpty(jack_nframes_t nframes)
+{
+ sample_t *buffer;
+
+#ifdef DEBUG_JACK_PROCESS
+
+ std::cerr << "JackDriver::jackProcessEmpty" << std::endl;
+#endif
+
+ buffer = static_cast<sample_t *>
+ (jack_port_get_buffer(m_outputMasters[0], nframes));
+ if (buffer)
+ memset(buffer, 0, nframes * sizeof(sample_t));
+
+ buffer = static_cast<sample_t *>
+ (jack_port_get_buffer(m_outputMasters[1], nframes));
+ if (buffer)
+ memset(buffer, 0, nframes * sizeof(sample_t));
+
+ buffer = static_cast<sample_t *>
+ (jack_port_get_buffer(m_outputMonitors[0], nframes));
+ if (buffer)
+ memset(buffer, 0, nframes * sizeof(sample_t));
+
+ buffer = static_cast<sample_t *>
+ (jack_port_get_buffer(m_outputMonitors[1], nframes));
+ if (buffer)
+ memset(buffer, 0, nframes * sizeof(sample_t));
+
+ for (unsigned int i = 0; i < m_outputSubmasters.size(); ++i) {
+ buffer = static_cast<sample_t *>
+ (jack_port_get_buffer(m_outputSubmasters[i], nframes));
+ if (buffer)
+ memset(buffer, 0, nframes * sizeof(sample_t));
+ }
+
+ for (unsigned int i = 0; i < m_outputInstruments.size(); ++i) {
+ buffer = static_cast<sample_t *>
+ (jack_port_get_buffer(m_outputInstruments[i], nframes));
+ if (buffer)
+ memset(buffer, 0, nframes * sizeof(sample_t));
+ }
+
+ m_framesProcessed += nframes;
+
+#if (defined(DEBUG_JACK_DRIVER) || defined(DEBUG_JACK_PROCESS) || defined(DEBUG_JACK_TRANSPORT))
+
+ framesThisPlay += nframes;
+#endif
+#ifdef DEBUG_JACK_PROCESS
+
+ std::cerr << "JackDriver::jackProcess: " << nframes << " frames, " << framesThisPlay << " this play, " << m_framesProcessed << " total" << std::endl;
+#endif
+
+ return 0;
+}
+
+int
+JackDriver::jackProcessRecord(InstrumentId id,
+ jack_nframes_t nframes,
+ sample_t *sourceBufferLeft,
+ sample_t *sourceBufferRight,
+ bool clocksRunning)
+{
+#ifdef DEBUG_JACK_PROCESS
+ Profiler profiler("jackProcessRecord", true);
+#else
+#ifdef DEBUG_JACK_XRUN
+
+ Profiler profiler("jackProcessRecord", false);
+#endif
+#endif
+
+ SequencerDataBlock *sdb = m_alsaDriver->getSequencerDataBlock();
+ bool wroteSomething = false;
+ sample_t peakLeft = 0.0, peakRight = 0.0;
+
+#ifdef DEBUG_JACK_PROCESS
+
+ std::cerr << "JackDriver::jackProcessRecord(" << id << "): clocksRunning " << clocksRunning << std::endl;
+#endif
+
+ // Get input buffers
+ //
+ sample_t *inputBufferLeft = 0, *inputBufferRight = 0;
+
+ int recInput = m_recordInputs[id].input;
+
+ int channel = m_recordInputs[id].channel;
+ int channels = (channel == -1 ? 2 : 1);
+ if (channels == 2)
+ channel = 0;
+
+ float level = m_recordInputs[id].level;
+
+ if (sourceBufferLeft) {
+
+#ifdef DEBUG_JACK_PROCESS
+ std::cerr << "JackDriver::jackProcessRecord(" << id << "): buss input provided" << std::endl;
+#endif
+
+ inputBufferLeft = sourceBufferLeft;
+ if (sourceBufferRight)
+ inputBufferRight = sourceBufferRight;
+
+ } else if (recInput < 1000) {
+
+#ifdef DEBUG_JACK_PROCESS
+ std::cerr << "JackDriver::jackProcessRecord(" << id << "): no known input" << std::endl;
+#endif
+
+ return 0;
+
+ } else {
+
+#ifdef DEBUG_JACK_PROCESS
+ std::cerr << "JackDriver::jackProcessRecord(" << id << "): record input " << recInput << std::endl;
+#endif
+
+ int input = recInput - 1000;
+
+ int port = input * channels + channel;
+ int portRight = input * channels + 1;
+
+ if (port < int(m_inputPorts.size())) {
+ inputBufferLeft = static_cast<sample_t*>
+ (jack_port_get_buffer(m_inputPorts[port], nframes));
+ }
+
+ if (channels == 2 && portRight < int(m_inputPorts.size())) {
+ inputBufferRight = static_cast<sample_t*>
+ (jack_port_get_buffer(m_inputPorts[portRight], nframes));
+ }
+ }
+
+ float gain = AudioLevel::dB_to_multiplier(level);
+
+ if (m_alsaDriver->getRecordStatus() == RECORD_ON &&
+ clocksRunning &&
+ m_fileWriter->haveRecordFileOpen(id)) {
+
+#ifdef DEBUG_JACK_PROCESS
+ std::cerr << "JackDriver::jackProcessRecord(" << id << "): recording" << std::endl;
+#endif
+
+ memset(m_tempOutBuffer, 0, nframes * sizeof(sample_t));
+
+ if (inputBufferLeft) {
+ for (size_t i = 0; i < nframes; ++i) {
+ sample_t sample = inputBufferLeft[i] * gain;
+ if (sample > peakLeft)
+ peakLeft = sample;
+ m_tempOutBuffer[i] = sample;
+ }
+
+ if (m_outputMonitors.size() > 0) {
+ sample_t *buf =
+ static_cast<sample_t *>
+ (jack_port_get_buffer(m_outputMonitors[0], nframes));
+ if (buf) {
+ for (size_t i = 0; i < nframes; ++i) {
+ buf[i] += m_tempOutBuffer[i];
+ }
+ }
+ }
+
+ m_fileWriter->write(id, m_tempOutBuffer, 0, nframes);
+ }
+
+ if (channels == 2) {
+
+ if (inputBufferRight) {
+ for (size_t i = 0; i < nframes; ++i) {
+ sample_t sample = inputBufferRight[i] * gain;
+ if (sample > peakRight)
+ peakRight = sample;
+ m_tempOutBuffer[i] = sample;
+ }
+ if (m_outputMonitors.size() > 1) {
+ sample_t *buf =
+ static_cast<sample_t *>
+ (jack_port_get_buffer(m_outputMonitors[1], nframes));
+ if (buf) {
+ for (size_t i = 0; i < nframes; ++i) {
+ buf[i] += m_tempOutBuffer[i];
+ }
+ }
+ }
+ }
+
+ m_fileWriter->write(id, m_tempOutBuffer, 1, nframes);
+ }
+
+ wroteSomething = true;
+
+ } else {
+
+ // want peak levels and monitors anyway, even if not recording
+
+#ifdef DEBUG_JACK_PROCESS
+ std::cerr << "JackDriver::jackProcessRecord(" << id << "): monitoring only" << std::endl;
+#endif
+
+ if (inputBufferLeft) {
+
+ sample_t *buf = 0;
+ if (m_outputMonitors.size() > 0) {
+ buf = static_cast<sample_t *>
+ (jack_port_get_buffer(m_outputMonitors[0], nframes));
+ }
+
+ for (size_t i = 0; i < nframes; ++i) {
+ sample_t sample = inputBufferLeft[i] * gain;
+ if (sample > peakLeft)
+ peakLeft = sample;
+ if (buf)
+ buf[i] = sample;
+ }
+
+ if (channels == 2 && inputBufferRight) {
+
+ buf = 0;
+ if (m_outputMonitors.size() > 1) {
+ buf = static_cast<sample_t *>
+ (jack_port_get_buffer(m_outputMonitors[1], nframes));
+ }
+
+ for (size_t i = 0; i < nframes; ++i) {
+ sample_t sample = inputBufferRight[i] * gain;
+ if (sample > peakRight)
+ peakRight = sample;
+ if (buf)
+ buf[i] = sample;
+ }
+ }
+ }
+ }
+
+ if (channels < 2)
+ peakRight = peakLeft;
+
+ if (sdb) {
+ LevelInfo info;
+ info.level = AudioLevel::multiplier_to_fader
+ (peakLeft, 127, AudioLevel::LongFader);
+ info.levelRight = AudioLevel::multiplier_to_fader
+ (peakRight, 127, AudioLevel::LongFader);
+ sdb->setInstrumentRecordLevel(id, info);
+ }
+
+ if (wroteSomething) {
+ m_fileWriter->signal();
+ }
+
+ return 0;
+}
+
+
+int
+JackDriver::jackSyncCallback(jack_transport_state_t state,
+ jack_position_t *position,
+ void *arg)
+{
+ JackDriver *inst = (JackDriver *)arg;
+ if (!inst)
+ return true; // or rather, return "huh?"
+
+ inst->m_alsaDriver->checkTimerSync(0); // reset, as not processing
+
+ if (!inst->m_jackTransportEnabled)
+ return true; // ignore
+
+ ExternalTransport *transport =
+ inst->m_alsaDriver->getExternalTransportControl();
+ if (!transport)
+ return true;
+
+#ifdef DEBUG_JACK_TRANSPORT
+
+ std::cerr << "JackDriver::jackSyncCallback: state " << state << " [" << (state == 0 ? "stopped" : state == 1 ? "rolling" : state == 2 ? "looping" : state == 3 ? "starting" : "unknown") << "], frame " << position->frame << ", waiting " << inst->m_waiting << ", playing " << inst->m_alsaDriver->isPlaying() << std::endl;
+
+ std::cerr << "JackDriver::jackSyncCallback: m_waitingState " << inst->m_waitingState << ", unique_1 " << position->unique_1 << ", unique_2 " << position->unique_2 << std::endl;
+
+ std::cerr << "JackDriver::jackSyncCallback: rate " << position->frame_rate << ", bar " << position->bar << ", beat " << position->beat << ", tick " << position->tick << ", bpm " << position->beats_per_minute << std::endl;
+
+#endif
+
+ ExternalTransport::TransportRequest request =
+ ExternalTransport::TransportNoChange;
+
+ if (inst->m_alsaDriver->isPlaying()) {
+
+ if (state == JackTransportStarting) {
+ request = ExternalTransport::TransportJumpToTime;
+ } else if (state == JackTransportStopped) {
+ request = ExternalTransport::TransportStop;
+ }
+
+ } else {
+
+ if (state == JackTransportStarting) {
+ request = ExternalTransport::TransportStartAtTime;
+ } else if (state == JackTransportStopped) {
+ request = ExternalTransport::TransportNoChange;
+ }
+ }
+
+ if (!inst->m_waiting || inst->m_waitingState != state) {
+
+ if (request == ExternalTransport::TransportJumpToTime ||
+ request == ExternalTransport::TransportStartAtTime) {
+
+ RealTime rt = RealTime::frame2RealTime(position->frame,
+ position->frame_rate);
+
+#ifdef DEBUG_JACK_TRANSPORT
+
+ std::cerr << "JackDriver::jackSyncCallback: Requesting jump to " << rt << std::endl;
+#endif
+
+ inst->m_waitingToken = transport->transportJump(request, rt);
+
+#ifdef DEBUG_JACK_TRANSPORT
+
+ std::cerr << "JackDriver::jackSyncCallback: My token is " << inst->m_waitingToken << std::endl;
+#endif
+
+ } else if (request == ExternalTransport::TransportStop) {
+
+#ifdef DEBUG_JACK_TRANSPORT
+ std::cerr << "JackDriver::jackSyncCallback: Requesting state change to " << request << std::endl;
+#endif
+
+ inst->m_waitingToken = transport->transportChange(request);
+
+#ifdef DEBUG_JACK_TRANSPORT
+
+ std::cerr << "JackDriver::jackSyncCallback: My token is " << inst->m_waitingToken << std::endl;
+#endif
+
+ } else if (request == ExternalTransport::TransportNoChange) {
+
+#ifdef DEBUG_JACK_TRANSPORT
+ std::cerr << "JackDriver::jackSyncCallback: Requesting no state change!" << std::endl;
+#endif
+
+ inst->m_waitingToken = transport->transportChange(request);
+
+#ifdef DEBUG_JACK_TRANSPORT
+
+ std::cerr << "JackDriver::jackSyncCallback: My token is " << inst->m_waitingToken << std::endl;
+#endif
+
+ }
+
+ inst->m_waiting = true;
+ inst->m_waitingState = state;
+
+#ifdef DEBUG_JACK_TRANSPORT
+
+ std::cerr << "JackDriver::jackSyncCallback: Setting waiting to " << inst->m_waiting << " and waiting state to " << inst->m_waitingState << " (request was " << request << ")" << std::endl;
+#endif
+
+ return 0;
+
+ } else {
+
+ if (transport->isTransportSyncComplete(inst->m_waitingToken)) {
+#ifdef DEBUG_JACK_TRANSPORT
+ std::cerr << "JackDriver::jackSyncCallback: Sync complete" << std::endl;
+#endif
+
+ return 1;
+ } else {
+#ifdef DEBUG_JACK_TRANSPORT
+ std::cerr << "JackDriver::jackSyncCallback: Sync not complete" << std::endl;
+#endif
+
+ return 0;
+ }
+ }
+}
+
+bool
+JackDriver::relocateTransportInternal(bool alsoStart)
+{
+ if (!m_client)
+ return true;
+
+#ifdef DEBUG_JACK_TRANSPORT
+
+ const char *fn = (alsoStart ?
+ "JackDriver::startTransport" :
+ "JackDriver::relocateTransport");
+#endif
+
+#ifdef DEBUG_JACK_TRANSPORT
+
+ std::cerr << fn << std::endl;
+#else
+#ifdef DEBUG_JACK_DRIVER
+
+ std::cerr << "JackDriver::relocateTransportInternal" << std::endl;
+#endif
+#endif
+
+ // m_waiting is true if we are waiting for the JACK transport
+ // to finish a change of state.
+
+ if (m_jackTransportEnabled) {
+
+ // If on the transport, we never return true here -- instead
+ // the JACK process calls startClocksApproved() to signal to
+ // the ALSA driver that it's time to go. But we do use this
+ // to manage our JACK transport state requests.
+
+ // Where did this request come from? Are we just responding
+ // to an external sync?
+
+ ExternalTransport *transport =
+ m_alsaDriver->getExternalTransportControl();
+
+ if (transport) {
+ if (transport->isTransportSyncComplete(m_waitingToken)) {
+
+ // Nope, this came from Rosegarden
+
+#ifdef DEBUG_JACK_TRANSPORT
+ std::cerr << fn << ": asking JACK transport to start, setting wait state" << std::endl;
+#endif
+
+ m_waiting = true;
+ m_waitingState = JackTransportStarting;
+
+ long frame = RealTime::realTime2Frame
+ (m_alsaDriver->getSequencerTime(), m_sampleRate);
+
+ if (frame < 0) {
+ // JACK Transport doesn't support preroll and
+ // can't set transport position to before zero
+ // (frame count is unsigned), so there's no very
+ // satisfactory fix for what to do for count-in
+ // bars. Let's just start at zero instead.
+ jack_transport_locate(m_client, 0);
+ } else {
+ jack_transport_locate(m_client, frame);
+ }
+
+ if (alsoStart) {
+ jack_transport_start(m_client);
+ m_ignoreProcessTransportCount = 1;
+ } else {
+ m_ignoreProcessTransportCount = 2;
+ }
+ } else {
+#ifdef DEBUG_JACK_TRANSPORT
+ std::cerr << fn << ": waiting already" << std::endl;
+#endif
+
+ }
+ }
+ return false;
+ }
+
+#if (defined(DEBUG_JACK_DRIVER) || defined(DEBUG_JACK_PROCESS) || defined(DEBUG_JACK_TRANSPORT))
+ framesThisPlay = 0; //!!!
+ struct timeval tv;
+ (void)gettimeofday(&tv, 0);
+ startTime = RealTime(tv.tv_sec, tv.tv_usec * 1000); //!!!
+#endif
+#ifdef DEBUG_JACK_TRANSPORT
+
+ std::cerr << fn << ": not on JACK transport, accepting right away" << std::endl;
+#endif
+
+ return true;
+}
+
+bool
+JackDriver::startTransport()
+{
+ return relocateTransportInternal(true);
+}
+
+bool
+JackDriver::relocateTransport()
+{
+
+ return relocateTransportInternal(false);
+}
+
+void
+JackDriver::stopTransport()
+{
+ if (!m_client)
+ return ;
+
+ std::cerr << "JackDriver::stopTransport: resetting m_haveAsyncAudioEvent" << std::endl;
+ m_haveAsyncAudioEvent = false;
+
+#ifdef DEBUG_JACK_TRANSPORT
+
+ struct timeval tv;
+ (void)gettimeofday(&tv, 0);
+ RealTime endTime = RealTime(tv.tv_sec, tv.tv_usec * 1000); //!!!
+ std::cerr << "\nJackDriver::stop: frames this play: " << framesThisPlay << ", elapsed " << (endTime - startTime) << std::endl;
+#endif
+
+ if (m_jackTransportEnabled) {
+
+ // Where did this request come from? Is this a result of our
+ // sync to a transport that has in fact already stopped?
+
+ ExternalTransport *transport =
+ m_alsaDriver->getExternalTransportControl();
+
+ if (transport) {
+ if (transport->isTransportSyncComplete(m_waitingToken)) {
+
+ // No, we have no outstanding external requests; this
+ // must have genuinely been requested from within
+ // Rosegarden, so:
+
+#ifdef DEBUG_JACK_TRANSPORT
+ std::cerr << "JackDriver::stop: internal request, asking JACK transport to stop" << std::endl;
+#endif
+
+ jack_transport_stop(m_client);
+
+ } else {
+ // Nothing to do
+
+#ifdef DEBUG_JACK_TRANSPORT
+ std::cerr << "JackDriver::stop: external request, JACK transport is already stopped" << std::endl;
+#endif
+
+ }
+ }
+ }
+
+ if (m_instrumentMixer)
+ m_instrumentMixer->resetAllPlugins(true); // discard events too
+}
+
+
+// Pick up any change of buffer size
+//
+int
+JackDriver::jackBufferSize(jack_nframes_t nframes, void *arg)
+{
+ JackDriver *inst = static_cast<JackDriver*>(arg);
+
+#ifdef DEBUG_JACK_DRIVER
+
+ std::cerr << "JackDriver::jackBufferSize - buffer size changed to "
+ << nframes << std::endl;
+#endif
+
+ inst->m_bufferSize = nframes;
+
+ // Recreate our temporary mix buffers to the new size
+ //
+ //!!! need buffer size change callbacks on plugins (so long as they
+ // have internal buffers) and the mix manager, with locks acquired
+ // appropriately
+
+ delete [] inst->m_tempOutBuffer;
+ inst->m_tempOutBuffer = new sample_t[inst->m_bufferSize];
+
+ return 0;
+}
+
+// Sample rate change
+//
+int
+JackDriver::jackSampleRate(jack_nframes_t nframes, void *arg)
+{
+ JackDriver *inst = static_cast<JackDriver*>(arg);
+
+#ifdef DEBUG_JACK_DRIVER
+
+ std::cerr << "JackDriver::jackSampleRate - sample rate changed to "
+ << nframes << std::endl;
+#endif
+
+ inst->m_sampleRate = nframes;
+
+ return 0;
+}
+
+void
+JackDriver::jackShutdown(void *arg)
+{
+#ifdef DEBUG_JACK_DRIVER
+ std::cerr << "JackDriver::jackShutdown() - callback received - "
+ << "informing GUI" << std::endl;
+#endif
+
+#ifdef DEBUG_JACK_XRUN
+
+ std::cerr << "JackDriver::jackShutdown" << std::endl;
+ Profiles::getInstance()->dump();
+#endif
+
+ JackDriver *inst = static_cast<JackDriver*>(arg);
+ inst->m_ok = false;
+ inst->m_kickedOutAt = time(0);
+ inst->reportFailure(MappedEvent::FailureJackDied);
+}
+
+int
+JackDriver::jackXRun(void *arg)
+{
+#ifdef DEBUG_JACK_DRIVER
+ std::cerr << "JackDriver::jackXRun" << std::endl;
+#endif
+
+#ifdef DEBUG_JACK_XRUN
+
+ std::cerr << "JackDriver::jackXRun" << std::endl;
+ Profiles::getInstance()->dump();
+#endif
+
+ // Report to GUI
+ //
+ JackDriver *inst = static_cast<JackDriver*>(arg);
+ inst->reportFailure(MappedEvent::FailureXRuns);
+
+ return 0;
+}
+
+
+void
+
+JackDriver::restoreIfRestorable()
+{
+ if (m_kickedOutAt == 0)
+ return ;
+
+ if (m_client) {
+ jack_client_close(m_client);
+ std::cerr << "closed client" << std::endl;
+ m_client = 0;
+ }
+
+ time_t now = time(0);
+
+ if (now < m_kickedOutAt || now >= m_kickedOutAt + 3) {
+
+ if (m_instrumentMixer)
+ m_instrumentMixer->resetAllPlugins(true);
+ std::cerr << "reset plugins" << std::endl;
+
+ initialise(true);
+
+ if (m_ok) {
+ reportFailure(MappedEvent::FailureJackRestart);
+ } else {
+ reportFailure(MappedEvent::FailureJackRestartFailed);
+ }
+
+ m_kickedOutAt = 0;
+ }
+}
+
+void
+JackDriver::prepareAudio()
+{
+ if (!m_instrumentMixer)
+ return ;
+
+ // This is used when restarting clocks after repositioning, but
+ // when not actually playing (yet). We need to do things like
+ // regenerating the processing buffers here. prebufferAudio()
+ // also does all of this, but rather more besides.
+
+ m_instrumentMixer->allocateBuffers();
+ m_instrumentMixer->resetAllPlugins(false);
+}
+
+void
+JackDriver::prebufferAudio()
+{
+ if (!m_instrumentMixer)
+ return ;
+
+ // We want this to happen when repositioning during playback, and
+ // stopTransport no longer happens then, so we call it from here.
+ // NB. Don't want to discard events here as this is called after
+ // pushing events to the soft synth queues at startup
+ m_instrumentMixer->resetAllPlugins(false);
+
+#ifdef DEBUG_JACK_DRIVER
+
+ std::cerr << "JackDriver::prebufferAudio: sequencer time is "
+ << m_alsaDriver->getSequencerTime() << std::endl;
+#endif
+
+ RealTime sliceStart = getNextSliceStart(m_alsaDriver->getSequencerTime());
+
+ m_fileReader->fillBuffers(sliceStart);
+
+ if (m_bussMixer->getBussCount() > 0) {
+ m_bussMixer->fillBuffers(sliceStart); // also calls on m_instrumentMixer
+ } else {
+ m_instrumentMixer->fillBuffers(sliceStart);
+ }
+}
+
+void
+JackDriver::kickAudio()
+{
+#ifdef DEBUG_JACK_PROCESS
+ std::cerr << "JackDriver::kickAudio" << std::endl;
+#endif
+
+ if (m_fileReader)
+ m_fileReader->kick();
+ if (m_instrumentMixer)
+ m_instrumentMixer->kick();
+ if (m_bussMixer)
+ m_bussMixer->kick();
+ if (m_fileWriter)
+ m_fileWriter->kick();
+}
+
+void
+JackDriver::updateAudioData()
+{
+ if (!m_ok || !m_client)
+ return ;
+
+#ifdef DEBUG_JACK_DRIVER
+ // std::cerr << "JackDriver::updateAudioData starting" << std::endl;
+#endif
+
+ MappedAudioBuss *mbuss =
+ m_alsaDriver->getMappedStudio()->getAudioBuss(0);
+
+ if (mbuss) {
+ float level = 0.0;
+ (void)mbuss->getProperty(MappedAudioBuss::Level, level);
+ m_masterLevel = level;
+ }
+
+ unsigned long directMasterAudioInstruments = 0L;
+ unsigned long directMasterSynthInstruments = 0L;
+
+ InstrumentId audioInstrumentBase;
+ int audioInstruments;
+ m_alsaDriver->getAudioInstrumentNumbers(audioInstrumentBase, audioInstruments);
+
+ InstrumentId synthInstrumentBase;
+ int synthInstruments;
+ m_alsaDriver->getSoftSynthInstrumentNumbers(synthInstrumentBase, synthInstruments);
+
+ RealTime jackLatency = getAudioPlayLatency();
+ RealTime maxLatency = RealTime::zeroTime;
+
+ for (int i = 0; i < audioInstruments + synthInstruments; ++i) {
+
+ InstrumentId id;
+ if (i < audioInstruments)
+ id = audioInstrumentBase + i;
+ else
+ id = synthInstrumentBase + (i - audioInstruments);
+
+ MappedAudioFader *fader = m_alsaDriver->getMappedStudio()->getAudioFader(id);
+ if (!fader)
+ continue;
+
+ float f = 2;
+ (void)fader->getProperty(MappedAudioFader::Channels, f);
+ int channels = (int)f;
+
+ int inputChannel = -1;
+ if (channels == 1) {
+ float f = 0;
+ (void)fader->getProperty(MappedAudioFader::InputChannel, f);
+ inputChannel = (int)f;
+ }
+
+ float level = 0.0;
+ (void)fader->getProperty(MappedAudioFader::FaderRecordLevel, level);
+
+ // Like in base/Instrument.h, we use numbers < 1000 to
+ // mean buss numbers and >= 1000 to mean record ins
+ // when recording the record input number.
+
+ MappedObjectValueList connections = fader->getConnections
+ (MappedConnectableObject::In);
+ int input = 1000;
+
+ if (connections.empty()) {
+
+ std::cerr << "No connections in for record instrument "
+ << (id) << " (mapped id " << fader->getId() << ")" << std::endl;
+
+ // oh dear.
+ input = 1000;
+
+ } else if (*connections.begin() == mbuss->getId()) {
+
+ input = 0;
+
+ } else {
+
+ MappedObject *obj = m_alsaDriver->getMappedStudio()->
+ getObjectById(MappedObjectId(*connections.begin()));
+
+ if (!obj) {
+
+ std::cerr << "No such object as " << *connections.begin() << std::endl;
+ input = 1000;
+ } else if (obj->getType() == MappedObject::AudioBuss) {
+ input = (int)((MappedAudioBuss *)obj)->getBussId();
+ } else if (obj->getType() == MappedObject::AudioInput) {
+ input = (int)((MappedAudioInput *)obj)->getInputNumber()
+ + 1000;
+ } else {
+ std::cerr << "Object " << *connections.begin() << " is not buss or input" << std::endl;
+ input = 1000;
+ }
+ }
+
+ if (m_recordInputs[id].input != input) {
+ std::cerr << "Changing record input for instrument "
+ << id << " to " << input << std::endl;
+ }
+ m_recordInputs[id] = RecordInputDesc(input, inputChannel, level);
+
+ size_t pluginLatency = 0;
+ bool empty = m_instrumentMixer->isInstrumentEmpty(id);
+
+ if (!empty) {
+ pluginLatency = m_instrumentMixer->getPluginLatency(id);
+ }
+
+ // If we find the object is connected to no output, or to buss
+ // number 0 (the master), then we set the bit appropriately.
+
+ connections = fader->getConnections(MappedConnectableObject::Out);
+
+ if (connections.empty() || (*connections.begin() == mbuss->getId())) {
+ if (i < audioInstruments) {
+ directMasterAudioInstruments |= (1 << i);
+ } else {
+ directMasterSynthInstruments |= (1 << (i - audioInstruments));
+ }
+ } else if (!empty) {
+ pluginLatency +=
+ m_instrumentMixer->getPluginLatency((unsigned int) * connections.begin());
+ }
+
+ if (empty) {
+ m_instrumentLatencies[id] = RealTime::zeroTime;
+ } else {
+ m_instrumentLatencies[id] = jackLatency +
+ RealTime::frame2RealTime(pluginLatency, m_sampleRate);
+ if (m_instrumentLatencies[id] > maxLatency) {
+ maxLatency = m_instrumentLatencies[id];
+ }
+ }
+ }
+
+ m_maxInstrumentLatency = maxLatency;
+ m_directMasterAudioInstruments = directMasterAudioInstruments;
+ m_directMasterSynthInstruments = directMasterSynthInstruments;
+ m_maxInstrumentLatency = maxLatency;
+
+ int inputs = m_alsaDriver->getMappedStudio()->
+ getObjectCount(MappedObject::AudioInput);
+
+ if (m_client) {
+ // this will return with no work if the inputs are already correct:
+ createRecordInputs(inputs);
+ }
+
+ m_bussMixer->updateInstrumentConnections();
+ m_instrumentMixer->updateInstrumentMuteStates();
+
+ if (m_bussMixer->getBussCount() == 0 || m_alsaDriver->getLowLatencyMode()) {
+ if (m_bussMixer->running()) {
+ m_bussMixer->terminate();
+ }
+ } else {
+ if (!m_bussMixer->running()) {
+ m_bussMixer->run();
+ }
+ }
+
+ if (m_alsaDriver->getLowLatencyMode()) {
+ if (m_instrumentMixer->running()) {
+ m_instrumentMixer->terminate();
+ }
+ } else {
+ if (!m_instrumentMixer->running()) {
+ m_instrumentMixer->run();
+ }
+ }
+
+#ifdef DEBUG_JACK_DRIVER
+ // std::cerr << "JackDriver::updateAudioData exiting" << std::endl;
+#endif
+}
+
+void
+JackDriver::setAudioBussLevels(int bussNo, float dB, float pan)
+{
+ if (m_bussMixer) {
+ m_bussMixer->setBussLevels(bussNo, dB, pan);
+ }
+}
+
+void
+JackDriver::setAudioInstrumentLevels(InstrumentId instrument, float dB, float pan)
+{
+ if (m_instrumentMixer) {
+ m_instrumentMixer->setInstrumentLevels(instrument, dB, pan);
+ }
+}
+
+RealTime
+JackDriver::getNextSliceStart(const RealTime &now) const
+{
+ jack_nframes_t frame;
+ bool neg = false;
+
+ if (now < RealTime::zeroTime) {
+ neg = true;
+ frame = RealTime::realTime2Frame(RealTime::zeroTime - now, m_sampleRate);
+ } else {
+ frame = RealTime::realTime2Frame(now, m_sampleRate);
+ }
+
+ jack_nframes_t rounded = frame;
+ rounded /= m_bufferSize;
+ rounded *= m_bufferSize;
+
+ RealTime roundrt;
+
+ if (rounded == frame)
+ roundrt = RealTime::frame2RealTime(rounded, m_sampleRate);
+ else if (neg)
+ roundrt = RealTime::frame2RealTime(rounded - m_bufferSize, m_sampleRate);
+ else
+ roundrt = RealTime::frame2RealTime(rounded + m_bufferSize, m_sampleRate);
+
+ if (neg)
+ roundrt = RealTime::zeroTime - roundrt;
+
+ return roundrt;
+}
+
+
+int
+JackDriver::getAudioQueueLocks()
+{
+ // We have to lock the mixers first, because the mixers can try to
+ // lock the disk manager from within a locked section -- so if we
+ // locked the disk manager first we would risk deadlock when
+ // trying to acquire the instrument mixer lock
+
+ int rv = 0;
+ if (m_bussMixer) {
+#ifdef DEBUG_JACK_DRIVER
+ std::cerr << "JackDriver::getAudioQueueLocks: trying to lock buss mixer" << std::endl;
+#endif
+
+ rv = m_bussMixer->getLock();
+ if (rv)
+ return rv;
+ }
+ if (m_instrumentMixer) {
+#ifdef DEBUG_JACK_DRIVER
+ std::cerr << "JackDriver::getAudioQueueLocks: ok, now trying for instrument mixer" << std::endl;
+#endif
+
+ rv = m_instrumentMixer->getLock();
+ if (rv)
+ return rv;
+ }
+ if (m_fileReader) {
+#ifdef DEBUG_JACK_DRIVER
+ std::cerr << "JackDriver::getAudioQueueLocks: ok, now trying for disk reader" << std::endl;
+#endif
+
+ rv = m_fileReader->getLock();
+ if (rv)
+ return rv;
+ }
+ if (m_fileWriter) {
+#ifdef DEBUG_JACK_DRIVER
+ std::cerr << "JackDriver::getAudioQueueLocks: ok, now trying for disk writer" << std::endl;
+#endif
+
+ rv = m_fileWriter->getLock();
+ }
+#ifdef DEBUG_JACK_DRIVER
+ std::cerr << "JackDriver::getAudioQueueLocks: ok" << std::endl;
+#endif
+
+ return rv;
+}
+
+int
+JackDriver::tryAudioQueueLocks()
+{
+ int rv = 0;
+ if (m_bussMixer) {
+ rv = m_bussMixer->tryLock();
+ if (rv)
+ return rv;
+ }
+ if (m_instrumentMixer) {
+ rv = m_instrumentMixer->tryLock();
+ if (rv) {
+ if (m_bussMixer) {
+ m_bussMixer->releaseLock();
+ }
+ }
+ }
+ if (m_fileReader) {
+ rv = m_fileReader->tryLock();
+ if (rv) {
+ if (m_instrumentMixer) {
+ m_instrumentMixer->releaseLock();
+ }
+ if (m_bussMixer) {
+ m_bussMixer->releaseLock();
+ }
+ }
+ }
+ if (m_fileWriter) {
+ rv = m_fileWriter->tryLock();
+ if (rv) {
+ if (m_fileReader) {
+ m_fileReader->releaseLock();
+ }
+ if (m_instrumentMixer) {
+ m_instrumentMixer->releaseLock();
+ }
+ if (m_bussMixer) {
+ m_bussMixer->releaseLock();
+ }
+ }
+ }
+ return rv;
+}
+
+int
+JackDriver::releaseAudioQueueLocks()
+{
+ int rv = 0;
+#ifdef DEBUG_JACK_DRIVER
+
+ std::cerr << "JackDriver::releaseAudioQueueLocks" << std::endl;
+#endif
+
+ if (m_fileWriter)
+ rv = m_fileWriter->releaseLock();
+ if (m_fileReader)
+ rv = m_fileReader->releaseLock();
+ if (m_instrumentMixer)
+ rv = m_instrumentMixer->releaseLock();
+ if (m_bussMixer)
+ rv = m_bussMixer->releaseLock();
+ return rv;
+}
+
+
+void
+JackDriver::setPluginInstance(InstrumentId id, QString identifier,
+ int position)
+{
+ if (m_instrumentMixer) {
+ m_instrumentMixer->setPlugin(id, position, identifier);
+ }
+ if (!m_alsaDriver->isPlaying()) {
+ prebufferAudio(); // to ensure the plugin's ringbuffers are generated
+ }
+}
+
+void
+JackDriver::removePluginInstance(InstrumentId id, int position)
+{
+ if (m_instrumentMixer)
+ m_instrumentMixer->removePlugin(id, position);
+}
+
+void
+JackDriver::removePluginInstances()
+{
+ if (m_instrumentMixer)
+ m_instrumentMixer->removeAllPlugins();
+}
+
+void
+JackDriver::setPluginInstancePortValue(InstrumentId id, int position,
+ unsigned long portNumber,
+ float value)
+{
+ if (m_instrumentMixer)
+ m_instrumentMixer->setPluginPortValue(id, position, portNumber, value);
+}
+
+float
+JackDriver::getPluginInstancePortValue(InstrumentId id, int position,
+ unsigned long portNumber)
+{
+ if (m_instrumentMixer)
+ return m_instrumentMixer->getPluginPortValue(id, position, portNumber);
+ return 0;
+}
+
+void
+JackDriver::setPluginInstanceBypass(InstrumentId id, int position, bool value)
+{
+ if (m_instrumentMixer)
+ m_instrumentMixer->setPluginBypass(id, position, value);
+}
+
+QStringList
+JackDriver::getPluginInstancePrograms(InstrumentId id, int position)
+{
+ if (m_instrumentMixer)
+ return m_instrumentMixer->getPluginPrograms(id, position);
+ return QStringList();
+}
+
+QString
+JackDriver::getPluginInstanceProgram(InstrumentId id, int position)
+{
+ if (m_instrumentMixer)
+ return m_instrumentMixer->getPluginProgram(id, position);
+ return QString();
+}
+
+QString
+JackDriver::getPluginInstanceProgram(InstrumentId id, int position,
+ int bank, int program)
+{
+ if (m_instrumentMixer)
+ return m_instrumentMixer->getPluginProgram(id, position, bank, program);
+ return QString();
+}
+
+unsigned long
+JackDriver::getPluginInstanceProgram(InstrumentId id, int position, QString name)
+{
+ if (m_instrumentMixer)
+ return m_instrumentMixer->getPluginProgram(id, position, name);
+ return 0;
+}
+
+void
+JackDriver::setPluginInstanceProgram(InstrumentId id, int position, QString program)
+{
+ if (m_instrumentMixer)
+ m_instrumentMixer->setPluginProgram(id, position, program);
+}
+
+QString
+JackDriver::configurePlugin(InstrumentId id, int position, QString key, QString value)
+{
+ if (m_instrumentMixer)
+ return m_instrumentMixer->configurePlugin(id, position, key, value);
+ return QString();
+}
+
+RunnablePluginInstance *
+JackDriver::getSynthPlugin(InstrumentId id)
+{
+ if (m_instrumentMixer)
+ return m_instrumentMixer->getSynthPlugin(id);
+ else
+ return 0;
+}
+
+void
+JackDriver::clearSynthPluginEvents()
+{
+ if (!m_instrumentMixer) return;
+
+#ifdef DEBUG_JACK_DRIVER
+ std::cerr << "JackDriver::clearSynthPluginEvents" << std::endl;
+#endif
+
+ m_instrumentMixer->discardPluginEvents();
+}
+
+bool
+JackDriver::openRecordFile(InstrumentId id,
+ const std::string &filename)
+{
+ if (m_fileWriter) {
+ if (!m_fileWriter->running()) {
+ m_fileWriter->run();
+ }
+ return m_fileWriter->openRecordFile(id, filename);
+ } else {
+ std::cerr << "JackDriver::openRecordFile: No file writer available!" << std::endl;
+ return false;
+ }
+}
+
+bool
+JackDriver::closeRecordFile(InstrumentId id,
+ AudioFileId &returnedId)
+{
+ if (m_fileWriter) {
+ return m_fileWriter->closeRecordFile(id, returnedId);
+ if (m_fileWriter->running() && !m_fileWriter->haveRecordFilesOpen()) {
+ m_fileWriter->terminate();
+ }
+ } else
+ return false;
+}
+
+
+void
+JackDriver::reportFailure(MappedEvent::FailureCode code)
+{
+ if (m_alsaDriver)
+ m_alsaDriver->reportFailure(code);
+}
+
+
+}
+
+#endif // HAVE_LIBJACK
+#endif // HAVE_ALSA
diff --git a/src/sound/JackDriver.h b/src/sound/JackDriver.h
new file mode 100644
index 0000000..b46080d
--- /dev/null
+++ b/src/sound/JackDriver.h
@@ -0,0 +1,297 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _JACKDRIVER_H_
+#define _JACKDRIVER_H_
+
+#ifdef HAVE_ALSA
+#ifdef HAVE_LIBJACK
+
+#include "RunnablePluginInstance.h"
+#include <jack/jack.h>
+#include "SoundDriver.h"
+#include "Instrument.h"
+#include "RealTime.h"
+#include "ExternalTransport.h"
+#include <qstringlist.h>
+
+namespace Rosegarden
+{
+
+class AlsaDriver;
+class AudioBussMixer;
+class AudioInstrumentMixer;
+class AudioFileReader;
+class AudioFileWriter;
+
+class JackDriver
+{
+public:
+ // convenience
+ typedef jack_default_audio_sample_t sample_t;
+
+ JackDriver(AlsaDriver *alsaDriver);
+ virtual ~JackDriver();
+
+ bool isOK() const { return m_ok; }
+
+ bool isTransportEnabled() { return m_jackTransportEnabled; }
+ bool isTransportMaster () { return m_jackTransportMaster; }
+
+ void setTransportEnabled(bool e) { m_jackTransportEnabled = e; }
+ void setTransportMaster (bool m) { m_jackTransportMaster = m; }
+
+ // These methods call back on the sound driver if necessary to
+ // establish the current transport location to start at or
+ // relocate to. startTransport and relocateTransport return true
+ // if they have completed and the sound driver can safely call
+ // startClocks; false if the sound driver should wait for the JACK
+ // driver to call back on startClocksApproved before starting.
+ bool startTransport();
+ bool relocateTransport();
+ void stopTransport();
+
+ RealTime getAudioPlayLatency() const;
+ RealTime getAudioRecordLatency() const;
+ RealTime getInstrumentPlayLatency(InstrumentId) const;
+ RealTime getMaximumPlayLatency() const;
+
+ // Plugin instance management
+ //
+ virtual void setPluginInstance(InstrumentId id,
+ QString identifier,
+ int position);
+
+ virtual void removePluginInstance(InstrumentId id, int position);
+
+ // Remove all plugin instances
+ //
+ virtual void removePluginInstances();
+
+ virtual void setPluginInstancePortValue(InstrumentId id,
+ int position,
+ unsigned long portNumber,
+ float value);
+
+ virtual float getPluginInstancePortValue(InstrumentId id,
+ int position,
+ unsigned long portNumber);
+
+ virtual void setPluginInstanceBypass(InstrumentId id,
+ int position,
+ bool value);
+
+ virtual QStringList getPluginInstancePrograms(InstrumentId id,
+ int position);
+
+ virtual QString getPluginInstanceProgram(InstrumentId id,
+ int position);
+
+ virtual QString getPluginInstanceProgram(InstrumentId id,
+ int position,
+ int bank,
+ int program);
+
+ virtual unsigned long getPluginInstanceProgram(InstrumentId id,
+ int position,
+ QString name);
+
+ virtual void setPluginInstanceProgram(InstrumentId id,
+ int position,
+ QString program);
+
+ virtual QString configurePlugin(InstrumentId id,
+ int position,
+ QString key, QString value);
+
+ virtual RunnablePluginInstance *getSynthPlugin(InstrumentId id);
+
+ virtual void clearSynthPluginEvents(); // when stopping
+
+ virtual unsigned int getSampleRate() const { return m_sampleRate; }
+ virtual unsigned int getBufferSize() const { return m_bufferSize; }
+
+ // A new audio file for storage of our recorded samples - the
+ // file stays open so we can append samples at will. We must
+ // explicitly close the file eventually though to make sure
+ // the integrity is correct (sample sizes must be written).
+ //
+ bool openRecordFile(InstrumentId id,
+ const std::string &fileName);
+ bool closeRecordFile(InstrumentId id,
+ AudioFileId &returnedId);
+
+ // Set or change the number of audio inputs and outputs.
+ // The first of these is slightly misnamed -- the submasters
+ // argument controls the number of busses, not ports (which
+ // may or may not exist depending on the setAudioPorts call).
+ //
+ void setAudioPorts(bool faderOuts, bool submasterOuts);
+
+ // Locks used by the disk thread and mix thread. The AlsaDriver
+ // should hold these locks whenever it wants to modify its audio
+ // play queue -- at least when adding or removing files or
+ // resetting status; it doesn't need to hold the locks when
+ // incrementing their statuses or simply reading them.
+ //
+ int getAudioQueueLocks();
+ int tryAudioQueueLocks();
+ int releaseAudioQueueLocks();
+
+ void prepareAudio(); // when repositioning etc
+ void prebufferAudio(); // when starting playback (incorporates prepareAudio)
+ void kickAudio(); // for paranoia only
+
+ // Because we don't want to do any lookups that might involve
+ // locking etc from within the JACK process thread, we instead
+ // call this regularly from the ALSA driver thread -- it looks up
+ // various bits of data such as the master fader and monitoring
+ // levels, number of inputs etc and either processes them or
+ // writes them into simple records in the JACK driver for process
+ // to read. Actually quite a lot of work.
+ //
+ void updateAudioData();
+
+ // Similarly, set data on the buss mixer to avoid the buss mixer
+ // having to call back on the mapped studio to discover it
+ //
+ void setAudioBussLevels(int bussNo, float dB, float pan);
+
+ // Likewise for instrument mixer
+ //
+ void setAudioInstrumentLevels(InstrumentId instrument, float dB, float pan);
+
+ // Called from AlsaDriver to indicate that an async MIDI event is
+ // being sent to a soft synth. JackDriver uses this to suggest
+ // that it needs to start processing soft synths, if it wasn't
+ // already. It will switch this off again itself when things
+ // fall silent.
+ //
+ void setHaveAsyncAudioEvent() { m_haveAsyncAudioEvent = true; }
+
+ RealTime getNextSliceStart(const RealTime &now) const;
+
+ // For audit purposes only.
+ size_t getFramesProcessed() const { return m_framesProcessed; }
+
+ // Reinitialise if we've been kicked off JACK -- if we can
+ //
+ void restoreIfRestorable();
+
+ // Report back to GUI via the AlsaDriver
+ //
+ void reportFailure(MappedEvent::FailureCode code);
+
+protected:
+
+ // static methods for JACK process thread:
+ static int jackProcessStatic(jack_nframes_t nframes, void *arg);
+ static int jackBufferSize(jack_nframes_t nframes, void *arg);
+ static int jackSampleRate(jack_nframes_t nframes, void *arg);
+ static void jackShutdown(void *arg);
+ static int jackXRun(void *);
+
+ // static JACK transport callbacks
+ static int jackSyncCallback(jack_transport_state_t,
+ jack_position_t *, void *);
+ static int jackTimebaseCallback(jack_transport_state_t,
+ jack_nframes_t,
+ jack_position_t *,
+ int,
+ void *);
+
+ // jackProcessStatic delegates to this
+ int jackProcess(jack_nframes_t nframes);
+ int jackProcessRecord(InstrumentId id,
+ jack_nframes_t nframes,
+ sample_t *, sample_t *, bool);
+ int jackProcessEmpty(jack_nframes_t nframes);
+
+ // other helper methods:
+
+ void initialise(bool reinitialise = false);
+
+ bool createMainOutputs();
+ bool createFaderOutputs(int audioPairs, int synthPairs);
+ bool createSubmasterOutputs(int pairs);
+ bool createRecordInputs(int pairs);
+
+ bool relocateTransportInternal(bool alsoStart);
+
+ // data members:
+
+ jack_client_t *m_client;
+
+ std::vector<jack_port_t *> m_inputPorts;
+ std::vector<jack_port_t *> m_outputInstruments;
+ std::vector<jack_port_t *> m_outputSubmasters;
+ std::vector<jack_port_t *> m_outputMonitors;
+ std::vector<jack_port_t *> m_outputMasters;
+
+ jack_nframes_t m_bufferSize;
+ jack_nframes_t m_sampleRate;
+
+ sample_t *m_tempOutBuffer;
+
+ bool m_jackTransportEnabled;
+ bool m_jackTransportMaster;
+
+ bool m_waiting;
+ jack_transport_state_t m_waitingState;
+ ExternalTransport::TransportToken m_waitingToken;
+ int m_ignoreProcessTransportCount;
+
+ AudioBussMixer *m_bussMixer;
+ AudioInstrumentMixer *m_instrumentMixer;
+ AudioFileReader *m_fileReader;
+ AudioFileWriter *m_fileWriter;
+ AlsaDriver *m_alsaDriver;
+
+ float m_masterLevel;
+ unsigned long m_directMasterAudioInstruments; // bitmap
+ unsigned long m_directMasterSynthInstruments;
+ std::map<InstrumentId, RealTime> m_instrumentLatencies;
+ RealTime m_maxInstrumentLatency;
+ bool m_haveAsyncAudioEvent;
+
+ struct RecordInputDesc {
+ int input;
+ int channel;
+ float level;
+ RecordInputDesc(int i = 1000, int c = -1, float l = 0.0f) :
+ input(i), channel(c), level(l) { }
+ };
+ typedef std::map<InstrumentId, RecordInputDesc> RecordInputMap;
+ RecordInputMap m_recordInputs;
+
+ time_t m_kickedOutAt;
+ size_t m_framesProcessed;
+ bool m_ok;
+};
+
+
+}
+
+#endif
+#endif
+
+#endif
+
diff --git a/src/sound/LADSPAPluginFactory.cpp b/src/sound/LADSPAPluginFactory.cpp
new file mode 100644
index 0000000..2a4a4ea
--- /dev/null
+++ b/src/sound/LADSPAPluginFactory.cpp
@@ -0,0 +1,841 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include "LADSPAPluginFactory.h"
+#include <iostream>
+#include <cstdlib>
+
+#ifdef HAVE_LADSPA
+
+#include <dlfcn.h>
+#include <qdir.h>
+#include <cmath>
+
+#include "AudioPluginInstance.h"
+#include "LADSPAPluginInstance.h"
+#include "MappedStudio.h"
+#include "PluginIdentifier.h"
+
+#ifdef HAVE_LIBLRDF
+#include "lrdf.h"
+#endif // HAVE_LIBLRDF
+
+#include <kdebug.h>
+
+namespace Rosegarden
+{
+
+LADSPAPluginFactory::LADSPAPluginFactory()
+{}
+
+LADSPAPluginFactory::~LADSPAPluginFactory()
+{
+ for (std::set
+ <RunnablePluginInstance *>::iterator i = m_instances.begin();
+ i != m_instances.end(); ++i) {
+ (*i)->setFactory(0);
+ delete *i;
+ }
+ m_instances.clear();
+ unloadUnusedLibraries();
+}
+
+const std::vector<QString> &
+LADSPAPluginFactory::getPluginIdentifiers() const
+{
+ return m_identifiers;
+}
+
+void
+LADSPAPluginFactory::enumeratePlugins(MappedObjectPropertyList &list)
+{
+ for (std::vector<QString>::iterator i = m_identifiers.begin();
+ i != m_identifiers.end(); ++i) {
+
+ const LADSPA_Descriptor *descriptor = getLADSPADescriptor(*i);
+
+ if (!descriptor) {
+ std::cerr << "WARNING: LADSPAPluginFactory::enumeratePlugins: couldn't get descriptor for identifier " << *i << std::endl;
+ continue;
+ }
+
+// std::cerr << "Enumerating plugin identifier " << *i << std::endl;
+
+ list.push_back(*i);
+ list.push_back(descriptor->Name);
+ list.push_back(QString("%1").arg(descriptor->UniqueID));
+ list.push_back(descriptor->Label);
+ list.push_back(descriptor->Maker);
+ list.push_back(descriptor->Copyright);
+ list.push_back("false"); // is synth
+ list.push_back("false"); // is grouped
+
+ if (m_taxonomy.find(descriptor->UniqueID) != m_taxonomy.end() &&
+ m_taxonomy[descriptor->UniqueID] != "") {
+// std::cerr << "LADSPAPluginFactory: cat for " << *i<< " found in taxonomy as " << m_taxonomy[descriptor->UniqueID] << std::endl;
+ list.push_back(m_taxonomy[descriptor->UniqueID]);
+
+ } else if (m_fallbackCategories.find(*i) !=
+ m_fallbackCategories.end()) {
+ list.push_back(m_fallbackCategories[*i]);
+// std::cerr << "LADSPAPluginFactory: cat for " << *i <<" found in fallbacks as " << m_fallbackCategories[*i] << std::endl;
+
+ } else {
+ list.push_back("");
+// std::cerr << "LADSPAPluginFactory: cat for " << *i << " not found (despite having " << m_fallbackCategories.size() << " fallbacks)" << std::endl;
+
+ }
+
+ list.push_back(QString("%1").arg(descriptor->PortCount));
+
+ for (unsigned long p = 0; p < descriptor->PortCount; ++p) {
+
+ int type = 0;
+ if (LADSPA_IS_PORT_CONTROL(descriptor->PortDescriptors[p])) {
+ type |= PluginPort::Control;
+ } else {
+ type |= PluginPort::Audio;
+ }
+ if (LADSPA_IS_PORT_INPUT(descriptor->PortDescriptors[p])) {
+ type |= PluginPort::Input;
+ } else {
+ type |= PluginPort::Output;
+ }
+
+ list.push_back(QString("%1").arg(p));
+ list.push_back(descriptor->PortNames[p]);
+ list.push_back(QString("%1").arg(type));
+ list.push_back(QString("%1").arg(getPortDisplayHint(descriptor, p)));
+ list.push_back(QString("%1").arg(getPortMinimum(descriptor, p)));
+ list.push_back(QString("%1").arg(getPortMaximum(descriptor, p)));
+ list.push_back(QString("%1").arg(getPortDefault(descriptor, p)));
+ }
+ }
+
+ unloadUnusedLibraries();
+}
+
+
+void
+LADSPAPluginFactory::populatePluginSlot(QString identifier, MappedPluginSlot &slot)
+{
+ const LADSPA_Descriptor *descriptor = getLADSPADescriptor(identifier);
+
+ if (descriptor) {
+
+ slot.setProperty(MappedPluginSlot::Label, descriptor->Label);
+ slot.setProperty(MappedPluginSlot::PluginName, descriptor->Name);
+ slot.setProperty(MappedPluginSlot::Author, descriptor->Maker);
+ slot.setProperty(MappedPluginSlot::Copyright, descriptor->Copyright);
+ slot.setProperty(MappedPluginSlot::PortCount, descriptor->PortCount);
+
+ if (m_taxonomy.find(descriptor->UniqueID) != m_taxonomy.end() &&
+ m_taxonomy[descriptor->UniqueID] != "") {
+ // std::cerr << "LADSPAPluginFactory: cat for " << identifier<< " found in taxonomy as " << m_taxonomy[descriptor->UniqueID] << std::endl;
+ slot.setProperty(MappedPluginSlot::Category,
+ m_taxonomy[descriptor->UniqueID]);
+
+ } else if (m_fallbackCategories.find(identifier) !=
+ m_fallbackCategories.end()) {
+ // std::cerr << "LADSPAPluginFactory: cat for " << identifier <<" found in fallbacks as " << m_fallbackCategories[identifier] << std::endl;
+ slot.setProperty(MappedPluginSlot::Category,
+ m_fallbackCategories[identifier]);
+
+ } else {
+ // std::cerr << "LADSPAPluginFactory: cat for " << identifier << " not found (despite having " << m_fallbackCategories.size() << " fallbacks)" << std::endl;
+ slot.setProperty(MappedPluginSlot::Category, "");
+ }
+
+ slot.destroyChildren();
+
+ for (unsigned long i = 0; i < descriptor->PortCount; i++) {
+
+ if (LADSPA_IS_PORT_CONTROL(descriptor->PortDescriptors[i]) &&
+ LADSPA_IS_PORT_INPUT(descriptor->PortDescriptors[i])) {
+
+ MappedStudio *studio = dynamic_cast<MappedStudio *>(slot.getParent());
+ if (!studio) {
+ std::cerr << "WARNING: LADSPAPluginFactory::populatePluginSlot: can't find studio" << std::endl;
+ return ;
+ }
+
+ MappedPluginPort *port =
+ dynamic_cast<MappedPluginPort *>
+ (studio->createObject(MappedObject::PluginPort));
+
+ slot.addChild(port);
+ port->setParent(&slot);
+
+ port->setProperty(MappedPluginPort::PortNumber, i);
+ port->setProperty(MappedPluginPort::Name,
+ descriptor->PortNames[i]);
+ port->setProperty(MappedPluginPort::Maximum,
+ getPortMaximum(descriptor, i));
+ port->setProperty(MappedPluginPort::Minimum,
+ getPortMinimum(descriptor, i));
+ port->setProperty(MappedPluginPort::Default,
+ getPortDefault(descriptor, i));
+ port->setProperty(MappedPluginPort::DisplayHint,
+ getPortDisplayHint(descriptor, i));
+ }
+ }
+ }
+
+ //!!! leak here if the plugin is not instantiated too...?
+}
+
+MappedObjectValue
+LADSPAPluginFactory::getPortMinimum(const LADSPA_Descriptor *descriptor, int port)
+{
+ LADSPA_PortRangeHintDescriptor d =
+ descriptor->PortRangeHints[port].HintDescriptor;
+
+ MappedObjectValue minimum = 0.0;
+
+ if (LADSPA_IS_HINT_BOUNDED_BELOW(d)) {
+ MappedObjectValue lb = descriptor->PortRangeHints[port].LowerBound;
+ minimum = lb;
+ } else if (LADSPA_IS_HINT_BOUNDED_ABOVE(d)) {
+ MappedObjectValue ub = descriptor->PortRangeHints[port].UpperBound;
+ minimum = std::min(0.f, ub - 1.f);
+ }
+
+ if (LADSPA_IS_HINT_SAMPLE_RATE(d)) {
+ minimum *= m_sampleRate;
+ }
+
+ if (LADSPA_IS_HINT_LOGARITHMIC(d)) {
+ if (minimum == 0.f) minimum = 1.f;
+ }
+
+ return minimum;
+}
+
+MappedObjectValue
+LADSPAPluginFactory::getPortMaximum(const LADSPA_Descriptor *descriptor, int port)
+{
+ LADSPA_PortRangeHintDescriptor d =
+ descriptor->PortRangeHints[port].HintDescriptor;
+
+ MappedObjectValue maximum = 1.0;
+
+// std::cerr << "LADSPAPluginFactory::getPortMaximum(" << port << ")" << std::endl;
+// std::cerr << "bounded above: " << LADSPA_IS_HINT_BOUNDED_ABOVE(d) << std::endl;
+
+ if (LADSPA_IS_HINT_BOUNDED_ABOVE(d)) {
+ MappedObjectValue ub = descriptor->PortRangeHints[port].UpperBound;
+ maximum = ub;
+ } else {
+ MappedObjectValue lb = descriptor->PortRangeHints[port].LowerBound;
+ if (LADSPA_IS_HINT_LOGARITHMIC(d)) {
+ if (lb == 0.f) lb = 1.f;
+ maximum = lb * 100.f;
+ } else {
+ if (lb == 1.f) maximum = 10.f;
+ else maximum = lb + 10;
+ }
+ }
+
+ if (LADSPA_IS_HINT_SAMPLE_RATE(d)) {
+// std::cerr << "note: port has sample rate hint" << std::endl;
+ maximum *= m_sampleRate;
+ }
+
+// std::cerr << "maximum: " << maximum << std::endl;
+// if (LADSPA_IS_HINT_LOGARITHMIC(d)) {
+// std::cerr << "note: port is logarithmic" << std::endl;
+// }
+// std::cerr << "note: minimum is reported as " << getPortMinimum(descriptor, port) << " (from bounded = " << LADSPA_IS_HINT_BOUNDED_BELOW(d) << ", bound = " << descriptor->PortRangeHints[port].LowerBound << ")" << std::endl;
+
+ return maximum;
+}
+
+MappedObjectValue
+LADSPAPluginFactory::getPortDefault(const LADSPA_Descriptor *descriptor, int port)
+{
+ MappedObjectValue minimum = getPortMinimum(descriptor, port);
+ MappedObjectValue maximum = getPortMaximum(descriptor, port);
+ MappedObjectValue deft;
+
+ if (m_portDefaults.find(descriptor->UniqueID) !=
+ m_portDefaults.end()) {
+ if (m_portDefaults[descriptor->UniqueID].find(port) !=
+ m_portDefaults[descriptor->UniqueID].end()) {
+
+ deft = m_portDefaults[descriptor->UniqueID][port];
+ if (deft < minimum) deft = minimum;
+ if (deft > maximum) deft = maximum;
+// std::cerr << "port " << port << ": default " << deft << " from defaults" << std::endl;
+ return deft;
+ }
+ }
+
+ LADSPA_PortRangeHintDescriptor d =
+ descriptor->PortRangeHints[port].HintDescriptor;
+
+ bool logarithmic = LADSPA_IS_HINT_LOGARITHMIC(d);
+
+ float logmin = 0, logmax = 0;
+ if (logarithmic) {
+ float thresh = powf(10, -10);
+ if (minimum < thresh) logmin = -10;
+ else logmin = log10f(minimum);
+ if (maximum < thresh) logmax = -10;
+ else logmax = log10f(maximum);
+ }
+
+ if (!LADSPA_IS_HINT_HAS_DEFAULT(d)) {
+
+ deft = minimum;
+
+ } else if (LADSPA_IS_HINT_DEFAULT_MINIMUM(d)) {
+
+ // See comment for DEFAULT_MAXIMUM below
+ if (!LADSPA_IS_HINT_BOUNDED_BELOW(d)) {
+ deft = descriptor->PortRangeHints[port].LowerBound;
+ if (LADSPA_IS_HINT_SAMPLE_RATE(d)) {
+ deft *= m_sampleRate;
+ }
+// std::cerr << "default-minimum: " << deft << std::endl;
+ if (deft < minimum || deft > maximum) deft = minimum;
+// std::cerr << "default-minimum: " << deft << std::endl;
+ } else {
+ deft = minimum;
+ }
+
+ } else if (LADSPA_IS_HINT_DEFAULT_LOW(d)) {
+
+ if (logarithmic) {
+ deft = powf(10, logmin * 0.75 + logmax * 0.25);
+ } else {
+ deft = minimum * 0.75 + maximum * 0.25;
+ }
+
+ } else if (LADSPA_IS_HINT_DEFAULT_MIDDLE(d)) {
+
+ if (logarithmic) {
+ deft = powf(10, logmin * 0.5 + logmax * 0.5);
+ } else {
+ deft = minimum * 0.5 + maximum * 0.5;
+ }
+
+ } else if (LADSPA_IS_HINT_DEFAULT_HIGH(d)) {
+
+ if (logarithmic) {
+ deft = powf(10, logmin * 0.25 + logmax * 0.75);
+ } else {
+ deft = minimum * 0.25 + maximum * 0.75;
+ }
+
+ } else if (LADSPA_IS_HINT_DEFAULT_MAXIMUM(d)) {
+
+ // CMT plugins employ this grossness (setting DEFAULT_MAXIMUM
+ // without BOUNDED_ABOVE and then using the UPPER_BOUND as the
+ // port default)
+ if (!LADSPA_IS_HINT_BOUNDED_ABOVE(d)) {
+ deft = descriptor->PortRangeHints[port].UpperBound;
+ if (LADSPA_IS_HINT_SAMPLE_RATE(d)) {
+ deft *= m_sampleRate;
+ }
+// std::cerr << "default-maximum: " << deft << std::endl;
+ if (deft < minimum || deft > maximum) deft = maximum;
+// std::cerr << "default-maximum: " << deft << std::endl;
+ } else {
+ deft = maximum;
+ }
+
+ } else if (LADSPA_IS_HINT_DEFAULT_0(d)) {
+
+ deft = 0.0;
+
+ } else if (LADSPA_IS_HINT_DEFAULT_1(d)) {
+
+ deft = 1.0;
+
+ } else if (LADSPA_IS_HINT_DEFAULT_100(d)) {
+
+ deft = 100.0;
+
+ } else if (LADSPA_IS_HINT_DEFAULT_440(d)) {
+
+ deft = 440.0;
+
+ } else {
+
+ deft = minimum;
+ }
+
+// std::cerr << "port " << port << " default = "<< deft << std::endl;
+
+ return deft;
+}
+
+int
+LADSPAPluginFactory::getPortDisplayHint(const LADSPA_Descriptor *descriptor, int port)
+{
+ LADSPA_PortRangeHintDescriptor d =
+ descriptor->PortRangeHints[port].HintDescriptor;
+ int hint = PluginPort::NoHint;
+
+ if (LADSPA_IS_HINT_TOGGLED(d))
+ hint |= PluginPort::Toggled;
+ if (LADSPA_IS_HINT_INTEGER(d))
+ hint |= PluginPort::Integer;
+ if (LADSPA_IS_HINT_LOGARITHMIC(d))
+ hint |= PluginPort::Logarithmic;
+
+ return hint;
+}
+
+
+RunnablePluginInstance *
+LADSPAPluginFactory::instantiatePlugin(QString identifier,
+ int instrument,
+ int position,
+ unsigned int sampleRate,
+ unsigned int blockSize,
+ unsigned int channels)
+{
+ const LADSPA_Descriptor *descriptor = getLADSPADescriptor(identifier);
+
+ if (descriptor) {
+
+ LADSPAPluginInstance *instance =
+ new LADSPAPluginInstance
+ (this, instrument, identifier, position, sampleRate, blockSize, channels,
+ descriptor);
+
+ m_instances.insert(instance);
+
+ return instance;
+ }
+
+ return 0;
+}
+
+void
+LADSPAPluginFactory::releasePlugin(RunnablePluginInstance *instance,
+ QString identifier)
+{
+ if (m_instances.find(instance) == m_instances.end()) {
+ std::cerr << "WARNING: LADSPAPluginFactory::releasePlugin: Not one of mine!"
+ << std::endl;
+ return ;
+ }
+
+ QString type, soname, label;
+ PluginIdentifier::parseIdentifier(identifier, type, soname, label);
+
+ m_instances.erase(m_instances.find(instance));
+
+ bool stillInUse = false;
+
+ for (std::set
+ <RunnablePluginInstance *>::iterator ii = m_instances.begin();
+ ii != m_instances.end(); ++ii) {
+ QString itype, isoname, ilabel;
+ PluginIdentifier::parseIdentifier((*ii)->getIdentifier(), itype, isoname, ilabel);
+ if (isoname == soname) {
+ // std::cerr << "LADSPAPluginFactory::releasePlugin: dll " << soname << " is still in use for plugin " << ilabel << std::endl;
+ stillInUse = true;
+ break;
+ }
+ }
+
+ if (!stillInUse) {
+ // std::cerr << "LADSPAPluginFactory::releasePlugin: dll " << soname << " no longer in use, unloading" << std::endl;
+ unloadLibrary(soname);
+ }
+}
+
+const LADSPA_Descriptor *
+LADSPAPluginFactory::getLADSPADescriptor(QString identifier)
+{
+ QString type, soname, label;
+ PluginIdentifier::parseIdentifier(identifier, type, soname, label);
+
+ if (m_libraryHandles.find(soname) == m_libraryHandles.end()) {
+ loadLibrary(soname);
+ if (m_libraryHandles.find(soname) == m_libraryHandles.end()) {
+ std::cerr << "WARNING: LADSPAPluginFactory::getLADSPADescriptor: loadLibrary failed for " << soname << std::endl;
+ return 0;
+ }
+ }
+
+ void *libraryHandle = m_libraryHandles[soname];
+
+ LADSPA_Descriptor_Function fn = (LADSPA_Descriptor_Function)
+ dlsym(libraryHandle, "ladspa_descriptor");
+
+ if (!fn) {
+ std::cerr << "WARNING: LADSPAPluginFactory::getLADSPADescriptor: No descriptor function in library " << soname << std::endl;
+ return 0;
+ }
+
+ const LADSPA_Descriptor *descriptor = 0;
+
+ int index = 0;
+ while ((descriptor = fn(index))) {
+ if (descriptor->Label == label)
+ return descriptor;
+ ++index;
+ }
+
+ std::cerr << "WARNING: LADSPAPluginFactory::getLADSPADescriptor: No such plugin as " << label << " in library " << soname << std::endl;
+
+ return 0;
+}
+
+void
+LADSPAPluginFactory::loadLibrary(QString soName)
+{
+ void *libraryHandle = dlopen(soName.data(), RTLD_NOW);
+ if (libraryHandle)
+ m_libraryHandles[soName] = libraryHandle;
+}
+
+void
+LADSPAPluginFactory::unloadLibrary(QString soName)
+{
+ LibraryHandleMap::iterator li = m_libraryHandles.find(soName);
+ if (li != m_libraryHandles.end()) {
+ // std::cerr << "unloading " << soName << std::endl;
+ dlclose(m_libraryHandles[soName]);
+ m_libraryHandles.erase(li);
+ }
+}
+
+void
+LADSPAPluginFactory::unloadUnusedLibraries()
+{
+ std::vector<QString> toUnload;
+
+ for (LibraryHandleMap::iterator i = m_libraryHandles.begin();
+ i != m_libraryHandles.end(); ++i) {
+
+ bool stillInUse = false;
+
+ for (std::set
+ <RunnablePluginInstance *>::iterator ii = m_instances.begin();
+ ii != m_instances.end(); ++ii) {
+
+ QString itype, isoname, ilabel;
+ PluginIdentifier::parseIdentifier((*ii)->getIdentifier(), itype, isoname, ilabel);
+ if (isoname == i->first) {
+ stillInUse = true;
+ break;
+ }
+ }
+
+ if (!stillInUse)
+ toUnload.push_back(i->first);
+ }
+
+ for (std::vector<QString>::iterator i = toUnload.begin();
+ i != toUnload.end(); ++i) {
+ unloadLibrary(*i);
+ }
+}
+
+
+// It is only later, after they've gone,
+// I realize they have delivered a letter.
+// It's a letter from my wife. "What are you doing
+// there?" my wife asks. "Are you drinking?"
+// I study the postmark for hours. Then it, too, begins to fade.
+// I hope someday to forget all this.
+
+
+std::vector<QString>
+LADSPAPluginFactory::getPluginPath()
+{
+ std::vector<QString> pathList;
+ std::string path;
+
+ char *cpath = getenv("LADSPA_PATH");
+ if (cpath)
+ path = cpath;
+
+ if (path == "") {
+ path = "/usr/local/lib/ladspa:/usr/lib/ladspa";
+ char *home = getenv("HOME");
+ if (home)
+ path = std::string(home) + "/.ladspa:" + path;
+ }
+
+ std::string::size_type index = 0, newindex = 0;
+
+ while ((newindex = path.find(':', index)) < path.size()) {
+ pathList.push_back(path.substr(index, newindex - index).c_str());
+ index = newindex + 1;
+ }
+
+ pathList.push_back(path.substr(index).c_str());
+
+ return pathList;
+}
+
+
+#ifdef HAVE_LIBLRDF
+std::vector<QString>
+LADSPAPluginFactory::getLRDFPath(QString &baseUri)
+{
+ std::vector<QString> pathList = getPluginPath();
+ std::vector<QString> lrdfPaths;
+
+ lrdfPaths.push_back("/usr/local/share/ladspa/rdf");
+ lrdfPaths.push_back("/usr/share/ladspa/rdf");
+
+ for (std::vector<QString>::iterator i = pathList.begin();
+ i != pathList.end(); ++i) {
+ lrdfPaths.push_back(*i + "/rdf");
+ }
+
+ baseUri = LADSPA_BASE;
+ return lrdfPaths;
+}
+#endif
+
+void
+LADSPAPluginFactory::discoverPlugins()
+{
+ std::vector<QString> pathList = getPluginPath();
+
+ std::cerr << "LADSPAPluginFactory::discoverPlugins - "
+ << "discovering plugins; path is ";
+ for (std::vector<QString>::iterator i = pathList.begin();
+ i != pathList.end(); ++i) {
+ std::cerr << "[" << *i << "] ";
+ }
+ std::cerr << std::endl;
+
+// std::cerr << "LADSPAPluginFactory::discoverPlugins - "
+// << "trace is ";
+// std::cerr << kdBacktrace() << std::endl;
+
+#ifdef HAVE_LIBLRDF
+ // Initialise liblrdf and read the description files
+ //
+ lrdf_init();
+
+ QString baseUri;
+ std::vector<QString> lrdfPaths = getLRDFPath(baseUri);
+
+ bool haveSomething = false;
+
+ for (size_t i = 0; i < lrdfPaths.size(); ++i) {
+ QDir dir(lrdfPaths[i], "*.rdf;*.rdfs");
+ for (unsigned int j = 0; j < dir.count(); ++j) {
+ if (!lrdf_read_file(QString("file:" + lrdfPaths[i] + "/" + dir[j]).data())) {
+ // std::cerr << "LADSPAPluginFactory: read RDF file " << (lrdfPaths[i] + "/" + dir[j]) << std::endl;
+ haveSomething = true;
+ }
+ }
+ }
+
+ if (haveSomething) {
+ generateTaxonomy(baseUri + "Plugin", "");
+ }
+#endif // HAVE_LIBLRDF
+
+ generateFallbackCategories();
+
+ for (std::vector<QString>::iterator i = pathList.begin();
+ i != pathList.end(); ++i) {
+
+ QDir pluginDir(*i, "*.so");
+
+ for (unsigned int j = 0; j < pluginDir.count(); ++j) {
+ discoverPlugins(QString("%1/%2").arg(*i).arg(pluginDir[j]));
+ }
+ }
+
+#ifdef HAVE_LIBLRDF
+ // Cleanup after the RDF library
+ //
+ lrdf_cleanup();
+#endif // HAVE_LIBLRDF
+
+ std::cerr << "LADSPAPluginFactory::discoverPlugins - done" << std::endl;
+}
+
+void
+LADSPAPluginFactory::discoverPlugins(QString soName)
+{
+ void *libraryHandle = dlopen(soName.data(), RTLD_LAZY);
+
+ if (!libraryHandle) {
+ std::cerr << "WARNING: LADSPAPluginFactory::discoverPlugins: couldn't dlopen "
+ << soName << " - " << dlerror() << std::endl;
+ return ;
+ }
+
+ LADSPA_Descriptor_Function fn = (LADSPA_Descriptor_Function)
+ dlsym(libraryHandle, "ladspa_descriptor");
+
+ if (!fn) {
+ std::cerr << "WARNING: LADSPAPluginFactory::discoverPlugins: No descriptor function in " << soName << std::endl;
+ return ;
+ }
+
+ const LADSPA_Descriptor *descriptor = 0;
+
+ int index = 0;
+ while ((descriptor = fn(index))) {
+
+#ifdef HAVE_LIBLRDF
+ char * def_uri = 0;
+ lrdf_defaults *defs = 0;
+
+ QString category = m_taxonomy[descriptor->UniqueID];
+
+ if (category == "" && descriptor->Name != 0) {
+ std::string name = descriptor->Name;
+ if (name.length() > 4 &&
+ name.substr(name.length() - 4) == " VST") {
+ category = "VST effects";
+ m_taxonomy[descriptor->UniqueID] = category;
+ }
+ }
+
+// std::cerr << "Plugin id is " << descriptor->UniqueID
+// << ", category is \"" << (category ? category : QString("(none)"))
+// << "\", name is " << descriptor->Name
+// << ", label is " << descriptor->Label
+// << std::endl;
+
+ def_uri = lrdf_get_default_uri(descriptor->UniqueID);
+ if (def_uri) {
+ defs = lrdf_get_setting_values(def_uri);
+ }
+
+ int controlPortNumber = 1;
+
+ for (unsigned long i = 0; i < descriptor->PortCount; i++) {
+
+ if (LADSPA_IS_PORT_CONTROL(descriptor->PortDescriptors[i])) {
+
+ if (def_uri && defs) {
+
+ for (int j = 0; j < defs->count; j++) {
+ if (defs->items[j].pid == controlPortNumber) {
+ // std::cerr << "Default for this port (" << defs->items[j].pid << ", " << defs->items[j].label << ") is " << defs->items[j].value << "; applying this to port number " << i << " with name " << descriptor->PortNames[i] << std::endl;
+ m_portDefaults[descriptor->UniqueID][i] =
+ defs->items[j].value;
+ }
+ }
+ }
+
+ ++controlPortNumber;
+ }
+ }
+#endif // HAVE_LIBLRDF
+
+ QString identifier = PluginIdentifier::createIdentifier
+ ("ladspa", soName, descriptor->Label);
+// std::cerr << "Added plugin identifier " << identifier << std::endl;
+ m_identifiers.push_back(identifier);
+
+ ++index;
+ }
+
+ if (dlclose(libraryHandle) != 0) {
+ std::cerr << "WARNING: LADSPAPluginFactory::discoverPlugins - can't unload " << libraryHandle << std::endl;
+ return ;
+ }
+}
+
+void
+LADSPAPluginFactory::generateFallbackCategories()
+{
+ std::vector<QString> pluginPath = getPluginPath();
+ std::vector<QString> path;
+
+ for (size_t i = 0; i < pluginPath.size(); ++i) {
+ if (pluginPath[i].contains("/lib/")) {
+ QString p(pluginPath[i]);
+ p.replace("/lib/", "/share/");
+ path.push_back(p);
+ // std::cerr << "LADSPAPluginFactory::generateFallbackCategories: path element " << p << std::endl;
+ }
+ path.push_back(pluginPath[i]);
+ // std::cerr << "LADSPAPluginFactory::generateFallbackCategories: path element " << pluginPath[i] << std::endl;
+ }
+
+ for (size_t i = 0; i < path.size(); ++i) {
+
+ QDir dir(path[i], "*.cat");
+
+// std::cerr << "LADSPAPluginFactory::generateFallbackCategories: directory " << path[i] << " has " << dir.count() << " .cat files" << std::endl;
+ for (unsigned int j = 0; j < dir.count(); ++j) {
+
+ QFile file(path[i] + "/" + dir[j]);
+
+ // std::cerr << "LADSPAPluginFactory::generateFallbackCategories: about to open " << (path[i] + "/" + dir[j]) << std::endl;
+
+ if (file.open(IO_ReadOnly)) {
+ // std::cerr << "...opened" << std::endl;
+ QTextStream stream(&file);
+ QString line;
+
+ while (!stream.eof()) {
+ line = stream.readLine();
+ // std::cerr << "line is: \"" << line << "\"" << std::endl;
+ QString id = line.section("::", 0, 0);
+ QString cat = line.section("::", 1, 1);
+ m_fallbackCategories[id] = cat;
+// std::cerr << "set id \"" << id << "\" to cat \"" << cat << "\"" << std::endl;
+ }
+ }
+ }
+ }
+}
+
+void
+LADSPAPluginFactory::generateTaxonomy(QString uri, QString base)
+{
+#ifdef HAVE_LIBLRDF
+ lrdf_uris *uris = lrdf_get_instances(uri.data());
+
+ if (uris != NULL) {
+ for (int i = 0; i < uris->count; ++i) {
+ m_taxonomy[lrdf_get_uid(uris->items[i])] = base;
+ }
+ lrdf_free_uris(uris);
+ }
+
+ uris = lrdf_get_subclasses(uri.data());
+
+ if (uris != NULL) {
+ for (int i = 0; i < uris->count; ++i) {
+ char *label = lrdf_get_label(uris->items[i]);
+ generateTaxonomy(uris->items[i],
+ base + (base.length() > 0 ? " > " : "") + label);
+ }
+ lrdf_free_uris(uris);
+ }
+#endif
+}
+
+}
+
+#endif // HAVE_LADSPA
+
diff --git a/src/sound/LADSPAPluginFactory.h b/src/sound/LADSPAPluginFactory.h
new file mode 100644
index 0000000..a5ec368
--- /dev/null
+++ b/src/sound/LADSPAPluginFactory.h
@@ -0,0 +1,104 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _LADSPA_PLUGIN_FACTORY_H_
+#define _LADSPA_PLUGIN_FACTORY_H_
+
+#ifdef HAVE_LADSPA
+
+#include "PluginFactory.h"
+#include <ladspa.h>
+
+#include <vector>
+#include <map>
+#include <set>
+#include <qstring.h>
+
+namespace Rosegarden
+{
+
+class LADSPAPluginInstance;
+
+class LADSPAPluginFactory : public PluginFactory
+{
+public:
+ virtual ~LADSPAPluginFactory();
+
+ virtual void discoverPlugins();
+
+ virtual const std::vector<QString> &getPluginIdentifiers() const;
+
+ virtual void enumeratePlugins(MappedObjectPropertyList &list);
+
+ virtual void populatePluginSlot(QString identifier, MappedPluginSlot &slot);
+
+ virtual RunnablePluginInstance *instantiatePlugin(QString identifier,
+ int instrumentId,
+ int position,
+ unsigned int sampleRate,
+ unsigned int blockSize,
+ unsigned int channels);
+
+ MappedObjectValue getPortMinimum(const LADSPA_Descriptor *, int port);
+ MappedObjectValue getPortMaximum(const LADSPA_Descriptor *, int port);
+ MappedObjectValue getPortDefault(const LADSPA_Descriptor *, int port);
+ int getPortDisplayHint(const LADSPA_Descriptor *, int port);
+
+protected:
+ LADSPAPluginFactory();
+ friend class PluginFactory;
+
+ virtual std::vector<QString> getPluginPath();
+
+#ifdef HAVE_LIBLRDF
+ virtual std::vector<QString> getLRDFPath(QString &baseUri);
+#endif
+
+ virtual void discoverPlugins(QString soName);
+ virtual void generateTaxonomy(QString uri, QString base);
+ virtual void generateFallbackCategories();
+
+ virtual void releasePlugin(RunnablePluginInstance *, QString);
+
+ virtual const LADSPA_Descriptor *getLADSPADescriptor(QString identifier);
+
+ void loadLibrary(QString soName);
+ void unloadLibrary(QString soName);
+ void unloadUnusedLibraries();
+
+ std::vector<QString> m_identifiers;
+
+ std::map<unsigned long, QString> m_taxonomy;
+ std::map<QString, QString> m_fallbackCategories;
+ std::map<unsigned long, std::map<int, float> > m_portDefaults;
+
+ std::set<RunnablePluginInstance *> m_instances;
+
+ typedef std::map<QString, void *> LibraryHandleMap;
+ LibraryHandleMap m_libraryHandles;
+};
+
+}
+
+#endif
+
+#endif
+
diff --git a/src/sound/LADSPAPluginInstance.cpp b/src/sound/LADSPAPluginInstance.cpp
new file mode 100644
index 0000000..e2b8890
--- /dev/null
+++ b/src/sound/LADSPAPluginInstance.cpp
@@ -0,0 +1,435 @@
+// -*- c-indentation-style:"stroustrup" c-basic-offset: 4 -*-
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include <iostream>
+#include <cassert>
+
+#include "LADSPAPluginInstance.h"
+#include "LADSPAPluginFactory.h"
+
+#ifdef HAVE_LADSPA
+
+//#define DEBUG_LADSPA 1
+
+namespace Rosegarden
+{
+
+
+LADSPAPluginInstance::LADSPAPluginInstance(PluginFactory *factory,
+ InstrumentId instrument,
+ QString identifier,
+ int position,
+ unsigned long sampleRate,
+ size_t blockSize,
+ int idealChannelCount,
+ const LADSPA_Descriptor* descriptor) :
+ RunnablePluginInstance(factory, identifier),
+ m_instrument(instrument),
+ m_position(position),
+ m_instanceCount(0),
+ m_descriptor(descriptor),
+ m_blockSize(blockSize),
+ m_sampleRate(sampleRate),
+ m_latencyPort(0),
+ m_run(false),
+ m_bypassed(false)
+{
+ init(idealChannelCount);
+
+ m_inputBuffers = new sample_t * [m_instanceCount * m_audioPortsIn.size()];
+ m_outputBuffers = new sample_t * [m_instanceCount * m_audioPortsOut.size()];
+
+ for (size_t i = 0; i < m_instanceCount * m_audioPortsIn.size(); ++i) {
+ m_inputBuffers[i] = new sample_t[blockSize];
+ }
+ for (size_t i = 0; i < m_instanceCount * m_audioPortsOut.size(); ++i) {
+ m_outputBuffers[i] = new sample_t[blockSize];
+ }
+
+ m_ownBuffers = true;
+
+ instantiate(sampleRate);
+ if (isOK()) {
+ connectPorts();
+ activate();
+ }
+}
+
+LADSPAPluginInstance::LADSPAPluginInstance(PluginFactory *factory,
+ InstrumentId instrument,
+ QString identifier,
+ int position,
+ unsigned long sampleRate,
+ size_t blockSize,
+ sample_t **inputBuffers,
+ sample_t **outputBuffers,
+ const LADSPA_Descriptor* descriptor) :
+ RunnablePluginInstance(factory, identifier),
+ m_instrument(instrument),
+ m_position(position),
+ m_instanceCount(0),
+ m_descriptor(descriptor),
+ m_blockSize(blockSize),
+ m_inputBuffers(inputBuffers),
+ m_outputBuffers(outputBuffers),
+ m_ownBuffers(false),
+ m_sampleRate(sampleRate),
+ m_latencyPort(0),
+ m_run(false),
+ m_bypassed(false)
+{
+ init();
+
+ instantiate(sampleRate);
+ if (isOK()) {
+ connectPorts();
+ activate();
+ }
+}
+
+
+void
+LADSPAPluginInstance::init(int idealChannelCount)
+{
+#ifdef DEBUG_LADSPA
+ std::cerr << "LADSPAPluginInstance::init(" << idealChannelCount << "): plugin has "
+ << m_descriptor->PortCount << " ports" << std::endl;
+#endif
+
+ // Discover ports numbers and identities
+ //
+ for (unsigned long i = 0; i < m_descriptor->PortCount; ++i) {
+ if (LADSPA_IS_PORT_AUDIO(m_descriptor->PortDescriptors[i])) {
+ if (LADSPA_IS_PORT_INPUT(m_descriptor->PortDescriptors[i])) {
+#ifdef DEBUG_LADSPA
+ std::cerr << "LADSPAPluginInstance::init: port " << i << " is audio in" << std::endl;
+#endif
+
+ m_audioPortsIn.push_back(i);
+ } else {
+#ifdef DEBUG_LADSPA
+ std::cerr << "LADSPAPluginInstance::init: port " << i << " is audio out" << std::endl;
+#endif
+
+ m_audioPortsOut.push_back(i);
+ }
+ } else
+ if (LADSPA_IS_PORT_CONTROL(m_descriptor->PortDescriptors[i])) {
+ if (LADSPA_IS_PORT_INPUT(m_descriptor->PortDescriptors[i])) {
+#ifdef DEBUG_LADSPA
+ std::cerr << "LADSPAPluginInstance::init: port " << i << " is control in" << std::endl;
+#endif
+
+ LADSPA_Data *data = new LADSPA_Data(0.0);
+ m_controlPortsIn.push_back(
+ std::pair<unsigned long, LADSPA_Data*>(i, data));
+ } else {
+#ifdef DEBUG_LADSPA
+ std::cerr << "LADSPAPluginInstance::init: port " << i << " is control out" << std::endl;
+#endif
+
+ LADSPA_Data *data = new LADSPA_Data(0.0);
+ m_controlPortsOut.push_back(
+ std::pair<unsigned long, LADSPA_Data*>(i, data));
+ if (!strcmp(m_descriptor->PortNames[i], "latency") ||
+ !strcmp(m_descriptor->PortNames[i], "_latency")) {
+#ifdef DEBUG_LADSPA
+ std::cerr << "Wooo! We have a latency port!" << std::endl;
+#endif
+
+ m_latencyPort = data;
+ }
+ }
+ }
+#ifdef DEBUG_LADSPA
+ else
+ std::cerr << "LADSPAPluginInstance::init - "
+ << "unrecognised port type" << std::endl;
+#endif
+
+ }
+
+ m_instanceCount = 1;
+
+ if (idealChannelCount > 0) {
+ if (m_audioPortsIn.size() == 1) {
+ // mono plugin: duplicate it if need be
+ m_instanceCount = idealChannelCount;
+ }
+ }
+}
+
+size_t
+LADSPAPluginInstance::getLatency()
+{
+ if (m_latencyPort) {
+ if (!m_run) {
+ for (int i = 0; i < getAudioInputCount(); ++i) {
+ for (int j = 0; j < m_blockSize; ++j) {
+ m_inputBuffers[i][j] = 0.f;
+ }
+ }
+ run(RealTime::zeroTime);
+ }
+ return *m_latencyPort;
+ }
+ return 0;
+}
+
+void
+LADSPAPluginInstance::silence()
+{
+ if (isOK()) {
+ deactivate();
+ activate();
+ }
+}
+
+void
+LADSPAPluginInstance::setIdealChannelCount(size_t channels)
+{
+ if (m_audioPortsIn.size() != 1 || channels == m_instanceCount) {
+ silence();
+ return ;
+ }
+
+ if (isOK()) {
+ deactivate();
+ }
+
+ //!!! don't we need to reallocate inputBuffers and outputBuffers?
+
+ cleanup();
+ m_instanceCount = channels;
+ instantiate(m_sampleRate);
+ if (isOK()) {
+ connectPorts();
+ activate();
+ }
+}
+
+
+LADSPAPluginInstance::~LADSPAPluginInstance()
+{
+#ifdef DEBUG_LADSPA
+ std::cerr << "LADSPAPluginInstance::~LADSPAPluginInstance" << std::endl;
+#endif
+
+ if (m_instanceHandles.size() != 0) { // "isOK()"
+ deactivate();
+ }
+
+ cleanup();
+
+ for (unsigned int i = 0; i < m_controlPortsIn.size(); ++i)
+ delete m_controlPortsIn[i].second;
+
+ for (unsigned int i = 0; i < m_controlPortsOut.size(); ++i)
+ delete m_controlPortsOut[i].second;
+
+ m_controlPortsIn.clear();
+ m_controlPortsOut.clear();
+
+ if (m_ownBuffers) {
+ for (size_t i = 0; i < m_audioPortsIn.size(); ++i) {
+ delete[] m_inputBuffers[i];
+ }
+ for (size_t i = 0; i < m_audioPortsOut.size(); ++i) {
+ delete[] m_outputBuffers[i];
+ }
+
+ delete[] m_inputBuffers;
+ delete[] m_outputBuffers;
+ }
+
+ m_audioPortsIn.clear();
+ m_audioPortsOut.clear();
+}
+
+
+void
+LADSPAPluginInstance::instantiate(unsigned long sampleRate)
+{
+#ifdef DEBUG_LADSPA
+ std::cout << "LADSPAPluginInstance::instantiate - plugin unique id = "
+ << m_descriptor->UniqueID << std::endl;
+#endif
+
+ if (!m_descriptor)
+ return ;
+
+ if (!m_descriptor->instantiate) {
+ std::cerr << "Bad plugin: plugin id " << m_descriptor->UniqueID
+ << ":" << m_descriptor->Label
+ << " has no instantiate method!" << std::endl;
+ return ;
+ }
+
+ for (int i = 0; i < m_instanceCount; ++i) {
+ m_instanceHandles.push_back
+ (m_descriptor->instantiate(m_descriptor, sampleRate));
+ }
+}
+
+void
+LADSPAPluginInstance::activate()
+{
+ if (!m_descriptor || !m_descriptor->activate)
+ return ;
+
+ for (std::vector<LADSPA_Handle>::iterator hi = m_instanceHandles.begin();
+ hi != m_instanceHandles.end(); ++hi) {
+ m_descriptor->activate(*hi);
+ }
+}
+
+void
+LADSPAPluginInstance::connectPorts()
+{
+ if (!m_descriptor || !m_descriptor->connect_port)
+ return ;
+
+ assert(sizeof(LADSPA_Data) == sizeof(float));
+ assert(sizeof(sample_t) == sizeof(float));
+
+ int inbuf = 0, outbuf = 0;
+
+ for (std::vector<LADSPA_Handle>::iterator hi = m_instanceHandles.begin();
+ hi != m_instanceHandles.end(); ++hi) {
+
+ for (unsigned int i = 0; i < m_audioPortsIn.size(); ++i) {
+ m_descriptor->connect_port(*hi,
+ m_audioPortsIn[i],
+ (LADSPA_Data *)m_inputBuffers[inbuf]);
+ ++inbuf;
+ }
+
+ for (unsigned int i = 0; i < m_audioPortsOut.size(); ++i) {
+ m_descriptor->connect_port(*hi,
+ m_audioPortsOut[i],
+ (LADSPA_Data *)m_outputBuffers[outbuf]);
+ ++outbuf;
+ }
+
+ // If there is more than one instance, they all share the same
+ // control port ins (and outs, for the moment, because we
+ // don't actually do anything with the outs anyway -- but they
+ // do have to be connected as the plugin can't know if they're
+ // not and will write to them anyway).
+
+ for (unsigned int i = 0; i < m_controlPortsIn.size(); ++i) {
+ m_descriptor->connect_port(*hi,
+ m_controlPortsIn[i].first,
+ m_controlPortsIn[i].second);
+ }
+
+ for (unsigned int i = 0; i < m_controlPortsOut.size(); ++i) {
+ m_descriptor->connect_port(*hi,
+ m_controlPortsOut[i].first,
+ m_controlPortsOut[i].second);
+ }
+ }
+}
+
+void
+LADSPAPluginInstance::setPortValue(unsigned int portNumber, float value)
+{
+ for (unsigned int i = 0; i < m_controlPortsIn.size(); ++i) {
+ if (m_controlPortsIn[i].first == portNumber) {
+ LADSPAPluginFactory *f = dynamic_cast<LADSPAPluginFactory *>(m_factory);
+ if (f) {
+ if (value < f->getPortMinimum(m_descriptor, portNumber)) {
+ value = f->getPortMinimum(m_descriptor, portNumber);
+ }
+ if (value > f->getPortMaximum(m_descriptor, portNumber)) {
+ value = f->getPortMaximum(m_descriptor, portNumber);
+ }
+ }
+ (*m_controlPortsIn[i].second) = value;
+ }
+ }
+}
+
+float
+LADSPAPluginInstance::getPortValue(unsigned int portNumber)
+{
+ for (unsigned int i = 0; i < m_controlPortsIn.size(); ++i) {
+ if (m_controlPortsIn[i].first == portNumber) {
+ return (*m_controlPortsIn[i].second);
+ }
+ }
+
+ return 0.0;
+}
+
+void
+LADSPAPluginInstance::run(const RealTime &)
+{
+ if (!m_descriptor || !m_descriptor->run)
+ return ;
+
+ for (std::vector<LADSPA_Handle>::iterator hi = m_instanceHandles.begin();
+ hi != m_instanceHandles.end(); ++hi) {
+ m_descriptor->run(*hi, m_blockSize);
+ }
+
+ m_run = true;
+}
+
+void
+LADSPAPluginInstance::deactivate()
+{
+ if (!m_descriptor || !m_descriptor->deactivate)
+ return ;
+
+ for (std::vector<LADSPA_Handle>::iterator hi = m_instanceHandles.begin();
+ hi != m_instanceHandles.end(); ++hi) {
+ m_descriptor->deactivate(*hi);
+ }
+}
+
+void
+LADSPAPluginInstance::cleanup()
+{
+ if (!m_descriptor)
+ return ;
+
+ if (!m_descriptor->cleanup) {
+ std::cerr << "Bad plugin: plugin id " << m_descriptor->UniqueID
+ << ":" << m_descriptor->Label
+ << " has no cleanup method!" << std::endl;
+ return ;
+ }
+
+ for (std::vector<LADSPA_Handle>::iterator hi = m_instanceHandles.begin();
+ hi != m_instanceHandles.end(); ++hi) {
+ m_descriptor->cleanup(*hi);
+ }
+
+ m_instanceHandles.clear();
+}
+
+
+
+}
+
+#endif // HAVE_LADSPA
+
+
diff --git a/src/sound/LADSPAPluginInstance.h b/src/sound/LADSPAPluginInstance.h
new file mode 100644
index 0000000..9654cfb
--- /dev/null
+++ b/src/sound/LADSPAPluginInstance.h
@@ -0,0 +1,137 @@
+// -*- c-indentation-style:"stroustrup" c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include <vector>
+#include <set>
+#include <qstring.h>
+#include "Instrument.h"
+
+#ifndef _LADSPAPLUGININSTANCE_H_
+#define _LADSPAPLUGININSTANCE_H_
+
+#ifdef HAVE_LADSPA
+
+#include <ladspa.h>
+#include "RunnablePluginInstance.h"
+
+namespace Rosegarden
+{
+
+// LADSPA plugin instance. LADSPA is a variable block size API, but
+// for one reason and another it's more convenient to use a fixed
+// block size in this wrapper.
+//
+class LADSPAPluginInstance : public RunnablePluginInstance
+{
+public:
+ virtual ~LADSPAPluginInstance();
+
+ virtual bool isOK() const { return m_instanceHandles.size() != 0; }
+
+ InstrumentId getInstrument() const { return m_instrument; }
+ virtual QString getIdentifier() const { return m_identifier; }
+ int getPosition() const { return m_position; }
+
+ virtual void run(const RealTime &rt);
+
+ virtual void setPortValue(unsigned int portNumber, float value);
+ virtual float getPortValue(unsigned int portNumber);
+
+ virtual size_t getBufferSize() { return m_blockSize; }
+ virtual size_t getAudioInputCount() { return m_instanceCount * m_audioPortsIn.size(); }
+ virtual size_t getAudioOutputCount() { return m_instanceCount * m_audioPortsOut.size(); }
+ virtual sample_t **getAudioInputBuffers() { return m_inputBuffers; }
+ virtual sample_t **getAudioOutputBuffers() { return m_outputBuffers; }
+
+ virtual bool isBypassed() const { return m_bypassed; }
+ virtual void setBypassed(bool bypassed) { m_bypassed = bypassed; }
+
+ virtual size_t getLatency();
+
+ virtual void silence();
+ virtual void setIdealChannelCount(size_t channels); // may re-instantiate
+
+protected:
+ // To be constructed only by LADSPAPluginFactory
+ friend class LADSPAPluginFactory;
+
+ // Constructor that creates the buffers internally
+ //
+ LADSPAPluginInstance(PluginFactory *factory,
+ InstrumentId instrument,
+ QString identifier,
+ int position,
+ unsigned long sampleRate,
+ size_t blockSize,
+ int idealChannelCount,
+ const LADSPA_Descriptor* descriptor);
+
+ // Constructor that uses shared buffers
+ //
+ LADSPAPluginInstance(PluginFactory *factory,
+ InstrumentId instrument,
+ QString identifier,
+ int position,
+ unsigned long sampleRate,
+ size_t blockSize,
+ sample_t **inputBuffers,
+ sample_t **outputBuffers,
+ const LADSPA_Descriptor* descriptor);
+
+ void init(int idealChannelCount = 0);
+ void instantiate(unsigned long sampleRate);
+ void cleanup();
+ void activate();
+ void deactivate();
+
+ // Connection of data (and behind the scenes control) ports
+ //
+ void connectPorts();
+
+ InstrumentId m_instrument;
+ int m_position;
+ std::vector<LADSPA_Handle> m_instanceHandles;
+ size_t m_instanceCount;
+ const LADSPA_Descriptor *m_descriptor;
+
+ std::vector<std::pair<unsigned long, LADSPA_Data*> > m_controlPortsIn;
+ std::vector<std::pair<unsigned long, LADSPA_Data*> > m_controlPortsOut;
+
+ std::vector<int> m_audioPortsIn;
+ std::vector<int> m_audioPortsOut;
+
+ size_t m_blockSize;
+ sample_t **m_inputBuffers;
+ sample_t **m_outputBuffers;
+ bool m_ownBuffers;
+ size_t m_sampleRate;
+ float *m_latencyPort;
+ bool m_run;
+
+ bool m_bypassed;
+};
+
+}
+
+#endif // HAVE_LADSPA
+
+#endif // _LADSPAPLUGININSTANCE_H_
+
diff --git a/src/sound/MP3AudioFile.cpp b/src/sound/MP3AudioFile.cpp
new file mode 100644
index 0000000..700169f
--- /dev/null
+++ b/src/sound/MP3AudioFile.cpp
@@ -0,0 +1,329 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "MP3AudioFile.h"
+
+#ifdef HAVE_LIBMAD
+
+#include <mad.h>
+
+namespace Rosegarden
+{
+
+
+/*
+ * This is a private message structure. A generic pointer to this structure
+ * is passed to each of the callback functions. Put here any data you need
+ * to access from within the callbacks.
+ */
+
+struct player
+{
+ unsigned char const *start;
+ unsigned long length;
+ //int default_driver;
+ //ao_device *device;
+ //ao_sample_format format;
+ //class SoundTouch *touch;
+};
+
+
+
+MP3AudioFile::MP3AudioFile(const unsigned int &id,
+ const std::string &name,
+ const std::string &fileName):
+ AudioFile(id, name, fileName)
+{
+ m_type = MP3;
+}
+
+
+MP3AudioFile::MP3AudioFile(const std::string &fileName,
+ unsigned int /*channels*/,
+ unsigned int /*sampleRate*/,
+ unsigned int /*bytesPerSecond*/,
+ unsigned int /*bytesPerSample*/,
+ unsigned int /*bitsPerSample*/):
+ AudioFile(0, std::string(""), fileName)
+{
+ m_type = MP3;
+}
+
+
+MP3AudioFile::~MP3AudioFile()
+{}
+
+bool
+MP3AudioFile::open()
+{
+ // if already open
+ if (m_inFile && (*m_inFile))
+ return true;
+
+ m_inFile = new std::ifstream(m_fileName.c_str(),
+ std::ios::in | std::ios::binary);
+
+ if (!(*m_inFile)) {
+ m_type = UNKNOWN;
+ return false;
+ }
+
+ // Get the file size and store it for comparison later
+ m_fileSize = m_fileInfo->size();
+
+ try {
+ parseHeader();
+ } catch (BadSoundFileException s) {
+ throw(s);
+ }
+
+ return true;
+}
+
+bool
+MP3AudioFile::write()
+{
+ return false;
+}
+
+void
+MP3AudioFile::close()
+{}
+
+void
+MP3AudioFile::parseHeader()
+{
+ const std::string MP3_TAG("TAG");
+ if (m_inFile == 0)
+ return ;
+
+ // store size conveniently
+ m_fileSize = m_fileInfo->size();
+
+ if (m_fileSize == 0) {
+ std::string mess = std::string("\"") + m_fileName +
+ std::string("\" is empty - invalid MP3 file");
+ throw(mess);
+ }
+
+ // seek to beginning
+ m_inFile->seekg(0, std::ios::beg);
+
+ // get some header information
+ //
+ const int bufferLength = 3096;
+ std::string hS = getBytes(bufferLength);
+ bool foundMP3 = false;
+
+ for (unsigned int i = 0; i < hS.length() - 1; ++i) {
+ if ((hS[i] & 0xff) == 0xff && (hS[i + 1] & 0xe0) == 0xe0) {
+ foundMP3 = true;
+ break;
+ }
+ }
+
+ if (foundMP3 == false || (int)hS.length() < bufferLength) {
+ std::string mess = std::string("\"") + m_fileName +
+ std::string("\" doesn't appear to be a valid MP3 file");
+ throw(mess);
+ }
+
+ // guess most likely values - these are reset during decoding
+ m_channels = 2;
+ m_sampleRate = 44100;
+
+ mad_synth synth;
+ mad_frame frame;
+ mad_stream stream;
+
+ mad_synth_init(&synth);
+ mad_stream_init(&stream);
+ mad_frame_init(&frame);
+
+ /*
+ mad_stream_buffer(&stream, hS.data(), hS.length());
+
+ if (mad_header_decode(&frame.header, &stream) == -1)
+ {
+ throw("Can't decode header");
+ }
+
+ mad_frame_decode(&frame, &stream);
+
+ m_sampleRate = frame.header.samplerate;
+
+ mad_synth_frame(&synth, &frame);
+ struct mad_pcm *pcm = &synth.pcm;
+
+ m_channels = pcm->channels;
+ */
+
+ /*
+ struct player player;
+ struct mad_decoder decoder;
+ struct stat stat;
+ void *fdm;
+ int result;
+
+ if (fstat(fd, &stat) == -1 ||
+ stat.st_size == 0)
+ return 0;
+
+ fdm = mmap(0, stat.st_size, PROT_READ, MAP_SHARED, fd, 0);
+ if (fdm == MAP_FAILED) {
+ fprintf(stderr, "mmap failed, aborting...\n");
+ return 0;
+ }
+
+ player.start = (unsigned char *)fdm;
+ player.length = stat.st_size;
+ player.default_driver = ao_default_driver_id();
+ player.device = NULL;
+ player.touch = new SoundTouch;
+ player.touch->setTempo(tempo);
+ player.touch->setPitch(pitch);
+ mad_decoder_init(&decoder, &player,
+ input, 0 , 0 , process_output,
+ decode_error, 0);
+
+ result = mad_decoder_run(&decoder, MAD_DECODER_MODE_SYNC);
+ mad_decoder_finish(&decoder);
+ delete player.touch;
+ ao_close(player.device);
+ if (munmap((void *)player.start, stat.st_size) == -1)
+ return 4;
+
+ return result;
+ */
+}
+
+std::streampos
+MP3AudioFile::getDataOffset()
+{
+ return 0;
+}
+
+bool
+MP3AudioFile::scanTo(const RealTime & /*time*/)
+{
+ return false;
+}
+
+bool
+MP3AudioFile::scanTo(std::ifstream * /*file*/, const RealTime & /*time*/)
+{
+ return false;
+}
+
+
+// Scan forward in a file by a certain amount of time
+//
+bool
+MP3AudioFile::scanForward(const RealTime & /*time*/)
+{
+ return false;
+}
+
+bool
+MP3AudioFile::scanForward(std::ifstream * /*file*/, const RealTime & /*time*/)
+{
+ return false;
+}
+
+
+// Return a number of samples - caller will have to
+// de-interleave n-channel samples themselves.
+//
+std::string
+MP3AudioFile::getSampleFrames(std::ifstream * /*file*/,
+ unsigned int /*frames*/)
+{
+ return "";
+}
+
+unsigned int
+MP3AudioFile::getSampleFrames(std::ifstream * /*file*/,
+ char * /* buf */,
+ unsigned int /*frames*/)
+{
+ return 0;
+}
+
+std::string
+MP3AudioFile::getSampleFrames(unsigned int /*frames*/)
+{
+ return "";
+}
+
+
+// Return a number of (possibly) interleaved samples
+// over a time slice from current file pointer position.
+//
+std::string
+MP3AudioFile::getSampleFrameSlice(std::ifstream * /*file*/,
+ const RealTime & /*time*/)
+{
+ return "";
+}
+
+std::string
+MP3AudioFile::getSampleFrameSlice(const RealTime & /*time*/)
+{
+ return "";
+}
+
+
+// Append a string of samples to an already open (for writing)
+// audio file.
+//
+bool
+MP3AudioFile::appendSamples(const std::string & /*buffer*/)
+{
+ return false;
+}
+
+bool
+MP3AudioFile::appendSamples(const char * /*buffer*/, unsigned int)
+{
+ return false;
+}
+
+
+// Get the length of the sample in Seconds/Microseconds
+//
+RealTime
+MP3AudioFile::getLength()
+{
+ return RealTime(0, 0);
+}
+
+void
+MP3AudioFile::printStats()
+{}
+
+
+
+
+
+}
+
+#endif // HAVE_LIBMAD
diff --git a/src/sound/MP3AudioFile.h b/src/sound/MP3AudioFile.h
new file mode 100644
index 0000000..2423cd9
--- /dev/null
+++ b/src/sound/MP3AudioFile.h
@@ -0,0 +1,128 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _MP3AUDIOFILE_H_
+#define _MP3AUDIOFILE_H_
+
+#ifdef HAVE_LIBMAD
+
+#include "AudioFile.h"
+
+namespace Rosegarden
+{
+
+class MP3AudioFile : public AudioFile
+{
+public:
+ MP3AudioFile(const unsigned int &id,
+ const std::string &name,
+ const std::string &fileName);
+
+ MP3AudioFile(const std::string &fileName,
+ unsigned int channels,
+ unsigned int sampleRate,
+ unsigned int bytesPerSecond,
+ unsigned int bytesPerSample,
+ unsigned int bitsPerSample);
+
+ ~MP3AudioFile();
+
+ // Override these methods for the WAV
+ //
+ virtual bool open();
+ virtual bool write();
+ virtual void close();
+
+ // Show the information we have on this file
+ //
+ virtual void printStats();
+
+ // Get all header information
+ //
+ void parseHeader();
+
+ // Offset to start of sample data
+ //
+ virtual std::streampos getDataOffset();
+
+ // Peak file name
+ //
+ virtual std::string getPeakFilename()
+ { return (m_fileName + std::string(".pk")); }
+
+ // scan time was valid and successful.
+ //
+ virtual bool scanTo(const RealTime &time);
+ virtual bool scanTo(std::ifstream *file, const RealTime &time);
+
+ // Scan forward in a file by a certain amount of time
+ //
+ virtual bool scanForward(const RealTime &time);
+ virtual bool scanForward(std::ifstream *file, const RealTime &time);
+
+ // Return a number of samples - caller will have to
+ // de-interleave n-channel samples themselves.
+ //
+ virtual std::string getSampleFrames(std::ifstream *file,
+ unsigned int frames);
+ virtual unsigned int getSampleFrames(std::ifstream *file,
+ char *buf,
+ unsigned int frames);
+ virtual std::string getSampleFrames(unsigned int frames);
+
+ // Return a number of (possibly) interleaved samples
+ // over a time slice from current file pointer position.
+ //
+ virtual std::string getSampleFrameSlice(std::ifstream *file,
+ const RealTime &time);
+ virtual std::string getSampleFrameSlice(const RealTime &time);
+
+ // Append a string of samples to an already open (for writing)
+ // audio file.
+ //
+ virtual bool appendSamples(const std::string &buffer);
+ virtual bool appendSamples(const char *buffer, unsigned int samples);
+
+ // Get the length of the sample in Seconds/Microseconds
+ //
+ virtual RealTime getLength();
+
+ virtual unsigned int getBytesPerFrame() { return 0; }
+
+
+ //!!! NOT IMPLEMENTED YET
+ //
+ virtual bool decode(const unsigned char *sourceData,
+ size_t sourceBytes,
+ size_t targetSampleRate,
+ size_t targetChannels,
+ size_t targetFrames,
+ std::vector<float *> &targetData,
+ bool addToResultBuffers = false) { return false; }
+
+};
+
+}
+
+#endif // HAVE_LIBMAD
+
+#endif // _MP3AUDIOFILE_H_
+
diff --git a/src/sound/MappedCommon.h b/src/sound/MappedCommon.h
new file mode 100644
index 0000000..5ef5487
--- /dev/null
+++ b/src/sound/MappedCommon.h
@@ -0,0 +1,68 @@
+// -*- c-indentation-style:"stroustrup" c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _MAPPEDCOMMON_H_
+#define _MAPPEDCOMMON_H_
+
+// Some Mapped types that gui and sound libraries use to communicate
+// plugin and Studio information. Putting them here so we can change
+// MappedStudio regularly without having to rebuild the gui.
+//
+#include <vector>
+
+#include <qstring.h>
+#include <qdatastream.h>
+
+namespace Rosegarden
+{
+
+typedef int MappedObjectId;
+typedef QString MappedObjectProperty;
+typedef float MappedObjectValue;
+
+// typedef QValueVector<MappedObjectProperty> MappedObjectPropertyList;
+// replaced with a std::vector<> for Qt2 compatibility
+
+typedef std::vector<MappedObjectId> MappedObjectIdList;
+typedef std::vector<MappedObjectProperty> MappedObjectPropertyList;
+typedef std::vector<MappedObjectValue> MappedObjectValueList;
+
+// The direction in which a port operates.
+//
+typedef enum
+{
+ ReadOnly, // input port
+ WriteOnly, // output port
+ Duplex
+} PortDirection;
+
+QDataStream& operator>>(QDataStream& s, MappedObjectIdList&);
+QDataStream& operator<<(QDataStream&, const MappedObjectIdList&);
+
+QDataStream& operator>>(QDataStream& s, MappedObjectPropertyList&);
+QDataStream& operator<<(QDataStream&, const MappedObjectPropertyList&);
+
+QDataStream& operator>>(QDataStream& s, MappedObjectValueList&);
+QDataStream& operator<<(QDataStream&, const MappedObjectValueList&);
+
+}
+
+#endif // _MAPPEDCOMMON_H_
diff --git a/src/sound/MappedComposition.cpp b/src/sound/MappedComposition.cpp
new file mode 100644
index 0000000..975fccf
--- /dev/null
+++ b/src/sound/MappedComposition.cpp
@@ -0,0 +1,216 @@
+// -*- c-indentation-style:"stroustrup" c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include <qdatastream.h>
+#include "MappedComposition.h"
+#include "MappedEvent.h"
+#include "SegmentPerformanceHelper.h"
+#include <iostream>
+
+namespace Rosegarden
+{
+
+using std::cerr;
+using std::cout;
+using std::endl;
+
+MappedComposition::~MappedComposition()
+{
+ clear();
+}
+
+// copy constructor
+MappedComposition::MappedComposition(const MappedComposition &mC):
+ std::multiset<MappedEvent *, MappedEvent::MappedEventCmp>()
+{
+ clear();
+
+ // deep copy
+ for (MappedComposition::const_iterator it = mC.begin(); it != mC.end(); it++)
+ this->insert(new MappedEvent(**it));
+
+}
+
+// Turn a MappedComposition into a QDataStream - MappedEvents can
+// stream themselves.
+//
+QDataStream&
+operator<<(QDataStream &dS, MappedComposition *mC)
+{
+ dS << int(mC->size());
+
+ for (MappedCompositionIterator it = mC->begin(); it != mC->end(); ++it )
+ dS << (*it);
+
+ return dS;
+}
+
+
+QDataStream&
+operator<<(QDataStream &dS, const MappedComposition &mC)
+{
+ dS << int(mC.size());
+
+ for (MappedComposition::const_iterator it = mC.begin(); it != mC.end(); ++it )
+ dS << (*it);
+
+ return dS;
+}
+
+
+// Turn a QDataStream into a MappedComposition
+//
+QDataStream&
+operator>>(QDataStream &dS, MappedComposition *mC)
+{
+ int sliceSize;
+ MappedEvent *mE;
+
+ dS >> sliceSize;
+
+ while (!dS.atEnd() && sliceSize) {
+ mE = new MappedEvent();
+ dS >> mE;
+
+ try {
+ mC->insert(mE);
+ } catch (...) {
+ ;
+ }
+
+ sliceSize--;
+
+ }
+
+#ifdef DEBUG_MAPPEDCOMPOSITION
+ if (sliceSize) {
+ cerr << "operator>> - wrong number of events received" << endl;
+ }
+#endif
+
+ return dS;
+}
+
+QDataStream&
+operator>>(QDataStream &dS, MappedComposition &mC)
+{
+ int sliceSize;
+ MappedEvent *mE;
+
+ dS >> sliceSize;
+
+ while (!dS.atEnd() && sliceSize) {
+ mE = new MappedEvent();
+
+ dS >> mE;
+
+ try {
+ mC.insert(mE);
+ } catch (...) {
+ ;
+ }
+
+ sliceSize--;
+
+ }
+
+#ifdef DEBUG_MAPPEDCOMPOSITION
+ if (sliceSize) {
+ cerr << "operator>> - wrong number of events received" << endl;
+ }
+#endif
+
+
+ return dS;
+}
+
+// Move the start time of this MappedComposition and all its events.
+// Actually - we have a special case for audio events at the moment..
+//
+//
+void
+MappedComposition::moveStartTime(const RealTime &mT)
+{
+ MappedCompositionIterator it;
+
+ for (it = this->begin(); it != this->end(); ++it) {
+ // Reset start time and duration
+ //
+ (*it)->setEventTime((*it)->getEventTime() + mT);
+ (*it)->setDuration((*it)->getDuration() - mT);
+
+ // For audio adjust the start index
+ //
+ if ((*it)->getType() == MappedEvent::Audio)
+ (*it)->setAudioStartMarker((*it)->getAudioStartMarker() + mT);
+ }
+
+ m_startTime = m_startTime + mT;
+ m_endTime = m_endTime + mT;
+
+}
+
+
+// Concatenate MappedComposition
+//
+MappedComposition&
+MappedComposition::operator+(const MappedComposition &mC)
+{
+ for (MappedComposition::const_iterator it = mC.begin(); it != mC.end(); it++)
+ this->insert(new MappedEvent(**it)); // deep copy
+
+ return *this;
+}
+
+// Assign (clear and deep copy)
+//
+MappedComposition&
+MappedComposition::operator=(const MappedComposition &mC)
+{
+ if (&mC == this)
+ return * this;
+
+ clear();
+
+ // deep copy
+ for (MappedComposition::const_iterator it = mC.begin(); it != mC.end(); it++)
+ this->insert(new MappedEvent(**it));
+
+ return *this;
+}
+
+void
+MappedComposition::clear()
+{
+ // Only clear if the events aren't persistent
+ //
+ for (MappedCompositionIterator it = this->begin(); it != this->end(); it++)
+ if (!(*it)->isPersistent())
+ delete (*it);
+
+ this->erase(this->begin(), this->end());
+}
+
+
+
+}
+
+
diff --git a/src/sound/MappedComposition.h b/src/sound/MappedComposition.h
new file mode 100644
index 0000000..bfa7c05
--- /dev/null
+++ b/src/sound/MappedComposition.h
@@ -0,0 +1,93 @@
+// -*- c-indentation-style:"stroustrup" c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#ifndef _MAPPEDCOMPOSITION_H_
+#define _MAPPEDCOMPOSITION_H_
+
+
+// MappedComposition is used with MappedEvent to create a sequence
+// of MIDI ready events ready for playing. The QDataStream operators
+// are a necessary part of the DCOP transmission process allowing
+// the whole class to be serialized. The core application is sent
+// a request specifying a time slice between given start and end
+// points which it fills with MappedEvents which are cut down
+// (sequencer suitable) versions of the core Events.
+//
+
+#include <Composition.h>
+#include "MappedEvent.h"
+#include <set>
+#include <qdatastream.h>
+
+namespace Rosegarden
+{
+
+class MappedComposition : public std::multiset<MappedEvent *,
+ MappedEvent::MappedEventCmp>
+{
+public:
+ MappedComposition():m_startTime(0, 0), m_endTime(0, 0) {;}
+
+ MappedComposition(const RealTime &sT,
+ const RealTime &eT):
+ m_startTime(sT), m_endTime(eT) {;}
+
+ MappedComposition(const MappedComposition &mC);
+
+ ~MappedComposition();
+
+ const RealTime getStartTime() const { return m_startTime; }
+ const RealTime getEndTime() const { return m_endTime; }
+ void setStartTime(const RealTime &sT) { m_startTime = sT; }
+ void setEndTime(const RealTime &eT) { m_endTime = eT; }
+
+ // When we're looping we want to be able to move the start
+ // time of MappedEvents around in this container
+ //
+ void moveStartTime(const RealTime &mT);
+
+ MappedComposition& operator+(const MappedComposition &mC);
+ MappedComposition& operator=(const MappedComposition &mC);
+
+ // This section is used for serialising this class over DCOP
+ //
+ //
+ friend QDataStream& operator>>(QDataStream &dS, MappedComposition *mC);
+ friend QDataStream& operator<<(QDataStream &dS, MappedComposition *mC);
+ friend QDataStream& operator>>(QDataStream &dS, MappedComposition &mC);
+ friend QDataStream& operator<<(QDataStream &dS, const MappedComposition &mC);
+
+ // Clear out
+ void clear();
+
+private:
+ RealTime m_startTime;
+ RealTime m_endTime;
+
+};
+
+typedef std::multiset<MappedEvent *, MappedEvent::MappedEventCmp>::iterator MappedCompositionIterator;
+
+
+}
+
+#endif // _MAPPEDCOMPOSITION_H_
diff --git a/src/sound/MappedDevice.cpp b/src/sound/MappedDevice.cpp
new file mode 100644
index 0000000..619be2a
--- /dev/null
+++ b/src/sound/MappedDevice.cpp
@@ -0,0 +1,250 @@
+// -*- c-indentation-style:"stroustrup" c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include "MappedDevice.h"
+#include "MappedInstrument.h"
+#include <iostream>
+
+namespace Rosegarden
+{
+
+MappedDevice::MappedDevice():
+ std::vector<MappedInstrument*>(),
+ m_id(Device::NO_DEVICE),
+ m_type(Device::Midi),
+ m_name("Unconfigured device"),
+ m_connection(""),
+ m_direction(MidiDevice::Play),
+ m_recording(false)
+{}
+
+MappedDevice::MappedDevice(DeviceId id,
+ Device::DeviceType type,
+ std::string name,
+ std::string connection):
+ std::vector<MappedInstrument*>(),
+ m_id(id),
+ m_type(type),
+ m_name(name),
+ m_connection(connection),
+ m_direction(MidiDevice::Play),
+ m_recording(false)
+{}
+
+MappedDevice::~MappedDevice()
+{}
+
+MappedDevice::MappedDevice(const MappedDevice &mD):
+ std::vector<MappedInstrument*>()
+{
+ clear();
+
+ for (MappedDeviceConstIterator it = mD.begin(); it != mD.end(); it++)
+ this->push_back(new MappedInstrument(**it));
+
+ m_id = mD.getId();
+ m_type = mD.getType();
+ m_name = mD.getName();
+ m_connection = mD.getConnection();
+ m_direction = mD.getDirection();
+ m_recording = mD.isRecording();
+}
+
+void
+MappedDevice::clear()
+{
+ MappedDeviceIterator it;
+
+ for (it = this->begin(); it != this->end(); it++)
+ delete (*it);
+
+ this->erase(this->begin(), this->end());
+}
+
+MappedDevice&
+MappedDevice::operator+(const MappedDevice &mD)
+{
+ for (MappedDeviceConstIterator it = mD.begin(); it != mD.end(); it++)
+ this->push_back(new MappedInstrument(**it));
+
+ return *this;
+}
+
+MappedDevice&
+MappedDevice::operator=(const MappedDevice &mD)
+{
+ if (&mD == this)
+ return * this;
+
+ clear();
+
+ for (MappedDeviceConstIterator it = mD.begin(); it != mD.end(); it++)
+ this->push_back(new MappedInstrument(**it));
+
+ m_id = mD.getId();
+ m_type = mD.getType();
+ m_name = mD.getName();
+ m_connection = mD.getConnection();
+ m_direction = mD.getDirection();
+ m_recording = mD.isRecording();
+
+ return *this;
+}
+
+
+QDataStream&
+operator>>(QDataStream &dS, MappedDevice *mD)
+{
+ int instruments = 0;
+ dS >> instruments;
+
+ MappedInstrument mI;
+ while (!dS.atEnd() && instruments) {
+ dS >> mI;
+ mD->push_back(new MappedInstrument(mI));
+ instruments--;
+ }
+
+ QString name;
+ unsigned int id, dType;
+ QString connection;
+ unsigned int direction;
+ unsigned int recording;
+
+ dS >> id;
+ dS >> dType;
+ dS >> name;
+ dS >> connection;
+ dS >> direction;
+ dS >> recording;
+ mD->setId(id);
+ mD->setType(Device::DeviceType(dType));
+ mD->setName(std::string(name.data()));
+ mD->setConnection(connection.data());
+ mD->setDirection(MidiDevice::DeviceDirection(direction));
+ mD->setRecording((bool)recording);
+
+#ifdef DEBUG_MAPPEDDEVICE
+
+ if (instruments) {
+ std::cerr << "MappedDevice::operator>> - "
+ << "wrong number of events received" << std::endl;
+ }
+#endif
+
+ return dS;
+}
+
+
+QDataStream&
+operator>>(QDataStream &dS, MappedDevice &mD)
+{
+ int instruments;
+ dS >> instruments;
+
+ MappedInstrument mI;
+
+ while (!dS.atEnd() && instruments) {
+ dS >> mI;
+ mD.push_back(new MappedInstrument(mI));
+ instruments--;
+ }
+
+ unsigned int id, dType;
+ QString name;
+ QString connection;
+ unsigned int direction;
+ unsigned int recording;
+
+ dS >> id;
+ dS >> dType;
+ dS >> name;
+ dS >> connection;
+ dS >> direction;
+ dS >> recording;
+ mD.setId(id);
+ mD.setType(Device::DeviceType(dType));
+ mD.setName(std::string(name.data()));
+ mD.setConnection(connection.data());
+ mD.setDirection(MidiDevice::DeviceDirection(direction));
+ mD.setRecording((bool)recording);
+
+#ifdef DEBUG_MAPPEDDEVICE
+
+ if (instruments) {
+ std::cerr << "MappedDevice::operator>> - "
+ << "wrong number of events received" << std::endl;
+ }
+#endif
+
+ return dS;
+}
+
+QDataStream&
+operator<<(QDataStream &dS, MappedDevice *mD)
+{
+ dS << (int)mD->size();
+
+ for (MappedDeviceIterator it = mD->begin(); it != mD->end(); it++)
+ dS << (*it);
+
+ dS << (unsigned int)(mD->getId());
+ dS << (int)(mD->getType());
+ dS << QString(mD->getName().c_str());
+ dS << QString(mD->getConnection().c_str());
+ dS << mD->getDirection();
+ dS << (unsigned int)(mD->isRecording());
+
+#ifdef DEBUG_MAPPEDDEVICE
+
+ std::cerr << "MappedDevice::operator>> - wrote \"" << mD->getConnection() << "\""
+ << std::endl;
+#endif
+
+ return dS;
+}
+
+QDataStream&
+operator<<(QDataStream &dS, const MappedDevice &mD)
+{
+ dS << (int)mD.size();
+
+ for (MappedDeviceConstIterator it = mD.begin(); it != mD.end(); it++)
+ dS << (*it);
+
+ dS << (unsigned int)(mD.getId());
+ dS << (int)(mD.getType());
+ dS << QString(mD.getName().c_str());
+ dS << QString(mD.getConnection().c_str());
+ dS << mD.getDirection();
+ dS << (unsigned int)(mD.isRecording());
+
+#ifdef DEBUG_MAPPEDDEVICE
+
+ std::cerr << "MappedDevice::operator>> - wrote \"" << mD.getConnection() << "\""
+ << std::endl;
+#endif
+
+ return dS;
+}
+
+}
+
diff --git a/src/sound/MappedDevice.h b/src/sound/MappedDevice.h
new file mode 100644
index 0000000..f53bb37
--- /dev/null
+++ b/src/sound/MappedDevice.h
@@ -0,0 +1,103 @@
+// -*- c-indentation-style:"stroustrup" c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include <string>
+#include <vector>
+
+#include <qdatastream.h>
+
+#include "Device.h"
+#include "MidiDevice.h"
+#include "MappedCommon.h"
+
+#ifndef _MAPPEDDEVICE_H_
+#define _MAPPEDDEVICE_H_
+
+// A DCOP wrapper to get MappedInstruments across to the GUI
+//
+
+namespace Rosegarden
+{
+
+class MappedInstrument;
+
+class MappedDevice : public std::vector<MappedInstrument*>
+{
+public:
+ MappedDevice();
+ MappedDevice(DeviceId id,
+ Device::DeviceType type,
+ std::string name,
+ std::string connection = "");
+
+ MappedDevice(const MappedDevice &mD);
+ ~MappedDevice();
+
+ // Clear down
+ //
+ void clear();
+
+ MappedDevice& operator+(const MappedDevice &mD);
+ MappedDevice& operator=(const MappedDevice &mD);
+
+ friend QDataStream& operator>>(QDataStream &dS, MappedDevice *mD);
+ friend QDataStream& operator<<(QDataStream &dS, MappedDevice *mD);
+ friend QDataStream& operator>>(QDataStream &dS, MappedDevice &mD);
+ friend QDataStream& operator<<(QDataStream &dS, const MappedDevice &mD);
+
+ std::string getName() const { return m_name; }
+ void setName(const std::string &name) { m_name = name; }
+
+ DeviceId getId() const { return m_id; }
+ void setId(DeviceId id) { m_id = id; }
+
+ Device::DeviceType getType() const { return m_type; }
+ void setType(Device::DeviceType type) { m_type = type; }
+
+ std::string getConnection() const { return m_connection; }
+ void setConnection(std::string connection) { m_connection = connection; }
+
+ MidiDevice::DeviceDirection getDirection() const { return m_direction; }
+ void setDirection(MidiDevice::DeviceDirection direction) { m_direction = direction; }
+
+ bool isRecording() const { return m_recording; }
+ void setRecording(bool recording) { m_recording = recording; }
+
+protected:
+
+ DeviceId m_id;
+ Device::DeviceType m_type;
+ std::string m_name;
+ std::string m_connection;
+ MidiDevice::DeviceDirection m_direction;
+ bool m_recording;
+};
+
+typedef std::vector<MappedInstrument*>::const_iterator
+ MappedDeviceConstIterator;
+
+typedef std::vector<MappedInstrument*>::iterator
+ MappedDeviceIterator;
+
+}
+
+#endif // _MAPPEDDEVICE_H_
+
diff --git a/src/sound/MappedEvent.cpp b/src/sound/MappedEvent.cpp
new file mode 100644
index 0000000..9b4ccab
--- /dev/null
+++ b/src/sound/MappedEvent.cpp
@@ -0,0 +1,593 @@
+// -*- c-indentation-style:"stroustrup" c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include <qdir.h>
+#include <qfile.h>
+#include <qfileinfo.h>
+
+#include <kstddirs.h>
+
+#include "MappedEvent.h"
+#include "BaseProperties.h"
+#include "Midi.h"
+#include "MidiTypes.h"
+
+#define DEBUG_MAPPEDEVENT 1
+
+namespace Rosegarden
+{
+
+MappedEvent::MappedEvent(InstrumentId id,
+ const Event &e,
+ const RealTime &eventTime,
+ const RealTime &duration):
+ m_trackId(0),
+ m_instrument(id),
+ m_type(MidiNote),
+ m_data1(0),
+ m_data2(0),
+ m_eventTime(eventTime),
+ m_duration(duration),
+ m_audioStartMarker(0, 0),
+ m_dataBlockId(0),
+ m_isPersistent(false),
+ m_runtimeSegmentId( -1),
+ m_autoFade(false),
+ m_fadeInTime(RealTime::zeroTime),
+ m_fadeOutTime(RealTime::zeroTime),
+ m_recordedChannel(0),
+ m_recordedDevice(0)
+
+{
+ try {
+
+ // For each event type, we set the properties in a particular
+ // order: first the type, then whichever of data1 and data2 fits
+ // less well with its default value. This way if one throws an
+ // exception for no data, we still have a good event with the
+ // defaults set.
+
+ if (e.isa(Note::EventType)) {
+ m_type = MidiNoteOneShot;
+ long v = MidiMaxValue;
+ e.get<Int>(BaseProperties::VELOCITY, v);
+ m_data2 = v;
+ m_data1 = e.get<Int>(BaseProperties::PITCH);
+ } else if (e.isa(PitchBend::EventType)) {
+ m_type = MidiPitchBend;
+ PitchBend pb(e);
+ m_data1 = pb.getMSB();
+ m_data2 = pb.getLSB();
+ } else if (e.isa(Controller::EventType)) {
+ m_type = MidiController;
+ Controller c(e);
+ m_data1 = c.getNumber();
+ m_data2 = c.getValue();
+ } else if (e.isa(ProgramChange::EventType)) {
+ m_type = MidiProgramChange;
+ ProgramChange pc(e);
+ m_data1 = pc.getProgram();
+ } else if (e.isa(KeyPressure::EventType)) {
+ m_type = MidiKeyPressure;
+ KeyPressure kp(e);
+ m_data1 = kp.getPitch();
+ m_data2 = kp.getPressure();
+ } else if (e.isa(ChannelPressure::EventType)) {
+ m_type = MidiChannelPressure;
+ ChannelPressure cp(e);
+ m_data1 = cp.getPressure();
+ } else if (e.isa(SystemExclusive::EventType)) {
+ m_type = MidiSystemMessage;
+ m_data1 = MIDI_SYSTEM_EXCLUSIVE;
+ SystemExclusive s(e);
+ std::string dataBlock = s.getRawData();
+ DataBlockRepository::getInstance()->registerDataBlockForEvent(dataBlock, this);
+ } else {
+ m_type = InvalidMappedEvent;
+ }
+ } catch (MIDIValueOutOfRange r) {
+
+#ifdef DEBUG_MAPPEDEVENT
+ std::cerr << "MIDI value out of range in MappedEvent ctor"
+ << std::endl;
+#else
+
+ ;
+#endif
+
+ } catch (Event::NoData d) {
+
+#ifdef DEBUG_MAPPEDEVENT
+ std::cerr << "Caught Event::NoData in MappedEvent ctor, message is:"
+ << std::endl << d.getMessage() << std::endl;
+#else
+
+ ;
+#endif
+
+ } catch (Event::BadType b) {
+
+#ifdef DEBUG_MAPPEDEVENT
+ std::cerr << "Caught Event::BadType in MappedEvent ctor, message is:"
+ << std::endl << b.getMessage() << std::endl;
+#else
+
+ ;
+#endif
+
+ } catch (SystemExclusive::BadEncoding e) {
+
+#ifdef DEBUG_MAPPEDEVENT
+ std::cerr << "Caught bad SysEx encoding in MappedEvent ctor"
+ << std::endl;
+#else
+
+ ;
+#endif
+
+ }
+}
+
+bool
+operator<(const MappedEvent &a, const MappedEvent &b)
+{
+ return a.getEventTime() < b.getEventTime();
+}
+
+MappedEvent&
+MappedEvent::operator=(const MappedEvent &mE)
+{
+ if (&mE == this)
+ return * this;
+
+ m_trackId = mE.getTrackId();
+ m_instrument = mE.getInstrument();
+ m_type = mE.getType();
+ m_data1 = mE.getData1();
+ m_data2 = mE.getData2();
+ m_eventTime = mE.getEventTime();
+ m_duration = mE.getDuration();
+ m_audioStartMarker = mE.getAudioStartMarker();
+ m_dataBlockId = mE.getDataBlockId();
+ m_runtimeSegmentId = mE.getRuntimeSegmentId();
+ m_autoFade = mE.isAutoFading();
+ m_fadeInTime = mE.getFadeInTime();
+ m_fadeOutTime = mE.getFadeOutTime();
+ m_recordedChannel = mE.getRecordedChannel();
+ m_recordedDevice = mE.getRecordedDevice();
+
+ return *this;
+}
+
+// Do we use this? It looks dangerous so just commenting it out - rwb
+//
+//const size_t MappedEvent::streamedSize = 12 * sizeof(unsigned int);
+
+QDataStream&
+operator<<(QDataStream &dS, MappedEvent *mE)
+{
+ dS << (unsigned int)mE->getTrackId();
+ dS << (unsigned int)mE->getInstrument();
+ dS << (unsigned int)mE->getType();
+ dS << (unsigned int)mE->getData1();
+ dS << (unsigned int)mE->getData2();
+ dS << (unsigned int)mE->getEventTime().sec;
+ dS << (unsigned int)mE->getEventTime().nsec;
+ dS << (unsigned int)mE->getDuration().sec;
+ dS << (unsigned int)mE->getDuration().nsec;
+ dS << (unsigned int)mE->getAudioStartMarker().sec;
+ dS << (unsigned int)mE->getAudioStartMarker().nsec;
+ dS << (unsigned long)mE->getDataBlockId();
+ dS << mE->getRuntimeSegmentId();
+ dS << (unsigned int)mE->isAutoFading();
+ dS << (unsigned int)mE->getFadeInTime().sec;
+ dS << (unsigned int)mE->getFadeInTime().nsec;
+ dS << (unsigned int)mE->getFadeOutTime().sec;
+ dS << (unsigned int)mE->getFadeOutTime().nsec;
+ dS << (unsigned int)mE->getRecordedChannel();
+ dS << (unsigned int)mE->getRecordedDevice();
+
+ return dS;
+}
+
+QDataStream&
+operator<<(QDataStream &dS, const MappedEvent &mE)
+{
+ dS << (unsigned int)mE.getTrackId();
+ dS << (unsigned int)mE.getInstrument();
+ dS << (unsigned int)mE.getType();
+ dS << (unsigned int)mE.getData1();
+ dS << (unsigned int)mE.getData2();
+ dS << (unsigned int)mE.getEventTime().sec;
+ dS << (unsigned int)mE.getEventTime().nsec;
+ dS << (unsigned int)mE.getDuration().sec;
+ dS << (unsigned int)mE.getDuration().nsec;
+ dS << (unsigned int)mE.getAudioStartMarker().sec;
+ dS << (unsigned int)mE.getAudioStartMarker().nsec;
+ dS << (unsigned long)mE.getDataBlockId();
+ dS << mE.getRuntimeSegmentId();
+ dS << (unsigned int)mE.isAutoFading();
+ dS << (unsigned int)mE.getFadeInTime().sec;
+ dS << (unsigned int)mE.getFadeInTime().nsec;
+ dS << (unsigned int)mE.getFadeOutTime().sec;
+ dS << (unsigned int)mE.getFadeOutTime().nsec;
+ dS << (unsigned int)mE.getRecordedChannel();
+ dS << (unsigned int)mE.getRecordedDevice();
+
+ return dS;
+}
+
+QDataStream&
+operator>>(QDataStream &dS, MappedEvent *mE)
+{
+ unsigned int trackId = 0, instrument = 0, type = 0, data1 = 0, data2 = 0;
+ long eventTimeSec = 0, eventTimeNsec = 0, durationSec = 0, durationNsec = 0,
+ audioSec = 0, audioNsec = 0;
+ std::string dataBlock;
+ unsigned long dataBlockId = 0;
+ int runtimeSegmentId = -1;
+ unsigned int autoFade = 0,
+ fadeInSec = 0, fadeInNsec = 0, fadeOutSec = 0, fadeOutNsec = 0,
+ recordedChannel = 0, recordedDevice = 0;
+
+ dS >> trackId;
+ dS >> instrument;
+ dS >> type;
+ dS >> data1;
+ dS >> data2;
+ dS >> eventTimeSec;
+ dS >> eventTimeNsec;
+ dS >> durationSec;
+ dS >> durationNsec;
+ dS >> audioSec;
+ dS >> audioNsec;
+ dS >> dataBlockId;
+ dS >> runtimeSegmentId;
+ dS >> autoFade;
+ dS >> fadeInSec;
+ dS >> fadeInNsec;
+ dS >> fadeOutSec;
+ dS >> fadeOutNsec;
+ dS >> recordedChannel;
+ dS >> recordedDevice;
+
+ mE->setTrackId((TrackId)trackId);
+ mE->setInstrument((InstrumentId)instrument);
+ mE->setType((MappedEvent::MappedEventType)type);
+ mE->setData1((MidiByte)data1);
+ mE->setData2((MidiByte)data2);
+ mE->setEventTime(RealTime(eventTimeSec, eventTimeNsec));
+ mE->setDuration(RealTime(durationSec, durationNsec));
+ mE->setAudioStartMarker(RealTime(audioSec, audioNsec));
+ mE->setDataBlockId(dataBlockId);
+ mE->setRuntimeSegmentId(runtimeSegmentId);
+ mE->setAutoFade(autoFade);
+ mE->setFadeInTime(RealTime(fadeInSec, fadeInNsec));
+ mE->setFadeOutTime(RealTime(fadeOutSec, fadeOutNsec));
+ mE->setRecordedChannel(recordedChannel);
+ mE->setRecordedDevice(recordedDevice);
+
+ return dS;
+}
+
+QDataStream&
+operator>>(QDataStream &dS, MappedEvent &mE)
+{
+ unsigned int trackId = 0, instrument = 0, type = 0, data1 = 0, data2 = 0;
+ long eventTimeSec = 0, eventTimeNsec = 0, durationSec = 0, durationNsec = 0,
+ audioSec = 0, audioNsec = 0;
+ std::string dataBlock;
+ unsigned long dataBlockId = 0;
+ int runtimeSegmentId = -1;
+ unsigned int autoFade = 0,
+ fadeInSec = 0, fadeInNsec = 0, fadeOutSec = 0, fadeOutNsec = 0,
+ recordedChannel = 0, recordedDevice = 0;
+
+ dS >> trackId;
+ dS >> instrument;
+ dS >> type;
+ dS >> data1;
+ dS >> data2;
+ dS >> eventTimeSec;
+ dS >> eventTimeNsec;
+ dS >> durationSec;
+ dS >> durationNsec;
+ dS >> audioSec;
+ dS >> audioNsec;
+ dS >> dataBlockId;
+ dS >> runtimeSegmentId;
+ dS >> autoFade;
+ dS >> fadeInSec;
+ dS >> fadeInNsec;
+ dS >> fadeOutSec;
+ dS >> fadeOutNsec;
+ dS >> recordedChannel;
+ dS >> recordedDevice;
+
+ mE.setTrackId((TrackId)trackId);
+ mE.setInstrument((InstrumentId)instrument);
+ mE.setType((MappedEvent::MappedEventType)type);
+ mE.setData1((MidiByte)data1);
+ mE.setData2((MidiByte)data2);
+ mE.setEventTime(RealTime(eventTimeSec, eventTimeNsec));
+ mE.setDuration(RealTime(durationSec, durationNsec));
+ mE.setAudioStartMarker(RealTime(audioSec, audioNsec));
+ mE.setDataBlockId(dataBlockId);
+ mE.setRuntimeSegmentId(runtimeSegmentId);
+ mE.setAutoFade(autoFade);
+ mE.setFadeInTime(RealTime(fadeInSec, fadeInNsec));
+ mE.setFadeOutTime(RealTime(fadeOutSec, fadeOutNsec));
+ mE.setRecordedChannel(recordedChannel);
+ mE.setRecordedDevice(recordedDevice);
+
+ return dS;
+}
+
+void
+MappedEvent::addDataByte(MidiByte byte)
+{
+ DataBlockRepository::getInstance()->addDataByteForEvent(byte, this);
+}
+
+void
+MappedEvent::addDataString(const std::string& data)
+{
+ DataBlockRepository::getInstance()->addDataStringForEvent(data, this);
+}
+
+
+
+//--------------------------------------------------
+
+class DataBlockFile
+{
+public:
+ DataBlockFile(DataBlockRepository::blockid id);
+ ~DataBlockFile();
+
+ QString getFileName()
+ {
+ return m_fileName;
+ }
+
+ void addDataByte(MidiByte);
+ void addDataString(const std::string&);
+
+ void clear()
+ {
+ m_cleared = true;
+ }
+ bool exists();
+ void setData(const std::string&);
+ std::string getData();
+
+protected:
+ void prepareToWrite();
+ void prepareToRead();
+
+ //--------------- Data members ---------------------------------
+ QString m_fileName;
+ QFile m_file;
+ bool m_cleared;
+};
+
+DataBlockFile::DataBlockFile(DataBlockRepository::blockid id)
+ : m_fileName(KGlobal::dirs()->resourceDirs("tmp").first() + QString("/rosegarden_datablock_%1").arg(id)),
+ m_file(m_fileName),
+ m_cleared(false)
+{
+ // std::cerr << "DataBlockFile " << m_fileName.latin1() << std::endl;
+}
+
+DataBlockFile::~DataBlockFile()
+{
+ if (m_cleared) {
+// std::cerr << "~DataBlockFile : removing " << m_fileName.latin1() << std::endl;
+ QFile::remove
+ (m_fileName);
+ }
+
+}
+
+bool DataBlockFile::exists()
+{
+ return QFile::exists(m_fileName);
+}
+
+void DataBlockFile::setData(const std::string& s)
+{
+ // std::cerr << "DataBlockFile::setData() : setting data to " << m_fileName << std::endl;
+ prepareToWrite();
+
+ QDataStream stream(&m_file);
+ stream.writeRawBytes(s.data(), s.length());
+}
+
+std::string DataBlockFile::getData()
+{
+ if (!exists())
+ return std::string();
+
+ prepareToRead();
+
+ QDataStream stream(&m_file);
+ // std::cerr << "DataBlockFile::getData() : file size = " << m_file.size() << std::endl;
+ char* tmp = new char[m_file.size()];
+ stream.readRawBytes(tmp, m_file.size());
+ std::string res(tmp, m_file.size());
+ delete[] tmp;
+
+ return res;
+}
+
+void DataBlockFile::addDataByte(MidiByte byte)
+{
+ prepareToWrite();
+ m_file.putch(byte);
+}
+
+void DataBlockFile::addDataString(const std::string& s)
+{
+ prepareToWrite();
+ QDataStream stream(&m_file);
+ stream.writeRawBytes(s.data(), s.length());
+}
+
+void DataBlockFile::prepareToWrite()
+{
+ // std::cerr << "DataBlockFile[" << m_fileName << "]: prepareToWrite" << std::endl;
+ if (!m_file.isWritable()) {
+ m_file.close();
+ m_file.open(IO_WriteOnly | IO_Append);
+ assert(m_file.isWritable());
+ }
+}
+
+void DataBlockFile::prepareToRead()
+{
+// std::cerr << "DataBlockFile[" << m_fileName << "]: prepareToRead" << std::endl;
+ if (!m_file.isReadable()) {
+ m_file.close();
+ m_file.open(IO_ReadOnly);
+ assert(m_file.isReadable());
+ }
+}
+
+
+
+//--------------------------------------------------
+
+DataBlockRepository* DataBlockRepository::getInstance()
+{
+ if (!m_instance)
+ m_instance = new DataBlockRepository;
+ return m_instance;
+}
+
+std::string DataBlockRepository::getDataBlock(DataBlockRepository::blockid id)
+{
+ DataBlockFile dataBlockFile(id);
+
+ if (dataBlockFile.exists())
+ return dataBlockFile.getData();
+
+ return std::string();
+}
+
+
+std::string DataBlockRepository::getDataBlockForEvent(MappedEvent* e)
+{
+ blockid id = e->getDataBlockId();
+ if (id == 0) {
+ // std::cerr << "WARNING: DataBlockRepository::getDataBlockForEvent called on event with data block id 0" << std::endl;
+ return "";
+ }
+ return getInstance()->getDataBlock(id);
+}
+
+void DataBlockRepository::setDataBlockForEvent(MappedEvent* e, const std::string& s)
+{
+ blockid id = e->getDataBlockId();
+ if (id == 0) {
+ // std::cerr << "Creating new datablock for event" << std::endl;
+ getInstance()->registerDataBlockForEvent(s, e);
+ } else {
+ // std::cerr << "Writing " << s.length() << " chars to file for datablock " << id << std::endl;
+ DataBlockFile dataBlockFile(id);
+ dataBlockFile.setData(s);
+ }
+}
+
+bool DataBlockRepository::hasDataBlock(DataBlockRepository::blockid id)
+{
+ return DataBlockFile(id).exists();
+}
+
+DataBlockRepository::blockid DataBlockRepository::registerDataBlock(const std::string& s)
+{
+ blockid id = 0;
+ while (id == 0 || DataBlockFile(id).exists())
+ id = (blockid)random();
+
+ // std::cerr << "DataBlockRepository::registerDataBlock: " << s.length() << " chars, id is " << id << std::endl;
+
+ DataBlockFile dataBlockFile(id);
+ dataBlockFile.setData(s);
+
+ return id;
+}
+
+void DataBlockRepository::unregisterDataBlock(DataBlockRepository::blockid id)
+{
+ DataBlockFile dataBlockFile(id);
+
+ dataBlockFile.clear();
+}
+
+void DataBlockRepository::registerDataBlockForEvent(const std::string& s, MappedEvent* e)
+{
+ e->setDataBlockId(registerDataBlock(s));
+}
+
+void DataBlockRepository::unregisterDataBlockForEvent(MappedEvent* e)
+{
+ unregisterDataBlock(e->getDataBlockId());
+}
+
+
+DataBlockRepository::DataBlockRepository()
+{}
+
+void DataBlockRepository::clear()
+{
+#ifdef DEBUG_MAPPEDEVENT
+ std::cerr << "DataBlockRepository::clear()\n";
+#endif
+
+ // Erase all 'datablock_*' files
+ //
+ QString tmpPath = KGlobal::dirs()->resourceDirs("tmp").first();
+
+ QDir segmentsDir(tmpPath, "rosegarden_datablock_*");
+ for (unsigned int i = 0; i < segmentsDir.count(); ++i) {
+ QString segmentName = tmpPath + '/' + segmentsDir[i];
+ QFile::remove
+ (segmentName);
+ }
+}
+
+
+void DataBlockRepository::addDataByteForEvent(MidiByte byte, MappedEvent* e)
+{
+ DataBlockFile dataBlockFile(e->getDataBlockId());
+ dataBlockFile.addDataByte(byte);
+
+}
+
+void DataBlockRepository::addDataStringForEvent(const std::string& s, MappedEvent* e)
+{
+ DataBlockFile dataBlockFile(e->getDataBlockId());
+ dataBlockFile.addDataString(s);
+}
+
+DataBlockRepository* DataBlockRepository::m_instance = 0;
+
+}
diff --git a/src/sound/MappedEvent.h b/src/sound/MappedEvent.h
new file mode 100644
index 0000000..cc4e3f3
--- /dev/null
+++ b/src/sound/MappedEvent.h
@@ -0,0 +1,546 @@
+// -*- c-indentation-style:"stroustrup" c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include <qdatastream.h>
+
+#include "Composition.h" // for RealTime
+#include "Event.h"
+
+
+#ifndef _MAPPEDEVENT_H_
+#define _MAPPEDEVENT_H_
+
+// Used as a transformation stage between Composition, Events and output
+// at the Sequencer this class and MidiComposition eliminate the notion
+// of the Segment and Track for ease of Event access. The MappedEvents
+// are ready for playing or routing through an Instrument or Effects
+// boxes.
+//
+// MappedEvents can also represent instructions for playback of audio
+// samples - if the m_type is Audio then the sequencer will attempt to
+// map the Pitch (m_data1) to the audio id. Note that this limits us
+// to 256 audio files in the Composition unless we use a different
+// parameter for storing these IDs.
+//
+// The MappedEvent/Instrument relationship is interesting - we don't
+// want to duplicate the entire Instrument at the Sequencer level as
+// it'd be messy and unnecessary. Instead we use a MappedInstrument
+// which is just a very cut down Sequencer-side version of an Instrument.
+//
+// Some of these Events are unidirectional, some are bidirectional -
+// that is they only have a meaning in one direction (they are still
+// legal at either end). They are broadcast in both directions using
+// the "getSequencerSlice" and "processAsync/Recorded" interfaces on
+// which the control messages can piggyback and eventually stripped out.
+//
+
+namespace Rosegarden
+{
+class MappedEvent;
+
+class DataBlockRepository
+{
+public:
+ friend class MappedEvent;
+ typedef unsigned long blockid;
+
+ static DataBlockRepository* getInstance();
+ static std::string getDataBlockForEvent(MappedEvent*);
+ static void setDataBlockForEvent(MappedEvent*, const std::string&);
+ /**
+ * Clear all block files
+ */
+ static void clear();
+ bool hasDataBlock(blockid);
+
+protected:
+ DataBlockRepository();
+
+ std::string getDataBlock(blockid);
+
+ void addDataByteForEvent(MidiByte byte, MappedEvent*);
+ void addDataStringForEvent(const std::string&, MappedEvent*);
+
+
+ blockid registerDataBlock(const std::string&);
+ void unregisterDataBlock(blockid);
+
+ void registerDataBlockForEvent(const std::string&, MappedEvent*);
+ void unregisterDataBlockForEvent(MappedEvent*);
+
+
+ //--------------- Data members ---------------------------------
+
+ static DataBlockRepository* m_instance;
+};
+
+
+class MappedEvent
+{
+public:
+ typedef enum
+ {
+ // INVALID
+ //
+ InvalidMappedEvent = 0,
+
+ // Keep the MidiNotes bit flaggable so that filtering works
+ //
+ MidiNote = 1 << 0,
+ MidiNoteOneShot = 1 << 1, // doesn't need NOTE OFFs
+ MidiProgramChange = 1 << 2,
+ MidiKeyPressure = 1 << 3,
+ MidiChannelPressure = 1 << 4,
+ MidiPitchBend = 1 << 5,
+ MidiController = 1 << 6,
+ MidiSystemMessage = 1 << 7,
+
+ // Sent from the gui to play an audio file
+ Audio = 1 << 8,
+ // Sent from gui to cancel playing an audio file
+ AudioCancel = 1 << 9,
+ // Sent to the gui with audio level on Instrument
+ AudioLevel = 1 << 10,
+ // Sent to the gui to inform an audio file stopped
+ AudioStopped = 1 << 11,
+ // The gui is clear to generate a preview for a new audio file
+ AudioGeneratePreview = 1 << 12,
+
+ // Update Instruments - new ALSA client detected
+ SystemUpdateInstruments = 1 << 13,
+ // Set RG as JACK master/slave
+ SystemJackTransport = 1 << 14,
+ // Set RG as MMC master/slave
+ SystemMMCTransport = 1 << 15,
+ // Set System Messages and MIDI Clock
+ SystemMIDIClock = 1 << 16,
+ // Set Record device
+ SystemRecordDevice = 1 << 17,
+ // Set Metronome device
+ SystemMetronomeDevice = 1 << 18,
+ // Set Audio inputs/outputs: data1 num inputs, data2 num submasters
+ SystemAudioPortCounts = 1 << 19,
+ // Set whether we create various Audio ports (data1 is an AudioOutMask)
+ SystemAudioPorts = 1 << 20,
+ // Some failure has occurred: data1 contains FailureCode
+ SystemFailure = 1 << 21,
+
+ // Time sig. event (from time sig. composition reference segment)
+ TimeSignature = 1 << 22,
+ // Tempo event (from tempo composition reference segment)
+ Tempo = 1 << 23,
+
+ // Panic function
+ Panic = 1 << 24,
+
+ // Set RG as MTC master/slave
+ SystemMTCTransport = 1 << 25,
+ // Auto-connect sync outputs
+ SystemMIDISyncAuto = 1 << 26,
+ // File format used for audio recording (data1 is 0=PCM,1=float)
+ SystemAudioFileFormat = 1 << 27
+
+ } MappedEventType;
+
+ typedef enum
+ {
+ // These values are OR'd to produce the data2 field in a
+ // SystemAudioPorts event.
+ FaderOuts = 1 << 0,
+ SubmasterOuts = 1 << 1
+
+ } MappedEventAudioOutMask;
+
+ typedef enum
+ {
+ // JACK is having some xruns - warn the user maybe
+ FailureXRuns = 0,
+ // JACK has died or kicked us out
+ FailureJackDied = 1,
+ // Audio subsystem failed to read from disc fast enough
+ FailureDiscUnderrun = 2,
+ // Audio subsystem failed to write to disc fast enough
+ FailureDiscOverrun = 3,
+ // Audio subsystem failed to mix busses fast enough
+ FailureBussMixUnderrun = 4,
+ // Audio subsystem failed to mix instruments fast enough
+ FailureMixUnderrun = 5,
+ // Using a timer that has too low a resolution (e.g. 100Hz system timer)
+ WarningImpreciseTimer = 6,
+ // Too much CPU time spent in audio processing -- risk of xruns and lockup
+ FailureCPUOverload = 7,
+ // JACK kicked us out, but we've reconnected
+ FailureJackRestart = 8,
+ // JACK kicked us out, and now the reconnection has failed
+ FailureJackRestartFailed = 9,
+ // A necessary ALSA call has returned an error code
+ FailureALSACallFailed = 10,
+ // Using a timer that has too low a resolution, but RTC might work
+ WarningImpreciseTimerTryRTC = 11,
+ } FailureCode;
+
+ MappedEvent(): m_trackId(0),
+ m_instrument(0),
+ m_type(MidiNote),
+ m_data1(0),
+ m_data2(0),
+ m_eventTime(0, 0),
+ m_duration(0, 0),
+ m_audioStartMarker(0, 0),
+ m_dataBlockId(0),
+ m_isPersistent(false),
+ m_runtimeSegmentId(-1),
+ m_autoFade(false),
+ m_fadeInTime(RealTime::zeroTime),
+ m_fadeOutTime(RealTime::zeroTime),
+ m_recordedChannel(0),
+ m_recordedDevice(0) {}
+
+ // Construct from Events to Internal (MIDI) type MappedEvent
+ //
+ MappedEvent(const Event &e);
+
+ // Another Internal constructor from Events
+ MappedEvent(InstrumentId id,
+ const Event &e,
+ const RealTime &eventTime,
+ const RealTime &duration);
+
+ // A general MappedEvent constructor for any MappedEvent type
+ //
+ MappedEvent(InstrumentId id,
+ MappedEventType type,
+ MidiByte pitch,
+ MidiByte velocity,
+ const RealTime &absTime,
+ const RealTime &duration,
+ const RealTime &audioStartMarker):
+ m_trackId(0),
+ m_instrument(id),
+ m_type(type),
+ m_data1(pitch),
+ m_data2(velocity),
+ m_eventTime(absTime),
+ m_duration(duration),
+ m_audioStartMarker(audioStartMarker),
+ m_dataBlockId(0),
+ m_isPersistent(false),
+ m_runtimeSegmentId(-1),
+ m_autoFade(false),
+ m_fadeInTime(RealTime::zeroTime),
+ m_fadeOutTime(RealTime::zeroTime),
+ m_recordedChannel(0),
+ m_recordedDevice(0) {}
+
+ // Audio MappedEvent shortcut constructor
+ //
+ MappedEvent(InstrumentId id,
+ unsigned short audioID,
+ const RealTime &eventTime,
+ const RealTime &duration,
+ const RealTime &audioStartMarker):
+ m_trackId(0),
+ m_instrument(id),
+ m_type(Audio),
+ m_data1(audioID % 256),
+ m_data2(audioID / 256),
+ m_eventTime(eventTime),
+ m_duration(duration),
+ m_audioStartMarker(audioStartMarker),
+ m_dataBlockId(0),
+ m_isPersistent(false),
+ m_runtimeSegmentId(-1),
+ m_autoFade(false),
+ m_fadeInTime(RealTime::zeroTime),
+ m_fadeOutTime(RealTime::zeroTime),
+ m_recordedChannel(0),
+ m_recordedDevice(0) {}
+
+ // More generalised MIDI event containers for
+ // large and small events (one param, two param)
+ //
+ MappedEvent(InstrumentId id,
+ MappedEventType type,
+ MidiByte data1,
+ MidiByte data2):
+ m_trackId(0),
+ m_instrument(id),
+ m_type(type),
+ m_data1(data1),
+ m_data2(data2),
+ m_eventTime(RealTime(0, 0)),
+ m_duration(RealTime(0, 0)),
+ m_audioStartMarker(RealTime(0, 0)),
+ m_dataBlockId(0),
+ m_isPersistent(false),
+ m_runtimeSegmentId(-1),
+ m_autoFade(false),
+ m_fadeInTime(RealTime::zeroTime),
+ m_fadeOutTime(RealTime::zeroTime),
+ m_recordedChannel(0),
+ m_recordedDevice(0) {}
+
+ MappedEvent(InstrumentId id,
+ MappedEventType type,
+ MidiByte data1):
+ m_trackId(0),
+ m_instrument(id),
+ m_type(type),
+ m_data1(data1),
+ m_data2(0),
+ m_eventTime(RealTime(0, 0)),
+ m_duration(RealTime(0, 0)),
+ m_audioStartMarker(RealTime(0, 0)),
+ m_dataBlockId(0),
+ m_isPersistent(false),
+ m_runtimeSegmentId(-1),
+ m_autoFade(false),
+ m_fadeInTime(RealTime::zeroTime),
+ m_fadeOutTime(RealTime::zeroTime),
+ m_recordedChannel(0),
+ m_recordedDevice(0) {}
+
+
+ // Construct SysExs say
+ //
+ MappedEvent(InstrumentId id,
+ MappedEventType type):
+ m_trackId(0),
+ m_instrument(id),
+ m_type(type),
+ m_data1(0),
+ m_data2(0),
+ m_eventTime(RealTime(0, 0)),
+ m_duration(RealTime(0, 0)),
+ m_audioStartMarker(RealTime(0, 0)),
+ m_dataBlockId(0),
+ m_isPersistent(false),
+ m_runtimeSegmentId(-1),
+ m_autoFade(false),
+ m_fadeInTime(RealTime::zeroTime),
+ m_fadeOutTime(RealTime::zeroTime),
+ m_recordedChannel(0),
+ m_recordedDevice(0) {}
+
+ // Copy constructor
+ //
+ // Fix for 674731 by Pedro Lopez-Cabanillas (20030531)
+ MappedEvent(const MappedEvent &mE):
+ m_trackId(mE.getTrackId()),
+ m_instrument(mE.getInstrument()),
+ m_type(mE.getType()),
+ m_data1(mE.getData1()),
+ m_data2(mE.getData2()),
+ m_eventTime(mE.getEventTime()),
+ m_duration(mE.getDuration()),
+ m_audioStartMarker(mE.getAudioStartMarker()),
+ m_dataBlockId(mE.getDataBlockId()),
+ m_isPersistent(false),
+ m_runtimeSegmentId(mE.getRuntimeSegmentId()),
+ m_autoFade(mE.isAutoFading()),
+ m_fadeInTime(mE.getFadeInTime()),
+ m_fadeOutTime(mE.getFadeOutTime()),
+ m_recordedChannel(mE.getRecordedChannel()),
+ m_recordedDevice(mE.getRecordedDevice()) {}
+
+ // Copy from pointer
+ // Fix for 674731 by Pedro Lopez-Cabanillas (20030531)
+ MappedEvent(MappedEvent *mE):
+ m_trackId(mE->getTrackId()),
+ m_instrument(mE->getInstrument()),
+ m_type(mE->getType()),
+ m_data1(mE->getData1()),
+ m_data2(mE->getData2()),
+ m_eventTime(mE->getEventTime()),
+ m_duration(mE->getDuration()),
+ m_audioStartMarker(mE->getAudioStartMarker()),
+ m_dataBlockId(mE->getDataBlockId()),
+ m_isPersistent(false),
+ m_runtimeSegmentId(mE->getRuntimeSegmentId()),
+ m_autoFade(mE->isAutoFading()),
+ m_fadeInTime(mE->getFadeInTime()),
+ m_fadeOutTime(mE->getFadeOutTime()),
+ m_recordedChannel(mE->getRecordedChannel()),
+ m_recordedDevice(mE->getRecordedDevice()) {}
+
+ // Construct perhaps without initialising, for placement new or equivalent
+ MappedEvent(bool initialise) {
+ if (initialise) *this = MappedEvent();
+ }
+
+ // Event time
+ //
+ void setEventTime(const RealTime &a) { m_eventTime = a; }
+ RealTime getEventTime() const { return m_eventTime; }
+
+ // Duration
+ //
+ void setDuration(const RealTime &d) { m_duration = d; }
+ RealTime getDuration() const { return m_duration; }
+
+ // Instrument
+ void setInstrument(InstrumentId id) { m_instrument = id; }
+ InstrumentId getInstrument() const { return m_instrument; }
+
+ // Track
+ void setTrackId(TrackId id) { m_trackId = id; }
+ TrackId getTrackId() const { return m_trackId; }
+
+ MidiByte getPitch() const { return m_data1; }
+
+ // Keep pitch within MIDI limits
+ //
+ void setPitch(MidiByte p)
+ {
+ m_data1 = p;
+ if (m_data1 > MidiMaxValue) m_data1 = MidiMaxValue;
+ }
+
+ void setVelocity(MidiByte v) { m_data2 = v; }
+ MidiByte getVelocity() const { return m_data2; }
+
+ // And the trendy names for them
+ //
+ MidiByte getData1() const { return m_data1; }
+ MidiByte getData2() const { return m_data2; }
+ void setData1(MidiByte d1) { m_data1 = d1; }
+ void setData2(MidiByte d2) { m_data2 = d2; }
+
+ void setAudioID(unsigned short id) { m_data1 = id % 256; m_data2 = id / 256; }
+ int getAudioID() const { return m_data1 + 256 * m_data2; }
+
+ // A sample doesn't have to be played from the beginning. When
+ // passing an Audio event this value may be set to indicate from
+ // where in the sample it should be played. Duration is measured
+ // against total sounding length (not absolute position).
+ //
+ void setAudioStartMarker(const RealTime &aS)
+ { m_audioStartMarker = aS; }
+ RealTime getAudioStartMarker() const
+ { return m_audioStartMarker; }
+
+ MappedEventType getType() const { return m_type; }
+ void setType(const MappedEventType &value) { m_type = value; }
+
+ // Data block id
+ //
+ DataBlockRepository::blockid getDataBlockId() const { return m_dataBlockId; }
+ void setDataBlockId(DataBlockRepository::blockid dataBlockId) { m_dataBlockId = dataBlockId; }
+
+ // How MappedEvents are ordered in the MappedComposition
+ //
+ struct MappedEventCmp
+ {
+ bool operator()(const MappedEvent *mE1, const MappedEvent *mE2) const
+ {
+ return *mE1 < *mE2;
+ }
+ };
+
+ friend bool operator<(const MappedEvent &a, const MappedEvent &b);
+
+ MappedEvent& operator=(const MappedEvent &mE);
+
+ friend QDataStream& operator>>(QDataStream &dS, MappedEvent *mE);
+ friend QDataStream& operator<<(QDataStream &dS, MappedEvent *mE);
+ friend QDataStream& operator>>(QDataStream &dS, MappedEvent &mE);
+ friend QDataStream& operator<<(QDataStream &dS, const MappedEvent &mE);
+
+ /// Add a single byte to the event's datablock (for SysExs)
+ void addDataByte(MidiByte byte);
+ /// Add several bytes to the event's datablock
+ void addDataString(const std::string& data);
+
+ void setPersistent(bool value) { m_isPersistent = value; }
+ bool isPersistent() const { return m_isPersistent; }
+
+ /// Size of a MappedEvent in a stream
+ static const size_t streamedSize;
+
+ // The runtime segment id of an audio file
+ //
+ int getRuntimeSegmentId() const { return m_runtimeSegmentId; }
+ void setRuntimeSegmentId(int id) { m_runtimeSegmentId = id; }
+
+ bool isAutoFading() const { return m_autoFade; }
+ void setAutoFade(bool value) { m_autoFade = value; }
+
+ RealTime getFadeInTime() const { return m_fadeInTime; }
+ void setFadeInTime(const RealTime &time)
+ { m_fadeInTime = time; }
+
+ RealTime getFadeOutTime() const { return m_fadeOutTime; }
+ void setFadeOutTime(const RealTime &time)
+ { m_fadeOutTime = time; }
+
+ // Original event input channel as it was recorded
+ //
+ unsigned int getRecordedChannel() const { return m_recordedChannel; }
+ void setRecordedChannel(const unsigned int channel)
+ { m_recordedChannel = channel; }
+
+ // Original event record device as it was recorded
+ //
+ unsigned int getRecordedDevice() const { return m_recordedDevice; }
+ void setRecordedDevice(const unsigned int device) { m_recordedDevice = device; }
+
+private:
+ TrackId m_trackId;
+ InstrumentId m_instrument;
+ MappedEventType m_type;
+ MidiByte m_data1;
+ MidiByte m_data2;
+ RealTime m_eventTime;
+ RealTime m_duration;
+ RealTime m_audioStartMarker;
+
+ // Use this when we want to store something in addition to the
+ // other bytes in this type, e.g. System Exclusive.
+ //
+ DataBlockRepository::blockid m_dataBlockId;
+
+ // Should a MappedComposition try and delete this MappedEvent or
+ // if it persistent?
+ //
+ bool m_isPersistent;
+
+
+ // Id of the segment that this (audio) event is derived from
+ //
+ int m_runtimeSegmentId;
+
+ // Audio autofading
+ //
+ bool m_autoFade;
+ RealTime m_fadeInTime;
+ RealTime m_fadeOutTime;
+
+ // input event original data,
+ // stored as it was recorded
+ //
+ unsigned int m_recordedChannel;
+ unsigned int m_recordedDevice;
+};
+
+
+}
+
+#endif
diff --git a/src/sound/MappedInstrument.cpp b/src/sound/MappedInstrument.cpp
new file mode 100644
index 0000000..b353f78
--- /dev/null
+++ b/src/sound/MappedInstrument.cpp
@@ -0,0 +1,153 @@
+// -*- c-indentation-style:"stroustrup" c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include "MappedInstrument.h"
+
+namespace Rosegarden
+{
+
+
+MappedInstrument::MappedInstrument():
+ m_type(Instrument::Midi),
+ m_channel(0),
+ m_id(0),
+ m_name(std::string("")),
+ m_audioChannels(0)
+{}
+
+MappedInstrument::MappedInstrument(Instrument::InstrumentType type,
+ MidiByte channel,
+ InstrumentId id):
+ m_type(type),
+ m_channel(channel),
+ m_id(id),
+ m_name(std::string("")),
+ m_audioChannels(0)
+{}
+
+MappedInstrument::MappedInstrument(Instrument::InstrumentType type,
+ MidiByte channel,
+ InstrumentId id,
+ const std::string &name,
+ DeviceId device):
+ m_type(type),
+ m_channel(channel),
+ m_id(id),
+ m_name(name),
+ m_device(device),
+ m_audioChannels(0)
+{}
+
+MappedInstrument::MappedInstrument(const Instrument &instr):
+ m_type(instr.getType()),
+ m_channel(instr.getMidiChannel()),
+ m_id(instr.getId()),
+ m_name(instr.getName()),
+ m_device((instr.getDevice())->getId()),
+ m_audioChannels(instr.getAudioChannels())
+{}
+
+MappedInstrument::MappedInstrument(Instrument *instr):
+ m_type(instr->getType()),
+ m_channel(instr->getMidiChannel()),
+ m_id(instr->getId()),
+ m_name(instr->getName()),
+ m_device(instr->getDevice()->getId()),
+ m_audioChannels(instr->getAudioChannels())
+{}
+
+QDataStream&
+operator>>(QDataStream &dS, MappedInstrument *mI)
+{
+ unsigned int type, channel, id, device, audioChannels;
+ QString name;
+
+ dS >> type;
+ dS >> channel;
+ dS >> id;
+ dS >> name;
+ dS >> device;
+ dS >> audioChannels;
+
+ mI->setType(Instrument::InstrumentType(type));
+ mI->setChannel(MidiByte(channel));
+ mI->setId(InstrumentId(id));
+ mI->setName(std::string(name.data()));
+ mI->setDevice(DeviceId(device));
+ mI->setAudioChannels(audioChannels);
+
+ return dS;
+}
+
+QDataStream&
+operator>>(QDataStream &dS, MappedInstrument &mI)
+{
+ unsigned int type, channel, id, device, audioChannels;
+ QString name;
+
+ dS >> type;
+ dS >> channel;
+ dS >> id;
+ dS >> name;
+ dS >> device;
+ dS >> audioChannels;
+
+ mI.setType(Instrument::InstrumentType(type));
+ mI.setChannel(MidiByte(channel));
+ mI.setId(InstrumentId(id));
+ mI.setName(std::string(name.data()));
+ mI.setDevice(DeviceId(device));
+ mI.setAudioChannels(audioChannels);
+
+ return dS;
+}
+
+QDataStream&
+operator<<(QDataStream &dS, MappedInstrument *mI)
+{
+ dS << (unsigned int)mI->getType();
+ dS << (unsigned int)mI->getChannel();
+ dS << (unsigned int)mI->getId();
+ ;
+ dS << QString(mI->getName().c_str());
+ dS << (unsigned int)mI->getDevice();
+ dS << (unsigned int)mI->getAudioChannels();
+
+ return dS;
+}
+
+
+QDataStream&
+operator<<(QDataStream &dS, const MappedInstrument &mI)
+{
+ dS << (unsigned int)mI.getType();
+ dS << (unsigned int)mI.getChannel();
+ dS << (unsigned int)mI.getId();
+ ;
+ dS << QString(mI.getName().c_str());
+ dS << (unsigned int)mI.getDevice();
+ dS << (unsigned int)mI.getAudioChannels();
+
+ return dS;
+}
+
+}
+
diff --git a/src/sound/MappedInstrument.h b/src/sound/MappedInstrument.h
new file mode 100644
index 0000000..49f0167
--- /dev/null
+++ b/src/sound/MappedInstrument.h
@@ -0,0 +1,106 @@
+// -*- c-indentation-style:"stroustrup" c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include "Instrument.h"
+#include "MappedDevice.h"
+#include "MappedCommon.h"
+
+#ifndef _MAPPEDINSTRUMENT_H_
+#define _MAPPEDINSTRUMENT_H_
+
+// A scaled-down version of an Instrument that we keep Sequencer
+// side. IDs match with those on the GUI.
+//
+//
+
+namespace Rosegarden
+{
+
+class MappedInstrument
+{
+public:
+
+ MappedInstrument();
+
+ // GUI uses this constructor because it already knows
+ // the name of the Instrument
+ //
+ MappedInstrument(Instrument::InstrumentType type,
+ MidiByte channel,
+ InstrumentId id);
+
+ // Driver uses this constructor (because the gui will want
+ // to know the name)
+ //
+ MappedInstrument(Instrument::InstrumentType type,
+ MidiByte channel,
+ InstrumentId id,
+ const std::string &name,
+ DeviceId device);
+
+ // from instrument
+ MappedInstrument(const Instrument &instrument);
+ MappedInstrument(Instrument *instrument);
+
+ ~MappedInstrument() { ;}
+
+ void setId(InstrumentId id) { m_id = id; }
+ InstrumentId getId() const { return m_id; }
+
+ void setChannel(MidiByte channel) { m_channel = channel; }
+ MidiByte getChannel() const { return m_channel; }
+
+ void setType(Instrument::InstrumentType type) { m_type = type; }
+ Instrument::InstrumentType getType() const { return m_type; }
+
+ void setName(const std::string &name) { m_name = name; }
+ const std::string& getName() const { return m_name; }
+
+ void setDevice(DeviceId device) { m_device = device; }
+ DeviceId getDevice() const { return m_device; }
+
+ // How many audio channels we've got on this audio MappedInstrument
+ //
+ unsigned int getAudioChannels() const { return m_audioChannels; }
+ void setAudioChannels(unsigned int channels) { m_audioChannels = channels; }
+
+ friend QDataStream& operator>>(QDataStream &dS, MappedInstrument *mI);
+ friend QDataStream& operator<<(QDataStream &dS, MappedInstrument *mI);
+ friend QDataStream& operator>>(QDataStream &dS, MappedInstrument &mI);
+ friend QDataStream& operator<<(QDataStream &dS, const MappedInstrument &mI);
+
+private:
+
+ Instrument::InstrumentType m_type;
+ MidiByte m_channel;
+ InstrumentId m_id;
+ std::string m_name;
+ DeviceId m_device;
+
+ // If this is an audio MappedInstrument then how many channels
+ // are associated with it?
+ //
+ unsigned int m_audioChannels;
+};
+
+}
+
+#endif // _MAPPEDINSTRUMENT_H_
diff --git a/src/sound/MappedRealTime.cpp b/src/sound/MappedRealTime.cpp
new file mode 100644
index 0000000..ba596fd
--- /dev/null
+++ b/src/sound/MappedRealTime.cpp
@@ -0,0 +1,62 @@
+// -*- c-indentation-style:"stroustrup" c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include "MappedRealTime.h"
+
+namespace Rosegarden
+{
+
+QDataStream&
+operator>>(QDataStream &dS, MappedRealTime *mRT)
+{
+ dS >> mRT->sec;
+ dS >> mRT->nsec;
+ return dS;
+}
+
+QDataStream&
+operator<<(QDataStream &dS, MappedRealTime *mRT)
+{
+ dS << mRT->sec;
+ dS << mRT->nsec;
+ return dS;
+}
+
+QDataStream&
+operator>>(QDataStream &dS, MappedRealTime &mRT)
+{
+ dS >> mRT.sec;
+ dS >> mRT.nsec;
+ return dS;
+}
+
+
+QDataStream&
+operator<<(QDataStream &dS, const MappedRealTime &mRT)
+{
+ dS << mRT.sec;
+ dS << mRT.nsec;
+ return dS;
+}
+
+
+}
+
diff --git a/src/sound/MappedRealTime.h b/src/sound/MappedRealTime.h
new file mode 100644
index 0000000..ca2afd0
--- /dev/null
+++ b/src/sound/MappedRealTime.h
@@ -0,0 +1,56 @@
+// -*- c-indentation-style:"stroustrup" c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include <qdatastream.h>
+#include "RealTime.h"
+
+// Just a DCOP wrapper to RealTime
+//
+
+#ifndef _MAPPEDREALTIME_H_
+#define _MAPPEDREALTIME_H_
+
+namespace Rosegarden
+{
+
+class MappedRealTime : public RealTime
+{
+public:
+ MappedRealTime() : RealTime(0, 0) {;}
+ MappedRealTime(const RealTime &t) : RealTime(t.sec, t.nsec) {;}
+
+ // Return as RealTime
+ RealTime getRealTime() { return RealTime(sec, nsec); }
+
+ // DCOP datastream
+ //
+ friend QDataStream& operator>>(QDataStream &dS, MappedRealTime *mRT);
+ friend QDataStream& operator<<(QDataStream &dS, MappedRealTime *mRT);
+ friend QDataStream& operator>>(QDataStream &dS, MappedRealTime &mRT);
+ friend QDataStream& operator<<(QDataStream &dS, const MappedRealTime &mRT);
+
+
+};
+
+}
+
+#endif // _MAPPEDREALTIME_H_
+
diff --git a/src/sound/MappedStudio.cpp b/src/sound/MappedStudio.cpp
new file mode 100644
index 0000000..4b35122
--- /dev/null
+++ b/src/sound/MappedStudio.cpp
@@ -0,0 +1,1719 @@
+// -*- c-indentation-style:"stroustrup" c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include <iostream>
+
+#include "MappedStudio.h"
+#include "SoundDriver.h"
+#include "PluginFactory.h"
+
+#include <pthread.h> // for mutex
+
+//#define DEBUG_MAPPEDSTUDIO 1
+
+namespace Rosegarden
+{
+
+static pthread_mutex_t _mappedObjectContainerLock;
+
+#ifdef DEBUG_MAPPEDSTUDIO
+static int _approxLockCount = 0;
+#endif
+
+static inline void getLock(const char *file, int line)
+{
+#ifdef DEBUG_MAPPEDSTUDIO
+ std::cerr << "Acquiring MappedStudio container lock at " << file << ":" << line << ": count " << _approxLockCount++ << std::endl;
+#endif
+
+ pthread_mutex_lock(&_mappedObjectContainerLock);
+}
+
+static inline void releaseLock(const char *file, int line)
+{
+ pthread_mutex_unlock(&_mappedObjectContainerLock);
+#ifdef DEBUG_MAPPEDSTUDIO
+
+ std::cerr << "Released container lock at " << file << ":" << line << ": count " << --_approxLockCount << std::endl;
+#endif
+}
+
+#define GET_LOCK getLock(__FILE__,__LINE__)
+#define RELEASE_LOCK releaseLock(__FILE__,__LINE__)
+
+// These stream functions are stolen and adapted from Qt3 qvaluevector.h
+//
+// ** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
+//
+QDataStream& operator>>(QDataStream& s, MappedObjectIdList& v)
+{
+ v.clear();
+ Q_UINT32 c;
+ s >> c;
+ v.resize(c);
+ for (Q_UINT32 i = 0; i < c; ++i) {
+ MappedObjectId t;
+ s >> t;
+ v[i] = t;
+ }
+ return s;
+}
+
+QDataStream& operator<<(QDataStream& s, const MappedObjectIdList& v)
+{
+ s << (Q_UINT32)v.size();
+ MappedObjectIdList::const_iterator it = v.begin();
+ for ( ; it != v.end(); ++it )
+ s << *it;
+ return s;
+}
+
+QDataStream& operator>>(QDataStream& s, MappedObjectPropertyList& v)
+{
+ v.clear();
+ Q_UINT32 c;
+ s >> c;
+ v.resize(c);
+ for (Q_UINT32 i = 0; i < c; ++i) {
+ MappedObjectProperty t;
+ s >> t;
+ v[i] = t;
+ }
+ return s;
+}
+
+QDataStream& operator<<(QDataStream& s, const MappedObjectPropertyList& v)
+{
+ s << (Q_UINT32)v.size();
+ MappedObjectPropertyList::const_iterator it = v.begin();
+ for ( ; it != v.end(); ++it )
+ s << *it;
+ return s;
+}
+
+QDataStream& operator>>(QDataStream& s, MappedObjectValueList& v)
+{
+ v.clear();
+ Q_UINT32 c;
+ s >> c;
+ v.resize(c);
+ for (Q_UINT32 i = 0; i < c; ++i) {
+ MappedObjectValue t;
+ s >> t;
+ v[i] = t;
+ }
+ return s;
+}
+
+QDataStream& operator<<(QDataStream& s, const MappedObjectValueList& v)
+{
+ s << (Q_UINT32)v.size();
+ MappedObjectValueList::const_iterator it = v.begin();
+ for ( ; it != v.end(); ++it )
+ s << *it;
+ return s;
+}
+
+// Define our object properties - these can be queried and set.
+//
+
+// General things
+//
+const MappedObjectProperty MappedObject::Name = "name";
+const MappedObjectProperty MappedObject::Instrument = "instrument";
+const MappedObjectProperty MappedObject::Position = "position";
+
+const MappedObjectProperty MappedConnectableObject::ConnectionsIn = "connectionsIn";
+const MappedObjectProperty MappedConnectableObject::ConnectionsOut = "connectionsOut";
+
+const MappedObjectProperty MappedAudioFader::Channels = "channels";
+const MappedObjectProperty MappedAudioFader::FaderLevel = "faderLevel";
+const MappedObjectProperty MappedAudioFader::FaderRecordLevel = "faderRecordLevel";
+const MappedObjectProperty MappedAudioFader::Pan = "pan";
+const MappedObjectProperty MappedAudioFader::InputChannel = "inputChannel";
+
+const MappedObjectProperty MappedAudioBuss::BussId = "bussId";
+const MappedObjectProperty MappedAudioBuss::Level = "level";
+const MappedObjectProperty MappedAudioBuss::Pan = "pan";
+
+const MappedObjectProperty MappedAudioInput::InputNumber = "inputNumber";
+
+const MappedObjectProperty MappedPluginSlot::Identifier = "identifier";
+const MappedObjectProperty MappedPluginSlot::PluginName = "pluginname";
+const MappedObjectProperty MappedPluginSlot::Label = "label";
+const MappedObjectProperty MappedPluginSlot::Author = "author";
+const MappedObjectProperty MappedPluginSlot::Copyright = "copyright";
+const MappedObjectProperty MappedPluginSlot::Category = "category";
+const MappedObjectProperty MappedPluginSlot::PortCount = "portcount";
+const MappedObjectProperty MappedPluginSlot::Ports = "ports";
+const MappedObjectProperty MappedPluginSlot::Instrument = "instrument";
+const MappedObjectProperty MappedPluginSlot::Position = "position";
+const MappedObjectProperty MappedPluginSlot::Bypassed = "bypassed";
+const MappedObjectProperty MappedPluginSlot::Programs = "programs";
+const MappedObjectProperty MappedPluginSlot::Program = "program";
+const MappedObjectProperty MappedPluginSlot::Configuration = "configuration";
+
+const MappedObjectProperty MappedPluginPort::PortNumber = "portnumber";
+const MappedObjectProperty MappedPluginPort::Name = "name";
+const MappedObjectProperty MappedPluginPort::Minimum = "minimum";
+const MappedObjectProperty MappedPluginPort::Maximum = "maximum";
+const MappedObjectProperty MappedPluginPort::Default = "default";
+const MappedObjectProperty MappedPluginPort::DisplayHint = "displayhint";
+const MappedObjectProperty MappedPluginPort::Value = "value";
+
+// --------- MappedObject ---------
+//
+
+void
+MappedObject::addChild(MappedObject *object)
+{
+ std::vector<MappedObject*>::iterator it = m_children.begin();
+ for (; it != m_children.end(); it++)
+ if ((*it) == object)
+ return ;
+
+ m_children.push_back(object);
+}
+
+void
+MappedObject::removeChild(MappedObject *object)
+{
+ std::vector<MappedObject*>::iterator it = m_children.begin();
+ for (; it != m_children.end(); it++) {
+ if ((*it) == object) {
+ m_children.erase(it);
+ return ;
+ }
+ }
+}
+
+// Return all child ids
+//
+MappedObjectPropertyList
+MappedObject::getChildren()
+{
+ MappedObjectPropertyList list;
+ std::vector<MappedObject*>::iterator it = m_children.begin();
+ for (; it != m_children.end(); it++)
+ list.push_back(QString("%1").arg((*it)->getId()));
+
+ return list;
+}
+
+
+// Return all child ids of a certain type
+//
+MappedObjectPropertyList
+MappedObject::getChildren(MappedObjectType type)
+{
+ MappedObjectPropertyList list;
+ std::vector<MappedObject*>::iterator it = m_children.begin();
+ for (; it != m_children.end(); it++) {
+ if ((*it)->getType() == type)
+ list.push_back(QString("%1").arg((*it)->getId()));
+ }
+
+ return list;
+}
+
+void
+MappedObject::destroyChildren()
+{
+ // remove references from the studio as well as from the object
+ MappedObject *studioObject = getParent();
+ while (!dynamic_cast<MappedStudio*>(studioObject))
+ studioObject = studioObject->getParent();
+
+ // see note in destroy() below
+
+ std::vector<MappedObject *> children = m_children;
+ m_children.clear();
+
+ std::vector<MappedObject *>::iterator it = children.begin();
+ for (; it != children.end(); it++)
+ (*it)->destroy(); // remove from studio and destroy
+}
+
+// Destroy this object and remove it from the studio and
+// do the same for all its children.
+//
+void
+MappedObject::destroy()
+{
+ MappedObject *studioObject = getParent();
+ while (!dynamic_cast<MappedStudio*>(studioObject))
+ studioObject = studioObject->getParent();
+
+ MappedStudio *studio = dynamic_cast<MappedStudio*>(studioObject);
+
+ // The destroy method on each child calls studio->clearObject,
+ // which calls back on the parent (in this case us) to remove the
+ // child. (That's necessary for the case of destroying a plugin,
+ // where we need to remove it from its plugin manager -- etc.) So
+ // we don't want to be iterating over m_children here, as it will
+ // change from under us.
+
+ std::vector<MappedObject *> children = m_children;
+ m_children.clear();
+
+ std::vector<MappedObject *>::iterator it = children.begin();
+ for (; it != children.end(); it++) {
+ (*it)->destroy();
+ }
+
+ (void)studio->clearObject(m_id);
+ delete this;
+}
+
+
+// ------- MappedStudio -------
+//
+
+MappedStudio::MappedStudio() :
+ MappedObject(0,
+ "MappedStudio",
+ Studio,
+ 0),
+ m_runningObjectId(1)
+{
+ pthread_mutexattr_t attr;
+ pthread_mutexattr_init(&attr);
+#ifdef HAVE_PTHREAD_MUTEX_RECURSIVE
+
+ pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
+#else
+#ifdef PTHREAD_MUTEX_RECURSIVE
+
+ pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
+#else
+
+ pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE_NP);
+#endif
+#endif
+
+ pthread_mutex_init(&_mappedObjectContainerLock, &attr);
+}
+
+MappedStudio::~MappedStudio()
+{
+#ifdef DEBUG_MAPPEDSTUDIO
+ std::cout << "MappedStudio::~MappedStudio" << std::endl;
+#endif
+
+ clear();
+}
+
+
+// Object factory
+//
+MappedObject*
+MappedStudio::createObject(MappedObjectType type)
+{
+ GET_LOCK;
+
+ MappedObject *mO = 0;
+
+ // Ensure we've got an empty slot
+ //
+ while (getObjectById(m_runningObjectId))
+ m_runningObjectId++;
+
+ mO = createObject(type, m_runningObjectId);
+
+ // If we've got a new object increase the running id
+ //
+ if (mO)
+ m_runningObjectId++;
+
+ RELEASE_LOCK;
+ return mO;
+}
+
+MappedObject*
+MappedStudio::createObject(MappedObjectType type,
+ MappedObjectId id)
+{
+ GET_LOCK;
+
+ // fail if the object already exists and it's not zero
+ if (id != 0 && getObjectById(id)) {
+ RELEASE_LOCK;
+ return 0;
+ }
+
+ MappedObject *mO = 0;
+
+ if (type == MappedObject::AudioFader) {
+ mO = new MappedAudioFader(this,
+ id,
+ 2); // channels
+
+ // push to the studio's child stack
+ addChild(mO);
+ } else if (type == MappedObject::AudioBuss) {
+ mO = new MappedAudioBuss(this,
+ id);
+
+ // push to the studio's child stack
+ addChild(mO);
+ } else if (type == MappedObject::AudioInput) {
+ mO = new MappedAudioInput(this,
+ id);
+
+ // push to the studio's child stack
+ addChild(mO);
+ } else if (type == MappedObject::PluginSlot) {
+ mO = new MappedPluginSlot(this,
+ id);
+ addChild(mO);
+ } else if (type == MappedObject::PluginPort) {
+ mO = new MappedPluginPort(this,
+ id);
+ // reset the port's parent after creation outside this method
+ }
+
+ // Insert
+ if (mO) {
+#ifdef DEBUG_MAPPEDSTUDIO
+ std::cerr << "Adding object " << id << " to category " << type << std::endl;
+#endif
+
+ m_objects[type][id] = mO;
+ }
+
+ RELEASE_LOCK;
+
+ return mO;
+}
+
+MappedObject*
+MappedStudio::getObjectOfType(MappedObjectType type)
+{
+ MappedObject *rv = 0;
+
+ GET_LOCK;
+
+ MappedObjectCategory &category = m_objects[type];
+ if (!category.empty())
+ rv = category.begin()->second;
+
+ RELEASE_LOCK;
+
+ return rv;
+}
+
+std::vector<MappedObject *>
+MappedStudio::getObjectsOfType(MappedObjectType type)
+{
+ std::vector<MappedObject *> rv;
+
+ GET_LOCK;
+
+ MappedObjectCategory &category = m_objects[type];
+
+ for (MappedObjectCategory::iterator i = category.begin();
+ i != category.end(); ++i) {
+ rv.push_back(i->second);
+ }
+
+ RELEASE_LOCK;
+
+ return rv;
+}
+
+unsigned int
+MappedStudio::getObjectCount(MappedObjectType type)
+{
+ unsigned int count = 0;
+
+ GET_LOCK;
+
+ MappedObjectCategory &category = m_objects[type];
+ count = category.size();
+
+ RELEASE_LOCK;
+
+ return count;
+}
+
+
+bool
+MappedStudio::destroyObject(MappedObjectId id)
+{
+ GET_LOCK;
+
+ MappedObject *obj = getObjectById(id);
+
+ bool rv = false;
+
+ if (obj) {
+ obj->destroy();
+ rv = true;
+ }
+
+ RELEASE_LOCK;
+
+ return rv;
+}
+
+bool
+MappedStudio::connectObjects(MappedObjectId mId1, MappedObjectId mId2)
+{
+ GET_LOCK;
+
+ bool rv = false;
+
+ // objects must exist and be of connectable types
+ MappedConnectableObject *obj1 =
+ dynamic_cast<MappedConnectableObject *>(getObjectById(mId1));
+ MappedConnectableObject *obj2 =
+ dynamic_cast<MappedConnectableObject *>(getObjectById(mId2));
+
+ if (obj1 && obj2) {
+ obj1->addConnection(MappedConnectableObject::Out, mId2);
+ obj2->addConnection(MappedConnectableObject::In, mId1);
+ rv = true;
+ }
+
+ RELEASE_LOCK;
+
+ return rv;
+}
+
+bool
+MappedStudio::disconnectObjects(MappedObjectId mId1, MappedObjectId mId2)
+{
+ GET_LOCK;
+
+ bool rv = false;
+
+ // objects must exist and be of connectable types
+ MappedConnectableObject *obj1 =
+ dynamic_cast<MappedConnectableObject *>(getObjectById(mId1));
+ MappedConnectableObject *obj2 =
+ dynamic_cast<MappedConnectableObject *>(getObjectById(mId2));
+
+ if (obj1 && obj2) {
+ obj1->removeConnection(MappedConnectableObject::Out, mId2);
+ obj2->removeConnection(MappedConnectableObject::In, mId1);
+ rv = true;
+ }
+
+ RELEASE_LOCK;
+
+ return rv;
+}
+
+bool
+MappedStudio::disconnectObject(MappedObjectId mId)
+{
+ GET_LOCK;
+
+ bool rv = false;
+
+ MappedConnectableObject *obj =
+ dynamic_cast<MappedConnectableObject *>(getObjectById(mId));
+
+ if (obj) {
+ while (1) {
+ MappedObjectValueList list =
+ obj->getConnections(MappedConnectableObject::In);
+ if (list.empty())
+ break;
+ MappedObjectId otherId = MappedObjectId(*list.begin());
+ disconnectObjects(otherId, mId);
+ }
+ while (1) {
+ MappedObjectValueList list =
+ obj->getConnections(MappedConnectableObject::Out);
+ if (list.empty())
+ break;
+ MappedObjectId otherId = MappedObjectId(*list.begin());
+ disconnectObjects(mId, otherId);
+ }
+ }
+
+ rv = true;
+
+ RELEASE_LOCK;
+
+ return rv;
+}
+
+
+
+// Clear down the whole studio
+//
+void
+MappedStudio::clear()
+{
+ GET_LOCK;
+
+ for (MappedObjectMap::iterator i = m_objects.begin();
+ i != m_objects.end(); ++i) {
+
+ for (MappedObjectCategory::iterator j = i->second.begin();
+ j != i->second.end(); ++j) {
+
+ delete j->second;
+ }
+ }
+
+ m_objects.clear();
+
+ // reset running object id
+ m_runningObjectId = 1;
+
+ RELEASE_LOCK;
+}
+
+bool
+MappedStudio::clearObject(MappedObjectId id)
+{
+ bool rv = false;
+
+ GET_LOCK;
+
+ for (MappedObjectMap::iterator i = m_objects.begin();
+ i != m_objects.end(); ++i) {
+
+ MappedObjectCategory::iterator j = i->second.find(id);
+ if (j != i->second.end()) {
+ // if the object has a parent other than the studio,
+ // persuade that parent to abandon it
+ MappedObject *parent = j->second->getParent();
+ if (parent && !dynamic_cast<MappedStudio *>(parent)) {
+ parent->removeChild(j->second);
+ }
+
+ i->second.erase(j);
+ rv = true;
+ break;
+ }
+ }
+
+ RELEASE_LOCK;
+
+ return rv;
+}
+
+
+MappedObjectPropertyList
+MappedStudio::getPropertyList(const MappedObjectProperty &property)
+{
+ MappedObjectPropertyList list;
+
+ if (property == "") {
+ // something
+ }
+
+ return list;
+}
+
+bool
+MappedStudio::getProperty(const MappedObjectProperty &,
+ MappedObjectValue &)
+{
+ return false;
+}
+
+MappedObject*
+MappedStudio::getObjectById(MappedObjectId id)
+{
+ GET_LOCK;
+ MappedObject *rv = 0;
+
+ for (MappedObjectMap::iterator i = m_objects.begin();
+ i != m_objects.end(); ++i) {
+
+ MappedObjectCategory::iterator j = i->second.find(id);
+ if (j != i->second.end()) {
+ rv = j->second;
+ break;
+ }
+ }
+
+ RELEASE_LOCK;
+ return rv;
+}
+
+MappedObject*
+MappedStudio::getObjectByIdAndType(MappedObjectId id, MappedObjectType type)
+{
+ GET_LOCK;
+ MappedObject *rv = 0;
+
+ MappedObjectCategory &category = m_objects[type];
+ MappedObjectCategory::iterator i = category.find(id);
+ if (i != category.end()) {
+ rv = i->second;
+ }
+
+ RELEASE_LOCK;
+ return rv;
+}
+
+MappedObject*
+MappedStudio::getFirst(MappedObjectType type)
+{
+ return getObjectOfType(type);
+}
+
+MappedObject*
+MappedStudio::getNext(MappedObject *object)
+{
+ GET_LOCK;
+
+ MappedObjectCategory &category = m_objects[object->getType()];
+
+ bool next = false;
+ MappedObject *rv = 0;
+
+ for (MappedObjectCategory::iterator i = category.begin();
+ i != category.end(); ++i) {
+ if (i->second->getId() == object->getId())
+ next = true;
+ else if (next) {
+ rv = i->second;
+ break;
+ }
+ }
+
+ RELEASE_LOCK;
+ return rv;
+}
+
+void
+MappedStudio::setProperty(const MappedObjectProperty &property,
+ MappedObjectValue /*value*/)
+{
+ if (property == "") {}
+
+}
+
+MappedAudioFader *
+MappedStudio::getAudioFader(InstrumentId id)
+{
+ GET_LOCK;
+
+ MappedObjectCategory &category = m_objects[AudioFader];
+ MappedAudioFader *rv = 0;
+
+ for (MappedObjectCategory::iterator i = category.begin();
+ i != category.end(); ++i) {
+ MappedAudioFader *fader = dynamic_cast<MappedAudioFader *>(i->second);
+ if (fader && (fader->getInstrument() == id)) {
+ rv = fader;
+ break;
+ }
+ }
+
+ RELEASE_LOCK;
+ return rv;
+}
+
+MappedAudioBuss *
+MappedStudio::getAudioBuss(int bussNumber)
+{
+ GET_LOCK;
+
+ MappedObjectCategory &category = m_objects[AudioBuss];
+ MappedAudioBuss *rv = 0;
+
+ for (MappedObjectCategory::iterator i = category.begin();
+ i != category.end(); ++i) {
+ MappedAudioBuss *buss = dynamic_cast<MappedAudioBuss *>(i->second);
+ if (buss && (buss->getBussId() == bussNumber)) {
+ rv = buss;
+ break;
+ }
+ }
+
+ RELEASE_LOCK;
+ return rv;
+}
+
+MappedAudioInput *
+MappedStudio::getAudioInput(int inputNumber)
+{
+ GET_LOCK;
+
+ MappedObjectCategory &category = m_objects[AudioInput];
+ MappedAudioInput *rv = 0;
+
+ for (MappedObjectCategory::iterator i = category.begin();
+ i != category.end(); ++i) {
+ MappedAudioInput *input = dynamic_cast<MappedAudioInput *>(i->second);
+ if (input && (input->getInputNumber() == inputNumber)) {
+ rv = input;
+ break;
+ }
+ }
+
+ RELEASE_LOCK;
+ return rv;
+}
+
+
+// -------------- MappedConnectableObject -----------------
+//
+//
+MappedConnectableObject::MappedConnectableObject(MappedObject *parent,
+ const std::string &name,
+ MappedObjectType type,
+ MappedObjectId id):
+ MappedObject(parent,
+ name,
+ type,
+ id)
+{}
+
+MappedConnectableObject::~MappedConnectableObject()
+{}
+
+void
+MappedConnectableObject::setConnections(ConnectionDirection dir,
+ MappedObjectValueList conns)
+{
+ if (dir == In)
+ m_connectionsIn = conns;
+ else
+ m_connectionsOut = conns;
+}
+
+void
+MappedConnectableObject::addConnection(ConnectionDirection dir,
+ MappedObjectId id)
+{
+ MappedObjectValueList &list =
+ (dir == In ? m_connectionsIn : m_connectionsOut);
+
+ for (MappedObjectValueList::iterator i = list.begin(); i != list.end(); ++i) {
+ if (*i == id) {
+ return ;
+ }
+ }
+
+ list.push_back(MappedObjectValue(id));
+}
+
+void
+MappedConnectableObject::removeConnection(ConnectionDirection dir,
+ MappedObjectId id)
+{
+ MappedObjectValueList &list =
+ (dir == In ? m_connectionsIn : m_connectionsOut);
+
+ for (MappedObjectValueList::iterator i = list.begin(); i != list.end(); ++i) {
+ if (*i == id) {
+ list.erase(i);
+ return ;
+ }
+ }
+}
+
+MappedObjectValueList
+MappedConnectableObject::getConnections(ConnectionDirection dir)
+{
+ if (dir == In)
+ return m_connectionsIn;
+ else
+ return m_connectionsOut;
+}
+
+
+// ------------ MappedAudioFader ----------------
+//
+MappedAudioFader::MappedAudioFader(MappedObject *parent,
+ MappedObjectId id,
+ MappedObjectValue channels):
+ MappedConnectableObject(parent,
+ "MappedAudioFader",
+ AudioFader,
+ id),
+ m_level(0.0), // dB
+ m_recordLevel(0.0),
+ m_instrumentId(0),
+ m_pan(0),
+ m_channels(channels),
+ m_inputChannel(0)
+{}
+
+MappedAudioFader::~MappedAudioFader()
+{}
+
+
+MappedObjectPropertyList
+MappedAudioFader::getPropertyList(const MappedObjectProperty &property)
+{
+ MappedObjectPropertyList list;
+
+ if (property == "") {
+ list.push_back(MappedAudioFader::FaderLevel);
+ list.push_back(MappedAudioFader::FaderRecordLevel);
+ list.push_back(MappedObject::Instrument);
+ list.push_back(MappedAudioFader::Pan);
+ list.push_back(MappedAudioFader::Channels);
+ list.push_back(MappedConnectableObject::ConnectionsIn);
+ list.push_back(MappedConnectableObject::ConnectionsOut);
+ } else if (property == MappedObject::Instrument) {
+ list.push_back(MappedObjectProperty("%1").arg(m_instrumentId));
+ } else if (property == MappedAudioFader::FaderLevel) {
+ list.push_back(MappedObjectProperty("%1").arg(m_level));
+ } else if (property == MappedAudioFader::FaderRecordLevel) {
+ list.push_back(MappedObjectProperty("%1").arg(m_recordLevel));
+ } else if (property == MappedAudioFader::Channels) {
+ list.push_back(MappedObjectProperty("%1").arg(m_channels));
+ } else if (property == MappedAudioFader::InputChannel) {
+ list.push_back(MappedObjectProperty("%1").arg(m_inputChannel));
+ } else if (property == MappedAudioFader::Pan) {
+ list.push_back(MappedObjectProperty("%1").arg(m_pan));
+ } else if (property == MappedConnectableObject::ConnectionsIn) {
+ MappedObjectValueList::const_iterator
+ it = m_connectionsIn.begin();
+
+ for ( ; it != m_connectionsIn.end(); ++it) {
+ list.push_back(QString("%1").arg(*it));
+ }
+ } else if (property == MappedConnectableObject::ConnectionsOut) {
+ MappedObjectValueList::const_iterator
+ it = m_connectionsOut.begin();
+
+ for ( ; it != m_connectionsOut.end(); ++it) {
+ list.push_back(QString("%1").arg(*it));
+ }
+ }
+
+ return list;
+}
+
+bool
+MappedAudioFader::getProperty(const MappedObjectProperty &property,
+ MappedObjectValue &value)
+{
+ if (property == FaderLevel) {
+ value = m_level;
+ } else if (property == Instrument) {
+ value = m_instrumentId;
+ } else if (property == FaderRecordLevel) {
+ value = m_recordLevel;
+ } else if (property == Channels) {
+ value = m_channels;
+ } else if (property == InputChannel) {
+ value = m_inputChannel;
+ } else if (property == Pan) {
+ value = m_pan;
+ } else {
+#ifdef DEBUG_MAPPEDSTUDIO
+ std::cerr << "MappedAudioFader::getProperty - "
+ << "unsupported or non-scalar property" << std::endl;
+#endif
+
+ return false;
+ }
+ return true;
+}
+
+void
+MappedAudioFader::setProperty(const MappedObjectProperty &property,
+ MappedObjectValue value)
+{
+ bool updateLevels = false;
+
+ if (property == MappedAudioFader::FaderLevel) {
+ m_level = value;
+ updateLevels = true;
+ } else if (property == MappedObject::Instrument) {
+ m_instrumentId = InstrumentId(value);
+ updateLevels = true;
+ } else if (property == MappedAudioFader::FaderRecordLevel) {
+ m_recordLevel = value;
+ } else if (property == MappedAudioFader::Channels) {
+ m_channels = value;
+ } else if (property == MappedAudioFader::InputChannel) {
+ m_inputChannel = value;
+ } else if (property == MappedAudioFader::Pan) {
+ m_pan = value;
+ updateLevels = true;
+ } else if (property == MappedConnectableObject::ConnectionsIn) {
+ m_connectionsIn.clear();
+ m_connectionsIn.push_back(value);
+ } else if (property == MappedConnectableObject::ConnectionsOut) {
+ m_connectionsOut.clear();
+ m_connectionsOut.push_back(value);
+ } else {
+#ifdef DEBUG_MAPPEDSTUDIO
+ std::cerr << "MappedAudioFader::setProperty - "
+ << "unsupported property" << std::endl;
+#endif
+
+ return ;
+ }
+
+ /*
+ std::cout << "MappedAudioFader::setProperty - "
+ << property << " = " << value << std::endl;
+ */
+
+ if (updateLevels) {
+ MappedStudio *studio =
+ dynamic_cast<MappedStudio*>(getParent());
+
+ if (studio) {
+ studio->getSoundDriver()->setAudioInstrumentLevels
+ (m_instrumentId, m_level, m_pan);
+ }
+ }
+}
+
+// ---------------- MappedAudioBuss -------------------
+//
+//
+MappedAudioBuss::MappedAudioBuss(MappedObject *parent,
+ MappedObjectId id) :
+ MappedConnectableObject(parent,
+ "MappedAudioBuss",
+ AudioBuss,
+ id),
+ m_bussId(0),
+ m_level(0),
+ m_pan(0)
+{}
+
+MappedAudioBuss::~MappedAudioBuss()
+{}
+
+MappedObjectPropertyList
+MappedAudioBuss::getPropertyList(const MappedObjectProperty &property)
+{
+ MappedObjectPropertyList list;
+
+ if (property == "") {
+ list.push_back(MappedAudioBuss::BussId);
+ list.push_back(MappedAudioBuss::Level);
+ list.push_back(MappedAudioBuss::Pan);
+ list.push_back(MappedConnectableObject::ConnectionsIn);
+ list.push_back(MappedConnectableObject::ConnectionsOut);
+ } else if (property == BussId) {
+ list.push_back(MappedObjectProperty("%1").arg(m_bussId));
+ } else if (property == Level) {
+ list.push_back(MappedObjectProperty("%1").arg(m_level));
+ } else if (property == MappedConnectableObject::ConnectionsIn) {
+ MappedObjectValueList::const_iterator
+ it = m_connectionsIn.begin();
+
+ for ( ; it != m_connectionsIn.end(); ++it) {
+ list.push_back(QString("%1").arg(*it));
+ }
+ } else if (property == MappedConnectableObject::ConnectionsOut) {
+ MappedObjectValueList::const_iterator
+ it = m_connectionsOut.begin();
+
+ for ( ; it != m_connectionsOut.end(); ++it) {
+ list.push_back(QString("%1").arg(*it));
+ }
+ }
+
+ return list;
+}
+
+bool
+MappedAudioBuss::getProperty(const MappedObjectProperty &property,
+ MappedObjectValue &value)
+{
+ if (property == BussId) {
+ value = m_bussId;
+ } else if (property == Level) {
+ value = m_level;
+ } else if (property == Pan) {
+ value = m_pan;
+ } else {
+#ifdef DEBUG_MAPPEDSTUDIO
+ std::cerr << "MappedAudioBuss::getProperty - "
+ << "unsupported or non-scalar property" << std::endl;
+#endif
+
+ return false;
+ }
+ return true;
+}
+
+void
+MappedAudioBuss::setProperty(const MappedObjectProperty &property,
+ MappedObjectValue value)
+{
+ bool updateLevels = false;
+
+ if (property == MappedAudioBuss::BussId) {
+ m_bussId = (int)value;
+ updateLevels = true;
+ } else if (property == MappedAudioBuss::Level) {
+ m_level = value;
+ updateLevels = true;
+ } else if (property == MappedAudioBuss::Pan) {
+ m_pan = value;
+ updateLevels = true;
+ } else if (property == MappedConnectableObject::ConnectionsIn) {
+ m_connectionsIn.clear();
+ m_connectionsIn.push_back(value);
+ } else if (property == MappedConnectableObject::ConnectionsOut) {
+ m_connectionsOut.clear();
+ m_connectionsOut.push_back(value);
+ } else {
+#ifdef DEBUG_MAPPEDSTUDIO
+ std::cerr << "MappedAudioBuss::setProperty - "
+ << "unsupported property" << std::endl;
+#endif
+
+ return ;
+ }
+
+ if (updateLevels) {
+ MappedStudio *studio =
+ dynamic_cast<MappedStudio*>(getParent());
+
+ if (studio) {
+ studio->getSoundDriver()->setAudioBussLevels
+ (m_bussId, m_level, m_pan);
+ }
+ }
+}
+
+std::vector<InstrumentId>
+MappedAudioBuss::getInstruments()
+{
+ std::vector<InstrumentId> rv;
+
+ GET_LOCK;
+
+ MappedObject *studioObject = getParent();
+ while (!dynamic_cast<MappedStudio *>(studioObject))
+ studioObject = studioObject->getParent();
+
+ std::vector<MappedObject *> objects =
+ static_cast<MappedStudio *>(studioObject)->
+ getObjectsOfType(MappedObject::AudioFader);
+
+ for (std::vector<MappedObject *>::iterator i = objects.begin();
+ i != objects.end(); ++i) {
+ MappedAudioFader *fader = dynamic_cast<MappedAudioFader *>(*i);
+ if (fader) {
+ MappedObjectValueList connections = fader->getConnections
+ (MappedConnectableObject::Out);
+ if (!connections.empty() && (*connections.begin() == getId())) {
+ rv.push_back(fader->getInstrument());
+ }
+ }
+ }
+
+ RELEASE_LOCK;
+
+ return rv;
+}
+
+
+// ---------------- MappedAudioInput -------------------
+//
+//
+MappedAudioInput::MappedAudioInput(MappedObject *parent,
+ MappedObjectId id) :
+ MappedConnectableObject(parent,
+ "MappedAudioInput",
+ AudioInput,
+ id)
+{}
+
+MappedAudioInput::~MappedAudioInput()
+{}
+
+MappedObjectPropertyList
+MappedAudioInput::getPropertyList(const MappedObjectProperty &property)
+{
+ MappedObjectPropertyList list;
+
+ if (property == "") {
+ list.push_back(MappedAudioInput::InputNumber);
+ } else if (property == InputNumber) {
+ list.push_back(MappedObjectProperty("%1").arg(m_inputNumber));
+ }
+
+ return list;
+}
+
+bool
+MappedAudioInput::getProperty(const MappedObjectProperty &property,
+ MappedObjectValue &value)
+{
+ if (property == InputNumber) {
+ value = m_inputNumber;
+ } else {
+#ifdef DEBUG_MAPPEDSTUDIO
+ std::cerr << "MappedAudioInput::getProperty - "
+ << "no properties available" << std::endl;
+#endif
+
+ }
+ return false;
+}
+
+void
+MappedAudioInput::setProperty(const MappedObjectProperty &property,
+ MappedObjectValue value)
+{
+ if (property == InputNumber) {
+ m_inputNumber = value;
+ } else {
+#ifdef DEBUG_MAPPEDSTUDIO
+ std::cerr << "MappedAudioInput::setProperty - "
+ << "no properties available" << std::endl;
+#endif
+
+ }
+ return ;
+}
+
+
+MappedPluginSlot::MappedPluginSlot(MappedObject *parent, MappedObjectId id) :
+ MappedObject(parent, "MappedPluginSlot", PluginSlot, id)
+{
+#ifdef DEBUG_MAPPEDSTUDIO
+ std::cerr << "MappedPluginSlot::MappedPluginSlot: id = " << id << std::endl;
+#endif
+}
+
+MappedPluginSlot::~MappedPluginSlot()
+{
+#ifdef DEBUG_MAPPEDSTUDIO
+ std::cerr << "MappedPluginSlot::~MappedPluginSlot: id = " << getId() << ", identifier = " << m_identifier << std::endl;
+#endif
+
+ if (m_identifier != "") {
+
+ // shut down and remove the plugin instance we have running
+
+ MappedStudio *studio =
+ dynamic_cast<MappedStudio*>(getParent());
+
+ if (studio) {
+ SoundDriver *drv = studio->getSoundDriver();
+
+ if (drv) {
+ drv->removePluginInstance(m_instrument, m_position);
+ }
+ }
+ }
+}
+
+MappedObjectPropertyList
+MappedPluginSlot::getPropertyList(const MappedObjectProperty &property)
+{
+ MappedObjectPropertyList list;
+
+ if (property == "") {
+ list.push_back(PortCount);
+ list.push_back(Instrument);
+ list.push_back(Bypassed);
+ list.push_back(PluginName);
+ list.push_back(Label);
+ list.push_back(Author);
+ list.push_back(Copyright);
+ list.push_back(Category);
+ } else if (property == Programs) {
+
+ // The set of available programs is dynamic -- it can change
+ // while a plugin is instantiated. So we query it on demand
+ // each time.
+
+ MappedStudio *studio =
+ dynamic_cast<MappedStudio*>(getParent());
+
+ if (studio) {
+ QStringList programs =
+ studio->getSoundDriver()->getPluginInstancePrograms(m_instrument,
+ m_position);
+
+ for (int i = 0; i < int(programs.count()); ++i) {
+ list.push_back(programs[i]);
+ }
+ }
+
+ } else {
+ std::cerr << "MappedPluginSlot::getPropertyList: not a list property"
+ << std::endl;
+ }
+
+ return list;
+}
+
+bool
+MappedPluginSlot::getProperty(const MappedObjectProperty &property,
+ MappedObjectValue &value)
+{
+ if (property == PortCount) {
+ value = m_portCount;
+ } else if (property == Instrument) {
+ value = m_instrument;
+ } else if (property == Position) {
+ value = m_position;
+ } else if (property == Bypassed) {
+ value = m_bypassed;
+ } else {
+#ifdef DEBUG_MAPPEDSTUDIO
+ std::cerr << "MappedPluginSlot::getProperty - "
+ << "unsupported or non-scalar property" << std::endl;
+#endif
+
+ return false;
+ }
+ return true;
+}
+
+bool
+MappedPluginSlot::getProperty(const MappedObjectProperty &property,
+ QString &value)
+{
+ if (property == Identifier) {
+ value = m_identifier;
+ } else if (property == PluginName) {
+ value = m_name;
+ } else if (property == Label) {
+ value = m_label;
+ } else if (property == Author) {
+ value = m_author;
+ } else if (property == Copyright) {
+ value = m_copyright;
+ } else if (property == Category) {
+ value = m_category;
+ } else if (property == Program) {
+
+ MappedStudio *studio =
+ dynamic_cast<MappedStudio*>(getParent());
+
+ if (studio) {
+ value = studio->getSoundDriver()->getPluginInstanceProgram(m_instrument,
+ m_position);
+ }
+ } else {
+#ifdef DEBUG_MAPPEDSTUDIO
+ std::cerr << "MappedPluginSlot::getProperty - "
+ << "unsupported or non-scalar property" << std::endl;
+#endif
+
+ return false;
+ }
+ return true;
+}
+
+QString
+MappedPluginSlot::getProgram(int bank, int program)
+{
+ MappedStudio *studio =
+ dynamic_cast<MappedStudio*>(getParent());
+
+ if (studio) {
+ return
+ studio->getSoundDriver()->getPluginInstanceProgram(m_instrument,
+ m_position,
+ bank,
+ program);
+ }
+
+ return QString();
+}
+
+unsigned long
+MappedPluginSlot::getProgram(QString name)
+{
+ MappedStudio *studio =
+ dynamic_cast<MappedStudio*>(getParent());
+
+ if (studio) {
+ return
+ studio->getSoundDriver()->getPluginInstanceProgram(m_instrument,
+ m_position,
+ name);
+ }
+
+ return 0;
+}
+
+void
+MappedPluginSlot::setProperty(const MappedObjectProperty &property,
+ MappedObjectValue value)
+{
+ if (property == Instrument) {
+ m_instrument = InstrumentId(value);
+ } else if (property == PortCount) {
+ m_portCount = int(value);
+ } else if (property == Position) {
+ m_position = int(value);
+ } else if (property == Bypassed) {
+ m_bypassed = bool(value);
+
+ MappedStudio *studio =
+ dynamic_cast<MappedStudio*>(getParent());
+
+ if (studio) {
+ studio->getSoundDriver()->setPluginInstanceBypass(m_instrument,
+ m_position,
+ m_bypassed);
+ }
+ }
+}
+
+void
+MappedPluginSlot::setProperty(const MappedObjectProperty &property,
+ QString value)
+{
+ if (property == Identifier) {
+
+ if (m_identifier == value)
+ return ;
+
+ // shut down and remove the plugin instance we have running
+
+ MappedStudio *studio =
+ dynamic_cast<MappedStudio*>(getParent());
+
+ if (studio) {
+ SoundDriver *drv = studio->getSoundDriver();
+
+ if (drv) {
+
+ // We don't call drv->removePluginInstance at this
+ // point: the sequencer will deal with that when we
+ // call setPluginInstance below. If we removed the
+ // instance here, we might cause the library we want
+ // for the new plugin instance to be unloaded and then
+ // loaded again, which is hardly the most efficient.
+
+ m_identifier = value;
+
+ // populate myself and my ports
+ PluginFactory *factory = PluginFactory::instanceFor(m_identifier);
+ if (!factory) {
+ std::cerr << "WARNING: MappedPluginSlot::setProperty(identifier): No plugin factory for identifier " << m_identifier << "!" << std::endl;
+ m_identifier = "";
+ return ;
+ }
+
+ factory->populatePluginSlot(m_identifier, *this);
+
+ // now create the new instance
+ drv->setPluginInstance(m_instrument,
+ m_identifier,
+ m_position);
+ }
+ }
+
+ m_configuration.clear();
+
+ } else if (property == PluginName) {
+ m_name = value;
+ } else if (property == Label) {
+ m_label = value;
+ } else if (property == Author) {
+ m_author = value;
+ } else if (property == Copyright) {
+ m_copyright = value;
+ } else if (property == Category) {
+ m_category = value;
+ } else if (property == Program) {
+
+ MappedStudio *studio =
+ dynamic_cast<MappedStudio*>(getParent());
+
+ if (studio) {
+ studio->getSoundDriver()->setPluginInstanceProgram(m_instrument,
+ m_position,
+ value);
+ }
+ } else {
+
+#ifdef DEBUG_MAPPEDSTUDIO
+ std::cerr << "MappedPluginSlot::setProperty - "
+ << "unsupported or non-scalar property" << std::endl;
+#endif
+
+ }
+}
+
+void
+MappedPluginSlot::setPropertyList(const MappedObjectProperty &property,
+ const MappedObjectPropertyList &values)
+{
+ if (property == Configuration) {
+
+#ifdef DEBUG_MAPPEDSTUDIO
+ std::cerr << "MappedPluginSlot::setPropertyList(configuration): configuration is:" << std::endl;
+#endif
+
+ MappedStudio *studio =
+ dynamic_cast<MappedStudio*>(getParent());
+
+ for (MappedObjectPropertyList::const_iterator i = values.begin();
+ i != values.end(); ++i) {
+
+ QString key = *i;
+ QString value = *++i;
+
+#ifdef DEBUG_MAPPEDSTUDIO
+
+ std::cerr << key << " = " << value << std::endl;
+#endif
+
+ if (m_configuration.find(key) != m_configuration.end() &&
+ m_configuration[key] == value)
+ continue;
+
+ if (studio) {
+ QString rv =
+ studio->getSoundDriver()->configurePlugin(m_instrument,
+ m_position,
+ key, value);
+ if (rv && rv != "") {
+ throw(rv);
+ }
+ }
+ }
+
+ m_configuration.clear();
+
+ for (MappedObjectPropertyList::const_iterator i = values.begin();
+ i != values.end(); ++i) {
+
+ QString key = *i;
+ QString value = *++i;
+
+ m_configuration[key] = value;
+ }
+ } else {
+
+#ifdef DEBUG_MAPPEDSTUDIO
+ std::cerr << "MappedPluginSlot::setPropertyList - "
+ << "not a list property" << std::endl;
+#endif
+
+ }
+}
+
+void
+MappedPluginSlot::setPort(unsigned long portNumber, float value)
+{
+ std::vector<MappedObject*> ports = getChildObjects();
+ std::vector<MappedObject*>::iterator it = ports.begin();
+ MappedPluginPort *port = 0;
+
+ for (; it != ports.end(); it++) {
+ port = dynamic_cast<MappedPluginPort *>(*it);
+ if (port && (unsigned long)port->getPortNumber() == portNumber) {
+ port->setValue(value);
+ }
+ }
+}
+
+float
+MappedPluginSlot::getPort(unsigned long portNumber)
+{
+ std::vector<MappedObject*> ports = getChildObjects();
+ std::vector<MappedObject*>::iterator it = ports.begin();
+ MappedPluginPort *port = 0;
+
+ for (; it != ports.end(); it++) {
+ port = dynamic_cast<MappedPluginPort *>(*it);
+ if (port && (unsigned long)port->getPortNumber() == portNumber) {
+ return port->getValue();
+ }
+ }
+
+ return 0;
+}
+
+
+MappedPluginPort::MappedPluginPort(MappedObject *parent, MappedObjectId id) :
+ MappedObject(parent, "MappedPluginPort", PluginPort, id)
+{}
+
+MappedPluginPort::~MappedPluginPort()
+{}
+
+MappedObjectPropertyList
+MappedPluginPort::getPropertyList(const MappedObjectProperty &property)
+{
+ MappedObjectPropertyList list;
+
+ if (property == "") {
+ list.push_back(PortNumber);
+ list.push_back(Minimum);
+ list.push_back(Maximum);
+ list.push_back(Default);
+ list.push_back(DisplayHint);
+ list.push_back(Value);
+ list.push_back(Name);
+ } else {
+ std::cerr << "MappedPluginSlot::getPropertyList: not a list property"
+ << std::endl;
+ }
+
+ return list;
+}
+
+bool
+MappedPluginPort::getProperty(const MappedObjectProperty &property,
+ MappedObjectValue &value)
+{
+ if (property == PortNumber) {
+ value = m_portNumber;
+ } else if (property == Minimum) {
+ value = m_minimum;
+ } else if (property == Maximum) {
+ value = m_maximum;
+ } else if (property == Default) {
+ value = m_default;
+ } else if (property == DisplayHint) {
+ value = m_displayHint;
+ } else if (property == Value) {
+ return getValue();
+ } else {
+#ifdef DEBUG_MAPPEDSTUDIO
+ std::cerr << "MappedPluginPort::getProperty - "
+ << "unsupported or non-scalar property" << std::endl;
+#endif
+
+ return false;
+ }
+ return true;
+}
+
+bool
+MappedPluginPort::getProperty(const MappedObjectProperty &property,
+ QString &value)
+{
+ if (property == Name) {
+ value = m_name;
+ } else {
+
+#ifdef DEBUG_MAPPEDSTUDIO
+ std::cerr << "MappedPluginPort::getProperty - "
+ << "unsupported or non-scalar property" << std::endl;
+#endif
+
+ return false;
+ }
+ return true;
+}
+
+void
+MappedPluginPort::setValue(MappedObjectValue value)
+{
+ MappedPluginSlot *slot =
+ dynamic_cast<MappedPluginSlot *>(getParent());
+
+ if (slot) {
+
+ MappedStudio *studio =
+ dynamic_cast<MappedStudio *>(slot->getParent());
+
+ if (studio) {
+ SoundDriver *drv = studio->getSoundDriver();
+
+ if (drv) {
+ drv->setPluginInstancePortValue(slot->getInstrument(),
+ slot->getPosition(),
+ m_portNumber, value);
+ }
+ }
+ }
+}
+
+float
+MappedPluginPort::getValue() const
+{
+ const MappedPluginSlot *slot =
+ dynamic_cast<const MappedPluginSlot *>(getParent());
+
+ if (slot) {
+
+ const MappedStudio *studio =
+ dynamic_cast<const MappedStudio *>(slot->getParent());
+
+ if (studio) {
+ SoundDriver *drv =
+ const_cast<SoundDriver *>(studio->getSoundDriver());
+
+ if (drv) {
+ return drv->getPluginInstancePortValue(slot->getInstrument(),
+ slot->getPosition(),
+ m_portNumber);
+ }
+ }
+ }
+
+ return 0;
+}
+
+void
+MappedPluginPort::setProperty(const MappedObjectProperty &property,
+ MappedObjectValue value)
+{
+ if (property == PortNumber) {
+ m_portNumber = int(value);
+ } else if (property == Minimum) {
+ m_minimum = value;
+ } else if (property == Maximum) {
+ m_maximum = value;
+ } else if (property == Default) {
+ m_default = value;
+ } else if (property == DisplayHint) {
+ m_displayHint = PluginPort::PortDisplayHint(value);
+ } else if (property == Value) {
+ setValue(value);
+ } else {
+#ifdef DEBUG_MAPPEDSTUDIO
+ std::cerr << "MappedPluginPort::setProperty - "
+ << "unsupported or non-scalar property" << std::endl;
+#endif
+
+ }
+}
+
+
+void
+MappedPluginPort::setProperty(const MappedObjectProperty &property,
+ QString value)
+{
+ if (property == Name) {
+ m_name = value;
+ } else {
+
+#ifdef DEBUG_MAPPEDSTUDIO
+ std::cerr << "MappedPluginPort::setProperty - "
+ << "unsupported or non-scalar property" << std::endl;
+#endif
+
+ }
+}
+
+
+}
+
+
+
diff --git a/src/sound/MappedStudio.h b/src/sound/MappedStudio.h
new file mode 100644
index 0000000..0896e6b
--- /dev/null
+++ b/src/sound/MappedStudio.h
@@ -0,0 +1,552 @@
+// -*- c-indentation-style:"stroustrup" c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include <map>
+#include <string>
+#include <vector>
+#include <qdatastream.h>
+#include <qstring.h>
+
+#include "MappedCommon.h"
+#include "Instrument.h"
+#include "Device.h"
+
+#include "AudioPluginInstance.h" // for PluginPort::PortDisplayHint //!!!???
+
+#ifndef _MAPPEDSTUDIO_H_
+#define _MAPPEDSTUDIO_H_
+
+
+// A sequencer-side representation of certain elements in the
+// gui that enables us to control outgoing or incoming audio
+// and MIDI with run-time only persistence. Placeholders for
+// our Studio elements on the sequencer.
+
+namespace Rosegarden
+{
+
+class SoundDriver;
+
+
+// Types are in MappedCommon.h
+//
+class MappedObject
+{
+public:
+
+ // Some common properties
+ //
+ static const MappedObjectProperty Name;
+ static const MappedObjectProperty Instrument;
+ static const MappedObjectProperty Position;
+
+ // The object we can create
+ //
+ typedef enum
+ {
+ Studio,
+ AudioFader, // connectable fader - interfaces with devices
+ AudioBuss, // connectable buss - inferfaces with faders
+ AudioInput, // connectable record input
+ PluginSlot,
+ PluginPort
+
+ } MappedObjectType;
+
+ MappedObject(MappedObject *parent,
+ const std::string &name,
+ MappedObjectType type,
+ MappedObjectId id):
+ m_type(type),
+ m_id(id),
+ m_name(name),
+ m_parent(parent) {;}
+
+ virtual ~MappedObject() {;}
+
+ MappedObjectId getId() { return m_id; }
+ MappedObjectType getType() { return m_type; }
+
+ std::string getName() { return m_name; }
+ void setName(const std::string &name) { m_name= name; }
+
+ // Get and set properties
+ //
+ virtual MappedObjectPropertyList
+ getPropertyList(const MappedObjectProperty &property) = 0;
+
+ virtual bool getProperty(const MappedObjectProperty &property,
+ MappedObjectValue &value) = 0;
+
+ // Only relevant to objects that have string properties
+ //
+ virtual bool getProperty(const MappedObjectProperty &/* property */,
+ QString &/* value */) { return false; }
+
+ virtual void setProperty(const MappedObjectProperty &property,
+ MappedObjectValue value) = 0;
+
+ // Only relevant to objects that have string properties
+ //
+ virtual void setProperty(const MappedObjectProperty &/* property */,
+ QString /* value */) { }
+
+ // Only relevant to objects that have list properties
+ //
+ virtual void setPropertyList(const MappedObjectProperty &/* property */,
+ const MappedObjectPropertyList &/* values */) { }
+
+ // Ownership
+ //
+ MappedObject* getParent() { return m_parent; }
+ const MappedObject* getParent() const { return m_parent; }
+ void setParent(MappedObject *parent) { m_parent = parent; }
+
+ // Get a list of child ids - get a list of a certain type
+ //
+ MappedObjectPropertyList getChildren();
+ MappedObjectPropertyList getChildren(MappedObjectType type);
+
+ // Child management
+ //
+ void addChild(MappedObject *mO);
+ void removeChild(MappedObject *mO);
+
+ // Destruction
+ //
+ void destroy();
+ void destroyChildren();
+
+ std::vector<MappedObject*> getChildObjects() { return m_children; }
+
+protected:
+
+ MappedObjectType m_type;
+ MappedObjectId m_id;
+ std::string m_name;
+
+ MappedObject *m_parent;
+ std::vector<MappedObject*> m_children;
+};
+
+
+class MappedAudioFader;
+class MappedAudioBuss;
+class MappedAudioInput;
+
+// Works as a factory and virtual plug-board for all our other
+// objects whether they be MIDI or audio.
+//
+//
+//
+class MappedStudio : public MappedObject
+{
+public:
+ MappedStudio();
+ ~MappedStudio();
+
+ // Create a new slider of a certain type for a certain
+ // type of device.
+ //
+ MappedObject* createObject(MappedObjectType type);
+
+ // And create an object with a specified id
+ //
+ MappedObject* createObject(MappedObjectType type,
+ MappedObjectId id);
+
+ bool connectObjects(MappedObjectId mId1, MappedObjectId mId2);
+ bool disconnectObjects(MappedObjectId mId1, MappedObjectId mId2);
+ bool disconnectObject(MappedObjectId mId);
+
+ // Destroy a MappedObject by ID
+ //
+ bool destroyObject(MappedObjectId id);
+
+ // Get an object by ID only
+ //
+ MappedObject* getObjectById(MappedObjectId);
+
+ // Get an object by ID and type. (Returns 0 if the ID does not
+ // exist or exists but is not of the correct type.) This is
+ // faster than getObjectById if you know the type already.
+ //
+ MappedObject* getObjectByIdAndType(MappedObjectId, MappedObjectType);
+
+ // Get an arbitrary object of a given type - to see if any exist
+ //
+ MappedObject* getObjectOfType(MappedObjectType type);
+
+ // Find out how many objects there are of a certain type
+ //
+ unsigned int getObjectCount(MappedObjectType type);
+
+ // iterators
+ MappedObject* getFirst(MappedObjectType type);
+ MappedObject* getNext(MappedObject *object);
+
+ std::vector<MappedObject *> getObjectsOfType(MappedObjectType type);
+
+ // Empty the studio of everything
+ //
+ void clear();
+
+ // Clear a MappedObject reference from the Studio
+ //
+ bool clearObject(MappedObjectId id);
+
+ // Property list
+ //
+ virtual MappedObjectPropertyList getPropertyList(
+ const MappedObjectProperty &property);
+
+ virtual bool getProperty(const MappedObjectProperty &property,
+ MappedObjectValue &value);
+
+ virtual void setProperty(const MappedObjectProperty &property,
+ MappedObjectValue value);
+
+ // Get an audio fader for an InstrumentId. Convenience function.
+ //
+ MappedAudioFader *getAudioFader(InstrumentId id);
+ MappedAudioBuss *getAudioBuss(int bussNumber); // not buss no., not object id
+ MappedAudioInput *getAudioInput(int inputNumber); // likewise
+
+ // Return the object vector
+ //
+ //std::vector<MappedObject*>* getObjects() const { return &m_objects; }
+
+ // DCOP streaming
+ //
+ /* dunno if we need this
+ friend QDataStream& operator>>(QDataStream &dS, MappedStudio *mS);
+ friend QDataStream& operator<<(QDataStream &dS, MappedStudio *mS);
+ friend QDataStream& operator>>(QDataStream &dS, MappedStudio &mS);
+ friend QDataStream& operator<<(QDataStream &dS, const MappedStudio &mS);
+ */
+
+
+ // Set the driver object so that we can do things like
+ // initialise plugins etc.
+ //
+ SoundDriver* getSoundDriver() { return m_soundDriver; }
+ const SoundDriver* getSoundDriver() const { return m_soundDriver; }
+ void setSoundDriver(SoundDriver *driver) { m_soundDriver = driver; }
+
+protected:
+
+private:
+
+ // We give everything we create a unique MappedObjectId for
+ // this session. So store the running total in here.
+ //
+ MappedObjectId m_runningObjectId;
+
+ // All of our mapped (virtual) studio resides in this container as
+ // well as having all their parent/child relationships. Because
+ // some things are just blobs with no connections we need to
+ // maintain both - don't forget about this.
+ //
+ // Note that object IDs are globally unique, not just unique within
+ // a category.
+ //
+ typedef std::map<MappedObjectId, MappedObject *> MappedObjectCategory;
+ typedef std::map<MappedObjectType, MappedObjectCategory> MappedObjectMap;
+ MappedObjectMap m_objects;
+
+ // Driver object
+ //
+ SoundDriver *m_soundDriver;
+};
+
+
+// A connectable AudioObject that provides a connection framework
+// for MappedAudioFader and MappedAudioBuss (for example). An
+// abstract base class.
+//
+// n input connections and m output connections - subclasses
+// can do the cleverness if n != m
+//
+
+class MappedConnectableObject : public MappedObject
+{
+public:
+ static const MappedObjectProperty ConnectionsIn;
+ static const MappedObjectProperty ConnectionsOut;
+
+ typedef enum
+ {
+ In,
+ Out
+ } ConnectionDirection;
+
+ MappedConnectableObject(MappedObject *parent,
+ const std::string &name,
+ MappedObjectType type,
+ MappedObjectId id);
+
+ ~MappedConnectableObject();
+
+ void setConnections(ConnectionDirection dir,
+ MappedObjectValueList conns);
+
+ void addConnection(ConnectionDirection dir, MappedObjectId id);
+ void removeConnection(ConnectionDirection dir, MappedObjectId id);
+
+ MappedObjectValueList getConnections (ConnectionDirection dir);
+
+protected:
+
+ // Which audio connections we have
+ //
+ MappedObjectValueList m_connectionsIn;
+ MappedObjectValueList m_connectionsOut;
+};
+
+// Audio fader
+//
+class MappedAudioFader : public MappedConnectableObject
+{
+public:
+ static const MappedObjectProperty Channels;
+
+ // properties
+ //
+ static const MappedObjectProperty FaderLevel;
+ static const MappedObjectProperty FaderRecordLevel;
+ static const MappedObjectProperty Pan;
+ static const MappedObjectProperty InputChannel;
+
+ MappedAudioFader(MappedObject *parent,
+ MappedObjectId id,
+ MappedObjectValue channels = 2); // stereo default
+ ~MappedAudioFader();
+
+ virtual MappedObjectPropertyList getPropertyList(
+ const MappedObjectProperty &property);
+
+ virtual bool getProperty(const MappedObjectProperty &property,
+ MappedObjectValue &value);
+
+ virtual void setProperty(const MappedObjectProperty &property,
+ MappedObjectValue value);
+
+ InstrumentId getInstrument() const { return m_instrumentId; }
+
+protected:
+
+ MappedObjectValue m_level;
+ MappedObjectValue m_recordLevel;
+ InstrumentId m_instrumentId;
+
+ // Stereo pan (-1.0 to +1.0)
+ //
+ MappedObjectValue m_pan;
+
+ // How many channels we carry
+ //
+ MappedObjectValue m_channels;
+
+ // If we have an input, which channel we take from it (if we are
+ // a mono fader at least)
+ //
+ MappedObjectValue m_inputChannel;
+};
+
+class MappedAudioBuss : public MappedConnectableObject
+{
+public:
+ // A buss is much simpler than an instrument fader. It's always
+ // stereo, and just has a level and pan associated with it. The
+ // level may be a submaster fader level or a send mix level, it
+ // depends on what the purpose of the buss is. At the moment we
+ // just have a 1-1 relationship between busses and submasters, and
+ // no send channels.
+
+ static const MappedObjectProperty BussId;
+ static const MappedObjectProperty Pan;
+ static const MappedObjectProperty Level;
+
+ MappedAudioBuss(MappedObject *parent,
+ MappedObjectId id);
+ ~MappedAudioBuss();
+
+ virtual MappedObjectPropertyList getPropertyList(
+ const MappedObjectProperty &property);
+
+ virtual bool getProperty(const MappedObjectProperty &property,
+ MappedObjectValue &value);
+
+ virtual void setProperty(const MappedObjectProperty &property,
+ MappedObjectValue value);
+
+ MappedObjectValue getBussId() { return m_bussId; }
+
+ // super-convenience function: retrieve the ids of the instruments
+ // connected to this buss
+ std::vector<InstrumentId> getInstruments();
+
+protected:
+ int m_bussId;
+ MappedObjectValue m_level;
+ MappedObjectValue m_pan;
+};
+
+class MappedAudioInput : public MappedConnectableObject
+{
+public:
+ // An input is simpler still -- no properties at all, apart from
+ // the input number, otherwise just the connections
+
+ static const MappedObjectProperty InputNumber;
+
+ MappedAudioInput(MappedObject *parent,
+ MappedObjectId id);
+ ~MappedAudioInput();
+
+ virtual MappedObjectPropertyList getPropertyList(
+ const MappedObjectProperty &property);
+
+ virtual bool getProperty(const MappedObjectProperty &property,
+ MappedObjectValue &value);
+
+ virtual void setProperty(const MappedObjectProperty &property,
+ MappedObjectValue value);
+
+ MappedObjectValue getInputNumber() { return m_inputNumber; }
+
+protected:
+ MappedObjectValue m_inputNumber;
+};
+
+class MappedPluginSlot : public MappedObject
+{
+public:
+ static const MappedObjectProperty Identifier;
+ static const MappedObjectProperty PluginName;
+ static const MappedObjectProperty Label;
+ static const MappedObjectProperty Author;
+ static const MappedObjectProperty Copyright;
+ static const MappedObjectProperty Category;
+ static const MappedObjectProperty PortCount;
+ static const MappedObjectProperty Ports;
+ static const MappedObjectProperty Program;
+ static const MappedObjectProperty Programs; // list property
+ static const MappedObjectProperty Instrument;
+ static const MappedObjectProperty Position;
+ static const MappedObjectProperty Bypassed;
+ static const MappedObjectProperty Configuration; // list property
+
+ MappedPluginSlot(MappedObject *parent, MappedObjectId id);
+ ~MappedPluginSlot();
+
+ virtual MappedObjectPropertyList getPropertyList(
+ const MappedObjectProperty &property);
+
+ virtual bool getProperty(const MappedObjectProperty &property,
+ MappedObjectValue &value);
+
+ virtual bool getProperty(const MappedObjectProperty &property,
+ QString &value);
+
+ virtual void setProperty(const MappedObjectProperty &property,
+ MappedObjectValue value);
+
+ virtual void setProperty(const MappedObjectProperty &property,
+ QString value);
+
+ virtual void setPropertyList(const MappedObjectProperty &,
+ const MappedObjectPropertyList &);
+
+ void setPort(unsigned long portNumber, float value);
+ float getPort(unsigned long portNumber);
+
+ InstrumentId getInstrument() const { return m_instrument; }
+ int getPosition() const { return m_position; }
+
+ QString getProgram(int bank, int program);
+ unsigned long getProgram(QString name); // rv is bank << 16 + program
+
+protected:
+ QString m_identifier;
+
+ QString m_name;
+ QString m_label;
+ QString m_author;
+ QString m_copyright;
+ QString m_category;
+ unsigned long m_portCount;
+
+ InstrumentId m_instrument;
+ int m_position;
+ bool m_bypassed;
+
+ std::map<QString, QString> m_configuration;
+};
+
+class MappedPluginPort : public MappedObject
+{
+public:
+ static const MappedObjectProperty PortNumber;
+ static const MappedObjectProperty Name;
+ static const MappedObjectProperty Minimum;
+ static const MappedObjectProperty Maximum;
+ static const MappedObjectProperty Default;
+ static const MappedObjectProperty DisplayHint;
+ static const MappedObjectProperty Value;
+
+ MappedPluginPort(MappedObject *parent, MappedObjectId id);
+ ~MappedPluginPort();
+
+ virtual MappedObjectPropertyList getPropertyList(
+ const MappedObjectProperty &property);
+
+ virtual bool getProperty(const MappedObjectProperty &property,
+ MappedObjectValue &value);
+
+ virtual bool getProperty(const MappedObjectProperty &property,
+ QString &value);
+
+ virtual void setProperty(const MappedObjectProperty &property,
+ MappedObjectValue value);
+
+ virtual void setProperty(const MappedObjectProperty &property,
+ QString value);
+
+ void setValue(MappedObjectValue value);
+ MappedObjectValue getValue() const;
+
+ int getPortNumber() const { return m_portNumber; }
+
+protected:
+ int m_portNumber;
+ QString m_name;
+ MappedObjectValue m_minimum;
+ MappedObjectValue m_maximum;
+ MappedObjectValue m_default;
+ PluginPort::PortDisplayHint m_displayHint;
+
+};
+
+
+}
+
+#endif // _MAPPEDSTUDIO_H_
diff --git a/src/sound/Midi.h b/src/sound/Midi.h
new file mode 100644
index 0000000..65bfe93
--- /dev/null
+++ b/src/sound/Midi.h
@@ -0,0 +1,184 @@
+// -*- c-indentation-style:"stroustrup" c-basic-offset: 4 -*-
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#ifndef _ROSEGARDEN_MIDI_H_
+#define _ROSEGARDEN_MIDI_H_
+
+#include "Instrument.h" // for MidiByte
+#include <string>
+
+// Yes we use the STL here. Don't worry, it's fine.
+//
+//
+
+namespace Rosegarden
+{
+// Within the namespace we define our static MIDI messages
+// that'll help us create and understand MIDI files.
+//
+// CreateMessageByte(MSG, CHANNEL) = (MSG) | (CHANNEL)
+//
+//
+
+const std::string MIDI_FILE_HEADER = "MThd";
+const std::string MIDI_TRACK_HEADER = "MTrk";
+
+const MidiByte MIDI_STATUS_BYTE_MASK = 0x80;
+const MidiByte MIDI_MESSAGE_TYPE_MASK = 0xF0;
+const MidiByte MIDI_CHANNEL_NUM_MASK = 0x0F;
+
+// our basic MIDI messages
+//
+const MidiByte MIDI_NOTE_OFF = 0x80;
+const MidiByte MIDI_NOTE_ON = 0x90;
+const MidiByte MIDI_POLY_AFTERTOUCH = 0xA0;
+const MidiByte MIDI_CTRL_CHANGE = 0xB0;
+const MidiByte MIDI_PROG_CHANGE = 0xC0;
+const MidiByte MIDI_CHNL_AFTERTOUCH = 0xD0;
+const MidiByte MIDI_PITCH_BEND = 0xE0;
+
+// channel mode
+//
+const MidiByte MIDI_SELECT_CHNL_MODE = 0xB0;
+
+// system messages
+const MidiByte MIDI_SYSTEM_EXCLUSIVE = 0xF0;
+const MidiByte MIDI_TC_QUARTER_FRAME = 0xF1;
+const MidiByte MIDI_SONG_POSITION_PTR = 0xF2;
+const MidiByte MIDI_SONG_SELECT = 0xF3;
+const MidiByte MIDI_TUNE_REQUEST = 0xF6;
+const MidiByte MIDI_END_OF_EXCLUSIVE = 0xF7;
+
+const MidiByte MIDI_TIMING_CLOCK = 0xF8;
+const MidiByte MIDI_START = 0xFA;
+const MidiByte MIDI_CONTINUE = 0xFB;
+const MidiByte MIDI_STOP = 0xFC;
+const MidiByte MIDI_ACTIVE_SENSING = 0xFE;
+const MidiByte MIDI_SYSTEM_RESET = 0xFF;
+
+// System Exclusive Extensions
+//
+
+// Non-commercial use
+//
+const MidiByte MIDI_SYSEX_NONCOMMERCIAL = 0x7D;
+
+// Universal non-real time use
+// Format:
+//
+// 0xF0 0x7E <device id> <sub id #1> <sub id #2> <data> 0xF7
+//
+const MidiByte MIDI_SYSEX_NON_RT = 0x7E;
+
+// RealTime e.g Midi Machine Control (MMC)
+//
+// 0xF0 0x7F <device id> <sub id #1> <sub id #2> <data> 0xF7
+//
+const MidiByte MIDI_SYSEX_RT = 0x7F;
+
+// Sub IDs for RealTime SysExs
+//
+const MidiByte MIDI_SYSEX_RT_COMMAND = 0x06;
+const MidiByte MIDI_SYSEX_RT_RESPONSE = 0x07;
+
+// MMC commands
+//
+const MidiByte MIDI_MMC_STOP = 0x01;
+const MidiByte MIDI_MMC_PLAY = 0x02;
+const MidiByte MIDI_MMC_DEFERRED_PLAY = 0x03;
+const MidiByte MIDI_MMC_FAST_FORWARD = 0x04;
+const MidiByte MIDI_MMC_REWIND = 0x05;
+const MidiByte MIDI_MMC_RECORD_STROBE = 0x06; // punch in
+const MidiByte MIDI_MMC_RECORD_EXIT = 0x07; // punch out
+const MidiByte MIDI_MMC_RECORD_PAUSE = 0x08;
+const MidiByte MIDI_MMC_PAUSE = 0x08;
+const MidiByte MIDI_MMC_EJECT = 0x0A;
+const MidiByte MIDI_MMC_LOCATE = 0x44; // jump to
+
+
+// Midi Event Code for META Event
+//
+const MidiByte MIDI_FILE_META_EVENT = 0xFF;
+
+// META Event Codes
+//
+const MidiByte MIDI_SEQUENCE_NUMBER = 0x00;
+const MidiByte MIDI_TEXT_EVENT = 0x01;
+const MidiByte MIDI_COPYRIGHT_NOTICE = 0x02;
+const MidiByte MIDI_TRACK_NAME = 0x03;
+const MidiByte MIDI_INSTRUMENT_NAME = 0x04;
+const MidiByte MIDI_LYRIC = 0x05;
+const MidiByte MIDI_TEXT_MARKER = 0x06;
+const MidiByte MIDI_CUE_POINT = 0x07;
+const MidiByte MIDI_CHANNEL_PREFIX = 0x20;
+
+// There is contention over what 0x21 really means.
+// It's either a miswritten CHANNEL PREFIX or it's
+// a non-standard PORT MAPPING used by a sequencer.
+// Either way we include it (and generally ignore it)
+// as it's a part of many MIDI files that already
+// exist.
+const MidiByte MIDI_CHANNEL_PREFIX_OR_PORT = 0x21;
+
+const MidiByte MIDI_END_OF_TRACK = 0x2F;
+const MidiByte MIDI_SET_TEMPO = 0x51;
+const MidiByte MIDI_SMPTE_OFFSET = 0x54;
+const MidiByte MIDI_TIME_SIGNATURE = 0x58;
+const MidiByte MIDI_KEY_SIGNATURE = 0x59;
+const MidiByte MIDI_SEQUENCER_SPECIFIC = 0x7F;
+
+// Some controllers
+//
+const MidiByte MIDI_CONTROLLER_BANK_MSB = 0x00;
+const MidiByte MIDI_CONTROLLER_VOLUME = 0x07;
+const MidiByte MIDI_CONTROLLER_BANK_LSB = 0x20;
+const MidiByte MIDI_CONTROLLER_MODULATION = 0x01;
+const MidiByte MIDI_CONTROLLER_PAN = 0x0A;
+const MidiByte MIDI_CONTROLLER_SUSTAIN = 0x40;
+const MidiByte MIDI_CONTROLLER_RESONANCE = 0x47;
+const MidiByte MIDI_CONTROLLER_RELEASE = 0x48;
+const MidiByte MIDI_CONTROLLER_ATTACK = 0x49;
+const MidiByte MIDI_CONTROLLER_FILTER = 0x4A;
+const MidiByte MIDI_CONTROLLER_REVERB = 0x5B;
+const MidiByte MIDI_CONTROLLER_CHORUS = 0x5D;
+
+// Registered and Non-Registered Parameter Controllers
+//
+const MidiByte MIDI_CONTROLLER_NRPN_1 = 0x62;
+const MidiByte MIDI_CONTROLLER_NRPN_2 = 0x63;
+const MidiByte MIDI_CONTROLLER_RPN_1 = 0x64;
+const MidiByte MIDI_CONTROLLER_RPN_2 = 0x65;
+
+const MidiByte MIDI_CONTROLLER_SOUNDS_OFF = 0x78;
+const MidiByte MIDI_CONTROLLER_RESET = 0x79; // reset all controllers
+const MidiByte MIDI_CONTROLLER_LOCAL = 0x7A; // 0 = off, 127 = on
+const MidiByte MIDI_CONTROLLER_ALL_NOTES_OFF = 0x7B;
+
+
+// MIDI percussion channel
+const MidiByte MIDI_PERCUSSION_CHANNEL = 9;
+
+
+
+}
+
+
+#endif // _ROSEGARDEN_MIDI_H_
diff --git a/src/sound/MidiEvent.cpp b/src/sound/MidiEvent.cpp
new file mode 100644
index 0000000..975b7aa
--- /dev/null
+++ b/src/sound/MidiEvent.cpp
@@ -0,0 +1,289 @@
+// -*- c-indentation-style:"stroustrup" c-basic-offset: 4 -*-
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include "Midi.h"
+#include "MidiEvent.h"
+#include <iostream>
+
+// MidiEvent is a representation of MIDI which we use
+// for the import/export of MidiFiles. It uses std::strings for
+// meta event messages which makes them nice and easy to handle.
+//
+//
+namespace Rosegarden
+{
+
+using std::string;
+using std::cout;
+using std::endl;
+
+MidiEvent::MidiEvent()
+{}
+
+MidiEvent::MidiEvent(timeT deltaTime,
+ MidiByte eventCode):
+ m_deltaTime(deltaTime),
+ m_duration(0),
+ m_eventCode(eventCode),
+ m_data1(0),
+ m_data2(0),
+ m_metaEventCode(0),
+ m_metaMessage("")
+{}
+
+MidiEvent::MidiEvent(timeT deltaTime,
+ MidiByte eventCode,
+ MidiByte data1):
+ m_deltaTime(deltaTime),
+ m_duration(0),
+ m_eventCode(eventCode),
+ m_data1(data1),
+ m_data2(0),
+ m_metaEventCode(0),
+ m_metaMessage("")
+{}
+
+MidiEvent::MidiEvent(timeT deltaTime,
+ MidiByte eventCode,
+ MidiByte data1,
+ MidiByte data2):
+ m_deltaTime(deltaTime),
+ m_duration(0),
+ m_eventCode(eventCode),
+ m_data1(data1),
+ m_data2(data2),
+ m_metaEventCode(0),
+ m_metaMessage("")
+
+{}
+
+MidiEvent::MidiEvent(timeT deltaTime,
+ MidiByte eventCode,
+ MidiByte metaEventCode,
+ const string &metaMessage):
+ m_deltaTime(deltaTime),
+ m_duration(0),
+ m_eventCode(eventCode),
+ m_data1(0),
+ m_data2(0),
+ m_metaEventCode(metaEventCode),
+ m_metaMessage(metaMessage)
+{}
+
+MidiEvent::MidiEvent(timeT deltaTime,
+ MidiByte eventCode,
+ const string &sysEx):
+ m_deltaTime(deltaTime),
+ m_duration(0),
+ m_eventCode(eventCode),
+ m_data1(0),
+ m_data2(0),
+ m_metaEventCode(0),
+ m_metaMessage(sysEx)
+{}
+
+MidiEvent::~MidiEvent()
+{}
+
+// Show a representation of our MidiEvent purely for information
+// purposes (also demos how we decode them)
+//
+//
+void
+MidiEvent::print()
+{
+ timeT tempo;
+ int tonality;
+ string sharpflat;
+
+ if (m_metaEventCode) {
+ switch (m_metaEventCode) {
+ case MIDI_SEQUENCE_NUMBER:
+ cout << "MIDI SEQUENCE NUMBER" << endl;
+ break;
+
+ case MIDI_TEXT_EVENT:
+ cout << "MIDI TEXT:\t\"" << m_metaMessage << "\"" << endl;
+ break;
+
+ case MIDI_COPYRIGHT_NOTICE:
+ cout << "COPYRIGHT:\t\"" << m_metaMessage << "\"" << endl;
+
+ case MIDI_TRACK_NAME:
+ cout << "TRACK NAME:\t\"" << m_metaMessage << "\"" << endl;
+ break;
+
+ case MIDI_INSTRUMENT_NAME:
+ cout << "INSTRUMENT NAME:\t\"" << m_metaMessage << "\"" << endl;
+ break;
+
+ case MIDI_LYRIC:
+ cout << "LYRIC:\t\"" << m_metaMessage << "\"" << endl;
+ break;
+
+ case MIDI_TEXT_MARKER:
+ cout << "MARKER:\t\"" << m_metaMessage << "\"" << endl;
+ break;
+
+ case MIDI_CUE_POINT:
+ cout << "CUE POINT:\t\"" << m_metaMessage << "\"" << endl;
+ break;
+
+ // Sets a Channel number for a TRACK before it starts
+ case MIDI_CHANNEL_PREFIX:
+ cout << "CHANNEL PREFIX:\t"
+ << (timeT)m_metaMessage[0]
+ << endl;
+ break;
+
+ // These are actually the same case but this is not an
+ // official META event - it just crops up a lot. We
+ // assume it's a MIDI_CHANNEL_PREFIX though
+ //
+ case MIDI_CHANNEL_PREFIX_OR_PORT:
+ cout << "FIXED CHANNEL PREFIX:\t"
+ << (timeT)m_metaMessage[0] << endl;
+ break;
+
+ case MIDI_END_OF_TRACK:
+ cout << "END OF TRACK" << endl;
+ break;
+
+ case MIDI_SET_TEMPO:
+ tempo =
+ ((timeT)(((MidiByte)m_metaMessage[0]) << 16)) +
+ ((timeT)(((MidiByte)m_metaMessage[1]) << 8)) +
+ (short)(MidiByte)m_metaMessage[2];
+
+ tempo = 60000000 / tempo;
+ cout << "SET TEMPO:\t" << tempo << endl;
+ break;
+
+ case MIDI_SMPTE_OFFSET:
+ cout << "SMPTE TIME CODE:\t"
+ << (timeT)m_metaMessage[0]
+ << ":" << (timeT)m_metaMessage[1]
+ << ":" << (timeT)m_metaMessage[2]
+ << " - fps = " << (timeT)m_metaMessage[3]
+ << " - subdivsperframe = "
+ << (timeT)m_metaMessage[4]
+ << endl;
+ break;
+
+ case MIDI_TIME_SIGNATURE:
+ cout << "TIME SIGNATURE:\t"
+ << (timeT)m_metaMessage[0]
+ << "/"
+ << (1 << (timeT)m_metaMessage[1]) << endl;
+ break;
+
+ case MIDI_KEY_SIGNATURE:
+ tonality = (int)m_metaMessage[0];
+
+ if (tonality < 0) {
+ sharpflat = -tonality + " flat";
+ } else {
+ sharpflat = tonality;
+ sharpflat += " sharp";
+ }
+
+ cout << "KEY SIGNATURE:\t" << sharpflat << " "
+ << (((int)m_metaMessage[1]) == 0 ? "major" : "minor")
+ << endl;
+
+ break;
+
+ case MIDI_SEQUENCER_SPECIFIC:
+ cout << "SEQUENCER SPECIFIC:\t\"" << m_metaMessage << endl;
+ break;
+
+
+ default:
+ cout << "Undefined MIDI META event - "
+ << (timeT)m_metaEventCode << endl;
+ break;
+ }
+ } else {
+ switch (m_eventCode & MIDI_MESSAGE_TYPE_MASK) {
+ case MIDI_NOTE_ON:
+ cout << "NOTE ON:\t" << (int)m_data1 << " - "
+ << (int)m_data2 << endl;
+ break;
+
+ case MIDI_NOTE_OFF:
+ cout << "NOTE OFF:\t" << (int)m_data1 << " - "
+ << (int)m_data2 << endl;
+ break;
+
+ case MIDI_POLY_AFTERTOUCH:
+ cout << "POLY AFTERTOUCH:\t" << (int)m_data1
+ << " - " << (int)m_data2 << endl;
+ break;
+
+ case MIDI_CTRL_CHANGE:
+ cout << "CTRL CHANGE:\t" << (int)m_data1
+ << " - " << (int)m_data2 << endl;
+ break;
+
+ case MIDI_PITCH_BEND:
+ cout << "PITCH BEND:\t" << (int)m_data1
+ << " - " << (int)m_data2 << endl;
+ break;
+
+ case MIDI_PROG_CHANGE:
+ cout << "PROG CHANGE:\t" << (int)m_data1 << endl;
+ break;
+
+ case MIDI_CHNL_AFTERTOUCH:
+ cout << "CHNL AFTERTOUCH\t" << (int)m_data1 << endl;
+ break;
+
+ default:
+ cout << "Undefined MIDI event" << endl;
+ break;
+ }
+ }
+
+
+ return ;
+}
+
+// Adds the argument to _deltaTime and returns the result
+// thus aggregating the times as we go aint
+timeT
+MidiEvent::addTime(const timeT &time)
+{
+ m_deltaTime += time;
+ return m_deltaTime;
+}
+
+
+// Compare based on time
+//
+bool
+operator<(const MidiEvent &a, const MidiEvent &b)
+{
+ return a.getTime() < b.getTime();
+}
+
+
+}
+
+
diff --git a/src/sound/MidiEvent.h b/src/sound/MidiEvent.h
new file mode 100644
index 0000000..b2192b4
--- /dev/null
+++ b/src/sound/MidiEvent.h
@@ -0,0 +1,141 @@
+// -*- c-indentation-style:"stroustrup" c-basic-offset: 4 -*-
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#ifndef _ROSEGARDEN_MIDI_EVENT_H_
+#define _ROSEGARDEN_MIDI_EVENT_H_
+
+#include "Midi.h"
+#include "Event.h"
+
+// MidiEvent holds MIDI and Event data during MIDI file I/O.
+// We don't use this class at all for playback or recording of MIDI -
+// for that look at MappedEvent and MappedComposition.
+//
+// Rosegarden doesn't have any internal concept of MIDI events, only
+// Events which are a superset of MIDI functionality.
+//
+// Check out Event in base/ for more information.
+//
+//
+//
+
+namespace Rosegarden
+{
+class MidiEvent
+{
+
+public:
+ MidiEvent();
+
+ // No data event
+ //
+ MidiEvent(timeT deltaTime,
+ MidiByte eventCode);
+
+ // single data byte case
+ //
+ MidiEvent(timeT deltaTime,
+ MidiByte eventCode,
+ MidiByte data1);
+
+ // double data byte
+ //
+ MidiEvent(timeT deltaTime,
+ MidiByte eventCode,
+ MidiByte data1,
+ MidiByte data2);
+
+ // Meta event
+ //
+ MidiEvent(timeT deltaTime,
+ MidiByte eventCode,
+ MidiByte metaEventCode,
+ const std::string &metaMessage);
+
+ // Sysex style constructor
+ //
+ MidiEvent(timeT deltaTime,
+ MidiByte eventCode,
+ const std::string &sysEx);
+
+
+ ~MidiEvent();
+
+ // View our event as text
+ //
+ void print();
+
+
+ void setTime(const timeT &time) { m_deltaTime = time; }
+ void setDuration(const timeT& duration) {m_duration = duration;}
+ timeT addTime(const timeT &time);
+
+ MidiByte getMessageType() const
+ { return ( m_eventCode & MIDI_MESSAGE_TYPE_MASK ); }
+
+ MidiByte getChannelNumber() const
+ { return ( m_eventCode & MIDI_CHANNEL_NUM_MASK ); }
+
+ timeT getTime() const { return m_deltaTime; }
+ timeT getDuration() const { return m_duration; }
+
+ MidiByte getPitch() const { return m_data1; }
+ MidiByte getVelocity() const { return m_data2; }
+ MidiByte getData1() const { return m_data1; }
+ MidiByte getData2() const { return m_data2; }
+ MidiByte getEventCode() const { return m_eventCode; }
+
+ bool isMeta() const { return(m_eventCode == MIDI_FILE_META_EVENT); }
+
+ MidiByte getMetaEventCode() const { return m_metaEventCode; }
+ std::string getMetaMessage() const { return m_metaMessage; }
+ void setMetaMessage(const std::string &meta) { m_metaMessage = meta; }
+
+ friend bool operator<(const MidiEvent &a, const MidiEvent &b);
+
+private:
+
+ MidiEvent& operator=(const MidiEvent);
+
+ timeT m_deltaTime;
+ timeT m_duration;
+ MidiByte m_eventCode;
+ MidiByte m_data1; // or Note
+ MidiByte m_data2; // or Velocity
+
+ MidiByte m_metaEventCode;
+ std::string m_metaMessage;
+
+};
+
+// Comparator for sorting
+//
+struct MidiEventCmp
+{
+ bool operator()(const MidiEvent &mE1, const MidiEvent &mE2) const
+ { return mE1.getTime() < mE2.getTime(); }
+ bool operator()(const MidiEvent *mE1, const MidiEvent *mE2) const
+ { return mE1->getTime() < mE2->getTime(); }
+};
+
+}
+
+#endif // _ROSEGARDEN_MIDI_EVENT_H_
diff --git a/src/sound/MidiFile.cpp b/src/sound/MidiFile.cpp
new file mode 100644
index 0000000..76d5c85
--- /dev/null
+++ b/src/sound/MidiFile.cpp
@@ -0,0 +1,2261 @@
+// -*- c-indentation-style:"stroustrup" c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include <iostream>
+#include "misc/Debug.h"
+#include <kapplication.h>
+#include <fstream>
+#include <string>
+#include <cstdio>
+#include <algorithm>
+
+#include "Midi.h"
+#include "MidiFile.h"
+#include "Segment.h"
+#include "NotationTypes.h"
+#include "BaseProperties.h"
+#include "SegmentNotationHelper.h"
+#include "SegmentPerformanceHelper.h"
+#include "CompositionTimeSliceAdapter.h"
+#include "AnalysisTypes.h"
+#include "Track.h"
+#include "Instrument.h"
+#include "Quantizer.h"
+#include "Studio.h"
+#include "MidiTypes.h"
+#include "Profiler.h"
+
+//#define MIDI_DEBUG 1
+
+#if (__GNUC__ < 3)
+#include <strstream>
+#define stringstream strstream
+#else
+#include <sstream>
+#endif
+
+#include <kapp.h>
+
+namespace Rosegarden
+{
+
+using std::string;
+using std::ifstream;
+using std::stringstream;
+using std::cerr;
+using std::endl;
+using std::ends;
+using std::ios;
+
+MidiFile::MidiFile(Studio *studio):
+ SoundFile(std::string("unnamed.mid")),
+ m_timingDivision(0),
+ m_format(MIDI_FILE_NOT_LOADED),
+ m_numberOfTracks(0),
+ m_containsTimeChanges(false),
+ m_trackByteCount(0),
+ m_decrementCount(false),
+ m_studio(studio)
+{}
+
+MidiFile::MidiFile(const std::string &fn,
+ Studio *studio):
+ SoundFile(fn),
+ m_timingDivision(0),
+ m_format(MIDI_FILE_NOT_LOADED),
+ m_numberOfTracks(0),
+ m_containsTimeChanges(false),
+ m_trackByteCount(0),
+ m_decrementCount(false),
+ m_studio(studio)
+{}
+
+// Make sure we clear away the m_midiComposition
+//
+MidiFile::~MidiFile()
+{
+ clearMidiComposition();
+}
+
+
+// A couple of convenience functions. Watch the byte conversions out
+// of the STL strings.
+//
+//
+long
+MidiFile::midiBytesToLong(const string& bytes)
+{
+ if (bytes.length() != 4) {
+#ifdef MIDI_DEBUG
+ std::cerr << "WARNING: Wrong length for long data (" << bytes.length()
+ << ", should be 4)" << endl;
+#endif
+
+ throw (Exception("Wrong length for long data in MIDI stream"));
+ }
+
+ long longRet = ((long)(((MidiByte)bytes[0]) << 24)) |
+ ((long)(((MidiByte)bytes[1]) << 16)) |
+ ((long)(((MidiByte)bytes[2]) << 8)) |
+ ((long)((MidiByte)(bytes[3])));
+
+ std::cerr << "midiBytesToLong(" << int((MidiByte)bytes[0]) << "," << int((MidiByte)bytes[1]) << "," << int((MidiByte)bytes[2]) << "," << int((MidiByte)bytes[3]) << ") -> " << longRet << std::endl;
+
+ return longRet;
+}
+
+int
+MidiFile::midiBytesToInt(const string& bytes)
+{
+ if (bytes.length() != 2) {
+#ifdef MIDI_DEBUG
+ std::cerr << "WARNING: Wrong length for int data (" << bytes.length()
+ << ", should be 2)" << endl;
+#endif
+
+ throw (Exception("Wrong length for int data in MIDI stream"));
+ }
+
+ int intRet = ((int)(((MidiByte)bytes[0]) << 8)) |
+ ((int)(((MidiByte)bytes[1])));
+ return (intRet);
+}
+
+
+
+// Gets a single byte from the MIDI byte stream. For each track
+// section we can read only a specified number of bytes held in
+// m_trackByteCount.
+//
+MidiByte
+MidiFile::getMidiByte(ifstream* midiFile)
+{
+ static int bytesGot = 0; // purely for progress reporting purposes
+
+ if (midiFile->eof()) {
+ throw(Exception("End of MIDI file encountered while reading"));
+ }
+
+ if (m_decrementCount && m_trackByteCount <= 0) {
+ throw(Exception("Attempt to get more bytes than expected on Track"));
+ }
+
+ char byte;
+ if (midiFile->read(&byte, 1)) {
+
+ --m_trackByteCount;
+
+ // update a progress dialog if we have one
+ //
+ ++bytesGot;
+ if (bytesGot % 2000 == 0) {
+
+ emit setProgress((int)(double(midiFile->tellg()) /
+ double(m_fileSize) * 20.0));
+ kapp->processEvents(50);
+ }
+
+ return (MidiByte)byte;
+ }
+
+ throw(Exception("Attempt to read past MIDI file end"));
+}
+
+
+// Gets a specified number of bytes from the MIDI byte stream. For
+// each track section we can read only a specified number of bytes
+// held in m_trackByteCount.
+//
+string
+MidiFile::getMidiBytes(ifstream* midiFile, unsigned long numberOfBytes)
+{
+ string stringRet;
+ char fileMidiByte;
+ static int bytesGot = 0; // purely for progress reporting purposes
+
+ if (midiFile->eof()) {
+#ifdef MIDI_DEBUG
+ std::cerr << "MIDI file EOF - got "
+ << stringRet.length() << " bytes out of "
+ << numberOfBytes << endl;
+#endif
+
+ throw(Exception("End of MIDI file encountered while reading"));
+
+ }
+
+ if (m_decrementCount && (numberOfBytes > (unsigned long)m_trackByteCount)) {
+#ifdef MIDI_DEBUG
+ std::cerr << "Attempt to get more bytes than allowed on Track ("
+ << numberOfBytes
+ << " > "
+ << m_trackByteCount << endl;
+#endif
+
+ //!!! Investigate -- I'm seeing this on new-notation-quantization
+ // branch: load glazunov.rg, run Interpret on first segment, export
+ // and attempt to import again
+
+ throw(Exception("Attempt to get more bytes than expected on Track"));
+ }
+
+ while (stringRet.length() < numberOfBytes &&
+ midiFile->read(&fileMidiByte, 1)) {
+ stringRet += fileMidiByte;
+ }
+
+ // if we've reached the end of file without fulfilling the
+ // quota then panic as our parsing has performed incorrectly
+ //
+ if (stringRet.length() < numberOfBytes) {
+ stringRet = "";
+#ifdef MIDI_DEBUG
+
+ cerr << "Attempt to read past file end - got "
+ << stringRet.length() << " bytes out of "
+ << numberOfBytes << endl;
+#endif
+
+ throw(Exception("Attempt to read past MIDI file end"));
+
+ }
+
+ // decrement the byte count
+ if (m_decrementCount)
+ m_trackByteCount -= stringRet.length();
+
+ // update a progress dialog if we have one
+ //
+ bytesGot += numberOfBytes;
+ if (bytesGot % 2000 == 0) {
+ emit setProgress((int)(double(midiFile->tellg()) /
+ double(m_fileSize) * 20.0));
+ kapp->processEvents(50);
+ }
+
+ return stringRet;
+}
+
+
+// Get a long number of variable length from the MIDI byte stream.
+//
+//
+long
+MidiFile::getNumberFromMidiBytes(ifstream* midiFile, int firstByte)
+{
+ long longRet = 0;
+ MidiByte midiByte;
+
+ if (firstByte >= 0) {
+ midiByte = (MidiByte)firstByte;
+ } else if (midiFile->eof()) {
+ return longRet;
+ } else {
+ midiByte = getMidiByte(midiFile);
+ }
+
+ longRet = midiByte;
+ if (midiByte & 0x80 ) {
+ longRet &= 0x7F;
+ do {
+ midiByte = getMidiByte(midiFile);
+ longRet = (longRet << 7) + (midiByte & 0x7F);
+ } while (!midiFile->eof() && (midiByte & 0x80));
+ }
+
+ return longRet;
+}
+
+
+
+// Seeks to the next track in the midi file and sets the number
+// of bytes to be read in the counter m_trackByteCount.
+//
+bool
+MidiFile::skipToNextTrack(ifstream *midiFile)
+{
+ string buffer, buffer2;
+ m_trackByteCount = -1;
+ m_decrementCount = false;
+
+ while (!midiFile->eof() && (m_decrementCount == false )) {
+ buffer = getMidiBytes(midiFile, 4);
+
+#if (__GNUC__ < 3)
+
+ if (buffer.compare(MIDI_TRACK_HEADER, 0, 4) == 0)
+#else
+
+ if (buffer.compare(0, 4, MIDI_TRACK_HEADER) == 0)
+#endif
+
+ {
+ m_trackByteCount = midiBytesToLong(getMidiBytes(midiFile, 4));
+ m_decrementCount = true;
+ }
+
+ }
+
+ if ( m_trackByteCount == -1 ) // we haven't found a track
+ return (false);
+ else
+ return (true);
+}
+
+
+// Read in a MIDI file. The parsing process throws string
+// exceptions back up here if we run into trouble which we
+// can then pass back out to whoever called us using a nice
+// bool.
+//
+//
+bool
+MidiFile::open()
+{
+ bool retOK = true;
+ m_error = "";
+
+#ifdef MIDI_DEBUG
+
+ std::cerr << "MidiFile::open() : fileName = " << m_fileName.c_str() << endl;
+#endif
+
+ // Open the file
+ ifstream *midiFile = new ifstream(m_fileName.c_str(), ios::in | ios::binary);
+
+ try {
+ if (*midiFile) {
+
+ // Set file size so we can count it off
+ //
+ midiFile->seekg(0, std::ios::end);
+ m_fileSize = midiFile->tellg();
+ midiFile->seekg(0, std::ios::beg);
+
+ // Parse the MIDI header first. The first 14 bytes of the file.
+ if (!parseHeader(getMidiBytes(midiFile, 14))) {
+ m_format = MIDI_FILE_NOT_LOADED;
+ m_error = "Not a MIDI file.";
+ return (false);
+ }
+
+ m_containsTimeChanges = false;
+
+ TrackId i = 0;
+
+ for (unsigned int j = 0; j < m_numberOfTracks; ++j) {
+
+//#ifdef MIDI_DEBUG
+ std::cerr << "Parsing Track " << j << endl;
+//#endif
+
+ if (!skipToNextTrack(midiFile)) {
+#ifdef MIDI_DEBUG
+ cerr << "Couldn't find Track " << j << endl;
+#endif
+
+ m_error = "File corrupted or in non-standard format?";
+ m_format = MIDI_FILE_NOT_LOADED;
+ return (false);
+ }
+
+#ifdef MIDI_DEBUG
+ std::cerr << "Track has " << m_trackByteCount << " bytes" << std::endl;
+#endif
+
+ // Run through the events taking them into our internal
+ // representation.
+ if (!parseTrack(midiFile, i)) {
+//#ifdef MIDI_DEBUG
+ std::cerr << "Track " << j << " parsing failed" << endl;
+//#endif
+
+ m_error = "File corrupted or in non-standard format?";
+ m_format = MIDI_FILE_NOT_LOADED;
+ return (false);
+ }
+
+ ++i; // j is the source track number, i the destination
+ }
+
+ m_numberOfTracks = i;
+ } else {
+ m_error = "File not found or not readable.";
+ m_format = MIDI_FILE_NOT_LOADED;
+ return (false);
+ }
+
+ // Close the file now
+ midiFile->close();
+ } catch (Exception e) {
+#ifdef MIDI_DEBUG
+ std::cerr << "MidiFile::open() - caught exception - "
+ << e.getMessage() << endl;
+#endif
+
+ m_error = e.getMessage();
+ retOK = false;
+ }
+
+ return (retOK);
+}
+
+// Parse and ensure the MIDI Header is legitimate
+//
+//
+bool
+MidiFile::parseHeader(const string &midiHeader)
+{
+ if (midiHeader.size() < 14) {
+#ifdef MIDI_DEBUG
+ std::cerr << "MidiFile::parseHeader() - file header undersized" << endl;
+#endif
+
+ return (false);
+ }
+
+#if (__GNUC__ < 3)
+ if (midiHeader.compare(MIDI_FILE_HEADER, 0, 4) != 0)
+#else
+
+ if (midiHeader.compare(0, 4, MIDI_FILE_HEADER) != 0)
+#endif
+
+ {
+#ifdef MIDI_DEBUG
+ std::cerr << "MidiFile::parseHeader()"
+ << "- file header not found or malformed"
+ << endl;
+#endif
+
+ return (false);
+ }
+
+ if (midiBytesToLong(midiHeader.substr(4, 4)) != 6L) {
+#ifdef MIDI_DEBUG
+ std::cerr << "MidiFile::parseHeader()"
+ << " - header length incorrect"
+ << endl;
+#endif
+
+ return (false);
+ }
+
+ m_format = (MIDIFileFormatType) midiBytesToInt(midiHeader.substr(8, 2));
+ m_numberOfTracks = midiBytesToInt(midiHeader.substr(10, 2));
+ m_timingDivision = midiBytesToInt(midiHeader.substr(12, 2));
+
+ if ( m_format == MIDI_SEQUENTIAL_TRACK_FILE ) {
+#ifdef MIDI_DEBUG
+ std::cerr << "MidiFile::parseHeader()"
+ << "- can't load sequential track file"
+ << endl;
+#endif
+
+ return (false);
+ }
+
+
+#ifdef MIDI_DEBUG
+ if ( m_timingDivision < 0 ) {
+ std::cerr << "MidiFile::parseHeader()"
+ << " - file uses SMPTE timing"
+ << endl;
+ }
+#endif
+
+ return (true);
+}
+
+
+
+// Extract the contents from a MIDI file track and places it into
+// our local map of MIDI events.
+//
+//
+bool
+MidiFile::parseTrack(ifstream* midiFile, TrackId &lastTrackNum)
+{
+ MidiByte midiByte, metaEventCode, data1, data2;
+ MidiByte eventCode = 0x80;
+ std::string metaMessage;
+ unsigned int messageLength;
+ unsigned long deltaTime;
+ unsigned long accumulatedTime = 0;
+
+ // The trackNum passed in to this method is the default track for
+ // all events provided they're all on the same channel. If we find
+ // events on more than one channel, we increment trackNum and record
+ // the mapping from channel to trackNum in this channelTrackMap.
+ // We then return the new trackNum by reference so the calling
+ // method knows we've got more tracks than expected.
+
+ // This would be a vector<TrackId> but TrackId is unsigned
+ // and we need -1 to indicate "not yet used"
+ std::vector<int> channelTrackMap(16, -1);
+
+ // This is used to store the last absolute time found on each track,
+ // allowing us to modify delta-times correctly when separating events
+ // out from one to multiple tracks
+ //
+ std::map<int, unsigned long> trackTimeMap;
+
+ // Meta-events don't have a channel, so we place them in a fixed
+ // track number instead
+ TrackId metaTrack = lastTrackNum;
+
+ // Remember the last non-meta status byte (-1 if we haven't seen one)
+ int runningStatus = -1;
+
+ bool firstTrack = true;
+
+ std::cerr << "Parse track: last track number is " << lastTrackNum << std::endl;
+
+ while (!midiFile->eof() && ( m_trackByteCount > 0 ) ) {
+ if (eventCode < 0x80) {
+#ifdef MIDI_DEBUG
+ cerr << "WARNING: Invalid event code " << eventCode
+ << " in MIDI file" << endl;
+#endif
+
+ throw (Exception("Invalid event code found"));
+ }
+
+ deltaTime = getNumberFromMidiBytes(midiFile);
+
+#ifdef MIDI_DEBUG
+ cerr << "read delta time " << deltaTime << endl;
+#endif
+
+ // Get a single byte
+ midiByte = getMidiByte(midiFile);
+
+ if (!(midiByte & MIDI_STATUS_BYTE_MASK)) {
+ if (runningStatus < 0) {
+ throw (Exception("Running status used for first event in track"));
+ }
+
+ eventCode = (MidiByte)runningStatus;
+ data1 = midiByte;
+
+#ifdef MIDI_DEBUG
+ std::cerr << "using running status (byte " << int(midiByte) << " found)" << std::endl;
+#endif
+
+ } else {
+#ifdef MIDI_DEBUG
+ std::cerr << "have new event code " << int(midiByte) << std::endl;
+#endif
+
+ eventCode = midiByte;
+ data1 = getMidiByte(midiFile);
+ }
+
+ if (eventCode == MIDI_FILE_META_EVENT) // meta events
+ {
+ // metaEventCode = getMidiByte(midiFile);
+ metaEventCode = data1;
+ messageLength = getNumberFromMidiBytes(midiFile);
+
+#ifdef MIDI_DEBUG
+
+ std::cerr << "Meta event of type " << int(metaEventCode) << " and " << messageLength << " bytes found" << std::endl;
+#endif
+
+ metaMessage = getMidiBytes(midiFile, messageLength);
+
+ if (metaEventCode == MIDI_TIME_SIGNATURE ||
+ metaEventCode == MIDI_SET_TEMPO)
+ {
+ m_containsTimeChanges = true;
+ }
+
+ long gap = accumulatedTime - trackTimeMap[metaTrack];
+ accumulatedTime += deltaTime;
+ deltaTime += gap;
+ trackTimeMap[metaTrack] = accumulatedTime;
+
+ MidiEvent *e = new MidiEvent(deltaTime,
+ MIDI_FILE_META_EVENT,
+ metaEventCode,
+ metaMessage);
+
+ m_midiComposition[metaTrack].push_back(e);
+
+ } else // the rest
+ {
+ runningStatus = eventCode;
+
+ MidiEvent *midiEvent;
+
+ int channel = (eventCode & MIDI_CHANNEL_NUM_MASK);
+ if (channelTrackMap[channel] == -1) {
+ if (!firstTrack) {
+ ++lastTrackNum;
+ } else {
+ firstTrack = false;
+ }
+ std::cerr << "MidiFile: new channel map entry: channel " << channel << " -> track " << lastTrackNum << std::endl;
+ channelTrackMap[channel] = lastTrackNum;
+ m_trackChannelMap[lastTrackNum] = channel;
+ }
+
+ TrackId trackNum = channelTrackMap[channel];
+
+ {
+ static int prevTrackNum = -1, prevChannel = -1;
+ if (prevTrackNum != (int) trackNum ||
+ prevChannel != (int) channel) {
+ std::cerr << "MidiFile: track number for channel " << channel << " is " << trackNum << std::endl;
+ prevTrackNum = trackNum;
+ prevChannel = channel;
+ }
+ }
+
+ // accumulatedTime is abs time of last event on any track;
+ // trackTimeMap[trackNum] is that of last event on this track
+
+ long gap = accumulatedTime - trackTimeMap[trackNum];
+ accumulatedTime += deltaTime;
+ deltaTime += gap;
+ trackTimeMap[trackNum] = accumulatedTime;
+
+ switch (eventCode & MIDI_MESSAGE_TYPE_MASK) {
+ case MIDI_NOTE_ON:
+ case MIDI_NOTE_OFF:
+ case MIDI_POLY_AFTERTOUCH:
+ case MIDI_CTRL_CHANGE:
+ data2 = getMidiByte(midiFile);
+
+ // create and store our event
+ midiEvent = new MidiEvent(deltaTime, eventCode, data1, data2);
+
+ /*
+ std::cerr << "MIDI event for channel " << channel << " (track "
+ << trackNum << ")" << std::endl;
+ midiEvent->print();
+ */
+
+
+ m_midiComposition[trackNum].push_back(midiEvent);
+ break;
+
+ case MIDI_PITCH_BEND:
+ data2 = getMidiByte(midiFile);
+
+ // create and store our event
+ midiEvent = new MidiEvent(deltaTime, eventCode, data1, data2);
+ m_midiComposition[trackNum].push_back(midiEvent);
+ break;
+
+ case MIDI_PROG_CHANGE:
+ case MIDI_CHNL_AFTERTOUCH:
+ // create and store our event
+ std::cerr << "Program change or channel aftertouch: time " << deltaTime << ", code " << (int)eventCode << ", data " << (int) data1 << " going to track " << trackNum << std::endl;
+ midiEvent = new MidiEvent(deltaTime, eventCode, data1);
+ m_midiComposition[trackNum].push_back(midiEvent);
+ break;
+
+ case MIDI_SYSTEM_EXCLUSIVE:
+ messageLength = getNumberFromMidiBytes(midiFile, data1);
+
+#ifdef MIDI_DEBUG
+
+ std::cerr << "SysEx of " << messageLength << " bytes found" << std::endl;
+#endif
+
+ metaMessage = getMidiBytes(midiFile, messageLength);
+
+ if (MidiByte(metaMessage[metaMessage.length() - 1]) !=
+ MIDI_END_OF_EXCLUSIVE) {
+#ifdef MIDI_DEBUG
+ std::cerr << "MidiFile::parseTrack() - "
+ << "malformed or unsupported SysEx type"
+ << std::endl;
+#endif
+
+ continue;
+ }
+
+ // chop off the EOX
+ // length fixed by Pedro Lopez-Cabanillas (20030523)
+ //
+ metaMessage = metaMessage.substr(0, metaMessage.length() - 1);
+
+ midiEvent = new MidiEvent(deltaTime,
+ MIDI_SYSTEM_EXCLUSIVE,
+ metaMessage);
+ m_midiComposition[trackNum].push_back(midiEvent);
+ break;
+
+ case MIDI_END_OF_EXCLUSIVE:
+#ifdef MIDI_DEBUG
+
+ std::cerr << "MidiFile::parseTrack() - "
+ << "Found a stray MIDI_END_OF_EXCLUSIVE" << std::endl;
+#endif
+
+ break;
+
+ default:
+#ifdef MIDI_DEBUG
+
+ std::cerr << "MidiFile::parseTrack()"
+ << " - Unsupported MIDI Event Code: "
+ << (int)eventCode << endl;
+#endif
+
+ break;
+ }
+ }
+ }
+
+ return (true);
+}
+
+// borrowed from ALSA pcm_timer.c
+//
+static unsigned long gcd(unsigned long a, unsigned long b)
+{
+ unsigned long r;
+ if (a < b) {
+ r = a;
+ a = b;
+ b = r;
+ }
+ while ((r = a % b) != 0) {
+ a = b;
+ b = r;
+ }
+ return b;
+}
+
+// If we wanted to abstract the MidiFile class to make it more useful to
+// other applications (and formats) we'd make this method and its twin
+// pure virtual.
+//
+bool
+MidiFile::convertToRosegarden(Composition &composition, ConversionType type)
+{
+ Profiler profiler("MidiFile::convertToRosegarden");
+
+ MidiTrack::iterator midiEvent;
+ Segment *rosegardenSegment;
+ Segment *conductorSegment = 0;
+ Event *rosegardenEvent;
+ string trackName;
+
+ // Time conversions
+ //
+ timeT rosegardenTime = 0;
+ timeT rosegardenDuration = 0;
+ timeT maxTime = 0;
+
+ // To create rests
+ //
+ timeT endOfLastNote;
+
+ // Event specific vars
+ //
+ int numerator = 4;
+ int denominator = 4;
+ timeT segmentTime;
+
+ // keys
+ int accidentals;
+ bool isMinor;
+ bool isSharp;
+
+ if (type == CONVERT_REPLACE)
+ composition.clear();
+
+ timeT origin = 0;
+ if (type == CONVERT_APPEND && composition.getDuration() > 0) {
+ origin = composition.getBarEndForTime(composition.getDuration());
+ }
+
+ TrackId compTrack = 0;
+ for (Composition::iterator ci = composition.begin();
+ ci != composition.end(); ++ci) {
+ if ((*ci)->getTrack() >= compTrack)
+ compTrack = (*ci)->getTrack() + 1;
+ }
+
+ Track *track = 0;
+
+ // precalculate the timing factor
+ //
+ // [cc] -- attempt to avoid floating-point rounding errors
+ timeT crotchetTime = Note(Note::Crotchet).getDuration();
+ int divisor = m_timingDivision ? m_timingDivision : 96;
+
+ unsigned long multiplier = crotchetTime;
+ int g = (int)gcd(crotchetTime, divisor);
+ multiplier /= g;
+ divisor /= g;
+
+ timeT maxRawTime = LONG_MAX;
+ if (multiplier > divisor)
+ maxRawTime = (maxRawTime / multiplier) * divisor;
+
+ bool haveTimeSignatures = false;
+ InstrumentId compInstrument = MidiInstrumentBase;
+
+ // Clear down the assigned Instruments we already have
+ //
+ if (type == CONVERT_REPLACE) {
+ m_studio->unassignAllInstruments();
+ }
+
+ std::vector<Segment *> addedSegments;
+
+#ifdef MIDI_DEBUG
+
+ std::cerr << "NUMBER OF TRACKS = " << m_numberOfTracks << endl;
+ std::cerr << "MIDI COMP SIZE = " << m_midiComposition.size() << endl;
+#endif
+
+ for (TrackId i = 0; i < m_numberOfTracks; i++ ) {
+ segmentTime = 0;
+ trackName = string("Imported MIDI");
+
+ // progress - 20% total in file import itself and then 80%
+ // split over these tracks
+ emit setProgress(20 +
+ (int)((80.0 * double(i) / double(m_numberOfTracks))));
+ kapp->processEvents(50);
+
+ // Convert the deltaTime to an absolute time since
+ // the start of the segment. The addTime method
+ // returns the sum of the current Midi Event delta
+ // time plus the argument.
+ //
+ for (midiEvent = m_midiComposition[i].begin();
+ midiEvent != m_midiComposition[i].end();
+ ++midiEvent) {
+ segmentTime = (*midiEvent)->addTime(segmentTime);
+ }
+
+ // Consolidate NOTE ON and NOTE OFF events into a NOTE ON with
+ // a duration.
+ //
+ consolidateNoteOffEvents(i);
+
+ if (m_trackChannelMap.find(i) != m_trackChannelMap.end()) {
+ compInstrument = MidiInstrumentBase + m_trackChannelMap[i];
+ } else {
+ compInstrument = MidiInstrumentBase;
+ }
+
+ rosegardenSegment = new Segment;
+ rosegardenSegment->setTrack(compTrack);
+ rosegardenSegment->setStartTime(0);
+
+ track = new Track(compTrack, // id
+ compInstrument, // instrument
+ compTrack, // position
+ trackName, // name
+ false); // muted
+
+ std::cerr << "New Rosegarden track: id = " << compTrack << ", instrument = " << compInstrument << ", name = " << trackName << std::endl;
+
+ // rest creation token needs to be reset here
+ //
+ endOfLastNote = 0;
+
+ int msb = -1, lsb = -1; // for bank selects
+ Instrument *instrument = 0;
+
+ for (midiEvent = m_midiComposition[i].begin();
+ midiEvent != m_midiComposition[i].end();
+ midiEvent++) {
+ rosegardenEvent = 0;
+
+ // [cc] -- avoid floating-point where possible
+
+ timeT rawTime = (*midiEvent)->getTime();
+
+ if (rawTime < maxRawTime) {
+ rosegardenTime = origin +
+ timeT((rawTime * multiplier) / divisor);
+ } else {
+ rosegardenTime = origin +
+ timeT((double(rawTime) * multiplier) / double(divisor) + 0.01);
+ }
+
+ rosegardenDuration =
+ timeT(((*midiEvent)->getDuration() * multiplier) / divisor);
+
+#ifdef MIDI_DEBUG
+
+ std::cerr << "MIDI file import: origin " << origin
+ << ", event time " << rosegardenTime
+ << ", duration " << rosegardenDuration
+ << ", event type " << (int)(*midiEvent)->getMessageType()
+ << ", previous max time " << maxTime
+ << ", potential max time " << (rosegardenTime + rosegardenDuration)
+ << ", ev raw time " << (*midiEvent)->getTime()
+ << ", crotchet " << crotchetTime
+ << ", multiplier " << multiplier
+ << ", divisor " << divisor
+ << std::endl;
+#endif
+
+ if (rosegardenTime + rosegardenDuration > maxTime) {
+ maxTime = rosegardenTime + rosegardenDuration;
+ }
+
+ // timeT fillFromTime = rosegardenTime;
+ if (rosegardenSegment->empty()) {
+ // fillFromTime = composition.getBarStartForTime(rosegardenTime);
+ endOfLastNote = composition.getBarStartForTime(rosegardenTime);
+ }
+
+ if ((*midiEvent)->isMeta()) {
+
+ switch ((*midiEvent)->getMetaEventCode()) {
+
+ case MIDI_TEXT_EVENT: {
+ std::string text = (*midiEvent)->getMetaMessage();
+ rosegardenEvent =
+ Text(text).getAsEvent(rosegardenTime);
+ }
+ break;
+
+ case MIDI_LYRIC: {
+ std::string text = (*midiEvent)->getMetaMessage();
+// std::cerr << "lyric event: text=\""
+// << text << "\", time=" << rosegardenTime << std::endl;
+ rosegardenEvent =
+ Text(text, Text::Lyric).
+ getAsEvent(rosegardenTime);
+ }
+ break;
+
+ case MIDI_TEXT_MARKER: {
+ std::string text = (*midiEvent)->getMetaMessage();
+ composition.addMarker(new Marker
+ (rosegardenTime, text, ""));
+ }
+ break;
+
+ case MIDI_COPYRIGHT_NOTICE:
+ if (type == CONVERT_REPLACE) {
+ composition.setCopyrightNote((*midiEvent)->
+ getMetaMessage());
+ }
+ break;
+
+ case MIDI_TRACK_NAME:
+ track->setLabel((*midiEvent)->getMetaMessage());
+ break;
+
+ case MIDI_INSTRUMENT_NAME:
+ rosegardenSegment->setLabel((*midiEvent)->getMetaMessage());
+ break;
+
+ case MIDI_END_OF_TRACK: {
+ timeT trackEndTime = rosegardenTime;
+ if (trackEndTime <= 0) {
+ trackEndTime = crotchetTime * 4 * numerator / denominator;
+ }
+ if (endOfLastNote < trackEndTime) {
+ //If there's nothing in the segment yet, then we
+ //shouldn't fill with rests because we don't want
+ //to cause the otherwise empty segment to be created
+ if (rosegardenSegment->size() > 0) {
+ rosegardenSegment->fillWithRests(trackEndTime);
+ }
+ }
+ }
+ break;
+
+ case MIDI_SET_TEMPO: {
+ MidiByte m0 = (*midiEvent)->getMetaMessage()[0];
+ MidiByte m1 = (*midiEvent)->getMetaMessage()[1];
+ MidiByte m2 = (*midiEvent)->getMetaMessage()[2];
+
+ long tempo = (((m0 << 8) + m1) << 8) + m2;
+
+ if (tempo != 0) {
+ double qpm = 60000000.0 / double(tempo);
+ tempoT rgt(Composition::getTempoForQpm(qpm));
+ std::cout << "MidiFile: converted MIDI tempo " << tempo << " to Rosegarden tempo " << rgt << std::endl;
+ composition.addTempoAtTime(rosegardenTime, rgt);
+ }
+ }
+ break;
+
+ case MIDI_TIME_SIGNATURE:
+ numerator = (int) (*midiEvent)->getMetaMessage()[0];
+ denominator = 1 << ((int)(*midiEvent)->getMetaMessage()[1]);
+
+ // NB. a MIDI time signature also has
+ // metamessage[2] and [3], containing some timing data
+
+ if (numerator == 0)
+ numerator = 4;
+ if (denominator == 0)
+ denominator = 4;
+
+ composition.addTimeSignature
+ (rosegardenTime,
+ TimeSignature(numerator, denominator));
+ haveTimeSignatures = true;
+ break;
+
+ case MIDI_KEY_SIGNATURE:
+ // get the details
+ accidentals = (int) (*midiEvent)->getMetaMessage()[0];
+ isMinor = (int) (*midiEvent)->getMetaMessage()[1];
+ isSharp = accidentals < 0 ? false : true;
+ accidentals = accidentals < 0 ? -accidentals : accidentals;
+ // create the key event
+ //
+ try {
+ rosegardenEvent = Rosegarden::Key
+ (accidentals, isSharp, isMinor).
+ getAsEvent(rosegardenTime);
+ }
+ catch (...) {
+#ifdef MIDI_DEBUG
+ std::cerr << "MidiFile::convertToRosegarden - "
+ << " badly formed key signature"
+ << std::endl;
+#endif
+
+ break;
+ }
+ break;
+
+ case MIDI_SEQUENCE_NUMBER:
+ case MIDI_CHANNEL_PREFIX_OR_PORT:
+ case MIDI_CUE_POINT:
+ case MIDI_CHANNEL_PREFIX:
+ case MIDI_SEQUENCER_SPECIFIC:
+ case MIDI_SMPTE_OFFSET:
+ default:
+#ifdef MIDI_DEBUG
+
+ std::cerr << "MidiFile::convertToRosegarden - "
+ << "unsupported META event code "
+ << (int)((*midiEvent)->getMetaEventCode()) << endl;
+#endif
+
+ break;
+ }
+
+ } else
+ switch ((*midiEvent)->getMessageType()) {
+ case MIDI_NOTE_ON:
+
+ // A zero velocity here is a virtual "NOTE OFF"
+ // so we ignore this event
+ //
+ if ((*midiEvent)->getVelocity() == 0)
+ break;
+
+ endOfLastNote = rosegardenTime + rosegardenDuration;
+
+ //std::cerr << "MidiFile::convertToRosegarden: note at " << rosegardenTime << ", midi time " << (*midiEvent)->getTime() << std::endl;
+
+ // create and populate event
+ rosegardenEvent = new Event(Note::EventType,
+ rosegardenTime,
+ rosegardenDuration);
+ rosegardenEvent->set
+ <Int>(BaseProperties::PITCH,
+ (*midiEvent)->getPitch());
+ rosegardenEvent->set
+ <Int>(BaseProperties::VELOCITY,
+ (*midiEvent)->getVelocity());
+ break;
+
+ // We ignore any NOTE OFFs here as we've already
+ // converted NOTE ONs to have duration
+ //
+ case MIDI_NOTE_OFF:
+ continue;
+ break;
+
+ case MIDI_PROG_CHANGE:
+ // Attempt to turn the prog change we've found into an
+ // Instrument. Send the program number and whether or
+ // not we're on the percussion channel.
+ //
+ // Note that we make no attempt to do the right
+ // thing with program changes during a track -- we
+ // just save them as events. Only the first is
+ // used to select the instrument. If it's at time
+ // zero, it's not saved as an event.
+ //
+// std::cerr << "Program change found" << std::endl;
+
+ if (!instrument) {
+
+ bool percussion = (*midiEvent)->getChannelNumber() ==
+ MIDI_PERCUSSION_CHANNEL;
+ int program = (*midiEvent)->getData1();
+
+ if (type == CONVERT_REPLACE) {
+
+ instrument = m_studio->getInstrumentById(compInstrument);
+ if (instrument) {
+ instrument->setPercussion(percussion);
+ instrument->setSendProgramChange(true);
+ instrument->setProgramChange(program);
+ instrument->setSendBankSelect(msb >= 0 || lsb >= 0);
+ if (instrument->sendsBankSelect()) {
+ instrument->setMSB(msb >= 0 ? msb : 0);
+ instrument->setLSB(lsb >= 0 ? lsb : 0);
+ }
+ }
+ } else { // not CONVERT_REPLACE
+ instrument =
+ m_studio->assignMidiProgramToInstrument
+ (program, msb, lsb, percussion);
+ }
+ }
+
+ // assign it here
+ if (instrument) {
+ track->setInstrument(instrument->getId());
+ // We used to set the segment name from the instrument
+ // here, but now we do them all at the end only if the
+ // segment has no other name set (e.g. from instrument
+ // meta event)
+ if ((*midiEvent)->getTime() == 0) break; // no insert
+ }
+
+ // did we have a bank select? if so, insert that too
+
+ if (msb >= 0) {
+ rosegardenSegment->insert
+ (Controller(MIDI_CONTROLLER_BANK_MSB, msb).
+ getAsEvent(rosegardenTime));
+ }
+ if (lsb >= 0) {
+ rosegardenSegment->insert
+ (Controller(MIDI_CONTROLLER_BANK_LSB, msb).
+ getAsEvent(rosegardenTime));
+ }
+
+ rosegardenEvent =
+ ProgramChange((*midiEvent)->getData1()).
+ getAsEvent(rosegardenTime);
+ break;
+
+ case MIDI_CTRL_CHANGE:
+
+ // If it's a bank select, interpret it (or remember
+ // for later insertion) instead of just inserting it
+ // as a Rosegarden event
+
+ if ((*midiEvent)->getData1() == MIDI_CONTROLLER_BANK_MSB) {
+ msb = (*midiEvent)->getData2();
+ break;
+ }
+
+ if ((*midiEvent)->getData1() == MIDI_CONTROLLER_BANK_LSB) {
+ lsb = (*midiEvent)->getData2();
+ break;
+ }
+
+ // If it's something we can use as an instrument
+ // parameter, and it's at time zero, and we already
+ // have an instrument, then apply it to the instrument
+ // instead of inserting
+
+ if (instrument && (*midiEvent)->getTime() == 0) {
+ if ((*midiEvent)->getData1() == MIDI_CONTROLLER_VOLUME) {
+ instrument->setVolume((*midiEvent)->getData2());
+ break;
+ }
+ if ((*midiEvent)->getData1() == MIDI_CONTROLLER_PAN) {
+ instrument->setPan((*midiEvent)->getData2());
+ break;
+ }
+ if ((*midiEvent)->getData1() == MIDI_CONTROLLER_ATTACK) {
+ instrument->setControllerValue(MIDI_CONTROLLER_ATTACK, (*midiEvent)->getData2());
+ break;
+ }
+ if ((*midiEvent)->getData1() == MIDI_CONTROLLER_RELEASE) {
+ instrument->setControllerValue(MIDI_CONTROLLER_RELEASE, (*midiEvent)->getData2());
+ break;
+ }
+ if ((*midiEvent)->getData1() == MIDI_CONTROLLER_FILTER) {
+ instrument->setControllerValue(MIDI_CONTROLLER_FILTER, (*midiEvent)->getData2());
+ break;
+ }
+ if ((*midiEvent)->getData1() == MIDI_CONTROLLER_RESONANCE) {
+ instrument->setControllerValue(MIDI_CONTROLLER_RESONANCE, (*midiEvent)->getData2());
+ break;
+ }
+ if ((*midiEvent)->getData1() == MIDI_CONTROLLER_CHORUS) {
+ instrument->setControllerValue(MIDI_CONTROLLER_CHORUS, (*midiEvent)->getData2());
+ break;
+ }
+ if ((*midiEvent)->getData1() == MIDI_CONTROLLER_REVERB) {
+ instrument->setControllerValue(MIDI_CONTROLLER_REVERB, (*midiEvent)->getData2());
+ break;
+ }
+ }
+
+ rosegardenEvent =
+ Controller((*midiEvent)->getData1(),
+ (*midiEvent)->getData2()).
+ getAsEvent(rosegardenTime);
+ break;
+
+ case MIDI_PITCH_BEND:
+ rosegardenEvent =
+ PitchBend((*midiEvent)->getData2(),
+ (*midiEvent)->getData1()).
+ getAsEvent(rosegardenTime);
+ break;
+
+ case MIDI_SYSTEM_EXCLUSIVE:
+ rosegardenEvent =
+ SystemExclusive((*midiEvent)->getMetaMessage()).
+ getAsEvent(rosegardenTime);
+ break;
+
+ case MIDI_POLY_AFTERTOUCH:
+ rosegardenEvent =
+ KeyPressure((*midiEvent)->getData1(),
+ (*midiEvent)->getData2()).
+ getAsEvent(rosegardenTime);
+ break;
+
+ case MIDI_CHNL_AFTERTOUCH:
+ rosegardenEvent =
+ ChannelPressure((*midiEvent)->getData1()).
+ getAsEvent(rosegardenTime);
+ break;
+
+ default:
+#ifdef MIDI_DEBUG
+
+ std::cerr << "MidiFile::convertToRosegarden - "
+ << "Unsupported event code = "
+ << (int)(*midiEvent)->getMessageType() << std::endl;
+#endif
+
+ break;
+ }
+
+ if (rosegardenEvent) {
+ // if (fillFromTime < rosegardenTime) {
+ // rosegardenSegment->fillWithRests(fillFromTime, rosegardenTime);
+ // }
+ if (endOfLastNote < rosegardenTime) {
+ rosegardenSegment->fillWithRests(endOfLastNote, rosegardenTime);
+ }
+ rosegardenSegment->insert(rosegardenEvent);
+ }
+ }
+
+ if (rosegardenSegment->size() > 0) {
+
+ // if all we have is key signatures and rests, take this
+ // to be a conductor segment and don't insert it
+ //
+ bool keySigsOnly = true;
+ bool haveKeySig = false;
+ for (Segment::iterator i = rosegardenSegment->begin();
+ i != rosegardenSegment->end(); ++i) {
+ if (!(*i)->isa(Rosegarden::Key::EventType) &&
+ !(*i)->isa(Note::EventRestType)) {
+ keySigsOnly = false;
+ break;
+ } else if ((*i)->isa(Rosegarden::Key::EventType)) {
+ haveKeySig = true;
+ }
+ }
+
+ if (keySigsOnly) {
+ conductorSegment = rosegardenSegment;
+ continue;
+ } else if (!haveKeySig && conductorSegment) {
+ // copy across any key sigs from the conductor segment
+
+ timeT segmentStartTime = rosegardenSegment->getStartTime();
+ timeT earliestEventEndTime = segmentStartTime;
+
+ for (Segment::iterator i = conductorSegment->begin();
+ i != conductorSegment->end(); ++i) {
+ if ((*i)->getAbsoluteTime() + (*i)->getDuration() <
+ earliestEventEndTime) {
+ earliestEventEndTime =
+ (*i)->getAbsoluteTime() + (*i)->getDuration();
+ }
+ rosegardenSegment->insert(new Event(**i));
+ }
+
+ if (earliestEventEndTime < segmentStartTime) {
+ rosegardenSegment->fillWithRests(earliestEventEndTime,
+ segmentStartTime);
+ }
+ }
+
+#ifdef MIDI_DEBUG
+ std::cerr << "MIDI import: adding segment with start time " << rosegardenSegment->getStartTime() << " and end time " << rosegardenSegment->getEndTime() << std::endl;
+ if (rosegardenSegment->getEndTime() == 2880) {
+ std::cerr << "events:" << std::endl;
+ for (Segment::iterator i = rosegardenSegment->begin();
+ i != rosegardenSegment->end(); ++i) {
+ std::cerr << "type = " << (*i)->getType() << std::endl;
+ std::cerr << "time = " << (*i)->getAbsoluteTime() << std::endl;
+ std::cerr << "duration = " << (*i)->getDuration() << std::endl;
+ }
+ }
+#endif
+
+ // add the Segment to the Composition and increment the
+ // Rosegarden segment number
+ //
+ composition.addTrack(track);
+ composition.addSegment(rosegardenSegment);
+ addedSegments.push_back(rosegardenSegment);
+ compTrack++;
+
+ } else {
+ delete rosegardenSegment;
+ rosegardenSegment = 0;
+ delete track;
+ track = 0;
+ }
+ }
+
+ if (type == CONVERT_REPLACE || maxTime > composition.getEndMarker()) {
+ composition.setEndMarker(composition.getBarEndForTime(maxTime));
+ }
+
+ for (std::vector<Segment *>::iterator i = addedSegments.begin();
+ i != addedSegments.end(); ++i) {
+ Segment *s = *i;
+ if (s) {
+ timeT duration = s->getEndMarkerTime() - s->getStartTime();
+/*
+ std::cerr << "duration = " << duration << " (start "
+ << s->getStartTime() << ", end " << s->getEndTime()
+ << ", marker " << s->getEndMarkerTime() << ")" << std::endl;
+*/
+ if (duration == 0) {
+ s->setEndMarkerTime(s->getStartTime() +
+ Note(Note::Crotchet).getDuration());
+ }
+ Instrument *instr = m_studio->getInstrumentFor(s);
+ if (instr) {
+ if (s->getLabel() == "") {
+ s->setLabel(m_studio->getSegmentName(instr->getId()));
+ }
+ }
+ }
+ }
+
+ return true;
+}
+
+// Takes a Composition and turns it into internal MIDI representation
+// that can then be written out to file.
+//
+// For the moment we should watch to make sure that multiple Segment
+// (parts) don't equate to multiple segments in the MIDI Composition.
+//
+// This is a two pass operation - firstly convert the RG Composition
+// into MIDI events and insert anything extra we need (i.e. NOTE OFFs)
+// with absolute times before then processing all timings into delta
+// times.
+//
+//
+void
+MidiFile::convertToMidi(Composition &comp)
+{
+ MidiEvent *midiEvent;
+ int conductorTrack = 0;
+
+ timeT midiEventAbsoluteTime;
+ MidiByte midiVelocity;
+ MidiByte midiChannel = 0;
+
+ // [cc] int rather than floating point
+ //
+ m_timingDivision = 480; //!!! make this configurable
+ timeT crotchetDuration = Note(Note::Crotchet).getDuration();
+
+ // Export as this format only
+ //
+ m_format = MIDI_SIMULTANEOUS_TRACK_FILE;
+
+ // Clear out the MidiComposition internal store
+ //
+ clearMidiComposition();
+
+ // Insert the Rosegarden Signature Track here and any relevant
+ // file META information - this will get written out just like
+ // any other MIDI track.
+ //
+ midiEvent = new MidiEvent(0, MIDI_FILE_META_EVENT, MIDI_COPYRIGHT_NOTICE,
+ comp.getCopyrightNote());
+
+ m_midiComposition[conductorTrack].push_back(midiEvent);
+
+ midiEvent = new MidiEvent(0, MIDI_FILE_META_EVENT, MIDI_CUE_POINT,
+ "Created by Rosegarden");
+
+ m_midiComposition[conductorTrack].push_back(midiEvent);
+
+ midiEvent = new MidiEvent(0, MIDI_FILE_META_EVENT, MIDI_CUE_POINT,
+ "http://www.rosegardenmusic.com/");
+
+ m_midiComposition[conductorTrack].push_back(midiEvent);
+
+ // Insert tempo events
+ //
+ for (int i = 0; i < comp.getTempoChangeCount(); i++) // i=0 should be comp.getStart-something
+ {
+ std::pair<timeT, tempoT> tempo = comp.getTempoChange(i);
+
+ midiEventAbsoluteTime = tempo.first * m_timingDivision
+ / crotchetDuration;
+
+ double qpm = Composition::getTempoQpm(tempo.second);
+ long tempoValue = long(60000000.0 / qpm + 0.01);
+
+ string tempoString;
+ tempoString += (MidiByte) ( tempoValue >> 16 & 0xFF );
+ tempoString += (MidiByte) ( tempoValue >> 8 & 0xFF );
+ tempoString += (MidiByte) ( tempoValue & 0xFF );
+
+ midiEvent = new MidiEvent(midiEventAbsoluteTime,
+ MIDI_FILE_META_EVENT,
+ MIDI_SET_TEMPO,
+ tempoString);
+
+ m_midiComposition[conductorTrack].push_back(midiEvent);
+ }
+
+ // Insert time signatures (don't worry that the times might be out
+ // of order with those of the tempo events -- we sort the track later)
+ //
+ for (int i = 0; i < comp.getTimeSignatureCount(); i++) {
+ std::pair<timeT, TimeSignature> timeSig =
+ comp.getTimeSignatureChange(i);
+
+ midiEventAbsoluteTime = timeSig.first * m_timingDivision
+ / crotchetDuration;
+
+ string timeSigString;
+ timeSigString += (MidiByte) (timeSig.second.getNumerator());
+ int denominator = timeSig.second.getDenominator();
+ int denPowerOf2 = 0;
+
+ // Work out how many powers of two are in the denominator
+ //
+ while (denominator >>= 1)
+ denPowerOf2++;
+
+ timeSigString += (MidiByte) denPowerOf2;
+
+ // The third byte is the number of MIDI clocks per beat.
+ // There are 24 clocks per quarter-note (the MIDI clock
+ // is tempo-independent and is not related to the timebase).
+ //
+ int cpb = 24 * timeSig.second.getBeatDuration() / crotchetDuration;
+ timeSigString += (MidiByte) cpb;
+
+ // And the fourth byte is always 8, for us (it expresses
+ // the number of notated 32nd-notes in a MIDI quarter-note,
+ // for applications that may want to notate and perform
+ // in different units)
+ //
+ timeSigString += (MidiByte) 8;
+
+ midiEvent = new MidiEvent(midiEventAbsoluteTime,
+ MIDI_FILE_META_EVENT,
+ MIDI_TIME_SIGNATURE,
+ timeSigString);
+
+ m_midiComposition[conductorTrack].push_back(midiEvent);
+ }
+
+ // Insert markers
+ // fix for bug#
+ Composition::markercontainer marks = comp.getMarkers();
+
+ for (unsigned int i = 0; i < marks.size(); i++) {
+ midiEventAbsoluteTime = marks[i]->getTime() * m_timingDivision
+ / crotchetDuration;
+
+ midiEvent = new MidiEvent( midiEventAbsoluteTime,
+ MIDI_FILE_META_EVENT,
+ MIDI_TEXT_MARKER,
+ marks[i]->getName() );
+
+ m_midiComposition[conductorTrack].push_back(midiEvent);
+ }
+
+ m_numberOfTracks = 1;
+ std::map<int, int> trackPosMap; // RG track pos -> MIDI track no
+
+ // In pass one just insert all events including new NOTE OFFs at the right
+ // absolute times.
+ //
+ for (Composition::const_iterator segment = comp.begin();
+ segment != comp.end(); ++segment) {
+
+ // We use this later to get NOTE durations
+ //
+ SegmentPerformanceHelper helper(**segment);
+
+ Track *track = comp.getTrackById((*segment)->getTrack());
+
+ if (track->isMuted()) continue;
+
+ // Fix #1602023, map Rosegarden tracks to MIDI tracks, instead of
+ // putting each segment out on a new track
+
+ int trackPosition = track->getPosition();
+ bool firstSegmentThisTrack = false;
+
+ if (trackPosMap.find(trackPosition) == trackPosMap.end()) {
+ firstSegmentThisTrack = true;
+ trackPosMap[trackPosition] = m_numberOfTracks++;
+ }
+
+ int trackNumber = trackPosMap[trackPosition];
+
+ MidiTrack &mtrack = m_midiComposition[trackNumber];
+
+ midiEvent = new MidiEvent(0,
+ MIDI_FILE_META_EVENT,
+ MIDI_TRACK_NAME,
+ track->getLabel());
+
+ mtrack.push_back(midiEvent);
+
+ // Get the Instrument
+ //
+ Instrument *instr =
+ m_studio->getInstrumentById(track->getInstrument());
+
+ if (firstSegmentThisTrack) {
+
+ MidiByte program = 0;
+ midiChannel = 0;
+
+ bool useBank = false;
+ MidiByte lsb = 0;
+ MidiByte msb = 0;
+
+ if (instr) {
+ midiChannel = instr->getMidiChannel();
+ program = instr->getProgramChange();
+ if (instr->sendsBankSelect()) {
+ lsb = instr->getLSB();
+ msb = instr->getMSB();
+ useBank = true;
+ }
+ }
+
+ if (useBank) {
+
+ // insert a bank select
+
+ if (msb != 0) {
+ midiEvent = new MidiEvent(0,
+ MIDI_CTRL_CHANGE | midiChannel,
+ MIDI_CONTROLLER_BANK_MSB,
+ msb);
+ mtrack.push_back(midiEvent);
+ }
+
+ if (lsb != 0) {
+ midiEvent = new MidiEvent(0,
+ MIDI_CTRL_CHANGE | midiChannel,
+ MIDI_CONTROLLER_BANK_LSB,
+ lsb);
+ mtrack.push_back(midiEvent);
+ }
+ }
+
+ // insert a program change
+ midiEvent = new MidiEvent(0, // time
+ MIDI_PROG_CHANGE | midiChannel,
+ program);
+ mtrack.push_back(midiEvent);
+
+ if (instr) {
+
+ // MidiInstrument parameters: volume, pan, attack,
+ // release, filter, resonance, chorus, reverb. Always
+ // write these: the Instrument has an additional parameter
+ // to record whether they should be sent, but it isn't
+ // actually set anywhere so we have to ignore it.
+
+ static int controllers[] = {
+ MIDI_CONTROLLER_ATTACK,
+ MIDI_CONTROLLER_RELEASE,
+ MIDI_CONTROLLER_FILTER,
+ MIDI_CONTROLLER_RESONANCE,
+ MIDI_CONTROLLER_CHORUS,
+ MIDI_CONTROLLER_REVERB
+ };
+
+ mtrack.push_back
+ (new MidiEvent(0, MIDI_CTRL_CHANGE | midiChannel,
+ MIDI_CONTROLLER_VOLUME, instr->getVolume()));
+
+ mtrack.push_back
+ (new MidiEvent(0, MIDI_CTRL_CHANGE | midiChannel,
+ MIDI_CONTROLLER_PAN, instr->getPan()));
+
+ for (int i = 0; i < sizeof(controllers)/sizeof(controllers[0]); ++i) {
+ try {
+ mtrack.push_back
+ (new MidiEvent
+ (0, MIDI_CTRL_CHANGE | midiChannel, controllers[i],
+ instr->getControllerValue(controllers[i])));
+ } catch (...) {
+ /* do nothing */
+ }
+ }
+ } // if (instr)
+ } // if (firstSegmentThisTrack)
+
+ timeT segmentMidiDuration =
+ ((*segment)->getEndMarkerTime() -
+ (*segment)->getStartTime()) * m_timingDivision /
+ crotchetDuration;
+
+ for (Segment::iterator el = (*segment)->begin();
+ (*segment)->isBeforeEndMarker(el); ++el) {
+ midiEventAbsoluteTime =
+ (*el)->getAbsoluteTime() + (*segment)->getDelay();
+
+ timeT absoluteTimeLimit = midiEventAbsoluteTime;
+ if ((*segment)->isRepeating()) {
+ absoluteTimeLimit = ((*segment)->getRepeatEndTime() - 1) +
+ (*segment)->getDelay();
+ }
+
+ if ((*segment)->getRealTimeDelay() != RealTime::zeroTime) {
+ RealTime evRT = comp.getElapsedRealTime(midiEventAbsoluteTime);
+ timeT timeBeforeDelay = midiEventAbsoluteTime;
+ midiEventAbsoluteTime = comp.getElapsedTimeForRealTime
+ (evRT + (*segment)->getRealTimeDelay());
+ absoluteTimeLimit += (midiEventAbsoluteTime - timeBeforeDelay);
+ }
+
+ midiEventAbsoluteTime =
+ midiEventAbsoluteTime * m_timingDivision / crotchetDuration;
+ absoluteTimeLimit =
+ absoluteTimeLimit * m_timingDivision / crotchetDuration;
+
+ while (midiEventAbsoluteTime <= absoluteTimeLimit) {
+
+ try {
+
+ if ((*el)->isa(Note::EventType)) {
+ if ((*el)->has(BaseProperties::VELOCITY))
+ midiVelocity = (*el)->get
+ <Int>(BaseProperties::VELOCITY);
+ else
+ midiVelocity = 127;
+
+ // Get the sounding time for the matching NOTE_OFF.
+ // We use SegmentPerformanceHelper::getSoundingDuration()
+ // to work out the tied duration of the NOTE.
+ timeT soundingDuration = helper.getSoundingDuration(el);
+ if (soundingDuration > 0) {
+
+ timeT midiEventEndTime = midiEventAbsoluteTime +
+ soundingDuration * m_timingDivision /
+ crotchetDuration;
+
+ long pitch = 60;
+ (*el)->get
+ <Int>(BaseProperties::PITCH, pitch);
+ pitch += (*segment)->getTranspose();
+
+ // insert the NOTE_ON at the appropriate channel
+ //
+ midiEvent =
+ new MidiEvent(midiEventAbsoluteTime,
+ MIDI_NOTE_ON | midiChannel,
+ pitch,
+ midiVelocity);
+
+ mtrack.push_back(midiEvent);
+
+ // insert the matching NOTE OFF
+ //
+ midiEvent =
+ new MidiEvent(midiEventEndTime,
+ MIDI_NOTE_OFF | midiChannel,
+ pitch,
+ 127); // full volume silence
+
+ mtrack.push_back(midiEvent);
+ }
+ } else if ((*el)->isa(PitchBend::EventType)) {
+ PitchBend pb(**el);
+ midiEvent =
+ new MidiEvent(midiEventAbsoluteTime,
+ MIDI_PITCH_BEND | midiChannel,
+ pb.getLSB(), pb.getMSB());
+
+ mtrack.push_back(midiEvent);
+ } else if ((*el)->isa(Rosegarden::Key::EventType)) {
+ Rosegarden::Key key(**el);
+
+ int accidentals = key.getAccidentalCount();
+ if (!key.isSharp())
+ accidentals = -accidentals;
+
+ // stack out onto the meta string
+ //
+ std::string metaMessage;
+ metaMessage += MidiByte(accidentals);
+ metaMessage += MidiByte(key.isMinor());
+
+ midiEvent =
+ new MidiEvent(midiEventAbsoluteTime,
+ MIDI_FILE_META_EVENT,
+ MIDI_KEY_SIGNATURE,
+ metaMessage);
+
+ //mtrack.push_back(midiEvent);
+
+ } else if ((*el)->isa(Controller::EventType)) {
+ Controller c(**el);
+ midiEvent =
+ new MidiEvent(midiEventAbsoluteTime,
+ MIDI_CTRL_CHANGE | midiChannel,
+ c.getNumber(), c.getValue());
+
+ mtrack.push_back(midiEvent);
+ } else if ((*el)->isa(ProgramChange::EventType)) {
+ ProgramChange pc(**el);
+ midiEvent =
+ new MidiEvent(midiEventAbsoluteTime,
+ MIDI_PROG_CHANGE | midiChannel,
+ pc.getProgram());
+
+ mtrack.push_back(midiEvent);
+ } else if ((*el)->isa(SystemExclusive::EventType)) {
+ SystemExclusive s(**el);
+ std::string data = s.getRawData();
+
+ // check for closing EOX and add one if none found
+ //
+ if (MidiByte(data[data.length() - 1]) != MIDI_END_OF_EXCLUSIVE) {
+ data += MIDI_END_OF_EXCLUSIVE;
+ }
+
+ // construct plain SYSEX event
+ //
+ midiEvent = new MidiEvent(midiEventAbsoluteTime,
+ MIDI_SYSTEM_EXCLUSIVE,
+ data);
+
+ mtrack.push_back(midiEvent);
+
+ } else if ((*el)->isa(ChannelPressure::EventType)) {
+ ChannelPressure cp(**el);
+ midiEvent =
+ new MidiEvent(midiEventAbsoluteTime,
+ MIDI_CHNL_AFTERTOUCH | midiChannel,
+ cp.getPressure());
+
+ mtrack.push_back(midiEvent);
+ } else if ((*el)->isa(KeyPressure::EventType)) {
+ KeyPressure kp(**el);
+ midiEvent =
+ new MidiEvent(midiEventAbsoluteTime,
+ MIDI_POLY_AFTERTOUCH | midiChannel,
+ kp.getPitch(), kp.getPressure());
+
+ mtrack.push_back(midiEvent);
+ } else if ((*el)->isa(Text::EventType)) {
+ Text text(**el);
+ std::string metaMessage = text.getText();
+
+ MidiByte midiTextType = MIDI_TEXT_EVENT;
+
+ if (text.getTextType() == Text::Lyric) {
+ midiTextType = MIDI_LYRIC;
+ }
+
+ if (text.getTextType() != Text::Annotation) {
+ // (we don't write annotations)
+
+ midiEvent =
+ new MidiEvent(midiEventAbsoluteTime,
+ MIDI_FILE_META_EVENT,
+ midiTextType,
+ metaMessage);
+
+ mtrack.push_back(midiEvent);
+ }
+ } else if ((*el)->isa(Note::EventRestType)) {
+ // skip legitimately
+ } else {
+ /*
+ cerr << "MidiFile::convertToMidi - "
+ << "unsupported MidiType \""
+ << (*el)->getType()
+ << "\" at export"
+ << std::endl;
+ */
+ }
+
+ } catch (MIDIValueOutOfRange r) {
+#ifdef MIDI_DEBUG
+ std::cerr << "MIDI value out of range at "
+ << (*el)->getAbsoluteTime() << std::endl;
+#endif
+
+ } catch (Event::NoData d) {
+#ifdef MIDI_DEBUG
+ std::cerr << "Caught Event::NoData at "
+ << (*el)->getAbsoluteTime() << ", message is:"
+ << std::endl << d.getMessage() << std::endl;
+#endif
+
+ } catch (Event::BadType b) {
+#ifdef MIDI_DEBUG
+ std::cerr << "Caught Event::BadType at "
+ << (*el)->getAbsoluteTime() << ", message is:"
+ << std::endl << b.getMessage() << std::endl;
+#endif
+
+ } catch (SystemExclusive::BadEncoding e) {
+#ifdef MIDI_DEBUG
+ std::cerr << "Caught bad SysEx encoding at "
+ << (*el)->getAbsoluteTime() << std::endl;
+#endif
+
+ }
+
+ if (segmentMidiDuration > 0) {
+ midiEventAbsoluteTime += segmentMidiDuration;
+ } else
+ break;
+ }
+ }
+ }
+
+ // Now gnash through the MIDI events and turn the absolute times
+ // into delta times.
+ //
+ //
+ MidiTrack::iterator it;
+ timeT deltaTime, lastMidiTime;
+
+ for (TrackId i = 0; i < m_numberOfTracks; i++) {
+ lastMidiTime = 0;
+
+ // First sort the track with the MidiEvent comparator. Use
+ // stable_sort so that events with equal times are maintained
+ // in their current order (important for e.g. bank-program
+ // pairs, or the controllers at the start of the track which
+ // should follow the program so we can treat them correctly
+ // when re-reading).
+ //
+ std::stable_sort(m_midiComposition[i].begin(),
+ m_midiComposition[i].end(),
+ MidiEventCmp());
+
+ for (it = m_midiComposition[i].begin();
+ it != m_midiComposition[i].end();
+ it++) {
+ deltaTime = (*it)->getTime() - lastMidiTime;
+ lastMidiTime = (*it)->getTime();
+ (*it)->setTime(deltaTime);
+ }
+
+ // Insert end of track event (delta time = 0)
+ //
+ midiEvent = new MidiEvent(0, MIDI_FILE_META_EVENT,
+ MIDI_END_OF_TRACK, "");
+
+ m_midiComposition[i].push_back(midiEvent);
+
+ }
+
+ return ;
+}
+
+
+
+// Convert an integer into a two byte representation and
+// write out to the MidiFile.
+//
+void
+MidiFile::intToMidiBytes(std::ofstream* midiFile, int number)
+{
+ MidiByte upper;
+ MidiByte lower;
+
+ upper = (number & 0xFF00) >> 8;
+ lower = (number & 0x00FF);
+
+ *midiFile << (MidiByte) upper;
+ *midiFile << (MidiByte) lower;
+
+}
+
+void
+MidiFile::longToMidiBytes(std::ofstream* midiFile, unsigned long number)
+{
+ MidiByte upper1;
+ MidiByte lower1;
+ MidiByte upper2;
+ MidiByte lower2;
+
+ upper1 = (number & 0xff000000) >> 24;
+ lower1 = (number & 0x00ff0000) >> 16;
+ upper2 = (number & 0x0000ff00) >> 8;
+ lower2 = (number & 0x000000ff);
+
+ *midiFile << (MidiByte) upper1;
+ *midiFile << (MidiByte) lower1;
+ *midiFile << (MidiByte) upper2;
+ *midiFile << (MidiByte) lower2;
+
+}
+
+// Turn a delta time into a MIDI time - overlapping into
+// a maximum of four bytes using the MSB as the carry on
+// flag.
+//
+std::string
+MidiFile::longToVarBuffer(unsigned long number)
+{
+ std::string rS;
+
+ long inNumber = number;
+ long outNumber;
+
+ // get the lowest 7 bits of the number
+ outNumber = number & 0x7f;
+
+ // Shift and test and move the numbers
+ // on if we need them - setting the MSB
+ // as we go.
+ //
+ while ((inNumber >>= 7 ) > 0) {
+ outNumber <<= 8;
+ outNumber |= 0x80;
+ outNumber += (inNumber & 0x7f);
+ }
+
+ // Now move the converted number out onto the buffer
+ //
+ while (true) {
+ rS += (MidiByte)(outNumber & 0xff);
+ if (outNumber & 0x80)
+ outNumber >>= 8;
+ else
+ break;
+ }
+
+ return rS;
+}
+
+
+
+// Write out the MIDI file header
+//
+bool
+MidiFile::writeHeader(std::ofstream* midiFile)
+{
+ // Our identifying Header string
+ //
+ *midiFile << MIDI_FILE_HEADER.c_str();
+
+ // Write number of Bytes to follow
+ //
+ *midiFile << (MidiByte) 0x00;
+ *midiFile << (MidiByte) 0x00;
+ *midiFile << (MidiByte) 0x00;
+ *midiFile << (MidiByte) 0x06;
+
+ // Write File Format
+ //
+ *midiFile << (MidiByte) 0x00;
+ *midiFile << (MidiByte) m_format;
+
+ // Number of Tracks we're writing out
+ //
+ intToMidiBytes(midiFile, m_numberOfTracks);
+
+ // Timing Division
+ //
+ intToMidiBytes(midiFile, m_timingDivision);
+
+ return (true);
+}
+
+// Write a MIDI track to file
+//
+bool
+MidiFile::writeTrack(std::ofstream* midiFile, TrackId trackNumber)
+{
+ bool retOK = true;
+ MidiByte eventCode = 0;
+ MidiTrack::iterator midiEvent;
+
+ // First we write into the trackBuffer, then write it out to the
+ // file with it's accompanying length.
+ //
+ string trackBuffer;
+
+ long progressTotal = m_midiComposition[trackNumber].size();
+ long progressCount = 0;
+
+ for (midiEvent = m_midiComposition[trackNumber].begin();
+ midiEvent != m_midiComposition[trackNumber].end();
+ midiEvent++) {
+ // Write the time to the buffer in MIDI format
+ //
+ //
+ trackBuffer += longToVarBuffer((*midiEvent)->getTime());
+
+ if ((*midiEvent)->isMeta()) {
+ trackBuffer += MIDI_FILE_META_EVENT;
+ trackBuffer += (*midiEvent)->getMetaEventCode();
+
+ // Variable length number field
+ trackBuffer += longToVarBuffer((*midiEvent)->
+ getMetaMessage().length());
+
+ trackBuffer += (*midiEvent)->getMetaMessage();
+ } else {
+ // Send the normal event code (with encoded channel information)
+ //
+ // Fix for 674731 by Pedro Lopez-Cabanillas (20030531)
+ if (((*midiEvent)->getEventCode() != eventCode) ||
+ ((*midiEvent)->getEventCode() == MIDI_SYSTEM_EXCLUSIVE)) {
+ trackBuffer += (*midiEvent)->getEventCode();
+ eventCode = (*midiEvent)->getEventCode();
+ }
+
+ // Send the relevant data
+ //
+ switch ((*midiEvent)->getMessageType()) {
+ case MIDI_NOTE_ON:
+ case MIDI_NOTE_OFF:
+ case MIDI_POLY_AFTERTOUCH:
+ trackBuffer += (*midiEvent)->getData1();
+ trackBuffer += (*midiEvent)->getData2();
+ break;
+
+ case MIDI_CTRL_CHANGE:
+ trackBuffer += (*midiEvent)->getData1();
+ trackBuffer += (*midiEvent)->getData2();
+ break;
+
+ case MIDI_PROG_CHANGE:
+ trackBuffer += (*midiEvent)->getData1();
+ break;
+
+ case MIDI_CHNL_AFTERTOUCH:
+ trackBuffer += (*midiEvent)->getData1();
+ break;
+
+ case MIDI_PITCH_BEND:
+ trackBuffer += (*midiEvent)->getData1();
+ trackBuffer += (*midiEvent)->getData2();
+ break;
+
+ case MIDI_SYSTEM_EXCLUSIVE:
+
+ // write out message length
+ trackBuffer +=
+ longToVarBuffer((*midiEvent)->getMetaMessage().length());
+
+ // now the message
+ trackBuffer += (*midiEvent)->getMetaMessage();
+
+ break;
+
+ default:
+#ifdef MIDI_DEBUG
+
+ std::cerr << "MidiFile::writeTrack()"
+ << " - cannot write unsupported MIDI event"
+ << endl;
+#endif
+
+ break;
+ }
+ }
+
+ // For the moment just keep the app updating until we work
+ // out a good way of accounting for this write.
+ //
+ ++progressCount;
+
+ if (progressCount % 500 == 0) {
+ emit setProgress(progressCount * 100 / progressTotal);
+ kapp->processEvents(500);
+ }
+ }
+
+ // Now we write the track - First the standard header..
+ //
+ *midiFile << MIDI_TRACK_HEADER.c_str();
+
+ // ..now the length of the buffer..
+ //
+ longToMidiBytes(midiFile, (long)trackBuffer.length());
+
+ // ..then the buffer itself..
+ //
+ *midiFile << trackBuffer;
+
+ return (retOK);
+}
+
+// Writes out a MIDI file from the internal Midi representation
+//
+bool
+MidiFile::write()
+{
+ bool retOK = true;
+
+ std::ofstream *midiFile =
+ new std::ofstream(m_fileName.c_str(), ios::out | ios::binary);
+
+
+ if (!(*midiFile)) {
+#ifdef MIDI_DEBUG
+ std::cerr << "MidiFile::write() - can't write file" << endl;
+#endif
+
+ m_format = MIDI_FILE_NOT_LOADED;
+ return false;
+ }
+
+ // Write out the Header
+ //
+ writeHeader(midiFile);
+
+ // And now the tracks
+ //
+ for (TrackId i = 0; i < m_numberOfTracks; i++ )
+ if (!writeTrack(midiFile, i))
+ retOK = false;
+
+ midiFile->close();
+
+ if (!retOK)
+ m_format = MIDI_FILE_NOT_LOADED;
+
+ return (retOK);
+}
+
+// Delete dead NOTE OFF and NOTE ON/Zero Velocty Events after
+// reading them and modifying their relevant NOTE ONs
+//
+bool
+MidiFile::consolidateNoteOffEvents(TrackId track)
+{
+ MidiTrack::iterator nOE, mE = m_midiComposition[track].begin();
+ bool notesOnTrack = false;
+ bool noteOffFound;
+
+ for (;mE != m_midiComposition[track].end(); mE++) {
+ if ((*mE)->getMessageType() == MIDI_NOTE_ON && (*mE)->getVelocity() > 0) {
+ // We've found a note - flag it
+ //
+ if (!notesOnTrack)
+ notesOnTrack = true;
+
+ noteOffFound = false;
+
+ for (nOE = mE; nOE != m_midiComposition[track].end(); nOE++) {
+ if (((*nOE)->getChannelNumber() == (*mE)->getChannelNumber()) &&
+ ((*nOE)->getPitch() == (*mE)->getPitch()) &&
+ ((*nOE)->getMessageType() == MIDI_NOTE_OFF ||
+ ((*nOE)->getMessageType() == MIDI_NOTE_ON &&
+ (*nOE)->getVelocity() == 0x00))) {
+ (*mE)->setDuration((*nOE)->getTime() - (*mE)->getTime());
+
+ delete *nOE;
+ m_midiComposition[track].erase(nOE);
+
+ noteOffFound = true;
+ break;
+ }
+ }
+
+ // If no matching NOTE OFF has been found then set
+ // Event duration to length of Segment
+ //
+ if (noteOffFound == false) {
+ --nOE; // avoid crash due to nOE == track.end()
+ (*mE)->setDuration((*nOE)->getTime() - (*mE)->getTime());
+ }
+ }
+ }
+
+ return notesOnTrack;
+}
+
+// Clear down the MidiFile Composition
+//
+void
+MidiFile::clearMidiComposition()
+{
+ for (MidiComposition::iterator ci = m_midiComposition.begin();
+ ci != m_midiComposition.end(); ++ci) {
+
+ //std::cerr << "MidiFile::clearMidiComposition: track " << ci->first << std::endl;
+
+ for (MidiTrack::iterator ti = ci->second.begin();
+ ti != ci->second.end(); ++ti) {
+ delete *ti;
+ }
+
+ ci->second.clear();
+ }
+
+ m_midiComposition.clear();
+ m_trackChannelMap.clear();
+}
+
+// Doesn't do anything yet - doesn't need to. We need to satisfy
+// the pure virtual function in the base class.
+//
+void
+MidiFile::close()
+{}
+
+
+
+}
+
+#include "MidiFile.moc"
diff --git a/src/sound/MidiFile.h b/src/sound/MidiFile.h
new file mode 100644
index 0000000..da97374
--- /dev/null
+++ b/src/sound/MidiFile.h
@@ -0,0 +1,173 @@
+// -*- c-indentation-style:"stroustrup" c-basic-offset: 4 -*-
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#ifndef _ROSEGARDEN_MIDI_FILE_H_
+#define _ROSEGARDEN_MIDI_FILE_H_
+
+#include <fstream>
+#include <string>
+#include <list>
+#include <map>
+
+#include <qobject.h>
+
+#include "Midi.h"
+#include "MidiEvent.h"
+#include "Composition.h"
+#include "SoundFile.h"
+
+// Conversion class for Composition to and
+// from MIDI Files. Despite the fact you can reuse this
+// object it's probably safer just to create it for a
+// single way conversion and then throw it away (MIDI
+// to Composition conversion invalidates the internal
+// MIDI model).
+//
+// Derived from SoundFile but still had some features
+// in common with it which could theoretically be moved
+// up into the base for use in other derived classes.
+//
+// [rwb]
+//
+//
+
+namespace Rosegarden
+{
+
+// Our internal MIDI structure is just a list of MidiEvents.
+// We use a list and not a set because we want the order of
+// the events to be arbitrary until we explicitly sort them
+// (necessary when converting Composition absolute times to
+// MIDI delta times).
+//
+typedef std::vector<MidiEvent *> MidiTrack;
+typedef std::map<unsigned int, MidiTrack> MidiComposition;
+
+class Studio;
+
+class MidiFile : public QObject, public SoundFile
+{
+ Q_OBJECT
+public:
+
+ typedef enum
+ {
+ MIDI_SINGLE_TRACK_FILE = 0x00,
+ MIDI_SIMULTANEOUS_TRACK_FILE = 0x01,
+ MIDI_SEQUENTIAL_TRACK_FILE = 0x02,
+ MIDI_CONVERTED_TO_APPLICATION = 0xFE,
+ MIDI_FILE_NOT_LOADED = 0xFF
+ } MIDIFileFormatType;
+
+ typedef enum
+ {
+ CONVERT_REPLACE,
+ CONVERT_AUGMENT,
+ CONVERT_APPEND
+ } ConversionType;
+
+ MidiFile(Studio *studio);
+ MidiFile (const std::string &fn, Studio *studio);
+ ~MidiFile();
+
+ // Declare our virtuals
+ //
+ virtual bool open();
+ virtual bool write();
+ virtual void close();
+
+ int timingDivision() { return m_timingDivision; }
+ MIDIFileFormatType format() { return m_format; }
+ unsigned int numberOfTracks() { return m_numberOfTracks; }
+ bool hasTimeChanges() { return m_containsTimeChanges; }
+
+ // If a file open or save failed
+ std::string getError() { return m_error; }
+
+ /**
+ * Convert a MIDI file to a Rosegarden composition. Return true
+ * for success.
+ */
+ bool convertToRosegarden(Composition &c, ConversionType type);
+
+ /**
+ * Convert a Rosegarden composition to MIDI format, storing the
+ * result internally for later writing.
+ */
+ void convertToMidi(Composition &comp);
+
+signals:
+ void setProgress(int);
+ void incrementProgress(int);
+
+private:
+
+ int m_timingDivision; // pulses per quarter note
+ MIDIFileFormatType m_format;
+ unsigned int m_numberOfTracks;
+ bool m_containsTimeChanges;
+
+ // Internal counters
+ //
+ long m_trackByteCount;
+ bool m_decrementCount;
+
+ // Internal MidiComposition
+ //
+ MidiComposition m_midiComposition;
+ std::map<int, int> m_trackChannelMap;
+
+ // Clear the m_midiComposition
+ //
+ void clearMidiComposition();
+
+ // Split the tasks up with these top level private methods
+ //
+ bool parseHeader(const std::string& midiHeader);
+ bool parseTrack(std::ifstream* midiFile, unsigned int &trackNum);
+ bool writeHeader(std::ofstream* midiFile);
+ bool writeTrack(std::ofstream* midiFile, unsigned int trackNum);
+
+ bool consolidateNoteOffEvents(TrackId track);
+
+ // Internal convenience functions
+ //
+ int midiBytesToInt(const std::string& bytes);
+ long midiBytesToLong(const std::string& bytes);
+ long getNumberFromMidiBytes(std::ifstream* midiFile, int firstByte = -1);
+ MidiByte getMidiByte(std::ifstream* midiFile);
+ std::string getMidiBytes(std::ifstream* midiFile,
+ unsigned long bytes);
+ bool skipToNextTrack(std::ifstream *midiFile);
+ void intToMidiBytes(std::ofstream* midiFile, int number);
+ void longToMidiBytes(std::ofstream* midiFile, unsigned long number);
+ std::string longToVarBuffer(unsigned long number);
+
+ // The pointer to the Studio for Instrument stuff
+ //
+ Studio *m_studio;
+
+ std::string m_error;
+};
+
+}
+
+#endif // _ROSEGARDEN_MIDI_FILE_H_
diff --git a/src/sound/MidiMapping.xml b/src/sound/MidiMapping.xml
new file mode 100644
index 0000000..13b7138
--- /dev/null
+++ b/src/sound/MidiMapping.xml
@@ -0,0 +1,133 @@
+
+<midi>
+ <bank id="0" name="General MIDI">
+ <program id="0" name="Acoustic Grand Piano"/>
+ <program id="1" name="Bright Acoustic Piano"/>
+ <program id="2" name="Electric Grand Piano"/>
+ <program id="3" name="Honky-tonk Piano"/>
+ <program id="4" name="Electric Piano 1"/>
+ <program id="5" name="Electric Piano 2"/>
+ <program id="6" name="Harpsichord"/>
+ <program id="7" name="Clavi"/>
+ <program id="8" name="Celesta"/>
+ <program id="9" name="Glockenspiel"/>
+ <program id="10" name="Music Box"/>
+ <program id="11" name="Vibraphone"/>
+ <program id="12" name="Marimba"/>
+ <program id="13" name="Xylophone"/>
+ <program id="14" name="Tubular Bells"/>
+ <program id="15" name="Dulcimer"/>
+ <program id="16" name="Drawbar Organ"/>
+ <program id="17" name="Percussive Organ"/>
+ <program id="18" name="Rock Organ"/>
+ <program id="19" name="Church Organ"/>
+ <program id="20" name="Reed Organ"/>
+ <program id="21" name="Accordion"/>
+ <program id="22" name="Harmonica"/>
+ <program id="23" name="Tango Accordion"/>
+ <program id="24" name="Acoustic Guitar (nylon)"/>
+ <program id="25" name="Acoustic Guitar (steel)"/>
+ <program id="26" name="Electric Guitar (jazz)"/>
+ <program id="27" name="Electric Guitar (clean)"/>
+ <program id="28" name="Electric Guitar (muted)"/>
+ <program id="29" name="Overdriven Guitar"/>
+ <program id="30" name="Distortion Guitar"/>
+ <program id="31" name="Guitar harmonics"/>
+ <program id="32" name="Acoustic Bass"/>
+ <program id="33" name="Fingered Bass"/>
+ <program id="34" name="Picked Bass"/>
+ <program id="35" name="Fretless Bass"/>
+ <program id="36" name="Slap Bass 1"/>
+ <program id="37" name="Slap Bass 2"/>
+ <program id="38" name="Synth Bass 1"/>
+ <program id="39" name="Synth Bass 2"/>
+ <program id="40" name="Violin"/>
+ <program id="41" name="Viola"/>
+ <program id="42" name="Cello"/>
+ <program id="43" name="Contrabass"/>
+ <program id="44" name="Tremolo Strings"/>
+ <program id="45" name="Pizzicato Strings"/>
+ <program id="46" name="Orchestral Harp"/>
+ <program id="47" name="Timpani"/>
+ <program id="48" name="String Ensemble 1"/>
+ <program id="49" name="String Ensemble 2"/>
+ <program id="50" name="SynthStrings 1"/>
+ <program id="51" name="SynthStrings 2"/>
+ <program id="52" name="Choir Aahs"/>
+ <program id="53" name="Voice Oohs"/>
+ <program id="54" name="Synth Voice"/>
+ <program id="55" name="Orchestra Hit"/>
+ <program id="56" name="Trumpet"/>
+ <program id="57" name="Trombone"/>
+ <program id="58" name="Tuba"/>
+ <program id="59" name="Muted Trumpet"/>
+ <program id="60" name="French Horn"/>
+ <program id="61" name="Brass Section"/>
+ <program id="62" name="SynthBrass 1"/>
+ <program id="63" name="SynthBrass 2"/>
+ <program id="64" name="Soprano Sax"/>
+ <program id="65" name="Alto Sax"/>
+ <program id="66" name="Tenor Sax"/>
+ <program id="67" name="Baritone Sax"/>
+ <program id="68" name="Oboe"/>
+ <program id="69" name="English Horn"/>
+ <program id="70" name="Bassoon"/>
+ <program id="71" name="Clarinet"/>
+ <program id="72" name="Piccolo"/>
+ <program id="73" name="Flute"/>
+ <program id="74" name="Recorder"/>
+ <program id="75" name="Pan Flute"/>
+ <program id="76" name="Blown Bottle"/>
+ <program id="77" name="Shakuhachi"/>
+ <program id="78" name="Whistle"/>
+ <program id="79" name="Ocarina"/>
+ <program id="80" name="Lead 1 (square)"/>
+ <program id="81" name="Lead 2 (sawtooth)"/>
+ <program id="82" name="Lead 3 (calliope)"/>
+ <program id="83" name="Lead 4 (chiff)"/>
+ <program id="84" name="Lead 5 (charang)"/>
+ <program id="85" name="Lead 6 (voice)"/>
+ <program id="86" name="Lead 7 (fifths)"/>
+ <program id="87" name="Lead 8 (bass + lead)"/>
+ <program id="88" name="Pad 1 (new age)"/>
+ <program id="89" name="Pad 2 (warm)"/>
+ <program id="90" name="Pad 3 (polysynth)"/>
+ <program id="91" name="Pad 4 (choir)"/>
+ <program id="92" name="Pad 5 (bowed)"/>
+ <program id="93" name="Pad 6 (metallic)"/>
+ <program id="94" name="Pad 7 (halo)"/>
+ <program id="95" name="Pad 8 (sweep)"/>
+ <program id="96" name="FX 1 (rain)"/>
+ <program id="97" name="FX 2 (soundtrack)"/>
+ <program id="98" name="FX 3 (crystal)"/>
+ <program id="99" name="FX 4 (atmosphere)"/>
+ <program id="100" name="FX 5 (brightness)"/>
+ <program id="101" name="FX 6 (goblins)"/>
+ <program id="102" name="FX 7 (echoes)"/>
+ <program id="103" name="FX 8 (sci-fi)"/>
+ <program id="104" name="Sitar"/>
+ <program id="105" name="Banjo"/>
+ <program id="106" name="Shamisen"/>
+ <program id="107" name="Koto"/>
+ <program id="108" name="Kalimba"/>
+ <program id="109" name="Bag pipe"/>
+ <program id="110" name="Fiddle"/>
+ <program id="111" name="Shanai"/>
+ <program id="112" name="Tinkle Bell"/>
+ <program id="113" name="Agogo"/>
+ <program id="114" name="Steel Drums"/>
+ <program id="115" name="Woodblock"/>
+ <program id="116" name="Taiko Drum"/>
+ <program id="117" name="Melodic Tom"/>
+ <program id="118" name="Synth Drum"/>
+ <program id="119" name="Reverse Cymbal"/>
+ <program id="120" name="Guitar Fret Noise"/>
+ <program id="121" name="Breath Noise"/>
+ <program id="122" name="Seashore"/>
+ <program id="123" name="Bird Tweet"/>
+ <program id="124" name="Telephone Ring"/>
+ <program id="125" name="Helicopter"/>
+ <program id="126" name="Applause"/>
+ <program id="127" name="Gunshot"/>
+ </bank>
+</midi>
diff --git a/src/sound/PeakFile.cpp b/src/sound/PeakFile.cpp
new file mode 100644
index 0000000..8881114
--- /dev/null
+++ b/src/sound/PeakFile.cpp
@@ -0,0 +1,1033 @@
+// -*- c-indentation-style:"stroustrup" c-basic-offset: 4 -*- /*
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include <cmath>
+#include <cstdlib>
+#include <kapplication.h>
+
+#include <qdatetime.h>
+#include <qstringlist.h>
+#include <qpalette.h>
+#include <kapp.h>
+
+#include "PeakFile.h"
+#include "AudioFile.h"
+#include "Profiler.h"
+
+using std::cout;
+using std::cerr;
+using std::endl;
+
+//#define DEBUG_PEAKFILE 1
+//#define DEBUG_PEAKFILE_BRIEF 1
+//#define DEBUG_PEAKFILE_CACHE 1
+
+#ifdef DEBUG_PEAKFILE
+#define DEBUG_PEAKFILE_BRIEF 1
+#endif
+
+namespace Rosegarden
+{
+
+PeakFile::PeakFile(AudioFile *audioFile):
+ SoundFile(audioFile->getPeakFilename()),
+ m_audioFile(audioFile),
+ m_version( -1), // -1 defines new file - start at 0
+ m_format(1), // default is 8-bit peak format
+ m_pointsPerValue(0),
+ m_blockSize(256), // default block size is 256 samples
+ m_channels(0),
+ m_numberOfPeaks(0),
+ m_positionPeakOfPeaks(0),
+ m_offsetToPeaks(0),
+ m_modificationTime(QDate(1970, 1, 1), QTime(0, 0, 0)),
+ m_chunkStartPosition(0),
+ m_lastPreviewStartTime(0, 0),
+ m_lastPreviewEndTime(0, 0),
+ m_lastPreviewWidth( -1),
+ m_lastPreviewShowMinima(false)
+{}
+
+PeakFile::~PeakFile()
+{}
+
+bool
+PeakFile::open()
+{
+ // Set the file size
+ //
+ QFileInfo info(QString(m_fileName.c_str()));
+ m_fileSize = info.size();
+
+ // If we're already open then don't open again
+ //
+ if (m_inFile && m_inFile->is_open())
+ return true;
+
+ // Open
+ //
+ m_inFile = new std::ifstream(m_fileName.c_str(),
+ std::ios::in | std::ios::binary);
+ // Check we're open
+ //
+ if (!(*m_inFile))
+ return false;
+
+ try {
+ parseHeader();
+ } catch (BadSoundFileException s) {
+
+#ifdef DEBUG_PEAKFILE
+ cerr << "PeakFile::open - EXCEPTION \"" << s.getMessage() << "\""
+ << endl;
+#endif
+
+ return false;
+ }
+
+ return true;
+}
+
+void
+PeakFile::parseHeader()
+{
+ if (!(*m_inFile))
+ return ;
+
+ m_inFile->seekg(0, std::ios::beg);
+
+ // get full header length
+ //
+ std::string header = getBytes(128);
+
+#if (__GNUC__ < 3)
+
+ if (header.compare(AUDIO_BWF_PEAK_ID, 0, 4) != 0)
+#else
+
+ if (header.compare(0, 4, AUDIO_BWF_PEAK_ID) != 0)
+#endif
+
+ {
+ throw(BadSoundFileException(m_fileName, "PeakFile::parseHeader - can't find LEVL identifier"));
+ }
+
+ int length = getIntegerFromLittleEndian(header.substr(4, 4));
+
+ // Get the length of the header minus the first 8 bytes
+ //
+ if (length == 0)
+ throw(BadSoundFileException(m_fileName, "PeakFile::parseHeader - can't get header length"));
+
+ // Get the file information
+ //
+ m_version = getIntegerFromLittleEndian(header.substr(8, 4));
+ m_format = getIntegerFromLittleEndian(header.substr(12, 4));
+ m_pointsPerValue = getIntegerFromLittleEndian(header.substr(16, 4));
+ m_blockSize = getIntegerFromLittleEndian(header.substr(20, 4));
+ m_channels = getIntegerFromLittleEndian(header.substr(24, 4));
+ m_numberOfPeaks = getIntegerFromLittleEndian(header.substr(28, 4));
+ m_positionPeakOfPeaks = getIntegerFromLittleEndian(header.substr(32, 4));
+
+ // Read in date string and convert it up to QDateTime
+ //
+ QString dateString = QString(header.substr(40, 28).c_str());
+
+ QStringList dateTime = QStringList::split(":", dateString);
+
+ m_modificationTime.setDate(QDate(dateTime[0].toInt(),
+ dateTime[1].toInt(),
+ dateTime[2].toInt()));
+
+ m_modificationTime.setTime(QTime(dateTime[3].toInt(),
+ dateTime[4].toInt(),
+ dateTime[5].toInt(),
+ dateTime[6].toInt()));
+
+ //printStats();
+
+}
+
+void
+PeakFile::printStats()
+{
+ cout << endl;
+ cout << "STATS for PeakFile \"" << m_fileName << "\"" << endl
+ << "-----" << endl << endl;
+
+ cout << " VERSION = " << m_version << endl
+ << " FORMAT = " << m_format << endl
+ << " BYTES/VALUE = " << m_pointsPerValue << endl
+ << " BLOCKSIZE = " << m_blockSize << endl
+ << " CHANNELS = " << m_channels << endl
+ << " PEAK FRAMES = " << m_numberOfPeaks << endl
+ << " PEAK OF PKS = " << m_positionPeakOfPeaks << endl
+ << endl;
+
+ cout << "DATE" << endl
+ << "----" << endl << endl
+ << " YEAR = " << m_modificationTime.date().year() << endl
+ << " MONTH = " << m_modificationTime.date().month() << endl
+ << " DAY = " << m_modificationTime.date().day() << endl
+ << " HOUR = " << m_modificationTime.time().hour() << endl
+ << " MINUTE = " << m_modificationTime.time().minute()
+ << endl
+ << " SECOND = " << m_modificationTime.time().second()
+ << endl
+ << " MSEC = " << m_modificationTime.time().msec()
+ << endl << endl;
+}
+
+bool
+PeakFile::write()
+{
+ return write(5); // default update every 5%
+}
+
+bool
+PeakFile::write(unsigned short updatePercentage)
+{
+ if (m_outFile) {
+ m_outFile->close();
+ delete m_outFile;
+ }
+
+ // Attempt to open AudioFile so that we can extract sample data
+ // for preview file generation
+ //
+ try {
+ if (!m_audioFile->open())
+ return false;
+ } catch (BadSoundFileException e) {
+#ifdef DEBUG_PEAKFILE
+ std::cerr << "PeakFile::write - \"" << e.getMessage() << "\"" << std::endl;
+#endif
+
+ return false;
+ }
+
+ // create and test that we've made it
+ m_outFile = new std::ofstream(m_fileName.c_str(),
+ std::ios::out | std::ios::binary);
+ if (!(*m_outFile))
+ return false;
+
+ // write out the header
+ writeHeader(m_outFile);
+
+ // and now the peak values
+ writePeaks(updatePercentage, m_outFile);
+
+ return true;
+}
+
+// Close the peak file and tidy up
+//
+void
+PeakFile::close()
+{
+ // Close any input file handle
+ //
+ if (m_inFile && m_inFile->is_open()) {
+ m_inFile->close();
+ delete m_inFile;
+ m_inFile = 0;
+ }
+
+ if (m_outFile == 0)
+ return ;
+
+ // Seek to start of chunk
+ //
+ m_outFile->seekp(m_chunkStartPosition, std::ios::beg);
+
+ // Seek to size field at set it
+ //
+ m_outFile->seekp(4, std::ios::cur);
+ putBytes(m_outFile, getLittleEndianFromInteger(m_bodyBytes + 120, 4));
+
+ // Seek to format and set it (m_format is only set at the
+ // end of writePeaks()
+ //
+ m_outFile->seekp(4, std::ios::cur);
+ putBytes(m_outFile, getLittleEndianFromInteger(m_format, 4));
+
+ // Seek to number of peak frames and write value
+ //
+ m_outFile->seekp(12, std::ios::cur);
+ putBytes(m_outFile,
+ getLittleEndianFromInteger(m_numberOfPeaks, 4));
+
+ // Peak of peaks
+ //
+ putBytes(m_outFile,
+ getLittleEndianFromInteger(m_positionPeakOfPeaks, 4));
+
+ // Seek to date field
+ //
+ m_outFile->seekp(4, std::ios::cur);
+
+ // Set modification time to now
+ //
+ m_modificationTime = m_modificationTime.currentDateTime();
+
+ QString fDate;
+ fDate.sprintf("%04d:%02d:%02d:%02d:%02d:%02d:%03d",
+ m_modificationTime.date().year(),
+ m_modificationTime.date().month(),
+ m_modificationTime.date().day(),
+ m_modificationTime.time().hour(),
+ m_modificationTime.time().minute(),
+ m_modificationTime.time().second(),
+ m_modificationTime.time().msec());
+
+ std::string dateString(fDate.data());
+
+ // Pad with spaces to make up to 28 bytes long and output
+ //
+ dateString += " ";
+ putBytes(m_outFile, dateString);
+
+ // Ok, now close and tidy up
+ //
+ m_outFile->close();
+ delete m_outFile;
+ m_outFile = 0;
+}
+
+// If the audio file is more recently modified that the modification time
+// on this peak file then we're invalid. The action to rectify this is
+// usually to regenerate the peak data.
+//
+bool
+PeakFile::isValid()
+{
+ if (m_audioFile->getModificationDateTime() > m_modificationTime)
+ return false;
+
+ return true;
+}
+
+bool
+PeakFile::writeToHandle(std::ofstream *file,
+ unsigned short /*updatePercentage*/)
+{
+ // Remember the position where we pass in the ofstream pointer
+ // so we can return there to write close() information.
+ //
+ m_chunkStartPosition = file->tellp();
+
+ return false;
+}
+
+// Build up a header string and then pump it out to the file handle
+//
+void
+PeakFile::writeHeader(std::ofstream *file)
+{
+ if (!file || !(*file))
+ return ;
+
+ std::string header;
+
+ // The "levl" identifer for this chunk
+ //
+ header += AUDIO_BWF_PEAK_ID;
+
+ // Add a four byte version of the size of the header chunk (120
+ // bytes from this point onwards)
+ //
+ header += getLittleEndianFromInteger(120, 4);
+
+ // A four byte version number (incremented every time)
+ //
+ header += getLittleEndianFromInteger(++m_version, 4);
+
+ // Format of the peak points - 1 = unsigned char
+ // 2 = unsigned short
+ //
+ header += getLittleEndianFromInteger(m_format, 4);
+
+ // Points per value - 1 = 1 peak and has vertical about x-axis
+ // 2 = 2 peaks so differs above and below x-axis
+ //
+ // .. hardcode to 2 for the mo
+ m_pointsPerValue = 2;
+ header += getLittleEndianFromInteger(m_pointsPerValue, 4);
+
+ // Block size - default and recommended is 256
+ //
+ header += getLittleEndianFromInteger(m_blockSize, 4);
+
+ // Set channels up if they're currently empty
+ //
+ if (m_channels == 0 && m_audioFile)
+ m_channels = m_audioFile->getChannels();
+
+ // Peak channels - same as AudioFile channels
+ //
+ header += getLittleEndianFromInteger(m_channels, 4);
+
+ // Number of peak frames - we write this at close() and so
+ // for the moment put spacing 0's in.
+ header += getLittleEndianFromInteger(0, 4);
+
+ // Position of peak of peaks - written at close()
+ //
+ header += getLittleEndianFromInteger(0, 4);
+
+ // Offset to start of peaks - usually the total size of this header
+ //
+ header += getLittleEndianFromInteger(128, 4);
+
+ // Creation timestamp - fill in on close() so just use spacing
+ // of 28 bytes for the moment.
+ //
+ header += getLittleEndianFromInteger(0, 28);
+
+ // reserved space - 60 bytes
+ header += getLittleEndianFromInteger(0, 60);
+
+ //cout << "HEADER LENGTH = " << header.length() << endl;
+
+ // write out the header
+ //
+ putBytes(file, header);
+}
+
+bool
+PeakFile::scanToPeak(int peak)
+{
+ if (!m_inFile)
+ return false;
+
+ if (!m_inFile->is_open())
+ return false;
+
+ // Scan to start of chunk and then seek to peak number
+ //
+ ssize_t pos = (ssize_t)m_chunkStartPosition + 128 +
+ peak * m_format * m_channels * m_pointsPerValue;
+
+ ssize_t off = pos - m_inFile->tellg();
+
+ if (off == 0) {
+ return true;
+ } else if (off < 0) {
+ // std::cerr << "PeakFile::scanToPeak: warning: seeking backwards for peak " << peak << " (" << m_inFile->tellg() << " -> " << pos << ")" << std::endl;
+ m_inFile->seekg(pos);
+ } else {
+ m_inFile->seekg(off, std::ios::cur);
+ }
+
+ // Ensure we re-read the input buffer if we're
+ // doing buffered reads as it's now meaningless
+ //
+ m_loseBuffer = true;
+
+ if (m_inFile->eof()) {
+ m_inFile->clear();
+ return false;
+ }
+
+ return true;
+}
+
+bool
+PeakFile::scanForward(int numberOfPeaks)
+{
+ if (!m_inFile)
+ return false;
+
+ if (!m_inFile->is_open())
+ return false;
+
+ // Seek forward and number of peaks
+ //
+ m_inFile->seekg(numberOfPeaks * m_format * m_channels * m_pointsPerValue,
+ std::ios::cur);
+
+ // Ensure we re-read the input buffer
+ m_loseBuffer = true;
+
+ if (m_inFile->eof()) {
+ m_inFile->clear();
+ return false;
+ }
+
+ return true;
+}
+
+
+void
+PeakFile::writePeaks(unsigned short /*updatePercentage*/,
+ std::ofstream *file)
+{
+ if (!file || !(*file))
+ return ;
+ m_keepProcessing = true;
+
+#ifdef DEBUG_PEAKFILE
+
+ cout << "PeakFile::writePeaks - calculating peaks" << endl;
+#endif
+
+ // Scan to beginning of audio data
+ m_audioFile->scanTo(RealTime(0, 0));
+
+ // Store our samples
+ //
+ std::vector<std::pair<int, int> > channelPeaks;
+ std::string samples;
+ unsigned char *samplePtr;
+
+ int sampleValue;
+ int sampleMax = 0 ;
+ int sampleFrameCount = 0;
+
+ int channels = m_audioFile->getChannels();
+ int bytes = m_audioFile->getBitsPerSample() / 8;
+
+ m_format = bytes;
+ if (bytes == 3 || bytes == 4) // 24-bit PCM or 32-bit float
+ m_format = 2; // write 16-bit PCM instead
+
+ // for the progress dialog
+ unsigned int apprxTotalBytes = m_audioFile->getSize();
+ unsigned int byteCount = 0;
+
+ for (int i = 0; i < channels; i++)
+ channelPeaks.push_back(std::pair<int, int>());
+
+ // clear down info
+ m_numberOfPeaks = 0;
+ m_bodyBytes = 0;
+ m_positionPeakOfPeaks = 0;
+
+ while (m_keepProcessing) {
+ try {
+ samples = m_audioFile->
+ getBytes(m_blockSize * channels * bytes);
+ } catch (BadSoundFileException e) {
+ std::cerr << "PeakFile::writePeaks: " << e.getMessage()
+ << std::endl;
+ break;
+ }
+
+ // If no bytes or less than the total number of bytes are returned
+ // then break out
+ //
+ if (samples.length() == 0 ||
+ samples.length() < (m_blockSize * m_audioFile->getChannels()
+ * bytes))
+ break;
+
+ byteCount += samples.length();
+
+ emit setProgress((int)(double(byteCount) /
+ double(apprxTotalBytes) * 100.0));
+ kapp->processEvents();
+
+ samplePtr = (unsigned char *)samples.c_str();
+
+ for (int i = 0; i < m_blockSize; i++) {
+ for (unsigned int ch = 0; ch < m_audioFile->getChannels(); ch++) {
+ // Single byte format values range from 0-255 and then
+ // shifted down about the x-axis. Double byte and above
+ // are already centred about x-axis.
+ //
+ if (bytes == 1) {
+ // get value
+ sampleValue = int(*samplePtr) - 128;
+ samplePtr++;
+ } else if (bytes == 2) {
+ unsigned char b2 = samplePtr[0];
+ unsigned char b1 = samplePtr[1];
+ unsigned int bits = (b1 << 8) + b2;
+ sampleValue = (short)bits;
+ samplePtr += 2;
+ } else if (bytes == 3) {
+ unsigned char b3 = samplePtr[0];
+ unsigned char b2 = samplePtr[1];
+ unsigned char b1 = samplePtr[2];
+ unsigned int bits = (b1 << 24) + (b2 << 16) + (b3 << 8);
+
+ // write out as 16-bit (m_format == 2)
+ sampleValue = int(bits) / 65536;
+
+ samplePtr += 3;
+ } else if (bytes == 4) // IEEE float (enforced by RIFFAudioFile)
+ {
+ // write out as 16-bit (m_format == 2)
+ float val = *(float *)samplePtr;
+ sampleValue = (int)(32767.0 * val);
+ samplePtr += 4;
+ } else {
+ throw(BadSoundFileException(m_fileName, "PeakFile::writePeaks - unsupported bit depth"));
+ }
+
+ // First time for each channel
+ //
+ if (i == 0) {
+ channelPeaks[ch].first = sampleValue;
+ channelPeaks[ch].second = sampleValue;
+ } else {
+ // Compare and store
+ //
+ if (sampleValue > channelPeaks[ch].first)
+ channelPeaks[ch].first = sampleValue;
+
+ if (sampleValue < channelPeaks[ch].second)
+ channelPeaks[ch].second = sampleValue;
+ }
+
+ // Store peak of peaks if it fits
+ //
+ if (abs(sampleValue) > sampleMax) {
+ sampleMax = abs(sampleValue);
+ m_positionPeakOfPeaks = sampleFrameCount;
+ }
+ }
+
+ // for peak of peaks as well as frame count
+ sampleFrameCount++;
+ }
+
+ // Write absolute peak data in channel order
+ //
+ for (unsigned int i = 0; i < m_audioFile->getChannels(); i++) {
+ putBytes(file, getLittleEndianFromInteger(channelPeaks[i].first,
+ m_format));
+ putBytes(file, getLittleEndianFromInteger(channelPeaks[i].second,
+ m_format));
+ m_bodyBytes += m_format * 2;
+ }
+
+ // increment number of peak frames
+ m_numberOfPeaks++;
+ }
+
+#ifdef DEBUG_PEAKFILE
+ cout << "PeakFile::writePeaks - "
+ << "completed peaks" << endl;
+#endif
+
+}
+
+// Get a normalised vector for the preview at a given horizontal resolution.
+// We return a value for each channel and if returnLow is set we also return
+// an interleaved low value for each channel.
+//
+//
+std::vector<float>
+PeakFile::getPreview(const RealTime &startTime,
+ const RealTime &endTime,
+ int width,
+ bool showMinima)
+{
+#ifdef DEBUG_PEAKFILE_BRIEF
+ std::cout << "PeakFile::getPreview - "
+ << "startTime = " << startTime
+ << ", endTime = " << endTime
+ << ", width = " << width
+ << ", showMinima = " << showMinima << std::endl;
+#endif
+
+ if (getSize() == 0) {
+ std::cout << "PeakFile::getPreview - PeakFile size == 0" << std::endl;
+ return std::vector<float>();
+ }
+
+ // Regenerate cache on these conditions
+ //
+ if (!m_peakCache.length()) {
+#ifdef DEBUG_PEAKFILE_CACHE
+ std::cerr << "PeakFile::getPreview - no peak cache" << std::endl;
+#endif
+
+ if (getSize() < (256 *1024)) // if less than 256K PeakFile
+ {
+ // Scan to start of peak data
+ scanToPeak(0);
+ try
+ {
+ m_peakCache = getBytes(m_inFile, getSize() - 128);
+ } catch (BadSoundFileException e)
+ {
+ std::cerr << "PeakFile::getPreview: " << e.getMessage()
+ << std::endl;
+ }
+
+#ifdef DEBUG_PEAKFILE_CACHE
+ std::cout << "PeakFile::getPreview - generated peak cache - "
+ << "size = " << m_peakCache.length() << std::endl;
+#endif
+
+ } else {
+#ifdef DEBUG_PEAKFILE_CACHE
+ std::cout << "PeakFile::getPreview - file size = " << getSize()
+ << ", not generating cache" << std::endl;
+#endif
+
+ }
+ }
+
+ // Check to see if we hit the "lastPreview" cache by comparing the last
+ // query parameters we used.
+ //
+ if (startTime == m_lastPreviewStartTime && endTime == m_lastPreviewEndTime
+ && width == m_lastPreviewWidth && showMinima == m_lastPreviewShowMinima) {
+#ifdef DEBUG_PEAKFILE_CACHE
+ std::cout << "PeakFile::getPreview - hit last preview cache" << std::endl;
+#endif
+
+ return m_lastPreviewCache;
+ } else {
+#ifdef DEBUG_PEAKFILE_CACHE
+ std::cout << "PeakFile::getPreview - last preview " << m_lastPreviewStartTime
+ << " -> " << m_lastPreviewEndTime << ", w " << m_lastPreviewWidth << "; this " << startTime << " -> " << endTime << ", w " << width << std::endl;
+#endif
+
+ }
+
+ // Clear the cache - we need to regenerate it
+ //
+ m_lastPreviewCache.clear();
+
+ int startPeak = getPeak(startTime);
+ int endPeak = getPeak(endTime);
+
+ // Sanity check
+ if (startPeak > endPeak)
+ return m_lastPreviewCache;
+
+ // Actual possible sample length in RealTime
+ //
+ double step = double(endPeak - startPeak) / double(width);
+ std::string peakData;
+ int peakNumber;
+
+#ifdef DEBUG_PEAKFILE_BRIEF
+
+ std::cout << "PeakFile::getPreview - getting preview for \""
+ << m_audioFile->getFilename() << "\"" << endl;
+#endif
+
+ // Get a divisor
+ //
+ float divisor = 0.0f;
+ switch (m_format) {
+ case 1:
+ divisor = SAMPLE_MAX_8BIT;
+ break;
+
+ case 2:
+ divisor = SAMPLE_MAX_16BIT;
+ break;
+
+ default:
+#ifdef DEBUG_PEAKFILE_BRIEF
+
+ std::cout << "PeakFile::getPreview - "
+ << "unsupported peak length format (" << m_format << ")"
+ << endl;
+#endif
+
+ return m_lastPreviewCache;
+ }
+
+ float *hiValues = new float[m_channels];
+ float *loValues = new float[m_channels];
+
+ for (int i = 0; i < width; i++) {
+
+ peakNumber = startPeak + int(double(i) * step);
+ int nextPeakNumber = startPeak + int(double(i + 1) * step);
+
+ // Seek to value
+ //
+ if (!m_peakCache.length()) {
+
+ if (scanToPeak(peakNumber) == false) {
+#ifdef DEBUG_PEAKFILE
+ std::cout << "PeakFile::getPreview: scanToPeak(" << peakNumber << ") failed" << std::endl;
+#endif
+
+ m_lastPreviewCache.push_back(0.0f);
+ }
+ }
+#ifdef DEBUG_PEAKFILE
+ std::cout << "PeakFile::getPreview: step is " << step << ", format * pointsPerValue * chans is " << (m_format * m_pointsPerValue * m_channels) << std::endl;
+ std::cout << "i = " << i << ", peakNumber = " << peakNumber << ", nextPeakNumber = " << nextPeakNumber << std::endl;
+#endif
+
+ for (int ch = 0; ch < m_channels; ch++) {
+ hiValues[ch] = 0.0f;
+ loValues[ch] = 0.0f;
+ }
+
+ // Get peak value over channels
+ //
+ for (int k = 0; peakNumber < nextPeakNumber; ++k) {
+
+ for (int ch = 0; ch < m_channels; ch++) {
+
+ if (!m_peakCache.length()) {
+
+ try {
+ peakData = getBytes(m_inFile, m_format * m_pointsPerValue);
+ } catch (BadSoundFileException e) {
+ // Problem with the get - probably an EOF
+ // return the results so far.
+ //
+#ifdef DEBUG_PEAKFILE
+ std::cout << "PeakFile::getPreview - \"" << e.getMessage() << "\"\n"
+ << endl;
+#endif
+
+ goto done;
+ }
+#ifdef DEBUG_PEAKFILE
+ std::cout << "PeakFile::getPreview - "
+ << "read from file" << std::endl;
+#endif
+
+ } else {
+
+ int valueNum = peakNumber * m_channels + ch;
+ int charNum = valueNum * m_format * m_pointsPerValue;
+ int charLength = m_format * m_pointsPerValue;
+
+ // Get peak value from the cached string if
+ // the value is valid.
+ //
+ if (charNum + charLength <= m_peakCache.length()) {
+ peakData = m_peakCache.substr(charNum, charLength);
+#ifdef DEBUG_PEAKFILE
+
+ std::cout << "PeakFile::getPreview - "
+ << "hit peakCache" << std::endl;
+#endif
+
+ }
+ }
+
+
+ if (peakData.length() != (unsigned int)(m_format *
+ m_pointsPerValue)) {
+ // We didn't get the whole peak block - return what
+ // we've got so far
+ //
+#ifdef DEBUG_PEAKFILE
+ std::cout << "PeakFile::getPreview - "
+ << "failed to get complete peak block"
+ << endl;
+#endif
+
+ goto done;
+ }
+
+ int intDivisor = int(divisor);
+ int inValue =
+ getIntegerFromLittleEndian(peakData.substr(0, m_format));
+
+ while (inValue > intDivisor) {
+ inValue -= (1 << (m_format * 8));
+ }
+
+#ifdef DEBUG_PEAKFILE
+ std::cout << "found potential hivalue " << inValue << std::endl;
+#endif
+
+ if (k == 0 || inValue > hiValues[ch]) {
+ hiValues[ch] = float(inValue);
+ }
+
+ if (m_pointsPerValue == 2) {
+
+ inValue =
+ getIntegerFromLittleEndian(
+ peakData.substr(m_format, m_format));
+
+ while (inValue > intDivisor) {
+ inValue -= (1 << (m_format * 8));
+ }
+
+ if (k == 0 || inValue < loValues[ch]) {
+ loValues[ch] = inValue;
+ }
+ }
+ }
+
+ ++peakNumber;
+ }
+
+ for (int ch = 0; ch < m_channels; ++ch) {
+
+ float value = hiValues[ch] / divisor;
+
+#ifdef DEBUG_PEAKFILE_BRIEF
+
+ std::cout << "VALUE = " << hiValues[ch] / divisor << std::endl;
+#endif
+
+ if (showMinima) {
+ m_lastPreviewCache.push_back(loValues[ch] / divisor);
+ } else {
+ value = fabs(value);
+ if (m_pointsPerValue == 2) {
+ value = std::max(value, fabsf(loValues[ch] / divisor));
+ }
+ m_lastPreviewCache.push_back(value);
+ }
+ }
+ }
+
+done:
+ resetStream();
+ delete[] hiValues;
+ delete[] loValues;
+
+ // We have a good preview in the cache so store our parameters
+ //
+ m_lastPreviewStartTime = startTime;
+ m_lastPreviewEndTime = endTime;
+ m_lastPreviewWidth = width;
+ m_lastPreviewShowMinima = showMinima;
+
+#ifdef DEBUG_PEAKFILE_BRIEF
+
+ std::cout << "Returning " << m_lastPreviewCache.size() << " items" << std::endl;
+#endif
+
+ return m_lastPreviewCache;
+}
+
+int
+PeakFile::getPeak(const RealTime &time)
+{
+ double frames = ((time.sec * 1000000.0) + time.usec()) *
+ m_audioFile->getSampleRate() / 1000000.0;
+ return int(frames / double(m_blockSize));
+}
+
+RealTime
+PeakFile::getTime(int peak)
+{
+ int usecs = int((double)peak * (double)m_blockSize *
+ double(1000000.0) / double(m_audioFile->getSampleRate()));
+ return RealTime(usecs / 1000000, (usecs % 1000000) * 1000);
+}
+
+// Get pairs of split points for areas that exceed a percentage
+// threshold
+//
+std::vector<SplitPointPair>
+PeakFile::getSplitPoints(const RealTime &startTime,
+ const RealTime &endTime,
+ int threshold,
+ const RealTime &minLength)
+{
+ std::vector<SplitPointPair> points;
+ std::string peakData;
+
+ int startPeak = getPeak(startTime);
+ int endPeak = getPeak(endTime);
+
+ if (endPeak < startPeak)
+ return std::vector<SplitPointPair>();
+
+ scanToPeak(startPeak);
+
+ float divisor = 0.0f;
+ switch (m_format) {
+ case 1:
+ divisor = SAMPLE_MAX_8BIT;
+ break;
+
+ case 2:
+ divisor = SAMPLE_MAX_16BIT;
+ break;
+
+ default:
+ return points;
+ }
+
+ float value;
+ float fThreshold = float(threshold) / 100.0;
+ bool belowThreshold = true;
+ RealTime startSplit = RealTime::zeroTime;
+ bool inSplit = false;
+
+ for (int i = startPeak; i < endPeak; i++) {
+ value = 0.0;
+
+ for (int ch = 0; ch < m_channels; ch++) {
+ try {
+ peakData = getBytes(m_inFile, m_format * m_pointsPerValue);
+ } catch (BadSoundFileException e) {
+ std::cerr << "PeakFile::getSplitPoints: "
+ << e.getMessage() << std::endl;
+ break;
+ }
+
+ if (peakData.length() == (unsigned int)(m_format *
+ m_pointsPerValue)) {
+ int peakValue =
+ getIntegerFromLittleEndian(peakData.substr(0, m_format));
+
+ value += fabs(float(peakValue) / divisor);
+ }
+ }
+
+ value /= float(m_channels);
+
+ if (belowThreshold) {
+ if (value > fThreshold) {
+ startSplit = getTime(i);
+ inSplit = true;
+ belowThreshold = false;
+ }
+ } else {
+ if (value < fThreshold && getTime(i) - startSplit > minLength) {
+ // insert values
+ if (inSplit) {
+ points.push_back(SplitPointPair(startSplit, getTime(i)));
+ }
+ inSplit = false;
+ belowThreshold = true;
+ }
+ }
+ }
+
+ // if we've got a split point open the close it
+ if (inSplit) {
+ points.push_back(SplitPointPair(startSplit,
+ getTime(endPeak)));
+ }
+
+ return points;
+}
+
+
+}
+
+
+#include "PeakFile.moc"
diff --git a/src/sound/PeakFile.h b/src/sound/PeakFile.h
new file mode 100644
index 0000000..26ef71c
--- /dev/null
+++ b/src/sound/PeakFile.h
@@ -0,0 +1,196 @@
+// -*- c-indentation-style:"stroustrup" c-basic-offset: 4 -*- /*
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include <vector>
+
+#include <qobject.h>
+#include <qdatetime.h>
+
+#include "SoundFile.h"
+#include "RealTime.h"
+
+#ifndef _PEAKFILE_H_
+#define _PEAKFILE_H_
+
+// A PeakFile is generated to the BWF Supplement 3 Peak Envelope Chunk
+// format as defined here:
+//
+// http://www.ebu.ch/pmc_bwf.html
+//
+// To comply with BWF format files this chunk can be embedded into
+// the sample file itself (writeToHandle()) or used to generate an
+// external peak file (write()). At the moment the only type of file
+// with an embedded peak chunk is the BWF file itself.
+//
+//
+
+
+
+namespace Rosegarden
+{
+
+class AudioFile;
+
+
+typedef std::pair<RealTime, RealTime> SplitPointPair;
+
+class PeakFile : public QObject, public SoundFile
+{
+ Q_OBJECT
+
+public:
+ PeakFile(AudioFile *audioFile);
+ virtual ~PeakFile();
+
+ // Copy constructor
+ //
+ PeakFile(const PeakFile &);
+
+ // Standard file methods
+ //
+ virtual bool open();
+ virtual void close();
+
+ // Write to standard peak file
+ //
+ virtual bool write();
+
+ // Write the file, emit progress signal and process app events
+ //
+ virtual bool write(unsigned short updatePercentage);
+
+ // Write peak chunk to file handle (BWF)
+ //
+ bool writeToHandle(std::ofstream *file, unsigned short updatePercentage);
+
+ // Is the peak file valid and up to date?
+ //
+ bool isValid();
+
+ // Vital file stats
+ //
+ void printStats();
+
+ // Get a preview of a section of the audio file where that section
+ // is "width" pixels.
+ //
+ std::vector<float> getPreview(const RealTime &startTime,
+ const RealTime &endTime,
+ int width,
+ bool showMinima);
+
+ AudioFile* getAudioFile() { return m_audioFile; }
+ const AudioFile* getAudioFile() const { return m_audioFile; }
+
+ // Scan to a peak and scan forward a number of peaks
+ //
+ bool scanToPeak(int peak);
+ bool scanForward(int numberOfPeaks);
+
+ // Find threshold crossing points
+ //
+ std::vector<SplitPointPair> getSplitPoints(const RealTime &startTime,
+ const RealTime &endTime,
+ int threshold,
+ const RealTime &minLength);
+ // Accessors
+ //
+ int getVersion() const { return m_version; }
+ int getFormat() const { return m_format; }
+ int getPointsPerValue() const { return m_pointsPerValue; }
+ int getBlockSize() const { return m_blockSize; }
+ int getChannels() const { return m_channels; }
+ int getNumberOfPeaks() const { return m_numberOfPeaks; }
+ int getPositionPeakOfPeaks() const { return m_positionPeakOfPeaks; }
+ int getOffsetToPeaks() const { return m_offsetToPeaks; }
+ int getBodyBytes() const { return m_bodyBytes; }
+ QDateTime getModificationTime() const { return m_modificationTime; }
+ std::streampos getChunkStartPosition() const
+ { return m_chunkStartPosition; }
+
+ bool isProcessingPeaks() const { return m_keepProcessing; }
+ void setProcessingPeaks(bool value) { m_keepProcessing = value; }
+
+signals:
+ void setProgress(int);
+
+protected:
+ // Write the peak header and the peaks themselves
+ //
+ void writeHeader(std::ofstream *file);
+ void writePeaks(unsigned short updatePercentage,
+ std::ofstream *file);
+
+ // Get the position of a peak for a given time
+ //
+ int getPeak(const RealTime &time);
+
+ // And the time of a peak
+ //
+ RealTime getTime(int peak);
+
+ // Parse the header
+ //
+ void parseHeader();
+
+ AudioFile *m_audioFile;
+
+ // Some Peak Envelope Chunk parameters
+ //
+ int m_version;
+ int m_format; // bytes in peak value (1 or 2)
+ int m_pointsPerValue;
+ int m_blockSize;
+ int m_channels;
+ int m_numberOfPeaks;
+ int m_positionPeakOfPeaks;
+ int m_offsetToPeaks;
+ int m_bodyBytes;
+
+ // Peak timestamp
+ //
+ QDateTime m_modificationTime;
+
+ std::streampos m_chunkStartPosition;
+
+ // For cacheing of peak information in memory we use the last query
+ // parameters as our key to the cached data.
+ //
+ RealTime m_lastPreviewStartTime;
+ RealTime m_lastPreviewEndTime;
+ int m_lastPreviewWidth;
+ bool m_lastPreviewShowMinima;
+ std::vector<float> m_lastPreviewCache;
+
+ // Do we actually want to keep processing this peakfile?
+ // In case we get a cancel.
+ //
+ bool m_keepProcessing;
+
+ std::string m_peakCache;
+
+};
+
+}
+
+
+#endif // _PEAKFILE_H_
+
+
diff --git a/src/sound/PeakFileManager.cpp b/src/sound/PeakFileManager.cpp
new file mode 100644
index 0000000..10293e6
--- /dev/null
+++ b/src/sound/PeakFileManager.cpp
@@ -0,0 +1,327 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+// Accepts a file handle positioned somewhere in sample data (could
+// be at the start) along with the necessary meta information for
+// decoding (channels, bits per sample) and turns the sample data
+// into peak data and generates a BWF format peak chunk file. This
+// file can exist by itself (in the case this is being generated
+// by a WAV) or be accomodated inside a BWF format file.
+//
+//
+
+#include <string>
+#include <vector>
+
+#include <qobject.h>
+
+#include "PeakFileManager.h"
+#include "AudioFile.h"
+#include "RealTime.h"
+#include "PeakFile.h"
+
+namespace Rosegarden
+{
+
+
+PeakFileManager::PeakFileManager():
+ m_updatePercentage(0),
+ m_currentPeakFile(0)
+{}
+
+PeakFileManager::~PeakFileManager()
+{}
+
+// Inserts PeakFile based on AudioFile if it doesn't already exist
+bool
+PeakFileManager::insertAudioFile(AudioFile *audioFile)
+{
+ std::vector<PeakFile*>::iterator it;
+
+ for (it = m_peakFiles.begin(); it != m_peakFiles.end(); it++) {
+ if ((*it)->getAudioFile()->getId() == audioFile->getId())
+ return false;
+ }
+
+ /*
+ std::cout << "PeakFileManager::insertAudioFile - creating peak file "
+ << m_peakFiles.size() + 1
+ << " for \"" << audioFile->getFilename()
+ << "\"" << std::endl;
+ */
+
+ // Insert
+ m_peakFiles.push_back(new PeakFile(audioFile));
+
+ return true;
+}
+
+// Removes peak file from PeakFileManager - doesn't affect audioFile
+//
+bool
+PeakFileManager::removeAudioFile(AudioFile *audioFile)
+{
+ std::vector<PeakFile*>::iterator it;
+
+ for (it = m_peakFiles.begin(); it != m_peakFiles.end(); it++) {
+ if ((*it)->getAudioFile()->getId() == audioFile->getId()) {
+ if (m_currentPeakFile == *it)
+ m_currentPeakFile = 0;
+ delete *it;
+ m_peakFiles.erase(it);
+ return true;
+ }
+ }
+
+ return false;
+}
+
+// Auto-insert PeakFile into manager if it doesn't already exist
+//
+PeakFile*
+PeakFileManager::getPeakFile(AudioFile *audioFile)
+{
+ std::vector<PeakFile*>::iterator it;
+ PeakFile *ptr = 0;
+
+ while (ptr == 0) {
+ for (it = m_peakFiles.begin(); it != m_peakFiles.end(); it++)
+ if ((*it)->getAudioFile()->getId() == audioFile->getId())
+ ptr = *it;
+
+ // If nothing is found then insert and retry
+ //
+ if (ptr == 0) {
+ // Insert - if we fail we return as empty
+ //
+ if (insertAudioFile(audioFile) == false)
+ return 0;
+ }
+ }
+
+ return ptr;
+}
+
+
+// Does a given AudioFile have a valid peak file or peak chunk?
+//
+bool
+PeakFileManager::hasValidPeaks(AudioFile *audioFile)
+{
+ if (audioFile->getType() == WAV) {
+ // Check external peak file
+ PeakFile *peakFile = getPeakFile(audioFile);
+
+ if (peakFile == 0) {
+#ifdef DEBUG_PEAKFILEMANAGER
+ std::cerr << "PeakFileManager::hasValidPeaks - no peak file found"
+ << std::endl;
+#endif
+
+ return false;
+ }
+ // If it doesn't open and parse correctly
+ if (peakFile->open() == false)
+ return false;
+
+ // or if the data is old or invalid
+ if (peakFile->isValid() == false)
+ return false;
+
+ } else if (audioFile->getType() == BWF) {
+ // check internal peak chunk
+ } else {
+#ifdef DEBUG_PEAKFILEMANAGER
+ std::cout << "PeakFileManager::hasValidPeaks - unsupported file type"
+ << std::endl;
+#endif
+
+ return false;
+ }
+
+ return true;
+
+}
+
+// Generate the peak file. Checks to see if peak file exists
+// already and if so if it's up to date. If it isn't then we
+// regenerate.
+//
+void
+PeakFileManager::generatePeaks(AudioFile *audioFile,
+ unsigned short updatePercentage)
+{
+#ifdef DEBUG_PEAKFILEMANAGER
+ std::cout << "PeakFileManager::generatePeaks - generating peaks for \""
+ << audioFile->getFilename() << "\"" << std::endl;
+#endif
+
+ if (audioFile->getType() == WAV) {
+ m_currentPeakFile = getPeakFile(audioFile);
+
+ QObject::connect(m_currentPeakFile, SIGNAL(setProgress(int)),
+ this, SIGNAL(setProgress(int)));
+
+ // Just write out a peak file
+ //
+ if (m_currentPeakFile->write(updatePercentage) == false) {
+ std::cerr << "Can't write peak file for " << audioFile->getFilename() << " - no preview generated" << std::endl;
+ throw BadPeakFileException
+ (audioFile->getFilename(), __FILE__, __LINE__);
+ }
+
+ // The m_currentPeakFile might have been cancelled (see stopPreview())
+ //
+ if (m_currentPeakFile) {
+ // close writes out important things
+ m_currentPeakFile->close();
+ m_currentPeakFile->disconnect();
+ }
+ } else if (audioFile->getType() == BWF) {
+ // write the file out and incorporate the peak chunk
+ } else {
+#ifdef DEBUG_PEAKFILEMANAGER
+ std::cerr << "PeakFileManager::generatePeaks - unsupported file type"
+ << std::endl;
+#endif
+
+ return ;
+ }
+
+ m_currentPeakFile = 0;
+
+}
+
+std::vector<float>
+PeakFileManager::getPreview(AudioFile *audioFile,
+ const RealTime &startTime,
+ const RealTime &endTime,
+ int width,
+ bool showMinima)
+{
+ std::vector<float> rV;
+
+ // If we've got no channels then the audio file hasn't
+ // completed (recording) - so don't generate a preview
+ //
+ if (audioFile->getChannels() == 0)
+ return rV;
+
+ if (audioFile->getType() == WAV) {
+ PeakFile *peakFile = getPeakFile(audioFile);
+
+ // just write out a peak file
+ try {
+ peakFile->open();
+ rV = peakFile->getPreview(startTime,
+ endTime,
+ width,
+ showMinima);
+ } catch (SoundFile::BadSoundFileException e) {
+#ifdef DEBUG_PEAKFILEMANAGER
+ std::cout << "PeakFileManager::getPreview "
+ << "\"" << e << "\"" << std::endl;
+#else
+
+ ;
+#endif
+
+ throw BadPeakFileException(e);
+ }
+ } else if (audioFile->getType() == BWF) {
+ // write the file out and incorporate the peak chunk
+ }
+#ifdef DEBUG_PEAKFILEMANAGER
+ else {
+ std::cerr << "PeakFileManager::getPreview - unsupported file type"
+ << std::endl;
+ }
+#endif
+
+ return rV;
+}
+
+void
+PeakFileManager::clear()
+{
+ std::vector<PeakFile*>::iterator it;
+
+ for (it = m_peakFiles.begin(); it != m_peakFiles.end(); it++)
+ delete (*it);
+
+ m_peakFiles.erase(m_peakFiles.begin(), m_peakFiles.end());
+
+ m_currentPeakFile = 0;
+}
+
+
+std::vector<SplitPointPair>
+PeakFileManager::getSplitPoints(AudioFile *audioFile,
+ const RealTime &startTime,
+ const RealTime &endTime,
+ int threshold,
+ const RealTime &minTime)
+{
+ PeakFile *peakFile = getPeakFile(audioFile);
+
+ if (peakFile == 0)
+ return std::vector<SplitPointPair>();
+
+ return peakFile->getSplitPoints(startTime,
+ endTime,
+ threshold,
+ minTime);
+
+}
+
+void
+PeakFileManager::stopPreview()
+{
+ if (m_currentPeakFile) {
+ // Stop processing
+ //
+ QString fileName = QString(m_currentPeakFile->getFilename().data());
+ m_currentPeakFile->setProcessingPeaks(false);
+ m_currentPeakFile->disconnect();
+
+ QFile file(fileName);
+ bool removed = file.remove();
+
+#ifdef DEBUG_PEAKFILEMANAGER
+
+ if (removed) {
+ std::cout << "PeakFileManager::stopPreview() - removed preview"
+ << std::endl;
+ }
+#endif
+ //delete m_currentPeakFile;
+ m_currentPeakFile = 0;
+ }
+}
+
+
+
+
+}
+
+
+#include "PeakFileManager.moc"
diff --git a/src/sound/PeakFileManager.h b/src/sound/PeakFileManager.h
new file mode 100644
index 0000000..07ff704
--- /dev/null
+++ b/src/sound/PeakFileManager.h
@@ -0,0 +1,162 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+// Accepts an AudioFIle and turns the sample data into peak data for
+// storage in a peak file or a BWF format peak chunk. Pixmaps or
+// sample data is returned to callers on demand using these cached
+// values.
+//
+//
+
+#ifndef _PEAKFILEMANAGER_H_
+#define _PEAKFILEMANAGER_H_
+
+#include <string>
+#include <iostream>
+#include <fstream>
+#include <vector>
+
+#include <qobject.h>
+
+
+#include "PeakFile.h"
+
+namespace Rosegarden
+{
+
+class AudioFile;
+class RealTime;
+
+class PeakFileManager : public QObject
+{
+ Q_OBJECT
+public:
+ // updatePercentage tells this object how often to throw a
+ // percentage complete message - active between 0-100 only
+ // if it's set to 5 then we send an update exception every
+ // five percent. The percentage complete is sent with
+ // each exception.
+ //
+ PeakFileManager();
+ virtual ~PeakFileManager();
+
+ class BadPeakFileException : public Exception
+ {
+ public:
+ BadPeakFileException(std::string path) :
+ Exception("Bad peak file " + path), m_path(path) { }
+ BadPeakFileException(std::string path, std::string file, int line) :
+ Exception("Bad peak file " + path, file, line), m_path(path) { }
+ BadPeakFileException(const SoundFile::BadSoundFileException &e) :
+ Exception("Bad peak file (malformed audio?) " + e.getPath()), m_path(e.getPath()) { }
+
+ ~BadPeakFileException() throw() { }
+
+ std::string getPath() const { return m_path; }
+
+ private:
+ std::string m_path;
+ };
+
+private:
+ PeakFileManager(const PeakFileManager &pFM);
+ PeakFileManager& operator=(const PeakFileManager &);
+
+public:
+ // Check that a given audio file has a valid and up to date
+ // peak file or peak chunk.
+ //
+ bool hasValidPeaks(AudioFile *audioFile);
+ // throw BadSoundFileException, BadPeakFileException
+
+ // Generate a peak file from file details - if the peak file already
+ // exists _and_ it's up to date then we don't do anything. For BWF
+ // files we generate an internal peak chunk.
+ //
+ //
+ void generatePeaks(AudioFile *audioFile,
+ unsigned short updatePercentage);
+ // throw BadSoundFileException, BadPeakFileException
+
+ // Get a vector of floats as the preview
+ //
+ std::vector<float> getPreview(AudioFile *audioFile,
+ const RealTime &startTime,
+ const RealTime &endTime,
+ int width,
+ bool showMinima);
+ // throw BadSoundFileException, BadPeakFileException
+
+ // Remove cache for a single audio file (if audio file to be deleted etc)
+ //
+ bool removeAudioFile(AudioFile *audioFile);
+
+ // Clear down
+ //
+ void clear();
+
+ // Get split points for a peak file
+ //
+ std::vector<SplitPointPair>
+ getSplitPoints(AudioFile *audioFile,
+ const RealTime &startTime,
+ const RealTime &endTime,
+ int threshold,
+ const RealTime &minTime);
+
+ std::vector<PeakFile*>::const_iterator begin() const
+ { return m_peakFiles.begin(); }
+
+ std::vector<PeakFile*>::const_iterator end() const
+ { return m_peakFiles.end(); }
+
+ // Stop a preview during its build
+ //
+ void stopPreview();
+
+signals:
+ void setProgress(int);
+
+protected:
+
+ // Add and remove from our PeakFile cache
+ //
+ bool insertAudioFile(AudioFile *audioFile);
+ PeakFile* getPeakFile(AudioFile *audioFile);
+
+ std::vector<PeakFile*> m_peakFiles;
+ unsigned short m_updatePercentage; // how often we send updates
+
+ // Whilst processing - the current PeakFile
+ //
+ PeakFile *m_currentPeakFile;
+
+
+};
+
+
+}
+
+
+#endif // _PEAKFILEMANAGER_H_
+
+
diff --git a/src/sound/PlayableAudioFile.cpp b/src/sound/PlayableAudioFile.cpp
new file mode 100644
index 0000000..b5ddcf7
--- /dev/null
+++ b/src/sound/PlayableAudioFile.cpp
@@ -0,0 +1,1086 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include "PlayableAudioFile.h"
+#include <cassert>
+
+namespace Rosegarden
+{
+
+//#define DEBUG_RING_BUFFER_POOL 1
+//#define DEBUG_PLAYABLE 1
+//#define DEBUG_PLAYABLE_READ 1
+
+class RingBufferPool
+{
+public:
+ typedef float sample_t;
+
+ RingBufferPool(size_t bufferSize);
+ virtual ~RingBufferPool();
+
+ /**
+ * Set the default size for buffers. Buffers currently allocated
+ * will not be resized until they are returned.
+ */
+ void setBufferSize(size_t n);
+
+ size_t getBufferSize() const
+ {
+ return m_bufferSize;
+ }
+
+ /**
+ * Discard or create buffers as necessary so as to have n buffers
+ * in the pool. This will not discard any buffers that are
+ * currently allocated, so if more than n are allocated, more than
+ * n will remain.
+ */
+ void setPoolSize(size_t n);
+
+ size_t getPoolSize() const
+ {
+ return m_buffers.size();
+ }
+
+ /**
+ * Return true if n buffers available, false otherwise.
+ */
+ bool getBuffers(size_t n, RingBuffer<sample_t> **buffers);
+
+ /**
+ * Return a buffer to the pool.
+ */
+ void returnBuffer(RingBuffer<sample_t> *buffer);
+
+protected:
+ // Want to avoid memory allocation if possible when marking a buffer
+ // unallocated or allocated, so we use a single container for all
+
+ typedef std::pair<RingBuffer<sample_t> *, bool> AllocPair;
+ typedef std::vector<AllocPair> AllocList;
+ AllocList m_buffers;
+
+ size_t m_bufferSize;
+ size_t m_available;
+
+ pthread_mutex_t m_lock;
+};
+
+
+RingBufferPool::RingBufferPool(size_t bufferSize) :
+ m_bufferSize(bufferSize),
+ m_available(0)
+{
+ pthread_mutex_t initialisingMutex = PTHREAD_MUTEX_INITIALIZER;
+ memcpy(&m_lock, &initialisingMutex, sizeof(pthread_mutex_t));
+}
+
+RingBufferPool::~RingBufferPool()
+{
+ size_t allocatedCount = 0;
+ for (AllocList::iterator i = m_buffers.begin(); i != m_buffers.end(); ++i) {
+ if (i->second)
+ ++allocatedCount;
+ }
+
+ if (allocatedCount > 0) {
+ std::cerr << "WARNING: RingBufferPool::~RingBufferPool: deleting pool with " << allocatedCount << " allocated buffers" << std::endl;
+ }
+
+ for (AllocList::iterator i = m_buffers.begin(); i != m_buffers.end(); ++i) {
+ delete i->first;
+ }
+
+ m_buffers.clear();
+
+ pthread_mutex_destroy(&m_lock);
+}
+
+void
+RingBufferPool::setBufferSize(size_t n)
+{
+ if (m_bufferSize == n)
+ return ;
+
+ pthread_mutex_lock(&m_lock);
+
+#ifdef DEBUG_RING_BUFFER_POOL
+
+ std::cerr << "RingBufferPool::setBufferSize: from " << m_bufferSize
+ << " to " << n << std::endl;
+ int c = 0;
+#endif
+
+ for (AllocList::iterator i = m_buffers.begin(); i != m_buffers.end(); ++i) {
+ if (!i->second) {
+ delete i->first;
+ i->first = new RingBuffer<sample_t>(n);
+#ifdef DEBUG_RING_BUFFER_POOL
+
+ std::cerr << "Resized buffer " << c++ << std::endl;
+#endif
+
+ } else {
+#ifdef DEBUG_RING_BUFFER_POOL
+ std::cerr << "Buffer " << c++ << " is already in use, resizing in place" << std::endl;
+#endif
+
+ i->first->resize(n);
+ }
+ }
+
+ m_bufferSize = n;
+ pthread_mutex_unlock(&m_lock);
+}
+
+void
+RingBufferPool::setPoolSize(size_t n)
+{
+ pthread_mutex_lock(&m_lock);
+
+#ifdef DEBUG_RING_BUFFER_POOL
+
+ std::cerr << "RingBufferPool::setPoolSize: from " << m_buffers.size()
+ << " to " << n << std::endl;
+#endif
+
+ size_t allocatedCount = 0, count = 0;
+
+ for (AllocList::iterator i = m_buffers.begin(); i != m_buffers.end(); ++i) {
+ if (i->second)
+ ++allocatedCount;
+ ++count;
+ }
+
+ if (count > n) {
+ for (AllocList::iterator i = m_buffers.begin(); i != m_buffers.end(); ) {
+ if (!i->second) {
+ delete i->first;
+ m_buffers.erase(i);
+ if (--count == n)
+ break;
+ } else {
+ ++i;
+ }
+ }
+ }
+
+ while (count < n) {
+ m_buffers.push_back(AllocPair(new RingBuffer<sample_t>(m_bufferSize),
+ false));
+ ++count;
+ }
+
+ m_available = std::max(allocatedCount, n) - allocatedCount;
+
+#ifdef DEBUG_RING_BUFFER_POOL
+
+ std::cerr << "RingBufferPool::setPoolSize: have " << m_buffers.size()
+ << " buffers (" << allocatedCount << " allocated, " << m_available << " available)" << std::endl;
+#endif
+
+ pthread_mutex_unlock(&m_lock);
+}
+
+bool
+RingBufferPool::getBuffers(size_t n, RingBuffer<sample_t> **buffers)
+{
+ pthread_mutex_lock(&m_lock);
+
+ size_t count = 0;
+
+ for (AllocList::iterator i = m_buffers.begin(); i != m_buffers.end(); ++i) {
+ if (!i->second && ++count == n)
+ break;
+ }
+
+ if (count < n) {
+#ifdef DEBUG_RING_BUFFER_POOL
+ std::cerr << "RingBufferPool::getBuffers(" << n << "): not available (in pool of " << m_buffers.size() << "), resizing" << std::endl;
+#endif
+
+ AllocList newBuffers;
+
+ while (count < n) {
+ for (size_t i = 0; i < m_buffers.size(); ++i) {
+ newBuffers.push_back(m_buffers[i]);
+ }
+ for (size_t i = 0; i < m_buffers.size(); ++i) {
+ newBuffers.push_back(AllocPair(new RingBuffer<sample_t>(m_bufferSize),
+ false));
+ }
+ count += m_buffers.size();
+ m_available += m_buffers.size();
+ }
+
+ m_buffers = newBuffers;
+ }
+
+ count = 0;
+
+#ifdef DEBUG_RING_BUFFER_POOL
+
+ std::cerr << "RingBufferPool::getBuffers(" << n << "): available" << std::endl;
+#endif
+
+ for (AllocList::iterator i = m_buffers.begin(); i != m_buffers.end(); ++i) {
+ if (!i->second) {
+ i->second = true;
+ i->first->reset();
+ i->first->mlock();
+ buffers[count] = i->first;
+ --m_available;
+ if (++count == n)
+ break;
+ }
+ }
+
+#ifdef DEBUG_RING_BUFFER_POOL
+ std::cerr << "RingBufferPool::getBuffers: " << m_available << " remain in pool of " << m_buffers.size() << std::endl;
+#endif
+
+ pthread_mutex_unlock(&m_lock);
+ return true;
+}
+
+void
+RingBufferPool::returnBuffer(RingBuffer<sample_t> *buffer)
+{
+ pthread_mutex_lock(&m_lock);
+
+#ifdef DEBUG_RING_BUFFER_POOL
+
+ std::cerr << "RingBufferPool::returnBuffer" << std::endl;
+#endif
+
+ buffer->munlock();
+
+ for (AllocList::iterator i = m_buffers.begin(); i != m_buffers.end(); ++i) {
+ if (i->first == buffer) {
+ i->second = false;
+ ++m_available;
+ if (buffer->getSize() != m_bufferSize) {
+ delete buffer;
+ i->first = new RingBuffer<sample_t>(m_bufferSize);
+ }
+ }
+ }
+
+#ifdef DEBUG_RING_BUFFER_POOL
+ std::cerr << "RingBufferPool::returnBuffer: " << m_available << " remain in pool of " << m_buffers.size() << std::endl;
+#endif
+
+ pthread_mutex_unlock(&m_lock);
+}
+
+
+AudioCache PlayableAudioFile::m_smallFileCache;
+
+std::vector<PlayableAudioFile::sample_t *> PlayableAudioFile::m_workBuffers;
+size_t PlayableAudioFile::m_workBufferSize = 0;
+
+char *PlayableAudioFile::m_rawFileBuffer;
+size_t PlayableAudioFile::m_rawFileBufferSize = 0;
+
+RingBufferPool *PlayableAudioFile::m_ringBufferPool = 0;
+
+size_t PlayableAudioFile::m_xfadeFrames = 30;
+
+PlayableAudioFile::PlayableAudioFile(InstrumentId instrumentId,
+ AudioFile *audioFile,
+ const RealTime &startTime,
+ const RealTime &startIndex,
+ const RealTime &duration,
+ size_t bufferSize,
+ size_t smallFileSize,
+ int targetChannels,
+ int targetSampleRate) :
+ m_startTime(startTime),
+ m_startIndex(startIndex),
+ m_duration(duration),
+ m_file(0),
+ m_audioFile(audioFile),
+ m_instrumentId(instrumentId),
+ m_targetChannels(targetChannels),
+ m_targetSampleRate(targetSampleRate),
+ m_fileEnded(false),
+ m_firstRead(true),
+ m_runtimeSegmentId( -1),
+ m_isSmallFile(false),
+ m_currentScanPoint(RealTime::zeroTime),
+ m_smallFileScanFrame(0),
+ m_autoFade(false),
+ m_fadeInTime(RealTime::zeroTime),
+ m_fadeOutTime(RealTime::zeroTime)
+{
+#ifdef DEBUG_PLAYABLE
+ std::cerr << "PlayableAudioFile::PlayableAudioFile - creating " << this << " for instrument " << instrumentId << " with file " << (m_audioFile ? m_audioFile->getShortFilename() : "(none)") << std::endl;
+#endif
+
+ if (!m_ringBufferPool) {
+ //!!! Problematic -- how do we deal with different playable audio
+ // files requiring different buffer sizes? That shouldn't be the
+ // usual case, but it's not unthinkable.
+ m_ringBufferPool = new RingBufferPool(bufferSize);
+ } else {
+ m_ringBufferPool->setBufferSize
+ (std::max(bufferSize, m_ringBufferPool->getBufferSize()));
+ }
+
+ initialise(bufferSize, smallFileSize);
+}
+
+
+void
+PlayableAudioFile::setRingBufferPoolSizes(size_t n, size_t nframes)
+{
+ if (!m_ringBufferPool) {
+ m_ringBufferPool = new RingBufferPool(nframes);
+ } else {
+ m_ringBufferPool->setBufferSize
+ (std::max(nframes, m_ringBufferPool->getBufferSize()));
+ }
+ m_ringBufferPool->setPoolSize(n);
+}
+
+
+void
+PlayableAudioFile::initialise(size_t bufferSize, size_t smallFileSize)
+{
+#ifdef DEBUG_PLAYABLE
+ std::cerr << "PlayableAudioFile::initialise() " << this << std::endl;
+#endif
+
+ checkSmallFileCache(smallFileSize);
+
+ if (!m_isSmallFile) {
+
+ m_file = new std::ifstream(m_audioFile->getFilename().c_str(),
+ std::ios::in | std::ios::binary);
+
+ if (!*m_file) {
+ std::cerr << "ERROR: PlayableAudioFile::initialise: Failed to open audio file " << m_audioFile->getFilename() << std::endl;
+ delete m_file;
+ m_file = 0;
+ }
+ }
+
+ // Scan to the beginning of the data chunk we need
+ //
+#ifdef DEBUG_PLAYABLE
+ std::cerr << "PlayableAudioFile::initialise - scanning to " << m_startIndex << std::endl;
+#endif
+
+ if (m_file) {
+ scanTo(m_startIndex);
+ } else {
+ m_fileEnded = false;
+ m_currentScanPoint = m_startIndex;
+ m_smallFileScanFrame = RealTime::realTime2Frame
+ (m_currentScanPoint, m_audioFile->getSampleRate());
+ }
+
+#ifdef DEBUG_PLAYABLE
+ std::cerr << "PlayableAudioFile::initialise: buffer size is " << bufferSize << " frames, file size is " << m_audioFile->getSize() << std::endl;
+#endif
+
+ if (m_targetChannels <= 0)
+ m_targetChannels = m_audioFile->getChannels();
+ if (m_targetSampleRate <= 0)
+ m_targetSampleRate = m_audioFile->getSampleRate();
+
+ m_ringBuffers = new RingBuffer<sample_t> *[m_targetChannels];
+ for (int ch = 0; ch < m_targetChannels; ++ch) {
+ m_ringBuffers[ch] = 0;
+ }
+}
+
+PlayableAudioFile::~PlayableAudioFile()
+{
+ if (m_file) {
+ m_file->close();
+ delete m_file;
+ }
+
+ returnRingBuffers();
+ delete[] m_ringBuffers;
+ m_ringBuffers = 0;
+
+ if (m_isSmallFile) {
+ m_smallFileCache.decrementReference(m_audioFile);
+ }
+
+#ifdef DEBUG_PLAYABLE
+ // std::cerr << "PlayableAudioFile::~PlayableAudioFile - destroying - " << this << std::endl;
+#endif
+}
+
+void
+PlayableAudioFile::returnRingBuffers()
+{
+ for (int i = 0; i < m_targetChannels; ++i) {
+ if (m_ringBuffers[i]) {
+ m_ringBufferPool->returnBuffer(m_ringBuffers[i]);
+ m_ringBuffers[i] = 0;
+ }
+ }
+}
+
+bool
+PlayableAudioFile::scanTo(const RealTime &time)
+{
+#ifdef DEBUG_PLAYABLE_READ
+ std::cerr << "PlayableAudioFile::scanTo(" << time << ")" << std::endl;
+#endif
+
+ m_fileEnded = false; // until we know otherwise -- this flag is an
+ // optimisation, not a reliable record
+
+ bool ok = false;
+
+ if (m_isSmallFile) {
+
+ m_currentScanPoint = time;
+ m_smallFileScanFrame = RealTime::realTime2Frame
+ (time, m_audioFile->getSampleRate());
+#ifdef DEBUG_PLAYABLE_READ
+ std::cerr << "... maps to frame " << m_smallFileScanFrame << std::endl;
+#endif
+ ok = true;
+
+ } else {
+
+ ok = m_audioFile->scanTo(m_file, time);
+ if (ok) {
+ m_currentScanPoint = time;
+ }
+ }
+
+#ifdef DEBUG_PLAYABLE_READ
+ std::cerr << "PlayableAudioFile::scanTo(" << time << "): set m_currentScanPoint to " << m_currentScanPoint << std::endl;
+#endif
+
+ m_firstRead = true; // so we know to xfade in
+
+ return ok;
+}
+
+
+size_t
+PlayableAudioFile::getSampleFramesAvailable()
+{
+ size_t actual = 0;
+
+ if (m_isSmallFile) {
+ size_t cchannels;
+ size_t cframes;
+ (void)m_smallFileCache.getData(m_audioFile, cchannels, cframes);
+ if (cframes > m_smallFileScanFrame)
+ return cframes - m_smallFileScanFrame;
+ else
+ return 0;
+ }
+
+ for (int ch = 0; ch < m_targetChannels; ++ch) {
+ if (!m_ringBuffers[ch])
+ return 0;
+ size_t thisChannel = m_ringBuffers[ch]->getReadSpace();
+ if (ch == 0 || thisChannel < actual)
+ actual = thisChannel;
+ }
+
+#ifdef DEBUG_PLAYABLE
+ std::cerr << "PlayableAudioFile(" << (m_audioFile ? m_audioFile->getShortFilename() : "(none)") << " " << this << ")::getSampleFramesAvailable: have " << actual << std::endl;
+#endif
+
+ return actual;
+}
+
+size_t
+PlayableAudioFile::addSamples(std::vector<sample_t *> &destination,
+ size_t channels, size_t nframes, size_t offset)
+{
+#ifdef DEBUG_PLAYABLE_READ
+ std::cerr << "PlayableAudioFile::addSamples(" << nframes << "): channels " << channels << ", my target channels " << m_targetChannels << std::endl;
+#endif
+
+ if (!m_isSmallFile) {
+
+ size_t qty = 0;
+ bool done = m_fileEnded;
+
+ for (int ch = 0; ch < int(channels) && ch < m_targetChannels; ++ch) {
+ if (!m_ringBuffers[ch])
+ return 0; //!!! fatal
+ size_t here = m_ringBuffers[ch]->readAdding(destination[ch] + offset, nframes);
+ if (ch == 0 || here < qty)
+ qty = here;
+ if (done && (m_ringBuffers[ch]->getReadSpace() > 0))
+ done = false;
+ }
+
+ for (int ch = channels; ch < m_targetChannels; ++ch) {
+ m_ringBuffers[ch]->skip(nframes);
+ }
+
+ if (done) {
+#ifdef DEBUG_PLAYABLE_READ
+ std::cerr << "PlayableAudioFile::addSamples(" << nframes << "): reached end, returning buffers" << std::endl;
+#endif
+
+ returnRingBuffers();
+ }
+
+#ifdef DEBUG_PLAYABLE_READ
+ std::cerr << "PlayableAudioFile::addSamples(" << nframes << "): returning " << qty << " frames (at least " << (m_ringBuffers[0] ? m_ringBuffers[0]->getReadSpace() : 0) << " remaining)" << std::endl;
+#endif
+
+ return qty;
+
+ } else {
+
+ size_t cchannels;
+ size_t cframes;
+ float **cached = m_smallFileCache.getData(m_audioFile, cchannels, cframes);
+
+ if (!cached) {
+ std::cerr << "WARNING: PlayableAudioFile::addSamples: Failed to find small file in cache" << std::endl;
+ m_isSmallFile = false;
+ } else {
+
+ size_t scanFrame = m_smallFileScanFrame;
+
+ if (scanFrame >= cframes) {
+ m_fileEnded = true;
+ return 0;
+ }
+
+ size_t endFrame = scanFrame + nframes;
+ size_t n = nframes;
+
+ if (endFrame >= cframes) {
+ m_fileEnded = true;
+ n = cframes - scanFrame;
+ }
+
+#ifdef DEBUG_PLAYABLE_READ
+ std::cerr << "PlayableAudioFile::addSamples: it's a small file: want frames " << scanFrame << " to " << endFrame << " of " << cframes << std::endl;
+#endif
+
+ size_t xfadeIn = (m_firstRead ? m_xfadeFrames : 0);
+ size_t xfadeOut = (m_fileEnded ? m_xfadeFrames : 0);
+
+ // all this could be neater!
+
+ if (channels == 1 && cchannels == 2) { // mix
+ for (size_t i = 0; i < n; ++i) {
+ sample_t v =
+ cached[0][scanFrame + i] +
+ cached[1][scanFrame + i];
+ // if ((i + 1) < xfadeIn)
+ // v = (v * (i + 1)) / xfadeIn;
+ //if ((n - i) < xfadeOut)
+ // v = (v * (n - i)) / xfadeOut;
+ destination[0][i + offset] += v;
+ }
+ } else {
+ for (size_t ch = 0; ch < channels; ++ch) {
+ int sch = ch;
+ if (ch >= cchannels) {
+ if (channels == 2 && cchannels == 1)
+ sch = 0;
+ else
+ break;
+ } else {
+ for (size_t i = 0; i < n; ++i) {
+ sample_t v = cached[sch][scanFrame + i];
+ // if ((i + 1) < xfadeIn)
+ // v = (v * (i + 1)) / xfadeIn;
+ //if ((n - i) < xfadeOut)
+ // v = (v * (n - i)) / xfadeOut;
+ destination[ch][i + offset] += v;
+ }
+ }
+ }
+ }
+
+ m_smallFileScanFrame += nframes;
+ m_currentScanPoint = m_currentScanPoint +
+ RealTime::frame2RealTime(nframes, m_targetSampleRate);
+ return nframes;
+ }
+ }
+
+ return 0;
+}
+
+void
+PlayableAudioFile::checkSmallFileCache(size_t smallFileSize)
+{
+ if (m_smallFileCache.has(m_audioFile)) {
+
+#ifdef DEBUG_PLAYABLE
+ std::cerr << "PlayableAudioFile::checkSmallFileCache: Found file in small file cache" << std::endl;
+#endif
+
+ m_smallFileCache.incrementReference(m_audioFile);
+ m_isSmallFile = true;
+
+ } else if (m_audioFile->getSize() <= smallFileSize) {
+
+ std::ifstream file(m_audioFile->getFilename().c_str(),
+ std::ios::in | std::ios::binary);
+
+ if (!file) {
+ std::cerr << "ERROR: PlayableAudioFile::checkSmallFileCache: Failed to open audio file " << m_audioFile->getFilename() << std::endl;
+ return ;
+ }
+
+#ifdef DEBUG_PLAYABLE
+ std::cerr << "PlayableAudioFile::checkSmallFileCache: Adding file to small file cache" << std::endl;
+#endif
+
+ // We always encache files with their original number of
+ // channels (because they might be called for in any channel
+ // configuration subsequently) but with the current sample
+ // rate, not their original one.
+
+ m_audioFile->scanTo(&file, RealTime::zeroTime);
+
+ size_t reqd = m_audioFile->getSize() / m_audioFile->getBytesPerFrame();
+ unsigned char *buffer = new unsigned char[m_audioFile->getSize()];
+ size_t obtained = m_audioFile->getSampleFrames(&file, (char *)buffer, reqd);
+
+// std::cerr <<"obtained=" << obtained << std::endl;
+
+ size_t nch = getSourceChannels();
+ size_t nframes = obtained;
+ if (int(getSourceSampleRate()) != m_targetSampleRate) {
+#ifdef DEBUG_PLAYABLE
+ std::cerr << "PlayableAudioFile::checkSmallFileCache: Resampling badly from " << getSourceSampleRate() << " to " << m_targetSampleRate << std::endl;
+#endif
+ nframes = size_t(float(nframes) * float(m_targetSampleRate) /
+ float(getSourceSampleRate()));
+ }
+
+ std::vector<sample_t *> samples;
+ for (size_t ch = 0; ch < nch; ++ch) {
+ samples.push_back(new sample_t[nframes]);
+ }
+
+ if (!m_audioFile->decode(buffer,
+ obtained * m_audioFile->getBytesPerFrame(),
+ m_targetSampleRate,
+ nch,
+ nframes,
+ samples)) {
+ std::cerr << "PlayableAudioFile::checkSmallFileCache: failed to decode file" << std::endl;
+ } else {
+ sample_t **toCache = new sample_t * [nch];
+ for (size_t ch = 0; ch < nch; ++ch) {
+ toCache[ch] = samples[ch];
+ }
+ m_smallFileCache.addData(m_audioFile, nch, nframes, toCache);
+ m_isSmallFile = true;
+ }
+
+ delete[] buffer;
+
+ file.close();
+ }
+
+ if (m_isSmallFile) {
+ if (m_file) {
+ m_file->close();
+ delete m_file;
+ m_file = 0;
+ }
+ }
+}
+
+
+void
+PlayableAudioFile::fillBuffers()
+{
+#ifdef DEBUG_PLAYABLE
+ if (m_audioFile) {
+ std::cerr << "PlayableAudioFile(" << m_audioFile->getShortFilename() << ")::fillBuffers() [async] -- scanning to " << m_startIndex << std::endl;
+ } else {
+ std::cerr << "PlayableAudioFile::fillBuffers() [async] -- scanning to " << m_startIndex << std::endl;
+ }
+#endif
+
+ if (!m_isSmallFile && (!m_file || !*m_file)) {
+ m_file = new std::ifstream(m_audioFile->getFilename().c_str(),
+ std::ios::in | std::ios::binary);
+ if (!*m_file) {
+ std::cerr << "ERROR: PlayableAudioFile::fillBuffers: Failed to open audio file " << m_audioFile->getFilename() << std::endl;
+ delete m_file;
+ m_file = 0;
+ return ;
+ }
+ }
+
+ scanTo(m_startIndex);
+ updateBuffers();
+}
+
+void
+PlayableAudioFile::clearBuffers()
+{
+ returnRingBuffers();
+}
+
+bool
+PlayableAudioFile::fillBuffers(const RealTime &currentTime)
+{
+#ifdef DEBUG_PLAYABLE
+ if (!m_isSmallFile) {
+ if (m_audioFile) {
+ std::cerr << "PlayableAudioFile(" << m_audioFile->getShortFilename() << " " << this << ")::fillBuffers(" << currentTime << "):\n my start time " << m_startTime << ", start index " << m_startIndex << ", duration " << m_duration << std::endl;
+ } else {
+ std::cerr << "PlayableAudioFile::fillBuffers(" << currentTime << "): my start time " << m_startTime << ", start index " << m_startIndex << ", duration " << m_duration << std::endl;
+ }
+ }
+#endif
+
+ if (currentTime > m_startTime + m_duration) {
+
+#ifdef DEBUG_PLAYABLE
+ std::cerr << "PlayableAudioFile::fillBuffers: seeking past end, returning buffers" << std::endl;
+#endif
+
+ returnRingBuffers();
+ return true;
+ }
+
+ if (!m_isSmallFile && (!m_file || !*m_file)) {
+ m_file = new std::ifstream(m_audioFile->getFilename().c_str(),
+ std::ios::in | std::ios::binary);
+ if (!*m_file) {
+ std::cerr << "ERROR: PlayableAudioFile::fillBuffers: Failed to open audio file " << m_audioFile->getFilename() << std::endl;
+ delete m_file;
+ m_file = 0;
+ return false;
+ }
+ scanTo(m_startIndex);
+ }
+
+ RealTime scanTime = m_startIndex;
+
+ if (currentTime > m_startTime) {
+ scanTime = m_startIndex + currentTime - m_startTime;
+ }
+
+ // size_t scanFrames = RealTime::realTime2Frame
+ // (scanTime,
+ // m_isSmallFile ? m_targetSampleRate : m_audioFile->getSampleRate());
+
+ if (scanTime != m_currentScanPoint) {
+ scanTo(scanTime);
+ }
+
+ if (!m_isSmallFile) {
+ for (int i = 0; i < m_targetChannels; ++i) {
+ if (m_ringBuffers[i])
+ m_ringBuffers[i]->reset();
+ }
+ updateBuffers();
+ }
+
+ return true;
+}
+
+bool
+PlayableAudioFile::updateBuffers()
+{
+ if (m_isSmallFile)
+ return false;
+ if (!m_file)
+ return false;
+
+ if (m_fileEnded) {
+#ifdef DEBUG_PLAYABLE_READ
+ std::cerr << "PlayableAudioFile::updateBuffers: at end of file already" << std::endl;
+#endif
+
+ return false;
+ }
+
+ if (!m_ringBuffers[0]) {
+
+ if (m_targetChannels < 0) {
+ std::cerr << "WARNING: PlayableAudioFile::updateBuffers: m_targetChannels < 0, can't allocate ring buffers" << std::endl;
+ return false;
+ }
+
+ // need a buffer: can we get one?
+ if (!m_ringBufferPool->getBuffers(m_targetChannels, m_ringBuffers)) {
+ std::cerr << "WARNING: PlayableAudioFile::updateBuffers: no ring buffers available" << std::endl;
+ return false;
+ }
+ }
+
+ size_t nframes = 0;
+
+ for (int ch = 0; ch < m_targetChannels; ++ch) {
+ if (!m_ringBuffers[ch])
+ continue;
+ size_t writeSpace = m_ringBuffers[ch]->getWriteSpace();
+ if (ch == 0 || writeSpace < nframes)
+ nframes = writeSpace;
+ }
+
+ if (nframes == 0) {
+#ifdef DEBUG_PLAYABLE_READ
+ std::cerr << "PlayableAudioFile::updateBuffers: frames == 0, ignoring" << std::endl;
+#endif
+
+ return false;
+ }
+
+#ifdef DEBUG_PLAYABLE_READ
+ std::cerr << "PlayableAudioFile::updateBuffers: want " << nframes << " frames" << std::endl;
+#endif
+
+
+ RealTime block = RealTime::frame2RealTime(nframes, m_targetSampleRate);
+ if (m_currentScanPoint + block >= m_startIndex + m_duration) {
+ block = m_startIndex + m_duration - m_currentScanPoint;
+ if (block <= RealTime::zeroTime)
+ nframes = 0;
+ else
+ nframes = RealTime::realTime2Frame(block, m_targetSampleRate);
+ m_fileEnded = true;
+ }
+
+ size_t fileFrames = nframes;
+ if (m_targetSampleRate != int(getSourceSampleRate())) {
+ fileFrames = size_t(float(fileFrames) * float(getSourceSampleRate()) /
+ float(m_targetSampleRate));
+ }
+
+#ifdef DEBUG_PLAYABLE_READ
+ std::cerr << "Want " << fileFrames << " (" << block << ") from file (" << (m_duration + m_startIndex - m_currentScanPoint - block) << " to go)" << std::endl;
+#endif
+
+ //!!! need to be doing this in initialise, want to avoid allocations here
+ if ((getBytesPerFrame() * fileFrames) > m_rawFileBufferSize) {
+ delete[] m_rawFileBuffer;
+ m_rawFileBufferSize = getBytesPerFrame() * fileFrames;
+#ifdef DEBUG_PLAYABLE_READ
+
+ std::cerr << "Expanding raw file buffer to " << m_rawFileBufferSize << " chars" << std::endl;
+#endif
+
+ m_rawFileBuffer = new char[m_rawFileBufferSize];
+ }
+
+ size_t obtained =
+ m_audioFile->getSampleFrames(m_file, m_rawFileBuffer, fileFrames);
+
+ if (obtained < fileFrames || m_file->eof()) {
+ m_fileEnded = true;
+ }
+
+#ifdef DEBUG_PLAYABLE
+ std::cerr << "requested " << fileFrames << " frames from file for " << nframes << " frames, got " << obtained << " frames" << std::endl;
+#endif
+
+ if (nframes > m_workBufferSize) {
+
+ for (size_t i = 0; i < m_workBuffers.size(); ++i) {
+ delete[] m_workBuffers[i];
+ }
+
+ m_workBuffers.clear();
+ m_workBufferSize = nframes;
+#ifdef DEBUG_PLAYABLE_READ
+
+ std::cerr << "Expanding work buffer to " << m_workBufferSize << " frames" << std::endl;
+#endif
+
+ for (int i = 0; i < m_targetChannels; ++i) {
+ m_workBuffers.push_back(new sample_t[m_workBufferSize]);
+ }
+
+ } else {
+
+ while (m_targetChannels > m_workBuffers.size()) {
+ m_workBuffers.push_back(new sample_t[m_workBufferSize]);
+ }
+ }
+
+ if (m_audioFile->decode((const unsigned char *)m_rawFileBuffer,
+ obtained * getBytesPerFrame(),
+ m_targetSampleRate,
+ m_targetChannels,
+ nframes,
+ m_workBuffers,
+ false)) {
+
+ /*!!! No -- GUI and notification side of things isn't up to this yet,
+ so comment it out just in case
+
+ if (m_autoFade) {
+
+ if (m_currentScanPoint < m_startIndex + m_fadeInTime) {
+
+ size_t fadeSamples =
+ RealTime::realTime2Frame(m_fadeInTime, getTargetSampleRate());
+ size_t originSamples =
+ RealTime::realTime2Frame(m_currentScanPoint - m_startIndex,
+ getTargetSampleRate());
+
+ for (size_t i = 0; i < nframes; ++i) {
+ if (i + originSamples > fadeSamples) {
+ break;
+ }
+ float gain = float(i + originSamples) / float(fadeSamples);
+ for (int ch = 0; ch < m_targetChannels; ++ch) {
+ m_workBuffers[ch][i] *= gain;
+ }
+ }
+ }
+
+ if (m_currentScanPoint + block >
+ m_startIndex + m_duration - m_fadeOutTime) {
+
+ size_t fadeSamples =
+ RealTime::realTime2Frame(m_fadeOutTime, getTargetSampleRate());
+ size_t originSamples = // counting from end
+ RealTime::realTime2Frame
+ (m_startIndex + m_duration - m_currentScanPoint,
+ getTargetSampleRate());
+
+ for (size_t i = 0; i < nframes; ++i) {
+ float gain = 1.0;
+ if (originSamples < i) gain = 0.0;
+ else {
+ size_t fromEnd = originSamples - i;
+ if (fromEnd < fadeSamples) {
+ gain = float(fromEnd) / float(fadeSamples);
+ }
+ }
+ for (int ch = 0; ch < m_targetChannels; ++ch) {
+ m_workBuffers[ch][i] *= gain;
+ }
+ }
+ }
+ }
+ */
+
+ m_currentScanPoint = m_currentScanPoint + block;
+
+ for (int ch = 0; ch < m_targetChannels; ++ch) {
+
+ if (m_firstRead || m_fileEnded) {
+ float xfade = std::min(m_xfadeFrames, nframes);
+ if (m_firstRead) {
+ for (size_t i = 0; i < xfade; ++i) {
+ m_workBuffers[ch][i] *= float(i + 1) / xfade;
+ }
+ }
+ if (m_fileEnded) {
+ for (size_t i = 0; i < xfade; ++i) {
+ m_workBuffers[ch][nframes - i - 1] *=
+ float(i + 1) / xfade;
+ }
+ }
+ }
+
+ if (m_ringBuffers[ch]) {
+ m_ringBuffers[ch]->write(m_workBuffers[ch], nframes);
+ }
+ }
+ }
+
+ m_firstRead = false;
+
+ if (obtained < fileFrames) {
+ if (m_file) {
+ m_file->close();
+ delete m_file;
+ m_file = 0;
+ }
+ }
+
+ return true;
+}
+
+
+// How many channels in the base AudioFile?
+//
+unsigned int
+PlayableAudioFile::getSourceChannels()
+{
+ if (m_audioFile) {
+ return m_audioFile->getChannels();
+ }
+ return 0;
+}
+
+unsigned int
+PlayableAudioFile::getTargetChannels()
+{
+ return m_targetChannels;
+}
+
+unsigned int
+PlayableAudioFile::getBytesPerFrame()
+{
+ if (m_audioFile) {
+ return m_audioFile->getBytesPerFrame();
+ }
+ return 0;
+}
+
+unsigned int
+PlayableAudioFile::getSourceSampleRate()
+{
+ if (m_audioFile) {
+ return m_audioFile->getSampleRate();
+ }
+ return 0;
+}
+
+unsigned int
+PlayableAudioFile::getTargetSampleRate()
+{
+ return m_targetSampleRate;
+}
+
+
+// How many bits per sample in the base AudioFile?
+//
+unsigned int
+PlayableAudioFile::getBitsPerSample()
+{
+ if (m_audioFile) {
+ return m_audioFile->getBitsPerSample();
+ }
+ return 0;
+}
+
+
+}
+
diff --git a/src/sound/PlayableAudioFile.h b/src/sound/PlayableAudioFile.h
new file mode 100644
index 0000000..648ad4c
--- /dev/null
+++ b/src/sound/PlayableAudioFile.h
@@ -0,0 +1,219 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _PLAYABLE_AUDIO_FILE_H_
+#define _PLAYABLE_AUDIO_FILE_H_
+
+#include "Instrument.h"
+#include "RingBuffer.h"
+#include "AudioFile.h"
+#include "AudioCache.h"
+
+#include <string>
+#include <map>
+
+namespace Rosegarden
+{
+
+class RingBufferPool;
+
+
+class PlayableAudioFile
+{
+public:
+ typedef float sample_t;
+
+ PlayableAudioFile(InstrumentId instrumentId,
+ AudioFile *audioFile,
+ const RealTime &startTime,
+ const RealTime &startIndex,
+ const RealTime &duration,
+ size_t bufferSize = 4096,
+ size_t smallFileSize = 131072,
+ int targetChannels = -1, // default same as file
+ int targetSampleRate = -1); // default same as file
+ ~PlayableAudioFile();
+
+ static void setRingBufferPoolSizes(size_t n, size_t nframes);
+
+ void setStartTime(const RealTime &time) { m_startTime = time; }
+ RealTime getStartTime() const { return m_startTime; }
+
+ void setDuration(const RealTime &time) { m_duration = time; }
+ RealTime getDuration() const { return m_duration; }
+ RealTime getEndTime() const { return m_startTime + m_duration; }
+
+ void setStartIndex(const RealTime &time) { m_startIndex = time; }
+ RealTime getStartIndex() const { return m_startIndex; }
+
+ bool isSmallFile() const { return m_isSmallFile; }
+
+ // Get audio file for interrogation
+ //
+ AudioFile* getAudioFile() const { return m_audioFile; }
+
+ // Get instrument ID - we need to be able to map back
+ // at the GUI.
+ //
+ InstrumentId getInstrument() const { return m_instrumentId; }
+
+ // Return the number of frames currently buffered. The next call
+ // to getSamples on any channel is guaranteed to return at least
+ // this many samples.
+ //
+ size_t getSampleFramesAvailable();
+
+ // Read samples from the given channel on the file and add them
+ // into the destination.
+ //
+ // If insufficient frames are available, this will leave the
+ // excess samples unchanged.
+ //
+ // Returns the actual number of samples written.
+ //
+ // If offset is non-zero, the samples will be written starting at
+ // offset frames from the start of the target block.
+ //
+ size_t addSamples(std::vector<sample_t *> &target,
+ size_t channels, size_t nframes, size_t offset = 0);
+
+ unsigned int getSourceChannels();
+ unsigned int getTargetChannels();
+ unsigned int getSourceSampleRate();
+ unsigned int getTargetSampleRate();
+
+ unsigned int getBitsPerSample();
+ unsigned int getBytesPerFrame();
+
+ // Clear out and refill the ring buffer for immediate
+ // (asynchronous) play.
+ //
+ void fillBuffers();
+
+ // Clear out and refill the ring buffer (in preparation for
+ // playback) according to the proposed play time.
+ //
+ // This call and updateBuffers are not thread-safe (for
+ // performance reasons). They should be called for all files
+ // sequentially within a single thread.
+ //
+ bool fillBuffers(const RealTime &currentTime);
+
+ void clearBuffers();
+
+ // Update the buffer during playback.
+ //
+ // This call and fillBuffers are not thread-safe (for performance
+ // reasons). They should be called for all files sequentially
+ // within a single thread.
+ //
+ bool updateBuffers();
+
+ // Has fillBuffers been called and completed yet?
+ //
+ bool isBuffered() const { return m_currentScanPoint > m_startIndex; }
+
+ // Has all the data in this file now been read into the buffers?
+ //
+ bool isFullyBuffered() const { return m_isSmallFile || m_fileEnded; }
+
+ // Stop playing this file.
+ //
+ void cancel() { m_fileEnded = true; }
+
+ // Segment id that allows us to crosscheck against playing audio
+ // segments.
+ //
+ int getRuntimeSegmentId() const { return m_runtimeSegmentId; }
+ void setRuntimeSegmentId(int id) { m_runtimeSegmentId = id; }
+
+ // Auto fading of a playable audio file
+ //
+ bool isAutoFading() const { return m_autoFade; }
+ void setAutoFade(bool value) { m_autoFade = value; }
+
+ RealTime getFadeInTime() const { return m_fadeInTime; }
+ void setFadeInTime(const RealTime &time)
+ { m_fadeInTime = time; }
+
+ RealTime getFadeOutTime() const { return m_fadeOutTime; }
+ void setFadeOutTime(const RealTime &time)
+ { m_fadeOutTime = time; }
+
+
+protected:
+ void initialise(size_t bufferSize, size_t smallFileSize);
+ void checkSmallFileCache(size_t smallFileSize);
+ bool scanTo(const RealTime &time);
+ void returnRingBuffers();
+
+ RealTime m_startTime;
+ RealTime m_startIndex;
+ RealTime m_duration;
+
+ // Performance file handle - must open non-blocking to
+ // allow other potential PlayableAudioFiles access to
+ // the same file.
+ //
+ std::ifstream *m_file;
+
+ // AudioFile handle
+ //
+ AudioFile *m_audioFile;
+
+ // Originating Instrument Id
+ //
+ InstrumentId m_instrumentId;
+
+ int m_targetChannels;
+ int m_targetSampleRate;
+
+ bool m_fileEnded;
+ bool m_firstRead;
+ static size_t m_xfadeFrames;
+ int m_runtimeSegmentId;
+
+ static AudioCache m_smallFileCache;
+ bool m_isSmallFile;
+
+ static std::vector<sample_t *> m_workBuffers;
+ static size_t m_workBufferSize;
+
+ static char *m_rawFileBuffer;
+ static size_t m_rawFileBufferSize;
+
+ RingBuffer<sample_t> **m_ringBuffers;
+ static RingBufferPool *m_ringBufferPool;
+
+ RealTime m_currentScanPoint;
+ size_t m_smallFileScanFrame;
+
+ bool m_autoFade;
+ RealTime m_fadeInTime;
+ RealTime m_fadeOutTime;
+
+private:
+ PlayableAudioFile(const PlayableAudioFile &pAF); // not provided
+};
+
+}
+
+#endif
diff --git a/src/sound/PluginFactory.cpp b/src/sound/PluginFactory.cpp
new file mode 100644
index 0000000..49c1014
--- /dev/null
+++ b/src/sound/PluginFactory.cpp
@@ -0,0 +1,120 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include "PluginFactory.h"
+#include "PluginIdentifier.h"
+
+#ifdef HAVE_LADSPA
+#include "LADSPAPluginFactory.h"
+#endif
+
+#ifdef HAVE_DSSI
+#include "DSSIPluginFactory.h"
+#endif
+
+#include <iostream>
+
+namespace Rosegarden
+{
+
+int PluginFactory::m_sampleRate = 48000;
+
+#ifdef HAVE_LADSPA
+static LADSPAPluginFactory *_ladspaInstance = 0;
+#endif
+
+#ifdef HAVE_DSSI
+static LADSPAPluginFactory *_dssiInstance = 0;
+#endif
+
+PluginFactory *
+PluginFactory::instance(QString pluginType)
+{
+ if (pluginType == "ladspa") {
+#ifdef HAVE_LADSPA
+ if (!_ladspaInstance) {
+ std::cerr << "PluginFactory::instance(" << pluginType
+ << "): creating new LADSPAPluginFactory" << std::endl;
+ _ladspaInstance = new LADSPAPluginFactory();
+ _ladspaInstance->discoverPlugins();
+ }
+ return _ladspaInstance;
+#else
+
+ return 0;
+#endif
+
+ } else if (pluginType == "dssi") {
+#ifdef HAVE_DSSI
+ if (!_dssiInstance) {
+ std::cerr << "PluginFactory::instance(" << pluginType
+ << "): creating new DSSIPluginFactory" << std::endl;
+ _dssiInstance = new DSSIPluginFactory();
+ _dssiInstance->discoverPlugins();
+ }
+ return _dssiInstance;
+#else
+
+ return 0;
+#endif
+
+ }
+ else
+ return 0;
+}
+
+PluginFactory *
+PluginFactory::instanceFor(QString identifier)
+{
+ QString type, soName, label;
+ PluginIdentifier::parseIdentifier(identifier, type, soName, label);
+ return instance(type);
+}
+
+void
+PluginFactory::enumerateAllPlugins(MappedObjectPropertyList &list)
+{
+ PluginFactory *factory;
+
+ // Plugins can change the locale, store it for reverting afterwards
+ char *loc = setlocale(LC_ALL, 0);
+
+ // Query DSSI plugins before LADSPA ones.
+ // This is to provide for the interesting possibility of plugins
+ // providing either DSSI or LADSPA versions of themselves,
+ // returning both versions if the LADSPA identifiers are queried
+ // first but only the DSSI version if the DSSI identifiers are
+ // queried first.
+
+ factory = instance("dssi");
+ if (factory)
+ factory->enumeratePlugins(list);
+
+ factory = instance("ladspa");
+ if (factory)
+ factory->enumeratePlugins(list);
+
+ setlocale(LC_ALL, loc);
+}
+
+
+}
+
diff --git a/src/sound/PluginFactory.h b/src/sound/PluginFactory.h
new file mode 100644
index 0000000..820b233
--- /dev/null
+++ b/src/sound/PluginFactory.h
@@ -0,0 +1,97 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _PLUGIN_FACTORY_H_
+#define _PLUGIN_FACTORY_H_
+
+#include <qstring.h>
+#include <vector>
+
+#include "MappedCommon.h"
+
+namespace Rosegarden
+{
+
+class RunnablePluginInstance;
+class MappedPluginSlot;
+
+class PluginFactory
+{
+public:
+ static PluginFactory *instance(QString pluginType);
+ static PluginFactory *instanceFor(QString identifier);
+ static void enumerateAllPlugins(MappedObjectPropertyList &);
+
+ static void setSampleRate(int sampleRate) { m_sampleRate = sampleRate; }
+
+ /**
+ * Look up the plugin path and find the plugins in it. Called
+ * automatically after construction of a factory.
+ */
+ virtual void discoverPlugins() = 0;
+
+ /**
+ * Return a reference to a list of all plugin identifiers that can
+ * be created by this factory.
+ */
+ virtual const std::vector<QString> &getPluginIdentifiers() const = 0;
+
+ /**
+ * Append to the given list descriptions of all the available
+ * plugins and their ports. This is in a standard format, see
+ * the LADSPA implementation for details.
+ */
+ virtual void enumeratePlugins(MappedObjectPropertyList &list) = 0;
+
+ /**
+ * Populate the given plugin slot with information about its
+ * plugin. This is called from the plugin slot's set method
+ * when it's been asked to set its plugin identifier. This
+ * method should also destroy and recreate the plugin slot's
+ * port child objects.
+ */
+ virtual void populatePluginSlot(QString identifier,
+ MappedPluginSlot &slot) = 0;
+
+ /**
+ * Instantiate a plugin.
+ */
+ virtual RunnablePluginInstance *instantiatePlugin(QString identifier,
+ int instrumentId,
+ int position,
+ unsigned int sampleRate,
+ unsigned int blockSize,
+ unsigned int channels) = 0;
+
+protected:
+ PluginFactory() { }
+
+ // for call by RunnablePluginInstance dtor
+ virtual void releasePlugin(RunnablePluginInstance *, QString identifier) = 0;
+ friend class RunnablePluginInstance;
+
+ static int m_sampleRate;
+};
+
+
+}
+
+#endif
diff --git a/src/sound/PluginIdentifier.cpp b/src/sound/PluginIdentifier.cpp
new file mode 100644
index 0000000..25b3317
--- /dev/null
+++ b/src/sound/PluginIdentifier.cpp
@@ -0,0 +1,72 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include "PluginIdentifier.h"
+#include <iostream>
+
+namespace Rosegarden
+{
+
+QString
+PluginIdentifier::createIdentifier(QString type,
+ QString soName,
+ QString label)
+{
+ QString identifier = type + ":" + soName + ":" + label;
+ return identifier;
+}
+
+void
+PluginIdentifier::parseIdentifier(QString identifier,
+ QString &type,
+ QString &soName,
+ QString &label)
+{
+ type = identifier.section(':', 0, 0);
+ soName = identifier.section(':', 1, 1);
+ label = identifier.section(':', 2);
+}
+
+bool
+PluginIdentifier::areIdentifiersSimilar(QString id1, QString id2)
+{
+ QString type1, type2, soName1, soName2, label1, label2;
+
+ parseIdentifier(id1, type1, soName1, label1);
+ parseIdentifier(id2, type2, soName2, label2);
+
+ if (type1 != type2 || label1 != label2)
+ return false;
+
+ bool similar = (soName1.section('/', -1).section('.', 0, 0) ==
+ soName2.section('/', -1).section('.', 0, 0));
+
+ return similar;
+}
+
+// The prefix of this key is also used as a literal in base/AudioPluginInstance.C.
+// If you change one, change the other.
+// Better still, don't change one.
+QString
+PluginIdentifier::RESERVED_PROJECT_DIRECTORY_KEY = "__ROSEGARDEN__:__RESERVED__:ProjectDirectoryKey";
+
+}
+
diff --git a/src/sound/PluginIdentifier.h b/src/sound/PluginIdentifier.h
new file mode 100644
index 0000000..e8519ad
--- /dev/null
+++ b/src/sound/PluginIdentifier.h
@@ -0,0 +1,50 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _PLUGIN_IDENTIFIER_H_
+#define _PLUGIN_IDENTIFIER_H_
+
+#include <qstring.h>
+
+
+// A plugin identifier is simply a string; this class provides methods
+// to parse it into its constituent bits (plugin type, DLL path and label).
+
+namespace Rosegarden {
+
+class PluginIdentifier {
+
+public:
+
+ static QString createIdentifier(QString type, QString soName, QString label);
+
+ static void parseIdentifier(QString identifier,
+ QString &type, QString &soName, QString &label);
+
+ static bool areIdentifiersSimilar(QString id1, QString id2);
+
+ // Not strictly related to identifiers
+ static QString RESERVED_PROJECT_DIRECTORY_KEY;
+};
+
+}
+
+#endif
diff --git a/src/sound/RIFFAudioFile.cpp b/src/sound/RIFFAudioFile.cpp
new file mode 100644
index 0000000..c34435f
--- /dev/null
+++ b/src/sound/RIFFAudioFile.cpp
@@ -0,0 +1,686 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include "RIFFAudioFile.h"
+#include "RealTime.h"
+#include "Profiler.h"
+
+using std::cout;
+using std::cerr;
+using std::endl;
+
+//#define DEBUG_RIFF
+
+
+namespace Rosegarden
+{
+
+RIFFAudioFile::RIFFAudioFile(unsigned int id,
+ const std::string &name,
+ const std::string &fileName):
+ AudioFile(id, name, fileName),
+ m_subFormat(PCM),
+ m_bytesPerSecond(0),
+ m_bytesPerFrame(0)
+{}
+
+RIFFAudioFile::RIFFAudioFile(const std::string &fileName,
+ unsigned int channels = 1,
+ unsigned int sampleRate = 48000,
+ unsigned int bytesPerSecond = 6000,
+ unsigned int bytesPerFrame = 2,
+ unsigned int bitsPerSample = 16):
+ AudioFile(0, "", fileName)
+{
+ m_bitsPerSample = bitsPerSample;
+ m_sampleRate = sampleRate;
+ m_bytesPerSecond = bytesPerSecond;
+ m_bytesPerFrame = bytesPerFrame;
+ m_channels = channels;
+
+ if (bitsPerSample == 16)
+ m_subFormat = PCM;
+ else if (bitsPerSample == 32)
+ m_subFormat = FLOAT;
+ else
+ throw(BadSoundFileException(m_fileName, "Rosegarden currently only supports 16 or 32-bit PCM or IEEE floating-point RIFF files for writing"));
+
+}
+
+RIFFAudioFile::~RIFFAudioFile()
+{}
+
+
+// Show some stats on this file
+//
+void
+RIFFAudioFile::printStats()
+{
+ cout << "filename : " << m_fileName << endl
+ << "channels : " << m_channels << endl
+ << "sample rate : " << m_sampleRate << endl
+ << "bytes per second : " << m_bytesPerSecond << endl
+ << "bits per sample : " << m_bitsPerSample << endl
+ << "bytes per frame : " << m_bytesPerFrame << endl
+ << "file length : " << m_fileSize << " bytes" << endl
+ << endl;
+}
+
+bool
+RIFFAudioFile::appendSamples(const std::string &buffer)
+{
+ /*
+ if (m_outFile == 0 || m_type != WAV)
+ return false;
+ */
+
+ // write out
+ putBytes(m_outFile, buffer);
+
+ return true;
+}
+
+bool
+RIFFAudioFile::appendSamples(const char *buf, unsigned int frames)
+{
+ putBytes(m_outFile, buf, frames * m_bytesPerFrame);
+ return true;
+}
+
+// scan on from a descriptor position
+bool
+RIFFAudioFile::scanForward(std::ifstream *file, const RealTime &time)
+{
+ // sanity
+ if (file == 0)
+ return false;
+
+ unsigned int totalSamples = m_sampleRate * time.sec +
+ ( ( m_sampleRate * time.usec() ) / 1000000 );
+ unsigned int totalBytes = totalSamples * m_bytesPerFrame;
+
+ m_loseBuffer = true;
+
+ // do the seek
+ file->seekg(totalBytes, std::ios::cur);
+
+ if (file->eof())
+ return false;
+
+ return true;
+}
+
+bool
+RIFFAudioFile::scanForward(const RealTime &time)
+{
+ if (*m_inFile)
+ return scanForward(m_inFile, time);
+ else
+ return false;
+}
+
+bool
+RIFFAudioFile::scanTo(const RealTime &time)
+{
+ if (*m_inFile)
+ return scanTo(m_inFile, time);
+ else
+ return false;
+
+}
+
+bool
+RIFFAudioFile::scanTo(std::ifstream *file, const RealTime &time)
+{
+ // sanity
+ if (file == 0)
+ return false;
+
+ // whatever we do here we invalidate the read buffer
+ //
+ m_loseBuffer = true;
+
+ file->clear();
+
+ // seek past header - don't hardcode this - use the file format
+ // spec to get header length and then scoot to that.
+ //
+ file->seekg(16, std::ios::beg);
+
+ unsigned int lengthOfFormat = 0;
+
+ try {
+ lengthOfFormat = getIntegerFromLittleEndian(getBytes(file, 4));
+ file->seekg(lengthOfFormat, std::ios::cur);
+
+ // check we've got data chunk start
+ std::string chunkName;
+ int chunkLength = 0;
+
+ while ((chunkName = getBytes(file, 4)) != "data") {
+ if (file->eof()) {
+ std::cerr << "RIFFAudioFile::scanTo(): failed to find data "
+ << std::endl;
+ return false;
+ }
+//#ifdef DEBUG_RIFF
+ std::cerr << "RIFFAudioFile::scanTo(): skipping chunk: "
+ << chunkName << std::endl;
+//#endif
+ chunkLength = getIntegerFromLittleEndian(getBytes(file, 4));
+ if (chunkLength < 0) {
+ std::cerr << "RIFFAudioFile::scanTo(): negative chunk length "
+ << chunkLength << " for chunk " << chunkName << std::endl;
+ return false;
+ }
+ file->seekg(chunkLength, std::ios::cur);
+ }
+
+ // get the length of the data chunk, and scan past it as a side-effect
+ chunkLength = getIntegerFromLittleEndian(getBytes(file, 4));
+#ifdef DEBUG_RIFF
+
+ std::cout << "RIFFAudioFile::scanTo() - data chunk size = "
+ << chunkLength << std::endl;
+#endif
+
+ } catch (BadSoundFileException s) {
+#ifdef DEBUG_RIFF
+ std::cerr << "RIFFAudioFile::scanTo - EXCEPTION - \""
+ << s.getMessage() << "\"" << std::endl;
+#endif
+
+ return false;
+ }
+
+ // Ok, we're past all the header information in the data chunk.
+ // Now, how much do we scan forward?
+ //
+ size_t totalFrames = RealTime::realTime2Frame(time, m_sampleRate);
+
+ unsigned int totalBytes = totalFrames * m_bytesPerFrame;
+
+ // When using seekg we have to keep an eye on the boundaries ourselves
+ //
+ if (totalBytes > m_fileSize - (lengthOfFormat + 16 + 8)) {
+#ifdef DEBUG_RIFF
+ std::cerr << "RIFFAudioFile::scanTo() - attempting to move past end of "
+ << "data block" << std::endl;
+#endif
+
+ return false;
+ }
+
+#ifdef DEBUG_RIFF
+ std::cout << "RIFFAudioFile::scanTo - seeking to " << time
+ << " (" << totalBytes << " bytes from current " << file->tellg()
+ << ")" << std::endl;
+#endif
+
+ file->seekg(totalBytes, std::ios::cur);
+
+ return true;
+}
+
+// Get a certain number of sample frames - a frame is a set
+// of samples (all channels) for a given sample quanta.
+//
+// For example, getting one frame of 16-bit stereo will return
+// four bytes of data (two per channel).
+//
+//
+std::string
+RIFFAudioFile::getSampleFrames(std::ifstream *file, unsigned int frames)
+{
+ // sanity
+ if (file == 0)
+ return std::string("");
+
+ // Bytes per sample already takes into account the number
+ // of channels we're using
+ //
+ long totalBytes = frames * m_bytesPerFrame;
+
+ try {
+ return getBytes(file, totalBytes);
+ } catch (BadSoundFileException s) {
+ return "";
+ }
+}
+
+unsigned int
+RIFFAudioFile::getSampleFrames(std::ifstream *file, char *buf,
+ unsigned int frames)
+{
+ if (file == 0)
+ return 0;
+ try {
+ return getBytes(file, buf, frames * m_bytesPerFrame) / m_bytesPerFrame;
+ } catch (BadSoundFileException s) {
+ return 0;
+ }
+}
+
+std::string
+RIFFAudioFile::getSampleFrames(unsigned int frames)
+{
+ if (*m_inFile) {
+ return getSampleFrames(m_inFile, frames);
+ } else {
+ return std::string("");
+ }
+}
+
+// Return a slice of frames over a time period
+//
+std::string
+RIFFAudioFile::getSampleFrameSlice(std::ifstream *file, const RealTime &time)
+{
+ // sanity
+ if (file == 0)
+ return std::string("");
+
+ long totalFrames = RealTime::realTime2Frame(time, m_sampleRate);
+ long totalBytes = totalFrames * m_bytesPerFrame;
+
+ try {
+ return getBytes(file, totalBytes);
+ } catch (BadSoundFileException s) {
+ return "";
+ }
+}
+
+std::string
+RIFFAudioFile::getSampleFrameSlice(const RealTime &time)
+{
+ if (*m_inFile) {
+ return getSampleFrameSlice(m_inFile, time);
+ } else {
+ return std::string("");
+ }
+}
+
+RealTime
+RIFFAudioFile::getLength()
+{
+ // Fixed header size = 44 but prove by getting it from the file too
+ //
+ unsigned int headerLength = 44;
+
+ if (m_inFile) {
+ m_inFile->seekg(16, std::ios::beg);
+ headerLength = getIntegerFromLittleEndian(getBytes(m_inFile, 4));
+ m_inFile->seekg(headerLength, std::ios::cur);
+ headerLength += (16 + 8);
+ }
+
+ if (!m_bytesPerFrame || !m_sampleRate) return RealTime::zeroTime;
+
+ double frames = (m_fileSize - headerLength) / m_bytesPerFrame;
+ double seconds = frames / ((double)m_sampleRate);
+
+ int secs = int(seconds);
+ int nsecs = int((seconds - secs) * 1000000000.0);
+
+ return RealTime(secs, nsecs);
+}
+
+
+// The RIFF file format chunk defines our internal meta data.
+//
+// Courtesy of:
+// http://www.technology.niagarac.on.ca/courses/comp630/WavFileFormat.html
+//
+// 'The WAV file itself consists of three "chunks" of information:
+// The RIFF chunk which identifies the file as a WAV file, The FORMAT
+// chunk which identifies parameters such as sample rate and the DATA
+// chunk which contains the actual data (samples).'
+//
+//
+void
+RIFFAudioFile::readFormatChunk()
+{
+ if (m_inFile == 0)
+ return ;
+
+ m_loseBuffer = true;
+
+ // seek to beginning
+ m_inFile->seekg(0, std::ios::beg);
+
+ // get the header string
+ //
+ std::string hS = getBytes(36);
+
+ // Look for the RIFF identifier and bomb out if we don't find it
+ //
+#if (__GNUC__ < 3)
+
+ if (hS.compare(AUDIO_RIFF_ID, 0, 4) != 0)
+#else
+
+ if (hS.compare(0, 4, AUDIO_RIFF_ID) != 0)
+#endif
+
+ {
+#ifdef DEBUG_RIFF
+ std::cerr << "RIFFAudioFile::readFormatChunk - "
+ << "can't find RIFF identifier\n";
+#endif
+
+ throw(BadSoundFileException(m_fileName, "RIFFAudioFile::readFormatChunk - can't find RIFF identifier"));
+ }
+
+ // Look for the WAV identifier
+ //
+#if (__GNUC__ < 3)
+ if (hS.compare(AUDIO_WAVE_ID, 8, 4) != 0)
+#else
+
+ if (hS.compare(8, 4, AUDIO_WAVE_ID) != 0)
+#endif
+
+ {
+#ifdef DEBUG_RIFF
+ std::cerr << "Can't find WAV identifier\n";
+#endif
+
+ throw(BadSoundFileException(m_fileName, "Can't find WAV identifier"));
+ }
+
+ // Look for the FORMAT identifier - note that this doesn't actually
+ // have to be in the first chunk we come across, but for the moment
+ // this is the only place we check for it because I'm lazy.
+ //
+ //
+#if (__GNUC__ < 3)
+ if (hS.compare(AUDIO_FORMAT_ID, 12, 4) != 0)
+#else
+
+ if (hS.compare(12, 4, AUDIO_FORMAT_ID) != 0)
+#endif
+
+ {
+#ifdef DEBUG_RIFF
+ std::cerr << "Can't find FORMAT identifier\n";
+#endif
+
+ throw(BadSoundFileException(m_fileName, "Can't find FORMAT identifier"));
+ }
+
+ // Little endian conversion of length bytes into file length
+ // (add on eight for RIFF id and length field and compare to
+ // real file size).
+ //
+ unsigned int length = getIntegerFromLittleEndian(hS.substr(4, 4)) + 8;
+
+ if (length != m_fileSize) {
+ std::cerr << "WARNING: RIFFAudioFile: incorrect length ("
+ << length << ", file size is " << m_fileSize << "), ignoring"
+ << std::endl;
+ length = m_fileSize;
+ }
+
+ // Check the format length
+ //
+ unsigned int lengthOfFormat = getIntegerFromLittleEndian(hS.substr(16, 4));
+
+ // Make sure we step to the end of the format chunk ignoring the
+ // tail if it exists
+ //
+ if (lengthOfFormat > 0x10) {
+#ifdef DEBUG_RIFF
+ std::cerr << "RIFFAudioFile::readFormatChunk - "
+ << "extended Format Chunk (" << lengthOfFormat << ")"
+ << std::endl;
+#endif
+
+ // ignore any overlapping bytes
+ m_inFile->seekg(lengthOfFormat - 0x10, std::ios::cur);
+ } else if (lengthOfFormat < 0x10) {
+#ifdef DEBUG_RIFF
+ std::cerr << "RIFFAudioFile::readFormatChunk - "
+ << "truncated Format Chunk (" << lengthOfFormat << ")"
+ << std::endl;
+#endif
+
+ m_inFile->seekg(lengthOfFormat - 0x10, std::ios::cur);
+ //throw(BadSoundFileException(m_fileName, "Format chunk too short"));
+ }
+
+
+ // Check sub format - we support PCM or IEEE floating point.
+ //
+ unsigned int subFormat = getIntegerFromLittleEndian(hS.substr(20, 2));
+
+ if (subFormat == 0x01) {
+ m_subFormat = PCM;
+ } else if (subFormat == 0x03) {
+ m_subFormat = FLOAT;
+ } else {
+ throw(BadSoundFileException(m_fileName, "Rosegarden currently only supports PCM or IEEE floating-point RIFF files"));
+ }
+
+ // We seem to have a good looking .WAV file - extract the
+ // sample information and populate this locally
+ //
+ unsigned int channelNumbers = getIntegerFromLittleEndian(hS.substr(22, 2));
+
+ switch (channelNumbers) {
+ case 0x01:
+ case 0x02:
+ m_channels = channelNumbers;
+ break;
+
+ default: {
+ throw(BadSoundFileException(m_fileName, "Unsupported number of channels"));
+ }
+ break;
+ }
+
+ // Now the rest of the information
+ //
+ m_sampleRate = getIntegerFromLittleEndian(hS.substr(24, 4));
+ m_bytesPerSecond = getIntegerFromLittleEndian(hS.substr(28, 4));
+ m_bytesPerFrame = getIntegerFromLittleEndian(hS.substr(32, 2));
+ m_bitsPerSample = getIntegerFromLittleEndian(hS.substr(34, 2));
+
+ if (m_subFormat == PCM) {
+ if (m_bitsPerSample != 8 && m_bitsPerSample != 16 && m_bitsPerSample != 24) {
+ throw BadSoundFileException("Rosegarden currently only supports 8-, 16- or 24-bit PCM in RIFF files");
+ }
+ } else if (m_subFormat == FLOAT) {
+ if (m_bitsPerSample != 32) {
+ throw BadSoundFileException("Rosegarden currently only supports 32-bit floating-point in RIFF files");
+ }
+ }
+
+ // printStats();
+
+}
+
+// Write out the format chunk from our internal data
+//
+void
+RIFFAudioFile::writeFormatChunk()
+{
+ if (m_outFile == 0 || m_type != WAV)
+ return ;
+
+ std::string outString;
+
+ // RIFF type is all we support for the moment
+ outString += AUDIO_RIFF_ID;
+
+ // Now write the total length of the file minus these first 8 bytes.
+ // We won't know this until we've finished recording the file.
+ //
+ outString += "0000";
+
+ // WAV file is all we support
+ //
+ outString += AUDIO_WAVE_ID;
+
+ // Begin the format chunk
+ outString += AUDIO_FORMAT_ID;
+
+ // length
+ //cout << "LENGTH = " << getLittleEndianFromInteger(0x10, 4) << endl;
+ outString += getLittleEndianFromInteger(0x10, 4);
+
+ // 1 for PCM, 3 for float
+ if (m_subFormat == PCM) {
+ outString += getLittleEndianFromInteger(0x01, 2);
+ } else {
+ outString += getLittleEndianFromInteger(0x03, 2);
+ }
+
+ // channel
+ outString += getLittleEndianFromInteger(m_channels, 2);
+
+ // sample rate
+ outString += getLittleEndianFromInteger(m_sampleRate, 4);
+
+ // bytes per second
+ outString += getLittleEndianFromInteger(m_bytesPerSecond, 4);
+
+ // bytes per sample
+ outString += getLittleEndianFromInteger(m_bytesPerFrame, 2);
+
+ // bits per sample
+ outString += getLittleEndianFromInteger(m_bitsPerSample, 2);
+
+ // Now mark the beginning of the "data" chunk and leave the file
+ // open for writing.
+ outString += "data";
+
+ // length of data to follow - again needs to be written after
+ // we've completed the file.
+ //
+ outString += "0000";
+
+ // write out
+ //
+ putBytes(m_outFile, outString);
+}
+
+
+AudioFileType
+RIFFAudioFile::identifySubType(const std::string &filename)
+{
+ std::ifstream *testFile =
+ new std::ifstream(filename.c_str(), std::ios::in | std::ios::binary);
+
+ if (!(*testFile))
+ return UNKNOWN;
+
+ std::string hS;
+ unsigned int numberOfBytes = 36;
+ char *bytes = new char[numberOfBytes];
+
+ testFile->read(bytes, numberOfBytes);
+ for (unsigned int i = 0; i < numberOfBytes; i++)
+ hS += (unsigned char)bytes[i];
+
+ AudioFileType type = UNKNOWN;
+
+ // Test for BWF first because it's an extension of a plain WAV
+ //
+#if (__GNUC__ < 3)
+
+ if (hS.compare(AUDIO_RIFF_ID, 0, 4) == 0 &&
+ hS.compare(AUDIO_WAVE_ID, 8, 4) == 0 &&
+ hS.compare(AUDIO_BWF_ID, 12, 4) == 0)
+#else
+
+ if (hS.compare(0, 4, AUDIO_RIFF_ID) == 0 &&
+ hS.compare(8, 4, AUDIO_WAVE_ID) == 0 &&
+ hS.compare(12, 4, AUDIO_BWF_ID) == 0)
+#endif
+
+ {
+ type = BWF;
+ }
+ // Now for a WAV
+#if (__GNUC__ < 3)
+ else if (hS.compare(AUDIO_RIFF_ID, 0, 4) == 0 &&
+ hS.compare(AUDIO_WAVE_ID, 8, 4) == 0)
+#else
+
+ else if (hS.compare(0, 4, AUDIO_RIFF_ID) == 0 &&
+ hS.compare(8, 4, AUDIO_WAVE_ID) == 0)
+#endif
+
+ {
+ type = WAV;
+ } else
+ type = UNKNOWN;
+
+ testFile->close();
+ delete [] bytes;
+
+ return type;
+}
+
+float
+RIFFAudioFile::convertBytesToSample(const unsigned char *ubuf)
+{
+ switch (getBitsPerSample()) {
+
+ case 8: {
+ // WAV stores 8-bit samples unsigned, other sizes signed.
+ return (float)(ubuf[0] - 128.0) / 128.0;
+ }
+
+ case 16: {
+ // Two's complement little-endian 16-bit integer.
+ // We convert endianness (if necessary) but assume 16-bit short.
+ unsigned char b2 = ubuf[0];
+ unsigned char b1 = ubuf[1];
+ unsigned int bits = (b1 << 8) + b2;
+ return (float)(short(bits)) / 32767.0;
+ }
+
+ case 24: {
+ // Two's complement little-endian 24-bit integer.
+ // Again, convert endianness but assume 32-bit int.
+ unsigned char b3 = ubuf[0];
+ unsigned char b2 = ubuf[1];
+ unsigned char b1 = ubuf[2];
+ // Rotate 8 bits too far in order to get the sign bit
+ // in the right place; this gives us a 32-bit value,
+ // hence the larger float divisor
+ unsigned int bits = (b1 << 24) + (b2 << 16) + (b3 << 8);
+ return (float)(int(bits)) / 2147483647.0;
+ }
+
+ case 32: {
+ // IEEE floating point
+ return *(float *)ubuf;
+ }
+
+ default:
+ return 0.0f;
+ }
+}
+
+}
+
diff --git a/src/sound/RIFFAudioFile.h b/src/sound/RIFFAudioFile.h
new file mode 100644
index 0000000..a846306
--- /dev/null
+++ b/src/sound/RIFFAudioFile.h
@@ -0,0 +1,168 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+// Resource Interchange File Formt - a chunk based audio
+// file format. Type of chunk varies with specialisation
+// of this class - WAV files are a specialisation with just
+// a format chunk, BWF has more chunks.
+//
+//
+
+#ifndef _RIFFAUDIOFILE_H_
+#define _RIFFAUDIOFILE_H_
+
+#include <string>
+#include <vector>
+
+#include "AudioFile.h"
+#include "RealTime.h"
+
+namespace Rosegarden
+{
+
+class RIFFAudioFile : public AudioFile
+{
+public:
+ RIFFAudioFile(unsigned int id,
+ const std::string &name,
+ const std::string &fileName);
+
+ RIFFAudioFile(const std::string &fileName,
+ unsigned int channels,
+ unsigned int sampleRate,
+ unsigned int bytesPerSecond,
+ unsigned int bytesPerFrame,
+ unsigned int bitsPerSample);
+
+ ~RIFFAudioFile();
+
+ typedef enum {
+ PCM,
+ FLOAT
+ } SubFormat;
+
+ // Our main control methods - again keeping abstract at this level
+ //
+ //virtual bool open() = 0;
+ //virtual bool write() = 0;
+ //virtual void close() = 0;
+
+ // Show the information we have on this file
+ //
+ virtual void printStats();
+
+ // Slightly dodgy code here - we keep these functions here
+ // because I don't want to duplicate them in PlayableRIFFAudioFile
+ // and also don't want that class to inherit this one.
+ //
+ // Of course the file handle we use in might be pointing to
+ // any file - for the most part we just assume it's an audio
+ // file.
+ //
+ //
+ // Move file pointer to relative time in data chunk -
+ // shouldn't be less than zero. Returns true if the
+ // scan time was valid and successful.
+ //
+ virtual bool scanTo(const RealTime &time);
+ virtual bool scanTo(std::ifstream *file, const RealTime &time);
+
+ // Scan forward in a file by a certain amount of time
+ //
+ virtual bool scanForward(const RealTime &time);
+ virtual bool scanForward(std::ifstream *file, const RealTime &time);
+
+ // Return a number of samples - caller will have to
+ // de-interleave n-channel samples themselves.
+ //
+ virtual std::string getSampleFrames(std::ifstream *file,
+ unsigned int frames);
+ virtual unsigned int getSampleFrames(std::ifstream *file,
+ char *buf,
+ unsigned int frames);
+ virtual std::string getSampleFrames(unsigned int frames);
+
+ // Return a number of (possibly) interleaved samples
+ // over a time slice from current file pointer position.
+ //
+ virtual std::string getSampleFrameSlice(std::ifstream *file,
+ const RealTime &time);
+ virtual std::string getSampleFrameSlice(const RealTime &time);
+
+ // Append a string of samples to an already open (for writing)
+ // audio file.
+ //
+ virtual bool appendSamples(const std::string &buffer);
+ virtual bool appendSamples(const char *buf, unsigned int frames);
+
+ // Get the length of the sample in Seconds/Microseconds
+ //
+ virtual RealTime getLength();
+
+ // Accessors
+ //
+ virtual unsigned int getBytesPerFrame() { return m_bytesPerFrame; }
+ unsigned int getBytesPerSecond() { return m_bytesPerSecond; }
+
+ // Allow easy identification of wav file type
+ //
+ static AudioFileType identifySubType(const std::string &filename);
+
+ // Convert a single sample from byte format, given the right
+ // number of bytes for the sample width
+ float convertBytesToSample(const unsigned char *bytes);
+
+ // Decode and de-interleave the given samples that were retrieved
+ // from this file or another with the same format as it. Place
+ // the results in the given float buffer. Return true for
+ // success. This function does crappy resampling if necessary.
+ //
+ virtual bool decode(const unsigned char *sourceData,
+ size_t sourceBytes,
+ size_t targetSampleRate,
+ size_t targetChannels,
+ size_t targetFrames,
+ std::vector<float *> &targetData,
+ bool addToResultBuffers = false) = 0;
+
+protected:
+ //virtual void parseHeader(const std::string &header);
+ //virtual void parseBody();
+
+ // Find and read in the format chunk of a RIFF file - without
+ // this chunk we don't actually have a RIFF file.
+ //
+ void readFormatChunk();
+
+ // Write out the Format chunk from the internal data we have
+ //
+ void writeFormatChunk();
+
+ SubFormat m_subFormat;
+ unsigned int m_bytesPerSecond;
+ unsigned int m_bytesPerFrame;
+};
+
+}
+
+
+#endif // _RIFFAUDIOFILE_H_
diff --git a/src/sound/RecordableAudioFile.cpp b/src/sound/RecordableAudioFile.cpp
new file mode 100644
index 0000000..09420dd
--- /dev/null
+++ b/src/sound/RecordableAudioFile.cpp
@@ -0,0 +1,164 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include "RecordableAudioFile.h"
+
+#include <cstdlib>
+
+//#define DEBUG_RECORDABLE 1
+
+namespace Rosegarden
+{
+
+RecordableAudioFile::RecordableAudioFile(AudioFile *audioFile,
+ size_t bufferSize) :
+ m_audioFile(audioFile),
+ m_status(IDLE)
+{
+ for (unsigned int ch = 0; ch < audioFile->getChannels(); ++ch) {
+
+ m_ringBuffers.push_back(new RingBuffer<sample_t>(bufferSize));
+
+ if (!m_ringBuffers[ch]->mlock()) {
+ std::cerr << "WARNING: RecordableAudioFile::initialise: couldn't lock buffer into real memory, performance may be impaired" << std::endl;
+ }
+ }
+}
+
+RecordableAudioFile::~RecordableAudioFile()
+{
+ write();
+ m_audioFile->close();
+ delete m_audioFile;
+
+ for (size_t i = 0; i < m_ringBuffers.size(); ++i) {
+ delete m_ringBuffers[i];
+ }
+}
+
+size_t
+RecordableAudioFile::buffer(const sample_t *data, int channel, size_t frames)
+{
+ if (channel >= int(m_ringBuffers.size())) {
+ std::cerr << "RecordableAudioFile::buffer: No such channel as "
+ << channel << std::endl;
+ return 0;
+ }
+
+ size_t available = m_ringBuffers[channel]->getWriteSpace();
+
+ if (frames > available) {
+ std::cerr << "RecordableAudioFile::buffer: buffer maxed out!" << std::endl;
+ frames = available;
+ }
+
+#ifdef DEBUG_RECORDABLE
+ std::cerr << "RecordableAudioFile::buffer: buffering " << frames << " frames on channel " << channel << std::endl;
+#endif
+
+ m_ringBuffers[channel]->write(data, frames);
+ return frames;
+}
+
+void
+RecordableAudioFile::write()
+{
+ // Use a static buffer -- this obviously requires that write() is
+ // only called from a single thread
+ static size_t bufferSize = 0;
+ static sample_t *buffer = 0;
+ static char *encodeBuffer = 0;
+
+ unsigned int bits = m_audioFile->getBitsPerSample();
+
+ if (bits != 16 && bits != 32) {
+ std::cerr << "ERROR: RecordableAudioFile::write: file has " << bits
+ << " bits per sample; only 16 or 32 are supported" << std::endl;
+ return ;
+ }
+
+ unsigned int channels = m_audioFile->getChannels();
+ unsigned char b1, b2;
+
+ // We need the same amount of available data on every channel
+ size_t s = 0;
+ for (unsigned int ch = 0; ch < channels; ++ch) {
+ size_t available = m_ringBuffers[ch]->getReadSpace();
+#ifdef DEBUG_RECORDABLE
+
+ std::cerr << "RecordableAudioFile::write: " << available << " frames available to write on channel " << ch << std::endl;
+#endif
+
+ if (ch == 0 || available < s)
+ s = available;
+ }
+ if (s == 0)
+ return ;
+
+ size_t bufferReqd = channels * s;
+ if (bufferReqd > bufferSize) {
+ if (buffer) {
+ buffer = (sample_t *)realloc(buffer, bufferReqd * sizeof(sample_t));
+ encodeBuffer = (char *)realloc(encodeBuffer, bufferReqd * 4);
+ } else {
+ buffer = (sample_t *) malloc(bufferReqd * sizeof(sample_t));
+ encodeBuffer = (char *)malloc(bufferReqd * 4);
+ }
+ bufferSize = bufferReqd;
+ }
+
+ for (unsigned int ch = 0; ch < channels; ++ch) {
+ m_ringBuffers[ch]->read(buffer + ch * s, s);
+ }
+
+ // interleave and convert
+
+ if (bits == 16) {
+ size_t index = 0;
+ for (size_t i = 0; i < s; ++i) {
+ for (unsigned int ch = 0; ch < channels; ++ch) {
+ float sample = buffer[i + ch * s];
+ b2 = (unsigned char)((long)(sample * 32767.0) & 0xff);
+ b1 = (unsigned char)((long)(sample * 32767.0) >> 8);
+ encodeBuffer[index++] = b2;
+ encodeBuffer[index++] = b1;
+ }
+ }
+ } else {
+ char *encodePointer = encodeBuffer;
+ for (size_t i = 0; i < s; ++i) {
+ for (unsigned int ch = 0; ch < channels; ++ch) {
+ float sample = buffer[i + ch * s];
+ *(float *)encodePointer = sample;
+ encodePointer += sizeof(float);
+ }
+ }
+ }
+
+#ifdef DEBUG_RECORDABLE
+ std::cerr << "RecordableAudioFile::write: writing " << s << " frames at " << channels << " channels and " << bits << " bits to file" << std::endl;
+#endif
+
+ m_audioFile->appendSamples(encodeBuffer, s);
+}
+
+}
+
diff --git a/src/sound/RecordableAudioFile.h b/src/sound/RecordableAudioFile.h
new file mode 100644
index 0000000..06df6f0
--- /dev/null
+++ b/src/sound/RecordableAudioFile.h
@@ -0,0 +1,68 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RECORDABLE_AUDIO_FILE_H_
+#define _RECORDABLE_AUDIO_FILE_H_
+
+#include "RingBuffer.h"
+#include "AudioFile.h"
+
+#include <vector>
+
+namespace Rosegarden
+{
+
+// A wrapper class for writing out a recording file. We assume the
+// data is provided by a process thread and the writes are requested
+// by a disk thread.
+//
+class RecordableAudioFile
+{
+public:
+ typedef float sample_t;
+
+ typedef enum
+ {
+ IDLE,
+ RECORDING,
+ DEFUNCT
+ } RecordStatus;
+
+ RecordableAudioFile(AudioFile *audioFile, // should be already open for writing
+ size_t bufferSize);
+ ~RecordableAudioFile();
+
+ void setStatus(const RecordStatus &status) { m_status = status; }
+ RecordStatus getStatus() const { return m_status; }
+
+ size_t buffer(const sample_t *data, int channel, size_t frames);
+ void write();
+
+protected:
+ AudioFile *m_audioFile;
+ RecordStatus m_status;
+
+ std::vector<RingBuffer<sample_t> *> m_ringBuffers; // one per channel
+};
+
+}
+
+#endif
diff --git a/src/sound/RingBuffer.h b/src/sound/RingBuffer.h
new file mode 100644
index 0000000..0cc5dc6
--- /dev/null
+++ b/src/sound/RingBuffer.h
@@ -0,0 +1,572 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RINGBUFFER_H_
+#define _RINGBUFFER_H_
+
+#include <sys/types.h>
+#include <sys/mman.h>
+
+#include "Scavenger.h"
+
+//#define DEBUG_RINGBUFFER 1
+//#define DEBUG_RINGBUFFER_CREATE_DESTROY 1
+
+#ifdef DEBUG_RINGBUFFER
+#define DEBUG_RINGBUFFER_CREATE_DESTROY 1
+#endif
+
+#ifdef DEBUG_RINGBUFFER_CREATE_DESTROY
+#include <iostream>
+static int __extant_ringbuffers = 0;
+#endif
+
+namespace Rosegarden {
+
+/**
+ * RingBuffer implements a lock-free ring buffer for one writer and N
+ * readers, that is to be used to store a sample type T.
+ *
+ * For efficiency, RingBuffer frequently initialises samples by
+ * writing zeroes into their memory space, so T should normally be a
+ * simple type that can safely be set to zero using memset.
+ */
+
+template <typename T, int N = 1>
+class RingBuffer
+{
+public:
+ /**
+ * Create a ring buffer with room to write n samples.
+ *
+ * Note that the internal storage size will actually be n+1
+ * samples, as one element is unavailable for administrative
+ * reasons. Since the ring buffer performs best if its size is a
+ * power of two, this means n should ideally be some power of two
+ * minus one.
+ */
+ RingBuffer(size_t n);
+
+ virtual ~RingBuffer();
+
+ /**
+ * Return the total capacity of the ring buffer in samples.
+ * (This is the argument n passed to the constructor.)
+ */
+ size_t getSize() const;
+
+ /**
+ * Resize the ring buffer. This also empties it. Actually swaps
+ * in a new, larger buffer; the old buffer is scavenged after a
+ * seemly delay. Should be called from the write thread.
+ */
+ void resize(size_t newSize);
+
+ /**
+ * Lock the ring buffer into physical memory. Returns true
+ * for success.
+ */
+ bool mlock();
+
+ /**
+ * Unlock the ring buffer from physical memory. Returns true for
+ * success.
+ */
+ bool munlock();
+
+ /**
+ * Reset read and write pointers, thus emptying the buffer.
+ * Should be called from the write thread.
+ */
+ void reset();
+
+ /**
+ * Return the amount of data available for reading by reader R, in
+ * samples.
+ */
+ size_t getReadSpace(int R = 0) const;
+
+ /**
+ * Return the amount of space available for writing, in samples.
+ */
+ size_t getWriteSpace() const;
+
+ /**
+ * Read n samples from the buffer, for reader R. If fewer than n
+ * are available, the remainder will be zeroed out. Returns the
+ * number of samples actually read.
+ */
+ size_t read(T *destination, size_t n, int R = 0);
+
+ /**
+ * Read n samples from the buffer, for reader R, adding them to
+ * the destination. If fewer than n are available, the remainder
+ * will be left alone. Returns the number of samples actually
+ * read.
+ */
+ size_t readAdding(T *destination, size_t n, int R = 0);
+
+ /**
+ * Read one sample from the buffer, for reader R. If no sample is
+ * available, this will silently return zero. Calling this
+ * repeatedly is obviously slower than calling read once, but it
+ * may be good enough if you don't want to allocate a buffer to
+ * read into.
+ */
+ T readOne(int R = 0);
+
+ /**
+ * Read n samples from the buffer, if available, for reader R,
+ * without advancing the read pointer -- i.e. a subsequent read()
+ * or skip() will be necessary to empty the buffer. If fewer than
+ * n are available, the remainder will be zeroed out. Returns the
+ * number of samples actually read.
+ */
+ size_t peek(T *destination, size_t n, int R = 0) const;
+
+ /**
+ * Read one sample from the buffer, if available, without
+ * advancing the read pointer -- i.e. a subsequent read() or
+ * skip() will be necessary to empty the buffer. Returns zero if
+ * no sample was available.
+ */
+ T peek(int R = 0) const;
+
+ /**
+ * Pretend to read n samples from the buffer, for reader R,
+ * without actually returning them (i.e. discard the next n
+ * samples). Returns the number of samples actually available for
+ * discarding.
+ */
+ size_t skip(size_t n, int R = 0);
+
+ /**
+ * Write n samples to the buffer. If insufficient space is
+ * available, not all samples may actually be written. Returns
+ * the number of samples actually written.
+ */
+ size_t write(const T *source, size_t n);
+
+ /**
+ * Write n zero-value samples to the buffer. If insufficient
+ * space is available, not all zeros may actually be written.
+ * Returns the number of zeroes actually written.
+ */
+ size_t zero(size_t n);
+
+protected:
+ T *m_buffer;
+ volatile size_t m_writer;
+ volatile size_t m_readers[N];
+ size_t m_size;
+ bool m_mlocked;
+
+ static Scavenger<ScavengerArrayWrapper<T> > m_scavenger;
+
+private:
+ RingBuffer(const RingBuffer &); // not provided
+ RingBuffer &operator=(const RingBuffer &); // not provided
+};
+
+template <typename T, int N>
+Scavenger<ScavengerArrayWrapper<T> > RingBuffer<T, N>::m_scavenger;
+
+template <typename T, int N>
+RingBuffer<T, N>::RingBuffer(size_t n) :
+ m_buffer(new T[n + 1]),
+ m_writer(0),
+ m_size(n + 1),
+ m_mlocked(false)
+{
+#ifdef DEBUG_RINGBUFFER_CREATE_DESTROY
+ std::cerr << "RingBuffer<T," << N << ">[" << this << "]::RingBuffer(" << n << ") [now have " << (++__extant_ringbuffers) << "]" << std::endl;
+#endif
+
+ for (int i = 0; i < N; ++i) m_readers[i] = 0;
+
+ m_scavenger.scavenge();
+}
+
+template <typename T, int N>
+RingBuffer<T, N>::~RingBuffer()
+{
+#ifdef DEBUG_RINGBUFFER_CREATE_DESTROY
+ std::cerr << "RingBuffer<T," << N << ">[" << this << "]::~RingBuffer [now have " << (--__extant_ringbuffers) << "]" << std::endl;
+#endif
+
+ if (m_mlocked) {
+ ::munlock((void *)m_buffer, m_size * sizeof(T));
+ }
+ delete[] m_buffer;
+
+ m_scavenger.scavenge();
+}
+
+template <typename T, int N>
+size_t
+RingBuffer<T, N>::getSize() const
+{
+#ifdef DEBUG_RINGBUFFER
+ std::cerr << "RingBuffer<T," << N << ">[" << this << "]::getSize(): " << m_size-1 << std::endl;
+#endif
+
+ return m_size - 1;
+}
+
+template <typename T, int N>
+void
+RingBuffer<T, N>::resize(size_t newSize)
+{
+#ifdef DEBUG_RINGBUFFER_CREATE_DESTROY
+ std::cerr << "RingBuffer<T," << N << ">[" << this << "]::resize(" << newSize << ")" << std::endl;
+#endif
+
+ m_scavenger.scavenge();
+
+ if (m_mlocked) {
+ ::munlock((void *)m_buffer, m_size * sizeof(T));
+ }
+
+ m_scavenger.claim(new ScavengerArrayWrapper<T>(m_buffer));
+
+ reset();
+ m_buffer = new T[newSize + 1];
+ m_size = newSize + 1;
+
+ if (m_mlocked) {
+ if (::mlock((void *)m_buffer, m_size * sizeof(T))) {
+ m_mlocked = false;
+ }
+ }
+}
+
+template <typename T, int N>
+bool
+RingBuffer<T, N>::mlock()
+{
+ if (::mlock((void *)m_buffer, m_size * sizeof(T))) return false;
+ m_mlocked = true;
+ return true;
+}
+
+template <typename T, int N>
+bool
+RingBuffer<T, N>::munlock()
+{
+ if (::munlock((void *)m_buffer, m_size * sizeof(T))) return false;
+ m_mlocked = false;
+ return true;
+}
+
+template <typename T, int N>
+void
+RingBuffer<T, N>::reset()
+{
+#ifdef DEBUG_RINGBUFFER
+ std::cerr << "RingBuffer<T," << N << ">[" << this << "]::reset" << std::endl;
+#endif
+
+ m_writer = 0;
+ for (int i = 0; i < N; ++i) m_readers[i] = 0;
+}
+
+template <typename T, int N>
+size_t
+RingBuffer<T, N>::getReadSpace(int R) const
+{
+ size_t writer = m_writer;
+ size_t reader = m_readers[R];
+ size_t space = 0;
+
+ if (writer > reader) space = writer - reader;
+ else space = ((writer + m_size) - reader) % m_size;
+
+#ifdef DEBUG_RINGBUFFER
+ std::cerr << "RingBuffer<T," << N << ">[" << this << "]::getReadSpace(" << R << "): " << space << std::endl;
+#endif
+
+ return space;
+}
+
+template <typename T, int N>
+size_t
+RingBuffer<T, N>::getWriteSpace() const
+{
+ size_t space = 0;
+ for (int i = 0; i < N; ++i) {
+ size_t here = (m_readers[i] + m_size - m_writer - 1) % m_size;
+ if (i == 0 || here < space) space = here;
+ }
+
+#ifdef DEBUG_RINGBUFFER
+ size_t rs(getReadSpace()), rp(m_readers[0]);
+
+ std::cerr << "RingBuffer: write space " << space << ", read space "
+ << rs << ", total " << (space + rs) << ", m_size " << m_size << std::endl;
+ std::cerr << "RingBuffer: reader " << rp << ", writer " << m_writer << std::endl;
+#endif
+
+#ifdef DEBUG_RINGBUFFER
+ std::cerr << "RingBuffer<T," << N << ">[" << this << "]::getWriteSpace(): " << space << std::endl;
+#endif
+
+ return space;
+}
+
+template <typename T, int N>
+size_t
+RingBuffer<T, N>::read(T *destination, size_t n, int R)
+{
+#ifdef DEBUG_RINGBUFFER
+ std::cerr << "RingBuffer<T," << N << ">[" << this << "]::read(dest, " << n << ", " << R << ")" << std::endl;
+#endif
+
+ size_t available = getReadSpace(R);
+ if (n > available) {
+#ifdef DEBUG_RINGBUFFER
+ std::cerr << "WARNING: Only " << available << " samples available"
+ << std::endl;
+#endif
+ memset(destination + available, 0, (n - available) * sizeof(T));
+ n = available;
+ }
+ if (n == 0) return n;
+
+ size_t here = m_size - m_readers[R];
+ if (here >= n) {
+ memcpy(destination, m_buffer + m_readers[R], n * sizeof(T));
+ } else {
+ memcpy(destination, m_buffer + m_readers[R], here * sizeof(T));
+ memcpy(destination + here, m_buffer, (n - here) * sizeof(T));
+ }
+
+ m_readers[R] = (m_readers[R] + n) % m_size;
+
+#ifdef DEBUG_RINGBUFFER
+ std::cerr << "RingBuffer<T," << N << ">[" << this << "]::read: read " << n << ", reader now " << m_readers[R] << std::endl;
+#endif
+
+ return n;
+}
+
+template <typename T, int N>
+size_t
+RingBuffer<T, N>::readAdding(T *destination, size_t n, int R)
+{
+#ifdef DEBUG_RINGBUFFER
+ std::cerr << "RingBuffer<T," << N << ">[" << this << "]::readAdding(dest, " << n << ", " << R << ")" << std::endl;
+#endif
+
+ size_t available = getReadSpace(R);
+ if (n > available) {
+#ifdef DEBUG_RINGBUFFER
+ std::cerr << "WARNING: Only " << available << " samples available"
+ << std::endl;
+#endif
+ n = available;
+ }
+ if (n == 0) return n;
+
+ size_t here = m_size - m_readers[R];
+
+ if (here >= n) {
+ for (size_t i = 0; i < n; ++i) {
+ destination[i] += (m_buffer + m_readers[R])[i];
+ }
+ } else {
+ for (size_t i = 0; i < here; ++i) {
+ destination[i] += (m_buffer + m_readers[R])[i];
+ }
+ for (size_t i = 0; i < (n - here); ++i) {
+ destination[i + here] += m_buffer[i];
+ }
+ }
+
+ m_readers[R] = (m_readers[R] + n) % m_size;
+ return n;
+}
+
+template <typename T, int N>
+T
+RingBuffer<T, N>::readOne(int R)
+{
+#ifdef DEBUG_RINGBUFFER
+ std::cerr << "RingBuffer<T," << N << ">[" << this << "]::readOne(" << R << ")" << std::endl;
+#endif
+
+ if (m_writer == m_readers[R]) {
+#ifdef DEBUG_RINGBUFFER
+ std::cerr << "WARNING: No sample available"
+ << std::endl;
+#endif
+ T t;
+ memset(&t, 0, sizeof(T));
+ return t;
+ }
+ T value = m_buffer[m_readers[R]];
+ if (++m_readers[R] == m_size) m_readers[R] = 0;
+ return value;
+}
+
+template <typename T, int N>
+size_t
+RingBuffer<T, N>::peek(T *destination, size_t n, int R) const
+{
+#ifdef DEBUG_RINGBUFFER
+ std::cerr << "RingBuffer<T," << N << ">[" << this << "]::peek(dest, " << n << ", " << R << ")" << std::endl;
+#endif
+
+ size_t available = getReadSpace(R);
+ if (n > available) {
+#ifdef DEBUG_RINGBUFFER
+ std::cerr << "WARNING: Only " << available << " samples available"
+ << std::endl;
+#endif
+ memset(destination + available, 0, (n - available) * sizeof(T));
+ n = available;
+ }
+ if (n == 0) return n;
+
+ size_t here = m_size - m_readers[R];
+ if (here >= n) {
+ memcpy(destination, m_buffer + m_readers[R], n * sizeof(T));
+ } else {
+ memcpy(destination, m_buffer + m_readers[R], here * sizeof(T));
+ memcpy(destination + here, m_buffer, (n - here) * sizeof(T));
+ }
+
+#ifdef DEBUG_RINGBUFFER
+ std::cerr << "RingBuffer<T," << N << ">[" << this << "]::peek: read " << n << std::endl;
+#endif
+
+ return n;
+}
+
+template <typename T, int N>
+T
+RingBuffer<T, N>::peek(int R) const
+{
+#ifdef DEBUG_RINGBUFFER
+ std::cerr << "RingBuffer<T," << N << ">[" << this << "]::peek(" << R << ")" << std::endl;
+#endif
+
+ if (m_writer == m_readers[R]) {
+#ifdef DEBUG_RINGBUFFER
+ std::cerr << "WARNING: No sample available"
+ << std::endl;
+#endif
+ T t;
+ memset(&t, 0, sizeof(T));
+ return t;
+ }
+ T value = m_buffer[m_readers[R]];
+ return value;
+}
+
+template <typename T, int N>
+size_t
+RingBuffer<T, N>::skip(size_t n, int R)
+{
+#ifdef DEBUG_RINGBUFFER
+ std::cerr << "RingBuffer<T," << N << ">[" << this << "]::skip(" << n << ", " << R << ")" << std::endl;
+#endif
+
+ size_t available = getReadSpace(R);
+ if (n > available) {
+#ifdef DEBUG_RINGBUFFER
+ std::cerr << "WARNING: Only " << available << " samples available"
+ << std::endl;
+#endif
+ n = available;
+ }
+ if (n == 0) return n;
+ m_readers[R] = (m_readers[R] + n) % m_size;
+ return n;
+}
+
+template <typename T, int N>
+size_t
+RingBuffer<T, N>::write(const T *source, size_t n)
+{
+#ifdef DEBUG_RINGBUFFER
+ std::cerr << "RingBuffer<T," << N << ">[" << this << "]::write(" << n << ")" << std::endl;
+#endif
+
+ size_t available = getWriteSpace();
+ if (n > available) {
+#ifdef DEBUG_RINGBUFFER
+ std::cerr << "WARNING: Only room for " << available << " samples"
+ << std::endl;
+#endif
+ n = available;
+ }
+ if (n == 0) return n;
+
+ size_t here = m_size - m_writer;
+ if (here >= n) {
+ memcpy(m_buffer + m_writer, source, n * sizeof(T));
+ } else {
+ memcpy(m_buffer + m_writer, source, here * sizeof(T));
+ memcpy(m_buffer, source + here, (n - here) * sizeof(T));
+ }
+
+ m_writer = (m_writer + n) % m_size;
+
+#ifdef DEBUG_RINGBUFFER
+ std::cerr << "RingBuffer<T," << N << ">[" << this << "]::write: wrote " << n << ", writer now " << m_writer << std::endl;
+#endif
+
+ return n;
+}
+
+template <typename T, int N>
+size_t
+RingBuffer<T, N>::zero(size_t n)
+{
+#ifdef DEBUG_RINGBUFFER
+ std::cerr << "RingBuffer<T," << N << ">[" << this << "]::zero(" << n << ")" << std::endl;
+#endif
+
+ size_t available = getWriteSpace();
+ if (n > available) {
+#ifdef DEBUG_RINGBUFFER
+ std::cerr << "WARNING: Only room for " << available << " samples"
+ << std::endl;
+#endif
+ n = available;
+ }
+ if (n == 0) return n;
+
+ size_t here = m_size - m_writer;
+ if (here >= n) {
+ memset(m_buffer + m_writer, 0, n * sizeof(T));
+ } else {
+ memset(m_buffer + m_writer, 0, here * sizeof(T));
+ memset(m_buffer, 0, (n - here) * sizeof(T));
+ }
+
+ m_writer = (m_writer + n) % m_size;
+ return n;
+}
+
+}
+
+#endif // _RINGBUFFER_H_
diff --git a/src/sound/RosegardenMidiRecord.mcopclass b/src/sound/RosegardenMidiRecord.mcopclass
new file mode 100644
index 0000000..41593f1
--- /dev/null
+++ b/src/sound/RosegardenMidiRecord.mcopclass
@@ -0,0 +1,5 @@
+Interface=RosegardenMidiRecord, Arts::MidiPort, Arts::Object
+Library=libRosegardenSequencer.la
+Language=C++
+Author="Richard Bown <[email protected]>", "Guillaume Laurent <[email protected]>", "Chris Cannam <[email protected]>"
+URL="http://home"
diff --git a/src/sound/RunnablePluginInstance.cpp b/src/sound/RunnablePluginInstance.cpp
new file mode 100644
index 0000000..820aaf9
--- /dev/null
+++ b/src/sound/RunnablePluginInstance.cpp
@@ -0,0 +1,42 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include "RunnablePluginInstance.h"
+#include "PluginFactory.h"
+
+#include <iostream>
+
+namespace Rosegarden
+{
+
+RunnablePluginInstance::~RunnablePluginInstance()
+{
+// std::cerr << "RunnablePluginInstance::~RunnablePluginInstance" << std::endl;
+
+ if (m_factory) {
+// std::cerr << "Asking factory to release " << m_identifier << std::endl;
+
+ m_factory->releasePlugin(this, m_identifier);
+ }
+}
+
+}
+
diff --git a/src/sound/RunnablePluginInstance.h b/src/sound/RunnablePluginInstance.h
new file mode 100644
index 0000000..f15f146
--- /dev/null
+++ b/src/sound/RunnablePluginInstance.h
@@ -0,0 +1,114 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _RUNNABLE_PLUGIN_INSTANCE_H_
+#define _RUNNABLE_PLUGIN_INSTANCE_H_
+
+#include <qstring.h>
+#include <qstringlist.h>
+#include <vector>
+
+#include "RealTime.h"
+
+namespace Rosegarden
+{
+
+class PluginFactory;
+
+/**
+ * RunnablePluginInstance is a very trivial interface that an audio
+ * process can use to refer to an instance of a plugin without needing
+ * to know what type of plugin it is.
+ *
+ * The audio code calls run() on an instance that has been passed to
+ * it, and assumes that the passing code has already initialised the
+ * plugin, connected its inputs and outputs and so on, and that there
+ * is an understanding in place about the sizes of the buffers in use
+ * by the plugin. All of this depends on the subclass implementation.
+ */
+
+class RunnablePluginInstance
+{
+public:
+ typedef float sample_t;
+
+ virtual ~RunnablePluginInstance();
+
+ virtual bool isOK() const = 0;
+
+ virtual QString getIdentifier() const = 0;
+
+ /**
+ * Run for one block, starting at the given time. The start time
+ * may be of interest to synths etc that may have queued events
+ * waiting. Other plugins can ignore it.
+ */
+ virtual void run(const RealTime &blockStartTime) = 0;
+
+ virtual size_t getBufferSize() = 0;
+
+ virtual size_t getAudioInputCount() = 0;
+ virtual size_t getAudioOutputCount() = 0;
+
+ virtual sample_t **getAudioInputBuffers() = 0;
+ virtual sample_t **getAudioOutputBuffers() = 0;
+
+ virtual QStringList getPrograms() { return QStringList(); }
+ virtual QString getCurrentProgram() { return QString(); }
+ virtual QString getProgram(int /* bank */, int /* program */) { return QString(); }
+ virtual unsigned long getProgram(QString /* name */) { return 0; } // bank << 16 + program
+ virtual void selectProgram(QString) { }
+
+ virtual void setPortValue(unsigned int port, float value) = 0;
+ virtual float getPortValue(unsigned int port) = 0;
+
+ virtual QString configure(QString /* key */, QString /* value */) { return QString(); }
+
+ virtual void sendEvent(const RealTime & /* eventTime */,
+ const void * /* event */) { }
+
+ virtual bool isBypassed() const = 0;
+ virtual void setBypassed(bool value) = 0;
+
+ // This should be called after setup, but while not actually playing.
+ virtual size_t getLatency() = 0;
+
+ virtual void silence() = 0;
+ virtual void discardEvents() { }
+ virtual void setIdealChannelCount(size_t channels) = 0; // must also silence(); may also re-instantiate
+
+ void setFactory(PluginFactory *f) { m_factory = f; } // ew
+
+protected:
+ RunnablePluginInstance(PluginFactory *factory, QString identifier) :
+ m_factory(factory), m_identifier(identifier) { }
+
+ PluginFactory *m_factory;
+ QString m_identifier;
+
+ friend class PluginFactory;
+};
+
+typedef std::vector<RunnablePluginInstance *> RunnablePluginInstances;
+
+}
+
+#endif
diff --git a/src/sound/SF2PatchExtractor.cpp b/src/sound/SF2PatchExtractor.cpp
new file mode 100644
index 0000000..6ba8dc5
--- /dev/null
+++ b/src/sound/SF2PatchExtractor.cpp
@@ -0,0 +1,217 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include "SF2PatchExtractor.h"
+
+#include <iostream>
+#include <fstream>
+#include <string>
+#include <map>
+#include <sys/types.h>
+
+namespace Rosegarden
+{
+
+using std::string;
+using std::cerr;
+using std::endl;
+using std::ifstream;
+using std::ios;
+
+
+struct Chunk
+{
+ char id[4];
+ u_int32_t size;
+
+ Chunk(ifstream *, bool idOnly = false);
+ bool isa(std::string s);
+};
+
+Chunk::Chunk(ifstream *file, bool idOnly)
+{
+ file->read((char *)this->id, 4);
+ size = 0;
+
+ if (idOnly)
+ return ;
+
+ unsigned char sz[4];
+ file->read((char *)sz, 4);
+ for (int i = 0; i < 4; ++i)
+ size += sz[i] << (i * 8);
+}
+
+bool
+Chunk::isa(string s)
+{
+ return string(id, 4) == s;
+}
+
+bool
+SF2PatchExtractor::isSF2File(string fileName)
+{
+ ifstream *file = new ifstream(fileName.c_str(), ios::in | ios::binary);
+ if (!file)
+ throw FileNotFoundException();
+
+ Chunk riffchunk(file);
+ if (!riffchunk.isa("RIFF")) {
+ file->close();
+ return false;
+ }
+
+ Chunk sfbkchunk(file, true);
+ if (!sfbkchunk.isa("sfbk")) {
+ file->close();
+ return false;
+ }
+
+ file->close();
+ return true;
+}
+
+SF2PatchExtractor::Device
+SF2PatchExtractor::read(string fileName)
+{
+ Device device;
+
+ ifstream *file = new ifstream(fileName.c_str(), ios::in | ios::binary);
+ if (!file)
+ throw FileNotFoundException();
+
+ Chunk riffchunk(file);
+ if (!riffchunk.isa("RIFF")) {
+ file->close();
+ throw WrongFileFormatException();
+ }
+
+ Chunk sfbkchunk(file, true);
+ if (!sfbkchunk.isa("sfbk")) {
+ file->close();
+ throw WrongFileFormatException();
+ }
+
+ while (!file->eof()) {
+
+ Chunk chunk(file);
+
+ if (!chunk.isa("LIST")) {
+ // cerr << "Skipping " << string(chunk.id, 4) << endl;
+ file->seekg(chunk.size, ios::cur);
+ continue;
+ }
+
+ Chunk listchunk(file, true);
+ if (!listchunk.isa("pdta")) {
+ // cerr << "Skipping " << string(id, 4) << endl;
+ file->seekg(chunk.size - 4, ios::cur);
+ continue;
+ }
+
+ int size = chunk.size - 4;
+ while (size > 0) {
+
+ Chunk pdtachunk(file);
+ size -= 8 + pdtachunk.size;
+ if (file->eof()) {
+ break;
+ }
+
+ if (!pdtachunk.isa("phdr")) { // preset header
+ // cerr << "Skipping " << string(pdtachunk.id, 4) << endl;
+ file->seekg(pdtachunk.size, ios::cur);
+ continue;
+ }
+
+ int presets = pdtachunk.size / 38;
+ for (int i = 0; i < presets; ++i) {
+
+ char name[21];
+ u_int16_t bank, program;
+
+ file->read((char *)name, 20);
+ name[20] = '\0';
+ file->read((char *)&program, 2);
+ file->read((char *)&bank, 2);
+
+ // cerr << "Read name as " << name << endl;
+
+ file->seekg(14, ios::cur);
+
+ if (i == presets - 1 &&
+ bank == 255 &&
+ program == 255 &&
+ string(name) == "EOP")
+ continue;
+
+ device[bank][program] = name;
+ }
+ }
+ }
+
+ file->close();
+ return device;
+}
+
+}
+
+
+#ifdef TEST_SF2_PATCH_EXTRACTOR
+
+int main(int argc, char **argv)
+{
+ using SF2PatchExtractor;
+
+ if (argc != 2) {
+ std::cerr << "Usage: " << argv[0] << " sf2filename" << std::endl;
+ return 2;
+ }
+
+ try {
+ SF2PatchExtractor::Device device =
+ SF2PatchExtractor::read(argv[1]);
+
+ std::cerr << "Done. Presets are:" << std::endl;
+
+ for (SF2PatchExtractor::Device::iterator di = device.begin();
+ di != device.end(); ++di) {
+
+ std::cerr << "Bank " << di->first << ":" << std::endl;
+
+ for (SF2PatchExtractor::Bank::iterator bi = di->second.begin();
+ bi != di->second.end();
+ ++bi) {
+
+ std::cerr << "Program " << bi->first << ": \"" << bi->second
+ << "\"" << std::endl;
+ }
+ }
+ } catch (SF2PatchExtractor::WrongFileFormatException) {
+ std::cerr << "Wrong file format" << std::endl;
+ } catch (SF2PatchExtractor::FileNotFoundException) {
+ std::cerr << "File not found or couldn't be opened" << std::endl;
+ }
+
+ return 0;
+}
+
+#endif
diff --git a/src/sound/SF2PatchExtractor.h b/src/sound/SF2PatchExtractor.h
new file mode 100644
index 0000000..a9d5453
--- /dev/null
+++ b/src/sound/SF2PatchExtractor.h
@@ -0,0 +1,58 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _SF2_PATCH_EXTRACTOR_H_
+#define _SF2_PATCH_EXTRACTOR_H_
+
+#include <string>
+#include <map>
+
+namespace Rosegarden {
+
+/**
+ * Trivial class to suck the patch map out of a .sf2 SoundFont file.
+ * Inspired by (but not based on) sftovkb by Takashi Iwai.
+ *
+ * SoundFont is a straightforward RIFF format so there's some
+ * redundancy between this and RIFFAudioFile -- we don't take any
+ * advantage of that, and this class is completely self-contained.
+ *
+ * Tolerates garbled files; will just suck all it can rather than
+ * throw an error, except if the file is not a SoundFont at all.
+ */
+
+class SF2PatchExtractor
+{
+public:
+ typedef std::map<int, std::string> Bank;
+ typedef std::map<int, Bank> Device;
+
+ struct FileNotFoundException { };
+ struct WrongFileFormatException { };
+
+ static bool isSF2File(std::string fileName);
+ static Device read(std::string fileName);
+};
+
+}
+
+#endif
+
diff --git a/src/sound/SampleWindow.h b/src/sound/SampleWindow.h
new file mode 100644
index 0000000..88400f7
--- /dev/null
+++ b/src/sound/SampleWindow.h
@@ -0,0 +1,192 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+/*
+ This file is derived from
+
+ Sonic Visualiser
+ An audio file viewer and annotation editor.
+ Centre for Digital Music, Queen Mary, University of London.
+ This file copyright 2006 Chris Cannam.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _SAMPLE_WINDOW_H_
+#define _SAMPLE_WINDOW_H_
+
+#include <cmath>
+#include <cstdlib>
+#include <iostream>
+#include <map>
+
+namespace Rosegarden
+{
+
+template <typename T>
+class SampleWindow
+{
+public:
+ enum Type {
+ Rectangular,
+ Bartlett,
+ Hamming,
+ Hanning,
+ Blackman,
+ Gaussian,
+ Parzen,
+ Nuttall,
+ BlackmanHarris
+ };
+
+ /**
+ * Construct a windower of the given type.
+ */
+ SampleWindow(Type type, size_t size) : m_type(type), m_size(size) { encache(); }
+ SampleWindow(const SampleWindow &w) : m_type(w.m_type), m_size(w.m_size) { encache(); }
+ SampleWindow &operator=(const SampleWindow &w) {
+ if (&w == this) return *this;
+ m_type = w.m_type;
+ m_size = w.m_size;
+ encache();
+ return *this;
+ }
+ virtual ~SampleWindow() { delete[] m_cache; }
+
+ void cut(T *src) const { cut(src, src); }
+ void cut(T *src, T *dst) const {
+ for (size_t i = 0; i < m_size; ++i) dst[i] = src[i] * m_cache[i];
+ }
+
+ T getArea() { return m_area; }
+ T getValue(size_t i) { return m_cache[i]; }
+
+ Type getType() const { return m_type; }
+ size_t getSize() const { return m_size; }
+
+protected:
+ Type m_type;
+ size_t m_size;
+ T *m_cache;
+ T m_area;
+
+ void encache();
+ void cosinewin(T *, T, T, T, T);
+};
+
+template <typename T>
+void SampleWindow<T>::encache()
+{
+ int n = int(m_size);
+ T *mult = new T[n];
+ int i;
+ for (i = 0; i < n; ++i) mult[i] = 1.0;
+
+ switch (m_type) {
+
+ case Rectangular:
+ for (i = 0; i < n; ++i) {
+ mult[i] *= 0.5;
+ }
+ break;
+
+ case Bartlett:
+ for (i = 0; i < n/2; ++i) {
+ mult[i] *= (i / T(n/2));
+ mult[i + n/2] *= (1.0 - (i / T(n/2)));
+ }
+ break;
+
+ case Hamming:
+ cosinewin(mult, 0.54, 0.46, 0.0, 0.0);
+ break;
+
+ case Hanning:
+ cosinewin(mult, 0.50, 0.50, 0.0, 0.0);
+ break;
+
+ case Blackman:
+ cosinewin(mult, 0.42, 0.50, 0.08, 0.0);
+ break;
+
+ case Gaussian:
+ for (i = 0; i < n; ++i) {
+ mult[i] *= pow(2, - pow((i - (n-1)/2.0) / ((n-1)/2.0 / 3), 2));
+ }
+ break;
+
+ case Parzen:
+ {
+ int N = n-1;
+ for (i = 0; i < N/4; ++i) {
+ T m = 2 * pow(1.0 - (T(N)/2 - i) / (T(N)/2), 3);
+ mult[i] *= m;
+ mult[N-i] *= m;
+ }
+ for (i = N/4; i <= N/2; ++i) {
+ int wn = i - N/2;
+ T m = 1.0 - 6 * pow(wn / (T(N)/2), 2) * (1.0 - abs(wn) / (T(N)/2));
+ mult[i] *= m;
+ mult[N-i] *= m;
+ }
+ break;
+ }
+
+ case Nuttall:
+ cosinewin(mult, 0.3635819, 0.4891775, 0.1365995, 0.0106411);
+ break;
+
+ case BlackmanHarris:
+ cosinewin(mult, 0.35875, 0.48829, 0.14128, 0.01168);
+ break;
+ }
+
+ m_cache = mult;
+
+ m_area = 0;
+ for (int i = 0; i < n; ++i) {
+ m_area += m_cache[i];
+ }
+ m_area /= n;
+}
+
+template <typename T>
+void SampleWindow<T>::cosinewin(T *mult, T a0, T a1, T a2, T a3)
+{
+ int n = int(m_size);
+ for (int i = 0; i < n; ++i) {
+ mult[i] *= (a0
+ - a1 * cos(2 * M_PI * i / n)
+ + a2 * cos(4 * M_PI * i / n)
+ - a3 * cos(6 * M_PI * i / n));
+ }
+}
+
+}
+
+#endif
diff --git a/src/sound/Scavenger.h b/src/sound/Scavenger.h
new file mode 100644
index 0000000..b27e848
--- /dev/null
+++ b/src/sound/Scavenger.h
@@ -0,0 +1,211 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _SCAVENGER_H_
+#define _SCAVENGER_H_
+
+#include <vector>
+#include <list>
+#include <sys/time.h>
+#include <pthread.h>
+#include <iostream>
+
+namespace Rosegarden
+{
+
+/**
+ * A very simple class that facilitates running things like plugins
+ * without locking, by collecting unwanted objects and deleting them
+ * after a delay so as to be sure nobody's in the middle of using
+ * them. Requires scavenge() to be called regularly from a non-RT
+ * thread.
+ *
+ * This is currently not at all suitable for large numbers of objects
+ * -- it's just a quick hack for use with things like plugins.
+ */
+
+template <typename T>
+class Scavenger
+{
+public:
+ Scavenger(int sec = 2, int defaultObjectListSize = 200);
+ ~Scavenger();
+
+ /**
+ * Call from an RT thread etc., to pass ownership of t to us for
+ * later disposal. Only one thread should be calling this on any
+ * given scavenger.
+ *
+ * This is only lock-free so long as a slot is available in the
+ * object list; otherwise it takes a lock and allocates memory.
+ * Scavengers should always be used with an object list size
+ * sufficient to ensure that enough slots are always available in
+ * normal use.
+ */
+ void claim(T *t);
+
+ /**
+ * Call from a non-RT thread.
+ * Only one thread should be calling this on any given scavenger.
+ */
+ void scavenge();
+
+protected:
+ typedef std::pair<T *, int> ObjectTimePair;
+ typedef std::vector<ObjectTimePair> ObjectTimeList;
+ ObjectTimeList m_objects;
+ int m_sec;
+
+ typedef std::list<T *> ObjectList;
+ ObjectList m_excess;
+ int m_lastExcess;
+ pthread_mutex_t m_excessMutex;
+ void pushExcess(T *);
+ void clearExcess(int);
+
+ unsigned int m_claimed;
+ unsigned int m_scavenged;
+};
+
+/**
+ * A wrapper to permit arrays to be scavenged.
+ */
+
+template <typename T>
+class ScavengerArrayWrapper
+{
+public:
+ ScavengerArrayWrapper(T *array) : m_array(array) { }
+ ~ScavengerArrayWrapper() { delete[] m_array; }
+
+private:
+ T *m_array;
+};
+
+
+template <typename T>
+Scavenger<T>::Scavenger(int sec, int defaultObjectListSize) :
+ m_objects(ObjectTimeList(defaultObjectListSize)),
+ m_sec(sec),
+ m_lastExcess(0),
+ m_claimed(0),
+ m_scavenged(0)
+{
+ pthread_mutex_init(&m_excessMutex, NULL);
+}
+
+template <typename T>
+Scavenger<T>::~Scavenger()
+{
+ if (m_scavenged < m_claimed) {
+ for (size_t i = 0; i < m_objects.size(); ++i) {
+ ObjectTimePair &pair = m_objects[i];
+ if (pair.first != 0) {
+ T *ot = pair.first;
+ pair.first = 0;
+ delete ot;
+ ++m_scavenged;
+ }
+ }
+ }
+
+ clearExcess(0);
+
+ pthread_mutex_destroy(&m_excessMutex);
+}
+
+template <typename T>
+void
+Scavenger<T>::claim(T *t)
+{
+ struct timeval tv;
+ (void)gettimeofday(&tv, 0);
+ int sec = tv.tv_sec;
+
+ for (size_t i = 0; i < m_objects.size(); ++i) {
+ ObjectTimePair &pair = m_objects[i];
+ if (pair.first == 0) {
+ pair.second = sec;
+ pair.first = t;
+ ++m_claimed;
+ return;
+ }
+ }
+
+ std::cerr << "WARNING: Scavenger::claim(" << t << "): run out of slots, "
+ << "using non-RT-safe method" << std::endl;
+ pushExcess(t);
+}
+
+template <typename T>
+void
+Scavenger<T>::scavenge()
+{
+ if (m_scavenged >= m_claimed) return;
+
+ struct timeval tv;
+ (void)gettimeofday(&tv, 0);
+ int sec = tv.tv_sec;
+
+ for (size_t i = 0; i < m_objects.size(); ++i) {
+ ObjectTimePair &pair = m_objects[i];
+ if (pair.first != 0 && pair.second + m_sec < sec) {
+ T *ot = pair.first;
+ pair.first = 0;
+ delete ot;
+ ++m_scavenged;
+ }
+ }
+
+ if (sec > m_lastExcess + m_sec) {
+ clearExcess(sec);
+ }
+}
+
+template <typename T>
+void
+Scavenger<T>::pushExcess(T *t)
+{
+ pthread_mutex_lock(&m_excessMutex);
+ m_excess.push_back(t);
+ struct timeval tv;
+ (void)gettimeofday(&tv, 0);
+ m_lastExcess = tv.tv_sec;
+ pthread_mutex_unlock(&m_excessMutex);
+}
+
+template <typename T>
+void
+Scavenger<T>::clearExcess(int sec)
+{
+ pthread_mutex_lock(&m_excessMutex);
+ for (typename ObjectList::iterator i = m_excess.begin();
+ i != m_excess.end(); ++i) {
+ delete *i;
+ }
+ m_excess.clear();
+ m_lastExcess = sec;
+ pthread_mutex_unlock(&m_excessMutex);
+}
+
+}
+
+#endif
diff --git a/src/sound/SequencerDataBlock.cpp b/src/sound/SequencerDataBlock.cpp
new file mode 100644
index 0000000..bc5e80b
--- /dev/null
+++ b/src/sound/SequencerDataBlock.cpp
@@ -0,0 +1,361 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include "SequencerDataBlock.h"
+#include "MappedComposition.h"
+
+namespace Rosegarden
+{
+
+SequencerDataBlock::SequencerDataBlock(bool initialise)
+{
+ if (initialise)
+ clearTemporaries();
+}
+
+bool
+SequencerDataBlock::getVisual(MappedEvent &ev) const
+{
+ static int eventIndex = 0;
+
+ if (!m_haveVisualEvent) {
+ return false;
+ } else {
+ int thisEventIndex = m_visualEventIndex;
+ if (thisEventIndex == eventIndex)
+ return false;
+ ev = *((MappedEvent *) & m_visualEvent);
+ eventIndex = thisEventIndex;
+ return true;
+ }
+}
+
+void
+SequencerDataBlock::setVisual(const MappedEvent *ev)
+{
+ m_haveVisualEvent = false;
+ if (ev) {
+ *((MappedEvent *)&m_visualEvent) = *ev;
+ ++m_visualEventIndex;
+ m_haveVisualEvent = true;
+ }
+}
+
+int
+SequencerDataBlock::getRecordedEvents(MappedComposition &mC) const
+{
+ static int readIndex = -1;
+
+ if (readIndex == -1) {
+ readIndex = m_recordEventIndex;
+ return 0;
+ }
+
+ int currentIndex = m_recordEventIndex;
+ int count = 0;
+
+ MappedEvent *recordBuffer = (MappedEvent *)m_recordBuffer;
+
+ while (readIndex != currentIndex) {
+ mC.insert(new MappedEvent(recordBuffer[readIndex]));
+ if (++readIndex == SEQUENCER_DATABLOCK_RECORD_BUFFER_SIZE)
+ readIndex = 0;
+ ++count;
+ }
+
+ return count;
+}
+
+void
+SequencerDataBlock::addRecordedEvents(MappedComposition *mC)
+{
+ // ringbuffer
+ int index = m_recordEventIndex;
+ MappedEvent *recordBuffer = (MappedEvent *)m_recordBuffer;
+
+ for (MappedComposition::iterator i = mC->begin(); i != mC->end(); ++i) {
+ recordBuffer[index] = **i;
+ if (++index == SEQUENCER_DATABLOCK_RECORD_BUFFER_SIZE)
+ index = 0;
+ }
+
+ m_recordEventIndex = index;
+}
+
+int
+SequencerDataBlock::instrumentToIndex(InstrumentId id) const
+{
+ int i;
+
+ for (i = 0; i < m_knownInstrumentCount; ++i) {
+ if (m_knownInstruments[i] == id)
+ return i;
+ }
+
+ return -1;
+}
+
+int
+SequencerDataBlock::instrumentToIndexCreating(InstrumentId id)
+{
+ int i;
+
+ for (i = 0; i < m_knownInstrumentCount; ++i) {
+ if (m_knownInstruments[i] == id)
+ return i;
+ }
+
+ if (i == SEQUENCER_DATABLOCK_MAX_NB_INSTRUMENTS) {
+ std::cerr << "ERROR: SequencerDataBlock::instrumentToIndexCreating("
+ << id << "): out of instrument index space" << std::endl;
+ return -1;
+ }
+
+ m_knownInstruments[i] = id;
+ ++m_knownInstrumentCount;
+ return i;
+}
+
+bool
+SequencerDataBlock::getInstrumentLevel(InstrumentId id,
+ LevelInfo &info) const
+{
+ static int lastUpdateIndex[SEQUENCER_DATABLOCK_MAX_NB_INSTRUMENTS];
+
+ int index = instrumentToIndex(id);
+ if (index < 0) {
+ info.level = info.levelRight = 0;
+ return false;
+ }
+
+ int currentUpdateIndex = m_levelUpdateIndices[index];
+ info = m_levels[index];
+
+ /*
+ std::cout << "SequencerDataBlock::getInstrumentLevel - "
+ << "id = " << id
+ << ", level = " << info.level << std::endl;
+ */
+
+ if (lastUpdateIndex[index] != currentUpdateIndex) {
+ lastUpdateIndex[index] = currentUpdateIndex;
+ return true;
+ } else {
+ return false; // no change
+ }
+}
+
+bool
+SequencerDataBlock::getInstrumentLevelForMixer(InstrumentId id,
+ LevelInfo &info) const
+{
+ static int lastUpdateIndex[SEQUENCER_DATABLOCK_MAX_NB_INSTRUMENTS];
+
+ int index = instrumentToIndex(id);
+ if (index < 0) {
+ info.level = info.levelRight = 0;
+ return false;
+ }
+
+ int currentUpdateIndex = m_levelUpdateIndices[index];
+ info = m_levels[index];
+
+ if (lastUpdateIndex[index] != currentUpdateIndex) {
+ lastUpdateIndex[index] = currentUpdateIndex;
+ return true;
+ } else {
+ return false; // no change
+ }
+}
+
+void
+SequencerDataBlock::setInstrumentLevel(InstrumentId id, const LevelInfo &info)
+{
+ int index = instrumentToIndexCreating(id);
+ if (index < 0)
+ return ;
+
+ m_levels[index] = info;
+ ++m_levelUpdateIndices[index];
+}
+
+bool
+SequencerDataBlock::getInstrumentRecordLevel(InstrumentId id, LevelInfo &info) const
+{
+ static int lastUpdateIndex[SEQUENCER_DATABLOCK_MAX_NB_INSTRUMENTS];
+
+ int index = instrumentToIndex(id);
+ if (index < 0) {
+ info.level = info.levelRight = 0;
+ return false;
+ }
+
+ int currentUpdateIndex = m_recordLevelUpdateIndices[index];
+ info = m_recordLevels[index];
+
+ if (lastUpdateIndex[index] != currentUpdateIndex) {
+ lastUpdateIndex[index] = currentUpdateIndex;
+ return true;
+ } else {
+ return false; // no change
+ }
+}
+
+bool
+SequencerDataBlock::getInstrumentRecordLevelForMixer(InstrumentId id, LevelInfo &info) const
+{
+ static int lastUpdateIndex[SEQUENCER_DATABLOCK_MAX_NB_INSTRUMENTS];
+
+ int index = instrumentToIndex(id);
+ if (index < 0) {
+ info.level = info.levelRight = 0;
+ return false;
+ }
+
+ int currentUpdateIndex = m_recordLevelUpdateIndices[index];
+ info = m_recordLevels[index];
+
+ if (lastUpdateIndex[index] != currentUpdateIndex) {
+ lastUpdateIndex[index] = currentUpdateIndex;
+ return true;
+ } else {
+ return false; // no change
+ }
+}
+
+void
+SequencerDataBlock::setInstrumentRecordLevel(InstrumentId id, const LevelInfo &info)
+{
+ int index = instrumentToIndexCreating(id);
+ if (index < 0)
+ return ;
+
+ m_recordLevels[index] = info;
+ ++m_recordLevelUpdateIndices[index];
+}
+
+void
+SequencerDataBlock::setTrackLevel(TrackId id, const LevelInfo &info)
+{
+ if (m_controlBlock) {
+ setInstrumentLevel(m_controlBlock->getInstrumentForTrack(id), info);
+ }
+}
+
+bool
+SequencerDataBlock::getTrackLevel(TrackId id, LevelInfo &info) const
+{
+ info.level = info.levelRight = 0;
+
+ if (m_controlBlock) {
+ return getInstrumentLevel(m_controlBlock->getInstrumentForTrack(id),
+ info);
+ }
+
+ return false;
+}
+
+bool
+SequencerDataBlock::getSubmasterLevel(int submaster, LevelInfo &info) const
+{
+ static int lastUpdateIndex[SEQUENCER_DATABLOCK_MAX_NB_SUBMASTERS];
+
+ if (submaster < 0 || submaster > SEQUENCER_DATABLOCK_MAX_NB_SUBMASTERS) {
+ info.level = info.levelRight = 0;
+ return false;
+ }
+
+ int currentUpdateIndex = m_submasterLevelUpdateIndices[submaster];
+ info = m_submasterLevels[submaster];
+
+ if (lastUpdateIndex[submaster] != currentUpdateIndex) {
+ lastUpdateIndex[submaster] = currentUpdateIndex;
+ return true;
+ } else {
+ return false; // no change
+ }
+}
+
+void
+SequencerDataBlock::setSubmasterLevel(int submaster, const LevelInfo &info)
+{
+ if (submaster < 0 || submaster > SEQUENCER_DATABLOCK_MAX_NB_SUBMASTERS) {
+ return ;
+ }
+
+ m_submasterLevels[submaster] = info;
+ ++m_submasterLevelUpdateIndices[submaster];
+}
+
+bool
+SequencerDataBlock::getMasterLevel(LevelInfo &level) const
+{
+ static int lastUpdateIndex = 0;
+
+ int currentIndex = m_masterLevelUpdateIndex;
+ level = m_masterLevel;
+
+ if (lastUpdateIndex != currentIndex) {
+ lastUpdateIndex = currentIndex;
+ return true;
+ } else {
+ return false;
+ }
+}
+
+void
+SequencerDataBlock::setMasterLevel(const LevelInfo &info)
+{
+ m_masterLevel = info;
+ ++m_masterLevelUpdateIndex;
+}
+
+void
+SequencerDataBlock::clearTemporaries()
+{
+ m_controlBlock = 0;
+ m_positionSec = 0;
+ m_positionNsec = 0;
+ m_visualEventIndex = 0;
+ *((MappedEvent *)&m_visualEvent) = MappedEvent();
+ m_haveVisualEvent = false;
+ m_recordEventIndex = 0;
+ //!!! m_recordLevel.level = 0;
+ //!!! m_recordLevel.levelRight = 0;
+ memset(m_knownInstruments, 0,
+ SEQUENCER_DATABLOCK_MAX_NB_INSTRUMENTS * sizeof(InstrumentId));
+ m_knownInstrumentCount = 0;
+ memset(m_levelUpdateIndices, 0,
+ SEQUENCER_DATABLOCK_MAX_NB_INSTRUMENTS * sizeof(int));
+ memset(m_levels, 0,
+ SEQUENCER_DATABLOCK_MAX_NB_INSTRUMENTS * sizeof(LevelInfo));
+ memset(m_submasterLevelUpdateIndices, 0,
+ SEQUENCER_DATABLOCK_MAX_NB_SUBMASTERS * sizeof(int));
+ memset(m_submasterLevels, 0,
+ SEQUENCER_DATABLOCK_MAX_NB_SUBMASTERS * sizeof(LevelInfo));
+ m_masterLevelUpdateIndex = 0;
+ m_masterLevel.level = 0;
+ m_masterLevel.levelRight = 0;
+
+}
+
+}
+
diff --git a/src/sound/SequencerDataBlock.h b/src/sound/SequencerDataBlock.h
new file mode 100644
index 0000000..2cfdefe
--- /dev/null
+++ b/src/sound/SequencerDataBlock.h
@@ -0,0 +1,140 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef _SEQUENCER_DATA_BLOCK_H_
+#define _SEQUENCER_DATA_BLOCK_H_
+
+#include "ControlBlock.h"
+#include "RealTime.h"
+#include "MappedEvent.h"
+
+namespace Rosegarden
+{
+
+/**
+ * ONLY PUT PLAIN DATA HERE - NO POINTERS EVER
+ * (and this struct mustn't have a constructor)
+ */
+struct LevelInfo
+{
+ int level;
+ int levelRight; // if stereo audio
+};
+
+class MappedComposition;
+
+
+#define SEQUENCER_DATABLOCK_MAX_NB_INSTRUMENTS 512 // can't be a symbol
+#define SEQUENCER_DATABLOCK_MAX_NB_SUBMASTERS 64 // can't be a symbol
+#define SEQUENCER_DATABLOCK_RECORD_BUFFER_SIZE 1024 // MIDI events
+
+class SequencerDataBlock
+{
+public:
+ /**
+ * Constructor only initialises memory if initialise is true
+ */
+ SequencerDataBlock(bool initialise);
+
+ RealTime getPositionPointer() const {
+ return RealTime(m_positionSec, m_positionNsec);
+ }
+ void setPositionPointer(const RealTime &rt) {
+ m_positionSec = rt.sec;
+ m_positionNsec = rt.nsec;
+ }
+
+ bool getVisual(MappedEvent &ev) const;
+ void setVisual(const MappedEvent *ev);
+
+ int getRecordedEvents(MappedComposition &) const;
+ void addRecordedEvents(MappedComposition *);
+
+ bool getTrackLevel(TrackId track, LevelInfo &) const;
+ void setTrackLevel(TrackId track, const LevelInfo &);
+
+ // Two of these to rather hamfistedly get around the fact
+ // we need to fetch this value twice - once from IPB,
+ // and again for the Mixer.
+ //
+ bool getInstrumentLevel(InstrumentId id, LevelInfo &) const;
+ bool getInstrumentLevelForMixer(InstrumentId id, LevelInfo &) const;
+
+ void setInstrumentLevel(InstrumentId id, const LevelInfo &);
+
+ bool getInstrumentRecordLevel(InstrumentId id, LevelInfo &) const;
+ bool getInstrumentRecordLevelForMixer(InstrumentId id, LevelInfo &) const;
+
+ void setInstrumentRecordLevel(InstrumentId id, const LevelInfo &);
+
+ bool getSubmasterLevel(int submaster, LevelInfo &) const;
+ void setSubmasterLevel(int submaster, const LevelInfo &);
+
+ bool getMasterLevel(LevelInfo &) const;
+ void setMasterLevel(const LevelInfo &);
+
+ void setControlBlock(ControlBlock *cb) { m_controlBlock = cb; }
+ ControlBlock *getControlBlock() { return m_controlBlock; }
+
+ // Reset the temporaries on (for example) GUI restart
+ //
+ void clearTemporaries();
+
+protected:
+ int instrumentToIndex(InstrumentId id) const;
+ int instrumentToIndexCreating(InstrumentId id);
+ ControlBlock *m_controlBlock;
+
+ // Two ints rather than a RealTime, as the RealTime default ctor
+ // initialises the space & so can't be used from the GUI's
+ // placement-new ctor (which has no write access and doesn't want
+ // it anyway). Likewise we use char[] instead of MappedEvents
+
+ int m_positionSec;
+ int m_positionNsec;
+
+ int m_visualEventIndex;
+ bool m_haveVisualEvent;
+ char m_visualEvent[sizeof(MappedEvent)];
+
+ int m_recordEventIndex;
+ char m_recordBuffer[sizeof(MappedEvent) *
+ SEQUENCER_DATABLOCK_RECORD_BUFFER_SIZE];
+
+ InstrumentId m_knownInstruments[SEQUENCER_DATABLOCK_MAX_NB_INSTRUMENTS];
+ int m_knownInstrumentCount;
+
+ int m_levelUpdateIndices[SEQUENCER_DATABLOCK_MAX_NB_INSTRUMENTS];
+ LevelInfo m_levels[SEQUENCER_DATABLOCK_MAX_NB_INSTRUMENTS];
+
+ int m_recordLevelUpdateIndices[SEQUENCER_DATABLOCK_MAX_NB_INSTRUMENTS];
+ LevelInfo m_recordLevels[SEQUENCER_DATABLOCK_MAX_NB_INSTRUMENTS];
+
+ int m_submasterLevelUpdateIndices[SEQUENCER_DATABLOCK_MAX_NB_SUBMASTERS];
+ LevelInfo m_submasterLevels[SEQUENCER_DATABLOCK_MAX_NB_SUBMASTERS];
+
+ int m_masterLevelUpdateIndex;
+ LevelInfo m_masterLevel;
+};
+
+}
+
+#endif
diff --git a/src/sound/SoundDriver.cpp b/src/sound/SoundDriver.cpp
new file mode 100644
index 0000000..aab641c
--- /dev/null
+++ b/src/sound/SoundDriver.cpp
@@ -0,0 +1,391 @@
+// -*- c-indentation-style:"stroustrup" c-basic-offset: 4 -*-
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include <stdlib.h>
+
+#include "SoundDriver.h"
+#include "WAVAudioFile.h"
+#include "MappedStudio.h"
+#include "AudioPlayQueue.h"
+
+#include <unistd.h>
+#include <sys/time.h>
+#include <pthread.h> // for mutex
+
+//#define DEBUG_SOUND_DRIVER 1
+
+namespace Rosegarden
+{
+
+// ---------- SoundDriver -----------
+//
+
+
+SoundDriver::SoundDriver(MappedStudio *studio, const std::string &name):
+ m_name(name),
+ m_driverStatus(NO_DRIVER),
+ m_playStartPosition(0, 0),
+ m_startPlayback(false),
+ m_playing(false),
+ m_midiRecordDevice(0),
+ m_recordStatus(RECORD_OFF),
+ m_midiRunningId(MidiInstrumentBase),
+ m_audioRunningId(AudioInstrumentBase),
+ // m_audioQueueScavenger(4, 50),
+ m_audioQueue(0),
+ m_lowLatencyMode(true),
+ m_audioRecFileFormat(RIFFAudioFile::FLOAT),
+ m_studio(studio),
+ m_sequencerDataBlock(0),
+ m_externalTransport(0),
+ m_mmcStatus(TRANSPORT_OFF),
+ m_mtcStatus(TRANSPORT_OFF),
+ m_mmcId(0), // default MMC id of 0
+ m_midiClockEnabled(false),
+ m_midiClockInterval(0, 0),
+ m_midiClockSendTime(RealTime::zeroTime),
+ m_midiSongPositionPointer(0)
+{
+ m_audioQueue = new AudioPlayQueue();
+}
+
+
+SoundDriver::~SoundDriver()
+{
+ std::cout << "SoundDriver::~SoundDriver (exiting)" << std::endl;
+ delete m_audioQueue;
+}
+
+MappedInstrument*
+SoundDriver::getMappedInstrument(InstrumentId id)
+{
+ std::vector<MappedInstrument*>::const_iterator it;
+
+ for (it = m_instruments.begin(); it != m_instruments.end(); it++) {
+ if ((*it)->getId() == id)
+ return (*it);
+ }
+
+ return 0;
+}
+
+void
+SoundDriver::initialiseAudioQueue(const std::vector<MappedEvent> &events)
+{
+ AudioPlayQueue *newQueue = new AudioPlayQueue();
+
+ for (std::vector<MappedEvent>::const_iterator i = events.begin();
+ i != events.end(); ++i) {
+
+ // Check for existence of file - if the sequencer has died
+ // and been restarted then we're not always loaded up with
+ // the audio file references we should have. In the future
+ // we could make this just get the gui to reload our files
+ // when (or before) this fails.
+ //
+ AudioFile *audioFile = getAudioFile(i->getAudioID());
+
+ if (audioFile) {
+ MappedAudioFader *fader =
+ dynamic_cast<MappedAudioFader*>
+ (getMappedStudio()->getAudioFader(i->getInstrument()));
+
+ if (!fader) {
+ std::cerr << "WARNING: SoundDriver::initialiseAudioQueue: no fader for audio instrument " << i->getInstrument() << std::endl;
+ continue;
+ }
+
+ unsigned int channels = fader->getPropertyList(
+ MappedAudioFader::Channels)[0].toInt();
+
+ //#define DEBUG_PLAYING_AUDIO
+#ifdef DEBUG_PLAYING_AUDIO
+
+ std::cout << "Creating playable audio file: id " << audioFile->getId() << ", event time " << i->getEventTime() << ", time now " << getSequencerTime() << ", start marker " << i->getAudioStartMarker() << ", duration " << i->getDuration() << ", instrument " << i->getInstrument() << " channels " << channels << std::endl;
+#endif
+
+ RealTime bufferLength = getAudioReadBufferLength();
+ int bufferFrames = RealTime::realTime2Frame
+ (bufferLength, getSampleRate());
+
+ PlayableAudioFile *paf = 0;
+
+ try {
+ paf = new PlayableAudioFile(i->getInstrument(),
+ audioFile,
+ i->getEventTime(),
+ i->getAudioStartMarker(),
+ i->getDuration(),
+ bufferFrames,
+ getSmallFileSize() * 1024,
+ channels,
+ getSampleRate());
+ } catch (...) {
+ continue;
+ }
+
+ paf->setRuntimeSegmentId(i->getRuntimeSegmentId());
+
+ if (i->isAutoFading()) {
+ paf->setAutoFade(true);
+ paf->setFadeInTime(i->getFadeInTime());
+ paf->setFadeOutTime(i->getFadeInTime());
+
+ //#define DEBUG_AUTOFADING
+#ifdef DEBUG_AUTOFADING
+
+ std::cout << "SoundDriver::initialiseAudioQueue - "
+ << "PlayableAudioFile is AUTOFADING - "
+ << "in = " << i->getFadeInTime()
+ << ", out = " << i->getFadeOutTime()
+ << std::endl;
+#endif
+
+ }
+#ifdef DEBUG_AUTOFADING
+ else {
+ std::cout << "PlayableAudioFile has no AUTOFADE"
+ << std::endl;
+ }
+#endif
+
+ newQueue->addScheduled(paf);
+ } else {
+ std::cerr << "SoundDriver::initialiseAudioQueue - "
+ << "can't find audio file reference for id " << i->getAudioID()
+ << std::endl;
+
+ std::cerr << "SoundDriver::initialiseAudioQueue - "
+ << "try reloading the current Rosegarden file"
+ << std::endl;
+ }
+ }
+
+ std::cout << "SoundDriver::initialiseAudioQueue -- new queue has "
+ << newQueue->size() << " files"
+ << std::endl;
+
+ if (newQueue->empty()) {
+ if (m_audioQueue->empty()) {
+ delete newQueue;
+ return ;
+ }
+ }
+
+ AudioPlayQueue *oldQueue = m_audioQueue;
+ m_audioQueue = newQueue;
+ if (oldQueue)
+ m_audioQueueScavenger.claim(oldQueue);
+}
+
+void
+SoundDriver::clearAudioQueue()
+{
+ std::cout << "SoundDriver::clearAudioQueue" << std::endl;
+
+ if (m_audioQueue->empty())
+ return ;
+
+ AudioPlayQueue *newQueue = new AudioPlayQueue();
+ AudioPlayQueue *oldQueue = m_audioQueue;
+ m_audioQueue = newQueue;
+ if (oldQueue)
+ m_audioQueueScavenger.claim(oldQueue);
+}
+void
+SoundDriver::cancelAudioFile(MappedEvent *mE)
+{
+ std::cout << "SoundDriver::cancelAudioFile" << std::endl;
+
+ if (!m_audioQueue)
+ return ;
+
+ // For now we only permit cancelling unscheduled files.
+
+ const AudioPlayQueue::FileList &files = m_audioQueue->getAllUnscheduledFiles();
+ for (AudioPlayQueue::FileList::const_iterator fi = files.begin();
+ fi != files.end(); ++fi) {
+ PlayableAudioFile *file = *fi;
+ if (mE->getRuntimeSegmentId() == -1) {
+
+ // ERROR? The comparison between file->getAudioFile()->getId() of type unsigned int
+ // and mE->getAudioID() of type int.
+ if (file->getInstrument() == mE->getInstrument() &&
+ int(file->getAudioFile()->getId() == mE->getAudioID())) {
+ file->cancel();
+ }
+ } else {
+ if (file->getRuntimeSegmentId() == mE->getRuntimeSegmentId() &&
+ file->getStartTime() == mE->getEventTime()) {
+ file->cancel();
+ }
+ }
+ }
+}
+
+const AudioPlayQueue *
+SoundDriver::getAudioQueue() const
+{
+ return m_audioQueue;
+}
+
+
+void
+SoundDriver::setMappedInstrument(MappedInstrument *mI)
+{
+ std::vector<MappedInstrument*>::iterator it;
+
+ // If we match then change existing entry
+ for (it = m_instruments.begin(); it != m_instruments.end(); it++) {
+ if ((*it)->getId() == mI->getId()) {
+ (*it)->setChannel(mI->getChannel());
+ (*it)->setType(mI->getType());
+ delete mI;
+ return ;
+ }
+ }
+
+ // else create a new one
+ m_instruments.push_back(mI);
+
+ std::cout << "SoundDriver: setMappedInstrument() : "
+ << "type = " << mI->getType() << " : "
+ << "channel = " << (int)(mI->getChannel()) << " : "
+ << "id = " << mI->getId() << std::endl;
+
+}
+
+unsigned int
+SoundDriver::getDevices()
+{
+ return m_devices.size();
+}
+
+MappedDevice
+SoundDriver::getMappedDevice(DeviceId id)
+{
+ MappedDevice retDevice;
+ std::vector<MappedInstrument*>::iterator it;
+
+ std::vector<MappedDevice*>::iterator dIt = m_devices.begin();
+ for (; dIt != m_devices.end(); dIt++) {
+ if ((*dIt)->getId() == id)
+ retDevice = **dIt;
+ }
+
+ // If we match then change existing entry
+ for (it = m_instruments.begin(); it != m_instruments.end(); it++) {
+ if ((*it)->getDevice() == id)
+ retDevice.push_back(*it);
+ }
+
+#ifdef DEBUG_SOUND_DRIVER
+ std::cout << "SoundDriver::getMappedDevice(" << id << ") - "
+ << "name = \"" << retDevice.getName()
+ << "\" type = " << retDevice.getType()
+ << " direction = " << retDevice.getDirection()
+ << " connection = \"" << retDevice.getConnection() << "\""
+ << " recording = " << retDevice.isRecording()
+ << std::endl;
+#endif
+
+ return retDevice;
+}
+
+
+
+bool
+SoundDriver::addAudioFile(const std::string &fileName, unsigned int id)
+{
+ AudioFile *ins = 0;
+
+ try {
+ ins = new WAVAudioFile(id, fileName, fileName);
+ ins->open();
+ m_audioFiles.push_back(ins);
+
+ // std::cout << "Sequencer::addAudioFile() = \"" << fileName << "\"" << std::endl;
+
+ return true;
+
+ } catch (SoundFile::BadSoundFileException e) {
+ std::cerr << "SoundDriver::addAudioFile: Failed to add audio file " << fileName << ": " << e.getMessage() << std::endl;
+ delete ins;
+ return false;
+ }
+}
+
+bool
+SoundDriver::removeAudioFile(unsigned int id)
+{
+ std::vector<AudioFile*>::iterator it;
+ for (it = m_audioFiles.begin(); it != m_audioFiles.end(); it++) {
+ if ((*it)->getId() == id) {
+ std::cout << "Sequencer::removeAudioFile() = \"" <<
+ (*it)->getFilename() << "\"" << std::endl;
+
+ delete (*it);
+ m_audioFiles.erase(it);
+ return true;
+ }
+ }
+
+ return false;
+}
+
+AudioFile*
+SoundDriver::getAudioFile(unsigned int id)
+{
+ std::vector<AudioFile*>::iterator it;
+ for (it = m_audioFiles.begin(); it != m_audioFiles.end(); it++) {
+ if ((*it)->getId() == id)
+ return *it;
+ }
+
+ return 0;
+}
+
+void
+SoundDriver::clearAudioFiles()
+{
+ // std::cout << "SoundDriver::clearAudioFiles() - clearing down audio files"
+ // << std::endl;
+
+ std::vector<AudioFile*>::iterator it;
+ for (it = m_audioFiles.begin(); it != m_audioFiles.end(); it++)
+ delete(*it);
+
+ m_audioFiles.erase(m_audioFiles.begin(), m_audioFiles.end());
+}
+
+void
+SoundDriver::sleep(const RealTime &rt)
+{
+ // The usleep man page says it's deprecated and we should use
+ // nanosleep. And that's what we did. But it seems quite a few
+ // people don't have nanosleep, so we're reverting to usleep.
+
+ unsigned long usec = rt.sec * 1000000 + rt.usec();
+ usleep(usec);
+}
+
+
+}
+
diff --git a/src/sound/SoundDriver.h b/src/sound/SoundDriver.h
new file mode 100644
index 0000000..fabbaef
--- /dev/null
+++ b/src/sound/SoundDriver.h
@@ -0,0 +1,529 @@
+// -*- c-indentation-style:"stroustrup" c-basic-offset: 4 -*-
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include <string>
+#include <vector>
+#include <list>
+#include <qstringlist.h>
+
+#include "Device.h"
+#include "MappedComposition.h"
+#include "MappedInstrument.h"
+#include "MappedDevice.h"
+#include "SequencerDataBlock.h"
+#include "PlayableAudioFile.h"
+#include "Scavenger.h"
+#include "RIFFAudioFile.h" // for SubFormat enum
+
+// Abstract base to support SoundDrivers, such as ALSA.
+//
+// This base class provides the generic driver support for
+// these drivers with the Sequencer class owning an instance
+// of a sub class of this class and directing it and required
+// by the rosegardensequencer itself.
+//
+//
+
+#ifndef _SOUNDDRIVER_H_
+#define _SOUNDDRIVER_H_
+
+namespace Rosegarden
+{
+
+// Current recording status - whether we're monitoring anything
+// or recording.
+//
+typedef enum
+{
+ RECORD_OFF,
+ RECORD_ON,
+} RecordStatus;
+
+
+// Status of a SoundDriver - whether we're got an audio and
+// MIDI subsystem or not. This is reported right up to the
+// gui.
+//
+typedef enum
+{
+ NO_DRIVER = 0x00, // Nothing's OK
+ AUDIO_OK = 0x01, // AUDIO's OK
+ MIDI_OK = 0x02, // MIDI's OK
+ VERSION_OK = 0x04 // GUI and sequencer versions match
+} SoundDriverStatus;
+
+
+// Used for MMC and MTC, not for JACK transport
+//
+typedef enum
+{
+ TRANSPORT_OFF,
+ TRANSPORT_MASTER,
+ TRANSPORT_SLAVE
+} TransportSyncStatus;
+
+
+// The NoteOffQueue holds a time ordered set of
+// pending MIDI NOTE OFF events.
+//
+class NoteOffEvent
+{
+public:
+ NoteOffEvent() {;}
+ NoteOffEvent(const RealTime &realTime,
+ unsigned int pitch,
+ MidiByte channel,
+ InstrumentId instrument):
+ m_realTime(realTime),
+ m_pitch(pitch),
+ m_channel(channel),
+ m_instrument(instrument) {;}
+ ~NoteOffEvent() {;}
+
+ struct NoteOffEventCmp
+ {
+ bool operator()(NoteOffEvent *nO1, NoteOffEvent *nO2)
+ {
+ return nO1->getRealTime() < nO2->getRealTime();
+ }
+ };
+
+ void setRealTime(const RealTime &time) { m_realTime = time; }
+ RealTime getRealTime() const { return m_realTime; }
+
+ MidiByte getPitch() const { return m_pitch; }
+ MidiByte getChannel() const { return m_channel; }
+ InstrumentId getInstrument() const { return m_instrument; }
+
+private:
+ RealTime m_realTime;
+ MidiByte m_pitch;
+ MidiByte m_channel;
+ InstrumentId m_instrument;
+
+};
+
+
+// The queue itself
+//
+class NoteOffQueue : public std::multiset<NoteOffEvent *,
+ NoteOffEvent::NoteOffEventCmp>
+{
+public:
+ NoteOffQueue() {;}
+ ~NoteOffQueue() {;}
+private:
+};
+
+
+class MappedStudio;
+class ExternalTransport;
+class AudioPlayQueue;
+
+typedef std::vector<PlayableAudioFile *> PlayableAudioFileList;
+
+// The abstract SoundDriver
+//
+//
+class SoundDriver
+{
+public:
+ SoundDriver(MappedStudio *studio, const std::string &name);
+ virtual ~SoundDriver();
+
+ virtual bool initialise() = 0;
+ virtual void shutdown() { }
+
+ virtual void initialisePlayback(const RealTime &position) = 0;
+ virtual void stopPlayback() = 0;
+ virtual void punchOut() = 0; // stop recording, continue playing
+ virtual void resetPlayback(const RealTime &oldPosition, const RealTime &position) = 0;
+ virtual void allNotesOff() = 0;
+
+ virtual RealTime getSequencerTime() = 0;
+
+ virtual MappedComposition *getMappedComposition() = 0;
+
+ virtual void startClocks() { }
+ virtual void stopClocks() { }
+
+ // Process some asynchronous events
+ //
+ virtual void processEventsOut(const MappedComposition &mC) = 0;
+
+ // Process some scheduled events on the output queue. The
+ // slice times are here so that the driver can interleave
+ // note-off events as appropriate.
+ //
+ virtual void processEventsOut(const MappedComposition &mC,
+ const RealTime &sliceStart,
+ const RealTime &sliceEnd) = 0;
+
+ // Activate a recording state. armedInstruments and audioFileNames
+ // can be NULL if no audio tracks recording.
+ //
+ virtual bool record(RecordStatus recordStatus,
+ const std::vector<InstrumentId> *armedInstruments = 0,
+ const std::vector<QString> *audioFileNames = 0) = 0;
+
+ // Process anything that's pending
+ //
+ virtual void processPending() = 0;
+
+ // Get the driver's operating sample rate
+ //
+ virtual unsigned int getSampleRate() const = 0;
+
+ // Plugin instance management
+ //
+ virtual void setPluginInstance(InstrumentId id,
+ QString identifier,
+ int position) = 0;
+
+ virtual void removePluginInstance(InstrumentId id,
+ int position) = 0;
+
+ // Clear down and remove all plugin instances
+ //
+ virtual void removePluginInstances() = 0;
+
+ virtual void setPluginInstancePortValue(InstrumentId id,
+ int position,
+ unsigned long portNumber,
+ float value) = 0;
+
+ virtual float getPluginInstancePortValue(InstrumentId id,
+ int position,
+ unsigned long portNumber) = 0;
+
+ virtual void setPluginInstanceBypass(InstrumentId id,
+ int position,
+ bool value) = 0;
+
+ virtual QStringList getPluginInstancePrograms(InstrumentId id,
+ int position) = 0;
+
+ virtual QString getPluginInstanceProgram(InstrumentId id,
+ int position) = 0;
+
+ virtual QString getPluginInstanceProgram(InstrumentId id,
+ int position,
+ int bank,
+ int program) = 0;
+
+ virtual unsigned long getPluginInstanceProgram(InstrumentId id,
+ int position,
+ QString name) = 0;
+
+ virtual void setPluginInstanceProgram(InstrumentId id,
+ int position,
+ QString program) = 0;
+
+ virtual QString configurePlugin(InstrumentId id,
+ int position,
+ QString key,
+ QString value) = 0;
+
+ virtual void setAudioBussLevels(int bussId,
+ float dB,
+ float pan) = 0;
+
+ virtual void setAudioInstrumentLevels(InstrumentId id,
+ float dB,
+ float pan) = 0;
+
+ // Poll for new clients (for new Devices/Instruments)
+ //
+ virtual bool checkForNewClients() = 0;
+
+ // Set a loop position at the driver (used for transport)
+ //
+ virtual void setLoop(const RealTime &loopStart, const RealTime &loopEnd)
+ = 0;
+
+ virtual void sleep(const RealTime &rt);
+
+ virtual QString getStatusLog() { return ""; }
+
+ // Mapped Instruments
+ //
+ void setMappedInstrument(MappedInstrument *mI);
+ MappedInstrument* getMappedInstrument(InstrumentId id);
+
+ // Return the current status of the driver
+ //
+ unsigned int getStatus() const { return m_driverStatus; }
+
+ // Are we playing?
+ //
+ bool isPlaying() const { return m_playing; }
+
+ // Are we counting? By default a subclass probably wants to
+ // return true, if it doesn't know better.
+ //
+ virtual bool areClocksRunning() const = 0;
+
+ RealTime getStartPosition() const { return m_playStartPosition; }
+ RecordStatus getRecordStatus() const { return m_recordStatus; }
+
+ // Return a MappedDevice full of the Instrument mappings
+ // that the driver has discovered. The gui can then use
+ // this list (complete with names) to generate its proper
+ // Instruments under the MidiDevice and AudioDevice.
+ //
+ MappedDevice getMappedDevice(DeviceId id);
+
+ // Return the number of devices we've found
+ //
+ unsigned int getDevices();
+
+ virtual bool canReconnect(Device::DeviceType) { return false; }
+
+ virtual DeviceId addDevice(Device::DeviceType,
+ MidiDevice::DeviceDirection) {
+ return Device::NO_DEVICE;
+ }
+ virtual void removeDevice(DeviceId) { }
+ virtual void renameDevice(DeviceId, QString) { }
+
+ virtual unsigned int getConnections(Device::DeviceType,
+ MidiDevice::DeviceDirection) { return 0; }
+ virtual QString getConnection(Device::DeviceType,
+ MidiDevice::DeviceDirection,
+ unsigned int) { return ""; }
+ virtual void setConnection(DeviceId, QString) { }
+ virtual void setPlausibleConnection(DeviceId id, QString c) { setConnection(id, c); }
+
+ virtual unsigned int getTimers() { return 0; }
+ virtual QString getTimer(unsigned int) { return ""; }
+ virtual QString getCurrentTimer() { return ""; }
+ virtual void setCurrentTimer(QString) { }
+
+ virtual void getAudioInstrumentNumbers(InstrumentId &, int &) = 0;
+ virtual void getSoftSynthInstrumentNumbers(InstrumentId &, int &) = 0;
+
+ // Plugin management -- SoundDrivers should maintain a plugin
+ // scavenger which the audio process code can use for defunct
+ // plugins. Ownership of plugin is passed to the SoundDriver.
+ //
+ virtual void claimUnwantedPlugin(void *plugin) = 0;
+
+ // This causes all scavenged plugins to be destroyed. It
+ // should only be called in non-RT contexts.
+ //
+ virtual void scavengePlugins() = 0;
+
+ // Handle audio file references
+ //
+ void clearAudioFiles();
+ bool addAudioFile(const std::string &fileName, unsigned int id);
+ bool removeAudioFile(unsigned int id);
+
+ void initialiseAudioQueue(const std::vector<MappedEvent> &audioEvents);
+ void clearAudioQueue();
+ const AudioPlayQueue *getAudioQueue() const;
+
+ RIFFAudioFile::SubFormat getAudioRecFileFormat() const { return m_audioRecFileFormat; }
+
+
+ // Latencies
+ //
+ virtual RealTime getAudioPlayLatency() { return RealTime::zeroTime; }
+ virtual RealTime getAudioRecordLatency() { return RealTime::zeroTime; }
+ virtual RealTime getInstrumentPlayLatency(InstrumentId) { return RealTime::zeroTime; }
+ virtual RealTime getMaximumPlayLatency() { return RealTime::zeroTime; }
+
+ // Buffer sizes
+ //
+ void setAudioBufferSizes(RealTime mix, RealTime read, RealTime write,
+ int smallFileSize) {
+ m_audioMixBufferLength = mix;
+ m_audioReadBufferLength = read;
+ m_audioWriteBufferLength = write;
+ m_smallFileSize = smallFileSize;
+ }
+
+ RealTime getAudioMixBufferLength() { return m_audioMixBufferLength; }
+ RealTime getAudioReadBufferLength() { return m_audioReadBufferLength; }
+ RealTime getAudioWriteBufferLength() { return m_audioWriteBufferLength; }
+ int getSmallFileSize() { return m_smallFileSize; }
+
+ void setLowLatencyMode(bool ll) { m_lowLatencyMode = ll; }
+ bool getLowLatencyMode() const { return m_lowLatencyMode; }
+
+ // Cancel the playback of an audio file - either by instrument and audio file id
+ // or by audio segment id.
+ //
+ void cancelAudioFile(MappedEvent *mE);
+
+ // Studio linkage
+ //
+ MappedStudio* getMappedStudio() { return m_studio; }
+ void setMappedStudio(MappedStudio *studio) { m_studio = studio; }
+
+ // Modify MIDI record device
+ //
+ void setMidiRecordDevice(DeviceId id) { m_midiRecordDevice = id; }
+ DeviceId getMIDIRecordDevice() const { return m_midiRecordDevice; }
+
+ // MIDI Realtime Sync setting
+ //
+ TransportSyncStatus getMIDISyncStatus() const { return m_midiSyncStatus; }
+ void setMIDISyncStatus(TransportSyncStatus status) { m_midiSyncStatus = status; }
+
+ // MMC master/slave setting
+ //
+ TransportSyncStatus getMMCStatus() const { return m_mmcStatus; }
+ void setMMCStatus(TransportSyncStatus status) { m_mmcStatus = status; }
+
+ // MTC master/slave setting
+ //
+ TransportSyncStatus getMTCStatus() const { return m_mtcStatus; }
+ void setMTCStatus(TransportSyncStatus status) { m_mtcStatus = status; }
+
+ // MMC Id
+ //
+ int getMMCId() const { return ((int)(m_mmcId)); }
+ void setMMCId(int id) { m_mmcId = (MidiByte)(id); }
+
+ // Set MIDI clock interval - allow redefinition above to ensure
+ // we handle this reset correctly.
+ //
+ virtual void setMIDIClockInterval(RealTime interval)
+ { m_midiClockInterval = interval; }
+
+ // Get and set the mapper which may optionally be used to
+ // store recording levels etc for communication back to the GUI.
+ // (If a subclass wants this and finds it's not there, it should
+ // simply continue without.)
+ //
+ SequencerDataBlock *getSequencerDataBlock() { return m_sequencerDataBlock; }
+ void setSequencerDataBlock(SequencerDataBlock *d) { m_sequencerDataBlock = d; }
+
+ ExternalTransport *getExternalTransportControl() const {
+ return m_externalTransport;
+ }
+ void setExternalTransportControl(ExternalTransport *transport) {
+ m_externalTransport = transport;
+ }
+
+ // Do any bits and bobs of work that need to be done continuously
+ // (this is called repeatedly whether playing or not).
+ //
+ virtual void runTasks() { }
+
+ // Report a failure back to the GUI - ideally. Default does nothing.
+ //
+ virtual void reportFailure(MappedEvent::FailureCode) { }
+
+protected:
+ // Helper functions to be implemented by subclasses
+ //
+ virtual void processMidiOut(const MappedComposition &mC,
+ const RealTime &sliceStart,
+ const RealTime &sliceEnd) = 0;
+ virtual void generateInstruments() = 0;
+
+ // Audio
+ //
+ AudioFile* getAudioFile(unsigned int id);
+
+ std::string m_name;
+ unsigned int m_driverStatus;
+ RealTime m_playStartPosition;
+ bool m_startPlayback;
+ bool m_playing;
+
+ // MIDI Note-off handling
+ //
+ NoteOffQueue m_noteOffQueue;
+
+ // This is our driver's own list of MappedInstruments and MappedDevices.
+ // These are uncoupled at this level - the Instruments and Devices float
+ // free and only index each other - the Devices hold information only like
+ // name, id and if the device is duplex capable.
+ //
+ typedef std::vector<MappedInstrument*> MappedInstrumentList;
+ MappedInstrumentList m_instruments;
+
+ typedef std::vector<MappedDevice*> MappedDeviceList;
+ MappedDeviceList m_devices;
+
+ DeviceId m_midiRecordDevice;
+
+ MappedComposition m_recordComposition;
+ MappedComposition m_returnComposition;
+ RecordStatus m_recordStatus;
+
+
+ InstrumentId m_midiRunningId;
+ InstrumentId m_audioRunningId;
+
+ // Subclass _MUST_ scavenge this regularly:
+ Scavenger<AudioPlayQueue> m_audioQueueScavenger;
+ AudioPlayQueue *m_audioQueue;
+
+ // A list of AudioFiles that we can play.
+ //
+ std::vector<AudioFile*> m_audioFiles;
+
+ RealTime m_audioMixBufferLength;
+ RealTime m_audioReadBufferLength;
+ RealTime m_audioWriteBufferLength;
+ int m_smallFileSize;
+ bool m_lowLatencyMode;
+
+ RIFFAudioFile::SubFormat m_audioRecFileFormat;
+
+ // Virtual studio hook
+ //
+ MappedStudio *m_studio;
+
+ // Sequencer data block for communication back to GUI
+ //
+ SequencerDataBlock *m_sequencerDataBlock;
+
+ // Controller to make externally originated transport requests on
+ //
+ ExternalTransport *m_externalTransport;
+
+ // MMC and MTC status and ID
+ //
+ TransportSyncStatus m_midiSyncStatus;
+ TransportSyncStatus m_mmcStatus;
+ TransportSyncStatus m_mtcStatus;
+ MidiByte m_mmcId; // device id
+
+ // MIDI clock interval
+ //
+ bool m_midiClockEnabled;
+ RealTime m_midiClockInterval;
+ RealTime m_midiClockSendTime;
+
+ // MIDI Song Position pointer
+ //
+ long m_midiSongPositionPointer;
+
+};
+
+}
+
+#endif // _SOUNDDRIVER_H_
+
diff --git a/src/sound/SoundDriverFactory.cpp b/src/sound/SoundDriverFactory.cpp
new file mode 100644
index 0000000..d081a4e
--- /dev/null
+++ b/src/sound/SoundDriverFactory.cpp
@@ -0,0 +1,66 @@
+// -*- c-indentation-style:"stroustrup" c-basic-offset: 4 -*-
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include "DummyDriver.h"
+
+#ifdef HAVE_ALSA
+#include "AlsaDriver.h"
+#endif
+
+#include "SoundDriverFactory.h"
+
+namespace Rosegarden
+{
+
+SoundDriver *
+SoundDriverFactory::createDriver(MappedStudio *studio)
+{
+ SoundDriver *driver = 0;
+ bool initialised = false;
+#ifdef NO_SOUND
+
+ driver = new DummyDriver(studio);
+#else
+#ifdef HAVE_ALSA
+
+ driver = new AlsaDriver(studio);
+#endif
+#endif
+
+ initialised = driver->initialise();
+
+ if ( ! initialised ) {
+ driver->shutdown();
+ delete driver;
+
+ // if the driver couldn't be initialised, then
+ // fall to the DummyDriver as a last chance,
+ // so GUI can still be used for notation.
+ //
+ driver = new DummyDriver(studio);
+ driver->initialise();
+ }
+ return driver;
+}
+
+
+}
+
+
diff --git a/src/sound/SoundDriverFactory.h b/src/sound/SoundDriverFactory.h
new file mode 100644
index 0000000..56bc889
--- /dev/null
+++ b/src/sound/SoundDriverFactory.h
@@ -0,0 +1,37 @@
+// -*- c-indentation-style:"stroustrup" c-basic-offset: 4 -*-
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#ifndef SOUND_DRIVER_FACTORY_H
+#define SOUND_DRIVER_FACTORY_H
+
+namespace Rosegarden {
+
+class SoundDriver;
+
+class SoundDriverFactory
+{
+public:
+ static SoundDriver *createDriver(MappedStudio *studio);
+};
+
+}
+
+#endif
+
diff --git a/src/sound/SoundFile.cpp b/src/sound/SoundFile.cpp
new file mode 100644
index 0000000..b87cef0
--- /dev/null
+++ b/src/sound/SoundFile.cpp
@@ -0,0 +1,295 @@
+// -*- c-indentation-style:"stroustrup" c-basic-offset: 4 -*-
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#include "SoundFile.h"
+#include "Profiler.h"
+
+
+//#define DEBUG_SOUNDFILE 1
+
+namespace Rosegarden
+
+{
+
+SoundFile::SoundFile(const std::string &fileName):
+ m_fileName(fileName),
+ m_readChunkPtr( -1),
+ m_readChunkSize(4096), // 4k blocks
+ m_inFile(0),
+ m_outFile(0),
+ m_loseBuffer(false),
+ m_fileSize(0)
+{}
+
+// Tidies up for any dervied classes
+//
+SoundFile::~SoundFile()
+{
+ if (m_inFile) {
+ m_inFile->close();
+ delete m_inFile;
+ }
+
+ if (m_outFile) {
+ m_outFile->close();
+ delete m_outFile;
+ }
+
+}
+
+// Read in a specified number of bytes and return them
+// as a string.
+//
+std::string
+SoundFile::getBytes(std::ifstream *file, unsigned int numberOfBytes)
+{
+ if (file->eof()) {
+ // Reset the input stream so it's operational again
+ //
+ file->clear();
+
+ throw(BadSoundFileException(m_fileName, "SoundFile::getBytes() - EOF encountered"));
+ }
+
+ if (!(*file)) {
+ std::cerr << "SoundFile::getBytes() - stream is not well";
+ }
+
+
+ std::string rS;
+ char *fileBytes = new char[numberOfBytes];
+
+ file->read(fileBytes, numberOfBytes);
+
+ for (int i = 0; i < file->gcount(); i++)
+ rS += (unsigned char)fileBytes[i];
+
+#ifdef DEBUG_SOUNDFILE
+ // complain but return
+ //
+ if (rS.length() < numberOfBytes)
+ std::cerr << "SoundFile::getBytes() - couldn't get all bytes ("
+ << rS.length() << " from " << numberOfBytes << ")"
+ << std::endl;
+#endif
+
+ // clear down
+ delete [] fileBytes;
+
+ return rS;
+}
+
+// Read a specified number of bytes into a buffer.
+//
+size_t
+SoundFile::getBytes(std::ifstream *file, char *buf, size_t n)
+{
+ if (!(*file)) {
+ std::cerr << "SoundFile::getBytes() - stream is not well";
+ return 0;
+ }
+
+ if (file->eof()) {
+ file->clear();
+ return 0;
+ }
+
+ file->read(buf, n);
+ return file->gcount();
+}
+
+// A buffered read based on the current file handle.
+//
+std::string
+SoundFile::getBytes(unsigned int numberOfBytes)
+{
+ if (m_inFile == 0)
+ throw(BadSoundFileException(m_fileName, "SoundFile::getBytes - no open file handle"));
+
+ if (m_inFile->eof()) {
+ // Reset the input stream so it's operational again
+ //
+ m_inFile->clear();
+
+ throw(BadSoundFileException(m_fileName, "SoundFile::getBytes() - EOF encountered"));
+ }
+
+
+ // If this flag is set we dump the buffer and re-read it -
+ // should be set if specialised class is scanning about
+ // when we're doing buffered reads
+ //
+ if (m_loseBuffer) {
+ m_readChunkPtr = -1;
+ m_loseBuffer = false;
+ }
+
+ std::string rS;
+ char *fileBytes = new char[m_readChunkSize];
+ int oldLength;
+
+ while (rS.length() < numberOfBytes && !m_inFile->eof()) {
+ if (m_readChunkPtr == -1) {
+ // clear buffer
+ m_readBuffer = "";
+
+ // reset read pointer
+ m_readChunkPtr = 0;
+
+ // Try to read the whole chunk
+ //
+ m_inFile->read(fileBytes, m_readChunkSize);
+
+ // file->gcount holds the number of bytes we've actually read
+ // so copy them across into our string
+ //
+ for (int i = 0; i < m_inFile->gcount(); i++)
+ m_readBuffer += (unsigned char)fileBytes[i];
+ }
+
+ // Can we fulfill our request at this pass? If so read the
+ // bytes across and we'll exit at the end of this loop.
+ // m_readChunkPtr keeps our position for next time.
+ //
+ if (numberOfBytes - rS.length() <= m_readBuffer.length() -
+ m_readChunkPtr) {
+ oldLength = rS.length();
+
+ rS += m_readBuffer.substr(m_readChunkPtr,
+ numberOfBytes - oldLength);
+
+ m_readChunkPtr += rS.length() - oldLength;
+ } else {
+ // Fill all we can this time and reset the m_readChunkPtr
+ // so that we fetch another chunk of bytes from the file.
+ //
+ rS += m_readBuffer.substr(m_readChunkPtr,
+ m_readChunkSize - m_readChunkPtr);
+ m_readChunkPtr = -1;
+ }
+
+ // If we're EOF here we must've read and copied across everything
+ // we can do. Reset and break out.
+ //
+ if (m_inFile->eof()) {
+ m_inFile->clear();
+ break;
+ }
+
+ }
+
+#ifdef DEBUG_SOUNDFILE
+ // complain but return
+ //
+ if (rS.length() < numberOfBytes)
+ std::cerr << "SoundFile::getBytes() buffered - couldn't get all bytes ("
+ << rS.length() << " from " << numberOfBytes << ")"
+ << std::endl;
+#endif
+
+ delete [] fileBytes;
+
+ // Reset and return if EOF
+ //
+ if (m_inFile->eof())
+ m_inFile->clear();
+
+ return rS;
+}
+
+
+// Write out a sequence of FileBytes to the stream
+//
+void
+SoundFile::putBytes(std::ofstream *file,
+ const std::string oS)
+{
+ for (unsigned int i = 0; i < oS.length(); i++)
+ *file << (FileByte) oS[i];
+}
+
+void
+SoundFile::putBytes(std::ofstream *file, const char *buffer, size_t n)
+{
+ file->write(buffer, n);
+}
+
+
+// Clip off any path from the filename
+std::string
+SoundFile::getShortFilename() const
+{
+ std::string rS = m_fileName;
+ unsigned int pos = rS.find_last_of("/");
+
+ if (pos > 0 && ( pos + 1 ) < rS.length())
+ rS = rS.substr(pos + 1, rS.length());
+
+ return rS;
+}
+
+
+// Turn a little endian binary std::string into an integer
+//
+int
+SoundFile::getIntegerFromLittleEndian(const std::string &s)
+{
+ int r = 0;
+
+ for (unsigned int i = 0; i < s.length(); i++) {
+ r += (int)(((FileByte)s[i]) << (i * 8));
+ }
+
+ return r;
+}
+
+
+// Turn a value into a little endian string of "length"
+//
+std::string
+SoundFile::getLittleEndianFromInteger(unsigned int value, unsigned int length)
+{
+ std::string r = "";
+
+ do {
+ r += (unsigned char)((long)((value >> (8 * r.length())) & 0xff));
+ } while (r.length() < length);
+
+ return r;
+}
+
+int
+SoundFile::getIntegerFromBigEndian(const std::string &s)
+{
+ return 0;
+}
+
+std::string
+SoundFile::getBigEndianFromInteger(unsigned int value, unsigned int length)
+{
+ std::string r;
+
+ return r;
+}
+
+
+}
+
diff --git a/src/sound/SoundFile.h b/src/sound/SoundFile.h
new file mode 100644
index 0000000..b048226
--- /dev/null
+++ b/src/sound/SoundFile.h
@@ -0,0 +1,155 @@
+// -*- c-indentation-style:"stroustrup" c-basic-offset: 4 -*- /*
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+#ifndef _SOUNDFILE_H_
+#define _SOUNDFILE_H_
+
+// SoundFile is an abstract base class defining behaviour for both
+// MidiFiles and AudioFiles. The getBytes routine is buffered into
+// suitably sized chunks to prevent excessive file reads.
+//
+//
+
+#include <iostream>
+#include <fstream>
+#include <string>
+
+#include "Exception.h"
+
+namespace Rosegarden
+{
+
+
+// Constants related to RIFF/WAV files
+//
+const std::string AUDIO_RIFF_ID = "RIFF";
+const std::string AUDIO_WAVE_ID = "WAVE";
+const std::string AUDIO_FORMAT_ID = "fmt "; // Always four bytes
+
+const std::string AUDIO_BWF_ID = "bext"; // BWF chunk id
+const std::string AUDIO_BWF_PEAK_ID = "levl"; // BWF peak chunk id
+
+
+const float SAMPLE_MAX_8BIT = (float)(0xff);
+const float SAMPLE_MAX_16BIT = (float)(0xffff/2);
+const float SAMPLE_MAX_24BIT = (float)(0xffffff/2);
+
+
+
+typedef unsigned char FileByte;
+
+class SoundFile
+{
+public:
+ SoundFile(const std::string &fileName);
+ virtual ~SoundFile();
+
+ class BadSoundFileException : public Exception
+ {
+ public:
+ BadSoundFileException(std::string path) :
+ Exception("Bad sound file " + path), m_path(path) { }
+ BadSoundFileException(std::string path, std::string message) :
+ Exception("Bad sound file " + path + ": " + message), m_path(path) { }
+ BadSoundFileException(std::string path, std::string file, int line) :
+ Exception("Bad sound file " + path, file, line), m_path(path) { }
+
+ ~BadSoundFileException() throw() { }
+
+ std::string getPath() const { return m_path; }
+
+ private:
+ std::string m_path;
+ };
+
+ // All files should be able open, write and close
+ virtual bool open() = 0;
+ virtual bool write() = 0;
+ virtual void close() = 0;
+
+ std::string getShortFilename() const;
+ std::string getFilename() const { return m_fileName; }
+ void setFilename(const std::string &fileName) { m_fileName = fileName; }
+
+ // Useful methods that operate on our file data
+ //
+ int getIntegerFromLittleEndian(const std::string &s);
+ std::string getLittleEndianFromInteger(unsigned int value,
+ unsigned int length);
+
+ int getIntegerFromBigEndian(const std::string &s);
+ std::string getBigEndianFromInteger(unsigned int value,
+ unsigned int length);
+
+ // Buffered read - allow this to be public
+ //
+ std::string getBytes(unsigned int numberOfBytes);
+
+ // Return file size
+ //
+ unsigned int getSize() const { return m_fileSize; }
+
+ void resetStream() { m_inFile->seekg(0); m_inFile->clear(); }
+
+ // check EOF status
+ //
+ bool isEof() const
+ { if (m_inFile) return m_inFile->eof(); else return true; }
+
+protected:
+ std::string m_fileName;
+
+ // get some bytes from an input stream - unbuffered as we can
+ // modify the file stream
+ std::string getBytes(std::ifstream *file, unsigned int numberOfBytes);
+
+ // Get n bytes from an input stream and write them into buffer.
+ // Return the actual number of bytes read.
+ size_t getBytes(std::ifstream *file, char *buffer, size_t n);
+
+ // write some bytes to an output stream
+ void putBytes(std::ofstream *file, const std::string outputString);
+
+ // write some bytes to an output stream
+ void putBytes(std::ofstream *file, const char *buffer, size_t n);
+
+ // Read buffering - define chunk size and buffer file reading
+ //
+ int m_readChunkPtr;
+ int m_readChunkSize;
+ std::string m_readBuffer;
+
+ std::ifstream *m_inFile;
+ std::ofstream *m_outFile;
+
+ bool m_loseBuffer; // do we need to dump the read buffer
+ // and re-fill it?
+
+ unsigned int m_fileSize;
+
+};
+
+}
+
+
+#endif // _SOUNDFILE_H_
+
+
diff --git a/src/sound/WAVAudioFile.cpp b/src/sound/WAVAudioFile.cpp
new file mode 100644
index 0000000..4e3b3bd
--- /dev/null
+++ b/src/sound/WAVAudioFile.cpp
@@ -0,0 +1,255 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include "WAVAudioFile.h"
+#include "RealTime.h"
+
+#if (__GNUC__ < 3)
+#include <strstream>
+#define stringstream strstream
+#else
+#include <sstream>
+#endif
+
+using std::cout;
+using std::cerr;
+using std::endl;
+
+//#define DEBUG_DECODE 1
+
+namespace Rosegarden
+{
+
+WAVAudioFile::WAVAudioFile(const unsigned int &id,
+ const std::string &name,
+ const std::string &fileName):
+ RIFFAudioFile(id, name, fileName)
+{
+ m_type = WAV;
+}
+
+WAVAudioFile::WAVAudioFile(const std::string &fileName,
+ unsigned int channels = 1,
+ unsigned int sampleRate = 48000,
+ unsigned int bytesPerSecond = 6000,
+ unsigned int bytesPerFrame = 2,
+ unsigned int bitsPerSample = 16):
+ RIFFAudioFile(fileName, channels, sampleRate, bytesPerSecond, bytesPerFrame, bitsPerSample)
+{
+ m_type = WAV;
+}
+
+WAVAudioFile::~WAVAudioFile()
+{}
+
+bool
+WAVAudioFile::open()
+{
+ // if already open
+ if (m_inFile && (*m_inFile))
+ return true;
+
+ m_inFile = new std::ifstream(m_fileName.c_str(),
+ std::ios::in | std::ios::binary);
+
+ if (!(*m_inFile)) {
+ m_type = UNKNOWN;
+ return false;
+ }
+
+ // Get the file size and store it for comparison later
+ m_fileSize = m_fileInfo->size();
+
+ try {
+ parseHeader();
+ } catch (BadSoundFileException e) {
+ std::cerr << "ERROR: WAVAudioFile::open(): parseHeader: " << e.getMessage() << endl;
+ return false;
+ }
+
+ return true;
+}
+
+// Open the file for writing, write out the header and move
+// to the data chunk to accept samples. We fill in all the
+// totals when we close().
+//
+bool
+WAVAudioFile::write()
+{
+ // close if we're open
+ if (m_outFile) {
+ m_outFile->close();
+ delete m_outFile;
+ }
+
+ // open for writing
+ m_outFile = new std::ofstream(m_fileName.c_str(),
+ std::ios::out | std::ios::binary);
+
+ if (!(*m_outFile))
+ return false;
+
+ // write out format header chunk and prepare for sample writing
+ //
+ writeFormatChunk();
+
+ return true;
+}
+
+void
+WAVAudioFile::close()
+{
+ if (m_outFile == 0)
+ return ;
+
+ m_outFile->seekp(0, std::ios::end);
+ unsigned int totalSize = m_outFile->tellp();
+
+ // seek to first length position
+ m_outFile->seekp(4, std::ios::beg);
+
+ // write complete file size minus 8 bytes to here
+ putBytes(m_outFile, getLittleEndianFromInteger(totalSize - 8, 4));
+
+ // reseek from start forward 40
+ m_outFile->seekp(40, std::ios::beg);
+
+ // write the data chunk size to end
+ putBytes(m_outFile, getLittleEndianFromInteger(totalSize - 44, 4));
+
+ m_outFile->close();
+
+ delete m_outFile;
+ m_outFile = 0;
+}
+
+// Set the AudioFile meta data according to WAV file format specification.
+//
+void
+WAVAudioFile::parseHeader()
+{
+ // Read the format chunk and populate the file data. A plain WAV
+ // file only has this chunk. Exceptions tumble through.
+ //
+ readFormatChunk();
+
+}
+
+std::streampos
+WAVAudioFile::getDataOffset()
+{
+ return 0;
+}
+
+bool
+WAVAudioFile::decode(const unsigned char *ubuf,
+ size_t sourceBytes,
+ size_t targetSampleRate,
+ size_t targetChannels,
+ size_t nframes,
+ std::vector<float *> &target,
+ bool adding)
+{
+ size_t sourceChannels = getChannels();
+ size_t sourceSampleRate = getSampleRate();
+ size_t fileFrames = sourceBytes / getBytesPerFrame();
+
+ int bitsPerSample = getBitsPerSample();
+ if (bitsPerSample != 8 &&
+ bitsPerSample != 16 &&
+ bitsPerSample != 24 &&
+ bitsPerSample != 32) { // 32-bit is IEEE-float (enforced in RIFFAudioFile)
+ std::cerr << "WAVAudioFile::decode: unsupported " <<
+ bitsPerSample << "-bit sample size" << std::endl;
+ return false;
+ }
+
+#ifdef DEBUG_DECODE
+ std::cerr << "WAVAudioFile::decode: " << sourceBytes << " bytes -> " << nframes << " frames, SSR " << getSampleRate() << ", TSR " << targetSampleRate << ", sch " << getChannels() << ", tch " << targetChannels << std::endl;
+#endif
+
+ // If we're reading a stereo file onto a mono target, we mix the
+ // two channels. If we're reading mono to stereo, we duplicate
+ // the mono channel. Otherwise if the numbers of channels differ,
+ // we just copy across the ones that do match and zero the rest.
+
+ bool reduceToMono = (targetChannels == 1 && sourceChannels == 2);
+
+ for (size_t ch = 0; ch < sourceChannels; ++ch) {
+
+ if (!reduceToMono || ch == 0) {
+ if (ch >= targetChannels)
+ break;
+ if (!adding)
+ memset(target[ch], 0, nframes * sizeof(float));
+ }
+
+ int tch = ch; // target channel for this data
+ if (reduceToMono && ch == 1) {
+ tch = 0;
+ }
+
+ float ratio = 1.0;
+ if (sourceSampleRate != targetSampleRate) {
+ ratio = float(sourceSampleRate) / float(targetSampleRate);
+ }
+
+ for (size_t i = 0; i < nframes; ++i) {
+
+ size_t j = i;
+ if (sourceSampleRate != targetSampleRate) {
+ j = size_t(i * ratio);
+ }
+ if (j >= fileFrames)
+ j = fileFrames - 1;
+
+ float sample = convertBytesToSample
+ (&ubuf[(bitsPerSample / 8) * (ch + j * sourceChannels)]);
+
+ target[tch][i] += sample;
+ }
+ }
+
+ // Now deal with any excess target channels
+
+ for (int ch = sourceChannels; ch < targetChannels; ++ch) {
+ if (ch == 1 && targetChannels == 2) {
+ // copy mono to stereo
+ if (!adding) {
+ memcpy(target[ch], target[ch - 1], nframes * sizeof(float));
+ } else {
+ for (size_t i = 0; i < nframes; ++i) {
+ target[ch][i] += target[ch - 1][i];
+ }
+ }
+ } else {
+ if (!adding) {
+ memset(target[ch], 0, nframes * sizeof(float));
+ }
+ }
+ }
+
+ return true;
+}
+
+
+}
diff --git a/src/sound/WAVAudioFile.h b/src/sound/WAVAudioFile.h
new file mode 100644
index 0000000..ec57ec6
--- /dev/null
+++ b/src/sound/WAVAudioFile.h
@@ -0,0 +1,93 @@
+// -*- c-basic-offset: 4 -*-
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ 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. See the file
+ COPYING included with this distribution for more information.
+*/
+
+
+// Specialisation of a RIFF file - the WAV defines a format chunk
+// holding audio file meta data and a data chunk with interleaved
+// sample bytes.
+//
+
+#include "RIFFAudioFile.h"
+
+
+#ifndef _WAVAUDIOFILE_H_
+#define _WAVAUDIOFILE_H_
+
+namespace Rosegarden
+{
+
+class WAVAudioFile : public RIFFAudioFile
+{
+public:
+ WAVAudioFile(const unsigned int &id,
+ const std::string &name,
+ const std::string &fileName);
+
+ WAVAudioFile(const std::string &fileName,
+ unsigned int channels,
+ unsigned int sampleRate,
+ unsigned int bytesPerSecond,
+ unsigned int bytesPerSample,
+ unsigned int bitsPerSample);
+
+ ~WAVAudioFile();
+
+ // Override these methods for the WAV
+ //
+ virtual bool open();
+ virtual bool write();
+ virtual void close();
+
+ // Decode and de-interleave the given samples that were retrieved
+ // from this file or another with the same format as it. Place
+ // the results in the given float buffer. Return true for
+ // success. This function does crappy resampling if necessary.
+ //
+ virtual bool decode(const unsigned char *sourceData,
+ size_t sourceBytes,
+ size_t targetSampleRate,
+ size_t targetChannels,
+ size_t targetFrames,
+ std::vector<float *> &targetData,
+ bool addToResultBuffers = false);
+
+ // Get all header information
+ //
+ void parseHeader();
+
+ // Offset to start of sample data
+ //
+ virtual std::streampos getDataOffset();
+
+ // Peak file name
+ //
+ virtual std::string getPeakFilename()
+ { return (m_fileName + std::string(".pk")); }
+
+
+protected:
+
+};
+
+}
+
+
+#endif // _WAVAUDIOFILE_H_
diff --git a/src/test/accidentals.cpp b/src/test/accidentals.cpp
new file mode 100644
index 0000000..90d929b
--- /dev/null
+++ b/src/test/accidentals.cpp
@@ -0,0 +1,88 @@
+// -*- c-basic-offset: 4 -*-
+
+#include "NotationTypes.h"
+
+using namespace Rosegarden;
+using std::cout;
+
+// Unit test-ish tests for resolving accidentals
+//
+// Returns -1 (or crashes :)) on error, 0 on success
+int assertHasAccidental(Pitch &pitch,
+ const Accidental& accidental, const Key& key)
+{
+ Accidental calculatedAccidental =
+ pitch.getAccidental(key);
+
+ std::cout << "Got " << calculatedAccidental << " for pitch " << pitch.getPerformancePitch() << " in key " << key.getName() << std::endl;
+
+ if (calculatedAccidental != accidental) {
+ std::cout << "Expected " << accidental << std::endl;
+ return -1;
+ }
+ return 0;
+}
+
+int testBInEMinor()
+{
+ // a B, also in E minor, has no accidental
+ Pitch testPitch(59 % 12);
+ return assertHasAccidental(testPitch,
+ Accidentals::NoAccidental, Key("E minor"));
+}
+
+/**
+ *
+ */
+int testFInBMinor()
+{
+ Pitch testPitch(77);
+ return assertHasAccidental(testPitch,
+ Accidentals::NoAccidental, Key("B minor"));
+}
+
+int testInvalidSuggestion()
+{
+ // If we specify an invalid suggestion,
+ // getAccidental() should be robust against that.
+ Pitch testPitch = Pitch(59, Accidentals::Sharp);
+ return assertHasAccidental(testPitch,
+ Accidentals::NoAccidental, Key("E minor"));
+}
+
+int testBbinBb()
+{
+ Pitch testPitch = Pitch(10, Accidentals::NoAccidental);
+ Accidental accidental = testPitch.getAccidental(Key("Bb major"));
+ std::cout << "Bb accidental: " << accidental << std::endl;
+ if (accidental != Accidentals::Flat)
+ {
+ return -1;
+ }
+ return 0;
+}
+
+// Verifies that the height on staff for pitch 61 using flats is -1, not -2
+int testDesHeight()
+{
+ bool useSharps = false;
+
+ Pitch pitch(61);
+ int h = pitch.getHeightOnStaff(Clef(Clef::Treble, 0), useSharps);
+
+ if (h != -1)
+ {
+ std::cerr << "Error in testDesHeight: expected height -1, got " << h << std::endl;
+ return -1;
+ }
+ return 0;
+}
+
+int test_accidentals(int argc, char **argv)
+{
+ return testBInEMinor() +
+ testFInBMinor() +
+ testInvalidSuggestion() +
+ testBbinBb() +
+ testDesHeight();
+}
diff --git a/src/test/dummy.cpp b/src/test/dummy.cpp
new file mode 100644
index 0000000..66806a0
--- /dev/null
+++ b/src/test/dummy.cpp
@@ -0,0 +1,6 @@
+/** dummy unittest to test the unittesting system */
+int test_dummy (int argc, char** argv)
+{
+ // Always succeed
+ return 0;
+}
diff --git a/src/test/segmenttransposecommand.cpp b/src/test/segmenttransposecommand.cpp
new file mode 100644
index 0000000..0025529
--- /dev/null
+++ b/src/test/segmenttransposecommand.cpp
@@ -0,0 +1,161 @@
+// -*- c-basic-offset: 4 -*-
+
+#include "commands/segment/SegmentTransposeCommand.h"
+#include "base/NotationTypes.h"
+#include "base/Segment.h"
+#include "base/Selection.h"
+
+using namespace Rosegarden;
+using std::cout;
+
+/**
+ * Bb in Bb major became E# in F major, due to segment
+ * transposition
+ *
+ * Should be F
+ */
+int testSegmentBbtoF()
+{
+ Segment * segment1 = new Segment();
+ Note * n = new Note(Note::QuarterNote);
+ Event * bes = n->getAsNoteEvent(1, 10);
+ segment1->insert(bes);
+ segment1->insert(Key("Bb major").getAsEvent(0));
+ SegmentTransposeCommand * mockCommand =
+ new SegmentTransposeCommand(*segment1,
+ true, -3, -5, true);
+ mockCommand->execute();
+
+ EventSelection m_selection(*segment1, segment1->getStartTime(), segment1->getEndMarkerTime());
+ EventSelection::eventcontainer::iterator i;
+ for (i = m_selection.getSegmentEvents().begin();
+ i != m_selection.getSegmentEvents().end(); ++i) {
+ if ((*i)->isa(Note::EventType)) {
+ Pitch resultPitch(**i);
+ std::cout << "Resulting pitch is: " << resultPitch.getPerformancePitch() << std::endl;
+ std::cout << "accidental: " << resultPitch.getDisplayAccidental(Key("F major")) << std::endl;
+ std::cout << "DisplayAccidental: " << resultPitch.getDisplayAccidental(Key("F major")) << std::endl;
+ if (resultPitch.getDisplayAccidental(Key("F major")) != Accidentals::NoAccidental)
+ {
+ return -1;
+ }
+ }
+ }
+
+ return 0;
+}
+
+/**
+ * G# in E major became Bb in F major, due to segment
+ * transposition (by using the 'segment transposition' combobox)
+ *
+ * Should be A#
+ */
+int testGistoAis()
+{
+ Segment * segment1 = new Segment();
+ Note * n = new Note(Note::QuarterNote);
+ Event * gis = n->getAsNoteEvent(1, 8);
+ segment1->insert(gis);
+ segment1->insert(Key("E major").getAsEvent(0));
+ SegmentTransposeCommand * mockCommand =
+ new SegmentTransposeCommand(*segment1,
+ true, 1, 2, true);
+ mockCommand->execute();
+
+ EventSelection m_selection(*segment1, segment1->getStartTime(), segment1->getEndMarkerTime());
+ EventSelection::eventcontainer::iterator i;
+ for (i = m_selection.getSegmentEvents().begin();
+ i != m_selection.getSegmentEvents().end(); ++i) {
+ if ((*i)->isa(Note::EventType)) {
+ Pitch resultPitch(**i);
+ std::cout << "Resulting pitch is: " << resultPitch.getPerformancePitch() << std::endl;
+ std::cout << "accidental: " << resultPitch.getDisplayAccidental(Key("F# major")) << std::endl;
+ std::cout << "DisplayAccidental: " << resultPitch.getDisplayAccidental(Key("F# major")) << std::endl;
+ if (resultPitch.getDisplayAccidental(Key("F# major")) != Accidentals::NoAccidental)
+ {
+ std::cout << "Gis in E major does not become A#-in-F#-major (no-accidental) when transposed upwards by a small second" << std::endl;
+ return -1;
+ }
+ }
+ }
+
+ return 0;
+}
+
+/**
+ * A C# in the key of C# major somehow became a B# in the key of C
+ */
+int testSegmentCisToC()
+{
+ Segment * segment1 = new Segment();
+ Note * n = new Note(Note::QuarterNote);
+ Event * cis = n->getAsNoteEvent(1, 13);
+ segment1->insert(cis);
+ segment1->insert(Key("C# major").getAsEvent(0));
+ SegmentTransposeCommand * mockCommand =
+ new SegmentTransposeCommand(*segment1,
+ true, 0, -1, true);
+ mockCommand->execute();
+
+ EventSelection m_selection(*segment1, segment1->getStartTime(), segment1->getEndMarkerTime());
+ EventSelection::eventcontainer::iterator i;
+ for (i = m_selection.getSegmentEvents().begin();
+ i != m_selection.getSegmentEvents().end(); ++i) {
+ if ((*i)->isa(Note::EventType)) {
+ Pitch resultPitch(**i);
+ std::cout << "Resulting pitch is: " << resultPitch.getPerformancePitch() << std::endl;
+ std::cout << "accidental: " << resultPitch.getDisplayAccidental(Key("C major")) << std::endl;
+ std::cout << "DisplayAccidental: " << resultPitch.getDisplayAccidental(Key("C major")) << std::endl;
+ if (resultPitch.getDisplayAccidental(Key("C major")) != Accidentals::NoAccidental)
+ {
+ std::cout << "C# in C# major does not lose accidental when transposed downwards by 1 semitone" << std::endl;
+ return -1;
+ }
+ }
+ }
+
+ return 0;
+}
+
+int testUndo()
+{
+ Segment * segment1 = new Segment();
+ Segment * segment2 = new Segment();
+
+ // transpose once
+ SegmentTransposeCommand * mockCommand1a =
+ new SegmentTransposeCommand(*segment1,
+ true, -1, -2, true);
+ mockCommand1a->execute();
+ SegmentTransposeCommand * mockCommand1b =
+ new SegmentTransposeCommand(*segment2,
+ true, -1, -2, true);
+ mockCommand1b->execute();
+
+ // transpose twice
+ SegmentTransposeCommand * mockCommand2a =
+ new SegmentTransposeCommand(*segment1,
+ true, -1, -2, true);
+ mockCommand2a->execute();
+ SegmentTransposeCommand * mockCommand2b =
+ new SegmentTransposeCommand(*segment2,
+ true, -1, -2, true);
+ mockCommand2b->execute();
+
+ mockCommand2b->unexecute();
+ mockCommand2a->unexecute();
+ mockCommand1b->unexecute();
+ mockCommand1a->unexecute();
+
+ return 0;
+}
+
+int test_segmenttransposecommand(int argc, char** argv)
+{
+ return
+ testGistoAis() +
+ testSegmentCisToC() +
+ testUndo() +
+ testSegmentBbtoF();
+}
diff --git a/src/test/transpose.cpp b/src/test/transpose.cpp
new file mode 100644
index 0000000..a4198b3
--- /dev/null
+++ b/src/test/transpose.cpp
@@ -0,0 +1,154 @@
+// -*- c-basic-offset: 4 -*-
+//
+
+#include "NotationTypes.h"
+#include "gui/dialogs/IntervalDialog.h"
+
+using namespace Rosegarden;
+using std::cout;
+
+// Unit test-ish tests for transposition.
+//
+// Returns -1 (or crashes :)) on error, 0 on success
+
+/**
+ * should be in Pitch eventually
+ */
+int testAisDisplayAccidentalInCmaj()
+{
+ Pitch ais(70, Accidentals::Sharp);
+ Key cmaj ("C major");
+ Accidental accidental = ais.getDisplayAccidental(cmaj);
+ if (accidental != Accidentals::Sharp)
+ {
+ std::cout << "Accidental for A# in Cmaj was " << accidental << " instead of expected Sharp" << std::endl;
+ return -1;
+ }
+
+ return 0;
+}
+
+/**
+ * transpose an C# down by an augmented prime in C# major, should yield a C (in C major)
+ */
+int testCisToC()
+{
+ std::cout << "Testing transposing C# to C... ";
+
+ Pitch cis(73, Accidentals::Sharp);
+ Pitch result = cis.transpose(Key("C# major"), -1, 0);
+
+ Accidental resultAccidental = result.getAccidental(Key("C major"));
+ int resultPitch = result.getPerformancePitch();
+ if (resultAccidental != Accidentals::NoAccidental || resultPitch != 72)
+ {
+ std::cout << "Transposing C# down by an augmented prime didn't yield C, but " << result.getNoteName(Key("C major")) << resultAccidental << std::endl;
+ return -1;
+ }
+
+ return 0;
+}
+
+/**
+ * transpose an A# up by a major second, should
+ * yield a B# (as C would be a minor triad)
+ */
+int testAisToBis()
+{
+ std::cout << "Testing transposing A# to B#... ";
+ Pitch ais(70, Accidentals::Sharp);
+ Key cmaj ("C major");
+
+ Pitch result = ais.transpose(cmaj, 2, 1);
+
+ Accidental resultAccidental = result.getAccidental(cmaj);
+ int resultPitch = result.getPerformancePitch();
+ if (resultAccidental != Accidentals::Sharp || resultPitch != 72)
+ {
+ std::cout << "Transposing A# up by a major second didn't yield B#, but " << result.getNoteName(cmaj) << resultAccidental << std::endl;
+ return -1;
+ }
+ std::cout << "Success" << std::endl;
+
+ return 0;
+}
+
+/**
+ * Transpose G to D in the key of D major.
+ */
+int testGToD()
+{
+ std::cout << "Testing transposing G to D... ";
+ Pitch g(67, Accidentals::Natural);
+ Key* dmaj = new Key("D major");
+
+ Pitch result = g.transpose(*dmaj, 7, 4);
+
+ Accidental resultAccidental = result.getAccidental(*dmaj);
+ int resultPitch = result.getPerformancePitch();
+ if (resultAccidental != Accidentals::NoAccidental || resultPitch != 74)
+ {
+ std::cout << "Transposing G up by a fifth didn't yield D, but " << result.getNoteName(*dmaj) << resultAccidental << std::endl;
+ return -1;
+ }
+ std::cout << "Success" << std::endl;
+ return 0;
+}
+
+int testTransposeBbToF()
+{
+ Pitch bb(70, Accidentals::Flat);
+ Key besmaj("Bb major");
+ Pitch result = bb.transpose(besmaj, -5, -3);
+
+ Accidental resultAccidental = result.getAccidental(besmaj);
+ int resultPitch = result.getPerformancePitch();
+ if (resultAccidental != Accidentals::NoAccidental || resultPitch != 65)
+ {
+ return -1;
+ }
+ return 0;
+}
+
+int testIntervalString(int steps, int semitones, QString expectedString)
+{
+ QString text = IntervalDialog::getIntervalName(steps, semitones);
+ if (text != expectedString) {
+ std::cout << "When converting the interval " << steps << "," << semitones << " to string, expected '" << expectedString << "' but got '" << text << "'" << std::endl;
+ return -1;
+ }
+ return 0;
+}
+
+int testIntervalToString()
+{
+ return testIntervalString(1,1,"up a minor second")
+ + testIntervalString(0,0,"a perfect unison")
+ + testIntervalString(0,1,"up an augmented unison")
+ + testIntervalString(7,12,"up 1 octave")
+ + testIntervalString(7,13,"up an augmented octave");
+
+ QString text = IntervalDialog::getIntervalName(1, 1);
+ std::cout << "Minor second: " << text << std::endl;
+
+ text = IntervalDialog::getIntervalName(0, 0);
+ std::cout << "Perfect unison: " << text << std::endl;
+ text = IntervalDialog::getIntervalName(0, 1);
+ std::cout << "Augmented unison: " << text << std::endl;
+ text = IntervalDialog::getIntervalName(7, 12);
+ std::cout << "1 octave: " << text << std::endl;
+ text = IntervalDialog::getIntervalName(7, 13);
+ std::cout << "Octave and augmented unison: " << text << std::endl;
+ return 0;
+}
+
+int test_transpose(int argc, char **argv)
+{
+ return testAisDisplayAccidentalInCmaj() +
+ testAisToBis() +
+ testGToD() +
+ testTransposeBbToF() +
+ testIntervalToString() +
+ testCisToC();
+
+}